[ppl] 01/02: Import Upstream version 1.1

Tobias Hansen thansen at moszumanska.debian.org
Sat Nov 12 16:22:44 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to annotated tag upstream/1%1.2
in repository ppl.

commit 39decfea1bc32c7e4f2743d10f06b7a4106ea685
Author: Tobias Hansen <thansen at broeselmaschine.fc.up.pt>
Date:   Thu Nov 10 19:23:01 2016 +0000

    Import Upstream version 1.1
---
 BUGS                                               |     22 +
 COPYING                                            |    674 +
 CREDITS                                            |    443 +
 ChangeLog                                          |  25507 +++++
 ChangeLog_2001-2008                                |  96130 ++++++++++++++++
 INSTALL                                            |    370 +
 Makefile.am                                        |     85 +
 Makefile.in                                        |    988 +
 NEWS                                               |   2053 +
 README                                             |   1768 +
 README.alpha                                       |     59 +
 README.arm                                         |     54 +
 README.configure                                   |    519 +
 README.solaris                                     |     50 +
 STANDARDS                                          |    739 +
 TODO                                               |    111 +
 aclocal.m4                                         |   1177 +
 compile                                            |    347 +
 config.guess                                       |   1558 +
 config.h.in                                        |    411 +
 config.rpath                                       |    666 +
 config.sub                                         |   1788 +
 configure                                          |  27096 +++++
 configure.ac                                       |   1751 +
 demos/Makefile.am                                  |     36 +
 demos/Makefile.in                                  |    728 +
 demos/ppl_lcdd/Makefile.am                         |    135 +
 demos/ppl_lcdd/Makefile.in                         |   1027 +
 demos/ppl_lcdd/examples/1d.ine                     |      5 +
 demos/ppl_lcdd/examples/1da.ine                    |      6 +
 demos/ppl_lcdd/examples/Makefile.am                |    136 +
 demos/ppl_lcdd/examples/Makefile.in                |    659 +
 demos/ppl_lcdd/examples/README                     |     13 +
 demos/ppl_lcdd/examples/allzero.ine                |     11 +
 demos/ppl_lcdd/examples/ccc4.ext                   |     14 +
 demos/ppl_lcdd/examples/ccc5.ext                   |     21 +
 demos/ppl_lcdd/examples/ccc6.ext                   |     37 +
 demos/ppl_lcdd/examples/ccp4.ext                   |     14 +
 demos/ppl_lcdd/examples/ccp5.ext                   |     22 +
 demos/ppl_lcdd/examples/ccp6.ext                   |     38 +
 demos/ppl_lcdd/examples/cp4.ext                    |     12 +
 demos/ppl_lcdd/examples/cp4.ine                    |     20 +
 demos/ppl_lcdd/examples/cp5.ext                    |     21 +
 demos/ppl_lcdd/examples/cp5.ine                    |     61 +
 demos/ppl_lcdd/examples/cp6.ext                    |     37 +
 demos/ppl_lcdd/examples/cp6.ine                    |    373 +
 demos/ppl_lcdd/examples/cp7.ext                    |     70 +
 demos/ppl_lcdd/examples/cross10.ine                |   1030 +
 demos/ppl_lcdd/examples/cross12.ine                |   4102 +
 demos/ppl_lcdd/examples/cross4.ine                 |     20 +
 demos/ppl_lcdd/examples/cross6.ine                 |     69 +
 demos/ppl_lcdd/examples/cross8.ine                 |    261 +
 demos/ppl_lcdd/examples/cube.ext                   |     13 +
 demos/ppl_lcdd/examples/cube.ine                   |     12 +
 demos/ppl_lcdd/examples/cube10.ine                 |     25 +
 demos/ppl_lcdd/examples/cube12.ine                 |     29 +
 demos/ppl_lcdd/examples/cube3.ine                  |     11 +
 demos/ppl_lcdd/examples/cube6.ine                  |     17 +
 demos/ppl_lcdd/examples/cube8.ine                  |     21 +
 demos/ppl_lcdd/examples/cubetop.ine                |     12 +
 demos/ppl_lcdd/examples/cubocta.ine                |     19 +
 demos/ppl_lcdd/examples/cut16_11.ext               |     21 +
 demos/ppl_lcdd/examples/cut32_16.ext               |     37 +
 demos/ppl_lcdd/examples/cyc.ine                    |     10 +
 demos/ppl_lcdd/examples/cyclic10-4.ext             |     16 +
 demos/ppl_lcdd/examples/cyclic12-6.ext             |     18 +
 demos/ppl_lcdd/examples/cyclic14-8.ext             |     20 +
 demos/ppl_lcdd/examples/cyclic16-10.ext            |     23 +
 demos/ppl_lcdd/examples/cyclic17_8.ine             |     20 +
 demos/ppl_lcdd/examples/cyclic25_13.ext            |     54 +
 demos/ppl_lcdd/examples/dcube10.ext                |     24 +
 demos/ppl_lcdd/examples/dcube12.ext                |     28 +
 demos/ppl_lcdd/examples/dcube3.ext                 |     10 +
 demos/ppl_lcdd/examples/dcube6.ext                 |     16 +
 demos/ppl_lcdd/examples/dcube8.ext                 |     20 +
 demos/ppl_lcdd/examples/diamond.ine                |     10 +
 demos/ppl_lcdd/examples/dodeca_m.ine               |     17 +
 demos/ppl_lcdd/examples/ex1.ine                    |     10 +
 demos/ppl_lcdd/examples/grcubocta.ine              |     31 +
 demos/ppl_lcdd/examples/hexocta.ine                |     54 +
 demos/ppl_lcdd/examples/icododeca_m.ine            |     39 +
 demos/ppl_lcdd/examples/in0.ine                    |     11 +
 demos/ppl_lcdd/examples/in1.ine                    |     37 +
 demos/ppl_lcdd/examples/in2.ine                    |     19 +
 demos/ppl_lcdd/examples/in3.ine                    |     16 +
 demos/ppl_lcdd/examples/in4.ine                    |     15 +
 demos/ppl_lcdd/examples/in5.ine                    |     17 +
 demos/ppl_lcdd/examples/in6.ine                    |     26 +
 demos/ppl_lcdd/examples/in7.ine                    |     23 +
 demos/ppl_lcdd/examples/infeas.ine                 |     18 +
 demos/ppl_lcdd/examples/integralpoints.ine         |     36 +
 demos/ppl_lcdd/examples/irbox20-4.ext              |     25 +
 demos/ppl_lcdd/examples/irbox200-4.ext             |    205 +
 demos/ppl_lcdd/examples/kkd18_4.ine                |     25 +
 demos/ppl_lcdd/examples/kkd27_5.ine                |     34 +
 demos/ppl_lcdd/examples/kkd38_6.ine                |     49 +
 demos/ppl_lcdd/examples/kq20_11_m.ine              |     24 +
 demos/ppl_lcdd/examples/metric40_11.ine            |     45 +
 demos/ppl_lcdd/examples/metric80_16.ine            |     86 +
 demos/ppl_lcdd/examples/mit.ine                    |    732 +
 demos/ppl_lcdd/examples/mit288-281.ine             |    291 +
 demos/ppl_lcdd/examples/mit31-20.ine               |     34 +
 demos/ppl_lcdd/examples/mit41-16.ine               |     44 +
 demos/ppl_lcdd/examples/mit708-9.ine               |    711 +
 demos/ppl_lcdd/examples/mit71-61.ine               |     74 +
 demos/ppl_lcdd/examples/mit90-86.ine               |     93 +
 demos/ppl_lcdd/examples/mp5.ext                    |     36 +
 demos/ppl_lcdd/examples/mp5.ine                    |     45 +
 demos/ppl_lcdd/examples/mp5a.ine                   |     44 +
 demos/ppl_lcdd/examples/mp6.ine                    |     84 +
 demos/ppl_lcdd/examples/nonfull.ine                |     11 +
 demos/ppl_lcdd/examples/origin.ine                 |     14 +
 demos/ppl_lcdd/examples/prodst62.ext               |   3467 +
 demos/ppl_lcdd/examples/project1_m.ine             |     24 +
 demos/ppl_lcdd/examples/project1res.ine            |     18 +
 demos/ppl_lcdd/examples/project2_m.ine             |     66 +
 demos/ppl_lcdd/examples/project2res.ine            |     90 +
 demos/ppl_lcdd/examples/rcubocta.ine               |     31 +
 demos/ppl_lcdd/examples/redcheck.ext               |     11 +
 demos/ppl_lcdd/examples/reg24-5.ext                |     31 +
 demos/ppl_lcdd/examples/reg24-5.ine                |     30 +
 demos/ppl_lcdd/examples/reg600-5_m.ext             |    606 +
 demos/ppl_lcdd/examples/rhomtria_m.ine             |     35 +
 demos/ppl_lcdd/examples/sample.ine                 |     11 +
 demos/ppl_lcdd/examples/sampleh1.ine               |      9 +
 demos/ppl_lcdd/examples/sampleh2.ine               |      7 +
 demos/ppl_lcdd/examples/sampleh3.ine               |      7 +
 demos/ppl_lcdd/examples/sampleh4.ine               |     12 +
 demos/ppl_lcdd/examples/sampleh5.ine               |     15 +
 demos/ppl_lcdd/examples/sampleh6.ine               |     11 +
 demos/ppl_lcdd/examples/sampleh7.ine               |     19 +
 demos/ppl_lcdd/examples/sampleh8.ine               |    110 +
 demos/ppl_lcdd/examples/samplev1.ext               |      8 +
 demos/ppl_lcdd/examples/samplev2.ext               |     11 +
 demos/ppl_lcdd/examples/samplev3.ext               |     16 +
 demos/ppl_lcdd/examples/trunc10.ine                |    119 +
 demos/ppl_lcdd/examples/trunc7.ine                 |     65 +
 demos/ppl_lcdd/examples/tsp5.ext                   |     16 +
 demos/ppl_lcdd/examples/tsp5.ine                   |     30 +
 demos/ppl_lcdd/expected_int16                      |     98 +
 demos/ppl_lcdd/expected_int16_a                    |     85 +
 demos/ppl_lcdd/expected_int32                      |     98 +
 demos/ppl_lcdd/expected_int32_a                    |     85 +
 demos/ppl_lcdd/expected_int64                      |     98 +
 demos/ppl_lcdd/expected_int64_a                    |     85 +
 demos/ppl_lcdd/expected_int8                       |     98 +
 demos/ppl_lcdd/expected_int8_a                     |     85 +
 demos/ppl_lcdd/expected_mpz                        |     98 +
 demos/ppl_lcdd/expected_mpz_a                      |     85 +
 demos/ppl_lcdd/ppl_lcdd.1                          |     66 +
 demos/ppl_lcdd/ppl_lcdd.cc                         |   1357 +
 demos/ppl_lpsol/Makefile.am                        |    334 +
 demos/ppl_lpsol/Makefile.in                        |   1272 +
 demos/ppl_lpsol/dummy.cc                           |     13 +
 demos/ppl_lpsol/examples/Makefile.am               |     52 +
 demos/ppl_lpsol/examples/Makefile.in               |    576 +
 demos/ppl_lpsol/examples/README                    |      9 +
 demos/ppl_lpsol/examples/adlittle.mps              |    335 +
 demos/ppl_lpsol/examples/afiro.mps                 |     83 +
 demos/ppl_lpsol/examples/bgprtr.mps                |     84 +
 demos/ppl_lpsol/examples/blend.mps                 |    366 +
 demos/ppl_lpsol/examples/boeing1.mps               |   2636 +
 demos/ppl_lpsol/examples/boeing2.mps               |    970 +
 demos/ppl_lpsol/examples/egout.mps                 |    403 +
 demos/ppl_lpsol/examples/ex1.mps                   |     21 +
 demos/ppl_lpsol/examples/ex12.mps                  |     25 +
 demos/ppl_lpsol/examples/kb2.mps                   |    219 +
 demos/ppl_lpsol/examples/lseu.mps                  |    371 +
 demos/ppl_lpsol/examples/markshare1.mps            |    236 +
 demos/ppl_lpsol/examples/markshare2.mps            |    341 +
 demos/ppl_lpsol/examples/mas74.mps                 |   1131 +
 demos/ppl_lpsol/examples/mas76.mps                 |   1134 +
 demos/ppl_lpsol/examples/mip.mps                   |     27 +
 demos/ppl_lpsol/examples/modglob.mps               |   1192 +
 demos/ppl_lpsol/examples/noswot.mps                |    729 +
 demos/ppl_lpsol/examples/opt1217.mps               |   1643 +
 demos/ppl_lpsol/examples/p0033.mps                 |    152 +
 demos/ppl_lpsol/examples/pk1.mps                   |    603 +
 demos/ppl_lpsol/examples/rout.mps                  |   2038 +
 demos/ppl_lpsol/examples/sample.mps                |     24 +
 demos/ppl_lpsol/examples/sc105.mps                 |    296 +
 demos/ppl_lpsol/examples/sc50a.mps                 |    141 +
 demos/ppl_lpsol/examples/sc50b.mps                 |    127 +
 demos/ppl_lpsol/examples/ship08l.mps               |   9547 ++
 demos/ppl_lpsol/examples/unboundedmin.mps          |     21 +
 demos/ppl_lpsol/expected_int16                     |    977 +
 demos/ppl_lpsol/expected_int16_a                   |    183 +
 demos/ppl_lpsol/expected_int32                     |    997 +
 demos/ppl_lpsol/expected_int32_a                   |    165 +
 demos/ppl_lpsol/expected_int64                     |   1046 +
 demos/ppl_lpsol/expected_int64_a                   |    207 +
 demos/ppl_lpsol/expected_int8                      |    181 +
 demos/ppl_lpsol/expected_int8_a                    |    161 +
 demos/ppl_lpsol/expected_mpz                       |   6171 +
 demos/ppl_lpsol/expected_mpz_a                     |   4578 +
 demos/ppl_lpsol/glpk_set_d_eps.c                   |    263 +
 demos/ppl_lpsol/ppl_lpsol.1                        |     99 +
 demos/ppl_lpsol/ppl_lpsol.c                        |   1435 +
 demos/ppl_pips/Makefile.am                         |    127 +
 demos/ppl_pips/Makefile.in                         |   1012 +
 demos/ppl_pips/examples/Makefile.am                |     48 +
 demos/ppl_pips/examples/Makefile.in                |    571 +
 demos/ppl_pips/examples/README                     |      8 +
 demos/ppl_pips/examples/big.pip                    |      9 +
 demos/ppl_pips/examples/brisebarre.pip             |     33 +
 demos/ppl_pips/examples/cg1.pip                    |     15 +
 demos/ppl_pips/examples/esced.pip                  |     21 +
 demos/ppl_pips/examples/ex2.pip                    |      9 +
 demos/ppl_pips/examples/fimmel.pip                 |     12 +
 demos/ppl_pips/examples/invert.dat                 |     10 +
 demos/ppl_pips/examples/linear.dat                 |     10 +
 demos/ppl_pips/examples/lineri.dat                 |      9 +
 demos/ppl_pips/examples/loz.dat                    |     15 +
 demos/ppl_pips/examples/max.dat                    |      9 +
 demos/ppl_pips/examples/max.pip                    |      9 +
 demos/ppl_pips/examples/maxb.dat                   |      9 +
 demos/ppl_pips/examples/pairi.dat                  |      7 +
 demos/ppl_pips/examples/petit.dat                  |      9 +
 demos/ppl_pips/examples/rairoi.dat                 |      9 +
 demos/ppl_pips/examples/sor1d.pip                  |     28 +
 demos/ppl_pips/examples/square.pip                 |      9 +
 demos/ppl_pips/examples/test02.dat                 |     20 +
 demos/ppl_pips/examples/test12i.dat                |     17 +
 demos/ppl_pips/expected_int16                      |     20 +
 demos/ppl_pips/expected_int16_a                    |     20 +
 demos/ppl_pips/expected_int32                      |     20 +
 demos/ppl_pips/expected_int32_a                    |     20 +
 demos/ppl_pips/expected_int64                      |     20 +
 demos/ppl_pips/expected_int64_a                    |     20 +
 demos/ppl_pips/expected_int8                       |     20 +
 demos/ppl_pips/expected_int8_a                     |     20 +
 demos/ppl_pips/expected_mpz                        |     20 +
 demos/ppl_pips/expected_mpz_a                      |     20 +
 demos/ppl_pips/ppl_pips.1                          |    137 +
 demos/ppl_pips/ppl_pips.cc                         |    827 +
 depcomp                                            |    791 +
 doc/Makefile.am                                    |   1736 +
 doc/Makefile.in                                    |   2354 +
 doc/README.doc                                     |    167 +
 doc/bugseng_logo.pdf                               |    Bin 0 -> 4035 bytes
 doc/definitions.dox                                |   5028 +
 doc/devref-language-interface.doxyconf.in          |    308 +
 doc/devref-language-interface.tex                  |    175 +
 doc/devref.doxyconf-html.in                        |    333 +
 doc/devref.doxyconf-latex.in                       |    332 +
 doc/devref.tex                                     |    173 +
 doc/fdl.dox                                        |    412 +
 doc/fdl.pdf                                        |    Bin 0 -> 77376 bytes
 doc/fdl.ps.gz                                      |    Bin 0 -> 100473 bytes
 doc/fdl.tex                                        |    454 +
 doc/fdl.txt                                        |    397 +
 doc/gpl.dox                                        |    691 +
 doc/gpl.pdf                                        |    Bin 0 -> 69984 bytes
 doc/gpl.ps.gz                                      |    Bin 0 -> 98913 bytes
 doc/gpl.tex                                        |    728 +
 doc/gpl.txt                                        |    674 +
 doc/interfaces-html.sed                            |      4 +
 doc/interfaces-latex.sed                           |      4 +
 doc/libppl.3                                       |    226 +
 doc/libppl_c.3                                     |    162 +
 doc/ppl-config.1                                   |    142 +
 doc/ppl-user-1.1-html.tar.gz                       |    Bin 0 -> 1929177 bytes
 doc/ppl-user-1.1.pdf                               |    Bin 0 -> 2813705 bytes
 doc/ppl-user-1.1.ps.gz                             |    Bin 0 -> 2698834 bytes
 doc/ppl-user-c-interface-1.1-html.tar.gz           |    Bin 0 -> 315443 bytes
 doc/ppl-user-c-interface-1.1.pdf                   |    Bin 0 -> 631543 bytes
 doc/ppl-user-c-interface-1.1.ps.gz                 |    Bin 0 -> 645091 bytes
 doc/ppl-user-java-interface-1.1-html.tar.gz        |    Bin 0 -> 441271 bytes
 doc/ppl-user-java-interface-1.1.pdf                |    Bin 0 -> 684377 bytes
 doc/ppl-user-java-interface-1.1.ps.gz              |    Bin 0 -> 639840 bytes
 doc/ppl-user-ocaml-interface-1.1-html.tar.gz       |    Bin 0 -> 140952 bytes
 doc/ppl-user-ocaml-interface-1.1.pdf               |    Bin 0 -> 270568 bytes
 doc/ppl-user-ocaml-interface-1.1.ps.gz             |    Bin 0 -> 328924 bytes
 doc/ppl-user-prolog-interface-1.1-html.tar.gz      |    Bin 0 -> 143342 bytes
 doc/ppl-user-prolog-interface-1.1.pdf              |    Bin 0 -> 309488 bytes
 doc/ppl-user-prolog-interface-1.1.ps.gz            |    Bin 0 -> 382534 bytes
 doc/ppl.bib                                        |   3246 +
 doc/ppl.sty                                        |    200 +
 doc/ppl_citations.bib                              |   4272 +
 doc/ppl_logo.pdf                                   |    Bin 0 -> 5061 bytes
 doc/ppl_logo_no_ppl.pdf                            |    Bin 0 -> 4805 bytes
 doc/user-language-interface.doxyconf.in            |    311 +
 doc/user-language-interface.tex                    |    174 +
 doc/user.doxyconf-html.in                          |    307 +
 doc/user.doxyconf-latex.in                         |    307 +
 doc/user.tex                                       |    173 +
 install-sh                                         |    527 +
 instchk.hh                                         |    389 +
 interfaces/C/C_interface.dox                       |   1754 +
 interfaces/C/Makefile.am                           |    268 +
 interfaces/C/Makefile.in                           |   1222 +
 interfaces/C/ppl_c.h.dist                          |  16187 +++
 interfaces/C/ppl_c_header.h                        |   3272 +
 interfaces/C/ppl_c_implementation_common.cc        |   2642 +
 interfaces/C/ppl_c_implementation_common_defs.hh   |    259 +
 .../C/ppl_c_implementation_common_inlines.hh       |    214 +
 interfaces/C/ppl_c_version.h.in                    |     63 +
 interfaces/C/ppl_interface_generator_c_cc_code.m4  |   1437 +
 interfaces/C/ppl_interface_generator_c_cc_files.m4 |     70 +
 interfaces/C/ppl_interface_generator_c_h.m4        |     72 +
 interfaces/C/ppl_interface_generator_c_h_code.m4   |    872 +
 interfaces/C/ppl_interface_generator_c_hh_files.m4 |     85 +
 ...l_interface_generator_c_procedure_generators.m4 |     54 +
 interfaces/C/tests/Makefile.am                     |    141 +
 interfaces/C/tests/Makefile.in                     |   1304 +
 interfaces/C/tests/formatted_output.c              |     64 +
 interfaces/C/tests/pip_test.c                      |    272 +
 interfaces/C/tests/ppl_c_test.cc                   |     71 +
 interfaces/C/tests/ppl_c_test.h                    |     41 +
 interfaces/C/tests/print_to_buffer.c               |     68 +
 interfaces/C/tests/print_to_buffer.h               |     82 +
 interfaces/C/tests/watchdog1.c                     |    149 +
 interfaces/C/tests/weightwatch1.c                  |    144 +
 interfaces/Java/Makefile.am                        |     46 +
 interfaces/Java/Makefile.in                        |    801 +
 interfaces/Java/README.java                        |     58 +
 interfaces/Java/jni/Makefile.am                    |    205 +
 interfaces/Java/jni/Makefile.in                    |   1006 +
 ...ppl_interface_generator_java_classes_cc_code.m4 |   1607 +
 ...pl_interface_generator_java_classes_cc_files.m4 |     88 +
 interfaces/Java/jni/ppl_java_common.cc             |   1249 +
 interfaces/Java/jni/ppl_java_common_defs.hh        |    899 +
 interfaces/Java/jni/ppl_java_common_inlines.hh     |    246 +
 interfaces/Java/jni/ppl_java_globals.cc            |   2228 +
 .../Artificial_Parameter.java                      |     87 +
 .../Artificial_Parameter_Sequence.java             |     42 +
 .../Bounded_Integer_Type_Overflow.java             |     40 +
 .../Bounded_Integer_Type_Representation.java       |     41 +
 .../Bounded_Integer_Type_Width.java                |     44 +
 .../Java/parma_polyhedra_library/By_Reference.java |     51 +
 .../Java/parma_polyhedra_library/Coefficient.java  |     85 +
 .../parma_polyhedra_library/Complexity_Class.java  |     40 +
 .../Java/parma_polyhedra_library/Congruence.java   |     86 +
 .../parma_polyhedra_library/Congruence_System.java |     46 +
 .../Java/parma_polyhedra_library/Constraint.java   |     80 +
 .../parma_polyhedra_library/Constraint_System.java |     47 +
 .../Control_Parameter_Name.java                    |     31 +
 .../Control_Parameter_Value.java                   |     35 +
 .../Degenerate_Element.java                        |     38 +
 .../Domain_Error_Exception.java                    |     33 +
 .../Fake_Class_for_Doxygen.java                    |   1291 +
 .../Java/parma_polyhedra_library/Generator.java    |    145 +
 .../parma_polyhedra_library/Generator_System.java  |     48 +
 .../parma_polyhedra_library/Generator_Type.java    |     42 +
 .../parma_polyhedra_library/Grid_Generator.java    |    123 +
 .../Grid_Generator_System.java                     |     49 +
 .../Grid_Generator_Type.java                       |     40 +
 interfaces/Java/parma_polyhedra_library/IO.java    |     48 +
 .../Invalid_Argument_Exception.java                |     34 +
 .../Length_Error_Exception.java                    |     33 +
 .../parma_polyhedra_library/Linear_Expression.java |     76 +
 .../Linear_Expression_Coefficient.java             |     54 +
 .../Linear_Expression_Difference.java              |     66 +
 .../Linear_Expression_Sum.java                     |     62 +
 .../Linear_Expression_Times.java                   |     74 +
 .../Linear_Expression_Unary_Minus.java             |     54 +
 .../Linear_Expression_Variable.java                |     57 +
 .../Logic_Error_Exception.java                     |     37 +
 .../Java/parma_polyhedra_library/MIP_Problem.java  |    322 +
 .../MIP_Problem_Status.java                        |     40 +
 .../Java/parma_polyhedra_library/Makefile.am       |    309 +
 .../Java/parma_polyhedra_library/Makefile.in       |    836 +
 .../parma_polyhedra_library/Optimization_Mode.java |     38 +
 .../Overflow_Error_Exception.java                  |     36 +
 .../parma_polyhedra_library/PIP_Decision_Node.java |     35 +
 .../Java/parma_polyhedra_library/PIP_Problem.java  |    323 +
 .../PIP_Problem_Control_Parameter_Name.java        |     33 +
 .../PIP_Problem_Control_Parameter_Value.java       |     39 +
 .../PIP_Problem_Status.java                        |     38 +
 .../parma_polyhedra_library/PIP_Solution_Node.java |     41 +
 .../parma_polyhedra_library/PIP_Tree_Node.java     |     79 +
 .../Java/parma_polyhedra_library/PPL_Object.java   |     46 +
 interfaces/Java/parma_polyhedra_library/Pair.java  |     52 +
 .../Parma_Polyhedra_Library.java                   |    327 +
 .../parma_polyhedra_library/Partial_Function.java  |     80 +
 .../parma_polyhedra_library/Poly_Con_Relation.java |     93 +
 .../parma_polyhedra_library/Poly_Gen_Relation.java |     63 +
 .../parma_polyhedra_library/Relation_Symbol.java   |     46 +
 .../parma_polyhedra_library/Timeout_Exception.java |     33 +
 .../Java/parma_polyhedra_library/Variable.java     |     95 +
 .../Variable_Stringifier.java                      |     33 +
 .../parma_polyhedra_library/Variables_Set.java     |     37 +
 .../ppl_interface_generator_java_classes_java.m4   |    169 +
 ...l_interface_generator_java_classes_java_code.m4 |    771 +
 ...nterface_generator_java_procedure_generators.m4 |     55 +
 interfaces/Java/tests/C_Polyhedron_test1.java      |    137 +
 .../Java/tests/Custom_Variable_Stringifier.java    |     29 +
 interfaces/Java/tests/MIP_Problem_test1.java       |    274 +
 interfaces/Java/tests/Makefile.am                  |    103 +
 interfaces/Java/tests/Makefile.in                  |    640 +
 interfaces/Java/tests/NNC_Polyhedron_test1.java    |    123 +
 interfaces/Java/tests/PIP_Problem_test1.java       |    480 +
 interfaces/Java/tests/PPL_Test.java                |     90 +
 .../Java/tests/Parma_Polyhedra_Library_test1.java  |     72 +
 .../Java/tests/Parma_Polyhedra_Library_test2.java  |    142 +
 interfaces/Java/tests/Test_Executor.java           |     65 +
 interfaces/Java/tests/Variable_Output_test1.java   |     94 +
 .../ppl_interface_generator_java_test_java.m4      |    103 +
 .../ppl_interface_generator_java_test_java_code.m4 |    955 +
 interfaces/Java/tests/ppl_java_tests_common        |    197 +
 interfaces/Makefile.am                             |     65 +
 interfaces/Makefile.in                             |    761 +
 interfaces/OCaml/Makefile.am                       |    292 +
 interfaces/OCaml/Makefile.in                       |   1239 +
 interfaces/OCaml/OCaml_interface.dox               |   1269 +
 interfaces/OCaml/README.ocaml                      |     55 +
 .../OCaml/ppl_interface_generator_ocaml_cc_code.m4 |   1544 +
 .../ppl_interface_generator_ocaml_cc_files.m4      |     66 +
 .../OCaml/ppl_interface_generator_ocaml_hh_code.m4 |     66 +
 .../ppl_interface_generator_ocaml_hh_files.m4      |     65 +
 .../OCaml/ppl_interface_generator_ocaml_ml.m4      |     62 +
 .../OCaml/ppl_interface_generator_ocaml_ml_code.m4 |    668 +
 .../OCaml/ppl_interface_generator_ocaml_mli.m4     |     60 +
 .../ppl_interface_generator_ocaml_mli_code.m4      |    588 +
 ...terface_generator_ocaml_procedure_generators.m4 |     57 +
 interfaces/OCaml/ppl_ocaml_common.cc               |   1814 +
 interfaces/OCaml/ppl_ocaml_common_defs.hh          |    234 +
 interfaces/OCaml/ppl_ocaml_common_inlines.hh       |     82 +
 interfaces/OCaml/ppl_ocaml_globals.ml              |    438 +
 interfaces/OCaml/ppl_ocaml_globals.mli             |    376 +
 interfaces/OCaml/tests/Makefile.am                 |    176 +
 interfaces/OCaml/tests/Makefile.in                 |   1188 +
 .../tests/ppl_interface_generator_ocaml_test_ml.m4 |     61 +
 .../ppl_interface_generator_ocaml_test_ml_code.m4  |    967 +
 interfaces/OCaml/tests/ppl_ocaml_tests_common      |    293 +
 interfaces/OCaml/tests/test1.ml                    |    690 +
 interfaces/Prolog/Ciao/Makefile.am                 |    317 +
 interfaces/Prolog/Ciao/Makefile.in                 |   1681 +
 interfaces/Prolog/Ciao/README.ciao                 |     16 +
 interfaces/Prolog/Ciao/ciao_cfli.hh                |    341 +
 interfaces/Prolog/Ciao/ciao_clpq.pl                |     56 +
 interfaces/Prolog/Ciao/ciao_clpq2.pl               |     56 +
 interfaces/Prolog/Ciao/ciao_efli.cc                |    100 +
 interfaces/Prolog/Ciao/ciao_efli.hh                |     92 +
 interfaces/Prolog/Ciao/ciao_pl_check.pl            |    170 +
 .../Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 |     88 +
 ...face_generator_ciao_prolog_generated_test_pl.m4 |     65 +
 interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh        |     26 +
 interfaces/Prolog/GNU/Makefile.am                  |    309 +
 interfaces/Prolog/GNU/Makefile.in                  |   1713 +
 interfaces/Prolog/GNU/README.gprolog               |     59 +
 interfaces/Prolog/GNU/gnu_pl_check.pl              |     37 +
 interfaces/Prolog/GNU/gnu_prolog_generated_test.pl |     37 +
 interfaces/Prolog/GNU/gp_clpq.pl                   |     32 +
 interfaces/Prolog/GNU/gprolog_cfli.hh              |    461 +
 interfaces/Prolog/GNU/gprolog_efli.cc              |     83 +
 interfaces/Prolog/GNU/gprolog_efli.hh              |     89 +
 .../GNU/ppl_interface_generator_gprolog_pl.m4      |     47 +
 interfaces/Prolog/GNU/ppl_prolog_sysdep.hh         |     26 +
 interfaces/Prolog/Makefile.am                      |    139 +
 interfaces/Prolog/Makefile.in                      |    827 +
 interfaces/Prolog/Prolog_configured_interface.dox  |     63 +
 interfaces/Prolog/Prolog_interface.dox             |     64 +
 interfaces/Prolog/Prolog_interface_compilation.dox |     59 +
 interfaces/Prolog/Prolog_interface_sysdep.dox      |    235 +
 interfaces/Prolog/Prolog_interface_sysindep.dox    |    949 +
 .../Prolog/Prolog_interface_sysindep_domains.dox   |    914 +
 interfaces/Prolog/SICStus/Makefile.am              |    320 +
 interfaces/Prolog/SICStus/Makefile.in              |   1704 +
 .../ppl_interface_generator_sicstus_sd_cc.m4       |    250 +
 interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh     |     26 +
 interfaces/Prolog/SICStus/ppl_sicstus.pl           |     30 +
 interfaces/Prolog/SICStus/sicstus_cfli.cc          |     28 +
 interfaces/Prolog/SICStus/sicstus_cfli.h           |    156 +
 interfaces/Prolog/SICStus/sicstus_cfli.ic          |    300 +
 interfaces/Prolog/SICStus/sicstus_efli.cc          |    108 +
 interfaces/Prolog/SICStus/sicstus_efli.hh          |     92 +
 interfaces/Prolog/SICStus/sp_clpq.pl               |     44 +
 interfaces/Prolog/SICStus/sp_pl_check.pl           |     49 +
 .../Prolog/SICStus/sp_prolog_generated_test.pl     |     49 +
 interfaces/Prolog/SWI/Makefile.am                  |    332 +
 interfaces/Prolog/SWI/Makefile.in                  |   1750 +
 interfaces/Prolog/SWI/README.swiprolog             |     50 +
 interfaces/Prolog/SWI/pl_clpq.cc                   |     48 +
 interfaces/Prolog/SWI/pl_clpq.pl                   |     33 +
 .../SWI/ppl_interface_generator_swiprolog_cc.m4    |     72 +
 interfaces/Prolog/SWI/ppl_pl.cc                    |     44 +
 interfaces/Prolog/SWI/ppl_prolog_sysdep.hh         |     26 +
 interfaces/Prolog/SWI/ppl_swiprolog.pl             |     24 +
 interfaces/Prolog/SWI/swi_cfli.hh                  |    376 +
 interfaces/Prolog/SWI/swi_efli.cc                  |     86 +
 interfaces/Prolog/SWI/swi_efli.hh                  |     92 +
 interfaces/Prolog/SWI/swi_pl_check.pl              |     39 +
 interfaces/Prolog/SWI/swi_prolog_generated_test.pl |     47 +
 interfaces/Prolog/XSB/Makefile.am                  |    308 +
 interfaces/Prolog/XSB/Makefile.in                  |   1650 +
 .../Prolog/XSB/ppl_interface_generator_xsb_H.m4    |     47 +
 .../Prolog/XSB/ppl_interface_generator_xsb_cc.m4   |    146 +
 .../Prolog/XSB/ppl_interface_generator_xsb_hh.m4   |     39 +
 ...erface_generator_xsb_prolog_generated_test_P.m4 |     86 +
 interfaces/Prolog/XSB/ppl_prolog_sysdep.hh         |     27 +
 interfaces/Prolog/XSB/xsb_cfli.hh                  |    351 +
 interfaces/Prolog/XSB/xsb_clpq.P                   |     54 +
 interfaces/Prolog/XSB/xsb_clpq2.P                  |     55 +
 interfaces/Prolog/XSB/xsb_efli.cc                  |     82 +
 interfaces/Prolog/XSB/xsb_efli.hh                  |     89 +
 interfaces/Prolog/XSB/xsb_pl_check.P               |    205 +
 interfaces/Prolog/YAP/Makefile.am                  |    278 +
 interfaces/Prolog/YAP/Makefile.in                  |   1644 +
 interfaces/Prolog/YAP/README.yap                   |     23 +
 .../Prolog/YAP/ppl_interface_generator_yap_cc.m4   |    165 +
 interfaces/Prolog/YAP/ppl_prolog_sysdep.hh         |     26 +
 interfaces/Prolog/YAP/ppl_yap.pl                   |     24 +
 interfaces/Prolog/YAP/yap_cfli.hh                  |    349 +
 interfaces/Prolog/YAP/yap_clpq.pl                  |     31 +
 interfaces/Prolog/YAP/yap_clpq2.pl                 |     31 +
 interfaces/Prolog/YAP/yap_efli.cc                  |     95 +
 interfaces/Prolog/YAP/yap_efli.hh                  |     91 +
 interfaces/Prolog/YAP/yap_pl_check.pl              |     35 +
 interfaces/Prolog/YAP/yap_prolog_generated_test.pl |     36 +
 .../ppl_interface_generator_prolog_cc_code.m4      |   2156 +
 .../ppl_interface_generator_prolog_cc_files.m4     |     61 +
 .../Prolog/ppl_interface_generator_prolog_dox.m4   |    295 +
 .../ppl_interface_generator_prolog_dox_code.m4     |   1191 +
 .../ppl_interface_generator_prolog_hh_code.m4      |    631 +
 .../ppl_interface_generator_prolog_hh_files.m4     |     71 +
 ...erface_generator_prolog_procedure_generators.m4 |    133 +
 .../ppl_interface_generator_prolog_systems.m4      |     79 +
 interfaces/Prolog/ppl_prolog_common.cc             |   3115 +
 interfaces/Prolog/ppl_prolog_common_defs.hh        |   1084 +
 interfaces/Prolog/ppl_prolog_common_inlines.hh     |     88 +
 interfaces/Prolog/tests/Makefile.am                |     87 +
 interfaces/Prolog/tests/Makefile.in                |    611 +
 interfaces/Prolog/tests/ack.clpq                   |      5 +
 interfaces/Prolog/tests/ackn.clpq                  |      6 +
 interfaces/Prolog/tests/clpq.pl                    |    805 +
 interfaces/Prolog/tests/clpq2.pl                   |   1122 +
 interfaces/Prolog/tests/expected_clpq2_int16       |    103 +
 interfaces/Prolog/tests/expected_clpq2_int16_a     |    104 +
 interfaces/Prolog/tests/expected_clpq2_int32       |    110 +
 interfaces/Prolog/tests/expected_clpq2_int32_a     |    103 +
 interfaces/Prolog/tests/expected_clpq2_int64       |    110 +
 interfaces/Prolog/tests/expected_clpq2_int64_a     |    110 +
 interfaces/Prolog/tests/expected_clpq2_int8        |    102 +
 interfaces/Prolog/tests/expected_clpq2_int8_a      |    102 +
 interfaces/Prolog/tests/expected_clpq2_mpz         |    110 +
 interfaces/Prolog/tests/expected_clpq2_mpz_a       |    110 +
 interfaces/Prolog/tests/expected_clpq_int16        |     36 +
 interfaces/Prolog/tests/expected_clpq_int16_a      |     36 +
 interfaces/Prolog/tests/expected_clpq_int32        |     36 +
 interfaces/Prolog/tests/expected_clpq_int32_a      |     36 +
 interfaces/Prolog/tests/expected_clpq_int64        |     36 +
 interfaces/Prolog/tests/expected_clpq_int64_a      |     36 +
 interfaces/Prolog/tests/expected_clpq_int8         |     30 +
 interfaces/Prolog/tests/expected_clpq_int8_a       |     30 +
 interfaces/Prolog/tests/expected_clpq_mpz          |     36 +
 interfaces/Prolog/tests/expected_clpq_mpz_a        |     36 +
 interfaces/Prolog/tests/expected_pchk_int16        |      1 +
 interfaces/Prolog/tests/expected_pchk_int16_a      |      1 +
 interfaces/Prolog/tests/expected_pchk_int32        |      1 +
 interfaces/Prolog/tests/expected_pchk_int32_a      |      1 +
 interfaces/Prolog/tests/expected_pchk_int64        |      1 +
 interfaces/Prolog/tests/expected_pchk_int64_a      |      1 +
 interfaces/Prolog/tests/expected_pchk_int8         |      7 +
 interfaces/Prolog/tests/expected_pchk_int8_a       |      7 +
 interfaces/Prolog/tests/expected_pchk_mpz          |      1 +
 interfaces/Prolog/tests/expected_pchk_mpz_a        |      1 +
 interfaces/Prolog/tests/expected_pgt               |      1 +
 interfaces/Prolog/tests/fib.clpq                   |      6 +
 interfaces/Prolog/tests/mc91.clpq                  |      6 +
 interfaces/Prolog/tests/pl_check.pl                |   3610 +
 ...interface_generator_prolog_generated_test_pl.m4 |    372 +
 ...face_generator_prolog_generated_test_pl_code.m4 |   1974 +
 .../tests/ppl_prolog_generated_test_common.pl      |    648 +
 interfaces/Prolog/tests/schedule.clpq              |     22 +
 interfaces/Prolog/tests/script_clpq                |     18 +
 interfaces/Prolog/tests/script_clpq2               |     36 +
 interfaces/Prolog/tests/script_clpq2_int8          |     34 +
 interfaces/Prolog/tests/smm.clpq                   |     31 +
 interfaces/Prolog/tests/sumto.clpq                 |      4 +
 interfaces/Prolog/tests/tak.clpq                   |     20 +
 interfaces/interfaced_boxes.hh                     |    108 +
 interfaces/marked_pointers.hh                      |     64 +
 interfaces/ppl_interface_generator_common.m4       |    925 +
 interfaces/ppl_interface_generator_common_dat.m4   |   1006 +
 ...erface_generator_common_procedure_generators.m4 |    140 +
 interfaces/ppl_interface_generator_copyright       |     21 +
 ltmain.sh                                          |   9655 ++
 m4/Makefile.am                                     |     59 +
 m4/Makefile.in                                     |    637 +
 m4/ac_check_ciao.m4                                |     89 +
 m4/ac_check_classpath.m4                           |     63 +
 m4/ac_check_fpu_control.m4                         |    145 +
 m4/ac_check_gmp.m4                                 |    235 +
 m4/ac_check_sicstus_prolog.m4                      |     61 +
 m4/ac_check_swi_prolog.m4                          |    109 +
 m4/ac_check_xsb_prolog.m4                          |     50 +
 m4/ac_check_yap.m4                                 |     55 +
 m4/ac_cxx_attribute_weak.m4                        |     59 +
 m4/ac_cxx_double_binary_format.m4                  |    113 +
 m4/ac_cxx_float_binary_format.m4                   |    102 +
 m4/ac_cxx_ieee_inexact_flag.m4                     |    133 +
 m4/ac_cxx_limit_memory.m4                          |    121 +
 m4/ac_cxx_long_double_binary_format.m4             |    353 +
 m4/ac_cxx_plain_char_is_signed.m4                  |     53 +
 m4/ac_cxx_proper_long_double.m4                    |     64 +
 m4/ac_cxx_zero_length_arrays.m4                    |    142 +
 m4/ac_prog_jar.m4                                  |     54 +
 m4/ac_prog_java.m4                                 |    268 +
 m4/ac_prog_javac.m4                                |    145 +
 m4/ac_prog_javah.m4                                |     54 +
 m4/ac_text_md5sum.m4                               |     38 +
 m4/libtool.m4                                      |   7982 ++
 m4/ltoptions.m4                                    |    384 +
 m4/ltsugar.m4                                      |    123 +
 m4/ltversion.m4                                    |     23 +
 m4/lt~obsolete.m4                                  |     98 +
 m4/m4.m4                                           |     46 +
 m4/ocaml.m4                                        |    244 +
 m4/ppl.m4                                          |    288 +
 m4/ppl_c.m4                                        |    286 +
 missing                                            |    215 +
 mkinstalldirs                                      |    162 +
 ppl-config.h.in                                    |    411 +
 ppl-config.sed                                     |     71 +
 ppl.lsm.in                                         |     45 +
 src/BDS_Status_idefs.hh                            |    117 +
 src/BDS_Status_inlines.hh                          |    268 +
 src/BD_Shape.cc                                    |     93 +
 src/BD_Shape_defs.hh                               |   2371 +
 src/BD_Shape_inlines.hh                            |    910 +
 src/BD_Shape_templates.hh                          |   6789 ++
 src/BD_Shape_types.hh                              |     25 +
 src/BHRZ03_Certificate.cc                          |    318 +
 src/BHRZ03_Certificate_defs.hh                     |    118 +
 src/BHRZ03_Certificate_inlines.hh                  |     63 +
 src/BHRZ03_Certificate_types.hh                    |     22 +
 src/BUGS.cc.dist                                   |     24 +
 src/BUGS.hh.dist                                   |      4 +
 src/Bit_Matrix.cc                                  |    265 +
 src/Bit_Matrix_defs.hh                             |    187 +
 src/Bit_Matrix_inlines.hh                          |    149 +
 src/Bit_Matrix_types.hh                            |     22 +
 src/Bit_Row.cc                                     |    341 +
 src/Bit_Row_defs.hh                                |    214 +
 src/Bit_Row_inlines.hh                             |    236 +
 src/Bit_Row_types.hh                               |     22 +
 src/Boundary_defs.hh                               |    729 +
 src/Box.cc                                         |     63 +
 src/Box_Status_idefs.hh                            |    115 +
 src/Box_Status_inlines.hh                          |    228 +
 src/Box_defs.hh                                    |   2286 +
 src/Box_inlines.hh                                 |    692 +
 src/Box_templates.hh                               |   4295 +
 src/Box_types.hh                                   |     25 +
 src/COPYING.cc.dist                                |    676 +
 src/COPYING.hh.dist                                |      4 +
 src/CO_Tree.cc                                     |   1337 +
 src/CO_Tree_defs.hh                                |   1559 +
 src/CO_Tree_inlines.hh                             |    868 +
 src/CO_Tree_templates.hh                           |    141 +
 src/CO_Tree_types.hh                               |     22 +
 src/CREDITS.cc.dist                                |    445 +
 src/CREDITS.hh.dist                                |      4 +
 src/C_Integer.hh                                   |    217 +
 src/C_Polyhedron.cc                                |    109 +
 src/C_Polyhedron_defs.hh                           |    291 +
 src/C_Polyhedron_inlines.hh                        |    154 +
 src/C_Polyhedron_types.hh                          |     22 +
 src/Cast_Floating_Point_Expression_defs.hh         |    182 +
 src/Cast_Floating_Point_Expression_inlines.hh      |     64 +
 src/Cast_Floating_Point_Expression_templates.hh    |     46 +
 src/Cast_Floating_Point_Expression_types.hh        |     23 +
 src/Checked_Number.cc                              |     92 +
 src/Checked_Number_defs.hh                         |   1068 +
 src/Checked_Number_inlines.hh                      |    848 +
 src/Checked_Number_templates.hh                    |    149 +
 src/Checked_Number_types.hh                        |     27 +
 src/Coefficient.cc                                 |     64 +
 src/Coefficient_defs.hh                            |     61 +
 src/Coefficient_inlines.hh                         |     72 +
 src/Coefficient_traits_template.hh                 |     39 +
 src/Coefficient_types.hh                           |    182 +
 src/Concrete_Expression.cc                         |    122 +
 src/Concrete_Expression_defs.hh                    |    201 +
 src/Concrete_Expression_inlines.hh                 |    123 +
 src/Concrete_Expression_types.hh                   |     98 +
 src/Congruence.cc                                  |    271 +
 src/Congruence_System.cc                           |    471 +
 src/Congruence_System_defs.hh                      |    544 +
 src/Congruence_System_inlines.hh                   |    272 +
 src/Congruence_System_types.hh                     |     22 +
 src/Congruence_defs.hh                             |    506 +
 src/Congruence_inlines.hh                          |    281 +
 src/Congruence_types.hh                            |     22 +
 src/Constant_Floating_Point_Expression_defs.hh     |    173 +
 src/Constant_Floating_Point_Expression_inlines.hh  |     80 +
 src/Constant_Floating_Point_Expression_types.hh    |     23 +
 src/Constraint.cc                                  |    460 +
 src/Constraint_System.cc                           |    381 +
 src/Constraint_System_defs.hh                      |    687 +
 src/Constraint_System_inlines.hh                   |    439 +
 src/Constraint_System_types.hh                     |     23 +
 src/Constraint_defs.hh                             |    836 +
 src/Constraint_inlines.hh                          |    577 +
 src/Constraint_types.hh                            |     22 +
 src/DB_Matrix_defs.hh                              |    325 +
 src/DB_Matrix_inlines.hh                           |    330 +
 src/DB_Matrix_templates.hh                         |    319 +
 src/DB_Matrix_types.hh                             |     23 +
 src/DB_Row_defs.hh                                 |    470 +
 src/DB_Row_inlines.hh                              |    428 +
 src/DB_Row_templates.hh                            |    215 +
 src/DB_Row_types.hh                                |     26 +
 src/Dense_Row.cc                                   |    581 +
 src/Dense_Row_defs.hh                              |    561 +
 src/Dense_Row_inlines.hh                           |    531 +
 src/Dense_Row_templates.hh                         |     56 +
 src/Dense_Row_types.hh                             |     22 +
 src/Determinate_defs.hh                            |    331 +
 src/Determinate_inlines.hh                         |    305 +
 src/Determinate_types.hh                           |     23 +
 src/Difference_Floating_Point_Expression_defs.hh   |    221 +
 ...Difference_Floating_Point_Expression_inlines.hh |     70 +
 ...fference_Floating_Point_Expression_templates.hh |     53 +
 src/Difference_Floating_Point_Expression_types.hh  |     23 +
 src/Division_Floating_Point_Expression_defs.hh     |    237 +
 src/Division_Floating_Point_Expression_inlines.hh  |     69 +
 ...Division_Floating_Point_Expression_templates.hh |     61 +
 src/Division_Floating_Point_Expression_types.hh    |     23 +
 src/Doubly_Linked_Object_defs.hh                   |     65 +
 src/Doubly_Linked_Object_inlines.hh                |     74 +
 src/Doubly_Linked_Object_types.hh                  |     26 +
 src/EList_Iterator_defs.hh                         |     88 +
 src/EList_Iterator_inlines.hh                      |    109 +
 src/EList_Iterator_types.hh                        |     27 +
 src/EList_defs.hh                                  |     90 +
 src/EList_inlines.hh                               |    119 +
 src/EList_types.hh                                 |     27 +
 src/Expression_Adapter_defs.hh                     |    216 +
 src/Expression_Adapter_inlines.hh                  |    229 +
 src/Expression_Adapter_types.hh                    |     28 +
 src/Expression_Hide_Inhomo_defs.hh                 |    147 +
 src/Expression_Hide_Inhomo_inlines.hh              |    218 +
 src/Expression_Hide_Inhomo_types.hh                |     23 +
 src/Expression_Hide_Last_defs.hh                   |    165 +
 src/Expression_Hide_Last_inlines.hh                |    241 +
 src/Expression_Hide_Last_types.hh                  |     23 +
 src/Float.cc                                       |     44 +
 src/Float_defs.hh                                  |    523 +
 src/Float_inlines.hh                               |    536 +
 src/Float_templates.hh                             |    167 +
 src/Floating_Point_Expression_defs.hh              |    212 +
 src/Floating_Point_Expression_inlines.hh           |     55 +
 src/Floating_Point_Expression_templates.hh         |    111 +
 src/Floating_Point_Expression_types.hh             |     23 +
 src/GMP_Integer_defs.hh                            |    134 +
 src/GMP_Integer_inlines.hh                         |    122 +
 src/GMP_Integer_types.hh                           |     45 +
 src/Generator.cc                                   |    496 +
 src/Generator_System.cc                            |    805 +
 src/Generator_System_defs.hh                       |    744 +
 src/Generator_System_inlines.hh                    |    411 +
 src/Generator_System_types.hh                      |     23 +
 src/Generator_defs.hh                              |   1033 +
 src/Generator_inlines.hh                           |    709 +
 src/Generator_types.hh                             |     22 +
 src/Grid_Certificate.cc                            |    108 +
 src/Grid_Certificate_defs.hh                       |    104 +
 src/Grid_Certificate_inlines.hh                    |     61 +
 src/Grid_Certificate_types.hh                      |     22 +
 src/Grid_Generator.cc                              |    479 +
 src/Grid_Generator_System.cc                       |    298 +
 src/Grid_Generator_System_defs.hh                  |    514 +
 src/Grid_Generator_System_inlines.hh               |    279 +
 src/Grid_Generator_System_types.hh                 |     22 +
 src/Grid_Generator_defs.hh                         |    796 +
 src/Grid_Generator_inlines.hh                      |    369 +
 src/Grid_Generator_types.hh                        |     22 +
 src/Grid_Status.cc                                 |    245 +
 src/Grid_Status_idefs.hh                           |    168 +
 src/Grid_Status_inlines.hh                         |    217 +
 src/Grid_chdims.cc                                 |    477 +
 src/Grid_conversion.cc                             |    511 +
 src/Grid_defs.hh                                   |   2665 +
 src/Grid_inlines.hh                                |    383 +
 src/Grid_nonpublic.cc                              |    846 +
 src/Grid_public.cc                                 |   2890 +
 src/Grid_simplify.cc                               |    588 +
 src/Grid_templates.hh                              |    339 +
 src/Grid_types.hh                                  |     22 +
 src/Grid_widenings.cc                              |    493 +
 src/H79_Certificate.cc                             |    118 +
 src/H79_Certificate_defs.hh                        |     98 +
 src/H79_Certificate_inlines.hh                     |     71 +
 src/H79_Certificate_types.hh                       |     22 +
 src/Handler_defs.hh                                |     96 +
 src/Handler_inlines.hh                             |     66 +
 src/Handler_types.hh                               |     35 +
 src/Has_Assign_Or_Swap.hh                          |     54 +
 src/Init.cc                                        |    219 +
 src/Init_defs.hh                                   |    100 +
 src/Init_inlines.hh                                |     48 +
 src/Init_types.hh                                  |     22 +
 src/Integer_Interval.hh                            |     53 +
 src/Interval_Info_defs.hh                          |    285 +
 src/Interval_Info_inlines.hh                       |    116 +
 src/Interval_Info_types.hh                         |     26 +
 src/Interval_defs.hh                               |    763 +
 src/Interval_inlines.hh                            |   1160 +
 src/Interval_templates.hh                          |    402 +
 src/Interval_types.hh                              |     23 +
 src/Linear_Expression.cc                           |    194 +
 src/Linear_Expression_Impl.cc                      |    468 +
 src/Linear_Expression_Impl_defs.hh                 |    906 +
 src/Linear_Expression_Impl_inlines.hh              |    282 +
 src/Linear_Expression_Impl_templates.hh            |   1316 +
 src/Linear_Expression_Impl_types.hh                |     23 +
 src/Linear_Expression_Interface.cc                 |     35 +
 src/Linear_Expression_Interface_defs.hh            |    489 +
 src/Linear_Expression_Interface_types.hh           |     22 +
 src/Linear_Expression_defs.hh                      |    928 +
 src/Linear_Expression_inlines.hh                   |    822 +
 src/Linear_Expression_types.hh                     |     22 +
 src/Linear_Form.cc                                 |     26 +
 src/Linear_Form_defs.hh                            |    499 +
 src/Linear_Form_inlines.hh                         |    252 +
 src/Linear_Form_templates.hh                       |    527 +
 src/Linear_Form_types.hh                           |     23 +
 src/Linear_System_defs.hh                          |    582 +
 src/Linear_System_inlines.hh                       |    698 +
 src/Linear_System_templates.hh                     |    930 +
 src/Linear_System_types.hh                         |     26 +
 src/MIP_Problem.cc                                 |   2739 +
 src/MIP_Problem_defs.hh                            |    975 +
 src/MIP_Problem_inlines.hh                         |    321 +
 src/MIP_Problem_templates.hh                       |    181 +
 src/MIP_Problem_types.hh                           |     33 +
 src/Makefile.am                                    |    699 +
 src/Makefile.in                                    |   1783 +
 src/Matrix_defs.hh                                 |    437 +
 src/Matrix_inlines.hh                              |    200 +
 src/Matrix_templates.hh                            |    202 +
 src/Matrix_types.hh                                |     23 +
 ...ultiplication_Floating_Point_Expression_defs.hh |    251 +
 ...iplication_Floating_Point_Expression_inlines.hh |     71 +
 ...lication_Floating_Point_Expression_templates.hh |    109 +
 ...ltiplication_Floating_Point_Expression_types.hh |     23 +
 src/NNC_Polyhedron.cc                              |     88 +
 src/NNC_Polyhedron_defs.hh                         |    267 +
 src/NNC_Polyhedron_inlines.hh                      |    158 +
 src/NNC_Polyhedron_types.hh                        |     22 +
 src/Numeric_Format_defs.hh                         |     38 +
 src/OR_Matrix_defs.hh                              |    610 +
 src/OR_Matrix_inlines.hh                           |    751 +
 src/OR_Matrix_templates.hh                         |    124 +
 src/OR_Matrix_types.hh                             |     23 +
 src/Octagonal_Shape.cc                             |    104 +
 src/Octagonal_Shape_defs.hh                        |   2324 +
 src/Octagonal_Shape_inlines.hh                     |    892 +
 src/Octagonal_Shape_templates.hh                   |   8115 ++
 src/Octagonal_Shape_types.hh                       |     25 +
 src/Og_Status_idefs.hh                             |    112 +
 src/Og_Status_inlines.hh                           |    225 +
 src/Opposite_Floating_Point_Expression_defs.hh     |    193 +
 src/Opposite_Floating_Point_Expression_inlines.hh  |     79 +
 src/Opposite_Floating_Point_Expression_types.hh    |     23 +
 src/PIP_Problem.cc                                 |    741 +
 src/PIP_Problem_defs.hh                            |    834 +
 src/PIP_Problem_inlines.hh                         |     96 +
 src/PIP_Problem_templates.hh                       |     81 +
 src/PIP_Problem_types.hh                           |     31 +
 src/PIP_Tree.cc                                    |   3809 +
 src/PIP_Tree_defs.hh                               |    836 +
 src/PIP_Tree_inlines.hh                            |    140 +
 src/PIP_Tree_types.hh                              |     26 +
 src/Partial_Function.cc                            |     42 +
 src/Partial_Function_defs.hh                       |     87 +
 src/Partial_Function_inlines.hh                    |     90 +
 src/Partial_Function_types.hh                      |     22 +
 src/Partially_Reduced_Product_defs.hh              |   1689 +
 src/Partially_Reduced_Product_inlines.hh           |    815 +
 src/Partially_Reduced_Product_templates.hh         |    710 +
 src/Partially_Reduced_Product_types.hh             |     38 +
 src/Pending_Element_defs.hh                        |     77 +
 src/Pending_Element_inlines.hh                     |     85 +
 src/Pending_Element_types.hh                       |     31 +
 src/Pending_List_defs.hh                           |     79 +
 src/Pending_List_inlines.hh                        |     82 +
 src/Pending_List_templates.hh                      |     96 +
 src/Pending_List_types.hh                          |     31 +
 src/Ph_Status.cc                                   |    245 +
 src/Ph_Status_idefs.hh                             |    183 +
 src/Ph_Status_inlines.hh                           |    217 +
 src/Pointset_Powerset.cc                           |    344 +
 src/Pointset_Powerset_defs.hh                      |   1449 +
 src/Pointset_Powerset_inlines.hh                   |    320 +
 src/Pointset_Powerset_templates.hh                 |   1610 +
 src/Pointset_Powerset_types.hh                     |     23 +
 src/Poly_Con_Relation.cc                           |     76 +
 src/Poly_Con_Relation_defs.hh                      |    166 +
 src/Poly_Con_Relation_inlines.hh                   |    100 +
 src/Poly_Con_Relation_types.hh                     |     22 +
 src/Poly_Gen_Relation.cc                           |     64 +
 src/Poly_Gen_Relation_defs.hh                      |    139 +
 src/Poly_Gen_Relation_inlines.hh                   |     85 +
 src/Poly_Gen_Relation_types.hh                     |     22 +
 src/Polyhedron_chdims.cc                           |    477 +
 src/Polyhedron_chdims_templates.hh                 |     63 +
 src/Polyhedron_conversion_templates.hh             |    925 +
 src/Polyhedron_defs.hh                             |   2863 +
 src/Polyhedron_inlines.hh                          |    459 +
 src/Polyhedron_minimize_templates.hh               |    437 +
 src/Polyhedron_nonpublic.cc                        |   2597 +
 src/Polyhedron_public.cc                           |   3747 +
 src/Polyhedron_simplify_templates.hh               |    340 +
 src/Polyhedron_templates.hh                        |    579 +
 src/Polyhedron_types.hh                            |     22 +
 src/Polyhedron_widenings.cc                        |    875 +
 src/Powerset_defs.hh                               |    450 +
 src/Powerset_inlines.hh                            |    231 +
 src/Powerset_templates.hh                          |    312 +
 src/Powerset_types.hh                              |     23 +
 src/Ptr_Iterator_defs.hh                           |    172 +
 src/Ptr_Iterator_inlines.hh                        |    189 +
 src/Ptr_Iterator_types.hh                          |     27 +
 src/Rational_Box.hh                                |     39 +
 src/Rational_Interval.hh                           |     54 +
 src/Result_defs.hh                                 |    195 +
 src/Result_inlines.hh                              |    102 +
 src/Rounding_Dir_defs.hh                           |    124 +
 src/Rounding_Dir_inlines.hh                        |    141 +
 src/Scalar_Products.cc                             |    120 +
 src/Scalar_Products_defs.hh                        |    227 +
 src/Scalar_Products_inlines.hh                     |    163 +
 src/Scalar_Products_types.hh                       |     24 +
 src/Slow_Copy.hh                                   |     61 +
 src/Sparse_Row.cc                                  |   1093 +
 src/Sparse_Row_defs.hh                             |    930 +
 src/Sparse_Row_inlines.hh                          |    378 +
 src/Sparse_Row_templates.hh                        |    153 +
 src/Sparse_Row_types.hh                            |     22 +
 src/Sum_Floating_Point_Expression_defs.hh          |    213 +
 src/Sum_Floating_Point_Expression_inlines.hh       |     70 +
 src/Sum_Floating_Point_Expression_templates.hh     |     53 +
 src/Sum_Floating_Point_Expression_types.hh         |     23 +
 src/Swapping_Vector_defs.hh                        |     98 +
 src/Swapping_Vector_inlines.hh                     |    234 +
 src/Swapping_Vector_types.hh                       |     23 +
 src/Temp_defs.hh                                   |    143 +
 src/Temp_inlines.hh                                |     97 +
 src/Temp_templates.hh                              |     34 +
 src/Threshold_Watcher.cc                           |     27 +
 src/Threshold_Watcher_defs.hh                      |     96 +
 src/Threshold_Watcher_inlines.hh                   |     66 +
 src/Threshold_Watcher_templates.hh                 |     72 +
 src/Threshold_Watcher_types.hh                     |     23 +
 src/Time.cc                                        |     32 +
 src/Time_defs.hh                                   |    126 +
 src/Time_inlines.hh                                |    155 +
 src/Time_types.hh                                  |     30 +
 src/Topology_types.hh                              |     29 +
 src/Variable.cc                                    |     53 +
 src/Variable_Floating_Point_Expression_defs.hh     |    187 +
 src/Variable_Floating_Point_Expression_inlines.hh  |     94 +
 src/Variable_Floating_Point_Expression_types.hh    |     23 +
 src/Variable_defs.hh                               |    157 +
 src/Variable_inlines.hh                            |    100 +
 src/Variable_types.hh                              |     22 +
 src/Variables_Set.cc                               |     92 +
 src/Variables_Set_defs.hh                          |    107 +
 src/Variables_Set_inlines.hh                       |     75 +
 src/Variables_Set_types.hh                         |     22 +
 src/WRD_coefficient_types_defs.hh                  |    153 +
 src/WRD_coefficient_types_inlines.hh               |     43 +
 src/Watchdog.cc                                    |    250 +
 src/Watchdog_defs.hh                               |    148 +
 src/Watchdog_inlines.hh                            |    101 +
 src/Watchdog_types.hh                              |     22 +
 src/Weight_Profiler.cc                             |     80 +
 src/Weight_Profiler_defs.hh                        |    154 +
 src/Widening_Function_defs.hh                      |    127 +
 src/Widening_Function_inlines.hh                   |     75 +
 src/Widening_Function_types.hh                     |     26 +
 src/algorithms.hh                                  |     72 +
 src/assert.cc                                      |     52 +
 src/assert.hh                                      |    150 +
 src/assign_or_swap.hh                              |     71 +
 src/c_streambuf.cc                                 |    107 +
 src/c_streambuf_defs.hh                            |    127 +
 src/c_streambuf_inlines.hh                         |     40 +
 src/c_streambuf_types.hh                           |     22 +
 src/checked.cc                                     |    500 +
 src/checked_defs.hh                                |    716 +
 src/checked_ext_inlines.hh                         |    923 +
 src/checked_float_inlines.hh                       |   1234 +
 src/checked_inlines.hh                             |    658 +
 src/checked_int_inlines.hh                         |   1952 +
 src/checked_mpq_inlines.hh                         |    542 +
 src/checked_mpz_inlines.hh                         |    645 +
 src/checked_numeric_limits.hh                      |    167 +
 src/compiler.hh                                    |    224 +
 src/distances_defs.hh                              |     54 +
 src/distances_inlines.hh                           |    113 +
 src/distances_types.hh                             |     29 +
 src/fpu-c99_inlines.hh                             |    100 +
 src/fpu-ia32.cc                                    |     75 +
 src/fpu-ia32_inlines.hh                            |    203 +
 src/fpu-none_inlines.hh                            |     75 +
 src/fpu-sparc_inlines.hh                           |     77 +
 src/fpu_defs.hh                                    |    104 +
 src/fpu_types.hh                                   |     27 +
 src/globals.cc                                     |     59 +
 src/globals_defs.hh                                |    569 +
 src/globals_inlines.hh                             |    190 +
 src/globals_types.hh                               |    214 +
 src/initializer.hh                                 |     62 +
 src/intervals_defs.hh                              |    473 +
 src/iterator_to_const_defs.hh                      |    221 +
 src/iterator_to_const_inlines.hh                   |    202 +
 src/iterator_to_const_types.hh                     |     26 +
 src/linearize.hh                                   |    871 +
 src/math_utilities_defs.hh                         |    110 +
 src/math_utilities_inlines.hh                      |    120 +
 src/max_space_dimension.hh                         |     77 +
 src/meta_programming.hh                            |    341 +
 src/mp_std_bits.cc                                 |     78 +
 src/mp_std_bits_defs.hh                            |    175 +
 src/mp_std_bits_inlines.hh                         |     38 +
 src/namespaces.hh                                  |    184 +
 src/ppl-config.cc.in                               |    734 +
 src/ppl.hh.dist                                    | 107456 ++++++++++++++++++
 src/ppl_header.hh                                  |    121 +
 src/stdiobuf.cc                                    |     84 +
 src/stdiobuf_defs.hh                               |    111 +
 src/stdiobuf_inlines.hh                            |     36 +
 src/stdiobuf_types.hh                              |     22 +
 src/swapping_sort_templates.hh                     |    179 +
 src/termination.cc                                 |    935 +
 src/termination_defs.hh                            |    502 +
 src/termination_templates.hh                       |    552 +
 src/termination_types.hh                           |     22 +
 src/version.cc                                     |    108 +
 src/version.hh.in                                  |     98 +
 src/wrap_assign.hh                                 |    380 +
 src/wrap_string.cc                                 |     95 +
 src/wrap_string.hh                                 |     60 +
 test-driver                                        |    127 +
 tests/BD_Shape/Makefile.am                         |    319 +
 tests/BD_Shape/Makefile.in                         |   1868 +
 tests/BD_Shape/addconstraints1.cc                  |    182 +
 tests/BD_Shape/addspacedims1.cc                    |    334 +
 tests/BD_Shape/affinedimension1.cc                 |    307 +
 tests/BD_Shape/affineimage1.cc                     |    443 +
 tests/BD_Shape/affineimage2.cc                     |    352 +
 tests/BD_Shape/affinepreimage1.cc                  |    455 +
 tests/BD_Shape/ascii_dump_load1.cc                 |    247 +
 tests/BD_Shape/bgp99extrapolation1.cc              |     94 +
 tests/BD_Shape/bhmz05widening1.cc                  |    344 +
 tests/BD_Shape/bhz03widening1.cc                   |     77 +
 tests/BD_Shape/bounded1.cc                         |     97 +
 tests/BD_Shape/boundedaffineimage1.cc              |    488 +
 tests/BD_Shape/boundedaffinepreimage1.cc           |    381 +
 tests/BD_Shape/bounds1.cc                          |    273 +
 tests/BD_Shape/cc76extrapolation1.cc               |    489 +
 tests/BD_Shape/cc76narrowing1.cc                   |    217 +
 tests/BD_Shape/closure1.cc                         |    600 +
 tests/BD_Shape/concatenate1.cc                     |    204 +
 tests/BD_Shape/congruences1.cc                     |    220 +
 tests/BD_Shape/constrains1.cc                      |    229 +
 tests/BD_Shape/constraints1.cc                     |    197 +
 tests/BD_Shape/contains1.cc                        |    203 +
 tests/BD_Shape/containsintegerpoint1.cc            |    138 +
 tests/BD_Shape/difference1.cc                      |    279 +
 tests/BD_Shape/discrete1.cc                        |    215 +
 tests/BD_Shape/disjoint1.cc                        |    193 +
 tests/BD_Shape/dropsomenonintegerpoints1.cc        |    356 +
 tests/BD_Shape/empty1.cc                           |    207 +
 tests/BD_Shape/equality1.cc                        |    132 +
 tests/BD_Shape/expandspacedim1.cc                  |    246 +
 tests/BD_Shape/foldspacedims1.cc                   |    338 +
 tests/BD_Shape/frequency1.cc                       |    279 +
 tests/BD_Shape/frombdshape1.cc                     |    147 +
 tests/BD_Shape/frombox1.cc                         |    375 +
 tests/BD_Shape/fromgensys1.cc                      |    156 +
 tests/BD_Shape/fromgrid1.cc                        |    223 +
 tests/BD_Shape/fromoctagonalshape1.cc              |     81 +
 tests/BD_Shape/frompolyhedron1.cc                  |     65 +
 tests/BD_Shape/fromspacedim1.cc                    |    123 +
 tests/BD_Shape/generalizedaffineimage1.cc          |    591 +
 tests/BD_Shape/generalizedaffineimage2.cc          |    518 +
 tests/BD_Shape/generalizedaffinepreimage1.cc       |    477 +
 tests/BD_Shape/generalizedaffinepreimage2.cc       |    610 +
 tests/BD_Shape/generalizedaffinepreimage3.cc       |    174 +
 tests/BD_Shape/geomcovers1.cc                      |     72 +
 tests/BD_Shape/h79widening1.cc                     |     63 +
 tests/BD_Shape/integerupperboundifexact1.cc        |    388 +
 tests/BD_Shape/intersection1.cc                    |    365 +
 tests/BD_Shape/limitedbhmz05extrapolation1.cc      |    527 +
 tests/BD_Shape/limitedcc76extrapolation1.cc        |    539 +
 tests/BD_Shape/limitedh79extrapolation1.cc         |     71 +
 tests/BD_Shape/mapspacedims1.cc                    |    293 +
 tests/BD_Shape/max_min1.cc                         |    781 +
 tests/BD_Shape/max_min2.cc                         |    440 +
 tests/BD_Shape/maxspacedim1.cc                     |     96 +
 tests/BD_Shape/membytes1.cc                        |    241 +
 tests/BD_Shape/minconstraints1.cc                  |     95 +
 tests/BD_Shape/relations1.cc                       |    471 +
 tests/BD_Shape/relations2.cc                       |    445 +
 tests/BD_Shape/relations3.cc                       |    464 +
 tests/BD_Shape/relations4.cc                       |    436 +
 tests/BD_Shape/removespacedims1.cc                 |    388 +
 tests/BD_Shape/run_tests                           |     54 +
 tests/BD_Shape/simplifyusingcontext1.cc            |    306 +
 tests/BD_Shape/timeelapse1.cc                      |    243 +
 tests/BD_Shape/unconstrain1.cc                     |    251 +
 tests/BD_Shape/universe1.cc                        |     90 +
 tests/BD_Shape/upperbound1.cc                      |    281 +
 tests/BD_Shape/upperboundifexact1.cc               |    376 +
 tests/BD_Shape/wrap1.cc                            |    120 +
 tests/BD_Shape/writebdshape1.cc                    |    127 +
 tests/Box/Makefile.am                              |    330 +
 tests/Box/Makefile.in                              |   1957 +
 tests/Box/addconstraints1.cc                       |    290 +
 tests/Box/addspacedims1.cc                         |    333 +
 tests/Box/affinedimension1.cc                      |    292 +
 tests/Box/affineimage1.cc                          |    429 +
 tests/Box/affinepreimage1.cc                       |    178 +
 tests/Box/ascii_dump_load1.cc                      |    254 +
 tests/Box/bgp99extrapolation1.cc                   |     86 +
 tests/Box/bhz03widening1.cc                        |     79 +
 tests/Box/bounded1.cc                              |     97 +
 tests/Box/boundedaffineimage1.cc                   |    516 +
 tests/Box/boundedaffinepreimage1.cc                |    519 +
 tests/Box/cc76narrowing1.cc                        |    207 +
 tests/Box/cc76widening.cc                          |    120 +
 tests/Box/concatenate1.cc                          |    225 +
 tests/Box/congruences1.cc                          |    378 +
 tests/Box/constrains1.cc                           |    188 +
 tests/Box/constraints1.cc                          |    162 +
 tests/Box/contains1.cc                             |    177 +
 tests/Box/containsintegerpoint1.cc                 |    220 +
 tests/Box/difference1.cc                           |    514 +
 tests/Box/discrete1.cc                             |    204 +
 tests/Box/disjoint1.cc                             |    189 +
 tests/Box/empty1.cc                                |    226 +
 tests/Box/equality1.cc                             |    131 +
 tests/Box/expandspacedim1.cc                       |    232 +
 tests/Box/foldspacedims1.cc                        |    269 +
 tests/Box/frequency1.cc                            |    231 +
 tests/Box/frombdshape1.cc                          |     88 +
 tests/Box/frombox1.cc                              |    161 +
 tests/Box/fromgensys1.cc                           |    182 +
 tests/Box/fromgrid1.cc                             |    512 +
 tests/Box/frompartiallyreducedproduct1.cc          |    137 +
 tests/Box/frompolyhedron1.cc                       |    511 +
 tests/Box/frompolyhedron2.cc                       |    131 +
 tests/Box/fromspacedim1.cc                         |    111 +
 tests/Box/generalizedaffineimage1.cc               |    605 +
 tests/Box/generalizedaffineimage2.cc               |    609 +
 tests/Box/generalizedaffinepreimage1.cc            |    475 +
 tests/Box/geomcovers1.cc                           |     72 +
 tests/Box/intersection1.cc                         |    442 +
 tests/Box/interval1.cc                             |    224 +
 tests/Box/limitedcc76extrapolation1.cc             |    317 +
 tests/Box/mapspacedims1.cc                         |    280 +
 tests/Box/max_min1.cc                              |    762 +
 tests/Box/maxspacedim1.cc                          |     59 +
 tests/Box/membytes1.cc                             |    129 +
 tests/Box/minconstraints1.cc                       |     95 +
 tests/Box/propagateconstraints1.cc                 |    211 +
 tests/Box/propagateconstraints2.cc                 |    454 +
 tests/Box/refinewithcongruence1.cc                 |    197 +
 tests/Box/refinewithcongruences1.cc                |    388 +
 tests/Box/refinewithconstraint1.cc                 |    151 +
 tests/Box/refinewithconstraint2.cc                 |     79 +
 tests/Box/refinewithconstraints1.cc                |    436 +
 tests/Box/refinewithconstraints2.cc                |    447 +
 tests/Box/relations1.cc                            |    465 +
 tests/Box/relations2.cc                            |    442 +
 tests/Box/relations3.cc                            |    402 +
 tests/Box/relations4.cc                            |    487 +
 tests/Box/removespacedims1.cc                      |    356 +
 tests/Box/run_tests                                |     54 +
 tests/Box/simplifyusingcontext1.cc                 |    306 +
 tests/Box/timeelapse1.cc                           |    207 +
 tests/Box/topclosed1.cc                            |    206 +
 tests/Box/unconstrain1.cc                          |    248 +
 tests/Box/universe1.cc                             |     87 +
 tests/Box/upperbound1.cc                           |    251 +
 tests/Box/upperboundifexact1.cc                    |    311 +
 tests/Box/wrap1.cc                                 |    202 +
 tests/Box/writebox1.cc                             |     76 +
 tests/CO_Tree/Makefile.am                          |     78 +
 tests/CO_Tree/Makefile.in                          |   1105 +
 tests/CO_Tree/cotree1.cc                           |   2496 +
 tests/Concrete_Expression/C_Expr.cc                |     32 +
 tests/Concrete_Expression/C_Expr_defs.hh           |    257 +
 tests/Concrete_Expression/C_Expr_inlines.hh        |    187 +
 tests/Concrete_Expression/Makefile.am              |    181 +
 tests/Concrete_Expression/Makefile.in              |   1059 +
 tests/Concrete_Expression/bdshape1.cc              |    335 +
 tests/Concrete_Expression/bdshape2.cc              |    571 +
 tests/Concrete_Expression/digitalfilters1.cc       |   1121 +
 tests/Concrete_Expression/linearform1.cc           |    342 +
 tests/Concrete_Expression/linearize.cc             |    326 +
 tests/Concrete_Expression/octagonalshape1.cc       |    347 +
 tests/Concrete_Expression/octagonalshape2.cc       |    464 +
 tests/Concrete_Expression/polyhedron1.cc           |    278 +
 tests/Concrete_Expression/polyhedron2.cc           |    247 +
 tests/Concrete_Expression/run_tests                |     56 +
 tests/Grid/Makefile.am                             |    310 +
 tests/Grid/Makefile.in                             |   3108 +
 tests/Grid/addcongruence1.cc                       |    129 +
 tests/Grid/addcongruences1.cc                      |    332 +
 tests/Grid/addconstraint1.cc                       |    241 +
 tests/Grid/addconstraints1.cc                      |    347 +
 tests/Grid/addgenerator1.cc                        |    330 +
 tests/Grid/addgenerators1.cc                       |    223 +
 tests/Grid/addspacedims1.cc                        |    532 +
 tests/Grid/affinedim1.cc                           |    322 +
 tests/Grid/affineimage1.cc                         |    390 +
 tests/Grid/affineimage2.cc                         |    398 +
 tests/Grid/affinepreimage1.cc                      |    429 +
 tests/Grid/affinepreimage2.cc                      |    363 +
 tests/Grid/approximatepartition1.cc                |    103 +
 tests/Grid/asciidumpload1.cc                       |    633 +
 tests/Grid/asciidumpload2.cc                       |    495 +
 tests/Grid/asciidumpload3.cc                       |    124 +
 tests/Grid/asciidumpload4.cc                       |    145 +
 tests/Grid/asciidumpload5.cc                       |    155 +
 tests/Grid/asciidumpload6.cc                       |    145 +
 tests/Grid/bhz03widening1.cc                       |    113 +
 tests/Grid/bounded1.cc                             |    392 +
 tests/Grid/boundedaffineimage1.cc                  |    185 +
 tests/Grid/boundedaffinepreimage1.cc               |    185 +
 tests/Grid/bounds1.cc                              |    459 +
 tests/Grid/certificate1.cc                         |    229 +
 tests/Grid/concatenate1.cc                         |    341 +
 tests/Grid/congruence1.cc                          |    459 +
 tests/Grid/congruences1.cc                         |    403 +
 tests/Grid/congruences2.cc                         |    337 +
 tests/Grid/constraints1.cc                         |    354 +
 tests/Grid/contains1.cc                            |    214 +
 tests/Grid/containsintegerpoint1.cc                |    290 +
 tests/Grid/discrete1.cc                            |    342 +
 tests/Grid/disjoint1.cc                            |    255 +
 tests/Grid/dropnonintegerpoints1.cc                |    323 +
 tests/Grid/equals1.cc                              |    286 +
 tests/Grid/expandspacedim1.cc                      |    239 +
 tests/Grid/foldspacedims1.cc                       |    401 +
 tests/Grid/frequency1.cc                           |    349 +
 tests/Grid/frombdshape1.cc                         |     77 +
 tests/Grid/frombox1.cc                             |     77 +
 tests/Grid/fromgrid1.cc                            |    102 +
 tests/Grid/fromoctagonalshape1.cc                  |     77 +
 tests/Grid/frompolyhedron1.cc                      |    343 +
 tests/Grid/generalizedaffineimage1.cc              |    556 +
 tests/Grid/generalizedaffineimage2.cc              |    544 +
 tests/Grid/generalizedaffineimage3.cc              |    377 +
 tests/Grid/generalizedaffinepreimage1.cc           |    540 +
 tests/Grid/generalizedaffinepreimage2.cc           |    321 +
 tests/Grid/generalizedaffinepreimage3.cc           |    462 +
 tests/Grid/generator1.cc                           |    483 +
 tests/Grid/generators1.cc                          |    471 +
 tests/Grid/generators2.cc                          |     56 +
 tests/Grid/grid1.cc                                |    839 +
 tests/Grid/grid2.cc                                |    634 +
 tests/Grid/grid3.cc                                |    275 +
 tests/Grid/griddifference1.cc                      |    350 +
 tests/Grid/intersection1.cc                        |    316 +
 tests/Grid/isempty1.cc                             |    294 +
 tests/Grid/isuniverse1.cc                          |    322 +
 tests/Grid/limitedextrapolation1.cc                |    495 +
 tests/Grid/limitedextrapolation2.cc                |    499 +
 tests/Grid/limitedextrapolation3.cc                |    499 +
 tests/Grid/mapspacedims1.cc                        |    314 +
 tests/Grid/maxmin1.cc                              |    519 +
 tests/Grid/membytes1.cc                            |    277 +
 tests/Grid/mincongruences1.cc                      |    222 +
 tests/Grid/mingenerators1.cc                       |    241 +
 tests/Grid/outputoperator1.cc                      |    141 +
 tests/Grid/outputoperator2.cc                      |    100 +
 tests/Grid/outputoperator3.cc                      |     91 +
 tests/Grid/partition1.cc                           |    101 +
 tests/Grid/powersetdifference1.cc                  |    315 +
 tests/Grid/powersetgeometricallycovers1.cc         |    181 +
 tests/Grid/powersetgeometricallyequals1.cc         |    114 +
 tests/Grid/refinewithcongruences1.cc               |    211 +
 tests/Grid/refinewithconstraints1.cc               |    208 +
 tests/Grid/relations1.cc                           |    367 +
 tests/Grid/relations2.cc                           |    424 +
 tests/Grid/relations3.cc                           |    487 +
 tests/Grid/removespacedims1.cc                     |    350 +
 tests/Grid/removespacedims2.cc                     |    280 +
 tests/Grid/simplifyusingcontext1.cc                |    501 +
 tests/Grid/timeelapse1.cc                          |    341 +
 tests/Grid/topclosed1.cc                           |    337 +
 tests/Grid/topclosure1.cc                          |     94 +
 tests/Grid/unconstrain1.cc                         |    252 +
 tests/Grid/upperbound1.cc                          |    335 +
 tests/Grid/upperbound2.cc                          |    341 +
 tests/Grid/widening1.cc                            |    598 +
 tests/Grid/widening2.cc                            |    486 +
 tests/Grid/widening3.cc                            |    315 +
 tests/Grid/wrap1.cc                                |    564 +
 tests/Grid/writecongruencesystem.cc                |     63 +
 tests/MIP_Problem/Makefile.am                      |     98 +
 tests/MIP_Problem/Makefile.in                      |   1213 +
 tests/MIP_Problem/ascii_dump_load1.cc              |    418 +
 tests/MIP_Problem/exceptions1.cc                   |    508 +
 tests/MIP_Problem/mipproblem1.cc                   |   1696 +
 tests/MIP_Problem/mipproblem2.cc                   |    176 +
 tests/MIP_Problem/mipproblem3.cc                   |    900 +
 tests/MIP_Problem/mipproblem4.cc                   |     55 +
 tests/Makefile.am                                  |     59 +
 tests/Makefile.in                                  |    861 +
 tests/Octagonal_Shape/Makefile.am                  |    319 +
 tests/Octagonal_Shape/Makefile.in                  |   1870 +
 tests/Octagonal_Shape/addspacedims1.cc             |    235 +
 tests/Octagonal_Shape/affinedimension1.cc          |    306 +
 tests/Octagonal_Shape/affineimage1.cc              |    542 +
 tests/Octagonal_Shape/affineimage2.cc              |    554 +
 tests/Octagonal_Shape/affinepreimage1.cc           |    294 +
 tests/Octagonal_Shape/affinepreimage2.cc           |    426 +
 tests/Octagonal_Shape/ascii_dump_load1.cc          |    331 +
 tests/Octagonal_Shape/bhmz05widening1.cc           |    709 +
 tests/Octagonal_Shape/bhz03widening1.cc            |     77 +
 tests/Octagonal_Shape/bounded1.cc                  |    133 +
 tests/Octagonal_Shape/boundedaffineimage1.cc       |    602 +
 tests/Octagonal_Shape/boundedaffinepreimage1.cc    |    573 +
 tests/Octagonal_Shape/bounds1.cc                   |    312 +
 tests/Octagonal_Shape/cc76extrapolation1.cc        |    517 +
 tests/Octagonal_Shape/cc76narrowing1.cc            |    265 +
 tests/Octagonal_Shape/chinainit.cc                 |     76 +
 tests/Octagonal_Shape/concatenate1.cc              |    283 +
 tests/Octagonal_Shape/congruences1.cc              |    200 +
 tests/Octagonal_Shape/constrains1.cc               |    232 +
 tests/Octagonal_Shape/constraints1.cc              |    376 +
 tests/Octagonal_Shape/contains1.cc                 |    373 +
 tests/Octagonal_Shape/containsintegerpoint1.cc     |    199 +
 tests/Octagonal_Shape/difference1.cc               |    258 +
 tests/Octagonal_Shape/discrete1.cc                 |    213 +
 tests/Octagonal_Shape/disjoint1.cc                 |    190 +
 tests/Octagonal_Shape/dropsomenonintegerpoints1.cc |    358 +
 tests/Octagonal_Shape/empty1.cc                    |    131 +
 tests/Octagonal_Shape/expandspacedim1.cc           |    295 +
 tests/Octagonal_Shape/foldspacedims1.cc            |    442 +
 tests/Octagonal_Shape/frequency1.cc                |    361 +
 tests/Octagonal_Shape/frombdshape1.cc              |     55 +
 tests/Octagonal_Shape/frombox1.cc                  |    358 +
 tests/Octagonal_Shape/fromgensys1.cc               |    271 +
 tests/Octagonal_Shape/fromgrid1.cc                 |    202 +
 tests/Octagonal_Shape/fromoctagonalshape1.cc       |    133 +
 tests/Octagonal_Shape/frompolyhedron1.cc           |    245 +
 tests/Octagonal_Shape/fromspacedim1.cc             |    123 +
 tests/Octagonal_Shape/generalizedaffineimage1.cc   |    604 +
 tests/Octagonal_Shape/generalizedaffineimage2.cc   |    357 +
 tests/Octagonal_Shape/generalizedaffineimage3.cc   |    593 +
 tests/Octagonal_Shape/generalizedaffineimage4.cc   |    381 +
 tests/Octagonal_Shape/generalizedaffineimage5.cc   |    344 +
 .../Octagonal_Shape/generalizedaffinepreimage1.cc  |    618 +
 .../Octagonal_Shape/generalizedaffinepreimage2.cc  |    620 +
 .../Octagonal_Shape/generalizedaffinepreimage3.cc  |    618 +
 .../Octagonal_Shape/generalizedaffinepreimage4.cc  |    638 +
 tests/Octagonal_Shape/integerupperboundifexact1.cc |    462 +
 tests/Octagonal_Shape/intersection1.cc             |    309 +
 .../Octagonal_Shape/limitedbhmz05extrapolation1.cc |    340 +
 tests/Octagonal_Shape/limitedcc76extrapolation1.cc |    661 +
 tests/Octagonal_Shape/mapspacedims1.cc             |    255 +
 tests/Octagonal_Shape/max_min1.cc                  |    691 +
 tests/Octagonal_Shape/max_min2.cc                  |    311 +
 tests/Octagonal_Shape/maxspacedim1.cc              |     99 +
 tests/Octagonal_Shape/membytes1.cc                 |    233 +
 tests/Octagonal_Shape/minconstraints1.cc           |    135 +
 tests/Octagonal_Shape/relatwithcons1.cc            |    596 +
 tests/Octagonal_Shape/relatwithcons2.cc            |    477 +
 tests/Octagonal_Shape/relatwithcons3.cc            |    509 +
 tests/Octagonal_Shape/relatwithgen1.cc             |    497 +
 tests/Octagonal_Shape/removespacedims1.cc          |    375 +
 tests/Octagonal_Shape/run_tests                    |     54 +
 tests/Octagonal_Shape/simplifyusingcontext1.cc     |    340 +
 tests/Octagonal_Shape/timeelapse1.cc               |    372 +
 tests/Octagonal_Shape/unconstrain1.cc              |    251 +
 tests/Octagonal_Shape/universe1.cc                 |    112 +
 tests/Octagonal_Shape/upperbound1.cc               |    391 +
 tests/Octagonal_Shape/upperboundifexact1.cc        |    424 +
 tests/Octagonal_Shape/wrap1.cc                     |    406 +
 tests/Octagonal_Shape/writeoctagon1.cc             |    211 +
 tests/PIP_Problem/Makefile.am                      |     94 +
 tests/PIP_Problem/Makefile.in                      |   1214 +
 tests/PIP_Problem/ascii_dump_load1.cc              |    295 +
 tests/PIP_Problem/exceptions1.cc                   |    383 +
 tests/PIP_Problem/pipproblem1.cc                   |    813 +
 tests/PIP_Problem/pipproblem2.cc                   |    349 +
 tests/PIP_Problem/pipproblem3.cc                   |    179 +
 tests/PIP_Problem/weightwatch1.cc                  |    187 +
 tests/Partially_Reduced_Product/Makefile.am        |    228 +
 tests/Partially_Reduced_Product/Makefile.in        |   2234 +
 tests/Partially_Reduced_Product/addcongruences1.cc |    101 +
 tests/Partially_Reduced_Product/affineimage1.cc    |     89 +
 tests/Partially_Reduced_Product/asciidumpload1.cc  |    240 +
 tests/Partially_Reduced_Product/bounded1.cc        |     58 +
 .../boundedaffineimage1.cc                         |    270 +
 tests/Partially_Reduced_Product/bounds1.cc         |    688 +
 tests/Partially_Reduced_Product/concatenate1.cc    |     71 +
 tests/Partially_Reduced_Product/congruences1.cc    |     96 +
 .../congruencesproduct1.cc                         |    281 +
 tests/Partially_Reduced_Product/constraints1.cc    |     99 +
 .../constraintsproduct1.cc                         |    553 +
 tests/Partially_Reduced_Product/contains1.cc       |    103 +
 tests/Partially_Reduced_Product/difference1.cc     |    141 +
 tests/Partially_Reduced_Product/dimension1.cc      |     84 +
 tests/Partially_Reduced_Product/directproduct1.cc  |    117 +
 tests/Partially_Reduced_Product/discrete1.cc       |    101 +
 tests/Partially_Reduced_Product/disjoint1.cc       |    163 +
 .../dropsomenonintegerpoints1.cc                   |    132 +
 tests/Partially_Reduced_Product/equals1.cc         |     83 +
 tests/Partially_Reduced_Product/frombdshape1.cc    |     65 +
 tests/Partially_Reduced_Product/frombox1.cc        |     87 +
 tests/Partially_Reduced_Product/fromgrid1.cc       |     62 +
 .../fromoctagonalshape1.cc                         |     65 +
 tests/Partially_Reduced_Product/frompolyhedron1.cc |    120 +
 tests/Partially_Reduced_Product/fromproduct1.cc    |    179 +
 .../generalizedaffineimage1.cc                     |    262 +
 tests/Partially_Reduced_Product/intersection1.cc   |    125 +
 tests/Partially_Reduced_Product/isempty1.cc        |     95 +
 tests/Partially_Reduced_Product/isuniverse1.cc     |     84 +
 tests/Partially_Reduced_Product/maxmin1.cc         |    249 +
 .../partially_reduced_product_test.hh              |     30 +
 .../refinewithcongruences1.cc                      |    265 +
 .../refinewithconstraints1.cc                      |    342 +
 tests/Partially_Reduced_Product/relations1.cc      |    316 +
 .../shapepreservingproduct1.cc                     |    152 +
 tests/Partially_Reduced_Product/smashproduct1.cc   |    660 +
 tests/Partially_Reduced_Product/spacedims1.cc      |    287 +
 tests/Partially_Reduced_Product/timeelapse1.cc     |    116 +
 tests/Partially_Reduced_Product/topclosed1.cc      |     95 +
 tests/Partially_Reduced_Product/topclosure1.cc     |     68 +
 tests/Partially_Reduced_Product/upperbound1.cc     |    191 +
 tests/Polyhedron/Makefile.am                       |    724 +
 tests/Polyhedron/Makefile.in                       |   6944 ++
 tests/Polyhedron/addcongruence1.cc                 |    234 +
 tests/Polyhedron/addcongruences1.cc                |    251 +
 tests/Polyhedron/addconstraint1.cc                 |    106 +
 tests/Polyhedron/addconstraints1.cc                |    361 +
 tests/Polyhedron/addconstraints2.cc                |     94 +
 tests/Polyhedron/addgenerator1.cc                  |    118 +
 tests/Polyhedron/addgenerator2.cc                  |    130 +
 tests/Polyhedron/addgenerators1.cc                 |    354 +
 tests/Polyhedron/addgenerators2.cc                 |    138 +
 tests/Polyhedron/addspacedims1.cc                  |    202 +
 tests/Polyhedron/addspacedims2.cc                  |    249 +
 tests/Polyhedron/affineimage1.cc                   |    266 +
 tests/Polyhedron/affineimage2.cc                   |     75 +
 tests/Polyhedron/affinepreimage1.cc                |    438 +
 tests/Polyhedron/affinetrans.cc                    |     82 +
 tests/Polyhedron/append1.cc                        |    113 +
 tests/Polyhedron/append2.cc                        |    132 +
 tests/Polyhedron/ascii_dump_load1.cc               |    602 +
 tests/Polyhedron/ascii_dump_load2.cc               |    139 +
 tests/Polyhedron/ascii_dump_load3.cc               |    434 +
 tests/Polyhedron/bgp99extrapolation1.cc            |    160 +
 tests/Polyhedron/bgp99extrapolation2.cc            |    256 +
 tests/Polyhedron/bhrz03widening1.cc                |    755 +
 tests/Polyhedron/bhrz03widening2.cc                |    262 +
 tests/Polyhedron/bhrz03widening3.cc                |    649 +
 tests/Polyhedron/bhz03widening1.cc                 |    724 +
 tests/Polyhedron/bounded1.cc                       |    107 +
 tests/Polyhedron/boundedaffineimage1.cc            |    250 +
 tests/Polyhedron/boundedaffinepreimage1.cc         |    125 +
 tests/Polyhedron/boundedbhrz03extrapolation1.cc    |    153 +
 tests/Polyhedron/boundedh79extrapolation1.cc       |     81 +
 tests/Polyhedron/bounds1.cc                        |     65 +
 tests/Polyhedron/cnncconversion1.cc                |    154 +
 tests/Polyhedron/concatenate1.cc                   |    284 +
 tests/Polyhedron/congruences1.cc                   |    365 +
 tests/Polyhedron/constrains1.cc                    |    233 +
 tests/Polyhedron/constraints1.cc                   |    166 +
 tests/Polyhedron/contains1.cc                      |    115 +
 tests/Polyhedron/contains2.cc                      |    177 +
 tests/Polyhedron/containsintegerpoint1.cc          |    176 +
 tests/Polyhedron/disjoint1.cc                      |    146 +
 tests/Polyhedron/disjoint2.cc                      |    133 +
 tests/Polyhedron/dropsomenonintegerpoints1.cc      |    175 +
 tests/Polyhedron/dropsomenonintegerpoints2.cc      |    196 +
 tests/Polyhedron/dualhypercubes.cc                 |    392 +
 tests/Polyhedron/empty1.cc                         |     51 +
 tests/Polyhedron/equals1.cc                        |     62 +
 tests/Polyhedron/exceptions1.cc                    |   1463 +
 tests/Polyhedron/exceptions2.cc                    |    910 +
 tests/Polyhedron/exceptions3.cc                    |    235 +
 tests/Polyhedron/expandspacedim1.cc                |    269 +
 tests/Polyhedron/expandspacedim2.cc                |    103 +
 tests/Polyhedron/foldspacedims1.cc                 |    337 +
 tests/Polyhedron/foldspacedims2.cc                 |    231 +
 tests/Polyhedron/frequency1.cc                     |    232 +
 tests/Polyhedron/frombdshape1.cc                   |     57 +
 tests/Polyhedron/frombox1.cc                       |    259 +
 tests/Polyhedron/frombox2.cc                       |    112 +
 tests/Polyhedron/fromgrid1.cc                      |    202 +
 tests/Polyhedron/fromoctagonalshape1.cc            |     56 +
 tests/Polyhedron/generalizedaffineimage1.cc        |    269 +
 tests/Polyhedron/generalizedaffineimage2.cc        |    560 +
 tests/Polyhedron/generalizedaffinepreimage1.cc     |    124 +
 tests/Polyhedron/generalizedaffinepreimage2.cc     |     64 +
 tests/Polyhedron/generators1.cc                    |    235 +
 tests/Polyhedron/geomcovers1.cc                    |     61 +
 tests/Polyhedron/h79widening1.cc                   |    246 +
 tests/Polyhedron/h79widening2.cc                   |     64 +
 tests/Polyhedron/hybrid.cc                         |    865 +
 tests/Polyhedron/intersection1.cc                  |    513 +
 tests/Polyhedron/limitedbhrz03extrapolation1.cc    |     68 +
 tests/Polyhedron/limitedh79extrapolation1.cc       |    274 +
 tests/Polyhedron/linearexpression1.cc              |    138 +
 tests/Polyhedron/linearpartition1.cc               |    332 +
 tests/Polyhedron/linearsystem1.cc                  |    109 +
 tests/Polyhedron/mapspacedims1.cc                  |    482 +
 tests/Polyhedron/matrix1.cc                        |    322 +
 tests/Polyhedron/max_min1.cc                       |    205 +
 tests/Polyhedron/maxspacedim1.cc                   |    137 +
 tests/Polyhedron/mc91.cc                           |    118 +
 tests/Polyhedron/membytes1.cc                      |    292 +
 tests/Polyhedron/memory1.cc                        |    220 +
 tests/Polyhedron/memory2.cc                        |    259 +
 tests/Polyhedron/minconstraints1.cc                |     78 +
 tests/Polyhedron/minconstraints2.cc                |     71 +
 tests/Polyhedron/mingenerators1.cc                 |     86 +
 tests/Polyhedron/mingenerators2.cc                 |     49 +
 tests/Polyhedron/nncminimize1.cc                   |    380 +
 tests/Polyhedron/nncminimize2.cc                   |     81 +
 tests/Polyhedron/nncpostimeelapse1.cc              |    432 +
 tests/Polyhedron/numberinput1.cc                   |    354 +
 tests/Polyhedron/onepoint.cc                       |     57 +
 tests/Polyhedron/permute.cc                        |    223 +
 tests/Polyhedron/polydifference1.cc                |    206 +
 tests/Polyhedron/polydifference2.cc                |    176 +
 tests/Polyhedron/polyhull1.cc                      |    400 +
 tests/Polyhedron/polyhull2.cc                      |     59 +
 tests/Polyhedron/polyhullifexact1.cc               |    465 +
 tests/Polyhedron/polyhullifexact2.cc               |    471 +
 tests/Polyhedron/randphull1.cc                     |    201 +
 tests/Polyhedron/refinewithcongruence1.cc          |    106 +
 tests/Polyhedron/refinewithcongruences1.cc         |    337 +
 tests/Polyhedron/refinewithconstraint1.cc          |    109 +
 tests/Polyhedron/refinewithconstraints1.cc         |    323 +
 tests/Polyhedron/relations1.cc                     |    485 +
 tests/Polyhedron/relations2.cc                     |    227 +
 tests/Polyhedron/relations3.cc                     |    317 +
 tests/Polyhedron/removespacedims1.cc               |    299 +
 tests/Polyhedron/removespacedims2.cc               |     99 +
 tests/Polyhedron/simplifyusingcontext1.cc          |    489 +
 tests/Polyhedron/smm1.cc                           |    152 +
 tests/Polyhedron/sparserow1.cc                     |    626 +
 tests/Polyhedron/termination1.cc                   |    536 +
 tests/Polyhedron/termination2.cc                   |    178 +
 tests/Polyhedron/timeelapse1.cc                    |    251 +
 tests/Polyhedron/timeelapse2.cc                    |    133 +
 tests/Polyhedron/topclosed1.cc                     |     96 +
 tests/Polyhedron/topclosure1.cc                    |    161 +
 tests/Polyhedron/unconstrain1.cc                   |    251 +
 tests/Polyhedron/universe1.cc                      |    165 +
 tests/Polyhedron/universe2.cc                      |     80 +
 tests/Polyhedron/variablesset1.cc                  |    160 +
 tests/Polyhedron/watchdog1.cc                      |    141 +
 tests/Polyhedron/weightwatch1.cc                   |    232 +
 tests/Polyhedron/wrap1.cc                          |    626 +
 tests/Polyhedron/wrap2.cc                          |     99 +
 tests/Polyhedron/writeconsys1.cc                   |     83 +
 tests/Polyhedron/writegensys1.cc                   |     90 +
 tests/Polyhedron/writepolyhedron1.cc               |     70 +
 tests/Polyhedron/writepolyhedron2.cc               |     67 +
 tests/Polyhedron/writerelation1.cc                 |    109 +
 tests/Polyhedron/writevariable1.cc                 |    104 +
 tests/Powerset/Makefile.am                         |    192 +
 tests/Powerset/Makefile.in                         |   1932 +
 tests/Powerset/addcongruences1.cc                  |     68 +
 tests/Powerset/addconstraints1.cc                  |     69 +
 tests/Powerset/affinedimension1.cc                 |    139 +
 tests/Powerset/affineimage1.cc                     |    240 +
 tests/Powerset/affinepreimage1.cc                  |    172 +
 tests/Powerset/bounded1.cc                         |     78 +
 tests/Powerset/bounds1.cc                          |     97 +
 tests/Powerset/closed1.cc                          |    100 +
 tests/Powerset/closure1.cc                         |     59 +
 tests/Powerset/collapse1.cc                        |     95 +
 tests/Powerset/concatenate1.cc                     |     75 +
 tests/Powerset/contains1.cc                        |    109 +
 tests/Powerset/containsintegerpoint1.cc            |    132 +
 tests/Powerset/difference1.cc                      |    151 +
 tests/Powerset/discrete1.cc                        |     80 +
 tests/Powerset/disjoint1.cc                        |    117 +
 tests/Powerset/disjunct1.cc                        |    311 +
 tests/Powerset/empty1.cc                           |    142 +
 tests/Powerset/entails1.cc                         |     73 +
 tests/Powerset/equals1.cc                          |     79 +
 tests/Powerset/frombdshape1.cc                     |    425 +
 tests/Powerset/frombox1.cc                         |    421 +
 tests/Powerset/fromcongruences1.cc                 |     78 +
 tests/Powerset/fromconstraints1.cc                 |    182 +
 tests/Powerset/fromgrid1.cc                        |    435 +
 tests/Powerset/fromoctagonalshape1.cc              |    432 +
 tests/Powerset/frompolyhedron1.cc                  |    741 +
 tests/Powerset/fromspacedimension1.cc              |    102 +
 tests/Powerset/intersection1.cc                    |    106 +
 tests/Powerset/maxmin1.cc                          |    400 +
 tests/Powerset/meet1.cc                            |     95 +
 tests/Powerset/membytes1.cc                        |     69 +
 tests/Powerset/powerset1.cc                        |    178 +
 tests/Powerset/reduce1.cc                          |     81 +
 tests/Powerset/refinewith1.cc                      |    225 +
 tests/Powerset/relationwith1.cc                    |    278 +
 tests/Powerset/simplifyusingcontext1.cc            |    459 +
 tests/Powerset/size1.cc                            |     75 +
 tests/Powerset/spacedims1.cc                       |    213 +
 tests/Powerset/universe1.cc                        |    104 +
 tests/Powerset/upperbound1.cc                      |    164 +
 tests/README                                       |    117 +
 tests/Random_Number_Generator_defs.hh              |     47 +
 tests/Random_Number_Generator_inlines.hh           |     92 +
 tests/Random_Number_Generator_types.hh             |     22 +
 tests/Watchdog/Makefile.am                         |     70 +
 tests/Watchdog/Makefile.in                         |   1097 +
 tests/Watchdog/watchdog1.cc                        |     78 +
 tests/files.cc                                     |     51 +
 tests/files.hh                                     |     36 +
 tests/ppl_test.cc                                  |    487 +
 tests/ppl_test.hh                                  |   1159 +
 tests/valgrind_suppressions                        |     18 +
 utils/Makefile.am                                  |     61 +
 utils/Makefile.in                                  |    752 +
 utils/build_header.in                              |    103 +
 utils/cm_cleaner.sh                                |     35 +
 utils/cm_splitter.sh                               |     34 +
 utils/text2cxxarray.in                             |     76 +
 utils/timings.cc                                   |    102 +
 utils/timings.hh                                   |     32 +
 1627 files changed, 833682 insertions(+)

diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..340a7ba
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,22 @@
+
+The PPL developers encourage you to report any bugs you find using the
+bug tracking system available at https://www.cs.unipr.it/mantis/ .
+Here `bug' should be interpreted in its broadest sense: outright
+software errors, misfeatures, bad interfaces, missing or unclear
+documentation... whatever is a subject for possible improvement.
+
+As far as software bugs are concerned, the best reports are those that
+are reproducible.  Including (or pointing us to) code that exhibits
+the reported misbehavior is the best thing you can do to help us fix
+the library.  Of course, this is not always possible and we will
+welcome any kind of bug report.  Anyway, you may be interested to read
+http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report
+bugs effectively.
+
+
+KNOWN BUGS
+==========
+
+All known bugs were resolved before the release.  It is likely that
+there are still bugs in the released version.  Any bugs found after
+the release will be listed at http://bugseng.com/products/ppl/Bugs/ .
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/CREDITS b/CREDITS
new file mode 100644
index 0000000..a0947c9
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,443 @@
+
+Authors
+=======
+
+The Parma Polyhedra Library and its documentation is being designed,
+extended, written, debugged, maintained and improved by the following
+people:
+
+
+Core Development Team:
+----------------------
+
+  Roberto Bagnara       [1] (BUGSENG srl and University of Parma)
+  Patricia M. Hill      [2] (BUGSENG srl and University of Leeds)
+  Enea Zaffanella       [3] (BUGSENG srl and University of Parma)
+  Abramo Bagnara            (BUGSENG srl)
+
+
+Former Members of the Core Development Team:
+--------------------------------------------
+
+  Elisa Ricci           (former student of the University of Parma,
+                        one of the four students with which the PPL
+                        project started) has been a major contributor
+                        to the development of the PPL, up until
+                        December 2002.
+
+
+Current Contributors:
+---------------------
+
+  Massimo Benerecetti   (University of Naples) is working on additional
+                        operators on polyhedra.
+
+  Andrea Cimino         (former student of the University of Parma)
+                        wrote most of the mixed integer programming
+                        solver, and also most of the Java and OCaml
+                        interfaces.  He keeps helping us, especially
+                        with the web site.
+
+  Marco Faella          (University of Naples) is working on additional
+                        operators on polyhedra.
+
+  Stefano Minopoli      (University of Naples) is working on additional
+                        operators on polyhedra.
+
+  Marco Poletti         (student of the University of Bologna)
+                        implemented the sparse matrices that are used
+                        in the MIP and PIP solvers of the PPL; he also
+                        did experiments on the parallelization of the
+                        sparse matrices' computations; he is now working
+                        on improving the PPL's memory footprint and
+                        on other improvements to the library.
+
+  Alessandro Zaccagnini [4] (University of Parma) has helped with
+                        the efficient implementation of GCD and LCM
+                        for checked numbers.  He is now working on the
+                        definitions of interval arithmetic operations.
+                        Alessandro is always a very valuable source of
+                        mathematical advice.
+
+
+Past Contributors:
+------------------
+
+  Roberto Amadini       (former student of the University of Parma)
+                        did some work on the PPL support for the
+                        approximation of floating point computations.
+
+  Irene Bacchi          (former student of the University of Parma) worked
+                        on a development branch where she implemented
+                        several variants of algorithms, checking
+                        whether or not the set-union of two polyhedra
+                        is the same as their poly-hull.
+
+  Fabio Biselli         (student of the University of Parma)
+                        did some work on the PPL support for the
+                        approximation of floating point computations.
+
+  Fabio Bossi           (former student of the University of Parma)
+                        worked on the PPL support for the approximation
+                        of floating point computations.
+
+  Danilo Bonardi        (former student of the University of Parma) worked
+                        on a development branch where he experimented
+                        with the use of metaprogramming techniques
+                        based on expression templates.  The objective
+                        of this work was to check the effectiveness of
+                        these techniques for moving computations from
+                        run-time to compile-time.
+
+  Sara Bonini           (former student of the University of Parma) is
+                        one of the four students with which the PPL
+                        project started.
+
+  Katy Dobson           (former student of the University of Leeds)
+                        worked on the formalization and definition of
+                        algorithms for rational grids and products
+                        of grids and polyhedra.
+
+  Giordano Fracasso     (former student of the University of Parma) wrote
+                        the initial version of the support for native
+                        and checked integer coefficients.
+
+  Francois Galea        [5] (University of Versailles) worked
+                        at the implementation of the Parametric Integer
+                        Programming solver.
+
+  Maximiliano Marchesi  (former student of the University of Parma)
+                        helped a little to improve the documentation for
+                        bounded differences.
+
+  Elena Mazzi           (former student of the University of Parma) worked
+                        on our implementation of bounded differences
+                        and octagons.  She also participated in the
+                        theoretical and practical work concerning
+                        widening operators for weakly relational
+                        domains.
+
+  David Merchat         (formerly at the University of Parma) helped us
+                        with the generation of the library's documentation
+                        using Doxygen.
+
+  Matthew Mundell       [6] (formerly at the University of Leeds) worked
+                        on the implementation of rational grids.  He has
+                        also helped on other implementation issues.
+
+  Andrea Pescetti       (former student of the University of Parma) was one
+                        of the four students with which the PPL
+                        project started.  Later, he helped a little
+                        with the library's documentation.
+
+  Barbara Quartieri     (former student of the University of Parma) worked
+                        on our implementation of bounded differences and
+                        octagons.
+
+  Enric Rodriguez Carbonell [7] (Technical University of Catalonia)
+                        worked at the implementation of polynomial spaces.
+
+  Angela Stazzone       (former student of the University of Parma)
+                        worked on the library's documentation.
+
+  Fabio Trabucchi       (former student of the University of Parma) worked
+                        on a development branch where he added
+                        serializers for all the objects of the PPL.
+                        Support for serialization based on Fabio's
+                        work will be available in a future release of
+                        the library.
+
+  Claudio Trento        (former student of the University of Pisa) did
+                        a small amount of work on an experimental OCaml
+                        interface for the PPL.
+
+  Tatiana Zolo          (former student of the University of Parma) is
+                        one of the four students with which the PPL
+                        project started.
+
+
+
+Thanks!
+=======
+
+
+People:
+-------
+
+  Lucia Alessandrini    (University of Parma) provided 4 hour-long
+                        lectures on convex polyhedra for the Italian
+                        authors.  This was crucial for us to acquire
+                        and/or refresh the notions needed for
+                        developing the PPL library.
+
+
+  Frederic Besson       [8] provided useful comments and observations on
+                        the ideas (about an extrapolation operator for
+                        convex polyhedra) sketched in a paper he
+                        coauthored in 1999.
+
+  Tevfik Bultan         [9] (University of California, Santa Barbara)
+                        suggested us to add support for generalized
+                        affine transfer functions.  Discussions with
+                        Tevfik have been very useful.
+
+  Manuel Carro
+  Jose Morales          [9, 10] members of the CLIP Group [12], helped us
+                        to produce a Ciao Prolog [13] interface for the
+                        library.  The decisive (and memorable) debugging
+                        session took place in Parma in the afternoon of
+                        March 10th, 2003, with the participation of
+                        Jose Manuel Gomez.
+
+  Marco Comini          [14] (University of Udine) allows us to use his
+                        Mac OS X machine to work on portability to
+                        that platform.
+
+  Goran Frehse          [15] (VERIMAG, formerly at Carnegie Mellon University)
+                        provided very useful feedback while he was
+                        developing PHAVer [16].  We are working with
+                        Goran in order to include more polyhedra
+                        simplification facilities in the PPL.
+
+  Denis Gopan           [17] (University of Wisconsin-Madison) helped us
+                        extend the library with the "expand space
+                        dimension" and "fold space dimensions"
+                        operations of the library.
+
+  Martin Guy            [18] gave us access to his ARM machine: without
+                        this possibility, porting the PPL to the ARM's
+                        ABIs would have taken ages.
+
+  Bruno Haible          [19] (ILOG) helped us in our first steps towards
+                        using versions of the GMP library installed in
+                        nonstandard places.
+
+  Bertrand Jeannet      [20] (IRISA) wrote the New Polka library [21]
+                        and made it available.  We had several
+                        interesting exchanges with Bertrand concerning
+                        various aspects of polyhedra manipulation.
+
+  Herve Le Verge        (r.i.p.) wrote and published an implementation
+                        [22] of the Chernikova's algorithm [23] that
+                        has set the stage for subsequent
+                        implementation work, including our own.
+
+  Francesco Logozzo     [24] (formerly at Ecole Polytechnique) helped us
+                        straighten out some portability issues on Cygwin.
+
+  Kenneth MacKenzie     [25] provided very good bug reports that allowed
+                        us to fix several problems in the OCaml interface.
+
+  Costantino Medori     [26] (University of Parma) helped us on some
+                        mathematical aspects of the development.
+
+  Fred Mesnard          [27] (University of La Reunion), the main author
+                        of cTI [28], has worked with us on one of the
+                        first applications of the PPL: the "cTI"
+                        data-flow analyzer, which performs a linear
+                        size relation analysis using a domain of
+                        convex polyhedra.  The China data-flow
+                        analyzer [29] uses the Parma Polyhedra Library
+                        to perform the same analysis.  We have been
+                        running China against an old version of cTI
+                        that did not use the PPL, using it to
+                        analyze the same Prolog programs.  Since these
+                        systems did not share a single line of code,
+                        this gave us excellent opportunities for our
+                        initial testing and debugging work.  Fred has
+                        also helped us to port the PPL to Mac OS X.
+
+  Ken Mixter            (then at Carnegie Mellon University) provided
+                        useful feedback while working on an
+                        experimental version of the Action Language
+                        Verifier [30] based on the PPL.
+
+  Sebastian Pop         [31] (now at AMD).  During his work on interfacing
+                        CLooG [32] with the PPL, Sebastian provided
+                        valuable feedback, particularly on the C
+                        interface to the PPL.  He also suggested the
+                        addition of new functionality such as the
+                        "simplify using context" operation.
+
+  Thomas Reps           [33] (University of Wisconsin-Madison), on several
+                        occasions we have had interesting discussions
+                        with him both on the PPL and on the more
+                        general topics of static analysis and
+                        numerical abstractions.
+
+  Mooly Sagiv           [34] (Tel-Aviv University) stimulated the development
+                        of the PPL by providing, in particular,
+                        interesting challenges related to precision
+                        and scalability.
+
+  Sriram Sankaranarayanan [35] (NEC Laboratories America, formerly at
+                        Stanford University) provided very useful feedback
+                        while developing StInG [36] and LPInv [37].
+
+  Axel Simon            [38] (ENS, formerly at the University of Kent
+                        at Canterbury) wrote some PPL 0.9
+                        bindings [44] for the Glasgow Haskell Compiler.
+
+  Fausto Spoto          [39] (University of Verona) did useful beta testing
+                        for the Java interface.  He also suggested the
+                        addition of the <EM>hash code</EM> operations.
+
+  Basile Starynkevitch  [40] (CEA LIST/DTSI/SOL). Basile is the author
+                        of MELT [41] and suggested several improvements
+                        to the PPL.
+
+
+  Pedro Vasconcelos     [42] (formerly at the University of St Andrews, UK)
+                        provided useful feedback while developing his
+                        size and cost analyzer for Core Hume [43].
+                        Pedro also solved a problem of Axel Simon's
+                        PPL 0.9 bindings for the GHC and makes them
+                        publicly available [44].
+
+  Ralf Wildenhues       [45] (University of Bonn) helped us with
+                        several issues concerning the proper use of
+                        the Autotools.
+
+
+Organizations (and People Therein):
+-----------------------------------
+
+We are grateful for the following contributions:
+
+- AMD Developer Central [46] has donated a bi-quad core machine with
+  the latest AMD Opteron 2384 "Shanghai" processors and 16GB of RAM.
+  This machine now hosts all the PPL data and services.  Many thanks
+  to Christophe Harle and Sebastian Pop.
+
+- The Computing Center of the University of Parma [47] allowed us to
+  test the portability of the library on a variety of platforms.
+  Fausto Pagani was especially helpful in this respect.
+
+- The GCC Compile Farm Project [48] managed by FSF France provided
+  access to a number of machines that allowed us to test and improve
+  the portability of the library.  Special thanks go to Laurent Guerby
+  for his kind assistance.
+
+- The test cluster provided by Hewlett Packard and  hosted by ESIEE [49]
+  allowed us to complete the porting of the PPL to the IA64 and PA-RISC
+  architectures.  Many thanks to Thibaut Varene [50] and the PA-RISC
+  Linux community [51] for their kind assistance.
+
+- HiPEAC [52] sponsored the participation of Roberto Bagnara to the
+  Graphite Workshop [53].  This was very helpful to discuss the needs
+  of Graphite [54] (a framework for high-level loop optimizations on
+  the polyhedral model) and, more generally, of GCC [55] in terms of
+  numerical abstractions and how the PPL can help.  Special thanks go
+  to Albert Cohen [57] for this sponsorship.
+
+- INRIA [56] supported the work of Abramo Bagnara from January 1st to
+  May 31st, 2009, to work on the PPL and its development
+  infrastructure.  Many thanks go, in particular, to Albert Cohen [57].
+
+
+Some of our research work has been partly supported by the following
+projects and organizations:
+
+- University of Parma's FIL scientific research project (ex 60%)
+  ``Pure and Applied Mathematics'';
+
+- MURST project ``Automatic Program Certification by Abstract
+  Interpretation'' [58];
+
+- MURST project ``Abstract Interpretation, Type Systems and Control-Flow
+  Analysis'';
+
+- MURST project ``Automatic Aggregate- and Number-Reasoning for Computing:
+  from Decision Algorithms to Constraint Programming with Multisets, Sets,
+  and Maps'' [59];
+
+- MURST project ``Constraint Based Verification of Reactive Systems'' [60];
+
+- MURST project ``AIDA - Abstract Interpretation: Design and
+  Applications'' [61];
+
+- PRIN project ``AIDA 2007 - Abstract Interpretation: Design and
+  Applications'' [62];
+
+- Integrated Action Italy-Spain 2001-2002 ``Advanced Development Environments
+  for Logic Programs'' [63];
+
+- Royal Society Joint project 2004/R1-EU (UK-Italy)
+  ``Automatic Detection of Unstable Numerical Computations'';
+
+- EPSRC (UK) project EP/C520726/1
+  ``Numerical Domains for Software Analysis'' [64];
+
+- Royal Society International Outgoing Short Visit 2007/R4
+  ``Finding and Verifying the Absence of Bugs in Imperative Programs'' [65];
+
+- EPSRC (UK) project EP/G025177/1
+  ``Geometric Abstractions for Scalable Program Analyzers'' [65].
+
+--------
+
+ [1] http://www.cs.unipr.it/~bagnara/
+ [2] http://www.comp.leeds.ac.uk/hill/
+ [3] http://www.cs.unipr.it/~zaffanella/
+ [4] http://www.math.unipr.it/~zaccagni/
+ [5] http://fgalea.free.fr/
+ [6] http://www.mundell.ukfsn.org/
+ [7] http://www.lsi.upc.edu/~erodri/
+ [8] http://www.irisa.fr/lande/fbesson/fbesson.html
+ [9] http://www.cs.ucsb.edu/~bultan/
+[10] http://www.clip.dia.fi.upm.es/~boris/
+[11] http://clip.dia.fi.upm.es/~jfran/
+[12] http://clip.dia.fi.upm.es/
+[13] http://clip.dia.fi.upm.es/Software/Ciao/
+[14] http://www.dimi.uniud.it/~comini/
+[15] http://www-verimag.imag.fr/~frehse/
+[16] http://www-verimag.imag.fr/~frehse/phaver_web/
+[17] http://www.cs.wisc.edu/~gopan/
+[18] http://martinwguy.co.uk/
+[19] http://www.haible.de/bruno/
+[20] http://www.irisa.fr/prive/Bertrand.Jeannet/
+[21] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html
+[22] http://bugseng.com/products/ppl/documentation/chernikova.c
+[23] http://bugseng.com/products/ppl/documentation/bibliography#LeVerge92
+[24] http://research.microsoft.com/~logozzo/
+[25] http://homepages.inf.ed.ac.uk/kwxm/
+[26] http://www.math.unipr.it/~medori/
+[27] http://www.univ-reunion.fr/~fred/
+[28] http://www.cs.unipr.it/cTI/
+[29] http://www.cs.unipr.it/China/
+[30] http://www.cs.ucsb.edu/~bultan/composite/
+[31] http://www-rocq.inria.fr/~pop/
+[32] http://www.cloog.org/
+[33] http://www.cs.wisc.edu/~reps/
+[34] http://www.math.tau.ac.il/~msagiv/
+[35] http://www.nec-labs.com/~srirams/
+[36] http://theory.stanford.edu/~srirams/Software/sting.html
+[37] http://theory.stanford.edu/~srirams/Software/lpinv.html
+[38] http://www.di.ens.fr/~simona/
+[39] http://profs.sci.univr.it/~spoto/
+[40] http://www.starynkevitch.net/Basile/index_en.html
+[41] http://gcc.gnu.org/wiki/MiddleEndLispTranslator
+[42] http://www.ncc.up.pt/~pbv/
+[43] http://www.ncc.up.pt/~pbv/cgi/cost.cgi
+[44] http://www.ncc.up.pt/~pbv/research/ppl/ghc.html
+[45] http://wissrech.ins.uni-bonn.de/people/wildenhues.html
+[46] http://developer.amd.com/
+[47] http://www.siti.unipr.it/
+[48] http://gcc.gnu.org/wiki/CompileFarm
+[49] http://www.esiee.fr/
+[50] http://www.parisc-linux.org/~varenet/
+[51] http://www.parisc-linux.org/
+[52] http://www.hipeac.net/
+[53] http://gcc.gnu.org/wiki/Graphite_Workshop_Nov08
+[54] http://gcc.gnu.org/wiki/Graphite
+[55] http://gcc.gnu.org/
+[56] http://www.inria.fr/
+[57] http://www-rocq.inria.fr/~acohen/
+[58] http://theory.sci.univr.it/p40/
+[59] http://www.cs.unipr.it/Projects/COFIN01
+[60] http://www.disi.unige.it/person/DelzannoG/cover/
+[61] http://www.cs.unipr.it/Projects/AIDA/
+[62] http://www.cs.unipr.it/Projects/AIDA2007/
+[63] http://www.cs.unipr.it/Projects/AzInt2001-2002Sp
+[64] http://www.comp.leeds.ac.uk/hill/chiara/WWW/linda.html
+[65] http://www.comp.leeds.ac.uk/hill/chiara/WWW/projects.html
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..ee8e117
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,25507 @@
+2013-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* PPL 1.1 released.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/devref-language-interface.doxyconf.in,
+	doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+	doc/user.doxyconf-latex.in: Updated.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* src/globals_defs.hh: Worked around a Doxygen bug.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* NEWS: Updated.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* ChangeLog: Updated.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/definitions.dox: Label updated.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/definitions.dox, doc/ppl.bib: BenerecettiFM13 has been
+	published.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_pips/ppl_pips.1, doc/ppl-config.1: Updated.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* tests/Polyhedron/Makefile.am, tests/Polyhedron/{postimeelapse1.cc
+	=> nncpostimeelapse1.cc}: Test renamed.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* tests/Polyhedron/postimeelapse1.cc: Improved.
+
+2013-10-28  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-10-27  Patricia Hill <patricia.hill at bugseng.com>
+
+	*
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Fixed a bug.
+
+2013-10-27  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: A couple of corrections.
+
+2013-10-27  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Java/tests/Test_Executor.java: Punctuation.
+
+2013-10-27  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4: 
+	Corrected.
+
+2013-09-24  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/definitions.dox,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	src/C_Polyhedron.cc, src/C_Polyhedron_defs.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron_defs.hh,
+	src/NNC_Polyhedron_inlines.hh, src/Polyhedron_defs.hh,
+	src/Polyhedron_nonpublic.cc: Interfaced
+	Polyhedron::positive_time_elapse_assign().  Various other
+	improvements.
+
+2013-09-14  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* src/Polyhedron_defs.hh: Missing comment added.
+
+2013-09-14  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* src/Polyhedron_nonpublic.cc: Commented-out code removed.
+
+2013-09-14  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-09-14  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* : commit 7e6ceed614822e32ec6c9286ea95d2c553cf005b Author: Roberto
+	Bagnara <roberto.bagnara at bugseng.com> Date:   Tue Sep 10 10:21:00
+	2013 +0200
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* Makefile.am: Path fixed.
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* demos/ppl_lpsol/Makefile.am, interfaces/C/tests/Makefile.am: Give
+	up on -Werror: it increasingly causes problems.  (Thanks to Stephen
+	Montgomery-Smith.)
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* Makefile.am: Directory fixed.
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* NEWS: Mention recently fixed Java interface bug.  The bug was observed by Gianluca Amato when working (in Java) using
+	a 32 bit build of the PPL.  Fixed in commit
+	30478fbeb75f3e675ec0b3eff32f0a8dd7991f7a
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc: Initialize custom_compare_ext
+	field in structure custom_operations.
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* tests/Grid/Makefile.am, tests/Grid/asciidumpload2.cc: Do not clean
+	inexistent dat file.  Be consistent in naming dat files in Grid's
+	ascii_dump/load tests.
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common_inlines.hh: Convert C++ Variable
+	id's to jlong before passing them to Java methods.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/GNU/gprolog_efli.cc: Adapted to recent versions
+	of GNU Prolog so as to work on 64-bit machines.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Use the serial test harness in
+	these directories.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Automake `subdir-objects' option
+	is not for us.
+
+2013-06-23  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* compile, config.guess, config.sub, depcomp, missing: Updated.
+
+2013-06-23  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* test-driver: Put under Git control.
+
+2013-06-23  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Use the `subdir-objects' Automake
+	option.
+
+2013-05-26  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/tests/C_Polyhedron_test1.java: Fixed typo in the
+	Java interface for method `frequency' and added testcase.  Bug
+	reported by Gianluca Amato.
+
+2013-05-16  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* src/Polyhedron_conversion_templates.hh: The documentation details
+	of the Polyhedron::conversion() static method are not meant for the
+	user manual.
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* Makefile.am: Path fixed.
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* demos/ppl_lpsol/Makefile.am, interfaces/C/tests/Makefile.am: Give
+	up on -Werror: it increasingly causes problems.  (Thanks to Stephen
+	Montgomery-Smith.)
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* Makefile.am: Directory fixed.
+
+2013-09-10  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* NEWS: Mention recently fixed Java interface bug.  The bug was observed by Gianluca Amato when working (in Java) using
+	a 32 bit build of the PPL.  Fixed in commit
+	30478fbeb75f3e675ec0b3eff32f0a8dd7991f7a
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc: Initialize custom_compare_ext
+	field in structure custom_operations.
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* tests/Grid/Makefile.am, tests/Grid/asciidumpload2.cc: Do not clean
+	inexistent dat file.  Be consistent in naming dat files in Grid's
+	ascii_dump/load tests.
+
+2013-09-09  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common_inlines.hh: Convert C++ Variable
+	id's to jlong before passing them to Java methods.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/GNU/gprolog_efli.cc: Adapted to recent versions
+	of GNU Prolog so as to work on 64-bit machines.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Use the serial test harness in
+	these directories.
+
+2013-07-03  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Automake `subdir-objects' option
+	is not for us.
+
+2013-06-23  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* compile, config.guess, config.sub, depcomp, missing: Updated.
+
+2013-06-23  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* test-driver: Put under Git control.
+
+2013-06-23  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Use the `subdir-objects' Automake
+	option.
+
+2013-05-26  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/tests/C_Polyhedron_test1.java: Fixed typo in the
+	Java interface for method `frequency' and added testcase.  Bug
+	reported by Gianluca Amato.
+
+2013-05-16  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* src/Polyhedron_conversion_templates.hh: The documentation details
+	of the Polyhedron::conversion() static method are not meant for the
+	user manual.
+
+2013-05-15  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* : commit b06285533ca60251c4132d1c388c64bdcbea62aa Author: Roberto
+	Bagnara <roberto.bagnara at bugseng.com> Date:   Wed May 15 21:42:21
+	2013 +0200
+
+2013-05-15  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-05-15  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* demos/ppl_lpsol/examples/blend.mps,
+	demos/ppl_lpsol/examples/sample.mps: Converted to free MPS format.
+
+2013-05-13  Marco Faella <marfaella at gmail.com>
+
+	* CREDITS, doc/definitions.dox, doc/ppl.bib, doc/ppl_citations.bib,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/postimeelapse1.cc: 
+	Added test cases for the positive time elapse operator.  Modified
+	the user manual and the credits in order to acknowledge the new
+	function and its authors, respectively.
+
+2013-05-11  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/devref-language-interface.tex, doc/devref.tex,
+	doc/user-language-interface.tex, doc/user.tex: Apparently, some
+	versions of Doxygen require this line.  (Thanks to Matthias Klose.)
+
+2013-04-21  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* src/Dense_Row_defs.hh: Trailing white space removed.
+
+2013-04-04  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* NEWS: Updated.
+
+2013-04-04  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2013-04-04  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/ppl_citations.bib: Fixed capitalization.
+
+2013-04-04  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem_defs.hh,
+	tests/MIP_Problem/mipproblem4.cc: Added a testcase showing an issue
+	in method MIP_Problem::OK().  The method checks for too strong
+	(i.e., invlaid) invariants in the case of a MIP_Problem subject to
+	space dimnesion additions.  Modified method OK() to check those
+	invariants on the "internal" space dimension, rather the external
+	one.  While at it, modified private method
+	MIP_Problem::process_pending_constraints() to avoid returning a bool
+	value (which is never checked).
+
+2013-03-03  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* src/Partially_Reduced_Product_inlines.hh: Fixed constructor from a
+	different partially reduced product element.
+
+2013-03-03  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* src/Bit_Matrix.cc: Fix indentation.
+
+2013-03-03  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* tests/Box/refinewithcongruences1.cc: Activate a couple of tests
+	that were ignored.
+
+2013-02-27  Enea Zaffanella <enea.zaffanella at bugseng.com>
+
+	* README, STANDARDS, doc/devref.doxyconf-html.in,
+	doc/devref.doxyconf-latex.in, src/Any_Pointset_defs.hh,
+	tests/Concrete_Expression/C_Expr_defs.hh: Complete application of
+	systematic file header renaming.
+
+2013-01-30  Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+	* src/Float_defs.hh: Added missing line.
+
+2013-01-21  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/ppl_citations.bib: Obsolete link updated.
+
+2013-01-17  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* : commit fba4b31ebf3179be4fa020f5278d67728b192c8e Author: Roberto
+	Bagnara <roberto.bagnara at bugseng.com> Date:   Thu Jan 17 08:59:34
+	2013 +0100
+
+2013-01-15  Marco Faella <marfaella at gmail.com>
+
+	* : commit a357bc4aefebd03e72ed131a086f966cf7cb65f5 Author: Marco
+	Faella <marfaella at gmail.com> Date:   Tue Jan 15 14:34:06 2013 +0100
+
+2013-01-14  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: 
+	Const-qualify immutable objects.  Detected by ECLAIR service
+	cnstpnte.
+
+2013-01-14  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* doc/ppl.bib: Links updated.
+
+2013-01-09  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc: Const-qualify immutable
+	objects.  Detected by ECLAIR service cnstpnte.
+
+2013-01-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4: Const-qualify
+	immutable objects.  Detected by ECLAIR service cnstpnte.
+
+2013-01-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box_templates.hh, src/CO_Tree.cc,
+	src/Linear_System_inlines.hh, src/MIP_Problem.cc,
+	src/OR_Matrix_inlines.hh, src/Polyhedron_inlines.hh,
+	src/c_streambuf.cc: Const-qualify immutable objects.  Detected by
+	ECLAIR service cnstpnte.
+
+2013-01-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator_defs.hh: Missing comments added.
+
+2013-01-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2013-01-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/vocabulary: Typo fixed.  (Thanks to Chia-Hsun Cheng and
+	Marco Bodrato.)
+
+2013-01-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree_inlines.hh, src/Constraint.cc,
+	src/Linear_Expression_Impl_templates.hh: Const-qualify immutable
+	objects.  Detected by ECLAIR service cnstpnte.
+
+2013-01-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.cc, src/mp_std_bits_defs.hh: Typo fixed.  (Thanks
+	to Chia-Hsun Cheng and Marco Bodrato.)
+
+2013-01-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Dense_Row.cc, src/Determinate_inlines.hh,
+	src/Grid_Generator.cc, src/Grid_public.cc, src/Interval_inlines.hh,
+	src/Linear_Expression_Impl_templates.hh,
+	src/Linear_System_inlines.hh, src/Linear_System_templates.hh,
+	src/MIP_Problem.cc, src/MIP_Problem_inlines.hh,
+	src/OR_Matrix_inlines.hh, src/PIP_Problem.cc, src/PIP_Tree.cc,
+	src/Partial_Function_inlines.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset_templates.hh, src/Polyhedron_chdims.cc,
+	src/Polyhedron_conversion_templates.hh, src/Polyhedron_inlines.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Polyhedron_simplify_templates.hh, src/Polyhedron_widenings.cc,
+	src/Result_inlines.hh, src/Rounding_Dir_inlines.hh,
+	src/Temp_inlines.hh, src/Variable.cc, src/Variables_Set.cc,
+	src/Watchdog.cc, src/c_streambuf.cc, src/checked.cc,
+	src/checked_float_inlines.hh, src/checked_int_inlines.hh,
+	src/checked_mpz_inlines.hh, src/fpu-c99_inlines.hh,
+	src/globals_inlines.hh, src/stdiobuf.cc, src/termination.cc,
+	src/wrap_assign.hh: Const-qualify immutable objects.  Detected by
+	ECLAIR service cnstpnte.
+
+2013-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc, src/Boundary_defs.hh,
+	src/C_Polyhedron.cc, src/Congruence_System.cc,
+	src/Congruence_inlines.hh, src/Constraint_System.cc,
+	src/Dense_Row.cc, src/Float_inlines.hh, src/Generator.cc,
+	src/Generator_System.cc, src/Grid_Certificate.cc,
+	src/Grid_Generator.cc, src/Grid_Generator_System.cc,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/Interval_defs.hh, src/Interval_inlines.hh,
+	src/Linear_Expression_Impl_inlines.hh,
+	src/Linear_Expression_Impl_templates.hh,
+	src/Linear_System_inlines.hh, src/Linear_System_templates.hh: 
+	Const-qualify immutable objects.  Detected by ECLAIR service
+	cnstpnte.
+
+2013-01-01  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+	src/Bit_Row.cc, src/Bit_Row_inlines.hh, src/Boundary_defs.hh,
+	src/Box_templates.hh, src/CO_Tree.cc, src/CO_Tree_inlines.hh,
+	src/CO_Tree_templates.hh, src/Concrete_Expression_inlines.hh,
+	src/Congruence.cc, src/Congruence_System.cc, utils/timings.cc: 
+	Const-qualify immutable objects.  Detected by ECLAIR service
+	cnstpnte.
+
+2013-01-01  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* Makefile.am, NEWS, README, README.alpha, README.arm,
+	README.configure, README.solaris, STANDARDS, configure.ac,
+	debian/libppl-pwl.copyright.in, debian/libppl.copyright.in,
+	demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+	demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lcdd/ppl_lcdd.1,
+	demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+	demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+	demos/ppl_lpsol/examples/Makefile.am, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+	demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+	demos/ppl_pips/ppl_pips_extra_man_text,
+	devtools/bump_copyright_years, devtools/generate_dox_biblio,
+	devtools/generate_man_pages, devtools/print_nonascii_lines,
+	devtools/update_ChangeLog, doc/Makefile.am, doc/README.doc,
+	doc/definitions.dox, doc/devref-language-interface.tex,
+	doc/devref.tex, doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+	doc/ppl-config_extra_man_text, doc/ppl.bib, doc/ppl.sty,
+	doc/ppl_citations.bib, doc/user-language-interface.tex,
+	doc/user.tex, fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh,
+	instchk.hh, interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common_defs.hh,
+	interfaces/C/ppl_c_implementation_common_inlines.hh,
+	interfaces/C/ppl_c_version.h.in,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/C/ppl_interface_generator_c_h.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+	interfaces/C/tests/ppl_c_test.h,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h,
+	interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/Makefile.am, interfaces/Java/README.java,
+	interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common_defs.hh,
+	interfaces/Java/jni/ppl_java_common_inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+	ow.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+	entation.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+	a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+	interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+	java,
+	interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	, interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java,
+	interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+	va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Name.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Value.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Pair.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java,
+	interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/Custom_Variable_Stringifier.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/PPL_Test.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java,
+	interfaces/Java/tests/Variable_Output_test1.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Java/tests/ppl_java_tests_common,
+	interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/README.ocaml,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4, interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common_defs.hh,
+	interfaces/OCaml/ppl_ocaml_common_inlines.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/Ciao/README.ciao,
+	interfaces/Prolog/Ciao/ciao_cfli.hh,
+	interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/Ciao/ciao_efli.hh,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+	d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/GNU/README.gprolog,
+	interfaces/Prolog/GNU/gnu_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	interfaces/Prolog/GNU/gp_clpq.pl,
+	interfaces/Prolog/GNU/gprolog_cfli.hh,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.hh,
+	interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/Prolog_configured_interface.dox,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/Prolog_interface_compilation.dox,
+	interfaces/Prolog/Prolog_interface_sysdep.dox,
+	interfaces/Prolog/Prolog_interface_sysindep.dox,
+	interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	interfaces/Prolog/SICStus/sicstus_cfli.h,
+	interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	interfaces/Prolog/SICStus/sicstus_efli.cc,
+	interfaces/Prolog/SICStus/sicstus_efli.hh,
+	interfaces/Prolog/SICStus/sp_clpq.pl,
+	interfaces/Prolog/SICStus/sp_pl_check.pl,
+	interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/SWI/README.swiprolog,
+	interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+	interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	interfaces/Prolog/SWI/ppl_pl.cc,
+	interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	interfaces/Prolog/SWI/swi_cfli.hh,
+	interfaces/Prolog/SWI/swi_efli.cc,
+	interfaces/Prolog/SWI/swi_efli.hh,
+	interfaces/Prolog/SWI/swi_pl_check.pl,
+	interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+	test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/XSB/xsb_cfli.hh,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/XSB/xsb_efli.hh,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/YAP/README.yap,
+	interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/YAP/ppl_yap.pl,
+	interfaces/Prolog/YAP/yap_cfli.hh,
+	interfaces/Prolog/YAP/yap_clpq.pl,
+	interfaces/Prolog/YAP/yap_clpq2.pl,
+	interfaces/Prolog/YAP/yap_efli.cc,
+	interfaces/Prolog/YAP/yap_efli.hh,
+	interfaces/Prolog/YAP/yap_pl_check.pl,
+	interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common_defs.hh,
+	interfaces/Prolog/ppl_prolog_common_inlines.hh,
+	interfaces/Prolog/tests/Makefile.am,
+	interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+	interfaces/Prolog/tests/expected_clpq2_int16,
+	interfaces/Prolog/tests/expected_clpq2_int16_a,
+	interfaces/Prolog/tests/expected_clpq2_int32,
+	interfaces/Prolog/tests/expected_clpq2_int32_a,
+	interfaces/Prolog/tests/expected_clpq2_int64,
+	interfaces/Prolog/tests/expected_clpq2_int64_a,
+	interfaces/Prolog/tests/expected_clpq2_int8,
+	interfaces/Prolog/tests/expected_clpq2_int8_a,
+	interfaces/Prolog/tests/expected_clpq2_mpz,
+	interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	interfaces/Prolog/tests/expected_clpq_int16,
+	interfaces/Prolog/tests/expected_clpq_int16_a,
+	interfaces/Prolog/tests/expected_clpq_int32,
+	interfaces/Prolog/tests/expected_clpq_int32_a,
+	interfaces/Prolog/tests/expected_clpq_int64,
+	interfaces/Prolog/tests/expected_clpq_int64_a,
+	interfaces/Prolog/tests/expected_clpq_int8,
+	interfaces/Prolog/tests/expected_clpq_int8_a,
+	interfaces/Prolog/tests/expected_clpq_mpz,
+	interfaces/Prolog/tests/expected_clpq_mpz_a,
+	interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4,
+	interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+	interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+	interfaces/ppl_interface_generator_common.m4,
+	interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+	m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+	m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+	m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+	m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_plain_char_is_signed.m4, m4/ac_cxx_proper_long_double.m4,
+	m4/ac_cxx_zero_length_arrays.m4, m4/ac_prog_jar.m4,
+	m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4, src/Affine_Space.cc,
+	src/Affine_Space_defs.hh, src/Affine_Space_inlines.hh,
+	src/Affine_Space_types.hh, src/Any_Pointset_defs.hh,
+	src/Any_Pointset_inlines.hh, src/Any_Pointset_types.hh,
+	src/Ask_Tell_defs.hh, src/Ask_Tell_inlines.hh,
+	src/Ask_Tell_templates.hh, src/Ask_Tell_types.hh,
+	src/BDS_Status_idefs.hh, src/BDS_Status_inlines.hh,
+	src/BD_Shape.cc, src/BD_Shape_defs.hh, src/BD_Shape_inlines.hh,
+	src/BD_Shape_templates.hh, src/BD_Shape_types.hh,
+	src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate_defs.hh,
+	src/BHRZ03_Certificate_inlines.hh, src/BHRZ03_Certificate_types.hh,
+	src/Bit_Matrix.cc, src/Bit_Matrix_defs.hh,
+	src/Bit_Matrix_inlines.hh, src/Bit_Matrix_types.hh, src/Bit_Row.cc,
+	src/Bit_Row_defs.hh, src/Bit_Row_inlines.hh, src/Bit_Row_types.hh,
+	src/Boundary_defs.hh, src/Box.cc, src/Box_Status_idefs.hh,
+	src/Box_Status_inlines.hh, src/Box_defs.hh, src/Box_inlines.hh,
+	src/Box_templates.hh, src/Box_types.hh, src/CO_Tree.cc,
+	src/CO_Tree_defs.hh, src/CO_Tree_inlines.hh,
+	src/CO_Tree_templates.hh, src/CO_Tree_types.hh, src/C_Integer.hh,
+	src/C_Polyhedron.cc, src/C_Polyhedron_defs.hh,
+	src/C_Polyhedron_inlines.hh, src/C_Polyhedron_types.hh,
+	src/Cast_Floating_Point_Expression_defs.hh,
+	src/Cast_Floating_Point_Expression_inlines.hh,
+	src/Cast_Floating_Point_Expression_templates.hh,
+	src/Cast_Floating_Point_Expression_types.hh, src/Checked_Number.cc,
+	src/Checked_Number_defs.hh, src/Checked_Number_inlines.hh,
+	src/Checked_Number_templates.hh, src/Checked_Number_types.hh,
+	src/Coefficient.cc, src/Coefficient_defs.hh,
+	src/Coefficient_inlines.hh, src/Coefficient_traits_template.hh,
+	src/Coefficient_types.hh, src/Concrete_Expression.cc,
+	src/Concrete_Expression_defs.hh,
+	src/Concrete_Expression_inlines.hh,
+	src/Concrete_Expression_types.hh, src/Congruence.cc,
+	src/Congruence_System.cc, src/Congruence_System_defs.hh,
+	src/Congruence_System_inlines.hh, src/Congruence_System_types.hh,
+	src/Congruence_defs.hh, src/Congruence_inlines.hh,
+	src/Congruence_types.hh,
+	src/Constant_Floating_Point_Expression_defs.hh,
+	src/Constant_Floating_Point_Expression_inlines.hh,
+	src/Constant_Floating_Point_Expression_types.hh, src/Constraint.cc,
+	src/Constraint_System.cc, src/Constraint_System_defs.hh,
+	src/Constraint_System_inlines.hh, src/Constraint_System_types.hh,
+	src/Constraint_defs.hh, src/Constraint_inlines.hh,
+	src/Constraint_types.hh, src/DB_Matrix_defs.hh,
+	src/DB_Matrix_inlines.hh, src/DB_Matrix_templates.hh,
+	src/DB_Matrix_types.hh, src/DB_Row_defs.hh, src/DB_Row_inlines.hh,
+	src/DB_Row_templates.hh, src/DB_Row_types.hh, src/Dense_Row.cc,
+	src/Dense_Row_defs.hh, src/Dense_Row_inlines.hh,
+	src/Dense_Row_templates.hh, src/Dense_Row_types.hh,
+	src/Determinate_defs.hh, src/Determinate_inlines.hh,
+	src/Determinate_types.hh,
+	src/Difference_Floating_Point_Expression_defs.hh,
+	src/Difference_Floating_Point_Expression_inlines.hh,
+	src/Difference_Floating_Point_Expression_templates.hh,
+	src/Difference_Floating_Point_Expression_types.hh,
+	src/Division_Floating_Point_Expression_defs.hh,
+	src/Division_Floating_Point_Expression_inlines.hh,
+	src/Division_Floating_Point_Expression_templates.hh,
+	src/Division_Floating_Point_Expression_types.hh,
+	src/Doubly_Linked_Object_defs.hh,
+	src/Doubly_Linked_Object_inlines.hh,
+	src/Doubly_Linked_Object_types.hh, src/EList_Iterator_defs.hh,
+	src/EList_Iterator_inlines.hh, src/EList_Iterator_types.hh,
+	src/EList_defs.hh, src/EList_inlines.hh, src/EList_types.hh,
+	src/Expression_Adapter_defs.hh, src/Expression_Adapter_inlines.hh,
+	src/Expression_Adapter_types.hh,
+	src/Expression_Hide_Inhomo_defs.hh,
+	src/Expression_Hide_Inhomo_inlines.hh,
+	src/Expression_Hide_Inhomo_types.hh,
+	src/Expression_Hide_Last_defs.hh,
+	src/Expression_Hide_Last_inlines.hh,
+	src/Expression_Hide_Last_types.hh, src/Float.cc, src/Float_defs.hh,
+	src/Float_inlines.hh, src/Float_templates.hh,
+	src/Floating_Point_Expression_defs.hh,
+	src/Floating_Point_Expression_inlines.hh,
+	src/Floating_Point_Expression_templates.hh,
+	src/Floating_Point_Expression_types.hh, src/GMP_Integer_defs.hh,
+	src/GMP_Integer_inlines.hh, src/GMP_Integer_types.hh,
+	src/Generator.cc, src/Generator_System.cc,
+	src/Generator_System_defs.hh, src/Generator_System_inlines.hh,
+	src/Generator_System_types.hh, src/Generator_defs.hh,
+	src/Generator_inlines.hh, src/Generator_types.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate_defs.hh,
+	src/Grid_Certificate_inlines.hh, src/Grid_Certificate_types.hh,
+	src/Grid_Generator.cc, src/Grid_Generator_System.cc,
+	src/Grid_Generator_System_defs.hh,
+	src/Grid_Generator_System_inlines.hh,
+	src/Grid_Generator_System_types.hh, src/Grid_Generator_defs.hh,
+	src/Grid_Generator_inlines.hh, src/Grid_Generator_types.hh,
+	src/Grid_Status.cc, src/Grid_Status_idefs.hh,
+	src/Grid_Status_inlines.hh, src/Grid_chdims.cc,
+	src/Grid_conversion.cc, src/Grid_defs.hh, src/Grid_inlines.hh,
+	src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	src/Grid_templates.hh, src/Grid_types.hh, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate_defs.hh,
+	src/H79_Certificate_inlines.hh, src/H79_Certificate_types.hh,
+	src/Handler_defs.hh, src/Handler_inlines.hh, src/Handler_types.hh,
+	src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init_defs.hh,
+	src/Init_inlines.hh, src/Init_types.hh, src/Integer_Interval.hh,
+	src/Interval_Info_defs.hh, src/Interval_Info_inlines.hh,
+	src/Interval_Info_types.hh, src/Interval_defs.hh,
+	src/Interval_inlines.hh, src/Interval_templates.hh,
+	src/Interval_types.hh, src/Linear_Expression.cc,
+	src/Linear_Expression_Impl.cc, src/Linear_Expression_Impl_defs.hh,
+	src/Linear_Expression_Impl_inlines.hh,
+	src/Linear_Expression_Impl_templates.hh,
+	src/Linear_Expression_Impl_types.hh,
+	src/Linear_Expression_Interface.cc,
+	src/Linear_Expression_Interface_defs.hh,
+	src/Linear_Expression_Interface_types.hh,
+	src/Linear_Expression_defs.hh, src/Linear_Expression_inlines.hh,
+	src/Linear_Expression_types.hh, src/Linear_Form.cc,
+	src/Linear_Form_defs.hh, src/Linear_Form_inlines.hh,
+	src/Linear_Form_templates.hh, src/Linear_Form_types.hh,
+	src/Linear_System_defs.hh, src/Linear_System_inlines.hh,
+	src/Linear_System_templates.hh, src/Linear_System_types.hh,
+	src/MIP_Problem.cc, src/MIP_Problem_defs.hh,
+	src/MIP_Problem_inlines.hh, src/MIP_Problem_templates.hh,
+	src/MIP_Problem_types.hh, src/Makefile.am, src/Matrix_defs.hh,
+	src/Matrix_inlines.hh, src/Matrix_templates.hh,
+	src/Matrix_types.hh,
+	src/Multiplication_Floating_Point_Expression_defs.hh,
+	src/Multiplication_Floating_Point_Expression_inlines.hh,
+	src/Multiplication_Floating_Point_Expression_templates.hh,
+	src/Multiplication_Floating_Point_Expression_types.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron_defs.hh,
+	src/NNC_Polyhedron_inlines.hh, src/NNC_Polyhedron_types.hh,
+	src/Numeric_Format_defs.hh, src/OR_Matrix_defs.hh,
+	src/OR_Matrix_inlines.hh, src/OR_Matrix_templates.hh,
+	src/OR_Matrix_types.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape_defs.hh, src/Octagonal_Shape_inlines.hh,
+	src/Octagonal_Shape_templates.hh, src/Octagonal_Shape_types.hh,
+	src/Og_Status_idefs.hh, src/Og_Status_inlines.hh,
+	src/Opposite_Floating_Point_Expression_defs.hh,
+	src/Opposite_Floating_Point_Expression_inlines.hh,
+	src/Opposite_Floating_Point_Expression_types.hh,
+	src/PIP_Problem.cc, src/PIP_Problem_defs.hh,
+	src/PIP_Problem_inlines.hh, src/PIP_Problem_templates.hh,
+	src/PIP_Problem_types.hh, src/PIP_Tree.cc, src/PIP_Tree_defs.hh,
+	src/PIP_Tree_inlines.hh, src/PIP_Tree_types.hh,
+	src/Partial_Function.cc, src/Partial_Function_defs.hh,
+	src/Partial_Function_inlines.hh, src/Partial_Function_types.hh,
+	src/Partially_Reduced_Product_defs.hh,
+	src/Partially_Reduced_Product_inlines.hh,
+	src/Partially_Reduced_Product_templates.hh,
+	src/Partially_Reduced_Product_types.hh,
+	src/Pending_Element_defs.hh, src/Pending_Element_inlines.hh,
+	src/Pending_Element_types.hh, src/Pending_List_defs.hh,
+	src/Pending_List_inlines.hh, src/Pending_List_templates.hh,
+	src/Pending_List_types.hh, src/Ph_Status.cc,
+	src/Ph_Status_idefs.hh, src/Ph_Status_inlines.hh,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell_defs.hh,
+	src/Pointset_Ask_Tell_inlines.hh,
+	src/Pointset_Ask_Tell_templates.hh, src/Pointset_Ask_Tell_types.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset_defs.hh,
+	src/Pointset_Powerset_inlines.hh,
+	src/Pointset_Powerset_templates.hh, src/Pointset_Powerset_types.hh,
+	src/Poly_Con_Relation.cc, src/Poly_Con_Relation_defs.hh,
+	src/Poly_Con_Relation_inlines.hh, src/Poly_Con_Relation_types.hh,
+	src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation_defs.hh,
+	src/Poly_Gen_Relation_inlines.hh, src/Poly_Gen_Relation_types.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_chdims_templates.hh,
+	src/Polyhedron_conversion_templates.hh, src/Polyhedron_defs.hh,
+	src/Polyhedron_inlines.hh, src/Polyhedron_minimize_templates.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Polyhedron_simplify_templates.hh, src/Polyhedron_templates.hh,
+	src/Polyhedron_types.hh, src/Polyhedron_widenings.cc,
+	src/Powerset_defs.hh, src/Powerset_inlines.hh,
+	src/Powerset_templates.hh, src/Powerset_types.hh,
+	src/Ptr_Iterator_defs.hh, src/Ptr_Iterator_inlines.hh,
+	src/Ptr_Iterator_types.hh, src/Rational_Box.hh,
+	src/Rational_Interval.hh, src/Result_defs.hh,
+	src/Result_inlines.hh, src/Rounding_Dir_defs.hh,
+	src/Rounding_Dir_inlines.hh, src/Scalar_Products.cc,
+	src/Scalar_Products_defs.hh, src/Scalar_Products_inlines.hh,
+	src/Scalar_Products_types.hh, src/Slow_Copy.hh, src/Sparse_Row.cc,
+	src/Sparse_Row_defs.hh, src/Sparse_Row_inlines.hh,
+	src/Sparse_Row_templates.hh, src/Sparse_Row_types.hh,
+	src/Sum_Floating_Point_Expression_defs.hh,
+	src/Sum_Floating_Point_Expression_inlines.hh,
+	src/Sum_Floating_Point_Expression_templates.hh,
+	src/Sum_Floating_Point_Expression_types.hh,
+	src/Swapping_Vector_defs.hh, src/Swapping_Vector_inlines.hh,
+	src/Swapping_Vector_types.hh, src/Temp_defs.hh,
+	src/Temp_inlines.hh, src/Temp_templates.hh,
+	src/Threshold_Watcher.cc, src/Threshold_Watcher_defs.hh,
+	src/Threshold_Watcher_inlines.hh,
+	src/Threshold_Watcher_templates.hh, src/Threshold_Watcher_types.hh,
+	src/Time.cc, src/Time_defs.hh, src/Time_inlines.hh,
+	src/Time_types.hh, src/Topology_types.hh, src/Variable.cc,
+	src/Variable_Floating_Point_Expression_defs.hh,
+	src/Variable_Floating_Point_Expression_inlines.hh,
+	src/Variable_Floating_Point_Expression_types.hh,
+	src/Variable_defs.hh, src/Variable_inlines.hh,
+	src/Variable_types.hh, src/Variables_Set.cc,
+	src/Variables_Set_defs.hh, src/Variables_Set_inlines.hh,
+	src/Variables_Set_types.hh, src/WRD_coefficient_types_defs.hh,
+	src/WRD_coefficient_types_inlines.hh, src/Watchdog.cc,
+	src/Watchdog_defs.hh, src/Watchdog_inlines.hh,
+	src/Watchdog_types.hh, src/Weight_Profiler.cc,
+	src/Weight_Profiler_defs.hh, src/Widening_Function_defs.hh,
+	src/Widening_Function_inlines.hh, src/Widening_Function_types.hh,
+	src/algorithms.hh, src/assert.cc, src/assert.hh,
+	src/assign_or_swap.hh, src/c_streambuf.cc, src/c_streambuf_defs.hh,
+	src/c_streambuf_inlines.hh, src/c_streambuf_types.hh,
+	src/checked.cc, src/checked_defs.hh, src/checked_ext_defs.hh,
+	src/checked_ext_inlines.hh, src/checked_float_inlines.hh,
+	src/checked_inlines.hh, src/checked_int_inlines.hh,
+	src/checked_mpq_inlines.hh, src/checked_mpz_inlines.hh,
+	src/checked_numeric_limits.hh, src/compiler.hh,
+	src/distances_defs.hh, src/distances_inlines.hh,
+	src/distances_types.hh, src/fpu-c99_inlines.hh, src/fpu-ia32.cc,
+	src/fpu-ia32_inlines.hh, src/fpu-none_inlines.hh,
+	src/fpu-sparc_inlines.hh, src/fpu_defs.hh, src/fpu_types.hh,
+	src/globals.cc, src/globals_defs.hh, src/globals_inlines.hh,
+	src/globals_types.hh, src/initializer.hh, src/intervals_defs.hh,
+	src/iterator_to_const_defs.hh, src/iterator_to_const_inlines.hh,
+	src/iterator_to_const_types.hh, src/linearize.hh,
+	src/math_utilities_defs.hh, src/math_utilities_inlines.hh,
+	src/max_space_dimension.hh, src/meta_programming.hh,
+	src/mp_std_bits.cc, src/mp_std_bits_defs.hh,
+	src/mp_std_bits_inlines.hh, src/namespaces.hh,
+	src/ppl-config.cc.in, src/ppl_header.hh, src/stdiobuf.cc,
+	src/stdiobuf_defs.hh, src/stdiobuf_inlines.hh,
+	src/stdiobuf_types.hh, src/swapping_sort_templates.hh,
+	src/termination.cc, src/termination_defs.hh,
+	src/termination_templates.hh, src/termination_types.hh,
+	src/version.cc, src/version.hh.in, src/wrap_assign.hh,
+	src/wrap_string.cc, src/wrap_string.hh, tests/Ask_Tell/Makefile.am,
+	tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+	tests/BD_Shape/addconstraints1.cc, tests/BD_Shape/addspacedims1.cc,
+	tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+	tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+	tests/BD_Shape/ascii_dump_load1.cc,
+	tests/BD_Shape/bgp99extrapolation1.cc,
+	tests/BD_Shape/bhmz05widening1.cc,
+	tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	tests/BD_Shape/boundedaffineimage1.cc,
+	tests/BD_Shape/boundedaffinepreimage1.cc,
+	tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+	tests/BD_Shape/contains1.cc,
+	tests/BD_Shape/containsintegerpoint1.cc,
+	tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+	tests/BD_Shape/disjoint1.cc,
+	tests/BD_Shape/dropsomenonintegerpoints1.cc,
+	tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	tests/BD_Shape/expandspacedim1.cc,
+	tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+	tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+	tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+	tests/BD_Shape/fromoctagonalshape1.cc,
+	tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+	tests/BD_Shape/generalizedaffineimage1.cc,
+	tests/BD_Shape/generalizedaffineimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage1.cc,
+	tests/BD_Shape/generalizedaffinepreimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage3.cc,
+	tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	tests/BD_Shape/integerupperboundifexact1.cc,
+	tests/BD_Shape/intersection1.cc,
+	tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	tests/BD_Shape/limitedcc76extrapolation1.cc,
+	tests/BD_Shape/limitedh79extrapolation1.cc,
+	tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	tests/BD_Shape/simplifyusingcontext1.cc,
+	tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+	tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+	tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+	tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+	tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+	tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+	tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+	tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+	tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+	tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+	tests/Box/empty1.cc, tests/Box/equality1.cc,
+	tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+	tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+	tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	tests/Box/generalizedaffineimage2.cc,
+	tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+	tests/Box/intersection1.cc, tests/Box/interval1.cc,
+	tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+	tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+	tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	tests/Box/propagateconstraints1.cc,
+	tests/Box/propagateconstraints2.cc,
+	tests/Box/refinewithcongruence1.cc,
+	tests/Box/refinewithcongruences1.cc,
+	tests/Box/refinewithconstraint1.cc,
+	tests/Box/refinewithconstraint2.cc,
+	tests/Box/refinewithconstraints1.cc,
+	tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+	tests/Box/relations2.cc, tests/Box/relations3.cc,
+	tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+	tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+	tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+	tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+	tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+	tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+	tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+	tests/Concrete_Expression/C_Expr.cc,
+	tests/Concrete_Expression/C_Expr_defs.hh,
+	tests/Concrete_Expression/C_Expr_inlines.hh,
+	tests/Concrete_Expression/C_Expr_types.hh,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/bdshape1.cc,
+	tests/Concrete_Expression/bdshape2.cc,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearform1.cc,
+	tests/Concrete_Expression/linearize.cc,
+	tests/Concrete_Expression/octagonalshape1.cc,
+	tests/Concrete_Expression/octagonalshape2.cc,
+	tests/Concrete_Expression/polyhedron1.cc,
+	tests/Concrete_Expression/polyhedron2.cc,
+	tests/Concrete_Expression/run_tests, tests/Grid/Makefile.am,
+	tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	tests/Grid/approximatepartition1.cc, tests/Grid/asciidumpload1.cc,
+	tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	tests/Grid/asciidumpload6.cc, tests/Grid/bhz03widening1.cc,
+	tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+	tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+	tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+	tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+	tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+	tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+	tests/Grid/frompolyhedron1.cc,
+	tests/Grid/generalizedaffineimage1.cc,
+	tests/Grid/generalizedaffineimage2.cc,
+	tests/Grid/generalizedaffineimage3.cc,
+	tests/Grid/generalizedaffinepreimage1.cc,
+	tests/Grid/generalizedaffinepreimage2.cc,
+	tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+	tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+	tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	tests/Grid/limitedextrapolation1.cc,
+	tests/Grid/limitedextrapolation2.cc,
+	tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	tests/Grid/powersetdifference1.cc,
+	tests/Grid/powersetgeometricallycovers1.cc,
+	tests/Grid/powersetgeometricallyequals1.cc,
+	tests/Grid/refinewithcongruences1.cc,
+	tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+	tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+	tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+	tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+	tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+	tests/MIP_Problem/Makefile.am,
+	tests/MIP_Problem/ascii_dump_load1.cc,
+	tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+	tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+	tests/MIP_Problem/mipproblem4.cc, tests/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/addspacedims1.cc,
+	tests/Octagonal_Shape/affinedimension1.cc,
+	tests/Octagonal_Shape/affineimage1.cc,
+	tests/Octagonal_Shape/affineimage2.cc,
+	tests/Octagonal_Shape/affinepreimage1.cc,
+	tests/Octagonal_Shape/affinepreimage2.cc,
+	tests/Octagonal_Shape/ascii_dump_load1.cc,
+	tests/Octagonal_Shape/bhmz05widening1.cc,
+	tests/Octagonal_Shape/bhz03widening1.cc,
+	tests/Octagonal_Shape/bounded1.cc,
+	tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	tests/Octagonal_Shape/bounds1.cc,
+	tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/cc76narrowing1.cc,
+	tests/Octagonal_Shape/chinainit.cc,
+	tests/Octagonal_Shape/concatenate1.cc,
+	tests/Octagonal_Shape/congruences1.cc,
+	tests/Octagonal_Shape/constrains1.cc,
+	tests/Octagonal_Shape/constraints1.cc,
+	tests/Octagonal_Shape/contains1.cc,
+	tests/Octagonal_Shape/containsintegerpoint1.cc,
+	tests/Octagonal_Shape/difference1.cc,
+	tests/Octagonal_Shape/discrete1.cc,
+	tests/Octagonal_Shape/disjoint1.cc,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+	tests/Octagonal_Shape/empty1.cc,
+	tests/Octagonal_Shape/expandspacedim1.cc,
+	tests/Octagonal_Shape/foldspacedims1.cc,
+	tests/Octagonal_Shape/frequency1.cc,
+	tests/Octagonal_Shape/frombdshape1.cc,
+	tests/Octagonal_Shape/frombox1.cc,
+	tests/Octagonal_Shape/fromgensys1.cc,
+	tests/Octagonal_Shape/fromgrid1.cc,
+	tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	tests/Octagonal_Shape/frompolyhedron1.cc,
+	tests/Octagonal_Shape/fromspacedim1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	tests/Octagonal_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/intersection1.cc,
+	tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	tests/Octagonal_Shape/mapspacedims1.cc,
+	tests/Octagonal_Shape/max_min1.cc,
+	tests/Octagonal_Shape/max_min2.cc,
+	tests/Octagonal_Shape/maxspacedim1.cc,
+	tests/Octagonal_Shape/membytes1.cc,
+	tests/Octagonal_Shape/minconstraints1.cc,
+	tests/Octagonal_Shape/relatwithcons1.cc,
+	tests/Octagonal_Shape/relatwithcons2.cc,
+	tests/Octagonal_Shape/relatwithcons3.cc,
+	tests/Octagonal_Shape/relatwithgen1.cc,
+	tests/Octagonal_Shape/removespacedims1.cc,
+	tests/Octagonal_Shape/run_tests,
+	tests/Octagonal_Shape/simplifyusingcontext1.cc,
+	tests/Octagonal_Shape/timeelapse1.cc,
+	tests/Octagonal_Shape/unconstrain1.cc,
+	tests/Octagonal_Shape/universe1.cc,
+	tests/Octagonal_Shape/upperbound1.cc,
+	tests/Octagonal_Shape/upperboundifexact1.cc,
+	tests/Octagonal_Shape/wrap1.cc,
+	tests/Octagonal_Shape/writeoctagon1.cc,
+	tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+	tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+	tests/PIP_Problem/weightwatch1.cc,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/addcongruences1.cc,
+	tests/Partially_Reduced_Product/addconstraints1.cc,
+	tests/Partially_Reduced_Product/affineimage1.cc,
+	tests/Partially_Reduced_Product/asciidumpload1.cc,
+	tests/Partially_Reduced_Product/bounded1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/concatenate1.cc,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/congruencesproduct1.cc,
+	tests/Partially_Reduced_Product/constraints1.cc,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/contains1.cc,
+	tests/Partially_Reduced_Product/difference1.cc,
+	tests/Partially_Reduced_Product/dimension1.cc,
+	tests/Partially_Reduced_Product/directproduct1.cc,
+	tests/Partially_Reduced_Product/directproduct2.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/discrete1.cc,
+	tests/Partially_Reduced_Product/disjoint1.cc,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+	tests/Partially_Reduced_Product/equals1.cc,
+	tests/Partially_Reduced_Product/frombdshape1.cc,
+	tests/Partially_Reduced_Product/frombox1.cc,
+	tests/Partially_Reduced_Product/fromgrid1.cc,
+	tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+	tests/Partially_Reduced_Product/frompolyhedron1.cc,
+	tests/Partially_Reduced_Product/fromproduct1.cc,
+	tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+	tests/Partially_Reduced_Product/intersection1.cc,
+	tests/Partially_Reduced_Product/isempty1.cc,
+	tests/Partially_Reduced_Product/isuniverse1.cc,
+	tests/Partially_Reduced_Product/maxmin1.cc,
+	tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+	tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+	tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/spacedims1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc,
+	tests/Partially_Reduced_Product/topclosed1.cc,
+	tests/Partially_Reduced_Product/topclosure1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Partially_Reduced_Product/widening1.cc,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	tests/Polyhedron/addcongruences1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addconstraints2.cc,
+	tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerator2.cc,
+	tests/Polyhedron/addgenerators1.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/addspacedims1.cc,
+	tests/Polyhedron/addspacedims2.cc,
+	tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+	tests/Polyhedron/affinepreimage1.cc,
+	tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+	tests/Polyhedron/ascii_dump_load2.cc,
+	tests/Polyhedron/ascii_dump_load3.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bgp99extrapolation2.cc,
+	tests/Polyhedron/bhrz03widening1.cc,
+	tests/Polyhedron/bhrz03widening2.cc,
+	tests/Polyhedron/bhrz03widening3.cc,
+	tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/boundedaffinepreimage1.cc,
+	tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	tests/Polyhedron/boundedh79extrapolation1.cc,
+	tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+	tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+	tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+	tests/Polyhedron/containsintegerpoint1.cc,
+	tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	tests/Polyhedron/dropsomenonintegerpoints1.cc,
+	tests/Polyhedron/dropsomenonintegerpoints2.cc,
+	tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	tests/Polyhedron/expandspacedim1.cc,
+	tests/Polyhedron/expandspacedim2.cc,
+	tests/Polyhedron/foldspacedims1.cc,
+	tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+	tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	tests/Polyhedron/fromoctagonalshape1.cc,
+	tests/Polyhedron/generalizedaffineimage1.cc,
+	tests/Polyhedron/generalizedaffineimage2.cc,
+	tests/Polyhedron/generalizedaffinepreimage1.cc,
+	tests/Polyhedron/generalizedaffinepreimage2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+	tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	tests/Polyhedron/limitedh79extrapolation1.cc,
+	tests/Polyhedron/linearexpression1.cc,
+	tests/Polyhedron/linearpartition1.cc,
+	tests/Polyhedron/linearsystem1.cc,
+	tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+	tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	tests/Polyhedron/minconstraints1.cc,
+	tests/Polyhedron/minconstraints2.cc,
+	tests/Polyhedron/mingenerators1.cc,
+	tests/Polyhedron/mingenerators2.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+	tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+	tests/Polyhedron/polyhull2.cc,
+	tests/Polyhedron/polyhullifexact1.cc,
+	tests/Polyhedron/polyhullifexact2.cc,
+	tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/refinewithcongruence1.cc,
+	tests/Polyhedron/refinewithcongruences1.cc,
+	tests/Polyhedron/refinewithconstraint1.cc,
+	tests/Polyhedron/refinewithconstraints1.cc,
+	tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	tests/Polyhedron/relations3.cc,
+	tests/Polyhedron/removespacedims1.cc,
+	tests/Polyhedron/removespacedims2.cc,
+	tests/Polyhedron/simplifyusingcontext1.cc,
+	tests/Polyhedron/smm1.cc, tests/Polyhedron/sparserow1.cc,
+	tests/Polyhedron/termination1.cc, tests/Polyhedron/termination2.cc,
+	tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+	tests/Polyhedron/unconstrain1.cc, tests/Polyhedron/universe1.cc,
+	tests/Polyhedron/universe2.cc, tests/Polyhedron/variablesset1.cc,
+	tests/Polyhedron/watchdog1.cc, tests/Polyhedron/weightwatch1.cc,
+	tests/Polyhedron/wrap1.cc, tests/Polyhedron/wrap2.cc,
+	tests/Polyhedron/writeconsys1.cc, tests/Polyhedron/writegensys1.cc,
+	tests/Polyhedron/writepolyhedron1.cc,
+	tests/Polyhedron/writepolyhedron2.cc,
+	tests/Polyhedron/writerelation1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+	tests/Powerset/addcongruences1.cc,
+	tests/Powerset/addconstraints1.cc,
+	tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+	tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+	tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+	tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+	tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+	tests/Powerset/containsintegerpoint1.cc,
+	tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+	tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+	tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+	tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+	tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+	tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+	tests/Powerset/fromoctagonalshape1.cc,
+	tests/Powerset/frompolyhedron1.cc,
+	tests/Powerset/fromspacedimension1.cc,
+	tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+	tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+	tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+	tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+	tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+	tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+	tests/Powerset/upperbound1.cc, tests/README,
+	tests/Random_Number_Generator_defs.hh,
+	tests/Random_Number_Generator_inlines.hh,
+	tests/Random_Number_Generator_types.hh, tests/Watchdog/Makefile.am,
+	tests/Watchdog/watchdog1.cc, tests/files.cc, tests/files.hh,
+	tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+	utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: Extended
+	copyright years.
+
+2012-12-22  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Version number bumped.
+
+2012-12-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.cc, src/mp_std_bits_defs.hh: GMP version 5.1.0
+	(and, presumably, later versions) defines std::numeric_limits.
+
+2012-12-17  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* compile, config.sub, depcomp: Updated.
+
+2012-11-12  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac, m4/ac_cxx_long_double_binary_format.m4: Detect bogus
+	versions of std::floor(long double).
+
+2012-11-11  Roberto Bagnara <roberto.bagnara at bugseng.com>
+
+	* configure.ac: Do recognize also llvm-gcc and llvm-g++.
+	Floating-point-based abstractions are disabled when clang++ or
+	llvm-g++ are detected.
+
+2012-10-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox: Removed wrong observation on time-elapse for
+	closed polyhedra.  (Thanks to Marco Faella for pointing this out.)
+
+2012-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess, config.sub: Updated.
+
+2012-09-20  Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+	* src/Doubly_Linked_Object_defs.hh,
+	src/Doubly_Linked_Object_inlines.hh,
+	src/Doubly_Linked_Object_types.hh, src/EList_Iterator_defs.hh,
+	src/EList_Iterator_inlines.hh, src/EList_Iterator_types.hh,
+	src/EList_defs.hh, src/EList_inlines.hh, src/EList_types.hh,
+	src/Octagonal_Shape_templates.hh, src/Pending_List_defs.hh,
+	src/Pending_List_inlines.hh, src/Pending_List_templates.hh,
+	src/Threshold_Watcher_defs.hh, src/Threshold_Watcher_templates.hh,
+	src/Watchdog.cc, src/Watchdog_defs.hh: EList is not Watchdog
+	specific. Avoided needless naming incongruences.
+
+2012-09-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape_defs.hh, src/Concrete_Expression_types.hh,
+	src/Partially_Reduced_Product_defs.hh: Fixed several Doxygen
+	warnings.
+
+2012-09-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2012-08-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Updated news.
+
+2012-08-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java: Added a Java
+	testcase for method drop_some_non_integer_points().
+
+2012-08-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Fixed a precision problem in method   Polyhedron::drop_some_non_integer_points().
+
+2012-08-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/dropsomenonintegerpoints2.cc: Added a new test
+	  showing a precision problem in one of the methods
+	Polyhedron::drop_some_non_integer_points();
+
+2012-08-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: Fixed Java interface issues for method
+	drop_some_non_integer_points(), reported by Zell (Zhoulai).  Corrected the declaration of the method by letting it accept a
+	Complexity_Class enumeration value (rather than a plain integer).  Also renamed the version taking a set of variables as input, which
+	was using the suffix "_2", so as to exploit overloading.
+
+2012-08-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithcongruence1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Powerset/fromconstraints1.cc: Added test invocations that were
+	left out by mistake.
+
+2012-08-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Integer.hh: Indentation fixed.
+
+2012-08-25  Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+	* src/checked_int_inlines.hh: Avoided user defined and
+	implementation define behaviors of left and right shift.
+
+2012-08-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.cc, src/Float_defs.hh, src/Float_inlines.hh: Avoided
+	some "magic constants".  Detected by ECLAIR service nomagicc.
+
+2012-08-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float_defs.hh: Fixed float_ieee754_half::POS_INF and
+	float_ieee754_half::NEG_INF.  They were swapped.
+
+2012-08-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh: Revert "Two comments turned into assertions." This reverts commit e4ced22bfaf9e410719d47154dcc942ceffbeea0.
+
+2012-08-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float_inlines.hh: Avoided a couple of "magic constants".
+	Detected by ECLAIR service nomagicc.
+
+2012-08-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary_defs.hh: Comments should never be used for
+	"commenting out" code.  Detected by ECLAIR service cmntdout.
+
+2012-08-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc: Unusual and difficult-to-maintain comment
+	removed.
+
+2012-08-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh: Two comments turned into assertions.
+
+2012-08-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box_templates.hh, src/Grid_conversion.cc,
+	src/Interval_defs.hh, src/Interval_inlines.hh,
+	src/Pointset_Powerset_templates.hh: Do not declare more than one
+	variable per declaration.  Detected by ECLAIR service
+	declgrup_srceline.
+
+2012-08-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, src/Watchdog_defs.hh,
+	src/Watchdog_inlines.hh: Avoided non-constant pointers to function.
+	Detected by ECLAIR service funpntr.
+
+2012-08-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Handler_defs.hh, src/Handler_inlines.hh: Avoided non-constant
+	pointers to function.  Detected by ECLAIR service funpntr.
+
+2012-08-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products_defs.hh: Avoided non-constant pointers to
+	function.  Detected by ECLAIR service funpntr.
+
+2012-08-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure, doc/Makefile.am, interfaces/C/Makefile.am,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/{ppl_c_implementation_common.defs.hh =>
+	ppl_c_implementation_common_defs.hh},
+	interfaces/C/{ppl_c_implementation_common.inlines.hh =>
+	ppl_c_implementation_common_inlines.hh},
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/{ppl_java_common.defs.hh =>
+	ppl_java_common_defs.hh},
+	interfaces/Java/jni/{ppl_java_common.inlines.hh =>
+	ppl_java_common_inlines.hh},
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/{ppl_ocaml_common.defs.hh =>
+	ppl_ocaml_common_defs.hh},
+	interfaces/OCaml/{ppl_ocaml_common.inlines.hh =>
+	ppl_ocaml_common_inlines.hh}, interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/Makefile.am, interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/{ppl_prolog_common.defs.hh =>
+	ppl_prolog_common_defs.hh},
+	interfaces/Prolog/{ppl_prolog_common.inlines.hh =>
+	ppl_prolog_common_inlines.hh}, src/Affine_Space.cc,
+	src/{Affine_Space.defs.hh => Affine_Space_defs.hh},
+	src/{Affine_Space.inlines.hh => Affine_Space_inlines.hh},
+	src/{Affine_Space.types.hh => Affine_Space_types.hh},
+	src/{Any_Pointset.defs.hh => Any_Pointset_defs.hh},
+	src/{Any_Pointset.inlines.hh => Any_Pointset_inlines.hh},
+	src/{Any_Pointset.types.hh => Any_Pointset_types.hh},
+	src/{Ask_Tell.defs.hh => Ask_Tell_defs.hh},
+	src/{Ask_Tell.inlines.hh => Ask_Tell_inlines.hh},
+	src/{Ask_Tell.templates.hh => Ask_Tell_templates.hh},
+	src/{Ask_Tell.types.hh => Ask_Tell_types.hh},
+	src/{BDS_Status.idefs.hh => BDS_Status_idefs.hh},
+	src/{BDS_Status.inlines.hh => BDS_Status_inlines.hh},
+	src/BD_Shape.cc, src/{BD_Shape.defs.hh => BD_Shape_defs.hh},
+	src/{BD_Shape.inlines.hh => BD_Shape_inlines.hh},
+	src/{BD_Shape.templates.hh => BD_Shape_templates.hh},
+	src/{BD_Shape.types.hh => BD_Shape_types.hh},
+	src/BHRZ03_Certificate.cc, src/{BHRZ03_Certificate.defs.hh =>
+	BHRZ03_Certificate_defs.hh}, src/{BHRZ03_Certificate.inlines.hh =>
+	BHRZ03_Certificate_inlines.hh}, src/{BHRZ03_Certificate.types.hh =>
+	BHRZ03_Certificate_types.hh}, src/Bit_Matrix.cc,
+	src/{Bit_Matrix.defs.hh => Bit_Matrix_defs.hh},
+	src/{Bit_Matrix.inlines.hh => Bit_Matrix_inlines.hh},
+	src/{Bit_Matrix.types.hh => Bit_Matrix_types.hh}, src/Bit_Row.cc,
+	src/{Bit_Row.defs.hh => Bit_Row_defs.hh}, src/{Bit_Row.inlines.hh
+	=> Bit_Row_inlines.hh}, src/{Bit_Row.types.hh => Bit_Row_types.hh},
+	src/{Boundary.defs.hh => Boundary_defs.hh}, src/Box.cc,
+	src/{Box_Status.idefs.hh => Box_Status_idefs.hh},
+	src/{Box_Status.inlines.hh => Box_Status_inlines.hh},
+	src/{Box.defs.hh => Box_defs.hh}, src/{Box.inlines.hh =>
+	Box_inlines.hh}, src/{Box.templates.hh => Box_templates.hh},
+	src/{Box.types.hh => Box_types.hh}, src/CO_Tree.cc,
+	src/{CO_Tree.defs.hh => CO_Tree_defs.hh}, src/{CO_Tree.inlines.hh
+	=> CO_Tree_inlines.hh}, src/{CO_Tree.templates.hh =>
+	CO_Tree_templates.hh}, src/{CO_Tree.types.hh => CO_Tree_types.hh},
+	src/C_Polyhedron.cc, src/{C_Polyhedron.defs.hh =>
+	C_Polyhedron_defs.hh}, src/{C_Polyhedron.inlines.hh =>
+	C_Polyhedron_inlines.hh}, src/{C_Polyhedron.types.hh =>
+	C_Polyhedron_types.hh}, src/{Cast_Floating_Point_Expression.defs.hh
+	=> Cast_Floating_Point_Expression_defs.hh},
+	src/{Cast_Floating_Point_Expression.inlines.hh =>
+	Cast_Floating_Point_Expression_inlines.hh},
+	src/{Cast_Floating_Point_Expression.templates.hh =>
+	Cast_Floating_Point_Expression_templates.hh},
+	src/{Cast_Floating_Point_Expression.types.hh =>
+	Cast_Floating_Point_Expression_types.hh}, src/Checked_Number.cc,
+	src/{Checked_Number.defs.hh => Checked_Number_defs.hh},
+	src/{Checked_Number.inlines.hh => Checked_Number_inlines.hh},
+	src/{Checked_Number.templates.hh => Checked_Number_templates.hh},
+	src/{Checked_Number.types.hh => Checked_Number_types.hh},
+	src/Coefficient.cc, src/{Coefficient.defs.hh =>
+	Coefficient_defs.hh}, src/{Coefficient.inlines.hh =>
+	Coefficient_inlines.hh}, src/{Coefficient.types.hh =>
+	Coefficient_types.hh}, src/Concrete_Expression.cc,
+	src/{Concrete_Expression.defs.hh => Concrete_Expression_defs.hh},
+	src/{Concrete_Expression.inlines.hh =>
+	Concrete_Expression_inlines.hh}, src/{Concrete_Expression.types.hh
+	=> Concrete_Expression_types.hh}, src/Congruence.cc,
+	src/Congruence_System.cc, src/{Congruence_System.defs.hh =>
+	Congruence_System_defs.hh}, src/{Congruence_System.inlines.hh =>
+	Congruence_System_inlines.hh}, src/{Congruence_System.types.hh =>
+	Congruence_System_types.hh}, src/{Congruence.defs.hh =>
+	Congruence_defs.hh}, src/{Congruence.inlines.hh =>
+	Congruence_inlines.hh}, src/{Congruence.types.hh =>
+	Congruence_types.hh},
+	src/{Constant_Floating_Point_Expression.defs.hh =>
+	Constant_Floating_Point_Expression_defs.hh},
+	src/{Constant_Floating_Point_Expression.inlines.hh =>
+	Constant_Floating_Point_Expression_inlines.hh},
+	src/{Constant_Floating_Point_Expression.types.hh =>
+	Constant_Floating_Point_Expression_types.hh}, src/Constraint.cc,
+	src/Constraint_System.cc, src/{Constraint_System.defs.hh =>
+	Constraint_System_defs.hh}, src/{Constraint_System.inlines.hh =>
+	Constraint_System_inlines.hh}, src/{Constraint_System.types.hh =>
+	Constraint_System_types.hh}, src/{Constraint.defs.hh =>
+	Constraint_defs.hh}, src/{Constraint.inlines.hh =>
+	Constraint_inlines.hh}, src/{Constraint.types.hh =>
+	Constraint_types.hh}, src/{DB_Matrix.defs.hh => DB_Matrix_defs.hh},
+	src/{DB_Matrix.inlines.hh => DB_Matrix_inlines.hh},
+	src/{DB_Matrix.templates.hh => DB_Matrix_templates.hh},
+	src/{DB_Matrix.types.hh => DB_Matrix_types.hh}, src/{DB_Row.defs.hh
+	=> DB_Row_defs.hh}, src/{DB_Row.inlines.hh => DB_Row_inlines.hh},
+	src/{DB_Row.templates.hh => DB_Row_templates.hh},
+	src/{DB_Row.types.hh => DB_Row_types.hh}, src/Dense_Row.cc,
+	src/{Dense_Row.defs.hh => Dense_Row_defs.hh},
+	src/{Dense_Row.inlines.hh => Dense_Row_inlines.hh},
+	src/{Dense_Row.templates.hh => Dense_Row_templates.hh},
+	src/{Dense_Row.types.hh => Dense_Row_types.hh},
+	src/{Determinate.defs.hh => Determinate_defs.hh},
+	src/{Determinate.inlines.hh => Determinate_inlines.hh},
+	src/{Determinate.types.hh => Determinate_types.hh},
+	src/{Difference_Floating_Point_Expression.defs.hh =>
+	Difference_Floating_Point_Expression_defs.hh},
+	src/{Difference_Floating_Point_Expression.inlines.hh =>
+	Difference_Floating_Point_Expression_inlines.hh},
+	src/{Difference_Floating_Point_Expression.templates.hh =>
+	Difference_Floating_Point_Expression_templates.hh},
+	src/{Difference_Floating_Point_Expression.types.hh =>
+	Difference_Floating_Point_Expression_types.hh},
+	src/{Division_Floating_Point_Expression.defs.hh =>
+	Division_Floating_Point_Expression_defs.hh},
+	src/{Division_Floating_Point_Expression.inlines.hh =>
+	Division_Floating_Point_Expression_inlines.hh},
+	src/{Division_Floating_Point_Expression.templates.hh =>
+	Division_Floating_Point_Expression_templates.hh},
+	src/{Division_Floating_Point_Expression.types.hh =>
+	Division_Floating_Point_Expression_types.hh},
+	src/{Doubly_Linked_Object.defs.hh => Doubly_Linked_Object_defs.hh},
+	src/{Doubly_Linked_Object.inlines.hh =>
+	Doubly_Linked_Object_inlines.hh},
+	src/{Doubly_Linked_Object.types.hh =>
+	Doubly_Linked_Object_types.hh}, src/{EList_Iterator.defs.hh =>
+	EList_Iterator_defs.hh}, src/{EList_Iterator.inlines.hh =>
+	EList_Iterator_inlines.hh}, src/{EList_Iterator.types.hh =>
+	EList_Iterator_types.hh}, src/{EList.defs.hh => EList_defs.hh},
+	src/{EList.inlines.hh => EList_inlines.hh}, src/{EList.types.hh =>
+	EList_types.hh}, src/{Expression_Adapter.defs.hh =>
+	Expression_Adapter_defs.hh}, src/{Expression_Adapter.inlines.hh =>
+	Expression_Adapter_inlines.hh}, src/{Expression_Adapter.types.hh =>
+	Expression_Adapter_types.hh}, src/{Expression_Hide_Inhomo.defs.hh
+	=> Expression_Hide_Inhomo_defs.hh},
+	src/{Expression_Hide_Inhomo.inlines.hh =>
+	Expression_Hide_Inhomo_inlines.hh},
+	src/{Expression_Hide_Inhomo.types.hh =>
+	Expression_Hide_Inhomo_types.hh}, src/{Expression_Hide_Last.defs.hh
+	=> Expression_Hide_Last_defs.hh},
+	src/{Expression_Hide_Last.inlines.hh =>
+	Expression_Hide_Last_inlines.hh},
+	src/{Expression_Hide_Last.types.hh =>
+	Expression_Hide_Last_types.hh}, src/Float.cc, src/{Float.defs.hh =>
+	Float_defs.hh}, src/{Float.inlines.hh => Float_inlines.hh},
+	src/{Float.templates.hh => Float_templates.hh},
+	src/{Floating_Point_Expression.defs.hh =>
+	Floating_Point_Expression_defs.hh},
+	src/{Floating_Point_Expression.inlines.hh =>
+	Floating_Point_Expression_inlines.hh},
+	src/{Floating_Point_Expression.templates.hh =>
+	Floating_Point_Expression_templates.hh},
+	src/{Floating_Point_Expression.types.hh =>
+	Floating_Point_Expression_types.hh}, src/{GMP_Integer.defs.hh =>
+	GMP_Integer_defs.hh}, src/{GMP_Integer.inlines.hh =>
+	GMP_Integer_inlines.hh}, src/{GMP_Integer.types.hh =>
+	GMP_Integer_types.hh}, src/Generator.cc, src/Generator_System.cc,
+	src/{Generator_System.defs.hh => Generator_System_defs.hh},
+	src/{Generator_System.inlines.hh => Generator_System_inlines.hh},
+	src/{Generator_System.types.hh => Generator_System_types.hh},
+	src/{Generator.defs.hh => Generator_defs.hh},
+	src/{Generator.inlines.hh => Generator_inlines.hh},
+	src/{Generator.types.hh => Generator_types.hh},
+	src/Grid_Certificate.cc, src/{Grid_Certificate.defs.hh =>
+	Grid_Certificate_defs.hh}, src/{Grid_Certificate.inlines.hh =>
+	Grid_Certificate_inlines.hh}, src/{Grid_Certificate.types.hh =>
+	Grid_Certificate_types.hh}, src/Grid_Generator.cc,
+	src/Grid_Generator_System.cc, src/{Grid_Generator_System.defs.hh =>
+	Grid_Generator_System_defs.hh},
+	src/{Grid_Generator_System.inlines.hh =>
+	Grid_Generator_System_inlines.hh},
+	src/{Grid_Generator_System.types.hh =>
+	Grid_Generator_System_types.hh}, src/{Grid_Generator.defs.hh =>
+	Grid_Generator_defs.hh}, src/{Grid_Generator.inlines.hh =>
+	Grid_Generator_inlines.hh}, src/{Grid_Generator.types.hh =>
+	Grid_Generator_types.hh}, src/Grid_Status.cc,
+	src/{Grid_Status.idefs.hh => Grid_Status_idefs.hh},
+	src/{Grid_Status.inlines.hh => Grid_Status_inlines.hh},
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/{Grid.defs.hh =>
+	Grid_defs.hh}, src/{Grid.inlines.hh => Grid_inlines.hh},
+	src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	src/{Grid.templates.hh => Grid_templates.hh}, src/{Grid.types.hh =>
+	Grid_types.hh}, src/Grid_widenings.cc, src/H79_Certificate.cc,
+	src/{H79_Certificate.defs.hh => H79_Certificate_defs.hh},
+	src/{H79_Certificate.inlines.hh => H79_Certificate_inlines.hh},
+	src/{H79_Certificate.types.hh => H79_Certificate_types.hh},
+	src/{Handler.defs.hh => Handler_defs.hh}, src/{Handler.inlines.hh
+	=> Handler_inlines.hh}, src/{Handler.types.hh => Handler_types.hh},
+	src/Init.cc, src/{Init.defs.hh => Init_defs.hh},
+	src/{Init.inlines.hh => Init_inlines.hh}, src/{Init.types.hh =>
+	Init_types.hh}, src/Integer_Interval.hh, src/{Interval_Info.defs.hh
+	=> Interval_Info_defs.hh}, src/{Interval_Info.inlines.hh =>
+	Interval_Info_inlines.hh}, src/{Interval_Info.types.hh =>
+	Interval_Info_types.hh}, src/{Interval.defs.hh =>
+	Interval_defs.hh}, src/{Interval.inlines.hh =>
+	Interval_inlines.hh}, src/{Interval.templates.hh =>
+	Interval_templates.hh}, src/{Interval.types.hh =>
+	Interval_types.hh}, src/Linear_Expression.cc,
+	src/Linear_Expression_Impl.cc, src/{Linear_Expression_Impl.defs.hh
+	=> Linear_Expression_Impl_defs.hh},
+	src/{Linear_Expression_Impl.inlines.hh =>
+	Linear_Expression_Impl_inlines.hh},
+	src/{Linear_Expression_Impl.templates.hh =>
+	Linear_Expression_Impl_templates.hh},
+	src/{Linear_Expression_Impl.types.hh =>
+	Linear_Expression_Impl_types.hh},
+	src/Linear_Expression_Interface.cc,
+	src/{Linear_Expression_Interface.defs.hh =>
+	Linear_Expression_Interface_defs.hh},
+	src/{Linear_Expression_Interface.types.hh =>
+	Linear_Expression_Interface_types.hh},
+	src/{Linear_Expression.defs.hh => Linear_Expression_defs.hh},
+	src/{Linear_Expression.inlines.hh => Linear_Expression_inlines.hh},
+	src/{Linear_Expression.types.hh => Linear_Expression_types.hh},
+	src/Linear_Form.cc, src/{Linear_Form.defs.hh =>
+	Linear_Form_defs.hh}, src/{Linear_Form.inlines.hh =>
+	Linear_Form_inlines.hh}, src/{Linear_Form.templates.hh =>
+	Linear_Form_templates.hh}, src/{Linear_Form.types.hh =>
+	Linear_Form_types.hh}, src/{Linear_System.defs.hh =>
+	Linear_System_defs.hh}, src/{Linear_System.inlines.hh =>
+	Linear_System_inlines.hh}, src/{Linear_System.templates.hh =>
+	Linear_System_templates.hh}, src/{Linear_System.types.hh =>
+	Linear_System_types.hh}, src/MIP_Problem.cc,
+	src/{MIP_Problem.defs.hh => MIP_Problem_defs.hh},
+	src/{MIP_Problem.inlines.hh => MIP_Problem_inlines.hh},
+	src/{MIP_Problem.templates.hh => MIP_Problem_templates.hh},
+	src/{MIP_Problem.types.hh => MIP_Problem_types.hh},
+	src/Makefile.am, src/{Matrix.defs.hh => Matrix_defs.hh},
+	src/{Matrix.inlines.hh => Matrix_inlines.hh},
+	src/{Matrix.templates.hh => Matrix_templates.hh},
+	src/{Matrix.types.hh => Matrix_types.hh},
+	src/{Multiplication_Floating_Point_Expression.defs.hh =>
+	Multiplication_Floating_Point_Expression_defs.hh},
+	src/{Multiplication_Floating_Point_Expression.inlines.hh =>
+	Multiplication_Floating_Point_Expression_inlines.hh},
+	src/{Multiplication_Floating_Point_Expression.templates.hh =>
+	Multiplication_Floating_Point_Expression_templates.hh},
+	src/{Multiplication_Floating_Point_Expression.types.hh =>
+	Multiplication_Floating_Point_Expression_types.hh},
+	src/NNC_Polyhedron.cc, src/{NNC_Polyhedron.defs.hh =>
+	NNC_Polyhedron_defs.hh}, src/{NNC_Polyhedron.inlines.hh =>
+	NNC_Polyhedron_inlines.hh}, src/{NNC_Polyhedron.types.hh =>
+	NNC_Polyhedron_types.hh}, src/{Numeric_Format.defs.hh =>
+	Numeric_Format_defs.hh}, src/{OR_Matrix.defs.hh =>
+	OR_Matrix_defs.hh}, src/{OR_Matrix.inlines.hh =>
+	OR_Matrix_inlines.hh}, src/{OR_Matrix.templates.hh =>
+	OR_Matrix_templates.hh}, src/{OR_Matrix.types.hh =>
+	OR_Matrix_types.hh}, src/Octagonal_Shape.cc,
+	src/{Octagonal_Shape.defs.hh => Octagonal_Shape_defs.hh},
+	src/{Octagonal_Shape.inlines.hh => Octagonal_Shape_inlines.hh},
+	src/{Octagonal_Shape.templates.hh => Octagonal_Shape_templates.hh},
+	src/{Octagonal_Shape.types.hh => Octagonal_Shape_types.hh},
+	src/{Og_Status.idefs.hh => Og_Status_idefs.hh},
+	src/{Og_Status.inlines.hh => Og_Status_inlines.hh},
+	src/{Opposite_Floating_Point_Expression.defs.hh =>
+	Opposite_Floating_Point_Expression_defs.hh},
+	src/{Opposite_Floating_Point_Expression.inlines.hh =>
+	Opposite_Floating_Point_Expression_inlines.hh},
+	src/{Opposite_Floating_Point_Expression.types.hh =>
+	Opposite_Floating_Point_Expression_types.hh}, src/PIP_Problem.cc,
+	src/{PIP_Problem.defs.hh => PIP_Problem_defs.hh},
+	src/{PIP_Problem.inlines.hh => PIP_Problem_inlines.hh},
+	src/{PIP_Problem.templates.hh => PIP_Problem_templates.hh},
+	src/{PIP_Problem.types.hh => PIP_Problem_types.hh},
+	src/PIP_Tree.cc, src/{PIP_Tree.defs.hh => PIP_Tree_defs.hh},
+	src/{PIP_Tree.inlines.hh => PIP_Tree_inlines.hh},
+	src/{PIP_Tree.types.hh => PIP_Tree_types.hh},
+	src/Partial_Function.cc, src/{Partial_Function.defs.hh =>
+	Partial_Function_defs.hh}, src/{Partial_Function.inlines.hh =>
+	Partial_Function_inlines.hh}, src/{Partial_Function.types.hh =>
+	Partial_Function_types.hh}, src/{Partially_Reduced_Product.defs.hh
+	=> Partially_Reduced_Product_defs.hh},
+	src/{Partially_Reduced_Product.inlines.hh =>
+	Partially_Reduced_Product_inlines.hh},
+	src/{Partially_Reduced_Product.templates.hh =>
+	Partially_Reduced_Product_templates.hh},
+	src/{Partially_Reduced_Product.types.hh =>
+	Partially_Reduced_Product_types.hh}, src/{Pending_Element.defs.hh
+	=> Pending_Element_defs.hh}, src/{Pending_Element.inlines.hh =>
+	Pending_Element_inlines.hh}, src/{Pending_Element.types.hh =>
+	Pending_Element_types.hh}, src/{Pending_List.defs.hh =>
+	Pending_List_defs.hh}, src/{Pending_List.inlines.hh =>
+	Pending_List_inlines.hh}, src/{Pending_List.templates.hh =>
+	Pending_List_templates.hh}, src/{Pending_List.types.hh =>
+	Pending_List_types.hh}, src/Ph_Status.cc, src/{Ph_Status.idefs.hh
+	=> Ph_Status_idefs.hh}, src/{Ph_Status.inlines.hh =>
+	Ph_Status_inlines.hh}, src/Pointset_Ask_Tell.cc,
+	src/{Pointset_Ask_Tell.defs.hh => Pointset_Ask_Tell_defs.hh},
+	src/{Pointset_Ask_Tell.inlines.hh => Pointset_Ask_Tell_inlines.hh},
+	src/{Pointset_Ask_Tell.templates.hh =>
+	Pointset_Ask_Tell_templates.hh}, src/{Pointset_Ask_Tell.types.hh =>
+	Pointset_Ask_Tell_types.hh}, src/Pointset_Powerset.cc,
+	src/{Pointset_Powerset.defs.hh => Pointset_Powerset_defs.hh},
+	src/{Pointset_Powerset.inlines.hh => Pointset_Powerset_inlines.hh},
+	src/{Pointset_Powerset.templates.hh =>
+	Pointset_Powerset_templates.hh}, src/{Pointset_Powerset.types.hh =>
+	Pointset_Powerset_types.hh}, src/Poly_Con_Relation.cc,
+	src/{Poly_Con_Relation.defs.hh => Poly_Con_Relation_defs.hh},
+	src/{Poly_Con_Relation.inlines.hh => Poly_Con_Relation_inlines.hh},
+	src/{Poly_Con_Relation.types.hh => Poly_Con_Relation_types.hh},
+	src/Poly_Gen_Relation.cc, src/{Poly_Gen_Relation.defs.hh =>
+	Poly_Gen_Relation_defs.hh}, src/{Poly_Gen_Relation.inlines.hh =>
+	Poly_Gen_Relation_inlines.hh}, src/{Poly_Gen_Relation.types.hh =>
+	Poly_Gen_Relation_types.hh}, src/Polyhedron_chdims.cc,
+	src/{Polyhedron_chdims.templates.hh =>
+	Polyhedron_chdims_templates.hh},
+	src/{Polyhedron_conversion.templates.hh =>
+	Polyhedron_conversion_templates.hh}, src/{Polyhedron.defs.hh =>
+	Polyhedron_defs.hh}, src/{Polyhedron.inlines.hh =>
+	Polyhedron_inlines.hh}, src/{Polyhedron_minimize.templates.hh =>
+	Polyhedron_minimize_templates.hh}, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/{Polyhedron_simplify.templates.hh =>
+	Polyhedron_simplify_templates.hh}, src/{Polyhedron.templates.hh =>
+	Polyhedron_templates.hh}, src/{Polyhedron.types.hh =>
+	Polyhedron_types.hh}, src/Polyhedron_widenings.cc,
+	src/{Powerset.defs.hh => Powerset_defs.hh},
+	src/{Powerset.inlines.hh => Powerset_inlines.hh},
+	src/{Powerset.templates.hh => Powerset_templates.hh},
+	src/{Powerset.types.hh => Powerset_types.hh},
+	src/{Ptr_Iterator.defs.hh => Ptr_Iterator_defs.hh},
+	src/{Ptr_Iterator.inlines.hh => Ptr_Iterator_inlines.hh},
+	src/{Ptr_Iterator.types.hh => Ptr_Iterator_types.hh},
+	src/Rational_Box.hh, src/Rational_Interval.hh, src/{Result.defs.hh
+	=> Result_defs.hh}, src/{Result.inlines.hh => Result_inlines.hh},
+	src/{Rounding_Dir.defs.hh => Rounding_Dir_defs.hh},
+	src/{Rounding_Dir.inlines.hh => Rounding_Dir_inlines.hh},
+	src/Scalar_Products.cc, src/{Scalar_Products.defs.hh =>
+	Scalar_Products_defs.hh}, src/{Scalar_Products.inlines.hh =>
+	Scalar_Products_inlines.hh}, src/{Scalar_Products.types.hh =>
+	Scalar_Products_types.hh}, src/Sparse_Row.cc,
+	src/{Sparse_Row.defs.hh => Sparse_Row_defs.hh},
+	src/{Sparse_Row.inlines.hh => Sparse_Row_inlines.hh},
+	src/{Sparse_Row.templates.hh => Sparse_Row_templates.hh},
+	src/{Sparse_Row.types.hh => Sparse_Row_types.hh},
+	src/{Sum_Floating_Point_Expression.defs.hh =>
+	Sum_Floating_Point_Expression_defs.hh},
+	src/{Sum_Floating_Point_Expression.inlines.hh =>
+	Sum_Floating_Point_Expression_inlines.hh},
+	src/{Sum_Floating_Point_Expression.templates.hh =>
+	Sum_Floating_Point_Expression_templates.hh},
+	src/{Sum_Floating_Point_Expression.types.hh =>
+	Sum_Floating_Point_Expression_types.hh},
+	src/{Swapping_Vector.defs.hh => Swapping_Vector_defs.hh},
+	src/{Swapping_Vector.inlines.hh => Swapping_Vector_inlines.hh},
+	src/{Swapping_Vector.types.hh => Swapping_Vector_types.hh},
+	src/{Temp.defs.hh => Temp_defs.hh}, src/{Temp.inlines.hh =>
+	Temp_inlines.hh}, src/{Temp.templates.hh => Temp_templates.hh},
+	src/Threshold_Watcher.cc, src/{Threshold_Watcher.defs.hh =>
+	Threshold_Watcher_defs.hh}, src/{Threshold_Watcher.inlines.hh =>
+	Threshold_Watcher_inlines.hh}, src/{Threshold_Watcher.templates.hh
+	=> Threshold_Watcher_templates.hh}, src/{Threshold_Watcher.types.hh
+	=> Threshold_Watcher_types.hh}, src/Time.cc, src/{Time.defs.hh =>
+	Time_defs.hh}, src/{Time.inlines.hh => Time_inlines.hh},
+	src/{Time.types.hh => Time_types.hh}, src/{Topology.types.hh =>
+	Topology_types.hh}, src/Variable.cc,
+	src/{Variable_Floating_Point_Expression.defs.hh =>
+	Variable_Floating_Point_Expression_defs.hh},
+	src/{Variable_Floating_Point_Expression.inlines.hh =>
+	Variable_Floating_Point_Expression_inlines.hh},
+	src/{Variable_Floating_Point_Expression.types.hh =>
+	Variable_Floating_Point_Expression_types.hh}, src/{Variable.defs.hh
+	=> Variable_defs.hh}, src/{Variable.inlines.hh =>
+	Variable_inlines.hh}, src/{Variable.types.hh => Variable_types.hh},
+	src/Variables_Set.cc, src/{Variables_Set.defs.hh =>
+	Variables_Set_defs.hh}, src/{Variables_Set.inlines.hh =>
+	Variables_Set_inlines.hh}, src/{Variables_Set.types.hh =>
+	Variables_Set_types.hh}, src/{WRD_coefficient_types.defs.hh =>
+	WRD_coefficient_types_defs.hh},
+	src/{WRD_coefficient_types.inlines.hh =>
+	WRD_coefficient_types_inlines.hh}, src/Watchdog.cc,
+	src/{Watchdog.defs.hh => Watchdog_defs.hh},
+	src/{Watchdog.inlines.hh => Watchdog_inlines.hh},
+	src/{Watchdog.types.hh => Watchdog_types.hh},
+	src/Weight_Profiler.cc, src/{Weight_Profiler.defs.hh =>
+	Weight_Profiler_defs.hh}, src/{Widening_Function.defs.hh =>
+	Widening_Function_defs.hh}, src/{Widening_Function.inlines.hh =>
+	Widening_Function_inlines.hh}, src/{Widening_Function.types.hh =>
+	Widening_Function_types.hh}, src/algorithms.hh, src/c_streambuf.cc,
+	src/{c_streambuf.defs.hh => c_streambuf_defs.hh},
+	src/{c_streambuf.inlines.hh => c_streambuf_inlines.hh},
+	src/{c_streambuf.types.hh => c_streambuf_types.hh}, src/checked.cc,
+	src/{checked.defs.hh => checked_defs.hh}, src/{checked_ext.defs.hh
+	=> checked_ext_defs.hh}, src/{checked_ext.inlines.hh =>
+	checked_ext_inlines.hh}, src/{checked_float.inlines.hh =>
+	checked_float_inlines.hh}, src/{checked.inlines.hh =>
+	checked_inlines.hh}, src/{checked_int.inlines.hh =>
+	checked_int_inlines.hh}, src/{checked_mpq.inlines.hh =>
+	checked_mpq_inlines.hh}, src/{checked_mpz.inlines.hh =>
+	checked_mpz_inlines.hh}, src/checked_numeric_limits.hh,
+	src/{distances.defs.hh => distances_defs.hh},
+	src/{distances.inlines.hh => distances_inlines.hh},
+	src/{distances.types.hh => distances_types.hh},
+	src/{fpu-c99.inlines.hh => fpu-c99_inlines.hh}, src/fpu-ia32.cc,
+	src/{fpu-ia32.inlines.hh => fpu-ia32_inlines.hh},
+	src/{fpu-none.inlines.hh => fpu-none_inlines.hh},
+	src/{fpu-sparc.inlines.hh => fpu-sparc_inlines.hh},
+	src/{fpu.defs.hh => fpu_defs.hh}, src/{fpu.types.hh =>
+	fpu_types.hh}, src/globals.cc, src/{globals.defs.hh =>
+	globals_defs.hh}, src/{globals.inlines.hh => globals_inlines.hh},
+	src/{globals.types.hh => globals_types.hh}, src/initializer.hh,
+	src/{intervals.defs.hh => intervals_defs.hh},
+	src/{iterator_to_const.defs.hh => iterator_to_const_defs.hh},
+	src/{iterator_to_const.inlines.hh => iterator_to_const_inlines.hh},
+	src/{iterator_to_const.types.hh => iterator_to_const_types.hh},
+	src/linearize.hh, src/{math_utilities.defs.hh =>
+	math_utilities_defs.hh}, src/{math_utilities.inlines.hh =>
+	math_utilities_inlines.hh}, src/max_space_dimension.hh,
+	src/mp_std_bits.cc, src/{mp_std_bits.defs.hh =>
+	mp_std_bits_defs.hh}, src/{mp_std_bits.inlines.hh =>
+	mp_std_bits_inlines.hh}, src/stdiobuf.cc, src/{stdiobuf.defs.hh =>
+	stdiobuf_defs.hh}, src/{stdiobuf.inlines.hh =>
+	stdiobuf_inlines.hh}, src/{stdiobuf.types.hh => stdiobuf_types.hh},
+	src/{swapping_sort.templates.hh => swapping_sort_templates.hh},
+	src/termination.cc, src/{termination.defs.hh =>
+	termination_defs.hh}, src/{termination.templates.hh =>
+	termination_templates.hh}, src/{termination.types.hh =>
+	termination_types.hh}, src/wrap_assign.hh, src/wrap_string.hh,
+	tests/Concrete_Expression/C_Expr.cc,
+	tests/Concrete_Expression/{C_Expr.defs.hh => C_Expr_defs.hh},
+	tests/Concrete_Expression/{C_Expr.inlines.hh => C_Expr_inlines.hh},
+	tests/Concrete_Expression/{C_Expr.types.hh => C_Expr_types.hh},
+	tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearize.cc, tests/Grid/generator1.cc,
+	tests/Grid/generators1.cc, tests/Makefile.am,
+	tests/{Random_Number_Generator.defs.hh =>
+	Random_Number_Generator_defs.hh},
+	tests/{Random_Number_Generator.inlines.hh =>
+	Random_Number_Generator_inlines.hh},
+	tests/{Random_Number_Generator.types.hh =>
+	Random_Number_Generator_types.hh}, tests/ppl_test.hh: Guarantee that
+	header file names are unique as per C++11's 16.2#5.  Detected by
+	ECLAIR service hedrname.
+
+2012-08-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+	src/Constraint.cc, src/Constraint.inlines.hh, src/Dense_Row.cc,
+	src/Expression_Hide_Last.inlines.hh, src/Generator.cc,
+	src/Generator.inlines.hh, src/Generator_System.cc,
+	src/Grid_Generator.inlines.hh, src/Grid_conversion.cc,
+	src/Linear_Expression.inlines.hh, src/Linear_Expression_Impl.cc,
+	src/Linear_Expression_Impl.templates.hh,
+	src/Linear_System.inlines.hh, src/Linear_System.templates.hh,
+	src/MIP_Problem.cc, src/Matrix.templates.hh, src/PIP_Problem.cc,
+	src/Polyhedron_conversion.templates.hh,
+	src/Polyhedron_minimize.templates.hh, src/Polyhedron_public.cc,
+	src/Sparse_Row.cc, src/Sparse_Row.templates.hh: Fixed the code
+	layout for several if-then-elses.
+
+2012-08-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh, src/checked.cc: 
+	Fixed comments that were meant to be Doxygen comments.  Detected by
+	ECLAIR service cmntdecl_srceline.
+
+2012-08-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh: Comment fixed.
+
+2012-08-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Advertise the portability improvements.
+
+2012-08-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am, demos/ppl_pips/Makefile.am,
+	doc/Makefile.am, interfaces/C/Makefile.am,
+	interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am: Avoid a non-portable GNU Make
+	idiom (using `$<' in a non-suffix rule context).
+
+2012-08-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/Congruence.cc, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	src/Expression_Adapter.defs.hh, src/Expression_Adapter.inlines.hh,
+	src/Expression_Adapter.types.hh,
+	src/Expression_Hide_Inhomo.defs.hh,
+	src/Expression_Hide_Inhomo.inlines.hh,
+	src/Expression_Hide_Last.defs.hh,
+	src/Expression_Hide_Last.inlines.hh, src/Generator.defs.hh,
+	src/Generator.inlines.hh, src/Grid.templates.hh,
+	src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	src/MIP_Problem.cc, src/PIP_Tree.cc, src/Polyhedron.templates.hh,
+	src/termination.cc: Modified the Expression_Adapter infrastructure.
+	Prefer the creation of transient, lightweight adapters to the usage
+	of wild reference casts. While at it, improved documentation and
+	systematically renamed `Expression' inner typedefs as `expr_type'.
+
+2012-08-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS, configure.ac, debian/README,
+	demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_pips/ppl_pips.cc, doc/definitions.dox, doc/fdl.txt,
+	interfaces/C/C_interface.dox, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/tests/pip_test.c,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h,
+	interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java, interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Pair.java,
+	interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java,
+	interfaces/Java/tests/Variable_Output_test1.java,
+	interfaces/Java/tests/ppl_java_tests_common,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/Prolog/Ciao/ciao_cfli.hh,
+	interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	interfaces/Prolog/GNU/gprolog_cfli.hh,
+	interfaces/Prolog/Prolog_interface_sysindep.dox,
+	interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	interfaces/Prolog/SICStus/sicstus_cfli.h,
+	interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	interfaces/Prolog/SICStus/sp_clpq.pl,
+	interfaces/Prolog/SICStus/sp_pl_check.pl,
+	interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	interfaces/Prolog/SWI/swi_cfli.hh,
+	interfaces/Prolog/SWI/swi_pl_check.pl,
+	interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	interfaces/Prolog/XSB/xsb_cfli.hh,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/YAP/yap_cfli.hh,
+	interfaces/Prolog/YAP/yap_pl_check.pl,
+	interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+	interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/smm.clpq,
+	interfaces/Prolog/tests/smmdiff.clpq, src/Affine_Space.cc,
+	src/Affine_Space.defs.hh, src/Any_Pointset.defs.hh,
+	src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+	src/BHRZ03_Certificate.inlines.hh, src/Bit_Matrix.cc,
+	src/Bit_Matrix.inlines.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	src/Boundary.defs.hh, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	src/Cast_Floating_Point_Expression.defs.hh, src/Checked_Number.cc,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Congruence.cc, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Constant_Floating_Point_Expression.defs.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint_System.cc,
+	src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+	src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	src/Determinate.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Doubly_Linked_Object.inlines.hh, src/Float.defs.hh,
+	src/Float.inlines.hh, src/Float.templates.hh,
+	src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator_System.cc, src/Generator_System.defs.hh,
+	src/Generator_System.inlines.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+	src/Grid_Generator.inlines.hh, src/Grid_Generator_System.cc,
+	src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/Handler.inlines.hh,
+	src/Has_Assign_Or_Swap.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval.templates.hh,
+	src/Interval_Info.defs.hh, src/Linear_Form.templates.hh,
+	src/Linear_System.templates.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/Og_Status.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/Partial_Function.inlines.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Pending_Element.defs.hh, src/Pending_Element.inlines.hh,
+	src/Pending_List.defs.hh, src/Pending_List.templates.hh,
+	src/Ph_Status.cc, src/Pointset_Ask_Tell.cc,
+	src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.defs.hh,
+	src/Poly_Gen_Relation.defs.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_conversion.templates.hh,
+	src/Polyhedron_minimize.templates.hh, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_simplify.templates.hh,
+	src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	src/Powerset.templates.hh, src/Ptr_Iterator.defs.hh,
+	src/Ptr_Iterator.inlines.hh, src/Scalar_Products.cc,
+	src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh, src/Temp.inlines.hh,
+	src/Threshold_Watcher.defs.hh, src/Threshold_Watcher.inlines.hh,
+	src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variables_Set.cc, src/Watchdog.cc, src/Watchdog.inlines.hh,
+	src/Weight_Profiler.cc, src/Weight_Profiler.defs.hh,
+	src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+	src/checked.defs.hh, src/checked.inlines.hh,
+	src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/distances.inlines.hh,
+	src/fpu-c99.inlines.hh, src/fpu-none.inlines.hh, src/fpu.defs.hh,
+	src/globals.defs.hh, src/globals.inlines.hh, src/intervals.defs.hh,
+	src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	src/linearize.hh, src/math_utilities.defs.hh,
+	src/math_utilities.inlines.hh, src/meta_programming.hh,
+	src/namespaces.hh, src/ppl-config.cc.in, src/termination.cc,
+	src/termination.defs.hh, src/termination.templates.hh,
+	src/wrap_string.cc, src/wrap_string.hh, tests/Ask_Tell/append1.cc,
+	tests/BD_Shape/constrains1.cc, tests/Box/constrains1.cc,
+	tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/polyhedron2.cc,
+	tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	tests/Grid/addconstraint1.cc, tests/Grid/addgenerator1.cc,
+	tests/Grid/addgenerators1.cc, tests/Grid/approximatepartition1.cc,
+	tests/Grid/bounds1.cc, tests/Grid/congruences2.cc,
+	tests/Grid/generalizedaffineimage1.cc,
+	tests/Grid/generalizedaffineimage2.cc,
+	tests/Grid/generalizedaffineimage3.cc,
+	tests/Grid/generalizedaffinepreimage1.cc,
+	tests/Grid/generalizedaffinepreimage2.cc,
+	tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/grid1.cc,
+	tests/Grid/intersection1.cc, tests/Grid/maxmin1.cc,
+	tests/Grid/membytes1.cc, tests/Grid/partition1.cc,
+	tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	tests/Grid/relations3.cc, tests/MIP_Problem/exceptions1.cc,
+	tests/MIP_Problem/mipproblem1.cc, tests/MIP_Problem/mipproblem2.cc,
+	tests/MIP_Problem/mipproblem3.cc,
+	tests/Octagonal_Shape/constrains1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addgenerator2.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/addspacedims1.cc,
+	tests/Polyhedron/addspacedims2.cc,
+	tests/Polyhedron/affineimage1.cc,
+	tests/Polyhedron/affinepreimage1.cc, tests/Polyhedron/append1.cc,
+	tests/Polyhedron/append2.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bhrz03widening1.cc,
+	tests/Polyhedron/bhrz03widening3.cc,
+	tests/Polyhedron/bhz03widening1.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/boundedaffinepreimage1.cc,
+	tests/Polyhedron/boundedh79extrapolation1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/disjoint2.cc,
+	tests/Polyhedron/dualhypercubes.cc,
+	tests/Polyhedron/exceptions3.cc,
+	tests/Polyhedron/expandspacedim1.cc,
+	tests/Polyhedron/generalizedaffineimage1.cc,
+	tests/Polyhedron/generalizedaffineimage2.cc,
+	tests/Polyhedron/generalizedaffinepreimage1.cc,
+	tests/Polyhedron/generalizedaffinepreimage2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/hybrid.cc,
+	tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/limitedh79extrapolation1.cc,
+	tests/Polyhedron/linearpartition1.cc,
+	tests/Polyhedron/linearsystem1.cc, tests/Polyhedron/matrix1.cc,
+	tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/membytes1.cc,
+	tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	tests/Polyhedron/minconstraints2.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/numberinput1.cc,
+	tests/Polyhedron/permute.cc, tests/Polyhedron/polyhull1.cc,
+	tests/Polyhedron/polyhullifexact1.cc,
+	tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/refinewithcongruence1.cc,
+	tests/Polyhedron/refinewithcongruences1.cc,
+	tests/Polyhedron/refinewithconstraint1.cc,
+	tests/Polyhedron/refinewithconstraints1.cc,
+	tests/Polyhedron/relations3.cc,
+	tests/Polyhedron/removespacedims1.cc,
+	tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+	tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/Powerset/difference1.cc,
+	tests/Powerset/powerset1.cc, tests/ppl_test.cc, tests/ppl_test.hh,
+	utils/timings.cc: Do not use TABs for code layout.  Detected by
+	ECLAIR service tabindnt.
+
+2012-08-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+	src/Polyhedron_conversion.templates.hh,
+	src/Polyhedron_minimize.templates.hh: Avoided som implicit integral
+	conversion that changed the signedness of the underlying type.
+	Detected by ECLAIR service utypflag.
+
+2012-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc: Unwanted recursion removed.  Detected by ECLAIR
+	service funrecsn.
+
+2012-08-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc: Prefer explicit cast to implicit narrowing
+	conversion.  Detected by ECLAIR service utypflag.
+
+2012-08-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: Added helper method
+	insert_precise_aux to avoid recursive call.  Detected by ECLAIR
+	service funrecsn.
+
+2012-08-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh: Added several missing <CODE> tags in
+	Doxygen comments.
+
+2012-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc: Unwanted recursion removed.  Detected by ECLAIR
+	service funrecsn.
+
+2012-08-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Box.defs.hh,
+	src/Concrete_Expression.defs.hh, src/Concrete_Expression.types.hh,
+	src/Determinate.defs.hh, src/Floating_Point_Expression.defs.hh,
+	src/Handler.defs.hh, src/Octagonal_Shape.defs.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Pointset_Powerset.defs.hh, src/Result.defs.hh,
+	src/Rounding_Dir.defs.hh, src/WRD_coefficient_types.defs.hh,
+	src/globals.types.hh, src/termination.defs.hh: Fixed several minor
+	documentation issues.
+
+2012-08-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Expression_Adapter.defs.hh: Use PPL_U when macro parameters
+	are used as template type arguments.
+
+2012-08-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc: Avoid outer-scope name hiding.  Detected by
+	ECLAIR service declhidn.
+
+2012-08-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression_Impl.templates.hh, src/termination.cc: Avoid
+	outer-scope name hiding.  Detected by ECLAIR service declhidn.
+
+2012-08-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh: Indentation
+	fixed.  Detected by ECLAIR service indntion.
+
+2012-08-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Avoid implicit floating-integral
+	conversions.  Detected by ECLAIR service utypflag.
+
+2012-08-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Integer.hh: Do not let constant unsigned integer expressions
+	wrap-around.  Detected by ECLAIR service cnstwrap.
+
+2012-08-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Expression_Adapter.defs.hh: Use a standard comment header
+	block.  Detected by ECLAIR service cmntfile.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Literals fixed.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.defs.hh: Comment improved.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh, src/Linear_System.templates.hh: Do not use
+	comments to "comment out" code.  Detected by ECLAIR service
+	cmntdout.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Expression_Adapter.types.hh: Use a standard comment header
+	block.  Detected by ECLAIR service cmntfile.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Code should not be on the same line
+	as a null statement.  Detected by ECLAIR service nullstmt.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Do not use C-style casts.  Detected
+	by ECLAIR service castexpr.
+
+2012-08-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh: Detected by ECLAIR service inclmixd.
+
+2012-08-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Expression_Hide_Inhomo.defs.hh,
+	src/Expression_Hide_Inhomo.inlines.hh, src/Generator.defs.hh: Fixed
+	a couple of name hiding issues in Expression_Hide_Inhomo adapter.
+	This commit is meanto to be part of
+	9e4c9c57ae8ffca73bb9ee6c75a43d6ed6cd4096
+
+2012-08-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/C_Polyhedron.cc, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	src/Expression_Adapter.defs.hh, src/Expression_Adapter.inlines.hh,
+	src/Expression_Adapter.types.hh,
+	src/Expression_Hide_Inhomo.defs.hh,
+	src/Expression_Hide_Inhomo.inlines.hh,
+	src/Expression_Hide_Inhomo.types.hh,
+	src/Expression_Hide_Last.defs.hh,
+	src/Expression_Hide_Last.inlines.hh,
+	src/Expression_Hide_Last.types.hh, src/Generator.cc,
+	src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_widenings.cc,
+	src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	src/Linear_Expression.inlines.hh,
+	src/Linear_Expression_Impl.defs.hh,
+	src/Linear_Expression_Impl.templates.hh, src/Makefile.am,
+	src/Octagonal_Shape.templates.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.templates.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Polyhedron_widenings.cc, src/Scalar_Products.cc,
+	src/termination.cc, tests/Grid/congruence1.cc,
+	tests/Grid/generator1.cc, tests/Grid/partition1.cc,
+	tests/Polyhedron/bhrz03widening3.cc, tests/Polyhedron/disjoint1.cc,
+	tests/Polyhedron/disjoint2.cc: Changed the way of accessing the
+	underlying expression in classes Constraint, Generator, Congruence
+	and Grid_Generator.  The public methods expression() systematically returns (a const
+	reference to) an expression adapter derived from template
+	Expression_Adapter (including Expression_Hide_Inhomo and
+	Expression_Hide_Last). These adapters provide a *read-only*
+	interface enabling most (but not all) of the operations that can be
+	performed on a Linear_Expression.  Added four templatic constructors to Linear_Expression accepting any
+	such adapter. Removed a dozen specific constructors that were
+	tailored to the four classes Constraint, Generator, Congruence and
+	Grid_Generator.  As a consequence previous code such as     Linear_Expression expr(gen); will no longer compile and should
+	    be replaced by Linear_Expression expr(gen.expression()); The systematic use of the new adapters, besides removing some
+	indirections, also decreases the memory overhead of classes
+	Constraint, Generator and Grid_Generator, as we no longer need
+	members `wrapped_expr' and `semi_wrapped_expr'.  While at it, corrected a few latent bugs in adapter
+	Expression_Hide_Inhomo (these could not manifest as real failures
+	because currently the Hide_Inhomo adapter is always re-wrapped using
+	the Expression_Hide_Last adapter).
+
+2012-08-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2012-08-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Added a few recent changes regarding the Java language
+	interface.
+
+2012-08-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java, interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java,
+	interfaces/Java/tests/Custom_Variable_Stringifier.java: A couple of
+	  changes to the Java interface: - Variable's id are of long type (like space dimension arguments);   - added NOT_EQUAL value to enumeration Relation_Symbol.
+
+2012-08-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Makefile.am: Updated.
+
+2012-08-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/tests/Custom_Variable_Stringifier.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/Variable_Output_test1.java: Added test class
+	Custom_Variable_Stringifier and corresponding example for testing
+	customization of Variable output in the Java interface.
+
+2012-08-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Variable.java: Added native
+	methods toString() and setStringifier() to class Variable.
+	Implemented variable output function using the customizable
+	stringifier.
+
+2012-08-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java: 
+	Added Variable_Stringifier interface.
+
+2012-08-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh: The default output function for Variable's
+	objects made public.  There is no actual reason to have it private:
+	being public, we simplify the life of a user willing to set it back
+	to default.
+
+2012-07-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java, interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/PPL_Test.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/ppl_java_tests_common: Use ArrayList instead
+	of Vector for (constraints, ...) systems in Java.  Added a paragraph
+	to the introduction of the user manual to stress that the PPL
+	*_System classes extend ArrayList.  While at it, removed many
+	useless import directives.  Also fixed a couple of indentation
+	issues.
+
+2012-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, src/Makefile.am: Avoid a non-portable GNU Make idiom
+	(using $< in a non-suffix rule context).
+
+2012-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Concrete_Expression/polyhedron2.cc: Changed test04 to print
+	more info when noisy.
+
+2012-06-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Use std::floor() and std::frexp()
+	instead of floorl() and frexpl(), respectively.
+
+2012-06-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am: Typo fixed.
+
+2012-06-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Typo fixed.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Spurious blank line removed.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added AmatoPS12.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Updated.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Work around a Doxygen bug.  Stick to ASCII.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: More PPL citations.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Stick to ASCII.
+
+2012-06-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure: Added a section on README.configure describing
+	dense/sparse row choices.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: More PPL citations.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: New PPL citations.
+
+2012-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_ci_prolog_manual: Redundant script removed.
+
+2012-06-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-language-interface.doxyconf.in,
+	doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+	doc/user.doxyconf-latex.in: Upgraded doxygen configuration files to
+	version 1.8.1.1.
+
+2012-06-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Sparse_Row.defs.hh: Avoid useless namespace closing and
+	reopening.
+
+2012-06-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Improved section announcing sparse/dense row representation
+	adoption.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, compile, config.guess, config.sub, depcomp, install-sh,
+	missing, mkinstalldirs: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+	doc/ppl-config_extra_man_text: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Notes fixed.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraMPZ12IC has just been published.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_pips/ppl_pips.1, doc/ppl-config.1: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README: Updated.
+
+2012-06-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am: Unconditionally distribute the man
+	page.
+
+2012-06-26  Abramo Bagnara <abramo.bagnara at bugseng.com>
+
+	* tests/Polyhedron/randphull1.cc: Fixed fpu rounding set/restore.
+
+2012-06-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Dense_Row.defs.hh, src/Expression_Hide_Inhomo.defs.hh,
+	src/Expression_Hide_Last.defs.hh, src/Linear_Expression.defs.hh,
+	src/Linear_Expression_Impl.defs.hh,
+	src/Linear_Expression_Interface.defs.hh, src/Matrix.defs.hh,
+	src/Sparse_Row.defs.hh, src/Swapping_Vector.defs.hh: Use macro
+	PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS to exclude several
+	classes/functions from user documentation.  While at it, also wrap
+	several long lines.
+
+2012-06-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Version bumped.
+
+2012-06-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/watchdog1.cc: Indentation fixed.
+
+2012-06-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc: Cater for systems where Watchdog
+	objects are not supported.
+
+2012-06-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.inlines.hh: Removed a
+	couple of typedefs.  These have become useless (and confusing) after
+	the merge of sparse_matrices.
+
+2012-06-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh, src/Swapping_Vector.defs.hh: Fixed
+	another couple of Doxygen warnings.
+
+2012-06-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh, src/Linear_System.defs.hh: Fixed
+	several Doxygen warnings.
+
+2012-06-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Init.defs.hh: Typo in documentation fixed.
+
+2012-06-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh: Long source lines avoided.
+
+2012-06-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh: Test restored.
+
+2012-06-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc, tests/Box/membytes1.cc,
+	tests/Polyhedron/randphull1.cc: Restore the pre-PPL rounding mode
+	before using libm functions.
+
+2012-06-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.defs.hh: Documentation of restore_pre_PPL_rounding()
+	extended.
+
+2012-06-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Updated.
+
+2012-06-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/m4.m4: Message improved.
+
+2012-06-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: Fixed a couple of Doxygen references.
+
+2012-06-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mentioned a bug corrected.
+
+2012-06-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Fixed copy-and-paste mistake.  (Thanks to
+	Christian Luidolt.)
+
+2012-05-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: Fixed
+	a bug affecting method contains() of weakly-relational shapes.
+
+2012-05-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/contains1.cc, tests/Octagonal_Shape/contains1.cc: 
+	Added tests showing a bug in method contains() of weakly-relational
+	shapes.  Method returns a wrong result when the shape is empty and the other
+	argument is not empty. Tests are based on a bug report from Gianluca
+	Amato.
+
+2012-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Links fixed.
+
+2012-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention a recently fixed bug in the PIP solver.
+
+2012-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh: Properly match #endif's directives using
+	comments.
+
+2012-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Watchdog.inlines.hh: Inclusions reordered to match the PPL
+	coding standard.
+
+2012-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.inlines.hh: Added missing inclusion of <stdexcept>.
+
+2012-05-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Recompute the sign of the special_equality_row
+	after modyfying it.  This fixes the bug shown by test04() in
+	tests/PIP_Problem/pipproblem3.cc.
+
+2012-05-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem3.cc: Added a new test showing a bug
+	in PIP_Problem.  The test was reduced from a slightly bigger one
+	provided by Fred Mesnard.
+
+2012-05-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression_Impl.defs.hh,
+	src/Linear_Expression_Impl.inlines.hh: Make sure template
+	specializations are declared.
+
+2012-05-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Linear_System.inlines.hh,
+	src/Linear_System.templates.hh, src/Swapping_Vector.inlines.hh,
+	src/swapping_sort.templates.hh: Avoid implicit conversions changing
+	integer signedness.  Detected by ECLAIR service utypflag.
+
+2012-05-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.inlines.hh, src/Linear_Expression_Impl.templates.hh: 
+	Fixed indentation.  Detected by ECLAIR service indntion.
+
+2012-05-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc: Avoid C-style casts.  Detected by ECLAIR service
+	castexpr.
+
+2012-05-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh, src/Linear_Expression.cc,
+	src/Linear_Expression_Impl.templates.hh: Prefer PPL_UNREACHABLE to
+	PPL_ASSERT(false).
+
+2012-05-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/Grid_Generator_System.inlines.hh: Avoid redundant explicit
+	casts.  Detected by ECLAIR service castexpr.
+
+2012-05-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.inlines.hh: Avoid unsigned integer wrap-around in
+	constant expressions.  Detected by ECLAIR service cnstwrap.
+
+2012-05-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/OR_Matrix.templates.hh: Prefer parentheses to
+	excessive reliance on C++ operator precedence rules.  Detected by
+	ECLAIR service exprprns.
+
+2012-05-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc: Reduced scope of local variable.  Detected
+	by ECLAIR service minscope.
+
+2012-05-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_simplify.cc: Fixed comment about case-block termination.
+	Detected by ECLAIR service swchsynt.
+
+2012-05-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.templates.hh: Fixed file comment block.
+	Detected by ECLAIR service cmntfile.
+
+2012-05-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* README, m4/Makefile.am, m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+	m4/ac_cxx_float_exact_output.m4,
+	m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4, src/checked.cc,
+	src/checked.defs.hh, src/checked_float.inlines.hh,
+	src/checked_mpq.inlines.hh: Avoid use C++ library for exact
+	conversion from floating point numbers to string: the library is
+	free to ignore requested precision.
+
+2012-04-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Expression_Hide_Inhomo.defs.hh,
+	src/Expression_Hide_Inhomo.inlines.hh,
+	src/Expression_Hide_Inhomo.types.hh,
+	src/Expression_Hide_Last.defs.hh,
+	src/Expression_Hide_Last.inlines.hh, src/Linear_Expression_Impl.cc,
+	src/Linear_Expression_Impl.defs.hh,
+	src/Linear_Expression_Impl.inlines.hh,
+	src/Linear_Expression_Impl.templates.hh,
+	src/Linear_Expression_Impl.types.hh,
+	src/Linear_Expression_Interface.defs.hh,
+	src/Linear_System.templates.hh, src/Matrix.inlines.hh,
+	src/Polyhedron_chdims.templates.hh, src/Swapping_Vector.defs.hh,
+	src/Swapping_Vector.inlines.hh: Updated copyright years.
+
+2012-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int16_a,
+	demos/ppl_lpsol/expected_int8_a,
+	interfaces/Prolog/tests/expected_pchk_int8_a: Corrected expected
+	results for (overflowing) tests on bounded coefficients.
+
+2012-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int16_a: Changed sign of
+	overflow in 16-bits Prolog test.
+
+2012-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundedh79extrapolation1.cc: test01() no longer
+	overflows with 8-bits and assertions on C polyhedra.
+
+2012-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc: test09() no longer
+	overflows with 8-bit coefficients and assertions on.
+
+2012-04-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/globals.defs.hh: Fixed typo.
+
+2012-04-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/assert.hh, src/globals.cc, src/globals.defs.hh,
+	src/globals.inlines.hh: Protect in_assert flag from exceptions.
+
+2012-04-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int16: Another test where
+	we get an overflow with changed sign.
+
+2012-04-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int8,
+	interfaces/Prolog/tests/expected_pchk_int8: Sign of overflow has
+	changed.
+
+2012-04-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/wrap1.cc: test14() overflows with 16 bit integers and
+	assertions turned off.
+
+2012-04-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc: test16() overflows on 16 bits even
+	with assertions turned off.
+
+2012-04-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int32: Test sampleh7.ine no longer causes
+	an overflow.
+
+2012-04-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Allow for Prolog exception
+	errors to have message functor ppl_length_error.
+
+2012-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2012-04-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Sparse_Row.cc: Weaken assertion in mixed Sparse-Dense
+	linear_combine().  (Note: they can be called in
+	Constraint_System::affine_preimage() with a second argument row with
+	a smaller size than the first one; see e.g.  test02() in
+	tests/Concrete_Expression/polyhedron1.cc).  a call in
+	Constraint_System::affine_preimage()).
+
+2012-04-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Sparse_Row.cc: Wrap a few long lines.
+
+2012-04-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* : commit c098c056b375b809087be22be43abf29ee516d63 Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Mon Apr 16 22:04:46 2012
+	+0200
+
+2012-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Updated.
+
+2012-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README, demos/ppl_lcdd/ppl_lcdd.1,
+	demos/ppl_lpsol/ppl_lpsol.1, demos/ppl_pips/ppl_pips.1,
+	doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1: Updated.
+
+2012-04-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/Prolog/Prolog_interface_sysindep.dox: Minor corrections
+	in the documentation for set_deterministic_timeout.
+
+2012-04-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Updated.
+
+2012-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am: The Intel C/C++ compiler does not
+	support -pedantic.
+
+2012-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, demos/ppl_lpsol/Makefile.am: The Intel C/C++
+	compiler does not support -pedantic.
+
+2012-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Typo fixed.  Version number bumped.
+
+2012-04-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/weightwatch1.cc: Test PIP_Problem/weightwatch1
+	requires unbounded coefficients.
+
+2012-04-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Prolog_interface_sysindep.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	src/Threshold_Watcher.inlines.hh, src/globals.defs.hh,
+	src/globals.inlines.hh: Modified signature of function
+	set_deterministic_timeout().
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/Prolog/ppl_prolog_common.cc: Fixed a bug in the
+	Prolog interface whereby predicate ppl_set_deterministic_timeout/1.
+	It was flagging arguments bigger than 4294967295 as erroneous.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: Revert "The function
+	ppl_set_deterministic_timeout() in the C interface now takes an
+	unsigned long long parameter." This reverts commit 7781b2d72ad31906c830a16a942b31ac305924c2.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/OCaml/OCaml_interface.dox,
+	interfaces/Prolog/Prolog_interface_sysindep.dox: Substituted "alpha
+	testing" with "beta testing".
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: The function
+	ppl_set_deterministic_timeout() in the C interface now takes an
+	unsigned long long parameter.  It erroneously used to take an
+	unsigned int.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Profiled.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/Makefile.am, tests/PIP_Problem/{bug1.cc =>
+	weightwatch1.cc}: New test program.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc: Comments improved.
+
+2012-04-07  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Linear_Row.cc: Ignore always unhandled bits.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/Makefile.am: Cleaned.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Avoid using @ outside BibTex entries.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Avoid using @ outside BibTex entries.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Missing comma added.
+
+2012-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib, doc/ppl_citations.bib: Avoid non-ASCII characters.
+
+2012-04-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Added calls to WEIGHT macros.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Weight computation fixed and adjusted.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assert.cc: Let ppl_unreachable_msg() print a more sensible
+	message.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assert.hh: Punctuation fixed.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assert.cc: Mimic the message given by standard assert.
+
+2012-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/assert.hh: Added a comment to clarify definition of
+	PPL_ASSERT.
+
+2012-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/assert.cc, src/assert.hh: Improved error message reporting for
+	assertion failures.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh: Reordered so as to allow compilability with
+	-DPPL_PROFILE_ADD_WEIGHT=1.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Weight_Profiler.cc: Variable name fixed.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Threshold_Watcher.defs.hh: Reference to no longer existing
+	namespace removed.  (Wonder why we did not have a Doxygen warning.)
+
+2012-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Row.inlines.hh: Clarified reason of assertion failing
+	by adding a message.
+
+2012-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Row.cc: When dumping Linear_Row::Flags with assertions
+	turned off, force the (unavailable) rpi/nnc validity bits as "set".
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Do not use #define without a value.
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/bug1.cc: The given problem is not satisfiable
+	(independently verified with other solvers).
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/Makefile.am, tests/PIP_Problem/bug1.cc,
+	tests/PIP_Problem/bug1.dat: Make it easier to reproduce issue [PPL
+	0000353].
+
+2012-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Use add_mul_assign().
+
+2012-04-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Function renamed and documented.
+
+2012-04-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Indentation fixed.
+
+2012-04-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Indentation fixed.
+
+2012-04-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/bug1.dat: Set the validity bits.
+
+2012-04-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/bug1.cc, tests/PIP_Problem/bug1.dat: To
+	reproduce Mantis issue [PPL 0000353].
+
+2012-04-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/Grid.defs.hh, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron_public.cc: Made several exception thrower methods
+	static.  Renamed throw_generic() as throw_invalid_argument() for
+	consistency.  In generalized_affine_{pre}image(), systematically
+	throw an invalid argument exception if relsym == NOT_EQUAL.
+	Corrected several inaccuracies in exception error messages.
+
+2012-04-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Corrected typo.
+
+2012-04-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, doc/Makefile.am: Distribute the bibliographies.
+
+2012-04-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib, doc/ppl_citations.bib: Added copyright and licensing
+	information.
+
+2012-04-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, src/Makefile.am: Updated.
+
+2012-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron_public.cc: Removed two unused and unwanted methods.
+	(They were also wrongly implemented.)
+
+2012-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraMPZ12IC.
+
+2012-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraMPZ12TR.
+
+2011-09-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Broken link removed.
+
+2011-09-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Links fixed.
+
+2011-09-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Links fixed.
+
+2011-09-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Broken links removed.
+
+2011-09-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: URI's updated.
+
+2010-11-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Andre10.
+
+2010-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Fixed CousotC79.
+
+2010-04-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ10CGTA has been published.
+
+2010-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added BandaG10.
+
+2010-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraMPZ10TR.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added BozgaGI09.
+
+2010-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added FeautrierCB07.
+
+2010-02-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added TrifunovicCEFG+10.
+
+2010-01-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ09CGTA renamed and completed.
+
+2010-01-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ10FMSD renamed and completed.
+
+2010-01-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added Feautrier88.
+
+2010-01-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Updated BagnaraHZ10FMSD.
+
+2009-12-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added FagesR09 and JhalaM09.
+
+2009-10-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added the online version of BagnaraHZ09CGTA.
+
+2009-10-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Completed BagnaraHZ09TCS.
+
+2009-09-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ09CGTA.
+
+2009-09-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ09TCS completed.
+
+2009-08-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Improved BagnaraHZ09TCS and BagnaraHZ09FMSD. Added
+	BagnaraHZ09TRb.
+
+2009-08-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Typo fixed.
+
+2009-08-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ09TCS updated.
+
+2009-07-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added PerezRS09.
+
+2009-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added JeannetM09.
+
+2009-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Halbwachs93 completed.
+
+2009-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ09 updated and renamed BagnaraHZ09FMSD.
+
+2009-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added LimeRST09.
+
+2009-06-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: URL added.
+
+2009-06-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added RizkBFS09.
+
+2009-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ09 will be published in Formal Methods in
+	System Design.
+
+2009-05-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added LeconteB06.
+
+2009-05-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added SenS07TR.
+
+2009-04-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added LogozzoF08.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ09TRa updated.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Updated BagnaraHZ09TRa.
+
+2009-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added URI for arXiv.
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added YangWGI09. Non-ASCII characters
+	removed.
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added AlbertACGPZ08.
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ09TRa.
+
+2009-04-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added MoserKK07. Entries sorted. Some
+	specifications of page numbers fixed.
+
+2009-04-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Added bibtex entry for BagnaraHZ09 (submitted for
+	publication).
+
+2009-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added BandaG09. Used the right kind of dash
+	in other entries.
+
+2009-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Frehse08.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added AlbertAGPZ08.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added DenmatGD07.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added KimGR07.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: GulwaniL-AS09 updated.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: AlurKRS08 updated.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added AlbertAGP08.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added MakhloufK06.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BjorndalenA05.
+
+2009-01-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added PopeeaC08.
+
+2009-01-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added BramanM08.
+
+2009-01-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added ChenMC08.
+
+2009-01-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Entries reordered.
+
+2009-01-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added LavironL09.
+
+2009-01-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GulwaniL-AS09.
+
+2009-01-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ09TCS.
+
+2008-12-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added TraonouezLR08.
+
+2008-11-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Added BemporadFT00TR and BemporadFT01.
+
+2008-11-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Use \url instead of \tt.
+
+2008-11-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added QuillereRW00.
+
+2008-10-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Several corrections to BlanchetCCFMMMR02.
+
+2008-10-27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Added reference to the paper by Blanchet et al that
+	proposes the widening with thresholds (2002).
+
+2008-10-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Soffia08TR.
+
+2008-09-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Vasconcelos08th.
+
+2008-08-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Removed note from BagnaraHZ08SCP.
+
+2008-08-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added AlurKRS08.
+
+2008-07-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added BouchyFL08.
+
+2008-07-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ08SCP completed.
+
+2008-06-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added Warren03.
+
+2008-06-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added SenS07.
+
+2008-06-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added RepsBL06.
+
+2008-06-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added SimonK07.
+
+2008-04-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Added bibliographic entry HenkinMT71 (to be double
+	checked).
+
+2008-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added PayetS07th.
+
+2008-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: GopanR07a completed.
+
+2008-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Gopan07th.
+
+2008-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Gobert07th.
+
+2008-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added SankaranarayananIG07. Completed
+	GopanR07b.
+
+2008-02-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ08 renamed BagnaraHZ08SCP (the paper to
+	appear on Science of Computer Programming). New paper BagnaraHZ08
+	(the VMCAI 2008 paper).
+
+2008-02-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Henriksen07th.
+
+2007-08-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Starynkevitch07 completed.
+
+2007-08-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Starynkevitch07.
+
+2007-08-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ08.
+
+2007-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added YangWGI06.
+
+2007-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GopanR07a.
+
+2007-07-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GopanR07b.
+
+2007-07-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GobertLC07.
+
+2007-07-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: CovaFBV06 completed.
+
+2007-07-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added SankaranarayananISG06.
+
+2007-06-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Doyen06th.
+
+2007-06-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Typo fixed.
+
+2007-06-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added SlaninaSSM07TR.
+
+2007-06-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ07TRb completed.
+
+2007-06-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Typo fixed.
+
+2007-06-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Vigna07.
+
+2007-06-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added ArmandoBM07.
+
+2007-06-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ07TRb (still incomplete).
+
+2007-06-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Renamed.
+
+2007-06-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ07TR renamed BagnaraHZ07TRa.
+
+2007-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraDHMZ07 completed.
+
+2007-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Revised Ricci02th.
+
+2007-02-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: DoyenHR05 added. Formed DoyenHR05 now has
+	key DoyenHR05TR.
+
+2007-01-19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Added volume number for BagnaraDHMZ07
+
+2007-01-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ07TR.
+
+2007-01-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Fixed Frehse05.
+
+2007-01-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Fixed StoerW70.
+
+2007-01-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added FrankM02th. Completed Flexeder05th.
+
+2007-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: FrehseKRM05 replaced by FrehseKRM06.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added a PDF URL to BagnaraHZ06TR.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Flexeder05th.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added ChakrabortyMS06.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added CovaFBV06.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: AsarinDFGLGM06 is no longer "to appear."
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Completed vanHeeOSV06.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: HenriksenG06 completed.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: GopanR06 completed.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: GonnordH06 completed.
+
+2006-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: SongCR05 rekeyed SongCR06, corrected and
+	completed.
+
+2006-12-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ06STTT completed.
+
+2006-12-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraDHMZ05TR.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Missing comma added.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraDHMZ06a substituted by BagnaraDHMZ07.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: HalbwachsMG06 completed.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Typo fixed.
+
+2006-12-18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Updated BagnaraDHMZ06a and BagnaraDHMZ06b entries.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ06STTT updated.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Typo fixed.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ06TR corrected and completed.
+
+2006-12-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Key BagnaraHZ04TRa changed to BagnaraHZ04TR.
+	Provisional entry for BagnaraHZ06TR added. Do not use double quotes
+	for numeric fields.
+
+2006-12-18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl_citations.bib: Spelling corrected.
+
+2006-12-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added NakanishiJPF99 and NakanishiF01.
+
+2006-12-11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Previous references added removed.
+
+2006-12-11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Revised the reference for BagnaraDHMZ06a.  Added references for AlurCHHHNOSY95, AlurCHH93, and Henzinger96.
+
+2006-09-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Avoid non-ASCII characters.
+
+2006-09-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib, doc/ppl_citations.bib: Spelling corrections.
+
+2006-09-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added GoldfarbR77.
+
+2006-09-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added PapadimitriouS98.
+
+2006-09-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added AsarinDFGLGM06.
+
+2006-08-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: HalbwachsMP-V03 fixed (copy and paste
+	mistake).
+
+2006-08-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added UchoaFLPPdAA06TR.
+
+2006-08-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GonnordH06.
+
+2006-08-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added HalbwachsMG06.
+
+2006-08-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added HenriksenG06.
+
+2006-08-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added abstracts for Avery06,
+	CarloniPPS-V06, GulavaniR06 and Pop06.
+
+2006-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added CarloniPPS-V06.
+
+2006-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Pop06.
+
+2006-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Avery06.
+
+2006-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GulavaniR06.
+
+2006-06-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GopanR06.
+
+2006-04-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Corrected a spelling error.
+
+2006-04-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Fixed Ancourt91th.
+
+2006-04-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added DooseM05.
+
+2006-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: MesnardB05TPLP fixed.
+
+2006-04-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Capitalization fixed in the references about
+	`polymake'.
+
+2006-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added vanHeeOSV06.
+
+2006-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added Ellenbogen04th.
+
+2006-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added SankaranarayananSM06.
+
+2006-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added SankaranarayananCSM06.
+
+2006-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Minor formatting change.
+
+2006-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: GopanDMDRS04 was missing the address field: added.
+
+2006-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added Ricci02th.
+
+2006-04-14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Added bib entries for Grid papers submitted to FM and
+	about to be sub,itted to LOPSTR. Note that the link on my site to
+	the postscript for the LOPSTR submission is deliberately unreadable
+	until the actual submission.
+
+2006-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: FrehseKR06 fixed.
+
+2006-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ05STTT renamed BagnaraHZ06STTT; year field
+	changed to 2006.
+
+2006-04-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added KhachiyanBBEG06.
+
+2006-01-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added FrehseKR06.
+
+2006-01-20  Andrea Pescetti <pescetti at no.email>
+
+	* doc/ppl.bib: Broken and obsolete links updated.
+
+2006-01-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib, doc/ppl_citations.bib: Added ISBN for the SAS 2005
+	volume.
+
+2006-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Trailing blanks removed.
+
+2006-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Missing comma added.
+
+2006-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraDHMZ05TR.pdf.
+
+2005-09-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Ancourt91th completed.
+
+2005-09-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Fixed many broken or redirected links.
+
+2005-09-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Frehse05th added.
+
+2005-09-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: CacheraM-A05 added.
+
+2005-09-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added DoyenHR05.
+
+2005-09-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added LagoonMS03.
+
+2005-09-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: KruegelKMRV05 added.
+
+2005-09-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added FrehseKRM05.
+
+2005-09-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: SongCR05 added.
+
+2005-09-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: BagnaraR-CZ05 completed.
+
+2005-09-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Completed the bibliographic information for
+	BagnaraHRZ05SCP.
+
+2005-09-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added HuelsbergenHL90.
+
+2005-09-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Completed the entry for BagnaraHZ05FAC.
+
+2005-08-05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Added 1997 paper by Quinton et al.
+
+2005-05-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Address added to CousotC76.
+
+2005-05-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Unwanted quotes removed.
+
+2005-05-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Conflict removed.
+
+2005-05-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Frehse05 completed.
+
+2005-05-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHZ05FAC.
+
+2005-05-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added BagnaraR-CZ05 and BagnaraR-CZ05TR.
+
+2005-05-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHMZ05 and BagnaraHZ05STTT.
+
+2005-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Announce the new paper on widenings for
+	weakly-relational numeric abstractions.
+
+2005-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Reordered.
+
+2005-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added JaffarMSY94, NelsonO77, NelsonO80, Pratt77 and
+	Shostak81.
+
+2005-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Use a double hyphen in page ranges. Use month codes
+	instead of month names.
+
+2005-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraMHZ05TR.
+
+2005-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Mine04 fixed.
+
+2005-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added page numbers to Frehse05.
+
+2005-03-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added Mine05th.
+
+2005-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added GopanRS05.
+
+2005-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Spurious booktitle field removed.
+
+2005-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ03b improved.
+
+2005-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added SankaranarayananSM05.
+
+2005-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Frehse05 added.
+
+2005-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHMZ04EA.
+
+2005-01-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Links to Komei Fukuda's home page updated.
+
+2005-01-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BagnaraHRZ05SCP.
+
+2005-01-04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Removed erroneous line in Mine01a.
+
+2004-12-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added Mine01a and Mine02. Minor improvements
+	elsewhere.
+
+2004-12-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Mine04 added.
+
+2004-11-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Previous change reverted.
+
+2004-11-02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: "official" changed to "full".
+
+2004-09-27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: References added to abstract for the Granger 1997
+	paper.
+
+2004-09-27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Removed citations to applications in the paragraph
+	about integral grids. Added to ppl.bib, references for Ancourt
+	thesis, two papers by Granger (1991 and 1997) and Technical report
+	by Quinton et al.
+
+2004-09-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Last change reverted: in the bibliography we use the
+	right LaTeX code, which is then simplified, when needed, for the
+	sake of BibTeX2HTML.
+
+2004-09-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Do not use LaTeX that cannot be decently handled by
+	BibTeX2HTML.
+
+2004-09-27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: Completed draft descriptions of the numerical
+	abstractions. Added to ppl.bib reference to the Mine paper on the
+	octagon domain and to Roberto's thesis. Updated the gif version of
+	the illustration of a relational grid to correspond to that already
+	in abstractions.tex.
+
+2004-08-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Make sure `I/O' is not touched by BibTeX.
+
+2004-08-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Missing comma added.
+
+2004-08-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added a first draft for FrehseHK04.
+
+2004-08-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added a first draft for Frehse04.
+
+2004-08-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: Added HalbwachsMP-V03.
+
+2004-08-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_citations.bib: New page and bibliography for citations.
+
+2004-08-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Integrated the "abstract" of CousotC79.
+
+2004-08-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Added entries for CousotC76 and CousotC79, with
+	"abstracts" (actually, the first sentences from the introductions)
+	and URLs to PDF versions.
+
+2004-07-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added BalasundaramK89. This paper, back in 1989,
+	introduced what are now called "octagons" under the name "simple
+	sections."
+
+2004-07-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Kannan92 removed.
+
+2004-07-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Kannan92.
+
+2004-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Bagnara98SCP fixed.
+
+2004-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added GopanDMDRS04.
+
+2004-02-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added Masdupuy92 and Masdupuy93th.
+
+2004-01-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Added entry for Q349.
+
+2004-01-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ03a added. BagnaraHZ03 renamed BagnaraHZ03b.
+
+2004-01-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ04 fixed, completed and renamed BagnaraHZ03
+	(since the publication date is 2003).
+
+2003-11-19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: added reference to Schriver text book.
+
+2003-11-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Key for NookalaR00 capitalized consistently.
+
+2003-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ04 added.
+
+2003-11-05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.bib: NELS and similar changes.
+
+2003-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Bagnara98SCP added.
+
+2003-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHRZ03 completed.
+
+2003-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Missing commas added, unnecessary commas removed.
+
+2003-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHRZ03 added.
+
+2003-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: GawrilowJ01 fixed.
+
+2003-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Entry for Quaderno 312 completed. Abstract for
+	Quaderno 305 added.
+
+2003-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Draft entry for BagnaraHRZ03TR added.
+
+2003-02-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Typo fixed in Halbwachs79th. HenzingerH95 and
+	HenzingerPW01 added.
+
+2002-11-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ02TR will appear as Quaderno 305.
+
+2002-10-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ02TR added.
+
+2002-10-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Halbwachs93 added.
+
+2002-10-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BessonJT99 added.
+
+2002-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BultanGP99 added.
+
+2002-10-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Dantzig63 added.
+
+2002-10-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Typo fixed. File bibliography.raw regenerated with
+	the new version of bibtex2html (1.54).
+
+2002-10-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Srivastava93 added.
+
+2002-09-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraHZ02a added.
+
+2002-09-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraRZH02 added.
+
+2002-07-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Force capitalization of "Parma Polyhedra Library" the
+	right way.
+
+2002-07-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: In the entry for BagnaraRZH02, enforced
+	capitalization of the PPL.
+
+2002-07-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Entry for BagnaraRZH02 completed.
+
+2002-07-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraRZH02 added.
+
+2002-06-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: BagnaraRZH02TR and BagnaraRZH02TRerrata added.
+
+2002-06-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Halbwachs79th added.
+
+2002-06-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: CousotC92-PLILP added.
+
+2002-04-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: HalbwachsKP95 added.
+
+2002-04-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/ppl.bib: Corrected entry of LeVerge92, so as to consider "Le"
+	as part of the family name.
+
+2002-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: LeVergeVDW94 added.
+
+2002-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Loechner99 added.
+
+2002-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: StoerW70 added.
+
+2002-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Kuhn56 added.
+
+2002-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: HalbwachsPR94 added.
+
+2002-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: NEW-POLKA-1-1-3c added.
+
+2002-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Added GawrilowJ00, GawrilowJ01, and LoechnerW97.
+
+2002-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: NemhauserW88 fixed.
+
+2001-12-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: There is no abstract in Weyl50.
+
+2001-12-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Weyl35 and Weyl50 added.
+
+2001-10-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: MotzkinRTT53 added.
+
+2001-10-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: NemhauserW88 added.
+
+2001-10-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Provide the source code from LeVerge92.
+
+2001-10-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Chernikova6[458] fixed: they were all wrong.
+
+2001-10-08  Elisa Ricci <ericci at no.email>
+
+	* doc/ppl.bib: Added the Chernikova's articles (what I know).
+
+2001-10-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: LeVerge92 fixed (missing comma and spurious
+	brackets).
+
+2001-10-08  Elisa Ricci <ericci at no.email>
+
+	* doc/ppl.bib: Added the 'Abstract' for "A note on Chernikova's
+	Algorithm".
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Fukuda98 added.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: LeVerge92 added.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: CousotH78 fixed.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: FukudaP96 updated: abstract revised, URL and backup
+	copy provided.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: FukudaP96 added.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: Generate a bibliography page from ppl.bib: this is
+	referenced from the Documentation page. Abstract of Wilde93th added.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: CousotH78 added.
+
+2001-10-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.bib: All the documentation, both ours and the papers we
+	cite, belong to the Documentation directory.  The mirror subdirectory will contain backup copies of the papers we
+	reference: things disappear from the web far too often.  HalbwachsPR97 added.
+
+2012-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-language-interface.doxyconf.in,
+	doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+	doc/user.doxyconf-latex.in: Updated for Doxygen 1.8.0.
+
+2012-03-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Indentation fixed.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: 
+	Simplified INPUT tag values in devref manuals' Doxygen configuration
+	files.  Avoid most of the explicit listing of source files,
+	favouring a much smaller number of file name patterns.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Result.defs.hh, src/Result.inlines.hh,
+	src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh: Doxygen
+	\relates command can not be used with enumerated types.  Replace it
+	with \name grouping.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am: No longer using the installdox command
+	(deprecated and subject to removal).  Fixed Doxygen configuration
+	paths for license files.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/linearize.hh: Further improvements to documentation of helper
+	functions.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Concrete_Expression.types.hh: Use Doxygen command \class for
+	declared-but-undefined class templates.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/linearize.hh: Improved documentation formatting using Doxygen
+	command \tparam.
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.defs.hh: Fixed typo in documentation
+	(causing a Doxygen warning).
+
+2012-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: Corrected name of Doxygen
+	documentation group.
+
+2012-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/propagateconstraints2.cc: On machines where float is
+	supported and double is not supported, test01() can yield results
+	that are significantly less precise.  (Thanks to Sean McGovern.)
+
+2012-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh: Parameter name fixed.
+
+2012-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, tests/Box/interval1.cc, tests/Box/membytes1.cc: Do
+	not assume doubles are supported.
+
+2012-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2012-03-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.inlines.hh, tests/Concrete_Expression/bdshape1.cc,
+	tests/Concrete_Expression/bdshape2.cc,
+	tests/Concrete_Expression/octagonalshape1.cc,
+	tests/Concrete_Expression/octagonalshape2.cc,
+	tests/Concrete_Expression/polyhedron2.cc: Surround non integer
+	costants with a cast to boundary type.
+
+2012-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearform1.cc,
+	tests/Concrete_Expression/linearize.cc,
+	tests/Concrete_Expression/polyhedron1.cc: Do not rely on doubles
+	being supported.
+
+2012-03-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* m4/ac_cxx_float_exact_output.m4: Output is exact also with some
+	added needless zeroes.
+
+2012-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh: Removed unused parameter
+	name.
+
+2012-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh, src/Box.templates.hh,
+	src/Grid_Certificate.cc, src/Interval.inlines.hh,
+	src/MIP_Problem.inlines.hh, src/PIP_Tree.cc,
+	src/checked_float.inlines.hh, src/compiler.hh: Keep macro names
+	within the PPL namespace.
+
+2012-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am: Only build `ppl_pl' for
+	checking and install it only when shared libraries are disabled.
+
+2012-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4: Cater for versions of SWI-Prolog
+	configured with `--disable-libdirversion'.
+
+2012-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4: Make sure the trailing ^M are
+	suppressed under Windows.
+
+2012-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4: Remove the drive indication SWI-Prolog
+	prepends to the PLBASE path under Windows.
+
+2012-03-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_Certificate.cc: Corrected wrong assertion after call to
+	Grid::simplify().
+
+2012-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4: Added missing uses of `$EXEEXT'.
+
+2012-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am: Added missing link options.
+
+2012-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.cc: Useless declarations removed.
+
+2012-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.cc: Fixed debugging code.
+
+2012-03-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Corrected test for has_{upper,lower}_bound so as to
+	avoid calling the predicate on zero-dim boxes.
+
+2012-03-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Restored the build.
+
+2012-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh: Added comments.
+
+2012-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Watchdog/Makefile.am: Added `@extra_includes@' to
+	`AM_CPPFLAGS'.  (Thanks to Joao M. Santos Silva.)
+
+2012-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray.in: Portability improved.  (Thanks to Tim
+	Donahue.)
+
+2012-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh, src/Generator_System.defs.hh,
+	src/Grid.defs.hh, src/Grid_Certificate.cc, src/Grid_nonpublic.cc,
+	src/Grid_simplify.cc, src/Grid_widenings.cc, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/OR_Matrix.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/PIP_Problem.defs.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Pointset_Powerset.defs.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron_nonpublic.cc, src/Scalar_Products.cc,
+	src/Scalar_Products.defs.hh, src/Variables_Set.defs.hh: Fixed lots
+	of parameter names.  Detected by ECLAIR service funparam.
+
+2012-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Bit_Row.defs.hh, src/Box.defs.hh,
+	src/Box.templates.hh, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Concrete_Expression.inlines.hh, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Constraint_System.defs.hh, src/Determinate.defs.hh,
+	src/Generator.cc, src/Grid.defs.hh, src/Linear_Row.inlines.hh,
+	src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Tree.inlines.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc,
+	src/Ptr_Iterator.inlines.hh, src/termination.templates.hh: Fixed
+	lots of parameter names.  Detected by ECLAIR service funparam.
+
+2012-03-22  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/BD_Shape.templates.hh: Fixed indentation.
+
+2012-03-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/OR_Matrix.inlines.hh: Removed extra parenthesis.
+
+2012-03-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* demos/ppl_pips/ppl_pips.cc, src/CO_Tree.cc,
+	src/Floating_Point_Expression.templates.hh,
+	src/OR_Matrix.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/checked.cc, src/checked_int.inlines.hh: Added some missing
+	parenthesis.
+
+2012-03-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/OR_Matrix.inlines.hh, src/checked_int.inlines.hh: Added
+	missing parentheses.  Detected by eclair service exprprns.
+
+2012-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4: 
+	Fixed a couple of typos.
+
+2012-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh: Improved documentation for
+	Box<ITV>::has_{upper,lower}_bound().  Weakened precondition
+	regarding box emptiness: the box can be empty, but it can not be
+	marked empty.  Added a test to the Prolog interface.
+
+2012-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/Grid.templates.hh, src/Polyhedron.templates.hh: Modified
+	interface for Box<ITV>::has_{upper,lower}_bound.  The changes are
+	meant to make it more similar to, e.g., maximize().  Hence, we no
+	pass in a Variable rather than a bare dimension_type and the boolean
+	reference argument `closed' is the last one.
+
+2012-03-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Boundary.defs.hh, src/CO_Tree.cc, src/Float.templates.hh,
+	src/OR_Matrix.inlines.hh, src/PIP_Tree.cc,
+	src/Pointset_Powerset.templates.hh, src/Sparse_Row.cc: Added
+	parentheses and improved formatting.  Missing parentheses detected
+	by ECLAIR service exprprns.
+
+2012-03-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/glpk_set_d_eps.c: This file is not part of the
+	Parma Polyhedra Library.
+
+2012-03-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4: Added
+	Box method has_{upper.lower}_bound to OCaml and Prolog lang
+	interfaces.
+
+2012-03-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4: Added Box method has_{upper,lower}_bound to Java language
+	interface.
+
+2012-03-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Added Box methods has_{upper,lower}_bound to C language interface.
+
+2012-03-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/README: Text revised.
+
+2012-03-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure: Sentence revised.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_pips/ppl_pips.1, doc/libppl.3, doc/libppl_c.3,
+	doc/ppl-config.1, doc/ppl-config_extra_man_text: Man pages updated.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox,
+	interfaces/Prolog/Prolog_interface_compilation.dox: Use a canonical
+	FDL text.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc: Updated.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox,
+	interfaces/Prolog/Prolog_interface_compilation.dox: URL fixed.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Indentation fixed.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/clpq2.pl: Cleaned.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, README.alpha, README.arm, README.configure,
+	README.solaris, STANDARDS, tests/README: Copyright wording fixed.
+
+2012-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox,
+	interfaces/Prolog/Prolog_interface_compilation.dox: Updated two
+	spurious references to FDL 1.1.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, README.alpha, README.arm, README.configure,
+	README.solaris, STANDARDS, doc/README.doc, tests/README: Use a
+	consistent formatting.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, README.alpha, README.arm, README.configure,
+	README.solaris, STANDARDS, doc/README.doc,
+	doc/devref-language-interface.tex, doc/devref.tex,
+	doc/user-language-interface.tex, doc/user.tex, tests/README: Wording
+	fixed/improved.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc: Blank line added.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, README.alpha, README.arm, README.configure,
+	README.solaris, STANDARDS, doc/README.doc, tests/README: Use
+	consistent formatting for the FDL.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface_compilation.dox: Added missing
+	paragraph.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox, doc/devref-language-interface.tex,
+	doc/devref.tex, doc/user-language-interface.tex, doc/user.tex: 
+	Standardized copyright messages.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.alpha, README.arm, README.solaris: Made uniform as far as
+	the copyright message and licensing conditions are concerned.
+
+2012-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure: Updated: we no longer use CVS.
+
+2012-03-15  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/checked.defs.hh, src/meta_programming.hh: Ensure macro
+	parameters in macro bodies are in parentheses.
+
+2012-03-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/checked.defs.hh, src/checked_numeric_limits.hh,
+	src/globals.defs.hh: Ensure parameters in bodies of macros are
+	parenthesized.
+
+2012-03-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Checked_Number.inlines.hh, src/checked.defs.hh,
+	src/checked_numeric_limits.hh, src/compiler.hh,
+	src/globals.defs.hh, src/meta_programming.hh: Ensure parameters in
+	macro bodies are parenthesized appropriately.  Missing parentheses
+	detected by ECLAIR service macrbody.
+
+2012-03-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.inlines.hh: Avoid needless macro complexity.
+
+2012-03-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* README.configure, demos/ppl_lpsol/glpk_set_d_eps.c,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Prolog/Prolog_configured_interface.dox,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/Prolog_interface_sysdep.dox,
+	interfaces/Prolog/Prolog_interface_sysindep.dox,
+	interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	tests/Concrete_Expression/linearize.cc, tests/Grid/Makefile.am,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Powerset/Makefile.am, tests/README: Fixed licenses text.
+
+2012-03-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Concrete_Expression/Makefile.am: Removed bogus use of
+	EXTRA_DIST.
+
+2012-03-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc: Avoid implicit conversions to bool.
+	Detected by ECLAIR service utypflag.
+
+2012-03-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/Prolog/SWI/swi_cfli.hh: Avoid implicit conversion from
+	boolean to integral.  Detected by ECLAIR service utypflag.
+
+2012-03-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh, src/Og_Status.inlines.hh: Prefer
+	testing explicitly against zero.  Detected by ECLAIR service
+	utypflag.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am: Use variables instead of repetition.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am: Typo fixed.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface_sysindep.dox: Typos fixed.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/clpq2.pl: Predicates renamed.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh: Identifier fixed.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generalizedaffineimage2.cc: String fixed.
+
+2012-03-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh, src/Grid_Generator.defs.hh: Comments
+	simplified.
+
+2012-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in: Commented-out code removed.  Detected by
+	ECLAIR service cmntdout.
+
+2012-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Comment corrected.
+
+2012-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Old FIXMEs dealt with.  Detected by ECLAIR
+	service cmntdout.
+
+2012-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh,
+	src/Cast_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh, src/Float.defs.hh,
+	src/Floating_Point_Expression.defs.hh, src/Linear_Form.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Octagonal_Shape.templates.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh, src/linearize.hh: Do
+	use the notation "[l, u]" to denote the closed interval with
+	boundaries `l' and `u'.
+
+2012-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Added missing full-stop in
+	comment.
+
+2012-03-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/Grid.templates.hh, src/Polyhedron.templates.hh: Renamed Box
+	methods get_{upper,lower}_bound() as has_{upper,lower}_bound().
+	Improved documentation: in particular, make clearer that undefined
+	behavior is obtained when calling them on an empty box.
+
+2012-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Avoid implicit conversions to bool
+	(prefer explicit tests against zero).  Detected by ECLAIR service
+	utypflag.
+
+2012-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row_Flags.cc: Avoid implicit cast narrowing a signed integer
+	value.  Detected by ECLAIR service utypflag.
+
+2012-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row_Flags.defs.hh: Removed unused static const data member.
+
+2012-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.inlines.hh,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	src/Pointset_Powerset.templates.hh: Avoid implicit conversions to
+	bool.  Detected by ECLAIR service utypflag.
+
+2012-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/assert.hh: Avoid implicit coversion to bool.  Detected by
+	Boolean service utypflag.
+
+2012-02-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh: Added missing parentheses around a
+	macro arguments.  Detected by ECLAIR service macrbody.
+
+2012-02-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in: Avoid mixing plain character data with
+	numeric data.  Detected by ECLAIR service utypflag.
+
+2012-02-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in: Code layout fixed.
+
+2012-02-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Updated.
+
+2012-02-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Added a missing project and updated a broken link.
+
+2012-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Updated.
+
+2012-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, TODO: Updated.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Concrete_Expression.defs.hh, src/Concrete_Expression.types.hh: 
+	Let classes in Concrete_Expression.defs.hh appear in the user
+	manual.
+
+2012-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh: Documented the enumerated values of enum
+	Floating_Point_Format.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/intervals.defs.hh: Let the docs for the I_Result enum appear
+	on the devref manual only.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh, src/globals.defs.hh: Mark some docs for
+	the devref manual only.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/fpu.defs.hh: Group together documentation of functions
+	controlling FPU.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/linearize.hh: Fixed documentation for linearize and added
+	\relates directive.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.defs.hh: Grouped together docs for the
+	linear-ranking functions.
+
+2012-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Row.defs.hh: CO_Tree and
+	Sparse_Row should only appear in the devref manual.
+
+2012-02-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Row_Flags.cc: Fixed missing namespace.
+
+2012-02-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.templates.hh, src/Interval.templates.hh,
+	src/Interval_Info.inlines.hh, src/Row_Flags.cc: Fixed and uniformed
+	iomanip uses.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/wrap_string.cc: Avoid mixing plain character data with numeric
+	data.  Detected by ECLAIR service utypflag.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Removed
+	references to an obsolete file.
+
+2012-02-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/MIP_Problem.cc: Removed redundant and
+	unused stuff.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Ptr_Iterator.defs.hh: Use the same
+	typenames in function declarations/definitions.  Detected by ECLAIR
+	service funtypes.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh, src/Pointset_Powerset.templates.hh,
+	src/checked_int.inlines.hh: Avoid mixing boolean and arithmetic
+	values.  Detected by ECLAIR service utypflag.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh: Get rid of redundant declarations of a
+	couple of functions.  Detected by ECLAIR service funtypes.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh: Simplified
+	Interval_Info::ascii_load().  Resettting format flags does not
+	change the istream status, which was previously tested and is known
+	to be good: hence, return true.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+	fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh,
+	src/BDS_Status.idefs.hh, src/Box_Status.idefs.hh,
+	src/Float.defs.hh, src/Grid_Status.idefs.hh,
+	src/Og_Status.idefs.hh, src/Ph_Status.idefs.hh, src/fpu.defs.hh: 
+	`#error' messages made consistent.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh: Variable names fixed.
+
+2012-02-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/Grid_public.cc, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron_public.cc, src/Variable.cc, src/Variable.defs.hh,
+	src/Variables_Set.cc, src/Variables_Set.defs.hh,
+	src/Variables_Set.inlines.hh, src/termination.templates.hh,
+	src/wrap_assign.hh, tests/Polyhedron/affineimage2.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bhz03widening1.cc,
+	tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/ppl_test.cc,
+	tests/ppl_test.hh: Avoid to use Variable references. Uniformed
+	Variable creations.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh: Types fixed.  Useless if-then-else removed.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Use `libtool' to test linking with GMP only if
+	the option `--with-gmp-build' was given.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.cc, src/Interval_Info.defs.hh,
+	src/Ph_Status.inlines.hh: Prefer explicit tests against zero.  Avoid
+	using boolean values as integer values.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh, src/OR_Matrix.inlines.hh,
+	src/checked_float.inlines.hh: Improved implementation of
+	OR_Matrix<T>::any_row_iterator<U>::operator+=().  Increased
+	 readability: - separated explicit type conversions from code performing
+	   arithmetic operations (on non-mixed typed values);  - added a few redundant parentheses.  Similar improvement applied
+	to a couple of other functions.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh, src/version.hh.in: Provide a named group for
+	all library version control functions.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	src/DB_Row.inlines.hh, src/Interval_Info.inlines.hh,
+	src/ppl-config.cc.in: Prefer explicit tests against zero.  Detected
+	by ECLAIR service utypflag.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Updated.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am: Added `Watchdog' to `SUBDIRS'.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Completed `ppl_config_SOURCES'.
+
+2012-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, tests/Concrete_Expression/Makefile.am: Cater for
+	platforms where no floating-point type is supported.
+
+2012-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Float.defs.hh,
+	src/Interval.defs.hh, src/Linear_Form.defs.hh,
+	src/PIP_Tree.defs.hh, src/termination.defs.hh: Added several missing
+	\relates and \ingroup Doxygen commands.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.defs.hh, src/Checked_Number.defs.hh,
+	src/Dense_Row.defs.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+	src/intervals.defs.hh: Remove docs for a few implementation classes
+	from the user manual.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/intervals.defs.hh: Properly terminate Doxygen comments.
+
+2012-02-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Wrong guard fixed.
+
+2012-02-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, NEWS, README, ppl.lsm.in: Updated.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/intervals.defs.hh: Hide enum initializers from docs.  Remove
+	I_Result enumeration form user manual.
+
+2012-02-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Updated.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Row.cc, src/CO_Tree.cc, src/checked_float.inlines.hh: For
+	code clarity purposes, better distinguish signed/unsigned
+	operations.  Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.inlines.hh: Exploit new helper function
+	least_significant_one_mask(), thereby avoiding unary minus on
+	unsigned integer values.  Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh, src/globals.inlines.hh: Added helper function
+	least_significant_one_mask().
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4: Prefer explicit
+	test against zero.  Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc: Prefer explicit test against zero.
+	Detected by ECLAIR service utypflag.
+
+2012-02-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/linearize.hh: Reduced the scope of variable declarations.
+	Detected by ECLAIR service minscope.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/c_streambuf.cc, src/stdiobuf.cc: Prefer explicit tests against
+	zero.  Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc: Prefer explicit tests against
+	zero.  Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh: Prefer explicit test against zero.
+	Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Dense_Row.inlines.hh: Fixed a few misuses of assignment
+	(instead of comparison) in assertions.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh: Prefer explicit test against zero.
+	Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh: Avoid long line.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh: Prefer explicit test against zero.
+	Detected by ECLAIR service utypflag.
+
+2012-02-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh, src/globals.inlines.hh: Prefer explicit tests
+	against zero.  Detected by ECLAIR service utypflag.
+
+2012-02-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh: Code layout made conformat to the coding
+	standard.
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Octagonal_Shape.templates.hh: Restore previous names.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Threshold_Watcher.cc, src/Time.cc, src/Watchdog.cc: Use ""
+	quotes to include non-system headers.  Detected by ECLAIR service
+	hedrname.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Polyhedron_chdims.cc,
+	src/simplify.cc: Comments improved.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/WRD_coefficient_types.defs.hh,
+	src/checked.inlines.hh: Avoid commented-out code.  Detected by
+	ECLAIR service cmntdout.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Comments improved.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Avoid implicit conversion
+	changing type signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4: Fixed C
+	interface incongruence.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	src/checked_float.inlines.hh: Avoid implicit conversion changing
+	signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh: Added
+	any_iterator operator+= and operator+ overloadings for unsigned
+	types.
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Octagonal_Shape.templates.hh: Avoid to offset iterators twice.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Avoid implicit conversion changing
+	signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Removed a couple of useless explicit
+	casts.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh,
+	src/Box.templates.hh, src/DB_Matrix.templates.hh,
+	src/Dense_Matrix.cc, src/Dense_Matrix.inlines.hh,
+	src/Grid_chdims.cc, src/Linear_System.cc,
+	src/MIP_Problem.inlines.hh, src/PIP_Problem.cc, src/PIP_Tree.cc,
+	src/globals.defs.hh, src/globals.inlines.hh: When working with
+	sizes, prefer vector::resize() to vector::erase().  Added helper
+	function nth_iter().
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/OR_Matrix.inlines.hh: Fixed implementation defined implicit
+	cast.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/wrap_assign.hh: Silenced a warning.
+
+2012-02-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Linear_Form.templates.hh: Fixed implementation defined
+	implicit cast.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/Octagonal_Shape.templates.hh,
+	src/PIP_Tree.cc: Delimit pseudo-code in non-Doxygen comments within
+	<CODE> </CODE>.  Comments improved.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/c_streambuf.cc, src/c_streambuf.defs.hh, src/stdiobuf.cc: 
+	Avoid implicit conversions changing type signedness.  Detected by
+	ECLAIR service utypflag.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc: Delimit pseudo-code in non-Doxygen comments
+	within <CODE> </CODE>.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Sparse_Row.defs.hh: Delimit pseudo-code in Doxygen comments
+	within <CODE> </CODE>.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Comment improved.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc: Delimit pseudo-code in non-Doxygen
+	comments within <CODE> </CODE>.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc: Comment improved.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Comments improved.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Delimit pseudo-code in non-Doxygen comments
+	within <CODE> </CODE>.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Comment improved.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh: 
+	Delimit pseudo-code in non-Doxygen comments within <CODE> </CODE>.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh: Comment improved.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc: Delimit example code in non-Doxygen comments
+	within <CODE> </CODE>.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Comments fixed/improved.
+
+2012-02-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row_Flags.cc: Avoid implicit conversions changing type
+	signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh: Avoid commented-out code.  Detected
+	by ECLAIR service cmntdout.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Fixed punctuation in comments.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh, src/PIP_Tree.cc: Avoid commented-out
+	code.  Detected by ECLAIR service cmntdout.
+
+2012-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: 
+	Comment punctuation fixed.
+
+2012-02-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/initializer.hh: Avoid unnamed namespace in header file.
+	Detected by ECLAIR service hedrfile.
+
+2012-02-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh: Enclose macro argument in parentheses.  Detected
+	by ECLAIR service macrbody.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/interfaced_boxes.hh, src/Boundary.defs.hh,
+	src/Box.templates.hh, src/Checked_Number.defs.hh,
+	src/Integer_Interval.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval.templates.hh,
+	src/Interval_Info.defs.hh, src/Interval_Restriction.defs.hh,
+	src/Makefile.am, src/Rational_Interval.hh, tests/Box/interval1.cc,
+	tests/Box/refinewithconstraint2.cc, tests/ppl_test.hh: Removed
+	interval restrictions.
+
+2012-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh: Prefer using C_Integer traits rather than
+	<climits> macros, thereby avoiding implicit conversions changing
+	type signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/wrap_string.cc: Rewritten function to avoid mixing signed and
+	unsigned integer types.  Detected by ECLAIR service utypflag.
+
+2012-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Avoid implicit conversion changing signedness.
+	Detected by ECLAIR service utypflag.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/ppl-config.cc.in: Improved strcaseeq implementation.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.cc: Fixed cast. Detected by ECLAIR service utypflag.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.inlines.hh: Fixed signedness. Detected by
+	ECLAIR service utypflag.
+
+2012-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh: Simplified implementation of method
+	Grid::reduce_reduced().  While at it, got rid of a few implicit
+	conversions changing signedness.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.inlines.hh, src/checked_float.inlines.hh: mp_bitcnt_t
+	is not present in gmp 3.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Concrete_Expression.cc: Forgotten changes.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/C_Integer.hh: Simplified min/max evaluation.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Concrete_Expression.defs.hh,
+	src/Concrete_Expression.inlines.hh: Prefer bool field.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Time.defs.hh, src/Time.inlines.hh, src/Watchdog.cc,
+	src/Watchdog.defs.hh, src/Watchdog.inlines.hh,
+	src/checked_ext.inlines.hh: Use always long for time related
+	quantities.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.cc: Avoid implicit conversions changing integer type
+	signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.inlines.hh, src/Float.defs.hh, src/Row_Flags.defs.hh,
+	src/checked.cc, src/checked_float.inlines.hh: Avoid implicit
+	conversions changing integer type signedness.  Detected by ECLAIR
+	service utypflag.
+
+2012-02-22  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.cc, src/Bit_Row.inlines.hh, src/CO_Tree.cc,
+	src/CO_Tree.defs.hh, src/CO_Tree.templates.hh, src/Float.defs.hh,
+	src/Float.inlines.hh, src/Float.templates.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/compiler.hh, src/globals.inlines.hh: Avoid implicit conversions
+	changing integer type signedness.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh: 
+	Avoid implicit conversions changing integer type signedness.
+	Detected by ECLAIR service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.inlines.hh: Avoid implicit conversion changing
+	type signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.inlines.hh, src/Grid.defs.hh, src/Grid.inlines.hh,
+	src/Grid.templates.hh, src/Grid_Generator.cc, src/Grid_chdims.cc,
+	src/Grid_nonpublic.cc, src/Grid_public.cc, src/NNC_Polyhedron.cc,
+	src/NNC_Polyhedron.inlines.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+	src/Polyhedron_nonpublic.cc, src/globals.cc, src/globals.defs.hh: 
+	Added helper function check_space_dimension_overflow().  Added
+	similar helper in class Polyhedron and got rid of no longer needed
+	method throw_space_dimension_overflow().  Exploit the new helper to
+	simplify space dim checking in constructors.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc: Avoid implicit conversion changing signedness.
+	Detected by ECLAIR service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/compiler.hh: Macro PPL_ASSERT is not available in compiler.hh.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh: Let `indent' have
+	type signed int, matching signature of std::setw().  Detected by
+	ECLAIR service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.defs.hh: Fixed inclusion directive.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc, src/Constraint.cc, src/NNC_Polyhedron.cc,
+	src/Polyhedron_public.cc: Avoid implicit conversions changing
+	signedness.  Detected by ECLAIR service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc, src/conversion.cc: Prefer using
+	C_Integer traits rather than <climits> macros, thereby avoiding
+	implicit conversions changing signedness.  Detected by ECLAIR
+	service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Let `indent_level' have
+	type signed int, matching signature of std::setw().  Detected by
+	ECLAIR service utypflag.
+
+2012-02-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/checked_int.inlines.hh: Avoid using functional casts.
+	Detected by ECLAIR service castexpr.
+
+2012-02-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Bit_Row.cc, src/CO_Tree.cc, src/CO_Tree.templates.hh,
+	src/Float.defs.hh, src/Float.inlines.hh, src/Interval.defs.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/intervals.defs.hh: Replaced all c-style casts.  Detected by
+	ECLAIR service castexpr.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh, src/Constraint_System.defs.hh,
+	src/Constraint_System.inlines.hh, src/PIP_Tree.cc,
+	src/termination.cc: Added helper function
+	Implementation::num_constraints().  When implementing it, avoid
+	implicit conversion changing signedness.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-22  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.inlines.hh, src/Float.inlines.hh, src/assert.hh,
+	src/compiler.hh, src/globals.inlines.hh: Uniformed, improved and
+	moved to a better place implementation of clz/ctz.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Bit_Row.cc, src/checked.cc: Prefer using
+	C_Integer traits rather than macros in <climits>, thereby avoiding a
+	few implicit conversions changing signedness.  Detected by ECLAIR
+	service utypflag.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Declare pure virtual
+	methods in abstract base classes.  Override them only once in
+	derived classes.  Detected by ECLAIR service ovrdonce.
+
+2012-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Handler.defs.hh, src/c_streambuf.defs.hh: Specify the
+	`virtual' keyword when declaring overriding methods.  Detected by
+	ECLAIR service ovrdexpl.
+
+2012-02-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/ppl-config.cc.in: Moved another declaration into a smaller
+	scope.  Detected by ECLAIR service minscope.
+
+2012-02-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/ppl-config.cc.in: Move declarations to nsure variables are
+	declared at smallest possible scope.  Detected by ECLAIR service
+	minscope.
+
+2012-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Multiple-inclusion guards added.  Detected by
+	ECLAIR service inclgard.
+
+2012-02-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh, src/ppl-config.cc.in: Avoided
+	functional cast. Detected by ECLAIR service castexpr.
+
+2012-02-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Handler.defs.hh: Avoid not needed virtual inheritance.
+
+2012-02-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-language-interface.doxyconf.in,
+	doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	doc/user-language-interface.doxyconf.in, doc/user.doxyconf-html.in,
+	doc/user.doxyconf-latex.in: Updated Doxygen configuration files to
+	release 1.7.4.
+
+2012-02-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, src/Init.cc, src/Watchdog.cc: Added
+	'&' prefix to function identifiers that are not used to call the
+	function.  Detected by Eclair service funcalls.
+
+2012-02-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/PIP_Tree.cc: When object is not used for control, declaration
+	moved outside for statement.
+
+2012-02-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/PIP_Tree.cc, src/Partially_Reduced_Product.templates.hh: 
+	Declarations that can be moved into a smaller scope have been moved.
+	Detected by ECLAIR service minscope.
+
+2012-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray.in: Simplified.
+
+2012-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray.in: Simplified.
+
+2012-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am, src/ppl-config.cc.in: New automatically generated
+	files BUGS.hh, COPYING.hh and CREDITS.hh.
+
+2012-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray.in: Explicitly state the array size.  New
+	option --decl-only.
+
+2012-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc: Unwanted inclusion removed.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraints2.cc: Unwanted inclusion removed.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	tests/Box/refinewithconstraints2.cc,
+	tests/MIP_Problem/mipproblem2.cc: The Parma Watchdog Library has
+	been merged into the Parma Polyhedra Library.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh: Missing default added.
+
+2012-02-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Boundary.defs.hh, src/Grid.templates.hh, src/PIP_Problem.cc,
+	src/checked_float.inlines.hh: Renamed some variables so that
+	declarations in an outer scope are not hidden.  Detected by ECLAIR
+	service declhidn.
+
+2012-02-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.templates.hh, src/PIP_Problem.cc,
+	src/checked_float.inlines.hh: Revert "Renamed some variables so that
+	declarations in an outer scope are not hidden." This reverts commit 97cc40667310524111a674be5ad3e8e9e4ec8c90.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Watchdog/watchdog1.cc: Global-replace mistake fixed.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, Watchdog/.gitignore, Watchdog/BUGS,
+	Watchdog/COPYING, Watchdog/CREDITS, Watchdog/ChangeLog,
+	Watchdog/ChangeLog_2001-2008, Watchdog/INSTALL,
+	Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	Watchdog/compile, Watchdog/config.guess, Watchdog/config.rpath,
+	Watchdog/config.sub, Watchdog/configure.ac, Watchdog/depcomp,
+	Watchdog/doc/.gitignore, Watchdog/doc/Makefile.am,
+	Watchdog/doc/README.doc, Watchdog/doc/devref.doxyconf-html.in,
+	Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+	Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+	Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+	Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	Watchdog/install-sh, Watchdog/ltmain.sh, Watchdog/m4/.gitignore,
+	Watchdog/m4/Makefile.am, Watchdog/m4/lib-ld.m4,
+	Watchdog/m4/lib-link.m4, Watchdog/m4/libtool.m4,
+	Watchdog/m4/ltoptions.m4, Watchdog/m4/ltsugar.m4,
+	Watchdog/m4/ltversion.m4, Watchdog/m4/lt~obsolete.m4,
+	Watchdog/missing, Watchdog/mkinstalldirs, Watchdog/pwl-config.sed,
+	Watchdog/src/.gitignore, Watchdog/src/Makefile.am,
+	Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	Watchdog/tests/.gitignore, Watchdog/tests/pwl_test.cc,
+	Watchdog/tests/pwl_test.hh, Watchdog/tests/valgrind_suppressions,
+	Watchdog/utils/.gitignore, Watchdog/utils/Makefile.am,
+	Watchdog/utils/build_header.in, configure.ac,
+	doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	interfaces/C/Makefile.am, interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/watchdog1.c, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am, ppl-config.sed, {Watchdog/src =>
+	src}/Doubly_Linked_Object.defs.hh, {Watchdog/src =>
+	src}/Doubly_Linked_Object.inlines.hh,
+	src/Doubly_Linked_Object.types.hh, {Watchdog/src =>
+	src}/EList.defs.hh, {Watchdog/src => src}/EList.inlines.hh,
+	{Watchdog/src => src}/EList.types.hh, {Watchdog/src =>
+	src}/EList_Iterator.defs.hh, {Watchdog/src =>
+	src}/EList_Iterator.inlines.hh, {Watchdog/src =>
+	src}/EList_Iterator.types.hh, {Watchdog/src =>
+	src}/Handler.defs.hh, {Watchdog/src => src}/Handler.inlines.hh,
+	{Watchdog/src => src}/Handler.types.hh, src/Init.cc,
+	src/Makefile.am, {Watchdog/src => src}/Pending_Element.defs.hh,
+	{Watchdog/src => src}/Pending_Element.inlines.hh, {Watchdog/src =>
+	src}/Pending_Element.types.hh, {Watchdog/src =>
+	src}/Pending_List.defs.hh, {Watchdog/src =>
+	src}/Pending_List.inlines.hh, {Watchdog/src =>
+	src}/Pending_List.templates.hh, {Watchdog/src =>
+	src}/Pending_List.types.hh, {Watchdog/src =>
+	src}/Threshold_Watcher.cc, {Watchdog/src =>
+	src}/Threshold_Watcher.defs.hh, {Watchdog/src =>
+	src}/Threshold_Watcher.inlines.hh, {Watchdog/src =>
+	src}/Threshold_Watcher.templates.hh, {Watchdog/src =>
+	src}/Threshold_Watcher.types.hh, {Watchdog/src => src}/Time.cc,
+	{Watchdog/src => src}/Time.defs.hh, {Watchdog/src =>
+	src}/Time.inlines.hh, Watchdog/src/Doubly_Linked_Object.types.hh =>
+	src/Time.types.hh, {Watchdog/src => src}/Watchdog.cc, {Watchdog/src
+	=> src}/Watchdog.defs.hh, {Watchdog/src =>
+	src}/Watchdog.inlines.hh, Watchdog/src/Time.types.hh =>
+	src/Watchdog.types.hh, src/ppl_header.hh,
+	tests/Ask_Tell/Makefile.am, tests/Box/Makefile.am,
+	tests/CO_Tree/Makefile.am, tests/Concrete_Expression/Makefile.am,
+	tests/MIP_Problem/Makefile.am, tests/PIP_Problem/Makefile.am,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/watchdog1.cc,
+	tests/Polyhedron/weightwatch1.cc, tests/Sparse_Matrix/Makefile.am,
+	{Watchdog/tests => tests/Watchdog}/Makefile.am, {Watchdog/tests =>
+	tests/Watchdog}/watchdog1.cc: The Parma Watchdog Library has been
+	merged into the Parma Polyhedra Library.
+
+2012-02-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.templates.hh, src/PIP_Problem.cc,
+	src/checked_float.inlines.hh: Renamed some variables so that
+	declarations in an outer scope are not hidden.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_ids: Spurious line removed.
+
+2012-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.alpha, README.arm, README.solaris,
+	devtools/update_ChangeLog, interfaces/Java/README.java,
+	interfaces/OCaml/README.ocaml, interfaces/Prolog/Ciao/README.ciao,
+	interfaces/Prolog/GNU/README.gprolog,
+	interfaces/Prolog/SWI/README.swiprolog,
+	interfaces/Prolog/YAP/README.yap, tests/MIP_Problem/mipproblem4.cc: 
+	Added/fixed some copyright notices.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Float.inlines.hh: Let bitwise operators be applied to unsigned
+	integer types.  Detected by ECLAIR service utypflag.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	src/Linear_Row.inlines.hh: Let bitwise operators be applied to
+	unsigned integer types.  Detected by ECLAIR service utypflag.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Boundary.defs.hh: Exploit operator| overloading for
+	Rounding_Dir.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Row.cc, src/Float.defs.hh, src/Interval.defs.hh,
+	src/intervals.defs.hh: Let bitwise operators be applied to unsigned
+	integer types.  Detected by ECLAIR service utypflag.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Result.defs.hh, src/Result.inlines.hh, src/globals.types.hh: 
+	Let bitwise operators be applied to unsigned integer types.
+	Detected by ECLAIR service utypflag.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh: Let bitwise
+	operators be applied to unsigned integer types.  Detected by ECLAIR
+	service utypflag.
+
+2012-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Add the release date for PPL 0.11.2.  Mention a couple of
+	bugs that have been corrected.
+
+2012-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc, src/Box.templates.hh, src/Linear_Form.inlines.hh: 
+	Reduced the scope of some variables.  Detected by ECLAIR service
+	minscope.
+
+2012-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.templates.hh, src/ppl-config.cc.in: Prefer explicit
+	tests againts zero.  Detected by ECLAIR service utypflag.
+
+2012-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh: Avoid abusing
+	sort-circuited logical operators.
+
+2012-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_chdims.cc: Avoid abusing short-circuited logical
+	operators (prefer explicit control flow).  Detected by ECLAIR
+	service utypflag.
+
+2012-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc: Prefer explicit tests against
+	zero.  Detected by ECLAIR service utypflag.
+
+2012-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.templates.hh, src/checked.cc, src/globals.defs.hh,
+	src/globals.inlines.hh, src/wrap_string.cc: Added helper is_space(),
+	to be used instead of directly calling isspace().
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Boundary.defs.hh, src/Checked_Number.defs.hh,
+	src/Checked_Number.inlines.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh: Renamed is_infinity() as infinity_sign(),
+	returning an `int' in {-1, 0, 1}.  Prefer explicit tests against
+	zero.  Detected by ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.inlines.hh, src/wrap_assign.hh, src/wrap_string.cc: 
+	Prefer explicit tests against zero.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/assert.hh, src/globals.defs.hh: Prefer `while
+	(true)' and `while (false)' wrt `while (1)' and `while(0)'.
+	Detected by ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.cc: Prefer explicit tests against zero.  Detected by
+	ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.cc, src/OR_Matrix.inlines.hh,
+	src/Polyhedron_public.cc: Prefer explicit tests against zero.
+	Detected by ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_chdims.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+	src/Grid_widenings.cc: Prefer explicit tests against zero.  Do not
+	abusing short-circuit operators (prefer explicit control flow).
+	Detected by ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Matrix.cc: Prefer explicit test against zero.  Detected by
+	ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.cc: Prefer explicit usage of the istream::fail()
+	method.  Detected by ECLAIR service utypflag.
+
+2012-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Integer.hh, src/meta_programming.hh: Rename as
+	`const_bool_value' the "anonymous" enums encoding a bool value.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc: Prefer using vector::resize wrt insert.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_Status.inlines.hh, src/Result.inlines.hh: Prefer explicit
+	tests against zero.  Detected by ECLAIR service utypflag.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.cc: Make comparison against zero explicit.
+	Detected by ECLAIR service utypflag.  While at it, simplified
+	control flow by removing a use of `continue'.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box_Status.inlines.hh: Make comparison against zero explicit.
+	Detected by ECLAIR service utypflag.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Row.cc: Make comparison against zero explicit.  Detected
+	by ECLAIR service utypflag.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, src/BD_Shape.inlines.hh, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Grid.inlines.hh, src/Octagonal_Shape.inlines.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Pointset_Ask_Tell.inlines.hh, src/Pointset_Powerset.inlines.hh,
+	src/Polyhedron.inlines.hh, src/globals.defs.hh,
+	src/globals.inlines.hh: Added helper function to compute the hash
+	code from a space dimension.  Added missing has_code() method to
+	class Box<ITV> and generate corresponding method in Java interface
+	for boxes.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Float.inlines.hh, src/Rounding_Dir.inlines.hh: Make comparison
+	against zero explicit.  Detected by ECLAIR service utypflag.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Prefer testing against zero.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Float.defs.hh, src/Float.inlines.hh,
+	src/checked_float.inlines.hh: For clarity, renamed three-state Float
+	method is_inf() as inf_sign().  Similarly, renamed is_zero() as
+	zero_sign().
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh, src/Box.templates.hh, src/Interval.defs.hh,
+	src/intervals.defs.hh: Avoid long lines and try to improve
+	readability.  In particular, when using helper function i_constraint(), prefer
+	passing in an already built Relation_Symbol object if its
+	computation is nontrivial.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Completed previous commit, fixing
+	is_{m,p}inf_float.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Let is_inf_float() return a Boolean
+	value, rather than an integer.  Detected by ECLAIR service utypflag.
+
+2012-02-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh, src/Pointset_Powerset.templates.hh: Prefer
+	using logical (wrt bitwise) operators on Boolean values.  Detected
+	by ECLAIR service utypflag.
+
+2012-02-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: Fixed a bug in
+	Box<ITV>::upper_bound_assign(_if_exact).  Calling the method with an
+	empty argument that, due to computational laziness, is not yet
+	flagged as being empty was producing wrong results.  (Note: here
+	`wrong' means unnecessarily imprecise; from the point of view of
+	approximation, the results were still correct).  See test08 in
+	tests/Box/upperbound1.cc.
+
+2012-02-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/upperbound1.cc: Restored a few tests commented out long
+	time ago.  Added a new test (synthesized from a Java test provided
+	by Gianluca Amato) showing a problem in the implementation of
+	Box<ITV>::upper_bound_assign().
+
+2012-02-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2012-02-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh: Indentation fixed.
+
+2012-02-13  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Enabled CC76_narrowing_assign for Boxes.
+
+2012-02-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am, tests/Ask_Tell/Makefile.am,
+	tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/CO_Tree/Makefile.am, tests/Concrete_Expression/Makefile.am,
+	tests/Grid/Makefile.am, tests/MIP_Problem/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am, tests/PIP_Problem/Makefile.am,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Polyhedron/Makefile.am, tests/Powerset/Makefile.am,
+	tests/Sparse_Matrix/Makefile.am: Invoke libtool when checking with
+	Valgrind enabled.
+
+2012-02-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Concrete_Expression/Makefile.am: Fixed value for Valgrind
+	--num-callers option.  According to man pages, maximum value is 50.
+
+2012-02-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: 
+	Avoid pointer casts when allocating coefficients in Dense_Row::Impl.
+	Detected by ECLAIR service M++.5-2-8.  We now use a std::allocator object (similar to what done in
+	CO_Tree).
+
+2012-02-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: For
+	naming consistency, `coefficient_allocator' renamed as
+	`data_allocator'.  Explicitly include <memory> for std::allocator.
+	Fixed deallocation bugs in CO_Tree::rebuild_bigger_tree():   - use delete[] for `indexes';   - use data_allocator.deallocayte for `data'.  On copy
+	construction, assignment and swap, do also copy/assign/swap the
+	allocator.
+
+2012-02-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: Reduce scope of loop index variable.
+	Detected by ECLAIR service minscope.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Grid_conversion.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc,
+	src/Octagonal_Shape.templates.hh: Make sure each case within a
+	switch statement is properly terminated.  Detected by ECLAIR service
+	swchbrek.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: 
+	Spurious spaces removed.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc: Type fixed.  Detected by ECLAIR service
+	utypflag.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh: Added missing parentheses around a macro
+	argument.  Detected by ECLAIR service macrbody.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/MIP_Problem.cc, src/globals.defs.hh: Avoid
+	null statements that, apart from a comment, are not on a line by
+	themselves.  Detected by ECLAIR service nullstmt.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+	Watchdog/depcomp, Watchdog/install-sh, Watchdog/ltmain.sh,
+	Watchdog/m4/libtool.m4, Watchdog/m4/ltoptions.m4,
+	Watchdog/m4/ltversion.m4, Watchdog/missing, compile, config.guess,
+	config.sub, depcomp, install-sh, ltmain.sh, m4/libtool.m4,
+	m4/ltoptions.m4, m4/ltversion.m4, missing: Updated.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Prolog sources must go under
+	.../share/ppl as these files are architecture independent.
+	Moreover, new versions of Automake no longer accept pkglib_DATA.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Added missing template parameter.
+
+2012-02-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh: INT_MIN % -1 is undefined behavior in
+	C++11.  The PPL has been proven to be immune to this potential
+	problem by ECLAIR.  (Thanks to Rene Sugar.) Long lines avoided on
+	passing.
+
+2012-02-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am: Reflected file removal.
+
+2012-02-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, configure.ac, m4/ac_cxx_remainder_bug.m4, src/checked.cc: 
+	INT_MIN % -1 is undefined behavior in C++11.  The PPL has been
+	proven to be immune to this potential problem by ECLAIR.  (Thanks to
+	Rene Sugar.)
+
+2012-02-03  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid_Generator.inlines.hh: Added a default label to switch.
+
+2012-02-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assert.hh: Be consistent with the use of attribute weak.
+
+2012-02-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in: The functions fatal() and internal_error()
+	are now attributed with noreturn.
+
+2012-01-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/bump_copyright_years: Improved.
+
+2012-01-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh, src/Grid_Generator_System.cc,
+	src/Grid_public.cc: Reduced the scope of some variables.  Detected
+	by ECLAIR service minscope.
+
+2012-01-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README, README.configure, STANDARDS,
+	Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+	Watchdog/doc/README.doc, Watchdog/doc/devref.tex,
+	Watchdog/doc/pwl.sty, Watchdog/doc/user.tex,
+	Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+	Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	Watchdog/src/Doubly_Linked_Object.types.hh,
+	Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	Watchdog/src/EList_Iterator.inlines.hh,
+	Watchdog/src/EList_Iterator.types.hh, Watchdog/src/Handler.defs.hh,
+	Watchdog/src/Handler.inlines.hh, Watchdog/src/Handler.types.hh,
+	Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	Watchdog/src/Pending_Element.inlines.hh,
+	Watchdog/src/Pending_Element.types.hh,
+	Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh,
+	Watchdog/src/Pending_List.templates.hh,
+	Watchdog/src/Pending_List.types.hh,
+	Watchdog/src/Threshold_Watcher.cc,
+	Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.inlines.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh,
+	Watchdog/src/Threshold_Watcher.types.hh, Watchdog/src/Time.cc,
+	Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+	Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+	Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	configure.ac, debian/libppl-pwl.copyright.in,
+	debian/libppl.copyright.in, demos/Makefile.am,
+	demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+	demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+	demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+	demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+	demos/ppl_lpsol/examples/Makefile.am,
+	demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+	demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+	demos/ppl_pips/ppl_pips_extra_man_text,
+	devtools/bump_copyright_years, devtools/generate_dox_biblio,
+	devtools/generate_dox_ci_prolog_manual,
+	devtools/generate_man_pages, devtools/print_nonascii_lines,
+	doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+	doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+	doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+	fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh, instchk.hh,
+	interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/ppl_c_implementation_common.inlines.hh,
+	interfaces/C/ppl_c_version.h.in,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/C/ppl_interface_generator_c_h.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+	interfaces/C/tests/ppl_c_test.h,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h,
+	interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+	ow.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+	entation.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+	a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+	interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+	java,
+	interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	, interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java,
+	interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+	va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Name.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Value.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Pair.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/PPL_Test.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Java/tests/ppl_java_tests_common,
+	interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4, interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/Ciao/ciao_cfli.hh,
+	interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/Ciao/ciao_efli.hh,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+	d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/GNU/gnu_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	interfaces/Prolog/GNU/gp_clpq.pl,
+	interfaces/Prolog/GNU/gprolog_cfli.hh,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.hh,
+	interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/Prolog_configured_interface.dox,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/Prolog_interface_compilation.dox,
+	interfaces/Prolog/Prolog_interface_sysdep.dox,
+	interfaces/Prolog/Prolog_interface_sysindep.dox,
+	interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	interfaces/Prolog/SICStus/sicstus_cfli.h,
+	interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	interfaces/Prolog/SICStus/sicstus_efli.cc,
+	interfaces/Prolog/SICStus/sicstus_efli.hh,
+	interfaces/Prolog/SICStus/sp_clpq.pl,
+	interfaces/Prolog/SICStus/sp_pl_check.pl,
+	interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+	interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	interfaces/Prolog/SWI/ppl_pl.cc,
+	interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	interfaces/Prolog/SWI/swi_cfli.hh,
+	interfaces/Prolog/SWI/swi_efli.cc,
+	interfaces/Prolog/SWI/swi_efli.hh,
+	interfaces/Prolog/SWI/swi_pl_check.pl,
+	interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+	test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/XSB/xsb_cfli.hh,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/XSB/xsb_efli.hh,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/YAP/ppl_yap.pl,
+	interfaces/Prolog/YAP/yap_cfli.hh,
+	interfaces/Prolog/YAP/yap_clpq.pl,
+	interfaces/Prolog/YAP/yap_clpq2.pl,
+	interfaces/Prolog/YAP/yap_efli.cc,
+	interfaces/Prolog/YAP/yap_efli.hh,
+	interfaces/Prolog/YAP/yap_pl_check.pl,
+	interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.inlines.hh,
+	interfaces/Prolog/tests/Makefile.am,
+	interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+	interfaces/Prolog/tests/expected_clpq2_int16,
+	interfaces/Prolog/tests/expected_clpq2_int16_a,
+	interfaces/Prolog/tests/expected_clpq2_int32,
+	interfaces/Prolog/tests/expected_clpq2_int32_a,
+	interfaces/Prolog/tests/expected_clpq2_int64,
+	interfaces/Prolog/tests/expected_clpq2_int64_a,
+	interfaces/Prolog/tests/expected_clpq2_int8,
+	interfaces/Prolog/tests/expected_clpq2_int8_a,
+	interfaces/Prolog/tests/expected_clpq2_mpz,
+	interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	interfaces/Prolog/tests/expected_clpq_int16,
+	interfaces/Prolog/tests/expected_clpq_int16_a,
+	interfaces/Prolog/tests/expected_clpq_int32,
+	interfaces/Prolog/tests/expected_clpq_int32_a,
+	interfaces/Prolog/tests/expected_clpq_int64,
+	interfaces/Prolog/tests/expected_clpq_int64_a,
+	interfaces/Prolog/tests/expected_clpq_int8,
+	interfaces/Prolog/tests/expected_clpq_int8_a,
+	interfaces/Prolog/tests/expected_clpq_mpz,
+	interfaces/Prolog/tests/expected_clpq_mpz_a,
+	interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4,
+	interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+	interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+	interfaces/ppl_interface_generator_common.m4,
+	interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+	m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+	m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+	m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+	m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+	m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4,
+	m4/ac_cxx_plain_char_is_signed.m4, m4/ac_cxx_proper_long_double.m4,
+	m4/ac_cxx_remainder_bug.m4, m4/ac_cxx_zero_length_arrays.m4,
+	m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+	m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+	src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+	src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	src/Bit_Row.inlines.hh, src/Bit_Row.types.hh, src/Boundary.defs.hh,
+	src/Box.cc, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/Box.types.hh, src/Box_Status.idefs.hh,
+	src/Box_Status.inlines.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+	src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+	src/CO_Tree.types.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	src/C_Polyhedron.types.hh,
+	src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.inlines.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Cast_Floating_Point_Expression.types.hh, src/Checked_Number.cc,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Checked_Number.templates.hh, src/Checked_Number.types.hh,
+	src/Coefficient.cc, src/Coefficient.defs.hh,
+	src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	src/Coefficient_traits_template.hh, src/Concrete_Expression.cc,
+	src/Concrete_Expression.defs.hh,
+	src/Concrete_Expression.inlines.hh,
+	src/Concrete_Expression.types.hh, src/Congruence.cc,
+	src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	src/Congruence.types.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Congruence_System.types.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Constant_Floating_Point_Expression.types.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	src/Constraint.types.hh, src/Constraint_System.cc,
+	src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	src/DB_Matrix.types.hh, src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	src/DB_Row.templates.hh, src/DB_Row.types.hh, src/Dense_Matrix.cc,
+	src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+	src/Dense_Matrix.types.hh, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh, src/Dense_Row.templates.hh,
+	src/Dense_Row.types.hh, src/Determinate.defs.hh,
+	src/Determinate.inlines.hh, src/Determinate.types.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Difference_Floating_Point_Expression.types.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.types.hh, src/Float.cc,
+	src/Float.defs.hh, src/Float.inlines.hh, src/Float.templates.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.types.hh, src/GMP_Integer.defs.hh,
+	src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator.types.hh, src/Generator_System.cc,
+	src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	src/Generator_System.types.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh,
+	src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+	src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init.defs.hh,
+	src/Init.inlines.hh, src/Init.types.hh, src/Integer_Interval.hh,
+	src/Interval.defs.hh, src/Interval.inlines.hh,
+	src/Interval.templates.hh, src/Interval.types.hh,
+	src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+	src/Interval_Info.types.hh, src/Interval_Restriction.defs.hh,
+	src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+	src/Linear_Form.cc, src/Linear_Form.defs.hh,
+	src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+	src/Linear_Form.types.hh, src/Linear_Row.cc,
+	src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	src/Linear_Row.types.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/Linear_System.types.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	src/Makefile.am, src/Matrix.defs.hh, src/Matrix.types.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.types.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.types.hh,
+	src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/PIP_Tree.inlines.hh, src/PIP_Tree.types.hh,
+	src/Partial_Function.cc, src/Partial_Function.defs.hh,
+	src/Partial_Function.inlines.hh, src/Partial_Function.types.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+	src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+	src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+	src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+	src/Poly_Gen_Relation.inlines.hh, src/Poly_Gen_Relation.types.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron.types.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	src/Powerset.templates.hh, src/Powerset.types.hh,
+	src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	src/Ptr_Iterator.types.hh, src/Rational_Box.hh,
+	src/Rational_Interval.hh, src/Result.defs.hh,
+	src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+	src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row.types.hh,
+	src/Row_Flags.cc, src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+	src/Row_Flags.types.hh, src/Scalar_Products.cc,
+	src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	src/Scalar_Products.types.hh, src/Slow_Copy.hh,
+	src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh, src/Sparse_Matrix.types.hh,
+	src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+	src/Sparse_Row.types.hh, src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.types.hh, src/Temp.defs.hh,
+	src/Temp.inlines.hh, src/Temp.templates.hh, src/Topology.types.hh,
+	src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable.types.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.types.hh,
+	src/Variables_Set.cc, src/Variables_Set.defs.hh,
+	src/Variables_Set.inlines.hh, src/Variables_Set.types.hh,
+	src/WRD_coefficient_types.defs.hh,
+	src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+	src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	src/algorithms.hh, src/assert.cc, src/assert.hh,
+	src/assign_or_swap.hh, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/c_streambuf.types.hh,
+	src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/compiler.hh, src/conversion.cc,
+	src/distances.defs.hh, src/distances.inlines.hh,
+	src/distances.types.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+	src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	src/globals.types.hh, src/initializer.hh, src/intervals.defs.hh,
+	src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	src/iterator_to_const.types.hh, src/linearize.hh,
+	src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+	src/max_space_dimension.hh, src/meta_programming.hh,
+	src/minimize.cc, src/mp_std_bits.cc, src/mp_std_bits.defs.hh,
+	src/mp_std_bits.inlines.hh, src/namespaces.hh,
+	src/ppl-config.cc.in, src/ppl_header.hh, src/simplify.cc,
+	src/stdiobuf.cc, src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh,
+	src/stdiobuf.types.hh, src/swapping_sort.templates.hh,
+	src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, src/version.cc, src/version.hh.in,
+	src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+	tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	tests/BD_Shape/addspacedims1.cc,
+	tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+	tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+	tests/BD_Shape/ascii_dump_load1.cc,
+	tests/BD_Shape/bgp99extrapolation1.cc,
+	tests/BD_Shape/bhmz05widening1.cc,
+	tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	tests/BD_Shape/boundedaffineimage1.cc,
+	tests/BD_Shape/boundedaffinepreimage1.cc,
+	tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+	tests/BD_Shape/contains1.cc,
+	tests/BD_Shape/containsintegerpoint1.cc,
+	tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+	tests/BD_Shape/disjoint1.cc,
+	tests/BD_Shape/dropsomenonintegerpoints1.cc,
+	tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	tests/BD_Shape/expandspacedim1.cc,
+	tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+	tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+	tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+	tests/BD_Shape/fromoctagonalshape1.cc,
+	tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+	tests/BD_Shape/generalizedaffineimage1.cc,
+	tests/BD_Shape/generalizedaffineimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage1.cc,
+	tests/BD_Shape/generalizedaffinepreimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage3.cc,
+	tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	tests/BD_Shape/integerupperboundifexact1.cc,
+	tests/BD_Shape/intersection1.cc,
+	tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	tests/BD_Shape/limitedcc76extrapolation1.cc,
+	tests/BD_Shape/limitedh79extrapolation1.cc,
+	tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	tests/BD_Shape/simplifyusingcontext1.cc,
+	tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+	tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+	tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+	tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+	tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+	tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+	tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+	tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+	tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+	tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+	tests/Box/empty1.cc, tests/Box/equality1.cc,
+	tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+	tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+	tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	tests/Box/generalizedaffineimage2.cc,
+	tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+	tests/Box/intersection1.cc, tests/Box/interval1.cc,
+	tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+	tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+	tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	tests/Box/propagateconstraints1.cc,
+	tests/Box/propagateconstraints2.cc,
+	tests/Box/refinewithcongruence1.cc,
+	tests/Box/refinewithcongruences1.cc,
+	tests/Box/refinewithconstraint1.cc,
+	tests/Box/refinewithconstraint2.cc,
+	tests/Box/refinewithconstraints1.cc,
+	tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+	tests/Box/relations2.cc, tests/Box/relations3.cc,
+	tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+	tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+	tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+	tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+	tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+	tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+	tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+	tests/Concrete_Expression/C_Expr.cc,
+	tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/C_Expr.types.hh,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/bdshape1.cc,
+	tests/Concrete_Expression/bdshape2.cc,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearform1.cc,
+	tests/Concrete_Expression/linearize.cc,
+	tests/Concrete_Expression/octagonalshape1.cc,
+	tests/Concrete_Expression/octagonalshape2.cc,
+	tests/Concrete_Expression/polyhedron1.cc,
+	tests/Concrete_Expression/polyhedron2.cc,
+	tests/Concrete_Expression/run_tests, tests/Grid/Makefile.am,
+	tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	tests/Grid/approximatepartition1.cc, tests/Grid/asciidumpload1.cc,
+	tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	tests/Grid/asciidumpload6.cc, tests/Grid/bhz03widening1.cc,
+	tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+	tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+	tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+	tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+	tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+	tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+	tests/Grid/frompolyhedron1.cc,
+	tests/Grid/generalizedaffineimage1.cc,
+	tests/Grid/generalizedaffineimage2.cc,
+	tests/Grid/generalizedaffineimage3.cc,
+	tests/Grid/generalizedaffinepreimage1.cc,
+	tests/Grid/generalizedaffinepreimage2.cc,
+	tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+	tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+	tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	tests/Grid/limitedextrapolation1.cc,
+	tests/Grid/limitedextrapolation2.cc,
+	tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	tests/Grid/powersetdifference1.cc,
+	tests/Grid/powersetgeometricallycovers1.cc,
+	tests/Grid/powersetgeometricallyequals1.cc,
+	tests/Grid/refinewithcongruences1.cc,
+	tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+	tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+	tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+	tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+	tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+	tests/MIP_Problem/Makefile.am,
+	tests/MIP_Problem/ascii_dump_load1.cc,
+	tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+	tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+	tests/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/addspacedims1.cc,
+	tests/Octagonal_Shape/affinedimension1.cc,
+	tests/Octagonal_Shape/affineimage1.cc,
+	tests/Octagonal_Shape/affineimage2.cc,
+	tests/Octagonal_Shape/affinepreimage1.cc,
+	tests/Octagonal_Shape/affinepreimage2.cc,
+	tests/Octagonal_Shape/ascii_dump_load1.cc,
+	tests/Octagonal_Shape/bhmz05widening1.cc,
+	tests/Octagonal_Shape/bhz03widening1.cc,
+	tests/Octagonal_Shape/bounded1.cc,
+	tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	tests/Octagonal_Shape/bounds1.cc,
+	tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/cc76narrowing1.cc,
+	tests/Octagonal_Shape/chinainit.cc,
+	tests/Octagonal_Shape/concatenate1.cc,
+	tests/Octagonal_Shape/congruences1.cc,
+	tests/Octagonal_Shape/constrains1.cc,
+	tests/Octagonal_Shape/constraints1.cc,
+	tests/Octagonal_Shape/contains1.cc,
+	tests/Octagonal_Shape/containsintegerpoint1.cc,
+	tests/Octagonal_Shape/difference1.cc,
+	tests/Octagonal_Shape/discrete1.cc,
+	tests/Octagonal_Shape/disjoint1.cc,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+	tests/Octagonal_Shape/empty1.cc,
+	tests/Octagonal_Shape/expandspacedim1.cc,
+	tests/Octagonal_Shape/foldspacedims1.cc,
+	tests/Octagonal_Shape/frequency1.cc,
+	tests/Octagonal_Shape/frombdshape1.cc,
+	tests/Octagonal_Shape/frombox1.cc,
+	tests/Octagonal_Shape/fromgensys1.cc,
+	tests/Octagonal_Shape/fromgrid1.cc,
+	tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	tests/Octagonal_Shape/frompolyhedron1.cc,
+	tests/Octagonal_Shape/fromspacedim1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	tests/Octagonal_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/intersection1.cc,
+	tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	tests/Octagonal_Shape/mapspacedims1.cc,
+	tests/Octagonal_Shape/max_min1.cc,
+	tests/Octagonal_Shape/max_min2.cc,
+	tests/Octagonal_Shape/maxspacedim1.cc,
+	tests/Octagonal_Shape/membytes1.cc,
+	tests/Octagonal_Shape/minconstraints1.cc,
+	tests/Octagonal_Shape/relatwithcons1.cc,
+	tests/Octagonal_Shape/relatwithcons2.cc,
+	tests/Octagonal_Shape/relatwithcons3.cc,
+	tests/Octagonal_Shape/relatwithgen1.cc,
+	tests/Octagonal_Shape/removespacedims1.cc,
+	tests/Octagonal_Shape/run_tests,
+	tests/Octagonal_Shape/simplifyusingcontext1.cc,
+	tests/Octagonal_Shape/timeelapse1.cc,
+	tests/Octagonal_Shape/unconstrain1.cc,
+	tests/Octagonal_Shape/universe1.cc,
+	tests/Octagonal_Shape/upperbound1.cc,
+	tests/Octagonal_Shape/upperboundifexact1.cc,
+	tests/Octagonal_Shape/wrap1.cc,
+	tests/Octagonal_Shape/writeoctagon1.cc,
+	tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+	tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/addcongruences1.cc,
+	tests/Partially_Reduced_Product/addconstraints1.cc,
+	tests/Partially_Reduced_Product/affineimage1.cc,
+	tests/Partially_Reduced_Product/asciidumpload1.cc,
+	tests/Partially_Reduced_Product/bounded1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/concatenate1.cc,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/congruencesproduct1.cc,
+	tests/Partially_Reduced_Product/constraints1.cc,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/contains1.cc,
+	tests/Partially_Reduced_Product/difference1.cc,
+	tests/Partially_Reduced_Product/dimension1.cc,
+	tests/Partially_Reduced_Product/directproduct1.cc,
+	tests/Partially_Reduced_Product/directproduct2.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/discrete1.cc,
+	tests/Partially_Reduced_Product/disjoint1.cc,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+	tests/Partially_Reduced_Product/equals1.cc,
+	tests/Partially_Reduced_Product/frombdshape1.cc,
+	tests/Partially_Reduced_Product/frombox1.cc,
+	tests/Partially_Reduced_Product/fromgrid1.cc,
+	tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+	tests/Partially_Reduced_Product/frompolyhedron1.cc,
+	tests/Partially_Reduced_Product/fromproduct1.cc,
+	tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+	tests/Partially_Reduced_Product/intersection1.cc,
+	tests/Partially_Reduced_Product/isempty1.cc,
+	tests/Partially_Reduced_Product/isuniverse1.cc,
+	tests/Partially_Reduced_Product/maxmin1.cc,
+	tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+	tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+	tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/spacedims1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc,
+	tests/Partially_Reduced_Product/topclosed1.cc,
+	tests/Partially_Reduced_Product/topclosure1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Partially_Reduced_Product/widening1.cc,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	tests/Polyhedron/addcongruences1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addconstraints2.cc,
+	tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerator2.cc,
+	tests/Polyhedron/addgenerators1.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/addspacedims1.cc,
+	tests/Polyhedron/addspacedims2.cc,
+	tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+	tests/Polyhedron/affinepreimage1.cc,
+	tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+	tests/Polyhedron/ascii_dump_load2.cc,
+	tests/Polyhedron/ascii_dump_load3.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bgp99extrapolation2.cc,
+	tests/Polyhedron/bhrz03widening1.cc,
+	tests/Polyhedron/bhrz03widening2.cc,
+	tests/Polyhedron/bhrz03widening3.cc,
+	tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/boundedaffinepreimage1.cc,
+	tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	tests/Polyhedron/boundedh79extrapolation1.cc,
+	tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+	tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+	tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+	tests/Polyhedron/containsintegerpoint1.cc,
+	tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+	tests/Polyhedron/disjoint2.cc,
+	tests/Polyhedron/dropsomenonintegerpoints1.cc,
+	tests/Polyhedron/dropsomenonintegerpoints2.cc,
+	tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	tests/Polyhedron/expandspacedim1.cc,
+	tests/Polyhedron/expandspacedim2.cc,
+	tests/Polyhedron/foldspacedims1.cc,
+	tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+	tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	tests/Polyhedron/fromoctagonalshape1.cc,
+	tests/Polyhedron/generalizedaffineimage1.cc,
+	tests/Polyhedron/generalizedaffineimage2.cc,
+	tests/Polyhedron/generalizedaffinepreimage1.cc,
+	tests/Polyhedron/generalizedaffinepreimage2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+	tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	tests/Polyhedron/limitedh79extrapolation1.cc,
+	tests/Polyhedron/linearexpression1.cc,
+	tests/Polyhedron/linearpartition1.cc,
+	tests/Polyhedron/linearsystem1.cc,
+	tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+	tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+	tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	tests/Polyhedron/minconstraints2.cc,
+	tests/Polyhedron/mingenerators1.cc,
+	tests/Polyhedron/mingenerators2.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+	tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+	tests/Polyhedron/polyhull2.cc,
+	tests/Polyhedron/polyhullifexact1.cc,
+	tests/Polyhedron/polyhullifexact2.cc,
+	tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/refinewithcongruence1.cc,
+	tests/Polyhedron/refinewithcongruences1.cc,
+	tests/Polyhedron/refinewithconstraint1.cc,
+	tests/Polyhedron/refinewithconstraints1.cc,
+	tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	tests/Polyhedron/relations3.cc,
+	tests/Polyhedron/removespacedims1.cc,
+	tests/Polyhedron/removespacedims2.cc,
+	tests/Polyhedron/simplifyusingcontext1.cc,
+	tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+	tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+	tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+	tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+	tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+	tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+	tests/Polyhedron/writegensys1.cc,
+	tests/Polyhedron/writepolyhedron1.cc,
+	tests/Polyhedron/writepolyhedron2.cc,
+	tests/Polyhedron/writerelation1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+	tests/Powerset/addcongruences1.cc,
+	tests/Powerset/addconstraints1.cc,
+	tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+	tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+	tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+	tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+	tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+	tests/Powerset/containsintegerpoint1.cc,
+	tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+	tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+	tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+	tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+	tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+	tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+	tests/Powerset/fromoctagonalshape1.cc,
+	tests/Powerset/frompolyhedron1.cc,
+	tests/Powerset/fromspacedimension1.cc,
+	tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+	tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+	tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+	tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+	tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+	tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+	tests/Powerset/upperbound1.cc, tests/README,
+	tests/Random_Number_Generator.defs.hh,
+	tests/Random_Number_Generator.inlines.hh,
+	tests/Random_Number_Generator.types.hh,
+	tests/Sparse_Matrix/Makefile.am,
+	tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+	tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+	utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: Bumped
+	copyright years.
+
+2012-01-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc, src/BD_Shape.templates.hh,
+	src/Boundary.defs.hh, src/MIP_Problem.cc, src/PIP_Tree.cc,
+	src/Sparse_Row.cc, src/Variables_Set.cc, src/termination.cc,
+	src/wrap_assign.hh: Reduced the scope of several variables.
+	Detected by ECLAIR service minscope.
+
+2012-01-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am: Also add bugseng_logo.pdf to EXTRA_DIST.
+
+2012-01-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am: Added ppl_logo* to EXTRA_DIST.
+
+2011-12-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Any_Pointset.defs.hh, src/Ask_Tell.inlines.hh,
+	src/Ask_Tell.templates.hh, src/BDS_Status.inlines.hh,
+	src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh, src/Bit_Row.cc,
+	src/Bit_Row.defs.hh, src/Boundary.defs.hh, src/Box.cc,
+	src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	src/C_Polyhedron.inlines.hh,
+	src/Cast_Floating_Point_Expression.defs.hh, src/Checked_Number.cc,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Congruence.cc, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Constant_Floating_Point_Expression.defs.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint_System.cc,
+	src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+	src/Determinate.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh, src/Float.defs.hh,
+	src/Float.inlines.hh, src/Float.templates.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator_System.cc, src/Generator_System.defs.hh,
+	src/Generator_System.inlines.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+	src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/Has_Assign_Or_Swap.hh,
+	src/Interval.defs.hh, src/Interval.inlines.hh,
+	src/Interval.templates.hh, src/Interval_Info.defs.hh,
+	src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.inlines.hh, src/Linear_Form.templates.hh,
+	src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Og_Status.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/Partial_Function.inlines.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.defs.hh,
+	src/Poly_Gen_Relation.defs.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.templates.hh,
+	src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	src/Scalar_Products.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh, src/Temp.inlines.hh,
+	src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variables_Set.cc, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+	src/Widening_Function.inlines.hh, src/assert.hh,
+	src/checked.defs.hh, src/checked.inlines.hh,
+	src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/conversion.cc,
+	src/distances.inlines.hh, src/fpu-c99.inlines.hh,
+	src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+	src/globals.inlines.hh, src/intervals.defs.hh,
+	src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	src/linearize.hh, src/math_utilities.defs.hh,
+	src/math_utilities.inlines.hh, src/meta_programming.hh,
+	src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+	src/simplify.cc, src/swapping_sort.templates.hh,
+	src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, src/wrap_string.cc,
+	src/wrap_string.hh, utils/timings.cc: Revert "Do not use the <TAB>
+	character for code layout." This reverts commit f6060073e3b31277cf475ba90c0eb751663a81e8.
+
+2011-12-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Any_Pointset.defs.hh, src/Ask_Tell.inlines.hh,
+	src/Ask_Tell.templates.hh, src/BDS_Status.inlines.hh,
+	src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh, src/Bit_Row.cc,
+	src/Bit_Row.defs.hh, src/Boundary.defs.hh, src/Box.cc,
+	src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	src/C_Polyhedron.inlines.hh,
+	src/Cast_Floating_Point_Expression.defs.hh, src/Checked_Number.cc,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Congruence.cc, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Constant_Floating_Point_Expression.defs.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint_System.cc,
+	src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+	src/Determinate.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh, src/Float.defs.hh,
+	src/Float.inlines.hh, src/Float.templates.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator_System.cc, src/Generator_System.defs.hh,
+	src/Generator_System.inlines.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+	src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/Has_Assign_Or_Swap.hh,
+	src/Interval.defs.hh, src/Interval.inlines.hh,
+	src/Interval.templates.hh, src/Interval_Info.defs.hh,
+	src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.inlines.hh, src/Linear_Form.templates.hh,
+	src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Og_Status.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/Partial_Function.inlines.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.defs.hh,
+	src/Poly_Gen_Relation.defs.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.templates.hh,
+	src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	src/Scalar_Products.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh, src/Temp.inlines.hh,
+	src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variables_Set.cc, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+	src/Widening_Function.inlines.hh, src/assert.hh,
+	src/checked.defs.hh, src/checked.inlines.hh,
+	src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/conversion.cc,
+	src/distances.inlines.hh, src/fpu-c99.inlines.hh,
+	src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+	src/globals.inlines.hh, src/intervals.defs.hh,
+	src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	src/linearize.hh, src/math_utilities.defs.hh,
+	src/math_utilities.inlines.hh, src/meta_programming.hh,
+	src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+	src/simplify.cc, src/swapping_sort.templates.hh,
+	src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, src/wrap_string.cc,
+	src/wrap_string.hh, utils/timings.cc: Do not use the <TAB> character
+	for code layout.  Detected by ECLAIR service tabindnt.
+
+2011-12-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: The automake option `dist-lzma' is obsoleted by
+	`dist-xz'.
+
+2011-12-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	src/Makefile.am, src/Partial_Function.inlines.hh, src/assert.cc,
+	src/assert.hh, src/checked.defs.hh, src/globals.inlines.hh: Added
+	functions ppl_unreachable() and ppl_unreachable_msg(), causing
+	program termination using abort().  Let PPL_UNREACHABLE and
+	PPL_ASSERT be based on these functions.  Avoid a cycle in header
+	inclusion dependencies.
+
+2011-12-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc: Corrected typo causing test failures.
+
+2011-12-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Prefer early return to dummy assignment
+	in unreachable code path.
+
+2011-12-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Add assignment to silence compiler
+	warning.
+
+2011-12-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Fixed
+	typo.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc: Improved name of helper
+	function in OCaml interface.  Add default label to switch to avoid
+	warning.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/BD_Shape.templates.hh,
+	src/Box.templates.hh, src/Grid_widenings.cc, src/MIP_Problem.cc,
+	src/Octagonal_Shape.templates.hh, src/Polyhedron_widenings.cc,
+	src/assert.hh: Added debugging macro PPL_EXPECT_HEAVY.  Added
+	debugging helper function template copy_contains().  Systematically
+	use PPL_EXPECT_HEAVY(copy_contains(...)) when checking containment
+	assumptions in widening/narrowing methods.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh: Better differentiate
+	between unreachable code and unexpected values.  We call, e.g.,
+	PPL_JAVA_UNEXPECTED when we are converting an illegal Java value to
+	a C++ value; we call PPL_UNREACHABLE when such a mismatch occurs the
+	other way round (an illegal C++ value produced by the core library).
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.cc: Prefer if statement to switch
+	having a single case.  Detected by ECLAIR service swchlabs.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ppl-config.cc.in: Prefer if-then-else to switch having a
+	single case label.  Detected by ECLAIR service swchlabs.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh: Added macro
+	PPL_C_UNREACHABLE_MSG.  Use the new macro in a few places in the C
+	interface code.  Standardized messages for errors due to Watchdog
+	library not enabled.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh: Added macros
+	PPL_OCAML_UNREACHABLE and PPL_OCAML_UNREACHABLE_MSG.  Try and use
+	them systematically in the OCaml interface.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh: Added new macro
+	PPL_JAVA_UNREACHABLE.  Use the new macro to mark unreachable code in
+	the Java interface files.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/Float.templates.hh, src/Grid.defs.hh, src/Grid_conversion.cc,
+	src/Grid_nonpublic.cc, src/Linear_Form.templates.hh,
+	src/MIP_Problem.cc, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/PIP_Problem.cc,
+	src/PIP_Tree.cc, src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/linearize.hh, src/minimize.cc: Replaced throws of runtime_error
+	exceptions by calls to PPL_UNREACHABLE.  Got rid of a few (now
+	unused) exception throwers.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh: Avoid (unreachable) default label when all
+	cases have been listed.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh: Prefer PPL_UNREACHABLE to PPL_ASSERT(0).
+	Avoid mixing reachable and unreachable code paths.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.inlines.hh: Replaced an occurrence of PPL_ASSERT(0) by
+	PPL_UNREACHABLE.  Added an assertion and comment explaining why
+	cases are unreachable.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_int.inlines.hh: Replaced an occurrence of
+	PPL_ASSERT(0) by PPL_UNREACHABLE.  Added proper assertion for
+	preconditions.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Prefer if-then-else construct to binary
+	switch.  Detected by ECLAIR service swchlabs.  Prefer listing a couple of residual switch cases to default label.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh: Replaced PPL_ASSERT(false) with
+	PPL_UNREACHABLE.  For readability, avoid mixing reachable and
+	unreachable paths.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh: Prefer if-then-else construct to binary
+	switch.  Detected by ECLAIR service swchlabs.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Fixed a couple of switch statements
+	where we were mixing reachable and unreachable code paths, reducing
+	readability.  Added precondition assertions at the start of
+	assign_special_float() so as to make clearer why the default switch
+	case is unreachable.
+
+2011-12-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Boundary.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/CO_Tree.cc, src/CO_Tree.templates.hh,
+	src/Grid_Generator.inlines.hh, src/Grid_public.cc,
+	src/Interval.defs.hh, src/Interval.inlines.hh,
+	src/Interval.templates.hh, src/Interval_Restriction.defs.hh,
+	src/Polyhedron_public.cc, src/assert.hh,
+	src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	src/checked_mpz.inlines.hh, src/intervals.defs.hh, src/linearize.hh: 
+	Added new macro PPL_UNREACHABLE, to be used instead of
+	PPL_ASSERT(false).  Started replacing calls to PPL_ASSERT(false) in
+	the core library code.
+
+2011-12-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* demos/ppl_pips/ppl_pips.cc: demos/ppl_pips: remove two unused
+	functions.
+
+2011-12-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh: Indentation fixed.  Detected
+	by ECLAIR service indntion.
+
+2011-12-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/BD_Shape/cc76extrapolation1.cc: 
+	tests/BD_Shape/cc76extrapolation1: avoid unused expression warnings
+	by casting to void.
+
+2011-12-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Disable all abstractions based on machine
+	floating-point numbers when clang++ is detected.
+
+2011-12-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* configure.ac: Detect when clang++ is used, and disable
+	-frounding-math in that case.
+
+2011-12-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/Concrete_Expression/C_Expr.defs.hh: 
+	tests/Concrete_Expression: avoid using unnamed types as template
+	arguments.
+
+2011-12-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: avoid static_casts
+	between Coefficient* and void*. Use an allocator instead.
+
+2011-12-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Enforce generator normalization in
+	  private method Polyhedron::BFT00_poly_hull_assign_if_exact() and add
+	corresponding assertion.
+
+2011-12-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_public.cc: Style improvements for
+	Grid::relation_with(const Congruence& cg) const.  No functionality
+	change.
+
+2011-12-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_public.cc: Corrected errors in method
+	Grid::relation_with(const Constraint&) const.  The method was affected by two problems: 1) when working on a non-minimized grid generator system, the points    after the first one were transformed into parameters that were
+	   not satisfying the Grid_Generator invariant (reported by Marco
+	Poletti); 2) the method was providing an incorrect result when comparing a
+	   grid generator line/parameter with a (strict) inequality constraint,    as happens for test20() in tests/Grid/relations3.cc.
+
+2011-12-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/relations3.cc: Added new test showing an error in
+	Grid::relation_with(const Constraint&).
+
+2011-11-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_words, src/Pointset_Powerset.templates.hh,
+	src/Polyhedron_nonpublic.cc, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh: Project vocabulary fixes.  Detected by
+	ECLAIR service progvcbl.
+
+2011-11-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/vocabulary: Updated.
+
+2011-11-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_ids: Sorted list of good identifiers.
+
+2011-11-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_words, devtools/vocabulary: Vocabulary updated.
+
+2011-11-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words, devtools/vocabulary,
+	src/Pointset_Powerset.templates.hh, src/Powerset.templates.hh,
+	src/algorithms.hh, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/checked.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/globals.defs.hh,
+	src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+	src/meta_programming.hh, src/simplify.cc, src/stdiobuf.cc,
+	src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh, src/termination.cc,
+	src/termination.templates.hh, src/wrap_assign.hh,
+	src/wrap_string.cc, utils/timings.cc: Project vocabulary fixes.
+	Detected by ECLAIR service progvcbl.
+
+2011-11-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words, devtools/vocabulary,
+	src/PIP_Problem.defs.hh, src/Polyhedron_public.cc,
+	src/Sparse_Row.cc, src/Temp.defs.hh: Project vocabulary fixes.
+	Detected by ECLAIR service progvcbl.
+
+2011-11-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/vocabulary, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/Box.defs.hh, src/Box.templates.hh,
+	src/Grid.defs.hh, src/Grid_public.cc, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/PIP_Problem.defs.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/wrap_assign.hh: Project vocabulary fixes.  Detected by ECLAIR
+	service progvcbl.
+
+2011-11-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh: Project vocabulary fixes.
+	Detected by ECLAIR service progvcbl.
+
+2011-11-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words,
+	src/Octagonal_Shape.templates.hh, src/PIP_Problem.defs.hh,
+	src/PIP_Tree.defs.hh, src/Partially_Reduced_Product.defs.hh,
+	src/Pointset_Ask_Tell.defs.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/checked.cc: Project vocabulary fixes.  Detected by ECLAIR
+	service progvcbl.
+
+2011-11-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words, src/CO_Tree.defs.hh,
+	src/Checked_Number.defs.hh, src/Float.defs.hh,
+	src/Float.inlines.hh, src/Float.templates.hh, src/Init.defs.hh,
+	src/Interval.templates.hh, src/Linear_Form.defs.hh,
+	src/Linear_Form.templates.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Og_Status.inlines.hh, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/checked.inlines.hh: Project vocabulary fixes.  Detected by
+	ECLAIR service progvcbl.
+
+2011-11-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc, devtools/good_items,
+	devtools/good_words, src/Bit_Matrix.cc, src/Box.defs.hh,
+	src/Box.templates.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+	src/CO_Tree.inlines.hh, src/Checked_Number.inlines.hh,
+	src/Checked_Number.templates.hh, src/Congruence.defs.hh,
+	src/Congruence_System.inlines.hh, src/Constraint_System.defs.hh,
+	src/Constraint_System.inlines.hh, src/Float.defs.hh,
+	src/Float.templates.hh, src/Floating_Point_Expression.defs.hh,
+	src/GMP_Integer.types.hh, src/Generator.cc,
+	src/Generator_System.cc, src/Generator_System.defs.hh,
+	src/Generator_System.inlines.hh, src/Grid.defs.hh,
+	src/Grid_Generator.cc, src/Grid_public.cc, src/Init.cc,
+	src/Init.defs.hh, src/Interval.inlines.hh, src/Linear_Form.defs.hh,
+	src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/MIP_Problem.inlines.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh: 
+	Project vocabulary fixes.  Detected by ECLAIR service progvcbl.
+
+2011-11-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items: Added a few more lexical items.
+
+2011-11-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.templates.hh,
+	demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+	src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+	src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.inlines.hh, src/Box.defs.hh,
+	src/Box.inlines.hh, src/Box.templates.hh,
+	src/Box_Status.inlines.hh, src/Checked_Number.defs.hh,
+	src/Float.defs.hh, src/Grid_Certificate.inlines.hh,
+	src/H79_Certificate.inlines.hh, src/Rounding_Dir.defs.hh,
+	src/Sparse_Matrix.defs.hh, src/Sparse_Row.cc,
+	src/Sparse_Row.defs.hh: Project vocabulary fixes.  Detected by
+	ECLAIR service progvcbl.
+
+2011-11-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words, devtools/vocabulary: 
+	Updated.
+
+2011-11-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Do not rely on libtool guessing the language.
+	(Thanks to Serge Belyshev.)
+
+2011-11-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words: Put items on the right
+	list.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_items, devtools/good_words: Separate words from
+	lexical items.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh: Fixed FSF address.  Detected by ECLAIR
+	service cmntfile.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/Checked_Number.cc,
+	src/Coefficient_traits_template.hh, src/DB_Matrix.defs.hh,
+	src/DB_Row.defs.hh, src/Grid_public.cc, src/Linear_Row.defs.hh,
+	src/Linear_System.defs.hh, src/Makefile.am, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape.inlines.hh, src/Og_Status.idefs.hh,
+	src/Og_Status.inlines.hh, src/{Topology.hh => Topology.types.hh},
+	src/checked.cc, src/checked.defs.hh, src/mp_std_bits.cc,
+	src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+	src/swapping_sort.templates.hh: Fixed file comment blocks and
+	related mistakes.  Detected by ECLAIR service cmntfile.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh: Conflicts resolved.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Bit_Matrix.defs.hh, src/Box.defs.hh,
+	src/Box.templates.hh: Project vocabulary fixes.  Detected by ECLAIR
+	service idntvcbl.
+
+2011-11-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-language-interface.doxyconf.in,
+	doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Let
+	Doxygen expand macro PPL_USE_SPARSE_MATRIX as defined.
+
+2011-11-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Matrix.defs.hh,
+	src/Matrix.types.hh, src/PIP_Tree.cc, src/Row.defs.hh,
+	src/Row.types.hh, src/globals.defs.hh, tests/CO_Tree/cotree1.cc,
+	tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc: Renamed macros
+	USE_PPL_SPARSE_MATRIX to use PPL_ prefix.
+
+2011-11-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Sparse_Matrix.cc, src/Sparse_Row.cc: Added a few missing
+	\relates Doxygen commands.
+
+2011-11-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox: The swapping methods of PPL types are now
+	named m_swap.
+
+2011-11-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/namespaces.hh: swap functions for PPL types are now defined in
+	the PPL namespace.
+
+2011-11-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_prolog_common.cc, src/Affine_Space.cc,
+	src/Affine_Space.defs.hh, src/Affine_Space.inlines.hh,
+	src/Any_Pointset.defs.hh, src/Ask_Tell.defs.hh,
+	src/Ask_Tell.inlines.hh, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+	src/Bit_Matrix.inlines.hh, src/Bit_Row.defs.hh,
+	src/Bit_Row.inlines.hh, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+	src/CO_Tree.inlines.hh, src/C_Polyhedron.inlines.hh,
+	src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.inlines.hh, src/Congruence.cc,
+	src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	src/Congruence_System.inlines.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+	src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/Dense_Matrix.cc,
+	src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+	src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator_System.cc, src/Generator_System.defs.hh,
+	src/Generator_System.inlines.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid_Generator.cc,
+	src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh, src/Grid_chdims.cc,
+	src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	src/Grid_widenings.cc, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval_Info.defs.hh,
+	src/Interval_Info.inlines.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	src/Linear_Form.defs.hh, src/Linear_Form.inlines.hh,
+	src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/MIP_Problem.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/NNC_Polyhedron.inlines.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	src/Powerset.templates.hh, src/Sparse_Matrix.cc,
+	src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh,
+	src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	src/assign_or_swap.hh, src/conversion.cc, src/simplify.cc,
+	src/swapping_sort.templates.hh, src/termination.cc,
+	src/wrap_assign.hh, tests/Ask_Tell/append1.cc,
+	tests/CO_Tree/cotree1.cc, tests/PIP_Problem/pipproblem2.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bhz03widening1.cc,
+	tests/Polyhedron/exceptions2.cc, tests/Powerset/empty1.cc,
+	tests/Powerset/powerset1.cc, tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc, tests/ppl_test.hh: Avoid
+	overloading std::swap for PPL types.  Define functions
+	Parma_Polyhedra_Library::swap and exploit ADL.  The swap _methods_
+	T::swap(T&) renamed as T::m_swap(T&).
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/vocabulary: More words added.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_words: Added a word legitimately occurring in a
+	comment.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_words: Added more Doxygen and LaTeX keywords.
+
+2011-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.templates.hh, Watchdog/src/Watchdog.cc,
+	demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+	src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh: Started fixing the vocabulary used
+	throughout the library.  Detected by ECLAIR service idntvcbl.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_words, devtools/vocabulary: Updated.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/vocabulary: Updated.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc: Updated.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4, src/Makefile.am: Allow `--with-gmp-build' to
+	be used with `--enable-shared'.  (Thanks to Serge Belyshev.)
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-language-interface.tex, doc/devref.tex,
+	doc/user-language-interface.tex, doc/user.tex: Front matter updated
+	for all manuals.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-language-interface.tex: Front matter updated.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.tex: No longer pass the `draft' option to package
+	`hyperref'.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/bugseng_logo.eps, doc/bugseng_logo.svg, doc/ppl_logo.eps,
+	doc/ppl_logo.svg, doc/ppl_logo_no_ppl.eps, doc/ppl_logo_no_ppl.svg,
+	doc/user.tex: Front matter improved.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh: Fixed Doxygen \relates command.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.tex, m4/ac_check_gmp.m4: Typo fixed.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/.gitignore, doc/bugseng_logo.eps, doc/bugseng_logo.svg,
+	doc/ppl_logo.eps, doc/ppl_logo.svg, doc/ppl_logo_no_ppl.eps,
+	doc/ppl_logo_no_ppl.svg: New logos.
+
+2011-11-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Fixed the handling of the `--with-gmp-build'
+	configure option.  (Thanks to Serge Belyshev.)
+
+2011-11-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh: Missing comment added.
+
+2011-11-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Added missing guard against multiple inclusions.
+	Detected by ECLAIR service inclgard.
+
+2011-11-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.tex: Revised.
+
+2011-11-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/.gitignore, doc/ppl_logo.eps, doc/ppl_logo.svg,
+	doc/ppl_logo_no_ppl.eps, doc/ppl_logo_no_ppl.svg: The PPL logo in
+	various formats.
+
+2011-11-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Box.defs.hh,
+	src/DB_Matrix.templates.hh, src/DB_Row.defs.hh, src/Grid.defs.hh,
+	src/Grid_public.cc, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Pointset_Powerset.defs.hh, src/Polyhedron_public.cc,
+	src/Variables_Set.cc, src/minimize.cc: Indentation fixes.  Detected
+	by ECLAIR service indntion.
+
+2011-11-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/PIP_Tree.cc,
+	src/checked_int.inlines.hh: Code layout corrections.
+
+2011-11-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Avoid reusing names reserved by the
+	C++ standard.  Detected by ECLAIR service resvidnt.
+
+2011-11-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Avoid reusing names reserved by the
+	C++ standard.  Detected by ECLAIR service resvidnt.
+
+2011-11-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: FIXME resolved.
+
+2011-11-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+	src/Polyhedron_nonpublic.cc: Avoid reusing names reserved by the C++
+	standard.  In the process, consistency improved with respect to
+	conventions used throughout the library.  Detected by ECLAIR service
+	resvidnt.
+
+2011-11-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Form.inlines.hh, src/checked.cc: Scope of variables
+	reduced.  Detected by ECLAIR service minscope.
+
+2011-11-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.templates.hh: Code layout improved.
+
+2011-11-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/math_utilities.inlines.hh: Simplified implementation.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_int.inlines.hh: Avoid implicit conversions reducing
+	size of underlying type.  Detected by ECLAIR service utypflag.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Row.cc: Avoid implicit conversion reducing size of
+	underlying type.  Detected by ECLAIR service utypflag.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/meta_programming.hh: Removed redundant cast.  Detected by
+	ECLAIR service castexpr.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.cc: Removed several redundant casts.  Detected by
+	ECLAIR service castexpr.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_Generator_System.cc, src/Grid_nonpublic.cc: Removed a few
+	redundant casts.  Detected by ECLAIR service castexpr.
+
+2011-11-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.cc: Use consistently get_digit.
+
+2011-11-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_float.inlines.hh, src/fpu-c99.inlines.hh: Fixed bool
+	vs. numeric unsafe mixing.  Detected by ECLAIR service utypflag.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.cc: Avoid implicit integral conversion reducing size
+	of underlying type.  Detected by ECLAIR service utypflag.
+
+2011-11-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Float.defs.hh, src/Float.inlines.hh,
+	src/Interval_Info.defs.hh, src/checked.cc: Fixed bool vs. numeric
+	unsafe mixing.  Detected by ECLAIR service utypflag.
+
+2011-11-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Integer.hh: Fixed plain char vs. numeric unsafe mixing.
+	Detected by ECLAIR service utypflag.
+
+2011-11-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.templates.hh, src/c_streambuf.cc, src/checked.cc: 
+	Fixed plain char vs. numeric unsafe mixing.  Detected by ECLAIR
+	service utypflag.
+
+2011-11-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.inlines.hh: Avoid explicit integral conversions that
+	change the signedness of the underlying type of complex expressions.
+	Detected by ECLAIR service utypflag.
+
+2011-11-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh, src/c_streambuf.cc, src/checked.cc: 
+	Revert "Fixed plain char vs. numeric unsafe mixing." This reverts commit e9ce6bcef3d6f7481e5399d8746062ccc72b25b0.
+
+2011-11-02  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.templates.hh, src/c_streambuf.cc, src/checked.cc: 
+	Fixed plain char vs. numeric unsafe mixing.  Detected by ECLAIR
+	service utypflag.
+
+2011-11-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.cc: Do not mix plain char and numeric values.
+	Detected by ECLAIR service utypflag.
+
+2011-11-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/CO_Tree.cc, src/CO_Tree.templates.hh: Use an explicitly signed
+	char type when dealing with numeric info.  Detected by ECLAIR
+	service utypflag.
+
+2011-11-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh: Added missing using directive.
+
+2011-11-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh: Revert "Revert "Avoid anonymous namespaces
+	in header files."" This reverts commit 3fbf4608f85679fc85f89d82f40fb20e0e60ca16.
+
+2011-11-01  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Box.templates.hh: Revert "Avoid anonymous namespaces in header
+	files." This reverts commit 086a400757aa4867611c023dcda5bc70afbc18b5.
+
+2011-11-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Spurious declaration removed.
+	Detected by ECLAIR service araysize.
+
+2011-11-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh: Avoid anonymous namespaces in header files.
+	Detected by ECLAIR service hedrfile.
+
+2011-10-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.defs.hh: Header file inclusions reordered.
+
+2011-10-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/BD_Shape.cc, src/BHRZ03_Certificate.cc,
+	src/Bit_Matrix.cc, src/Bit_Row.cc, src/Box.cc, src/CO_Tree.cc,
+	src/C_Polyhedron.cc, src/Checked_Number.cc, src/Coefficient.cc,
+	src/Concrete_Expression.cc, src/Congruence.cc,
+	src/Congruence_System.cc, src/Constraint.cc,
+	src/Constraint_System.cc, src/Dense_Matrix.cc, src/Dense_Row.cc,
+	src/Float.cc, src/Generator.cc, src/Generator_System.cc,
+	src/Grid_Certificate.cc, src/Grid_Generator.cc,
+	src/Grid_Generator_System.cc, src/Grid_Status.cc,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/Init.cc, src/Linear_Expression.cc,
+	src/Linear_Form.cc, src/Linear_Row.cc, src/Linear_System.cc,
+	src/MIP_Problem.cc, src/NNC_Polyhedron.cc, src/Octagonal_Shape.cc,
+	src/PIP_Problem.cc, src/PIP_Tree.cc, src/Partial_Function.cc,
+	src/Ph_Status.cc, src/Pointset_Ask_Tell.cc,
+	src/Pointset_Powerset.cc, src/Poly_Con_Relation.cc,
+	src/Poly_Gen_Relation.cc, src/Polyhedron_chdims.cc,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Polyhedron_widenings.cc, src/Row_Flags.cc,
+	src/Scalar_Products.cc, src/Sparse_Matrix.cc, src/Sparse_Row.cc,
+	src/Variable.cc, src/Variables_Set.cc, src/Weight_Profiler.cc,
+	src/c_streambuf.cc, src/checked.cc, src/conversion.cc,
+	src/fpu-ia32.cc, src/globals.cc, src/minimize.cc,
+	src/mp_std_bits.cc, src/simplify.cc, src/stdiobuf.cc,
+	src/termination.cc, src/version.cc, src/wrap_string.cc,
+	utils/timings.cc: Use <> brackets for system and standard library
+	headers only; use "" quotes for all other headers.  Detected by
+	ECLAIR service hedrbrks.
+
+2011-10-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh, src/Checked_Number.inlines.hh: Long lines
+	avoided.
+
+2011-10-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc: Fixed typo.
+
+2011-10-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc,
+	src/Concrete_Expression.inlines.hh, src/Float.defs.hh,
+	src/Float.inlines.hh, src/checked_float.inlines.hh,
+	src/globals.defs.hh: Fixed wrong type uses.  Detected by ECLAIR
+	service utypflag.
+
+2011-10-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.templates.hh, src/Congruence.cc,
+	src/checked.cc: Fixed bugs whereby the wrong types were used so that
+	overflows were possible.  Detected by ECLAIR service utypflag.
+
+2011-10-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh, src/Grid.inlines.hh: Unwanted null
+	statements removed.  Detected by ECLAIR service nullstmt.
+
+2011-10-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.defs.hh: Long line avoided.
+
+2011-10-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh: Avoid explicit integral conversions that
+	change the signedness of the underlying type of complex expressions.
+	Detected by ECLAIR service utypflag.
+
+2011-10-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: 
+	Removed trailing whitespace.
+
+2011-10-29  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: Avoid unsigned
+	integer wrap-around in constant expressions.  Detected by ECLAIR
+	service cnstwrap.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Concrete_Expression.defs.hh,
+	src/Concrete_Expression.inlines.hh: Avoid implementation-defined
+	behavior by having bitfields of explicit unsigned integral type.
+	Detected by ECLAIR service bitftype.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh, src/checked_int.inlines.hh: Do not
+	reuse names reserved by the C++ implementation.  Detected by ECLAIR
+	service resvidnt.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Linear_System.cc,
+	src/swapping_sort.templates.hh: Avoid anonymous namespaces in header
+	files.  Detected by ECLAIR service hedrfile.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Linear_System.cc, src/Makefile.am,
+	src/{swapping_sort.icc => swapping_sort.templates.hh}: Source file
+	renamed.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc: Code layout improved.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.defs.hh: Use standard notation for pairs.
+
+2011-10-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Unwanted, commented-out code removed.
+	Detected by ECLAIR service cmntdout.  (Thanks to Roberto Amadini.)
+
+2011-10-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: Removed commented out line of code that was
+	introduced in the debugging phase.  Detected by ECLAIR service
+	cmntdout.
+
+2011-10-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-config.sed: Do rename HAVE_DECL_SETRLIMIT.  Detected by ECLAIR
+	service idntvcbl.
+
+2011-10-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, CREDITS, Makefile.am, README, README.configure, STANDARDS,
+	TODO, Watchdog/Makefile.am, Watchdog/README, Watchdog/configure.ac,
+	Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+	Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	Watchdog/src/EList_Iterator.defs.hh,
+	Watchdog/src/EList_Iterator.inlines.hh,
+	Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	Watchdog/src/Pending_Element.inlines.hh,
+	Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh,
+	Watchdog/src/Pending_List.templates.hh,
+	Watchdog/src/Threshold_Watcher.cc,
+	Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.inlines.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh, Watchdog/src/Time.cc,
+	Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	Watchdog/src/Watchdog.inlines.hh, Watchdog/src/pwl_header.hh,
+	Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+	Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+	Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	configure.ac, debian/control, debian/libppl-pwl.copyright.in,
+	debian/libppl.copyright.in, demos/Makefile.am,
+	demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+	demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+	demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+	demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/examples/Makefile.am,
+	demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+	demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+	demos/ppl_pips/ppl_pips_extra_man_text,
+	devtools/generate_dox_biblio,
+	devtools/generate_dox_ci_prolog_manual,
+	devtools/generate_man_pages, devtools/print_nonascii_lines,
+	doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+	doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+	doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+	fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, instchk.hh,
+	interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/ppl_c_implementation_common.inlines.hh,
+	interfaces/C/ppl_c_version.h.in,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/C/ppl_interface_generator_c_h.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+	interfaces/C/tests/ppl_c_test.h,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h,
+	interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+	ow.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+	entation.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+	a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+	interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+	java,
+	interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	, interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java,
+	interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+	va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Name.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Value.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Pair.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/PPL_Test.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Java/tests/ppl_java_tests_common,
+	interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4, interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/Ciao/ciao_cfli.hh,
+	interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/Ciao/ciao_efli.hh,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+	d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/GNU/gnu_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	interfaces/Prolog/GNU/gp_clpq.pl,
+	interfaces/Prolog/GNU/gprolog_cfli.hh,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.hh,
+	interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	interfaces/Prolog/SICStus/sicstus_cfli.h,
+	interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	interfaces/Prolog/SICStus/sicstus_efli.cc,
+	interfaces/Prolog/SICStus/sicstus_efli.hh,
+	interfaces/Prolog/SICStus/sp_clpq.pl,
+	interfaces/Prolog/SICStus/sp_pl_check.pl,
+	interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+	interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	interfaces/Prolog/SWI/ppl_pl.cc,
+	interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	interfaces/Prolog/SWI/swi_cfli.hh,
+	interfaces/Prolog/SWI/swi_efli.cc,
+	interfaces/Prolog/SWI/swi_efli.hh,
+	interfaces/Prolog/SWI/swi_pl_check.pl,
+	interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+	test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/XSB/xsb_cfli.hh,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/XSB/xsb_efli.hh,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/YAP/ppl_yap.pl,
+	interfaces/Prolog/YAP/yap_cfli.hh,
+	interfaces/Prolog/YAP/yap_clpq.pl,
+	interfaces/Prolog/YAP/yap_clpq2.pl,
+	interfaces/Prolog/YAP/yap_efli.cc,
+	interfaces/Prolog/YAP/yap_efli.hh,
+	interfaces/Prolog/YAP/yap_pl_check.pl,
+	interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.inlines.hh,
+	interfaces/Prolog/tests/Makefile.am,
+	interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+	interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4,
+	interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+	interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+	interfaces/ppl_interface_generator_common.m4,
+	interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+	m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+	m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+	m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+	m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+	m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4,
+	m4/ac_cxx_plain_char_is_signed.m4, m4/ac_cxx_proper_long_double.m4,
+	m4/ac_cxx_remainder_bug.m4, m4/ac_cxx_zero_length_arrays.m4,
+	m4/ac_prog_javac.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+	ppl.lsm.in, src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh, src/Any_Pointset.defs.hh,
+	src/Any_Pointset.inlines.hh, src/Ask_Tell.defs.hh,
+	src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+	src/Bit_Matrix.inlines.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.cc,
+	src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/Box_Status.idefs.hh, src/Box_Status.inlines.hh, src/CO_Tree.cc,
+	src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/CO_Tree.templates.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.inlines.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Checked_Number.cc, src/Checked_Number.defs.hh,
+	src/Checked_Number.inlines.hh, src/Checked_Number.templates.hh,
+	src/Coefficient.cc, src/Coefficient.defs.hh,
+	src/Coefficient.inlines.hh, src/Concrete_Expression.cc,
+	src/Concrete_Expression.defs.hh,
+	src/Concrete_Expression.inlines.hh, src/Congruence.cc,
+	src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	src/Congruence_System.inlines.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Constraint.cc, src/Constraint.defs.hh,
+	src/Constraint.inlines.hh, src/Constraint_System.cc,
+	src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+	src/Dense_Matrix.inlines.hh, src/Dense_Row.cc,
+	src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Dense_Row.templates.hh, src/Determinate.defs.hh,
+	src/Determinate.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.templates.hh, src/Float.cc,
+	src/Float.defs.hh, src/Float.inlines.hh, src/Float.templates.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator_System.cc, src/Generator_System.defs.hh,
+	src/Generator_System.inlines.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Generator.cc,
+	src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/Has_Assign_Or_Swap.hh,
+	src/Init.cc, src/Init.defs.hh, src/Init.inlines.hh,
+	src/Integer_Interval.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval.templates.hh,
+	src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+	src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	src/Linear_Form.cc, src/Linear_Form.defs.hh,
+	src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+	src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+	src/Makefile.am, src/Matrix.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/Numeric_Format.defs.hh,
+	src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	src/OR_Matrix.templates.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/Og_Status.idefs.hh,
+	src/Og_Status.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	src/Partial_Function.cc, src/Partial_Function.defs.hh,
+	src/Partial_Function.inlines.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+	src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.cc,
+	src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+	src/Poly_Gen_Relation.inlines.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	src/Powerset.templates.hh, src/Ptr_Iterator.defs.hh,
+	src/Ptr_Iterator.inlines.hh, src/Rational_Box.hh,
+	src/Rational_Interval.hh, src/Result.defs.hh,
+	src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+	src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row_Flags.cc,
+	src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+	src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	src/Scalar_Products.inlines.hh, src/Slow_Copy.hh,
+	src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh, src/Sparse_Row.cc,
+	src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+	src/Sparse_Row.templates.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh, src/Temp.defs.hh,
+	src/Temp.inlines.hh, src/Temp.templates.hh, src/Variable.cc,
+	src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	src/Variables_Set.cc, src/Variables_Set.defs.hh,
+	src/Variables_Set.inlines.hh, src/WRD_coefficient_types.defs.hh,
+	src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+	src/Widening_Function.inlines.hh, src/algorithms.hh, src/assert.hh,
+	src/assign_or_swap.hh, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/checked.cc, src/checked.defs.hh,
+	src/checked.inlines.hh, src/checked_ext.defs.hh,
+	src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+	src/distances.inlines.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+	src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	src/globals.defs.hh, src/globals.inlines.hh, src/initializer.hh,
+	src/intervals.defs.hh, src/iterator_to_const.defs.hh,
+	src/iterator_to_const.inlines.hh, src/linearize.hh,
+	src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+	src/max_space_dimension.hh, src/meta_programming.hh,
+	src/minimize.cc, src/mp_std_bits.cc, src/mp_std_bits.defs.hh,
+	src/mp_std_bits.inlines.hh, src/namespaces.hh,
+	src/ppl-config.cc.in, src/ppl_header.hh, src/simplify.cc,
+	src/stdiobuf.cc, src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh,
+	src/swapping_sort.icc, src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, src/version.cc, src/version.hh.in,
+	src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+	tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	tests/BD_Shape/addspacedims1.cc,
+	tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+	tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+	tests/BD_Shape/ascii_dump_load1.cc,
+	tests/BD_Shape/bgp99extrapolation1.cc,
+	tests/BD_Shape/bhmz05widening1.cc,
+	tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	tests/BD_Shape/boundedaffineimage1.cc,
+	tests/BD_Shape/boundedaffinepreimage1.cc,
+	tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+	tests/BD_Shape/contains1.cc,
+	tests/BD_Shape/containsintegerpoint1.cc,
+	tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+	tests/BD_Shape/disjoint1.cc,
+	tests/BD_Shape/dropsomenonintegerpoints1.cc,
+	tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	tests/BD_Shape/expandspacedim1.cc,
+	tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+	tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+	tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+	tests/BD_Shape/fromoctagonalshape1.cc,
+	tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+	tests/BD_Shape/generalizedaffineimage1.cc,
+	tests/BD_Shape/generalizedaffineimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage1.cc,
+	tests/BD_Shape/generalizedaffinepreimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage3.cc,
+	tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	tests/BD_Shape/integerupperboundifexact1.cc,
+	tests/BD_Shape/intersection1.cc,
+	tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	tests/BD_Shape/limitedcc76extrapolation1.cc,
+	tests/BD_Shape/limitedh79extrapolation1.cc,
+	tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	tests/BD_Shape/simplifyusingcontext1.cc,
+	tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+	tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+	tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+	tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+	tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+	tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+	tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+	tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+	tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+	tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+	tests/Box/empty1.cc, tests/Box/equality1.cc,
+	tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+	tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+	tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	tests/Box/generalizedaffineimage2.cc,
+	tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+	tests/Box/intersection1.cc, tests/Box/interval1.cc,
+	tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+	tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+	tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	tests/Box/propagateconstraints1.cc,
+	tests/Box/propagateconstraints2.cc,
+	tests/Box/refinewithcongruence1.cc,
+	tests/Box/refinewithcongruences1.cc,
+	tests/Box/refinewithconstraint1.cc,
+	tests/Box/refinewithconstraint2.cc,
+	tests/Box/refinewithconstraints1.cc,
+	tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+	tests/Box/relations2.cc, tests/Box/relations3.cc,
+	tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+	tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+	tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+	tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+	tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+	tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+	tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+	tests/Concrete_Expression/C_Expr.cc,
+	tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/bdshape1.cc,
+	tests/Concrete_Expression/bdshape2.cc,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearform1.cc,
+	tests/Concrete_Expression/linearize.cc,
+	tests/Concrete_Expression/octagonalshape1.cc,
+	tests/Concrete_Expression/octagonalshape2.cc,
+	tests/Concrete_Expression/polyhedron1.cc,
+	tests/Concrete_Expression/polyhedron2.cc,
+	tests/Concrete_Expression/run_tests, tests/Grid/Makefile.am,
+	tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	tests/Grid/approximatepartition1.cc, tests/Grid/asciidumpload1.cc,
+	tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	tests/Grid/asciidumpload6.cc, tests/Grid/bhz03widening1.cc,
+	tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+	tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+	tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+	tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+	tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+	tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+	tests/Grid/frompolyhedron1.cc,
+	tests/Grid/generalizedaffineimage1.cc,
+	tests/Grid/generalizedaffineimage2.cc,
+	tests/Grid/generalizedaffineimage3.cc,
+	tests/Grid/generalizedaffinepreimage1.cc,
+	tests/Grid/generalizedaffinepreimage2.cc,
+	tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+	tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+	tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	tests/Grid/limitedextrapolation1.cc,
+	tests/Grid/limitedextrapolation2.cc,
+	tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	tests/Grid/powersetdifference1.cc,
+	tests/Grid/powersetgeometricallycovers1.cc,
+	tests/Grid/powersetgeometricallyequals1.cc,
+	tests/Grid/refinewithcongruences1.cc,
+	tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+	tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+	tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+	tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+	tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+	tests/MIP_Problem/Makefile.am,
+	tests/MIP_Problem/ascii_dump_load1.cc,
+	tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+	tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+	tests/MIP_Problem/mipproblem4.cc, tests/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/addspacedims1.cc,
+	tests/Octagonal_Shape/affinedimension1.cc,
+	tests/Octagonal_Shape/affineimage1.cc,
+	tests/Octagonal_Shape/affineimage2.cc,
+	tests/Octagonal_Shape/affinepreimage1.cc,
+	tests/Octagonal_Shape/affinepreimage2.cc,
+	tests/Octagonal_Shape/ascii_dump_load1.cc,
+	tests/Octagonal_Shape/bhmz05widening1.cc,
+	tests/Octagonal_Shape/bhz03widening1.cc,
+	tests/Octagonal_Shape/bounded1.cc,
+	tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	tests/Octagonal_Shape/bounds1.cc,
+	tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/cc76narrowing1.cc,
+	tests/Octagonal_Shape/chinainit.cc,
+	tests/Octagonal_Shape/concatenate1.cc,
+	tests/Octagonal_Shape/congruences1.cc,
+	tests/Octagonal_Shape/constrains1.cc,
+	tests/Octagonal_Shape/constraints1.cc,
+	tests/Octagonal_Shape/contains1.cc,
+	tests/Octagonal_Shape/containsintegerpoint1.cc,
+	tests/Octagonal_Shape/difference1.cc,
+	tests/Octagonal_Shape/discrete1.cc,
+	tests/Octagonal_Shape/disjoint1.cc,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+	tests/Octagonal_Shape/empty1.cc,
+	tests/Octagonal_Shape/expandspacedim1.cc,
+	tests/Octagonal_Shape/foldspacedims1.cc,
+	tests/Octagonal_Shape/frequency1.cc,
+	tests/Octagonal_Shape/frombdshape1.cc,
+	tests/Octagonal_Shape/frombox1.cc,
+	tests/Octagonal_Shape/fromgensys1.cc,
+	tests/Octagonal_Shape/fromgrid1.cc,
+	tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	tests/Octagonal_Shape/frompolyhedron1.cc,
+	tests/Octagonal_Shape/fromspacedim1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	tests/Octagonal_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/intersection1.cc,
+	tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	tests/Octagonal_Shape/mapspacedims1.cc,
+	tests/Octagonal_Shape/max_min1.cc,
+	tests/Octagonal_Shape/max_min2.cc,
+	tests/Octagonal_Shape/maxspacedim1.cc,
+	tests/Octagonal_Shape/membytes1.cc,
+	tests/Octagonal_Shape/minconstraints1.cc,
+	tests/Octagonal_Shape/relatwithcons1.cc,
+	tests/Octagonal_Shape/relatwithcons2.cc,
+	tests/Octagonal_Shape/relatwithcons3.cc,
+	tests/Octagonal_Shape/relatwithgen1.cc,
+	tests/Octagonal_Shape/removespacedims1.cc,
+	tests/Octagonal_Shape/run_tests,
+	tests/Octagonal_Shape/simplifyusingcontext1.cc,
+	tests/Octagonal_Shape/timeelapse1.cc,
+	tests/Octagonal_Shape/unconstrain1.cc,
+	tests/Octagonal_Shape/universe1.cc,
+	tests/Octagonal_Shape/upperbound1.cc,
+	tests/Octagonal_Shape/upperboundifexact1.cc,
+	tests/Octagonal_Shape/wrap1.cc,
+	tests/Octagonal_Shape/writeoctagon1.cc,
+	tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+	tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/addcongruences1.cc,
+	tests/Partially_Reduced_Product/addconstraints1.cc,
+	tests/Partially_Reduced_Product/affineimage1.cc,
+	tests/Partially_Reduced_Product/asciidumpload1.cc,
+	tests/Partially_Reduced_Product/bounded1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/concatenate1.cc,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/congruencesproduct1.cc,
+	tests/Partially_Reduced_Product/constraints1.cc,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/contains1.cc,
+	tests/Partially_Reduced_Product/difference1.cc,
+	tests/Partially_Reduced_Product/dimension1.cc,
+	tests/Partially_Reduced_Product/directproduct1.cc,
+	tests/Partially_Reduced_Product/directproduct2.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/discrete1.cc,
+	tests/Partially_Reduced_Product/disjoint1.cc,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+	tests/Partially_Reduced_Product/equals1.cc,
+	tests/Partially_Reduced_Product/frombdshape1.cc,
+	tests/Partially_Reduced_Product/frombox1.cc,
+	tests/Partially_Reduced_Product/fromgrid1.cc,
+	tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+	tests/Partially_Reduced_Product/frompolyhedron1.cc,
+	tests/Partially_Reduced_Product/fromproduct1.cc,
+	tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+	tests/Partially_Reduced_Product/intersection1.cc,
+	tests/Partially_Reduced_Product/isempty1.cc,
+	tests/Partially_Reduced_Product/isuniverse1.cc,
+	tests/Partially_Reduced_Product/maxmin1.cc,
+	tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+	tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+	tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/spacedims1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc,
+	tests/Partially_Reduced_Product/topclosed1.cc,
+	tests/Partially_Reduced_Product/topclosure1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Partially_Reduced_Product/widening1.cc,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	tests/Polyhedron/addcongruences1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addconstraints2.cc,
+	tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerator2.cc,
+	tests/Polyhedron/addgenerators1.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/addspacedims1.cc,
+	tests/Polyhedron/addspacedims2.cc,
+	tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+	tests/Polyhedron/affinepreimage1.cc,
+	tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+	tests/Polyhedron/ascii_dump_load2.cc,
+	tests/Polyhedron/ascii_dump_load3.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bgp99extrapolation2.cc,
+	tests/Polyhedron/bhrz03widening1.cc,
+	tests/Polyhedron/bhrz03widening2.cc,
+	tests/Polyhedron/bhrz03widening3.cc,
+	tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/boundedaffinepreimage1.cc,
+	tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	tests/Polyhedron/boundedh79extrapolation1.cc,
+	tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+	tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+	tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+	tests/Polyhedron/containsintegerpoint1.cc,
+	tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+	tests/Polyhedron/disjoint2.cc,
+	tests/Polyhedron/dropsomenonintegerpoints1.cc,
+	tests/Polyhedron/dropsomenonintegerpoints2.cc,
+	tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	tests/Polyhedron/expandspacedim1.cc,
+	tests/Polyhedron/expandspacedim2.cc,
+	tests/Polyhedron/foldspacedims1.cc,
+	tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+	tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	tests/Polyhedron/fromoctagonalshape1.cc,
+	tests/Polyhedron/generalizedaffineimage1.cc,
+	tests/Polyhedron/generalizedaffineimage2.cc,
+	tests/Polyhedron/generalizedaffinepreimage1.cc,
+	tests/Polyhedron/generalizedaffinepreimage2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+	tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	tests/Polyhedron/limitedh79extrapolation1.cc,
+	tests/Polyhedron/linearexpression1.cc,
+	tests/Polyhedron/linearpartition1.cc,
+	tests/Polyhedron/linearsystem1.cc,
+	tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+	tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+	tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	tests/Polyhedron/minconstraints2.cc,
+	tests/Polyhedron/mingenerators1.cc,
+	tests/Polyhedron/mingenerators2.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+	tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+	tests/Polyhedron/polyhull2.cc,
+	tests/Polyhedron/polyhullifexact1.cc,
+	tests/Polyhedron/polyhullifexact2.cc,
+	tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/refinewithcongruence1.cc,
+	tests/Polyhedron/refinewithcongruences1.cc,
+	tests/Polyhedron/refinewithconstraint1.cc,
+	tests/Polyhedron/refinewithconstraints1.cc,
+	tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	tests/Polyhedron/relations3.cc,
+	tests/Polyhedron/removespacedims1.cc,
+	tests/Polyhedron/removespacedims2.cc,
+	tests/Polyhedron/simplifyusingcontext1.cc,
+	tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+	tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+	tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+	tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+	tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+	tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+	tests/Polyhedron/writegensys1.cc,
+	tests/Polyhedron/writepolyhedron1.cc,
+	tests/Polyhedron/writepolyhedron2.cc,
+	tests/Polyhedron/writerelation1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+	tests/Powerset/addcongruences1.cc,
+	tests/Powerset/addconstraints1.cc,
+	tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+	tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+	tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+	tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+	tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+	tests/Powerset/containsintegerpoint1.cc,
+	tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+	tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+	tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+	tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+	tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+	tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+	tests/Powerset/fromoctagonalshape1.cc,
+	tests/Powerset/frompolyhedron1.cc,
+	tests/Powerset/fromspacedimension1.cc,
+	tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+	tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+	tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+	tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+	tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+	tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+	tests/Powerset/upperbound1.cc, tests/README,
+	tests/Random_Number_Generator.defs.hh,
+	tests/Random_Number_Generator.inlines.hh,
+	tests/Sparse_Matrix/Makefile.am,
+	tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+	tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+	utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: Web site
+	URI updated.
+
+2011-10-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/good_words: Temporary list of words allowed in comments
+	and to compose identifiers.
+
+2011-10-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/vocabulary: An initial vocabulary for the PPL.
+
+2011-10-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Checked_Number.inlines.hh, src/Temp.inlines.hh,
+	src/checked.defs.hh, src/checked.inlines.hh, src/compiler.hh,
+	src/globals.defs.hh, src/meta_programming.hh: Make sure all the uses
+	of macro arguments are surrounded by parentheses.
+
+2011-10-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh: Fixed a bug whereby a wrong computational
+	weight was computed due to missing parentheses around a macro
+	argument.  Detected by ECLAIR service macrbody.
+
+2011-10-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh: Very long line shortened.
+
+2011-10-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure: Updated to reflect the removal of
+	`--with-gmp-prefix' in favor of `--with-gmp'.
+
+2011-10-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc, src/checked_int.inlines.hh,
+	src/globals.inlines.hh: Avoid excessive and dangerous reliance on
+	the C++ operator precedence rules.  Detected by ECLAIR service
+	exprprns.
+
+2011-10-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Coefficient.types.hh,
+	src/Sparse_Row.defs.hh, src/globals.defs.hh: Avoid #include
+	directives after code (except for "*.idefs.hh", "*.inlines.hh" and
+	"*.templates.hh").  Detected by ECLAIR service inclmixd.
+
+2011-10-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh, src/Linear_Expression.cc: Avoid excessive and
+	dangerous reliance on the C++ operator precedence rules.  Detected
+	by ECLAIR service exprprns.
+
+2011-10-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.inlines.hh, src/BD_Shape.templates.hh,
+	src/BHRZ03_Certificate.cc, src/Bit_Row.cc, src/Bit_Row.inlines.hh,
+	src/Boundary.defs.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.inlines.hh, src/Checked_Number.inlines.hh,
+	src/Checked_Number.templates.hh, src/Congruence.cc,
+	src/Constraint.cc, src/Constraint.inlines.hh, src/Float.inlines.hh,
+	src/Generator.inlines.hh, src/Grid.inlines.hh,
+	src/Grid_Certificate.cc, src/Grid_Generator.cc, src/Grid_chdims.cc,
+	src/Grid_public.cc, src/H79_Certificate.cc,
+	src/Interval.inlines.hh, src/Linear_Expression.cc,
+	src/Linear_Row.inlines.hh, src/Linear_System.inlines.hh,
+	src/MIP_Problem.cc, src/NNC_Polyhedron.cc,
+	src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh,
+	src/Pointset_Powerset.templates.hh, src/Polyhedron_chdims.cc,
+	src/Polyhedron_public.cc, src/Variable.inlines.hh,
+	src/Variables_Set.inlines.hh, src/checked.cc,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/globals.inlines.hh, src/intervals.defs.hh,
+	src/math_utilities.inlines.hh, src/minimize.cc, src/wrap_string.cc: 
+	Avoid excessive and dangerous reliance on the C++ operator
+	precedence rules.  Detected by ECLAIR service exprprns.  Other
+	readability improvements.
+
+2011-10-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Fixed MIP_Problem bug shown by
+	tests/MIP_Problem/mipproblem4.cc.
+
+2011-10-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am, tests/MIP_Problem/mipproblem4.cc: 
+	Added test showing a bug when solving again a 0-dimensional
+	MIP_Problem.  The bug only manifests when a previously solved
+	0-dimensional MIP_Problem is solved again after having modified it
+	(that is, after changing optimization mode or optimization
+	function).
+
+2011-10-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc, src/Bit_Row.cc: Minor readability
+	improvements.
+
+2011-10-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/CO_Tree.inlines.hh: Moved misplaced parentheses.
+
+2011-10-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc: Moved namespace alias declaration.
+
+2011-10-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am, interfaces/Prolog/.gitignore,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/Prolog_configured_interface.dox,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/Prolog_interface_compilation.dox,
+	interfaces/Prolog/{ppl_prolog_sysdep_dox =>
+	Prolog_interface_sysdep.dox},
+	interfaces/Prolog/{ppl_prolog_sysindep_dox =>
+	Prolog_interface_sysindep.dox},
+	interfaces/Prolog/Prolog_interface_sysindep_domains.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4: Reorganized
+	the generation of Prolog interface manuals to avoid duplication.
+
+2011-10-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Make sure we find <gmpxx.hh> when compiling
+	instchk.hh to check for valid instantiations.
+
+2011-10-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.cc, Watchdog/src/Time.defs.hh,
+	Watchdog/src/Time.inlines.hh, Watchdog/src/Watchdog.cc,
+	Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	Watchdog/tests/watchdog1.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/watchdog1.c,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_sysindep_dox,
+	interfaces/Prolog/tests/pl_check.pl, tests/Polyhedron/watchdog1.cc,
+	utils/timings.cc: Better terminology and identifiers concerning time
+	units.  (Thanks to Anthony Foiani.)
+
+2011-10-09  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh: Initialize all elements of Dimension_Kind.
+
+2011-10-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.cc, src/Init.defs.hh, src/OR_Matrix.inlines.hh: Magic
+	constants avoided.  Detected by ECLAIR service nomagicc.
+
+2011-10-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_pips/ppl_pips.cc: Magic
+	constants avoided.  Detected by ECLAIR service nomagicc.
+
+2011-10-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.cc, Watchdog/src/Time.defs.hh,
+	Watchdog/src/Time.inlines.hh: Magic constants avoided.  Detected by
+	ECLAIR service nomagicc.
+
+2011-09-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence.cc, src/Congruence.inlines.hh,
+	src/Grid_Generator.cc, src/Grid_Generator.inlines.hh,
+	src/Grid_Generator_System.cc: For readability, prefer infix notation
+	for operator[].
+
+2011-09-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.cc: For readability, prefer infix notation
+	for operator[].
+
+2011-09-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.inlines.hh: Removed a redundant explicit
+	cast.  Detected by ECLAIR service castexpr.
+
+2011-09-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.inlines.hh, src/intervals.defs.hh: Removed several
+	redundant explicit casts.  Detected by ECLAIR service castexpr.
+
+2011-09-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Declare functions at file scope.
+
+2011-09-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/Constraint_System.cc, src/Octagonal_Shape.templates.hh: Fixed
+	several indentation mistakes.
+
+2011-08-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	tests/Box/refinewithconstraints1.cc: Improved portability to
+	Solaris.  (Thanks to Dagobert Michelsen and Maciej Blizinski.)
+
+2011-08-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Item revised.
+
+2011-08-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* m4/ac_check_gmp.m4: Prepend to old content of shared library path
+	var, instead of overwriting.
+
+2011-08-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Quoted more double quotes.
+
+2011-08-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Quoted double quotes.
+
+2011-08-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: More missing quotes added.
+
+2011-08-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Missing quotes added.
+
+2011-08-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc: Use all the available tests.
+
+2011-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh, src/Interval_Info.inlines.hh,
+	src/Interval_Restriction.defs.hh: Silenced a few warnings.
+
+2011-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh: RAII_Temporary_Real_Relaxation is a
+	struct.
+
+2011-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Form.inlines.hh: Do not mix `int' and `dimension_type'.
+
+2011-07-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, demos/ppl_lcdd/ppl_lcdd.cc,
+	demos/ppl_lpsol/ppl_lpsol.c, demos/ppl_pips/ppl_pips.cc,
+	m4/ac_cxx_limit_memory.m4: Make sure we have a declaration of
+	setrlimit() before trying to use it.  We still assume that a system
+	that provides setrlimit() also provides getrlimit(), the converse
+	being false for, e.g., Minix.  (Thanks to Thomas Cort.)
+
+2011-07-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Added environment variable export.
+
+2011-07-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, m4/ac_check_gmp.m4: Make sure the run-time tests for
+	GMP can find GMP's shared libraries.
+
+2011-07-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc: Fixed uses of PPL_HAVE_DECL_GETRUSAGE.  (Thanks
+	to Thomas Cort.)
+
+2011-07-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, configure.ac, m4/Makefile.am, m4/ac_check_gmp.m4,
+	m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: New configure
+	options `--with-gmp=DIR', `--with-gmp-include=DIR' and
+	`--with-gmp-lib=DIR'.  These supersede the (now removed) option
+	`--with-gmp-prefix'.  (The old option never really worked; hopefully
+	this is the last change in this area.)
+
+2011-07-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: Updated.
+
+2011-07-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am: 
+	Avoid annoying warnings caused by internal OCaml C code.
+
+2011-07-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Prolog/SWI/swi_efli.cc, src/BD_Shape.templates.hh,
+	src/Bit_Row.inlines.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/Generator.inlines.hh, src/Interval_Restriction.defs.hh,
+	src/MIP_Problem.cc, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Temp.defs.hh, src/Temp.inlines.hh, src/checked.inlines.hh,
+	src/checked_int.inlines.hh, src/checked_mpz.inlines.hh,
+	src/conversion.cc, src/fpu-ia32.cc, src/globals.defs.hh,
+	src/math_utilities.inlines.hh: Simplified PPL_DIRTY_TEMP.
+
+2011-07-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/Sparse_Row.cc: Silenced a couple of gcc
+	warnings.
+
+2011-06-12  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Prolog/SWI/Makefile.am: Added missing quotes.
+
+2011-06-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+	configure.ac, doc/Makefile.am: New configuration option
+	`--disable-documentation'.
+
+2011-06-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am, doc/Makefile.am: Make sure the PDF
+	documentation is fully built before extracting the PostScript
+	documentation.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/relations3.cc: Silenced gcc warnings.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/relations3.cc, tests/Box/relations4.cc,
+	tests/Octagonal_Shape/relatwithcons2.cc,
+	tests/Octagonal_Shape/relatwithgen1.cc: Silenced gcc warnings.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/tests/pwl_test.hh, tests/ppl_test.hh: Silenced gcc
+	warning.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/PIP_Tree.cc: Removed another unused variable.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/PIP_Tree.cc: Avoid another warning.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.inlines.hh: Avoid another warning.
+
+2011-06-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Grid_public.cc, src/Interval.inlines.hh,
+	src/Interval.templates.hh, src/wrap_assign.hh: Fixed some warnings.
+
+2011-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am: Moved misplaced conditional.
+
+2011-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/tests/Makefile.am, interfaces/Prolog/Makefile.am: 
+	Do use $(interface_generator_files) when defined.
+
+2011-05-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Interval.defs.hh, src/Interval.inlines.hh,
+	src/Linear_Form.defs.hh, src/Linear_Form.templates.hh,
+	tests/Concrete_Expression/linearform1.cc: Improved the documentation
+	and removed an useless function.
+
+2011-05-06  Fabio Bossi <bossi at cs.unipr.it>
+
+	* : commit 9374a9a1b64cc335b23b59a67271a2c93d865245 Author: Fabio
+	Bossi <bossi at cs.unipr.it> Date:   Fri May 6 11:53:53 2011 +0200
+
+2011-05-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/globals.types.hh: Fixed an invalid Doxygen reference.
+
+2011-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit e1cf43ab6cd604855a4b94256a20979e28192980 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Wed May 4 14:37:21 2011 +0200
+
+2011-05-04  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox: Fixed some bugs in the
+	documentation for the MIP and PIP problems.
+
+2011-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 5a5759bafd7558a88a8cd8613940fcff247ea407 Author: Patricia
+	Hill <p.m.hill at leeds.ac.uk> Date:   Tue May 3 13:36:52 2011 +0100
+
+2011-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 12f97bbef1ad3223c630d10474851eb5d67611db Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Mar 15 12:06:59 2011 +0100
+
+2011-02-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Two items added.
+
+2011-02-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: When cross-compiling, assume that GMP has been
+	compiled with support for propagating exceptions.
+
+2011-02-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc: Work around a bug showing up under mingw-w64.
+
+2011-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh: Avoid
+	(again) using the same macro name for different purposes.  Doing it
+	confuses both the reader and Doxygen.
+
+2011-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-language-interface.tex, doc/devref.tex,
+	doc/user-language-interface.tex, doc/user.tex: Get rid of LaTeX
+	warnings related to package fancyhdr.
+
+2011-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am, doc/devref-language-interface.doxyconf.in,
+	doc/user-language-interface.doxyconf.in,
+	interfaces/C/C_interface.dox: Avoid duplicate PDF labels in the
+	configured C interface manuals.
+
+2011-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-language-interface.tex, doc/devref.tex,
+	doc/user-language-interface.tex, doc/user.tex: Fixed a duplicate
+	hypertarget error in the generated PDF documentation.
+
+2011-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh: Avoid
+	using the same macro name for different purposes.  Doing it confuses
+	both the reader and Doxygen.
+
+2011-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-latex.in,
+	doc/devref-language-interface.doxyconf.in,
+	doc/devref.doxyconf-latex.in: Set INLINE_SOURCES = NO when producing
+	LaTeX documentation.  This change is a workaround to a pdftex + hyperref issue that may
+	result in the following error    \pdfendlink ended up in different nesting level than
+	   \pdfstartlink when using some versions of Doxygen (e.g., 1.7.3).  According to http://tug.org/errors.html the error is triggered when
+	a hyperlink is split across page boundaries and it can be generated
+	even by valid LaTeX code. Disabling source inlining is a way to
+	greatly decrease its likelihood.
+
+2011-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/meta_programming.hh: Fixed a couple of Doxygen related
+	problems.
+
+2011-02-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Updated.
+
+2011-02-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc: No longer overwrite the SIGILL handler.
+
+2011-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a: Never use `\c';  use <CODE></CODE> instead (yes, uppercase).
+
+2011-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README.configure, configure.ac, m4/ac_check_fpu_control.m4: 
+	The `--disable-fpmath' configure option now disables all floating
+	point computations.
+
+2011-02-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 086927949fd92366d26e8b3fc8c93b63cc661b11 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sun Feb 20 08:57:04 2011 +0100
+
+2011-02-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README, Watchdog/config.guess, Watchdog/config.sub,
+	Watchdog/src/Makefile.am, config.guess, config.sub, doc/libppl.3,
+	doc/libppl_c.3, doc/ppl-config_extra_man_text, src/Makefile.am: 
+	Updated to minimize risks when the time of releasing PPL 0.12 will
+	come.
+
+2011-02-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Updated the entry for Marco Poletti.
+
+2011-02-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: avoid repeated lookup of
+	Sparse_Row's coefficients, in solve().
+
+2011-02-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: improve the performance of
+	solve().
+
+2011-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am: Disabled the `memory1' test (at
+	least for the time being).
+
+2011-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: test06 no longer overflows when
+	using 8-bit coefficients.
+
+2011-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 73cfc6e2390366f132e6967d225c4d5ec317bb46 Author: Marco
+	Poletti <poletti.marco at gmail.com> Date:   Mon Feb 14 21:23:11 2011
+	+0100
+
+2011-02-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .gitignore: Ignore *.lzma.
+
+2011-02-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: avoid repeated calls to
+	Sparse_Row::get(), in solve().
+
+2011-02-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+	src/PIP_Tree.cc: Corrected a (checked-integer related) problem in
+	PIP_Solution_Tree::solve().  Updated expected results for 32-bits
+	checked integers: ppl_pips test lineri.dat no longer overflows.
+
+2011-02-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/.gitignore, interfaces/C/tests/.gitignore,
+	interfaces/Java/parma_polyhedra_library/.gitignore,
+	interfaces/Prolog/GNU/.gitignore, tests/Grid/.gitignore,
+	tests/PIP_Problem/.gitignore,
+	tests/Partially_Reduced_Product/.gitignore,
+	tests/Polyhedron/.gitignore, tests/Sparse_Matrix/.gitignore: 
+	Updated.
+
+2011-02-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Fixed a number of wrong
+	conditionals.
+
+2011-02-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.defs.hh: Minor improvements to
+	documentation.
+
+2011-02-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl: 
+	Copyright notices updated.
+
+2011-02-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh: Document parameter indent_level in
+	PIP_Tree_Node::solve().
+
+2011-02-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.inlines.hh: Added other plain char specializations.
+
+2011-02-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Interval.inlines.hh, src/checked_float.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/meta_programming.hh: Added
+	missing specializations for plain char.
+
+2011-02-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Integer.hh: Specialize C_Integer<T> for plain char.
+
+2011-01-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh: Added specializations for plain char.
+
+2011-01-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_plain_char_is_signed.m4: Copy-and-paste mistake fixed.
+
+2011-01-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, m4/Makefile.am, m4/ac_cxx_plain_char_is_signed.m4: 
+	Detect whether the plain char type is signed.
+
+2011-02-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am, demos/ppl_pips/Makefile.am,
+	interfaces/C/tests/Makefile.am, interfaces/OCaml/tests/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am, tests/Ask_Tell/Makefile.am,
+	tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/CO_Tree/Makefile.am, tests/Grid/Makefile.am,
+	tests/MIP_Problem/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+	tests/PIP_Problem/Makefile.am,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Polyhedron/Makefile.am, tests/Powerset/Makefile.am,
+	tests/Sparse_Matrix/Makefile.am: Reduce the argument of valgrind's
+	--num-callers below the allowed maximum.
+
+2011-02-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mentioned a correction affecting PIP_Problem solution trees.
+	Mentioned an improvement in the generation of PIP_Tree_Node
+	tautological cnstraints, node splitting constraints and artificial
+	parameters.
+
+2011-02-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_mpz,
+	interfaces/Prolog/tests/expected_clpq_mpz: Copyright notices
+	updated.
+
+2011-02-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 32c3efb0d9a72bf3b3c9a6f3efaa89dff1b204ac Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Fri Feb 11 15:01:08 2011
+	+0100
+
+2011-02-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* : commit 22b1565be0efe35f86e6323180ff6de113b19b18 Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Fri Feb 11 09:53:50 2011
+	+0100
+
+2011-02-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Minor readability improvements to
+	PIP_Decision_Node::solve().
+
+2011-02-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* : commit 29201d2a5893bbe17744777de36e9a106ed8ea95 Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Thu Feb 10 18:48:11 2011
+	+0100
+
+2011-02-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/expected_int16, demos/ppl_pips/expected_int16_a,
+	demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+	demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+	demos/ppl_pips/expected_int8, demos/ppl_pips/expected_int8_a,
+	demos/ppl_pips/expected_mpz, demos/ppl_pips/expected_mpz_a: 
+	Corrected expected results.
+
+2011-02-10  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.cc: Fixed stream state on checked input.
+
+2011-02-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* : commit 3c8f16e240439811d501629660cedb8f99f0009a Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Thu Feb 10 10:47:59 2011
+	+0100
+
+2011-02-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Exploit variable integrality when creating
+	tautology constraints.  Factored out helper function   void integral_simplification(Row&); used when generating tautology
+	and sign splitting constraints.
+
+2011-02-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4: Fixed
+	function ppl_Pointset_Powerset_*_get_disjunct in OCaml interface.
+
+2011-02-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Polyhedron_public.cc: Polyhedron: fix an invalid reference bug
+	in generalized_affine_image().
+
+2011-02-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Grid.templates.hh: Grid: avoid using an invalid reference in
+	the constructor from a Box.
+
+2011-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Fixed a bug in the simplification of the solution
+	tree.  We were too eager in merging a single true child with its
+	parent: if the true child happened to be a decision node with both
+	childs, the merging was causing the violation of a PIP_Decision_Node
+	invariant.
+
+2011-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Further improvement to debug output.
+	Preprocessor flag NOISY_PIP_TREE_STRUCTURE only activate those debug
+	print taht is useful to hightlight the solution tree construction
+	process.
+
+2011-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: A minor
+	improvement to the debug printing mechanism.  Methods solve() and
+	generate_cut() are now provided with additional argument
+	indent_level, telling the amount of indentation for debug prints.
+	Added several messages to debug prints so as to clarify the solution
+	tree construction process.
+
+2011-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Exploit integrality when adding constraints for
+	mixed parameter sign rows.  Try to distinguish between NOISY and
+	VERY_NOISY debugging output.
+
+2011-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.inlines.hh: Fully normalize
+	artificial parameters on construction.  When in noisy mode, print
+	normalized parameters.
+
+2011-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Minor changes related to coding standards.
+	Prefer initial capitalization for (user-defined) type names.  Prefer
+	function objects to function pointers.  Avoid nesting an anonymous
+	namespace into another anonymous namespace.
+
+2011-02-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Corrected a bug in cut generation.  We were using
+	%= instead of the helper function mod_assign(), which is meant to
+	compute the *positive* modulus.  For clarity, the helper function
+	has been renamed as pos_mod_assign().
+
+2011-02-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Do not use the deprecated function
+	mpz_div_2exp.  Use mpz_tdiv_q_2exp instead.
+
+2011-01-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: AC_PROG_OCAML only sets OCAMLOPT if OCAMLC is
+	different from "no".
+
+2011-01-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_mpz,
+	interfaces/Prolog/tests/expected_clpq_mpz: Copyright notices updated
+	in expexted result files.
+
+2011-01-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.inlines.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Cast_Floating_Point_Expression.types.hh,
+	src/Concrete_Expression.cc, src/Concrete_Expression.defs.hh,
+	src/Concrete_Expression.inlines.hh,
+	src/Concrete_Expression.types.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Constant_Floating_Point_Expression.types.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Difference_Floating_Point_Expression.types.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.types.hh,
+	src/Float.templates.hh, src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.types.hh, src/Integer_Interval.hh,
+	src/Linear_Form.cc, src/Linear_Form.defs.hh,
+	src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+	src/Linear_Form.types.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.types.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.types.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.types.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.types.hh, src/linearize.hh,
+	tests/Concrete_Expression/C_Expr.cc,
+	tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/C_Expr.types.hh,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/bdshape1.cc,
+	tests/Concrete_Expression/bdshape2.cc,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearform1.cc,
+	tests/Concrete_Expression/linearize.cc,
+	tests/Concrete_Expression/octagonalshape1.cc,
+	tests/Concrete_Expression/octagonalshape2.cc,
+	tests/Concrete_Expression/polyhedron1.cc,
+	tests/Concrete_Expression/polyhedron2.cc,
+	tests/Concrete_Expression/run_tests: Copyright notices updated.
+
+2011-01-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README, README.configure, STANDARDS,
+	Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+	Watchdog/doc/README.doc, Watchdog/doc/devref.tex,
+	Watchdog/doc/pwl.sty, Watchdog/doc/user.tex,
+	Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+	Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	Watchdog/src/Doubly_Linked_Object.types.hh,
+	Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	Watchdog/src/EList_Iterator.inlines.hh,
+	Watchdog/src/EList_Iterator.types.hh, Watchdog/src/Handler.defs.hh,
+	Watchdog/src/Handler.inlines.hh, Watchdog/src/Handler.types.hh,
+	Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	Watchdog/src/Pending_Element.inlines.hh,
+	Watchdog/src/Pending_Element.types.hh,
+	Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh,
+	Watchdog/src/Pending_List.templates.hh,
+	Watchdog/src/Pending_List.types.hh,
+	Watchdog/src/Threshold_Watcher.cc,
+	Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.inlines.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh,
+	Watchdog/src/Threshold_Watcher.types.hh, Watchdog/src/Time.cc,
+	Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+	Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+	Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	configure.ac, debian/libppl-pwl.copyright.in,
+	debian/libppl.copyright.in, demos/Makefile.am,
+	demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+	demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+	demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+	demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+	demos/ppl_lpsol/examples/Makefile.am,
+	demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+	demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+	demos/ppl_pips/ppl_pips_extra_man_text,
+	devtools/bump_copyright_years, devtools/generate_dox_biblio,
+	devtools/generate_dox_ci_prolog_manual,
+	devtools/generate_man_pages, devtools/print_nonascii_lines,
+	doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+	doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+	doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+	fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh, instchk.hh,
+	interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/ppl_c_implementation_common.inlines.hh,
+	interfaces/C/ppl_c_version.h.in,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/C/ppl_interface_generator_c_h.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+	interfaces/C/tests/ppl_c_test.h,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h,
+	interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+	ow.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+	entation.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+	a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+	interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+	java,
+	interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	, interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java,
+	interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+	va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Name.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Value.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Pair.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/PPL_Test.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Java/tests/ppl_java_tests_common,
+	interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4, interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/Ciao/ciao_cfli.hh,
+	interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/Ciao/ciao_efli.hh,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+	d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/GNU/gnu_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	interfaces/Prolog/GNU/gp_clpq.pl,
+	interfaces/Prolog/GNU/gprolog_cfli.hh,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.hh,
+	interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	interfaces/Prolog/SICStus/sicstus_cfli.h,
+	interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	interfaces/Prolog/SICStus/sicstus_efli.cc,
+	interfaces/Prolog/SICStus/sicstus_efli.hh,
+	interfaces/Prolog/SICStus/sp_clpq.pl,
+	interfaces/Prolog/SICStus/sp_pl_check.pl,
+	interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+	interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	interfaces/Prolog/SWI/ppl_pl.cc,
+	interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	interfaces/Prolog/SWI/swi_cfli.hh,
+	interfaces/Prolog/SWI/swi_efli.cc,
+	interfaces/Prolog/SWI/swi_efli.hh,
+	interfaces/Prolog/SWI/swi_pl_check.pl,
+	interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+	test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/XSB/xsb_cfli.hh,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/XSB/xsb_efli.hh,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/YAP/ppl_yap.pl,
+	interfaces/Prolog/YAP/yap_cfli.hh,
+	interfaces/Prolog/YAP/yap_clpq.pl,
+	interfaces/Prolog/YAP/yap_clpq2.pl,
+	interfaces/Prolog/YAP/yap_efli.cc,
+	interfaces/Prolog/YAP/yap_efli.hh,
+	interfaces/Prolog/YAP/yap_pl_check.pl,
+	interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.inlines.hh,
+	interfaces/Prolog/ppl_prolog_sysdep_dox,
+	interfaces/Prolog/ppl_prolog_sysindep_dox,
+	interfaces/Prolog/tests/Makefile.am,
+	interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+	interfaces/Prolog/tests/expected_clpq2_int16,
+	interfaces/Prolog/tests/expected_clpq2_int16_a,
+	interfaces/Prolog/tests/expected_clpq2_int32,
+	interfaces/Prolog/tests/expected_clpq2_int32_a,
+	interfaces/Prolog/tests/expected_clpq2_int64,
+	interfaces/Prolog/tests/expected_clpq2_int64_a,
+	interfaces/Prolog/tests/expected_clpq2_int8,
+	interfaces/Prolog/tests/expected_clpq2_int8_a,
+	interfaces/Prolog/tests/expected_clpq2_mpz,
+	interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	interfaces/Prolog/tests/expected_clpq_int16,
+	interfaces/Prolog/tests/expected_clpq_int16_a,
+	interfaces/Prolog/tests/expected_clpq_int32,
+	interfaces/Prolog/tests/expected_clpq_int32_a,
+	interfaces/Prolog/tests/expected_clpq_int64,
+	interfaces/Prolog/tests/expected_clpq_int64_a,
+	interfaces/Prolog/tests/expected_clpq_int8,
+	interfaces/Prolog/tests/expected_clpq_int8_a,
+	interfaces/Prolog/tests/expected_clpq_mpz,
+	interfaces/Prolog/tests/expected_clpq_mpz_a,
+	interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4,
+	interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+	interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+	interfaces/ppl_interface_generator_common.m4,
+	interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+	m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+	m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+	m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+	m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_exact_output.m4,
+	m4/ac_cxx_ieee_inexact_flag.m4, m4/ac_cxx_limit_memory.m4,
+	m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4,
+	m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+	m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+	m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+	src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+	src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	src/Bit_Row.inlines.hh, src/Bit_Row.types.hh, src/Boundary.defs.hh,
+	src/Box.cc, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/Box.types.hh, src/Box_Status.idefs.hh,
+	src/Box_Status.inlines.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+	src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+	src/CO_Tree.types.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Checked_Number.templates.hh, src/Checked_Number.types.hh,
+	src/Coefficient.cc, src/Coefficient.defs.hh,
+	src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	src/Coefficient_traits_template.hh, src/Congruence.cc,
+	src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	src/Congruence.types.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Congruence_System.types.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	src/Constraint.types.hh, src/Constraint_System.cc,
+	src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	src/DB_Matrix.types.hh, src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	src/DB_Row.templates.hh, src/DB_Row.types.hh, src/Dense_Matrix.cc,
+	src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+	src/Dense_Matrix.types.hh, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh, src/Dense_Row.templates.hh,
+	src/Dense_Row.types.hh, src/Determinate.defs.hh,
+	src/Determinate.inlines.hh, src/Determinate.types.hh, src/Float.cc,
+	src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator.types.hh, src/Generator_System.cc,
+	src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	src/Generator_System.types.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh,
+	src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+	src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init.defs.hh,
+	src/Init.inlines.hh, src/Init.types.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval.templates.hh,
+	src/Interval.types.hh, src/Interval_Info.defs.hh,
+	src/Interval_Info.inlines.hh, src/Interval_Info.types.hh,
+	src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	src/Linear_Row.types.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/Linear_System.types.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	src/Makefile.am, src/Matrix.defs.hh, src/Matrix.types.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/PIP_Tree.inlines.hh, src/PIP_Tree.types.hh,
+	src/Partial_Function.cc, src/Partial_Function.defs.hh,
+	src/Partial_Function.inlines.hh, src/Partial_Function.types.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+	src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+	src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+	src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+	src/Poly_Gen_Relation.inlines.hh, src/Poly_Gen_Relation.types.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron.types.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	src/Powerset.templates.hh, src/Powerset.types.hh,
+	src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	src/Ptr_Iterator.types.hh, src/Rational_Box.hh,
+	src/Rational_Interval.hh, src/Result.defs.hh,
+	src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+	src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row.types.hh,
+	src/Row_Flags.cc, src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+	src/Row_Flags.types.hh, src/Scalar_Products.cc,
+	src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	src/Scalar_Products.types.hh, src/Slow_Copy.hh,
+	src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh, src/Sparse_Matrix.types.hh,
+	src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+	src/Sparse_Row.types.hh, src/Temp.defs.hh, src/Temp.inlines.hh,
+	src/Temp.templates.hh, src/Topology.hh, src/Variable.cc,
+	src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable.types.hh, src/Variables_Set.cc,
+	src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	src/Variables_Set.types.hh, src/WRD_coefficient_types.defs.hh,
+	src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+	src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	src/algorithms.hh, src/assert.hh, src/assign_or_swap.hh,
+	src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/c_streambuf.types.hh,
+	src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/compiler.hh, src/conversion.cc,
+	src/distances.defs.hh, src/distances.inlines.hh,
+	src/distances.types.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+	src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	src/globals.types.hh, src/initializer.hh, src/intervals.defs.hh,
+	src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	src/iterator_to_const.types.hh, src/math_utilities.defs.hh,
+	src/math_utilities.inlines.hh, src/max_space_dimension.hh,
+	src/meta_programming.hh, src/minimize.cc, src/mp_std_bits.cc,
+	src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+	src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+	src/simplify.cc, src/stdiobuf.cc, src/stdiobuf.defs.hh,
+	src/stdiobuf.inlines.hh, src/stdiobuf.types.hh,
+	src/swapping_sort.icc, src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, src/version.cc, src/version.hh.in,
+	src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+	tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	tests/BD_Shape/addspacedims1.cc,
+	tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+	tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+	tests/BD_Shape/ascii_dump_load1.cc,
+	tests/BD_Shape/bgp99extrapolation1.cc,
+	tests/BD_Shape/bhmz05widening1.cc,
+	tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	tests/BD_Shape/boundedaffineimage1.cc,
+	tests/BD_Shape/boundedaffinepreimage1.cc,
+	tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+	tests/BD_Shape/contains1.cc,
+	tests/BD_Shape/containsintegerpoint1.cc,
+	tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+	tests/BD_Shape/disjoint1.cc,
+	tests/BD_Shape/dropsomenonintegerpoints1.cc,
+	tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	tests/BD_Shape/expandspacedim1.cc,
+	tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+	tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+	tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+	tests/BD_Shape/fromoctagonalshape1.cc,
+	tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+	tests/BD_Shape/generalizedaffineimage1.cc,
+	tests/BD_Shape/generalizedaffineimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage1.cc,
+	tests/BD_Shape/generalizedaffinepreimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage3.cc,
+	tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	tests/BD_Shape/integerupperboundifexact1.cc,
+	tests/BD_Shape/intersection1.cc,
+	tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	tests/BD_Shape/limitedcc76extrapolation1.cc,
+	tests/BD_Shape/limitedh79extrapolation1.cc,
+	tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	tests/BD_Shape/simplifyusingcontext1.cc,
+	tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+	tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+	tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+	tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+	tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+	tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+	tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+	tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+	tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+	tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+	tests/Box/empty1.cc, tests/Box/equality1.cc,
+	tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+	tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+	tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	tests/Box/generalizedaffineimage2.cc,
+	tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+	tests/Box/intersection1.cc, tests/Box/interval1.cc,
+	tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+	tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+	tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	tests/Box/propagateconstraints1.cc,
+	tests/Box/propagateconstraints2.cc,
+	tests/Box/refinewithcongruence1.cc,
+	tests/Box/refinewithcongruences1.cc,
+	tests/Box/refinewithconstraint1.cc,
+	tests/Box/refinewithconstraint2.cc,
+	tests/Box/refinewithconstraints1.cc,
+	tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+	tests/Box/relations2.cc, tests/Box/relations3.cc,
+	tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+	tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+	tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+	tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+	tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+	tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+	tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+	tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	tests/Grid/affinepreimage2.cc, tests/Grid/approximatepartition1.cc,
+	tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	tests/Grid/boundedaffineimage1.cc,
+	tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+	tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+	tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+	tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+	tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+	tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+	tests/Grid/frompolyhedron1.cc,
+	tests/Grid/generalizedaffineimage1.cc,
+	tests/Grid/generalizedaffineimage2.cc,
+	tests/Grid/generalizedaffineimage3.cc,
+	tests/Grid/generalizedaffinepreimage1.cc,
+	tests/Grid/generalizedaffinepreimage2.cc,
+	tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+	tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+	tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	tests/Grid/limitedextrapolation1.cc,
+	tests/Grid/limitedextrapolation2.cc,
+	tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	tests/Grid/powersetdifference1.cc,
+	tests/Grid/powersetgeometricallycovers1.cc,
+	tests/Grid/powersetgeometricallyequals1.cc,
+	tests/Grid/refinewithcongruences1.cc,
+	tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+	tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+	tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+	tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+	tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+	tests/MIP_Problem/Makefile.am,
+	tests/MIP_Problem/ascii_dump_load1.cc,
+	tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+	tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+	tests/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/addspacedims1.cc,
+	tests/Octagonal_Shape/affinedimension1.cc,
+	tests/Octagonal_Shape/affineimage1.cc,
+	tests/Octagonal_Shape/affineimage2.cc,
+	tests/Octagonal_Shape/affinepreimage1.cc,
+	tests/Octagonal_Shape/affinepreimage2.cc,
+	tests/Octagonal_Shape/ascii_dump_load1.cc,
+	tests/Octagonal_Shape/bhmz05widening1.cc,
+	tests/Octagonal_Shape/bhz03widening1.cc,
+	tests/Octagonal_Shape/bounded1.cc,
+	tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	tests/Octagonal_Shape/bounds1.cc,
+	tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/cc76narrowing1.cc,
+	tests/Octagonal_Shape/chinainit.cc,
+	tests/Octagonal_Shape/concatenate1.cc,
+	tests/Octagonal_Shape/congruences1.cc,
+	tests/Octagonal_Shape/constrains1.cc,
+	tests/Octagonal_Shape/constraints1.cc,
+	tests/Octagonal_Shape/contains1.cc,
+	tests/Octagonal_Shape/containsintegerpoint1.cc,
+	tests/Octagonal_Shape/difference1.cc,
+	tests/Octagonal_Shape/discrete1.cc,
+	tests/Octagonal_Shape/disjoint1.cc,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+	tests/Octagonal_Shape/empty1.cc,
+	tests/Octagonal_Shape/expandspacedim1.cc,
+	tests/Octagonal_Shape/foldspacedims1.cc,
+	tests/Octagonal_Shape/frequency1.cc,
+	tests/Octagonal_Shape/frombdshape1.cc,
+	tests/Octagonal_Shape/frombox1.cc,
+	tests/Octagonal_Shape/fromgensys1.cc,
+	tests/Octagonal_Shape/fromgrid1.cc,
+	tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	tests/Octagonal_Shape/frompolyhedron1.cc,
+	tests/Octagonal_Shape/fromspacedim1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	tests/Octagonal_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/intersection1.cc,
+	tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	tests/Octagonal_Shape/mapspacedims1.cc,
+	tests/Octagonal_Shape/max_min1.cc,
+	tests/Octagonal_Shape/max_min2.cc,
+	tests/Octagonal_Shape/maxspacedim1.cc,
+	tests/Octagonal_Shape/membytes1.cc,
+	tests/Octagonal_Shape/minconstraints1.cc,
+	tests/Octagonal_Shape/relatwithcons1.cc,
+	tests/Octagonal_Shape/relatwithcons2.cc,
+	tests/Octagonal_Shape/relatwithcons3.cc,
+	tests/Octagonal_Shape/relatwithgen1.cc,
+	tests/Octagonal_Shape/removespacedims1.cc,
+	tests/Octagonal_Shape/run_tests,
+	tests/Octagonal_Shape/simplifyusingcontext1.cc,
+	tests/Octagonal_Shape/timeelapse1.cc,
+	tests/Octagonal_Shape/unconstrain1.cc,
+	tests/Octagonal_Shape/universe1.cc,
+	tests/Octagonal_Shape/upperbound1.cc,
+	tests/Octagonal_Shape/upperboundifexact1.cc,
+	tests/Octagonal_Shape/wrap1.cc,
+	tests/Octagonal_Shape/writeoctagon1.cc,
+	tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+	tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/addcongruences1.cc,
+	tests/Partially_Reduced_Product/addconstraints1.cc,
+	tests/Partially_Reduced_Product/affineimage1.cc,
+	tests/Partially_Reduced_Product/asciidumpload1.cc,
+	tests/Partially_Reduced_Product/bounded1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/concatenate1.cc,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/congruencesproduct1.cc,
+	tests/Partially_Reduced_Product/constraints1.cc,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/contains1.cc,
+	tests/Partially_Reduced_Product/difference1.cc,
+	tests/Partially_Reduced_Product/dimension1.cc,
+	tests/Partially_Reduced_Product/directproduct1.cc,
+	tests/Partially_Reduced_Product/directproduct2.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/discrete1.cc,
+	tests/Partially_Reduced_Product/disjoint1.cc,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+	tests/Partially_Reduced_Product/equals1.cc,
+	tests/Partially_Reduced_Product/frombdshape1.cc,
+	tests/Partially_Reduced_Product/frombox1.cc,
+	tests/Partially_Reduced_Product/fromgrid1.cc,
+	tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+	tests/Partially_Reduced_Product/frompolyhedron1.cc,
+	tests/Partially_Reduced_Product/fromproduct1.cc,
+	tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+	tests/Partially_Reduced_Product/intersection1.cc,
+	tests/Partially_Reduced_Product/isempty1.cc,
+	tests/Partially_Reduced_Product/isuniverse1.cc,
+	tests/Partially_Reduced_Product/maxmin1.cc,
+	tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+	tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+	tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/spacedims1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc,
+	tests/Partially_Reduced_Product/topclosed1.cc,
+	tests/Partially_Reduced_Product/topclosure1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Partially_Reduced_Product/widening1.cc,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	tests/Polyhedron/addcongruences1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addconstraints2.cc,
+	tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerator2.cc,
+	tests/Polyhedron/addgenerators1.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/addspacedims1.cc,
+	tests/Polyhedron/addspacedims2.cc,
+	tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+	tests/Polyhedron/affinepreimage1.cc,
+	tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+	tests/Polyhedron/ascii_dump_load2.cc,
+	tests/Polyhedron/ascii_dump_load3.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bgp99extrapolation2.cc,
+	tests/Polyhedron/bhrz03widening1.cc,
+	tests/Polyhedron/bhrz03widening2.cc,
+	tests/Polyhedron/bhrz03widening3.cc,
+	tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/boundedaffinepreimage1.cc,
+	tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	tests/Polyhedron/boundedh79extrapolation1.cc,
+	tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+	tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+	tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+	tests/Polyhedron/containsintegerpoint1.cc,
+	tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+	tests/Polyhedron/disjoint2.cc,
+	tests/Polyhedron/dropsomenonintegerpoints1.cc,
+	tests/Polyhedron/dropsomenonintegerpoints2.cc,
+	tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	tests/Polyhedron/expandspacedim1.cc,
+	tests/Polyhedron/expandspacedim2.cc,
+	tests/Polyhedron/foldspacedims1.cc,
+	tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+	tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	tests/Polyhedron/fromoctagonalshape1.cc,
+	tests/Polyhedron/generalizedaffineimage1.cc,
+	tests/Polyhedron/generalizedaffineimage2.cc,
+	tests/Polyhedron/generalizedaffinepreimage1.cc,
+	tests/Polyhedron/generalizedaffinepreimage2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+	tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	tests/Polyhedron/limitedh79extrapolation1.cc,
+	tests/Polyhedron/linearexpression1.cc,
+	tests/Polyhedron/linearpartition1.cc,
+	tests/Polyhedron/linearsystem1.cc,
+	tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+	tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+	tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	tests/Polyhedron/minconstraints2.cc,
+	tests/Polyhedron/mingenerators1.cc,
+	tests/Polyhedron/mingenerators2.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+	tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+	tests/Polyhedron/polyhull2.cc,
+	tests/Polyhedron/polyhullifexact1.cc,
+	tests/Polyhedron/polyhullifexact2.cc,
+	tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/refinewithcongruence1.cc,
+	tests/Polyhedron/refinewithcongruences1.cc,
+	tests/Polyhedron/refinewithconstraint1.cc,
+	tests/Polyhedron/refinewithconstraints1.cc,
+	tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	tests/Polyhedron/relations3.cc,
+	tests/Polyhedron/removespacedims1.cc,
+	tests/Polyhedron/removespacedims2.cc,
+	tests/Polyhedron/simplifyusingcontext1.cc,
+	tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+	tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+	tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+	tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+	tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+	tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+	tests/Polyhedron/writegensys1.cc,
+	tests/Polyhedron/writepolyhedron1.cc,
+	tests/Polyhedron/writepolyhedron2.cc,
+	tests/Polyhedron/writerelation1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+	tests/Powerset/addcongruences1.cc,
+	tests/Powerset/addconstraints1.cc,
+	tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+	tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+	tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+	tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+	tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+	tests/Powerset/containsintegerpoint1.cc,
+	tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+	tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+	tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+	tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+	tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+	tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+	tests/Powerset/fromoctagonalshape1.cc,
+	tests/Powerset/frompolyhedron1.cc,
+	tests/Powerset/fromspacedimension1.cc,
+	tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+	tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+	tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+	tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+	tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+	tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+	tests/Powerset/upperbound1.cc, tests/README,
+	tests/Random_Number_Generator.defs.hh,
+	tests/Random_Number_Generator.inlines.hh,
+	tests/Random_Number_Generator.types.hh,
+	tests/Sparse_Matrix/Makefile.am,
+	tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+	tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+	utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: 
+	Copyright notices updated.
+
+2011-01-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README, README.configure, STANDARDS,
+	Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+	Watchdog/doc/README.doc, Watchdog/doc/devref.tex,
+	Watchdog/doc/pwl.sty, Watchdog/doc/user.tex,
+	Watchdog/m4/Makefile.am, Watchdog/src/Doubly_Linked_Object.defs.hh,
+	Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	Watchdog/src/Doubly_Linked_Object.types.hh,
+	Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	Watchdog/src/EList_Iterator.inlines.hh,
+	Watchdog/src/EList_Iterator.types.hh, Watchdog/src/Handler.defs.hh,
+	Watchdog/src/Handler.inlines.hh, Watchdog/src/Handler.types.hh,
+	Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	Watchdog/src/Pending_Element.inlines.hh,
+	Watchdog/src/Pending_Element.types.hh,
+	Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh,
+	Watchdog/src/Pending_List.templates.hh,
+	Watchdog/src/Pending_List.types.hh,
+	Watchdog/src/Threshold_Watcher.cc,
+	Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.inlines.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh,
+	Watchdog/src/Threshold_Watcher.types.hh, Watchdog/src/Time.cc,
+	Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	Watchdog/tests/Makefile.am, Watchdog/tests/pwl_test.cc,
+	Watchdog/tests/pwl_test.hh, Watchdog/tests/watchdog1.cc,
+	Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	configure.ac, debian/libppl-pwl.copyright.in,
+	debian/libppl.copyright.in, demos/Makefile.am,
+	demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/examples/Makefile.am,
+	demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+	demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+	demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/dummy.cc,
+	demos/ppl_lpsol/examples/Makefile.am,
+	demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_lpsol/ppl_lpsol_extra_man_text,
+	demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips.cc,
+	demos/ppl_pips/ppl_pips_extra_man_text,
+	devtools/bump_copyright_years, devtools/generate_dox_biblio,
+	devtools/generate_dox_ci_prolog_manual,
+	devtools/generate_man_pages, devtools/print_nonascii_lines,
+	doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	doc/devref-language-interface.tex, doc/devref.tex, doc/libppl.3,
+	doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+	doc/ppl.sty, doc/user-language-interface.tex, doc/user.tex,
+	fedora/ppl.hh, fedora/ppl_c.h, fedora/pwl.hh, instchk.hh,
+	interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/ppl_c_implementation_common.inlines.hh,
+	interfaces/C/ppl_c_version.h.in,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/C/ppl_interface_generator_c_h.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/pip_test.c, interfaces/C/tests/ppl_c_test.cc,
+	interfaces/C/tests/ppl_c_test.h,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h,
+	interfaces/C/tests/watchdog1.c, interfaces/C/tests/weightwatch1.c,
+	interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+	ow.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+	entation.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java, interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	,
+	interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.jav
+	a, interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+	interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.
+	java,
+	interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	, interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java,
+	interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.ja
+	va, interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Name.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Value.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Pair.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java,
+	interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/Java/tests/PPL_Test.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Java/tests/ppl_java_tests_common,
+	interfaces/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4, interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/Ciao/ciao_cfli.hh,
+	interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/Ciao/ciao_efli.hh,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generate
+	d_test_pl.m4, interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/GNU/gnu_pl_check.pl,
+	interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	interfaces/Prolog/GNU/gp_clpq.pl,
+	interfaces/Prolog/GNU/gprolog_cfli.hh,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.hh,
+	interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	interfaces/Prolog/SICStus/sicstus_cfli.h,
+	interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	interfaces/Prolog/SICStus/sicstus_efli.cc,
+	interfaces/Prolog/SICStus/sicstus_efli.hh,
+	interfaces/Prolog/SICStus/sp_clpq.pl,
+	interfaces/Prolog/SICStus/sp_pl_check.pl,
+	interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/SWI/pl_clpq.cc, interfaces/Prolog/SWI/pl_clpq.pl,
+	interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	interfaces/Prolog/SWI/ppl_pl.cc,
+	interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	interfaces/Prolog/SWI/swi_cfli.hh,
+	interfaces/Prolog/SWI/swi_efli.cc,
+	interfaces/Prolog/SWI/swi_efli.hh,
+	interfaces/Prolog/SWI/swi_pl_check.pl,
+	interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_
+	test_P.m4, interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/XSB/xsb_cfli.hh,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/XSB/xsb_efli.hh,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	interfaces/Prolog/YAP/ppl_yap.pl,
+	interfaces/Prolog/YAP/yap_cfli.hh,
+	interfaces/Prolog/YAP/yap_clpq.pl,
+	interfaces/Prolog/YAP/yap_clpq2.pl,
+	interfaces/Prolog/YAP/yap_efli.cc,
+	interfaces/Prolog/YAP/yap_efli.hh,
+	interfaces/Prolog/YAP/yap_pl_check.pl,
+	interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.inlines.hh,
+	interfaces/Prolog/ppl_prolog_sysdep_dox,
+	interfaces/Prolog/ppl_prolog_sysindep_dox,
+	interfaces/Prolog/tests/Makefile.am,
+	interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl,
+	interfaces/Prolog/tests/expected_clpq2_int16,
+	interfaces/Prolog/tests/expected_clpq2_int16_a,
+	interfaces/Prolog/tests/expected_clpq2_int32,
+	interfaces/Prolog/tests/expected_clpq2_int32_a,
+	interfaces/Prolog/tests/expected_clpq2_int64,
+	interfaces/Prolog/tests/expected_clpq2_int64_a,
+	interfaces/Prolog/tests/expected_clpq2_int8,
+	interfaces/Prolog/tests/expected_clpq2_int8_a,
+	interfaces/Prolog/tests/expected_clpq2_mpz,
+	interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	interfaces/Prolog/tests/expected_clpq_int16,
+	interfaces/Prolog/tests/expected_clpq_int16_a,
+	interfaces/Prolog/tests/expected_clpq_int32,
+	interfaces/Prolog/tests/expected_clpq_int32_a,
+	interfaces/Prolog/tests/expected_clpq_int64,
+	interfaces/Prolog/tests/expected_clpq_int64_a,
+	interfaces/Prolog/tests/expected_clpq_int8,
+	interfaces/Prolog/tests/expected_clpq_int8_a,
+	interfaces/Prolog/tests/expected_clpq_mpz,
+	interfaces/Prolog/tests/expected_clpq_mpz_a,
+	interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4,
+	interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py,
+	interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+	interfaces/ppl_interface_generator_common.m4,
+	interfaces/ppl_interface_generator_common_dat.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	interfaces/ppl_interface_generator_copyright, m4/Makefile.am,
+	m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+	m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	m4/ac_check_yap.m4, m4/ac_cxx_attribute_weak.m4,
+	m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+	m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_exact_output.m4,
+	m4/ac_cxx_ieee_inexact_flag.m4, m4/ac_cxx_limit_memory.m4,
+	m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4,
+	m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+	m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+	m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4, m4/ppl.m4, m4/ppl_c.m4,
+	src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+	src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	src/Bit_Row.inlines.hh, src/Bit_Row.types.hh, src/Boundary.defs.hh,
+	src/Box.cc, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/Box.types.hh, src/Box_Status.idefs.hh,
+	src/Box_Status.inlines.hh, src/CO_Tree.cc, src/CO_Tree.defs.hh,
+	src/CO_Tree.inlines.hh, src/CO_Tree.templates.hh,
+	src/CO_Tree.types.hh, src/C_Integer.hh, src/C_Polyhedron.cc,
+	src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Checked_Number.templates.hh, src/Checked_Number.types.hh,
+	src/Coefficient.cc, src/Coefficient.defs.hh,
+	src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	src/Coefficient_traits_template.hh, src/Congruence.cc,
+	src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	src/Congruence.types.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Congruence_System.types.hh, src/Constraint.cc,
+	src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	src/Constraint.types.hh, src/Constraint_System.cc,
+	src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	src/DB_Matrix.types.hh, src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	src/DB_Row.templates.hh, src/DB_Row.types.hh, src/Dense_Matrix.cc,
+	src/Dense_Matrix.defs.hh, src/Dense_Matrix.inlines.hh,
+	src/Dense_Matrix.types.hh, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh, src/Dense_Row.templates.hh,
+	src/Dense_Row.types.hh, src/Determinate.defs.hh,
+	src/Determinate.inlines.hh, src/Determinate.types.hh, src/Float.cc,
+	src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	src/Generator.cc, src/Generator.defs.hh, src/Generator.inlines.hh,
+	src/Generator.types.hh, src/Generator_System.cc,
+	src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	src/Generator_System.types.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh,
+	src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+	src/Has_Assign_Or_Swap.hh, src/Init.cc, src/Init.defs.hh,
+	src/Init.inlines.hh, src/Init.types.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval.templates.hh,
+	src/Interval.types.hh, src/Interval_Info.defs.hh,
+	src/Interval_Info.inlines.hh, src/Interval_Info.types.hh,
+	src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	src/Linear_Row.types.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/Linear_System.types.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	src/Makefile.am, src/Matrix.defs.hh, src/Matrix.types.hh,
+	src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/PIP_Tree.inlines.hh, src/PIP_Tree.types.hh,
+	src/Partial_Function.cc, src/Partial_Function.defs.hh,
+	src/Partial_Function.inlines.hh, src/Partial_Function.types.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+	src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+	src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+	src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+	src/Poly_Gen_Relation.inlines.hh, src/Poly_Gen_Relation.types.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron.types.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	src/Powerset.templates.hh, src/Powerset.types.hh,
+	src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	src/Ptr_Iterator.types.hh, src/Rational_Box.hh,
+	src/Rational_Interval.hh, src/Result.defs.hh,
+	src/Result.inlines.hh, src/Rounding_Dir.defs.hh,
+	src/Rounding_Dir.inlines.hh, src/Row.defs.hh, src/Row.types.hh,
+	src/Row_Flags.cc, src/Row_Flags.defs.hh, src/Row_Flags.inlines.hh,
+	src/Row_Flags.types.hh, src/Scalar_Products.cc,
+	src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	src/Scalar_Products.types.hh, src/Slow_Copy.hh,
+	src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh, src/Sparse_Matrix.types.hh,
+	src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+	src/Sparse_Row.types.hh, src/Temp.defs.hh, src/Temp.inlines.hh,
+	src/Temp.templates.hh, src/Topology.hh, src/Variable.cc,
+	src/Variable.defs.hh, src/Variable.inlines.hh,
+	src/Variable.types.hh, src/Variables_Set.cc,
+	src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	src/Variables_Set.types.hh, src/WRD_coefficient_types.defs.hh,
+	src/WRD_coefficient_types.inlines.hh, src/Weight_Profiler.cc,
+	src/Weight_Profiler.defs.hh, src/Widening_Function.defs.hh,
+	src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	src/algorithms.hh, src/assert.hh, src/assign_or_swap.hh,
+	src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/c_streambuf.types.hh,
+	src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/checked_numeric_limits.hh, src/compiler.hh, src/conversion.cc,
+	src/distances.defs.hh, src/distances.inlines.hh,
+	src/distances.types.hh, src/fpu-c99.inlines.hh, src/fpu-ia32.cc,
+	src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	src/globals.types.hh, src/initializer.hh, src/intervals.defs.hh,
+	src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	src/iterator_to_const.types.hh, src/math_utilities.defs.hh,
+	src/math_utilities.inlines.hh, src/max_space_dimension.hh,
+	src/meta_programming.hh, src/minimize.cc, src/mp_std_bits.cc,
+	src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+	src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+	src/simplify.cc, src/stdiobuf.cc, src/stdiobuf.defs.hh,
+	src/stdiobuf.inlines.hh, src/stdiobuf.types.hh,
+	src/swapping_sort.icc, src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, src/version.cc, src/version.hh.in,
+	src/wrap_assign.hh, src/wrap_string.cc, src/wrap_string.hh,
+	tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	tests/BD_Shape/addspacedims1.cc,
+	tests/BD_Shape/affinedimension1.cc, tests/BD_Shape/affineimage1.cc,
+	tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affinepreimage1.cc,
+	tests/BD_Shape/ascii_dump_load1.cc,
+	tests/BD_Shape/bgp99extrapolation1.cc,
+	tests/BD_Shape/bhmz05widening1.cc,
+	tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	tests/BD_Shape/boundedaffineimage1.cc,
+	tests/BD_Shape/boundedaffinepreimage1.cc,
+	tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+	tests/BD_Shape/contains1.cc,
+	tests/BD_Shape/containsintegerpoint1.cc,
+	tests/BD_Shape/difference1.cc, tests/BD_Shape/discrete1.cc,
+	tests/BD_Shape/disjoint1.cc,
+	tests/BD_Shape/dropsomenonintegerpoints1.cc,
+	tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	tests/BD_Shape/expandspacedim1.cc,
+	tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frequency1.cc,
+	tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+	tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/fromgrid1.cc,
+	tests/BD_Shape/fromoctagonalshape1.cc,
+	tests/BD_Shape/frompolyhedron1.cc, tests/BD_Shape/fromspacedim1.cc,
+	tests/BD_Shape/generalizedaffineimage1.cc,
+	tests/BD_Shape/generalizedaffineimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage1.cc,
+	tests/BD_Shape/generalizedaffinepreimage2.cc,
+	tests/BD_Shape/generalizedaffinepreimage3.cc,
+	tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	tests/BD_Shape/integerupperboundifexact1.cc,
+	tests/BD_Shape/intersection1.cc,
+	tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	tests/BD_Shape/limitedcc76extrapolation1.cc,
+	tests/BD_Shape/limitedh79extrapolation1.cc,
+	tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	tests/BD_Shape/simplifyusingcontext1.cc,
+	tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	tests/BD_Shape/universe1.cc, tests/BD_Shape/upperbound1.cc,
+	tests/BD_Shape/upperboundifexact1.cc, tests/BD_Shape/wrap1.cc,
+	tests/BD_Shape/writebdshape1.cc, tests/Box/Makefile.am,
+	tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	tests/Box/affinedimension1.cc, tests/Box/affineimage1.cc,
+	tests/Box/affinepreimage1.cc, tests/Box/ascii_dump_load1.cc,
+	tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	tests/Box/boundedaffinepreimage1.cc, tests/Box/cc76narrowing1.cc,
+	tests/Box/cc76widening.cc, tests/Box/concatenate1.cc,
+	tests/Box/congruences1.cc, tests/Box/constrains1.cc,
+	tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	tests/Box/containsintegerpoint1.cc, tests/Box/difference1.cc,
+	tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+	tests/Box/empty1.cc, tests/Box/equality1.cc,
+	tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	tests/Box/frequency1.cc, tests/Box/frombdshape1.cc,
+	tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	tests/Box/fromgrid1.cc, tests/Box/frompartiallyreducedproduct1.cc,
+	tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	tests/Box/generalizedaffineimage2.cc,
+	tests/Box/generalizedaffinepreimage1.cc, tests/Box/geomcovers1.cc,
+	tests/Box/intersection1.cc, tests/Box/interval1.cc,
+	tests/Box/limitedcc76extrapolation1.cc, tests/Box/mapspacedims1.cc,
+	tests/Box/max_min1.cc, tests/Box/maxspacedim1.cc,
+	tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	tests/Box/propagateconstraints1.cc,
+	tests/Box/propagateconstraints2.cc,
+	tests/Box/refinewithcongruence1.cc,
+	tests/Box/refinewithcongruences1.cc,
+	tests/Box/refinewithconstraint1.cc,
+	tests/Box/refinewithconstraint2.cc,
+	tests/Box/refinewithconstraints1.cc,
+	tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+	tests/Box/relations2.cc, tests/Box/relations3.cc,
+	tests/Box/relations4.cc, tests/Box/removespacedims1.cc,
+	tests/Box/run_tests, tests/Box/simplifyusingcontext1.cc,
+	tests/Box/timeelapse1.cc, tests/Box/topclosed1.cc,
+	tests/Box/unconstrain1.cc, tests/Box/universe1.cc,
+	tests/Box/upperbound1.cc, tests/Box/upperboundifexact1.cc,
+	tests/Box/wrap1.cc, tests/Box/writebox1.cc,
+	tests/CO_Tree/Makefile.am, tests/CO_Tree/cotree1.cc,
+	tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	tests/Grid/affinepreimage2.cc, tests/Grid/approximatepartition1.cc,
+	tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	tests/Grid/boundedaffineimage1.cc,
+	tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	tests/Grid/constraints1.cc, tests/Grid/contains1.cc,
+	tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+	tests/Grid/disjoint1.cc, tests/Grid/dropnonintegerpoints1.cc,
+	tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	tests/Grid/foldspacedims1.cc, tests/Grid/frequency1.cc,
+	tests/Grid/frombdshape1.cc, tests/Grid/frombox1.cc,
+	tests/Grid/fromgrid1.cc, tests/Grid/fromoctagonalshape1.cc,
+	tests/Grid/frompolyhedron1.cc,
+	tests/Grid/generalizedaffineimage1.cc,
+	tests/Grid/generalizedaffineimage2.cc,
+	tests/Grid/generalizedaffineimage3.cc,
+	tests/Grid/generalizedaffinepreimage1.cc,
+	tests/Grid/generalizedaffinepreimage2.cc,
+	tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/generator1.cc,
+	tests/Grid/generators1.cc, tests/Grid/generators2.cc,
+	tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	tests/Grid/limitedextrapolation1.cc,
+	tests/Grid/limitedextrapolation2.cc,
+	tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	tests/Grid/powersetdifference1.cc,
+	tests/Grid/powersetgeometricallycovers1.cc,
+	tests/Grid/powersetgeometricallyequals1.cc,
+	tests/Grid/refinewithcongruences1.cc,
+	tests/Grid/refinewithconstraints1.cc, tests/Grid/relations1.cc,
+	tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	tests/Grid/simplifyusingcontext1.cc, tests/Grid/timeelapse1.cc,
+	tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	tests/Grid/unconstrain1.cc, tests/Grid/upperbound1.cc,
+	tests/Grid/upperbound2.cc, tests/Grid/widening1.cc,
+	tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	tests/Grid/wrap1.cc, tests/Grid/writecongruencesystem.cc,
+	tests/MIP_Problem/Makefile.am,
+	tests/MIP_Problem/ascii_dump_load1.cc,
+	tests/MIP_Problem/exceptions1.cc, tests/MIP_Problem/mipproblem1.cc,
+	tests/MIP_Problem/mipproblem2.cc, tests/MIP_Problem/mipproblem3.cc,
+	tests/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/addspacedims1.cc,
+	tests/Octagonal_Shape/affinedimension1.cc,
+	tests/Octagonal_Shape/affineimage1.cc,
+	tests/Octagonal_Shape/affineimage2.cc,
+	tests/Octagonal_Shape/affinepreimage1.cc,
+	tests/Octagonal_Shape/affinepreimage2.cc,
+	tests/Octagonal_Shape/ascii_dump_load1.cc,
+	tests/Octagonal_Shape/bhmz05widening1.cc,
+	tests/Octagonal_Shape/bhz03widening1.cc,
+	tests/Octagonal_Shape/bounded1.cc,
+	tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	tests/Octagonal_Shape/bounds1.cc,
+	tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/cc76narrowing1.cc,
+	tests/Octagonal_Shape/chinainit.cc,
+	tests/Octagonal_Shape/concatenate1.cc,
+	tests/Octagonal_Shape/congruences1.cc,
+	tests/Octagonal_Shape/constrains1.cc,
+	tests/Octagonal_Shape/constraints1.cc,
+	tests/Octagonal_Shape/contains1.cc,
+	tests/Octagonal_Shape/containsintegerpoint1.cc,
+	tests/Octagonal_Shape/difference1.cc,
+	tests/Octagonal_Shape/discrete1.cc,
+	tests/Octagonal_Shape/disjoint1.cc,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc,
+	tests/Octagonal_Shape/empty1.cc,
+	tests/Octagonal_Shape/expandspacedim1.cc,
+	tests/Octagonal_Shape/foldspacedims1.cc,
+	tests/Octagonal_Shape/frequency1.cc,
+	tests/Octagonal_Shape/frombdshape1.cc,
+	tests/Octagonal_Shape/frombox1.cc,
+	tests/Octagonal_Shape/fromgensys1.cc,
+	tests/Octagonal_Shape/fromgrid1.cc,
+	tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	tests/Octagonal_Shape/frompolyhedron1.cc,
+	tests/Octagonal_Shape/fromspacedim1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	tests/Octagonal_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/intersection1.cc,
+	tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	tests/Octagonal_Shape/mapspacedims1.cc,
+	tests/Octagonal_Shape/max_min1.cc,
+	tests/Octagonal_Shape/max_min2.cc,
+	tests/Octagonal_Shape/maxspacedim1.cc,
+	tests/Octagonal_Shape/membytes1.cc,
+	tests/Octagonal_Shape/minconstraints1.cc,
+	tests/Octagonal_Shape/relatwithcons1.cc,
+	tests/Octagonal_Shape/relatwithcons2.cc,
+	tests/Octagonal_Shape/relatwithcons3.cc,
+	tests/Octagonal_Shape/relatwithgen1.cc,
+	tests/Octagonal_Shape/removespacedims1.cc,
+	tests/Octagonal_Shape/run_tests,
+	tests/Octagonal_Shape/simplifyusingcontext1.cc,
+	tests/Octagonal_Shape/timeelapse1.cc,
+	tests/Octagonal_Shape/unconstrain1.cc,
+	tests/Octagonal_Shape/universe1.cc,
+	tests/Octagonal_Shape/upperbound1.cc,
+	tests/Octagonal_Shape/upperboundifexact1.cc,
+	tests/Octagonal_Shape/wrap1.cc,
+	tests/Octagonal_Shape/writeoctagon1.cc,
+	tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+	tests/PIP_Problem/pipproblem2.cc, tests/PIP_Problem/pipproblem3.cc,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/addcongruences1.cc,
+	tests/Partially_Reduced_Product/addconstraints1.cc,
+	tests/Partially_Reduced_Product/affineimage1.cc,
+	tests/Partially_Reduced_Product/asciidumpload1.cc,
+	tests/Partially_Reduced_Product/bounded1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/concatenate1.cc,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/congruencesproduct1.cc,
+	tests/Partially_Reduced_Product/constraints1.cc,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/contains1.cc,
+	tests/Partially_Reduced_Product/difference1.cc,
+	tests/Partially_Reduced_Product/dimension1.cc,
+	tests/Partially_Reduced_Product/directproduct1.cc,
+	tests/Partially_Reduced_Product/directproduct2.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/discrete1.cc,
+	tests/Partially_Reduced_Product/disjoint1.cc,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc,
+	tests/Partially_Reduced_Product/equals1.cc,
+	tests/Partially_Reduced_Product/frombdshape1.cc,
+	tests/Partially_Reduced_Product/frombox1.cc,
+	tests/Partially_Reduced_Product/fromgrid1.cc,
+	tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+	tests/Partially_Reduced_Product/frompolyhedron1.cc,
+	tests/Partially_Reduced_Product/fromproduct1.cc,
+	tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+	tests/Partially_Reduced_Product/intersection1.cc,
+	tests/Partially_Reduced_Product/isempty1.cc,
+	tests/Partially_Reduced_Product/isuniverse1.cc,
+	tests/Partially_Reduced_Product/maxmin1.cc,
+	tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+	tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+	tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/shapepreservingproduct1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/spacedims1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc,
+	tests/Partially_Reduced_Product/topclosed1.cc,
+	tests/Partially_Reduced_Product/topclosure1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Partially_Reduced_Product/widening1.cc,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	tests/Polyhedron/addcongruences1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addconstraints2.cc,
+	tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerator2.cc,
+	tests/Polyhedron/addgenerators1.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/addspacedims1.cc,
+	tests/Polyhedron/addspacedims2.cc,
+	tests/Polyhedron/affineimage1.cc, tests/Polyhedron/affineimage2.cc,
+	tests/Polyhedron/affinepreimage1.cc,
+	tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	tests/Polyhedron/append2.cc, tests/Polyhedron/ascii_dump_load1.cc,
+	tests/Polyhedron/ascii_dump_load2.cc,
+	tests/Polyhedron/ascii_dump_load3.cc,
+	tests/Polyhedron/bgp99extrapolation1.cc,
+	tests/Polyhedron/bgp99extrapolation2.cc,
+	tests/Polyhedron/bhrz03widening1.cc,
+	tests/Polyhedron/bhrz03widening2.cc,
+	tests/Polyhedron/bhrz03widening3.cc,
+	tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/boundedaffinepreimage1.cc,
+	tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	tests/Polyhedron/boundedh79extrapolation1.cc,
+	tests/Polyhedron/bounds1.cc, tests/Polyhedron/cnncconversion1.cc,
+	tests/Polyhedron/concatenate1.cc, tests/Polyhedron/congruences1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+	tests/Polyhedron/contains1.cc, tests/Polyhedron/contains2.cc,
+	tests/Polyhedron/containsintegerpoint1.cc,
+	tests/Polyhedron/densematrix1.cc, tests/Polyhedron/disjoint1.cc,
+	tests/Polyhedron/disjoint2.cc,
+	tests/Polyhedron/dropsomenonintegerpoints1.cc,
+	tests/Polyhedron/dropsomenonintegerpoints2.cc,
+	tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	tests/Polyhedron/expandspacedim1.cc,
+	tests/Polyhedron/expandspacedim2.cc,
+	tests/Polyhedron/foldspacedims1.cc,
+	tests/Polyhedron/foldspacedims2.cc, tests/Polyhedron/frequency1.cc,
+	tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	tests/Polyhedron/fromoctagonalshape1.cc,
+	tests/Polyhedron/generalizedaffineimage1.cc,
+	tests/Polyhedron/generalizedaffineimage2.cc,
+	tests/Polyhedron/generalizedaffinepreimage1.cc,
+	tests/Polyhedron/generalizedaffinepreimage2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	tests/Polyhedron/h79widening1.cc, tests/Polyhedron/h79widening2.cc,
+	tests/Polyhedron/hybrid.cc, tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	tests/Polyhedron/limitedh79extrapolation1.cc,
+	tests/Polyhedron/linearexpression1.cc,
+	tests/Polyhedron/linearpartition1.cc,
+	tests/Polyhedron/linearsystem1.cc,
+	tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/max_min1.cc,
+	tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	tests/Polyhedron/membytes1.cc, tests/Polyhedron/memory1.cc,
+	tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	tests/Polyhedron/minconstraints2.cc,
+	tests/Polyhedron/mingenerators1.cc,
+	tests/Polyhedron/mingenerators2.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/nncminimize2.cc,
+	tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	tests/Polyhedron/polydifference2.cc, tests/Polyhedron/polyhull1.cc,
+	tests/Polyhedron/polyhull2.cc,
+	tests/Polyhedron/polyhullifexact1.cc,
+	tests/Polyhedron/polyhullifexact2.cc,
+	tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/refinewithcongruence1.cc,
+	tests/Polyhedron/refinewithcongruences1.cc,
+	tests/Polyhedron/refinewithconstraint1.cc,
+	tests/Polyhedron/refinewithconstraints1.cc,
+	tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	tests/Polyhedron/relations3.cc,
+	tests/Polyhedron/removespacedims1.cc,
+	tests/Polyhedron/removespacedims2.cc,
+	tests/Polyhedron/simplifyusingcontext1.cc,
+	tests/Polyhedron/smm1.cc, tests/Polyhedron/termination1.cc,
+	tests/Polyhedron/termination2.cc, tests/Polyhedron/timeelapse1.cc,
+	tests/Polyhedron/timeelapse2.cc, tests/Polyhedron/topclosed1.cc,
+	tests/Polyhedron/topclosure1.cc, tests/Polyhedron/unconstrain1.cc,
+	tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	tests/Polyhedron/weightwatch1.cc, tests/Polyhedron/wrap1.cc,
+	tests/Polyhedron/wrap2.cc, tests/Polyhedron/writeconsys1.cc,
+	tests/Polyhedron/writegensys1.cc,
+	tests/Polyhedron/writepolyhedron1.cc,
+	tests/Polyhedron/writepolyhedron2.cc,
+	tests/Polyhedron/writerelation1.cc,
+	tests/Polyhedron/writevariable1.cc, tests/Powerset/Makefile.am,
+	tests/Powerset/addcongruences1.cc,
+	tests/Powerset/addconstraints1.cc,
+	tests/Powerset/affinedimension1.cc, tests/Powerset/affineimage1.cc,
+	tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+	tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+	tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+	tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+	tests/Powerset/containsintegerpoint1.cc,
+	tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+	tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+	tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+	tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+	tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+	tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+	tests/Powerset/fromoctagonalshape1.cc,
+	tests/Powerset/frompolyhedron1.cc,
+	tests/Powerset/fromspacedimension1.cc,
+	tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+	tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+	tests/Powerset/powerset1.cc, tests/Powerset/reduce1.cc,
+	tests/Powerset/refinewith1.cc, tests/Powerset/relationwith1.cc,
+	tests/Powerset/simplifyusingcontext1.cc, tests/Powerset/size1.cc,
+	tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+	tests/Powerset/upperbound1.cc, tests/README,
+	tests/Random_Number_Generator.defs.hh,
+	tests/Random_Number_Generator.inlines.hh,
+	tests/Random_Number_Generator.types.hh,
+	tests/Sparse_Matrix/Makefile.am,
+	tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc, tests/files.cc, tests/files.hh,
+	tests/ppl_test.cc, tests/ppl_test.hh, utils/Makefile.am,
+	utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh: 
+	Copyright notices updated.
+
+2011-01-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 0fd2de73dd626465d1c77d925eb63e2adb639648 Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Sat Jan 8 17:23:18 2011
+	+0100
+
+2011-01-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.inlines.hh: Cyclic dependency avoided.
+
+2011-01-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh: Fixed documentation copy-and-paste error.
+
+2011-01-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh, src/Octagonal_Shape.templates.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Tree.cc,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Polyhedron_public.cc, src/conversion.cc, src/globals.inlines.hh: 
+	Replaced several occurrences of assert() by PPL_ASSERT().
+
+2011-01-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Added missing parameter documentation.
+
+2011-01-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am: Do not build documentation for interfaces that
+	are not enabled.
+
+2011-01-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_prolog_generated_test.pl: Added missing
+	`use_module' directive.
+
+2010-12-30  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: 
+	Dense_Row: simplify the exception safety implementation by using an
+	implementation subobject.
+
+2010-12-27  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.inlines.hh: Dense_Row: improve
+	exception safety in constructors.
+
+2010-12-27  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc: Dense_Row: remove useless debugging code from
+	the OK() method.
+
+2010-12-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Constraint.inlines.hh, src/Dense_Matrix.cc, src/Dense_Row.cc,
+	src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Generator.inlines.hh, src/Linear_Row.cc,
+	src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	src/Sparse_Matrix.cc, src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh: Dense_Row, Sparse_Row, Linear_Row: modify
+	the flags' getter and setter methods, to follow strict aliasing
+	rules.
+
+2010-12-25  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh, src/Linear_Expression.cc,
+	src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	src/Linear_System.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh: Dense_Row, Sparse_Row: remove the
+	construct() methods and add a constructor from Flags. Update client
+	code.
+
+2010-12-25  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.cc, src/Dense_Matrix.inlines.hh,
+	src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Dense_Row.types.hh: Dense_Row: simplify the internal
+	representation and implementation.
+
+2010-12-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Sparse_Row.defs.hh: Avoid a couple of doxygen warnings.
+
+2010-12-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh: Memory leaks fixed.  (Patch by Marco
+	Poletti.)
+
+2010-12-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Updated.
+
+2010-12-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh: Added a
+	workaround to a space efficiency bug affecting MIP_Problem.  The
+	baseline patch has been contributed by Marco Poletti.  MIP_Problem now stores the input constraints as a sequence of
+	Constraint*.  In this sequence, we distinguish between owned
+	constraints (whose resources are under control of the current
+	MIP_Problem object) and inherited constraints (whose resources are
+	shared with, and owned by, another MIP_Problem object).  When
+	starting a branch-and-bound computation looking for an integral
+	feasible/optimal solution, we now inherit (rather than copy) the
+	input constraints.  The workaround greatly improves space/time efficiency on (mixed)
+	integral problems, also providing a (simple and reasonable) partial
+	solution to     https://www.cs.unipr.it/mantis/view.php?id=62 The solution is still partial: a complete solution requires the
+	implementation of a backtracking mechanism for incrementally added
+	constraints.
+
+2010-12-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4: Obsolete comment removed.
+
+2010-12-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: No longer include BD_Shape<int8_t> among the
+	instantiations enabled by default.
+
+2010-12-19  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* m4/ac_check_sicstus_prolog.m4, m4/ac_check_xsb_prolog.m4: Replaced
+	$(cmd) with `cmd` in m4 autoconf files.
+
+2010-12-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox, instchk.hh, tests/Powerset/powerset1.cc: 
+	Avoid using identifier PS, since Solaris has a macro with that name.
+
+2010-12-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Linear_Form.inlines.hh: Fixed a problem involving a missing
+	iostream inclusion.
+
+2010-12-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Linear_Form.inlines.hh: Added a proposed implementation for
+	ascii_dump() and ascii_load().
+
+2010-11-30  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/digitalfilters1.cc,
+	tests/Concrete_Expression/linearize.cc: Replaced
+	Integer_Interval_Type with Integer_Interval in tests.
+
+2010-11-30  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/linearize.hh: Fixed a few cut-and-paste errors in the
+	documentation.
+
+2010-11-30  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, src/Concrete_Expression.defs.hh,
+	src/Integer_Interval.hh, src/Makefile.am: Renamed
+	Integer_Interval_Type into Integer_Interval and moved it to
+	Integer_Interval.hh.
+
+2010-11-18  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Float.templates.hh, src/Linear_Form.templates.hh: Use ldexp
+	instead of ldexpl for portability reasons.
+
+2010-11-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.templates.hh, src/Linear_Form.templates.hh: Inclusions
+	of <cmath> fixed.
+
+2010-11-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 6ba7085042a9983395f1b15daa1bf88b68a48eff Author: Fabio
+	Bossi <bossi at cs.unipr.it> Date:   Sat Oct 23 14:48:50 2010 +0200
+
+2010-10-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Properly quote the assignment
+	MAKE=$(MAKE).  (Thanks to Volker Braun.)
+
+2010-10-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Properly quote the assignment
+	MAKE=$(MAKE).  (Thanks to Volker Braun.)
+
+2010-10-19  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/Concrete_Expression/octagonalshape1.cc: Reflect latest changes
+	to affine_image into affine_form_image.
+
+2010-10-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Updated list of bug fixes.
+
+2010-10-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* : commit 5c95fc0eab6a38442751ed16c6cfa9d538917f3f Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Tue Oct 19 08:15:12 2010
+	+0200
+
+2010-10-18  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Fixed a bug.
+
+2010-10-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+	the unused assign() method.
+
+2010-10-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh: Sparse_Matrix: add some methods, to be
+	fully compatible with Dense_Matrix.
+
+2010-10-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh: Sparse_Row: add some methods, to be fully
+	compatible with Dense_Row.
+
+2010-10-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add a
+	max_size() static method.
+
+2010-10-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit ff5b0796773b34ef9d1e26d2a40b4fdb8376dc8f Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Oct 16 09:11:15 2010 +0200
+
+2010-10-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh: Documented precondition of method
+	Bit_Matrix::remove_trailing_columns().
+
+2010-10-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Matrix.cc: In method Bit_Matrix::OK(), do also check the
+	first Bit_Row.
+
+2010-10-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/linearize.hh: Added two FIXME notes.
+
+2010-10-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/linearize.hh: Never add a rounding error when casting 1.
+
+2010-10-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/linearize.hh: Never add a rounding error when casting the 0
+	value.
+
+2010-10-03  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc: Sparse_Row: optimize linear_combine(), avoiding
+	the insertion of too many elements.
+
+2010-10-03  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.defs.hh, src/Sparse_Matrix.defs.hh: Dense_Matrix,
+	Sparse_Matrix: remove useless typedefs for row_type.
+
+2010-10-01  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: fix comment.
+
+2010-09-29  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: 
+	Always use marked_empty() instead of is_empty() after a closure.
+
+2010-09-27  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/CO_Tree.templates.hh: CO_Tree: rename the size field into size_,
+	and add a size() method.
+
+2010-09-27  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: avoid shadowing a field with a local
+	variable, in external_memory_in_bytes().
+
+2010-09-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh: Dense_Row: mark the constructor from a
+	Sparse_Row as explicit.
+
+2010-09-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: add an
+	assignment operator from a Dense_Row.
+
+2010-09-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc: Sparse_Row: copy flags too, in the constructor
+	from a Dense_Row.
+
+2010-09-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh: Dense_Row: add a
+	constructor and an assignment operator that take a Sparse_Row.
+
+2010-09-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.templates.hh, src/Sparse_Row.cc: 
+	CO_Tree: fix bug in the constructor from a sequence and remove its
+	second argument, it is used in assertions only.
+
+2010-09-29  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh: Added
+	generalized_refine_with_linear_form_inequality.
+
+2010-09-29  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Added missing emptiness checks.
+
+2010-09-29  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Implemented
+	export_interval_constraints.
+
+2010-09-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 0bb0a14d690bda10c0893e11b6019128b3c4908e Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Fri Sep 24 19:48:27 2010 +0200
+
+2010-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/libtool.m4, Watchdog/m4/ltversion.m4, m4/libtool.m4,
+	m4/ltversion.m4: Updated.
+
+2010-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, Watchdog/INSTALL, Watchdog/compile,
+	Watchdog/config.guess, Watchdog/config.sub, Watchdog/ltmain.sh,
+	compile, config.guess, config.sub, ltmain.sh: Updated.
+
+2010-09-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Temporarily pass a raw value
+	instead of a checked number for simplicity.
+
+2010-09-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Use is_empty instead of
+	marked_empty for maximum safety.
+
+2010-09-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Added method export_interval_constraints.
+
+2010-09-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit d8484a4794afafb978c01c718ea784465d835171 Author: Marco
+	Poletti <poletti.marco at gmail.com> Date:   Mon Sep 20 20:20:16 2010
+	+0200
+
+2010-09-20  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Constraint_System.cc, src/Dense_Matrix.defs.hh,
+	src/Dense_Matrix.inlines.hh, src/Generator_System.cc,
+	src/Grid_chdims.cc, src/Grid_simplify.cc, src/Linear_System.cc,
+	src/MIP_Problem.cc, src/PIP_Tree.cc, src/Polyhedron.templates.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh,
+	src/conversion.cc, src/simplify.cc: Dense_Matrix, Sparse_Matrix:
+	rename the erase_to_end() method into remove_trailing_rows(),
+	changing the argument's meaning.
+
+2010-09-20  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Grid_Generator_System.defs.hh,
+	src/Grid_Generator_System.inlines.hh: Grid_Generator_System: remove
+	unused erase_to_end() private method.
+
+2010-09-20  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.templates.hh: Fix comment.
+
+2010-09-20  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.inlines.hh: Sparse_Row: weaken the lower_bound()
+	requirements on the argument.
+
+2010-09-20  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc: Sparse_Row: make the constructor from a
+	Dense_Row work even when Coefficient_traits::const_reference is
+	Coefficient.
+
+2010-09-19  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: add a
+	linear_combine() method that takes a Dense_Row and a Sparse_Row, to
+	re-allow dense working costs with sparse matrices.
+
+2010-09-19  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: add assertion.
+
+2010-09-19  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: use working_cost_type instead of
+	using Row directly. Remove unnecessary specialized implementation
+	for sparse working costs.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/MIP_Problem.cc, src/PIP_Problem.cc, src/PIP_Tree.cc,
+	src/Sparse_Matrix.defs.hh, src/Sparse_Row.cc,
+	src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+	src/Sparse_Row.templates.hh: Sparse_Row, Dense_Row: rename
+	find_create() methods into insert().
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row: add documentation.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/Sparse_Matrix/sparserow1.cc: test/Sparse_Matrix: add test
+	for the Sparse_Row's constructor from a Dense_Row.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: add a
+	constructor from a Dense_Row.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.templates.hh, src/Makefile.am: 
+	CO_Tree: add a constructor from a sequence of elements.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Makefile.am: src/Makefile.am: remove duplicate filenames from
+	the list.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/Sparse_Matrix.defs.hh, src/Sparse_Row.defs.hh: Indentation
+	fixes, mainly to avoid line wraps.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.defs.hh: Fix typo in comment.
+
+2010-09-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* : Merge remote branch 'origin/master' into sparse_matrices
+
+2010-09-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* : Merge remote branch 'origin/master' into sparse_matrices Conflicts: 	src/MIP_Problem.cc
+
+2010-09-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/PIP_Tree.cc: Prefer neg_assign to the use
+	of unary minus on Coefficient objects.  Use add_mul_assign even in
+	code only activated during debugging.
+
+2010-09-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention the correction of an efficiency bug in the C
+	interface.
+
+2010-09-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 90d9338c35f62fa89a86c3b7192b2fa8172d1b20 Merge: ff67a6b
+	d91c33b Author: Marco Poletti <poletti.marco at gmail.com> Date:   Thu
+	Sep 16 21:08:52 2010 +0200
+
+2010-09-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix performance bug in
+	compute_generator().
+
+2010-09-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* interfaces/C/ppl_c_implementation_common.cc: 
+	ppl_c_implementation_common: fix performance bug in
+	ppl_Linear_Expression_add_to_coefficient.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove useless reset() from
+	linear_conbine().
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: optimize
+	the linear_combine() method.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.templates.hh: Sparse_Row: don't create stored
+	zeroes in combine_needs_second().
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row: document that linear_combine()
+	parameters must not be 0.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: use Row::linear_combine() in
+	linear_combine().
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh: Sparse_Row: add a
+	linear_combine() method.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh: Dense_Row: add a
+	linear_combine() method.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove some optimizations meant
+	for dense matrices when using sparse matrices.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: remove useless code.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: remove unnecessary temporary variables.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Matrix.defs.hh, src/Matrix.types.hh, src/Row.defs.hh,
+	src/Row.types.hh: Row, Matrix: avoid inclusion of unnecessary files.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/Sparse_Matrix/sparsematrix1.cc,
+	tests/Sparse_Matrix/sparserow1.cc: tests/Sparse_Matrix: run the
+	tests only when using sparse matrices.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: CO_Tree: run tests only when using
+	sparse matrices, avoiding compiler errors.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: PIP_Tree: use Row and
+	Matrix, simplifying code.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh: PIP_Problem: use Row
+	and Matrix, simplifying code.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree.defs.hh: include CO_Tree.types.hh.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Makefile.am,
+	src/Matrix.defs.hh, src/Matrix.types.hh, src/Row.defs.hh,
+	src/Row.types.hh: Declare typedefs for Row and Matrix, and use them
+	in MIP_Problem.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* : Merge remote branch 'origin/master' into sparse_matrices Conflicts: 	src/MIP_Problem.cc
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: return if there are no candidates, in
+	find_lexico_minimum_column().
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Problem.cc: PIP_Problem: declare iterators used in for
+	loops in the loop header.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: declare iterators used in for loops in
+	the loop header.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove non-necessary temporary
+	variables.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove out-dated comment.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: declare iterators used in for
+	loops in the loop header.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/globals.defs.hh: Make PPL_DIRTY_TEMP_COEFFICIENT work outside
+	the PPL namespace, too.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: add comment.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize further
+	steepest_edge_exact_entering_index() for sparse working_cost rows.
+
+2010-09-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: use a hint iterator for
+	insertions in working_cost, in process_pending_constraints().
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize further
+	steepest_edge_float_entering_index() for sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	process_pending_constraints() for sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+	sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix regression in
+	textbook_entering_index(), introduced in commit 6880A6.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+	sparse working_cost rows (#4).
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: avoid an unnecessary copy of the
+	working_cost row, in second_phase().
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+	sparse working_cost rows (#3).
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+	sparse working_cost rows (#2).
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize second_phase() for
+	sparse working_cost rows (#1).
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: little optimizations for sparse
+	working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	textbook_entering_index() for sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	steepest_edge_float_entering_index() for sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	steepest_edge_exact_entering_index() for sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	process_pending_constraints() for sparse working_cost rows.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.inlines.hh: Sparse_Row: add some assertions.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: use a
+	sparse working_cost when using sparse matrices.
+
+2010-09-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+	a constructor and two copy-constructors that take a capacity
+	parameter.
+
+2010-09-13  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/digitalfilters1.cc: Adapted tests on
+	digital filters to latest changes.
+
+2010-09-13  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Float.defs.hh, src/linearize.hh,
+	tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/linearize.cc: Do not fail automatically
+	when linearizing approximable references having more than one
+	associated dimension.
+
+2010-09-13  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Concrete_Expression.defs.hh, src/Float.defs.hh,
+	src/Linear_Form.defs.hh, src/Linear_Form.templates.hh,
+	src/linearize.hh, tests/Concrete_Expression/C_Expr.defs.hh,
+	tests/Concrete_Expression/C_Expr.inlines.hh,
+	tests/Concrete_Expression/Makefile.am,
+	tests/Concrete_Expression/linearform1.cc,
+	tests/Concrete_Expression/linearize.cc: Use an oracle to obtain
+	information from an external analyzer in the linearization function.  Temporarily disabled test digitalfilters.
+
+2010-09-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: improve a little bit the
+	get_exiting_base_index() performance.
+
+2010-09-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.alpha, tests/BD_Shape/disjoint1.cc,
+	tests/Box/congruences1.cc, tests/Box/max_min1.cc,
+	tests/Box/relations4.cc, tests/Grid/addcongruences1.cc,
+	tests/MIP_Problem/exceptions1.cc,
+	tests/Octagonal_Shape/affineimage1.cc,
+	tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/difference1.cc,
+	tests/Octagonal_Shape/disjoint1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	tests/Octagonal_Shape/unconstrain1.cc,
+	tests/Polyhedron/exceptions2.cc: Reflected the changes in
+	http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8966
+
+2010-09-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: don't copy Coefficient objects to
+	cache accesses, in steepest_edge_exact_entering_index().
+
+2010-09-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Mentioned the fix to Interval::Interval(const char*).
+
+2010-09-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 3e2fe287b4efd3b58127951793cc00ffe0ca21c0 Author: Abramo
+	Bagnara <abramo.bagnara at gmail.com> Date:   Tue Sep 7 23:13:17 2010
+	+0200
+
+2010-09-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Announced a couple of new features and bugfixes.
+
+2010-09-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention the use of sparse matrices in MIP and PIP solvers.
+
+2010-09-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix some debug messages and
+	comments, in OK().
+
+2010-09-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix typos in some debug messages
+	and comments, in OK().
+
+2010-09-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 3c68d508caa260d4dc59b5f6922fe6a0079d6eef Author: Fabio
+	Bossi <bossi at cs.unipr.it> Date:   Tue Sep 7 17:51:07 2010 +0200
+
+2010-09-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: test06 fails with 8-bit
+	coefficients.
+
+2010-09-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 384f089de7b9464efddf008a02d773af6ae213ea Author: Marco
+	Poletti <poletti.marco at gmail.com> Date:   Sun Sep 5 19:33:59 2010
+	+0200
+
+2010-09-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/Sparse_Matrix/sparsematrix1.cc: tests/Sparse_Matrix: modify
+	the tests so that they pass even when using 8-bit coefficients.
+
+2010-09-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: use DO_TEST_F8 when a
+	test is expected to fail with 8-bit coefficients.
+
+2010-09-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: work when
+	Coefficient_traits::const_reference is just Coefficient, losing some
+	performance when it's not.
+
+2010-09-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: work when
+	Coefficient_traits::const_reference is just Coefficient, losing some
+	performance when it's not.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: work even when
+	data_type_const_reference is `data_type' instead of `const
+	data_type&'.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+	dfs_index() methods.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: add data_type_const_reference typedef and use it instead of
+	const data_type&.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh: Sparse_Row: use
+	Coefficient_traits::const_reference instead of const Coefficient&.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: 
+	Dense_Row: use Coefficient_traits::const_reference instead of const
+	Coefficient&.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: use Coefficient_traits::const_reference
+	instead of const Coefficient&.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Problem.cc: PIP_Problem: use
+	Coefficient_traits::const_reference instead of const Coefficient&.
+
+2010-09-04  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: use
+	Coefficient_traits::const_reference instead of const Coefficient&.
+
+2010-09-03  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: fix compilation when
+	Coefficient_traits::const_reference is not `const Coefficient&'.
+
+2010-09-03  Marco Poletti <poletti.marco at gmail.com>
+
+	* : commit 7d4b9abcd12085a554123d1dda6efc7d09037896 Author: Marco
+	Poletti <poletti.marco at gmail.com> Date:   Fri Sep 3 20:29:20 2010
+	+0200
+
+2010-09-03  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: rename index() method into dfs_index().
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int16_a,
+	demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64_a,
+	demos/ppl_lpsol/expected_int8_a: Expected results updated.
+
+2010-09-03  Marco Poletti <poletti.marco at gmail.com>
+
+	* : commit 14c85a1607cf3ccfbf016ae5ea808dafffa37d04 Merge: 47946c5
+	bc0f52b Author: Marco Poletti <poletti.marco at gmail.com> Date:   Fri
+	Sep 3 16:14:56 2010 +0200
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int32,
+	demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int8: 
+	Updated expected results.
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit c9b9ee534d533869f1c5951c9909b04eeb60325b Merge: 22520a5
+	533049e Author: Roberto Bagnara <bagnara at cs.unipr.it> Date:   Fri
+	Sep 3 15:36:02 2010 +0200
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number fixed.
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Revised Marco Poletti's entry.
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh: By default, use sparse matrices both for
+	MIP_Problem and PIP_Problem.
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/globals.defs.hh: Slight improvement to the selection mechanism
+	for sparse and dense matrices.
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-09-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 22520a5a072e6b1641b6a94585eb20c6b1cec2e8 Author: Fabio
+	Bossi <bossi at cs.unipr.it> Date:   Fri Sep 3 11:03:16 2010 +0200
+
+2010-09-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, tests/Polyhedron/numberinput1.cc: 
+	Improved documentation for number input routine.  Added another
+	couple of tests.
+
+2010-09-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.cc, tests/Polyhedron/numberinput1.cc: Let the input
+	routine accept floating-point syntax starting with ".".
+
+2010-08-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/checked.cc,
+	tests/Polyhedron/numberinput1.cc: Let the input routine for checked
+	numbers accepts C99 hexadecimal float syntax.
+
+2010-08-31  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: fix compilation with
+	--enable-assertions and without --enable-more-assertions.
+
+2010-08-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit eac65c875791c7ad6065a918cada3783f487f706 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Aug 30 09:20:53 2010 +0200
+
+2010-08-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit f078b9a6bcc0c1fa82d474e676e82a8e5dd8d319 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sun Aug 29 14:32:07 2010 +0200
+
+2010-08-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: For checking purposes, use the exact
+	LP solver of GLPK.
+
+2010-08-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, demos/ppl_lpsol/Makefile.am,
+	demos/ppl_lpsol/glpk_set_d_eps.c, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c, doc/ppl-config.1: When the `--check'
+	option is used, input data is perturbed the same way as GLPK does.
+
+2010-08-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Do also read the inhomogeneous term
+	of the objective function.  This should allow for a (almost) meaningful comparison with the
+	optimizied value computed by glpk when using command line option -c.  Also corrected a minor bug in the output routine for the objective
+	function (an open parenthesis was sometimes missing).
+
+2010-08-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit f75832a600dfb6af890af3fb94cb99500d7e5de4 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Aug 28 14:31:18 2010 +0200
+
+2010-08-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 95a83d824c7ffd8f61f627fab3aa22dae3a65fcf Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Aug 28 14:11:34 2010 +0200
+
+2010-08-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 309c66893fcd97c6a648ef72cbc1b3fed07defe6 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Aug 28 14:05:20 2010 +0200
+
+2010-08-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Fixed the argument type of
+	limit_virtual_memory(): should be unsigned long.
+
+2010-08-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Augment the precision with which
+	floating point numbers are printed in error messages.
+
+2010-08-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: improve code in rebalance().
+
+2010-08-26  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh, src/Sparse_Matrix.inlines.hh,
+	src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh: CO_Tree,
+	Sparse_Row, Sparse_Matrix: remove unnecessary includes.
+
+2010-08-25  Marco Poletti <poletti.marco at gmail.com>
+
+	* : Merge remote branch 'origin/master' into sparse_matrices
+
+2010-08-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am: Added $(top_builddir)/src/libppl.la
+	to ppl_lpsol_LDADD.
+
+2010-08-25  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix performance regression in
+	steepest_edge_float_entering_index().
+
+2010-08-25  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix performance regression in
+	steepest_edge_exact_entering_index(), when using dense matrices.
+
+2010-08-24  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: tune density thresholds.
+
+2010-08-24  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: avoid
+	unnecessary typedefs.
+
+2010-08-24  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix performance regression in the
+	dense version of linear_combine().
+
+2010-08-24  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix performance regression in
+	steepest_edge_float_entering_index(), when using dense matrices.
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: document that
+	min_leaf_density_percent must be greater than zero.
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row: document that hint iterators
+	must be valid and point to that row.
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: be exception-safe.
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: perform checks that need an ABI change only when
+	PPL_ABI_BREAKING_EXTRA_DEBUG is defined.
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: rename
+	PPL_ROW_EXTRA_DEBUG macro into PPL_DENSE_ROW_EXTRA_DEBUG.
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/Sparse_Row.inlines.hh,
+	tests/CO_Tree/cotree1.cc: CO_Tree: rename increase_keys_after()
+	method into increase_keys_from().
+
+2010-08-22  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Dense_Row.defs.hh,
+	src/MIP_Problem.defs.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Row.defs.hh: Improve Doxygen documentation.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc, src/Sparse_Matrix.inlines.hh: Sparse_Matrix:
+	do not inline complex methods.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh: Sparse_Matrix: reorder method
+	declarations and definitions.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row: fix documentation for
+	lower_bound() methods.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.inlines.hh: Sparse_Row: do not
+	inline complex methods.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh: Sparse_Row: reorder method declarations
+	and definitions.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.defs.hh: Sparse_Matrix: improve documentation,
+	adapting to changes in Sparse_Row methods' complexity.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row: improve documentation,
+	adapting to changes in CO_Tree methods' complexity.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: improve documentation, fixing the
+	complexities of insertions and deletions.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: MIP_Problem: remove
+	row_type typedef, to avoid confusion with matrix_type::row_type.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: do not use reset() on Dense_Row
+	object, to avoid confusion.
+
+2010-08-21  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: fix documentation of
+	min_density_percent.
+
+2010-08-19  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: simplify code in
+	steepest_edge_float_entering_index().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	steepest_edge_exact_entering_index().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	steepest_edge_float_entering_index().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: optimize count_used_in_subtree().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: optimize
+	compact_elements_in_the_rightmost_end().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: add comments about some optimizations.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: document the preconditions of
+	copy_data_from().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: add assertion in copy_data_from().
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	is_before_begin() methods.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: remove unnecessary include for
+	iostream.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.templates.hh, src/Makefile.am, src/PIP_Problem.cc,
+	src/PIP_Tree.cc, src/Row_Flags.cc, src/Row_Flags.defs.hh,
+	src/Row_Flags.inlines.hh, src/Row_Flags.types.hh,
+	src/Sparse_Row.defs.hh, tests/Sparse_Matrix/sparsematrix1.cc: Move
+	Dense_Row::Flags out of Row class, renaming it as Row_Flags.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	src/Bit_Matrix.cc, src/Congruence.cc, src/Congruence.defs.hh,
+	src/Congruence.inlines.hh, src/Congruence_System.cc,
+	src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	src/Constraint.cc, src/{Matrix.cc => Dense_Matrix.cc},
+	src/{Matrix.defs.hh => Dense_Matrix.defs.hh},
+	src/{Matrix.inlines.hh => Dense_Matrix.inlines.hh},
+	src/{Row.types.hh => Dense_Matrix.types.hh}, src/{Row.cc =>
+	Dense_Row.cc}, src/{Row.defs.hh => Dense_Row.defs.hh},
+	src/{Row.inlines.hh => Dense_Row.inlines.hh}, src/{Row.templates.hh
+	=> Dense_Row.templates.hh}, src/{Matrix.types.hh =>
+	Dense_Row.types.hh}, src/Generator.defs.hh, src/Grid.defs.hh,
+	src/Grid_Generator.cc, src/Grid_Generator_System.cc,
+	src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	src/MIP_Problem.templates.hh, src/Makefile.am, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	src/Sparse_Row.defs.hh, tests/Polyhedron/Makefile.am,
+	tests/Polyhedron/{matrix1.cc => densematrix1.cc},
+	tests/Polyhedron/memory2.cc, tests/Sparse_Matrix/sparsematrix1.cc: 
+	Rename Row and Matrix into Dense_Row and Dense_Matrix.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	src/Makefile.am, src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+	src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.templates.hh,
+	src/Unlimited_Sparse_Row.types.hh: Sparse_Row: merge with
+	Unlimited_Sparse_Row and remove the Unlimited_Sparse_Row class.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh: Sparse_Matrix:
+	remove remaining references to Unlimited_Sparse_Row.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Sparse_Row.templates.hh,
+	src/Sparse_Row.types.hh: Remove the Sparse_Row_Reference class.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Matrix.defs.hh,
+	src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/Sparse_Matrix.defs.hh: Matrix, Sparse_Matrix: remove rendundant
+	typedefs. Don't use such typedefs in MIP_Problem, PIP_Problem and
+	PIP_Tree.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh: Sparse_Matrix: change the type of the
+	rows from Unlimited_Sparse_Row to Sparse_Row.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+	external_memory_in_bytes() method.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+	delete_element_and_shift() and add_zeroes_and_shift() methods.
+
+2010-08-18  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row: add
+	a reset() method that takes an index.
+
+2010-08-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.cc, src/Dense_Matrix.defs.hh,
+	src/Dense_Matrix.inlines.hh, src/Dense_Matrix.types.hh,
+	src/Dense_Row.cc, src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Dense_Row.types.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/MIP_Problem.templates.hh,
+	src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh, src/Row.cc, src/Row.defs.hh,
+	src/Row.inlines.hh, src/{Dense_Row.templates.hh =>
+	Row.templates.hh}, src/Sparse_Matrix.cc, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh,
+	tests/Sparse_Matrix/sparsematrix1.cc: Many changes, mainly the merge
+	of Row with Dense_Row and Matrix with Dense_Matrix: * Merge Dense_Row into Row * Merge Dense_Matrix into Matrix * Handle flags in Unlimited_Sparse_Row and Sparse_Row
+
+2010-08-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Row.defs.hh: Row: remove friend declaration in Flags.
+
+2010-08-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Make
+	Doxygen process documentation of CO_Tree, Unlimited_Sparse_Row,
+	Sparse_Row, Sparse_Matrix, Dense_Row and Dense_Matrix.
+
+2010-08-17  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+	Unlimited_Sparse_Row, Sparse_Row, Sparse_Matrix: fix math
+	expressions in Doxygen comments.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.cc, src/Dense_Row.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh: Dense_Row: derive from Row instead of
+	containing a private Row object.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.defs.hh: Use 'where * is' instead of 'with
+	*' when commenting math formulas in Doxygen comments.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: compute external
+	memory handled by Coefficient objects in external_memory_in_bytes().
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: remove
+	for_each_nonzero() methods.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: 
+	Sparse_Row_Reference: remove for_each_nonzero() methods.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh: 
+	Sparse_Matrix: remove for_each_row() methods.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+	for_each_nonzero() methods.
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: don't use for_each_nonzero() in
+	process_pending_constraints()
+
+2010-08-16  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+	Unlimited_Sparse_Row, Sparse_Row, Sparse_Row_Reference,
+	Sparse_Matrix: document time complexity of all methods.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.defs.hh: CO_Tree, Sparse_Row,
+	Unlimited_Sparse_Row: document that hint iterators must be valid and
+	point to that object.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	the reset() method that takes two dimension_type arguments, it's
+	rendundant and unused.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: 
+	Sparse_Row_Reference: remove the reset() method that takes two
+	dimension_type arguments, it's rendundant and unused.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	unused and rendundant methods: assign() and assign_if_nonzero().
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+	Sparse_Row_Reference: remove unused and rendundant methods: assign()
+	and assign_if_nonzero().
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/Sparse_Matrix/Makefile.am,
+	tests/Sparse_Matrix/sparserow1.cc: tests/Sparse_Matrix: add
+	sparserow1 test.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.defs.hh, src/Sparse_Matrix.defs.hh: Dense_Matrix,
+	Sparse_Matrix: update permute_columns() documentation to match the
+	one in Matrix.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* : Merge remote branch 'origin/master' into sparse_matrices
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.inlines.hh: Sparse_Matrix: allow passing a row
+	of the same matrix to add_row().
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.defs.hh, src/Sparse_Matrix.inlines.hh: 
+	Sparse_Matrix::iterator: add operator=(), operator==() and
+	operator!=().
+
+2010-08-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.defs.hh: Improved doxygen docs for
+	Matrix::permute_columns().
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: add more tests.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: remove follow_{left,right}_childs() methods.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: remove comparison operators with an
+	iterator.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: fix style of Doxygen comment.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: remove before-beginning state from iterator and
+	const_iterator.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: add constructor from a tree and an index.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+	is_before_begin() methods.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	before_begin() methods and update documentation.
+
+2010-08-15  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+	Sparse_Row_Reference: remove before_begin() methods and update
+	documentation.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: add more tests.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: simplify the insert() method.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: make the
+	precondition of rebuild_smaller_tree() stronger.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make the
+	precondition of redistribute_elements_in_subtree() stronger.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make the
+	precondition of compact_elements_in_the_rightmost_end() stronger.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: make assertion stronger, in rebalance().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove
+	least_common_ancestor().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: don't use least_common_ancestor() in
+	erase().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use clear() in erase().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: turn always-false condition into
+	assertion.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: CO_Tree: add some tests.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove the
+	constructor from an std::vector.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	the constructor from an std::vector.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row:
+	remove the constructor from an std::vector.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: avoid warning in release mode.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: avoid warnings in release mode.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row, Sparse_Row_Reference: make
+	OK() methods private.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: document return value of
+	bisect_near() when the tree is empty.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.cc: Unlimited_Sparse_Row: remove FIXME.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: optimize update_solution().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+	optimize code, in generate_cut() (#3).
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+	optimize code, in generate_cut() (#2).
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+	optimize code, in generate_cut().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: optimize generate_cut() (#2).
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: optimize generate_cut() (#1).
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: simplify code in solve().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: optimize the solve() method.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+	simplify code in solve() (#2).
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef and
+	simplify code in solve().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: simplify code in solve().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node: remove unused #ifdef(s) and
+	simplify code, in update_tableau().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree_Node: improve indentation and code
+	readability in compatibility_check().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree_Node: remove unused #ifdef in
+	compatibility_check().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node::Tableau: optimize and simplify
+	code in is_better_pivot().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Solution_Node::Tableau: simplify code in
+	scale().
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: optimize
+	process_pending_constraints() for sparse matrices.
+
+2010-08-14  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove unused variable.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree_Node: turn always-true if condition into
+	assertion, in add_constraint().
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree.cc: rename some types used in
+	compatibility_check_find_pivot().
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree.cc: rename some types used in
+	compatibility_check_find_pivot_in_set().
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree.cc: optimize
+	find_lexico_minimum_column() for sparse matrices.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree.cc: remove variable that is unused in
+	release mode, in find_lexico_minimum_column_in_set().
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree.cc: call reset() when needed, in
+	complement_assign().
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: add a
+	reset() method taking an iterator.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree.cc: optimize merge_assign() for sparse
+	matrices.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Problem.cc: PIP_Problem: optimize solve() for sparse
+	matrices.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: fix indentation.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove unused code.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: remove unneeded variable.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: allow
+	every value of (unused) hint iterators.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Matrix.defs.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.defs.hh, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	src/Sparse_Matrix.defs.hh: Move conditional typedefs from PIP_Tree,
+	PIP_Problem and MIP_Problem into Dense_Matrix and Sparse_Matrix.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc: Sparse_Matrix: use
+	Unlimited_Sparse_Row::clear() in the ascii_load() method.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+	Sparse_Row_Reference: add the clear() method.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: add the
+	clear() method.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add the
+	clear() method.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+	Sparse_Matrix, Sparse_Row, Sparse_Row_Reference,
+	Unlimited_Sparse_Row: change the Doxygen documentation to follow the
+	PPL coding standards.
+
+2010-08-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, src/Interval.templates.hh, tests/Box/cc76widening.cc: 
+	Corrected a bug affecting Interval::CC76_widening_assign(const
+	From&, Iterator, Iterator).  This, in turn, affected
+	Box::CC76_widening_assign(const T&, Iterator, Iterator): lower bound
+	would not be computed correctly when the two iterators specify an
+	empty list of stop points.  Many thanks to Sagar Chaki and Arie
+	Gurfinkel.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.defs.hh: Sparse_Matrix: document all methods and
+	fields.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.inlines.hh: Sparse_Matrix: indentation fixes.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.inlines.hh: Sparse_Matrix: move some code.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc: Sparse_Matrix: optimize the OK() method.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc: Sparse_Matrix: use iterators instead of
+	indexes in external_memory_in_bytes().
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc: Sparse_Matrix: improve code readability
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	typedef for This, fix indentation
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+	Sparse_Row_Reference: add before_cbegin(), cbegin() and cend()
+	methods, return const& in before_begin() and end() methods, add
+	documentation.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: add
+	before_cbegin(), cbegin() and cend() methods.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+	before_cbegin(), cbegin() and cend() methods.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc: Sparse_Row, Sparse_Row_Reference: optimize OK()
+	methods.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row_Reference: add documentation of
+	the class itself.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.inlines.hh: Sparse_Row: optimize the resize()
+	method.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.cc, src/Sparse_Row.inlines.hh: Sparse_Row,
+	Sparse_Row_Reference: don't inline OK() methods.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh: Sparse_Row, Sparse_Row_Reference: document
+	all methods and fields.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: clarify
+	comments.
+
+2010-08-13  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: fix compiling error in release
+	mode.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.templates.hh: Sparse_Row: add unnecessary include,
+	to please KDevelop4.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row:
+	remove unnecessary code in combine().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: pass
+	a hint to find_create() in combine_needs_second().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row:
+	simplify code in the assign() method.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: add a little
+	optimization in reset().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row:
+	optimize the reset() method.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: make
+	code in all find() and lower_bound() methods similar.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: don't
+	using invalidated iterators in swap().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row:
+	indentation fixes.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: document
+	all methods and the tree field.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh: Unlimited_Sparse_Row: remove
+	unnecessary include.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: add comment on maximum row size.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: clarify comments.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree::tree_iterator: add assertions.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree::const_iterator: fix assertion in
+	operator++().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: indentation fixes.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: simplify some
+	code.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: always increase the tree size in
+	insert_precise() instead of rebalance().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: improve some
+	comments.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: simplify code in rebuild_bigger_tree().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: simplify code in increase_keys_after().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: optimize erase_element_and_shift_left().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: simplify code in the insert() methods.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: fix bug in constructor.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: fix comment.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: optimize constructor.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: move some code.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree::iterator,
+	CO_Tree::const_iterator: add postfix ++ and postfix -- operators.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: fix comment.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: inline
+	insert_in_empty_tree(), un-inline least_common_ancestor().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: improve comments.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree, CO_Tree::const_iterator: change the
+	value_type definition.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: now go_down_searching_key() is a method of
+	CO_Tree::tree_iterator instead of CO_Tree.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: rename
+	redistribute_elements_in_subtree_helper() into
+	redistribute_elements_in_subtree().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: improve comment.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: update documentation with the new
+	constants' names.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: merge the
+	redistribute_elements_in_subtree() method into rebalance().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: simplify code in rebalance().
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make the OK() method
+	private.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	the OK() method.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.inlines.hh: Sparse_Row, Sparse_Row_Reference: don't
+	call Unlimited_Sparse_Row::OK() in the OK() methods.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Matrix.cc: Sparse_Matrix: don't call
+	Unlimited_Sparse_Row::OK() in the OK() method.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: don't use float/double for densities, use exact
+	calculations instead.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: sort method
+	implementations in the same order as method declarations.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: fix typo in comment.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: remove
+	unnecessary includes.
+
+2010-08-12  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: add check on reserved_size in
+	structure_OK().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree::iterator: fix constructor
+	documentation.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree::iterator, CO_Tree::const_iterator:
+	make Member_Access_Helper and Const_Member_Access_Helper private,
+	add documentation.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: rewrite most of the documentation,
+	add documentation.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree::const_iterator: make
+	Const_Member_Access_Helper private, add documentation.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: add compile-time check for height_t.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: improve code readability and adjust stack
+	size in redistribute_elements_in_subtree_helper().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: improve readability of move_data_from().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: improve code readability and adjust stack
+	size, in the constructor from an std::vector.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: optimize increase_keys_after().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: fix bug in increase_keys_after().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: use
+	the new contract of end() to avoid calculations of end() at each
+	write operation.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: clarify
+	code in reset() and reset_after().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	PPL_DIRTY_TEMP_COEFFICIENT when possible.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use the
+	same signature and contract used in CO_Tree for before_begin() and
+	end(). Add documentation for begin() methods.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: add
+	before_begin() methods.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	bisect() instead of bisect_in() when needed.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.cc: Unlimited_Sparse_Row: fix
+	indentation.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: improve readability of bisect_near().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: improve documentation of bisect()
+	methods.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: remove always-true condition in
+	erase().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: improve readability of erase().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: fix external_memory_in_bytes().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: weaken the
+	requirements for bisect_near() methods.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add bisect()
+	methods.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree::tree_iterator: optimize
+	follow_{left,right}_childs_with_value() methods.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: remove get_left_child_value() and
+	get_right_child_value().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: don't use get_left_child_value() and
+	get_right_child_value().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: don't use get_left_child_value() and
+	get_right_child_value() in erase().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: don't use get_left_child_value() and
+	get_right_child_value() without a real need, in rebalance().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: remove assertion from
+	count_used_in_subtree(), weakening its precondition.
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add swap()
+	method to iterator and const_iterator, specialize std::swap().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: add assertion in move_data_from().
+
+2010-08-11  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: cache before_begin() and end() iterators, so users of
+	CO_Tree don't need to recalculate them at each write operation
+	anymore.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: move iterator's and const_iterator's
+	declarations inside the CO_Tree class declaration.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use Coefficient_zero() in erase(),
+	instead of declaring an equivalent static variable.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use the
+	value returned by CO_Tree::erase() when needed.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: add least_common_ancestor() method. Return an iterator to
+	the next element in erase().
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't check the value
+	returned by erase().
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: add debugging checks to iterator and const_iterator.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make
+	count_used_in_subtree() take an iterator parameter by value instead
+	of by reference.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make
+	redistribute_elements_in_subtree() take an iterator parameter by
+	value instead of by reference.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: make rebalance()
+	return an iterator instead of taking an iterator parameter by
+	reference.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: make go_down_searching_key() return an iterator instead of
+	taking an iterator parameter by reference.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: make insert_precise return an iterator instead of taking an
+	iterator parameter by reference.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: replace has_parent() method with is_root().
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: keep a CO_Tree& instead of a CO_Tree* const.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: define height_t as unsigned.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: depth() now returns a height_t instead of an
+	unsigned.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: avoid compiler warning in release mode.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+	the get2() method.
+
+2010-08-10  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.inlines.hh: Sparse_Row: add include. It is needed
+	for release builds.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: un-inline
+	bisect_in() and bisect_near() methods.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: bisect_in() and
+	bisect_near() methods now take an index as argument instead of a
+	functor.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: un-inline some
+	methods.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: reorder
+	some method declarations and definitions.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	the wrappers for CO_Tree's iterator and const_iterator. They do not
+	add anything useful anymore.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: add STL-compliant typedefs in
+	iterator and const_iterator.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: iterators no
+	longer allow changing an element's key.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: move
+	implementation of delete_element_and_shift() and
+	add_zeroes_and_shift() into CO_Tree.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree::const_iterator: remove the
+	get_tree() declaration.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: rewrite the
+	implementation of const_iterator and iterator to improve
+	performance.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: remove some calls to iterators'
+	is_before_begin() and is_at_end() methods.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: don't
+	use is_before_begin() and is_at_end() methods on CO_Tree iterators.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	get_tree() methods from iterator and const_iterator.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: iterator needs not be friend of
+	tree_iterator anymore.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree::tree_iterator: don't access
+	iterators' fields directly.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree::tree_iterator: add a CO_Tree& argument in the constructor
+	from an iterator.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: iterator and const_iterator need not
+	be friends of CO_Tree anymore.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: don't access iterator's and
+	const_iterator's fields directly.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	construct_before_begin() and construct_end() methods.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: don't use
+	construct_before_begin() and construct_end().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+	two-argument constructors to const_iterator and iterator.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: turn always-true if conditions in
+	iterator's and const_iterator's operator++() and operator--() into
+	an assertion.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Unlimited_Sparse_Row.inlines.hh, tests/CO_Tree/cotree1.cc: 
+	CO_Tree: rename iterator's and const_iterator's get_next_value()
+	into operator++() and get_previuos_value() into operator--().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	operator++() and operator--() from iterator and const_iterator.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use CO_Tree::begin() instead of
+	CO_Tree::before_begin(), in OK() and structure_OK().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: avoid a (possibly dangerous)
+	conversion in the static initializer of unused_index.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	CO_Tree::begin() instead of CO_Tree::before_begin().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't use
+	CO_Tree::before_begin().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: check the size in OK(), not in
+	structure_OK().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't use
+	CO_Tree::iterator::operator++().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: CO_Tree, Unlimited_Sparse_Row:
+	split the iterator and const_iterator main constructor. CO_Tree:
+	make the iterator and const_iterator constructor make the new
+	iterator point to the first value, and add the begin() methods to
+	CO_Tree.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: clarify signature of
+	redistribute_elements_in_subtree_helper() and
+	compact_elements_in_the_rightmost_end(). Remove obsolete assertions
+	from redistribute_elements_in_subtree().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove rendundant
+	arguments from redistribute_elements_in_subtree_helper(), remove
+	unreachable code in redistribute_elements_in_subtree().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: optimize
+	compact_elements_in_the_rightmost_end().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: use a dimension_type
+	instead of an iterator in redistribute_elements_in_subtree() and
+	compact_elements_in_the_rightmost_end().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: use a dimension_type
+	instead of an iterator in redistribute_elements_in_subtree_helper().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	depth() method from iterator and const_iterator.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: add assertions in
+	erase(iterator).
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: add assertion and comment in
+	go_down_searching_key().
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	unused insert(tree_iterator, dimension_type, const data_type&)
+	method.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: update documentation on requirements
+	of insert(iterator, dimension_type).
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: optimize insert(iterator,
+	dimension_type, const data_type&) and insert(iterator,
+	dimension_type) methods.
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: weaken the
+	preconditions to insert(iterator, dimension_type, const data_type&).
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: improve implementation of
+	insert(dimension_type, const data_type&).
+
+2010-08-09  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: avoid magic number in insert().
+
+2010-08-08  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: don't use an iterator in
+	move_data_from().
+
+2010-08-08  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: simplify code in the init() method.
+
+2010-08-08  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: use new/delete
+	instead of malloc/free.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	tree-related methods from iterator and const_iterator.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree:: don't use follow_right_childs() in
+	redistribute_elements_in_subtree().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* tests/CO_Tree/cotree1.cc: tests/CO_Tree: don't visit the tree
+	using an iterator.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: many
+	changes, preparing removal of tree-related methods from iterator and
+	const_iterator.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+	iterator in insert(dimension_type, const data_type&).
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of a
+	const_iterator in structure_OK().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree:
+	dump_subtree() now takes a tree_iterator as argument, instead of an
+	iterator& or a const_iterator&.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: don't use
+	follow_right_childs_with_value() in
+	compact_elements_in_the_rightmost_end().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	go_down_searching_key() overloads for iterator and const_iterator
+	arguments.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+	iterator in insert_precise().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	lower_bound() methods.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	find() instead of go_down_searching_key() in get().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	bisect_in() instead of go_down_searching_key() in assign().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	bisect_in() instead of go_down_searching_key() in swap().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: rename
+	the helper class used as a functor and move it to the beginning of
+	the file.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	find2() and get2() methods.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row,
+	Sparse_Row_Reference: remove get2() methods.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc: PIP_Tree: use two calls to get() instead of
+	get2().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.cc: MIP_Problem: use two calls to get() instead of
+	get2().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	CO_Tree::bisect_near() in lower_bound() methods with a hint
+	iterator.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	CO_Tree::bisect_near() in find() methods with a hint iterator.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+	bisect_near() methods.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	CO_Tree::bisect_in() in lower_bound().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	always-false conditions from find().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: fix bisect_in().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.inlines.hh: CO_Tree: remove obsolete comment.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	CO_Tree::bisect_in() in the const version of find().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: fix the
+	non-const version of find().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: make the
+	private bisect_in() a const method, fix a bug in it and add a public
+	bisect_in() for const iterators.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: inline
+	bisect_in(), to allow optimizations.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: use
+	CO_Tree::bisect_in() in find().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: add bisect_in() methods.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh: CO_Tree: remove the
+	const_iterator version of count_used_in_subtree().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: use tree_iterator instead of iterator when needed.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.inlines.hh: CO_Tree: split
+	insert_in_empty_tree() out of insert_precise().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+	iterator in move_data_from().
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc: CO_Tree: use a tree_iterator instead of an
+	iterator in the constructor from a vector.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: add
+	tree_iterator inner class.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: split integer base-2 log out of init(), adding the
+	integer_log2() method.
+
+2010-08-07  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: remove unneeded include.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Sparse_Matrix.cc, src/Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Indentation and whitespace
+	fixes.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: remove duplicated
+	forward-declarations of iterator and const_iterator.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Dense_Row, Sparse_Row,
+	Unlimited_Sparse_Row: use names like i and j for index arguments,
+	rather that c, c1 and c2.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.cc, src/Dense_Row.defs.hh,
+	src/Dense_Row.inlines.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Matrix.inlines.hh, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Dense_Row, Sparse_Row,
+	Sparse_Matrix, Unlimited_Sparse_Row: Remove the useless const
+	qualifier from dimension_type arguments passsed by value.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/MIP_Problem.cc, src/PIP_Tree.cc, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row,
+	Sparse_Row, Dense_Row: reorder arguments in find(), lower_bound(),
+	find_create() as done in the STL.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: reorder arguments to
+	insert(), using the same order as in std::map<T>::insert().
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh, tests/CO_Tree/cotree1.cc: 
+	CO_Tree: rename inorder_iterator and inorder_const_iterator into
+	iterator and const_iterator.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/Sparse_Matrix.defs.hh,
+	src/Sparse_Row.defs.hh, src/Unlimited_Sparse_Row.defs.hh: CO_Tree,
+	Unlimited_Sparse_Row, Sparse_Row, Sparse_Matrix: make some
+	constructors explicit.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh: CO_Tree: remove level_data struct.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: CO_Tree: remove
+	unordered iterators.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.cc, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.templates.hh: Unlimited_Sparse_Row: remove
+	unordered iterators.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh: Sparse_Row:
+	remove unordered iterators.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh: Dense_Row: remove
+	unordered iterators.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/MIP_Problem.defs.hh: MIP_Problem: don't use unordered
+	iterators.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh: PIP_Problem: don't
+	use unordered iterators.
+
+2010-08-06  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: PIP_Tree: don't use
+	unordered iterators.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: CO_Tree: simplify some method
+	signatures, exploiting the fact that now iterators are always
+	lightweight.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/CO_Tree.cc, src/CO_Tree.defs.hh, src/CO_Tree.inlines.hh: 
+	CO_Tree: remove the VeB and BFS layouts.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: merge
+	{find,lower_bound}_helper methods into the corresponding find and
+	lower_bound methods.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Unlimited_Sparse_Row.inlines.hh: Unlimited_Sparse_Row: remove
+	unused find_create_helper() methods.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/MIP_Problem.cc, src/PIP_Problem.cc, src/PIP_Tree.cc,
+	src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.templates.hh: Dense_Row, Sparse_Row,
+	Unlimited_Sparse_Row: drop
+	{find,find_create,lower_bound}_{assign,hint_assign} methods.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Dense_Row.inlines.hh,
+	src/Sparse_Row.defs.hh, src/Sparse_Row.inlines.hh,
+	src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Dense_Row, Sparse_Row,
+	Unlimited_Sparse_Row: remove some method overloads that are no
+	longer needed.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Dense_Row.defs.hh, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh, src/Unlimited_Sparse_Row.defs.hh,
+	src/Unlimited_Sparse_Row.inlines.hh: Remove dangerous_iterator: it
+	was needed only for compatibility with some old sparse
+	implementations.
+
+2010-08-05  Marco Poletti <poletti.marco at gmail.com>
+
+	* src/Makefile.am, src/Sparse_Row.defs.hh,
+	src/Sparse_Row.inlines.hh,
+	src/{Unlimited_Sparse_Row_Over_CO_Tree.cc =>
+	Unlimited_Sparse_Row.cc}, src/Unlimited_Sparse_Row.defs.hh,
+	src/{Unlimited_Sparse_Row_Over_CO_Tree.inlines.hh =>
+	Unlimited_Sparse_Row.inlines.hh},
+	src/{Unlimited_Sparse_Row_Over_CO_Tree.templates.hh =>
+	Unlimited_Sparse_Row.templates.hh},
+	src/Unlimited_Sparse_Row.types.hh,
+	src/Unlimited_Sparse_Row_Custom_Slist_Backend.cc,
+	src/Unlimited_Sparse_Row_Custom_Slist_Backend.defs.hh,
+	src/Unlimited_Sparse_Row_Custom_Slist_Backend.inlines.hh,
+	src/Unlimited_Sparse_Row_Custom_Slist_Backend.types.hh,
+	src/Unlimited_Sparse_Row_Over_CO_Tree.defs.hh,
+	src/Unlimited_Sparse_Row_Over_CO_Tree.types.hh,
+	src/Unlimited_Sparse_Row_Over_Linear_Sequence.cc,
+	src/Unlimited_Sparse_Row_Over_Linear_Sequence.defs.hh,
+	src/Unlimited_Sparse_Row_Over_Linear_Sequence.inlines.hh,
+	src/Unlimited_Sparse_Row_Over_Linear_Sequence.templates.hh,
+	src/Unlimited_Sparse_Row_Over_Linear_Sequence.types.hh,
+	src/Unlimited_Sparse_Row_Std_List_Backend.cc,
+	src/Unlimited_Sparse_Row_Std_List_Backend.defs.hh,
+	src/Unlimited_Sparse_Row_Std_List_Backend.inlines.hh,
+	src/Unlimited_Sparse_Row_Std_List_Backend.types.hh,
+	src/Unlimited_Sparse_Row_Std_Vector_Backend.cc,
+	src/Unlimited_Sparse_Row_Std_Vector_Backend.defs.hh,
+	src/Unlimited_Sparse_Row_Std_Vector_Backend.inlines.hh,
+	src/Unlimited_Sparse_Row_Std_Vector_Backend.types.hh: Drop sparse
+	implementations based on std::list, on std::vector and on the
+	custom-implemented single-linked list.
+
+2010-08-05  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.templates.hh: Invalid case option in map_space_dimensions
+	removed.
+
+2010-08-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Float.templates.hh: Small style improvement in the use of
+	iterators.
+
+2010-08-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4: Added a space after :: to avoid Doxygen
+	(incorrect) autolink generation.
+
+2010-08-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java: 
+	Corrected mismatch in parameter name (for documentation purposes
+	only).
+
+2010-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit b68f8ff2bde57db64ec4439d8a2592da351742e4 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Thu Aug 5 09:08:44 2010 +0200
+
+2010-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-08-03  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* CREDITS: Updated and typo fixed.
+
+2010-08-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Float.defs.hh, src/Float.inlines.hh, src/Float.templates.hh,
+	src/Linear_Form.templates.hh: Do not use log2 to compute the base 2
+	logarithm of an integer.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh: Added missing conversions.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+        * Makefile.am, README, Watchdog/Makefile.am, Watchdog/README: 
+        Distribute all READMEs and ChangeLogs.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+        * ChangeLog: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Announce the new wrapping operator used to approximate
+	machine arithmetic.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, NEWS, TODO, Watchdog/NEWS: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, Watchdog/README: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_pips/ppl_pips.1, doc/libppl.3, doc/libppl_c.3,
+	doc/ppl-config.1: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Missing sections added.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/config.guess, config.guess: Updated.
+
+2010-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh, src/Grid_public.cc: FIXMEs resolved.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/constraintsproduct1.cc: Commented
+	out code concerning affine spaces.
+
+2010-08-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc: Avoid variable length arrays: use a
+	std::vector instead.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc: Commented out code concerning affine spaces.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh: Commented out code concerning affine spaces.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, src/Affine_Space.defs.hh, src/Makefile.am: Set aside the
+	domain of affine spaces, for the time being.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh: Implemented the constructors from
+	generator systems.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh, src/Grid_public.cc: Inclusions fixed.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc: Useless assignment removed.
+
+2010-08-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.defs.hh: Comment fixed.
+
+2010-08-01  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval_Restriction.defs.hh: Removed spurious semicolon.
+
+2010-07-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.defs.hh, src/Interval.templates.hh: Moved two methods
+	in the right place.
+
+2010-07-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh: Unwanted assertions removed.
+
+2010-07-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh: Fixed a bug in
+
+	DB_Row_Impl_Handler<T>::Impl::expand_within_capacity(dimension_type).This affected only compilers not supporting flexible arrays.
+
+2010-07-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh: Fixed a bug in
+	DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+	U&).  This prevented compilation with compilers not supporting
+	flexible arrays.
+
+2010-07-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.templates.hh: Added missing inclusion.
+
+2010-07-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-06-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: Improved
+	specification and implementation of erase_artificials().
+
+2010-06-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Use PPL_ASSERT() instead of plain assert().
+
+2010-06-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: Improved MIP_Problem
+	preprocessing phase and solved an efficiency bug.  Rewritten private methods parse_constraints(),
+	merge_split_variable() and process_pending_constraints():
+	specification clarified and implementation improved to avoid
+	allocating more tableau rows and columns than needed.  This results
+	in an overall speedup, in particular when solving problems
+	incrementally.
+
+2010-06-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	Watchdog/ltmain.sh, Watchdog/m4/libtool.m4,
+	Watchdog/m4/ltoptions.m4, Watchdog/m4/ltversion.m4,
+	Watchdog/m4/lt~obsolete.m4, config.guess, config.sub, install-sh,
+	ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4,
+	m4/lt~obsolete.m4: Updated from Libtool 2.2.10.
+
+2010-06-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh: Added missing argument names.
+
+2010-06-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac, doc/definitions.dox, doc/devref.doxyconf-html.in,
+	doc/devref.doxyconf-latex.in, src/BD_Shape.defs.hh,
+	src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	src/Box.defs.hh, src/Box.templates.hh,
+	src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.inlines.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Cast_Floating_Point_Expression.types.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Constant_Floating_Point_Expression.types.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Difference_Floating_Point_Expression.types.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.types.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.types.hh, src/Linear_Form.cc,
+	src/Linear_Form.defs.hh, src/Linear_Form.inlines.hh,
+	src/Linear_Form.templates.hh, src/Linear_Form.types.hh,
+	src/Makefile.am,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.types.hh,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.types.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.types.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.types.hh,
+	tests/Floating_Point_Expression/.gitignore,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape1.cc,
+	tests/Floating_Point_Expression/bdshape2.cc,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/linearform1.cc,
+	tests/Floating_Point_Expression/octagonalshape1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc,
+	tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc,
+	tests/Floating_Point_Expression/run_tests, tests/Makefile.am,
+	tests/ppl_test.hh: Put aside changes related to Floating_Point and
+	Linear_Form classes.  These will not enter release 0.11.
+
+2010-05-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Moved Katy Dobson to the list of past contributors.
+
+2010-05-07  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/compiler.hh: Fixed comment.
+
+2010-05-07  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.inlines.hh: Removed current implementation of
+	PPL_{LT,GT}_SILENT: the cure was worse than the disease.
+
+2010-05-07  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh: Avoid
+	temporary in smod_2exp.
+
+2010-05-07  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/compiler.hh: Better/canonical way to avoid gcc warning.
+
+2010-05-04  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh: Revert "Optimized
+	smod_2exp_signed_int." This reverts commit 21d120a07448821720acd415213f9b08a9a14338.
+
+2010-05-04  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh: Optimized smod_2exp_signed_int.
+
+2010-04-17  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh: Refuse to compile on (very obsolete)
+	architectures that are not using two's complement.
+
+2010-04-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Partial_Function.cc, src/Partial_Function.defs.hh,
+	src/Partial_Function.inlines.hh, src/Partial_Function.types.hh: Put
+	under git control.
+
+2010-04-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl, src/Affine_Space.defs.hh,
+	src/Any_Pointset.defs.hh, src/BD_Shape.defs.hh, src/Box.defs.hh,
+	src/Grid.defs.hh, src/Makefile.am, src/Octagonal_Shape.defs.hh,
+	src/Polyhedron.defs.hh, tests/Makefile.am,
+	tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+	tests/Partial_Function.inlines.hh, tests/Partial_Function.types.hh,
+	tests/ppl_test.cc, tests/ppl_test.hh: Added class Partial_Function
+	to the PPL library.  Java, Prolog and OCaml interfaces now use an
+	object of this Partial_Function class when mapping the space
+	dimensions of teh vector space.  Some of the consistency checks that
+	were performed by other variants of Partial_Function are now only
+	done when in debugging mode.
+
+2010-04-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc: Fixed expected results for
+	tests/Octagonal_Shape/writeoctagon1.cc
+
+2010-04-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/Test_Partial_Function.java,
+	interfaces/Java/tests/ppl_java_tests_common: Use a C++ object to
+	encode a Partial_Function in the Java interface.  Current
+	implementation is based on a copy of the Partial_Function type used
+	in C++ tests: we should consider whether or not it would be
+	appropriate to have this Partial_Function type as a first class PPL
+	object.
+
+2010-04-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-04-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	interfaces/Java/tests/Test_Partial_Function.java: Modified signature
+	of method maps() in Java Partial_Function interface.  Modified test
+	implementation in tests/Test_Partial_Function.java accordingly (note
+	though that TreeMap still uses Long objects).
+
+2010-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: Fixed
+	the printing of equality constraints.
+
+2010-04-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-04-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Added $(noinst_HEADERS) to BUILT_SOURCES so as to
+	build ppl.hh early when !BUILD_CXX_INTERFACE.  (Thanks to Ralf
+	Wildenhues who identified the problem and to Sebastian Pop who
+	reported a parallel build failure due to it.)
+
+2010-04-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/XSB/xsb_pl_check.P,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_sysindep_dox: Properly document
+	ppl_Coefficient_bits/1.
+
+2010-04-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P: Corrected a few typos.
+
+2010-04-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4: Corrected
+	typo causing a bug in the XSB Prolog interface.
+
+2010-04-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.templates.hh: 
+	Add method wrap_assign() to Pointset_Powerset.
+
+2010-04-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_public.cc: A minor stylistic improvement and a typo
+	corrected.
+
+2010-04-16  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/intervals.defs.hh: Silenced warnings.
+
+2010-04-15  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/expected_pchk_int8,
+	interfaces/Prolog/tests/expected_pchk_int8_a: A Prolog PIP_Problem
+	test overflows positively for checked_int8
+
+2010-04-15  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Added tests in the Prolog interface for
+	ppl_all_affine_quasi_ranking_functions_MS_*
+
+2010-04-15  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P: Added PIP_Problem predicates
+	to list of predicates tested in pl_check.pl.
+
+2010-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Updated.
+
+2010-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit e17e80c8940b435d646eaac97bba591ee744ef34 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Thu Apr 15 17:39:08 2010 +0200
+
+2010-04-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.defs.hh, src/termination.templates.hh,
+	tests/Polyhedron/termination2.cc: Minor improvements to
+	documentation.  Deal with the special cse of an empty input pointset
+	for methods all_affine_*.  Adapted and improved test10 in
+	termination2.cc.
+
+2010-04-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/test1.ml: Overflow is expected for
+	PIP_Problem tests with 8 bits coefficients.
+
+2010-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am: Increased GLOBALSZ for the
+	execution of the automatically generated test.
+
+2010-04-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/tests/PIP_Problem_test1.java,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Add
+	ppl_Coefficient_bits to Prolog and OCaml interfaces.  Renamed
+	corresponding static method in Java interface.
+
+2010-04-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* instchk.hh, interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/ppl_interface_generator_common_dat.m4: Allow for the
+	Shape_Preserving_Product to be generated in the interfaces.
+
+2010-04-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Fixed a bug in the
+	all_affine_ranking_functions*_Grid* tests in Prolog interface.
+
+2010-04-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/termination2.cc: Some tests now succeed even on
+	initially empty polyhedra.
+
+2010-04-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: Corrected typo in shift_unprimed_variables().
+
+2010-04-13  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4, tests/Polyhedron/Makefile.am,
+	tests/Polyhedron/termination1.cc, tests/Polyhedron/termination2.cc: 
+	Added further tests for the termination methods.
+
+2010-04-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: Avoid assertion crash on universe polyhedra.
+
+2010-04-13  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Fixed some bugs in the tests for
+	drop_some_non_integer_points() and added a test for
+	termination_test_*.
+
+2010-04-12  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4, src/termination.cc, tests/Polyhedron/termination1.cc: 
+	Added tests to the OCaml interface for new functions wrap_assign(),
+	drop_some_non_integer_points() and termination_test_*.  Bug in
+	termination_test_*. fixed and test showing these added to
+	termination1.cc
+
+2010-04-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/tests/PIP_Problem_test1.java: Added static method
+	Coefficient.ppl_bits() to Java interface.  test04 in
+	PIP_Problem_test1.java overflows when using 8-bit checked integers.
+	Fixed method PIP_TREE_Node.toString().
+
+2010-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc: 
+	test01() and test03() always succeed.
+
+2010-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Added an entry for the new functionality concerning the
+	synthesis of linear (quasi-) ranking functions.
+
+2010-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Worked around a Doxygen bug.
+
+2010-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.defs.hh: Cite BMPZ10.
+
+2010-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Bibliography updated.
+
+2010-04-10  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc: Added
+	                                    drop_some_non_integer_points(const Variables_Set& vars,
+	Complexity_Class complexity                                     = ANY_COMPLEXITY)
+
+2010-04-10  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc: Added
+	drop_some_non_integer_points() to the product domain
+
+2010-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh: Trailing whitespace removed.
+
+2010-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Variable hiding avoided.
+
+2010-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Added a point about the new drop_some_non_integer_points()
+	methods.
+
+2010-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Tentative release date is May 8, 2010.  Reorganized and
+	improved some news items.
+
+2010-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_pips/ppl_pips.1, doc/ppl-config.1: Man pages updated.
+
+2010-04-09  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Cast_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Fixed Documentation.
+
+2010-04-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.Solaris => README.solaris: Renamed.
+
+2010-04-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Pushed one item to PPL 0.12.  We will not have 0.10.3
+	release.
+
+2010-04-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : Merge remote branch 'origin/master' Conflicts: 	TODO
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml: Added
+	ppl_PIP_Problem_has_big_parameter_dimension that returns true if and
+	only if the pip problem has a big parameter set.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox: Added documentation for
+	Prolog PPL_Problem
+
+2010-04-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO: Dealt with one of the items.
+
+2010-04-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh: Better documentation for the two
+	Row_Impl::Impl::operator delete(...).
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/OCaml_interface.dox: Added documentation in the
+	OCaml interface for the PIP_Problem.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc: 
+	ppl_PIP_Problem_get_big_parameter_dimension() now throws an
+	exception if the big parameter has not been set.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* TODO: Removed a completed item: - Handle std::logic_error (now thrown in case watchdogs are not   available) in all the interfaces.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml: Simplify function names in
+	PIP_Tree_Node, matching corresponding predicate names in Prolog
+	interface.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: Simplified Prolog interface for
+	PIP_Tree_Node.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml: Removed
+	artificial_parameter_sequence type.  Added to the PIP_Problem tests.
+
+2010-04-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Typo fixed.
+
+2010-04-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli: Restructured the OCaml
+	interface to PIP_Tree_Node C++ classes.  Also corrected several bugs
+	related to object finalization.
+
+2010-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Added a couple of entries.
+
+2010-04-06  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: 
+	...get_big_parameter_dimension/2 changed to
+	...has_big_parameter_dimension/2 and now this fails if the "big
+	dimension" == not_a_dimension().
+
+2010-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.Solaris: Solaris users should install GNU sed.
+
+2010-04-06  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Check if the Prolog system
+	supports unbounded integers before testing the big_parameter for
+	PIP_Problem.
+
+2010-04-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Added calls to WEIGHT macros.
+
+2010-04-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: Corrected PIP_Problem test04 to
+	properly call predicate ppl_*_artificials().  Applied a few
+	renamings to the implementation of the predicate.
+
+2010-04-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/tests/PIP_Problem_test1.java: Fixed Java interface
+	for PIP_Decision_Node::child_node(branch).  New interface has a
+	(unboxed) boolean parameter.
+
+2010-04-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/dropsomenonintegerpoints1.cc: Added known results
+	for a couple of tests.
+
+2010-04-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc: Fixed bugs in
+	Octagonal_Shape:drop_some_on_integer_points().
+
+2010-04-05  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh: Uniformed code and get rid of a
+	warning.
+
+2010-04-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: Avoid useless boxing of builtins when
+	interfacing the wrap_assign().  Got rid of buggy j_boolean_to_bool()
+	helper.  Helper bool_to_j_boolean() renamed to
+	bool_to_j_boolean_class() for clarity, as it builds a boxed Java
+	Boolean value.
+
+2010-04-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Corrected a couple of typos.
+
+2010-04-05  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml: Completed a draft implementation of
+	PIP_Problem OCaml interface.  A few tests added.
+
+2010-04-02  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli: A start on the PIP_Problem
+	interface for OCaml.
+
+2010-04-02  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: Completed a draft of the
+	PIP_Problem interface for Prolog.  Added tests.
+
+2010-04-02  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java: Type fixed.
+
+2010-04-02  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Restored previously
+	removed method PIP_Problem_constraints().
+
+2010-04-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/BD_Shape/Makefile.am,
+	tests/BD_Shape/dropsomenonintegerpoints1.cc,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/dropsomenonintegerpoints1.cc: Tests added.
+	Some tests marked as expected to fail indicating bug(s) in the code.
+
+2010-04-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/tests/PIP_Problem_test1.java: Varios bug fixes and
+	small improvements.  A clone of test02 in pipproblem1.cc added to
+	the Java tests.  FIXME added to jni/ppl_java_common.cc
+
+2010-04-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4: Added "quasi ranking functions" generation procedures to OCaml
+	interface.
+
+2010-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh, src/Interval.defs.hh: Drafted
+	drop_some_non_integer_points() for Interval and Box.
+
+2010-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh: 
+	Drafted drop_some_non_integer_points() for weakly relational shapes.
+
+2010-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/tests/PIP_Problem_test1.java: Fixed problems in the
+	Artificial_Parameter(_Sequence) interface.
+
+2010-03-31  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce_Iterator.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java,
+	interfaces/Java/tests/PIP_Problem_test1.java: Several improvements
+	and bug fixes.  Removed unwanted iterator class for
+	Artificial_Parameter_Sequence.
+
+2010-03-31  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/tests/PIP_Problem_test1.java: Several improvements
+	and bug fixes.  More tests for the Java inmterface added.  Commented
+	lines in test indicate where code needs fixing.
+
+2010-03-31  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* NEWS, TODO: Updated with news of the new reduction operator for
+	partially reduced products and the new frequency operator.  Removed
+	a TODO item concerning the interfaces and termination methods.
+
+2010-03-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Completed removal of
+	Constraint_System_Iterator.
+
+2010-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh: Fixed
+	assign_all_inequalities_approximation for shapes.
+
+2010-03-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4: Interfaced
+	quasi_ranking procedures to C.
+
+2010-03-30  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+	java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/tests/PIP_Problem_test1.java: Fixed problem with
+	PIP_Problem constructor from a sequence of constraints. Added code
+	for testing this.  As there is no need for the class
+	Constraint_System_Iterator, Constraint_System_Iterator.java is
+	removed.
+
+2010-03-30  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+	java, interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/PIP_Problem_test1.java: Some tests for some of
+	the new PIP_Problem methods added.  Various bugs fixed.
+
+2010-03-30  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+	java: Completed draft Java interface for PIP_Problem (untested).
+
+2010-03-30  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4: Added Java interface tests for termination_test_MS,
+	termination_test_PR, termination_test_MS_2 and termination_test_PR_2
+
+2010-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/parma_polyhedra_library/Makefile.am: Enable Java
+	interface for termination procedures (and corrected bugs).
+
+2010-03-30  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.cc: Whitespace bug fixed.
+
+2010-03-30  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce.java,
+	interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequen
+	ce_Iterator.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System_Iterator.
+	java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Name.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Paramet
+	er_Value.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java,
+	interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java: Almost
+	complete (but untested) Java interface to the PIP_Problem
+
+2010-03-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4: Corrected several errors in Java interface for termination test
+	procedures.
+
+2010-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-03-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4: Added to Prolog interface the predicates for quasi-ranking
+	functions.
+
+2010-03-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh: Added procedures computing all the
+	affine quasi-ranking functions.  Corrected a few glitches in the
+	documentation and in exception messages.
+
+2010-03-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh: Factored away
+	common code in the MS-based termination procedures.  Improved
+	PR-based termination procedures relying on MIP_Problem by mapping
+	optimizations to satisfiability testing.
+
+2010-03-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/Grid_public.cc, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh: Avoid a few
+	annoying warnings for unused parameters.  Indentation fixed.  Avoid
+	using "return;" at the end of function body.
+
+2010-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Comma changed into full-stop.
+
+2010-03-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh: Other minor
+	improvements in assign_all_inequalities_approximation().
+
+2010-03-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: Apply more memory allocation improvements.
+
+2010-03-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: A few optimizations applied to
+	fill_constraint_systems_MS().
+
+2010-03-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4: Rename Termination.cc in ppl_java_Termination.cc in Java
+	interface.  Add the generated file to CLEANFILES.
+
+2010-03-25  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Fixed bugs leading to
+	warning messages.
+
+2010-03-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: Avoid nonpositivity constraints in the
+	enhanced PR methods by changing sign.  This is going to speed up the
+	MIP_Problem based methods.
+
+2010-03-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.templates.hh: Use original PR method if a single
+	pointset is provided.  Prefer the enhanced method if two pointsets
+	(before/after) are provided.
+
+2010-03-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc: Avoid the creation of many temporary linear
+	expressions.
+
+2010-03-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.cc, src/Linear_Expression.defs.hh: Added
+	helper function sub_mul_assign() to Linear_Expression interface.
+
+2010-03-25  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Grid/Makefile.am: Added missing sources line.
+
+2010-03-25  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl: 
+	Expected test result corrected.
+
+2010-03-25  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid_public.cc, tests/Grid/wrap1.cc: Bug in
+	Grid::wrap_assign() fixed.  Test that showed the bug added to
+	wrap1.cc.
+
+2010-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Fixed the all_affine_ranking_functions_PR*()
+	functions to correctly deal with the case where the system is
+	unsatisfiable.
+
+2010-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.templates.hh: 
+	Implemented methods
+	Pointset_Powerset::drop_some_non_integer_points().
+
+2010-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am,
+	tests/Polyhedron/dropsomenonintegerpoints1.cc,
+	tests/Polyhedron/dropsomenonintegerpoints2.cc: Test
+	Polyhedron::drop_some_non_integer_points().
+
+2010-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Fixed a couple of bugs in
+	drop_some_non_integer_points().
+
+2010-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Fixed a bug in
+	drop_some_non_integer_points().
+
+2010-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Enable *drop_some_non_integer_points* for Polyhedron; disable it for
+	Pointset_Powerset.
+
+2010-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Indentation corrected.
+
+2010-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron_nonpublic.cc: Drafted the implementation of methods
+	drop_some_non_integer_points().
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Enable the interfaces procedures for
+	Grid::drop_some_non_integer_points().
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid_public.cc, tests/Grid/Makefile.am,
+	tests/Grid/dropnonintegerpoints1.cc: Added a draft implementation
+	for Grid::drop_some_non_integer_points().
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am: Added the
+	generated Termination files to make clean.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4, src/Box.templates.hh, tests/BD_Shape/frequency1.cc,
+	tests/Box/frequency1.cc, tests/Octagonal_Shape/frequency1.cc: In
+	frequency(), deal properly with the case when a box is empty.  Added
+	tests for this case.  Re-enable frequency test in the Prolog
+	interface.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Test disabled while problem is investigated.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Added interface code for drop_some_non-integer_points() methods.
+	Note that these are only enabled for BD_Shapes, Octagonal_Shapes and
+	Boxes.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Added C interface for frequency().  Moved generator to language
+	independent file.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4: Added Java interface method for frequency().
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4: Added Ocaml interface function for frequency().
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4,
+	interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl: Added
+	interface predicate for frequency().  Generated test added.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4: Typo
+	fixed.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	interfaces/Prolog/XSB/xsb_pl_check.P: Added stubs for 7 and 8
+	argument predicates.  Missing predicate names added for pl_check
+	test.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4: Added
+	stubs for 7 and 8 argument predicates.
+
+2010-03-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Move the wrap_assign generator to the language independent file.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4: Added
+	documentation for prolog wrap_assign/8 predicate.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/OCaml_interface.dox: Added documentation for the
+	OCaml wrap_assign function.
+
+2010-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox, doc/ppl.sty: The `|' character cannot be used
+	to produce proper paired delimiters.
+
+2010-03-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh: Added
+	implementations for the original PR termination tests.  These are
+	activated when the preprocessor flag USE_ORIGINAL_PR_METHOD is set.
+	The flag is now active.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox: Improved documentation for frequency.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4: Type
+	error fixed.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Added interface code for wrap_assign().
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox: Typo fixed.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox: Wrong latex fixed.
+
+2010-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/termination1.cc: Added two new tests.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox: Several errors in the documentation for
+	frequency fixed.
+
+2010-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Fixed ill-positioned \f$.
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4, interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli: Added interface code for
+	wrap_assign().
+
+2010-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/termination1.cc: Fixed the expected result for
+	test04().
+
+2010-03-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox, src/BD_Shape.defs.hh, src/Box.defs.hh,
+	src/Grid.defs.hh, src/Octagonal_Shape.defs.hh,
+	src/Partially_Reduced_Product.defs.hh, src/Polyhedron.defs.hh: Added
+	and improved documentation for the frequency operator.
+
+2010-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.templates.hh: Debugging output switched off.
+
+2010-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am: Fixed the
+	handling of Termination.java.
+
+2010-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit ef1ccd4fea5bed38e73c23cd9a6e5879e7f281b3 Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Mon Mar 22 13:54:43 2010
+	+0100
+
+2010-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions1.cc: All test functions should be
+	declared in the anonymous namespace.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Revised exceptions that
+	can be thrown.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: Added missing C++ exceptions.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Revised to allow for for
+	expected logic_error.
+
+2010-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frequency1.cc: Let test13 compile.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am: Code,
+	unintensionally added by previous commit, removed..
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: Finished adding code for the java interface
+	to the termination methods.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators
+	.m4: Added OCaml interface code for the 6 new termination methods.
+
+2010-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Cut exponential execution paths by calls to
+	maybe_abandon().
+
+2010-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions1.cc: All test functions should be
+	declared in the anonymous namespace.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Revised exceptions that
+	can be thrown.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: Added missing C++ exceptions.
+
+2010-03-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Revised to allow for for
+	expected logic_error.
+
+2010-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frequency1.cc: Let test13 compile.
+
+2010-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit b43d29400ddc9823f5d08d4148adb804dcc8e321 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sun Mar 21 07:32:40 2010 +0400
+
+2010-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 0f40cc8d92d033ab5c78cdd2d4661f395603e8b5 Author: Patricia
+	Hill <p.m.hill at leeds.ac.uk> Date:   Sat Mar 20 22:00:34 2010 +0000
+
+2010-03-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog_common.defs.hh,
+	tests/Grid/frequency1.cc, tests/Octagonal_Shape/frequency1.cc: Added
+	missing code for logic_error exception.
+
+2010-03-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc: Simplified OCaml code for
+	all_zero() and all_homogeneous_terms_are_zero()
+
+2010-03-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli: Added OCaml interface for
+	Linear_Expression::is_zero() and all_homogeneous_terms_are_zero().
+
+2010-03-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Added std::logic_error
+	to the list of exceptions caught.
+
+2010-03-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression.java: 
+	Added Java interface for Linear_Expression::is_zero() and
+	Linear_Expression::all_homogeneous_terms_are_zero().
+
+2010-03-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: Added some of the Java interface code needed
+	for the termination methods.
+
+2010-03-20  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added a test generating a
+	solution node with two context constraints.
+
+2010-03-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-03-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 42a77adddb8e0a7223d6dd17b7b0916660411800 Merge: 367f75c
+	b831a0b Author: Roberto Bagnara <bagnara at cs.unipr.it> Date:   Sat
+	Mar 20 08:27:47 2010 +0400
+
+2010-03-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.defs.hh: Fixed a typo in the documentation.
+
+2010-03-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.defs.hh: Improved the documentation with examples
+	for uses of the big parameter.
+
+2010-03-19  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added a couple of tests using
+	the big parameter.
+
+2010-03-19  Marco Poletti <poletti.marco at gmail.com>
+
+	* STANDARDS: Added formatting conventions to the STANDARDS file.
+
+2010-03-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* TODO,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Updated the first item
+	for TODO and removed code for linear expression is_zero() and
+	all_homogeneous_terms_are_zero() from the Prolog interface.
+
+2010-03-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh: As in previous commit - ensure
+	initialization of variables.
+
+2010-03-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Octagonal_Shape.templates.hh: Missing variable initialization
+	added.
+
+2010-03-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Polyhedron.defs.hh: Improved documentation
+	for frequency().
+
+2010-03-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frequency1.cc: Corrected/improved a few tests in
+	BD_Shape/frequency1.cc.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/Makefile.am: Mention header file
+	partially_reduced_product_test.hh.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4: 
+	Don't take the address of a temporary object.
+
+2010-03-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/ppl_interface_generator_common_dat.m4: 
+	All_affine_ranking_functions_PR* functions, for the C and Prolog
+	interfaces now take an NNC polyhedron as the last argument and not a
+	C one.  Interface Linear_Expression::is_zero() and
+	Linear_Expression::all_homogeneous_terms_are_zero() added to the C
+	and Prolog interfaces.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/Makefile.am: Fixed
+	tests/Partially_Reduced_Product/Makefile.am.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Threshold_Watcher.defs.hh: Avoid a broken reference
+	to another manual that is built later.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/Makefile.am: Define the SOURCES
+	for test concatenate1.
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, tests/Polyhedron/termination1.cc: 
+	Completed the implementation of all_affine_ranking_functions_PR*().
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, TODO, src/Linear_Expression.defs.hh,
+	src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	src/Linear_Row.defs.hh: New Linear_Expression methods.  Methods bool
+	Linear_Expression::is_zero() const and bool
+	Linear_Expression::all_homogeneous_terms_are_zero() const return
+	true if and only if `*this' is 0, and if and only if all the
+	homogeneous terms of `*this' are 0, respectively.
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4: Termination functions renamed in non-C++ interfaces.
+
+2010-03-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Avoid leakage when exiting a test.
+
+2010-03-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: Revised code neede for wrap assign
+	wrap_assign in Java.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Let
+	ppl_*_linear_partition/4 register its outputs to the allocator
+	tracker.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc: Corrected typo: register
+	the C++ pointer, not the Prolog term.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+	demos/ppl_pips/expected_mpz: Corrected the expected results for test
+	fimmel.pip.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/expected_int16, demos/ppl_pips/expected_int16_a,
+	demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+	demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+	demos/ppl_pips/expected_int8, demos/ppl_pips/expected_int8_a,
+	demos/ppl_pips/expected_mpz: Corrected expected result for test
+	sor1d.pip.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frequency1.cc: Test 08 may does not overflow
+	when using exact Octagonal_Shapes.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/examples/sor1d.pip: Fixed input file sor1d.pip.  A
+	line of blanks is not a valid comment line for the input reading
+	routine.
+
+2010-03-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/expected_mpz_a, demos/ppl_pips/ppl_pips.cc: Fixed
+	xpected result for sor1d.pip. Minor improvements to ppl_pips.cc.
+
+2010-03-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Delete objects before exiting
+	code.
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 7ededcd1147e0df879bdfaf92e9fa49c5482653d Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Thu Mar 18 11:31:30 2010 +0400
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, tests/Polyhedron/termination1.cc: Fixed
+	one_affine_ranking_function_PR().
+
+2010-03-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am, demos/ppl_pips/expected_mpz_a,
+	demos/ppl_pips/ppl_pips.cc: Fixed a few memory allocation problems
+	in ppl_pips.  Enabled the used of valgrind when running ppl_pips
+	tests.  Corrected the expected result for test fimmel.pip
+	(unsatisfiable problem).
+
+2010-03-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Fixed a couple of resource allocation problems
+	(reported by Marco Poletti).
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4: Several
+	corrections.
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.defs.hh,
+	src/termination.templates.hh: Turn off debugging output.
+
+2010-03-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc: Fixed two bogus
+	invocations of PPL_WEAK_REGISTER.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl: Fixed several typos.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Fixed
+	some invocations of PPL_CHECK.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.defs.hh: Define
+	PROLOG_TRACK_ALLOCATION to 1 to make a few bugs evident.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/tests/pl_check.pl: C and Prolog interfaces
+	for the termination utility functions renamed and fixed.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh: Kludge removed.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh,
+	tests/Polyhedron/termination1.cc: Completed
+	fill_constraint_system_PR().
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/termination.templates.hh,
+	tests/Polyhedron/termination1.cc: Kludge to allow the
+	proof-of-concept implementation of the PR functions to compile.
+
+2010-03-17  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/parma_polyhedra_library/Makefile.am: Fixed some
+	typos for code related to the wrap_assign java interface.
+
+2010-03-16  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4: Added implementation code for Java interface
+	for wrap_assign.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.templates.hh, tests/Polyhedron/termination1.cc: 
+	Temporarily implemented termination_test_PR() in terms of
+	termination_test_PR_2().
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh,
+	tests/Polyhedron/termination1.cc: Implemented and fixed termination
+	utilities with two input abstractions.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assert.hh: Code formatting fixed.
+
+2010-03-17  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl: Added a test (based on test10
+	in termination1.cc in the tests/Polyhedron directory) for
+	termination_test_MS/1 and termination_test_PR/1.
+
+2010-03-17  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4: 
+	Added termination_test functions ending with "_2".
+
+2010-03-17  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Fixed
+	some cut and paste typos.
+
+2010-03-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4: Arities fixed.
+
+2010-03-16  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Octagonal_Shape/frequency1.cc: Allow for the various numeric
+	types in frequency1.cc
+
+2010-03-16  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	*
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overfl
+	ow.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Repres
+	entation.java,
+	interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.
+	java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/Java/ppl_interface_generator_java_procedure_generators.m
+	4: Java interface for wrap asign added.
+
+2010-03-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.templates.hh: Printing of debug information
+	suppressed.
+
+2010-03-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh,
+	tests/Polyhedron/termination1.cc: Implemented template
+	termination_test_PR_2().
+
+2010-03-16  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4: Added more termination_test predicates to the Prolog
+	interface.
+
+2010-03-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, tests/Polyhedron/termination1.cc: New
+	versions of the termination utility functions with two input
+	parameters.  The PR ones are only stubs for the time being.
+
+2010-03-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Add BD_Shape<int8_t> to the instantiations enabled
+	by default.  BD_Shape<int8_t> allows to efficiently encode
+	monotonicity constraints.
+
+2010-03-15  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh, src/Box.defs.hh,
+	src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh,
+	tests/Box/frequency1.cc: Test changed so as to be meaningful for all
+	integer types.  Comment typos fixed.
+
+2010-03-15  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh, src/Box.defs.hh,
+	src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh,
+	tests/Box/frequency1.cc: Test changed so as to be meaningful for all
+	integer types.  Comment typos fixed.
+
+2010-03-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 8760df47483200e17daf43df3c7ca4ec7aad9185 Author: Patricia
+	Hill <p.m.hill at leeds.ac.uk> Date:   Mon Mar 15 11:18:15 2010 +0000
+
+2010-03-11  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.defs.hh: Documentation fixes. Added a paragraph
+	about optimizing a linear cost function.
+
+2010-03-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.inlines.hh: Improved checks in
+	PIP_Decision_Node::OK() method.  There is no reason to have
+	Artificial_Parameter::OK() inlined.  Added a couple of comments on
+	code that should be normally unreachable.
+
+2010-03-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: Fixed documentation reference.
+
+2010-03-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in: Fixed
+	the value of INPUT doxygen configuration variable.
+
+2010-03-10  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4: Improved variable
+	names.
+
+2010-03-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/termination1.cc: test10() and test11() witness a
+	bug in termination_test_PR().
+
+2010-03-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 65156364caa2da7235862998930736ca27c83236 Author:
+	François Galea <francois.galea at uvsq.fr> Date:   Tue Mar 9 20:28:29
+	2010 +0100
+
+2010-03-08  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.defs.hh: Documentation fixes.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh,
+	tests/Polyhedron/termination1.cc: Implemented the improved Podelski
+	and Rybalchenko termination test.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh: Function
+	renamed.  Unwanted stuff removed from comment.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: LaTeX code fixed.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 114f0e38474584e74743f67fd1203487241b60e8 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Mar 9 13:36:12 2010 +0400
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-latex.in: Missing files added.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Description of the PR method improved.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 4e2cacd9738634f10872d5e63f3fa9551d546a7e Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Mar 9 08:52:23 2010 +0400
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit f9fbde6765402ee509a03d952fdae02115c266fa Merge: 97bd553
+	a6b23fd Author: Roberto Bagnara <bagnara at cs.unipr.it> Date:   Tue
+	Mar 9 07:04:15 2010 +0400
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-03-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh: Indentation fixed.
+
+2010-03-08  Roberto Amadini <r.amadini at virgilio.it>
+
+	* doc/definitions.dox, doc/devref.doxyconf-html.in: Fixed
+	documentation files.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 276bf49a11da0443cc5b284cf880858a8911b48a Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Mar 8 21:52:26 2010 +0400
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: Fixed
+	the implementation of the *_all_affine_ranking_functions_*
+	predicates.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.templates.hh: Fixed
+	one_affine_ranking_function_MS(): it was not projecting the
+	generator onto the mu variables.
+
+2010-03-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4: Code
+	for Polyhedron_all_affine_ranking_functions_PR and similar revised -
+	but is buggy. m4 version needs fixing.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am, m4/ac_check_swi_prolog.m4: 
+	Support newer versions of SWI-Prolog.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am, m4/ac_check_swi_prolog.m4: 
+	Support newer versions of SWI-Prolog.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc, src/termination.templates.hh: Fixed some
+	copy-and-paste mistakes.
+
+2010-03-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4: 
+	Added the rest of the termination functions to the C interface.
+
+2010-03-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4: Fixed some bugs in the Prolog interface termination code.
+
+2010-03-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/ppl_interface_generator_common_dat.m4: Added the
+	new termination functions to Prolog interface and the
+	termination_test_MS only to the C interface.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 54bf68f9ee93822f8792c0d89d45ebd0b5823aee Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Mar 8 16:24:38 2010 +0400
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Comments improved.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/termination1.cc: Added a couple of missing
+	constraints.
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/termination1.cc: Fixed the input polyhedra for
+	test01() and test02().
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.templates.hh: Added stub implementations for
+	one_affine_ranking_function_PR() and
+	all_affine_ranking_functions_PR().
+
+2010-03-08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 4684207ce34a88f9552f450faa6e019e475e4027 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Mar 8 13:35:33 2010 +0400
+
+2010-03-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Corrected an invalid reference bug in
+	PIP_Solution_Node::update_tableau().  The addition of tableau rows
+	invalidates previously computed references.  Thanks to Marco Poletti
+	for reporting this.
+
+2010-03-07  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Eventually perform solution
+	tree simplifications after incremental addition of parameter
+	constraints.
+
+2010-03-07  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Moved the
+	compatibility_check static methods to PIP_Tree_Node.
+
+2010-03-07  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added one more test for
+	incremental solving.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Still working on specifications.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/termination.cc: Completed a couple of comment blocks.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	src/termination.cc, src/termination.defs.hh: Documented the
+	interfaces of the termination analysis functions.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: LaTeX inconsistency removed.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am, src/termination.cc, src/termination.defs.hh,
+	src/termination.templates.hh, tests/Polyhedron/termination1.cc: 
+	Moved the utilities for termination analysis to their final
+	destination.
+
+2010-03-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/termination1.cc: Several improvements.  Changed
+	the encoding of the input systems.  Started drafting the
+	implementation of the method of Podelski and Rybalchenko.
+
+2010-03-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am, tests/Polyhedron/termination1.cc: 
+	Added functions for termination analysis following the approach of
+	Mesnard and Serebrenik.
+
+2010-03-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint_System.cc, src/Constraint_System.defs.hh: Added
+	method bool Constraint_System::has_equalities() const.
+
+2010-03-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Corrected a couple of typos in the
+	documentation.
+
+2010-03-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Test 4 in
+	digitalfilers1.cc overflows with 64-bits if assertions are on.
+
+2010-03-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Tests 20, 21 and 22 overflow on
+	8-bit coefficients (derived from test02).
+
+2010-03-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/ppl_test.hh: Encoded custom overflow conditions for
+	digitalfilters1.cc tests 5 and 6.
+
+2010-03-04  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added a test for problem
+	feasibility when incrementally adding parameter constraints.
+
+2010-03-04  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added two tests for incremental
+	addition of parametric constraints.  Even though correct, the
+	resulting solution trees can be simplified.
+
+2010-03-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh: Replaced using directives by using
+	declarations.
+
+2010-03-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc: Apparently GNU Hurd only supports
+	ITIMER_REAL.  (Thanks to Michael Tautschnig:
+	http://www.cs.unipr.it/pipermail/ppl-devel/2010-March/016072.html).
+
+2010-03-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc: Proper spacing added to
+	throw_syscall_error().  (Thanks to Michael Tautschnig.)
+
+2010-03-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Detected
+	several overflows in tests 5 and 6 of digitalfilters1.cc.
+
+2010-03-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh: Adopted a more flexible implementation for the
+	DO_TEST* macros.  (Based on a set of macros provided by Abramo
+	Bagnara.)
+
+2010-03-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h, src/PIP_Problem.defs.hh: Made a pass
+	on the documentation of class PIP_Problem.
+
+2010-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Method
+	PIP_Tree_Node::solve() now checks context feasibility when needed.
+
+2010-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Corrected typo in test19().
+
+2010-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Several
+	minor improvements to the PIP_Problem resolution process.
+	Reorganized helper functions update_context() and
+	compatibility_check().
+
+2010-03-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	The wrap_assign has only been added to the C interface so the
+	procedure must be local to the C interface.
+
+2010-03-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh, src/Box.templates.hh: Completed removal of
+	support for circular intervals.  Removed now ambiguous method CC76_narrowing_assign().  While at it,
+	also wrapped a few long lines.
+
+2010-03-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox, interfaces/C/C_interface.dox,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/ppl_c_implementation_common.inlines.hh,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Added C interface for wrap_assign.  Minor NELS improvements to
+	documentation describing Wrapping Operator (should be checked by the
+	author of these notes).
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: Useless comma removed.
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bool4.defs.hh, src/Box.defs.hh, src/Box.templates.hh,
+	src/Makefile.am: Removed stuff that will not be included in PPL
+	0.11.
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: Missing comma added.
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh, src/Box.templates.hh,
+	src/Circular_Interval.defs.hh, src/Makefile.am: Temporarily removed
+	the support for circular intervals.
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 9005a4bc71b38b80205724ac2914731466e5b450 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Feb 27 17:02:19 2010 +0100
+
+2010-02-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Increase code coverage for
+	PIP_Tree_Node printing methods.
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am: Force C++ linking for all the test
+	programs.
+
+2010-02-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/watchdog1.cc: Exception handling fixed.
+
+2010-02-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, Watchdog/src/Watchdog.inlines.hh,
+	Watchdog/tests/watchdog1.cc, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/tests/watchdog1.c, tests/Polyhedron/watchdog1.cc: Throw
+	std::logic_error in case the client asks for watchdogs on a system
+	not supporting them.
+
+2010-02-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Threshold_Watcher.defs.hh,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/Prolog/ppl_prolog_common.cc,
+	tests/Polyhedron/weightwatch1.cc: Simplified initialization of
+	Threshold_Watcher<> static data member.
+
+2010-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: Added printing
+	functions for PIP tree nodes and improved documentation.
+
+2010-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added
+	operator<<() for class PIP_Tree_Node, printing the subtree.  The output operator is based on public (non-virtual) method print(),
+	which calls the protected (virtual) method print_tree() after
+	properly setting up the needed arguments.
+
+2010-02-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.defs.hh, src/Matrix.inlines.hh: Improve definition of
+	Matrix::const_iterator default constructor.
+
+2010-02-24  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Modified
+	return statements.
+
+2010-02-24  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Several
+	corrections in rate limiter tests.
+
+2010-02-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Tests 1-18 restored.  Test 19 is
+	known to fail.
+
+2010-02-23  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added a test illustrating a bug
+	when incrementally inserting a parameter constraint.
+
+2010-02-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Fixed a test
+	on BDShape.
+
+2010-02-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/exceptions1.cc: Tests 14 and 15 are known to
+	overflow on 8-bit coefficients.
+
+2010-02-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Variable_Floating_Point_Expression.inlines.hh: Removed
+	whitespaces.
+
+2010-02-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Octagonal_Shape.templates.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed
+	indentation.
+
+2010-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/tests/pip_test.c: Fixed call to
+	ppl_PIP_Solution_Node_get_parametric_values().
+
+2010-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/pipproblem1.cc: Added tentative solution to bugs
+	shown by pipproblem1 tests 16, 17 and 18.
+
+2010-02-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Fixed
+	digitalfilters1.cc
+
+2010-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, tests/PIP_Problem/exceptions1.cc,
+	tests/PIP_Problem/pipproblem2.cc: Do set the `solution_valid' flag
+	on exit from update_solution().
+
+2010-02-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 8ad05a7fa1293c23494ebd8c1a8222c8cc39dc0e Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Mon Feb 22 14:22:26 2010
+	+0100
+
+2010-02-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	tests/PIP_Problem/pipproblem1.cc: Changed interface for public
+	method PIP_Solution_Node::parametric_values().  The new interface no longer requires the set of problem parameters
+	as an input argument (which was error prone): rather, the set of
+	parameters of the PIP_Problem is now automatically retrieved.  To this end, all PIP tree nodes are now provided by a pointer to the
+	owning PIP_Problem object. Method PIP_Problem::OK() modified to
+	check for well formedness of the solution tree and, in particular,
+	check that all its nodes are marked as owned by the right
+	PIP_Problem object.  Removed the no longer useful method
+	PIP_Tree_Node::insert_artificials().  Corrected a typo in PIP_Problem::operator<<().  Simplified interface
+	of (internal) method PIP_Tree_Node::print_tree().  Added a FIXME regarding a potential exception safety issue.
+
+2010-02-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 537a4928e00e2b811822089da4cf12a1dd4344cf Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Feb 22 09:16:36 2010 +0100
+
+2010-02-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/pip_test.c: Avoid printing unless noisy or
+	very-noisy mode was requested.
+
+2010-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/watchdog1.cc: Be more informative in case
+	something goes wrong.
+
+2010-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac: Use the C++ compiler to perform the tests
+	meant for C++.
+
+2010-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	Watchdog/src/Watchdog.inlines.hh, Watchdog/src/pwl_header.hh: 
+	sigaction() is also needed, in addition to setitimer() in order to
+	support Watchdog objects.  We could check if signal() is available
+	if there is request for such a feature.
+
+2010-02-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	Watchdog/src/Watchdog.inlines.hh, interfaces/C/tests/watchdog1.c,
+	interfaces/C/tests/weightwatch1.c: If setitimer() is not available,
+	no initialization is necessary.  This also works around a linking
+	bug in Mingw.  C tests improved with error-handling code.
+
+2010-02-20  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Cast_Floating_Point_Expression.templates.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: 
+	Floating_Point_Expression::absolute_error is now a symmetric
+	interval.
+
+2010-02-20  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Cast_Floating_Point_Expression.templates.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Use build method
+	instead of join_assign to build convex intervals.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/ascii_dump_load1.cc: Improved code coverage.
+	Removed useless (and not accessible by user)
+	Tableau::total_memory_in_bytes().
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, tests/PIP_Problem/pipproblem3.cc: Invalidate
+	current solution at the start of PIP_Solution_Node::solve().  This
+	fixes the bug in pipproblem3 test03.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, tests/PIP_Problem/pipproblem2.cc: Adding no
+	space dims should not invalidate previously computed solution.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Got rid
+	of non-const PIP_Tree_Node as_decision() and as_solution() methods.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem2.cc: Achieve full code coverage for
+	the output operator.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	tests/PIP_Problem/exceptions1.cc: Document and test exception thrown
+	by PIP_Problem::print_solution().
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/ascii_dump_load1.cc: Test 09 overflows when
+	using 8-bit coefficients.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: A couple of tests marked as
+	known to fail.  These shows a bug in the solver, which fails to
+	detect an unfeasible initial context.
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem3.cc: Put under git control.  These
+	test exercise the incremental PIP solver (still buggy).
+
+2010-02-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Check fir and avoid space dimension mismatches in
+	merge_assign().
+
+2010-02-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/Makefile.am: Started working on incrementality.
+	Dealt with a FIXME in PIP_Solution_Node::update_tableau(): when
+	adding new problem variables and parameters, the columns of the
+	existing artificial parameters are moved to the right of the
+	tableau.t matrix.
+
+2010-02-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/pipproblem2.cc: Little code coverage improvement.
+
+2010-02-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	tests/PIP_Problem/pipproblem1.cc, tests/PIP_Problem/pipproblem2.cc: 
+	Prefer denominator() to get_denominator().  In pipproblem1 test02(),
+	add a lenghty check of the expected solution.
+
+2010-02-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: Simplified C interface
+	to Artificial_Parameter.
+
+2010-02-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: Removed two PIP_Problem
+	enum values that need not be interfaced.
+
+2010-02-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.inlines.hh: Avoid parameter name
+	hiding; mark unreachable code.
+
+2010-02-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/pip_test.c: Added some missing C interface
+	methods and enum values for the new PIP classes.
+
+2010-02-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Changed
+	linearize method interface for Floating Point Expressions.  Now, it
+	has a bool return type which indicates if the linearization
+	succeeded (or not). Thus, Linearization_Failed exception class has
+	been removed.
+
+2010-02-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc,
+	tests/PIP_Problem/pipproblem1.cc: Corrected bug in th ehandling of
+	trivially satisfiable PIP problems.  Test 16 in pipproblem1.cc
+	(currently disabled) shows a bug in the handling of trivially
+	unfeasible PIP problems.
+
+2010-02-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Dealt with a FIXME in PIP_Solution_Node::solve().
+
+2010-02-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/pip_test.c: Added total_memory_in_bytes() and
+	external_memory_in_bytes() to MIP_Problem and PIP_Problem in the C
+	interface.
+
+2010-02-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Multiplication_Floating_Point_Expression.templates.hh: Fixed
+	comments.
+
+2010-02-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Multiplication_Floating_Point_Expression.templates.hh: 
+	Improved comments.
+
+2010-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.1, demos/ppl_pips/ppl_pips_extra_man_text: 
+	Described the input formats.
+
+2010-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips.cc: Cosmetic improvements.
+
+2010-02-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Variable_Floating_Point_Expression.defs.hh: Added and fixed
+	documentation for Var_FP_Expression.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/expected_int16, demos/ppl_pips/expected_int16_a,
+	demos/ppl_pips/expected_int32, demos/ppl_pips/expected_int32_a,
+	demos/ppl_pips/expected_int64, demos/ppl_pips/expected_int64_a,
+	demos/ppl_pips/expected_int8, demos/ppl_pips/expected_int8_a: 
+	Updated expected results.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am, demos/ppl_pips/expected_mpz,
+	demos/ppl_pips/expected_mpz_a: Test with all the examples.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/examples/README, demos/ppl_pips/examples/big.pip,
+	demos/ppl_pips/examples/brisebarre.pip,
+	demos/ppl_pips/examples/cg1.pip, demos/ppl_pips/examples/esced.pip,
+	demos/ppl_pips/examples/ex2.pip,
+	demos/ppl_pips/examples/fimmel.pip,
+	demos/ppl_pips/examples/invert.dat,
+	demos/ppl_pips/examples/linear.dat,
+	demos/ppl_pips/examples/lineri.dat,
+	demos/ppl_pips/examples/loz.dat, demos/ppl_pips/examples/max.dat,
+	demos/ppl_pips/examples/max.pip, demos/ppl_pips/examples/maxb.dat,
+	demos/ppl_pips/examples/pairi.dat,
+	demos/ppl_pips/examples/petit.dat,
+	demos/ppl_pips/examples/rairoi.dat,
+	demos/ppl_pips/examples/sor1d.pip,
+	demos/ppl_pips/examples/square.pip,
+	demos/ppl_pips/examples/test12i.dat: Added examples from PipLib
+	1.4.0.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox: Typo fixed: we require
+	SICStus at least version 3.9.1.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am, Watchdog/tests/{simple1.cc =>
+	watchdog1.cc}: Test program renamed.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/watchdog1.cc, tests/Polyhedron/weightwatch1.cc: 
+	Cosmetic changes.
+
+2010-02-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox, src/Polyhedron.defs.hh: Added "affine from
+	relation" section into definitions.dox.  Fixed a reference to
+	"affine from relation".
+
+2010-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/PIP_Problem.cc: Drafted implementation for
+	PIP_Problem's operator<<.
+
+2010-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Tests adapted to use the new
+	method for printing a PIP problem solution.
+
+2010-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh: Added method PIP_Problem::print_solution().
+	The new method exploits added virtual method
+	PIP_Tree_Node::print_tree().  Implementation is based on code from
+	the many display_solution() helper functions that are currently
+	spread in the tests.
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/pwl_header.hh, Watchdog/tests/simple1.cc: Cater for
+	systems where setitimer() is not provided (part 4).
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.inlines.hh: Cater
+	for systems where setitimer() is not provided (part 3).
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, Watchdog/pwl-config.sed, Watchdog/src/Watchdog.cc,
+	Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh: 
+	Cater for systems where setitimer() is not provided (part 2).
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh: 
+	Cater for systems where setitimer() is not provided (part 1).
+
+2010-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, configure.ac: Build the PWL unless not
+	explicitly disabled at configuration time.
+
+2010-02-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* : commit 3c3188f08c10a1914cd545f35ba10a6ee464c3b9 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Wed Feb 17 10:16:43 2010 +0100
+
+2010-02-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Tests 2, 5, 7, 8, 9 and 10 do
+	not overflow on 16 bit coefficients.
+
+2010-02-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Float.inlines.hh: Fixed a type error.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Solved other instances of
+	test02, but using different cutting strategies.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Fixed bug introduced when improving coding style
+	in PIP_Solution_Node::solve.  Corrected wrong assertion in
+	PIP_Solution_Node::generate_cut.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Important item added.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc: Unwanted inclusion
+	removed.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Use the right
+	preprocessor conditionals for PPL_HAVE_DECL_SIGACTION.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc: Warnings avoided.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Corrected several
+	problems.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/upperboundifexact1.cc: Enable test12.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh: A few improvements to
+	PIP_Problem documentation.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/pip_test.c: Make the test trivially succeed
+	when coefficients are not large enough.
+
+2010-02-16  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Cast_Floating_Point_Expression.inlines.hh, src/Makefile.am,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/ppl_test.hh: Fixed Cast_Floating_Point_Expression.inlines.hh
+	and added a test.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/pip_test.c: Improved error handling.  Cosmetic
+	improvements.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem2.cc: 
+	Added unit tests for inner class
+	PIP_Tree_Node::Artificial_Parameter.  Added operator!=() and swap()
+	methods: the last was necessary as we were inheriting it from
+	Linear_Expression.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem2.cc: Added another test for code
+	coverage purposes.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh: Got rid of
+	unused Boolean flag PIP_Problem::initialized.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips_extra_man_text: Avoid non-ASCII
+	characters.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips_extra_man_text: Trailing whitespace
+	removed.
+
+2010-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am: Install also ppl_pips.1.
+
+2010-02-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem2.cc: Added a couple of tests to
+	improve code coverage.
+
+2010-02-15  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Cast_Floating_Point_Expression.defs.hh,
+	src/Cast_Floating_Point_Expression.inlines.hh,
+	src/Cast_Floating_Point_Expression.templates.hh,
+	src/Cast_Floating_Point_Expression.types.hh: Added classes.
+
+2010-02-15  Roberto Amadini <r.amadini at virgilio.it>
+
+	* doc/devref.doxyconf-html.in: Added a first implementation of
+	Cast_Floating_Point_Expression classes.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/ppl_pips_extra_man_text: Put under Git control.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Avoid non-ASCII characters.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_pips/ppl_pips.1, devtools/generate_man_pages,
+	doc/ppl-config.1: Added a draft man page for `ppl_pips'.  Other man
+	pages updated.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am: Missing backslash added.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am, demos/ppl_pips/expected_int16,
+	demos/ppl_pips/expected_int16_a, demos/ppl_pips/expected_int32,
+	demos/ppl_pips/expected_int32_a, demos/ppl_pips/expected_int64,
+	demos/ppl_pips/expected_int64_a, demos/ppl_pips/expected_int8,
+	demos/ppl_pips/expected_int8_a, demos/ppl_pips/expected_mpz_a: Added
+	missing expected results.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, Watchdog/src/pwl_header.hh: Improved the
+	NDEBUG machinery.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Mark expected overflows.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, Watchdog/pwl-config.sed,
+	Watchdog/tests/pwl_test.cc, configure.ac, ppl-config.sed,
+	tests/ppl_test.cc: Improve portability to systems that do not
+	(fully) support Posix signal handling.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2010-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 05cdf3ade39391ba25dc992cabe93a7758e23dac Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Mon Feb 15 11:18:23 2010
+	+0100
+
+2010-02-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh, tests/PIP_Problem/ascii_dump_load1.cc: Drafted
+	PIP_Problem methods {total,external}_memory_in_bytes().
+
+2010-02-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh, src/PIP_Tree.types.hh,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/pipproblem1.cc: PIP_Problem ascii dump&load
+	methods now also dump/load problem solution.  Fixed error in
+	PIP_Tree_Node::ascii_load().  Added ascii dump&load methods to
+	PIP_Decision_Node.
+
+2010-02-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, tests/PIP_Problem/ascii_dump_load1.cc: In
+	ascii dump and load methods, also print pivot row strategy info.
+
+2010-02-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc: 
+	Improving test coverage ratio.
+
+2010-02-06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved exception safety in method
+	PIP_Solution_Node::solve().
+
+2010-02-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Clarified proper usage of
+	PIP_Solution_Node alternative copy constructor.  The Boolean
+	argument replaced by a tag struct type, since it was only used for
+	overloading resolution purposes.
+
+2010-02-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	src/PIP_Tree.cc: Add new friend function add_mul_assign() for
+	Linear_Expression.  Used new function to optimize a couple of
+	computations in PIP_Tree.cc.
+
+2010-02-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Helper function negate_assign() rnamed as
+	complement_assign().
+
+2010-02-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Simplified interface for virtual method PIP_Tree_Node::solve().  No
+	longer using the PIP_Tree_Node*& parent_ref argument and direclty
+	returning the solution PIP_Tree_Node* instead of a status flag.
+
+2010-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Improved class PIP_Tree_Node::Artificial_Parameter.
+
+2010-02-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc: Some improvements to method
+	PIP_Problem::solve().
+
+2010-02-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved the last part of method
+	PIP_Solution_Node::solve().
+
+2010-02-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: More progress on PIP_Solution_Node::solve().
+	Identified places where the current implementation is not exception
+	safe.
+
+2010-02-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Further improved (huge) method
+	PIP_Solution_Node::solve().  Added a couple of comments regarding
+	parts where comments or code in unclear.
+
+2010-02-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved method Tableau::is_better_pivot().
+
+2010-02-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Started improving method
+	  PIP_Solution_Node::solve(): - limit scope of variables;   - try to use meaningful variable names.
+
+2010-02-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Minor improvements to PIP_Problem documentation and C interface.
+
+2010-02-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: Got rid of
+	error-prone Tableau::s_capacity() and Tableau::t_capacity().
+
+2010-02-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved method
+	PIP_Solution_Node::update_tableau().
+
+2010-02-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved implementation of
+	PIP_Solution_Node::compatibility_check().  Besides readability and
+	stylistic changes, the change should also immprove robustness and
+	(to a lesser extent) performance.
+
+2010-01-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved method
+	PIP_Solution_Node::::parametric_values().
+
+2010-01-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Stylistic improvements to Tableau methods
+	normalize() and scale().
+
+2010-01-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: A few more stylistic improvements.
+
+2010-01-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Several improvements to PIP_Solution_Node::generate_cut().  Added
+	method OK() to Artificial_Parameter.
+
+2010-01-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Further optimization to helper function
+	column_lower().
+
+2010-01-31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Several minor stylistic
+	improvements.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Prefer C++ named casts to C style casts.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Minor readability improvements to row_normalize.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Optimized some computation in helper function
+	column_lower().
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc: Improved helper function
+	merge_assign(): add all new rows at once.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Corrected capacity mismatch bug in
+	PIP_Solution_Node::solve().
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved consistency checks in method
+	PIP_Decision_Node::OK().
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Improved consistency checks in method
+	PIP_Solution_Node::Tableau::OK().  Prefer using
+	Coefficient_traits::const_reference in parameter passing.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh: The Pip_Tree_Node:OK() method is now
+	virtual.  When overriding a virtual method in derived classes,
+	prefer repeating the virtual keyword for clarity.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh, src/PIP_Tree.types.hh: Typedef for PIP_Tree
+	moved to PIP_Tree.types.hh.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.inlines.hh: Everyting else equal, prefer downward
+	iteration in for loop.
+
+2010-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc: No need to check for null pointers before
+	deleting them.
+
+2010-01-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence_System.defs.hh, src/Generator_System.defs.hh,
+	src/Grid_Generator_System.defs.hh: Forward declare classes before
+	making them friends.  Included Grid.types.hh in Congruence_/Grid_Generator_
+	System.defs.hh.  Do not uselessly include Grid.types.hh in
+	Generator_system.defs.hh.
+
+2010-01-22  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added a not working incremental
+	solve test.
+
+2010-01-20  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc: Fixed bugs. Now test07 in
+	pipproblem2.cc is successful.
+
+2010-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P: Fixed the omissions of
+	ppl_Polyhedron_is_empty/1 and ppl_Polyhedron_add_constraints/2.
+
+2010-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P: Fixed the omission of
+	ppl_set_irrational_precision/1 and ppl_irrational_precision/1.
+
+2010-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 9c19bc2b318a35016e0189f9552c98910be37f53 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Jan 9 16:32:08 2010 +0100
+
+2010-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 56ee86b9ccf001c8dc2ab1558332e9691b2eff3f Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Jan 9 14:38:37 2010 +0100
+
+2010-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.inlines.hh: Generate nicer identifiers for the
+	temporaries.
+
+2010-01-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex1.mps: Adapted to follow the IBM OSL
+	conventions for the MPS format.
+
+2010-01-05  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixed a bug. Now test08 and test09 in
+	pipproblem2.cc are successful.
+
+2010-01-04  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Implemented an optional pivot row strategy for difficult problems.
+	It is deactivated by default as it is more compute intensive.
+
+2009-12-16  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Tree.cc: Added a more aggressive
+	cutting strategy which generates all possible cuts.
+
+2009-12-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Moved out the cut
+	generation code into a separate method.
+
+2009-12-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Moved huge block of code out of useless 'else'
+	block. Code reindentation.
+
+2010-01-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Do not include <iostream> if PPL_NOISY_SIMPLEX
+	is defined to 0.
+
+2010-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/bump_copyright_years: Extended copyright years.
+
+2010-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 4d6c6db0470eb60cecbbed0a43a2b08d8539e95f Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Fri Jan 1 16:36:10 2010 +0100
+
+2010-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am, demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/ppl_pips.cc, devtools/bump_copyright_years,
+	interfaces/C/tests/pip_test.c, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+	src/PIP_Problem.templates.hh, src/PIP_Problem.types.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	src/PIP_Tree.types.hh, tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc,
+	tests/PIP_Problem/exceptions1.cc, tests/PIP_Problem/pipproblem1.cc,
+	tests/PIP_Problem/pipproblem2.cc: Extended copyright years.
+
+2010-01-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 488f55fbe874c4f3a85c0c0db8c59f7e83d615e0 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Fri Jan 1 16:28:45 2010 +0100
+
+2009-12-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 99a040ae53ddf2e369340274eb34d5211b1c642a Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Wed Dec 30 17:43:41 2009 +0100
+
+2009-12-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am: Support building the Java
+	interface on MinGW.
+
+2009-12-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Document conditionals.
+
+2009-12-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Restore the use of the `win32-dll' Libtool option.
+	Use -no-undefined on all variants of Cygwin and MinGW.
+
+2009-12-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/Makefile.am: Correction for
+	platforms where not all floating point types are supported.
+
+2009-12-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Use the right
+	assignment operator.
+
+2009-12-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc: Expected failures
+	revised.
+
+2009-12-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc: Expected failured
+	revised.
+
+2009-12-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Typo fixed.
+
+2009-12-29  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh, src/Box.defs.hh,
+	src/Box.templates.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.templates.hh,
+	tests/Floating_Point_Expression/bdshape1.cc,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/octagonalshape1.cc,
+	tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc: Renamed affine_image
+	on Linear Forms into affine_form_image.
+
+2009-12-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Use the
+	general assignment and comparison functions.
+
+2009-12-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit e86e2471429982e8141789e4adeb6ddd0cc1e326 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Dec 28 20:26:04 2009 +0100
+
+2009-12-28  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Multiplication_Floating_Point_Expression.templates.hh: 
+	Improved Multiplication_Floating_Point_Expression::linearize.
+
+2009-12-26  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Box.defs.hh, src/Box.templates.hh,
+	src/Octagonal_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Implemented
+	Box<ITV>::affine_image on Interval Linear Forms.  Tests in
+	tests/Floating_Point_Expression actually use only IEEE754 floating
+	point format.
+
+2009-12-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-12-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, Watchdog/INSTALL, Watchdog/compile,
+	Watchdog/config.guess, Watchdog/config.sub, compile, config.guess,
+	config.sub: Updated.
+
+2009-12-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 4e2145f8d498bc3ea055a06a1244de677b7bbab5 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Dec 22 09:30:55 2009 +0100
+
+2009-12-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Boundary.defs.hh,
+	src/Circular_Interval.defs.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/checked_float.inlines.hh, src/globals.defs.hh: Never leave
+	operators at end of line.
+
+2009-12-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh, src/Circular_Interval.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.templates.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/MIP_Problem.cc,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/checked_float.inlines.hh, src/wrap_assign.hh: Never leave
+	operators at end of line.
+
+2009-12-20  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Float.defs.hh, src/Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape1.cc,
+	tests/Floating_Point_Expression/bdshape2.cc,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/linearform1.cc,
+	tests/Floating_Point_Expression/octagonalshape1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc,
+	tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc: Several corrections
+	in tests and source code.  Now, in all tests of
+	tests/Floating_Point_Expression/ we assume that analyzer format must
+	be less precise or equal than analyzed format.
+
+2009-12-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 9784b8165b6cb1dea5eb6d20b4cebca7ecc780fd Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Dec 19 11:46:22 2009 +0100
+
+2009-12-14  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Floating_Point_Expression.templates.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Added Linear
+	Form Intervalization on rate limiter test.
+
+2009-12-11  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Improved
+	test01, ..., test04.
+
+2009-12-07  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/ratelimiter.cc: Removed redundant
+	code.
+
+2009-12-02  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Fixed
+	comments.
+
+2009-11-30  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.defs.hh: Improved the documentation of the PIP
+	solver.
+
+2009-11-30  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/pip_test.c, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh, tests/PIP_Problem/pipproblem1.cc: Simplified
+	the solution tree exploration method.  Including, the
+	PIP_Tree_Node::insert_artificials method has been removed.
+
+2009-11-29  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* tests/Floating_Point_Expression/Makefile.am: Fixed a typo.
+
+2009-11-29  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/ratelimiter.cc: Added a rate limiter
+	test that pass without intersection between the two domain.
+
+2009-11-28  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Improved tests
+	on rate limiter. They all pass now.
+
+2009-11-27  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.defs.hh: Modified the documentation of the
+	PIP_Problem class.
+
+2009-11-27  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixed a regression.
+
+2009-11-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem2.cc: Test test10() in pipproblem2.cc
+	seems to show another bug.
+
+2009-11-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/ascii_dump_load1.cc: Added a few tests for the
+	PIP_Problem ascii_dump/load methods.
+
+2009-11-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc: Properly set status flags when solving a
+	PIP_Problem having no constraints.  Minor correction to ascii_dump
+	method.
+
+2009-11-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: One item added.
+
+2009-11-26  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Changed the cut generation strategy in
+	compatibility_check.  Now several cuts may be generated in a single
+	pass.
+
+2009-11-26  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Changed the pivot row selection algorithm in
+	compatibility_check.  It now selects the row which maximizes the
+	lexico-minimal pivot column.
+
+2009-11-26  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Minor cosmetic code fixes.
+
+2009-11-26  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Moved the lexico-minimum column search algorithm
+	to a separate function.
+
+2009-11-25  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Removed useless utility function.
+
+2009-11-26  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc: Fixed a regression.
+
+2009-11-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.templates.hh, tests/PIP_Problem/exceptions1.cc,
+	tests/PIP_Problem/pipproblem2.cc: PIP_Problem can handle strict
+	inequalities: corresponding checks removed.  Got rid of internal
+	status SATISFIABLE, which was unused.  Corrected several minor typos
+	(missing spaces) in exception messages.  Added a new test
+	(pipproblem2.cc, test09) showing what seems to be a bug.
+
+2009-11-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem2.cc: Test test07() in pipproblem2.cc
+	shows a bug in PIP_Problem.  Apparently, we cannot incrementally add
+	new constraints to a PIP_Problem taht was already solved.
+
+2009-11-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/pipproblem2.cc: Prefer not_a_dimension() as a
+	marker if the big parameter is not set.
+
+2009-11-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/Makefile.am, tests/PIP_Problem/exceptions1.cc: 
+	Started adding tests checking for the right PIP_Problem exceptions
+	are thrown.
+
+2009-11-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/Makefile.am, tests/PIP_Problem/pipproblem2.cc: 
+	Started adding tests to increase coverage.
+
+2009-11-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem1.cc: Minor improvements to avoid
+	assertion failures on iterators.
+
+2009-11-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Started drafting a
+	Prolog interface for PIP_Problem.
+
+2009-11-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc: In
+	PIP_Problem::clear(), do also reset the big parameter dimension.
+	Added C language functions for getting/setting the big parameter
+	dimension.
+
+2009-11-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am, demos/ppl_pips/ppl_pips.cc,
+	interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+	src/PIP_Problem.types.hh, src/PIP_Tree.cc: Enumerations for control
+	parameters put inside class PIP_Problem.  Interfaced methods for
+	getting/setting control parameters (in C).  Other minor stylistic
+	improvements here and there.
+
+2009-11-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.inlines.hh,
+	src/PIP_Problem.templates.hh, src/PIP_Problem.types.hh: Corrected a
+	bug in method swap.  Several minor stylistic improvements.
+
+2009-11-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Item added.
+
+2009-11-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Variable_Floating_Point_Expression.inlines.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Modified tests
+	on rate limiter. Removed useless comments.
+
+2009-11-20  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Optimized the solver main loop using
+	PPL_DIRTY_TEMP_COEFFICIENT's.
+
+2009-11-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Added a rule to the cut methods to always choose
+	the simplest parametric part.  This tends to provide simpler solution trees on some problems.
+
+2009-11-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added a mechanism to avoid
+	generating the same Artificial_Parameter twice.
+
+2009-11-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Added a pointer to parent node in PIP_Tree_Node.
+
+2009-11-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Improved the deepest row selection cut strategy.
+
+2009-11-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Correctly rewrote ascii_dump/ascii_load methods
+	for PIP_Solution_Node.
+
+2009-11-19  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Removed useless debugging display code.
+
+2009-11-16  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Added an option in PIP standalone
+	solver to solve the problem several times.  This may be convenient for benchmarking purposes.
+
+2009-11-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc: Fixed a bug in PIP_Problem copy constructor.
+
+2009-11-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Updated the deepest cut strategy; now only
+	selects rows associated to initial variables.  This results in performance increase in most problems.
+
+2009-11-16  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Minor fix fixes in standalone solver.
+
+2009-11-16  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Fixed a bug in standalone solver when
+	using PIPlib files with a big parameter.
+
+2009-11-13  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Problem.inlines.hh,
+	src/PIP_Problem.templates.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Added support for an arbitrarily big parameter.
+
+2009-11-13  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc, src/PIP_Problem.cc: Switched the
+	default cut generation strategy to first row.
+
+2009-11-13  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc: Fixed a bug.
+
+2009-11-13  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh, src/PIP_Problem.types.hh, src/PIP_Tree.cc: 
+	Added a control parameter for cut generation strategy.
+
+2009-11-10  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Problem.types.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Added a mechanism for setting/getting control parameter values.
+
+2009-11-10  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Made use of virtual methods
+	in PIP_Tree_Node::clone().
+
+2009-11-05  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixed a bug.
+
+2009-11-05  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Removed temporary debug code.
+
+2009-11-05  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Improved the support for
+	equality constraints.
+
+2009-11-04  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Improved basis handling in compatibility_check.
+
+2009-11-04  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Added coherency checks in PIP_Solution_Node.
+
+2009-11-04  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Improved basis handling
+	with support for slack variables and bijective variable mapping.
+
+2009-11-03  François Galea <francois.galea at uvsq.fr>
+
+	* interfaces/C/tests/pip_test.c: Implemented an example of solution
+	tree spanning and display using the C interface.
+
+2009-11-03  François Galea <francois.galea at uvsq.fr>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Tree.defs.hh,
+	src/PIP_Tree.inlines.hh: Implemented the art_parameter_count method;
+	updated the C interface.
+
+2009-11-02  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Implemented Bland's anti-cycling rule in
+	compatibility_check.
+
+2009-11-02  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Proper scaling of cuts in compatiblity_check.
+
+2009-10-30  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Minor fix in PIP standalone solver.
+
+2009-10-29  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Fixed a bug in PIP standalone solver.
+
+2009-10-28  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Fixed one bug in standalone PIP
+	solver.
+
+2009-10-28  François Galea <francois.galea at uvsq.fr>
+
+	* demos/ppl_pips/ppl_pips.cc: Added support for Polylib-formatted
+	files in standalone solver.
+
+2009-10-27  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc,
+	tests/PIP_Problem/pipproblem1.cc: Added support for equality
+	constraints; fixed a bug for strict inequalities.
+
+2009-10-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-10-27  François Galea <francois.galea at uvsq.fr>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Tree.defs.hh: 
+	Fixed the C interface and the documentation for PIP_Tree_Node
+	methods.  The concerned methods are insert_artificials and
+	get_parametric_values.
+
+2009-10-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: Another pass on the C
+	interface for PIP_Problem related classes.  Removed a few useless
+	functions and added a few missing ones, including input/output
+	utilities; also slightly improved the documentation.
+
+2009-10-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	src/PIP_Problem.defs.hh: Interfaced constructor/destructor for
+	Artificial_Parameter_Sequence iterators.  These iterators should be
+	used similarly to the ones defined on systems of constraints or
+	generators.  Corrected a couple of bugs in the documentation.
+
+2009-10-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/pip_test.c: Added increment, dereference and
+	equal functions for
+	ppl_Artificial_Parameter_Sequence_const_iterator_t's Fixed a couple of bugs.
+
+2009-10-23  François Galea <francois.galea at uvsq.fr>
+
+	* interfaces/C/tests/Makefile.am, interfaces/C/tests/pip_test.c: 
+	Added test program for PIP C interface.
+
+2009-10-23  François Galea <francois.galea at uvsq.fr>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/PIP_Problem.cc,
+	src/PIP_Problem.defs.hh: New parameter choice method. Updated the C
+	interface.
+
+2009-10-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README: Refer to PPL 0.11, not 0.10.
+
+2009-10-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-10-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Ditribute also MIP_Problem.types.hh,
+	PIP_Tree.types.hh and PIP_Problem.types.hh.
+
+2009-10-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/Makefile.am: Adapted to the checking of ppl_pips.
+
+2009-10-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_pips/expected_mpz: Put under Git control.
+
+2009-10-22  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Removed invalid optimization in context
+	compatibility check.
+
+2009-10-21  François Galea <francois.galea at uvsq.fr>
+
+	* configure.ac, demos/Makefile.am, demos/ppl_pips/Makefile.am,
+	demos/ppl_pips/examples/Makefile.am,
+	demos/ppl_pips/examples/test02.dat, demos/ppl_pips/ppl_pips.cc: 
+	Added a standalone PIP solver demo program.
+
+2009-10-21  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/pipproblem1.cc: Context compatibility check now
+	searches for valid integer solutions.
+
+2009-10-20  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Parameter compatibility
+	check now applies a revised dual simplex method.
+
+2009-10-20  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Added display of computed row parameter signs in
+	noisy PIP mode.
+
+2009-10-20  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added new test, which should
+	return an empty solution.
+
+2009-10-20  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/definitions.dox, doc/ppl.sty,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Documentation
+	updates.  Fixed parenthesis in ppl.sty as suggested.  Fixed few
+	typos.
+
+2009-10-20  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Always stop compatibility check at first negative
+	row.
+
+2009-10-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Added FIXME
+	notes.
+
+2009-10-16  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Added a test
+	on BD_Shape, improved a test on Polyhedra.
+
+2009-10-16  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Float.defs.hh, src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Added BASE
+	field to floating point struct.  Modified absolute/relative error
+	definition using FP_Format::BASE.  Modified tests using
+	FP_Format::BASE.
+
+2009-10-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Improved the heuristic for the choice of the
+	deepest cut.
+
+2009-10-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Better use of scaling and normalization to keep
+	low coefficient values where possible.
+
+2009-10-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, tests/PIP_Problem/pipproblem1.cc: Corrected
+	invalid compatibility check algorithm.
+
+2009-10-15  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Float.defs.hh: Added float_ibm_single declaration into class
+	Float<T>.
+
+2009-10-14  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/devref.doxyconf-html.in: Added
+	Floating_Point_Expression.templates.hh into documentation.
+
+2009-10-14  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added a test case illustrating
+	an instability in the PIP solver.
+
+2009-10-13  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Modified
+	widening in test05 and test06.
+
+2009-10-13  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Integrality check only on the original variables
+	(not slack ones).
+
+2009-10-13  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Optimized pivot operation.
+
+2009-10-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc: Uncommented C
+	interface code for PIP_Problem assignment.
+
+2009-10-09  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: More functions for the
+	C interface to the PIP Tree class - in particular, corresponding to the PIP_Solution_Node and
+	PIP_Decision_Node C++ methods.  Various small bugs fixed in the PIP_Problem C interface code.
+
+2009-10-09  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc: Fixed various bugs in
+	the C interface for PIP_Problem methods.
+
+2009-10-09  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Improved best pivot row selection heuristic.
+
+2009-10-09  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.inlines.hh: Added several C
+	functions for PIP_Tree_Node and Artificial_Parameter*.
+
+2009-10-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.inlines.hh: Added the c
+	interface for as_decision() and as_solution().
+
+2009-10-09  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/pipproblem1.cc: Fixed memory managment issue in
+	copy constructor of PIP_Problem.
+
+2009-10-09  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc: Added call to the solver to check problem
+	satisfiability.
+
+2009-10-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, tests/PIP_Problem/pipproblem1.cc: Added
+	implementations for PIP_Problem swap and operator= methods.  Added a
+	few consistency checks in method OK().  Pointed out a resource
+	management bug in copy constructor that can result in memory
+	corruption. Added test04() to pipproblem1.cc (currently commented
+	out) showing that a segmentation fault can be obtained when copying
+	a PIP_Problem object having a non-null solution tree.
+
+2009-10-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h: Added missing headers for
+	ppl_PIP_Problem_solve and ppl_PIP_Problem_optimizing_solution.  Variable names made consistent with the domain.  Documentation for ppl_PPI_Problem_is_satisfiable() improved.
+
+2009-10-08  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh: Removed trailing
+	whitespaces.
+
+2009-10-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_implementation_common.cc: Uncommented methods
+	for the C interface for the PIP_Problem.
+
+2009-10-08  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc: Implemeted missing methods.
+
+2009-10-08  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_implementation_common.cc: Uncommented C
+	interface code for add_constraint(), add_constraints() and
+	operator=().
+
+2009-10-07  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc: Implemented missing methods.
+
+2009-10-07  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.inlines.hh: Fixed memory leak.
+
+2009-10-07  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Float.inlines.hh: Removed a comment.
+
+2009-10-07  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h: Commented PIP_Problem code in
+	the C interface that requires methods in the C++ interface that are
+	not yet implemented.  Added declarations for printing the PIP_Problem and PIP_Tree in the
+	tests.
+
+2009-10-07  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_implementation_common.cc: More consistent
+	naming of variables.
+
+2009-10-07  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.inlines.hh: Added 2 more
+	functions for the C interface to the PIP_Problem class.
+
+2009-10-07  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Fixed test05.
+
+2009-10-07  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.inlines.hh: Added a very
+	basic interface for C to the PIP_Problem class.  Note this is incomplete and does not support methods with PIP_Tree.
+
+2009-10-06  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Float.defs.hh, src/Float.inlines.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Using uint16_t
+	instead of uint32_t in float_ieee754_half.  Extended
+	float_ibm_single.
+
+2009-10-06  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Removed
+	useless pointer to problem object in PIP_Tree_Node.
+
+2009-10-06  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.defs.hh: Minor fixes in Doxygen documentation.
+
+2009-10-06  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Improved accuracy of context compatibility
+	checks.
+
+2009-10-06  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Changed
+	loop-guards in the first four test of digitalfilters1.cc
+
+2009-10-06  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Added generation of non-parametric cuts.
+
+2009-10-06  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Improved display in noisy
+	mode.
+
+2009-10-06  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixed bug in compatiblity_check().
+
+2009-10-06  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Fixed test03.
+
+2009-10-06  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Float.defs.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Computed the
+	largest non-infinity number in digitalfilters1.cc Fixed a bug in
+	Float.defs.hh
+
+2009-10-05  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Removed
+	comments.
+
+2009-10-05  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Minor changes.
+
+2009-10-05  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Float.defs.hh, src/Float.inlines.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Extended
+	float_ieee754_half format.  Fixed a function call in test06 with a
+	possible solution.
+
+2009-10-04  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.templates.hh: Removed few comments.
+
+2009-10-05  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Polyhedron.templates.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc: Fixed
+	Polyhedron::refine_with_linear_form_inequality.  Adapted tests on
+	polyhedra.
+
+2009-10-05  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Removed
+	abstract_store parameter of Polyhedron::affine_image and
+	Polyhedron::refine_with_linear_form_inequality in digitalfilters1.cc
+
+2009-10-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Fixed a few
+	typos.
+
+2009-10-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh: Do not use an abstract store: extract
+	lower and upper bounds of variables from the polyhedron itself
+	instead.  Fixed a bug in refine_with_linear_form_inequality that was
+	triggered when both parameters left and right were bounded but left
+	- right was not bounded.
+
+2009-10-05  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Modified test03,
+	test05 and test06.
+
+2009-10-05  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Added code for selection of the deepest cut.
+
+2009-10-04  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Modified
+	test01, test02, test03 and test04.
+
+2009-10-04  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh,
+	tests/PIP_Problem/pipproblem1.cc: Implemented cut generation. Not
+	stable yet.
+
+2009-10-04  François Galea <francois.galea at uvsq.fr>
+
+	* tests/PIP_Problem/pipproblem1.cc: Added test problem.
+
+2009-10-03  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Added widening
+	and extrapolation operators in test01, test02, test03 and test04.
+
+2009-10-03  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Fixed
+	comments.
+
+2009-10-02  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Implemented a
+	test on polyhedra abstract domain with linearization of floating
+	point expressions.
+
+2009-10-02  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Implemented a
+	test on rate limiter which uses octagons abstract domain and
+	linearization of floating point expressions.
+
+2009-10-02  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Unified the common denominator between both matrices of the tableau.
+
+2009-10-01  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape2.cc,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Improved
+	BD_Shape<T>::refine_with_linear_form_inequality.  Corrected
+	BD_Shape<T>::affine_image.  Adapted tests in bshape2.cc and finished
+	test02 in digitalfilters1.cc
+
+2009-10-01  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Fixed bug in
+	BD_Shape<T>::two_variables_affine_image.  Added a first
+	implementation of test02.
+
+2009-10-01  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Implemented
+	test of rate limiter using polyhedra abstract domain.
+
+2009-10-01  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Modified test03
+	and test04.
+
+2009-10-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh: Fixed a few assertions.
+
+2009-10-01  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.inlines.hh,
+	tests/PIP_Problem/pipproblem1.cc: Fixed bugs.
+
+2009-10-01  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/digitalfilters1.cc: Corrected tests
+	with Intervals and Octagons in digitalfilters1.cc.  Temporarily
+	modified tests/Floating_Point_Expression/Makefile.am Implemented
+	Variable_Floating_Point_Expression::linear_form_assign.  Inserted
+	invariant assertions in Octagonal_Shape<T>::affine_image.
+
+2009-10-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh, src/Polyhedron.inlines.hh: Added
+	two TODO notes.
+
+2009-09-30  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Implemented handling of artificial parameters, preparing cut
+	generation.
+
+2009-09-30  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Removed ad
+	useless parameter in linear_form_upperbound();
+
+2009-09-30  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape2.cc: Few tests added; Fixed
+	refine_with_linear_form_inequality();
+
+2009-09-29  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape2.cc: Added few tests; Fixed
+	refine_with_linear_form_inequality() and auxiliary functions;
+	Implemented inline void refine_fp_interval_abstract_store();
+
+2009-09-29  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.templates.hh, src/PIP_Tree.cc,
+	tests/PIP_Problem/pipproblem1.cc: Added support for adding
+	constraints in initial context.
+
+2009-09-29  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc: Proper update of internal
+	state of PIP_Problem object.
+
+2009-09-29  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape2.cc: Added a test.  Fixed a
+	bug in left_one_var_refine().
+
+2009-09-29  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixed regression due to change in index ordering
+	in parameter constraints.
+
+2009-09-29  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Added a
+	preliminary version of test05. Edited previous tests.
+
+2009-09-29  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape2.cc: Added two tests; Fixed
+	a bug in left_one_var_refine() function.
+
+2009-09-28  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/digitalfilters1.cc: Added a first
+	implementation of tests on Octagon and Polyhedra.
+
+2009-09-29  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* tests/Floating_Point_Expression/refinebdshape1.cc: Deleted a
+	useless tests file.
+
+2009-09-28  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/digitalfilters1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc: Started to test
+	analysis on digital filters.  Temporarily modified
+	tests/Floating_Point_Expression/Makefile.am
+
+2009-09-28  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape2.cc,
+	tests/Floating_Point_Expression/refinebdshape1.cc: Fixed few bugs in
+	inhomogeneous_refine();
+
+2009-09-28  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron2.cc: Improved test05
+
+2009-09-28  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/polyhedron2.cc: Fixed test05.
+
+2009-09-28  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron2.cc: Modified test04
+	and test05.
+
+2009-09-26  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron2.cc: Modified
+	poyhedron2.cc in order to test NNC_Polyhedron and
+	Polyhedron::generalized_refine_with_linear_form_inequality.
+
+2009-09-26  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am: Temporarily edited
+	tests/Floating_Point_Expression/Makefile.am
+
+2009-09-26  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron2.cc: Added another
+	test.
+
+2009-09-26  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron2.cc: Added a test in
+	polyhedron2.cc
+
+2009-09-26  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh: Added missing const qualifiers.
+
+2009-09-25  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh: Implemented
+	generalized_refine_with_linear_form_inequality.  Adapted
+	refine_with_linear_form_inequality to accept strict inequalities on
+	not necessarily closed polyhedra.
+
+2009-09-25  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh: Added
+	a trivial implementation of
+	generalized_refine_with_linear_form_inequality.
+
+2009-09-25  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron1.cc: Finished to test
+	Polyhedron::affine_image.
+
+2009-09-25  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/polyhedron1.cc: Fixed test04: do
+	not perform floating point operations outside of the interval domain
+	unless the result can be exactly represented.
+
+2009-09-25  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/polyhedron2.cc: Added a couple of
+	simple tests.  Makefile fixed.
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 8ca4f6890910a146f573d7a45d135aa6a07b6ece Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Thu Sep 24 20:48:16 2009 +0200
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/{pipproblem.cc => pipproblem1.cc}: Renamed to
+	follow the PPL convention on test file naming.
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PIP_Problem/pipproblem.cc: Added test02().
+
+2009-09-24  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/polyhedron1.cc,
+	tests/Floating_Point_Expression/polyhedron2.cc: Fixed test05.  Added
+	a new test file.
+
+2009-09-24  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron1.cc: Added two tests.
+
+2009-09-24  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Removed two
+	unused parameters; Fixed two function calls.
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh: Fixed operator>>(std::istream&,
+	Interval<Boundary, Info>&).
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh: Spurious print statement removed.
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh: Fixed operator>>(std::istream&,
+	Interval<Boundary, Info>&).
+
+2009-09-24  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh: Added the
+	constructor Constant_Floating_Point_Expression(const char*).
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh: Spurious print statement removed.
+
+2009-09-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit e61defee29d0688a72fbe707157351a85c9a35a1 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Thu Sep 24 16:23:44 2009 +0200
+
+2009-09-24  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh: Added a couple of assertions.
+
+2009-09-24  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/polyhedron1.cc: Added some tests
+	in tests/Floating_Point_Expression/polyhedron1.cc
+
+2009-09-24  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Forgot to
+	pass the common denominator to bounded_affine_image.
+
+2009-09-24  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Completed the
+	method refine_with_linear_form_inequality(); added the auxiliary
+	function left_two_var_refine().
+
+2009-09-24  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, tests/PIP_Problem/pipproblem.cc: Added additional
+	check in simplex, leading to simpler decision trees.
+
+2009-09-24  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Always assert
+	that all variables in the abstract store are bounded.  Corrected the
+	documentation accordingly.
+
+2009-09-24  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Polyhedron.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am: Started to test
+	Polyhedron::affine_image on FP_Linear_Form.
+
+2009-09-23  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Removed
+	commented code in floatingpointexpr1.cc
+
+2009-09-23  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc: Improved tests.
+	Now they all pass and reach the maximum coverage.
+
+2009-09-23  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh: Partial
+	implementation of refine_with_linear_form_inequality(); Two
+	auxiliary function added.
+
+2009-09-23  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed
+	indentation.
+
+2009-09-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/octagonalshape1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc: Parametrized
+	tests for Octagonal_Shape.
+
+2009-09-23  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/bdshape1.cc,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/linearform1.cc: Parametrized
+	linearform1.cc and bdshape1.cc Fixed indentation and removed an
+	useless test in floatingpointexpr1.cc
+
+2009-09-23  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc,
+	tests/ppl_test.hh: Added several corrections in order to parametrize
+	floatingpointexpr1.cc
+
+2009-09-23  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/octagonalshape1.cc,
+	tests/ppl_test.hh: Parametrized floatingpointexpr1.cc
+
+2009-09-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh: Made the
+	refine_fp_interval_abstract_store methods inline.
+
+2009-09-23  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Always use Box
+	instead of map for interval abstract stores.
+
+2009-09-23  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Removed
+	useless parameter in PIP_Tree_Node::update_tableau method.
+
+2009-09-23  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh,
+	tests/PIP_Problem/pipproblem.cc: Implemented display of solution
+	trees.
+
+2009-09-23  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixed bugs.
+
+2009-09-23  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Changed index ordering in
+	parameter constraints.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/ppl_test.hh: Fixed another typo that prevented compilation
+	of tests.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/ppl_test.hh: Fixed a typo that prevented compilation of
+	tests.
+
+2009-09-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.defs.hh: Renamed float_IBM_single and float_IBM_double
+	lowering the case for IBM.
+
+2009-09-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/.gitignore,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/run_tests: Added some infrastructure
+	to perform parametric tests.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Float.defs.hh: Added a few details about other floating point
+	formats.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox, src/Polyhedron.defs.hh: Small documentation
+	corrections.
+
+2009-09-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc: Adapted test
+	files to new representation of interval abstract stores.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.templates.hh: Added missing static
+	casts so that tests now pass again.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Use Box to
+	represent an interval abstract store.
+
+2009-09-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/octagonalshape2.cc: Replaced
+	typedefs according to the new policies.
+
+2009-09-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am, tests/{Polyhedron =>
+	Floating_Point_Expression}/linearform1.cc,
+	tests/Floating_Point_Expression/{affineimage3.cc =>
+	octagonalshape1.cc}, tests/Floating_Point_Expression/{refinelf1.cc
+	=> octagonalshape2.cc}, tests/Polyhedron/Makefile.am: Refactoring of
+	test files into test/Floating_Point_Expression.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.templates.hh: Adapted the class to the
+	policies defined in Float.defs.hh.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Pass variables
+	to affine_image by copy.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Written
+	Polyhedron::refine_fp_interval_abstract_store.  Various other
+	corrections.
+
+2009-09-22  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh: Little correction in
+	two_variables_affine_image method.
+
+2009-09-22  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Octagonal_Shape.defs.hh, src/Polyhedron.templates.hh: Fixed one
+	cut-&-paste error.  Use a single call of bounded_affine_image
+	instead of calling generalized_affine_image twice.  Added two FIXME
+	notes.
+
+2009-09-22  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added mechanism for
+	fetching parametric values for variables.
+
+2009-09-22  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh: Added reference to the Problem object in
+	solution tree Nodes.
+
+2009-09-21  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/affineimage3.cc,
+	tests/Floating_Point_Expression/bdshape1.cc: Added another test for
+	the general case of affine_image.
+
+2009-09-21  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape1.cc: Fixed a bug in
+	affine_image and modified one_variable_affine_image.  Added a new
+	test for the general case.
+
+2009-09-21  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape1.cc: Implemented a
+	preliminary (yet untested) version of methods
+	BD_Shape::linear_form_upper_bound and
+	BD_Shape::two_variables_affine_image.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh, tests/ppl_test.hh: Added
+	more floating point formats.  Added some parametric typedefs for
+	tests.
+
+2009-09-21  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Bug fixes.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Added a few lines of documentation
+	that were previously forgotten.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh: Added some more documentation.
+
+2009-09-21  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape1.cc: Fixed a bug in
+	affine_image and implemented three new tests.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh: Added some
+	(and corrected some of the) documentation.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Wrote a first
+	implementation of refine_with_linear_form_inequality.
+
+2009-09-21  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape1.cc: Fixed a bug in
+	BD_Shape<T>::affine_image and added more tests for this method.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc: Use the
+	proper exception thrower.  Moved the new exception thrower.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh, src/Polyhedron_nonpublic.cc: Various
+	corrections.
+
+2009-09-21  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh: Finished writing a first version of
+	our affine_image variant.
+
+2009-09-20  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.templates.hh: Removed a temporary using sub_assign_r
+	instead of add_assign_r
+
+2009-09-20  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/bdshape1.cc: Bugs fixes
+
+2009-09-19  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Finished
+	writing a first implementation of convert_to_integer_expression and
+	convert_to_integer_expressions.
+
+2009-09-19  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh: Small progress in writing
+	convert_to_integer_expressions.
+
+2009-09-19  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Sterted
+	writing the functions that are used to convert floating point
+	constraints to integer ones.
+
+2009-09-19  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	src/Octagonal_Shape.templates.hh: Implemented methods
+	BD_Shape<T>::inhomogeneous_affine_image and
+	BD_Shape<T>::one_variable_affine_image.
+
+2009-09-19  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/math_utilities.defs.hh, src/math_utilities.inlines.hh: 
+	Converted helpers to work also for native numbers.
+
+2009-09-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh: Make sure the latest changes to NDEBUG
+	effective.
+
+2009-09-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/affineimage3.cc,
+	tests/Floating_Point_Expression/bdshape1.cc,
+	tests/Floating_Point_Expression/refinelf1.cc: Added a test for
+	trivial cases of BD_Shape::affine_image.
+
+2009-09-18  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh,
+	src/Polyhedron_nonpublic.cc: Started the implementation of our
+	affine_image variant.
+
+2009-09-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Floating_Point_Expression/refinelf1.cc: Added test for
+	Octagonal_Shape<T>::refine_fp_interval_abstract_store.
+
+2009-09-18  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/bdshape1.cc: Added function
+	                    BD_Shape::affine_image(const Variable& var, const Linear_Form<
+	Interval<T, Interval_Info> >& lf); Added interfaces for auxiliary
+		functions: BD_Shape::inhomogeneous_affine_image(...); 	BD_Shape::one_variable_affine_image(...); 	BD_Shape::two_variable_affine_image(...); Added a preliminary test.
+
+2009-09-18  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Added a first
+	implementation of overapproximate_linear_form.
+
+2009-09-18  Francois GALEA <fgalea at verlaine.prism.uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Fixed ASCII dump/load
+	methods, solving compilation issues.
+
+2009-09-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Coverage of 100%
+	reached for refine_with_linear_form_inequality.
+
+2009-09-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Added a test.
+
+2009-09-18  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/Floating_Point_Expression/refinelf1.cc: Added missing
+	multiplications by 2.  All tests now pass.
+
+2009-09-18  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron.templates.hh: Added
+	interfaces (and empty body) of two new methods.
+
+2009-09-18  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/affineimage3.cc,
+	tests/Floating_Point_Expression/refinelf1.cc: Added two more tests
+	in refinelf1.cc Improved a test in affineimage3.cc
+
+2009-09-18  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Finished parametric simplex algorithm. No cut
+	generation yet.
+
+2009-09-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Added Roberto Amadini to the list of current
+	contributors.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Pass variables to affine_image as const references.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Removed the check on
+	empty octagons in function test01.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Removed useless emptiness check.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Assert that the octagon is not
+	empty when refining, since the analyzer should not try to apply
+	filters in an unreachable state.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Do not reset strong closure
+	manually since add_octagonal_constraint already does it
+	automatically.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Always use
+	add_octagon_constraint to update contraints in
+	refine_with_linear_form_inequality instead of overwriting blindly.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Removed a bug in
+	test functions. Added a test for general case.
+
+2009-09-17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Fixed several rounding modes in
+	Octagonal_Shape methods.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Added two tests.
+	Particular cases totally covered.
+
+2009-09-17  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Temp.defs.hh, src/Temp.inlines.hh: Fixed and simplified
+	DIRTY_TEMP for use with -fno-elide-constructors.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Removed comments.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Added another test.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Fixed one nasty cut & paste
+	error.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Added a test.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Use references instead of
+	pointers whenever possible.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Added and modified
+	tests.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Optimized
+	refine_with_linear_form_inequality, removing six temporaries in the
+	process.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/refinelf1.cc: Added two tests.
+
+2009-09-17  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am: Start to test
+	Octagonal_Shape::refine_with_linear_form_inequality.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Removed unnecessary temporaries
+	from affine_image.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Optimized
+	linear_form_upper_bound: got rid of two unnecessary temporaries.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Definitively removed
+	counterproductive checks in linear_form_upper_bound, since we have
+	confirmed that comparing with -infinity is legitimate.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Use ROUND_DOWN instead of
+	ROUND_UP to compute the negation of the upper bound of -var.
+
+2009-09-17  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Use ROUND_UP (or, in one case
+	where intervals are involved, ROUND_DOWN) whenever appropriate.
+
+2009-09-16  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/Floating_Point_Expression/affineimage3.cc: Added another test.
+	Coverage of 100% reached for affine_image and
+	linear_form_upper_bound methods.  Temporarily(?) removed some checks
+	in linear_form_upper_bound.
+
+2009-09-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Fixes to avoid some useless Coefficient
+	duplicates.
+
+2009-09-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Implemented the Rational_Matrix normalize method.
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox, src/Octagonal_Shape.defs.hh: Small
+	documentation improvements.
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Added some comments.
+
+2009-09-16  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/affineimage3.cc: Implemented tests
+	(from test04 to test08).
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Fixed a couple of syntax errors.
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Many corrections.
+
+2009-09-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented additional
+	 steps of the simplex algorithm.  - handling of simplex rows with mixed parameter sign;  - handling of tautology expressions;  - handling of splitting a solution according to a test parametric
+	 expression.
+
+2009-09-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Modified prototype for solve method in PIP_Tree_Node and derivates.
+
+2009-09-16  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Redefined and implemented
+	the tree node constructors.
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Use PPL_COMPILE_TIME_CHECK
+	insteas of PPL_ASSERT whenever possible.
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Fixed one typo.
+
+2009-09-16  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Added more cases for
+	refine_linear_form_inequality.
+
+2009-09-16  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Linear_Form.templates.hh, src/Octagonal_Shape.templates.hh,
+	tests/Floating_Point_Expression/affineimage3.cc: Fixed a bug in
+	Linear_Form::operator<<() Fixed a bug in
+	Octagonal_Shape::linear_form_upper_bound() Added a test
+
+2009-09-14  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Removed garbage
+
+2009-09-16  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/affineimage3.cc: Added some tests.
+
+2009-09-15  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Added a first, untested implementation of
+	refine_fp_interval_abstract_store.
+
+2009-09-15  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: For consistency, use
+	std::numeric_limits<T>::is_exact in order to check if T is a
+	floating point type.
+
+2009-09-15  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Added a first implementation of
+	refine_with_linear_form_inequality.  Two small optimizations for
+	affine_image.
+
+2009-09-15  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/affineimage3.cc: Added new test.
+
+2009-09-15  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented simplex pivot
+	on rational matrices.
+
+2009-09-15  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/affineimage3.cc: Added a test for
+	Octagonal_Shape::affine_image in
+	tests/Floating_Point_Expression/affineimage3.cc
+
+2009-09-15  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Fixed a few typos preventing
+	compilation.
+
+2009-09-15  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Added missing assertion and FIXME note.  Started the implementation
+	of refine_with_linear_form_inequality.
+
+2009-09-15  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: It is NECESSARY to delay the
+	update of unary constraints on var.
+
+2009-09-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/c_streambuf.defs.hh: Added missing comment.
+
+2009-09-14  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Fixed two serious bugs in
+	linear_form_upper_bound.
+
+2009-09-14  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc: Implemented the first steps of the parametric
+	simplex algorithm.
+
+2009-09-14  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh: Fixed an error introduced by
+	previous commit.
+
+2009-09-14  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.templates.hh: Added missing static_casts in
+	Linear_Form.  Fixed one bug in linear_form_upper_bound.  Added a
+	first complete implementation of affine_image.
+
+2009-09-14  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Changed
+	modelization of contexts from Constraint_System to Matrix.
+
+2009-09-14  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Added another helper function.  Removed garbage code.
+
+2009-09-13  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Added an auxiliary method.  Sorry for the huge amount of commented
+	code: it will be fixed soon.
+
+2009-09-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/marked_pointers.hh: Do not include <stdint.h>.  The
+	header files <stdint.h> and/or <inttypes.h> are included by
+	ppl-config.h.
+
+2009-09-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Make sure uintptr_t is defined, if at all possible.
+
+2009-09-11  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: Moved the
+	constraint() method to PIP_Tree_Node class.
+
+2009-09-11  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Removed outdated FIXME note.
+
+2009-09-11  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Added other simple cases of
+	affine_image.
+
+2009-09-11  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Added first tests in OK()
+	methods of PIP_Tree classes.
+
+2009-09-11  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented integer context
+	compatibility check.
+
+2009-09-11  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Implemented another case for
+	affine_image.
+
+2009-09-11  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented row sign
+	detection.
+
+2009-09-11  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Implemented constraint negation, plus minor fixes.
+
+2009-09-11  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Added a skeleton for the rest of
+	the affine_image implementation.
+
+2009-09-11  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Now the trivial case of
+	affine_image works.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Written a preliminary, non
+	working first part of our variant of affine_image.
+
+2009-09-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc: Improved recently added helper functions.    - avoid recomputing loop bounds at each iteration;   - delay object definitions until actually needed and, if possible,     provide them with an initializer.
+
+2009-09-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Fix compilation problems
+	when assertions are turned on.
+
+2009-09-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Identifiers starting with
+	an underscore are reserved: avoid them.
+
+2009-09-10  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented some helper
+	functions for the PIP solver.
+
+2009-09-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS: Suggest using -fno-elide-constructors when configuring
+	for coverage.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Variable_Floating_Point_Expression.defs.hh: Fixed another
+	small documentation inconsistency.
+
+2009-09-10  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh, src/PIP_Tree.cc,
+	src/PIP_Tree.defs.hh: Integrated the solve method in the different
+	PIP_Tree node classes.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Division_Floating_Point_Expression.defs.hh: Fixed another
+	small error in the documentation.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh: Other small
+	corrections to the documentation.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Multiplication_Floating_Point_Expression.defs.hh: Fixed one
+	small typo.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/ppl.sty: Remove all references to floating point format f.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh: More additions and
+	corrections to the documentation.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Grammar fix in the
+	documentation.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Fixed one small error.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Sum_Floating_Point_Expression.defs.hh: Fixed another
+	inconsistency in the documentation.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Fixed conflicts.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: Fixed an inconsistency with the rest of the
+	documentation.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Fixed a few errors.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Added missing \brief
+	marker.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Multiplication_Floating_Point_Expression.defs.hh: Use \otimes
+	only in math environment.
+
+2009-09-10  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Revised and
+	corrected the whole documentation.
+
+2009-09-10  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/linearform1.cc,
+	tests/Polyhedron/linearform1.cc: Moved linearform1.cc into
+	tests/Polyhedron.
+
+2009-09-10  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh: Updated intervalize
+	documentation; Updated Opposite_Floating_Point_Expression
+	documentation;
+
+2009-09-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh: Removed spurious
+	occurrence of a closing comment, preventing compilation.
+
+2009-09-09  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/linearform1.cc: Improved test for
+	class Linear_Form.
+
+2009-09-09  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/ppl.sty, src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh: Fixed few typo
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Division_Floating_Point_Expression.defs.hh: Fixed typo.
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh: Use \infty instead
+	of \infinity.
+
+2009-09-09  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Updated
+	documentation
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh: 
+	Predisposed everything to start implementing our own customized
+	version of method affine_image.
+
+2009-09-09  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Linear_Form.templates.hh,
+	tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/linearform1.cc: Fixed bug in
+	Linear_Form.  Copied linearform1.cc in
+	tests/Floating_Point_Expression and improved its tests.
+
+2009-09-09  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: Implemented proper handling
+	of nonbasic variables when adding rows.
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: Use \defeq instead of = for definitions.
+	Fixed an error concerning frames.
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: Use new linearization macro.
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: Removed trailing whitespace.
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: More documentation.
+
+2009-09-09  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh: Fixed a bug in operator==.
+
+2009-09-09  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/ppl.sty: Added new macros into doc/ppl.sty
+
+2009-09-08  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/devref.doxyconf-html.in, src/Linear_Form.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh: Added Linear_Form into
+	doxyconf file Fixed few typos in Linear_Form Minor Documentations
+	updates
+
+2009-09-08  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added and
+	modified tests in order to reach the coverage of 100% in
+	Floating_Point_Expression class and its derived classes.
+
+2009-09-08  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: Fixed pedix.
+
+2009-09-08  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox: Fixed an error in command invocation.
+
+2009-09-08  Fabio Bossi <bossi at cs.unipr.it>
+
+	* doc/definitions.dox, doc/ppl.sty: Added some documentation.
+
+2009-09-08  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Update variale and
+	constant documentations
+
+2009-09-08  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/ppl.sty: Added Latex macro for abstract division.
+
+2009-09-08  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Removed
+	useless comments.
+
+2009-09-08  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added test
+	for unary minus and multiplication by constant.
+
+2009-09-08  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/ppl.sty, src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh: Updated linearization
+	documentation; Added formulas to class descriptions;
+
+2009-09-08  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/ppl.sty, src/Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh: Fixed documentation
+
+2009-09-08  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Moved the simplex tableau from PIP_Problem to PIP_Solution_Node.
+
+2009-09-08  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Notify that open intervals
+	should not be allowed.
+
+2009-09-08  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Documentation improved.
+
+2009-09-08  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Deleted
+	FIXME note.
+
+2009-09-08  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added and
+	modified some tests.
+
+2009-09-07  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Update documentation
+
+2009-09-07  Roberto Amadini <r.amadini at virgilio.it>
+
+	* src/Floating_Point_Expression.templates.hh,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed a bug
+	in method relative_error.  Edited test06 to cope with the new
+	interface of method linearize.
+
+2009-09-07  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added one
+	test.
+
+2009-09-07  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Extended
+	method linearize to also accept a linear form abstract store.
+	Adjusted tests (but NOT YET THE DOCUMENTATION) accordingly.
+
+2009-09-07  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Documentation
+	updates
+
+2009-09-07  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.templates.hh: Do not ignore
+	undefined variables while intervalizing: assert that they are
+	defined instead.
+
+2009-09-07  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Linear_Form.templates.hh,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc: Fixed a bug
+	in Linar_Form::operator== where zero coefficients were not treated
+	properly. Added a few simple tests for class
+	Floating_Point_Expression.
+
+2009-09-07  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added more
+	typedefs and one test.
+
+2009-09-07  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added two
+	simple tests.
+
+2009-09-07  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Fixed comments and
+	documentation
+
+2009-09-07  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Made absolute_error
+	constant.
+
+2009-09-04  François Galea <francois.galea at uvsq.fr>
+
+	* src/Makefile.am: Fixed missing make dependency for recently added
+	header file.
+
+2009-09-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.templates.hh: Fixed erroneous use of
+	const&.
+
+2009-09-05  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Linear_Form.defs.hh, src/Linear_Form.templates.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh: Added operator/=
+	and method negate for class Linear_Form.  Refactored code of class
+	Floating_Point_Exception and its derivate classes in order to avoid
+	creating unnecessary temporaries.
+
+2009-09-04  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Added more
+	documentation
+
+2009-09-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc: Corrected bug in
+	PIP_Problem::add_space_dimensions_and_embed().
+
+2009-09-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh: Corrected a couple of typos in
+	documentation of Variables_Set.
+
+2009-09-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.inlines.hh: Implemented
+	methods querying/adding space dimensions and parameters.
+
+2009-09-04  Fabio Bossi <bossi at cs.unipr.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Added
+	necessary typedefs for tests. Removed garbage.
+
+2009-09-04  François Galea <francois.galea at uvsq.fr>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh: 
+	Implemented simplex basis and tableau initialization in PIP solver.
+
+2009-09-04  François Galea <francois.galea at uvsq.fr>
+
+	* doc/devref.doxyconf-html.in: Included the PIP_Problem and PIP_Tree
+	classes in the devref documentation.
+
+2009-09-04  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Division_Floating_Point_Expression.templates.hh: Added a
+	workaround for the fact that we don't have an explicit way to divide
+	a Linear_Form by an Interval.
+
+2009-09-04  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh: Fixed
+	various errors.
+
+2009-09-04  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Variable_Floating_Point_Expression.inlines.hh: Fixed bad use
+	of constructor.
+
+2009-09-04  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.templates.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh: Style
+	improvements.
+
+2009-09-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Listed François Galea among the current contributors.
+
+2009-09-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh: Drafted
+	implementation for ascii_dump and ascii_load methods.
+
+2009-09-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Makefile.am, tests/PIP_Problem/pipproblem.cc: Do perform
+	PIP_Problem tests first.
+
+2009-09-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh: Minor coding style improvements.
+
+2009-09-02  François Galea <francois.galea at uvsq.fr>
+
+	* configure.ac, src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Problem.templates.hh,
+	tests/Makefile.am, tests/PIP_Problem/Makefile.am,
+	tests/PIP_Problem/pipproblem.cc: Started the implementation of the
+	PIP_Problem class.  In particular: - defined the PIP_Problem constructors; - added the definition of the rational matrix class; - added the definition of simplex tableau; - created a test program.
+
+2009-09-03  Roberto Amadini <r.amadini at virgilio.it>
+
+	* tests/Floating_Point_Expression/floatingpointexpr1.cc: Deleted a
+	superfluous test.
+
+2009-09-03  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* doc/devref.doxyconf-html.in,
+	src/Constant_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Added some
+	documentation.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh: Use 0 instead of NULL.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.templates.hh: Fixed an error in
+	relative_error.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh: Fixed erroneous
+	declarations of namespace std inside namespace
+	Parma_Polyhedra_Library.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh: Fixed many errors.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.templates.hh: Fixed a few typos.
+
+2009-09-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac, tests/Floating_Point_Expression/Makefile.am,
+	tests/Floating_Point_Expression/floatingpointexpr1.cc,
+	tests/Makefile.am: Added a test directory (and a dummy test file).
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Interval.defs.hh, src/Interval.inlines.hh: Added a temporary
+	implementation for external method neg_assign.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.defs.hh: Fixed inclusions.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.types.hh,
+	src/Sum_Floating_Point_Expression.types.hh: Fixed inclusion guards.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Added necessary static_cast
+	when computing absolute error.
+
+2009-09-03  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.templates.hh,
+	src/Makefile.am,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Sum_Floating_Point_Expression.templates.hh: Implemented
+	linearization operator for Division_Floating_Point_Expression.
+	Fixed several typos.
+
+2009-09-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Added Fabio Biselli to the list of current contributors.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.templates.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.templates.hh, src/Makefile.am,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.templates.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh: Added linearization
+	operator for Multiplication_Floating_Point_Expression.  Several
+	other corrections and improvements.
+
+2009-09-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Added Fabio Bossi to the list of current contributors.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Division_Floating_Point_Expression.inlines.hh,
+	src/Makefile.am,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh: Removed dummy
+	linearization operators.  Implemented the linearization operator for
+	Opposite_Floating_Point_Expression.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.templates.hh,
+	src/Makefile.am, src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.templates.hh: Added a few more
+	implementations of the linearization operator.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.templates.hh, src/Makefile.am: Added a
+	first implementation of the relative_error and intervalize methods.
+	Fixed a mistake with loops over linear forms.  Several style
+	improvements.
+
+2009-09-02  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh: Rewritten according to
+	Enea's indications.
+
+2009-09-01  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh: Added swap functions
+	and inhibited assignment and copy constructor.
+
+2009-09-01  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh: Removed
+	trailing whitespaces.
+
+2009-09-01  Fabio Biselli <fabio.biselli at studenti.unipr.it>
+
+	* src/Difference_Floating_Point_Expression.defs.hh,
+	src/Difference_Floating_Point_Expression.inlines.hh,
+	src/Difference_Floating_Point_Expression.types.hh,
+	src/Division_Floating_Point_Expression.defs.hh,
+	src/Division_Floating_Point_Expression.inlines.hh,
+	src/Division_Floating_Point_Expression.types.hh,
+	src/Multiplication_Floating_Point_Expression.defs.hh,
+	src/Multiplication_Floating_Point_Expression.inlines.hh,
+	src/Multiplication_Floating_Point_Expression.types.hh,
+	src/Sum_Floating_Point_Expression.defs.hh,
+	src/Sum_Floating_Point_Expression.inlines.hh,
+	src/Sum_Floating_Point_Expression.types.hh: Added a few more classes
+	for floating point expressions.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh: Corrected absolute error
+	calculation to account for underflows.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh: Added static helper
+	methods and a few policy classes.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.defs.hh: Made constructors
+	explicit.
+
+2009-09-02  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh: Fixed code
+	according to Enea's indications.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Opposite_Floating_Point_Expression.inlines.hh: Added
+	destructor implementation.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Opposite_Floating_Point_Expression.inlines.hh: Fixed a typo.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh: Added swapping
+	functions.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Opposite_Floating_Point_Expression.defs.hh,
+	src/Opposite_Floating_Point_Expression.inlines.hh,
+	src/Opposite_Floating_Point_Expression.types.hh: Added the files for
+	the first (incomplete) version of class
+	Opposite_Floating_Point_Expression
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.inlines.hh: Fixed an error
+	in method linearize.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Makefile.am, src/Variable_Floating_Point_Expression.defs.hh,
+	src/Variable_Floating_Point_Expression.inlines.hh,
+	src/Variable_Floating_Point_Expression.types.hh: Added a first
+	version of class Variable_Floating_Point_Expression.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh: Corrected the
+	interface of the two-argument constructor.
+
+2009-09-01  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.defs.hh: Corrected the interface of
+	method linearize.
+
+2009-08-31  Fabio Bossi <bossi at cs.unipr.it>
+
+	* src/Constant_Floating_Point_Expression.defs.hh,
+	src/Constant_Floating_Point_Expression.inlines.hh,
+	src/Constant_Floating_Point_Expression.types.hh,
+	src/Floating_Point_Expression.defs.hh,
+	src/Floating_Point_Expression.inlines.hh,
+	src/Floating_Point_Expression.types.hh, src/Makefile.am: Added a few
+	classes that represent floating point expressions.
+
+2009-08-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh: Typo fixed.
+
+2009-08-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit c9ec5bc2cb674fd20a8cdc4c85b93361428ed8e2 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Aug 18 09:57:45 2009 +0200
+
+2009-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Form.defs.hh: Started adjusting the documentation.
+
+2009-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Form.defs.hh, src/Linear_Form.inlines.hh,
+	src/Linear_Form.templates.hh: Implemented
+	Linear_Form::external_memory_in_bytes() and
+	Linear_Form::external_memory_in_bytes().  Other minor improvements.
+
+2009-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc: Do not use std::swap(): use
+	Linear_Expression::swap() instead.
+
+2009-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Form.cc, src/Linear_Form.defs.hh,
+	src/Linear_Form.inlines.hh, src/Linear_Form.templates.hh,
+	src/Linear_Form.types.hh, src/Makefile.am,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/linearform1.cc: Added
+	a preliminary implementation of class Linear_Form.
+
+2009-08-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc: Added missing inclusion of <iostream>.
+
+2009-08-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention correction of bug in Pointset_Powerset
+	maximize/minimize methods.
+
+2009-08-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh: Indentation fixed.
+
+2009-08-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh: Corrected a bug in
+	Pointset_Powerset methods minimize() and maximize().  We now return
+	false if the powerset is found to be empty.
+
+2009-08-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc, tests/Polyhedron/max_min1.cc,
+	tests/Powerset/maxmin1.cc: Corrected a few expected results in
+	Powerset/maxmin1.cc.  This uncovered a bug in Pointset_Powerset
+	methods maximize() and minimize(), whereby we are returning true
+	even for empty powersets.
+
+2009-08-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-08-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4: 
+	Useless, commented-out inclusion removed.
+
+2009-08-07  Abramo Bagnara <abramo at localhost.localdomain>
+
+	* interfaces/C/Makefile.am,
+	interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m
+	4, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	interfaces/Prolog/tests/Makefile.am,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl.m4, utils/cm_cleaner.sh, utils/cm_splitter.sh: Modified
+	cm_splitter machinery to avoid use of 'read' shell builtin.
+
+2009-08-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention a bug that was recently corrected.
+
+2009-08-07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc, tests/Polyhedron/polyhullifexact2.cc: 
+	Corrected implementation of
+	NNC_Polyhedron::upper_bound_assign_if_exact().  Added a few tests
+	for regression checking.
+
+2009-08-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_prolog_generated_test.pl: Make sure a
+	definition for member/2 and append/3 is available.
+
+2009-08-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4: Removed useless, temporary addition of
+	-lm to LIBS.  (Thanks to Joseph Prostko.)
+
+2009-08-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Checks reordered.
+
+2009-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Use AC_SEARCH_LIBS to detect whether -lm must be
+	provided to the linker.  (Thanks to Joseph Prostko.)
+
+2009-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am: Do not add -lm to LDADD for
+	*randphull1.
+
+2009-08-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am: Do not link with -lm here.
+
+2009-07-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, interfaces/Prolog/YAP/Makefile.am,
+	m4/ac_check_yap.m4: Improved and generalized the detection of YAP.
+
+2009-07-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, Watchdog/INSTALL: Updated from Autoconf 2.64.
+
+2009-07-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-07-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4: On Windows, the console version of
+	SWI-Prolog is called `plcon'.
+
+2009-07-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/weightwatch1.cc: Adjusted weight thresholds.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Debugging prints improved.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Weights adjusted.  Added more debugging
+	prints.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc: More weights adjusted.  Added a couple of
+	debugging prints.
+
+2009-07-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Added printing of MIP solver recursion level
+	for (noisy) debugging.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh, src/MIP_Problem.cc: Added some weights.
+	Added some debugging prints.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Todo items reorganized.  Removed the one about NOT_EQUAL.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-07-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_clpq.pl,
+	interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	interfaces/Prolog/XSB/xsb_clpq.P,
+	interfaces/Prolog/XSB/xsb_clpq2.P,
+	interfaces/Prolog/XSB/xsb_pl_check.P: The *_and_minimize/N
+	predicates have gone: remove residual references to them.
+
+2009-07-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: Added WEIGHT_BEGIN and corrected
+	WEIGHT_ADD_MUL macro.
+
+2009-07-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Added WEIGHT_BEGIN() macros and reset a few
+	weights.
+
+2009-07-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/conversion.cc, src/globals.defs.hh: Added profiled weights.
+
+2009-07-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: Modified computational weight for
+	propagate_constraints.
+
+2009-07-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Added tentative computational weights to
+	MIP_Problem.
+
+2009-07-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/conversion.cc: Fixed WEIGHT_ADD use.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc: WEIGHT_ADD moved.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/globals.inlines.hh: Removed forgotten WEIGHT_ADD.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Weight_Profiler.cc: Don't compile Weight_Profiler if it's not
+	used.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Weight_Profiler.defs.hh: Minor formatting improvements.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc: Use less simplistic weights.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assert.hh: Comment improved.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/Threshold_Watcher.defs.hh: Added additional info
+	about Traits template parameter.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Weight_Profiler.defs.hh, src/globals.defs.hh,
+	src/globals.inlines.hh: Converted weight threshold to unsigned long
+	long.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Box.templates.hh, src/MIP_Problem.cc, src/Makefile.am,
+	src/Weight_Profiler.cc, src/Weight_Profiler.defs.hh, src/assert.hh,
+	src/conversion.cc, src/globals.defs.hh, src/globals.inlines.hh: 
+	Added weight profiler
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/test1.ml: In the Ocaml tests, timeouts are
+	now reset unconditionally.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh: Drafted a few missing comments. To
+	be completed (by the author).
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Box.defs.hh,
+	src/Octagonal_Shape.defs.hh: Added the documentation of some
+	parameters.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh: Doxygen reference fixed.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh, src/Grid.defs.hh,
+	src/Polyhedron.defs.hh: Fixed several documentation bugs signalled
+	by Doxygen.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/assert.hh: Removed repeated declaration.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/assert.hh, src/globals.cc, src/globals.inlines.hh: Moved
+	in_assert in Implementation namespace.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc: Warnings avoided.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh: Warnings avoided.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc: Spurious parenthesis removed.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Announced availability of the deterministic timeout
+	facilities.
+
+2009-07-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Affine_Space.cc, src/Ask_Tell.inlines.hh,
+	src/Ask_Tell.templates.hh, src/BDS_Status.inlines.hh,
+	src/BD_Shape.cc, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/BHRZ03_Certificate.cc,
+	src/BHRZ03_Certificate.defs.hh, src/BHRZ03_Certificate.inlines.hh,
+	src/Bit_Matrix.cc, src/Bit_Matrix.inlines.hh, src/Bit_Row.cc,
+	src/Bit_Row.inlines.hh, src/Bool4.defs.hh, src/Boundary.defs.hh,
+	src/Box.cc, src/Box.inlines.hh, src/Box.templates.hh,
+	src/Box_Status.inlines.hh, src/C_Polyhedron.cc,
+	src/Checked_Number.inlines.hh, src/Checked_Number.templates.hh,
+	src/Circular_Interval.defs.hh, src/Coefficient.cc,
+	src/Coefficient.inlines.hh, src/Congruence.cc,
+	src/Congruence.inlines.hh, src/Congruence_System.cc,
+	src/Congruence_System.inlines.hh, src/Constraint.cc,
+	src/Constraint.inlines.hh, src/Constraint_System.cc,
+	src/Constraint_System.inlines.hh, src/DB_Matrix.inlines.hh,
+	src/DB_Matrix.templates.hh, src/DB_Row.inlines.hh,
+	src/DB_Row.templates.hh, src/Determinate.defs.hh,
+	src/Determinate.inlines.hh, src/Float.defs.hh,
+	src/GMP_Integer.inlines.hh, src/Generator.cc,
+	src/Generator.inlines.hh, src/Generator_System.cc,
+	src/Generator_System.inlines.hh, src/Grid.inlines.hh,
+	src/Grid.templates.hh, src/Grid_Certificate.cc,
+	src/Grid_Certificate.defs.hh, src/Grid_Certificate.inlines.hh,
+	src/Grid_Generator.cc, src/Grid_Generator.inlines.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.inlines.hh,
+	src/Grid_Status.cc, src/Grid_chdims.cc, src/Grid_conversion.cc,
+	src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	src/Grid_widenings.cc, src/H79_Certificate.cc,
+	src/H79_Certificate.defs.hh, src/Interval.defs.hh,
+	src/Interval.inlines.hh, src/Interval.templates.hh,
+	src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	src/Linear_System.inlines.hh, src/MIP_Problem.cc,
+	src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+	src/Makefile.am, src/Matrix.cc, src/Matrix.inlines.hh,
+	src/NNC_Polyhedron.cc, src/OR_Matrix.inlines.hh,
+	src/OR_Matrix.templates.hh, src/Octagonal_Shape.cc,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Og_Status.inlines.hh, src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Poly_Con_Relation.cc,
+	src/Poly_Gen_Relation.cc, src/Polyhedron.inlines.hh,
+	src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	src/Polyhedron_widenings.cc, src/Powerset.inlines.hh,
+	src/Powerset.templates.hh, src/Ptr_Iterator.inlines.hh,
+	src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+	src/Row.inlines.hh, src/Scalar_Products.cc,
+	src/Scalar_Products.inlines.hh, src/Widening_Function.inlines.hh,
+	src/algorithms.hh, src/assert.hh, src/checked.inlines.hh,
+	src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	src/checked_mpz.inlines.hh, src/conversion.cc, src/globals.cc,
+	src/globals.inlines.hh, src/initializer.hh, src/intervals.defs.hh,
+	src/math_utilities.inlines.hh, src/minimize.cc, src/ppl_header.hh,
+	src/simplify.cc, src/wrap_assign.hh: Converted assert in PPL_ASSERT.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh, src/Octagonal_Shape.inlines.hh: A couple
+	of minor doxygen documentation corrections.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml: Added determinisitc timeout
+	functionality to the Ocaml interface.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/tests/Parma_Polyhedra_Library_test2.java: Added
+	deterministic timeout functionality to the Java language interface.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/weightwatch1.cc: Weightwatch test fixed so as to
+	behave properly under arithmetic overflows.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh: Added deterministic
+	timeout predicates to the Prolog language interface.
+
+2009-07-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.defs.hh: Now we
+	throw/catch ad hoc exceptions for deterministic timeouts.
+
+2009-07-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/weightwatch1.cc: These tests fail also with
+	32-bit coefficients.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README.configure, TODO, m4/ac_check_gmp.m4: New configure
+	option --with-gmp-prefix supersedes the (now removed) options
+	--with-libgmp-prefix and --with-libgmpxx-prefix.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/weightwatch1.cc: These tests fail also with
+	16-bit coefficients.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh: Private typedef
+	renamed.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh: Removed spurious blank line.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh: Comment improved.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS: Drafted the news for PWL 0.8.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc: Unused temp removed.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc: Warnings avoided.
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-html.in,
+	Watchdog/doc/devref.doxyconf-latex.in: Fixed INPUT variable in
+	Doxygen configuration for devref.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README, Watchdog/configure.ac, Watchdog/src/Makefile.am: 
+	Updated for PWL 0.8.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/weightwatch1.cc: These tests fail with 8-bit
+	coefficients.
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am, interfaces/C/tests/weightwatch1.c: 
+	Added a test for deterministic timeouts in the C language interface.
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc, src/globals.types.hh: 
+	The deterministic timeout facilities are in the C language
+	interface.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc: Got rid of the REACTIVE_ABANDONING macro.  It
+	was controlling tests whose cost is negligible, and defining it to 0
+	we would not honor what we promise in the documentation of
+	abandon_expensive_computations.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: Force rebuild.
+
+2009-07-12  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* TODO, Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	Watchdog/src/Watchdog.inlines.hh: Converted watchdog time argument
+	to unsigned.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Item improved.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Synchronized with the current reality.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/lib-link.m4, m4/lib-link.m4: Updated.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac: Require Automake 1.11, enable lzma tar
+	archives and silent rules.
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh,
+	tests/Polyhedron/weightwatch1.cc: Avoid dummy parameter in
+	constructor for Threshold_Watcher::Initialize.  Renamed `initialize'
+	to `init' to avoid visual clash with `Initialize'.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, Watchdog/INSTALL, Watchdog/compile,
+	Watchdog/config.guess, Watchdog/config.sub, Watchdog/depcomp,
+	Watchdog/install-sh, Watchdog/missing, Watchdog/mkinstalldirs,
+	compile, config.guess, config.sub, depcomp, install-sh, missing,
+	mkinstalldirs: Updated.
+
+2009-07-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Require Automake 1.11, enable lzma tar archives and
+	silent rules.
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am, tests/Polyhedron/weightwatch1.cc: 
+	Added a first test for the deterministic timeout.
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh: Added
+	Weightwatch_Traits class (from Abramo). Modified maybe_abandon().
+
+2009-07-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/EList.defs.hh, Watchdog/src/Threshold_Watcher.cc,
+	Watchdog/src/Threshold_Watcher.defs.hh,
+	Watchdog/src/Threshold_Watcher.templates.hh,
+	Watchdog/src/Threshold_Watcher.types.hh: Minor improvements: prefer
+	direct header file inclusions to indirect ones.  Avoid unnecessarily
+	long lines.
+
+2009-07-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/Makefile.am, Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh,
+	Watchdog/src/Pending_List.templates.hh,
+	Watchdog/src/Pending_List.types.hh, Watchdog/src/{Weightwatch.cc =>
+	Threshold_Watcher.cc}, Watchdog/src/{Weightwatch.defs.hh =>
+	Threshold_Watcher.defs.hh}, Watchdog/src/{Weightwatch.inlines.hh =>
+	Threshold_Watcher.inlines.hh},
+	Watchdog/src/{Weightwatch.templates.hh =>
+	Threshold_Watcher.templates.hh}, Watchdog/src/{Weightwatch.types.hh
+	=> Threshold_Watcher.types.hh}, Watchdog/src/Watchdog.defs.hh: 
+	Converted Weightwatch in more generic Threshold_Watcher.
+
+2009-07-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/Weightwatch.inlines.hh: Fixed typo.
+
+2009-07-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/Weightwatch.cc: Forgotten file.
+
+2009-07-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/Makefile.am, Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh,
+	Watchdog/src/Pending_List.templates.hh,
+	Watchdog/src/Pending_List.types.hh, Watchdog/src/Watchdog.defs.hh,
+	Watchdog/src/Weightwatch.cc, Watchdog/src/Weightwatch.defs.hh,
+	Watchdog/src/Weightwatch.inlines.hh,
+	Watchdog/src/Weightwatch.templates.hh,
+	Watchdog/src/Weightwatch.types.hh: Weightwatch are now generic
+	threshold watchdog.
+
+2009-07-11  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/Weightwatch.cc, Watchdog/src/Weightwatch.defs.hh,
+	Watchdog/src/Weightwatch.inlines.hh: Weightwatch are now independent
+	from client code.
+
+2009-07-10  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* Watchdog/src/EList.inlines.hh, Watchdog/src/Makefile.am,
+	Watchdog/src/Pending_Element.cc,
+	Watchdog/src/Pending_Element.defs.hh,
+	Watchdog/src/Pending_Element.inlines.hh,
+	Watchdog/src/Pending_Element.types.hh,
+	Watchdog/src/Pending_List.defs.hh,
+	Watchdog/src/Pending_List.inlines.hh, Watchdog/src/{Pending_List.cc
+	=> Pending_List.templates.hh}, Watchdog/src/Pending_List.types.hh,
+	Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	Watchdog/src/Weightwatch.cc, Watchdog/src/Weightwatch.defs.hh,
+	Watchdog/src/Weightwatch.inlines.hh,
+	Watchdog/src/Weightwatch.types.hh: Added Weightwatch.
+
+2009-07-10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc, src/MIP_Problem.defs.hh: Fixed a (potential)
+	exception safety bug in class MIP_Problem.  Added an helper class
+	(implementing RAII technique) to safely relax a MIP problem into an
+	LP problem and ensure that integer variables are restored even in
+	the presence of exceptional execution paths.  Improved interface
+	(and a few comments) for private methods dealing with MIP
+	optimization and satisfiability.
+
+2009-07-09  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Box/congruences1.cc: Corrected test as already corrected in
+	the master branch.
+
+2009-06-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.defs.hh: Space dimensions cannot change status:
+	they are either vars or parameters.
+
+2009-06-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: The `gprolog' and `yap' packages are not
+	available on the sparc64 and sparcv9 architectures: so do
+	`ppl-gprolog', `ppl-gprolog-static' and `ppl-yap'.
+
+2009-06-18  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py: Added
+	proof of concept for Python interface.
+
+2009-06-19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: The `gprolog' and `yap' packages are not
+	available on the sparc64 and sparcv9 architectures: so do
+	`ppl-gprolog', `ppl-gprolog-static' and `ppl-yap'.
+
+2009-06-18  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Python/ppl_py.cc, interfaces/Python/ppl_py.py: Added
+	proof of concept for Python interface.
+
+2009-06-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/PIP_Tree.inlines.hh: Added implementation of child accessors.
+
+2009-06-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/PIP_Tree.defs.hh: Fixed typo.
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh: Added accessors of PIP_Solution_Node.  Other
+	improvements.
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.defs.hh: Include "globals.defs.hh"
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Problem.defs.hh: Include "PIP_Tree.defs.hh".
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am, src/PIP_Problem.defs.hh,
+	src/PIP_Problem.inlines.hh, src/PIP_Tree.cc, src/PIP_Tree.defs.hh: 
+	Added constructors and comments.
+
+2009-06-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.defs.hh, src/PIP_Problem.types.hh,
+	src/PIP_Tree.defs.hh: Initial draft fo rinterface improved.  Removed
+	control parameters; removed UNBOUND status; renamed a few methods;
+	let PIP_Tree be an alias for a pointer to a _const_ PIP_Tree_Node.
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh: More comments added.  Some
+	fields renamed.
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am, src/PIP_Problem.cc, src/PIP_Problem.defs.hh,
+	src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.types.hh: Added
+	comments and more infrastructure.
+
+2009-06-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/PIP_Tree.cc, src/PIP_Tree.defs.hh, src/PIP_Tree.inlines.hh: 
+	Added draft PIP_Tree implementation.
+
+2009-06-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PIP_Problem.defs.hh: Got rid of objective function and
+	optimization mode.
+
+2009-06-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PIP_Problem.defs.hh, src/PIP_Problem.types.hh: Blatantly
+	ripped from MIP_Problem.*.hh.
+
+2009-06-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS: Using the bug tracking system is now the recommended way to
+	report PPL issues.
+
+2009-05-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_prolog_sysindep_dox: Typos fixed.
+
+2009-06-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS: Added explanation on the use of lcov to produce
+	coverage information.
+
+2009-06-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac: Add -lgcov to extra_libraries when configuring with
+	coverage enabled.  Fixes a link bug when trying to compute coverage
+	for the OCaml interface tests.
+
+2009-06-10  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Box.templates.hh: Avoid unused variable warning when
+	assertions are not enabled.
+
+2009-06-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4: In the Java tests, be more systematic in the use of method
+	free().
+
+2009-06-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a: Interface for Java class Linear_Expression_Times improved.  The
+	    misleading methods left_hand_side() and right_hand_side() replaced
+	    by: public Coefficient coefficient(); and     public Linear_Expression linear_expression(); returing the two
+	object factors using clearer naming.
+
+2009-05-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh, src/Box.templates.hh,
+	src/Octagonal_Shape.templates.hh: Further improvements to
+	frequency() code.
+
+2009-05-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: Code
+	for frequency() improved.
+
+2009-05-24  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Partially_Reduced_Product.types.hh,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/shapepreservingproduct1.cc: A new
+	product called Shape_Preserving_Product added.
+
+2009-05-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Affine_Space.defs.hh, src/Affine_Space.inlines.hh: The method
+	frequency() added to the Affine_Space domain.
+
+2009-05-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/Octagonal_Shape/frequency1.cc: Bug in frequency() for
+	Octagonal shapes fixed.
+
+2009-05-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Box.defs.hh, src/Box.templates.hh, tests/Box/Makefile.am,
+	tests/Box/frequency1.cc: Added the method frequency() to the Box
+	domain.
+
+2009-05-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.templates.hh,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/frequency1.cc: Added the method frequency() to
+	the Octagonal shape domain.  Improved the code for the same method for BD shapes.  Corrected some typos in comments in these files.
+
+2009-05-21  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron_public.cc,
+	tests/BD_Shape/Makefile.am, tests/BD_Shape/frequency1.cc,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/frequency1.cc: Added
+	method frequency() to the Polyhedron and BD Shape domains.  This corresponds to the method frequency() already added to the Grid
+	domain.  For these domains it checks if the expression has a constant value
+	and if so, returns true and gives the value (with frequency 0).
+	Otherwise it returns false.
+
+2009-05-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/wrap2.cc: Test test02() overflows with 16 bit
+	checked integers.
+
+2009-05-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh: Added a warning about non-integrality for
+	wrap_assign().  Previous reverted commit which had the same message was wrongly done
+	in the products branch.
+
+2009-05-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh: Revert "Added a warning about non-integrality
+	for wrap_assign()." This reverts commit 6b9f28ad503f1d43da7a876c4bee7eae9eba185a.
+
+2009-05-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh: Added a warning about non-integrality for
+	wrap_assign().
+
+2009-05-20  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc: Some tests are
+	expected to fail with 8-bit integers.
+
+2009-05-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.defs.hh, src/globals.types.hh: Non-standard commas
+	removed.
+
+2009-05-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/directproduct2.cc,
+	tests/Partially_Reduced_Product/directproduct3.cc,
+	tests/Partially_Reduced_Product/directproduct4.cc,
+	tests/Partially_Reduced_Product/directproduct5.cc,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct4.cc: Removed
+	redundant test files.
+
+2009-05-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/addcongruences1.cc,
+	tests/Partially_Reduced_Product/addconstraints1.cc,
+	tests/Partially_Reduced_Product/affineimage1.cc,
+	tests/Partially_Reduced_Product/bounded1.cc,
+	tests/Partially_Reduced_Product/boundedaffineimage1.cc,
+	tests/Partially_Reduced_Product/bounds1.cc,
+	tests/Partially_Reduced_Product/concatenate1.cc,
+	tests/Partially_Reduced_Product/congruences1.cc,
+	tests/Partially_Reduced_Product/constraints1.cc,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/contains1.cc,
+	tests/Partially_Reduced_Product/difference1.cc,
+	tests/Partially_Reduced_Product/dimension1.cc,
+	tests/Partially_Reduced_Product/directproduct1.cc,
+	tests/Partially_Reduced_Product/discrete1.cc,
+	tests/Partially_Reduced_Product/disjoint1.cc,
+	tests/Partially_Reduced_Product/equals1.cc,
+	tests/Partially_Reduced_Product/frombdshape1.cc,
+	tests/Partially_Reduced_Product/frombox1.cc,
+	tests/Partially_Reduced_Product/fromgrid1.cc,
+	tests/Partially_Reduced_Product/fromoctagonalshape1.cc,
+	tests/Partially_Reduced_Product/frompolyhedron1.cc,
+	tests/Partially_Reduced_Product/fromproduct1.cc,
+	tests/Partially_Reduced_Product/generalizedaffineimage1.cc,
+	tests/Partially_Reduced_Product/intersection1.cc,
+	tests/Partially_Reduced_Product/isempty1.cc,
+	tests/Partially_Reduced_Product/isuniverse1.cc,
+	tests/Partially_Reduced_Product/maxmin1.cc,
+	tests/Partially_Reduced_Product/partially_reduced_product_test.hh,
+	tests/Partially_Reduced_Product/refinewithcongruences1.cc,
+	tests/Partially_Reduced_Product/refinewithconstraints1.cc,
+	tests/Partially_Reduced_Product/relations1.cc,
+	tests/Partially_Reduced_Product/smashproduct1.cc,
+	tests/Partially_Reduced_Product/spacedims1.cc,
+	tests/Partially_Reduced_Product/timeelapse1.cc,
+	tests/Partially_Reduced_Product/topclosed1.cc,
+	tests/Partially_Reduced_Product/topclosure1.cc,
+	tests/Partially_Reduced_Product/upperbound1.cc,
+	tests/Partially_Reduced_Product/widening1.cc: Revised the tests so
+	as to follow the organization for other domains.  Apart from the operation tests, there are specific tests for each
+	reduction operator.  Selected tests (in the Makefile) can be checked with the given
+	component order and with the component domains reversed.
+
+2009-05-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: Corrected a typo in the known result of
+	a wrap_assign test.  (Please, double check that it was indeed a typo.)
+
+2009-05-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* : commit f184d82d2e3105d671a089a1302ed6dff993a395 Author: Patricia
+	Hill <p.m.hill at leeds.ac.uk> Date:   Tue May 19 07:40:39 2009 +0100
+
+2009-05-18  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_float.inlines.hh: Fixed omitted renaming.
+
+2009-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m
+	4, interfaces/Java/tests/ppl_java_tests_common: The generated Java
+	tests now exploit the Test_Executor class functionality.  Added an
+	helper function to set global success flag and report success or
+	failure if in noisy mode.  NOTE: we are still (just) checking for
+	the well formedness of the object (using method OK()), rather than
+	checking if the computed result is actually the same of th expected
+	one. However, due to genericity, it is quite difficult to precisely
+	state expectations in these tests.
+
+2009-05-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Box/congruences1.cc: When the congruences have inconsistent
+	equalities, the box is set empty.
+
+2009-05-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Box/congruences1.cc: The refine_with_congrueces() detects
+	inconsistent equalities.
+
+2009-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java,
+	interfaces/Java/tests/Test_Executor.java: Started adapting the Java
+	tests to make better use of class Test_Executor.
+
+2009-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit badd595a0c22e91f4f1653ff8c7d53a3bf15ec50 Author: Patricia
+	Hill <p.m.hill at leeds.ac.uk> Date:   Mon May 18 12:05:10 2009 +0100
+
+2009-05-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh: 
+	Improved the relation_with(Congruence) implementation for the weakly
+	relational domains.
+
+2009-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am, tests/Polyhedron/wrap1.cc,
+	tests/Polyhedron/wrap2.cc: New tests for Polyhedron::wrap_assign().
+
+2009-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/wrap1.cc: Known result for test03() corrected; test now
+	marked to succeed.
+
+2009-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh, tests/Box/wrap1.cc: First draft of
+	Box::wrap_assign() is now operational. Added a few tests.
+
+2009-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh, tests/Polyhedron/wrap1.cc: Fixed a bug in
+	wrap_assign_col().
+
+2009-05-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: Added a test showing a bug in
+	wrap_assign when wrap_individually == false.  Test is test20(),
+	temporarily marked as an expected failure.
+
+2009-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: 8-bit coefficients are now enough for
+	test07().
+
+2009-05-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Box.defs.hh, src/Box.templates.hh,
+	src/Grid.defs.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh: Added declarations and stub implementations
+	for drop_some_non_integer_points().
+
+2009-05-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox, src/globals.types.hh: Finished the
+	documentation about the wrapping operator.
+
+2009-05-17  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/wrap_assign.hh: Rounding direction is not relevant here.
+
+2009-05-17  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.inlines.hh, src/checked_float.inlines.hh: Get rid of a
+	comparison warning.
+
+2009-05-17  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/wrap_assign.hh: Simplified code.
+
+2009-05-17  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc: After the
+	affine (pre)image operations, unset the reduced flag.
+
+2009-05-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Added more in the section about the wrapping
+	operator.
+
+2009-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox, src/globals.types.hh: More work on the
+	documentation of approximations for bounded integer arithmetic.
+
+2009-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh, src/Box.defs.hh,
+	src/Box.templates.hh, src/Grid.defs.hh, src/Grid_public.cc,
+	src/Interval.defs.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron_public.cc, src/globals.types.hh, src/wrap_assign.hh: 
+	Bounded_Integer_Type_Signedness renamed
+	Bounded_Integer_Type_Representation.
+
+2009-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh: Comments improved.
+
+2009-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Started writing the section on approximating
+	bounded arithmetic.
+
+2009-05-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron_public.cc: Further cleaning of
+	relation_with(Congruence) implementations.
+
+2009-05-16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl: Improved a few timeout and
+	exception tests.  Make sure an out_of_memory exception is thrown as
+	expected even when a large amount of memory is available. Do not set
+	timeouts out of catch constructs.
+
+2009-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: test19() must fail with 8-bit
+	coefficients.
+
+2009-05-16  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/Box/propagateconstraints2.cc: These tests fails with 16 bit
+	coefficients.
+
+2009-05-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Item removed: no big deal.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/closure1.cc: The test fails also with 32 bit
+	coefficients.
+
+2009-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh: FIXME resolved.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/Box/propagateconstraints2.cc: The test fails also with 32
+	bit coefficients.
+
+2009-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh, tests/Box/wrap1.cc, tests/Polyhedron/wrap1.cc: 
+	Fixed the generic implementation of wrap_assign().
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/math_utilities.inlines.hh: A strict relation info is required
+	here too.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Octagonal_Shape.templates.hh: A strict relation info is
+	required here.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_float.inlines.hh: Fixed a typo.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh, src/checked_mpz.inlines.hh: Added an
+	assert(false) for unreachable code.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.inlines.hh: Avoid two warnings.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Boundary.defs.hh, src/Rounding_Dir.defs.hh,
+	src/Rounding_Dir.inlines.hh, src/checked.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_mpz.inlines.hh,
+	src/intervals.defs.hh: Renamed and commented ROUND_STRICT_RELATION.
+	Added some use of it. Added some optimizations when ROUND_NOT_NEEDED
+	is specified.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Improved method
+	Polyhedron::relation_with(const Congruence&) const.  Avoided several
+	temporary objects; added a FIXME asking for the rounding mode.
+
+2009-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh: Fixed the invocation of the generic
+	implementation of wrap_assign().
+
+2009-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh: Check that all variables upon which `*pcs'
+	depends are in `vars'.  An assertion is violated otherwise.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Several improvements to
+	Octagonal_Shape<T>::relation_with(const Congruence&).  Alaso added a
+	couple of FIXME regarding missing comments and rounding modes.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc: Corrected typo in
+	explanatory output.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox: Minor improvement.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_int.inlines.hh, src/checked_mpz.inlines.hh: Fixed
+	rounding.
+
+2009-05-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.templates.hh,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron_public.cc,
+	src/wrap_assign.hh, tests/Polyhedron/wrap1.cc: Changed the
+	specification of wrap_assign().  If `*pcs' depends on variables not
+	in `vars', the behavior is undefined.  We perform only the quick
+	test on space dimensions.  In debugging mode we will check the
+	condition thoroughly.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Octagonal_Shape.templates.hh: Simplified a rounded assignment.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.inlines.hh, src/Rounding_Dir.defs.hh,
+	src/Rounding_Dir.inlines.hh, src/checked_float.inlines.hh,
+	src/checked_int.inlines.hh, src/checked_mpz.inlines.hh: Permits to
+	low level code to take benefits from knowing that result will be
+	exact.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/closure1.cc: Test fails with an overflow using 8
+	bit coefficients.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.inlines.hh: Enable DEBUG_ROUND_NOT_NEEDED when
+	assertions are enabled.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/Box/propagateconstraints2.cc: Two tests fail with an
+	overflow using 8 bit coefficients.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Rounding_Dir.defs.hh: Improved comment for ROUND_NOT_NEEDED.
+
+2009-05-15  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Prolog/Ciao/ciao_efli.cc,
+	interfaces/Prolog/GNU/gprolog_efli.cc,
+	interfaces/Prolog/SICStus/sicstus_efli.cc,
+	interfaces/Prolog/XSB/xsb_efli.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	src/Checked_Number.inlines.hh: Fixed DEBUG_ROUND_NOT_NEEDED.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/wrap1.cc: Let the wrap_assign tests succeed until the
+	specification is clarified.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Added a note about the use of `assign' helper
+	functions.
+
+2009-05-15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: When wrapping no variable, do not ignore the
+	optional constraint system.
+
+2009-05-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java: Added a
+	few missing accessor methods to Java interface classes.  Affected
+	classes are Congruence, Generator and Grid_Generator.
+
+2009-05-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/ppl_test.cc, tests/ppl_test.hh: Added two tests based on the
+	examples 5(a), 5(b) in SenS07.  Added print_constraints(const Affine_Space&) to ppl_test.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh, tests/Polyhedron/wrap1.cc: Fixed the bug
+	witnessed by test15().
+
+2009-05-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO, src/MIP_Problem.cc: Partially reverted changes
+	71e9992afa9bc049b93d0b29fd9dbe52ead850cf.  The changes were not
+	working on platforms where floating point rounding mode could not be
+	set (e.g., ARM), even though rounding control is not actually
+	needed.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: Temporarily marked test15() and
+	test16() as expected to fail.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh: Last commit partly undone.
+
+2009-05-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/wrap_assign.hh, tests/Box/wrap1.cc, tests/Polyhedron/wrap1.cc: 
+	Adapted generic implementation of wrap_assign to model the rational
+	case.  Also added a couple of tests showing problems in the current
+	implementation.
+
+2009-05-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh, src/Box.templates.hh: Use PPL_DIRTY_TEMP for
+	temporary objects.  Also corrected a type causing an assertion
+	failure.
+
+2009-05-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.defs.hh: Added missing clear.
+
+2009-05-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Boundary.defs.hh: Fixed typo.
+
+2009-05-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh, src/Box.templates.hh, src/Interval.defs.hh: 
+	Some progress on Box::wrap_assign().  Corrected a couple of typos in
+	Interval::wrap_assign().  Silenced an annoying GCC warning.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/WRD_coefficient_types.defs.hh, src/checked.inlines.hh: Commits
+	improved.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 6c8a266be0f01266599542b7cdc3d3c2a47e62d2 Author: Abramo
+	Bagnara <abramo.bagnara at gmail.com> Date:   Thu May 14 09:41:30 2009
+	+0200
+
+2009-05-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/Box/frombox1.cc: Added missing policy.
+
+2009-05-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Grid/frequency1.cc: Added new method frequency() for Grids.
+
+2009-05-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.cc, src/Checked_Number.inlines.hh,
+	src/Result.defs.hh: Added missing Result values.
+
+2009-05-14  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.defs.hh: Fixed some typos.
+
+2009-05-14  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_public.cc, tests/Grid/Makefile.am: 
+	Added new method frequency() for Grids.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Octagonal_Shape.defs.hh,
+	src/WRD_coefficient_types.defs.hh,
+	src/WRD_coefficient_types.inlines.hh: New policy
+	Debug_WRD_Extended_Number_Policy.  This is the debugging policy for
+	checked numbers used in weakly-relational domains.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/WRD_coefficient_types.defs.hh: WRD_Extended_Number_Policy
+	properly commented.
+
+2009-05-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/wrap1.cc: Marked tests that are expected to fail with
+	8-bit coefficients.
+
+2009-05-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.defs.hh: Added wrap_assign.
+
+2009-05-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/checked.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh: Added
+	add_2exp and sub_2exp.
+
+2009-05-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.defs.hh: Added missing info clearing.
+
+2009-05-13  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox, src/Determinate.defs.hh, src/Grid.defs.hh,
+	src/Partially_Reduced_Product.defs.hh: Removed repeated
+	specification of operators in the grids section.  Ensure cross-references to these sections now refer to the
+	equivalent sections for polyhedra.  Fixed a typo in src/Determinate.defs.hh that caused a warning when
+	compiling the documentation.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Checked_Number.defs.hh,
+	src/Checked_Number.inlines.hh, src/Makefile.am,
+	src/Octagonal_Shape.defs.hh, src/WRD_coefficient_types.defs.hh,
+	src/WRD_coefficient_types.inlines.hh: Coefficient types of
+	weakly-relational domains moved to new source files.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.types.hh: Comment fixed.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Checked_Number.types.hh: Got rid of
+	Checked_Number_Default_Policy.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.inlines.hh: 
+	Bounded_Integer_Coefficient_Policy::handle_result() commented.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.inlines.hh: Also check for NaN in
+	Bounded_Integer_Coefficient_Policy::handle_result().
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh, src/Coefficient.types.hh,
+	src/checked.defs.hh, src/checked_float.inlines.hh: Checked number
+	policy parameter `check_nan_result' renamed `fpu_check_nan_result'.
+
+2009-05-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.defs.hh: Fixed return type.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Use Bounded_Integer_Coefficient_Policy as the policy
+	for checked coefficients.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.inlines.hh, src/Coefficient.types.hh: Added
+	Bounded_Integer_Coefficient_Policy.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh: Checked_Number_Transparent_Policy properly
+	commented.
+
+2009-05-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.defs.hh: Fixed topological closure for unbounded
+	intervals.
+
+2009-05-13  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Boundary.defs.hh, src/Box.templates.hh,
+	src/Checked_Number.cc, src/Checked_Number.inlines.hh,
+	src/Circular_Interval.defs.hh, src/DB_Matrix.templates.hh,
+	src/Interval.defs.hh, src/Interval.templates.hh,
+	src/OR_Matrix.templates.hh, src/Result.defs.hh,
+	src/Result.inlines.hh, src/checked.cc, src/checked.defs.hh,
+	src/checked.inlines.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/intervals.defs.hh, tests/Polyhedron/numberinput1.cc: Reorganized
+	and separated Result classes to be more informative.
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit c8cbb00f29ac4c0d48daf14a9a9d3b93e559e207 Author: Patricia
+	Hill <p.m.hill at leeds.ac.uk> Date:   Wed May 13 09:21:47 2009 +0100
+
+2009-05-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: AC_CHECK_GMP fixed.
+
+2009-05-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Added a commit to consider should we release PPL 0.10.3.
+
+2009-05-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README.configure, m4/ac_check_gmp.m4: New configuration
+	option `--with-gmp-build=DIR'.  This allows to use a non-installed
+	build of GMP in DIR.
+
+2009-05-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct6.cc: Known result
+	adapted to increased Box constructor precision.
+
+2009-05-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO, tests/Box/frompolyhedron1.cc: Another TODO item dealt with.
+	Adapted another few known results according to increased precision.
+
+2009-05-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Added a section on commits to consider should we release PPL
+	0.10.3.
+
+2009-05-12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	tests/Box/frompolyhedron2.cc, tests/Box/refinewithconstraint1.cc,
+	tests/Powerset/frompolyhedron1.cc: Method Box::refine_with is now
+	based on (single step) constraint propagation.  Method
+	Box::propagate_constraints now also take as input a parameter for
+	specifying the maximum number of iterations (default value 0).  The
+	constructor of a Box from a Polyhedron in polynomial time sets this
+	parameter to a constant.  The known result of several tests adapted
+	to match the increased precision.
+
+2009-05-12  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox, src/Grid_public.cc: Improved documentation
+	and small efficiency improvement to the code.
+
+2009-05-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am: We cannot test the Java
+	interface unless ENABLE_SHARED.
+
+2009-05-12  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid_public.cc: Another efficiency improvement to
+	wrap_assign().
+
+2009-05-12  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid_public.cc: Some efficiency improvements. Comments
+	improved.
+
+2009-05-12  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Boundary.defs.hh: Added smod_2exp and umod_2exp for boundary.
+
+2009-05-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/lib-ld.m4, m4/lib-link.m4, m4/lib-prefix.m4: Updated from
+	Gnulib.
+
+2009-05-12  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_nonpublic.cc, src/Grid_public.cc: 
+	Simplification and improvement of code for wrap_assign().  The bounds_no_check() and frequency_no_check() assume the generators
+	are minimized and the grid is not empty.
+
+2009-05-12  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox, src/Grid_public.cc: Several improvements for
+	the wrap_assign() operator for grids.
+
+2009-05-11  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_public.cc, tests/Grid/wrap1.cc: 
+	Improved code for wrap_assign() for grids for constant values.  If the value for a variable is already constant, and the constant is
+	outside the range for the bounded integr type, then the outcome
+	depends on the kind of overflow: - if `impossible', then the grid is set empty; - if `undefined', then the variable is set to take any integral
+	value; - if `wraps', then the value is wrapped by the wrap_frequency   to a value in the range for the bounded integer type.  Comments improved.
+
+2009-05-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO: Another item dealt with.
+
+2009-05-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml,
+	interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/Prolog/tests/pl_check.pl: Parameter irrational_precision
+	made available in all language interfaces.
+
+2009-05-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Init.cc, src/checked.cc, src/checked_mpq.inlines.hh: Renamed
+	rational_sqrt_precision_parameter to irrational_precision.
+
+2009-05-11  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Grid/wrap1.cc: Several tests are expected to fail for
+	checked-in8.
+
+2009-05-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc: Do not test for result dependent
+	on floating point steepest edge heuristics.
+
+2009-05-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Avoid unnecessary unbounded precision value in
+	floating point steepest edge.
+
+2009-05-11  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* doc/definitions.dox: Added a _draft_ description of the wrap
+	operator for grids.
+
+2009-05-11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO, src/MIP_Problem.cc: Got rid of a TODO item.  Also avoid an
+	annoying warning about an uninitialized variable.
+
+2009-05-11  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_nonpublic.cc, src/Grid_public.cc: Redid
+	the intended changes for the last commit for wrap_assign().
+
+2009-05-11  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_nonpublic.cc, src/Grid_public.cc,
+	tests/Grid/wrap1.cc: Improved wrap_assign() for grids.  Added private methods bounds_no_check() and frequency_no_check().
+
+2009-05-10  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	src/Rounding_Dir.inlines.hh, src/checked.defs.hh,
+	src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	src/checked_mpz.inlines.hh: Added umod_2exp and smod_2exp to checked
+	numbers. Fixed rem for mpq to work similarly to other numeric types.
+
+2009-05-09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	src/wrap_assign.hh, tests/Box/Makefile.am, tests/Box/wrap1.cc: 
+	Drafted specialized implementation for Box<ITV>::wrap_assign.  Code
+	still commented out as it relies on a missing Interval method.
+
+2009-05-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc: Use the appropriate
+	throw_dimension_incompatible() method in wrap_assign().
+
+2009-05-07  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Grid.defs.hh, src/Grid_public.cc, tests/Grid/Makefile.am,
+	tests/Grid/wrap1.cc: Added draft implementation for wrap_assign()
+	for the grid domain.
+
+2009-05-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, interfaces/C/ppl_c_header.h,
+	interfaces/Java/jni/Makefile.am,
+	interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/parma_polyhedra_library/Timeout_Exception.java,
+	interfaces/Java/tests/Makefile.am,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test2.java: Added
+	basic timeout support to the Java library interface.
+
+2009-05-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh: Fixed result check for
+	ThrowNew.
+
+2009-05-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: test03() fails also with 16-bit
+	coefficients when assertions are enabled.
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: test07() only fails if assertions are
+	enabled.
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.cc, src/BD_Shape.templates.hh,
+	src/Checked_Number.templates.hh, src/Grid_public.cc,
+	src/Interval_Info.defs.hh, src/MIP_Problem.cc,
+	src/OR_Matrix.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	tests/BD_Shape/affinedimension1.cc,
+	tests/BD_Shape/containsintegerpoint1.cc,
+	tests/Box/affinedimension1.cc,
+	tests/Octagonal_Shape/containsintegerpoint1.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Polyhedron/dualhypercubes.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/maxspacedim1.cc,
+	tests/Polyhedron/polyhull1.cc, tests/Polyhedron/relations1.cc: 
+	Spurious parentheses removed.
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 317f48d0d55391b07624e0f55a6228e3b2d39d6f Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue May 5 19:20:33 2009 +0200
+
+2009-05-05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/tests/Makefile.am, interfaces/C/tests/watchdog1.c: 
+	Added basic timeout support to the C library interface.
+
+2009-05-05  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Box.templates.hh: Fixed typo on assertion.
+
+2009-05-05  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Prolog/ppl_prolog_common.cc, src/Bool4.defs.hh,
+	src/Boundary.defs.hh, src/Box.defs.hh, src/Box.inlines.hh,
+	src/Box.templates.hh, src/Circular_Interval.defs.hh,
+	src/Interval.defs.hh, src/Interval.inlines.hh,
+	src/Interval.templates.hh, src/Interval_Info.defs.hh,
+	src/Makefile.am, src/Rational_Interval.hh, src/Result.defs.hh,
+	src/globals.types.hh, src/intervals.defs.hh: Added Circular Integer
+	intervals.
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/COW_Pointset.defs.hh, tests/Grid/approximatepartition1.cc,
+	tests/Grid/powersetdifference1.cc: Method COW_Pointset::element()
+	renamed pointset().
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearpartition1.cc: Method
+	COW_Pointset::element() renamed pointset().
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc: Indentation and comments fixed.
+
+2009-05-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc: Method COW_Pointset::element() renamed
+	pointset().
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	src/COW_Pointset.defs.hh, src/COW_Pointset.inlines.hh,
+	src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.templates.hh,
+	src/Pointset_Powerset.cc, src/Pointset_Powerset.templates.hh,
+	src/algorithms.hh, tests/Powerset/affinedimension1.cc,
+	tests/Powerset/affineimage1.cc, tests/Powerset/affinepreimage1.cc,
+	tests/Powerset/difference1.cc, tests/Powerset/disjunct1.cc,
+	tests/Powerset/frombdshape1.cc, tests/Powerset/frombox1.cc,
+	tests/Powerset/fromgrid1.cc, tests/Powerset/fromoctagonalshape1.cc,
+	tests/Powerset/frompolyhedron1.cc, tests/Powerset/refinewith1.cc,
+	tests/Powerset/simplifyusingcontext1.cc: Method
+	COW_Pointset::element() renamed pointset().  Comments improved.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: test02() and test09() fail also with
+	16-bit coefficients.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh, src/Any_Pointset.defs.hh,
+	src/BD_Shape.defs.hh, src/Bit_Matrix.defs.hh, src/Bit_Row.defs.hh,
+	src/Box.defs.hh, src/Box_Status.idefs.hh, src/C_Polyhedron.defs.hh,
+	src/Checked_Number.defs.hh, src/Congruence.defs.hh,
+	src/Congruence_System.defs.hh, src/Constraint.defs.hh,
+	src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	src/DB_Matrix.defs.hh, src/Generator.defs.hh,
+	src/Generator_System.defs.hh, src/Grid.defs.hh,
+	src/Grid_Generator.defs.hh, src/Grid_Generator_System.defs.hh,
+	src/Linear_Expression.defs.hh, src/Linear_System.defs.hh,
+	src/MIP_Problem.defs.hh, src/Matrix.defs.hh,
+	src/NNC_Polyhedron.defs.hh, src/OR_Matrix.defs.hh,
+	src/Octagonal_Shape.defs.hh, src/Partially_Reduced_Product.defs.hh,
+	src/Pointset_Ask_Tell.defs.hh, src/Pointset_Powerset.defs.hh,
+	src/Polyhedron.defs.hh, src/Ptr_Iterator.defs.hh: Systematically
+	write "copy constructor" instead of "copy-constructor." (The verb is
+	"to copy-construct" though.)
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, src/{Determinate.defs.hh => COW_Pointset.defs.hh},
+	src/{Determinate.inlines.hh => COW_Pointset.inlines.hh},
+	src/{Determinate.types.hh => COW_Pointset.types.hh},
+	src/Makefile.am, src/Pointset_Ask_Tell.cc,
+	src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, tests/BD_Shape/membytes1.cc,
+	tests/Grid/membytes1.cc, tests/Octagonal_Shape/membytes1.cc,
+	tests/Polyhedron/membytes1.cc: The `Determinate' class has been
+	renamed `COW_Pointset'.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Octagonal_Shape.defs.hh,
+	src/Polyhedron.defs.hh: Completed the \exception section of the
+	documentation for wrap_assign().
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Added a section on "Approximating Bounded
+	Arithmetic", to be written.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Makefile.am,
+	src/Octagonal_Shape.defs.hh, src/Polyhedron.defs.hh,
+	src/wrap_assign.hh: Documentation of the wrapping methods improved.
+	Typos fixed.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Two new items added.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh: Further steps in the definition of the
+	interface of Affine_Space.  The widening and extrapolation methods
+	do nothing (except for testing dimension-compatibility).  Several
+	comments revised.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh: Added missing full stops.
+
+2009-05-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, interfaces/Java/README.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a: Documented recent changes in the Java interface.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh: Removed obsolete comments about
+	minimization.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh: Fixed some comments.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/wrap1.cc: Marked the tests that are expected to
+	fail with 8-bit coefficients.
+
+2009-05-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: Documented a systematic assumption
+	about the C interface opaque pointers.
+
+2009-05-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/Octagonal_Shape.defs.hh: Fixed a couple
+	of comments for BD and octagonal shapes.  When adding
+	constraints/congruences, an exception is thrown if they cannot be
+	accurately represented.
+
+2009-05-04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Pair.java: Cached Java
+	method IDs for class parma_polyhedra_library/Pair.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/wrap1.cc, tests/Octagonal_Shape/wrap1.cc,
+	tests/Polyhedron/wrap1.cc: Expected behavior made dependent on the
+	range of Coefficient.
+
+2009-05-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am, tests/BD_Shape/wrap1.cc: Test
+	BD_Shape::wrap_assign().
+
+2009-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh: Check for NaNs only when debugging.
+
+2009-05-03  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Partially_Reduced_Product.types.hh,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/congruencesproduct1.cc,
+	tests/Partially_Reduced_Product/shrinkusingcongruences1.cc: Renamed
+	reduction Shrink_Using_Congruences_Reduction to
+	Congruences_Reduction.
+
+2009-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/wrap1.cc: Fixed computation of known results
+	for test01() and test02().
+
+2009-05-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_numeric_limits.hh: Avoid use of constructors in
+	numeric_limits.
+
+2009-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/wrap1.cc: Expected result adapted to the
+	different types of coefficients.
+
+2009-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh: Fixed PPL_SPECIALIZE_LIMITS_INT.
+
+2009-05-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/wrap1.cc: Debugging print statement added.
+
+2009-05-03  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.cc, src/checked.defs.hh, src/checked_int.inlines.hh: 
+	Fixed assignment to int.
+
+2009-05-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am, src/{wrap.cc => wrap_string.cc}, src/{wrap.hh =>
+	wrap_string.hh}: Files renamed to avoid ambiguity with respect to
+	numerical wrapping.
+
+2009-05-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	src/Determinate.types.hh, src/Pointset_Ask_Tell.defs.hh,
+	src/Pointset_Ask_Tell.inlines.hh,
+	src/Pointset_Ask_Tell.templates.hh, src/Pointset_Ask_Tell.types.hh,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Pointset_Powerset.types.hh,
+	src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+	src/Widening_Function.types.hh, src/wrap_assign.hh: No longer use CS
+	and PS as template parameter names.
+
+2009-05-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/wrap_assign.hh: Unused variable removed.
+
+2009-05-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	tests/Grid/asciidumpload6.cc, tests/Polyhedron/ascii_dump_load1.cc,
+	tests/Polyhedron/ascii_dump_load3.cc: Bad spacing fixed.
+
+2009-05-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 099c11d215bf8bf113bec36fbe1b802d939bf92b Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat May 2 18:16:44 2009 +0200
+
+2009-05-02  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.templates.hh,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/constraintsproduct1.cc,
+	tests/Partially_Reduced_Product/shrinkusingcongruences1.cc: 
+	Reduction methods (Constraints and Shrink_Using_Congruences)
+	improved.  Tests specific to the Constraints_Reduction added.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am, tests/Grid/coveringbox1.cc,
+	tests/Grid/coveringbox2.cc: Obsolete test programs removed.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 02e818f7cd915af0e99ac755e1567932ec164992 Merge: abefc45
+	54b3668 Author: Roberto Bagnara <bagnara at cs.unipr.it> Date:   Fri
+	May 1 14:25:03 2009 +0200
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4, src/Any_Pointset.defs.hh,
+	src/BD_Shape.defs.hh, src/BD_Shape.templates.hh, src/Box.defs.hh,
+	src/Box.templates.hh, src/Grid.defs.hh,
+	src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	src/Grid_chdims.cc, src/Grid_public.cc,
+	src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.templates.hh,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.templates.hh,
+	src/Polyhedron.defs.hh, src/Polyhedron_chdims.cc,
+	src/Polyhedron_public.cc: Renamed some pleonastic identifiers.
+	Fixed some comments.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/.gitignore: Added missing patterns.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.defs.hh: Renamed some pleonastic identifiers.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Affine_Space.cc, src/Affine_Space.defs.hh,
+	src/Affine_Space.inlines.hh, src/Affine_Space.types.hh,
+	src/Makefile.am: Added a proof-of-concept implementation of affine
+	spaces.  The implementation is based on rational grids.
+
+2009-05-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/shrinkusingcongruences1.cc: 
+	Unwanted changes to test01() undone.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh: Fixed copy-and-paste mistakes.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh: Indentation fixed.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh, src/Grid.inlines.hh,
+	src/Octagonal_Shape.inlines.hh: Useless returns removed.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc: Fixed two code formatting glitches.
+
+2009-05-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh: Previous change reverted.
+
+2009-04-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh: Useless friend declaration removed.
+
+2009-04-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 9ce7c8bdce348315c574891ecb60cc0dc4cb3720 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Thu Apr 30 19:30:47 2009 +0200
+
+2009-04-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a, interfaces/Java/tests/C_Polyhedron_test1.java,
+	interfaces/Java/tests/MIP_Problem_test1.java,
+	interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	interfaces/Java/tests/ppl_java_tests_common: Fixed initialization
+	for Java interface (explicit initialization required).  Java class
+	Parma_Polyhedra_Library now has two new static methods:
+	initialize_library() and finalize_library().  The first one, to be
+	called after loading the library and before calling any other
+	library method, will provide proper initialization of both the C++
+	data structures and the Java class and field/method ID caches.  The
+	second one, to be called when no longer using the library, will
+	clear the cache, deleting all stored global references, thereby
+	allowing for the PPL Java classes to be garbage collected.
+
+2009-04-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 6431f35e4360c7c8385635f1e262c2f984cf07b1 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Apr 28 19:19:04 2009 +0200
+
+2009-04-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am: Fixed a typo
+	causing improper cleaning of Java interface files.
+
+2009-04-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc, tests/Polyhedron/wrap1.cc: In
+	Polyhedron::wrap_assign() handled the case `o ==
+	OVERFLOW_UNDEFINED'.
+
+2009-04-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron_public.cc,
+	tests/Polyhedron/wrap1.cc: Added a new parameter `pcs' to
+	Polyhedron::wrap_assign().  Other parameters reordered.  The tests
+	now check for the expected result.
+
+2009-04-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Use LT_PREREQ to ensure a recent-enough version of
+	Libtool is used.
+
+2009-04-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc: Fixed a few residual issue
+	in Java interface method ID caching.  Factored away common code in
+	helper functions build_cxx_*_system.  Inlined a few helper
+	functions.
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc, tests/Polyhedron/wrap1.cc: Started the
+	implementation of Polyhedron::wrap_assign().
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/.gitignore: Added missing pattern.
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh: Unused parameter name omitted.
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/.gitignore, tests/Polyhedron/.gitignore: Added
+	missing patterns.
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh, src/Checked_Number.defs.hh,
+	src/Checked_Number.inlines.hh, src/Octagonal_Shape.templates.hh,
+	src/checked.defs.hh, src/checked_ext.inlines.hh,
+	src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	src/math_utilities.inlines.hh: The `mul2exp' and `div2exp' functions
+	are now called `mul_2exp' and `div_2exp'.  They have also been
+	changed so as to take an unsigned int parameter.
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh: Added void
+	div_2exp_assign(GMP_Integer&, const GMP_Integer&, unsigned int).
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh: Added void
+	mul_2exp_assign(GMP_Integer&, const GMP_Integer&, unsigned int).
+
+2009-04-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 79dac5cc0b03dec162bdcca40e01828a52371765 Author: Enea
+	Zaffanella <zaffanella at cs.unipr.it> Date:   Sat Apr 25 16:34:17 2009
+	+0200
+
+2009-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/tests/Makefile.am: Use the macros OCAMLC, OCAMLOPT
+	and OCAMLLIB.
+
+2009-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: One obsolete item removed.  Other items partially scheduled.
+
+2009-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, tests/ppl_test.hh: DO_TEST_F now produces a more sensible
+	output.
+
+2009-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am, interfaces/OCaml/Makefile.am: Use the macros
+	OCAMLC, OCAMLOPT and OCAMLDOC instead of hardcoded names.
+
+2009-04-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO, configure.ac, m4/ocaml.m4: Use the ocaml-autoconf macros for
+	configuration of the OCaml interface.
+
+2009-04-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java: Improved jni
+	helper functions set_coefficient, set_generator, set_by_reference.
+	Cached anther few Java method IDs.
+
+2009-04-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java: In Java, avoid useless repeated copies in Coefficient and
+	Linear_Expression.
+
+2009-04-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Differenc
+	e.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.jav
+	a,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Min
+	us.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.
+	java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	interfaces/Java/parma_polyhedra_library/Variable.java: Caching other
+	Java field/method IDs.  Also corrected a latent bug in helper
+	function j_long_to_j_long_class.
+
+2009-04-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficie
+	nt.java, interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java: 
+	Started caching Java field/method IDs for jni callbacks.  Improved
+	the translation from Java Coefficient to PPL Coefficient objects by
+	providing the former with a toString method.
+
+2009-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/parma_polyhedra_library/Generator.java: Corrected
+	Java Generator private method void set(Generator).  We were not
+	correctly setting the divisor for the generator.  Also got rid of
+	unused jni method set_grid_generator().
+
+2009-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/parma_polyhedra_library/By_Reference.java: Got rid
+	of (unnecessarily involved) method is_null.
+
+2009-04-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh: Prefer passing
+	jobject, jint and jlong by value.
+
+2009-04-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_common.cc,
+	interfaces/Java/jni/ppl_java_common.defs.hh,
+	interfaces/Java/jni/ppl_java_common.inlines.hh,
+	interfaces/Java/jni/ppl_java_globals.cc: Added missing checks.
+
+2009-04-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/C_Integer.hh, src/checked.cc, src/meta_programming.hh: Avoid
+	use of anonymous enum.
+
+2009-04-23  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Powerset/fromgrid1.cc: Avoid unused variable warning.
+
+2009-04-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh: Warnings avoided.
+
+2009-04-22  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Grid/affineimage2.cc: Tests 11 fails with checked-int32
+	coefficients.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, TODO, src/Init.cc: Use of PPL_ARM_CAN_CONTROL_FPU made
+	safer.  When the PPL has been configured with
+	CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1", the library initialization
+	procedure checks that the FPU can indeed be controlled and fails if
+	that is not the case.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4: Formatting improved.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4: Made the checks for HAVE_FENV_H
+	systems more robust.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am, tests/Polyhedron/wrap1.cc: New file
+	wrap1.cc will contain tests for method Polyhedron::wrap_assign().
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, src/Polyhedron_public.cc: Added the
+	declaration and a stub implementation of new method
+	Polyhedron::wrap_assign().
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh: New enumerations Bounded_Integer_Type_Width,
+	Bounded_Integer_Type_Signedness and Bounded_Integer_Type_Overflow to
+	encode the width, signedness and overflow behavior of bounded
+	integer types, respectively.
+
+2009-04-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Corrected silly typo in compile-time
+	check.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc: Typos fixed.
+
+2009-04-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh: Typos fixed.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Mentioned the speed improvements committed today.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, Watchdog/src/Makefile.am, configure.ac,
+	demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+	doc/ppl-config_extra_man_text, interfaces/C/Makefile.am,
+	src/Makefile.am: Version number bumped.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit d0e5a4edbf54e3a14ba44b27d34ab24f101cb118 Merge: 0dbad6c
+	45e1e7e Author: Roberto Bagnara <bagnara at cs.unipr.it> Date:   Mon
+	Apr 20 22:10:48 2009 +0200
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh: 
+	Bit_Row iterators reimplemented more efficiently.
+
+2009-04-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh, src/Octagonal_Shape.defs.hh,
+	src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	tests/BD_Shape/Makefile.am,
+	tests/BD_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/integerupperboundifexact1.cc,
+	tests/Octagonal_Shape/upperboundifexact1.cc: The exact integer upper
+	bound methods for shapes are now under Git control. The methods are
+	named integer_upper_bound_assign_if_exact; they can only be
+	instantiated if the template parameter T is an integer datatype.
+
+2009-04-20  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.inlines.hh: Added assert to check for possible
+	overflow.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 12dc53fb2a829b9ae88c49c5a5dd796df4cc8ced Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Apr 20 16:15:22 2009 +0200
+
+2009-04-20  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Bit_Row.inlines.hh: Size has to be specified in bits.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh: New
+	constructor Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z).
+	Constructs an object containing the set-union of y and z.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc: Further improved subset_or_equal(const Bit_Row&,
+	const Bit_Row&, bool&).
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh, src/conversion.cc: 
+	Avoid useless allocations by only adding recycled rows to
+	Bit_Matrix.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc: Significantly speeded up the construction of
+	`new_satrow'.
+
+2009-04-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc: Improved subset_or_equal(const Bit_Row&, const
+	Bit_Row&, bool&).
+
+2009-04-19  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl,
+	interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_te
+	st_pl_code.m4: Removed tests for the deprecated *and_minimize()
+	predicates.
+
+2009-04-18  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	tests/Grid/affinedim1.cc, tests/Grid/affineimage2.cc,
+	tests/Grid/bounded1.cc, tests/Grid/bounds1.cc,
+	tests/Grid/certificate1.cc, tests/Grid/congruences1.cc,
+	tests/Grid/containsintegerpoint1.cc, tests/Grid/discrete1.cc,
+	tests/Grid/generators1.cc, tests/Grid/grid1.cc,
+	tests/Grid/grid2.cc, tests/Grid/intersection1.cc,
+	tests/Grid/maxmin1.cc, tests/Grid/mingenerators1.cc,
+	tests/Grid/partition1.cc, tests/Grid/removespacedims1.cc,
+	tests/Grid/removespacedims2.cc,
+	tests/Grid/simplifyusingcontext1.cc, tests/Grid/topclosed1.cc: 
+	Removed deprecated methods *and_minimize().
+
+2009-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: Mark package ppl-yap as obsoleting
+	ppl-yap-static.
+
+2009-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Update version.
+
+2009-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog: Mark ChangeLog.
+
+2009-04-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Mark ChangeLog.
+
+2009-04-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/clpq.pl, interfaces/Prolog/tests/clpq2.pl: 
+	No longer use ppl_Polyhedron_add_constraints_and_minimize/2.
+
+2009-04-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/addconstraints1.cc,
+	tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	tests/BD_Shape/intersection1.cc,
+	tests/Octagonal_Shape/congruences1.cc,
+	tests/Octagonal_Shape/intersection1.cc,
+	tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	tests/Powerset/intersection1.cc: More changes related to the removal
+	of the *_and_minimize() methods.
+
+2009-04-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruence1.cc,
+	tests/Polyhedron/addcongruences1.cc,
+	tests/Polyhedron/addconstraint1.cc,
+	tests/Polyhedron/addconstraints1.cc,
+	tests/Polyhedron/addconstraints2.cc,
+	tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerators1.cc,
+	tests/Polyhedron/addgenerators2.cc,
+	tests/Polyhedron/boundedaffineimage1.cc,
+	tests/Polyhedron/constrains1.cc, tests/Polyhedron/constraints1.cc,
+	tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	tests/Polyhedron/generators1.cc, tests/Polyhedron/h79widening2.cc,
+	tests/Polyhedron/intersection1.cc,
+	tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/randphull1.cc,
+	tests/Polyhedron/topclosed1.cc, tests/Powerset/addconstraints1.cc: 
+	Tests adapted to check the "non-and_minimize" versions.  Several
+	comments and one bug fixed in the process.
+
+2009-04-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 5d9dccfb35624f7a3efd99cfea738306b147a473 Merge: 083f3ea
+	205889d Author: Roberto Bagnara <bagnara at cs.unipr.it> Date:   Fri
+	Apr 17 12:55:06 2009 +0200
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc: Changed `__s390x' to `__s390x__' in
+	conditional exclusion of this test.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog: Updated.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/{ppl-0.10.1-Makefile.patch => ppl-0.10.2-Makefile.patch},
+	fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, fedora/pwl.hh: 
+	Updated for PPL 0.10.2.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3, doc/libppl_c.3: Version numbers fixed.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lpsol/ppl_lpsol.1,
+	doc/libppl.3, doc/libppl_c.3, doc/ppl-config.1,
+	doc/ppl-config_extra_man_text: Updated for PPL 0.10.2.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am, doc/Makefile.am: Added targets to have
+	`make -n dist' work as expected.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc: Usage string fixed: ppl_lcdd accepts
+	at most one input file.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am, Watchdog/tests/Makefile.am,
+	demos/ppl_lcdd/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	interfaces/C/Makefile.am, interfaces/C/tests/Makefile.am,
+	interfaces/Java/Makefile.am, interfaces/Java/jni/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/tests/Makefile.am, src/Makefile.am,
+	tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Grid/Makefile.am, tests/MIP_Problem/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Polyhedron/Makefile.am, tests/Powerset/Makefile.am: Added
+	rules so that `make -n' and `make -n check' work.
+
+2009-04-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox: Updated BHZ09b.
+
+2009-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, tests/Polyhedron/memory1.cc: Test program
+	tests/Polyhedron/memory1 disabled on the zSeries s390x platform.
+
+2009-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README, TODO, configure.ac: Updated for PPL 0.10.2.
+
+2009-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am, interfaces/C/Makefile.am,
+	src/Makefile.am: Libtool -version-info updated for PPL 0.10.2.
+
+2009-04-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4: Accommodate version 4.3.0 of GMP.  Starting from GMP version 4.3.0 (released a few hours after PPL
+	0.10.1), the gmp_version variable always contains three parts.  In
+	previous versions the patchlevel was omitted if it was 0.  This
+	change broke our GMP detection procedure.
+
+2009-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/ppl_interface_generator_common_dat.m4,
+	src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh, src/Grid.defs.hh,
+	src/Grid.inlines.hh, src/Grid_public.cc,
+	src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	src/Polyhedron.inlines.hh, src/Polyhedron_public.cc,
+	tests/Powerset/addconstraints1.cc, tests/Powerset/intersection1.cc: 
+	Initiated the removal of the methods deprecated in PPL 0.10.
+
+2009-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc: Improved.
+
+2009-04-14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/README.doc: Updated to refer to git and to mention possible
+	names of TeX config files.
+
+2009-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Update version.
+
+2009-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog: Mark ChangeLog.
+
+2009-04-14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog: Mark ChangeLog.
+
+2009-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit d3f29a9c56e680f46428916490d4ec2c00210c66 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Apr 13 16:41:28 2009 +0200
+
+2009-04-13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc: Disabled test10() on the
+	Alpha.
+
+2009-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 64d70efe40c253409d12f0159eadb4b95a1f105f Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sun Apr 12 10:39:55 2009 +0200
+
+2009-04-12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_biblio.sed, doc/definitions.dox: 
+	Bibliography updated.  The generated bibliography required manual intervention in a few
+	places, also because of a couple of Doxygen bugs and limitations
+	(see http://bugzilla.gnome.org/show_bug.cgi?id=578739 and
+	http://bugzilla.gnome.org/show_bug.cgi?id=578740).
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/.gitignore, interfaces/Prolog/XSB/.gitignore,
+	interfaces/Prolog/YAP/.gitignore: Added missing patterns.  Removed
+	obsolete ones.
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .gitignore, Watchdog/doc/.gitignore, doc/.gitignore,
+	interfaces/Prolog/XSB/.gitignore: Added missing patterns.
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl-0.10-bigendian.patch, fedora/ppl-0.10-configure.patch,
+	fedora/ppl-0.10.1-Makefile.patch, fedora/ppl.spec: Updated for PPL
+	0.10.1.
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 8707f62b598769d6802282c5f762b63b607ed109 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Sat Apr 11 08:37:36 2009 +0200
+
+2009-04-11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am: Fixed reference to CLPQ_TESTS.
+
+2009-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 8e9f007fa2a5491ee1810e83fc24a6daa2829516 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Fri Apr 10 22:32:54 2009 +0200
+
+2009-04-10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh: Only use fmaf(), fma() and fmal() if
+	they are fast.
+
+2009-04-10  Roberto Bagnara <roberto at freebsd.homenet.telecomitalia.it>
+
+	* configure.ac: Version number bumped.
+
+2009-04-10  Roberto Bagnara <roberto at freebsd.homenet.telecomitalia.it>
+
+	* src/checked_float.inlines.hh: Do not use fma(), fmaf() and fmal()
+	on FreeBSD.  fma() does not respect rounding, fmaf() and fmal() may
+	have the same problem.
+
+2009-04-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Mentioned the AIDA 2007 project.
+
+2009-04-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Acknowledge the contribution of HiPEAC.
+
+2009-04-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Acknowledge the contribution of INRIA.
+
+2009-04-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Acknowledge the contribution of AMD.  Fixed mistaked of
+	previous commit.
+
+2009-04-09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS: Acknowledge the contribution of Kenneth MacKenzie.
+
+2009-04-07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/unconstrain1.cc: Disabled test07() on the
+	Alpha.
+
+2009-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit 52d769bff2e50c45330bdca9a955e33c9526337e Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Mon Apr 6 20:21:25 2009 +0200
+
+2009-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/cvs2cl.pl, devtools/git2cl, devtools/update_ChangeLog: 
+	Machinery to generate ChangeLog adapted to Git.  This is still
+	highly unsatisfactory, as it requires manual intervention.
+
+2009-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-04-06  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* demos/ppl_lcdd/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	devtools/print_nonascii_lines: Avoid differences generated by
+	locale.
+
+2009-04-06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am: Set LC_COLLATE=C in addition to
+	LANG=C.
+
+2009-04-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc: Disabled
+	test04() on the Alpha.
+
+2009-04-05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc,
+	tests/Octagonal_Shape/disjoint1.cc: Disabled a couple of tests on
+	the Alpha.
+
+2009-04-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS, Watchdog/README, Watchdog/configure.ac,
+	Watchdog/src/Makefile.am: Updated for PWL 0.7.
+
+2009-04-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README: Updated for PPL 0.10.1.
+
+2009-04-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: More NEWS items added.  Tentative release date set to April
+	14, 2009.
+
+2009-04-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc: Do not use the same object to play
+	different roles in the same method call.  In calls to methods
+	Box::difference_assign and Box::concatenate_assign we were binding
+	the very same Box object both to the (modifiable) implicit argument
+	*this and to the (const) explicit argument y.
+
+2009-04-03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: Fixed a missing initialization bug in
+	Box::concatenate_assign.  Also improved methods
+	add_space_dimensions*: instead of adding new uninitialized intervals
+	and later initialize them, we now directly add properly initialized
+	intervals.
+
+2009-04-03  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Box.templates.hh: Avoid warning of unused variable space_dim.
+
+2009-04-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/ppl_c_test.cc: Work around a bug affecting some
+	versions of <stdio.h>.
+
+2009-04-02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4,
+	m4/ac_cxx_long_double_binary_format.m4: Added missing uses of
+	AC_REQUIRE; removed a spurious one.  Version number bumped.
+
+2009-04-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am, interfaces/OCaml/tests/Makefile.am: Use
+	@mlgmp_dir@ instead of +gmp for the -I option of ocamldoc.
+
+2009-04-02  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am: Fixed parallel make.
+
+2009-04-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Added a couple of items.
+
+2009-04-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO: We no longer have FIXME's for 0.10.1.
+
+2009-04-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh: Another FIXME postponed to 0.11.
+
+2009-04-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh, tests/Box/refinewithconstraint1.cc: A couple
+	of FIXME postponed to 0.11.
+
+2009-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh: Code duplication and useless bitwise
+	manipulation avoided.
+
+2009-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh: FIXME resolved.
+
+2009-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions2.cc: Disabled test19() on the Alpha.
+
+2009-04-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc: Adapted test
+	Box/ascii_dump_load1.cc and FIXME removed.
+
+2009-04-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Box.templates.hh: Typo fixed.
+
+2009-04-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Box.defs.hh, src/Box.templates.hh, tests/Box/Makefile.am,
+	tests/Box/limitedcc76extrapolation1.cc: Revised the implementation
+	for Box<ITV>::limited_cc76_extrapolation_assign() so as to use the
+	limiting constraint system to limit the widened box.  The
+	FIXME(0.10.1) there is now removed.
+
+2009-04-01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/empty1.cc: Test adapted and fixme removed.
+
+2009-04-01  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	src/Pointset_Powerset.templates.hh, tests/Powerset/fromgrid1.cc: 
+	Changes to deal with //FIXME(0.10.1): the following is a bug! in
+	src/Pointset_Powerset.templates.hh As Grids are non-convex, the constructor for a powerset of nnc
+	polyhedra from a powerset of grids has been implemented separately
+	from the generic case. A test added to show that there was a bug
+	which is now fixed.  The "//FIXME(0.10.1): ..." has been removed but a new FIXME added
+	indicating this code will break if other non-convex or non-linear
+	domains are added
+
+2009-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README, src/Makefile.am: Updated for PPL 0.10.1.
+
+2009-04-01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: New items for PPL 0.11 added.  Other items scheduled for PPL
+	0.11.
+
+2009-03-31  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/DB_Matrix.templates.hh, src/OR_Matrix.templates.hh: Made
+	ascii_load more restrictive.
+
+2009-03-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Indentation fixed.
+
+2009-03-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit ccc5ce00a303af09a7e37d120695a2c1cbb37834 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Tue Mar 31 17:37:40 2009 +0000
+
+2009-03-31  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Box.inlines.hh: Postponed FIXME.
+
+2009-03-31  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Init.cc: Removed FIXME and documented the default value.
+
+2009-03-31  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* TODO: Added TODO item.
+
+2009-03-31  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Polyhedron_nonpublic.cc: Postponed FIXME.
+
+2009-03-31  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Fixed run_tests make.
+
+2009-03-31  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* src/Pointset_Powerset.templates.hh: Removed two FIXME(0.10.1)s
+	which have been checked and for which nothing needs to be done.
+
+2009-03-31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc,
+	tests/Octagonal_Shape/difference1.cc: Disabled some tests on the
+	Alpha.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, configure.ac: Version number bumped.  The
+	name of the program is Autoconf.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/OCaml/tests/test1.ml: Register OCaml interface
+	exceptions; added a few tests.  The interface exceptions should be
+	registered both in the .ml and .mli files.  Added a test for the
+	invalid argument exception (negative space dimension) and for the
+	set/reset timeout functions.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Added one item for PPL 0.11.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations4.cc: Disable test19() on the Alpha.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am: Fixed *_CPPFLAGS variables.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/formatted_output.c: Include "ppl_c_test.h"
+	instead of "ppl_c.h".
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/ppl_c_test.h: Include "ppl_c.h".
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Avoid redefining NDEBUG.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/tests/Makefile.am, interfaces/OCaml/tests/test1.ml: 
+	Register PPL_timeout_exception in the OCaml interface.  Avoid flood
+	of warnings by directly thowing CAML exceptions in CATCH_ALL.  Still
+	debugging the handling of timeouts.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh: Removed the tag "(0.10.1)"
+	from a FIXME unrelated to with PPL 0.10.1.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh: Obsolete FIXME removed: methods Box::refine_*
+	were fixed long ago.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.inlines.hh, src/globals.defs.hh: 
+	Decided that it is not worth renaming
+	PPL_OUTPUT_TEMPLATE_DEFINITIONS.  Calling it
+	PPL_OUTPUT_1_PARAM_TEMPLATE_DEFINITIONS would not buy us anything:
+	FIXMEs removed.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am,
+	interfaces/OCaml/tests/test1.ml: Let OCaml tests also link with the
+	pwl library, if configured.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.alpha: Warn about the GCC bug affecting exception handling
+	on the Alpha.
+
+2009-03-30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Consider switching to MLGMPIDL for the OCaml interface.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/tests/MIP_Problem_test1.java: Added wrap_string to
+	java interface.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/tests/MIP_Problem_test1.java: Reverted bogus
+	commits.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Added file.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am: Added file.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/tests/MIP_Problem_test1.java: Added test.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/parma_polyhedra_library/IO.java,
+	interfaces/Java/parma_polyhedra_library/Makefile.am: Added java.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Fix2.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Fix.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/Java/jni/ppl_java_globals.cc: Added wrap_string.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh: Helper OCaml interface
+	  function renamed for consistency.  value_to_unsigned_native -->
+	value_to_unsigned (to be consistent with similar functions in the
+	Java and Prolog interfaces).
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO, Watchdog/src/Watchdog.defs.hh: Moved TODO items to their
+	place.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/Prolog/ppl_prolog_common.cc: Added timeout functions to
+	the OCaml interface.  Also removed duplicate CATCH_ALL macro
+	definitions in the Prolog and OCaml interfaces.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox,
+	interfaces/Prolog/Prolog_interface.dox: Improvements to the OCaml
+	and Prolog interface documentation.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/.gitignore, tests/BD_Shape/Makefile.am,
+	tests/Box/.gitignore, tests/Box/Makefile.am,
+	tests/Octagonal_Shape/.gitignore, tests/Octagonal_Shape/Makefile.am: 
+	Fixed restore of parallelized tests.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Revert "Restore parallelized
+	tests." This reverts commit b163fee3b048fe3dd07be912850ec042f4d24b2d.
+
+2009-03-30  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/Makefile.am, tests/Box/Makefile.am,
+	tests/Octagonal_Shape/Makefile.am: Restore parallelized tests.
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox,
+	interfaces/Prolog/ppl_interface_generator_prolog_dox.m4: Minor
+	improvement to documentation.  In the documentation block for
+	\defgroup, do not use \brief if there does not also exist a detailed
+	documentation section (otherwise, doxygen will insert a spurious
+	"More..." link pointing to the same page).
+
+2009-03-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox, interfaces/C/ppl_c_header.h,
+	interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	, interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.jav
+	a: Avoid spurious vertical space in the documentation.  When adding
+	a member group using doxygen commmand \name and the multiline style
+	special comments, also add a \brief command if there is no detailed
+	documentation for the group.
+
+2009-03-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli: Added string wrapping helper
+	function to OCaml interface.
+
+2009-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: Moved changelogs and PostScript and PDF versions
+	of the GPL to the `docs' subpackages. This saves considerable space
+	on the live media.
+
+2009-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am: Temporary workaround to force
+	linking with C++.
+
+2009-03-29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	interfaces/OCaml/tests/test1.ml: Improved the OCaml interfacing of
+	PPL dimensions and coefficients.  Added new helper functions:  - value_to_unsigned_native<U_Int>  - ppl_dimension_to_value  - value_to_ppl_dimension  - mpz_ptr_val and mpz_class_val  - build_ppl_Variable.  Prefer using Val_emptylist to Val_int(0).
+
+2009-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc: Disable these tests on the
+	Alpha.
+
+2009-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-03-29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	src/ppl-config.cc.in: Try to accommodate more non-GNU
+	implementations of `getopt()'.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.inlines.hh: Remove unimplemented and unused
+	functions.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	src/ppl-config.cc.in: Try to accommodate non-GNU implementations of
+	`getopt()'.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Bit_Row.inlines.hh: Some systems do not have
+	<strings.h>.  On such systems ffs(3) may be defined in <string.h>.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Done item removed.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, ChangeLog-2001-2008 => ChangeLog_2001-2008,
+	Watchdog/ChangeLog, Watchdog/{ChangeLog-2001-2008 =>
+	ChangeLog_2001-2008}: Change logs updated.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, configure.ac: Improved the semantics of the
+	--enable-watchdog configure option.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Interval.inlines.hh: Removed useless functions.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frombox1.cc: Fixed and reactivated test05().
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frombox1.cc: Parameterized test05().
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh: Fixed indentation.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked.inlines.hh: These efficiency related FIXME's are not
+	scheduled for 0.10.1
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Checked_Number.inlines.hh: Documented ROUND_NOT_NEEDED FIXME.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* TODO, src/Init.cc, src/checked_mpq.inlines.hh: Documented rational
+	sqrt precision and implemented a more precise variant for numbers <
+	1.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_mpz.inlines.hh: Avoid unrequested call to
+	mpz_divisible_p.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_exact_output.m4,
+	m4/ac_cxx_float_exact_output.m4,
+	m4/ac_cxx_long_double_exact_output.m4: Uuse the
+	PPL_CXX_*_BINARY_FORMAT macros.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/Box/frombox1.cc: Disabled failing test.
+
+2009-03-28  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/checked_mpz.inlines.hh: Avoid abuse of mpz_divexact.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am: Tweak for MinGW.  Force the use of
+	the C++ compiler for linking.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.c: Include <stdlib.h> instead
+	of <malloc.h>.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am: Allow testing under MinGW.
+
+2009-03-28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Detect MinGW, defining the HOST_OS_MINGW Automake
+	conditional.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/ppl_lpsol.1,
+	demos/ppl_lpsol/ppl_lpsol.c,
+	demos/ppl_lpsol/ppl_lpsol_extra_man_text: The `ppl_lpsol' program
+	can now be built and checked with cross-compilation.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc: Minor code readability improvements.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h, src/wrap.hh: Comments improved.
+
+2009-03-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h: A couple of minor corrections.
+
+2009-03-27  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_header.h: Fixed parameter name.
+
+2009-03-27  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_header.h: Moved ppl_io_wrap_string
+	documentation.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.1, doc/ppl-config.1: Man pages updated.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.1,
+	demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/ppl_lcdd_extra_man_text: 
+	The `ppl_lcdd' program can now be built and checked with
+	cross-compilation.
+
+2009-03-27  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh,
+	interfaces/C/ppl_c_stream.cc, interfaces/C/ppl_c_stream.defs.hh,
+	interfaces/C/ppl_c_stream.h, interfaces/C/ppl_c_stream.inlines.hh,
+	interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4, interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	src/Makefile.am, src/c_streambuf_format.cc,
+	src/c_streambuf_format.defs.hh, src/c_streambuf_format.types.hh,
+	src/c_streambuf_format_settings.h, src/pretty_print.cc,
+	src/pretty_print.hh, src/pretty_print.inlines.hh, src/wrap.cc,
+	src/{c_streambuf_format.inlines.hh => wrap.hh}: Get rid of
+	pretty_printing stuff. A string wrapping function is made available.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog: Change logs covering the changes
+	made in the CVS repository in 2009.  They will be replaced by
+	up-to-date change logs obtained from git.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog => ChangeLog-2001-2008, Watchdog/{ChangeLog =>
+	ChangeLog-2001-2008}: Renamed and frozen: the ChangeLog-2001-2008
+	should never be changed again.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog: Updated to 2008-12-31.
+
+2009-03-27  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/Makefile.am, tests/BD_Shape/run_tests,
+	tests/Box/Makefile.am, tests/Box/run_tests,
+	tests/Octagonal_Shape/Makefile.am, tests/Octagonal_Shape/run_tests: 
+	Fixed make check.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint_System.cc: Missing else branch added.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc, src/Congruence.cc, src/Congruence_System.cc,
+	src/Constraint_System.cc, src/Generator_System.cc,
+	src/Grid_Generator_System.cc, src/Linear_Row.cc,
+	src/Linear_System.cc, src/Matrix.cc, src/Row.cc: ascii_load()
+	methods now perform more stringent checks on the input.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/ascii_dump_load1.cc: Spurious spaces removed.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload2.cc: Spurious spaces removed.
+
+2009-03-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc, tests/Polyhedron/watchdog1.cc: Fixed
+	the formatting of do-while loops.
+
+2009-03-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/Prolog/.gitignore,
+	interfaces/Prolog/Prolog_interface.dox: Added several missing
+	functions to the OCaml interface.  Minor corrections to the
+	documentation.
+
+2009-03-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc: Fixed several garbage
+	collecting issues in the OCaml interface.  - Helper functions returning OCaml value types that have not been
+	  registered yet with the garbage collector are now named
+	unregistered_value_p_*; - Added appropriate calls to CAMLlocal* macros where appropriate; - Use the safe Store_field(a, b, c) instead of the unsafe Field(a,
+	b) = c.
+
+2009-03-26  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* tests/BD_Shape/.gitignore, tests/BD_Shape/Makefile.am,
+	tests/Box/.gitignore, tests/Box/Makefile.am,
+	tests/Octagonal_Shape/.gitignore, tests/Octagonal_Shape/Makefile.am: 
+	Tests have to be done unconditionally.
+
+2009-03-26  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* NEWS: Report on two bugs fixed in the OCaml interface.
+
+2009-03-26  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/tests/test1.ml: Fixed a bug where the tokens for
+	widening were not being updated.
+
+2009-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.cc, tests/ppl_test.cc: Support systems
+	that do not define `siginfo_t'.
+
+2009-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, configure.ac: Added checks for the
+	availability of `siginfo_t'.
+
+2009-03-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4: We can infer the possibility to
+	control the CPU even when cross-compiling.  This happens (at least)
+	on i386 and sparc (provided we have <ieeefp.h>).
+
+2009-03-25  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_stream.cc,
+	interfaces/C/tests/print_to_buffer.c, src/c_streambuf_format.cc,
+	src/c_streambuf_format.defs.hh, src/c_streambuf_format.inlines.hh,
+	src/c_streambuf_format_settings.h: Better parameters for formatted
+	output.
+
+2009-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh: Properly use PPL_FPMATH_MAY_USE_387 and
+	PPL_FPMATH_MAY_USE_SSE.
+
+2009-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc: Depend on PPL_CAN_CONTROL_FPU.
+
+2009-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Typo fixed.
+
+2009-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* : commit b5d7b09c10aea7c95b9d2693986e2e4e549d3a12 Author: Roberto
+	Bagnara <bagnara at cs.unipr.it> Date:   Wed Mar 25 21:06:01 2009 +0100
+
+2009-03-25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/congruences1.cc, tests/Box/max_min1.cc: Disable more
+	tests that fail on the Alpha due to a GCC bug.
+
+2009-03-25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh,
+	tests/BD_Shape/simplifyusingcontext1.cc,
+	tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/simplifyusingcontext1.cc,
+	tests/Polyhedron/simplifyusingcontext1.cc: Implemented
+	Octagonal_Shape::simplify_using_context_assign().  The efficiency of
+	the method needs improving. Added a few tests.
+
+2009-03-25  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* TODO: TODO item - Check the configuration dependent documentation for Prolog, done
+	and removed.
+
+2009-03-25  Patricia Hill <p.m.hill at leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/OCaml/tests/test1.ml: Where the result type is unit,
+	the type returned by C++ must be a CAMLprim value type and not a
+	void.
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruences1.cc,
+	tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	tests/Octagonal_Shape/generalizedaffinepreimage2.cc: Exception
+	handling is broken in GCC on the Alpha: commented out some tests.
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/formatted_output.c: Reduced DIMENSION to 100.
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, interfaces/C/tests/formatted_output.c,
+	m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+	m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+	m4/ac_cxx_limit_memory.m4, m4/ac_cxx_long_double_exact_output.m4,
+	m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4: 
+	Improved the actions of AC_RUN_IFELSE when cross-compiling.
+
+2009-03-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/Makefile.am: Fixed file names.
+
+2009-03-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention the bug corrected for method
+	Octagonal_Shape<T>::affine_image().
+
+2009-03-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_header.h: Fixed comment.
+
+2009-03-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/ppl_c_header.h: Fixed indentation.
+
+2009-03-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Corrected bug affecting method
+	Octagonal_Shape::affine_image().
+
+2009-03-24  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh, src/c_stream.cc
+	=> interfaces/C/ppl_c_stream.cc, interfaces/C/ppl_c_stream.defs.hh,
+	interfaces/C/ppl_c_stream.h, interfaces/C/ppl_c_stream.inlines.hh,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h, src/Makefile.am,
+	src/c_stream.h, src/c_streambuf.inlines.hh,
+	src/c_streambuf_format.cc, src/c_streambuf_format.defs.hh,
+	src/c_streambuf_format.inlines.hh,
+	src/c_streambuf_format_settings.h: Cleaned C streams implementation.
+
+2009-03-24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc: Test test17() shows a bug
+	in method Octagonal_Shape::affine_image().  The bug is triggered
+	  when the affine image is of the form var -> var + n and the
+	octagonal shape has constraints relating var with another space
+	dimension having index smaller than var.
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure, TODO: Explained the `--disable-ppl_lcdd' and
+	`--disable-ppl_lcdd' configure options.
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: There are no GNU Prolog packages available on
+	ia64: disable the GNU Prolog interface also on those platforms
+	(besides ppc64, s390 and s390x).
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: Synchronized with the Fedora repository.
+
+2009-03-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h,
+	interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h, src/c_stream.h: Added some
+	more infrastructure.  Variables renamed.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/formatted_output.c,
+	interfaces/C/tests/print_to_buffer.c: Build restored.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/tests/print_to_buffer.c, src/c_stream.cc,
+	src/c_stream.h, src/c_streambuf_format.cc: Added repeated char for
+	left and right margin.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h, src/c_stream.h: Some fixes.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am, interfaces/C/tests/{cxxoutput.c
+	=> formatted_output.c}, interfaces/C/tests/print_to_buffer.cc: Done
+	some cleaning.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am, interfaces/C/ppl_c_header.h,
+	interfaces/C/tests/Makefile.am,
+	interfaces/C/tests/print_to_buffer.c,
+	interfaces/C/tests/print_to_buffer.h, src/c_stream.h: Started the
+	installation of the new formatted output machinery.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/c_stream.cc, src/c_stream.h, src/c_streambuf_format.cc: Better
+	name.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/c_stream.cc, src/c_stream.h, src/c_streambuf_format.cc: Bug
+	fix: ostringstream.str() returns a temporary.
+
+2009-03-23  Enea Zaffanella <zaffanella at spartacus.cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc: Added a test.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/c_stream.cc, src/c_stream.h, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/c_streambuf_format.cc,
+	src/c_streambuf_format.defs.hh: Separated wrap before from wrap
+	after. Bug fixes.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh: Readability improvements.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh: Fixed a bug (that is inconsequential for
+	the current code base).  We were using `m % 2 == 1' instead of `m %
+	2 != 0', with `m' a signed number that could be negative.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/c_stream.cc, src/c_stream.h: Added ppl_io_ostream_buffer_clear
+	function.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/c_stream.cc, src/c_stream.h: Added write functions for native
+	types.
+
+2009-03-23  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Makefile.am, src/c_stream.cc, src/c_stream.h,
+	src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/c_streambuf_format.cc,
+	src/c_streambuf_format.defs.hh, src/c_streambuf_format.inlines.hh,
+	src/c_streambuf_format.types.hh: Added filtered streams. Implemented
+	format filter.
+
+2009-03-23  Enea Zaffanella <zaffanella at spartacus.cs.unipr.it>
+
+	* doc/Makefile.am: Add dependencies between HTML manuals for
+	parallel builds.  The distributed built HTML manuals logically
+	depend on the built tag file, which is not distributed; hence a
+	direct dependency cannot be added (it would break a `make distcheck'
+	check). As a workaround, they now depend on the core HTML manual,
+	which is built _and_ distributed.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh: Obsolete FIXME removed.
+
+2009-03-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Little formatting improvement.
+
+2009-03-23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/pretty_print.cc, src/pretty_print.hh: Use consistent parameter
+	names in helper function wrap.
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a: Updated to reflect the new way
+	`ppl_lpsol' is invoked.
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, Watchdog/Makefile.am, Watchdog/pwl-config.sed,
+	ppl-config.sed: Tightened the machinery used to generate the
+	configuration headers.
+
+2009-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/linearexpression1.cc: Added a test for
+	operator-(var, expr) and operator-(expr, var).
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc, src/Linear_Expression.inlines.hh: 
+	Improved functions and methods to build linear expressions.  Avoid
+	complex inline functions and methods.
+
+2009-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	src/Linear_Expression.inlines.hh: Three FIXMEs related to
+	Linear_Expression resolved.  The three operators are now friend of
+	Linear_Expression: hence they can use the sizing constructors and
+	limit the use of short-lived temporaries.
+
+2009-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: Dealt with a FIXME related to
+	variable names.
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	src/Linear_Expression.inlines.hh, tests/Polyhedron/.gitignore,
+	tests/Polyhedron/Makefile.am, tests/Polyhedron/linearexpression1.cc: 
+	FIXME resolved.  Fixed a bug in Linear_Expression(Variable v,
+	Variable w).  The bug would cause a wrong result to be computed when
+	v == w.
+
+2009-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS: Mention the bug fixed with Commit:
+	6a6734db48e2ca605dfc27ce5f1a923eb867ed25
+
+2009-03-22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m
+	4, interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4: 
+	Corrected a bug in the interfacing of drop_disjunct for Java, Ocaml
+	and Prolog.  Also corrected a wrong test in the automatically
+	generated test suite for the OCaml interface: we were trying to
+	decrement an iterator pointing to the start of the sequence of
+	disjuncts.
+
+2009-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh: Reworded misleading comment.
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/{linexpression1.cc => linearexpression1.cc}: Test
+	program renamed.
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linexpression1.cc: Rewritted test01().  Added
+	test02().
+
+2009-03-22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .gitignore, Makefile.am, Watchdog/Makefile.am,
+	Watchdog/configure.ac, Watchdog/pwl-config.sed, configure.ac,
+	ppl-config.sed: New machinery to create ppl-config.h and
+	pwl-config.h.
+
+2009-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/pretty_print.hh, src/pretty_print.inlines.hh: Destructor of
+	abstract class Write_Function has to be virtual.
+
+2009-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	interfaces/C/ppl_interface_generator_c_h_code.m4,
+	interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	, interfaces/Java/jni/ppl_java_globals.cc,
+	interfaces/Java/parma_polyhedra_library/Congruence.java,
+	interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	interfaces/Java/parma_polyhedra_library/Constraint.java,
+	interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	interfaces/Java/parma_polyhedra_library/Generator.java,
+	interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java.m4,
+	interfaces/Java/parma_polyhedra_library/ppl_interface_generator_jav
+	a_classes_java_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	interfaces/OCaml/ppl_ocaml_common.cc,
+	interfaces/OCaml/ppl_ocaml_globals.ml,
+	interfaces/OCaml/ppl_ocaml_globals.mli,
+	interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	interfaces/Prolog/ppl_interface_generator_prolog_procedure_generato
+	rs.m4, interfaces/Prolog/ppl_prolog_common.cc,
+	interfaces/Prolog/ppl_prolog_common.defs.hh,
+	interfaces/ppl_interface_generator_common_procedure_generators.m4: 
+	Added the new pretty print functionality to Java, OCaml and Prolog
+	interfaces.  The predicate takes 3 arguments for specifying
+	preferred wrapping behavior.  For Prolog, new predicate is called
+	ppl_CLASS_pretty_print_to_atom/5 and put the result in the last
+	argument as an atom.  For Java, method takes a Writer as the first
+	argument.  For Caml, function ppl_CLASS_pretty_print returns a caml
+	string.  While at it, also added missing ascii_dump method to Caml and Java
+	interfaces, as well as for the MIP_Problem Prolog interface.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/pretty_print.cc, src/pretty_print.hh: Added a new helper
+	function for the wrapping of lines.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Typo fixed.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/C/C_interface.dox, interfaces/C/ppl_c_header.h,
+	interfaces/C/ppl_c_implementation_common.cc,
+	interfaces/C/ppl_c_implementation_common.defs.hh: The C interface
+	now provides functions of the form   int ppl_io_asprint_Polyhedron(char** strp, P x) where `P' is any opaque pointer to a const PPL object. These
+	functions print `x' to a malloc-allocated string, a pointer to which
+	is returned via `strp'.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Selected the items that should be done for 0.10.1: postponed
+	the others.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh: Two non-urgent FIXMEs better
+	documented.
+
+2009-03-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/Makefile.am, src/c_streambuf.cc, src/c_streambuf.defs.hh,
+	src/c_streambuf.inlines.hh, src/c_streambuf.types.hh: Added callback
+	based streambufs.
+
+2009-03-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* src/stdiobuf.cc: Fixed typo.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, configure.ac: Minimum Autoconf version
+	brought back to 2.61.
+
+2009-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am: Added files pretty_print.*.
+
+2009-03-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/pretty_print.cc, src/pretty_print.hh,
+	src/pretty_print.inlines.hh: pretty_print.* contain helper datatypes
+	and functions for pretty printing.  Template functions pretty_print
+	and c_pretty_print provide wrapped output using a Write_Function
+	object to write to destination.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-03-21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .gitignore, NEWS, Watchdog/.gitignore, Watchdog/configure.ac,
+	Watchdog/m4/Makefile.am, Watchdog/m4/ax_prefix_config_h.m4,
+	Watchdog/src/Makefile.am, configure.ac, instchk.hh, m4/Makefile.am,
+	m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+	m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_exact_output.m4,
+	m4/ac_cxx_ieee_inexact_flag.m4, m4/ac_cxx_limit_memory.m4,
+	m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4,
+	m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+	m4/ax_prefix_config_h.m4: Got rid of AX_PREFIX_CONFIG_H.
+
+2009-03-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .gitignore: Pattern `*~' added.  Patterns sorted.
+
+2009-03-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac, configure.ac, m4/ac_prog_java.m4,
+	m4/ac_prog_javac.m4: Avoid using obsolete Autoconf macros.
+
+2009-03-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4, m4/ac_cxx_double_binary_format.m4,
+	m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_float_binary_format.m4,
+	m4/ac_cxx_float_exact_output.m4,
+	m4/ac_cxx_long_double_binary_format.m4,
+	m4/ac_cxx_long_double_exact_output.m4: AC_RUN_IFELSE invocations now
+	have a safe action for cross-compiling.
+
+2009-02-22  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* .cvsignore => .gitignore, Watchdog/.cvsignore,
+	Watchdog/.gitignore, Watchdog/doc/{.cvsignore => .gitignore},
+	Watchdog/m4/.cvsignore, Watchdog/m4/.gitignore,
+	Watchdog/src/.cvsignore, Watchdog/src/.gitignore,
+	Watchdog/tests/.cvsignore, Watchdog/tests/.gitignore,
+	Watchdog/utils/.cvsignore, Watchdog/utils/.gitignore,
+	debian/.cvsignore, debian/.gitignore, demos/.cvsignore,
+	demos/.gitignore, demos/ppl_lcdd/.cvsignore,
+	demos/ppl_lcdd/.gitignore, demos/ppl_lcdd/examples/.cvsignore,
+	demos/ppl_lcdd/examples/.gitignore, demos/ppl_lpsol/{.cvsignore =>
+	.gitignore}, demos/ppl_lpsol/examples/.cvsignore,
+	demos/ppl_lpsol/examples/.gitignore, devtools/{.cvsignore =>
+	.gitignore}, doc/{.cvsignore => .gitignore}, fedora/.cvsignore,
+	fedora/.gitignore, interfaces/.cvsignore, interfaces/.gitignore,
+	interfaces/C/{.cvsignore => .gitignore},
+	interfaces/C/tests/.cvsignore, interfaces/C/tests/.gitignore,
+	interfaces/Java/.cvsignore, interfaces/Java/.gitignore,
+	interfaces/Java/jni/.cvsignore, interfaces/Java/jni/.gitignore,
+	interfaces/Java/parma_polyhedra_library/{.cvsignore => .gitignore},
+	interfaces/Java/tests/{.cvsignore => .gitignore},
+	interfaces/OCaml/{.cvsignore => .gitignore},
+	interfaces/OCaml/tests/.cvsignore,
+	interfaces/OCaml/tests/.gitignore, interfaces/Prolog/{.cvsignore =>
+	.gitignore}, interfaces/Prolog/Ciao/{.cvsignore => .gitignore},
+	interfaces/Prolog/GNU/{.cvsignore => .gitignore},
+	interfaces/Prolog/SICStus/.cvsignore,
+	interfaces/Prolog/SICStus/.gitignore,
+	interfaces/Prolog/SWI/{.cvsignore => .gitignore},
+	interfaces/Prolog/XSB/{.cvsignore => .gitignore},
+	interfaces/Prolog/YAP/{.cvsignore => .gitignore},
+	interfaces/Prolog/tests/{.cvsignore => .gitignore}, m4/.cvsignore,
+	m4/.gitignore, src/{.cvsignore => .gitignore}, tests/.cvsignore,
+	tests/.gitignore, tests/Ask_Tell/.cvsignore,
+	tests/Ask_Tell/.gitignore, tests/BD_Shape/{.cvsignore =>
+	.gitignore}, tests/Box/{.cvsignore => .gitignore},
+	tests/Grid/{.cvsignore => .gitignore},
+	tests/MIP_Problem/{.cvsignore => .gitignore},
+	tests/Octagonal_Shape/{.cvsignore => .gitignore},
+	tests/Partially_Reduced_Product/{.cvsignore => .gitignore},
+	tests/Polyhedron/{.cvsignore => .gitignore},
+	tests/Powerset/{.cvsignore => .gitignore}, utils/.cvsignore,
+	utils/.gitignore: Replaced .cvsignore with .gitignore.
+
+2009-02-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* interfaces/C/.cvsignore, interfaces/Java/jni/.cvsignore,
+	interfaces/OCaml/.cvsignore, interfaces/OCaml/tests/.cvsignore,
+	interfaces/Prolog/.cvsignore, interfaces/Prolog/SWI/.cvsignore,
+	interfaces/Prolog/tests/.cvsignore, tests/Grid/.cvsignore,
+	tests/Partially_Reduced_Product/.cvsignore,
+	tests/Polyhedron/.cvsignore, tests/Powerset/.cvsignore: Added
+	missing files.
+
+2009-02-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* .cvsignore, doc/.cvsignore, interfaces/C/.cvsignore,
+	interfaces/Java/jni/.cvsignore,
+	interfaces/Java/parma_polyhedra_library/.cvsignore,
+	interfaces/OCaml/.cvsignore, interfaces/Prolog/.cvsignore,
+	interfaces/Prolog/tests/.cvsignore: Added other patterns.
+
+2009-02-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* .cvsignore: Added common ignored patterns.
+
+2009-02-21  Abramo Bagnara <abramo.bagnara at gmail.com>
+
+	* .cvsignore, interfaces/Prolog/.cvsignore: Commented out dangerous
+	entries.
+
+2009-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl-0.10-configure.patch, fedora/ppl.spec: Install the
+	documentation according to the Fedora packaging conventions.
+
+2009-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl-0.10-bigendian.patch: Put under CVS control.
+
+2009-02-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: Implemented a better workaround for the bug
+	affecting PPL 0.10 on big-endian architectures.  There are no GNU Prolog packages available on s390 and s390: disable
+	the GNU Prolog interface also on those platforms (besides ppc64).
+
+2009-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: Avoid using GNU Make extensions.
+
+2009-02-17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc: Two FIXMEs resolved.
+
+2009-02-16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am, tests/Polyhedron/Makefile.am,
+	tests/ppl_test.hh: Include "ppl_header.hh" instead of "ppl.hh": this
+	greatly facilitates debugging of test programs.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am: In ppl_include_files.hh only list the include
+	files that are not included by any other include file.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.defs.hh, src/DB_Row.templates.hh,
+	src/GMP_Integer.inlines.hh, src/Interval_Restriction.defs.hh,
+	src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh, src/Powerset.defs.hh,
+	src/Powerset.templates.hh, src/checked_float.inlines.hh,
+	src/iterator_to_const.defs.hh: Added missing inclusions.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh, src/fpu.defs.hh: Include "compiler.hh" in
+	fpu.defs.hh, not in fpu-ia32.inlines.hh.  As a general rule, do not
+	include general-purpose include files in files that are only
+	conditionally included.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Added missing control operator.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh: Indentation fixed.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh: Include
+	"Partially_Reduced_Product.templates.hh".
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, demos/ppl_lcdd/Makefile.am,
+	demos/ppl_lpsol/Makefile.am: Check for the availability of `fgrep'
+	or its Posix replacement `grep -F'.  Always use $(FGREP) or $(EGREP)
+	in makefiles.
+
+2009-02-15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh, src/checked_ext.inlines.hh,
+	src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh: Added guards
+	against multiple inclusion.
+
+2009-02-04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.defs.hh: Work around the bug affecting the library on
+	big-endian architectures.
+
+2009-02-03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec: Work around the bug affecting PPL 0.10 on
+	big-endian architectures.
+
+2009-02-02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc, tests/Grid/simplifyusingcontext1.cc: Improved
+	the code for handling 0-dim empty polyhedra for
+	Grid::simplify_using_context_assign().  Added a further test for the
+	0-dim polyhedra.
+
+2009-02-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc: Corrected a bug in methods
+	add(_recycled)_generator(s) and simplify_using_context_assign
+	whereby an assertion could have failed under very specific
+	conditions (zero-dim empty polyhedron with a computed inconsistent
+	constraint system becoming a zero-dim universe polyhedron).
+
+2009-02-02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/addgenerator1.cc,
+	tests/Polyhedron/addgenerators1.cc: New tests show an assertion
+	failure when adding the vector space origin to an empty zero-dim
+	space polyhedron, thereby turning it into a zero-dim universe
+	polyhedron. The assertion only fails if the inconsistent constraint
+	system of the empty polyhedron was previously generated.
+
+2009-02-02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/simplifyusingcontext1.cc: Added three further
+	tests to cover all 0-dim cases.  Reordered tests so that all the
+	0-dim tests are consecutive (11-15).
+
+2009-02-02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/simplifyusingcontext1.cc: Added test that has an
+	assertion failure for 0-dim empty polyhedra.
+
+2009-02-01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am, tests/Grid/simplifyusingcontext1.cc: Tests
+	for simplify_using_context_assign() for Grids.
+
+2009-02-01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc: Added code for simplify_using_context_assign()
+	for Grids.  Some other bugs in the comments fixed.
+
+2009-01-30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am: The parallel build problem should
+	now be solved.
+
+2009-01-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am, tests/Box/simplifyusingcontext1.cc: Added
+	test file for method Box::simplify_using_cntext_assign().  Tests
+	test01() and test02() marked as failing, since they depend on method
+	Interval::empty_intersection_assign(), currently provided with a
+	dummy implementation.
+
+2009-01-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh: Drafted an implementation for
+	Box::simplify_using_context_assign().
+
+2009-01-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.templates.hh: Added dummy implementation for method
+	empty_intersection_assign(); corrected partial implementation of
+	method simplify_using_context_assign().
+
+2009-01-28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh: Added specification for new Interval method   template <typename From>   typename Enable_If<Is_Interval<From>::value, void>::type   empty_intersection_assign(const From& y); to be used in the
+	implementation of Box::simplify_using_context_assign.
+
+2009-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Partially work around a bug of AX_PREFIX_CONFIG_H
+	whereby WORDS_BIGENDIAN is not prefixed.  Version number bumped.
+
+2009-01-27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.templates.hh: Drafted a partial implementation for
+	simplify_using_context_assign(); it assumes that the interval is
+	toplogically closed and with no restrictions.
+
+2009-01-27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Added one urgent item.
+
+2009-01-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/simplifyusingcontext1.cc: Test 01 overflows when
+	using 8bit coefficients and assertions are turned on.
+
+2009-01-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc, src/NNC_Polyhedron.cc: Switch to new
+	implementation of poly_hull_assign_if_exact(), based on the results
+	stated in BagnaraHZ09.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Version number bumped.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Support more versions of GLPK.
+
+2009-01-26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac: Fixed copy-and-paste mistake.
+
+2009-01-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact2.cc: Added tests corresponding to
+	examples in BHZ09.
+
+2009-01-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact1.cc: Added a new test.
+
+2009-01-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc: Added implementation of the BHZ09
+	exact upper bound test for NNC polyhedra; Factored out those parts
+	that are common to the C polyhedron case.
+
+2009-01-26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh: Added declarations for two non-public
+	methods (one for the C and another for the NNC case) implementing
+	exact upper bound tests using BHZ09.
+
+2009-01-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS: Wording improved.
+
+2009-01-24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README.configure, configure.ac, interfaces/C/Makefile.am,
+	interfaces/Java/jni/Makefile.am,
+	interfaces/Java/parma_polyhedra_library/Makefile.am,
+	interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+	interfaces/OCaml/tests/Makefile.am,
+	interfaces/Prolog/Ciao/Makefile.am,
+	interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/Makefile.am,
+	interfaces/Prolog/SICStus/Makefile.am,
+	interfaces/Prolog/SWI/Makefile.am,
+	interfaces/Prolog/XSB/Makefile.am,
+	interfaces/Prolog/YAP/Makefile.am,
+	interfaces/Prolog/tests/Makefile.am, m4/m4.m4: The configuration
+	script now explicitly checks that a recent enough version of GNU M4
+	is available if at least one non-C++ interface is enabled (in
+	previous versions this check was not performed and building the
+	library could fail in a mysterious way).  That version is then used
+	in all makefiles.  (Thanks to Tobias Grosser.) Improved configure.ac
+	in various places.
+
+2009-01-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README.configure, configure.ac,
+	interfaces/OCaml/Makefile.am, interfaces/OCaml/tests/Makefile.am: 
+	New configuration option `--with-mlgmp=DIR' allows to specify the
+	installation directory of the ML GMP package.
+
+2009-01-23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Added missing const qualifier.
+
+2009-01-21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am: Corrected so as to behave correctly
+	when using parallel builds: the build of <file>.cmx also generates
+	<file>.o, which is a dependency for the generation of *.a.
+
+2009-01-20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c: Fixed glpk_message_interceptor()
+	(thanks to Kenneth MacKenzie).
+
+2009-01-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/upperboundifexact1.cc: Added test on (higher
+	dimensional) hypercubes.
+
+2009-01-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh: The code fo rthe detection of
+	non-redundant octagonal constraints factored out of the strong
+	  reduction assign method into the new private method
+	non_redundant_matrix_entries(), so that it can be reused in other
+	contexts. In particular, now we also use it in the implementation of
+	upper_bound_assign_if_exact().
+
+2009-01-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh: Declared a new (private) method that
+	is meant to identify the non-redundant octagonal constraints without
+	actually computing a strongly reduced matrix.
+
+2009-01-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/upperboundifexact1.cc: Added a test on hypercubes.
+
+2009-01-20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Method
+	BHZ09_upper_bound_assign_if_exact() improved by exploiting shortest
+	path reduction so as to avoid checks on redundant constraints.
+
+2009-01-19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/upperboundifexact1.cc: Added another test.
+
+2009-01-18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO: Added one important item for next release.
+
+2009-01-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/upperboundifexact1.cc: Tests 1, 3, 4, 9 and
+	10 now succeeds.
+
+2009-01-18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	src/Octagonal_Shape.templates.hh: Drafted an implementation of
+	Octagonal_Shape::upper_bound_assign_if_exact() based on the
+	corresponding theorem in BagnaraHZ09.
+
+2009-01-16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/upperboundifexact1.cc: test10() revised.
+
+2009-01-16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/Makefile.am,
+	tests/Octagonal_Shape/upperboundifexact1.cc: Added a test file for
+	the upper_bound_if_exact() method - copied (with obvious edits) from the BD_Shape test directory.  As the current implementation just returns false, tests that would
+	be expected to succeed have the "_F" tag.  An additional test10 is an example showing that more conditions are
+	needed for octagonal shapes compared to the bd shapes.
+
+2009-01-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/upperboundifexact1.cc: Test test09 no longer fails.
+
+2009-01-13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh: Corrected implementation of
+	BHZ09_upper_bound_assign_if_exact().
+
+2009-01-12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/upperboundifexact1.cc: Added a test showing a bug
+	in the new algorithm.
+
+2009-01-08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	src/BD_Shape.templates.hh: Drafted an implementation for
+	BHZ09_upper_bound_assign_if_exact(); the public method
+	upper_bound_assign_if_exact() is now based on this new (private)
+	method.
+
+2009-01-05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh,
+	src/Partially_Reduced_Product.inlines.hh,
+	src/Partially_Reduced_Product.templates.hh,
+	src/Partially_Reduced_Product.types.hh,
+	tests/Partially_Reduced_Product/Makefile.am,
+	tests/Partially_Reduced_Product/directproduct6.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	tests/Partially_Reduced_Product/shrinkusingcongruences1.cc: Added a
+	reduction method Shrink_Using_Congruences_Reduction<> and the
+	product Shrink_Using_Congruences_Product<> that assumes this
+	reduction.  Several "FIXME"s dealt with.
diff --git a/ChangeLog_2001-2008 b/ChangeLog_2001-2008
new file mode 100644
index 0000000..5c39a8b
--- /dev/null
+++ b/ChangeLog_2001-2008
@@ -0,0 +1,96130 @@
+2008-12-31 Wednesday 23:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.51), README (1.57), README.configure (1.43),
+	  configure.ac (1.413), instchk.hh (1.19), Watchdog/Makefile.am
+	  (1.37), Watchdog/README (1.21), Watchdog/configure.ac (1.58),
+	  Watchdog/doc/Makefile.am (1.9), Watchdog/doc/README.doc (1.4),
+	  Watchdog/doc/devref.tex (1.6), Watchdog/doc/pwl.sty (1.4),
+	  Watchdog/doc/user.tex (1.6), Watchdog/m4/Makefile.am (1.6),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.7),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.7),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.5),
+	  Watchdog/src/EList.defs.hh (1.9), Watchdog/src/EList.inlines.hh
+	  (1.7), Watchdog/src/EList.types.hh (1.5),
+	  Watchdog/src/EList_Iterator.defs.hh (1.7),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.7),
+	  Watchdog/src/EList_Iterator.types.hh (1.5),
+	  Watchdog/src/Handler.defs.hh (1.8),
+	  Watchdog/src/Handler.inlines.hh (1.7),
+	  Watchdog/src/Handler.types.hh (1.5), Watchdog/src/Makefile.am
+	  (1.19), Watchdog/src/Pending_Element.cc (1.8),
+	  Watchdog/src/Pending_Element.defs.hh (1.8),
+	  Watchdog/src/Pending_Element.inlines.hh (1.7),
+	  Watchdog/src/Pending_Element.types.hh (1.5),
+	  Watchdog/src/Pending_List.cc (1.8),
+	  Watchdog/src/Pending_List.defs.hh (1.8),
+	  Watchdog/src/Pending_List.inlines.hh (1.7),
+	  Watchdog/src/Pending_List.types.hh (1.5), Watchdog/src/Time.cc
+	  (1.8), Watchdog/src/Time.defs.hh (1.8),
+	  Watchdog/src/Time.inlines.hh (1.7), Watchdog/src/Time.types.hh
+	  (1.5), Watchdog/src/Watchdog.cc (1.10),
+	  Watchdog/src/Watchdog.defs.hh (1.10),
+	  Watchdog/src/Watchdog.inlines.hh (1.7),
+	  Watchdog/src/Watchdog.types.hh (1.5), Watchdog/src/pwl_header.hh
+	  (1.8), Watchdog/tests/Makefile.am (1.7),
+	  Watchdog/tests/pwl_test.cc (1.4), Watchdog/tests/pwl_test.hh
+	  (1.4), Watchdog/tests/simple1.cc (1.4),
+	  Watchdog/utils/Makefile.am (1.13), Watchdog/utils/build_header.in
+	  (1.7), debian/libppl-pwl.copyright.in (1.7),
+	  debian/libppl.copyright.in (1.7), demos/Makefile.am (1.15),
+	  demos/ppl_lcdd/Makefile.am (1.31), demos/ppl_lcdd/ppl_lcdd.1
+	  (1.8), demos/ppl_lcdd/ppl_lcdd.cc (1.65),
+	  demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.4),
+	  demos/ppl_lcdd/examples/Makefile.am (1.11),
+	  demos/ppl_lpsol/Makefile.am (1.50), demos/ppl_lpsol/ppl_lpsol.1
+	  (1.9), demos/ppl_lpsol/ppl_lpsol.c (1.92),
+	  demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.5),
+	  demos/ppl_lpsol/examples/Makefile.am (1.12),
+	  devtools/bump_copyright_years (1.2), doc/Makefile.am (1.101),
+	  doc/README.doc (1.19), doc/definitions.dox (1.227),
+	  doc/devref-language-interface.tex (1.2), doc/devref.tex (1.28),
+	  doc/libppl.3 (1.15), doc/libppl_c.3 (1.5), doc/ppl-config.1
+	  (1.15), doc/ppl-config_extra_man_text (1.6), doc/ppl.sty (1.30),
+	  doc/user-language-interface.tex (1.2), doc/user.tex (1.29),
+	  fedora/ppl.hh (1.2), fedora/ppl_c.h (1.2), fedora/pwl.hh (1.2),
+	  interfaces/Makefile.am (1.37), interfaces/interfaced_boxes.hh
+	  (1.6), interfaces/marked_pointers.hh (1.4),
+	  interfaces/ppl_interface_generator_common.m4 (1.36),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.94),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.46), interfaces/ppl_interface_generator_copyright (1.8),
+	  interfaces/C/C_interface.dox (1.16), interfaces/C/Makefile.am
+	  (1.63), interfaces/C/ppl_c_header.h (1.9),
+	  interfaces/C/ppl_c_implementation_common.cc (1.5),
+	  interfaces/C/ppl_c_implementation_common.defs.hh (1.8),
+	  interfaces/C/ppl_c_implementation_common.inlines.hh (1.5),
+	  interfaces/C/ppl_c_version.h.in (1.10),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.56),
+	  interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.15),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.27),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.49),
+	  interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.11),
+	  interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.15), interfaces/C/tests/Makefile.am (1.7),
+	  interfaces/C/tests/cxxoutput.c (1.7),
+	  interfaces/C/tests/ppl_c_test.cc (1.2),
+	  interfaces/C/tests/ppl_c_test.h (1.3),
+	  interfaces/C/tests/print_to_buffer.cc (1.6),
+	  interfaces/C/tests/print_to_buffer.h (1.6),
+	  interfaces/Java/Makefile.am (1.26),
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (1.13), interfaces/Java/jni/Makefile.am (1.35),
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.34),
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+	  (1.9), interfaces/Java/jni/ppl_java_common.cc (1.55),
+	  interfaces/Java/jni/ppl_java_common.defs.hh (1.8),
+	  interfaces/Java/jni/ppl_java_common.inlines.hh (1.6),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.27),
+	  interfaces/Java/parma_polyhedra_library/By_Reference.java (1.4),
+	  interfaces/Java/parma_polyhedra_library/Coefficient.java (1.4),
+	  interfaces/Java/parma_polyhedra_library/Complexity_Class.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Congruence.java
+	  (1.3),
+	  interfaces/Java/parma_polyhedra_library/Congruence_System.java
+	  (1.4), interfaces/Java/parma_polyhedra_library/Constraint.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Constraint_System.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	  (1.3),
+	  interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
+	  (1.3),
+	  interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	  (1.5), interfaces/Java/parma_polyhedra_library/Generator.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Generator_System.java
+	  (1.3),
+	  interfaces/Java/parma_polyhedra_library/Generator_Type.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+	  (1.5),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+	  (1.4), interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+	  (1.6),
+	  interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+	  (1.3), interfaces/Java/parma_polyhedra_library/Makefile.am
+	  (1.12),
+	  interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+	  (1.4), interfaces/Java/parma_polyhedra_library/PPL_Object.java
+	  (1.6), interfaces/Java/parma_polyhedra_library/Pair.java (1.4),
+	  interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+	  (1.5),
+	  interfaces/Java/parma_polyhedra_library/Partial_Function.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+	  (1.4),
+	  interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+	  (1.4), interfaces/Java/parma_polyhedra_library/Variable.java
+	  (1.4), interfaces/Java/parma_polyhedra_library/Variables_Set.java
+	  (1.3),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.8),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.18), interfaces/Java/tests/C_Polyhedron_test1.java (1.18),
+	  interfaces/Java/tests/MIP_Problem_test1.java (1.4),
+	  interfaces/Java/tests/Makefile.am (1.27),
+	  interfaces/Java/tests/NNC_Polyhedron_test1.java (1.5),
+	  interfaces/Java/tests/PPL_Test.java (1.2),
+	  interfaces/Java/tests/Parma_Polyhedra_Library_test1.java (1.3),
+	  interfaces/Java/tests/Test_Executor.java (1.4),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.6),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.22),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.52), interfaces/Java/tests/ppl_java_tests_common (1.19),
+	  interfaces/OCaml/Makefile.am (1.66),
+	  interfaces/OCaml/OCaml_interface.dox (1.8),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.63),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 (1.5),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 (1.5),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 (1.5),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.21),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.53),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.25),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.43),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.7), interfaces/OCaml/ppl_ocaml_common.cc (1.8),
+	  interfaces/OCaml/ppl_ocaml_common.defs.hh (1.3),
+	  interfaces/OCaml/ppl_ocaml_common.inlines.hh (1.2),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.15),
+	  interfaces/OCaml/ppl_ocaml_globals.mli (1.2),
+	  interfaces/OCaml/tests/Makefile.am (1.28),
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
+	  (1.5),
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+	  (1.22), interfaces/OCaml/tests/ppl_ocaml_tests_common (1.7),
+	  interfaces/OCaml/tests/test1.ml (1.17),
+	  interfaces/Prolog/Makefile.am (1.69),
+	  interfaces/Prolog/Prolog_interface.dox (1.182),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.22),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (1.12), interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
+	  (1.13),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+	  (1.15),
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.16),
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+	  (1.11),
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.8),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.15), interfaces/Prolog/ppl_prolog_common.cc (1.14),
+	  interfaces/Prolog/ppl_prolog_common.defs.hh (1.12),
+	  interfaces/Prolog/ppl_prolog_common.inlines.hh (1.3),
+	  interfaces/Prolog/Ciao/Makefile.am (1.89),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.8),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.21),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.17),
+	  interfaces/Prolog/Ciao/ciao_efli.cc (1.7),
+	  interfaces/Prolog/Ciao/ciao_efli.hh (1.4),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.31),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.11),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+	  (1.4), interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh (1.3),
+	  interfaces/Prolog/GNU/Makefile.am (1.88),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.13),
+	  interfaces/Prolog/GNU/gnu_prolog_generated_test.pl (1.2),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.14),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.12),
+	  interfaces/Prolog/GNU/gprolog_efli.cc (1.5),
+	  interfaces/Prolog/GNU/gprolog_efli.hh (1.3),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.10), interfaces/Prolog/GNU/ppl_prolog_sysdep.hh (1.3),
+	  interfaces/Prolog/SICStus/Makefile.am (1.102),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.16), interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh (1.3),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.30),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.10),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.12),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.21),
+	  interfaces/Prolog/SICStus/sicstus_efli.cc (1.5),
+	  interfaces/Prolog/SICStus/sicstus_efli.hh (1.3),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.21),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.15),
+	  interfaces/Prolog/SICStus/sp_prolog_generated_test.pl (1.2),
+	  interfaces/Prolog/SWI/Makefile.am (1.106),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.15),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.13),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.21), interfaces/Prolog/SWI/ppl_pl.cc (1.15),
+	  interfaces/Prolog/SWI/ppl_prolog_sysdep.hh (1.4),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.10),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.11),
+	  interfaces/Prolog/SWI/swi_efli.cc (1.6),
+	  interfaces/Prolog/SWI/swi_efli.hh (1.6),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.13),
+	  interfaces/Prolog/SWI/swi_prolog_generated_test.pl (1.5),
+	  interfaces/Prolog/XSB/Makefile.am (1.82),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.12),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.18),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 (1.3),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+	  (1.5), interfaces/Prolog/XSB/ppl_prolog_sysdep.hh (1.4),
+	  interfaces/Prolog/XSB/xsb_cfli.hh (1.7),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.20),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.18),
+	  interfaces/Prolog/XSB/xsb_efli.cc (1.6),
+	  interfaces/Prolog/XSB/xsb_efli.hh (1.3),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.36),
+	  interfaces/Prolog/YAP/Makefile.am (1.72),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.13),
+	  interfaces/Prolog/YAP/ppl_prolog_sysdep.hh (1.3),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.14),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.7),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.15),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.11),
+	  interfaces/Prolog/YAP/yap_efli.cc (1.3),
+	  interfaces/Prolog/YAP/yap_efli.hh (1.3),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.15),
+	  interfaces/Prolog/YAP/yap_prolog_generated_test.pl (1.2),
+	  interfaces/Prolog/tests/Makefile.am (1.35),
+	  interfaces/Prolog/tests/clpq.pl (1.12),
+	  interfaces/Prolog/tests/clpq2.pl (1.14),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.7),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.8),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.8),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.7),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.7),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.5),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.5),
+	  interfaces/Prolog/tests/pl_check.pl (1.70),
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+	  (1.5),
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.12),
+	  interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
+	  (1.3), m4/Makefile.am (1.31), m4/ac_check_ciao.m4 (1.5),
+	  m4/ac_check_fpu_control.m4 (1.16), m4/ac_check_gmp.m4 (1.33),
+	  m4/ac_check_sicstus_prolog.m4 (1.9), m4/ac_check_swi_prolog.m4
+	  (1.19), m4/ac_check_xsb_prolog.m4 (1.6),
+	  m4/ac_cxx_attribute_weak.m4 (1.11),
+	  m4/ac_cxx_double_binary_format.m4 (1.18),
+	  m4/ac_cxx_double_exact_output.m4 (1.11),
+	  m4/ac_cxx_flexible_arrays.m4 (1.17),
+	  m4/ac_cxx_float_binary_format.m4 (1.15),
+	  m4/ac_cxx_float_exact_output.m4 (1.9),
+	  m4/ac_cxx_ieee_inexact_flag.m4 (1.6), m4/ac_cxx_limit_memory.m4
+	  (1.3), m4/ac_cxx_long_double_binary_format.m4 (1.22),
+	  m4/ac_cxx_long_double_exact_output.m4 (1.16),
+	  m4/ac_cxx_proper_long_double.m4 (1.6), m4/ac_cxx_remainder_bug.m4
+	  (1.7), m4/ac_prog_jar.m4 (1.4), m4/ac_prog_java.m4 (1.7),
+	  m4/ac_prog_javac.m4 (1.8), m4/ac_prog_javah.m4 (1.10),
+	  m4/ac_text_md5sum.m4 (1.5), m4/ppl.m4 (1.12), m4/ppl_c.m4 (1.5),
+	  src/Any_Pointset.defs.hh (1.21), src/Any_Pointset.inlines.hh
+	  (1.5), src/Any_Pointset.types.hh (1.4), src/Ask_Tell.defs.hh
+	  (1.20), src/Ask_Tell.inlines.hh (1.19), src/Ask_Tell.templates.hh
+	  (1.11), src/Ask_Tell.types.hh (1.8), src/BDS_Status.idefs.hh
+	  (1.25), src/BDS_Status.inlines.hh (1.21), src/BD_Shape.cc (1.10),
+	  src/BD_Shape.defs.hh (1.138), src/BD_Shape.inlines.hh (1.173),
+	  src/BD_Shape.templates.hh (1.129), src/BD_Shape.types.hh (1.8),
+	  src/BHRZ03_Certificate.cc (1.15), src/BHRZ03_Certificate.defs.hh
+	  (1.20), src/BHRZ03_Certificate.inlines.hh (1.11),
+	  src/BHRZ03_Certificate.types.hh (1.7), src/Bit_Matrix.cc (1.7),
+	  src/Bit_Matrix.defs.hh (1.6), src/Bit_Matrix.inlines.hh (1.5),
+	  src/Bit_Matrix.types.hh (1.4), src/Bit_Row.cc (1.8),
+	  src/Bit_Row.defs.hh (1.12), src/Bit_Row.inlines.hh (1.11),
+	  src/Bit_Row.types.hh (1.4), src/Boundary.defs.hh (1.17),
+	  src/Box.cc (1.11), src/Box.defs.hh (1.68), src/Box.inlines.hh
+	  (1.44), src/Box.templates.hh (1.140), src/Box.types.hh (1.5),
+	  src/Box_Status.idefs.hh (1.4), src/Box_Status.inlines.hh (1.5),
+	  src/C_Integer.hh (1.8), src/C_Polyhedron.cc (1.29),
+	  src/C_Polyhedron.defs.hh (1.60), src/C_Polyhedron.inlines.hh
+	  (1.44), src/C_Polyhedron.types.hh (1.13), src/Checked_Number.cc
+	  (1.15), src/Checked_Number.defs.hh (1.103),
+	  src/Checked_Number.inlines.hh (1.87),
+	  src/Checked_Number.templates.hh (1.3),
+	  src/Checked_Number.types.hh (1.12), src/Coefficient.cc (1.10),
+	  src/Coefficient.defs.hh (1.12), src/Coefficient.inlines.hh
+	  (1.11), src/Coefficient.types.hh (1.17),
+	  src/Coefficient_traits_template.hh (1.10), src/Congruence.cc
+	  (1.23), src/Congruence.defs.hh (1.27), src/Congruence.inlines.hh
+	  (1.21), src/Congruence.types.hh (1.5), src/Congruence_System.cc
+	  (1.32), src/Congruence_System.defs.hh (1.28),
+	  src/Congruence_System.inlines.hh (1.13),
+	  src/Congruence_System.types.hh (1.5), src/Constraint.cc (1.72),
+	  src/Constraint.defs.hh (1.132), src/Constraint.inlines.hh (1.73),
+	  src/Constraint.types.hh (1.13), src/Constraint_System.cc (1.31),
+	  src/Constraint_System.defs.hh (1.42),
+	  src/Constraint_System.inlines.hh (1.14),
+	  src/Constraint_System.types.hh (1.7), src/DB_Matrix.defs.hh
+	  (1.31), src/DB_Matrix.inlines.hh (1.35),
+	  src/DB_Matrix.templates.hh (1.11), src/DB_Matrix.types.hh (1.8),
+	  src/DB_Row.defs.hh (1.27), src/DB_Row.inlines.hh (1.26),
+	  src/DB_Row.templates.hh (1.9), src/DB_Row.types.hh (1.10),
+	  src/Determinate.defs.hh (1.69), src/Determinate.inlines.hh
+	  (1.60), src/Determinate.types.hh (1.12), src/Float.cc (1.9),
+	  src/Float.defs.hh (1.34), src/Float.inlines.hh (1.36),
+	  src/GMP_Integer.defs.hh (1.30), src/GMP_Integer.inlines.hh
+	  (1.25), src/GMP_Integer.types.hh (1.18), src/Generator.cc (1.79),
+	  src/Generator.defs.hh (1.128), src/Generator.inlines.hh (1.66),
+	  src/Generator.types.hh (1.13), src/Generator_System.cc (1.29),
+	  src/Generator_System.defs.hh (1.30),
+	  src/Generator_System.inlines.hh (1.13),
+	  src/Generator_System.types.hh (1.7), src/Grid.defs.hh (1.87),
+	  src/Grid.inlines.hh (1.31), src/Grid.templates.hh (1.41),
+	  src/Grid.types.hh (1.5), src/Grid_Certificate.cc (1.12),
+	  src/Grid_Certificate.defs.hh (1.8),
+	  src/Grid_Certificate.inlines.hh (1.6),
+	  src/Grid_Certificate.types.hh (1.5), src/Grid_Generator.cc
+	  (1.25), src/Grid_Generator.defs.hh (1.37),
+	  src/Grid_Generator.inlines.hh (1.17), src/Grid_Generator.types.hh
+	  (1.5), src/Grid_Generator_System.cc (1.23),
+	  src/Grid_Generator_System.defs.hh (1.31),
+	  src/Grid_Generator_System.inlines.hh (1.19),
+	  src/Grid_Generator_System.types.hh (1.5), src/Grid_Status.cc
+	  (1.11), src/Grid_Status.idefs.hh (1.10),
+	  src/Grid_Status.inlines.hh (1.6), src/Grid_chdims.cc (1.27),
+	  src/Grid_conversion.cc (1.26), src/Grid_nonpublic.cc (1.41),
+	  src/Grid_public.cc (1.91), src/Grid_simplify.cc (1.42),
+	  src/Grid_widenings.cc (1.20), src/H79_Certificate.cc (1.14),
+	  src/H79_Certificate.defs.hh (1.18),
+	  src/H79_Certificate.inlines.hh (1.12),
+	  src/H79_Certificate.types.hh (1.7), src/Has_Assign_Or_Swap.hh
+	  (1.4), src/Init.cc (1.39), src/Init.defs.hh (1.23),
+	  src/Init.inlines.hh (1.10), src/Init.types.hh (1.12),
+	  src/Interval.defs.hh (1.65), src/Interval.inlines.hh (1.49),
+	  src/Interval.templates.hh (1.5), src/Interval.types.hh (1.15),
+	  src/Interval_Info.defs.hh (1.12), src/Interval_Info.inlines.hh
+	  (1.10), src/Interval_Info.types.hh (1.5),
+	  src/Interval_Restriction.defs.hh (1.17), src/Linear_Expression.cc
+	  (1.22), src/Linear_Expression.defs.hh (1.41),
+	  src/Linear_Expression.inlines.hh (1.16),
+	  src/Linear_Expression.types.hh (1.7), src/Linear_Row.cc (1.27),
+	  src/Linear_Row.defs.hh (1.27), src/Linear_Row.inlines.hh (1.15),
+	  src/Linear_Row.types.hh (1.7), src/Linear_System.cc (1.52),
+	  src/Linear_System.defs.hh (1.34), src/Linear_System.inlines.hh
+	  (1.26), src/Linear_System.types.hh (1.7), src/MIP_Problem.cc
+	  (1.80), src/MIP_Problem.defs.hh (1.41),
+	  src/MIP_Problem.inlines.hh (1.20), src/MIP_Problem.templates.hh
+	  (1.15), src/MIP_Problem.types.hh (1.4), src/Makefile.am (1.192),
+	  src/Matrix.cc (1.100), src/Matrix.defs.hh (1.86),
+	  src/Matrix.inlines.hh (1.55), src/Matrix.types.hh (1.13),
+	  src/NNC_Polyhedron.cc (1.30), src/NNC_Polyhedron.defs.hh (1.62),
+	  src/NNC_Polyhedron.inlines.hh (1.45), src/NNC_Polyhedron.types.hh
+	  (1.13), src/Numeric_Format.defs.hh (1.9), src/OR_Matrix.defs.hh
+	  (1.20), src/OR_Matrix.inlines.hh (1.15),
+	  src/OR_Matrix.templates.hh (1.10), src/OR_Matrix.types.hh (1.5),
+	  src/Octagonal_Shape.cc (1.9), src/Octagonal_Shape.defs.hh (1.64),
+	  src/Octagonal_Shape.inlines.hh (1.43),
+	  src/Octagonal_Shape.templates.hh (1.100),
+	  src/Octagonal_Shape.types.hh (1.5), src/Og_Status.idefs.hh
+	  (1.12), src/Og_Status.inlines.hh (1.8),
+	  src/Partially_Reduced_Product.defs.hh (1.40),
+	  src/Partially_Reduced_Product.inlines.hh (1.38),
+	  src/Partially_Reduced_Product.templates.hh (1.17),
+	  src/Partially_Reduced_Product.types.hh (1.6), src/Ph_Status.cc
+	  (1.17), src/Ph_Status.idefs.hh (1.24), src/Ph_Status.inlines.hh
+	  (1.11), src/Pointset_Ask_Tell.cc (1.9),
+	  src/Pointset_Ask_Tell.defs.hh (1.19),
+	  src/Pointset_Ask_Tell.inlines.hh (1.8),
+	  src/Pointset_Ask_Tell.templates.hh (1.16),
+	  src/Pointset_Ask_Tell.types.hh (1.5), src/Pointset_Powerset.cc
+	  (1.26), src/Pointset_Powerset.defs.hh (1.57),
+	  src/Pointset_Powerset.inlines.hh (1.18),
+	  src/Pointset_Powerset.templates.hh (1.46),
+	  src/Pointset_Powerset.types.hh (1.4), src/Poly_Con_Relation.cc
+	  (1.18), src/Poly_Con_Relation.defs.hh (1.38),
+	  src/Poly_Con_Relation.inlines.hh (1.18),
+	  src/Poly_Con_Relation.types.hh (1.12), src/Poly_Gen_Relation.cc
+	  (1.18), src/Poly_Gen_Relation.defs.hh (1.36),
+	  src/Poly_Gen_Relation.inlines.hh (1.18),
+	  src/Poly_Gen_Relation.types.hh (1.12), src/Polyhedron.defs.hh
+	  (1.361), src/Polyhedron.inlines.hh (1.152),
+	  src/Polyhedron.templates.hh (1.23), src/Polyhedron.types.hh
+	  (1.19), src/Polyhedron_chdims.cc (1.51),
+	  src/Polyhedron_nonpublic.cc (1.94), src/Polyhedron_public.cc
+	  (1.150), src/Polyhedron_widenings.cc (1.70), src/Powerset.defs.hh
+	  (1.33), src/Powerset.inlines.hh (1.23), src/Powerset.templates.hh
+	  (1.7), src/Powerset.types.hh (1.8), src/Ptr_Iterator.defs.hh
+	  (1.15), src/Ptr_Iterator.inlines.hh (1.10),
+	  src/Ptr_Iterator.types.hh (1.8), src/Rational_Box.hh (1.9),
+	  src/Rational_Interval.hh (1.2), src/Result.defs.hh (1.21),
+	  src/Result.inlines.hh (1.13), src/Rounding_Dir.defs.hh (1.15),
+	  src/Rounding_Dir.inlines.hh (1.11), src/Row.cc (1.107),
+	  src/Row.defs.hh (1.114), src/Row.inlines.hh (1.70),
+	  src/Row.types.hh (1.14), src/Scalar_Products.cc (1.12),
+	  src/Scalar_Products.defs.hh (1.12),
+	  src/Scalar_Products.inlines.hh (1.9),
+	  src/Scalar_Products.types.hh (1.6), src/Slow_Copy.hh (1.4),
+	  src/Temp.defs.hh (1.9), src/Temp.inlines.hh (1.7),
+	  src/Temp.templates.hh (1.4), src/Topology.hh (1.16),
+	  src/Variable.cc (1.26), src/Variable.defs.hh (1.56),
+	  src/Variable.inlines.hh (1.27), src/Variable.types.hh (1.13),
+	  src/Variables_Set.cc (1.8), src/Variables_Set.defs.hh (1.10),
+	  src/Variables_Set.inlines.hh (1.7), src/Variables_Set.types.hh
+	  (1.4), src/Widening_Function.defs.hh (1.20),
+	  src/Widening_Function.inlines.hh (1.17),
+	  src/Widening_Function.types.hh (1.8), src/algorithms.hh (1.51),
+	  src/assign_or_swap.hh (1.3), src/checked.cc (1.26),
+	  src/checked.defs.hh (1.52), src/checked.inlines.hh (1.53),
+	  src/checked_ext.defs.hh (1.16), src/checked_ext.inlines.hh
+	  (1.43), src/checked_float.inlines.hh (1.100),
+	  src/checked_int.inlines.hh (1.74), src/checked_mpq.inlines.hh
+	  (1.49), src/checked_mpz.inlines.hh (1.61),
+	  src/checked_numeric_limits.hh (1.24), src/compiler.hh (1.17),
+	  src/conversion.cc (1.89), src/distances.defs.hh (1.6),
+	  src/distances.inlines.hh (1.7), src/distances.types.hh (1.5),
+	  src/fpu-c99.inlines.hh (1.23), src/fpu-ia32.cc (1.4),
+	  src/fpu-ia32.inlines.hh (1.23), src/fpu-none.inlines.hh (1.11),
+	  src/fpu-sparc.inlines.hh (1.13), src/fpu.defs.hh (1.22),
+	  src/fpu.types.hh (1.7), src/globals.cc (1.34),
+	  src/globals.defs.hh (1.63), src/globals.inlines.hh (1.26),
+	  src/globals.types.hh (1.13), src/initializer.hh (1.17),
+	  src/iterator_to_const.defs.hh (1.9),
+	  src/iterator_to_const.inlines.hh (1.6),
+	  src/iterator_to_const.types.hh (1.4), src/math_utilities.defs.hh
+	  (1.2), src/math_utilities.inlines.hh (1.5),
+	  src/max_space_dimension.hh (1.15), src/meta_programming.hh
+	  (1.13), src/minimize.cc (1.51), src/mp_std_bits.cc (1.7),
+	  src/mp_std_bits.defs.hh (1.7), src/mp_std_bits.inlines.hh (1.6),
+	  src/namespaces.hh (1.18), src/ppl-config.cc.in (1.26),
+	  src/ppl_header.hh (1.14), src/simplify.cc (1.56), src/stdiobuf.cc
+	  (1.3), src/stdiobuf.defs.hh (1.4), src/stdiobuf.inlines.hh (1.3),
+	  src/stdiobuf.types.hh (1.2), src/swapping_sort.icc (1.15),
+	  src/version.cc (1.16), src/version.hh.in (1.18),
+	  tests/Makefile.am (1.275), tests/Partial_Function.cc (1.9),
+	  tests/Partial_Function.defs.hh (1.7),
+	  tests/Partial_Function.inlines.hh (1.6),
+	  tests/Partial_Function.types.hh (1.5), tests/README (1.5),
+	  tests/Random_Number_Generator.defs.hh (1.7),
+	  tests/Random_Number_Generator.inlines.hh (1.13),
+	  tests/Random_Number_Generator.types.hh (1.5), tests/files.cc
+	  (1.13), tests/files.hh (1.13), tests/ppl_test.cc (1.20),
+	  tests/ppl_test.hh (1.80), tests/Ask_Tell/Makefile.am (1.8),
+	  tests/Ask_Tell/append1.cc (1.9), tests/BD_Shape/Makefile.am
+	  (1.86), tests/BD_Shape/addconstraints1.cc (1.23),
+	  tests/BD_Shape/addspacedims1.cc (1.20),
+	  tests/BD_Shape/affinedimension1.cc (1.15),
+	  tests/BD_Shape/affineimage1.cc (1.24),
+	  tests/BD_Shape/affineimage2.cc (1.17),
+	  tests/BD_Shape/affinepreimage1.cc (1.26),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.19),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.12),
+	  tests/BD_Shape/bhmz05widening1.cc (1.20),
+	  tests/BD_Shape/bhz03widening1.cc (1.12),
+	  tests/BD_Shape/bounded1.cc (1.6),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.8),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.8),
+	  tests/BD_Shape/bounds1.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.25),
+	  tests/BD_Shape/cc76narrowing1.cc (1.22),
+	  tests/BD_Shape/closure1.cc (1.31), tests/BD_Shape/concatenate1.cc
+	  (1.18), tests/BD_Shape/congruences1.cc (1.6),
+	  tests/BD_Shape/constrains1.cc (1.2),
+	  tests/BD_Shape/constraints1.cc (1.26),
+	  tests/BD_Shape/contains1.cc (1.18),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.8),
+	  tests/BD_Shape/difference1.cc (1.2), tests/BD_Shape/discrete1.cc
+	  (1.6), tests/BD_Shape/disjoint1.cc (1.9),
+	  tests/BD_Shape/empty1.cc (1.14), tests/BD_Shape/equality1.cc
+	  (1.19), tests/BD_Shape/expandspacedim1.cc (1.8),
+	  tests/BD_Shape/foldspacedims1.cc (1.10),
+	  tests/BD_Shape/frombdshape1.cc (1.5), tests/BD_Shape/frombox1.cc
+	  (1.4), tests/BD_Shape/fromgensys1.cc (1.19),
+	  tests/BD_Shape/fromgrid1.cc (1.6),
+	  tests/BD_Shape/fromoctagonalshape1.cc (1.5),
+	  tests/BD_Shape/frompolyhedron1.cc (1.8),
+	  tests/BD_Shape/fromspacedim1.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.23),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.26),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.20),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.21),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.11),
+	  tests/BD_Shape/geomcovers1.cc (1.13),
+	  tests/BD_Shape/h79widening1.cc (1.17),
+	  tests/BD_Shape/intersection1.cc (1.22),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.20),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.21),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.18),
+	  tests/BD_Shape/mapspacedims1.cc (1.20),
+	  tests/BD_Shape/max_min1.cc (1.6), tests/BD_Shape/max_min2.cc
+	  (1.13), tests/BD_Shape/maxspacedim1.cc (1.7),
+	  tests/BD_Shape/membytes1.cc (1.9),
+	  tests/BD_Shape/minconstraints1.cc (1.16),
+	  tests/BD_Shape/relations1.cc (1.21), tests/BD_Shape/relations2.cc
+	  (1.26), tests/BD_Shape/relations3.cc (1.32),
+	  tests/BD_Shape/relations4.cc (1.14),
+	  tests/BD_Shape/removespacedims1.cc (1.25),
+	  tests/BD_Shape/run_tests (1.21),
+	  tests/BD_Shape/simplifyusingcontext1.cc (1.2),
+	  tests/BD_Shape/timeelapse1.cc (1.27),
+	  tests/BD_Shape/unconstrain1.cc (1.2), tests/BD_Shape/universe1.cc
+	  (1.18), tests/BD_Shape/upperbound1.cc (1.3),
+	  tests/BD_Shape/upperboundifexact1.cc (1.2),
+	  tests/BD_Shape/writebdshape1.cc (1.14), tests/Box/Makefile.am
+	  (1.80), tests/Box/addconstraints1.cc (1.15),
+	  tests/Box/addspacedims1.cc (1.10), tests/Box/affinedimension1.cc
+	  (1.8), tests/Box/affineimage1.cc (1.12),
+	  tests/Box/affinepreimage1.cc (1.9), tests/Box/ascii_dump_load1.cc
+	  (1.12), tests/Box/bgp99extrapolation1.cc (1.7),
+	  tests/Box/bhz03widening1.cc (1.6), tests/Box/bounded1.cc (1.6),
+	  tests/Box/boundedaffineimage1.cc (1.17),
+	  tests/Box/boundedaffinepreimage1.cc (1.10),
+	  tests/Box/cc76narrowing1.cc (1.9), tests/Box/cc76widening.cc
+	  (1.9), tests/Box/concatenate1.cc (1.10),
+	  tests/Box/congruences1.cc (1.6), tests/Box/constrains1.cc (1.2),
+	  tests/Box/constraints1.cc (1.13), tests/Box/contains1.cc (1.8),
+	  tests/Box/containsintegerpoint1.cc (1.8),
+	  tests/Box/difference1.cc (1.9), tests/Box/discrete1.cc (1.8),
+	  tests/Box/disjoint1.cc (1.8), tests/Box/empty1.cc (1.8),
+	  tests/Box/equality1.cc (1.7), tests/Box/expandspacedim1.cc
+	  (1.11), tests/Box/foldspacedims1.cc (1.11),
+	  tests/Box/frombdshape1.cc (1.5), tests/Box/frombox1.cc (1.8),
+	  tests/Box/fromgensys1.cc (1.7), tests/Box/fromgrid1.cc (1.9),
+	  tests/Box/frompartiallyreducedproduct1.cc (1.4),
+	  tests/Box/frompolyhedron1.cc (1.14), tests/Box/frompolyhedron2.cc
+	  (1.11), tests/Box/fromspacedim1.cc (1.4),
+	  tests/Box/generalizedaffineimage1.cc (1.18),
+	  tests/Box/generalizedaffineimage2.cc (1.7),
+	  tests/Box/generalizedaffinepreimage1.cc (1.17),
+	  tests/Box/geomcovers1.cc (1.7), tests/Box/intersection1.cc
+	  (1.12), tests/Box/interval1.cc (1.11), tests/Box/mapspacedims1.cc
+	  (1.9), tests/Box/max_min1.cc (1.10), tests/Box/maxspacedim1.cc
+	  (1.7), tests/Box/membytes1.cc (1.9), tests/Box/minconstraints1.cc
+	  (1.8), tests/Box/propagateconstraints1.cc (1.2),
+	  tests/Box/propagateconstraints2.cc (1.13),
+	  tests/Box/refinewithcongruences1.cc (1.4),
+	  tests/Box/refinewithconstraint1.cc (1.5),
+	  tests/Box/refinewithconstraint2.cc (1.2),
+	  tests/Box/refinewithconstraints1.cc (1.7),
+	  tests/Box/refinewithconstraints2.cc (1.4),
+	  tests/Box/relations1.cc (1.8), tests/Box/relations2.cc (1.7),
+	  tests/Box/relations3.cc (1.6), tests/Box/relations4.cc (1.4),
+	  tests/Box/removespacedims1.cc (1.12), tests/Box/run_tests (1.5),
+	  tests/Box/timeelapse1.cc (1.11), tests/Box/topclosed1.cc (1.5),
+	  tests/Box/unconstrain1.cc (1.3), tests/Box/universe1.cc (1.7),
+	  tests/Box/upperbound1.cc (1.2), tests/Box/upperboundifexact1.cc
+	  (1.4), tests/Box/writebox1.cc (1.7), tests/Grid/Makefile.am
+	  (1.75), tests/Grid/addcongruence1.cc (1.16),
+	  tests/Grid/addcongruences1.cc (1.19),
+	  tests/Grid/addconstraint1.cc (1.19),
+	  tests/Grid/addconstraints1.cc (1.21), tests/Grid/addgenerator1.cc
+	  (1.18), tests/Grid/addgenerators1.cc (1.19),
+	  tests/Grid/addspacedims1.cc (1.18), tests/Grid/affinedim1.cc
+	  (1.15), tests/Grid/affineimage1.cc (1.16),
+	  tests/Grid/affineimage2.cc (1.16), tests/Grid/affinepreimage1.cc
+	  (1.17), tests/Grid/affinepreimage2.cc (1.11),
+	  tests/Grid/approximatepartition1.cc (1.6),
+	  tests/Grid/asciidumpload1.cc (1.17), tests/Grid/asciidumpload2.cc
+	  (1.9), tests/Grid/asciidumpload3.cc (1.7),
+	  tests/Grid/asciidumpload4.cc (1.7), tests/Grid/asciidumpload5.cc
+	  (1.5), tests/Grid/asciidumpload6.cc (1.5),
+	  tests/Grid/bhz03widening1.cc (1.15), tests/Grid/bounded1.cc
+	  (1.17), tests/Grid/boundedaffineimage1.cc (1.6),
+	  tests/Grid/boundedaffinepreimage1.cc (1.6),
+	  tests/Grid/boundingbox1.cc (1.21), tests/Grid/bounds1.cc (1.19),
+	  tests/Grid/certificate1.cc (1.17), tests/Grid/concatenate1.cc
+	  (1.16), tests/Grid/congruence1.cc (1.21),
+	  tests/Grid/congruences1.cc (1.15), tests/Grid/congruences2.cc
+	  (1.8), tests/Grid/constraints1.cc (1.3), tests/Grid/contains1.cc
+	  (1.14), tests/Grid/containsintegerpoint1.cc (1.7),
+	  tests/Grid/coveringbox1.cc (1.19), tests/Grid/coveringbox2.cc
+	  (1.16), tests/Grid/discrete1.cc (1.11), tests/Grid/disjoint1.cc
+	  (1.15), tests/Grid/equals1.cc (1.16),
+	  tests/Grid/expandspacedim1.cc (1.15),
+	  tests/Grid/foldspacedims1.cc (1.15), tests/Grid/frombdshape1.cc
+	  (1.5), tests/Grid/frombox1.cc (1.2), tests/Grid/fromgrid1.cc
+	  (1.2), tests/Grid/fromoctagonalshape1.cc (1.5),
+	  tests/Grid/frompolyhedron1.cc (1.3),
+	  tests/Grid/generalizedaffineimage1.cc (1.17),
+	  tests/Grid/generalizedaffineimage2.cc (1.16),
+	  tests/Grid/generalizedaffineimage3.cc (1.8),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.19),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.19),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.8),
+	  tests/Grid/generator1.cc (1.23), tests/Grid/generators1.cc
+	  (1.16), tests/Grid/generators2.cc (1.5), tests/Grid/grid1.cc
+	  (1.23), tests/Grid/grid2.cc (1.18), tests/Grid/grid3.cc (1.30),
+	  tests/Grid/griddifference1.cc (1.16), tests/Grid/intersection1.cc
+	  (1.14), tests/Grid/isempty1.cc (1.10), tests/Grid/isuniverse1.cc
+	  (1.12), tests/Grid/limitedextrapolation1.cc (1.16),
+	  tests/Grid/limitedextrapolation2.cc (1.10),
+	  tests/Grid/limitedextrapolation3.cc (1.9),
+	  tests/Grid/mapspacedims1.cc (1.13), tests/Grid/maxmin1.cc (1.17),
+	  tests/Grid/membytes1.cc (1.14), tests/Grid/mincongruences1.cc
+	  (1.14), tests/Grid/mingenerators1.cc (1.13),
+	  tests/Grid/outputoperator1.cc (1.12),
+	  tests/Grid/outputoperator2.cc (1.5),
+	  tests/Grid/outputoperator3.cc (1.5), tests/Grid/partition1.cc
+	  (1.10), tests/Grid/powersetdifference1.cc (1.8),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.6),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.5),
+	  tests/Grid/refinewithcongruences1.cc (1.3),
+	  tests/Grid/refinewithconstraints1.cc (1.3),
+	  tests/Grid/relations1.cc (1.18), tests/Grid/relations2.cc (1.20),
+	  tests/Grid/relations3.cc (1.11), tests/Grid/removespacedims1.cc
+	  (1.17), tests/Grid/removespacedims2.cc (1.18),
+	  tests/Grid/timeelapse1.cc (1.14), tests/Grid/topclosed1.cc
+	  (1.15), tests/Grid/topclosure1.cc (1.10),
+	  tests/Grid/unconstrain1.cc (1.2), tests/Grid/upperbound1.cc
+	  (1.2), tests/Grid/upperbound2.cc (1.2), tests/Grid/widening1.cc
+	  (1.19), tests/Grid/widening2.cc (1.13), tests/Grid/widening3.cc
+	  (1.9), tests/Grid/writecongruencesystem.cc (1.10),
+	  tests/MIP_Problem/Makefile.am (1.14),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.6),
+	  tests/MIP_Problem/exceptions1.cc (1.6),
+	  tests/MIP_Problem/mipproblem1.cc (1.14),
+	  tests/MIP_Problem/mipproblem2.cc (1.13),
+	  tests/MIP_Problem/mipproblem3.cc (1.8),
+	  tests/Octagonal_Shape/Makefile.am (1.38),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.6),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.7),
+	  tests/Octagonal_Shape/affineimage1.cc (1.6),
+	  tests/Octagonal_Shape/affineimage2.cc (1.5),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.9),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.6),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.5),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.6),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.5),
+	  tests/Octagonal_Shape/bounded1.cc (1.5),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.13),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.7),
+	  tests/Octagonal_Shape/bounds1.cc (1.6),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.8),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.6),
+	  tests/Octagonal_Shape/chinainit.cc (1.5),
+	  tests/Octagonal_Shape/concatenate1.cc (1.5),
+	  tests/Octagonal_Shape/congruences1.cc (1.7),
+	  tests/Octagonal_Shape/constrains1.cc (1.2),
+	  tests/Octagonal_Shape/constraints1.cc (1.8),
+	  tests/Octagonal_Shape/contains1.cc (1.6),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.9),
+	  tests/Octagonal_Shape/difference1.cc (1.2),
+	  tests/Octagonal_Shape/discrete1.cc (1.6),
+	  tests/Octagonal_Shape/disjoint1.cc (1.9),
+	  tests/Octagonal_Shape/empty1.cc (1.5),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.8),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.7),
+	  tests/Octagonal_Shape/frombdshape1.cc (1.3),
+	  tests/Octagonal_Shape/frombox1.cc (1.2),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.5),
+	  tests/Octagonal_Shape/fromgrid1.cc (1.4),
+	  tests/Octagonal_Shape/fromoctagonalshape1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.7),
+	  tests/Octagonal_Shape/fromspacedim1.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.12),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.8),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.12),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.8),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.7),
+	  tests/Octagonal_Shape/intersection1.cc (1.7),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.9),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.9),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.7),
+	  tests/Octagonal_Shape/max_min1.cc (1.7),
+	  tests/Octagonal_Shape/max_min2.cc (1.8),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.7),
+	  tests/Octagonal_Shape/membytes1.cc (1.9),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.7),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.6),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.11),
+	  tests/Octagonal_Shape/relatwithcons3.cc (1.4),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.11),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.6),
+	  tests/Octagonal_Shape/run_tests (1.5),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.7),
+	  tests/Octagonal_Shape/unconstrain1.cc (1.2),
+	  tests/Octagonal_Shape/universe1.cc (1.5),
+	  tests/Octagonal_Shape/upperbound1.cc (1.2),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.7),
+	  tests/Partially_Reduced_Product/Makefile.am (1.9),
+	  tests/Partially_Reduced_Product/asciidumpload1.cc (1.4),
+	  tests/Partially_Reduced_Product/directproduct1.cc (1.5),
+	  tests/Partially_Reduced_Product/directproduct2.cc (1.4),
+	  tests/Partially_Reduced_Product/directproduct3.cc (1.5),
+	  tests/Partially_Reduced_Product/directproduct4.cc (1.3),
+	  tests/Partially_Reduced_Product/directproduct5.cc (1.3),
+	  tests/Partially_Reduced_Product/directproduct6.cc (1.5),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.6),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (1.5),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+	  (1.3),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+	  (1.3), tests/Polyhedron/Makefile.am (1.135),
+	  tests/Polyhedron/addcongruence1.cc (1.12),
+	  tests/Polyhedron/addcongruences1.cc (1.15),
+	  tests/Polyhedron/addconstraint1.cc (1.13),
+	  tests/Polyhedron/addconstraints1.cc (1.14),
+	  tests/Polyhedron/addconstraints2.cc (1.13),
+	  tests/Polyhedron/addgenerator1.cc (1.14),
+	  tests/Polyhedron/addgenerator2.cc (1.14),
+	  tests/Polyhedron/addgenerators1.cc (1.15),
+	  tests/Polyhedron/addgenerators2.cc (1.14),
+	  tests/Polyhedron/addspacedims1.cc (1.14),
+	  tests/Polyhedron/addspacedims2.cc (1.14),
+	  tests/Polyhedron/affineimage1.cc (1.14),
+	  tests/Polyhedron/affineimage2.cc (1.15),
+	  tests/Polyhedron/affinepreimage1.cc (1.13),
+	  tests/Polyhedron/affinetrans.cc (1.13),
+	  tests/Polyhedron/append1.cc (1.16), tests/Polyhedron/append2.cc
+	  (1.15), tests/Polyhedron/ascii_dump_load1.cc (1.12),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.12),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.13),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.16),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.10),
+	  tests/Polyhedron/bhrz03widening1.cc (1.14),
+	  tests/Polyhedron/bhrz03widening2.cc (1.13),
+	  tests/Polyhedron/bhrz03widening3.cc (1.18),
+	  tests/Polyhedron/bhz03widening1.cc (1.16),
+	  tests/Polyhedron/bounded1.cc (1.13),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.17),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.11),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.14),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.14),
+	  tests/Polyhedron/bounds1.cc (1.13),
+	  tests/Polyhedron/cnncconversion1.cc (1.7),
+	  tests/Polyhedron/concatenate1.cc (1.13),
+	  tests/Polyhedron/congruences1.cc (1.16),
+	  tests/Polyhedron/constrains1.cc (1.3),
+	  tests/Polyhedron/constraints1.cc (1.13),
+	  tests/Polyhedron/contains1.cc (1.12),
+	  tests/Polyhedron/contains2.cc (1.12),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.6),
+	  tests/Polyhedron/disjoint1.cc (1.12),
+	  tests/Polyhedron/disjoint2.cc (1.14),
+	  tests/Polyhedron/dualhypercubes.cc (1.18),
+	  tests/Polyhedron/empty1.cc (1.13), tests/Polyhedron/equals1.cc
+	  (1.12), tests/Polyhedron/exceptions1.cc (1.19),
+	  tests/Polyhedron/exceptions2.cc (1.16),
+	  tests/Polyhedron/exceptions3.cc (1.13),
+	  tests/Polyhedron/expandspacedim1.cc (1.15),
+	  tests/Polyhedron/expandspacedim2.cc (1.15),
+	  tests/Polyhedron/foldspacedims1.cc (1.17),
+	  tests/Polyhedron/foldspacedims2.cc (1.18),
+	  tests/Polyhedron/frombdshape1.cc (1.3),
+	  tests/Polyhedron/frombox1.cc (1.6), tests/Polyhedron/frombox2.cc
+	  (1.6), tests/Polyhedron/fromgrid1.cc (1.3),
+	  tests/Polyhedron/fromoctagonalshape1.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.15),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.15),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.12),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.11),
+	  tests/Polyhedron/generators1.cc (1.13),
+	  tests/Polyhedron/geomcovers1.cc (1.16),
+	  tests/Polyhedron/h79widening1.cc (1.14),
+	  tests/Polyhedron/h79widening2.cc (1.13),
+	  tests/Polyhedron/hybrid.cc (1.10),
+	  tests/Polyhedron/intersection1.cc (1.17),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.12),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.13),
+	  tests/Polyhedron/linearpartition1.cc (1.17),
+	  tests/Polyhedron/linearsystem1.cc (1.12),
+	  tests/Polyhedron/linexpression1.cc (1.12),
+	  tests/Polyhedron/mapspacedims1.cc (1.17),
+	  tests/Polyhedron/matrix1.cc (1.12), tests/Polyhedron/max_min1.cc
+	  (1.14), tests/Polyhedron/maxspacedim1.cc (1.20),
+	  tests/Polyhedron/mc91.cc (1.17), tests/Polyhedron/membytes1.cc
+	  (1.18), tests/Polyhedron/memory1.cc (1.21),
+	  tests/Polyhedron/memory2.cc (1.20),
+	  tests/Polyhedron/minconstraints1.cc (1.12),
+	  tests/Polyhedron/minconstraints2.cc (1.14),
+	  tests/Polyhedron/mingenerators1.cc (1.12),
+	  tests/Polyhedron/mingenerators2.cc (1.13),
+	  tests/Polyhedron/nncminimize1.cc (1.11),
+	  tests/Polyhedron/nncminimize2.cc (1.9),
+	  tests/Polyhedron/numberinput1.cc (1.34),
+	  tests/Polyhedron/onepoint.cc (1.13), tests/Polyhedron/permute.cc
+	  (1.13), tests/Polyhedron/polydifference1.cc (1.16),
+	  tests/Polyhedron/polydifference2.cc (1.15),
+	  tests/Polyhedron/polyhull1.cc (1.16),
+	  tests/Polyhedron/polyhull2.cc (1.16),
+	  tests/Polyhedron/polyhullifexact1.cc (1.5),
+	  tests/Polyhedron/polyhullifexact2.cc (1.3),
+	  tests/Polyhedron/randphull1.cc (1.17),
+	  tests/Polyhedron/refinewithcongruence1.cc (1.2),
+	  tests/Polyhedron/refinewithcongruences1.cc (1.3),
+	  tests/Polyhedron/refinewithconstraint1.cc (1.2),
+	  tests/Polyhedron/refinewithconstraints1.cc (1.2),
+	  tests/Polyhedron/relations1.cc (1.13),
+	  tests/Polyhedron/relations2.cc (1.14),
+	  tests/Polyhedron/relations3.cc (1.13),
+	  tests/Polyhedron/removespacedims1.cc (1.13),
+	  tests/Polyhedron/removespacedims2.cc (1.13),
+	  tests/Polyhedron/simplifyusingcontext1.cc (1.4),
+	  tests/Polyhedron/smm1.cc (1.12), tests/Polyhedron/timeelapse1.cc
+	  (1.14), tests/Polyhedron/timeelapse2.cc (1.14),
+	  tests/Polyhedron/topclosed1.cc (1.13),
+	  tests/Polyhedron/topclosure1.cc (1.13),
+	  tests/Polyhedron/unconstrain1.cc (1.2),
+	  tests/Polyhedron/universe1.cc (1.13),
+	  tests/Polyhedron/universe2.cc (1.13),
+	  tests/Polyhedron/variablesset1.cc (1.13),
+	  tests/Polyhedron/watchdog1.cc (1.12),
+	  tests/Polyhedron/writeconsys1.cc (1.13),
+	  tests/Polyhedron/writegensys1.cc (1.13),
+	  tests/Polyhedron/writepolyhedron1.cc (1.13),
+	  tests/Polyhedron/writepolyhedron2.cc (1.13),
+	  tests/Polyhedron/writerelation1.cc (1.15),
+	  tests/Polyhedron/writevariable1.cc (1.10),
+	  tests/Powerset/Makefile.am (1.13),
+	  tests/Powerset/addcongruences1.cc (1.2),
+	  tests/Powerset/addconstraints1.cc (1.2),
+	  tests/Powerset/affinedimension1.cc (1.2),
+	  tests/Powerset/affineimage1.cc (1.2),
+	  tests/Powerset/affinepreimage1.cc (1.2),
+	  tests/Powerset/bounded1.cc (1.2), tests/Powerset/bounds1.cc
+	  (1.2), tests/Powerset/closed1.cc (1.2),
+	  tests/Powerset/closure1.cc (1.2), tests/Powerset/collapse1.cc
+	  (1.2), tests/Powerset/concatenate1.cc (1.2),
+	  tests/Powerset/contains1.cc (1.2),
+	  tests/Powerset/containsintegerpoint1.cc (1.2),
+	  tests/Powerset/difference1.cc (1.3), tests/Powerset/discrete1.cc
+	  (1.2), tests/Powerset/disjoint1.cc (1.2),
+	  tests/Powerset/disjunct1.cc (1.2), tests/Powerset/empty1.cc
+	  (1.2), tests/Powerset/entails1.cc (1.2),
+	  tests/Powerset/equals1.cc (1.2), tests/Powerset/frombdshape1.cc
+	  (1.2), tests/Powerset/frombox1.cc (1.2),
+	  tests/Powerset/fromcongruences1.cc (1.2),
+	  tests/Powerset/fromconstraints1.cc (1.3),
+	  tests/Powerset/fromgrid1.cc (1.2),
+	  tests/Powerset/fromoctagonalshape1.cc (1.2),
+	  tests/Powerset/frompolyhedron1.cc (1.2),
+	  tests/Powerset/fromspacedimension1.cc (1.3),
+	  tests/Powerset/intersection1.cc (1.2), tests/Powerset/maxmin1.cc
+	  (1.2), tests/Powerset/meet1.cc (1.2), tests/Powerset/membytes1.cc
+	  (1.2), tests/Powerset/powerset1.cc (1.2),
+	  tests/Powerset/reduce1.cc (1.2), tests/Powerset/refinewith1.cc
+	  (1.2), tests/Powerset/relationwith1.cc (1.2),
+	  tests/Powerset/simplifyusingcontext1.cc (1.8),
+	  tests/Powerset/size1.cc (1.2), tests/Powerset/spacedims1.cc
+	  (1.2), tests/Powerset/universe1.cc (1.2),
+	  tests/Powerset/upperbound1.cc (1.2), utils/Makefile.am (1.20),
+	  utils/build_header.in (1.8), utils/cm_cleaner.sh (1.6),
+	  utils/cm_splitter.sh (1.6), utils/text2cxxarray.in (1.6),
+	  utils/timings.cc (1.14), utils/timings.hh (1.8): Copyright years
+	  extended.
+
+2008-12-29 Monday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/upperboundifexact1.cc (1.3): New test added.
+
+2008-12-23 Tuesday 19:30  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.48): Fixed typo.
+
+2008-12-23 Tuesday 12:22  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.47): Fixed typo.
+
+2008-12-23 Tuesday 11:41  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.64): Added missing const_cast.
+
+2008-12-22 Monday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.63): Added declarations for methods
+	  lower_approximation_difference_assign() and
+	  simplify_using_context_assign().
+
+2008-12-22 Monday 10:55  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.46): Simplified (and hopefully fixed)
+	  can_be_exactly_joined logics.
+
+2008-12-22 Monday 10:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.139): Method
+	  upper_bound_assign_if_exact() corrected and its efficiency
+	  improved.
+
+2008-12-22 Monday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/upperboundifexact1.cc (1.2): Adapted to test the method
+	  on the Box domain.
+
+2008-12-21 Sunday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.16), src/Box.inlines.hh (1.43),
+	  src/Box.templates.hh (1.138), src/Interval.defs.hh (1.62),
+	  src/Interval.inlines.hh (1.45), src/Interval_Restriction.defs.hh
+	  (1.16), tests/Box/Makefile.am (1.79),
+	  tests/Box/upperboundifexact1.cc (1.1): New implementation of
+	  method Box::upper_bound_assign_if_exact(const Box&).
+
+2008-12-18 Thursday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.412): Version number bumped.
+
+2008-12-18 Thursday 09:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.33): Added several missing try { ... } CATCH_ALL blocks. Now
+	  all interfaced functions should be able to translate any C++
+	  exception into a Java exception.
+
+2008-12-18 Thursday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.defs.hh (1.7): The CATCH_ALL
+	  macro should not end with a semicolon.
+
+2008-12-18 Thursday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.54): Added a newline
+	  for readability.
+
+2008-12-17 Wednesday 18:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.17): Corrected a typo in the naming of a parameter.
+
+2008-12-17 Wednesday 17:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.85), simplifyusingcontext1.cc
+	  (1.1): Added test for method
+	  BD_Shape<T>::simplify_using_context_assign().
+
+2008-12-17 Wednesday 17:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.128): Drafted an implementation for
+	  simplify_using_context_assign().
+
+2008-12-17 Wednesday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.93): Method
+	  BFT00_poly_hull_assign_if_exact() is only correct for closed
+	  polyhedra: added an assertion and adapted comments.  Added draft
+	  implementation for new method BHZ09_poly_hull_assign_if_exact().
+
+2008-12-17 Wednesday 12:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.79): Indentation fixed.
+
+2008-12-17 Wednesday 12:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.360): Corrected the specification of
+	  method BFT00__poly_hull_assign_if_exact: the method is only
+	  correct for closed polyhedra.  Added declaration for another
+	  (protected) method that will be based on an alternative algorithm
+	  (named BHZ09_poly_hull_assign_if_exact).
+
+2008-12-17 Wednesday 12:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bit_Row.cc (1.7): Added a naive, inefficient implementation
+	  for method set_until.
+
+2008-12-16 Tuesday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, NEWS, README, README.arm, README.configure,
+	  STANDARDS, TODO, configure.ac, Watchdog/ChangeLog,
+	  Watchdog/README, Watchdog/config.rpath, Watchdog/configure.ac,
+	  Watchdog/doc/Makefile.am, Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/m4/Makefile.am,
+	  Watchdog/m4/lib-ld.m4, Watchdog/m4/lib-link.m4,
+	  demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lpsol/ppl_lpsol.1, demos/ppl_lpsol/ppl_lpsol.c,
+	  devtools/print_nonascii_lines, doc/Makefile.am,
+	  doc/definitions.dox,
+	  doc/devref-foreign-language-interface.doxyconf.in,
+	  doc/devref-foreign-language-interface.tex,
+	  doc/devref-language-interface.doxyconf.in,
+	  doc/devref-language-interface.tex, doc/libppl.3, doc/libppl_c.3,
+	  doc/ppl-config.1, doc/ppl.sty,
+	  doc/user-foreign-language-interface.doxyconf.in,
+	  doc/user-foreign-language-interface.tex,
+	  doc/user-language-interface.doxyconf.in,
+	  doc/user-language-interface.tex, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, fedora/ppl.spec,
+	  interfaces/interfaced_boxes.hh, interfaces/marked_pointers.hh,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	  interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	  interfaces/Java/Makefile.am, interfaces/Java/README.java,
+	  interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.inlines.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/OCaml_interface.dox,
+	  interfaces/OCaml/README.ocaml,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_ocaml_common.cc,
+	  interfaces/OCaml/tests/Makefile.am,
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4,
+	  interfaces/OCaml/tests/test1.ml,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+	  interfaces/Prolog/ppl_prolog_common.cc,
+	  interfaces/Prolog/ppl_prolog_common.defs.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/README.gprolog,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/README.swiprolog,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/swi_efli.cc,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4,
+	  interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	  m4/ac_check_swi_prolog.m4, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bit_Row.inlines.hh,
+	  src/Boundary.defs.hh, src/Box.defs.hh, src/Box.inlines.hh,
+	  src/Box.templates.hh, src/Box_Status.inlines.hh,
+	  src/C_Polyhedron.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Congruence.cc,
+	  src/Congruence_System.cc, src/Constraint.cc,
+	  src/DB_Matrix.templates.hh, src/DB_Row.inlines.hh,
+	  src/Determinate.inlines.hh, src/Float.defs.hh, src/Generator.cc,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Status.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Init.cc,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval_Restriction.defs.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/MIP_Problem.cc, src/Makefile.am, src/Matrix.cc,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Og_Status.inlines.hh,
+	  src/Partially_Reduced_Product.defs.hh,
+	  src/Partially_Reduced_Product.inlines.hh,
+	  src/Partially_Reduced_Product.templates.hh, src/Ph_Status.cc,
+	  src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.defs.hh,
+	  src/Polyhedron.defs.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.inlines.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.inlines.hh, src/Temp.inlines.hh,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, src/conversion.cc,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-sparc.inlines.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/math_utilities.inlines.hh,
+	  src/meta_programming.hh, src/namespaces.hh, src/ppl_header.hh,
+	  src/simplify.cc, src/version.cc, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/pointsetpowerset1.cc,
+	  tests/BD_Shape/upperboundifexact1.cc, tests/Box/Makefile.am,
+	  tests/Box/ascii_dump_load1.cc, tests/Box/empty1.cc,
+	  tests/Box/fromgrid1.cc, tests/Box/pointsetpowerset1.cc,
+	  tests/Box/pointsetpowerset2.cc,
+	  tests/Box/refinewithconstraint1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/bounds1.cc, tests/Grid/maxmin1.cc,
+	  tests/Grid/partition1.cc, tests/Grid/pointsetpowerset1.cc,
+	  tests/MIP_Problem/Makefile.am, tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/pointsetpowerset1.cc,
+	  tests/Partially_Reduced_Product/directproduct6.cc,
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	  tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polyhullifexact1.cc,
+	  tests/Polyhedron/polyhullifexact2.cc,
+	  tests/Polyhedron/simplifyusingcontext1.cc,
+	  tests/Powerset/Makefile.am, tests/Powerset/addcongruences1.cc,
+	  tests/Powerset/addconstraints1.cc,
+	  tests/Powerset/affinedimension1.cc,
+	  tests/Powerset/affineimage1.cc,
+	  tests/Powerset/affinepreimage1.cc, tests/Powerset/bounded1.cc,
+	  tests/Powerset/bounds1.cc, tests/Powerset/closed1.cc,
+	  tests/Powerset/closure1.cc, tests/Powerset/collapse1.cc,
+	  tests/Powerset/concatenate1.cc, tests/Powerset/contains1.cc,
+	  tests/Powerset/containsintegerpoint1.cc,
+	  tests/Powerset/difference1.cc, tests/Powerset/discrete1.cc,
+	  tests/Powerset/disjoint1.cc, tests/Powerset/disjunct1.cc,
+	  tests/Powerset/empty1.cc, tests/Powerset/entails1.cc,
+	  tests/Powerset/equals1.cc, tests/Powerset/frombdshape1.cc,
+	  tests/Powerset/frombox1.cc, tests/Powerset/fromcongruences1.cc,
+	  tests/Powerset/fromconstraints1.cc, tests/Powerset/fromgrid1.cc,
+	  tests/Powerset/fromoctagonalshape1.cc,
+	  tests/Powerset/frompolyhedron1.cc,
+	  tests/Powerset/fromspacedimension1.cc,
+	  tests/Powerset/intersection1.cc, tests/Powerset/maxmin1.cc,
+	  tests/Powerset/meet1.cc, tests/Powerset/membytes1.cc,
+	  tests/Powerset/pointsetpowerset1.cc,
+	  tests/Powerset/pointsetpowerset2.cc,
+	  tests/Powerset/pointsetpowerset3.cc,
+	  tests/Powerset/pointsetpowerset4.cc,
+	  tests/Powerset/pointsetpowerset5.cc,
+	  tests/Powerset/pointsetpowerset6.cc, tests/Powerset/product1.cc,
+	  tests/Powerset/reduce1.cc, tests/Powerset/refinewith1.cc,
+	  tests/Powerset/relationwith1.cc, tests/Powerset/size1.cc,
+	  tests/Powerset/spacedims1.cc, tests/Powerset/universe1.cc,
+	  tests/Powerset/upperbound1.cc
+	  (bounded_arithmetic.[2,3,3,2,3,2,2,3,3,3,2,2,3,3,3,3,2,2,2,3,2,3,3,2,3,3,3,3,2,2,4,3,3,1,3,3,2,2,3,3,2,1,4,2,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,2,3,3,4,2,3,3,3,2,3,3,3,3,4,4,4,4,3,4,4,4,4,4,4,3,4,4,3,2,3,3,2,1,3,2,3,2,2,4,3,2,2,3,3,3,2,3,3,3,2,1,3,3,3,2,2,3,3,3,1,1,3,3,2,3,1,2,1,1,3,1,1,2,3,2,2,1,2,1,1,1,3,3,2,3,3,3,2,1,2,1,3,3,1,2,2,3,2,3,1,3,2,2,1,1,3,3,3,1,1,4,2,3,4,3,2,1,1,1,1,1,2,2,3,3,2,3,1,2,3,2,2,2,1,1,1,2,2,2,2,3,2,2,3,2,1,2,2,2,2,3,2,2,2,2,2,3,1,3,3,4,1,2,1,2,2,2,2,2,3,4,2,2, [...]
+	  Third merge of the trunk to the bounded_arithmetic branch.
+
+2008-12-13 Saturday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.64): Added missing inclusions.
+
+2008-12-05 Friday 07:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.29): Added `%dir %{_datadir}/doc/pwl' to the
+	  `%files' section of the `ppl-pwl' package.
+
+2008-12-01 Monday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.20), Box_Status.inlines.hh (1.4),
+	  Grid_Status.cc (1.10), Og_Status.inlines.hh (1.7), Ph_Status.cc
+	  (1.16): Dealt with several false-alarm warnings about possibly
+	  uninitialized variables.
+
+2008-12-01 Monday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.411): Fixed the definition of
+	  BUILD_OCAML_INTERFACE.
+
+2008-12-01 Monday 11:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.cc (1.29): Restored old implementation of
+	  method poly_hull_assign_if_exact(), as the algorithm in BFT00TR
+	  does not generalizes as is to the NNC case.
+
+2008-12-01 Monday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact2.cc (1.2): Added another test,
+	  showing that the algorithm in BFT00 can not be extented as is to
+	  NNC polyhedra.
+
+2008-12-01 Monday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact2.cc (bounded_arithmetic.1): file
+	  polyhullifexact2.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:36 +0000
+
+2008-11-30 Sunday 21:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.57): Postpone the AC_LIB_RPATH test.
+
+2008-11-30 Sunday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.410): Removed "AC_SUBST([docdir],
+	  ['${datadir}/doc/ppl'])": given that we require Autoconf 2.60 or
+	  later version, this was redundant.  Moreover, it did not allow to
+	  use the `--docdir' configure option.	(Thanks to Mike Frysinger.)
+
+2008-11-27 Thursday 18:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.78): Indentation fixed.
+
+2008-11-26 Wednesday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.92): Wrong comment deleted.
+
+2008-11-26 Wednesday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.cc (1.11): Indentation fixed.
+
+2008-11-25 Tuesday 20:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.134), bgp99extrapolation1.cc
+	  (1.15), bgp99extrapolation2.cc (1.9): Test file
+	  bgp99extrapolation1.cc splitted in two: old test02 goes in file
+	  bgp99extrapoaltion2.cc and is now specialized to C and NNC cases,
+	  so as to allow a finer control of the expected overflows.
+
+2008-11-25 Tuesday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/bgp99extrapolation2.cc (bounded_arithmetic.1):
+	  file bgp99extrapolation2.cc was added on branch
+	  bounded_arithmetic on 2008-12-16 06:57:36 +0000
+
+2008-11-25 Tuesday 20:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact1.cc (1.4): test09() triggers an
+	  overflow when using on 8-bit checked integers.
+
+2008-11-25 Tuesday 20:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact1.cc (bounded_arithmetic.1): file
+	  polyhullifexact1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:36 +0000
+
+2008-11-25 Tuesday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.137), BD_Shape.inlines.hh (1.172),
+	  BD_Shape.templates.hh (1.127): Drafted an implementation of
+	  method BD_Shape::upper_bound_assign_if_exact(), based on
+	  Algorithm 4.1 in BemporadFT00TR (tailored to BD shapes).
+
+2008-11-25 Tuesday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.84), upperboundifexact1.cc (1.1):
+	  Added a few tests for BD_Shape::upper_bound_assign_if_exact().
+
+2008-11-25 Tuesday 15:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/upperboundifexact1.cc (bounded_arithmetic.1): file
+	  upperboundifexact1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:34 +0000
+
+2008-11-25 Tuesday 09:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.91): Prefer Bit_Row::empty() to
+	  Bit_Row::count_ones() when testing for emptiness.
+
+2008-11-25 Tuesday 09:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.67): Fixed comment for
+	  Box::simplify_using_context_assign().
+
+2008-11-25 Tuesday 09:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (1.42): Indentation fixed.
+
+2008-11-25 Tuesday 09:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.126): Drafted implementation for
+	  incremental_shortest_path_closure_assign().
+
+2008-11-25 Tuesday 09:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.99): Useless test for
+	  zero-dim removed from incremental_strong_closure_assign().
+
+2008-11-25 Tuesday 09:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (1.63): Improved the documentation of
+	  the incremental strong closure private method.
+
+2008-11-25 Tuesday 09:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.136): Declared a private method for
+	  incremental shortest-path closure.
+
+2008-11-25 Tuesday 08:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/difference1.cc (1.2): test03() no longer overflows
+	  on 8-bit checked integer coefficients.
+
+2008-11-25 Tuesday 08:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/difference1.cc (bounded_arithmetic.1): file
+	  difference1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-24 Monday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (1.10): Fixed Bit_Row::count_ones().
+
+2008-11-24 Monday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.133), polyhullifexact1.cc
+	  (1.3), polyhullifexact2.cc (1.1): Tests that are specific for
+	  NNC_Polyhedron placed in a separate file, for which we do not
+	  produce the derived nnc test.
+
+2008-11-24 Monday 18:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polyhullifexact1.cc (1.2): Added a few tests
+	  that are specific for the NNC_Polyhedron case.
+
+2008-11-24 Monday 18:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.cc (1.28): Method
+	  NNC_Polyhedron::poly_hull_assign_if_exact() is now implemented
+	  using Polyhedron::BFT00_poly_hull_assign_if_exact().
+
+2008-11-24 Monday 17:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.359), Polyhedron_nonpublic.cc (1.90):
+	  Implementation of BFT00_poly_hull_assign_if_exact() generalized
+	  so as to correctly deal with the case of NNC polyhedra.
+
+2008-11-24 Monday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.137): Unwanted code removed.
+
+2008-11-24 Monday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.28): Method
+	  C_Polyhedron::poly_hull_assign_if_exact() is now implemented
+	  using Polyhedron::BFT00_poly_hull_assign_if_exact().
+
+2008-11-24 Monday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.358), Polyhedron_nonpublic.cc (1.89):
+	  Added protected method BFT00_poly_hull_assign_if_exact(),
+	  implementing (a variant of) an algorithm for the recognition of
+	  convex unions originally proposed by Bemporad, Fukuda and Torrisi
+	  in 2000.
+
+2008-11-24 Monday 11:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.132), polyhullifexact1.cc
+	  (1.1): Added tests for method poly_hull_assign_if_exact().
+
+2008-11-24 Monday 10:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.136), src/Grid_Generator.defs.hh (1.36),
+	  tests/Box/fromgrid1.cc (1.8): The implementation of the Box from
+	  Grid constructor has been modified to use Grid::maximize() to
+	  check if a dimension is bounded and no longer needs
+	  Grid_Generator to declare the Box class as a friend.	The
+	  FIXME(0.10.1) wrt this has been removed.
+
+2008-11-24 Monday 09:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.281): Report bug fix corrected in previous commit.
+
+2008-11-24 Monday 09:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (1.40): Corrected private method bounds()
+	  whereby it did not correctly deal with the case when the grid
+	  generators were up-to-date but not minimized. This corrects the
+	  bugs shown in the previous commit.
+
+2008-11-24 Monday 09:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: bounds1.cc (1.18), maxmin1.cc (1.16): Tests added
+	  that show a bug in bounds_from_above(), bounds_from_below(),
+	  maximize(), and minimize() in the Grids class.
+
+2008-11-22 Saturday 13:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.39),
+	  src/Partially_Reduced_Product.inlines.hh (1.37),
+	  src/Partially_Reduced_Product.templates.hh (1.16),
+	  tests/Partially_Reduced_Product/directproduct6.cc (1.4): When
+	  building from another product with different component domains
+	  and/or reduction operator, allow for any component domains and in
+	  any order.
+
+	  When building a product always check the space dimensions are no
+	  more than max_space_dimensions().
+
+	  Correct some comments in the Partially_Reduced_Product.defs.hh.
+
+	  A few tests added to test these code changes.
+
+2008-11-22 Saturday 10:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/simplifyusingcontext1.cc (1.3): Removed some
+	  commented out, useless code (it was the result of cut&paste from
+	  another test). Added known result for test01 and check against
+	  it.  Renumbered tests.
+
+2008-11-21 Friday 22:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.27): Also set
+	  nodist_ppl_ocaml_generated_test_opt_SOURCES.
+
+2008-11-21 Friday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.65), tests/Makefile.am (1.26):
+	  Let the stack size limit for native compilation be as generous as
+	  that for bytecode compilation.
+
+2008-11-20 Thursday 22:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.280), TODO (1.295): The OCaml interface now supports
+	  compilation to native code.  Also mentioned in the NEWS the
+	  correction of an OCaml interface bug.
+
+2008-11-20 Thursday 22:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.7): Added a few lines explaining
+	  how to use the OCaml interface with the native compiler ocamlopt.
+
+2008-11-20 Thursday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.64): List libppl_ocaml.a in
+	  variable pkglib_LIBRARIES (removing it from variables
+	  noinst_LIBRARIES and ocaml_DATA).  When building the native OCaml
+	  interface, do generate, install and clean the library file
+	  ppl_ocaml.a.
+
+2008-11-20 Thursday 21:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.63), tests/Makefile.am (1.25):
+	  Avoid using OCaml (bytecode/native) compiler option -g.  Do also
+	  clean *.o files generated by ocamlopt.
+
+2008-11-20 Thursday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.171), Octagonal_Shape.inlines.hh
+	  (1.42): Two bogus TODOs changed into (urgent) FIXMEs.
+
+2008-11-20 Thursday 14:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.24): Build and run the
+	  bytecode/native OCaml tests depending on the availability of the
+	  bytecode/native OCaml compilers.
+
+2008-11-20 Thursday 14:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.62): Build the bytecode/native
+	  OCaml interfaces depending on the availability of the
+	  bytecode/native OCaml compilers (and corresponding mlgmp
+	  libraries).
+
+2008-11-20 Thursday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.62), ppl_interface_generator_ocaml_ml_code.m4 (1.52),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.21):
+	  Corrected a bug in the code for the OCaml function
+	  ppl_Grid_generalized_affine_(pre)image_with_congruence; also
+	  corrected corresponding test.
+
+2008-11-20 Thursday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.409): Check whether or not the OCaml native
+	  compiler ocamlopt is available.
+
+2008-11-20 Thursday 13:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.templates.hh (1.15): Avoid reducing
+	  the product where it is not essential.
+
+2008-11-20 Thursday 08:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.279): Added a note concerning the correction of a bug in
+	  the Partially_Reduced_Product<>::time_elapse_assign().
+
+2008-11-20 Thursday 08:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.36),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (1.4): In the time_elapse, both components must be reduced before
+	  doing the operation. The clear_reduced_flag() after the operation
+	  removed and the tagged FIXME removed.
+
+	  Test added showing an example that is only correct if the second
+	  component is also reduced.
+
+2008-11-19 Wednesday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.294): Added several new items.
+
+2008-11-19 Wednesday 21:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.35): Restored the
+	  clear_reduced_flag() for the time_elapse_assign.  FIXME also
+	  restored as this still needs checking.
+
+2008-11-19 Wednesday 20:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.149): Added missing verb in comment.
+
+2008-11-19 Wednesday 10:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.38),
+	  Partially_Reduced_Product.inlines.hh (1.34): Several tagged
+	  FIXME's removed.  CHECKME Comment for the widening operation
+	  modified to confirm that this _is_ a widening for the products as
+	  provided here.
+
+2008-11-19 Wednesday 08:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/shrinkusingcongruences1.cc
+	  (products.1): file shrinkusingcongruences1.cc was added on branch
+	  products on 2009-01-05 13:54:39 +0000
+
+2008-11-19 Wednesday 08:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.37),
+	  src/Partially_Reduced_Product.inlines.hh (1.33),
+	  src/Partially_Reduced_Product.templates.hh (1.14),
+	  src/Partially_Reduced_Product.types.hh (1.5),
+	  tests/Partially_Reduced_Product/Makefile.am (1.8),
+	  tests/Partially_Reduced_Product/shrinkusingcongruences1.cc (1.2):
+	  Removed previously added reduction method.
+
+2008-11-18 Tuesday 15:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.36),
+	  src/Partially_Reduced_Product.inlines.hh (1.32),
+	  src/Partially_Reduced_Product.templates.hh (1.13),
+	  src/Partially_Reduced_Product.types.hh (1.4),
+	  tests/Partially_Reduced_Product/Makefile.am (1.7),
+	  tests/Partially_Reduced_Product/shrinkusingcongruences1.cc (1.1):
+	  Added a reduction method Shrink_Using_Congruences_Reduction<> and
+	  the product Shrink_Using_Congruences_Product<> that assumes this
+	  reduction.
+
+2008-11-18 Tuesday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.278): Mention bug fix for
+	  Polyhedron::contains_integer_point().
+
+2008-11-18 Tuesday 14:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.148): Added a couple of comments
+	  regarding the recently corrected bug in contains_integer_point().
+
+2008-11-18 Tuesday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/containsintegerpoint1.cc (bounded_arithmetic.1):
+	  file containsintegerpoint1.cc was added on branch
+	  bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-18 Tuesday 13:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.11),
+	  interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
+	  (1.2), tests/Powerset/Makefile.am (1.12),
+	  tests/Powerset/containsintegerpoint1.cc (1.1): Corrected some m4
+	  code that resulted in wrongly named test predicates.	Corrected
+	  expected answers for tests that checked properties such as
+	  "is_empty()".  Added tests for the contains_integer_point() for
+	  the Pointset_Powerset domain.
+
+2008-11-18 Tuesday 13:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (1.5),
+	  src/Polyhedron_public.cc (1.147): Several bugs in code for
+	  contains_integer_point() fixed.  Added new tests that showed the
+	  bugs.  Uncommented some tests.
+
+2008-11-18 Tuesday 08:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.146): Corrected typo in comment.
+
+2008-11-17 Monday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.277): Recorded the fix solving the `make check' problem
+	  when the `--disable-watchdog' configure option is used.
+
+2008-11-17 Monday 17:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.131): The sources for test
+	  memory1 should be distributed unconditionally (i.e., even when
+	  valgrind tests are disabled).
+
+2008-11-17 Monday 17:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (1.13): Test mipproblem2 should be
+	  built iff the watchdog library is enabled.
+
+2008-11-16 Sunday 21:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Powerset/Makefile.am (1.11): Typo fixed.
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/addcongruences1.cc (bounded_arithmetic.1): file
+	  addcongruences1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/addconstraints1.cc (bounded_arithmetic.1): file
+	  addconstraints1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/affinedimension1.cc (bounded_arithmetic.1): file
+	  affinedimension1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/affineimage1.cc (bounded_arithmetic.1): file
+	  affineimage1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/affinepreimage1.cc (bounded_arithmetic.1): file
+	  affinepreimage1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/bounded1.cc (bounded_arithmetic.1): file
+	  bounded1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/bounds1.cc (bounded_arithmetic.1): file bounds1.cc
+	  was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+	  +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/closed1.cc (bounded_arithmetic.1): file closed1.cc
+	  was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+	  +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/closure1.cc (bounded_arithmetic.1): file
+	  closure1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/collapse1.cc (bounded_arithmetic.1): file
+	  collapse1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/concatenate1.cc (bounded_arithmetic.1): file
+	  concatenate1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/contains1.cc (bounded_arithmetic.1): file
+	  contains1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/discrete1.cc (bounded_arithmetic.1): file
+	  discrete1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/disjoint1.cc (bounded_arithmetic.1): file
+	  disjoint1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/disjunct1.cc (bounded_arithmetic.1): file
+	  disjunct1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/empty1.cc (bounded_arithmetic.1): file empty1.cc
+	  was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+	  +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/entails1.cc (bounded_arithmetic.1): file
+	  entails1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/equals1.cc (bounded_arithmetic.1): file equals1.cc
+	  was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+	  +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/fromconstraints1.cc (bounded_arithmetic.1): file
+	  fromconstraints1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/fromspacedimension1.cc (bounded_arithmetic.1):
+	  file fromspacedimension1.cc was added on branch
+	  bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/intersection1.cc (bounded_arithmetic.1): file
+	  intersection1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/maxmin1.cc (bounded_arithmetic.1): file maxmin1.cc
+	  was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+	  +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/meet1.cc (bounded_arithmetic.1): file meet1.cc was
+	  added on branch bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/membytes1.cc (bounded_arithmetic.1): file
+	  membytes1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/reduce1.cc (bounded_arithmetic.1): file reduce1.cc
+	  was added on branch bounded_arithmetic on 2008-12-16 06:57:37
+	  +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/refinewith1.cc (bounded_arithmetic.1): file
+	  refinewith1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/relationwith1.cc (bounded_arithmetic.1): file
+	  relationwith1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/size1.cc (bounded_arithmetic.1): file size1.cc was
+	  added on branch bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/spacedims1.cc (bounded_arithmetic.1): file
+	  spacedims1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/universe1.cc (bounded_arithmetic.1): file
+	  universe1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-14 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/upperbound1.cc (bounded_arithmetic.1): file
+	  upperbound1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-14 Friday 12:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Box/Makefile.am (1.78), Box/pointsetpowerset1.cc (1.9),
+	  Polyhedron/polydifference1.cc (1.15), Powerset/Makefile.am
+	  (1.10), Powerset/addcongruences1.cc (1.1),
+	  Powerset/addconstraints1.cc (1.1), Powerset/affinedimension1.cc
+	  (1.1), Powerset/affineimage1.cc (1.1),
+	  Powerset/affinepreimage1.cc (1.1), Powerset/bounded1.cc (1.1),
+	  Powerset/bounds1.cc (1.1), Powerset/closed1.cc (1.1),
+	  Powerset/closure1.cc (1.1), Powerset/collapse1.cc (1.1),
+	  Powerset/concatenate1.cc (1.1), Powerset/contains1.cc (1.1),
+	  Powerset/difference1.cc (1.1), Powerset/discrete1.cc (1.1),
+	  Powerset/disjoint1.cc (1.1), Powerset/disjunct1.cc (1.1),
+	  Powerset/empty1.cc (1.1), Powerset/entails1.cc (1.1),
+	  Powerset/equals1.cc (1.1), Powerset/fromconstraints1.cc (1.2),
+	  Powerset/fromspacedimension1.cc (1.2), Powerset/intersection1.cc
+	  (1.1), Powerset/maxmin1.cc (1.1), Powerset/meet1.cc (1.1),
+	  Powerset/membytes1.cc (1.1), Powerset/pointsetpowerset1.cc (1.3),
+	  Powerset/pointsetpowerset2.cc (1.3),
+	  Powerset/pointsetpowerset3.cc (1.3),
+	  Powerset/pointsetpowerset4.cc (1.3),
+	  Powerset/pointsetpowerset5.cc (1.3), Powerset/product1.cc (1.2),
+	  Powerset/reduce1.cc (1.1), Powerset/refinewith1.cc (1.1),
+	  Powerset/relationwith1.cc (1.1), Powerset/size1.cc (1.1),
+	  Powerset/spacedims1.cc (1.1), Powerset/universe1.cc (1.1),
+	  Powerset/upperbound1.cc (1.1): Completed a reorganization of the
+	  tests for the Powerset domains.
+
+2008-11-12 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.34): On Darwin, avoid the
+	  `-module' Libtool flag for building the `libppl_java' library.
+
+2008-11-12 Wednesday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/Makefile.am (1.9): Wrong file names fixed.
+
+2008-11-12 Wednesday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/frombdshape1.cc (bounded_arithmetic.1): file
+	  frombdshape1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/frombox1.cc (bounded_arithmetic.1): file
+	  frombox1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-12 Wednesday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/fromcongruences1.cc (bounded_arithmetic.1): file
+	  fromcongruences1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/fromgrid1.cc (bounded_arithmetic.1): file
+	  fromgrid1.cc was added on branch bounded_arithmetic on 2008-12-16
+	  06:57:37 +0000
+
+2008-11-12 Wednesday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/fromoctagonalshape1.cc (bounded_arithmetic.1):
+	  file fromoctagonalshape1.cc was added on branch
+	  bounded_arithmetic on 2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/frompolyhedron1.cc (bounded_arithmetic.1): file
+	  frompolyhedron1.cc was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:37 +0000
+
+2008-11-12 Wednesday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/Makefile.am (1.83),
+	  BD_Shape/pointsetpowerset1.cc (1.6), Box/Makefile.am (1.77),
+	  Box/pointsetpowerset2.cc (1.4), Grid/Makefile.am (1.74),
+	  Grid/pointsetpowerset1.cc (1.5), Octagonal_Shape/Makefile.am
+	  (1.37), Octagonal_Shape/pointsetpowerset1.cc (1.5),
+	  Powerset/Makefile.am (1.8), Powerset/frombdshape1.cc (1.1),
+	  Powerset/frombox1.cc (1.1), Powerset/fromcongruences1.cc (1.1),
+	  Powerset/fromconstraints1.cc (1.1), Powerset/fromgrid1.cc (1.1),
+	  Powerset/fromoctagonalshape1.cc (1.1),
+	  Powerset/frompolyhedron1.cc (1.1),
+	  Powerset/fromspacedimension1.cc (1.1),
+	  Powerset/pointsetpowerset6.cc (1.2): Started reorganising the
+	  tests for the powerset domains and moving all tests on the
+	  powersets into the Powerset directory
+
+2008-11-11 Tuesday 18:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.18): Added a reference to a bug
+	  report against Fedora's `pl' package.
+
+2008-11-11 Tuesday 09:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.86), Grid.templates.hh (1.40),
+	  Grid_conversion.cc (1.25), Grid_simplify.cc (1.41): Removed the
+	  STRONG_REDUCTION macro and added comments where the code
+	  implements the extra reduction needed for the strong minimal
+	  form.
+
+2008-11-11 Tuesday 07:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.35),
+	  ppl_interface_generator_common_dat.m4 (1.93),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.12),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.32),
+	  Java/jni/ppl_interface_generator_java_classes_cc_files.m4 (1.8),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.7), OCaml/ppl_interface_generator_ocaml_hh_files.m4 (1.4),
+	  OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 (1.4),
+	  Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+	  (1.4),
+	  Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+	  (1.4): Improved handling of the patterns with a consequential
+	  improvement to the speed of the m4 processing of the interface
+	  files.
+
+2008-11-10 Monday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_efli.cc (1.5), src/BD_Shape.inlines.hh
+	  (1.170), src/BD_Shape.templates.hh (1.125),
+	  src/Bit_Row.inlines.hh (1.9), src/Box.inlines.hh (1.41),
+	  src/Box.templates.hh (1.135), src/Generator.inlines.hh (1.65),
+	  src/Grid_public.cc (1.90), src/Interval.inlines.hh (1.44),
+	  src/Interval_Restriction.defs.hh (1.15), src/MIP_Problem.cc
+	  (1.77), src/Octagonal_Shape.inlines.hh (1.41),
+	  src/Octagonal_Shape.templates.hh (1.98),
+	  src/Polyhedron_nonpublic.cc (1.88), src/Polyhedron_public.cc
+	  (1.145), src/Temp.inlines.hh (1.6), src/checked.inlines.hh
+	  (1.52), src/checked_int.inlines.hh (1.73),
+	  src/checked_mpz.inlines.hh (1.60), src/conversion.cc (1.88),
+	  src/globals.defs.hh (1.62), src/math_utilities.inlines.hh (1.4):
+	  DIRTY_TEMP* macros renamed with the "PPL_" prefix.  A couple of
+	  other improvements related to the proper use of Coefficient
+	  objects.
+
+2008-11-10 Monday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (1.12): Use
+	  PPL_DIRTY_TEMP_COEFFICIENT whenever possible.
+
+2008-11-10 Monday 19:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.45): Use
+	  PPL_DIRTY_TEMP_COEFFICIENT whenever possible.
+
+2008-11-10 Monday 19:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.45): Corrected typo in a comment.
+
+2008-11-10 Monday 19:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox (1.7): Small correction.
+
+2008-11-10 Monday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.276), src/globals.defs.hh (1.61): Macro
+	  PPL_DIRTY_TEMP_COEFFICIENT properly commented.  Notice that this
+	  is now part of the C++ interface, hence its introduction is
+	  mentioned in the NEWS file.
+
+2008-11-10 Monday 08:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.31), interfaces/Java/jni/ppl_java_common.cc (1.53),
+	  interfaces/Java/jni/ppl_java_common.inlines.hh (1.5),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.26),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.61),
+	  interfaces/OCaml/ppl_ocaml_common.cc (1.7),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.21), interfaces/Prolog/ppl_prolog_common.cc (1.13),
+	  interfaces/Prolog/ppl_prolog_common.defs.hh (1.11),
+	  src/BD_Shape.templates.hh (1.124), src/Box.templates.hh (1.134),
+	  src/Congruence.cc (1.22), src/Congruence_System.cc (1.31),
+	  src/Constraint.cc (1.71), src/Generator.cc (1.78),
+	  src/Generator_System.cc (1.28), src/Grid.inlines.hh (1.30),
+	  src/Grid.templates.hh (1.39), src/Grid_Generator.cc (1.24),
+	  src/Grid_Generator_System.cc (1.22), src/Grid_conversion.cc
+	  (1.24), src/Grid_nonpublic.cc (1.39), src/Grid_public.cc (1.89),
+	  src/Grid_simplify.cc (1.40), src/Linear_Expression.cc (1.21),
+	  src/Linear_Row.cc (1.26), src/MIP_Problem.cc (1.76),
+	  src/Matrix.cc (1.99), src/Octagonal_Shape.templates.hh (1.97),
+	  src/Pointset_Powerset.cc (1.25),
+	  src/Pointset_Powerset.templates.hh (1.44),
+	  src/Polyhedron.templates.hh (1.22), src/Polyhedron_nonpublic.cc
+	  (1.87), src/Polyhedron_public.cc (1.144),
+	  src/Polyhedron_widenings.cc (1.69), src/Row.cc (1.106),
+	  src/Scalar_Products.inlines.hh (1.8), src/conversion.cc (1.87),
+	  src/globals.defs.hh (1.60), src/math_utilities.inlines.hh (1.3),
+	  tests/Grid/partition1.cc (1.9): Macro TEMP_INTEGER renamed
+	  PPL_DIRTY_TEMP_COEFFICIENT.
+
+2008-11-10 Monday 07:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.51): Macro COPY_GMP renamed
+	  PPL_MATCH_GMP_GCDEXT and undefined after use.
+
+2008-11-09 Sunday 21:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.86): COND* macros renamed with
+	  the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.102), Float.defs.hh (1.33),
+	  checked.defs.hh (1.51), checked_float.inlines.hh (1.99),
+	  checked_numeric_limits.hh (1.23): NAN macro renamed with the
+	  "PPL_" prefix and undefined after its use.
+
+2008-11-09 Sunday 20:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Boundary.defs.hh (1.15), Interval.defs.hh (1.61),
+	  Interval_Restriction.defs.hh (1.14), globals.defs.hh (1.59),
+	  meta_programming.hh (1.12), ppl_header.hh (1.13):
+	  COMPILE_TIME_CHECK* macros renamed with the "PPL_" prefix and
+	  undefined at the end of the library's C++ interface header file.
+
+2008-11-09 Sunday 19:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh (1.50): The `nonconst' macro is now defined
+	  and undefined in a completely safe way.
+
+2008-11-09 Sunday 18:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Rounding_Dir.inlines.hh (1.10), fpu-c99.inlines.hh (1.22),
+	  fpu-ia32.inlines.hh (1.22), fpu-sparc.inlines.hh (1.12): Macros
+	  FPU_DOWNWARD, FPU_TONEAREST, FPU_TOWARDZERO and FPU_UPWARD
+	  renamed with the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 14:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.72): ASSIGN* macros renamed with
+	  the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked.defs.hh (1.49), checked.inlines.hh (1.50):
+	  FUNCTION_CLASS macro renamed with the "PPL_" prefix and undefined
+	  after its use.  Long source lines avoided.
+
+2008-11-09 Sunday 12:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh (1.48): DEF_FUN* macros renamed with the
+	  "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 12:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.85): DEF_ASSIGN_* macros renamed
+	  with the "PPL_" prefix and undefined after their use.
+
+2008-11-09 Sunday 12:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked.defs.hh (1.47), checked_float.inlines.hh (1.98),
+	  checked_int.inlines.hh (1.71), checked_mpq.inlines.hh (1.48),
+	  checked_mpz.inlines.hh (1.59), ppl_header.hh (1.12): SPECIALIZE_*
+	  macros renamed with the "PPL_" prefix and undefined at the end of
+	  the library's C++ interface header file.
+
+2008-11-09 Sunday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.49): Macro `safe_conversion' renamed
+	  `PPL_SAFE_CONVERSION' and #undef'ined after its use.
+
+2008-11-09 Sunday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.275): Robustness has been improved.
+
+2008-11-09 Sunday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Row.inlines.hh (1.25), Row.inlines.hh (1.69): Use
+	  std::numeric_limits<size_t>::max() instead of size_t(-1).
+
+2008-11-09 Sunday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplify.cc (1.55): Took into account that no checks for
+	  possible overflows are made in the implementation of new
+	  expressions.
+
+2008-11-09 Sunday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (1.14): No longer use
+	  compute_capacity(dimension_type requested_size).
+
+2008-11-08 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.58), globals.inlines.hh (1.25),
+	  simplify.cc (1.54): No longer use compute_capacity(dimension_type
+	  requested_size), now removed.
+
+2008-11-08 Saturday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: ascii_dump_load1.cc (1.11), empty1.cc (1.7),
+	  refinewithconstraint1.cc (1.4): More FIXMEs tagged with
+	  "(0.10.1)".
+
+2008-11-07 Friday 16:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.293), interfaces/ppl_interface_generator_common.m4
+	  (1.34), interfaces/ppl_interface_generator_common_dat.m4 (1.92),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.44), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.55),
+	  interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.14),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.48),
+	  interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.14),
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (1.11),
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.30),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.6),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.16),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.21),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.51), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (1.60),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 (1.4),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 (1.3),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.20),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.51),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.24),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.42),
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+	  (1.20), interfaces/Prolog/Prolog_interface.dox (1.181),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.20),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (1.11), interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
+	  (1.12),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+	  (1.14),
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.15),
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+	  (1.10),
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.7), interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (1.10),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+	  (1.3),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.9),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.15),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.20), interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (1.11), interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (1.17), interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
+	  (1.2),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+	  (1.3), interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (1.12),
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+	  (1.3),
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.10): The core ppl_interface_generator_common.m4 file has been
+	  completely reorganised, macros improved and comments revised and
+	  added.  Note that alternative patterns and replacements now have
+	  a simple _a_ or _b_ extension instead of _alt_ or _cppx_.  To
+	  change the case of a word, use "!" instead of "L" or "U" before
+	  the pattern.
+
+	  The macros in the core file are organised into groups and a
+	  comment summarises the call structure between the groups.  Each
+	  macro is labelled to indicate if it is used locally, just in this
+	  file but by a macro in another group, or if it is public and may
+	  be used by other code generating m4 files.  Suggestions for
+	  further improving the macro descriptions are welcome.
+
+	  The complementary file  ppl_interface_generator_common.m4_dat
+	  file that contains the common data and some macros for generating
+	  the basic class names, the patterns and their replacements is
+	  improved and some redundant things removed.  Commenting is not
+	  improved but much of the structure here is simpler and existing
+	  comments provide a lot of information already.
+
+	  The changes to these files has meant that changes to all the m4
+	  files in the interfaces directory was required.
+
+	  These changes seem to make the m4 generation slightly more
+	  efficient - but the improvement appears to be less that 10% and
+	  disappointing.
+
+2008-11-06 Thursday 08:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.292), src/BD_Shape.templates.hh (1.123),
+	  src/Box.inlines.hh (1.40), src/Box.templates.hh (1.133),
+	  src/Checked_Number.inlines.hh (1.84), src/DB_Matrix.templates.hh
+	  (1.10), src/Determinate.inlines.hh (1.59), src/Grid.templates.hh
+	  (1.38), src/Grid_Generator.defs.hh (1.35), src/Grid_public.cc
+	  (1.88), src/Init.cc (1.38), src/Interval.inlines.hh (1.43),
+	  src/Interval_Restriction.defs.hh (1.13),
+	  src/Linear_Expression.inlines.hh (1.15), src/MIP_Problem.cc
+	  (1.75), src/OR_Matrix.inlines.hh (1.13),
+	  src/OR_Matrix.templates.hh (1.9),
+	  src/Octagonal_Shape.templates.hh (1.96),
+	  src/Partially_Reduced_Product.inlines.hh (1.31),
+	  src/Pointset_Ask_Tell.templates.hh (1.15),
+	  src/Pointset_Powerset.templates.hh (1.43), src/checked.inlines.hh
+	  (1.48), src/checked_mpz.inlines.hh (1.58), src/globals.defs.hh
+	  (1.57), src/globals.inlines.hh (1.24): Tagged the FIXMEs that
+	  should be fixed before the PPL 0.10.1 release.
+
+2008-11-06 Thursday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.291), doc/libppl.3 (1.14), tests/Polyhedron/memory2.cc
+	  (1.19): Use malloc(), realloc() and free() instead of operator
+	  new() and operator delete() to implement the replacement GMP
+	  allocation functions.
+
+2008-11-05 Wednesday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.20): Use malloc(), realloc() and
+	  free() instead of operator new() and operator delete() to
+	  implement the replacement GMP allocation functions.
+
+2008-11-05 Wednesday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.290), demos/ppl_lcdd/ppl_lcdd.1 (1.7),
+	  demos/ppl_lpsol/ppl_lpsol.1 (1.8), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.91), doc/libppl.3 (1.13), doc/libppl_c.3 (1.4),
+	  doc/ppl-config.1 (1.14): Made `ppl_lpsol --help' and `ppl_lcdd
+	  --help' consistent.  Man pages updated.
+
+2008-11-05 Wednesday 19:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.274): Added a section for 0.10.1.
+
+2008-11-05 Wednesday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.408): Version number bumped.
+
+2008-11-05 Wednesday 19:23  Abramo Bagnara
+
+	* devtools/print_nonascii_lines (1.3): Added \007 e \015.
+
+2008-11-05 Wednesday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/print_nonascii_lines (bounded_arithmetic.1): file
+	  print_nonascii_lines was added on branch bounded_arithmetic on
+	  2008-12-16 06:57:19 +0000
+
+2008-11-05 Wednesday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.273), STANDARDS (1.42): Stick to ASCII.
+
+2008-11-05 Wednesday 19:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.82), Box/Makefile.am (1.76),
+	  Octagonal_Shape/Makefile.am (1.36): Add dirty_marker to
+	  DISTCLEANFILES.  (Thanks to Michael Tautschnig for poiting this
+	  out.)
+
+2008-11-05 Wednesday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/print_nonascii_lines (1.2): Print also the line number.
+
+2008-11-05 Wednesday 19:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (1.8), doc/Makefile.am (1.100): Doxygen
+	  configuration files are generated by the configure script, so
+	  that they don't have to be listed in EXTRA_DIST.  (Thanks to
+	  Michael Tautschnig for pointing this out.)
+
+2008-11-05 Wednesday 19:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.191): Source file ppl-config.cc is generated
+	  by the configure script, hence it should not be distributed: list
+	  it in nodist_ppl_config_SOURCES.  (Thanks to Michael Tautschnig
+	  for pointing out this problem.)
+
+2008-11-04 Tuesday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.28): Fixed the requirements of the `ppl-java'
+	  package.
+
+2008-11-04 Tuesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/print_nonascii_lines (1.1): One-liner to print lines
+	  containing non-ASCII characters.
+
+2008-11-04 Tuesday 14:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.27): Changelog updated.  Added m4 >= 1.4.8 to
+	  build requirements.
+
+2008-11-04 Tuesday 10:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_10-branch.1): Update version.
+
+2008-11-04 Tuesday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_10-branch.[1,1]): Mark
+	  ChangeLog.
+
+2008-11-04 Tuesday 10:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (ppl-0_10-branch.1), TODO (1.289): Use ASCII only.
+
+2008-11-04 Tuesday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.34), Watchdog/ChangeLog (1.24): Updated.
+
+2008-11-03 Monday 21:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* CREDITS (1.41): Similar changes to those in credits.raw.
+
+2008-11-03 Monday 20:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.56), configure.ac (1.407), doc/Makefile.am (1.99),
+	  doc/definitions.dox (1.226),
+	  doc/devref-foreign-language-interface.doxyconf.in (1.6),
+	  doc/devref-foreign-language-interface.tex (1.4),
+	  doc/devref-language-interface.doxyconf.in (1.1),
+	  doc/devref-language-interface.tex (1.1),
+	  doc/user-foreign-language-interface.doxyconf.in (1.7),
+	  doc/user-foreign-language-interface.tex (1.4),
+	  doc/user-language-interface.doxyconf.in (1.1),
+	  doc/user-language-interface.tex (1.1): Renamed a few
+	  documentation-related helper files.
+
+2008-11-03 Monday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.272): Wording improved.
+
+2008-11-03 Monday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: interfaced_boxes.hh (1.5), marked_pointers.hh (1.3):
+	  Comments improved.
+
+2008-11-03 Monday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.37), Poly_Gen_Relation.defs.hh
+	  (1.35), namespaces.hh (1.17): Improved some comments.
+
+2008-11-03 Monday 18:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.40): Just list (without numbering them) supporting
+	  projects and organizations.
+
+2008-11-03 Monday 18:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.39): A couple of fixes to indentation.
+
+2008-11-03 Monday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.38): Alphabetical ordering restored.
+
+2008-11-03 Monday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc (1.15): Jose Morales added to the "special thanks"
+	  section.
+
+2008-11-03 Monday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.98): Corrected the command for generating the
+	  configuration-dependent HTML manuals for the OCaml interface:
+	  HTML files generated by ocamldoc are now placed in the ocamldoc
+	  subdir.
+
+2008-11-03 Monday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc (1.14): Synchronized with the CREDITS file.
+
+2008-11-03 Monday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.406): Version number bumped.
+
+2008-11-03 Monday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.37): Backported Enric's entry from the `polynomials'
+	  branch.
+
+2008-11-03 Monday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.36): Finished harmonization with the Credits web page.
+
+2008-11-03 Monday 11:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.97): A couple of FIXME dealt with (i.e., just
+	  removed): the INPUT Doxygen variable for the user foreing
+	  language interface documentation seems to be OK as is.
+
+2008-11-03 Monday 11:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.defs.hh (1.85): Specify which constraints are optimally
+	  supported by the grid domain.
+
+2008-11-03 Monday 10:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.66), Octagonal_Shape.defs.hh (1.62): In the
+	  detailed documentation for class Box, explain which constraints
+	  and congruences are optimally supported (some delegation to the
+	  template argument class is required). Simplify the docs for teh
+	  add_* methods.
+
+2008-11-03 Monday 10:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.135), Octagonal_Shape.defs.hh (1.61):
+	  In the detailed documentation for Octagonal_Shape, say explicitly
+	  which constraints/congruences are optimally supported. Exploiting
+	  this, simplify the documentation for methods add_*.
+
+2008-11-03 Monday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.134): Documentation improved: we now say
+	  explicitly in the detailed class documentation which are the
+	  constraints/congruences that are optimally supported; as a
+	  consequence, the docs for the add_* methods can be simplified by
+	  saying that an exception is thorwn if the argument is not
+	  optimally supported.
+
+2008-11-03 Monday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.13), Watchdog/INSTALL (1.10): Previous commit
+	  reverted.
+
+2008-11-03 Monday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.35): Continued harmonization with the Credits web
+	  page.
+
+2008-11-03 Monday 09:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.arm (1.2): Some nels changes.
+
+2008-11-03 Monday 08:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* Watchdog/INSTALL (1.9): Same changes as in previous commit for
+	  the top-level ppl INSTALL file.
+
+2008-11-03 Monday 08:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* INSTALL (1.12): Removed a comma and an nels change from "not
+	  widely useful" to "not often used".
+
+2008-11-03 Monday 08:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.42): Spelling bugs fixed.
+
+2008-11-03 Monday 08:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.271): Added an item for the C interface wrt the change
+	  for less_than* and greater_than* (and added a note wrt this for
+	  the similar item for the C++ interface).
+
+2008-11-03 Monday 00:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.270): Wording improved.
+
+2008-11-02 Sunday 23:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/test1.ml (1.16): FIXME resolved.
+
+2008-11-02 Sunday 23:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.288): New item for PPL 0.10.1.
+
+2008-11-02 Sunday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.34): Started harmonization with the Credits web page.
+
+2008-11-02 Sunday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README.gprolog (1.7): Unwanted slash
+	  removed.  Indentation changed so as to make the example
+	  compilation command clearer.
+
+2008-11-02 Sunday 16:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/README.gprolog (1.6): Revised the example
+	  compilation command so that the compiler knows where to look, at
+	  run-time, for the libppl_gprolog library .
+
+2008-11-02 Sunday 16:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* CREDITS (1.33): A few small changes.
+
+2008-11-02 Sunday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.37): Comment improved.
+
+2008-11-02 Sunday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.29): Comment indentation fixed.
+
+2008-11-02 Sunday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.87), README.gprolog (1.5):
+	  Whenever possible, statically link `ppl_gprolog' with
+	  `libppl_gprolog'.
+
+2008-11-02 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.105): Comment improved.
+
+2008-11-02 Sunday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.104), README.swiprolog
+	  (1.4): Made sure `ppl_pl' is as simple to use as possible by
+	  linking it statically with `libppl_swiprolog', whenever possible.
+	  Explained what to do in other cases.
+
+2008-11-01 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.32): This file must be ASCII.
+
+2008-11-01 Saturday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.26): Restored the default instantiations.
+
+2008-11-01 Saturday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.25): Reorganized the contents of the `ppl' and
+	  `ppl-devel' packages.
+
+2008-11-01 Saturday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.287): Added an item for PPL 0.10.1.
+
+2008-11-01 Saturday 16:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.96): Only install foreign language interface
+	  manauls if they have been enabled.  Also improved the uninstall
+	  rule for PDF and PS docs.
+
+2008-11-01 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1 (1.6), demos/ppl_lpsol/ppl_lpsol.1
+	  (1.7), doc/ppl-config.1 (1.13): Version number set to 0.10.
+
+2008-11-01 Saturday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.55), Watchdog/README (1.20): Updated.
+
+2008-11-01 Saturday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.24): Temporarily disabled the OCaml packages,
+	  since there is no MLGMP package for Fedora.
+
+2008-11-01 Saturday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.88), GNU/Makefile.am
+	  (1.86), SICStus/Makefile.am (1.101), SWI/Makefile.am (1.103),
+	  XSB/Makefile.am (1.81): List `-no-undefined' among the per-module
+	  LDFLAGS when `NO_UNDEFINED_FLAG' is set.
+
+2008-11-01 Saturday 14:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.33): List `-no-undefined'
+	  among the per-module LDFLAGS when `NO_UNDEFINED_FLAG' is set.
+
+2008-11-01 Saturday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.23): Removed the `yap-static' subpackage.
+
+2008-11-01 Saturday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.71): YAP only supports
+	  dynamic loading of foreign modules: do not waste time building a
+	  static library.
+
+2008-11-01 Saturday 12:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/: user.doxyconf-html.in (1.6),
+	  user.doxyconf-latex.in (1.6): Do not produce the collaboration
+	  graph in the user docs, as this graph contains implementation
+	  info.
+
+2008-11-01 Saturday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.22): It is no longer necessary to remove empty
+	  *.map files in the HTML documentation directories.
+
+2008-11-01 Saturday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.32): Avoid compiling any
+	  source for the static version of `libppl_java' (which we do not
+	  need).
+
+2008-11-01 Saturday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.21): New subpackage `java-javadoc', as per the
+	  Fedora packaging guidelines.
+
+2008-11-01 Saturday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-foreign-language-interface.doxyconf.in (1.6),
+	  user.doxyconf-html.in (1.45), user.doxyconf-latex.in (1.16): Do
+	  not produce the collaboration graph in th euser docs, as this
+	  graph contains implementation info.
+
+2008-11-01 Saturday 09:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1 (1.5), demos/ppl_lpsol/ppl_lpsol.1
+	  (1.6), doc/ppl-config.1 (1.12): Regenerated so as to bump the
+	  month.
+
+2008-11-01 Saturday 09:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.35),
+	  Pointset_Powerset.defs.hh (1.56): In the documentation, corrected
+	  several "brief" into "\brief".
+
+2008-11-01 Saturday 08:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.20): Remove the empty *.map files produced by
+	  Doxygen.
+
+2008-10-31 Friday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.31): Added
+	  `libppl_java_la_LIBTOOLFLAGS=--tag=disable-static'.  This avoids
+	  installing the (useless) static library `libppl_java.a', but not
+	  the overhead for building it (see
+	  http://lists.gnu.org/archive/html/libtool/2008-10/msg00079.html).
+
+2008-10-31 Friday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.19): Package the PWL documentation in the
+	  `ppl-pwl-docs' subpackage.  Package also the new man pages.
+
+2008-10-31 Friday 21:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.18): Files section for the `ppl-java'
+	  subpackage tightened.
+
+2008-10-31 Friday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.30): Added `-module' and
+	  `-avoid-version' to `libppl_java_la_LDFLAGS'.
+
+2008-10-31 Friday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.17): Package more documentation.
+
+2008-10-31 Friday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.16): Release field fixed.
+
+2008-10-31 Friday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.15): Version set to 0.10.	Untabified.
+
+2008-10-31 Friday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.33), Watchdog/ChangeLog (1.23): Updated.
+
+2008-10-31 Friday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.31): Use the UTF-8 encoding.
+
+2008-10-31 Friday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.14): Comment fixed.  Package also `ppl_c.m4'.
+
+2008-10-31 Friday 17:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.13): Fixed the `ppl-java' file section.
+
+2008-10-31 Friday 17:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.12): Use `--enable-interfaces' so as to enable
+	  the needed and only the needed interfaces.
+
+2008-10-31 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.25): Distribute also README.java.
+
+2008-10-31 Friday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.61): Distribute also
+	  README.ocaml.
+
+2008-10-31 Friday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.11): Fixed the path of PWL's README.doc.
+
+2008-10-31 Friday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.10): Disable rpath completely also for the
+	  PWL.
+
+2008-10-31 Friday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: config.rpath (1.1), configure.ac (1.56),
+	  m4/Makefile.am (1.5), m4/lib-ld.m4 (1.1), m4/lib-link.m4 (1.1):
+	  Added the `--disable-rpath' option to the configuration script.
+	  The definition of `m4macros' in `Makefile.am' had several
+	  omissions: fixed.
+
+2008-10-31 Friday 13:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.269): Reorganised, duplicate item removed, subheadings
+	  added and the section on foreign language interfaces split into
+	  separate items.  A few other minor changes.
+
+2008-10-31 Friday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/README.java (1.2): Improved.
+
+2008-10-31 Friday 11:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.268): Added two items.
+
+2008-10-31 Friday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.9): Added a `%files' section for the `java'
+	  subpackage.
+
+2008-10-31 Friday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.41), interfaces/Java/README.java (1.1): Added
+	  a truly minimal README.java.
+
+2008-10-31 Friday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.29): List `libppl_java.la' in
+	  `pkglib_LTLIBRARIES', not `lib_LTLIBRARIES'.
+
+2008-10-31 Friday 08:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.8): Added a java subpackage.
+
+2008-10-30 Thursday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.7): BuildRoot amended as per the Fedora
+	  packaging guidelines.
+
+2008-10-30 Thursday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.6): Manual merge of the changes done in the
+	  version stored in Fedora repository.
+
+2008-10-29 Wednesday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, Makefile.am, NEWS, README, README.arm,
+	  README.configure, STANDARDS, TODO, config.guess, config.sub,
+	  configure.ac, instchk.hh, Watchdog/ChangeLog,
+	  Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	  Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/doc/Makefile.am,
+	  Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in,
+	  Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/m4/Makefile.am,
+	  Watchdog/m4/ax_prefix_config_h.m4,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	  Watchdog/src/Watchdog.inlines.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/tests/.cvsignore, Watchdog/tests/Makefile.am,
+	  Watchdog/tests/pwl_test.cc, Watchdog/tests/pwl_test.hh,
+	  Watchdog/tests/simple1.cc, Watchdog/tests/valgrind_suppressions,
+	  Watchdog/utils/Makefile.am, debian/Makefile.am,
+	  demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.1, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/ppl_lcdd_extra_man_text,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/ppl_lpsol.1, demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/ppl_lpsol_extra_man_text, devtools/.cvsignore,
+	  devtools/bump_copyright_years, devtools/cvs2cl.pl,
+	  devtools/generate_dox_biblio, devtools/generate_dox_biblio.sed,
+	  devtools/generate_dox_ci_prolog_manual,
+	  devtools/generate_man_pages, devtools/update_ChangeLog,
+	  doc/Makefile.am, doc/README.doc, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-c-interface.tex,
+	  doc/devref-foreign-language-interface.doxyconf.in,
+	  doc/devref-foreign-language-interface.tex,
+	  doc/devref-java-interface.doxyconf-html.in,
+	  doc/devref-java-interface.doxyconf-latex.in,
+	  doc/devref-java-interface.tex,
+	  doc/devref-ocaml-interface.doxyconf-html.in,
+	  doc/devref-ocaml-interface.doxyconf-latex.in,
+	  doc/devref-ocaml-interface.tex,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref-prolog-interface.tex, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex,
+	  doc/interfaces-html.sed, doc/interfaces-latex.sed, doc/libppl.3,
+	  doc/libppl_c.3, doc/ppl-config.1, doc/ppl-config_extra_man_text,
+	  doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+	  doc/user-foreign-language-interface.doxyconf.in,
+	  doc/user-foreign-language-interface.tex,
+	  doc/user-java-interface.doxyconf-html.in,
+	  doc/user-java-interface.doxyconf-latex.in,
+	  doc/user-java-interface.tex,
+	  doc/user-ocaml-interface.doxyconf-html.in,
+	  doc/user-ocaml-interface.doxyconf-latex.in,
+	  doc/user-ocaml-interface.tex,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, fedora/Makefile.am,
+	  interfaces/Makefile.am, interfaces/README.interfaces,
+	  interfaces/marked_pointers.hh,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	  interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_header.h,
+	  interfaces/C/ppl_c_implementation_common.cc,
+	  interfaces/C/ppl_c_implementation_common.defs.hh,
+	  interfaces/C/ppl_c_implementation_common.inlines.hh,
+	  interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_files.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/C/ppl_interface_generator_c_hh_files.m4,
+	  interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	  interfaces/C/tests/.cvsignore, interfaces/C/tests/Makefile.am,
+	  interfaces/C/tests/cxxoutput.c, interfaces/C/tests/ppl_c_test.cc,
+	  interfaces/C/tests/ppl_c_test.h,
+	  interfaces/C/tests/print_to_buffer.cc,
+	  interfaces/C/tests/print_to_buffer.h,
+	  interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dox.m4,
+	  interfaces/Java/ppl_interface_generator_java_dox_code.m4,
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+	  interfaces/Java/ppl_java_common_dox,
+	  interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.defs.hh,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_common.inlines.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/parma_polyhedra_library/.cvsignore,
+	  interfaces/Java/parma_polyhedra_library/By_Reference.java,
+	  interfaces/Java/parma_polyhedra_library/Coefficient.java,
+	  interfaces/Java/parma_polyhedra_library/Complexity_Class.java,
+	  interfaces/Java/parma_polyhedra_library/Congruence.java,
+	  interfaces/Java/parma_polyhedra_library/Congruence_System.java,
+	  interfaces/Java/parma_polyhedra_library/Constraint.java,
+	  interfaces/Java/parma_polyhedra_library/Constraint_System.java,
+	  interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java,
+	  interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java,
+	  interfaces/Java/parma_polyhedra_library/Degenerate_Element.java,
+	  interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java,
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java,
+	  interfaces/Java/parma_polyhedra_library/Generator.java,
+	  interfaces/Java/parma_polyhedra_library/Generator_System.java,
+	  interfaces/Java/parma_polyhedra_library/Generator_Type.java,
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator.java,
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java,
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java,
+	  interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java,
+	  interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java,
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java,
+	  interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java,
+	  interfaces/Java/parma_polyhedra_library/MIP_Problem.java,
+	  interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java,
+	  interfaces/Java/parma_polyhedra_library/Makefile.am,
+	  interfaces/Java/parma_polyhedra_library/Optimization_Mode.java,
+	  interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java,
+	  interfaces/Java/parma_polyhedra_library/PPL_Object.java,
+	  interfaces/Java/parma_polyhedra_library/Pair.java,
+	  interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java,
+	  interfaces/Java/parma_polyhedra_library/Partial_Function.java,
+	  interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java,
+	  interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java,
+	  interfaces/Java/parma_polyhedra_library/Relation_Symbol.java,
+	  interfaces/Java/parma_polyhedra_library/Variable.java,
+	  interfaces/Java/parma_polyhedra_library/Variables_Set.java,
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4,
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/MIP_Problem_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	  interfaces/Java/tests/PPL_Test.java,
+	  interfaces/Java/tests/Parma_Polyhedra_Library_test1.java,
+	  interfaces/Java/tests/Test_Executor.java,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/OCaml_interface.dox,
+	  interfaces/OCaml/README.ocaml,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+	  interfaces/OCaml/ppl_ocaml_common.cc,
+	  interfaces/OCaml/ppl_ocaml_common.defs.hh,
+	  interfaces/OCaml/ppl_ocaml_common.inlines.hh,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/OCaml/ppl_ocaml_globals.ml,
+	  interfaces/OCaml/ppl_ocaml_globals.mli,
+	  interfaces/OCaml/ppl_ocaml_types.ml,
+	  interfaces/OCaml/tests/Makefile.am,
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4,
+	  interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	  interfaces/OCaml/tests/test1.ml, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+	  interfaces/Prolog/ppl_prolog_common.cc,
+	  interfaces/Prolog/ppl_prolog_common.defs.hh,
+	  interfaces/Prolog/ppl_prolog_common.inlines.hh,
+	  interfaces/Prolog/ppl_prolog_sysdep_dox,
+	  interfaces/Prolog/ppl_prolog_sysindep_dox,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/README.ciao,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_efli.cc,
+	  interfaces/Prolog/Ciao/ciao_efli.hh,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/README.gprolog,
+	  interfaces/Prolog/GNU/gnu_prolog_generated_test.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/gprolog_efli.cc,
+	  interfaces/Prolog/GNU/gprolog_efli.hh,
+	  interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/SICStus/sicstus_efli.cc,
+	  interfaces/Prolog/SICStus/sicstus_efli.hh,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SICStus/sp_prolog_generated_test.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/SWI/swi_efli.cc,
+	  interfaces/Prolog/SWI/swi_efli.hh,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/SWI/swi_prolog_generated_test.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4,
+	  interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/XSB/xsb_efli.cc,
+	  interfaces/Prolog/XSB/xsb_efli.hh,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/YAP/yap_efli.cc,
+	  interfaces/Prolog/YAP/yap_efli.hh,
+	  interfaces/Prolog/YAP/yap_prolog_generated_test.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/expected_pgt,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl,
+	  m4/Makefile.am, m4/ac_check_ciao.m4, m4/ac_check_fpu_control.m4,
+	  m4/ac_check_gmp.m4, m4/ac_cxx_double_binary_format.m4,
+	  m4/ac_cxx_double_exact_output.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_float_exact_output.m4, m4/ac_cxx_ieee_inexact_flag.m4,
+	  m4/ac_cxx_limit_memory.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_long_double_exact_output.m4,
+	  m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+	  m4/ax_prefix_config_h.m4, m4/lib-link.m4, m4/lib-prefix.m4,
+	  m4/ppl.m4, m4/ppl_c.m4, src/Any_Pointset.defs.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	  src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Constraint.defs.hh, src/Constraint_System.defs.hh,
+	  src/Float.defs.hh, src/Float.inlines.hh, src/Generator.defs.hh,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator_System.defs.hh, src/Grid_chdims.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_widenings.cc,
+	  src/Init.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Linear_Expression.defs.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/Makefile.am,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Og_Status.idefs.hh,
+	  src/Partially_Reduced_Product.defs.hh,
+	  src/Pointset_Ask_Tell.defs.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Ptr_Iterator.defs.hh,
+	  src/Rounding_Dir.inlines.hh, src/Variables_Set.defs.hh,
+	  src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/compiler.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-none.inlines.hh, src/fpu.defs.hh,
+	  src/globals.defs.hh, src/namespaces.hh, src/ppl-config.cc.in,
+	  src/stdiobuf.cc, src/stdiobuf.defs.hh, src/stdiobuf.inlines.hh,
+	  src/stdiobuf.types.hh, src/version.cc, tests/FCAIBVP.cc,
+	  tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+	  tests/FCAIBVP.types.hh, tests/Makefile.am,
+	  tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh, tests/README, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/valgrind_suppressions, tests/Ask_Tell/Makefile.am,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/difference1.cc, tests/BD_Shape/maxspacedim1.cc,
+	  tests/BD_Shape/membytes1.cc, tests/BD_Shape/pointsetpowerset1.cc,
+	  tests/BD_Shape/upperbound1.cc, tests/Box/Makefile.am,
+	  tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	  tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+	  tests/Box/bgp99extrapolation1.cc,
+	  tests/Box/boundedaffinepreimage1.cc, tests/Box/boxdifference1.cc,
+	  tests/Box/boxhull1.cc, tests/Box/cc76narrowing1.cc,
+	  tests/Box/closure1.cc, tests/Box/concatenate1.cc,
+	  tests/Box/congruences1.cc, tests/Box/constraints1.cc,
+	  tests/Box/contains1.cc, tests/Box/difference1.cc,
+	  tests/Box/discrete1.cc, tests/Box/disjoint1.cc,
+	  tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	  tests/Box/frombox1.cc, tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffineimage2.cc, tests/Box/intersection1.cc,
+	  tests/Box/interval1.cc, tests/Box/interval2.cc,
+	  tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+	  tests/Box/membytes1.cc, tests/Box/pointsetpowerset1.cc,
+	  tests/Box/pointsetpowerset2.cc,
+	  tests/Box/propagateconstraints1.cc,
+	  tests/Box/propagateconstraints2.cc,
+	  tests/Box/refinewithcongruences1.cc,
+	  tests/Box/refinewithconstraint1.cc,
+	  tests/Box/refinewithconstraints1.cc,
+	  tests/Box/refinewithconstraints2.cc, tests/Box/relations1.cc,
+	  tests/Box/relations2.cc, tests/Box/removespacedims1.cc,
+	  tests/Box/timeelapse1.cc, tests/Box/unconstrain1.cc,
+	  tests/Box/universe1.cc, tests/Box/upperbound1.cc,
+	  tests/Box/writebox1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/approximatepartition1.cc, tests/Grid/congruence1.cc,
+	  tests/Grid/generator1.cc, tests/Grid/griddifference1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/membytes1.cc, tests/Grid/partition1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/refinewithcongruences1.cc,
+	  tests/Grid/refinewithconstraints1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/upperbound1.cc,
+	  tests/Grid/upperbound2.cc, tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/MIP_Problem/mipproblem2.cc,
+	  tests/MIP_Problem/mipproblem3.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/congruences1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/difference1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/upperbound1.cc,
+	  tests/Partially_Reduced_Product/Makefile.am,
+	  tests/Partially_Reduced_Product/asciidumpload1.cc,
+	  tests/Partially_Reduced_Product/directproduct1.cc,
+	  tests/Partially_Reduced_Product/directproduct2.cc,
+	  tests/Partially_Reduced_Product/directproduct3.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/README,
+	  tests/Polyhedron/affineimage2.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc, tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/dualhypercubes.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	  tests/Polyhedron/hybrid.cc, tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/nncminimize1.cc, tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/refinewithcongruences1.cc,
+	  tests/Powerset/Makefile.am, tests/Powerset/pointsetpowerset1.cc,
+	  tests/Powerset/pointsetpowerset2.cc,
+	  tests/Powerset/simplifyusingcontext1.cc, utils/build_header.in
+	  (bounded_arithmetic.[1,2,2,2,1,2,1,1,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,2,1,2,2,2,1,2,1,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,1,2,2,3,3,3,3,3,3,2,2,3,2,2,1,2,2,3,2,2,1,2,1,2,1,1,2,2,1,2,2,3,3,3,3,3,3,2,2,1,2,2,1,1,2,1,3,1,2,2,2,2,2,2,2,2,2,1,1,2,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,3,3,2,3,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,3,1,1, [...]
+	  Second merge of the trunk to the bounded_arithmetic branch.
+
+2008-10-29 Wednesday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.405): Version number bumped.
+
+2008-10-29 Wednesday 20:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.11),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.13): Also revised -
+	  bugs fixed and a few improvements.
+
+2008-10-29 Wednesday 20:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.180): Updated.
+
+2008-10-29 Wednesday 10:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.30): Spurious comma removed.
+
+2008-10-28 Tuesday 20:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: libppl.3 (1.12), libppl_c.3 (1.3): In the C interface man
+	  page, mention the introduction and use of functions
+	  ppl_restore_pre_PPL_rounding() and ppl_set_rounding_for_PPL().
+
+2008-10-28 Tuesday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl_c.3 (bounded_arithmetic.1): file libppl_c.3 was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-28 Tuesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.267), doc/libppl.3 (1.11): Mention the introduction and
+	  use of the functions restore_pre_PPL_rounding(),
+	  set_rounding_for_PPL(), and of their counterparts in all the
+	  language interfaces.
+
+2008-10-28 Tuesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.63), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.90), doc/libppl.3 (1.10), src/Init.cc (1.37),
+	  tests/Polyhedron/memory1.cc (1.19), tests/Polyhedron/memory2.cc
+	  (1.18): The C function name
+	  `set_GMP_memory_allocation_functions()' was breaking our
+	  namespace promise: renamed
+	  `ppl_set_GMP_memory_allocation_functions()'.
+
+2008-10-28 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3 (1.9): Wording slightly improved.
+
+2008-10-28 Tuesday 12:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* CREDITS (1.29): Updated the sponsors to include recent projects
+	  at Leeds.
+
+2008-10-27 Monday 21:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.266): Small improvement.
+
+2008-10-27 Monday 18:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.32), Watchdog/ChangeLog (1.22): Updated.
+
+2008-10-27 Monday 18:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.286): Adde 2 items for 0.10.1 and later.
+
+2008-10-27 Monday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.285): Added one item for PPL 0.10.1.
+
+2008-10-27 Monday 16:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.265): Avoid repetitive comments for the
+	  Partially_Reduced_Product domains.
+
+2008-10-27 Monday 16:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/libppl.3 (1.8): Small nels improvement.
+
+2008-10-27 Monday 15:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.43): Changed the constrains/2, unconstrain/2 and
+	  unconstrains/2 from simple to all.
+
+2008-10-27 Monday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.264): Three subitems on the foreign language interfaces,
+	  all related to uniform naming, placed together and reorganized to
+	  avoid repetitions.
+
+2008-10-27 Monday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.263): A couple of improvements on items regarding foreign
+	  langauge interfaces.
+
+2008-10-27 Monday 14:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.262): Revised the items wrt add_integer_point(),
+	  constrains() and unconstrain().
+
+2008-10-27 Monday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.261): Some consistency improvements.
+
+2008-10-27 Monday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.260): Several corrections and improvements.
+
+2008-10-27 Monday 13:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.259): Corrected a couple of typos.
+
+2008-10-27 Monday 13:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.258): Revised the item on bds_hull etc.
+
+2008-10-27 Monday 13:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.40): Small nels improvements and similar.
+
+2008-10-27 Monday 13:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.257): Improved item about refine_with_* methods.
+
+2008-10-27 Monday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.256): The wronly placed item on deprecated methods moved
+	  to a better place.  Completed the item on the changes to the
+	  documentation manuals.
+
+2008-10-27 Monday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.255): Added an item on the new man pages libppl(3) and
+	  libppl_c(3).
+
+2008-10-27 Monday 12:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.254): Dealt with items on constrains, unconstrain and
+	  has_integer_point.
+
+2008-10-27 Monday 11:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.253): Revised the item concerning LP_Problem/MIP_Problem.
+
+2008-10-27 Monday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.252): Added an item mentioning the deprecation of
+	  _and_minimize methods.  Modified another item regarding the
+	  recycling methods.
+
+2008-10-27 Monday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.251): Added an item concerning the enhancements made to
+	  the configuration script.
+
+2008-10-27 Monday 11:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.250): Completed item concerning the default widening
+	  operator.
+
+2008-10-27 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.249): Finished the item concerning the Interval template
+	  class.
+
+2008-10-27 Monday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.60): Missing comma added.
+
+2008-10-27 Monday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.59): Drafted the detailed information for
+	  the Interval class.
+
+2008-10-27 Monday 10:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.248): Completed item on can_recycle... methods.
+
+2008-10-27 Monday 10:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.247): Merged the items on constructing from and shrinking
+	  bounding boxes and completed this item.
+
+2008-10-27 Monday 10:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.246): Corrected (again) the item on covering boxes being
+	  removed.
+
+2008-10-27 Monday 09:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.245): Corrected changes to item on covering boxes.
+
+2008-10-27 Monday 09:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.244): Completed an item on the Product domains.
+
+2008-10-27 Monday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.243): News item for class Box completed.  News item for
+	  class Octagonal_Shape moved up.
+
+2008-10-27 Monday 08:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.55): Spelling fixed.
+
+2008-10-27 Monday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.242): News item that referred to the Polyhedron domain
+	  and congruences now replaced by a more genral item on congruence
+	  related methods.
+
+2008-10-27 Monday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.65): A Box is a smash product, not a Cartesian
+	  product.
+
+2008-10-27 Monday 08:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.241): Completed an item on the pointset powerset domain.
+
+2008-10-27 Monday 08:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.240): Reordered items and started indicating where more
+	  work is needed.
+
+2008-10-27 Monday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.239): Written a section on changes to the foreign
+	  language interfaces.
+
+2008-10-27 Monday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.284): Added one item for 0.10.1.
+
+2008-10-27 Monday 07:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.238): Two more reminders of news that needs adding: -
+	  OCaml and Java interfaces; - changes to the configure options.
+
+2008-10-27 Monday 06:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.h (1.5): Comment fixed.
+
+2008-10-27 Monday 06:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.h (bounded_arithmetic.1): file
+	  print_to_buffer.h was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:27 +0000
+
+2008-10-26 Sunday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Variable.java (1.3),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.6),
+	  tests/Octagonal_Shape/discrete1.cc (1.5): Trailing blanks
+	  removed.
+
+2008-10-26 Sunday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Variable.java
+	  (bounded_arithmetic.1): file Variable.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-26 Sunday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.237): Made a start on updating this file: - update the
+	  paragraph on the MIP problem to include MIP control parameters; -
+	  added a bullet on total and external memory in bytes; - reminder
+	  to add something about the removal of covering_box support; -
+	  reminder to add a note about the partially reduced product; -
+	  reminder to add something about changes to the documentation.
+
+2008-10-26 Sunday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_java_tests_common (1.18): Copyright
+	  notice added.  Indentation fixed.
+
+2008-10-26 Sunday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.6): Improved.
+
+2008-10-26 Sunday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 (1.4):
+	  Copyright notice fixed.
+
+2008-10-26 Sunday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_ocaml_hh_code.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-10-26 Sunday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/: print_to_buffer.cc (1.5), print_to_buffer.h
+	  (1.4): Added copyright notices and multiple inclusion guards.
+
+2008-10-26 Sunday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.cc (bounded_arithmetic.1):
+	  file print_to_buffer.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:27 +0000
+
+2008-10-26 Sunday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.54): Updated.
+
+2008-10-26 Sunday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.236), Watchdog/NEWS (1.12): The target release date is
+	  November 4, 2008.
+
+2008-10-26 Sunday 20:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: README (1.19), ChangeLog (1.21): Updated.
+
+2008-10-26 Sunday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: configure.ac (1.55), src/Makefile.am (1.18): Version
+	  number corrected.
+
+2008-10-26 Sunday 19:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.283): Removed section of enhancements for PPL 0.10.
+
+2008-10-26 Sunday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.282): Removed (last?) two items for PPL 0.10.
+
+2008-10-26 Sunday 19:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.225): Minor improvement.
+
+2008-10-26 Sunday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.28): Acknowledge the help received from Martin Guy.
+
+2008-10-26 Sunday 19:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.20), BD_Shape.defs.hh (1.133),
+	  Congruence.defs.hh (1.26), Congruence_System.defs.hh (1.27),
+	  Constraint.defs.hh (1.131), Constraint_System.defs.hh (1.41),
+	  Generator.defs.hh (1.127), Generator_System.defs.hh (1.29),
+	  Grid.defs.hh (1.84), Grid_Generator.defs.hh (1.34),
+	  Grid_Generator_System.defs.hh (1.30), Linear_Expression.defs.hh
+	  (1.40), MIP_Problem.defs.hh (1.40), Octagonal_Shape.defs.hh
+	  (1.60), Og_Status.idefs.hh (1.11),
+	  Partially_Reduced_Product.defs.hh (1.34),
+	  Pointset_Ask_Tell.defs.hh (1.18), Pointset_Powerset.defs.hh
+	  (1.54), Polyhedron.defs.hh (1.357), Variables_Set.defs.hh (1.9),
+	  globals.defs.hh (1.56): Let the documentation for the
+	  ascii_dump/load methods also appear in the user manuals, since
+	  they may be useful for debugging purposes.  In the user docs for
+	  Polyhedron and Grid, avoid listing exception throwers.
+
+2008-10-26 Sunday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.281), doc/ppl-config.1 (1.11),
+	  doc/ppl-config_extra_man_text (1.5), src/ppl-config.cc.in (1.25):
+	  Improved the man page of ppl-config.
+
+2008-10-26 Sunday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.280), demos/ppl_lcdd/ppl_lcdd.1 (1.4),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.62),
+	  demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.3): Improved the man
+	  page of ppl_lcdd.
+
+2008-10-26 Sunday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1 (bounded_arithmetic.1): file ppl_lcdd.1
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:23
+	  +0000
+
+2008-10-26 Sunday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd_extra_man_text (bounded_arithmetic.1):
+	  file ppl_lcdd_extra_man_text was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:23 +0000
+
+2008-10-26 Sunday 18:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.74): Indentation fixed.
+
+2008-10-26 Sunday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: ppl_lpsol.1 (1.5), ppl_lpsol.c (1.89),
+	  ppl_lpsol_extra_man_text (1.4): Documentation improved.
+
+2008-10-26 Sunday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.1 (bounded_arithmetic.1): file
+	  ppl_lpsol.1 was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:23 +0000
+
+2008-10-26 Sunday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol_extra_man_text (bounded_arithmetic.1):
+	  file ppl_lpsol_extra_man_text was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:23 +0000
+
+2008-10-26 Sunday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.279), demos/ppl_lpsol/ppl_lpsol.1 (1.4),
+	  demos/ppl_lpsol/ppl_lpsol.c (1.88),
+	  demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.3),
+	  devtools/generate_man_pages (1.3): Completed the man page of
+	  ppl_lpsol.  Other minor improvements.
+
+2008-10-26 Sunday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_man_pages (bounded_arithmetic.1): file
+	  generate_man_pages was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-26 Sunday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: libppl.3 (1.7), libppl_c.3 (1.2): The standard section name
+	  is AUTHOR, not AUTHORS.
+
+2008-10-26 Sunday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1 (1.3),
+	  demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.2),
+	  demos/ppl_lpsol/ppl_lpsol.1 (1.3),
+	  demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.2), doc/ppl-config.1
+	  (1.10), doc/ppl-config_extra_man_text (1.4): Small improvements.
+
+2008-10-26 Sunday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.278): One item moved.
+
+2008-10-26 Sunday 14:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.277), doc/Makefile.am (1.95), doc/libppl.3 (1.6): Another
+	  item dealt with.
+
+2008-10-26 Sunday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl_c.3 (1.1): Short overview on how to use the Parma
+	  Polyhedra Library (PPL) in C programs.
+
+2008-10-26 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.276), doc/libppl.3 (1.5): One item dealt whith.
+
+2008-10-26 Sunday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: README (1.4), Polyhedron/README (1.9): Moved.
+
+2008-10-26 Sunday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/README (bounded_arithmetic.1): file README was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:37 +0000
+
+2008-10-26 Sunday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.275): Two items removed; one revised.
+
+2008-10-26 Sunday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3 (1.4): Completed.
+
+2008-10-26 Sunday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.18): Make sure the GMP allocation
+	  functions are set prior to the allocation of any GMP object.
+
+2008-10-26 Sunday 09:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.274), Watchdog/src/Makefile.am (1.17),
+	  interfaces/OCaml/Makefile.am (1.60), src/Makefile.am (1.190),
+	  tests/Makefile.am (1.274), tests/BD_Shape/Makefile.am (1.81),
+	  tests/Box/Makefile.am (1.75), tests/Octagonal_Shape/Makefile.am
+	  (1.35), tests/Powerset/Makefile.am (1.7): Ensure the clean and
+	  mostlyclean comply with the 'STANDARDS' file and are used
+	  sensibly.
+
+	  Removed - Check all the Makefile.am's to make sure CLEANFILES,
+	  MOSTLYCLEANFILES   and DISTCLEANFILES are used in a sensible way.
+	   from the TODO list for 0.10
+
+2008-10-26 Sunday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3 (1.3): Some corrections.  Started a new section on
+	  implementing memory-guarded computations.
+
+2008-10-25 Saturday 22:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.50): Added alternative definition for variable
+	  distcleancheck_listfiles, so that it is not an error if a
+	  distributed file is left in the build tree after a `make
+	  distclean' (see Section 14.4 of the Automake manual).
+
+2008-10-25 Saturday 22:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (1.7): Do clean .tag files generated by
+	  Doxygen.
+
+2008-10-25 Saturday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3 (1.2): Some progress toward completion of this man
+	  page.
+
+2008-10-25 Saturday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.94): The configuration dependent Prolog
+	  manuals should depend on (generated)
+	  Prolog_configured_interface.dox, rather than (fixed)
+	  Prolog_interface.dox.
+
+2008-10-25 Saturday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.68): When Prolog is enabled, do
+	  make Prolog_configured_interface.dox.
+
+2008-10-25 Saturday 16:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.41): Typo corrected.
+
+2008-10-24 Friday 22:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (1.6), doc/Makefile.am (1.93): Avoid
+	  cleaning distributed built files.  Try to follow the rule stated
+	  in Section 27.5 of the Automake manual: distributed files should
+	  never depend upon non-distributed built files.
+
+2008-10-24 Friday 16:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.179),
+	  ppl_prolog_sysindep_dox (1.7): Revised the grammar rules to bring
+	  them up-to-date to include rules for congruences and grid
+	  generators, also removed rules for intervals and boxes etc. which
+	  are now not wanted.
+
+2008-10-24 Friday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.178),
+	  ppl_prolog_sysindep_dox (1.6): Corrected the list of weakly
+	  relational domains available to the Prolog interface.
+
+2008-10-23 Thursday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/Makefile.am (1.14): Fixed copy-and-paste mistake.
+
+2008-10-23 Thursday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.27): Acknowledge the contribution of Hewlett Packard
+	  as provider of the test cluster hosted by ESIEE.
+
+2008-10-23 Thursday 16:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: devref-foreign-language-interface.tex (1.3), devref.tex
+	  (1.27), user-foreign-language-interface.tex (1.3), user.tex
+	  (1.28): Added acknowledgements to EPSRC - two projects, one for
+	  the grid domain and the current project.
+
+2008-10-23 Thursday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-foreign-language-interface.tex (bounded_arithmetic.1):
+	  file devref-foreign-language-interface.tex was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-23 Thursday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-foreign-language-interface.tex (bounded_arithmetic.1):
+	  file user-foreign-language-interface.tex was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-23 Thursday 15:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.273), doc/definitions.dox (1.224), src/Polyhedron.defs.hh
+	  (1.356): Improved the documentation for boxes, intervals and the
+	  bounded extrapolations.
+
+	  Replace the brief descriptions of the bounded extrapolations in
+	  Polyhedron.defs.hh by shorter descriptions that ju st refer to
+	  the relevant paragraphs in definitions.dox.
+
+	  Removed the out-of-date paragraph about the domains in section
+	  1.1 of the main user's manual.
+
+	  Removed a todo item.
+
+2008-10-23 Thursday 14:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* devtools/generate_dox_ci_prolog_manual (1.2): Paths changed so
+	  that it can be used from the interfaces/Prolog directory.
+
+2008-10-23 Thursday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_ci_prolog_manual (bounded_arithmetic.1):
+	  file generate_dox_ci_prolog_manual was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-23 Thursday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.92): When installing the OCaml user
+	  documentation, do also install the ocamldoc subdir and its
+	  contents.
+
+2008-10-23 Thursday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.1 (1.2), demos/ppl_lpsol/ppl_lpsol.1
+	  (1.2), doc/ppl-config.1 (1.9): Updated.
+
+2008-10-23 Thursday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.404), demos/Makefile.am (1.13),
+	  demos/ppl_lcdd/Makefile.am (1.30), demos/ppl_lcdd/ppl_lcdd.1
+	  (1.1), demos/ppl_lcdd/ppl_lcdd_extra_man_text (1.1),
+	  demos/ppl_lpsol/Makefile.am (1.49), demos/ppl_lpsol/ppl_lpsol.1
+	  (1.1), demos/ppl_lpsol/ppl_lpsol_extra_man_text (1.1),
+	  devtools/generate_man_pages (1.2), doc/Makefile.am (1.91),
+	  doc/ppl_lcdd.1 (1.7), doc/ppl_lcdd_extra_man_text (1.4),
+	  doc/ppl_lpsol.1 (1.7), doc/ppl_lpsol_extra_man_text (1.4): The
+	  `ppl_lcdd' and `ppl_lpsol' programs have been made optional (but
+	  enabled by default) and subject to the `--enable-ppl_lcdd' and
+	  `--enable-ppl_lpsol' configure options, respectively.
+
+2008-10-23 Thursday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.87): Made sure the program con be
+	  compiled with -Wformat-security (and, for that matter, also
+	  -Wformat-nonliteral).
+
+2008-10-22 Wednesday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.32): Test further strengthened.
+
+2008-10-22 Wednesday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.31): Test strengthened to guard against
+	  what can easily happen on a bi-arch system.
+
+2008-10-22 Wednesday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.69): Comment improved.
+
+2008-10-22 Wednesday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.68): Revised one of the
+	  exception tests to allow for all possible exceptions that can
+	  occur, depending on the machine and configuration.
+
+2008-10-21 Tuesday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.30): Make sure the version of GMP as define
+	  by the GMP's header file matches the version reported by
+	  gmp_version().
+
+2008-10-21 Tuesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.85): GNU Prolog 1.3.1 needs
+	  a higher value for GLOBALSZ.
+
+2008-10-21 Tuesday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (1.11): Minimal changes to
+	  support GNU Prolog 1.3.1 (to be released soon).
+
+2008-10-21 Tuesday 12:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.67): Corrected special
+	  exception tests for Prolog systems (eg GNU Prolog) with bounded
+	  integers.
+
+2008-10-20 Monday 23:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.90): The configured Prolog manuals depend on
+	  generated file Prolog_configured_interface.dox.
+
+2008-10-20 Monday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.66): Revised the timeout
+	  test to ensure it is more consistent in its behavior for all
+	  configurations and Prolog systems.
+
+2008-10-20 Monday 19:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.177),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.12): Small
+	  correction and improvement to formatting.
+
+2008-10-20 Monday 17:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.87): Disabled the pl_check,
+	  clpq and clpq2 tests as they can throw overflow exception errors
+	  for certain configurations - and Ciao does not recognise these as
+	  overflow errors.
+
+2008-10-20 Monday 17:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.19): Completed changes in last commit.
+
+2008-10-20 Monday 16:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.18): Revised code for the ..._if_exact predicates.
+
+2008-10-20 Monday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc (1.12): Added a missing
+	  default switch case.
+
+2008-10-20 Monday 14:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.65): Corrected and
+	  improved the testing of the exceptions thrown by the C++
+	  interface.
+
+2008-10-20 Monday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/.cvsignore (1.1): Put under CVS control.
+
+2008-10-20 Monday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/.cvsignore (bounded_arithmetic.1): file .cvsignore was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-20 Monday 08:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_ci_prolog_manual (1.1): Script to generate
+	  the Doxygen source for the configuration-independent Prolog
+	  interface manual.
+
+2008-10-19 Sunday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.403): Version number bumped.
+
+2008-10-19 Sunday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.272): Added a list of things to do for PPL 0.10.1.
+
+2008-10-19 Sunday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.271), interfaces/OCaml/README.ocaml (1.5): README.ocaml
+	  revised.
+
+2008-10-19 Sunday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.39): Added a couple of blank spaces.
+
+2008-10-19 Sunday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.38), TODO (1.270): README.configure is now
+	  complete.
+
+2008-10-19 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.402): Usage summary improved.
+
+2008-10-19 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.37): Written the section on "Configuring for
+	  Debugging".
+
+2008-10-19 Sunday 16:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.223): Some improvements in the
+	  specification of syntactic GDs:   1) the generic ones are those
+	  that are supported (maybe minimally) by      all semantic GDs;
+	  the specific ones are not supported at all by      some semantic
+	  GDs;	 2) listed subclasses of generic GDs (constraints and
+	  congruences):      explained that each semantic GD "optimally
+	  supports" some of these      subclasses; for optimally supported
+	  subclasses, no exception is thrown	  and a best approximation
+	  semantics is obtained; for the non-optimally	    supported ones,
+	  exceptions or coarse approximations may be obtained.	  3) noted
+	  that the best approximation property applies to single
+	  constraints	    or congruences, not to their systems.
+
+	  Other changes:   - not all OK methods support the optional
+	  Boolean argument;   - improved explanation of conversion
+	  operators with a computational     complexity argument.
+
+2008-10-19 Sunday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.36): Added a forward reference.
+
+2008-10-19 Sunday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.26): Express gratitude to ESIEE, Thibaut Varene, and
+	  the PA-RISC Linux community.
+
+2008-10-19 Sunday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.25): One link added.
+
+2008-10-19 Sunday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.24): Express gratitude to the GCC Compile Farm
+	  Project, FSF France, and Laurent Guerby.
+
+2008-10-19 Sunday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.401): The header files of GLPK cannot be trusted:
+	  do check for the presence of declarations.
+
+2008-10-19 Sunday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.86): Previous commit completed.
+
+2008-10-19 Sunday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.85): Fixed the guard controlling
+	  the definition of glpk_message_interceptor().
+
+2008-10-19 Sunday 14:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.84): Make sure GLP_OFF is defined
+	  before using it.
+
+2008-10-19 Sunday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.cc (1.3), tests/ppl_test.cc (1.19): Do
+	  not rely on the definition of optional macros of <fenv.h>.
+
+2008-10-19 Sunday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.cc (bounded_arithmetic.1): file
+	  pwl_test.cc was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:22 +0000
+
+2008-10-19 Sunday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.400): Enable the Java interface only if jlong can
+	  contain data pointers.
+
+2008-10-19 Sunday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.52),
+	  ppl_java_common.inlines.hh (1.4): Improved the conversions
+	  between pointers and jlongs.
+
+2008-10-19 Sunday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.inlines.hh
+	  (bounded_arithmetic.1): file ppl_java_common.inlines.hh was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-10-19 Sunday 09:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.91): The
+	  get_represent pattern updated for all the domains to include both
+	  constraints and congruences.
+
+2008-10-19 Sunday 08:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/marked_pointers.hh (1.2): Bitmask made portable.
+
+2008-10-18 Saturday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.86), README.ciao (1.1):
+	  New file to explain which versions of Ciao Prolog are supported.
+
+2008-10-18 Saturday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/README.ciao (bounded_arithmetic.1): file
+	  README.ciao was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:32 +0000
+
+2008-10-18 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/README.interfaces (1.2): Obsolete file removed.
+
+2008-10-18 Saturday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.23): Use `"$(CXX)"' instead
+	  of `g++'.
+
+2008-10-18 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.hh (1.3), tests/ppl_test.hh (1.79):
+	  Define the NOISY and VERY_NOISY macros before they are used.
+	  Unused parameter warning avoided.
+
+2008-10-18 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/pwl_test.hh (bounded_arithmetic.1): file
+	  pwl_test.hh was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:22 +0000
+
+2008-10-18 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am (1.6): Must link with -lm for
+	  fetestexcept().
+
+2008-10-18 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am (bounded_arithmetic.1): file
+	  Makefile.am was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:22 +0000
+
+2008-10-18 Saturday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.19): Previous commit had the
+	  defined(__EDG__) and !defined(__EDG__) cases reversed: fixed now.
+
+2008-10-18 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.399): Blank line added for readability.
+
+2008-10-18 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.54): Improved and reorganized.
+
+2008-10-18 Saturday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.18): Use a couple of different friend
+	  declarations when the compiler is EDG-based.
+
+2008-10-18 Saturday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.95): Removed another useless
+	  variable definition.
+
+2008-10-18 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.94): Several FIXMEs resolved
+	  and removed.
+
+2008-10-18 Saturday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.93): Several useless variable
+	  definitions commented out.
+
+2008-10-18 Saturday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.59):
+	  Statement with no effect removed.
+
+2008-10-18 Saturday 13:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.4): Updated and improved.
+
+2008-10-18 Saturday 12:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.35): Added material to the section on
+	  "Configuring for Optimized Performance".
+
+2008-10-18 Saturday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.80): List
+	  xsb_prolog_generated_test.P in CLEANFILES.
+
+2008-10-18 Saturday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.22): Do not mention gmp.cma
+	  when (ocaml-)linking; rather, directly pass options -lmlgmp and
+	  -lmpfr to the underlying linker using -cclib.  This seems to
+	  solve an issue in some x86 systems (e.g., igor on tinderbox)
+	  whereby -dlopen was not working as expected, in that it links the
+	  installed ppl instead of the one in the build tree.
+
+2008-10-18 Saturday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (1.39): Work around a bug in the Intel C/C++
+	  compiler version 10.1.x.
+
+2008-10-17 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.34): Explained the use of the
+	  `--with-java=DIR' configure option.
+
+2008-10-17 Friday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.33): Explained the use of the
+	  `--enable-instantiations' configure option.
+
+2008-10-17 Friday 16:56  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.47): Added comment for future
+	  improvement.
+
+2008-10-17 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.32): Started a rewrite of the section on
+	  "Configuring the Language Interfaces".  Added new sections on
+	  "Configuring for Optimized Performance" and "Configuring for
+	  Debugging".
+
+2008-10-17 Friday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.398), src/Makefile.am (1.189): If the C++
+	  interface is not enabled, do not install <ppl.hh>.
+
+2008-10-17 Friday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.397): Configuring with the option
+	  `--enable-instantiations' (i.e., without specifying any
+	  instantiation) now prints a list of available instantiations.
+
+2008-10-17 Friday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int16_a (1.9),
+	  expected_pchk_int8_a (1.9): As in previous commit - some
+	  overflows that were expected do not occur now.
+
+2008-10-17 Friday 11:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int16 (1.9),
+	  expected_pchk_int32 (1.8), expected_pchk_int32_a (1.8),
+	  expected_pchk_int64_a (1.7), expected_pchk_int8 (1.9): Several
+	  overflows no longer occur.
+
+2008-10-16 Thursday 18:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.396): Reordered so that the system-dependent
+	  adjustments are done before the run-time tests.
+
+2008-10-16 Thursday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.15): Test strengthened to check
+	  whether fesetround() actually does something.
+
+2008-10-16 Thursday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.21): Little improvement to
+	  fpu_initialize_control_functions().
+
+2008-10-16 Thursday 12:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.10),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.11): Error in the
+	  configured dox file wrt the widening of weakly relational shapes
+	  fixed.
+
+2008-10-16 Thursday 08:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.64): Test for no timeout
+	  made simpler to try and ensure results are as predicted.  Added
+	  the Prolog system being tested in the error message.
+
+2008-10-16 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_exact_output.m4 (1.10),
+	  ac_cxx_float_exact_output.m4 (1.8),
+	  ac_cxx_long_double_exact_output.m4 (1.15): Typos fixed.
+
+2008-10-16 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_exact_output.m4 (bounded_arithmetic.1): file
+	  ac_cxx_double_exact_output.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-16 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float_exact_output.m4 (bounded_arithmetic.1): file
+	  ac_cxx_float_exact_output.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-16 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (bounded_arithmetic.1):
+	  file ac_cxx_long_double_exact_output.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-15 Wednesday 22:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.9),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.10),
+	  ppl_prolog_sysdep_dox (1.3), ppl_prolog_sysindep_dox (1.5): As in
+	  previous commit message - but with updated files.
+
+2008-10-15 Wednesday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.8),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.9),
+	  ppl_prolog_sysdep_dox (1.2), ppl_prolog_sysindep_dox (1.4): These
+	  files have been rewritten so as to generate
+	  Prolog_configured_interface.dox (with the command "make
+	  Prolog_configured_interface.dox" in the interfaces/Prolog
+	  directory) and the configured documentation for the Prolog
+	  interface.  With an appropriate script the same files will
+	  generate the Prolog_interface.dox and hence the fixed
+	  documentation for Prolog.
+
+2008-10-15 Wednesday 21:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.42): Predicate schema's reordered to maintain groups of
+	  predicates with similar semantics/behaviour.
+
+2008-10-15 Wednesday 21:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.63): Decrease the timeout
+	  expected for a timeout exception and increase the timeout when an
+	  exception is not predicted.  Unwanted comment removed.
+
+2008-10-15 Wednesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.arm (1.1), m4/ac_check_fpu_control.m4 (1.14): Adopted a
+	  compromise solution for the ARM: this allows to easily build
+	  binary distributions, yet allowing those building from sources to
+	  be in full control.
+
+2008-10-15 Wednesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.arm (bounded_arithmetic.1): file README.arm was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:19 +0000
+
+2008-10-15 Wednesday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.20): Fixed silly bug in
+	  fpu_initialize_control_functions().
+
+2008-10-15 Wednesday 18:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.222), interfaces-latex.sed (1.4): The
+	  Section names in the ps and pdf files for extrenal references are
+	  in italics using <EM> and </EM> commands.
+
+	  In definitions.dox, the section name for extrapolation operators
+	  for the powerset now	named Powerset Extrapolation Operators
+
+2008-10-15 Wednesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/interfaces-latex.sed (bounded_arithmetic.1): file
+	  interfaces-latex.sed was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-15 Wednesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.19): At initialization time, check
+	  whether fesetround() works as expected: if not, throw an
+	  std::logic_error exception.
+
+2008-10-15 Wednesday 18:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.176): Small
+	  improvements.
+
+2008-10-15 Wednesday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.13): Link with -lm.
+
+2008-10-15 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.12): Test strengthened to check the
+	  return value of fesetround().
+
+2008-10-15 Wednesday 13:16  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.70): Repaired build reverting
+	  temporarily correctness fix.
+
+2008-10-15 Wednesday 11:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.62): Fixme removed and
+	  commented code uncommented.
+
+2008-10-15 Wednesday 10:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.269): Item removed.
+
+2008-10-15 Wednesday 10:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.85),
+	  ppl_interface_generator_ciao_prolog_generated_test_pl.m4 (1.2):
+	  Revised to enable the generated tests.
+
+2008-10-15 Wednesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_ciao_prolog_generated_test_pl.m4 was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-10-15 Wednesday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_generated_test_pl.m4 was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-15 Wednesday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_generated_test_pl_code.m4 was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-15 Wednesday 10:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: pl_check.pl (1.61),
+	  ppl_interface_generator_prolog_generated_test_pl.m4 (1.2),
+	  ppl_interface_generator_prolog_generated_test_pl_code.m4 (1.9):
+	  The code for testing the timeout predicates revised; it avoids
+	  use of the deprecated predicates and is more robust with respect
+	  to changes in computation times.
+
+	  The generated test code also much improved and several bugs
+	  fixed.
+
+2008-10-14 Tuesday 23:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.31): Old stuff removed.
+
+2008-10-14 Tuesday 23:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.268): One item postponed.
+
+2008-10-14 Tuesday 15:25  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.69): Comparison are now done taking
+	  for granted C99 conformance.
+
+2008-10-14 Tuesday 15:24  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.46): Added missing assertions.
+
+2008-10-14 Tuesday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.59), tests/Makefile.am (1.21):
+	  Remove useless -I option from ocamlc commands.
+
+2008-10-14 Tuesday 11:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.20): Let the executable
+	  tests also depend on ppl_ocaml.cma.
+
+2008-10-14 Tuesday 11:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.58): Let ppl_ocaml.cma also
+	  depend on libppl_ocaml.a
+
+2008-10-13 Monday 18:57  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.97): Added const.
+
+2008-10-13 Monday 16:59  Abramo Bagnara
+
+	* src/: checked_float.inlines.hh (1.96), compiler.hh (1.16):
+	  Optimized and fixed correctness.
+
+2008-10-13 Monday 15:23  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.95): Fixed conversion.
+
+2008-10-13 Monday 15:14  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.94): Reverted previous change.
+
+2008-10-13 Monday 15:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.175): All external
+	  references are emphasized using italics.
+
+2008-10-13 Monday 14:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/randphull1.cc (1.16): Temporary workaround for
+	  those machines (such as the ARM, possibly others) where we cannot
+	  control the FPU.
+
+2008-10-13 Monday 14:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.12): Adjusted the euclidean
+	  distance for test01.
+
+2008-10-13 Monday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/propagateconstraints2.cc (bounded_arithmetic.1): file
+	  propagateconstraints2.cc was added on branch bounded_arithmetic
+	  on 2008-10-29 20:45:38 +0000
+
+2008-10-13 Monday 13:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.174): Removed unwanted
+	  </EM> in the widening of powersets documentation.
+
+2008-10-13 Monday 12:45  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.93): Added missing optimization.
+
+2008-10-13 Monday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.11): Restore tests with
+	  distances in the check_result() reset.
+
+2008-10-13 Monday 11:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.10): Disable tests while
+	  problems causing failures are investigated.
+
+2008-10-13 Monday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.9): check_result for all
+	  tests does not need parameters.
+
+2008-10-13 Monday 08:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.8): Tests 02 and 03 succeed
+	  for all integer types.
+
+2008-10-13 Monday 08:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.7): Restore test01 to
+	  testing the outcome of the test.  Added two further simple
+	  versions of this test; test02 showed the same bug indicated by
+	  test01 while with the reversed bounds the symmetrically
+	  equivalent test03 did not fail.
+
+2008-10-13 Monday 08:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.132): Fixed a bug in
+	  propagate_constraint_no_check().
+
+2008-10-12 Sunday 20:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.11): Do this test using the C
+	  language (the file installed in
+	  $prefix/include/c++/VERSION/fenv.h by recent versions of GCC
+	  causes problems).
+
+2008-10-12 Sunday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.395): The Ciao Prolog interface is not enabled by
+	  default.
+
+2008-10-12 Sunday 10:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.173): All \extref in
+	  the format \extref{<Ref>, <Name of section>}.
+
+2008-10-11 Saturday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.53): The PWL is now enabled by default
+	  also on Cygwin.
+
+2008-10-11 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.10): Fixed a copy-and-paste
+	  mistake.
+
+2008-10-11 Saturday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_biblio.sed (1.3): Changed so as to generate
+	  anchors based on the BibTeX keys, not on the labels obtained with
+	  bibtex2html (which depend on the bibliography style).
+
+2008-10-11 Saturday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_biblio.sed (bounded_arithmetic.1): file
+	  generate_dox_biblio.sed was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-11 Saturday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked.inlines.hh (1.45), checked_float.inlines.hh (1.92):
+	  Long source lines avoided.
+
+2008-10-11 Saturday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-none.inlines.hh (1.10): Fixed one bug and a few warnings.
+
+2008-10-11 Saturday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (1.9): Do not define round_fpu_dir()
+	  if !PPL_CAN_CONTROL_FPU.
+
+2008-10-11 Saturday 20:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.21): Use PPL_CAN_CONTROL_FPU to simplify the
+	  logic here.
+
+2008-10-11 Saturday 20:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_binary_format.m4 (1.17),
+	  ac_cxx_float_binary_format.m4 (1.14),
+	  ac_cxx_long_double_binary_format.m4 (1.21): If we cannot control
+	  the FPU, all floating point types are unsupported.
+
+2008-10-11 Saturday 18:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.89): Corrected a couple of file paths for
+	  configured-ocaml LaTeX manuals.
+
+2008-10-11 Saturday 18:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.221): Corrected a few bibliographic
+	  references.
+
+2008-10-11 Saturday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.9): Cater for systems that have
+	  <fenv.h> or <ieeefp.h> but fail to define FE_UPWARD or
+	  FE_DOWNWARD.
+
+2008-10-11 Saturday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.220): Bibliography updated.
+
+2008-10-11 Saturday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_biblio.sed (1.2): Fixed.
+
+2008-10-11 Saturday 13:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_biblio (1.1),
+	  devtools/generate_dox_biblio.sed (1.1), doc/bib2dox (1.4),
+	  doc/bib2html1.sed (1.2), doc/bib2html2.sed (1.4): New version of
+	  the tool to generate the Doxygen version of a bibliography in
+	  BibTeX format.  (New version of the sed script written by Abramo
+	  Bagnara).
+
+2008-10-11 Saturday 13:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_dox_biblio (bounded_arithmetic.1): file
+	  generate_dox_biblio was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-11 Saturday 11:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.88): Prefer $(srcdir) to @srcdir at .
+
+2008-10-11 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.repo (1.29), Watchdog/configure.repo (1.5): The
+	  configure.repo files do not solve the problem they were meant to
+	  solve.
+
+2008-10-11 Saturday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am (1.5): Avoid using $(builddir).
+
+2008-10-11 Saturday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: ppl-config.1 (1.8), ppl_lcdd.1 (1.6), ppl_lpsol.1 (1.6):
+	  Regenerated.
+
+2008-10-11 Saturday 10:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.87): Avoid annoying changes of directories
+	  when building the OCaml docs.
+
+2008-10-11 Saturday 09:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.6): Previous change done to
+	  identify bug, reverted.
+
+2008-10-11 Saturday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.394), configure.repo (1.28): The PWL is now
+	  enabled by default also on Cygwin.
+
+2008-10-10 Friday 22:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/propagateconstraints2.cc (1.5): Restore a proper test
+	  result.
+
+2008-10-10 Friday 22:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (1.2): This functionality is now provided by
+	  `generate_man_pages' in the `devtools' directory.
+
+2008-10-10 Friday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/generate_man_pages (1.1): Small script to generate the
+	  manpages in the `doc' directory.
+
+2008-10-10 Friday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/bump_copyright_years (1.1): A small script to update the
+	  copyright years.
+
+2008-10-10 Friday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/bump_copyright_years (bounded_arithmetic.1): file
+	  bump_copyright_years was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-10 Friday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/: cvs2cl.pl (1.1), update_ChangeLog (1.1): Machinery to
+	  automatically update the ChangeLog files.
+
+2008-10-10 Friday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/cvs2cl.pl (bounded_arithmetic.1): file cvs2cl.pl was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-10 Friday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* devtools/update_ChangeLog (bounded_arithmetic.1): file
+	  update_ChangeLog was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-10 Friday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.31), Watchdog/ChangeLog (1.20): Updated.
+
+2008-10-10 Friday 21:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.86): Modified to match recent changes in the
+	  OCaml interface files.
+
+2008-10-10 Friday 21:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.57),
+	  ppl_interface_generator_ocaml_ml.m4 (1.19),
+	  ppl_interface_generator_ocaml_mli.m4 (1.23), ppl_ocaml_globals.ml
+	  (1.14), ppl_ocaml_globals.mli (1.1), ppl_ocaml_types.ml (1.16):
+	  The file ppl_ocaml_types.ml is now merged to
+	  ppl_ocaml_globals.ml.  Added the corresponding .mli file (instead
+	  of generating it using m4; m4 now includes it).
+
+2008-10-10 Friday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.mli (bounded_arithmetic.1):
+	  file ppl_ocaml_globals.mli was added on branch bounded_arithmetic
+	  on 2008-10-29 20:45:30 +0000
+
+2008-10-10 Friday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.49), configure.ac (1.393), configure.repo (1.27),
+	  debian/Makefile.am (1.6), fedora/Makefile.am (1.4): The `fedora'
+	  and `debian' directories are no longer distributed.
+
+2008-10-10 Friday 21:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox (1.6): The link for OCaml
+	  generated documentation is now set to the index page.
+
+2008-10-10 Friday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.392), configure.repo (1.26): Version number
+	  bumped.
+
+2008-10-10 Friday 15:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.172): Typo fixed.
+
+2008-10-10 Friday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.171): Typos fixed.	The
+	  introduction to the manual revised.  Structure/contents list for
+	  the main section improved and moved to earlier in the document.
+	  Links are now there to all the sections and subsections.  Issues
+	  relating to compilation and installation have been moved, where
+	  necessary, to that section.  Note about the stack size for GNU
+	  Prolog added.
+
+2008-10-09 Thursday 21:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.391), configure.repo (1.25): n Fedora 9 systems,
+	  the default path to (OpenJDK) java is /usr/lib/jvm/java.
+
+2008-10-09 Thursday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_prolog_generated_test.pl (1.4):
+	  Previous change reverted: library(lists) may not be installed.
+
+2008-10-09 Thursday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_prolog_generated_test.pl
+	  (bounded_arithmetic.1): file swi_prolog_generated_test.pl was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-09 Thursday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.19): Optionally run the
+	  tests under Valgrind.
+
+2008-10-09 Thursday 15:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/namespaces.hh (1.16): Foreign language interface namespaces
+	  do not belong to the C++ interface group.
+
+2008-10-09 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_c_header.h (1.8),
+	  Java/parma_polyhedra_library/Parma_Polyhedra_Library.java (1.4),
+	  OCaml/OCaml_interface.dox (1.5), Prolog/Prolog_interface.dox
+	  (1.170): Added missing \defgroup Doxygen command for the foreign
+	  language interfaces.
+
+2008-10-09 Thursday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+	  (bounded_arithmetic.1): file Parma_Polyhedra_Library.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-09 Thursday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h (bounded_arithmetic.1): file
+	  ppl_c_header.h was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:26 +0000
+
+2008-10-09 Thursday 14:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/swi_prolog_generated_test.pl (1.3): Include
+	  the directive :-  use_module(library(lists), [member/2,
+	  append/2]).
+
+2008-10-09 Thursday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (1.59): Class Octagonal_Shape is in
+	  the C++ interface documentation group.
+
+2008-10-09 Thursday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.56), tests/Makefile.am (1.18):
+	  When compiling using ocamlc, set the stack limit to 1 MB.
+
+2008-10-09 Thursday 14:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.84): Test
+	  ppl_prolog_generated_test added to check-local.
+
+2008-10-09 Thursday 11:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.83): Include
+	  ppl_prolog_generated_test in check-local
+
+2008-10-09 Thursday 08:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.70): Include
+	  ppl_prolog_generated_test in check-local.
+
+2008-10-09 Thursday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/Makefile.am (1.34): Keep the expected
+	  files together in EXTRA_DIST.
+
+2008-10-09 Thursday 08:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/Makefile.am (1.33): Distribute
+	  expected_pgt
+
+2008-10-09 Thursday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.8): add_disjuncts test corrected.
+
+2008-10-08 Wednesday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: SWI/Makefile.am (1.102), XSB/Makefile.am
+	  (1.79):  ppl_prolog_generated_test now included in check-local
+
+2008-10-08 Wednesday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_check_ciao.m4 (1.4), ac_check_fpu_control.m4 (1.8),
+	  ac_check_gmp.m4 (1.29), ac_check_swi_prolog.m4 (1.17),
+	  ac_cxx_double_binary_format.m4 (1.16),
+	  ac_cxx_double_exact_output.m4 (1.9), ac_cxx_flexible_arrays.m4
+	  (1.16), ac_cxx_float_binary_format.m4 (1.13),
+	  ac_cxx_float_exact_output.m4 (1.7), ac_cxx_ieee_inexact_flag.m4
+	  (1.5), ac_cxx_limit_memory.m4 (1.2),
+	  ac_cxx_long_double_binary_format.m4 (1.20),
+	  ac_cxx_long_double_exact_output.m4 (1.14),
+	  ac_cxx_proper_long_double.m4 (1.5), ac_cxx_remainder_bug.m4
+	  (1.6), ppl.m4 (1.11), ppl_c.m4 (1.4): Contrary to what was
+	  recommended in
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2008-September/012736.html,
+	  returning from main is non-portable only to the most ancient C
+	  compilers.  On the other hand, finding a suitable declaration for
+	  exit() is more problematic.  (Thanks to Ralf Wildenhues for
+	  pointing out that.)
+
+2008-10-08 Wednesday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_ieee_inexact_flag.m4 (bounded_arithmetic.1): file
+	  ac_cxx_ieee_inexact_flag.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:34 +0000
+
+2008-10-08 Wednesday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_limit_memory.m4 (bounded_arithmetic.1): file
+	  ac_cxx_limit_memory.m4 was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:34 +0000
+
+2008-10-08 Wednesday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.100):
+	  ppl_prolog_generated_test now included in check-local
+
+2008-10-08 Wednesday 21:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.51),
+	  ppl_java_common.defs.hh (1.6), ppl_java_common.inlines.hh (1.3),
+	  ppl_java_globals.cc (1.25): Added missing / fixed existing
+	  documentation; also renamed a few functions.
+
+2008-10-08 Wednesday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.defs.hh
+	  (bounded_arithmetic.1): file ppl_java_common.defs.hh was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-10-08 Wednesday 19:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.93), devref.doxyconf-latex.in
+	  (1.32): Added files Variables_Set.* to the list of input files
+	  for devref manuals.
+
+2008-10-08 Wednesday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.101): In a long command,
+	  make sure no backslash is followed by something that could expand
+	  to the null string.
+
+2008-10-08 Wednesday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_types.ml (1.15): Comment improved.
+
+2008-10-08 Wednesday 16:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.169): A number of small
+	  improvements and typos fixed.
+
+2008-10-08 Wednesday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.22),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.19):
+	  Include the type declarations from ppl_ocaml_types.ml in the
+	  generated ppl_ocaml.mli.
+
+	  Fixed a bug in the generated tests file.
+
+2008-10-08 Wednesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.100): Conditionally run
+	  tests under Valgrind.
+
+2008-10-07 Tuesday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.390), configure.repo (1.24): Version number
+	  bumped.
+
+2008-10-07 Tuesday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.17): Two FIXMEs added.
+
+2008-10-07 Tuesday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: lib-link.m4 (1.5), lib-prefix.m4 (1.6): Temporarily reverted
+	  to the versions distributed with Gettext 0.14.6 (the new versions
+	  from gnulib do not work for us... we are probably misusing them).
+
+2008-10-07 Tuesday 16:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dox.m4 (1.7),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.8),
+	  ppl_prolog_sysindep_dox (1.3): Revert unintended changes.
+
+2008-10-07 Tuesday 16:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.67),
+	  ppl_interface_generator_prolog_dox.m4 (1.6),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.7): Uninteded
+	  change reverted.
+
+2008-10-07 Tuesday 16:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.168): More small
+	  improvements and bugs fixed.
+
+2008-10-07 Tuesday 15:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.167): Small improvement
+	  and a typo fixed.
+
+2008-10-07 Tuesday 15:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.219), src/Box.defs.hh (1.64): Avoid
+	  explicit mention of bounding boxes.  Change references to the
+	  section on intervals and boxes to "intervals".  All mention of
+	  covering boxes removed.
+
+2008-10-07 Tuesday 15:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/C_interface.dox (1.15): Change "who" to "which.
+
+2008-10-07 Tuesday 15:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.66), Prolog_interface.dox
+	  (1.166), ppl_interface_generator_prolog_dox.m4 (1.5),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.6),
+	  ppl_prolog_sysindep_dox (1.2): typo fixed.
+
+2008-10-07 Tuesday 15:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.165): Corrected a few
+	  bugs.
+
+2008-10-07 Tuesday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.58):
+	  Corrected error in template for add_disjunct.
+
+2008-10-07 Tuesday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.57):
+	  Corrected an error in the template code for get_disjunct; avoid
+	  useless copies in the template code for linear/approximate
+	  partitions.  Try to be more consistent with template indentation
+	  and spacing.
+
+2008-10-07 Tuesday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.164): A new _draft_
+	  version of the configure independent documentation for Prolog.
+
+2008-10-07 Tuesday 06:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.389), configure.repo (1.23): Version number
+	  bumped.
+
+2008-10-07 Tuesday 06:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.83): Fixed the guard controlling
+	  the definition of glpk_message_interceptor().
+
+2008-10-06 Monday 23:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: Makefile.am (1.85),
+	  devref-foreign-language-interface.doxyconf.in (1.5),
+	  interfaces-html.sed (1.3), interfaces-latex.sed (1.3),
+	  user-foreign-language-interface.doxyconf.in (1.5): Avoid warnings
+	  related to tag files when building latex manuals.
+
+2008-10-06 Monday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-foreign-language-interface.doxyconf.in
+	  (bounded_arithmetic.1): file
+	  devref-foreign-language-interface.doxyconf.in was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-06 Monday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/interfaces-html.sed (bounded_arithmetic.1): file
+	  interfaces-html.sed was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:24 +0000
+
+2008-10-06 Monday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-foreign-language-interface.doxyconf.in
+	  (bounded_arithmetic.1): file
+	  user-foreign-language-interface.doxyconf.in was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:24 +0000
+
+2008-10-06 Monday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.36), configure.ac (1.52),
+	  configure.repo (1.4), src/Makefile.am (1.16): Fixed the machinery
+	  used to conditionalize the build of the PWL.	The PWL is
+	  currently disabled under Cygwin because of the bug reported in
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2008-October/013156.html.
+
+2008-10-06 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/simple1.cc (bounded_arithmetic.1): file simple1.cc
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:22
+	  +0000
+
+2008-10-06 Monday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: configure.ac (1.51), configure.repo (1.3), Makefile.am
+	  (1.35), README (1.18), m4/Makefile.am (1.4),
+	  src/Doubly_Linked_Object.defs.hh (1.6),
+	  src/Doubly_Linked_Object.inlines.hh (1.6), src/EList.defs.hh
+	  (1.8), src/EList.inlines.hh (1.6), src/EList_Iterator.defs.hh
+	  (1.6), src/EList_Iterator.inlines.hh (1.6), src/Handler.defs.hh
+	  (1.7), src/Handler.inlines.hh (1.6), src/Makefile.am (1.15),
+	  src/Pending_Element.cc (1.7), src/Pending_Element.defs.hh (1.7),
+	  src/Pending_Element.inlines.hh (1.6), src/Pending_List.cc (1.7),
+	  src/Pending_List.defs.hh (1.7), src/Pending_List.inlines.hh
+	  (1.6), src/Time.cc (1.7), src/Time.defs.hh (1.7),
+	  src/Time.inlines.hh (1.6), src/Watchdog.cc (1.9),
+	  src/Watchdog.defs.hh (1.9), src/Watchdog.inlines.hh (1.6),
+	  src/pwl_header.hh (1.7), tests/Makefile.am (1.4),
+	  tests/pwl_test.cc (1.2), tests/pwl_test.hh (1.2),
+	  tests/simple1.cc (1.3), utils/Makefile.am (1.12): Copyright
+	  notices made consistent.
+
+2008-10-05 Sunday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-latex.in (1.4),
+	  Watchdog/doc/user.doxyconf-html.in (1.5),
+	  Watchdog/doc/user.doxyconf-latex.in (1.5),
+	  doc/devref.doxyconf-html.in (1.92), doc/devref.doxyconf-latex.in
+	  (1.31), doc/user-foreign-language-interface.doxyconf.in (1.4),
+	  doc/user.doxyconf-html.in (1.44), doc/user.doxyconf-latex.in
+	  (1.15): Updated for Doxygen 1.5.7.1.
+
+2008-10-05 Sunday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/Makefile.am (1.3): Spurious backslash removed.
+
+2008-10-05 Sunday 22:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/: Makefile.am (1.2), valgrind_suppressions (1.1):
+	  Distribute also pwl_test.hh and valgrind_suppressions.
+
+2008-10-05 Sunday 22:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/valgrind_suppressions (bounded_arithmetic.1): file
+	  valgrind_suppressions was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:22 +0000
+
+2008-10-05 Sunday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-html.in (1.4),
+	  doc/devref-foreign-language-interface.doxyconf.in (1.4): Updated
+	  for Doxygen 1.5.7.1.
+
+2008-10-05 Sunday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.388), configure.repo (1.22): Disable the PWL
+	  under Cygwin.  It is not yet clear whether Cygwin provides the
+	  services required in order to make it work.
+
+2008-10-05 Sunday 19:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.5): A few improvement to the pre/post class code: we now add a
+	  brief Doxygen comment with a link to the corresponding C++ class.
+	  The links work fine (in the HTML manuals, exploiting the tag
+	  file) as long as the C++ class names do not correspond to
+	  template instances.
+
+2008-10-05 Sunday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_java_classes_java.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-05 Sunday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.84): Added more ad-hoc Doxygen commands for
+	  the configured-java manuals: we need to exclude the fixed
+	  documentation in Fake_Class_for_Doxygen.java (since otherwise
+	  Doxygen gets confused by the repeated class definitions);
+	  moreover, for the user manuals, we list undocumented members too.
+
+2008-10-05 Sunday 18:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	  (1.4): Small correction.
+
+2008-10-05 Sunday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	  (bounded_arithmetic.1): file Fake_Class_for_Doxygen.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-05 Sunday 18:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/PPL_Object.java (1.5):
+	  Class PPL_Object should only concern developers.
+
+2008-10-05 Sunday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/PPL_Object.java
+	  (bounded_arithmetic.1): file PPL_Object.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-05 Sunday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.14): Corrected/improved
+	  documentation for powerset iterators.
+
+2008-10-05 Sunday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/simple1.cc (1.2): Added some debug output.
+
+2008-10-05 Sunday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.36), Prolog/Makefile.am (1.65),
+	  Prolog/Ciao/Makefile.am (1.84), Prolog/GNU/Makefile.am (1.82),
+	  Prolog/SICStus/Makefile.am (1.99), Prolog/SWI/Makefile.am (1.99),
+	  Prolog/XSB/Makefile.am (1.78), Prolog/YAP/Makefile.am (1.69),
+	  Prolog/tests/Makefile.am (1.32): No longer generating
+	  documentation file Prolog_interface.dox; rather, we now generate
+	  Prolog_configured_interface.dox.  Completed the simplification of
+	  conditional interface building: now the generation of Prolog
+	  interfaces too is based on the conditional definition of variable
+	  SUBDIRS.
+
+2008-10-05 Sunday 10:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.83): The Java devref manual is now also based
+	  on generated Java source files to be found in
+	  builddir/interfaces/Java/parma_polyhedra_library.  The Prolog
+	  user manaul now depends on the fixed Prolog_interface.dox file.
+
+2008-10-05 Sunday 10:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.163): Added fixed
+	  version for Prolog_interface.dox: this will no longer be
+	  generated by m4 scripts.
+
+2008-10-05 Sunday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/tests/.cvsignore (bounded_arithmetic.1): file .cvsignore
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:22
+	  +0000
+
+2008-10-05 Sunday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.34), configure.ac (1.50),
+	  configure.repo (1.2), tests/.cvsignore (1.1), tests/Makefile.am
+	  (1.1), tests/pwl_test.cc (1.1), tests/pwl_test.hh (1.1),
+	  tests/simple1.cc (1.1): Make some simple tests also with the
+	  Parma Watchdog Library.
+
+2008-10-05 Sunday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.188): Readability improvement.
+
+2008-10-04 Saturday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.387), configure.repo (1.21): Under Cygwin,
+	  SWI-Prolog does not work with foreign code.  We thus disable that
+	  interface on that architecture.
+
+2008-10-04 Saturday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_efli.cc (1.6): Removed spurious
+	  `inline' qualifiers.
+
+2008-10-04 Saturday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_efli.cc (bounded_arithmetic.1): file
+	  ciao_efli.cc was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:32 +0000
+
+2008-10-04 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_ciao.m4 (1.3): Adapted to the SVN HEAD version of
+	  Ciao.
+
+2008-10-04 Saturday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.130): The program memory1 cannot
+	  be used to test with Valgrind since it intentionally causes
+	  out-of-memory conditions.
+
+2008-10-04 Saturday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.30), TODO (1.267): One item dealt with.
+
+2008-10-04 Saturday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.repo (1.20), Watchdog/m4/ax_prefix_config_h.m4 (1.2),
+	  m4/ax_prefix_config_h.m4 (1.3), m4/lib-link.m4 (1.4),
+	  m4/lib-prefix.m4 (1.5): Updated.
+
+2008-10-04 Saturday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.43), config.sub (1.40), Watchdog/config.guess
+	  (1.27), Watchdog/config.sub (1.25): Updated.
+
+2008-10-04 Saturday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (1.12): Removed one of the
+	  initializations added in
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2006-June/009164.html
+
+2008-10-04 Saturday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.122), Octagonal_Shape.templates.hh
+	  (1.92), Polyhedron_nonpublic.cc (1.86), checked.cc (1.25): Use
+	  PPL_UNINITIALIZED instead of explicit initializations and
+	  free-style comments.
+
+2008-10-04 Saturday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (1.15): New macro PPL_UNINITIALIZED allows a
+	  better markup and handling of those variables that are declared
+	  uninitialized on purpose.
+
+2008-10-04 Saturday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc (1.13): Checks for compilers reordered.
+
+2008-10-04 Saturday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.16): Useless inclusion removed.
+
+2008-10-04 Saturday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ptr_Iterator.defs.hh (1.14): A friend declarations was
+	  (wrongly) included only conditionally: fixed.
+
+2008-10-04 Saturday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.18),
+	  Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.7): Added simple tests for the copy iterator procedures in the
+	  interfaces.
+
+2008-10-04 Saturday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.29): Removed spurious marker.
+
+2008-10-04 Saturday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_java_classes_cc_code.m4 was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-10-04 Saturday 10:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.28): In the templates for native implementations, try to
+	  follow a consistent indentation and line breaking style;
+	  moreover, prefer standard (and shorter) variable names, rather
+	  than variables names cluttered by (useless) m4-generated type
+	  information (this change produces 10-25% smaller cc files).
+
+2008-10-04 Saturday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ptr_Iterator.defs.hh (1.13): Changed `#ifdef' into `#if
+	  defined'.
+
+2008-10-04 Saturday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.24): Temporarily unused function
+	  commented out.
+
+2008-10-04 Saturday 08:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.27): Implemented a better way of ignoring the jclass argument
+	  in the native implementation of static methods, yet avoiding
+	  compiler warnings.
+
+2008-10-04 Saturday 07:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.386), configure.repo (1.19): Disable more
+	  warnings when using the Intel C/C++ compiler.
+
+2008-10-04 Saturday 03:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/ppl_c_test.h (1.2): Old-style declarations
+	  avoided.
+
+2008-10-04 Saturday 03:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/ppl_c_test.h (bounded_arithmetic.1): file
+	  ppl_c_test.h was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:27 +0000
+
+2008-10-04 Saturday 03:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.cc (1.4): Spurious semicolons
+	  removed.
+
+2008-10-04 Saturday 03:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.42): Variable shadowing
+	  avoided.
+
+2008-10-04 Saturday 03:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.inlines.hh (1.2): Avoided
+	  redefinition of default argument.
+
+2008-10-04 Saturday 02:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.39): Trailing commas removed.
+
+2008-10-04 Saturday 02:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.24): Avoid a couple of compiler warnings.
+
+2008-10-04 Saturday 01:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+	  (1.17), ppl_interface_generator_prolog_dox_code.m4 (1.5),
+	  ppl_interface_generator_prolog_hh_code.m4 (1.14),
+	  tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.6): Implemented schema ppl_new_ at CLASS@_iterator_from_iterator.
+
+2008-10-04 Saturday 01:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/: ppl_interface_generator_java_dox.m4 (1.4),
+	  ppl_interface_generator_java_dox_code.m4 (1.5),
+	  ppl_java_common_dox (1.6),
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.26),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.15), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.50): Implemented schema
+	  ppl_new_ at CLASS@_iterator_from_iterator.  Got rid of no longer
+	  used m4 files for the generation of documentation.
+
+2008-10-04 Saturday 01:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_java_classes_java_code.m4 was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-04 Saturday 01:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.54),
+	  C/ppl_interface_generator_c_h_code.m4 (1.47),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.56),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.50),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.41):
+	  Implemented schema ppl_new_ at CLASS@_iterator_from_iterator.
+
+2008-10-04 Saturday 01:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.41): Added schema ppl_new_ at CLASS@_iterator_from_iterator/2;
+	  renamed the schema for deleting iterators so as to follow common
+	  pattern.
+
+2008-10-04 Saturday 00:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.82): Make sure
+	  glpk_message_interceptor() is defined only when necessary.
+
+2008-10-03 Friday 23:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.385), configure.repo (1.18),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.10): Fixed the GNU
+	  Prolog interface.
+
+2008-10-03 Friday 23:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.40),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.53),
+	  C/ppl_interface_generator_c_h_code.m4 (1.46),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.10),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.25),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.14), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.55),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.49),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.40),
+	  OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.17),
+	  Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.16),
+	  Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.13):
+	  Procedure *drop_disjuncts has been added to all the interfaces.
+
+2008-10-03 Friday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (1.8): Disable test02() in case doubles
+	  are not supported.
+
+2008-10-03 Friday 22:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.18): Use raw_value() so that a comparison is
+	  always defined, even if doubles are not supported.
+
+2008-10-03 Friday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.121): Debugging code removed.
+
+2008-10-03 Friday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.384), configure.repo (1.17),
+	  m4/ac_cxx_double_binary_format.m4 (1.15),
+	  m4/ac_cxx_double_exact_output.m4 (1.8),
+	  m4/ac_cxx_float_binary_format.m4 (1.12),
+	  m4/ac_cxx_float_exact_output.m4 (1.6),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.19),
+	  m4/ac_cxx_long_double_exact_output.m4 (1.13): We currently miss a
+	  "Plan B" for the case where exact output is not available.  So,
+	  in these cases, we declare the corresponding floating point type
+	  as unsupported.
+
+2008-10-03 Friday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.91): Reference to the C99
+	  standard fixed.
+
+2008-10-03 Friday 20:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.383), configure.repo (1.16): Restored java in the
+	  set of interfaces enabled by default.
+
+2008-10-03 Friday 18:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/tests/: ppl_interface_generator_ocaml_test_ml.m4
+	  (1.3), ppl_interface_generator_ocaml_test_ml_code.m4 (1.16),
+	  ppl_ocaml_tests_common (1.6), test1.ml (1.15): The tests are now
+	  quiet unless the PPL_NOISY_TESTS or PPL_VERY_NOISY_TESTS
+	  environment variable is defined.
+
+2008-10-03 Friday 18:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.24),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.13), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.49): Ensure the code for drop_disjuncts is generated.  Code
+	  corrected and test added.  Draft code for a copy constructor for
+	  the iterators, but code from this is not generated yet.
+
+2008-10-03 Friday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (1.12): Expected text
+	  fixed.
+
+2008-10-03 Friday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (1.18): Floating point
+	  literal fixed.
+
+2008-10-03 Friday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.382), configure.repo (1.15),
+	  m4/ac_cxx_double_exact_output.m4 (1.7),
+	  m4/ac_cxx_float_exact_output.m4 (1.5),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.17),
+	  m4/ac_cxx_long_double_exact_output.m4 (1.11): Test also with long
+	  double denormalized numbers.
+
+2008-10-03 Friday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am (1.11): Added
+	  a couple of notes to recall that Fake_Class_for_Doxygen.java is
+	  only meant to be used when producing the documentation.
+
+2008-10-03 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am
+	  (bounded_arithmetic.1): file Makefile.am was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-03 Friday 16:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	  (1.3): More documentation improvements.
+
+2008-10-03 Friday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (1.16): Added missing 'L'
+	  suffix to floating point literal.
+
+2008-10-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_long_double_binary_format.m4 (1.15),
+	  ac_cxx_long_double_exact_output.m4 (1.10): Literals corrected.
+
+2008-10-03 Friday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (1.9): Expected text
+	  updated.
+
+2008-10-03 Friday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (1.14): Floating point
+	  literal fixed.
+
+2008-10-03 Friday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.381), configure.repo (1.14),
+	  m4/ac_cxx_double_binary_format.m4 (1.14),
+	  m4/ac_cxx_double_exact_output.m4 (1.6),
+	  m4/ac_cxx_float_binary_format.m4 (1.11),
+	  m4/ac_cxx_float_exact_output.m4 (1.4),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.13),
+	  m4/ac_cxx_long_double_exact_output.m4 (1.8), src/Float.defs.hh
+	  (1.32): Fixed several macro names.
+
+2008-10-03 Friday 15:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+	  (bounded_arithmetic.1): file MIP_Problem.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-03 Friday 15:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/: jni/ppl_java_globals.cc (1.24),
+	  parma_polyhedra_library/MIP_Problem.java (1.5): Added copy
+	  constructor, destructor and finalization to MIP_Problem.
+
+2008-10-03 Friday 14:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.23): Added code template for method drop_disjuncts.
+
+2008-10-03 Friday 14:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	  (1.2): Added further methods that should be documented in the
+	  configuration-independent manuals for the Java interface.
+
+2008-10-03 Friday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (1.7): Preparation to test
+	  also with long double denormalized numbers.
+
+2008-10-03 Friday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_binary_format.m4 (1.13),
+	  ac_cxx_double_exact_output.m4 (1.5): Test also with double
+	  denormalized numbers.
+
+2008-10-03 Friday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.81): Fixed copy-and-paste mistake.
+
+2008-10-03 Friday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+	  (1.4): Fixed indentation.
+
+2008-10-03 Friday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+	  (bounded_arithmetic.1): file Linear_Expression_Sum.java was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-03 Friday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_binary_format.m4 (1.12),
+	  ac_cxx_long_double_binary_format.m4 (1.12): Floating point
+	  literals fixed.
+
+2008-10-03 Friday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.273): Spurious `-lppl' removed from LDADD.
+
+2008-10-03 Friday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am (1.6): We now use the convenience
+	  library libppl_c_tests.a.  When GCC is used, we compile C files
+	  with -pedantic -std=c89 -Werror: this way it will be harder to
+	  inadvertently pollute ppl_c.h with non-standard stuff.
+
+2008-10-03 Friday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am (bounded_arithmetic.1): file
+	  Makefile.am was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:27 +0000
+
+2008-10-03 Friday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/cxxoutput.c (1.6): Include "ppl_c_test.h"
+	  instead of "ppl_test.h".
+
+2008-10-03 Friday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/cxxoutput.c (bounded_arithmetic.1): file
+	  cxxoutput.c was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:27 +0000
+
+2008-10-03 Friday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/: ppl_c_test.cc (1.1), ppl_c_test.h (1.1),
+	  ppl_test.h (1.2): Header file renamed and reimplemented.
+
+2008-10-03 Friday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/ppl_c_test.cc (bounded_arithmetic.1): file
+	  ppl_c_test.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:27 +0000
+
+2008-10-03 Friday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.h (1.3): Spurious semicolons
+	  removed.
+
+2008-10-03 Friday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.48): If we use GCC, compile with
+	  -pedantic -std=gnu89 -Werror.
+
+2008-10-03 Friday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.80): Conform to ISO C90 plus GNU
+	  extensions (because of the declaration of sigaction in
+	  <signal.h>).
+
+2008-10-03 Friday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.380), configure.repo (1.13): New AM_CONDITIONAL
+	  GCC allows to write conditionals in Makefile.am that depend on
+	  whether we are using GCC or another compiler.
+
+2008-10-03 Friday 09:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.379), configure.repo (1.12): Temporarily remove
+	  java from the list of default interfaces.
+
+2008-10-03 Friday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_exact_output.m4 (1.4),
+	  ac_cxx_float_exact_output.m4 (1.3),
+	  ac_cxx_long_double_exact_output.m4 (1.6): Use AC_DEFINE_UNQUOTED
+	  instead of AC_DEFINE.
+
+2008-10-03 Friday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_h.m4 (1.26),
+	  ppl_interface_generator_c_h_code.m4 (1.45): Avoid generating
+	  spurious semicolons.
+
+2008-10-03 Friday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/build_header.in (1.7): Generate C-style comments instead of
+	  C++-style ones.
+
+2008-10-03 Friday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_exact_output.m4 (1.3),
+	  ac_cxx_float_exact_output.m4 (1.2),
+	  ac_cxx_long_double_exact_output.m4 (1.5): Typos fixed.
+
+2008-10-02 Thursday 23:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.30): Updated.
+
+2008-10-02 Thursday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (1.4): Expected value
+	  fixed.
+
+2008-10-02 Thursday 22:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (1.3): Expected texts
+	  corrected.
+
+2008-10-02 Thursday 22:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_exact_output.m4 (1.2): Missing parenthesis
+	  added.
+
+2008-10-02 Thursday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_exact_output.m4 (1.2): Expected text fixed.
+
+2008-10-02 Thursday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.378), configure.repo (1.11),
+	  m4/ac_cxx_double_binary_format.m4 (1.11),
+	  m4/ac_cxx_float_binary_format.m4 (1.10),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.11), src/Float.defs.hh
+	  (1.31): Detect whether the C++ run-time system supports the exact
+	  output of floating point types.
+
+2008-10-02 Thursday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_exact_output.m4 (1.1),
+	  ac_cxx_float_exact_output.m4 (1.1),
+	  ac_cxx_long_double_exact_output.m4 (1.1): New functions to test
+	  whether C++ provides exact output for the floating point types.
+
+2008-10-02 Thursday 21:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.35), C/Makefile.am (1.62),
+	  Java/Makefile.am (1.24), Java/jni/Makefile.am (1.28),
+	  Java/parma_polyhedra_library/Makefile.am (1.10),
+	  Java/tests/Makefile.am (1.26), OCaml/Makefile.am (1.55),
+	  OCaml/tests/Makefile.am (1.17): Simplified the handling of
+	  conditionally built foreign language interfaces by defining the
+	  SUBDIRS variable conditionally.  Change is implemented for the C,
+	  OCaml and Java interfaces; will be implemented in Prolog as soon
+	  as Prolog_interface.dox will become a fixed source file (rather
+	  than being generated on the fly by m4).
+
+2008-10-02 Thursday 21:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.13): Widenings moved to the
+	  sections listing ad hoc polyhedron functions.
+
+2008-10-02 Thursday 21:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (1.7): Previous commit
+	  was wrong: tests 5 and 9 will overflow on 8 bit coefficients,
+	  *if* assertions are turned on.
+
+2008-10-02 Thursday 18:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.82): The generation of the Java interface
+	  manuals is now based (among others) on the fixed file
+	  Fake_Class_for_Doxygen.java; we no longer use the genrated file
+	  Java_interface.dox.
+
+2008-10-02 Thursday 18:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
+	  (1.1): Put under CVS control. This will substitute
+	  Java_interface.dox (currently still generated by m4).
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Coefficient.java
+	  (bounded_arithmetic.1): file Coefficient.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Congruence_System.java
+	  (bounded_arithmetic.1): file Congruence_System.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Constraint.java
+	  (bounded_arithmetic.1): file Constraint.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Constraint_System.java
+	  (bounded_arithmetic.1): file Constraint_System.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
+	  (bounded_arithmetic.1): file Control_Parameter_Name.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
+	  (bounded_arithmetic.1): file Control_Parameter_Value.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+	  (bounded_arithmetic.1): file Degenerate_Element.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	  (bounded_arithmetic.1): file Domain_Error_Exception.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Generator.java
+	  (bounded_arithmetic.1): file Generator.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Generator_Type.java
+	  (bounded_arithmetic.1): file Generator_Type.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+	  (bounded_arithmetic.1): file Grid_Generator.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+	  (bounded_arithmetic.1): file Grid_Generator_System.java was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+	  (bounded_arithmetic.1): file Grid_Generator_Type.java was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+	  (bounded_arithmetic.1): file Invalid_Argument_Exception.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	  (bounded_arithmetic.1): file Length_Error_Exception.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+	  (bounded_arithmetic.1): file Linear_Expression.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+	  (bounded_arithmetic.1): file Linear_Expression_Coefficient.java
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:28
+	  +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+	  (bounded_arithmetic.1): file Linear_Expression_Difference.java
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:28
+	  +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+	  (bounded_arithmetic.1): file Linear_Expression_Times.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+	  (bounded_arithmetic.1): file Linear_Expression_Unary_Minus.java
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:28
+	  +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+	  (bounded_arithmetic.1): file Linear_Expression_Variable.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+	  (bounded_arithmetic.1): file Logic_Error_Exception.java was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+	  (bounded_arithmetic.1): file Optimization_Mode.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+	  (bounded_arithmetic.1): file Overflow_Error_Exception.java was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Pair.java
+	  (bounded_arithmetic.1): file Pair.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Partial_Function.java
+	  (bounded_arithmetic.1): file Partial_Function.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+	  (bounded_arithmetic.1): file Poly_Con_Relation.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+	  (bounded_arithmetic.1): file Poly_Gen_Relation.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+	  (bounded_arithmetic.1): file Relation_Symbol.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/: By_Reference.java
+	  (1.3), Coefficient.java (1.3), Congruence_System.java (1.3),
+	  Constraint.java (1.3), Constraint_System.java (1.3),
+	  Control_Parameter_Name.java (1.2), Control_Parameter_Value.java
+	  (1.2), Degenerate_Element.java (1.3), Domain_Error_Exception.java
+	  (1.3), Generator.java (1.3), Generator_Type.java (1.3),
+	  Grid_Generator.java (1.3), Grid_Generator_System.java (1.3),
+	  Grid_Generator_Type.java (1.3), Invalid_Argument_Exception.java
+	  (1.3), Length_Error_Exception.java (1.3), Linear_Expression.java
+	  (1.3), Linear_Expression_Coefficient.java (1.3),
+	  Linear_Expression_Difference.java (1.3),
+	  Linear_Expression_Sum.java (1.3), Linear_Expression_Times.java
+	  (1.3), Linear_Expression_Unary_Minus.java (1.3),
+	  Linear_Expression_Variable.java (1.3), Logic_Error_Exception.java
+	  (1.3), MIP_Problem.java (1.4), Optimization_Mode.java (1.3),
+	  Overflow_Error_Exception.java (1.3), PPL_Object.java (1.4),
+	  Pair.java (1.3), Parma_Polyhedra_Library.java (1.3),
+	  Partial_Function.java (1.3), Poly_Con_Relation.java (1.3),
+	  Poly_Gen_Relation.java (1.3), Relation_Symbol.java (1.3): Several
+	  improvements to the Doxygen documentation.
+
+2008-10-02 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/By_Reference.java
+	  (bounded_arithmetic.1): file By_Reference.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-10-02 Thursday 18:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.17): Fixed a bug whereby (besides
+	  not being Valgrind-clean) we were violating the API of GMP.
+
+2008-10-02 Thursday 18:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
+	  (1.2): Formatting improved.
+
+2008-10-02 Thursday 16:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.120): Temporarily added debugging
+	  code to the closure method.
+
+2008-10-02 Thursday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+	  (1.15), ppl_prolog_common.cc (1.11), ppl_prolog_common.defs.hh
+	  (1.10), ppl_prolog_common.inlines.hh (1.2): New macro
+	  NOISY_PROLOG_TRACK_ALLOCATION allows to conditionally track
+	  allocation (as PROLOG_TRACK_ALLOCATION), but printing allocation
+	  and deallocation messages on std::cerr (differently from
+	  PROLOG_TRACK_ALLOCATION).
+
+	  Class PFunc renamed Partial_Function.
+
+2008-10-02 Thursday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Ask_Tell/Makefile.am (1.7), BD_Shape/Makefile.am (1.80),
+	  Box/Makefile.am (1.74), Grid/Makefile.am (1.73),
+	  MIP_Problem/Makefile.am (1.12), Octagonal_Shape/Makefile.am
+	  (1.34), Partially_Reduced_Product/Makefile.am (1.6),
+	  Polyhedron/Makefile.am (1.129), Powerset/Makefile.am (1.6): Use
+	  `$(VALGRIND)' instead of `valgrind' directly.
+
+2008-10-02 Thursday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.377), configure.repo (1.10), tests/Makefile.am
+	  (1.272), tests/valgrind_suppressions (1.6),
+	  tests/Ask_Tell/Makefile.am (1.6), tests/BD_Shape/Makefile.am
+	  (1.79), tests/Box/Makefile.am (1.73), tests/Grid/Makefile.am
+	  (1.72), tests/MIP_Problem/Makefile.am (1.11),
+	  tests/Octagonal_Shape/Makefile.am (1.33),
+	  tests/Partially_Reduced_Product/Makefile.am (1.5),
+	  tests/Polyhedron/Makefile.am (1.128), tests/Powerset/Makefile.am
+	  (1.5): New configure option --enable-valgrind-tests causes (some)
+	  library tests to be run under Valgrind.
+
+2008-10-02 Thursday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/valgrind_suppressions (bounded_arithmetic.1): file
+	  valgrind_suppressions was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:37 +0000
+
+2008-10-02 Thursday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.17),
+	  MIP_Problem_test1.java (1.3), Makefile.am (1.25),
+	  NNC_Polyhedron_test1.java (1.4), PPL_Test.java (1.1),
+	  Parma_Polyhedra_Library_test1.java (1.2), Test_Executor.java
+	  (1.3), ppl_interface_generator_java_test_java.m4 (1.20),
+	  ppl_interface_generator_java_test_java_code.m4 (1.48),
+	  ppl_java_tests_common (1.17): Each test only outputs the results
+	  of the subtests if the environment variable PPL_NOISY_TESTS or
+	  PPL_VERY_NOISY_TESTS is defined.
+
+2008-10-02 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/MIP_Problem_test1.java
+	  (bounded_arithmetic.1): file MIP_Problem_test1.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:29 +0000
+
+2008-10-02 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/PPL_Test.java (bounded_arithmetic.1): file
+	  PPL_Test.java was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:29 +0000
+
+2008-10-02 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Parma_Polyhedra_Library_test1.java
+	  (bounded_arithmetic.1): file Parma_Polyhedra_Library_test1.java
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:29
+	  +0000
+
+2008-10-02 Thursday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: Makefile.am (1.31), pl_grid_check.pl
+	  (1.12): Removed pl_grid_check,pl as it is not being used or
+	  maintained.
+
+2008-10-02 Thursday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.71), addconstraints1.cc (1.20),
+	  addgenerators1.cc (1.18), approximatepartition1.cc (1.5),
+	  generator1.cc (1.22), partition1.cc (1.8), removespacedims2.cc
+	  (1.17): Removed useless commented out tests that were mainly
+	  testing methods that were private.  Removed also some other
+	  commented out code in tests.	Tests renumbered to be consecutive.
+
+2008-10-02 Thursday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.60): Removed tests for
+	  exceptions for non-existent predicates.  Modified the exception
+	  testing so as to check for the kind of exception that is thrown.
+
+2008-10-02 Thursday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/ppl_ocaml_tests_common (1.5): Several
+	  improvements.
+
+2008-10-02 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset2.cc (1.2): Comments fixed.
+	  Commented-out code removed.
+
+2008-10-02 Thursday 08:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc (1.10): More commented-out
+	  code removed.
+
+2008-10-02 Thursday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.defs.hh (1.9): Commented-out
+	  code removed.
+
+2008-10-02 Thursday 07:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog_common.cc (1.9),
+	  ppl_prolog_common.defs.hh (1.8): PROLOG_TRACK_ALLOCATION revived.
+
+2008-10-02 Thursday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: pl_check.pl (1.59), pl_grid_check.pl
+	  (1.11): Typos fixed.
+
+2008-10-02 Thursday 06:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.119), Octagonal_Shape.templates.hh
+	  (1.91): Fixed two instances where a TEMP_INTEGER was used
+	  uninitialized.
+
+2008-10-01 Wednesday 22:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.defs.hh (1.5): Obsolete FIXME
+	  removed.
+
+2008-10-01 Wednesday 22:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_classes_cc_code.m4 (1.22),
+	  ppl_java_common.cc (1.50), ppl_java_common.defs.hh (1.4),
+	  ppl_java_globals.cc (1.23): Renamed build_linear_expression() as
+	  build_cxx_linear_expression().
+
+2008-10-01 Wednesday 21:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.30): Modified test03 so as to
+	  systematically ignore overflow errors; after this change, the
+	  test is meant to always succeed.
+
+2008-10-01 Wednesday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_classes_cc_code.m4 (1.21),
+	  ppl_java_common.cc (1.49), ppl_java_common.defs.hh (1.3),
+	  ppl_java_globals.cc (1.22): Begun fixing names and comments.
+
+2008-10-01 Wednesday 21:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (1.6): Due to the recent
+	  change to simplify_using_context implementation, tests 05 and 09
+	  no longer overflow when using 8 bit coefficients.
+
+2008-10-01 Wednesday 20:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml_globals.ml (1.13),
+	  ppl_ocaml_types.ml (1.14): Two FIXMEs resolved.
+
+2008-10-01 Wednesday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc (1.6): Unused exception
+	  throwers removed.
+
+2008-10-01 Wednesday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_common.cc (bounded_arithmetic.1): file
+	  ppl_ocaml_common.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:30 +0000
+
+2008-10-01 Wednesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c_implementation_common.inlines.hh (1.4),
+	  OCaml/ppl_ocaml_common.cc (1.5): Be consistent concerning
+	  reinterpret_mpz_class().
+
+2008-10-01 Wednesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.inlines.hh
+	  (bounded_arithmetic.1): file
+	  ppl_c_implementation_common.inlines.hh was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-10-01 Wednesday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.83): Revised the diff
+	  command for the generated test to use the relevant files.
+
+2008-10-01 Wednesday 15:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.10):
+	  Improved formatting of the generated file ppl_xsb.H
+
+2008-10-01 Wednesday 15:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml.m4 (1.18),
+	  ppl_interface_generator_ocaml_mli.m4 (1.21): Formatting
+	  improvements to the generated files.
+
+2008-10-01 Wednesday 14:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/:
+	  ppl_interface_generator_prolog_procedure_generators.m4 (1.6),
+	  Ciao/ppl_interface_generator_ciao_pl.m4 (1.9): Fixed some
+	  formatting bugs.
+
+2008-10-01 Wednesday 14:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_h.m4 (1.25),
+	  ppl_interface_generator_c_hh_files.m4 (1.9): Formatting of
+	  generated files improved.
+
+2008-10-01 Wednesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_hh_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_c_hh_files.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-10-01 Wednesday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ciao_pl_check.pl (1.30): Added some
+	  missing predicates to the list.
+
+2008-10-01 Wednesday 12:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.40): Added explanations for test macros
+	  DO_TEST_MAY_OVERFLOW_IF_INEXACT and
+	  DO_TEST_F<XXX>_MAY_OVERFLOW_IF_INEXACT.
+
+2008-10-01 Wednesday 12:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.81): Removed unwanted
+	  copying/removing of files in code for executing the generated
+	  tests.
+
+2008-10-01 Wednesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/print_to_buffer.h (1.2): Documentation
+	  updated.
+
+2008-10-01 Wednesday 11:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.80): Further revisions - to
+	  the code for the generated tests.
+
+2008-10-01 Wednesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pgt (bounded_arithmetic.1): file
+	  expected_pgt was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:33 +0000
+
+2008-10-01 Wednesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_prolog_generated_test.pl
+	  (bounded_arithmetic.1): file yap_prolog_generated_test.pl was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-10-01 Wednesday 11:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.79),
+	  GNU/gnu_prolog_generated_test.pl (1.1), SICStus/Makefile.am
+	  (1.98), SWI/Makefile.am (1.98), SWI/swi_prolog_generated_test.pl
+	  (1.2), XSB/Makefile.am (1.77), YAP/Makefile.am (1.68),
+	  YAP/yap_prolog_generated_test.pl (1.1), tests/expected_pgt (1.1),
+	  tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.5): Revised the code for running the generated tests.  The
+	  expected result (OK) is in expected_pgt.  Some coefficients in
+	  the generated tests have been simplified to avoid unintended
+	  overflows.
+
+2008-10-01 Wednesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gnu_prolog_generated_test.pl
+	  (bounded_arithmetic.1): file gnu_prolog_generated_test.pl was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-10-01 Wednesday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.29): test02 will not overflow if
+	  using exact BD instances; test03 will overflow on 8bit
+	  configurations when using exact BD instances.
+
+2008-09-30 Tuesday 21:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.41): Minor improvements to
+	  the simplify_using_context method: we now handle ad hoc the
+	  frequent case when the context is a singleton powerset.
+
+2008-09-30 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.28): test02() and test03() may
+	  overflow also with 32 bits, if inexact coefficients are used.
+
+2008-09-30 Tuesday 20:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/stdiobuf.defs.hh (1.3): Documented.
+
+2008-09-30 Tuesday 20:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/stdiobuf.defs.hh (bounded_arithmetic.1): file
+	  stdiobuf.defs.hh was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 19:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.91), devref.doxyconf-latex.in
+	  (1.30): Added stdiobuf* files to Doxygen INPUT variable for
+	  devref documentation.
+
+2008-09-30 Tuesday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.266): Typo fixed.
+
+2008-09-30 Tuesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.defs.hh (1.7): Use the
+	  new system for all the I/O functions of the C interface.
+
+2008-09-30 Tuesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.defs.hh
+	  (bounded_arithmetic.1): file ppl_c_implementation_common.defs.hh
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:26
+	  +0000
+
+2008-09-30 Tuesday 18:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.73): In the ascii dump/load methods, do
+	  also deal with private fields `initialized' and `pricing'.
+
+2008-09-30 Tuesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: stdiobuf.cc (1.2), stdiobuf.defs.hh (1.2),
+	  stdiobuf.inlines.hh (1.2): Interface separated from
+	  implementation.
+
+2008-09-30 Tuesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/stdiobuf.cc (bounded_arithmetic.1): file stdiobuf.cc was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/stdiobuf.inlines.hh (bounded_arithmetic.1): file
+	  stdiobuf.inlines.hh was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.defs.hh (1.6),
+	  src/Makefile.am (1.187), src/stdiobuf.cc (1.1),
+	  src/stdiobuf.defs.hh (1.1), src/stdiobuf.inlines.hh (1.1),
+	  src/stdiobuf.types.hh (1.1): New standard solution for the
+	  ppl_*_ascii_load() functions in the C interface.  (The stdiobuf
+	  class has been implemented by Abramo Bagnara.)
+
+2008-09-30 Tuesday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/stdiobuf.types.hh (bounded_arithmetic.1): file
+	  stdiobuf.types.hh was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:36 +0000
+
+2008-09-30 Tuesday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README.gprolog (1.4): Revised the section
+	  on configuring the PPL for building the GNU Prolog interface.
+
+2008-09-30 Tuesday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.27): Invoke test02() and test03()
+	  with DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT.
+
+2008-09-30 Tuesday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, Determinate.inlines.hh, Makefile.am,
+	  Partially_Reduced_Product.defs.hh,
+	  Partially_Reduced_Product.templates.hh, Powerset.defs.hh,
+	  Powerset.templates.hh, Variable.cc, Variable.defs.hh,
+	  Variable.templates.hh
+	  (generalized_streams.[2,2,2,2,2,2,2,1,2,1]): Templatization
+	  continued.
+
+2008-09-30 Tuesday 12:56  Abramo Bagnara
+
+	* src/: Linear_Row.cc, MIP_Problem.cc, Ph_Status.cc,
+	  Poly_Con_Relation.cc, Poly_Gen_Relation.cc, Polyhedron_public.cc,
+	  Row.cc, Variables_Set.cc (generalized_streams.[1,1,1,1,1,1,1,1]):
+	  Missing templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 12:48  Abramo Bagnara
+
+	* src/: Linear_System.cc, Matrix.cc (generalized_streams.[1,1]):
+	  Missing templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 12:43  Abramo Bagnara
+
+	* src/Interval.defs.hh (generalized_streams.3): Added explicit
+	  cast.
+
+2008-09-30 Tuesday 12:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: SICStus/Makefile.am (1.97), SWI/Makefile.am
+	  (1.97), XSB/Makefile.am (1.76): the copying and removing of
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl is made
+	  conditional on whether or not the build is in the source
+	  directory.
+
+2008-09-30 Tuesday 12:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.defs.hh, Interval.inlines.hh,
+	  Interval.templates.hh (generalized_streams.[2,2,2,2]): Fixed more
+	  template parameter lists.
+
+2008-09-30 Tuesday 12:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh, BD_Shape.templates.hh, Box.defs.hh,
+	  Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Checked_Number.templates.hh, DB_Matrix.defs.hh,
+	  DB_Matrix.templates.hh, Interval_Info.defs.hh,
+	  Interval_Restriction.defs.hh, OR_Matrix.defs.hh,
+	  OR_Matrix.templates.hh, Octagonal_Shape.defs.hh,
+	  Octagonal_Shape.templates.hh, checked_ext.inlines.hh
+	  (generalized_streams.[2,2,2,2,2,2,2,2,2,2,2,3,2,2,2]): Fixed
+	  several template parameter lists.
+
+2008-09-30 Tuesday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (generalized_streams.2): Template
+	  parameters lists reordered.
+
+2008-09-30 Tuesday 12:12  Abramo Bagnara
+
+	* src/: Any_Pointset.defs.hh, Ask_Tell.defs.hh,
+	  Ask_Tell.inlines.hh, Ask_Tell.templates.hh, BDS_Status.idefs.hh,
+	  BDS_Status.inlines.hh, BD_Shape.defs.hh, BD_Shape.inlines.hh,
+	  BD_Shape.templates.hh, Bit_Matrix.cc, Bit_Matrix.defs.hh,
+	  Bit_Row.defs.hh, Box.defs.hh, Box.templates.hh,
+	  Box_Status.idefs.hh, Box_Status.inlines.hh,
+	  Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Checked_Number.templates.hh, Coefficient.defs.hh, Congruence.cc,
+	  Congruence.defs.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Constraint.cc, Constraint.defs.hh,
+	  Constraint_System.cc, Constraint_System.defs.hh,
+	  DB_Matrix.defs.hh, DB_Matrix.inlines.hh, DB_Matrix.templates.hh,
+	  DB_Row.inlines.hh, Determinate.defs.hh, Determinate.inlines.hh,
+	  Generator.cc, Generator.defs.hh, Generator.inlines.hh,
+	  Generator_System.cc, Generator_System.defs.hh, Grid.defs.hh,
+	  Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Status.cc, Grid_Status.idefs.hh, Grid_public.cc, checked.cc,
+	  checked_ext.defs.hh, checked_ext.inlines.hh
+	  (generalized_streams.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  More templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh, Interval.defs.hh, Interval.inlines.hh,
+	  Interval.templates.hh, Interval_Info.defs.hh,
+	  Interval_Info.inlines.hh, Interval_Restriction.defs.hh,
+	  Linear_Row.defs.hh, Linear_System.defs.hh, MIP_Problem.defs.hh,
+	  Matrix.defs.hh, OR_Matrix.defs.hh, OR_Matrix.templates.hh,
+	  Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh,
+	  Og_Status.idefs.hh, Og_Status.inlines.hh,
+	  Partially_Reduced_Product.defs.hh,
+	  Partially_Reduced_Product.inlines.hh,
+	  Partially_Reduced_Product.templates.hh, Ph_Status.idefs.hh,
+	  Pointset_Ask_Tell.defs.hh, Pointset_Ask_Tell.templates.hh,
+	  Pointset_Powerset.defs.hh, Pointset_Powerset.templates.hh,
+	  Poly_Con_Relation.defs.hh, Poly_Gen_Relation.defs.hh,
+	  Polyhedron.defs.hh, Powerset.defs.hh, Powerset.templates.hh,
+	  Row.defs.hh, Variable.defs.hh, Variables_Set.defs.hh
+	  (generalized_streams.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  More templatization of the I/O functions and methods.
+
+2008-09-30 Tuesday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh, Linear_Expression.cc,
+	  Linear_Expression.defs.hh, Linear_Expression.inlines.hh,
+	  Linear_Expression.templates.hh, Makefile.am, globals.defs.hh
+	  (generalized_streams.[1,1,1,1,1,1,1]): Templatization of input
+	  and output methods started.
+
+2008-09-30 Tuesday 11:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: Makefile.am (1.24),
+	  Parma_Polyhedra_Library_test1.java (1.1): Added tests for the
+	  Parma Polyhedra Library methods.
+
+2008-09-30 Tuesday 11:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/README.gprolog (1.3): Added a (draft) note
+	  on configuring for the GNU Prolog interface.
+
+2008-09-30 Tuesday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.17): On the Itanium, this test
+	  fails because of the bug reported in //
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2008-September/012943.html
+
+2008-09-30 Tuesday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.26): Expected results for test02()
+	  and test03() fixed.
+
+2008-09-30 Tuesday 08:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.39),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.12): Re-enable the approximate_partition method.
+
+	  Correct the m4 generating code for linear_partition and
+	  approximate_partition so that the method is only generated when
+	  the appropriate powerset domain is in the instantiations..
+
+2008-09-30 Tuesday 08:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/MIP_Problem_test1.java (1.2): Comment
+	  corrected.
+
+2008-09-30 Tuesday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.25): Comments improved.
+
+2008-09-30 Tuesday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.19): Missing #else's added.
+
+2008-09-30 Tuesday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am (1.5): Fixed AM_CPPFLAGS.
+
+2008-09-30 Tuesday 00:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.38): Commented out line
+	  ppl_ at CLASS@_approximate_ at PARTITION@/5  +grid, It was breaking the
+	  buid in the Java interface, since it requires that
+	  Pointset_Powerset_Grid is enabled too.
+
+2008-09-29 Monday 23:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (1.7): Corrected expected
+	  result.
+
+2008-09-29 Monday 23:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (1.8): Corrected
+	  knwon result for test03.
+
+2008-09-29 Monday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am (1.4): Unused definition commented
+	  out.
+
+2008-09-29 Monday 22:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/Makefile.am (1.3): Trailing backslash removed.
+
+2008-09-29 Monday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/: Makefile.am (1.2), cxxoutput.c (1.5),
+	  ppl_test.h (1.1): Adde ppl_test.h, now only providing some
+	  facilities to control the noisiness of tests.
+
+2008-09-29 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.78): Include <cstdlib> for getenv().
+
+2008-09-29 Monday 22:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.20),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.11), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.47): Updated the partition method headers and tests so that
+	  the schema procedure name and code use the new pattern to match
+	  that in the procedure schema list.
+
+2008-09-29 Monday 22:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.48),
+	  jni/ppl_java_globals.cc (1.21), tests/MIP_Problem_test1.java
+	  (1.1), tests/Makefile.am (1.23): Added tests for the MIP_Problem
+	  class and methods.
+
+	  Corrected some bugs in the same class.
+
+2008-09-29 Monday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.defs.hh (1.5),
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.19), interfaces/Java/jni/ppl_java_common.cc (1.47),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.20),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.54),
+	  interfaces/Prolog/ppl_prolog_common.cc (1.8),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.7),
+	  interfaces/Prolog/Ciao/ciao_efli.cc (1.5),
+	  interfaces/Prolog/SICStus/sicstus_efli.cc (1.4),
+	  src/Congruence.cc (1.21): The construct s.str().c_str(), where
+	  `s' is an std::ostringstream, is extremely dangerous.  In fact,
+	  the compiler can (and does!) destruct the temporary std::string
+	  object returned by str() as soon as c_str() returns, which
+	  results into a dangling pointer.  This construct is now avoided.
+
+2008-09-29 Monday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.61): Activated the `tests'
+	  subdirectory.
+
+2008-09-29 Monday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/cxxoutput.c (1.4): DIMENSION and line lengths
+	  increased.
+
+2008-09-29 Monday 21:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.28), src/Bit_Row.defs.hh (1.11): In order
+	  to use GMP from C++, always include <gmpxx.h>, not <gmp.h>.
+
+2008-09-29 Monday 21:03  Abramo Bagnara
+
+	* interfaces/C/tests/: cxxoutput.c (1.3), print_to_buffer.cc (1.3):
+	  Fixed c_str() use.
+
+2008-09-29 Monday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.defs.hh (1.4):
+	  Temporarily inhibited DEFINE_ASCII_DUMP_LOAD_FUNCTIONS.
+
+2008-09-29 Monday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/cxxoutput.c (1.2): Test with a higher
+	  dimension.  Handle the case where malloc() returns 0.
+
+2008-09-29 Monday 18:30  Abramo Bagnara
+
+	* interfaces/C/tests/print_to_buffer.cc (1.2): Fixed corner case.
+
+2008-09-29 Monday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.376), configure.repo (1.9),
+	  interfaces/C/tests/Makefile.am (1.1),
+	  interfaces/C/tests/cxxoutput.c (1.1),
+	  interfaces/C/tests/print_to_buffer.cc (1.1),
+	  interfaces/C/tests/print_to_buffer.h (1.1): Drafted a new test
+	  for the C interface, showing how to print a nice debugging output
+	  onto a malloc-allocated buffer.  (The wrap_to_buffer() routine in
+	  print_to_buffer.cc has been written by Abramo Bagnara.)
+
+2008-09-29 Monday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/Makefile.am (1.30): Do create
+	  ppl_prolog_generated_test.stamp.
+
+2008-09-29 Monday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/.cvsignore (1.1): Put under CVS control.
+
+2008-09-29 Monday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/tests/.cvsignore (bounded_arithmetic.1): file
+	  .cvsignore was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:27 +0000
+
+2008-09-29 Monday 16:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.265): Item revised.
+
+2008-09-29 Monday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.264): Pushed an item to PPL 0.11 or later version.
+
+2008-09-29 Monday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.16): The Alpha is no longer
+	  special, as far as this test is concerned.
+
+2008-09-29 Monday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.15): Use
+	  PPL_CXX_SUPPORTS_LIMITING_MEMORY.
+
+2008-09-29 Monday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.375), configure.repo (1.8): Use
+	  AC_CXX_SUPPORTS_LIMITING_MEMORY.
+
+2008-09-29 Monday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_limit_memory.m4 (1.1): New function to check whether it
+	  is possible to limit the memory available to processes using
+	  setrlimit().
+
+2008-09-29 Monday 11:49  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (1.57): Fixed typo.
+
+2008-09-29 Monday 09:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.18): Avoid testing with non
+	  supported floating point types.
+
+2008-09-29 Monday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/affinepreimage1.cc (1.25),
+	  BD_Shape/containsintegerpoint1.cc (1.6), BD_Shape/maxspacedim1.cc
+	  (1.6), Octagonal_Shape/affinepreimage1.cc (1.8),
+	  Octagonal_Shape/containsintegerpoint1.cc (1.7),
+	  Octagonal_Shape/maxspacedim1.cc (1.6): Avoid using non supported
+	  floating point types.
+
+2008-09-29 Monday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.24): Generalized so as to avoid
+	  using non supported floating point types.
+
+2008-09-29 Monday 09:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.33),
+	  Java/jni/ppl_java_common.cc (1.46),
+	  Java/jni/ppl_java_common.defs.hh (1.2),
+	  Java/jni/ppl_java_globals.cc (1.19),
+	  Java/parma_polyhedra_library/Control_Parameter_Name.java (1.1),
+	  Java/parma_polyhedra_library/Control_Parameter_Value.java (1.1),
+	  Java/parma_polyhedra_library/MIP_Problem.java (1.3),
+	  Java/parma_polyhedra_library/Makefile.am (1.9),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.20),
+	  OCaml/ppl_ocaml_common.cc (1.4), OCaml/ppl_ocaml_globals.ml
+	  (1.12), OCaml/ppl_ocaml_types.ml (1.13), OCaml/tests/test1.ml
+	  (1.14),
+	  Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.5), Prolog/ppl_prolog_common.cc (1.7),
+	  Prolog/ppl_prolog_common.defs.hh (1.7),
+	  Prolog/Ciao/ciao_pl_check.pl (1.29), Prolog/XSB/xsb_pl_check.P
+	  (1.35), Prolog/tests/pl_check.pl (1.58): The new methods for
+	  MIP_Problem for the control_parameters now added to the Java,
+	  OCaml and Prolog interfaces.
+
+	  Tests for these methods for the OCaml and Prolog interfaces
+	  added.
+
+	  Added a new macro to ppl_interface_generator_common.m4 that finds
+	  the difference of two sequences - as yet unused.
+
+2008-09-29 Monday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.18): Corrected schema names for the partition methods and
+	  fixed a bug in the code for approximate_partition.
+
+2008-09-29 Monday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.7): Test 09 overflows with 64
+	  bit integers too.
+
+2008-09-28 Sunday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.17): Improved check_distance().
+
+2008-09-28 Sunday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.6): Modified known results of
+	  tests 05 and 08; for test 05, modified feasible region so as to
+	  have a unique optimal solution.
+
+2008-09-28 Sunday 17:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.13): Minor modification to
+	  the feasible region for test06 so as to have a unique optimal
+	  solution.
+
+2008-09-28 Sunday 17:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.16): Avoid a division-by-zero error when
+	  printing +inf in check_distance.
+
+2008-09-28 Sunday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.72): The MIP solver no longer depends on
+	  the set of floating point types that are fully supported by the
+	  PPL.
+
+2008-09-28 Sunday 15:04  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.101), Checked_Number.inlines.hh
+	  (1.83): Reverted operator/assign specializations removal.
+
+2008-09-28 Sunday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (1.10): Work around
+	  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37661.
+
+2008-09-28 Sunday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.374), configure.repo (1.7): Avoid unsupported
+	  instantiations.
+
+2008-09-28 Sunday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-foreign-language-interface.doxyconf.in (1.3): Corrected
+	  value for configuration variable EXPAND_AS_DEFINED.
+
+2008-09-28 Sunday 12:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.81): Corrected dependencies for the C
+	  documentation.
+
+2008-09-28 Sunday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: C_interface.dox (1.12), ppl_c_header.h (1.7),
+	  ppl_interface_generator_c_h.m4 (1.24),
+	  ppl_interface_generator_c_h_code.m4 (1.44): Added brief
+	  descriptions for the generated interfaces when building the
+	  configuration-dependent documentation.  Reorganized the
+	  preprocessor macros for IO operators (they now come in two
+	  version, with and without brief documentation).
+
+2008-09-28 Sunday 12:02  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.100), Checked_Number.inlines.hh
+	  (1.82): Reverted illegal code simplification.
+
+2008-09-28 Sunday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (1.10): Test only with the supported
+	  floating point types.
+
+2008-09-28 Sunday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: FCAIBVP.cc (1.7), FCAIBVP.defs.hh (1.7),
+	  FCAIBVP.inlines.hh (1.7), FCAIBVP.types.hh (1.4), Makefile.am
+	  (1.271), Partial_Function.cc (1.8), Partial_Function.defs.hh
+	  (1.6), Partial_Function.inlines.hh (1.5),
+	  Partial_Function.types.hh (1.4), ppl_test.cc (1.15), ppl_test.hh
+	  (1.77), print.cc (1.30), print.hh (1.47): Test stuff reorganized.
+
+2008-09-28 Sunday 10:56  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.99), src/Checked_Number.inlines.hh
+	  (1.81), src/Interval.defs.hh (1.58), src/checked.defs.hh (1.46),
+	  src/checked.inlines.hh (1.44), src/checked_ext.inlines.hh (1.42),
+	  src/checked_float.inlines.hh (1.90), src/checked_int.inlines.hh
+	  (1.68), src/checked_mpq.inlines.hh (1.47),
+	  src/checked_mpz.inlines.hh (1.56), tests/ppl_test.cc (1.14):
+	  Abstracted special values to avoid use of native floating point
+	  types when they are unuseable.
+
+2008-09-27 Saturday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.18): Reject instantiations using unsupported
+	  floating point types.
+
+2008-09-27 Saturday 20:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.13): In the C interface, also enabled the @BINMINOP@ methods
+	  (deprecated, but still here for backward compatibility with 0.9).
+
+2008-09-27 Saturday 19:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: Java/ppl_interface_generator_java_dox_code.m4 (1.4),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.17),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.10), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.53),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.48),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.39),
+	  OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.15):
+	  For the Java and OCaml interfaces, get rid of useless templates
+	  for the add_ at REPRESENT@(s)_and_minimize and the @BINMINOP@
+	  operators (these are deprecated and only kept for the C
+	  interface).
+
+2008-09-27 Saturday 19:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.12): Re-enable the add_..._and_minimize methods for the C
+	  interface.
+
+2008-09-27 Saturday 13:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.52): Bug
+	  whereby the code for the BHZ03 widening for the powerset domains
+	  was not being generated for the C interface fixed.
+
+2008-09-27 Saturday 12:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.37): Reenable the partition methods for the interfaces.
+
+2008-09-27 Saturday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.80): More corrections for the clean targets.
+
+2008-09-27 Saturday 10:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.79): Corrected typo whereby the core user and
+	  devref html docs were not cleaned up.
+
+2008-09-27 Saturday 09:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.90): Changes
+	  that should have been included in previous commit.
+
+2008-09-27 Saturday 09:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.36): Disabled the generation of
+	  [linear,approximated]_partition code, as it was breaking the
+	  build.
+
+2008-09-27 Saturday 08:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.60): Reverted previous change, as it
+	  breaks the build.
+
+2008-09-27 Saturday 00:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.35),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.51),
+	  C/ppl_interface_generator_c_h_code.m4 (1.43),
+	  Java/ppl_interface_generator_java_dox_code.m4 (1.3),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.16),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.9), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.46), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.52),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.47),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.38),
+	  OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.14),
+	  Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.14),
+	  Prolog/ppl_interface_generator_prolog_dox_code.m4 (1.4),
+	  Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.12),
+	  Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.4): Fixed a problem in the code generation for
+	  linear_partition and approximate_partition.
+
+	  This problem occurred in the Prolog interfaces when the list of
+	  instantiations did not include Pointset_Powerset<NNC_Polyhedron>
+	  and/or Pointset_Powerset<Grid>.
+
+	  Note that each of the Prolog systems generates
+	  headers/declarations for every instance of every active schema in
+	  the procedure list.  Therefore if the code is not required
+	  because the set of instantiations does not include
+	  Pointset_Powerset<NNC_Polyhedron> (resp.,
+	  Pointset_Powerset<Grid>) we have also to ensure that the
+	  header/declaration is not generated.
+
+2008-09-26 Friday 23:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/Makefile.am (1.59): Corrected a file name and
+	  removed unnecessary repetitions.
+
+2008-09-26 Friday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (1.42): Added
+	  \relates Doxygen commands to the function declaration templates.
+
+2008-09-26 Friday 18:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (1.23): Use m4 macro
+	  m4_pre_extra_class_code to introduce the name of the interface in
+	  the Doxygen configuration-dependent manuals.
+
+2008-09-26 Friday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.11): Documented conversion
+	  constructors taking a complexity class as argument.
+
+2008-09-26 Friday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: OCaml/ppl_ocaml_common.cc (1.3),
+	  Prolog/ppl_prolog_common.cc (1.6),
+	  Prolog/ppl_prolog_common.defs.hh (1.6): Added minimal explanation
+	  for functions and variables that are commented out via (trivial)
+	  preprocessing conditionals. Similar stuff grouped together, so as
+	  to also minimize the number of conditionals.
+
+2008-09-26 Friday 13:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.templates.hh (1.131), MIP_Problem.cc (1.71),
+	  OR_Matrix.inlines.hh (1.11), Octagonal_Shape.templates.hh (1.90),
+	  Polyhedron_public.cc (1.143): Added a few missing comments to
+	  preprocessing conditionals.  Removed a few lines of (old, ad-hoc,
+	  debugging related, no longer working) code that was already
+	  filtered away by a preprocessing conditional.
+
+2008-09-26 Friday 12:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.3): Commented test, uncommented.
+
+2008-09-26 Friday 11:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.89): Enable
+	  omega_reduce() in all the interfaces for the powerset domains.
+
+2008-09-26 Friday 11:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.15): When translating a C++ std::pair object into a Java Pair
+	  object, avoid useless copies of the pair elements (use swaps
+	  instead).
+
+2008-09-26 Friday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/difference1.cc (1.8): Enabled test15 (that was
+	  witnessing a bug, now corrected).
+
+2008-09-26 Friday 11:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/difference1.cc (bounded_arithmetic.1): file
+	  difference1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:38 +0000
+
+2008-09-26 Friday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.130): Corrected a bug (spotted by Pat) on
+	  the difference_assign method.
+
+2008-09-26 Friday 11:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/difference1.cc (1.7): Added commented test that shows
+	  an assertion failure.
+
+2008-09-26 Friday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.10): Added hand-crafted
+	  documentation for the ad-hoc types and functions provided by
+	  Pointset_Powerset.
+
+2008-09-26 Friday 10:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.34),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.50),
+	  C/ppl_interface_generator_c_h_code.m4 (1.41),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.11),
+	  Java/ppl_interface_generator_java_dox_code.m4 (1.2),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.14),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.8), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.45), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.51),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.46),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.37),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.6), OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+	  (1.13), Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.13),
+	  Prolog/ppl_interface_generator_prolog_dox_code.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.11),
+	  Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.2): Completed the code and main changes needed for
+	  linear_partition and approximate_partition in all the interfaces.
+
+	  Now the methods' classes are always simple and the partition is
+	  always in the Pointset_Powerset<NNC_Polyhedron> (if the domain is
+	  not Grid) or Pointset_Powerset<Grid> for the grid domain.
+
+	  Simple tests for these new methods added for the different
+	  interfaces.
+
+2008-09-26 Friday 00:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.33): Disable linear_partition methods again until the Prolog
+	  tests have been adapted.
+
+2008-09-25 Thursday 23:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.32),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.13),
+	  Java/tests/ppl_java_tests_common (1.16): Allow for changes to
+	  linear_partition in Java.  Simplified the coefficients in the
+	  tests so as to avoid an unintended overflow exception.
+
+2008-09-25 Thursday 23:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.12): Implemented ppl_ at CLASS@_linear_partition/4,
+	  distinguishing the polyhedron and the non-polyhedron cases.
+
+2008-09-25 Thursday 23:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.10): Added declaration for ppl_ at CLASS@_linear_partition/4.
+
+2008-09-25 Thursday 19:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.31): The method schema just added for linear_partiton,
+	  commented out as this broke the build of the prolog interface.
+
+2008-09-25 Thursday 18:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.30),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.49),
+	  C/ppl_interface_generator_c_h_code.m4 (1.40),
+	  Java/jni/ppl_interface_generator_java_classes_cc_code.m4 (1.12),
+	  Java/jni/ppl_interface_generator_java_classes_cc_files.m4 (1.7),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.7), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.44), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.50),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.45),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.36),
+	  Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.11),
+	  Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.9): Started
+	  changes for linear_partition in the interfaces so that its class
+	  is that of its arguments and the 1st argument of the returned
+	  pair.  The schema for this is called ppl_ at CLASS@_linear_partition
+	  to avoid confusion with the old schema ppl_ at CLASS@_ at PARTITION@.
+
+2008-09-25 Thursday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_java_classes_cc_files.m4 was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:27 +0000
+
+2008-09-25 Thursday 18:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h (1.6): Use alias \extref instead of
+	  \ref when referring to external documentation (i.e., the core
+	  manuals) so that tag files will work for HTML and no error is
+	  obtained in LaTeX.
+
+2008-09-25 Thursday 18:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (1.22): Disabled
+	  Doxygen grouping in the generated code.
+
+2008-09-25 Thursday 18:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.78): Added a few missing dependencies.
+	  Restored a few calls to ocamldoc, so as to produce ocamldoc.sty
+	  (to be re-checked).
+
+2008-09-25 Thursday 12:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.48),
+	  ppl_interface_generator_c_h_code.m4 (1.39): Added more methods to
+	  the C interface code.
+
+2008-09-25 Thursday 12:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: C_interface.dox (1.9), ppl_c_header.h (1.5),
+	  ppl_c_version.h.in (1.9): Exploit the \interface Doxygen command
+	  in combination with \relates so as to group related types and
+	  functions in the C interface documentation.  Striclty speaking,
+	  an (opaque) C structure tag is not an interface ...  but for our
+	  purposes it behaves as if it was.
+
+2008-09-25 Thursday 10:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+	  (1.19), ppl_interface_generator_java_test_java_code.m4 (1.43),
+	  ppl_java_tests_common (1.15): Test generation improved,
+	  simplified and comments added.  Code for generating tests
+	  improved and each test is independent from the others.  For the
+	  generated code, all but one method is now tested.  Note that much
+	  of the fixed code such as for the MIP domain is not  yet tested.
+
+2008-09-25 Thursday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.77): The ocamldoc tool should be only invoked
+	  when building the configuration-dependent documentation.
+
+2008-09-25 Thursday 00:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.29),
+	  Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.4): Restore the "and_minimize" predicates disabled in the
+	  previous commit for the Prolog interfaces as otherwise the tests
+	  in pl_check.pl.  clpq.pl and clpq2.pl will not compile.
+
+2008-09-25 Thursday 00:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.88),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.28),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.49),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.44),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.35): Disable
+	  all the "and_minimize" methods in all the interfaces.
+
+	  Ensure that linear_partition method is only used if the
+	  Pointset_Powerset<NNC_Polyhedron> is one of the instantiations.
+
+	  Add the OCaml code for "approximate_partition" in the Grid
+	  domain.
+
+	  Note that tests for both linear_partition and
+	  approximate_partition still to be added.
+
+2008-09-24 Wednesday 22:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.76): Expanded and reorganized the set of
+	  documentation targets. We now support targets whose name
+	  specifies for whom to produce (user/devref) and the desired
+	  format (html, pdf, ps). For instance, we have targets such as
+	  `user-html', `user-pdf', `devref-ps', etc.  Targets `user' and
+	  `devref' produce all three formats.  Adding the word `configured'
+	  (e.g., user-configured-html or devref-configured) allows for
+	  building configuration dependent docs for the foreign language
+	  intefaces; targets user-all and devref-all produce both the
+	  configuration dependent and the configuration-independent
+	  manuals.  Target `world' produces all kind of manuals (as
+	  before).
+
+2008-09-24 Wednesday 21:26  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.48), ppl_interface_generator_ocaml_ml_code.m4 (1.43),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.34): Fixed the
+	  return value in ppl_ at CLASS@_OK and
+	  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign.  Added code for
+	  ppl_ at CLASS@_ at PARTITION@ but has still to be tested.
+
+2008-09-24 Wednesday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.89): Spacing fixed.
+
+2008-09-24 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc (1.18): Typo fixed.
+
+2008-09-24 Wednesday 17:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  ppl_interface_generator_java_procedure_generators.m4 (1.9),
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.11),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.42),
+	  tests/ppl_java_tests_common (1.14): Schematic tests in m4 will
+	  generate tests for all Java interface methods.  A couple of bugs
+	  in the code generator file
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 fixed.
+
+2008-09-24 Wednesday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.10),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.41),
+	  tests/ppl_java_tests_common (1.13): Fixed a bug in the Java
+	  interface cpde for the get_minimized methods.  Added tests for
+	  swap and get_minimized.  Added the congruences2 variable to the
+	  common code.
+
+2008-09-24 Wednesday 12:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.9),
+	  tests/ppl_interface_generator_java_test_java.m4 (1.18),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.40):
+	  Corrected a bug when building from a grid_generator_system.
+
+	  Each method test has its own block, allowing for local variables.
+	   Each method test outputs a message and after checking the main
+	  domain element using OK(), outputs "success" if OK() succeeds.
+
+	  Added a few tests for constructing a domain element.
+
+	  Any procedure schemas not defined at all will now cause a warning
+	  message on standard output. Hence dummy definitions have been
+	  added for the procedure schemas that have no tests.
+
+2008-09-24 Wednesday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/Makefile.am (1.29): Removed an unused
+	  definition.
+
+2008-09-24 Wednesday 09:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.96): Corrected typo in name
+	  of distributed file.
+
+2008-09-24 Wednesday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.35): Use the PPL_SUPPORTED_* macros in
+	  order to check whether particular floating point types are
+	  supported.
+
+2008-09-24 Wednesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.70): Temporarily, if doubles are
+	  unavailable use floats, if floats are unavailable use long
+	  doubles.
+
+2008-09-24 Wednesday 08:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.75): Added missing dependency and corrected
+	  doxygen input file for Java devref.
+
+2008-09-24 Wednesday 08:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/Makefile.am (1.28): Corrected typo in
+	  dependency name.
+
+2008-09-23 Tuesday 22:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/Makefile.am (1.27): Generated tests are
+	  now removed by makeclean.
+
+2008-09-23 Tuesday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.263): Added one item for PPL 0.11.
+
+2008-09-23 Tuesday 21:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/difference1.cc (1.6): Completed a comment for test14.
+
+2008-09-23 Tuesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float_binary_format.m4 (1.9): Test strengthened to
+	  check also a couple of denormal values.
+
+2008-09-23 Tuesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.373), configure.repo (1.6): New Autoconf variable
+	  `required_instantiations_prolog_generated_test_sources'.
+
+2008-09-23 Tuesday 20:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/difference1.cc (1.5): Print statements improved.
+
+2008-09-23 Tuesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_ieee_inexact_flag.m4 (1.4): Cater for the case where
+	  the FE_INEXACT macro is undefined.  This should fix the bug
+	  described in
+	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=499746.
+
+2008-09-23 Tuesday 20:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.129): Box<ITV>::difference_assign(const
+	  Box&) slightly optimized.
+
+2008-09-23 Tuesday 19:36  Abramo Bagnara
+
+	* tests/Box/difference1.cc (1.4): test14 does not fail now.
+
+2008-09-23 Tuesday 19:34  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.42): Added missing clear.
+
+2008-09-23 Tuesday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/difference1.cc (1.3): Print statements of test14()
+	  revised.
+
+2008-09-23 Tuesday 18:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/Makefile.am (1.26): Corrected the name of
+	  a test file.
+
+2008-09-23 Tuesday 18:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.82), GNU/Makefile.am
+	  (1.78), SICStus/Makefile.am (1.96), SWI/Makefile.am (1.95),
+	  XSB/Makefile.am (1.75),
+	  XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 (1.2),
+	  YAP/Makefile.am (1.67), tests/Makefile.am (1.25): Try to follow
+	  the standards for the makefiles.  Fixed a bug in
+	  XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+2008-09-23 Tuesday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_xsb_prolog_generated_test_P.m4 was added
+	  on branch bounded_arithmetic on 2008-10-29 20:45:33 +0000
+
+2008-09-23 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
+	  (bounded_arithmetic.1): file ppl_prolog_generated_test_common.pl
+	  was added on branch bounded_arithmetic on 2008-10-29 20:45:33
+	  +0000
+
+2008-09-23 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_prolog_generated_test.pl
+	  (bounded_arithmetic.1): file sp_prolog_generated_test.pl was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-09-23 Tuesday 17:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.81),
+	  Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.10),
+	  Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+	  (1.1), SICStus/Makefile.am (1.95), SICStus/sp_predicate_check.pl
+	  (1.10), SICStus/sp_prolog_generated_test.pl (1.1),
+	  SWI/Makefile.am (1.94), SWI/swi_predicate_check.pl (1.8),
+	  SWI/swi_prolog_generated_test.pl (1.1), XSB/Makefile.am (1.74),
+	  XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.11),
+	  XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 (1.1),
+	  tests/Makefile.am (1.24),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.83),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.37),
+	  tests/ppl_interface_generator_prolog_generated_test_pl.m4 (1.1),
+	  tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
+	  (1.1), tests/ppl_predicate_check_common.pl (1.13),
+	  tests/ppl_prolog_generated_test_common.pl (1.1): Renamed the
+	  predicate_check generated test files to have the form
+	  ppl_prolog_generated_test_<...>.xx The generating files and
+	  common files renamed similarly.
+
+2008-09-23 Tuesday 16:45  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.47), ppl_interface_generator_ocaml_ml_code.m4 (1.42),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.33),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.12):
+	  'ascii_dump' added to OCaml interface.
+
+2008-09-23 Tuesday 12:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/: directproduct1.cc (1.4),
+	  directproduct2.cc (1.3), directproduct3.cc (1.4): Cleaned several
+	  tests.
+
+2008-09-23 Tuesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/difference1.cc (1.2): New test14 shows a bug in
+	  difference_assign()
+
+2008-09-23 Tuesday 10:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.88): Corrected bug in
+	  minimized_congruences, spotted by test09 in congruences1.cc.
+
+2008-09-23 Tuesday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/congruences1.cc (1.6): New test shows a bug
+	  in minimized_congruences (spotted by Pat).
+
+2008-09-23 Tuesday 08:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-foreign-language-interface.doxyconf.in (1.3),
+	  interfaces-html.sed (1.2), interfaces-latex.sed (1.2),
+	  user-foreign-language-interface.doxyconf.in (1.2): Avoid a
+	  Doxygen error for inexistent tagfile when building the LaTeX
+	  docs.
+
+2008-09-22 Monday 21:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.64): Distribute all files needed
+	  for the generation of Prolog_interface.dox.
+
+2008-09-22 Monday 20:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.74): Corrected a couple of typos.
+
+2008-09-22 Monday 20:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (1.22): Call libtool when
+	  compiling NNC_Polyhedron_test1.
+
+2008-09-22 Monday 20:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.27): CLEANFILES moved out of
+	  conditional.
+
+2008-09-22 Monday 20:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.23): Target Java_interface.dox
+	  placed out of #if BUILD_JAVA_INTERFACE conditional and listed in
+	  dist_noinst_DATA.
+
+2008-09-22 Monday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.63): BUILT_SOURCES must contain
+	  ppl_prolog_domains.cc.stamp.
+
+2008-09-22 Monday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.62): Actually build
+	  ppl_prolog_domains.cc.stamp.
+
+2008-09-22 Monday 17:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.87),
+	  Prolog/Makefile.am (1.61),
+	  Prolog/ppl_interface_generator_prolog_cc_files.m4 (1.10),
+	  Prolog/ppl_interface_generator_prolog_hh_files.m4 (1.9): The file
+	  ppl_prolog_domains.cc is not needed.	Ensure that in the
+	  generated tests a powerset of grids is built by default from
+	  congruences and not constraints.  This fixes a bug when testing
+	  ppl_predicate_check_test for the Pointset_Powerset_Grid domain.
+
+2008-09-22 Monday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_ieee_inexact_flag.m4 (1.3): Made consistent with our
+	  code for controlling the FPUs.
+
+2008-09-22 Monday 16:07  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.8): Apply the previous fix also in the jni directory.  Now the
+	  `make check' should pass.
+
+2008-09-22 Monday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.372), configure.repo (1.5),
+	  interfaces/Prolog/Makefile.am (1.60): Avoid wildcard characters
+	  in *CLEANFILES variables.
+
+2008-09-22 Monday 14:41  Andrea Cimino
+
+	* interfaces/Java/:
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.6), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.39): Use DISJUNCT instead of CPP_DISJUNCT where appropriate.
+	  Now the Java interface compiles with	--enable-instantiations=all
+
+2008-09-22 Monday 14:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Makefile.am (1.59): Revised the organisation of
+	  the Makefile so that Prolog_interfaces.dox is built outside the
+	  #if BUILD_* conditional.  Removed Prolog_interfaces.dox from the
+	  BUILT_SOURCES and included them with dist_noinst_DATA.  Use
+	  CLEANFILES instead of DISTCLEANFILES for all files built with
+	  make all.
+
+2008-09-22 Monday 13:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.46), ppl_interface_generator_ocaml_ml_code.m4 (1.41),
+	  ppl_interface_generator_ocaml_mli.m4 (1.19),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.32),
+	  ppl_ocaml_common.cc (1.2), ppl_ocaml_common.defs.hh (1.2),
+	  ppl_ocaml_types.ml (1.12),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.11): Added
+	  functions:
+	  ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity,
+	  ppl_ at CLASS@_widening_assign,
+	  ppl_ at CLASS@_widening_assign_with_tokens.
+
+	  Added the Complexity_Class type.
+
+	  Added tests to test these.  Also added tests to test the
+	  unconstrain(s) methods.
+
+2008-09-22 Monday 13:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_common.defs.hh (bounded_arithmetic.1):
+	  file ppl_ocaml_common.defs.hh was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-22 Monday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.7),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.5), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.38): Added/enabled methods:
+
+	  unconstrain_space_dimension_code,
+	  unconstrain_space_dimensions_code,
+	  BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign,
+	  BHZ03_ at ALT_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign,
+	  approximate_partition.
+
+	  and the relevant tests.
+
+2008-09-22 Monday 11:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.73): ALso distribute interfaces-html.sed and
+	  interfaces-latex.sed.
+
+2008-09-22 Monday 09:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Makefile.am (1.58): Restore
+	  Prolog_interface.dox as a built source to ensure the file is
+	  generated before building the documentation.
+
+2008-09-22 Monday 08:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_classes_cc_files.m4 (1.6),
+	  ppl_java_globals.cc (1.18): Include "ppl_java_common.defs.hh"
+
+2008-09-22 Monday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/: Makefile.am (1.26),
+	  ppl_interface_generator_java_classes_cc_code.m4 (1.6),
+	  ppl_java_common.cc (1.45), ppl_java_common.defs.hh (1.1),
+	  ppl_java_common.hh (1.41), ppl_java_common.inlines.hh (1.1):
+	  Splitted ppl_java_common.hh.	Made several improvements (but many
+	  FIXMEs remain).
+
+2008-09-21 Sunday 23:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Makefile.am (1.57): Missing separator added.
+
+2008-09-21 Sunday 23:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.56),
+	  ppl_interface_generator_prolog_dox.m4 (1.4): Changed so that
+	  there are no unnecessary dependencies on the
+	  ppl_interface_instantiations when generating the documentation.
+
+2008-09-21 Sunday 22:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.86): Revised
+	  so as to allow for the documentation not to include
+	  ppl_interface_instantiations.m4.
+
+2008-09-21 Sunday 22:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: Makefile.am (1.22),
+	  ppl_interface_generator_java_dox.m4 (1.3): Avoid unnecessary
+	  dependency on the generated ppl_interface_instantiations.m4
+
+2008-09-21 Sunday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.371), configure.repo (1.4): Fixed the
+	  implementation of `--enable-instantiations=all'.
+
+2008-09-21 Sunday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.29): Improved the explanation on how to use
+	  the `configure.repo' files.
+
+2008-09-21 Sunday 21:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.21): Java_interface.dox should not
+	  belong to BUILT_SOURCES.
+
+2008-09-21 Sunday 17:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.72): Also clean LaTeX header files for
+	  configurated interfaces.
+
+2008-09-21 Sunday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: Makefile.am (1.71), devref-foreign-language-interface.tex
+	  (1.2), user-foreign-language-interface.tex (1.2): Added missing
+	  replacement targets for sed in the devref LaTeX header file.
+	  Added a new replacement for \usepackage{ocamldoc}.
+
+2008-09-21 Sunday 17:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.70): Further targets added to build
+	  configuration-dependent foreign language interface docs.
+
+2008-09-21 Sunday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frombox1.cc (1.7): Print also the constraints of `src'
+	  in test05().
+
+2008-09-21 Sunday 15:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-foreign-language-interface.doxyconf.in (1.2): The
+	  latex header file is in the build dir, not in the source dir.
+
+2008-09-21 Sunday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.370), configure.repo (1.3), doc/Makefile.am
+	  (1.69), doc/devref-c-interface.doxyconf-html.in (1.8),
+	  doc/devref-c-interface.doxyconf-latex.in (1.8),
+	  doc/devref-c-interface.tex (1.6),
+	  doc/devref-foreign-language-interface.doxyconf.in (1.1),
+	  doc/devref-foreign-language-interface.tex (1.1),
+	  doc/devref-java-interface.doxyconf-html.in (1.5),
+	  doc/devref-java-interface.doxyconf-latex.in (1.5),
+	  doc/devref-java-interface.tex (1.3),
+	  doc/devref-ocaml-interface.doxyconf-html.in (1.4),
+	  doc/devref-ocaml-interface.doxyconf-latex.in (1.4),
+	  doc/devref-ocaml-interface.tex (1.2),
+	  doc/devref-prolog-interface.doxyconf-html.in (1.10),
+	  doc/devref-prolog-interface.doxyconf-latex.in (1.10),
+	  doc/devref-prolog-interface.tex (1.2), doc/interfaces-html.sed
+	  (1.1), doc/interfaces-latex.sed (1.1),
+	  doc/user-c-interface.doxyconf-html.in (1.9),
+	  doc/user-c-interface.doxyconf-latex.in (1.9),
+	  doc/user-c-interface.tex (1.6),
+	  doc/user-foreign-language-interface.doxyconf.in (1.1),
+	  doc/user-foreign-language-interface.tex (1.1),
+	  doc/user-java-interface.doxyconf-html.in (1.5),
+	  doc/user-java-interface.doxyconf-latex.in (1.5),
+	  doc/user-java-interface.tex (1.3),
+	  doc/user-ocaml-interface.doxyconf-html.in (1.3),
+	  doc/user-ocaml-interface.doxyconf-latex.in (1.3),
+	  doc/user-ocaml-interface.tex (1.2),
+	  doc/user-prolog-interface.doxyconf-html.in (1.9),
+	  doc/user-prolog-interface.doxyconf-latex.in (1.10),
+	  doc/user-prolog-interface.tex (1.6): The doxygen configuration
+	  files and LaTeX headers for the foreign language interface
+	  manuals are now automatically generated from 4 template files and
+	  2 sed script files (plus Makefile.am machinery).  The overall
+	  infrastructure can be extended so as to generate both
+	  configuration independent and configuration dependent manuals.
+
+2008-09-21 Sunday 12:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/ppl_java_tests_common (1.12): Change a
+	  coefficient from 3 to 2 to avoid an unintended overflow.
+
+2008-09-21 Sunday 07:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.inlines.hh (1.3):
+	  Indentation fixed.
+
+2008-09-21 Sunday 07:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.12): Fixed.
+
+2008-09-20 Saturday 23:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/ppl_java_tests_common (1.11): Coefficients
+	  simplified to avoid unintended overflow errors.
+
+2008-09-20 Saturday 21:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.85): Comment
+	  corrected.
+
+2008-09-20 Saturday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.28): Added a new section on "Using the CVS
+	  Sources".  In particular, explained how it is possible to
+	  dispense with the use of Autoconf exploiting the presence of
+	  `configure.repo' in the repository (suggestion by Basile
+	  Starynkevitch).
+
+2008-09-20 Saturday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.369), configure.repo (1.2): Missing double quote
+	  added.
+
+2008-09-20 Saturday 20:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.84),
+	  Java/ppl_interface_generator_java_dox.m4 (1.2),
+	  Prolog/ppl_interface_generator_prolog_dox.m4 (1.3): Ensure that
+	  the documentation generators do not include the
+	  ppl_interface_instantiations.m4 file.
+
+2008-09-20 Saturday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.368), configure.repo (1.1), Watchdog/configure.ac
+	  (1.49), Watchdog/configure.repo (1.1): Capitalization fixed.
+
+2008-09-20 Saturday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS (1.11): Set a tentative release date.
+
+2008-09-20 Saturday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.235): Set a tentative release date.
+
+2008-09-20 Saturday 20:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.48): We do not need the `win32-dll'
+	  Libtool option.
+
+2008-09-20 Saturday 20:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.367): Long lines avoided.
+
+2008-09-20 Saturday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.366): Computation of the set of all
+	  instantiations made independent from the default instantiations.
+
+2008-09-20 Saturday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.365): Useless work avoided.
+
+2008-09-20 Saturday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.53): Updated.
+
+2008-09-20 Saturday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.364): Version number bumped.
+
+2008-09-20 Saturday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.47): Punctuation improved.  Require
+	  Autoconf 2.60 or later.
+
+2008-09-20 Saturday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.363): Comments improved.
+
+2008-09-20 Saturday 20:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.362): Punctuation fixed.
+
+2008-09-20 Saturday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.30), Watchdog/ChangeLog (1.19): Updated.
+
+2008-09-20 Saturday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_check_ciao.m4 (1.2), ac_check_fpu_control.m4 (1.7),
+	  ac_check_gmp.m4 (1.27), ac_check_swi_prolog.m4 (1.16),
+	  ac_cxx_double_binary_format.m4 (1.10),
+	  ac_cxx_float_binary_format.m4 (1.8),
+	  ac_cxx_long_double_binary_format.m4 (1.9),
+	  ac_cxx_proper_long_double.m4 (1.4), ac_cxx_remainder_bug.m4
+	  (1.5), ppl.m4 (1.10), ppl_c.m4 (1.3): For portability, prefer
+	  exit() to returns from main().
+
+2008-09-20 Saturday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_ieee_inexact_flag.m4 (1.2): Test improved: it did not
+	  work with optimizations turned on, it did not test with doubles
+	  and long doubles, and it triggered a compiler warning.
+
+2008-09-20 Saturday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.11): Now test01() must always
+	  succeed, as it takes into account that an overflow can occur
+	  before the timeout with 8-bit coefficients.
+
+2008-09-20 Saturday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_classes_cc_files.m4 (1.5),
+	  ppl_java_common.cc (1.44), ppl_java_common.hh (1.40),
+	  ppl_java_globals.cc (1.17): The Java interface implementation now
+	  lives in its own namespace.
+
+2008-09-20 Saturday 12:55  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.45), ppl_interface_generator_ocaml_ml_code.m4 (1.40),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.31),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.10):
+	  Restored ppl_ at CLASS@_ at UB_EXACT@.
+
+2008-09-20 Saturday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc (1.4),
+	  interfaces/C/ppl_c_implementation_common.defs.hh (1.3),
+	  interfaces/C/ppl_c_implementation_common.inlines.hh (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.8),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.10), interfaces/Prolog/ppl_prolog_common.cc (1.5),
+	  interfaces/Prolog/ppl_prolog_common.defs.hh (1.5),
+	  interfaces/Prolog/Ciao/ciao_efli.cc (1.4),
+	  interfaces/Prolog/Ciao/ciao_efli.hh (1.3),
+	  interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh (1.2),
+	  interfaces/Prolog/GNU/gprolog_efli.cc (1.4),
+	  interfaces/Prolog/GNU/gprolog_efli.hh (1.2),
+	  interfaces/Prolog/GNU/ppl_prolog_sysdep.hh (1.2),
+	  interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh (1.2),
+	  interfaces/Prolog/SICStus/sicstus_efli.cc (1.3),
+	  interfaces/Prolog/SICStus/sicstus_efli.hh (1.2),
+	  interfaces/Prolog/SWI/ppl_prolog_sysdep.hh (1.3),
+	  interfaces/Prolog/SWI/swi_efli.cc (1.4),
+	  interfaces/Prolog/SWI/swi_efli.hh (1.5),
+	  interfaces/Prolog/XSB/ppl_prolog_sysdep.hh (1.3),
+	  interfaces/Prolog/XSB/xsb_efli.cc (1.5),
+	  interfaces/Prolog/XSB/xsb_efli.hh (1.2),
+	  interfaces/Prolog/YAP/ppl_prolog_sysdep.hh (1.2),
+	  interfaces/Prolog/YAP/yap_efli.cc (1.2),
+	  interfaces/Prolog/YAP/yap_efli.hh (1.2), src/namespaces.hh
+	  (1.15): The Interfaces namespace is now structured.
+
+2008-09-20 Saturday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_efli.hh (bounded_arithmetic.1): file
+	  ciao_efli.hh was added on branch bounded_arithmetic on 2008-10-29
+	  20:45:32 +0000
+
+2008-09-20 Saturday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_implementation_common.cc
+	  (bounded_arithmetic.1): file ppl_c_implementation_common.cc was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-09-20 Saturday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_c_cc_files.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:26 +0000
+
+2008-09-20 Saturday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh
+	  (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:32 +0000
+
+2008-09-20 Saturday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.361): Conditionals improved.
+
+2008-09-20 Saturday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.18): When
+	  PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG evaluates to false,
+	  fpu_reset_inexact() does nothing and fpu_check_inexact() returns
+	  -1 ("don't know").
+
+2008-09-20 Saturday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.58): Do not distribute ppl_c.h.
+
+2008-09-20 Saturday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.360), interfaces/C/Makefile.am (1.57): The C
+	  interface can only be enabled if Perl is available.
+
+2008-09-20 Saturday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am (1.8): Clean
+	  also the class files.
+
+2008-09-20 Saturday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.359): New variable to collect the names of all
+	  the instantiations-dependent Java class files.  Several sed
+	  patterns improved.
+
+2008-09-20 Saturday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/: Makefile.am (1.4),
+	  asciidumpload1.cc (1.3): Write and clean ascii_dump_load1.dat.
+
+2008-09-20 Saturday 07:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (1.9): Let test01() depend on
+	  PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG.
+
+2008-09-19 Friday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.358): For testing purpose, we now accept also the
+	  `--enable-instantiations=all' configure option.  (Currently this
+	  shows that our m4 code does not scale.)
+
+2008-09-19 Friday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.17): Accept also the native floating point types as
+	  valid instances for bounded-difference and octagonal shapes.
+
+2008-09-19 Friday 22:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am (1.56), Java/jni/Makefile.am (1.25),
+	  OCaml/Makefile.am (1.54), Prolog/Ciao/Makefile.am (1.80),
+	  Prolog/GNU/Makefile.am (1.77), Prolog/SICStus/Makefile.am (1.94),
+	  Prolog/SWI/Makefile.am (1.93), Prolog/XSB/Makefile.am (1.73),
+	  Prolog/YAP/Makefile.am (1.66): Many more interface instantiations
+	  are now allowed.
+
+2008-09-19 Friday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (1.6): Added one missing
+	  inline qualifier.  Static variable avoided.
+
+2008-09-19 Friday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.357): Check whether the IEEE inexact flag is
+	  supported in C++.
+
+2008-09-19 Friday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_ieee_inexact_flag.m4 (1.1): New function to check
+	  whether the IEEE inexact flag is supported and available to C++
+	  programs.
+
+2008-09-19 Friday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_remainder_bug.m4 (1.4): Indentation fixed.
+
+2008-09-19 Friday 20:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.356): The library now has file pathnames longer
+	  than 99 characters, which implies we can no longer use the old V7
+	  tar format.  We thus pass the `tar-ustar' option to
+	  AM_INIT_AUTOMAKE, which specifies using the ustar tar format
+	  defined by POSIX 1003.1-1988.  Consequently, we require Automake
+	  at least version 1.9 (the `tar-ustar' option was not available in
+	  previous releases).
+
+2008-09-19 Friday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.55): Distribute also ppl_c_header.h.
+
+2008-09-19 Friday 19:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.5),
+	  parma_polyhedra_library/Complexity_Class.java (1.1),
+	  parma_polyhedra_library/Makefile.am (1.7),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.4), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.37): New Complexity_Class object that enumerates the different
+	  complexities.
+
+	  Added a method for building an object from another object
+	  possibly from anothe class with the complexity specified.
+
+	  Tests for this added.
+
+2008-09-19 Friday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Complexity_Class.java
+	  (bounded_arithmetic.1): file Complexity_Class.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-19 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.79): Define
+	  libppl_ciao_la_DEPENDENCIES.
+
+2008-09-19 Friday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.78): Fixed the definition
+	  of AM_CPPFLAGS.
+
+2008-09-19 Friday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh (1.1): Put under CVS
+	  control.
+
+2008-09-19 Friday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_efli.cc (1.3): Include
+	  "ppl_prolog_common.defs.hh".
+
+2008-09-19 Friday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_efli.hh (1.2): Declaration fixed.
+
+2008-09-19 Friday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_efli.cc (1.2): Removed useless PPL::
+	  qualifications.
+
+2008-09-19 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ciao_efli.cc (1.1), ciao_efli.hh (1.1),
+	  ppl_ciao.cc (1.54): New files ciao_efli.hh and ciao_efli.cc
+	  replace ppl_ciao.cc.
+
+2008-09-19 Friday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: expected_clpq2_int16_a (1.5),
+	  expected_clpq2_int8_a (1.7), expected_pchk_int16_a (1.8): Updated
+	  expected results for 8 and 16 bit coefficients with assertions
+	  enabled.
+
+2008-09-19 Friday 16:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: expected_clpq2_int16 (1.5),
+	  expected_clpq2_int8 (1.7), expected_pchk_int16 (1.8): Fixed
+	  expected results for 8 and 16 bit coefficient configurations.
+
+2008-09-19 Friday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (1.14): Fixed another
+	  uninitialization error for the pricing method.
+
+2008-09-19 Friday 16:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+	  (1.9), ppl_interface_generator_prolog_cc_files.m4 (1.9),
+	  ppl_interface_generator_prolog_hh_files.m4 (1.8): Added debugging
+	  macro to indicate if any predicate schematic code is missing.
+	  Improved a cooment.
+
+2008-09-19 Friday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.355): Enabled all default instantiations.
+	  Version number bumped.
+
+2008-09-19 Friday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.5): Use the exact
+	  steepest-edge pricing rule on test06: this allows for obtaining
+	  deterministic overflow behavior when configured to use 8-bit
+	  checked integers.
+
+2008-09-19 Friday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.53),
+	  ppl_interface_generator_ocaml_cc.m4 (1.12),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.44),
+	  ppl_interface_generator_ocaml_cc_files.m4 (1.3),
+	  ppl_interface_generator_ocaml_hh_code.m4 (1.3),
+	  ppl_interface_generator_ocaml_hh_files.m4 (1.2),
+	  ppl_interface_generator_ocaml_ml.m4 (1.17), ppl_ocaml_globals.cc
+	  (1.19): The OCaml interface now supports separate compilation.
+
+2008-09-19 Friday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_ocaml_cc_files.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-19 Friday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_ocaml_hh_files.m4 was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-19 Friday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (1.9): No longer using deprecated
+	  methods (*_and_minimize).  Test 04, which before was known to
+	  overflow when using 8 bit coefficients with assertions enabled,
+	  now always succeeds.
+
+2008-09-19 Friday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (1.19): Avoid a warning when
+	  assertions are disabled.
+
+2008-09-19 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.354): Added new variables for the OCaml
+	  interface.
+
+2008-09-19 Friday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml_common.cc (1.1),
+	  ppl_ocaml_common.defs.hh (1.1), ppl_ocaml_common.inlines.hh
+	  (1.1): New files implementing the domain-independent part of the
+	  OCaml interface.
+
+2008-09-19 Friday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_common.inlines.hh
+	  (bounded_arithmetic.1): file ppl_ocaml_common.inlines.hh was
+	  added on branch bounded_arithmetic on 2008-10-29 20:45:30 +0000
+
+2008-09-19 Friday 13:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16_a (1.10), expected_int32_a
+	  (1.11), expected_int64_a (1.11), expected_int8_a (1.9): Updated
+	  expected results for bounded integers and assertions enabled.
+
+2008-09-19 Friday 13:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/:
+	  ppl_interface_generator_java_procedure_generators.m4 (1.8),
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.4),
+	  jni/ppl_interface_generator_java_classes_cc_files.m4 (1.4),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.4),
+	  parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.3), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.36), tests/ppl_java_tests_common (1.10): Added m4 debug code
+	  so as to output a message if the definition of a schematic
+	  procedure is missing.
+
+	  Added code for several missing methods: add_disjunct
+	  widening_assign @EXTRAPOLATION at _extrapolation_assign
+
+	  Corrected a bug in the code for
+	  @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign where the
+	  arguments were inconsistently ordered.
+
+	  Added several tests for the widening and extrapolation code.
+
+2008-09-19 Friday 12:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.16): Expected results for
+	  unbounded integers and assertions disabled.
+
+2008-09-19 Friday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.47), expected_int16 (1.11),
+	  expected_int32 (1.12), expected_int64 (1.12), expected_int8
+	  (1.10): Modified the check command so as to solve test problems
+	  using a deterministic pricing policy, as to obtain more
+	  predictable results across architectures.  Updated the expected
+	  results for bounded-size coefficient configurations (with
+	  assertions disabled).
+
+2008-09-19 Friday 10:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.79): Added new option -p,
+	  controlling the selection of the pricing method for the simplex
+	  computation.
+
+2008-09-19 Friday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c_header.h (1.4),
+	  ppl_c_implementation_common.cc (1.3): In the MIP_Problem section
+	  of the interface, added values corresponding to the control
+	  parameter setting and interfaced the new methods to get/set the
+	  control parameters.
+
+2008-09-19 Friday 10:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: MIP_Problem.cc (1.69), MIP_Problem.defs.hh (1.38),
+	  MIP_Problem.inlines.hh (1.18), MIP_Problem.templates.hh (1.13):
+	  Added public enums Control_Parameter_Name and
+	  Control_Parameter_Value: for the time being, the only control
+	  parameter name is PRICING for the pricing method, which can be
+	  set to three values.	Added public methods for getting/setting a
+	  control parameter value.  Modified the implementation so as to
+	  compute the simplex by using the pricing method specified by the
+	  control parameter settings.
+
+	  As for implementation, we temporarily use a
+	  Control_Parameter_Value variable (named `pricing') to store the
+	  singleton control parameter collection.  It is planned that this
+	  will be replaced by a bitset-based status word encoding, besides
+	  possible other control parameters, also the values of `status',
+	  `initialized' and `opt_mode'.
+
+2008-09-19 Friday 10:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.83): Fixed a
+	  bug so as to avoid generating spurious blank lines.
+
+2008-09-18 Thursday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.3): Added missing copyright notices.
+
+2008-09-18 Thursday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am (1.6):
+	  Several kludges removed.
+
+2008-09-18 Thursday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+	  (1.3): Fixed the spacing in the generated files.
+
+2008-09-18 Thursday 21:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.43), ppl_interface_generator_ocaml_ml_code.m4 (1.39),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.30): Added dummy
+	  code defining macro ppl_ at CLASS@_ at UB_EXACT@_code to all the
+	  "_code" files to avoid a warning.
+
+2008-09-18 Thursday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Makefile.am (1.5):
+	  Useless conditional removed.
+
+2008-09-18 Thursday 21:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc (1.16): Code formatting
+	  improved.
+
+2008-09-18 Thursday 21:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
+	  (1.3): Removed spurious blank line.
+
+2008-09-18 Thursday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am (1.54), Java/jni/Makefile.am (1.24),
+	  Java/parma_polyhedra_library/Makefile.am (1.4), OCaml/Makefile.am
+	  (1.52): Standardize the handling of timestamps.
+
+2008-09-18 Thursday 18:21  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.42), ppl_interface_generator_ocaml_hh_code.m4 (1.2),
+	  ppl_interface_generator_ocaml_ml.m4 (1.16),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.38),
+	  ppl_interface_generator_ocaml_mli.m4 (1.18),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.29),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.9),
+	  tests/test1.ml (1.13): Types `c_polyhedron' and `nnc_polyhedron'
+	  are now merged in the new type `polyhedron' in the OCaml
+	  interface.  All the methods concerning c_polyhedron and
+	  nnc_polyhedron has been renamed for consistency with the other
+	  interfaces.  ppl_ at CLASS@_ at UB_EXACT@_code disabled.
+
+2008-09-18 Thursday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (1.5): Test 9 fails on 8
+	  bit integers.
+
+2008-09-18 Thursday 16:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.78): Use maximize_with_point() and
+	  minimize_with_point() when wanting the point returned.
+
+2008-09-18 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.89): FIXME text made more
+	  precise.
+
+2008-09-18 Thursday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.353): On the Alpha, use the `-mieee-with-inexact'
+	  GCC option (`-ieee_with_inexact' for other compilers) in order to
+	  maintain the IEEE inexact-flag.
+
+2008-09-18 Thursday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc.m4 (1.11),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.41),
+	  ppl_interface_generator_ocaml_cc_files.m4 (1.2),
+	  ppl_interface_generator_ocaml_ml.m4 (1.15),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.37),
+	  ppl_interface_generator_ocaml_mli.m4 (1.17),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.28): As for the C
+	  interface, the m4 generating code outputs a warning message if
+	  any code is missing for each schematic procedure that is not
+	  defined.
+
+2008-09-18 Thursday 13:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (1.21): Outout the
+	  copyright notice in ppl_c_domains.h.
+
+2008-09-18 Thursday 12:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.352), interfaces/Java/jni/Makefile.am (1.23),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.15),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.58), interfaces/Java/parma_polyhedra_library/Makefile.am
+	  (1.3): The Java interface now uses separate compileation (some
+	  file-renaming is still pending though).
+
+2008-09-18 Thursday 12:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.47),
+	  ppl_interface_generator_c_cc_files.m4 (1.12),
+	  ppl_interface_generator_c_h.m4 (1.20),
+	  ppl_interface_generator_c_h_code.m4 (1.38),
+	  ppl_interface_generator_c_procedure_generators.m4 (1.10): Added a
+	  debugging macro that outputs a warning message if there are
+	  undefined procedure code macros to each of the m4 generating
+	  files.  If a procedure macro is known to be missing or unwanted
+	  for the C interface, then an empty definition must be included in
+	  the code files to prevent the m4 debugging message.
+
+	  Missing code and headers in the C interface for several
+	  procedures has been added to the "_code" files.
+
+	  Some comments improved.
+
+2008-09-18 Thursday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am (1.70), join1.cc (1.20), join2.cc
+	  (1.16), upperbound1.cc (1.1), upperbound2.cc (1.1): Tests join1/2
+	  renamed upperbound1/2.
+
+2008-09-18 Thursday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/upperbound1.cc (bounded_arithmetic.1): file
+	  upperbound1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:38 +0000
+
+2008-09-18 Thursday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/upperbound2.cc (bounded_arithmetic.1): file
+	  upperbound2.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:38 +0000
+
+2008-09-18 Thursday 09:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/join2.cc (1.15): Avoid using
+	  upper_bound_assign_and_minimize(); remove duplicated tests.
+
+2008-09-18 Thursday 09:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/upperbound1.cc (1.2): Avoid using
+	  upper_bound_assign_and_minimize().
+
+2008-09-18 Thursday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/upperbound1.cc (bounded_arithmetic.1): file
+	  upperbound1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:37 +0000
+
+2008-09-18 Thursday 08:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: append1.cc (1.15), append2.cc (1.14),
+	  exceptions1.cc (1.18), exceptions2.cc (1.15), nncminimize1.cc
+	  (1.10), permute.cc (1.12), polyhull2.cc (1.15): Avoid using
+	  upper_bound_assign_and_minimize().
+
+2008-09-18 Thursday 08:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c_header.h (1.3),
+	  ppl_c_implementation_common.defs.hh (1.2): Added declaration and
+	  (tentative) definition of ascii_load functions: implementation is
+	  based on __gnu_cxx::stdio_sync_filebuf.
+
+2008-09-18 Thursday 08:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/affineimage2.cc (1.14): Do not use
+	  upper_bound_assign_and_minimize.
+
+2008-09-18 Thursday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/difference1.cc (bounded_arithmetic.1): file
+	  difference1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:39 +0000
+
+2008-09-18 Thursday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/upperbound1.cc (bounded_arithmetic.1): file
+	  upperbound1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:39 +0000
+
+2008-09-18 Thursday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/upperbound1.cc (bounded_arithmetic.1): file
+	  upperbound1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:38 +0000
+
+2008-09-18 Thursday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.78), BD_Shape/bdsdifference1.cc
+	  (1.20), BD_Shape/bdshull1.cc (1.21), BD_Shape/difference1.cc
+	  (1.1), BD_Shape/upperbound1.cc (1.1), Box/Makefile.am (1.72),
+	  Box/boxdifference1.cc (1.12), Box/boxhull1.cc (1.10),
+	  Box/difference1.cc (1.1), Box/upperbound1.cc (1.1),
+	  Octagonal_Shape/Makefile.am (1.32),
+	  Octagonal_Shape/difference1.cc (1.1),
+	  Octagonal_Shape/octdifference1.cc (1.7),
+	  Octagonal_Shape/octhull1.cc (1.9), Octagonal_Shape/upperbound1.cc
+	  (1.1): Test programs renamed so as to match the name of the
+	  tested method.
+
+2008-09-18 Thursday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/difference1.cc (bounded_arithmetic.1): file
+	  difference1.cc was added on branch bounded_arithmetic on
+	  2008-10-29 20:45:37 +0000
+
+2008-09-17 Wednesday 17:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.355), src/Polyhedron.inlines.hh
+	  (1.151), tests/Polyhedron/polyhull1.cc (1.15),
+	  tests/Polyhedron/polyhull2.cc (1.14): Removed the method
+	  upper_bound_assign_and_minimize().
+
+2008-09-17 Wednesday 17:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.354): The method topology() is no
+	  longer public.
+
+2008-09-17 Wednesday 17:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.8): Use new function for interfaces to test if the Polyhedron
+	  is necessarily closed in the code for
+	  ppl_Polyhedron_upper_bound_assign_if_exact/2..
+
+2008-09-17 Wednesday 17:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.46),
+	  ppl_interface_generator_c_h_code.m4 (1.37): The headers and the
+	  code for upper_bound_assign_if_exact() are now generated and bugs
+	  fixed so that they compile.
+
+2008-09-17 Wednesday 17:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.13): Modified
+	  test01() so as to restore the original variables' output
+	  function.  Added test02().
+
+2008-09-17 Wednesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.262): Added one item for PPL 0.10.
+
+2008-09-17 Wednesday 16:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.45): No
+	  longer using Polyhedron::topology() to query for topology of a
+	  Polyhedron; use new function
+	  Interfaces::is_necessarily_closed_for_interfaces.
+
+2008-09-17 Wednesday 16:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.353): Temporarily let topology() be
+	  public again.
+
+2008-09-17 Wednesday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.352), Polyhedron.inlines.hh (1.150):
+	  Befriend new function
+	  Interfaces::is_necessarily_closed_for_interfaces().
+
+2008-09-17 Wednesday 15:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/namespaces.hh (1.14): Added namespace for C++ functions
+	  dedicated to foreign language interfaces.
+
+2008-09-17 Wednesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.27): Updated the documentation about using
+	  the Intel C/C++ compiler.
+
+2008-09-17 Wednesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (1.4): Use better
+	  variable names and avoid variable shadowing.
+
+2008-09-17 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.149): Avoid unnecessary opening and
+	  closing of namespaces.
+
+2008-09-17 Wednesday 13:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+	  (1.8): Use refine_with rather than add for constructing domains.
+
+2008-09-17 Wednesday 13:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: Makefile.am (1.51),
+	  ppl_interface_generator_ocaml_cc.m4 (1.10),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.40),
+	  ppl_interface_generator_ocaml_cc_files.m4 (1.1),
+	  ppl_interface_generator_ocaml_hh_code.m4 (1.1),
+	  ppl_interface_generator_ocaml_hh_files.m4 (1.1): Enable the
+	  generation of files for separate compilation.  The code in
+	  ppl_interface_generator_ocaml_cc_code.m4 has been separated into
+	  the access code that is now in
+	  ppl_interface_generator_ocaml_hh_code.m4 and the rest that
+	  defines the schematic methods for all the domains.
+
+2008-09-17 Wednesday 13:02  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_classes_cc_code.m4 (1.2),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.57), jni/ppl_java_common.cc (1.43), jni/ppl_java_common.hh
+	  (1.39), parma_polyhedra_library/PPL_Object.java (1.3),
+	  tests/ppl_interface_generator_java_test_java.m4 (1.17),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.35): The
+	  Java interfaces uses now marked pointers to detect if a C++
+	  object should be deleted.  Added some tests to test get_disjunct,
+	  needed to check the code described above.
+
+2008-09-17 Wednesday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (1.3): Added new test
+	  (the one showing a bug in current cloog-ppl implementation of
+	  cloog_domain_simplify).
+
+2008-09-17 Wednesday 10:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.11): Added
+	  the generation for the inclusion of "interfaced_boxes.hh".
+
+2008-09-17 Wednesday 10:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.10):
+	  Redundant code removed.
+
+2008-09-17 Wednesday 10:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.82): The
+	  pattern "box" for bounding and covering boxes was unused;
+	  removed..
+
+2008-09-17 Wednesday 09:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.34): Added the dependency of
+	  ppl_interface_instantiations.m4 from Makefile; the former listed
+	  in CLEANFILES (not DISTCLEANFILES).
+
+2008-09-17 Wednesday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (1.29): Avoid unnecessary opening and closing
+	  of namespaces.
+
+2008-09-17 Wednesday 09:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+	  (1.2): Cut-and-paste typo fixed in names of generated files.
+
+2008-09-17 Wednesday 09:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/: Makefile.am (1.22),
+	  ppl_interface_generator_java_classes_cc_code.m4 (1.1),
+	  ppl_interface_generator_java_classes_cc_files.m4 (1.1): Build
+	  separate implementation files for each domains.
+
+2008-09-17 Wednesday 07:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (1.8): Restored a test that was
+	  temporarily commented out.
+
+2008-09-16 Tuesday 20:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.82): Ensure the generated tests work for C_Polyhedron x Grid
+	  product domains (checked using constraints_reduction)..
+
+2008-09-16 Tuesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.9): The upper_bound_assign_if_exact methods are now
+	  interfaced.
+
+2008-09-16 Tuesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.44),
+	  ppl_interface_generator_c_h_code.m4 (1.36): Minor correction to
+	  the declaration of the powerset object for begin/end
+	  const_iterator methods.
+
+2008-09-16 Tuesday 14:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.81),
+	  src/Pointset_Powerset.defs.hh (1.53): Corrected a comment in
+	  Pointset_Powerset.defs.hh and simplified the generation of the
+	  binary operator procedures in the interfaces.
+
+2008-09-16 Tuesday 13:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.80),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.7),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (1.8), interfaces/Prolog/SICStus/sp_predicate_check.pl (1.9),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.81), src/Grid.inlines.hh (1.28), src/Grid_public.cc (1.87):
+	  Moved method add_constraints() from Grid.inlines.hh to
+	  Grid_public.cc.
+
+	  Removed the bop_assign and bop_assign_and_minimize from the
+	  Prolog generated code and inlined the code.
+
+	  Enable upper_bound_assign method for the Pointset_Powerset
+	  domains in all the interfaces.
+
+	  Adapted the tests in the predicate_check generated test file so
+	  as to test correctly these changes.
+
+2008-09-16 Tuesday 10:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.43),
+	  ppl_interface_generator_c_h_code.m4 (1.35),
+	  ppl_interface_generator_c_procedure_generators.m4 (1.8): Separate
+	  the new_iterator methods and the type declarations for iterators
+	  from the method for checking for equality.
+
+2008-09-16 Tuesday 10:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.42),
+	  ppl_interface_generator_c_h_code.m4 (1.34): Added declaration and
+	  implementation of `new' functions for Pointset_Powerset
+	  iterators.
+
+2008-09-16 Tuesday 09:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (1.27), src/Grid_nonpublic.cc (1.38),
+	  src/Grid_public.cc (1.86), tests/Grid/addconstraint1.cc (1.18),
+	  tests/Grid/addconstraints1.cc (1.19): Ensure the grid is not
+	  marked empty before calling the *_no_check methods. Added tests
+	  to check this.  Code for several methods concerning adding
+	  constraints and congruences moved to the Grid.inlines.cc file.
+
+2008-09-16 Tuesday 08:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.57): Avoid singleton
+	  variable warning.
+
+2008-09-16 Tuesday 08:14  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.41): Fixed typo.
+
+2008-09-16 Tuesday 08:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.142): Minor simplification in the
+	  control path.
+
+2008-09-16 Tuesday 08:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.169), Octagonal_Shape.inlines.hh
+	  (1.40): Avoid a warning.
+
+2008-09-16 Tuesday 01:35  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_globals.cc (1.15): Avoid, when
+	  possible, long lines to comply to STANDARDS.
+
+2008-09-16 Tuesday 01:27  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.56),
+	  ppl_java_common.cc (1.42), ppl_java_common.hh (1.38),
+	  ppl_java_globals.cc (1.14): Let `get_ptr' return a pointer
+	  instead of a jlong in order to simplify the implementation of
+	  marked pointers.
+
+2008-09-15 Monday 22:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* configure.ac (1.351): Removed a line added in previous commit so
+	  as to enable the build.
+
+2008-09-15 Monday 21:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (1.141),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.16): Fixed bug shown
+	  by test07 in tests/Polyhedron/boundedaffineimage1.cc
+
+2008-09-15 Monday 21:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (1.15): test07 added that
+	  shows an assertion failure in refine_no_check.  The call to this
+	  test temporarily commented out.
+
+2008-09-15 Monday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.350), interfaces/Prolog/SWI/Makefile.am (1.92):
+	  Added missing -dlopen for target predicate_check_test.
+
+2008-09-15 Monday 17:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.55),
+	  Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.2), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.34), OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+	  (1.7): Completed changes reported in previous commit.
+
+2008-09-15 Monday 17:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.27), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.41),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.33),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.39),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.36),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.27),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.6),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (1.7),
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.8), interfaces/Prolog/SICStus/sp_predicate_check.pl (1.8),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.34),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.80), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.12), src/Polyhedron.defs.hh (1.351): The method topology()
+	  made public.
+
+	  The code for upper_bound_assign_if_exact() added to the C
+	  interface.  The predicates for the same methods in the Prolog
+	  interface now no longer need the topology  (for the Polyhedron
+	  class) in the name.
+
+	  The schematic procedure name for these procedures also no longer
+	  has the topology and therefore the use of these in the other
+	  interfaces (Java and OCaml) has also been adapted.
+
+	  Some updating of the Prolog interface files for other recent
+	  changes.
+
+2008-09-15 Monday 11:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/propagateconstraints2.cc (1.4): Test known to overflow
+	  whe using 16 bit integers.  CVS-
+	  ----------------------------------------------------------------------
+
+2008-09-15 Monday 10:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.28),
+	  XSB/xsb_pl_check.P (1.33),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.79):
+	  Ensure predicates such as ppl_set_rounding_for_PPL that are used
+	  and tested in pl_check.pl are in the module/import lists for Ciao
+	  and XSB.  Remove the bounding box predicates that are no longer
+	  generated from the same lists.
+
+2008-09-15 Monday 10:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.26),
+	  C/ppl_c_implementation_common.cc (1.2),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.40),
+	  C/ppl_interface_generator_c_h_code.m4 (1.32),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.7),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.35),
+	  Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.7),
+	  Prolog/tests/pl_check.pl (1.56): Remove the procedures
+	  new_..._from_bounding_box, new_..._from_covering_box and the
+	  get_bounding_box and get_covering_box from the interfaces.
+
+	  Bug in the increment/decrement iterator method in the C interface
+	  fixed.
+
+2008-09-15 Monday 09:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.39),
+	  ppl_interface_generator_c_h_code.m4 (1.31): Fixed some more bugs
+	  in the C interface code.
+
+2008-09-15 Monday 08:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.38),
+	  ppl_interface_generator_c_h_code.m4 (1.30): Added code for
+	  dereferencing the iterator for a pointset_powerset.
+
+2008-09-14 Sunday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.71): Previous changes reverted.
+
+2008-09-14 Sunday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/propagateconstraints2.cc (1.3): Temporarily make sure
+	  the test always succeeds.
+
+2008-09-14 Sunday 20:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.70): Completing the change to disable
+	  propagateconstraints2.
+
+2008-09-14 Sunday 20:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.69): Temporarily disable test
+	  propagateconstraints2.
+
+2008-09-14 Sunday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/tests/ppl_ocaml_tests_common (1.4): Applied
+	  minimal changes to let the tests succeed according to the new
+	  semantics for constraint/congruence addition.
+
+2008-09-14 Sunday 18:35  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.16),
+	  NNC_Polyhedron_test1.java (1.3): Load the library with the
+	  correct name.
+
+2008-09-14 Sunday 18:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/tests/:
+	  ppl_interface_generator_java_test_java_code.m4 (1.33),
+	  ppl_java_tests_common (1.9): Tests adapted to the new semantics
+	  of add_constraint(s).  SOme variable renamings, so as to
+	  "improve" readability.
+
+2008-09-14 Sunday 18:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refinewithconstraints1.cc (1.6): Test 7 fails on 8 bit
+	  integers.
+
+2008-09-14 Sunday 16:43  Andrea Cimino
+
+	* interfaces/Java/ppl_java_common_dox (1.5): The `ppl_' prefix is
+	  not used in the name of the methods in the Java interface.
+
+2008-09-14 Sunday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Congruence.java
+	  (bounded_arithmetic.1): file Congruence.java was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Generator_System.java
+	  (bounded_arithmetic.1): file Generator_System.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+	  (bounded_arithmetic.1): file MIP_Problem_Status.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/Variables_Set.java
+	  (bounded_arithmetic.1): file Variables_Set.java was added on
+	  branch bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 16:24  Andrea Cimino
+
+	* configure.ac (1.349), interfaces/Java/Makefile.am (1.20),
+	  interfaces/Java/jni/Makefile.am (1.21),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.14),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.54), interfaces/Java/jni/ppl_java_common.cc (1.41),
+	  interfaces/Java/jni/ppl_java_common.hh (1.37),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.13),
+	  interfaces/Java/parma_polyhedra_library/By_Reference.java (1.2),
+	  interfaces/Java/parma_polyhedra_library/Coefficient.java (1.2),
+	  interfaces/Java/parma_polyhedra_library/Congruence.java (1.2),
+	  interfaces/Java/parma_polyhedra_library/Congruence_System.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Constraint.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Constraint_System.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Generator.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Generator_System.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Generator_Type.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Makefile.am (1.2),
+	  interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/PPL_Object.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Pair.java (1.2),
+	  interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Partial_Function.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Variable.java
+	  (1.2), interfaces/Java/parma_polyhedra_library/Variables_Set.java
+	  (1.2),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.2), interfaces/Java/tests/C_Polyhedron_test1.java (1.15),
+	  interfaces/Java/tests/NNC_Polyhedron_test1.java (1.2),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.5),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.16): The name of the package of the Java Parma Polyhedra
+	  Library interface is now `parma_polyhedra_library'.
+
+2008-09-14 Sunday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc (1.12): The banner now includes the names of all
+	  those that appear in the CREDITS file.
+
+2008-09-14 Sunday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.23): Updated.
+
+2008-09-14 Sunday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/parma_polyhedra_library/.cvsignore
+	  (bounded_arithmetic.1): file .cvsignore was added on branch
+	  bounded_arithmetic on 2008-10-29 20:45:28 +0000
+
+2008-09-14 Sunday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.348), interfaces/Java/Makefile.am (1.19),
+	  interfaces/Java/parma_polyhedra_library/.cvsignore (1.1),
+	  interfaces/Java/parma_polyhedra_library/By_Reference.java (1.1),
+	  interfaces/Java/parma_polyhedra_library/Coefficient.java (1.1),
+	  interfaces/Java/parma_polyhedra_library/Congruence.java (1.1),
+	  interfaces/Java/parma_polyhedra_library/Congruence_System.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/Constraint.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Constraint_System.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/Generator.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Generator_System.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Generator_Type.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/MIP_Problem.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/Makefile.am (1.1),
+	  interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/PPL_Object.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/Pair.java (1.1),
+	  interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Partial_Function.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/Variable.java
+	  (1.1), interfaces/Java/parma_polyhedra_library/Variables_Set.java
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
+	  (1.1),
+	  interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
+	  (1.1): In order to implement the change of the Java package name
+	  from `ppl_java' to `parma_polyhedra_library', the contents of
+	  directory interfaces/Java/ppl_java has been moved to
+	  interfaces/Java/parma_polyhedra_library.
+
+2008-09-14 Sunday 13:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.168): Avoid warning (that was only
+	  showing up when assertions are not enabled).
+
+2008-09-14 Sunday 13:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (1.39): Avoid a warning (that was
+	  showing up only when assertions are disabled.
+
+2008-09-14 Sunday 12:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.234), TODO (1.261): Updated.
+
+2008-09-14 Sunday 12:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.79): No
+	  longer interfacing methods bds_hull, oct_hull and (Grid) join.
+
+2008-09-14 Sunday 12:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.132), BD_Shape.inlines.hh (1.167),
+	  BD_Shape.templates.hh (1.118), Box.defs.hh (1.63), Box.inlines.hh
+	  (1.38), Box.templates.hh (1.128), Grid.defs.hh (1.83),
+	  Grid.inlines.hh (1.26), Grid_chdims.cc (1.26), Grid_public.cc
+	  (1.85), Octagonal_Shape.defs.hh (1.58),
+	  Octagonal_Shape.inlines.hh (1.38), Octagonal_Shape.templates.hh
+	  (1.87), Polyhedron.defs.hh (1.350), Polyhedron.inlines.hh
+	  (1.148): Classes Box, BD_Shape, Octagonal_Shape and Grid no
+	  longer provide methods such as bds_hull_*, join_*,
+	  bds_difference_* and grid_difference*.  The uniformly named
+	  methods upper_bound_* and difference_assign should be used
+	  instead.  For (C and NNC) polyhedra, the poly_hull_* and
+	  poly_difference_assign methods have been kept for backward
+	  compatibility.
+
+2008-09-14 Sunday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/propagateconstraints2.cc (1.2): Use check_result().
+
+2008-09-14 Sunday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.68), closure1.cc (1.9),
+	  propagateconstraints2.cc (1.1): Renamed.
+
+2008-09-14 Sunday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/closure1.cc (1.8): Test program completed and
+	  corrected.
+
+2008-09-14 Sunday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (1.8): Query-replace bug corrected.
+
+2008-09-14 Sunday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (1.9): Tests from 1 to 7 re-commented out.
+
+2008-09-14 Sunday 11:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/bdsdifference1.cc (1.19), BD_Shape/bdshull1.cc
+	  (1.20), BD_Shape/bhmz05widening1.cc (1.19),
+	  BD_Shape/cc76extrapolation1.cc (1.24), BD_Shape/membytes1.cc
+	  (1.8), Box/boxdifference1.cc (1.11), Box/boxhull1.cc (1.8),
+	  Box/pointsetpowerset1.cc (1.8), Grid/affineimage2.cc (1.15),
+	  Grid/griddifference1.cc (1.15), Grid/join1.cc (1.19),
+	  Grid/join2.cc (1.14), Grid/membytes1.cc (1.13),
+	  Grid/powersetdifference1.cc (1.7), Octagonal_Shape/membytes1.cc
+	  (1.8), Octagonal_Shape/octdifference1.cc (1.6),
+	  Octagonal_Shape/octhull1.cc (1.8), Polyhedron/affineimage2.cc
+	  (1.13), Polyhedron/append1.cc (1.14), Polyhedron/append2.cc
+	  (1.13), Polyhedron/bhrz03widening1.cc (1.13),
+	  Polyhedron/bhrz03widening3.cc (1.17),
+	  Polyhedron/boundedbhrz03extrapolation1.cc (1.12),
+	  Polyhedron/dualhypercubes.cc (1.17), Polyhedron/exceptions1.cc
+	  (1.17), Polyhedron/exceptions2.cc (1.14), Polyhedron/hybrid.cc
+	  (1.7), Polyhedron/linearpartition1.cc (1.16),
+	  Polyhedron/membytes1.cc (1.17), Polyhedron/nncminimize1.cc (1.9),
+	  Polyhedron/permute.cc (1.11), Polyhedron/polydifference1.cc
+	  (1.14), Polyhedron/polydifference2.cc (1.14),
+	  Polyhedron/polyhull1.cc (1.14), Polyhedron/polyhull2.cc (1.13),
+	  Powerset/pointsetpowerset1.cc (1.2): Do not use
+	  [box|bds|oct|poly]_hull_* or join_*; rather, systematically use
+	  methods upper_bound_*.  Similarly, do not use
+	  [...]_difference_assign, prefer difference_assign.
+
+2008-09-14 Sunday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (1.19): Type
+	  declarations must be generated before the rest of the code.
+
+2008-09-14 Sunday 10:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.78): The
+	  Pointset_Powerset domain does not provide poly_difference_assign.
+
+2008-09-14 Sunday 10:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.cc (1.24), Pointset_Powerset.defs.hh
+	  (1.52), Pointset_Powerset.inlines.hh (1.17): The
+	  Pointset_Powerset domain should *not* provide a
+	  poly_difference_assign method (it provides the difference_assign
+	  method).
+
+2008-09-14 Sunday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (1.29): Fixed a
+	  bug when building from a C or NNC Polyhedron.
+
+2008-09-14 Sunday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (1.28): Another
+	  bug in the schematic code for ppl_c_domains.h fixed.
+
+2008-09-13 Saturday 23:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (1.27): Fixed
+	  some bugs in the schematic code.
+
+2008-09-13 Saturday 23:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/pointsetpowerset1.cc (1.5),
+	  Octagonal_Shape/mapspacedims1.cc (1.6): Commented-out code
+	  removed.
+
+2008-09-13 Saturday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.67), closure1.cc (1.7): Reactivated
+	  the closure1.cc test program.
+
+2008-09-13 Saturday 22:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.68): Let the documentation of foreign language
+	  interfaces also depend on the Doxygen GPL and GFDL licence files.
+
+2008-09-13 Saturday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.66), interval1.cc (1.7), interval2.cc
+	  (1.7): Generalized and reactivated interval1.cc.  Removed now
+	  redundant interval2.cc.
+
+2008-09-13 Saturday 21:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (1.8): Avoid Doxygen error
+	  (adding group "version" to itself).
+
+2008-09-13 Saturday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.65), propagateconstraints1.cc (1.1),
+	  refinewithconstraints1.cc (1.5): Tests for
+	  Box::propagate_constraints() moved from refinewithconstraints1.cc
+	  to new file propagateconstraints1.cc.
+
+2008-09-13 Saturday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/propagateconstraints1.cc (bounded_arithmetic.1): file
+	  propagateconstraints1.cc was added on branch bounded_arithmetic
+	  on 2008-10-29 20:45:38 +0000
+
+2008-09-13 Saturday 21:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.62), Box.inlines.hh (1.37): Added methods
+	  void propagate_constraint(const Constraint&) and void
+	  propagate_constraints(const Constraint_System&).
+
+2008-09-13 Saturday 20:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithcongruences1.cc (1.2): Corrected the
+	  expected result of test05: refining a polyhedron with a trivially
+	  inconsistent proper congruence is no longer ignored, so that the
+	  polyhedron becomes empty.
+
+2008-09-13 Saturday 20:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.349), Polyhedron_nonpublic.cc (1.85),
+	  Polyhedron_public.cc (1.140): Private helper method
+	  refine_no_check() moved to Polyhedron_nonpublic.cc; also, the
+	  method now asserts !marked_empty() instead of checking it.  In
+	  method add_(recycled)_constraint(s), no longer throwing a
+	  topology exception if the added strict inequalities are trivially
+	  inconsistent.  Removed TODO comments from deprecated methods.
+	  Corrected several exception messages for the new refine_with_*
+	  methods.  In several places, prefer refine_no_check() to
+	  add_constraint().
+
+2008-09-13 Saturday 20:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.50), Polyhedron_widenings.cc
+	  (1.68): Prefer add_recycled_constraints() to add_constraints(),
+	  when possible.
+
+2008-09-13 Saturday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h (1.2): Cosmetic improvements.
+
+2008-09-13 Saturday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_files.m4 (1.9),
+	  ppl_interface_generator_c_h.m4 (1.18),
+	  ppl_interface_generator_c_hh_files.m4 (1.7): Improved the
+	  generated comments.
+
+2008-09-13 Saturday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.53): List ppl_c.h in BUILT_SOURCES.
+
+2008-09-13 Saturday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.52): Correctly use the *CLEANFILES
+	  variables.  Use a stamp to produce the domain-dependent C++
+	  implementation files.
+
+2008-09-13 Saturday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_header.h (1.1): This is the main file used to
+	  build ppl_c.h.
+
+2008-09-13 Saturday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.39): Added a section about "Standards for Writing
+	  the Makefile.am Files".
+
+2008-09-13 Saturday 16:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.348), Polyhedron.inlines.hh (1.147):
+	  Get rid of methods add_grid_generator(s).
+
+2008-09-13 Saturday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.186): The Any_Pointset class is not ready for
+	  distribution: make sure we do not distribute it by mistake.
+
+2008-09-13 Saturday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.347), interfaces/C/Makefile.am (1.51),
+	  interfaces/C/ppl_c_implementation.cc (1.4),
+	  interfaces/C/ppl_c_implementation.defs.hh (1.5),
+	  interfaces/C/ppl_c_implementation.inlines.hh (1.4),
+	  interfaces/C/ppl_c_implementation_common.cc (1.1),
+	  interfaces/C/ppl_c_implementation_common.defs.hh (1.1),
+	  interfaces/C/ppl_c_implementation_common.inlines.hh (1.1),
+	  interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.8),
+	  interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.6): More
+	  code reorganization in the C interface.
+
+2008-09-13 Saturday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: addconstraint1.cc (1.17), addconstraints1.cc (1.18):
+	  Corrected a couple of tests to comply with the new specification
+	  of add_constraint(s).
+
+2008-09-13 Saturday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.82), Grid.inlines.hh (1.25),
+	  Grid_nonpublic.cc (1.37), Grid_public.cc (1.84): Added private
+	  helper methods add_constraint/congruence_no_check and
+	  refine_no_check. Adapted to new semantics whereby refining will
+	  ignore nontrivial inequalities, whereas adding will throw.
+
+2008-09-13 Saturday 15:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_chdims.cc (1.25): Prefer add_recycle_* to simple add_*.
+
+2008-09-13 Saturday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_widenings.cc (1.19): When possible, prefer
+	  add_recycled_congruences to add_congruences.
+
+2008-09-13 Saturday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c_implementation.defs.hh (1.4),
+	  ppl_c_implementation.inlines.hh (1.3),
+	  ppl_interface_generator_c_cc_code.m4 (1.37): Some code
+	  reorganized and comments added.
+
+2008-09-13 Saturday 15:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (1.57): Typo corrected.
+
+2008-09-13 Saturday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.78): Obsolete file removed.
+
+2008-09-13 Saturday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.50),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.16),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.17),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.12),
+	  src/Makefile.am (1.185): Use a better machinery to generate
+	  ppl_c.h.
+
+2008-09-13 Saturday 11:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: refinewithconstraint1.cc (1.3),
+	  refinewithconstraints1.cc (1.4), refinewithconstraints2.cc (1.3):
+	  Those tests that were written to check constraint propagation
+	  (rather than syntactical refinement) temporarily disabled.
+
+2008-09-13 Saturday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.7): Cleaned
+	  generator so that ppl_c_fixed.cc is not generated.
+
+2008-09-13 Saturday 09:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: Makefile.am (1.49),
+	  ppl_interface_generator_c_cc.m4 (1.19): We no longer need to
+	  generate the file ppl_c.cc.
+
+2008-09-13 Saturday 08:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.346), interfaces/C/Makefile.am (1.48),
+	  interfaces/C/ppl_c_implementation.cc (1.3),
+	  interfaces/C/ppl_c_implementation.defs.hh (1.3): The C interface
+	  is operational again.
+
+2008-09-13 Saturday 07:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.5):
+	  Simplified the generation of the files and added extra fixed code
+	  to the generated domain files.
+
+2008-09-13 Saturday 07:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.4): More
+	  unwanted code in the generated files removed.
+
+2008-09-13 Saturday 07:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.3): Doxygen
+	  commenting removed from generated .hh files.
+
+2008-09-13 Saturday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (1.6): Little adaptation for the systems where
+	  mp_limb_t is not a long.
+
+2008-09-12 Friday 23:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.56), Octagonal_Shape.inlines.hh
+	  (1.37), Octagonal_Shape.templates.hh (1.86): Added private helper
+	  methods refine_no_check() for constraint and congruence.
+
+2008-09-12 Friday 22:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.131), BD_Shape.inlines.hh (1.166),
+	  BD_Shape.templates.hh (1.117): Added private helper methods
+	  refine_no_check() for constraint and congruence.
+
+2008-09-12 Friday 22:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.6): Revised
+	  the domain specific generated files.
+
+2008-09-12 Friday 22:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_hh_files.m4 (1.2): Removed
+	  the preamble from the ppl_c_domains.hh generated file.
+
+2008-09-12 Friday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.345): C interface temporarily removed from the
+	  ones built by default.
+
+2008-09-12 Friday 22:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: Makefile.am (1.47),
+	  ppl_interface_generator_c_hh_files.m4 (1.1): Generate the header
+	  files for the C interface.
+
+2008-09-12 Friday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.344): Define variables for the C interface.
+
+2008-09-12 Friday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.46), ppl_c_implementation.cc (1.2),
+	  ppl_c_implementation.defs.hh (1.2),
+	  ppl_c_implementation.inlines.hh (1.2): Code reorganized.
+
+2008-09-12 Friday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.55), Octagonal_Shape.inlines.hh
+	  (1.36), Octagonal_Shape.templates.hh (1.85): Adapted methods
+	  add_constraint/congruences and constructors so as to throw
+	  exceptions if faced with something that is nontrivial and not
+	  octagonal.  Also improved the precision of conversion
+	  constructors.
+
+2008-09-12 Friday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.127): Simplified implementation of teh
+	  constructor of a Box from a product domain.
+
+2008-09-12 Friday 17:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: congruences1.cc (1.5), membytes1.cc
+	  (1.7), octhull1.cc (1.7): Adapted to the new specification of
+	  add_constraint/congruence.
+
+2008-09-12 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.5): Amended
+	  to include "ppl_c_implementation.defs.hh".
+
+2008-09-12 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.45): Updated the libppl_c_la_*
+	  variables.
+
+2008-09-12 Friday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c_implementation.cc (1.1),
+	  ppl_c_implementation.defs.hh (1.1),
+	  ppl_c_implementation.inlines.hh (1.1): New files containing the
+	  domain-independent part of the C interface implementation.
+
+2008-09-12 Friday 14:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: pointsetpowerset2.cc (1.3), unconstrain1.cc (1.2):
+	  Fixed a couple of tests.
+
+2008-09-12 Friday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.126): Old implementation for
+	  refine_no_check renamed propagate_constraint_no_check.  Provided
+	  new implementation that just does a syntactic refinement.  Avoid
+	  code repetitions by calling add_interval_constraint_no_check.
+	  When building a Box from a Polyhedron in polynomial time, use the
+	  method refine_with_constraints() applied to a simplified copy of
+	  the constraints of the polyhedron.
+
+2008-09-12 Friday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.61), Box.inlines.hh (1.36): Added new
+	  (private) method add_interval_constraint_no_check, to be used
+	  when adding or refining after having checked that the constraint
+	  is a non-trivial interval constraint.  Removed the comments for
+	  several private methods: they had a FIXME, but were anyway
+	  misleading; they now have a WRITE ME.
+
+2008-09-12 Friday 13:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.4): Include
+	  "#include"'s in all the files.
+
+2008-09-12 Friday 12:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.3): Comment
+	  bug fixed.
+
+2008-09-12 Friday 11:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_files.m4 (1.2): Files
+	  names should include "c_".
+
+2008-09-12 Friday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (1.18): Revert
+	  previous (unintended) change.
+
+2008-09-12 Friday 11:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: Makefile.am (1.44),
+	  ppl_interface_generator_c_cc.m4 (1.17),
+	  ppl_interface_generator_c_cc_files.m4 (1.1): New file that
+	  generates code that can be split into separate files.
+
+2008-09-12 Friday 10:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.83), tests/Grid/addconstraint1.cc (1.16),
+	  tests/Grid/addconstraints1.cc (1.17),
+	  tests/Grid/refinewithcongruences1.cc (1.2),
+	  tests/Grid/refinewithconstraints1.cc (1.2): When the constraint
+	  is an inequality and inconsistent, then adding it to a grid or
+	  using it to refine the grid will result in the empty grid.
+
+	  Tests added to check this.
+
+2008-09-12 Friday 10:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.233): Mention the renaming of
+	  Congruence::is_trivial_true/false methods.
+
+2008-09-12 Friday 10:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.116), src/Box.templates.hh (1.125),
+	  src/Congruence.cc (1.20), src/Congruence.defs.hh (1.25),
+	  src/Congruence_System.cc (1.30), src/Grid_nonpublic.cc (1.36),
+	  src/Grid_public.cc (1.82), src/Octagonal_Shape.templates.hh
+	  (1.84), src/Polyhedron_public.cc (1.139),
+	  tests/Grid/congruence1.cc (1.20): Methods
+	  Congruence::is_trivial_true() and Congruence::is:trivial_false()
+	  renamed as Congruence::is_tautological() and
+	  Congruence::is_inconsistent(), so as to have a more similar
+	  interface wrt class Constraint.
+
+2008-09-12 Friday 08:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.124): Corrected method
+	  refine_no_check(const Congruence&) to also consider the case of
+	  trivailly true/false congruences.  Added a FIXME regarding the
+	  handling of proper congruences in the case of bozes based on
+	  intervals supportng restrictins.
+
+2008-09-12 Friday 08:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refinewithcongruences1.cc (1.3): New test04 check for
+	  the refinement of a Box using a trivially false congruence.
+
+2008-09-12 Friday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.123): Corrected refine_no_check(const
+	  Constraint&) so as to also deal with the case of trivially
+	  true/false constraints.
+
+2008-09-12 Friday 01:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: generalizedaffineimage1.cc (1.17),
+	  generalizedaffineimage2.cc (1.6): test20 in
+	  generalizedaffineimage1.cc removed, as it was identical to test17
+	  in generalizedaffineimage2.cc.
+
+2008-09-12 Friday 01:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.35), Box.templates.hh (1.122): Modified
+	  methods add_constraint(s) and add_congruence(s) so as to throw
+	  exceptions if a non-interval constraint/congruence is being
+	  added.  Modified the (generalized_)affine_(pre)image methods so
+	  as to use refine_with_constraint() instead of add_constraint()
+	  method.  Added a couple of FIXME/CHECKME.
+
+2008-09-12 Friday 01:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.130), BD_Shape.templates.hh (1.115):
+	  Avoid definition and use of duplicated exception thrower
+	  function.  Added a fixme regarding exceptions thrown by
+	  add_constraint for strict inequalities.
+
+2008-09-12 Friday 01:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.14), addspacedims1.cc (1.9),
+	  affineimage1.cc (1.11), affinepreimage1.cc (1.8),
+	  bgp99extrapolation1.cc (1.6), boundedaffinepreimage1.cc (1.9),
+	  cc76narrowing1.cc (1.8), concatenate1.cc (1.9), congruences1.cc
+	  (1.5), constraints1.cc (1.12), contains1.cc (1.7), discrete1.cc
+	  (1.7), disjoint1.cc (1.7), expandspacedim1.cc (1.10),
+	  foldspacedims1.cc (1.10), generalizedaffineimage1.cc (1.16),
+	  intersection1.cc (1.11), mapspacedims1.cc (1.8), max_min1.cc
+	  (1.9), pointsetpowerset1.cc (1.7), refinewithcongruences1.cc
+	  (1.2), relations1.cc (1.7), relations2.cc (1.6),
+	  removespacedims1.cc (1.11), timeelapse1.cc (1.10), universe1.cc
+	  (1.6), writebox1.cc (1.6): Avoid exceptions when adding
+	  (non-interval) constraints to boxes.
+
+2008-09-12 Friday 00:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refinewithconstraint1.cc (1.2): New test04 shows a bug
+	  in Box::refine_with_constraint() related to the handling of
+	  trivially false constraints.
+
+2008-09-11 Thursday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.77): Typo fixed.
+
+2008-09-11 Thursday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.76): First
+	  separate-compilation changes.
+
+2008-09-11 Thursday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore, ChangeLog, INSTALL, Makefile.am, NEWS, TODO,
+	  config.guess, config.rpath, config.sub, configure.ac, instchk.hh,
+	  ltmain.sh, Watchdog/ChangeLog, Watchdog/INSTALL,
+	  Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/ltmain.sh,
+	  Watchdog/doc/Makefile.am, Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in,
+	  Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/m4/libtool.m4,
+	  Watchdog/m4/ltoptions.m4, Watchdog/m4/ltsugar.m4,
+	  Watchdog/m4/ltversion.m4, Watchdog/src/Makefile.am,
+	  Watchdog/utils/Makefile.am, demos/ppl_lpsol/.cvsignore,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	  doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-java-interface.doxyconf-html.in,
+	  doc/devref-java-interface.doxyconf-latex.in,
+	  doc/devref-java-interface.tex,
+	  doc/devref-ocaml-interface.doxyconf-html.in,
+	  doc/devref-ocaml-interface.doxyconf-latex.in,
+	  doc/devref-ocaml-interface.tex,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref-prolog-interface.tex, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/libppl.3, doc/ppl-config.1,
+	  doc/ppl_lcdd.1, doc/ppl_lpsol.1,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in,
+	  doc/user-java-interface.doxyconf-html.in,
+	  doc/user-java-interface.doxyconf-latex.in,
+	  doc/user-java-interface.tex,
+	  doc/user-ocaml-interface.doxyconf-html.in,
+	  doc/user-ocaml-interface.doxyconf-latex.in,
+	  doc/user-ocaml-interface.tex,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  fedora/ppl.spec, interfaces/Makefile.am,
+	  interfaces/marked_pointers.hh,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dox.m4,
+	  interfaces/Java/ppl_interface_generator_java_dox_code.m4,
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+	  interfaces/Java/ppl_java_common_dox,
+	  interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/NNC_Polyhedron_test1.java,
+	  interfaces/Java/tests/Test_Executor.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/.cvsignore, interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/OCaml_interface.dox,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/OCaml/ppl_ocaml_globals.ml, interfaces/OCaml/test1.ml,
+	  interfaces/OCaml/tests/.cvsignore,
+	  interfaces/OCaml/tests/Makefile.am,
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4,
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4,
+	  interfaces/OCaml/tests/ppl_ocaml_tests_common,
+	  interfaces/OCaml/tests/test1.ml, interfaces/Prolog/.cvsignore,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+	  interfaces/Prolog/ppl_prolog_common.cc,
+	  interfaces/Prolog/ppl_prolog_common.defs.hh,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/ppl_prolog_common.inlines.hh,
+	  interfaces/Prolog/ppl_prolog_sysdep_dox,
+	  interfaces/Prolog/ppl_prolog_sysindep_dox,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/gprolog_efli.cc,
+	  interfaces/Prolog/GNU/gprolog_efli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sicstus_efli.cc,
+	  interfaces/Prolog/SICStus/sicstus_efli.hh,
+	  interfaces/Prolog/SWI/.cvsignore,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/README.swiprolog,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_efli.cc,
+	  interfaces/Prolog/SWI/swi_efli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/.cvsignore,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4,
+	  interfaces/Prolog/XSB/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_efli.cc,
+	  interfaces/Prolog/XSB/xsb_efli.hh,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_prolog_sysdep.hh,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_efli.cc,
+	  interfaces/Prolog/YAP/yap_efli.hh,
+	  interfaces/Prolog/tests/.cvsignore,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  m4/ac_check_swi_prolog.m4, m4/ac_cxx_double_binary_format.m4,
+	  m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_long_double_binary_format.m4, m4/ax_prefix_config_h.m4,
+	  m4/lib-link.m4, m4/lib-prefix.m4, m4/libtool.m4, m4/ltoptions.m4,
+	  m4/ltsugar.m4, m4/ltversion.m4, src/.cvsignore,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bit_Matrix.cc,
+	  src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.defs.hh,
+	  src/Box.inlines.hh, src/Box.templates.hh,
+	  src/C_Polyhedron.defs.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.templates.hh,
+	  src/Congruence.defs.hh, src/Congruence_System.cc,
+	  src/Congruence_System.inlines.hh, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/Float.defs.hh, src/Float.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Grid.defs.hh, src/Grid.templates.hh, src/Grid_chdims.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/Init.cc, src/Init.defs.hh,
+	  src/Init.inlines.hh, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval_Info.defs.hh,
+	  src/Interval_Info.inlines.hh, src/Interval_Restriction.defs.hh,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.inlines.hh,
+	  src/MIP_Problem.cc, src/Makefile.am, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/NNC_Polyhedron.defs.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.templates.hh,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.templates.hh,
+	  src/Partially_Reduced_Product.defs.hh,
+	  src/Partially_Reduced_Product.inlines.hh,
+	  src/Partially_Reduced_Product.templates.hh,
+	  src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	  src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.templates.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/checked.cc,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/conversion.cc,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.cc, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+	  src/fpu.defs.hh, src/iterator_to_const.defs.hh, src/minimize.cc,
+	  src/ppl_header.hh, src/simplify.cc, tests/Makefile.am,
+	  tests/print.hh, tests/BD_Shape/.cvsignore,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/congruences1.cc,
+	  tests/BD_Shape/constrains1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/frombdshape1.cc, tests/BD_Shape/frombox1.cc,
+	  tests/BD_Shape/fromgrid1.cc,
+	  tests/BD_Shape/fromoctagonalshape1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/membytes1.cc, tests/BD_Shape/timeelapse1.cc,
+	  tests/Box/.cvsignore, tests/Box/Makefile.am,
+	  tests/Box/ascii_dump_load1.cc, tests/Box/boxdifference1.cc,
+	  tests/Box/constrains1.cc, tests/Box/fromgrid1.cc,
+	  tests/Box/frompartiallyreducedproduct1.cc,
+	  tests/Box/refinewithconstraints2.cc, tests/Box/topclosed1.cc,
+	  tests/Grid/.cvsignore, tests/Grid/Makefile.am,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	  tests/Grid/containsintegerpoint1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/directproduct1.cc, tests/Grid/directproduct2.cc,
+	  tests/Grid/directproduct3.cc, tests/Grid/directproduct4.cc,
+	  tests/Grid/directproduct5.cc, tests/Grid/directproduct6.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc, tests/Grid/frombdshape1.cc,
+	  tests/Grid/frombox1.cc, tests/Grid/fromoctagonalshape1.cc,
+	  tests/Grid/frompolyhedron1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generators1.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/join1.cc,
+	  tests/Grid/join2.cc, tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/maxmin1.cc,
+	  tests/Grid/membytes1.cc, tests/Grid/mincongruences1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/partiallyreducedproduct1.cc,
+	  tests/Grid/partiallyreducedproduct2.cc,
+	  tests/Grid/partiallyreducedproduct3.cc,
+	  tests/Grid/partiallyreducedproduct4.cc,
+	  tests/Grid/pointsetpowerset1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/widening1.cc,
+	  tests/Grid/widening3.cc, tests/MIP_Problem/.cvsignore,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/constrains1.cc,
+	  tests/Partially_Reduced_Product/.cvsignore,
+	  tests/Partially_Reduced_Product/Makefile.am,
+	  tests/Partially_Reduced_Product/asciidumpload1.cc,
+	  tests/Partially_Reduced_Product/directproduct1.cc,
+	  tests/Partially_Reduced_Product/directproduct2.cc,
+	  tests/Partially_Reduced_Product/directproduct3.cc,
+	  tests/Partially_Reduced_Product/directproduct4.cc,
+	  tests/Partially_Reduced_Product/directproduct5.cc,
+	  tests/Partially_Reduced_Product/directproduct6.cc,
+	  tests/Partially_Reduced_Product/partiallyreducedproduct1.cc,
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc,
+	  tests/Partially_Reduced_Product/partiallyreducedproduct3.cc,
+	  tests/Partially_Reduced_Product/partiallyreducedproduct4.cc,
+	  tests/Polyhedron/.cvsignore, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/pointsetpowerset2.cc,
+	  tests/Polyhedron/pointsetpowerset3.cc,
+	  tests/Polyhedron/pointsetpowerset4.cc,
+	  tests/Polyhedron/pointsetpowerset5.cc,
+	  tests/Polyhedron/pointsetpowerset6.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/simplifyusingcontext1.cc,
+	  tests/Powerset/.cvsignore, tests/Powerset/Makefile.am,
+	  tests/Powerset/pointsetpowerset1.cc,
+	  tests/Powerset/pointsetpowerset2.cc,
+	  tests/Powerset/pointsetpowerset3.cc,
+	  tests/Powerset/pointsetpowerset4.cc,
+	  tests/Powerset/pointsetpowerset5.cc,
+	  tests/Powerset/pointsetpowerset6.cc, tests/Powerset/powerset1.cc,
+	  tests/Powerset/product1.cc,
+	  tests/Powerset/simplifyusingcontext1.cc, utils/Makefile.am
+	  (bounded_arithmetic.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,2,1,1,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,2,1,2,1,1,1,1,1,1,1,2,2,1,1,1,1,2,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,2,2,1,2,2,2,1,1,1,1,1,2,2,1,2,1,1,2,1,2,2,1,1,1,1,2,1,2,2,1,1,1,1,1,2,2,1,2,2,1,1,1,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1, [...]
+	  First merge of the trunk to the bounded_arithmetic branch.
+
+2008-09-11 Thursday 22:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.81): Improved comments for the
+	  add_constraint(s) methods.
+
+2008-09-11 Thursday 20:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.11), Watchdog/INSTALL (1.8): Updated from Autoconf
+	  2.63.
+
+2008-09-11 Thursday 19:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frompartiallyreducedproduct1.cc (1.3): Prefer
+	  refine_with_* to add_* when stating properties of products
+	  elements.
+
+2008-09-11 Thursday 17:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.5): Typo corrected.
+
+2008-09-11 Thursday 17:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (bounded_arithmetic.1): file partiallyreducedproduct1.cc was
+	  added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 17:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/frombox1.cc (1.6): Undone unintended change.
+
+2008-09-11 Thursday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frombox1.cc (1.3): Corrected expected result for
+	  test11.
+
+2008-09-11 Thursday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/frombox1.cc (bounded_arithmetic.1): file frombox1.cc
+	  was added on branch bounded_arithmetic on 2008-09-11 20:37:53
+	  +0000
+
+2008-09-11 Thursday 16:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Box/frombox1.cc (1.5), Grid/Makefile.am (1.69),
+	  Grid/frombox1.cc (1.1): Tests added for building a grid from a
+	  box.
+
+2008-09-11 Thursday 16:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: frombdshape1.cc (1.4), fromoctagonalshape1.cc (1.4),
+	  grid3.cc (1.29): Added tests in the case that the bd/octagonal
+	  shape is not shortest path closed.  Fixed a comment in
+	  tests/Grid/grid3.cc.
+
+2008-09-11 Thursday 16:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/fromgrid1.cc (1.7): Revised for changes to the grid
+	  domain.
+
+2008-09-11 Thursday 16:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.114): Prefer refine_with_* wrt add_*
+	  in the implementation of generalized affine images and preimages.
+
+2008-09-11 Thursday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: generalizedaffineimage1.cc (1.22), membytes1.cc
+	  (1.7), timeelapse1.cc (1.26): A few test corrected (no longer
+	  adding constraints that are not BD).
+
+2008-09-11 Thursday 15:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: congruences1.cc (1.5), constraints1.cc (1.25):
+	  Corrected according to hte new semantics of
+	  add_constraints/congruences.
+
+2008-09-11 Thursday 15:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.4): Improved a test.
+
+2008-09-11 Thursday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.113): Corrected a couple of bugs in
+	  the new add_congruence implementation.
+
+2008-09-11 Thursday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.165): When converting differently
+	  typed BD_Shape objects, for maximum precision, do enforce
+	  shortest-path closure of the source bds.
+
+2008-09-11 Thursday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frombdshape1.cc (1.4): Avoid exceptions in tests
+	  1--4.
+
+2008-09-11 Thursday 15:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/Makefile.am (1.3): Enable test
+	  asciidumpload1.cc.
+
+2008-09-11 Thursday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/Makefile.am
+	  (bounded_arithmetic.1): file Makefile.am was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frombdshape1.cc (1.3): Added a test for the
+	  conversion from a bds to a differently typed bds.
+
+2008-09-11 Thursday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.inlines.hh (1.30),
+	  Partially_Reduced_Product.templates.hh (1.11): Also dump/load the
+	  reduction Bolean flag.
+
+2008-09-11 Thursday 14:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/asciidumpload1.cc (1.2): When
+	  using products, always prefer refine_with_* instead of add_*.
+
+2008-09-11 Thursday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/asciidumpload1.cc
+	  (bounded_arithmetic.1): file asciidumpload1.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Grid/asciidumpload7.cc (1.6),
+	  Partially_Reduced_Product/asciidumpload1.cc (1.1): Move test for
+	  the product domain into the appropriate directory. Test
+	  temporarily disabled.
+
+2008-09-11 Thursday 14:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.80), src/Grid_public.cc (1.81),
+	  tests/Grid/Makefile.am (1.68), tests/Grid/frombdshape1.cc (1.3),
+	  tests/Grid/fromoctagonalshape1.cc (1.3), tests/Grid/grid3.cc
+	  (1.28), tests/Grid/membytes1.cc (1.12),
+	  tests/Partially_Reduced_Product/Makefile.am (1.2),
+	  tests/Partially_Reduced_Product/directproduct1.cc (1.3),
+	  tests/Partially_Reduced_Product/directproduct3.cc (1.3),
+	  tests/Partially_Reduced_Product/directproduct6.cc (1.3),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (1.3): If a constraint system is not all equalities, then
+	  building a grid from the system will now throw an exception.
+	  Tests adapted for this change.
+
+	  In tests/Grid the asciidumpload7.cc tested ascii_dump and
+	  ascii_load for the product domain. This test fails with the
+	  current changes and has been disabled. When these problems have
+	  been fixed, the test will be moved and enabled in the
+	  tests/Partially_Reduced_Product directory.
+
+2008-09-11 Thursday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct1.cc
+	  (bounded_arithmetic.1): file directproduct1.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct3.cc
+	  (bounded_arithmetic.1): file directproduct3.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct6.cc
+	  (bounded_arithmetic.1): file directproduct6.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (bounded_arithmetic.1): file partiallyreducedproduct2.cc was
+	  added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 14:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frombox1.cc (1.2): Another test.
+
+2008-09-11 Thursday 14:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/fromgrid1.cc (1.5): New test to check that the
+	  appropriate precision is obtained when converting from a grid to
+	  a bd shape.
+
+2008-09-11 Thursday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.3): Only build from equality constraints and congruences -
+	  otherwise build the universe and use the refine_with* methods.
+
+2008-09-11 Thursday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.129), BD_Shape.inlines.hh (1.164),
+	  BD_Shape.templates.hh (1.112): Now methods constructing a
+	  BD_Shape from a constraint system and adding constraints throw
+	  exceptions if an illegal constraint is added.  Also corrected the
+	  conversion constructors from Box and Octagonal_Shape so as to
+	  force an emptiness check, so as to build a precise approximation.
+
+2008-09-11 Thursday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Congruence.defs.hh (1.24): Documentation clarified.
+
+2008-09-11 Thursday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.138): Remove a TODO comment inside a
+	  now deprecated method.
+
+2008-09-11 Thursday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/fromoctagonalshape1.cc (1.4): New test shows that
+	  current implementation of conversion operator is not precise
+	  enough.
+
+2008-09-11 Thursday 12:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.79), src/Grid_public.cc (1.80),
+	  tests/Grid/Makefile.am (1.67), tests/Grid/addconstraint1.cc
+	  (1.15), tests/Grid/addconstraints1.cc (1.16),
+	  tests/Grid/addspacedims1.cc (1.17), tests/Grid/affinedim1.cc
+	  (1.14), tests/Grid/affineimage2.cc (1.14),
+	  tests/Grid/affinepreimage2.cc (1.10),
+	  tests/Grid/asciidumpload1.cc (1.16), tests/Grid/asciidumpload2.cc
+	  (1.8), tests/Grid/bounded1.cc (1.16), tests/Grid/bounds1.cc
+	  (1.17), tests/Grid/certificate1.cc (1.16),
+	  tests/Grid/containsintegerpoint1.cc (1.6),
+	  tests/Grid/coveringbox1.cc (1.18), tests/Grid/discrete1.cc
+	  (1.10), tests/Grid/disjoint1.cc (1.14), tests/Grid/equals1.cc
+	  (1.15), tests/Grid/expandspacedim1.cc (1.14),
+	  tests/Grid/foldspacedims1.cc (1.14),
+	  tests/Grid/frompolyhedron1.cc (1.2),
+	  tests/Grid/generalizedaffineimage1.cc (1.16),
+	  tests/Grid/generalizedaffineimage2.cc (1.15),
+	  tests/Grid/generalizedaffineimage3.cc (1.7),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.18),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.18),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.7),
+	  tests/Grid/generators1.cc (1.15), tests/Grid/grid3.cc (1.27),
+	  tests/Grid/griddifference1.cc (1.14), tests/Grid/join1.cc (1.18),
+	  tests/Grid/join2.cc (1.13), tests/Grid/limitedextrapolation1.cc
+	  (1.15), tests/Grid/limitedextrapolation2.cc (1.9),
+	  tests/Grid/limitedextrapolation3.cc (1.8), tests/Grid/maxmin1.cc
+	  (1.15), tests/Grid/mincongruences1.cc (1.13),
+	  tests/Grid/mingenerators1.cc (1.12),
+	  tests/Grid/outputoperator1.cc (1.11),
+	  tests/Grid/pointsetpowerset1.cc (1.4),
+	  tests/Grid/powersetdifference1.cc (1.6),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.5),
+	  tests/Grid/relations1.cc (1.17), tests/Grid/relations2.cc (1.19),
+	  tests/Grid/relations3.cc (1.10), tests/Grid/removespacedims1.cc
+	  (1.16), tests/Grid/removespacedims2.cc (1.16),
+	  tests/Grid/timeelapse1.cc (1.13), tests/Grid/topclosed1.cc
+	  (1.14), tests/Grid/widening1.cc (1.18), tests/Grid/widening3.cc
+	  (1.8): Removed the add congruence methods where the parameter is
+	  a constraint.  This means that, for example, "A == 0" can only be
+	  added using add_constraint.  To add it as a congruence it should
+	  be written as "(A %= 0) / 0)".  Tests adapted for this change.
+
+2008-09-11 Thursday 10:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.137): Redone change (temporarily
+	  reverted a week ago): now add_congruence(s) method throws an
+	  exception when adding a proper and non-trivial congruence.
+
+2008-09-11 Thursday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.218): Minor improvements to the
+	  documentation for simplify_using_context.
+
+2008-09-11 Thursday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.347): Minor improvement to the
+	  documentation for refine methods.
+
+2008-09-11 Thursday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.8): Another few minor
+	  improvements.
+
+2008-09-11 Thursday 09:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.templates.hh (1.10): When recycling
+	  in the product domains, use refine_with_* for the sub-domain that
+	  cannot recycle.
+
+2008-09-11 Thursday 09:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.7): Added documentation for the
+	  refine, constrains and unconstrain functions.
+
+2008-09-11 Thursday 08:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.29),
+	  tests/Partially_Reduced_Product/directproduct1.cc (1.2),
+	  tests/Partially_Reduced_Product/directproduct2.cc (1.2),
+	  tests/Partially_Reduced_Product/directproduct3.cc (1.2),
+	  tests/Partially_Reduced_Product/directproduct4.cc (1.2),
+	  tests/Partially_Reduced_Product/directproduct5.cc (1.2),
+	  tests/Partially_Reduced_Product/directproduct6.cc (1.2),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.2),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (1.2),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+	  (1.2),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+	  (1.2): Use refine_with_* when adding constraints or congruences
+	  to a product.  Note that this also applies to the
+	  constraints_reduction which needs to share the constraints and
+	  congruences.
+
+2008-09-11 Thursday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct2.cc
+	  (bounded_arithmetic.1): file directproduct2.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct4.cc
+	  (bounded_arithmetic.1): file directproduct4.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/directproduct5.cc
+	  (bounded_arithmetic.1): file directproduct5.cc was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+	  (bounded_arithmetic.1): file partiallyreducedproduct3.cc was
+	  added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+	  (bounded_arithmetic.1): file partiallyreducedproduct4.cc was
+	  added on branch bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-11 Thursday 08:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.6): Remove documentation for
+	  constructors from generic boudning boxes, which have been
+	  replaced by PPL Box instantiations.
+
+2008-09-10 Wednesday 21:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.78), src/Grid_nonpublic.cc (1.35),
+	  src/Grid_public.cc (1.79), tests/Grid/addconstraint1.cc (1.14),
+	  tests/Grid/addconstraints1.cc (1.15): Modified methods
+	  add_(recycled_)constraint(s) in the Grid domain to reflect what
+	  is said in definitions.dox wrt the throwing of exceptions.
+	  Modified tests and added tests to check the new exceptions.  The
+	  *_and_minimize" methods are untouched.
+
+2008-09-10 Wednesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc (1.17): Account for the differences between teTeX
+	  and TeX Live.
+
+2008-09-10 Wednesday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc (1.16): Numbers fixed.
+
+2008-09-10 Wednesday 15:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.260): Removed 2 items that have already been dealt with.
+
+2008-09-10 Wednesday 13:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java_common_dox (1.4): Typo fixed.
+
+2008-09-10 Wednesday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_java_common_dox (bounded_arithmetic.1): file
+	  ppl_java_common_dox was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:44 +0000
+
+2008-09-10 Wednesday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java_common_dox (1.3): Further small
+	  improvements to the documention for the widening operators
+	  documentation..
+
+2008-09-10 Wednesday 13:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_java_common_dox (1.2): Several cut-and-paste
+	  and similar errors fixed.
+
+2008-09-10 Wednesday 12:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_cc_code.m4
+	  (1.4), ppl_interface_generator_prolog_cc_files.m4 (1.6),
+	  ppl_interface_generator_prolog_dox.m4 (1.2),
+	  ppl_interface_generator_prolog_dox_code.m4 (1.2),
+	  ppl_interface_generator_prolog_hh_code.m4 (1.6),
+	  ppl_interface_generator_prolog_hh_files.m4 (1.7): Comments
+	  describing the function of the m4 files corrected.
+
+2008-09-10 Wednesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_cc_code.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_cc_files.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_dox.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_dox_code.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_hh_code.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_prolog_hh_files.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-10 Wednesday 11:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README.doc (1.15): Minor improvements.
+
+2008-09-10 Wednesday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/test1.ml (bounded_arithmetic.1): file
+	  test1.ml was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:45 +0000
+
+2008-09-10 Wednesday 10:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.16),
+	  ppl_ocaml_globals.cc (1.18), ppl_ocaml_globals.ml (1.11),
+	  tests/test1.ml (1.12): Added code for ppl_version() and similar
+	  functions.  Fixed a warning (ppl_ocaml_globals.cc) - caused by
+	  using CAMLparam(0) instead of CAMLparam1(unit) that declares the
+	  dummy parameter "unit".  Fixed a cut-and-paste typo in the mli
+	  fixed code.
+
+2008-09-10 Wednesday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README.doc (1.14): Added advice on how to deal with "TeX
+	  capacity exceeded" errors.
+
+2008-09-09 Tuesday 22:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int32 (1.11): Adapted to the recent
+	  changes in ppl_lpsol.
+
+2008-09-09 Tuesday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (bounded_arithmetic.1): file
+	  Makefile.am was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:45 +0000
+
+2008-09-09 Tuesday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.50), tests/Makefile.am (1.16):
+	  Link with the PPL just built, not with the one that may already
+	  been installed in the system.
+
+2008-09-09 Tuesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.343): Make LIBEXT and SHREXT available to
+	  makefiles.
+
+2008-09-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dox.m4
+	  (bounded_arithmetic.1): file ppl_interface_generator_java_dox.m4
+	  was added on branch bounded_arithmetic on 2008-09-11 20:37:44
+	  +0000
+
+2008-09-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dox_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_java_dox_code.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:44 +0000
+
+2008-09-09 Tuesday 15:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/Makefile.am (1.67),
+	  doc/devref-java-interface.doxyconf-html.in (1.4),
+	  doc/devref-java-interface.doxyconf-latex.in (1.4),
+	  doc/user-java-interface.doxyconf-html.in (1.4),
+	  doc/user-java-interface.doxyconf-latex.in (1.4),
+	  interfaces/Java/Java_interface.dox (1.3),
+	  interfaces/Java/Makefile.am (1.18),
+	  interfaces/Java/ppl_interface_generator_java_dox.m4 (1.1),
+	  interfaces/Java/ppl_interface_generator_java_dox_code.m4 (1.1),
+	  interfaces/Java/ppl_java_common_dox (1.1): Revised the Java
+	  documentation.
+
+2008-09-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-java-interface.doxyconf-html.in
+	  (bounded_arithmetic.1): file
+	  devref-java-interface.doxyconf-html.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-java-interface.doxyconf-latex.in
+	  (bounded_arithmetic.1): file
+	  devref-java-interface.doxyconf-latex.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-java-interface.doxyconf-html.in (bounded_arithmetic.1):
+	  file user-java-interface.doxyconf-html.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-java-interface.doxyconf-latex.in (bounded_arithmetic.1):
+	  file user-java-interface.doxyconf-latex.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-09 Tuesday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/OCaml_interface.dox (1.4): Some typos fixed.
+
+2008-09-09 Tuesday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox (bounded_arithmetic.1): file
+	  OCaml_interface.dox was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:45 +0000
+
+2008-09-09 Tuesday 10:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.259), interfaces/Prolog/tests/pl_check.pl (1.55): Removed
+	  another item from the TODO.  Added a test for the set and restore
+	  rounding predicates.
+
+2008-09-09 Tuesday 10:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.258): Removed an item.
+
+2008-09-09 Tuesday 10:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.217): Revised documentation for the
+	  Pointset Powerset domain.  Reordered sections so that the Grid
+	  documentation comes before the Powerset documentation.
+
+2008-09-09 Tuesday 05:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int16 (1.10): Adapted to the recent
+	  changes in ppl_lpsol.
+
+2008-09-09 Tuesday 05:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/.cvsignore (1.13), tests/Box/.cvsignore (1.4): Updated.
+
+2008-09-08 Monday 22:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/Makefile.am (1.66),
+	  doc/devref-ocaml-interface.doxyconf-html.in (1.3),
+	  doc/devref-ocaml-interface.doxyconf-latex.in (1.3),
+	  interfaces/OCaml/OCaml_interface.dox (1.3): Revised OCaml
+	  documentation.
+
+2008-09-08 Monday 22:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-ocaml-interface.doxyconf-html.in
+	  (bounded_arithmetic.1): file
+	  devref-ocaml-interface.doxyconf-html.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-08 Monday 22:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-ocaml-interface.doxyconf-latex.in
+	  (bounded_arithmetic.1): file
+	  devref-ocaml-interface.doxyconf-latex.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-08 Monday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.270): Previous change reverted, since only
+	  one precompiled header can be used in a particular compilation.
+
+2008-09-08 Monday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.46): Some readability
+	  improvements.
+
+2008-09-08 Monday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/.cvsignore (bounded_arithmetic.1): file
+	  .cvsignore was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:45 +0000
+
+2008-09-08 Monday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/.cvsignore (1.2),
+	  interfaces/OCaml/tests/.cvsignore (1.2),
+	  interfaces/Prolog/SWI/.cvsignore (1.9),
+	  interfaces/Prolog/tests/.cvsignore (1.3): Updated.
+
+2008-09-08 Monday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Polyhedron/.cvsignore (1.7), Grid/.cvsignore (1.3):
+	  Updated.
+
+2008-09-08 Monday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/.cvsignore (1.4): Updated.
+
+2008-09-08 Monday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.269): Precompile ppl_test.hh, if precompiled
+	  headers are requested.
+
+2008-09-08 Monday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.9): Updated.
+
+2008-09-08 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.342): New Automake flag DEBUGGING_ENABLED is true
+	  if we have to compile with debug info.
+
+2008-09-08 Monday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.55): Erased rule to build
+	  obsolete ppl_prolog_main.icc.
+
+2008-09-08 Monday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Partially_Reduced_Product/.cvsignore, Powerset/.cvsignore
+	  (bounded_arithmetic.[1,1]): file .cvsignore was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-09-08 Monday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/.cvsignore (1.3), MIP_Problem/.cvsignore (1.2),
+	  Octagonal_Shape/.cvsignore (1.2),
+	  Partially_Reduced_Product/.cvsignore (1.2), Powerset/.cvsignore
+	  (1.2): Updated.
+
+2008-09-08 Monday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.257), interfaces/Prolog/tests/Makefile.am (1.23): Source
+	  file interfaces/Prolog/tests/ppl_predicate_check_common.pl is no
+	  longer deleted from the source directory.
+
+2008-09-08 Monday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: OCaml/.cvsignore (1.5), Prolog/.cvsignore (1.3),
+	  Prolog/XSB/.cvsignore (1.7): Updated.
+
+2008-09-08 Monday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.15): In Fedora, SWI-Prolog.h is
+	  installed in /usr/include/pl.
+
+2008-09-08 Monday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.48), configure.ac (1.341), Watchdog/configure.ac
+	  (1.46), Watchdog/utils/Makefile.am (1.11),
+	  demos/ppl_lpsol/Makefile.am (1.45), interfaces/OCaml/Makefile.am
+	  (1.49), interfaces/OCaml/tests/Makefile.am (1.15),
+	  interfaces/Prolog/SICStus/Makefile.am (1.93), utils/Makefile.am
+	  (1.19): Use AC_PROG_SED in configure.ac's and $(SED), instead of
+	  plain `sed', in Makefile.am's.
+
+2008-09-08 Monday 14:54  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.15),
+	  ppl_ocaml_globals.cc (1.17), ppl_ocaml_globals.ml (1.10),
+	  tests/test1.ml (1.11): Added - ppl_set_rounding_for_PPL -
+	  ppl_restore_pre_PPL_rounding to the OCaml interface.
+
+2008-09-08 Monday 14:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.3): Include the new predicates ppl_set_rounding_for_PPL and
+	  ppl_restore_pre_rounding_for_PPL  in the list of fixed
+	  predicates.
+
+2008-09-08 Monday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.77), Grid.templates.hh (1.36),
+	  Grid_simplify.cc (1.39): Code controlled by STRONG_REDUCTION
+	  moved to the appropriate place.
+
+2008-09-08 Monday 14:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.25): Commet improved.
+
+2008-09-08 Monday 14:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/Makefile.am (1.65),
+	  doc/devref-prolog-interface.doxyconf-html.in (1.9),
+	  doc/devref-prolog-interface.doxyconf-latex.in (1.9),
+	  doc/user-prolog-interface.doxyconf-html.in (1.8),
+	  doc/user-prolog-interface.doxyconf-latex.in (1.9),
+	  interfaces/Prolog/Makefile.am (1.54),
+	  interfaces/Prolog/Prolog_interface.dox (1.162),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 (1.1),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
+	  (1.1), interfaces/Prolog/ppl_prolog_sysdep_dox (1.1),
+	  interfaces/Prolog/ppl_prolog_sysindep_dox (1.1): Prolog
+	  documentation revised.
+
+2008-09-08 Monday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_sysdep_dox (bounded_arithmetic.1):
+	  file ppl_prolog_sysdep_dox was added on branch bounded_arithmetic
+	  on 2008-09-11 20:37:45 +0000
+
+2008-09-08 Monday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_sysindep_dox (bounded_arithmetic.1):
+	  file ppl_prolog_sysindep_dox was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-08 Monday 09:17  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_globals.cc (1.12): Avoid `ppl_'
+	  prefix in the definitions of the methods in the Java interface.
+
+2008-09-08 Monday 09:06  Andrea Cimino
+
+	* configure.ac (1.340): No longer check for libmlgmp.a when
+	  detecting if we are able to compile the OCaml interface.
+
+2008-09-08 Monday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.47): Use `mv -f' instead of `mv'.
+
+2008-09-08 Monday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int64 (1.11): Adapted to the recent
+	  changed in ppl_lpsol.
+
+2008-09-07 Sunday 23:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.48), tests/Makefile.am (1.14):
+	  Improved the definition of OCAMLC_LINK_FLAGS.
+
+2008-09-07 Sunday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_mpz (1.15), ppl_lpsol.c (1.77): Let
+	  GLPK work with the system's default rounding mode.
+
+2008-09-07 Sunday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.91): Work around a plld bug
+	  under Cygwin.
+
+2008-09-07 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.13): Definitions of
+	  OCAMLC_LINK_FLAGS made equal.
+
+2008-09-07 Sunday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.47): Fixed ocamlc compilation and
+	  link flags.
+
+2008-09-07 Sunday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.12): Typo fixed.
+
+2008-09-07 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.11): Fixed ocamlc
+	  compilation and link flags.
+
+2008-09-07 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.339): Restore LIBS after checking for GLPK.
+
+2008-09-07 Sunday 14:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: devref.doxyconf-html.in (1.90), devref.doxyconf-latex.in
+	  (1.29): Include the Partially_Reduced_Product.* src files for
+	  INPUT.
+
+2008-09-07 Sunday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (1.5), doc/Makefile.am (1.64),
+	  interfaces/Prolog/Ciao/Makefile.am (1.75),
+	  interfaces/Prolog/XSB/Makefile.am (1.72): `abs_srcdir' is
+	  automatically set by Automake: removed redundant definitions.
+
+2008-09-07 Sunday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.42), config.sub (1.39), Watchdog/config.guess
+	  (1.26), Watchdog/config.sub (1.24): Updated.
+
+2008-09-07 Sunday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.46): Removed useless definition
+	  of `abs_srcdir'.
+
+2008-09-07 Sunday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.14), Watchdog/utils/Makefile.am
+	  (1.10), interfaces/C/Makefile.am (1.43),
+	  interfaces/Java/jni/Makefile.am (1.20),
+	  interfaces/Prolog/Makefile.am (1.53),
+	  interfaces/Prolog/Ciao/Makefile.am (1.74),
+	  interfaces/Prolog/GNU/Makefile.am (1.76),
+	  interfaces/Prolog/YAP/Makefile.am (1.65),
+	  interfaces/Prolog/tests/Makefile.am (1.22), utils/Makefile.am
+	  (1.18): Removed useless dependencies from Makefile.
+
+2008-09-07 Sunday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.35), Watchdog/ltmain.sh (1.24), m4/libtool.m4 (1.6),
+	  m4/ltoptions.m4 (1.4), m4/ltsugar.m4 (1.2), m4/ltversion.m4
+	  (1.5), Watchdog/m4/libtool.m4 (1.6), Watchdog/m4/ltoptions.m4
+	  (1.4), Watchdog/m4/ltsugar.m4 (1.2), Watchdog/m4/ltversion.m4
+	  (1.5): Updated from Libtool 2.2.6.
+
+2008-09-07 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-prolog-interface.doxyconf-html.in (1.8),
+	  devref-prolog-interface.doxyconf-latex.in (1.8): Fixed the
+	  definition of INPUT.
+
+2008-09-07 Sunday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.cc (bounded_arithmetic.1):
+	  file ppl_prolog_common.cc was added on branch bounded_arithmetic
+	  on 2008-09-11 20:37:45 +0000
+
+2008-09-07 Sunday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.defs.hh
+	  (bounded_arithmetic.1): file ppl_prolog_common.defs.hh was added
+	  on branch bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-09-07 Sunday 11:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Java/jni/ppl_java_globals.cc (1.11),
+	  Prolog/ppl_prolog_common.cc (1.4),
+	  Prolog/ppl_prolog_common.defs.hh (1.4): Added support for new
+	  methods:   void Parma_Polyhedra_Library::set_rounding_for_PPL()
+	  void Parma_Polyhedra_Library::restore_pre_PPL_rounding() for
+	  Prolog and Java.
+
+2008-09-07 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.184): Vertical space adjusted.
+
+2008-09-07 Sunday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.42): When necessary list
+	  `-no-undefined' among the `libppl_c_la_LDFLAGS'.
+
+2008-09-07 Sunday 09:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.51): Corrected cross-reference
+	  wrt meet-preserving enlargement for the devref manuals.
+
+2008-09-07 Sunday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/Makefile.am (1.63): Corrected paths for Prolog files used for
+	  the devref Prolog manuals.
+
+2008-09-07 Sunday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.71): Added ppl_xsb.hh to
+	  DISTCLEANFILES.
+
+2008-09-07 Sunday 08:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.45): More dependency problems
+	  fixed.
+
+2008-09-06 Saturday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.h.in (1.77),
+	  ppl_interface_generator_c_cc_preamble (1.15),
+	  ppl_interface_generator_c_h_preamble (1.11): Added
+
+	    int ppl_set_rounding_for_PPL(void)
+
+	  and
+
+	    int ppl_restore_pre_PPL_rounding(void)
+
+	  to the C interface.
+
+2008-09-06 Saturday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.defs.hh (1.22): Comments revised.
+
+2008-09-06 Saturday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.70): BUILT_SOURCES must
+	  include ppl_xsb.hh.
+
+2008-09-06 Saturday 20:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.338): Version number bumped.
+
+2008-09-06 Saturday 20:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.256), interfaces/OCaml/Makefile.am (1.44),
+	  interfaces/OCaml/tests/Makefile.am (1.10): Fixed the dependency
+	  problems.
+
+2008-09-06 Saturday 18:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.46): Commands for dist-hook fixed.
+
+2008-09-06 Saturday 18:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.9): Do not distribute
+	  generated sources.
+
+2008-09-06 Saturday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/: devref.doxyconf-html.in (1.3),
+	  devref.doxyconf-latex.in (1.3), user.doxyconf-html.in (1.4),
+	  user.doxyconf-latex.in (1.4): Updated.
+
+2008-09-06 Saturday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.33), Java/jni/Makefile.am (1.19),
+	  Java/tests/Makefile.am (1.21), OCaml/Makefile.am (1.43),
+	  Prolog/GNU/Makefile.am (1.75), Prolog/SICStus/Makefile.am (1.92),
+	  Prolog/SWI/Makefile.am (1.90), Prolog/XSB/Makefile.am (1.69),
+	  Prolog/YAP/Makefile.am (1.64), Prolog/tests/Makefile.am (1.21):
+	  Removed several misuses of BUILT_SOURCES.
+
+2008-09-06 Saturday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.8): Fixed several problems.
+
+2008-09-06 Saturday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.337): Only enable sicstus_prolog, swi_prolog and
+	  xsb_prolog by default.
+
+2008-09-06 Saturday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.74), SICStus/Makefile.am
+	  (1.91), SWI/Makefile.am (1.89), XSB/Makefile.am (1.68),
+	  YAP/Makefile.am (1.63): Do not distribute generated files.
+
+2008-09-06 Saturday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.7),
+	  devref-c-interface.doxyconf-latex.in (1.7),
+	  devref-java-interface.doxyconf-html.in (1.3),
+	  devref-java-interface.doxyconf-latex.in (1.3),
+	  devref-ocaml-interface.doxyconf-html.in (1.2),
+	  devref-ocaml-interface.doxyconf-latex.in (1.2),
+	  devref-prolog-interface.doxyconf-html.in (1.7),
+	  devref-prolog-interface.doxyconf-latex.in (1.7),
+	  devref.doxyconf-html.in (1.89), devref.doxyconf-latex.in (1.28),
+	  user-c-interface.doxyconf-html.in (1.8),
+	  user-c-interface.doxyconf-latex.in (1.8),
+	  user-java-interface.doxyconf-html.in (1.3),
+	  user-java-interface.doxyconf-latex.in (1.3),
+	  user-ocaml-interface.doxyconf-html.in (1.2),
+	  user-ocaml-interface.doxyconf-latex.in (1.2),
+	  user-prolog-interface.doxyconf-html.in (1.7),
+	  user-prolog-interface.doxyconf-latex.in (1.8),
+	  user.doxyconf-html.in (1.43), user.doxyconf-latex.in (1.14):
+	  Updated.
+
+2008-09-06 Saturday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-ocaml-interface.doxyconf-html.in (bounded_arithmetic.1):
+	  file user-ocaml-interface.doxyconf-html.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-06 Saturday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-ocaml-interface.doxyconf-latex.in
+	  (bounded_arithmetic.1): file
+	  user-ocaml-interface.doxyconf-latex.in was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-06 Saturday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.255): Remember to make
+
+	      void set_rounding_for_PPL()
+	      void restore_pre_PPL_rounding()
+
+	  available in all the interfaces.
+
+2008-09-06 Saturday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/randphull1.cc (1.15): Reset the rounding mode to
+	  its pre-PPL state before doing any non-PPL floating point
+	  computation.	This is to avoid bugs as
+	  http://sources.redhat.com/bugzilla/show_bug.cgi?id=6869 and also
+	  to test the rounding-mode setting/resetting functions.  When
+	  NDEBUG is not defined, limit the maximum space dimension tested
+	  by test02() to 4 (instead of 6).
+
+2008-09-06 Saturday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (1.88), doc/devref.doxyconf-latex.in
+	  (1.27), src/Init.cc (1.36), src/Init.defs.hh (1.21),
+	  src/Init.inlines.hh (1.9), src/Makefile.am (1.183): New functions
+
+	    void set_rounding_for_PPL()
+	    void restore_pre_PPL_rounding()
+
+	  sets the FPU rounding mode as it was before initialization of the
+	  PPL, and sets it so that the PPL abstractions based on floating
+	  point numbers work correctly, respectively.
+
+2008-09-06 Saturday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.inlines.hh (bounded_arithmetic.1): file Init.inlines.hh
+	  was added on branch bounded_arithmetic on 2008-09-11 20:37:49
+	  +0000
+
+2008-09-06 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/gprolog_efli.cc (1.3), XSB/xsb_efli.cc
+	  (1.4): Two FIXMEs resolved.
+
+2008-09-06 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_efli.cc (bounded_arithmetic.1):
+	  file gprolog_efli.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:47 +0000
+
+2008-09-06 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_efli.cc (bounded_arithmetic.1): file
+	  xsb_efli.cc was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:48 +0000
+
+2008-09-05 Friday 22:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.32): Add the predicates:
+		 ppl_Polyhedron_constrains/2,
+	  ppl_Polyhedron_unconstrain_space_dimension/2,
+	  ppl_Polyhedron_unconstrain_space_dimensions/2, to the "import"
+	  list.
+
+2008-09-05 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.62), libppl.3 (1.1): Started drafting a
+	  libppl(3) man page.
+
+2008-09-05 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/libppl.3 (bounded_arithmetic.1): file libppl.3 was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-09-05 Friday 19:27  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.53),
+	  ppl_java_common.cc (1.40), ppl_java_common.hh (1.36),
+	  ppl_java_globals.cc (1.10): Use always `set_ptr' to set the value
+	  of the C++ object pointer in the Java world, this makes the code
+	  cleaner. This was made also to implement (in a near future)
+	  de-allocation with the recently added functions in
+	  `marked_pointers.hh' Changed the `set_ptr' definition to avoid
+	  casts in the code.
+
+2008-09-05 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.67), ppl_prolog_sysdep.hh
+	  (1.2), xsb_efli.cc (1.3): The XSB interface now supports separate
+	  compilation.
+
+2008-09-05 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
+	  (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:48 +0000
+
+2008-09-05 Friday 15:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.66): Added code for
+	  generating ppl_xsb.hh.
+
+2008-09-05 Friday 15:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/: ppl_interface_generator_xsb_cc.m4 (1.16),
+	  ppl_interface_generator_xsb_hh.m4 (1.1): Split the generating
+	  file so as to generate 2 C++ files, ppl_xsb.hh (containing only
+	  the "defines") and ppl_xsb.cc for the rest.
+
+2008-09-05 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
+	  (bounded_arithmetic.1): file ppl_interface_generator_xsb_hh.m4
+	  was added on branch bounded_arithmetic on 2008-09-11 20:37:48
+	  +0000
+
+2008-09-05 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (1.6): Added a missing `inline'
+	  qualifier.
+
+2008-09-05 Friday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.61): Updated the definition of
+	  DEVREF_PROLOG_INTERFACE_STUFF.
+
+2008-09-05 Friday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.15):
+	  Reorder the lines for the divert(1) and divert(2)  and #include
+	  ...
+
+2008-09-05 Friday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bit_Matrix.cc (1.6), checked.cc (1.23), conversion.cc
+	  (1.86): Added missing inclusions of <climits>.
+
+2008-09-05 Friday 13:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_efli.cc (1.2): Removed some unwanted
+	  PPL:: qualifications.
+
+2008-09-05 Friday 10:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.14):
+	  Restored some divert(n)'s.
+
+2008-09-05 Friday 10:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc (1.10): Corrected test04.
+
+2008-09-05 Friday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.254), src/Polyhedron_public.cc (1.136): (Temporarily)
+	  Reverted previous change, as it was causing too many troubles in
+	  the tests for the Partially_Reduced_Product.
+
+2008-09-05 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.72): Fixed Constraint
+	  operator==(Variable, Variable).
+
+2008-09-05 Friday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (1.15): Update test according to
+	  new specification for addition of congruences.
+
+2008-09-04 Thursday 22:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset4.cc (1.2): Fixed tests 13 and 15,
+	  which were still assuming the old specification of
+	  add_congruence(s).
+
+2008-09-04 Thursday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset4.cc (bounded_arithmetic.1): file
+	  pointsetpowerset4.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:56 +0000
+
+2008-09-04 Thursday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.34): Include <climits>.
+
+2008-09-04 Thursday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.253): Moved one item to the section "PPL 0.11 or later".
+
+2008-09-04 Thursday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.45), configure.ac (1.336): Added a new configure
+	  option `--enable-check' accepting the values `thorough', for the
+	  ordinary lengthy process, and `quick', for a quicker process yet
+	  to be defined.  The default for the CVS distribution is
+	  `thorough', whereas tar and zip packages built with `make dist'
+	  default to `quick'.
+
+2008-09-04 Thursday 19:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: ppl-config.1 (1.7), ppl_lcdd.1 (1.5), ppl_lpsol.1 (1.5):
+	  Updated.
+
+2008-09-04 Thursday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.130), Constraint.inlines.hh (1.71):
+	  Resolved a couple of TODOs: now Constraint operator>=(Variable,
+	  Variable) and Constraint operator>(Variable, Variable) have
+	  optimal implementations.
+
+2008-09-04 Thursday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.80): Comments improved.
+
+2008-09-04 Thursday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.129), Constraint.inlines.hh (1.70):
+	  TODO resolved: Constraint operator==(Variable, Variable) has now
+	  an optimal implementation.
+
+2008-09-04 Thursday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.39),
+	  Linear_Expression.inlines.hh (1.14): Spurious \relates command
+	  removed.  New private constructor Linear_Expression(Variable v,
+	  Variable w) builds the linear expression corresponding to the
+	  difference of `v' and `w'.  FIXME resolved: Linear_Expression
+	  operator-(Variable, Variable) has now an optimal implementation.
+
+2008-09-04 Thursday 15:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: addcongruence1.cc (1.11), addcongruences1.cc
+	  (1.14): Adapted tests for addcongruence(s) so as to meet the new
+	  specification.
+
+2008-09-04 Thursday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.135): Adapted implementation of
+	  methods add_congruence(s) so as to meet their specification.
+
+2008-09-04 Thursday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.346), Polyhedron.templates.hh (1.21):
+	  The templatic constructor of a Polyhedron from a box now requires
+	  that the box is indeed an instantiation of the Box class
+	  template; documentation simplified accordingly.  Fixed
+	  documentation regarding the addition of congruences, so as to
+	  better specify when an exception is thrown.
+
+2008-09-04 Thursday 13:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.59), NNC_Polyhedron.defs.hh (1.61):
+	  Fixed minor problems in the documentation of constructors.
+
+2008-09-04 Thursday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Matrix.templates.hh (1.9), OR_Matrix.templates.hh (1.8):
+	  Two FIXMEs resolved.
+
+2008-09-04 Thursday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval_Info.defs.hh (1.11), Interval_Restriction.defs.hh
+	  (1.12): Comments improved.
+
+2008-09-04 Thursday 08:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: ascii_dump_load1.cc (1.9), refinewithconstraints2.cc
+	  (1.2): Corrected test04 of ascii_dump_load1.cc.  Temporarily
+	  disabled test02 of refinewithconstraints2.cc.
+
+2008-09-04 Thursday 00:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.templates.hh (1.2): Avoid assertions in the
+	  ascii_load method: return false instead.
+
+2008-09-04 Thursday 00:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.templates.hh (bounded_arithmetic.1): file
+	  Checked_Number.templates.hh was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:49 +0000
+
+2008-09-04 Thursday 00:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.inlines.hh (1.40): Interval's ascii_dump/load
+	  methods are now based on corresponding functions for the boundary
+	  datatype.
+
+2008-09-04 Thursday 00:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.98), Checked_Number.templates.hh
+	  (1.1), Makefile.am (1.182): Drafted ascii_dump/load functions for
+	  native and checked numbers: inexact numbers dump both hexadecimal
+	  and pretty printed representations.
+
+2008-09-03 Wednesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (1.11): Corrected the handling of
+	  __STDC_LIMIT_MACROS.
+
+2008-09-03 Wednesday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.23): Changed #if to #ifdef.
+
+2008-09-03 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.345): Little improvement to a comment.
+
+2008-09-03 Wednesday 20:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.344): Dealt with a couple of FIXME's
+	  related to documentation.
+
+2008-09-03 Wednesday 19:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc (1.8): Some improvements to the
+	  ascii_dump test.
+
+2008-09-03 Wednesday 18:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Interval_Info.defs.hh (1.10), Interval_Info.inlines.hh
+	  (1.9): When ascii_dumping interval info, do set/reset hexadecimal
+	  output before/after dumping a bitset.
+
+2008-09-03 Wednesday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh (1.9): Do not define ascii_dump/load
+	  twice.
+
+2008-09-03 Wednesday 18:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.57), Interval.inlines.hh (1.39),
+	  Interval_Info.defs.hh (1.8), Interval_Info.inlines.hh (1.8):
+	  Started drafting appropriate ascii_dump/load methods for
+	  Interval.
+
+2008-09-03 Wednesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.14): Tell which namespace is being
+	  closed.
+
+2008-09-03 Wednesday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc (1.7): Temporarily commented out
+	  the invocation of test07().
+
+2008-09-03 Wednesday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.335), interfaces/Prolog/GNU/Makefile.am (1.73),
+	  interfaces/Prolog/SICStus/Makefile.am (1.90),
+	  interfaces/Prolog/SWI/Makefile.am (1.88),
+	  interfaces/Prolog/XSB/Makefile.am (1.65),
+	  interfaces/Prolog/YAP/Makefile.am (1.62): Fixed several
+	  distribution issues.
+
+2008-09-03 Wednesday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.52), GNU/Makefile.am (1.72),
+	  SICStus/Makefile.am (1.89), SWI/Makefile.am (1.87),
+	  XSB/Makefile.am (1.64), YAP/Makefile.am (1.61): Corrected several
+	  variable's definitions.
+
+2008-09-03 Wednesday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.64), ascii_dump_load1.cc (1.6): Added
+	  test07(), which fails.  Commented out the invocation of several
+	  other tests that are waiting for adaptation to boxes.
+
+2008-09-03 Wednesday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.63),
+	  ppl_interface_generator_xsb_cc.m4 (1.13), ppl_prolog_sysdep.hh
+	  (1.1), xsb_efli.cc (1.1), xsb_efli.hh (1.1): Started adapting the
+	  XSB interface in order to support separate compilation.
+
+2008-09-03 Wednesday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_efli.hh (bounded_arithmetic.1): file
+	  xsb_efli.hh was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:48 +0000
+
+2008-09-03 Wednesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_efli.cc (bounded_arithmetic.1):
+	  file sicstus_efli.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:47 +0000
+
+2008-09-03 Wednesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/gprolog_efli.cc (1.2), SWI/swi_efli.cc
+	  (1.3), SICStus/sicstus_efli.cc (1.2): Comments belong to the
+	  header files: removed from the implementation files.
+
+2008-09-03 Wednesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_efli.cc (bounded_arithmetic.1): file
+	  swi_efli.cc was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:48 +0000
+
+2008-09-02 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
+	  (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:47 +0000
+
+2008-09-02 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_efli.hh (bounded_arithmetic.1):
+	  file sicstus_efli.hh was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:47 +0000
+
+2008-09-02 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.334), interfaces/Prolog/SICStus/Makefile.am
+	  (1.88),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.14), interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh (1.1),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.20),
+	  interfaces/Prolog/SICStus/sicstus_efli.cc (1.1),
+	  interfaces/Prolog/SICStus/sicstus_efli.hh (1.1): The SICStus
+	  Prolog interface now uses separate compilation.
+
+2008-09-02 Tuesday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog_common.cc (1.3),
+	  ppl_prolog_common.defs.hh (1.3): Fixed the declaration of
+	  `prolog_interface_atoms'.
+
+2008-09-01 Monday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.333), interfaces/Prolog/YAP/Makefile.am (1.60),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.11),
+	  interfaces/Prolog/YAP/ppl_prolog_sysdep.hh (1.1),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.6),
+	  interfaces/Prolog/YAP/yap_efli.cc (1.1),
+	  interfaces/Prolog/YAP/yap_efli.hh (1.1): Enabled separate
+	  compilation in the YAP interface.
+
+2008-09-01 Monday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
+	  (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:48 +0000
+
+2008-09-01 Monday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_efli.cc (bounded_arithmetic.1): file
+	  yap_efli.cc was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:48 +0000
+
+2008-09-01 Monday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_efli.hh (bounded_arithmetic.1): file
+	  yap_efli.hh was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:48 +0000
+
+2008-09-01 Monday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.5): Started adjusting the
+	  polyehdra domain documentation for the C language interface;
+	  function categorized as either generic domain functions or ad hoc
+	  functions for the domain of polyhedra, so as to clarify which
+	  ones are also available for other domain instantiations.
+
+2008-08-31 Sunday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_efli.hh (bounded_arithmetic.1):
+	  file gprolog_efli.hh was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:47 +0000
+
+2008-08-31 Sunday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
+	  (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:47 +0000
+
+2008-08-31 Sunday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.332), interfaces/Prolog/ppl_prolog_common.defs.hh
+	  (1.2), interfaces/Prolog/GNU/Makefile.am (1.71),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.9),
+	  interfaces/Prolog/GNU/gprolog_efli.cc (1.1),
+	  interfaces/Prolog/GNU/gprolog_efli.hh (1.1),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.47),
+	  interfaces/Prolog/GNU/ppl_prolog_sysdep.hh (1.1),
+	  interfaces/Prolog/SICStus/Makefile.am (1.87): The GNU Prolog
+	  interface now supports separate compilation.
+
+2008-08-31 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.86), ppl_prolog_sysdep.hh
+	  (1.2), swi_efli.hh (1.4): Some cosmetic changes.  Some FIXMEs
+	  added.
+
+2008-08-31 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
+	  (bounded_arithmetic.1): file ppl_prolog_sysdep.hh was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:48 +0000
+
+2008-08-31 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_efli.hh (bounded_arithmetic.1): file
+	  swi_efli.hh was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:48 +0000
+
+2008-08-31 Sunday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.331): Added checks required to validate an
+	  horrible kludge working around an horrible bug in <gprolog.h>
+	  (see
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+
+2008-08-30 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_efli.hh (1.3): Exploit the inclusion of
+	  "ppl.hh" in order to have <stdint.h> and/or <inttypes.h> already
+	  included the proper way.
+
+2008-08-30 Saturday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (1.10): Include <stdint.h> nor
+	  <inttypes.h>.
+
+2008-08-30 Saturday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.defs.hh (1.30), Float.inlines.hh (1.33),
+	  checked_int.inlines.hh (1.67): Do not include <stdint.h> and/or
+	  <inttypes.h>: these are included by "ppl-config.h".
+
+2008-08-30 Saturday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (1.10): Make sure __STDC_LIMIT_MACROS is
+	  restored at the end of <ppl.hh>.  Similarly, make sure NDEBUG is
+	  restored exactly to its original definition.
+
+2008-08-30 Saturday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.330): Make sure __STDC_LIMIT_MACROS is defined
+	  before including <stdint.h>.	For this and other reasons,
+	  <stdint.h> should be only included from "ppl-config.h".
+
+2008-08-30 Saturday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_double_binary_format.m4 (1.9),
+	  ac_cxx_float_binary_format.m4 (1.7),
+	  ac_cxx_long_double_binary_format.m4 (1.8): Make sure
+	  __STDC_LIMIT_MACROS is defined before including <stdint.h>.
+
+2008-08-30 Saturday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ax_prefix_config_h.m4 (1.2): Updated.
+
+2008-08-29 Friday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.85): Dependencies fixed.
+
+2008-08-29 Friday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (1.16): Use the new
+	  implementation of marked pointers.
+
+2008-08-29 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.32), marked_pointers.hh (1.1):
+	  Implementation of marked pointers for use in the PPL foreign
+	  interfaces.
+
+2008-08-29 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/marked_pointers.hh (bounded_arithmetic.1): file
+	  marked_pointers.hh was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:41 +0000
+
+2008-08-28 Thursday 20:56  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.38), ppl_ocaml_globals.cc (1.15): Added three functions to
+	  deal with the last bit of a pointer. These are added and used in
+	  the interface to avoid unwanted `delete' calls on iterated
+	  objects: e.g. object get by `get_disjunct'.
+
+2008-08-28 Thursday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.88): Typo fixed.
+
+2008-08-27 Wednesday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.87): Added missing `inline'
+	  qualifier.
+
+2008-08-27 Wednesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.86): Work around a limitation of
+	  Cygwin, which has proper long doubles but does not provide
+	  rintl().
+
+2008-08-27 Wednesday 21:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.13): Work around a bug of GCC 4.0.x.
+
+2008-08-26 Tuesday 19:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.inlines.hh (1.38): (Temporarily?) Commented out call
+	  to method OK() in operator<<(), which is also used by method
+	  ascii_dump().
+
+2008-08-26 Tuesday 19:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.56): Avoid long lines in method OK();
+	  when doing output on std::cerr, prefer "\n" to std::endl.
+
+2008-08-26 Tuesday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.121): Corrected spelling typo in comment.
+
+2008-08-26 Tuesday 12:56  Andrea Cimino
+
+	* interfaces/Java/:
+	  ppl_interface_generator_java_procedure_generators.m4 (1.7),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.52), jni/ppl_java_common.cc (1.39), jni/ppl_java_common.hh
+	  (1.35), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.32):  Implemened the following methods in the Java interface:
+	   ppl_ at CLASS@_ascii_dump/1
+	   ppl_ at CLASS@_ at PARTITION@/4 +pointset_powerset \grid
+
+	   To do so, a new Pair class has been introduced to
+	   wrap the result of a CXX std::pair class.
+
+2008-08-25 Monday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.252), interfaces/Prolog/SWI/README.swiprolog (1.3): In
+	  the SWI-Prolog documentation, the command to dynamically load the
+	  library has been modified so as to specify the `.so' extension:
+	  this seems to be required under Mac OS X and seems not to do any
+	  harm under GNU/Linux.
+
+2008-08-25 Monday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.232), configure.ac (1.329), fedora/ppl.spec (1.5),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.19), interfaces/Prolog/SWI/swi_cfli.hh (1.9),
+	  interfaces/Prolog/SWI/swi_efli.cc (1.2),
+	  interfaces/Prolog/SWI/swi_efli.hh (1.2): The preferred spelling
+	  is `SWI-Prolog', not `SWI Prolog'.
+
+2008-08-25 Monday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_copyright (1.7),
+	  Prolog/ppl_interface_generator_prolog_cc_files.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_hh_files.m4 (1.6),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.18),
+	  Prolog/SWI/swi_pl_check.pl (1.12),
+	  Prolog/SWI/swi_predicate_check.pl (1.7): Fixed several comments
+	  and meta-comments.
+
+2008-08-25 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.inlines.hh
+	  (bounded_arithmetic.1): file ppl_prolog_common.inlines.hh was
+	  added on branch bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-25 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.328), interfaces/Prolog/Makefile.am (1.51),
+	  interfaces/Prolog/exceptions.hh (1.27),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
+	  (1.3),
+	  interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (1.4),
+	  interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+	  (1.5),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.69),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_files.m4
+	  (1.2), interfaces/Prolog/ppl_prolog_common.cc (1.2),
+	  interfaces/Prolog/ppl_prolog_common.defs.hh (1.1),
+	  interfaces/Prolog/ppl_prolog_common.icc (1.16),
+	  interfaces/Prolog/ppl_prolog_common.inlines.hh (1.1),
+	  interfaces/Prolog/track_allocation.hh (1.25),
+	  interfaces/Prolog/SWI/Makefile.am (1.84),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.17), interfaces/Prolog/SWI/ppl_prolog_sysdep.hh (1.1),
+	  interfaces/Prolog/SWI/swi_efli.cc (1.1),
+	  interfaces/Prolog/SWI/swi_efli.hh (1.1): Prolog interfaces
+	  reorganized.	Only the interface for SWI Prolog is operational;
+	  the others will follow.
+
+2008-08-24 Sunday 12:55  Andrea Cimino
+
+	* interfaces/OCaml/tests/test1.ml (1.10): Test if the number of
+	  constraints of a Constraint_System get by calling
+	  `minimized_constraints' on a Polyhedron built from Universe and
+	  with dimension greater than zero is zero.
+
+2008-08-24 Sunday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/simplifyusingcontext1.cc (bounded_arithmetic.1):
+	  file simplifyusingcontext1.cc was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:55 +0000
+
+2008-08-24 Sunday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/simplifyusingcontext1.cc (1.2): test02() must
+	  fail with 8-bit coefficients.
+
+2008-08-23 Saturday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (bounded_arithmetic.1):
+	  file simplifyusingcontext1.cc was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:56 +0000
+
+2008-08-23 Saturday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/simplifyusingcontext1.cc (1.2): test05() must fail
+	  with 8-bit coefficients.
+
+2008-08-23 Saturday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/Makefile.am (bounded_arithmetic.1): file
+	  Makefile.am was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:55 +0000
+
+2008-08-23 Saturday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Polyhedron/Makefile.am (1.127),
+	  Polyhedron/interspreservenlarge1.cc (1.10),
+	  Polyhedron/simplifyusingcontext1.cc (1.1), Powerset/Makefile.am
+	  (1.4), Powerset/interspreservenlarge1.cc (1.6),
+	  Powerset/simplifyusingcontext1.cc (1.1): Test program renamed.
+
+2008-08-23 Saturday 17:39  Andrea Cimino
+
+	* interfaces/Java/tests/Test_Executor.java (1.2): Starting from JDK
+	  1.5 there is no need to convert Boolean (class) to boolean
+	  (simple types) when using if statements.  Simplified.
+
+2008-08-23 Saturday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Test_Executor.java (bounded_arithmetic.1):
+	  file Test_Executor.java was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:44 +0000
+
+2008-08-23 Saturday 17:33  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.14),
+	  Makefile.am (1.20), NNC_Polyhedron_test1.java (1.1),
+	  Test_Executor.java (1.1): Non generated tests have been split in
+	  two separated files, one related to NNC_Polyhedron, another one
+	  to C_Polyhedron.  Added a new class (Text_Executor) that executes
+	  all the tests found in a class.
+
+2008-08-23 Saturday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/NNC_Polyhedron_test1.java
+	  (bounded_arithmetic.1): file NNC_Polyhedron_test1.java was added
+	  on branch bounded_arithmetic on 2008-09-11 20:37:44 +0000
+
+2008-08-22 Friday 17:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.327): Fixed the generation of the file names for
+	  the Prolog and Java interfaces.  Version number bumped.
+
+2008-08-22 Friday 16:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.37), ppl_interface_generator_ocaml_ml_code.m4 (1.34),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.26),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.6): The
+	  same as in the previous commit - but for the OCaml interface.
+
+2008-08-22 Friday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_ocaml_test_ml_code.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-22 Friday 16:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.77),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.24),
+	  C/C_interface.dox (1.4), C/ppl_interface_generator_c_cc_code.m4
+	  (1.36), C/ppl_interface_generator_c_h_code.m4 (1.26),
+	  Prolog/ppl_interface_generator_prolog_cc_code.m4 (1.2),
+	  Prolog/ppl_interface_generator_prolog_hh_code.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.68),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.78), Java/Java_interface.dox (1.2),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.51), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.31): The Prolog predicate simplify_using_context_assign has 3
+	  arguments the third for the Boolean result.
+
+	  As a result, special schematic code for all the interfaces needed
+	  to be provided just for this method (previously it had used the
+	  schematic code for the binary operators with the "and_minimize"
+	  option).
+
+	  The documentation for C and Java updated for this method.
+
+2008-08-22 Friday 16:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.134): Modified method
+	  simplify_using_context_assign(): more simplifications detected
+	  (now test06 in test/Polyhedron/interpreservenlarge1.cc succeeds).
+
+2008-08-22 Friday 13:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.133): Solved the problem causing an
+	  assertion to fail in test06.	Correction still incomplete, since
+	  simplification fails to detect some redundant inequalities as
+	  such.
+
+2008-08-22 Friday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/interspreservenlarge1.cc (1.9): Fixed test
+	  showing bug.
+
+2008-08-22 Friday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.132): Previous change reverted: it
+	  wasn't the proper fix.
+
+2008-08-22 Friday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.131): Corrected variable naming typo
+	  causing an assertion failure (as witnessed by test06 in
+	  test/Polyhedron/interspreservenlarge1.cc).
+
+2008-08-22 Friday 11:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/interspreservenlarge1.cc (1.8): New test
+	  (test06) shows a bug in simplify_using_context_assign().
+
+2008-08-21 Thursday 22:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.128), Box.defs.hh (1.60), Grid.defs.hh
+	  (1.76), Octagonal_Shape.defs.hh (1.54), Pointset_Powerset.defs.hh
+	  (1.50), Polyhedron.defs.hh (1.343): Fixed doxygen
+	  cross-references for simplify_using_context_assign.
+
+2008-08-21 Thursday 22:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.216): Drafted an improved specification
+	  for the operator providing simplification using a given context;
+	  also specified for the case of a powerset domain.  (To be double
+	  checked).
+
+2008-08-21 Thursday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.85): FIXME added.
+
+2008-08-21 Thursday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (1.8):
+	  AC_CXX_DOUBLE_BINARY_FORMAT depends on AC_C_BIGENDIAN: enforce
+	  this with AC_REQUIRE.
+
+2008-08-21 Thursday 17:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.76),
+	  OCaml/tests/test1.ml (1.9): Changed the name of the new method in
+	  the interfaces.
+
+2008-08-21 Thursday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.127), BD_Shape.templates.hh (1.111),
+	  Box.defs.hh (1.59), Box.templates.hh (1.120), Grid.defs.hh
+	  (1.75), Grid_public.cc (1.78), Octagonal_Shape.defs.hh (1.53),
+	  Octagonal_Shape.templates.hh (1.83), Pointset_Powerset.defs.hh
+	  (1.49), Pointset_Powerset.templates.hh (1.40), Polyhedron.defs.hh
+	  (1.342), Polyhedron_public.cc (1.130): Method
+	  intersection_preserving_enlarge_assign() renamed as
+	  simplify_using_context_assign().
+
+2008-08-21 Thursday 16:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Polyhedron/interspreservenlarge1.cc (1.7),
+	  Powerset/interspreservenlarge1.cc (1.5): Test changed to use new
+	  method name.
+
+2008-08-21 Thursday 16:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.75),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.23):
+	  Ensure the new method is generated for all the domains that
+	  support it.  Name still needs revising.
+
+2008-08-21 Thursday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.110), Box.inlines.hh (1.34),
+	  Box.templates.hh (1.119), Octagonal_Shape.templates.hh (1.82): In
+	  several comments, correct typo (emptyness ==> emptiness).
+
+2008-08-21 Thursday 16:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_copyright (1.6),
+	  Prolog/ppl_interface_generator_prolog_cc_files.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_hh_files.m4 (1.4): Include
+	  the copyright notice in the generated files.
+
+2008-08-21 Thursday 16:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
+	  (1.2): Added an #include "sysdep.hh" line to each generated cc
+	  file.
+
+2008-08-21 Thursday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.326): We don't need the `win32-dll' option of
+	  `LT_INIT'.
+
+2008-08-21 Thursday 13:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/interspreservenlarge1.cc (1.4): Test test08() no
+	  longer fails.
+
+2008-08-21 Thursday 13:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.129): Corrected the method for
+	  simplification of polyhedra wrt context so that to avoid
+	  converting a masked equality (i.e., an inequality that implies an
+	  equality in the given context) to a proper equality; for
+	  instance, now simplifying PH1 = { A >= 0 } in the context of PH2
+	  = { A <= 0 } returns PH1, instead of PH3 = { A == 0 }.  The
+	  correction ensures that the method is extensive on the polyhedra
+	  domain and hence solves the corresponding bug in the
+	  Pointset_Powerset domain.
+
+2008-08-21 Thursday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.325): Temporarily removed all the Prolog
+	  interfaces from the ones that are built by default (this is not
+	  to disturb the work of people not interested in them).
+
+2008-08-21 Thursday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.4): Add header for the binary operations.
+
+2008-08-21 Thursday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.3): Missing ";" added.
+
+2008-08-21 Thursday 11:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
+	  (1.3): Fixed a typo.
+
+2008-08-21 Thursday 11:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
+	  (1.2): Removed some unwanted code.
+
+2008-08-21 Thursday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.68): Allow the PPL to be compiled and used
+	  even on platforms where we are unable to detect the binary format
+	  used by doubles.
+
+2008-08-21 Thursday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.83): Separately compile the
+	  C++ sources of the interface.
+
+2008-08-21 Thursday 10:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_hh_files.m4
+	  (1.2), ppl_prolog_common.cc (1.1): Removed redundant code from
+	  the m4 file and renaming the common code file.
+
+2008-08-21 Thursday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.324): Compute the names of C++ domain-specific
+	  files for the Prolog interfaces: headers, sources and objects.
+
+2008-08-21 Thursday 09:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.50),
+	  ppl_interface_generator_prolog_cc_code.m4 (1.1),
+	  ppl_interface_generator_prolog_cc_files.m4 (1.1),
+	  ppl_interface_generator_prolog_hh_code.m4 (1.1),
+	  ppl_interface_generator_prolog_hh_files.m4 (1.1): New files to
+	  enable separate compilation of the Prolog interface code.
+
+2008-08-21 Thursday 09:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.74): The new
+	  method intersection_preserving_enlarge_assign now returns a
+	  Boolean.  At the moment the new version is only enabled for
+	  Polyhedra, but this will be fixed later.
+
+2008-08-21 Thursday 00:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/interspreservenlarge1.cc (1.3): Test test05() now
+	  succeeds.  New test test08() shows a bug due to the uncorrect
+	  handling of inequalities that happen to imply equalities in parts
+	  of the given powerset context.
+
+2008-08-20 Wednesday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.128): Implemented the announced
+	  heuristics in
+	  Polyhedron::intersection_preserving_enlarge_assign(const
+	  Polyhedron&).
+
+2008-08-20 Wednesday 17:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (1.8): For the declaration of ffs(3),
+	  include <strings.h> and not <cstring> (note that in configure.ac
+	  we correctly have AC_CHECK_DECLS([ffs], , , [#include
+	  <strings.h>]).
+
+2008-08-20 Wednesday 12:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/interspreservenlarge1.cc (1.2): Added three more
+	  tests, one (temporarily) known to fail.
+
+2008-08-20 Wednesday 12:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/interspreservenlarge1.cc (1.6): Added another
+	  test (test05).
+
+2008-08-20 Wednesday 12:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.126), BD_Shape.templates.hh (1.109),
+	  Box.defs.hh (1.58), Box.templates.hh (1.118), Grid.defs.hh
+	  (1.74), Grid_public.cc (1.77), Octagonal_Shape.defs.hh (1.52),
+	  Octagonal_Shape.templates.hh (1.81), Pointset_Powerset.defs.hh
+	  (1.48), Pointset_Powerset.templates.hh (1.39), Polyhedron.defs.hh
+	  (1.341), Polyhedron_public.cc (1.127): The method
+	  intersection_preserving_enlarge_assign() now returns a boolean:
+	  if false is returned the intersection is empty.  Using the new
+	  return value, improved the implementation for Pointset_Powerset
+	  by dropping those disjuncts that have empty intersection with all
+	  of the disjunct of the context.  Corrected a bug in the
+	  Polyhedron method regarding the correct handling of equality
+	  constraints.
+
+2008-08-19 Tuesday 19:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/: Makefile.am (1.3), interspreservenlarge1.cc
+	  (1.1): Added a few tests for method
+	  intersection_preserving_enlarge_assign().
+
+2008-08-19 Tuesday 19:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/interspreservenlarge1.cc (1.5): Added new test.
+
+2008-08-19 Tuesday 19:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.47),
+	  Pointset_Powerset.templates.hh (1.38): Drafted a generic
+	  implementation (better, an executable specification) for method
+	  intersection_preserving_enlarge_assign(const Pointset_Powerset&);
+	  the code is based on an auxiliary method   void
+	  intersection_preserving_enlarge(PS& y) const; that enlarges
+	  argument y wrt context *this.
+
+2008-08-19 Tuesday 19:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.126): Corrected an error in method
+	  intersection_preserving_enlarge_assign() and applied a few
+	  efficiency enhancements.
+
+2008-08-19 Tuesday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.5): Updated the list of missing procedures for the OCaml
+	  interface.
+
+2008-08-19 Tuesday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.36), ppl_interface_generator_ocaml_ml_code.m4 (1.33),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.25),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.5): More
+	  bugs fixed in the specialized code for the powerset domains and
+	  more tests added.
+
+2008-08-19 Tuesday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/ppl_ocaml_tests_common
+	  (bounded_arithmetic.1): file ppl_ocaml_tests_common was added on
+	  branch bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-19 Tuesday 15:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.35), ppl_interface_generator_ocaml_ml_code.m4 (1.32),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.24),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.4),
+	  tests/ppl_ocaml_tests_common (1.3), tests/test1.ml (1.8): Added
+	  code for generating some missing methods; fixed some bugs in the
+	  ocaml interface code; extended the generated tests to cover most
+	  methods: tests for special methods for the powerset domains still
+	  missing.
+
+2008-08-19 Tuesday 11:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.34), ppl_interface_generator_ocaml_ml_code.m4 (1.31),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.23),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.3):
+	  Several tests added and code for some missing methods added.
+	  Every test now checks after the operation that the domain
+	  element(s) are ok and prints "success" if it is and "failed"
+	  otherwise.
+
+2008-08-19 Tuesday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.30), ppl_interface_generator_ocaml_mli_code.m4 (1.22),
+	  tests/ppl_interface_generator_ocaml_test_ml_code.m4 (1.2),
+	  tests/ppl_ocaml_tests_common (1.2): Improved the code for
+	  generating tests.  Fixed a bug in the code generation for OCaml
+	  for the limited_..._extrapolation_assign method.
+
+2008-08-18 Monday 23:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/tests/: Makefile.am (1.7),
+	  ppl_interface_generator_ocaml_test_ml.m4 (1.1),
+	  ppl_interface_generator_ocaml_test_ml_code.m4 (1.1),
+	  ppl_ocaml_tests_common (1.1): Code for generating tests for the
+	  OCaml interface.  This is an initial series of generic tests; to
+	  be improved and extended to include all the ppl user methods.
+
+2008-08-18 Monday 23:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
+	  (bounded_arithmetic.1): file
+	  ppl_interface_generator_ocaml_test_ml.m4 was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:45 +0000
+
+2008-08-18 Monday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.125),
+	  tests/Polyhedron/interspreservenlarge1.cc (1.4): Drafted some
+	  code (to be completed with the implementation of the indicated
+	  heuristics) to handle the case of the empty intersection in
+	  Polyhedron::intersection_preserving_enlarge_assign(const
+	  Polyhedron& y).
+
+2008-08-18 Monday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.124): For method
+	  intersection_preserving_enlarge_assign(), reverted to a simpler
+	  implementation that does not change this until time of return.
+
+2008-08-18 Monday 13:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/interspreservenlarge1.cc (1.3): Added another
+	  test for intersection_preserving_enlarge_assign().
+
+2008-08-18 Monday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.51): In method back_substitute(), avoid
+	  assuming that x.num_rows() >= 1.
+
+2008-08-18 Monday 12:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/interspreservenlarge1.cc (1.2): Added new test
+	  for zero-dim polyhedra.
+
+2008-08-18 Monday 12:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.123): Corrected new method
+	  intersection_preserving_enlarge_assign wrt the handling of
+	  zero-dimensional polyhedra.
+
+2008-08-18 Monday 11:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.73),
+	  OCaml/tests/test1.ml (1.7): Enable the new method
+	  intersection_preserving_enlarge_assign(y) in all the interfaces
+	  for all domains except the products.	Token test added to
+	  OCaml/tests/test1.ml for this method.
+
+2008-08-18 Monday 10:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.49),
+	  ppl_interface_generator_prolog_icc.m4 (1.17),
+	  ppl_interface_generator_prolog_icc_files.m4 (1.1),
+	  Ciao/ppl_ciao.cc (1.53), GNU/ppl_gprolog_sd.cc (1.46),
+	  SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.13),
+	  SWI/ppl_interface_generator_swiprolog_cc.m4 (1.16),
+	  XSB/ppl_interface_generator_xsb_cc.m4 (1.12),
+	  YAP/ppl_interface_generator_yap_cc.m4 (1.10): Instead of
+	  generating the Prolog interface C++ file ppl_prolog.icc we now
+	  generate ppl_prolog_main.icc and a separate file for each
+	  generated domain.
+
+2008-08-18 Monday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.125), BD_Shape.templates.hh (1.108),
+	  Box.defs.hh (1.57), Box.templates.hh (1.117), Grid.defs.hh
+	  (1.73), Grid_public.cc (1.76), Octagonal_Shape.defs.hh (1.51),
+	  Octagonal_Shape.templates.hh (1.80), Pointset_Powerset.defs.hh
+	  (1.46), Pointset_Powerset.templates.hh (1.37): Added trivial
+	  implementations of method
+	  intersection_preserving_enlarge_assign().
+
+2008-08-18 Monday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.126): Removed
+	  interspreservenlarge1 and nnc_interspreservenlarge1 from
+	  XFAIL_TESTS.
+
+2008-08-18 Monday 09:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.122): Fixed sortedness and low-level
+	  constraints issues in method
+	  intersection_preserving_enlarge_assign.
+
+2008-08-18 Monday 08:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.72),
+	  OCaml/tests/test1.ml (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.77): Enabled affine_dimension() and is_topologically_closed()
+	  for all domains including the powerset and product domains.
+
+	  Minor change to OCaml/tests/test1.ml in preparation for
+	  generating the file.
+
+2008-08-18 Monday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/topclosed1.cc (1.4): Improved tests - better coverage
+	  and comments.
+
+2008-08-18 Monday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/topclosed1.cc (bounded_arithmetic.1): file
+	  topclosed1.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:51 +0000
+
+2008-08-17 Sunday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.121), tests/Polyhedron/Makefile.am
+	  (1.125): A more optimized version of
+	  Polyhedron::intersection_preserving_enlarge_assign(const
+	  Polyhedron&), currently causing assertion violations.
+
+2008-08-17 Sunday 16:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.124), interspreservenlarge1.cc
+	  (1.1): New test program for
+	  Polyhedron::intersection_preserving_enlarge_assign().
+
+2008-08-17 Sunday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.120): Continued drafting a prototype
+	  for Polyhedron::intersection_preserving_enlarge_assign(const
+	  Polyhedron&).
+
+2008-08-17 Sunday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.340): Indentation fixed.
+
+2008-08-17 Sunday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplify.cc (1.53): Polyhedron::simplify(Linear_System& sys,
+	  Bit_Matrix& sat) assumes `sys' has a nonzero number of columns:
+	  added assertion.
+
+2008-08-17 Sunday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.50):
+	  Linear_System::back_substitute(dimension_type
+	  n_lines_or_equalities) assumes *this has nonzero numbers of rows
+	  and of columns: added assertions checking these conditions.
+
+2008-08-17 Sunday 13:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.116): Corrected error: Box has no access
+	  to Grid_Generator_System internals.
+
+2008-08-17 Sunday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.templates.hh (1.115), Congruence_System.cc (1.29),
+	  Generator_System.cc (1.27), Generator_System.defs.hh (1.28),
+	  Generator_System.inlines.hh (1.12), Grid.templates.hh (1.35),
+	  Grid_nonpublic.cc (1.34), Grid_public.cc (1.75), Grid_simplify.cc
+	  (1.38), Grid_widenings.cc (1.18), Linear_System.cc (1.49),
+	  Linear_System.inlines.hh (1.25), Matrix.defs.hh (1.85),
+	  Matrix.inlines.hh (1.54), Polyhedron.templates.hh (1.20),
+	  Polyhedron_chdims.cc (1.49), Polyhedron_nonpublic.cc (1.84),
+	  Polyhedron_public.cc (1.119), Polyhedron_widenings.cc (1.67),
+	  minimize.cc (1.50): Method Matrix::empty() renamed as
+	  Matrix::has_no_rows() to avoid error prone name clashes with the
+	  corresponding method in Constraint_System and Congruence_System.
+
+2008-08-17 Sunday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.339), simplify.cc (1.52): Let
+	  Polyhedron::simplify(Linear_System&, Bit_Matrix&) return
+	  dimension_type instead of int.
+
+2008-08-17 Sunday 00:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.30): In private method
+	  adjust_topology_and_space_dimension, do not call recently
+	  modified method empty(), as it disregards trivial constraints,
+	  whereas here we want to know the internal structure of the
+	  matrix.
+
+2008-08-16 Saturday 22:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/: Makefile.am (1.63), topclosed1.cc (1.3):
+	  topclosed1.cc which tests is_topologically_closed(), has a typo
+	  fixed and now enabled in the Makefile.
+
+2008-08-16 Saturday 22:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.templates.hh (1.36): A typo fixed.
+
+2008-08-16 Saturday 19:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.45),
+	  Pointset_Powerset.templates.hh (1.35): Added a note to the
+	  documentation of method constrains() regarding its intended
+	  semantics, which may be different from the geometric intuition.
+	  Improved the implementation of is_universe() so as to exploit/set
+	  omega reduction if that is already available or easily provable.
+
+2008-08-16 Saturday 17:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.34): Corrected a bug in
+	  affine_dimension().
+
+2008-08-16 Saturday 17:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset5.cc (1.2): Additional test shows
+	  a bug in the implementation of affine_dimension() for
+	  Pointset_Powerset<Rational_Interval>.
+
+2008-08-16 Saturday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset5.cc (bounded_arithmetic.1): file
+	  pointsetpowerset5.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:56 +0000
+
+2008-08-16 Saturday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.118): Added an initial, untested and
+	  incomplete implementation of
+	  Polyhedron::intersection_preserving_enlarge_assign(const
+	  Polyhedron&).
+
+2008-08-16 Saturday 16:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence_System.inlines.hh (1.12),
+	  Constraint_System.inlines.hh (1.13): Corrected the implementation
+	  of method empty(), which was not disregarding trivial
+	  constraints/congruences.
+
+2008-08-16 Saturday 15:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.114): Typo corrected.
+
+2008-08-16 Saturday 14:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/Makefile.am (1.62): Typo fixed.
+
+2008-08-16 Saturday 14:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/topclosed1.cc (1.2): Typos fixed.
+
+2008-08-16 Saturday 14:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/: Makefile.am (1.61), topclosed1.cc (1.1): Added a test
+	  file for is_toplogically_closed() for the Box domain.  This is
+	  not enabled as this does not compile.
+
+2008-08-16 Saturday 13:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.cc (1.22), Pointset_Powerset.defs.hh
+	  (1.44), Pointset_Powerset.templates.hh (1.33): Reimplemented
+	  method is_universe() so as to be faithful to the intended
+	  specification (also removed the no longer useful specialization
+	  for grids).  Implemented method constrains().
+
+2008-08-16 Saturday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.231), configure.ac (1.323), doc/devref.doxyconf-html.in
+	  (1.87), doc/devref.doxyconf-latex.in (1.26), src/Makefile.am
+	  (1.181), src/iterator_to_const.defs.hh (1.8), tests/Makefile.am
+	  (1.268), tests/print.hh (1.46), tests/Polyhedron/maxspacedim1.cc
+	  (1.17): The ask-and-tell classes are not ready for release: make
+	  sure we do not release them (again) by mistake.
+
+2008-08-16 Saturday 12:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/tests/test1.ml (1.5): More small changes for its
+	  future generation.
+
+2008-08-16 Saturday 11:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.322): Added a tentative set of default foreign
+	  interface instantiations: most of it is commented out until we
+	  implement separate compilation in the interfaces.
+
+2008-08-16 Saturday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/tests/test1.ml (1.4): Small changes in
+	  preparation for generating the tests.
+
+2008-08-16 Saturday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.251): Added an important item for PPL 0.10.
+
+2008-08-16 Saturday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.338): Drafted the declaration of new
+	  method void intersection_preserving_enlarge_assign(const
+	  Polyhedron& y).
+
+2008-08-16 Saturday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.215): Drafted a section about
+	  intersection-preserving enlargements.
+
+2008-08-16 Saturday 10:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.48): Minor improvement to a comment.
+
+2008-08-16 Saturday 09:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (1.33): Fixed typo in
+	  documentation.
+
+2008-08-16 Saturday 09:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.214),
+	  src/Partially_Reduced_Product.defs.hh (1.32),
+	  src/Pointset_Powerset.defs.hh (1.43): Added warnings that the
+	  product and powerset domains should only be used with simple
+	  (non-compound) domains for the disjunct of the powerset or
+	  components of the product.
+
+2008-08-15 Friday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.321): Added Pointset_Powerset<C_Polyhedron> and
+	  Pointset_Powerset<NNC_Polyhedron> to the set of default domain
+	  instantiations.
+
+2008-08-15 Friday 17:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.250): Added an item for 0.11
+
+2008-08-15 Friday 17:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.249): New item added for PPL 0.11 or later version.
+
+2008-08-15 Friday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/product1.cc (bounded_arithmetic.1): file
+	  product1.cc was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:56 +0000
+
+2008-08-15 Friday 16:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.42),
+	  src/Pointset_Powerset.inlines.hh (1.16), tests/Makefile.am
+	  (1.267), tests/Powerset/Makefile.am (1.2),
+	  tests/Powerset/product1.cc (1.1): Allow for a powerset to be
+	  built from a product.
+
+2008-08-15 Friday 16:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_preamble (1.14),
+	  ppl_interface_generator_c_h_preamble (1.10): Added functions that
+	  test for emptyness of constraint/generator/... systems.
+
+2008-08-15 Friday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.248): One new item added.
+
+2008-08-15 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.230): Mention a name-change in the interfaces.
+
+2008-08-15 Friday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.229): A little bit of reorganization.  Duplicate items
+	  removed.
+
+2008-08-15 Friday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.29), Watchdog/ChangeLog (1.18): Updated.
+
+2008-08-15 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.320), src/checked_mpz.inlines.hh (1.55): FIXME
+	  resolved.  We now require (for developers) Autoconf 2.60 or later
+	  version.
+
+2008-08-15 Friday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset3.cc (1.2): Testing Grid
+	  specialization for is_universe().
+
+2008-08-15 Friday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset3.cc (bounded_arithmetic.1): file
+	  pointsetpowerset3.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:56 +0000
+
+2008-08-15 Friday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.cc (1.21), Pointset_Powerset.defs.hh
+	  (1.41): Added specialization of method is_universe() for
+	  powersets of grids.
+
+2008-08-15 Friday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/test1.ml (1.3): Obsolete code removed.
+
+2008-08-15 Friday 10:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.32), Powerset.inlines.hh (1.22): Added
+	  method upper_bound_assign_if_exact().
+
+2008-08-15 Friday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.31),
+	  Partially_Reduced_Product.inlines.hh (1.28): Drafted
+	  implementation for method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 21:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.22): Disable constrains/2 for the powersets in the interfaces.
+
+2008-08-14 Thursday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.29), ppl_interface_generator_ocaml_mli.m4 (1.14),
+	  ppl_ocaml_globals.ml (1.9): More test code removed.
+
+2008-08-14 Thursday 20:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.33), ppl_ocaml_globals.cc (1.14), tests/Makefile.am (1.6):
+	  Removed forgotten debug print statements.  Removed useless file
+	  inclusions, namespace directives, and test functions.
+
+2008-08-14 Thursday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.319): Version number bumped.
+
+2008-08-14 Thursday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.5): Link options fixed.
+
+2008-08-14 Thursday 19:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.21),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.76): Now enabled constrains, unconstrain_space_dimension and
+	  unconstrain_space_dimensions for all simple domains ie Polyhedra,
+	  Grids, Octagonal_Shapes, BD_Shapes, and Boxes
+
+	  M4 code for generating tests for the different domains added to
+	  the Prolog tests directory.
+
+2008-08-14 Thursday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.72), Grid_public.cc (1.74): Drafted
+	  implementation of method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 16:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.20),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.35),
+	  C/ppl_interface_generator_c_h_code.m4 (1.25),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.50), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.30), Java/tests/ppl_java_tests_common (1.8),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.32),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.28),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.21),
+	  OCaml/tests/test1.ml (1.2),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.67),
+	  Prolog/tests/pl_check.pl (1.54): Added constrains,
+	  unconstrain_space_dimension and unconstrain_space_dimensions for
+	  the Polyhedron domain to all the interfaces.
+
+	  Tests added for OCaml, Java and Prolog.
+
+2008-08-14 Thursday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.60), constrains1.cc (1.1): Added test
+	  for method constrains().
+
+2008-08-14 Thursday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/constrains1.cc (bounded_arithmetic.1): file
+	  constrains1.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:51 +0000
+
+2008-08-14 Thursday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.56), Box.templates.hh (1.113): Drfated
+	  implementation for method bool constrains(Variable var) const;
+
+2008-08-14 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.31), constrains1.cc (1.1):
+	  Added test for new method constrains().
+
+2008-08-14 Thursday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constrains1.cc (bounded_arithmetic.1): file
+	  constrains1.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:55 +0000
+
+2008-08-14 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.50),
+	  Octagonal_Shape.templates.hh (1.79): Drafted implementation for
+	  method   bool constrains(Variable var) const;
+
+2008-08-14 Thursday 14:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.77), constrains1.cc (1.1): Added
+	  test for new method constrains().  Corrected a bug in the tests
+	  whereby the test congruences1 was using the sources for
+	  constraints1.
+
+2008-08-14 Thursday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/constrains1.cc (bounded_arithmetic.1): file
+	  constrains1.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:51 +0000
+
+2008-08-14 Thursday 14:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.124), BD_Shape.inlines.hh (1.163),
+	  BD_Shape.templates.hh (1.107): Drafted implementation of method
+	  bool constrains() const;
+
+2008-08-14 Thursday 00:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.4): Use the -o option of
+	  `ocamlc'.
+
+2008-08-13 Wednesday 13:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.34),
+	  ppl_interface_generator_c_h_code.m4 (1.24): Fixed a bug(s) that
+	  was preventing the generation of code for
+	  get_[minimized_]_[constraints,generators,congruences] methods.
+
+2008-08-13 Wednesday 12:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/tests/Makefile.am (1.3): Define test1_SOURCES.
+
+2008-08-13 Wednesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.42): Use the -o option of
+	  `ocamlc'.  Note: it should be specified before the source file.
+
+2008-08-12 Tuesday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.247): Added one item for PPL 0.10.
+
+2008-08-12 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.60),
+	  doc/devref-java-interface.doxyconf-html.in (1.2),
+	  doc/devref-java-interface.doxyconf-latex.in (1.2),
+	  doc/devref-java-interface.tex (1.2),
+	  doc/user-java-interface.doxyconf-html.in (1.2),
+	  doc/user-java-interface.doxyconf-latex.in (1.2),
+	  doc/user-java-interface.tex (1.2),
+	  interfaces/Java/Java_interface.dox (1.1),
+	  interfaces/Java/Makefile.am (1.17): Added the required machinery
+	  to generate the documentation for the Java interface.
+
+2008-08-12 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-java-interface.tex (bounded_arithmetic.1): file
+	  devref-java-interface.tex was added on branch bounded_arithmetic
+	  on 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-java-interface.tex (bounded_arithmetic.1): file
+	  user-java-interface.tex was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.41): Distribute also
+	  OCaml_interface.dox.
+
+2008-08-12 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.48): Distribute also
+	  Prolog_interface.dox.
+
+2008-08-12 Tuesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-java-interface.doxyconf-html.in (1.1),
+	  devref-java-interface.doxyconf-latex.in (1.1),
+	  devref-java-interface.tex (1.1),
+	  user-java-interface.doxyconf-html.in (1.1),
+	  user-java-interface.doxyconf-latex.in (1.1),
+	  user-java-interface.tex (1.1): New files for the Java interface
+	  documentation.
+
+2008-08-12 Tuesday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.318), interfaces/C/Makefile.am (1.41): Distribute
+	  also C_interface.dox.
+
+2008-08-12 Tuesday 12:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.317), doc/devref-ocaml-interface.doxyconf-html.in
+	  (1.1), doc/devref-ocaml-interface.doxyconf-latex.in (1.1),
+	  doc/devref-prolog-interface.doxyconf-html.in (1.6): The machinery
+	  to generate the OCaml documentation should now be in place.  (The
+	  documentation itself still needs a lot of work.)
+
+2008-08-12 Tuesday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-ocaml-interface.tex (bounded_arithmetic.1): file
+	  devref-ocaml-interface.tex was added on branch bounded_arithmetic
+	  on 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.tex (bounded_arithmetic.1): file
+	  devref-prolog-interface.tex was added on branch
+	  bounded_arithmetic on 2008-09-11 20:37:40 +0000
+
+2008-08-12 Tuesday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.316), doc/Makefile.am (1.59),
+	  doc/devref-ocaml-interface.tex (1.1),
+	  doc/devref-prolog-interface.doxyconf-latex.in (1.6),
+	  doc/devref-prolog-interface.tex (1.1): Added machinery to
+	  generate the LaTeX developer's manual for the OCaml interface.
+	  Fixed the generation of the same kind of documentation for the
+	  Prolog interface.
+
+2008-08-12 Tuesday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.315), doc/Makefile.am (1.58),
+	  doc/user-ocaml-interface.doxyconf-html.in (1.1),
+	  interfaces/OCaml/OCaml_interface.dox (1.2): Added machinery to
+	  generate the HTML documentation for the OCaml interface.
+
+2008-08-11 Monday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.314): Configure the interfaces/OCaml/tests
+	  directory.
+
+2008-08-11 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (1.7): File
+	  ppl_prolog.icc plays no role in the generation of the user's
+	  manual.
+
+2008-08-11 Monday 18:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.40), tests/Makefile.am (1.2):
+	  Got rid of some old kludges.
+
+2008-08-11 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.39), test1.ml (1.32),
+	  tests/.cvsignore (1.1), tests/Makefile.am (1.1), tests/test1.ml
+	  (1.1): The OCaml test programs now have their own directory.	Do
+	  not install .cmo files: now everything is packed into
+	  ppl_ocaml.cma.
+
+2008-08-11 Monday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.27):
+	  Erroneous double underscore changed to single.
+
+2008-08-11 Monday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.313), doc/Makefile.am (1.57),
+	  doc/user-ocaml-interface.doxyconf-latex.in (1.1),
+	  doc/user-ocaml-interface.tex (1.1): New machinery to generate the
+	  user's manual of the OCaml interface.
+
+2008-08-11 Monday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-ocaml-interface.tex (bounded_arithmetic.1): file
+	  user-ocaml-interface.tex was added on branch bounded_arithmetic
+	  on 2008-09-11 20:37:40 +0000
+
+2008-08-11 Monday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/OCaml_interface.dox (1.1): This will contain the
+	  OCaml interface documentation that is not automatically
+	  generated.
+
+2008-08-11 Monday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.15): Work around a bug of GCC 4.0.x.
+
+2008-08-10 Sunday 12:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.13):
+	  Started the adaptation required to produce the OCaml interface
+	  documentation using ocamldoc.
+
+2008-08-09 Saturday 22:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.246): Some items dealt with;	others reconsidered.
+
+2008-08-09 Saturday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.245), doc/definitions.dox (1.213): Added a section on
+	  upward approximation to the library's documentation.
+
+2008-08-09 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset1.cc (bounded_arithmetic.1): file
+	  pointsetpowerset1.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:56 +0000
+
+2008-08-09 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset2.cc (bounded_arithmetic.1): file
+	  pointsetpowerset2.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:56 +0000
+
+2008-08-09 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/pointsetpowerset6.cc (bounded_arithmetic.1): file
+	  pointsetpowerset6.cc was added on branch bounded_arithmetic on
+	  2008-09-11 20:37:56 +0000
+
+2008-08-09 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Powerset/powerset1.cc (bounded_arithmetic.1): file
+	  powerset1.cc was added on branch bounded_arithmetic on 2008-09-11
+	  20:37:56 +0000
+
+2008-08-09 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.312), tests/Makefile.am (1.266),
+	  tests/Polyhedron/Makefile.am (1.123),
+	  tests/Polyhedron/pointsetpowerset1.cc (1.11),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.5),
+	  tests/Polyhedron/pointsetpowerset3.cc (1.3),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.7),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.5),
+	  tests/Polyhedron/pointsetpowerset6.cc (1.3),
+	  tests/Polyhedron/powerset1.cc (1.23), tests/Powerset/.cvsignore
+	  (1.1), tests/Powerset/Makefile.am (1.1),
+	  tests/Powerset/pointsetpowerset1.cc (1.1),
+	  tests/Powerset/pointsetpowerset2.cc (1.1),
+	  tests/Powerset/pointsetpowerset3.cc (1.1),
+	  tests/Powerset/pointsetpowerset4.cc (1.1),
+	  tests/Powerset/pointsetpowerset5.cc (1.1),
+	  tests/Powerset/pointsetpowerset6.cc (1.1),
+	  tests/Powerset/powerset1.cc (1.1): Tests for the Powerset class
+	  have now their own directory.
+
+2008-08-09 Saturday 19:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.311), tests/Makefile.am (1.265),
+	  tests/Grid/Makefile.am (1.66), tests/Grid/directproduct1.cc
+	  (1.49), tests/Grid/directproduct2.cc (1.16),
+	  tests/Grid/directproduct3.cc (1.19), tests/Grid/directproduct4.cc
+	  (1.15), tests/Grid/directproduct5.cc (1.11),
+	  tests/Grid/directproduct6.cc (1.15),
+	  tests/Grid/partiallyreducedproduct1.cc (1.12),
+	  tests/Grid/partiallyreducedproduct2.cc (1.6),
+	  tests/Grid/partiallyreducedproduct3.cc (1.5),
+	  tests/Grid/partiallyreducedproduct4.cc (1.5),
+	  tests/Partially_Reduced_Product/.cvsignore (1.1),
+	  tests/Partially_Reduced_Product/Makefile.am (1.1),
+	  tests/Partially_Reduced_Product/directproduct1.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct2.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct3.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct4.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct5.cc (1.1),
+	  tests/Partially_Reduced_Product/directproduct6.cc (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct1.cc
+	  (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct2.cc
+	  (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct3.cc
+	  (1.1),
+	  tests/Partially_Reduced_Product/partiallyreducedproduct4.cc
+	  (1.1): Tests for the Partially_Reduced_Product class have now
+	  their own directory.
+
+2008-08-09 Saturday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.16): Use consistent template parameters.
+	  Indentation fixed.
+
+2008-08-09 Saturday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.212): Improved the section on semantic
+	  geometric descriptors.
+
+2008-08-09 Saturday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.244), doc/definitions.dox (1.211): Started working on the
+	  completion and integration into the PPL manuals of the section
+	  about the different kinds of geometric descriptors implemented by
+	  the library.
+
+2008-08-09 Saturday 13:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (1.3): Added missing inclusion of <ppl-config.h>.
+
+2008-08-09 Saturday 13:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (bounded_arithmetic.1): file fpu-ia32.cc was
+	  added on branch bounded_arithmetic on 2008-09-11 20:37:49 +0000
+
+2008-08-09 Saturday 12:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (1.2): Added missing namespace qualification.
+
+2008-08-09 Saturday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.180), fpu-ia32.inlines.hh (1.21): Drafted
+	  code to autodetect the presence of an SSE unit.
+
+2008-08-09 Saturday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.cc (1.1): New source file containing IA-32 floating
+	  point unit non-inline related functions.
+
+2008-08-09 Saturday 11:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.20): Starting from the 2.18.50.0.4
+	  release of binutils, the x86 assembler no longer accepts `fnstsw
+	  %eax': `fnstsw %ax' should be used instead.
+
+2008-08-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.310): The Ciao-Prolog interface is no longer
+	  enabled by default.  Version number bumped.
+
+2008-08-08 Friday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.35), fpu-c99.inlines.hh (1.17),
+	  fpu-ia32.inlines.hh (1.19), fpu-none.inlines.hh (1.9),
+	  fpu-sparc.inlines.hh (1.11), fpu.defs.hh (1.20): Added stubs for
+	  fpu_initialize_control_functions(): this will allow, e.g.,
+	  detecting the presence of SSE support at run-time.
+
+2008-07-21 Monday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearsystem1.cc (1.11): Unused variable
+	  removed.
+
+2008-07-06 Sunday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxdifference1.cc (1.10): Fixed a couple of comments.
+
+2008-07-05 Saturday 21:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boxdifference1.cc (1.9): More tests added. Comments
+	  added to indicate what is being tested.
+
+2008-06-24 Tuesday 20:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.48): In methods normalize(),
+	  sign_normalize() and strong_normalize(), do not reset the
+	  sortedness flag if the number of rows is less than or equal to
+	  one.
+
+2008-06-14 Saturday 23:25  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.37): Fixed typo.
+
+2008-06-14 Saturday 16:41  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.36): Forgotten fixes.
+
+2008-06-14 Saturday 16:17  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.12): Added boundary complement.
+
+2008-06-14 Saturday 16:17  Abramo Bagnara
+
+	* src/Interval.inlines.hh (1.35): Untested attempt to implement
+	  interval difference.
+
+2008-06-10 Tuesday 11:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc (1.73), Pointset_Powerset.cc (1.20),
+	  Pointset_Powerset.defs.hh (1.40): In
+	  Grid::join_assign_if_exact(), added an assertion.
+
+	  In Pointset_Powerset.defs.hh corrected and improved brief
+	  description for approximate_partition().
+
+	  In Pointset_Powerset.cc, in approximate_partition(), ensure
+	  congruence system of grid q is minimized before copying;
+
+	  in approximate_partition_aux(), now there is no need to minimize
+	  the congruence system here.
+
+2008-06-10 Tuesday 09:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (1.24): In Grid::fold_space_dimensions(),
+	  emphasize the fact tha Grid::generators() is only called for its
+	  side-effects.
+
+2008-06-10 Tuesday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_chdims.cc (1.23): Efficiency bug fixed in
+	  fold_space_dimensions().
+
+2008-06-08 Sunday 20:44  Andrea Cimino
+
+	* src/MIP_Problem_GLPK.icc (simplex.4): Solved a bug when computing
+	  the bounds to pass to the GLPK exact solver.	This commit makes
+	  'mippproblem3' test pass.
+
+2008-06-08 Sunday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.47): In
+	  Polyhedron::fold_space_dimensions(), emphasize the fact that
+	  Polyhedron::generators() is only called for its side-effects.
+
+2008-06-08 Sunday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.78): Spurious indentation
+	  fixed.
+
+2008-06-08 Sunday 18:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.46): Improved the efficiency of
+	  method fold_space_dimensions() by making sure that we compute at
+	  most one conversion from the constraint to the generator
+	  representation.
+
+2008-06-07 Saturday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem_GLPK.icc (simplex.3): Previous commit corrected
+	  and completed.  Code formatting fixed.
+
+2008-06-07 Saturday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem_GLPK.icc (simplex.2): Declaration and uses of the
+	  `statuses' write-only variable have been removed.
+
+2008-06-07 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.cc, MIP_Problem_GLPK.icc, MIP_Problem_PPL.icc,
+	  Makefile.am (simplex.[9,1,1,7]): Not the code for the PPL's MIP
+	  native solver and the code for the GLPK interface are completely
+	  separated.
+
+2008-06-07 Saturday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.8): Indentation fixed.  In many
+	  places, throw std::run_time_error instead of
+	  std::invalid_argument.
+
+2008-06-07 Saturday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.7): The code controlled by
+	  PPL_NOISY_SIMPLEX now systematically prints on std:cerr.  That
+	  macro has also been documented.
+
+2008-06-07 Saturday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.6): Properly commented long-scope
+	  #if's, #else's and #endif's.
+
+2008-06-07 Saturday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (simplex.2): Updated the text concerning Andrea Cimino.
+
+2008-06-07 Saturday 07:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.rpath (1.5), m4/lib-link.m4 (1.3), m4/lib-prefix.m4 (1.4):
+	  Updated from Gettext 0.17.
+
+2008-06-06 Friday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (simplex.5): New configure options:  `--with-glpk'
+	  checks whether the PPL should use the GLPK MIP solver, if
+	  available (the default is not to use it); `--with-glpk-glpssx'
+	  allows to specify the path where GLPK's glpssx.h can be found.
+
+2008-06-06 Friday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.5): Use the `PPL_USE_GLPK_MIP_SOLVER'
+	  symbol instead of `PPL_USE_GLPK'.  Define HAVE_GMP before
+	  including <glpssx.h> and <glpk.h>, undefining it after these
+	  inclusions.  The ulset() function does not exist in GLPK 4.28:
+	  use xlset() instead.
+
+2008-06-06 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore, ChangeLog, INSTALL, NEWS, README.configure, TODO,
+	  config.guess, config.sub, configure.ac, depcomp, install-sh,
+	  instchk.hh, ltmain.sh, Watchdog/.cvsignore, Watchdog/ChangeLog,
+	  Watchdog/INSTALL, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	  Watchdog/doc/fdl.dox, Watchdog/doc/gpl.dox,
+	  Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	  Watchdog/m4/libtool.m4, Watchdog/m4/ltoptions.m4,
+	  Watchdog/m4/ltsugar.m4, Watchdog/m4/ltversion.m4,
+	  Watchdog/m4/lt~obsolete.m4, Watchdog/src/.cvsignore,
+	  doc/definitions.dox, doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-c-interface.tex,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/fdl.dox, doc/gpl.dox,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, fedora/Makefile.am,
+	  fedora/ppl.hh, fedora/ppl.spec, fedora/ppl_c.h, fedora/pwl.hh,
+	  interfaces/.cvsignore, interfaces/Makefile.am,
+	  interfaces/README.interfaces, interfaces/interfaced_boxes.hh,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4,
+	  interfaces/C/.cvsignore, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_procedure_generators.m4,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/OCaml/.cvsignore, interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/README.ocaml,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/Prolog/.cvsignore, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/Ciao/.cvsignore,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/.cvsignore,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/.cvsignore,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/.cvsignore,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/.cvsignore,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/YAP/.cvsignore,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/tests/.cvsignore,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/ac_check_ciao.m4, m4/libtool.m4, m4/ltoptions.m4,
+	  m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4,
+	  src/.cvsignore, src/Any_Pointset.defs.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bit_Row.defs.hh,
+	  src/Bit_Row.inlines.hh, src/Boundary.defs.hh, src/Box.defs.hh,
+	  src/Box.inlines.hh, src/Box.templates.hh,
+	  src/Box_Status.idefs.hh, src/Box_Status.inlines.hh,
+	  src/C_Integer.hh, src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Congruence.inlines.hh,
+	  src/Float.defs.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Grid.defs.hh, src/Grid.inlines.hh,
+	  src/Grid.templates.hh, src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Init.cc,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval_Info.defs.hh, src/Makefile.am,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Og_Status.idefs.hh, src/Partially_Reduced_Product.defs.hh,
+	  src/Partially_Reduced_Product.inlines.hh,
+	  src/Partially_Reduced_Product.templates.hh,
+	  src/Ph_Status.idefs.hh, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.templates.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Rational_Box.hh,
+	  src/Rational_Interval.hh, src/Row.inlines.hh,
+	  src/Temp.inlines.hh, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/compiler.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/math_utilities.defs.hh, src/math_utilities.inlines.hh,
+	  src/meta_programming.hh, src/ppl_header.hh, src/simplify.cc,
+	  tests/Random_Number_Generator.inlines.hh, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/boundingbox1.cc, tests/BD_Shape/bounds1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/congruences1.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/frombdshape1.cc,
+	  tests/BD_Shape/frombox1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/fromgrid1.cc,
+	  tests/BD_Shape/fromoctagonalshape1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/fromspacedim1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/pointsetpowerset1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/unconstrain1.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdshape1.cc,
+	  tests/Box/Makefile.am, tests/Box/addconstraints1.cc,
+	  tests/Box/addspacedims1.cc, tests/Box/affineimage1.cc,
+	  tests/Box/affinepreimage1.cc, tests/Box/bdsdifference1.cc,
+	  tests/Box/boundedaffineimage1.cc,
+	  tests/Box/boundedaffinepreimage1.cc, tests/Box/boxdifference1.cc,
+	  tests/Box/boxhull.cc, tests/Box/boxhull1.cc,
+	  tests/Box/cc76narrowing1.cc, tests/Box/cc76widening.cc,
+	  tests/Box/closure1.cc, tests/Box/concatenate1.cc,
+	  tests/Box/congruences1.cc, tests/Box/constraints1.cc,
+	  tests/Box/expandspacedim1.cc, tests/Box/foldspacedims1.cc,
+	  tests/Box/frombdshape1.cc, tests/Box/fromgensys1.cc,
+	  tests/Box/frompolyhedron1.cc,
+	  tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffineimage2.cc,
+	  tests/Box/generalizedaffinepreimage1.cc,
+	  tests/Box/geomcovers1.cc, tests/Box/intersection1.cc,
+	  tests/Box/interval1.cc, tests/Box/interval2.cc,
+	  tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+	  tests/Box/membytes1.cc, tests/Box/minconstraints1.cc,
+	  tests/Box/pointsetpowerset1.cc, tests/Box/pointsetpowerset2.cc,
+	  tests/Box/refine1.cc, tests/Box/refine2.cc, tests/Box/refine3.cc,
+	  tests/Box/refinewithcongruences1.cc,
+	  tests/Box/refinewithconstraint1.cc,
+	  tests/Box/refinewithconstraint2.cc,
+	  tests/Box/refinewithconstraints1.cc,
+	  tests/Box/refinewithconstraints2.cc, tests/Box/relations2.cc,
+	  tests/Box/relations3.cc, tests/Box/relations4.cc,
+	  tests/Box/removespacedims1.cc, tests/Box/timeelapse1.cc,
+	  tests/Box/unconstrain1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/congruences1.cc, tests/Grid/copyconstruct1.cc,
+	  tests/Grid/directproduct3.cc, tests/Grid/directproduct5.cc,
+	  tests/Grid/directproduct6.cc, tests/Grid/fromgrid1.cc,
+	  tests/Grid/frompolyhedron1.cc, tests/Grid/grid3.cc,
+	  tests/Grid/mincongruences1.cc,
+	  tests/Grid/partiallyreducedproduct1.cc,
+	  tests/Grid/partiallyreducedproduct2.cc,
+	  tests/Grid/partiallyreducedproduct3.cc,
+	  tests/Grid/partiallyreducedproduct4.cc,
+	  tests/Grid/pointsetpowerset1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/refinewithcongruences1.cc,
+	  tests/Grid/refinewithconstraints1.cc, tests/Grid/unconstrain1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/congruences1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/frombox1.cc,
+	  tests/Octagonal_Shape/fromoctagonalshape1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/pointsetpowerset1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithcons3.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/unconstrain1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/hybrid.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/pointsetpowerset2.cc,
+	  tests/Polyhedron/pointsetpowerset3.cc,
+	  tests/Polyhedron/pointsetpowerset4.cc,
+	  tests/Polyhedron/pointsetpowerset5.cc,
+	  tests/Polyhedron/pointsetpowerset6.cc,
+	  tests/Polyhedron/refinewithcongruence1.cc,
+	  tests/Polyhedron/refinewithcongruences1.cc,
+	  tests/Polyhedron/refinewithconstraint1.cc,
+	  tests/Polyhedron/refinewithconstraints1.cc,
+	  tests/Polyhedron/unconstrain1.cc, utils/cm_cleaner.sh,
+	  utils/cm_splitter.sh
+	  (simplex.[1,4,3,4,4,7,5,5,4,2,4,4,3,1,4,3,5,5,3,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,4,3,3,3,3,3,5,4,4,1,2,3,3,3,3,3,3,4,4,4,3,2,3,2,2,1,4,2,2,3,3,2,1,4,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,1,4,3,3,3,3,3,3,3,3,2,3,1,4,3,3,3,2,3,3,1,4,3,3,1,4,3,2,4,3,3,1,4,3,3,1,4,3,3,3,1,4,3,1,4,3,3,3,3,2,2,2,2,2,2,2,3,4,4,5,6,5,3,3,3,3,3,3,2,2,3,4,5,5,5,5,5,4,5,5,7,4,5,5,5,5,4,5,5,5,4,4,3,3,6,4,5,5,3,3,3,3,3,3,3,4,3,3,3,3,3,3,5,5,4,5,5,3,3,2,3,3,4,4,4,5,4,4,4,4,3,5,3,2,2,3,3,3,4,5,5,3,5,5,4,4,5,4,5,4 [...]
+	  Fifth merge of the trunk to the `simplex' branch.
+
+2008-06-06 Friday 16:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.4): Extended the scope of an #ifdef
+	  PPL_USE_GLPK.
+
+2008-06-06 Friday 14:10  Andrea Cimino
+
+	* src/: MIP_Problem.cc, MIP_Problem.defs.hh (simplex.[3,3]): As an
+	  option, now the PPL can use the exact simplex solver of GLPK.
+
+2008-06-05 Thursday 15:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am, wrap1.cc
+	  (bounded_arithmetic.[1,1]): New file wrap1.cc will contain tests
+	  for method Polyhedron::wrap_assign().
+
+2008-06-05 Thursday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, Polyhedron_public.cc
+	  (bounded_arithmetic.[1,1]): Added the declaration and a stub
+	  implementation of new method Polyhedron::wrap_assign().
+
+2008-06-05 Thursday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (bounded_arithmetic.1): New enumerations
+	  Bounded_Integer_Type_Width, Bounded_Integer_Type_Signedness and
+	  Bounded_Integer_Type_Overflow to encode the width, signedness and
+	  overflow behavior of bounded integer types, respectively.
+
+2008-05-26 Monday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (1.8): Capitalization fixed.
+
+2008-05-25 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_ciao.m4 (simplex.1): file ac_check_ciao.m4 was added
+	  on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-25 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.309), interfaces/Prolog/Ciao/Makefile.am (1.73),
+	  m4/ac_check_ciao.m4 (1.1): Added machinery to automatically find
+	  the header files of the Ciao Prolog foreign language interface.
+
+2008-05-24 Saturday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.308): Version number bumped.
+
+2008-05-24 Saturday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.26): Updated.
+
+2008-05-12 Monday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.43), Congruence.inlines.hh
+	  (1.20), Grid_Generator_System.inlines.hh (1.18),
+	  NNC_Polyhedron.inlines.hh (1.44): Define inline methods before
+	  their first invocation.
+
+2008-05-12 Monday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.123), Octagonal_Shape.defs.hh (1.49):
+	  Obsolete workarounds removed.
+
+2008-05-12 Monday 08:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.55): Obsolete workarounds removed.
+
+2008-05-12 Monday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: compiler.hh (1.14), fpu.defs.hh (1.19): The Intel C/C++
+	  compilers accept the same asm() syntax as GCC.
+
+2008-05-11 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.54), Box.inlines.hh (1.33), Box.templates.hh
+	  (1.112), Box_Status.idefs.hh (1.3), Box_Status.inlines.hh (1.3):
+	  Avoid name clashes between the parameter of class Box and class
+	  Interval.
+
+2008-05-11 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box_Status.idefs.hh (simplex.1): file Box_Status.idefs.hh was
+	  added on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-11 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box_Status.inlines.hh (simplex.1): file Box_Status.inlines.hh
+	  was added on branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-11 Sunday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.111): Dead code removed.
+
+2008-05-11 Sunday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.53): Useless inclusion removed.
+
+2008-05-11 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.106), Octagonal_Shape.templates.hh
+	  (1.77): Unreachable breaks removed.
+
+2008-05-11 Sunday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (1.17): Inclusions fixed.
+
+2008-05-11 Sunday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.cc (1.67), Polyhedron_public.cc (1.117):
+	  Unreachable breaks removed.
+
+2008-05-11 Sunday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.39): Inclusions fixed.
+
+2008-05-11 Sunday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: compiler.hh (1.13), fpu.defs.hh (1.18): Do not try to use
+	  asm() statements unless defined(__GNUC__).
+
+2008-05-11 Sunday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.54): Warning avoided.
+
+2008-05-11 Sunday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.110): Code formatting improved.
+
+2008-05-11 Sunday 21:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.105), Octagonal_Shape.templates.hh
+	  (1.76): Avoid shadowing and repeated computations.
+
+2008-05-10 Saturday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.307): When the --enable-more-assertions option is
+	  given, we define both _GLIBCXX_DEBUG and _GLIBCXX_DEBUG_PEDANTIC;
+	  this way, when libstdc++ is used, it is used in pedantic debug
+	  mode.
+
+2008-05-10 Saturday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.34), Polyhedron.defs.hh (1.337),
+	  Polyhedron_public.cc (1.116), simplify.cc (1.51): Fixed an (until
+	  now) inconsequential problem whereby we were using the STL
+	  outside its specifications (problem spotted by Stefano Soffia and
+	  further analyzed by Enea Zaffanella).
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/libtool.m4 (simplex.1): file libtool.m4 was added on branch
+	  simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added on
+	  branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltversion.m4 (simplex.1): file ltversion.m4 was added on
+	  branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was added on
+	  branch simplex on 2008-06-06 14:22:04 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/libtool.m4 (simplex.1): file libtool.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ltoptions.m4 (simplex.1): file ltoptions.m4 was added
+	  on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ltversion.m4 (simplex.1): file ltversion.m4 was added
+	  on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/lt~obsolete.m4 (simplex.1): file lt~obsolete.m4 was
+	  added on branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-05-05 Monday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.306), ltmain.sh (1.34), Watchdog/configure.ac
+	  (1.45), Watchdog/ltmain.sh (1.23), Watchdog/m4/libtool.m4 (1.5),
+	  Watchdog/m4/ltoptions.m4 (1.3), Watchdog/m4/ltversion.m4 (1.4),
+	  Watchdog/m4/lt~obsolete.m4 (1.2), m4/libtool.m4 (1.5),
+	  m4/ltoptions.m4 (1.3), m4/ltversion.m4 (1.4), m4/lt~obsolete.m4
+	  (1.2): Updated to Libtool 2.2.4.
+
+2008-05-04 Sunday 09:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.13): Temporarily work around a problem
+	  whereby testing for the existence of <fenv.h> is no longer enough
+	  for our purposes.
+
+2008-05-04 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh (1.12): Include <ctime>.
+
+2008-05-04 Sunday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.104): Use explicit braces to avoid
+	  ambiguous `else'.
+
+2008-04-30 Wednesday 12:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-c-interface.tex (1.5), devref.tex (1.26),
+	  user-c-interface.tex (1.5), user-prolog-interface.tex (1.5),
+	  user.tex (1.27): Package inclusions updated.	We now set the
+	  `tocdepth' counter to 2 in order to obtain a more useful index.
+
+2008-04-29 Tuesday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.103): Avoid useless computation in
+	  minimized_congruences(), thereby also silencing a compiler
+	  warning.
+
+2008-04-29 Tuesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/pointsetpowerset1.cc (1.3): Test 15 is no longer
+	  failing.
+
+2008-04-29 Tuesday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+	  14:22:11 +0000
+
+2008-04-28 Monday 16:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.inlines.hh (1.35),
+	  Octagonal_Shape.templates.hh (1.75): Corrected an efficiency bug
+	  in methods minimized_congruences() and congruences().  In method
+	  OK(), do not check for closure if the shape is based on non-exact
+	  (i.e., floating point) coefficients.
+
+2008-04-28 Monday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.162), BD_Shape.templates.hh (1.102):
+	  Corrected an efficiency bug in methods minimized_congruences()
+	  and congruences().
+
+2008-04-28 Monday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Float.defs.hh (1.29): Added missing inclusion of
+	  meta_programming.hh.
+
+2008-04-27 Sunday 16:28  Abramo Bagnara
+
+	* src/Temp.inlines.hh (1.5): Added missing inline.
+
+2008-04-27 Sunday 16:28  Abramo Bagnara
+
+	* src/Float.defs.hh (1.28): Added True/False helper.
+
+2008-04-24 Thursday 08:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.48), Polyhedron.defs.hh (1.336):
+	  Do not refer to the undefined concept `reduced' for congruence
+	  systems.
+
+2008-04-24 Thursday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.defs.hh (1.71): Minor improvements in documentation: do
+	  not refer to `reduced' congruence systems since it is undefined
+	  terminology at the user level.
+
+2008-04-24 Thursday 08:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.122): Minor fix in the indentation of the
+	  documentation.
+
+2008-04-23 Wednesday 16:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.19),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.33),
+	  C/ppl_interface_generator_c_h_code.m4 (1.23),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.49), Java/jni/ppl_java_common.cc (1.38),
+	  Java/tests/ppl_interface_generator_java_test_java_code.m4 (1.29),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.31),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.26),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.20),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.66),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.75), Prolog/tests/ppl_predicate_check_common.pl (1.11): Added
+	  to all the interfaces the unconstrain() procedure.
+
+	  Added (except to the C interface which already had it) the
+	  constrains() procedure.
+
+	  Added to the Prolog interface the option of building from a
+	  friend with complexity specified.
+
+	  Tests added for all new code in the Prolog and Java interfaces.
+
+2008-04-23 Wednesday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_common_procedure_generators.m4 was added
+	  on branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-04-23 Wednesday 12:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/pointsetpowerset1.cc (1.4),
+	  Octagonal_Shape/pointsetpowerset1.cc (1.4): Revised the distances
+	  from the exact values in test 03.
+
+2008-04-23 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+	  14:22:09 +0000
+
+2008-04-23 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset5.cc (simplex.1): file
+	  pointsetpowerset5.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset6.cc (simplex.1): file
+	  pointsetpowerset6.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/pointsetpowerset2.cc (simplex.1): file
+	  pointsetpowerset2.cc was added on branch simplex on 2008-06-06
+	  14:22:10 +0000
+
+2008-04-23 Wednesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/pointsetpowerset1.cc (1.3),
+	  Box/pointsetpowerset1.cc (1.6), Box/pointsetpowerset2.cc (1.2),
+	  Grid/pointsetpowerset1.cc (1.2),
+	  Octagonal_Shape/pointsetpowerset1.cc (1.3), Polyhedron/hybrid.cc
+	  (1.6), Polyhedron/pointsetpowerset1.cc (1.10),
+	  Polyhedron/pointsetpowerset2.cc (1.4),
+	  Polyhedron/pointsetpowerset5.cc (1.4),
+	  Polyhedron/pointsetpowerset6.cc (1.2): Do not put spaces around
+	  operator->().
+
+2008-04-22 Tuesday 19:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/Makefile.am (1.30): Type corrected.
+
+2008-04-22 Tuesday 17:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/pointsetpowerset1.cc (1.2): Allow for non-integral
+	  numbers using check_result().
+
+2008-04-22 Tuesday 17:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/pointsetpowerset1.cc (1.2): Allow for non
+	  integral results using check_results() on the disjuncts.
+
+2008-04-22 Tuesday 11:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.228), src/Pointset_Powerset.cc (1.19),
+	  src/Pointset_Powerset.defs.hh (1.38),
+	  src/Pointset_Powerset.inlines.hh (1.15),
+	  src/Pointset_Powerset.templates.hh (1.32),
+	  tests/BD_Shape/Makefile.am (1.76),
+	  tests/BD_Shape/pointsetpowerset1.cc (1.1), tests/Box/Makefile.am
+	  (1.59), tests/Box/pointsetpowerset2.cc (1.1),
+	  tests/Grid/Makefile.am (1.65), tests/Grid/pointsetpowerset1.cc
+	  (1.1), tests/Octagonal_Shape/Makefile.am (1.29),
+	  tests/Octagonal_Shape/pointsetpowerset1.cc (1.1),
+	  tests/Polyhedron/Makefile.am (1.122),
+	  tests/Polyhedron/pointsetpowerset6.cc (1.1): Added constructors
+	  for the pointset powerset domain from other domains that are not
+	  products or powersets.
+
+	  Added to all the constructors for the pointset powerset domain
+	  from other sematic domains an optional complexity argument.
+
+	  Tests for these new constructors added.  A note added in the NEWS
+	  file on these additions
+
+2008-04-22 Tuesday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.defs.hh (1.60): Properly order the list of
+	  parameters of NNC_Polyhedron(grid, complexity) in the doxygen
+	  documentation.
+
+2008-04-22 Tuesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.227): Mention the new unconstrain() methods.
+
+2008-04-22 Tuesday 09:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/pointsetpowerset1.cc (1.5): Tests 4 to 19 uncommented
+	  and adapted to use the box domain.
+
+2008-04-22 Tuesday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.43): Added a note on the implementation
+	  of gcdext_exact().
+
+2008-04-21 Monday 22:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/NNC_Polyhedron.defs.hh (1.59): Document the parameter
+	  complexity in: NNC_Polyhedron(const Grid &grid,
+	  Complexity_Class complexity=ANY_COMPLEXITY)
+
+2008-04-21 Monday 12:13  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.101): Corrected the private method
+	  `get_limiting_shape' when `cs' contains an equality.
+
+2008-04-18 Friday 14:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.30),
+	  Partially_Reduced_Product.inlines.hh (1.27): Added methods
+	  unconstrain() to class Partially_Reduced_Product.
+
+2008-04-18 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-04-18 Friday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/frombdshape1.cc (1.2),
+	  Octagonal_Shape/fromoctagonalshape1.cc (1.2): Corrected typos:
+	  the assignment operator is not meant to implement a conversion
+	  between different kinds of BD_ or Octagonal_ shapes.
+
+2008-04-18 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frombdshape1.cc (simplex.1): file frombdshape1.cc
+	  was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-18 Friday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.29),
+	  src/Partially_Reduced_Product.inlines.hh (1.26),
+	  tests/Grid/directproduct6.cc (1.14): Added a constructor for a
+	  product from another product but with possibly different
+	  templatic parameters.
+
+2008-04-18 Friday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.28),
+	  src/Partially_Reduced_Product.inlines.hh (1.25),
+	  tests/Grid/directproduct6.cc (1.13): Added the complexity class
+	  parameter for the copy constructor for the product domain.
+
+2008-04-18 Friday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/fromgrid1.cc (simplex.1): file fromgrid1.cc was added
+	  on branch simplex on 2008-06-06 14:22:11 +0000
+
+2008-04-18 Friday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct4.cc (simplex.1): file
+	  partiallyreducedproduct4.cc was added on branch simplex on
+	  2008-06-06 14:22:11 +0000
+
+2008-04-18 Friday 10:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.121), src/BD_Shape.inlines.hh (1.161),
+	  src/Box.defs.hh (1.52), src/Box.inlines.hh (1.32),
+	  src/Box.templates.hh (1.109), src/C_Polyhedron.defs.hh (1.58),
+	  src/C_Polyhedron.inlines.hh (1.42), src/Grid.defs.hh (1.70),
+	  src/Grid_public.cc (1.72), src/NNC_Polyhedron.defs.hh (1.58),
+	  src/NNC_Polyhedron.inlines.hh (1.43), src/Octagonal_Shape.defs.hh
+	  (1.47), src/Octagonal_Shape.inlines.hh (1.34),
+	  src/Partially_Reduced_Product.defs.hh (1.27),
+	  src/Partially_Reduced_Product.inlines.hh (1.24),
+	  src/Polyhedron.defs.hh (1.335), src/Polyhedron_nonpublic.cc
+	  (1.83), tests/BD_Shape/Makefile.am (1.75),
+	  tests/BD_Shape/frombdshape1.cc (1.1), tests/Grid/Makefile.am
+	  (1.64), tests/Grid/copyconstruct1.cc (1.10),
+	  tests/Grid/directproduct6.cc (1.12), tests/Grid/fromgrid1.cc
+	  (1.1), tests/Grid/partiallyreducedproduct1.cc (1.11),
+	  tests/Grid/partiallyreducedproduct2.cc (1.5),
+	  tests/Grid/partiallyreducedproduct3.cc (1.4),
+	  tests/Grid/partiallyreducedproduct4.cc (1.4),
+	  tests/Octagonal_Shape/Makefile.am (1.28),
+	  tests/Octagonal_Shape/fromoctagonalshape1.cc (1.1): Added to the
+	  Partially_Reduced_Product<> class in the semantic GD constructors
+	  from other classes a complexity parameter.
+
+	  Tests for this have been added as needed. Also some comments wrt
+	  the tests for the product domain have been corrected.
+
+	  In the Grid, Box, BD_Shape and Octagonal_Shape added a complexity
+	  class parameter to the copy constructor and to the constructor
+	  from the same class but with a different numeric class (where
+	  applicable).
+
+	  Test files added where no obvious test for the copy constructor
+	  could be found. For the grid tests, the test file
+	  copyconstruct1.cc has been renamed for uniformity with other
+	  tests and the other classes.
+
+2008-04-18 Friday 09:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.19), Pointset_Ask_Tell.defs.hh
+	  (1.16), Pointset_Ask_Tell.templates.hh (1.14): Added the
+	  unconstrain() methods to Any_Pointset and Pointset_Ask_Tell.
+
+2008-04-18 Friday 09:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.58), unconstrain1.cc (1.1): Added a
+	  test for the new Box::unconstrain() methods.
+
+2008-04-18 Friday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/unconstrain1.cc (simplex.1): file unconstrain1.cc was
+	  added on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-04-18 Friday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.51), Box.inlines.hh (1.31), Box.templates.hh
+	  (1.108): Added methods unconstrain().
+
+2008-04-17 Thursday 18:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/C_Polyhedron.cc (1.27), src/C_Polyhedron.defs.hh (1.57),
+	  src/NNC_Polyhedron.cc (1.27), src/NNC_Polyhedron.defs.hh (1.57),
+	  tests/Polyhedron/cnncconversion1.cc (1.6): Added a complexity
+	  parameter for converting between C and NNC polyhedra. This is
+	  ignored.
+
+	  A couple of tests added to cnncconversion1.cc.
+
+2008-04-17 Thursday 17:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.63), unconstrain1.cc (1.1): Added
+	  tests for unconstrain() for the grids.
+
+2008-04-17 Thursday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/unconstrain1.cc (simplex.1): file unconstrain1.cc was
+	  added on branch simplex on 2008-06-06 14:22:11 +0000
+
+2008-04-17 Thursday 17:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.69), Grid_public.cc (1.71): Added methods
+	  unconstrain().
+
+2008-04-17 Thursday 17:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.26), C_Polyhedron.defs.hh (1.56),
+	  C_Polyhedron.inlines.hh (1.41), NNC_Polyhedron.cc (1.26),
+	  NNC_Polyhedron.defs.hh (1.56), NNC_Polyhedron.inlines.hh (1.42),
+	  Polyhedron.templates.hh (1.19): Fixed indentation.
+
+2008-04-17 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frombox1.cc (simplex.1): file frombox1.cc was
+	  added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-17 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frombox1.cc (simplex.1): file frombox1.cc
+	  was added on branch simplex on 2008-06-06 14:22:12 +0000
+
+2008-04-17 Thursday 16:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.120), src/BD_Shape.inlines.hh (1.160),
+	  src/Grid.defs.hh (1.68), src/Grid.inlines.hh (1.24),
+	  src/Grid.templates.hh (1.34), src/Octagonal_Shape.defs.hh (1.46),
+	  src/Octagonal_Shape.inlines.hh (1.33), tests/BD_Shape/Makefile.am
+	  (1.74), tests/BD_Shape/boundingbox1.cc (1.4),
+	  tests/BD_Shape/frombox1.cc (1.1),
+	  tests/Octagonal_Shape/Makefile.am (1.27),
+	  tests/Octagonal_Shape/frombox1.cc (1.1): Added a complexity
+	  parameter for the constructors for the grid, bd_shape and
+	  octagonal_shape from the other semantic GD's.  In all cases the
+	  parameter is ignored.
+
+	  Added tests for the Octagonal_Shape domain for building from a
+	  box.	This file is a clone (with only trivial changes for the
+	  change of domain) of the old boundingbox1.cc (renamed for
+	  consistency as frombox1.cc) in BD_Shape tests directory.
+
+2008-04-17 Thursday 16:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: C_Polyhedron.cc (1.25), C_Polyhedron.defs.hh (1.55),
+	  C_Polyhedron.inlines.hh (1.40), NNC_Polyhedron.cc (1.25),
+	  NNC_Polyhedron.defs.hh (1.55), NNC_Polyhedron.inlines.hh (1.41):
+	  Added an extra complexity parameter for building polyhedra from a
+	  box, bd shape, octagonal shape, and a grid.  In all cases the
+	  parameter is ignored.
+
+2008-04-17 Thursday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.31): Fixed indentation;
+	  added implementation of methods unconstrain().
+
+2008-04-17 Thursday 15:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.37): Fixed indentation and
+	  grouping of methods.	Declared new methods unconstrain().
+
+2008-04-17 Thursday 15:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.210): Added bibligraphic entry HMT71.
+
+2008-04-17 Thursday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.209): Added a subsection about
+	  cylindrification of polyhedra.
+
+2008-04-17 Thursday 13:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.115): In the implementation of affine
+	  images/preimages, use new methods unconstrain() when appropriate.
+
+2008-04-17 Thursday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/unconstrain1.cc (simplex.1): file
+	  unconstrain1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-04-17 Thursday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.73), BD_Shape/unconstrain1.cc
+	  (1.1), Octagonal_Shape/Makefile.am (1.26),
+	  Octagonal_Shape/unconstrain1.cc (1.1): Added tests for the
+	  unconstrain() methods for BD_Shape and Octagonal_Shape.
+
+2008-04-17 Thursday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/unconstrain1.cc (simplex.1): file unconstrain1.cc
+	  was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-04-17 Thursday 13:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.119), BD_Shape.templates.hh (1.100),
+	  Octagonal_Shape.defs.hh (1.45), Octagonal_Shape.templates.hh
+	  (1.74): Added methods unconstrain() for BD_Shape and
+	  Octagonal_Shape.
+
+2008-04-17 Thursday 13:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Polyhedron.defs.hh (1.334), Polyhedron.templates.hh (1.18),
+	  Polyhedron_public.cc (1.114): Replaced common code in
+	  add_constraint() and refine_with_constraint() with a call to a
+	  private method refine_no_check() that does the same thing as the
+	  common code.
+
+	  Added an extra complexity parameter for the constructor of a
+	  polyhedron from a box. This is ignored (as algorithm is
+	  polynomial).
+
+2008-04-17 Thursday 12:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.121), unconstrain1.cc (1.1):
+	  Added some tests for new methods unconstrain().
+
+2008-04-17 Thursday 12:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/unconstrain1.cc (simplex.1): file
+	  unconstrain1.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-04-17 Thursday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.113): Corrected cut&paste error in
+	  the implementation of unconstrain(vs).
+
+2008-04-17 Thursday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.333), Polyhedron_public.cc (1.112):
+	  Added new methods   void unconstrain(Variable var);	void
+	  unconstrain(const Variable_Set& to_be_unconstrained); that modify
+	  the polyhedron by computing the cylindrification on the specified
+	  space dimensions.  In the documentation, moved the static methods
+	  can_recycle_constraints and can_recycle_congruences to a better
+	  place.
+
+2008-04-17 Thursday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.243): Added (partial) lists of the semantic GDs (simple
+	  and the constructors) in the section on Semantic geometric
+	  descriptors.
+
+2008-04-12 Saturday 22:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.70), tests/Grid/Makefile.am (1.62),
+	  tests/Grid/frompolyhedron1.cc (1.1), tests/Grid/grid3.cc (1.26):
+	  Corrected two bugs in the revised code for constructing a grid
+	  from a polyhedron with complexity class:
+
+	  The space dimension of the generator system must be set to be
+	  that of the polyhedron.
+
+	  After minimizing the polyhedron (in the case that the complexity
+	  is ANY_COMPLEXITY), we must check if the polyhedron is empty, and
+	  if it is return the empty grid.
+
+	  Added a new test file for checking this constructor, moved
+	  existing tests for it that were in grid3.cc to the new test file,
+	  and added a few extra tests to check the use of complexity
+	  classes.
+
+2008-04-12 Saturday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/frompolyhedron1.cc (simplex.1): file
+	  frompolyhedron1.cc was added on branch simplex on 2008-06-06
+	  14:22:11 +0000
+
+2008-04-12 Saturday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.67), Grid_public.cc (1.69): The constructor
+	  of a grid from a polyhedron now takes an optional argument
+	  specifying an upper bound to the complexity of the conversion to
+	  be applied.
+
+2008-04-10 Thursday 17:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.242): Small improvements to the description of
+	  syntactic/semantics GDs.
+
+2008-04-02 Wednesday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.33), Watchdog/ltmain.sh (1.22),
+	  Watchdog/m4/libtool.m4 (1.4), Watchdog/m4/ltoptions.m4 (1.2),
+	  Watchdog/m4/ltversion.m4 (1.3), m4/libtool.m4 (1.4),
+	  m4/ltoptions.m4 (1.2), m4/ltversion.m4 (1.3): Updated from
+	  Libtool 2.2.2.
+
+2008-03-29 Saturday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.305): Version number bumped.
+
+2008-03-25 Tuesday 10:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.18), src/Pointset_Powerset.defs.hh
+	  (1.36), src/Pointset_Powerset.inlines.hh (1.14),
+	  src/Pointset_Powerset.templates.hh (1.30),
+	  tests/Grid/powersetdifference1.cc (1.5),
+	  tests/Polyhedron/pointsetpowerset1.cc (1.9): Changes mainly
+	  affect poly_difference_assign().
+
+	  Added difference_assign() to be a clone of
+	  poly_difference_assign().  Added a couple of tests and improved
+	  an existing test.
+
+	  Replaced all lines: // FIXME: this is buggy when PS is not an
+	  abstraction of NNC_Polyhedron.  by // This code is only used when
+	  PS is an abstraction of NNC_Polyhedron.  since the Grid domains
+	  are specialised separately.
+
+	  Corrected a bug in poly_difference_assign() for Grids where some
+	  precision was wrongly lost (when a remainder was negative and had
+	  been assumed to be positive).
+
+2008-03-22 Saturday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/: devref.tex (1.5), fdl.dox (1.2), gpl.dox (1.3),
+	  user.tex (1.5): Properly named page anchors so as to avoid
+	  undefined references in the LaTeX documentation.
+
+2008-03-22 Saturday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/doc/: devref.doxyconf-html.in (1.2),
+	  devref.doxyconf-latex.in (1.2), user.doxyconf-html.in (1.3),
+	  user.doxyconf-latex.in (1.3): Doxygen configuration files
+	  upgraded.
+
+2008-03-21 Friday 10:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.32),
+	  ppl_interface_generator_c_h_code.m4 (1.22): Removed the now
+	  redundant code for add_recycled_..._and_minimize procedures.
+
+2008-03-21 Friday 10:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (1.6): Removed the
+	  add_recycled_constraints/congruences_and_minimize from the list
+	  of procedures to build.
+
+2008-03-21 Friday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_c_procedure_generators.m4 was added on
+	  branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-03-21 Friday 09:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.26),
+	  Pointset_Powerset.defs.hh (1.35): Corrected a couple of typos in
+	  the documentation resulting in Doxygen warnings.
+
+2008-03-21 Friday 09:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.44), Octagonal_Shape.inlines.hh
+	  (1.32), Octagonal_Shape.templates.hh (1.73): Removed eager
+	  methods for the addition of constraints/congruences.
+
+2008-03-21 Friday 09:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: limitedbhmz05extrapolation1.cc (1.8),
+	  limitedcc76extrapolation1.cc (1.8), intersection1.cc (1.6): No
+	  longer using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 09:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: congruences1.cc (1.4),
+	  containsintegerpoint1.cc (1.6), octhull1.cc (1.6): No longer
+	  using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 09:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/congruences1.cc (simplex.1): file
+	  congruences1.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-03-21 Friday 08:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: directproduct3.cc (1.18), directproduct5.cc (1.10):
+	  No longer using eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 08:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct1.cc (1.10): No longer using
+	  eager methods for adding constraints/congruences.
+
+2008-03-21 Friday 08:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.25),
+	  Partially_Reduced_Product.inlines.hh (1.23),
+	  Partially_Reduced_Product.templates.hh (1.9): Removed eager
+	  versions of methods adding constraints/congruences.
+
+2008-03-21 Friday 08:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.defs.hh (1.15),
+	  Pointset_Ask_Tell.templates.hh (1.13): Removed eager methods of
+	  methods adding constraints/congruences.
+
+2008-03-21 Friday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (1.8): Corrected typo in the noisy
+	  output.
+
+2008-03-21 Friday 08:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.13), congruences1.cc (1.4),
+	  intersection1.cc (1.10): No longer using eager methods for adding
+	  constraints/congruences.
+
+2008-03-21 Friday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.50), Box.inlines.hh (1.30): Removed eager
+	  versions of methods adding constraints and congruences.
+
+2008-03-20 Thursday 17:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/C_Polyhedron.defs.hh (1.54): Comment corrected.
+
+2008-03-20 Thursday 16:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_public.cc (1.111), Polyhedron_widenings.cc
+	  (1.66): Avoid using deprecated methods.
+
+2008-03-20 Thursday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.99): Avoid using deprecated methods;
+	  while at it, slightly simplified a few lines.
+
+2008-03-20 Thursday 15:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.templates.hh (1.29), Pointset_Powerset.cc
+	  (1.17), Grid_public.cc (1.68): Avoid using deprecated method.
+
+2008-03-20 Thursday 15:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.31),
+	  C/ppl_interface_generator_c_h_code.m4 (1.21),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.48), Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.28), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.30),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.25),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.19): Added the
+	  code for the refine_with methods to the C, Java and Ocaml
+	  interfaces.  All the refine_with methods in all the interfaces
+	  enabled.
+
+2008-03-20 Thursday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.332), BD_Shape.defs.hh (1.118),
+	  Pointset_Powerset.defs.hh (1.34), Grid.defs.hh (1.66):
+	  Documentation of the eager versions of some methods now states
+	  that their usage is deprecated (linking to the manual for an
+	  explanation).
+
+2008-03-20 Thursday 14:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.208): In the section of the manual
+	  discussing lazy and eager version of some of the operators, added
+	  a paragraph stressing that the use of the eager versions is
+	  deprecated starting from PPL 0.10 and will be removed starting
+	  from PPL 0.11.
+
+2008-03-20 Thursday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.71),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.18),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.65): Added
+	  code in the Prolog interface for the refine_with methods.
+
+2008-03-20 Thursday 10:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.24),
+	  src/Partially_Reduced_Product.inlines.hh (1.22),
+	  tests/Grid/partiallyreducedproduct4.cc (1.3): Added refine_with
+	  methods to the product domains.
+
+2008-03-20 Thursday 09:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.33),
+	  src/Pointset_Powerset.templates.hh (1.28),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.3): Added
+	  refine_with_congruence() and	refine_with_congruences().  Tests
+	  added for all the refine_with methods for pointset powersets of
+	  polyhedra.
+
+2008-03-19 Wednesday 14:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/:
+	  ppl_interface_generator_common_procedure_generators.m4 (1.17),
+	  Prolog/tests/pl_grid_check.pl (1.10): Disabled the and_minimize
+	  methods for all domains except for the Polyhedron domains.
+	  Removed all tests for the and_minimize methods from
+	  Prolog/tests/pl_grid_check.pl.
+
+2008-03-19 Wednesday 14:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.331), src/Polyhedron_public.cc (1.110),
+	  tests/Polyhedron/Makefile.am (1.120),
+	  tests/Polyhedron/exceptions1.cc (1.16),
+	  tests/Polyhedron/refinewithcongruence1.cc (1.1),
+	  tests/Polyhedron/refinewithcongruences1.cc (1.1),
+	  tests/Polyhedron/refinewithconstraint1.cc (1.1),
+	  tests/Polyhedron/refinewithconstraints1.cc (1.1): Added
+	  refine_with methods for constraint(s) and congruence(s).
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithcongruence1.cc (simplex.1): file
+	  refinewithcongruence1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithcongruences1.cc (simplex.1): file
+	  refinewithcongruences1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithconstraint1.cc (simplex.1): file
+	  refinewithconstraint1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/refinewithconstraints1.cc (simplex.1): file
+	  refinewithconstraints1.cc was added on branch simplex on
+	  2008-06-06 14:22:13 +0000
+
+2008-03-19 Wednesday 08:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.241): Revised the geometric descriptors draft
+	  documentation for the add and refine_with methods for constraints
+	  and congruences.
+
+2008-03-19 Wednesday 08:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/refinewithconstraints1.cc (1.3): tests 08 and 09 fail
+	  with checked-int8
+
+2008-03-19 Wednesday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraints1.cc (simplex.1): file
+	  refinewithconstraints1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-19 Wednesday 07:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.67): Restored implementation of
+	  add_constraints().
+
+2008-03-18 Tuesday 22:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.65), src/Grid.inlines.hh (1.23),
+	  src/Grid_public.cc (1.66), tests/Grid/Makefile.am (1.61),
+	  tests/Grid/congruences1.cc (1.14),
+	  tests/Grid/refinewithcongruences1.cc (1.1),
+	  tests/Grid/refinewithconstraints1.cc (1.1): Added methods
+	  refine_with_congruence(),  refine_with_congruences(),
+	  refine_with_constraint(),  refine_with_constraints().
+
+	  Removed some old redundant (commented out) tests in
+	  tests/Grid/congruences1.cc
+
+2008-03-18 Tuesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/refinewithcongruences1.cc (simplex.1): file
+	  refinewithcongruences1.cc was added on branch simplex on
+	  2008-06-06 14:22:11 +0000
+
+2008-03-18 Tuesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/refinewithconstraints1.cc (simplex.1): file
+	  refinewithconstraints1.cc was added on branch simplex on
+	  2008-06-06 14:22:11 +0000
+
+2008-03-18 Tuesday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.28), Watchdog/ChangeLog (1.17): Updated.
+
+2008-03-18 Tuesday 20:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.inlines.hh (1.29), tests/Box/Makefile.am (1.57): Restored
+	  code revoved in error.  Restored congruences1 test.
+
+2008-03-18 Tuesday 20:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.32): Two FIXMEs resolved.
+
+2008-03-18 Tuesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.31),
+	  Pointset_Powerset.templates.hh (1.27): Methods
+	  Pointset_Powerset<PS>::refine(const Constraint&) and
+	  Pointset_Powerset<PS>::refine(const Constraint_System&) renamed
+	  Pointset_Powerset<PS>::refine_with_constraint(const Constraint&)
+	  and Pointset_Powerset<PS>::refine_with_constraints(const
+	  Constraint_System&), respectively.
+
+2008-03-18 Tuesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.56): Disabled test program congruences1.
+
+2008-03-18 Tuesday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (1.7): Invoke refine_with_constraint()
+	  instead of the no longer existing refine().
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.49), src/Box.inlines.hh (1.28),
+	  tests/Box/Makefile.am (1.55), tests/Box/refine1.cc (1.13),
+	  tests/Box/refine2.cc (1.13), tests/Box/refine3.cc (1.6),
+	  tests/Box/refinewithconstraint1.cc (1.1),
+	  tests/Box/refinewithconstraint2.cc (1.1),
+	  tests/Box/refinewithconstraints1.cc (1.2),
+	  tests/Box/refinewithconstraints2.cc (1.1): Duplicate code
+	  avoided.  Fixed some comments.  Test programs reorganized.
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraint1.cc (simplex.1): file
+	  refinewithconstraint1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraint2.cc (simplex.1): file
+	  refinewithconstraint2.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithconstraints2.cc (simplex.1): file
+	  refinewithconstraints2.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.48), src/Box.inlines.hh (1.27),
+	  src/Box.templates.hh (1.107), tests/Box/Makefile.am (1.54),
+	  tests/Box/refinewithcongruences1.cc (1.1),
+	  tests/Box/refinewithconstraints1.cc (1.1): Added
+	  refine_with_constraint(),  refine_with_constraints(),
+	  refine_with_congruence(),  refine_with_congruences() methods to
+	  the Box domain.
+
+2008-03-18 Tuesday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refinewithcongruences1.cc (simplex.1): file
+	  refinewithcongruences1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-18 Tuesday 14:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.240): All the method names in the temporary documentation
+	  now preceded by the \p for use in doxygen code.  Also, all code
+	  here has been enclosed in the \code \endcode environment.
+
+2008-03-18 Tuesday 14:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.117), src/BD_Shape.inlines.hh (1.159),
+	  src/Octagonal_Shape.defs.hh (1.43),
+	  src/Octagonal_Shape.inlines.hh (1.31),
+	  src/Octagonal_Shape.templates.hh (1.72),
+	  tests/BD_Shape/congruences1.cc (1.4),
+	  tests/BD_Shape/constraints1.cc (1.24),
+	  tests/Octagonal_Shape/congruences1.cc (1.3),
+	  tests/Octagonal_Shape/constraints1.cc (1.7): Removed the
+	  and_minimize versions of the new refine_with methods.
+
+2008-03-18 Tuesday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/congruences1.cc (simplex.1): file congruences1.cc
+	  was added on branch simplex on 2008-06-06 14:22:09 +0000
+
+2008-03-18 Tuesday 13:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.239): Completed what I can of the documentation for the
+	  geometric descriptors.
+
+2008-03-18 Tuesday 12:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.238): Added to the draft documentation on geometric
+	  descrptors.
+
+2008-03-18 Tuesday 10:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.116), src/BD_Shape.inlines.hh (1.158),
+	  src/BD_Shape.templates.hh (1.98), src/Octagonal_Shape.defs.hh
+	  (1.42), src/Octagonal_Shape.inlines.hh (1.30),
+	  src/Octagonal_Shape.templates.hh (1.71),
+	  tests/BD_Shape/congruences1.cc (1.3),
+	  tests/BD_Shape/constraints1.cc (1.23),
+	  tests/Octagonal_Shape/congruences1.cc (1.2),
+	  tests/Octagonal_Shape/constraints1.cc (1.6): Added
+	  refine_with_[constraint GD] both with and without "and_minimize".
+	  A few tests added.  Small corrections to documentation for the
+	  add_[constraint GD] methods.
+
+2008-03-14 Friday 09:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.16): test07 definitely
+	  fails when using 8-bit coefficients and checking assertions.
+
+2008-03-14 Friday 09:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.76): Added macros
+	  DO_TEST_F<size><assertions>_MAY_OVERFLOW_IF_INEXACT for all
+	  possible bounded coefficient types.
+
+2008-03-14 Friday 08:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.75), BD_Shape/max_min2.cc (1.12): Modified
+	  the check_result helper function so as to take as input two
+	  _checked_ mpq_class numbers, rather than bare mpq_class. Adapted
+	  test10 of max_min2.cc accordingly.
+
+2008-03-11 Tuesday 08:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.237): Added a note on upward and downward approximations.
+
+2008-03-10 Monday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (1.11): Corrected silly initialization
+	  error of an mpq_class object from bounded numerator and
+	  denumrators.
+
+2008-03-10 Monday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (1.10): test10 modified so as to check
+	  its result using helper functions computing distances, thereby
+	  allowing for approximations.
+
+2008-03-10 Monday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.74): Added overloading for helper function
+	  check_result that allows for computing the rectilinear distance
+	  between two mpq_class numbers.
+
+2008-03-10 Monday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.236): Started drafting a text that, properly elaborated,
+	  should constitute the "philosophy" of our user interfaces.
+
+2008-03-10 Monday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.73): Added overloading for function
+	  check_result to compute and check distances between a pair of
+	  (closure) points.
+
+2008-03-10 Monday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.126), Generator.inlines.hh (1.64):
+	  Added functions to compute the (rectilinear, euclidean or
+	  l-infinify) distance between a pair of (closure) points.
+
+2008-03-10 Monday 07:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Octagonal_Shape.inlines.hh (1.29): Corrected a couple of
+	  comments.
+
+	  When building from a congruence system, for a non-zero dimension
+	  universe octagon, first set the stongly closed flag (as is
+	  already done for building from other systems).
+
+2008-03-09 Sunday 23:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.106): Braces added to avoid ambiguous
+	  `else'.
+
+2008-03-08 Saturday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.32), Watchdog/ltmain.sh (1.21),
+	  Watchdog/m4/libtool.m4 (1.3), Watchdog/m4/ltversion.m4 (1.2),
+	  m4/libtool.m4 (1.3), m4/ltversion.m4 (1.2): Updated from Libtool
+	  2.3a.
+
+2008-03-07 Friday 22:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/max_min2.cc (1.7): The bug shown by test07
+	  is now corrected.
+
+2008-03-07 Friday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (1.9): The bug shown by test10 is now
+	  corrected.
+
+2008-03-07 Friday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.97), MIP_Problem.cc (1.66):
+	  Corrected a bug in the evaluation of objective function whereby a
+	  wrong result could have been obtained if the objective function
+	  had a non-zero inhomogeneous term and the evaluating point was
+	  non-integral.
+
+2008-03-07 Friday 16:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/max_min2.cc (1.8), Octagonal_Shape/max_min2.cc
+	  (1.6): test07 in Octagonal_Shape/max_min2.cc and test10 in
+	  BD_Shape/max_min2.cc show a bug in having an inhomogeneous term
+	  in the linear expression for maximize() and minimize() when the
+	  denominator is different from 1.
+
+2008-03-07 Friday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh (1.96),
+	  src/Octagonal_Shape.templates.hh (1.70),
+	  tests/BD_Shape/relations3.cc (1.31), tests/BD_Shape/relations4.cc
+	  (1.13), tests/Octagonal_Shape/relatwithcons3.cc (1.3): Improved
+	  the code again for the relations_with() for constraints for both
+	  the Octagons and BD_Shapes. Tests also improved.
+
+	  The BD_Shape relation_with() for congruences now uses the
+	  relation_with() for constraints instead of the temporary
+	  implementation that converted to polyhedra to compute the
+	  relations.
+
+2008-03-07 Friday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons3.cc (simplex.1): file
+	  relatwithcons3.cc was added on branch simplex on 2008-06-06
+	  14:22:12 +0000
+
+2008-03-07 Friday 09:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Octagonal_Shape/relatwithcons3.cc (1.2),
+	  src/Octagonal_Shape.templates.hh (1.69): Revised relation_with()
+	  for a congruence so as to use the relation_with() for a
+	  constraint instead of the temporary implementation which was
+	  coverting the octagon to a polyhedron and using the method there.
+
+	  Fixed a bug in relation_with() for a (non-octagonal) constraint
+	  due to the inclusion of the inhomogeneous term in the linear
+	  expression when calling maximize() and minimize().
+
+2008-03-07 Friday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations3.cc (simplex.1): file relations3.cc was added
+	  on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-03-07 Friday 07:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.105), tests/Box/relations3.cc (1.5):
+	  Redone the previous correction for the interval_relation() when
+	  the relation symbol is an equality as it did not correct the case
+	  when the interval was fully bounded.	A further test added for
+	  bounded intervals and equality.
+
+2008-03-06 Thursday 22:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.104), tests/Box/relations3.cc (1.4):
+	  Fixed a bug in the interval_relation() when the relation is an
+	  equality. Test added that showed this bug.
+
+2008-03-06 Thursday 16:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Octagonal_Shape.defs.hh (1.41),
+	  src/Octagonal_Shape.templates.hh (1.68),
+	  tests/BD_Shape/relations4.cc (1.12),
+	  tests/Octagonal_Shape/Makefile.am (1.25),
+	  tests/Octagonal_Shape/relatwithcons3.cc (1.1): In the Octagon
+	  domain, the relation_with() for a constraint now finds the
+	  relation with a non-octagonal difference constraint.
+
+	  Comment in Octagonal.defs.hh for relation_with() wrt this
+	  updated.
+
+	  Tests add to test this change.
+
+	  All tabs replaced by spaces in Octagonal.defs.hh and
+	  Octagonal_Shape.templates.hh
+
+	  The (if noisy) generated output in tests/BD_Shape/relations4.cc
+	  corrected.
+
+2008-03-06 Thursday 15:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: BD_Shape.defs.hh (1.115), BD_Shape.templates.hh (1.95):
+	  Removed/replaced all tabs.
+
+2008-03-06 Thursday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.templates.hh (1.94): Two comment lines added.
+
+2008-03-06 Thursday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.114), src/BD_Shape.templates.hh (1.93),
+	  tests/BD_Shape/Makefile.am (1.72), tests/BD_Shape/relations2.cc
+	  (1.25), tests/BD_Shape/relations3.cc (1.30),
+	  tests/BD_Shape/relations4.cc (1.11): relation_with() for a
+	  constraint can now handle any constraint even if it is not a
+	  bounded difference.
+
+	  Comment in BD_Shape.defs.hh for this method updated.
+
+	  Tests added to check this (and existing tests to check exceptions
+	  revised).
+
+2008-03-06 Thursday 08:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.16): Enabled intersection_assign_and_minimize for all the Box
+	  domains, powersets with a Box domain as a disjunct and products
+	  with a Box domain as a component.
+
+2008-03-06 Thursday 08:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.15): In all the interfaces, the bounded_affine_image,
+	  generalized_affine_image, generalized_affine_image_lhs_rhs
+	  procedures are enabled now for: all the Box domains, powersets
+	  with a Box domain as its disjunct and products with a Box domain
+	  as a component.
+
+2008-03-05 Wednesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.304), Watchdog/configure.ac (1.44): Use the new
+	  style macro to initialize Libtool.
+
+2008-03-05 Wednesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.31), Watchdog/ltmain.sh (1.20),
+	  Watchdog/m4/libtool.m4 (1.2), m4/libtool.m4 (1.2): Updated to the
+	  CVS HEAD version of Libtool: this seems to solve the problems we
+	  experienced since the switch to Libtool 2.2.
+
+2008-03-03 Monday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.47), src/Box.inlines.hh (1.26),
+	  tests/Box/intersection1.cc (1.9): Added method
+	  intersection_assign_and_minimize() needed for uniformity with
+	  other domains in the PPL.
+
+2008-03-03 Monday 08:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.103), tests/Box/boundedaffineimage1.cc
+	  (1.16), tests/Box/generalizedaffineimage1.cc (1.15),
+	  tests/Box/generalizedaffineimage2.cc (1.5): Corrected two bugs,
+	  one in bounded_affine_image() when setting an interval to be
+	  unbounded caused an exception to be thrown and the other in
+	  generalized_affine_image/4 where the bounds were set when they
+	  should have been left unbounded.
+
+	  The first bug was illustrated by the extra test17 in
+	  boundedaffineimage1.cc
+
+	  The second bug by a modified form of test04 in
+	  generalizedaffineimage2.cc (previously the test did not test
+	  anything that is not tested elsewhere).
+
+	  Some tests in generalizedaffineimage1.cc used constraints that
+	  were not non-relational. Corrected.
+
+2008-03-03 Monday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffineimage2.cc (simplex.1): file
+	  generalizedaffineimage2.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on branch
+	  simplex on 2008-06-06 14:22:04 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ltsugar.m4 (simplex.1): file ltsugar.m4 was added on
+	  branch simplex on 2008-06-06 14:21:55 +0000
+
+2008-03-02 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.41), ltmain.sh (1.30), Watchdog/config.guess
+	  (1.25), Watchdog/ltmain.sh (1.19), Watchdog/m4/libtool.m4 (1.1),
+	  Watchdog/m4/ltoptions.m4 (1.1), Watchdog/m4/ltsugar.m4 (1.1),
+	  Watchdog/m4/ltversion.m4 (1.1), Watchdog/m4/lt~obsolete.m4 (1.1),
+	  m4/libtool.m4 (1.1), m4/ltoptions.m4 (1.1), m4/ltsugar.m4 (1.1),
+	  m4/ltversion.m4 (1.1), m4/lt~obsolete.m4 (1.1): Switched to
+	  Libtool 2.2.
+
+2008-03-02 Sunday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.72), Box/generalizedaffinepreimage1.cc
+	  (1.15): A couple of the test (11 and 15):  - definitely overflow
+	  when using 8 bit integers;  - may overflow when using bigger
+	  bounded integers and inexact intervals    boundary types.  Added
+	  new macro DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT to deal with these
+	  cases ... this is a tentative approach, have to decide if it is
+	  the way to go.
+
+2008-03-02 Sunday 08:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.71): Added a couple of using declaration for
+	  the IO_Operators namespace.
+
+2008-03-01 Saturday 23:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: boundedaffineimage1.cc (1.15),
+	  boundedaffinepreimage1.cc (1.8), generalizedaffinepreimage1.cc
+	  (1.14): A few tests may overflow if bounded integers coefficients
+	  *and* inexact interval boundary types are used together.
+
+2008-03-01 Saturday 23:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-06-06 14:22:10 +0000
+
+2008-03-01 Saturday 21:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.13): One of the
+	  previous changes reverted: test 7 needs an NNC polyhedron when
+	  checking for the known result.
+
+2008-03-01 Saturday 19:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.12): Test 7 overflows
+	  when using 8 bit integers with assertions turned on; tests 11 and
+	  15 overflow with 8 bit integers independently from assertions.
+
+2008-03-01 Saturday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.14): Tests 9 and 10 always
+	  succeed.
+
+2008-03-01 Saturday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.102): Fixed several issues in method
+	  bounded_affine_preimage that were preventing compilation when
+	  using bounded coefficient types; also corrected several
+	  efficiency bugs.
+
+2008-03-01 Saturday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.11): Fixed a bunch of
+	  known results by computing distances or requiring comparison with
+	  an NNC polyhedron if the exact boundaries are open.
+
+2008-03-01 Saturday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.17): Modified implementation of
+	  templatic constructor taking a Box: open bounds are now
+	  approximated using topologically closed halfspaces if the
+	  polyhedron being built is necessarily closed.
+
+2008-03-01 Saturday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.7): In test09() a
+	  C_Polyhedron is enough to check the result obtained.
+
+2008-03-01 Saturday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.70): Improved check_result() functions.
+
+2008-03-01 Saturday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (1.10): Indentation
+	  fixed.
+
+2008-03-01 Saturday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.6): Temporarily patched
+	  test09();  FIXME added.
+
+2008-03-01 Saturday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.5): Indentation fixed.
+	  Please do insert the lines
+
+	  ;; Do not use tabs for indentation.  (setq-default
+	  indent-tabs-mode nil)
+
+	  into your .emacs file.
+
+2008-03-01 Saturday 08:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.4): Revised check_result
+	  expected results for test12.
+
+2008-02-29 Friday 23:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.3): Corrected title line
+	  of file.
+
+2008-02-29 Friday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: addspacedims1.cc (1.5),
+	  affinepreimage1.cc (1.7), affinepreimage2.cc (1.5),
+	  boundedaffineimage1.cc (1.12), boundedaffinepreimage1.cc (1.6),
+	  cc76extrapolation1.cc (1.7), expandspacedim1.cc (1.7),
+	  frompolyhedron1.cc (1.6), generalizedaffineimage1.cc (1.6),
+	  generalizedaffineimage2.cc (1.6), generalizedaffineimage3.cc
+	  (1.11), generalizedaffineimage4.cc (1.6),
+	  generalizedaffineimage5.cc (1.6), generalizedaffinepreimage1.cc
+	  (1.7), generalizedaffinepreimage2.cc (1.11),
+	  generalizedaffinepreimage3.cc (1.7),
+	  generalizedaffinepreimage4.cc (1.6),
+	  limitedbhmz05extrapolation1.cc (1.7),
+	  limitedcc76extrapolation1.cc (1.7), membytes1.cc (1.6),
+	  minconstraints1.cc (1.6), relatwithgen1.cc (1.10): Untabified.
+
+2008-02-29 Friday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/congruences1.cc (1.2): This was ripped from the
+	  Octagonal_Shape directory without even renaming variables or
+	  adapting comments: fixed.
+
+2008-02-29 Friday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.69), BD_Shape/addconstraints1.cc (1.22),
+	  BD_Shape/addspacedims1.cc (1.19), BD_Shape/affineimage1.cc
+	  (1.23), BD_Shape/affineimage2.cc (1.16),
+	  BD_Shape/affinepreimage1.cc (1.24), BD_Shape/bdsdifference1.cc
+	  (1.18), BD_Shape/bdshull1.cc (1.19), BD_Shape/bhmz05widening1.cc
+	  (1.18), BD_Shape/boundedaffineimage1.cc (1.7),
+	  BD_Shape/boundedaffinepreimage1.cc (1.7),
+	  BD_Shape/cc76extrapolation1.cc (1.23), BD_Shape/cc76narrowing1.cc
+	  (1.21), BD_Shape/concatenate1.cc (1.17), BD_Shape/constraints1.cc
+	  (1.22), BD_Shape/expandspacedim1.cc (1.7),
+	  BD_Shape/foldspacedims1.cc (1.9), BD_Shape/fromgensys1.cc (1.18),
+	  BD_Shape/generalizedaffineimage1.cc (1.21),
+	  BD_Shape/generalizedaffineimage2.cc (1.25),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.19),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.20),
+	  BD_Shape/generalizedaffinepreimage3.cc (1.10),
+	  BD_Shape/h79widening1.cc (1.16), BD_Shape/intersection1.cc
+	  (1.21), BD_Shape/limitedbhmz05extrapolation1.cc (1.19),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.20),
+	  BD_Shape/limitedh79extrapolation1.cc (1.17),
+	  BD_Shape/mapspacedims1.cc (1.19), BD_Shape/minconstraints1.cc
+	  (1.15), BD_Shape/removespacedims1.cc (1.24),
+	  BD_Shape/timeelapse1.cc (1.25): Always use the check_result()
+	  functions to check computed results against the known ones.
+
+2008-02-29 Friday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.21), addspacedims1.cc
+	  (1.18), affinedimension1.cc (1.14), affineimage1.cc (1.22),
+	  affineimage2.cc (1.15), ascii_dump_load1.cc (1.18), bounded1.cc
+	  (1.5), boundedaffinepreimage1.cc (1.6), boundingbox1.cc (1.3),
+	  cc76extrapolation1.cc (1.22), closure1.cc (1.23),
+	  containsintegerpoint1.cc (1.5), discrete1.cc (1.5),
+	  fromgensys1.cc (1.17), fromgrid1.cc (1.4), fromoctagonalshape1.cc
+	  (1.3), fromspacedim1.cc (1.4), generalizedaffineimage1.cc (1.20),
+	  generalizedaffineimage2.cc (1.24), generalizedaffinepreimage1.cc
+	  (1.18), generalizedaffinepreimage2.cc (1.19),
+	  generalizedaffinepreimage3.cc (1.9),
+	  limitedbhmz05extrapolation1.cc (1.18),
+	  limitedcc76extrapolation1.cc (1.19), mapspacedims1.cc (1.18),
+	  max_min1.cc (1.5), max_min2.cc (1.7), membytes1.cc (1.6),
+	  minconstraints1.cc (1.14), relations1.cc (1.20), relations2.cc
+	  (1.24), relations3.cc (1.29), removespacedims1.cc (1.23),
+	  timeelapse1.cc (1.24), universe1.cc (1.17), writebdshape1.cc
+	  (1.13): More variables renamed.
+
+2008-02-29 Friday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: h79widening1.cc (1.15), intersection1.cc (1.20),
+	  limitedbhmz05extrapolation1.cc (1.17),
+	  limitedcc76extrapolation1.cc (1.18), limitedh79extrapolation1.cc
+	  (1.16), mapspacedims1.cc (1.17), timeelapse1.cc (1.23),
+	  writebdshape1.cc (1.12): Variable renaming completed.
+
+2008-02-29 Friday 16:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/boundedaffinepreimage1.cc (1.2): In test03, result
+	  checked using check_result.
+
+2008-02-29 Friday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.101), tests/Box/Makefile.am (1.53),
+	  tests/Box/boundedaffinepreimage1.cc (1.1),
+	  tests/Box/generalizedaffinepreimage1.cc (1.9): Added code for
+	  generalized_affine_preimage (both versions) and
+	  bounded_affine_preimage.  Minor improvement to
+	  bounded_affine_image where we add the constraint that the lower
+	  bound expression must be less than the upper bound expression (or
+	  vice versa if the denominator is negative).
+
+	  Some tests added or revised.
+
+2008-02-29 Friday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.13): test09() and test10()
+	  provoke an overflow only with assertions enabled.
+
+2008-02-29 Friday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: addspacedims1.cc (1.8), boundedaffineimage1.cc
+	  (1.12), closure1.cc (1.6), expandspacedim1.cc (1.9),
+	  frompolyhedron1.cc (1.13), generalizedaffineimage1.cc (1.14),
+	  generalizedaffineimage2.cc (1.4), generalizedaffinepreimage1.cc
+	  (1.8), interval1.cc (1.6), interval2.cc (1.6), minconstraints1.cc
+	  (1.7), refine2.cc (1.12), refine3.cc (1.5), removespacedims1.cc
+	  (1.10), timeelapse1.cc (1.9): Untabified.
+
+2008-02-29 Friday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.11): Adapted test02() to the new dump
+	  format.
+
+2008-02-29 Friday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.100): Spurious separator avoided in
+	  ascii_dump().
+
+2008-02-29 Friday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.20), addspacedims1.cc
+	  (1.17), affineimage1.cc (1.21), affinepreimage1.cc (1.23),
+	  ascii_dump_load1.cc (1.17), bdsdifference1.cc (1.17), bdshull1.cc
+	  (1.18), bhmz05widening1.cc (1.17), boundedaffineimage1.cc (1.6),
+	  boundedaffinepreimage1.cc (1.5), bounds1.cc (1.5),
+	  cc76extrapolation1.cc (1.21), cc76narrowing1.cc (1.20),
+	  closure1.cc (1.22), concatenate1.cc (1.16), constraints1.cc
+	  (1.21), contains1.cc (1.17), disjoint1.cc (1.8), empty1.cc
+	  (1.13), equality1.cc (1.18), expandspacedim1.cc (1.6),
+	  foldspacedims1.cc (1.8), frompolyhedron1.cc (1.7),
+	  generalizedaffineimage1.cc (1.19), generalizedaffineimage2.cc
+	  (1.23), generalizedaffinepreimage1.cc (1.17),
+	  generalizedaffinepreimage2.cc (1.18),
+	  generalizedaffinepreimage3.cc (1.8), geomcovers1.cc (1.12),
+	  limitedbhmz05extrapolation1.cc (1.16),
+	  limitedcc76extrapolation1.cc (1.17), membytes1.cc (1.5),
+	  minconstraints1.cc (1.13), removespacedims1.cc (1.22),
+	  timeelapse1.cc (1.22): A first go at naming variables properly.
+
+2008-02-29 Friday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: generalizedaffineimage1.cc (1.13),
+	  generalizedaffineimage2.cc (1.3): Always the check_result()
+	  function to check results.
+
+2008-02-29 Friday 07:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.11): test09() and test10()
+	  cause overflows with 32-bit or narrower coefficients.
+
+2008-02-28 Thursday 23:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.12), addspacedims1.cc (1.7),
+	  affineimage1.cc (1.10), affinepreimage1.cc (1.7),
+	  boundedaffineimage1.cc (1.10), boxdifference1.cc (1.8),
+	  boxhull1.cc (1.7), cc76narrowing1.cc (1.7), cc76widening.cc
+	  (1.8), concatenate1.cc (1.8), congruences1.cc (1.3),
+	  constraints1.cc (1.11), frombdshape1.cc (1.4), fromgensys1.cc
+	  (1.6), generalizedaffineimage1.cc (1.12),
+	  generalizedaffineimage2.cc (1.2), generalizedaffinepreimage1.cc
+	  (1.7), intersection1.cc (1.8), mapspacedims1.cc (1.7), refine1.cc
+	  (1.12), refine3.cc (1.4), removespacedims1.cc (1.9),
+	  timeelapse1.cc (1.8): Always use check_result() to check for
+	  correctness of the results.
+
+2008-02-28 Thursday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: bdsdifference1.cc (1.7), boxhull.cc (1.6): Unwanted
+	  file removed.
+
+2008-02-28 Thursday 22:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/timeelapse1.cc (1.7): Comments fixed.
+
+2008-02-28 Thursday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: addconstraints1.cc (1.11), addspacedims1.cc (1.6),
+	  affineimage1.cc (1.9), affinepreimage1.cc (1.6),
+	  expandspacedim1.cc (1.8), foldspacedims1.cc (1.9), geomcovers1.cc
+	  (1.6), mapspacedims1.cc (1.6), removespacedims1.cc (1.8): Do not
+	  name something `box1' if there is no `box2' in sight.
+
+2008-02-28 Thursday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.99): All other things being equal, always
+	  prefer preincrement and predecrement to postincrement and
+	  postdecrement.
+
+2008-02-28 Thursday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (1.23): Spurious semicolon
+	  removed.
+
+2008-02-28 Thursday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.46), Box.templates.hh (1.98): Meaningless
+	  type qualifiers removed.
+
+2008-02-28 Thursday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.45): Indentation fixed.  Spurious semicolon
+	  and useless namespace enclosure removed.
+
+2008-02-28 Thursday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.44), Box.inlines.hh (1.25), Box.templates.hh
+	  (1.97), Box_Status.idefs.hh (1.2), Box_Status.inlines.hh (1.2):
+	  The Box class now uses (badly) the new Status member instead of
+	  the old two booleans.
+
+2008-02-28 Thursday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.96): Initialize a local variable in
+	  generalized_affine_image so as to avoid an annoying warning.
+
+2008-02-28 Thursday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/generalizedaffineimage1.cc (1.11): Avoid long lines.
+
+2008-02-28 Thursday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boundedaffineimage1.cc (1.9): Corrected known result
+	  for test03: no approximation is needed in this case.	Computed
+	  distances between known and computed result for test10.
+
+2008-02-28 Thursday 17:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.95): Fixed an error in
+	  l_m_distance_assign.
+
+2008-02-28 Thursday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: boundedaffineimage1.cc (1.8),
+	  generalizedaffineimage1.cc (1.10): Expected results revised.
+	  Notive that test10() in boundedaffineimage1.cc shows there is a
+	  bug in check_result().
+
+2008-02-28 Thursday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.86), devref.doxyconf-latex.in
+	  (1.25): Mention input files math_utilities.*.
+
+2008-02-28 Thursday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: globals.cc (1.33), math_utilities.inlines.hh (1.2):
+	  Implementation of function is_canonical() is now inlines and in a
+	  proper place.
+
+2008-02-28 Thursday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/math_utilities.inlines.hh (simplex.1): file
+	  math_utilities.inlines.hh was added on branch simplex on
+	  2008-06-06 14:22:05 +0000
+
+2008-02-28 Thursday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.207): Reference CC79 added.
+
+2008-02-28 Thursday 10:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/: boundedaffineimage1.cc (1.7),
+	  generalizedaffineimage1.cc (1.9): Revised expected results to
+	  allow for inexact computations.
+
+2008-02-28 Thursday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.18): Minor typo corrected in docs.
+
+2008-02-28 Thursday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.67): Indentation fixed.
+
+2008-02-25 Monday 11:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.94), src/Polyhedron_public.cc (1.109),
+	  tests/Box/Makefile.am (1.52),
+	  tests/Box/generalizedaffineimage1.cc (1.8),
+	  tests/Box/generalizedaffineimage2.cc (1.1): Added implementation
+	  for generalized_affine_image/3 Tests added and existing tests
+	  revised.
+
+	  Indentation corrected in src/Polyhedron_public.cc.
+
+2008-02-22 Friday 23:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (1.108),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.14): Fixed bug
+	  indicated in previous commit.  Added two further tests to
+	  tests/Polyhedron/boundedaffineimage1.cc to cover more cases of
+	  positive and negative denominator.
+
+2008-02-22 Friday 13:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.93): Use temporaries more in the
+	  bounded_affine_image/4 code..
+
+2008-02-22 Friday 12:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.92), tests/Box/Makefile.am (1.51),
+	  tests/Box/boundedaffineimage1.cc (1.6),
+	  tests/Box/generalizedaffineimage1.cc (1.7): First draft of code
+	  for generalized_affine_image/4 and bounded_affine_image/4.
+
+	  Tests revised and also enabled in Makefile.am.
+
+2008-02-22 Friday 12:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (1.13): Added a test04
+	  that shows a bug in bounded_affine_image().
+
+2008-02-21 Thursday 13:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.6),
+	  devref-c-interface.doxyconf-latex.in (1.6),
+	  devref-c-interface.tex (1.4),
+	  devref-prolog-interface.doxyconf-html.in (1.5),
+	  devref-prolog-interface.doxyconf-latex.in (1.5),
+	  devref.doxyconf-html.in (1.85), devref.doxyconf-latex.in (1.24),
+	  devref.tex (1.25), fdl.dox (1.8), gpl.dox (1.9),
+	  user-c-interface.doxyconf-html.in (1.7),
+	  user-c-interface.doxyconf-latex.in (1.7), user-c-interface.tex
+	  (1.4), user-prolog-interface.doxyconf-html.in (1.6),
+	  user-prolog-interface.doxyconf-latex.in (1.6),
+	  user-prolog-interface.tex (1.4), user.doxyconf-html.in (1.42),
+	  user.doxyconf-latex.in (1.13), user.tex (1.26): Modified
+	  configuration files for the HTML versions of foreign language
+	  interface manuals so that they will always include a new copy of
+	  the GPL and GFDL licenses.  Creating a documentation page in
+	  Doxygen using command \page does not produces a referenceable
+	  anchor: hence, explicitly added commands \anchor to gpl.dox and
+	  fdl.dox; modified main *.tex pages so as to proper reference
+	  these anchors (thereby solving a long standing issue).  All
+	  Doxygen configuration files upgraded to version 1.5.5.
+
+2008-02-19 Tuesday 22:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.29), ppl_interface_generator_ocaml_ml_code.m4 (1.24),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.18): Added the
+	  Tuareg emacs mode at the start of the ml and mli files and the
+	  C++ mode at the start of the cc file.  These then used to help
+	  improved some formatting.
+
+2008-02-19 Tuesday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.40), Octagonal_Shape.inlines.hh
+	  (1.28), Octagonal_Shape.templates.hh (1.66), Og_Status.idefs.hh
+	  (1.10): Added methods to operate on the status.
+
+2008-02-19 Tuesday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.113): Comment improved.
+
+2008-02-19 Tuesday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.43), Box.templates.hh (1.91): Added a (still
+	  unused) status member.
+
+2008-02-19 Tuesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.112), BD_Shape.inlines.hh (1.157),
+	  BD_Shape.templates.hh (1.92): Added methods to operate on the
+	  status.
+
+2008-02-19 Tuesday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh (1.24): Comment improved.
+
+2008-02-19 Tuesday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box_Status.idefs.hh (1.1), Box_Status.inlines.hh (1.1),
+	  Makefile.am (1.179): Declaration and definitions of the class
+	  Box<Interval>::Status.
+
+2008-02-19 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.23), BDS_Status.inlines.hh (1.19),
+	  Grid_Status.idefs.hh (1.9), Og_Status.idefs.hh (1.9),
+	  Ph_Status.idefs.hh (1.23): Multiple inclusion guards fixed.
+
+2008-02-19 Tuesday 13:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.42), Partially_Reduced_Product.defs.hh
+	  (1.22): Fixed a bunch of Doxygen related errors and warnings.
+
+2008-02-17 Sunday 22:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron_public.cc (1.107): Small improvement to code for
+	  relation_with(Congruence).
+
+2008-02-17 Sunday 00:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.70): Enable
+	  relation_with() for a congruence for the weakly relational
+	  domains in all the interfaces.
+
+2008-02-16 Saturday 23:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.90), tests/Box/relations4.cc (1.3):
+	  Improved code changed for 0-dimensional box domains for
+	  relation_with() for a congruence.  Added a test to check this
+	  change.
+
+2008-02-16 Saturday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations4.cc (simplex.1): file relations4.cc was added
+	  on branch simplex on 2008-06-06 14:22:10 +0000
+
+2008-02-16 Saturday 23:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.69),
+	  src/Box.templates.hh (1.89), tests/Box/relations4.cc (1.2):
+	  Enabled the relation_with() for box domains in all the
+	  interfaces.
+
+	  The Prolog generated tests showed a bug in the code for the zero
+	  dimensional empty Box - now tested in relations 4.cc.
+
+	  The bug has been fixed.
+
+2008-02-16 Saturday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.inlines.hh (1.34), Interval_Info.defs.hh (1.7):
+	  Properly comment the closing brace of namespaces.  When used in
+	  templates, Parma_Polyhedra_Library::used() should be fully
+	  qualified.
+
+2008-02-16 Saturday 15:28  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.55): Some fixes to refine_universal.
+	  Added unrepresentability_error check.
+
+2008-02-16 Saturday 15:04  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.11): Propagate unrepresentability error
+	  insted of aborting.
+
+2008-02-16 Saturday 13:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.41), src/Box.templates.hh (1.88),
+	  tests/Box/Makefile.am (1.50), tests/Box/relations4.cc (1.1):
+	  Renamed private method interval_relation_no_check() as
+	  interval_relation() as there is now nothing that is unchecked.
+	  Added relation_with() for congruences for Boxes.
+
+2008-02-16 Saturday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (1.6): Test rewritten.
+
+2008-02-16 Saturday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.49): Do test also with membytes1.cc.
+
+2008-02-15 Friday 18:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.87): Corrected a bug in an assignment in
+	  relation_with().
+
+2008-02-15 Friday 15:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.86), tests/Box/relations3.cc (1.3): Bug
+	  identified in previous commit, fixed.
+
+2008-02-15 Friday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/relations3.cc (1.2): Extra test shows a bug in the
+	  relation_with() for congruences for a non-relational,
+	  1-dimensional box and constraint.
+
+2008-02-15 Friday 12:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_code.m4 (1.30),
+	  C/ppl_interface_generator_c_h_code.m4 (1.20),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.47), Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.64):
+	  Include emacs mode at the top of the code files.  A few minor
+	  bugs fixed and for Prolog and C files, indentation improved using
+	  emacs.
+
+2008-02-15 Friday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.36): Missing change for uniformity of m4 files, related to the
+	  previous two commits.
+
+2008-02-15 Friday 10:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.16):
+	  Add a copyright notice to the generated file.
+
+2008-02-15 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_ocaml_procedure_generators.m4 was added
+	  on branch simplex on 2008-06-06 14:22:00 +0000
+
+2008-02-15 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_prolog_procedure_generators.m4 was added
+	  on branch simplex on 2008-06-06 14:22:00 +0000
+
+2008-02-15 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_procedure_generators.m4 was added on
+	  branch simplex on 2008-06-06 14:21:58 +0000
+
+2008-02-15 Friday 10:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.32),
+	  ppl_interface_generator_common_dat.m4 (1.68),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.14),
+	  C/ppl_interface_generator_c_cc.m4 (1.16),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.29),
+	  C/ppl_interface_generator_c_h.m4 (1.16),
+	  C/ppl_interface_generator_c_h_code.m4 (1.19),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.5),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.6),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.13),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.46), OCaml/ppl_interface_generator_ocaml_cc.m4 (1.9),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.28),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.14),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.23),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.12),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.17),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.4), Prolog/ppl_interface_generator_prolog_icc.m4 (1.15),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.63),
+	  Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.2), Prolog/ppl_interface_generator_prolog_systems.m4 (1.14),
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.8),
+	  Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.9), Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.8),
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.12),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.15),
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.9),
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.11),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.10), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.9),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.74),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.35): Include a description of what the m4 code is for in each
+	  file.  Improved other details to make the code more uniform
+	  across all interfaces and all the different m4 file generators.
+
+	  Included the copyright notice in more of the generated files.
+
+2008-02-14 Thursday 22:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Box.defs.hh (1.40), Box.templates.hh (1.85): The
+	  Constraint::Type is passed as a parameter to
+	  interval_relation_no_check() instead of the Relation_Symbol.
+
+2008-02-14 Thursday 18:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Box.defs.hh (1.39), Box.templates.hh (1.84): In the code
+	  for relation_with() for constraints, avoid reconstructing the
+	  constraint only for the private method that implements the main
+	  cases to have to deconstruct the constraint.	Comments improved.
+
+2008-02-14 Thursday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.34): The out-of-range
+	  test in
+
+	    template <typename U, typename V> U jtype_to_unsigned(const V&)
+
+	  was indeed necessary.  Restored, but in a more efficient and
+	  warning-free way.
+
+2008-02-14 Thursday 13:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.83): Parameter renamed.  Avoid to declare
+	  things that are only used in assertions, unless everything is
+	  within #ifndef NDEBUG / #endif.
+
+2008-02-14 Thursday 12:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.38), src/Box.templates.hh (1.82),
+	  tests/Box/Makefile.am (1.48), tests/Box/relations2.cc (1.5),
+	  tests/Box/relations3.cc (1.1): Completed implementation for
+	  relation_with(Constraint) for a Box when the constraint is not an
+	  interval constraint.	Tests added for this case.
+
+	  The implementation is split between a private method that finds
+	  the relation between an interval and a one dimensional constraint
+	  and the public method for any box and any constraint.
+
+2008-02-14 Thursday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.45),
+	  ppl_java_common.hh (1.33): template <typename U, typename V> U
+	  jtype_to_unsigned(const V&) was unnecessarily complex and
+	  generated an annoying warning: fixed.
+
+2008-02-13 Wednesday 12:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.67): Spelling
+	  corrected.
+
+	  Previous commit change: removed redundant code and simplified
+	  code for the disjunct replacement.
+
+2008-02-13 Wednesday 12:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.66),
+	  src/Partially_Reduced_Product.inlines.hh (1.21),
+	  tests/Grid/partiallyreducedproduct4.cc (1.2): Fixed the bug
+	  indicated by the tests added in the previous commit.	Ensure that
+	  emptiness is always shared between the components for the
+	  Constraints_Product product_reduce().
+
+2008-02-13 Wednesday 09:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.60), partiallyreducedproduct4.cc
+	  (1.1): Two tests indicate bugs for Constraints_Product when a
+	  component is a box.
+
+2008-02-13 Wednesday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Integer.hh (1.7), Makefile.am (1.178), Row.inlines.hh
+	  (1.68), globals.defs.hh (1.55), globals.inlines.hh (1.23): Header
+	  file reorganization consequent to the introduction of
+	  math_utilities.*.
+
+2008-02-13 Wednesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.79), checked.inlines.hh
+	  (1.42): Redundant memory size inspection functions removed from
+	  the Checked namespace.
+
+2008-02-13 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: math_utilities.defs.hh (1.1), math_utilities.inlines.hh
+	  (1.1): New sources containing some math utility functions
+	  previously in globals.*.
+
+2008-02-13 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/math_utilities.defs.hh (simplex.1): file
+	  math_utilities.defs.hh was added on branch simplex on 2008-06-06
+	  14:22:05 +0000
+
+2008-02-12 Tuesday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.81): Several improvements in
+	  Box<Interval>::relation_with(const Constraint&).
+
+2008-02-12 Tuesday 21:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.80): Drafted the first part of the code
+	  required so that Box<Interval>::relation_with(const Constraint&
+	  c) does the right thing whatever is the form of `c'.
+
+2008-02-12 Tuesday 21:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh (1.33): Silenced a warning.
+
+2008-02-12 Tuesday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.177), Rational_Box.hh (1.8): Rational_Box is
+	  now Box<Rational_Interval>.
+
+2008-02-12 Tuesday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Interval.hh (1.1): Rational_Interval is an internal
+	  class implementing an interval with rational, possibly open
+	  boundaries.
+
+2008-02-12 Tuesday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Interval.hh (simplex.1): file Rational_Interval.hh
+	  was added on branch simplex on 2008-06-06 14:22:05 +0000
+
+2008-02-12 Tuesday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh (1.46), checked_mpz.inlines.hh
+	  (1.53), meta_programming.hh (1.11): More Is_Native
+	  specializations moved to meta_programming.hh.
+
+2008-02-12 Tuesday 18:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.73): Avoid some annoying warning messages.
+
+2008-02-12 Tuesday 18:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.65),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.13),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.72): Enable the memory_in_bytes methods for pointset_powersets
+	  of boxes and for products with boxes as components.
+
+	  The Prolog tests expected results have to allow for any
+	  Uint*_Box.
+
+2008-02-12 Tuesday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.303): Allow digits in the computation of
+	  `required_instantiations_java_sources'.
+
+2008-02-12 Tuesday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.29): Previous commit completed.
+
+2008-02-12 Tuesday 12:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.inlines.hh (1.24), Interval.inlines.hh (1.32),
+	  checked_mpq.inlines.hh (1.45), checked_mpz.inlines.hh (1.52),
+	  globals.defs.hh (1.54), globals.inlines.hh (1.22): Moved all the
+	  memory occupation inspection functions to globals.*.	In
+	  GMP_Integer.defs.hh we keep the declarations of memory_size_type
+	  total_memory_in_bytes(const GMP_Integer& x) and memory_size_type
+	  external_memory_in_bytes(const GMP_Integer& x), in order to obey
+	  the rule "every public PPL object has memory inspection
+	  functions."  However, not to confuse Doxygen with (apparently)
+	  duplicated documentation, the documentation of the declarations
+	  in GMP_Integer.defs.hh is controlled by #ifndef
+	  PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS.
+
+2008-02-12 Tuesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.53), globals.inlines.hh (1.21): Added
+	  template <typename T> memory_size_type
+	  external_memory_in_bytes(const T&) enabled for all native types
+	  T.
+
+2008-02-12 Tuesday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked.defs.hh (1.45), checked_float.inlines.hh (1.84),
+	  checked_int.inlines.hh (1.66), meta_programming.hh (1.10): Moved
+	  the definitions for Is_Native to meta_programming.hh.
+
+2008-02-12 Tuesday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.64),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.12),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.71), Prolog/tests/ppl_predicate_check_common.pl (1.10): A
+	  couple of bugs in the m4 code fixed Enabled the generation of a
+	  few more procedures for certain domains.
+
+	  A bug in the Prolog test files fixed.
+
+2008-02-11 Monday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.97): Let
+	  external_memory_in_bytes(const Checked_Number<T, Policy>&) return
+	  memory_size_type, not size_t.
+
+2008-02-11 Monday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.37), Box.inlines.hh (1.24), Box.templates.hh
+	  (1.79): Added Box<Interval>::total_memory_in_bytes() and
+	  Box<Interval>::memory_size_type external_memory_in_bytes().
+
+2008-02-11 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.54), Interval.inlines.hh (1.31): Added
+	  Interval<Boundary, Info>::external_memory_in_bytes() and
+	  Interval<Boundary, Info>::total_memory_in_bytes().
+
+2008-02-11 Monday 10:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.36), Box.templates.hh (1.78): Adde
+	  Box<Interval>::topological_closure_assign().
+
+2008-02-11 Monday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.53): Added void Interval<Boundary,
+	  Info>::topological_closure_assign().
+
+2008-02-11 Monday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.77): Optimized bool
+	  Box<Interval>::is_topologically_closed() const: if
+	  !Interval::info_type::store_open, then the box is certainly
+	  topologically closed.
+
+2008-02-10 Sunday 22:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.15),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.63),
+	  interfaces/C/Makefile.am (1.40),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.15),
+	  interfaces/Java/jni/Makefile.am (1.18),
+	  interfaces/Java/jni/ppl_java_common.hh (1.32),
+	  interfaces/OCaml/Makefile.am (1.38),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.13),
+	  interfaces/Prolog/ppl_prolog_common.icc (1.15): Enable all 13
+	  types of boxes in interfaced_boxes.hh for all the interfaces, as
+	  they are or as disjuncts to the powerset domain or as components
+	  of the product domain.
+
+	  instchk.hh allows for all of these boxes to be arguments to
+	  "-instantiations" in the configuration.
+
+	  Macro m4_get_class_index name changed to m4_get_class_counter so
+	  that the word "counter" is used consistently for the number
+	  associated to the class being generated.
+
+2008-02-08 Friday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/interfaced_boxes.hh (1.4): Added declarations for the
+	  native integer boxes.
+
+2008-02-08 Friday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/interfaced_boxes.hh (simplex.1): file
+	  interfaced_boxes.hh was added on branch simplex on 2008-06-06
+	  14:21:57 +0000
+
+2008-02-08 Friday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: interfaced_boxes.hh (1.3),
+	  Prolog/ppl_prolog_common.icc (1.14), Prolog/Ciao/Makefile.am
+	  (1.72), Prolog/GNU/Makefile.am (1.70), Prolog/SICStus/Makefile.am
+	  (1.86), Prolog/SWI/Makefile.am (1.82), Prolog/XSB/Makefile.am
+	  (1.62), Prolog/YAP/Makefile.am (1.59): Include
+	  interfaced_boxes.hh into all Prolog interfaces.
+
+2008-02-08 Friday 14:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/interfaced_boxes.hh (1.2): Fixed a missing ">".
+
+2008-02-08 Friday 13:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.62): Minor
+	  technical improvements to the m4 code.
+
+2008-02-08 Friday 13:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.31), interfaced_boxes.hh (1.1): New
+	  header file (to be completed) providing declarations for the Box
+	  instantiations offered by the foreign interfaces.
+
+2008-02-08 Friday 13:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.31),
+	  ppl_interface_generator_common_dat.m4 (1.61): In the last commit,
+	  the message said  "the change has   a "fixme" since this
+	  indicates that the way the replacements for all   patterns is
+	  handled needs improving and that this local change   should be
+	  made more general." This is now fixed and the main replacement
+	  macros now incorporate this improvement.
+
+	  Improved the specification of the replacements for the binary
+	  operators for the Pointset_Powerset domains.
+
+	  A few minor improvements to avoid unnecessary computations.
+
+2008-02-08 Friday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.30),
+	  ppl_interface_generator_common_dat.m4 (1.60): The code for
+	  intersecting sequences of comma separated strings improved so
+	  that the same basic code is used for intersecting both 2
+	  sequences and 3 sequences.
+
+	  The last changes introduced a bug for some products (such as Grid
+	  x BD_Shape<...> products. This is now fixed, but the change has a
+	  "fixme" since this indicates that the way the replacements for
+	  all patterns is handled needs improving and that this local
+	  change should be made more general.
+
+2008-02-07 Thursday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.52): Added the documentation for the
+	  difference_assign() methods.
+
+2008-02-07 Thursday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh (1.76), Interval.defs.hh (1.51),
+	  Interval.inlines.hh (1.30): Added declarations and empty
+	  implementations for Interval<To_Boundary,
+	  To_Info>::difference_assign(const From&) and
+	  Interval<To_Boundary, To_Info>::difference_assign(const From1&,
+	  const From2&).
+
+2008-02-07 Thursday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bit_Row.defs.hh (1.10), Bit_Row.inlines.hh (1.7): Added
+	  void set_difference(const Bit_Row&, const Bit_Row&, Bit_Row&).
+
+2008-02-07 Thursday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.29),
+	  ppl_interface_generator_common_dat.m4 (1.59),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.11):
+	  Enabled the Pointset_Powerset domain to have a Rational_Box as
+	  the disjunct and the Product domains to have a Rational_Box as
+	  one of its component domains in all the interfaces.
+
+	  To allow for a number of missing methods in the Box domain that
+	  cannot therefore be provided in any product domain that has the
+	  Box as a component, defined two generic macros in
+	  ppl_interface_generator_common.m4 that intersect sequences of
+	  comma-separated strings: one that intersects two sequences and
+	  one that intersects three sequences.
+
+	  Also now support a new notation in a procedure string - e.g.,
+	  "?box" means don't include this procedure for any product that
+	  has Box as one of its components.  This option may be removed in
+	  the future and its use avoided by using the sequence intersection
+	  macros described above.
+
+2008-02-07 Thursday 07:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.35): Fixed the documentation of
+	  set_interval(Variable, const Interval&).
+
+2008-02-05 Tuesday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.14): The instantiations configuration options now
+	  include Rational_Box.
+
+2008-02-05 Tuesday 15:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.58),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.10),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.5):
+	  The interfaces now support Rational_Box as a simple class for
+	  most of the procedures.  Powersets and Products with a Box as a
+	  base domain still to be checked.
+
+2008-02-05 Tuesday 14:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.75): Fixed method
+	  Box<I>::concatenate_assign(const Box&).
+
+2008-02-05 Tuesday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/concatenate1.cc (1.7): Added test06 which shows an
+	  assertion failure when executing concatenate_assign() in the Box
+	  domain.
+
+2008-02-04 Monday 12:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.28),
+	  ppl_interface_generator_common_dat.m4 (1.57): Fixed some bugs,
+	  simplified and improved some code and improved the documentation
+	  for new and changed the macros.
+
+	  Now the interfaces compile and tests run ok with all
+	  Pointset_Powersets of polyhedra, weakly relational domains and
+	  grids.  Also the interfaces compile and tests run ok with any
+	  products of the same domains.
+
+2008-02-01 Friday 17:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.27),
+	  ppl_interface_generator_common_dat.m4 (1.56),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.9),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.27),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.22),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.16),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.62):
+	  Interface code revised so as to handle powersets of weakly
+	  relational domain elements. More tests are still needed.  The new
+	  m4 code in ppl_interface_generator_common_dat.m4 will be
+	  documentated later.
+
+2008-02-01 Friday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (1.10): Tests uncommented
+	  (apparently they were commented out by mistake on April 3, 2007).
+
+2008-02-01 Friday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.235), src/BD_Shape.defs.hh (1.111),
+	  src/BD_Shape.templates.hh (1.91), src/Octagonal_Shape.defs.hh
+	  (1.39), src/Octagonal_Shape.templates.hh (1.65),
+	  tests/BD_Shape/relations3.cc (1.28),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.9): Added methods
+	  relation_with() for congruences to the Octagonal_Shape and
+	  BD_Shape domains.
+
+	  Added notes wrt these and the relation_with() for costraints in
+	  the TODO file.
+
+	  Exception throwers throw_dimension_incompatible() for congruences
+	  added to both these domains.
+
+2008-01-31 Thursday 15:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.26),
+	  ppl_interface_generator_common_dat.m4 (1.55),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.8),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.4),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.4),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.3), Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.61),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.70): Now allow the list of procedure names for generation to
+	  have an optional "\" before a group name "g" which is meant to be
+	  used only in conjunction with the powerset domain, and to mean
+	  -don't generate code if the powerset's disjunct is in "g"-.  This
+	  is needed to avoid generating linear_partition code when the
+	  disjunct is Grid and similarly approximate_partition code when
+	  the disjunct is C_ or NNC_Polyhedron.
+
+	  The Powerset of Grids in all the interfaces now compiles and the
+	  compiled code passes all the tests in Java and Prolog interfaces.
+
+	  Added to the todo lists in the procedure_generator m4 files for
+	  C, Java and Ocaml, the approximate_partition procedure for
+	  powersets of grids.
+
+2008-01-31 Thursday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.54),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.7), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.28),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.18),
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (1.3),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.44),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.27), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (1.26), interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (1.21),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.15),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.60),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.69), src/Partially_Reduced_Product.defs.hh (1.21),
+	  src/Partially_Reduced_Product.inlines.hh (1.20),
+	  src/Pointset_Powerset.inlines.hh (1.13): Added hash_code() to the
+	  pointset_powerset and partially_reduced_product domains.  Enable
+	  this in the Java interface for all the domains.  Also enable in
+	  the Java interface the string() method for all the domains, so as
+	  to include the product domains.
+
+	  Added methods for external/total_memory_in_bytes for all the
+	  domains and to all the interfaces.  Existing tests for size() for
+	  prolog and java now use the MEMBYTES pattern instead so as to
+	  test all the replacements for MEMBYTES.
+
+	  These with the size() method (for the pointset_powerset domains)
+	  are all generated from a single "pattern" "MEMBYTES", defined in
+	  interfaces/ppl_interface_generator_common_dat.m4.
+
+	  Added methods for external/total_memory_in_bytes for all the
+	  domains and to all the interfaces.
+
+	  Existing tests for size() for prolog and java now use the
+	  MEMBYTES pattern instead so as to test all its replacements.
+
+	  These with the size() method (for the pointset_powerset domains)
+	  are all generated from a single "pattern" "MEMBYTES", defined in
+	  interfaces/ppl_interface_generator_common_dat.m4.
+
+2008-01-30 Wednesday 18:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.226),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.6), interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.27),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.17),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.43),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.26), interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (1.25), interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (1.20),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (1.14),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.59),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.68), src/Partially_Reduced_Product.inlines.hh (1.19):
+	  Corrected a missing "+" in
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  which caused some interface predicates not to be generated.
+
+	  Added add_constraint_and_minimize() and
+	  add_constraint_and_minimize() to the Partially_Reduced_Product
+	  domain.
+
+	  In the interfaces, the interface procedures for
+	  ppl_Grid_generalized_image_lhs_rhs/5 and
+	  ppl_Grid_generalized_preimage_lhs_rhs/5
+	  ppl_Grid_generalized_image/6 and
+	  ppl_Grid_generalized_preimage/6    have been renamed as
+	  ppl_Grid_generalized_image_lhs_rhs_with_congruence/5
+	  ppl_Grid_generalized_preimage_lhs_rhs_with_congruence/5
+	  ppl_Grid_generalized_image_with_congruence/6
+	  ppl_Grid_generalized_preimage_with_congruence/6    so as to allow
+	  for /4 and /5, resp., versions
+
+	  (This change also reported in "News").
+
+	  Tidied and commented the procedure list in
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  so that where not "+all" domains are implemented in the
+	  interfaces, comments explain further.
+
+	  A few remaining procedures that can be enabled for products
+	  and/or powersets in the interfaces have been enabled.
+
+	  Added two "todo" procedures to the OCaml list of procedure
+	  generators.
+
+2008-01-30 Wednesday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.5), src/Pointset_Powerset.defs.hh (1.30),
+	  src/Pointset_Powerset.inlines.hh (1.12),
+	  src/Pointset_Powerset.templates.hh (1.26),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.2): Added methods for
+	  expand_space_dimension() and fold_space_dimensions() and
+	  constructor from a box, for the pointset_powerset domain.
+
+	  Added tests for add and remove (higher) space dimensions for the
+	  powerset domain as well as tests for the new methods.
+
+	  Enabled the corresponding procedures in all the interfaces.
+
+2008-01-30 Wednesday 09:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.53),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.4), src/Partially_Reduced_Product.defs.hh (1.20),
+	  src/Partially_Reduced_Product.inlines.hh (1.18),
+	  tests/Grid/directproduct3.cc (1.17): Enabled a few more
+	  procedures in the interfaces for the product domain.
+
+	  Added to all the interfaces (including C++) the
+	  intersection_assign_and_minimize() procedure for the
+	  partially_reduced_product domains for uniformity with the other
+	  domains.
+
+2008-01-30 Wednesday 08:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.67): Bug in generated test file for the product domain fixed.
+
+2008-01-29 Tuesday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.25),
+	  ppl_interface_generator_common_dat.m4 (1.52),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.3),
+	  C/ppl_interface_generator_c_cc.m4 (1.14),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.66): Improved the definitions of the product domains so that
+	  the list of different product domains occurs just once in the m4
+	  code.
+
+	  Almost all the methods/procedures appropriate for the product
+	  domains are now enabled in all the interfaces.
+
+	  Bug in the generated tests in ppl_predicate_check_test.pl for the
+	  product domain still to be checked and fixed.
+
+2008-01-29 Tuesday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.13),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.51),
+	  interfaces/ppl_interface_generator_common_procedure_generators.m4
+	  (1.2), interfaces/C/ppl_interface_generator_c_cc.m4 (1.13),
+	  interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
+	  (1.2): Enabled the product domains; building from space
+	  dimensions, other products, constraints and congruences.  Enable
+	  the OK check and the free() method for Java.
+
+	  Allow the configuration to include instantiations for the
+	  Direct_Product, Smash_Product and Constraints_Product domains
+	  with simple arguments.
+
+	  Every interface tested for just the instantiation
+	  Direct_Product<C_Polyhedron,Grid>
+
+2008-01-29 Tuesday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.76): Previous change unintended -
+	  revert to previous version.
+
+2008-01-28 Monday 15:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.26),
+	  ppl_interface_generator_c_h_code.m4 (1.16),
+	  ppl_interface_generator_c_procedure_generators.m4 (1.3): In the C
+	  interface, added (m4) implementation code for add_disjunct.
+	  Remove done items from "todo" list.
+
+2008-01-28 Monday 14:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.25),
+	  ppl_interface_generator_c_h_code.m4 (1.15),
+	  ppl_interface_generator_c_procedure_generators.m4 (1.2): Added to
+	  the C interface the m4 code for drop_disjuncts.
+
+2008-01-28 Monday 14:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.24),
+	  ppl_interface_generator_c_h_code.m4 (1.14): Added to the C
+	  interface procedures for Pointset_Powerset (const) iterators:
+	  increment, decrement, equals, begin and end.
+
+2008-01-28 Monday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.23),
+	  ppl_interface_generator_c_h_code.m4 (1.13): Added to the C
+	  interface the ppl_ at CLASS@_size method.
+
+2008-01-28 Monday 12:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Makefile.am (1.30),
+	  ppl_interface_generator_common_procedure_generators.m4 (1.1),
+	  ppl_interface_generator_common_procedure_list.m4 (1.5),
+	  C/Makefile.am (1.39), C/ppl_c.h.in (1.75),
+	  C/ppl_interface_generator_c_all_dat.m4 (1.2),
+	  C/ppl_interface_generator_c_cc.m4 (1.12),
+	  C/ppl_interface_generator_c_h.m4 (1.15),
+	  C/ppl_interface_generator_c_procedure_generators.m4 (1.1),
+	  Java/Makefile.am (1.16),
+	  Java/ppl_interface_generator_java_all_dat.m4 (1.3),
+	  Java/ppl_interface_generator_java_procedure_generators.m4 (1.1),
+	  Java/jni/Makefile.am (1.17),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.12), Java/tests/Makefile.am (1.19),
+	  Java/tests/ppl_interface_generator_java_test_java.m4 (1.15),
+	  OCaml/Makefile.am (1.37),
+	  OCaml/ppl_interface_generator_ocaml_all_dat.m4 (1.2),
+	  OCaml/ppl_interface_generator_ocaml_cc.m4 (1.8),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.13),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.11),
+	  OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
+	  (1.1), Prolog/Makefile.am (1.47),
+	  Prolog/ppl_interface_generator_prolog_all_dat.m4 (1.2),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.14),
+	  Prolog/ppl_interface_generator_prolog_procedure_generators.m4
+	  (1.1), Prolog/ppl_interface_generator_prolog_systems.m4 (1.13),
+	  Prolog/Ciao/Makefile.am (1.71), Prolog/GNU/Makefile.am (1.69),
+	  Prolog/SICStus/Makefile.am (1.85), Prolog/SWI/Makefile.am (1.81),
+	  Prolog/XSB/Makefile.am (1.61), Prolog/YAP/Makefile.am (1.58),
+	  Prolog/tests/Makefile.am (1.20),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.34): Renamed the files containing the schematic lists of
+	  procedures so that the common tail is "procedure_generators.m4".
+
+2008-01-28 Monday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_procedure_list.m4
+	  (1.4), Java/ppl_interface_generator_java_dat.m4 (1.15),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.42), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.24),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.19),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.13): Fixed
+	  bugs wrt the pointset powerset caused by the previous commit
+	  domain in the OCaml and Java interfaces.
+
+2008-01-27 Sunday 21:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.50),
+	  ppl_interface_generator_common_procedure_list.m4 (1.3),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.41), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.23),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.18),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.12),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.58),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.65): By defining a new pattern "incdec" and its replacement,
+	  made the increment and decrement iterator methods use common
+	  code.  Similarly the begin_iterator and end_iterator now use
+	  common code.
+
+2008-01-26 Saturday 10:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.84): Use AM_CPPFLAGS for
+	  `splfr' and `spld', not CPPFLAGS.
+
+2008-01-25 Friday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.83): Support
+	  installation of SICStus in non-standard places.
+
+2008-01-25 Friday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.302): Version number bumped.
+
+2008-01-25 Friday 12:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.49),
+	  ppl_interface_generator_common_procedure_list.m4 (1.2),
+	  C/Makefile.am (1.38), C/ppl_interface_generator_c_all_dat.m4
+	  (1.1), C/ppl_interface_generator_c_cc.m4 (1.11),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.22),
+	  C/ppl_interface_generator_c_dat.m4 (1.15),
+	  C/ppl_interface_generator_c_h.m4 (1.14),
+	  C/ppl_interface_generator_c_h_code.m4 (1.12): Synchronizing the C
+	  interface with the other interfaces.	Several missing methods for
+	  the C interface are listed in a comment at the end of
+	  ppl_interface_generator_c_all_dat.m4
+
+2008-01-25 Friday 08:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/Makefile.am (1.36): Fixed a bug. The interface
+	  no longer uses ppl_interface_generator_prolog_dat.m4
+
+2008-01-24 Thursday 22:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.14), OCaml/Makefile.am (1.35),
+	  OCaml/ppl_interface_generator_ocaml_all_dat.m4 (1.1),
+	  OCaml/ppl_interface_generator_ocaml_cc.m4 (1.7),
+	  OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.22),
+	  OCaml/ppl_interface_generator_ocaml_dat.m4 (1.9),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.12),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.17),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.10),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.11): OCaml
+	  interface now synchronized with the Java and Prolog interfaces.
+	  A few missing methods listed as a comment at the end of
+	  OCaml/ppl_interface_generator_ocaml_all_dat.m4
+
+	  Trivial layout improvement to
+	  Java/tests/ppl_interface_generator_java_test_java.m4
+
+2008-01-24 Thursday 16:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_interface_generator_java_all_dat.m4 (1.2):
+	  Comment corrected.
+
+2008-01-24 Thursday 16:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.48),
+	  Java/Makefile.am (1.15),
+	  Java/ppl_interface_generator_java_all_dat.m4 (1.1),
+	  Java/jni/Makefile.am (1.16),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.11),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.40), Java/tests/Makefile.am (1.18),
+	  Java/tests/ppl_interface_generator_java_test_java.m4 (1.13):
+	  Synchronizing the Java interface with the Prolog interface.  A
+	  few methods not yet implemented are listed as a comment in the
+	  added file Java/ppl_interface_generator_java_all_dat.m4 which
+	  also contains a few methods special to the Java interface.
+
+2008-01-24 Thursday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.47),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.39), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.21),
+	  OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.16),
+	  OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.10),
+	  Prolog/Makefile.am (1.46),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.45),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.57),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.12),
+	  Prolog/Ciao/Makefile.am (1.70), Prolog/GNU/Makefile.am (1.68),
+	  Prolog/SWI/Makefile.am (1.80), Prolog/XSB/Makefile.am (1.60),
+	  Prolog/YAP/Makefile.am (1.57),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.64),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.33): For the pointset_powerset domain, the way the disjunct
+	  classes are handled changed so that the topology is replaced
+	  separately.
+
+	  Completed, for the Prolog interface, the separation between the
+	  system procedure list and the list of the procedures to be
+	  generated.
+
+2008-01-24 Thursday 09:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Makefile.am (1.29), Prolog/Makefile.am (1.45),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.13): Fixed a bug
+	  in the makefile dependencies for Prolog due to the new dependent
+	  common file ppl_interface_generator_common_procedure_list.m4
+
+2008-01-23 Wednesday 19:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.46): Change
+	  needed for the pointset_powerset domains and their C++ friend
+	  names.
+
+2008-01-23 Wednesday 18:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.24),
+	  ppl_interface_generator_common_procedure_list.m4 (1.1),
+	  Prolog/Makefile.am (1.44),
+	  Prolog/ppl_interface_generator_prolog_all_dat.m4 (1.1),
+	  Prolog/SICStus/Makefile.am (1.82), Prolog/tests/Makefile.am
+	  (1.19): A start on merging the procedure lists for the different
+	  interfaces to ensure the interface systems are fully
+	  synchronized.  Currently the new lists only used and tested in
+	  SICStus Prolog.
+
+2008-01-23 Wednesday 18:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.23),
+	  ppl_interface_generator_common_dat.m4 (1.45),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.21),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.38), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.20),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.56): Fixed a
+	  bug introduced in teh previous commit due to the overloading of
+	  the prefix "cpp_" in the patterns.  New prefix temporarily
+	  changed to "cppx_".  Further work on simplifying this code may
+	  allow the merge of the different uses of the "cpp_"/"cppx_"
+	  prefix into 1.
+
+2008-01-23 Wednesday 17:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.22),
+	  ppl_interface_generator_common_dat.m4 (1.44),
+	  C/ppl_interface_generator_c_cc.m4 (1.10),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.20),
+	  C/ppl_interface_generator_c_dat.m4 (1.14),
+	  C/ppl_interface_generator_c_h_code.m4 (1.11),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.37), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.19),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.55): Allow
+	  the C interface to build from a "friend" as we can already do in
+	  the other interfaces.
+
+	  Revised the "friend" pattern replacements.  To generate the new
+	  code for the C interface, an extra option has been added that
+	  allows for replacing friend classes C_Polyhedron and
+	  NNC_Polyhedron without their topology.
+
+	  cpp_friend now gives the C++ name while alt_friend has been
+	  changed to give the interface name without the topology (ie only
+	  in the case that the friend is a polyhedron).
+
+	  As we already used the alt_friend for the C++ version of the
+	  friend class name (now called cpp_friend), this change affected
+	  several files.
+
+2008-01-23 Wednesday 11:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/pointsetpowerset4.cc (1.6): Tests 5, 6 and 9
+	  fail for check-int8.
+
+2008-01-23 Wednesday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset4.cc (simplex.1): file
+	  pointsetpowerset4.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-01-23 Wednesday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.59): Fixed two bugs
+	  introduced in previous changes here.
+
+2008-01-22 Tuesday 21:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.14),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.36), tests/ppl_interface_generator_java_test_java.m4 (1.12),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.25): Just
+	  as is already the case for the Prolog interfaces, Java can build
+	  a class from a "friend" of that class.  E.g., a C_Polyhedron can
+	  be built from an NNC_Polyhedron, a Grid, a BD_Shape etc, provided
+	  the "friend" exists as one of the instantiations in the
+	  configuration.
+
+2008-01-22 Tuesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.10), config.guess (1.40), config.sub (1.38), depcomp
+	  (1.13), install-sh (1.19), Watchdog/INSTALL (1.7),
+	  Watchdog/config.guess (1.24), Watchdog/config.sub (1.23),
+	  Watchdog/depcomp (1.10), Watchdog/install-sh (1.15): Updated from
+	  Automake 1.10.1.
+
+2008-01-21 Monday 22:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.21),
+	  ppl_interface_generator_common_dat.m4 (1.43),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.44),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.63),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.32): A start on cleaning/tidying some of the m4 code -
+	  avoiding generating unwanted whitespace.
+
+2008-01-21 Monday 22:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.20),
+	  Prolog/Ciao/Makefile.am (1.69),
+	  Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.8), Prolog/SICStus/Makefile.am (1.81),
+	  Prolog/SICStus/sp_predicate_check.pl (1.7),
+	  Prolog/SWI/Makefile.am (1.79), Prolog/SWI/swi_predicate_check.pl
+	  (1.6), Prolog/XSB/Makefile.am (1.58),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.9), Prolog/tests/Makefile.am (1.18),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.62),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.31), Prolog/tests/ppl_predicate_check_common.pl (1.9): The
+	  tests for all the interfaces predicates that are generated and
+	  were placed in ppl_predicate_check.pl are now generated and split
+	  into a number of files; the top-level one is
+	  ppl_predicate_test_main.pl and the rest have a name of the form
+
+	  ppl_predicate_test_CLASS.pl
+
+	   where CLASS is the name of an interface class (there is just one
+	  file
+	  "ppl_predicate_test_Polyhedron.pl" for both the C_Polyhedron and
+	  NNC_Polyhedron domains.
+
+	  This resolves a problem when checking the interface predicates
+	  for XSB with more than 3 classes where the large generated file
+	  caused an error to be thrown.
+
+	  This change has been tested on SWI Prolog, SICStus, XSB and Ciao
+	  Prolog with up to 4 (5 if we count C_Polyhedron and
+	  NNC_Polyhedron separately) different interface classes.
+
+2008-01-21 Monday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/: cm_cleaner.sh (1.5), cm_splitter.sh (1.5): Use `IFS= read
+	  -r' instead of a simple `read'.  This means that leading blanks
+	  and backslashes will no longer be eaten.
+
+2008-01-21 Monday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc.m4 (1.6),
+	  ppl_interface_generator_ocaml_ml.m4 (1.11),
+	  ppl_interface_generator_ocaml_mli.m4 (1.9): Revised the
+	  generation of these files so that all type and other class
+	  methods are added before the main part of the code so that one
+	  class can refer to elements of another class.
+
+2008-01-21 Monday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.3): Added some notes on the
+	  configuration of MLGMP, since the information contained in the
+	  package itself is rather terse.
+
+2008-01-21 Monday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (1.2): Explained the requirements
+	  for the OCaml interface.  Note that the Caml Hump page for MLGMP
+	  is out of date (bug already reported): while they fix it, MLGMP
+	  can be found at
+	  http://www-verimag.imag.fr/~monniaux/programmes.html.fr.
+
+2008-01-21 Monday 12:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.18), ppl_interface_generator_ocaml_dat.m4 (1.8),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.15),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.9): Removed the
+	  pattern "@INTOPOLOGY@" which preceded "@FRIEND@" since the
+	  topology is now part of the replacement for "@FRIEND@".
+
+2008-01-19 Saturday 18:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.42): Fixed a
+	  bug which showed in the Java generated code for the relation_with
+	  methods.
+
+2008-01-19 Saturday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (1.9): At the end of the C++ PPL header file,
+	  #undef PPL_NO_AUTOMATIC_INITIALIZATION if it is defined.
+
+2008-01-18 Friday 20:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/Makefile.am (1.3): Distribute also ppl.hh, ppl_c.h, and
+	  pwl.hh.
+
+2008-01-18 Friday 20:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.301): Version number bumped.
+
+2008-01-18 Friday 15:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.25), interfaces/README.interfaces (1.1):
+	  Brief notes on how to generate and use code for a choice of
+	  domains in the (mainly Prolog) interfaces.
+
+2008-01-18 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/README.interfaces (simplex.1): file README.interfaces
+	  was added on branch simplex on 2008-06-06 14:21:57 +0000
+
+2008-01-18 Friday 13:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.61): Fixed some bugs in the test file that caused some warning
+	  messages when testing the code in the Ciao interface.
+
+2008-01-18 Friday 12:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.60): A bug fixed.
+
+2008-01-18 Friday 12:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.68),
+	  SICStus/sp_predicate_check.pl (1.6), SWI/swi_predicate_check.pl
+	  (1.5), XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.8), tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.30): Enable make predicate_check_test for Ciao.  To do this,
+	  the ":- include ppl_predicate_check_common." directive has to be
+	  in the generated file ppl_predicate_check.pl
+
+	  For this reason, the corresponding directives in
+	  swi_predicate_check.pl and SICStus/sp_predicate_check.pl have
+	  been removed.
+
+	  For XSB, the include directive is not supported as is and instead
+	  a "#include" must be used. Changes made for XSB to handle this.
+
+	  Warning messages given by the Ciao system when compiling the
+	  generated file ppl_predicate_check.pl need further investigation
+	  but the test in Ciao succeeds.
+
+2008-01-18 Friday 11:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.12): The instantiation options "C_Polyhedron" and
+	  "NNC_Polyhedron" made invalid.
+
+2008-01-18 Friday 10:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: SICStus/Makefile.am (1.80),
+	  SICStus/sp_predicate_check.pl (1.5), SWI/Makefile.am (1.78),
+	  XSB/Makefile.am (1.57),
+	  XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.7): The
+	  Prolog systems SWI, SICStus and XSB all allow for the toplevel
+	  command "make predicate_check_test" to check the generated
+	  ppl_prolog.icc code for the chosen set of instantiations.
+
+	  Note that XSB cannot manage more than three instantiations (eg
+	  "Polyhedron at Grid@Pointset_Powerset<C_Polyhedron>") at any one
+	  time.
+
+2008-01-18 Friday 10:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* instchk.hh (1.11),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.41): The
+	  instantiations for the powerset domains when the disjunct is a
+	  polyhedron is changed and now the topology must be explicit.
+	  Ie., the configuration instantiations option
+	  Pointset_Powerset<Polyhedron> is disabled but instead
+	  Pointset_Powerset<C_Polyhedron> and
+	  Pointset_Powerset<NNC_Polyhedron> are both enabled.
+
+2008-01-17 Thursday 16:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.40),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.43),
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl (1.8),
+	  src/Pointset_Powerset.defs.hh (1.29),
+	  src/Pointset_Powerset.templates.hh (1.25),
+	  tests/Polyhedron/Makefile.am (1.119),
+	  tests/Polyhedron/pointsetpowerset5.cc (1.1): For the powerset
+	  domains, added methods for relation_with() for constraint,
+	  congruence and generator to all the interfaces.
+
+	  In the interfaces, also enable the grids to have relation_with()
+	  for a generator.
+
+2008-01-17 Thursday 13:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.39),
+	  src/Pointset_Powerset.defs.hh (1.28),
+	  src/Pointset_Powerset.templates.hh (1.24),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.5): For the powerset
+	  domain, the method topological_closure_assign() added to all the
+	  interfaces.
+
+2008-01-17 Thursday 12:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.38),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.42),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.59): Now allow for several more predicates for the powerset
+	  domain.  In particular all the recent additions in the main C++
+	  interface are now included in the Prolog interface.
+
+2008-01-17 Thursday 11:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.27),
+	  src/Pointset_Powerset.inlines.hh (1.11),
+	  src/Pointset_Powerset.templates.hh (1.23),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.4): For the powerset
+	  domain, added methods intersection_assign_and_minimize(),
+	  contains() and strictly_contains() with appropriate tests.
+
+2008-01-17 Thursday 09:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.26),
+	  src/Pointset_Powerset.templates.hh (1.22),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.3): For the powerset
+	  domain, added methods add_congruence(),
+	  add_congruence_and_minimize(), add_congruences() and
+	  add_congruences_and_minimize() with tests.
+
+2008-01-17 Thursday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.templates.hh (1.21),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.2): Fixed some bugs in
+	  code for maximize() and minimize() for the powerset domains and
+	  improved the tests.
+
+2008-01-16 Wednesday 21:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.41),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.58): Now
+	  allow for
+	  ppl_Pointset_Powerset_..._equals_ppl_Pointset_Powerset_..._ in
+	  the Prolog interface.
+
+2008-01-16 Wednesday 21:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.40):
+	  Now the interfaces can support bounds_from_above/below() and
+	  maximize/minimize for the powerset domain.  Also added support
+	  for bounds_from_above/below() for bd shapes and octagonal shapes
+	  in Prolog.
+
+2008-01-16 Wednesday 17:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.25),
+	  src/Pointset_Powerset.templates.hh (1.20),
+	  tests/Polyhedron/Makefile.am (1.118),
+	  tests/Polyhedron/pointsetpowerset4.cc (1.1): For the powerset
+	  domains, added methods: bounds_from_above(), bounds_from_below(),
+	  maximize() and minimize() - both with and without returning the
+	  point.  Tests added to check these.
+
+2008-01-16 Wednesday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset3.cc (simplex.1): file
+	  pointsetpowerset3.cc was added on branch simplex on 2008-06-06
+	  14:22:13 +0000
+
+2008-01-16 Wednesday 09:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.24),
+	  src/Pointset_Powerset.templates.hh (1.19),
+	  tests/Polyhedron/pointsetpowerset3.cc (1.2): Added to the
+	  powerset domain methods is_discrete() and is_disjoint_from().
+
+2008-01-15 Tuesday 17:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.37),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.39): Added the
+	  is_empty(), is_universe(), is_topologically_closed() and
+	  is_bounded() for powersets to the Prolog interfaces.
+
+2008-01-15 Tuesday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.23),
+	  src/Pointset_Powerset.templates.hh (1.18),
+	  tests/Polyhedron/Makefile.am (1.117),
+	  tests/Polyhedron/pointsetpowerset3.cc (1.1): Added to the
+	  pointset powerset domain tests is_empty() is_universe()
+	  is_topologically_closed() and is_bounded().  Tests for these also
+	  added.
+
+	  Note: in the code for is_universe() there are the 2 FIXME
+	  comments:	// FIXME: this is not the most efficient
+	  implementation.      // FIXME: this is buggy when PS is not an
+	  abstraction of NNC_Polyhedron.
+
+2008-01-15 Tuesday 13:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.64), Grid_chdims.cc (1.22),
+	  Grid_nonpublic.cc (1.33), Grid_public.cc (1.65): Replaced bad
+	  coding style in Boolean expressions by a more readable style.
+	  Also update_congruences() now returns void and not bool.
+
+2008-01-15 Tuesday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.36),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.57): Support for minimized representations added.
+
+2008-01-15 Tuesday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.64): Change to correct the bug in
+	  minimized_congruences().
+
+2008-01-15 Tuesday 09:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/mincongruences1.cc (1.12): Changed test04 to show a
+	  bug: an extra OK() test shows that after minimized_congruences(),
+	  the grid is not ok.
+
+2008-01-15 Tuesday 08:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.38):
+	  Undone a change yesterday, that affected the compilation of
+	  SICStus and Ciao, for the generalized image for grids which needs
+	  a different arity to that for the other domains.
+
+2008-01-14 Monday 18:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.110), src/BD_Shape.inlines.hh (1.156),
+	  src/Octagonal_Shape.defs.hh (1.38),
+	  src/Octagonal_Shape.inlines.hh (1.27), src/Polyhedron.defs.hh
+	  (1.330), src/Polyhedron.inlines.hh (1.146),
+	  tests/BD_Shape/Makefile.am (1.71), tests/BD_Shape/congruences1.cc
+	  (1.1), tests/Octagonal_Shape/Makefile.am (1.24),
+	  tests/Octagonal_Shape/congruences1.cc (1.1),
+	  tests/Polyhedron/addcongruence1.cc (1.10): Added methods for
+	  add_congruence_and_minimize in order that we have a uniform set
+	  of methods across all simple classes.
+
+	  Also corrected congruences() and minimized_congruences() in the
+	  BD_Shape and Octagonal_Shape domains which were wrong for empty
+	  elements.
+
+	  Added tests for all these methods which were untested.
+
+2008-01-14 Monday 16:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.7): Wrong file name corrected.
+
+2008-01-14 Monday 16:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.56),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.29),
+	  ppl_predicate_check_common.pl (1.7): Some of the changes needed
+	  to get the interfaces working in Ciao Prolog.  For instance /= is
+	  changed to /==.  Also all the generated test predicates are
+	  declared as dynamic as some are never defined in the test code.
+
+2008-01-14 Monday 11:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.35):
+	  Improvements to layout and similar to the m4 code.
+
+2008-01-14 Monday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.34): Added
+	  support for building from congruences for all the domains.  Added
+	  support for contains_integer_point for the powerset domain.
+
+2008-01-13 Sunday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.37),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.54),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.55):
+	  Expanded the number of predicates generated for classes such as
+	  Octagonal_Shape<...> and Pointset_Powerset<...>.
+
+	  Fixed a bug in the m4 code for generating ppl_prolog.icc when
+	  building a class from a box.	Note that the bug only was apparent
+	  for classes with a templatic argument such as
+	  Octagonal_Shape<...>.
+
+	  In the m4 code for generating ppl_predicate_check.pl tests
+	  modified to allow for the larger set of classes.
+
+2008-01-13 Sunday 17:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.33),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.36),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.53):
+	  Upgraded the friend replacement code to allow for the simple
+	  classes (eg polyhedra, bd shapes, grids) to build from other
+	  simple classes that are in the list of instantiations.
+
+2008-01-13 Sunday 13:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.52), tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.54): Corrected bug in m4 generating code for ppl_prolog.icc
+	  for the powersets linear_partition predicate.
+
+	  Also corrected test for linear_partition in m4 generating code
+	  for ppl_predicate_check.pl
+
+2008-01-13 Sunday 11:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.13),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.35): The string "@FRINED@" was wrongly used.  As the
+	  definition of FRIEND in m4 is being revised to allow more classes
+	  to be built from other classes, this wrong use will become a bug
+	  if it is not corrected.
+
+2008-01-12 Saturday 23:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.53),
+	  ppl_predicate_check_common.pl (1.6): In
+	  ppl_interface_generator_predicate_check_code.m4 corrected syntax
+	  error.
+
+	  In ppl_predicate_check_common.pl revised expected relations for
+	  grids to match changes in src code.
+
+2008-01-09 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Java/jni/.cvsignore (1.4), Prolog/Ciao/.cvsignore
+	  (1.7), Prolog/GNU/.cvsignore (1.7), Prolog/SICStus/.cvsignore
+	  (1.8), Prolog/SWI/.cvsignore (1.8), Prolog/XSB/.cvsignore (1.6),
+	  Prolog/YAP/.cvsignore (1.7): Updated.
+
+2008-01-09 Wednesday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Java/.cvsignore (1.2), Java/jni/.cvsignore (1.3),
+	  Java/tests/.cvsignore (1.2), Prolog/.cvsignore (1.2),
+	  Prolog/tests/.cvsignore (1.2): Updated.
+
+2008-01-09 Wednesday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/.cvsignore (1.7), Watchdog/src/.cvsignore (1.3),
+	  interfaces/OCaml/.cvsignore (1.4),
+	  interfaces/Prolog/Ciao/.cvsignore (1.6),
+	  interfaces/Prolog/GNU/.cvsignore (1.6),
+	  interfaces/Prolog/SICStus/.cvsignore (1.7),
+	  interfaces/Prolog/SWI/.cvsignore (1.7),
+	  interfaces/Prolog/XSB/.cvsignore (1.5),
+	  interfaces/Prolog/YAP/.cvsignore (1.6), src/.cvsignore (1.12):
+	  Ignore *.loT files.
+
+2008-01-09 Wednesday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.8), Watchdog/.cvsignore (1.6),
+	  interfaces/.cvsignore (1.2), interfaces/C/.cvsignore (1.4),
+	  interfaces/Java/jni/.cvsignore (1.2), src/.cvsignore (1.11):
+	  Updated.
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.4): Avoid multiarch conflicts when installed
+	  for multiple architectures.
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/: ppl.hh (1.1), ppl_c.h (1.1), pwl.hh (1.1): Header file
+	  switchers to avoid multiarch conflicts when the PPL and PWL are
+	  installed for multiple architectures (e.g., i386 and x86_64).
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.hh (simplex.1): file ppl.hh was added on branch
+	  simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl_c.h (simplex.1): file ppl_c.h was added on branch
+	  simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-09 Wednesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/pwl.hh (simplex.1): file pwl.hh was added on branch
+	  simplex on 2008-06-06 14:21:56 +0000
+
+2008-01-07 Monday 12:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING, CREDITS, ChangeLog, INSTALL, Makefile.am, NEWS, README,
+	  README.configure, STANDARDS, TODO, compile, config.guess,
+	  config.sub, configure.ac, depcomp, install-sh, instchk.hh,
+	  ltmain.sh, ppl.spec.in, Watchdog/COPYING, Watchdog/ChangeLog,
+	  Watchdog/INSTALL, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/README, Watchdog/compile, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/configure.ac, Watchdog/ltmain.sh,
+	  Watchdog/doc/.cvsignore, Watchdog/doc/Makefile.am,
+	  Watchdog/doc/README.doc, Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	  Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+	  Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+	  Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	  Watchdog/m4/.cvsignore, Watchdog/m4/Makefile.am,
+	  Watchdog/m4/ax_prefix_config_h.m4,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  debian/Makefile.am, debian/libppl-pwl.copyright.in,
+	  debian/libppl.copyright.in, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/README,
+	  demos/ppl_lpsol/examples/egout.mps,
+	  demos/ppl_lpsol/examples/ex12.mps,
+	  demos/ppl_lpsol/examples/lseu.mps,
+	  demos/ppl_lpsol/examples/markshare1.mps,
+	  demos/ppl_lpsol/examples/markshare2.mps,
+	  demos/ppl_lpsol/examples/mas74.mps,
+	  demos/ppl_lpsol/examples/mas76.mps,
+	  demos/ppl_lpsol/examples/modglob.mps,
+	  demos/ppl_lpsol/examples/noswot.mps,
+	  demos/ppl_lpsol/examples/opt1217.mps,
+	  demos/ppl_lpsol/examples/p0033.mps,
+	  demos/ppl_lpsol/examples/pk1.mps,
+	  demos/ppl_lpsol/examples/rout.mps, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox,
+	  doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-c-interface.tex,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/gpl.dox, doc/gpl.tex, doc/gpl.txt,
+	  doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl.sty,
+	  doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in, doc/user-c-interface.tex,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.tex, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, fedora/.cvsignore,
+	  fedora/Makefile.am, fedora/ppl.spec, interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/C_interface.dox, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/Makefile.am, interfaces/OCaml/README.ocaml,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/OCaml/ppl_ocaml_globals.ml,
+	  interfaces/OCaml/ppl_ocaml_types.ml, interfaces/OCaml/test1.ml,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/README.gprolog,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/README.swiprolog,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/expected_pchk_mpz,
+	  interfaces/Prolog/XSB/expected_pchk_mpz_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/README.yap,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/Makefile.am, m4/ac_check_classpath.m4,
+	  m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+	  m4/ac_cxx_double_binary_format.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_proper_long_double.m4, m4/ac_cxx_remainder_bug.m4,
+	  m4/ac_prog_jar.m4, m4/ac_prog_java.m4, m4/ac_prog_javac.m4,
+	  m4/ac_prog_javah.m4, m4/ac_text_md5sum.m4,
+	  m4/ax_prefix_config_h.m4, m4/ppl.m4, m4/ppl_c.m4,
+	  src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	  src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	  src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	  src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	  src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	  src/Bit_Row.inlines.hh, src/Bit_Row.types.hh,
+	  src/Boundary.defs.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/Box.cc, src/Box.defs.hh,
+	  src/Box.inlines.hh, src/Box.templates.hh, src/Box.types.hh,
+	  src/C_Integer.hh, src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/C_Polyhedron.types.hh,
+	  src/Checked_Number.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence.types.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	  src/Congruence_System.types.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	  src/DB_Row.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Determinate.types.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/Float.cc, src/Float.defs.hh, src/Float.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/GMP_Integer.types.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator.inlines.hh,
+	  src/Generator.types.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Generator_System.types.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	  src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	  src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Has_Assign_Or_Swap.hh,
+	  src/Init.cc, src/Init.defs.hh, src/Init.types.hh,
+	  src/Interval.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.templates.hh, src/Interval.types.hh,
+	  src/Interval_Info.defs.hh, src/Interval_Info.inlines.hh,
+	  src/Interval_Info.types.hh, src/Interval_Restriction.defs.hh,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	  src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  src/Partially_Reduced_Product.defs.hh,
+	  src/Partially_Reduced_Product.inlines.hh,
+	  src/Partially_Reduced_Product.templates.hh,
+	  src/Partially_Reduced_Product.types.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	  src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Rational_Box.hh, src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Slow_Copy.hh, src/Temp.defs.hh,
+	  src/Temp.inlines.hh, src/Temp.templates.hh, src/Topology.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/assign_or_swap.hh, src/checked.cc,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, src/compiler.hh,
+	  src/conversion.cc, src/distances.defs.hh,
+	  src/distances.inlines.hh, src/distances.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+	  src/fpu.defs.hh, src/fpu.types.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/meta_programming.hh, src/minimize.cc,
+	  src/mp_numeric_limits.hh, src/mp_std_bits.cc,
+	  src/mp_std_bits.defs.hh, src/mp_std_bits.inlines.hh,
+	  src/namespaces.hh, src/ppl-config.cc.in, src/ppl_header.hh,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+	  tests/Makefile.am, tests/Partial_Function.cc,
+	  tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/files.cc,
+	  tests/files.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/valgrind_suppressions,
+	  tests/Ask_Tell/.cvsignore, tests/Ask_Tell/Makefile.am,
+	  tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/boundingbox1.cc, tests/BD_Shape/bounds1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/fromgrid1.cc,
+	  tests/BD_Shape/fromoctagonalshape1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/fromspacedim1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+	  tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/removespacedims1.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/Box/.cvsignore,
+	  tests/Box/Makefile.am, tests/Box/addconstraints1.cc,
+	  tests/Box/addspacedims1.cc, tests/Box/affinedimension1.cc,
+	  tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+	  tests/Box/ascii_dump_load1.cc, tests/Box/bdsdifference1.cc,
+	  tests/Box/bgp99extrapolation1.cc, tests/Box/bhz03widening1.cc,
+	  tests/Box/bounded1.cc, tests/Box/boundedaffineimage1.cc,
+	  tests/Box/boxdifference1.cc, tests/Box/boxhull.cc,
+	  tests/Box/boxhull1.cc, tests/Box/cc76narrowing1.cc,
+	  tests/Box/cc76widening.cc, tests/Box/closure1.cc,
+	  tests/Box/concatenate1.cc, tests/Box/congruences1.cc,
+	  tests/Box/constraints1.cc, tests/Box/contains1.cc,
+	  tests/Box/containsintegerpoint1.cc, tests/Box/discrete1.cc,
+	  tests/Box/disjoint1.cc, tests/Box/empty1.cc,
+	  tests/Box/equality1.cc, tests/Box/expandspacedim1.cc,
+	  tests/Box/foldspacedims1.cc, tests/Box/frombdshape1.cc,
+	  tests/Box/frombox1.cc, tests/Box/fromgensys1.cc,
+	  tests/Box/fromgrid1.cc,
+	  tests/Box/frompartiallyreducedproduct1.cc,
+	  tests/Box/frompolyhedron1.cc, tests/Box/frompolyhedron2.cc,
+	  tests/Box/fromspacedim1.cc, tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffinepreimage1.cc,
+	  tests/Box/geomcovers1.cc, tests/Box/intersection1.cc,
+	  tests/Box/interval1.cc, tests/Box/interval2.cc,
+	  tests/Box/mapspacedims1.cc, tests/Box/max_min1.cc,
+	  tests/Box/maxspacedim1.cc, tests/Box/membytes1.cc,
+	  tests/Box/minconstraints1.cc, tests/Box/pointsetpowerset1.cc,
+	  tests/Box/refine1.cc, tests/Box/refine2.cc, tests/Box/refine3.cc,
+	  tests/Box/relations1.cc, tests/Box/relations2.cc,
+	  tests/Box/removespacedims1.cc, tests/Box/run_tests,
+	  tests/Box/timeelapse1.cc, tests/Box/universe1.cc,
+	  tests/Box/writebox1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/approximatepartition1.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	  tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/constraints1.cc,
+	  tests/Grid/contains1.cc, tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/directproduct3.cc,
+	  tests/Grid/directproduct4.cc, tests/Grid/directproduct5.cc,
+	  tests/Grid/directproduct6.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/frombdshape1.cc, tests/Grid/fromoctagonalshape1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	  tests/Grid/outputoperator3.cc,
+	  tests/Grid/partiallyreducedproduct1.cc,
+	  tests/Grid/partiallyreducedproduct2.cc,
+	  tests/Grid/partiallyreducedproduct3.cc, tests/Grid/partition1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/powersetgeometricallyequals1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/MIP_Problem/.cvsignore, tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/MIP_Problem/mipproblem2.cc,
+	  tests/MIP_Problem/mipproblem3.cc,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/frombdshape1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/fromgrid1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/fromspacedim1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/.cvsignore, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/README, tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constrains1.cc,
+	  tests/Polyhedron/constraints1.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/frombdshape1.cc, tests/Polyhedron/frombox1.cc,
+	  tests/Polyhedron/frombox2.cc, tests/Polyhedron/fromgrid1.cc,
+	  tests/Polyhedron/fromoctagonalshape1.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc, tests/Polyhedron/hybrid.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/lpproblem3.cc,
+	  tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/pointsetpowerset2.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	  utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh
+	  (simplex.[1,1,3,2,3,3,3,3,3,6,1,4,4,3,1,3,3,2,2,1,3,2,3,2,3,1,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,3,2,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,15,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,2,2,2,2,2,4,3,3,1,1,1,3,2,3,3,2,3,2,2,2,2,2,2,2,2,3,3,3,2,2,2,3,2,2,2,2,3,6,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,5,3,2,2,2,2,6,2,2,3,2,3,3,3,3,3,2,2,3,2,2,3,2,2,3,3,2,3,2,2,3,2,2,2,2,3,2,3,2,2,2,2,2, [...]
+	  Fourth merge of the trunk to the `simplex' branch.  The `simplex'
+	  branch is open again.
+
+2008-01-02 Wednesday 18:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (1.9): Added comment in
+	  code for grid exceptions to explain change in previous commit:
+
+	      /* XSB does not throw catchable exceptions for integers out
+	  of range;
+		  so call to exception_sys_prolog is not made when testing
+	  XSB.
+		  The same exclusion for XSB and exception_sys_prolog/1
+	  test is also
+		  made in pl_check.pl (See log message 2007-09-19 10:29:08)
+	  */
+
+2008-01-02 Wednesday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (simplex.1): file
+	  pl_grid_check.pl was added on branch simplex on 2008-01-07
+	  11:15:31 +0000
+
+2008-01-02 Wednesday 13:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (1.8): Updated handling
+	  of exceptions so that the test file runs ok with XSB.
+
+2008-01-02 Wednesday 11:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.51): Corrected code for covering boxes (for Grids).
+
+2008-01-02 Wednesday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (simplex.1): file ppl_interface_generator_prolog_icc_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-02 Wednesday 11:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (1.7): Updated tests to
+	  match changes in the Grid class.
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_cleaner.sh (simplex.1): file cm_cleaner.sh was added on
+	  branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_splitter.sh (simplex.1): file cm_splitter.sh was added
+	  on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/constrains1.cc (simplex.1): file constrains1.cc
+	  was added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (simplex.1): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombdshape1.cc (simplex.1): file
+	  frombdshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox1.cc (simplex.1): file frombox1.cc was
+	  added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox2.cc (simplex.1): file frombox2.cc was
+	  added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/fromgrid1.cc (simplex.1): file fromgrid1.cc was
+	  added on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (simplex.1): file hybrid.cc was added
+	  on branch simplex on 2008-01-07 11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset2.cc (simplex.1): file
+	  pointsetpowerset2.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (simplex.1): file
+	  variablesset1.cc was added on branch simplex on 2008-01-07
+	  11:15:39 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (simplex.1): file
+	  addspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (simplex.1): file
+	  affinedimension1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (simplex.1): file
+	  affineimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (simplex.1): file
+	  affineimage2.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (simplex.1): file
+	  affinepreimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (simplex.1): file
+	  affinepreimage2.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (simplex.1): file
+	  bhmz05widening1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (simplex.1): file
+	  bhz03widening1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (simplex.1): file bounded1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (simplex.1): file
+	  boundedaffineimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounds1.cc (simplex.1): file bounds1.cc was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (simplex.1): file
+	  cc76extrapolation1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (simplex.1): file
+	  cc76narrowing1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (simplex.1): file chinainit.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (simplex.1): file
+	  concatenate1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (simplex.1): file
+	  constraints1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (simplex.1): file contains1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (simplex.1): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/discrete1.cc (simplex.1): file discrete1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (simplex.1): file disjoint1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (simplex.1): file empty1.cc was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (simplex.1): file
+	  expandspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/foldspacedims1.cc (simplex.1): file
+	  foldspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frombdshape1.cc (simplex.1): file
+	  frombdshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (simplex.1): file
+	  fromgensys1.cc was added on branch simplex on 2008-01-07 11:15:37
+	  +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgrid1.cc (simplex.1): file fromgrid1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (simplex.1): file
+	  frompolyhedron1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromspacedim1.cc (simplex.1): file
+	  fromspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (simplex.1):
+	  file generalizedaffineimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (simplex.1):
+	  file generalizedaffineimage2.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (simplex.1):
+	  file generalizedaffineimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (simplex.1):
+	  file generalizedaffineimage4.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (simplex.1):
+	  file generalizedaffineimage5.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (simplex.1):
+	  file generalizedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc (simplex.1):
+	  file generalizedaffinepreimage2.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc (simplex.1):
+	  file generalizedaffinepreimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc (simplex.1):
+	  file generalizedaffinepreimage4.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (simplex.1): file
+	  intersection1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (simplex.1):
+	  file limitedbhmz05extrapolation1.cc was added on branch simplex
+	  on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc (simplex.1):
+	  file limitedcc76extrapolation1.cc was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (simplex.1): file
+	  mapspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (simplex.1): file max_min1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min2.cc (simplex.1): file max_min2.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (simplex.1): file
+	  maxspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/membytes1.cc (simplex.1): file membytes1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (simplex.1): file
+	  minconstraints1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (simplex.1): file
+	  octdifference1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (simplex.1): file octhull1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (simplex.1): file
+	  relatwithcons1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (simplex.1): file
+	  relatwithcons2.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (simplex.1): file
+	  relatwithgen1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (simplex.1): file
+	  removespacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (simplex.1): file run_tests was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (simplex.1): file
+	  timeelapse1.cc was added on branch simplex on 2008-01-07 11:15:37
+	  +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (simplex.1): file universe1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (simplex.1): file
+	  writeoctagon1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: MIP_Problem/Makefile.am, Octagonal_Shape/Makefile.am
+	  (simplex.[1,1]): file Makefile.am was added on branch simplex on
+	  2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: MIP_Problem/ascii_dump_load1.cc,
+	  Octagonal_Shape/ascii_dump_load1.cc (simplex.[1,1]): file
+	  ascii_dump_load1.cc was added on branch simplex on 2008-01-07
+	  11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (simplex.1): file exceptions1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (simplex.1): file mipproblem1.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (simplex.1): file mipproblem2.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (simplex.1): file mipproblem3.cc
+	  was added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/approximatepartition1.cc (simplex.1): file
+	  approximatepartition1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct3.cc (simplex.1): file directproduct3.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct4.cc (simplex.1): file directproduct4.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct5.cc (simplex.1): file directproduct5.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct6.cc (simplex.1): file directproduct6.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (simplex.1): file
+	  generalizedaffineimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (simplex.1): file
+	  generalizedaffinepreimage3.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct1.cc (simplex.1): file
+	  partiallyreducedproduct1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct2.cc (simplex.1): file
+	  partiallyreducedproduct2.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partiallyreducedproduct3.cc (simplex.1): file
+	  partiallyreducedproduct3.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partition1.cc (simplex.1): file partition1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetdifference1.cc (simplex.1): file
+	  powersetdifference1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallycovers1.cc (simplex.1): file
+	  powersetgeometricallycovers1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallyequals1.cc (simplex.1): file
+	  powersetgeometricallyequals1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/addconstraints1.cc (simplex.1): file addconstraints1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/addspacedims1.cc (simplex.1): file addspacedims1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/affinedimension1.cc (simplex.1): file
+	  affinedimension1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/affineimage1.cc (simplex.1): file affineimage1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/affinepreimage1.cc (simplex.1): file affinepreimage1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/ascii_dump_load1.cc (simplex.1): file
+	  ascii_dump_load1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bdsdifference1.cc (simplex.1): file bdsdifference1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bgp99extrapolation1.cc (simplex.1): file
+	  bgp99extrapolation1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bhz03widening1.cc (simplex.1): file bhz03widening1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/bounded1.cc (simplex.1): file bounded1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/boundedaffineimage1.cc, Grid/boundedaffineimage1.cc
+	  (simplex.[1,1]): file boundedaffineimage1.cc was added on branch
+	  simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxdifference1.cc (simplex.1): file boxdifference1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxhull.cc (simplex.1): file boxhull.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (simplex.1): file boxhull1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/cc76narrowing1.cc (simplex.1): file cc76narrowing1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/cc76widening.cc (simplex.1): file cc76widening.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/closure1.cc (simplex.1): file closure1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/concatenate1.cc (simplex.1): file concatenate1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/congruences1.cc (simplex.1): file congruences1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/constraints1.cc, Grid/constraints1.cc
+	  (simplex.[1,1]): file constraints1.cc was added on branch simplex
+	  on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/contains1.cc (simplex.1): file contains1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/containsintegerpoint1.cc,
+	  Grid/containsintegerpoint1.cc (simplex.[1,1]): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/discrete1.cc (simplex.1): file discrete1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/disjoint1.cc (simplex.1): file disjoint1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/empty1.cc (simplex.1): file empty1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/equality1.cc (simplex.1): file equality1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/expandspacedim1.cc (simplex.1): file expandspacedim1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/foldspacedims1.cc (simplex.1): file foldspacedims1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Box/frombdshape1.cc, Grid/frombdshape1.cc
+	  (simplex.[1,1]): file frombdshape1.cc was added on branch simplex
+	  on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frombox1.cc (simplex.1): file frombox1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/fromgensys1.cc (simplex.1): file fromgensys1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/fromgrid1.cc (simplex.1): file fromgrid1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompartiallyreducedproduct1.cc (simplex.1): file
+	  frompartiallyreducedproduct1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (simplex.1): file frompolyhedron1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron2.cc (simplex.1): file frompolyhedron2.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/fromspacedim1.cc (simplex.1): file fromspacedim1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffineimage1.cc (simplex.1): file
+	  generalizedaffineimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/generalizedaffinepreimage1.cc (simplex.1): file
+	  generalizedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/geomcovers1.cc (simplex.1): file geomcovers1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/intersection1.cc (simplex.1): file intersection1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (simplex.1): file interval1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval2.cc (simplex.1): file interval2.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/mapspacedims1.cc (simplex.1): file mapspacedims1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (simplex.1): file max_min1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/maxspacedim1.cc (simplex.1): file maxspacedim1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/membytes1.cc (simplex.1): file membytes1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/minconstraints1.cc (simplex.1): file minconstraints1.cc
+	  was added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/pointsetpowerset1.cc (simplex.1): file
+	  pointsetpowerset1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (simplex.1): file refine1.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (simplex.1): file refine2.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine3.cc (simplex.1): file refine3.cc was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations1.cc (simplex.1): file relations1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/relations2.cc (simplex.1): file relations2.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/removespacedims1.cc (simplex.1): file
+	  removespacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/run_tests (simplex.1): file run_tests was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/timeelapse1.cc (simplex.1): file timeelapse1.cc was
+	  added on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/universe1.cc (simplex.1): file universe1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/writebox1.cc (simplex.1): file writebox1.cc was added
+	  on branch simplex on 2008-01-07 11:15:36 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (simplex.1): file Makefile.am was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (simplex.1): file append1.cc was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffineimage1.cc (simplex.1): file
+	  boundedaffineimage1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffinepreimage1.cc (simplex.1): file
+	  boundedaffinepreimage1.cc was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundingbox1.cc (simplex.1): file boundingbox1.cc
+	  was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounds1.cc (simplex.1): file bounds1.cc was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (simplex.1): file
+	  containsintegerpoint1.cc was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/discrete1.cc (simplex.1): file discrete1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (simplex.1): file disjoint1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/expandspacedim1.cc (simplex.1): file
+	  expandspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/foldspacedims1.cc (simplex.1): file
+	  foldspacedims1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromgrid1.cc (simplex.1): file fromgrid1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromoctagonalshape1.cc (simplex.1): file
+	  fromoctagonalshape1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromspacedim1.cc (simplex.1): file
+	  fromspacedim1.cc was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min1.cc (simplex.1): file max_min1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (simplex.1): file max_min2.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (simplex.1): file maxspacedim1.cc
+	  was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/membytes1.cc (simplex.1): file membytes1.cc was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (simplex.1): file FCAIBVP.cc was added on branch
+	  simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (simplex.1): file FCAIBVP.defs.hh was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (simplex.1): file FCAIBVP.inlines.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (simplex.1): file FCAIBVP.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (simplex.1): file Variables_Set.defs.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (simplex.1): file
+	  Variables_Set.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (simplex.1): file
+	  Variables_Set.types.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assign_or_swap.hh (simplex.1): file assign_or_swap.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.defs.hh (simplex.1): file distances.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.inlines.hh (simplex.1): file distances.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.types.hh (simplex.1): file distances.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (simplex.1): file
+	  iterator_to_const.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (simplex.1): file
+	  iterator_to_const.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (simplex.1): file
+	  iterator_to_const.types.hh was added on branch simplex on
+	  2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (simplex.1): file meta_programming.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.cc (simplex.1): file mp_std_bits.cc was added on
+	  branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.defs.hh (simplex.1): file mp_std_bits.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:35 +0000
+
+2008-01-01 Tuesday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_std_bits.inlines.hh (simplex.1): file
+	  mp_std_bits.inlines.hh was added on branch simplex on 2008-01-07
+	  11:15:35 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (simplex.1): file Any_Pointset.defs.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (simplex.1): file
+	  Any_Pointset.inlines.hh was added on branch simplex on 2008-01-07
+	  11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (simplex.1): file Any_Pointset.types.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (simplex.1): file Ask_Tell.templates.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc (simplex.1): file Bit_Matrix.cc was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh (simplex.1): file Bit_Matrix.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.inlines.hh (simplex.1): file Bit_Matrix.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.types.hh (simplex.1): file Bit_Matrix.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (simplex.1): file Bit_Row.cc was added on branch
+	  simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (simplex.1): file Bit_Row.defs.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (simplex.1): file Bit_Row.inlines.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.types.hh (simplex.1): file Bit_Row.types.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (simplex.1): file Boundary.defs.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.cc (simplex.1): file Box.cc was added on branch simplex
+	  on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (simplex.1): file Box.defs.hh was added on branch
+	  simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (simplex.1): file Box.inlines.hh was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (simplex.1): file Box.templates.hh was added
+	  on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.types.hh (simplex.1): file Box.types.hh was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Integer.hh (simplex.1): file C_Integer.hh was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Has_Assign_Or_Swap.hh (simplex.1): file Has_Assign_Or_Swap.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.templates.hh (simplex.1): file Interval.templates.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh (simplex.1): file Interval_Info.defs.hh
+	  was added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh (simplex.1): file
+	  Interval_Info.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.types.hh (simplex.1): file
+	  Interval_Info.types.hh was added on branch simplex on 2008-01-07
+	  11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Restriction.defs.hh (simplex.1): file
+	  Interval_Restriction.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (simplex.1): file MIP_Problem.cc was added on
+	  branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (simplex.1): file MIP_Problem.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:32 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (simplex.1): file
+	  MIP_Problem.inlines.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (simplex.1): file
+	  MIP_Problem.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (simplex.1): file MIP_Problem.types.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (simplex.1): file OR_Matrix.defs.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (simplex.1): file OR_Matrix.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (simplex.1): file
+	  OR_Matrix.templates.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.types.hh (simplex.1): file OR_Matrix.types.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.cc (simplex.1): file Octagonal_Shape.cc was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (simplex.1): file
+	  Octagonal_Shape.defs.hh was added on branch simplex on 2008-01-07
+	  11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (simplex.1): file
+	  Octagonal_Shape.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (simplex.1): file
+	  Octagonal_Shape.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.types.hh (simplex.1): file
+	  Octagonal_Shape.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (simplex.1): file Og_Status.idefs.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh (simplex.1): file Og_Status.inlines.hh
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (simplex.1): file
+	  Partially_Reduced_Product.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.inlines.hh (simplex.1): file
+	  Partially_Reduced_Product.inlines.hh was added on branch simplex
+	  on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (simplex.1): file
+	  Partially_Reduced_Product.templates.hh was added on branch
+	  simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.types.hh (simplex.1): file
+	  Partially_Reduced_Product.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (simplex.1): file Pointset_Ask_Tell.cc
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (simplex.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (simplex.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (simplex.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (simplex.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (simplex.1): file Pointset_Powerset.cc
+	  was added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (simplex.1): file
+	  Pointset_Powerset.defs.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (simplex.1): file
+	  Pointset_Powerset.inlines.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (simplex.1): file
+	  Pointset_Powerset.templates.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (simplex.1): file
+	  Pointset_Powerset.types.hh was added on branch simplex on
+	  2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Box.hh (simplex.1): file Rational_Box.hh was added
+	  on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Slow_Copy.hh (simplex.1): file Slow_Copy.hh was added on
+	  branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.defs.hh (simplex.1): file Temp.defs.hh was added on
+	  branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.inlines.hh (simplex.1): file Temp.inlines.hh was added
+	  on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.templates.hh (simplex.1): file Temp.templates.hh was
+	  added on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (simplex.1): file Variables_Set.cc was added
+	  on branch simplex on 2008-01-07 11:15:34 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_proper_long_double.m4 (simplex.1): file
+	  ac_cxx_proper_long_double.m4 was added on branch simplex on
+	  2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_remainder_bug.m4 (simplex.1): file
+	  ac_cxx_remainder_bug.m4 was added on branch simplex on 2008-01-07
+	  11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_jar.m4 (simplex.1): file ac_prog_jar.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_java.m4 (simplex.1): file ac_prog_java.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javac.m4 (simplex.1): file ac_prog_javac.m4 was added
+	  on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javah.m4 (simplex.1): file ac_prog_javah.m4 was added
+	  on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl_c.m4 (simplex.1): file ppl_c.m4 was added on branch
+	  simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (simplex.1): file ppl_interface_generator_predicate_check_code.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (simplex.1): file ppl_interface_generator_predicate_check_pl.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (simplex.1): file ppl_interface_generator_yap_cc.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (simplex.1): file ppl_predicate_check_common.pl was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.hh (simplex.1): file yap_cfli.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (simplex.1): file ppl_interface_generator_swiprolog_cc.m4 was
+	  added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (simplex.1): file ppl_interface_generator_xsb_H.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (simplex.1): file ppl_interface_generator_xsb_cc.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (simplex.1): file
+	  ppl_interface_generator_xsb_predicate_check_P.m4 was added on
+	  branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (simplex.1): file swi_cfli.hh
+	  was added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_predicate_check.pl (simplex.1): file
+	  swi_predicate_check.pl was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (simplex.1): file xsb_cfli.hh
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (simplex.1): file
+	  gprolog_cfli.hh was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (simplex.1): file ppl_interface_generator_gprolog_pl.m4 was added
+	  on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (simplex.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+	  added on branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_predicate_check.pl (simplex.1): file
+	  sp_predicate_check.pl was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (simplex.1): file
+	  ciao_cfli.hh was added on branch simplex on 2008-01-07 11:15:30
+	  +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (simplex.1): file ppl_interface_generator_ciao_pl.m4 was added on
+	  branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (simplex.1): file
+	  ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+	  branch simplex on 2008-01-07 11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (simplex.1): file ppl_interface_generator_prolog_dat.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (simplex.1): file ppl_interface_generator_prolog_icc.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (simplex.1): file ppl_interface_generator_prolog_systems.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (simplex.1): file
+	  ppl_prolog_common.icc was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (simplex.1): file
+	  C_Polyhedron_test1.java was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Test_Partial_Function.java (simplex.1):
+	  file Test_Partial_Function.java was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (simplex.1): file ppl_interface_generator_java_test_java.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (simplex.1): file ppl_interface_generator_java_test_java_code.m4
+	  was added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (simplex.1):
+	  file ppl_interface_generator_ocaml_cc.m4 was added on branch
+	  simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_cc_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_dat.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (simplex.1):
+	  file ppl_interface_generator_ocaml_ml.m4 was added on branch
+	  simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_ml_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_mli.m4 was added
+	  on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (simplex.1): file ppl_interface_generator_ocaml_mli_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (simplex.1): file
+	  ppl_ocaml_globals.cc was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.ml (simplex.1): file
+	  ppl_ocaml_globals.ml was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_types.ml (simplex.1): file
+	  ppl_ocaml_types.ml was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/test1.ml (simplex.1): file test1.ml was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (simplex.1): file C_interface.dox
+	  was added on branch simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (simplex.1): file Makefile.am was
+	  added on branch simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: jni/Makefile.am, tests/Makefile.am
+	  (simplex.[1,1]): file Makefile.am was added on branch simplex on
+	  2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (simplex.1): file
+	  ppl_c_version.h.in was added on branch simplex on 2008-01-07
+	  11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (simplex.1): file
+	  ppl_interface_generator_c_cc.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (simplex.1):
+	  file ppl_interface_generator_c_cc_code.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (simplex.1):
+	  file ppl_interface_generator_c_cc_preamble was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (simplex.1): file
+	  ppl_interface_generator_c_dat.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (simplex.1): file
+	  ppl_interface_generator_c_h.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (simplex.1):
+	  file ppl_interface_generator_c_h_code.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (simplex.1):
+	  file ppl_interface_generator_c_h_preamble was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (simplex.1): file
+	  ppl_interface_generator_common.m4 was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (simplex.1):
+	  file ppl_interface_generator_common_dat.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_copyright (simplex.1): file
+	  ppl_interface_generator_copyright was added on branch simplex on
+	  2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (simplex.1):
+	  file ppl_interface_generator_java_dat.m4 was added on branch
+	  simplex on 2008-01-07 11:15:28 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+	  branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (simplex.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (simplex.1): file
+	  ppl_java_common.cc was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (simplex.1): file
+	  ppl_java_common.hh was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc (simplex.1): file
+	  ppl_java_globals.cc was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.tex (simplex.1): file
+	  devref-c-interface.tex was added on branch simplex on 2008-01-07
+	  11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (simplex.1): file
+	  ppl-config_extra_man_text was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (simplex.1): file
+	  ppl_lcdd_extra_man_text was added on branch simplex on 2008-01-07
+	  11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (simplex.1): file
+	  ppl_lpsol_extra_man_text was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.tex (simplex.1): file user-c-interface.tex
+	  was added on branch simplex on 2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.tex (simplex.1): file
+	  user-prolog-interface.tex was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: doc/Makefile.am, m4/Makefile.am (simplex.[1,1]): file
+	  Makefile.am was added on branch simplex on 2008-01-07 11:15:25
+	  +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/README.doc (simplex.1): file README.doc was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.tex (simplex.1): file devref.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/pwl.sty (simplex.1): file pwl.sty was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.tex (simplex.1): file user.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2008-01-01 Tuesday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.44), README (1.52), README.configure (1.24),
+	  configure.ac (1.300), instchk.hh (1.10), Watchdog/Makefile.am
+	  (1.33), Watchdog/README (1.17), Watchdog/configure.ac (1.43),
+	  Watchdog/doc/Makefile.am (1.4), Watchdog/doc/README.doc (1.3),
+	  Watchdog/doc/devref.tex (1.4), Watchdog/doc/pwl.sty (1.3),
+	  Watchdog/doc/user.tex (1.4), Watchdog/m4/Makefile.am (1.3),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.5),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.5),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.4),
+	  Watchdog/src/EList.defs.hh (1.7), Watchdog/src/EList.inlines.hh
+	  (1.5), Watchdog/src/EList.types.hh (1.4),
+	  Watchdog/src/EList_Iterator.defs.hh (1.5),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.5),
+	  Watchdog/src/EList_Iterator.types.hh (1.4),
+	  Watchdog/src/Handler.defs.hh (1.6),
+	  Watchdog/src/Handler.inlines.hh (1.5),
+	  Watchdog/src/Handler.types.hh (1.4), Watchdog/src/Makefile.am
+	  (1.13), Watchdog/src/Pending_Element.cc (1.6),
+	  Watchdog/src/Pending_Element.defs.hh (1.6),
+	  Watchdog/src/Pending_Element.inlines.hh (1.5),
+	  Watchdog/src/Pending_Element.types.hh (1.4),
+	  Watchdog/src/Pending_List.cc (1.6),
+	  Watchdog/src/Pending_List.defs.hh (1.6),
+	  Watchdog/src/Pending_List.inlines.hh (1.5),
+	  Watchdog/src/Pending_List.types.hh (1.4), Watchdog/src/Time.cc
+	  (1.6), Watchdog/src/Time.defs.hh (1.6),
+	  Watchdog/src/Time.inlines.hh (1.5), Watchdog/src/Time.types.hh
+	  (1.4), Watchdog/src/Watchdog.cc (1.8),
+	  Watchdog/src/Watchdog.defs.hh (1.8),
+	  Watchdog/src/Watchdog.inlines.hh (1.5),
+	  Watchdog/src/Watchdog.types.hh (1.4), Watchdog/src/pwl_header.hh
+	  (1.6), Watchdog/utils/Makefile.am (1.9),
+	  Watchdog/utils/build_header.in (1.6), debian/Makefile.am (1.5),
+	  debian/libppl-pwl.copyright.in (1.6), debian/libppl.copyright.in
+	  (1.6), demos/Makefile.am (1.12), demos/ppl_lcdd/Makefile.am
+	  (1.29), demos/ppl_lcdd/ppl_lcdd.cc (1.61),
+	  demos/ppl_lcdd/examples/Makefile.am (1.10),
+	  demos/ppl_lpsol/Makefile.am (1.44), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.76), demos/ppl_lpsol/examples/Makefile.am (1.11),
+	  doc/Makefile.am (1.56), doc/README.doc (1.13),
+	  doc/definitions.dox (1.206), doc/devref-c-interface.tex (1.3),
+	  doc/devref.tex (1.24), doc/ppl-config.1 (1.6),
+	  doc/ppl-config_extra_man_text (1.3), doc/ppl.sty (1.28),
+	  doc/ppl_lcdd.1 (1.4), doc/ppl_lcdd_extra_man_text (1.3),
+	  doc/ppl_lpsol.1 (1.4), doc/ppl_lpsol_extra_man_text (1.3),
+	  doc/user-c-interface.tex (1.3), doc/user-prolog-interface.tex
+	  (1.3), doc/user.tex (1.25), fedora/Makefile.am (1.2),
+	  interfaces/Makefile.am (1.28),
+	  interfaces/ppl_interface_generator_common.m4 (1.19),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.32),
+	  interfaces/ppl_interface_generator_copyright (1.5),
+	  interfaces/C/C_interface.dox (1.3), interfaces/C/Makefile.am
+	  (1.37), interfaces/C/ppl_c.h.in (1.74),
+	  interfaces/C/ppl_c_version.h.in (1.7),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.9),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.19),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.13),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.9),
+	  interfaces/Java/Makefile.am (1.14),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.12),
+	  interfaces/Java/jni/Makefile.am (1.15),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.10),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.34), interfaces/Java/jni/ppl_java_common.cc (1.37),
+	  interfaces/Java/jni/ppl_java_common.hh (1.31),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.9),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.13),
+	  interfaces/Java/tests/Makefile.am (1.17),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.4),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.11),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.24), interfaces/OCaml/Makefile.am (1.34),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.5),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.17),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.10),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.14),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.8),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.8),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.12),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.8),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.11),
+	  interfaces/OCaml/test1.ml (1.31), interfaces/Prolog/Makefile.am
+	  (1.43), interfaces/Prolog/Prolog_interface.dox (1.161),
+	  interfaces/Prolog/exceptions.hh (1.26),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.35),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.12),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.50),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.11), interfaces/Prolog/ppl_prolog_common.icc (1.13),
+	  interfaces/Prolog/track_allocation.hh (1.24),
+	  interfaces/Prolog/Ciao/Makefile.am (1.67),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.5),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.20),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.16),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.27),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.52),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.7),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.6), interfaces/Prolog/GNU/Makefile.am (1.67),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.12),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.13),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.8),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.45),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.7), interfaces/Prolog/SICStus/Makefile.am (1.79),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.11), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.29),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.9),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.11),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.19),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.20),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.14),
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl (1.4),
+	  interfaces/Prolog/SWI/Makefile.am (1.77),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.14),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.12),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.14), interfaces/Prolog/SWI/ppl_pl.cc (1.14),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.9),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.8),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.11),
+	  interfaces/Prolog/SWI/swi_predicate_check.pl (1.4),
+	  interfaces/Prolog/XSB/Makefile.am (1.56),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.8),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.10),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.6), interfaces/Prolog/XSB/xsb_cfli.hh (1.5),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.19),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.17),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.31),
+	  interfaces/Prolog/YAP/Makefile.am (1.56),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.8),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.13),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.5),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.14),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.10),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.14),
+	  interfaces/Prolog/tests/Makefile.am (1.17),
+	  interfaces/Prolog/tests/clpq.pl (1.11),
+	  interfaces/Prolog/tests/clpq2.pl (1.13),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.4),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.6),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.6),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.4),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.4),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.4),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.4),
+	  interfaces/Prolog/tests/pl_check.pl (1.53),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.6),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.52),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.28), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.5), m4/Makefile.am (1.29), m4/ac_check_fpu_control.m4 (1.6),
+	  m4/ac_check_gmp.m4 (1.26), m4/ac_check_sicstus_prolog.m4 (1.8),
+	  m4/ac_check_swi_prolog.m4 (1.14), m4/ac_check_xsb_prolog.m4
+	  (1.5), m4/ac_cxx_attribute_weak.m4 (1.10),
+	  m4/ac_cxx_double_binary_format.m4 (1.7),
+	  m4/ac_cxx_flexible_arrays.m4 (1.15),
+	  m4/ac_cxx_float_binary_format.m4 (1.6),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.7),
+	  m4/ac_cxx_proper_long_double.m4 (1.3), m4/ac_cxx_remainder_bug.m4
+	  (1.3), m4/ac_prog_jar.m4 (1.3), m4/ac_prog_java.m4 (1.6),
+	  m4/ac_prog_javac.m4 (1.7), m4/ac_prog_javah.m4 (1.9),
+	  m4/ac_text_md5sum.m4 (1.4), m4/ppl.m4 (1.9), m4/ppl_c.m4 (1.2),
+	  src/Any_Pointset.defs.hh (1.17), src/Any_Pointset.inlines.hh
+	  (1.4), src/Any_Pointset.types.hh (1.3), src/Ask_Tell.defs.hh
+	  (1.19), src/Ask_Tell.inlines.hh (1.18), src/Ask_Tell.templates.hh
+	  (1.10), src/Ask_Tell.types.hh (1.7), src/BDS_Status.idefs.hh
+	  (1.22), src/BDS_Status.inlines.hh (1.18), src/BD_Shape.cc (1.9),
+	  src/BD_Shape.defs.hh (1.109), src/BD_Shape.inlines.hh (1.155),
+	  src/BD_Shape.templates.hh (1.90), src/BD_Shape.types.hh (1.7),
+	  src/BHRZ03_Certificate.cc (1.14), src/BHRZ03_Certificate.defs.hh
+	  (1.19), src/BHRZ03_Certificate.inlines.hh (1.10),
+	  src/BHRZ03_Certificate.types.hh (1.6), src/Bit_Matrix.cc (1.5),
+	  src/Bit_Matrix.defs.hh (1.5), src/Bit_Matrix.inlines.hh (1.4),
+	  src/Bit_Matrix.types.hh (1.3), src/Bit_Row.cc (1.5),
+	  src/Bit_Row.defs.hh (1.9), src/Bit_Row.inlines.hh (1.6),
+	  src/Bit_Row.types.hh (1.3), src/Boundary.defs.hh (1.10),
+	  src/Box.cc (1.10), src/Box.defs.hh (1.34), src/Box.inlines.hh
+	  (1.23), src/Box.templates.hh (1.74), src/Box.types.hh (1.4),
+	  src/C_Integer.hh (1.6), src/C_Polyhedron.cc (1.24),
+	  src/C_Polyhedron.defs.hh (1.53), src/C_Polyhedron.inlines.hh
+	  (1.39), src/C_Polyhedron.types.hh (1.12), src/Checked_Number.cc
+	  (1.14), src/Checked_Number.defs.hh (1.96),
+	  src/Checked_Number.inlines.hh (1.78), src/Checked_Number.types.hh
+	  (1.11), src/Coefficient.cc (1.9), src/Coefficient.defs.hh (1.11),
+	  src/Coefficient.inlines.hh (1.10), src/Coefficient.types.hh
+	  (1.16), src/Coefficient_traits_template.hh (1.9),
+	  src/Congruence.cc (1.19), src/Congruence.defs.hh (1.23),
+	  src/Congruence.inlines.hh (1.19), src/Congruence.types.hh (1.4),
+	  src/Congruence_System.cc (1.28), src/Congruence_System.defs.hh
+	  (1.26), src/Congruence_System.inlines.hh (1.11),
+	  src/Congruence_System.types.hh (1.4), src/Constraint.cc (1.70),
+	  src/Constraint.defs.hh (1.128), src/Constraint.inlines.hh (1.69),
+	  src/Constraint.types.hh (1.12), src/Constraint_System.cc (1.29),
+	  src/Constraint_System.defs.hh (1.40),
+	  src/Constraint_System.inlines.hh (1.12),
+	  src/Constraint_System.types.hh (1.6), src/DB_Matrix.defs.hh
+	  (1.30), src/DB_Matrix.inlines.hh (1.34),
+	  src/DB_Matrix.templates.hh (1.8), src/DB_Matrix.types.hh (1.7),
+	  src/DB_Row.defs.hh (1.26), src/DB_Row.inlines.hh (1.24),
+	  src/DB_Row.templates.hh (1.8), src/DB_Row.types.hh (1.9),
+	  src/Determinate.defs.hh (1.68), src/Determinate.inlines.hh
+	  (1.58), src/Determinate.types.hh (1.11), src/Float.cc (1.8),
+	  src/Float.defs.hh (1.27), src/Float.inlines.hh (1.32),
+	  src/GMP_Integer.defs.hh (1.28), src/GMP_Integer.inlines.hh
+	  (1.23), src/GMP_Integer.types.hh (1.17), src/Generator.cc (1.77),
+	  src/Generator.defs.hh (1.125), src/Generator.inlines.hh (1.63),
+	  src/Generator.types.hh (1.12), src/Generator_System.cc (1.26),
+	  src/Generator_System.defs.hh (1.27),
+	  src/Generator_System.inlines.hh (1.11),
+	  src/Generator_System.types.hh (1.6), src/Grid.defs.hh (1.63),
+	  src/Grid.inlines.hh (1.22), src/Grid.templates.hh (1.33),
+	  src/Grid.types.hh (1.4), src/Grid_Certificate.cc (1.11),
+	  src/Grid_Certificate.defs.hh (1.7),
+	  src/Grid_Certificate.inlines.hh (1.5),
+	  src/Grid_Certificate.types.hh (1.4), src/Grid_Generator.cc
+	  (1.23), src/Grid_Generator.defs.hh (1.33),
+	  src/Grid_Generator.inlines.hh (1.16), src/Grid_Generator.types.hh
+	  (1.4), src/Grid_Generator_System.cc (1.21),
+	  src/Grid_Generator_System.defs.hh (1.29),
+	  src/Grid_Generator_System.inlines.hh (1.17),
+	  src/Grid_Generator_System.types.hh (1.4), src/Grid_Status.cc
+	  (1.9), src/Grid_Status.idefs.hh (1.8), src/Grid_Status.inlines.hh
+	  (1.5), src/Grid_chdims.cc (1.21), src/Grid_conversion.cc (1.23),
+	  src/Grid_nonpublic.cc (1.32), src/Grid_public.cc (1.63),
+	  src/Grid_simplify.cc (1.37), src/Grid_widenings.cc (1.17),
+	  src/H79_Certificate.cc (1.13), src/H79_Certificate.defs.hh
+	  (1.17), src/H79_Certificate.inlines.hh (1.11),
+	  src/H79_Certificate.types.hh (1.6), src/Has_Assign_Or_Swap.hh
+	  (1.3), src/Init.cc (1.33), src/Init.defs.hh (1.20),
+	  src/Init.types.hh (1.11), src/Interval.defs.hh (1.50),
+	  src/Interval.inlines.hh (1.29), src/Interval.templates.hh (1.4),
+	  src/Interval.types.hh (1.14), src/Interval_Info.defs.hh (1.6),
+	  src/Interval_Info.inlines.hh (1.7), src/Interval_Info.types.hh
+	  (1.4), src/Interval_Restriction.defs.hh (1.11),
+	  src/Linear_Expression.cc (1.20), src/Linear_Expression.defs.hh
+	  (1.38), src/Linear_Expression.inlines.hh (1.13),
+	  src/Linear_Expression.types.hh (1.6), src/Linear_Row.cc (1.25),
+	  src/Linear_Row.defs.hh (1.26), src/Linear_Row.inlines.hh (1.14),
+	  src/Linear_Row.types.hh (1.6), src/Linear_System.cc (1.47),
+	  src/Linear_System.defs.hh (1.33), src/Linear_System.inlines.hh
+	  (1.24), src/Linear_System.types.hh (1.6), src/MIP_Problem.cc
+	  (1.65), src/MIP_Problem.defs.hh (1.37),
+	  src/MIP_Problem.inlines.hh (1.17), src/MIP_Problem.templates.hh
+	  (1.12), src/MIP_Problem.types.hh (1.3), src/Makefile.am (1.176),
+	  src/Matrix.cc (1.98), src/Matrix.defs.hh (1.84),
+	  src/Matrix.inlines.hh (1.53), src/Matrix.types.hh (1.12),
+	  src/NNC_Polyhedron.cc (1.24), src/NNC_Polyhedron.defs.hh (1.54),
+	  src/NNC_Polyhedron.inlines.hh (1.40), src/NNC_Polyhedron.types.hh
+	  (1.12), src/Numeric_Format.defs.hh (1.8), src/OR_Matrix.defs.hh
+	  (1.14), src/OR_Matrix.inlines.hh (1.10),
+	  src/OR_Matrix.templates.hh (1.7), src/OR_Matrix.types.hh (1.4),
+	  src/Octagonal_Shape.cc (1.8), src/Octagonal_Shape.defs.hh (1.37),
+	  src/Octagonal_Shape.inlines.hh (1.26),
+	  src/Octagonal_Shape.templates.hh (1.64),
+	  src/Octagonal_Shape.types.hh (1.4), src/Og_Status.idefs.hh (1.8),
+	  src/Og_Status.inlines.hh (1.6),
+	  src/Partially_Reduced_Product.defs.hh (1.19),
+	  src/Partially_Reduced_Product.inlines.hh (1.17),
+	  src/Partially_Reduced_Product.templates.hh (1.8),
+	  src/Partially_Reduced_Product.types.hh (1.3), src/Ph_Status.cc
+	  (1.15), src/Ph_Status.idefs.hh (1.22), src/Ph_Status.inlines.hh
+	  (1.10), src/Pointset_Ask_Tell.cc (1.8),
+	  src/Pointset_Ask_Tell.defs.hh (1.14),
+	  src/Pointset_Ask_Tell.inlines.hh (1.7),
+	  src/Pointset_Ask_Tell.templates.hh (1.12),
+	  src/Pointset_Ask_Tell.types.hh (1.4), src/Pointset_Powerset.cc
+	  (1.16), src/Pointset_Powerset.defs.hh (1.22),
+	  src/Pointset_Powerset.inlines.hh (1.10),
+	  src/Pointset_Powerset.templates.hh (1.17),
+	  src/Pointset_Powerset.types.hh (1.3), src/Poly_Con_Relation.cc
+	  (1.17), src/Poly_Con_Relation.defs.hh (1.36),
+	  src/Poly_Con_Relation.inlines.hh (1.17),
+	  src/Poly_Con_Relation.types.hh (1.11), src/Poly_Gen_Relation.cc
+	  (1.17), src/Poly_Gen_Relation.defs.hh (1.34),
+	  src/Poly_Gen_Relation.inlines.hh (1.17),
+	  src/Poly_Gen_Relation.types.hh (1.11), src/Polyhedron.defs.hh
+	  (1.329), src/Polyhedron.inlines.hh (1.145),
+	  src/Polyhedron.templates.hh (1.16), src/Polyhedron.types.hh
+	  (1.18), src/Polyhedron_chdims.cc (1.45),
+	  src/Polyhedron_nonpublic.cc (1.82), src/Polyhedron_public.cc
+	  (1.106), src/Polyhedron_widenings.cc (1.65), src/Powerset.defs.hh
+	  (1.31), src/Powerset.inlines.hh (1.21), src/Powerset.templates.hh
+	  (1.6), src/Powerset.types.hh (1.7), src/Ptr_Iterator.defs.hh
+	  (1.12), src/Ptr_Iterator.inlines.hh (1.9),
+	  src/Ptr_Iterator.types.hh (1.7), src/Rational_Box.hh (1.7),
+	  src/Result.defs.hh (1.20), src/Result.inlines.hh (1.12),
+	  src/Rounding_Dir.defs.hh (1.14), src/Rounding_Dir.inlines.hh
+	  (1.8), src/Row.cc (1.105), src/Row.defs.hh (1.113),
+	  src/Row.inlines.hh (1.67), src/Row.types.hh (1.13),
+	  src/Scalar_Products.cc (1.10), src/Scalar_Products.defs.hh
+	  (1.11), src/Scalar_Products.inlines.hh (1.7),
+	  src/Scalar_Products.types.hh (1.5), src/Slow_Copy.hh (1.3),
+	  src/Temp.defs.hh (1.8), src/Temp.inlines.hh (1.4),
+	  src/Temp.templates.hh (1.3), src/Topology.hh (1.15),
+	  src/Variable.cc (1.25), src/Variable.defs.hh (1.55),
+	  src/Variable.inlines.hh (1.26), src/Variable.types.hh (1.12),
+	  src/Variables_Set.cc (1.7), src/Variables_Set.defs.hh (1.8),
+	  src/Variables_Set.inlines.hh (1.6), src/Variables_Set.types.hh
+	  (1.3), src/Widening_Function.defs.hh (1.19),
+	  src/Widening_Function.inlines.hh (1.16),
+	  src/Widening_Function.types.hh (1.7), src/algorithms.hh (1.50),
+	  src/assign_or_swap.hh (1.2), src/checked.cc (1.22),
+	  src/checked.defs.hh (1.44), src/checked.inlines.hh (1.41),
+	  src/checked_ext.defs.hh (1.15), src/checked_ext.inlines.hh
+	  (1.41), src/checked_float.inlines.hh (1.83),
+	  src/checked_int.inlines.hh (1.65), src/checked_mpq.inlines.hh
+	  (1.44), src/checked_mpz.inlines.hh (1.51),
+	  src/checked_numeric_limits.hh (1.22), src/compiler.hh (1.12),
+	  src/conversion.cc (1.85), src/distances.defs.hh (1.5),
+	  src/distances.inlines.hh (1.6), src/distances.types.hh (1.4),
+	  src/fpu-c99.inlines.hh (1.16), src/fpu-ia32.inlines.hh (1.18),
+	  src/fpu-none.inlines.hh (1.8), src/fpu-sparc.inlines.hh (1.10),
+	  src/fpu.defs.hh (1.17), src/fpu.types.hh (1.6), src/globals.cc
+	  (1.32), src/globals.defs.hh (1.52), src/globals.inlines.hh
+	  (1.20), src/globals.types.hh (1.12), src/initializer.hh (1.16),
+	  src/iterator_to_const.defs.hh (1.7),
+	  src/iterator_to_const.inlines.hh (1.5),
+	  src/iterator_to_const.types.hh (1.3), src/max_space_dimension.hh
+	  (1.14), src/meta_programming.hh (1.9), src/minimize.cc (1.49),
+	  src/mp_std_bits.cc (1.6), src/mp_std_bits.defs.hh (1.6),
+	  src/mp_std_bits.inlines.hh (1.5), src/namespaces.hh (1.13),
+	  src/ppl-config.cc.in (1.23), src/ppl_header.hh (1.8),
+	  src/simplify.cc (1.50), src/swapping_sort.icc (1.14),
+	  src/version.cc (1.11), src/version.hh.in (1.17), tests/FCAIBVP.cc
+	  (1.6), tests/FCAIBVP.defs.hh (1.6), tests/FCAIBVP.inlines.hh
+	  (1.6), tests/FCAIBVP.types.hh (1.3), tests/Makefile.am (1.264),
+	  tests/Partial_Function.cc (1.7), tests/Partial_Function.defs.hh
+	  (1.5), tests/Partial_Function.inlines.hh (1.4),
+	  tests/Partial_Function.types.hh (1.3),
+	  tests/Random_Number_Generator.defs.hh (1.6),
+	  tests/Random_Number_Generator.inlines.hh (1.11),
+	  tests/Random_Number_Generator.types.hh (1.4), tests/files.cc
+	  (1.12), tests/files.hh (1.12), tests/ppl_test.cc (1.12),
+	  tests/ppl_test.hh (1.68), tests/print.cc (1.29), tests/print.hh
+	  (1.45), tests/Ask_Tell/Makefile.am (1.5),
+	  tests/Ask_Tell/append1.cc (1.7), tests/BD_Shape/Makefile.am
+	  (1.70), tests/BD_Shape/addconstraints1.cc (1.19),
+	  tests/BD_Shape/addspacedims1.cc (1.16),
+	  tests/BD_Shape/affinedimension1.cc (1.13),
+	  tests/BD_Shape/affineimage1.cc (1.20),
+	  tests/BD_Shape/affineimage2.cc (1.14),
+	  tests/BD_Shape/affinepreimage1.cc (1.22),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.16),
+	  tests/BD_Shape/bdsdifference1.cc (1.16),
+	  tests/BD_Shape/bdshull1.cc (1.17),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.11),
+	  tests/BD_Shape/bhmz05widening1.cc (1.16),
+	  tests/BD_Shape/bhz03widening1.cc (1.11),
+	  tests/BD_Shape/bounded1.cc (1.4),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.5),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.4),
+	  tests/BD_Shape/boundingbox1.cc (1.2), tests/BD_Shape/bounds1.cc
+	  (1.4), tests/BD_Shape/cc76extrapolation1.cc (1.20),
+	  tests/BD_Shape/cc76narrowing1.cc (1.19),
+	  tests/BD_Shape/closure1.cc (1.21), tests/BD_Shape/concatenate1.cc
+	  (1.15), tests/BD_Shape/constraints1.cc (1.20),
+	  tests/BD_Shape/contains1.cc (1.16),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.4),
+	  tests/BD_Shape/discrete1.cc (1.4), tests/BD_Shape/disjoint1.cc
+	  (1.7), tests/BD_Shape/empty1.cc (1.12),
+	  tests/BD_Shape/equality1.cc (1.17),
+	  tests/BD_Shape/expandspacedim1.cc (1.5),
+	  tests/BD_Shape/foldspacedims1.cc (1.7),
+	  tests/BD_Shape/fromgensys1.cc (1.16), tests/BD_Shape/fromgrid1.cc
+	  (1.3), tests/BD_Shape/fromoctagonalshape1.cc (1.2),
+	  tests/BD_Shape/frompolyhedron1.cc (1.6),
+	  tests/BD_Shape/fromspacedim1.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.18),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.22),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.16),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.17),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.7),
+	  tests/BD_Shape/geomcovers1.cc (1.11),
+	  tests/BD_Shape/h79widening1.cc (1.14),
+	  tests/BD_Shape/intersection1.cc (1.19),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.15),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.16),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.15),
+	  tests/BD_Shape/mapspacedims1.cc (1.16),
+	  tests/BD_Shape/max_min1.cc (1.4), tests/BD_Shape/max_min2.cc
+	  (1.6), tests/BD_Shape/maxspacedim1.cc (1.5),
+	  tests/BD_Shape/membytes1.cc (1.4),
+	  tests/BD_Shape/minconstraints1.cc (1.12),
+	  tests/BD_Shape/relations1.cc (1.19), tests/BD_Shape/relations2.cc
+	  (1.23), tests/BD_Shape/relations3.cc (1.27),
+	  tests/BD_Shape/removespacedims1.cc (1.21),
+	  tests/BD_Shape/run_tests (1.20), tests/BD_Shape/timeelapse1.cc
+	  (1.21), tests/BD_Shape/universe1.cc (1.16),
+	  tests/BD_Shape/writebdshape1.cc (1.11), tests/Box/Makefile.am
+	  (1.47), tests/Box/addconstraints1.cc (1.10),
+	  tests/Box/addspacedims1.cc (1.5), tests/Box/affinedimension1.cc
+	  (1.7), tests/Box/affineimage1.cc (1.8),
+	  tests/Box/affinepreimage1.cc (1.5), tests/Box/ascii_dump_load1.cc
+	  (1.5), tests/Box/bdsdifference1.cc (1.6),
+	  tests/Box/bgp99extrapolation1.cc (1.5),
+	  tests/Box/bhz03widening1.cc (1.5), tests/Box/bounded1.cc (1.5),
+	  tests/Box/boundedaffineimage1.cc (1.5),
+	  tests/Box/boxdifference1.cc (1.7), tests/Box/boxhull.cc (1.5),
+	  tests/Box/boxhull1.cc (1.6), tests/Box/cc76narrowing1.cc (1.6),
+	  tests/Box/cc76widening.cc (1.7), tests/Box/closure1.cc (1.5),
+	  tests/Box/concatenate1.cc (1.6), tests/Box/congruences1.cc (1.2),
+	  tests/Box/constraints1.cc (1.10), tests/Box/contains1.cc (1.6),
+	  tests/Box/containsintegerpoint1.cc (1.7), tests/Box/discrete1.cc
+	  (1.6), tests/Box/disjoint1.cc (1.6), tests/Box/empty1.cc (1.6),
+	  tests/Box/equality1.cc (1.6), tests/Box/expandspacedim1.cc (1.7),
+	  tests/Box/foldspacedims1.cc (1.8), tests/Box/frombdshape1.cc
+	  (1.3), tests/Box/frombox1.cc (1.4), tests/Box/fromgensys1.cc
+	  (1.5), tests/Box/fromgrid1.cc (1.6),
+	  tests/Box/frompartiallyreducedproduct1.cc (1.2),
+	  tests/Box/frompolyhedron1.cc (1.12), tests/Box/frompolyhedron2.cc
+	  (1.10), tests/Box/fromspacedim1.cc (1.3),
+	  tests/Box/generalizedaffineimage1.cc (1.6),
+	  tests/Box/generalizedaffinepreimage1.cc (1.6),
+	  tests/Box/geomcovers1.cc (1.5), tests/Box/intersection1.cc (1.7),
+	  tests/Box/interval1.cc (1.5), tests/Box/interval2.cc (1.5),
+	  tests/Box/mapspacedims1.cc (1.5), tests/Box/max_min1.cc (1.7),
+	  tests/Box/maxspacedim1.cc (1.6), tests/Box/membytes1.cc (1.5),
+	  tests/Box/minconstraints1.cc (1.6),
+	  tests/Box/pointsetpowerset1.cc (1.4), tests/Box/refine1.cc
+	  (1.11), tests/Box/refine2.cc (1.10), tests/Box/refine3.cc (1.3),
+	  tests/Box/relations1.cc (1.6), tests/Box/relations2.cc (1.4),
+	  tests/Box/removespacedims1.cc (1.7), tests/Box/run_tests (1.4),
+	  tests/Box/timeelapse1.cc (1.6), tests/Box/universe1.cc (1.5),
+	  tests/Box/writebox1.cc (1.5), tests/Grid/Makefile.am (1.59),
+	  tests/Grid/addcongruence1.cc (1.15),
+	  tests/Grid/addcongruences1.cc (1.18),
+	  tests/Grid/addconstraint1.cc (1.13),
+	  tests/Grid/addconstraints1.cc (1.14), tests/Grid/addgenerator1.cc
+	  (1.17), tests/Grid/addgenerators1.cc (1.17),
+	  tests/Grid/addspacedims1.cc (1.16), tests/Grid/affinedim1.cc
+	  (1.13), tests/Grid/affineimage1.cc (1.15),
+	  tests/Grid/affineimage2.cc (1.13), tests/Grid/affinepreimage1.cc
+	  (1.16), tests/Grid/affinepreimage2.cc (1.9),
+	  tests/Grid/approximatepartition1.cc (1.4),
+	  tests/Grid/asciidumpload1.cc (1.15), tests/Grid/asciidumpload2.cc
+	  (1.7), tests/Grid/asciidumpload3.cc (1.6),
+	  tests/Grid/asciidumpload4.cc (1.6), tests/Grid/asciidumpload5.cc
+	  (1.4), tests/Grid/asciidumpload6.cc (1.4),
+	  tests/Grid/asciidumpload7.cc (1.5), tests/Grid/bhz03widening1.cc
+	  (1.14), tests/Grid/bounded1.cc (1.15),
+	  tests/Grid/boundedaffineimage1.cc (1.5),
+	  tests/Grid/boundedaffinepreimage1.cc (1.5),
+	  tests/Grid/boundingbox1.cc (1.20), tests/Grid/bounds1.cc (1.16),
+	  tests/Grid/certificate1.cc (1.15), tests/Grid/concatenate1.cc
+	  (1.15), tests/Grid/congruence1.cc (1.19),
+	  tests/Grid/congruences1.cc (1.13), tests/Grid/congruences2.cc
+	  (1.7), tests/Grid/constraints1.cc (1.2), tests/Grid/contains1.cc
+	  (1.13), tests/Grid/containsintegerpoint1.cc (1.5),
+	  tests/Grid/copyconstruct1.cc (1.9), tests/Grid/coveringbox1.cc
+	  (1.17), tests/Grid/coveringbox2.cc (1.15),
+	  tests/Grid/directproduct1.cc (1.48), tests/Grid/directproduct2.cc
+	  (1.15), tests/Grid/directproduct3.cc (1.16),
+	  tests/Grid/directproduct4.cc (1.14), tests/Grid/directproduct5.cc
+	  (1.9), tests/Grid/directproduct6.cc (1.11),
+	  tests/Grid/discrete1.cc (1.9), tests/Grid/disjoint1.cc (1.13),
+	  tests/Grid/equals1.cc (1.14), tests/Grid/expandspacedim1.cc
+	  (1.13), tests/Grid/foldspacedims1.cc (1.13),
+	  tests/Grid/frombdshape1.cc (1.2),
+	  tests/Grid/fromoctagonalshape1.cc (1.2),
+	  tests/Grid/generalizedaffineimage1.cc (1.15),
+	  tests/Grid/generalizedaffineimage2.cc (1.14),
+	  tests/Grid/generalizedaffineimage3.cc (1.6),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.17),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.17),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.6),
+	  tests/Grid/generator1.cc (1.21), tests/Grid/generators1.cc
+	  (1.14), tests/Grid/generators2.cc (1.4), tests/Grid/grid1.cc
+	  (1.22), tests/Grid/grid2.cc (1.17), tests/Grid/grid3.cc (1.25),
+	  tests/Grid/griddifference1.cc (1.13), tests/Grid/intersection1.cc
+	  (1.13), tests/Grid/isempty1.cc (1.9), tests/Grid/isuniverse1.cc
+	  (1.11), tests/Grid/join1.cc (1.17), tests/Grid/join2.cc (1.12),
+	  tests/Grid/limitedextrapolation1.cc (1.14),
+	  tests/Grid/limitedextrapolation2.cc (1.8),
+	  tests/Grid/limitedextrapolation3.cc (1.7),
+	  tests/Grid/mapspacedims1.cc (1.12), tests/Grid/maxmin1.cc (1.14),
+	  tests/Grid/membytes1.cc (1.11), tests/Grid/mincongruences1.cc
+	  (1.11), tests/Grid/mingenerators1.cc (1.11),
+	  tests/Grid/outputoperator1.cc (1.10),
+	  tests/Grid/outputoperator2.cc (1.4),
+	  tests/Grid/outputoperator3.cc (1.4),
+	  tests/Grid/partiallyreducedproduct1.cc (1.9),
+	  tests/Grid/partiallyreducedproduct2.cc (1.4),
+	  tests/Grid/partiallyreducedproduct3.cc (1.3),
+	  tests/Grid/partition1.cc (1.7), tests/Grid/powersetdifference1.cc
+	  (1.4), tests/Grid/powersetgeometricallycovers1.cc (1.4),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.4),
+	  tests/Grid/relations1.cc (1.16), tests/Grid/relations2.cc (1.18),
+	  tests/Grid/relations3.cc (1.9), tests/Grid/removespacedims1.cc
+	  (1.15), tests/Grid/removespacedims2.cc (1.15),
+	  tests/Grid/timeelapse1.cc (1.12), tests/Grid/topclosed1.cc
+	  (1.13), tests/Grid/topclosure1.cc (1.9), tests/Grid/widening1.cc
+	  (1.17), tests/Grid/widening2.cc (1.12), tests/Grid/widening3.cc
+	  (1.7), tests/Grid/writecongruencesystem.cc (1.9),
+	  tests/MIP_Problem/Makefile.am (1.10),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.5),
+	  tests/MIP_Problem/exceptions1.cc (1.5),
+	  tests/MIP_Problem/mipproblem1.cc (1.12),
+	  tests/MIP_Problem/mipproblem2.cc (1.10),
+	  tests/MIP_Problem/mipproblem3.cc (1.4),
+	  tests/Octagonal_Shape/Makefile.am (1.23),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.4),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.5),
+	  tests/Octagonal_Shape/affineimage1.cc (1.5),
+	  tests/Octagonal_Shape/affineimage2.cc (1.4),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.6),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.4),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.4),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.5),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.4),
+	  tests/Octagonal_Shape/bounded1.cc (1.4),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.11),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.5),
+	  tests/Octagonal_Shape/bounds1.cc (1.5),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.6),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.5),
+	  tests/Octagonal_Shape/chinainit.cc (1.4),
+	  tests/Octagonal_Shape/concatenate1.cc (1.4),
+	  tests/Octagonal_Shape/constraints1.cc (1.5),
+	  tests/Octagonal_Shape/contains1.cc (1.5),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.5),
+	  tests/Octagonal_Shape/discrete1.cc (1.4),
+	  tests/Octagonal_Shape/disjoint1.cc (1.8),
+	  tests/Octagonal_Shape/empty1.cc (1.4),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.6),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.6),
+	  tests/Octagonal_Shape/frombdshape1.cc (1.2),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.4),
+	  tests/Octagonal_Shape/fromgrid1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.5),
+	  tests/Octagonal_Shape/fromspacedim1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.10),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.6),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.10),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.6),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.5),
+	  tests/Octagonal_Shape/intersection1.cc (1.5),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.6),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.6),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.5),
+	  tests/Octagonal_Shape/max_min1.cc (1.6),
+	  tests/Octagonal_Shape/max_min2.cc (1.5),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.5),
+	  tests/Octagonal_Shape/membytes1.cc (1.5),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.5),
+	  tests/Octagonal_Shape/octdifference1.cc (1.5),
+	  tests/Octagonal_Shape/octhull1.cc (1.5),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.5),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.8),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.9),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.5),
+	  tests/Octagonal_Shape/run_tests (1.4),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.6),
+	  tests/Octagonal_Shape/universe1.cc (1.4),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.6),
+	  tests/Polyhedron/Makefile.am (1.116), tests/Polyhedron/README
+	  (1.8), tests/Polyhedron/addcongruence1.cc (1.9),
+	  tests/Polyhedron/addcongruences1.cc (1.13),
+	  tests/Polyhedron/addconstraint1.cc (1.12),
+	  tests/Polyhedron/addconstraints1.cc (1.13),
+	  tests/Polyhedron/addconstraints2.cc (1.12),
+	  tests/Polyhedron/addgenerator1.cc (1.13),
+	  tests/Polyhedron/addgenerator2.cc (1.13),
+	  tests/Polyhedron/addgenerators1.cc (1.14),
+	  tests/Polyhedron/addgenerators2.cc (1.13),
+	  tests/Polyhedron/addspacedims1.cc (1.13),
+	  tests/Polyhedron/addspacedims2.cc (1.13),
+	  tests/Polyhedron/affineimage1.cc (1.13),
+	  tests/Polyhedron/affineimage2.cc (1.12),
+	  tests/Polyhedron/affinepreimage1.cc (1.12),
+	  tests/Polyhedron/affinetrans.cc (1.12),
+	  tests/Polyhedron/append1.cc (1.13), tests/Polyhedron/append2.cc
+	  (1.12), tests/Polyhedron/ascii_dump_load1.cc (1.11),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.11),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.12),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.14),
+	  tests/Polyhedron/bhrz03widening1.cc (1.12),
+	  tests/Polyhedron/bhrz03widening2.cc (1.12),
+	  tests/Polyhedron/bhrz03widening3.cc (1.16),
+	  tests/Polyhedron/bhz03widening1.cc (1.15),
+	  tests/Polyhedron/bounded1.cc (1.12),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.12),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.10),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.11),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.13),
+	  tests/Polyhedron/bounds1.cc (1.12),
+	  tests/Polyhedron/cnncconversion1.cc (1.5),
+	  tests/Polyhedron/concatenate1.cc (1.12),
+	  tests/Polyhedron/congruences1.cc (1.14),
+	  tests/Polyhedron/constrains1.cc (1.2),
+	  tests/Polyhedron/constraints1.cc (1.12),
+	  tests/Polyhedron/contains1.cc (1.11),
+	  tests/Polyhedron/contains2.cc (1.11),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.4),
+	  tests/Polyhedron/disjoint1.cc (1.11),
+	  tests/Polyhedron/disjoint2.cc (1.13),
+	  tests/Polyhedron/dualhypercubes.cc (1.16),
+	  tests/Polyhedron/empty1.cc (1.12), tests/Polyhedron/equals1.cc
+	  (1.11), tests/Polyhedron/exceptions1.cc (1.15),
+	  tests/Polyhedron/exceptions2.cc (1.13),
+	  tests/Polyhedron/exceptions3.cc (1.12),
+	  tests/Polyhedron/expandspacedim1.cc (1.14),
+	  tests/Polyhedron/expandspacedim2.cc (1.14),
+	  tests/Polyhedron/foldspacedims1.cc (1.16),
+	  tests/Polyhedron/foldspacedims2.cc (1.17),
+	  tests/Polyhedron/frombdshape1.cc (1.2),
+	  tests/Polyhedron/frombox1.cc (1.5), tests/Polyhedron/frombox2.cc
+	  (1.5), tests/Polyhedron/fromgrid1.cc (1.2),
+	  tests/Polyhedron/fromoctagonalshape1.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.14),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.14),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.11),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.10),
+	  tests/Polyhedron/generators1.cc (1.12),
+	  tests/Polyhedron/geomcovers1.cc (1.15),
+	  tests/Polyhedron/h79widening1.cc (1.13),
+	  tests/Polyhedron/h79widening2.cc (1.12),
+	  tests/Polyhedron/hybrid.cc (1.5),
+	  tests/Polyhedron/intersection1.cc (1.16),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.11),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.12),
+	  tests/Polyhedron/linearpartition1.cc (1.15),
+	  tests/Polyhedron/linearsystem1.cc (1.10),
+	  tests/Polyhedron/linexpression1.cc (1.11),
+	  tests/Polyhedron/mapspacedims1.cc (1.16),
+	  tests/Polyhedron/matrix1.cc (1.11), tests/Polyhedron/max_min1.cc
+	  (1.13), tests/Polyhedron/maxspacedim1.cc (1.16),
+	  tests/Polyhedron/mc91.cc (1.16), tests/Polyhedron/membytes1.cc
+	  (1.16), tests/Polyhedron/memory1.cc (1.14),
+	  tests/Polyhedron/memory2.cc (1.16),
+	  tests/Polyhedron/minconstraints1.cc (1.11),
+	  tests/Polyhedron/minconstraints2.cc (1.13),
+	  tests/Polyhedron/mingenerators1.cc (1.11),
+	  tests/Polyhedron/mingenerators2.cc (1.12),
+	  tests/Polyhedron/nncminimize1.cc (1.8),
+	  tests/Polyhedron/nncminimize2.cc (1.8),
+	  tests/Polyhedron/numberinput1.cc (1.33),
+	  tests/Polyhedron/onepoint.cc (1.12), tests/Polyhedron/permute.cc
+	  (1.10), tests/Polyhedron/pointsetpowerset1.cc (1.8),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.3),
+	  tests/Polyhedron/polydifference1.cc (1.13),
+	  tests/Polyhedron/polydifference2.cc (1.13),
+	  tests/Polyhedron/polyhull1.cc (1.13),
+	  tests/Polyhedron/polyhull2.cc (1.12),
+	  tests/Polyhedron/powerset1.cc (1.22),
+	  tests/Polyhedron/randphull1.cc (1.14),
+	  tests/Polyhedron/relations1.cc (1.12),
+	  tests/Polyhedron/relations2.cc (1.13),
+	  tests/Polyhedron/relations3.cc (1.12),
+	  tests/Polyhedron/removespacedims1.cc (1.12),
+	  tests/Polyhedron/removespacedims2.cc (1.12),
+	  tests/Polyhedron/smm1.cc (1.11), tests/Polyhedron/timeelapse1.cc
+	  (1.13), tests/Polyhedron/timeelapse2.cc (1.13),
+	  tests/Polyhedron/topclosed1.cc (1.12),
+	  tests/Polyhedron/topclosure1.cc (1.12),
+	  tests/Polyhedron/universe1.cc (1.12),
+	  tests/Polyhedron/universe2.cc (1.12),
+	  tests/Polyhedron/variablesset1.cc (1.12),
+	  tests/Polyhedron/watchdog1.cc (1.11),
+	  tests/Polyhedron/writeconsys1.cc (1.12),
+	  tests/Polyhedron/writegensys1.cc (1.12),
+	  tests/Polyhedron/writepolyhedron1.cc (1.12),
+	  tests/Polyhedron/writepolyhedron2.cc (1.12),
+	  tests/Polyhedron/writerelation1.cc (1.14),
+	  tests/Polyhedron/writevariable1.cc (1.9), utils/Makefile.am
+	  (1.17), utils/build_header.in (1.6), utils/cm_cleaner.sh (1.4),
+	  utils/cm_splitter.sh (1.4), utils/text2cxxarray.in (1.5),
+	  utils/timings.cc (1.13), utils/timings.hh (1.7): Copyright years
+	  extended.
+
+2007-12-29 Saturday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.67): Include <typeinfo> for typeid().
+
+2007-12-29 Saturday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/files.cc (1.11): Include <cstdlib> for exit().	Use extra
+	  parentheses to disambiguate a comparison.
+
+2007-12-29 Saturday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.12),
+	  src/BDS_Status.inlines.hh (1.17), src/BD_Shape.cc (1.8),
+	  src/BD_Shape.inlines.hh (1.154), src/BD_Shape.templates.hh
+	  (1.89), src/Box.cc (1.9), src/Box.templates.hh (1.73),
+	  src/Congruence_System.cc (1.27), src/Constraint_System.cc (1.28),
+	  src/Generator_System.cc (1.25), src/Grid_Certificate.cc (1.10),
+	  src/Grid_nonpublic.cc (1.31), src/Grid_public.cc (1.62),
+	  src/Interval.templates.hh (1.3), src/Linear_System.cc (1.46),
+	  src/MIP_Problem.cc (1.64), src/Octagonal_Shape.cc (1.7),
+	  src/Octagonal_Shape.inlines.hh (1.25),
+	  src/Octagonal_Shape.templates.hh (1.63),
+	  src/Polyhedron_nonpublic.cc (1.81), src/Polyhedron_public.cc
+	  (1.105), src/Polyhedron_widenings.cc (1.64): Use explicit braces
+	  to avoid ambiguous else's.
+
+2007-12-29 Saturday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Row.cc (1.24): Added a pair of extra parentheses to
+	  disambiguate an addition within a shift.
+
+2007-12-29 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.12): Include <cstdlib> for exit().
+
+2007-12-29 Saturday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.72): Implemented template
+
+	  <typename Interval> template <typename Iterator> void
+	  Box<Interval>::CC76_widening_assign(const Box& y,
+			      Iterator first, Iterator last)
+
+	  in terms of the new Interval's widening.
+
+2007-12-29 Saturday 10:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.49), Interval.inlines.hh (1.28),
+	  Interval.templates.hh (1.2): Moved several implemementations from
+	  Interval.defs.hh to Interval.inlines.hh.  Added the new method
+	  template
+
+	  <typename Boundary, typename Info> template <typename From,
+	  typename Iterator> typename Enable_If<Is_Interval<From>::value,
+	  void>::type Interval<Boundary, Info>::CC76_widening_assign(const
+	  From& y,					    Iterator first,
+						  Iterator last).
+
+2007-12-28 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.234): Two new items added.
+
+2007-12-28 Friday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bit_Row.defs.hh (1.8), Bit_Row.inlines.hh (1.5): Added
+	  inline void set_intersection(const Bit_Row& x, const Bit_Row& y,
+	  Bit_Row& z).
+
+2007-12-28 Friday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.11): Include <exception> and <iostream>.
+
+2007-12-28 Friday 08:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.66): Added missing std:: qualification.
+
+2007-12-28 Friday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.44): Must include <cstdlib> for getenv().
+
+2007-12-10 Monday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.299): Version number bumped.
+
+2007-12-10 Monday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.225): Three items improved and merged.
+
+2007-12-10 Monday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.52), Grid.defs.hh (1.62): Comments
+	  improved for consistency (the abbreviation we use for
+	  `bounded-difference shape' is `BDS').
+
+2007-12-05 Wednesday 14:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.33): Corrected code for free() as suggested by Andrea Cimino.
+
+2007-12-05 Wednesday 10:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.224), src/BD_Shape.defs.hh (1.108),
+	  src/BD_Shape.inlines.hh (1.153), src/C_Polyhedron.defs.hh (1.51),
+	  src/C_Polyhedron.inlines.hh (1.38), src/Grid.defs.hh (1.61),
+	  src/Grid.inlines.hh (1.21), src/NNC_Polyhedron.defs.hh (1.53),
+	  src/NNC_Polyhedron.inlines.hh (1.39), src/Octagonal_Shape.defs.hh
+	  (1.36), src/Octagonal_Shape.inlines.hh (1.24),
+	  src/Partially_Reduced_Product.defs.hh (1.18),
+	  src/Partially_Reduced_Product.inlines.hh (1.16),
+	  tests/BD_Shape/Makefile.am (1.69),
+	  tests/BD_Shape/fromoctagonalshape1.cc (1.1),
+	  tests/Grid/Makefile.am (1.58), tests/Grid/directproduct1.cc
+	  (1.47), tests/Grid/frombdshape1.cc (1.1),
+	  tests/Grid/fromoctagonalshape1.cc (1.1),
+	  tests/Octagonal_Shape/Makefile.am (1.22),
+	  tests/Octagonal_Shape/frombdshape1.cc (1.1),
+	  tests/Polyhedron/Makefile.am (1.115),
+	  tests/Polyhedron/frombdshape1.cc (1.1),
+	  tests/Polyhedron/fromoctagonalshape1.cc (1.1): Added methods to
+	  the Polyhedra classes, and the Grid, BD_Shape, Octagonal_Shape
+	  classes that construct an element from a BD_Shape and from an
+	  Octagonal_Shape.  Added also similar methods to the partially
+	  reduced product class Added tests to check these new methods.
+	  Updated the NEWS with this information.
+
+2007-12-04 Tuesday 15:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/fromgrid1.cc (1.2), Octagonal_Shape/fromgrid1.cc
+	  (1.2): Fixed a bug in the tests. The "==" was being used for
+	  different objects.
+
+2007-12-04 Tuesday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.23): Test the finalize() methods by explicitly calling
+	  System.gc().
+
+2007-12-04 Tuesday 09:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.298): Version number bumped.
+
+2007-12-04 Tuesday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/fromgrid1.cc (1.1), Octagonal_Shape/fromgrid1.cc
+	  (1.1): Missing test files added.
+
+2007-12-04 Tuesday 08:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.22): Reverted finalize() to being protected.
+
+2007-12-03 Monday 22:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.17),
+	  src/Partially_Reduced_Product.inlines.hh (1.15),
+	  tests/Grid/directproduct1.cc (1.46): A partially reduced product
+	  can now be constructed directly from a closed polyhedron, a not
+	  necessarily closed polyhedron, a grid or a box.
+
+2007-12-03 Monday 21:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.11),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.32), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.21): Added the method free() to delete the C++ class allowing
+	  Java garbage collection to reclaim the wrapper.
+
+2007-12-03 Monday 12:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.223), src/BD_Shape.defs.hh (1.107),
+	  src/BD_Shape.inlines.hh (1.152), src/Octagonal_Shape.defs.hh
+	  (1.35), src/Octagonal_Shape.inlines.hh (1.23),
+	  src/Polyhedron_public.cc (1.104), tests/BD_Shape/Makefile.am
+	  (1.68), tests/Octagonal_Shape/Makefile.am (1.21): Added
+	  constructors fro BD_Shape and Octagonal_Shape fro a Grid.  Added
+	  tests for the new constructors.
+
+	  Undone an unintended change to src/Polyhedron_public.cc in
+	  previous commit (assertion that was added, removed).
+
+2007-12-03 Monday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.222), src/C_Polyhedron.cc (1.23),
+	  src/C_Polyhedron.defs.hh (1.50), src/NNC_Polyhedron.cc (1.23),
+	  src/NNC_Polyhedron.defs.hh (1.52), src/Polyhedron_public.cc
+	  (1.103), tests/Grid/directproduct3.cc (1.15),
+	  tests/Polyhedron/Makefile.am (1.114),
+	  tests/Polyhedron/fromgrid1.cc (1.1): Added constructors for
+	  NNC_Polyhedron and C_Polyhedron from a Grid.	Test file
+	  fromgrid1.cc and its nnc version tests these constructors.
+
+	  The test19 in Grid/directproduct3.cc now checks
+	  is_topologically_closed() for Box x Grid products.
+
+2007-12-03 Monday 11:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.221): Mentioned the bug fixed today.
+
+2007-12-03 Monday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.45): Fixed a bug in method insert()
+	  whereby a wrong result could have been obtained when inserting an
+	  NNC linear row into an empty linear system having a higher space
+	  dimension.  This was the bug shown by test14() in
+	  tests/Polyhedron/congruences1.cc.
+
+2007-12-03 Monday 11:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (1.13): test14 is no longer
+	  expected to fail (bug corrected).
+
+2007-12-03 Monday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/congruences1.cc (1.12): Test14 shows a bug when
+	  converting a congruence system to a constraint system.
+
+2007-11-30 Friday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: sp_clpq.pl (1.19), sp_pl_check.pl
+	  (1.13): Little cosmetic improvements.
+
+2007-11-30 Friday 16:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/: sp_clpq.pl (1.18), sp_pl_check.pl
+	  (1.12): Allow for different versions of SICStus.
+
+2007-11-30 Friday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/: sp_clpq.pl (1.17), sp_pl_check.pl
+	  (1.11): Changes to allow support for SICStus version 4.  FIXME
+	  notes added.
+
+2007-11-29 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (1.7): Include <gprolog.h>
+	  unconditionally.
+
+2007-11-28 Wednesday 16:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.220): Revised reference to Box domain.
+
+2007-11-28 Wednesday 15:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/congruences1.cc (1.1): Tests all the congruence methods
+	  for the Box domain.
+
+2007-11-28 Wednesday 15:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.219), tests/Box/Makefile.am (1.46),
+	  tests/Box/addconstraints1.cc (1.9), tests/Box/cc76widening.cc
+	  (1.6), tests/Grid/directproduct1.cc (1.45),
+	  tests/Grid/directproduct2.cc (1.14), tests/Grid/directproduct3.cc
+	  (1.14), tests/Grid/directproduct4.cc (1.13),
+	  tests/Grid/directproduct5.cc (1.8), tests/Grid/directproduct6.cc
+	  (1.10):
+	  Tests for new methods just committed added to appropriate files
+	  in tests/Box.
+
+	  Tests for directproduct now have the Box domain for one of the
+	  product's components as an optional directive although the
+	  products are currently set with directives for testing
+	  NNC_Polyhedron with the Grid.
+
+2007-11-28 Wednesday 15:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Box.cc (1.8), Box.defs.hh (1.33), Box.inlines.hh (1.22),
+	  Box.templates.hh (1.71): Enabled the product of a Box and a Grid.
+	   To do this, for compatibility with the other classes, the
+	  following methods have been added:	Box(Congruence_System cgs)
+
+	     add_constraint_and_minimize(Constraint c)
+	     add_constraints_and_minimize(Constraint_System cs)
+	     add_recycled_constraints(Constraint_System cs)
+	     add_recycled_constraints_and_minimize(Constraint_System& cs)
+
+	     add_congruence(Congruence cg)
+	     add_congruence_and_minimize(Congruence_System cgs)
+	     add_congruences(Congruence_System cgs)
+	     add_congruences_and_minimize(Congruence_System cgs)
+	     add_recycled_congruences(Congruence_System cgs)
+	     add_recycled_congruences_and_minimize(Congruence_System& cgs)
+
+	     widening_assign
+
+	     congruences()
+	     minimized_congruences()
+
+	     can_recycle_constraint_systems()
+	     can_recycle_congruence_systems()
+
+	     throw_dimension_incompatible(char* method, Congruence cg)
+	     throw_dimension_incompatible(char* method, Congruence_System
+	  cgs)
+
+	  Also private methods added:
+
+	     extract_interval_congruence(Congruence cg, ...)
+	     add_congruence_no_check(Congruence cg)
+	     add_congruences_no_check(Congruence_System cgs)
+
+2007-11-28 Wednesday 06:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.297), interfaces/Prolog/GNU/gprolog_cfli.hh
+	  (1.6): No two distributions install gprolog.h in the same place:
+	  the only reliable way for the users of the GNU Prolog interface
+	  is to define CPPFLAGS.
+
+2007-11-27 Tuesday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: BD_Shape.templates.hh (1.88), Octagonal_Shape.templates.hh
+	  (1.62): Missing "const" added.
+
+2007-11-27 Tuesday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/constraints1.cc (1.9): test06 succeeds.
+
+2007-11-27 Tuesday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.32), Box.templates.hh (1.70):
+	  Box<Interval>::add_constraint_no_check() assumes (and assumed)
+	  that the box was not marked empty: assertion added.  This
+	  invariant was ensured by Box<Interval>::add_constraint() but not
+	  by Box<Interval>::add_constraints_no_check(const
+	  Constraint_System&): the latter has been fixed accordingly.
+
+2007-11-27 Tuesday 10:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/constraints1.cc (1.8): test05 succeeds.
+
+2007-11-27 Tuesday 10:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.69): Spurious comment removed.
+
+2007-11-27 Tuesday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.68), tests/Box/constraints1.cc (1.7):
+	  Last change undone and a change in the commit before this also
+	  undone.
+
+2007-11-27 Tuesday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.67): Check for emptiness moved from
+	  add_constraints_no_check() to add_constraint_no_check().  Also do
+	  the empty check by just checking marked_empty() instead of
+	  is_empty().
+
+2007-11-27 Tuesday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.66): Duplicate code avoided in
+	  Box<Interval>::add_constraint_no_check().
+
+2007-11-27 Tuesday 09:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.templates.hh (1.65), tests/Box/constraints1.cc (1.6):
+	  Added corrections for bugs in identified by previous commit.
+
+2007-11-27 Tuesday 08:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Box/constraints1.cc (1.5): test05 and test06 show bugs in
+	  add_constraint_no_check() and add_constraints_no_check().
+
+2007-11-26 Monday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.296), interfaces/Prolog/GNU/gprolog_cfli.hh
+	  (1.5): Find gprolog.h also under Ubuntu 7.10.
+
+2007-11-23 Friday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct3.cc (1.13): Test07 fails only when the
+	  assertions are enabled with 8 bit integers.
+
+2007-11-22 Thursday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.295): Version number bumped.
+
+2007-11-22 Thursday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct3.cc (1.12): Test07 is set to fail for 8
+	  bit integers when one of the domain components is C_Polyhedron.
+
+2007-11-21 Wednesday 11:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct1.cc (1.44): Test is now reset to test
+	  product Grid x NNC_Polyhedron
+
+2007-11-21 Wednesday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.218), src/Octagonal_Shape.defs.hh (1.34),
+	  src/Octagonal_Shape.inlines.hh (1.22),
+	  tests/Grid/directproduct1.cc (1.43): Octagonal domain now has a
+	  constructor from a box.
+
+2007-11-21 Wednesday 11:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.217), src/Octagonal_Shape.defs.hh (1.33),
+	  src/Octagonal_Shape.inlines.hh (1.21),
+	  src/Octagonal_Shape.templates.hh (1.61),
+	  tests/Grid/directproduct1.cc (1.42), tests/Grid/directproduct2.cc
+	  (1.13), tests/Grid/directproduct3.cc (1.11),
+	  tests/Grid/directproduct4.cc (1.12), tests/Grid/directproduct5.cc
+	  (1.7), tests/Grid/directproduct6.cc (1.9): The
+	  Partially_Reduced_Product now works for products with
+	  Octagonal_Shape domain elements.
+
+	  Tests now have an option to test with a product of
+	  Octagonal_Shape and Grid, but all tests are currently set to test
+	  C_ or NNC_Polyhedron x Grid (or vice versa) combinations.
+
+2007-11-21 Wednesday 08:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.defs.hh (1.48), Direct_Product.inlines.hh
+	  (1.46), Direct_Product.templates.hh (1.24),
+	  Direct_Product.types.hh (1.7), Makefile.am (1.175): The old
+	  implentation for Direct_Product removed as this is replaced by an
+	  instance of the Partially_Reduced_Product class.
+
+2007-11-20 Tuesday 22:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Box.defs.hh (1.31), src/Box.templates.hh (1.64),
+	  tests/Box/Makefile.am (1.45), tests/Box/fromdirectproduct1.cc
+	  (1.6), tests/Box/frompartiallyreducedproduct1.cc (1.1): Changed
+	  the construction of a box from a direct product class to the
+	  construction of a box from a partially reduced product class.
+
+	  Test file updated and renamed to test this change.
+
+2007-11-20 Tuesday 15:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.106), src/BD_Shape.inlines.hh (1.151),
+	  tests/BD_Shape/Makefile.am (1.67), tests/BD_Shape/boundingbox1.cc
+	  (1.1), tests/Grid/directproduct1.cc (1.41): Added method for
+	  constructing a BD_Shape from a box.
+
+	  Test file for building from a box added for the BD_Shape.
+
+	  Test for building a product from a box is now enabled when a
+	  component of the product is a BD_Shape.
+
+2007-11-20 Tuesday 13:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.105), src/BD_Shape.inlines.hh (1.150),
+	  tests/Grid/directproduct3.cc (1.10): Added widening_assign()
+	  using the H79_widening_assign() as the default widening. Test for
+	  widening_assign uncommented for products using the BD_Shape
+	  class.
+
+2007-11-20 Tuesday 08:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/partiallyreducedproduct2.cc (1.3): Tests 08 and 18
+	  fail for 8-bit integers.
+
+2007-11-19 Monday 18:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.inlines.hh (1.149), tests/Grid/directproduct1.cc
+	  (1.40), tests/Grid/directproduct2.cc (1.12),
+	  tests/Grid/directproduct3.cc (1.9), tests/Grid/directproduct4.cc
+	  (1.11), tests/Grid/directproduct5.cc (1.6),
+	  tests/Grid/directproduct6.cc (1.8): Corrected code for
+	  BD_Shape<T>::add_congruences_and_minimize(const
+	  Congruence_System& cgs)
+
+	  All the tests for directproduct?.cc have an option to run using
+	  the BD_Shape x Grid domain, apart from a few tests that are
+	  commented out due to missing methods in the BD_Shape class.
+
+	  Note that these tests are currently set to run using
+	  NNC_Polyhedron x Grid or Grid x.NNC_Polyhedron.
+
+2007-11-19 Monday 14:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/BD_Shape.defs.hh (1.104), src/BD_Shape.inlines.hh (1.148),
+	  src/BD_Shape.templates.hh (1.87), src/Polyhedron.inlines.hh
+	  (1.144), src/Polyhedron_public.cc (1.102),
+	  tests/Grid/directproduct1.cc (1.39): Added methods for adding
+	  congruences and for obtaining the set of equality congruences
+	  from a BD_Shape.
+
+	  Methods in Polyhedron_public.cc for adding congruences moved to
+	  Polyhedron.inlines.hh.
+
+2007-11-19 Monday 11:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.16),
+	  src/Partially_Reduced_Product.templates.hh (1.7),
+	  tests/Grid/directproduct5.cc (1.5),
+	  tests/Grid/partiallyreducedproduct3.cc (1.2): Added
+	  relation_with(Congruences) to the Partially_Reduced_Product
+	  class.
+
+2007-11-19 Monday 10:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.216): Added item
+
+	  o  The method relations_with(Congruence) has been added to the
+	  Polyhedron	class for compatibility with the Grid class
+	  methods.
+
+2007-11-19 Monday 09:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.328), src/Polyhedron_public.cc (1.101),
+	  tests/Polyhedron/relations2.cc (1.12): Added method
+	  relation_with(Congruence) to Polyhedron class.
+
+2007-11-19 Monday 08:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.100): A couple of small improvements
+	  to the implementation of constrains():   - avoid counting lines
+	  if the generator system is not minimized (no matter	  if it has
+	  pending generators or not);	- prefer efficient methods
+	  g.is_line_or_ray() and g.is_line()	 with respect to g.type()
+	  when checking for lines and rays.
+
+2007-11-18 Sunday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.10),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.31), tests/ppl_interface_generator_java_test_java.m4 (1.10),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.20):
+	  Added Java interface for constraints().
+
+	  In Java/tests/ppl_interface_generator_java_test_java.m4, just a
+	  spelling correction.
+
+2007-11-17 Saturday 22:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.215), src/Grid.defs.hh (1.60), src/Grid.inlines.hh
+	  (1.20), src/Partially_Reduced_Product.defs.hh (1.15),
+	  src/Partially_Reduced_Product.inlines.hh (1.14),
+	  src/Partially_Reduced_Product.templates.hh (1.6),
+	  src/Polyhedron.defs.hh (1.327), src/Polyhedron.inlines.hh
+	  (1.143), src/Polyhedron_public.cc (1.99),
+	  tests/Grid/directproduct1.cc (1.38), tests/Grid/directproduct4.cc
+	  (1.10), tests/Grid/directproduct5.cc (1.4),
+	  tests/Grid/partiallyreducedproduct1.cc (1.8),
+	  tests/Polyhedron/addcongruences1.cc (1.12): Added methods
+	  add_congruences_and_minimize(Congruence_System),
+	  add_recycled_congruences(Congruence_System), and
+	  add_recycled_congruences_and_minimize(Congruence_System) to
+	  Polyhedron class.  Added static methods
+	  can_recycle_constraint_systems() and
+	  can_recycle_congruence_systems() to Polyhedron and Grid classes.
+	  Added methods add_congruences_and_minimize(Congruence_System),
+	  add_recycled_congruences(Congruence_System), and
+	  add_recycled_congruences_and_minimize(Congruence_System) to the
+	  Partially_Reduced_Product class.
+
+	  Some simple tests added to check these.
+
+2007-11-17 Saturday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.214), src/Polyhedron.defs.hh (1.326),
+	  src/Polyhedron_public.cc (1.98), tests/Polyhedron/Makefile.am
+	  (1.113), tests/Polyhedron/constrains1.cc (1.1),
+	  tests/Polyhedron/constraints1.cc (1.11): New method bool
+	  Polyhedron::constrains(Variable var) const returns `true' if and
+	  only if `var' is constrained in `*this'.
+
+2007-11-17 Saturday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/relations3.cc (1.11): New test.
+
+2007-11-17 Saturday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.defs.hh (1.14): Friend declaration
+	  fixed and uncommented.
+
+2007-11-16 Friday 14:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.13): A couple of FIXME's
+	  added.
+
+2007-11-16 Friday 14:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.59), src/Partially_Reduced_Product.defs.hh
+	  (1.12), src/Partially_Reduced_Product.inlines.hh (1.13),
+	  tests/Grid/directproduct1.cc (1.37), tests/Grid/directproduct3.cc
+	  (1.8), tests/Grid/partiallyreducedproduct3.cc (1.1): Test file
+	  added for partially reduced products (which should have been
+	  added before).
+
+	  Many doxygen comments in the defs file improved and corrected.
+	  The setting/clearing of the reduced flag also revised for some
+	  methods.
+
+2007-11-16 Friday 12:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.11),
+	  src/Partially_Reduced_Product.inlines.hh (1.12),
+	  tests/Grid/directproduct4.cc (1.9): Added an implementation of
+	  add_congruences_and_minimize().
+
+	  Removed some redundant code in
+	  src/Partially_Reduced_Product.defs.hh.
+
+2007-11-16 Friday 11:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct4.cc (1.8): Tests for
+	  generalized_affine_(pre)image() methods that were commented out
+	  now have now been revised to test the defined methods and
+	  un-commented.
+
+2007-11-16 Friday 10:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.58), src/Grid.inlines.hh (1.19),
+	  src/Partially_Reduced_Product.defs.hh (1.10),
+	  src/Partially_Reduced_Product.inlines.hh (1.11),
+	  tests/Grid/directproduct1.cc (1.36), tests/Grid/directproduct2.cc
+	  (1.11): Methods in the Grid domain that build a grid from
+	  generators, add generators to a grid and get the generators
+	  defining a grid are no longer supported.  (Note: this change only
+	  affects methods wrt "generators" and _not_ wrt
+	  "grid_generators".)
+
+	  In the Partially_Reduced_Product domain all methods that build a
+	  product from generators or grid generators, add generators or
+	  grid generators to a product and get the generators or grid
+	  generators defining a product are no longer supported.
+
+	  Changes to the tests reflect this change.
+
+2007-11-15 Thursday 14:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.9),
+	  src/Partially_Reduced_Product.inlines.hh (1.10),
+	  src/Partially_Reduced_Product.templates.hh (1.5),
+	  tests/Grid/partiallyreducedproduct1.cc (1.7): Corrected the
+	  set_reduced_flag() to clear_reduced_flag() when building a new
+	  product from constraints or congruences.
+
+	  Made 2 additional tests for OK() that checks products after using
+	  these constructors.
+
+	  The code implementing OK() now forces reduced() to reduce the
+	  copy of *this by setting its "reduced" flag to false.  The code
+	  for OK() now moved to *.templates.hh
+
+	  Some formatting improvements mainly in *.inlines.hh.
+
+2007-11-15 Thursday 10:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.templates.hh (1.4),
+	  tests/Grid/Makefile.am (1.57): More tests added for smash and
+	  constraints product..  Formatting improvements to
+	  /Partially_Reduced_Product.templates.hh.
+
+2007-11-13 Tuesday 10:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.9),
+	  tests/Grid/partiallyreducedproduct1.cc (1.6),
+	  tests/Grid/partiallyreducedproduct2.cc (1.2): Many corrections to
+	  the product domain implementation mainly wrt when reduction must
+	  be done and setting the reduced Boolean.  Tests added and
+	  improved. Some useless tests removed.
+
+2007-11-12 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.43): Useless @SET_MAKE@ removed.
+
+2007-11-12 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.294): New versions of GCC on Darwin no longer
+	  support -Wno-long-double: we no longer use this option on that
+	  platform (people using older versions will simply get lots of
+	  warnings they can ignore).
+
+2007-11-09 Friday 11:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct3.cc (1.7): Test18 fails for 8-bit
+	  coefficients.
+
+2007-11-07 Wednesday 14:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: directproduct1.cc (1.35), directproduct3.cc (1.6):
+	  Tests corrected.
+
+2007-11-07 Wednesday 09:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: directproduct1.cc (1.34), directproduct3.cc (1.5):
+	  Temporarily disabled test14 and test19 in directproduct1 and
+	  directproduct3, respectively, which are known to fail.
+
+2007-11-05 Monday 21:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.142),
+	  tests/Polyhedron/congruences1.cc (1.11): The method congruences()
+	  for the Polyhedron classes must return all equalities including
+	  the implied equalities.
+
+2007-11-05 Monday 17:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.56), partiallyreducedproduct1.cc
+	  (1.5), partiallyreducedproduct2.cc (1.1):
+	  partiallyreducedproduct1.cc no longer tests the direct product
+	  domain.  More tests for the Smash_Product and Constraints_Product
+	  domains added in partiallyreducedproduct2.cc
+
+2007-11-05 Monday 15:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: directproduct1.cc (1.33), directproduct2.cc (1.10),
+	  directproduct3.cc (1.4), directproduct4.cc (1.7),
+	  directproduct5.cc (1.3): Revised the directproduct tests so as
+	  not to build or enlarge a product using the generators or grid
+	  generators.
+
+2007-11-05 Monday 14:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.8),
+	  src/Partially_Reduced_Product.inlines.hh (1.8),
+	  src/Polyhedron.defs.hh (1.325), src/Polyhedron_public.cc (1.97),
+	  tests/Grid/directproduct4.cc (1.6): Undone the change to
+	  generalized_affine_image in previous commit so these methods are,
+	  again, unsupported by the  Partially_Reduced_Product domains.
+
+2007-11-05 Monday 12:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/directproduct1.cc (1.32): Revised test so as not to
+	  use the generators or grid_generators constructors
+
+2007-11-05 Monday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.7),
+	  src/Partially_Reduced_Product.inlines.hh (1.7),
+	  src/Polyhedron.defs.hh (1.324), src/Polyhedron_public.cc (1.96),
+	  tests/Grid/directproduct4.cc (1.5): Revised the methods
+	  generalized_affine_image() so as to allow for a modulus as the
+	  fourth argument.  Note that for the Polyhedron domains the
+	  modulus is ignored and the transformation is treated as if it was
+	  0 (equality).  Enabled the tests in directproduct4.cc that test
+	  this.
+
+2007-11-05 Monday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.defs.hh (1.49), src/C_Polyhedron.inlines.hh
+	  (1.37), src/NNC_Polyhedron.defs.hh (1.51),
+	  src/NNC_Polyhedron.inlines.hh (1.38),
+	  src/Partially_Reduced_Product.defs.hh (1.6),
+	  src/Partially_Reduced_Product.inlines.hh (1.6),
+	  tests/Grid/partiallyreducedproduct1.cc (1.4): Removed
+	  C_Polyhedron::C_Polyhedron(const Grid_Generator_System&),
+	  NNC_Polyhedron::NNC_Polyhedron(const Grid_Generator_System&) and
+	  similar constructors.
+
+2007-11-05 Monday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.5), tests/print.hh
+	  (1.43), tests/Grid/Makefile.am (1.55),
+	  tests/Grid/directproduct1.cc (1.31), tests/Grid/directproduct2.cc
+	  (1.9), tests/Grid/directproduct3.cc (1.3),
+	  tests/Grid/directproduct4.cc (1.4), tests/Grid/directproduct5.cc
+	  (1.2), tests/Grid/directproduct6.cc (1.7),
+	  tests/Grid/directproduct7.cc (1.5): Completely revised the test
+	  files directproduct?.cc
+
+	  In tests/print.hh, added to the print options for the tests:
+
+	  print_constraints(const
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>&
+	  pd, print_congruences(const
+	  Parma_Polyhedra_Library::Partially_Reduced_Product<D1, D2, R>&
+	  pd,
+
+	  Corrected the implementation of strictly_contains() for
+	  Partially_Reduced_Product domains.
+
+2007-11-03 Saturday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.4),
+	  src/globals.defs.hh (1.51), tests/Grid/Makefile.am (1.54),
+	  tests/Grid/asciidumpload7.cc (1.4),
+	  tests/Grid/partiallyreducedproduct1.cc (1.3): Added code for
+	  ascii_dump() for Partially_Reduced_Product class.
+
+2007-11-02 Friday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.13): FIXME resolved.
+
+2007-11-02 Friday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (1.3): Comments
+	  revised so as to adhere to our standards.
+
+2007-11-02 Friday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.templates.hh (1.2): Simplified the
+	  logic of Smash_Reduction<D1, D2>::product_reduce() so as to
+	  remove all explicit returns.
+
+2007-11-02 Friday 16:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.5),
+	  Partially_Reduced_Product.inlines.hh (1.3): Revised comments for
+	  the product domain.  Removed a useless return.
+
+2007-11-02 Friday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Partially_Reduced_Product.inlines.hh (1.2): Do not name
+	  unused parameters (this avoids the compiler warnings).  Avoid
+	  useless returns.
+
+2007-11-02 Friday 16:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.4): Added comments for
+	  the new reduction classes and their methods.	Corrected another
+	  comment.
+
+2007-11-02 Friday 14:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Partially_Reduced_Product.defs.hh (1.3),
+	  tests/Grid/partiallyreducedproduct1.cc (1.2): Removed redundant
+	  typedef declarations and revised the tests to use the more
+	  generic types for products.
+
+2007-11-02 Friday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Partially_Reduced_Product.defs.hh (1.2),
+	  Partially_Reduced_Product.types.hh (1.2): Temporarily added the
+	  Domain_Product class: it will be removed when template typedefs
+	  will be supported by C++.
+
+2007-11-02 Friday 11:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Makefile.am (1.174), src/Partially_Reduced_Product.defs.hh
+	  (1.1), src/Partially_Reduced_Product.inlines.hh (1.1),
+	  src/Partially_Reduced_Product.templates.hh (1.1),
+	  src/Partially_Reduced_Product.types.hh (1.1),
+	  tests/Grid/Makefile.am (1.53),
+	  tests/Grid/partiallyreducedproduct1.cc (1.1): First revision for
+	  implementing Partially_Reduced_Product classes that is intended
+	  to replace the Direct_Product and Open_Product classes.
+
+2007-11-01 Thursday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.30): Avoid abusing logical operators.
+
+2007-10-29 Monday 11:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.15): Test corrected so as to
+	  take into proper account 32bit architectures.
+
+2007-10-27 Saturday 14:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/h79widening1.cc (1.12): Simplified the logic
+	  underlying test01.
+
+2007-10-27 Saturday 13:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/affinepreimage1.cc (1.15): Removed TODO comment and
+	  uncommented gr.add_congruence((3*A - 6*B %= 3) / 9);
+
+2007-10-27 Saturday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.15): Modified to compute
+	  (and print in noisy mode) information on the cardinality of the
+	  intermediate results, as well as checking the cardinalities of
+	  the final results to match those reported in the FAC 2005 paper.
+
+2007-10-27 Saturday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (1.5): Tests extended and
+	  FIXMEs resolved.
+
+2007-10-27 Saturday 07:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage1.cc (1.14): Avoid abusing logical
+	  operators.
+
+2007-10-27 Saturday 06:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/membytes1.cc (1.10): TODO dealt with.
+
+2007-10-27 Saturday 06:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.14): One FIXME resolved,
+	  another one added.
+
+2007-10-26 Friday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: .cvsignore (1.6), writegensys1.cc (1.11),
+	  writepolyhedron1.cc (1.11), writepolyhedron2.cc (1.11): Several
+	  FIXMEs resolved.
+
+2007-10-26 Friday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearpartition1.cc (1.14): FIXME resolved: now
+	  test04() checks all the results.
+
+2007-10-26 Friday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.14): Variable renamed.
+
+2007-10-26 Friday 12:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.inlines.hh (1.45),
+	  Direct_Product.templates.hh (1.23): Non-inline code moved from
+	  Direct_Product.inlines.hh to Direct_Product.templates.hh
+
+2007-10-25 Thursday 22:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.21),
+	  src/Pointset_Powerset.templates.hh (1.16),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.2): Added
+	  affine_dimension() to the Pointset_Powerset.
+
+2007-10-25 Thursday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.13): Define also
+	  SWI_PROLOG_LD_OPTIONS.
+
+2007-10-24 Wednesday 15:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.defs.hh (1.20),
+	  src/Pointset_Powerset.templates.hh (1.15),
+	  tests/Polyhedron/Makefile.am (1.112),
+	  tests/Polyhedron/pointsetpowerset2.cc (1.1): Added
+	  generalized_*image() and bounded_*image() to the Pointset
+	  Powerset domain.
+
+	  Added tests for these and for the affine_image() and
+	  affine_preimage() methods.
+
+2007-10-22 Monday 21:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.44),
+	  tests/Grid/directproduct6.cc (1.6): Revised code for
+	  relation_with(Constraint).  Added one extra test for this.
+
+2007-10-22 Monday 14:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.43),
+	  tests/Grid/directproduct1.cc (1.30), tests/Grid/directproduct2.cc
+	  (1.8), tests/Grid/directproduct3.cc (1.2),
+	  tests/Grid/directproduct4.cc (1.3), tests/Grid/directproduct6.cc
+	  (1.5), tests/Grid/directproduct7.cc (1.4): Bug fixed for
+	  congruences() and minimized_congruences().  Tests changed so as
+	  to test the Direct_Product class rather than the Open_Product
+	  class.
+
+2007-10-22 Monday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.205), src/Direct_Product.defs.hh (1.47),
+	  src/Direct_Product.inlines.hh (1.42): Documentation revised for
+	  grids, bibliographic cross-reference corrected and some missing
+	  code for the direct product domain added.
+
+2007-10-22 Monday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.46), src/Direct_Product.inlines.hh
+	  (1.41), tests/Grid/directproduct6.cc (1.4): Revised the returned
+	  result for relation_with(Constraint).
+
+2007-10-22 Monday 09:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.45), src/Direct_Product.inlines.hh
+	  (1.40), tests/Grid/directproduct6.cc (1.3): Added the
+	  relation_with(Constraint) and relation_with(Generator) method for
+	  the direct product.
+
+2007-10-20 Saturday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.76): Use the `-pl' option of
+	  `plld' to make sure the right Prolog interpreter is used.
+
+2007-10-20 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.12): Set and substitute the
+	  `SWI_PROLOG' variables: it contains the complete path of the
+	  SWI-Prolog interpreter.
+
+2007-10-20 Saturday 18:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.57), src/Grid_nonpublic.cc (1.29),
+	  src/Grid_public.cc (1.61), tests/Grid/relations1.cc (1.15),
+	  tests/Grid/relations2.cc (1.17), tests/Grid/relations3.cc (1.8):
+	  Revised the grid relation_with() methods for congruences and
+	  constraints so that saturates() is included in the result
+	  whenever the congruence or constraint is an equality and every
+	  point of the grid satisfies the equality.
+
+	  Added grid relation_with() methods for a generator so that a
+	  point or closure point has the same relation with the grid as the
+	  corresponding grid point, and a ray or line has the same relation
+	  with the grid as a grid line.
+
+	  Expected results revised and new tests for the grid
+	  relation_with() methods for a generator added to relations1.cc.
+
+2007-10-19 Friday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.293): Version number bumped.
+
+2007-10-19 Friday 15:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.60): In code for building a grid from a
+	  polyhedron, bug that was causing an assertion to fail corrected.
+
+2007-10-19 Friday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.36): Spelling of file
+	  name corrected.
+
+2007-10-19 Friday 08:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.24): test19 expected to fail with an
+	  overflow exception with checked_int8 configuration.
+
+2007-10-18 Thursday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.292): For a change, test with
+	  Octagonal_Shape<double> instead of BD_Shape<int8_t>.
+
+2007-10-18 Thursday 11:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.44), src/Direct_Product.inlines.hh
+	  (1.39), tests/Grid/directproduct7.cc (1.3): Added maximize/5 and
+	  minimize/5 for the direct product.  Comments improved.  Tests
+	  added for these methods.
+
+2007-10-18 Thursday 08:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.59): TEMP_INTEGER taken outside loops.
+
+2007-10-18 Thursday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.16):
+	  Additional change made so as to deal with change to maximize/5
+	  and minimize/5 for the grid domain.
+
+2007-10-18 Thursday 08:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.58), tests/Grid/grid3.cc (1.23): Bug shown
+	  in previous commit now corrected.
+
+2007-10-18 Thursday 07:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.22): test18 shows a bug in the code added
+	  for building a grid using the generators of a polyhedron.
+
+2007-10-17 Wednesday 22:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.57): Code for constructing a grid from a
+	  polyhedron improved.
+
+2007-10-17 Wednesday 21:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.15):
+	  Changed the OCaml interface so as to match the change to
+	  maximize/5 and minimize/5 for the grid domain.
+
+2007-10-17 Wednesday 18:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.18),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.30),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.19),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.49),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.51), src/Grid.defs.hh (1.56), src/Grid.inlines.hh (1.18),
+	  src/Grid_nonpublic.cc (1.28), tests/Grid/maxmin1.cc (1.13):
+	  Changed the methods maximize/5 and minimize/5 for the Grid class
+	  so that a Generator point, the maximum point of the grid, is the
+	  5th argument.
+
+2007-10-17 Wednesday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.55), src/Grid_public.cc (1.56),
+	  tests/Grid/grid3.cc (1.21): Added a constructor for a grid from a
+	  polyhedron.
+
+2007-10-17 Wednesday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.323): Grid befriended to allow for the
+	  efficient implementation of a Grid constructor from a Polyhedron.
+
+2007-10-16 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.25): FIXME resolved.
+
+2007-10-16 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.types.hh (1.8): Template parameters renamed.
+
+2007-10-16 Tuesday 17:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.43), src/Direct_Product.inlines.hh
+	  (1.38), tests/Grid/directproduct7.cc (1.2): Added
+	  bounded_affine_image() and bounded_affine_preimage() for the
+	  direct product domain with some simple tests in
+	  directproduct7.cc.
+
+	  Improved a few comments in Direct_Product.defs.hh.
+
+2007-10-16 Tuesday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.42), src/Direct_Product.inlines.hh
+	  (1.37), tests/Grid/Makefile.am (1.52),
+	  tests/Grid/directproduct7.cc (1.1): Revised several comments in
+	  Direct_Product.defs.hh.  Added bounds_from_above/1,
+	  bounds_from_below/1, maximize/4 and minimize/4 for direct product
+	  domain.  Added tests for these in directproduct7.cc.
+
+2007-10-16 Tuesday 12:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (1.36): Useless copies avoided.
+
+2007-10-16 Tuesday 12:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.35): Implementation of
+	  constraints(), minimized_constraints(), congruences() and
+	  minimized_congruences() improved.
+
+2007-10-16 Tuesday 10:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.41), src/Direct_Product.inlines.hh
+	  (1.34), tests/Grid/directproduct4.cc (1.2): Added affime_*image
+	  and versions of generalized_..._*image that are supported by both
+	  the grids and polyhedra classes.  Tests for these have been
+	  enabled.
+
+2007-10-16 Tuesday 09:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.inlines.hh (1.33),
+	  tests/Grid/directproduct6.cc (1.2): Improved code in previous
+	  commit for add_constraints() and constraints() and similar
+	  methods with the recycle and minimize options. Similarly for
+	  congruences.	Testing of these improved.
+
+2007-10-15 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.16): Added the `Box_Pointset' derived
+	  class.  Provide the constructors from boxes, bounded-difference
+	  and octagonal shapes.
+
+2007-10-15 Monday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Ask_Tell.defs.hh (1.18): Add class Ask_Tell to the C++
+	  interface documentation.
+
+2007-10-15 Monday 19:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.40): Add class Direct_Product to
+	  the C++ interface documentation.  Use properly the math
+	  environment delimiters in docs. Fix indentation.
+
+2007-10-15 Monday 19:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.15): Add class Any_Pointset to the
+	  C++ interface documentation.	Do properly group documented
+	  methods.
+
+2007-10-15 Monday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.51), directproduct1.cc (1.29),
+	  directproduct2.cc (1.7), directproduct3.cc (1.1),
+	  directproduct4.cc (1.1), directproduct5.cc (1.1),
+	  directproduct6.cc (1.1): directproduct1.c split into 4 files
+	  directproduct2.cc now named directproduct5.cc directproduct6.cc
+	  is some additional tests..
+
+2007-10-15 Monday 15:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.defs.hh (1.39), Direct_Product.inlines.hh
+	  (1.32): Added a short description of a direct product.
+
+	  Modified the code for constraints(), congruences() so as to
+	  return all the constraints or congruences in the components.
+	  Similarly for minimized_constraints() and the recycled versions.
+
+2007-10-15 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Term.defs.hh (polynomials.3): `Checked_Exponent_Type_Policy'
+	  now sets `has_nan' to false.
+
+2007-10-15 Monday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/congruence1.cc (1.18): Added tests for == and != for
+	  congruences when they have not been normalised or strongly
+	  normalised.
+
+2007-10-15 Monday 12:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.defs.hh (1.25): Removed operator==(const
+	  Congruence_System& x, const Congruence_System& y);
+
+2007-10-15 Monday 09:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Term.cc (polynomials.3): Reimplemented method
+	  Term::shift_space_dimensions(const Variables_Set&) so as to use a
+	  single loop instead of two.
+
+2007-10-15 Monday 09:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polynomial_Space.templates.hh (polynomials.3): Prefer
+	  const_iterator to iterator when accessing a Variables_Set.  When
+	  creating a Variables_Set, prefer adding a variable index instead
+	  of a proper Variable, if it is known that the index is less than
+	  the maximum allowed space dimension.
+
+2007-10-15 Monday 09:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polynomial.cc (polynomials.3): Fixed a typo in a comment.
+
+2007-10-14 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Monomial.cc, Monomial.defs.hh, Monomial.inlines.hh,
+	  Polynomial.cc, Polynomial.defs.hh, Polynomial.inlines.hh,
+	  Polynomial_Cone.defs.hh, Polynomial_Constraint.defs.hh,
+	  Polynomial_Space.cc, Polynomial_Space.defs.hh,
+	  Polynomial_Space.templates.hh, Term.cc, Term.defs.hh,
+	  Term.inlines.hh (polynomials.[2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Non-standard qualifications removed.	Spurious semicolons
+	  removed.  Variable shadowing avoided.
+
+2007-10-14 Sunday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh (1.7): Non-standard qualification
+	  removed.
+
+2007-10-14 Sunday 10:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, configure.ac, src/Makefile.am, src/Monomial.cc,
+	  src/Monomial.defs.hh, src/Monomial.inlines.hh,
+	  src/Monomial.types.hh, src/Polynomial.cc, src/Polynomial.defs.hh,
+	  src/Polynomial.inlines.hh, src/Polynomial.types.hh,
+	  src/Polynomial_Cone.cc, src/Polynomial_Cone.defs.hh,
+	  src/Polynomial_Cone.inlines.hh, src/Polynomial_Cone.types.hh,
+	  src/Polynomial_Constraint.cc, src/Polynomial_Constraint.defs.hh,
+	  src/Polynomial_Constraint.inlines.hh,
+	  src/Polynomial_Constraint.types.hh,
+	  src/Polynomial_Constraint_System.cc,
+	  src/Polynomial_Constraint_System.defs.hh,
+	  src/Polynomial_Constraint_System.inlines.hh,
+	  src/Polynomial_Constraint_System.types.hh,
+	  src/Polynomial_Space.cc, src/Polynomial_Space.defs.hh,
+	  src/Polynomial_Space.inlines.hh,
+	  src/Polynomial_Space.templates.hh, src/Polynomial_Space.types.hh,
+	  src/Term.cc, src/Term.defs.hh, src/Term.inlines.hh,
+	  src/Term.types.hh, src/globals.types.hh, tests/Makefile.am
+	  (polynomials.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Initial implementation of polynomial spaces (joint work with
+	  Enric Rodriguez Carbonell and Enea Zaffanella).
+
+2007-10-13 Saturday 19:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.cc (1.7), Pointset_Ask_Tell.defs.hh
+	  (1.13), Pointset_Ask_Tell.templates.hh (1.11): A few FIXMEs have
+	  been resolved by adding a private typedef.
+
+2007-10-13 Saturday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.cc (1.6), Pointset_Ask_Tell.templates.hh
+	  (1.10): Compilation errors fixed, with FIXMEs added.
+
+2007-10-13 Saturday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.38): Non-standard qualification
+	  removed.
+
+2007-10-13 Saturday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.103), Bit_Row.defs.hh (1.7),
+	  Box.defs.hh (1.30), Congruence.defs.hh (1.22),
+	  Congruence_System.defs.hh (1.24), Constraint.defs.hh (1.127),
+	  Constraint_System.defs.hh (1.39), Generator_System.defs.hh
+	  (1.26), Grid.defs.hh (1.54), Grid_Generator_System.defs.hh
+	  (1.28), Linear_Expression.defs.hh (1.37), OR_Matrix.defs.hh
+	  (1.12), Octagonal_Shape.defs.hh (1.32), Poly_Con_Relation.defs.hh
+	  (1.35), Poly_Gen_Relation.defs.hh (1.33), Polyhedron.defs.hh
+	  (1.322), Ptr_Iterator.defs.hh (1.11): Non-standard qualifications
+	  removed.
+
+2007-10-13 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh (1.6): Avoid naming an unused
+	  parameter.
+
+2007-10-13 Saturday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.55), src/Pointset_Ask_Tell.cc (1.5),
+	  src/Pointset_Ask_Tell.defs.hh (1.12),
+	  src/Pointset_Ask_Tell.inlines.hh (1.6), src/Pointset_Powerset.cc
+	  (1.15), src/Pointset_Powerset.defs.hh (1.19),
+	  src/Pointset_Powerset.inlines.hh (1.9),
+	  src/checked_float.inlines.hh (1.82),
+	  tests/Polyhedron/powerset1.cc (1.21): Due to compiler bugs, there
+	  is no way to compile the PPL with GCC versions up to and
+	  including 3.4.6: old kludges removed.
+
+2007-10-13 Saturday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.48): Work around a bug in version 10.0 of
+	  the Intel C/C++ compiler.
+
+2007-10-13 Saturday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.9): Compiler warning avoided.
+
+2007-10-11 Thursday 08:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.32): In the constructor of grids from
+	  boxes, avoid meaningless implicit conversions in the calls to
+	  constructors for Grid_Generator_System.  Don't use function
+	  `used' to suppress a compiler warning when it is enough to avoid
+	  naming an unused parameter.
+
+2007-10-10 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.inlines.hh (1.9): Coefficient_zero() and
+	  Coefficient_one() temporarily restored to the old definition.
+
+2007-10-10 Wednesday 14:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.213): Added that a bug has been fixed for the grid
+	  domain.
+
+2007-10-10 Wednesday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.53), Polyhedron.defs.hh (1.321): Comments
+	  for constraints() and minimized_constraints() in Grid.defs.hh
+	  improved; similar improvements for congruences in
+	  Polyhedron.defs.hh.
+
+2007-10-09 Tuesday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.9), TODO (1.233), Watchdog/INSTALL (1.6): The `make
+	  uninstall' command is now mentioned in the INSTALL file.
+
+2007-10-09 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.23): Example simplified.
+
+2007-10-09 Tuesday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.291): Provide the Intel C/C++ compiler with
+	  adequate warning flags.
+
+2007-10-09 Tuesday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.290): The Intel C/C++ equivalent of GCC's
+	  -frounding-math should be -fp-model strict -fp-speculation off.
+
+2007-10-09 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.289): Detect the Intel C/C++ compiler.
+
+2007-10-09 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.212), interfaces/C/ppl_c.h.in (1.73): In the C interface
+	  it is no longer an error to call ppl_initialize() or
+	  ppl_finalize() multiple times (this matches the behavior of the
+	  other interfaces).
+
+2007-10-09 Tuesday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (1.12): Teach
+	  emacs that this is a C++ file.  Disable automatic initialization.
+	  Use the new Parma_Polyhedra_Library::initialize() and
+	  Parma_Polyhedra_Library::finalize() instead of something ad hoc.
+
+2007-10-09 Tuesday 15:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.13): Do not rely on automatic initialization of the PPL.
+
+2007-10-09 Tuesday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.11): No longer rely on
+	  automatic initialization.
+
+2007-10-09 Tuesday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.211), src/initializer.hh (1.15): Users of the C++
+	  interface of the library can now decide to disable the automatic
+	  initialization mechanism of the PPL.	To do so, the preprocessor
+	  symbol PPL_NO_AUTOMATIC_INITIALIZATION should be defined before
+	  including the `ppl.hh' header file.  When automatic
+	  initialization is disabled it is imperative to explicitly call
+	  the new function
+
+	      void Parma_Polyhedra_Library::initialize()
+
+	  before using the library.  The new function
+
+	      void Parma_Polyhedra_Library::finalize() and
+
+	  should also be called (to release a small amount of memory) when
+	  done with the library.
+
+2007-10-08 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.147), Box.inlines.hh (1.21),
+	  Octagonal_Shape.inlines.hh (1.20): Use DIRTY_TEMP instead of
+	  static variables.
+
+2007-10-08 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.12): Use DIRTY_TEMP0 for temporaries.
+
+2007-10-08 Monday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Coefficient.cc (1.8), Coefficient.defs.hh (1.10),
+	  Coefficient.inlines.hh (1.8), Congruence.cc (1.18),
+	  Congruence.defs.hh (1.21), Congruence.inlines.hh (1.18),
+	  Congruence_System.cc (1.26), Congruence_System.defs.hh (1.23),
+	  Congruence_System.inlines.hh (1.10), Constraint.cc (1.69),
+	  Constraint.defs.hh (1.126), Constraint.inlines.hh (1.68),
+	  Constraint_System.cc (1.27), Constraint_System.defs.hh (1.38),
+	  Constraint_System.inlines.hh (1.11), Generator.cc (1.76),
+	  Generator.defs.hh (1.124), Generator.inlines.hh (1.62),
+	  Generator_System.cc (1.24), Generator_System.defs.hh (1.25),
+	  Generator_System.inlines.hh (1.10), Grid_Generator.cc (1.22),
+	  Grid_Generator.defs.hh (1.32), Grid_Generator.inlines.hh (1.15),
+	  Grid_Generator_System.cc (1.20), Grid_Generator_System.defs.hh
+	  (1.27), Grid_Generator_System.inlines.hh (1.16), Init.cc (1.32),
+	  Linear_Expression.cc (1.19), Linear_Expression.defs.hh (1.36),
+	  Linear_Expression.inlines.hh (1.12): First go at getting rid of
+	  all non-POD static variables.
+
+2007-10-08 Monday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Temp.inlines.hh (1.3): Allow the use of DIRTY_TEMP and
+	  DIRTY_TEMP0 also outside the Parma_Polyhedra_Library namespace.
+
+2007-10-08 Monday 14:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/congruences1.cc (1.10): Added some tests for
+	  congruences() and minimized_congruences().  test06 shows that
+	  implied equalities (eg A + B >= 3, A + B <= 3) are ignored (at
+	  the moment) for congruences().
+
+2007-10-08 Monday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.84): Use DIRTY_TEMP0 instead of a static
+	  variable.
+
+2007-10-08 Monday 14:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.26): When building a
+	  Constraint_System from a Congruence_System, do properly set the
+	  topology and the space dimension; adding the positivity
+	  constraint is not needed.
+
+2007-10-08 Monday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.cc (1.68): When building a constraint from a
+	  congruence, do not require a non-zero space dimension; also,
+	  avoid building a NOT_NECESSARILY_CLOSED constraint.
+
+2007-10-08 Monday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.17), Congruence.inlines.hh (1.17): An
+	  assertion made stronger and a new one added.
+
+2007-10-08 Monday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.52): Simplified the
+	  handling of error messages and ppl finalization, removing a few
+	  dead code and useless cuts.
+
+2007-10-08 Monday 11:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Constraint_System.cc (1.25), Grid.inlines.hh (1.17): Undone
+	  change to Grid.inlines.hh in last commit and made a corresponding
+	  change to the Constraint_System() code.
+
+2007-10-08 Monday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.inlines.hh (1.16): Fixed the bug shown in test03 and
+	  test10 in constraints1.cc
+
+2007-10-08 Monday 11:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.50), constraints1.cc (1.1):
+	  constraints1.cc has tests for constraints() and
+	  minimized_constraints().  test03 and tests10 show a bug - cause
+	  an assertion to fail - when getting the constraints from an empty
+	  grid with 0 space dimensions.
+
+2007-10-08 Monday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.51): Removed a spurious
+	  occurrence of ppl_finalize/0 in time_out/1, which was causing a
+	  bug.
+
+2007-10-07 Sunday 18:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.38): Added an explanation of how to use the
+	  test-coverage facilities provided by GCC.
+
+2007-10-07 Sunday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: pl_clpq.cc (1.13), ppl_pl.cc (1.13): With
+	  versions of SWI-Prolog after 5.6.43, ask SWI-Prolog not to fiddle
+	  with GMP allocation functions.
+
+2007-10-07 Sunday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.11): No longer use global variables of kind mpz_class, since
+	  that does not allow to precisely control construction and
+	  destruction time.  This triggers a bug in pl_check.pl: apparently
+	  it tries to use the PPL interface after having called
+	  ppl_finalize/0 without an intervening invocation of
+	  ppl_initialize/0.
+
+2007-10-07 Sunday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (1.4): Comment improved.
+
+2007-10-07 Sunday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.30): Comments and
+	  formatting improved.
+
+2007-10-07 Sunday 09:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.232): Item dealt with and removed.
+
+2007-10-06 Saturday 22:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.231): Removed item - Revise the documentation for all the
+	  congruences() and   minimized_congruences() methods.
+
+2007-10-06 Saturday 22:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Direct_Product.defs.hh (1.37), Grid.defs.hh (1.52),
+	  Polyhedron.defs.hh (1.320): Revised comments for some
+	  congruences() and minimized_congruences() methods and also
+	  similarly for some constraints() and minimized_constraints()
+	  methods.  A couple of other typos fixed in comments in
+	  Grid.defs.hh
+
+2007-10-06 Saturday 21:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.22), TODO (1.230): Mentioned that the
+	  mechanisms to specify additional compilation flags may be used to
+	  request extra optimizations.	Corresponding to-do item removed.
+
+2007-10-06 Saturday 15:03  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.81): Replaced volatile with
+	  avoid_cse.
+
+2007-10-06 Saturday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.21): Revised the example with the Intel C/C++
+	  compiler.  Other minor improvements.
+
+2007-10-06 Saturday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (1.7): Unwanted change undone.
+
+2007-10-06 Saturday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ciao_cfli.hh (1.4), GNU/gprolog_cfli.hh
+	  (1.4), SICStus/sicstus_cfli.ic (1.18), SWI/swi_cfli.hh (1.6),
+	  XSB/xsb_cfli.hh (1.4), YAP/yap_cfli.hh (1.4): Comments improved.
+
+2007-10-05 Friday 18:43  Abramo Bagnara
+
+	* src/Interval_Restriction.defs.hh (1.10): Avoid naming unused
+	  parameter.
+
+2007-10-05 Friday 18:35  Abramo Bagnara
+
+	* src/Grid_simplify.cc (1.36): Fixed gcdext_assign call.
+
+2007-10-05 Friday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.29): Work around bug of the Intel compiler.
+
+2007-10-05 Friday 14:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval_Restriction.defs.hh (1.9), checked_int.inlines.hh
+	  (1.64), checked_mpz.inlines.hh (1.50): Avoid naming unused
+	  parameters.  Avoid long source lines.
+
+2007-10-05 Friday 12:24  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.95), Checked_Number.inlines.hh
+	  (1.77), GMP_Integer.defs.hh (1.27), GMP_Integer.inlines.hh
+	  (1.22), checked.defs.hh (1.43), checked.inlines.hh (1.40),
+	  checked_ext.defs.hh (1.14), checked_ext.inlines.hh (1.40),
+	  checked_mpz.inlines.hh (1.49): Fixed prototype for gcdext.
+
+2007-10-04 Thursday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.229): Reorganized: some things will definitely not be
+	  ready for PPL 0.10.
+
+2007-10-04 Thursday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.288): Version number bumped.
+
+2007-10-04 Thursday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (1.7): Comment fixed.
+
+2007-10-03 Wednesday 19:16  Andrea Cimino
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.9),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.29), jni/ppl_java_globals.cc (1.8),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.18):
+	  Implemented `total_memory_in_bytes' for the PPL objects.  At the
+	  moment the method returns only the memory used by the C++
+	  objects.
+
+2007-10-02 Tuesday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.9): test01 always fails with
+	  8-bit coefficients, provided the timeout is long enough.
+
+2007-10-02 Tuesday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.8): Timeout increased to 2
+	  seconds.
+
+2007-10-01 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.22): Option `--licence' fixed: the PPL is
+	  now released under GPL version 3.
+
+2007-09-30 Sunday 23:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.7): Timeout increased to 1
+	  second.
+
+2007-09-30 Sunday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.210), configure.ac (1.287),
+	  interfaces/Prolog/Ciao/Makefile.am (1.66),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.51),
+	  interfaces/Prolog/GNU/Makefile.am (1.66),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.44),
+	  interfaces/Prolog/SICStus/Makefile.am (1.78),
+	  interfaces/Prolog/SWI/Makefile.am (1.75),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.10), interfaces/Prolog/XSB/Makefile.am (1.55),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.9),
+	  interfaces/Prolog/YAP/Makefile.am (1.55): Fixed bugs that
+	  prevented building the library on systems not supported by the
+	  Parma Watchdog Library or when the `--disable-watchdog' configure
+	  was used.  There is still a pending issue concerning the XSB
+	  Prolog interface.
+
+2007-09-29 Saturday 19:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.6): test01 does not fail
+	  unless assertions are enabled.
+
+2007-09-29 Saturday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.3):  The value of the `License' tag is now
+	  `GPLv3+'.
+	  `ppl-swiprolog' dependency on `readline-devel' removed (again).
+
+2007-09-29 Saturday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (simplex.1): file ppl.spec was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-09-27 Thursday 08:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.43): List file
+	  do_not_output_location in MOSTLYCLEANFILES.
+
+2007-09-26 Wednesday 21:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.42), expected_mpz (1.14),
+	  expected_mpz_a (1.13): Do not output the optimum location for
+	  tests adlittle, boeing1, boeing2 and rout, since these may vary
+	  (without affecting the optimum value itself) depending on the
+	  computing platform. Expected results for mpz (with and without
+	  assertions) updated accordingly.
+
+2007-09-26 Wednesday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.10): There is no need to include "pwl.hh" here.
+
+2007-09-26 Wednesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.10): Support for
+	  systems where the Parma Watchdog Library is not available: on
+	  these systems, both ppl_set_timeout/1 and ppl_reset_timeout/0
+	  fail.
+
+2007-09-26 Wednesday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.286): The preprocessor symbol
+	  WATCHDOG_LIBRARY_ENABLED is defined if and only if the Parma
+	  Watchdog Library is enabled.
+
+2007-09-26 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.77): Initial support for
+	  systems where the Parma Watchdog Library is not available.
+
+2007-09-26 Wednesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.11): Cater for systems with no clocks.
+
+2007-09-26 Wednesday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.285): Added checks for the `timeval' type and for
+	  the `getrusage' function.
+
+2007-09-26 Wednesday 13:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.75): If the problem is
+	  optimizable, then the output of the problem state is subsumed by
+	  the output of the optimum value; hence, do output the problem
+	  state only if verbosity == 1.
+
+2007-09-26 Wednesday 13:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.74): A couple of minor corrections
+	  in the usage string.	Option --version replaced by option
+	  --verbosity=LEVEL, taking as argument an integer between 0 and 4
+	  (default 3). The verbosity level is systematically checked before
+	  producing output (except for error messages).
+
+2007-09-26 Wednesday 13:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.41): Cleanup should not depend on
+	  configuration.
+
+2007-09-25 Tuesday 19:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/: Makefile.am (1.9), bug1.cc (1.2), bug2.cc
+	  (1.2), mipproblem2.cc (1.5): Tests bug1.cc and bug2.cc were not
+	  showing real bugs.  Test test01 in miproblem2.cc may also fail
+	  with 8bit integer coefficient and assertions disabled.
+
+2007-09-24 Monday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.54): The special expected_*
+	  files for XSB has been removed, so they are no longer
+	  distributed. Also cut away the corresponding FIXME comment.
+
+2007-09-23 Sunday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int16 (1.4),
+	  XSB/expected_clpq2_int16_a (1.4), XSB/expected_clpq2_int32 (1.4),
+	  XSB/expected_clpq2_int32_a (1.6), XSB/expected_clpq2_int64 (1.4),
+	  XSB/expected_clpq2_int64_a (1.4), XSB/expected_clpq2_int8 (1.5),
+	  XSB/expected_clpq2_int8_a (1.6), XSB/expected_clpq2_mpz (1.4),
+	  XSB/expected_clpq2_mpz_a (1.4), XSB/expected_clpq_int16 (1.6),
+	  XSB/expected_clpq_int16_a (1.6), XSB/expected_clpq_int32 (1.4),
+	  XSB/expected_clpq_int32_a (1.4), XSB/expected_clpq_int64 (1.4),
+	  XSB/expected_clpq_int64_a (1.4), XSB/expected_clpq_int8 (1.4),
+	  XSB/expected_clpq_int8_a (1.4), XSB/expected_clpq_mpz (1.4),
+	  XSB/expected_clpq_mpz_a (1.4), XSB/expected_pchk_int16 (1.5),
+	  XSB/expected_pchk_int16_a (1.5), XSB/expected_pchk_int32 (1.5),
+	  XSB/expected_pchk_int32_a (1.5), XSB/expected_pchk_int64 (1.2),
+	  XSB/expected_pchk_int64_a (1.4), XSB/expected_pchk_int8 (1.5),
+	  XSB/expected_pchk_int8_a (1.6), XSB/expected_pchk_mpz (1.2),
+	  XSB/expected_pchk_mpz_a (1.2), tests/clpq2.pl (1.12): Applied the
+	  workaround suggested by Paul Broome to the XSB bug described in
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2007-September/011126.html.
+	  The special expect-files for XSB are no longer needed.
+
+2007-09-23 Sunday 14:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (1.6): The typedef defined in
+	  this file are now added to the documentation group related to
+	  version checking. (As a side effect, by no longer using \file, we
+	  also avoid a couple of dangling references in the produced docs.)
+
+2007-09-22 Saturday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.53): Apparently, XSB now
+	  implements more of the ISO standard.	This could make the
+	  XSB-specific expect-file useless: they are now still present but
+	  disabled.
+
+2007-09-22 Saturday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.4): Use DO_TEST_F8A to invoke
+	  test01().
+
+2007-09-20 Thursday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.3): Expected results for
+	  test10() fixed.
+
+2007-09-20 Thursday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem3.cc (1.2): Wrap big integer
+	  constants within Coefficient("...").
+
+2007-09-20 Thursday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/Makefile.am (1.10): File ex11.mps has
+	  gone.
+
+2007-09-19 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.40),
+	  demos/ppl_lpsol/examples/ex11.mps (1.4),
+	  tests/MIP_Problem/Makefile.am (1.8),
+	  tests/MIP_Problem/mipproblem1.cc (1.11),
+	  tests/MIP_Problem/mipproblem3.cc (1.1): Test program
+	  mipproblem3.cc forked off mipproblem1.cc.  Example MIP problem
+	  ex11.mps removed and used to write test10() of mipproblem3.cc.
+
+2007-09-19 Wednesday 10:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.50): XSB does not throw
+	  catchable exceptions for integers out of range; so call to
+	  exception_sys_prolog is not made when testing XSB.
+
+2007-09-18 Tuesday 15:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (1.9): Exploit assign_or_swap in the
+	  implementation of grow.  Avoid useless copies/swaps (via grow) in
+	  the implementation of resize_no_copy.
+
+2007-09-18 Tuesday 15:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (1.11): Corrected detailed documentation
+	  for resize_no_copy: it was promising to preserve the old contents
+	  of the matrix.
+
+2007-09-18 Tuesday 15:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.86), Octagonal_Shape.templates.hh
+	  (1.60): Exploit assign_or_swap in the implementation of
+	  remove_space_dimensions and map_space_dimensions.
+
+2007-09-18 Tuesday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (1.7): Added a couple of FIXME's for
+	  places where (sometimes) we could replace expensive copies with
+	  cheaper swaps.
+
+2007-09-18 Tuesday 09:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.59): Removed a few useless
+	  initializations.  Prefer neg_assign(x, y) to x = -y; prefer
+	  neg_assign(x) to beg_assign(x, x).  Move allocation of
+	  temporaries out of loop bodies; reduce the number of temporaries
+	  when the change does not affect code readability.
+
+2007-09-18 Tuesday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.85): Added a comment in a few places
+	  where we use a temporary named `coeff_i' to actually store the
+	  negation of coeff_i (so as to avoid an allocation).
+
+2007-09-17 Monday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.84): For readability, prefer
+	  neg_assign(x) to neg_assign(x, x).
+
+2007-09-17 Monday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (1.7): Typo corrected.
+
+2007-09-16 Sunday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/: Makefile.am (1.6), bug1.cc (1.1), bug2.cc
+	  (1.1): Two programs exhibiting strange behavior on some systems.
+
+2007-09-16 Sunday 18:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: randphull1.cc (1.13), smm1.cc (1.10): Minor
+	  stylistic changes.
+
+2007-09-15 Saturday 19:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/:
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.28), Java/jni/ppl_java_common.cc (1.35),
+	  Java/jni/ppl_java_common.hh (1.29), Java/jni/ppl_java_globals.cc
+	  (1.7), OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.14),
+	  OCaml/ppl_ocaml_globals.cc (1.11),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.48),
+	  Prolog/ppl_prolog_common.icc (1.9): Prefer TEMP_INTEGER to
+	  Coefficient when allocating temporary coefficients.
+
+2007-09-15 Saturday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.12): Made clean up independent from
+	  configuration.
+
+2007-09-15 Saturday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.15): Definition of temporary
+	  coefficients moved out of loop.
+
+2007-09-15 Saturday 16:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.63): Indentation fixed.  Definition of
+	  temporaries factored out of loop.
+
+2007-09-15 Saturday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.83): Temporary definition factored
+	  out of a loop body.
+
+2007-09-15 Saturday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.82): Try to improve the management
+	  of temporary coefficients:   - prefer neg_assign(x, x) to x = -x;
+	  - avoid useless temporaries;   - factor out common temporary
+	  definitions; in particular, speculatively	move temporary
+	  definitions out of loop bodies.
+
+2007-09-15 Saturday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.17), Octagonal_Shape.templates.hh
+	  (1.58): Added a couple of missing spaces.
+
+2007-09-15 Saturday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.62): Added a missing space.
+
+2007-09-15 Saturday 13:38  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.61): FIXME dealt with. A feasible point is
+	  returned correctly if the status of the problem is
+	  `UNBOUNDED_MIP_PROBLEM'. When the status `UNBOUNDED_MIP_PROBLEM'
+	  is detected in `solve_mip', a feasible point is set.
+
+2007-09-15 Saturday 13:19  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.60): Comment fixed.
+
+2007-09-14 Friday 22:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.111): Test randphull2 is no
+	  longer built.
+
+2007-09-14 Friday 22:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Ask_Tell/Makefile.am (1.4), Grid/Makefile.am (1.49),
+	  MIP_Problem/Makefile.am (1.5): Removed old style handling of
+	  tests that are known to fail on some configurations.
+
+2007-09-14 Friday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.54): FIXME resolved.
+
+2007-09-14 Friday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.110), randphull1.cc (1.12),
+	  randphull2.cc (1.11), smm1.cc (1.9): Tests randphull[12] and smm1
+	  now conforms to the STANDARDS for test programs; randphull2
+	  merged into randphull1; the old machinery in Makefile.am for
+	  tests failing with bounded coefficients is no longer needed.
+
+2007-09-14 Friday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.65), GNU/Makefile.am
+	  (1.65), SICStus/Makefile.am (1.76), SWI/Makefile.am (1.74),
+	  XSB/Makefile.am (1.52), YAP/Makefile.am (1.54): Cleanup made
+	  independent from the configuration chosen by the user.
+
+2007-09-14 Friday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/Makefile.am (1.16): Build source file
+	  ppl_predicate_check.pl is only required when the user asks for
+	  some Prolog interface.
+
+2007-09-14 Friday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.42): Built source file
+	  ppl_prolog.icc is only required when the user asks for some
+	  Prolog interface.
+
+2007-09-14 Friday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: Java/Makefile.am (1.13), Java/tests/Makefile.am
+	  (1.16), OCaml/Makefile.am (1.33): Distribution and cleanup made
+	  independent from the configuration chosen by the user.
+
+2007-09-14 Friday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.36): Cleanup should be independent
+	  from the configuration chosen by the user.
+
+2007-09-14 Friday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.44), bug1.cc (1.2), bug2.cc (1.2): The
+	  bug exhibited by bug1.cc and bug2.cc has been fixed.
+
+2007-09-14 Friday 10:10  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.80): Fixed float rounding on
+	  inexact conversion.
+
+2007-09-14 Friday 09:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.43): Restore refine[12].cc.
+
+2007-09-14 Friday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.10): Wrap big integer
+	  constants within Coefficient("...").
+
+2007-09-14 Friday 08:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.9): test18 fails with all
+	  bounded integer coefficient types; test19 fails if less than 64
+	  bit coefficients are used.
+
+2007-09-13 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.42): Temporarily disable also
+	  refine2.cc.
+
+2007-09-13 Thursday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.8): Added test18() and
+	  test19().
+
+2007-09-13 Thursday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.7): Always test the return
+	  value of MIP_Problem::solve().  Added test17().
+
+2007-09-13 Thursday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (1.6): Added test15() and
+	  test16().
+
+2007-09-13 Thursday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.47), Interval.templates.hh (1.1),
+	  Makefile.am (1.173): Interval.templates.hh should contain the
+	  non-inline template functions of the Interval class
+	  implementation.
+
+2007-09-13 Thursday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.41): Do not test with bug*.cc.
+
+2007-09-13 Thursday 19:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.209), debian/libppl-pwl.copyright.in (1.5),
+	  debian/libppl.copyright.in (1.5), doc/definitions.dox (1.204),
+	  doc/devref-c-interface.tex (1.2), doc/devref.tex (1.23),
+	  doc/gpl.dox (1.8), doc/gpl.tex (1.4), doc/gpl.txt (1.4),
+	  doc/user-c-interface.tex (1.2), doc/user-prolog-interface.tex
+	  (1.2), doc/user.tex (1.24), m4/ac_cxx_proper_long_double.m4
+	  (1.2): The Parma Polyhedra Library is now released under the
+	  terms of the version 3 (or later) of the GNU General Public
+	  License.
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: NEWS (1.10), doc/devref.tex (1.3), doc/gpl.dox (1.2),
+	  doc/gpl.tex (1.2), doc/gpl.txt (1.2), doc/user.tex (1.3): The
+	  Parma Watchdog Library is now released under the terms of the
+	  version 3 (or later) of the GNU General Public License.
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.dox (simplex.1): file gpl.dox was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.tex (simplex.1): file gpl.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.txt (simplex.1): file gpl.txt was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-09-13 Thursday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.59): Comment fixed.
+
+2007-09-13 Thursday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/.cvsignore (1.1): Put under CVS control.
+
+2007-09-13 Thursday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:27 +0000
+
+2007-09-13 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.40): Temporarily disable the tests that
+	  are known to fail.
+
+2007-09-13 Thursday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.13), src/MIP_Problem.cc (1.58):
+	  FIXME resolved.  This also makes the PPL independent from the bug
+	  of mpq_get_d() in GMP 4.1.4.
+
+2007-09-13 Thursday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_chdims.cc (1.20): Definition of unused macro removed.
+
+2007-09-13 Thursday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_chdims.cc (1.19), Grid_conversion.cc (1.22),
+	  Grid_simplify.cc (1.35): Pointless inline directives removed.
+
+2007-09-13 Thursday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.51), Grid_nonpublic.cc (1.27): The second
+	  argument of Grid::max_min() was erroneously `char *': it is
+	  `const char*' now.
+
+2007-09-13 Thursday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.57): Simplified the implementation of the
+	  steepest-edge heuristics.
+
+2007-09-13 Thursday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.228): The handling of temporary coefficients has been
+	  redone and the C and Prolog cover all the supported domains.
+
+2007-09-12 Wednesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.39), bug2.cc (1.1): A simplified
+	  version of bug1.cc.
+
+2007-09-12 Wednesday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.38), bug1.cc (1.1): Test program
+	  exhibiting a bug somewhere.
+
+2007-09-12 Wednesday 09:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.284), Watchdog/configure.ac (1.42): Do not allow
+	  AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+
+2007-09-12 Wednesday 00:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.81), MIP_Problem.cc (1.56),
+	  Octagonal_Shape.templates.hh (1.57): Several temporary
+	  Coefficient variables are now allocated via TEMP_INTEGER.
+
+2007-09-11 Tuesday 23:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc (1.31): Typo fixed.
+
+2007-09-11 Tuesday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.80), Box.inlines.hh (1.20),
+	  Box.templates.hh (1.63), Interval_Restriction.defs.hh (1.8),
+	  MIP_Problem.cc (1.55), Octagonal_Shape.templates.hh (1.56),
+	  Polyhedron_nonpublic.cc (1.80), Polyhedron_public.cc (1.95),
+	  checked.inlines.hh (1.39), checked_int.inlines.hh (1.63),
+	  checked_mpz.inlines.hh (1.48), globals.cc (1.30),
+	  globals.inlines.hh (1.19): For temporaries of type mpz_class or
+	  mpq_class, use DIRTY_TEMP0 instead of local variables.
+
+2007-09-11 Tuesday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.79), Octagonal_Shape.templates.hh
+	  (1.55): Useless initializations removed.  For temporaries, use
+	  DIRTY_TEMP instead of local variables.  Code formatting fixes.
+
+2007-09-11 Tuesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.inlines.hh (1.19),
+	  Octagonal_Shape.templates.hh (1.54): For temporaries, use
+	  DIRTY_TEMP instead of local variables.
+
+2007-09-11 Tuesday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_Generator_System.defs.hh (1.26),
+	  Grid_Generator_System.inlines.hh (1.15): Method
+	  is_equal_to(Grid_Generator_System) replaced by is_equal_to(const
+	  Grid_Generator_System&).
+
+2007-09-11 Tuesday 19:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.14), BD_Shape.defs.hh (1.102),
+	  Box.defs.hh (1.28), Checked_Number.defs.hh (1.94),
+	  Congruence_System.defs.hh (1.22), DB_Matrix.defs.hh (1.29),
+	  Direct_Product.defs.hh (1.36), Grid.defs.hh (1.50),
+	  Grid_Generator_System.defs.hh (1.25), MIP_Problem.defs.hh (1.36),
+	  OR_Matrix.defs.hh (1.10), Octagonal_Shape.defs.hh (1.31),
+	  Polyhedron.defs.hh (1.319): Useless const qualifications removed.
+
+2007-09-11 Tuesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.30), Octagonal_Shape.inlines.hh
+	  (1.18): Method add_octagonal_constraint(dimension_type,
+	  dimension_type j, N) replaced by
+	  add_octagonal_constraint(dimension_type, dimension_type j, const
+	  N&).
+
+2007-09-11 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.101), BD_Shape.inlines.hh (1.146):
+	  Method add_dbm_constraint(dimension_type, dimension_type, N)
+	  replaced by add_dbm_constraint(dimension_type, dimension_type,
+	  const N&).
+
+2007-09-11 Tuesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.145), BD_Shape.templates.hh (1.78):
+	  For temporaries, use DIRTY_TEMP instead of local variables.
+
+2007-09-11 Tuesday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.50): Comment revised and turned into a
+	  Doxygen comment.
+
+2007-09-11 Tuesday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Temp.defs.hh (1.7), Temp.inlines.hh (1.2),
+	  Temp.templates.hh (1.2): Comments added.
+
+2007-09-11 Tuesday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.172): New files added to INCLUDE_FILES.
+
+2007-09-11 Tuesday 13:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.cc (1.29), globals.defs.hh (1.49): Switch to the
+	  new technology for the handling of temporaries.
+
+2007-09-11 Tuesday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Temp.defs.hh (1.6), Temp.inlines.hh (1.1),
+	  Temp.templates.hh (1.1): Started the reorganization of the Temp_*
+	  classes.
+
+2007-09-11 Tuesday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.93): Include Slow_Copy.hh.
+
+2007-09-11 Tuesday 11:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh (1.43), checked_mpz.inlines.hh
+	  (1.47): Leave the definition of Slow_Copy for the basic types to
+	  Slow_Copy.hh.
+
+2007-09-11 Tuesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.46), Interval_Restriction.defs.hh
+	  (1.7): Include the new files.
+
+2007-09-11 Tuesday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/assign_or_swap.hh (1.1): The assign_or_swap() utility
+	  functions.
+
+2007-09-11 Tuesday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Has_Assign_Or_Swap.hh (1.2): Spurious code removed.
+
+2007-09-11 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Has_Assign_Or_Swap.hh (1.1): Has_Assign_Or_Swap classes
+	  declarations.
+
+2007-09-11 Tuesday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Slow_Copy.hh (1.2): Multiple-inclusion guards renamed.
+
+2007-09-11 Tuesday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Slow_Copy.hh (1.1): Basic Slow_Copy classes declarations.
+
+2007-09-10 Monday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.73): Use va_start() and va_end()
+	  properly around calls to vfprintf().
+
+2007-09-10 Monday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.283): With GCC, use -frounding-math to disable
+	  transformations and optimizations that assume default floating
+	  point rounding behavior.
+
+2007-09-10 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.41): Added a comment about the
+	  positioning of  AC_PROG_CC and AC_PROG_CXX.
+
+2007-09-10 Monday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.282): Useless quotes removed.
+
+2007-09-10 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.281), Watchdog/configure.ac (1.40): Pass the
+	  no-define option to AM_INIT_AUTOMAKE.
+
+2007-09-10 Monday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.7), config.guess (1.39), config.sub (1.37), depcomp
+	  (1.12), install-sh (1.18), Watchdog/compile (1.7),
+	  Watchdog/config.guess (1.23), Watchdog/config.sub (1.22):
+	  Updated.
+
+2007-09-10 Monday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.280), Watchdog/configure.ac (1.39): Corrections
+	  to the handling of compilation flags.
+
+2007-09-06 Thursday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a (1.12): Updated to reflect changes
+	  in the ordering of the input (caused by upgrade of glpk).
+
+2007-09-06 Thursday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.12): Updated: sometimes the
+	  location of the optimum changes (the optimum staying teh same)
+	  due to the upgrade of glpk, which is used by ppl_lpsol to read in
+	  the lp problems and sometimes reorders the input wrt previous
+	  versions.
+
+2007-09-02 Sunday 17:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.35): Header files ppl_c.h and
+	  ppl_c_version.h should be installed, but they should not be
+	  distributed (since they are generated on-demand): list them in
+	  variable nodist_include_HEADERS, instead of include_HEADERS.
+
+2007-09-01 Saturday 16:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence_System.defs.hh (1.21),
+	  Grid_Generator_System.defs.hh (1.24), Matrix.defs.hh (1.83): In
+	  the Doxygen documentation, don't use \atop and \choose, which
+	  cause problems. Use \genfrac instead.
+
+2007-09-01 Saturday 13:06  Andrea Cimino
+
+	* configure.ac (1.279): The Java interface was unconditionally
+	  built even if not requested by the user with the
+	  `--enable-interface' option: fixed.
+
+2007-09-01 Saturday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.73): When compiling
+	  pl_clpq*, fixed paths for finding pl_clpq*.pl.  (temporary patch;
+	  provide the right path option to the compilation command).
+
+2007-08-31 Friday 16:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.160): Using new doxygen
+	  alias \extref for references to the main manual.
+
+2007-08-31 Friday 16:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-prolog-interface.doxyconf-html.in (1.4),
+	  devref-prolog-interface.doxyconf-latex.in (1.4),
+	  user-prolog-interface.doxyconf-html.in (1.5),
+	  user-prolog-interface.doxyconf-latex.in (1.5): Added command
+	  alias \extref.
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-html.in (simplex.1): file
+	  devref-prolog-interface.doxyconf-html.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-latex.in (simplex.1): file
+	  devref-prolog-interface.doxyconf-latex.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-html.in (simplex.1): file
+	  user-prolog-interface.doxyconf-html.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (simplex.1): file
+	  user-prolog-interface.doxyconf-latex.in was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2007-08-31 Friday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.227): Spurious characters removed.
+
+2007-08-31 Friday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* fedora/ppl.spec (1.2): New packages `ppl-ocaml' and
+	  `ppl-ocaml-devel' contain the OCaml interface.
+
+2007-08-31 Friday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.278), demos/ppl_lpsol/ppl_lpsol.c (1.72): Should
+	  support all versions of GLPK now.  Diagnostics of ppl_lpsol
+	  improved.
+
+2007-08-31 Friday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.55): Remove spurious line continuation
+	  character that was preventing distribution of the core PS
+	  manuals.
+
+2007-08-31 Friday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/README.ocaml (simplex.1): file README.ocaml was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2007-08-31 Friday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.226), interfaces/OCaml/README.ocaml (1.1): New file
+	  README.ocaml, still to be written properly.
+
+2007-08-31 Friday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.72): Dependencies fixed.
+
+2007-08-31 Friday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.277), demos/ppl_lpsol/ppl_lpsol.c (1.71): Support
+	  GLPK versions up to 4.15, both installed from a source package or
+	  from Fedora RPM packages.
+
+2007-08-31 Friday 08:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.27): Directory interfaces has to be
+	  processed before its subdirs.
+
+2007-08-30 Thursday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.42), configure.ac (1.276), ppl.spec.in (1.31),
+	  fedora/Makefile.am (1.1), fedora/ppl.spec (1.1): New placement
+	  for the Fedora PPL spec file.  It did not make much sense to have
+	  the PPL version number be filled in automatically.
+
+2007-08-30 Thursday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.54): Install (and uninstall) also the TODO
+	  file.
+
+2007-08-30 Thursday 18:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.51): Always use the -fPIC
+	  option when compiling the C/C++ foreign modules.
+
+2007-08-30 Thursday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.53): Distribute README.yap.
+
+2007-08-30 Thursday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.71): Distribute
+	  README.swiprolog.
+
+2007-08-30 Thursday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.64): Distribute
+	  README.gprolog.
+
+2007-08-30 Thursday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README (1.3): Obsolete file removed.
+
+2007-08-30 Thursday 15:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.2): Made consistent with respect
+	  to the currently generated C interface.  Using new Doxygen alias
+	  \extref when referring to the main manual.
+
+2007-08-30 Thursday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.5),
+	  devref-c-interface.doxyconf-latex.in (1.5),
+	  devref-c-interface.tex (1.1), user-c-interface.doxyconf-html.in
+	  (1.6), user-c-interface.doxyconf-latex.in (1.6): Added main title
+	  page for the LaTeX version of the C interface devref.  Added
+	  Doxygen alias \extref for references to external documentation:
+	  it behaves as \ref for the HTML documentation (exploiting TAG
+	  files), it simply prints the second argument for the LaTeX
+	  documentation (since these seems not to be able to exploit TAG
+	  files). By using \extref we should be able to avoid dozens of
+	  annoying Doxygen warnings when producing the manuals for foreign
+	  language interfaces.
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-html.in (simplex.1): file
+	  devref-c-interface.doxyconf-html.in was added on branch simplex
+	  on 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-latex.in (simplex.1): file
+	  devref-c-interface.doxyconf-latex.in was added on branch simplex
+	  on 2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-html.in (simplex.1): file
+	  user-c-interface.doxyconf-html.in was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-latex.in (simplex.1): file
+	  user-c-interface.doxyconf-latex.in was added on branch simplex on
+	  2008-01-07 11:15:27 +0000
+
+2007-08-30 Thursday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-prolog-interface.doxyconf-html.in (1.4),
+	  user-prolog-interface.doxyconf-latex.in (1.4): Updated to Doxygen
+	  1.5.3.  Use user-prolog-interface.tex for the LaTeX version.
+
+2007-08-30 Thursday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-prolog-interface.tex (1.1): Put under CVS control.
+
+2007-08-30 Thursday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.4),
+	  devref-c-interface.doxyconf-latex.in (1.4),
+	  user-c-interface.doxyconf-html.in (1.5),
+	  user-c-interface.doxyconf-latex.in (1.5): Added C_interface.dox
+	  to the documentation INPUT files.
+
+2007-08-30 Thursday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.53): C interface docs depends on
+	  interfaces/C/C_interface.dox.
+
+2007-08-30 Thursday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/C_interface.dox (1.1): Recovered documentation for
+	  the C interface types and functions related to convex polyhedra.
+	  This file will not be compiled (since the functions will be
+	  automatically generated), it just serve as a template
+	  documentation for all kind of domains. To be checked for
+	  completeness wrt the actually generated code.
+
+2007-08-28 Tuesday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: Makefile.am (1.28), ppl_c.m4 (1.1): Initial implementation
+	  of the new function AM_PATH_PPL_C to to test for the existence
+	  and usability of particular versions of the C interface of the
+	  PPL, defining macros containing the required paths.
+
+2007-08-28 Tuesday 15:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.8): Several bugs fixed.
+
+2007-08-28 Tuesday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.275): Version number bumped.
+
+2007-08-27 Monday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.7): Trailing whitespace removed.
+
+2007-08-27 Monday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.34): Install also ppl_c.h.
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/: user.doxyconf-html.in (1.2),
+	  user.doxyconf-latex.in (1.2): Updated to Doxygen 1.5.3-20070815.
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-html.in (simplex.1): file
+	  user.doxyconf-html.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-08-27 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-latex.in (simplex.1): file
+	  user.doxyconf-latex.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-08-26 Sunday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.225): Noted that it would be nice to have an
+	  implementation of Minkowski addition.
+
+2007-08-26 Sunday 17:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.224): Added a note about the work of Kent Andersen and
+	  Gerard Cornuejols.
+
+2007-08-03 Friday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.203): Avoid duplicated section label.
+
+2007-08-02 Thursday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-c-interface.doxyconf-html.in (1.4),
+	  user-c-interface.doxyconf-latex.in (1.4), user-c-interface.tex
+	  (1.1): Upgraded to doxygen version 1.5.3.  Changed LATEX_HEADER
+	  so as to be specific for the C interface.
+
+2007-08-02 Thursday 13:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.17): Do
+	  initialize a local Boolean variable passed by reference, so as to
+	  avoid 4 annoying warnings.
+
+2007-08-02 Thursday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/meta_programming.hh (1.8): Do hide documentation of inner
+	  class Is_Same_Or_Derived::Any.
+
+2007-08-02 Thursday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.84), devref.doxyconf-latex.in
+	  (1.23): Upgraded to doxygen version 1.5.3.  Added
+	  Interval_Restriction.defs.hh and Interval_Info.* to INPUT.
+
+2007-08-02 Thursday 09:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.41), user.doxyconf-latex.in
+	  (1.12): Upgraded to doxygen version 1.5.3.
+
+2007-08-02 Thursday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/meta_programming.hh (1.7): Added \ingroup doxygen command to
+	  several class definitions.
+
+2007-08-02 Thursday 09:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.92), Checked_Number.inlines.hh
+	  (1.76): Minor formatting improvements, as well as the addition of
+	  some doxygen commands.
+
+2007-08-02 Thursday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.inlines.hh (1.5): Fixed a couple of \relates
+	  commands.
+
+2007-07-30 Monday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.45): Doxygen documentation should be
+	  associated to members' declarations, rather than members'
+	  implementation. Also removed a couple of inappropriate \relates
+	  commands (which should only be used for functions that are NOT
+	  members of a class).
+
+2007-07-30 Monday 13:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.14): Added a couple of missing
+	  \relates Doxygen commands.
+
+2007-07-30 Monday 13:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.62): Removed optional (and usually
+	  omitted) template instantiations, which were also causing a
+	  Doxygen warning.
+
+2007-07-30 Monday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (1.19): Removed optional (and usually omitted)
+	  template instantiation, which was also causing a Doxygen warning.
+
+2007-07-30 Monday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.83), devref.doxyconf-latex.in
+	  (1.22): Add meta_programming.hh to variable INPUT.
+
+2007-07-30 Monday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.41), Watchdog/Makefile.am (1.32): Added a comment
+	  on the need to explicitly clean files generated by macro
+	  AX_PREFIX_CONFIG_H.
+
+2007-07-29 Sunday 16:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Makefile.am (1.40), Watchdog/Makefile.am (1.31): The prefixed
+	  configuration header and _config.sed added to DESTCLEANFILES.
+
+2007-07-17 Tuesday 08:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.223): Remember to have a look at
+
+
+	  http://www.inf.ethz.ch/personal/gonnet/FPAccuracy/Analysis.html
+
+	  especially at the "Surprises" section, where it talks about
+	  rounding problems for division and multiplication on Pentium/AMD.
+
+2007-07-13 Friday 15:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/Makefile.am (1.52): The foreign language interface manuals in
+	  HTML format depend on the corresponding core manuals (due to the
+	  use of Doxygen generated tag files).
+
+2007-07-12 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.4), Makefile.am (1.39), README (1.51),
+	  README.configure (1.20), configure.ac (1.274), instchk.hh (1.9),
+	  Watchdog/COPYING (1.4), Watchdog/Makefile.am (1.30),
+	  Watchdog/README (1.16), Watchdog/configure.ac (1.38),
+	  Watchdog/doc/Makefile.am (1.3), Watchdog/doc/README.doc (1.2),
+	  Watchdog/doc/devref.tex (1.2), Watchdog/doc/pwl.sty (1.2),
+	  Watchdog/doc/user.tex (1.2), Watchdog/m4/Makefile.am (1.2),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.4),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.4),
+	  Watchdog/src/EList.defs.hh (1.6), Watchdog/src/EList.inlines.hh
+	  (1.4), Watchdog/src/EList_Iterator.defs.hh (1.4),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.4),
+	  Watchdog/src/Handler.defs.hh (1.5),
+	  Watchdog/src/Handler.inlines.hh (1.4), Watchdog/src/Makefile.am
+	  (1.11), Watchdog/src/Pending_Element.cc (1.5),
+	  Watchdog/src/Pending_Element.defs.hh (1.5),
+	  Watchdog/src/Pending_Element.inlines.hh (1.4),
+	  Watchdog/src/Pending_List.cc (1.5),
+	  Watchdog/src/Pending_List.defs.hh (1.5),
+	  Watchdog/src/Pending_List.inlines.hh (1.4), Watchdog/src/Time.cc
+	  (1.5), Watchdog/src/Time.defs.hh (1.5),
+	  Watchdog/src/Time.inlines.hh (1.4), Watchdog/src/Watchdog.cc
+	  (1.7), Watchdog/src/Watchdog.defs.hh (1.6),
+	  Watchdog/src/Watchdog.inlines.hh (1.4),
+	  Watchdog/src/pwl_header.hh (1.5), Watchdog/utils/Makefile.am
+	  (1.8), Watchdog/utils/build_header.in (1.5), debian/Makefile.am
+	  (1.4), demos/Makefile.am (1.11), demos/ppl_lcdd/Makefile.am
+	  (1.28), demos/ppl_lcdd/ppl_lcdd.cc (1.60),
+	  demos/ppl_lcdd/examples/Makefile.am (1.9),
+	  demos/ppl_lpsol/Makefile.am (1.39), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.70), demos/ppl_lpsol/examples/Makefile.am (1.9),
+	  doc/Makefile.am (1.51), doc/README.doc (1.12), doc/devref.tex
+	  (1.22), doc/ppl.sty (1.27), doc/user.tex (1.23),
+	  interfaces/Makefile.am (1.26),
+	  interfaces/ppl_interface_generator_common.m4 (1.18),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.31),
+	  interfaces/ppl_interface_generator_copyright (1.4),
+	  interfaces/C/Makefile.am (1.33), interfaces/C/ppl_c.h.in (1.72),
+	  interfaces/C/ppl_c_version.h.in (1.5),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.8),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.16),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.11),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.12),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.12),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.9),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.8),
+	  interfaces/Java/Makefile.am (1.12),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.8),
+	  interfaces/Java/jni/Makefile.am (1.14),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.9),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.27), interfaces/Java/jni/ppl_java_common.cc (1.34),
+	  interfaces/Java/jni/ppl_java_common.hh (1.28),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.6),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.12),
+	  interfaces/Java/tests/Makefile.am (1.15),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.3),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.9),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.17), interfaces/OCaml/Makefile.am (1.32),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.4),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.13),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.6),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.9),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.13),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.7),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.10),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.7),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.10),
+	  interfaces/OCaml/test1.ml (1.30), interfaces/Prolog/Makefile.am
+	  (1.41), interfaces/Prolog/Prolog_interface.dox (1.159),
+	  interfaces/Prolog/exceptions.hh (1.25),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.34),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.11),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.47),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.10), interfaces/Prolog/ppl_prolog_common.icc (1.8),
+	  interfaces/Prolog/track_allocation.hh (1.23),
+	  interfaces/Prolog/Ciao/Makefile.am (1.64),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.3),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.19),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.15),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.26),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.50),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.6),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.5), interfaces/Prolog/GNU/Makefile.am (1.63),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.11),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.12),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.3),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.43),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.6), interfaces/Prolog/SICStus/Makefile.am (1.75),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.9), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.28),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.8),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.10),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.17),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.16),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.10),
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl (1.3),
+	  interfaces/Prolog/SWI/Makefile.am (1.70),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.12),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.11),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.9), interfaces/Prolog/SWI/ppl_pl.cc (1.12),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.8),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.5),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.10),
+	  interfaces/Prolog/SWI/swi_predicate_check.pl (1.3),
+	  interfaces/Prolog/XSB/Makefile.am (1.50),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.7),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.8),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.5), interfaces/Prolog/XSB/xsb_cfli.hh (1.3),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.18),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.16),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.30),
+	  interfaces/Prolog/YAP/Makefile.am (1.52),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.7),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.12),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.3),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.13),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.9),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.13),
+	  interfaces/Prolog/tests/Makefile.am (1.15),
+	  interfaces/Prolog/tests/clpq.pl (1.10),
+	  interfaces/Prolog/tests/clpq2.pl (1.11),
+	  interfaces/Prolog/tests/pl_check.pl (1.49),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.5),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.50),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.27), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.4), m4/Makefile.am (1.27), m4/ac_check_fpu_control.m4 (1.5),
+	  m4/ac_check_gmp.m4 (1.25), m4/ac_check_sicstus_prolog.m4 (1.6),
+	  m4/ac_check_swi_prolog.m4 (1.11), m4/ac_check_xsb_prolog.m4
+	  (1.4), m4/ac_cxx_attribute_weak.m4 (1.9),
+	  m4/ac_cxx_double_binary_format.m4 (1.6),
+	  m4/ac_cxx_flexible_arrays.m4 (1.14),
+	  m4/ac_cxx_float_binary_format.m4 (1.5),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.6),
+	  m4/ac_cxx_remainder_bug.m4 (1.2), m4/ac_prog_javac.m4 (1.6),
+	  m4/ac_text_md5sum.m4 (1.3), m4/ppl.m4 (1.6),
+	  src/Any_Pointset.defs.hh (1.13), src/Any_Pointset.inlines.hh
+	  (1.3), src/Ask_Tell.defs.hh (1.17), src/Ask_Tell.inlines.hh
+	  (1.16), src/Ask_Tell.templates.hh (1.9), src/BDS_Status.idefs.hh
+	  (1.21), src/BDS_Status.inlines.hh (1.16), src/BD_Shape.cc (1.7),
+	  src/BD_Shape.defs.hh (1.100), src/BD_Shape.inlines.hh (1.144),
+	  src/BD_Shape.templates.hh (1.77), src/BHRZ03_Certificate.cc
+	  (1.13), src/BHRZ03_Certificate.defs.hh (1.18),
+	  src/BHRZ03_Certificate.inlines.hh (1.9), src/Bit_Matrix.cc (1.4),
+	  src/Bit_Matrix.defs.hh (1.4), src/Bit_Matrix.inlines.hh (1.3),
+	  src/Bit_Row.cc (1.4), src/Bit_Row.defs.hh (1.6),
+	  src/Bit_Row.inlines.hh (1.4), src/Boundary.defs.hh (1.8),
+	  src/Box.cc (1.7), src/Box.defs.hh (1.27), src/Box.inlines.hh
+	  (1.18), src/Box.templates.hh (1.61), src/C_Integer.hh (1.5),
+	  src/C_Polyhedron.cc (1.22), src/C_Polyhedron.defs.hh (1.48),
+	  src/C_Polyhedron.inlines.hh (1.36), src/Checked_Number.cc (1.13),
+	  src/Checked_Number.defs.hh (1.91), src/Checked_Number.inlines.hh
+	  (1.75), src/Coefficient.cc (1.7), src/Coefficient.defs.hh (1.9),
+	  src/Coefficient.inlines.hh (1.7), src/Congruence.cc (1.16),
+	  src/Congruence.defs.hh (1.20), src/Congruence.inlines.hh (1.16),
+	  src/Congruence_System.cc (1.25), src/Congruence_System.defs.hh
+	  (1.20), src/Congruence_System.inlines.hh (1.9), src/Constraint.cc
+	  (1.67), src/Constraint.defs.hh (1.125), src/Constraint.inlines.hh
+	  (1.67), src/Constraint_System.cc (1.24),
+	  src/Constraint_System.defs.hh (1.37),
+	  src/Constraint_System.inlines.hh (1.10), src/DB_Matrix.defs.hh
+	  (1.28), src/DB_Matrix.inlines.hh (1.33),
+	  src/DB_Matrix.templates.hh (1.6), src/DB_Row.defs.hh (1.24),
+	  src/DB_Row.inlines.hh (1.23), src/DB_Row.templates.hh (1.7),
+	  src/Determinate.defs.hh (1.67), src/Determinate.inlines.hh
+	  (1.57), src/Direct_Product.defs.hh (1.35),
+	  src/Direct_Product.inlines.hh (1.31),
+	  src/Direct_Product.templates.hh (1.22), src/Float.cc (1.7),
+	  src/Float.defs.hh (1.26), src/Float.inlines.hh (1.31),
+	  src/GMP_Integer.defs.hh (1.26), src/GMP_Integer.inlines.hh
+	  (1.21), src/Generator.cc (1.75), src/Generator.defs.hh (1.123),
+	  src/Generator.inlines.hh (1.61), src/Generator_System.cc (1.23),
+	  src/Generator_System.defs.hh (1.24),
+	  src/Generator_System.inlines.hh (1.9), src/Grid.defs.hh (1.49),
+	  src/Grid.inlines.hh (1.15), src/Grid.templates.hh (1.31),
+	  src/Grid_Certificate.cc (1.9), src/Grid_Certificate.defs.hh
+	  (1.6), src/Grid_Certificate.inlines.hh (1.4),
+	  src/Grid_Generator.cc (1.21), src/Grid_Generator.defs.hh (1.31),
+	  src/Grid_Generator.inlines.hh (1.14),
+	  src/Grid_Generator_System.cc (1.19),
+	  src/Grid_Generator_System.defs.hh (1.23),
+	  src/Grid_Generator_System.inlines.hh (1.14), src/Grid_Status.cc
+	  (1.8), src/Grid_Status.idefs.hh (1.7), src/Grid_Status.inlines.hh
+	  (1.4), src/Grid_chdims.cc (1.18), src/Grid_conversion.cc (1.21),
+	  src/Grid_nonpublic.cc (1.26), src/Grid_public.cc (1.53),
+	  src/Grid_simplify.cc (1.34), src/Grid_widenings.cc (1.16),
+	  src/H79_Certificate.cc (1.12), src/H79_Certificate.defs.hh
+	  (1.16), src/H79_Certificate.inlines.hh (1.10), src/Init.cc
+	  (1.31), src/Init.defs.hh (1.19), src/Interval.defs.hh (1.44),
+	  src/Interval.inlines.hh (1.27), src/Interval_Info.defs.hh (1.5),
+	  src/Interval_Info.inlines.hh (1.4),
+	  src/Interval_Restriction.defs.hh (1.6), src/Linear_Expression.cc
+	  (1.18), src/Linear_Expression.defs.hh (1.35),
+	  src/Linear_Expression.inlines.hh (1.11), src/Linear_Row.cc
+	  (1.23), src/Linear_Row.defs.hh (1.25), src/Linear_Row.inlines.hh
+	  (1.13), src/Linear_System.cc (1.44), src/Linear_System.defs.hh
+	  (1.32), src/Linear_System.inlines.hh (1.23), src/MIP_Problem.cc
+	  (1.54), src/MIP_Problem.defs.hh (1.35),
+	  src/MIP_Problem.inlines.hh (1.16), src/MIP_Problem.templates.hh
+	  (1.11), src/Makefile.am (1.171), src/Matrix.cc (1.97),
+	  src/Matrix.defs.hh (1.82), src/Matrix.inlines.hh (1.52),
+	  src/NNC_Polyhedron.cc (1.22), src/NNC_Polyhedron.defs.hh (1.50),
+	  src/NNC_Polyhedron.inlines.hh (1.37), src/Numeric_Format.defs.hh
+	  (1.7), src/OR_Matrix.defs.hh (1.9), src/OR_Matrix.inlines.hh
+	  (1.8), src/OR_Matrix.templates.hh (1.6), src/Octagonal_Shape.cc
+	  (1.6), src/Octagonal_Shape.defs.hh (1.29),
+	  src/Octagonal_Shape.inlines.hh (1.17),
+	  src/Octagonal_Shape.templates.hh (1.53), src/Og_Status.idefs.hh
+	  (1.7), src/Og_Status.inlines.hh (1.5), src/Ph_Status.cc (1.14),
+	  src/Ph_Status.idefs.hh (1.21), src/Ph_Status.inlines.hh (1.9),
+	  src/Pointset_Ask_Tell.cc (1.4), src/Pointset_Ask_Tell.defs.hh
+	  (1.11), src/Pointset_Ask_Tell.inlines.hh (1.5),
+	  src/Pointset_Ask_Tell.templates.hh (1.9),
+	  src/Pointset_Powerset.cc (1.13), src/Pointset_Powerset.defs.hh
+	  (1.18), src/Pointset_Powerset.inlines.hh (1.8),
+	  src/Pointset_Powerset.templates.hh (1.14),
+	  src/Poly_Con_Relation.cc (1.16), src/Poly_Con_Relation.defs.hh
+	  (1.34), src/Poly_Con_Relation.inlines.hh (1.16),
+	  src/Poly_Gen_Relation.cc (1.16), src/Poly_Gen_Relation.defs.hh
+	  (1.32), src/Poly_Gen_Relation.inlines.hh (1.16),
+	  src/Polyhedron.defs.hh (1.318), src/Polyhedron.inlines.hh
+	  (1.141), src/Polyhedron.templates.hh (1.14),
+	  src/Polyhedron_chdims.cc (1.44), src/Polyhedron_nonpublic.cc
+	  (1.79), src/Polyhedron_public.cc (1.94),
+	  src/Polyhedron_widenings.cc (1.63), src/Powerset.defs.hh (1.30),
+	  src/Powerset.inlines.hh (1.20), src/Powerset.templates.hh (1.5),
+	  src/Ptr_Iterator.defs.hh (1.10), src/Ptr_Iterator.inlines.hh
+	  (1.8), src/Rational_Box.hh (1.6), src/Result.defs.hh (1.19),
+	  src/Result.inlines.hh (1.11), src/Rounding_Dir.defs.hh (1.13),
+	  src/Rounding_Dir.inlines.hh (1.7), src/Row.cc (1.104),
+	  src/Row.defs.hh (1.112), src/Row.inlines.hh (1.66),
+	  src/Scalar_Products.cc (1.9), src/Scalar_Products.defs.hh (1.10),
+	  src/Scalar_Products.inlines.hh (1.6), src/Temp.defs.hh (1.5),
+	  src/Variable.cc (1.24), src/Variable.defs.hh (1.54),
+	  src/Variable.inlines.hh (1.25), src/Variables_Set.cc (1.6),
+	  src/Variables_Set.defs.hh (1.7), src/Variables_Set.inlines.hh
+	  (1.5), src/Widening_Function.defs.hh (1.18),
+	  src/Widening_Function.inlines.hh (1.15), src/algorithms.hh
+	  (1.49), src/checked.cc (1.21), src/checked.defs.hh (1.42),
+	  src/checked.inlines.hh (1.38), src/checked_ext.defs.hh (1.13),
+	  src/checked_ext.inlines.hh (1.39), src/checked_float.inlines.hh
+	  (1.79), src/checked_int.inlines.hh (1.62),
+	  src/checked_mpq.inlines.hh (1.42), src/checked_mpz.inlines.hh
+	  (1.46), src/checked_numeric_limits.hh (1.21), src/compiler.hh
+	  (1.11), src/conversion.cc (1.83), src/distances.defs.hh (1.4),
+	  src/distances.inlines.hh (1.5), src/fpu-c99.inlines.hh (1.15),
+	  src/fpu-ia32.inlines.hh (1.17), src/fpu-none.inlines.hh (1.7),
+	  src/fpu-sparc.inlines.hh (1.9), src/fpu.defs.hh (1.16),
+	  src/globals.cc (1.28), src/globals.defs.hh (1.48),
+	  src/globals.inlines.hh (1.18), src/initializer.hh (1.14),
+	  src/iterator_to_const.defs.hh (1.6),
+	  src/iterator_to_const.inlines.hh (1.4),
+	  src/max_space_dimension.hh (1.13), src/meta_programming.hh (1.6),
+	  src/minimize.cc (1.48), src/mp_std_bits.cc (1.5),
+	  src/mp_std_bits.defs.hh (1.5), src/mp_std_bits.inlines.hh (1.4),
+	  src/namespaces.hh (1.12), src/ppl-config.cc.in (1.21),
+	  src/ppl_header.hh (1.7), src/simplify.cc (1.49),
+	  src/swapping_sort.icc (1.13), src/version.cc (1.10),
+	  src/version.hh.in (1.16), tests/FCAIBVP.cc (1.5),
+	  tests/FCAIBVP.defs.hh (1.5), tests/FCAIBVP.inlines.hh (1.5),
+	  tests/Makefile.am (1.263), tests/Partial_Function.cc (1.6),
+	  tests/Partial_Function.defs.hh (1.4),
+	  tests/Partial_Function.inlines.hh (1.3),
+	  tests/Random_Number_Generator.defs.hh (1.5),
+	  tests/Random_Number_Generator.inlines.hh (1.10), tests/files.cc
+	  (1.10), tests/files.hh (1.11), tests/ppl_test.cc (1.10),
+	  tests/ppl_test.hh (1.65), tests/print.cc (1.28), tests/print.hh
+	  (1.42), tests/Ask_Tell/Makefile.am (1.3),
+	  tests/Ask_Tell/append1.cc (1.6), tests/BD_Shape/Makefile.am
+	  (1.66), tests/BD_Shape/addconstraints1.cc (1.18),
+	  tests/BD_Shape/addspacedims1.cc (1.15),
+	  tests/BD_Shape/affinedimension1.cc (1.12),
+	  tests/BD_Shape/affineimage1.cc (1.19),
+	  tests/BD_Shape/affineimage2.cc (1.13),
+	  tests/BD_Shape/affinepreimage1.cc (1.21),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.15),
+	  tests/BD_Shape/bdsdifference1.cc (1.15),
+	  tests/BD_Shape/bdshull1.cc (1.16),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.10),
+	  tests/BD_Shape/bhmz05widening1.cc (1.15),
+	  tests/BD_Shape/bhz03widening1.cc (1.10),
+	  tests/BD_Shape/bounded1.cc (1.3),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.4),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.3),
+	  tests/BD_Shape/bounds1.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.19),
+	  tests/BD_Shape/cc76narrowing1.cc (1.18),
+	  tests/BD_Shape/closure1.cc (1.20), tests/BD_Shape/concatenate1.cc
+	  (1.14), tests/BD_Shape/constraints1.cc (1.19),
+	  tests/BD_Shape/contains1.cc (1.15),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.3),
+	  tests/BD_Shape/discrete1.cc (1.3), tests/BD_Shape/disjoint1.cc
+	  (1.6), tests/BD_Shape/empty1.cc (1.11),
+	  tests/BD_Shape/equality1.cc (1.16),
+	  tests/BD_Shape/expandspacedim1.cc (1.4),
+	  tests/BD_Shape/foldspacedims1.cc (1.6),
+	  tests/BD_Shape/fromgensys1.cc (1.15),
+	  tests/BD_Shape/frompolyhedron1.cc (1.5),
+	  tests/BD_Shape/fromspacedim1.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.17),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.21),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.15),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.16),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.6),
+	  tests/BD_Shape/geomcovers1.cc (1.10),
+	  tests/BD_Shape/h79widening1.cc (1.13),
+	  tests/BD_Shape/intersection1.cc (1.18),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.14),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.15),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.14),
+	  tests/BD_Shape/mapspacedims1.cc (1.15),
+	  tests/BD_Shape/max_min1.cc (1.3), tests/BD_Shape/max_min2.cc
+	  (1.5), tests/BD_Shape/maxspacedim1.cc (1.4),
+	  tests/BD_Shape/membytes1.cc (1.3),
+	  tests/BD_Shape/minconstraints1.cc (1.11),
+	  tests/BD_Shape/relations1.cc (1.18), tests/BD_Shape/relations2.cc
+	  (1.22), tests/BD_Shape/relations3.cc (1.26),
+	  tests/BD_Shape/removespacedims1.cc (1.20),
+	  tests/BD_Shape/run_tests (1.19), tests/BD_Shape/timeelapse1.cc
+	  (1.20), tests/BD_Shape/universe1.cc (1.15),
+	  tests/BD_Shape/writebdshape1.cc (1.10), tests/Box/Makefile.am
+	  (1.37), tests/Box/addconstraints1.cc (1.8),
+	  tests/Box/addspacedims1.cc (1.4), tests/Box/affinedimension1.cc
+	  (1.6), tests/Box/affineimage1.cc (1.7),
+	  tests/Box/affinepreimage1.cc (1.4), tests/Box/ascii_dump_load1.cc
+	  (1.4), tests/Box/bdsdifference1.cc (1.5),
+	  tests/Box/bgp99extrapolation1.cc (1.4),
+	  tests/Box/bhz03widening1.cc (1.4), tests/Box/bounded1.cc (1.4),
+	  tests/Box/boundedaffineimage1.cc (1.4),
+	  tests/Box/boxdifference1.cc (1.6), tests/Box/boxhull.cc (1.4),
+	  tests/Box/boxhull1.cc (1.5), tests/Box/cc76narrowing1.cc (1.5),
+	  tests/Box/cc76widening.cc (1.5), tests/Box/closure1.cc (1.4),
+	  tests/Box/concatenate1.cc (1.5), tests/Box/constraints1.cc (1.4),
+	  tests/Box/contains1.cc (1.5), tests/Box/containsintegerpoint1.cc
+	  (1.6), tests/Box/discrete1.cc (1.5), tests/Box/disjoint1.cc
+	  (1.5), tests/Box/empty1.cc (1.5), tests/Box/equality1.cc (1.5),
+	  tests/Box/expandspacedim1.cc (1.6), tests/Box/foldspacedims1.cc
+	  (1.7), tests/Box/frombdshape1.cc (1.2), tests/Box/frombox1.cc
+	  (1.3), tests/Box/fromdirectproduct1.cc (1.5),
+	  tests/Box/fromgensys1.cc (1.4), tests/Box/fromgrid1.cc (1.5),
+	  tests/Box/frompolyhedron1.cc (1.11), tests/Box/frompolyhedron2.cc
+	  (1.9), tests/Box/fromspacedim1.cc (1.2),
+	  tests/Box/generalizedaffineimage1.cc (1.5),
+	  tests/Box/generalizedaffinepreimage1.cc (1.5),
+	  tests/Box/geomcovers1.cc (1.4), tests/Box/intersection1.cc (1.6),
+	  tests/Box/interval1.cc (1.4), tests/Box/interval2.cc (1.4),
+	  tests/Box/mapspacedims1.cc (1.4), tests/Box/max_min1.cc (1.6),
+	  tests/Box/maxspacedim1.cc (1.5), tests/Box/membytes1.cc (1.4),
+	  tests/Box/minconstraints1.cc (1.5),
+	  tests/Box/pointsetpowerset1.cc (1.3), tests/Box/refine1.cc
+	  (1.10), tests/Box/refine2.cc (1.9), tests/Box/refine3.cc (1.2),
+	  tests/Box/relations1.cc (1.5), tests/Box/relations2.cc (1.3),
+	  tests/Box/removespacedims1.cc (1.6), tests/Box/run_tests (1.3),
+	  tests/Box/timeelapse1.cc (1.5), tests/Box/universe1.cc (1.4),
+	  tests/Box/writebox1.cc (1.4), tests/Grid/Makefile.am (1.48),
+	  tests/Grid/addcongruence1.cc (1.14),
+	  tests/Grid/addcongruences1.cc (1.17),
+	  tests/Grid/addconstraint1.cc (1.12),
+	  tests/Grid/addconstraints1.cc (1.13), tests/Grid/addgenerator1.cc
+	  (1.16), tests/Grid/addgenerators1.cc (1.16),
+	  tests/Grid/addspacedims1.cc (1.15), tests/Grid/affinedim1.cc
+	  (1.12), tests/Grid/affineimage1.cc (1.14),
+	  tests/Grid/affineimage2.cc (1.12), tests/Grid/affinepreimage1.cc
+	  (1.13), tests/Grid/affinepreimage2.cc (1.8),
+	  tests/Grid/approximatepartition1.cc (1.3),
+	  tests/Grid/asciidumpload1.cc (1.14), tests/Grid/asciidumpload2.cc
+	  (1.6), tests/Grid/asciidumpload3.cc (1.5),
+	  tests/Grid/asciidumpload4.cc (1.5), tests/Grid/asciidumpload5.cc
+	  (1.3), tests/Grid/asciidumpload6.cc (1.3),
+	  tests/Grid/asciidumpload7.cc (1.3), tests/Grid/bhz03widening1.cc
+	  (1.13), tests/Grid/bounded1.cc (1.14),
+	  tests/Grid/boundedaffineimage1.cc (1.4),
+	  tests/Grid/boundedaffinepreimage1.cc (1.4),
+	  tests/Grid/boundingbox1.cc (1.19), tests/Grid/bounds1.cc (1.15),
+	  tests/Grid/certificate1.cc (1.14), tests/Grid/concatenate1.cc
+	  (1.14), tests/Grid/congruence1.cc (1.17),
+	  tests/Grid/congruences1.cc (1.12), tests/Grid/congruences2.cc
+	  (1.6), tests/Grid/contains1.cc (1.12),
+	  tests/Grid/containsintegerpoint1.cc (1.4),
+	  tests/Grid/copyconstruct1.cc (1.8), tests/Grid/coveringbox1.cc
+	  (1.16), tests/Grid/coveringbox2.cc (1.14),
+	  tests/Grid/directproduct1.cc (1.28), tests/Grid/directproduct2.cc
+	  (1.6), tests/Grid/discrete1.cc (1.8), tests/Grid/disjoint1.cc
+	  (1.12), tests/Grid/equals1.cc (1.13),
+	  tests/Grid/expandspacedim1.cc (1.12),
+	  tests/Grid/foldspacedims1.cc (1.12),
+	  tests/Grid/generalizedaffineimage1.cc (1.14),
+	  tests/Grid/generalizedaffineimage2.cc (1.13),
+	  tests/Grid/generalizedaffineimage3.cc (1.5),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.16),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.16),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.5),
+	  tests/Grid/generator1.cc (1.20), tests/Grid/generators1.cc
+	  (1.13), tests/Grid/generators2.cc (1.3), tests/Grid/grid1.cc
+	  (1.21), tests/Grid/grid2.cc (1.16), tests/Grid/grid3.cc (1.20),
+	  tests/Grid/griddifference1.cc (1.12), tests/Grid/intersection1.cc
+	  (1.12), tests/Grid/isempty1.cc (1.8), tests/Grid/isuniverse1.cc
+	  (1.10), tests/Grid/join1.cc (1.16), tests/Grid/join2.cc (1.11),
+	  tests/Grid/limitedextrapolation1.cc (1.13),
+	  tests/Grid/limitedextrapolation2.cc (1.7),
+	  tests/Grid/limitedextrapolation3.cc (1.6),
+	  tests/Grid/mapspacedims1.cc (1.11), tests/Grid/maxmin1.cc (1.12),
+	  tests/Grid/membytes1.cc (1.9), tests/Grid/mincongruences1.cc
+	  (1.10), tests/Grid/mingenerators1.cc (1.10),
+	  tests/Grid/outputoperator1.cc (1.9),
+	  tests/Grid/outputoperator2.cc (1.3),
+	  tests/Grid/outputoperator3.cc (1.3), tests/Grid/partition1.cc
+	  (1.6), tests/Grid/powersetdifference1.cc (1.3),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.3),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.3),
+	  tests/Grid/relations1.cc (1.14), tests/Grid/relations2.cc (1.16),
+	  tests/Grid/relations3.cc (1.7), tests/Grid/removespacedims1.cc
+	  (1.14), tests/Grid/removespacedims2.cc (1.14),
+	  tests/Grid/timeelapse1.cc (1.11), tests/Grid/topclosed1.cc
+	  (1.12), tests/Grid/topclosure1.cc (1.8), tests/Grid/widening1.cc
+	  (1.16), tests/Grid/widening2.cc (1.11), tests/Grid/widening3.cc
+	  (1.6), tests/Grid/writecongruencesystem.cc (1.8),
+	  tests/MIP_Problem/Makefile.am (1.4),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.4),
+	  tests/MIP_Problem/exceptions1.cc (1.3),
+	  tests/MIP_Problem/mipproblem1.cc (1.5),
+	  tests/MIP_Problem/mipproblem2.cc (1.3),
+	  tests/Octagonal_Shape/Makefile.am (1.20),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.3),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.4),
+	  tests/Octagonal_Shape/affineimage1.cc (1.4),
+	  tests/Octagonal_Shape/affineimage2.cc (1.3),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.5),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.3),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.3),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.4),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.3),
+	  tests/Octagonal_Shape/bounded1.cc (1.3),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.10),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.4),
+	  tests/Octagonal_Shape/bounds1.cc (1.4),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.5),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.4),
+	  tests/Octagonal_Shape/chinainit.cc (1.3),
+	  tests/Octagonal_Shape/concatenate1.cc (1.3),
+	  tests/Octagonal_Shape/constraints1.cc (1.4),
+	  tests/Octagonal_Shape/contains1.cc (1.4),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.4),
+	  tests/Octagonal_Shape/discrete1.cc (1.3),
+	  tests/Octagonal_Shape/disjoint1.cc (1.7),
+	  tests/Octagonal_Shape/empty1.cc (1.3),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.5),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.5),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.4),
+	  tests/Octagonal_Shape/fromspacedim1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.9),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.9),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.5),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.4),
+	  tests/Octagonal_Shape/intersection1.cc (1.4),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.5),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.5),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.4),
+	  tests/Octagonal_Shape/max_min1.cc (1.5),
+	  tests/Octagonal_Shape/max_min2.cc (1.4),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.4),
+	  tests/Octagonal_Shape/membytes1.cc (1.4),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.4),
+	  tests/Octagonal_Shape/octdifference1.cc (1.4),
+	  tests/Octagonal_Shape/octhull1.cc (1.4),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.4),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.7),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.8),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.4),
+	  tests/Octagonal_Shape/run_tests (1.3),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.5),
+	  tests/Octagonal_Shape/universe1.cc (1.3),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.4),
+	  tests/Polyhedron/Makefile.am (1.109), tests/Polyhedron/README
+	  (1.7), tests/Polyhedron/addcongruence1.cc (1.8),
+	  tests/Polyhedron/addcongruences1.cc (1.11),
+	  tests/Polyhedron/addconstraint1.cc (1.11),
+	  tests/Polyhedron/addconstraints1.cc (1.12),
+	  tests/Polyhedron/addconstraints2.cc (1.11),
+	  tests/Polyhedron/addgenerator1.cc (1.12),
+	  tests/Polyhedron/addgenerator2.cc (1.12),
+	  tests/Polyhedron/addgenerators1.cc (1.13),
+	  tests/Polyhedron/addgenerators2.cc (1.12),
+	  tests/Polyhedron/addspacedims1.cc (1.12),
+	  tests/Polyhedron/addspacedims2.cc (1.12),
+	  tests/Polyhedron/affineimage1.cc (1.12),
+	  tests/Polyhedron/affineimage2.cc (1.11),
+	  tests/Polyhedron/affinepreimage1.cc (1.11),
+	  tests/Polyhedron/affinetrans.cc (1.11),
+	  tests/Polyhedron/append1.cc (1.12), tests/Polyhedron/append2.cc
+	  (1.11), tests/Polyhedron/ascii_dump_load1.cc (1.10),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.10),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.11),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.13),
+	  tests/Polyhedron/bhrz03widening1.cc (1.11),
+	  tests/Polyhedron/bhrz03widening2.cc (1.11),
+	  tests/Polyhedron/bhrz03widening3.cc (1.15),
+	  tests/Polyhedron/bhz03widening1.cc (1.14),
+	  tests/Polyhedron/bounded1.cc (1.11),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.11),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.9),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.10),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.12),
+	  tests/Polyhedron/bounds1.cc (1.11),
+	  tests/Polyhedron/cnncconversion1.cc (1.4),
+	  tests/Polyhedron/concatenate1.cc (1.11),
+	  tests/Polyhedron/congruences1.cc (1.9),
+	  tests/Polyhedron/constraints1.cc (1.10),
+	  tests/Polyhedron/contains1.cc (1.10),
+	  tests/Polyhedron/contains2.cc (1.10),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.3),
+	  tests/Polyhedron/disjoint1.cc (1.10),
+	  tests/Polyhedron/disjoint2.cc (1.12),
+	  tests/Polyhedron/dualhypercubes.cc (1.13),
+	  tests/Polyhedron/empty1.cc (1.11), tests/Polyhedron/equals1.cc
+	  (1.10), tests/Polyhedron/exceptions1.cc (1.14),
+	  tests/Polyhedron/exceptions2.cc (1.12),
+	  tests/Polyhedron/exceptions3.cc (1.11),
+	  tests/Polyhedron/expandspacedim1.cc (1.13),
+	  tests/Polyhedron/expandspacedim2.cc (1.13),
+	  tests/Polyhedron/foldspacedims1.cc (1.15),
+	  tests/Polyhedron/foldspacedims2.cc (1.16),
+	  tests/Polyhedron/frombox1.cc (1.4), tests/Polyhedron/frombox2.cc
+	  (1.4), tests/Polyhedron/generalizedaffineimage1.cc (1.13),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.13),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.10),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.9),
+	  tests/Polyhedron/generators1.cc (1.11),
+	  tests/Polyhedron/geomcovers1.cc (1.14),
+	  tests/Polyhedron/h79widening1.cc (1.11),
+	  tests/Polyhedron/h79widening2.cc (1.11),
+	  tests/Polyhedron/hybrid.cc (1.4),
+	  tests/Polyhedron/intersection1.cc (1.15),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.10),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.11),
+	  tests/Polyhedron/linearpartition1.cc (1.13),
+	  tests/Polyhedron/linearsystem1.cc (1.9),
+	  tests/Polyhedron/linexpression1.cc (1.10),
+	  tests/Polyhedron/mapspacedims1.cc (1.15),
+	  tests/Polyhedron/matrix1.cc (1.10), tests/Polyhedron/max_min1.cc
+	  (1.12), tests/Polyhedron/maxspacedim1.cc (1.13),
+	  tests/Polyhedron/mc91.cc (1.15), tests/Polyhedron/membytes1.cc
+	  (1.15), tests/Polyhedron/memory1.cc (1.13),
+	  tests/Polyhedron/memory2.cc (1.15),
+	  tests/Polyhedron/minconstraints1.cc (1.10),
+	  tests/Polyhedron/minconstraints2.cc (1.12),
+	  tests/Polyhedron/mingenerators1.cc (1.10),
+	  tests/Polyhedron/mingenerators2.cc (1.11),
+	  tests/Polyhedron/nncminimize1.cc (1.7),
+	  tests/Polyhedron/nncminimize2.cc (1.7),
+	  tests/Polyhedron/numberinput1.cc (1.32),
+	  tests/Polyhedron/onepoint.cc (1.11), tests/Polyhedron/permute.cc
+	  (1.9), tests/Polyhedron/pointsetpowerset1.cc (1.7),
+	  tests/Polyhedron/polydifference1.cc (1.12),
+	  tests/Polyhedron/polydifference2.cc (1.12),
+	  tests/Polyhedron/polyhull1.cc (1.12),
+	  tests/Polyhedron/polyhull2.cc (1.11),
+	  tests/Polyhedron/powerset1.cc (1.20),
+	  tests/Polyhedron/randphull1.cc (1.11),
+	  tests/Polyhedron/randphull2.cc (1.10),
+	  tests/Polyhedron/relations1.cc (1.11),
+	  tests/Polyhedron/relations2.cc (1.11),
+	  tests/Polyhedron/relations3.cc (1.10),
+	  tests/Polyhedron/removespacedims1.cc (1.11),
+	  tests/Polyhedron/removespacedims2.cc (1.11),
+	  tests/Polyhedron/smm1.cc (1.8), tests/Polyhedron/timeelapse1.cc
+	  (1.12), tests/Polyhedron/timeelapse2.cc (1.12),
+	  tests/Polyhedron/topclosed1.cc (1.11),
+	  tests/Polyhedron/topclosure1.cc (1.11),
+	  tests/Polyhedron/universe1.cc (1.11),
+	  tests/Polyhedron/universe2.cc (1.11),
+	  tests/Polyhedron/variablesset1.cc (1.11),
+	  tests/Polyhedron/watchdog1.cc (1.10),
+	  tests/Polyhedron/writeconsys1.cc (1.11),
+	  tests/Polyhedron/writegensys1.cc (1.10),
+	  tests/Polyhedron/writepolyhedron1.cc (1.10),
+	  tests/Polyhedron/writepolyhedron2.cc (1.10),
+	  tests/Polyhedron/writerelation1.cc (1.13),
+	  tests/Polyhedron/writevariable1.cc (1.8), utils/Makefile.am
+	  (1.16), utils/build_header.in (1.5), utils/cm_cleaner.sh (1.3),
+	  utils/cm_splitter.sh (1.3), utils/text2cxxarray.in (1.4),
+	  utils/timings.cc (1.10), utils/timings.hh (1.6): Started the
+	  upgrade to GPL version 3 or later.
+
+2007-07-11 Wednesday 16:16  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.43): Fixed typo. Removed
+	  Is_Singleton_Or_Interval. Added Is_Singleton and Is_Interva.
+
+2007-07-10 Tuesday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.3),
+	  devref-c-interface.doxyconf-latex.in (1.3),
+	  devref-prolog-interface.doxyconf-html.in (1.3),
+	  devref-prolog-interface.doxyconf-latex.in (1.3),
+	  devref.doxyconf-html.in (1.82), devref.doxyconf-latex.in (1.21),
+	  user-c-interface.doxyconf-html.in (1.3),
+	  user-c-interface.doxyconf-latex.in (1.3),
+	  user-prolog-interface.doxyconf-html.in (1.3),
+	  user-prolog-interface.doxyconf-latex.in (1.3),
+	  user.doxyconf-html.in (1.40), user.doxyconf-latex.in (1.11):
+	  Updated configuration files to version 1.5.2 of Doxygen.
+
+2007-07-10 Tuesday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.26): Documentation link fixed.
+
+2007-07-10 Tuesday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (1.10): Cut-and-paste documentation
+	  typo fixed.
+
+2007-07-10 Tuesday 16:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.65), Box/Makefile.am (1.36),
+	  Octagonal_Shape/Makefile.am (1.19): List run_tests.stamp in
+	  DISTCLEANFILES.
+
+2007-07-09 Monday 10:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.31): Partially undone last
+	  commit, as it was again causing dependency problems in parallel
+	  builds.
+
+2007-07-08 Sunday 13:41  Andrea Cimino
+
+	* interfaces/: Java/Makefile.am (1.11), OCaml/Makefile.am (1.30):
+	  Use `pkglibdir' instead of hardcoding destination paths.  Install
+	  the OCaml interface in `pkglibdir', honoring the `--prefix'
+	  option.  Avoided a useless directive in the OCaml's Makefile.am:
+	  the serialization of the build is done correctly now thanks to
+	  the previous commit.
+
+2007-07-07 Saturday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.273): New Automake conditional HOST_CPU_X86_64.
+
+2007-07-07 Saturday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.272): Version number bumped.
+
+2007-07-07 Saturday 00:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.29): Try to fix Makefile.am so as
+	  to enforce the right dependencies even in the presence of
+	  parallel builds. To be checked.
+
+2007-07-06 Friday 15:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.28): Added option -f to cp and rm
+	  commands.
+
+2007-07-06 Friday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.13): File ppl_java_classes.cc
+	  is generated, hence should not be distributed.
+
+2007-07-06 Friday 11:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am (1.32), Java/jni/Makefile.am (1.12),
+	  OCaml/Makefile.am (1.27), Prolog/Makefile.am (1.40),
+	  Java/tests/Makefile.am (1.14), Prolog/Ciao/Makefile.am (1.63),
+	  Prolog/GNU/Makefile.am (1.62), Prolog/SICStus/Makefile.am (1.74),
+	  Prolog/SWI/Makefile.am (1.69), Prolog/XSB/Makefile.am (1.49),
+	  Prolog/tests/Makefile.am (1.14), Prolog/YAP/Makefile.am (1.51):
+	  File ppl_interface_instatiations.m4 is a generated file, so it
+	  must be found in the build directory.
+
+2007-07-06 Friday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.24): Bug 246815 had been fixed: YAP
+	  support enabled again.
+
+2007-07-06 Friday 09:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.48): Small improvements -
+	  mainly to comments.
+
+2007-07-06 Friday 08:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.47): Improved the code
+	  testing large integers.
+
+2007-07-05 Thursday 22:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.46): Modified the test for
+	  large integers in the case that current_prolog_flag(bounded,
+	  true) holds.
+
+	  In this case, the generated large integer may wrap and any
+	  comparison with Max_int - obtained with
+	  current_prolog_flag(max_integer, Max_int) meaningless.
+
+	  So we also compare the generated integer with another number that
+	  is generated to be about half its size (and therefore already
+	  tested).
+
+2007-07-05 Thursday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.23): Disable YAP support until bug
+	  246815 is fixed.  Bug 243084 has been fixed: `ppl-swiprolog'
+	  dependency on `readline-devel' removed.
+
+2007-07-05 Thursday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.39): Distribute also
+	  ppl_prolog_common.icc.
+
+2007-07-05 Thursday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.22): The `gprolog' package is not
+	  available on ppc64: the GNU Prolog interface must thus be
+	  disabled for that architecture.
+
+2007-07-04 Wednesday 21:39  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.33): Removed some non
+	  used variables in the C++ side of the Java interface.
+
+2007-07-04 Wednesday 21:38  Andrea Cimino
+
+	* interfaces/: OCaml/Makefile.am (1.26), Java/tests/Makefile.am
+	  (1.13): Fixed the `dist' target in the OCaml and Java/test
+	  interfaces: included all the m4 generator interface files in
+	  EXTRA_DIST.  Do not distribute `ppl_ocaml.cc' because it's a
+	  generated source.
+
+2007-07-04 Wednesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.29): Added `m4' to `SUBDIRS'.
+
+2007-07-04 Wednesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.271): Version number bumped.
+
+2007-07-03 Tuesday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch, ppl.spec.in (ppl-0_9-branch.[4,21]): Use
+	  `%{buildroot}' consistently, instead of  `$RPM_BUILD_ROOT'.
+
+2007-07-02 Monday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.208), TODO (1.222), doc/definitions.dox (1.202): Use the
+	  UTF-8 encoding instead of ISO-8859.
+
+2007-07-01 Sunday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.221): Added an item concerning additional documentation.
+
+2007-07-01 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.220): Remember to pProvide PPL-specific documentation on
+	  the use of `make check' and `make uninstall'.
+
+2007-07-01 Sunday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.219): The Java interface has been improved: corresponding
+	  item removed.
+
+2007-06-30 Saturday 10:41  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.64): Use method instead of function.
+
+2007-06-29 Friday 22:25  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.42): Converted many Interval functions in
+	  methods.
+
+2007-06-29 Friday 22:20  Abramo Bagnara
+
+	* src/: Box.templates.hh (1.60), Interval.defs.hh (1.41): Converted
+	  many Interval functions in methods.
+
+2007-06-28 Thursday 12:18  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.40): Removed duplicate definition.
+
+2007-06-28 Thursday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.29), Watchdog/ltmain.sh (1.18): Updated from Libtool
+	  1.5.24.
+
+2007-06-13 Wednesday 18:31  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.26): Call the appropriate destructor if the underlined C++
+	  object is a NNC_Polyhedron or a C_Polyhedron.
+
+2007-06-12 Tuesday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.20): `%%check' removed.
+
+2007-06-12 Tuesday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch, ppl.spec.in (ppl-0_9-branch.[3,19]):
+	  `%%check' added.  Revised the description of the `devel' package.
+	  Include also the `TODO' file in the documentation of the main
+	  package.
+
+2007-06-12 Tuesday 20:25  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.32): Removed some
+	  useless calls in the Java interface.
+
+2007-06-12 Tuesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.18): Patch the `libtool' script after
+	  `%%configure' so as to fix the rpath issue.
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/README.swiprolog (simplex.1): file
+	  README.swiprolog was added on branch simplex on 2008-01-07
+	  11:15:30 +0000
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/README.yap (simplex.1): file README.yap was
+	  added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/README.gprolog (1.2),
+	  SWI/README.swiprolog (1.2), YAP/README.yap (1.2): New
+	  documentation files.
+
+2007-06-08 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README.gprolog (simplex.1): file
+	  README.gprolog was added on branch simplex on 2008-01-07 11:15:30
+	  +0000
+
+2007-06-08 Friday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.17): %install commands revised.
+
+2007-06-08 Friday 18:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.270), Watchdog/configure.ac (1.37): Do not
+	  override the externally-provided CFLAGS and CXXFLAGS.
+
+2007-06-08 Friday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ax_prefix_config_h.m4 (simplex.1): file ax_prefix_config_h.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2007-06-08 Friday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.207), configure.ac (1.269), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.59), demos/ppl_lpsol/ppl_lpsol.c (1.69),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.10),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.16),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.4), m4/Makefile.am (1.26),
+	  m4/ac_check_fpu_control.m4 (1.4),
+	  m4/ac_cxx_double_binary_format.m4 (1.5),
+	  m4/ac_cxx_float_binary_format.m4 (1.4),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.5),
+	  m4/ax_prefix_config_h.m4 (1.1), src/BD_Shape.cc (1.6),
+	  src/BHRZ03_Certificate.cc (1.12), src/Bit_Matrix.cc (1.3),
+	  src/Bit_Row.cc (1.3), src/Bit_Row.inlines.hh (1.3), src/Box.cc
+	  (1.6), src/C_Integer.hh (1.4), src/C_Polyhedron.cc (1.21),
+	  src/Checked_Number.cc (1.12), src/Coefficient.cc (1.6),
+	  src/Coefficient.defs.hh (1.8), src/Coefficient.types.hh (1.15),
+	  src/Congruence.cc (1.15), src/Congruence_System.cc (1.24),
+	  src/Constraint.cc (1.66), src/Constraint_System.cc (1.23),
+	  src/DB_Row.defs.hh (1.23), src/DB_Row.inlines.hh (1.22),
+	  src/DB_Row.templates.hh (1.6), src/Float.cc (1.6),
+	  src/Float.defs.hh (1.25), src/Float.inlines.hh (1.30),
+	  src/GMP_Integer.inlines.hh (1.20), src/Generator.cc (1.74),
+	  src/Generator_System.cc (1.22), src/Grid_Certificate.cc (1.8),
+	  src/Grid_Generator.cc (1.20), src/Grid_Generator_System.cc
+	  (1.18), src/Grid_Status.cc (1.7), src/Grid_chdims.cc (1.17),
+	  src/Grid_conversion.cc (1.20), src/Grid_nonpublic.cc (1.25),
+	  src/Grid_public.cc (1.52), src/Grid_simplify.cc (1.33),
+	  src/Grid_widenings.cc (1.15), src/H79_Certificate.cc (1.11),
+	  src/Init.cc (1.30), src/Linear_Expression.cc (1.17),
+	  src/Linear_Row.cc (1.22), src/Linear_System.cc (1.43),
+	  src/MIP_Problem.cc (1.53), src/Matrix.cc (1.96),
+	  src/NNC_Polyhedron.cc (1.21), src/Octagonal_Shape.cc (1.5),
+	  src/Ph_Status.cc (1.13), src/Pointset_Ask_Tell.cc (1.3),
+	  src/Pointset_Powerset.cc (1.12), src/Poly_Con_Relation.cc (1.15),
+	  src/Poly_Gen_Relation.cc (1.15), src/Polyhedron_chdims.cc (1.43),
+	  src/Polyhedron_nonpublic.cc (1.78), src/Polyhedron_public.cc
+	  (1.93), src/Polyhedron_widenings.cc (1.62), src/Row.cc (1.103),
+	  src/Row.defs.hh (1.111), src/Row.inlines.hh (1.65),
+	  src/Scalar_Products.cc (1.8), src/Variable.cc (1.23),
+	  src/Variables_Set.cc (1.5), src/checked.cc (1.20),
+	  src/checked.inlines.hh (1.37), src/checked_float.inlines.hh
+	  (1.78), src/checked_int.inlines.hh (1.61),
+	  src/checked_mpz.inlines.hh (1.45), src/conversion.cc (1.82),
+	  src/fpu-c99.inlines.hh (1.14), src/fpu-sparc.inlines.hh (1.8),
+	  src/fpu.defs.hh (1.15), src/fpu.types.hh (1.5), src/globals.cc
+	  (1.27), src/minimize.cc (1.47), src/mp_std_bits.cc (1.4),
+	  src/ppl-config.cc.in (1.20), src/ppl_header.hh (1.6),
+	  src/simplify.cc (1.48), src/version.cc (1.9), tests/FCAIBVP.cc
+	  (1.4), tests/Partial_Function.cc (1.5), tests/ppl_test.cc (1.9),
+	  tests/ppl_test.hh (1.63), tests/print.hh (1.41),
+	  tests/Polyhedron/memory1.cc (1.12), tests/Polyhedron/memory2.cc
+	  (1.14), utils/timings.cc (1.9): The `ppl.hh' header file no
+	  longer defines macros not prefixed by "PPL_".
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/m4/ax_prefix_config_h.m4 (simplex.1): file
+	  ax_prefix_config_h.m4 was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-06-08 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.28), NEWS (1.9), configure.ac (1.36),
+	  m4/.cvsignore (1.1), m4/Makefile.am (1.1),
+	  m4/ax_prefix_config_h.m4 (1.1), src/Makefile.am (1.10),
+	  src/Pending_Element.cc (1.4), src/Pending_List.cc (1.4),
+	  src/Time.cc (1.4), src/Watchdog.cc (1.6), src/Watchdog.defs.hh
+	  (1.5), src/pwl_header.hh (1.4): The `pwl.hh' header file no
+	  longer defines macros not prefixed by "PWL_".
+
+2007-06-07 Thursday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.16): Apply both patches.
+
+2007-06-07 Thursday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.15): Fixed the command to remove all
+	  installed *.la files.
+
+2007-06-07 Thursday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.14): Remove installed *.la files.
+	  Added a `ppl-0.9-configure.patch' to avoid overriding CFLAGS and
+	  CXXFLAGS.
+
+2007-06-07 Thursday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.13): All the static archives are now
+	  in `*-static' packages.  Packages `ppl-gprolog-devel',
+	  `ppl-swiprolog-devel' and `ppl-yap-devel' renamed `ppl-gprolog',
+	  `ppl-swiprolog' and `ppl-yap', respectively.	As a workaround for
+	  a bug in the `pl' package (Bugzilla Bug 243084) `ppl-swiprolog'
+	  is now dependent on `readline-devel'.  Added `%%dir
+	  %%{_datadir}/doc/%%{name}'.  The `ppl-user-0.9-html'
+	  documentation directory is now properly listed.
+
+2007-06-06 Wednesday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.12): Use `%{_includedir}' and
+	  `%{_libdir}' instead of `/usr/include' and `/usr/lib',
+	  respectively.  Use `%{_datadir}/doc/%{name}' instead of
+	  `/usr/share/doc/ppl'.  Replaced `%defattr(-,root,root)' with
+	  `%defattr(-,root,root,-)'.  (Thanks to Mamoru Tasaka.)
+
+2007-06-05 Tuesday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.27): Shadowing avoided.
+
+2007-06-05 Tuesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.31): Useless break's
+	  and braces removed.  Indentation fixed in several places.
+
+2007-06-05 Tuesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.140): Make sure
+	  Polyhedron::space_dimension() is defined before being used.
+
+2007-05-29 Tuesday 08:05  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.16): In the generated Java tests, for each method that returns
+	  a non void type, a corresponding variable of the appropriate type
+	  is declared and assigned to the value that the method returns.
+	  Removed a redundant `ppl_ at TOPOLOGY@@CLASS at _@UB_EXACT at _code
+	  section.
+
+2007-05-28 Monday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.206): Updated.
+
+2007-05-28 Monday 06:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.defs.hh (1.34), MIP_Problem.inlines.hh (1.15):
+	  Removed method hash_code().
+
+2007-05-24 Thursday 07:56  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.15): Using `hashcode' instead of `hash'.  Spurious blank space
+	  removed.
+
+2007-05-23 Wednesday 23:11  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.14): Fixed a typo.
+
+2007-05-23 Wednesday 23:07  Andrea Cimino
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.7),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.25), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.13): In the Java interface provided, for most of the PPL
+	  classes, the methods `equals(Object y)' and `hashCode()'.
+
+2007-05-23 Wednesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.12), Ask_Tell.defs.hh (1.16),
+	  BD_Shape.defs.hh (1.99), BD_Shape.inlines.hh (1.143),
+	  Grid.defs.hh (1.48), Grid.inlines.hh (1.14), MIP_Problem.defs.hh
+	  (1.33), MIP_Problem.inlines.hh (1.14), Octagonal_Shape.defs.hh
+	  (1.28), Octagonal_Shape.inlines.hh (1.16),
+	  Pointset_Ask_Tell.defs.hh (1.9), Pointset_Ask_Tell.inlines.hh
+	  (1.4), Pointset_Powerset.defs.hh (1.17), Polyhedron.defs.hh
+	  (1.317), Polyhedron.inlines.hh (1.139): All PPL semantic objects
+	  now provide the method
+
+	       int32_t hash_code() const
+
+	  returning a 32-bit hash code for *this.  If x and y are such that
+	  x == y evaluates to true, so does x.hash_code() == y.hash_code().
+
+2007-05-21 Monday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.170): Distribute also meta_programming.hh and
+	  Temp.defs.hh.
+
+2007-05-21 Monday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.28), Watchdog/ltmain.sh (1.17): Updated from Libtool
+	  1.5.23b.
+
+2007-05-21 Monday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.218): Added one item concerning the Java interface.
+	  (Thanks to Fausto Spoto.)
+
+2007-05-18 Friday 07:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mapspacedims1.cc (1.14): New test added.
+
+2007-05-15 Tuesday 09:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.268): Version number bumped.
+
+2007-05-10 Thursday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.8): The former `prolog_atoms' array is now called
+	  `prolog_interface_atoms'.
+
+2007-04-11 Wednesday 06:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.15): List cm_cleaner.sh and cm_splitter.sh
+	  in dist_noinst_SCRIPTS, not noinst_SCRIPTS (problem reported by
+	  Stefano Soffia).
+
+2007-04-03 Tuesday 18:04  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.90), Checked_Number.inlines.hh
+	  (1.74), checked.defs.hh (1.41), checked_ext.inlines.hh (1.38),
+	  checked_float.inlines.hh (1.77), checked_int.inlines.hh (1.60),
+	  checked_mpq.inlines.hh (1.41), checked_mpz.inlines.hh (1.44):
+	  Added idiv.
+
+2007-04-03 Tuesday 14:47  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (1.52): Corrected the method
+	  Octagonal_Shape::relation_with(c) when the Octagonal_Shape is
+	  based on integer coefficients and when the constraint `c' is `1
+	  == 0'.
+
+2007-04-03 Tuesday 14:43  Elena Mazzi
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (1.6): Added two new
+	  tests on `Octagonal_Shape::relation_with(c)'.  Test18() shows a
+	  bug in relation_with(const Constraint& c) when the constraint `c'
+	  is `1 == 0'.
+
+2007-04-03 Tuesday 12:17  Elena Mazzi
+
+	* tests/Octagonal_Shape/: Makefile.am (1.18), fromspacedim1.cc
+	  (1.1): New test program fromspacedim1.cc tests
+	  Octagonal_Shape<N>::Octagonal_Shape(dimension_type,
+	  Degenerate_Element).
+
+2007-04-03 Tuesday 11:44  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.64), fromspacedim1.cc (1.1): New
+	  test program fromspacedim1.cc tests
+	  BD_Shape<N>::BD_Shape(dimension_type, Degenerate_Element).
+
+2007-04-01 Sunday 18:57  Abramo Bagnara
+
+	* TODO (1.217): Fixed and cleaned TODO description.
+
+2007-04-01 Sunday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.216): Added a new item concerning possible aliasing in
+	  the arguments of a function.
+
+2007-04-01 Sunday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.215): Added new item concerning rem() and remp().
+
+2007-04-01 Sunday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.46), ppl_prolog_common.icc (1.7), track_allocation.hh (1.22):
+	  Avoided conflicts with symbols defined in the new versions of
+	  CiaoDE.
+
+2007-03-31 Saturday 19:27  Abramo Bagnara
+
+	* src/fpu.defs.hh (1.14): Give priority to faster architecture
+	  dependent fpu control.
+
+2007-03-26 Monday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.76): On platforms not providing
+	  rintl() and not providing proper long doubles, make the
+	  assumption that long double and double are the same type and use
+	  rint() instead of rintl().
+
+2007-03-25 Sunday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.201): Corrected a wrong sign in the
+	  paragraph about "Images and Preimages of Affine Transfer
+	  Relations."
+
+2007-03-25 Sunday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.267), m4/Makefile.am (1.25),
+	  m4/ac_cxx_proper_long_double.m4 (1.1): Check whether the C++
+	  compiler provides proper long doubles.
+
+2007-03-24 Saturday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.6): Fixed test18() and
+	  test19().  Drafted test20().
+
+2007-03-21 Wednesday 11:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem2.cc (1.2): Test modified so as to
+	  propagate overflows and therefore interact correctly with macro
+	  DO_TEST_OVERFLOW. The test overflows when using 8-bit
+	  coefficients.
+
+2007-03-21 Wednesday 10:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.8): Test test02() does not overflow with
+	  64 bits integers.
+
+2007-03-20 Tuesday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frombox1.cc (1.2): Test test05() overflows with all
+	  bounded coefficients.
+
+2007-03-20 Tuesday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.59): Use DIRTY_TEMP when allocating a
+	  temporary Coefficient or mpq_class object.  Use properly typed
+	  temporaries in max_min(), so as to avoid errors when configured
+	  to used bounded integer coefficients.
+
+2007-03-19 Monday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.58): Excessively optimistic assertions
+	  just introduced replaced by canonicalization, which is required.
+	  In the constructor of a Box from a polyhedron, do use Coefficient
+	  temporaries when invoking the MIP solver.
+
+2007-03-19 Monday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.52): The excessively optimistic assertions
+	  just introduced replaced by canonicalization, which is indeed
+	  required.
+
+2007-03-19 Monday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.57): Useless canonnicalizations of mpq
+	  rationals replaced by assertions.  Simplified part of the code
+	  for the construction of a Box starting from a generator system.
+	  Avoid a couple of useless temporaries.
+
+2007-03-19 Monday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.92): A comment about the canonical
+	  form of an mpq rational supported by corresponding assertion.
+
+2007-03-19 Monday 15:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.51): A few useless canonicalizations of mpq
+	  rationals replaced by assertions.
+
+2007-03-19 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.35), frombdshape1.cc (1.1): Test
+	  Box::Box(const BD_Shape&, Complexity_Class).
+
+2007-03-19 Monday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: globals.cc (1.26), globals.defs.hh (1.47): Removed useless
+	  inline directives in function declarations that are not
+	  definitions. Added helper function   bool is_canonical(const
+	  mpq_class& ); to be used in assertions.
+
+2007-03-19 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh (1.47): Grid::Grid(const Box<Interval>&) made
+	  explicit.
+
+2007-03-19 Monday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.56): Fixed Box<Interval>::Box(const
+	  BD_Shape<T>&, Complexity_Class).
+
+2007-03-19 Monday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.55): We were using Interval::lower_set()
+	  instead of Interval::lower_set_uninit() in
+	  Box<Interval>::Box(const BD_Shape<T>&, Complexity_Class).
+	  Several assert(OK()) were missing.
+
+2007-03-18 Sunday 17:26  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.40): Removed unused formal
+	  argument.
+
+2007-03-18 Sunday 16:53  Abramo Bagnara
+
+	* src/: checked_int.inlines.hh (1.59), checked_mpq.inlines.hh
+	  (1.39), checked_mpz.inlines.hh (1.43): Fixed construct from
+	  special value.
+
+2007-03-18 Sunday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.34), frombox1.cc (1.1): Test
+	  Box<Interval>::Box(const Box<Other_Interval>&).
+
+2007-03-18 Sunday 14:01  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.38): Removed unused argument.
+
+2007-03-18 Sunday 13:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.54): Added tests against exceeding the
+	  maximum space dimension.  Optimized
+	  Box<Interval>::add_space_dimensions_and_project(dimension_type).
+
+2007-03-18 Sunday 12:21  Abramo Bagnara
+
+	* src/Box.templates.hh (1.53): Fixed typo.
+
+2007-03-18 Sunday 12:13  Abramo Bagnara
+
+	* src/Box.templates.hh (1.52): Cleaned Box constructor from Grid.
+
+2007-03-18 Sunday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.51): Added tests against exceeding the
+	  maximum space dimension.
+
+2007-03-18 Sunday 12:02  Abramo Bagnara
+
+	* src/Box.templates.hh (1.50): Cleaned Box constructor from
+	  Octagon.
+
+2007-03-18 Sunday 11:59  Abramo Bagnara
+
+	* src/Box.templates.hh (1.49): Cleaned Box constructor from
+	  Polyhedron.
+
+2007-03-18 Sunday 11:41  Abramo Bagnara
+
+	* src/Box.templates.hh (1.48): Substituted refine with narrow in
+	  refine_no_check.
+
+2007-03-18 Sunday 11:34  Abramo Bagnara
+
+	* src/: Box.templates.hh (1.47), Checked_Number.defs.hh (1.89),
+	  Checked_Number.inlines.hh (1.73), checked_ext.inlines.hh (1.37),
+	  checked_float.inlines.hh (1.75): Added support for inexact
+	  checking.
+
+2007-03-18 Sunday 11:05  Abramo Bagnara
+
+	* src/Box.templates.hh (1.46): Fixed comparison.
+
+2007-03-18 Sunday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.45): Marked the places in
+	  Box<Interval>::refine_no_check(const Constraint&) where the
+	  inexact flag must be reset.
+
+2007-03-18 Sunday 11:01  Abramo Bagnara
+
+	* src/Box.templates.hh (1.44): Undone last commit.
+
+2007-03-18 Sunday 10:54  Abramo Bagnara
+
+	* src/Box.templates.hh (1.43): Fixed comparison.
+
+2007-03-18 Sunday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.42): Box<Interval>::Box(const
+	  Generator_System&) simplified and adorned with FIXMEs.
+
+2007-03-18 Sunday 10:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.41): Box<Interval>::Box(const
+	  Box<Other_Interval>&) simplified.
+
+2007-03-18 Sunday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.25), src/Box.templates.hh (1.40),
+	  tests/Box/Makefile.am (1.33), tests/Box/fromspacedim1.cc (1.1):
+	  Box<Interval>::Box(dimension_type, Degenerate_Element) rewritten
+	  exploiting the fact that marked empty boxes do not impose any
+	  constraint on the intervals apart from the fact that their memory
+	  has been allocated.  Box<Interval>::OK() has been changed
+	  accordingly.	New test program fromspacedim1.cc tests
+	  Box<Interval>::Box(dimension_type, Degenerate_Element).
+	  Box<Interval>::Box(const BD_Shape<T>&, Complexity_Class) modified
+	  to exploit the new interval construction mechanisms.
+
+2007-03-18 Sunday 08:40  Abramo Bagnara
+
+	* src/: BD_Shape.inlines.hh (1.142), BD_Shape.templates.hh (1.76),
+	  Boundary.defs.hh (1.7), Box.inlines.hh (1.17), Box.templates.hh
+	  (1.39), Checked_Number.cc (1.11), Checked_Number.defs.hh (1.88),
+	  Checked_Number.inlines.hh (1.72), DB_Matrix.inlines.hh (1.32),
+	  DB_Row.templates.hh (1.5), Interval.defs.hh (1.39),
+	  Interval_Info.defs.hh (1.4), Interval_Restriction.defs.hh (1.5),
+	  OR_Matrix.inlines.hh (1.7), Octagonal_Shape.inlines.hh (1.15),
+	  Octagonal_Shape.templates.hh (1.51), Temp.defs.hh (1.4),
+	  checked.defs.hh (1.40), checked.inlines.hh (1.36),
+	  checked_ext.inlines.hh (1.36), checked_float.inlines.hh (1.74),
+	  checked_int.inlines.hh (1.58), checked_mpq.inlines.hh (1.37),
+	  checked_mpz.inlines.hh (1.42), checked_numeric_limits.hh (1.20),
+	  globals.defs.hh (1.46), meta_programming.hh (1.5): Removed
+	  special values classes. Changed interface to interval
+	  construction and modify.
+
+2007-03-17 Saturday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.9): test01(), test03() and test04() will
+	  fail with 8-bit coefficients.
+
+2007-03-16 Friday 21:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.7): Restored test02().
+
+2007-03-16 Friday 20:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.8): Completed test07().
+
+2007-03-16 Friday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.38): Removed spurious assignment `t_bound
+	  = 0' from Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-16 Friday 19:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.7): Test test07() shows a bug in refine()
+	  when handling an equality constraint.
+
+2007-03-16 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.6): Fixed test06().
+
+2007-03-16 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.81), devref.doxyconf-latex.in
+	  (1.20): Updated the list of files from which to harvest the
+	  documentation for developers.
+
+2007-03-16 Friday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.5): New test added.
+
+2007-03-16 Friday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.24), Box.templates.hh (1.37): Comment with
+	  the implementation details of
+	  Box<Interval>::refine_no_check(const Constraint&) adapted to
+	  Doxygen and moved before the declaration in Box.defs.hh.
+
+2007-03-16 Friday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (1.27): Fixed some Doxygen
+	  references.
+
+2007-03-16 Friday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-c-interface.doxyconf-html.in (1.2),
+	  devref-c-interface.doxyconf-latex.in (1.2),
+	  devref-prolog-interface.doxyconf-html.in (1.2),
+	  devref-prolog-interface.doxyconf-latex.in (1.2),
+	  devref.doxyconf-html.in (1.80), devref.doxyconf-latex.in (1.19),
+	  user-c-interface.doxyconf-html.in (1.2),
+	  user-c-interface.doxyconf-latex.in (1.2),
+	  user-prolog-interface.doxyconf-html.in (1.2),
+	  user-prolog-interface.doxyconf-latex.in (1.2),
+	  user.doxyconf-html.in (1.39), user.doxyconf-latex.in (1.10):
+	  Updated for the new versions of Doxygen.
+
+2007-03-13 Tuesday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.23), Box.templates.hh (1.36): New
+	  implementation of Box<Interval>::refine_no_check(const
+	  Constraint&).  Added declaration and fake definition for
+	  Box<Interval>::limited_CC76_extrapolation_assign(const Box&,
+	  const Constraint_System&, unsigned).
+
+2007-03-13 Tuesday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.38): New template <typename
+	  Interval_Boundary_Type> struct Select_Temp_Boundary_Type is an
+	  helper class to select the appropriate numerical type to perform
+	  boundary computations so as to reduce the chances of overflow
+	  without incurring too much overhead.
+
+2007-03-13 Tuesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.6): Temporarily disabled test02().
+
+2007-03-13 Tuesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.4): Improved test01().
+
+2007-03-13 Tuesday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/relations1.cc (1.17), BD_Shape/relations2.cc
+	  (1.21), BD_Shape/relations3.cc (1.25),
+	  Octagonal_Shape/relatwithcons1.cc (1.3),
+	  Octagonal_Shape/relatwithcons2.cc (1.5),
+	  Octagonal_Shape/relatwithgen1.cc (1.7): Output made consistent
+	  with the rest of the testsuite.
+
+2007-03-13 Tuesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.16),
+	  Pointset_Powerset.templates.hh (1.13): Added void
+	  Pointset_Powerset<PS>::refine(const Constraint&) and void
+	  Pointset_Powerset<PS>::refine(const Constraint_System&).
+
+2007-03-13 Tuesday 15:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.75): Corrected the method
+	  BD_Shape::relation_with(c) when the BD_Shape is based on integer
+	  coefficients and when the constraint `c' is `1 == 0'.
+
+2007-03-13 Tuesday 15:49  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.63), relations3.cc (1.24): Test
+	  relations3 abled. Added test17() that shows a bug in
+	  BD_Shape::relation_with(const Constraint& c) when the constraint
+	  `c' is `1 == 0'.
+
+2007-03-13 Tuesday 14:57  quartieri
+
+	* src/Octagonal_Shape_strong_closure4.hh (octagons.3): Removed a
+	  useless code line.
+
+2007-03-13 Tuesday 14:55  quartieri
+
+	* tests/Octagonal_Shape/: Makefile.am, universal_incremental.cc,
+	  universal_strong.cc (octagons.[4,1,1]): Added new tests on
+	  strong_closure() and incremental_strong_closure().
+
+2007-03-13 Tuesday 12:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bhrz03widening3.cc (1.14): Test test10()
+	  completed and restored.
+
+2007-03-13 Tuesday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.61): Applied a workaround in
+	  private method select_H79_constraints() so as to correctly deal
+	  with NNC polyhedra. A too strong assertion made weaker: due to
+	  the value of the epsilon coordinate, the sign of the scalar
+	  product can be anything when the polyhedra are NNC, the
+	  constraint from x is strict and the generator from y is a point.
+
+2007-03-13 Tuesday 09:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Scalar_Products.cc (1.7): Added the definition of a
+	  Scalar_Product::assign() variant that was declared but not
+	  implemented.
+
+2007-03-12 Monday 20:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bhrz03widening3.cc (1.13): Test test10() greatly
+	  simplified, while still showing the assertion violation.
+
+2007-03-12 Monday 16:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/bhrz03widening3.cc (1.12): Added a test showing
+	  an assertion violation for the BHRZ03 widening.
+
+2007-03-12 Monday 14:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.35): Th eimplementation of affine_image
+	  and affine_preimage changed so as to use Tmp_Interval_Type. Also
+	  corrected a type in affine_preimage.
+
+2007-03-12 Monday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.22): Added typedef Tmp_Interval_Type for the
+	  interval datatype that has to be used when performing internal
+	  computations and trying to avoid the accumulation of rounding
+	  errors. As for now, this is defined to be the same as Interval.
+
+2007-03-11 Sunday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.15),
+	  Pointset_Powerset.templates.hh (1.12): Added method bool
+	  contains_integer_point() const.
+
+2007-03-11 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (1.2): No longer mention
+	  README.configure.
+
+2007-03-10 Saturday 23:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.3): Expected results fixed.
+
+2007-03-10 Saturday 23:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.32), refine3.cc (1.1): New test that
+	  triggers a bug in the Box class.
+
+2007-03-10 Saturday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.5): test02() fails with 64-bit or smaller
+	  coefficients.
+
+2007-03-10 Saturday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.21), Box.inlines.hh (1.16): Assignment
+	  operator added.
+
+2007-03-10 Saturday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.81): Fixed a couple of comments.
+
+2007-03-10 Saturday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.62): For boxes, check_result_i() prints now
+	  more information in case containment does not hold.
+
+2007-03-10 Saturday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.4): Tests that do not require a watchdog
+	  timer moved to refine1.cc.  Remaining tests improved:
+	  known_result computed precisely and reduced the compilation time
+	  by resorting to ascii_load() methods.
+
+2007-03-10 Saturday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine1.cc (1.2): Tests that do not require a watchdog
+	  timer moved from refine1.cc.
+
+2007-03-10 Saturday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.37): Drafted bool
+	  ascii_load(std::istream&) and template <typename Boundary,
+	  typename Info> std::istream& operator>>(std::istream&
+	  Interval<Boundary, Info>&).
+
+2007-03-09 Friday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.34): Fixed Box<Interval>::Box(const
+	  Box<Other_Interval>&).
+
+2007-03-09 Friday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.33): Improved
+	  Box<Interval>::ascii_dump(std::ostream&).
+
+2007-03-09 Friday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.36): Interval::ascii_dump(ostream&)
+	  correctly (and simply) implemented.
+
+2007-03-09 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/: Makefile.am (1.3), mipproblem1.cc (1.4),
+	  mipproblem2.cc (1.1): New program mipproblem2.cc to test the
+	  MIP_Problem class with instances that require a watchdog timer.
+	  Test from mipproblem1.cc adapted and moved here.
+
+2007-03-09 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.50): The maybe_abandon() function is now
+	  called in the right places.
+
+2007-03-09 Friday 18:07  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.49): Call `maybe_abandon()' each time a new
+	  vertex is explored.
+
+2007-03-09 Friday 18:02  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.48): Call `maybe_abandon()' each time the
+	  simplex algorithm is involved.
+
+2007-03-09 Friday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.3): Completed test01().  Four more tests
+	  added (one of them is currently disabled, as it seems to trigger
+	  a bug somewhere).
+
+2007-03-09 Friday 15:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.31), cc76narrowing1.cc (1.4): Restored
+	  test cc76narrowing1.
+
+2007-03-09 Friday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.20), Box.templates.hh (1.32): Drafted
+	  implementation of CC76_narrowing_assign().
+
+2007-03-09 Friday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.30): Restored bgp99extrapolation1 and
+	  bhz03widening1.
+
+2007-03-09 Friday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.29), maxspacedim1.cc (1.4): Restored
+	  test maxspacedim1.cc.
+
+2007-03-09 Friday 14:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.28): Restored test affinepreimage1.cc.
+
+2007-03-09 Friday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/affineimage1.cc (1.6): Distances recomputed for test08.
+
+2007-03-09 Friday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/cc76extrapolation1.cc (1.18),
+	  Octagonal_Shape/cc76extrapolation1.cc (1.4): Use the new typedef
+	  coefficient_type_base.
+
+2007-03-09 Friday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.98), Grid.defs.hh (1.46),
+	  Octagonal_Shape.defs.hh (1.26), Polyhedron.defs.hh (1.316): Added
+	  public typedef coefficient_type to Polyhedron and Grid.  Typedef
+	  base_type renamed as coefficient_base_type for BDSs and OSs.
+
+2007-03-09 Friday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.27), affineimage1.cc (1.5): Test
+	  affineimage1.cc restored.
+
+2007-03-09 Friday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (1.5): Use new macro.
+
+2007-03-09 Friday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.61): Filled in the stub implementation of
+	  check_result for Box.  Macro DO_TEST_MAY_OVERFLOW_IF_FLOAT
+	  improved and renamed as DO_TEST_MAY_OVERFLOW_IF_INEXACT.
+
+2007-03-09 Friday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.15), Box.templates.hh (1.31): Added
+	  implementations of functions computing distances between boxes.
+
+2007-03-09 Friday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.19): Added declarations for functions that
+	  compute distances between boxes.
+
+2007-03-09 Friday 08:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.37): Added a paragraph describing DO_TEST_Fxxx
+	  macros.
+
+2007-03-08 Thursday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.73): Removed trailing whitespace.
+
+2007-03-08 Thursday 16:30  quartieri
+
+	* tests/Octagonal_Shape/incremental1.cc (octagons.3): Removed debug
+	  informations.
+
+2007-03-08 Thursday 15:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/max_min1.cc (1.4): Tests test07() and test08() may
+	  overflow when TBox has been instantiated with a floating point
+	  datatype.
+
+2007-03-08 Thursday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.60): Added macro DO_TEST_OVERFLOW which
+	  checks that a failure in a test is actually motivated by an
+	  overflow. The new macro used instead of DO_TEST_F (which was
+	  accepting any kind of failure) when defining macros DO_TEST_Fxx.
+
+	  Added new macro DO_TEST_MAY_OVERFLOW_WITH_FLOAT to be used when a
+	  test may cause an overflow only when one of the domains
+	  supporting floating points (i.e., Box, BD_Shape and
+	  Octagonal_Shape) is actually instantiated with a floating point
+	  datatype.
+
+2007-03-08 Thursday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: relations1.cc (1.4), relations2.cc (1.2): Noisy
+	  output standardized.
+
+2007-03-08 Thursday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/refine2.cc (1.2): Fixed test01().
+
+2007-03-08 Thursday 14:11  quartieri
+
+	* tests/Octagonal_Shape/incremental1.cc (octagons.2): Truncate
+	  random coefficients to 1000.
+
+2007-03-08 Thursday 13:41  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[18,57]): Unused function removed.
+
+2007-03-08 Thursday 13:39  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[17,56]): Added a temporary function to count the
+	  infinities in the Octagonal_Shape.
+
+2007-03-08 Thursday 13:03  quartieri
+
+	* src/: Octagonal_Shape.templates.hh,
+	  Octagonal_Shape_incremental_strong_closure1.hh,
+	  Octagonal_Shape_incremental_strong_closure10.hh,
+	  Octagonal_Shape_incremental_strong_closure4.hh,
+	  Octagonal_Shape_incremental_strong_closure5.hh,
+	  Octagonal_Shape_incremental_strong_closure6.hh,
+	  Octagonal_Shape_incremental_strong_closure7.hh,
+	  Octagonal_Shape_incremental_strong_closure8.hh,
+	  Octagonal_Shape_incremental_strong_closure9.hh,
+	  Octagonal_Shape_strong_closure1.hh,
+	  Octagonal_Shape_strong_closure2.hh,
+	  Octagonal_Shape_strong_closure4.hh, script_flags.hh
+	  (octagons.[55,4,5,4,4,4,4,4,4,2,3,2,2]): Added possibility to
+	  count operations.
+
+2007-03-08 Thursday 13:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rational_Box.hh (1.5), tests/ppl_test.hh (1.59): Intervals
+	  used in the Box class can be empty.
+
+2007-03-08 Thursday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.214): Adde another entry.
+
+2007-03-08 Thursday 13:02  quartieri
+
+	* src/: Octagonal_Shape_incremental_strong_closure2.hh,
+	  Octagonal_Shape_incremental_strong_closure3.hh (octagons.[4,4]):
+	  Corrected both incomplete algorithms.
+
+2007-03-08 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.108): Use special flags only for
+	  the compilation of Watchdog1.
+
+2007-03-08 Thursday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (1.14), src/Box.templates.hh (1.30),
+	  tests/Box/Makefile.am (1.26), tests/Box/addconstraints1.cc (1.7),
+	  tests/Box/refine1.cc (1.1), tests/Box/refine2.cc (1.1): Drafted a
+	  first version of Box<Interval>::refine_no_check(const
+	  Constraint_System&).	New test programs refine1.cc and
+	  refine2.cc: the latter is for tests possibly requiring a watchdog
+	  timer.
+
+2007-03-07 Wednesday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.141), BD_Shape.templates.hh (1.74):
+	  Reverted previous change (i.e., restored implementation of
+	  time_elapse exploiting polyhedra).
+
+2007-03-07 Wednesday 17:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/timeelapse1.cc (1.19): New test shows a bug in the
+	  (just added) direct implementation of
+	  BD_Shape<T>::time_elapse_assign().
+
+2007-03-07 Wednesday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.140), BD_Shape.templates.hh (1.73):
+	  The implementation of method BD_Shape<T>::time_elapse_assign() no
+	  longer relies on the corresponding method of class Polyhedron.
+
+2007-03-07 Wednesday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.cc (1.5), Box.defs.hh (1.18), Box.templates.hh (1.29):
+	  Interface of private method extract_interval_constraint() made
+	  more intuitive.  Consequently adapted methods
+	  add_constraint_no_check() and relation_with().
+
+2007-03-06 Tuesday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.28), tests/Box/addconstraints1.cc (1.6):
+	  Revised Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-06 Tuesday 21:15  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.6): Moved assert to right place.
+
+2007-03-06 Tuesday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.27): Revised void
+	  Box<Interval>::refine_no_check(const Constraint&).
+
+2007-03-06 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.17), src/Box.inlines.hh (1.13),
+	  src/Box.templates.hh (1.26), tests/Box/addconstraints1.cc (1.5):
+	  Added the declarations for void Box<Interval>::refine(const
+	  Constraint&) and void Box<Interval>::refine(const
+	  Constraint_System&).	Drafted an implementation for the former.
+	  Commented-out test06() in tests/Box/addconstraints1.cc is meant
+	  to test it (will be moved elsewhere when the final name of the
+	  method is decided).
+
+2007-03-06 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/pointsetpowerset1.cc (1.2): Started drafting a couple
+	  of new tests.
+
+2007-03-06 Tuesday 12:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.25): Restored test timeelapse1.cc.
+
+2007-03-06 Tuesday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.16), Box.templates.hh (1.25): Drafted
+	  implementation for time_elapse_assign().
+
+2007-03-06 Tuesday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.12): Call
+	  Parma_Polyhedra_Library::max_space_dimension().
+
+2007-03-06 Tuesday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/max_space_dimension.hh (1.12): Take boxes into account (with
+	  FIXME).
+
+2007-03-06 Tuesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (octagons.14): If EXTRA_ROW_DEBUG is not
+	  defined, define it to 0, not 1.
+
+2007-03-06 Tuesday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.107), writeconsys1.cc (1.10):
+	  Test completed and FIXME resolved.
+
+2007-03-06 Tuesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (1.10): FIXME resolved.
+
+2007-03-06 Tuesday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/writerelation1.cc (1.12): This test program was
+	  not testing anything: fixed.
+
+2007-03-05 Monday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (1.3): This test program
+	  was not testing anything: fixed.
+
+2007-03-05 Monday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (1.3): This test program was not
+	  testing anything: fixed.
+
+2007-03-05 Monday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/writebdshape1.cc (1.9): This test program was not
+	  testing anything: fixed.
+
+2007-03-05 Monday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Direct_Product.inlines.hh (1.30), Grid.defs.hh (1.45),
+	  Grid.templates.hh (1.30): Method Grid::get_covering_box() now
+	  takes as parameter a reference to an object of class
+	  Parma_Polyhedra_Library::Box.
+
+2007-03-05 Monday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.45): No longer use private Box methods.
+
+2007-03-05 Monday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.15), Box.inlines.hh (1.12), Grid.defs.hh
+	  (1.44): Got rid of methods Box::raise_lower_bound() and
+	  Box::lower_upper_bound().
+
+2007-03-05 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.14), Box.inlines.hh (1.11): Privatized const
+	  Interval& Box<Interval>::operator[](dimension_type k) const.
+	  Drafted const Interval& Box<Interval>::get_interval(Variable)
+	  const and void Box<Interval>::set_interval(Variable, const
+	  Interval&).
+
+2007-03-05 Monday 17:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: coveringbox1.cc (1.15), coveringbox2.cc (1.13),
+	  directproduct1.cc (1.27): Removed raise_lower_bound and
+	  lower_upper_bound
+
+2007-03-05 Monday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.13), Box.inlines.hh (1.10): Added
+	  declaration and fake definitions for bool
+	  Box<Interval>::box_hull_assign_if_exact(const Box&) and bool
+	  Box<Interval>::upper_bound_assign_if_exact(const Box&).
+
+2007-03-05 Monday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.24), fromdirectproduct1.cc (1.4):
+	  Program fromdirectproduct1.cc revised (with one FIXME) and
+	  activated.
+
+2007-03-04 Sunday 23:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.19): Even test03() overflows when
+	  using 16 bit checked integers.
+
+2007-03-04 Sunday 23:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.18): Another test showing that even
+	  two applications of Floyd-Warshall may not be enough to obtain
+	  shortest path closure when using floating points.
+
+2007-03-04 Sunday 23:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.17): Test test02() overflows when
+	  using 16bit checked integers.
+
+2007-03-04 Sunday 23:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.16): Test test02() shows a simple
+	  example where the Floyd-Warshall algorithm fails to compute
+	  shortest path closure due to floating point approximations.
+
+2007-03-04 Sunday 22:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.30): Remove
+	  unwanted previously commented m4 code.
+
+2007-03-04 Sunday 22:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.44): Remove temporarily commented old code.
+
+2007-03-04 Sunday 22:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.43): Avoid generating code "From_Bounding_Box" Also avoid
+	  using raise_lower_bound and lower_upper_bound.
+
+2007-03-04 Sunday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.205), interfaces/C/ppl_interface_generator_c_cc_code.m4
+	  (1.15), interfaces/C/ppl_interface_generator_c_cc_preamble (1.9),
+	  src/C_Polyhedron.defs.hh (1.47), src/C_Polyhedron.inlines.hh
+	  (1.35), src/Direct_Product.defs.hh (1.34),
+	  src/Direct_Product.inlines.hh (1.29), src/Grid.defs.hh (1.43),
+	  src/Grid.templates.hh (1.29), src/NNC_Polyhedron.defs.hh (1.49),
+	  src/NNC_Polyhedron.inlines.hh (1.36), src/globals.defs.hh (1.45),
+	  tests/ppl_test.hh (1.58), tests/Box/fromgrid1.cc (1.4),
+	  tests/Box/frompolyhedron2.cc (1.8), tests/Grid/boundingbox1.cc
+	  (1.18), tests/Grid/directproduct1.cc (1.26),
+	  tests/Polyhedron/frombox1.cc (1.3), tests/Polyhedron/frombox2.cc
+	  (1.3): The constructors
+
+	    template <typename Box> C_Polyhedron(const Box&,
+	  From_Bounding_Box),
+	    template <typename Box> NNC_Polyhedron(const Box&,
+	  From_Bounding_Box) and
+	    template <typename Box> Grid(const Box&, From_Bounding_Box)
+
+	  have been removed in favor of
+
+	    template <typename Interval> C_Polyhedron(const
+	  Box<Interval>&),
+	    template <typename Interval> NNC_Polyhedron(const
+	  Box<Interval>&) and
+	    template <typename Interval> Grid(const Box<Interval>&).
+
+2007-03-04 Sunday 18:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.templates.hh (1.28), tests/Grid/boundingbox1.cc (1.17):
+	  Use add_constraint() instead of raise_lower_bound() and
+	  lower_upper_bound()
+
+2007-03-04 Sunday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.23): Testing with intervals with long
+	  double boundaries enabled again.
+
+2007-03-04 Sunday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.24): Fixed Box<Interval>::max_min().
+
+2007-03-04 Sunday 17:43  Abramo Bagnara
+
+	* src/: Boundary.defs.hh (1.5), Checked_Number.defs.hh (1.87),
+	  Checked_Number.inlines.hh (1.71): Added more versatile comparison
+	  functions.
+
+2007-03-04 Sunday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.33): Removed declaration for void
+	  get_covering_box(Box&) const.
+
+2007-03-04 Sunday 17:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox2.cc (1.2): No longer use
+	  Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: empty1.cc (1.4), fromdirectproduct1.cc (1.3),
+	  fromgrid1.cc (1.3), frompolyhedron2.cc (1.7): No longer use
+	  Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/frombox1.cc (1.2): No longer use
+	  Box::raise_lower_bound() and Box::lower_upper_bound().
+
+2007-03-04 Sunday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.66), Determinate.inlines.hh (1.56),
+	  Determinate.types.hh (1.10), Pointset_Ask_Tell.defs.hh (1.8),
+	  Pointset_Ask_Tell.inlines.hh (1.3),
+	  Pointset_Ask_Tell.templates.hh (1.8), Pointset_Ask_Tell.types.hh
+	  (1.3), Pointset_Powerset.defs.hh (1.14),
+	  Pointset_Powerset.inlines.hh (1.7),
+	  Pointset_Powerset.templates.hh (1.11): Type variable `PH' renamed
+	  `PS'.
+
+2007-03-04 Sunday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.22), pointsetpowerset1.cc (1.1): New
+	  program to test Pointset_Powerset<PH> with boxes.  Temporarily
+	  disable testing with intervals with long double boundaries.
+
+2007-03-04 Sunday 10:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.213), src/Pointset_Powerset.defs.hh (1.13),
+	  src/Pointset_Powerset.templates.hh (1.10): Added
+	  Pointset_Powerset<PH>::affine_image(Variable, const
+	  Linear_Expression&, Coefficient_traits::const_reference).  Many
+	  other methods of Pointset_Powerset are missing.
+
+2007-03-04 Sunday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.23), tests/Box/intersection1.cc (1.5):
+	  Fixed Box<Interval>::intersection_assign(const Box&): it was not
+	  dealing properly with the emptiness flags.
+
+2007-03-03 Saturday 23:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (1.10): Test test14() fails with all
+	  bounded integer types.
+
+2007-03-03 Saturday 22:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.21), max_min1.cc (1.3): Restored
+	  max_min1.cc after disabling some of the tests that necessarily
+	  fail on floating point datatypes (to be improved so as to allow
+	  for approximations).
+
+2007-03-03 Saturday 22:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.22): Corrected method is_universe().
+
+2007-03-03 Saturday 21:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.21): Added a few missing interval
+	  initializations; marked by FIXMEs so as to be improved when we
+	  will have a richer set of intervals' constructors.
+
+2007-03-03 Saturday 21:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.20), relations2.cc (1.1): Testing
+	  methods relation_with().
+
+2007-03-03 Saturday 21:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.12), Box.templates.hh (1.20): Drafted
+	  implementations of methods relation_with().
+
+2007-03-03 Saturday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.212): New item added.
+
+2007-03-03 Saturday 20:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.19): Support parallel builds.
+
+2007-03-03 Saturday 18:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.211): New item added.
+
+2007-03-03 Saturday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (1.9): Drafted a more complex test.
+
+2007-03-03 Saturday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron2.cc (1.6): Comment revised.
+
+2007-03-03 Saturday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/frompolyhedron2.cc (1.5): Test Box::Box(const
+	  NNC_Polyhedron&, Complexity_Class).
+
+2007-03-03 Saturday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.106), frombox2.cc (1.1): Test
+	  NNC_Polyhedron(const Box&, From_Bounding_Box).
+
+2007-03-03 Saturday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.18): Check Box::Box(const Polyhedron&,
+	  Complexity_Class) also with NNC polyhedra.
+
+2007-03-03 Saturday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: frompolyhedron1.cc (1.8), frompolyhedron2.cc (1.4),
+	  frompolyhedron4.cc (1.3): Tests for Box::Box(const Polyhedron&,
+	  Complexity_Class) reorganized.
+
+2007-03-03 Saturday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.105), frombox1.cc (1.1): Test
+	  C_Polyhedron(const Box&, From_Bounding_Box) and
+	  NNC_Polyhedron(const Box&, From_Bounding_Box).
+
+2007-03-03 Saturday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.57): Define BOX_INSTANCE if it is not
+	  already defined.
+
+2007-03-03 Saturday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.17), frompolyhedron1.cc (1.7),
+	  frompolyhedron2.cc (1.3): Adapted tests in frompolyhedron2.cc.
+	  Program max_min1 temporarily disabled (it fails).
+
+2007-03-03 Saturday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.56), Box/Makefile.am (1.16), Box/run_tests
+	  (1.2): Test class Box with multiple instantiations of the
+	  Interval parameter.
+
+2007-03-03 Saturday 15:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: frompolyhedron1.cc (1.6), frompolyhedron3.cc (1.3):
+	  Test in frompolyhedron3.cc is now included in frompolyhedron1.cc.
+
+2007-03-03 Saturday 12:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/bdsdifference1.cc (1.14),
+	  BD_Shape/bhmz05widening1.cc (1.14), BD_Shape/expandspacedim1.cc
+	  (1.3), BD_Shape/foldspacedims1.cc (1.5),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.13),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.14),
+	  BD_Shape/limitedh79extrapolation1.cc (1.13),
+	  BD_Shape/timeelapse1.cc (1.18), Box/bdsdifference1.cc (1.4),
+	  Box/boxdifference1.cc (1.5), Box/expandspacedim1.cc (1.5),
+	  Box/foldspacedims1.cc (1.6), Box/timeelapse1.cc (1.4),
+	  Octagonal_Shape/expandspacedim1.cc (1.4),
+	  Octagonal_Shape/foldspacedims1.cc (1.4),
+	  Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.4),
+	  Octagonal_Shape/limitedcc76extrapolation1.cc (1.4),
+	  Octagonal_Shape/timeelapse1.cc (1.4): Noisy output improved.
+
+2007-03-03 Saturday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: addcongruences1.cc (1.10), addconstraint1.cc
+	  (1.10), addconstraints1.cc (1.11), addconstraints2.cc (1.10),
+	  addgenerator1.cc (1.11), addgenerator2.cc (1.11),
+	  addgenerators1.cc (1.12), addgenerators2.cc (1.11),
+	  addspacedims1.cc (1.11), addspacedims2.cc (1.11), affineimage1.cc
+	  (1.11), affinepreimage1.cc (1.10), append1.cc (1.11), append2.cc
+	  (1.10), bhrz03widening1.cc (1.10), bhrz03widening2.cc (1.10),
+	  bhrz03widening3.cc (1.11), boundedaffineimage1.cc (1.10),
+	  boundedaffinepreimage1.cc (1.8), boundedh79extrapolation1.cc
+	  (1.11), concatenate1.cc (1.10), congruences1.cc (1.8),
+	  dualhypercubes.cc (1.12), expandspacedim1.cc (1.12),
+	  expandspacedim2.cc (1.12), foldspacedims1.cc (1.14),
+	  foldspacedims2.cc (1.15), generalizedaffineimage1.cc (1.12),
+	  generalizedaffineimage2.cc (1.12), generalizedaffinepreimage1.cc
+	  (1.9), generalizedaffinepreimage2.cc (1.8), h79widening1.cc
+	  (1.10), h79widening2.cc (1.10), intersection1.cc (1.14),
+	  limitedbhrz03extrapolation1.cc (1.9), limitedh79extrapolation1.cc
+	  (1.10), linearpartition1.cc (1.12), mapspacedims1.cc (1.13),
+	  nncminimize1.cc (1.6), numberinput1.cc (1.31), permute.cc (1.8),
+	  polydifference1.cc (1.11), polydifference2.cc (1.11),
+	  polyhull1.cc (1.11), relations1.cc (1.10), removespacedims1.cc
+	  (1.10), removespacedims2.cc (1.10), timeelapse1.cc (1.11),
+	  timeelapse2.cc (1.11), topclosure1.cc (1.10), universe1.cc
+	  (1.10), universe2.cc (1.10): Noisy output improved.
+
+2007-03-03 Saturday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: addcongruence1.cc (1.13), addcongruences1.cc (1.16),
+	  addconstraint1.cc (1.11), addconstraints1.cc (1.12),
+	  addgenerator1.cc (1.15), addgenerators1.cc (1.15),
+	  addspacedims1.cc (1.14), affineimage1.cc (1.13), affineimage2.cc
+	  (1.11), affinepreimage1.cc (1.12), affinepreimage2.cc (1.7),
+	  bounded1.cc (1.13), boundedaffineimage1.cc (1.3),
+	  boundedaffinepreimage1.cc (1.3), boundingbox1.cc (1.16),
+	  generalizedaffineimage1.cc (1.13), generalizedaffineimage2.cc
+	  (1.12), generalizedaffineimage3.cc (1.4),
+	  generalizedaffinepreimage1.cc (1.15),
+	  generalizedaffinepreimage2.cc (1.15),
+	  generalizedaffinepreimage3.cc (1.4), grid1.cc (1.20),
+	  limitedextrapolation1.cc (1.12), limitedextrapolation2.cc (1.6),
+	  limitedextrapolation3.cc (1.5), partition1.cc (1.5), widening1.cc
+	  (1.15), widening2.cc (1.10), widening3.cc (1.5): Enforced
+	  consistency with the other tests.
+
+2007-03-02 Friday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.204), interfaces/C/ppl_c.h.in (1.71), src/Grid.defs.hh
+	  (1.42): Last steps in the removal of the shrink_bounding_box()
+	  methods.
+
+2007-03-02 Friday 21:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.14), BBox.hh (1.12), Makefile.am (1.262),
+	  Box/frompolyhedron2.cc (1.2), Box/frompolyhedron3.cc (1.2),
+	  Box/frompolyhedron4.cc (1.2): Class BBox phased out.
+
+2007-03-02 Friday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.11), Box.templates.hh (1.19): New private
+	  methods void Box::add_constraint_no_check(const Constraint&) and
+	  void Box::add_constraints_no_check(const Constraint_System&)
+	  allow to optimize the addition of constraints to a box.
+
+2007-03-02 Friday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.10), src/Box.inlines.hh (1.9),
+	  src/Box.templates.hh (1.18), src/Direct_Product.defs.hh (1.32),
+	  src/Direct_Product.inlines.hh (1.28), tests/ppl_test.hh (1.55),
+	  tests/Box/fromdirectproduct1.cc (1.2): Got rid of
+	  Direct_Product::shrink_bounding_box() in favor of the constructor
+	  Box::Box(const Direct_Product<D1, D2>&, Complexity_Class).
+	  Removed lots of x's.
+
+2007-03-02 Friday 18:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.266), src/Any_Pointset.defs.hh (1.11),
+	  src/BD_Shape.cc (1.5), src/BD_Shape.defs.hh (1.97),
+	  src/BHRZ03_Certificate.defs.hh (1.17), src/Bit_Matrix.defs.hh
+	  (1.3), src/Bit_Row.defs.hh (1.5), src/Box.cc (1.4),
+	  src/Box.defs.hh (1.9), src/Checked_Number.defs.hh (1.86),
+	  src/Coefficient.types.hh (1.14),
+	  src/Coefficient_traits_template.hh (1.8), src/Congruence.defs.hh
+	  (1.19), src/Congruence_System.defs.hh (1.19),
+	  src/Constraint_System.defs.hh (1.36), src/DB_Matrix.defs.hh
+	  (1.27), src/DB_Matrix.inlines.hh (1.31),
+	  src/DB_Matrix.templates.hh (1.5), src/DB_Row.defs.hh (1.22),
+	  src/DB_Row.inlines.hh (1.21), src/DB_Row.templates.hh (1.4),
+	  src/Determinate.defs.hh (1.65), src/Direct_Product.defs.hh
+	  (1.31), src/Float.defs.hh (1.24), src/GMP_Integer.types.hh
+	  (1.16), src/Generator.defs.hh (1.122),
+	  src/Generator_System.defs.hh (1.23), src/Grid.defs.hh (1.41),
+	  src/Grid_Certificate.defs.hh (1.5), src/Grid_Generator.defs.hh
+	  (1.30), src/Grid_Generator_System.defs.hh (1.22),
+	  src/Grid_nonpublic.cc (1.24), src/Init.defs.hh (1.18),
+	  src/Linear_Row.defs.hh (1.24), src/Linear_System.defs.hh (1.31),
+	  src/Linear_System.inlines.hh (1.22), src/MIP_Problem.defs.hh
+	  (1.32), src/Matrix.defs.hh (1.81), src/OR_Matrix.defs.hh (1.8),
+	  src/OR_Matrix.inlines.hh (1.6), src/Octagonal_Shape.cc (1.4),
+	  src/Octagonal_Shape.defs.hh (1.25), src/Pointset_Ask_Tell.defs.hh
+	  (1.7), src/Pointset_Powerset.cc (1.11),
+	  src/Pointset_Powerset.defs.hh (1.12),
+	  src/Pointset_Powerset.templates.hh (1.9), src/Polyhedron.defs.hh
+	  (1.315), src/Polyhedron_nonpublic.cc (1.77),
+	  src/Ptr_Iterator.defs.hh (1.9), src/Rational_Box.hh (1.4),
+	  src/Row.cc (1.102), src/Row.defs.hh (1.110), src/Row.inlines.hh
+	  (1.64), src/Scalar_Products.defs.hh (1.9), src/Topology.hh
+	  (1.14), src/Variables_Set.defs.hh (1.6),
+	  src/Widening_Function.defs.hh (1.17), src/algorithms.hh (1.48),
+	  src/checked_numeric_limits.hh (1.19), src/compiler.hh (1.10),
+	  src/distances.inlines.hh (1.4), src/globals.defs.hh (1.44),
+	  src/iterator_to_const.defs.hh (1.5), src/meta_programming.hh
+	  (1.4), src/mp_std_bits.defs.hh (1.4), src/namespaces.hh (1.11):
+	  The `--enable-more-assertions' configure option can now be used
+	  to enable all sorts of ABI-breaking extra assertion checking.
+	  The `EXTRA_ROW_DEBUG' that was used in several places with
+	  different meaning has now gone in favor of new symbols, all
+	  characterized by the `PPL_' prefix.  Commends of several #endif's
+	  fixed.
+
+2007-03-02 Friday 18:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.62): Test relations3 temporarily
+	  disabled.
+
+2007-03-02 Friday 17:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/relations3.cc (1.23): Test test16() shows a bug in
+	  BD_Shape::relation_with(const Constraint& c) when the BD_Shape is
+	  based on integer coefficients.
+
+2007-03-02 Friday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.8), Box.templates.hh (1.17),
+	  Octagonal_Shape.defs.hh (1.24), Octagonal_Shape.templates.hh
+	  (1.50): Got rid of Octagonal_Shape::shrink_bounding_box() in
+	  favor of the constructor Box::Box(const Octagonal_Shape<T>&,
+	  Complexity_Class).
+
+2007-03-02 Friday 17:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.16): Solved a few FIXMEs. Corrected
+	  implementation of max_min().
+
+2007-03-02 Friday 16:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.15), addconstraints1.cc (1.4): Test
+	  addconstraints1.cc corrected and restored.
+
+2007-03-02 Friday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.14), discrete1.cc (1.4): Test
+	  discrete1 corrected and restored.
+
+2007-03-02 Friday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.8), Box.templates.hh (1.15): Method
+	  constraints() no longer forces an emptyness check.  Method
+	  minimized_constraints() forces an emptyness check and also
+	  detects equality constraints.
+
+2007-03-02 Friday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.13), minconstraints1.cc (1.4): Test
+	  minconstraints1.cc corrected and restored.
+
+2007-03-02 Friday 15:35  Abramo Bagnara
+
+	* src/Boundary.defs.hh (1.4): Added missing argument.
+
+2007-03-02 Friday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.12), expandspacedim1.cc (1.4): Test
+	  expandspacedim1.cc corrected and restored.
+
+2007-03-02 Friday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.35): Drafted Interval::ascii_dump() to
+	  help in debugging.
+
+2007-03-02 Friday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.7), Box.templates.hh (1.14): Corrected a
+	  bug in Box::add_constraint() whereby a Box flagged as empty had
+	  the flag removed after adding a new constraint.
+
+2007-03-02 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (1.13), tests/Box/Makefile.am (1.11),
+	  tests/Box/fromgrid1.cc (1.2): Constructor
+	  Box<Interval>::Box(const Grid&, Complexity_Class) corrected.
+	  Notice that this constructor is much less precise than it could
+	  be in case the box is made of modulo intervals.  Test program
+	  fromgrid1.cc revised and activated.
+
+2007-03-02 Friday 14:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.10), equality1.cc (1.4): Test
+	  equality1.cc corrected and restored.
+
+2007-03-02 Friday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (1.4): Test test08() shows a bug when
+	  calling join_assign() on Interval.
+
+2007-03-02 Friday 14:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.9), intersection1.cc (1.4): Test
+	  intersection1.cc corrected and restored.
+
+2007-03-02 Friday 14:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.8), max_min1.cc (1.2): Test
+	  max_min1.cc corrected and restored.
+
+2007-03-02 Friday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.7), containsintegerpoint1.cc (1.5):
+	  Improved and restored test on Box::contains_integer_points().
+
+2007-03-02 Friday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (1.34): Fixed
+	  Interval::contains_integer_points() so as to correctly handle the
+	  case of unbounded intervals.
+
+2007-03-02 Friday 12:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.12): Added a fast-fail test to
+	  Box::contains_integer_point().
+
+2007-03-02 Friday 12:44  Abramo Bagnara
+
+	* src/Interval.defs.hh (1.33): Fixed typos.
+
+2007-03-02 Friday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.14),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.11),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.8),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.42), src/BD_Shape.defs.hh (1.96), src/BD_Shape.templates.hh
+	  (1.72), src/Box.defs.hh (1.7), src/Box.templates.hh (1.11),
+	  src/Grid.defs.hh (1.40), src/Grid.templates.hh (1.27),
+	  src/Grid_Generator.defs.hh (1.29), src/Polyhedron.defs.hh
+	  (1.314), src/Polyhedron.templates.hh (1.13),
+	  tests/Box/fromdirectproduct1.cc (1.1), tests/Box/fromgrid1.cc
+	  (1.1), tests/Box/frompolyhedron1.cc (1.5),
+	  tests/Box/frompolyhedron2.cc (1.1), tests/Box/frompolyhedron3.cc
+	  (1.1), tests/Box/frompolyhedron4.cc (1.1), tests/Grid/Makefile.am
+	  (1.47), tests/Grid/boundingbox2.cc (1.14),
+	  tests/Grid/directproduct1.cc (1.25), tests/Polyhedron/Makefile.am
+	  (1.104), tests/Polyhedron/boundingbox1.cc (1.15),
+	  tests/Polyhedron/boundingbox2.cc (1.14),
+	  tests/Polyhedron/boundingbox3.cc (1.15): Started getting rid of
+	  BD_Shape::shrink_bounding_box() and Grid::shrink_bounding_box().
+
+2007-03-02 Friday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/containsintegerpoint1.cc (1.4): Test test04() shows a
+	  bug in Interval::contains_integer_point().
+
+2007-03-02 Friday 10:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.6), affinedimension1.cc (1.5):
+	  Restored test affinedimension1.
+
+2007-03-02 Friday 10:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/Makefile.am (1.5): Disabled some tests.
+
+2007-03-02 Friday 10:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxdifference1.cc (1.4): Temporarily commented out
+	  test07.
+
+2007-03-02 Friday 09:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Makefile.am (1.261): Enable checks in the Box directory.
+
+2007-03-02 Friday 09:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am (1.4), affinedimension1.cc (1.4),
+	  max_min1.cc (1.1), run_tests (1.1): A first attempt at
+	  distinguishing tests that compile, fail and succeed so as to
+	  enable automatic checks. Work still in progress.
+
+2007-03-01 Thursday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.9): Test no
+	  longer fails with 8-bit checked integers and assertions disabled.
+
+2007-03-01 Thursday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.10), Polyhedron_widenings.cc
+	  (1.60): Started getting rid of Polyhedron::shrink_bounding_box().
+
+2007-02-28 Wednesday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.19), TODO (1.210): Mention the fact that GCC
+	  version 3.4.x are known to miscompile at least one of the
+	  development snapshots that led to PPL 0.10.  Mention also the
+	  fact that GCC 3.3.3 segfaults on such a snapshot (CVS HEAD, at
+	  least on x86_64).
+
+2007-02-28 Wednesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_java_tests_common (simplex.1): file
+	  ppl_java_tests_common was added on branch simplex on 2008-01-07
+	  11:15:29 +0000
+
+2007-02-28 Wednesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.203), TODO (1.209), demos/ppl_lpsol/ppl_lpsol.c (1.68),
+	  interfaces/C/ppl_c.h.in (1.70),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.8),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.7),
+	  interfaces/Java/jni/ppl_java_common.cc (1.30),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.11),
+	  interfaces/Java/tests/ppl_java_tests_common (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.6),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.9),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.9),
+	  interfaces/OCaml/test1.ml (1.29),
+	  interfaces/Prolog/ppl_prolog_common.icc (1.6),
+	  m4/ac_prog_javac.m4 (1.5), src/BD_Shape.templates.hh (1.71),
+	  src/Box.inlines.hh (1.6), src/Box.templates.hh (1.10),
+	  src/Grid_public.cc (1.51), src/Grid_simplify.cc (1.32),
+	  src/Interval.defs.hh (1.32), src/MIP_Problem.cc (1.47),
+	  src/Octagonal_Shape.templates.hh (1.49), src/Polyhedron_public.cc
+	  (1.91), src/globals.types.hh (1.11),
+	  tests/BD_Shape/affineimage1.cc (1.18),
+	  tests/BD_Shape/foldspacedims1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.16),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.20),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.14),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.15),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.5),
+	  tests/BD_Shape/removespacedims1.cc (1.19),
+	  tests/Box/affineimage1.cc (1.4), tests/Box/foldspacedims1.cc
+	  (1.5), tests/Box/generalizedaffineimage1.cc (1.4),
+	  tests/Box/generalizedaffinepreimage1.cc (1.4),
+	  tests/Box/removespacedims1.cc (1.5), tests/Grid/addgenerators1.cc
+	  (1.14), tests/Grid/directproduct1.cc (1.24),
+	  tests/Grid/generalizedaffineimage3.cc (1.3),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.3),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.9),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.3),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.8),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.8),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.4),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.3),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.9),
+	  tests/Polyhedron/exceptions1.cc (1.13),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.11),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.11),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.8): All
+	  identifiers containing the strings `less_than_or_equal' or
+	  `greater_than_or_equal', any case, have been renamed so as to
+	  contain `less_or_equal' or `greater_or_equal', respectively.
+
+2007-02-28 Wednesday 15:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh (1.5), Box.templates.hh (1.9): Drafted
+	  implementations for provate helper functions bounds and max_min.
+	  Added inline implementations of bounds_from_above/below and
+	  maximize/minimize expliting the private helper functions.
+
+2007-02-28 Wednesday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (1.6): Added methods bounds_from_above,
+	  bounds_from_below, maximize and minimize, with versions computing
+	  a generator; also added private helper functions.
+
+2007-02-28 Wednesday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.208), tests/Polyhedron/memory2.cc (1.13): All tests have
+	  been converted to the new standards.
+
+2007-02-28 Wednesday 11:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinepreimage1.cc (1.20): New test added.
+
+2007-02-28 Wednesday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.17), affinepreimage1.cc
+	  (1.4), bug1.cc (1.4): Test program bug1.cc integrated into
+	  affinepreimage1.cc.
+
+2007-02-28 Wednesday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.61): Previous change completed.
+
+2007-02-28 Wednesday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.60), affinepreimage1.cc (1.19),
+	  affinepreimage2.cc (1.14): Test program affinepreimage2.cc merged
+	  into affinepreimage1.cc.
+
+2007-02-28 Wednesday 09:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.202), src/Congruence_System.cc (1.23),
+	  src/Congruence_System.defs.hh (1.18),
+	  src/Congruence_System.inlines.hh (1.8), src/Constraint_System.cc
+	  (1.22), src/Generator_System.cc (1.21), src/Grid.templates.hh
+	  (1.26), src/Grid_Certificate.cc (1.7),
+	  src/Grid_Generator_System.defs.hh (1.21),
+	  src/Grid_Generator_System.inlines.hh (1.13), src/Grid_chdims.cc
+	  (1.16), src/Grid_conversion.cc (1.19), src/Grid_nonpublic.cc
+	  (1.23), src/Grid_public.cc (1.50), src/Grid_simplify.cc (1.31),
+	  src/Grid_widenings.cc (1.14), src/Linear_System.cc (1.42),
+	  src/Linear_System.inlines.hh (1.21), src/Polyhedron.templates.hh
+	  (1.12), src/Polyhedron_chdims.cc (1.42),
+	  src/Polyhedron_nonpublic.cc (1.76), src/Polyhedron_public.cc
+	  (1.90), src/Polyhedron_widenings.cc (1.59), src/minimize.cc
+	  (1.46): The new methods `bool Congruence_System::empty() const'
+	  and `bool Grid_Generator_System::empty() const' return true if
+	  and only if the system in question is empty.	Method
+	  Grid_Generator_System::num_generators() renamed num_rows().  All
+	  these methods are now used consistently throughout the library.
+
+2007-02-27 Tuesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh (1.8), Polyhedron.templates.hh (1.11):
+	  Fixed Polyhedron::shrink_bounding_box().
+
+2007-02-27 Tuesday 19:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (1.7): Constructor taking a Polyhedron
+	  rewritten from scratch.
+
+2007-02-27 Tuesday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/frompolyhedron1.cc (1.4): Adjusted the known result.
+
+2007-02-27 Tuesday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (1.5), src/Box.inlines.hh (1.4),
+	  src/Box.templates.hh (1.6), src/Interval.defs.hh (1.31),
+	  tests/Box/cc76widening.cc (1.4), tests/Box/concatenate1.cc (1.4),
+	  tests/Box/contains1.cc (1.4), tests/Box/disjoint1.cc (1.4),
+	  tests/Box/foldspacedims1.cc (1.4), tests/Box/removespacedims1.cc
+	  (1.4): Fourth merge from the `altnum' branch.
+
+2007-02-27 Tuesday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/Box.defs.hh, src/Box.templates.hh,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Interval.defs.hh, src/Interval_Restriction.defs.hh,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/Polyhedron.templates.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh
+	  (altnum.[9,7,8,25,39,4,4,5,4,94,10,8,6,5,9,12,11,5,15,7]):
+	  Eleventh merge of the main trunk to the `altnum' branch.
+
+2007-02-27 Tuesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh (1.4), Box.templates.hh (1.5),
+	  Polyhedron.templates.hh (1.10): New constructor `explicit
+	  Box(const Polyhedron& ph, Complexity_Class complexity =
+	  ANY_COMPLEXITY)' builds a box from the polyhedron `ph' taking
+	  into account `complexity'.  This is the beginning of the end of
+	  Polyhedron::shrink_bounding_box().
+
+2007-02-27 Tuesday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.313), Polyhedron.inlines.hh (1.138):
+	  New private method `Constraint_System simplified_constraints()
+	  const' returns, if constraints are up-to-date, a simplified copy
+	  of them.  Class Polyhedron now befriends Box.
+
+2007-02-27 Tuesday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.201), src/Constraint_System.defs.hh (1.35),
+	  src/Constraint_System.inlines.hh (1.9),
+	  src/Generator_System.defs.hh (1.22),
+	  src/Generator_System.inlines.hh (1.8): The new methods `bool
+	  Constraint_System::empty() const' and `bool
+	  Generator_System::empty() const' return true if and only if the
+	  constraint (resp., generator) system has no constraints (resp.,
+	  generators).
+
+2007-02-27 Tuesday 16:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.80), Matrix.inlines.hh (1.51): New method
+	  bool Matrix empty() const returns true if and only if *this has
+	  no rows.
+
+2007-02-27 Tuesday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: cc76widening.cc, foldspacedims1.cc,
+	  removespacedims1.cc (altnum.[4,2,3]): Minor corrections to the
+	  known results.
+
+2007-02-27 Tuesday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.38): Corrected a bug in
+	  remove_space_dimensions().  Do not forget to handle the case of
+	  an empty Box in CC76_widening_assign().  Drafted implementation
+	  for fold_space_dimensions().
+
+2007-02-27 Tuesday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.27): Drafted implementations for
+	  max_space_dimension() and expand_space_dimension().
+
+2007-02-27 Tuesday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.24): Added declaration for
+	  max_space_dimension().
+
+2007-02-27 Tuesday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.37): Fixed an error in
+	  CC76_widening_assign().
+
+2007-02-27 Tuesday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: concatenate1.cc, cc76widening.cc (altnum.[3,3]): Let
+	  it compile.
+
+2007-02-27 Tuesday 11:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: contains1.cc, disjoint1.cc (altnum.[2,2]): Adapted to
+	  the Box domain.
+
+2007-02-27 Tuesday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.36): Corrected method contains(): it
+	  was not checking for emptyness of the first argument. Drafted
+	  implementation for is_disjoint_from().
+
+2007-02-27 Tuesday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.26): Added implementation for
+	  strictly_contains().
+
+2007-02-27 Tuesday 10:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.23): Declared methods strictly_contains()
+	  and is_disjoint_from().  Slightly improved the documentation for
+	  method contains().
+
+2007-02-27 Tuesday 10:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.93): Drafted method
+	  is_disjoint_from(). To be carefully checked.
+
+2007-02-27 Tuesday 09:46  Abramo Bagnara
+
+	* src/: Interval.defs.hh (1.30), Interval_Restriction.defs.hh
+	  (1.4): Functions on restrictions need to return a state.
+
+2007-02-26 Monday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.139), BD_Shape.templates.hh (1.70),
+	  Box.templates.hh (1.4), Makefile.am (1.169),
+	  Octagonal_Shape.inlines.hh (1.14), Octagonal_Shape.templates.hh
+	  (1.48), Old_Interval.cc (1.4), Old_Interval.defs.hh (1.4),
+	  Old_Interval.inlines.hh (1.4), Old_Interval.types.hh (1.4),
+	  Polyhedron.templates.hh (1.9), globals.defs.hh (1.43),
+	  globals.inlines.hh (1.17): Got rid of Old_Interval and related
+	  classes.  Functions div_round_up(), is_additive_inverse(),
+	  is_even(), max_assign(), min_assign() and numer_denom() moved to
+	  globals.defs.hh and globals.inlines.hh.  The method
+	  Polyhedron::shrink_bounding_box() is now based on Box
+	  constructors.
+
+2007-02-26 Monday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.8): Previous change reverted.
+
+2007-02-26 Monday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (1.7): Started getting rid of
+	  Old_Interval.
+
+2007-02-26 Monday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Boundary.defs.hh (1.3), src/Box.cc (1.3), src/Box.defs.hh
+	  (1.3), src/Box.inlines.hh (1.3), src/Box.templates.hh (1.3),
+	  src/Box.types.hh (1.3), src/C_Integer.hh (1.3),
+	  src/Interval_Info.defs.hh (1.3), src/Interval_Info.inlines.hh
+	  (1.3), src/Interval_Info.types.hh (1.3),
+	  src/Interval_Restriction.defs.hh (1.3), src/Old_Interval.cc
+	  (1.3), src/Old_Interval.defs.hh (1.3),
+	  src/Old_Interval.inlines.hh (1.3), src/Old_Interval.types.hh
+	  (1.3), src/Rational_Box.hh (1.3), src/Temp.defs.hh (1.3),
+	  src/meta_programming.hh (1.3), src/mp_std_bits.cc (1.3),
+	  src/mp_std_bits.defs.hh (1.3), src/mp_std_bits.inlines.hh (1.3),
+	  tests/Box/Makefile.am (1.3), tests/Box/addconstraints1.cc (1.3),
+	  tests/Box/addspacedims1.cc (1.3), tests/Box/affinedimension1.cc
+	  (1.3), tests/Box/affineimage1.cc (1.3),
+	  tests/Box/affinepreimage1.cc (1.3), tests/Box/ascii_dump_load1.cc
+	  (1.3), tests/Box/bdsdifference1.cc (1.3),
+	  tests/Box/bgp99extrapolation1.cc (1.3),
+	  tests/Box/bhz03widening1.cc (1.3), tests/Box/bounded1.cc (1.3),
+	  tests/Box/boundedaffineimage1.cc (1.3),
+	  tests/Box/boxdifference1.cc (1.3), tests/Box/boxhull.cc (1.3),
+	  tests/Box/boxhull1.cc (1.3), tests/Box/cc76narrowing1.cc (1.3),
+	  tests/Box/cc76widening.cc (1.3), tests/Box/closure1.cc (1.3),
+	  tests/Box/concatenate1.cc (1.3), tests/Box/constraints1.cc (1.3),
+	  tests/Box/contains1.cc (1.3), tests/Box/containsintegerpoint1.cc
+	  (1.3), tests/Box/discrete1.cc (1.3), tests/Box/disjoint1.cc
+	  (1.3), tests/Box/empty1.cc (1.3), tests/Box/equality1.cc (1.3),
+	  tests/Box/expandspacedim1.cc (1.3), tests/Box/foldspacedims1.cc
+	  (1.3), tests/Box/fromgensys1.cc (1.3),
+	  tests/Box/frompolyhedron1.cc (1.3),
+	  tests/Box/generalizedaffineimage1.cc (1.3),
+	  tests/Box/generalizedaffinepreimage1.cc (1.3),
+	  tests/Box/geomcovers1.cc (1.3), tests/Box/intersection1.cc (1.3),
+	  tests/Box/interval1.cc (1.3), tests/Box/interval2.cc (1.3),
+	  tests/Box/mapspacedims1.cc (1.3), tests/Box/maxspacedim1.cc
+	  (1.3), tests/Box/membytes1.cc (1.3), tests/Box/minconstraints1.cc
+	  (1.3), tests/Box/relations1.cc (1.3),
+	  tests/Box/removespacedims1.cc (1.3), tests/Box/timeelapse1.cc
+	  (1.3), tests/Box/universe1.cc (1.3), tests/Box/writebox1.cc
+	  (1.3): Copyright years extended.
+
+2007-02-26 Monday 10:38  Abramo Bagnara
+
+	* src/: checked.inlines.hh (1.35), checked_ext.inlines.hh (1.35):
+	  Use different function names.
+
+2007-02-26 Monday 10:24  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_ext.inlines.hh
+	  (altnum.[33,15]): Use different function names.
+
+2007-02-25 Sunday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:36 +0000
+
+2007-02-25 Sunday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.265),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.7),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.41), interfaces/Prolog/ppl_prolog_common.icc (1.5),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.15),
+	  interfaces/Prolog/SWI/Makefile.am (1.68),
+	  interfaces/Prolog/tests/pl_check.pl (1.45),
+	  src/BD_Shape.templates.hh (1.69), src/Boundary.defs.hh (1.2),
+	  src/Bounding_Box.cc (1.15), src/Bounding_Box.defs.hh (1.17),
+	  src/Bounding_Box.inlines.hh (1.16), src/Bounding_Box.types.hh
+	  (1.6), src/Box.cc (1.2), src/Box.defs.hh (1.2),
+	  src/Box.inlines.hh (1.2), src/Box.templates.hh (1.2),
+	  src/Box.types.hh (1.2), src/C_Integer.hh (1.2),
+	  src/Checked_Number.defs.hh (1.85), src/Checked_Number.inlines.hh
+	  (1.70), src/DB_Matrix.inlines.hh (1.30),
+	  src/Direct_Product.templates.hh (1.21), src/Float.defs.hh (1.23),
+	  src/GMP_Integer.defs.hh (1.25), src/GMP_Integer.inlines.hh
+	  (1.19), src/GMP_Integer.types.hh (1.15), src/Grid.templates.hh
+	  (1.25), src/Init.cc (1.29), src/Interval.cc (1.15),
+	  src/Interval.defs.hh (1.29), src/Interval.inlines.hh (1.26),
+	  src/Interval.types.hh (1.13), src/Interval_Info.defs.hh (1.2),
+	  src/Interval_Info.inlines.hh (1.2), src/Interval_Info.types.hh
+	  (1.2), src/Interval_Restriction.defs.hh (1.2), src/Limits.hh
+	  (1.11), src/Makefile.am (1.168), src/OR_Matrix.inlines.hh (1.5),
+	  src/Octagonal_Shape.templates.hh (1.47), src/Old_Interval.cc
+	  (1.2), src/Old_Interval.defs.hh (1.2),
+	  src/Old_Interval.inlines.hh (1.2), src/Old_Interval.types.hh
+	  (1.2), src/Polyhedron.inlines.hh (1.137),
+	  src/Polyhedron.templates.hh (1.6), src/Polyhedron_public.cc
+	  (1.89), src/Polyhedron_widenings.cc (1.58), src/Rational_Box.hh
+	  (1.2), src/Result.defs.hh (1.18), src/Rounding_Dir.defs.hh
+	  (1.12), src/Rounding_Dir.inlines.hh (1.6), src/Temp.defs.hh
+	  (1.2), src/checked.defs.hh (1.39), src/checked.inlines.hh (1.34),
+	  src/checked_ext.inlines.hh (1.34), src/checked_float.inlines.hh
+	  (1.72), src/checked_int.inlines.hh (1.57),
+	  src/checked_mpq.inlines.hh (1.36), src/checked_mpz.inlines.hh
+	  (1.41), src/checked_numeric_limits.hh (1.18), src/compiler.hh
+	  (1.9), src/fpu-c99.inlines.hh (1.13), src/fpu-ia32.inlines.hh
+	  (1.16), src/fpu-none.inlines.hh (1.6), src/fpu-sparc.inlines.hh
+	  (1.7), src/fpu.types.hh (1.4), src/globals.defs.hh (1.42),
+	  src/globals.types.hh (1.10), src/meta_programming.hh (1.2),
+	  src/mp_numeric_limits.cc (1.3), src/mp_numeric_limits.hh (1.11),
+	  src/mp_std_bits.cc (1.2), src/mp_std_bits.defs.hh (1.2),
+	  src/mp_std_bits.inlines.hh (1.2), tests/ppl_test.cc (1.8),
+	  tests/ppl_test.hh (1.54), tests/print.hh (1.40),
+	  tests/valgrind_suppressions (1.5), tests/BD_Shape/Makefile.am
+	  (1.59), tests/Box/.cvsignore (1.2), tests/Box/Makefile.am (1.2),
+	  tests/Box/addconstraints1.cc (1.2), tests/Box/addspacedims1.cc
+	  (1.2), tests/Box/affinedimension1.cc (1.2),
+	  tests/Box/affineimage1.cc (1.2), tests/Box/affinepreimage1.cc
+	  (1.2), tests/Box/ascii_dump_load1.cc (1.2),
+	  tests/Box/bdsdifference1.cc (1.2),
+	  tests/Box/bgp99extrapolation1.cc (1.2),
+	  tests/Box/bhz03widening1.cc (1.2), tests/Box/bounded1.cc (1.2),
+	  tests/Box/boundedaffineimage1.cc (1.2),
+	  tests/Box/boxdifference1.cc (1.2), tests/Box/boxhull.cc (1.2),
+	  tests/Box/boxhull1.cc (1.2), tests/Box/cc76narrowing1.cc (1.2),
+	  tests/Box/cc76widening.cc (1.2), tests/Box/closure1.cc (1.2),
+	  tests/Box/concatenate1.cc (1.2), tests/Box/constraints1.cc (1.2),
+	  tests/Box/contains1.cc (1.2), tests/Box/containsintegerpoint1.cc
+	  (1.2), tests/Box/discrete1.cc (1.2), tests/Box/disjoint1.cc
+	  (1.2), tests/Box/empty1.cc (1.2), tests/Box/equality1.cc (1.2),
+	  tests/Box/expandspacedim1.cc (1.2), tests/Box/foldspacedims1.cc
+	  (1.2), tests/Box/fromgensys1.cc (1.2),
+	  tests/Box/frompolyhedron1.cc (1.2),
+	  tests/Box/generalizedaffineimage1.cc (1.2),
+	  tests/Box/generalizedaffinepreimage1.cc (1.2),
+	  tests/Box/geomcovers1.cc (1.2), tests/Box/intersection1.cc (1.2),
+	  tests/Box/interval1.cc (1.2), tests/Box/interval2.cc (1.2),
+	  tests/Box/mapspacedims1.cc (1.2), tests/Box/maxspacedim1.cc
+	  (1.2), tests/Box/membytes1.cc (1.2), tests/Box/minconstraints1.cc
+	  (1.2), tests/Box/relations1.cc (1.2),
+	  tests/Box/removespacedims1.cc (1.2), tests/Box/timeelapse1.cc
+	  (1.2), tests/Box/universe1.cc (1.2), tests/Box/writebox1.cc
+	  (1.2), tests/Grid/boundingbox1.cc (1.15),
+	  tests/Grid/boundingbox2.cc (1.13), tests/Grid/coveringbox1.cc
+	  (1.14), tests/Grid/coveringbox2.cc (1.12),
+	  tests/Grid/directproduct1.cc (1.23),
+	  tests/Octagonal_Shape/Makefile.am (1.16),
+	  tests/Polyhedron/boundingbox1.cc (1.14),
+	  tests/Polyhedron/boundingbox2.cc (1.13),
+	  tests/Polyhedron/boundingbox3.cc (1.14),
+	  tests/Polyhedron/numberinput1.cc (1.30): Third merge from the
+	  `altnum' branch.
+
+2007-02-25 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, README, README.configure, TODO, configure.ac,
+	  instchk.hh, Watchdog/Makefile.am, Watchdog/README,
+	  Watchdog/configure.ac, Watchdog/doc/.cvsignore,
+	  Watchdog/doc/Makefile.am, Watchdog/doc/README.doc,
+	  Watchdog/doc/devref.doxyconf-html.in,
+	  Watchdog/doc/devref.doxyconf-latex.in, Watchdog/doc/devref.tex,
+	  Watchdog/doc/fdl.dox, Watchdog/doc/fdl.tex, Watchdog/doc/fdl.txt,
+	  Watchdog/doc/gpl.dox, Watchdog/doc/gpl.tex, Watchdog/doc/gpl.txt,
+	  Watchdog/doc/pwl.sty, Watchdog/doc/user.doxyconf-html.in,
+	  Watchdog/doc/user.doxyconf-latex.in, Watchdog/doc/user.tex,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  debian/Makefile.am, debian/libppl-pwl.copyright.in,
+	  debian/libppl.copyright.in, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox, doc/devref.tex,
+	  doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl.sty,
+	  doc/ppl_lcdd.1, doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/user.tex,
+	  interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.h.in,
+	  interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4,
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4,
+	  interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+	  interfaces/OCaml/ppl_ocaml_globals.cc,
+	  interfaces/OCaml/ppl_ocaml_globals.ml,
+	  interfaces/OCaml/ppl_ocaml_types.ml, interfaces/OCaml/test1.ml,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/Makefile.am, m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+	  m4/ac_cxx_double_binary_format.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_remainder_bug.m4, m4/ac_prog_jar.m4,
+	  m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	  m4/ac_text_md5sum.m4, m4/ppl.m4, src/Any_Pointset.defs.hh,
+	  src/Any_Pointset.inlines.hh, src/Any_Pointset.types.hh,
+	  src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+	  src/Ask_Tell.templates.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/BD_Shape.types.hh,
+	  src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bit_Matrix.cc,
+	  src/Bit_Matrix.defs.hh, src/Bit_Matrix.inlines.hh,
+	  src/Bit_Matrix.types.hh, src/Bit_Row.cc, src/Bit_Row.defs.hh,
+	  src/Bit_Row.inlines.hh, src/Bit_Row.types.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/C_Polyhedron.types.hh,
+	  src/Checked_Number.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Coefficient.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence.types.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	  src/Congruence_System.types.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	  src/DB_Row.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Determinate.types.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/Float.cc, src/Float.defs.hh, src/Float.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/GMP_Integer.types.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator.inlines.hh,
+	  src/Generator.types.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Generator_System.types.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	  src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	  src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.types.hh, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.types.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Numeric_Format.defs.hh, src/OR_Matrix.defs.hh,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.templates.hh,
+	  src/OR_Matrix.types.hh, src/Octagonal_Shape.cc,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Ph_Status.inlines.hh, src/Pointset_Ask_Tell.cc,
+	  src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+	  src/distances.inlines.hh, src/distances.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu-sparc.inlines.hh,
+	  src/fpu.defs.hh, src/fpu.types.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/namespaces.hh, src/ppl-config.cc.in,
+	  src/ppl_header.hh, src/simplify.cc, src/swapping_sort.icc,
+	  src/version.cc, src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+	  tests/Makefile.am, tests/Partial_Function.cc,
+	  tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/files.cc,
+	  tests/files.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/Ask_Tell/Makefile.am,
+	  tests/Ask_Tell/append1.cc, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim1.cc,
+	  tests/BD_Shape/membytes1.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/run_tests, tests/BD_Shape/timeelapse1.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdshape1.cc,
+	  tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/affinepreimage2.cc,
+	  tests/Grid/approximatepartition1.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	  tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	  tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	  tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/powersetgeometricallyequals1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc, tests/Octagonal_Shape/bug1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/README,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constraints1.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc, tests/Polyhedron/hybrid.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/randphull2.cc, tests/Polyhedron/relations1.cc,
+	  tests/Polyhedron/relations2.cc, tests/Polyhedron/relations3.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims2.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosure1.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/cm_cleaner.sh, utils/cm_splitter.sh,
+	  utils/text2cxxarray.in, utils/timings.cc, utils/timings.hh
+	  (altnum.[6,5,5,10,28,4,7,4,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,8,13,4,7,8,4,6,3,10,5,3,3,5,3,3,3,3,5,5,4,4,3,4,7,3,3,4,5,4,3,4,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,4,4,2,2,2,4,4,9,4,4,4,8,3,5,4,8,3,4,5,5,8,3,3,7,3,2,3,6,3,8,4,2,2,2,4,4,3,3,9,2,3,3,2,2,3,3,3,7,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,5,7,3,2,3,3,3,3,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,8,3,4,4,3,4,3,3,3,3,3,2,3,2,3,3, [...]
+	  Tenth merge of the main trunk to the `altnum' branch.
+
+2007-02-25 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.27): Two corrections to the code
+	  implementing the `--enable-fpmath' option.
+
+2007-02-25 Sunday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/fpu-ia32.inlines.hh (altnum.[26,8]): The
+	  `--enable-fpmath' configure option now causes the possible
+	  definition of macros PPL_FPMATH_MAY_USE_387 and
+	  PPL_FPMATH_MAY_USE_SSE.
+
+2007-02-24 Saturday 20:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.25): New option `--enable-fpmath' allows to
+	  select specific floating point arithmetics.  Possible values are
+	  sse, sse2, 387, sse+387, sse2+387, default or no (equivalent to
+	  --disable-fpmath).
+
+2007-02-24 Saturday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (altnum.8): No longer use the
+	  comma as the separator for plld's -ld-options (since commas can
+	  occur in the arguments, e.g., in -mfpmath=sse,387): use the slash
+	  instead.
+
+2007-02-23 Friday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.11): The user manual (in various
+	  formats) is now in the `docs' package.
+
+2007-02-23 Friday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.207): New entry added.
+
+2007-02-22 Thursday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.24): Drafted new configure options
+	  --enable-sse and --enable-sse2.
+
+2007-02-22 Thursday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.10): Percent signs quoted in the
+	  change log.
+
+2007-02-22 Thursday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.9): Version bumped.
+
+2007-02-22 Thursday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.8): Dependencies for YAP fixed.  Make
+	  sure the header files of GNU Prolog and YAP are found.
+
+2007-02-22 Thursday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.7): Added missing dependencies.
+
+2007-02-19 Monday 17:23  Abramo Bagnara
+
+	* src/: fpu-c99.inlines.hh, fpu-ia32.inlines.hh,
+	  fpu-none.inlines.hh, fpu-sparc.inlines.hh (altnum.[4,7,3,4]): Add
+	  support for SSE. Removed unused function.
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/.cvsignore (altnum.1): file .cvsignore was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/README.doc (altnum.1): file README.doc was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-html.in (altnum.1): file
+	  devref.doxyconf-html.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-html.in (simplex.1): file
+	  devref.doxyconf-html.in was added on branch simplex on 2008-01-07
+	  11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-latex.in (altnum.1): file
+	  devref.doxyconf-latex.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.doxyconf-latex.in (simplex.1): file
+	  devref.doxyconf-latex.in was added on branch simplex on
+	  2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/devref.tex (altnum.1): file devref.tex was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.dox (altnum.1): file fdl.dox was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.dox (simplex.1): file fdl.dox was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.tex (altnum.1): file fdl.tex was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.tex (simplex.1): file fdl.tex was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.txt (altnum.1): file fdl.txt was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/fdl.txt (simplex.1): file fdl.txt was added on
+	  branch simplex on 2008-01-07 11:15:25 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.dox (altnum.1): file gpl.dox was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.tex (altnum.1): file gpl.tex was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/gpl.txt (altnum.1): file gpl.txt was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/pwl.sty (altnum.1): file pwl.sty was added on branch
+	  altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-html.in (altnum.1): file
+	  user.doxyconf-html.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.doxyconf-latex.in (altnum.1): file
+	  user.doxyconf-latex.in was added on branch altnum on 2007-02-25
+	  18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/doc/user.tex (altnum.1): file user.tex was added on
+	  branch altnum on 2007-02-25 18:26:53 +0000
+
+2007-02-18 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.27), configure.ac (1.35),
+	  doc/.cvsignore (1.1), doc/Makefile.am (1.1), doc/README.doc
+	  (1.1), doc/devref.doxyconf-html.in (1.1),
+	  doc/devref.doxyconf-latex.in (1.1), doc/devref.tex (1.1),
+	  doc/fdl.dox (1.1), doc/fdl.tex (1.1), doc/fdl.txt (1.1),
+	  doc/gpl.dox (1.1), doc/gpl.tex (1.1), doc/gpl.txt (1.1),
+	  doc/pwl.sty (1.1), doc/user.doxyconf-html.in (1.1),
+	  doc/user.doxyconf-latex.in (1.1), doc/user.tex (1.1):
+	  Documentation for the Parma Watchdog Library.
+
+2007-02-18 Sunday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.6): %doc tags corrected for the
+	  Prolog interfaces.  Tabs used consistently instead of spaces.
+
+2007-02-18 Sunday 12:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch (ppl-0_9-branch.2): Revised.
+
+2007-02-18 Sunday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README.doc (ppl-0_9-branch.1): Explains where to find
+	  the documentation.
+
+2007-02-18 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/README.gprolog, SWI/README.swiprolog,
+	  YAP/README.yap (ppl-0_9-branch.[2,2,2]): Revised for clarity.
+
+2007-02-17 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl-0.9-docfiles.patch, ppl.spec.in,
+	  interfaces/Prolog/GNU/README.gprolog,
+	  interfaces/Prolog/SWI/README.swiprolog,
+	  interfaces/Prolog/YAP/README.yap (ppl-0_9-branch.[1,5,1,1,1]):
+	  Make `swiprolog-devel' depend on `pl' (at leat 5.6);
+	  documentation added.	The `yap' package has been renamed
+	  `yap-devel' and completed.  The `gprolog' package has been
+	  renamed `gprolog-devel' and completed.  The `ppl_lcdd' and
+	  `ppl_lpsol' programs are now in a new `utils' package.  The
+	  `ppl-config' program is now in the `devel' package.  Modified the
+	  configuration command so that the `glpk-devel' include files are
+	  found.
+
+2007-02-13 Tuesday 14:48  quartieri
+
+	* src/Octagonal_Shape_incremental_strong_closure10.hh (octagons.4):
+	  Corrected some errors.
+
+2007-02-11 Sunday 21:09  Andrea Cimino
+
+	* DarwinPorts_Portfile (ppl-0_9-branch.3): Variant sections
+	  removed.
+
+2007-02-11 Sunday 14:26  Andrea Cimino
+
+	* DarwinPorts_Portfile (ppl-0_9-branch.2): Don't require the
+	  development snapshots of the Prolog systems, use the stable
+	  versions instead.
+
+2007-02-10 Saturday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.4): Summaries improved.  Started
+	  splitting packages into "run-time" and "devel" packages.
+
+2007-02-10 Saturday 20:57  Andrea Cimino
+
+	* DarwinPorts_Portfile (ppl-0_9-branch.1): Initial revision of a
+	  DarwinPort's Portfile.
+
+2007-02-10 Saturday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.3): Do configure with the
+	  --disable-rpath option so as to avoid hardcoding the path to
+	  search libraries.  Do not include libtool archive files.
+	  Packages reorganized: we now have `ppl' and `ppl-devel';  `ppl-c'
+	  has gone.
+
+2007-02-10 Saturday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.2): Added the `%%changelog' section.
+	  `Release' set to 2.  `Packager' and `Vendor' tags removed.
+	  `Summary' fields are no longer ended with a dot.  The value of
+	  the `License' tag is now `GPL'.  Removed unused definition of
+	  `builddir'.  The `Name', `Version' and `Release' tags are now
+	  directly defined.  Commented out the efinitions of the `Require'
+	  and `Prefix' tags.  Set the `BuildRequires' tag to `gmp-devel'.
+	  Exploit the features of `%%setup', `%%configure', `%%install',
+	  `%%post' and `%%postun'.  Mixed use of spaces and tabs avoided.
+
+2007-02-10 Saturday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_9-branch.1): Added the `%changelog' section.
+
+2007-02-09 Friday 14:56  Abramo Bagnara
+
+	* src/fpu-ia32.inlines.hh (altnum.6): First attempt to support SSE
+	  floating point rounding.
+
+2007-02-08 Thursday 19:20  Andrea Cimino
+
+	* interfaces/Java/: jni/Makefile.am (1.11),
+	  tests/C_Polyhedron_test1.java (1.10),
+	  tests/ppl_interface_generator_java_test_java.m4 (1.8): In Darwin
+	  force libtool to generate a .jnilib instead of a .dylib if we
+	  have to deal with a JNI library.
+
+2007-02-08 Thursday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.264): On Fedora Core systems we can now find the
+	  JDK even if the --with-java option is not specified.
+
+2007-02-08 Thursday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.263), m4/Makefile.am (1.24): Improved the
+	  detection of Darwin.
+
+2007-02-08 Thursday 17:03  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.9),
+	  ppl_interface_generator_java_test_java.m4 (1.7): Load the right
+	  interface library appropriately.
+
+2007-02-08 Thursday 16:15  Andrea Cimino
+
+	* configure.ac (1.262): Try to detect if we are building the PPL on
+	  a MacOSX: if so, set the the default JDK path to
+	  /Library/Java/Home.
+
+2007-02-08 Thursday 15:27  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.8),
+	  Makefile.am (1.12), ppl_interface_generator_java_test_java.m4
+	  (1.6): Made some changes to correctly load the Java PPL bindings
+	  if the running OS is Darwin.
+
+2007-02-07 Wednesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.13): Prefer standard C99 floating point
+	  rounding and exception handling on all systems that support it.
+
+2007-02-06 Tuesday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bug1.cc (1.3): Further reduced.
+
+2007-02-06 Tuesday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bug1.cc (altnum.1): file bug1.cc was added
+	  on branch altnum on 2007-02-25 18:27:11 +0000
+
+2007-02-06 Tuesday 15:38  Andrea Cimino
+
+	* tests/Octagonal_Shape/bug1.cc (1.2): Removed some constraints
+	  from the test case to simplify the debugging process.
+
+2007-02-06 Tuesday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.15), bug1.cc (1.1): Small
+	  program showing a (compiler?) bug that manifests itself on
+	  iMac's.
+
+2007-02-03 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_remainder_bug.m4 (altnum.1): file
+	  ac_cxx_remainder_bug.m4 was added on branch altnum on 2007-02-25
+	  18:27:02 +0000
+
+2007-02-03 Saturday 11:57  Andrea Cimino
+
+	* configure.ac (1.261), m4/Makefile.am (1.23),
+	  m4/ac_cxx_remainder_bug.m4 (1.1): Definition of an M4 macro that
+	  checks if INT_MIN / -1 is correctly compiled by the C++ compiler.
+
+2007-02-02 Friday 11:06  quartieri
+
+	* src/: Octagonal_Shape_incremental_strong_closure1.hh,
+	  Octagonal_Shape_incremental_strong_closure10.hh,
+	  Octagonal_Shape_incremental_strong_closure2.hh,
+	  Octagonal_Shape_incremental_strong_closure3.hh,
+	  Octagonal_Shape_incremental_strong_closure4.hh,
+	  Octagonal_Shape_incremental_strong_closure5.hh,
+	  Octagonal_Shape_incremental_strong_closure6.hh,
+	  Octagonal_Shape_incremental_strong_closure7.hh,
+	  Octagonal_Shape_incremental_strong_closure8.hh,
+	  Octagonal_Shape_incremental_strong_closure9.hh
+	  (octagons.[3,3,3,3,3,3,3,3,3,3]): Removed some useless operation
+	  counters.
+
+2007-01-31 Wednesday 13:48  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.54): Removed
+	  'plus_infinity' test from strong_coherence_assign().
+
+2007-01-24 Wednesday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.46): Code for debugging improved.
+
+2007-01-19 Friday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.206): Removed item: - Add tests for
+	  ppl_Polyhedron_contains_integer_point/1 in pl_check.pl.
+
+2007-01-19 Friday 12:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.29),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.33),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.40),
+	  Prolog/tests/pl_check.pl (1.44),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.49): Added a test to pl_check.pl for
+	  ppl_Polyhedron_contains_integer_point/2
+
+	  Also added m4 code to generate interface predicates such as
+	  ppl_Pointset_Powerset_C_Polyhedron_linear_partition/4 and
+	  ppl_Pointset_Powerset_Grid_approximate_partition/4
+
+	  Added m4 code for generating tests for these.
+
+2007-01-15 Monday 13:01  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_mli.m4 (1.5),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.6),
+	  ppl_ocaml_types.ml (1.8): Removed some commented and non used
+	  declarations.
+
+2007-01-15 Monday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_mli.m4 was added on branch
+	  altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-15 Monday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
+	  (altnum.1): file ppl_interface_generator_ocaml_mli_code.m4 was
+	  added on branch altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-15 Monday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_types.ml (altnum.1): file
+	  ppl_ocaml_types.ml was added on branch altnum on 2007-02-25
+	  18:26:59 +0000
+
+2007-01-13 Saturday 20:17  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.12), ppl_interface_generator_ocaml_ml_code.m4 (1.12),
+	  ppl_interface_generator_ocaml_mli.m4 (1.4),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.5),
+	  ppl_ocaml_globals.cc (1.8), ppl_ocaml_types.ml (1.7), test1.ml
+	  (1.28): Corrected the constructors `from space_dimension' that
+	  until now  allowed to build types just from UNIVERSE. Created the
+	  type `degenerate_element' for that purposes.
+
+2007-01-13 Saturday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
+	  (altnum.1): file ppl_interface_generator_ocaml_cc_code.m4 was
+	  added on branch altnum on 2007-02-25 18:26:58 +0000
+
+2007-01-13 Saturday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
+	  (altnum.1): file ppl_interface_generator_ocaml_ml_code.m4 was
+	  added on branch altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-13 Saturday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (altnum.1): file
+	  ppl_ocaml_globals.cc was added on branch altnum on 2007-02-25
+	  18:26:59 +0000
+
+2007-01-11 Thursday 16:00  quartieri
+
+	* src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Octagonal_Shape.templates.hh,
+	  src/Octagonal_Shape_incremental_strong_closure1.hh,
+	  src/Octagonal_Shape_incremental_strong_closure10.hh,
+	  src/Octagonal_Shape_incremental_strong_closure2.hh,
+	  src/Octagonal_Shape_incremental_strong_closure3.hh,
+	  src/Octagonal_Shape_incremental_strong_closure4.hh,
+	  src/Octagonal_Shape_incremental_strong_closure5.hh,
+	  src/Octagonal_Shape_incremental_strong_closure6.hh,
+	  src/Octagonal_Shape_incremental_strong_closure7.hh,
+	  src/Octagonal_Shape_incremental_strong_closure8.hh,
+	  src/Octagonal_Shape_incremental_strong_closure9.hh,
+	  src/Octagonal_Shape_strong_closure2.hh, src/script_flags.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/incremental1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/incremental1.cc
+	  (octagons.[3,3,3,53,2,2,2,2,2,2,2,2,2,2,2,1,3,1,3,1]): Changed
+	  some files to improve the tests on closure and incremental
+	  closure.
+
+2007-01-08 Monday 15:31  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.24),
+	  ppl_java_common.cc (1.29), ppl_java_common.hh (1.26): Written
+	  support for Pointset_Powerset iterators.
+
+2007-01-07 Sunday 13:20  Andrea Cimino
+
+	* configure.ac (1.260),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.6):
+	  Written the Java code to handle Powereset_Iterators.	Still the
+	  C++ code that really intefaces with the PPL must be written.
+	  Modified the Makefile.am to delete all the generated files if the
+	  target `clean' is requested.
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_cc.m4 was added on branch
+	  altnum on 2007-02-25 18:26:58 +0000
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_dat.m4 was added on branch
+	  altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (altnum.1):
+	  file ppl_interface_generator_ocaml_ml.m4 was added on branch
+	  altnum on 2007-02-25 18:26:59 +0000
+
+2007-01-04 Thursday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.28),
+	  C/ppl_interface_generator_c_cc.m4 (1.7),
+	  C/ppl_interface_generator_c_h.m4 (1.11),
+	  Java/ppl_interface_generator_java_dat.m4 (1.5),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.8), Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.5), OCaml/ppl_interface_generator_ocaml_cc.m4 (1.3),
+	  OCaml/ppl_interface_generator_ocaml_dat.m4 (1.5),
+	  OCaml/ppl_interface_generator_ocaml_ml.m4 (1.8),
+	  OCaml/ppl_interface_generator_ocaml_mli.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.32),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.10),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.39),
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.5),
+	  Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.4), Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.5),
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.7),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.8),
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.6),
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.7),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.4), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.48),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.26): Copyright notices fixed.
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (altnum.1): file hybrid.cc was added
+	  on branch altnum on 2007-02-25 18:27:12 +0000
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml_globals.ml (altnum.1): file
+	  ppl_ocaml_globals.ml was added on branch altnum on 2007-02-25
+	  18:26:59 +0000
+
+2007-01-01 Monday 01:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.38), README (1.50), README.configure (1.18),
+	  configure.ac (1.259), instchk.hh (1.8), Watchdog/Makefile.am
+	  (1.26), Watchdog/README (1.15), Watchdog/configure.ac (1.34),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.3),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.3),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.3),
+	  Watchdog/src/EList.defs.hh (1.5), Watchdog/src/EList.inlines.hh
+	  (1.3), Watchdog/src/EList.types.hh (1.3),
+	  Watchdog/src/EList_Iterator.defs.hh (1.3),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.3),
+	  Watchdog/src/EList_Iterator.types.hh (1.3),
+	  Watchdog/src/Handler.defs.hh (1.4),
+	  Watchdog/src/Handler.inlines.hh (1.3),
+	  Watchdog/src/Handler.types.hh (1.3), Watchdog/src/Makefile.am
+	  (1.9), Watchdog/src/Pending_Element.cc (1.3),
+	  Watchdog/src/Pending_Element.defs.hh (1.4),
+	  Watchdog/src/Pending_Element.inlines.hh (1.3),
+	  Watchdog/src/Pending_Element.types.hh (1.3),
+	  Watchdog/src/Pending_List.cc (1.3),
+	  Watchdog/src/Pending_List.defs.hh (1.4),
+	  Watchdog/src/Pending_List.inlines.hh (1.3),
+	  Watchdog/src/Pending_List.types.hh (1.3), Watchdog/src/Time.cc
+	  (1.3), Watchdog/src/Time.defs.hh (1.4),
+	  Watchdog/src/Time.inlines.hh (1.3), Watchdog/src/Time.types.hh
+	  (1.3), Watchdog/src/Watchdog.cc (1.5),
+	  Watchdog/src/Watchdog.defs.hh (1.4),
+	  Watchdog/src/Watchdog.inlines.hh (1.3),
+	  Watchdog/src/Watchdog.types.hh (1.3), Watchdog/src/pwl_header.hh
+	  (1.3), Watchdog/utils/Makefile.am (1.7),
+	  Watchdog/utils/build_header.in (1.4), debian/Makefile.am (1.3),
+	  debian/libppl-pwl.copyright.in (1.4), debian/libppl.copyright.in
+	  (1.4), demos/Makefile.am (1.10), demos/ppl_lcdd/Makefile.am
+	  (1.27), demos/ppl_lcdd/ppl_lcdd.cc (1.58),
+	  demos/ppl_lcdd/examples/Makefile.am (1.8),
+	  demos/ppl_lpsol/Makefile.am (1.38), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.67), demos/ppl_lpsol/examples/Makefile.am (1.8),
+	  doc/Makefile.am (1.50), doc/README.doc (1.11),
+	  doc/definitions.dox (1.200), doc/devref.tex (1.21),
+	  doc/ppl-config.1 (1.5), doc/ppl-config_extra_man_text (1.2),
+	  doc/ppl.sty (1.26), doc/ppl_lcdd.1 (1.3),
+	  doc/ppl_lcdd_extra_man_text (1.2), doc/ppl_lpsol.1 (1.3),
+	  doc/ppl_lpsol_extra_man_text (1.2), doc/user.tex (1.22),
+	  interfaces/Makefile.am (1.25),
+	  interfaces/ppl_interface_generator_common.m4 (1.17),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.27),
+	  interfaces/ppl_interface_generator_copyright (1.3),
+	  interfaces/C/Makefile.am (1.31), interfaces/C/ppl_c.h.in (1.69),
+	  interfaces/C/ppl_c_version.h.in (1.4),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.6),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.13),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.6),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.10),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.7),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.6),
+	  interfaces/Java/Makefile.am (1.10),
+	  interfaces/Java/ppl_interface_generator_java_dat.m4 (1.4),
+	  interfaces/Java/jni/Makefile.am (1.10),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.7),
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.23), interfaces/Java/jni/ppl_java_common.cc (1.28),
+	  interfaces/Java/jni/ppl_java_common.hh (1.25),
+	  interfaces/Java/jni/ppl_java_globals.cc (1.5),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.7),
+	  interfaces/Java/tests/Makefile.am (1.11),
+	  interfaces/Java/tests/Test_Partial_Function.java (1.2),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (1.4),
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.12), interfaces/OCaml/Makefile.am (1.25),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc.m4 (1.2),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.11),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_dat.m4 (1.4),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.7),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 (1.11),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 (1.2),
+	  interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 (1.4),
+	  interfaces/OCaml/ppl_ocaml_globals.cc (1.7),
+	  interfaces/OCaml/ppl_ocaml_globals.ml (1.6),
+	  interfaces/OCaml/ppl_ocaml_types.ml (1.6),
+	  interfaces/OCaml/test1.ml (1.27), interfaces/Prolog/Makefile.am
+	  (1.38), interfaces/Prolog/Prolog_interface.dox (1.158),
+	  interfaces/Prolog/exceptions.hh (1.24),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.31),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.9),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.38),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.9), interfaces/Prolog/ppl_prolog_common.icc (1.4),
+	  interfaces/Prolog/track_allocation.hh (1.21),
+	  interfaces/Prolog/Ciao/Makefile.am (1.62),
+	  interfaces/Prolog/Ciao/ciao_cfli.hh (1.2),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.18),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.14),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.25),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.49),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.4),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (1.3), interfaces/Prolog/GNU/Makefile.am (1.61),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.10),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.11),
+	  interfaces/Prolog/GNU/gprolog_cfli.hh (1.2),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.42),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.4), interfaces/Prolog/SICStus/Makefile.am (1.73),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.6), interfaces/Prolog/SICStus/ppl_sicstus.pl (1.27),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.7),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.9),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.14),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.15),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.9),
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl (1.2),
+	  interfaces/Prolog/SWI/Makefile.am (1.67),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.11),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.10),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.7), interfaces/Prolog/SWI/ppl_pl.cc (1.11),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.7),
+	  interfaces/Prolog/SWI/swi_cfli.hh (1.3),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.9),
+	  interfaces/Prolog/SWI/swi_predicate_check.pl (1.2),
+	  interfaces/Prolog/XSB/Makefile.am (1.48),
+	  interfaces/Prolog/XSB/expected_clpq2_int16 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int32 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a (1.5),
+	  interfaces/Prolog/XSB/expected_clpq2_int64 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int8 (1.4),
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a (1.5),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int16 (1.5),
+	  interfaces/Prolog/XSB/expected_clpq_int16_a (1.5),
+	  interfaces/Prolog/XSB/expected_clpq_int32 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int32_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int64 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int64_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int8 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int8_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_mpz (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a (1.3),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.5),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.6),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.3), interfaces/Prolog/XSB/xsb_cfli.hh (1.2),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.17),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.15),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.29),
+	  interfaces/Prolog/YAP/Makefile.am (1.50),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.5),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.11),
+	  interfaces/Prolog/YAP/yap_cfli.hh (1.2),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.12),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.8),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.12),
+	  interfaces/Prolog/tests/Makefile.am (1.13),
+	  interfaces/Prolog/tests/clpq.pl (1.9),
+	  interfaces/Prolog/tests/clpq2.pl (1.10),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.5),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.3),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.3),
+	  interfaces/Prolog/tests/pl_check.pl (1.43),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.4),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.47),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.25), interfaces/Prolog/tests/ppl_predicate_check_common.pl
+	  (1.3), m4/Makefile.am (1.22), m4/ac_check_fpu_control.m4 (1.3),
+	  m4/ac_check_gmp.m4 (1.24), m4/ac_check_sicstus_prolog.m4 (1.5),
+	  m4/ac_check_swi_prolog.m4 (1.10), m4/ac_check_xsb_prolog.m4
+	  (1.3), m4/ac_cxx_attribute_weak.m4 (1.8),
+	  m4/ac_cxx_double_binary_format.m4 (1.4),
+	  m4/ac_cxx_flexible_arrays.m4 (1.13),
+	  m4/ac_cxx_float_binary_format.m4 (1.3),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.4), m4/ac_prog_jar.m4
+	  (1.2), m4/ac_prog_java.m4 (1.5), m4/ac_prog_javac.m4 (1.4),
+	  m4/ac_prog_javah.m4 (1.8), m4/ac_text_md5sum.m4 (1.2), m4/ppl.m4
+	  (1.5), src/Any_Pointset.defs.hh (1.9),
+	  src/Any_Pointset.inlines.hh (1.2), src/Any_Pointset.types.hh
+	  (1.2), src/Ask_Tell.defs.hh (1.15), src/Ask_Tell.inlines.hh
+	  (1.15), src/Ask_Tell.templates.hh (1.8), src/Ask_Tell.types.hh
+	  (1.6), src/BDS_Status.idefs.hh (1.20), src/BDS_Status.inlines.hh
+	  (1.15), src/BD_Shape.cc (1.4), src/BD_Shape.defs.hh (1.95),
+	  src/BD_Shape.inlines.hh (1.138), src/BD_Shape.templates.hh
+	  (1.68), src/BD_Shape.types.hh (1.6), src/BHRZ03_Certificate.cc
+	  (1.11), src/BHRZ03_Certificate.defs.hh (1.16),
+	  src/BHRZ03_Certificate.inlines.hh (1.8),
+	  src/BHRZ03_Certificate.types.hh (1.5), src/Bit_Matrix.cc (1.2),
+	  src/Bit_Matrix.defs.hh (1.2), src/Bit_Matrix.inlines.hh (1.2),
+	  src/Bit_Matrix.types.hh (1.2), src/Bit_Row.cc (1.2),
+	  src/Bit_Row.defs.hh (1.4), src/Bit_Row.inlines.hh (1.2),
+	  src/Bit_Row.types.hh (1.2), src/Bounding_Box.cc (1.14),
+	  src/Bounding_Box.defs.hh (1.16), src/Bounding_Box.inlines.hh
+	  (1.15), src/Bounding_Box.types.hh (1.5), src/C_Polyhedron.cc
+	  (1.20), src/C_Polyhedron.defs.hh (1.46),
+	  src/C_Polyhedron.inlines.hh (1.34), src/C_Polyhedron.types.hh
+	  (1.11), src/Checked_Number.cc (1.10), src/Checked_Number.defs.hh
+	  (1.84), src/Checked_Number.inlines.hh (1.69),
+	  src/Checked_Number.types.hh (1.10), src/Coefficient.cc (1.5),
+	  src/Coefficient.defs.hh (1.7), src/Coefficient.inlines.hh (1.6),
+	  src/Coefficient.types.hh (1.13),
+	  src/Coefficient_traits_template.hh (1.7), src/Congruence.cc
+	  (1.14), src/Congruence.defs.hh (1.18), src/Congruence.inlines.hh
+	  (1.15), src/Congruence.types.hh (1.3), src/Congruence_System.cc
+	  (1.22), src/Congruence_System.defs.hh (1.17),
+	  src/Congruence_System.inlines.hh (1.7),
+	  src/Congruence_System.types.hh (1.3), src/Constraint.cc (1.65),
+	  src/Constraint.defs.hh (1.124), src/Constraint.inlines.hh (1.66),
+	  src/Constraint.types.hh (1.11), src/Constraint_System.cc (1.21),
+	  src/Constraint_System.defs.hh (1.34),
+	  src/Constraint_System.inlines.hh (1.8),
+	  src/Constraint_System.types.hh (1.5), src/DB_Matrix.defs.hh
+	  (1.26), src/DB_Matrix.inlines.hh (1.29),
+	  src/DB_Matrix.templates.hh (1.4), src/DB_Matrix.types.hh (1.6),
+	  src/DB_Row.defs.hh (1.21), src/DB_Row.inlines.hh (1.20),
+	  src/DB_Row.templates.hh (1.3), src/DB_Row.types.hh (1.7),
+	  src/Determinate.defs.hh (1.64), src/Determinate.inlines.hh
+	  (1.55), src/Determinate.types.hh (1.9),
+	  src/Direct_Product.defs.hh (1.30), src/Direct_Product.inlines.hh
+	  (1.27), src/Direct_Product.templates.hh (1.20),
+	  src/Direct_Product.types.hh (1.6), src/Float.cc (1.5),
+	  src/Float.defs.hh (1.22), src/Float.inlines.hh (1.29),
+	  src/GMP_Integer.defs.hh (1.24), src/GMP_Integer.inlines.hh
+	  (1.18), src/GMP_Integer.types.hh (1.14), src/Generator.cc (1.73),
+	  src/Generator.defs.hh (1.121), src/Generator.inlines.hh (1.60),
+	  src/Generator.types.hh (1.11), src/Generator_System.cc (1.20),
+	  src/Generator_System.defs.hh (1.21),
+	  src/Generator_System.inlines.hh (1.7),
+	  src/Generator_System.types.hh (1.5), src/Grid.defs.hh (1.39),
+	  src/Grid.inlines.hh (1.13), src/Grid.templates.hh (1.24),
+	  src/Grid.types.hh (1.3), src/Grid_Certificate.cc (1.6),
+	  src/Grid_Certificate.defs.hh (1.4),
+	  src/Grid_Certificate.inlines.hh (1.3),
+	  src/Grid_Certificate.types.hh (1.3), src/Grid_Generator.cc
+	  (1.19), src/Grid_Generator.defs.hh (1.28),
+	  src/Grid_Generator.inlines.hh (1.13), src/Grid_Generator.types.hh
+	  (1.3), src/Grid_Generator_System.cc (1.17),
+	  src/Grid_Generator_System.defs.hh (1.20),
+	  src/Grid_Generator_System.inlines.hh (1.12),
+	  src/Grid_Generator_System.types.hh (1.3), src/Grid_Status.cc
+	  (1.6), src/Grid_Status.idefs.hh (1.6), src/Grid_Status.inlines.hh
+	  (1.3), src/Grid_chdims.cc (1.15), src/Grid_conversion.cc (1.18),
+	  src/Grid_nonpublic.cc (1.22), src/Grid_public.cc (1.49),
+	  src/Grid_simplify.cc (1.30), src/Grid_widenings.cc (1.13),
+	  src/H79_Certificate.cc (1.10), src/H79_Certificate.defs.hh
+	  (1.15), src/H79_Certificate.inlines.hh (1.9),
+	  src/H79_Certificate.types.hh (1.5), src/Init.cc (1.28),
+	  src/Init.defs.hh (1.17), src/Init.types.hh (1.10),
+	  src/Interval.cc (1.14), src/Interval.defs.hh (1.28),
+	  src/Interval.inlines.hh (1.25), src/Interval.types.hh (1.12),
+	  src/Limits.hh (1.10), src/Linear_Expression.cc (1.16),
+	  src/Linear_Expression.defs.hh (1.34),
+	  src/Linear_Expression.inlines.hh (1.10),
+	  src/Linear_Expression.types.hh (1.5), src/Linear_Row.cc (1.21),
+	  src/Linear_Row.defs.hh (1.23), src/Linear_Row.inlines.hh (1.12),
+	  src/Linear_Row.types.hh (1.5), src/Linear_System.cc (1.41),
+	  src/Linear_System.defs.hh (1.30), src/Linear_System.inlines.hh
+	  (1.20), src/Linear_System.types.hh (1.5), src/MIP_Problem.cc
+	  (1.45), src/MIP_Problem.defs.hh (1.31),
+	  src/MIP_Problem.inlines.hh (1.13), src/MIP_Problem.templates.hh
+	  (1.10), src/MIP_Problem.types.hh (1.2), src/Makefile.am (1.167),
+	  src/Matrix.cc (1.95), src/Matrix.defs.hh (1.79),
+	  src/Matrix.inlines.hh (1.50), src/Matrix.types.hh (1.11),
+	  src/NNC_Polyhedron.cc (1.20), src/NNC_Polyhedron.defs.hh (1.48),
+	  src/NNC_Polyhedron.inlines.hh (1.35), src/NNC_Polyhedron.types.hh
+	  (1.11), src/Numeric_Format.defs.hh (1.6), src/OR_Matrix.defs.hh
+	  (1.7), src/OR_Matrix.inlines.hh (1.4), src/OR_Matrix.templates.hh
+	  (1.5), src/OR_Matrix.types.hh (1.3), src/Octagonal_Shape.cc
+	  (1.3), src/Octagonal_Shape.defs.hh (1.23),
+	  src/Octagonal_Shape.inlines.hh (1.13),
+	  src/Octagonal_Shape.templates.hh (1.46),
+	  src/Octagonal_Shape.types.hh (1.3), src/Og_Status.idefs.hh (1.6),
+	  src/Og_Status.inlines.hh (1.4), src/Ph_Status.cc (1.12),
+	  src/Ph_Status.idefs.hh (1.20), src/Ph_Status.inlines.hh (1.8),
+	  src/Pointset_Ask_Tell.cc (1.2), src/Pointset_Ask_Tell.defs.hh
+	  (1.6), src/Pointset_Ask_Tell.inlines.hh (1.2),
+	  src/Pointset_Ask_Tell.templates.hh (1.7),
+	  src/Pointset_Ask_Tell.types.hh (1.2), src/Pointset_Powerset.cc
+	  (1.10), src/Pointset_Powerset.defs.hh (1.11),
+	  src/Pointset_Powerset.inlines.hh (1.6),
+	  src/Pointset_Powerset.templates.hh (1.8),
+	  src/Pointset_Powerset.types.hh (1.2), src/Poly_Con_Relation.cc
+	  (1.14), src/Poly_Con_Relation.defs.hh (1.33),
+	  src/Poly_Con_Relation.inlines.hh (1.15),
+	  src/Poly_Con_Relation.types.hh (1.10), src/Poly_Gen_Relation.cc
+	  (1.14), src/Poly_Gen_Relation.defs.hh (1.31),
+	  src/Poly_Gen_Relation.inlines.hh (1.15),
+	  src/Poly_Gen_Relation.types.hh (1.10), src/Polyhedron.defs.hh
+	  (1.312), src/Polyhedron.inlines.hh (1.136),
+	  src/Polyhedron.templates.hh (1.5), src/Polyhedron.types.hh
+	  (1.17), src/Polyhedron_chdims.cc (1.41),
+	  src/Polyhedron_nonpublic.cc (1.75), src/Polyhedron_public.cc
+	  (1.88), src/Polyhedron_widenings.cc (1.57), src/Powerset.defs.hh
+	  (1.29), src/Powerset.inlines.hh (1.19), src/Powerset.templates.hh
+	  (1.4), src/Powerset.types.hh (1.6), src/Ptr_Iterator.defs.hh
+	  (1.8), src/Ptr_Iterator.inlines.hh (1.7),
+	  src/Ptr_Iterator.types.hh (1.6), src/Result.defs.hh (1.17),
+	  src/Result.inlines.hh (1.10), src/Rounding_Dir.defs.hh (1.11),
+	  src/Rounding_Dir.inlines.hh (1.5), src/Row.cc (1.101),
+	  src/Row.defs.hh (1.109), src/Row.inlines.hh (1.63),
+	  src/Row.types.hh (1.12), src/Scalar_Products.cc (1.6),
+	  src/Scalar_Products.defs.hh (1.8), src/Scalar_Products.inlines.hh
+	  (1.5), src/Scalar_Products.types.hh (1.4), src/Topology.hh
+	  (1.13), src/Variable.cc (1.22), src/Variable.defs.hh (1.53),
+	  src/Variable.inlines.hh (1.24), src/Variable.types.hh (1.11),
+	  src/Variables_Set.cc (1.4), src/Variables_Set.defs.hh (1.5),
+	  src/Variables_Set.inlines.hh (1.4), src/Variables_Set.types.hh
+	  (1.2), src/Widening_Function.defs.hh (1.16),
+	  src/Widening_Function.inlines.hh (1.14),
+	  src/Widening_Function.types.hh (1.6), src/algorithms.hh (1.47),
+	  src/checked.cc (1.19), src/checked.defs.hh (1.38),
+	  src/checked.inlines.hh (1.33), src/checked_ext.defs.hh (1.12),
+	  src/checked_ext.inlines.hh (1.33), src/checked_float.inlines.hh
+	  (1.71), src/checked_int.inlines.hh (1.56),
+	  src/checked_mpq.inlines.hh (1.35), src/checked_mpz.inlines.hh
+	  (1.40), src/checked_numeric_limits.hh (1.17), src/compiler.hh
+	  (1.8), src/conversion.cc (1.80), src/distances.defs.hh (1.3),
+	  src/distances.inlines.hh (1.3), src/distances.types.hh (1.3),
+	  src/fpu-c99.inlines.hh (1.12), src/fpu-ia32.inlines.hh (1.15),
+	  src/fpu-none.inlines.hh (1.5), src/fpu-sparc.inlines.hh (1.6),
+	  src/fpu.defs.hh (1.12), src/fpu.types.hh (1.3), src/globals.cc
+	  (1.25), src/globals.defs.hh (1.41), src/globals.inlines.hh
+	  (1.16), src/globals.types.hh (1.9), src/initializer.hh (1.13),
+	  src/iterator_to_const.defs.hh (1.4),
+	  src/iterator_to_const.inlines.hh (1.3),
+	  src/iterator_to_const.types.hh (1.2), src/max_space_dimension.hh
+	  (1.11), src/minimize.cc (1.45), src/mp_numeric_limits.cc (1.2),
+	  src/mp_numeric_limits.hh (1.10), src/namespaces.hh (1.10),
+	  src/ppl-config.cc.in (1.19), src/ppl_header.hh (1.5),
+	  src/simplify.cc (1.47), src/swapping_sort.icc (1.12),
+	  src/version.cc (1.8), src/version.hh.in (1.15), tests/BBox.cc
+	  (1.13), tests/BBox.hh (1.11), tests/FCAIBVP.cc (1.3),
+	  tests/FCAIBVP.defs.hh (1.4), tests/FCAIBVP.inlines.hh (1.4),
+	  tests/FCAIBVP.types.hh (1.2), tests/Makefile.am (1.260),
+	  tests/Partial_Function.cc (1.4), tests/Partial_Function.defs.hh
+	  (1.3), tests/Partial_Function.inlines.hh (1.2),
+	  tests/Partial_Function.types.hh (1.2),
+	  tests/Random_Number_Generator.defs.hh (1.4),
+	  tests/Random_Number_Generator.inlines.hh (1.9),
+	  tests/Random_Number_Generator.types.hh (1.3), tests/files.cc
+	  (1.9), tests/files.hh (1.10), tests/ppl_test.cc (1.7),
+	  tests/ppl_test.hh (1.53), tests/print.cc (1.27), tests/print.hh
+	  (1.39), tests/Ask_Tell/Makefile.am (1.2),
+	  tests/Ask_Tell/append1.cc (1.5), tests/BD_Shape/Makefile.am
+	  (1.58), tests/BD_Shape/addconstraints1.cc (1.17),
+	  tests/BD_Shape/addspacedims1.cc (1.14),
+	  tests/BD_Shape/affinedimension1.cc (1.11),
+	  tests/BD_Shape/affineimage1.cc (1.17),
+	  tests/BD_Shape/affineimage2.cc (1.12),
+	  tests/BD_Shape/affinepreimage1.cc (1.18),
+	  tests/BD_Shape/affinepreimage2.cc (1.13),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.14),
+	  tests/BD_Shape/bdsdifference1.cc (1.13),
+	  tests/BD_Shape/bdshull1.cc (1.15),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.9),
+	  tests/BD_Shape/bhmz05widening1.cc (1.13),
+	  tests/BD_Shape/bhz03widening1.cc (1.9),
+	  tests/BD_Shape/bounded1.cc (1.2),
+	  tests/BD_Shape/boundedaffineimage1.cc (1.3),
+	  tests/BD_Shape/boundedaffinepreimage1.cc (1.2),
+	  tests/BD_Shape/bounds1.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.17),
+	  tests/BD_Shape/cc76narrowing1.cc (1.17),
+	  tests/BD_Shape/closure1.cc (1.15), tests/BD_Shape/concatenate1.cc
+	  (1.13), tests/BD_Shape/constraints1.cc (1.18),
+	  tests/BD_Shape/contains1.cc (1.14),
+	  tests/BD_Shape/containsintegerpoint1.cc (1.2),
+	  tests/BD_Shape/discrete1.cc (1.2), tests/BD_Shape/disjoint1.cc
+	  (1.5), tests/BD_Shape/empty1.cc (1.10),
+	  tests/BD_Shape/equality1.cc (1.15),
+	  tests/BD_Shape/expandspacedim1.cc (1.2),
+	  tests/BD_Shape/foldspacedims1.cc (1.3),
+	  tests/BD_Shape/fromgensys1.cc (1.14),
+	  tests/BD_Shape/frompolyhedron1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.15),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.19),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.13),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.14),
+	  tests/BD_Shape/generalizedaffinepreimage3.cc (1.4),
+	  tests/BD_Shape/geomcovers1.cc (1.9),
+	  tests/BD_Shape/h79widening1.cc (1.12),
+	  tests/BD_Shape/intersection1.cc (1.17),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.12),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.13),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.12),
+	  tests/BD_Shape/mapspacedims1.cc (1.14),
+	  tests/BD_Shape/max_min1.cc (1.2), tests/BD_Shape/max_min2.cc
+	  (1.4), tests/BD_Shape/maxspacedim1.cc (1.2),
+	  tests/BD_Shape/membytes1.cc (1.2),
+	  tests/BD_Shape/minconstraints1.cc (1.10),
+	  tests/BD_Shape/relations1.cc (1.16), tests/BD_Shape/relations2.cc
+	  (1.20), tests/BD_Shape/relations3.cc (1.22),
+	  tests/BD_Shape/removespacedims1.cc (1.18),
+	  tests/BD_Shape/run_tests (1.18), tests/BD_Shape/timeelapse1.cc
+	  (1.17), tests/BD_Shape/universe1.cc (1.14),
+	  tests/BD_Shape/writebdshape1.cc (1.8), tests/Grid/Makefile.am
+	  (1.46), tests/Grid/addcongruence1.cc (1.12),
+	  tests/Grid/addcongruences1.cc (1.15),
+	  tests/Grid/addconstraint1.cc (1.10),
+	  tests/Grid/addconstraints1.cc (1.11), tests/Grid/addgenerator1.cc
+	  (1.14), tests/Grid/addgenerators1.cc (1.13),
+	  tests/Grid/addspacedims1.cc (1.13), tests/Grid/affinedim1.cc
+	  (1.11), tests/Grid/affineimage1.cc (1.12),
+	  tests/Grid/affineimage2.cc (1.10), tests/Grid/affinepreimage1.cc
+	  (1.11), tests/Grid/affinepreimage2.cc (1.6),
+	  tests/Grid/approximatepartition1.cc (1.2),
+	  tests/Grid/asciidumpload1.cc (1.13), tests/Grid/asciidumpload2.cc
+	  (1.5), tests/Grid/asciidumpload3.cc (1.4),
+	  tests/Grid/asciidumpload4.cc (1.4), tests/Grid/asciidumpload5.cc
+	  (1.2), tests/Grid/asciidumpload6.cc (1.2),
+	  tests/Grid/asciidumpload7.cc (1.2), tests/Grid/bhz03widening1.cc
+	  (1.12), tests/Grid/bounded1.cc (1.12),
+	  tests/Grid/boundedaffineimage1.cc (1.2),
+	  tests/Grid/boundedaffinepreimage1.cc (1.2),
+	  tests/Grid/boundingbox1.cc (1.14), tests/Grid/boundingbox2.cc
+	  (1.12), tests/Grid/bounds1.cc (1.14), tests/Grid/certificate1.cc
+	  (1.13), tests/Grid/concatenate1.cc (1.13),
+	  tests/Grid/congruence1.cc (1.16), tests/Grid/congruences1.cc
+	  (1.11), tests/Grid/congruences2.cc (1.5), tests/Grid/contains1.cc
+	  (1.11), tests/Grid/containsintegerpoint1.cc (1.3),
+	  tests/Grid/copyconstruct1.cc (1.7), tests/Grid/coveringbox1.cc
+	  (1.13), tests/Grid/coveringbox2.cc (1.11),
+	  tests/Grid/directproduct1.cc (1.22), tests/Grid/directproduct2.cc
+	  (1.5), tests/Grid/discrete1.cc (1.7), tests/Grid/disjoint1.cc
+	  (1.11), tests/Grid/equals1.cc (1.12),
+	  tests/Grid/expandspacedim1.cc (1.11),
+	  tests/Grid/foldspacedims1.cc (1.11),
+	  tests/Grid/generalizedaffineimage1.cc (1.12),
+	  tests/Grid/generalizedaffineimage2.cc (1.11),
+	  tests/Grid/generalizedaffineimage3.cc (1.2),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.14),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.14),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.2),
+	  tests/Grid/generator1.cc (1.19), tests/Grid/generators1.cc
+	  (1.12), tests/Grid/generators2.cc (1.2), tests/Grid/grid1.cc
+	  (1.19), tests/Grid/grid2.cc (1.15), tests/Grid/grid3.cc (1.19),
+	  tests/Grid/griddifference1.cc (1.11), tests/Grid/intersection1.cc
+	  (1.11), tests/Grid/isempty1.cc (1.7), tests/Grid/isuniverse1.cc
+	  (1.9), tests/Grid/join1.cc (1.15), tests/Grid/join2.cc (1.10),
+	  tests/Grid/limitedextrapolation1.cc (1.11),
+	  tests/Grid/limitedextrapolation2.cc (1.5),
+	  tests/Grid/limitedextrapolation3.cc (1.4),
+	  tests/Grid/mapspacedims1.cc (1.10), tests/Grid/maxmin1.cc (1.11),
+	  tests/Grid/membytes1.cc (1.8), tests/Grid/mincongruences1.cc
+	  (1.9), tests/Grid/mingenerators1.cc (1.9),
+	  tests/Grid/outputoperator1.cc (1.8),
+	  tests/Grid/outputoperator2.cc (1.2),
+	  tests/Grid/outputoperator3.cc (1.2), tests/Grid/partition1.cc
+	  (1.4), tests/Grid/powersetdifference1.cc (1.2),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.2),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.2),
+	  tests/Grid/relations1.cc (1.13), tests/Grid/relations2.cc (1.15),
+	  tests/Grid/relations3.cc (1.6), tests/Grid/removespacedims1.cc
+	  (1.13), tests/Grid/removespacedims2.cc (1.13),
+	  tests/Grid/timeelapse1.cc (1.10), tests/Grid/topclosed1.cc
+	  (1.11), tests/Grid/topclosure1.cc (1.7), tests/Grid/widening1.cc
+	  (1.14), tests/Grid/widening2.cc (1.9), tests/Grid/widening3.cc
+	  (1.4), tests/Grid/writecongruencesystem.cc (1.7),
+	  tests/MIP_Problem/Makefile.am (1.2),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.3),
+	  tests/MIP_Problem/exceptions1.cc (1.2),
+	  tests/MIP_Problem/mipproblem1.cc (1.3),
+	  tests/Octagonal_Shape/Makefile.am (1.14),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.2),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.3),
+	  tests/Octagonal_Shape/affineimage1.cc (1.3),
+	  tests/Octagonal_Shape/affineimage2.cc (1.2),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.3),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.2),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.2),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.3),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.2),
+	  tests/Octagonal_Shape/bounded1.cc (1.2),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.8),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.3),
+	  tests/Octagonal_Shape/bounds1.cc (1.3),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.3),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.3),
+	  tests/Octagonal_Shape/chinainit.cc (1.2),
+	  tests/Octagonal_Shape/concatenate1.cc (1.2),
+	  tests/Octagonal_Shape/constraints1.cc (1.3),
+	  tests/Octagonal_Shape/contains1.cc (1.3),
+	  tests/Octagonal_Shape/containsintegerpoint1.cc (1.3),
+	  tests/Octagonal_Shape/discrete1.cc (1.2),
+	  tests/Octagonal_Shape/disjoint1.cc (1.6),
+	  tests/Octagonal_Shape/empty1.cc (1.2),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.3),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.2),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.2),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.7),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.3),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.2),
+	  tests/Octagonal_Shape/intersection1.cc (1.3),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.3),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.3),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.3),
+	  tests/Octagonal_Shape/max_min1.cc (1.4),
+	  tests/Octagonal_Shape/max_min2.cc (1.3),
+	  tests/Octagonal_Shape/maxspacedim1.cc (1.2),
+	  tests/Octagonal_Shape/membytes1.cc (1.3),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.3),
+	  tests/Octagonal_Shape/octdifference1.cc (1.3),
+	  tests/Octagonal_Shape/octhull1.cc (1.3),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.2),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.4),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.6),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.3),
+	  tests/Octagonal_Shape/run_tests (1.2),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.3),
+	  tests/Octagonal_Shape/universe1.cc (1.2),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.3),
+	  tests/Polyhedron/Makefile.am (1.103), tests/Polyhedron/README
+	  (1.6), tests/Polyhedron/addcongruence1.cc (1.7),
+	  tests/Polyhedron/addcongruences1.cc (1.9),
+	  tests/Polyhedron/addconstraint1.cc (1.9),
+	  tests/Polyhedron/addconstraints1.cc (1.10),
+	  tests/Polyhedron/addconstraints2.cc (1.9),
+	  tests/Polyhedron/addgenerator1.cc (1.10),
+	  tests/Polyhedron/addgenerator2.cc (1.10),
+	  tests/Polyhedron/addgenerators1.cc (1.11),
+	  tests/Polyhedron/addgenerators2.cc (1.10),
+	  tests/Polyhedron/addspacedims1.cc (1.10),
+	  tests/Polyhedron/addspacedims2.cc (1.10),
+	  tests/Polyhedron/affineimage1.cc (1.10),
+	  tests/Polyhedron/affineimage2.cc (1.10),
+	  tests/Polyhedron/affinepreimage1.cc (1.9),
+	  tests/Polyhedron/affinetrans.cc (1.10),
+	  tests/Polyhedron/append1.cc (1.10), tests/Polyhedron/append2.cc
+	  (1.9), tests/Polyhedron/ascii_dump_load1.cc (1.9),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.9),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.10),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.12),
+	  tests/Polyhedron/bhrz03widening1.cc (1.9),
+	  tests/Polyhedron/bhrz03widening2.cc (1.9),
+	  tests/Polyhedron/bhrz03widening3.cc (1.10),
+	  tests/Polyhedron/bhz03widening1.cc (1.13),
+	  tests/Polyhedron/bounded1.cc (1.10),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.8),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.7),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.8),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.10),
+	  tests/Polyhedron/boundingbox1.cc (1.13),
+	  tests/Polyhedron/boundingbox2.cc (1.12),
+	  tests/Polyhedron/boundingbox3.cc (1.13),
+	  tests/Polyhedron/bounds1.cc (1.10),
+	  tests/Polyhedron/cnncconversion1.cc (1.3),
+	  tests/Polyhedron/concatenate1.cc (1.9),
+	  tests/Polyhedron/congruences1.cc (1.7),
+	  tests/Polyhedron/constraints1.cc (1.9),
+	  tests/Polyhedron/contains1.cc (1.9),
+	  tests/Polyhedron/contains2.cc (1.9),
+	  tests/Polyhedron/containsintegerpoint1.cc (1.2),
+	  tests/Polyhedron/disjoint1.cc (1.9),
+	  tests/Polyhedron/disjoint2.cc (1.11),
+	  tests/Polyhedron/dualhypercubes.cc (1.11),
+	  tests/Polyhedron/empty1.cc (1.10), tests/Polyhedron/equals1.cc
+	  (1.9), tests/Polyhedron/exceptions1.cc (1.12),
+	  tests/Polyhedron/exceptions2.cc (1.11),
+	  tests/Polyhedron/exceptions3.cc (1.10),
+	  tests/Polyhedron/expandspacedim1.cc (1.11),
+	  tests/Polyhedron/expandspacedim2.cc (1.11),
+	  tests/Polyhedron/foldspacedims1.cc (1.13),
+	  tests/Polyhedron/foldspacedims2.cc (1.14),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.10),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.10),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.7),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.7),
+	  tests/Polyhedron/generators1.cc (1.10),
+	  tests/Polyhedron/geomcovers1.cc (1.13),
+	  tests/Polyhedron/h79widening1.cc (1.9),
+	  tests/Polyhedron/h79widening2.cc (1.9),
+	  tests/Polyhedron/hybrid.cc (1.3),
+	  tests/Polyhedron/intersection1.cc (1.13),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.8),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.9),
+	  tests/Polyhedron/linearpartition1.cc (1.11),
+	  tests/Polyhedron/linearsystem1.cc (1.8),
+	  tests/Polyhedron/linexpression1.cc (1.9),
+	  tests/Polyhedron/mapspacedims1.cc (1.12),
+	  tests/Polyhedron/matrix1.cc (1.9), tests/Polyhedron/max_min1.cc
+	  (1.11), tests/Polyhedron/maxspacedim1.cc (1.11),
+	  tests/Polyhedron/mc91.cc (1.14), tests/Polyhedron/membytes1.cc
+	  (1.14), tests/Polyhedron/memory1.cc (1.11),
+	  tests/Polyhedron/memory2.cc (1.12),
+	  tests/Polyhedron/minconstraints1.cc (1.9),
+	  tests/Polyhedron/minconstraints2.cc (1.11),
+	  tests/Polyhedron/mingenerators1.cc (1.9),
+	  tests/Polyhedron/mingenerators2.cc (1.10),
+	  tests/Polyhedron/nncminimize1.cc (1.5),
+	  tests/Polyhedron/nncminimize2.cc (1.6),
+	  tests/Polyhedron/numberinput1.cc (1.29),
+	  tests/Polyhedron/onepoint.cc (1.10), tests/Polyhedron/permute.cc
+	  (1.7), tests/Polyhedron/pointsetpowerset1.cc (1.5),
+	  tests/Polyhedron/polydifference1.cc (1.10),
+	  tests/Polyhedron/polydifference2.cc (1.10),
+	  tests/Polyhedron/polyhull1.cc (1.10),
+	  tests/Polyhedron/polyhull2.cc (1.10),
+	  tests/Polyhedron/powerset1.cc (1.19),
+	  tests/Polyhedron/randphull1.cc (1.10),
+	  tests/Polyhedron/randphull2.cc (1.9),
+	  tests/Polyhedron/relations1.cc (1.9),
+	  tests/Polyhedron/relations2.cc (1.10),
+	  tests/Polyhedron/relations3.cc (1.9),
+	  tests/Polyhedron/removespacedims1.cc (1.9),
+	  tests/Polyhedron/removespacedims2.cc (1.9),
+	  tests/Polyhedron/smm1.cc (1.7), tests/Polyhedron/timeelapse1.cc
+	  (1.10), tests/Polyhedron/timeelapse2.cc (1.10),
+	  tests/Polyhedron/topclosed1.cc (1.10),
+	  tests/Polyhedron/topclosure1.cc (1.9),
+	  tests/Polyhedron/universe1.cc (1.9),
+	  tests/Polyhedron/universe2.cc (1.9),
+	  tests/Polyhedron/variablesset1.cc (1.9),
+	  tests/Polyhedron/watchdog1.cc (1.9),
+	  tests/Polyhedron/writeconsys1.cc (1.9),
+	  tests/Polyhedron/writegensys1.cc (1.9),
+	  tests/Polyhedron/writepolyhedron1.cc (1.9),
+	  tests/Polyhedron/writepolyhedron2.cc (1.9),
+	  tests/Polyhedron/writerelation1.cc (1.11),
+	  tests/Polyhedron/writevariable1.cc (1.7), utils/Makefile.am
+	  (1.14), utils/build_header.in (1.4), utils/cm_cleaner.sh (1.2),
+	  utils/cm_splitter.sh (1.2), utils/text2cxxarray.in (1.3),
+	  utils/timings.cc (1.8), utils/timings.hh (1.5): Copyright years
+	  extended.
+
+2006-12-30 Saturday 21:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.30):
+	  Fixed a bug for Pointset_Powerset BHZ03 extrapolation predicates.
+
+2006-12-30 Saturday 14:03  Andrea Cimino
+
+	* configure.ac (1.258): Removed an extra (previously added) `@'.
+
+2006-12-30 Saturday 13:55  Andrea Cimino
+
+	* configure.ac (1.257): Fixed to allow compiling the Java interface
+	  when the instantiation Pointset_Powerset<Polyhedron> is
+	  requested.
+
+2006-12-28 Thursday 16:57  Andrea Cimino
+
+	* m4/ac_prog_java.m4 (1.4): Fixed a `test' statement in a m4 macro.
+
+2006-12-27 Wednesday 14:25  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.10), ppl_interface_generator_ocaml_dat.m4 (1.3),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.10),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.3), test1.ml (1.26):
+	  Written initial support for OCaml Pointset_Powerset.
+
+2006-12-26 Tuesday 14:48  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.9), ppl_interface_generator_ocaml_dat.m4 (1.2),
+	  ppl_interface_generator_ocaml_ml.m4 (1.6), ppl_ocaml_globals.cc
+	  (1.6): Launch an OCaml exception if a PPL method requires an
+	  unsigned integer and the input is a negative number.	Fixed some
+	  bugs in the interface.
+
+2006-12-26 Tuesday 12:40  Andrea Cimino
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 (1.8):
+	  Fixed a wrong m4 replacement.
+
+2006-12-25 Monday 17:02  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.22), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.11): Added CC76_narrowing_assign in the Java interface.
+
+2006-12-24 Sunday 14:56  Andrea Cimino
+
+	* m4/ac_prog_javac.m4 (1.3): Put an extra space between `whether'
+	  and `$JAVAC' in a `configure' message.
+
+2006-12-24 Sunday 11:59  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.7), ppl_interface_generator_ocaml_ml_code.m4 (1.9),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.2), test1.ml (1.25):
+	  Widening OCaml function are split in versions with and without
+	  tokens.
+
+2006-12-23 Saturday 19:00  Andrea Cimino
+
+	* interfaces/OCaml/: Makefile.am (1.24),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.6),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.8),
+	  ppl_interface_generator_ocaml_mli.m4 (1.1),
+	  ppl_interface_generator_ocaml_mli_code.m4 (1.1), ppl_ocaml.mli
+	  (1.18), ppl_ocaml_globals.ml (1.5): Now the interface file .mli
+	  is automatically generated.  Added support for compilation with
+	  srcdir != builddir.  Added support for parallel builds.
+
+2006-12-23 Saturday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.91): Revised the documentation for
+	  refine_existential() and refine_universal().
+
+2006-12-22 Friday 17:20  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.5), ppl_interface_generator_ocaml_ml_code.m4 (1.7): Interfaced
+	  other functions in the OCaml interface.
+
+2006-12-22 Friday 16:14  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.8),
+	  ppl_java_Polyhedron.cc (1.20): Removed previously non generated
+	  source files.
+
+2006-12-22 Friday 16:11  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.23): Modified dependencies for
+	  source files in Makefile.am.
+
+2006-12-22 Friday 16:01  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.ml (1.5): Removed the non generated
+	  `ppl_ocaml.ml' from the repository.
+
+2006-12-22 Friday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.9): Make sure the current
+	  directory is made before `tests'.
+
+2006-12-22 Friday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (1.10): Compile against
+	  ../ppl_java.jar.
+
+2006-12-22 Friday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (1.9): Do not distribute
+	  generated files.  Use `check_JAVA' instead of `EXTRA_DIST'.
+	  Notice that, due to a bug in Automake (at least until version
+	  1.9.6) check_JAVA targes are always compiled.  That bug has
+	  already been reported.
+
+2006-12-22 Friday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.32): Generated file should not
+	  be under CVS.
+
+2006-12-22 Friday 14:05  Andrea Cimino
+
+	* interfaces/Java/tests/Makefile.am (1.8): Java tests restored.
+
+2006-12-22 Friday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (1.2): Make sure
+	  __STDC_LIMIT_MACROS is defined before the first inclusion of
+	  <stdint.h>.
+
+2006-12-22 Friday 11:09  Andrea Cimino
+
+	* interfaces/Java/tests/Makefile.am (1.7): Use always
+	  `ppl_java.jar' archive to build and run the tests.
+
+2006-12-22 Friday 10:33  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.24): Written a Doxygen
+	  comment for function `jtype_to_unsigned'.
+
+2006-12-21 Thursday 17:28  Andrea Cimino
+
+	* interfaces/OCaml/test1.ml (1.24): Restored the
+	  `map_space_dimensions' call.
+
+2006-12-21 Thursday 17:02  Andrea Cimino
+
+	* interfaces/OCaml/test1.ml (1.23): Modified the partial function
+	  to be valid and so the C++ world doesn't throw exceptions
+
+2006-12-21 Thursday 16:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 (1.5):
+	  Correctly generate the type c_polyhedron and nnc_polyhedron as
+	  well as any other class type.
+
+2006-12-21 Thursday 16:20  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.4), ppl_interface_generator_ocaml_ml.m4 (1.4),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.6), test1.ml (1.22):
+	  Split Polyhedron in C_Polyhedron and NNC_Polyhedron.
+
+2006-12-21 Thursday 13:00  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.22): Now it's possible to use the
+	  PPL using the module installed in the OCaml library directory.
+
+2006-12-21 Thursday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.29),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.37),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.46):
+	  Added predicates for ..._upper_bound_if_exact and
+	  poly_hull_if_exact.  Tests for them also added.
+
+2006-12-20 Wednesday 16:48  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.21): Install ppl module in OCaml
+	  library directory if requested.
+
+2006-12-20 Wednesday 15:47  Andrea Cimino
+
+	* interfaces/Java/jni/Makefile.am (1.9), m4/ac_prog_javah.m4 (1.7):
+	  Include JDK Path during C++ compilation just when the Java
+	  interface is compiled. Avoid using obsolete Autoconf macros.
+
+2006-12-20 Wednesday 14:56  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.27): Fixed a bug in the
+	  Java interface: Java grid parameters where not properly
+	  generated.
+
+2006-12-20 Wednesday 13:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.5), test1.ml (1.21): A bug in the code for generalized affine
+	  image fixed.	Improved the printing layout by test1.ml.  Other
+	  small additions to the tests in test1.ml.
+
+2006-12-20 Wednesday 12:35  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.4), ppl_ocaml_types.ml (1.5), test1.ml (1.20): Uniformed name
+	  types.  Little corrections to allow test code to compile.
+
+2006-12-20 Wednesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml_code.m4
+	  (1.3), ppl_ocaml_types.ml (1.4): Some bugs corrected.
+
+2006-12-20 Wednesday 11:46  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.20): Never remove generated
+	  files.
+
+2006-12-20 Wednesday 11:32  Andrea Cimino
+
+	* interfaces/OCaml/Makefile.am (1.19): Patched the Makefile.am to
+	  give priority to generated .ml files when compiling.
+
+2006-12-20 Wednesday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.3), ppl_interface_generator_ocaml_ml.m4 (1.3),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.2),
+	  ppl_ocaml_types.ml (1.3): Added ppl_ at CLASS@_equals_ at CLASS@ to the
+	  interface.  Corrected bugs in code for
+	  ppl_ at CLASS@_ at COMPARISON@_ at CLASS@ Added a type
+	  "relation_with_grid_generator" and corrected some typos that
+	  prevented the generated ppl_ocaml.ml compiling.
+
+2006-12-19 Tuesday 18:07  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml_globals.cc (1.5): Don't forget the
+	  denominator when building PPL grid parameters.
+
+2006-12-19 Tuesday 18:04  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml_globals.cc (1.4), ppl_ocaml_types.ml
+	  (1.2): Implemented support for grid_generator and
+	  grid_generator_system.  No more noisy warnings.
+
+2006-12-19 Tuesday 15:56  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_cc_code.m4
+	  (1.2), ppl_ocaml_globals.cc (1.3): Compilation restored but still
+	  some work needed to let work things properly.
+
+2006-12-19 Tuesday 14:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.31): Restore file that should
+	  not have been revised in previous commit.
+
+2006-12-19 Tuesday 14:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: Makefile.am (1.18),
+	  ppl_interface_generator_ocaml_cc.m4 (1.1),
+	  ppl_interface_generator_ocaml_cc_code.m4 (1.1), ppl_ocaml.cc
+	  (1.30), ppl_ocaml_globals.cc (1.2), test1.ml (1.19): Adding code
+	  for generating the ppl_ocaml.cc file.
+
+2006-12-19 Tuesday 10:44  Andrea Cimino
+
+	* interfaces/Java/Makefile.am (1.8): Install ppl_java.jar in
+	  $prefix/lib/ppl when a `make install' is invoked.
+
+2006-12-19 Tuesday 09:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: ppl_interface_generator_ocaml_ml.m4 (1.2),
+	  ppl_ocaml.cc (1.29), ppl_ocaml_globals.cc (1.1),
+	  ppl_ocaml_globals.ml (1.4): Separated the ppl_ocaml.cc code into
+	  a fixed part and a part to be generated.  Moved more code from
+	  the generated part of ppl_ocaml.ml to the fixed part.
+
+2006-12-19 Tuesday 09:30  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.6),
+	  Makefile.am (1.6): Added a simple test for the Java interface.
+	  Modified Makefile.am to avoid possible problems when `make check'
+	  is called more than one time.
+
+2006-12-18 Monday 23:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/OCaml/: Makefile.am (1.17),
+	  ppl_interface_generator_ocaml_dat.m4 (1.1),
+	  ppl_interface_generator_ocaml_ml.m4 (1.1),
+	  ppl_interface_generator_ocaml_ml_code.m4 (1.1), ppl_ocaml.cc
+	  (1.28), ppl_ocaml.ml (1.4), ppl_ocaml.mli (1.17), test1.ml
+	  (1.18): Revised names of functions to match the rest of the
+	  interfaces.  Now ppl_ocaml.ml is generated using m4 (but only
+	  checked for the Polyhedron class).
+
+2006-12-15 Friday 14:26  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.27), ppl_ocaml_globals.ml
+	  (1.3), test1.ml (1.17): Implemented
+	  `ppl_MIP_Problem_objective_function'.
+
+2006-12-14 Thursday 16:13  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.44), src/Variables_Set.cc (1.3),
+	  src/Variables_Set.defs.hh (1.4),
+	  tests/MIP_Problem/ascii_dump_load1.cc (1.2): Added `ascii_load'
+	  and `ascii_dump' for Variables_Set.  MIP problem now correctly
+	  loads and dumps problems with declared integer variables.
+
+2006-12-14 Thursday 12:25  Andrea Cimino
+
+	* interfaces/Java/: ppl_interface_generator_java_dat.m4 (1.3),
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.21), jni/ppl_java_globals.cc (1.4),
+	  tests/ppl_interface_generator_java_test_java_code.m4 (1.10),
+	  tests/ppl_java_tests_common (1.6): All the Java classes now have
+	  the `toString' method that returns a string representation of
+	  each PPL object.
+
+2006-12-14 Thursday 10:50  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_globals.cc (1.3),
+	  tests/ppl_java_tests_common (1.5): Added the method `toString'
+	  the returns a string representation of a linear expression.
+
+2006-12-13 Wednesday 19:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am, interval2.cc (altnum.[5,1]): A test
+	  derived from interval1.cc that exhibits an interesting behavior.
+
+2006-12-13 Wednesday 18:38  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.90): Fixed typo.
+
+2006-12-13 Wednesday 18:31  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.26): Removed previously
+	  commented code (now useless).
+
+2006-12-13 Wednesday 18:27  Andrea Cimino
+
+	* interfaces/OCaml/: Makefile.am (1.16), ppl_ocaml.cc (1.25),
+	  ppl_ocaml.ml (1.3), ppl_ocaml.mli (1.16), ppl_ocaml_globals.ml
+	  (1.2), ppl_ocaml_types.ml (1.1), test1.ml (1.16): Defined the
+	  data structures used in `ppl_ocaml_types.ml'.  MIP_Problem
+	  interface almost completed.
+
+2006-12-13 Wednesday 14:46  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.30): Added missing fixme comment.
+
+2006-12-13 Wednesday 14:42  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Checked_Number.defs.hh,
+	  Checked_Number.inlines.hh, Interval.defs.hh
+	  (altnum.[29,42,36,89]): Completed division implementation.
+
+2006-12-12 Tuesday 19:57  Andrea Cimino
+
+	* interfaces/OCaml/: Makefile.am (1.15), ppl_ocaml.cc (1.24),
+	  ppl_ocaml.ml (1.2), ppl_ocaml_globals.ml (1.1), test1.ml (1.15):
+	  Added the file `ppl_ocaml_globals.ml' that should contain the
+	  fixed code after the migration to m4.
+
+2006-12-12 Tuesday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.6): Useless code removed.
+
+2006-12-12 Tuesday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.5): Revised so as to perform more
+	  interesting tests.
+
+2006-12-12 Tuesday 18:29  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[28,88]): New
+	  implementation for intervals add, sub and mul.
+
+2006-12-11 Monday 16:30  Andrea Cimino
+
+	* configure.ac (1.256), interfaces/OCaml/Makefile.am (1.14),
+	  interfaces/OCaml/ppl_ocaml.ml (1.1),
+	  interfaces/OCaml/ppl_ocaml.mli (1.15): Separated declaration and
+	  implementation of the OCaml interface.  Added some kinds of
+	  exceptions that relates to PPL.  Added a piece of code in
+	  `configure.ac' that tries to detect the presence of the GMP-OCaml
+	  module.
+
+2006-12-10 Sunday 16:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/hybrid.cc (1.2): Tests 01 and 02 fail with 8-bit
+	  coefficients; the same for test 04, but only when assertions are
+	  enabled.
+
+2006-12-08 Friday 23:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/: Makefile.am (1.102), hybrid.cc (1.1): The
+	  hybrid.cc tests three examples adapted from the papers by
+	  Halbwachs, Proy and Roumanoff on linear hybrid systems (1994 and
+	  1997).
+
+2006-12-08 Friday 14:58  Andrea Cimino
+
+	* tests/Polyhedron/: Makefile.am, serialize1.cc (serial.[1,1]):
+	  Added some tests for the Serializer class.
+
+2006-12-08 Friday 12:54  Andrea Cimino
+
+	* configure.ac, m4/ac_check_bz2lib.m4, m4/ac_check_zlib.m4,
+	  src/Bit_Matrix.defs.hh, src/Bit_Row.defs.hh,
+	  src/Constraint_System.defs.hh, src/Generator_System.defs.hh,
+	  src/Linear_System.defs.hh, src/Makefile.am,
+	  src/Ph_Status.idefs.hh, src/Polyhedron.defs.hh, src/Row.defs.hh,
+	  src/Serializer.cc, src/Serializer.defs.hh,
+	  src/Serializer.inlines.hh, src/Serializer.types.hh
+	  (serial.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Put the Serializer
+	  class under CVS control.  Added some friend declaration to let
+	  the Serializer compile.  Added a couple of macros to detect if
+	  `bz2' and `gzlib' are installed.
+
+2006-12-07 Thursday 11:05  Andrea Cimino
+
+	* src/Polyhedron_nonpublic.cc (1.74): Use `gen_sys_i' instead of
+	  `g' whenever is appropriate to avoid wrong computations.
+
+2006-12-07 Thursday 10:00  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.67): Removed an useless variable and
+	  added const to a variable in BD_Shape::refine.
+
+2006-12-06 Wednesday 19:58  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[27,87]): Fixed
+	  some compilation errors.
+
+2006-12-06 Wednesday 18:20  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.86): Commented out empty check in
+	  OK().
+
+2006-12-06 Wednesday 18:17  Abramo Bagnara
+
+	* src/: Box.inlines.hh, Box.templates.hh, Interval.defs.hh
+	  (altnum.[25,35,85]): Added non working implementation of
+	  refine_universal. Renamed refine in refine_existential.
+
+2006-12-06 Wednesday 16:38  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, checked_ext.inlines.hh
+	  (altnum.[26,84,13]): Some name cleaning. Fixed comparison.
+
+2006-12-06 Wednesday 16:24  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.23), ppl_ocaml.mli (1.14),
+	  test1.ml (1.14): Implemented `map_space_dimension' function in
+	  the OCaml interface.
+
+2006-12-06 Wednesday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/: Makefile.am, boxdifference1.cc (altnum.[4,1]): Added
+	  a test file for the box_difference_assign() method.
+
+2006-12-06 Wednesday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[22,24,34]): Added declarations and drafted
+	  implementations for methods box_difference_assign() and
+	  difference_assign().	Added an assertion inside add_constraint(),
+	  showing a bug in function refine working on Interval objects.
+
+2006-12-06 Wednesday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (altnum.41): Added missing access
+	  control specification.
+
+2006-12-06 Wednesday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.39): Compiler warnings avoided.
+
+2006-12-06 Wednesday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.20): Missing inclusions added.
+
+2006-12-06 Wednesday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (1.21): Shadowing avoided.
+
+2006-12-06 Wednesday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (altnum.7): Now the empty box
+	  (for any number of dimensions) is represented by the singleton
+	  list [empty], the test data has to be updated to match.
+
+2006-12-06 Wednesday 08:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_prolog_common.icc, tests/pl_check.pl (altnum.[7,4,6]): In
+	  tests/pl_check.pl, spelling correction done that has already been
+	  done in the main branch.
+
+	  In ppl_prolog_common.icc, in interval_term(), the upper bound
+	  when unbounded has to be "pinf" and not "minf".
+
+	  In the ppl_prolog.icc code for get_bounding_box, we must cater
+	  specially for the empty box.
+
+2006-12-05 Tuesday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (1.3): Old compilers cannot cope with the
+	  change of the previous commit: reverted.
+
+2006-12-05 Tuesday 21:53  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.22): Avoid to hide previously
+	  declared variables if there is no need.
+
+2006-12-05 Tuesday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (1.2): Useless qualifications (tentatively)
+	  removed.
+
+2006-12-05 Tuesday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.23): Spurious declaration removed.
+
+2006-12-05 Tuesday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.21): Useless breaks removed.
+	  Added a FIXME.
+
+2006-12-05 Tuesday 19:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.12):
+	  Duplicate return statement removed.
+
+2006-12-05 Tuesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.11):
+	  Spurious semicolon removed.
+
+2006-12-05 Tuesday 19:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.73): Avoid shadowing parameters.
+
+2006-12-05 Tuesday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.17), Congruence.inlines.hh (1.14),
+	  Constraint.cc (1.64), Constraint.inlines.hh (1.65),
+	  Grid.inlines.hh (1.12), Grid_Generator.defs.hh (1.27),
+	  Grid_Generator.inlines.hh (1.12),
+	  Grid_Generator_System.inlines.hh (1.11), Makefile.am (1.166),
+	  Polyhedron.inlines.hh (1.135): Inclusions fixed.  A couple of
+	  constructors (with loops) made non-inline.  Made sure inlines are
+	  defined before being called.
+
+2006-12-05 Tuesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/max_space_dimension.hh (1.10): Fixed max_space_dimension().
+
+2006-12-05 Tuesday 17:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/fromgensys1.cc (altnum.3): Adapted to the Box
+	  abstraction; also test the case of closure points.
+
+2006-12-05 Tuesday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.33): Implemented constructor
+	  Box(const Generator_System& gs).
+
+2006-12-05 Tuesday 17:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.42): Spelling corrected.
+
+2006-12-05 Tuesday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[21,23]): Added
+	  recycling constructors from systems of constraints/generators.
+	  Prefer Interval::set_universe() where appropriate.
+
+2006-12-05 Tuesday 11:35  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.20), ppl_ocaml.mli (1.13),
+	  test1.ml (1.13): Implemented `fold_space_dimensions' and
+	  `remove_space_dimensions'.
+
+2006-12-05 Tuesday 09:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/mapspacedims1.cc (altnum.3): Fixed known results.
+
+2006-12-05 Tuesday 09:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.22): Temporarily patched constructor
+	  taking a Constraint_System.
+
+2006-12-04 Monday 23:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.32): Do not assume the underlying
+	  interval type can handle empty intervals (apart from answering
+	  the is_empty() query).
+
+2006-12-04 Monday 23:11  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.83): Invalidate cardinality cache
+	  when needed.
+
+2006-12-04 Monday 22:54  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.82): Added missing return.
+
+2006-12-04 Monday 22:49  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.81): Call normalize() only on
+	  restricted intervals.
+
+2006-12-04 Monday 22:33  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Result.defs.hh, checked.defs.hh
+	  (altnum.[40,3,41]): Made Check_Overflow_Policy more transparent.
+
+2006-12-04 Monday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/empty1.cc (altnum.2): New function test06() exhibits a
+	  bug in Box::is_empty().  The other tests are currently not
+	  executed since they are waiting for conversion.
+
+2006-12-04 Monday 22:06  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.80): Added OK() calls.
+
+2006-12-04 Monday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[20,21,31]): Drafted implementation of methods swap and
+	  map_space_dimensions.
+
+2006-12-04 Monday 21:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.30): Corrected method is_bounded().
+
+2006-12-04 Monday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/bhz03widening1.cc (altnum.2): Disambiguate pointer to
+	  widening method. Added a FIXME to remember that we need to define
+	  a widening certificate for CC76.
+
+2006-12-04 Monday 21:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/boxhull1.cc (altnum.1): Put under CVS control.
+
+2006-12-04 Monday 21:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Box/bgp99extrapolation1.cc (altnum.2): Avoid ambiguity when
+	  taking the address of method CC76_widening_assign.
+
+2006-12-04 Monday 20:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh (altnum.[19,29]): Added
+	  (optional) tokens support to CC76 widening method.
+
+2006-12-04 Monday 20:03  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.79): Fixed singleton output.
+
+2006-12-04 Monday 19:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.4): Do not rely on default
+	  parameters of std::complex constructors.
+
+2006-12-04 Monday 19:43  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.78): Added explicit.
+
+2006-12-04 Monday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/interval1.cc (altnum.3): First rough bits of a new test
+	  shows some interesting things.
+
+2006-12-04 Monday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh, Interval.defs.hh
+	  (altnum.[18,28,77]): Drafted implementations for
+	  Box::ascii_dump() and Box::ascii_load(), currently depending on
+	  stub implementations of the corresponding methods of class
+	  Interval.
+
+2006-12-04 Monday 18:56  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.76): Added return value.
+
+2006-12-04 Monday 18:52  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.75): Fixed info for singleton.
+
+2006-12-04 Monday 18:46  Abramo Bagnara
+
+	* src/: Box.inlines.hh, Interval.defs.hh (altnum.[20,74]): Fixed
+	  division.
+
+2006-12-04 Monday 18:36  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.73): Fixed return type.
+
+2006-12-04 Monday 18:25  Abramo Bagnara
+
+	* src/: Interval.defs.hh, Interval_Restriction.defs.hh
+	  (altnum.[72,9]): Added operators.
+
+2006-12-04 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.71): Added naive version of
+	  Interval::Interval(const Boundary&).
+
+2006-12-04 Monday 17:57  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.35): Fixed typo.
+
+2006-12-04 Monday 16:50  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.70): Fixed signatures.
+
+2006-12-04 Monday 16:24  Abramo Bagnara
+
+	* tests/Box/interval1.cc (altnum.2): Fixed policy.
+
+2006-12-04 Monday 15:49  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.19): Simplified the code to
+	  build constraint systems, generator systems and congruence
+	  systems.
+
+2006-12-04 Monday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundingbox3.cc (altnum.5): Print constraints
+	  whenever printing generators does not give any advantage.  Always
+	  print after having determined the result of the test.
+
+2006-12-04 Monday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.31): Missing dependency added.
+
+2006-12-04 Monday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.27): Corrected a bug in
+	  CC76_widening_assign().
+
+2006-12-04 Monday 15:22  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.18), ppl_ocaml.mli (1.12):
+	  Drafted a first implementation of `relation_with' methods.  In
+	  OCaml the value returned is a list with the relations between a
+	  Constraint/Generator and the Polyhedron.
+
+2006-12-04 Monday 14:48  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.69): Use checked I/O.
+
+2006-12-04 Monday 14:47  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[39,34]): Added I/O for native.
+
+2006-12-04 Monday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: boundingbox1.cc, boundingbox2.cc
+	  (altnum.[5,4]): Print constraints whenever printing generators
+	  does not give any advantage.	Always print after having
+	  determined the result of the test.
+
+2006-12-04 Monday 14:15  Abramo Bagnara
+
+	* src/Interval_Restriction.defs.hh (altnum.8): Fixed restrict()
+	  return value.
+
+2006-12-04 Monday 13:56  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.25): Fixed typo.
+
+2006-12-04 Monday 12:44  Abramo Bagnara
+
+	* src/: Interval_Info.defs.hh, Interval_Restriction.defs.hh
+	  (altnum.[16,7]): Clear info in constructors.
+
+2006-12-04 Monday 12:43  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.68): Added I_MAYBE_EMPTY.
+
+2006-12-04 Monday 12:43  Abramo Bagnara
+
+	* src/Box.inlines.hh (altnum.19): Fixed use of I_Result.
+
+2006-12-04 Monday 12:42  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.24): Fixed boundary comparison.
+
+2006-12-04 Monday 10:42  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.17), ppl_ocaml.mli (1.11),
+	  test1.ml (1.12): Implemented the swap operation between two
+	  polyhedrons.
+
+2006-12-03 Sunday 22:30  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Interval_Restriction.defs.hh,
+	  Temp.defs.hh, checked.inlines.hh (altnum.[38,6,9,31]): Removed
+	  optional parameter in Enable_If when it's useless and confusing.
+
+2006-12-03 Sunday 22:22  Abramo Bagnara
+
+	* src/Temp.defs.hh (altnum.8): Added option type parameter.
+
+2006-12-03 Sunday 20:29  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh, Temp.defs.hh (altnum.[33,7]):
+	  Fixed swap calls.
+
+2006-12-03 Sunday 20:20  Abramo Bagnara
+
+	* src/Temp.defs.hh (altnum.6): Cleaned namespace mess.
+
+2006-12-03 Sunday 19:56  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Temp.defs.hh, mp_std_bits.defs.hh, mp_std_bits.inlines.hh,
+	  Checked_Number.defs.hh, mp_std_bits.defs.hh
+	  (altnum.[36,32,5,3,2,37,4]): Moved swap in the same namespace of
+	  type of its arguments.
+
+2006-12-03 Sunday 17:57  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh,
+	  Rational_Box.hh (altnum.[23,67,15,11]): Removed policy flag
+	  infinity_is_open and fixed the related mess.
+
+2006-12-03 Sunday 17:20  Abramo Bagnara
+
+	* src/Rational_Box.hh (altnum.10): Fixed policy.
+
+2006-12-03 Sunday 17:17  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.66): Fixed OK check.
+
+2006-12-03 Sunday 16:00  Abramo Bagnara
+
+	* src/globals.defs.hh (altnum.13): Much more elegant definitions
+	  for Constant.
+
+2006-12-03 Sunday 14:48  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.16), ppl_ocaml.mli (1.10),
+	  test1.ml (1.11): Implemented `maximize', `minimize' and
+	  `expand_space_dimension'.
+
+2006-12-03 Sunday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (altnum.3): Restored some
+	  of the code lost during the ninth merge from the main trunk.
+
+2006-12-03 Sunday 00:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (altnum.7): Avoid comparing a
+	  Checked_Number with the integer constant 1.
+
+2006-12-02 Saturday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  instchk.hh, Watchdog/config.guess, Watchdog/config.sub,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/C/Makefile.am,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/jni/ppl_java_globals.cc,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am,
+	  interfaces/Java/tests/Test_Partial_Function.java,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java.m4,
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4,
+	  interfaces/Java/tests/ppl_java_tests_common,
+	  interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+	  interfaces/OCaml/test1.ml, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SICStus/sp_predicate_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/swi_predicate_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/ppl_predicate_check_common.pl,
+	  m4/Makefile.am, m4/ac_check_classpath.m4, m4/ac_prog_jar.m4,
+	  m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	  src/Any_Pointset.defs.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+	  src/Bit_Matrix.inlines.hh, src/Bit_Matrix.types.hh,
+	  src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+	  src/Bit_Row.types.hh, src/Box.templates.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid_Generator_System.cc,
+	  src/Grid_chdims.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+	  src/Grid_widenings.cc, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/MIP_Problem.cc, src/MIP_Problem.defs.hh, src/Makefile.am,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Pointset_Powerset.cc, src/Pointset_Powerset.defs.hh,
+	  src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+	  src/Saturation_Matrix.inlines.hh, src/Saturation_Matrix.types.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+	  src/Saturation_Row.inlines.hh, src/Saturation_Row.types.hh,
+	  src/Variables_Set.cc, src/Variables_Set.defs.hh,
+	  src/Variables_Set.inlines.hh, src/conversion.cc,
+	  src/globals.defs.hh, src/minimize.cc, src/mp_std_bits.cc,
+	  src/mp_std_bits.defs.hh, src/simplify.cc, src/swapping_sort.icc,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/bounds1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+	  tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/relations3.cc,
+	  tests/Grid/Makefile.am, tests/Grid/approximatepartition1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/partition1.cc, tests/Grid/powersetdifference1.cc,
+	  tests/Grid/powersetgeometricallycovers1.cc,
+	  tests/Grid/powersetgeometricallyequals1.cc,
+	  tests/Grid/widening2.cc, tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/variablesset1.cc, utils/Makefile.am,
+	  utils/cm_cleaner.sh, utils/cm_splitter.sh
+	  (altnum.[5,9,6,5,23,3,6,5,12,6,7,3,5,9,7,3,4,3,3,3,3,4,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,6,7,2,3,7,6,7,3,3,2,2,7,2,6,3,6,3,3,5,3,3,3,2,3,2,2,2,2,2,3,5,5,6,2,2,2,2,2,2,2,2,26,5,7,6,35,3,3,3,3,3,3,3,6,6,6,3,3,30,2,6,6,3,3,6,3,3,3,3,10,7,14,11,9,3,3,3,3,4,3,4,3,3,3,3,8,12,6,1,2,7,5,3,3,3,6,3,2,2,4,3,2,2,4,2,4,3,2,3,3,3,2,2,2,3,3,6,3,3,2,3,3,2,3,2,2,3,2,3,4,3,3,3,3,2,2]):
+	  Ninth merge of the trunk to the `altnum' branch.
+
+2006-12-02 Saturday 18:01  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[34,31]): Adjusted prototype for arithmetic operators.
+
+2006-12-02 Saturday 17:27  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[22,65]):
+	  Adjusted prototype for interval == and !=.
+
+2006-12-02 Saturday 16:48  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[33,30,40,31,40,36,39]): Made
+	  relational operators on Checked_Numbers less invasive.
+
+2006-12-02 Saturday 16:22  Abramo Bagnara
+
+	* src/C_Integer.hh (altnum.1): Added support for Constants. Use
+	  only a template for all C integers info.
+
+2006-12-02 Saturday 16:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.5): Drafted the documentation for
+	  template <bool b> struct Compile_Time_Check.
+
+2006-12-02 Saturday 16:12  Abramo Bagnara
+
+	* src/: Limits.hh, Makefile.am, checked.inlines.hh,
+	  checked_int.inlines.hh, checked_mpz.inlines.hh, globals.defs.hh
+	  (altnum.[7,29,30,39,38,11]): Added support for Constants. Use
+	  only a template for all C integers info.
+
+2006-12-02 Saturday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.4): Added an example showing how
+	  to use Enable_If.
+
+2006-12-02 Saturday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+	  (altnum.[5,5]): Temporary kludge to allow parallel builds to
+	  work.
+
+2006-12-02 Saturday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.3): Drafted the documentation of
+	  template <bool b, typename T> struct Enable_If.
+
+2006-12-02 Saturday 12:44  Andrea Cimino
+
+	* interfaces/: Java/jni/ppl_java_common.cc (1.26),
+	  OCaml/ppl_ocaml.cc (1.15), OCaml/ppl_ocaml.mli (1.9),
+	  OCaml/test1.ml (1.10): Interfaced other methods that relate to
+	  Polyhedron.  Avoid useless checks in the Java interface.
+
+2006-12-02 Saturday 12:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (altnum.1): file
+	  ppl_java_common.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-12-02 Saturday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+	  (altnum.[4,4]): Previous change completed.
+
+2006-12-02 Saturday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (altnum.35): Fixed copy and paste
+	  mistake.
+
+2006-12-02 Saturday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/meta_programming.hh (altnum.2): Changed an instance of
+	  `class' to `typename'.
+
+2006-12-02 Saturday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Interval.defs.hh, Interval_Restriction.defs.hh, Temp.defs.hh,
+	  checked.inlines.hh, compiler.hh, meta_programming.hh
+	  (altnum.[32,29,64,5,4,29,18,1]): New source `meta_programming.hh'
+	  will contain all our metaprogramming utilities.
+
+2006-12-02 Saturday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am, Octagonal_Shape/Makefile.am
+	  (altnum.[3,3]): Allow parallel builds in tests/BD_Shape and
+	  tests/Octagonal_Shape.
+
+2006-12-02 Saturday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (altnum.37): Spurious comment removed.
+
+2006-12-02 Saturday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Grid/boundingbox1.cc, Grid/boundingbox2.cc,
+	  Grid/coveringbox1.cc, Grid/coveringbox2.cc,
+	  Grid/directproduct1.cc, Polyhedron/boundingbox1.cc,
+	  Polyhedron/boundingbox3.cc (altnum.[3,3,3,3,3,4,4]): No longer
+	  use Bounding_Box: use Rational_Box instead.
+
+2006-12-02 Saturday 10:58  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.28): Fixed comparison.
+
+2006-12-02 Saturday 10:58  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.36): Added missing #include.
+
+2006-12-02 Saturday 10:32  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.14): Solved a bug that was
+	  causing segmentation faults.
+
+2006-12-02 Saturday 10:13  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[27,34,35]): Implemented universal
+	  comparisons.
+
+2006-12-02 Saturday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.17): Drafted the documentation for
+	  template <typename Base, typename Derived> struct
+	  Is_Same_Or_Derived.
+
+2006-12-02 Saturday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Temp.defs.hh, compiler.hh (altnum.[3,16]): Drafted the
+	  documentation for template <bool b> struct Bool, struct True,
+	  struct False, and template <typename T1, typename T2> struct
+	  Is_Same.
+
+2006-12-02 Saturday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh,
+	  GMP_Integer.types.hh, Makefile.am, Old_Interval.defs.hh,
+	  checked.defs.hh, checked_mpq.inlines.hh, checked_mpz.inlines.hh,
+	  checked_numeric_limits.hh, mp_numeric_limits.hh,
+	  mp_std_bits.defs.hh, mp_std_bits.inlines.hh
+	  (altnum.[9,8,6,28,3,39,33,34,7,3,1,1]): New sources
+	  `mp_std_bits.defs.hh' and `mp_std_bits.inlines.hh' contain the
+	  specializations of std:: objects that are not defined by GMP and
+	  MPFR (presently these include std::swap() and
+	  std::numeric_limits).  The policy is to include
+	  mp_std_bits.defs.hh immediately after each inclusion of gmpxx.h.
+	  File `mp_numeric_limits.hh' phased out.
+
+2006-12-01 Friday 18:00  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh,
+	  Interval_Restriction.defs.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh, compiler.hh, fpu-ia32.inlines.hh
+	  (altnum.[21,63,14,4,30,38,15,5]): Silenced some warnings.
+
+2006-12-01 Friday 17:59  Abramo Bagnara
+
+	* src/Temp.defs.hh (altnum.2): Commented out missing specialization
+	  check.
+
+2006-12-01 Friday 16:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.16),
+	  ppl_interface_generator_common_dat.m4 (1.26),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.28),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.36),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.45): Use the H79 certificate for more widenings.  Provided
+	  code for extrapolation operators for the disjuncts for the BGP99
+	  extrapolation. However this is not enabled as the C++ code does
+	  not support this yet.
+
+	  Allow for the replacement to be "NONE" as well as the
+	  alternative.	If either are "NONE" then the code is not
+	  generated.
+
+2006-12-01 Friday 15:55  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.20): Commented out two
+	  COMPILE_TIME_CHECK.
+
+2006-12-01 Friday 15:54  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[32,33]): Added missing swap.
+
+2006-12-01 Friday 15:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Interval.defs.hh,
+	  Interval_Restriction.defs.hh, Rounding_Dir.defs.hh, Temp.defs.hh,
+	  checked.defs.hh, checked_mpq.inlines.hh, checked_mpz.inlines.hh,
+	  compiler.hh (altnum.[31,62,3,5,1,38,31,32,14]): Added support for
+	  fast (dirty) temporary.
+
+2006-12-01 Friday 14:43  Andrea Cimino
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.13): Use a more appropriate way
+	  to return PPL coefficients to the OCaml world.
+
+2006-12-01 Friday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh, OR_Matrix.inlines.hh (altnum.[3,3]):
+	  Use the function sgn() when comparing a Checked_Number with the
+	  constant 0.
+
+2006-12-01 Friday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh
+	  (altnum.[5,5]): Avoid comparing a checked number with the integer
+	  constant 1.
+
+2006-12-01 Friday 11:58  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.12), test1.ml (1.9): The code
+	  now compiles also with non GMP types.  Still some problems to
+	  solve in the lookup phase at runtime.
+
+2006-12-01 Friday 10:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.25):
+	  Redundant code removed and a "FIXME" comment added.
+
+2006-12-01 Friday 10:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.15),
+	  ppl_interface_generator_common_dat.m4 (1.24): Further
+	  modifications to the code for generating the pattern replacements
+	  means that we can also generate the code for the
+	  Pointset_Powerset<BD_Shape<int8_t> > (and similarly
+	  Octagonal_Shape) for the widening and extrapolation operators.
+
+	  One new feature introduced in the m4 code is: if the alternative
+	  replacement is defined to be "NONE", no code is generated. This
+	  caters for the case when the BD_Shape widening does not come with
+	  a certificate and, so, cannot be used for the pointset powerset
+	  certificate widening.
+
+2006-12-01 Friday 09:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.23): In the
+	  widening/extrapolation of Pointset_Powerset domains, when the
+	  disjunct domain is C_Polyhedron or NNC_Polyhedron, we must remove
+	  the topology before looking for the pattern replacement for the
+	  disjunct widening.
+
+2006-12-01 Friday 08:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.27),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.35),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.44):
+	  Added m4 code for generating the BGP99 extrapolation assign
+	  predicate.  A simple check for this extrapolation predicate added
+	  to the tests.
+
+	  Also added draft code for a "with_tokens" version of the BHZ03
+	  certificate widening (but not enabled as there is no
+	  "with_tokens" option in the C++ BHZ03 widening).
+
+2006-12-01 Friday 07:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.34): Correction to Pointset_Powerset certificate widening
+	  code.
+
+2006-11-30 Thursday 23:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.22),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.26),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.33): Added
+	  Prolog predicates for widening pointset_powerset domains using
+	  certificate-based widenings. Code is incomplete and not working.
+
+2006-11-30 Thursday 23:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.defs.hh (altnum.[25,61]): Fixed
+	  implementation of contains() for intervals.  Corrected a bug in
+	  the implementation of Box::contains(). Pointed out a name hiding
+	  issue.
+
+2006-11-30 Thursday 22:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh (altnum.[17,24]): Implemented
+	  method Box::contains().
+
+2006-11-30 Thursday 18:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh
+	  (altnum.[4,4]): Use the sign function when comparing a checked
+	  coefficient with the integer constant 0.
+
+2006-11-30 Thursday 18:43  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.11), ppl_ocaml.mli (1.8),
+	  test1.ml (1.8): Defined and implemented other methods that belong
+	  to Polyhedron.
+
+2006-11-30 Thursday 17:09  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[30,28]): Added implementation of sgn and cmp for native
+	  types.
+
+2006-11-30 Thursday 16:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (altnum.5): Added dummy definitions for
+	  Test_Box_Interval_Info and for check_result() on Box objects.
+
+2006-11-30 Thursday 14:36  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.10), ppl_ocaml.mli (1.7),
+	  test1.ml (1.7): Added support to return congruence systems.
+
+2006-11-30 Thursday 14:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.60): Typo corrected.
+
+2006-11-30 Thursday 13:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Info.defs.hh (altnum.13): Added copyright preamble.
+
+2006-11-30 Thursday 13:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rational_Box.hh (altnum.9): Use Interval_Restriction_None
+	  instead of Interval_No_Restrictions.
+
+2006-11-30 Thursday 09:48  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.9), ppl_ocaml.mli (1.6),
+	  test1.ml (1.6): Written the code to return constraints,
+	  generators, generator systems and constraints system.
+
+2006-11-30 Thursday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.59): Use function info to access
+	  private base class.
+
+2006-11-30 Thursday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval_Restriction.defs.hh (altnum.2): Corrected a typo (EQ
+	  --> V_EQ).
+
+2006-11-30 Thursday 09:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (altnum.4): Inserted a few comppile-time
+	  boolean constants in Test_Box_Interval_Info_Policy; the policy
+	  still misses members.
+
+2006-11-30 Thursday 09:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.58): Added inline definition for
+	  operator!=.
+
+2006-11-30 Thursday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (altnum.30): Added a missing template
+	  argument to a div call in the sqrt implementation.
+
+2006-11-29 Wednesday 17:46  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Box.templates.hh, Interval.defs.hh,
+	  Interval_Info.defs.hh, Interval_Restriction.defs.hh,
+	  Rational_Box.hh, checked_float.inlines.hh, checked_int.inlines.hh
+	  (altnum.[19,23,57,12,1,8,29,37]): First working version of
+	  Interval_Restriction_Integer_Modulo.
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/approximatepartition1.cc (altnum.1): file
+	  approximatepartition1.cc was added on branch altnum on 2006-12-02
+	  22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetdifference1.cc (altnum.1): file
+	  powersetdifference1.cc was added on branch altnum on 2006-12-02
+	  22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallycovers1.cc (altnum.1): file
+	  powersetgeometricallycovers1.cc was added on branch altnum on
+	  2006-12-02 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/powersetgeometricallyequals1.cc (altnum.1): file
+	  powersetgeometricallyequals1.cc was added on branch altnum on
+	  2006-12-02 22:35:33 +0000
+
+2006-11-29 Wednesday 13:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.9), src/Pointset_Powerset.defs.hh
+	  (1.10), tests/Grid/Makefile.am (1.45),
+	  tests/Grid/approximatepartition1.cc (1.1),
+	  tests/Grid/partition1.cc (1.3), tests/Grid/powerset1.cc (1.4),
+	  tests/Grid/powersetdifference1.cc (1.1),
+	  tests/Grid/powersetgeometricallycovers1.cc (1.1),
+	  tests/Grid/powersetgeometricallyequals1.cc (1.1): Corrected and
+	  improved the code for approximate_partition() The test file
+	  approximatepartition1.cc now tests this.  Restored partition1.cc
+	  to just test the algorithm partition() defined there.  Replaced
+	  powerset1.cc by three test files, one for each operation and
+	  added some extra tests.
+
+2006-11-29 Wednesday 06:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/:
+	  ppl_interface_generator_sicstus_sd_cc.m4 (1.5), sp_clpq.pl
+	  (1.14), sp_pl_check.pl (1.8): Added support for SICStus 4.
+
+2006-11-28 Tuesday 18:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.8), src/Pointset_Powerset.defs.hh
+	  (1.9), tests/Grid/partition1.cc (1.2), tests/Grid/powerset1.cc
+	  (1.3): Boolean flag name changed from exact to finite_partition.
+
+	  Added another test to powerset1.cc Changed partition1.cc test to
+	  use approximate_partition()
+
+	  Revised/added a couple of comments.
+
+2006-11-28 Tuesday 17:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.cc (1.7), Pointset_Powerset.defs.hh
+	  (1.8): Functions approximate_partition() and check_containment()
+	  working on (powersets of) grids are now publicly available.
+	  Corrected the handling of the boolean argument encoding exactness
+	  of the partition.
+
+2006-11-28 Tuesday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.7): Use std::make_pair()
+	  where appropriate.
+
+2006-11-28 Tuesday 09:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.21): Enable
+	  ..._geometrically_covers/2 and ..._geometrically_equals/2 for
+	  powersets of Grids.
+
+2006-11-28 Tuesday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Pointset_Powerset.cc (1.6), src/Pointset_Powerset.inlines.hh
+	  (1.5), tests/Grid/powerset1.cc (1.2): Added
+	  geometrically_covers() and geometrically_equals() for Grids.	A
+	  few basic tests for them also added.
+
+2006-11-28 Tuesday 08:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/Makefile.am (1.44), tests/Grid/powerset1.cc (1.1),
+	  src/Pointset_Powerset.cc (1.5): Added poly_difference_assign()
+	  for powersets of grids.
+
+	  Tests added to check this.
+
+	  Also added approximate_partition() for two grids that sets a
+	  Boolean flag depending on whether or not the partition is exact.
+
+2006-11-27 Monday 18:29  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.56): Readded
+	  set_{lower,upper}_unbounded.
+
+2006-11-27 Monday 17:07  Andrea Cimino
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.8), ppl_ocaml.mli (1.5),
+	  test1.ml (1.5): Defined and implemented some constructors and
+	  methods that relates to Polyhedron.
+
+2006-11-27 Monday 16:31  Abramo Bagnara
+
+	* src/: Interval.defs.hh, Interval_Info.defs.hh (altnum.[55,11]):
+	  Fixed some constness.
+
+2006-11-27 Monday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.4): Added stub implementations for a
+	  couple of fully specialized members.
+
+2006-11-27 Monday 15:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.7): Little adjustments to the
+	  documentation: prefer "disjuncts" to "polyhedra" when talking
+	  about elements of a Pointset_Powerset.  Added declarations for
+	  the Pointset_Powerset<Grid> specializations of methods
+	  poly_difference_assign() and geometrically_covers().
+
+2006-11-27 Monday 15:11  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh (altnum.[37,26]): Moved
+	  #include compiler.hh.
+
+2006-11-27 Monday 15:04  Abramo Bagnara
+
+	* src/Rational_Box.hh (altnum.7): Some fixes to conform to new
+	  implementation.
+
+2006-11-27 Monday 14:23  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[18,54,10]): Shiny new implementation of intervals with
+	  support for generic restrictions.
+
+2006-11-27 Monday 14:22  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[36,25,28,36,29,31]): Added Checked_Supports template.
+	  Some name cleaning according to STANDARDS.
+
+2006-11-27 Monday 14:21  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[29,27]): Added some missing Enable_If.
+
+2006-11-27 Monday 14:20  Abramo Bagnara
+
+	* src/compiler.hh (altnum.13): Removed some macros.
+
+2006-11-27 Monday 13:52  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.45),
+	  tests/Octagonal_Shape/constraints1.cc (1.2),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.5): Corrected two bugs:
+	  one in relation_with() and another in add_constraint().
+
+2006-11-27 Monday 13:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.20),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.43): Temporarily disable poly_difference for powersets where
+	  the elements are not Polyhedra.
+
+	  Corrected a bug in the test code..
+
+2006-11-27 Monday 12:42  quartieri
+
+	* tests/BD_Shape/constraints1.cc (1.17), src/BD_Shape.templates.hh
+	  (1.66): Corrected an error in add_constraint() when adding an
+	  inconsistent constraint.
+
+2006-11-27 Monday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.36): In the section about "Names", added (surely
+	  partial) guidelines about when to use lower, upper and mixed case
+	  identifiers.
+
+2006-11-27 Monday 11:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/constraints1.cc (1.16): Added test05 which shows
+	  an error when adding an inconsistent constraint.
+
+2006-11-27 Monday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.32): Corrected ...add_disjuncts code - we must use the C++
+	  name and not the interface name.
+
+2006-11-25 Saturday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.31): When calling predicate ppl_*_get_disjunct/2, the
+	  resulting PPL object handle is now registered in the track
+	  allocation system by calling macro WEAK_REGISTER. These handles
+	  should not be deleted by the Prolog programmer.
+
+2006-11-25 Saturday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.20): Added a new set of
+	  registered objects whose deletion is under the PPL library
+	  responsibility. Added a new method weak_insert() to register
+	  addresses to such objects. Added shorthand macro WEAK_REGISTER.
+	  When destroying the allocation tracker, the memory leak error
+	  message is displayed only when there still are REGISTERed objects
+	  (i.e., disregarding WEAK_REGISTERed objects).
+
+2006-11-25 Saturday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.42): Corrected a few bugs leading to memory leaks when
+	  checking Pointset_Powerset instantiations.
+
+2006-11-24 Friday 17:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.30), tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.41), tests/ppl_predicate_check_common.pl (1.2): Removed some
+	  redundant code and an erroneous assignment.
+
+	  Improved the definition of all the test data.
+
+	  Improved the tests of predicates for the pointset_powerset
+	  domain.
+
+2006-11-24 Friday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/ppl_predicate_check_common.pl (altnum.1):
+	  file ppl_predicate_check_common.pl was added on branch altnum on
+	  2006-12-02 22:35:30 +0000
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
+	  (altnum.1): file ppl_interface_generator_java_test_java.m4 was
+	  added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 15:41  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.25),
+	  jni/ppl_java_common.hh (1.23),
+	  tests/ppl_interface_generator_java_test_java.m4 (1.3): Use
+	  appropriate classes to handle various kinds of exceptions coming
+	  from the C++ world.
+
+2006-11-24 Friday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (altnum.1): file
+	  ppl_java_common.hh was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-24 Friday 14:20  Andrea Cimino
+
+	* interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+	  (1.2), ppl_interface_generator_java_test_java_code.m4 (1.9):
+	  Avoid to continue the test if an overflow is detected.
+
+2006-11-24 Friday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (altnum.1): file ppl_interface_generator_java_test_java_code.m4
+	  was added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 13:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.40): Improved and added tests for the Pointset_Powerset
+	  classes.
+
+2006-11-24 Friday 11:16  Andrea Cimino
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (1.5): Removed an
+	  useless call.
+
+2006-11-24 Friday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (altnum.1): file
+	  C_Polyhedron_test1.java was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-24 Friday 11:00  Andrea Cimino
+
+	* interfaces/Java/tests/: C_Polyhedron_test1.java (1.4),
+	  Makefile.am (1.5), Test_Partial_Function.java (1.1): Added a new
+	  test that relates to Partial_Function implementation in the Java
+	  interface. The written test is based on test03() of
+	  mapspacedims1.cc in the test/Polyhedron directory.
+
+2006-11-24 Friday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (altnum.1): file Makefile.am
+	  was added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Test_Partial_Function.java (altnum.1): file
+	  Test_Partial_Function.java was added on branch altnum on
+	  2006-12-02 22:35:28 +0000
+
+2006-11-24 Friday 10:27  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.24),
+	  ppl_java_common.hh (1.22): Fixed other little errors in
+	  Partial_Function caused by a wrong cut and paste.
+
+2006-11-24 Friday 09:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.25),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.29),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.39):
+	  Added two predicates for the pointset_powerset domains.
+	  ppl_ at CLASS@_size/2 and ppl_ at CLASS@_iterator_equals_iterator/2.
+	  Some tests added to check them.
+
+2006-11-24 Friday 08:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.38): Corrected and added extra tests for the pointset_powerset
+	  predicates.
+
+2006-11-24 Friday 00:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.28): Corrected another typo in ppl_*_begin_iterator and
+	  ppl_*_end_iterator.
+
+2006-11-23 Thursday 21:32  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.23),
+	  ppl_java_common.hh (1.21): Fixed code related to Partial
+	  Function.
+
+2006-11-23 Thursday 19:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.24),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.27): Further
+	  corrected a typo in ppl_*_get_disjunct/2 (test reactivated).
+	  Removed now useless code for ppl_*_get_disjuncts/2.
+
+2006-11-23 Thursday 19:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.23),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.37):
+	  Disabled *_get_disjunct as it still is buggy.
+
+	  Changed several tests so that they first check the existence of
+	  ppl predicates before using them to test the results.  These
+	  checks now have to be in the generated code as the m4 generation
+	  no longer does similar checks.
+
+2006-11-23 Thursday 17:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.22):
+	  Enabled *_get_disjunct
+
+2006-11-23 Thursday 17:51  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.65), tests/BD_Shape/relations3.cc
+	  (1.21): Corrected bugs found in BD_Shape::relation_with(g).
+
+2006-11-23 Thursday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.21),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.26): Corrected the
+	  interfacing of Pointset_Powerset iterators:	- the predicates
+	  *_begin_iterator and *_end_iterator now construct new     objects
+	  of class iterator (note: not const_iterator) that are registered
+	  to the track allocation system;   - added a new predicate
+	  ppl_ at CLASS@_delete_iterator to deallocate an	   iterator (which
+	  is then unregistered);   - added implementations for
+	  *_increment_iterator and *_decrement_iterator;   - corrected
+	  *_get_disjunct so as to check the allocation of the iterator;   -
+	  corrected method *_drop_disjunct so as to update the iterator to
+	  point     to the next disjunct.
+
+2006-11-23 Thursday 15:36  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.8): Use try-catch blocks to allow `make check' pass when
+	  coefficients used are not the GMP ones.
+
+2006-11-23 Thursday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.41): Reactivated check on
+	  ppl_MIP_Problem_objective_function.
+
+2006-11-23 Thursday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (1.3): Corrected method
+	  get_linear_expression. Also made it non-templatic, as it shoudl
+	  be applied to Linear_Expression objects only.
+
+2006-11-23 Thursday 15:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (altnum.1): file
+	  ppl_prolog_common.icc was added on branch altnum on 2006-12-02
+	  22:35:29 +0000
+
+2006-11-23 Thursday 10:50  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh,
+	  checked_float.inlines.hh, checked_numeric_limits.hh
+	  (altnum.[28,35,27,6]): Removed force_integer.
+
+2006-11-23 Thursday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog_common.icc (1.2),
+	  tests/pl_check.pl (1.40): Renamed get_linear_expression() to
+	  get_homogeneous_expression() as this ignored the inhomogeneous
+	  part (needed when getting the objective function for an
+	  MIP_Problem).
+
+	  Added get_linear_expression() although tests show a bug in this.
+
+	  Extended the test predicate mip_get..
+
+2006-11-22 Wednesday 20:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.24): Java interface enabled.
+
+2006-11-22 Wednesday 18:27  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.20),
+	  ppl_java_globals.cc (1.2): Fixed some constructors of Polyhedron.
+	  Added the method `constraints()' to the Java version of
+	  MIP_Problem.
+
+2006-11-22 Wednesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (altnum.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+	  added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-22 Wednesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_globals.cc (altnum.1): file
+	  ppl_java_globals.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-22 Wednesday 15:44  Abramo Bagnara
+
+	* src/: checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[26,35,28,30]): Make wider use of assign_exact. Fixed
+	  floor, ceil, trunc for int.
+
+2006-11-22 Wednesday 15:42  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.24): Cleaned Safe_Comparison.
+
+2006-11-22 Wednesday 13:49  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.7): Some small changes to let the generated test be more
+	  readable.
+
+2006-11-22 Wednesday 12:49  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/checked.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, tests/Polyhedron/numberinput1.cc
+	  (altnum.[27,26,34,12,25,34,27,29,5,4]): Renamed may_be_ in has_.
+
+2006-11-22 Wednesday 12:28  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh, src/checked.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  tests/Polyhedron/numberinput1.cc
+	  (altnum.[26,33,11,24,33,26,28,4,3]): Renamed misleading
+	  handle_nan and handle_infinity in may_be_nan and may_be_infinity.
+
+2006-11-22 Wednesday 11:57  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.19), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.6), tests/ppl_java_tests_common (1.4): Fixed some small bugs
+	  in the Java interface.  Extended the generated test.
+
+2006-11-22 Wednesday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/ppl_java_tests_common (altnum.1): file
+	  ppl_java_tests_common was added on branch altnum on 2006-12-02
+	  22:35:28 +0000
+
+2006-11-22 Wednesday 11:56  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_float.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[23,23,25,27]): Added force_integer implementation.
+
+2006-11-22 Wednesday 11:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.25),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.36),
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.24), src/Grid.defs.hh (1.38), tests/BD_Shape/relations3.cc
+	  (1.20), tests/Octagonal_Shape/relatwithgen1.cc (1.4): Comment
+	  corrected in src/Grid.defs.hh
+
+	  Redundant code removed in added tests in
+	  tests/Octagonal_Shape/relatwithgen1.cc and
+	  tests/BD_Shape/relations3.cc
+
+	  Bug corrected in
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+
+	  Generation of tests simplified (and made faster) in
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+
+	  Temporarily suppressed failing tests in
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+
+2006-11-22 Wednesday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/relations3.cc (1.19),
+	  Octagonal_Shape/relatwithgen1.cc (1.3): Added 2 tests to each of
+	  these test files.
+
+	  The first of these (13 in BD_Shape/relations3.cc and 20 in
+	  Octagonal_Shape/relatwithgen1.cc) throw an exception but the call
+	  to these is commented for now.
+
+	  The second of these (14 in BD_Shape/relations3.cc and 21 in
+	  Octagonal_Shape/relatwithgen1.cc) fail indicating a possible bug.
+
+2006-11-21 Tuesday 22:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: SICStus/sp_predicate_check.pl (1.1),
+	  SWI/swi_predicate_check.pl (1.1), tests/Makefile.am (1.12),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.35),
+	  tests/ppl_interface_generator_predicate_check_extra_code (1.23),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.23),
+	  tests/ppl_predicate_check_common.pl (1.1): The fixed part of the
+	  code containing the test data is now a separate Prolog file
+	  called tests/ppl_predicate_check_common.pl
+
+	  This is included with the generated code by the top-level test
+	  files: SICStus/sp_predicate_check.pl and
+	  SWI/swi_predicate_check.pl.  Similar files will be needed by the
+	  other Prolog systems before they can run these generated tests.
+
+	  The code generator no longer attempts to generate tests for the
+	  fixed MIP and version predicates.
+
+	  The file tests/ppl_interface_generator_predicate_check_extra_code
+	  which contained the fixed data is now replaced by
+	  ppl_predicate_check_common.pl.
+
+2006-11-21 Tuesday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_predicate_check.pl (altnum.1): file
+	  sp_predicate_check.pl was added on branch altnum on 2006-12-02
+	  22:35:29 +0000
+
+2006-11-21 Tuesday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_predicate_check.pl (altnum.1): file
+	  swi_predicate_check.pl was added on branch altnum on 2006-12-02
+	  22:35:30 +0000
+
+2006-11-21 Tuesday 18:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.19): It is
+	  upper_bound_assign_if_exact and not as I had it:
+	  upper_bound_if_exact.
+
+2006-11-21 Tuesday 18:37  Andrea Cimino
+
+	* interfaces/Java/:
+	  jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.18), tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.5), tests/ppl_java_tests_common (1.3): Some fixes to the
+	  interface.  Extended the m4 generated test.
+
+2006-11-21 Tuesday 16:16  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.64): Removed an useless variable
+	  `space_dim' in refine().
+
+2006-11-21 Tuesday 15:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.18): Allow
+	  the relation_with_generator procedrure for BD_Shape.
+
+2006-11-21 Tuesday 11:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: Makefile.am (1.4),
+	  ppl_interface_generator_java_test_java_code.m4 (1.4): Added a
+	  test for affine and space dimension.	Changed the Makefile.am so
+	  that make check runs the generated test.
+
+2006-11-21 Tuesday 11:28  Andrea Cimino
+
+	* interfaces/Java/tests/: Makefile.am (1.3),
+	  ppl_interface_generator_java_test_java_code.m4 (1.3),
+	  ppl_java_tests_common (1.2): Fixed test generation.  Allow
+	  Makefile to compile the generated Java source.
+
+2006-11-21 Tuesday 10:48  Andrea Cimino
+
+	*
+	  interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
+	  (1.2): Fixed the m4 to build the test correctly.
+
+2006-11-21 Tuesday 10:04  Andrea Cimino
+
+	* interfaces/Java/jni/: Makefile.am (1.8), ppl_java_common.cc
+	  (1.22), ppl_java_common.hh (1.20), ppl_java_globals.cc (1.1):
+	  Written an almost complete support for MIP_Problem.  Written the
+	  class Parma_Polyhedra_Library to obtain version information about
+	  the library.
+
+2006-11-21 Tuesday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (altnum.1): file Makefile.am was
+	  added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-21 Tuesday 09:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/tests/: ppl_interface_generator_java_test_java.m4
+	  (1.1), ppl_interface_generator_java_test_java_code.m4 (1.1),
+	  ppl_java_tests_common (1.1): New files for generating the tests
+	  for the Java interface.
+
+2006-11-20 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.templates.hh,
+	  Octagonal_Shape_incremental_strong_closure1.hh,
+	  Octagonal_Shape_incremental_strong_closure10.hh,
+	  Octagonal_Shape_incremental_strong_closure2.hh,
+	  Octagonal_Shape_incremental_strong_closure3.hh,
+	  Octagonal_Shape_incremental_strong_closure4.hh,
+	  Octagonal_Shape_incremental_strong_closure5.hh,
+	  Octagonal_Shape_incremental_strong_closure6.hh,
+	  Octagonal_Shape_incremental_strong_closure7.hh,
+	  Octagonal_Shape_incremental_strong_closure8.hh,
+	  Octagonal_Shape_incremental_strong_closure9.hh,
+	  Octagonal_Shape_strong_closure1.hh,
+	  Octagonal_Shape_strong_closure2.hh,
+	  Octagonal_Shape_strong_closure4.hh
+	  (octagons.[52,1,1,1,1,1,1,1,1,1,1,1,1,1]): Alternate versions of
+	  Octagonal_Shape<T>::strong_closure_assign() and
+	  Octagonal_Shape<T>::incremental_strong_closure_assign(Variable).
+	  They can be selected at configure time by setting CPPFLAGS in the
+	  appropriate way.
+
+2006-11-20 Monday 12:23  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.17),
+	  ppl_java_common.hh (1.19): In widening methods, ensure that the
+	  Java token can fit in a C++ unsigned integer.
+
+2006-11-19 Sunday 23:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.20),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.24): Prolog
+	  interface predicates ppl_..._get_disjunct and
+	  ppl_..._drop_disjunct draft code added.
+
+2006-11-19 Sunday 11:27  Abramo Bagnara
+
+	* src/: Interval.defs.hh, Interval_Info.defs.hh, Rational_Box.hh
+	  (altnum.[53,9,6]): Allow Interval inheritance. Removed
+	  check_empty_args policy.
+
+2006-11-19 Sunday 11:26  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked.inlines.hh, checked_ext.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[25,25,32,22,10,22,32,24,26]): Use separate policies also
+	  for checked lowlevel. Added trunc. Converted check_nan_args into
+	  check_nan_result. Use full function names in SPECIALIZE_ macros.
+
+2006-11-19 Sunday 11:22  Abramo Bagnara
+
+	* src/compiler.hh (altnum.12): Added ENABLE_IF macro.
+
+2006-11-18 Saturday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, INSTALL, NEWS, STANDARDS, TODO, config.guess,
+	  config.sub, configure.ac, install-sh, instchk.hh, missing,
+	  mkinstalldirs, Watchdog/ChangeLog, Watchdog/INSTALL,
+	  Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	  Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/Handler.defs.hh,
+	  Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/README,
+	  demos/ppl_lpsol/examples/egout.mps,
+	  demos/ppl_lpsol/examples/ex11.mps,
+	  demos/ppl_lpsol/examples/ex12.mps,
+	  demos/ppl_lpsol/examples/lseu.mps,
+	  demos/ppl_lpsol/examples/markshare1.mps,
+	  demos/ppl_lpsol/examples/markshare2.mps,
+	  demos/ppl_lpsol/examples/mas74.mps,
+	  demos/ppl_lpsol/examples/mas76.mps,
+	  demos/ppl_lpsol/examples/modglob.mps,
+	  demos/ppl_lpsol/examples/noswot.mps,
+	  demos/ppl_lpsol/examples/opt1217.mps,
+	  demos/ppl_lpsol/examples/p0033.mps,
+	  demos/ppl_lpsol/examples/pk1.mps,
+	  demos/ppl_lpsol/examples/rout.mps, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/ppl-config.1, doc/ppl-config_extra_man_text, doc/ppl_lcdd.1,
+	  doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/Java/ppl_interface_generator_java_dat.m4,
+	  interfaces/Java/jni/.cvsignore, interfaces/Java/jni/Makefile.am,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4,
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4,
+	  interfaces/Java/jni/ppl_java_C_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc,
+	  interfaces/Java/jni/ppl_java_common.cc,
+	  interfaces/Java/jni/ppl_java_common.hh,
+	  interfaces/Java/tests/.cvsignore,
+	  interfaces/Java/tests/C_Polyhedron_test1.java,
+	  interfaces/Java/tests/Makefile.am, interfaces/OCaml/Makefile.am,
+	  interfaces/OCaml/ppl_ocaml.cc, interfaces/OCaml/ppl_ocaml.mli,
+	  interfaces/OCaml/test1.ml, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/ppl_prolog_common.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  m4/Makefile.am, m4/ac_check_classpath.m4, m4/ac_prog_jar.m4,
+	  m4/ac_prog_java.m4, m4/ac_prog_javac.m4, m4/ac_prog_javah.m4,
+	  src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	  src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	  src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/Bit_Matrix.cc, src/Bit_Matrix.defs.hh,
+	  src/Bit_Matrix.inlines.hh, src/Bit_Matrix.types.hh,
+	  src/Bit_Row.cc, src/Bit_Row.defs.hh, src/Bit_Row.inlines.hh,
+	  src/Bit_Row.types.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Congruence_System.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.templates.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Certificate.cc, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	  src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+	  src/MIP_Problem.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/NNC_Polyhedron.cc,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/OR_Matrix.templates.hh, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.templates.hh, src/Result.defs.hh,
+	  src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/algorithms.hh,
+	  src/checked.cc, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/conversion.cc,
+	  src/fpu-ia32.inlines.hh, src/globals.defs.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/mp_numeric_limits.cc,
+	  src/mp_numeric_limits.hh, src/namespaces.hh, src/simplify.cc,
+	  src/swapping_sort.icc, tests/BBox.cc, tests/FCAIBVP.cc,
+	  tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+	  tests/FCAIBVP.types.hh, tests/Makefile.am,
+	  tests/Partial_Function.cc, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/Ask_Tell/.cvsignore,
+	  tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/boundedaffinepreimage1.cc,
+	  tests/BD_Shape/bounds1.cc, tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/max_min1.cc,
+	  tests/BD_Shape/max_min2.cc, tests/BD_Shape/maxspacedim.cc,
+	  tests/BD_Shape/maxspacedim1.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+	  tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/affinepreimage2.cc, tests/Grid/asciidumpload1.cc,
+	  tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	  tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	  tests/Grid/asciidumpload6.cc, tests/Grid/asciidumpload7.cc,
+	  tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/containsintegerpoint1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/outputoperator2.cc, tests/Grid/outputoperator3.cc,
+	  tests/Grid/partition1.cc, tests/Grid/relations1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	  tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	  tests/Grid/timeelapse1.cc, tests/Grid/topclosed1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/MIP_Problem/.cvsignore,
+	  tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/bounds1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/foldspacedims1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/max_min1.cc,
+	  tests/Octagonal_Shape/max_min2.cc,
+	  tests/Octagonal_Shape/maxspacedim1.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/append1.cc, tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/bug2.dat,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/dualhypercubes.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	  tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/timeelapse1.cc,
+	  tests/Polyhedron/variablesset1.cc, utils/Makefile.am,
+	  utils/cm_cleaner.sh, utils/cm_splitter.sh, utils/timings.cc
+	  (octagons.[1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,4,4,1,2,1,2,1,2,2,2,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,1,1,1,2,2,2,2,2,2,1,1,2,1,1,1,2,2,1,2,1,1,2,1,2,1,1,1,2,1,2,1,1,1,2,2,2,1,1,2,1,1,2,1,2,1,1,1,1,1,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,2,3,3,3,2,3,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,2,1,2,2,1,2,1,2,2,1,1,2, [...]
+	  Second merge to octagons.
+
+2006-11-18 Saturday 16:50  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.16): A couple of bugs fixed in the generation of the C++ code.
+
+2006-11-18 Saturday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (octagons.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 was
+	  added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-18 Saturday 16:02  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.15),
+	  ppl_java_common.hh (1.18): Ensure that a jlong fits in a unsigned
+	  type for methods that need that check. Some m4 code fixes.
+
+2006-11-18 Saturday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.hh (octagons.1): file
+	  ppl_java_common.hh was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-18 Saturday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.205): Commit test.
+
+2006-11-18 Saturday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.204): Test commit.
+
+2006-11-18 Saturday 11:26  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh,
+	  checked_numeric_limits.hh (altnum.[24,31,3]): Added force_integer
+	  policy flag.
+
+2006-11-18 Saturday 11:25  Abramo Bagnara
+
+	* src/compiler.hh (altnum.11): Added some useful functions for
+	  static expressions.
+
+2006-11-18 Saturday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (octagons.1): file
+	  ppl_interface_generator_predicate_check_code.m4 was added on
+	  branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-18 Saturday 09:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.19),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.23),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.34):
+	  Added predicates ppl_ at CLASS@_begin_iterator\2 and
+	  ppl_ at CLASS@_end_iterator\2.
+
+	  Temporarily disabled check for geometrically_equals predicate.
+
+2006-11-18 Saturday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (octagons.1): file ppl_interface_generator_prolog_dat.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-18 Saturday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (octagons.1): file ppl_interface_generator_prolog_icc_code.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-17 Friday 16:58  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.14): Specialized generalized_affine_image and
+	  generalized_affine_preimage for Grids.
+
+2006-11-17 Friday 16:53  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.94), Octagonal_Shape.defs.hh (1.22):
+	  Added a note to the documentation of refine().
+
+2006-11-17 Friday 15:59  Elena Mazzi
+
+	* src/: Octagonal_Shape.defs.hh (1.21),
+	  Octagonal_Shape.templates.hh (1.44): Added an helper function for
+	  the computation of affine relations Octagonal_Shape::refine() and
+	  used it on the methods
+	  Octagonal_Shape::generalized_affine_preimage() and
+	  Octagonal_Shape::bounded_affine_preimage.
+
+2006-11-17 Friday 15:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Makefile.am (1.37),
+	  ppl_interface_generator_prolog_icc.m4 (1.8),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.22),
+	  ppl_interface_generator_prolog_icc_preamble (1.16),
+	  ppl_prolog_common.icc (1.1): The
+	  ppl_interface_generator_prolog_icc_preamble is now renamed as
+	  ppl_prolog_common.icc and included by the generated
+	  ppl_prolog.icc.
+
+	  The term_to_classname_handle() methods are now defined
+	  term_to_handle<T>() where T is the C++ class name.
+
+2006-11-17 Friday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (octagons.1): file ppl_interface_generator_prolog_icc.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-11-17 Friday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog_common.icc (octagons.1): file
+	  ppl_prolog_common.icc was added on branch octagons on 2006-11-18
+	  20:36:46 +0000
+
+2006-11-17 Friday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.15): Misplaced angle bracket fixed.
+
+2006-11-17 Friday 11:59  Andrea Cimino
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.13),
+	  ppl_java_common.cc (1.21), ppl_java_common.hh (1.17): Implemented
+	  JNI functions for Grids_Generator and Grid Generator_System.
+	  Solved other little bugs.  The Java test now works.
+
+2006-11-17 Friday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (octagons.1): file
+	  ppl_java_common.cc was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-17 Friday 11:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.6): For the Polyhedron class, add include statements for
+	  ppl_java_C_Polyhedron.h and ppl_java_NNC_Polyhedron.h.
+
+2006-11-17 Friday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (altnum.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+	  branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-17 Friday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (octagons.1): file
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 was added on
+	  branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-17 Friday 11:31  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.93), BD_Shape.templates.hh (1.63),
+	  Octagonal_Shape.defs.hh (1.20), Polyhedron.defs.hh (1.311): Used
+	  consistent parameter's name for max_min().
+
+2006-11-17 Friday 10:34  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.92), BD_Shape.templates.hh (1.62):
+	  Added an helper function for the computation of affine relations
+	  BD_Shape::refine() and used it on the methods
+	  BD_Shape::generalized_affine_preimage() and
+	  BD_Shape::bounded_affine_preimage.
+
+2006-11-17 Friday 10:22  Andrea Cimino
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.12): Avoid compiler warning messages.
+
+2006-11-17 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.14): Added <template typename T> T*
+	  term_to_handle(Prolog_term_ref, const char*).
+
+2006-11-17 Friday 10:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.11): Correct reference to point to be generic.
+
+2006-11-17 Friday 09:57  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.16): Written the
+	  prototypes for three missing function to allow compiling.
+
+2006-11-17 Friday 09:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.10): Corrected code for intersection_assign_and_minimize (and
+	  similar binary operations that return a Boolean).
+
+2006-11-17 Friday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.9): Corrected the bug in the OK() method.
+
+2006-11-17 Friday 09:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.5),
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.8):
+	  Only have "Recycle_Intput" for Polyhedron class.  The include
+	  statement for "ppl_java_common.hh" should occur only once.
+
+2006-11-17 Friday 09:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.21): Unused schematic code for building a new iterator added.
+
+2006-11-17 Friday 09:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.7):
+	  Activated the term_to_iterator_handle code generator.
+
+2006-11-17 Friday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.20): Added `m4_term_to_iterator_handle_code'.
+
+2006-11-17 Friday 08:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.7): Where the class name should be the C++ name, the pattern
+	  is now correct and is replaced by the right form of the name..
+
+2006-11-17 Friday 08:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.17):
+	  Reinstated a lost comma.
+
+2006-11-17 Friday 08:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (octagons.1):
+	  file ppl_interface_generator_common_dat.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 19:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.4),
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.6):
+	  REmoved cutting marks and added "try/catch" everywhere.
+
+2006-11-16 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (1.7): Compile only one C++ file
+	  for all the required instantiations of the Java interface.
+
+2006-11-16 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/Makefile.am (octagons.1): file Makefile.am
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-16 Thursday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.255), interfaces/Java/jni/Makefile.am (1.6):
+	  Automatically generated all the header files required by the Java
+	  interface.
+
+2006-11-16 Thursday 18:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/ppl_java_common.hh (1.15): Corrected the type
+	  of "add_..._and_minimize to be Boolean.  Typo in comment fixed.
+
+2006-11-16 Thursday 18:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.5): Bug in the relation with code fixed.
+
+2006-11-16 Thursday 18:05  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_common.cc (1.20),
+	  ppl_java_common.hh (1.14): Renamed an internal routine.
+
+2006-11-16 Thursday 17:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.16),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.4): Some but not all bugs fixed.
+
+2006-11-16 Thursday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.254): Make sure
+	  `required_instantiations_java_sources' really contains all the
+	  required Java sources.
+
+2006-11-16 Thursday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.7): Ensure ppl_java.jar has the
+	  right structure.
+
+2006-11-16 Thursday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (octagons.1): file Makefile.am was
+	  added on branch octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.6): Machinery to build the Java
+	  interface revised.
+
+2006-11-16 Thursday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (octagons.1): file
+	  mipproblem1.cc was added on branch octagons on 2006-11-18
+	  20:36:58 +0000
+
+2006-11-16 Thursday 14:04  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.43), tests/MIP_Problem/mipproblem1.cc
+	  (1.2): Fixed MIP_Problem when it has to deal with
+	  zero-dimensional problems.
+
+2006-11-16 Thursday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (octagons.1): file MIP_Problem.cc was added on
+	  branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-16 Thursday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/: Makefile.am (1.5),
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.3):
+	  Enabled the splitting of the generated code for the ".cc".
+
+2006-11-16 Thursday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/jni/:
+	  ppl_interface_generator_java_ppl_java_classes_cc.m4 (1.2),
+	  ppl_interface_generator_java_ppl_java_classes_cc_code.m4 (1.3):
+	  Corrected the preamble for the ".cc" generated files.  Redundant
+	  space removed.
+
+2006-11-16 Thursday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.253): Added a mechanism to build the
+	  automatically generated Java sources.
+
+2006-11-16 Thursday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.23): Installed the mechanism for the
+	  automatic generation of the .java sources for the semantic object
+	  classes.  The interfaces/Java directory is temporarily disabled
+	  in order to avoid failures.
+
+2006-11-16 Thursday 09:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.2): Added missing swap() and OK() methods and fixed a few
+	  bugs.
+
+2006-11-16 Thursday 08:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.14),
+	  ppl_interface_generator_common_dat.m4 (1.15),
+	  Java/ppl_interface_generator_java_dat.m4 (1.2),
+	  Java/jni/Makefile.am (1.4),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc.m4
+	  (1.1),
+	  Java/jni/ppl_interface_generator_java_ppl_java_classes_cc_code.m4
+	  (1.1): Added files for generating the ".cc" files for the
+	  classes.  This needed modifications to the main replacement m4
+	  code to allow for inserting "1" after embedded "_"s.
+
+	  Java/jni/Makefile.am includes necessary code for building the
+	  combined files (temporarily named ppl_java_Polyhedron1.cc).
+
+2006-11-16 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (octagons.1): file
+	  ppl_interface_generator_common.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-11-16 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (altnum.1):
+	  file ppl_interface_generator_java_dat.m4 was added on branch
+	  altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-16 Thursday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (octagons.1):
+	  file ppl_interface_generator_java_dat.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-15 Wednesday 18:41  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (1.7): Implemented
+	  the ordinary copy constructor of C_Polyhedron.
+
+2006-11-15 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (altnum.1): file
+	  ppl_java_C_Polyhedron.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-15 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (octagons.1): file
+	  ppl_java_C_Polyhedron.cc was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 17:19  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (1.19): Added the
+	  `try' and `catch' blocks to every method of Polyhedron.
+
+2006-11-15 Wednesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (altnum.1): file
+	  ppl_java_Polyhedron.cc was added on branch altnum on 2006-12-02
+	  22:35:27 +0000
+
+2006-11-15 Wednesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (octagons.1): file
+	  ppl_java_Polyhedron.cc was added on branch octagons on 2006-11-18
+	  20:36:45 +0000
+
+2006-11-15 Wednesday 16:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.10): Add the
+	  recycle pattern to the procedure that builds from a recycled
+	  representation.
+
+2006-11-15 Wednesday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (octagons.1):
+	  file ppl_interface_generator_c_cc_code.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-15 Wednesday 16:23  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.6),
+	  ppl_java_Polyhedron.cc (1.18), ppl_java_common.cc (1.19),
+	  ppl_java_common.hh (1.13): Fixed a C_Polyhedron constructor.
+	  Added the infractructure for handling the exceptions.  Defined
+	  and implemented the native methods `swap(Polyhedron)' and
+	  `OK(boolean)'.
+
+2006-11-15 Wednesday 16:11  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.91), BD_Shape.templates.hh (1.61),
+	  Octagonal_Shape.defs.hh (1.19), Octagonal_Shape.templates.hh
+	  (1.43), Polyhedron.defs.hh (1.310), Polyhedron_nonpublic.cc
+	  (1.72): Used consistent parameter's name for max_min(),
+	  maximize() and minimize().
+
+2006-11-15 Wednesday 15:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.19): Added the recycle argument to the build from a
+	  representation.
+
+2006-11-15 Wednesday 15:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.14): Add a
+	  replacement for the extra recycle argument.
+
+2006-11-15 Wednesday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.66): Do recycle data structures
+	  when possible.
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/: Makefile.am (1.13), cm_cleaner.sh (1.1), cm_splitter.sh
+	  (1.1): cm_splitter.sh splits stdin according to cutting markers.
+	  cm_cleaner.sh erases all files listed in the cutting markers
+	  found on stdin.
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_cleaner.sh (altnum.1): file cm_cleaner.sh was added on
+	  branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_cleaner.sh (octagons.1): file cm_cleaner.sh was added on
+	  branch octagons on 2006-11-18 20:37:00 +0000
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_splitter.sh (altnum.1): file cm_splitter.sh was added on
+	  branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-15 Wednesday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/cm_splitter.sh (octagons.1): file cm_splitter.sh was added
+	  on branch octagons on 2006-11-18 20:37:00 +0000
+
+2006-11-15 Wednesday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.57): Do recycle data structures
+	  when possible.
+
+2006-11-15 Wednesday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.5),
+	  ppl_java_Polyhedron.cc (1.17): Do recycle the input data
+	  structures when possible.
+
+2006-11-15 Wednesday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.37), Grid.inlines.hh (1.11),
+	  Grid_nonpublic.cc (1.21), Grid_public.cc (1.48): Disambiguate the
+	  constructors of grids by adding a dummy argument to those that
+	  can recycle the data structures of their arguments.  Added
+	  support for actually recycling the data structures when this is
+	  allowed.  Removed a non-implemented (private) method.
+
+2006-11-15 Wednesday 15:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.19), C_Polyhedron.defs.hh (1.45),
+	  C_Polyhedron.inlines.hh (1.33), NNC_Polyhedron.cc (1.19),
+	  NNC_Polyhedron.defs.hh (1.47), NNC_Polyhedron.inlines.hh (1.34),
+	  Polyhedron.defs.hh (1.309), Polyhedron_nonpublic.cc (1.71):
+	  Disambiguate the constructors of polyhedra by adding a dummy
+	  argument to those that may recycle the data structures of their
+	  arguments.
+
+2006-11-15 Wednesday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.40): Added tag class Recycle_Input() to
+	  help differentiating overloaded functions (in particular,
+	  constructors) that may destructively recycle the data structures
+	  of their arguments instead of taking a copy.
+
+2006-11-15 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.4): Corrected a typo in
+	  test19().
+
+2006-11-15 Wednesday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (octagons.1): file
+	  pointsetpowerset1.cc was added on branch octagons on 2006-11-18
+	  20:37:00 +0000
+
+2006-11-15 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (1.3): Corrected the bug uncovered by
+	  test18() in pointsetpowerset1.cc.
+
+2006-11-15 Wednesday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (octagons.1): file Pointset_Powerset.cc
+	  was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-11-15 Wednesday 12:30  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (1.4): Implemented
+	  the native methods
+	  C_Polyhedron::poly_hull_assign_if_exact(C_Polyhedron y) and
+	  C_Polyhedron::upper_bound_assign_if_exact(C_Polyhedron y).
+
+2006-11-15 Wednesday 11:33  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_C_Polyhedron.cc (1.3): Added the
+	  Degenerate_Element enum to the Java interface.  Defined and
+	  implemented the constructor C_Polyhedron(long dim,
+	  Degenerate_Element kind).
+
+2006-11-15 Wednesday 10:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.33),
+	  ppl_interface_generator_predicate_check_extra_code (1.22):
+	  Revised and corrected some tests.
+
+2006-11-15 Wednesday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (octagons.1): file
+	  ppl_interface_generator_predicate_check_extra_code was added on
+	  branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-15 Wednesday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid_public.cc (1.47), Grid_widenings.cc (1.12): Corrected
+	  bugs found in is_disjoint(), intersection_assign() and
+	  generator_widening_assign().
+
+2006-11-15 Wednesday 10:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: disjoint1.cc (1.10), intersection1.cc (1.10),
+	  widening2.cc (1.8): Added tests showing bugs in the is_disjoint()
+	  intersection_assign() and generator_widening_assign().
+
+2006-11-15 Wednesday 10:12  Andrea Cimino
+
+	* m4/ac_prog_java.m4 (1.3): Avoid configure warnings during Java
+	  environment checking.
+
+2006-11-15 Wednesday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_java.m4 (altnum.1): file ac_prog_java.m4 was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-15 Wednesday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_java.m4 (octagons.1): file ac_prog_java.m4 was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-15 Wednesday 09:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.3): Last 2 tests added
+	  in previous commit are known to fail.
+
+2006-11-15 Wednesday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (1.5): Distribute
+	  ppl_interface_generator_java_dat.m4.
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (1.1): Put under CVS control.
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-12-02 22:35:28 +0000
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (octagons.1): file .cvsignore
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-15 Wednesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-11-15 Wednesday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.36): Make the `tests' directory
+	  before making the directories of the individual Prolog systems.
+
+2006-11-15 Wednesday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (1.2): Added test to show
+	  bug in geometrically_equals and geometrically_covers when one of
+	  the powersets contains a polyhedron which is not in minimal form
+	  and the other is.
+
+2006-11-14 Tuesday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.37), interfaces/C/Makefile.am
+	  (1.30), src/Makefile.am (1.165): Define and exploit the right
+	  inter-library dependencies.
+
+2006-11-14 Tuesday 18:35  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.16),
+	  ppl_java_common.cc (1.18), ppl_java_common.hh (1.12): First draft
+	  implementation for Partial_Function.	Implemented the method
+	  `map_space_dimension'.
+
+2006-11-14 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.29): Ensure that the dependency of
+	  libppl_c on libppl is encoded into libppl.
+
+2006-11-14 Tuesday 18:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.13): Revised
+	  for disjuncts.
+
+2006-11-14 Tuesday 17:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.18),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.18),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.32),
+	  tests/ppl_interface_generator_predicate_check_extra_code (1.21):
+	  Corrected get_disjuncts code in the prolog interface.  Added
+	  procedure in the prolog interface to call ascii_dump().  Added an
+	  extra test (a bounded interval in 1 dimension) to the prolog
+	  schematic tests.
+
+2006-11-14 Tuesday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (octagons.1): file
+	  C_Polyhedron_test1.java was added on branch octagons on
+	  2006-11-18 20:36:45 +0000
+
+2006-11-14 Tuesday 15:29  Andrea Cimino
+
+	* interfaces/Java/: jni/ppl_java_common.cc (1.17),
+	  tests/C_Polyhedron_test1.java (1.3): Modified the test to avoid
+	  overflows.  Modified the constructor of Constraint.
+
+2006-11-14 Tuesday 14:34  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.42): Corrected the bug on
+	  Octagonal_Shape::max_min() when the inhomogeneous term of
+	  expression is null.
+
+2006-11-14 Tuesday 14:33  quartieri
+
+	* tests/Octagonal_Shape/max_min1.cc (1.3): Added two tests that
+	  show a bug on Octagonal_Shape::max_min() when the inhomogeneous
+	  term of expression is null.
+
+2006-11-14 Tuesday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (altnum.1): file max_min1.cc
+	  was added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-14 Tuesday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (octagons.1): file max_min1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-14 Tuesday 14:30  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.60): Corrected the bug on
+	  BD_Shape::max_min() when the inhomogeneous term of expression is
+	  null.
+
+2006-11-14 Tuesday 14:29  Elena Mazzi
+
+	* tests/BD_Shape/max_min2.cc (1.3): Added two tests that show a bug
+	  on BD_Shape::maximize() when the inhomogeneous term of expression
+	  is null.
+
+2006-11-14 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (altnum.1): file max_min2.cc was added
+	  on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-14 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min2.cc (octagons.1): file max_min2.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-14 Tuesday 12:02  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.15),
+	  ppl_java_common.cc (1.16), ppl_java_common.hh (1.11): Implemented
+	  all the widening methods in the Java interface.
+
+2006-11-14 Tuesday 09:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Java/ppl_interface_generator_java_dat.m4 (1.1): Files
+	  needed for generating Polyhedron.java
+
+2006-11-13 Monday 21:47  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.14),
+	  ppl_java_common.cc (1.15), ppl_java_common.hh (1.10): Implemented
+	  the other two missing versions of `minimize()' and `maximize()'.
+
+2006-11-13 Monday 19:35  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, compiler.hh
+	  (altnum.[17,52,10]): Added some compile time check.
+
+2006-11-13 Monday 19:06  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.13),
+	  ppl_java_common.cc (1.14), ppl_java_common.hh (1.9): Implemented
+	  By_Reference class that allows to pass object by reference in
+	  Java world. Implemented one version of `maximize' and `minimize'.
+	  Implemented `equals'.
+
+2006-11-13 Monday 16:26  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (1.12): Added the
+	  methods space_dimension() and affine_dimension() to Polyhedron.
+
+2006-11-13 Monday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (1.6): Fixed a Doxygen comment to
+	  use the brief style.
+
+2006-11-13 Monday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (octagons.1): file
+	  Pointset_Powerset.defs.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-11-13 Monday 12:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.90), Octagonal_Shape.defs.hh (1.18):
+	  Modified the documentation of concatenate_assign() to link to the
+	  general description of the concatenation operator.
+
+2006-11-13 Monday 09:08  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.16): Fixed typo. Implemented
+	  set_unbounded() correctly.
+
+2006-11-13 Monday 09:07  Abramo Bagnara
+
+	* src/compiler.hh (altnum.9): Now COMPILE_TIME_CHECK() works as
+	  expected.
+
+2006-11-12 Sunday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.164), mp_numeric_limits.cc (1.1),
+	  mp_numeric_limits.hh (1.9): Define the static constants declared
+	  in mp_numeric_limits.hh, as mandated by Section 9.4.2/4 of the
+	  C++ standard.
+
+2006-11-12 Sunday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.cc (octagons.1): file mp_numeric_limits.cc
+	  was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-11-12 Sunday 16:32  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_C_Polyhedron.cc (1.2),
+	  ppl_java_Polyhedron.cc (1.11), ppl_java_common.cc (1.13),
+	  ppl_java_common.hh (1.8): Added support for Grid_Generator and
+	  Grid_Generator_System.  Added other constructors to C_Polyhedron.
+	  Renamed routine methods for consistency.
+
+2006-11-12 Sunday 16:21  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Rational_Box.hh
+	  (altnum.[15,51,5]): Compilation fixes.
+
+2006-11-12 Sunday 15:48  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Rational_Box.hh, checked.defs.hh,
+	  checked.inlines.hh, checked_int.inlines.hh, compiler.hh
+	  (altnum.[23,4,30,21,31,8]): Renamed const_bool and const_int.
+
+2006-11-12 Sunday 15:48  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.21): is_inf_float return
+	  value is now more useful.
+
+2006-11-12 Sunday 15:47  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[14,50,8]): Commited incomplete new boundary
+	  implementation.
+
+2006-11-12 Sunday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.38), config.sub (1.36), Watchdog/config.guess
+	  (1.22), Watchdog/config.sub (1.21): Updated.
+
+2006-11-12 Sunday 12:33  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.10),
+	  ppl_java_common.cc (1.12), ppl_java_common.hh (1.7): Added the
+	  class Poly_Gen_Relation.  Implemented the method
+	  Polyhedron::relation_with(Generator g).
+
+2006-11-12 Sunday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.7): Comments revised.
+
+2006-11-12 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.6): Added new macros for per-class
+	  constants that need no further definition.
+
+2006-11-12 Sunday 11:57  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.9),
+	  ppl_java_common.cc (1.11), ppl_java_common.hh (1.6): Added the
+	  class Poly_Con_Relation.  Implemented the method
+	  Polyhedron::relation_with(Constraint c).
+
+2006-11-12 Sunday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8_a (1.5): Reflect recent
+	  changes in the Prolog tests.
+
+2006-11-12 Sunday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8_a (1.8): Reflect
+	  recent changes in the Prolog tests.
+
+2006-11-11 Saturday 22:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.31): Bugs in test code fixed.
+
+2006-11-11 Saturday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/compiler.hh (altnum.5): COMPILE_TIME_CHECK macro added, as
+	  well as several comments.
+
+2006-11-11 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.203): Added a new item.
+
+2006-11-11 Saturday 15:27  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.8),
+	  ppl_java_common.cc (1.10), ppl_java_common.hh (1.5): Now the PPL
+	  can return to Java objects like generators, constraints and
+	  congruences and their systems. Written a lot of native methods
+	  that return objects built by the PPL.
+
+2006-11-11 Saturday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.252): Improved the checking of required
+	  instantiations; now also managing the generation of canonical
+	  names for templates having multiple parameters.
+
+2006-11-10 Friday 20:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: Makefile.am, interval1.cc (altnum.[3,1]): New tests
+	  for the Interval class.
+
+2006-11-10 Friday 17:46  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.9): In the Java
+	  interface congruences are built just from linear expressions.
+
+2006-11-10 Friday 14:56  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.7),
+	  ppl_java_common.cc (1.8), ppl_java_common.hh (1.4): Initial
+	  support for the Congruence/Grid classes.  Added other methods to
+	  the Polyhedron Java interface, but some of them must be
+	  implemented.
+
+2006-11-10 Friday 12:50  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Interval.defs.hh,
+	  Interval_Info.defs.hh, Rational_Box.hh, checked.defs.hh,
+	  checked.inlines.hh, checked_int.inlines.hh, compiler.hh
+	  (altnum.[22,49,7,3,29,20,30,4]): Fixed compilation without
+	  optimization.
+
+2006-11-10 Friday 12:35  Abramo Bagnara
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (altnum.3):
+	  C99 mandates that sizeof unsigned is always the same of
+	  corresponding signed type.
+
+2006-11-10 Friday 07:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.251): Version number bumped.
+
+2006-11-10 Friday 00:00  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.13): Fixed return value.
+
+2006-11-09 Thursday 23:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.22): Methods computing affine (pre-)
+	  images now also deal with the case of denominators different from
+	  1.
+
+2006-11-09 Thursday 22:59  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.48): Adjust flags on set_unbounded.
+	  A little more work on div_assign. Splitted normalize_integer to
+	  help the compiler in its inlining job.
+
+2006-11-09 Thursday 18:28  Abramo Bagnara
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic, src/Limits.hh,
+	  configure.ac (altnum.[3,6,22]): C99 mandates that sizeof unsigned
+	  is always the same of corresponding signed type.
+
+2006-11-09 Thursday 17:24  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.12): set_unbounded returns a
+	  feedback.
+
+2006-11-09 Thursday 17:17  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.24): Substituted
+	  specializations with templates.
+
+2006-11-09 Thursday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Box.inlines.hh, Box.templates.hh (altnum.[18,21]): Be
+	  explicit when invoking methods of a class template.
+
+2006-11-09 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.61), GNU/Makefile.am
+	  (1.60): Ensure `make distclean' does the right thing.
+
+2006-11-09 Thursday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.20): Corrected method OK(): even if
+	  the box is marked empty, this does not imply that there should be
+	  empty intervals in it.  Drafted (partial) implementation of
+	  affine_preimage().
+
+2006-11-09 Thursday 14:31  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.42): MIP_Problem fixed.
+
+2006-11-09 Thursday 13:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.19): Drafted (partial)
+	  implementation of the affine_image() method.
+
+2006-11-09 Thursday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.16): Added declarations for all the
+	  affine image/preimage methods.
+
+2006-11-09 Thursday 13:42  quartieri
+
+	* tests/Octagonal_Shape/bounds1.cc (1.2): Added some tests on
+	  bounds_from_above() and bounds_from_below() checking universal
+	  octagons.
+
+2006-11-09 Thursday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounds1.cc (altnum.1): file bounds1.cc was
+	  added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-09 Thursday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounds1.cc (octagons.1): file bounds1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-09 Thursday 13:37  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.41): The previous correction didn't work as
+	  expected.  Now MIP_Problem should work also when the tableau is
+	  empty.
+
+2006-11-09 Thursday 12:30  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.7): Removed some prints
+	  used for debugging purposes.
+
+2006-11-09 Thursday 12:27  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.6),
+	  ppl_java_common.cc (1.6), ppl_java_common.hh (1.3): Added the
+	  Variables_Set class to the repository.  Implemented other native
+	  methods that belongs to Polyhedron.  Added other routine
+	  functions.
+
+2006-11-09 Thursday 12:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.87): Corrected a bug in
+	  poly_difference_assign(): an assertion was failing when the
+	  argument polyhedron was represented by an inconsistent constraint
+	  system, but emptiness was not detected yet.
+
+2006-11-09 Thursday 11:47  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.41): Removed the control on
+	  the universal Octagonal_Shape cause MIP_Problem handles this case
+	  properly.
+
+2006-11-09 Thursday 10:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.30),
+	  ppl_interface_generator_predicate_check_extra_code (1.20):
+	  Several bugs in the testing framework fixed.	Added test07 to the
+	  test data.
+
+2006-11-09 Thursday 10:36  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.40): Fixed another bug in MIP_Problem.	A
+	  wrong status was computed if minimization was requested and the
+	  internal tableau was empty.
+
+2006-11-09 Thursday 10:26  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.47): Avoid comparisons statically
+	  unsafe.
+
+2006-11-09 Thursday 10:24  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.19): Added support for safe
+	  comparisons.
+
+2006-11-09 Thursday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/polydifference2.cc (1.9): Added test shows a bug
+	  in poly_difference_assign() when the polyhedron to be subtracted
+	  is empty and not in minimal form.
+
+2006-11-09 Thursday 08:39  Abramo Bagnara
+
+	* configure.ac (altnum.21): Added two more SIZEOF.
+
+2006-11-09 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min2.cc (altnum.1): file max_min2.cc
+	  was added on branch altnum on 2006-12-02 22:35:34 +0000
+
+2006-11-09 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min2.cc (octagons.1): file max_min2.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-09 Thursday 08:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: BD_Shape/max_min2.cc (1.2), Octagonal_Shape/max_min2.cc
+	  (1.2): Added 2 tests to both test files showing a bug in
+	  minimize() (with point) for both BD_Shape and Octagonal_Shape.
+
+	  One of these tests shows the bug (the denominator is 0) while the
+	  second shows that a similar bug does not occur with maximize()
+	  (with point).
+
+2006-11-09 Thursday 08:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.202), doc/Makefile.am (1.49), interfaces/Makefile.am
+	  (1.22), interfaces/C/Makefile.am (1.28),
+	  interfaces/Prolog/Makefile.am (1.35),
+	  interfaces/Prolog/SICStus/Makefile.am (1.72),
+	  interfaces/Prolog/SWI/Makefile.am (1.66),
+	  interfaces/Prolog/XSB/Makefile.am (1.47),
+	  interfaces/Prolog/YAP/Makefile.am (1.49),
+	  interfaces/Prolog/tests/Makefile.am (1.11): Clean automatically
+	  generated files.
+
+2006-11-09 Thursday 07:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/Makefile.am (1.7): Distribute all
+	  examples.
+
+2006-11-08 Wednesday 18:24  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.59): Removed some lines
+	  not-necessary in the following methods: - bounds(); - max_min().
+
+2006-11-08 Wednesday 18:13  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.39): Fixed a bug: return the origin with
+	  the right space dimension if the input Constraint_System is
+	  universal and the problem is unbounded.
+
+2006-11-08 Wednesday 17:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.58): Corrected the method max_min().
+
+2006-11-08 Wednesday 17:51  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.40),
+	  tests/Octagonal_Shape/Makefile.am (1.13),
+	  tests/Octagonal_Shape/max_min2.cc (1.1): Corrected a bug in the
+	  method max_min() and added some tests.
+
+2006-11-08 Wednesday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (octagons.1): file Makefile.am
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-11-08 Wednesday 17:44  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.57), tests/BD_Shape/Makefile.am
+	  (1.57), tests/BD_Shape/max_min2.cc (1.1): Corrected the method
+	  max_min() and added some tests on it.
+
+2006-11-08 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.60): ppl_ciao.cc is not
+	  built.
+
+2006-11-08 Wednesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh, Octagonal_Shape.templates.hh,
+	  Polyhedron_public.cc (altnum.[3,3,10]): (Generalized) Affine
+	  (pre-) image methods changed so as to throw an exception when the
+	  relation symbol is NOT_EQUAL. Switchs on Relation_Symbol changed
+	  to take into proper account the new value.
+
+2006-11-08 Wednesday 16:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.18): Method OK() now also checks
+	  that a box declared to be (non) empty is actually (non) empty.
+	  Typo fixed in is_topologically_closed().  Added implementation
+	  for method is_discrete().  Do check for emptyness in method
+	  is_bounded().
+
+2006-11-08 Wednesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.8): More methods activated.
+
+2006-11-08 Wednesday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (octagons.1): file Any_Pointset.defs.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-08 Wednesday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.21): Java directory activated.
+
+2006-11-08 Wednesday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/max_min1.cc (1.2): Tests 3 and 4 fail with
+	  8-bit integers.
+
+2006-11-08 Wednesday 15:33  Andrea Cimino
+
+	* interfaces/Java/tests/C_Polyhedron_test1.java (1.2): Added some
+	  new calls to the test reflecting the last changes to the Java
+	  interface.
+
+2006-11-08 Wednesday 15:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.17): Indentation fixed.
+
+2006-11-08 Wednesday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.250): Version number bumped.
+
+2006-11-08 Wednesday 15:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.17): Temporarily patched the default
+	  constructor and method add_space_dimensions_and_embed() so as to
+	  match tehir specification.
+
+2006-11-08 Wednesday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.48), interfaces/C/Makefile.am (1.27),
+	  interfaces/Prolog/Makefile.am (1.34),
+	  interfaces/Prolog/Ciao/Makefile.am (1.59),
+	  interfaces/Prolog/GNU/Makefile.am (1.59),
+	  interfaces/Prolog/SICStus/Makefile.am (1.71),
+	  interfaces/Prolog/SWI/Makefile.am (1.65),
+	  interfaces/Prolog/XSB/Makefile.am (1.46),
+	  interfaces/Prolog/YAP/Makefile.am (1.48),
+	  interfaces/Prolog/tests/Makefile.am (1.10): Fixed several
+	  packaging glitches.
+
+2006-11-08 Wednesday 14:47  Andrea Cimino
+
+	* interfaces/Java/jni/: ppl_java_Polyhedron.cc (1.5),
+	  ppl_java_common.cc (1.5), ppl_java_common.hh (1.2): Added other
+	  methods to the Java C_Polyhedron inteface.  Added new routine
+	  methods.  Revised several comments.
+
+2006-11-08 Wednesday 13:57  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.23): Reverted changed
+	  commited by mistake.
+
+2006-11-08 Wednesday 13:55  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh, Interval.defs.hh
+	  (altnum.[22,46]): Added missing signatures for operator==.
+
+2006-11-08 Wednesday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.30): Minor change in the
+	  documentation: name the set of integer variables in the brief
+	  description of a constructor.
+
+2006-11-08 Wednesday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (octagons.1): file MIP_Problem.defs.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-08 Wednesday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearpartition1.cc (1.10): Refer to
+	  Pointset_Powerset<PH> instead of Powerset<Determinate<PH> >.
+
+2006-11-08 Wednesday 12:01  Abramo Bagnara
+
+	* src/: checked_ext.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[9,29,23,25]): Pushed native extended handling to lowest
+	  level.
+
+2006-11-08 Wednesday 11:37  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.17),
+	  src/Octagonal_Shape.inlines.hh (1.12),
+	  src/Octagonal_Shape.templates.hh (1.39),
+	  tests/Octagonal_Shape/Makefile.am (1.12),
+	  tests/Octagonal_Shape/bounds1.cc (1.1),
+	  tests/Octagonal_Shape/max_min1.cc (1.1): Defined the methods: -
+	  bounds(); - bounds_from_above(); - bounds_from_below(); -
+	  max_min(); - maximize(); - minimize(); and added some tests on
+	  them.
+
+2006-11-08 Wednesday 11:12  Abramo Bagnara
+
+	* src/: Float.defs.hh, checked_ext.inlines.hh (altnum.[3,8]):
+	  Converted handle_ext_natively in a function.
+
+2006-11-08 Wednesday 09:54  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (altnum.22): Removed useless function.
+
+2006-11-08 Wednesday 09:54  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (altnum.7): Added extended constants
+	  printing.
+
+2006-11-08 Wednesday 09:17  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.45): Added multiplication.
+
+2006-11-08 Wednesday 09:17  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.11): Renamed sign into sgn for
+	  conformity to other places.
+
+2006-11-08 Wednesday 00:58  Andrea Cimino
+
+	* interfaces/Java/jni/Makefile.am (1.3): If a `make clean' is
+	  called, delete all the headers generated by javah.
+
+2006-11-08 Wednesday 00:01  Andrea Cimino
+
+	* m4/ac_prog_javah.m4 (1.6): Avoid to compile the Java interface if
+	  javah is found but the jni.h header is not found.
+
+2006-11-08 Wednesday 00:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javah.m4 (altnum.1): file ac_prog_javah.m4 was added
+	  on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-08 Wednesday 00:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javah.m4 (octagons.1): file ac_prog_javah.m4 was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-07 Tuesday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.16): Drafted an implementation of
+	  add_constraint().
+
+2006-11-07 Tuesday 20:08  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (1.4): Added other
+	  Polyhedron methods to the Java interface.
+
+2006-11-07 Tuesday 19:22  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_Polyhedron.cc (1.3): Added some
+	  Polyhedron related methods to the Java interface.
+
+2006-11-07 Tuesday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.56): Useless parentheses removed.
+
+2006-11-07 Tuesday 17:04  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.18): Added temporary kludge to fix
+	  compiling.
+
+2006-11-07 Tuesday 16:24  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_ext.inlines.hh (altnum.[17,6]):
+	  Removed unsafe comparisons.
+
+2006-11-07 Tuesday 16:20  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.89), src/BD_Shape.inlines.hh (1.137),
+	  src/BD_Shape.templates.hh (1.55), tests/BD_Shape/Makefile.am
+	  (1.56), tests/BD_Shape/bounds1.cc (1.1),
+	  tests/BD_Shape/max_min1.cc (1.1): Defined the following methods:
+	  - bounds_from_above(); - bounds_from_below(); - bounds(); -
+	  max_min(); - maximize(); - minimize().  Added some tests on them.
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounds1.cc (altnum.1): file bounds1.cc was added
+	  on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounds1.cc (octagons.1): file bounds1.cc was added
+	  on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min1.cc (altnum.1): file max_min1.cc was added
+	  on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-07 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/max_min1.cc (octagons.1): file max_min1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-07 Tuesday 15:48  Abramo Bagnara
+
+	* src/Rounding_Dir.inlines.hh (altnum.5): Moved a definition to
+	  permit inlining.
+
+2006-11-07 Tuesday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.inlines.hh,
+	  Interval_Info.defs.hh, Interval_Info.inlines.hh,
+	  Interval_Info.types.hh, Makefile.am (altnum.[15,14,6,1,1,27]):
+	  swap() functions and methods for the Interval_Info classes
+	  revised.  Rewritten Box<Interval>::operator(ostream&).
+
+2006-11-07 Tuesday 15:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.39): Fixed a couple of
+	  memory leaks in exception_prolog.
+
+2006-11-07 Tuesday 15:20  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.54): Fixed a comment on
+	  BD_Shape::remove_space_dimensions().
+
+2006-11-07 Tuesday 15:18  Andrea Cimino
+
+	* configure.ac (1.249), m4/Makefile.am (1.21), m4/ac_prog_java.m4
+	  (1.2), m4/ac_prog_java_works.m4 (1.3), m4/ac_prog_javac.m4 (1.2),
+	  m4/ac_prog_javac_works.m4 (1.2): Java environment detection
+	  improved. Moved all the *_works stuff in the ac_prog_java* files.
+
+2006-11-07 Tuesday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javac.m4 (altnum.1): file ac_prog_javac.m4 was added
+	  on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-07 Tuesday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_javac.m4 (octagons.1): file ac_prog_javac.m4 was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-07 Tuesday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.88), BD_Shape.inlines.hh (1.136),
+	  BD_Shape.templates.hh (1.53), Octagonal_Shape.defs.hh (1.16),
+	  Octagonal_Shape.inlines.hh (1.11), Octagonal_Shape.templates.hh
+	  (1.38): Added (imprecise but safe) implementations of shapes
+	  constructors taking a congruence system as input.  Added a few
+	  missing include files so as to avoid indirect dependencies.
+
+2006-11-07 Tuesday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh, Interval.inlines.hh (altnum.[44,13]):
+	  Added Interval::swap(Interval& y) for consistency with the rest
+	  of the library.  The corresponding std::swap() function is now
+	  implemented in terms of that one.
+
+2006-11-07 Tuesday 13:14  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[10,43,5]): Added swap. Moved adjust_boundary_info in
+	  more appropriate file.
+
+2006-11-07 Tuesday 13:13  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[21,21]): Move swap in std namespace.
+
+2006-11-07 Tuesday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.248), m4/ac_prog_javah.m4 (1.5):
+	  AC_CANONICAL_SYSTEM is obsolete: use AC_CANONICAL_HOST instead.
+
+2006-11-07 Tuesday 10:00  Andrea Cimino
+
+	* configure.ac (1.247), m4/ac_prog_javah.m4 (1.4): Call
+	  AC_CANONICAL_SYSTEM before AM_INIT_AUTOMAKE to avoid the previous
+	  autoreconf messages. ac_prog_javah.m4 reverted to the previous
+	  version.
+
+2006-11-07 Tuesday 09:23  Andrea Cimino
+
+	* m4/ac_prog_javah.m4 (1.3): Avoid autoreconf warnings.
+
+2006-11-07 Tuesday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.16): Fixed Box<Interval>::is_empty().
+
+2006-11-07 Tuesday 08:34  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.42): Fixed typo.
+
+2006-11-06 Monday 23:48  Abramo Bagnara
+
+	* src/Interval_Info.defs.hh (altnum.4): Added static keyword.
+
+2006-11-06 Monday 23:46  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.41): Fixed typo.
+
+2006-11-06 Monday 23:44  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.40): Fixes to convex_hull and
+	  intersect.
+
+2006-11-06 Monday 23:16  Andrea Cimino
+
+	* m4/ac_prog_java_works.m4 (1.2): Proceed configuring if a not
+	  suitable JDK is found.
+
+2006-11-06 Monday 23:01  Andrea Cimino
+
+	* m4/ac_prog_javah.m4 (1.2): Fixed an autoconf call.
+
+2006-11-06 Monday 22:57  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[9,39,3]): Simplified Interval return values. Changed
+	  integer properties.
+
+2006-11-06 Monday 22:25  Andrea Cimino
+
+	* m4/ac_prog_java.m4 (1.1): Added a missing macro to the `m4'
+	  directory.
+
+2006-11-06 Monday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/tests/Makefile.am (octagons.1): file Makefile.am
+	  was added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-06 Monday 22:12  Andrea Cimino
+
+	* interfaces/Java/: Makefile.am (1.4), jni/Makefile.am (1.2),
+	  tests/Makefile.am (1.2): Makefile.am's updated to take the
+	  programs name from autoconf.
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_classpath.m4 (altnum.1): file ac_check_classpath.m4
+	  was added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_classpath.m4 (octagons.1): file ac_check_classpath.m4
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_classpath.m4 (simplex.1): file ac_check_classpath.m4
+	  was added on branch simplex on 2008-01-07 11:15:31 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_jar.m4 (altnum.1): file ac_prog_jar.m4 was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_prog_jar.m4 (octagons.1): file ac_prog_jar.m4 was added on
+	  branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-11-06 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.246), m4/Makefile.am (1.20),
+	  m4/ac_check_classpath.m4 (1.1), m4/ac_prog_jar.m4 (1.1),
+	  m4/ac_prog_java_works.m4 (1.1), m4/ac_prog_javac.m4 (1.1),
+	  m4/ac_prog_javac_works.m4 (1.1), m4/ac_prog_javah.m4 (1.1):
+	  Autodetect the availability of the required Java development
+	  environment.
+
+2006-11-06 Monday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (altnum.6): Use the new implementation of intervals.
+
+2006-11-06 Monday 16:05  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.38): Added missing argument.
+
+2006-11-06 Monday 15:59  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.37): Fixed two typos hard to see.
+
+2006-11-06 Monday 15:58  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.36): Added two missing 'combine'.
+
+2006-11-06 Monday 15:56  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.35): Added two missing functions
+	  invoking methods. Fixed typos.
+
+2006-11-06 Monday 15:46  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[8,34,2]): Modified properties handling for generic
+	  property value. Added normalize_integer().
+
+2006-11-06 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.15): Do not use low-level methods
+	  (this seems to expose a bug in the Interval implementation).
+
+2006-11-06 Monday 12:57  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.37): Replaced some assign_r()
+	  with the operator=().
+
+2006-11-06 Monday 12:06  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.52), tests/BD_Shape/Makefile.am
+	  (1.55), tests/BD_Shape/boundedaffinepreimage1.cc (1.1): Defined a
+	  new method: BD_Shape::bounded_affine_preimage() and added some
+	  tests on it.
+
+2006-11-06 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-12-02 22:35:33 +0000
+
+2006-11-06 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffinepreimage1.cc (octagons.1): file
+	  boundedaffinepreimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-11-06 Monday 10:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.51): Corrected a bug on
+	  bds_hull_assign() when a BDS is minimized.
+
+2006-11-06 Monday 10:51  Elena Mazzi
+
+	* tests/BD_Shape/bdshull1.cc (1.14): Added test 08 that shows a bug
+	  in bds_hull_assign.
+
+2006-11-06 Monday 10:49  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.50): Replaced some assign_r() with
+	  the operator=().
+
+2006-11-06 Monday 10:46  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.33): Modified strictly_contains
+	  implementation.
+
+2006-11-06 Monday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble (altnum.[5,5]):
+	  References to Rational_Box fixed.  Reference to Old_Interval
+	  removed.
+
+2006-11-06 Monday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.15): Added new typename member
+	  `interval_type'.
+
+2006-11-05 Sunday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.14): Exploit the information returned
+	  by refine()
+
+2006-11-05 Sunday 22:30  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.7): Fixed typos.
+
+2006-11-05 Sunday 22:26  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.32): Added strictly_contains. Fixed
+	  contains for empty intervals. NAN scalar is not a singleton.
+
+2006-11-05 Sunday 22:18  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.31): Added some FIXME's.
+
+2006-11-05 Sunday 22:11  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.30): Added an incorrect stub for
+	  info_open to permit compilation.
+
+2006-11-05 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.inlines.hh (altnum.13): Two FIXMEs partially resolved.
+
+2006-11-05 Sunday 22:04  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.29): Added contains. Simplified
+	  operator==.
+
+2006-11-05 Sunday 22:03  Abramo Bagnara
+
+	* src/Boundary.defs.hh (altnum.6): Modified implementation of
+	  is_unbounded and extended its use.
+
+2006-11-05 Sunday 21:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.12),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.17),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.17),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.29): Added add_disjunct and get_disjuncts to the Prolog
+	  interface.  The generated tests show a bug, still to be fixed, in
+	  get_disjuncts.
+
+2006-11-05 Sunday 21:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.templates.hh (altnum.[14,14]): Added
+	  dimension_type Box<Interval>::affine_dimension() const.
+
+2006-11-05 Sunday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.inlines.hh, Box.templates.hh (altnum.[12,13]): Added
+	  void Box<Interval>::add_space_dimensions_and_embed(const
+	  dimension_type) and void
+	  Box<Interval>::add_space_dimensions_and_project(const
+	  dimension_type).
+
+2006-11-05 Sunday 19:12  Abramo Bagnara
+
+	* src/: Box.templates.hh, Interval.defs.hh (altnum.[12,28]):
+	  Cosmetic fixes. Added contains_integer_point implementation.
+
+2006-11-05 Sunday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.49), Octagonal_Shape.templates.hh
+	  (1.36): Exception throwers simplified.
+
+2006-11-05 Sunday 18:57  Andrea Cimino
+
+	* configure.ac (1.245), interfaces/Java/Makefile.am (1.3),
+	  interfaces/Java/jni/Makefile.am (1.1),
+	  interfaces/Java/jni/ppl_java_Polyhedron.cc (1.2),
+	  interfaces/Java/tests/C_Polyhedron_test1.java (1.1),
+	  interfaces/Java/tests/Makefile.am (1.1): The `ppl_java' library
+	  is now built.  Added the first test for the Java interface.
+	  Solved some cut and paste bugs in ppl_java_Polyhedron.cc.
+
+2006-11-05 Sunday 18:35  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.27): Added missing ().
+
+2006-11-05 Sunday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.templates.hh, Interval.defs.hh (altnum.[11,26]): Added
+	  template <typename Boundary, typename Info, typename T> inline
+	  bool operator!=(const Interval<Boundary, Info>&, const T&).
+
+2006-11-05 Sunday 18:23  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.25): Added missing const.
+
+2006-11-05 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[13,11]): Addded
+	  Constraint_System Box<Interval>::minimized_constraints() const.
+	  Added missing friend declarations.
+
+2006-11-05 Sunday 17:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[12,10]): Added
+	  explicit Box<Interval>::Box(const Constraint_System&).
+
+2006-11-05 Sunday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[11,9,10]): Added Box<Interval>::Box(const Box&) and
+	  template <typename Other_Interval> explicit
+	  Box<Interval>::Box(const Box<Other_Interval>&).
+
+2006-11-05 Sunday 17:04  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.24): Added missing return.
+
+2006-11-05 Sunday 17:02  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.23): Improved version of operator==.
+
+2006-11-05 Sunday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh (altnum.[10,8]): Added explicit
+	  Box<Interval>::Box(dimension_type num_dimensions = 0,
+	  Degenerate_Element kind = UNIVERSE).
+
+2006-11-05 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.hh, tests/Box/Makefile.am,
+	  tests/Box/addconstraints1.cc, tests/Box/addspacedims1.cc,
+	  tests/Box/affineimage1.cc, tests/Box/affinepreimage1.cc,
+	  tests/Box/bdsdifference1.cc, tests/Box/boundedaffineimage1.cc,
+	  tests/Box/boxhull.cc, tests/Box/cc76narrowing1.cc,
+	  tests/Box/cc76widening.cc, tests/Box/closure1.cc,
+	  tests/Box/concatenate1.cc, tests/Box/constraints1.cc,
+	  tests/Box/containsintegerpoint1.cc, tests/Box/fromgensys1.cc,
+	  tests/Box/frompolyhedron1.cc,
+	  tests/Box/generalizedaffineimage1.cc,
+	  tests/Box/generalizedaffinepreimage1.cc,
+	  tests/Box/intersection1.cc, tests/Box/mapspacedims1.cc,
+	  tests/Box/maxspacedim1.cc, tests/Box/removespacedims1.cc,
+	  tests/Box/timeelapse1.cc
+	  (altnum.[20,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Added some infrastructure to begin testing in tests/Box.
+
+2006-11-05 Sunday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_widenings.cc, Rational_Box.hh (altnum.[8,2]):
+	  Rational_Box is now in the Parma_Polyhedra_Library namespace.
+
+2006-11-05 Sunday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.22): Added missing return statement.
+
+2006-11-05 Sunday 16:35  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.21): Better unbounded check.
+
+2006-11-05 Sunday 16:32  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[5,20]): Added
+	  refine (still incomplete). Better name for is_integer applied to
+	  intervals.
+
+2006-11-05 Sunday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[9,7,9]): Drafted bool operator==(const Box<Interval>&,
+	  const Box<Interval>&) and bool operator!=(const Box<Interval>&,
+	  const Box<Interval>&).
+
+2006-11-05 Sunday 16:04  Andrea Cimino
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.4): Fixed Makefile.am
+	  to avoid some autoconf warnings.  Fixed some interface bugs.
+
+2006-11-05 Sunday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[8,6,8]): Implementation of Box abstracted with respect
+	  to the sequence employed in the representation.  Drafted void
+	  Box<Interval>::concatenate_assign(const Box&).
+
+2006-11-05 Sunday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.defs.hh (altnum.19): Added missing inclusions and
+	  std:: qualifications.
+
+2006-11-05 Sunday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (altnum.3): Added NOT_EQUAL to enum
+	  Relation_Symbol.
+
+2006-11-05 Sunday 15:12  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.18): Added OK().
+
+2006-11-05 Sunday 15:11  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked_ext.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[20,20,28,5,20,28,21,24]): Added ceil and floor.
+
+2006-11-05 Sunday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.201): Note that in the OK() methods, instead of having
+	  all those #ifndef NDEBUG, it is probably worthwhile to use a
+	  suitable defined `barf' stream that does the right thing.
+
+2006-11-05 Sunday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.200): Remember to add a "quick assign" function to
+	  checked numbers that allows to efficiently assign small integer
+	  constants (like those in the range [-2, 2]) that are guaranteed
+	  not to cause any rounding or overflow problems.
+
+2006-11-05 Sunday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.defs.hh (altnum.7): Added declarations for the standard
+	  member functions that may modify the dimension of the vector
+	  space.
+
+2006-11-05 Sunday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Box/: .cvsignore, Makefile.am, addconstraints1.cc,
+	  addspacedims1.cc, affinedimension1.cc, affineimage1.cc,
+	  affinepreimage1.cc, ascii_dump_load1.cc, bdsdifference1.cc,
+	  bgp99extrapolation1.cc, bhz03widening1.cc, bounded1.cc,
+	  boundedaffineimage1.cc, boxhull.cc, cc76narrowing1.cc,
+	  cc76widening.cc, closure1.cc, concatenate1.cc, constraints1.cc,
+	  contains1.cc, containsintegerpoint1.cc, discrete1.cc,
+	  disjoint1.cc, empty1.cc, equality1.cc, expandspacedim1.cc,
+	  foldspacedims1.cc, fromgensys1.cc, frompolyhedron1.cc,
+	  generalizedaffineimage1.cc, generalizedaffinepreimage1.cc,
+	  geomcovers1.cc, intersection1.cc, mapspacedims1.cc,
+	  maxspacedim1.cc, membytes1.cc, minconstraints1.cc, relations1.cc,
+	  removespacedims1.cc, timeelapse1.cc, universe1.cc, writebox1.cc
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Ripped from the tests/BD_Shape directory to serve as a basis for
+	  building the Box testsuite.
+
+2006-11-05 Sunday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (altnum.1): file
+	  maxspacedim1.cc was added on branch altnum on 2006-12-02 22:35:34
+	  +0000
+
+2006-11-05 Sunday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim1.cc (octagons.1): file
+	  maxspacedim1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-11-05 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.54), BD_Shape/maxspacedim.cc
+	  (1.14), BD_Shape/maxspacedim1.cc (1.1),
+	  Octagonal_Shape/Makefile.am (1.11),
+	  Octagonal_Shape/maxspacedim.cc (1.2),
+	  Octagonal_Shape/maxspacedim1.cc (1.1): Renamed maxspacedim.cc to
+	  maxspacedim1.cc.
+
+2006-11-05 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (altnum.1): file maxspacedim1.cc
+	  was added on branch altnum on 2006-12-02 22:35:33 +0000
+
+2006-11-05 Sunday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim1.cc (octagons.1): file maxspacedim1.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-11-05 Sunday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.87): Missing blanks added.
+
+2006-11-05 Sunday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.cc, Box.defs.hh, Box.templates.hh (altnum.[2,6,7]):
+	  Added void Box<Interval>::add_constraints(const
+	  Constraint_System&) and bool Box<Interval>::OK() const.  Started
+	  drafting void Box<Interval>::add_constraint(const Constraint&).
+
+2006-11-05 Sunday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[5,5,6]): New methods void box_hull_assign(const Box&)
+	  and void upper_bound_assign(const Box&).
+
+2006-11-05 Sunday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.defs.hh, Box.inlines.hh, Box.templates.hh
+	  (altnum.[4,4,5]): New methods bool Box<Interval>::marked_empty()
+	  const and void Box<Interval>::intersection_assign(const Box&).
+
+2006-11-05 Sunday 09:41  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh (altnum.[4,17]): Added
+	  some methods.
+
+2006-11-05 Sunday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Box.templates.hh (altnum.4): Two FIXMEs resolved by using
+	  Interval::set_lower_unbounded() and
+	  Interval::set_upper_unbounded().
+
+2006-11-05 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Boundary.defs.hh, Box.defs.hh, Box.inlines.hh,
+	  Box.templates.hh (altnum.[3,3,3,3]): Method is_empty() revised.
+	  Added methods bool is_universe() const, bool
+	  is_topologically_closed() const, bool is_bounded() const, and
+	  bool contains_integer_point() const.
+
+2006-11-05 Sunday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.7): Activated the
+	  bounded_affine_image() and bounded_affine_preimage() methods.
+
+2006-11-04 Saturday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+	  src/Bounding_Box.inlines.hh, src/Bounding_Box.types.hh,
+	  src/Box.defs.hh, src/Box.inlines.hh, src/Box.templates.hh,
+	  src/Makefile.am, src/Polyhedron_widenings.cc, src/Rational_Box.hh
+	  (altnum.[4,4,4,4,3,2,2,2,26,7,1]): New class Rational_Box to
+	  replace the old Bounding_Box.  Several corrections to the
+	  definition of class Box.
+
+2006-11-04 Saturday 20:25  Andrea Cimino
+
+	* interfaces/Java/Makefile.am (1.2): If Java interface generation
+	  is enabled, ppl_java.jar is automatically built. The java files
+	  are now compiled always together.
+
+2006-11-04 Saturday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Box.cc, Box.defs.hh, Box.inlines.hh, Box.templates.hh,
+	  Box.types.hh, Interval.defs.hh, Makefile.am
+	  (altnum.[1,1,1,1,1,16,25]): The new Box templatic class
+	  efficiently represents not necessarily closed, iso-oriented
+	  hyperrectangles.
+
+2006-11-04 Saturday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble (altnum.[3,4]): Enum
+	  value LOWER and UPPER renamed LOWER_BOUNDARY and UPPER_BOUNDARY,
+	  respectively.
+
+2006-11-04 Saturday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval.inlines.hh,
+	  Interval.types.hh, Makefile.am, Old_Interval.defs.hh,
+	  Old_Interval.inlines.hh, Old_Interval.types.hh
+	  (altnum.[2,15,12,3,24,2,2,2]): Old implementation of intervals
+	  moved further out of the way.  New interval implementation is now
+	  included in ppl.hh.
+
+2006-11-04 Saturday 16:46  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.14): Added quick and dirty trick to
+	  support interval construction from strings.
+
+2006-11-04 Saturday 16:39  Abramo Bagnara
+
+	* src/: Boundary.defs.hh, Interval.defs.hh, Interval_Info.defs.hh
+	  (altnum.[1,13,1]): Splitted and reorganized new intervals code.
+
+2006-11-04 Saturday 16:38  Abramo Bagnara
+
+	* src/fpu-ia32.inlines.hh (altnum.4): Added memory clobber
+	  directive to avoid asm reordering.
+
+2006-11-04 Saturday 16:37  Abramo Bagnara
+
+	* src/compiler.hh (altnum.3): Added avoid_cse.
+
+2006-11-04 Saturday 16:36  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.19): Reinserted lost commit.
+	  Added avoid_cse.
+
+2006-11-04 Saturday 16:35  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (altnum.19): Improved comment.
+
+2006-11-03 Friday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.3): Use switches
+	  whenever possible.
+
+2006-11-03 Friday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/ppl_java_common.cc (1.2): Avoid long lines.
+
+2006-11-03 Friday 16:41  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.12): More work on interval.
+
+2006-11-03 Friday 16:38  Andrea Cimino
+
+	* interfaces/Java/jni/: .cvsignore (1.1), ppl_java_C_Polyhedron.cc
+	  (1.1), ppl_java_Polyhedron.cc (1.1), ppl_java_common.cc (1.1),
+	  ppl_java_common.hh (1.1): Added the `jni' directory to the trunk.
+	  Added some files that interface Java to C++ via JNI.
+
+2006-11-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-12-02 22:35:27 +0000
+
+2006-11-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/.cvsignore (octagons.1): file .cvsignore was
+	  added on branch octagons on 2006-11-18 20:36:45 +0000
+
+2006-11-03 Friday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/jni/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:29 +0000
+
+2006-11-03 Friday 15:24  quartieri
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (1.7): Removed some
+	  useless lines from test13().
+
+2006-11-03 Friday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (octagons.1): file
+	  boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-11-03 Friday 14:51  Andrea Cimino
+
+	* interfaces/Makefile.am (1.20): Temporarily disabled the Java
+	  interface to be processed by Makefile.
+
+2006-11-03 Friday 10:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.11),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.19),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.22): Fixed some bugs.  Tidied the handling of a "friend" class
+	  replacement.	Improved some comments.
+
+2006-11-03 Friday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (octagons.1): file ppl_interface_generator_predicate_check_pl.m4
+	  was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-11-02 Thursday 16:51  quartieri
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (1.2): Added some tests.
+
+2006-11-02 Thursday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (octagons.1): file
+	  expandspacedim1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-11-02 Thursday 15:21  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.35),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.2): Corrected
+	  the method bounded_affine_preimage() when `lb_expr' contains
+	  `var'.  Added some tests.
+
+2006-11-02 Thursday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffinepreimage1.cc (octagons.1):
+	  file boundedaffinepreimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-11-02 Thursday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.70): Unwanted changes withdrawn.
+
+2006-11-02 Thursday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh (altnum.[18,27]):
+	  Enable inexact check when requested.
+
+2006-11-02 Thursday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (altnum.18): Fixed missing round
+	  direction extraction.
+
+2006-11-02 Thursday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.83), checked.defs.hh (1.37),
+	  checked_float.inlines.hh (1.69): Previous changes reverted (they
+	  were meant for the `altnum' branch only).
+
+2006-11-02 Thursday 10:03  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.11): Added more functions. Added
+	  some notes to not forget.
+
+2006-11-01 Wednesday 23:00  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.68): Fixed missing round
+	  direction extraction.
+
+2006-11-01 Wednesday 22:59  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.82), checked.defs.hh (1.36):
+	  Enable inexact check when requested.
+
+2006-11-01 Wednesday 22:56  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.10): More work on new intervals.
+
+2006-11-01 Wednesday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.38): Block indentation corrected.
+
+2006-11-01 Wednesday 20:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.13),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.18),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.21): Further improvements to the generation of the code.
+
+2006-11-01 Wednesday 17:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (1.12): Some ongoing
+	  improvements - both to the comments and in making the arguments
+	  to the macros more uniform.
+
+2006-11-01 Wednesday 15:42  Abramo Bagnara
+
+	* src/: Init.cc, Rounding_Dir.defs.hh, Rounding_Dir.inlines.hh,
+	  fpu-c99.inlines.hh, fpu-ia32.inlines.hh, fpu-sparc.inlines.hh,
+	  fpu.types.hh (altnum.[4,4,4,3,3,3,3]), checked_float.inlines.hh
+	  (1.67): Use specific types for fpu_rounding_direction_type and
+	  fpu_rounding_control_word_type.
+
+2006-11-01 Wednesday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.28),
+	  ppl_interface_generator_predicate_check_extra_code (1.17),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.20): Several
+	  improvements to the code - both the generated code and to the m4
+	  itself.
+
+2006-11-01 Wednesday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.16),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.16): Added code for
+	  the Octagonal_Shape and BD_Shape narrowing procedures.
+
+2006-11-01 Wednesday 12:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.10),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.9),
+	  C/ppl_interface_generator_c_dat.m4 (1.9),
+	  C/ppl_interface_generator_c_h_code.m4 (1.6),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.15),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.15),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.27): Several improvements - mainly wrt the generation of code
+	  for the widening and extrapolation operators.  All extrapolations
+	  (including the widenings) for all the simple domains are now
+	  generated. The only missing procedure now is the narrowing.
+
+	  Names of some of the patterns to be replaced have also been
+	  revised.
+
+2006-11-01 Wednesday 12:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (octagons.1): file
+	  ppl_interface_generator_c_dat.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-11-01 Wednesday 12:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (octagons.1):
+	  file ppl_interface_generator_c_h_code.m4 was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-11-01 Wednesday 12:24  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.9): More work on intervals.
+
+2006-11-01 Wednesday 08:13  Abramo Bagnara
+
+	* src/Interval.defs.hh (altnum.8): Put under CVS control.
+
+2006-10-31 Tuesday 23:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.7): Cater also for Octagonal_Shape.  Methods
+	  renamed so as to reflect that Polyhedra_Powerset has been renamed
+	  Pointset_Powerset.
+
+2006-10-31 Tuesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Constraint.java (1.2), Linear_Expression.java
+	  (1.2), Linear_Expression_Coefficient.java (1.2),
+	  Linear_Expression_Common.java (1.2),
+	  Linear_Expression_Difference.java (1.2),
+	  Linear_Expression_Sum.java (1.2), Linear_Expression_Times.java
+	  (1.2), Linear_Expression_Unary_Minus.java (1.2),
+	  Linear_Expression_Variable.java (1.2), Relation_Symbol.java
+	  (1.2): Moved.
+
+2006-10-31 Tuesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.48): Corrected another occurrence of
+	  the same problem identified in the previous commit (wrong
+	  handling of capacities), again in remove_space_dimensions().
+
+2006-10-31 Tuesday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Constraint.java (1.1), Linear_Expression.java
+	  (1.1), Linear_Expression_Coefficient.java (1.1),
+	  Linear_Expression_Common.java (1.1),
+	  Linear_Expression_Difference.java (1.1),
+	  Linear_Expression_Sum.java (1.1), Linear_Expression_Times.java
+	  (1.1), Linear_Expression_Unary_Minus.java (1.1),
+	  Linear_Expression_Variable.java (1.1), Relation_Symbol.java
+	  (1.1): Put under CVS control.
+
+2006-10-31 Tuesday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.47): Corrected a bug (in the
+	  handling of DB_Row capacities) in method
+	  remove_space_dimension(). Avoid useless computations when the
+	  BD_Shape is known to be empty.
+
+2006-10-31 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/foldspacedims1.cc (altnum.1): file
+	  foldspacedims1.cc was added on branch altnum on 2006-12-02
+	  22:35:34 +0000
+
+2006-10-31 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/foldspacedims1.cc (octagons.1): file
+	  foldspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-31 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (octagons.1): file
+	  mapspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-31 Tuesday 16:35  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.15),
+	  src/Octagonal_Shape.templates.hh (1.34),
+	  tests/Octagonal_Shape/Makefile.am (1.10),
+	  tests/Octagonal_Shape/foldspacedims1.cc (1.1),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.2): Defined the method
+	  fold_space_dimensions() and added some tests about it.  Removed
+	  the trailing white spaces from mapspacedims1.
+
+2006-10-31 Tuesday 14:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.26),
+	  ppl_interface_generator_predicate_check_extra_code (1.16),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.19): Added
+	  generic tests for the remaining widening/extrapolation and change
+	  dimensions procedures.
+
+2006-10-31 Tuesday 13:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/foldspacedims1.cc (1.2): Added two tests to show a
+	  bug.	Both test fold_space_dimensions() for an empty shape in 2
+	  dimensions but where the initial shape is built in different
+	  ways.  One of these tests causes an exception to be thrown
+	  whereas the other passes.
+
+2006-10-31 Tuesday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/foldspacedims1.cc (octagons.1): file
+	  foldspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-10-31 Tuesday 09:30  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh, Rounding_Dir.defs.hh,
+	  Rounding_Dir.inlines.hh, checked_int.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[19,3,3,27,23]),
+	  Checked_Number.defs.hh (1.81): Check for FPU inexact result only
+	  when explicitly requested by the individual functions/operators.
+
+2006-10-31 Tuesday 09:23  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (altnum.20): Fixed is_int_mpq().
+
+2006-10-31 Tuesday 08:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.29): Avoid a Doxygen warning about an
+	  undocumented parameter.
+
+2006-10-30 Monday 18:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.25): Tests for the affine image and preimage predicates added.
+
+2006-10-30 Monday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Saturation_Matrix.cc (1.12), Saturation_Matrix.defs.hh
+	  (1.12), Saturation_Matrix.inlines.hh (1.8),
+	  Saturation_Matrix.types.hh (1.5), Saturation_Row.cc (1.12),
+	  Saturation_Row.defs.hh (1.13), Saturation_Row.inlines.hh (1.9),
+	  Saturation_Row.types.hh (1.5): Replaced by the corresponding
+	  files Bit_*.
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc (altnum.1): file Bit_Matrix.cc was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.cc (octagons.1): file Bit_Matrix.cc was added on
+	  branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh (altnum.1): file Bit_Matrix.defs.hh was
+	  added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.defs.hh (octagons.1): file Bit_Matrix.defs.hh was
+	  added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.inlines.hh (altnum.1): file Bit_Matrix.inlines.hh
+	  was added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.inlines.hh (octagons.1): file
+	  Bit_Matrix.inlines.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.types.hh (altnum.1): file Bit_Matrix.types.hh was
+	  added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Matrix.types.hh (octagons.1): file Bit_Matrix.types.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (altnum.1): file Bit_Row.cc was added on branch
+	  altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.cc (octagons.1): file Bit_Row.cc was added on branch
+	  octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (altnum.1): file Bit_Row.defs.hh was added on
+	  branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.defs.hh (octagons.1): file Bit_Row.defs.hh was added
+	  on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (altnum.1): file Bit_Row.inlines.hh was
+	  added on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.inlines.hh (octagons.1): file Bit_Row.inlines.hh was
+	  added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.types.hh (altnum.1): file Bit_Row.types.hh was added
+	  on branch altnum on 2006-12-02 22:35:31 +0000
+
+2006-10-30 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bit_Row.types.hh (octagons.1): file Bit_Row.types.hh was
+	  added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-10-30 Monday 16:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.199), doc/devref.doxyconf-html.in (1.79),
+	  doc/devref.doxyconf-latex.in (1.18), src/BD_Shape.defs.hh (1.86),
+	  src/BD_Shape.templates.hh (1.46), src/Bit_Matrix.cc (1.1),
+	  src/Bit_Matrix.defs.hh (1.1), src/Bit_Matrix.inlines.hh (1.1),
+	  src/Bit_Matrix.types.hh (1.1), src/Bit_Row.cc (1.1),
+	  src/Bit_Row.defs.hh (1.1), src/Bit_Row.inlines.hh (1.1),
+	  src/Bit_Row.types.hh (1.1), src/Linear_System.cc (1.40),
+	  src/Linear_System.defs.hh (1.29), src/Linear_System.inlines.hh
+	  (1.19), src/Makefile.am (1.163), src/Polyhedron.defs.hh (1.308),
+	  src/Polyhedron_chdims.cc (1.40), src/Polyhedron_nonpublic.cc
+	  (1.70), src/Polyhedron_public.cc (1.86),
+	  src/Polyhedron_widenings.cc (1.56), src/conversion.cc (1.79),
+	  src/minimize.cc (1.44), src/simplify.cc (1.46),
+	  src/swapping_sort.icc (1.11): Classes Saturation_Row and
+	  Saturation_Matrix renamed as Bit_Row and Bit_Matrix,
+	  respectively.
+
+2006-10-30 Monday 14:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Saturation_Row.defs.hh (1.12): Added specification for   void
+	  set_until(unsigned long k);
+
+2006-10-30 Monday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.85), BD_Shape.templates.hh (1.45): The
+	  redundancy_dbm private data member of BD_Shape is now implemented
+	  by using a Saturation_Matrix (instead of a vector of deques of
+	  Booleans).
+
+2006-10-30 Monday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Saturation_Matrix.cc (1.11), Saturation_Matrix.defs.hh
+	  (1.11), Saturation_Matrix.inlines.hh (1.7): Added comparison
+	  operators for Saturation_Matrix.
+
+2006-10-30 Monday 12:23  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.33): Removed an old FIXME and
+	  a provisional implementation of the method
+	  external_memory_in_bytes().
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (octagons.1): file FCAIBVP.cc was added on
+	  branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (octagons.1): file FCAIBVP.defs.hh was
+	  added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (octagons.1): file FCAIBVP.inlines.hh
+	  was added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (octagons.1): file
+	  variablesset1.cc was added on branch octagons on 2006-11-18
+	  20:37:00 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (octagons.1): file Variables_Set.cc was
+	  added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (octagons.1): file
+	  Variables_Set.defs.hh was added on branch octagons on 2006-11-18
+	  20:36:51 +0000
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (octagons.1): file
+	  Variables_Set.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-10-30 Monday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.8),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.5),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.14),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.13), src/BD_Shape.templates.hh (1.44),
+	  src/Grid_Generator_System.cc (1.16), src/Grid_chdims.cc (1.14),
+	  src/MIP_Problem.cc (1.37), src/MIP_Problem.defs.hh (1.28),
+	  src/Octagonal_Shape.templates.hh (1.32), src/Polyhedron_chdims.cc
+	  (1.39), src/Variables_Set.cc (1.2), src/Variables_Set.defs.hh
+	  (1.3), src/Variables_Set.inlines.hh (1.3), tests/FCAIBVP.cc
+	  (1.2), tests/FCAIBVP.defs.hh (1.3), tests/FCAIBVP.inlines.hh
+	  (1.3), tests/Polyhedron/variablesset1.cc (1.8): Variables_Set is
+	  now an std::set of variables' indexes (instead of Variable).
+
+2006-10-30 Monday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (octagons.1):
+	  file ppl_interface_generator_c_cc_preamble was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-30 Monday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+	  src/Bounding_Box.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Grid.templates.hh, src/Interval.cc, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh, src/Makefile.am,
+	  src/Old_Interval.cc, src/Old_Interval.defs.hh,
+	  src/Old_Interval.inlines.hh, src/Old_Interval.types.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh
+	  (altnum.[3,3,3,3,3,3,2,7,11,2,23,1,1,1,1,9,3]): Old interval
+	  implementation moved out of the way.
+
+2006-10-29 Sunday 22:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.24),
+	  ppl_interface_generator_predicate_check_extra_code (1.15): Added
+	  generic tests for the binary operators.
+
+2006-10-29 Sunday 20:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, COPYING, CREDITS, ChangeLog, INSTALL, Makefile.am, NEWS,
+	  README, README.configure, STANDARDS, TODO, compile, config.guess,
+	  config.rpath, config.sub, configure.ac, depcomp, install-sh,
+	  instchk.hh, ltmain.sh, missing, mkinstalldirs, ppl.lsm.in,
+	  ppl.spec.in, Watchdog/.cvsignore, Watchdog/COPYING,
+	  Watchdog/CREDITS, Watchdog/ChangeLog,
+	  Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+	  Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh,
+	  Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+	  Watchdog/INSTALL, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/Pending_Element.cc, Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh,
+	  Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/Pending_List.types.hh, Watchdog/README,
+	  Watchdog/Time.cc, Watchdog/Time.defs.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/Time.types.hh,
+	  Watchdog/Watchdog.cc, Watchdog/Watchdog.defs.hh,
+	  Watchdog/Watchdog.inlines.hh, Watchdog/Watchdog.types.hh,
+	  Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/pwl_header.bottom, Watchdog/pwl_header.middle,
+	  Watchdog/pwl_header.top, Watchdog/src/.cvsignore,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/.cvsignore, Watchdog/utils/Makefile.am,
+	  Watchdog/utils/build_header.in, debian/.cvsignore,
+	  debian/Makefile.am, debian/README, debian/changelog,
+	  debian/compat, debian/control, debian/libppl-c.dirs,
+	  debian/libppl-c.install, debian/libppl-c.links,
+	  debian/libppl-dev.dirs, debian/libppl-dev.doc-base,
+	  debian/libppl-dev.doc-base.user, debian/libppl-dev.docs,
+	  debian/libppl-dev.install, debian/libppl-dev.links,
+	  debian/libppl-pwl.copyright.in, debian/libppl-pwl.dirs,
+	  debian/libppl-pwl.docs, debian/libppl-pwl.install,
+	  debian/libppl.copyright.in, debian/libppl.dirs,
+	  debian/libppl.docs, debian/libppl.install, debian/rules,
+	  demos/Makefile.am, demos/ppl_lcdd/.cvsignore,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lcdd/examples/README, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/README,
+	  demos/ppl_lpsol/examples/adlittle.mps,
+	  demos/ppl_lpsol/examples/blend.mps,
+	  demos/ppl_lpsol/examples/boeing1.mps,
+	  demos/ppl_lpsol/examples/boeing2.mps,
+	  demos/ppl_lpsol/examples/egout.mps,
+	  demos/ppl_lpsol/examples/ex11.mps,
+	  demos/ppl_lpsol/examples/ex12.mps,
+	  demos/ppl_lpsol/examples/kb2.mps,
+	  demos/ppl_lpsol/examples/lseu.mps,
+	  demos/ppl_lpsol/examples/markshare1.mps,
+	  demos/ppl_lpsol/examples/markshare2.mps,
+	  demos/ppl_lpsol/examples/mas74.mps,
+	  demos/ppl_lpsol/examples/mas76.mps,
+	  demos/ppl_lpsol/examples/mip.mps,
+	  demos/ppl_lpsol/examples/modglob.mps,
+	  demos/ppl_lpsol/examples/noswot.mps,
+	  demos/ppl_lpsol/examples/opt1217.mps,
+	  demos/ppl_lpsol/examples/p0033.mps,
+	  demos/ppl_lpsol/examples/pk1.mps,
+	  demos/ppl_lpsol/examples/rout.mps,
+	  demos/ppl_lpsol/examples/sc105.mps,
+	  demos/ppl_lpsol/examples/sc50a.mps,
+	  demos/ppl_lpsol/examples/sc50b.mps,
+	  demos/ppl_lpsol/examples/ship08l.mps, doc/.cvsignore,
+	  doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-c-interface.doxyconf-html.in,
+	  doc/devref-c-interface.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in,
+	  doc/devref-prolog-interface.doxyconf-html.in,
+	  doc/devref-prolog-interface.doxyconf-latex.in,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/fdl.dox, doc/fdl.tex, doc/fdl.txt,
+	  doc/gpl.dox, doc/gpl.tex, doc/gpl.txt, doc/ppl-config.1,
+	  doc/ppl-config_extra_man_text, doc/ppl.sty, doc/ppl_lcdd.1,
+	  doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-c-interface.doxyconf-html.in,
+	  doc/user-c-interface.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in,
+	  doc/user-prolog-interface.doxyconf-html.in,
+	  doc/user-prolog-interface.doxyconf-latex.in,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, interfaces/Makefile.am,
+	  interfaces/ppl_interface_generator_common.m4,
+	  interfaces/ppl_interface_generator_common_dat.m4,
+	  interfaces/ppl_interface_generator_copyright,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/C/ppl_c_version.h.in,
+	  interfaces/C/ppl_interface_generator_c_cc.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4,
+	  interfaces/C/ppl_interface_generator_c_cc_preamble,
+	  interfaces/C/ppl_interface_generator_c_dat.m4,
+	  interfaces/C/ppl_interface_generator_c_h.m4,
+	  interfaces/C/ppl_interface_generator_c_h_code.m4,
+	  interfaces/C/ppl_interface_generator_c_h_preamble,
+	  interfaces/Java/.cvsignore, interfaces/Java/Makefile.am,
+	  interfaces/OCaml/Makefile.am, interfaces/OCaml/ppl_ocaml.cc,
+	  interfaces/OCaml/ppl_ocaml.mli, interfaces/OCaml/test1.ml,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_cfli.hh,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/gprolog_cfli.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  interfaces/Prolog/SICStus/.cvsignore,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_cfli.hh,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected2_int16,
+	  interfaces/Prolog/XSB/expected2_int16_a,
+	  interfaces/Prolog/XSB/expected2_int32,
+	  interfaces/Prolog/XSB/expected2_int32_a,
+	  interfaces/Prolog/XSB/expected2_int64,
+	  interfaces/Prolog/XSB/expected2_int64_a,
+	  interfaces/Prolog/XSB/expected2_int8,
+	  interfaces/Prolog/XSB/expected2_int8_a,
+	  interfaces/Prolog/XSB/expected2_mpz,
+	  interfaces/Prolog/XSB/expected2_mpz_a,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int32_a,
+	  interfaces/Prolog/XSB/expected3_int64,
+	  interfaces/Prolog/XSB/expected3_int64_a,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/expected3_int8_a,
+	  interfaces/Prolog/XSB/expected3_mpz,
+	  interfaces/Prolog/XSB/expected3_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_int16,
+	  interfaces/Prolog/XSB/expected_int16_a,
+	  interfaces/Prolog/XSB/expected_int32,
+	  interfaces/Prolog/XSB/expected_int32_a,
+	  interfaces/Prolog/XSB/expected_int64,
+	  interfaces/Prolog/XSB/expected_int64_a,
+	  interfaces/Prolog/XSB/expected_int8,
+	  interfaces/Prolog/XSB/expected_int8_a,
+	  interfaces/Prolog/XSB/expected_mpz,
+	  interfaces/Prolog/XSB/expected_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/expected_pchk_mpz,
+	  interfaces/Prolog/XSB/expected_pchk_mpz_a,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_cfli.hh,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_cfli.hh,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/check_script,
+	  interfaces/Prolog/tests/check_script2,
+	  interfaces/Prolog/tests/check_script2_int8,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected2_int16,
+	  interfaces/Prolog/tests/expected2_int16_a,
+	  interfaces/Prolog/tests/expected2_int32,
+	  interfaces/Prolog/tests/expected2_int32_a,
+	  interfaces/Prolog/tests/expected2_int64,
+	  interfaces/Prolog/tests/expected2_int64_a,
+	  interfaces/Prolog/tests/expected2_int8,
+	  interfaces/Prolog/tests/expected2_int8_a,
+	  interfaces/Prolog/tests/expected2_mpz,
+	  interfaces/Prolog/tests/expected2_mpz_a,
+	  interfaces/Prolog/tests/expected3_int16,
+	  interfaces/Prolog/tests/expected3_int16_a,
+	  interfaces/Prolog/tests/expected3_int32,
+	  interfaces/Prolog/tests/expected3_int32_a,
+	  interfaces/Prolog/tests/expected3_int64,
+	  interfaces/Prolog/tests/expected3_int64_a,
+	  interfaces/Prolog/tests/expected3_int8,
+	  interfaces/Prolog/tests/expected3_int8_a,
+	  interfaces/Prolog/tests/expected3_mpz,
+	  interfaces/Prolog/tests/expected3_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_int16,
+	  interfaces/Prolog/tests/expected_int16_a,
+	  interfaces/Prolog/tests/expected_int32,
+	  interfaces/Prolog/tests/expected_int32_a,
+	  interfaces/Prolog/tests/expected_int64,
+	  interfaces/Prolog/tests/expected_int64_a,
+	  interfaces/Prolog/tests/expected_int8,
+	  interfaces/Prolog/tests/expected_int8_a,
+	  interfaces/Prolog/tests/expected_mpz,
+	  interfaces/Prolog/tests/expected_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/expected_pchk_mpz,
+	  interfaces/Prolog/tests/expected_pchk_mpz_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/pl_grid_check.pl,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code,
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4,
+	  interfaces/Prolog/tests/script_clpq,
+	  interfaces/Prolog/tests/script_clpq2,
+	  interfaces/Prolog/tests/script_clpq2_int8, m4/Makefile.am,
+	  m4/ac_check_fpu_control.m4, m4/ac_check_gmp.m4,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/ac_cxx_attribute_weak.m4,
+	  m4/ac_cxx_double_binary_format.m4,
+	  m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_flexible_arrays.m4,
+	  m4/ac_cxx_float_binary_format.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_long_double_is_iec_559.m4, m4/ac_cxx_long_long.m4,
+	  m4/ac_text_md5sum.m4, m4/lib-ld.m4, m4/lib-link.m4,
+	  m4/lib-prefix.m4, m4/ppl.m4, src/.cvsignore,
+	  src/Any_Pointset.defs.hh, src/Any_Pointset.inlines.hh,
+	  src/Any_Pointset.types.hh, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.templates.hh,
+	  src/Ask_Tell.types.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BD_Shape.templates.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence.types.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Congruence_System.inlines.hh, src/Congruence_System.types.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint.types.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/Constraint_System.types.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.templates.hh, src/DB_Matrix.types.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	  src/DB_Row.templates.hh, src/DB_Row.types.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Determinate.types.hh, src/Direct_Product.defs.hh,
+	  src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Direct_Product.types.hh, src/E_NIT.defs.hh,
+	  src/E_NIT.inlines.hh, src/E_NIT.types.hh, src/E_Rational.defs.hh,
+	  src/E_Rational.inlines.hh, src/E_Rational.types.hh,
+	  src/Extended_Number.defs.hh, src/Extended_Number.inlines.hh,
+	  src/Extended_Number.types.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+	  src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid.types.hh, src/Grid_Certificate.cc,
+	  src/Grid_Certificate.defs.hh, src/Grid_Certificate.inlines.hh,
+	  src/Grid_Certificate.types.hh, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator.types.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.types.hh, src/Interval.cc, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh, src/Limits.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_Row.types.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Linear_System.types.hh,
+	  src/MIP_Problem.cc, src/MIP_Problem.defs.hh,
+	  src/MIP_Problem.inlines.hh, src/MIP_Problem.templates.hh,
+	  src/MIP_Problem.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/OR_Matrix.templates.hh, src/OR_Matrix.types.hh,
+	  src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Octagonal_Shape.types.hh, src/Og_Status.idefs.hh,
+	  src/Og_Status.inlines.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	  src/Pointset_Ask_Tell.cc, src/Pointset_Ask_Tell.defs.hh,
+	  src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron.types.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh, src/Rounding.defs.hh,
+	  src/Rounding.inlines.hh, src/Rounding.types.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/distances.defs.hh,
+	  src/distances.inlines.hh, src/distances.types.hh,
+	  src/float.types.hh, src/fpu-c99.inlines.hh,
+	  src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	  src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	  src/globals.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.bottom, src/ppl_header.hh,
+	  src/ppl_header.middle, src/ppl_header.top, src/simplify.cc,
+	  src/swapping_sort.icc, src/version.cc, src/version.hh.in,
+	  tests/BBox.cc, tests/BBox.hh, tests/FCAIBVP.cc,
+	  tests/FCAIBVP.defs.hh, tests/FCAIBVP.inlines.hh,
+	  tests/FCAIBVP.types.hh, tests/Makefile.am, tests/PFunction.cc,
+	  tests/PFunction.hh, tests/Partial_Function.cc,
+	  tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+	  tests/ppl_test.cc, tests/ppl_test.hh, tests/print.cc,
+	  tests/print.hh, tests/Ask_Tell/.cvsignore,
+	  tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/.cvsignore, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage2.cc,
+	  tests/BD_Shape/affineimage3.cc, tests/BD_Shape/affineimage4.cc,
+	  tests/BD_Shape/affineimage5.cc, tests/BD_Shape/affineimage6.cc,
+	  tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/boundedaffineimage1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+	  tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+	  tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/discrete1.cc, tests/BD_Shape/disjoint1.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/expandspacedim1.cc,
+	  tests/BD_Shape/foldspacedims1.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/membytes1.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+	  tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+	  tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdiffs1.cc, tests/BD_Shape/writebdiffs2.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/Grid/.cvsignore,
+	  tests/Grid/Makefile.am, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addgenerators1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affineimage2.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/affinepreimage2.cc, tests/Grid/asciidumpload1.cc,
+	  tests/Grid/asciidumpload2.cc, tests/Grid/asciidumpload3.cc,
+	  tests/Grid/asciidumpload4.cc, tests/Grid/asciidumpload5.cc,
+	  tests/Grid/asciidumpload6.cc, tests/Grid/asciidumpload7.cc,
+	  tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/copyconstruct1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/discrete1.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/outputoperator2.cc,
+	  tests/Grid/outputoperator3.cc, tests/Grid/partition1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/MIP_Problem/.cvsignore, tests/MIP_Problem/Makefile.am,
+	  tests/MIP_Problem/ascii_dump_load1.cc,
+	  tests/MIP_Problem/exceptions1.cc,
+	  tests/MIP_Problem/mipproblem1.cc,
+	  tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/boundedaffineimage1.cc,
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/discrete1.cc,
+	  tests/Octagonal_Shape/disjoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/expandspacedim1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/maxspacedim.cc,
+	  tests/Octagonal_Shape/membytes1.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/.cvsignore, tests/Polyhedron/CbecomesNNC1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/containsintegerpoint1.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc,
+	  tests/Polyhedron/valgrind_suppressions,
+	  tests/Polyhedron/variablesset1.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/.cvsignore,
+	  utils/Makefile.am, utils/build_header.in, utils/text2cxxarray.in,
+	  utils/timings.cc, utils/timings.hh
+	  (altnum.[2,1,6,3,2,5,8,4,4,4,8,3,5,2,4,19,2,5,2,3,2,1,3,3,1,1,1,3,2,2,2,2,2,2,2,3,2,3,2,2,2,6,3,2,2,2,2,2,2,2,2,3,2,2,2,2,3,3,2,1,3,5,4,4,2,5,3,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,1,7,11,3,3,5,3,2,3,3,3,3,2,2,3,3,6,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,4,2,8,6,2,2,6,2,2,6,2,4,1,2,2,1,1,2,2,2,4,2,2,2,2,2,4,2,2,4,2,2,4,2,4,3,2,2,2,2,9,6,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,8,3,2,2,2,2,2, [...]
+	  Eighth merge from the main trunk.
+
+2006-10-28 Saturday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.23),
+	  ppl_interface_generator_predicate_check_extra_code (1.14): Added
+	  generic tests for adding a representation or elements of a
+	  representation (with and without minimize).
+
+2006-10-28 Saturday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (altnum.1): file ppl_interface_generator_predicate_check_code.m4
+	  was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-28 Saturday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (altnum.1): file
+	  ppl_interface_generator_predicate_check_extra_code was added on
+	  branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (altnum.1): file Makefile.am
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (altnum.1): file disjoint1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (octagons.1): file
+	  disjoint1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/expandspacedim1.cc (altnum.1): file
+	  expandspacedim1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (altnum.1): file
+	  relatwithcons2.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (octagons.1): file
+	  relatwithcons2.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-27 Friday 17:42  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.14),
+	  src/Octagonal_Shape.templates.hh (1.31),
+	  tests/Octagonal_Shape/Makefile.am (1.9),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.6),
+	  tests/Octagonal_Shape/boundedaffinepreimage1.cc (1.1),
+	  tests/Octagonal_Shape/disjoint1.cc (1.5),
+	  tests/Octagonal_Shape/expandspacedim1.cc (1.1),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.3): Corrected a bug in
+	  the method relation_with().  Added some tests on the methods
+	  relation_with() and is_disjoint_from().  Defined the methods
+	  bounded_affine_preimage() and expand_space_dimension() and added
+	  some tests on them.
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (altnum.1): file
+	  Octagonal_Shape.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-27 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (altnum.1): file
+	  Octagonal_Shape.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-27 Friday 16:00  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.53), membytes1.cc (1.1): Added
+	  new tests on on the methods	external_memoty_in_bytes() and
+	  total_memory_in_bytes().
+
+2006-10-27 Friday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/membytes1.cc (altnum.1): file membytes1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-27 Friday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/membytes1.cc (octagons.1): file membytes1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-27 Friday 12:41  Elena Mazzi
+
+	* tests/BD_Shape/relations3.cc (1.18): Added some new tests on
+	  BD_Shape::relation_with(Constraint).
+
+2006-10-27 Friday 12:40  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.43): Corrected a bug in
+	  BD_Shape::relation_with(const Constraint& c) when the constraint
+	  is an equality and is disjoint from BDS.
+
+2006-10-27 Friday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (altnum.1): file BD_Shape.templates.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-27 Friday 11:41  quartieri
+
+	* tests/Octagonal_Shape/membytes1.cc (1.2): Removed an annotation
+	  indicating an expected failure with 8 bits coefficients.
+
+2006-10-27 Friday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/membytes1.cc (altnum.1): file membytes1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-27 Friday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/membytes1.cc (octagons.1): file
+	  membytes1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-10-27 Friday 10:55  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.42): Corrected a bug in
+	  BD_Shape::is_disjoint_from() when the two BD_Shapes consist of
+	  single but different points in 1D.
+
+2006-10-27 Friday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.22),
+	  ppl_interface_generator_predicate_check_extra_code (1.13),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.18): Added tests
+	  for comparing the class objects.
+
+	  General improvements to the test system including:
+
+	  Changing the test_data identifiers to be "test0n".  Using a list
+	  to give all the required tests and the member predicate to select
+	  the tests.  Generating code for building the test object for any
+	  given test id and use this instead of coding it in the actual
+	  tests.  The space_dimension and affine_dimension are now defined
+	  by an auxiliary predicate for each test id.
+
+2006-10-27 Friday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (altnum.1): file ppl_interface_generator_predicate_check_pl.m4
+	  was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2006-10-26 Thursday 22:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/disjoint1.cc (1.4): Added test07 which shows a bug
+	  when the two BD_Shapes consist of single but different points in
+	  1D.
+
+2006-10-26 Thursday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (altnum.1): file disjoint1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-26 Thursday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (octagons.1): file disjoint1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-26 Thursday 17:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/relations3.cc (1.17): Added a test showing a bug
+	  in the relation_with() method.  Test04 fails as the relation
+	  returned is "strictly_intersects" and not, as expected,
+	  "is_disjoint".
+
+2006-10-26 Thursday 15:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.21),
+	  ppl_interface_generator_predicate_check_extra_code (1.12): Added
+	  generic tests for maximize, minimize, maximize_with_point and
+	  minimize_with_point.
+
+2006-10-26 Thursday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.69): Corrected a bug in method
+	  max_min() whereby an assertion was failing when maximizing or
+	  minimizing an expression on a zero-dimensional polyhedron.
+
+2006-10-26 Thursday 11:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/max_min1.cc (1.10): Test 03 causes an assertion
+	  failure for the universe polyhedron with 0 dimensions.
+
+2006-10-25 Wednesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/foldspacedims1.cc (altnum.1): file
+	  foldspacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-25 Wednesday 15:58  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.52), expandspacedim1.cc (1.1),
+	  foldspacedims1.cc (1.1): Added new tests on methods: -
+	  BD_Shape<T>::expand_space_dimension(Variable var, dimension_type
+	  m); - BD_Shape<T>::fold_space_dimensions(Variables_Set&
+	  to_be_folded, 			    Variable var).
+
+2006-10-25 Wednesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/expandspacedim1.cc (altnum.1): file
+	  expandspacedim1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-25 Wednesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/expandspacedim1.cc (octagons.1): file
+	  expandspacedim1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-10-25 Wednesday 15:55  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.84), BD_Shape.templates.hh (1.41):
+	  Defined two new methods:
+	  BD_Shape<T>::expand_space_dimension(Variable var, dimension_type
+	  m); BD_Shape<T>::fold_space_dimensions(Variables_Set&
+	  to_be_folded, 			      Variable var).
+
+2006-10-25 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (1.6): Avoided a couple of
+	  copies.
+
+2006-10-25 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (altnum.1): file
+	  Pointset_Powerset.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-25 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (octagons.1): file
+	  Pointset_Powerset.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-10-25 Wednesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.6): Uncommented code that was
+	  temporarily disabled due to missing method in some pointset
+	  classes.
+
+2006-10-25 Wednesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (altnum.1): file Any_Pointset.defs.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-25 Wednesday 11:09  quartieri
+
+	* tests/Octagonal_Shape/Makefile.am (1.8): Added the test
+	  membytes1.cc.
+
+2006-10-25 Wednesday 09:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.14):
+	  The Prolog predicate for BD_Shape_..._bounded_affine_image must
+	  not be built.
+
+2006-10-25 Wednesday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (altnum.1): file ppl_interface_generator_prolog_dat.m4 was added
+	  on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-24 Tuesday 18:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.9),
+	  C/ppl_interface_generator_c_dat.m4 (1.8),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.13),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.13),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.20),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.11): In the ppl/interfaces:
+
+	  The @BOX@ replacement is now only used for building from a box
+	  (bounding_box or covering_box).
+
+	  The "get" or "shrink" bounding_box or covering_box" procedures,
+	  do not use any pattern. As the Grid has the same aruments as the
+	  Polyhedron for shrink_bounding_box, we can combine all the
+	  classes for this procedure into one schema. On the other hand,
+	  although the covering box is only available at present for the
+	  Grid domain, it is provided as a generic schema.
+
+	  The property "is_topologically_closed" is now enabled for
+	  BD_Shape and Octagons Prolog interfaces.  Similarly the
+	  "topological_closure_assign" procedure is now enabled for
+	  BD_Shape and Octagons Prolog interfaces.
+
+	  Generic tests for all the properties using schema
+	  ppl_ at CLASS@_ at HAS_PROPERTY@ have been added.  Generic tests for
+	  ppl_ at CLASS@_ at SIMPLIFY@ have been added (for the domains under
+	  consideration, this is just the ."topological_closure_assign"
+	  procedure).
+
+	  The test data for the generic tests has again been reorganised
+	  and restructured making it easier to extend and maintain.
+
+2006-10-24 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (altnum.1): file
+	  ppl_interface_generator_c_dat.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-24 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (altnum.1): file
+	  ppl_interface_generator_common_dat.m4 was added on branch altnum
+	  on 2006-10-29 19:26:57 +0000
+
+2006-10-24 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (altnum.1): file ppl_interface_generator_prolog_icc_code.m4 was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-24 Tuesday 17:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.36), src/Grid.templates.hh (1.22),
+	  tests/Grid/boundingbox1.cc (1.13), tests/Grid/boundingbox2.cc
+	  (1.11): In ppl/src:
+
+	  The grid can now be built from boxes which may have different
+	  finite values for the upper and lower bounds or have only the
+	  upper or the lower bound bounded or have open finite bounds.
+	  Before when this happened an exception was thrown. Now we compute
+	  an approximation.
+
+	  Also, now the Grid domain requires the complexity as an argument
+	  for shrink_bounding_box so as to be compatible with the
+	  Polyhedron_shrink_bounding_box. This argument is not used.
+
+	  The tests/Grid/boundingbox1.cc and tests/Grid/boundingbox2.cc
+	  have been revised to match.
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh (altnum.1): file Grid.defs.hh was added on
+	  branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (altnum.1): file Grid.templates.hh was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox1.cc (altnum.1): file boundingbox1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-24 Tuesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox2.cc (altnum.1): file boundingbox2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-24 Tuesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.19): Recursively process the Java
+	  directory.
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/.cvsignore (altnum.1): file .cvsignore was added
+	  on branch altnum on 2006-10-29 19:26:59 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/.cvsignore (octagons.1): file .cvsignore was
+	  added on branch octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/.cvsignore (simplex.1): file .cvsignore was added
+	  on branch simplex on 2008-01-07 11:15:28 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Makefile.am (altnum.1): file Makefile.am was
+	  added on branch altnum on 2006-10-29 19:26:59 +0000
+
+2006-10-24 Tuesday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.244), interfaces/Java/.cvsignore (1.1),
+	  interfaces/Java/Makefile.am (1.1): Java directories activated.
+
+2006-10-24 Tuesday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/: Coefficient.java (1.3), Variable.java (1.3):
+	  Moved into the package's directory.
+
+2006-10-24 Tuesday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Coefficient.java (1.2): Comments and identifiers
+	  names revised.
+
+2006-10-24 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Variable.java (1.2): Cosmetic changes.
+
+2006-10-24 Tuesday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Variable.java (1.1): Coefficient Java class
+	  declaration and implementation.
+
+2006-10-24 Tuesday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Java/Coefficient.java (1.1): Coefficient Java class
+	  declaration and implementation.
+
+2006-10-23 Monday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (1.4): Added FIXMEs to remember
+	  when the generalization to Powerset's of arbitrary stuff is going
+	  to be buggy.
+
+2006-10-23 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (altnum.1): file
+	  Pointset_Powerset.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (octagons.1): file
+	  Pointset_Powerset.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-10-23 Monday 11:52  quartieri
+
+	* tests/Octagonal_Shape/membytes1.cc (1.1): Added some tests on the
+	  methods   external_memoty_in_bytes() and
+	  total_memory_in_bytes().
+
+2006-10-23 Monday 11:51  quartieri
+
+	* src/: OR_Matrix.defs.hh (1.6), OR_Matrix.inlines.hh (1.3),
+	  OR_Matrix.templates.hh (1.4), Octagonal_Shape.templates.hh
+	  (1.30): Defined the methods	  external_memory_in_bytes() and
+	  total_memory_in_bytes().
+
+2006-10-23 Monday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (altnum.1): file OR_Matrix.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (altnum.1): file OR_Matrix.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (altnum.1): file
+	  OR_Matrix.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-23 Monday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Pointset_Powerset.defs.hh (1.5),
+	  Pointset_Powerset.inlines.hh (1.3),
+	  Pointset_Powerset.templates.hh (1.5): No longer defining the
+	  specialized constructor:   Pointset_Powerset<C_Polyhedron>(const
+	  Pointset_Powerset<QH>&); defining the generic constructor
+	  Pointset_Powerset<PH>(const Pointset_Powerset<QH>&); instead.
+	  Similarly, generalized the specialized method:
+	  poly_difference_assign<C_Polyhedron>(...) to (temporarily) work
+	  on arbitrary instances.
+
+2006-10-23 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (altnum.1): file
+	  Pointset_Powerset.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-23 Monday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.83), Octagonal_Shape.defs.hh (1.13):
+	  Unary constructors made explicit so as to avoid unexpected
+	  conversions.
+
+2006-10-23 Monday 08:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.40), Grid_public.cc (1.46),
+	  Octagonal_Shape.templates.hh (1.29), Polyhedron_public.cc (1.85):
+	  Prefer "existential quantification" to "cylindrification" in
+	  comments.
+
+2006-10-23 Monday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (altnum.1): file Grid_public.cc was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-10-22 Sunday 02:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.45): Make sure XSB finds
+	  libppl and libpwl in the current build tree.
+
+2006-10-21 Saturday 23:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.12),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.19),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.17): Added
+	  tests for get_bounding_box and get_covering_box.
+
+	  Removed unnecessary code and simplified the code in
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+
+	  Added the arity of the predicate under test to the test name.
+
+	  In Prolog/ppl_interface_generator_prolog_dat.m4 : now allow the
+	  interface code to be generated for get_bounding_box/3 for
+	  BD_Shape.
+
+2006-10-21 Saturday 13:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.45): Indentation fixed.  Redundant
+	  parentheses avoided.
+
+2006-10-21 Saturday 13:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.44): Fixed spelling error introduced with
+	  last commit.
+
+2006-10-21 Saturday 12:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.11),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.18),
+	  tests/ppl_interface_generator_predicate_check_extra_code (1.10),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.16): In
+	  ...prolog_dat.m4, moved the delete predicate schema first This is
+	  a work-around to a problem in generating a list of predicates in
+	  m4.
+
+	  In the Prolog/tests m4 files, a number of bugs fixed and added a
+	  test for the relation_with predicates.
+
+2006-10-21 Saturday 10:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.43): Corrected error indicated in the
+	  previous commit for tests/Grid/relations.cc.
+
+2006-10-21 Saturday 10:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/relations2.cc (1.14): Test 20 shows a bug in the code
+	  for PPL::Grid::relation_with(const Congruence& cg)
+
+2006-10-21 Saturday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations2.cc (altnum.1): file relations2.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: boundedaffineimage1.cc (1.5),
+	  generalizedaffineimage3.cc (1.6), generalizedaffinepreimage2.cc
+	  (1.6): Several wicked whiches replaced by thats.
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (altnum.1): file
+	  generalizedaffineimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (octagons.1):
+	  file generalizedaffineimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc (altnum.1):
+	  file generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-19 Thursday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc (octagons.1):
+	  file generalizedaffinepreimage2.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-10-18 Wednesday 17:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.17),
+	  ppl_interface_generator_predicate_check_extra_code (1.9): Further
+	  additions and reorganisation of test data.  Added tests for
+	  get_ at GET_REPRESENT@ and get_minimized_ at GET_REPRESENT@ predicates.
+
+2006-10-18 Wednesday 11:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.8),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.16),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.8): Improved organisation of test data. Use "alt_replacement"
+	  to get an alternative build representation.  Added test data 3
+	  for some tests.  Other minor improvements.
+
+2006-10-17 Tuesday 20:56  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.36), MIP_Problem.templates.hh (1.9): Be
+	  more verbose when throwing exceptions.  Indentation fixed.
+
+2006-10-17 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (altnum.1): file MIP_Problem.cc was added on
+	  branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-17 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (altnum.1): file
+	  MIP_Problem.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-17 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (octagons.1): file
+	  MIP_Problem.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-10-17 Tuesday 15:37  quartieri
+
+	* tests/Octagonal_Shape/: boundedaffineimage1.cc (1.4),
+	  generalizedaffineimage3.cc (1.5), generalizedaffinepreimage2.cc
+	  (1.5): Improved some comments.
+
+2006-10-17 Tuesday 14:05  quartieri
+
+	* tests/Octagonal_Shape/: boundedaffineimage1.cc (1.3),
+	  generalizedaffineimage3.cc (1.4), generalizedaffinepreimage2.cc
+	  (1.4): Corrected some inaccurate comments.
+
+2006-10-17 Tuesday 11:26  Elena Mazzi
+
+	* tests/Octagonal_Shape/: affineimage1.cc (1.2), affinepreimage1.cc
+	  (1.2), bhmz05widening1.cc (1.2), boundedaffineimage1.cc (1.2),
+	  cc76extrapolation1.cc (1.2), cc76narrowing1.cc (1.2),
+	  disjoint1.cc (1.4), generalizedaffineimage3.cc (1.3),
+	  generalizedaffinepreimage2.cc (1.3),
+	  generalizedaffinepreimage3.cc (1.2), intersection1.cc (1.2),
+	  limitedbhmz05extrapolation1.cc (1.2),
+	  limitedcc76extrapolation1.cc (1.2), octdifference1.cc (1.2),
+	  octhull1.cc (1.2), relatwithcons2.cc (1.2), relatwithgen1.cc
+	  (1.2), removespacedims1.cc (1.2), timeelapse1.cc (1.2): Fixed
+	  lots of spelling mistakes in many tests.
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (altnum.1): file
+	  affineimage1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (octagons.1): file
+	  affineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (altnum.1): file
+	  affinepreimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (octagons.1): file
+	  affinepreimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (altnum.1): file
+	  bhmz05widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (octagons.1): file
+	  bhmz05widening1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (altnum.1): file
+	  cc76extrapolation1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (octagons.1): file
+	  cc76extrapolation1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (altnum.1): file
+	  cc76narrowing1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (octagons.1): file
+	  cc76narrowing1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc (altnum.1):
+	  file generalizedaffinepreimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc (octagons.1):
+	  file generalizedaffinepreimage3.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (altnum.1): file
+	  intersection1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (octagons.1): file
+	  intersection1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (altnum.1):
+	  file limitedbhmz05extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
+	  (octagons.1): file limitedbhmz05extrapolation1.cc was added on
+	  branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc (altnum.1):
+	  file limitedcc76extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc (octagons.1):
+	  file limitedcc76extrapolation1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (altnum.1): file
+	  octdifference1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (octagons.1): file
+	  octdifference1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (altnum.1): file octhull1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (octagons.1): file octhull1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (altnum.1): file
+	  relatwithgen1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (octagons.1): file
+	  relatwithgen1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (altnum.1): file
+	  removespacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (octagons.1): file
+	  removespacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (altnum.1): file
+	  timeelapse1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-10-17 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (octagons.1): file
+	  timeelapse1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 10:52  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (1.28): Corrected a bug in
+	  strong_reduction_assign().
+
+2006-10-17 Tuesday 10:52  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.39): Corrected a bug in
+	  shortest_path_reduction_assign().
+
+2006-10-17 Tuesday 10:40  Elena Mazzi
+
+	* tests/Octagonal_Shape/minconstraints1.cc (1.2): Test 3 shows a
+	  bug in minimized_constraints() when the Octagonal Shape is
+	  zero-dimensional and universe.
+
+2006-10-17 Tuesday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (altnum.1): file
+	  minconstraints1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-17 Tuesday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (octagons.1): file
+	  minconstraints1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-17 Tuesday 10:38  Elena Mazzi
+
+	* tests/BD_Shape/minconstraints1.cc (1.9): Test 2 shows a bug in
+	  minimized_constraints() when the BD_Shape is zero-dimensional and
+	  universe.
+
+2006-10-17 Tuesday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/minconstraints1.cc (altnum.1): file
+	  minconstraints1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Elena Mazzi
+
+	* tests/BD_Shape/: addconstraints1.cc (1.16), affineimage1.cc
+	  (1.16), affinepreimage1.cc (1.17), bdsdifference1.cc (1.12),
+	  bdshull1.cc (1.13), bhmz05widening1.cc (1.12),
+	  boundedaffineimage1.cc (1.2), cc76extrapolation1.cc (1.16),
+	  cc76narrowing1.cc (1.16), disjoint1.cc (1.3),
+	  generalizedaffineimage2.cc (1.18), generalizedaffinepreimage3.cc
+	  (1.3), intersection1.cc (1.16), limitedbhmz05extrapolation1.cc
+	  (1.11), limitedcc76extrapolation1.cc (1.12), relations2.cc
+	  (1.19), relations3.cc (1.16), removespacedims1.cc (1.17),
+	  timeelapse1.cc (1.16): Fixed lots of spelling mistakes in many
+	  tests.
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference1.cc (altnum.1): file
+	  bdsdifference1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdshull1.cc (altnum.1): file bdshull1.cc was added
+	  on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening1.cc (altnum.1): file
+	  bhmz05widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/boundedaffineimage1.cc (octagons.1): file
+	  boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage3.cc (altnum.1): file
+	  generalizedaffinepreimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage3.cc (octagons.1): file
+	  generalizedaffinepreimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (altnum.1): file
+	  limitedbhmz05extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (altnum.1): file
+	  limitedcc76extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-10-17 Tuesday 09:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.15),
+	  ppl_interface_generator_predicate_check_extra_code (1.7),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.15): Error in
+	  the swap code corrected.
+
+	  Tests for space_dimension and affine_dimension added.
+
+	  Now, for check_noisy, a list of all successful tests is output.
+	  For check_all and check_noisy, a list of all failed tests is
+	  output.  For check_noisy, the constraint and generator (or
+	  similar) systems of the failing object are output.
+
+2006-10-16 Monday 15:10  quartieri
+
+	* src/Octagonal_Shape.defs.hh (1.12),
+	  src/Octagonal_Shape.inlines.hh (1.10),
+	  src/Octagonal_Shape.templates.hh (1.27),
+	  tests/Octagonal_Shape/Makefile.am (1.7),
+	  tests/Octagonal_Shape/boundedaffineimage1.cc (1.1): Defined the
+	  method	       Octagonal_Shape<T>::bounded_affine_image()
+	  and added some tests on it.
+
+2006-10-16 Monday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (altnum.1): file
+	  Octagonal_Shape.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-10-16 Monday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.200): The entry for LP_Problem rewritten so as to
+	  introduce the generalization to MIP_Problem.
+
+2006-10-16 Monday 15:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.199): We no longer have class LP_Problem: the TODO items
+	  now refer to MIP_Problem.
+
+2006-10-16 Monday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.37), LP_Problem.defs.hh (1.27),
+	  LP_Problem.inlines.hh (1.12), LP_Problem.templates.hh (1.2),
+	  LP_Problem.types.hh (1.6), Makefile.am (1.162): No longer build
+	  LP_Problem; corresponding source files removed.
+
+2006-10-16 Monday 14:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.243), tests/Makefile.am (1.259): Do perform tests
+	  for class MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/MIP_Problem/: .cvsignore (1.1), Makefile.am (1.1),
+	  ascii_dump_load1.cc (1.1), exceptions1.cc (1.1), mipproblem1.cc
+	  (1.1): Put under CVS control.
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/.cvsignore (octagons.1): file .cvsignore was
+	  added on branch octagons on 2006-11-18 20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (altnum.1): file Makefile.am was
+	  added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/Makefile.am (octagons.1): file Makefile.am was
+	  added on branch octagons on 2006-11-18 20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/ascii_dump_load1.cc (altnum.1): file
+	  ascii_dump_load1.cc was added on branch altnum on 2006-10-29
+	  19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/ascii_dump_load1.cc (octagons.1): file
+	  ascii_dump_load1.cc was added on branch octagons on 2006-11-18
+	  20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (altnum.1): file exceptions1.cc
+	  was added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/exceptions1.cc (octagons.1): file
+	  exceptions1.cc was added on branch octagons on 2006-11-18
+	  20:36:58 +0000
+
+2006-10-16 Monday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/MIP_Problem/mipproblem1.cc (altnum.1): file mipproblem1.cc
+	  was added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-10-16 Monday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.65): Correct the name of a
+	  constructor for MIP_Problem.
+
+2006-10-16 Monday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c_version.h.in (1.3),
+	  ppl_interface_generator_c_cc_preamble (1.4),
+	  ppl_interface_generator_c_h_preamble (1.5): Interface class
+	  MIP_Problem, not LP_Problem.	Constructor
+	  new_MIP_Problem_from_dimension() renamed as
+	  new_MIP_Problem_from_space_dimension() for consistency.  Started
+	  reorganizing the documentation of the C interface.
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (altnum.1): file
+	  ppl_c_version.h.in was added on branch altnum on 2006-10-29
+	  19:26:58 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (octagons.1): file
+	  ppl_c_version.h.in was added on branch octagons on 2006-11-18
+	  20:36:44 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble (altnum.1):
+	  file ppl_interface_generator_c_cc_preamble was added on branch
+	  altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (altnum.1):
+	  file ppl_interface_generator_c_h_preamble was added on branch
+	  altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-16 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (octagons.1):
+	  file ppl_interface_generator_c_h_preamble was added on branch
+	  octagons on 2006-11-18 20:36:44 +0000
+
+2006-10-16 Monday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (altnum.1): file
+	  pl_grid_check.pl was added on branch altnum on 2006-10-29
+	  19:27:09 +0000
+
+2006-10-16 Monday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_grid_check.pl (octagons.1): file
+	  pl_grid_check.pl was added on branch octagons on 2006-11-18
+	  20:36:49 +0000
+
+2006-10-16 Monday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.157),
+	  ppl_interface_generator_prolog_dat.m4 (1.10),
+	  ppl_interface_generator_prolog_icc_preamble (1.12),
+	  Ciao/ciao_pl_check.pl (1.24), XSB/xsb_pl_check.P (1.28),
+	  tests/pl_check.pl (1.38), tests/pl_grid_check.pl (1.3): Interface
+	  class MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (altnum.1): file ppl_interface_generator_prolog_icc_preamble was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-16 Monday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/README (1.3): Minor improvements and
+	  corrections to links.
+
+2006-10-16 Monday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/README (altnum.1): file README was added
+	  on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-16 Monday 14:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.78), devref.doxyconf-latex.in
+	  (1.17): Generate documentation of MIP_Problem, not LP_Problem.
+
+2006-10-16 Monday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-latex.in (altnum.1): file
+	  devref.doxyconf-latex.in was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-10-16 Monday 14:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.21): Do silence an annoying compiler
+	  warning.
+
+2006-10-16 Monday 14:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.templates.hh (1.4), Polyhedron_nonpublic.cc
+	  (1.68): Use MIP_Problem instead of LP_Problem.
+
+2006-10-16 Monday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (altnum.1): file
+	  Polyhedron.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-16 Monday 14:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.134): Removed useless inclusion.
+
+2006-10-16 Monday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.38): Corrected a bug in
+	  affine_dimension().  Do use class MIP_Problem instead of
+	  LP_Problem.
+
+2006-10-16 Monday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.26): Correct a bug in
+	  affine_dimension().  Do use class MIP_Problem instead of
+	  LP_Problem.
+
+2006-10-16 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (altnum.1): file
+	  affinedimension1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-10-16 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (octagons.1): file
+	  affinedimension1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-10-16 Monday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/affinedimension1.cc (1.10),
+	  Octagonal_Shape/affinedimension1.cc (1.2): A bug in
+	  affine_dimension() is affecting both BD_Shape and
+	  Octagonal_Shape.  The bug causes an assertion to be violated when
+	  the shape is zero-dimensional and universe.
+
+2006-10-16 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinedimension1.cc (altnum.1): file
+	  affinedimension1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-10-16 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.7): Invocations of Coefficient
+	  constructors fixed.
+
+2006-10-16 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (altnum.1): file ppl_ocaml.cc was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-16 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (octagons.1): file ppl_ocaml.cc was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-16 Monday 09:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/BD_Shape/affinedimension1.cc (1.9): Test 11 shows a bug in
+	  affine_dimension() when the BD_Shape object is constructed from
+	  an empty constraint system.
+
+2006-10-13 Friday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.14),
+	  ppl_interface_generator_predicate_check_extra_code (1.6),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.14): Added code
+	  for producing noisy output when tests fail.
+
+2006-10-13 Friday 11:56  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.51), boundedaffineimage1.cc
+	  (1.1): Added new tests on the method
+	  BD_Shape::bounded_affine_image().
+
+2006-10-13 Friday 11:53  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.82), BD_Shape.templates.hh (1.37):
+	  Defined the new method: BD_Shape<T>::bounded_affine_image(var,
+	  lb_expr, ub_expr, den).
+
+2006-10-13 Friday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.13): Cut_and_paste error fixed.
+
+2006-10-13 Friday 09:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.12),
+	  ppl_interface_generator_predicate_check_extra_code (1.5): Added
+	  tests and test data for strict constraints and closure points for
+	  NNC polyhedra.  Extended test for building a bounding/covering
+	  box.
+
+2006-10-12 Thursday 22:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.11),
+	  ppl_interface_generator_predicate_check_extra_code (1.4),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.13): More
+	  improvements to the test framework and added generic tests for
+	  new_ at CLASS@_from_ at BOX@ and the swap procedure.
+
+2006-10-11 Wednesday 18:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.10),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.12): Added some
+	  code for future use and development of the test code...
+
+2006-10-11 Wednesday 16:38  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.35): Removed a spurious line to allow
+	  compiling if the heuristic is disabled.
+
+2006-10-11 Wednesday 14:13  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.36), expected_int16 (1.9),
+	  expected_int16_a (1.9), expected_int32 (1.10), expected_int32_a
+	  (1.10), expected_int64 (1.10), expected_int64_a (1.10),
+	  expected_int8 (1.9), expected_int8_a (1.8), expected_mpz (1.11),
+	  expected_mpz_a (1.11): Regenerated all the expected_* reflecting
+	  the new changes in Makefile.am.
+
+2006-10-11 Wednesday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.18): OCaml subdirectory enabled.
+
+2006-10-10 Tuesday 19:32  Andrea Cimino
+
+	* demos/ppl_lpsol/Makefile.am (1.35): Keep problems sorted.
+
+2006-10-10 Tuesday 19:30  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.34), examples/ex11.mps (1.3),
+	  examples/ex12.mps (1.1): Renamed ex11.mps as ex12.mps and
+	  restored the old ex11.mps.  Modified Makefile.am to skip ex12.mps
+	  checking.
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex11.mps (altnum.1): file ex11.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex11.mps (octagons.1): file ex11.mps was
+	  added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex12.mps (altnum.1): file ex12.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex12.mps (octagons.1): file ex12.mps was
+	  added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ex12.mps (simplex.1): file ex12.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 19:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/congruence1.cc (1.15),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.11): No longer rely on an operator recently removed.
+
+2006-10-10 Tuesday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruence1.cc (altnum.1): file congruence1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-10 Tuesday 19:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.16), Congruence.inlines.hh (1.13):
+	  Removed operator building a Congruence object from a Coefficient
+	  and a Linear_Expression (in that order) as it was clashing with a
+	  template member of class Checked_Number.
+
+2006-10-10 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh (altnum.1): file Congruence.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-10 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.inlines.hh (altnum.1): file Congruence.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-10 Tuesday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.defs.hh (1.33): Removed redundant
+	  declarations (with repeated documentation).
+
+2006-10-10 Tuesday 18:59  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.64): Typo fixed.
+
+2006-10-10 Tuesday 18:54  Andrea Cimino
+
+	* demos/ppl_lpsol/examples/ex11.mps (1.2): Modified for testing
+	  purposes.
+
+2006-10-10 Tuesday 17:25  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.33), expected_int16 (1.8),
+	  expected_int16_a (1.8), expected_int32 (1.9), expected_int32_a
+	  (1.9), expected_int64 (1.9), expected_int64_a (1.9),
+	  expected_int8 (1.8), expected_int8_a (1.7), expected_mpz (1.10),
+	  expected_mpz_a (1.10), examples/README (1.2), examples/egout.mps
+	  (1.1), examples/ex11.mps (1.1), examples/lseu.mps (1.1),
+	  examples/markshare1.mps (1.1), examples/markshare2.mps (1.1),
+	  examples/mas74.mps (1.1), examples/mas76.mps (1.1),
+	  examples/modglob.mps (1.1), examples/noswot.mps (1.1),
+	  examples/opt1217.mps (1.1), examples/p0033.mps (1.1),
+	  examples/pk1.mps (1.1), examples/rout.mps (1.1): Added new test
+	  for ppl_lpsol: now ppl_lsol checks satisfiability and optimality
+	  of some MIP Problems. Added other .mps files to the testsuite.
+	  README and obtained_* updated.
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/egout.mps (altnum.1): file egout.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/egout.mps (octagons.1): file egout.mps
+	  was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/egout.mps (simplex.1): file egout.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/lseu.mps (altnum.1): file lseu.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/lseu.mps (octagons.1): file lseu.mps was
+	  added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/lseu.mps (simplex.1): file lseu.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare1.mps (altnum.1): file
+	  markshare1.mps was added on branch altnum on 2006-10-29 19:26:55
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare1.mps (octagons.1): file
+	  markshare1.mps was added on branch octagons on 2006-11-18
+	  20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare1.mps (simplex.1): file
+	  markshare1.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare2.mps (altnum.1): file
+	  markshare2.mps was added on branch altnum on 2006-10-29 19:26:55
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare2.mps (octagons.1): file
+	  markshare2.mps was added on branch octagons on 2006-11-18
+	  20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/markshare2.mps (simplex.1): file
+	  markshare2.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas74.mps (altnum.1): file mas74.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas74.mps (octagons.1): file mas74.mps
+	  was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas74.mps (simplex.1): file mas74.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas76.mps (altnum.1): file mas76.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas76.mps (octagons.1): file mas76.mps
+	  was added on branch octagons on 2006-11-18 20:36:42 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mas76.mps (simplex.1): file mas76.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/modglob.mps (altnum.1): file modglob.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/modglob.mps (octagons.1): file
+	  modglob.mps was added on branch octagons on 2006-11-18 20:36:42
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/modglob.mps (simplex.1): file
+	  modglob.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/noswot.mps (altnum.1): file noswot.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/noswot.mps (octagons.1): file noswot.mps
+	  was added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/noswot.mps (simplex.1): file noswot.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/opt1217.mps (altnum.1): file opt1217.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/opt1217.mps (octagons.1): file
+	  opt1217.mps was added on branch octagons on 2006-11-18 20:36:43
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/opt1217.mps (simplex.1): file
+	  opt1217.mps was added on branch simplex on 2008-01-07 11:15:26
+	  +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/p0033.mps (altnum.1): file p0033.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/p0033.mps (octagons.1): file p0033.mps
+	  was added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/p0033.mps (simplex.1): file p0033.mps
+	  was added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/pk1.mps (altnum.1): file pk1.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/pk1.mps (octagons.1): file pk1.mps was
+	  added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/pk1.mps (simplex.1): file pk1.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/rout.mps (altnum.1): file rout.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/rout.mps (octagons.1): file rout.mps was
+	  added on branch octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-10 Tuesday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/rout.mps (simplex.1): file rout.mps was
+	  added on branch simplex on 2008-01-07 11:15:26 +0000
+
+2006-10-10 Tuesday 14:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.9),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.11): Simplified
+	  the testing framework.
+
+2006-10-10 Tuesday 14:01  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.7): Use the method empty()
+	  given by the STL instead of checking for a zero size.
+
+2006-10-10 Tuesday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (altnum.1): file
+	  variablesset1.cc was added on branch altnum on 2006-10-29
+	  19:27:34 +0000
+
+2006-10-10 Tuesday 12:46  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.6): Code cleaned. Added a
+	  FIXME concerning the operator==.
+
+2006-10-10 Tuesday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	*
+	  interfaces/Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.10): Avoid generating useless tests.
+
+2006-10-10 Tuesday 09:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_systems.m4
+	  (1.8), tests/ppl_interface_generator_predicate_check_pl.m4 (1.9):
+	  Comments and formatting improved.
+
+2006-10-10 Tuesday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (altnum.1): file ppl_interface_generator_prolog_systems.m4 was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-10 Tuesday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (octagons.1): file ppl_interface_generator_prolog_systems.m4 was
+	  added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-10 Tuesday 09:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.47), yap_cfli.cc (1.3):
+	  Distribute yap_cfli.hh.  Removed the obsolete yap_cfli.cc.
+
+2006-10-10 Tuesday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.44): Distribute also
+	  xsb_cfli.hh.
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.64),
+	  ppl_interface_generator_swiprolog_cc.m4 (1.6), swi_cfli.cc (1.3),
+	  swi_cfli.h (1.3), swi_cfli.hh (1.1), swi_cfli.ic (1.3):
+	  Reorganized the SWI Prolog Common Foreign Language Interface.
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (altnum.1): file ppl_interface_generator_swiprolog_cc.m4 was
+	  added on branch altnum on 2006-10-29 19:27:04 +0000
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (octagons.1): file ppl_interface_generator_swiprolog_cc.m4 was
+	  added on branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (altnum.1): file swi_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:04 +0000
+
+2006-10-10 Tuesday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/swi_cfli.hh (octagons.1): file swi_cfli.hh
+	  was added on branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-09 Monday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.58): Copy-and-paste mistake
+	  fixed.
+
+2006-10-09 Monday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/membytes1.cc (1.13): test01() is expected to
+	  result in underflow with 8-bit coefficients also with assertions
+	  disabled.
+
+2006-10-09 Monday 16:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.11),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.8),
+	  Prolog/tests/ppl_interface_generator_predicate_check_extra_code
+	  (1.3), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.8): [no log message]
+
+2006-10-09 Monday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (altnum.1): file
+	  ppl_interface_generator_common.m4 was added on branch altnum on
+	  2006-10-29 19:26:57 +0000
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.33): YAP subdirectory
+	  re-enabled.
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.5):
+	  Copy-and-paste mistake fixed.
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (altnum.1): file ppl_interface_generator_xsb_cc.m4 was added on
+	  branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-09 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
+	  (octagons.1): file ppl_interface_generator_xsb_cc.m4 was added on
+	  branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-09 Monday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (1.5): Work around a bug in GCC
+	  3.3.3.
+
+2006-10-09 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (1.1): New implementation of
+	  the XSB Prolog Common Foreign Language Interface.
+
+2006-10-09 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (altnum.1): file xsb_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-09 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_cfli.hh (octagons.1): file xsb_cfli.hh
+	  was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-09 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.2):
+	  Thresholds for test12() updated to reflect the precision
+	  attainable on the Alpha processor.
+
+2006-10-09 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (altnum.1):
+	  file generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-10-09 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc (octagons.1):
+	  file generalizedaffinepreimage1.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-10-09 Monday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/disjoint1.cc (1.3): Spurious ASCII-dumps
+	  removed.
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (altnum.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+	  added on branch altnum on 2006-10-29 19:27:03 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (octagons.1): file ppl_interface_generator_sicstus_sd_cc.m4 was
+	  added on branch octagons on 2006-11-18 20:36:47 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (altnum.1): file ppl_interface_generator_yap_cc.m4 was added on
+	  branch altnum on 2006-10-29 19:27:06 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (octagons.1): file ppl_interface_generator_yap_cc.m4 was added on
+	  branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.hh (altnum.1): file yap_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:06 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.hh (octagons.1): file yap_cfli.hh
+	  was added on branch octagons on 2006-11-18 20:36:49 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.12), ppl_interface_generator_prolog_icc_preamble (1.10),
+	  Ciao/Makefile.am (1.58), Ciao/ciao_cfli.hh (1.1),
+	  Ciao/ppl_ciao.cc (1.48), GNU/Makefile.am (1.57),
+	  GNU/gprolog_cfli.hh (1.1), GNU/ppl_gprolog_sd.cc (1.41),
+	  SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.4),
+	  SWI/ppl_interface_generator_swiprolog_cc.m4 (1.5),
+	  XSB/ppl_interface_generator_xsb_cc.m4 (1.4),
+	  YAP/ppl_interface_generator_yap_cc.m4 (1.4), YAP/yap_cfli.h
+	  (1.3), YAP/yap_cfli.hh (1.1), YAP/yap_cfli.ic (1.3): Prolog
+	  interfaces cleaned up.
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (altnum.1): file ciao_cfli.hh
+	  was added on branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_cfli.hh (octagons.1): file
+	  ciao_cfli.hh was added on branch octagons on 2006-11-18 20:36:46
+	  +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (altnum.1): file
+	  gprolog_cfli.hh was added on branch altnum on 2006-10-29 19:27:02
+	  +0000
+
+2006-10-07 Saturday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/gprolog_cfli.hh (octagons.1): file
+	  gprolog_cfli.hh was added on branch octagons on 2006-11-18
+	  20:36:47 +0000
+
+2006-10-07 Saturday 18:18  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.63): Useless code removed.
+
+2006-10-07 Saturday 18:16  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.62): maybe_check_results() fixed
+	  when `no_optimization' flag is enabled.
+
+2006-10-07 Saturday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.27): Revised a couple of comments.
+
+2006-10-07 Saturday 16:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (altnum.1): file MIP_Problem.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-10-07 Saturday 15:47  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.34), MIP_Problem.defs.hh (1.26): Defined
+	  and implemented the method `is_saturated()'.
+
+2006-10-07 Saturday 15:15  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.61),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.3),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.4),
+	  src/MIP_Problem.cc (1.33), src/MIP_Problem.defs.hh (1.25),
+	  src/MIP_Problem.templates.hh (1.8), src/Polyhedron_public.cc
+	  (1.84): ppl_lpsol: restored the old threshold.  MIP_Problem:
+	  added the new constructor
+
+	  template <typename In>   MIP_Problem(dimension_type dim,
+	       In first, In last,		const Variables_Set&
+	  int_vars,		  const Linear_Expression& obj =
+	  Linear_Expression::zero(),		   Optimization_Mode mode =
+	  MAXIMIZATION)
+
+	  Renamed `set_integer_dimensions()' to
+	  `add_to_integer_space_dimensions'.  Check, if a variables_set is
+	  passed to a constructor, if the set does not exceed the space
+	  dimension of the MIP Problem.
+
+2006-10-07 Saturday 13:00  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.60): The -r option is now
+	  compatible with -e. Throw an error if we want to solve a MIP with
+	  -e. maybe_check_results() cleaned.  Modified the default
+	  threshold between GLPK and ppl_lpsol, this to prepare us for the
+	  next commit that will change the testsuite.
+
+2006-10-06 Friday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.59): Spurious blanks removed.
+
+2006-10-06 Friday 20:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.58): At least version 0.10 is
+	  required for the MIP solving functionality.
+
+2006-10-06 Friday 20:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.57): This is no longer a toy.
+
+2006-10-06 Friday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.56): Fixed some comments and code
+	  formatting.
+
+2006-10-06 Friday 19:37  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.55): Use "variables" instead of
+	  "Variables" when printing verbose output.
+
+2006-10-06 Friday 19:30  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.54): Some changes: -r is
+	  incompatible with -e.  If a MIP problem is going to be solved,
+	  print, if requested, the variables constrained to be integer.
+
+2006-10-06 Friday 14:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (1.10): Another
+	  change to name of a macro.
+
+2006-10-06 Friday 14:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.9),
+	  C/ppl_interface_generator_c_cc.m4 (1.5),
+	  C/ppl_interface_generator_c_h.m4 (1.9),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.7),
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4 (1.7):
+	  Complete improvements to ppl_interface_generator_common.m4.  The
+	  top level macro used by the main generating files now m4_all_code
+	  instead of m4_all_classes_code.  The calls therefore adjusted
+	  appropriately.
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (altnum.1): file
+	  ppl_interface_generator_c_cc.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (octagons.1): file
+	  ppl_interface_generator_c_cc.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (altnum.1): file
+	  ppl_interface_generator_c_h.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (octagons.1): file
+	  ppl_interface_generator_c_h.m4 was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-10-06 Friday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (altnum.1): file ppl_interface_generator_prolog_icc.m4 was added
+	  on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-06 Friday 13:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.8),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.7): Revised
+	  C/ppl_interface_generator_c_cc_code.m4 for the changes to the
+	  pattern names.
+
+	  General improvements to ppl_interface_generator_common.m4
+	  including making some macro names more meaningful and improving
+	  the comments.
+
+2006-10-06 Friday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (altnum.1):
+	  file ppl_interface_generator_c_cc_code.m4 was added on branch
+	  altnum on 2006-10-29 19:26:58 +0000
+
+2006-10-06 Friday 10:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.7),
+	  C/ppl_interface_generator_c_h.m4 (1.8),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.9),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.4),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.6): Many
+	  improvements to the m4 code and comments in
+	  ppl_interface_generator_common.m4
+
+	  Names of macros improved and hence some changes needed in other
+	  interface_generator files that use these names.
+
+	  Unwanted text removed from C/ppl_interface_generator_c_h.m4
+
+	  Bug fixed in ppl_interface_generator_common.m4.
+
+2006-10-05 Thursday 15:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.7),
+	  C/ppl_interface_generator_c_cc.m4 (1.4),
+	  C/ppl_interface_generator_c_dat.m4 (1.7),
+	  C/ppl_interface_generator_c_h.m4 (1.7),
+	  C/ppl_interface_generator_c_h_code.m4 (1.5),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.8),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.11),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.5),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.7), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.6): Patterns "represent" and "describe" replaced by 4 patterns
+	  "build_represent", "get_represent", "add_represent" and
+	  "relation_represent", to more accurately relate to the sets of
+	  methods and predicates for which they apply.
+
+	  Before including the preamble, we first change the quote
+	  characters ` and ' using m4_changequote/2. This avoids m4 eating
+	  the quotes in the preamble text.
+
+2006-10-05 Thursday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (altnum.1): file
+	  ppl_interface_generator_c_h_code.m4 was added on branch altnum on
+	  2006-10-29 19:26:58 +0000
+
+2006-10-05 Thursday 15:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.242): Adjusted to support the building of
+	  separate documentations for the library and its foreign language
+	  interfaces.
+
+2006-10-05 Thursday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: Makefile.am (1.47), devref-c-interface.doxyconf-html.in
+	  (1.1), devref-c-interface.doxyconf-latex.in (1.1),
+	  devref-prolog-interface.doxyconf-html.in (1.1),
+	  devref-prolog-interface.doxyconf-latex.in (1.1),
+	  devref.doxyconf-html.in (1.77), devref.doxyconf-latex.in (1.16),
+	  user-c-interface.doxyconf-html.in (1.1),
+	  user-c-interface.doxyconf-latex.in (1.1),
+	  user-prolog-interface.doxyconf-html.in (1.1),
+	  user-prolog-interface.doxyconf-latex.in (1.1),
+	  user.doxyconf-html.in (1.38), user.doxyconf-latex.in (1.9): The
+	  documentation of foreign languages interfaces is now separated
+	  from the documentation of the main library. The actual
+	  documentation will have to be changed accordingly to reflect this
+	  new design choice.
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-html.in (altnum.1): file
+	  devref-c-interface.doxyconf-html.in was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-html.in (octagons.1): file
+	  devref-c-interface.doxyconf-html.in was added on branch octagons
+	  on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-latex.in (altnum.1): file
+	  devref-c-interface.doxyconf-latex.in was added on branch altnum
+	  on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-c-interface.doxyconf-latex.in (octagons.1): file
+	  devref-c-interface.doxyconf-latex.in was added on branch octagons
+	  on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-html.in (altnum.1): file
+	  devref-prolog-interface.doxyconf-html.in was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-html.in (octagons.1): file
+	  devref-prolog-interface.doxyconf-html.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-latex.in (altnum.1): file
+	  devref-prolog-interface.doxyconf-latex.in was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-prolog-interface.doxyconf-latex.in (octagons.1): file
+	  devref-prolog-interface.doxyconf-latex.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-html.in (altnum.1): file
+	  user-c-interface.doxyconf-html.in was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-html.in (octagons.1): file
+	  user-c-interface.doxyconf-html.in was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-latex.in (altnum.1): file
+	  user-c-interface.doxyconf-latex.in was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-c-interface.doxyconf-latex.in (octagons.1): file
+	  user-c-interface.doxyconf-latex.in was added on branch octagons
+	  on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-html.in (altnum.1): file
+	  user-prolog-interface.doxyconf-html.in was added on branch altnum
+	  on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-html.in (octagons.1): file
+	  user-prolog-interface.doxyconf-html.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (altnum.1): file
+	  user-prolog-interface.doxyconf-latex.in was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-prolog-interface.doxyconf-latex.in (octagons.1): file
+	  user-prolog-interface.doxyconf-latex.in was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-10-05 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user.doxyconf-latex.in (altnum.1): file
+	  user.doxyconf-latex.in was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-10-05 Thursday 14:57  Elena Mazzi
+
+	* src/: BD_Shape.templates.hh (1.36), DB_Matrix.defs.hh (1.25),
+	  DB_Matrix.inlines.hh (1.28), DB_Matrix.templates.hh (1.3),
+	  DB_Row.defs.hh (1.20), DB_Row.inlines.hh (1.19),
+	  DB_Row.templates.hh (1.2): Added the definitions of methods
+	  `memory_size_type total_memory_in_bytes() const' and
+	  `memory_size_type external_memory_in_bytes() const' in the
+	  following classes: DB_Row, DB_Matrix, BD_Shape.
+
+2006-10-05 Thursday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (altnum.1): file
+	  DB_Matrix.templates.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-10-05 Thursday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh (altnum.1): file DB_Row.templates.hh was
+	  added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-10-05 Thursday 12:19  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.35), tests/BD_Shape/disjoint1.cc
+	  (1.2): Fixed the comment in the method
+	  BD_Shape<T>::is_disjoint_from().  Added new tests on this method.
+	  Replaced `system/s of bounded differences' with `bounded
+	  difference shape/s'.
+
+2006-10-05 Thursday 11:34  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.32), MIP_Problem.defs.hh (1.24):
+	  `recursion_depth' thrown away.
+
+2006-10-05 Thursday 11:14  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.31), MIP_Problem.defs.hh (1.23): Comments
+	  revised.  `recursion_depth' is an unsigned long.
+
+2006-10-05 Thursday 10:18  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.30), MIP_Problem.defs.hh (1.22),
+	  MIP_Problem.inlines.hh (1.12), MIP_Problem.templates.hh (1.7):
+	  The correctness of the solution found, if is involved a non-empty
+	  integer Variables_Set, is now proofed without having a special
+	  member in the class. Slightly modified is_mip_satisfiable(),
+	  solve_mip and choose_branching_variable() intefaces for that
+	  purpose.
+
+2006-10-05 Thursday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (altnum.1): file
+	  MIP_Problem.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-10-05 Thursday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (octagons.1): file
+	  MIP_Problem.inlines.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-10-05 Thursday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.68), GMP_Integer.defs.hh
+	  (1.23), GMP_Integer.inlines.hh (1.17): Added void
+	  rem_assign(GMP_Integer&, const GMP_Integer&, const GMP_Integer&).
+	  Added void rem_assign(Checked_Number<T, Policy>&, const
+	  Checked_Number<T, Policy>&, const Checked_Number<T, Policy>&).
+
+2006-10-04 Wednesday 23:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.6),
+	  ppl_interface_generator_common_dat.m4 (1.6),
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4
+	  (1.6), Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  (1.5): ppl_interface_generator_common.m4
+	  ppl_interface_generator_common_dat.m4: Redundant code removed,
+	  spelling in comment corrected.
+
+	  Prolog/tests/ppl_interface_generator_predicate_check_pl.m4
+	  Prolog/tests/ppl_interface_generator_predicate_check_code.m4:
+	  Extra predicate definition added to compensate for missing
+	  topology in generated test code.  A rather inelegant solution to
+	  a problem caused by some code requiring the topology "C_" or
+	  "NNC_" attached to "Polyhedron" and some not, depending on the
+	  initiating class.
+
+2006-10-04 Wednesday 21:24  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.29), MIP_Problem.defs.hh (1.21): Typos
+	  fixed. `recursion_depth' now is an unsigned long.
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am (1.43), partition1.cc (1.1):
+	  Proof-of-concept implementation of the generalization to grids of
+	  the partition algorithm in [Srivastava93].
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (altnum.1): file Makefile.am was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partition1.cc (altnum.1): file partition1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-04 Wednesday 20:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/partition1.cc (octagons.1): file partition1.cc was
+	  added on branch octagons on 2006-11-18 20:36:57 +0000
+
+2006-10-04 Wednesday 16:01  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.28), MIP_Problem.defs.hh (1.20),
+	  MIP_Problem.inlines.hh (1.11), MIP_Problem.templates.hh (1.6):
+	  Check in method OK() that the solution, if found, satisfies the
+	  Variables_Set that encodes all the Variables constrained to be
+	  integer.  Added a new member to the class for that purpose.
+
+2006-10-04 Wednesday 13:04  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.25),
+	  tests/Octagonal_Shape/disjoint1.cc (1.2): Improved the method
+	  is_disjoint_from() and added a new test on it.
+
+2006-10-03 Tuesday 20:02  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.27): Some missing parentheses added.
+
+2006-10-03 Tuesday 19:50  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.26), MIP_Problem.defs.hh (1.19): Fixed
+	  some typos.  Used more appropriate variable names.
+
+2006-10-03 Tuesday 19:24  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.25), MIP_Problem.defs.hh (1.18): Comments
+	  revised. Variable type and name changed.
+
+2006-10-03 Tuesday 17:33  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.24): Moved a couple of variable
+	  declarations in the right place.
+
+2006-10-03 Tuesday 17:29  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.23), MIP_Problem.defs.hh (1.17): Fixed a
+	  bug in solve_mip(): if MAXIMIZATION was requested, the `branch
+	  and bound' tree was cut too early, loosing optimal solutions.
+	  Slightly modified solve_mip() interface to allow to print some
+	  debugging information if requested.
+
+2006-10-03 Tuesday 16:16  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.135), BD_Shape.templates.hh (1.34):
+	  No longer inlined the following functions: -
+	  BD_Shape::affine_dimension(); -
+	  BD_Shape::forget_all_dbm_constraints(v); -
+	  BD_Shape::forget_binary_dbm_constraints(v).
+
+2006-10-03 Tuesday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/:
+	  ppl_interface_generator_predicate_check_code.m4 (1.5),
+	  ppl_interface_generator_predicate_check_extra_code (1.2),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.4): Some
+	  improvements.  Commented code in
+	  ppl_interface_generator_predicate_check_code.m4 shows a bug in
+	  the main m4 replacement code for friend classes.
+
+2006-10-03 Tuesday 15:35  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.33): The method
+	  BD_Shape::is_disjoint_from(y) is now implemented without using a
+	  copy of a BD_Shape.
+
+2006-10-03 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/discrete1.cc (altnum.1): file discrete1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-10-03 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/discrete1.cc (octagons.1): file
+	  discrete1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-10-03 Tuesday 14:25  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.9),
+	  src/Octagonal_Shape.templates.hh (1.24),
+	  tests/Octagonal_Shape/Makefile.am (1.6),
+	  tests/Octagonal_Shape/discrete1.cc (1.1): Defined the method
+	  is_discrete() and moved it from the file
+	  Octagonal_Shape.templates.hh to the file
+	  Octagonal_Shape.inlines.hh.  Added some tests about it.
+
+2006-10-03 Tuesday 14:02  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.134), BD_Shape.templates.hh (1.32):
+	  Moved the method BD_Shape::is_discrete() from file
+	  `BD_Shape.templates.hh' to `BD_Shape.inlines.hh'.
+
+2006-10-03 Tuesday 13:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.4): Bug
+	  in code generator for XSB corrected.
+
+2006-10-03 Tuesday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (altnum.1): file ppl_interface_generator_xsb_H.m4 was added on
+	  branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-03 Tuesday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (octagons.1): file ppl_interface_generator_xsb_H.m4 was added on
+	  branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-03 Tuesday 13:04  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.31), tests/BD_Shape/Makefile.am
+	  (1.50), tests/BD_Shape/discrete1.cc (1.1): Defined the method
+	  BD_Shape::is_discrete() and added some tests on this method.
+
+2006-10-03 Tuesday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/discrete1.cc (altnum.1): file discrete1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-10-03 Tuesday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/discrete1.cc (octagons.1): file discrete1.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-10-03 Tuesday 11:49  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.22): In a MIP_Problem, if we exit with
+	  status UNBOUNDED and we have found a feasible generator, store it
+	  in `last_generator'.
+
+2006-10-03 Tuesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: certificate1.cc (1.12), congruence1.cc (1.14),
+	  discrete1.cc (1.6): Awful syntax avoided.
+
+2006-10-03 Tuesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/certificate1.cc (altnum.1): file certificate1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-10-03 Tuesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/discrete1.cc (altnum.1): file discrete1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-10-03 Tuesday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.32), expected_int16 (1.7),
+	  expected_int16_a (1.7), expected_int32 (1.8), expected_int32_a
+	  (1.8), expected_int64 (1.8), expected_int64_a (1.8),
+	  expected_int8 (1.7), expected_int8_a (1.6), expected_mpz (1.9),
+	  expected_mpz_a (1.9): Do not lie anymore: write on the expected*
+	  files a faithful indication of the command being executed.
+
+2006-10-03 Tuesday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: Makefile.am (1.9),
+	  ppl_interface_generator_predicate_check_code.m4 (1.4),
+	  ppl_interface_generator_predicate_check_extra_code (1.1),
+	  ppl_interface_generator_predicate_check_pl.m4 (1.3): The extra
+	  test code moved to a separate "extra_code" file.  Before the
+	  m4_include for this file, the quote characters are changed to
+	  @<<@ and @>>@ and then restored back to the original ` and '
+	  after the include.  This allows the inclusion of quote characters
+	  in the Prolog code in the "extra_code" file.
+
+	  Makefile.am modified so that in the interfaces/Prolog/tests
+	  directory "make" creates the Prolog test program
+	  "ppl_predicate_check.pl".
+
+2006-10-03 Tuesday 00:20  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.21), MIP_Problem.defs.hh (1.16):
+	  Performance of the heuristic method improved: an equality
+	  constraint is an `active constraint' by definition.
+
+2006-10-02 Monday 21:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.37): Previous commit for
+	  this file reversed and test file restored.
+
+2006-10-02 Monday 21:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: pl_check.pl (1.36),
+	  ppl_interface_generator_predicate_check_code.m4 (1.3): Corrected
+	  a few typos.
+
+2006-10-02 Monday 19:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (1.6): Corrected an
+	  m4 macro call.
+
+2006-10-02 Monday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.20): Comments revised.
+
+2006-10-02 Monday 18:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: Makefile.am (1.17),
+	  ppl_interface_generator_common.m4 (1.5): Two more changes made
+	  for the change to the m4 builtins.
+
+2006-10-02 Monday 17:45  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.19), MIP_Problem.defs.hh (1.15): Added a
+	  new heuristic that selects a branching variable when a
+	  MIP_Problem feasibility has to be proofed.  Modified the
+	  prototype for `is_satisfied' to allow the checking of `active
+	  constraints'.  The new heuristic is turned on by default.
+
+2006-10-02 Monday 17:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4 (1.6),
+	  ppl_interface_generator_c_h.m4 (1.6): Fixed a couple of bugs
+	  where the m4 builtin had not been revised to m4_builtin.
+
+2006-10-02 Monday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.16): Skip the OCaml directory, for the
+	  time being.
+
+2006-10-02 Monday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.52), Polyhedron/dualhypercubes.cc (1.10):
+	  Test Polyhedron/dualhypercubes.cc fails on 64 bits checked
+	  integers when assertions are turned on.
+
+2006-10-02 Monday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/Makefile.am (1.26),
+	  C/ppl_interface_generator_c_h.m4 (1.5), Prolog/Makefile.am
+	  (1.32), Prolog/Ciao/Makefile.am (1.57), Prolog/GNU/Makefile.am
+	  (1.56), Prolog/SICStus/Makefile.am (1.70), Prolog/SWI/Makefile.am
+	  (1.63), Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.4),
+	  Prolog/XSB/Makefile.am (1.43), Prolog/YAP/Makefile.am (1.46):
+	  Corrections where some builtins for m4 were not changed as
+	  required.  The Makefile.am files now have m4 --prefix-builtin in
+	  the m4 commands.
+
+2006-10-02 Monday 16:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/:
+	  Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.2),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.2),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.2):
+	  Changed these interface_generator files for the test code to
+	  require the m4 command to include --prefix-builtin.
+
+2006-10-02 Monday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (altnum.1): file
+	  ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+	  branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-02 Monday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4
+	  (octagons.1): file
+	  ppl_interface_generator_ciao_predicate_check_pl.m4 was added on
+	  branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (altnum.1): file ppl_interface_generator_ciao_pl.m4 was added on
+	  branch altnum on 2006-10-29 19:27:01 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
+	  (octagons.1): file ppl_interface_generator_ciao_pl.m4 was added
+	  on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (altnum.1): file ppl_interface_generator_gprolog_pl.m4 was added
+	  on branch altnum on 2006-10-29 19:27:02 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (octagons.1): file ppl_interface_generator_gprolog_pl.m4 was
+	  added on branch octagons on 2006-11-18 20:36:47 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (altnum.1): file ppl_interface_generator_xsb_predicate_check_P.m4
+	  was added on branch altnum on 2006-10-29 19:27:05 +0000
+
+2006-10-02 Monday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (octagons.1): file
+	  ppl_interface_generator_xsb_predicate_check_P.m4 was added on
+	  branch octagons on 2006-11-18 20:36:48 +0000
+
+2006-10-02 Monday 16:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.4),
+	  ppl_interface_generator_common_dat.m4 (1.5),
+	  C/ppl_interface_generator_c_cc.m4 (1.3),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.5),
+	  C/ppl_interface_generator_c_dat.m4 (1.5),
+	  C/ppl_interface_generator_c_h.m4 (1.4),
+	  C/ppl_interface_generator_c_h_code.m4 (1.4),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.7),
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.10),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.4),
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.3),
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 (1.3),
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 (1.3),
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 (1.3),
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.3),
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.3),
+	  Prolog/XSB/ppl_interface_generator_xsb_predicate_check_P.m4
+	  (1.2), Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.3):
+	  Changed all the built-ins for the m4 code for generating the
+	  interfaces from builtin to m4_builtin.  Note that the built-in
+	  dnl is unchanged; instead, I have added define(`dnl', `m4_dnl')
+	  at the start of the main files.
+
+2006-10-02 Monday 14:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/:
+	  Ciao/ppl_interface_generator_ciao_predicate_check_pl.m4 (1.1),
+	  XSB/ppl_interface_generator_xsb_predicate_check_P.m4 (1.1),
+	  tests/pl_check.pl (1.35),
+	  tests/ppl_interface_generator_predicate_check_code.m4 (1.1),
+	  tests/ppl_interface_generator_predicate_check_pl.m4 (1.1):
+	  interface generator code for generating a test file for all
+	  predicates for  all the required classes.
+
+2006-10-02 Monday 14:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_systems.m4 (1.3): Comments
+	  corrected and allow for a default code that is needed for the
+	  tests.
+
+2006-10-02 Monday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.241): Generate the Grid interfaces by default.
+
+2006-10-02 Monday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am (1.15), OCaml/ppl_ocaml.cc (1.6),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.9): Fixed
+	  the generalized image predicated for Grid.
+
+2006-10-02 Monday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.6),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.8): Corrected the
+	  interfacing of Grid::generalized_affine_[pre]image*.
+
+2006-10-02 Monday 10:56  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.30): Improved the method:
+	  BD_Shape::is_disjoint_from(const BD_Shape& y).
+
+2006-10-02 Monday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.7), ppl_interface_generator_prolog_icc_preamble (1.9):
+	  term_to_relation_symbol() revised.
+
+2006-10-01 Sunday 22:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.8): Corrected order of arguments in
+	  ppl_new_LP_Problem_from_space_dimension/2.
+
+2006-10-01 Sunday 22:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.34): Define aux predicate
+	  clean_ppl_new_LP_Problem_from_space_dimension/2.
+
+2006-10-01 Sunday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc_code.m4
+	  (1.6), ppl_interface_generator_prolog_icc_preamble (1.7): Severa
+	  FIXMEs dealt with.
+
+2006-10-01 Sunday 20:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.23),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.5),
+	  ppl_interface_generator_prolog_icc_preamble (1.6): Most
+	  predicates now raise meaningful exceptions.
+
+2006-10-01 Sunday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.22),
+	  ppl_interface_generator_prolog_icc_preamble (1.5): Class
+	  PPL_integer_out_of_range revised.
+
+2006-10-01 Sunday 17:19  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.4): Test also
+	  `std::set_intersection' and `std::set_difference'.
+
+2006-10-01 Sunday 15:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4 (1.5),
+	  ppl_interface_generator_prolog_icc_preamble (1.4): LP_Problem
+	  interface updated.
+
+2006-10-01 Sunday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.21),
+	  ppl_interface_generator_prolog_icc_code.m4 (1.4),
+	  ppl_interface_generator_prolog_icc_preamble (1.3): Started
+	  improving the Prolog interface error reporting mechanisms.  Fixed
+	  several copy-and-paste mistakes in the support for grids.
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.5), ppl_ocaml.mli (1.4),
+	  test1.ml (1.4): Sample code to support building polyhedra from
+	  OCaml.
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.mli (altnum.1): file ppl_ocaml.mli was
+	  added on branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.mli (octagons.1): file ppl_ocaml.mli
+	  was added on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/test1.ml (altnum.1): file test1.ml was added on
+	  branch altnum on 2006-10-29 19:27:00 +0000
+
+2006-10-01 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/test1.ml (octagons.1): file test1.ml was added
+	  on branch octagons on 2006-11-18 20:36:46 +0000
+
+2006-10-01 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.4), ppl_ocaml.mli (1.3),
+	  test1.ml (1.3): build_Constraint_System() and
+	  build_Generator_System() rewritten.
+
+2006-09-30 Saturday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_ocaml.cc (1.3): Support the building of
+	  constraint and generator systems.
+
+2006-09-30 Saturday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_ocaml.cc (1.2), ppl_ocaml.mli (1.2),
+	  test1.ml (1.2): Support the building of constraints and
+	  generators.
+
+2006-09-30 Saturday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: Makefile.am (1.13), ppl_ocaml.cc (1.1),
+	  ppl_ocaml.mli (1.1), test1.ml (1.1): Initial steps for the OCaml
+	  interface.
+
+2006-09-30 Saturday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.4):
+	  Corrected trivial bug (missing commas) whereby the C interface
+	  code was not generated for several methods.
+
+2006-09-30 Saturday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (1.4): Minor
+	  improvements: methods not available for BDS are neither avaiable
+	  for Octagonal shapes.
+
+2006-09-30 Saturday 16:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.11), Octagonal_Shape.inlines.hh
+	  (1.8), Octagonal_Shape.templates.hh (1.23): Added methods
+	  shrink_bounding_box() and topological_closure_assign().
+
+2006-09-30 Saturday 16:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.29): Corrected a bug in
+	  shrink_bounding_box.
+
+2006-09-30 Saturday 15:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.4):
+	  BD_Shape now have the generalized (pre-) images methods.
+
+2006-09-30 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.240): Do not invoke AM_PROG_GCJ.
+
+2006-09-30 Saturday 13:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (1.3):
+	  Distribute the output functions in the corresponding group
+	  depending on the interfaced PPL entity.
+
+2006-09-30 Saturday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (1.3): Corrected
+	  simple bug in the generation of documentation grouping.
+
+2006-09-29 Friday 23:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4 (1.4),
+	  C/ppl_interface_generator_c_cc_code.m4 (1.3),
+	  C/ppl_interface_generator_c_dat.m4 (1.3),
+	  C/ppl_interface_generator_c_h_code.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (1.3),
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4 (1.3): Replaced
+	  pattern "is_ at STATE@ by "@HAS_PROPERTY@ and added replacement
+	  "contains_integer_point" for this pattern.  A comment corrected.
+
+2006-09-29 Friday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.239): Added the infrastructure required to enable
+	  the Java interface.
+
+2006-09-29 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.238): Added the infrastructure required to enable
+	  the OCaml interface.
+
+2006-09-29 Friday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/variablesset1.cc (1.3): Show how
+	  std::set_union() should be used.
+
+2006-09-29 Friday 18:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.101), containsintegerpoint1.cc
+	  (1.1): Added a test for Polyhedron::contains_integer_point().
+
+2006-09-29 Friday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-09-29 Friday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:37:00 +0000
+
+2006-09-29 Friday 18:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (1.3):
+	  Polyhedra_Powerset renamed as Pointset_Powerset.
+
+2006-09-29 Friday 16:01  Andrea Cimino
+
+	* tests/Polyhedron/variablesset1.cc (1.2): Fixed a typo.
+
+2006-09-29 Friday 16:00  Andrea Cimino
+
+	* tests/Polyhedron/: Makefile.am (1.100), variablesset1.cc (1.1):
+	  Added some tests for the Variables_Set class.  Remeber also to
+	  test set_union(), set_difference()...
+
+2006-09-29 Friday 14:19  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.22),
+	  tests/Octagonal_Shape/Makefile.am (1.5),
+	  tests/Octagonal_Shape/disjoint1.cc (1.1): Added the method
+	  bool Octagonal_Shape<T>::is_disjoint_from() and some tests about
+	  it.
+
+2006-09-29 Friday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: foldspacedims2.cc (1.13), membytes1.cc (1.12):
+	  Adjusted tests that no longer fail with 8-bit coefficients.
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.237), instchk.hh (1.6), interfaces/Makefile.am
+	  (1.14), interfaces/ppl_interface_generator_common.m4 (1.2),
+	  interfaces/ppl_interface_generator_common_dat.m4 (1.2),
+	  interfaces/ppl_interface_generator_copyright (1.2),
+	  interfaces/C/Makefile.am (1.25), interfaces/C/ppl_c.cc (1.158),
+	  interfaces/C/ppl_c_version.h.in (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc_code.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_cc_preamble (1.2),
+	  interfaces/C/ppl_interface_generator_c_dat.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_h.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_h_code.m4 (1.2),
+	  interfaces/C/ppl_interface_generator_c_h_preamble (1.2),
+	  interfaces/Prolog/Makefile.am (1.31),
+	  interfaces/Prolog/exceptions.hh (1.20),
+	  interfaces/Prolog/ppl_interface_generator_prolog_dat.m4 (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc.m4 (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (1.2),
+	  interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (1.2), interfaces/Prolog/ppl_prolog.icc (1.181),
+	  interfaces/Prolog/Ciao/Makefile.am (1.56),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.93),
+	  interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 (1.2),
+	  interfaces/Prolog/GNU/Makefile.am (1.55),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.62),
+	  interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (1.2), interfaces/Prolog/SICStus/Makefile.am (1.69),
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (1.2), interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.97),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.8),
+	  interfaces/Prolog/SWI/Makefile.am (1.62),
+	  interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (1.2), interfaces/Prolog/SWI/ppl_swiprolog.cc (1.127),
+	  interfaces/Prolog/SWI/swi_cfli.cc (1.2),
+	  interfaces/Prolog/SWI/swi_cfli.h (1.2),
+	  interfaces/Prolog/SWI/swi_cfli.ic (1.2),
+	  interfaces/Prolog/XSB/Makefile.am (1.42),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 (1.2),
+	  interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.51),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.93),
+	  interfaces/Prolog/YAP/Makefile.am (1.45),
+	  interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 (1.2),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.121),
+	  interfaces/Prolog/YAP/yap_cfli.cc (1.2),
+	  interfaces/Prolog/YAP/yap_cfli.h (1.2),
+	  interfaces/Prolog/YAP/yap_cfli.ic (1.2),
+	  interfaces/Prolog/tests/Makefile.am (1.8),
+	  interfaces/Prolog/tests/pl_check.pl (1.33),
+	  interfaces/Prolog/tests/pl_grid_check.pl (1.2),
+	  src/BD_Shape.defs.hh (1.81), src/BD_Shape.inlines.hh (1.133),
+	  src/BD_Shape.templates.hh (1.28): The `interfaces' branch has
+	  been merged to the main trunk.  The branch has now to be
+	  considered closed.
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (altnum.1): file instchk.hh was added on branch altnum
+	  on 2006-10-29 19:26:46 +0000
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_copyright (altnum.1): file
+	  ppl_interface_generator_copyright was added on branch altnum on
+	  2006-10-29 19:26:57 +0000
+
+2006-09-29 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_copyright (octagons.1): file
+	  ppl_interface_generator_copyright was added on branch octagons on
+	  2006-11-18 20:36:44 +0000
+
+2006-09-29 Friday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (interfaces.5): Temporarily disable
+	  the YAP interface.
+
+2006-09-29 Friday 11:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc.m4,
+	  ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_h.m4,
+	  ppl_interface_generator_c_h_preamble (interfaces.[7,6,7,7]):
+	  Added support for interfacing MIP_problem class and for
+	  ascii_dump methods, as done in the main trunk.
+
+2006-09-29 Friday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_cfli.cc (interfaces.1): Put under CVS
+	  control.
+
+2006-09-29 Friday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.83): Added a workaround to the
+	  implementation of contains_integer_point(), so as to correctly
+	  handle the case of NNC polyhedra and also avoid a few trivial
+	  cases where the polyhedron is known to be empty.
+
+2006-09-29 Friday 09:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: C/ppl_interface_generator_c_cc_preamble,
+	  C/ppl_interface_generator_c_h_preamble,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  Prolog/tests/pl_check.pl (interfaces.[5,6,31,5,2]): Updated for
+	  changes from the Trunk.  Now C and Prolog interfaces compile with
+	  the "Polyhedron" for the --enable-instantiation.  Only SICStus
+	  and SWI Prolog interfaces tested.
+
+2006-09-29 Friday 00:42  Andrea Cimino
+
+	* src/: LP_Problem.defs.hh (1.26), MIP_Problem.defs.hh (1.14):
+	  Other doxygen comments fixed.
+
+2006-09-28 Thursday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, INSTALL, NEWS, STANDARDS, TODO, config.guess,
+	  config.sub, configure.ac, install-sh, instchk.hh, missing,
+	  mkinstalldirs, Watchdog/ChangeLog, Watchdog/INSTALL,
+	  Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	  Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/Handler.defs.hh,
+	  Watchdog/src/Makefile.am, Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Watchdog.cc, Watchdog/src/Watchdog.defs.hh,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/ppl-config.1,
+	  doc/ppl-config_extra_man_text, doc/ppl_lcdd.1,
+	  doc/ppl_lcdd_extra_man_text, doc/ppl_lpsol.1,
+	  doc/ppl_lpsol_extra_man_text, doc/prog2man,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/pl_check.pl, src/Any_Pointset.defs.hh,
+	  src/Any_Pointset.inlines.hh, src/Any_Pointset.types.hh,
+	  src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+	  src/Ask_Tell.templates.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.templates.hh, src/DB_Row.defs.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Direct_Product.defs.hh, src/Direct_Product.inlines.hh,
+	  src/Direct_Product.templates.hh, src/Direct_Product.types.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/Generator.cc, src/Generator.defs.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Certificate.cc, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.templates.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/MIP_Problem.cc,
+	  src/MIP_Problem.defs.hh, src/MIP_Problem.inlines.hh,
+	  src/MIP_Problem.templates.hh, src/MIP_Problem.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/OR_Matrix.defs.hh, src/OR_Matrix.inlines.hh,
+	  src/OR_Matrix.templates.hh, src/OR_Matrix.types.hh,
+	  src/Octagonal_Shape.cc, src/Octagonal_Shape.defs.hh,
+	  src/Octagonal_Shape.inlines.hh, src/Octagonal_Shape.templates.hh,
+	  src/Octagonal_Shape.types.hh, src/Og_Status.idefs.hh,
+	  src/Og_Status.inlines.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Pointset_Ask_Tell.cc,
+	  src/Pointset_Ask_Tell.defs.hh, src/Pointset_Ask_Tell.inlines.hh,
+	  src/Pointset_Ask_Tell.templates.hh,
+	  src/Pointset_Ask_Tell.types.hh, src/Pointset_Powerset.cc,
+	  src/Pointset_Powerset.defs.hh, src/Pointset_Powerset.inlines.hh,
+	  src/Pointset_Powerset.templates.hh,
+	  src/Pointset_Powerset.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.templates.hh, src/Result.defs.hh,
+	  src/Result.inlines.hh, src/Rounding_Dir.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variables_Set.cc,
+	  src/Variables_Set.defs.hh, src/Variables_Set.inlines.hh,
+	  src/Variables_Set.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/algorithms.hh,
+	  src/checked.inlines.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_numeric_limits.hh, src/conversion.cc,
+	  src/distances.defs.hh, src/distances.inlines.hh,
+	  src/distances.types.hh, src/fpu-ia32.inlines.hh,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/iterator_to_const.defs.hh, src/iterator_to_const.inlines.hh,
+	  src/iterator_to_const.types.hh, src/max_space_dimension.hh,
+	  src/mp_numeric_limits.hh, src/namespaces.hh, tests/BBox.cc,
+	  tests/FCAIBVP.cc, tests/FCAIBVP.defs.hh,
+	  tests/FCAIBVP.inlines.hh, tests/FCAIBVP.types.hh,
+	  tests/Makefile.am, tests/Partial_Function.cc, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/print.hh, tests/Ask_Tell/.cvsignore,
+	  tests/Ask_Tell/Makefile.am, tests/Ask_Tell/append1.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/containsintegerpoint1.cc,
+	  tests/BD_Shape/disjoint1.cc, tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/universe1.cc,
+	  tests/Grid/Makefile.am, tests/Grid/affineimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload3.cc,
+	  tests/Grid/asciidumpload4.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/boundedaffineimage1.cc,
+	  tests/Grid/boundedaffinepreimage1.cc, tests/Grid/boundingbox2.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/containsintegerpoint1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/directproduct2.cc, tests/Grid/equals1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffineimage3.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generalizedaffinepreimage3.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	  tests/Grid/widening2.cc, tests/Octagonal_Shape/.cvsignore,
+	  tests/Octagonal_Shape/Makefile.am,
+	  tests/Octagonal_Shape/addspacedims1.cc,
+	  tests/Octagonal_Shape/affinedimension1.cc,
+	  tests/Octagonal_Shape/affineimage1.cc,
+	  tests/Octagonal_Shape/affineimage2.cc,
+	  tests/Octagonal_Shape/affinepreimage1.cc,
+	  tests/Octagonal_Shape/affinepreimage2.cc,
+	  tests/Octagonal_Shape/ascii_dump_load1.cc,
+	  tests/Octagonal_Shape/bhmz05widening1.cc,
+	  tests/Octagonal_Shape/bhz03widening1.cc,
+	  tests/Octagonal_Shape/bounded1.cc,
+	  tests/Octagonal_Shape/cc76extrapolation1.cc,
+	  tests/Octagonal_Shape/cc76narrowing1.cc,
+	  tests/Octagonal_Shape/chinainit.cc,
+	  tests/Octagonal_Shape/concatenate1.cc,
+	  tests/Octagonal_Shape/constraints1.cc,
+	  tests/Octagonal_Shape/contains1.cc,
+	  tests/Octagonal_Shape/containsintegerpoint1.cc,
+	  tests/Octagonal_Shape/empty1.cc,
+	  tests/Octagonal_Shape/fromgensys1.cc,
+	  tests/Octagonal_Shape/frompolyhedron1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc,
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc,
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc,
+	  tests/Octagonal_Shape/intersection1.cc,
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc,
+	  tests/Octagonal_Shape/mapspacedims1.cc,
+	  tests/Octagonal_Shape/maxspacedim.cc,
+	  tests/Octagonal_Shape/minconstraints1.cc,
+	  tests/Octagonal_Shape/octdifference1.cc,
+	  tests/Octagonal_Shape/octhull1.cc,
+	  tests/Octagonal_Shape/relatwithcons1.cc,
+	  tests/Octagonal_Shape/relatwithcons2.cc,
+	  tests/Octagonal_Shape/relatwithgen1.cc,
+	  tests/Octagonal_Shape/removespacedims1.cc,
+	  tests/Octagonal_Shape/run_tests,
+	  tests/Octagonal_Shape/timeelapse1.cc,
+	  tests/Octagonal_Shape/universe1.cc,
+	  tests/Octagonal_Shape/writeoctagon1.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bhz03widening1.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/bug2.dat, tests/Polyhedron/dualhypercubes.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/exceptions2.cc,
+	  tests/Polyhedron/exceptions3.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/pointsetpowerset1.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/timeelapse1.cc,
+	  utils/timings.cc
+	  (interfaces.[1,1,1,1,1,1,1,1,5,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,2,5,1,1,1,1,1,1,5,1,1,1,1,1,2,2,2,1,1,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,1,1,2,2,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1, [...]
+	  Second merge from main trunk (several compilation errors still to
+	  be fixed).
+
+2006-09-28 Thursday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: ppl_interface_generator_yap_cc.m4,
+	  yap_cfli.h, yap_cfli.ic (interfaces.[4,2,2]): Started a revision
+	  of the YAP interface.
+
+2006-09-28 Thursday 21:06  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (1.25): Other little English inaccuracy
+	  fixed.
+
+2006-09-28 Thursday 21:03  Andrea Cimino
+
+	* src/: LP_Problem.cc (1.36), LP_Problem.defs.hh (1.24),
+	  MIP_Problem.cc (1.18), MIP_Problem.defs.hh (1.13): Some English
+	  inaccuracies fixed.  Properly renamed also `unsplit()' to
+	  `merge_split_variables()'.
+
+2006-09-28 Thursday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (interfaces.1): file MIP_Problem.cc was added
+	  on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-28 Thursday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (interfaces.1): file MIP_Problem.defs.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-28 Thursday 17:21  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.49), disjoint1.cc (1.1): Added
+	  new tests on the method BD_Shape::is_disjoint_from(y).
+
+2006-09-28 Thursday 17:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/disjoint1.cc (interfaces.1): file disjoint1.cc was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 17:19  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.27): Defined the method:
+	  BD_Shape::is_disjoint_from(const BD_Shape& y).
+
+2006-09-28 Thursday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.12): test01() never fails.
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:27 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffineimage1.cc (interfaces.1): file
+	  boundedaffineimage1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffineimage1.cc (octagons.1): file
+	  boundedaffineimage1.cc was added on branch octagons on 2006-11-18
+	  20:36:56 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:27 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (interfaces.1): file
+	  boundedaffinepreimage1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-28 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundedaffinepreimage1.cc (octagons.1): file
+	  boundedaffinepreimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-28 Thursday 14:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.35), src/Grid_public.cc (1.42),
+	  tests/Grid/Makefile.am (1.42), tests/Grid/boundedaffineimage1.cc
+	  (1.1), tests/Grid/boundedaffinepreimage1.cc (1.1): Added methods
+	  bounded_affine_image() and bounded_affine_preimage() for Grids
+	  and tests to test them.
+
+2006-09-28 Thursday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.11): Print also known_result
+	  in test01().
+
+2006-09-28 Thursday 11:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.defs.hh (1.32): Removed annoying trailing
+	  whitespace.
+
+2006-09-28 Thursday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/membytes1.cc (1.11): test02() should never fail.
+
+2006-09-28 Thursday 06:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (1.4): Disable valgrind
+	  checking.
+
+2006-09-28 Thursday 06:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/Makefile.am (interfaces.1): file
+	  Makefile.am was added on branch interfaces on 2006-09-28 20:46:32
+	  +0000
+
+2006-09-27 Wednesday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.48): Disable valgrind checking.
+
+2006-09-27 Wednesday 18:45  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.17), MIP_Problem.defs.hh (1.12):
+	  solve_mip() and is_mip_satisfiable() declared static.  Avoided a
+	  lot of copies involed when a mip problem has to be solved /
+	  checked for satisfiability. Added a sketch of code in OK() that
+	  has to proof the satisfiability of a solution found that is
+	  constrained to have integer coefficients.
+
+2006-09-27 Wednesday 16:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.34), src/Grid_public.cc (1.41),
+	  tests/Grid/Makefile.am (1.41),
+	  tests/Grid/generalizedaffineimage3.cc (1.1),
+	  tests/Grid/generalizedaffinepreimage3.cc (1.1): Added an
+	  implementation for generalizedaffineimage() and
+	  generalizedaffinepreimage() in the case that resym is not EQUAL.
+	  Added tests to test this.
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (altnum.1): file
+	  generalizedaffineimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (interfaces.1): file
+	  generalizedaffineimage3.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage3.cc (octagons.1): file
+	  generalizedaffineimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (altnum.1): file
+	  generalizedaffinepreimage3.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (interfaces.1): file
+	  generalizedaffinepreimage3.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-27 Wednesday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage3.cc (octagons.1): file
+	  generalizedaffinepreimage3.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-26 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.8), interfaces/C/Makefile.am (1.24),
+	  interfaces/Prolog/SWI/Makefile.am (1.61),
+	  tests/BD_Shape/Makefile.am (1.47),
+	  tests/Octagonal_Shape/Makefile.am (1.3): Typos fixed.
+
+2006-09-26 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/: EList.defs.hh (1.4), Handler.defs.hh (1.3),
+	  Pending_Element.defs.hh (1.3), Watchdog.cc (1.4),
+	  Watchdog.defs.hh (1.3): Comments improved.
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList.defs.hh (altnum.1): file EList.defs.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Handler.defs.hh (altnum.1): file Handler.defs.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.defs.hh (altnum.1): file
+	  Pending_Element.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc (altnum.1): file Watchdog.cc was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.defs.hh (altnum.1): file Watchdog.defs.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-09-26 Tuesday 19:07  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.53): Fixed a bug in
+	  `maybe_check_results': no_optimization flag was not properly
+	  handled.
+
+2006-09-26 Tuesday 18:56  Andrea Cimino
+
+	* src/MIP_Problem.inlines.hh (1.10): Copy operator fixed.
+
+2006-09-26 Tuesday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.inlines.hh (interfaces.1): file
+	  MIP_Problem.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-26 Tuesday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.82): In method OK(), do not attempt
+	  minimizing the constraint description, unless the constraints are
+	  claimed to be already minimized (so as to check for the
+	  correctness of the claim) or if explicitly required to check for
+	  emptyness.
+
+2006-09-26 Tuesday 15:16  quartieri
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (1.2): Added some
+	  tests on the method bool
+	  Octagonal_Shape<T>::contains_integer_point() const.
+
+2006-09-26 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-26 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (interfaces.1):
+	  file containsintegerpoint1.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-26 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-26 Tuesday 10:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage2.cc (1.9), generalizedaffineimage1.cc
+	  (1.11), generalizedaffineimage2.cc (1.10),
+	  generalizedaffinepreimage1.cc (1.13),
+	  generalizedaffinepreimage2.cc (1.13): Updated for the revisions
+	  to the methods generalized_affine_image() and
+	  generalized_affine_preimage().
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (altnum.1): file affineimage2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage1.cc (altnum.1): file
+	  generalizedaffineimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage2.cc (altnum.1): file
+	  generalizedaffineimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage1.cc (altnum.1): file
+	  generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage2.cc (altnum.1): file
+	  generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:28 +0000
+
+2006-09-26 Tuesday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.defs.hh (1.33), Grid_public.cc (1.40): Revised
+	  generalized_affime_image() and generalized_affime_preimage() for
+	  the Grid domain to include the relation symbol.  Current version
+	  only handles the case when this is EQUAL which also denotes a
+	  congruence relation.	The default value for the modulus is now
+	  zero.
+
+2006-09-26 Tuesday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.5): Debugging declarations commented
+	  out.
+
+2006-09-26 Tuesday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (interfaces.1): file
+	  Any_Pointset.defs.hh was added on branch interfaces on 2006-09-28
+	  20:46:28 +0000
+
+2006-09-26 Tuesday 10:21  Andrea Cimino
+
+	* demos/ppl_lpsol/: Makefile.am (1.31), ppl_lpsol.c (1.52):
+	  ppl_lpsol modified to use the MIP_Problem class instead of
+	  LP_Problem. Now ppl_lpsol can handle also MIP problems optimizing
+	  them and finding feasible points.
+
+2006-09-25 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.4): More methods added.
+
+2006-09-25 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.80), BD_Shape.inlines.hh (1.132),
+	  Octagonal_Shape.defs.hh (1.10), Octagonal_Shape.inlines.hh (1.7):
+	  Added BD_Shape::is_topologically_closed() and
+	  Octagonal_Shape::is_topologically_closed().
+
+2006-09-25 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (interfaces.1): file
+	  Octagonal_Shape.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (interfaces.1): file
+	  Octagonal_Shape.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.79), BD_Shape.templates.hh (1.26),
+	  Octagonal_Shape.defs.hh (1.9), Octagonal_Shape.templates.hh
+	  (1.21): Added declarations and fake implementations of
+	  BD_Shape::is_disjoint_from(),
+	  Octagonal_Shape::is_disjoint_from(), BD_Shape::is_discrete() and
+	  Octagonal_Shape::is_discrete().
+
+2006-09-25 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (interfaces.1): file
+	  Octagonal_Shape.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.80): Comments revised.
+
+2006-09-25 Monday 19:45  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.16): Fixed a bug: if we are solving real
+	  MIP problems, remember to always store a feasible point. This
+	  avoids a bug shown if a problem is unbounded and we are asked for
+	  a feasible point.
+
+2006-09-25 Monday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.157), ppl_c.h.in (1.68): Added
+	  ascii_dump functions to the C interface.
+
+2006-09-25 Monday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.51): Added 'r' to OPTION_LETTERS.
+
+2006-09-25 Monday 11:56  Elena Mazzi
+
+	* tests/BD_Shape/timeelapse1.cc (1.15): Renamed the variables `oc'
+	  with `bd' in many tests.
+
+2006-09-25 Monday 11:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (1.3): Documentation of class
+	  iterator_to_const revised.
+
+2006-09-25 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (altnum.1): file
+	  iterator_to_const.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-25 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (interfaces.1): file
+	  iterator_to_const.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-25 Monday 11:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (octagons.1): file
+	  iterator_to_const.defs.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-24 Sunday 23:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.3): Debugging code commented out.
+
+2006-09-24 Sunday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.defs.hh (1.2): Added more methods to
+	  Any_Pointset and its subclasses.
+
+2006-09-24 Sunday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/MIP_Problem.defs.hh (1.11): Declarations of integer variables
+	  get/add methods moved to better places; drafted documentation for
+	  the setting of integer variables.
+
+2006-09-24 Sunday 21:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.50): Optimization modes are
+	  specified at library level, not inside LP_Problem class.
+
+2006-09-24 Sunday 21:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.156), ppl_c.h.in (1.67): First draft
+	  at interfacing class MIP_Problem.
+
+2006-09-24 Sunday 18:07  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.15): If we add integer space dimensions to
+	  an unsatisfiable problem, it remains unsatisfiable.
+
+2006-09-24 Sunday 18:00  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.14): set_integer_space_dimensions() now
+	  throws a valid error message.
+
+2006-09-24 Sunday 17:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.20): Use
+	  is_additive_inverse() to improve readability in several places.
+	  Used is_even() in tight_coherence_would_make_empty().  Corrected
+	  bug in the output operator whereby the output of an octagon
+	  having integer coefficients could have been innacurate (but
+	  correct).
+
+2006-09-24 Sunday 17:56  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.13), MIP_Problem.defs.hh (1.10): void
+	  set_integer_space_dimensions(const Variables_Set& i_vars) defined
+	  and implemented.
+
+2006-09-24 Sunday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.131): Fixed is_even() and
+	  is_additive_inverse() (ROUND_IGNORE evaluates the returned Result
+	  info lazily, that is, it will happily return V_LGE ---a.k.a.
+	  "don't know"--- if returning something more precise costs one
+	  extra clock cycle).
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Any_Pointset.defs.hh (1.1), Any_Pointset.inlines.hh (1.1),
+	  Any_Pointset.types.hh (1.1), Makefile.am (1.161): Started writing
+	  the new Any_Pointset class.
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (altnum.1): file
+	  Any_Pointset.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (interfaces.1): file
+	  Any_Pointset.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.inlines.hh (octagons.1): file
+	  Any_Pointset.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (altnum.1): file Any_Pointset.types.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (interfaces.1): file
+	  Any_Pointset.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Any_Pointset.types.hh (octagons.1): file
+	  Any_Pointset.types.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-09-24 Sunday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.198): Added one item.
+
+2006-09-24 Sunday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/max_space_dimension.hh (1.9): Fixed
+	  Parma_Polyhedra_Library::max_space_dimension().
+
+2006-09-24 Sunday 17:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.78), BD_Shape.inlines.hh (1.130),
+	  BD_Shape.templates.hh (1.25), Octagonal_Shape.defs.hh (1.8),
+	  Octagonal_Shape.inlines.hh (1.6), Octagonal_Shape.templates.hh
+	  (1.19): Added declarations and placeholder implementations of
+	  methods total_memory_in_bytes() and external_memory_in_bytes().
+
+2006-09-24 Sunday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.24): Exploited new utility function
+	  is_additive_inverse() to improve readability.
+
+2006-09-24 Sunday 16:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.129): Added utility functions bool
+	  is_even(m) and bool is_additive_inverse(m, n) to namespace
+	  Implementation::BD_Shapes.
+
+2006-09-24 Sunday 14:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (1.11): [no log message]
+
+2006-09-24 Sunday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_widenings.cc (altnum.1): file Grid_widenings.cc was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.39), tests/Grid/containsintegerpoint1.cc
+	  (1.2): Grid::contains_integer_point() fixed.
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:27 +0000
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/containsintegerpoint1.cc (interfaces.1): file
+	  containsintegerpoint1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-24 Sunday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-24 Sunday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am (1.40), containsintegerpoint1.cc (1.1),
+	  onepoint1.cc (1.2): Test program renamed.  Comment revised.
+
+2006-09-24 Sunday 13:50  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.49): Some improvements when
+	  `no-optimization' is involved.  Now the enumeration solving
+	  method accepts the `no-optimization' parameter. Some fixes in
+	  maybe_check_result(): do not forget that the `no_optimization'
+	  flag exists.
+
+2006-09-24 Sunday 12:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.32), src/Grid.templates.hh (1.20),
+	  src/Grid_public.cc (1.38), tests/Grid/Makefile.am (1.39),
+	  tests/Grid/onepoint1.cc (1.1): Revised comment in
+	  src/Grid.templates.hh Added Grid::contains_integer_point()
+	  method.
+
+2006-09-24 Sunday 12:24  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.12), MIP_Problem.defs.hh (1.9),
+	  MIP_Problem.inlines.hh (1.9): Moved all throwing exceptions
+	  methods from MIP_Problems.inlines.hh to MIP_Problems.cc, removing
+	  the `inline' directive for each method.  Added the method `const
+	  Variables_Set& integer_space_dimensions() const'.
+
+2006-09-24 Sunday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (1.2): New test test04()
+	  shows an inaccuracy of the output procedure when dealing with
+	  octagons having integer coefficients.
+
+2006-09-24 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (altnum.1): file
+	  writeoctagon1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-24 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (interfaces.1): file
+	  writeoctagon1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-24 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/writeoctagon1.cc (octagons.1): file
+	  writeoctagon1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-24 Sunday 10:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: grid1.cc (1.18), grid2.cc (1.14), widening2.cc
+	  (1.7): Revised comments.
+
+2006-09-24 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid1.cc (altnum.1): file grid1.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid2.cc (altnum.1): file grid2.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening2.cc (altnum.1): file widening2.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 10:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.197): The ask-and-tell generic construction has been
+	  reimplemented.
+
+2006-09-24 Sunday 10:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.51): Useless template function
+	  copy_compare() removed.
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Octagonal_Shape.templates.hh (1.18),
+	  Pointset_Ask_Tell.defs.hh (1.5), Pointset_Powerset.defs.hh (1.4),
+	  Polyhedron_public.cc (1.81), Polyhedron_widenings.cc (1.55):
+	  Standardize on tags: CHECKME (with no space), FIXME, and TODO are
+	  the only tags we use.
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (altnum.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (interfaces.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.defs.hh (octagons.1): file
+	  Pointset_Ask_Tell.defs.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-24 Sunday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.defs.hh (interfaces.1): file
+	  Pointset_Powerset.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (altnum.1): file append1.cc was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (interfaces.1): file append1.cc was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/append1.cc (octagons.1): file append1.cc was added
+	  on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.defs.hh (1.14), src/Ask_Tell.templates.hh (1.7),
+	  src/Determinate.defs.hh (1.63), src/Determinate.inlines.hh
+	  (1.54), tests/Ask_Tell/append1.cc (1.4):
+	  Ask_Tell::upper_bound_assign() now uses a basic deabsorption
+	  procedure.
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (altnum.1): file Ask_Tell.templates.hh
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (interfaces.1): file
+	  Ask_Tell.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:28 +0000
+
+2006-09-24 Sunday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ask_Tell.templates.hh (octagons.1): file
+	  Ask_Tell.templates.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (altnum.1): file contains1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (interfaces.1): file
+	  contains1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/contains1.cc (octagons.1): file
+	  contains1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage3.cc (interfaces.1):
+	  file generalizedaffineimage3.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage2.cc
+	  (interfaces.1): file generalizedaffinepreimage2.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/linearsystem1.cc (altnum.1): file
+	  linearsystem1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bhz03widening1.cc (altnum.1): file bhz03widening1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences2.cc (altnum.1): file congruences2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/equals1.cc (altnum.1): file equals1.cc was added on
+	  branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/foldspacedims1.cc (altnum.1): file foldspacedims1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations3.cc (altnum.1): file relations3.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations3.cc (octagons.1): file relations3.cc was
+	  added on branch octagons on 2006-11-18 20:36:57 +0000
+
+2006-09-24 Sunday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.19),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.47),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.40),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.96),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.126),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.120),
+	  tests/Ask_Tell/append1.cc (1.3),
+	  tests/BD_Shape/addconstraints1.cc (1.15),
+	  tests/BD_Shape/affinepreimage1.cc (1.16),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.17),
+	  tests/Grid/bhz03widening1.cc (1.11), tests/Grid/congruences2.cc
+	  (1.4), tests/Grid/equals1.cc (1.11), tests/Grid/foldspacedims1.cc
+	  (1.10), tests/Grid/grid1.cc (1.17), tests/Grid/relations2.cc
+	  (1.13), tests/Grid/relations3.cc (1.5),
+	  tests/Octagonal_Shape/contains1.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.2),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.2),
+	  tests/Polyhedron/bhz03widening1.cc (1.12),
+	  tests/Polyhedron/linearsystem1.cc (1.7),
+	  tests/Polyhedron/polyhull1.cc (1.9): Spelling corrections.
+
+2006-09-24 Sunday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.38): Added template <typename PH> void
+	  print_constraints(const Pointset_Ask_Tell<PH>&, const
+	  std::string&, std::ostream&).
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: FCAIBVP.defs.hh (1.2), FCAIBVP.inlines.hh (1.2): Added
+	  methods  void weakening_assign(const FCAIBVP&) and static bool
+	  has_nontrivial_weakening().
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (altnum.1): file FCAIBVP.defs.hh was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.defs.hh (interfaces.1): file FCAIBVP.defs.hh was
+	  added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (altnum.1): file FCAIBVP.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-24 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.inlines.hh (interfaces.1): file FCAIBVP.inlines.hh
+	  was added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-23 Saturday 23:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Octagonal_Shape/: Makefile.am (1.2),
+	  containsintegerpoint1.cc (1.1): Added new test for
+	  Octagonal_Shape::contains_integer_points().
+
+2006-09-23 Saturday 23:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh (1.7), Octagonal_Shape.templates.hh
+	  (1.17): Added new method   bool
+	  Octagonal_Shape::contains_integer_points() const.
+
+2006-09-23 Saturday 22:34  Andrea Cimino
+
+	* src/MIP_Problem.inlines.hh (1.8): Other little formatting
+	  changes.  Removed an useless comment.
+
+2006-09-23 Saturday 22:29  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.11), MIP_Problem.inlines.hh (1.7): Better
+	  handled MIP_Problem `status' to avoid useless computations. Minor
+	  stylistic changes.
+
+2006-09-23 Saturday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.198): Spelling corrections.
+
+2006-09-23 Saturday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.199), STANDARDS (1.35): Spelling corrections.
+
+2006-09-23 Saturday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_widenings.cc (1.54), checked_int.inlines.hh
+	  (1.55): Identifiers improved.
+
+2006-09-23 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.23): Renamed a couple of
+	  identifiers.
+
+2006-09-23 Saturday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.10): Revised the woring of a couple of
+	  comments.
+
+2006-09-23 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.22): Updated.
+
+2006-09-23 Saturday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.31), Grid_conversion.cc (1.17),
+	  Grid_simplify.cc (1.29): Got rid of tracing code that was
+	  cluttering the sources.
+
+2006-09-23 Saturday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_conversion.cc (altnum.1): file Grid_conversion.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc (altnum.1): file Grid_simplify.cc was added
+	  on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 17:53  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.9): Fixed a couple of bugs in
+	  is_mip_satisfiable() and solve_mip().
+
+2006-09-23 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.templates.hh (1.19), Grid_Generator.cc (1.18),
+	  Grid_conversion.cc (1.16), Grid_public.cc (1.37): Use `tmp' to
+	  denote a temporary: neither `tem' nor `temp'.
+
+2006-09-23 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.cc (altnum.1): file Grid_Generator.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.53): Use square brackets for
+	  literature citations.
+
+2006-09-23 Saturday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.48): The command parser now
+	  recognizes the --no-mip (-r) option: this allows to consider
+	  integer variables as real variables.
+
+2006-09-23 Saturday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.198), TODO (1.196), interfaces/C/ppl_c.cc (1.155),
+	  interfaces/C/ppl_c.h.in (1.66),
+	  interfaces/Prolog/Prolog_interface.dox (1.156),
+	  interfaces/Prolog/ppl_prolog.icc (1.180),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.23),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.92),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.95),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.125),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.50),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.92),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.27),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.119), src/BD_Shape.defs.hh
+	  (1.77), src/Polyhedron.defs.hh (1.307): Added C and Prolog
+	  interfaces for Polyhedron::contains_integer_point().
+	  Documentation improved.  Added remainders to NEWS and TODO.
+
+2006-09-23 Saturday 16:01  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.8), MIP_Problem.defs.hh (1.8),
+	  MIP_Problem.inlines.hh (1.6): Implemented is_satisfiable() for
+	  real MIP Problems in a more efficient way.
+
+2006-09-23 Saturday 14:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.22): Minor readability improvements
+	  to contains_integer_point(), as well as correcting a typo
+	  resulting in a bug.
+
+2006-09-23 Saturday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.27), Watchdog/ChangeLog (1.16): Updated.
+
+2006-09-23 Saturday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.35), MIP_Problem.cc (1.7),
+	  Octagonal_Shape.templates.hh (1.16): Avoid unnecessary (and
+	  silly) abbreviations.
+
+2006-09-23 Saturday 13:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.46), containsintegerpoint1.cc
+	  (1.1): Added simple test for method contains_integer_point().
+
+2006-09-23 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (altnum.1): file
+	  containsintegerpoint1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-23 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (interfaces.1): file
+	  containsintegerpoint1.cc was added on branch interfaces on
+	  2006-09-28 20:46:31 +0000
+
+2006-09-23 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/containsintegerpoint1.cc (octagons.1): file
+	  containsintegerpoint1.cc was added on branch octagons on
+	  2006-11-18 20:36:56 +0000
+
+2006-09-23 Saturday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.76), BD_Shape.templates.hh (1.21):
+	  Added declaration and tentative implementation of method   bool
+	  BD_Shape<T>::contains_integer_point() const.
+
+2006-09-23 Saturday 13:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.15): Avoid pleonastic
+	  comments.
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.cc (altnum.1): file Congruence.cc was added on
+	  branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (altnum.1): file Congruence_System.cc
+	  was added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.defs.hh (altnum.1): file
+	  Congruence_System.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (altnum.1): file
+	  Direct_Product.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (octagons.1): file
+	  Direct_Product.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.cc (altnum.1): file Grid_Certificate.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.cc (altnum.1): file
+	  Grid_Generator_System.cc was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.cc (altnum.1): file Grid_Status.cc was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_chdims.cc (altnum.1): file Grid_chdims.cc was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (altnum.1): file Grid_nonpublic.cc was
+	  added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (interfaces.1): file OR_Matrix.defs.hh was
+	  added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.templates.hh (interfaces.1): file
+	  OR_Matrix.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (altnum.1): file Og_Status.idefs.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (interfaces.1): file Og_Status.idefs.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh (altnum.1): file Og_Status.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.inlines.hh (interfaces.1): file
+	  Og_Status.inlines.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (altnum.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (interfaces.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.templates.hh (octagons.1): file
+	  Pointset_Ask_Tell.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.templates.hh (interfaces.1): file
+	  Pointset_Powerset.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (altnum.1): file mp_numeric_limits.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/namespaces.hh (altnum.1): file namespaces.hh was added on
+	  branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.14), BD_Shape.cc (1.3),
+	  BD_Shape.defs.hh (1.75), BD_Shape.inlines.hh (1.128),
+	  BD_Shape.templates.hh (1.20), Bounding_Box.defs.hh (1.15),
+	  Checked_Number.defs.hh (1.79), Congruence.cc (1.13),
+	  Congruence.inlines.hh (1.12), Congruence_System.cc (1.20),
+	  Congruence_System.defs.hh (1.16), Constraint_System.cc (1.19),
+	  Constraint_System.defs.hh (1.33), DB_Matrix.defs.hh (1.24),
+	  DB_Matrix.templates.hh (1.2), Direct_Product.inlines.hh (1.26),
+	  Generator_System.cc (1.19), Generator_System.defs.hh (1.20),
+	  Grid.defs.hh (1.30), Grid.templates.hh (1.18),
+	  Grid_Certificate.cc (1.5), Grid_Generator_System.cc (1.15),
+	  Grid_Status.cc (1.5), Grid_chdims.cc (1.13), Grid_conversion.cc
+	  (1.15), Grid_nonpublic.cc (1.20), Grid_public.cc (1.36),
+	  Grid_simplify.cc (1.28), Grid_widenings.cc (1.10), LP_Problem.cc
+	  (1.34), LP_Problem.defs.hh (1.23), Linear_System.cc (1.39),
+	  Linear_System.defs.hh (1.28), MIP_Problem.cc (1.6),
+	  MIP_Problem.defs.hh (1.7), Matrix.cc (1.94), OR_Matrix.defs.hh
+	  (1.5), OR_Matrix.templates.hh (1.3), Octagonal_Shape.defs.hh
+	  (1.6), Octagonal_Shape.templates.hh (1.14), Og_Status.idefs.hh
+	  (1.5), Og_Status.inlines.hh (1.3), Ph_Status.cc (1.11),
+	  Pointset_Ask_Tell.defs.hh (1.4), Pointset_Ask_Tell.templates.hh
+	  (1.6), Pointset_Powerset.defs.hh (1.3),
+	  Pointset_Powerset.templates.hh (1.4), Polyhedron_nonpublic.cc
+	  (1.67), Polyhedron_public.cc (1.80), Powerset.defs.hh (1.28),
+	  Saturation_Matrix.cc (1.10), Saturation_Row.cc (1.11),
+	  Saturation_Row.defs.hh (1.11), checked.inlines.hh (1.32),
+	  checked_int.inlines.hh (1.54), conversion.cc (1.78),
+	  fpu-ia32.inlines.hh (1.14), mp_numeric_limits.hh (1.8),
+	  namespaces.hh (1.9): Fixed lots of spelling mistakes.  Badly
+	  named variables renamed.  Long lines split.  Code formatting
+	  improvements.
+
+2006-09-23 Saturday 13:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.cc (altnum.1): file BD_Shape.cc was added on branch
+	  altnum on 2006-10-29 19:27:12 +0000
+
+2006-09-23 Saturday 12:59  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.5), MIP_Problem.inlines.hh (1.5): Cleaned
+	  solve() method.  Removed a bit of useless code in solve_mip().
+
+2006-09-23 Saturday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.195), src/Polyhedron_public.cc (1.79): A few adjustments
+	  to Polyhedron::contains_integer_point(); currently we cannot
+	  handle the case of strict inequalities.
+
+2006-09-23 Saturday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/membytes1.cc (1.10): test02() fails with 8-bit
+	  coefficients.
+
+2006-09-22 Friday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.14), Ask_Tell.templates.hh (1.6),
+	  Pointset_Ask_Tell.templates.hh (1.5):
+	  Ask_Tell::upper_bound_assign() moved to Ask_Tell.templates.hh.
+	  Restored commented out code in Ask_Tell::OK().  Fixed
+	  Pointset_Ask_Tell::remove_space_dimensions().
+
+2006-09-22 Friday 20:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.306), Polyhedron_public.cc (1.78):
+	  Added a first, tentative implementation of
+	  Polyhedron::contains_integer_point().
+
+2006-09-22 Friday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.cc (1.4): Formatting fixed.
+
+2006-09-22 Friday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.templates.hh (1.19), Grid_chdims.cc (1.12),
+	  Octagonal_Shape.templates.hh (1.13), Polyhedron_chdims.cc (1.38):
+	  Use the services provided by Variables_Set.
+
+2006-09-22 Friday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (1.2): Fixed the documentation of
+	  Variables_Set::space_dimension().
+
+2006-09-22 Friday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (altnum.1): file Variables_Set.defs.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-22 Friday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.defs.hh (interfaces.1): file
+	  Variables_Set.defs.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (1.2): Fixed
+	  Variables_Set::space_dimension().
+
+2006-09-22 Friday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (altnum.1): file
+	  Variables_Set.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-09-22 Friday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.inlines.hh (interfaces.1): file
+	  Variables_Set.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 17:23  Andrea Cimino
+
+	* src/MIP_Problem.inlines.hh (1.4): Solved a bug in MIP_Problem.
+	  Added some tests for MIP_Problem.
+
+2006-09-22 Friday 16:45  Andrea Cimino
+
+	* src/: MIP_Problem.cc (1.3), MIP_Problem.defs.hh (1.6),
+	  MIP_Problem.inlines.hh (1.3): Implemented is_satisfiable for the
+	  `MIP' case.
+
+2006-09-22 Friday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.34): Added a point covering tests programs that
+	  require auxiliary functions.
+
+2006-09-22 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.defs.hh (1.5), MIP_Problem.templates.hh (1.5),
+	  globals.types.hh (1.8): Redundant MIP_Problem constructor
+	  removed.  Removed also the Variables_Integrality enumeration.
+
+2006-09-22 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.templates.hh (interfaces.1): file
+	  MIP_Problem.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-22 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (altnum.1): file globals.types.hh was added
+	  on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-22 Friday 15:41  Elena Mazzi
+
+	* tests/BD_Shape/mapspacedims1.cc (1.13): Rewritten test04 using
+	  the method BD_Shape::minimized_constraints().
+
+2006-09-22 Friday 15:40  Elena Mazzi
+
+	* tests/BD_Shape/universe1.cc (1.13): Added two new tests on the
+	  method BD_Shape::is_universe().
+
+2006-09-22 Friday 15:39  Elena Mazzi
+
+	* tests/BD_Shape/removespacedims1.cc (1.16): Added two new tests on
+	  the method BD_Shape::remove_space_dimensions() and
+	  BD_Shape::remove_higher_space_dimensions().
+
+2006-09-22 Friday 15:38  Elena Mazzi
+
+	* tests/BD_Shape/intersection1.cc (1.15): Added two new tests on
+	  the method BD_Shape::intersection_assign().
+
+2006-09-22 Friday 15:36  Elena Mazzi
+
+	* tests/BD_Shape/contains1.cc (1.13): Added two new tests on the
+	  method BD_Shape::contains().
+
+2006-09-22 Friday 15:34  Elena Mazzi
+
+	* tests/BD_Shape/bdshull1.cc (1.12): Added new test on the method
+	  BD_Shape::bds_hull_assign_and_minimize().
+
+2006-09-22 Friday 15:33  Andrea Cimino
+
+	* src/MIP_Problem.cc (1.2): Added a first implementation that
+	  handles MIP_Problems.
+
+2006-09-22 Friday 15:33  Elena Mazzi
+
+	* tests/BD_Shape/addspacedims1.cc (1.13): Added new two tests on
+	  the methods BD_Shape::add_space_dimensions_and_project() and
+	  BD_Shape::add_space_dimensions_and_embed().
+
+2006-09-22 Friday 15:28  Andrea Cimino
+
+	* src/: MIP_Problem.defs.hh (1.4), MIP_Problem.inlines.hh (1.2),
+	  MIP_Problem.templates.hh (1.4): Added a first implementation that
+	  handles MIP_Problems.
+
+2006-09-22 Friday 14:25  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.5): Removed a redundant
+	  assertion 'assertion(OK())' in	  inline void
+	  Octagonal_Shape<T>::add_constraints().
+
+2006-09-22 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.10): Useless stuff removed.
+	  Test more classes.
+
+2006-09-22 Friday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matrix1.cc (altnum.1): file matrix1.cc was added
+	  on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-09-22 Friday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matrix1.cc (1.8): test01() made self-contained.
+
+2006-09-22 Friday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.99), membytes1.cc (1.9),
+	  membytes2.cc (1.8): Made membytes1.cc conformant to the PPL
+	  standards.  The test formerly in membytes2.cc is now test02() in
+	  membytes1.cc.
+
+2006-09-22 Friday 13:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/iterator_to_const.defs.hh (1.2): Restored a few access
+	  restrictions; added corresponding friend declarations.
+
+2006-09-22 Friday 12:57  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.4): Removed a redundant
+	  assertion 'assert(OK())' in the constructor inline
+	  Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs).
+
+2006-09-22 Friday 12:06  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.12): Removed a redundant
+	  assertion 'assert(OK())' from the method	   void
+	  Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-09-22 Friday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ciao_pl_check.pl (1.22), ppl_ciao.pl
+	  (1.91): Corrected a few typos.
+
+2006-09-22 Friday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.98): XFAIL_WITH_INT8 no longer
+	  includes membytes1.
+
+2006-09-22 Friday 11:16  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.11): Removed a redundant
+	  assertion 'assert(OK())' from the method	   void
+	  Octagonal_Shape<T>::generalized_affine_image().
+
+2006-09-22 Friday 08:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Ask_Tell.inlines.hh (1.13): Avoid redundant template
+	  parameter specifications.
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.74), BD_Shape.templates.hh (1.18),
+	  Direct_Product.defs.hh (1.29), Direct_Product.inlines.hh (1.25),
+	  Grid.defs.hh (1.29), Grid_Generator_System.cc (1.14),
+	  Grid_Generator_System.defs.hh (1.19), Grid_chdims.cc (1.11),
+	  MIP_Problem.defs.hh (1.3), MIP_Problem.templates.hh (1.3),
+	  Makefile.am (1.160), Octagonal_Shape.defs.hh (1.5),
+	  Pointset_Ask_Tell.defs.hh (1.3), Pointset_Ask_Tell.templates.hh
+	  (1.4), Pointset_Powerset.defs.hh (1.2),
+	  Pointset_Powerset.templates.hh (1.3), Polyhedron.defs.hh (1.305),
+	  Polyhedron_chdims.cc (1.37), Variable.cc (1.21), Variable.defs.hh
+	  (1.52), Variables_Set.cc (1.1), Variables_Set.defs.hh (1.1),
+	  Variables_Set.inlines.hh (1.1), Variables_Set.types.hh (1.1):
+	  Variables_Set is now a fully fledged class.
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (altnum.1): file
+	  Direct_Product.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (octagons.1): file
+	  Direct_Product.defs.hh was added on branch octagons on 2006-11-18
+	  20:36:50 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.defs.hh (altnum.1): file
+	  Grid_Generator_System.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (altnum.1): file Variables_Set.cc was added
+	  on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.cc (interfaces.1): file Variables_Set.cc was
+	  added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (altnum.1): file
+	  Variables_Set.types.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (interfaces.1): file
+	  Variables_Set.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variables_Set.types.hh (octagons.1): file
+	  Variables_Set.types.hh was added on branch octagons on 2006-11-18
+	  20:36:51 +0000
+
+2006-09-21 Thursday 17:48  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.127), BD_Shape.templates.hh (1.17):
+	  Moved some assertions 'assert(OK())' where they are really needed
+	  in the methods:  - void BD_Shape<T>::affine_preimage();  -
+	  BD_Shape(const dimension_type num_dimensions,       const
+	  Degenerate_Element kind).
+
+2006-09-21 Thursday 16:34  Elena Mazzi
+
+	* src/BD_Shape.inlines.hh (1.126): Removed a useless assertion
+	  'assert(OK())' from the method inline void
+	  BD_Shape<T>::add_dbm_constraint().
+
+2006-09-21 Thursday 16:05  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.10): Moved some assertions
+	  'assert(OK())' where they are needed in the method
+	  void Octagonal_Shape<T>::affine_preimage().
+
+2006-09-21 Thursday 15:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: MIP_Problem.defs.hh (1.2), MIP_Problem.templates.hh (1.2):
+	  Class documentation revised.	Added two new constructors: one
+	  takes a set of variables that are constrained to take an integer
+	  value; the other takes a shorthand concerning the integrality of
+	  all or no variables.
+
+2006-09-21 Thursday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.types.hh (1.7): New enumeration Variables_Integrality
+	  encodes assertions concerning the integrality of a set of
+	  variables.
+
+2006-09-21 Thursday 15:26  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (1.3): Removed a useless assertion
+	  'assert(OK())' from the method       inline void
+	  Octagonal_Shape<T>::add_octagonal_constraint().
+
+2006-09-21 Thursday 14:45  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.9): Removed a redundant
+	  assertion 'assert(OK())' from the method     void
+	  Octagonal_Shape<T>::limited_BHMZ05_extrapolation_assign().
+
+2006-09-21 Thursday 14:04  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.8): Removed a redundant
+	  assertion 'assert(OK())' from the method	void
+	  Octagonal_Shape<T>::limited_CC76_extrapolation_assign().
+
+2006-09-21 Thursday 13:50  Andrea Cimino
+
+	* tests/Polyhedron/membytes1.cc (1.8): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 13:44  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (1.22): Fixed some typos in the
+	  documentation, thanks to Sebastian Pop.
+
+2006-09-21 Thursday 13:28  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.7): Removed a redundant
+	  assertion 'assert(OK())' from the method		void
+	  Octagonal_Shape<T>::map_space_dimensions().
+
+2006-09-21 Thursday 13:19  Andrea Cimino
+
+	* tests/Polyhedron/maxspacedim1.cc (1.9): Modified to be compliant
+	  to the new standards.
+
+2006-09-21 Thursday 13:16  Andrea Cimino
+
+	* tests/Polyhedron/matrix1.cc (1.7): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 13:11  Andrea Cimino
+
+	* tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.7): Modified
+	  to be compliant to the new standards.
+
+2006-09-21 Thursday 13:08  Andrea Cimino
+
+	* tests/Polyhedron/append2.cc (1.8): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 13:04  Elena Mazzi
+
+	* src/: BD_Shape.inlines.hh (1.125), BD_Shape.templates.hh (1.16):
+	  Removed some redundant assertions `assert(OK())' from:  -
+	  concatenate_assign();  - map_space_dimensions();  -
+	  limited_CC76_extrapolation_assign();	-
+	  limited_BHMZ05_extrapolation_assign();  -
+	  generalized_affine_image();  - generalized_affine_preimage();  -
+	  BD_Shape(const Generator_System& gs);  - BD_Shape(const
+	  Constraint_System& cs).
+
+2006-09-21 Thursday 12:55  Andrea Cimino
+
+	* tests/Polyhedron/append1.cc (1.9): Modified to be compliant to
+	  the new standards.
+
+2006-09-21 Thursday 12:45  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.6): Removed a redundant
+	  assertion 'assert(OK())' from the method	   void
+	  Octagonal_Shape<T>::concatenate_assign().
+
+2006-09-21 Thursday 12:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (1.5): Removed a redundant
+	  assertion 'assert(OK())' from the constructor
+	  Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs).
+
+2006-09-21 Thursday 11:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: MIP_Problem.cc (1.1), MIP_Problem.defs.hh (1.1),
+	  MIP_Problem.inlines.hh (1.1), MIP_Problem.templates.hh (1.1),
+	  MIP_Problem.types.hh (1.1), Makefile.am (1.159): MIP_Problem
+	  files put under CVS control.
+
+2006-09-21 Thursday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (altnum.1): file MIP_Problem.types.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-21 Thursday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (interfaces.1): file
+	  MIP_Problem.types.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-21 Thursday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/MIP_Problem.types.hh (octagons.1): file MIP_Problem.types.hh
+	  was added on branch octagons on 2006-11-18 20:36:50 +0000
+
+2006-09-21 Thursday 11:24  Andrea Cimino
+
+	* tests/Polyhedron/exceptions3.cc (1.9): Made exceptions3.cc more
+	  compliant to the new test policy.
+
+2006-09-21 Thursday 11:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.21): LP_Problem now only depends on the
+	  name of class Constraint_System.
+
+2006-09-21 Thursday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.32): Removed useless friend
+	  declaration.
+
+2006-09-21 Thursday 11:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (1.2): Corrected a couple of
+	  Doxygen \relates commands.
+
+2006-09-21 Thursday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (altnum.1): file
+	  iterator_to_const.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-21 Thursday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (interfaces.1): file
+	  iterator_to_const.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-21 Thursday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.inlines.hh (octagons.1): file
+	  iterator_to_const.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-21 Thursday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_Expression.defs.hh (1.31): Avoid useless inclusion.
+
+2006-09-21 Thursday 11:12  Andrea Cimino
+
+	* tests/Polyhedron/exceptions2.cc (1.10): Made exceptions2.cc more
+	  compliant to the new test policy.
+
+2006-09-21 Thursday 10:46  Andrea Cimino
+
+	* tests/Polyhedron/exceptions1.cc (1.11): The exceptions tests are
+	  now more consistent to what defined in STANDARDS.
+
+2006-09-21 Thursday 10:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.76), devref.doxyconf-latex.in
+	  (1.15): Let iterator_to_const.*, Ask_Tell.* and
+	  Pointset_Ask_Tell.* files participate to the generation of the
+	  devref manuals.
+
+2006-09-21 Thursday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.20): A few further improvements to the
+	  devref documentation.
+
+2006-09-21 Thursday 10:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.19): Do not let the user assume that we
+	  solve the LP Problem by using a fixed algorithm (future releases
+	  may use a different one).
+
+2006-09-21 Thursday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.18): Corrected documentation for
+	  add_constraints.
+
+2006-09-21 Thursday 09:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.17): A few improvements to the
+	  documentation.  Declare the std::swap specialization before
+	  defining it.
+
+2006-09-21 Thursday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Pointset_Ask_Tell.defs.hh (1.2),
+	  Pointset_Ask_Tell.templates.hh (1.3): Unwanted stuff removed.
+
+2006-09-21 Thursday 07:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (1.16): Dratfed some initial user
+	  documentation for LP_Problem.
+
+2006-09-20 Wednesday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.12), Ask_Tell.templates.hh (1.5),
+	  Pointset_Ask_Tell.templates.hh (1.2): Implemented
+	  Ask_Tell::empty(), Pointset_Ask_Tell::concatenate_assign(),
+	  Pointset_Ask_Tell::remove_space_dimensions() and
+	  Pointset_Ask_Tell::remove_higher_space_dimensions().
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (altnum.1): file powerset1.cc was
+	  added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.12), FCAIBVP.cc (1.1), FCAIBVP.defs.hh (1.1),
+	  FCAIBVP.inlines.hh (1.1), FCAIBVP.types.hh (1.1), Makefile.am
+	  (1.258), Partial_Function.cc (1.3), ppl_test.hh (1.50),
+	  Ask_Tell/append1.cc (1.2), Polyhedron/powerset1.cc (1.18): New
+	  test class FCAIBVP used to factorize some common code.  Missing
+	  inclusions added.
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (altnum.1): file FCAIBVP.cc was added on branch
+	  altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.cc (interfaces.1): file FCAIBVP.cc was added on
+	  branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (altnum.1): file FCAIBVP.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (interfaces.1): file FCAIBVP.types.hh was
+	  added on branch interfaces on 2006-09-28 20:46:30 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/FCAIBVP.types.hh (octagons.1): file FCAIBVP.types.hh was
+	  added on branch octagons on 2006-11-18 20:36:53 +0000
+
+2006-09-20 Wednesday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.cc (altnum.1): file Partial_Function.cc
+	  was added on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (altnum.1): file .cvsignore was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (interfaces.1): file .cvsignore was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (octagons.1): file .cvsignore was added
+	  on branch octagons on 2006-11-18 20:36:55 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/.cvsignore (simplex.1): file .cvsignore was added
+	  on branch simplex on 2008-01-07 11:15:35 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (interfaces.1): file Makefile.am was
+	  added on branch interfaces on 2006-09-28 20:46:31 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Ask_Tell/Makefile.am (octagons.1): file Makefile.am was
+	  added on branch octagons on 2006-11-18 20:36:55 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (altnum.1): file Pointset_Ask_Tell.cc
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (interfaces.1): file
+	  Pointset_Ask_Tell.cc was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.cc (octagons.1): file Pointset_Ask_Tell.cc
+	  was added on branch octagons on 2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (altnum.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (interfaces.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.inlines.hh (octagons.1): file
+	  Pointset_Ask_Tell.inlines.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (altnum.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (interfaces.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Ask_Tell.types.hh (octagons.1): file
+	  Pointset_Ask_Tell.types.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (altnum.1): file Pointset_Powerset.cc
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.cc (interfaces.1): file
+	  Pointset_Powerset.cc was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.inlines.hh (interfaces.1): file
+	  Pointset_Powerset.inlines.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (altnum.1): file
+	  iterator_to_const.types.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (interfaces.1): file
+	  iterator_to_const.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/iterator_to_const.types.hh (octagons.1): file
+	  iterator_to_const.types.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-20 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.197), configure.ac (1.236), src/Ask_Tell.defs.hh (1.13),
+	  src/Ask_Tell.templates.hh (1.4), src/Makefile.am (1.158),
+	  src/Pointset_Ask_Tell.cc (1.1), src/Pointset_Ask_Tell.defs.hh
+	  (1.1), src/Pointset_Ask_Tell.inlines.hh (1.1),
+	  src/Pointset_Ask_Tell.templates.hh (1.1),
+	  src/Pointset_Ask_Tell.types.hh (1.1), src/Pointset_Powerset.cc
+	  (1.2), src/Pointset_Powerset.inlines.hh (1.2),
+	  src/Pointset_Powerset.templates.hh (1.2), src/Powerset.defs.hh
+	  (1.27), src/Powerset.inlines.hh (1.18),
+	  src/iterator_to_const.defs.hh (1.1),
+	  src/iterator_to_const.inlines.hh (1.1),
+	  src/iterator_to_const.types.hh (1.1), tests/Makefile.am (1.257),
+	  tests/Ask_Tell/.cvsignore (1.1), tests/Ask_Tell/Makefile.am
+	  (1.1), tests/Ask_Tell/append1.cc (1.1),
+	  tests/Polyhedron/powerset1.cc (1.17): The classes
+	  Powerset::omega_iterator and Powerset::omega_const_iterator have
+	  been replaced by the classes template <typename Container>
+	  iterator_to_const and template <typename Container> const
+	  iterator_to_const.  Implementation of the Ask_Tell class is
+	  almost complete.  Added a first sketch (mostly obtained by
+	  copy-and-paste) of the new class Pointset_Ask_Tell.
+
+2006-09-20 Wednesday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: ppl_xsb.H (1.49), ppl_xsb.cc (1.91),
+	  xsb_pl_check.P (1.26): Adapted to the chnages in the LP_Problem
+	  interface.
+
+2006-09-20 Wednesday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.7): Fixed a bug in print_clock().
+
+2006-09-20 Wednesday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.196): Added a short description of the new features
+	  provided by LP_Problem.
+
+2006-09-20 Wednesday 09:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.47): Adapted to the new LP_Problem
+	  interface.
+
+2006-09-20 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.15),
+	  src/Octagonal_Shape.templates.hh (1.4),
+	  src/Polyhedron.templates.hh (1.3), src/Polyhedron_nonpublic.cc
+	  (1.66), interfaces/C/ppl_c.cc (1.154), interfaces/C/ppl_c.h.in
+	  (1.65), interfaces/Prolog/Prolog_interface.dox (1.155),
+	  interfaces/Prolog/ppl_prolog.icc (1.179),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.21),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.90),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.61),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.94),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.124),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.118),
+	  interfaces/Prolog/tests/pl_check.pl (1.32): Adapted to the new
+	  LP_Problem interface.
+
+2006-09-20 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.157): Do consider new source file
+	  LP_Problem.templates.hh.
+
+2006-09-20 Wednesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.33), LP_Problem.defs.hh (1.15),
+	  LP_Problem.inlines.hh (1.11), LP_Problem.templates.hh (1.1): The
+	  constructors of LP_Problem now take the space dimension as an
+	  explicit argument. Exception thrown if this exceeds the maximum
+	  allowed space dim.  Adding a constraint no longer automatically
+	  adjusts space dimensions; exception thrown if the space dimension
+	  of the constraint exceeds that of the LP_Problem; the latter can
+	  be extended by new method add_space_dimensions_and_embed.  Method
+	  constraints() returning (a copy of) the constraint system
+	  defining the feasible region replaced by const_iterator's
+	  (constraints_begin() and constraints_end()). Also added a
+	  templatic method that adds a sequence of constraints using
+	  iterators.
+
+2006-09-20 Wednesday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.templates.hh (interfaces.1): file
+	  LP_Problem.templates.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-20 Wednesday 08:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.16): Work around bugs in GCC
+	  3.3.3.
+
+2006-09-19 Tuesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.195): Introduce the new Octagonal_Shape class.
+
+2006-09-19 Tuesday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (1.3): Indentation fixes.  Never
+	  leave an operator at end of line.  Useless inclusions removed.
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage1.cc (interfaces.1): file
+	  affineimage1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (altnum.1): file
+	  affineimage2.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (interfaces.1): file
+	  affineimage2.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affineimage2.cc (octagons.1): file
+	  affineimage2.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage1.cc (interfaces.1): file
+	  affinepreimage1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (altnum.1): file
+	  affinepreimage2.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (interfaces.1): file
+	  affinepreimage2.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinepreimage2.cc (octagons.1): file
+	  affinepreimage2.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/ascii_dump_load1.cc (altnum.1): file
+	  ascii_dump_load1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/ascii_dump_load1.cc (interfaces.1): file
+	  ascii_dump_load1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/ascii_dump_load1.cc (octagons.1): file
+	  ascii_dump_load1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhmz05widening1.cc (interfaces.1): file
+	  bhmz05widening1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (altnum.1): file
+	  bhz03widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (interfaces.1): file
+	  bhz03widening1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bhz03widening1.cc (octagons.1): file
+	  bhz03widening1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (altnum.1): file bounded1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (interfaces.1): file
+	  bounded1.cc was added on branch interfaces on 2006-09-28 20:46:32
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/bounded1.cc (octagons.1): file bounded1.cc
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76extrapolation1.cc (interfaces.1): file
+	  cc76extrapolation1.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/cc76narrowing1.cc (interfaces.1): file
+	  cc76narrowing1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (altnum.1): file chinainit.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (interfaces.1): file
+	  chinainit.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/chinainit.cc (octagons.1): file
+	  chinainit.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (altnum.1): file
+	  concatenate1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (interfaces.1): file
+	  concatenate1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/concatenate1.cc (octagons.1): file
+	  concatenate1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (altnum.1): file
+	  constraints1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (interfaces.1): file
+	  constraints1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/constraints1.cc (octagons.1): file
+	  constraints1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (altnum.1): file empty1.cc was
+	  added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (interfaces.1): file empty1.cc
+	  was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/empty1.cc (octagons.1): file empty1.cc was
+	  added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (altnum.1): file
+	  fromgensys1.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (interfaces.1): file
+	  fromgensys1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/fromgensys1.cc (octagons.1): file
+	  fromgensys1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (altnum.1): file
+	  frompolyhedron1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (interfaces.1): file
+	  frompolyhedron1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/frompolyhedron1.cc (octagons.1): file
+	  frompolyhedron1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (altnum.1): file
+	  generalizedaffineimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (interfaces.1):
+	  file generalizedaffineimage1.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage1.cc (octagons.1):
+	  file generalizedaffineimage1.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (altnum.1): file
+	  generalizedaffineimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (interfaces.1):
+	  file generalizedaffineimage2.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage2.cc (octagons.1):
+	  file generalizedaffineimage2.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (altnum.1): file
+	  generalizedaffineimage4.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (interfaces.1):
+	  file generalizedaffineimage4.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage4.cc (octagons.1):
+	  file generalizedaffineimage4.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (altnum.1): file
+	  generalizedaffineimage5.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (interfaces.1):
+	  file generalizedaffineimage5.cc was added on branch interfaces on
+	  2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffineimage5.cc (octagons.1):
+	  file generalizedaffineimage5.cc was added on branch octagons on
+	  2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage1.cc
+	  (interfaces.1): file generalizedaffinepreimage1.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage3.cc
+	  (interfaces.1): file generalizedaffinepreimage3.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc (altnum.1):
+	  file generalizedaffinepreimage4.cc was added on branch altnum on
+	  2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc
+	  (interfaces.1): file generalizedaffinepreimage4.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/generalizedaffinepreimage4.cc (octagons.1):
+	  file generalizedaffinepreimage4.cc was added on branch octagons
+	  on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/intersection1.cc (interfaces.1): file
+	  intersection1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
+	  (interfaces.1): file limitedbhmz05extrapolation1.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/limitedcc76extrapolation1.cc
+	  (interfaces.1): file limitedcc76extrapolation1.cc was added on
+	  branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (altnum.1): file
+	  mapspacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/mapspacedims1.cc (interfaces.1): file
+	  mapspacedims1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim.cc (altnum.1): file
+	  maxspacedim.cc was added on branch altnum on 2006-10-29 19:27:31
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/maxspacedim.cc (interfaces.1): file
+	  maxspacedim.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/minconstraints1.cc (interfaces.1): file
+	  minconstraints1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octdifference1.cc (interfaces.1): file
+	  octdifference1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/octhull1.cc (interfaces.1): file
+	  octhull1.cc was added on branch interfaces on 2006-09-28 20:46:32
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (altnum.1): file
+	  relatwithcons1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (interfaces.1): file
+	  relatwithcons1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons1.cc (octagons.1): file
+	  relatwithcons1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithcons2.cc (interfaces.1): file
+	  relatwithcons2.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/relatwithgen1.cc (interfaces.1): file
+	  relatwithgen1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/removespacedims1.cc (interfaces.1): file
+	  removespacedims1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (altnum.1): file run_tests was
+	  added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (interfaces.1): file run_tests
+	  was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/run_tests (octagons.1): file run_tests was
+	  added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/timeelapse1.cc (interfaces.1): file
+	  timeelapse1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (altnum.1): file universe1.cc
+	  was added on branch altnum on 2006-10-29 19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (interfaces.1): file
+	  universe1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/universe1.cc (octagons.1): file
+	  universe1.cc was added on branch octagons on 2006-11-18 20:36:59
+	  +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (altnum.1): file .cvsignore was
+	  added on branch altnum on 2006-10-29 19:27:30 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (interfaces.1): file .cvsignore
+	  was added on branch interfaces on 2006-09-28 20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (octagons.1): file .cvsignore
+	  was added on branch octagons on 2006-11-18 20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/.cvsignore (simplex.1): file .cvsignore was
+	  added on branch simplex on 2008-01-07 11:15:37 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (altnum.1): file
+	  addspacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:31 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (interfaces.1): file
+	  addspacedims1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/addspacedims1.cc (octagons.1): file
+	  addspacedims1.cc was added on branch octagons on 2006-11-18
+	  20:36:59 +0000
+
+2006-09-19 Tuesday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Octagonal_Shape/affinedimension1.cc (interfaces.1): file
+	  affinedimension1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.235), tests/Makefile.am (1.256),
+	  tests/Octagonal_Shape/.cvsignore (1.1),
+	  tests/Octagonal_Shape/Makefile.am (1.1),
+	  tests/Octagonal_Shape/addspacedims1.cc (1.1),
+	  tests/Octagonal_Shape/affinedimension1.cc (1.1),
+	  tests/Octagonal_Shape/affineimage1.cc (1.1),
+	  tests/Octagonal_Shape/affineimage2.cc (1.1),
+	  tests/Octagonal_Shape/affinepreimage1.cc (1.1),
+	  tests/Octagonal_Shape/affinepreimage2.cc (1.1),
+	  tests/Octagonal_Shape/ascii_dump_load1.cc (1.1),
+	  tests/Octagonal_Shape/bhmz05widening1.cc (1.1),
+	  tests/Octagonal_Shape/bhz03widening1.cc (1.1),
+	  tests/Octagonal_Shape/bounded1.cc (1.1),
+	  tests/Octagonal_Shape/cc76extrapolation1.cc (1.1),
+	  tests/Octagonal_Shape/cc76narrowing1.cc (1.1),
+	  tests/Octagonal_Shape/chinainit.cc (1.1),
+	  tests/Octagonal_Shape/concatenate1.cc (1.1),
+	  tests/Octagonal_Shape/constraints1.cc (1.1),
+	  tests/Octagonal_Shape/contains1.cc (1.1),
+	  tests/Octagonal_Shape/empty1.cc (1.1),
+	  tests/Octagonal_Shape/fromgensys1.cc (1.1),
+	  tests/Octagonal_Shape/frompolyhedron1.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage1.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage2.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage3.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage4.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffineimage5.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage1.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage2.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage3.cc (1.1),
+	  tests/Octagonal_Shape/generalizedaffinepreimage4.cc (1.1),
+	  tests/Octagonal_Shape/intersection1.cc (1.1),
+	  tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc (1.1),
+	  tests/Octagonal_Shape/limitedcc76extrapolation1.cc (1.1),
+	  tests/Octagonal_Shape/mapspacedims1.cc (1.1),
+	  tests/Octagonal_Shape/maxspacedim.cc (1.1),
+	  tests/Octagonal_Shape/minconstraints1.cc (1.1),
+	  tests/Octagonal_Shape/octdifference1.cc (1.1),
+	  tests/Octagonal_Shape/octhull1.cc (1.1),
+	  tests/Octagonal_Shape/relatwithcons1.cc (1.1),
+	  tests/Octagonal_Shape/relatwithcons2.cc (1.1),
+	  tests/Octagonal_Shape/relatwithgen1.cc (1.1),
+	  tests/Octagonal_Shape/removespacedims1.cc (1.1),
+	  tests/Octagonal_Shape/run_tests (1.1),
+	  tests/Octagonal_Shape/timeelapse1.cc (1.1),
+	  tests/Octagonal_Shape/universe1.cc (1.1),
+	  tests/Octagonal_Shape/writeoctagon1.cc (1.1): Directory
+	  tests/Octagon renamed tests/Octagonal_Shape.
+
+2006-09-19 Tuesday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.90): Reverted previous change
+	  (it was only meant for XSB 3.0.1).
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bgp99extrapolation1.cc (altnum.1): file
+	  bgp99extrapolation1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bhz03widening1.cc (altnum.1): file
+	  bhz03widening1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/geomcovers1.cc (altnum.1): file geomcovers1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/membytes1.cc (altnum.1): file membytes1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (altnum.1): file
+	  pointsetpowerset1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/pointsetpowerset1.cc (interfaces.1): file
+	  pointsetpowerset1.cc was added on branch interfaces on 2006-09-28
+	  20:46:32 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (altnum.1): file
+	  Pointset_Powerset.types.hh was added on branch altnum on
+	  2006-10-29 19:27:14 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (interfaces.1): file
+	  Pointset_Powerset.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Pointset_Powerset.types.hh (octagons.1): file
+	  Pointset_Powerset.types.hh was added on branch octagons on
+	  2006-11-18 20:36:51 +0000
+
+2006-09-19 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.194), instchk.hh (1.5), doc/devref.doxyconf-html.in
+	  (1.75), doc/devref.doxyconf-latex.in (1.14),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.89), src/Makefile.am (1.156),
+	  src/Pointset_Powerset.cc (1.1), src/Pointset_Powerset.defs.hh
+	  (1.1), src/Pointset_Powerset.inlines.hh (1.1),
+	  src/Pointset_Powerset.templates.hh (1.1),
+	  src/Pointset_Powerset.types.hh (1.1), src/Polyhedra_Powerset.cc
+	  (1.7), src/Polyhedra_Powerset.defs.hh (1.37),
+	  src/Polyhedra_Powerset.inlines.hh (1.43),
+	  src/Polyhedra_Powerset.templates.hh (1.5),
+	  src/Polyhedra_Powerset.types.hh (1.5),
+	  src/Widening_Function.defs.hh (1.15),
+	  src/Widening_Function.inlines.hh (1.13), src/algorithms.hh
+	  (1.46), src/max_space_dimension.hh (1.8), tests/print.hh (1.37),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.8),
+	  tests/BD_Shape/bhz03widening1.cc (1.8),
+	  tests/BD_Shape/geomcovers1.cc (1.8), tests/Grid/bhz03widening1.cc
+	  (1.10), tests/Grid/membytes1.cc (1.7),
+	  tests/Polyhedron/Makefile.am (1.97),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.11),
+	  tests/Polyhedron/bhz03widening1.cc (1.11),
+	  tests/Polyhedron/exceptions1.cc (1.10),
+	  tests/Polyhedron/geomcovers1.cc (1.12),
+	  tests/Polyhedron/linearpartition1.cc (1.9),
+	  tests/Polyhedron/maxspacedim1.cc (1.8), tests/Polyhedron/mc91.cc
+	  (1.13), tests/Polyhedron/membytes2.cc (1.7),
+	  tests/Polyhedron/pointsetpowerset1.cc (1.1),
+	  tests/Polyhedron/polydifference1.cc (1.9),
+	  tests/Polyhedron/polypowerset1.cc (1.21),
+	  tests/Polyhedron/timeelapse1.cc (1.9): The Polyhedra_Powerset
+	  template class has been renamed Pointset_Powerset.
+
+2006-09-19 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.42),
+	  src/Polyhedra_Powerset.templates.hh (1.4), src/Powerset.defs.hh
+	  (1.26), src/Powerset.inlines.hh (1.17), src/Powerset.templates.hh
+	  (1.3), tests/Polyhedron/powerset1.cc (1.15): Powerset
+	  implementation made more lazy.  Fixed a couple of FIXMEs.
+	  Methods Powerset::add_non_bottom_disjunct() renamed
+	  add_non_bottom_disjunct_preserve_reduction(), since the true
+	  emphasis is on preserving reduction.	This required the addition
+	  of two FIXMEs concerning the implementation of
+	  Polyhedra_Powerset, as it is not clear whether the preservation
+	  of reduction was an issue there.
+
+2006-09-19 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.templates.hh (altnum.1): file Powerset.templates.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-19 Tuesday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.14): Adhere to the our standards
+	  for test programs.  Two more tests added.  Added also a FIXME.
+
+2006-09-19 Tuesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.defs.hh (altnum.1): file
+	  Grid_Generator.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-09-19 Tuesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.idefs.hh (altnum.1): file Grid_Status.idefs.hh
+	  was added on branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-09-19 Tuesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.19), BD_Shape.defs.hh (1.73),
+	  Congruence_System.defs.hh (1.15), Constraint.defs.hh (1.123),
+	  Constraint_System.defs.hh (1.31), DB_Matrix.defs.hh (1.23),
+	  Direct_Product.defs.hh (1.28), Generator.defs.hh (1.120),
+	  Generator_System.defs.hh (1.19), Grid.defs.hh (1.28),
+	  Grid_Generator.defs.hh (1.26), Grid_Generator_System.defs.hh
+	  (1.18), Grid_Status.idefs.hh (1.5), LP_Problem.defs.hh (1.14),
+	  Linear_Expression.defs.hh (1.30), Linear_Row.defs.hh (1.22),
+	  Linear_System.defs.hh (1.27), Matrix.defs.hh (1.78),
+	  OR_Matrix.defs.hh (1.4), Octagonal_Shape.defs.hh (1.4),
+	  Og_Status.idefs.hh (1.4), Ph_Status.idefs.hh (1.19),
+	  Polyhedra_Powerset.defs.hh (1.36), Polyhedron.defs.hh (1.304),
+	  Row.defs.hh (1.108), Saturation_Matrix.defs.hh (1.10): Fixed the
+	  references (in the documentation) to the various
+	  ascii_dump(std::ostream&) const methods.
+
+2006-09-19 Tuesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.25): Use vertical spacing to improve
+	  readability.
+
+2006-09-19 Tuesday 08:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.12), Ask_Tell.inlines.hh (1.11),
+	  Ask_Tell.templates.hh (1.3): Started making normalization lazy.
+
+2006-09-18 Monday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.18), BD_Shape.defs.hh (1.72),
+	  Congruence_System.defs.hh (1.14), Constraint.defs.hh (1.122),
+	  Constraint_System.defs.hh (1.30), DB_Matrix.defs.hh (1.22),
+	  Direct_Product.defs.hh (1.27), Generator.defs.hh (1.119),
+	  Generator_System.defs.hh (1.18), Grid.defs.hh (1.27),
+	  Grid_Generator.defs.hh (1.25), Grid_Generator_System.defs.hh
+	  (1.17), Grid_Status.idefs.hh (1.4), LP_Problem.defs.hh (1.13),
+	  Linear_Expression.defs.hh (1.29), Linear_Row.defs.hh (1.21),
+	  Linear_System.defs.hh (1.26), Matrix.defs.hh (1.77),
+	  OR_Matrix.defs.hh (1.3), Octagonal_Shape.defs.hh (1.3),
+	  Og_Status.idefs.hh (1.3), Ph_Status.idefs.hh (1.18),
+	  Polyhedra_Powerset.defs.hh (1.35), Polyhedron.defs.hh (1.303),
+	  Row.defs.hh (1.107), Saturation_Matrix.defs.hh (1.9): Fixed
+	  documentation references to the various ascii_dump(std::ostream&)
+	  methods (this, unfortunately triggers a Doxygen bug, see
+	  http://bugzilla.gnome.org/show_bug.cgi?id=356597).  Other
+	  documentation fixes.
+
+2006-09-18 Monday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.11), Ask_Tell.inlines.hh (1.10),
+	  Ask_Tell.templates.hh (1.2): The former engine() method is now
+	  called normalize().  New method bool is_normalized() const.
+
+2006-09-18 Monday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.10), Ask_Tell.inlines.hh (1.9),
+	  Ask_Tell.templates.hh (1.1): Halfway through the rewriting of the
+	  Ask_Tell template class.
+
+2006-09-18 Monday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.templates.hh (1.2), tests/Polyhedron/append2.cc
+	  (1.7): Indentation fixed.
+
+2006-09-17 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_pchk_int8 (1.4),
+	  tests/expected_pchk_int8 (1.8): Updated to reflect the new
+	  implementations of simplex.
+
+2006-09-17 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8 (altnum.1): file
+	  expected_pchk_int8 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-09-17 Sunday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8 (altnum.1): file
+	  expected_pchk_int8 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-09-17 Sunday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.13): Fixed the implementations
+	  of Fcaibvp::upper_bound_assign(const Fcaibvp&) and
+	  Fcaibvp::meet_assign(const Fcaibvp&) (they were swapped).
+
+2006-09-17 Sunday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.12): Fixed a bug in
+	  operator<<(std::ostream&, const Fcaibvp&).
+
+2006-09-16 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.9), Ask_Tell.inlines.hh (1.8),
+	  Ask_Tell.types.hh (1.5): Complete rewriting of the Ask_Tell
+	  template class started.
+
+2006-09-15 Friday 16:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Grid_Generator.cc (1.17): Backtracking previous change as far
+	  as Grid_Generator is concerned.
+
+2006-09-15 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.194): Remember to advertise the failure of GCC 3.4.x to
+	  compile the PPL correctly.
+
+2006-09-15 Friday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.12), Constraint.cc (1.63), Generator.cc
+	  (1.72), Grid_Generator.cc (1.16): Added some missing sanity
+	  checks to a few OK() methods:  - Constraint::OK() and
+	  Generator::OK() no also check that the corresponding	  object is
+	  a valid Linear_Row;  - Congruence::OK() checks that the object is
+	  a valid Row;	- Grid_Generator::OK() check that the object is a
+	  valid Generator.
+
+2006-09-15 Friday 11:54  Andrea Cimino
+
+	* src/: LP_Problem.cc (1.32), LP_Problem.defs.hh (1.12): Minor
+	  stylistic changes.  Unused method definition removed.
+
+2006-09-14 Thursday 17:52  Andrea Cimino
+
+	* src/LP_Problem.cc (1.31): Fixed a bug in LP_Problem::ascii_load()
+
+2006-09-14 Thursday 11:34  Andrea Cimino
+
+	* src/LP_Problem.cc (1.30): Test that every member used in
+	  LP_Problem is OK.  Fixed a bug in ascii_load().  Added a test
+	  concerning ascii_dump/ascii_load.
+
+2006-09-14 Thursday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Expression.cc (1.15), Linear_Row.cc (1.20),
+	  Linear_Row.defs.hh (1.20), Row.cc (1.100), Row.defs.hh (1.106):
+	  Added method OK(), taking no arguments, to classes Row and
+	  Linear_Row.  The OK() method for Linear_Expression modified
+	  accordingly (previous implementation may have resulted in false
+	  alarms, i.e., returning false even when the object was well
+	  formed).
+
+2006-09-13 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.35): Every OK() methods must take care of
+	  reporting its own failures: redundant prints avoided.
+
+2006-09-13 Wednesday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.46): Made C99 compliant (we were
+	  using C++-style comments and declaring variables in the middle of
+	  body functions).
+
+2006-09-13 Wednesday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.45): Variables renamed to improve
+	  readability.
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: ppl-config_extra_man_text (1.1), ppl_lcdd_extra_man_text
+	  (1.1), ppl_lpsol_extra_man_text (1.1), prog2man (1.1):
+	  Provisional machinery to automatically build the man pages put
+	  under CVS control.
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (altnum.1): file
+	  ppl-config_extra_man_text was added on branch altnum on
+	  2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (interfaces.1): file
+	  ppl-config_extra_man_text was added on branch interfaces on
+	  2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config_extra_man_text (octagons.1): file
+	  ppl-config_extra_man_text was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (altnum.1): file
+	  ppl_lcdd_extra_man_text was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (interfaces.1): file
+	  ppl_lcdd_extra_man_text was added on branch interfaces on
+	  2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd_extra_man_text (octagons.1): file
+	  ppl_lcdd_extra_man_text was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (altnum.1): file
+	  ppl_lpsol_extra_man_text was added on branch altnum on 2006-10-29
+	  19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (interfaces.1): file
+	  ppl_lpsol_extra_man_text was added on branch interfaces on
+	  2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol_extra_man_text (octagons.1): file
+	  ppl_lpsol_extra_man_text was added on branch octagons on
+	  2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (altnum.1): file prog2man was added on branch altnum
+	  on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (interfaces.1): file prog2man was added on branch
+	  interfaces on 2006-09-28 20:46:26 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (octagons.1): file prog2man was added on branch
+	  octagons on 2006-11-18 20:36:43 +0000
+
+2006-09-13 Wednesday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/prog2man (simplex.1): file prog2man was added on branch
+	  simplex on 2008-01-07 11:15:27 +0000
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: ppl-config.1 (1.4), ppl_lcdd.1 (1.2), ppl_lpsol.1 (1.2):
+	  Updated.
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (altnum.1): file ppl-config.1 was added on
+	  branch altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd.1 (altnum.1): file ppl_lcdd.1 was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol.1 (altnum.1): file ppl_lpsol.1 was added on branch
+	  altnum on 2006-10-29 19:26:56 +0000
+
+2006-09-13 Wednesday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.44): Added the --version (-V)
+	  option.  The brief version of the --max-memory option is now -R.
+	  Help text revised.  The --help (-h) option now prints to stdout,
+	  as it should.  Fixed a couple of error messages.  Silenced a
+	  couple of compiler warnings.
+
+2006-09-13 Wednesday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.43): Now the --check option
+	  accepts an option parameter specifying the threshold with which
+	  optima are checked.
+
+2006-09-13 Wednesday 12:46  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.42): `check_threshold' is now set
+	  to a proper value.
+
+2006-09-13 Wednesday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.41): Fixed a bug whereby the abs()
+	  function was used instead of fabs().
+
+2006-09-13 Wednesday 12:17  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.40): MIP problems now are treated
+	  as LP ones.
+
+2006-09-13 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.193): New item added.
+
+2006-09-13 Wednesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.39): Redundant test avoided.
+
+2006-09-13 Wednesday 11:09  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.38): Deallocate `optimum' only if
+	  an optimum is found.
+
+2006-09-13 Wednesday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.37): The `optimum' variable was
+	  cleared too early.  Make GLPK silent when NDEBUG is defined.
+
+2006-09-13 Wednesday 09:33  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.36): Modified ppl_lpsol.c to
+	  compile.  Properly checked if an LP Problem is MIP or not.
+
+2006-09-12 Tuesday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.35): Typo fixed.  The --check
+	  options is still not working, as the call to lpx_get_num_int()
+	  aborts the program immediately.
+
+2006-09-12 Tuesday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.34): New draft implementation of
+	  the --check option.
+
+2006-09-12 Tuesday 18:14  Andrea Cimino
+
+	* src/LP_Problem.cc (1.29): Added some noisy output if something
+	  fails in LP_Problem::OK(). Removed a previous redundant check.
+
+2006-09-12 Tuesday 18:04  Andrea Cimino
+
+	* src/LP_Problem.cc (1.28): Antoher little test added in
+	  LP_Problem::OK().  Another FIXME dealt with.
+
+2006-09-12 Tuesday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.192), src/Direct_Product.defs.hh (1.26),
+	  src/Direct_Product.inlines.hh (1.24),
+	  tests/Grid/directproduct1.cc (1.21): Restored previous
+	  implementation of affine_relation() Improved several comments.
+
+2006-09-12 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (altnum.1): file directproduct1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-09-12 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (octagons.1): file directproduct1.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-12 Tuesday 12:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.234), tests/Makefile.am (1.255),
+	  tests/Polyhedron/Makefile.am (1.96),
+	  tests/Polyhedron/exceptions2.cc (1.9),
+	  tests/Polyhedron/lpproblem1.cc (1.10): Tests concerning the
+	  LP_Problem class have been moved into a separate directory.
+
+2006-09-11 Monday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_mpz (1.8), expected_mpz_a (1.8):
+	  Updated to reflect the new implementations of simplex and
+	  ppl_lpsol.
+
+2006-09-11 Monday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.27): IO_Operators::operator<<(std::ostream&,
+	  const LP_Problem&) now prints the correct optimization mode.
+	  Useless redundancy avoided in the same function.
+
+2006-09-11 Monday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int8_a (1.5): Updated to reflect the new
+	  implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 19:09  Andrea Cimino
+
+	* src/LP_Problem.cc (1.26): Removed a non wanted FIXME.
+
+2006-09-11 Monday 19:07  Andrea Cimino
+
+	* src/: LP_Problem.cc (1.25), LP_Problem.defs.hh (1.11):
+	  Implemented an initial version of the << operator.
+
+2006-09-11 Monday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int16_a (1.6): Updated to reflect the
+	  new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int32_a (1.7): Updated to reflect the
+	  new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int64_a (1.7): Updated to reflect the
+	  new implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int64 (1.7): Updated to reflect the new
+	  implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.6), expected_int32 (1.7):
+	  Updated to reflect the new implementations of simplex and
+	  ppl_lpsol.
+
+2006-09-11 Monday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_int8 (1.6): Updated to reflect the new
+	  implementations of simplex and ppl_lpsol.
+
+2006-09-11 Monday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.33): Added a newline in the error
+	  output.
+
+2006-09-11 Monday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.32): The error_handler() function
+	  now prints the error also to the output file, if any.
+
+2006-09-11 Monday 13:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.25), src/Direct_Product.inlines.hh
+	  (1.23), tests/Grid/directproduct1.cc (1.20): Changed
+	  implementation of affine_dimension() for Direct_Product to assume
+	  no reduction.  Revised comment for affine_dimension().  Revised
+	  test for affine_dimension().
+
+2006-09-10 Sunday 22:15  Andrea Cimino
+
+	* src/LP_Problem.cc (1.24): ascii_load() method implemented.
+	  Slightly modified ascii_dump() to allow ascii_load() working.
+
+2006-09-10 Sunday 11:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.191): Removed a todo item for the grid widening as this
+	  has been done.  Added - Direct_Product: Check that all comments
+	  and code are consistent with	 intended semantics.
+
+2006-09-10 Sunday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Direct_Product.defs.hh (1.24): Some comments improved.
+
+2006-09-10 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.23):
+	  LP_Problem::steepest_edge_entering_index() fixed.
+
+2006-09-09 Saturday 18:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Grid/: asciidumpload1.cc (1.12), asciidumpload3.cc (1.3),
+	  asciidumpload4.cc (1.3): Adjusted to match the recent change in
+	  ascii dump & load methods.
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload1.cc (altnum.1): file asciidumpload1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload3.cc (altnum.1): file asciidumpload3.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload3.cc (octagons.1): file asciidumpload3.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload4.cc (altnum.1): file asciidumpload4.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-09-09 Saturday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload4.cc (octagons.1): file asciidumpload4.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-09-09 Saturday 18:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.11), Grid_Generator.cc (1.15),
+	  Linear_Row.cc (1.19), Row.cc (1.99): Patched methods for ascii
+	  dump&load so as they also manage size information and perform any
+	  required allocation/deallocation.
+
+2006-09-09 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.22): Removed another bug due to assuming
+	  that Coefficient is a GMP integer.
+
+2006-09-09 Saturday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.67): Added missing \relates
+	  commands.  Long source lines avoided.
+
+2006-09-09 Saturday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_chdims.cc (1.10), Grid_simplify.cc (1.27),
+	  checked_ext.inlines.hh (1.32), checked_float.inlines.hh (1.66),
+	  checked_int.inlines.hh (1.53): Little code formatting
+	  improvements.
+
+2006-09-09 Saturday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.26), Grid_nonpublic.cc (1.19):
+	  Const-correctness improved.
+
+2006-09-09 Saturday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.21): assert(false) does not provide any real
+	  protection and should only be used in efficiency-critical inline
+	  functions.  Use throw std::runtime_error("PPL internal error")
+	  instead.
+
+2006-09-09 Saturday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.18): Simplified the logic of debugging
+	  code in Grid::normalize_divisors(Grid_Generator_System&,
+	  Grid_Generator_System&).
+
+2006-09-09 Saturday 13:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.20): Avoid creating temporaries.
+
+2006-09-09 Saturday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.19): Use floating point constants to
+	  initialize floatin point values.
+
+2006-09-09 Saturday 13:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.18): Do not assume Coefficient is a GMP
+	  integer.  Must include <cmath> for fabs().
+	  PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT re-enabled.
+
+2006-09-09 Saturday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.17): Replaced "can't", "don't", "doesn't",
+	  "aren't" by "cannot", "do not", "does not" and "are not".
+
+2006-09-09 Saturday 13:10  Andrea Cimino
+
+	* TODO (1.190): Don't confuse operator with method.
+
+2006-09-09 Saturday 13:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (altnum.1): file
+	  frompolyhedron1.cc was added on branch altnum on 2006-10-29
+	  19:27:22 +0000
+
+2006-09-09 Saturday 13:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (1.3): test01() fails with
+	  8-bit coefficients, but does not fail with 16-bit ones.
+
+2006-09-09 Saturday 13:07  Andrea Cimino
+
+	* TODO (1.189): Added a couple of items concering PPL::LP_Problem.
+
+2006-09-09 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Result.defs.hh (1.16), Result.inlines.hh (1.9): Functions
+	  Result classify(Result) and bool is_special(Result) documented.
+	  Useless inclusion removed.
+
+2006-09-09 Saturday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (1.4): Include <cassert>.
+
+2006-09-09 Saturday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (altnum.1): file
+	  Rounding_Dir.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-09-09 Saturday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Result.defs.hh (1.15), Result.inlines.hh (1.8): Removed the
+	  unused function Result sign(Result).
+
+2006-09-09 Saturday 09:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.95): Programs lpproblem2 and
+	  lpproblem3 no longer exist.
+
+2006-09-09 Saturday 08:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.9): test01() overflows with
+	  32-bit coefficients, but does not with 64-bit ones.
+
+2006-09-09 Saturday 08:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.188): Added an item concerning the covering of the
+	  LP_Problem code.
+
+2006-09-09 Saturday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.94), lpproblem1.cc (1.9),
+	  lpproblem2.cc (1.7), lpproblem3.cc (1.5): Tests for the
+	  LP_Problem class fixed and merged.
+
+2006-09-08 Friday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.193): Added some items, not to forget them.
+
+2006-09-08 Friday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.16): Avoid calling num_columns() on input_cs
+	  and pending_input_cs, since these constraint systems may be NNC
+	  and therefore have an extra column for the epsilon coefficient.
+	  Do call space_dimension(), instead, taking care of the offset.
+	  Adjusted some badly indented lines; adjusted some bad line
+	  breaks.
+
+2006-09-08 Friday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.233): Version number bumped.
+
+2006-09-08 Friday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.15): Temporarily set
+	  PPL_SIMPLEX_USE_STEEPEST_EDGE_FLOATING_POINT to 0.  This is to
+	  avoid trying to the expression fabs(raw_value(cost_j).get_d()),
+	  which only makes sense with GMP integer coefficients.
+
+2006-09-08 Friday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.187), demos/ppl_lpsol/ppl_lpsol.c (1.31),
+	  doc/devref.doxyconf-html.in (1.74), src/LP_Problem.cc (1.14),
+	  src/LP_Problem.defs.hh (1.10), src/LP_Problem.inlines.hh (1.10),
+	  src/Linear_Expression.cc (1.14), src/Linear_Expression.defs.hh
+	  (1.28), src/Linear_Expression.inlines.hh (1.9),
+	  tests/Polyhedron/Makefile.am (1.93),
+	  tests/Polyhedron/lpproblem1.cc (1.8),
+	  tests/Polyhedron/lpproblem2.cc (1.6),
+	  tests/Polyhedron/lpproblem3.cc (1.4): First (and, quite likely,
+	  last) merge of the `simplex' branch to the main trunk.
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (interfaces.1): file
+	  OR_Matrix.inlines.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.types.hh (altnum.1): file OR_Matrix.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.types.hh (interfaces.1): file OR_Matrix.types.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.cc (altnum.1): file Octagonal_Shape.cc was
+	  added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.cc (interfaces.1): file Octagonal_Shape.cc
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.types.hh (altnum.1): file
+	  Octagonal_Shape.types.hh was added on branch altnum on 2006-10-29
+	  19:27:14 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagonal_Shape.types.hh (interfaces.1): file
+	  Octagonal_Shape.types.hh was added on branch interfaces on
+	  2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (altnum.1): file
+	  checked_numeric_limits.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.defs.hh (altnum.1): file distances.defs.hh was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.defs.hh (interfaces.1): file distances.defs.hh was
+	  added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.inlines.hh (altnum.1): file distances.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.inlines.hh (interfaces.1): file
+	  distances.inlines.hh was added on branch interfaces on 2006-09-28
+	  20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.types.hh (altnum.1): file distances.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/distances.types.hh (interfaces.1): file distances.types.hh
+	  was added on branch interfaces on 2006-09-28 20:46:29 +0000
+
+2006-09-08 Friday 19:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.232), doc/definitions.dox (1.197),
+	  doc/devref.doxyconf-html.in (1.73), doc/devref.doxyconf-latex.in
+	  (1.13), src/Checked_Number.defs.hh (1.78),
+	  src/Checked_Number.inlines.hh (1.66), src/DB_Matrix.inlines.hh
+	  (1.27), src/DB_Row.defs.hh (1.19), src/Makefile.am (1.155),
+	  src/OR_Matrix.defs.hh (1.2), src/OR_Matrix.inlines.hh (1.2),
+	  src/OR_Matrix.templates.hh (1.2), src/OR_Matrix.types.hh (1.2),
+	  src/Octagonal_Shape.cc (1.2), src/Octagonal_Shape.defs.hh (1.2),
+	  src/Octagonal_Shape.inlines.hh (1.2),
+	  src/Octagonal_Shape.templates.hh (1.2),
+	  src/Octagonal_Shape.types.hh (1.2), src/Og_Status.idefs.hh (1.2),
+	  src/Og_Status.inlines.hh (1.2), src/Polyhedron.defs.hh (1.302),
+	  src/checked_numeric_limits.hh (1.16), src/distances.defs.hh
+	  (1.2), src/distances.inlines.hh (1.2), src/distances.types.hh
+	  (1.2), src/globals.defs.hh (1.39), src/globals.inlines.hh (1.15),
+	  tests/Makefile.am (1.254), tests/ppl_test.hh (1.49),
+	  tests/print.hh (1.36), tests/BD_Shape/addconstraints1.cc (1.14),
+	  tests/BD_Shape/addspacedims1.cc (1.12),
+	  tests/BD_Shape/affineimage1.cc (1.15),
+	  tests/BD_Shape/affinepreimage1.cc (1.15),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.13),
+	  tests/BD_Shape/bdsdifference1.cc (1.11),
+	  tests/BD_Shape/bdshull1.cc (1.11),
+	  tests/BD_Shape/bhmz05widening1.cc (1.11),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.15),
+	  tests/BD_Shape/cc76narrowing1.cc (1.15),
+	  tests/BD_Shape/concatenate1.cc (1.12),
+	  tests/BD_Shape/constraints1.cc (1.15),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.14),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.16),
+	  tests/BD_Shape/h79widening1.cc (1.11),
+	  tests/BD_Shape/intersection1.cc (1.14),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.10),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.11),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.11),
+	  tests/BD_Shape/mapspacedims1.cc (1.12),
+	  tests/BD_Shape/minconstraints1.cc (1.8),
+	  tests/BD_Shape/removespacedims1.cc (1.15),
+	  tests/BD_Shape/timeelapse1.cc (1.14), tests/BD_Shape/universe1.cc
+	  (1.12): First (and, quite likely, last) merge of the `octagons'
+	  branch to the main trunk.
+
+2006-09-08 Friday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.50): Improved strong
+	  closure implementation by better exploting data locality.  Also,
+	  avoid testing for +inf since it happens to slow down execution
+	  (octagonal matrices tend to become dense quite quickly).
+
+2006-09-08 Friday 13:37  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[64,32,23]): `is_artificial' is no longer used. Now the
+	  informations about artificial variables are handled just in the
+	  first phase of the simplex algorithm.
+
+2006-09-08 Friday 11:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.14): Initial, partial
+	  implementation of the `--check' option.  What remains to be done
+	  is specified in TODO comments.  The variable `check_optimum' has
+	  been renamed `check_results'.
+
+2006-09-08 Friday 10:21  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.13): Added a FIXME.
+
+2006-09-08 Friday 09:43  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.12): Added a white space.
+
+2006-09-08 Friday 09:40  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.11): Force `make check',
+	  temporarly commented out a `fatal()' call.
+
+2006-09-08 Friday 09:12  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.10): Fixed an unwanted
+	  carriage return.
+
+2006-09-07 Thursday 19:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.cc (1.10), Congruence.defs.hh (1.15),
+	  Congruence_System.cc (1.19), Constraint.cc (1.62), Generator.cc
+	  (1.71), Grid.templates.hh (1.17), Grid_Generator.cc (1.14),
+	  Grid_conversion.cc (1.14), Grid_nonpublic.cc (1.17),
+	  Grid_public.cc (1.34), Grid_simplify.cc (1.26),
+	  Linear_Expression.cc (1.13), Linear_Expression.defs.hh (1.27),
+	  Polyhedron.templates.hh (1.2), Polyhedron_public.cc (1.77):
+	  Prefer using TEMP_INTEGER to Coefficient where declaring an
+	  automatic variable.  Do not use
+	  Coefficient_traits::const_reference for automatic variable
+	  declarations: only use it when declaring formal parameter types.
+
+2006-09-07 Thursday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (simplex.63): Remember to generate auxiliary
+	  output function definitions as soon as we have an implementation
+	  of operator<<.
+
+2006-09-07 Thursday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (simplex.31): Use macro
+	  PPL_OUTPUT_DECLARATIONS.
+
+2006-09-07 Thursday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[62,30]):
+	  Useless inclusions avoided.
+
+2006-09-07 Thursday 16:35  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.61): Prefer neg_assign(x, y) to x =
+	  -y.
+
+2006-09-07 Thursday 16:18  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.60): Prefer `TEMP_INTEGER(x)' to
+	  `Coefficient x'.
+
+2006-09-07 Thursday 15:11  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.59): Restored ascii_dump().
+	  Indentation fixed.
+
+2006-09-07 Thursday 14:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Expression.cc, Linear_Expression.defs.hh,
+	  Linear_Expression.inlines.hh (simplex.[4,6,3]): Added ascii
+	  dump/load methods.
+
+2006-09-07 Thursday 13:45  Andrea Cimino
+
+	* src/: LP_Problem.cc, Linear_Expression.defs.hh (simplex.[58,5]):
+	  No more `friend' declarations.  Added a FIXME:
+	  ascii_dump(ostream) modified waiting for the
+	  Linear_Epression::ascii_dump(ostream) method.
+
+2006-09-07 Thursday 12:32  Andrea Cimino
+
+	* src/: Generator.defs.hh, LP_Problem.cc (simplex.[5,57]): Minor
+	  improvements. Avoided another `friend' declaration.
+
+2006-09-07 Thursday 10:37  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.56): Avoid using useless temporaries.
+
+2006-09-07 Thursday 10:25  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.55): A FIXME dealt with by using
+	  Generator::ascii_dump(ostream).
+
+2006-09-07 Thursday 10:15  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.54): Use abs_assign(x) instead of
+	  abs_assign(x, x).
+
+2006-09-07 Thursday 10:02  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.53): Specified what kind of macro we
+	  are referring to in important #endif statements.
+
+2006-09-07 Thursday 09:49  Andrea Cimino
+
+	* src/: Constraint.defs.hh, LP_Problem.cc (simplex.[5,52]): Removed
+	  the `friend' declaration from Constraint.defs.hh of the class
+	  LP_Problem using the public methods of the class Constraint. Some
+	  other little improvements.
+
+2006-09-06 Wednesday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.44), C_Polyhedron.inlines.hh
+	  (1.32): Fixed the parameter names of
+	  C_Polyhedron::C_Polyhedron(const Grid_Generator_System&) and
+	  C_Polyhedron::C_Polyhedron(Grid_Generator_System&).  Added 4
+	  FIXMEs for the same constructors: their documentation seems
+	  wrong, and their implementation seems incomplete.
+
+2006-09-06 Wednesday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, config.guess, config.sub, install-sh, missing,
+	  mkinstalldirs, Watchdog/INSTALL, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/install-sh, Watchdog/missing,
+	  Watchdog/mkinstalldirs, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/clpq2.pl, src/BD_Shape.defs.hh,
+	  src/BD_Shape.templates.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence_System.cc,
+	  src/Congruence_System.defs.hh, src/Congruence_System.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Direct_Product.defs.hh,
+	  src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Direct_Product.types.hh, src/Float.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/Generator.cc, src/Generator.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Makefile.am, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_public.cc,
+	  src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	  src/Scalar_Products.inlines.hh, src/checked.cc,
+	  src/checked_ext.inlines.hh, src/checked_int.inlines.hh,
+	  src/fpu-ia32.inlines.hh, src/globals.defs.hh, tests/ppl_test.cc,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage3.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload3.cc, tests/Grid/asciidumpload4.cc,
+	  tests/Grid/asciidumpload5.cc, tests/Grid/asciidumpload6.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruences1.cc,
+	  tests/Grid/congruences2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+	  tests/Grid/directproduct1.cc, tests/Grid/directproduct2.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/generators2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/outputoperator2.cc, tests/Grid/outputoperator3.cc,
+	  tests/Grid/relations1.cc, tests/Grid/relations2.cc,
+	  tests/Grid/relations3.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/widening1.cc,
+	  tests/Grid/widening2.cc, tests/Grid/widening3.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/bug2.cc, tests/Polyhedron/bug2.dat
+	  (simplex.[1,3,3,2,1,1,1,3,3,2,1,1,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,6,2,2,2,2,3,3,3,3,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,29,22,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,4,2,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,2,3,3,3,3,3,3,3,7,3,3,1]):
+	  Third merge from the main trunk.
+
+2006-09-06 Wednesday 09:19  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.51): Simplified the changes of the
+	  last commit.
+
+2006-09-06 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.22), GMP_Integer.inlines.hh (1.16):
+	  Added void abs_assign(GMP_Integer& x) and void
+	  abs_assign(GMP_Integer& x, const GMP_Integer& y).
+
+2006-09-05 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.33): Long lines avoided.
+
+2006-09-05 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.77), Checked_Number.inlines.hh
+	  (1.65): Added template <typename T, typename Policy> void
+	  abs_assign(Checked_Number<T, Policy>& x) and template <typename
+	  T, typename Policy> void abs_assign(Checked_Number<T, Policy>& x,
+	  const Checked_Number<T, Policy>& y).
+
+2006-09-05 Tuesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.76): Added the declaration and
+	  documentation for template <typename T, typename Policy> void
+	  neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T,
+	  Policy>& y).
+
+2006-09-05 Tuesday 16:18  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.50): Attempt to avoid explicit
+	  products to improve performances by not using temporaries.
+
+2006-09-05 Tuesday 15:26  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.49): Don't use `dimension_type' if we
+	  are not dealing with dimensions.
+
+2006-09-05 Tuesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.16): Only define debugging variables
+	  when NDEBUG is not defined.
+
+2006-09-05 Tuesday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/clpq2.pl (1.9): Fixed do_command/2.
+
+2006-09-04 Monday 17:43  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.48): Other little formatting changes.
+
+2006-09-04 Monday 16:14  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.47): Typo fixed.
+
+2006-09-04 Monday 16:11  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[46,28]):
+	  Removed other useless code. Added a CHECKME.
+
+2006-09-04 Monday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (simplex.21): Little formatting change.
+
+2006-09-04 Monday 11:41  Andrea Cimino
+
+	* src/LP_Problem.inlines.hh (simplex.20): Fixed the swap operator.
+
+2006-09-04 Monday 11:26  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[45,27,19]): Big changes.  Now the Status `UNSOLVED' is
+	  dropped because every LP_Problem, from the beginning, now is
+	  treated like `PARTIALLY_SATISFIABLE', so all the redundant code
+	  is dropped too. Other little, but important, bugfixes. This new
+	  implementation must be heavily tested.
+
+2006-09-01 Friday 12:02  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.44): Fixed a bug in compute_simplex():
+	  the test02 in lpproblem1.cc caused to fail the assertion
+	  `assert(challenger >= current)'.  Now the test seems to work.
+
+2006-07-20 Thursday 08:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.31):
+	  Removed a duplicate macro definition, improved some comments,
+	  reordered some macros.
+
+	  Added macros to make the components of a "simple" open or direct
+	  product cplusplus class available; these are now defined as:
+	  m4_cplusplus_class`'i_j where "i" is the class counter and "j" =
+	  1 or 2 depending on whether it is the 1st or second argument.  By
+	  "simple", we mean that the product construct is not nested.
+
+2006-07-06 Thursday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (1.23): Temporarily commented out a
+	  friend declaration that is rejected by GCC 3.3.x.
+
+2006-07-06 Thursday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.defs.hh (simplex.1): file
+	  Direct_Product.defs.hh was added on branch simplex on 2006-09-06
+	  18:41:51 +0000
+
+2006-07-02 Sunday 13:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.30):
+	  Some small improvements.
+
+2006-06-30 Friday 20:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.117): Repeated inclusion
+	  removed.  Useless declaration and initialization of `a_throw'
+	  removed as well.
+
+2006-06-30 Friday 19:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[29,30,21,24]): Revised the code for widening so that
+	  the supporting methods are not needed and removed. The limited
+	  and bounded options for extrapolation are now coded as a single
+	  pattern.
+
+	  Changes for schematising the limited and bounded options still to
+	  be done in the C interface.
+
+2006-06-30 Friday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: yap_cfli.h, yap_cfli.ic
+	  (interfaces.[1,1]): Started drafting the YAP Prolog Common
+	  Foreign Language Interface.
+
+2006-06-30 Friday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: swi_cfli.cc, swi_cfli.h, swi_cfli.ic
+	  (interfaces.[2,2,2]): Little improvements.
+
+2006-06-30 Friday 15:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[28,14,22,29,23]): Separate patterns for widening and
+	  extrapolation to give more flexibility.
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Direct_Product.templates.hh (1.19), Grid.inlines.hh (1.10),
+	  Grid.templates.hh (1.16), Grid_Generator.defs.hh (1.24): Missing
+	  inclusions added.
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (altnum.1): file
+	  Direct_Product.templates.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (octagons.1): file
+	  Direct_Product.templates.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (simplex.1): file
+	  Direct_Product.templates.hh was added on branch simplex on
+	  2006-09-06 18:41:51 +0000
+
+2006-06-29 Thursday 23:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (altnum.1): file Grid.inlines.hh was added on
+	  branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-06-29 Thursday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.14), Polyhedron.defs.hh (1.301):
+	  Missing inclusions added.
+
+2006-06-29 Thursday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: bug1.cc (1.4), bug1.dat (1.5): The situation
+	  exhibited by bug1.cc and bug1.dat has been clarified (not a bug,
+	  but Constraint::OK() needed improving).
+
+2006-06-29 Thursday 18:59  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.22), Direct_Product.inlines.hh
+	  (1.22), Direct_Product.templates.hh (1.18), globals.defs.hh
+	  (1.38): Improve some FIXMEs.
+
+2006-06-29 Thursday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.inlines.hh (simplex.1): file
+	  Direct_Product.inlines.hh was added on branch simplex on
+	  2006-09-06 18:41:51 +0000
+
+2006-06-29 Thursday 18:38  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.19): Add the ability to test with
+	  C_Polyhedron as the Polyhedral component.
+
+2006-06-29 Thursday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (simplex.1): file directproduct1.cc
+	  was added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-29 Thursday 17:47  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.18): Add a widening test.
+
+2006-06-29 Thursday 17:46  Matthew Mundell
+
+	* src/: Polyhedron.inlines.hh (1.133), Polyhedron.defs.hh (1.300):
+	  Add widening_assign(ph, tp) which is equivalent to
+	  H79_widening_assign(ph, tp).
+
+2006-06-29 Thursday 17:45  Matthew Mundell
+
+	* src/Direct_Product.defs.hh (1.21): Direct out the relation_with
+	  declarations.
+
+2006-06-29 Thursday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.8), config.guess (1.37), config.sub (1.35), install-sh
+	  (1.17), missing (1.13), mkinstalldirs (1.10), Watchdog/INSTALL
+	  (1.5), Watchdog/config.guess (1.21), Watchdog/config.sub (1.20),
+	  Watchdog/install-sh (1.14), Watchdog/missing (1.9),
+	  Watchdog/mkinstalldirs (1.6): Updated from Autoconf 2.60.
+
+2006-06-29 Thursday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.92): The situation exhibited by
+	  bug1.cc and bug1.dat has been clarified (not a bug, but
+	  Constraint::OK() needed improving).
+
+2006-06-29 Thursday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.h (interfaces.1): Spacing
+	  changed.
+
+2006-06-29 Thursday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am,
+	  ppl_interface_generator_swiprolog_cc.m4, swi_cfli.cc, swi_cfli.h,
+	  swi_cfli.ic (interfaces.[4,6,1,1,1]): SWI-Prolog Common Foreign
+	  Language Interface separated from the PPL stuff.
+
+2006-06-29 Thursday 16:17  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.17): Update to test only the
+	  methods defined in Direct_Product.  Update some expected values
+	  for when Grid is the first component.
+
+2006-06-29 Thursday 16:14  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.20), Direct_Product.inlines.hh
+	  (1.21), Direct_Product.templates.hh (1.17): Direct out the
+	  covering box, bounds_from_*, maximize and minimize methods for
+	  now.	Convert the returns of the system-returning methods from
+	  references to values.  Reduce to a single widening method:
+	  widening_assign(dp).
+
+	  Convert both product classes to assume that every method is
+	  implemented in both components.
+
+2006-06-29 Thursday 16:06  Matthew Mundell
+
+	* src/Congruence.defs.hh (1.13): Add Constraint friend declaration.
+
+2006-06-29 Thursday 16:06  Matthew Mundell
+
+	* src/: C_Polyhedron.defs.hh (1.43), C_Polyhedron.inlines.hh
+	  (1.31): Add constructors that take Grid_Generator_Systems.
+
+2006-06-29 Thursday 16:05  Matthew Mundell
+
+	* src/: Polyhedron.defs.hh (1.299), Polyhedron.inlines.hh (1.132),
+	  Polyhedron_public.cc (1.76): Add congruences(),
+	  minimized_congruences(), grid_generators(),
+	  minimized_grid_generators(), is_discrete(), add_grid_generator(g)
+	  and add_grid_generator_and_minimize(g).
+
+2006-06-29 Thursday 16:01  Matthew Mundell
+
+	* src/: Grid_nonpublic.cc (1.15), Grid_public.cc (1.32),
+	  Grid.defs.hh (1.25), Grid.inlines.hh (1.9): Add Grid(const gs),
+	  Grid(gs), constraints(), minimized_constraints(), generators(),
+	  minimized_generators(), add_generator(g) and
+	  add_generator_and_minimize(g).
+
+2006-06-29 Thursday 15:56  Matthew Mundell
+
+	* src/: Constraint_System.cc (1.18), Constraint_System.defs.hh
+	  (1.29): Add Constraint_System(cgs).
+
+2006-06-29 Thursday 15:55  Matthew Mundell
+
+	* src/: Constraint.cc (1.61), Constraint.defs.hh (1.121),
+	  Constraint.inlines.hh (1.64): Add methods
+	  throw_invalid_argument(method, msg), Constraint(cg) and
+	  Constraint(cg, sz, capacity).
+
+2006-06-29 Thursday 15:53  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (1.13): Improve insert(c)
+	  description slightly.
+
+2006-06-29 Thursday 15:52  Matthew Mundell
+
+	* src/: NNC_Polyhedron.defs.hh (1.46), NNC_Polyhedron.inlines.hh
+	  (1.33), Congruence_System.cc (1.18): Update Congruence_System(cs)
+	  to construct Matrix with the required space dimension.
+
+2006-06-29 Thursday 15:38  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.16): Convert test76 to fail with
+	  int8.
+
+2006-06-29 Thursday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.60): Constraint::OK() improved: it now
+	  detects illegal "strict" equalities.
+
+2006-06-29 Thursday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.91), bug2.cc (1.7), bug2.dat
+	  (1.2): The bug shown by bug2.cc and bug2.dat has been fixed long
+	  ago.
+
+2006-06-29 Thursday 13:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/bug1.dat (1.4): Testcase simplified.
+
+2006-06-29 Thursday 12:42  Matthew Mundell
+
+	* tests/Polyhedron/bug1.dat (1.3): Add data file for bug1.
+
+2006-06-29 Thursday 12:39  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.90), bug1.cc (1.3): Add bug1.
+
+2006-06-29 Thursday 09:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.27):
+	  Simplified code for defining the add_disjuncts replacement - this
+	  uses the new macro m4_echo_unquoted added in the previous commit.
+
+2006-06-29 Thursday 08:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[42,26,22]): Added 3 new application-independent
+	  macros to the common.m4 m4_echo_quoted, m4_echo_unquoted,
+	  m4_arg_counter:
+
+	  m4_echo_quoted and m4_echo_unquoted correspond to echo1 and echo2
+	  in the m4 documentation. Neither used yet but I plan to use the
+	  m4_echo_unquoted to expand terms.
+
+	  m4_arg_counter takes a string and a sequence of arguments and
+	  either expands to the first index of the argument sequence that
+	  matches the string or to the empty string.  m4_arg_counter is now
+	  used instead of m4_check_if_class_in_group which is removed.
+
+	  In common_dat.m4 added a dummy predicate for widening
+	  Polyhedra_Powerset classes and in prolog_icc_code.m4 added unused
+	  schematic code for developing the widening for powersets (this is
+	  prefixed by a "FIXME" and should be ignored).
+
+2006-06-28 Wednesday 19:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4 (interfaces.[28,21]):
+	  Added Polyhedra_Powerset schema predicate for "get_disjuncts"/2.
+	  Removed some unwanted commented-out lines of code.
+
+2006-06-28 Wednesday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (octagons.1): Adjusted spacing when
+	  using \ to break lines in macro definitions.
+
+2006-06-28 Wednesday 18:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (octagons.18): Do initialize `i' when
+	  constructing the past-the-end any_row_iterator, so as to avoid
+	  the annoying compiler warning.  Do initialize `size_' when
+	  default constructing a Pseudo_Row (for the same reason as above).
+
+2006-06-28 Wednesday 16:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[25,27,20]): For the Polyhedra_Powerset classes, we
+	  now allow for add_disjunct and pairwise_reduce in the interfaces
+	  (currently these are only included in the Prolog interfaces).
+
+2006-06-28 Wednesday 12:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.24):
+	  Avoid generating unwanted spaces.
+
+2006-06-28 Wednesday 12:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[23,20,19]): Revised the friend pattern replacement
+	  macros.  Added handles for C_Polyhedron and NNC_Polyhedron
+	  whenever the Polyhedron class is generated.
+
+2006-06-27 Tuesday 20:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: Makefile.am, C/Makefile.am, Prolog/Makefile.am,
+	  Prolog/Ciao/Makefile.am, Prolog/GNU/Makefile.am,
+	  Prolog/SICStus/Makefile.am, Prolog/SWI/Makefile.am,
+	  Prolog/XSB/Makefile.am, Prolog/YAP/Makefile.am
+	  (interfaces.[2,4,4,4,5,3,3,3,3]): Added the specification of all
+	  the dependencies concerning the generation of interfaces.
+
+2006-06-27 Tuesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (interfaces.3): Added
+	  ../ppl_interface_generator_common_dat.m4 to
+	  interface_generator_files.
+
+2006-06-27 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (interfaces.3): Added
+	  ../ppl_interface_generator_common_dat.m4 to
+	  interface_generator_files.
+
+2006-06-27 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (interfaces.2): This is now a generated
+	  source.
+
+2006-06-27 Tuesday 13:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.22):
+	  Now it does not remove spaces from the class names.
+
+2006-06-27 Tuesday 13:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.21):
+	  Simplified the code for the replacements for pattern "friend" by
+	  making a new more generic macro.  Added friends for octagons and
+	  polyhedra_powersets class kinds.
+
+2006-06-27 Tuesday 09:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[41,20,19]): Added and redone existing code so that
+	  any class of kind BD_Shape is a friend of any other class of kind
+	  BD_Shape and also a friend of Polyhedron class.
+
+	  Note that if a class is defined as a "friend" then the schema
+	  name ppl_new_ at TOPOLOGY@@CLASS at _from_@INTOPOLOGY@@FRIEND@ is
+	  instantiated to have this class and friend.
+
+	  The Prolog C++ (ppl_prolog.icc) code needs the procedure
+	  converting terms to class handles to come before use.  With this
+	  friend code, all these procedures must be defined before any
+	  other generated code.  Therefore a new macro
+	  m4_pre_all_classes_code is called before generating the main
+	  classes code.  This has a default expansion of the empty string.
+
+2006-06-26 Monday 19:47  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.15): Add directive GRID_IS_D1,
+	  for testing with Grid as the first component.  In test15 and
+	  test16 compare the congruence systems via temporary grids.
+
+2006-06-26 Monday 19:45  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.19), Direct_Product.inlines.hh
+	  (1.20), Direct_Product.templates.hh (1.16): Add the
+	  system-returning methods to Open_Product so that they reduce the
+	  product before returning the system.	Add C_Polyhedron
+	  specialisation to any methods already specialised for
+	  NNC_Polyhedron.
+
+2006-06-26 Monday 09:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[40,19,26,18]): Improved the processing of the
+	  replacement lists for a pattern.
+
+	  Added 2 new application independent helper macros:  - m4_nargs
+	  (definition taken from m4 documentation)  - m4_arg (finds the
+	  n+1'st argument in a list of arguments - where n is the 1st
+	  argument)
+
+	  The alternative replacement is now also defined via an
+	  alternative list of replacements (the number and order must match
+	  the usual list of replacements for the given class). This change
+	  was triggered by the wish to have a "friend" pattern (see below).
+
+	  Introduced a new pattern "friend" and use in in the Prolog
+	  interface to use instead of the 2nd "class" in
+	  ppl_new_ at CLASS@_from_ at INTOPOLOGY@@CLASS@ ie.,
+	  ppl_new_ at CLASS@_from_ at INTOPOLOGY@@FRIEND at .  That is, a friend is
+	  a class that can be used to construct an element in the current
+	  class. Every class is declared to be a friend of itself.  The
+	  intention is to add to more "friend"s for each class so that, for
+	  instance, Polyhedron will be a friend of BD_Shape.  Note that the
+	  friend pattern is only used in the Prolog interface at the
+	  moment.
+
+2006-06-22 Thursday 13:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.15): Using the new policy
+	  WRD_Extendend_Number_Policy when assertions are turned off.
+
+2006-06-22 Thursday 13:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (octagons.[1,1]): Added new policy WRD_Extended_Number_Policy, to
+	  be used by weakly-relational domains when assertions are turned
+	  off.
+
+2006-06-22 Thursday 11:27  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.49): Corrected a bug
+	  in Octagonal_Shape<T>::CC76_narrowing_assign().
+
+2006-06-21 Wednesday 19:49  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.14): Insert is_disjoint() test
+	  test34 where the intersection of the products determines the
+	  outcome.  Add a directive to control the product used.
+
+2006-06-21 Wednesday 19:46  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.18), Direct_Product.inlines.hh
+	  (1.19), Direct_Product.templates.hh (1.15): Convert the reduced
+	  flag methods to const methods.  Update the predicate methods
+	  (is_empty(), etc) to first reduce the components.  Update
+	  is_disjoint_from to consider the intersection of the two
+	  products.
+
+2006-06-21 Wednesday 14:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[39,18,13,21,25,18,17]): Revised the way we handle
+	  compound domains (is the powerset and product domains).
+
+	  Where compound domains have Polyhedron as a component, the system
+	  creates two domains, one where Polyhedron is prefixed by C and
+	  the other where it is prefixed by NNC. Note that this change has
+	  been made so as _not_ to affect the simple domain Polyhedron.
+
+	  As requested, both the user name and the C++ name have the
+	  topology C and NNC inserted just before the string "Polyhedron".
+	  Note though this still assumes that every component = Polyhedron
+	  has the same topology. Automatically generating different
+	  topologies for these components will be difficult and not really
+	  practical or useful.
+
+	  Simplified the way class name patterns are replaced by the actual
+	  name. The class patterns are now replaced as part of the main
+	  list of replacements.
+
+2006-06-21 Wednesday 13:11  Matthew Mundell
+
+	* src/: Direct_Product.inlines.hh (1.18),
+	  Direct_Product.templates.hh (1.14), Direct_Product.defs.hh
+	  (1.17): Add a reduced flag to Open_Product.  Add reduction
+	  function propagate_constraints_reduce and update standard_reduce
+	  to call it.  Update Open_Product is_bounded to call reduce()
+	  instead of propagating constraints directly.
+
+2006-06-21 Wednesday 12:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.48): Removed an
+	  efficiency bug (repeated allocations) in the strong closure and
+	  strong coherence methods.
+
+2006-06-20 Tuesday 15:30  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.16), Direct_Product.inlines.hh
+	  (1.17), Direct_Product.templates.hh (1.13),
+	  Direct_Product.types.hh (1.5): Replace the Open_Product reduction
+	  methods with a single reduce() method and a reduction function
+	  template parameter.
+
+2006-06-20 Tuesday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.types.hh (altnum.1): file
+	  Direct_Product.types.hh was added on branch altnum on 2006-10-29
+	  19:27:12 +0000
+
+2006-06-20 Tuesday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.types.hh (octagons.1): file
+	  Direct_Product.types.hh was added on branch octagons on
+	  2006-11-18 20:36:50 +0000
+
+2006-06-20 Tuesday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.types.hh (simplex.1): file
+	  Direct_Product.types.hh was added on branch simplex on 2006-09-06
+	  18:41:51 +0000
+
+2006-06-18 Sunday 22:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4 (interfaces.[38,17]):
+	  Comments improved and redundant code removed.
+
+2006-06-18 Sunday 11:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4 (interfaces.[37,16]):
+	  Revised handling of C++ class names so that a product domain with
+	  commas works.  Basic approach is to immediately replace the ","
+	  in the list of C++ names obtained from the instantiations.m4 file
+	  by "@COMMA@" and then at the end of the code generation, restore
+	  the ",".
+
+2006-06-17 Saturday 10:39  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.13): Add tests of
+	  Direct_Product(covering_box), shrink_bounding_box(box) and
+	  get_covering_box(box).
+
+2006-06-17 Saturday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox2.cc (altnum.1): file coveringbox2.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-17 Saturday 10:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (altnum.1): file ppl_test.cc was added on
+	  branch altnum on 2006-10-29 19:27:21 +0000
+
+2006-06-17 Saturday 10:32  Matthew Mundell
+
+	* tests/: Grid/boundingbox2.cc (1.10), ppl_test.cc (1.6),
+	  ppl_test.hh (1.48), Grid/coveringbox2.cc (1.10): Move the
+	  temporary function operator==(box,box) to ppl_test.cc.
+
+2006-06-17 Saturday 10:31  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.15), Direct_Product.inlines.hh
+	  (1.16), Direct_Product.templates.hh (1.12): Define
+	  shrink_bounding_box(box) and get_covering_box(box).
+
+2006-06-16 Friday 18:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.15):
+	  Previous simplification means that the replacement code here can
+	  also be improved.
+
+2006-06-16 Friday 18:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (interfaces.[36,14,10,5]): Revised comments, Simplified some
+	  macros and removed some multiple levels of quoting.  Avoid
+	  generating unwanted (and unintended) blank lines (by making sure
+	  every line ending with "dnl" ends with "`'dnl").
+
+2006-06-16 Friday 16:48  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.12), tests/Grid/directproduct2.cc
+	  (1.4), src/Direct_Product.templates.hh (1.11),
+	  src/Direct_Product.types.hh (1.4): Add an Open_Product
+	  is_bounded() NNC_Polyhedron-Grid specialization which propagates
+	  equalities.
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (altnum.1): file directproduct2.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (interfaces.1): file
+	  directproduct2.cc was added on branch interfaces on 2006-09-28
+	  20:46:31 +0000
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (octagons.1): file directproduct2.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-06-16 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct2.cc (simplex.1): file directproduct2.cc
+	  was added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-16 Friday 16:47  Matthew Mundell
+
+	* src/Polyhedron_public.cc (1.75): Update add_congruences(cgs) and
+	  add_congruence(cg) to strong normalize constructed constraints
+	  before adding them.
+
+2006-06-16 Friday 15:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4
+	  (interfaces.12): Revised C code for including topology in
+	  compound C++ class names.
+
+2006-06-16 Friday 14:18  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.11): Add tests of contains() and
+	  strictly_contains().
+
+2006-06-16 Friday 14:18  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.14), Direct_Product.inlines.hh
+	  (1.15): Implement contains() and strictly_contains().
+
+2006-06-16 Friday 13:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4
+	  (interfaces.[35,24,9,6,4]): Fixed an old bug affecting Ciao and
+	  XSB interfaces.  The bug was in the handling of the list
+	  separator.  Now a counter for the list is passed as as argument
+	  and the separator is suppressed when the counter is 0.
+
+2006-06-16 Friday 09:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[34,13,23,16]): Completed basic changes for
+	  Powerset_Polyhedron<...>.  Compilation only tested (in the Prolog
+	  interface) for Powerset_Polyhedron<Polyhedron> for the predicates
+	  "ppl_new_C_Polyhedra_Powerset_Polyhedron_from_space_dimension"
+	  and
+	  "ppl_new_NNC_Polyhedra_Powerset_Polyhedron_from_space_dimension".
+
+2006-06-15 Thursday 23:29  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.10): Replace the use of
+	  Direct_Product with a local typedef, Product.  Add tests of the
+	  remaining predicate methods (is_topologically_closed(), etc).
+	  Ensure that each of the defined adding methods (add_congruence(),
+	  etc) is used at least once in the file.
+
+2006-06-15 Thursday 23:29  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.13), Direct_Product.inlines.hh
+	  (1.14), Direct_Product.templates.hh (1.10): Define more of the
+	  adding methods (add_congruence(), etc).  Take out the constraint
+	  parameter congruence adding method declarations.  Correct some of
+	  the predicate methods.
+
+	  Add to Open_Product the remaining constructors, ~Open_Product()
+	  and operator=.  Define Open_Product::is_universe().
+
+2006-06-15 Thursday 17:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[33,15]): Added provision for prefixing topology
+	  wherever in the C++ class name the class "Polyhdedron".  Only
+	  tested for the basic Polyhedron class and only in the Prolog
+	  interface code.
+
+2006-06-15 Thursday 16:16  Matthew Mundell
+
+	* tests/Grid/directproduct2.cc (1.3): Typedef Product to
+	  Open_Product instead of Reduced_Product.
+
+2006-06-15 Thursday 16:08  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.12), Direct_Product.inlines.hh
+	  (1.13), Direct_Product.templates.hh (1.9),
+	  Direct_Product.types.hh (1.3): Rename Reduced_Product
+	  Open_Product.  Reorder sytem-returning method declarations.  Move
+	  empty-reduce methods into Open_Product.  Define rest of predicate
+	  methods (is_bounded(), etc).
+
+2006-06-15 Thursday 15:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[32,17]): Some bugs fixed.
+
+2006-06-15 Thursday 10:36  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.47): Corrected a code
+	  line in      Octagonal_Shape<T>::generalized_affine_preimage().
+	  Added some new tests on
+	  Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-06-15 Thursday 09:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[31,16]): Revised comments to match previous changes.
+	  Improved a few macro names.
+
+2006-06-15 Thursday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.[30,12,15,8]):   The m4_class (ie the interface name)
+	  and the m4_cpp_name are
+	    never passed as arguments now. Instead the number of the class
+	    is passed (as well as the class_kind) and the names are found
+	    from the definition generated in the initialisation phase.
+
+	    The macro definitions for the initialisation of the class
+	    names been moved from ppl_interface_generator_common.m4
+	    to ppl_interface_generator_common_dat.m4 as these are then
+	    used as fixed macros for the main code generation.
+
+	  The order of generation has been changed.  The @CLASS@ and
+	  @CPP_CLASS@ are replaced by the actual class names immediately
+	  after getting the code (or, for the Prolog systems, the
+	  exntensions have been added)
+
+	  In Prolog/ppl_interface_generator_prolog_systems.m4, the macros
+	  for generating the Prolog system code for fixed library
+	  predicates now uses code specific to these predicates.
+
+2006-06-14 Wednesday 19:20  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.9): Add tests of the rest of the
+	  system-returning methods.
+
+2006-06-14 Wednesday 19:20  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.11), Direct_Product.inlines.hh
+	  (1.12), Direct_Product.templates.hh (1.8): Add relation_with(g).
+	  Define Direct_Product(gs), Direct_Product(cbox) and the rest of
+	  the system-returning methods.
+
+2006-06-14 Wednesday 16:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc.m4,
+	  C/ppl_interface_generator_c_h.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[29,11,6,6,22,14]): Improved and corrected macro
+	  definitions for m4_filter and m4_filter_all.	Started passing the
+	  class number instead of the m4_interface_class_name and
+	  m4_cplusplus_class_name as arguments to macros.
+
+2006-06-12 Monday 19:00  Matthew Mundell
+
+	* src/Direct_Product.defs.hh (1.10), src/Direct_Product.inlines.hh
+	  (1.11), src/Direct_Product.templates.hh (1.7),
+	  src/Direct_Product.types.hh (1.2), tests/Grid/directproduct2.cc
+	  (1.2): Introduce Reduced_Product.  Move most Direct_Product
+	  reduce methods into Reduced_Product.
+
+2006-06-12 Monday 18:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[28,10,21,13,14]): Revised the way the pattern
+	  replacements are defined and revised the code for replacement.
+
+	  Extended the prolog_dat.m4 list of predicates that can generate
+	  code for BD_Shape to match that of the C interface (and removed a
+	  bug that prevented BD_Shape widening compiling).
+
+2006-06-12 Monday 17:27  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.38), directproduct1.cc (1.8),
+	  directproduct2.cc (1.1): Add tests of time_elapse_assign(dp) and
+	  topological_closure_assign() to directproduct1.  Add
+	  directproduct2.  Move directproduct1 reduce tests into
+	  directproduct2.
+
+2006-06-12 Monday 17:26  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.9), Direct_Product.inlines.hh
+	  (1.10): Declare Generator_System constructors.  Implement
+	  time_elapse_assign(dp) and topological_closure_assign().
+
+2006-06-12 Monday 16:03  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.7): Add tests of
+	  difference_assign(y) and of the affine transformation methods.
+
+2006-06-12 Monday 16:03  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.8), Direct_Product.inlines.hh
+	  (1.9), Direct_Product.templates.hh (1.6): Declare Generator
+	  adding methods.  Implement difference_assign(y) and the affine
+	  transformation methods.
+
+2006-06-12 Monday 16:02  Matthew Mundell
+
+	* tests/Grid/: generalizedaffinepreimage1.cc (1.12),
+	  generalizedaffinepreimage2.cc (1.12): Move
+	  generalizedaffinepreimage2 test06 into
+	  generalizedaffinepreimage1.
+
+2006-06-11 Sunday 10:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[27,11,20,20,13]): Corrected a bug introduced for
+	  formatting.
+
+	  Revised the use of generator to grid_generator to match changes
+	  due to merge from the trunk.
+
+	  Removed the use of alt_box replacement for the grid
+	  "get_covering_box" and "get_bounding_box", by providing the code
+	  explicitly.
+
+	  Now the "alt_" replacement is not used anymore and this option
+	  for defining replacements will be removed later when other
+	  improvements here are made..
+
+2006-06-11 Sunday 09:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence_System.cc, src/Direct_Product.defs.hh,
+	  src/Direct_Product.inlines.hh, src/Direct_Product.templates.hh,
+	  src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc, src/Grid_public.cc,
+	  src/Grid_simplify.cc, src/Grid_widenings.cc,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Makefile.am, src/Polyhedron.defs.hh, src/globals.defs.hh,
+	  tests/print.cc, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/asciidumpload7.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	  tests/Grid/contains1.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/directproduct1.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/relations3.cc,
+	  tests/Grid/removespacedims1.cc, tests/Grid/removespacedims2.cc,
+	  tests/Grid/timeelapse1.cc, tests/Grid/topclosed1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc
+	  (interfaces.[1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  First merge from the main trunk.
+
+2006-06-10 Saturday 12:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.9):
+	  Comment improved.
+
+2006-06-10 Saturday 12:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.[26,8,19,19]): Bug fixed in
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+
+	  Comments improved.
+
+	  Improvements to formatting.
+
+2006-06-10 Saturday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4 (interfaces.[18,12]):
+	  Now using `@' as a pattern delimiter.
+
+2006-06-10 Saturday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.7): Changed macro m4_pattern_delimiter so as to use
+	  `@' as a delimiter.
+
+2006-06-10 Saturday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_dat.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[10,18,9]): Now
+	  patterns are delimited by `@'.
+
+2006-06-10 Saturday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.25):
+	  Changed macros m4_extension and m4_pattern_delimiter so as to
+	  allow for the use of `@' as a pattern delimiter.
+
+2006-06-09 Friday 23:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.[24,7,17,17]): Revised the way the groups of classes
+	  are defined and used.  Thus the selection and deselection of a
+	  procedure for a given group or class kind is clearer and easier
+	  to extend.  An initial list of groups and the classes they
+	  include is provided in ppl_interface_generator_common_dat.m4.
+
+	  Also, allow for arity and the attribute "nofail" to be optionally
+	  defined and occur anywhere in the info text after the procedure
+	  name.
+
+2006-06-09 Friday 16:07  Matthew Mundell
+
+	* tests/Grid/expandspacedim1.cc (1.10): Add the description to the
+	  print message in test04.
+
+2006-06-09 Friday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/expandspacedim1.cc (altnum.1): file expandspacedim1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-09 Friday 16:06  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.6): Add tests of the dimension
+	  changing methods.
+
+2006-06-09 Friday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/directproduct1.cc (interfaces.1): file
+	  directproduct1.cc was added on branch interfaces on 2006-06-11
+	  07:13:48 +0000
+
+2006-06-09 Friday 16:02  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.7), Direct_Product.inlines.hh
+	  (1.8), Direct_Product.templates.hh (1.5): Rename methods,
+	  replacing "generator" with "grid_generator".	Add
+	  grid_generators() and minimized_grid_generators().  Implement
+	  congruences(), add_grid_generator(g),
+	  add_grid_generator_and_minimize(g) and the dimension changing
+	  methods.
+
+2006-06-09 Friday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Direct_Product.templates.hh (interfaces.1): file
+	  Direct_Product.templates.hh was added on branch interfaces on
+	  2006-06-11 07:13:47 +0000
+
+2006-06-09 Friday 14:06  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.12): Add test12.
+
+2006-06-09 Friday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims2.cc (altnum.1): file
+	  removespacedims2.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-09 Friday 14:05  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.9): Correct the dim_kinds to congruence
+	  mapping assumed in the congruence case of
+	  remove_higher_space_dimensions.
+
+2006-06-09 Friday 13:59  Matthew Mundell
+
+	* tests/Grid/concatenate1.cc (1.12): Order the known_cgs insertions
+	  in test05 by dimension.
+
+2006-06-09 Friday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/concatenate1.cc (altnum.1): file concatenate1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 20:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	*
+	  interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
+	  (interfaces.4): Added a few comments.
+
+2006-06-08 Thursday 20:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_common_dat.m4 (interfaces.[23,6]):
+	  Updated so as to exploit the configuration-generated information
+	  about the required instantiations.
+
+2006-06-08 Thursday 20:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am, Prolog/Makefile.am,
+	  Prolog/Ciao/Makefile.am, Prolog/GNU/Makefile.am,
+	  Prolog/SICStus/Makefile.am, Prolog/SWI/Makefile.am,
+	  Prolog/XSB/Makefile.am, Prolog/YAP/Makefile.am
+	  (interfaces.[2,2,3,4,2,2,2,2]): Updated so as to allow m4 to
+	  include from $(top_buildir)/interfaces.
+
+2006-06-08 Thursday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  YAP/ppl_interface_generator_yap_cc.m4 (interfaces.[5,3]): Added
+	  useful comments.
+
+2006-06-08 Thursday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.6): Adapted to new style of common macros. Also added
+	  a few coments.
+
+2006-06-08 Thursday 19:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.11): Added a cople of newlines where needed.
+
+2006-06-08 Thursday 19:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_interface_generator_c_h.m4,
+	  C/ppl_interface_generator_c_cc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.[5,5,12]): Adapted to new style of global macros.
+	  Also added a few comments.
+
+2006-06-08 Thursday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.16):
+	  Use commas to separate entries in m4_procedure_list.
+
+2006-06-08 Thursday 19:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_code.m4 (interfaces.8):
+	  Added a few missing commas that were at the origina of a
+	  debugging nightmare.
+
+2006-06-08 Thursday 19:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.22): The
+	  common macros changed so as to prefer working with explicit
+	  arguments rather than global macros. There still are global
+	  macros, but these are restricted to be the ones defined in the
+	  _dat files.
+
+2006-06-08 Thursday 12:05  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (1.11),
+	  tests/Grid/addcongruences1.cc (1.14), tests/Grid/addgenerator1.cc
+	  (1.13), tests/Grid/addgenerators1.cc (1.12),
+	  tests/Grid/addspacedims1.cc (1.12), tests/Grid/affinedim1.cc
+	  (1.10), tests/Grid/affineimage1.cc (1.11),
+	  tests/Grid/affineimage2.cc (1.8), tests/Grid/affinepreimage1.cc
+	  (1.10), tests/Grid/affinepreimage2.cc (1.5),
+	  tests/Grid/asciidumpload1.cc (1.11), tests/Grid/asciidumpload2.cc
+	  (1.4), tests/Grid/bounded1.cc (1.11), tests/Grid/boundingbox1.cc
+	  (1.12), tests/Grid/boundingbox2.cc (1.9), tests/Grid/bounds1.cc
+	  (1.13), tests/Grid/certificate1.cc (1.11),
+	  tests/Grid/congruences1.cc (1.10), tests/Grid/contains1.cc
+	  (1.10), tests/Grid/coveringbox1.cc (1.12),
+	  tests/Grid/coveringbox2.cc (1.9), tests/Grid/directproduct1.cc
+	  (1.5), tests/Grid/discrete1.cc (1.5), tests/Grid/disjoint1.cc
+	  (1.9), tests/Grid/equals1.cc (1.10),
+	  tests/Grid/expandspacedim1.cc (1.9), tests/Grid/foldspacedims1.cc
+	  (1.9), tests/Grid/generalizedaffineimage1.cc (1.10),
+	  tests/Grid/generalizedaffineimage2.cc (1.9),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.11),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.11),
+	  tests/Grid/generators1.cc (1.11), tests/Grid/grid1.cc (1.16),
+	  tests/Grid/griddifference1.cc (1.10), tests/Grid/intersection1.cc
+	  (1.9), tests/Grid/isempty1.cc (1.6), tests/Grid/join1.cc (1.14),
+	  tests/Grid/join2.cc (1.9), tests/Grid/limitedextrapolation1.cc
+	  (1.10), tests/Grid/limitedextrapolation2.cc (1.4),
+	  tests/Grid/limitedextrapolation3.cc (1.3),
+	  tests/Grid/mapspacedims1.cc (1.9), tests/Grid/maxmin1.cc (1.10),
+	  tests/Grid/membytes1.cc (1.6), tests/Grid/mingenerators1.cc
+	  (1.8), tests/Grid/outputoperator1.cc (1.7),
+	  tests/Grid/relations2.cc (1.12), tests/Grid/relations3.cc (1.4),
+	  tests/Grid/removespacedims1.cc (1.12),
+	  tests/Grid/removespacedims2.cc (1.11), tests/Grid/timeelapse1.cc
+	  (1.9), tests/Grid/topclosed1.cc (1.10), tests/Grid/widening1.cc
+	  (1.13), tests/Grid/widening2.cc (1.6), tests/Grid/widening3.cc
+	  (1.3), src/Direct_Product.defs.hh (1.6),
+	  src/Direct_Product.inlines.hh (1.7),
+	  src/Direct_Product.templates.hh (1.4), src/Grid.defs.hh (1.24),
+	  src/Grid.templates.hh (1.15), src/Grid_public.cc (1.31),
+	  src/Grid_widenings.cc (1.9), tests/print.cc (1.26): Rename
+	  Grid_Generator methods, replacing "generator" with
+	  "grid_generator".
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruence1.cc (altnum.1): file addcongruence1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruences1.cc (altnum.1): file addcongruences1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerator1.cc (altnum.1): file addgenerator1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerators1.cc (altnum.1): file addgenerators1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addspacedims1.cc (altnum.1): file addspacedims1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinedim1.cc (altnum.1): file affinedim1.cc was added
+	  on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage1.cc (altnum.1): file affineimage1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage1.cc (altnum.1): file affinepreimage1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage2.cc (altnum.1): file affinepreimage2.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload2.cc (altnum.1): file asciidumpload2.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounded1.cc (altnum.1): file bounded1.cc was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounds1.cc (altnum.1): file bounds1.cc was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences1.cc (altnum.1): file congruences1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/contains1.cc (altnum.1): file contains1.cc was added
+	  on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox1.cc (altnum.1): file coveringbox1.cc was
+	  added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/disjoint1.cc (altnum.1): file disjoint1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators1.cc (altnum.1): file generators1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/griddifference1.cc (altnum.1): file griddifference1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/intersection1.cc (altnum.1): file intersection1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isempty1.cc (altnum.1): file isempty1.cc was added on
+	  branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join1.cc (altnum.1): file join1.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join2.cc (altnum.1): file join2.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation1.cc (altnum.1): file
+	  limitedextrapolation1.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation2.cc (altnum.1): file
+	  limitedextrapolation2.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation3.cc (altnum.1): file
+	  limitedextrapolation3.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mapspacedims1.cc (altnum.1): file mapspacedims1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/maxmin1.cc (altnum.1): file maxmin1.cc was added on
+	  branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mingenerators1.cc (altnum.1): file mingenerators1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator1.cc (altnum.1): file outputoperator1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations3.cc (simplex.1): file relations3.cc was
+	  added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims1.cc (altnum.1): file
+	  removespacedims1.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/timeelapse1.cc (altnum.1): file timeelapse1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosed1.cc (altnum.1): file topclosed1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening1.cc (altnum.1): file widening1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening3.cc (altnum.1): file widening3.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-08 Thursday 08:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_icc.m4,
+	  Ciao/ppl_interface_generator_ciao_pl.m4 (interfaces.[11,5]):
+	  Corrected a bug in _ciao_pl.m4.
+
+	  Corrected a bug in the addition of the extra widening code in
+	  _icc.m4.  Also removed code that checked the number of binop
+	  replacements for that class: this is because, now LP_Problem is a
+	  fixed class, all the classes denote domains with at least one
+	  binary operator.
+
+2006-06-07 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, interfaces/Makefile.am (interfaces.[4,1]): Finished
+	  the support for the --enable-instantiations configuration option.
+
+2006-06-07 Wednesday 21:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.10): Fixed a bug in the expansion of num_binops for
+	  generating the Prolog ppl_prolog.icc.
+
+2006-06-07 Wednesday 17:46  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.4): Add tests of
+	  intersection_assign and upper_bound_assign.  Enable the grid
+	  generator constructor tests.
+
+2006-06-07 Wednesday 17:44  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.5), Direct_Product.inlines.hh
+	  (1.6), Direct_Product.templates.hh (1.3): Add
+	  empty_reduce_d1_with_d2() and empty_reduce_d2_with_d1().  Define
+	  add_generator().  Add Grid Polyhedron specialisations off
+	  add_generator() and of the grid generator constructors.  Take out
+	  grid methods intersection_assign_and_minimize,
+	  join_assign_and_minimize and join_assign_if_exact.
+
+2006-06-07 Wednesday 15:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.5):
+	  is_disjoint_from is also defined for BD shapes.
+
+2006-06-07 Wednesday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.4):
+	  Restored join_assign and join_assign_and minimize for Grids.
+
+2006-06-07 Wednesday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.10): Added spaces at the end of function definitions
+	  to improve readability of generated file. Try to avoid spurious
+	  indentations in the definnition of parameter lists.
+
+2006-06-07 Wednesday 14:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.3):
+	  The first 5 binary operators are common to all instantiations.
+	  Polyhedra and BD_Shape have some *further* binary operators with
+	  instantiation specific names.  For simplicity, do NOT have
+	  binminop's depend on binop's.
+
+2006-06-07 Wednesday 14:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_dat.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[9,15,7]): Method
+	  concatenate_assign is now dealt with as all the other binary
+	  operators.
+
+2006-06-07 Wednesday 14:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common_dat.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  C/ppl_interface_generator_c_h_code.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[2,8,14,6,9]): Swap generator and grid generator in
+	  replacement code.
+
+2006-06-07 Wednesday 14:16  Matthew Mundell
+
+	* tests/Grid/: join1.cc (1.13), join2.cc (1.8): Move join1 test12
+	  to join2.  Add join2 test13, to test
+	  upper_bound_assign_and_minimize().
+
+2006-06-07 Wednesday 14:14  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.23), Grid.inlines.hh (1.8): Add
+	  upper_bound_assign_and_minimize().
+
+2006-06-07 Wednesday 13:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.16): Include file
+	  ppl_interface_generator_common_dat.m4 instead of repeating
+	  language independent macros. Prefer dnl to # for m4 comments.
+
+2006-06-07 Wednesday 13:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.13):
+	  Include ppl_interface_generator_common_dat.m4 instead of
+	  repeating language independent macros. LP_Problem is always
+	  interfaced. Dropped arities from name of procedures.
+
+2006-06-07 Wednesday 13:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[7,5]): Dropped
+	  trailing underscore from patterns TOPOLOGY_ and INTOPOLOGY_.
+
+2006-06-07 Wednesday 13:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.21):
+	  Simplified macro m4_replace_class_patterns.
+
+2006-06-07 Wednesday 13:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common_dat.m4 (interfaces.1):
+	  The common (i.e., language indepedent) part of
+	  ppl_interface_generator_<LANG>_dat.m4 moved here to avoid
+	  inconsistencies.
+
+2006-06-07 Wednesday 12:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.[20,5]): Added a macro "m4_pattern_delimiter".  This
+	  is defined in ppl_interface_generator_common.m4 as `4' and
+	  Prolog/ppl_interface_generator_prolog_systems.m4 as `4'.
+
+	  When the patterns in the procedure macro names have no
+	  delimeters, and when the code has @ delimiter, these must be
+	  changed, the common definition to `@' and the system definition
+	  to `'.
+
+2006-06-07 Wednesday 10:33  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.3): Add is_universe() tests.
+
+2006-06-06 Tuesday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.15): Bug corrected.
+
+2006-06-06 Tuesday 21:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble
+	  (interfaces.[14,8,4]): term_to_polyhedron_handle and similar are
+	  now with the class name (polyhedron) in capitals.  Many of the
+	  BD_Shape procedures are now compiling ok in the Prolog interface.
+
+2006-06-06 Tuesday 18:54  Matthew Mundell
+
+	* tests/Grid/directproduct1.cc (1.2): Add tests of is_empty() and
+	  reduce().
+
+2006-06-06 Tuesday 18:52  Matthew Mundell
+
+	* tests/Grid/bhz03widening1.cc (1.9): Correct spacing.
+
+2006-06-06 Tuesday 18:52  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.4), Direct_Product.inlines.hh
+	  (1.5), Direct_Product.templates.hh (1.2): Implement is_empty and
+	  is_universe.	Specialise the reduce methods for
+	  Direct_Product<NNC_Polyhedron, Grid>.
+
+2006-06-06 Tuesday 17:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_interface_generator_prolog_dat.m4,
+	  ppl_interface_generator_prolog_icc_code.m4,
+	  ppl_interface_generator_prolog_icc_preamble
+	  (interfaces.[13,7,3]): LP_Problem is no longer generated with the
+	  other classes.  In the dat.m4 file, all the LP_Problem procedures
+	  are listed as "library procedures" for the system Prolog files.
+
+2006-06-06 Tuesday 16:05  Matthew Mundell
+
+	* src/: Congruence.defs.hh (1.12), Congruence.inlines.hh (1.11):
+	  Take out the private version of modulus().
+
+2006-06-06 Tuesday 15:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/exceptions.hh,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_preamble
+	  (interfaces.[19,2,12,9,6,2]): In
+	  ppl_interface_generator_common.m4, revised `m4_get_code_schema'
+	  to correct a bug.
+
+	  In the Prolog directory Allow for exceptions for any user class
+	  when using ppl class handles. There is one common exception
+	  called ppl_handle_mismatch for all classes.
+
+	  The code for term_to_polyhedron_handle and similar is now
+	  replaced by a schema that generates this code for all the user
+	  classes.
+
+	  The procedure list has XBD_Shape everywhere and the user class
+	  BD_Shape<int8_t> added to the list of classes being tested.
+
+2006-06-06 Tuesday 14:09  Matthew Mundell
+
+	* src/: Direct_Product.inlines.hh (1.4),
+	  Direct_Product.templates.hh (1.1), Makefile.am (1.154): Add
+	  Direct_Product.templates.hh.	Move reduce() and ascii_load(s)
+	  there.  Add inline keyword to all inline methods definitions.
+
+2006-06-06 Tuesday 13:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.12):
+	  Use @ instead of , to separate instances.
+
+2006-06-06 Tuesday 13:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (interfaces.6):
+	  Corrected code schemas using pattern DESCRIBE.
+
+2006-06-06 Tuesday 13:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh, BD_Shape.inlines.hh,
+	  BD_Shape.templates.hh (interfaces.[1,1,1]): Added methods:
+	  shrink_bounding_box	is_topologically_closed
+	  topologcal_closure_assign   is_disjoint_from
+	  add_recycled_constraints   add_recycled_constraints_and_minimize.
+
+2006-06-06 Tuesday 12:33  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.37), asciidumpload7.cc (1.1),
+	  directproduct1.cc (1.1): Add directproduct1 and asciidumpload7.
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (altnum.1): file asciidumpload7.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (interfaces.1): file
+	  asciidumpload7.cc was added on branch interfaces on 2006-06-11
+	  07:13:48 +0000
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (octagons.1): file asciidumpload7.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-06-06 Tuesday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload7.cc (simplex.1): file asciidumpload7.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-06-05 Monday 19:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.18):
+	  Fixed an old bug whereby "Polyhedron" could not be used to
+	  indicate that that was the only class to be coded for the
+	  schematic procedure name.
+
+2006-06-05 Monday 17:43  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.3), Direct_Product.inlines.hh
+	  (1.3): Add Direct_Product(bbox).
+
+2006-06-05 Monday 17:41  Matthew Mundell
+
+	* src/Grid.defs.hh (1.22), src/Grid_public.cc (1.30),
+	  tests/Grid/topclosed1.cc (1.9): Update is_topologically_closed to
+	  return true always.
+
+2006-06-05 Monday 17:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4, C/ppl_c.cc,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[17,1,11,5]): Fixed a bug in the Prolog dat.m4 file.
+	  Changed the separator in the input list to be an @ and not a ,.
+
+2006-06-05 Monday 17:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.11):
+	  Temporarily disable the generation of a few functions in some
+	  interfaces.
+
+2006-06-05 Monday 17:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
+	  (interfaces.4): Corrected comment in the first line.
+
+2006-06-05 Monday 17:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_interface_generator_prolog_icc.m4
+	  (interfaces.8): Prefer dnl to ifelse to have an m4 comment.
+
+2006-06-05 Monday 15:49  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.18): Add test23, which tests
+	  Linear_Expression(const Grid_Generator&).
+
+2006-06-05 Monday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generator1.cc (altnum.1): file generator1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-06-05 Monday 15:48  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh (1.23), Linear_Expression.cc (1.12),
+	  Linear_Expression.defs.hh (1.26): Add Linear_Expression(const
+	  Grid_Generator&).
+
+2006-06-05 Monday 14:55  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.21), Polyhedron.defs.hh (1.298): Correct
+	  type of get_lower_bound and get_upper_bound `closed' arguments in
+	  docs.
+
+2006-06-05 Monday 14:54  Matthew Mundell
+
+	* src/Grid.templates.hh (1.14): Add initialisation of box
+	  constructor closed flag variables.
+
+2006-06-05 Monday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.10):
+	  Octagon renamed Octagonal_Shape.  join_assign renamed
+	  upper_bound_assign.
+
+2006-06-05 Monday 12:11  Matthew Mundell
+
+	* src/: Direct_Product.defs.hh (1.2), Direct_Product.inlines.hh
+	  (1.2): Add domain1(), domain2(), reduce_domain1_with_domain2(),
+	  reduce_domain2_with_domain1(), reduce(), OK(), ascii methods and
+	  operator<<.  Implement some of the already defined methods.
+
+2006-06-05 Monday 12:09  Matthew Mundell
+
+	* src/globals.defs.hh (1.37): Add macro
+	  PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS.
+
+2006-06-05 Monday 10:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.16): In
+	  macro m4_replace_pattern, which gets called several times and
+	  re-defines the same macros (PATTERN, num_strings, etc.) each
+	  time, prefer using bultins pushdef and popdef instead of define.
+	  Same change in m4_all_classes_loop.  Prefer using pattern
+	  4CPP_CLASS4 to 4SYSCLASS4.  Macro m4_replace_with_code renamed as
+	  m4_get_code_schema.  Macro m4_filter changed so as to perform
+	  filtering by using m4_class_kind instead of m4_class.
+
+2006-06-05 Monday 10:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (interfaces.5):
+	  The CPP macro PPL_TYPE_DECLARATION made more readable by adding
+	  line breaks.
+
+2006-06-05 Monday 10:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_code.m4 (interfaces.5):
+	  In the code schemas, using pattern 4CPP_CLASS4 instead of 4CLASS4
+	  where appropriate.
+
+2006-06-05 Monday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (interfaces.4): The
+	  class preamble changed to invoke DECLARE_CONVERSIONS with two
+	  arguments.
+
+2006-06-05 Monday 10:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc_preamble
+	  (interfaces.4): The CPP macro DEECLARE_CONVERSIONS changed to
+	  take two arguments so as to also accomodate for the case of
+	  templatic classes, where the interface class name is different
+	  from the C++ class name in a nontrivial way.
+
+2006-06-05 Monday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (interfaces.4):
+	  Prefer dnl to # for m4 comments.
+
+2006-06-05 Monday 10:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.9):
+	  Prefer dnl to # to implement m4 comments.  Let the macros
+	  m4_class_group and m4_class_super_group take an argument instead
+	  of having its value hard-wired in.  The macro
+	  m4_pattern_substitution_list renamed as m4_patter_list (because
+	  it only list patterns and not their substitutions); dropped a
+	  mismatched parenthesis at the end of the list.
+
+2006-06-05 Monday 09:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (interfaces.[15,7]):
+	  Renamed and changed macro "m4_set_class" to
+	  "m4_replace_class_patterns".
+
+	  New version allows for different patterns for the class name so
+	  as to differentiate between the different applications of the
+	  pattern (user name, C++ name and the kind of class).
+
+2006-06-04 Sunday 22:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[14,8,10,4]): In ppl_interface_generator_common.m4,
+	  changed the macro name set_schema_strings to
+	  replace_all_patterns.
+
+	  The same name change in C/ppl_interface_generator_c_dat.m4 and
+	  Prolog/ppl_interface_generator_prolog_dat.m4 where this macro is
+	  defined.
+
+	  In the Prolog interface, the and_embed and and_project combined
+	  into one schema as already done in the C interface.
+
+	  In response to a FIXME comment in the C interface code, the
+	  concatenate_assign is now included in the schema corresponding to
+	  the binop pattern. This change has only been done in the Prolog
+	  interface.
+
+2006-06-04 Sunday 22:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.13):
+	  Added example for m4_get_name_components.  Entended macro
+	  m4_all_classes_loop to define more macros about the current class
+	  name - its components and type.  Added an example to show what is
+	  defined.
+
+2006-06-04 Sunday 16:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_cc_code.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  C/ppl_interface_generator_c_h_code.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[12,4,7,4,9,6,3]): All the patterns have been changed
+	  to 4PATTERN4 or 4UALT_PATTERN4 or 4UPATTERN4 or 4ALT_PATTERN4.
+	  Several patterns have improved names.  The pattern M4_CLASS is
+	  replaced by 4CLASS4 everywhere.
+
+2006-06-03 Saturday 16:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h_preamble (interfaces.4):
+	  Some formatting.  Declare print functions for congruences, grid
+	  generatorsand their systems.
+
+2006-06-03 Saturday 16:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_h.m4 (interfaces.3):
+	  Classes should be declared outside of the Doxygen documentation
+	  block listing their functions.
+
+2006-06-03 Saturday 16:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.6):
+	  Classes should be declared outside of the Doxygen comment block
+	  listing their functions.
+
+2006-06-03 Saturday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_h_code.m4 (interfaces.[3,3]): We now
+	  have a single ppl_new_<classname>_from_space_dimension() method,
+	  also taking an integer (interpreted as a Boolean) dictating
+	  whether or not the new object has to be empty or universe.
+
+2006-06-03 Saturday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_h_preamble (interfaces.[3,3]): Added a
+	  lot of (fixed, i.e., non m4-generated) interface code for the
+	  handling of congruences, grid generators and their systems.
+
+2006-06-03 Saturday 11:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4 (interfaces.[11,5]):
+	  Renamed m4_set_string by m4_replace_pattern.
+
+2006-06-03 Saturday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/ppl_interface_generator_common.m4 (interfaces.10):
+	  Prefer dnl to # when writing m4 comments.
+
+	  In macro m4_set_string(), made the following substitutions for
+	  readability:	- ustring	      ==> PATTERN  - actual_string
+	       ==> replacement	- alt_actual_string   ==> alt_replacement
+	  - Uactual_string	==> Replacement  - Ualt_actual_string  ==>
+	  Alt_Replacement
+
+	  Macros m4_init_*_classes() now take a single argument. The
+	  counter is only used by the auxiliary macros
+	  m4_init_*_classes_aux().
+
+2006-06-03 Saturday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc.m4,
+	  ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_dat.m4, ppl_interface_generator_c_h.m4,
+	  ppl_interface_generator_c_h_code.m4,
+	  ppl_interface_generator_c_h_preamble
+	  (interfaces.[3,2,2,5,2,2,2]): Corrected so as to use M4_CLASS and
+	  the new common functions defined by Pat.  Also made further steps
+	  towards the generation of the Grid C interface.
+
+2006-06-02 Friday 11:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[9,8]):
+	  Improved some comments.  Removed the definition and use of the
+	  short_class_name.
+
+2006-06-02 Friday 10:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[8,7]):
+	  Revised the way the user list of classes is handled and now the
+	  list of classes for both the interface names and the C++
+	  procedures must be a comma separated sequence.
+
+2006-06-02 Friday 08:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4 (interfaces.[7,6]):
+	  Changed the way the list of classes to be supported is given and
+	  how these are handled.  This aims to allow for automatic
+	  generation of these lists by the configure file.
+
+	  The current code will support the classes such as Polyhhedron,
+	  LP_Problem, Grid and also those such as BD_Shape<int8_t> with a
+	  numeric type.
+
+2006-06-01 Thursday 12:26  Matthew Mundell
+
+	* tests/Grid/coveringbox1.cc (1.11): Update test13 to DO_TEST_F16.
+
+2006-06-01 Thursday 11:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  Prolog/YAP/ppl_interface_generator_yap_cc.m4
+	  (interfaces.[6,4,4,4,3,3,3,3,2]): The macro "m4_extension" is now
+	  defined directly in the Prolog systems m4 files. The macro
+	  "extension" is no more.
+
+	  This change only affects the Prolog interface as the default
+	  definition for "m4_extension" for the C++ and C files is in the
+	  common.m4 file.
+
+	  Also, in common.m4, the internal counters for calls to
+	  m4_forloop, renamed as m4_i.
+
+2006-06-01 Thursday 10:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4
+	  (interfaces.[5,5,4,2]): The dynamically created macro "class" is
+	  now "m4_class".  The fixed list of classes "Class`'i is now
+	  m4_Class`'i The pattern CLASS is now M4_CLASS The pattern cLASS
+	  is now M4_lCLASS (l = lower case) Note that these changes need
+	  propagating in the C interface files.
+
+2006-06-01 Thursday 08:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4
+	  (interfaces.[4,4,4]): The dat.m4 file for the C interface is
+	  updated with changes to that in the prolog interface.
+
+	  Comments in the Prolog interface dat.m4 file improved.
+
+	  The arity "/" symbol is now optional for the procedure schema
+	  names - but this needs testing in the C interface.
+
+2006-05-31 Wednesday 23:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4
+	  (interfaces.[3,3,3,3]): Redone some code so that more is common -
+	  ie avoid having similar definitions in different files.  Changes
+	  to macro names will break the C interface m4 code and the
+	  "_dat.m4" will need revising.
+
+2006-05-31 Wednesday 22:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (interfaces.3): We now have to configure file
+	  ppl_c_version.h.in (not ppl_c.h.in).
+
+2006-05-31 Wednesday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, instchk.hh (interfaces.[2,2]): Correctly check for
+	  valid instantiations.
+
+2006-05-31 Wednesday 18:04  Matthew Mundell
+
+	* tests/Grid/congruences2.cc (1.3): Rename helper function
+	  `fulfils' to `satisfies'.  Correct test08.
+
+2006-05-31 Wednesday 17:16  Matthew Mundell
+
+	* tests/Grid/congruences2.cc (1.2): Convert the fulfils generator
+	  system parameter into a generator.
+
+2006-05-31 Wednesday 17:15  Matthew Mundell
+
+	* tests/Grid/affinepreimage1.cc (1.9): Convert test12 FIXME into a
+	  TODO.
+
+2006-05-31 Wednesday 17:14  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (1.12): Correct indentation of
+	  messages.  Turn test04 into a divisor test.
+
+2006-05-31 Wednesday 16:18  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (1.13): Leave the
+	  remove_space_dimensions swap_columns Matrix qualifiers as they
+	  are.
+
+2006-05-31 Wednesday 16:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (interfaces.1): A first attempt at
+	  generating automatically ppl_c.h.
+
+2006-05-31 Wednesday 16:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c_version.h.in (interfaces.1): Factored out the
+	  tiny part of ppl_c.h depending on PPL version number.
+
+2006-05-31 Wednesday 16:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_h.m4,
+	  ppl_interface_generator_c_h_code.m4,
+	  ppl_interface_generator_c_h_preamble (interfaces.[1,1,1]): First
+	  attempt at generating file ppl_c.h.
+
+2006-05-31 Wednesday 16:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_dat.m4 (interfaces.3):
+	  Dropping useless nofail attributes.
+
+2006-05-31 Wednesday 16:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_interface_generator_c_cc.m4 (interfaces.2):
+	  Using new common macro names.
+
+2006-05-31 Wednesday 16:05  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.8): Covert FIXMEs in expand_space_dimension
+	  and fold_space_dimensions to TODOs.
+
+2006-05-31 Wednesday 16:04  Matthew Mundell
+
+	* src/Grid_public.cc (1.29): Take FIXME out of
+	  generalized_affine_preimage/3.
+
+2006-05-31 Wednesday 15:17  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (1.16): Add namespace to
+	  operator== friend declaration.
+
+2006-05-31 Wednesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (interfaces.1): Allow instantiation with Grid of the
+	  non-C++ interfaces.
+
+2006-05-31 Wednesday 15:15  Matthew Mundell
+
+	* tests/Grid/boundingbox1.cc (1.11): Add int8 failure to test13
+	  invocation.
+
+2006-05-31 Wednesday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (interfaces.1): Restore the code for the
+	  --enable-instantiations configure option.
+
+2006-05-31 Wednesday 14:13  Matthew Mundell
+
+	* tests/Grid/coveringbox1.cc (1.10): Add int8 failure to test13
+	  invocation.
+
+2006-05-31 Wednesday 14:12  Matthew Mundell
+
+	* src/Grid.templates.hh (1.13): Move the Grid box constructor
+	  point_divisor declarations into the blocks that use them.
+
+2006-05-31 Wednesday 13:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (interfaces.3): Let also GNU
+	  Prolog compile.
+
+2006-05-31 Wednesday 13:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc, GNU/Makefile.am,
+	  GNU/ppl_gprolog.pl, GNU/ppl_interface_generator_gprolog_pl.m4,
+	  SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  SWI/ppl_swiprolog.cc, XSB/ppl_interface_generator_xsb_H.m4,
+	  XSB/ppl_interface_generator_xsb_cc.m4, XSB/ppl_xsb.H,
+	  XSB/ppl_xsb.cc, YAP/ppl_yap.cc
+	  (interfaces.[1,2,1,3,2,1,2,2,1,1,1]): Got rid of automatically
+	  generated files.
+
+2006-05-31 Wednesday 13:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/:
+	  ppl_interface_generator_sicstus_sd_cc.m4, ppl_sicstus_sd.cc
+	  (interfaces.[2,1]): Get rid of the ppl_sicstus_sd.cc (which is
+	  now generated automatically).
+
+2006-05-31 Wednesday 13:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am, ppl_ciao.pl,
+	  ppl_interface_generator_ciao_pl.m4 (interfaces.[2,1,3]): Let the
+	  automatically generated Ciao Prolog interface compile.
+
+2006-05-30 Tuesday 22:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  C/ppl_interface_generator_c_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
+	  (interfaces.[2,2,2,2,2,2,2]): Many of the fixed macro names are
+	  now prefixed by m4_.	Some internal codes improved.  The macros
+	  for generating the extensions for the Prolog systems moved to the
+	  prolog_systems.m4 file from the common.m4 file.
+
+2006-05-30 Tuesday 16:32  Matthew Mundell
+
+	* src/Grid.templates.hh (1.12): Use const references for
+	  point_divisor in the box constructors.
+
+2006-05-30 Tuesday 15:22  Matthew Mundell
+
+	* src/Grid.templates.hh (1.11): Update map_space_dimensions to
+	  throw an exception if the pfunc::maps call fails.
+
+2006-05-30 Tuesday 14:41  Matthew Mundell
+
+	* tests/Grid/grid3.cc (1.18): Correct DO_TEST invocations for
+	  test09 and test10.
+
+2006-05-30 Tuesday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid3.cc (altnum.1): file grid3.cc was added on branch
+	  altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-30 Tuesday 14:32  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.17), src/Congruence_System.cc (1.17),
+	  src/Grid_Generator.cc (1.13), src/Grid_Generator.defs.hh (1.22):
+	  Convert division operations to exact_div_assign calls.  Move
+	  Grid_Generator::scale_to_divisor to the private section.
+
+2006-05-30 Tuesday 13:57  Matthew Mundell
+
+	* src/Grid_public.cc (1.28): Move the modulus negation check back
+	  out of the congruence creation in generalized_affine_image/3 and
+	  generalized_affine_preimage/3.
+
+2006-05-30 Tuesday 13:46  Matthew Mundell
+
+	* src/Grid_conversion.cc (1.13): Convert division operations to
+	  exact_div_assign calls.
+
+2006-05-30 Tuesday 13:34  Matthew Mundell
+
+	* tests/Grid/: widening1.cc (1.12), widening2.cc (1.5): Correct
+	  indentation of messages.
+
+2006-05-30 Tuesday 13:33  Matthew Mundell
+
+	* tests/Grid/: boundingbox1.cc (1.10), coveringbox1.cc (1.9): Add
+	  tests with boxes of larger dimensions.
+
+2006-05-30 Tuesday 13:32  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.25): Update the reduce methods to create
+	  fewer temporaries explicitly and to use references to row[column]
+	  and pivot[column].
+
+2006-05-30 Tuesday 13:29  Matthew Mundell
+
+	* src/: Grid.templates.hh (1.10), Grid_Generator.defs.hh (1.21):
+	  Update the box constructors to create both systems.
+
+2006-05-29 Monday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_interface_generator_c_cc.m4,
+	  ppl_interface_generator_c_cc_code.m4,
+	  ppl_interface_generator_c_cc_preamble,
+	  ppl_interface_generator_c_dat.m4 (interfaces.[1,1,1,1]): Drafted
+	  a first attempt at generating one of the files (definitions) for
+	  interfacing polyhedra using C.
+
+2006-05-29 Monday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: ppl_interface_generator_common.m4,
+	  ppl_interface_generator_copyright, Prolog/Makefile.am,
+	  Prolog/exceptions.hh,
+	  Prolog/ppl_interface_generator_prolog_dat.m4,
+	  Prolog/ppl_interface_generator_prolog_icc.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_code.m4,
+	  Prolog/ppl_interface_generator_prolog_icc_preamble,
+	  Prolog/ppl_interface_generator_prolog_systems.m4,
+	  Prolog/Ciao/Makefile.am,
+	  Prolog/Ciao/ppl_interface_generator_ciao_pl.m4,
+	  Prolog/GNU/Makefile.am,
+	  Prolog/GNU/ppl_interface_generator_gprolog_pl.m4,
+	  Prolog/SICStus/Makefile.am,
+	  Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4,
+	  Prolog/SWI/Makefile.am,
+	  Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4,
+	  Prolog/XSB/Makefile.am,
+	  Prolog/XSB/ppl_interface_generator_xsb_H.m4,
+	  Prolog/XSB/ppl_interface_generator_xsb_cc.m4,
+	  Prolog/YAP/Makefile.am,
+	  Prolog/YAP/ppl_interface_generator_yap_cc.m4,
+	  Prolog/tests/Makefile.am, Prolog/tests/pl_grid_check.pl
+	  (interfaces.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Added m4 files for the generation of the Prolog interfaces.
+	  Modified makefiles so as to do their job in the new framework.
+	  (Tested only the SWI and YAP interfaces up to now).
+
+2006-05-26 Friday 07:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.178): Always use CHECK as
+	  early as possible.
+
+2006-05-25 Thursday 13:32  Matthew Mundell
+
+	* src/Grid_public.cc (1.27): Update affine_dimension() to use the
+	  minimized form of either system, preferring the generators.
+
+2006-05-25 Thursday 11:44  Matthew Mundell
+
+	* tests/Grid/relations3.cc (1.3): Print the congruences instead of
+	  the generators in test12.
+
+2006-05-25 Thursday 11:43  Matthew Mundell
+
+	* tests/Grid/grid2.cc (1.13): Correct DO_TEST invocations.
+
+2006-05-24 Wednesday 18:47  Matthew Mundell
+
+	* tests/Grid/: grid1.cc (1.15), grid3.cc (1.17): Update DO_TEST
+	  calls to reflect moved tests.
+
+2006-05-24 Wednesday 18:45  Matthew Mundell
+
+	* tests/Grid/grid2.cc (1.12): Correct comment about cong_test4.
+
+2006-05-24 Wednesday 18:45  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.11): Take out tracing calls to
+	  ascii_dump.
+
+2006-05-24 Wednesday 18:24  Matthew Mundell
+
+	* src/: Congruence_System.defs.hh (1.12),
+	  Congruence_System.inlines.hh (1.6), Grid.inlines.hh (1.7),
+	  Grid_nonpublic.cc (1.14), Grid_public.cc (1.26): Add private
+	  method Congruence_System::Congruence_System(d).  Update
+	  Grid::construct(const_gs) to only copy the given gs when needed.
+	  Update both Grid construct methods and their callers so that the
+	  initially constructed versions of con_sys and gen_sys are used
+	  when the grid is empty.
+
+2006-05-24 Wednesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.inlines.hh (altnum.1): file
+	  Congruence_System.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-05-24 Wednesday 18:18  Matthew Mundell
+
+	* src/Congruence.inlines.hh (1.10): Update zero_dim_false so that
+	  the inhomogeneous term of zdf is positive.
+
+2006-05-24 Wednesday 15:48  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (1.20): Update list of Grid friend
+	  declaration dependencies.
+
+2006-05-24 Wednesday 15:47  Matthew Mundell
+
+	* tests/Grid/relations3.cc (1.2): Add tests to cover the rest of
+	  relation_with(c).
+
+2006-05-24 Wednesday 15:46  Matthew Mundell
+
+	* src/Grid_public.cc (1.25): Complete relation_with(c).
+
+2006-05-24 Wednesday 14:10  Matthew Mundell
+
+	* src/: Scalar_Products.cc (1.5), Scalar_Products.defs.hh (1.7),
+	  Scalar_Products.inlines.hh (1.4): Add to Scalar_Product assign(z,
+	  c, gg), sign(c, gg), homogeneous_assign(z, gg, c) and
+	  homogeneous_sign(gg, c).
+
+2006-05-24 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.cc (altnum.1): file Scalar_Products.cc was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-05-24 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.defs.hh (altnum.1): file
+	  Scalar_Products.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-05-24 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.inlines.hh (altnum.1): file
+	  Scalar_Products.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:15 +0000
+
+2006-05-24 Wednesday 13:22  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.46): Improved the
+	  readability of
+	  Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-05-24 Wednesday 12:06  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.45): Improved the
+	  readability of   Octagonal_Shape<T>::generalized_affine_image().
+
+2006-05-23 Tuesday 16:27  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.44): Improved the
+	  readability of   Octagonal_Shape<T>::affine_image().
+
+2006-05-23 Tuesday 14:07  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.7): Update remove_higher_space_dimensions
+	  to also clear and resize the out-of-date system.
+
+2006-05-23 Tuesday 13:44  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.10): Add test10 and test11
+	  which test removal via congruences.
+
+2006-05-23 Tuesday 13:38  Matthew Mundell
+
+	* src/Grid.defs.hh (1.20), src/Grid_Generator_System.cc (1.12),
+	  src/Grid_Generator_System.defs.hh (1.15), src/Grid_chdims.cc
+	  (1.6), tests/Grid/removespacedims1.cc (1.11): Correct
+	  print_generator and print_congruence messages.  Add system
+	  printing to some tests.
+
+2006-05-23 Tuesday 13:28  Matthew Mundell
+
+	* src/: Congruence_System.cc (1.16), Congruence_System.defs.hh
+	  (1.11): Add remove_higher_space_dimensions(new_dimension).
+
+2006-05-23 Tuesday 11:57  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.43): Corrected a wrong
+	  parameter in the exeption throw in
+	  Octagonal_Shape<T>::remove_space_dimensions() and in the affine
+	  images and preimages.
+
+2006-05-19 Friday 13:57  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.36), relations3.cc (1.1): Add
+	  relations3, which tests Grid::relation_with(const Constraint&).
+
+2006-05-19 Friday 13:55  Matthew Mundell
+
+	* tests/Grid/: relations1.cc (1.12), relations2.cc (1.11): Correct
+	  indentation.	Improve a comment.
+
+2006-05-19 Friday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations1.cc (altnum.1): file relations1.cc was added
+	  on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-19 Friday 13:55  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.19), Grid_public.cc (1.24): Add
+	  relation_with(const Constraint& c).
+
+2006-05-18 Thursday 19:34  Matthew Mundell
+
+	* src/: C_Polyhedron.defs.hh (1.42), Grid.defs.hh (1.18),
+	  NNC_Polyhedron.defs.hh (1.45), Polyhedron.defs.hh (1.297):
+	  Replace phrases like "will be recycled" with phrases like "may be
+	  recycled".
+
+2006-05-18 Thursday 16:53  Matthew Mundell
+
+	* tests/Grid/Makefile.am (1.35): Drop writecongruencesystem1.dat
+	  from MOSTLYCLEANFILES.
+
+2006-05-18 Thursday 15:30  Matthew Mundell
+
+	* tests/BD_Shape/: addconstraints1.cc (1.13), affineimage1.cc
+	  (1.14), affinepreimage1.cc (1.14), bdsdifference1.cc (1.10),
+	  bdshull1.cc (1.10), bhmz05widening1.cc (1.10),
+	  cc76extrapolation1.cc (1.14), cc76narrowing1.cc (1.14),
+	  contains1.cc (1.12), fromgensys1.cc (1.13),
+	  generalizedaffineimage2.cc (1.15), generalizedaffinepreimage3.cc
+	  (1.2), intersection1.cc (1.13), limitedbhmz05extrapolation1.cc
+	  (1.9), limitedcc76extrapolation1.cc (1.10), relations2.cc (1.18),
+	  relations3.cc (1.15), removespacedims1.cc (1.14), timeelapse1.cc
+	  (1.13): Correct return values in exception tests.  As a result
+	  convert the value of d in affineimage1 test15 to 0 and do away
+	  with addconstraints1 test04 and test05 and affineimage1 test16.
+
+2006-05-18 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromgensys1.cc (altnum.1): file fromgensys1.cc was
+	  added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-05-18 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage3.cc (simplex.1): file
+	  generalizedaffinepreimage3.cc was added on branch simplex on
+	  2006-09-06 18:41:54 +0000
+
+2006-05-18 Thursday 14:52  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.42): Improved the
+	  readability of   Octagonal_Shape(const Generator_System& gs)
+	  using type aliases.
+
+2006-05-18 Thursday 12:24  Matthew Mundell
+
+	* tests/Grid/: addcongruence1.cc (1.10), addcongruences1.cc (1.13),
+	  addconstraint1.cc (1.9), addconstraints1.cc (1.10),
+	  addgenerator1.cc (1.11), addgenerators1.cc (1.10),
+	  addspacedims1.cc (1.11), affineimage2.cc (1.7),
+	  affinepreimage2.cc (1.4), boundingbox1.cc (1.9), boundingbox2.cc
+	  (1.8), bounds1.cc (1.12), concatenate1.cc (1.11), congruence1.cc
+	  (1.13), contains1.cc (1.9), coveringbox1.cc (1.8), disjoint1.cc
+	  (1.8), expandspacedim1.cc (1.8), foldspacedims1.cc (1.8),
+	  generalizedaffineimage1.cc (1.9), generalizedaffinepreimage1.cc
+	  (1.10), generalizedaffinepreimage2.cc (1.10), generator1.cc
+	  (1.16), grid1.cc (1.14), grid3.cc (1.16), griddifference1.cc
+	  (1.9), intersection1.cc (1.8), join1.cc (1.12), join2.cc (1.7),
+	  limitedextrapolation1.cc (1.9), limitedextrapolation2.cc (1.3),
+	  limitedextrapolation3.cc (1.2), relations1.cc (1.11),
+	  relations2.cc (1.10), removespacedims1.cc (1.10),
+	  removespacedims2.cc (1.9), timeelapse1.cc (1.8), widening1.cc
+	  (1.11), widening2.cc (1.4), widening3.cc (1.2): Correct return
+	  values in exception tests.
+
+2006-05-18 Thursday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraint1.cc (altnum.1): file addconstraint1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-18 Thursday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraints1.cc (altnum.1): file addconstraints1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-18 Thursday 12:19  Matthew Mundell
+
+	* tests/Grid/Makefile.am (1.34): Add many ascii_dump_load*.dat
+	  files to MOSTLYCLEANFILES.
+
+2006-05-18 Thursday 11:53  Matthew Mundell
+
+	* tests/Grid/: grid1.cc (1.13), grid2.cc (1.11), grid3.cc (1.15):
+	  From grid3 move generator tests into grid1 and congruence tests
+	  into grid2.
+
+2006-05-18 Thursday 11:16  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.15): Add test22 which tries to get
+	  the divisor of a line.
+
+2006-05-18 Thursday 11:07  Matthew Mundell
+
+	* tests/Grid/asciidumpload1.cc (1.10): Add Grid_Status ascii_load
+	  tests.
+
+2006-05-17 Wednesday 21:39  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.33), asciidumpload5.cc (1.1),
+	  asciidumpload6.cc (1.1): Add asciidumpload5 and asciidumpload6
+	  which test Congruence and Congruence_System.
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload5.cc (altnum.1): file asciidumpload5.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload5.cc (octagons.1): file asciidumpload5.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload5.cc (simplex.1): file asciidumpload5.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload6.cc (altnum.1): file asciidumpload6.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload6.cc (octagons.1): file asciidumpload6.cc
+	  was added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload6.cc (simplex.1): file asciidumpload6.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:38  Matthew Mundell
+
+	* tests/Grid/: asciidumpload1.cc (1.9), asciidumpload3.cc (1.2),
+	  asciidumpload4.cc (1.2): Add tests of ascii_load failure.
+
+2006-05-17 Wednesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload3.cc (simplex.1): file asciidumpload3.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload4.cc (simplex.1): file asciidumpload4.cc
+	  was added on branch simplex on 2006-09-06 18:41:54 +0000
+
+2006-05-17 Wednesday 21:36  Matthew Mundell
+
+	* src/Congruence_System.cc (1.15): Update ascii_load to return
+	  false if a congruence load fails.
+
+2006-05-17 Wednesday 16:37  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.41): Improved the
+	  readability of   Octagonal_Shape<T>::get_limiting_octagon().
+
+2006-05-17 Wednesday 15:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.40): Improved the
+	  readability of   Poly_Gen_Relation
+	  Octagonal_Shape<T>::relation_with().
+
+2006-05-17 Wednesday 14:40  Matthew Mundell
+
+	* tests/Grid/asciidumpload2.cc (1.3): Add zero dimension tests
+	  test15 and test16.
+
+2006-05-17 Wednesday 14:39  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.9): Add test13 which adds to a
+	  zero dim universe.  Correct returns in exception tests.
+
+2006-05-17 Wednesday 14:37  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.17), Grid_public.cc (1.23): Add an
+	  assertion that the given system has points in the zero dim case
+	  of add_recycled_generators.  Convert the exception in the zero
+	  dim case of add_recycled_generators_and_minimize to an assertion.
+
+2006-05-17 Wednesday 13:45  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.39): Changed the name
+	  of an index in       Octagonal_Shape<T>::add_constraint().
+	  Improved the readability of	   Poly_Con_Relation
+	  Octagonal_Shape<T>::relation_with().
+
+2006-05-17 Wednesday 13:12  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.32), generators2.cc (1.1),
+	  outputoperator3.cc (1.1): Add outputoperator3 which tests
+	  Grid_Generator_System IO operators.  Add generators2 which tests
+	  class Grid_Generator_System.
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators2.cc (altnum.1): file generators2.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators2.cc (octagons.1): file generators2.cc was
+	  added on branch octagons on 2006-11-18 20:36:56 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators2.cc (simplex.1): file generators2.cc was
+	  added on branch simplex on 2006-09-06 18:41:55 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator3.cc (altnum.1): file outputoperator3.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator3.cc (octagons.1): file
+	  outputoperator3.cc was added on branch octagons on 2006-11-18
+	  20:36:57 +0000
+
+2006-05-17 Wednesday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator3.cc (simplex.1): file
+	  outputoperator3.cc was added on branch simplex on 2006-09-06
+	  18:41:55 +0000
+
+2006-05-17 Wednesday 13:09  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc (1.11),
+	  Grid_Generator_System.defs.hh (1.14): Convert the exceptions in
+	  remove_space_dimensions and remove_higher_space_dimensions into
+	  assertions.
+
+2006-05-17 Wednesday 12:07  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.38): Improved the
+	  readability of   Octagonal_Shape<T>::add_constraint().
+
+2006-05-17 Wednesday 11:02  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (octagons.9): Moved
+	  Octagonal_Shape<T>::is_empty() to the right place.  Corrected
+	  some wrong comments in the distances' code.
+
+2006-05-16 Tuesday 22:43  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.31), outputoperator2.cc (1.1): Add
+	  outputoperator2, to test Grid_Generator IO operators.
+
+2006-05-16 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator2.cc (altnum.1): file outputoperator2.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-05-16 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator2.cc (octagons.1): file
+	  outputoperator2.cc was added on branch octagons on 2006-11-18
+	  20:36:57 +0000
+
+2006-05-16 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator2.cc (simplex.1): file
+	  outputoperator2.cc was added on branch simplex on 2006-09-06
+	  18:41:55 +0000
+
+2006-05-16 Tuesday 22:38  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.14): Add test20 to test type() and
+	  test21 to test scale_to_divisor().
+
+2006-05-16 Tuesday 22:37  Matthew Mundell
+
+	* src/Grid_Generator.cc (1.12): Update set_is_parameter to convert
+	  the generator from a point only when it is a point.
+
+2006-05-16 Tuesday 22:35  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (1.19): Improve coefficient_swap
+	  description slightly.
+
+2006-05-16 Tuesday 15:54  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.12): Correct comment in test15.
+
+2006-05-16 Tuesday 15:48  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.30), asciidumpload3.cc (1.1),
+	  asciidumpload4.cc (1.1): Add asciidumpload3 and asciidumpload4
+	  for Congruence and Congruence_System.
+
+2006-05-16 Tuesday 15:46  Matthew Mundell
+
+	* tests/Grid/congruences1.cc (1.9): Turn off test09 and test18, as
+	  Congruence_System::concatenate is now private.
+
+2006-05-16 Tuesday 15:44  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (1.12): Move test15 to addcongruence1
+	  (test05).  Add exception tests test15 and test16.
+
+2006-05-16 Tuesday 15:40  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.11): Add test15 which minimizes
+	  a grid with minimized congruences and up to date generators.
+	  Correct return values in exception tests.
+
+2006-05-16 Tuesday 15:38  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (1.9): Add space dimension test
+	  test05.
+
+2006-05-16 Tuesday 15:37  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.13): Add a comment in the max_min
+	  method.
+
+2006-05-16 Tuesday 15:36  Matthew Mundell
+
+	* src/: Congruence_System.cc (1.14), Congruence_System.defs.hh
+	  (1.10): Move concatenate(cgs) into the private section, adding
+	  the requirement that cgs must contain rows.
+
+2006-05-16 Tuesday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Og_Status.idefs.hh (octagons.4): Avoid useless white space.
+
+2006-05-16 Tuesday 12:20  quartieri
+
+	* src/Og_Status.idefs.hh (octagons.3): Indentation fixed.
+
+2006-05-16 Tuesday 12:19  quartieri
+
+	* src/Octagonal_Shape.inlines.hh (octagons.8): Moved some methods
+	  in the right place.
+
+2006-05-16 Tuesday 12:16  quartieri
+
+	* src/Octagonal_Shape.defs.hh (octagons.14): Corrected a wrong
+	  comment.
+
+2006-05-15 Monday 19:54  Matthew Mundell
+
+	* src/: Congruence.cc (1.9), Congruence.defs.hh (1.11),
+	  Congruence.inlines.hh (1.9): Convert Congruence(le,m,capacity) to
+	  Congruence(le,m), adding the requirement that m >= 0.
+
+2006-05-15 Monday 14:07  Matthew Mundell
+
+	* tests/Grid/grid3.cc (1.14): Add test22 and test23 which construct
+	  grids from constant zero dimension contraint systems.
+
+2006-05-15 Monday 14:06  Matthew Mundell
+
+	* tests/Grid/asciidumpload2.cc (1.2): Add test14 where the grid has
+	  a virtual generator.
+
+2006-05-15 Monday 14:05  Matthew Mundell
+
+	* tests/print.hh (1.35): Take out macro dump_grids.
+
+2006-05-15 Monday 14:05  Matthew Mundell
+
+	* src/Grid_public.cc (1.22): Update add_recycled_generators(gs) to
+	  assume that zero-dimension generator systems that contain
+	  generators always contain a point.
+
+2006-05-15 Monday 12:18  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.37): Renamed the
+	  iterator on the constraints system to avoid a shadowing problem
+	  in	    Octagonal_Shape<T>::get_limiting_octagon().
+
+2006-05-12 Friday 19:55  Matthew Mundell
+
+	* tests/Grid/grid3.cc (1.13): Add test20 and test21, which test
+	  adding zero dimension systems.
+
+2006-05-12 Friday 19:55  Matthew Mundell
+
+	* src/Grid_public.cc (1.21): Update Grid(cs) and Grid(ccs) to set
+	  the space dimension.	Rename ccs to cs in Grid(cs).
+
+2006-05-12 Friday 19:55  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.12): Update construct(ccgs) to use the
+	  given system when the space dimension is zero.
+
+2006-05-12 Friday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Direct_Product.defs.hh (1.1), Direct_Product.inlines.hh
+	  (1.1), Direct_Product.types.hh (1.1), Makefile.am (1.153):
+	  Started an implementation of the direct product construction for
+	  the "semantic" domains.
+
+2006-05-12 Friday 15:58  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.11): Convert the runtime exception in
+	  normalize_divisors(gs,gs) to an assertion.
+
+2006-05-12 Friday 15:56  Matthew Mundell
+
+	* src/Grid.defs.hh (1.16): Correct parameter indentation.
+
+2006-05-12 Friday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (1.6): Avoid any kind of using declaration in
+	  header files.
+
+2006-05-12 Friday 14:37  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.8): Correct the print_generators
+	  message in test11.  Add test12 to test the point-finding loop in
+	  Grid::normalize_divisors(gs,gs).
+
+2006-05-12 Friday 12:03  Matthew Mundell
+
+	* src/Grid.templates.hh (1.9): Improve comments in bounding box
+	  methods.
+
+2006-05-11 Thursday 17:52  Matthew Mundell
+
+	* tests/Polyhedron/addgenerators1.cc (1.10): Correct indentation.
+
+2006-05-11 Thursday 17:52  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.8): Turn off test05 and test06
+	  (remove_higher_space_dimensions is now private).
+
+2006-05-11 Thursday 17:51  Matthew Mundell
+
+	* tests/Grid/addgenerators1.cc (1.7): Correct indenting.  Turn off
+	  test05 and test06.  Add test11 to test zero_dim_univ().
+
+2006-05-11 Thursday 17:49  Matthew Mundell
+
+	* src/: Grid_Generator_System.defs.hh (1.13),
+	  Grid_Generator_System.inlines.hh (1.10): Add destructor,
+	  assignment operator and method zero_dim_univ.  Order declarations
+	  and inline definitions as in Generator.  Move [] operators,
+	  affine_image, add_universe_rows_and_columns,
+	  remove_space_dimensions and remove_higher_space_dimensions to the
+	  private section.
+
+2006-05-11 Thursday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.inlines.hh (altnum.1): file
+	  Grid_Generator_System.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-05-11 Thursday 14:57  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.24): Rework the post-reduction part of
+	  simplify(cgs) to better handle the case when the given system is
+	  empty or all zeroes, and to save the check on reduced_num_rows in
+	  the zero row clipping block.
+
+2006-05-11 Thursday 13:44  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.23): Add const to some variable types.
+
+2006-05-11 Thursday 12:32  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.13): Convert the type of the
+	  dimension variable in test17 from int to dimension_type.
+
+2006-05-11 Thursday 12:26  Matthew Mundell
+
+	* src/: Congruence.cc (1.8), Congruence.defs.hh (1.10),
+	  Constraint.cc (1.59), Constraint.defs.hh (1.120), Generator.cc
+	  (1.70), Generator.defs.hh (1.118), Grid_Generator.cc (1.11),
+	  Grid_Generator.defs.hh (1.18), Grid_widenings.cc (1.8),
+	  Linear_Expression.cc (1.11): Convert the types of dimension
+	  variable from int to dimension_type in class documentation
+	  examples, "<<" operators and Grid::select_wider_generators.
+
+2006-05-10 Wednesday 19:31  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.22): Convert variable pivot_dim in
+	  reduce_reduced to a reference.
+
+2006-05-10 Wednesday 19:14  Matthew Mundell
+
+	* src/Grid_public.cc (1.20): Move temporary sp out of the loop in
+	  method relation_with.  In generalized_affine_image/3 and
+	  generalized_affine_preimage/3 move the modulus negation check
+	  into the creation of the congruence to save the use of a
+	  temporary.
+
+2006-05-10 Wednesday 18:27  Matthew Mundell
+
+	* src/Grid_conversion.cc (1.12): In both conversion methods move
+	  temp integers out of loops and convert `source_dim' temp integers
+	  to references.
+
+2006-05-10 Wednesday 18:04  Matthew Mundell
+
+	* src/Grid.templates.hh (1.8): In get_covering_box replace the use
+	  of l_n and l_d with the use of `temp' and convert temp integer
+	  `divisor' into a reference.
+
+2006-05-10 Wednesday 17:19  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.12): Correct indentation in test17.
+
+2006-05-10 Wednesday 17:19  Matthew Mundell
+
+	* src/: Congruence_System.cc (1.13), Congruence_System.defs.hh
+	  (1.9), Congruence_System.inlines.hh (1.5),
+	  Grid_Generator_System.cc (1.10), Grid_Generator_System.defs.hh
+	  (1.12), Grid_Generator_System.inlines.hh (1.9),
+	  Grid_conversion.cc (1.11), Grid_simplify.cc (1.21): Update grid
+	  row and column counter variable names to *num_rows and
+	  *num_columns.
+
+2006-05-10 Wednesday 16:21  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.36): Improved the
+	  readability of the method
+	  Octagonal_Shape<T>::map_space_dimensions().
+
+2006-05-10 Wednesday 15:41  Matthew Mundell
+
+	* src/Congruence_System.cc (1.12): Add const to a few variable
+	  declarations.  In normalize_moduli convert the `modulus'
+	  variables to references and move temp integer `factor' out of the
+	  for loop.
+
+2006-05-10 Wednesday 15:21  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.35): Indented
+	  correctly a comment.
+
+2006-05-10 Wednesday 14:33  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.14): Renamed iterators in
+	  BD_Shape::get_limiting_shape() so as to avoid misleading name
+	  clash with space dimension indices Corrected a couple of typos in
+	  the (optional) output produced by OK() when invarinats are
+	  violated.
+
+2006-05-10 Wednesday 14:22  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.34): Corrected some
+	  comments in	 Octagonal_Shape<T>::generalized_affine_image().
+	  Added the definition for	 Octagonal_Shape<T>
+	  ::generalized_affine_preimage(const Linear_Expression& lhs,
+						      const Relation_Symbol
+	  relsym,					    const
+	  Linear_Expression& rhs).
+
+2006-05-10 Wednesday 14:19  quartieri
+
+	* src/Octagonal_Shape.defs.hh (octagons.13): Added the declaration
+	  for		 void generalized_affine_preimage(const
+	  Linear_Expression& lhs,
+	  const Relation_Symbol relsym,
+		const Linear_Expression& rhs).
+
+2006-05-10 Wednesday 14:18  Matthew Mundell
+
+	* src/Grid_widenings.cc (1.7): Correct parameter indentation.  Add
+	  const to some variable declarations.
+
+2006-05-10 Wednesday 13:57  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.20): Move temp integers out of the loop
+	  in reduce_reduced.
+
+2006-05-10 Wednesday 13:29  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.19): Replace semicolons in tracing
+	  statements.
+
+2006-05-10 Wednesday 13:08  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.13): Avoid almost useless uses of
+	  reference DB_Row (prefer the direct dbm accessors' operators if a
+	  single access to the row has to be done).
+
+2006-05-10 Wednesday 13:00  Matthew Mundell
+
+	* src/Grid_public.cc (1.19): Update relation_with(cg) to use a
+	  reference instead of a temporary integer for variable `modulus'.
+
+2006-05-10 Wednesday 12:22  Matthew Mundell
+
+	* src/Congruence.defs.hh (1.9): Convert use of namespace alias PPL
+	  to use of full name.
+
+2006-05-10 Wednesday 11:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.13): Avoid compiler warnings.
+
+2006-05-10 Wednesday 11:29  Elena Mazzi
+
+	* tests/BD_Shape/: Makefile.am (1.45),
+	  generalizedaffinepreimage2.cc (1.13),
+	  generalizedaffinepreimage3.cc (1.1): Added some tests for
+	  generalized_affine_preimage(const Linear_Expression& lhs,
+			     Relation_Symbol relsym,
+	  const Linear_Expression& rhs).
+
+2006-05-10 Wednesday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (altnum.1): file
+	  generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-05-10 Wednesday 11:27  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.71), BD_Shape.templates.hh (1.12):
+	  Defined a new method: BD_Shape::generalized_affine_preimage(const
+	  Linear_Expression& lhs,
+	  Relation_Symbol relsym,				  const
+	  Linear_Expression& rhs).
+
+2006-05-10 Wednesday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.cc (1.7), Float.inlines.hh (1.28),
+	  Grid_simplify.cc (1.18), checked.cc (1.18),
+	  checked_int.inlines.hh (1.52): Prefer predecrement and
+	  preincrement to postdecrement and postincrement.
+
+2006-05-10 Wednesday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (altnum.1): file checked.cc was added on branch
+	  altnum on 2006-10-29 19:27:15 +0000
+
+2006-05-10 Wednesday 11:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_ext.inlines.hh (1.31): Spurious goto removed.
+
+2006-05-10 Wednesday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_conversion.cc (1.10): Compiler warning avoided.
+
+2006-05-10 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.defs.hh (1.14), LP_Problem.defs.hh (1.9),
+	  LP_Problem.inlines.hh (1.9): Header file inclusions adjusted.
+
+2006-05-09 Tuesday 21:17  Matthew Mundell
+
+	* src/: Grid.defs.hh (1.15), Grid.inlines.hh (1.5),
+	  Grid_nonpublic.cc (1.10): Improve the descriptions of the
+	  normalize_divisors functions.  Add normalize_divisors(sys).
+	  Replace the second parameter of normalize_divisors(sys,divisor,f)
+	  with a writable reference and move the temporary in this method
+	  into the callers of the method.
+
+2006-05-09 Tuesday 17:04  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.5): Rename variable `tem' in
+	  add_space_dimensions(cgs,gs,d) to `old_modulus_index'.
+
+2006-05-09 Tuesday 16:47  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (1.9): Rename all row and column
+	  count variables to `num_rows' and `num_cols'.
+
+2006-05-09 Tuesday 16:44  Matthew Mundell
+
+	* src/Grid.templates.hh (1.7): In shrink_bounding_box replace the
+	  temporary `divisor' with a coefficient reference and the two
+	  temporaries `gcd' and `reduced_divisor' with a single temporary.
+
+2006-05-09 Tuesday 14:31  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.17): In reduce_pc_with_pc rename
+	  pivot_col to old_pivot_col and convert multiple array accesses to
+	  use references.
+
+2006-05-09 Tuesday 13:16  Matthew Mundell
+
+	* src/: Grid_conversion.cc (1.9), Grid_simplify.cc (1.16): Replace
+	  "red_" variable name prefixes with "reduced_".
+
+2006-05-09 Tuesday 12:25  Matthew Mundell
+
+	* tests/Grid/generator1.cc (1.11): Add tests of copy constructor
+	  and zero_dim_point().
+
+2006-05-09 Tuesday 12:24  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh (1.17), Grid_Generator.inlines.hh
+	  (1.11): Add copy constructor, destructor, max_space_dimension()
+	  and zero_dim_point().  Order declarations as in Generator.
+
+2006-05-09 Tuesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.inlines.hh (altnum.1): file
+	  Grid_Generator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-05-09 Tuesday 10:32  Matthew Mundell
+
+	* src/: Grid_conversion.cc (1.8), Grid_simplify.cc (1.15): Replace
+	  statements using addition/subtraction and multiplication
+	  operators with calls to sub_mul_assign and add_mul_assign.
+
+2006-05-09 Tuesday 10:25  Matthew Mundell
+
+	* src/: Grid_Generator.cc (1.10), Grid_Generator.inlines.hh (1.10),
+	  Grid_Generator_System.cc (1.8): Tailor the Grid_Generator
+	  ascii_dump and ascii_load methods for grids.	Use these methods
+	  in Grid_Generator_System ascii_dump and ascii_load.
+
+2006-05-09 Tuesday 01:22  Andrea Cimino
+
+	* tests/Polyhedron/Makefile.am (simplex.6): Re-enabled lpproblem2.
+
+2006-05-09 Tuesday 01:13  Andrea Cimino
+
+	* tests/Polyhedron/: LP_Problem1.cc, LP_Problem2.cc, lpproblem2.cc
+	  (simplex.[6,3,4]): Fixed the tests: removed the old stuff and
+	  added lpproblem2, (probably) lost during the last merge.
+
+2006-05-08 Monday 19:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
+	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  instchk.hh, ppl.lsm.in, ppl.spec.in, Watchdog/CREDITS,
+	  Watchdog/ChangeLog, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/README, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/src/.cvsignore, Watchdog/src/Makefile.am,
+	  Watchdog/src/Watchdog.cc, Watchdog/utils/.cvsignore,
+	  Watchdog/utils/Makefile.am, debian/.cvsignore,
+	  debian/Makefile.am, debian/README, debian/changelog,
+	  debian/control, debian/libppl-dev.install,
+	  debian/libppl-gprolog.links, debian/libppl-pwl.copyright.in,
+	  debian/libppl-pwl.install, debian/libppl-sicstus.links,
+	  debian/libppl-swi.links, debian/libppl-yap.links,
+	  debian/libppl.copyright.in, debian/libppl.dirs,
+	  debian/libppl.install, debian/rules, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected_int16, demos/ppl_lpsol/expected_int16_a,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_int8, demos/ppl_lpsol/expected_int8_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/.cvsignore,
+	  doc/Makefile.am, doc/README.doc, doc/definitions.dox,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  doc/devref.tex, doc/ppl-config.1, doc/ppl.sty, doc/ppl_lcdd.1,
+	  doc/ppl_lpsol.1, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex, interfaces/Makefile.am,
+	  interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/OCaml/Makefile.am,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/.cvsignore,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_fpu_control.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_cxx_double_binary_format.m4,
+	  m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_float_binary_format.m4,
+	  m4/ac_cxx_float_is_iec_559.m4, m4/ac_cxx_long_double.m4,
+	  m4/ac_cxx_long_double_binary_format.m4,
+	  m4/ac_cxx_long_double_is_iec_559.m4, m4/ac_cxx_long_long.m4,
+	  m4/ac_text_md5sum.m4, m4/ppl.m4, src/.cvsignore,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/BHRZ03_Certificate.defs.hh,
+	  src/Bounding_Box.defs.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Congruence.types.hh,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Congruence_System.inlines.hh, src/Congruence_System.types.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	  src/DB_Row.templates.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Grid.defs.hh,
+	  src/Grid.inlines.hh, src/Grid.templates.hh, src/Grid.types.hh,
+	  src/Grid_Certificate.cc, src/Grid_Certificate.defs.hh,
+	  src/Grid_Certificate.inlines.hh, src/Grid_Certificate.types.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator.inlines.hh, src/Grid_Generator.types.hh,
+	  src/Grid_Generator_System.cc, src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_Status.cc,
+	  src/Grid_Status.idefs.hh, src/Grid_Status.inlines.hh,
+	  src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Grid_widenings.cc, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Interval.defs.hh, src/LP_Problem.cc, src/LP_Problem.types.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh, src/Makefile.am,
+	  src/Matrix.cc, src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.templates.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.templates.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.templates.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Result.defs.hh,
+	  src/Rounding_Dir.defs.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+	  src/Saturation_Matrix.inlines.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh,
+	  src/Variable.defs.hh, src/Widening_Function.defs.hh,
+	  src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_float.inlines.hh, src/checked_int.inlines.hh,
+	  src/checked_mpq.inlines.hh, src/checked_mpz.inlines.hh,
+	  src/checked_numeric_limits.hh, src/compiler.hh,
+	  src/float.types.hh, src/fpu-c99.inlines.hh,
+	  src/fpu-ia32.inlines.hh, src/fpu-none.inlines.hh,
+	  src/fpu-sparc.inlines.hh, src/fpu.defs.hh, src/fpu.types.hh,
+	  src/globals.defs.hh, src/globals.types.hh,
+	  src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/version.hh.in, tests/Makefile.am,
+	  tests/PFunction.cc, tests/PFunction.hh,
+	  tests/Partial_Function.cc, tests/Partial_Function.defs.hh,
+	  tests/Partial_Function.inlines.hh,
+	  tests/Partial_Function.types.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/ppl_test.cc, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/valgrind_suppressions,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhmz05widening2.cc,
+	  tests/BD_Shape/bhmz05widening3.cc,
+	  tests/BD_Shape/bhmz05widening4.cc,
+	  tests/BD_Shape/bhmz05widening5.cc,
+	  tests/BD_Shape/bhmz05widening6.cc,
+	  tests/BD_Shape/bhmz05widening7.cc,
+	  tests/BD_Shape/bhmz05widening8.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+	  tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+	  tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/empty5.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+	  tests/BD_Shape/exceptions3.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation2.cc,
+	  tests/BD_Shape/limitedcc76extrapolation3.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Grid/.cvsignore, tests/Grid/Makefile.am,
+	  tests/Grid/addcongruence1.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addconstraint1.cc, tests/Grid/addconstraints1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addgenerators1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/affinepreimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/asciidumpload2.cc,
+	  tests/Grid/bhz03widening1.cc, tests/Grid/bounded1.cc,
+	  tests/Grid/boundingbox1.cc, tests/Grid/boundingbox2.cc,
+	  tests/Grid/bounds1.cc, tests/Grid/certificate1.cc,
+	  tests/Grid/concatenate1.cc, tests/Grid/congruence1.cc,
+	  tests/Grid/congruences1.cc, tests/Grid/congruences2.cc,
+	  tests/Grid/contains1.cc, tests/Grid/copyconstruct1.cc,
+	  tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+	  tests/Grid/discrete1.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/isempty1.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc,
+	  tests/Grid/limitedextrapolation1.cc,
+	  tests/Grid/limitedextrapolation2.cc,
+	  tests/Grid/limitedextrapolation3.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mincongruences1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/outputoperator1.cc, tests/Grid/relations1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc, tests/Grid/widening2.cc,
+	  tests/Grid/widening3.cc, tests/Grid/writecongruencesystem.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc,
+	  tests/Polyhedron/LP_Problem3.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc,
+	  tests/Polyhedron/addcongruence1.cc,
+	  tests/Polyhedron/addcongruences1.cc,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/cnncconversion1.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/congruences1.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/nncminimize1.cc,
+	  tests/Polyhedron/nncminimize2.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc,
+	  tests/Polyhedron/valgrind_suppressions,
+	  tests/Polyhedron/watchdog1.cc, tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc, utils/.cvsignore,
+	  utils/Makefile.am
+	  (simplex.[1,2,2,2,2,2,2,5,2,2,2,2,1,1,1,2,2,1,2,2,2,1,2,2,1,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,5,5,2,2,4,4,2,2,2,2,2,2,2,1,2,2,2,1,2,2,2,2,3,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,43,4,2,3,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2, [...]
+	  Second merge from main trunk.
+
+2006-05-08 Monday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, interfaces/Prolog/ppl_prolog.icc,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.templates.hh, src/Congruence.cc,
+	  src/Congruence.defs.hh, src/Congruence.inlines.hh,
+	  src/Congruence_System.cc, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.templates.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh,
+	  src/DB_Row.templates.hh, src/Grid.templates.hh,
+	  src/Grid_Generator.cc, src/Grid_Generator.defs.hh,
+	  src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.inlines.hh, src/Grid_Status.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Linear_Expression.defs.hh, src/Makefile.am,
+	  tests/ppl_test.cc, tests/ppl_test.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/bdsdifference1.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc, tests/BD_Shape/bounded1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76narrowing1.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/fromgensys1.cc, tests/BD_Shape/frompolyhedron1.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/Grid/affineimage2.cc,
+	  tests/Grid/asciidumpload1.cc, tests/Grid/join1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/outputoperator1.cc,
+	  tests/Grid/writecongruencesystem.cc, tests/Polyhedron/Makefile.am
+	  (octagons.[1,3,3,1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,1,1,1,1,1,1,1,1,1,1,6,1,4,1,2,1,2,2,1,2,2,2,2,2,2,1,1,2,2,1,2,2,2,1,1,2,2,1,1,1,1,1,1,1]):
+	  First merge from main trunk.
+
+2006-05-08 Monday 16:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.33): Corrected a
+	  comment in	    Octagonal_Shape<T>::affine_preimage() and
+	  changed	`Coefficient b = expr.inhomogeneous_term();' in
+	  `const Coefficient& b = expr.inhomogeneous_term();'.
+
+2006-05-08 Monday 15:56  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.14): Reduce the number of implicit
+	  temporaries in the loop in reduce_pc_with_pc.  Move the explicit
+	  creation of temporary integers outside the same loop.
+
+2006-05-08 Monday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc (simplex.1): file Grid_simplify.cc was added
+	  on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:32  Matthew Mundell
+
+	* src/Grid_Status.cc (1.4): Drop the printing of the final trailing
+	  space from method ascii_dump.
+
+2006-05-08 Monday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.cc (simplex.1): file Grid_Status.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:30  Matthew Mundell
+
+	* src/Grid_public.cc (1.18): Update time_elapse_assign to use
+	  Grid_Generator::set_is_parameter() instead of multiple calls to
+	  Grid_Generator::set_divisor.
+
+2006-05-08 Monday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (simplex.1): file Grid_public.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:28  Matthew Mundell
+
+	* src/: Grid_Generator.cc (1.9), Grid_Generator.defs.hh (1.16): Add
+	  set_is_parameter().
+
+2006-05-08 Monday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.cc (simplex.1): file Grid_Generator.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.defs.hh (simplex.1): file
+	  Grid_Generator.defs.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-05-08 Monday 15:27  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc (1.7),
+	  Grid_Generator_System.inlines.hh (1.8): Tailor the ascii_dump and
+	  ascii_load methods for grids.
+
+2006-05-08 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.cc (simplex.1): file
+	  Grid_Generator_System.cc was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.inlines.hh (simplex.1): file
+	  Grid_Generator_System.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 14:05  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.32): Avoid repeated
+	  computations in
+	  Octagonal_Shape<T>::generalized_affine_image().
+
+2006-05-08 Monday 13:28  Matthew Mundell
+
+	* src/: Congruence.cc (1.6), Congruence.defs.hh (1.8),
+	  Congruence.inlines.hh (1.8), Linear_Expression.defs.hh (1.25):
+	  Add create(le,le), create(le,n) and create(n,le) to Congruence.
+	  Update the Congruence-returning %= operators to use the new
+	  create methods instead of requiring the friend relations between
+	  these operators and the Congruence and Linear_Expression classes.
+
+2006-05-08 Monday 13:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.cc (simplex.1): file Congruence.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 13:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh (simplex.1): file Congruence.defs.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-08 Monday 13:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.inlines.hh (simplex.1): file Congruence.inlines.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Matthew Mundell
+
+	* src/: Congruence.cc (1.5), Congruence_System.cc (1.11),
+	  Grid.templates.hh (1.6), Grid_conversion.cc (1.7),
+	  Grid_nonpublic.cc (1.9), Grid_public.cc (1.17), Grid_simplify.cc
+	  (1.13): Update many loops to loop down towards a constant instead
+	  of up towards a value in a variable.
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (simplex.1): file Congruence_System.cc
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (simplex.1): file Grid.templates.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_conversion.cc (simplex.1): file Grid_conversion.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (simplex.1): file Grid_nonpublic.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 16:51  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh,
+	  Octagonal_Shape.templates.hh (octagons.[12,7,31]): Renamed the
+	  parameter `v' to `v_id' in
+	  Octagonal_Shape<T>::forget_binary_octagonal_constraints().
+	  `v_id' is the index of variable whose constraints are forgotten,
+	  `v' was the index of rows/columns on `v_id' in the octagon,
+	  instead.
+
+2006-05-05 Friday 16:26  quartieri
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh,
+	  Octagonal_Shape.templates.hh (octagons.[11,6,30]): Renamed the
+	  parameter `v' to `v_id' in
+	  Octagonal_Shape<T>::forget_all_octagonal_constraints().  `v_id'
+	  is the index of variable whose constraints are forgotten, `v' was
+	  the index of rows/columns on `v_id' in the octagon, instead.
+
+2006-05-05 Friday 16:21  Elena Mazzi
+
+	* src/: BD_Shape.defs.hh (1.70), BD_Shape.templates.hh (1.11):
+	  Renamed some parameters in helper functions for the computation
+	  of affine relations: `pos_sum' and `neg_sum' renamed as `ub_v'
+	  and minus_lb_v'.
+
+	  Added some assertions in these helper funcions: - `sc_den' should
+	  be positive; - `ub_v' and `minus_lb_v' shouldn't be equal to
+	  plus infinity.
+
+2006-05-05 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (simplex.1): file BD_Shape.templates.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-05-05 Friday 15:42  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.29): Added some
+	  comments in Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().
+
+2006-05-05 Friday 15:39  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.28): Added some
+	  comments in Octagonal_Shape<T>::deduce_v_pm_u_bounds().
+
+2006-05-05 Friday 15:28  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.27): Added the
+	  assertion   assert(!is_plus_infinity(minus_lb_v)); in
+	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds() to ensure that
+	  `minus_lb_v' is a meaningful parameter.
+
+2006-05-05 Friday 15:23  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.26): Added the
+	  assertion   assert(!is_plus_infinity(ub_v)); in
+	  Octagonal_Shape<T>::deduce_v_pm_u_bounds() to ensure that `ub_v'
+	  is a meaningful parameter.
+
+2006-05-05 Friday 15:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.25): Added the
+	  assertion   assert(sc_den > 0); in
+	  Octagonal_Shape<T>::deduce_v_pm_u_bounds() and in
+	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().  `sc_den' is
+	  always positive.
+
+2006-05-05 Friday 14:27  quartieri
+
+	* src/Octagonal_Shape.defs.hh (octagons.10): Corrected the
+	  documentation for    void deduce_v_pm_u_bounds() and	       void
+	  deduce_minus_v_pm_u_bounds().
+
+2006-05-05 Friday 14:01  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.24): Corrected some
+	  comments in	  Octagonal_Shape<T>::deduce_v_pm_u_bounds().
+	  Corrected some comments and renamed `minus_q' in `q' in
+	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds() to improve
+	  readability.
+
+2006-05-05 Friday 13:48  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.23): Corrected some
+	  comments and renamed `q' in `minus_q' in
+	  Octagonal_Shape<T>::deduce_v_pm_u_bounds() to improve
+	  readability.
+
+2006-05-05 Friday 13:14  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.22): Corrected two
+	  bugs in	  Octagonal_Shape<T>::deduce_minus_v_pm_u_bounds().
+
+2006-05-04 Thursday 21:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.124), BD_Shape.defs.hh (1.69): Added
+	  a couple of missing \relates Doxygen commands.
+
+2006-05-04 Thursday 21:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in, devref.doxyconf-latex.in
+	  (octagons.[2,2]): Also consider files distances.* when producing
+	  the devref manual.
+
+2006-05-04 Thursday 21:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[12,17]):
+	  Added a few missing \relates Doxygen commands.  Corrected the
+	  name of a macro (error probably caused by uncareful query
+	  replace).  Reordered definitions of inline functions so as to
+	  alow inlining.
+
+2006-05-04 Thursday 21:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+	  (octagons.[9,5]): Added a few missing \relates Doxygen commands.
+
+2006-05-04 Thursday 16:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[8,21]): Helper functions for the computation of affine
+	  relations rewritten and reorganized:	- deduce_v_pm_u_bounds()
+	  now replaces the two functions    deduce_v_minus_u_bounds() and
+	  deduce_v_plus_u_bounds(), since these were	always called one
+	  after the other and they were going through the    same loop;  -
+	  similarly done for deduce_minus_v_pm_u_bounds();  - pos_sum and
+	  neg_sum parameters renamed as ub_v and minus_lb_v;  - code
+	  improved a lot for readability (and maybe also efficiency);  -
+	  avoided use of ROND_UP when dealing with mpq_class objects
+	  (prefer    using ROUND_NOT_NEEDED);  - removed inline directive
+	  from is_bounded().
+
+2006-05-04 Thursday 16:31  Matthew Mundell
+
+	* tests/Grid/maxmin1.cc (1.9): In check_both, check_minimize and
+	  check_maximize add parameter const qualifiers and convert all
+	  parameters to references.
+
+2006-05-04 Thursday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/maxmin1.cc (simplex.1): file maxmin1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 16:20  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.20): Reversed some
+	  loops.
+
+2006-05-04 Thursday 16:12  Matthew Mundell
+
+	* src/Grid_Generator.cc (1.8): Update the output operator to denote
+	  parameters with a `q'.
+
+2006-05-04 Thursday 15:56  Matthew Mundell
+
+	* src/Grid_simplify.cc (1.12): Improve variable names in
+	  reduce_parameter_with_line and reduce_congruence_with_equality.
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload1.cc (simplex.1): file asciidumpload1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/outputoperator1.cc (simplex.1): file
+	  outputoperator1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/writecongruencesystem.cc (altnum.1): file
+	  writecongruencesystem.cc was added on branch altnum on 2006-10-29
+	  19:27:28 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/writecongruencesystem.cc (simplex.1): file
+	  writecongruencesystem.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.cc (1.5), ppl_test.hh (1.47),
+	  BD_Shape/addconstraints1.cc (1.12), BD_Shape/affineimage1.cc
+	  (1.13), BD_Shape/affinepreimage1.cc (1.13),
+	  BD_Shape/bdsdifference1.cc (1.9), BD_Shape/bdshull1.cc (1.9),
+	  BD_Shape/bhmz05widening1.cc (1.9), BD_Shape/cc76extrapolation1.cc
+	  (1.13), BD_Shape/cc76narrowing1.cc (1.13), BD_Shape/contains1.cc
+	  (1.11), BD_Shape/fromgensys1.cc (1.12),
+	  BD_Shape/generalizedaffineimage2.cc (1.14),
+	  BD_Shape/intersection1.cc (1.12),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.8),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.9),
+	  BD_Shape/relations2.cc (1.17), BD_Shape/relations3.cc (1.14),
+	  BD_Shape/removespacedims1.cc (1.13), BD_Shape/timeelapse1.cc
+	  (1.12), Grid/asciidumpload1.cc (1.8), Grid/maxmin1.cc (1.8),
+	  Grid/outputoperator1.cc (1.6), Grid/writecongruencesystem.cc
+	  (1.6): Repeated using directives removed; others avoided.  Added
+	  missing inclusions and missing std:: qualifications.
+
+2006-05-04 Thursday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (simplex.1): file ppl_test.cc was added on
+	  branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-05-04 Thursday 14:49  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.19): Improved
+	  generalized_affine_preimage().
+
+2006-05-04 Thursday 14:17  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.18): Several (mainly
+	  readability) improvements to the implementation of method
+	  generalized_affine_image().
+
+2006-05-04 Thursday 13:47  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.17): Another pass
+	  through the code of generalized_affine_preimage(), to improve
+	  readability and thus maintainability.      - in the general case,
+	  the references inside the matrix are named	     m_*, e.g.,
+	  m_i, m_ci, m_v, etc.	Avoid almost useless uses of row_iterator
+	  (prefer the direct matrix accessors' operators if a single access
+	  to the row has to be done).
+
+2006-05-04 Thursday 13:09  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.16): Another pass
+	  through the code of generalized_affine_preimage(), to improve
+	  readability and thus maintainability.      - moved the definition
+	  of minus_den to avoid repeated computations;	   - in the case
+	  t==0, removed an unneccesary row_iterator and       defined
+	  two_b;	- in the case t==1, coeff renamed as w_coeff and
+	  lv_index renamed  as	   n_w.
+
+2006-05-04 Thursday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/Makefile.am (1.44), Polyhedron/Makefile.am
+	  (1.89): Unwanted indentation removed.
+
+2006-05-04 Thursday 12:16  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.15): Improved
+	  readability and thus maintainability in the methods of affine
+	  trasformations: - in the case t==1, the coefficient a renamed as
+	  w_coeff.
+
+	  Corrected a bug in the method affine_image().
+
+2006-05-04 Thursday 10:46  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.14): Improved
+	  readability and thus maintainability in the methods of affine
+	  trasformations: - last_var_id renamed as w_id; - num_var renamed
+	  as var_id.
+
+2006-05-04 Thursday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.13): Another pass
+	  through the code of affine_image(), to improve readability and
+	  thus maintainability.   - last_var_id renamed as w_id;   - in the
+	  case t==1, coeff renamed as w_coeff;	 - variable indices should
+	  be called *_id; the indices used to access the     matrix should
+	  be named n_*, e.g., var and n_w;   - the references inside the
+	  matrix are named m_*, e.g., m_i, m_ci, m_v, etc.  Avoid repeated
+	  testing of known conditionals; avoid almost useless uses of
+	  row_iterator (prefer the direct matrix accessors' operators if a
+	  single access to the row has to be done).
+
+2006-05-04 Thursday 10:05  Elena Mazzi
+
+	* src/Octagonal_Shape.templates.hh (octagons.12): Some (mainly
+	  readability) improvements to the implementation of method
+	  affine_preimage().  Indented region in some methods.
+
+2006-05-03 Wednesday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.11): Several (mainly
+	  readability) improvements to the implementation of method
+	  affine_image() for the case when t == 1.
+
+2006-05-03 Wednesday 14:43  Elena Mazzi
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.templates.hh
+	  (octagons.[7,10]): Added a new method
+	  Octagonal_Shape::is_bounded().
+
+2006-05-03 Wednesday 14:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.9): A few improvements
+	  in method constraints() and operator <<.
+
+2006-05-03 Wednesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.8): Added (macro for)
+	  definitions of output functions.
+
+2006-05-02 Tuesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounded1.cc (altnum.1): file bounded1.cc was added
+	  on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-05-02 Tuesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounded1.cc (octagons.1): file bounded1.cc was
+	  added on branch octagons on 2006-05-08 16:16:44 +0000
+
+2006-05-02 Tuesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bounded1.cc (simplex.1): file bounded1.cc was
+	  added on branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-05-02 Tuesday 17:48  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.68), src/BD_Shape.templates.hh (1.10),
+	  tests/BD_Shape/Makefile.am (1.43), tests/BD_Shape/bounded1.cc
+	  (1.1): Defined a new method BD_Shape::is_bounded().  Added some
+	  tests for this method.
+
+2006-05-02 Tuesday 16:39  Elena Mazzi
+
+	* tests/BD_Shape/affinedimension1.cc (1.8): Rewrited and added some
+	  tests for affine_dimension().
+
+2006-05-02 Tuesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (1.2): test01() in
+	  frompolyhedron1.cc overflows when using 8-bit and 16-bit
+	  integers.
+
+2006-05-02 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (octagons.1): file
+	  frompolyhedron1.cc was added on branch octagons on 2006-05-08
+	  16:16:44 +0000
+
+2006-05-02 Tuesday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/frompolyhedron1.cc (simplex.1): file
+	  frompolyhedron1.cc was added on branch simplex on 2006-05-08
+	  17:15:53 +0000
+
+2006-05-02 Tuesday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (octagons.3): Added support for checking the
+	  results of approximated Octagonal_Shape computations.
+
+2006-05-02 Tuesday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[11,16]):
+	  All instances of OR_Matrix are now friends of each other.  Added
+	  constructor building an overapproximation of an OR_Matrix of a
+	  different coefficient type.
+
+2006-05-02 Tuesday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+	  (octagons.[6,4]): Added declarations and definitions of fucntions
+	  computing distances.	Added constructor converting from another
+	  Octagonal_Shape.  All instances of Octagonal_Shape are now
+	  friends of each other.
+
+2006-05-02 Tuesday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[10,15]):
+	  Added declarations and definitions of helper functions for
+	  computing distances.
+
+2006-05-02 Tuesday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh, Makefile.am, distances.defs.hh,
+	  distances.inlines.hh, distances.types.hh (octagons.[1,5,1,1,1]):
+	  Common code for computing distances put in files distances.*
+
+2006-05-02 Tuesday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.7): Restored previous
+	  version of is_strongly_reduced(): the modified version was not
+	  working as it was assumming that a strongly reduced matrix is
+	  just strongly closed plus Booleans indicating redundancies (as
+	  for BD shapes).  Removed a few redundant template qualifications.
+
+2006-05-02 Tuesday 12:31  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.9): Don't confuse the class
+	  used to solve the lp problems and the name of the program.
+
+2006-05-02 Tuesday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh,
+	  Octagonal_Shape.defs.hh, Octagonal_Shape.inlines.hh
+	  (octagons.[9,14,5,3]): OR_Matrix should know nothing about
+	  coherence. Methods at() moved in Octagonal_Shape and named
+	  matrix_at().
+
+2006-05-02 Tuesday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.6): Corrected a bug in
+	  is_strongly_reduced().
+
+2006-05-02 Tuesday 09:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.5): A few improvements
+	  to comments.	Added some missing const qualifiers; removed
+	  redundant parentheses.  Some improvements to the incremental
+	  strong closure procedure (mainly in readability). Corrected
+	  strong_coherence_assign().
+
+2006-04-30 Sunday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.4): Removed declarations
+	  for no longer used alternative implementations of (incremental)
+	  strong closure.
+
+2006-04-30 Sunday 18:46  quartieri
+
+	* src/Octagonal_Shape.templates.hh (octagons.4): Corrected a bug in
+	  Octagonal_Shape<T>::affine_preimage().  Erased some
+	  duplicated code lines and corrected the insertion of constraints
+	  in	     Octagonal_Shape<T>::generalized_affine_preimage().
+
+2006-04-30 Sunday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.inlines.hh (octagons.2): Avoid useless
+	  inclusions of iostream, sstream and stdexcept.  Avoid a few
+	  useless braces.  Deleted useless function
+	  strong_coherence_local_step().  Deleted functions
+	  get_matrix_element() (use OR_Matrix<T>::at() instead).  Some
+	  improvements (in particular, in assertion checking) in methods
+	  add_octagonal_constraint() and forget_octagonal_constraints().  A
+	  few documentation improvements.
+
+2006-04-30 Sunday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[8,13]):
+	  Added methods at(dimension_type, dimension_type) that provide
+	  controlled access to the matrix as if it was a square matrix.
+	  Corrected method clear().
+
+2006-04-30 Sunday 15:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.3): Corrected a bug in
+	  affine_dimension() regarding the identification of the singular
+	  zero-equivalence class.
+
+2006-04-30 Sunday 10:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (octagons.1): Drafted a common section for
+	  describing both BDSs and OSs.
+
+2006-04-30 Sunday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.3): Corrected a LaTeX error
+	  in the documentation.
+
+2006-04-30 Sunday 09:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (octagons.2): Added missing include
+	  directive for friend declaration.
+
+2006-04-30 Sunday 09:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.42), frompolyhedron1.cc (1.1):
+	  Added a test on the conversion from C_Polyhedron to BD_Shape
+	  exploiting the simplex algorithm.
+
+2006-04-29 Saturday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.9): Corrected the constructor taking
+	  a polyhedron an SIMPLEX_COMPLEXITY.
+
+2006-04-29 Saturday 22:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.templates.hh (octagons.2): Implemented the
+	  constructor building an OS from a Polyhedron.  Removed redundant
+	  template parameter in the argument of concatenate_assign().
+	  Small correction in the output of method OK().
+
+2006-04-29 Saturday 22:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagonal_Shape.defs.hh (octagons.2): Corrected some comments
+	  (in particular, references to Doxygen documentation).
+
+2006-04-29 Saturday 22:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (octagons.1): Octagonal_Shape is a friend
+	  of Polyhedron (needed for conversion).
+
+2006-04-29 Saturday 22:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (octagons.12): Removed redundant
+	  template parameter in the argument of operator-: it was confusing
+	  Doxygen.
+
+2006-04-29 Saturday 22:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/OR_Matrix.defs.hh (octagons.7): Removed trailing whitespace.
+
+2006-04-29 Saturday 12:15  Andrea Cimino
+
+	* tests/Polyhedron/lpproblem1.cc (simplex.3): Fixed the test to
+	  match the new expected result.
+
+2006-04-29 Saturday 11:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.8): Corrected the two bugs in
+	  generalized_affine_preimage() shown by test04() and test05() in
+	  generalizedaffinepreimage2.cc.
+
+2006-04-29 Saturday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.12): test05()
+	  shows a bug in BD_Shape::generalized_affine_preimage() that shows
+	  up when using GREATER_THAN_OR_EQUAL.
+
+2006-04-29 Saturday 11:04  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.42): Turned on the steepest edge
+	  floating point version.
+
+2006-04-29 Saturday 10:54  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.41): Removed redundant line.
+
+2006-04-29 Saturday 10:48  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.40): Turn off the steepest-edge
+	  floating point version by default.
+
+2006-04-29 Saturday 10:40  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.39): Fixed a bug in the floating point
+	  version: remember to initialize the values in the first loop
+	  before comparing `current' and `challenger' values.
+
+2006-04-29 Saturday 09:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.7): In
+	  BD_Shape<T>::affine_preimage(), corrected the bug shown by
+	  test09() of affinepreimage2.cc.
+
+2006-04-29 Saturday 09:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/affinepreimage2.cc (1.12): test09() shows a bug in
+	  the computation of BD_Shape<T>::affine_preimage() under somehow
+	  specific conditions (expression is invertible and on a single
+	  variable, denominator is equal to opposite of the coefficient of
+	  the variable and the inhomogeneous term is non-zero).
+
+2006-04-28 Friday 23:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am, src/Octagon.cc, src/Octagon.defs.hh,
+	  src/Octagon.inlines.hh, src/Octagon.templates.hh,
+	  src/Octagon.types.hh, src/Octagonal_Shape.cc,
+	  src/Octagonal_Shape.defs.hh, src/Octagonal_Shape.inlines.hh,
+	  src/Octagonal_Shape.templates.hh, src/Octagonal_Shape.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  doc/devref.doxyconf-html.in, doc/devref.doxyconf-latex.in,
+	  tests/ppl_test.hh, tests/print.hh
+	  (octagons.[4,2,17,17,28,2,1,1,1,1,1,2,3,1,1,2,2]): Class template
+	  Octagon renamed to Octagonal_Shape.
+
+2006-04-28 Friday 17:27  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[16,16,27]): Improved the private methods
+	  Octagon<T>::forget_all_octagonal_constraints() and
+	  Octagon<T>::forget_binary_octagonal_constraints().
+
+2006-04-28 Friday 16:46  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[15,15,26]): Improved the private methods
+	  Octagon<T>::add_octagonal_constraint().
+
+2006-04-28 Friday 16:18  quartieri
+
+	* src/Octagon.templates.hh (octagons.25): Corrected a bug in
+	  Octagon<T>::generalized_affine_preimage() and added some tests
+	  for it.
+
+2006-04-28 Friday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.6): Corrected a couple of typos in
+	  the (optional) output produced by OK() when invarinats are
+	  violated.  Renamed iterators in BD_Shape(const Generator_System&)
+	  so as to avoid misleading name clash with space dimension
+	  indices.
+
+2006-04-27 Thursday 17:08  quartieri
+
+	* src/Octagon.templates.hh (octagons.24): Corrected a bug in
+	  Octagon::generalized_affine_preimage() and added a test for it.
+
+2006-04-27 Thursday 17:05  Elena Mazzi
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.11): Corrected an
+	  error in `test04', but the bug remains.
+
+2006-04-27 Thursday 16:31  Elena Mazzi
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[6,11]):
+	  Improved the comments about the class OR_Matrix.
+
+2006-04-27 Thursday 13:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagon.templates.hh (octagons.23): Corrected a few spelling
+	  errors inside assertions.
+
+2006-04-27 Thursday 13:28  Elena Mazzi
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.10): Added a new
+	  test that shows a bug in the method:
+	  BD_Shape::generalized_affine_preimage().
+
+2006-04-27 Thursday 12:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagon.templates.hh (octagons.22): Committed an improved
+	  version of the inner loop of strong_closure_assign(), avoiding
+	  repeated conditional tests and coherent indexes computations.
+
+2006-04-27 Thursday 12:23  quartieri
+
+	* src/Octagon.templates.hh (octagons.21): Corrected the functions
+	  Octagon<T>::affine_image(),
+	  Octagon<T>::affine_preimage(),
+	  Octagon<T>::generalized_affine_image(const Variable var,
+					     const Relation_Symbol relsym,
+						   const Linear_Expression&
+	  expr ,
+	  Coefficient_traits::const_reference
+			denominator),
+	  Octagon<T>::generalized_affine_image(const Linear_Expression&
+	  lhs,						 const
+	  Relation_Symbol relsym,
+	  const Linear_Expression& rhs).  Added the function
+	  Octagon<T>::generalized_affine_preimage().
+
+2006-04-27 Thursday 12:04  quartieri
+
+	* src/Octagon.inlines.hh (octagons.14): Defined the function
+	  Octagon<T>::forget_binary_octagonal_constraints().
+
+2006-04-27 Thursday 12:00  quartieri
+
+	* src/Octagon.defs.hh (octagons.14): Added the new functions
+	  void forget_binary_octagonal_constraints() and  void
+	  generalized_affine_preimage().
+
+2006-04-27 Thursday 10:38  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[13,20]):
+	  Renamed `compute_nexts()' with `compute_successors()'.  Replaced
+	  the word `next' with `successor'.  Removed an obsolete line in
+	  Octagon::strong_reduction_assign().
+
+2006-04-26 Wednesday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[5,10]):
+	  Removed unused method OR_Matrix::erase_to_end().
+
+2006-04-26 Wednesday 14:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Octagon.templates.hh (octagons.19): Prefer
+	  OR_Matrix::shrink() to OR_Matrix::resize_no_copy() when we
+	  statically know that we are removing space dimensions.
+
+2006-04-26 Wednesday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[12,13,18]): In Octagon.defs.hh:   Small formatting and
+	  documentation improvements (Use the multiline   Doxygen comment
+	  style for comments spanning more lines).    Methods grouped into
+	  classes (as done for other domains).	  Added declarations for
+	  debugging-related output methods.
+
+	  In Octagon.inlines.hh:   Do not include useless file headers
+	  (vector, deque, string).    Avoid lines that are twoo long and
+	  trailing whitespace.	  Use OR_Matrix::shrink() instead of
+	  OR_Matrix::remove_rows().
+
+	  In OR_Matrix.templates.hh:   Do include header file for strings.
+	    Several optimizations to strong_closure_assign().	 Added
+	  several missing const modifiers.    Prefer using "\n" to
+	  std::endl when printing on streams.
+
+2006-04-26 Wednesday 14:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am, OR_Matrix.defs.hh, OR_Matrix.inlines.hh,
+	  OR_Matrix.templates.hh (octagons.[3,4,9,1]): In
+	  OR_Matrix.defs.hh:   Include globals.defs.hh; do not include
+	  vector and deque.    Small formatting and documentation
+	  improvements (Use the multiline    Doxygen comment style for
+	  comments spanning more lines).    Default constructor OR_Matrix()
+	  is now private and not implemented.	 Added method
+	  OR_Matrix::shrink() to remove some of the last dimensions    from
+	  the matrix; removed methods add_rows() and remove_rows().
+	  Corrected documentation of method ascii_dump & load.
+
+	  In OR_Matrix.inlines.hh:   Do not include useless file headers
+	  (vector, deque, string, iostream,   sstream, stdexcept).    Added
+	  missing inline declarations to methods row_size() and
+	  row_first_element_index(), as well as several const modifiers.
+	  Avoid lines that are twoo long and trailing whitespace.
+	  Removed (buggy) implementation of default constructor.
+	  Implemented new method OR_Matrix::shrink() and used in the
+	  implementation of resize_no_copy() (which still contains an
+	  efficiency bug).    Method that do not stand a chance of being
+	  inlined moved into	OR_Matrix.templates.hh (ascii_dump,
+	  ascii_load, operator<<, OK).
+
+	  In OR_Matrix.templates.hh:   Improved implementation of method
+	  OK() by printing the reasons	 of failures. Added
+	  debugging-related output methods.
+
+2006-04-26 Wednesday 12:09  Elena Mazzi
+
+	* src/Octagon.inlines.hh (octagons.12): Removed a silly and
+	  not-necessary function change(); renamed `position_cell()' with
+	  `get_matrix_element()'.
+
+2006-04-26 Wednesday 09:52  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[11,17]):
+	  Added a new constructor: Octagon(const Generator_System& gs).
+	  Improved and adjust some comments in Octagon::constraints().
+	  Improved the method Octagon::OK(): MINUS_INFINITY cannot occur at
+	  all.	Improved the method Octagon::is_strong_coherent(): removing
+	  some not necessary lines.
+
+	  Adjusted some comments in Octagon::map_space_dimensions(),
+	  Octagon::remove_space_dimensions().  Renamed also some silly
+	  variables.
+
+2006-04-20 Thursday 16:32  quartieri
+
+	* src/Octagon.templates.hh (octagons.16): Completed and corrected
+	  affine_image().  Corrected operator<<().  Cleaned some lines in
+	  affine_preimage().
+
+2006-04-20 Thursday 16:27  quartieri
+
+	* src/Octagon.inlines.hh (octagons.11): Corrected a wrong index in
+	  forget_all_octagonal_constraints().
+
+2006-04-20 Thursday 16:23  quartieri
+
+	* src/Octagon.defs.hh (octagons.10): Eliminated the wrong method
+	  `deduce_u_plus_v_bounds() and added the method
+	  deduce_minus_v_minus_u_bounds().
+
+2006-04-20 Thursday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.pl (1.89), GNU/ppl_gprolog.pl
+	  (1.60), SICStus/ppl_sicstus_sd.cc (1.93), SWI/ppl_swiprolog.cc
+	  (1.123), XSB/ppl_xsb.H (1.48), XSB/ppl_xsb.cc (1.88),
+	  YAP/ppl_yap.cc (1.116): Restore previous versions of system
+	  dependent files.
+
+2006-04-20 Thursday 07:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.177), Ciao/ppl_ciao.pl
+	  (1.88), GNU/ppl_gprolog.pl (1.59), SICStus/ppl_sicstus_sd.cc
+	  (1.92), SWI/ppl_swiprolog.cc (1.122), XSB/ppl_xsb.H (1.47),
+	  XSB/ppl_xsb.cc (1.87), YAP/ppl_yap.cc (1.115): Redundant widening
+	  code removed.
+
+2006-04-19 Wednesday 16:38  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[9,10,15]): Cleaned strong_reduction_assign().  Added a
+	  new method: Octagon::minimized_constraints().  Added tests for
+	  minimized_constraints().
+
+2006-04-19 Wednesday 15:02  Elena Mazzi
+
+	* src/Octagon.templates.hh (octagons.14): Fixed and added some
+	  comments in Octagon::concatenate_assign() and
+	  Octagon::is_strongly_reduced().
+
+2006-04-19 Wednesday 14:25  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[8,13]): No
+	  longer disregard the optional tokens parameter in the
+	  extrapolation and widening methods.  Renamed CH78_widening and
+	  limited_CH78_extrapolation respectly BHMZ05_widening and
+	  limited_BHMZ05_extrapolation.
+
+	  Tests for extrapolation and widening rewritten according to the
+	  new guidelines.
+
+2006-04-19 Wednesday 13:21  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[7,9,12]): No longer disregard the optional tokens
+	  parameter in the CC76_extrapolation_assign() methods.  Tests for
+	  Octagon::CC76_extrapolation_assign() rewritten according to the
+	  new guidelines.
+
+2006-04-19 Wednesday 12:55  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[6,8,11]): Fixed the constructors and some methods.
+	  Defined the methods	 deduce_v_plus_u_bounds() and
+	  deduce_u_plus_v_bounds() used by affine_image().
+
+2006-04-19 Wednesday 12:49  quartieri
+
+	* src/: OR_Matrix.defs.hh, OR_Matrix.inlines.hh (octagons.[3,8]):
+	  Replaced the private field 'num_rows_' with the field
+	  'space_dim', that is
+	  the dimension of the octagon represented by the OR_Matrix.
+
+2006-04-19 Wednesday 12:11  Elena Mazzi
+
+	* src/Octagon.templates.hh (octagons.10): Improved
+	  Octagon::CC76_narrowing_assign().  Tests for
+	  Octagon::CC76_narrowing_assign() rewritten according to the new
+	  guidelines.
+
+2006-04-19 Wednesday 12:05  Elena Mazzi
+
+	* src/BD_Shape.templates.hh (1.5): Corrected
+	  BD_Shape::get_limiting_shape().  Now there's no precision bug in
+	  BD_Shape::limited_CC76_extrapolation_assign().
+
+2006-04-19 Wednesday 11:54  Elena Mazzi
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (1.8): Corrected test
+	  number `6', now it shows a precision bug.
+
+2006-04-19 Wednesday 11:31  Elena Mazzi
+
+	* src/Octagon.templates.hh (octagons.9): Cleaned
+	  Octagon::add_constraint.  Methods poly_hull_assign() and
+	  poly_hull_assign_and_minimize() renamed as oct_hull_assign() and
+	  oct_hull_assign_and_minimize().  Tests for
+	  Octagon::oct_hull_assign() rewritten according to the new
+	  guidelines.
+
+2006-04-18 Tuesday 23:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[5,7,8]): Corrected copyright year and address of the
+	  FSF.	Added method strictly_contains().  Methods
+	  poly_hull_assign() and poly_hull_assign_and_minimize() renamed as
+	  oct_hull_assign() and oct_hull_assign_and_minimize().  Added
+	  method upper_bound_assign().	Added methods
+	  oct_hull_assign_if_exact() and upper_bound_assign_if_exact(),
+	  both with dummy implementations always returning false.  Added
+	  method difference_assign().  Added token parameter tp to
+	  CH78_widening_assign(), temporarily ignored, so as to allow for
+	  using this widening in widen_fun_ref().  Duplicated code for
+	  numer_denom() and assign_min() removed: now using numer_denom()
+	  and min_assign() as defined in Implementation::BD_Shapes.
+
+2006-04-18 Tuesday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (simplex.38): Improved
+	  LP_Problem::steepest_edge_entering_index() by avoiding duplicate
+	  computation and mitigating a problem (still present) whereby no
+	  caution is taken with respect to the possibility that
+	  mpq_class::get_d() (and, previously, also mpz_class::get_d())
+	  give rise to undefined behavior.  Added a FIXME not to forget
+	  about this problem.
+
+2006-04-18 Tuesday 21:01  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.8): Be verbose only if
+	  requested.
+
+2006-04-18 Tuesday 19:44  Andrea Cimino
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.7): Modified `ppl_lpsol' for
+	  testing purposes: added the options --no-optimization (-n) and
+	  --incremental (-i).
+
+2006-04-16 Sunday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/OR_Matrix.inlines.hh (octagons.7): Improved
+	  OR_Matrix<T>::ascii_load(): useless reference avoided, variable
+	  renamed, added a const qualifier.
+
+2006-04-16 Sunday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.72), devref.doxyconf-latex.in
+	  (1.12): Also generate devref docs from DB_Row.templates.hh and
+	  DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.152): Take into account DB_Row.templates.hh
+	  and DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.21), DB_Matrix.inlines.hh (1.26),
+	  DB_Matrix.templates.hh (1.1): DB_Matrix non-inline methods moved
+	  to DB_Matrix.templates.hh.
+
+2006-04-16 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (octagons.1): file
+	  DB_Matrix.templates.hh was added on branch octagons on 2006-05-08
+	  16:16:43 +0000
+
+2006-04-16 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.templates.hh (simplex.1): file
+	  DB_Matrix.templates.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-04-16 Sunday 08:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Row.defs.hh (1.18), DB_Row.inlines.hh (1.18),
+	  DB_Row.templates.hh (1.1): DB_Row non-inline methods moved in
+	  file DB_Row.templates.hh.  Methods begin() and end() are now
+	  declared inline.
+
+2006-04-16 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh (octagons.1): file DB_Row.templates.hh
+	  was added on branch octagons on 2006-05-08 16:16:43 +0000
+
+2006-04-16 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.templates.hh (simplex.1): file DB_Row.templates.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-04-14 Friday 18:25  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.6): Improved
+	  IO_Operators::operator<<().
+
+2006-04-14 Friday 17:29  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.5): Improved the method
+	  OR_Matrix<T>::ascii_load().
+
+2006-04-14 Friday 16:55  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.4): Improved the method
+	  OR_Matrix<T>::grow().
+
+2006-04-14 Friday 16:27  quartieri
+
+	* src/OR_Matrix.inlines.hh (octagons.3): Removed a wrong comment.
+
+2006-04-14 Friday 15:50  quartieri
+
+	* src/OR_Matrix.defs.hh (octagons.2): Corrected some wrong
+	  comments.
+
+2006-04-13 Thursday 15:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage2.cc (1.6), join1.cc (1.11): Added extra
+	  tests to match the running example in the Muller-Olm and Seidl
+	  2005 ESOP paper.  Small improvements to the tests using the
+	  example in the Muller-Olm and Seidl 2005 SAS paper
+
+2006-04-13 Thursday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (simplex.1): file affineimage2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-13 Thursday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join1.cc (simplex.1): file join1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-12 Wednesday 13:05  quartieri
+
+	* src/Octagon.inlines.hh (octagons.6): Restored a missing '#ifdef'
+	  line.
+
+2006-04-12 Wednesday 11:13  quartieri
+
+	* src/Octagon.inlines.hh (octagons.5): Removed the redundant
+	  definition of div_round_up: it is already in BD_Shape.inlines.hh.
+
+2006-04-11 Tuesday 17:06  quartieri
+
+	* src/: Octagon.defs.hh, Octagon.inlines.hh, Octagon.templates.hh
+	  (octagons.[4,4,7]): Removed the unnecessary algorithms of strong
+	  closure and incremental strong closure.
+
+2006-04-10 Monday 16:11  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[3,6]):
+	  Added a new method `Octagon::affine_dimension()'.  Defined a new
+	  function `Octagon::compute_leaders(leader)' that the above method
+	  uses.
+
+2006-04-10 Monday 13:57  Elena Mazzi
+
+	* src/: Octagon.defs.hh, Octagon.templates.hh (octagons.[2,5]):
+	  Method Octagon::poly_difference_assign() renamed
+	  Octagon::oct_difference_assign().  Corrected a bug in
+	  Octagon::oct_difference_assign().
+
+	  Improved Octagon::transitive_reduction_assign() using two new
+	  functions: Octagon::compute_nexts() and
+	  Octagon::compute_leaders().
+
+2006-04-08 Saturday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.cc (1.3): Typo fixed in comment.
+
+2006-04-07 Friday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (octagons.1): Added template <typename T> void
+	  print_constraints(const Parma_Polyhedra_Library::Octagon<T>& oc,
+	  const std::string& intro = "", std::ostream& s = nout).
+
+2006-04-07 Friday 07:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc, addspacedims1.cc,
+	  affineimage1.cc, affinepreimage1.cc, ascii_dump_load1.cc,
+	  bdsdifference1.cc, bdshull1.cc, bhmz05widening1.cc,
+	  cc76extrapolation1.cc, cc76narrowing1.cc, concatenate1.cc,
+	  constraints1.cc, generalizedaffineimage1.cc,
+	  generalizedaffineimage2.cc, h79widening1.cc, intersection1.cc,
+	  limitedbhmz05extrapolation1.cc, limitedcc76extrapolation1.cc,
+	  limitedh79extrapolation1.cc, mapspacedims1.cc,
+	  minconstraints1.cc, removespacedims1.cc, timeelapse1.cc
+	  (octagons.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Spurious blank spaces removed.
+
+2006-04-07 Friday 07:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/universe1.cc (octagons.1): This test was wrong:
+	  fixed.
+
+2006-04-06 Thursday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am, Octagon.templates.hh, Og_Status.inlines.hh
+	  (octagons.[2,4,2]): Several corrections.
+
+2006-04-06 Thursday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Row.defs.hh, OR_Matrix.inlines.hh, Octagon.inlines.hh,
+	  Octagon.templates.hh (octagons.[1,2,3,3]): More corrections.	One
+	  FIXME added to DB_Row.defs.hh concerning a "private" that was
+	  temporarily turned into "public".
+
+2006-04-05 Wednesday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Octagon.inlines.hh, src/Octagon.templates.hh,
+	  src/globals.defs.hh, src/globals.inlines.hh, tests/ppl_test.hh
+	  (octagons.[2,2,1,1,1]): Lots of corrections.
+
+2006-04-05 Wednesday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Makefile.am, src/OR_Matrix.defs.hh,
+	  src/OR_Matrix.inlines.hh, src/OR_Matrix.types.hh, src/Octagon.cc,
+	  src/Octagon.defs.hh, src/Octagon.inlines.hh,
+	  src/Octagon.templates.hh, src/Octagon.types.hh,
+	  src/Og_Status.idefs.hh, src/Og_Status.inlines.hh,
+	  tests/Makefile.am (octagons.[1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Imported (with changes) from the private repository.
+
+2006-04-04 Tuesday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.56): The `-V' option is only
+	  available with the PPL version.
+
+2006-04-03 Monday 09:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.12): Revised failing tests for different
+	  checked integer configurations.
+
+2006-04-03 Monday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid3.cc (simplex.1): file grid3.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-04-03 Monday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.119), Constraint.inlines.hh (1.63):
+	  Added Constraint operator==(Variable v1, Variable v2), Constraint
+	  operator<=(Variable v1, Variable v2), Constraint
+	  operator>=(Variable v1, Variable v2), Constraint
+	  operator<(Variable v1, Variable v2) and Constraint
+	  operator>(Variable v1, Variable v2).
+
+2006-04-03 Monday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.13), BD_Shape.templates.hh (1.4),
+	  DB_Matrix.inlines.hh (1.25): Drop spurious semicolons.
+
+2006-04-03 Monday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.118): Use vertical spacing to separate
+	  declarations from one another.
+
+2006-03-31 Friday 16:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid.templates.hh (1.5), Grid_Generator.cc (1.7),
+	  Grid_Generator.defs.hh (1.15), Grid_Generator.inlines.hh (1.9),
+	  Grid_nonpublic.cc (1.8), Grid_public.cc (1.16): A grid generator
+	  is a "grid_line", "parameter" or "grid_point".
+
+2006-03-31 Friday 16:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.inlines.hh (simplex.1): file
+	  Grid_Generator.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-31 Friday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_public.cc (1.15): Allow for the empty constraint system
+	  when constructing a grid.  This fixes a bug illustrated by test03
+	  in grid3.cc
+
+2006-03-31 Friday 14:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/grid3.cc (1.11): test03 inserted to show a bug in the
+	  grids system when constructing a grid from an empty constraint
+	  system.
+
+2006-03-28 Tuesday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.192), README (1.49), configure.ac (1.231),
+	  src/Makefile.am (1.151): We are now in the 0.10 era.
+
+2006-03-28 Tuesday 11:19  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[37,26]):
+	  Underline the difference betweeen the `steepest-edge' and
+	  `textbook' techniques.
+
+2006-03-24 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid_simplify.cc (1.11), Polyhedra_Powerset.templates.hh
+	  (1.3): Spurious semicolons removed.
+
+2006-03-24 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.templates.hh (simplex.1): file
+	  Polyhedra_Powerset.templates.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_nonpublic.cc (1.7): Avoid variable re-declaration.
+
+2006-03-24 Friday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.inlines.hh (1.7), Congruence_System.inlines.hh
+	  (1.4): Inline definitions moved before their first use.
+
+2006-03-24 Friday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.inlines.hh (simplex.1): file
+	  Congruence_System.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generator1.cc (simplex.1): file generator1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.templates.hh (1.4), src/Grid_Generator.cc (1.6),
+	  src/Grid_Generator.defs.hh (1.14), src/Grid_Generator.inlines.hh
+	  (1.8), src/Grid_conversion.cc (1.6), src/Grid_public.cc (1.14),
+	  src/Grid_simplify.cc (1.10), tests/Grid/generator1.cc (1.10):
+	  Method Coefficient& Grid_Generator::divisor() removed.  Method
+	  void
+	  Grid_Generator::set_divisor(Coefficient_traits::const_reference)
+	  added.
+
+2006-03-24 Friday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence_System.inlines.hh (1.3),
+	  Grid_Generator_System.inlines.hh (1.7): Inline definitions moved
+	  before their first use.
+
+2006-03-24 Friday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generator1.cc (1.9): FIXME added.
+
+2006-03-24 Friday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.cc (1.10): Spurious variable re-declaration
+	  removed.
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.17), BD_Shape.defs.hh (1.67),
+	  Congruence.cc (1.4), Congruence.defs.hh (1.7),
+	  Congruence.inlines.hh (1.6), Congruence_System.cc (1.9),
+	  Congruence_System.defs.hh (1.8), Constraint.cc (1.58),
+	  Constraint.defs.hh (1.117), Constraint_System.cc (1.17),
+	  Constraint_System.defs.hh (1.28), DB_Matrix.defs.hh (1.20),
+	  Generator.cc (1.69), Generator.defs.hh (1.117),
+	  Generator_System.cc (1.18), Generator_System.defs.hh (1.17),
+	  Grid.defs.hh (1.14), Grid_Generator.cc (1.5),
+	  Grid_Generator.defs.hh (1.13), Grid_Generator_System.cc (1.6),
+	  Grid_Generator_System.defs.hh (1.11), Grid_Status.cc (1.3),
+	  Grid_Status.idefs.hh (1.3), Grid_public.cc (1.13), LP_Problem.cc
+	  (1.13), LP_Problem.defs.hh (1.8), Linear_Row.cc (1.18),
+	  Linear_Row.defs.hh (1.19), Linear_System.cc (1.38),
+	  Linear_System.defs.hh (1.25), Matrix.cc (1.93), Matrix.defs.hh
+	  (1.76), Ph_Status.cc (1.10), Ph_Status.idefs.hh (1.17),
+	  Poly_Con_Relation.cc (1.13), Poly_Con_Relation.defs.hh (1.32),
+	  Poly_Gen_Relation.cc (1.13), Poly_Gen_Relation.defs.hh (1.30),
+	  Polyhedra_Powerset.defs.hh (1.34), Polyhedron.defs.hh (1.296),
+	  Polyhedron_public.cc (1.74), Row.cc (1.98), Row.defs.hh (1.105),
+	  Saturation_Matrix.cc (1.9), Saturation_Matrix.defs.hh (1.8):
+	  Unwanted semicolons removed.
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.defs.hh (simplex.1): file
+	  Congruence_System.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.defs.hh (simplex.1): file Grid.defs.hh was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.defs.hh (simplex.1): file
+	  Grid_Generator_System.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.idefs.hh (simplex.1): file Grid_Status.idefs.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-24 Friday 16:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.inlines.hh (1.7): Inline definitions moved
+	  before their first use.
+
+2006-03-24 Friday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affinedim1.cc (1.9), bounded1.cc (1.10), bounds1.cc
+	  (1.11), discrete1.cc (1.4), maxmin1.cc (1.7), topclosed1.cc
+	  (1.8): Replaced assert(copy_compare(...)) with a comment.
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinedim1.cc (simplex.1): file affinedim1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounded1.cc (simplex.1): file bounded1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bounds1.cc (simplex.1): file bounds1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/discrete1.cc (simplex.1): file discrete1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosed1.cc (simplex.1): file topclosed1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 15:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (1.12), src/Grid_Generator.inlines.hh
+	  (1.6), tests/Grid/generator1.cc (1.8): Added coefficient() to
+	  Grid_Generator class.
+
+2006-03-24 Friday 11:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/widening2.cc (1.3): There is positive overflow for
+	  tests 12 and 13 for checked 8.
+
+2006-03-24 Friday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening2.cc (simplex.1): file widening2.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-24 Friday 11:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.defs.hh (1.6): Indentation fixed.
+
+2006-03-24 Friday 11:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.5), Congruence.inlines.hh (1.5),
+	  Linear_Expression.defs.hh (1.24): Lots of bogus declarations
+	  fixed.
+
+2006-03-23 Thursday 23:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.9): All comments on right of code moved
+	  (and, as needed, reworded) to separate line(s) before code being
+	  commented.
+
+2006-03-23 Thursday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.13), Grid_simplify.cc (1.8): Enforce a bit
+	  of const-correctness.
+
+2006-03-23 Thursday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_simplify.cc (1.7): Avoid the creation of several
+	  temporaries.
+
+2006-03-23 Thursday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.295), Polyhedron_chdims.cc (1.36),
+	  Polyhedron_public.cc (1.73): Do not use `f(...)' to mean function
+	  `f': use `f()' instead (the ellipsis indicates variable number of
+	  arguments in C++).  Puncutation fixes in comments.
+
+2006-03-22 Wednesday 13:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.196), src/Congruence.defs.hh (1.4),
+	  src/Congruence.inlines.hh (1.4), src/Linear_Expression.defs.hh
+	  (1.23), tests/Grid/congruence1.cc (1.11): Added n %= e to the
+	  allowed set of congruence constructors.  The current
+	  implementation is temporary; an executable specification needing
+	  friendship of Linear_Expression.
+
+2006-03-22 Wednesday 13:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruence1.cc (simplex.1): file congruence1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-22 Wednesday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.46): Removed find_variation(): it was plain
+	  nonsense.
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation3.cc (simplex.1): file
+	  limitedextrapolation3.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening1.cc (simplex.1): file widening1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/widening3.cc (simplex.1): file widening3.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.195), src/Grid.defs.hh (1.12),
+	  src/Grid_widenings.cc (1.6), tests/Grid/Makefile.am (1.29),
+	  tests/Grid/limitedextrapolation1.cc (1.8),
+	  tests/Grid/limitedextrapolation2.cc (1.2),
+	  tests/Grid/limitedextrapolation3.cc (1.1),
+	  tests/Grid/widening1.cc (1.10), tests/Grid/widening2.cc (1.2),
+	  tests/Grid/widening3.cc (1.1): There are now three flavours of
+	  grid widening.
+
+	  The `generator_widening_assign()' is as commited previously
+	  (using generators) and file `widening2.cc' tests this.
+
+	  The `congruence_widening_assign()' is a renaming of the old
+	  `widening_assign()' (using congruences) and `widening1.cc' tests
+	  this.
+
+	  The new `widening_assign()' uses either of the above two
+	  widenings depending on which of the systems describing the grid
+	  are up-to-date. The new test file `widening3.cc' tests this
+	  widening.
+
+	  There are, similarly, three flavours of a
+	  `limited_*extrapolation_assign()' operator.
+
+	  The documentation in `definitions.dox' on the grid widening has
+	  been brought up to date and improved.
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_widenings.cc (simplex.1): file Grid_widenings.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation1.cc (simplex.1): file
+	  limitedextrapolation1.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-16 Thursday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/limitedextrapolation2.cc (simplex.1): file
+	  limitedextrapolation2.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-14 Tuesday 11:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.defs.hh (1.11), src/Grid_Generator.defs.hh (1.11),
+	  src/Grid_Generator.inlines.hh (1.5), src/Grid_widenings.cc (1.5),
+	  tests/Grid/Makefile.am (1.28),
+	  tests/Grid/limitedextrapolation2.cc (1.1),
+	  tests/Grid/widening2.cc (1.1): Added new methods
+	  generator_widening_assign() and
+	  limited_generator_widening_assign() as defined in draft paper.
+
+	  Added method is_equal_at_dimension() for grid generators which is
+	  a clone of the existing method for congruences.
+
+	  widening2.cc and limitedextrapolation2.cc check the new widening.
+
+2006-03-13 Monday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.27): Added ascii_dump_load1.dat to
+	  MOSTLYCLEANFILES.
+
+2006-03-12 Sunday 20:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/congruencesystem1.cc (1.10): Tests in
+	  congruencesystem1.cc now included in congruences2.cc.
+
+2006-03-12 Sunday 10:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_widenings.cc (1.4): Typo in comment corrected.
+
+2006-03-12 Sunday 10:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.26), congruences1.cc (1.8),
+	  congruences2.cc (1.1), congruencesystem1.cc (1.9), generator1.cc
+	  (1.7), generators1.cc (1.10), grid3.cc (1.10),
+	  removespacedims1.cc (1.9), removespacedims2.cc (1.7): To improve
+	  coverage of testing added further tests.
+
+	  Test program congruences1 split into congruences1 and
+	  congruences2 to make room for extra tsets in congruences1.
+
+	  Tests in removespacedims1 check remove_space_dimensions while
+	  tests in  removespacedims2 check remove_higher_space_dimensions.
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences1.cc (simplex.1): file congruences1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/congruences2.cc (simplex.1): file congruences2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generators1.cc (simplex.1): file generators1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims1.cc (simplex.1): file
+	  removespacedims1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-12 Sunday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/removespacedims2.cc (simplex.1): file
+	  removespacedims2.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-12 Sunday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_9-branch.1): Update version.
+
+2006-03-12 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_9-branch.[1,1]): Mark
+	  ChangeLog.
+
+2006-03-11 Saturday 12:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/asciidumpload2.cc (1.1): Further tests for
+	  ascii_load() to improve coverage.
+
+2006-03-11 Saturday 12:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/asciidumpload2.cc (simplex.1): file asciidumpload2.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.25), addconstraints1.cc (1.9),
+	  addspacedims1.cc (1.10), asciidumpload1.cc (1.7), concatenate1.cc
+	  (1.10), congruence1.cc (1.10), congruencesystem1.cc (1.8),
+	  equals1.cc (1.9), generators1.cc (1.9), grid2.cc (1.10), grid3.cc
+	  (1.9), mincongruences1.cc (1.8), relations1.cc (1.10),
+	  relations2.cc (1.9), removespacedims1.cc (1.8): Small changes o
+	  existing tests.  Several new tests (in the existing files added
+	  to improve test coverage.  A few of these extra tests showed up
+	  bugs that are now fixed.
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraints1.cc (simplex.1): file
+	  addconstraints1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addspacedims1.cc (simplex.1): file addspacedims1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/concatenate1.cc (simplex.1): file concatenate1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/equals1.cc (simplex.1): file equals1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid2.cc (simplex.1): file grid2.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mincongruences1.cc (altnum.1): file mincongruences1.cc
+	  was added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mincongruences1.cc (simplex.1): file
+	  mincongruences1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations1.cc (simplex.1): file relations1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/relations2.cc (simplex.1): file relations2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-11 Saturday 09:53  Andrea Cimino
+
+	* TODO (simplex.4): Removed the previously added item.	In the
+	  incremental implementation, the check that a slack variable can
+	  avoid an artifical one is already implemented.
+
+2006-03-11 Saturday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.26): Updated.
+
+2006-03-11 Saturday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.8): Updated.
+
+2006-03-10 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/README (1.2): Incomplete sentence removed.
+
+2006-03-10 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/README (altnum.1): file README was added on branch altnum
+	  on 2006-10-29 19:26:52 +0000
+
+2006-03-10 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/README (simplex.1): file README was added on branch
+	  simplex on 2006-05-08 17:15:45 +0000
+
+2006-03-10 Friday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/changelog (1.4): Updated for PPL 0.9.
+
+2006-03-10 Friday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/changelog (altnum.1): file changelog was added on branch
+	  altnum on 2006-10-29 19:26:52 +0000
+
+2006-03-10 Friday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.25), Watchdog/ChangeLog (1.15): Updated.
+
+2006-03-10 Friday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: README.doc (1.10), devref.tex (1.20), user.tex (1.21):
+	  Followed the advice of the people at FSF: it should now be
+	  overwhelmingly clear that the documentation is distributed under
+	  the terms of the GNU Free Documentation License, Version 1.2 or
+	  any later version published by the Free Software Foundation.
+
+2006-03-10 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.48), Watchdog/README (1.14): Updated.
+
+2006-03-10 Friday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.47): Formatting improved.
+
+2006-03-10 Friday 10:47  Andrea Cimino
+
+	* TODO (simplex.3): Added one item.
+
+2006-03-10 Friday 10:40  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.36): Fixed a comment, due to the
+	  change in the last commit.
+
+2006-03-10 Friday 10:36  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.35): Don't add artificial variables
+	  also if the inhomogeneous term of an inequality is a zero. In
+	  many problems this decreases the number of iterations involved,
+	  specially in the satisfiability check.
+
+2006-03-10 Friday 10:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.6): Added a FIXME comment.
+
+2006-03-10 Friday 09:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.5): Fixed a bug in Grid simplify when
+	  there are two all zero (trivially true) equalities.
+
+2006-03-09 Thursday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/linearsystem1.cc (1.6): Added a workaround to
+	  avoid trivial (but intermittent) positive overflows when
+	  populating a Linear_Row with randomly generated values and using
+	  a bounded integer datatype.
+
+2006-03-09 Thursday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Random_Number_Generator.defs.hh (1.3),
+	  Random_Number_Generator.inlines.hh (1.8): Allow for the
+	  specification of a fixed seed.
+
+2006-03-09 Thursday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.defs.hh (altnum.1): file
+	  Random_Number_Generator.defs.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-03-09 Thursday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh (altnum.1): file
+	  Random_Number_Generator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-03-09 Thursday 08:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Grid_Generator.cc (1.4), Grid_Generator_System.inlines.hh
+	  (1.6): Comments concerning the extra parameter divisor column
+	  improved.
+
+2006-03-08 Wednesday 23:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.inlines.hh (1.5): Bug fixed for
+	  clear().
+
+2006-03-08 Wednesday 21:43  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[34,25]): Major
+	  improvement: check if a slack variable can avoid to insert an
+	  (useless) artificial variable.  Now (in the standard way, not
+	  incremental) the simplex solves `boeing1.mps --max' in half the
+	  time than before!
+
+2006-03-08 Wednesday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/Makefile.am (1.26), ppl_lpsol/Makefile.am
+	  (1.30): Fixed the use of ECHO_N and ECHO_C.
+
+2006-03-08 Wednesday 08:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator_System.cc (1.5): Fixed a bug in
+	  remove_higher_space_dimensions().
+
+2006-03-08 Wednesday 07:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/Makefile.am (1.25), ppl_lpsol/Makefile.am
+	  (1.29): No longer use `echo -n': it is non portable.
+
+2006-03-08 Wednesday 07:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.55): Enforce dependencies
+	  in order to cater for parallel builds.
+
+2006-03-07 Tuesday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.28): No longer use the
+	  non-portable `-e' option of `grep'.  On Solaris, optima are
+	  compared only up to 8 digits of precision.
+
+2006-03-07 Tuesday 21:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.230): New Automake conditional HOST_OS_SOLARIS.
+
+2006-03-07 Tuesday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.27): No longer use the
+	  `--ignore-all-space' option of `diff'.  Check the obtained optima
+	  also under Darwin.
+
+2006-03-07 Tuesday 16:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.8): Code change in previous commit
+	  revised and improved.
+
+2006-03-07 Tuesday 16:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.7): Bug fixed in
+	  PPL::Congruence_System::insert(const Congruence_System& y)
+
+2006-03-07 Tuesday 13:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.6): Fixed a bug in is_equal-to():
+	  Return false if the congruence systems do not have the same
+	  number of rows.
+
+2006-03-07 Tuesday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* STANDARDS (1.33): Typo corrected.  Revised for new standards for
+	  test programs.
+
+2006-03-07 Tuesday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.26): The `--ignore-all-space' of
+	  `diff' is not portable.
+
+2006-03-07 Tuesday 07:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README (1.46): Added an item about grids.
+
+2006-03-06 Monday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.25): Check obtained optima on
+	  Cygwin.
+
+2006-03-06 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.5), expected_int16_a (1.5),
+	  expected_int32 (1.6), expected_int32_a (1.6), expected_int64
+	  (1.6), expected_int64_a (1.6), expected_int8 (1.5),
+	  expected_int8_a (1.4), expected_mpz (1.7), expected_mpz_a (1.7),
+	  ppl_lpsol.c (1.30): Use a different format to print the optimum
+	  value.
+
+2006-03-06 Monday 13:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.88): The failing configurations
+	  of dualhypercubes.cc are now recorded inside the test.
+
+2006-03-06 Monday 13:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.24): Invoke `ppl_lpsol' with the
+	  `-c' option, when assertions are disabled.
+
+2006-03-06 Monday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.29): Drafted a partial
+	  implementation for option -c (check result). Currently, it only
+	  tests for the feasibility of the computed optimal point.
+
+2006-03-06 Monday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.54): Dependencies fixed.
+
+2006-03-06 Monday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/dualhypercubes.cc (1.8): Started adapting it to
+	  the new standards (but still checking nothing).
+
+2006-03-06 Monday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/maxspacedim1.cc (1.7): Added a fixme: the test
+	  is only doing some compile-time type checking.
+
+2006-03-06 Monday 11:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: minconstraints2.cc (1.10), nncminimize1.cc
+	  (1.4): Using std::distance() to compute the number of
+	  constraints/generators and check their count is the expected one.
+
+2006-03-06 Monday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize1.cc (altnum.1): file nncminimize1.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize1.cc (simplex.1): file
+	  nncminimize1.cc was added on branch simplex on 2006-05-08
+	  17:15:57 +0000
+
+2006-03-06 Monday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence_System.defs.hh (1.7), Constraint_System.defs.hh
+	  (1.27), Generator_System.defs.hh (1.16),
+	  Grid_Generator_System.defs.hh (1.10): Let the const_iterator's of
+	  systems of constraints, generators, congruences and
+	  grid-genreators define the type alias difference_type, so as to
+	  allow for their use in algorithm such as std::distance.
+	  Corrected a bug in Grid_Generator_System, which was defining none
+	  of the required type aliases.
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruence1.cc (altnum.1): file
+	  addcongruence1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Grid/addcongruence1.cc, Polyhedron/addcongruence1.cc
+	  (simplex.[1,1]): file addcongruence1.cc was added on branch
+	  simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruences1.cc (altnum.1): file
+	  addcongruences1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Grid/addcongruences1.cc, Polyhedron/addcongruences1.cc
+	  (simplex.[1,1]): file addcongruences1.cc was added on branch
+	  simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addconstraint1.cc (simplex.1): file addconstraint1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerator1.cc (simplex.1): file addgenerator1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addgenerators1.cc (simplex.1): file addgenerators1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage1.cc (simplex.1): file affineimage1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage1.cc (simplex.1): file
+	  affinepreimage1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affinepreimage2.cc (simplex.1): file
+	  affinepreimage2.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/bhz03widening1.cc (simplex.1): file bhz03widening1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (altnum.1): file
+	  boundedaffineimage1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedaffinepreimage1.cc (altnum.1): file
+	  boundedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/boundedbhrz03extrapolation1.cc (altnum.1): file
+	  boundedbhrz03extrapolation1.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox1.cc (simplex.1): file boundingbox1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/boundingbox2.cc (simplex.1): file boundingbox2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/certificate1.cc (simplex.1): file certificate1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/cnncconversion1.cc (altnum.1): file
+	  cnncconversion1.cc was added on branch altnum on 2006-10-29
+	  19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/cnncconversion1.cc (simplex.1): file
+	  cnncconversion1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (altnum.1): file congruences1.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/congruences1.cc (simplex.1): file
+	  congruences1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/contains1.cc (simplex.1): file contains1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/copyconstruct1.cc (altnum.1): file copyconstruct1.cc
+	  was added on branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/copyconstruct1.cc (simplex.1): file copyconstruct1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox1.cc (simplex.1): file coveringbox1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/coveringbox2.cc (simplex.1): file coveringbox2.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/disjoint1.cc (simplex.1): file disjoint1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/expandspacedim1.cc (simplex.1): file
+	  expandspacedim1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/foldspacedims1.cc (simplex.1): file foldspacedims1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage1.cc (simplex.1): file
+	  generalizedaffineimage1.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffineimage2.cc (simplex.1): file
+	  generalizedaffineimage2.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generalizedaffinepreimage1.cc (altnum.1): file
+	  generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage1.cc (simplex.1): file
+	  generalizedaffinepreimage1.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generalizedaffinepreimage2.cc (altnum.1): file
+	  generalizedaffinepreimage2.cc was added on branch altnum on
+	  2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/generalizedaffinepreimage2.cc (simplex.1): file
+	  generalizedaffinepreimage2.cc was added on branch simplex on
+	  2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/grid1.cc (simplex.1): file grid1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/griddifference1.cc (simplex.1): file
+	  griddifference1.cc was added on branch simplex on 2006-05-08
+	  17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/intersection1.cc (simplex.1): file intersection1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isempty1.cc (simplex.1): file isempty1.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isuniverse1.cc (altnum.1): file isuniverse1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/isuniverse1.cc (simplex.1): file isuniverse1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/join2.cc (simplex.1): file join2.cc was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mapspacedims1.cc (simplex.1): file mapspacedims1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/membytes1.cc (simplex.1): file membytes1.cc was added
+	  on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mingenerators1.cc (simplex.1): file mingenerators1.cc
+	  was added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (altnum.1): file nncminimize2.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (simplex.1): file
+	  nncminimize2.cc was added on branch simplex on 2006-05-08
+	  17:15:57 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (altnum.1): file numberinput1.cc
+	  was added on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/timeelapse1.cc (simplex.1): file timeelapse1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosure1.cc (altnum.1): file topclosure1.cc was
+	  added on branch altnum on 2006-10-29 19:27:28 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/topclosure1.cc (simplex.1): file topclosure1.cc was
+	  added on branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.45), BD_Shape/addconstraints1.cc (1.11),
+	  BD_Shape/addspacedims1.cc (1.11), BD_Shape/affinedimension1.cc
+	  (1.7), BD_Shape/affineimage1.cc (1.12), BD_Shape/affineimage2.cc
+	  (1.11), BD_Shape/affinepreimage1.cc (1.12),
+	  BD_Shape/affinepreimage2.cc (1.11), BD_Shape/ascii_dump_load1.cc
+	  (1.12), BD_Shape/bdsdifference1.cc (1.8), BD_Shape/bdshull1.cc
+	  (1.8), BD_Shape/bgp99extrapolation1.cc (1.7),
+	  BD_Shape/bhmz05widening1.cc (1.8), BD_Shape/bhz03widening1.cc
+	  (1.7), BD_Shape/cc76extrapolation1.cc (1.12),
+	  BD_Shape/cc76narrowing1.cc (1.12), BD_Shape/closure1.cc (1.14),
+	  BD_Shape/concatenate1.cc (1.11), BD_Shape/constraints1.cc (1.14),
+	  BD_Shape/contains1.cc (1.10), BD_Shape/empty1.cc (1.9),
+	  BD_Shape/equality1.cc (1.14), BD_Shape/fromgensys1.cc (1.11),
+	  BD_Shape/generalizedaffineimage1.cc (1.13),
+	  BD_Shape/generalizedaffineimage2.cc (1.13),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.12),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.9),
+	  BD_Shape/geomcovers1.cc (1.7), BD_Shape/h79widening1.cc (1.10),
+	  BD_Shape/intersection1.cc (1.11),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.7),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.7),
+	  BD_Shape/limitedh79extrapolation1.cc (1.10),
+	  BD_Shape/mapspacedims1.cc (1.11), BD_Shape/maxspacedim.cc (1.13),
+	  BD_Shape/minconstraints1.cc (1.7), BD_Shape/relations1.cc (1.15),
+	  BD_Shape/relations2.cc (1.16), BD_Shape/relations3.cc (1.13),
+	  BD_Shape/removespacedims1.cc (1.12), BD_Shape/timeelapse1.cc
+	  (1.11), BD_Shape/universe1.cc (1.11), BD_Shape/writebdshape1.cc
+	  (1.7), Grid/addcongruence1.cc (1.8), Grid/addcongruences1.cc
+	  (1.10), Grid/addconstraint1.cc (1.8), Grid/addconstraints1.cc
+	  (1.8), Grid/addgenerator1.cc (1.10), Grid/addgenerators1.cc
+	  (1.6), Grid/addspacedims1.cc (1.9), Grid/affinedim1.cc (1.8),
+	  Grid/affineimage1.cc (1.10), Grid/affineimage2.cc (1.5),
+	  Grid/affinepreimage1.cc (1.8), Grid/affinepreimage2.cc (1.3),
+	  Grid/asciidumpload1.cc (1.6), Grid/bhz03widening1.cc (1.8),
+	  Grid/bounded1.cc (1.9), Grid/boundingbox1.cc (1.8),
+	  Grid/boundingbox2.cc (1.7), Grid/bounds1.cc (1.10),
+	  Grid/certificate1.cc (1.10), Grid/concatenate1.cc (1.9),
+	  Grid/congruence1.cc (1.9), Grid/congruences1.cc (1.7),
+	  Grid/congruencesystem1.cc (1.7), Grid/contains1.cc (1.8),
+	  Grid/copyconstruct1.cc (1.6), Grid/coveringbox1.cc (1.7),
+	  Grid/coveringbox2.cc (1.8), Grid/discrete1.cc (1.3),
+	  Grid/disjoint1.cc (1.7), Grid/equals1.cc (1.8),
+	  Grid/expandspacedim1.cc (1.7), Grid/foldspacedims1.cc (1.7),
+	  Grid/generalizedaffineimage1.cc (1.8),
+	  Grid/generalizedaffineimage2.cc (1.8),
+	  Grid/generalizedaffinepreimage1.cc (1.9),
+	  Grid/generalizedaffinepreimage2.cc (1.9), Grid/generator1.cc
+	  (1.6), Grid/generators1.cc (1.8), Grid/grid1.cc (1.12),
+	  Grid/grid2.cc (1.9), Grid/grid3.cc (1.8), Grid/griddifference1.cc
+	  (1.8), Grid/intersection1.cc (1.7), Grid/isempty1.cc (1.5),
+	  Grid/isuniverse1.cc (1.8), Grid/join1.cc (1.10), Grid/join2.cc
+	  (1.6), Grid/limitedextrapolation1.cc (1.7), Grid/mapspacedims1.cc
+	  (1.8), Grid/maxmin1.cc (1.6), Grid/membytes1.cc (1.5),
+	  Grid/mincongruences1.cc (1.7), Grid/mingenerators1.cc (1.7),
+	  Grid/outputoperator1.cc (1.5), Grid/relations1.cc (1.9),
+	  Grid/relations2.cc (1.8), Grid/removespacedims1.cc (1.7),
+	  Grid/timeelapse1.cc (1.7), Grid/topclosed1.cc (1.7),
+	  Grid/topclosure1.cc (1.6), Grid/widening1.cc (1.9),
+	  Grid/writecongruencesystem.cc (1.5), Polyhedron/addcongruence1.cc
+	  (1.6), Polyhedron/addcongruences1.cc (1.8),
+	  Polyhedron/addconstraint1.cc (1.8), Polyhedron/addconstraints1.cc
+	  (1.9), Polyhedron/addconstraints2.cc (1.8),
+	  Polyhedron/addgenerator1.cc (1.9), Polyhedron/addgenerator2.cc
+	  (1.9), Polyhedron/addgenerators1.cc (1.9),
+	  Polyhedron/addgenerators2.cc (1.9), Polyhedron/addspacedims1.cc
+	  (1.9), Polyhedron/addspacedims2.cc (1.9),
+	  Polyhedron/affineimage1.cc (1.9), Polyhedron/affineimage2.cc
+	  (1.9), Polyhedron/affinepreimage1.cc (1.8),
+	  Polyhedron/affinetrans.cc (1.9), Polyhedron/ascii_dump_load1.cc
+	  (1.8), Polyhedron/ascii_dump_load2.cc (1.8),
+	  Polyhedron/ascii_dump_load3.cc (1.9),
+	  Polyhedron/bgp99extrapolation1.cc (1.10),
+	  Polyhedron/bhrz03widening1.cc (1.8),
+	  Polyhedron/bhrz03widening2.cc (1.8),
+	  Polyhedron/bhrz03widening3.cc (1.9), Polyhedron/bhz03widening1.cc
+	  (1.10), Polyhedron/bounded1.cc (1.9),
+	  Polyhedron/boundedaffineimage1.cc (1.7),
+	  Polyhedron/boundedaffinepreimage1.cc (1.6),
+	  Polyhedron/boundedbhrz03extrapolation1.cc (1.7),
+	  Polyhedron/boundedh79extrapolation1.cc (1.9),
+	  Polyhedron/boundingbox1.cc (1.12), Polyhedron/boundingbox2.cc
+	  (1.11), Polyhedron/boundingbox3.cc (1.12), Polyhedron/bounds1.cc
+	  (1.9), Polyhedron/cnncconversion1.cc (1.2),
+	  Polyhedron/concatenate1.cc (1.8), Polyhedron/congruences1.cc
+	  (1.6), Polyhedron/constraints1.cc (1.8), Polyhedron/contains1.cc
+	  (1.8), Polyhedron/contains2.cc (1.8), Polyhedron/disjoint1.cc
+	  (1.8), Polyhedron/disjoint2.cc (1.10), Polyhedron/empty1.cc
+	  (1.9), Polyhedron/equals1.cc (1.8), Polyhedron/expandspacedim1.cc
+	  (1.10), Polyhedron/expandspacedim2.cc (1.10),
+	  Polyhedron/foldspacedims1.cc (1.12), Polyhedron/foldspacedims2.cc
+	  (1.12), Polyhedron/generalizedaffineimage1.cc (1.9),
+	  Polyhedron/generalizedaffineimage2.cc (1.9),
+	  Polyhedron/generalizedaffinepreimage1.cc (1.6),
+	  Polyhedron/generalizedaffinepreimage2.cc (1.6),
+	  Polyhedron/generators1.cc (1.9), Polyhedron/geomcovers1.cc
+	  (1.11), Polyhedron/h79widening1.cc (1.8),
+	  Polyhedron/h79widening2.cc (1.8), Polyhedron/intersection1.cc
+	  (1.10), Polyhedron/limitedh79extrapolation1.cc (1.8),
+	  Polyhedron/linearpartition1.cc (1.8), Polyhedron/linearsystem1.cc
+	  (1.5), Polyhedron/linexpression1.cc (1.8),
+	  Polyhedron/lpproblem1.cc (1.7), Polyhedron/mapspacedims1.cc
+	  (1.11), Polyhedron/max_min1.cc (1.9), Polyhedron/mc91.cc (1.12),
+	  Polyhedron/minconstraints1.cc (1.8),
+	  Polyhedron/minconstraints2.cc (1.9), Polyhedron/mingenerators1.cc
+	  (1.8), Polyhedron/mingenerators2.cc (1.9),
+	  Polyhedron/nncminimize1.cc (1.3), Polyhedron/nncminimize2.cc
+	  (1.5), Polyhedron/numberinput1.cc (1.28), Polyhedron/onepoint.cc
+	  (1.9), Polyhedron/polydifference1.cc (1.8),
+	  Polyhedron/polydifference2.cc (1.8), Polyhedron/polyhull1.cc
+	  (1.8), Polyhedron/polyhull2.cc (1.9), Polyhedron/polypowerset1.cc
+	  (1.20), Polyhedron/relations1.cc (1.8), Polyhedron/relations2.cc
+	  (1.9), Polyhedron/relations3.cc (1.8),
+	  Polyhedron/removespacedims1.cc (1.8),
+	  Polyhedron/removespacedims2.cc (1.8), Polyhedron/timeelapse1.cc
+	  (1.8), Polyhedron/timeelapse2.cc (1.9), Polyhedron/topclosed1.cc
+	  (1.9), Polyhedron/topclosure1.cc (1.8), Polyhedron/universe1.cc
+	  (1.8), Polyhedron/universe2.cc (1.8), Polyhedron/writeconsys1.cc
+	  (1.8), Polyhedron/writegensys1.cc (1.8),
+	  Polyhedron/writepolyhedron1.cc (1.8),
+	  Polyhedron/writepolyhedron2.cc (1.8),
+	  Polyhedron/writerelation1.cc (1.10): Obsolete macro DO_TEST
+	  removed.  Macros NEW_TEST* renamed DO_TEST*.
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (altnum.1): file closure1.cc was added
+	  on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (altnum.1): file
+	  generalizedaffinepreimage1.cc was added on branch altnum on
+	  2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/writebdshape1.cc (altnum.1): file writebdshape1.cc
+	  was added on branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-06 Monday 08:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/topclosed1.cc (1.6): Renovation of topclosed1.cc done.
+
+2006-03-05 Sunday 23:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.87): Adapted removespacedims*.cc,
+	  timeelapse*.cc, topclosed*.cc, topclosure*.cc, universe*.cc,
+	  writegensys*.cc and writepolyhedron*.cc to new standards.
+
+2006-03-05 Sunday 23:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: writeconsys1.cc (1.7), writerelation1.cc
+	  (1.9): Adapted to new standards for tests.
+
+2006-03-05 Sunday 23:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: topclosure1.cc (1.7), topclosure2.cc (1.8),
+	  topclosure3.cc (1.7), topclosure4.cc (1.9), universe1.cc (1.7),
+	  universe2.cc (1.7), universe3.cc (1.7), universe4.cc (1.7),
+	  universe5.cc (1.7), universe6.cc (1.7), universe7.cc (1.7),
+	  writepolyhedron1.cc (1.7), writepolyhedron2.cc (1.7),
+	  writepolyhedron3.cc (1.8), writegensys1.cc (1.7), writegensys2.cc
+	  (1.8), writegensys3.cc (1.7): Adapted to new standards for tests.
+
+2006-03-05 Sunday 23:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: removespacedims1.cc (1.7),
+	  removespacedims10.cc (1.8), removespacedims2.cc (1.7),
+	  removespacedims3.cc (1.8), removespacedims4.cc (1.7),
+	  removespacedims5.cc (1.8), removespacedims6.cc (1.7),
+	  removespacedims7.cc (1.7), removespacedims8.cc (1.7),
+	  removespacedims9.cc (1.7), timeelapse1.cc (1.7), timeelapse2.cc
+	  (1.8), timeelapse3.cc (1.7), timeelapse4.cc (1.7), timeelapse5.cc
+	  (1.8), timeelapse6.cc (1.7), timeelapse7.cc (1.8), timeelapse8.cc
+	  (1.8), timeelapse9.cc (1.8), topclosed1.cc (1.8), topclosed2.cc
+	  (1.8), topclosed3.cc (1.7): Adapted to new standards for tests.
+
+2006-03-05 Sunday 22:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.186): Added item to "Enhancements for PPL 0.10" - Add a
+	  widening for grids using only generator representations.
+
+2006-03-05 Sunday 22:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_simplify.cc (1.4): Changed name of variable "num_rows"
+	  to more descriptive name.  Added and improved comments wrt this
+	  variable.
+
+2006-03-05 Sunday 22:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: print.hh (1.34), Grid/bhz03widening1.cc (1.7),
+	  Grid/certificate1.cc (1.9): Removed redundant code from
+	  Grid/certificate1.cc Added print_congruences for powersets in
+	  print.hh and use it in Grid/bhz03widening1.cc
+
+2006-03-05 Sunday 21:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.24), boundingbox1.cc (1.7),
+	  coveringbox2.cc (1.7), grid1.cc (1.11), limitedextrapolation1.cc
+	  (1.6), mapspacedims1.cc (1.7), maxmin1.cc (1.5), membytes1.cc
+	  (1.4), membytes2.cc (1.4), mincongruences1.cc (1.6),
+	  mingenerators1.cc (1.6), outputoperator1.cc (1.4), relations1.cc
+	  (1.8), relations2.cc (1.7), removespacedims1.cc (1.6),
+	  removespacedims2.cc (1.6), timeelapse1.cc (1.6), timeelapse2.cc
+	  (1.5), topclosure1.cc (1.5), widening1.cc (1.8),
+	  writecongruencesystem.cc (1.4): Basic renovation of grids tests
+	  completed.
+
+2006-03-05 Sunday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.9): Invoke `test01' and
+	  `test02' with NEW_TEST_F8A.
+
+2006-03-05 Sunday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.191): Added a brief description of the new Grid class.
+	  Added a mention of the new possibility of building only static or
+	  only shared libraries.  Completed the section on bugfixes.
+	  Tentative release date for PPL 0.9 is March 12, 2006.
+
+2006-03-05 Sunday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.185): Removed items that have already done.  Pushed all
+	  the others down to PPL 0.10.
+
+2006-03-05 Sunday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.36), config.sub (1.34), Watchdog/config.guess
+	  (1.20), Watchdog/config.sub (1.19): Updated.
+
+2006-03-05 Sunday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.229), demos/ppl_lpsol/Makefile.am (1.23):
+	  Automake conditional CYGWIN renamed HOST_OS_CYGWIN.  New Automake
+	  conditional HOST_OS_DARWIN.  Refrain from literal comparison of
+	  ppl_lpsol output also on Darwin.
+
+2006-03-05 Sunday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (1.4): Use NEW_TEST_F16A to invoke
+	  `test10'.
+
+2006-03-05 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.44): New macro NEW_TEST_F16A.
+
+2006-03-05 Sunday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/intersection1.cc (1.8): Tests `test01' and
+	  `test02' succeed also with 8-bit coefficients.
+
+2006-03-05 Sunday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.11): Actually, 16-bit coefficients
+	  are enough for `test01'.
+
+2006-03-05 Sunday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.71), devref.doxyconf-latex.in
+	  (1.11): Source file float.types.hh does not exist anymore.
+
+2006-03-05 Sunday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.22): Do not use `diff' to check
+	  the results under Cygwin.
+
+2006-03-05 Sunday 12:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.228): New AM_CONDITIONAL CYGWIN.  Version number
+	  bumped.
+
+2006-03-05 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.19): Copy and paste mistake fixed.
+
+2006-03-05 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.10): Test `test01' requires at least
+	  32-bit coefficients to succeed.
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (1.3): Support 64-bit long
+	  doubles.  Fixed several copy and paste mistakes.
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (altnum.1): file
+	  ac_cxx_long_double_binary_format.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_long_double_binary_format.m4 (simplex.1): file
+	  ac_cxx_long_double_binary_format.m4 was added on branch simplex
+	  on 2006-05-08 17:15:48 +0000
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (1.3): Fixed a couple of
+	  comments.
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (altnum.1): file
+	  ac_cxx_double_binary_format.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-03-05 Sunday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_double_binary_format.m4 (simplex.1): file
+	  ac_cxx_double_binary_format.m4 was added on branch simplex on
+	  2006-05-08 17:15:48 +0000
+
+2006-03-05 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.41), run_tests (1.17): Do not
+	  test with unsupported floating point types.
+
+2006-03-05 Sunday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (altnum.1): file run_tests was added on
+	  branch altnum on 2006-10-29 19:27:22 +0000
+
+2006-03-04 Saturday 23:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.19): Adapted to the new
+	  standards.
+
+2006-03-04 Saturday 23:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.86), relations1.cc (1.7),
+	  relations10.cc (1.7), relations11.cc (1.7), relations12.cc (1.7),
+	  relations13.cc (1.7), relations14.cc (1.7), relations15.cc (1.7),
+	  relations16.cc (1.7), relations17.cc (1.9), relations18.cc (1.7),
+	  relations19.cc (1.9), relations2.cc (1.8), relations3.cc (1.7),
+	  relations4.cc (1.7), relations5.cc (1.7), relations6.cc (1.8),
+	  relations7.cc (1.7), relations8.cc (1.7), relations9.cc (1.8):
+	  Adapted relations*.cc to the new standards for tests.
+
+2006-03-04 Saturday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.18), m4/ac_cxx_double_binary_format.m4 (1.2),
+	  m4/ac_cxx_float_binary_format.m4 (1.2),
+	  m4/ac_cxx_long_double_binary_format.m4 (1.2),
+	  src/Checked_Number.defs.hh (1.75), src/Checked_Number.inlines.hh
+	  (1.64), src/Float.defs.hh (1.21), src/checked_float.inlines.hh
+	  (1.65), src/checked_numeric_limits.hh (1.15): More improvements
+	  concerning the detection of supported floating point numbers.
+
+2006-03-04 Saturday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float_binary_format.m4 (altnum.1): file
+	  ac_cxx_float_binary_format.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-03-04 Saturday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float_binary_format.m4 (simplex.1): file
+	  ac_cxx_float_binary_format.m4 was added on branch simplex on
+	  2006-05-08 17:15:48 +0000
+
+2006-03-04 Saturday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.227), m4/ac_cxx_double_binary_format.m4 (1.1),
+	  m4/ac_cxx_double_is_iec_559.m4 (1.6),
+	  m4/ac_cxx_float128_binary_format.m4 (1.6),
+	  m4/ac_cxx_float32_binary_format.m4 (1.4),
+	  m4/ac_cxx_float64_binary_format.m4 (1.5),
+	  m4/ac_cxx_float96_binary_format.m4 (1.5),
+	  m4/ac_cxx_float_binary_format.m4 (1.1),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.6), m4/ac_cxx_long_double.m4
+	  (1.7), m4/ac_cxx_long_double_binary_format.m4 (1.1),
+	  m4/ac_cxx_long_double_is_iec_559.m4 (1.6), m4/ac_cxx_long_long.m4
+	  (1.6), src/Float.defs.hh (1.20), src/Makefile.am (1.150),
+	  src/checked_int.inlines.hh (1.51), src/float.types.hh (1.17):
+	  Simplified the logic behind the detection of the relevant
+	  properties of the available floating point numbers.  Several
+	  unused Autoconf functions have been removed.
+
+2006-03-04 Saturday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.43), print.hh (1.33): Added template
+	  <typename PH> void print_constraints(const
+	  Polyhedra_Powerset<PH>&, const std::string, std::ostream& s).
+
+2006-03-04 Saturday 20:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: polyhull10.cc (1.7), polyhull11.cc (1.7),
+	  polyhull3.cc (1.8), polyhull4.cc (1.7), polyhull5.cc (1.8),
+	  polyhull6.cc (1.7), polyhull7.cc (1.7), polyhull8.cc (1.9),
+	  polyhull9.cc (1.9): No longer needed.
+
+2006-03-04 Saturday 20:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.85), polyhull1.cc (1.7),
+	  polyhull2.cc (1.8): Adapted polyhull*.cc to the new standards for
+	  tests.
+
+2006-03-04 Saturday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.84): Corrected (was still
+	  including referecnes to deleted polydifference*.cc tests).
+
+2006-03-04 Saturday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/append1.cc (1.8): Indentation fixed.
+
+2006-03-04 Saturday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.9): Rewritten.
+
+2006-03-04 Saturday 14:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.83): Adapted mingenerators*.cc,
+	  polydifference*.cc and onepoint.cc to new standards for tests.
+
+2006-03-04 Saturday 14:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.27): Started adapting this
+	  test to the new standards for tests.
+
+2006-03-04 Saturday 14:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/mc91.cc (1.8): Adapted to new standards for
+	  tests. Also added a FIXME as it currently tests nothing.
+
+2006-03-04 Saturday 13:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: mingenerators1.cc (1.7), mingenerators2.cc
+	  (1.8), mingenerators3.cc (1.7), polydifference1.cc (1.7),
+	  polydifference2.cc (1.7), polydifference3.cc (1.7),
+	  polydifference4.cc (1.8), polydifference5.cc (1.7),
+	  polydifference6.cc (1.7), polydifference7.cc (1.9),
+	  polydifference8.cc (1.7), polydifference9.cc (1.8), onepoint.cc
+	  (1.8): Adapted to new standards for tests.
+
+2006-03-03 Friday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.68): Dependencies fixed.
+
+2006-03-03 Friday 17:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.82): Adapted lpproblem*.cc,
+	  mapspacedims*.cc, max_min*.cc and minconstraints*.cc to new
+	  standards.
+
+2006-03-03 Friday 17:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: minconstraints1.cc (1.7), minconstraints2.cc
+	  (1.8), minconstraints3.cc (1.7), minconstraints4.cc (1.7),
+	  lpproblem1.cc (1.6), lpproblem2.cc (1.5), lpproblem3.cc (1.3),
+	  max_min1.cc (1.8), max_min2.cc (1.8), mapspacedims1.cc (1.10),
+	  mapspacedims2.cc (1.8), mapspacedims3.cc (1.8), mapspacedims4.cc
+	  (1.8): Adapted to new standards for tests.
+
+2006-03-03 Friday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.81): Adapted ascii_dump_laod* to
+	  new standards for tests.
+
+2006-03-03 Friday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/foldspacedims1.cc (1.11): Test test06() will
+	  only fail when using C_Polyhedron and 8 bit coefficients.
+
+2006-03-03 Friday 09:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: linearsystem1.cc (1.4), linexpression1.cc
+	  (1.7): Adapted to new standards for tests.
+
+2006-03-03 Friday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: ascii_dump_load1.cc (1.7), ascii_dump_load2.cc
+	  (1.7), ascii_dump_load3.cc (1.8), ascii_dump_load4.cc (1.8),
+	  ascii_dump_load5.cc (1.8), ascii_dump_load6.cc (1.9),
+	  ascii_dump_load7.cc (1.7): Adapted ascii_dump_load*.cc to new
+	  standards for tests.
+
+2006-03-03 Friday 08:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.80), linearpartition1.cc (1.7),
+	  linearpartition2.cc (1.7), linearpartition3.cc (1.7),
+	  linearpartition4.cc (1.8): Adapted linearpartition*.cc and
+	  limitedh79extrapolation*.cc to new standards for tests.
+
+2006-03-03 Friday 08:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: limitedh79extrapolation1.cc (1.7),
+	  limitedh79extrapolation2.cc (1.7), limitedh79extrapolation3.cc
+	  (1.7), limitedh79extrapolation4.cc (1.9): Adapted to new
+	  standards for tests.
+
+2006-03-02 Thursday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.226): The only purpose of the `debug_flag'
+	  variable is to hold "-DNDEBUG=1" when assertions are enabled.
+
+2006-03-02 Thursday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/foldspacedims2.cc (1.11): With 8-bit
+	  coefficients and assertions enabled test04 must fail.
+
+2006-03-02 Thursday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Polyhedron/Makefile.am (1.79), BD_Shape/Makefile.am
+	  (1.40), Grid/Makefile.am (1.23): Added @debug_flag@ to
+	  AM_CPPFLAGS.
+
+2006-03-02 Thursday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.78): Removing tests from XFAILS
+	  if they have already been adapted to the new standards for
+	  handling failures.
+
+2006-03-02 Thursday 11:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: foldspacedims1.cc (1.10), foldspacedims2.cc
+	  (1.10): Mark tests that should fail with 8 bit coefficients.
+
+2006-03-02 Thursday 08:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/join3.cc (1.7): Tests in join3.cc now included in
+	  join2.cc
+
+2006-03-02 Thursday 08:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.22), join1.cc (1.9), join1_16.cc
+	  (1.4), join2.cc (1.5): Revised tests using new guidelines
+
+2006-03-02 Thursday 07:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/intersection2.cc (1.6): Tests now in intersection1.cc
+
+2006-03-02 Thursday 07:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.21), generalizedaffineimage1.cc
+	  (1.7), generalizedaffineimage2.cc (1.7),
+	  generalizedaffinepreimage1.cc (1.8),
+	  generalizedaffinepreimage2.cc (1.8), generator1.cc (1.5),
+	  generators1.cc (1.7), grid1.cc (1.10), grid1_16.cc (1.7),
+	  grid1_64.cc (1.5), grid1_gmp.cc (1.5), grid2.cc (1.8),
+	  grid2_16.cc (1.5), grid3.cc (1.7), griddifference1.cc (1.7),
+	  intersection1.cc (1.6), intersection2.cc (1.5), isempty1.cc
+	  (1.4), isuniverse1.cc (1.7): Revised tests for new guidelines.
+
+2006-03-01 Wednesday 22:05  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.33): Added a float-based version of
+	  the steepest-edge technique (disabled by default).
+
+2006-03-01 Wednesday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: bgp99extrapolation1.cc (1.6), bhmz05widening1.cc
+	  (1.7), bhz03widening1.cc (1.6), cc76extrapolation1.cc (1.11),
+	  geomcovers1.cc (1.6), minconstraints1.cc (1.6), relations1.cc
+	  (1.14), relations2.cc (1.15): Standardize the use of using
+	  declarations: only local ones, without unnecessary
+	  Parma_Polyhedra_Library:: qualifications, and with a scope
+	  reduced as much as possible.
+
+2006-03-01 Wednesday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/geomcovers1.cc (1.10): Do not require recent
+	  versions of GCC just for printing something in test programs: use
+	  `using namespace IO_Operators;' instead of more refined things.
+
+2006-03-01 Wednesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.77): No longer needed XFAILs
+	  removed.
+
+2006-03-01 Wednesday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.10): Temporarily disable this test
+	  on Alpha machines.
+
+2006-03-01 Wednesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.76), intersection1.cc (1.7),
+	  intersection10.cc (1.9), intersection11.cc (1.9),
+	  intersection2.cc (1.7), intersection3.cc (1.7), intersection4.cc
+	  (1.8), intersection5.cc (1.8), intersection6.cc (1.8),
+	  intersection7.cc (1.7), intersection8.cc (1.8), intersection9.cc
+	  (1.8): Adapted intersection*.cc to new standards for tests.
+
+2006-03-01 Wednesday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.75), h79widening1.cc (1.7),
+	  h79widening2.cc (1.7), h79widening3.cc (1.7), h79widening4.cc
+	  (1.7), h79widening5.cc (1.8), h79widening6.cc (1.7),
+	  h79widening7.cc (1.7), h79widening8.cc (1.7): Adapted
+	  h79widening*.cc to new standards for tests.
+
+2006-03-01 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/geomcovers1.cc (1.9): Adapted to the new
+	  standards for tests.
+
+2006-03-01 Wednesday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.74), generators1.cc (1.8),
+	  generators2.cc (1.8), generators3.cc (1.8), generators4.cc (1.8),
+	  generators5.cc (1.7), generators6.cc (1.9), generators7.cc (1.7):
+	  Adapted generators*.cc to new standards for tests.
+
+2006-03-01 Wednesday 14:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.73),
+	  generalizedaffinepreimage1.cc (1.5),
+	  generalizedaffinepreimage2.cc (1.5),
+	  generalizedaffinepreimage3.cc (1.5),
+	  generalizedaffinepreimage4.cc (1.5): Adapted
+	  generalizedaffinepreimage*.cc to the new standards for tests.
+
+2006-03-01 Wednesday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (1.4): Fails with all bounded
+	  integers.
+
+2006-03-01 Wednesday 12:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.72), generalizedaffineimage1.cc
+	  (1.8), generalizedaffineimage10.cc (1.8),
+	  generalizedaffineimage11.cc (1.9), generalizedaffineimage12.cc
+	  (1.7), generalizedaffineimage13.cc (1.6),
+	  generalizedaffineimage14.cc (1.6), generalizedaffineimage2.cc
+	  (1.8), generalizedaffineimage3.cc (1.8),
+	  generalizedaffineimage4.cc (1.8), generalizedaffineimage5.cc
+	  (1.7), generalizedaffineimage6.cc (1.8),
+	  generalizedaffineimage7.cc (1.8), generalizedaffineimage8.cc
+	  (1.7), generalizedaffineimage9.cc (1.8): Adapted
+	  generalizedaffineimage*.cc to new standards for tests.
+
+2006-03-01 Wednesday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: foldspacedims1.cc (1.9), foldspacedims2.cc
+	  (1.9): Adapted foldspacedims*.cc to new standards for tests.
+
+2006-03-01 Wednesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: expandspacedim1.cc (1.9), expandspacedim2.cc
+	  (1.9): Adapted expandspacedim*.cc to new standards for tests.
+
+2006-03-01 Wednesday 11:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/equals1.cc (1.7): Adapted to new standards for
+	  tests.
+
+2006-03-01 Wednesday 11:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/empty1.cc (1.8): Adapted empty*.cc to new
+	  standards for tests.
+
+2006-03-01 Wednesday 11:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: boundedbhrz03extrapolation1.cc (1.6),
+	  boundedh79extrapolation1.cc (1.8): Modified to work correclty
+	  with failing coefficient configurations.
+
+2006-03-01 Wednesday 11:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.71), disjoint1.cc (1.7),
+	  disjoint2.cc (1.9), disjoint3.cc (1.9): Adapted disjoint*.cc to
+	  new standards for tests.
+
+2006-03-01 Wednesday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.70), contains1.cc (1.7),
+	  contains2.cc (1.7), contains3.cc (1.7), contains4.cc (1.7),
+	  contains5.cc (1.8): Adapted contsains*.cc to new standards for
+	  tests.
+
+2006-03-01 Wednesday 10:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.69), boundedaffineimage1.cc
+	  (1.6), boundedaffineimage2.cc (1.5), boundedaffineimage3.cc
+	  (1.5), boundedaffinepreimage1.cc (1.5), boundedaffinepreimage2.cc
+	  (1.5), boundedaffinepreimage3.cc (1.5): Adapted
+	  boundedaffine[pre]image*.cc to new standards for tests.
+
+2006-03-01 Wednesday 09:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.68), bhz03widening1.cc (1.9),
+	  bhz03widening2.cc (1.9), bhz03widening3.cc (1.9),
+	  bhz03widening4.cc (1.8), bhz03widening5.cc (1.8),
+	  bhz03widening6.cc (1.10): Adapted bhz03widening*.cc to new
+	  standards for tests files.
+
+2006-03-01 Wednesday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bgp99extrapolation1.cc (1.9): Correctly handling
+	  with failing coefficient configurations.
+
+2006-03-01 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.67), constraints1.cc (1.7),
+	  constraints2.cc (1.8), constraints3.cc (1.7), constraints4.cc
+	  (1.9), constraints5.cc (1.6): Translated constraints*.cc
+	  according to new standards for tests.
+
+2006-03-01 Wednesday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.66): Adapted for changes to
+	  bounds*.cc.
+
+2006-03-01 Wednesday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: bounds1.cc (1.8), bounds2.cc (1.7),
+	  congruences1.cc (1.5): Adapted to new standards for tests.
+
+2006-03-01 Wednesday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize1.cc (1.2): Using new macros for
+	  handling with failing coefficent configurations.
+
+2006-03-01 Wednesday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: CbecomesNNC1.cc (1.7), Makefile.am (1.65),
+	  NNCbecomesC1.cc (1.8), cnncconversion1.cc (1.1): Tests
+	  CbecomesNNC1 and NNCbecomesC1 translated according to new
+	  standards.
+
+2006-03-01 Wednesday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: boundingbox1.cc (1.11), boundingbox2.cc
+	  (1.10), boundingbox3.cc (1.11): Removed useless parentheses in
+	  return statement.  Moved test descriptions in front of the tests.
+
+2006-03-01 Wednesday 09:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.42): Corrected macro NEW_TEST_F* to
+	  correctly deal with failing tests.
+
+2006-02-28 Tuesday 23:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/equals1.cc (1.7): Test added to improve coverage.
+
+2006-02-28 Tuesday 12:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruences1.cc (1.7): Use
+	  print_congruences() instead of print_constraints() when printing
+	  a ystem of congruences.
+
+2006-02-28 Tuesday 10:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.20), affineimage1_16.cc (1.6): Test
+	  in affineimage1_16.cc is now included in affineimage2.cc
+
+2006-02-28 Tuesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/affineimage2.cc (1.3): Activated test10.
+
+2006-02-28 Tuesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.41): NEW_TEST* macros fixed and completed.
+
+2006-02-28 Tuesday 09:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.templates.hh (1.3): Use more efficient iteration in
+	  a couple of cases.
+
+2006-02-28 Tuesday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.17): Added more comments to explain the
+	  order of construction/destruction.
+
+2006-02-28 Tuesday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: print.cc (1.25), print.hh (1.32): Two FIXMEs dealt with.
+
+2006-02-28 Tuesday 08:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: contains2.cc (1.5), discrete1.cc (1.2), disjoint1.cc
+	  (1.6), equals1.cc (1.6), expandspacedim1.cc (1.6),
+	  foldspacedims1.cc (1.6): Tests in contains2.cc already in
+	  contains1.cc.  Modified tests following new guidelines.
+
+2006-02-28 Tuesday 08:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: addcongruence1.cc (1.7), addcongruences1.cc (1.9),
+	  addconstraint1.cc (1.7), addconstraints1.cc (1.7),
+	  addgenerator1.cc (1.9), addgenerators1.cc (1.5), addspacedims1.cc
+	  (1.8), affinedim1.cc (1.7), affineimage1.cc (1.9),
+	  affineimage1_16.cc (1.5), affineimage2.cc (1.2),
+	  affinepreimage1.cc (1.7), affinepreimage2.cc (1.2),
+	  asciidumpload1.cc (1.5), bhz03widening1.cc (1.6), bounded1.cc
+	  (1.8), boundingbox1.cc (1.6), boundingbox2.cc (1.6), bounds1.cc
+	  (1.9), certificate1.cc (1.8), concatenate1.cc (1.8),
+	  congruence1.cc (1.8), congruences1.cc (1.6), congruencesystem1.cc
+	  (1.6), contains1.cc (1.7), coveringbox1.cc (1.6), coveringbox2.cc
+	  (1.6): Blank line before test comment removed.  A few missing
+	  comments for tests added.
+
+2006-02-28 Tuesday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.184), src/Polyhedron_nonpublic.cc (1.65): TODO item
+	  partly done: added some missing assert(OK()).
+
+2006-02-27 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.46): Upon `make clean', erase also the
+	  temporary directories (they will be there if the build did not
+	  complete successfully).
+
+2006-02-27 Monday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.45): Use two distinct rules for the user and
+	  developer HTML documentation.
+
+2006-02-27 Monday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.70), user.doxyconf-html.in
+	  (1.37): Set HTML_OUTPUT the right way.
+
+2006-02-27 Monday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.44): Allow parallel building of the user and
+	  developer HTML documentation.
+
+2006-02-27 Monday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.40), Polyhedron/bhrz03widening3.cc (1.8),
+	  Polyhedron/boundingbox3.cc (1.10): New macros NEW_TEST_F,
+	  NEW_TEST_F64, NEW_TEST_F32, NEW_TEST_F16, NEW_TEST_F8 and
+	  NEW_TEST_F8A to be used for tests that are known to fail always,
+	  with bounded coefficients with number of bits less than or equal
+	  to the indicated number, or with 8-bit coefficient and with
+	  assertions enabled, respectively.
+
+2006-02-27 Monday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.225): Improved the selection of the type of
+	  coefficients.  New C++ macro COEFFICIENT_BITS holds the number of
+	  bits of coefficients, 0 if they are unbounded.
+
+2006-02-27 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.54): The GNU-Prolog
+	  interface can now be built also with --disable-static and with
+	  --disable-shared.
+
+2006-02-27 Monday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.44): The YAP-Prolog
+	  interface cannot be built if shared libraries are not available.
+
+2006-02-27 Monday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.53): The Ciao-Prolog
+	  interface cannot be built if shared libraries are not available.
+
+2006-02-27 Monday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.67): Work also if the
+	  PPL was configure with --disable-shared.  Moreover, unless the
+	  PPL was configured with --disable-static, `ppl_sicstus' uses only
+	  static modules.
+
+2006-02-27 Monday 13:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/affineimage2.cc (1.8): Helper function renamed
+	  according to new standard.
+
+2006-02-27 Monday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.64), concatenate1.cc (1.7),
+	  concatenate2.cc (1.8), concatenate3.cc (1.7), concatenate4.cc
+	  (1.7), concatenate5.cc (1.7), concatenate6.cc (1.9),
+	  concatenate7.cc (1.6): Transformed according to new standards for
+	  tests.
+
+2006-02-27 Monday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/bounded1.cc (1.8): Tranformed according to new
+	  standards for tests.
+
+2006-02-27 Monday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.63), bhrz03widening1.cc (1.7),
+	  bhrz03widening10.cc (1.8), bhrz03widening11.cc (1.7),
+	  bhrz03widening12.cc (1.8), bhrz03widening13.cc (1.7),
+	  bhrz03widening14.cc (1.7), bhrz03widening15.cc (1.8),
+	  bhrz03widening16.cc (1.7), bhrz03widening17.cc (1.7),
+	  bhrz03widening18.cc (1.7), bhrz03widening19.cc (1.7),
+	  bhrz03widening2.cc (1.7), bhrz03widening3.cc (1.7),
+	  bhrz03widening4.cc (1.7), bhrz03widening5.cc (1.7),
+	  bhrz03widening6.cc (1.7), bhrz03widening7.cc (1.7),
+	  bhrz03widening8.cc (1.7), bhrz03widening9.cc (1.7): Transformed
+	  according to new standards for tests.
+
+2006-02-27 Monday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: affinetrans.cc (1.8), Makefile.am (1.62),
+	  bgp99extrapolation1.cc (1.8), bgp99extrapolation2.cc (1.8):
+	  Transformed according to new standards for tests.
+
+2006-02-27 Monday 13:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.60), affineimage1.cc (1.8),
+	  affineimage2.cc (1.7), affineimage3.cc (1.7), affineimage4.cc
+	  (1.8), affineimage5.cc (1.9), affineimage6.cc (1.9),
+	  affineimage7.cc (1.7), affineimage8.cc (1.8), affineimage9.cc
+	  (1.7), Makefile.am (1.61), affinepreimage1.cc (1.7),
+	  affinepreimage10.cc (1.8), affinepreimage11.cc (1.5),
+	  affinepreimage12.cc (1.3), affinepreimage2.cc (1.7),
+	  affinepreimage3.cc (1.8), affinepreimage4.cc (1.7),
+	  affinepreimage5.cc (1.7), affinepreimage6.cc (1.7),
+	  affinepreimage7.cc (1.7), affinepreimage8.cc (1.8),
+	  affinepreimage9.cc (1.8): Transformed according to new standards
+	  for tests.
+
+2006-02-27 Monday 12:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.59), addspacedims1.cc (1.8),
+	  addspacedims10.cc (1.7), addspacedims11.cc (1.7),
+	  addspacedims12.cc (1.7), addspacedims13.cc (1.8),
+	  addspacedims2.cc (1.8), addspacedims3.cc (1.9), addspacedims4.cc
+	  (1.7), addspacedims5.cc (1.7), addspacedims6.cc (1.7),
+	  addspacedims7.cc (1.7), addspacedims8.cc (1.8), addspacedims9.cc
+	  (1.7): Transformed according to new standards for tests.
+
+2006-02-27 Monday 12:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.58), addgenerator1.cc (1.8),
+	  addgenerator2.cc (1.8), addgenerator3.cc (1.8), addgenerator4.cc
+	  (1.8), addgenerator5.cc (1.8), addgenerators1.cc (1.8),
+	  addgenerators10.cc (1.8), addgenerators11.cc (1.8),
+	  addgenerators12.cc (1.9), addgenerators13.cc (1.8),
+	  addgenerators2.cc (1.8), addgenerators3.cc (1.7),
+	  addgenerators4.cc (1.7), addgenerators5.cc (1.7),
+	  addgenerators6.cc (1.8), addgenerators7.cc (1.7),
+	  addgenerators8.cc (1.8), addgenerators9.cc (1.7): Transformed
+	  according to new standards for tests.
+
+2006-02-27 Monday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.57), addconstraint1.cc (1.7),
+	  addconstraint2.cc (1.8), addconstraint3.cc (1.8),
+	  addconstraints1.cc (1.8), addconstraints10.cc (1.8),
+	  addconstraints11.cc (1.7), addconstraints12.cc (1.7),
+	  addconstraints13.cc (1.9), addconstraints2.cc (1.7),
+	  addconstraints3.cc (1.8), addconstraints4.cc (1.7),
+	  addconstraints5.cc (1.8), addconstraints6.cc (1.8),
+	  addconstraints7.cc (1.8), addconstraints8.cc (1.8),
+	  addconstraints9.cc (1.7): Transformed according to new standards
+	  for tests.
+
+2006-02-27 Monday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.56), addcongruences1.cc (1.6),
+	  addcongruences2.cc (1.5), addcongruences3.cc (1.5),
+	  addcongruences4.cc (1.5), addcongruences5.cc (1.5): Transformed
+	  according to new standards for tests.
+
+2006-02-27 Monday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.55): Dealing with addcongruence.
+
+2006-02-27 Monday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: addcongruence1.cc (1.5), addcongruence2.cc
+	  (1.5), addcongruence3.cc (1.5), addcongruence4.cc (1.5),
+	  addcongruence5.cc (1.5): Transformed according to new standard
+	  for tests.
+
+2006-02-27 Monday 12:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.54): Added nncminimize1.cc and
+	  removed NNCminimize*.
+
+2006-02-27 Monday 12:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: NNCminimize1.cc (1.7), NNCminimize2.cc (1.7),
+	  NNCminimize3.cc (1.7), NNCminimize4.cc (1.7), NNCminimize5.cc
+	  (1.7), NNCminimize6.cc (1.7), nncminimize1.cc (1.1): Transformed
+	  according to new standard for tests.
+
+2006-02-27 Monday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.190), src/Saturation_Row.cc (1.10): Fixed a long-standing
+	  bug in Saturation_Row::prev().
+
+2006-02-26 Sunday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/bhz03widening1.cc (1.5): Revised test to guidelines.
+
+2006-02-26 Sunday 21:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_Generator.defs.hh (1.10): Documentation for ascii_load()
+	  bug fixed.  Comment made conditional on
+	  PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS being defined.
+
+2006-02-26 Sunday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (1.3): Make sure vnout is
+	  flushed just after the dumps.
+
+2006-02-26 Sunday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/nncminimize2.cc (1.2): Dump the polyhedron
+	  multiple times when very noisy.
+
+2006-02-26 Sunday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.53), nncminimize2.cc (1.1): New
+	  test for NNC_Polyhedron::ph.minimized_generators().
+
+2006-02-26 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.66): Dependencies fixed.
+
+2006-02-26 Sunday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.19): Fixed the ordering in the
+	  definition of LDADD.
+
+2006-02-26 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.43): Portability improvement: `tar zxf' is
+	  non-portable;  use `gunzip -c' and pipe the result to `tar xf'
+	  instead.
+
+2006-02-26 Sunday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/Makefile.am (1.24), ppl_lpsol/Makefile.am
+	  (1.21): Portability improvement: instead of using `grep -q'
+	  (which is non-portable) we redirect the standard output and
+	  standard error to `/dev/null'.
+
+2006-02-26 Sunday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.74), Checked_Number.inlines.hh
+	  (1.63), Float.inlines.hh (1.27), Grid_Certificate.cc (1.4),
+	  Grid_Generator.defs.hh (1.9), Grid_Generator_System.cc (1.4),
+	  Grid_Generator_System.inlines.hh (1.4), Grid_conversion.cc (1.5),
+	  Grid_public.cc (1.12), Scalar_Products.defs.hh (1.6),
+	  checked_ext.defs.hh (1.11), checked_ext.inlines.hh (1.30),
+	  checked_int.inlines.hh (1.50): Try to avoid long source lines.
+
+2006-02-26 Sunday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.cc (simplex.1): file Grid_Certificate.cc was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-02-26 Sunday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.26): Do not leave operators ad end of
+	  line.
+
+2006-02-26 Sunday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.57), H79_Certificate.inlines.hh (1.8),
+	  Polyhedra_Powerset.templates.hh (1.2): Avoid useless parentheses.
+
+2006-02-26 Sunday 07:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.inlines.hh (1.3): Fix misplaced parenthesis.
+
+2006-02-26 Sunday 00:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid.templates.hh (1.3): Fixed a bug in get_covering_box().
+
+2006-02-26 Sunday 00:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: print.cc (1.24), print.hh (1.31), Grid/Makefile.am
+	  (1.18), Grid/bounds1.cc (1.8), Grid/certificate1.cc (1.7),
+	  Grid/concatenate1.cc (1.7), Grid/congruence1.cc (1.7),
+	  Grid/congruences1.cc (1.5), Grid/congruencesystem1.cc (1.5),
+	  Grid/congruencesystem2.cc (1.5), Grid/contains1.cc (1.6),
+	  Grid/copyconstruct1.cc (1.5), Grid/coveringbox1.cc (1.5),
+	  Grid/coveringbox2.cc (1.5): Revised tests following guidelines.
+	  Added 2 tests to coveringbox2 for generator systems with
+	  parameters.
+
+2006-02-25 Saturday 18:57  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.25), checked_int.inlines.hh (1.49):
+	  Fixed mpz_export use.
+
+2006-02-25 Saturday 17:17  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.24), checked_float.inlines.hh (1.64),
+	  checked_int.inlines.hh (1.48): Fixed mpz_export order argument.
+
+2006-02-25 Saturday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.153): Avoid an ambiguity problem
+	  occurring, e.g., on Solaris 2.9.
+
+2006-02-25 Saturday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: boundingbox4.cc (1.9), boundingbox5.cc (1.8):
+	  Removed (incorporated in other tests).
+
+2006-02-25 Saturday 14:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.52), boundingbox1.cc (1.10),
+	  boundingbox2.cc (1.9), boundingbox3.cc (1.9): Translated the
+	  tests boundingbox* into the new style.
+
+2006-02-25 Saturday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (1.11): Wrong inline qualifier removed.
+
+2006-02-25 Saturday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.26): Rename store_nan and
+	  store_infinity to handle_nan and handle_infinity.
+
+2006-02-25 Saturday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.22),
+	  Linear_Expression.inlines.hh (1.8): Added operators so as to
+	  obtain perfect matches and avoid ambiguities.
+
+2006-02-25 Saturday 09:58  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.62): Fixed typo.
+
+2006-02-25 Saturday 09:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.73), Checked_Number.inlines.hh
+	  (1.61): Added is_non_a_number, is_minus_infinity and
+	  is_plus_infinity.
+
+2006-02-25 Saturday 09:28  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.72), checked.defs.hh (1.35),
+	  checked_int.inlines.hh (1.47), checked_mpq.inlines.hh (1.34),
+	  checked_mpz.inlines.hh (1.38), checked_numeric_limits.hh (1.14):
+	  Renamed store_{nan,infinity} to handle_{nan,infinity}
+
+2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_text_md5sum.m4 (altnum.1): file ac_text_md5sum.m4 was added
+	  on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_text_md5sum.m4 (simplex.1): file ac_text_md5sum.m4 was
+	  added on branch simplex on 2006-05-08 17:15:48 +0000
+
+2006-02-23 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.224), demos/ppl_lcdd/Makefile.am (1.23),
+	  m4/ac_text_md5sum.m4 (1.1): New function to set the command for
+	  computing the MD5 checksum of text files.  Old (not working)
+	  kludges to do the same thing have been removed.
+
+2006-02-23 Thursday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: affinedim1.cc (1.6), bounded1.cc (1.7), bounds1.cc
+	  (1.7): Never let an operator close a source line.  Avoid useless
+	  parentheses.
+
+2006-02-22 Wednesday 23:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: asciidumpload1.cc (1.4), bounded1.cc (1.6),
+	  boundingbox1.cc (1.5), boundingbox2.cc (1.5), bounds1.cc (1.6):
+	  Revised tests following new guidelines.
+
+2006-02-22 Wednesday 20:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.17), affineimage2.cc (1.1),
+	  affinepreimage2.cc (1.1): Test files added due to reorganisation
+	  of tests.
+
+2006-02-22 Wednesday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.16): The test program
+	  affinepreimage2.cc does not exist anymore.
+
+2006-02-22 Wednesday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.15): The test program affineimage2.cc
+	  does not exist anymore.
+
+2006-02-22 Wednesday 12:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.14), addcongruences1.cc (1.8),
+	  addconstraint1.cc (1.6), addconstraints1.cc (1.6),
+	  addgenerator1.cc (1.8), addgenerators1.cc (1.4), addspacedims1.cc
+	  (1.7), addspacedims2.cc (1.7), affinedim1.cc (1.5),
+	  affineimage1.cc (1.8), affineimage1_16.cc (1.4),
+	  affinepreimage1.cc (1.6), generalizedaffineimage1.cc (1.6),
+	  generalizedaffineimage2.cc (1.6), generalizedaffinepreimage1.cc
+	  (1.7), generalizedaffinepreimage2.cc (1.7), widening1.cc (1.7):
+	  Revised tests following new guidelines.
+
+2006-02-22 Wednesday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.39), run_tests (1.16): Test with
+	  valgrind also in the tests/BD_Shape directory.
+
+2006-02-22 Wednesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/valgrind_suppressions (1.4): Ignore warnings originating
+	  from /usr/bin/make.
+
+2006-02-22 Wednesday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/valgrind_suppressions (simplex.1): file
+	  valgrind_suppressions was added on branch simplex on 2006-05-08
+	  17:15:53 +0000
+
+2006-02-22 Wednesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.51): Path fixed.
+
+2006-02-22 Wednesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.30): Removed wrong std:: qualification.
+
+2006-02-22 Wednesday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: valgrind_suppressions (1.3), Grid/Makefile.am (1.13),
+	  Polyhedron/Makefile.am (1.50), Polyhedron/valgrind_suppressions
+	  (1.3): Support valgrind testing also in the Grid directory.
+	  Share a single copy of valgrind_suppressions.
+
+2006-02-22 Wednesday 07:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.29): Print to nout by default, not to cout.
+
+2006-02-21 Tuesday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.am (1.12): Avoid doing what Automake does by
+	  itself.
+
+2006-02-21 Tuesday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.223): On the Alpha, use the appropriate compiler
+	  options in order to obtain support for ANSI/IEEE 754-1985
+	  floating point numbers.
+
+2006-02-21 Tuesday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.9): Exit immediately with error if
+	  the impossible happens.
+
+2006-02-21 Tuesday 16:48  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[32,24]):
+	  Documentation improved.  Header's `parse_constraints' variables
+	  modified to match the ones in LP_Problem.cc.
+
+2006-02-20 Monday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.4): Try harder to be informative in case
+	  SIGFPE is raised.
+
+2006-02-20 Monday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.12): Struct fenv_t renamed
+	  ia32_fenv_t.
+
+2006-02-20 Monday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.21),
+	  Linear_Expression.inlines.hh (1.7): Use vertical spacing to avoid
+	  clutter.  Do not expose implementation details.  Improve
+	  const-correctness.
+
+2006-02-20 Monday 14:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence_System.cc (1.5): Remove unwanted comment.
+
+2006-02-20 Monday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.cc (1.3): Be more informative when the signal code
+	  is unknown.
+
+2006-02-20 Monday 14:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: print.cc (1.23), print.hh (1.28): Added
+	  print_generators() for grids.
+
+2006-02-20 Monday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/addcongruence1.cc (1.6): Use spacing consistently.
+
+2006-02-20 Monday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.253), ehandlers.cc (1.9), ehandlers.hh
+	  (1.14), ppl_test.cc (1.2), ppl_test.hh (1.39): Source files
+	  ehandlers.* phased out.  Drafted a new SIGFPE handler that every
+	  test installs to help debugging.
+
+2006-02-20 Monday 13:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/addcongruence1.cc (1.5): Added test that showed a bug
+	  in add_congruence_and_minimize(), which is now fixed.
+
+	  All tests here revised to be in the new format.
+
+2006-02-20 Monday 13:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc (1.4), Grid_public.cc (1.10): Changed
+	  add_recycled_congruence_and_minimize() to use recycling_insert()
+	  when adding a congruence.
+
+	  Corrected insert() in Congruence_System.cc so as to correctly
+	  deal with the case that the dimensions of the congruence system
+	  to be added are less than that of *this.
+
+2006-02-19 Sunday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.222): Added Automake conditionals to reflect the
+	  status of shared and static libraries.
+
+2006-02-19 Sunday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.27), checked.cc (1.17), checked_mpq.inlines.hh
+	  (1.33): Finished the implementation of rational square root
+	  calculations.  The precision parameter is now passed and returned
+	  as an unsigned.  The
+	  set_rational_sqrt_precision_parameter(unsigned p) function throws
+	  an exception if `p' is too big.
+
+2006-02-19 Sunday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.26), checked.cc (1.16), checked_mpq.inlines.hh
+	  (1.32): New functions void
+	  set_rational_sqrt_precision_parameter(const mpz_class& p) and
+	  mpz_class rational_sqrt_precision_parameter() to set and obtain
+	  the the precision parameter (to be) used for rational sqrt
+	  calculations.
+
+2006-02-19 Sunday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.37): Avoid long source lines.
+	  Prefer preincrement and predecrement to postincrement and
+	  postdecrement.
+
+2006-02-19 Sunday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.36): No longer include <cmath>.
+
+2006-02-19 Sunday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.63): Do not use the fma(), fmaf()
+	  and fmal() library functions on Alphas, since we cannot guarantee
+	  the library has been compiled with the flags that ensure
+	  controlled rounding is working.
+
+2006-02-19 Sunday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.221): On Alpha chips, support for controlled
+	  rounding is only available if code is compiled to use dynamic
+	  rounding (/d) instructions.  With GCC this can be achieved with
+	  the `-mfp-rounding-mode=d' compiler options;	other compilers are
+	  said to require the `-fprm d' option.
+
+2006-02-19 Sunday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.11): Use more standard macros to implement the
+	  switch on the architecture.
+
+2006-02-18 Saturday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.7), src/Makefile.am (1.149): Do not
+	  distribute ppl_include_files.hh and pwl_include_files.hh.  Now
+	  ppl.hh and pwl.hh installation can be completely delegated to
+	  Automake.
+
+2006-02-17 Friday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.16): Fixed nested #if's.
+
+2006-02-15 Wednesday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: print.cc (1.22), print.hh (1.27): Added
+	  print_congruences(const Congruence_System&, const string&,
+	  ostream&) and print_congruences(const Grid&, const string&,
+	  ostream&).
+
+2006-02-15 Wednesday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim.cc (1.12): Trailing blanks removed.
+
+2006-02-15 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.38), addconstraints1.cc (1.10),
+	  affineimage1.cc (1.11), affinepreimage1.cc (1.11),
+	  bdsdifference1.cc (1.7), bdshull1.cc (1.7), bhmz05widening1.cc
+	  (1.6), cc76extrapolation1.cc (1.10), cc76narrowing1.cc (1.11),
+	  contains1.cc (1.9), exceptions1.cc (1.13), exceptions2.cc (1.12),
+	  exceptions3.cc (1.13), generalizedaffineimage2.cc (1.12),
+	  intersection1.cc (1.10), limitedbhmz05extrapolation1.cc (1.6),
+	  limitedcc76extrapolation1.cc (1.6), relations2.cc (1.14),
+	  relations3.cc (1.12), removespacedims1.cc (1.11), timeelapse1.cc
+	  (1.10): Tests for exceptional cases moved to the appropriate test
+	  programs.
+
+2006-02-15 Wednesday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.37), generalizedaffineimage1.cc
+	  (1.12), generalizedaffineimage2.cc (1.11),
+	  generalizedaffineimage3.cc (1.12): All the tests for
+	  BD_Shape::generalized_affine_preimage() are now in
+	  generalizedaffineimage1.cc and generalizedaffineimage2.cc.
+
+2006-02-15 Wednesday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/addspacedims2.cc (1.11): This is no longer
+	  necessary (all its tests are now in addspacedims1.cc).
+
+2006-02-15 Wednesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.15): Test also with long doubles.
+
+2006-02-15 Wednesday 12:16  Andrea Cimino
+
+	* TODO (simplex.2): Added one item.  Provide a better
+	  implementation of computing squares.
+
+2006-02-15 Wednesday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.9), addspacedims1.cc
+	  (1.10), addspacedims2.cc (1.10), affinedimension1.cc (1.6),
+	  affineimage1.cc (1.10), affineimage2.cc (1.10),
+	  affinepreimage1.cc (1.10), affinepreimage2.cc (1.10),
+	  ascii_dump_load1.cc (1.11), bdsdifference1.cc (1.6), bdshull1.cc
+	  (1.6), bgp99extrapolation1.cc (1.5), bhmz05widening1.cc (1.5),
+	  bhz03widening1.cc (1.5), cc76extrapolation1.cc (1.9),
+	  cc76narrowing1.cc (1.10), closure1.cc (1.13), concatenate1.cc
+	  (1.10), constraints1.cc (1.13), contains1.cc (1.8), empty1.cc
+	  (1.8), equality1.cc (1.13), exceptions1.cc (1.12), exceptions2.cc
+	  (1.11), exceptions3.cc (1.12), fromgensys1.cc (1.10),
+	  generalizedaffineimage1.cc (1.11), generalizedaffineimage2.cc
+	  (1.10), generalizedaffineimage3.cc (1.11),
+	  generalizedaffinepreimage1.cc (1.11),
+	  generalizedaffinepreimage2.cc (1.8), geomcovers1.cc (1.5),
+	  h79widening1.cc (1.9), intersection1.cc (1.9),
+	  limitedbhmz05extrapolation1.cc (1.5),
+	  limitedcc76extrapolation1.cc (1.5), limitedh79extrapolation1.cc
+	  (1.9), mapspacedims1.cc (1.10), maxspacedim.cc (1.11),
+	  minconstraints1.cc (1.5), relations1.cc (1.13), relations2.cc
+	  (1.13), removespacedims1.cc (1.10), timeelapse1.cc (1.9),
+	  universe1.cc (1.10), writebdshape1.cc (1.6): All test functions
+	  have now a name matching `test[012][1234567890]'.
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.252), Partial_Function.cc (1.2),
+	  Partial_Function.defs.hh (1.2), ppl_test.cc (1.1), ppl_test.hh
+	  (1.38), print.cc (1.21), BD_Shape/Makefile.am (1.36),
+	  BD_Shape/addconstraints1.cc (1.8), BD_Shape/addspacedims1.cc
+	  (1.9), BD_Shape/addspacedims2.cc (1.9), BD_Shape/addspacedims3.cc
+	  (1.9), BD_Shape/addspacedims4.cc (1.9), BD_Shape/addspacedims5.cc
+	  (1.12), BD_Shape/addspacedims6.cc (1.12),
+	  BD_Shape/addspacedims7.cc (1.8), BD_Shape/affinedimension1.cc
+	  (1.5), BD_Shape/affineimage1.cc (1.9), BD_Shape/affineimage10.cc
+	  (1.8), BD_Shape/affineimage2.cc (1.9), BD_Shape/affineimage3.cc
+	  (1.9), BD_Shape/affineimage4.cc (1.9), BD_Shape/affineimage5.cc
+	  (1.9), BD_Shape/affineimage6.cc (1.9), BD_Shape/affineimage7.cc
+	  (1.9), BD_Shape/affineimage8.cc (1.15), BD_Shape/affineimage9.cc
+	  (1.13), BD_Shape/affinepreimage1.cc (1.9),
+	  BD_Shape/affinepreimage2.cc (1.9), BD_Shape/affinepreimage3.cc
+	  (1.9), BD_Shape/affinepreimage4.cc (1.9),
+	  BD_Shape/affinepreimage5.cc (1.10), BD_Shape/ascii_dump_load1.cc
+	  (1.10), BD_Shape/ascii_dump_load2.cc (1.10),
+	  BD_Shape/bdsdifference1.cc (1.5), BD_Shape/bdsdifference2.cc
+	  (1.5), BD_Shape/bdsdifference3.cc (1.5),
+	  BD_Shape/bdsdifference4.cc (1.5), BD_Shape/bdsdifference5.cc
+	  (1.5), BD_Shape/bdsdifference6.cc (1.5),
+	  BD_Shape/bdsdifference7.cc (1.5), BD_Shape/bdshull1.cc (1.5),
+	  BD_Shape/bdshull2.cc (1.5), BD_Shape/bdshull3.cc (1.5),
+	  BD_Shape/bdshull4.cc (1.5), BD_Shape/bgp99extrapolation1.cc
+	  (1.4), BD_Shape/bhmz05widening1.cc (1.4),
+	  BD_Shape/bhmz05widening2.cc (1.4), BD_Shape/bhmz05widening3.cc
+	  (1.4), BD_Shape/bhmz05widening4.cc (1.4),
+	  BD_Shape/bhmz05widening5.cc (1.4), BD_Shape/bhmz05widening6.cc
+	  (1.4), BD_Shape/bhmz05widening7.cc (1.4),
+	  BD_Shape/bhmz05widening8.cc (1.4), BD_Shape/bhz03widening1.cc
+	  (1.4), BD_Shape/cc76extrapolation1.cc (1.8),
+	  BD_Shape/cc76extrapolation2.cc (1.9),
+	  BD_Shape/cc76extrapolation3.cc (1.8),
+	  BD_Shape/cc76extrapolation4.cc (1.11),
+	  BD_Shape/cc76extrapolation5.cc (1.8),
+	  BD_Shape/cc76extrapolation6.cc (1.9), BD_Shape/cc76narrowing1.cc
+	  (1.9), BD_Shape/cc76narrowing2.cc (1.9),
+	  BD_Shape/cc76narrowing3.cc (1.9), BD_Shape/cc76narrowing4.cc
+	  (1.10), BD_Shape/cc76narrowing5.cc (1.10), BD_Shape/closure1.cc
+	  (1.12), BD_Shape/concatenate1.cc (1.9), BD_Shape/concatenate2.cc
+	  (1.9), BD_Shape/concatenate3.cc (1.8), BD_Shape/concatenate4.cc
+	  (1.8), BD_Shape/concatenate5.cc (1.9), BD_Shape/constraints1.cc
+	  (1.12), BD_Shape/constraints2.cc (1.9), BD_Shape/contains1.cc
+	  (1.7), BD_Shape/contains2.cc (1.9), BD_Shape/contains3.cc (1.9),
+	  BD_Shape/empty1.cc (1.7), BD_Shape/empty2.cc (1.7),
+	  BD_Shape/empty3.cc (1.8), BD_Shape/empty4.cc (1.7),
+	  BD_Shape/empty5.cc (1.7), BD_Shape/equality1.cc (1.12),
+	  BD_Shape/exceptions1.cc (1.11), BD_Shape/exceptions2.cc (1.10),
+	  BD_Shape/exceptions3.cc (1.11), BD_Shape/fromgensys1.cc (1.9),
+	  BD_Shape/generalizedaffineimage1.cc (1.10),
+	  BD_Shape/generalizedaffineimage10.cc (1.9),
+	  BD_Shape/generalizedaffineimage11.cc (1.8),
+	  BD_Shape/generalizedaffineimage12.cc (1.8),
+	  BD_Shape/generalizedaffineimage13.cc (1.9),
+	  BD_Shape/generalizedaffineimage14.cc (1.13),
+	  BD_Shape/generalizedaffineimage2.cc (1.9),
+	  BD_Shape/generalizedaffineimage3.cc (1.10),
+	  BD_Shape/generalizedaffineimage4.cc (1.9),
+	  BD_Shape/generalizedaffineimage5.cc (1.9),
+	  BD_Shape/generalizedaffineimage6.cc (1.9),
+	  BD_Shape/generalizedaffineimage7.cc (1.9),
+	  BD_Shape/generalizedaffineimage8.cc (1.9),
+	  BD_Shape/generalizedaffineimage9.cc (1.8),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.10),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.7),
+	  BD_Shape/geomcovers1.cc (1.4), BD_Shape/h79widening1.cc (1.8),
+	  BD_Shape/intersection1.cc (1.8), BD_Shape/intersection2.cc (1.8),
+	  BD_Shape/intersection3.cc (1.9), BD_Shape/intersection4.cc
+	  (1.10), BD_Shape/intersection5.cc (1.10),
+	  BD_Shape/intersection6.cc (1.9), BD_Shape/intersection7.cc (1.9),
+	  BD_Shape/intersection8.cc (1.9),
+	  BD_Shape/limitedbhmz05extrapolation1.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation2.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation3.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation4.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation5.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation6.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation7.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation8.cc (1.4),
+	  BD_Shape/limitedbhmz05extrapolation9.cc (1.4),
+	  BD_Shape/limitedcc76extrapolation1.cc (1.4),
+	  BD_Shape/limitedcc76extrapolation2.cc (1.5),
+	  BD_Shape/limitedcc76extrapolation3.cc (1.5),
+	  BD_Shape/limitedh79extrapolation1.cc (1.8),
+	  BD_Shape/mapspacedims1.cc (1.9), BD_Shape/mapspacedims2.cc
+	  (1.12), BD_Shape/mapspacedims3.cc (1.10),
+	  BD_Shape/mapspacedims4.cc (1.10), BD_Shape/maxspacedim.cc (1.10),
+	  BD_Shape/minconstraints1.cc (1.4), BD_Shape/relations1.cc (1.12),
+	  BD_Shape/relations2.cc (1.12), BD_Shape/relations3.cc (1.11),
+	  BD_Shape/relations4.cc (1.10), BD_Shape/relations5.cc (1.12),
+	  BD_Shape/removespacedims1.cc (1.9), BD_Shape/removespacedims2.cc
+	  (1.11), BD_Shape/removespacedims3.cc (1.11),
+	  BD_Shape/timeelapse1.cc (1.8), BD_Shape/timeelapse2.cc (1.8),
+	  BD_Shape/timeelapse3.cc (1.8), BD_Shape/timeelapse4.cc (1.8),
+	  BD_Shape/timeelapse5.cc (1.9), BD_Shape/universe1.cc (1.9),
+	  BD_Shape/writebdshape1.cc (1.5), BD_Shape/writebdshape2.cc (1.6):
+	  Started renovation of the testsuite: number of test programs
+	  drastically reduced; all programs have now the very same
+	  structure; non-exceptions failure of one test does prevent the
+	  other tests to be run.  Several tests have also been fixed.
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.cc (simplex.1): file Partial_Function.cc
+	  was added on branch simplex on 2006-05-08 17:15:53 +0000
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.defs.hh (altnum.1): file
+	  Partial_Function.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:21 +0000
+
+2006-02-15 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.defs.hh (simplex.1): file
+	  Partial_Function.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:53 +0000
+
+2006-02-15 Wednesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.49): dualhypercubes also fails
+	  (due to overflow) for checked 64 bits integers, due to the
+	  steepest-edge implementation in the primal simplex.
+
+2006-02-15 Wednesday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.41): Spcialization of
+	  poly_difference_assign() and check_containment() are now placed
+	  in the same namespace as their declarations.
+
+2006-02-14 Tuesday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.9): Adapted the
+	  expected result of test12() to the precision obtained on the
+	  SPARC.
+
+2006-02-14 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: ppl_test.hh (1.37), Grid/Makefile.am (1.11): Tests in
+	  Makefile.am are ordered alphabetically.  Added "const" to the
+	  parameters in copy_compare() in ppl_test.hh.
+
+2006-02-14 Tuesday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.cc (1.3), Grid_Generator_System.cc (1.3),
+	  Grid_Generator_System.defs.hh (1.9): Added assert(OK()) to four
+	  methods in Congruence_System.cc Corrected a cut-and-paste error
+	  in Grid_Generator_System.cc Improved a comment in
+	  Grid_Generator_System.defs.hh.
+
+2006-02-14 Tuesday 13:40  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.60): More correct implementation
+	  for exact_div.
+
+2006-02-14 Tuesday 13:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.71), GMP_Integer.defs.hh (1.21),
+	  GMP_Integer.inlines.hh (1.15): Specify that the behavior of
+	  exact_div_assign(x, y, z) is undefined if `z' does not divide
+	  `y'.	This condition is asserted in the GMP_Integer
+	  implementation.
+
+2006-02-14 Tuesday 09:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (1.6): Corrected.
+
+2006-02-13 Monday 21:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffineimage6.cc (1.8): Corrected a
+	  known result.
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.251), PFunction.cc (1.9), PFunction.hh
+	  (1.9), Partial_Function.cc (1.1), Partial_Function.defs.hh (1.1),
+	  Partial_Function.inlines.hh (1.1), Partial_Function.types.hh
+	  (1.1), ppl_test.hh (1.36), print.cc (1.20), print.hh (1.26),
+	  BD_Shape/mapspacedims1.cc (1.8), BD_Shape/mapspacedims2.cc
+	  (1.11), BD_Shape/mapspacedims3.cc (1.9),
+	  BD_Shape/mapspacedims4.cc (1.9), Grid/mapspacedims1.cc (1.6),
+	  Polyhedron/mapspacedims1.cc (1.9), Polyhedron/mapspacedims2.cc
+	  (1.7), Polyhedron/mapspacedims3.cc (1.7),
+	  Polyhedron/mapspacedims4.cc (1.7): Class PFunction renamed
+	  Partial_Function and implemented consistently.  Avoided code
+	  duplication for print_function().
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.inlines.hh (altnum.1): file
+	  Partial_Function.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.inlines.hh (simplex.1): file
+	  Partial_Function.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:53 +0000
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.types.hh (altnum.1): file
+	  Partial_Function.types.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-02-13 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Partial_Function.types.hh (simplex.1): file
+	  Partial_Function.types.hh was added on branch simplex on
+	  2006-05-08 17:15:53 +0000
+
+2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (1.5): Definitions of FPU_UPWARD and
+	  FPU_DOWNWARD fixed.
+
+2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (altnum.1): file fpu-sparc.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-13 Monday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (simplex.1): file fpu-sparc.inlines.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-02-13 Monday 19:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: addconstraints1.cc (1.7), addspacedims1.cc
+	  (1.8), addspacedims2.cc (1.8), addspacedims5.cc (1.11),
+	  addspacedims6.cc (1.11), affineimage1.cc (1.8), affineimage10.cc
+	  (1.7), affineimage2.cc (1.8), affineimage3.cc (1.8),
+	  affineimage4.cc (1.8), affineimage5.cc (1.8), affineimage6.cc
+	  (1.8), affineimage7.cc (1.8), affinepreimage1.cc (1.8),
+	  affinepreimage2.cc (1.8), affinepreimage3.cc (1.8),
+	  affinepreimage4.cc (1.8), bdsdifference1.cc (1.4),
+	  bdsdifference2.cc (1.4), bdsdifference3.cc (1.4),
+	  bdsdifference4.cc (1.4), bdsdifference5.cc (1.4),
+	  bdsdifference6.cc (1.4), bdsdifference7.cc (1.4), bdshull1.cc
+	  (1.4), bdshull2.cc (1.4), bdshull3.cc (1.4), bdshull4.cc (1.4),
+	  bhmz05widening1.cc (1.3), bhmz05widening2.cc (1.3),
+	  bhmz05widening3.cc (1.3), bhmz05widening4.cc (1.3),
+	  bhmz05widening5.cc (1.3), bhmz05widening6.cc (1.3),
+	  bhmz05widening7.cc (1.3), bhmz05widening8.cc (1.3),
+	  cc76extrapolation1.cc (1.7), cc76extrapolation2.cc (1.8),
+	  cc76extrapolation3.cc (1.7), cc76extrapolation4.cc (1.10),
+	  cc76extrapolation5.cc (1.7), cc76narrowing1.cc (1.8),
+	  cc76narrowing2.cc (1.8), cc76narrowing3.cc (1.8),
+	  cc76narrowing4.cc (1.9), cc76narrowing5.cc (1.9), concatenate1.cc
+	  (1.8), concatenate2.cc (1.8), concatenate3.cc (1.7),
+	  concatenate4.cc (1.7), concatenate5.cc (1.8), constraints1.cc
+	  (1.11), constraints2.cc (1.8), equality1.cc (1.11),
+	  fromgensys1.cc (1.8), generalizedaffineimage1.cc (1.9),
+	  generalizedaffineimage10.cc (1.8), generalizedaffineimage11.cc
+	  (1.7), generalizedaffineimage12.cc (1.7),
+	  generalizedaffineimage14.cc (1.12), generalizedaffineimage2.cc
+	  (1.8), generalizedaffineimage3.cc (1.9),
+	  generalizedaffineimage4.cc (1.8), generalizedaffineimage5.cc
+	  (1.8), generalizedaffineimage6.cc (1.7),
+	  generalizedaffineimage7.cc (1.8), generalizedaffineimage8.cc
+	  (1.8), generalizedaffineimage9.cc (1.7),
+	  generalizedaffinepreimage2.cc (1.5), h79widening1.cc (1.7),
+	  intersection1.cc (1.7), intersection2.cc (1.7), intersection3.cc
+	  (1.8), intersection4.cc (1.9), intersection5.cc (1.9),
+	  intersection6.cc (1.8), intersection7.cc (1.8), intersection8.cc
+	  (1.8), limitedbhmz05extrapolation1.cc (1.3),
+	  limitedbhmz05extrapolation2.cc (1.3),
+	  limitedbhmz05extrapolation3.cc (1.3),
+	  limitedbhmz05extrapolation4.cc (1.3),
+	  limitedbhmz05extrapolation5.cc (1.3),
+	  limitedbhmz05extrapolation6.cc (1.3),
+	  limitedbhmz05extrapolation7.cc (1.3),
+	  limitedbhmz05extrapolation8.cc (1.3),
+	  limitedbhmz05extrapolation9.cc (1.3),
+	  limitedcc76extrapolation1.cc (1.3), limitedcc76extrapolation2.cc
+	  (1.4), limitedcc76extrapolation3.cc (1.4),
+	  limitedh79extrapolation1.cc (1.7), mapspacedims1.cc (1.7),
+	  mapspacedims2.cc (1.10), mapspacedims3.cc (1.8), mapspacedims4.cc
+	  (1.8), removespacedims1.cc (1.8), removespacedims2.cc (1.10),
+	  removespacedims3.cc (1.10), timeelapse2.cc (1.7), timeelapse3.cc
+	  (1.7), timeelapse4.cc (1.7), timeelapse5.cc (1.8): Use
+	  BD_Shape<mpq_class> to encode the known results.  Use
+	  check_result() to compare the known result with computed ones
+	  when there might be approximations due to rounding.
+
+2006-02-13 Monday 19:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.66), BD_Shape.templates.hh (1.2): When
+	  building a BD_Shape from a generator system, we should throw an
+	  exception if the system is non-empty but has no points.
+
+2006-02-13 Monday 14:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.220): Version number bumped.
+
+2006-02-13 Monday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.65): Instruct spld to
+	  pass the right options to the linker.
+
+2006-02-13 Monday 14:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.53): Instruct gplc to pass
+	  the right options to the linker.
+
+2006-02-13 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.60): Instruct plld to pass
+	  the right options to the linker (that is, to the C++ compiler).
+
+2006-02-13 Monday 14:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.14), affineimage9.cc (1.12),
+	  affinepreimage5.cc (1.9), generalizedaffineimage13.cc (1.8),
+	  generalizedaffinepreimage1.cc (1.8): Corrected and standardized
+	  as suggested by Roberto the way we compare the computed and known
+	  results.
+
+2006-02-13 Monday 13:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.183), src/Grid.defs.hh (1.10), src/Grid_public.cc (1.9),
+	  tests/Grid/Makefile.am (1.10), tests/Grid/discrete1.cc (1.1),
+	  tests/Grid/pointed1.cc (1.6): Removed a todo item regarding
+	  missing operators for grids.	Renamed method is_pointed() by
+	  is_discrete().  Changed name of test for this method to match
+	  change of name.
+
+2006-02-13 Monday 11:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/LP_Problem3.cc (1.7): Removed.
+
+2006-02-13 Monday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.32): Explain the new mechanism to obtain noisy
+	  and/or very noisy behavior from test programs.
+
+2006-02-13 Monday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.templates.hh (simplex.1): file
+	  Polyhedron.templates.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-02-13 Monday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (1.69), doc/devref.doxyconf-latex.in
+	  (1.10), src/Makefile.am (1.148), src/Polyhedron.defs.hh (1.294),
+	  src/Polyhedron.inlines.hh (1.131), src/Polyhedron.templates.hh
+	  (1.1): New file Polyhedron.templates.hh contains non-inline
+	  template functions of the implementation of class Polyhedron.
+
+2006-02-13 Monday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: addconstraint3.cc (1.7), addgenerator3.cc
+	  (1.7), addspacedims13.cc (1.7), affineimage5.cc (1.8), append1.cc
+	  (1.7), generators1.cc (1.7), generators2.cc (1.7), powerset1.cc
+	  (1.11), writerelation1.cc (1.8): Removed useless invocations to
+	  the OK() methods.
+
+2006-02-13 Monday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.182): Added one item for PPL 0.9.
+
+2006-02-13 Monday 10:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.181): Added an (urgent) item concerning the use of OK()
+	  methods.
+
+2006-02-13 Monday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.180): Pushed several items to PPL 0.10.
+
+2006-02-13 Monday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.copyright.in (1.3), debian/libppl.copyright.in
+	  (1.3), src/Grid_Generator.cc (1.3), tests/Grid/Makefile.am (1.9),
+	  tests/Grid/addcongruence1.cc (1.4), tests/Grid/addcongruences1.cc
+	  (1.7), tests/Grid/addconstraint1.cc (1.5),
+	  tests/Grid/addconstraints1.cc (1.5), tests/Grid/addgenerator1.cc
+	  (1.7), tests/Grid/addgenerators1.cc (1.3),
+	  tests/Grid/addspacedims1.cc (1.6), tests/Grid/addspacedims2.cc
+	  (1.6), tests/Grid/affinedim1.cc (1.4), tests/Grid/affineimage1.cc
+	  (1.7), tests/Grid/affineimage1_16.cc (1.3),
+	  tests/Grid/affinepreimage1.cc (1.5), tests/Grid/asciidumpload1.cc
+	  (1.3), tests/Grid/bhz03widening1.cc (1.4), tests/Grid/bounded1.cc
+	  (1.5), tests/Grid/boundingbox1.cc (1.4),
+	  tests/Grid/boundingbox2.cc (1.4), tests/Grid/bounds1.cc (1.5),
+	  tests/Grid/certificate1.cc (1.6), tests/Grid/concatenate1.cc
+	  (1.6), tests/Grid/congruence1.cc (1.6),
+	  tests/Grid/congruences1.cc (1.4), tests/Grid/congruencesystem1.cc
+	  (1.4), tests/Grid/congruencesystem2.cc (1.4),
+	  tests/Grid/contains1.cc (1.5), tests/Grid/contains2.cc (1.4),
+	  tests/Grid/copyconstruct1.cc (1.4), tests/Grid/coveringbox1.cc
+	  (1.4), tests/Grid/coveringbox2.cc (1.4), tests/Grid/disjoint1.cc
+	  (1.5), tests/Grid/equals1.cc (1.5), tests/Grid/expandspacedim1.cc
+	  (1.5), tests/Grid/foldspacedims1.cc (1.5),
+	  tests/Grid/generalizedaffineimage1.cc (1.5),
+	  tests/Grid/generalizedaffineimage2.cc (1.5),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.6),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.6),
+	  tests/Grid/generator1.cc (1.4), tests/Grid/generators1.cc (1.6),
+	  tests/Grid/grid1.cc (1.9), tests/Grid/grid1_16.cc (1.6),
+	  tests/Grid/grid1_64.cc (1.4), tests/Grid/grid1_gmp.cc (1.4),
+	  tests/Grid/grid2.cc (1.7), tests/Grid/grid2_16.cc (1.4),
+	  tests/Grid/grid3.cc (1.6), tests/Grid/griddifference1.cc (1.6),
+	  tests/Grid/intersection1.cc (1.5), tests/Grid/intersection2.cc
+	  (1.4), tests/Grid/isempty1.cc (1.3), tests/Grid/isuniverse1.cc
+	  (1.6), tests/Grid/join1.cc (1.8), tests/Grid/join1_16.cc (1.3),
+	  tests/Grid/join2.cc (1.4), tests/Grid/join3.cc (1.6),
+	  tests/Grid/limitedextrapolation1.cc (1.5),
+	  tests/Grid/mapspacedims1.cc (1.5), tests/Grid/maxmin1.cc (1.4),
+	  tests/Grid/membytes1.cc (1.3), tests/Grid/membytes2.cc (1.3),
+	  tests/Grid/mincongruences1.cc (1.5), tests/Grid/mingenerators1.cc
+	  (1.5), tests/Grid/outputoperator1.cc (1.3),
+	  tests/Grid/pointed1.cc (1.5), tests/Grid/relations1.cc (1.7),
+	  tests/Grid/relations2.cc (1.6), tests/Grid/removespacedims1.cc
+	  (1.5), tests/Grid/removespacedims2.cc (1.5),
+	  tests/Grid/timeelapse1.cc (1.5), tests/Grid/timeelapse2.cc (1.4),
+	  tests/Grid/topclosed1.cc (1.5), tests/Grid/topclosure1.cc (1.4),
+	  tests/Grid/widening1.cc (1.6),
+	  tests/Grid/writecongruencesystem.cc (1.3),
+	  tests/Polyhedron/addcongruence1.cc (1.4),
+	  tests/Polyhedron/addcongruence2.cc (1.4),
+	  tests/Polyhedron/addcongruence3.cc (1.4),
+	  tests/Polyhedron/addcongruence4.cc (1.4),
+	  tests/Polyhedron/addcongruence5.cc (1.4),
+	  tests/Polyhedron/addcongruences1.cc (1.5),
+	  tests/Polyhedron/addcongruences2.cc (1.4),
+	  tests/Polyhedron/addcongruences3.cc (1.4),
+	  tests/Polyhedron/addcongruences4.cc (1.4),
+	  tests/Polyhedron/addcongruences5.cc (1.4),
+	  tests/Polyhedron/congruences1.cc (1.4): Copyright years made
+	  consistent across the entire library.
+
+2006-02-13 Monday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.copyright.in (altnum.1): file
+	  libppl-pwl.copyright.in was added on branch altnum on 2006-10-29
+	  19:26:52 +0000
+
+2006-02-13 Monday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.copyright.in (altnum.1): file libppl.copyright.in
+	  was added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-02-13 Monday 08:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/ppl_test.hh (1.35): "const" added in copy_compare().
+
+2006-02-13 Monday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/randphull1.cc (1.9): Added missing semicolons.
+
+2006-02-13 Monday 07:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.sty (1.25): Added new command \Sset.
+
+2006-02-13 Monday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/addcongruences1.cc (1.4): Old bug fixed.
+
+2006-02-12 Sunday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/mapspacedims1.cc (1.4): No longer use the NOISY macro.
+
+2006-02-12 Sunday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: LP_Problem3.cc (1.6), lpproblem1.cc (1.5),
+	  lpproblem2.cc (1.4): Comments improved.  Copyright notice fixed.
+
+2006-02-12 Sunday 22:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: LP_Problem3.cc (1.5), addcongruence1.cc (1.3),
+	  addcongruence2.cc (1.3), addcongruence3.cc (1.3),
+	  addcongruence4.cc (1.3), addcongruence5.cc (1.3),
+	  addcongruences1.cc (1.3), addcongruences2.cc (1.3),
+	  addcongruences3.cc (1.3), addcongruences4.cc (1.3),
+	  addcongruences5.cc (1.3), bug2.cc (1.6), congruences1.cc (1.3),
+	  dualhypercubes.cc (1.7), numberinput1.cc (1.25), randphull1.cc
+	  (1.8): No longer use the NOISY or VERY_NOISY macro in test
+	  programs.
+
+2006-02-12 Sunday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.25): check_noisy() is now (temporarily)
+	  declared static.
+
+2006-02-12 Sunday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.24): Noisy and very noisy test output properly
+	  implemented: now the `nout' and `vnout' ostream are controlled by
+	  the `PPL_NOISY_TESTS' and `PPL_VERY_NOISY_TESTS' environment
+	  variables.
+
+2006-02-12 Sunday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/addspacedims5.cc (1.10),
+	  BD_Shape/addspacedims6.cc (1.10), BD_Shape/affinedimension1.cc
+	  (1.4), BD_Shape/affineimage10.cc (1.6), BD_Shape/affineimage9.cc
+	  (1.11), BD_Shape/affinepreimage5.cc (1.8),
+	  BD_Shape/ascii_dump_load2.cc (1.9),
+	  BD_Shape/cc76extrapolation4.cc (1.9), BD_Shape/constraints1.cc
+	  (1.10), BD_Shape/equality1.cc (1.10), BD_Shape/fromgensys1.cc
+	  (1.7), BD_Shape/generalizedaffineimage13.cc (1.7),
+	  BD_Shape/generalizedaffineimage14.cc (1.11),
+	  BD_Shape/generalizedaffinepreimage1.cc (1.7),
+	  BD_Shape/generalizedaffinepreimage2.cc (1.4),
+	  BD_Shape/limitedcc76extrapolation2.cc (1.3),
+	  BD_Shape/limitedcc76extrapolation3.cc (1.3),
+	  BD_Shape/mapspacedims2.cc (1.9), BD_Shape/relations1.cc (1.11),
+	  BD_Shape/relations2.cc (1.11), BD_Shape/relations3.cc (1.10),
+	  BD_Shape/relations4.cc (1.9), BD_Shape/relations5.cc (1.11),
+	  BD_Shape/removespacedims2.cc (1.9), BD_Shape/removespacedims3.cc
+	  (1.9), Grid/addcongruence1.cc (1.3), Grid/addcongruences1.cc
+	  (1.6), Grid/addconstraint1.cc (1.4), Grid/addconstraints1.cc
+	  (1.4), Grid/addgenerator1.cc (1.6), Grid/addgenerators1.cc (1.2),
+	  Grid/addspacedims1.cc (1.5), Grid/addspacedims2.cc (1.5),
+	  Grid/affinedim1.cc (1.3), Grid/affineimage1.cc (1.6),
+	  Grid/affineimage1_16.cc (1.2), Grid/affinepreimage1.cc (1.4),
+	  Grid/asciidumpload1.cc (1.2), Grid/bhz03widening1.cc (1.3),
+	  Grid/bounded1.cc (1.4), Grid/boundingbox1.cc (1.3),
+	  Grid/boundingbox2.cc (1.3), Grid/bounds1.cc (1.4),
+	  Grid/certificate1.cc (1.5), Grid/concatenate1.cc (1.5),
+	  Grid/congruence1.cc (1.5), Grid/congruences1.cc (1.3),
+	  Grid/congruencesystem1.cc (1.3), Grid/congruencesystem2.cc (1.3),
+	  Grid/contains1.cc (1.4), Grid/contains2.cc (1.3),
+	  Grid/copyconstruct1.cc (1.3), Grid/coveringbox1.cc (1.3),
+	  Grid/coveringbox2.cc (1.3), Grid/disjoint1.cc (1.4),
+	  Grid/equals1.cc (1.4), Grid/expandspacedim1.cc (1.4),
+	  Grid/foldspacedims1.cc (1.4), Grid/generalizedaffineimage1.cc
+	  (1.4), Grid/generalizedaffineimage2.cc (1.4),
+	  Grid/generalizedaffinepreimage1.cc (1.5),
+	  Grid/generalizedaffinepreimage2.cc (1.5), Grid/generator1.cc
+	  (1.3), Grid/generators1.cc (1.5), Grid/grid1.cc (1.8),
+	  Grid/grid1_16.cc (1.5), Grid/grid1_64.cc (1.3), Grid/grid1_gmp.cc
+	  (1.3), Grid/grid2.cc (1.6), Grid/grid2_16.cc (1.3), Grid/grid3.cc
+	  (1.5), Grid/griddifference1.cc (1.5), Grid/intersection1.cc
+	  (1.4), Grid/intersection2.cc (1.3), Grid/isempty1.cc (1.2),
+	  Grid/isuniverse1.cc (1.5), Grid/join1.cc (1.7), Grid/join1_16.cc
+	  (1.2), Grid/join2.cc (1.3), Grid/join3.cc (1.5),
+	  Grid/limitedextrapolation1.cc (1.4), Grid/mapspacedims1.cc (1.3),
+	  Grid/maxmin1.cc (1.3), Grid/mincongruences1.cc (1.4),
+	  Grid/mingenerators1.cc (1.4), Grid/outputoperator1.cc (1.2),
+	  Grid/pointed1.cc (1.4), Grid/relations1.cc (1.6),
+	  Grid/relations2.cc (1.5), Grid/removespacedims1.cc (1.4),
+	  Grid/removespacedims2.cc (1.4), Grid/timeelapse1.cc (1.4),
+	  Grid/timeelapse2.cc (1.3), Grid/topclosed1.cc (1.4),
+	  Grid/topclosure1.cc (1.3), Grid/widening1.cc (1.5),
+	  Polyhedron/NNCbecomesC1.cc (1.7), Polyhedron/addconstraints13.cc
+	  (1.8), Polyhedron/addgenerators12.cc (1.8),
+	  Polyhedron/affineimage8.cc (1.7), Polyhedron/affinepreimage10.cc
+	  (1.7), Polyhedron/affinepreimage12.cc (1.2),
+	  Polyhedron/affinepreimage9.cc (1.7),
+	  Polyhedron/ascii_dump_load3.cc (1.7),
+	  Polyhedron/ascii_dump_load4.cc (1.7),
+	  Polyhedron/ascii_dump_load5.cc (1.7),
+	  Polyhedron/ascii_dump_load6.cc (1.8),
+	  Polyhedron/bhrz03widening12.cc (1.7),
+	  Polyhedron/bhz03widening6.cc (1.9), Polyhedron/boundingbox1.cc
+	  (1.9), Polyhedron/boundingbox2.cc (1.8),
+	  Polyhedron/boundingbox3.cc (1.8), Polyhedron/boundingbox4.cc
+	  (1.8), Polyhedron/concatenate6.cc (1.8),
+	  Polyhedron/constraints4.cc (1.8), Polyhedron/contains5.cc (1.7),
+	  Polyhedron/disjoint2.cc (1.8), Polyhedron/disjoint3.cc (1.8),
+	  Polyhedron/expandspacedim1.cc (1.8),
+	  Polyhedron/expandspacedim2.cc (1.8), Polyhedron/foldspacedims1.cc
+	  (1.8), Polyhedron/foldspacedims2.cc (1.8),
+	  Polyhedron/generalizedaffineimage10.cc (1.7),
+	  Polyhedron/generalizedaffineimage11.cc (1.8),
+	  Polyhedron/generalizedaffineimage9.cc (1.7),
+	  Polyhedron/generators6.cc (1.8), Polyhedron/intersection10.cc
+	  (1.8), Polyhedron/intersection11.cc (1.8),
+	  Polyhedron/limitedh79extrapolation4.cc (1.8),
+	  Polyhedron/mapspacedims1.cc (1.8), Polyhedron/polydifference7.cc
+	  (1.8), Polyhedron/polyhull8.cc (1.8), Polyhedron/polyhull9.cc
+	  (1.8), Polyhedron/polypowerset1.cc (1.18),
+	  Polyhedron/relations17.cc (1.8), Polyhedron/relations19.cc (1.8),
+	  Polyhedron/relations9.cc (1.7), Polyhedron/topclosure4.cc (1.8),
+	  Polyhedron/writerelation1.cc (1.7): Use the DO_TEST macro in
+	  multiple tests.
+
+2006-02-12 Sunday 18:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/generators1.cc (1.4): Added three tests; for a
+	  generator system with parameters, one where the parameter is
+	  integral, and two which have divisors.
+
+2006-02-12 Sunday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.219): Check whether getenv() is declared.
+
+2006-02-12 Sunday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affineimage8.cc (1.13): Changed so as to do
+	  sensible tests.
+
+2006-02-12 Sunday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.34): Added a macro DO_TEST to be used when
+	  implementing more than one test in a test program.  Added all the
+	  infrastructure required to write decent tests for BD_Shape.
+
+2006-02-12 Sunday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (1.31): It is now possible to (very
+	  inefficiently) build and assign an mpq_class checked number from
+	  a long double.
+
+2006-02-12 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.62): The output_float() function
+	  now takes its `from' parameter as `const Type', not `Type&'.
+
+2006-02-12 Sunday 14:22  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.70), Checked_Number.inlines.hh
+	  (1.59): Added constructor with rounding direction.
+
+2006-02-12 Sunday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: generalizedaffinepreimage1.cc (1.4),
+	  generalizedaffinepreimage2.cc (1.4), grid1_16.cc (1.4): Removed
+	  'FIX check' comments (and similar) as tests now checked.
+	  Renumbered tests in generalizedaffinepreimage2.cc so that they
+	  start from 1.  Added test 6 in generalizedaffinepreimage2.cc.
+
+2006-02-12 Sunday 11:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Grid_nonpublic.cc (1.6): Correct bug in use of NDEBUG.
+
+2006-02-12 Sunday 10:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.194): Improved the section on grids.
+
+2006-02-12 Sunday 09:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/.cvsignore (1.6): File ppl_sicstus.pl
+	  was erroneously ignored.
+
+2006-02-11 Saturday 20:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.20): Added a missing \relates Doxygen
+	  command for gdcext_assign().
+
+2006-02-11 Saturday 20:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Congruence.defs.hh (1.3), Congruence_System.defs.hh (1.6),
+	  Grid.defs.hh (1.9), Grid_Certificate.defs.hh (1.3),
+	  Grid_Generator.defs.hh (1.8), Grid_Generator_System.defs.hh
+	  (1.8), globals.defs.hh (1.36): Inserting the Grid classes in the
+	  C++ interface documentation group.
+
+2006-02-11 Saturday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.defs.hh (altnum.1): file
+	  Grid_Certificate.defs.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-02-11 Saturday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.defs.hh (simplex.1): file
+	  Grid_Certificate.defs.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-02-11 Saturday 15:51  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[31,23]):
+	  Removed redundant code where possible.  Properly renamed some
+	  variables and methods.  Try to avoid memory reallocations and to
+	  keep the internal data structures always consistent.
+
+2006-02-11 Saturday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.147), tests/BD_Shape/Makefile.am (1.35),
+	  tests/Grid/Makefile.am (1.8), tests/Polyhedron/Makefile.am
+	  (1.48): Use precompiled headers, if requested to do so.
+
+2006-02-11 Saturday 13:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.193), src/Grid.defs.hh (1.8): Corrected
+	  doxygen references.
+
+2006-02-11 Saturday 12:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.218): Added an initial version of the new
+	  --enable-pch configure option: this will allow to enable
+	  precompiled headers when they are made available by the C/C++
+	  compilers.
+
+2006-02-11 Saturday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/.cvsignore (1.2), Watchdog/src/Makefile.am (1.6),
+	  interfaces/Prolog/ppl_prolog.icc (1.176),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.46),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.39),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.91),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.121),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.86),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.114),
+	  tests/Polyhedron/watchdog1.cc (1.8): We now directly create
+	  `pwl.hh': `pwl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/.cvsignore (altnum.1): file .cvsignore was added on
+	  branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-02-11 Saturday 11:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.40): Added a couple of
+	  missing namespace qualifications in \relates Doxygen commands.
+
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/.cvsignore (1.2), debian/.cvsignore (1.2),
+	  doc/.cvsignore (1.3), src/.cvsignore (1.10), utils/.cvsignore
+	  (1.2): Ignore more built files and directories.
+
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/.cvsignore (altnum.1): file .cvsignore was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-02-11 Saturday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/.cvsignore (altnum.1): file .cvsignore was added on branch
+	  altnum on 2006-10-29 19:26:52 +0000
+
+2006-02-11 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (altnum.1): file ppl-config.cc.in was added
+	  on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-11 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.55), interfaces/C/ppl_c.cc (1.152),
+	  interfaces/Prolog/ppl_prolog.icc (1.175),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.45),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.38),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.90),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.120),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.85),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.113), src/.cvsignore (1.9),
+	  src/Makefile.am (1.146), src/ppl-config.cc.in (1.18),
+	  tests/ppl_test.hh (1.33): We now directly create `ppl.hh':
+	  `ppl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 10:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.14): The `$(COMMANDS)' construct is
+	  not portable: use ``COMMANDS`' instead.
+
+2006-02-10 Friday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (1.4): Added missing type casts.
+
+2006-02-10 Friday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: fpu-sparc.inlines.hh (1.3), fpu.types.hh (1.2): Now both
+	  fpu_rounding_direction_type and fpu_rounding_control_word_type
+	  are unconditionally defined to be the int type.
+
+2006-02-10 Friday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.types.hh (altnum.1): file fpu.types.hh was added on
+	  branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-10 Friday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.types.hh (simplex.1): file fpu.types.hh was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-02-10 Friday 20:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.61): Avoid long lines.
+
+2006-02-10 Friday 19:58  Abramo Bagnara
+
+	* src/fpu-ia32.inlines.hh (1.11): God rid of HIJACK_FPU (now it's
+	  the normal behaviour).
+
+2006-02-10 Friday 15:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.cc (1.25): Initialize the library with
+	  fpu_set_rounding_direction(ROUND_DIRECT) instead of
+	  fpu_set_rounding_direction(FPU_UPWARD).
+
+2006-02-10 Friday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.10): Copy and paste mistake fixed.
+
+2006-02-10 Friday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.2): Use AC_LANG_SOURCE to obtain
+	  the test program source.
+
+2006-02-10 Friday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (altnum.1): file
+	  ac_check_fpu_control.m4 was added on branch altnum on 2006-10-29
+	  19:27:11 +0000
+
+2006-02-10 Friday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (simplex.1): file
+	  ac_check_fpu_control.m4 was added on branch simplex on 2006-05-08
+	  17:15:48 +0000
+
+2006-02-10 Friday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-none.inlines.hh (altnum.1): file fpu-none.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-02-10 Friday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.217), src/Init.cc (1.24), src/fpu-none.inlines.hh
+	  (1.4), src/fpu.defs.hh (1.9): Check for the possibility to
+	  control the FPU.  If FPU control is not available, do not try to
+	  use it in Init::Init();  any attempt to use it from elsewhere
+	  will result in an std::logic_error exception being thrown.
+
+2006-02-10 Friday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/Makefile.am (1.17): Updated.
+
+2006-02-10 Friday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_fpu_control.m4 (1.1): New function to check for the
+	  possibility to control the FPU.
+
+2006-02-10 Friday 07:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.60): Use the new interfaces
+	  offered by the FPU control/query functions.
+
+2006-02-09 Thursday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.189): Mention the portability improvements.
+
+2006-02-09 Thursday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.46): Be functional also if the
+	  "fast" integral types are missing.
+
+2006-02-09 Thursday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.216): Check for the availability of "fast"
+	  integral types.
+
+2006-02-09 Thursday 20:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.23), Init.defs.hh (1.16): Adapted to the recent
+	  changes concerning FPU control.  Init::Init() was probably broken
+	  on some architectures.
+
+2006-02-09 Thursday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.11): Mac OS X 10.4 has fixed <fenv.h>:
+	  now the FE_* constants are defined by means of macros.
+
+2006-02-09 Thursday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.145), fpu-c99.inlines.hh (1.10),
+	  fpu-ia32.inlines.hh (1.10), fpu-sparc.inlines.hh (1.2),
+	  fpu.defs.hh (1.8), fpu.types.hh (1.1): FPU control functions
+	  documented.  They now use the new system-dependent types
+	  fpu_rounding_direction_type and fpu_rounding_control_word_type.
+
+2006-02-09 Thursday 16:00  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.30): Fixed another bug.  Keep
+	  `last_generator' always updated even if the second phase fails.
+
+2006-02-09 Thursday 13:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c, src/LP_Problem.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh
+	  (simplex.[6,29,22,18]): Temporarily replaced method	const
+	  Constraint_System& constraints() const; by   Constraint_System
+	  constraints() const; Removed a fixme.  Simplified the prototype
+	  and the implementation of is_satisfied().
+
+2006-02-09 Thursday 08:46  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.59): Fixed cut and paste typo.
+
+2006-02-08 Wednesday 20:06  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.28): Fixed a bug in `is_satisfied()'.
+
+2006-02-08 Wednesday 12:28  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.69), Checked_Number.inlines.hh
+	  (1.58), Float.cc (1.4), Float.defs.hh (1.19), Float.inlines.hh
+	  (1.23), checked_ext.inlines.hh (1.29), checked_float.inlines.hh
+	  (1.58), checked_numeric_limits.hh (1.13), float.types.hh (1.15):
+	  Better abstraction for float binary format.
+
+2006-02-08 Wednesday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.cc (altnum.1): file Float.cc was added on branch altnum
+	  on 2006-10-29 19:27:12 +0000
+
+2006-02-06 Monday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.144): Distribute also fpu-none.inlines.hh and
+	  fpu-sparc.inlines.hh.
+
+2006-02-06 Monday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.215): Check for the availability of fenv.h and
+	  ieeefp.h.
+
+2006-02-06 Monday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.9): Typo fixed.
+
+2006-02-06 Monday 21:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.9): Do no harm if fenv.h is not
+	  available.
+
+2006-02-06 Monday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu.defs.hh (1.7): Only include fpu-c99.inlines.hh if fenv.h
+	  is available.  Otherwise, if `sparc' evaluates to true, include
+	  fpu-sparc.inlines.hh.  Otherwise include fpu-none.inlines.hh.
+
+2006-02-06 Monday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-sparc.inlines.hh (1.1): SPARC floating point unit related
+	  functions.
+
+2006-02-06 Monday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.47): Added NNCminimize1 to
+	  XFAIL_WITH_INT8_A.
+
+2006-02-06 Monday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.214), src/checked_float.inlines.hh (1.57): Do not
+	  use rintf() if it is not available.
+
+2006-02-06 Monday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.34): Undo change erroneously merged
+	  from the `grids' branch.
+
+2006-02-06 Monday 01:29  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.27): Removed redundant and useless
+	  code.
+
+2006-02-05 Sunday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.14): New macros give the binary format of
+	  each supported C++ floating point type: CXX_FLOAT_BINARY_FORMAT,
+	  CXX_DOUBLE_BINARY_FORMAT and CXX_LONG_DOUBLE_BINARY_FORMAT. These
+	  macros are undefined is the format has not been recognized.
+
+2006-02-05 Sunday 20:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.5): Make sure the macro
+	  CXX_FLOAT128_BINARY_FORMAT_IS_INTEL_DOUBLE_EXTENDED is always
+	  defined.
+
+2006-02-05 Sunday 18:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.213), instchk.hh (1.4),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.119), src/Float.defs.hh
+	  (1.18), src/Float.inlines.hh (1.22), src/checked_int.inlines.hh
+	  (1.45): Cater for those systems providing inttypes.h instead of
+	  stdint.h.
+
+2006-02-05 Sunday 18:38  Andrea Cimino
+
+	* src/: Generator.defs.hh, LP_Problem.cc, LP_Problem.defs.hh
+	  (simplex.[2,26,21]): LP_Problem, during the incrementality
+	  process, checks if an inequality is already satisfied by
+	  `last_generator': this can save a lot of time.  LP_Problem
+	  declared friend of Generator to allow a right use of
+	  Scalar_Products.
+
+2006-02-05 Sunday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_float32_binary_format.m4 (1.3),
+	  ac_cxx_float64_binary_format.m4 (1.4),
+	  ac_cxx_float96_binary_format.m4 (1.4): Be more concise.
+
+2006-02-05 Sunday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.4): Constants fixed.
+
+2006-02-05 Sunday 17:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: Makefile.am (1.7), affineimage1.cc (1.5),
+	  affineimage1_16.cc (1.1), grid1.cc (1.7), grid1_16.cc (1.3),
+	  join1.cc (1.6), join1_16.cc (1.1): Three tests added before to
+	  grid1.cc join1.cc affineimage1.cc now removed and placed in
+	  grid1_16.cc join1_16.cc affineimage1_16.cc.  These last 3 tests
+	  are expected to fail with 8 bit integers.
+
+2006-02-05 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.3): Constant fixed.
+
+2006-02-05 Sunday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_float128_binary_format.m4 (1.2),
+	  ac_cxx_float32_binary_format.m4 (1.2),
+	  ac_cxx_float64_binary_format.m4 (1.3),
+	  ac_cxx_float96_binary_format.m4 (1.3): Cater for those systems
+	  providing inttypes.h instead of stdint.h.
+
+2006-02-05 Sunday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.17): Spurious blank removed.
+
+2006-02-05 Sunday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.212): Detect the binary format used by 128-bit
+	  floats.
+
+2006-02-05 Sunday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float128_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 128-bit floats.
+
+2006-02-05 Sunday 14:17  Matthew Mundell
+
+	* tests/Grid/: certificate1.cc (1.4), isuniverse1.cc (1.4): Take
+	  out stray calls to ascii_dump.
+
+2006-02-05 Sunday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float64_binary_format.m4 (1.2): Cosmetic improvements.
+
+2006-02-05 Sunday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.211): Detect the binary format used by 32-bit
+	  floats.
+
+2006-02-05 Sunday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float32_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 32-bit floats.
+
+2006-02-05 Sunday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float96_binary_format.m4 (1.2): Correctly handle the
+	  case where a 96-bit floating point format is not detected.
+
+2006-02-05 Sunday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.210): Detect the binary format used by 96-bit
+	  floats.
+
+2006-02-05 Sunday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float96_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 96-bit floats.
+
+2006-02-04 Saturday 22:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.209): Detect the binary format used by 64-bit
+	  floats.
+
+2006-02-04 Saturday 22:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_cxx_float64_binary_format.m4 (1.1): New function to detect
+	  the binary format used by 64-bit floats.
+
+2006-02-03 Friday 03:25  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.25): A couple of fixes in OK(): Some
+	  assertions were failing without a good reason.
+
+2006-02-01 Wednesday 23:27  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.24): The FIXME about incrementality
+	  was already dealt with.
+
+2006-02-01 Wednesday 23:23  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.23): Other little improvements.
+
+2006-02-01 Wednesday 22:56  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[22,20]): Major
+	  improvements to the class: now the incrementality process handles
+	  a Constraint_System in one shot instead of a single Constraint.
+	  Added other useful tests in OK().  Minor changes in the
+	  documentation.
+
+2006-02-01 Wednesday 20:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.208): Version number bumped.
+
+2006-02-01 Wednesday 20:06  Abramo Bagnara
+
+	* src/Float.inlines.hh (1.21): Constant is 64 bit long.
+
+2006-02-01 Wednesday 19:35  Abramo Bagnara
+
+	* src/Float.inlines.hh (1.20): Clear most significant bit of the
+	  mantissa.
+
+2006-02-01 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.19): Added missing semicolon.
+
+2006-02-01 Wednesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.188): Added some items (to be filled in).
+
+2006-02-01 Wednesday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Grid/: affineimage1.cc (1.4), grid1.cc (1.6), grid2.cc
+	  (1.5), join1.cc (1.5), widening1.cc (1.4): Removed 3 "FIX "'s in
+	  grid2.cc and widening1.cc.  Added tests based on example in
+	  Muller-Olm and Seidl SAS paper to grid1.cc, join1.cc and
+	  affineimage1.cc.  Added tests based on Example 8 in the technical
+	  report on the grids domain in widening1.cc.  Reordered tests in
+	  widening1.cc so that those based on examples 8 and 9 are
+	  together.
+
+2006-02-01 Wednesday 01:34  Matthew Mundell
+
+	* tests/Grid/Makefile.am (1.6): Take NOISY directive out of
+	  AM_CPPFLAGS.
+
+2006-02-01 Wednesday 01:04  Matthew Mundell
+
+	* debian/README (1.1): Initial revision.
+
+2006-01-31 Tuesday 19:12  Matthew Mundell
+
+	* tests/Grid/grid2.cc (1.4): Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:12  Matthew Mundell
+
+	* tests/Grid/grid1.cc (1.5): Ensure that all exception tests emit
+	  noisy messages.  Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:11  Matthew Mundell
+
+	* tests/Grid/equals1.cc (1.3): Add tests to cover the rest of
+	  Grid::quick_equivalence_test().  Move variables to a local
+	  namespace.
+
+2006-01-31 Tuesday 19:09  Matthew Mundell
+
+	* tests/Grid/bounds1.cc (1.3): Add space dimension exception test.
+
+2006-01-31 Tuesday 19:08  Matthew Mundell
+
+	* tests/Grid/: addgenerator1.cc (1.5), addspacedims1.cc (1.4),
+	  addspacedims2.cc (1.4), concatenate1.cc (1.4), congruence1.cc
+	  (1.4), grid3.cc (1.4), griddifference1.cc (1.4), join1.cc (1.4),
+	  join3.cc (1.4), relations1.cc (1.5): Ensure that all exception
+	  tests emit noisy messages and exit correctly.
+
+2006-01-31 Tuesday 19:05  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.5): Add tests that exercise the
+	  case in minimize() where both systems are up-to-date.
+
+2006-01-31 Tuesday 19:03  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.5): Replace the empty check in the
+	  minimize() case where both systems are up-to-date with an
+	  assertion that the congruence system is empty.
+
+2006-01-31 Tuesday 13:20  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (1.3): Add tests where: the
+	  resulting grid is the zero dimension universe, the resulting grid
+	  is the same, a space dimension exception is thrown.
+
+2006-01-31 Tuesday 13:18  Matthew Mundell
+
+	* tests/Grid/removespacedims1.cc (1.3): Add tests of: the exception
+	  case, passing the empty variable set and an outcome of a zero
+	  dimension universe.
+
+2006-01-31 Tuesday 13:16  Matthew Mundell
+
+	* tests/Grid/: expandspacedim1.cc (1.3), foldspacedims1.cc (1.3):
+	  Add tests of exception cases.
+
+2006-01-31 Tuesday 13:10  Matthew Mundell
+
+	* tests/Grid/concatenate1.cc (1.3): Add possible space dimension
+	  exception test.
+
+2006-01-31 Tuesday 13:09  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.4): Correct exception message in
+	  expand_space_dimension.
+
+2006-01-31 Tuesday 13:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_chdims.cc (simplex.1): file Grid_chdims.cc was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-30 Monday 20:00  Matthew Mundell
+
+	* tests/Grid/: addspacedims1.cc (1.3), addspacedims2.cc (1.3):
+	  Update tests to always call find_variation only once, directly
+	  after the operation under test.  Add tests with space dimension
+	  exceptions, zero dimension universes, minimized congruences, and
+	  out-of-date congruences with minimized generators.
+
+2006-01-30 Monday 19:54  Matthew Mundell
+
+	* src/Grid_chdims.cc (1.3): Update add_space_dimensions_and_project
+	  to adjust dim_kinds when generators are out of date and
+	  congruences are minimized.
+
+2006-01-30 Monday 18:06  Matthew Mundell
+
+	* tests/Grid/certificate1.cc (1.3): Add test7 where the minimized
+	  generators are used for the Grid_Certificate construction.
+
+2006-01-30 Monday 18:04  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (1.7): Correct the Grid class friend
+	  declaration comment.
+
+2006-01-30 Monday 13:26  Matthew Mundell
+
+	* src/Grid_conversion.cc (1.4): Update lower_triangular and
+	  upper_triangular to check that the diagonal is positive and to
+	  correctly check for squareness when there are virtual rows.
+
+2006-01-30 Monday 11:30  Matthew Mundell
+
+	* tests/Grid/widening1.cc (1.3): Add exception testing test test16.
+	  Add test17 where minimizing the first congruence system finds
+	  the grid empty.
+
+2006-01-30 Monday 11:29  Matthew Mundell
+
+	* tests/Grid/limitedextrapolation1.cc (1.3): Add exception tests.
+	  Add test15, which limits with an empty congruence system.
+
+2006-01-30 Monday 11:27  Matthew Mundell
+
+	* src/Grid_widenings.cc (1.3): Correct the exception message in
+	  method widening_assign.
+
+2006-01-30 Monday 10:03  Matthew Mundell
+
+	* tests/Grid/join3.cc (1.3): Add test of space dimension exception.
+
+2006-01-30 Monday 10:02  Matthew Mundell
+
+	* tests/Grid/join1.cc (1.3): Add test of space dimension exception.
+	  Add test where updating the generators finds the grid empty.
+
+2006-01-30 Monday 10:01  Matthew Mundell
+
+	* tests/Grid/griddifference1.cc (1.3): Update some tests to call
+	  difference_assign instead of grid_difference_assign.	Add space
+	  dimension exception test.
+
+2006-01-30 Monday 10:00  Matthew Mundell
+
+	* tests/Grid/: generalizedaffinepreimage1.cc (1.3),
+	  generalizedaffinepreimage2.cc (1.3): Add tests with zero
+	  denominator parameters, negative moduli and space dimension
+	  exceptions.
+
+2006-01-30 Monday 09:59  Matthew Mundell
+
+	* tests/Grid/: affineimage1.cc (1.3), affinepreimage1.cc (1.3),
+	  generalizedaffineimage1.cc (1.3), generalizedaffineimage2.cc
+	  (1.3): Add tests with zero denominator parameters and space
+	  dimension exceptions.
+
+2006-01-30 Monday 09:56  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (1.4): Add tests for adding to an
+	  empty grid.
+
+2006-01-30 Monday 09:55  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.4): Add tests for adding an
+	  empty system and adding a trivial system to a zero dim grid.
+
+2006-01-30 Monday 09:54  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.5), addgenerators1.cc (1.1): Add
+	  addgenerators1, which tests methods that can add multiple
+	  generators to a grid.
+
+2006-01-30 Monday 09:52  Matthew Mundell
+
+	* src/Grid_public.cc (1.8): Update add_generator(g) to throw an
+	  exception when a parameter is given and the grid is zero
+	  dimension empty.  Rework the generalized_affine_image(lhs,..) and
+	  generalized_affine_preimage(lhs,..) lhs space dimension
+	  calculation to aid coverage analysis.
+
+2006-01-30 Monday 09:40  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (1.4): Rename parameters in
+	  throw_dimension_incompatible(char*, char*, Grid).
+
+2006-01-29 Sunday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.18): Fixed the build() method in
+	  specializations ot template <typename T> struct TFloat.
+
+2006-01-29 Sunday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (ppl-0_8-branch.1): Added missing
+	  semicolons.
+
+2006-01-29 Sunday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.17): Added missing semicolons.
+
+2006-01-28 Saturday 22:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence_System.defs.hh (1.5), Grid.defs.hh (1.7),
+	  Grid_Generator.defs.hh (1.6), Grid_Generator_System.defs.hh
+	  (1.7), Polyhedron.defs.hh (1.293): Revised documentation so that
+	  sample code has `grid_point' and `grid_line' instead of `point'
+	  and `line'.  Added an example to Grid_defs.hh showing use of a
+	  parameter.  Revised explanation of affine image and preimage.
+
+	  Corrected some bugs in the explanation of affine image and
+	  preimage in Polyhedron.defs.hh.
+
+2006-01-28 Saturday 18:23  Matthew Mundell
+
+	* tests/Grid/grid2.cc (1.3): Add more zero dimension tests.
+
+2006-01-28 Saturday 18:20  Matthew Mundell
+
+	* tests/Grid/: addconstraint1.cc (1.3), addconstraints1.cc (1.3),
+	  contains1.cc (1.3), disjoint1.cc (1.3), grid1.cc (1.4), grid3.cc
+	  (1.3), intersection1.cc (1.3), timeelapse1.cc (1.3): Add space
+	  dimension exception tests.
+
+2006-01-28 Saturday 18:19  Matthew Mundell
+
+	* tests/Grid/addcongruences1.cc (1.3): Add space dimension
+	  exception tests.  Add test8 which adds to an empty grid.
+
+2006-01-28 Saturday 18:17  Matthew Mundell
+
+	* src/Grid_public.cc (1.7): Update
+	  add_recycled_congruences_and_minimize and
+	  add_recycled_congruences zero dimension grid cases to always
+	  leave the empty grid empty.
+
+2006-01-27 Friday 19:26  Matthew Mundell
+
+	* tests/Grid/topclosed1.cc (1.3): Add test11 where minimizing the
+	  congruence system finds the grid empty.
+
+2006-01-27 Friday 19:25  Matthew Mundell
+
+	* tests/Grid/pointed1.cc (1.3): Add a minimal congruence system
+	  case to test5.  Add test11 where minimizing the congruence system
+	  finds the grid empty.
+
+2006-01-27 Friday 19:23  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (1.3): Add space dimension exception
+	  test.
+
+2006-01-27 Friday 19:23  Matthew Mundell
+
+	* tests/Grid/bounded1.cc (1.3): Add test13, where a paramter comes
+	  first in the system.
+
+2006-01-27 Friday 19:22  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (1.3): Add zero dimension and space
+	  dimension exception tests.
+
+2006-01-27 Friday 19:21  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.4), asciidumpload1.cc (1.1),
+	  outputoperator1.cc (1.1): Add asciidumpload1 and outputoperator1.
+
+2006-01-27 Friday 14:50  Matthew Mundell
+
+	* src/: Grid_simplify.cc (1.3), Grid.templates.hh (1.2),
+	  Grid_Certificate.cc (1.3), Grid_Generator.defs.hh (1.5),
+	  Grid_Generator.inlines.hh (1.4), Grid_Generator_System.defs.hh
+	  (1.6), Grid_Generator_System.inlines.hh (1.3), Grid_conversion.cc
+	  (1.3), Grid_nonpublic.cc (1.3), Grid_public.cc (1.6): Rename
+	  Grid_Generator::set_is_parameter to
+	  Grid_Generator::set_is_parameter_or_point. Rename
+	  Grid_Generator_System methods: num_rows to num_generators,
+	  num_rays to num_parameters.  Correct a typo in the Grid_Generator
+	  class doc.
+
+2006-01-27 Friday 14:43  Matthew Mundell
+
+	* src/Grid.inlines.hh (1.4): Drop the extra
+	  topological_closure_assign and difference_assign PPL namespace
+	  qualifiers.
+
+2006-01-27 Friday 14:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.inlines.hh (simplex.1): file Grid.inlines.hh was added
+	  on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-27 Friday 14:43  Matthew Mundell
+
+	* src/Grid.defs.hh (1.6): Drop the extra rows_are_zero Grid
+	  namespace qualifier.
+
+2006-01-27 Friday 14:42  Matthew Mundell
+
+	* doc/devref.doxyconf-latex.in (1.9): Clip trailing whitespace.
+	  Add grid-related files.
+
+2006-01-27 Friday 14:41  Matthew Mundell
+
+	* doc/devref.doxyconf-html.in (1.68): Add missing Grid files to
+	  INPUT.
+
+2006-01-27 Friday 12:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.192): Use \subsection and not \anchor in
+	  grids section of the documentation.  Avoid a multiply defined
+	  label warning due to label in the powerset section.
+
+2006-01-27 Friday 11:48  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh (1.4), Grid_Generator.inlines.hh
+	  (1.3): Take out method topology.
+
+2006-01-27 Friday 11:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh (1.5), Grid.inlines.hh (1.3),
+	  Grid.templates.hh (1.1), Makefile.am (1.143): Grid.templates.hh
+	  cut out from Grid.inlines.hh as per our standards.
+
+2006-01-27 Friday 10:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.179), src/Congruence_System.defs.hh (1.4),
+	  src/Grid.defs.hh (1.4), src/Grid_Generator.defs.hh (1.3),
+	  src/Grid_Generator_System.defs.hh (1.5):
+	  src/Grid_Generator.defs.hh, src/Grid_Generator_System.defs.hh:
+	  Documentation improved.  src/Congruence_System.defs.hh:    Fixed
+	  a cross reference to point to Grid documentation.
+	  src/Grid.defs.hh:    Improved documentation for affine image.
+
+	  TODO: Removed item concerning documentation for grids.
+
+2006-01-27 Friday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/NNC_Polyhedron.inlines.hh (1.32): Added an `inline' function
+	  specifier.
+
+2006-01-27 Friday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.30), Determinate.inlines.hh
+	  (1.53), Ptr_Iterator.inlines.hh (1.6): Added several `inline'
+	  function specifiers.
+
+2006-01-27 Friday 09:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.20),
+	  GNU/gnu_pl_check.pl (1.9), SICStus/sp_pl_check.pl (1.7),
+	  SWI/swi_pl_check.pl (1.8), XSB/xsb_pl_check.P (1.25),
+	  YAP/yap_pl_check.pl (1.11), tests/pl_check.pl (1.31): In the
+	  system files,   the definition of predicate prolog_system/1
+	  modified to return  name capitalised to match system file names.
+
+	  pl_check.pl:	  improved extra_noisy output for large numbers.
+		now we print the expression used to generate	the large
+	  number as well as the number itself.
+
+		  When calling prolog_system/1 use capitalised names.
+
+2006-01-26 Thursday 23:26  Matthew Mundell
+
+	* tests/Grid/relations2.cc (1.4): Add test15, of an empty grid,
+	  where updating finds the grid empty.	Add test16 to test18 which
+	  require the GCD calculation in relation_with.
+
+2006-01-26 Thursday 23:24  Matthew Mundell
+
+	* tests/Grid/relations1.cc (1.4): Add zero dim universe test test9.
+
+2006-01-26 Thursday 23:24  Matthew Mundell
+
+	* tests/Grid/isuniverse1.cc (1.3): Update test4 to actually test
+	  the empty case.  Scrap test10.  Add test15 where use of a point
+	  is required in is_universe.
+
+2006-01-26 Thursday 23:22  Matthew Mundell
+
+	* tests/Grid/: Makefile.am (1.3), isempty1.cc (1.1): Add isempty1,
+	  which tests is_empty().
+
+2006-01-26 Thursday 23:20  Matthew Mundell
+
+	* src/Grid_public.cc (1.5): Simplify the satisfy check case in
+	  is_universe.
+
+2006-01-26 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.templates.hh (simplex.1): file Powerset.templates.hh
+	  was added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-26 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.31), doc/devref.doxyconf-html.in (1.67),
+	  doc/devref.doxyconf-latex.in (1.8), src/BD_Shape.defs.hh (1.65),
+	  src/BD_Shape.inlines.hh (1.123), src/BD_Shape.templates.hh (1.1),
+	  src/Makefile.am (1.142), src/Polyhedra_Powerset.defs.hh (1.33),
+	  src/Polyhedra_Powerset.inlines.hh (1.39),
+	  src/Polyhedra_Powerset.templates.hh (1.1), src/Powerset.defs.hh
+	  (1.24), src/Powerset.inlines.hh (1.16), src/Powerset.templates.hh
+	  (1.1): From now on we will use source files named *.templates.hh
+	  for the non-inline definitions of all class template members and
+	  all (member or non-member) function templates that are not fully
+	  specialized.
+
+2006-01-26 Thursday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.31): Tests reordered so as to avoid a
+	  compiler warning.
+
+2006-01-26 Thursday 21:32  Matthew Mundell
+
+	* tests/Grid/relations2.cc (1.3): Add test14, of the space
+	  dimension exception.	Add more complex false congruence cases to
+	  test7.
+
+2006-01-26 Thursday 21:30  Matthew Mundell
+
+	* tests/Grid/relations1.cc (1.3): Add test8, of the space dimension
+	  exception.
+
+2006-01-26 Thursday 21:29  Matthew Mundell
+
+	* tests/Grid/mincongruences1.cc (1.3): Add test8, of an empty grid
+	  where updating the congruences finds the grid empty.
+
+2006-01-26 Thursday 21:29  Matthew Mundell
+
+	* tests/Grid/grid1.cc (1.3): Add test23, to test the assignment of
+	  a zero dim universe grid.
+
+2006-01-26 Thursday 21:28  Matthew Mundell
+
+	* tests/Grid/: generators1.cc (1.3), mingenerators1.cc (1.3): Add
+	  test9, of an empty grid where updating the generators finds the
+	  grid empty.
+
+2006-01-26 Thursday 21:27  Matthew Mundell
+
+	* src/Grid_public.cc (1.4): Improve the relation_with(cg) zero dim
+	  case a little.
+
+2006-01-26 Thursday 18:25  Matthew Mundell
+
+	* src/Grid_minimize.cc (1.3), src/Makefile.am (1.141),
+	  doc/devref.doxyconf-html.in (1.66): Complete the integration of
+	  the Grid minimize methods into their callers.
+
+2006-01-26 Thursday 16:00  Matthew Mundell
+
+	* src/Congruence.cc (1.3): Take old alternative code out of
+	  ascii_load.
+
+2006-01-26 Thursday 14:50  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (1.4): Correct typo in
+	  add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:58  Matthew Mundell
+
+	* doc/definitions.dox (1.191): Update anchor names in references in
+	  the grids sections.
+
+2006-01-26 Thursday 13:56  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (1.3): Correct
+	  add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:56  Matthew Mundell
+
+	* src/Grid.defs.hh (1.3): Neaten some doc formatting.  Align the
+	  class description as in Polyhedron.  Update reference names in
+	  docs.  Improve docs related to covering boxes.
+
+2006-01-26 Thursday 13:52  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (1.3): Correct
+	  add_unit_rows_and_columns doc.  Correct ref in affine_preimage
+	  doc.
+
+2006-01-26 Thursday 12:26  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.57): Added missing inline.
+
+2006-01-26 Thursday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.178): Old stuff removed or shortened.
+
+2006-01-25 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.45), src/Makefile.am (1.140): Updated for PPL 0.9.
+
+2006-01-25 Wednesday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.207): Version number bumped.
+
+2006-01-25 Wednesday 21:57  Matthew Mundell
+
+	* TODO (1.177): Complete some grid items, move rest into section 1.
+
+2006-01-25 Wednesday 21:56  Matthew Mundell
+
+	* src/Grid_public.cc (1.3): Convert final FIX to a FIXME.
+
+2006-01-25 Wednesday 21:46  Matthew Mundell
+
+	* tests/Makefile.am (1.250): Reorder the directories in SUBDIRS.
+
+2006-01-25 Wednesday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.176): Done items removed.  The need for C and Prolog
+	  interfaces concerns all domains, not just grids.
+
+2006-01-25 Wednesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.in (grids.4): Makefile.in is automatically
+	  generated: it should not be under CVS.
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/.cvsignore (altnum.1): file .cvsignore was added on
+	  branch altnum on 2006-10-29 19:27:27 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/.cvsignore (simplex.1): file .cvsignore was added on
+	  branch simplex on 2006-05-08 17:15:56 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.types.hh (altnum.1): file Congruence.types.hh was
+	  added on branch altnum on 2006-10-29 19:27:12 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence.types.hh (simplex.1): file Congruence.types.hh was
+	  added on branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.types.hh (altnum.1): file
+	  Congruence_System.types.hh was added on branch altnum on
+	  2006-10-29 19:27:12 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Congruence_System.types.hh (simplex.1): file
+	  Congruence_System.types.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.types.hh (altnum.1): file Grid.types.hh was added on
+	  branch altnum on 2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid.types.hh (simplex.1): file Grid.types.hh was added on
+	  branch simplex on 2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.inlines.hh (altnum.1): file
+	  Grid_Certificate.inlines.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.inlines.hh (simplex.1): file
+	  Grid_Certificate.inlines.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.types.hh (altnum.1): file
+	  Grid_Certificate.types.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Certificate.types.hh (simplex.1): file
+	  Grid_Certificate.types.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.types.hh (altnum.1): file
+	  Grid_Generator.types.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator.types.hh (simplex.1): file
+	  Grid_Generator.types.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.types.hh (altnum.1): file
+	  Grid_Generator_System.types.hh was added on branch altnum on
+	  2006-10-29 19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Generator_System.types.hh (simplex.1): file
+	  Grid_Generator_System.types.hh was added on branch simplex on
+	  2006-05-08 17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.inlines.hh (altnum.1): file
+	  Grid_Status.inlines.hh was added on branch altnum on 2006-10-29
+	  19:27:13 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_Status.inlines.hh (simplex.1): file
+	  Grid_Status.inlines.hh was added on branch simplex on 2006-05-08
+	  17:15:49 +0000
+
+2006-01-25 Wednesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.types.hh (altnum.1): file
+	  Scalar_Products.types.hh was added on branch altnum on 2006-10-29
+	  19:27:15 +0000
+
+2006-01-25 Wednesday 21:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.175), configure.ac (1.206), doc/definitions.dox (1.190),
+	  doc/devref.doxyconf-html.in (1.65), src/C_Polyhedron.cc (1.18),
+	  src/C_Polyhedron.defs.hh (1.41), src/Congruence.cc (1.2),
+	  src/Congruence.defs.hh (1.2), src/Congruence.inlines.hh (1.2),
+	  src/Congruence.types.hh (1.2), src/Congruence_System.cc (1.2),
+	  src/Congruence_System.defs.hh (1.2),
+	  src/Congruence_System.inlines.hh (1.2),
+	  src/Congruence_System.types.hh (1.2), src/Constraint.defs.hh
+	  (1.116), src/Determinate.defs.hh (1.62),
+	  src/Determinate.inlines.hh (1.52), src/Generator.defs.hh (1.116),
+	  src/Generator_System.cc (1.17), src/Generator_System.defs.hh
+	  (1.15), src/Grid.defs.hh (1.2), src/Grid.inlines.hh (1.2),
+	  src/Grid.types.hh (1.2), src/Grid_Certificate.cc (1.2),
+	  src/Grid_Certificate.defs.hh (1.2),
+	  src/Grid_Certificate.inlines.hh (1.2),
+	  src/Grid_Certificate.types.hh (1.2), src/Grid_Generator.cc (1.2),
+	  src/Grid_Generator.defs.hh (1.2), src/Grid_Generator.inlines.hh
+	  (1.2), src/Grid_Generator.types.hh (1.2),
+	  src/Grid_Generator_System.cc (1.2),
+	  src/Grid_Generator_System.defs.hh (1.2),
+	  src/Grid_Generator_System.inlines.hh (1.2),
+	  src/Grid_Generator_System.types.hh (1.2), src/Grid_Status.cc
+	  (1.2), src/Grid_Status.idefs.hh (1.2), src/Grid_Status.inlines.hh
+	  (1.2), src/Grid_chdims.cc (1.2), src/Grid_conversion.cc (1.2),
+	  src/Grid_minimize.cc (1.2), src/Grid_nonpublic.cc (1.2),
+	  src/Grid_public.cc (1.2), src/Grid_simplify.cc (1.2),
+	  src/Grid_widenings.cc (1.2), src/Linear_Expression.cc (1.10),
+	  src/Linear_Expression.defs.hh (1.20), src/Linear_Row.inlines.hh
+	  (1.11), src/Makefile.am (1.139), src/NNC_Polyhedron.cc (1.18),
+	  src/NNC_Polyhedron.defs.hh (1.44), src/Polyhedra_Powerset.defs.hh
+	  (1.32), src/Polyhedra_Powerset.inlines.hh (1.38),
+	  src/Polyhedron.defs.hh (1.292), src/Polyhedron_nonpublic.cc
+	  (1.64), src/Polyhedron_public.cc (1.72), src/Scalar_Products.cc
+	  (1.4), src/Scalar_Products.defs.hh (1.5),
+	  src/Scalar_Products.inlines.hh (1.3),
+	  src/Scalar_Products.types.hh (1.3), src/globals.defs.hh (1.35),
+	  tests/Makefile.am (1.249), tests/ppl_test.hh (1.32),
+	  tests/print.cc (1.19), tests/print.hh (1.23),
+	  tests/BD_Shape/Makefile.am (1.33), tests/Grid/.cvsignore (1.2),
+	  tests/Grid/Makefile.am (1.2), tests/Grid/addcongruence1.cc (1.2),
+	  tests/Grid/addcongruences1.cc (1.2), tests/Grid/addconstraint1.cc
+	  (1.2), tests/Grid/addconstraints1.cc (1.2),
+	  tests/Grid/addgenerator1.cc (1.2), tests/Grid/addspacedims1.cc
+	  (1.2), tests/Grid/addspacedims2.cc (1.2),
+	  tests/Grid/affinedim1.cc (1.2), tests/Grid/affineimage1.cc (1.2),
+	  tests/Grid/affinepreimage1.cc (1.2), tests/Grid/bhz03widening1.cc
+	  (1.2), tests/Grid/bounded1.cc (1.2), tests/Grid/boundingbox1.cc
+	  (1.2), tests/Grid/boundingbox2.cc (1.2), tests/Grid/bounds1.cc
+	  (1.2), tests/Grid/certificate1.cc (1.2),
+	  tests/Grid/concatenate1.cc (1.2), tests/Grid/congruence1.cc
+	  (1.2), tests/Grid/congruences1.cc (1.2),
+	  tests/Grid/congruencesystem1.cc (1.2),
+	  tests/Grid/congruencesystem2.cc (1.2), tests/Grid/contains1.cc
+	  (1.2), tests/Grid/contains2.cc (1.2),
+	  tests/Grid/copyconstruct1.cc (1.2), tests/Grid/coveringbox1.cc
+	  (1.2), tests/Grid/coveringbox2.cc (1.2), tests/Grid/disjoint1.cc
+	  (1.2), tests/Grid/equals1.cc (1.2), tests/Grid/expandspacedim1.cc
+	  (1.2), tests/Grid/foldspacedims1.cc (1.2),
+	  tests/Grid/generalizedaffineimage1.cc (1.2),
+	  tests/Grid/generalizedaffineimage2.cc (1.2),
+	  tests/Grid/generalizedaffinepreimage1.cc (1.2),
+	  tests/Grid/generalizedaffinepreimage2.cc (1.2),
+	  tests/Grid/generator1.cc (1.2), tests/Grid/generators1.cc (1.2),
+	  tests/Grid/grid1.cc (1.2), tests/Grid/grid1_16.cc (1.2),
+	  tests/Grid/grid1_64.cc (1.2), tests/Grid/grid1_gmp.cc (1.2),
+	  tests/Grid/grid2.cc (1.2), tests/Grid/grid2_16.cc (1.2),
+	  tests/Grid/grid3.cc (1.2), tests/Grid/griddifference1.cc (1.2),
+	  tests/Grid/intersection1.cc (1.2), tests/Grid/intersection2.cc
+	  (1.2), tests/Grid/isuniverse1.cc (1.2), tests/Grid/join1.cc
+	  (1.2), tests/Grid/join2.cc (1.2), tests/Grid/join3.cc (1.2),
+	  tests/Grid/limitedextrapolation1.cc (1.2),
+	  tests/Grid/mapspacedims1.cc (1.2), tests/Grid/maxmin1.cc (1.2),
+	  tests/Grid/membytes1.cc (1.2), tests/Grid/membytes2.cc (1.2),
+	  tests/Grid/mincongruences1.cc (1.2), tests/Grid/mingenerators1.cc
+	  (1.2), tests/Grid/pointed1.cc (1.2), tests/Grid/relations1.cc
+	  (1.2), tests/Grid/relations2.cc (1.2),
+	  tests/Grid/removespacedims1.cc (1.2),
+	  tests/Grid/removespacedims2.cc (1.2), tests/Grid/timeelapse1.cc
+	  (1.2), tests/Grid/timeelapse2.cc (1.2), tests/Grid/topclosed1.cc
+	  (1.2), tests/Grid/topclosure1.cc (1.2), tests/Grid/widening1.cc
+	  (1.2), tests/Grid/writecongruencesystem.cc (1.2),
+	  tests/Polyhedron/Makefile.am (1.46),
+	  tests/Polyhedron/addcongruence1.cc (1.2),
+	  tests/Polyhedron/addcongruence2.cc (1.2),
+	  tests/Polyhedron/addcongruence3.cc (1.2),
+	  tests/Polyhedron/addcongruence4.cc (1.2),
+	  tests/Polyhedron/addcongruence5.cc (1.2),
+	  tests/Polyhedron/addcongruences1.cc (1.2),
+	  tests/Polyhedron/addcongruences2.cc (1.2),
+	  tests/Polyhedron/addcongruences3.cc (1.2),
+	  tests/Polyhedron/addcongruences4.cc (1.2),
+	  tests/Polyhedron/addcongruences5.cc (1.2),
+	  tests/Polyhedron/congruences1.cc (1.2): First (and, quite likely,
+	  last) merge from the `grids' branch.
+
+2006-01-25 Wednesday 19:31  Matthew Mundell
+
+	* ChangeLog, Makefile.am, NEWS, README, README.configure, TODO,
+	  configure.ac, ppl.spec.in, Watchdog/CREDITS, Watchdog/ChangeLog,
+	  Watchdog/NEWS, Watchdog/README, debian/Makefile.am,
+	  debian/changelog, debian/control, debian/control.prologs,
+	  debian/libppl-gprolog.links, debian/libppl-sicstus.links,
+	  debian/libppl-swi.links, debian/libppl-yap.links, debian/rules,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  m4/ac_check_swi_prolog.m4, m4/ppl.m4, src/BDS_Status.idefs.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BHRZ03_Certificate.defs.hh, src/Bounding_Box.defs.hh,
+	  src/C_Polyhedron.defs.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint_System.defs.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Row.defs.hh,
+	  src/Determinate.defs.hh, src/Float.defs.hh,
+	  src/GMP_Integer.types.hh, src/Generator.defs.hh,
+	  src/Generator_System.defs.hh, src/H79_Certificate.defs.hh,
+	  src/Init.defs.hh, src/Interval.defs.hh, src/LP_Problem.defs.hh,
+	  src/LP_Problem.types.hh, src/Linear_Expression.defs.hh,
+	  src/Linear_Row.defs.hh, src/Linear_System.defs.hh,
+	  src/Makefile.am, src/Matrix.defs.hh, src/NNC_Polyhedron.defs.hh,
+	  src/Ph_Status.idefs.hh, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedron.defs.hh, src/Powerset.defs.hh,
+	  src/Powerset.inlines.hh, src/Powerset.types.hh,
+	  src/Ptr_Iterator.defs.hh, src/Result.defs.hh,
+	  src/Rounding_Dir.defs.hh, src/Row.defs.hh,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Row.defs.hh,
+	  src/Scalar_Products.defs.hh, src/Topology.hh,
+	  src/Variable.defs.hh, src/Widening_Function.defs.hh,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.defs.hh, src/checked_ext.inlines.hh,
+	  src/checked_numeric_limits.hh, src/compiler.hh,
+	  src/globals.defs.hh, src/globals.types.hh,
+	  src/mp_numeric_limits.hh, src/namespaces.hh, src/version.hh.in,
+	  tests/Makefile.am, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc, tests/BD_Shape/universe1.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/writepolyhedron3.cc
+	  (grids.[3,6,6,4,4,19,10,3,1,3,2,3,2,3,3,3,2,2,2,2,3,11,8,4,6,4,7,5,6,5,5,3,5,8,8,4,5,5,12,10,3,2,6,11,6,4,6,6,5,4,18,13,5,4,4,3,3,12,7,5,14,9,5,4,3,3,8,10,3,4,2,3,5,4,9,3,4,6,2,4,4,7,11,5,7,6,3,7,4,4,3,3,6,10,3,3,3,3,3,4,3,4,3,3]):
+	  Eighth and last merge from the main trunk.
+
+2006-01-25 Wednesday 16:34  Matthew Mundell
+
+	* tests/Grid/generalizedaffinepreimage2.cc (grids.6): Correct the
+	  expected results in test17, test18, test21 and test22.
+
+2006-01-25 Wednesday 16:33  Matthew Mundell
+
+	* tests/Grid/generalizedaffinepreimage1.cc (grids.7): Enable test6
+	  and test7, and adjust their expected results.
+
+2006-01-25 Wednesday 16:32  Matthew Mundell
+
+	* tests/Grid/generalizedaffineimage2.cc (grids.7): Correct the
+	  expected result in test18.
+
+2006-01-25 Wednesday 16:31  Matthew Mundell
+
+	* src/Grid_public.cc (grids.138): Correct the
+	  generalized_affine_preimage(lhs,..) case where variables in lhs
+	  also occur in rhs.
+
+2006-01-25 Wednesday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.64): Always link with
+	  the PIC version of ppl_sicstus_sd.o.
+
+2006-01-25 Wednesday 12:57  Matthew Mundell
+
+	* src/Grid_public.cc (grids.137): Replace the first
+	  generalized_affine_preimage(lhs,..)  line-adding call to
+	  add_recycled_generators with equivalent code, as in
+	  generalized_affine_image(lhs,..).  Neaten TODO comments.
+
+2006-01-25 Wednesday 12:48  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.42): Add a simple comment for the
+	  invert-transpose loops in both conversions.
+
+2006-01-24 Tuesday 21:54  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.41): Improve the comments on the
+	  destination initialization in the conversion methods.
+
+2006-01-24 Tuesday 21:33  Matthew Mundell
+
+	* src/: Checked_Number.defs.hh (1.68), Checked_Number.inlines.hh
+	  (1.56), GMP_Integer.defs.hh (1.19), GMP_Integer.inlines.hh
+	  (1.14), checked.defs.hh (1.34), checked.inlines.hh (1.30),
+	  checked_ext.defs.hh (1.10), checked_ext.inlines.hh (1.28),
+	  checked_float.inlines.hh (1.56), checked_int.inlines.hh (1.44),
+	  checked_mpz.inlines.hh (1.35): Add function
+	  gcdext_assign(to,x,y,s,t) to the GMP and checked integer types.
+
+2006-01-24 Tuesday 16:54  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.40): Slightly improve comments,
+	  error messages and formatting.
+
+2006-01-24 Tuesday 13:33  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.39): Improve comments in both
+	  conversion methods.
+
+2006-01-24 Tuesday 11:52  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.38): Correct the comment in both
+	  conversions about the iteration of source_index and dest_index.
+
+2006-01-24 Tuesday 11:37  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.37): Leave variable name
+	  tem_source_index as such.
+
+2006-01-24 Tuesday 00:20  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[100,62]): Update
+	  simplify(gs..) to expect the reduction to result in a system
+	  containing a point.
+
+2006-01-23 Monday 23:38  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.61): Note a possible todo item in the
+	  congruence simplify method.
+
+2006-01-23 Monday 23:35  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.60): Update
+	  reduce_congruence_with_equality to set the `row' element at
+	  `column' directly and to account for `row' elements known to be
+	  zero.  Improve variable names in same method.
+
+2006-01-23 Monday 23:28  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.59): Update
+	  reduce_parameter_with_line to set the `row' element at `column'
+	  directly and to account for `row' elements known to be zero.
+
+2006-01-23 Monday 22:52  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.58): Clean comments and improve
+	  variable names in the reduce methods.  Update these methods to
+	  all subtract the pivot from the row (intead of the other way
+	  around).
+
+2006-01-23 Monday 22:47  Matthew Mundell
+
+	* src/Grid_public.cc (grids.136): Update minimized_congruences and
+	  Grid::Grid(n,k) to recover the congruence system minimal form
+	  when inserting the zero dimension integrality.
+
+2006-01-23 Monday 22:41  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence.cc (grids.[44,23]):
+	  Correct a comment in sign_normalize.	Update normalize to always
+	  normalize the constant term, even when all homogeneous terms are
+	  zero.
+
+2006-01-23 Monday 17:44  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (grids.28): Move swap into the
+	  public section.  Improve the has_a_free_dimension doc a little.
+
+2006-01-23 Monday 16:21  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.99): Correct the description of
+	  reduce_parameter_with_line.
+
+2006-01-23 Monday 15:04  Matthew Mundell
+
+	* TODO (grids.18): Complete the ascii_dump item.
+
+2006-01-23 Monday 12:33  Matthew Mundell
+
+	* src/Grid_public.cc (grids.135): Move the gs space dimension
+	  adjustment in add_recycled_generators to the empty case.
+
+2006-01-23 Monday 12:31  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[16,25]):
+	  Update coefficient_swap to account for the divisor element and
+	  the sizes of the two generators.
+
+2006-01-22 Sunday 22:39  Matthew Mundell
+
+	* src/Generator_System.defs.hh (grids.12): Take out the Grid friend
+	  declaration.
+
+2006-01-22 Sunday 22:38  Matthew Mundell
+
+	* tests/Grid/addconstraint1.cc (grids.3): Correct test name in
+	  message.
+
+2006-01-22 Sunday 22:38  Matthew Mundell
+
+	* src/: Grid_simplify.cc, Grid.defs.hh, Grid_public.cc
+	  (grids.[57,98,134]): Reduce dependence on the Congruence_System
+	  (cgs) Grid friend declaration:
+
+	    Update relation_with to use cgs::inhomogeneous_term, is_pointed
+	  to
+	    use cgs::has_a_free_dimension, add_recycled_congruences to use
+	    cgs::recycling_insert, and
+	  add_recycled_congruences_and_minimize to
+	    use cgs::insert(cgs).
+
+	  Reduce dependence on the Generator_System Grid friend
+	  declaration: update OK to use is_equal_to and convert function
+	  rows_are_zero to a static template method.
+
+	  Correct the num_cols init in reduce_parameter_with_line.
+
+2006-01-22 Sunday 22:26  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.13): Update select_wider_congruences
+	  to use Congruence::is_equal_at_dimension.
+
+2006-01-22 Sunday 22:25  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.31): Reduce dependence on
+	  Congruence_System's Grid friend declaration: update both
+	  add_space_dimension_and_project methods to use
+	  Congruence_System::add_unit_rows_and_columns and update
+	  concatenate_assign to use Congruence_System::concatenate.
+
+2006-01-22 Sunday 22:18  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.28): Declare old_num_rows in
+	  recycling_insert const.
+
+2006-01-22 Sunday 22:18  Matthew Mundell
+
+	* src/: Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[22,13]): Add wrapper
+	  methods for Linear_System and Matrix methods used in Grid:
+	  permute_columns, erase_to_end, num_columns, resize_no_copy,
+	  set_index_first_pending_row, and unset_pending_rows.
+
+2006-01-22 Sunday 22:15  Matthew Mundell
+
+	* src/Congruence.inlines.hh (grids.23): Correct
+	  is_equal_at_dimension.
+
+2006-01-22 Sunday 22:15  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[43,27]): Add methods is_equal_to(cgs),
+	  recycling_insert(cgs), add_unit_rows_and_columns(k),
+	  concatenate(cgs) and has_a_free_dimension().	Rename method
+	  add_rows to insert, updating it to add columns as required and
+	  moving it to the public section.
+
+2006-01-22 Sunday 22:01  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[40,22]):
+	  Add is_equal_at_dimension.  Improve Grid friend declaration
+	  comment.
+
+2006-01-22 Sunday 21:34  Matthew Mundell
+
+	* src/Congruence.cc (grids.22): Update operator<< to use
+	  Coefficient_zero() for zero.
+
+2006-01-22 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.56): Print objects of class Coefficient as
+	  such.
+
+2006-01-22 Sunday 15:29  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.56): Simplify the
+	  reduce_line_with_line comment.  Clean up a few comments the other
+	  reduce_x_with_x methods.
+
+2006-01-22 Sunday 13:29  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.55): Update reduce_line_with_line and
+	  reduce_equality_with_equality to set the column'th element of row
+	  directly.
+
+2006-01-21 Saturday 20:49  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.54): Take out of
+	  reduce_parameter_with_line a query about an existing improvement.
+
+2006-01-21 Saturday 20:45  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.53): Update
+	  reduce_equality_with_equality and reduce_line_with_line to
+	  account for columns that are known to be zero.
+
+2006-01-21 Saturday 20:33  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.97): Improve the description of the col
+	  parameter in some of the reduction methods.
+
+2006-01-21 Saturday 19:50  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.96): Improve the description of
+	  reduce_line_with_line a little.
+
+2006-01-21 Saturday 19:39  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[95,52]): Update
+	  reduce_pc_with_pc to take arguments `start' and `end' instead of
+	  using a `parameters' argument to calculate the start and end of
+	  the relevant portions of the rows.
+
+2006-01-21 Saturday 19:29  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.42): Improve a comment in
+	  normalize_moduli.
+
+2006-01-21 Saturday 18:19  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.67), Checked_Number.inlines.hh
+	  (1.55): Simplified Checked and Native mixing.
+
+2006-01-20 Friday 23:53  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.51): Update reduce_pc_with_pc to set
+	  the column'th element of both row and pivot directly.
+
+2006-01-20 Friday 23:26  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.50): Correct a comment in the
+	  generator system simplify.
+
+2006-01-20 Friday 23:21  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.49): Update reduce_pc_with_pc to skip
+	  the trailing or leading columns that are known to be zero.
+
+2006-01-20 Friday 22:16  Matthew Mundell
+
+	* src/Grid_public.cc (grids.133): Inline the addition of the
+	  congruence in the case where lhs is a constant.
+
+2006-01-20 Friday 18:44  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.48): Add a rough query to
+	  reduce_pc_with_pc.
+
+2006-01-20 Friday 18:37  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, grid2_16.cc, grid4.cc (grids.[60,1,3]):
+	  Rename grid4 to grid2_16.
+
+2006-01-20 Friday 18:34  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.22): Improve the comment about
+	  cong_test4.
+
+2006-01-20 Friday 18:08  Matthew Mundell
+
+	* tests/Grid/: grid1.cc, grid1_16.cc (grids.[28,2]): Move grid1
+	  test11 and test14 into grid1_16.  Describe grid1_16 test1.
+
+2006-01-20 Friday 17:43  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, grid1.cc, grid1_16.cc
+	  (grids.[59,27,1]): Add grid1_16, for tests that require integers
+	  of at least 16 bits.	Move grid1 test8 into grid1_16.
+
+2006-01-20 Friday 17:33  Matthew Mundell
+
+	* debian/: control (ppl-0_8-branch.1), control (1.13): Update
+	  libppl-dev to depend on the system compiler.
+
+2006-01-20 Friday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (altnum.1): file control was added on branch
+	  altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 14:23  Matthew Mundell
+
+	* debian/rules (ppl-0_8-branch.1): Correct version parsing sed
+	  expression.
+
+2006-01-20 Friday 14:17  Matthew Mundell
+
+	* debian/rules (1.10): Correct version parsing sed expression.
+
+2006-01-20 Friday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/rules (altnum.1): file rules was added on branch altnum on
+	  2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_8-branch.1): Update version.
+
+2006-01-20 Friday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_8-branch.[2,2]): Mark
+	  ChangeLog.
+
+2006-01-20 Friday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog (ppl-0_8-branch.[1,1]): Updated.
+
+2006-01-20 Friday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_8-branch.1): Reflected the fact that some files
+	  have been deleted overnight.
+
+2006-01-20 Friday 06:17  Matthew Mundell
+
+	* debian/Makefile.am (grids.1): file Makefile.am was added on
+	  branch grids on 2006-01-25 18:31:23 +0000
+
+2006-01-20 Friday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/Makefile.am (1.2): Do not distribute no longer existent
+	  files.
+
+2006-01-20 Friday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/Makefile.am (altnum.1): file Makefile.am was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-20 Friday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/Makefile.am (simplex.1): file Makefile.am was added on
+	  branch simplex on 2006-05-08 17:15:45 +0000
+
+2006-01-20 Friday 01:06  Matthew Mundell
+
+	* debian/: control.prologs (1.2), libppl-gprolog.links (1.2),
+	  libppl-sicstus.links (1.2), libppl-swi.links (1.2),
+	  libppl-yap.links (1.2): Clear out Prolog configuration files.
+
+2006-01-20 Friday 01:00  Matthew Mundell
+
+	* debian/rules (1.9): Use the system C and C++ compilers.
+
+2006-01-20 Friday 01:00  Matthew Mundell
+
+	* debian/control (1.12): Revert to the stable distribution (sarge)
+	  dependencies.
+
+2006-01-20 Friday 00:59  Matthew Mundell
+
+	* debian/changelog (1.3): Add entry for 0.8 release.
+
+2006-01-20 Friday 00:25  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (grids.21): Improve the
+	  add_universe_rows_and_columns description.
+
+2006-01-20 Friday 00:24  Matthew Mundell
+
+	* doc/devref.doxyconf-html.in (grids.7): Add to INPUT classes
+	  Grid_Generator, Grid_Generator_System, Grid_Certificate and file
+	  Grid_widenings.cc.
+
+2006-01-19 Thursday 20:23  Matthew Mundell
+
+	* tests/Makefile.am (grids.5): Run the grid tests before the
+	  others.
+
+2006-01-19 Thursday 18:24  Matthew Mundell
+
+	* tests/BD_Shape/Makefile.am (grids.9): Correct temporary
+	  BD_SHAPE_INSTANCE values.
+
+2006-01-19 Thursday 16:59  Matthew Mundell
+
+	* tests/BD_Shape/Makefile.am (grids.8): Temporarily modify to run
+	  the tests once, with BD_SHAPE_INSTANCE set according to
+	  --enable-coefficients, to speed the build machine test cycle.
+
+2006-01-19 Thursday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.64), src/BD_Shape.inlines.hh (1.122),
+	  tests/BD_Shape/cc76narrowing1.cc (1.7),
+	  tests/BD_Shape/cc76narrowing2.cc (1.7),
+	  tests/BD_Shape/cc76narrowing3.cc (1.7),
+	  tests/BD_Shape/cc76narrowing4.cc (1.8),
+	  tests/BD_Shape/cc76narrowing5.cc (1.8): Corrected implementation
+	  and documentation of CC76_narrowing_assign() so as to match the
+	  order of arguments already used in all the widening and
+	  extrapolation operators.
+
+2006-01-19 Thursday 12:45  Matthew Mundell
+
+	* tests/Grid/limitedextrapolation1.cc (grids.7): Insert a second
+	  token test as test9.
+
+2006-01-19 Thursday 11:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.174): Added an item.
+
+2006-01-19 Thursday 11:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.154): Added a missing
+	  full stop.
+
+2006-01-19 Thursday 11:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.defs.hh (1.43): Corrected a couple of
+	  comments.
+
+2006-01-19 Thursday 11:11  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, grid1.cc, grid1_64.cc
+	  (grids.[58,26,1]): Add grid1_64 for tests that require 64 bit or
+	  GMP integers.  Move grid1 test18 into grid1_64.
+
+2006-01-19 Thursday 10:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.34): Removed spurious quote from the
+	  documentation.
+
+2006-01-19 Thursday 10:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.66): Documentation typo fixed.
+
+2006-01-19 Thursday 10:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.63): Corrected several documentation
+	  glitches reported by Andrea and David.
+
+2006-01-19 Thursday 10:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.51): "base blocks" --> "basic blocks".
+
+2006-01-18 Wednesday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.118): Avoid a compiler
+	  warning.
+
+2006-01-18 Wednesday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.189): Fixed anchor for LeVerge92.
+
+2006-01-18 Wednesday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.9): Fixed the detection of
+	  SWI-Prolog version 5.6.0 or later.
+
+2006-01-18 Wednesday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (altnum.1): file ac_check_swi_prolog.m4
+	  was added on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-01-18 Wednesday 16:25  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, grid1.cc, grid1_gmp.cc
+	  (grids.[57,25,1]): Add grid1_gmp for tests expected to pass only
+	  with GMP integers.  Move grid1 test19 to grid1_gmp.
+
+2006-01-18 Wednesday 13:56  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.47): Add more tracing to
+	  reduce_pc_with_pc.
+
+2006-01-18 Wednesday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.153): Another typo
+	  fixed.
+
+2006-01-18 Wednesday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.64): Many small improvements to the
+	  documentation of the C interface.
+
+2006-01-18 Wednesday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.152): Several small
+	  corrections pointed out by Andrea.
+
+2006-01-18 Wednesday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/universe1.cc (1.8),
+	  Polyhedron/addconstraints6.cc (1.7),
+	  Polyhedron/writepolyhedron3.cc (1.7): "an universe" ==> "a
+	  universe".
+
+2006-01-18 Wednesday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.types.hh (1.6): Corrected a typo in the
+	  documentation.
+
+2006-01-18 Wednesday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.10): Some old compilers do not
+	  fully understand using directives/declarations.
+
+2006-01-17 Tuesday 21:30  Matthew Mundell
+
+	* tests/Grid/congruencesystem1.cc (grids.10): Revert change made
+	  during testing.
+
+2006-01-17 Tuesday 20:27  Matthew Mundell
+
+	* tests/Grid/grid4.cc (grids.2): Clear out tracing messages.
+
+2006-01-17 Tuesday 20:26  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, timeelapse1.cc, timeelapse2.cc
+	  (grids.[56,7,1]): Add timeelapse2, where the tests are expected
+	  to fail with checkedint8.  Move timeelapse1 test9 into
+	  timeelapse2.
+
+2006-01-17 Tuesday 20:07  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, grid2.cc, grid4.cc (grids.[55,21,1]):
+	  Add grid4 for tests of grids created from congruences where the
+	  tests are expected to fail with checkedint8.	Move grid2 test10
+	  into grid4.
+
+2006-01-17 Tuesday 18:24  Matthew Mundell
+
+	* src/Checked_Number.defs.hh (grids.11): Take out the four
+	  parameter gcdext_assign declaration.
+
+2006-01-17 Tuesday 17:50  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[21,19]):
+	  `incremetality' improved and simplified using by using the new
+	  mapping system. Now the Constraint taken by `incrementality' is
+	  passed by const reference.
+
+2006-01-17 Tuesday 17:03  Matthew Mundell
+
+	* tests/: ppl_test.hh, Grid/congruencesystem1.cc (grids.[18,9]):
+	  Add macro PPL_TEST_STR.  Rename macro stringify to PPL_TEST_XSTR,
+	  correcting the expansion.
+
+2006-01-17 Tuesday 16:54  Matthew Mundell
+
+	* src/globals.defs.hh (1.33): Correct the macro names in the
+	  PPL_STR and PPL_XSTR docs.
+
+2006-01-17 Tuesday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.37), README (1.44), configure.ac (1.205),
+	  debian/Makefile.am (1.1): Distribute also the contents of the
+	  `debian' subdirectory.
+
+2006-01-17 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* Watchdog/CREDITS (1.2): "inexistent" replaced by "non-existent".
+
+2006-01-17 Tuesday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.9): Corrected a name lookup
+	  problem for the output operator.
+
+2006-01-17 Tuesday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.43): Updated.
+
+2006-01-17 Tuesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README (1.13): Updated.
+
+2006-01-17 Tuesday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.138): Removed no longer necessary definition
+	  of DOC_FILES.
+
+2006-01-17 Tuesday 13:43  Matthew Mundell
+
+	* README (1.42): Change "source distributions" to "source
+	  distribution".
+
+2006-01-17 Tuesday 12:58  Matthew Mundell
+
+	* README.configure (1.17): Clip trailing whitespace.
+
+2006-01-17 Tuesday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.16), Bounding_Box.defs.hh (1.13),
+	  Checked_Number.defs.hh (1.65), Coefficient_traits_template.hh
+	  (1.6), DB_Matrix.defs.hh (1.19), DB_Row.defs.hh (1.17),
+	  Float.defs.hh (1.17), GMP_Integer.types.hh (1.13), Init.defs.hh
+	  (1.15), Interval.defs.hh (1.27), Linear_Row.defs.hh (1.18),
+	  Linear_System.defs.hh (1.24), Matrix.defs.hh (1.75),
+	  Ph_Status.idefs.hh (1.16), Row.defs.hh (1.104),
+	  Saturation_Matrix.defs.hh (1.7), Saturation_Row.defs.hh (1.10),
+	  Scalar_Products.defs.hh (1.4), Widening_Function.defs.hh (1.14),
+	  checked.defs.hh (1.33), globals.defs.hh (1.32): Added \ingroup
+	  Doxygen commands to the documentation of many
+	  implementation-related C++ type declarations.
+
+2006-01-17 Tuesday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.23): Do not include (useless) header file
+	  <set>.  Do directly include header file <iterator>.
+
+2006-01-17 Tuesday 12:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.h.in (1.63), Prolog/Prolog_interface.dox
+	  (1.151): Mark the start/stop of \defgroup documentation blocks
+	  for readability.
+
+2006-01-17 Tuesday 12:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.64), devref.doxyconf-latex.in
+	  (1.7): File globals.types.hh was not considered when building the
+	  devref manual.
+
+2006-01-17 Tuesday 12:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.188): Added Doxygen group
+	  PPL_CXX_interface.
+
+2006-01-17 Tuesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.8): Fixed the test of constant
+	  reverse iterators.
+
+2006-01-17 Tuesday 10:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Powerset.defs.hh (1.22): Typo's fixed.
+
+2006-01-17 Tuesday 09:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.62), BHRZ03_Certificate.defs.hh (1.15),
+	  C_Polyhedron.defs.hh (1.40), Checked_Number.defs.hh (1.64),
+	  Coefficient.types.hh (1.12), Constraint.defs.hh (1.115),
+	  Constraint_System.defs.hh (1.26), Determinate.defs.hh (1.61),
+	  GMP_Integer.types.hh (1.12), Generator.defs.hh (1.115),
+	  Generator_System.defs.hh (1.14), H79_Certificate.defs.hh (1.14),
+	  LP_Problem.defs.hh (1.7), LP_Problem.types.hh (1.5),
+	  Linear_Expression.defs.hh (1.19), NNC_Polyhedron.defs.hh (1.42),
+	  Poly_Con_Relation.defs.hh (1.31), Poly_Gen_Relation.defs.hh
+	  (1.29), Polyhedra_Powerset.defs.hh (1.31), Polyhedron.defs.hh
+	  (1.291), Powerset.defs.hh (1.21), Rounding_Dir.defs.hh (1.10),
+	  Topology.hh (1.12), Variable.defs.hh (1.50), globals.defs.hh
+	  (1.31), globals.types.hh (1.5), namespaces.hh (1.8),
+	  version.hh.in (1.14): Added Doxygen group PPL_CXX_interface.
+	  Added all (user-level) C++ namespaces, classes, structs, defines,
+	  typedefs and enumerations to the new group.
+
+2006-01-17 Tuesday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (altnum.1): file Rounding_Dir.defs.hh
+	  was added on branch altnum on 2006-10-29 19:27:14 +0000
+
+2006-01-17 Tuesday 09:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Result.defs.hh (1.14): Hiding initializers of enumeration
+	  Result.  try to uniformize the documentation of enumeration
+	  values.
+
+2006-01-17 Tuesday 07:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.204): Bump version number.
+
+2006-01-17 Tuesday 07:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.20): List the availability of bool
+	  operator!=(const D& x, const D& y) among the requirements on D
+	  set by the class Powerset<D>.
+
+2006-01-17 Tuesday 07:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.7): Corrected and almost
+	  completed.
+
+2006-01-17 Tuesday 06:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.6): Removed spurious
+	  redeclaration of ps3 (it broke the build).
+
+2006-01-17 Tuesday 01:35  Matthew Mundell
+
+	* src/Powerset.defs.hh (1.19): Document the requirements for
+	  template parameter D.
+
+2006-01-17 Tuesday 01:13  Matthew Mundell
+
+	* tests/Polyhedron/powerset1.cc (1.5): Involve every method of
+	  Fcaibvp in the test.	Make std::set a private parent of Fcaibvp.
+	  Add operator==(Fcaibvp&, Fcaibvp&).
+
+2006-01-16 Monday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.24): Updated.
+
+2006-01-16 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog (1.14): Updated.
+
+2006-01-16 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.187): Revised a couple of items.
+
+2006-01-16 Monday 22:25  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.39): Comment the #endif of the
+	  ascii_load doc directive.
+
+2006-01-16 Monday 22:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.186): Improved the paragraph on class BD_Shape<T>.
+
+2006-01-16 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.185): Added some quotations marks.
+
+2006-01-16 Monday 20:55  Matthew Mundell
+
+	* NEWS (1.184): Change "all what is needed" to "all that is needed"
+	  and "what is the relation" to "what the relation is".
+
+2006-01-16 Monday 20:50  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.38): Mark the ascii_load doc an
+	  implementation detail.
+
+2006-01-16 Monday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.183): Drafted a news item concerning checked numbers.
+
+2006-01-16 Monday 20:00  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
+	  Grid_Generator.defs.hh, Grid_Generator_System.cc,
+	  Grid_Generator_System.defs.hh, Grid_Status.cc,
+	  Grid_Status.idefs.hh, Grid_public.cc
+	  (grids.[21,37,41,26,94,15,24,27,20,6,7,132]): Convert all grid
+	  classes to use the PPL_OUTPUT macros.  Update
+	  generalized_affine_preimage to prefer pre-decrement.	Add a \ref
+	  to the Grid_Generator::ascii_load doc.
+
+2006-01-16 Monday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.30): Install gzipped man pages.
+
+2006-01-16 Monday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.29): The `Copyright' tag is no longer supported:
+	  use `License' instead.
+
+2006-01-16 Monday 15:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/polypowerset1.cc (1.17): Fixed tests 15 and 16.
+
+2006-01-16 Monday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.16): Fixed test14().
+
+2006-01-16 Monday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.15): Fixed test13().
+
+2006-01-16 Monday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.14): Fixed test12().
+
+2006-01-16 Monday 15:14  Matthew Mundell
+
+	* src/: Checked_Number.defs.hh, Congruence_System.cc,
+	  GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Grid_conversion.cc,
+	  Grid_nonpublic.cc (grids.[10,40,9,6,36,69]): Clear out the
+	  left-overs of the two parameter version of lcm_assign.  Always
+	  call the three parameter version.
+
+2006-01-16 Monday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: polypowerset1.cc (1.12), polypowerset1.cc
+	  (1.13): Fixed test11().
+
+2006-01-16 Monday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.11): Fixed test10().
+
+2006-01-16 Monday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.10): Fixed test6().  Do not
+	  use ints when bools are wanted.
+
+2006-01-16 Monday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.41): The PPL now also handles bounded-difference
+	  shapes.
+
+2006-01-16 Monday 14:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/Polyhedron/polypowerset1.cc (1.9): Tests added.
+
+2006-01-16 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS (1.8): Release date decided.
+
+2006-01-16 Monday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.182): The section "Integers Represented by Floating Point
+	  Numbers" does not belong to the user's manual.
+
+2006-01-16 Monday 14:30  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+	  Grid_conversion.cc, Grid_simplify.cc (grids.[23,18,35,46]): Move
+	  negate(gg, start, end) to Grid_Generator::negate(start, end).
+
+2006-01-16 Monday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.181): News items reordered.  Added a notice for the
+	  exchange of unbounded numbers with YAP.
+
+2006-01-16 Monday 14:28  Matthew Mundell
+
+	* src/: Checked_Number.inlines.hh, GMP_Integer.defs.hh,
+	  GMP_Integer.inlines.hh (grids.[9,8,5]): Rename the wrapped
+	  gcdext_assign function to gcdext_assign_r.  Take out the
+	  four-parameter gcdext_assign function.
+
+2006-01-16 Monday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.180): Added an item for the new AM_PATH_PPL Autoconf
+	  function.
+
+2006-01-16 Monday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.4): Comparison fixed.
+
+2006-01-16 Monday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (altnum.1): file ppl.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-01-16 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.150): Warn the user
+	  about the fact that YAP's support for big numbers is still very
+	  young.
+
+2006-01-16 Monday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ppl.m4 (1.3): Error message corrected.
+
+2006-01-16 Monday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Result.defs.hh (1.13): Added brief description for
+	  enumeration Result.
+
+2006-01-16 Monday 12:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/namespaces.hh (1.7): Document the Checked namespace (for the
+	  devref manula only).	Specify once and for all in the std
+	  namespace documentation that we are specializing numeric_limits
+	  and, in particular, we are temporarily doing it also for GMP
+	  types.
+
+2006-01-16 Monday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.7): Do not explicitly mention
+	  numeric_limits specializations in the user manual.
+
+2006-01-16 Monday 12:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.9): Added brief description for
+	  enumeration Rounding_Dir; hiding initializers.
+
+2006-01-16 Monday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.12): Specializations of
+	  numeric_limits should be explicitly mentioned in the devref
+	  manual only.
+
+2006-01-16 Monday 12:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked.defs.hh (1.32): Namespaces should be documented in
+	  namespaces.hh.  Cut away another redundant documentation block.
+
+2006-01-16 Monday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.74), compiler.hh (1.7): Filter away
+	  implementation stuff from the user manual.
+
+2006-01-16 Monday 12:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.30): Fixed documentation for
+	  abandon_exponential_computations.
+
+2006-01-16 Monday 12:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Coefficient_traits_template.hh (1.5): The empty traits class
+	  is documented in the devref manual only.
+
+2006-01-16 Monday 12:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.36), user.doxyconf-latex.in (1.8):
+	  No longer expanding macros related to specialization of
+	  numeric_limits.
+
+2006-01-16 Monday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.63): Comments added/improved.
+
+2006-01-16 Monday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.179): Release date decided.  Improved the entry
+	  concerning ppl-config.
+
+2006-01-16 Monday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.173): To-do items for PPL 0.8 removed.  Remember to
+	  complete/write man pages for PPL 0.9.
+
+2006-01-16 Monday 11:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.121): Comment improved.
+
+2006-01-16 Monday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.62): Obsolete comment removed.
+
+2006-01-16 Monday 09:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.8): Added brief documentation for
+	  class Rounding_Dir.
+
+2006-01-16 Monday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Powerset.defs.hh (1.18), Powerset.inlines.hh (1.15),
+	  Powerset.types.hh (1.5): Renamed "Constraint System" as "Domain"
+	  as in the definitions.dox.  Replaced CS by D everywhere and cs by
+	  d.  Changed the section heading Member Functions for the Direct
+	  Inspection of Disjuncts to Member Functions for the Direct
+	  Manipulation of Disjuncts Moved the methods:	 add_disjunct()
+	  drop_disjunct()   drop_disjuncts()   clear() into this section.
+
+2006-01-16 Monday 09:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.61): Improved the documentation for
+	  function input().
+
+2006-01-16 Monday 09:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.35), user.doxyconf-latex.in (1.7):
+	  When producing the user manuals, do not warn for undocumented
+	  members.
+
+2006-01-16 Monday 09:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Row.defs.hh (1.17), Linear_System.defs.hh (1.23),
+	  Ptr_Iterator.defs.hh (1.7), Row.defs.hh (1.103): Do not document
+	  implementation-related classes in the user manual.
+
+2006-01-16 Monday 02:10  Matthew Mundell
+
+	* BUGS, ChangeLog, Makefile.am, NEWS, README, README.configure,
+	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  install-sh, instchk.hh, ltmain.sh, ppl.lsm.in, ppl.spec.in,
+	  Watchdog/ChangeLog, Watchdog/Makefile.am, Watchdog/NEWS,
+	  Watchdog/README, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/install-sh, Watchdog/ltmain.sh,
+	  Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Makefile.in, Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  debian/changelog, debian/control, debian/control.prologs,
+	  debian/libppl-dev.install, debian/libppl-pwl.install,
+	  debian/libppl.dirs, debian/libppl.install, debian/rules,
+	  demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex, doc/ppl-config.1,
+	  doc/ppl.sty, doc/ppl_lcdd.1, doc/ppl_lpsol.1,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, interfaces/Makefile.am, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	  m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	  m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+	  m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+	  m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Congruence.cc, src/Congruence.defs.hh,
+	  src/Congruence.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.types.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Determinate.types.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+	  src/Grid.inlines.hh, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, src/Grid_simplify.cc, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.types.hh, src/Interval.cc, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh,
+	  src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Ph_Status.inlines.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/float.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/max_space_dimension.hh, src/minimize.cc,
+	  src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhmz05widening2.cc,
+	  tests/BD_Shape/bhmz05widening3.cc,
+	  tests/BD_Shape/bhmz05widening4.cc,
+	  tests/BD_Shape/bhmz05widening5.cc,
+	  tests/BD_Shape/bhmz05widening6.cc,
+	  tests/BD_Shape/bhmz05widening7.cc,
+	  tests/BD_Shape/bhmz05widening8.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+	  tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+	  tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc, tests/BD_Shape/empty1.cc,
+	  tests/BD_Shape/empty2.cc, tests/BD_Shape/empty3.cc,
+	  tests/BD_Shape/empty4.cc, tests/BD_Shape/empty5.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation2.cc,
+	  tests/BD_Shape/limitedcc76extrapolation3.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc,
+	  tests/Polyhedron/LP_Problem3.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage12.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem1.cc, tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/lpproblem3.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/text2cxxarray.in, utils/timings.cc,
+	  utils/timings.hh
+	  (grids.[1,2,5,5,3,3,9,17,4,3,9,3,2,3,1,2,2,3,1,2,4,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,5,2,3,2,2,2,2,2,2,2,2,2,2,5,2,6,3,10,6,3,2,2,5,2,2,5,3,2,2,2,6,6,2,2,4,3,5,2,5,2,2,3,3,3,4,2,3,2,3,3,5,2,4,2,2,2,2,3,7,2,2,2,4,2,3,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,3,3,4,4,5,2,2,2,2,3,2,2,2,2,2,3,2,2,3,3,2,2,3,3,2,2,2,2,2,2,2,2,4,4,4,4,3,4,4,4,2,2,3,4,3,2,2,2,2,2,2,2,2,3,2,1,4,4,2,7,7,1,3,3,2,1,4,4,4,1,4,4,3,1,3,9,8 [...]
+	  Seventh (last but one?) merge of the main trunk to the grids
+	  branch.
+
+2006-01-15 Sunday 22:22  Matthew Mundell
+
+	* src/Grid_Generator_System.inlines.hh (grids.12): Update method
+	  clear to add the parameter divisor column after clearing.  Add
+	  notes that the size adjustments in the space dimension returning
+	  methods are for the parameter divisor column.
+
+2006-01-15 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.203): Commented out the code for the
+	  --enable-instantiations option (since it does not belong to this
+	  release).
+
+2006-01-15 Sunday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.178): Also the C interface is controlled by
+	  --enable-interfaces.
+
+2006-01-15 Sunday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.202), demos/ppl_lpsol/Makefile.am (1.20),
+	  interfaces/C/Makefile.am (1.23): Allow the C interface not to be
+	  built using the --enable-interfaces configure option.
+
+2006-01-15 Sunday 21:57  Matthew Mundell
+
+	* src/checked.inlines.hh (grids.9): Update gcdext_exact to always
+	  return errors from functions abs and neg.  Describe the COPY_GMP
+	  directive.
+
+2006-01-15 Sunday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.172): Powerset::meet_assign() will not be renamed.
+
+2006-01-15 Sunday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.60): Added several Doxygen comments
+	  and some vertical space.  Fixed a couple of comments.
+
+2006-01-15 Sunday 20:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh (1.18): Let ascii_load documentation show
+	  in the developers' manual only.
+
+2006-01-15 Sunday 20:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh (1.12): Fixed a \relates Doxygen
+	  command.
+
+2006-01-15 Sunday 18:48  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.12): Only add the limiting
+	  congruences if widening will changes the grid.
+
+2006-01-15 Sunday 17:42  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.45), affinepreimage12.cc (1.1):
+	  Add affinepreimage12, which tests the examples from
+	  definitions.dox.
+
+2006-01-15 Sunday 17:42  Matthew Mundell
+
+	* tests/Polyhedron/affinepreimage12.cc (grids.1): file
+	  affinepreimage12.cc was added on branch grids on 2006-01-16
+	  01:10:40 +0000
+
+2006-01-15 Sunday 16:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README.doc (1.9): Changed: "all you need is to find it" to
+	  "all you need to do is to find it".  "to build." to "to be
+	  built." determined before"" to "already determined".
+
+2006-01-15 Sunday 16:53  Matthew Mundell
+
+	* src/Checked_Number.defs.hh (1.59): Change "proviso" to
+	  "provisos".
+
+2006-01-15 Sunday 16:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README.doc (1.8): Changed "willing" to "wishing".
+
+2006-01-15 Sunday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.149): Tried to specify
+	  which versions of XSB can be expected to work and which not.	It
+	  is a disaster, but there is little we can do about that.
+
+2006-01-15 Sunday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.44), lpproblem1.cc (1.4),
+	  lpproblem3.cc (1.2): Added another test for LP_Problem.  Avoid
+	  redundnat inclusion in lpproblem1.cc.
+
+2006-01-15 Sunday 14:27  Matthew Mundell
+
+	* tests/Polyhedron/lpproblem1.cc (grids.1): file lpproblem1.cc was
+	  added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-15 Sunday 14:27  Matthew Mundell
+
+	* tests/Polyhedron/lpproblem3.cc (grids.1): file lpproblem3.cc was
+	  added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-15 Sunday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.84): Backtracking: XSB does
+	  not support 32-bit integers.
+
+2006-01-15 Sunday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.187): Corrected the result for the example
+	  on affine preimages as well as a typo, both signaled by Matthew.
+
+2006-01-15 Sunday 11:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.30): Revised tests for
+	  ppl_Coefficient_max/1 and ppl_Coefficient_min/1.  Reduced the
+	  maximum and minimum integer that can be handled by XSB to 2^28-1
+	  and -2^28 respectively.
+
+2006-01-15 Sunday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.174): Predicates
+	  ppl_Coefficient_min/1 and ppl_Coefficient_max/1 now fail if the
+	  respective values are not representable as Prolog integers.
+	  Avoid compiler warnings.  Indentation fixed.
+
+2006-01-15 Sunday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: SICStus/ppl_sicstus_sd.cc (1.89),
+	  YAP/ppl_yap.cc (1.112): Declare and initialize
+	  Prolog_min_integer.  Avoid a compiler warning.
+
+2006-01-15 Sunday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.117): Initialize
+	  Prolog_min_integer and Prolog_max_integer.
+
+2006-01-15 Sunday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog_sd.cc (1.37), XSB/ppl_xsb.cc
+	  (1.83): Avoid a compiler warning.
+
+2006-01-15 Sunday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.44): Define
+	  Prolog_min_integer.  Avoid a compiler warning.
+
+2006-01-15 Sunday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.87): Implementation of
+	  ppl_Coefficient_is_bounded/0 improved.
+
+2006-01-15 Sunday 03:29  Andrea Cimino
+
+	* tests/Polyhedron/: Makefile.am, lpproblem3.cc (simplex.[4,1]):
+	  Added another test for LP_Problem.
+
+2006-01-14 Saturday 22:48  Matthew Mundell
+
+	* doc/definitions.dox (1.186): Revert last change.
+
+2006-01-14 Saturday 22:17  Matthew Mundell
+
+	* doc/definitions.dox (1.185): Replace "there exist a matrix" with
+	  "there exists a matrix" in subsection "Images and Preimages of
+	  Affine Transfer Relations".
+
+2006-01-14 Saturday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.82): In XSB 2.7.1,
+	  <cinterf.h> no longer pollutes the namespace with `min' and
+	  `max'.  However, in XSB 2.7.1, <error_xsb.h> still does not come
+	  with the extern "C" wrapper.
+
+2006-01-14 Saturday 20:30  Matthew Mundell
+
+	* doc/definitions.dox (1.184): Change the first \leq in the affine
+	  relation definition in subsection Generalized_Affine_Relations to
+	  \relsym.
+
+2006-01-14 Saturday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.148): Removed an
+	  obsolete (and actually misleading) sentence about the XSB
+	  interface.
+
+2006-01-14 Saturday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.58): Two corrections to the
+	  documentation of input(): acceptable bases are in the range 2-36;
+	  bases (as well as exponents) are always written as plain base-10
+	  integers.
+
+2006-01-14 Saturday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.81): Two FIXMEs turned into
+	  TODOs: we can do nothing about them until the XSB people fix
+	  their header file.
+
+2006-01-14 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.36): Two FIXMEs turned
+	  into TODOs: we can do nothing about them until the GNU Prolog
+	  people fix their header file.
+
+2006-01-14 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.43): Two FIXMEs turned into
+	  TODOs: we can do nothing about them until the Ciao people fix
+	  their header file.
+
+2006-01-14 Saturday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.111): Two FIXME's resolved.
+
+2006-01-14 Saturday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.42): Two FIXMEs resolved.
+
+2006-01-14 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.171): We are well under 40 FIXMEs.  For PPL 0.9 the
+	  objective is to go below 20.
+
+2006-01-14 Saturday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.34), user.doxyconf-latex.in (1.6):
+	  Added PPL_SPECIALIZE_LIMITS_INT and PPL_SPECIALIZE_LIMITS_FLOAT
+	  to EXPAND_AS_DEFINED.
+
+2006-01-14 Saturday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.30): Extended the section on limiting the visibility
+	  of everything.  Some material that was in the section about
+	  macros has been moved here.
+
+2006-01-14 Saturday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.6): Comments revised so as to avoid
+	  redundancy.
+
+2006-01-14 Saturday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.11): Macros
+	  SPECIALIZE_LIMITS_INT and SPECIALIZE_LIMITS_FLOAT renamed
+	  PPL_SPECIALIZE_LIMITS_INT and PPL_SPECIALIZE_LIMITS_FLOAT,
+	  respectively.  They are also undefined as soon as no longer
+	  necessary.  Partial specializations of std::numeric_limits
+	  provided with a Doxygen comment.
+
+2006-01-14 Saturday 16:44  Matthew Mundell
+
+	* NEWS (1.177): Always indent code with two spaces.  Convert tabs
+	  to spaces.
+
+2006-01-14 Saturday 16:41  Matthew Mundell
+
+	* NEWS (1.176): Correct spelling of "publicly".
+
+2006-01-14 Saturday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.137): Generate ppl.hh simply as a copy of
+	  ppl_install.hh.  The old kludge to generate ppl.hh has simply
+	  been comments out, in case the new method proves to yield worse
+	  user documentation (via Doxygen).
+
+2006-01-14 Saturday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.151): FIXME resolved.
+
+2006-01-14 Saturday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/namespaces.hh (1.6): In the documentation of namespace std,
+	  specify that we also specialize std::numeric_limits.
+
+2006-01-14 Saturday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.5): Specializations for
+	  std::numeric_limits commented.
+
+2006-01-14 Saturday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.57): Improved the documentation for
+	  input(std::istream&, Checked_Number<T, Policy>&, Rounding_Dir).
+
+2006-01-14 Saturday 15:48  Matthew Mundell
+
+	* Watchdog/NEWS (1.7): Add detail to the 0.5 Time entry.
+
+2006-01-14 Saturday 15:37  Matthew Mundell
+
+	* Watchdog/NEWS (1.6): Update 0.8 entries from ChangeLog.
+
+2006-01-14 Saturday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.24): Added three new tests.
+
+2006-01-14 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.150): Two FIXMEs resolved.  Be
+	  consistent in the use of assign_r().
+
+2006-01-14 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.62): Typo fixed.
+
+2006-01-14 Saturday 14:12  Matthew Mundell
+
+	* NEWS (1.175): Update 0.8 entries from ChangeLog.
+
+2006-01-14 Saturday 13:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.17), Powerset.inlines.hh (1.14):
+	  Iterators for Powerset renamed as omega_iterator and
+	  omega_const_iterator.  Added corresponding typedefs for the
+	  previous naming and documented the typedefs.
+
+2006-01-14 Saturday 13:48  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.56): Added empty fractional to
+	  formal syntax.
+
+2006-01-14 Saturday 13:38  Abramo Bagnara
+
+	* src/checked.cc (1.15), tests/Polyhedron/numberinput1.cc (1.23):
+	  Allow empty fractional part.
+
+2006-01-14 Saturday 12:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.55): Completed a draft
+	  documentation for Result input(std::istream& is,
+	  Checked_Number<T, Policy>& x, Rounding_Dir dir).
+
+2006-01-14 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.174), README (1.40): Reworded a couple of sentences.
+
+2006-01-14 Saturday 08:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.29): Corrected a test for
+	  ppl_Coefficient_min/1.
+
+2006-01-13 Friday 22:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README (1.39): Added bullet about linear programming problem
+	  solver.  Minor language improvements.
+
+2006-01-13 Friday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.10): Cosmetic changes.
+
+2006-01-13 Friday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.4): Fixed: all specializations of
+	  std::numeric_limits must have the `is_specialized' field set to
+	  true.
+
+2006-01-13 Friday 19:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.54): Include
+	  "checked_numeric_limits.hh".	Long line broken.
+
+2006-01-13 Friday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.173): Do not write
+	  std::numeric_limits<const Coefficient>: write
+	  std::numeric_limits<Coefficient> instead.
+
+2006-01-13 Friday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/Makefile.am (1.22), C/ppl_c.cc (1.149),
+	  Prolog/ppl_prolog.icc (1.172), Prolog/Ciao/Makefile.am (1.52),
+	  Prolog/Ciao/ppl_ciao.cc (1.41), Prolog/GNU/Makefile.am (1.52),
+	  Prolog/GNU/ppl_gprolog_sd.cc (1.35), Prolog/SICStus/Makefile.am
+	  (1.63), Prolog/SICStus/ppl_sicstus_sd.cc (1.88),
+	  Prolog/SWI/Makefile.am (1.59), Prolog/SWI/ppl_swiprolog.cc
+	  (1.116), Prolog/XSB/Makefile.am (1.41), Prolog/XSB/ppl_xsb.cc
+	  (1.80), Prolog/YAP/Makefile.am (1.43), Prolog/YAP/ppl_yap.cc
+	  (1.110): No longer include individual PPL header file: include
+	  ppl_install.hh and pwl_install.hh instead.
+
+2006-01-13 Friday 18:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Powerset.defs.hh (1.16): Some comments revised.
+
+2006-01-13 Friday 14:52  Matthew Mundell
+
+	* TODO (1.170): Add Debian package TODO list.
+
+2006-01-13 Friday 14:19  Matthew Mundell
+
+	* debian/control.prologs (1.1): Initial revision.
+
+2006-01-13 Friday 14:19  Matthew Mundell
+
+	* debian/control.prologs (grids.1): file control.prologs was added
+	  on branch grids on 2006-01-16 01:10:28 +0000
+
+2006-01-13 Friday 14:02  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.20): Some bugs in `incrementality'
+	  (appear to be) fixed.  `erase_artificials', modified for this
+	  reason, now  is used also by incrementality.	Added some useful
+	  checks in OK().
+
+2006-01-13 Friday 13:48  Matthew Mundell
+
+	* debian/control (1.11): Only build the packages for which Debian
+	  provides the build requirements.
+
+2006-01-13 Friday 13:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.28): Improvements to tests
+	  involving large numbers and coefficients.  Part of test on
+	  coefficients commented temporarily until problems with this are
+	  fixed.
+
+2006-01-13 Friday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.120): ascii_dump&load methods no
+	  longer inlined (and moved away from other inlined methods).
+
+2006-01-13 Friday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.61), BD_Shape.inlines.hh (1.119): No
+	  longer disregard the optional tokens parameter in the widening
+	  and extrapolation methods. A token parameter also added to CC76's
+	  extrapolation operator.  Removed a couple of misplaced OK()
+	  assertions.
+
+2006-01-12 Thursday 22:43  Matthew Mundell
+
+	* interfaces/Prolog/GNU/README (1.2): Clip trailing whitespace.
+
+2006-01-12 Thursday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/README (altnum.1): file README was added on
+	  branch altnum on 2006-10-29 19:27:02 +0000
+
+2006-01-12 Thursday 22:42  Matthew Mundell
+
+	* debian/libppl-pwl.install (1.3): Add usr/lib/libpwl.so.
+
+2006-01-12 Thursday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.install (altnum.1): file libppl-pwl.install was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:42  Matthew Mundell
+
+	* debian/: libppl-dev.install (1.3), libppl.install (1.5): Move
+	  usr/lib/libppl.so from libppl-dev to libppl.	Add
+	  usr/bin/ppl-config to libppl.
+
+2006-01-12 Thursday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.install (altnum.1): file libppl-dev.install was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.install (altnum.1): file libppl.install was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 22:39  Matthew Mundell
+
+	* debian/control (1.10): Drop the libppl-swi and libppl-gprolog
+	  dependencies on swi-prolog and gprolog, resp.
+
+2006-01-12 Thursday 22:30  Matthew Mundell
+
+	* BUGS (1.5): Improve the known bugs statement.
+
+2006-01-12 Thursday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.16): Fix misplaced semicolon.
+
+2006-01-12 Thursday 17:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.183): Small improvements to subsection 1.6
+	  on the powerset domain.
+
+2006-01-12 Thursday 16:31  Matthew Mundell
+
+	* debian/rules (1.8): Correct the ppl-config source directory.
+	  Improve two comments.
+
+2006-01-12 Thursday 16:31  Matthew Mundell
+
+	* debian/libppl.install (1.4): Add ppl_lpsol and the manual pages.
+
+2006-01-12 Thursday 16:30  Matthew Mundell
+
+	* debian/libppl.dirs (1.3): Add usr/share/man/man1.
+
+2006-01-12 Thursday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.dirs (altnum.1): file libppl.dirs was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2006-01-12 Thursday 16:30  Matthew Mundell
+
+	* debian/libppl-pwl.install (1.2): Move pwl.hh to libppl-dev.
+
+2006-01-12 Thursday 16:29  Matthew Mundell
+
+	* debian/libppl-dev.install (1.2): Add the header files.
+
+2006-01-12 Thursday 16:28  Matthew Mundell
+
+	* debian/control (1.9): Add glpk to Build-Depends.
+
+2006-01-12 Thursday 13:29  Matthew Mundell
+
+	* debian/rules (1.7): Add ppl_lpsol and ppl-config to the programs
+	  installed in install-arch.
+
+2006-01-12 Thursday 13:28  Matthew Mundell
+
+	* debian/control (1.8): Update to the new GMP package names.  Add
+	  libgmp3-doc to the libdevel suggested packages.  Improve some
+	  wording in the libppl-dev description.
+
+2006-01-12 Thursday 08:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.147),
+	  Ciao/ciao_pl_check.pl (1.19), Ciao/ppl_ciao.cc (1.40),
+	  Ciao/ppl_ciao.pl (1.86), GNU/ppl_gprolog.pl (1.58),
+	  SICStus/ppl_sicstus_sd.cc (1.87), SWI/ppl_swiprolog.cc (1.115),
+	  XSB/ppl_xsb.H (1.46), XSB/ppl_xsb.cc (1.79), XSB/xsb_pl_check.P
+	  (1.24), YAP/ppl_yap.cc (1.109), tests/pl_check.pl (1.27): Added
+	  predicates ppl_Coeffient_is_bounded/0, ppl_Coefficient_max and
+	  ppl_Coefficient_min.	A few small bugs fixed.
+
+2006-01-11 Wednesday 23:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.26): Obsolete hack
+	  removed.
+
+2006-01-11 Wednesday 23:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.171): Fixed
+	  ppl_Coefficient_min() and ppl_Coefficient_max().
+
+2006-01-11 Wednesday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.28): Include ppl-config in %{_bindir} and the man
+	  pages in %{_mandir}/man1.
+
+2006-01-11 Wednesday 22:16  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[19,18]): *this
+	  was not fully cleared if the problem was solved from scratch.
+	  Typo fixed in the documentation.
+
+2006-01-11 Wednesday 20:34  Matthew Mundell
+
+	* debian/rules (1.6): Improve the comment about ppl_lcdd.  Improve
+	  the comments about the installation of the change logs.  Merge
+	  the copy commands of the merged browse and print documents.
+
+2006-01-11 Wednesday 19:21  Matthew Mundell
+
+	* debian/rules (1.5): Call autoreconf instead of each of the auto*
+	  scripts.  Leave the configuration of the Watchdog to the PPL
+	  configure command.
+
+2006-01-11 Wednesday 18:35  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (simplex.17): Minor documentation
+	  improvements.
+
+2006-01-11 Wednesday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.170): New functions
+	  ppl_Coefficient_is_bounded(), ppl_Coefficient_min(Prolog_term_ref
+	  t_min) and ppl_Coefficient_max(Prolog_term_ref t_max) allow the
+	  Prolog application to inspect the basic properties of the
+	  `Coefficient' integer type.
+
+2006-01-11 Wednesday 17:52  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[18,16,17]): Totally rehandled the way of mapping the
+	  `input_cs' columns with the `tableau' ones: `dim_map' is no
+	  longer used.	Renamed `swap_base' to `pivot'.  `slack' and
+	  `artificial' variables are better handled and documented.
+
+2006-01-11 Wednesday 15:23  Matthew Mundell
+
+	* src/Matrix.cc (1.92): Convert the add_recycled_row row size
+	  assertion into an OK assertion on the given row.
+
+2006-01-11 Wednesday 13:46  Matthew Mundell
+
+	* debian/changelog (1.2): Clear dummy entry.
+
+2006-01-11 Wednesday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.15), Ph_Status.idefs.hh (1.15):
+	  Avoid include directives in files *.idefs.hh.
+
+2006-01-11 Wednesday 11:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.14), BD_Shape.defs.hh (1.60),
+	  DB_Matrix.defs.hh (1.17), Linear_Row.defs.hh (1.16),
+	  Ph_Status.idefs.hh (1.14), Polyhedra_Powerset.defs.hh (1.30),
+	  Row.defs.hh (1.102): Added a few missing \ref doxygen commands.
+	  Prefer direct vs indirect inclusion of globals.defs.hh.
+
+2006-01-11 Wednesday 11:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.16): Spurious dot in doxygen documentation
+	  removed.
+
+2006-01-11 Wednesday 11:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.63), devref.doxyconf-latex.in
+	  (1.6), user.doxyconf-html.in (1.33), user.doxyconf-latex.in
+	  (1.5): Expanding as predefined the macro PPL_OUTPUT_DECLARATIONS,
+	  so as to avoid warnings in the user manual and to see the
+	  documentation in the devref manual.
+
+2006-01-11 Wednesday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.29): The comments for output methods
+	  marked as brief comments.
+
+2006-01-11 Wednesday 02:21  Matthew Mundell
+
+	* src/: Linear_System.cc (1.37), Matrix.cc (1.91), Matrix.defs.hh
+	  (1.73), Matrix.inlines.hh (1.49): Add Matrix methods
+	  add_row(const Row&) and add_recycled_row(Row&).  Update
+	  Linear_System::add_row to use Matrix::add_row.
+
+2006-01-10 Tuesday 21:08  Matthew Mundell
+
+	* doc/ppl-config.1 (grids.1): file ppl-config.1 was added on branch
+	  grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (1.3): Improved.
+
+2006-01-10 Tuesday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (simplex.1): file ppl-config.1 was added on
+	  branch simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 21:02  Matthew Mundell
+
+	* doc/ppl_lcdd.1 (grids.1): file ppl_lcdd.1 was added on branch
+	  grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.42), ppl_lcdd.1 (1.1): Added a draft man
+	  page for `ppl_lcdd'.
+
+2006-01-10 Tuesday 21:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lcdd.1 (simplex.1): file ppl_lcdd.1 was added on branch
+	  simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.54): Changed again: option
+	  --max-memory has now -R (and not -M) as its short counterpart.
+
+2006-01-10 Tuesday 20:59  Matthew Mundell
+
+	* doc/ppl_lpsol.1 (grids.1): file ppl_lpsol.1 was added on branch
+	  grids on 2006-01-16 01:10:29 +0000
+
+2006-01-10 Tuesday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.41), ppl_lpsol.1 (1.1): Added a draft man
+	  page for `ppl_lpsol'.
+
+2006-01-10 Tuesday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl_lpsol.1 (simplex.1): file ppl_lpsol.1 was added on branch
+	  simplex on 2006-05-08 17:15:46 +0000
+
+2006-01-10 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.28): Option --max-memory has now
+	  -R (and not -V) as its short counterpart.  New option --version
+	  (-V) prints version information on stdout.  Fixed a couple of
+	  error messages.
+
+2006-01-10 Tuesday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.53): Option --max-memory has now -M
+	  (and not -V) as its short counterpart.  New option --version (-V)
+	  prints version information on stdout.  Fixed a bug in the
+	  definition of OPTION_LETTERS (-c is not available unless USE_PPL
+	  is defined).
+
+2006-01-10 Tuesday 20:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl-config.1 (1.2), src/ppl-config.cc.in (1.15): In the
+	  documentation for option --help (-h), specify that the output is
+	  written on stdout.
+
+2006-01-10 Tuesday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.40), ppl-config.1 (1.1): Added a draft man
+	  page for `ppl-config'.
+
+2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/Makefile.am (altnum.1): file Makefile.am was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-10 Tuesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.36), Watchdog/Makefile.am (1.25),
+	  Watchdog/src/Makefile.am (1.5), Watchdog/utils/Makefile.am (1.6),
+	  demos/Makefile.am (1.9), demos/ppl_lcdd/Makefile.am (1.22),
+	  demos/ppl_lcdd/examples/Makefile.am (1.7),
+	  demos/ppl_lpsol/Makefile.am (1.19),
+	  demos/ppl_lpsol/examples/Makefile.am (1.6), doc/Makefile.am
+	  (1.39), interfaces/Makefile.am (1.13), interfaces/C/Makefile.am
+	  (1.21), interfaces/OCaml/Makefile.am (1.12),
+	  interfaces/Prolog/Makefile.am (1.30),
+	  interfaces/Prolog/Ciao/Makefile.am (1.51),
+	  interfaces/Prolog/GNU/Makefile.am (1.51),
+	  interfaces/Prolog/SICStus/Makefile.am (1.62),
+	  interfaces/Prolog/SWI/Makefile.am (1.58),
+	  interfaces/Prolog/XSB/Makefile.am (1.40),
+	  interfaces/Prolog/YAP/Makefile.am (1.42),
+	  interfaces/Prolog/tests/Makefile.am (1.7), m4/Makefile.am (1.16),
+	  src/Makefile.am (1.136), tests/Makefile.am (1.248),
+	  tests/BD_Shape/Makefile.am (1.32), tests/Polyhedron/Makefile.am
+	  (1.43), utils/Makefile.am (1.12): Avoid providing default
+	  information that Automake does figure out by itself.
+
+2006-01-10 Tuesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.14): Option --interface (-I) fixed.
+
+2006-01-10 Tuesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.13): The --all (-Z) option has been
+	  removed.
+
+2006-01-10 Tuesday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.12): Print usage information to stdout,
+	  not stdin.  Include information on reporting bugs in the usage
+	  information.
+
+2006-01-10 Tuesday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.13): If "$MAKE" is empty, define it
+	  to be "make".
+
+2006-01-10 Tuesday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.12): Exploit the now available ascii_dump()
+	  method for Generator.
+
+2006-01-10 Tuesday 16:17  Matthew Mundell
+
+	* src/LP_Problem.cc (grids.1): file LP_Problem.cc was added on
+	  branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 16:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.8): Dealt with another FIXME.
+
+2006-01-10 Tuesday 16:12  Matthew Mundell
+
+	* src/LP_Problem.inlines.hh (grids.1): file LP_Problem.inlines.hh
+	  was added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.11): When resizing the tableau, make sure we
+	  never try to go beyond Matrix::max_num_columns().
+
+2006-01-10 Tuesday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.12): Allow to override the `make'
+	  command used: invoke "$MAKE" instead of "make".
+
+2006-01-10 Tuesday 15:58  Matthew Mundell
+
+	* src/: BD_Shape.inlines.hh (1.118), Constraint.cc (1.55),
+	  Constraint.defs.hh (1.114), Constraint.inlines.hh (1.62),
+	  Constraint_System.cc (1.16), Constraint_System.defs.hh (1.25),
+	  DB_Matrix.defs.hh (1.16), DB_Matrix.inlines.hh (1.24),
+	  Generator.cc (1.68), Generator.defs.hh (1.114),
+	  Generator.inlines.hh (1.59), Generator_System.cc (1.16),
+	  Generator_System.defs.hh (1.13), LP_Problem.cc (1.10),
+	  LP_Problem.defs.hh (1.6), Linear_Row.cc (1.17),
+	  Linear_Row.defs.hh (1.15), Linear_System.cc (1.36),
+	  Linear_System.defs.hh (1.22), Matrix.cc (1.90), Matrix.defs.hh
+	  (1.72), Ph_Status.cc (1.9), Ph_Status.idefs.hh (1.13),
+	  Poly_Con_Relation.cc (1.12), Poly_Con_Relation.defs.hh (1.30),
+	  Poly_Gen_Relation.cc (1.12), Poly_Gen_Relation.defs.hh (1.28),
+	  Polyhedra_Powerset.defs.hh (1.29), Polyhedra_Powerset.inlines.hh
+	  (1.37), Polyhedron.defs.hh (1.290), Polyhedron_public.cc (1.71),
+	  Row.cc (1.97), Row.defs.hh (1.101), Saturation_Matrix.cc (1.8),
+	  Saturation_Matrix.defs.hh (1.6), BDS_Status.idefs.hh (1.13),
+	  BDS_Status.inlines.hh (1.11), BD_Shape.defs.hh (1.59): Add
+	  ascii_load(istream&) and ascii_dump(ostream&) to Constraint and
+	  to Generator.  Add ascii_dump() and print() to all classes having
+	  an ascii_dump(ostream&).  Move the detailed section of the
+	  Linear_System::ascii_dump doxygen doc into the method definition.
+	  Declare Poly_Con_Relation::acsii_dump(ostream&) and
+	  Poly_Gen_Relation::ascii_dump(ostream&) public.
+
+2006-01-10 Tuesday 15:58  Matthew Mundell
+
+	* src/LP_Problem.defs.hh (grids.1): file LP_Problem.defs.hh was
+	  added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-10 Tuesday 15:46  Matthew Mundell
+
+	* src/globals.defs.hh (1.28): Add macros PPL_STR(s), PPL_XSTR(s),
+	  PPL_OUTPUT_DECLARATIONS, PPL_OUTPUT_DEFINITIONS(class_name),
+	  PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name),
+	  PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix),
+	  PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol,
+	  class_prefix).
+
+2006-01-10 Tuesday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.108): Prolog_get_long()
+	  fixed.
+
+2006-01-10 Tuesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.173), interfaces/C/ppl_c.cc (1.148),
+	  interfaces/C/ppl_c.h.in (1.61): New functions added to the C
+	  interface:
+
+	    int ppl_Coefficient_is_bounded(void),
+	    int ppl_Coefficient_min(mpz_t min),
+	    int ppl_Coefficient_max(mpz_t max)
+
+	  allow C applications to obtain information about the Coefficient
+	  integer numerical type.
+
+2006-01-10 Tuesday 13:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.9): An anonymous FIXME turned into a
+	  meaningful comment.
+
+2006-01-10 Tuesday 12:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.25): The large integer
+	  tests for Prolog systems with bounded integers improved so that
+	  they check the maximum and minimum integers at the interface.
+
+	  The exception testing for Prolog also improved and a bug fixed
+	  when testing the Prolog_unsigned_out_of_range exception.
+
+	  The exception testing for Prolog systems with bounded integers
+	  improved. We explicitly exclude XSB from these tests as it does
+	  not throw an exception when the numbers are out-of-range.
+
+2006-01-10 Tuesday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.7), ppl.spec.in (1.27): Updated.
+
+2006-01-10 Tuesday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.201): Version number bumped.
+
+2006-01-09 Monday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.35), config.sub (1.33), Watchdog/config.guess
+	  (1.19), Watchdog/config.sub (1.18): Updated.
+
+2006-01-09 Monday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.23), Watchdog/ChangeLog (1.13): Updated.
+
+2006-01-09 Monday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.78): XSB supports only 32-bit
+	  integers: two FIXMEs resolved.
+
+2006-01-09 Monday 18:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.58): Removed a FIXME that was already
+	  dealt with.
+
+2006-01-09 Monday 14:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.172), interfaces/Prolog/Prolog_interface.dox (1.146),
+	  interfaces/Prolog/ppl_prolog.icc (1.169),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.17),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.13),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.18),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.85),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.57),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.86),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.114),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.45),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.77),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.16),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.14),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.23),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.107),
+	  interfaces/Prolog/tests/clpq.pl (1.8),
+	  interfaces/Prolog/tests/clpq2.pl (1.8),
+	  interfaces/Prolog/tests/pl_check.pl (1.24):	 In the Prolog
+	  interface, the names and arities of the predicates
+	     that create handles for new polyhedra have been revised
+	     to match more closely the corresponding C and C++ interface
+	     operators.
+
+	     That is, instead of having "c" and/or "nnc" as arguments to
+	  indicate
+	     the topology of the polyhedron, the topologies are now part of
+	  the
+	     names of the predicates.
+
+	     In Prolog_interface.dox, add a link to a bug report
+	     about handling large numbers in XSB.
+
+2006-01-09 Monday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.7): Definitions reordered for
+	  clarity as well as to actually allow inlining.
+
+2006-01-09 Monday 14:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh (1.10): Methods OK(), ascii_dump() and
+	  ascii_load() are no longer inlined.
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16 (altnum.1): file
+	  expected_pchk_int16 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int16 (altnum.1): file
+	  expected_pchk_int16 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16_a (altnum.1): file
+	  expected_pchk_int16_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int16_a (altnum.1): file
+	  expected_pchk_int16_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32 (altnum.1): file
+	  expected_pchk_int32 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int32 (altnum.1): file
+	  expected_pchk_int32 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32_a (altnum.1): file
+	  expected_pchk_int32_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int32_a (altnum.1): file
+	  expected_pchk_int32_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64_a (altnum.1): file
+	  expected_pchk_int64_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int64_a (altnum.1): file
+	  expected_pchk_int64_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8_a (altnum.1): file
+	  expected_pchk_int8_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-09 Monday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8_a (altnum.1): file
+	  expected_pchk_int8_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-09 Monday 13:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.145),
+	  XSB/expected_pchk_int16 (1.4), XSB/expected_pchk_int16_a (1.4),
+	  XSB/expected_pchk_int32 (1.4), XSB/expected_pchk_int32_a (1.4),
+	  XSB/expected_pchk_int64_a (1.3), XSB/expected_pchk_int8 (1.3),
+	  XSB/expected_pchk_int8_a (1.4), tests/expected_pchk_int16 (1.7),
+	  tests/expected_pchk_int16_a (1.7), tests/expected_pchk_int32
+	  (1.7), tests/expected_pchk_int32_a (1.7),
+	  tests/expected_pchk_int64_a (1.6), tests/expected_pchk_int8
+	  (1.7), tests/expected_pchk_int8_a (1.7), tests/pl_check.pl
+	  (1.23): The tests in pl_check.pl now continue when there is an
+	  overflow exception.  Also the tests are more careful to output in
+	  'quiet' mode as the default.
+
+	  As a result of these changes, the expected_pchk files have to be
+	  revised.
+
+	  A type fixed in Prolog_definitions.dox.
+
+2006-01-08 Sunday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.35), src/Linear_System.defs.hh (1.21),
+	  tests/Polyhedron/gramschmidt1.cc (1.4): Method
+	  Linear_System::gram_schmidt() removed: it was buggy and not used.
+
+2006-01-08 Sunday 22:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.8): Dealt with a few FIXME's.
+
+2006-01-08 Sunday 21:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.6): A couple of FIXME's properly
+	  renamed as TODO's.
+
+2006-01-08 Sunday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.169), interfaces/Prolog/Prolog_interface.dox (1.144):
+	  Improved the documentation about shared libraries and the Prolog
+	  interfaces.
+
+2006-01-08 Sunday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh (1.23), Matrix.inlines.hh (1.48),
+	  Saturation_Matrix.inlines.hh (1.6): Two FIXME's resolved and two
+	  useless static variables removed: while it is not clear why
+	  std::vector::max_size() is not static, GCC and the Intel C++
+	  compiler do compile out all overhead (GCC starting from -O1, the
+	  Intel compiler starting from -O2).
+
+2006-01-08 Sunday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.53), Checked_Number.inlines.hh
+	  (1.54): Constructor to build a Checked_Number from a different
+	  kind of Checked_Number marked "explicit" and made available (it
+	  was commented out).
+
+2006-01-08 Sunday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.168): Parallel builds now work everywhere.
+
+2006-01-08 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.22): Added a test on
+	  hexadecimal number syntax.
+
+2006-01-08 Sunday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.61): Temporarily force
+	  serialization of the tests (see
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html).
+
+2006-01-08 Sunday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.50), SICStus/Makefile.am
+	  (1.60), SWI/Makefile.am (1.57): Renamed some variables.
+
+2006-01-08 Sunday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.49): Dependencies fixed.
+	  Allow the test targets to be executed in parallel.
+
+2006-01-08 Sunday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.48), SICStus/Makefile.am
+	  (1.59), SWI/Makefile.am (1.56): Added missing prerequisites.
+
+2006-01-08 Sunday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.52): Useless, commented-out
+	  declaration removed.
+
+2006-01-08 Sunday 10:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.22): Added a test for
+	  exception "notan_LP_Problem_handle".
+
+2006-01-08 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.96): Corrected use of exact_div_assign().
+
+2006-01-08 Sunday 08:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.34): Corrected uses of
+	  exact_div_assign().  Repeated computation factorized.
+
+2006-01-08 Sunday 08:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LP_Problem.cc (1.7): Corrected the uses of lcm_assign().
+
+2006-01-08 Sunday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.18), GMP_Integer.inlines.hh (1.13):
+	  Removed the following redundant functions void
+	  gcd_assign(GMP_Integer& x, const GMP_Integer& y); void
+	  lcm_assign(GMP_Integer& x, const GMP_Integer& y); void
+	  exact_div_assign(GMP_Integer& x, const GMP_Integer& y); void
+	  sqrt_assign(GMP_Integer& x).
+
+2006-01-08 Sunday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.51), Checked_Number.inlines.hh
+	  (1.53): Restored function template <typename T, typename Policy>
+	  void neg_assign(Checked_Number<T, Policy>& x) and macro
+	  DEF_ASSIGN_FUN2_1.
+
+2006-01-07 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.50), Checked_Number.inlines.hh
+	  (1.52): The following redundant functions have been removed:
+	  template <typename T, typename Policy> void
+	  neg_assign(Checked_Number<T, Policy>& x); template <typename T,
+	  typename Policy> void gcd_assign(Checked_Number<T, Policy>& x,
+	  const Checked_Number<T, Policy>& y); template <typename T,
+	  typename Policy> void lcm_assign(Checked_Number<T, Policy>& x,
+	  const Checked_Number<T, Policy>& y); template <typename T,
+	  typename Policy> void exact_div_assign(Checked_Number<T, Policy>&
+	  x, const Checked_Number<T, Policy>& y); template <typename T,
+	  typename Policy> void sqrt_assign(Checked_Number<T, Policy>& x).
+	  No longer used macros DEF_ASSIGN_FUN2_1 and DEF_ASSIGN_FUN3_2
+	  removed as well.
+
+2006-01-06 Friday 21:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/lpproblem1.cc (simplex.2): Put under CVS
+	  control.
+
+2006-01-06 Friday 21:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* ChangeLog, Makefile.am, NEWS, README, README.configure,
+	  STANDARDS, TODO, config.guess, config.sub, configure.ac,
+	  install-sh, instchk.hh, ltmain.sh, Watchdog/ChangeLog,
+	  Watchdog/Makefile.am, Watchdog/README, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/configure.ac, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/src/Doubly_Linked_Object.defs.hh,
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/src/Doubly_Linked_Object.types.hh,
+	  Watchdog/src/EList.defs.hh, Watchdog/src/EList.inlines.hh,
+	  Watchdog/src/EList.types.hh, Watchdog/src/EList_Iterator.defs.hh,
+	  Watchdog/src/EList_Iterator.inlines.hh,
+	  Watchdog/src/EList_Iterator.types.hh,
+	  Watchdog/src/Handler.defs.hh, Watchdog/src/Handler.inlines.hh,
+	  Watchdog/src/Handler.types.hh, Watchdog/src/Makefile.am,
+	  Watchdog/src/Pending_Element.cc,
+	  Watchdog/src/Pending_Element.defs.hh,
+	  Watchdog/src/Pending_Element.inlines.hh,
+	  Watchdog/src/Pending_Element.types.hh,
+	  Watchdog/src/Pending_List.cc, Watchdog/src/Pending_List.defs.hh,
+	  Watchdog/src/Pending_List.inlines.hh,
+	  Watchdog/src/Pending_List.types.hh, Watchdog/src/Time.cc,
+	  Watchdog/src/Time.defs.hh, Watchdog/src/Time.inlines.hh,
+	  Watchdog/src/Time.types.hh, Watchdog/src/Watchdog.cc,
+	  Watchdog/src/Watchdog.defs.hh, Watchdog/src/Watchdog.inlines.hh,
+	  Watchdog/src/Watchdog.types.hh, Watchdog/src/pwl_header.hh,
+	  Watchdog/utils/Makefile.am, Watchdog/utils/build_header.in,
+	  demos/Makefile.am, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex, doc/ppl.sty,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  doc/user.tex, interfaces/Makefile.am, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_gmp.m4, m4/ac_check_sicstus_prolog.m4,
+	  m4/ac_check_swi_prolog.m4, m4/ac_check_xsb_prolog.m4,
+	  m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+	  m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+	  m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/Ask_Tell.types.hh,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.cc, src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh,
+	  src/BHRZ03_Certificate.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint.types.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/Constraint_System.types.hh,
+	  src/DB_Matrix.defs.hh, src/DB_Matrix.inlines.hh,
+	  src/DB_Matrix.types.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/Determinate.types.hh, src/Float.cc, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/Generator_System.types.hh,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/H79_Certificate.types.hh,
+	  src/Init.cc, src/Init.defs.hh, src/Init.types.hh,
+	  src/Interval.cc, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.types.hh, src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, src/LP_Problem.types.hh,
+	  src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Expression.types.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_Row.types.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Linear_System.types.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/NNC_Polyhedron.types.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Numeric_Format.defs.hh,
+	  src/Ph_Status.cc, src/Ph_Status.idefs.hh,
+	  src/Ph_Status.inlines.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Con_Relation.inlines.hh,
+	  src/Poly_Con_Relation.types.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.types.hh, src/Ptr_Iterator.defs.hh,
+	  src/Ptr_Iterator.inlines.hh, src/Ptr_Iterator.types.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/Row.types.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Matrix.types.hh, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Saturation_Row.types.hh, src/Scalar_Products.cc,
+	  src/Scalar_Products.defs.hh, src/Scalar_Products.inlines.hh,
+	  src/Scalar_Products.types.hh, src/Topology.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/float.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/initializer.hh,
+	  src/max_space_dimension.hh, src/minimize.cc,
+	  src/mp_numeric_limits.hh, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ehandlers.cc,
+	  tests/ehandlers.hh, tests/files.cc, tests/files.hh,
+	  tests/ppl_test.hh, tests/print.cc, tests/print.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage1.cc, tests/BD_Shape/affineimage10.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhmz05widening1.cc,
+	  tests/BD_Shape/bhmz05widening2.cc,
+	  tests/BD_Shape/bhmz05widening3.cc,
+	  tests/BD_Shape/bhmz05widening4.cc,
+	  tests/BD_Shape/bhmz05widening5.cc,
+	  tests/BD_Shape/bhmz05widening6.cc,
+	  tests/BD_Shape/bhmz05widening7.cc,
+	  tests/BD_Shape/bhmz05widening8.cc,
+	  tests/BD_Shape/bhz03widening1.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/closure1.cc, tests/BD_Shape/concatenate1.cc,
+	  tests/BD_Shape/concatenate2.cc, tests/BD_Shape/concatenate3.cc,
+	  tests/BD_Shape/concatenate4.cc, tests/BD_Shape/concatenate5.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/constraints2.cc,
+	  tests/BD_Shape/contains1.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc, tests/BD_Shape/empty1.cc,
+	  tests/BD_Shape/empty2.cc, tests/BD_Shape/empty3.cc,
+	  tests/BD_Shape/empty4.cc, tests/BD_Shape/empty5.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/generalizedaffinepreimage1.cc,
+	  tests/BD_Shape/generalizedaffinepreimage2.cc,
+	  tests/BD_Shape/geomcovers1.cc, tests/BD_Shape/h79widening1.cc,
+	  tests/BD_Shape/intersection1.cc, tests/BD_Shape/intersection2.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc,
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc,
+	  tests/BD_Shape/limitedcc76extrapolation1.cc,
+	  tests/BD_Shape/limitedcc76extrapolation2.cc,
+	  tests/BD_Shape/limitedcc76extrapolation3.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/relations1.cc, tests/BD_Shape/relations2.cc,
+	  tests/BD_Shape/relations3.cc, tests/BD_Shape/relations4.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linearsystem1.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/lpproblem2.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/max_min1.cc, tests/Polyhedron/max_min2.cc,
+	  tests/Polyhedron/maxspacedim1.cc, tests/Polyhedron/mc91.cc,
+	  tests/Polyhedron/membytes1.cc, tests/Polyhedron/membytes2.cc,
+	  tests/Polyhedron/memory1.cc, tests/Polyhedron/memory2.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc,
+	  tests/Polyhedron/numberinput1.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header.in, utils/text2cxxarray.in, utils/timings.cc,
+	  utils/timings.hh
+	  (simplex.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,2,1,1,1,1,1,1,1,1,4,4,1,1,3,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,4,1,1,1,1,1,1 [...]
+	  First merge from the main trunk.
+
+2006-01-06 Friday 19:20  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence.types.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Congruence_System.inlines.hh,
+	  Congruence_System.types.hh, Grid.defs.hh, Grid.inlines.hh,
+	  Grid.types.hh, Grid_Certificate.cc, Grid_Certificate.defs.hh,
+	  Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
+	  Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+	  Grid_Generator.types.hh, Grid_Generator_System.cc,
+	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+	  Grid_Generator_System.types.hh, Grid_Status.cc,
+	  Grid_Status.idefs.hh, Grid_Status.inlines.hh, Grid_chdims.cc,
+	  Grid_conversion.cc, Grid_minimize.cc, Grid_nonpublic.cc,
+	  Grid_public.cc, Grid_simplify.cc, Grid_widenings.cc
+	  (grids.[19,35,20,2,39,25,13,2,93,52,2,9,3,2,2,21,16,2,26,19,11,2,5,6,4,30,33,25,67,130,44,11]):
+	  Update copyright year.
+
+2006-01-06 Friday 18:44  Matthew Mundell
+
+	* src/Matrix.defs.hh (grids.7): Take out old grid includes and
+	  declaration.
+
+2006-01-06 Friday 18:13  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence_System.defs.hh,
+	  Grid.defs.hh, Grid_Certificate.defs.hh, Grid_Generator.defs.hh,
+	  Grid_Generator_System.defs.hh, Grid_Status.idefs.hh
+	  (grids.[34,24,92,2,20,18,5]): Update the format of brief comments
+	  to the new standard.
+
+2006-01-06 Friday 08:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.21): Added a comment
+	  explaining the large number tests.  Revised the catch code for
+	  the ppl_overflow_error exception.  Reordered tests so that when
+	  there is an expected overflow exception, more tests are done
+	  before that.
+
+	  Other minor changes.
+
+2006-01-05 Thursday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/expected_pchk_int64_a (1.5): Restore
+	  expected output.
+
+2006-01-05 Thursday 19:45  Matthew Mundell
+
+	* src/Grid_public.cc (grids.129): Leave the modulus handling as it
+	  is in the inverse relation case of
+	  generalized_affine_preimage(var..).
+
+2006-01-05 Thursday 18:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int16 (1.6),
+	  expected_pchk_int16_a (1.6), expected_pchk_int32 (1.6),
+	  expected_pchk_int32_a (1.6), expected_pchk_int64 (1.3),
+	  expected_pchk_int64_a (1.4), expected_pchk_int8 (1.6),
+	  expected_pchk_int8_a (1.6), pl_check.pl (1.20): Revised expected
+	  files and avoid error message when there is an overflow exception
+	  for the large numbers in the C++.
+
+2006-01-05 Thursday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int64 (altnum.1): file
+	  expected_pchk_int64 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-05 Thursday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.106): Fixed
+	  integer_term_to_Coefficient().
+
+2006-01-05 Thursday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.105): Prolog_is_integer()
+	  updated to support the newest versions of YAP.
+
+2006-01-05 Thursday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int16 (1.5),
+	  expected_pchk_int16_a (1.5), expected_pchk_int32 (1.5),
+	  expected_pchk_int32_a (1.5), expected_pchk_int64 (1.2),
+	  expected_pchk_int64_a (1.3): Revised expected results for
+	  pl_check to allow for tests for large numbers.
+
+2006-01-05 Thursday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/: expected_pchk_int8 (1.5),
+	  expected_pchk_int8_a (1.5): Updated expected results for the
+	  large number tests.
+
+2006-01-05 Thursday 11:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.17),
+	  GNU/gnu_pl_check.pl (1.8), SICStus/sp_pl_check.pl (1.6),
+	  SWI/swi_pl_check.pl (1.7), XSB/xsb_pl_check.P (1.22),
+	  YAP/yap_pl_check.pl (1.10), tests/pl_check.pl (1.19): Added to
+	  the system dependent files prolog_system(...).
+
+	  Added tests to pl_check.pl for testing large numbers.  When
+	  prolog_system(xsb) holds, these tests are omitted.
+
+	  Bugs in maximize and minimize test code fixed.  typo in exception
+	  message fixed.
+
+2006-01-05 Thursday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.143), YAP/ppl_yap.cc
+	  (1.104): Use (and require) the new YAP interface for arbitrary
+	  precision integers.
+
+2006-01-05 Thursday 00:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.cc (simplex.16): Added a few calls to ascii_dump()
+	  in the OK method to help in debugging.  Corrected a bug in
+	  incremental() whereby an illegal dim_map was built.  Corrected
+	  another bug whereby last_generator was not updated.
+
+2006-01-04 Wednesday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.103): Use a single temporary
+	  mpz_class object.  Added a missing test to
+	  Coefficient_to_integer_term().  Use direct assignment instead of
+	  assign_r() in integer_term_to_Coefficient().
+
+2006-01-04 Wednesday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.113): Removed an
+	  inclusion and a using declaration probably left there after a
+	  debugging session.  Use a single temporary mpz_class object.
+
+2006-01-04 Wednesday 17:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Limits.hh (1.9): Fixed indentation of a line.
+
+2006-01-04 Wednesday 14:43  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[15,14,15]): Restored last changes made by Enea, were
+	  removed by mistake.  Added a FIXME about incrementality and the
+	  default constructor.
+
+2006-01-04 Wednesday 12:57  Andrea Cimino
+
+	* src/: Constraint.defs.hh, LP_Problem.cc, LP_Problem.defs.hh,
+	  LP_Problem.inlines.hh (simplex.[1,14,13,14]): Added experimental
+	  code for incrementality.  Backported some changes from the main
+	  trunk.  Added a modified version of `ascii_dump' for testing
+	  purposes.  LP_Problem made friend of Constraint to allow
+	  compiling.
+
+2006-01-03 Tuesday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc (1.9): Print objects of type Coefficient
+	  as such, not as objects of some other type.
+
+2006-01-03 Tuesday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.defs.hh (1.49): Added a draft input syntax to
+	  the input function for checked numbers: template <typename T,
+	  typename Policy> Result input(std::istream& is, Checked_Number<T,
+	  Policy>& x, Rounding_Dir dir).
+
+2006-01-03 Tuesday 20:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.24), Linear_Expression.defs.hh
+	  (1.18): Comments improved.
+
+2006-01-03 Tuesday 18:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.112): Return directly
+	  the temporary Coefficeint object.
+
+2006-01-03 Tuesday 18:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.142): Corrected a typo.
+
+2006-01-03 Tuesday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.111): Tentative
+	  correction of a bug in the conversion from SWI Prolog unbounded
+	  coefficients to PPL's (checked bounded integers) Coefficient.
+
+2006-01-03 Tuesday 16:43  Matthew Mundell
+
+	* tests/Grid/intersection1.cc (grids.8): Replace the Variables in
+	  the tests with common Variables in a local namespace.
+
+2006-01-03 Tuesday 16:40  Matthew Mundell
+
+	* tests/Grid/affinepreimage1.cc (grids.10): Add two simple tests.
+
+2006-01-03 Tuesday 16:36  Matthew Mundell
+
+	* src/Grid_public.cc (grids.128): Take the empty flag query out of
+	  add_recycled_generators.
+
+2006-01-03 Tuesday 16:35  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.66): Note possible improvements to
+	  the empty cases in the construct methods.
+
+2006-01-03 Tuesday 16:34  Matthew Mundell
+
+	* src/Grid_Generator_System.inlines.hh (grids.10): Add sortedness
+	  and pending row settings to method `clear'.
+
+2006-01-03 Tuesday 16:32  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (grids.19): Move the
+	  writable-reference-returning divisor method to the private
+	  section.  Improve the comment on the need for the Grid class
+	  friend declaration.
+
+2006-01-03 Tuesday 16:29  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.51): Update map_space_dimensions to
+	  create the point with the correct divisor when inserting a point,
+	  instead of inserting the point and then adjusting the divisor.
+
+2006-01-03 Tuesday 16:27  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (grids.23): Add a note to consider
+	  adding a recycling_insert method.
+
+2006-01-03 Tuesday 16:26  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.33): Move the
+	  writable-reference-returning modulus method to the private
+	  section.  Improve two comments a little.
+
+2006-01-03 Tuesday 16:25  Matthew Mundell
+
+	* src/Congruence.cc (grids.18): Update strong_normalize to use
+	  Row::normalize.
+
+2006-01-03 Tuesday 15:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.141): Added
+	  documentation for the LP Problem predicates.
+
+2006-01-02 Monday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.167): Removed a couple of items that have been dealt
+	  with.
+
+2006-01-02 Monday 14:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.4), expected_int16_a (1.4),
+	  expected_int32 (1.5), expected_int32_a (1.5), expected_int64
+	  (1.5), expected_int64_a (1.5), expected_int8 (1.4),
+	  expected_int8_a (1.3), expected_mpz (1.6), expected_mpz_a (1.6):
+	  Updated to take into account the addition of tests for the
+	  simplex method and the removal of option -v.
+
+2006-01-02 Monday 14:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.18): Do explicitly use option -e
+	  when requiring the enumeration method.
+
+2006-01-02 Monday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.27): Let the option -e be working
+	  as expected.
+
+2006-01-02 Monday 11:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.14): Function parse_number1() renamed
+	  parse_number_part().
+
+2006-01-02 Monday 11:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions2.cc (1.8): Added tests for
+	  excericising the exceptions generated by LP_Problem.
+
+2006-01-02 Monday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.13): Comments for parse_number() and
+	  parse_number1() revised.
+
+2006-01-02 Monday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.135): Added globals.types.hh to the
+	  documentation files.
+
+2006-01-02 Monday 11:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.6), LP_Problem.defs.hh (1.5): Added and
+	  implemented exception specification for
+	  evaluate_objective_function().
+
+2006-01-02 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.12): Functions get_digit() and sum_sign()
+	  properly commented.
+
+2006-01-02 Monday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.21): Got rid of (non-working
+	  and too expensive) tests for large exponents.
+
+2006-01-02 Monday 09:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (simplex.1): file
+	  generalizedaffinepreimage1.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-02 Monday 09:36  Matthew Mundell
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (grids.1): file
+	  generalizedaffinepreimage1.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-02 Monday 09:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.6): If (and only
+	  if) the Coefficient type is not wide enough, test10() does
+	  nothing.
+
+2006-01-02 Monday 00:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc (1.5), LP_Problem.inlines.hh (1.5): Drafted
+	  implementations for total_ and external_memory_in_bytes() and for
+	  ascii_dump().
+
+2006-01-01 Sunday 23:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.18): Many improvements to
+	  LP_Problem tests.
+
+2006-01-01 Sunday 22:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/src/EList.defs.hh (1.3),
+	  Watchdog/src/Pending_List.defs.hh (1.3),
+	  Watchdog/src/Time.defs.hh (1.3), src/version.hh.in (1.13): Do
+	  adopt the new format for multiline brief doxygen documentation.
+
+2006-01-01 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.defs.hh (altnum.1): file
+	  Pending_List.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.defs.hh (altnum.1): file Time.defs.hh was added
+	  on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 22:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.5): Temporarily
+	  disabled test10().
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int32_a (altnum.1): file
+	  expected_clpq2_int32_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int8 (altnum.1): file
+	  expected_clpq2_int8 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int8_a (altnum.1): file
+	  expected_clpq2_int8_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int16 (altnum.1): file
+	  expected_clpq_int16 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int16_a (altnum.1): file
+	  expected_clpq_int16_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.4),
+	  XSB/expected_clpq2_int8 (1.3), XSB/expected_clpq2_int8_a (1.4),
+	  XSB/expected_clpq_int16 (1.4), XSB/expected_clpq_int16_a (1.4),
+	  XSB/expected_pchk_int16 (1.3), XSB/expected_pchk_int16_a (1.3),
+	  XSB/expected_pchk_int32 (1.3), XSB/expected_pchk_int32_a (1.3),
+	  XSB/expected_pchk_int8 (1.2), XSB/expected_pchk_int8_a (1.3),
+	  tests/expected_clpq2_int32_a (1.4), tests/expected_clpq2_int8
+	  (1.4), tests/expected_clpq2_int8_a (1.4),
+	  tests/expected_clpq_int16 (1.4), tests/expected_clpq_int16_a
+	  (1.4), tests/expected_pchk_int16 (1.4),
+	  tests/expected_pchk_int16_a (1.4), tests/expected_pchk_int32
+	  (1.4), tests/expected_pchk_int32_a (1.4),
+	  tests/expected_pchk_int8 (1.4), tests/expected_pchk_int8_a (1.4):
+	  Adapted to recent changes in the implementation of checked
+	  numbers.
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32_a (altnum.1): file
+	  expected_clpq2_int32_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8 (altnum.1): file
+	  expected_clpq2_int8 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8_a (altnum.1): file
+	  expected_clpq2_int8_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16 (altnum.1): file
+	  expected_clpq_int16 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16_a (altnum.1): file
+	  expected_clpq_int16_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 19:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.166), src/Ask_Tell.defs.hh (1.8), src/BDS_Status.idefs.hh
+	  (1.12), src/BHRZ03_Certificate.defs.hh (1.14),
+	  src/Bounding_Box.defs.hh (1.12), src/C_Polyhedron.defs.hh (1.39),
+	  src/Checked_Number.defs.hh (1.48), src/Constraint.defs.hh
+	  (1.113), src/Constraint_System.defs.hh (1.23),
+	  src/DB_Matrix.defs.hh (1.15), src/DB_Matrix.inlines.hh (1.22),
+	  src/DB_Row.defs.hh (1.15), src/Determinate.defs.hh (1.60),
+	  src/GMP_Integer.defs.hh (1.17), src/GMP_Integer.inlines.hh
+	  (1.12), src/Generator.defs.hh (1.113),
+	  src/Generator_System.defs.hh (1.12), src/Interval.defs.hh (1.26),
+	  src/LP_Problem.defs.hh (1.4), src/Linear_Expression.defs.hh
+	  (1.17), src/Linear_Row.defs.hh (1.14), src/Linear_System.defs.hh
+	  (1.20), src/Matrix.defs.hh (1.71), src/NNC_Polyhedron.defs.hh
+	  (1.41), src/Ph_Status.idefs.hh (1.12),
+	  src/Poly_Con_Relation.defs.hh (1.29),
+	  src/Poly_Gen_Relation.defs.hh (1.27),
+	  src/Polyhedra_Powerset.defs.hh (1.28), src/Polyhedron.defs.hh
+	  (1.289), src/Powerset.defs.hh (1.15), src/Ptr_Iterator.defs.hh
+	  (1.6), src/Rounding_Dir.defs.hh (1.7), src/Row.defs.hh (1.100),
+	  src/Saturation_Matrix.defs.hh (1.5), src/Saturation_Row.defs.hh
+	  (1.9), src/Scalar_Products.defs.hh (1.3), src/Variable.defs.hh
+	  (1.49), src/algorithms.hh (1.45), src/checked.defs.hh (1.31),
+	  src/globals.defs.hh (1.27): Applying the new policy for multiline
+	  brief Doxygen comments.
+
+2006-01-01 Sunday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.57), BD_Shape.inlines.hh (1.117): A few
+	  improvements in the code ofr affine images and preimages. Removed
+	  a (never used) default-valued parameter form an helper function.
+
+2006-01-01 Sunday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.29): Established a new policy for the writing of
+	  multiline *brief* comment in doxygen: besides easing a bit their
+	  writing, this is also useful as a workaround for a long-standing
+	  doxygen bug.
+
+2006-01-01 Sunday 18:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog.pl (1.56), tests/pl_check.pl
+	  (1.17): Code wrongly removed in pl_check.pl replaced.
+
+	  GNU Prolog system code for LP_Problem added.
+
+2006-01-01 Sunday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.42): The tests lpproblem1 and
+	  lpproblem2 also fail with 64-bits coefficients.
+
+2006-01-01 Sunday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.41): With 32-bits coefficients,
+	  the tests lpproblem1 and lpproblem2 are known to fail because of
+	  overflows.
+
+2006-01-01 Sunday 17:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/lpproblem1.cc (simplex.1): file lpproblem1.cc
+	  was added on branch simplex on 2006-01-06 20:01:53 +0000
+
+2006-01-01 Sunday 17:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/lpproblem2.cc (simplex.1): file lpproblem2.cc
+	  was added on branch simplex on 2006-01-06 20:00:58 +0000
+
+2006-01-01 Sunday 17:25  Matthew Mundell
+
+	* tests/Polyhedron/lpproblem2.cc (grids.1): file lpproblem2.cc was
+	  added on branch grids on 2006-01-16 01:10:41 +0000
+
+2006-01-01 Sunday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: lpproblem1.cc (1.3), lpproblem2.cc (1.3):
+	  Added missing try/catch blocks.
+
+2006-01-01 Sunday 14:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Ciao/ciao_pl_check.pl (1.16),
+	  Ciao/ppl_ciao.pl (1.84), SICStus/ppl_sicstus_sd.cc (1.85),
+	  XSB/ppl_xsb.H (1.44), XSB/ppl_xsb.cc (1.76), XSB/xsb_pl_check.P
+	  (1.21), YAP/ppl_yap.cc (1.102), tests/pl_check.pl (1.16): Added
+	  needed code for the LP_Problem predicates to the Prolog systems'
+	  code.
+
+	  Added tests to exercise all the LP_Problem predicates.
+
+2006-01-01 Sunday 10:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.15): Corrected and
+	  improved maximize, maximize_with_point, minimize and
+	  minimize_with_point tests.
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/build_header.in (altnum.1): file build_header.in was added
+	  on branch altnum on 2006-10-29 19:27:45 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray.in (altnum.1): file text2cxxarray.in was
+	  added on branch altnum on 2006-10-29 19:27:45 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/Polyhedron/LP_Problem3.cc (grids.1): file LP_Problem3.cc
+	  was added on branch grids on 2006-01-16 01:10:40 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (altnum.1): file memory2.cc was added
+	  on branch altnum on 2006-10-29 19:27:32 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (simplex.1): file
+	  limitedbhmz05extrapolation1.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation2.cc (simplex.1): file
+	  limitedbhmz05extrapolation2.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation3.cc (simplex.1): file
+	  limitedbhmz05extrapolation3.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation4.cc (simplex.1): file
+	  limitedbhmz05extrapolation4.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation5.cc (simplex.1): file
+	  limitedbhmz05extrapolation5.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation6.cc (simplex.1): file
+	  limitedbhmz05extrapolation6.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation7.cc (simplex.1): file
+	  limitedbhmz05extrapolation7.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation8.cc (simplex.1): file
+	  limitedbhmz05extrapolation8.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedbhmz05extrapolation9.cc (simplex.1): file
+	  limitedbhmz05extrapolation9.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (simplex.1): file
+	  limitedcc76extrapolation1.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation2.cc (simplex.1): file
+	  limitedcc76extrapolation2.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedcc76extrapolation3.cc (simplex.1): file
+	  limitedcc76extrapolation3.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation1.cc (grids.1): file
+	  limitedbhmz05extrapolation1.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation2.cc (grids.1): file
+	  limitedbhmz05extrapolation2.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation3.cc (grids.1): file
+	  limitedbhmz05extrapolation3.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation4.cc (grids.1): file
+	  limitedbhmz05extrapolation4.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation5.cc (grids.1): file
+	  limitedbhmz05extrapolation5.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation6.cc (grids.1): file
+	  limitedbhmz05extrapolation6.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation7.cc (grids.1): file
+	  limitedbhmz05extrapolation7.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation8.cc (grids.1): file
+	  limitedbhmz05extrapolation8.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedbhmz05extrapolation9.cc (grids.1): file
+	  limitedbhmz05extrapolation9.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedcc76extrapolation1.cc (grids.1): file
+	  limitedcc76extrapolation1.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedcc76extrapolation2.cc (grids.1): file
+	  limitedcc76extrapolation2.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/limitedcc76extrapolation3.cc (grids.1): file
+	  limitedcc76extrapolation3.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening1.cc (simplex.1): file
+	  bhmz05widening1.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening2.cc (simplex.1): file
+	  bhmz05widening2.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening3.cc (simplex.1): file
+	  bhmz05widening3.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening4.cc (simplex.1): file
+	  bhmz05widening4.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening5.cc (simplex.1): file
+	  bhmz05widening5.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening6.cc (simplex.1): file
+	  bhmz05widening6.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening7.cc (simplex.1): file
+	  bhmz05widening7.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bhmz05widening8.cc (simplex.1): file
+	  bhmz05widening8.cc was added on branch simplex on 2006-01-06
+	  20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (simplex.1): file
+	  generalizedaffinepreimage2.cc was added on branch simplex on
+	  2006-01-06 20:00:55 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening1.cc (grids.1): file
+	  bhmz05widening1.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening2.cc (grids.1): file
+	  bhmz05widening2.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening3.cc (grids.1): file
+	  bhmz05widening3.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening4.cc (grids.1): file
+	  bhmz05widening4.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening5.cc (grids.1): file
+	  bhmz05widening5.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening6.cc (grids.1): file
+	  bhmz05widening6.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening7.cc (grids.1): file
+	  bhmz05widening7.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/bhmz05widening8.cc (grids.1): file
+	  bhmz05widening8.cc was added on branch grids on 2006-01-16
+	  01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* tests/BD_Shape/generalizedaffinepreimage2.cc (grids.1): file
+	  generalizedaffinepreimage2.cc was added on branch grids on
+	  2006-01-16 01:10:39 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Random_Number_Generator.types.hh (altnum.1): file
+	  Random_Number_Generator.types.hh was added on branch altnum on
+	  2006-10-29 19:27:21 +0000
+
+2006-01-01 Sunday 09:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.cc (simplex.1): file BD_Shape.cc was added on branch
+	  simplex on 2006-01-06 20:00:51 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* src/BD_Shape.cc (grids.1): file BD_Shape.cc was added on branch
+	  grids on 2006-01-16 01:10:33 +0000
+
+2006-01-01 Sunday 09:27  Matthew Mundell
+
+	* src/LP_Problem.types.hh (grids.1): file LP_Problem.types.hh was
+	  added on branch grids on 2006-01-16 01:10:33 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (altnum.1): file ppl_header.hh was added on
+	  branch altnum on 2006-10-29 19:27:15 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (altnum.1): file
+	  ac_check_sicstus_prolog.m4 was added on branch altnum on
+	  2006-10-29 19:27:11 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_xsb_prolog.m4 (altnum.1): file ac_check_xsb_prolog.m4
+	  was added on branch altnum on 2006-10-29 19:27:11 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16 (altnum.1): file
+	  expected_clpq2_int16 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int16 (altnum.1): file
+	  expected_clpq2_int16 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16_a (altnum.1): file
+	  expected_clpq2_int16_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int16_a (altnum.1): file
+	  expected_clpq2_int16_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32 (altnum.1): file
+	  expected_clpq2_int32 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int32 (altnum.1): file
+	  expected_clpq2_int32 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64 (altnum.1): file
+	  expected_clpq2_int64 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int64 (altnum.1): file
+	  expected_clpq2_int64 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64_a (altnum.1): file
+	  expected_clpq2_int64_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_int64_a (altnum.1): file
+	  expected_clpq2_int64_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz (altnum.1): file
+	  expected_clpq2_mpz was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_mpz (altnum.1): file
+	  expected_clpq2_mpz was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz_a (altnum.1): file
+	  expected_clpq2_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq2_mpz_a (altnum.1): file
+	  expected_clpq2_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32 (altnum.1): file
+	  expected_clpq_int32 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int32 (altnum.1): file
+	  expected_clpq_int32 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32_a (altnum.1): file
+	  expected_clpq_int32_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int32_a (altnum.1): file
+	  expected_clpq_int32_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64 (altnum.1): file
+	  expected_clpq_int64 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int64 (altnum.1): file
+	  expected_clpq_int64 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64_a (altnum.1): file
+	  expected_clpq_int64_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int64_a (altnum.1): file
+	  expected_clpq_int64_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8 (altnum.1): file
+	  expected_clpq_int8 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int8 (altnum.1): file
+	  expected_clpq_int8 was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8_a (altnum.1): file
+	  expected_clpq_int8_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_int8_a (altnum.1): file
+	  expected_clpq_int8_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz (altnum.1): file
+	  expected_clpq_mpz was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_mpz (altnum.1): file
+	  expected_clpq_mpz was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz_a (altnum.1): file
+	  expected_clpq_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_clpq_mpz_a (altnum.1): file
+	  expected_clpq_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:07 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/build_header.in (altnum.1): file build_header.in
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Doubly_Linked_Object.defs.hh (altnum.1): file
+	  Doubly_Linked_Object.defs.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Doubly_Linked_Object.inlines.hh (altnum.1): file
+	  Doubly_Linked_Object.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Doubly_Linked_Object.types.hh (altnum.1): file
+	  Doubly_Linked_Object.types.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList.inlines.hh (altnum.1): file EList.inlines.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList.types.hh (altnum.1): file EList.types.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList_Iterator.defs.hh (altnum.1): file
+	  EList_Iterator.defs.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList_Iterator.inlines.hh (altnum.1): file
+	  EList_Iterator.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/EList_Iterator.types.hh (altnum.1): file
+	  EList_Iterator.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Handler.inlines.hh (altnum.1): file
+	  Handler.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Handler.types.hh (altnum.1): file Handler.types.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.cc (altnum.1): file
+	  Pending_Element.cc was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.inlines.hh (altnum.1): file
+	  Pending_Element.inlines.hh was added on branch altnum on
+	  2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_Element.types.hh (altnum.1): file
+	  Pending_Element.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.cc (altnum.1): file Pending_List.cc was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.inlines.hh (altnum.1): file
+	  Pending_List.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Pending_List.types.hh (altnum.1): file
+	  Pending_List.types.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.cc (altnum.1): file Time.cc was added on branch
+	  altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.inlines.hh (altnum.1): file Time.inlines.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Time.types.hh (altnum.1): file Time.types.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.inlines.hh (altnum.1): file
+	  Watchdog.inlines.hh was added on branch altnum on 2006-10-29
+	  19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Watchdog.types.hh (altnum.1): file Watchdog.types.hh
+	  was added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/pwl_header.hh (altnum.1): file pwl_header.hh was
+	  added on branch altnum on 2006-10-29 19:26:51 +0000
+
+2006-01-01 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.35), README (1.38), README.configure (1.16),
+	  configure.ac (1.200), instchk.hh (1.3), Watchdog/Makefile.am
+	  (1.24), Watchdog/README (1.12), Watchdog/configure.ac (1.33),
+	  Watchdog/src/Doubly_Linked_Object.defs.hh (1.2),
+	  Watchdog/src/Doubly_Linked_Object.inlines.hh (1.2),
+	  Watchdog/src/Doubly_Linked_Object.types.hh (1.2),
+	  Watchdog/src/EList.defs.hh (1.2), Watchdog/src/EList.inlines.hh
+	  (1.2), Watchdog/src/EList.types.hh (1.2),
+	  Watchdog/src/EList_Iterator.defs.hh (1.2),
+	  Watchdog/src/EList_Iterator.inlines.hh (1.2),
+	  Watchdog/src/EList_Iterator.types.hh (1.2),
+	  Watchdog/src/Handler.defs.hh (1.2),
+	  Watchdog/src/Handler.inlines.hh (1.2),
+	  Watchdog/src/Handler.types.hh (1.2), Watchdog/src/Makefile.am
+	  (1.4), Watchdog/src/Pending_Element.cc (1.2),
+	  Watchdog/src/Pending_Element.defs.hh (1.2),
+	  Watchdog/src/Pending_Element.inlines.hh (1.2),
+	  Watchdog/src/Pending_Element.types.hh (1.2),
+	  Watchdog/src/Pending_List.cc (1.2),
+	  Watchdog/src/Pending_List.defs.hh (1.2),
+	  Watchdog/src/Pending_List.inlines.hh (1.2),
+	  Watchdog/src/Pending_List.types.hh (1.2), Watchdog/src/Time.cc
+	  (1.2), Watchdog/src/Time.defs.hh (1.2),
+	  Watchdog/src/Time.inlines.hh (1.2), Watchdog/src/Time.types.hh
+	  (1.2), Watchdog/src/Watchdog.cc (1.2),
+	  Watchdog/src/Watchdog.defs.hh (1.2),
+	  Watchdog/src/Watchdog.inlines.hh (1.2),
+	  Watchdog/src/Watchdog.types.hh (1.2), Watchdog/src/pwl_header.hh
+	  (1.2), Watchdog/utils/Makefile.am (1.5),
+	  Watchdog/utils/build_header.in (1.3), demos/Makefile.am (1.8),
+	  demos/ppl_lcdd/Makefile.am (1.21), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.52), demos/ppl_lcdd/examples/Makefile.am (1.6),
+	  demos/ppl_lpsol/Makefile.am (1.17), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.26), demos/ppl_lpsol/examples/Makefile.am (1.5),
+	  doc/Makefile.am (1.38), doc/README.doc (1.7), doc/definitions.dox
+	  (1.182), doc/devref.tex (1.19), doc/ppl.sty (1.24), doc/user.tex
+	  (1.20), interfaces/Makefile.am (1.12), interfaces/C/Makefile.am
+	  (1.20), interfaces/C/ppl_c.cc (1.147), interfaces/C/ppl_c.h.in
+	  (1.60), interfaces/OCaml/Makefile.am (1.11),
+	  interfaces/Prolog/Makefile.am (1.29),
+	  interfaces/Prolog/Prolog_interface.dox (1.140),
+	  interfaces/Prolog/exceptions.hh (1.19),
+	  interfaces/Prolog/ppl_prolog.icc (1.168),
+	  interfaces/Prolog/track_allocation.hh (1.18),
+	  interfaces/Prolog/Ciao/Makefile.am (1.47),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.16),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.12),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.15),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.39),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.83),
+	  interfaces/Prolog/GNU/Makefile.am (1.50),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.7),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.10),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.55),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.34),
+	  interfaces/Prolog/SICStus/Makefile.am (1.58),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.26),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.84),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.6),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.7),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.13),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.13),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.5),
+	  interfaces/Prolog/SWI/Makefile.am (1.55),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.10),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.9),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.10),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.110),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.6),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.6),
+	  interfaces/Prolog/XSB/Makefile.am (1.39),
+	  interfaces/Prolog/XSB/expected_clpq2_int16 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int32 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_int64 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int8 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz (1.2),
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int16 (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int16_a (1.3),
+	  interfaces/Prolog/XSB/expected_clpq_int32 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int32_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int64 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int8 (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_int8_a (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_mpz (1.2),
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.43),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.75),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.15),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.13),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.20),
+	  interfaces/Prolog/YAP/Makefile.am (1.41),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.101),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.10),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.11),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.7),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.9),
+	  interfaces/Prolog/tests/Makefile.am (1.6),
+	  interfaces/Prolog/tests/clpq.pl (1.7),
+	  interfaces/Prolog/tests/clpq2.pl (1.7),
+	  interfaces/Prolog/tests/expected_clpq2_int16 (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int16_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int32 (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int32_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int64 (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int64_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_int8 (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_int8_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq2_mpz (1.2),
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int16 (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int16_a (1.3),
+	  interfaces/Prolog/tests/expected_clpq_int32 (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int32_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int64 (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int64_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int8 (1.2),
+	  interfaces/Prolog/tests/expected_clpq_int8_a (1.2),
+	  interfaces/Prolog/tests/expected_clpq_mpz (1.2),
+	  interfaces/Prolog/tests/expected_clpq_mpz_a (1.2),
+	  interfaces/Prolog/tests/pl_check.pl (1.14), m4/Makefile.am
+	  (1.15), m4/ac_check_gmp.m4 (1.23), m4/ac_check_sicstus_prolog.m4
+	  (1.4), m4/ac_check_swi_prolog.m4 (1.8), m4/ac_check_xsb_prolog.m4
+	  (1.2), m4/ac_cxx_attribute_weak.m4 (1.7),
+	  m4/ac_cxx_double_is_iec_559.m4 (1.5),
+	  m4/ac_cxx_flexible_arrays.m4 (1.12),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.5), m4/ac_cxx_long_double.m4
+	  (1.6), m4/ac_cxx_long_double_is_iec_559.m4 (1.5),
+	  m4/ac_cxx_long_long.m4 (1.5), m4/ppl.m4 (1.2),
+	  src/Ask_Tell.defs.hh (1.7), src/Ask_Tell.inlines.hh (1.7),
+	  src/Ask_Tell.types.hh (1.4), src/BDS_Status.idefs.hh (1.11),
+	  src/BDS_Status.inlines.hh (1.9), src/BD_Shape.cc (1.2),
+	  src/BD_Shape.defs.hh (1.56), src/BD_Shape.inlines.hh (1.116),
+	  src/BD_Shape.types.hh (1.5), src/BHRZ03_Certificate.cc (1.10),
+	  src/BHRZ03_Certificate.defs.hh (1.13),
+	  src/BHRZ03_Certificate.inlines.hh (1.7),
+	  src/BHRZ03_Certificate.types.hh (1.4), src/Bounding_Box.cc
+	  (1.13), src/Bounding_Box.defs.hh (1.11),
+	  src/Bounding_Box.inlines.hh (1.14), src/Bounding_Box.types.hh
+	  (1.4), src/C_Polyhedron.cc (1.17), src/C_Polyhedron.defs.hh
+	  (1.38), src/C_Polyhedron.inlines.hh (1.29),
+	  src/C_Polyhedron.types.hh (1.10), src/Checked_Number.cc (1.9),
+	  src/Checked_Number.defs.hh (1.47), src/Checked_Number.inlines.hh
+	  (1.51), src/Checked_Number.types.hh (1.9), src/Coefficient.cc
+	  (1.4), src/Coefficient.defs.hh (1.6), src/Coefficient.inlines.hh
+	  (1.5), src/Coefficient.types.hh (1.11),
+	  src/Coefficient_traits_template.hh (1.4), src/Constraint.cc
+	  (1.54), src/Constraint.defs.hh (1.112), src/Constraint.inlines.hh
+	  (1.61), src/Constraint.types.hh (1.10), src/Constraint_System.cc
+	  (1.15), src/Constraint_System.defs.hh (1.22),
+	  src/Constraint_System.inlines.hh (1.7),
+	  src/Constraint_System.types.hh (1.4), src/DB_Matrix.defs.hh
+	  (1.14), src/DB_Matrix.inlines.hh (1.21), src/DB_Matrix.types.hh
+	  (1.5), src/DB_Row.defs.hh (1.14), src/DB_Row.inlines.hh (1.16),
+	  src/DB_Row.types.hh (1.6), src/Determinate.defs.hh (1.59),
+	  src/Determinate.inlines.hh (1.51), src/Determinate.types.hh
+	  (1.8), src/Float.cc (1.3), src/Float.defs.hh (1.16),
+	  src/Float.inlines.hh (1.16), src/GMP_Integer.defs.hh (1.16),
+	  src/GMP_Integer.inlines.hh (1.11), src/GMP_Integer.types.hh
+	  (1.11), src/Generator.cc (1.67), src/Generator.defs.hh (1.112),
+	  src/Generator.inlines.hh (1.58), src/Generator.types.hh (1.10),
+	  src/Generator_System.cc (1.15), src/Generator_System.defs.hh
+	  (1.11), src/Generator_System.inlines.hh (1.6),
+	  src/Generator_System.types.hh (1.4), src/H79_Certificate.cc
+	  (1.9), src/H79_Certificate.defs.hh (1.13),
+	  src/H79_Certificate.inlines.hh (1.7),
+	  src/H79_Certificate.types.hh (1.4), src/Init.cc (1.22),
+	  src/Init.defs.hh (1.14), src/Init.types.hh (1.9), src/Interval.cc
+	  (1.13), src/Interval.defs.hh (1.25), src/Interval.inlines.hh
+	  (1.24), src/Interval.types.hh (1.11), src/LP_Problem.cc (1.4),
+	  src/LP_Problem.defs.hh (1.3), src/LP_Problem.inlines.hh (1.4),
+	  src/LP_Problem.types.hh (1.4), src/Limits.hh (1.8),
+	  src/Linear_Expression.cc (1.8), src/Linear_Expression.defs.hh
+	  (1.16), src/Linear_Expression.inlines.hh (1.6),
+	  src/Linear_Expression.types.hh (1.4), src/Linear_Row.cc (1.16),
+	  src/Linear_Row.defs.hh (1.13), src/Linear_Row.inlines.hh (1.10),
+	  src/Linear_Row.types.hh (1.4), src/Linear_System.cc (1.33),
+	  src/Linear_System.defs.hh (1.19), src/Linear_System.inlines.hh
+	  (1.18), src/Linear_System.types.hh (1.4), src/Makefile.am
+	  (1.134), src/Matrix.cc (1.89), src/Matrix.defs.hh (1.70),
+	  src/Matrix.inlines.hh (1.47), src/Matrix.types.hh (1.10),
+	  src/NNC_Polyhedron.cc (1.17), src/NNC_Polyhedron.defs.hh (1.40),
+	  src/NNC_Polyhedron.inlines.hh (1.31), src/NNC_Polyhedron.types.hh
+	  (1.10), src/Numeric_Format.defs.hh (1.5), src/Ph_Status.cc (1.8),
+	  src/Ph_Status.idefs.hh (1.11), src/Ph_Status.inlines.hh (1.7),
+	  src/Poly_Con_Relation.cc (1.11), src/Poly_Con_Relation.defs.hh
+	  (1.28), src/Poly_Con_Relation.inlines.hh (1.14),
+	  src/Poly_Con_Relation.types.hh (1.9), src/Poly_Gen_Relation.cc
+	  (1.11), src/Poly_Gen_Relation.defs.hh (1.26),
+	  src/Poly_Gen_Relation.inlines.hh (1.14),
+	  src/Poly_Gen_Relation.types.hh (1.9), src/Polyhedra_Powerset.cc
+	  (1.6), src/Polyhedra_Powerset.defs.hh (1.27),
+	  src/Polyhedra_Powerset.inlines.hh (1.36),
+	  src/Polyhedra_Powerset.types.hh (1.4), src/Polyhedron.defs.hh
+	  (1.288), src/Polyhedron.inlines.hh (1.130),
+	  src/Polyhedron.types.hh (1.16), src/Polyhedron_chdims.cc (1.35),
+	  src/Polyhedron_nonpublic.cc (1.63), src/Polyhedron_public.cc
+	  (1.70), src/Polyhedron_widenings.cc (1.52), src/Powerset.defs.hh
+	  (1.14), src/Powerset.inlines.hh (1.13), src/Powerset.types.hh
+	  (1.4), src/Ptr_Iterator.defs.hh (1.5),
+	  src/Ptr_Iterator.inlines.hh (1.5), src/Ptr_Iterator.types.hh
+	  (1.5), src/Result.defs.hh (1.12), src/Result.inlines.hh (1.7),
+	  src/Rounding_Dir.defs.hh (1.6), src/Rounding_Dir.inlines.hh
+	  (1.3), src/Row.cc (1.95), src/Row.defs.hh (1.99),
+	  src/Row.inlines.hh (1.62), src/Row.types.hh (1.11),
+	  src/Saturation_Matrix.cc (1.7), src/Saturation_Matrix.defs.hh
+	  (1.4), src/Saturation_Matrix.inlines.hh (1.5),
+	  src/Saturation_Matrix.types.hh (1.4), src/Saturation_Row.cc
+	  (1.9), src/Saturation_Row.defs.hh (1.8),
+	  src/Saturation_Row.inlines.hh (1.8), src/Saturation_Row.types.hh
+	  (1.4), src/Scalar_Products.cc (1.3), src/Scalar_Products.defs.hh
+	  (1.2), src/Scalar_Products.inlines.hh (1.2),
+	  src/Scalar_Products.types.hh (1.2), src/Topology.hh (1.11),
+	  src/Variable.cc (1.20), src/Variable.defs.hh (1.48),
+	  src/Variable.inlines.hh (1.23), src/Variable.types.hh (1.10),
+	  src/Widening_Function.defs.hh (1.13),
+	  src/Widening_Function.inlines.hh (1.12),
+	  src/Widening_Function.types.hh (1.5), src/algorithms.hh (1.44),
+	  src/checked.cc (1.11), src/checked.defs.hh (1.30),
+	  src/checked.inlines.hh (1.29), src/checked_ext.defs.hh (1.9),
+	  src/checked_ext.inlines.hh (1.27), src/checked_float.inlines.hh
+	  (1.55), src/checked_int.inlines.hh (1.43),
+	  src/checked_mpq.inlines.hh (1.30), src/checked_mpz.inlines.hh
+	  (1.34), src/checked_numeric_limits.hh (1.9), src/compiler.hh
+	  (1.6), src/conversion.cc (1.77), src/float.types.hh (1.13),
+	  src/fpu-c99.inlines.hh (1.8), src/fpu-ia32.inlines.hh (1.8),
+	  src/fpu-none.inlines.hh (1.3), src/fpu.defs.hh (1.6),
+	  src/globals.cc (1.24), src/globals.defs.hh (1.26),
+	  src/globals.inlines.hh (1.14), src/globals.types.hh (1.4),
+	  src/initializer.hh (1.12), src/max_space_dimension.hh (1.7),
+	  src/minimize.cc (1.43), src/mp_numeric_limits.hh (1.3),
+	  src/namespaces.hh (1.5), src/ppl-config.cc.in (1.11),
+	  src/ppl_header.hh (1.4), src/simplify.cc (1.45),
+	  src/swapping_sort.icc (1.10), src/version.cc (1.7),
+	  src/version.hh.in (1.12), tests/BBox.cc (1.11), tests/BBox.hh
+	  (1.10), tests/Makefile.am (1.247), tests/PFunction.cc (1.8),
+	  tests/PFunction.hh (1.8), tests/Random_Number_Generator.defs.hh
+	  (1.2), tests/Random_Number_Generator.inlines.hh (1.7),
+	  tests/Random_Number_Generator.types.hh (1.2), tests/ehandlers.cc
+	  (1.8), tests/ehandlers.hh (1.13), tests/files.cc (1.8),
+	  tests/files.hh (1.9), tests/ppl_test.hh (1.31), tests/print.cc
+	  (1.18), tests/print.hh (1.22), tests/BD_Shape/Makefile.am (1.31),
+	  tests/BD_Shape/addconstraints1.cc (1.6),
+	  tests/BD_Shape/addspacedims1.cc (1.7),
+	  tests/BD_Shape/addspacedims2.cc (1.7),
+	  tests/BD_Shape/addspacedims3.cc (1.8),
+	  tests/BD_Shape/addspacedims4.cc (1.8),
+	  tests/BD_Shape/addspacedims5.cc (1.9),
+	  tests/BD_Shape/addspacedims6.cc (1.9),
+	  tests/BD_Shape/addspacedims7.cc (1.7),
+	  tests/BD_Shape/affinedimension1.cc (1.3),
+	  tests/BD_Shape/affineimage1.cc (1.7),
+	  tests/BD_Shape/affineimage10.cc (1.5),
+	  tests/BD_Shape/affineimage2.cc (1.7),
+	  tests/BD_Shape/affineimage3.cc (1.7),
+	  tests/BD_Shape/affineimage4.cc (1.7),
+	  tests/BD_Shape/affineimage5.cc (1.7),
+	  tests/BD_Shape/affineimage6.cc (1.7),
+	  tests/BD_Shape/affineimage7.cc (1.7),
+	  tests/BD_Shape/affineimage8.cc (1.12),
+	  tests/BD_Shape/affineimage9.cc (1.10),
+	  tests/BD_Shape/affinepreimage1.cc (1.7),
+	  tests/BD_Shape/affinepreimage2.cc (1.7),
+	  tests/BD_Shape/affinepreimage3.cc (1.7),
+	  tests/BD_Shape/affinepreimage4.cc (1.7),
+	  tests/BD_Shape/affinepreimage5.cc (1.7),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.9),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.8),
+	  tests/BD_Shape/bdsdifference1.cc (1.3),
+	  tests/BD_Shape/bdsdifference2.cc (1.3),
+	  tests/BD_Shape/bdsdifference3.cc (1.3),
+	  tests/BD_Shape/bdsdifference4.cc (1.3),
+	  tests/BD_Shape/bdsdifference5.cc (1.3),
+	  tests/BD_Shape/bdsdifference6.cc (1.3),
+	  tests/BD_Shape/bdsdifference7.cc (1.3),
+	  tests/BD_Shape/bdshull1.cc (1.3), tests/BD_Shape/bdshull2.cc
+	  (1.3), tests/BD_Shape/bdshull3.cc (1.3),
+	  tests/BD_Shape/bdshull4.cc (1.3),
+	  tests/BD_Shape/bgp99extrapolation1.cc (1.3),
+	  tests/BD_Shape/bhmz05widening1.cc (1.2),
+	  tests/BD_Shape/bhmz05widening2.cc (1.2),
+	  tests/BD_Shape/bhmz05widening3.cc (1.2),
+	  tests/BD_Shape/bhmz05widening4.cc (1.2),
+	  tests/BD_Shape/bhmz05widening5.cc (1.2),
+	  tests/BD_Shape/bhmz05widening6.cc (1.2),
+	  tests/BD_Shape/bhmz05widening7.cc (1.2),
+	  tests/BD_Shape/bhmz05widening8.cc (1.2),
+	  tests/BD_Shape/bhz03widening1.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.7),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.8),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.6),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.8),
+	  tests/BD_Shape/cc76narrowing1.cc (1.6),
+	  tests/BD_Shape/cc76narrowing2.cc (1.6),
+	  tests/BD_Shape/cc76narrowing3.cc (1.6),
+	  tests/BD_Shape/cc76narrowing4.cc (1.7),
+	  tests/BD_Shape/cc76narrowing5.cc (1.7),
+	  tests/BD_Shape/closure1.cc (1.11), tests/BD_Shape/concatenate1.cc
+	  (1.7), tests/BD_Shape/concatenate2.cc (1.7),
+	  tests/BD_Shape/concatenate3.cc (1.6),
+	  tests/BD_Shape/concatenate4.cc (1.6),
+	  tests/BD_Shape/concatenate5.cc (1.7),
+	  tests/BD_Shape/constraints1.cc (1.9),
+	  tests/BD_Shape/constraints2.cc (1.7), tests/BD_Shape/contains1.cc
+	  (1.6), tests/BD_Shape/contains2.cc (1.8),
+	  tests/BD_Shape/contains3.cc (1.8), tests/BD_Shape/empty1.cc
+	  (1.6), tests/BD_Shape/empty2.cc (1.6), tests/BD_Shape/empty3.cc
+	  (1.7), tests/BD_Shape/empty4.cc (1.6), tests/BD_Shape/empty5.cc
+	  (1.6), tests/BD_Shape/equality1.cc (1.9),
+	  tests/BD_Shape/exceptions1.cc (1.10),
+	  tests/BD_Shape/exceptions2.cc (1.9),
+	  tests/BD_Shape/exceptions3.cc (1.10),
+	  tests/BD_Shape/fromgensys1.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.8),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage13.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage14.cc (1.10),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.8),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.7),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.6),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.4),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.3),
+	  tests/BD_Shape/geomcovers1.cc (1.3),
+	  tests/BD_Shape/h79widening1.cc (1.6),
+	  tests/BD_Shape/intersection1.cc (1.6),
+	  tests/BD_Shape/intersection2.cc (1.6),
+	  tests/BD_Shape/intersection3.cc (1.7),
+	  tests/BD_Shape/intersection4.cc (1.8),
+	  tests/BD_Shape/intersection5.cc (1.8),
+	  tests/BD_Shape/intersection6.cc (1.7),
+	  tests/BD_Shape/intersection7.cc (1.7),
+	  tests/BD_Shape/intersection8.cc (1.7),
+	  tests/BD_Shape/limitedbhmz05extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation4.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation5.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation6.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation7.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation8.cc (1.2),
+	  tests/BD_Shape/limitedbhmz05extrapolation9.cc (1.2),
+	  tests/BD_Shape/limitedcc76extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedcc76extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedcc76extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.6),
+	  tests/BD_Shape/mapspacedims1.cc (1.6),
+	  tests/BD_Shape/mapspacedims2.cc (1.8),
+	  tests/BD_Shape/mapspacedims3.cc (1.7),
+	  tests/BD_Shape/mapspacedims4.cc (1.7),
+	  tests/BD_Shape/maxspacedim.cc (1.9),
+	  tests/BD_Shape/minconstraints1.cc (1.3),
+	  tests/BD_Shape/relations1.cc (1.10), tests/BD_Shape/relations2.cc
+	  (1.10), tests/BD_Shape/relations3.cc (1.9),
+	  tests/BD_Shape/relations4.cc (1.8), tests/BD_Shape/relations5.cc
+	  (1.10), tests/BD_Shape/removespacedims1.cc (1.7),
+	  tests/BD_Shape/removespacedims2.cc (1.8),
+	  tests/BD_Shape/removespacedims3.cc (1.8),
+	  tests/BD_Shape/timeelapse1.cc (1.7),
+	  tests/BD_Shape/timeelapse2.cc (1.6),
+	  tests/BD_Shape/timeelapse3.cc (1.6),
+	  tests/BD_Shape/timeelapse4.cc (1.6),
+	  tests/BD_Shape/timeelapse5.cc (1.7), tests/BD_Shape/universe1.cc
+	  (1.7), tests/BD_Shape/writebdshape1.cc (1.4),
+	  tests/BD_Shape/writebdshape2.cc (1.5),
+	  tests/Polyhedron/CbecomesNNC1.cc (1.6),
+	  tests/Polyhedron/LP_Problem3.cc (1.4),
+	  tests/Polyhedron/Makefile.am (1.40),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.6),
+	  tests/Polyhedron/NNCminimize1.cc (1.6),
+	  tests/Polyhedron/NNCminimize2.cc (1.6),
+	  tests/Polyhedron/NNCminimize3.cc (1.6),
+	  tests/Polyhedron/NNCminimize4.cc (1.6),
+	  tests/Polyhedron/NNCminimize5.cc (1.6),
+	  tests/Polyhedron/NNCminimize6.cc (1.6), tests/Polyhedron/README
+	  (1.5), tests/Polyhedron/addconstraint1.cc (1.6),
+	  tests/Polyhedron/addconstraint2.cc (1.7),
+	  tests/Polyhedron/addconstraint3.cc (1.6),
+	  tests/Polyhedron/addconstraints1.cc (1.7),
+	  tests/Polyhedron/addconstraints10.cc (1.7),
+	  tests/Polyhedron/addconstraints11.cc (1.6),
+	  tests/Polyhedron/addconstraints12.cc (1.6),
+	  tests/Polyhedron/addconstraints13.cc (1.7),
+	  tests/Polyhedron/addconstraints2.cc (1.6),
+	  tests/Polyhedron/addconstraints3.cc (1.7),
+	  tests/Polyhedron/addconstraints4.cc (1.6),
+	  tests/Polyhedron/addconstraints5.cc (1.7),
+	  tests/Polyhedron/addconstraints6.cc (1.6),
+	  tests/Polyhedron/addconstraints7.cc (1.7),
+	  tests/Polyhedron/addconstraints8.cc (1.7),
+	  tests/Polyhedron/addconstraints9.cc (1.6),
+	  tests/Polyhedron/addgenerator1.cc (1.7),
+	  tests/Polyhedron/addgenerator2.cc (1.7),
+	  tests/Polyhedron/addgenerator3.cc (1.6),
+	  tests/Polyhedron/addgenerator4.cc (1.7),
+	  tests/Polyhedron/addgenerator5.cc (1.7),
+	  tests/Polyhedron/addgenerators1.cc (1.7),
+	  tests/Polyhedron/addgenerators10.cc (1.7),
+	  tests/Polyhedron/addgenerators11.cc (1.7),
+	  tests/Polyhedron/addgenerators12.cc (1.7),
+	  tests/Polyhedron/addgenerators13.cc (1.7),
+	  tests/Polyhedron/addgenerators2.cc (1.7),
+	  tests/Polyhedron/addgenerators3.cc (1.6),
+	  tests/Polyhedron/addgenerators4.cc (1.6),
+	  tests/Polyhedron/addgenerators5.cc (1.6),
+	  tests/Polyhedron/addgenerators6.cc (1.7),
+	  tests/Polyhedron/addgenerators7.cc (1.6),
+	  tests/Polyhedron/addgenerators8.cc (1.7),
+	  tests/Polyhedron/addgenerators9.cc (1.6),
+	  tests/Polyhedron/addspacedims1.cc (1.7),
+	  tests/Polyhedron/addspacedims10.cc (1.6),
+	  tests/Polyhedron/addspacedims11.cc (1.6),
+	  tests/Polyhedron/addspacedims12.cc (1.6),
+	  tests/Polyhedron/addspacedims13.cc (1.6),
+	  tests/Polyhedron/addspacedims2.cc (1.7),
+	  tests/Polyhedron/addspacedims3.cc (1.8),
+	  tests/Polyhedron/addspacedims4.cc (1.6),
+	  tests/Polyhedron/addspacedims5.cc (1.6),
+	  tests/Polyhedron/addspacedims6.cc (1.6),
+	  tests/Polyhedron/addspacedims7.cc (1.6),
+	  tests/Polyhedron/addspacedims8.cc (1.7),
+	  tests/Polyhedron/addspacedims9.cc (1.6),
+	  tests/Polyhedron/affineimage1.cc (1.7),
+	  tests/Polyhedron/affineimage2.cc (1.6),
+	  tests/Polyhedron/affineimage3.cc (1.6),
+	  tests/Polyhedron/affineimage4.cc (1.7),
+	  tests/Polyhedron/affineimage5.cc (1.7),
+	  tests/Polyhedron/affineimage6.cc (1.8),
+	  tests/Polyhedron/affineimage7.cc (1.6),
+	  tests/Polyhedron/affineimage8.cc (1.6),
+	  tests/Polyhedron/affineimage9.cc (1.6),
+	  tests/Polyhedron/affinepreimage1.cc (1.6),
+	  tests/Polyhedron/affinepreimage10.cc (1.6),
+	  tests/Polyhedron/affinepreimage11.cc (1.4),
+	  tests/Polyhedron/affinepreimage2.cc (1.6),
+	  tests/Polyhedron/affinepreimage3.cc (1.7),
+	  tests/Polyhedron/affinepreimage4.cc (1.6),
+	  tests/Polyhedron/affinepreimage5.cc (1.6),
+	  tests/Polyhedron/affinepreimage6.cc (1.6),
+	  tests/Polyhedron/affinepreimage7.cc (1.6),
+	  tests/Polyhedron/affinepreimage8.cc (1.7),
+	  tests/Polyhedron/affinepreimage9.cc (1.6),
+	  tests/Polyhedron/affinetrans.cc (1.7),
+	  tests/Polyhedron/append1.cc (1.6), tests/Polyhedron/append2.cc
+	  (1.6), tests/Polyhedron/ascii_dump_load1.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.6),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.7),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.6),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.7),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.7),
+	  tests/Polyhedron/bhrz03widening1.cc (1.6),
+	  tests/Polyhedron/bhrz03widening10.cc (1.7),
+	  tests/Polyhedron/bhrz03widening11.cc (1.6),
+	  tests/Polyhedron/bhrz03widening12.cc (1.6),
+	  tests/Polyhedron/bhrz03widening13.cc (1.6),
+	  tests/Polyhedron/bhrz03widening14.cc (1.6),
+	  tests/Polyhedron/bhrz03widening15.cc (1.7),
+	  tests/Polyhedron/bhrz03widening16.cc (1.6),
+	  tests/Polyhedron/bhrz03widening17.cc (1.6),
+	  tests/Polyhedron/bhrz03widening18.cc (1.6),
+	  tests/Polyhedron/bhrz03widening19.cc (1.6),
+	  tests/Polyhedron/bhrz03widening2.cc (1.6),
+	  tests/Polyhedron/bhrz03widening3.cc (1.6),
+	  tests/Polyhedron/bhrz03widening4.cc (1.6),
+	  tests/Polyhedron/bhrz03widening5.cc (1.6),
+	  tests/Polyhedron/bhrz03widening6.cc (1.6),
+	  tests/Polyhedron/bhrz03widening7.cc (1.6),
+	  tests/Polyhedron/bhrz03widening8.cc (1.6),
+	  tests/Polyhedron/bhrz03widening9.cc (1.6),
+	  tests/Polyhedron/bhz03widening1.cc (1.8),
+	  tests/Polyhedron/bhz03widening2.cc (1.8),
+	  tests/Polyhedron/bhz03widening3.cc (1.8),
+	  tests/Polyhedron/bhz03widening4.cc (1.7),
+	  tests/Polyhedron/bhz03widening5.cc (1.7),
+	  tests/Polyhedron/bhz03widening6.cc (1.8),
+	  tests/Polyhedron/bounded1.cc (1.7),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.5),
+	  tests/Polyhedron/boundedaffineimage2.cc (1.4),
+	  tests/Polyhedron/boundedaffineimage3.cc (1.4),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.4),
+	  tests/Polyhedron/boundedaffinepreimage2.cc (1.4),
+	  tests/Polyhedron/boundedaffinepreimage3.cc (1.4),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.5),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.7),
+	  tests/Polyhedron/boundingbox1.cc (1.8),
+	  tests/Polyhedron/boundingbox2.cc (1.7),
+	  tests/Polyhedron/boundingbox3.cc (1.7),
+	  tests/Polyhedron/boundingbox4.cc (1.7),
+	  tests/Polyhedron/boundingbox5.cc (1.7),
+	  tests/Polyhedron/bounds1.cc (1.7), tests/Polyhedron/bounds2.cc
+	  (1.6), tests/Polyhedron/bug2.cc (1.5),
+	  tests/Polyhedron/concatenate1.cc (1.6),
+	  tests/Polyhedron/concatenate2.cc (1.7),
+	  tests/Polyhedron/concatenate3.cc (1.6),
+	  tests/Polyhedron/concatenate4.cc (1.6),
+	  tests/Polyhedron/concatenate5.cc (1.6),
+	  tests/Polyhedron/concatenate6.cc (1.7),
+	  tests/Polyhedron/concatenate7.cc (1.5),
+	  tests/Polyhedron/constraints1.cc (1.6),
+	  tests/Polyhedron/constraints2.cc (1.7),
+	  tests/Polyhedron/constraints3.cc (1.6),
+	  tests/Polyhedron/constraints4.cc (1.7),
+	  tests/Polyhedron/constraints5.cc (1.5),
+	  tests/Polyhedron/contains1.cc (1.6),
+	  tests/Polyhedron/contains2.cc (1.6),
+	  tests/Polyhedron/contains3.cc (1.6),
+	  tests/Polyhedron/contains4.cc (1.6),
+	  tests/Polyhedron/contains5.cc (1.6),
+	  tests/Polyhedron/disjoint1.cc (1.6),
+	  tests/Polyhedron/disjoint2.cc (1.7),
+	  tests/Polyhedron/disjoint3.cc (1.7),
+	  tests/Polyhedron/dualhypercubes.cc (1.6),
+	  tests/Polyhedron/empty1.cc (1.7), tests/Polyhedron/equals1.cc
+	  (1.6), tests/Polyhedron/exceptions1.cc (1.9),
+	  tests/Polyhedron/exceptions2.cc (1.7),
+	  tests/Polyhedron/exceptions3.cc (1.8),
+	  tests/Polyhedron/expandspacedim1.cc (1.7),
+	  tests/Polyhedron/expandspacedim2.cc (1.7),
+	  tests/Polyhedron/foldspacedims1.cc (1.7),
+	  tests/Polyhedron/foldspacedims2.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage13.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage14.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.7),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.6),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.6),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage3.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage4.cc (1.4),
+	  tests/Polyhedron/generators1.cc (1.6),
+	  tests/Polyhedron/generators2.cc (1.6),
+	  tests/Polyhedron/generators3.cc (1.7),
+	  tests/Polyhedron/generators4.cc (1.7),
+	  tests/Polyhedron/generators5.cc (1.6),
+	  tests/Polyhedron/generators6.cc (1.7),
+	  tests/Polyhedron/generators7.cc (1.6),
+	  tests/Polyhedron/geomcovers1.cc (1.8),
+	  tests/Polyhedron/gramschmidt1.cc (1.3),
+	  tests/Polyhedron/h79widening1.cc (1.6),
+	  tests/Polyhedron/h79widening2.cc (1.6),
+	  tests/Polyhedron/h79widening3.cc (1.6),
+	  tests/Polyhedron/h79widening4.cc (1.6),
+	  tests/Polyhedron/h79widening5.cc (1.7),
+	  tests/Polyhedron/h79widening6.cc (1.6),
+	  tests/Polyhedron/h79widening7.cc (1.6),
+	  tests/Polyhedron/h79widening8.cc (1.6),
+	  tests/Polyhedron/intersection1.cc (1.6),
+	  tests/Polyhedron/intersection10.cc (1.7),
+	  tests/Polyhedron/intersection11.cc (1.7),
+	  tests/Polyhedron/intersection2.cc (1.6),
+	  tests/Polyhedron/intersection3.cc (1.6),
+	  tests/Polyhedron/intersection4.cc (1.7),
+	  tests/Polyhedron/intersection5.cc (1.7),
+	  tests/Polyhedron/intersection6.cc (1.7),
+	  tests/Polyhedron/intersection7.cc (1.6),
+	  tests/Polyhedron/intersection8.cc (1.7),
+	  tests/Polyhedron/intersection9.cc (1.7),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.6),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.7),
+	  tests/Polyhedron/linearpartition1.cc (1.6),
+	  tests/Polyhedron/linearpartition2.cc (1.6),
+	  tests/Polyhedron/linearpartition3.cc (1.6),
+	  tests/Polyhedron/linearpartition4.cc (1.7),
+	  tests/Polyhedron/linearsystem1.cc (1.3),
+	  tests/Polyhedron/linexpression1.cc (1.6),
+	  tests/Polyhedron/lpproblem1.cc (1.2),
+	  tests/Polyhedron/lpproblem2.cc (1.2),
+	  tests/Polyhedron/mapspacedims1.cc (1.7),
+	  tests/Polyhedron/mapspacedims2.cc (1.6),
+	  tests/Polyhedron/mapspacedims3.cc (1.6),
+	  tests/Polyhedron/mapspacedims4.cc (1.6),
+	  tests/Polyhedron/matrix1.cc (1.6), tests/Polyhedron/max_min1.cc
+	  (1.7), tests/Polyhedron/max_min2.cc (1.7),
+	  tests/Polyhedron/maxspacedim1.cc (1.6), tests/Polyhedron/mc91.cc
+	  (1.7), tests/Polyhedron/membytes1.cc (1.7),
+	  tests/Polyhedron/membytes2.cc (1.6), tests/Polyhedron/memory1.cc
+	  (1.8), tests/Polyhedron/memory2.cc (1.11),
+	  tests/Polyhedron/minconstraints1.cc (1.6),
+	  tests/Polyhedron/minconstraints2.cc (1.7),
+	  tests/Polyhedron/minconstraints3.cc (1.6),
+	  tests/Polyhedron/minconstraints4.cc (1.6),
+	  tests/Polyhedron/mingenerators1.cc (1.6),
+	  tests/Polyhedron/mingenerators2.cc (1.7),
+	  tests/Polyhedron/mingenerators3.cc (1.6),
+	  tests/Polyhedron/numberinput1.cc (1.20),
+	  tests/Polyhedron/onepoint.cc (1.7), tests/Polyhedron/permute.cc
+	  (1.6), tests/Polyhedron/polydifference1.cc (1.6),
+	  tests/Polyhedron/polydifference2.cc (1.6),
+	  tests/Polyhedron/polydifference3.cc (1.6),
+	  tests/Polyhedron/polydifference4.cc (1.7),
+	  tests/Polyhedron/polydifference5.cc (1.6),
+	  tests/Polyhedron/polydifference6.cc (1.6),
+	  tests/Polyhedron/polydifference7.cc (1.7),
+	  tests/Polyhedron/polydifference8.cc (1.6),
+	  tests/Polyhedron/polydifference9.cc (1.7),
+	  tests/Polyhedron/polyhull1.cc (1.6),
+	  tests/Polyhedron/polyhull10.cc (1.6),
+	  tests/Polyhedron/polyhull11.cc (1.6),
+	  tests/Polyhedron/polyhull2.cc (1.7),
+	  tests/Polyhedron/polyhull3.cc (1.7),
+	  tests/Polyhedron/polyhull4.cc (1.6),
+	  tests/Polyhedron/polyhull5.cc (1.7),
+	  tests/Polyhedron/polyhull6.cc (1.6),
+	  tests/Polyhedron/polyhull7.cc (1.6),
+	  tests/Polyhedron/polyhull8.cc (1.7),
+	  tests/Polyhedron/polyhull9.cc (1.7),
+	  tests/Polyhedron/polypowerset1.cc (1.8),
+	  tests/Polyhedron/powerset1.cc (1.4),
+	  tests/Polyhedron/randphull1.cc (1.7),
+	  tests/Polyhedron/randphull2.cc (1.8),
+	  tests/Polyhedron/relations1.cc (1.6),
+	  tests/Polyhedron/relations10.cc (1.6),
+	  tests/Polyhedron/relations11.cc (1.6),
+	  tests/Polyhedron/relations12.cc (1.6),
+	  tests/Polyhedron/relations13.cc (1.6),
+	  tests/Polyhedron/relations14.cc (1.6),
+	  tests/Polyhedron/relations15.cc (1.6),
+	  tests/Polyhedron/relations16.cc (1.6),
+	  tests/Polyhedron/relations17.cc (1.7),
+	  tests/Polyhedron/relations18.cc (1.6),
+	  tests/Polyhedron/relations19.cc (1.7),
+	  tests/Polyhedron/relations2.cc (1.7),
+	  tests/Polyhedron/relations3.cc (1.6),
+	  tests/Polyhedron/relations4.cc (1.6),
+	  tests/Polyhedron/relations5.cc (1.6),
+	  tests/Polyhedron/relations6.cc (1.7),
+	  tests/Polyhedron/relations7.cc (1.6),
+	  tests/Polyhedron/relations8.cc (1.6),
+	  tests/Polyhedron/relations9.cc (1.6),
+	  tests/Polyhedron/removespacedims1.cc (1.6),
+	  tests/Polyhedron/removespacedims10.cc (1.7),
+	  tests/Polyhedron/removespacedims2.cc (1.6),
+	  tests/Polyhedron/removespacedims3.cc (1.7),
+	  tests/Polyhedron/removespacedims4.cc (1.6),
+	  tests/Polyhedron/removespacedims5.cc (1.7),
+	  tests/Polyhedron/removespacedims6.cc (1.6),
+	  tests/Polyhedron/removespacedims7.cc (1.6),
+	  tests/Polyhedron/removespacedims8.cc (1.6),
+	  tests/Polyhedron/removespacedims9.cc (1.6),
+	  tests/Polyhedron/smm1.cc (1.6), tests/Polyhedron/timeelapse1.cc
+	  (1.6), tests/Polyhedron/timeelapse2.cc (1.7),
+	  tests/Polyhedron/timeelapse3.cc (1.6),
+	  tests/Polyhedron/timeelapse4.cc (1.6),
+	  tests/Polyhedron/timeelapse5.cc (1.7),
+	  tests/Polyhedron/timeelapse6.cc (1.6),
+	  tests/Polyhedron/timeelapse7.cc (1.7),
+	  tests/Polyhedron/timeelapse8.cc (1.7),
+	  tests/Polyhedron/timeelapse9.cc (1.7),
+	  tests/Polyhedron/topclosed1.cc (1.7),
+	  tests/Polyhedron/topclosed2.cc (1.7),
+	  tests/Polyhedron/topclosed3.cc (1.6),
+	  tests/Polyhedron/topclosure1.cc (1.6),
+	  tests/Polyhedron/topclosure2.cc (1.7),
+	  tests/Polyhedron/topclosure3.cc (1.6),
+	  tests/Polyhedron/topclosure4.cc (1.7),
+	  tests/Polyhedron/universe1.cc (1.6),
+	  tests/Polyhedron/universe2.cc (1.6),
+	  tests/Polyhedron/universe3.cc (1.6),
+	  tests/Polyhedron/universe4.cc (1.6),
+	  tests/Polyhedron/universe5.cc (1.6),
+	  tests/Polyhedron/universe6.cc (1.6),
+	  tests/Polyhedron/universe7.cc (1.6),
+	  tests/Polyhedron/watchdog1.cc (1.7),
+	  tests/Polyhedron/writeconsys1.cc (1.6),
+	  tests/Polyhedron/writegensys1.cc (1.6),
+	  tests/Polyhedron/writegensys2.cc (1.7),
+	  tests/Polyhedron/writegensys3.cc (1.6),
+	  tests/Polyhedron/writepolyhedron1.cc (1.6),
+	  tests/Polyhedron/writepolyhedron2.cc (1.6),
+	  tests/Polyhedron/writepolyhedron3.cc (1.6),
+	  tests/Polyhedron/writerelation1.cc (1.6),
+	  tests/Polyhedron/writevariable1.cc (1.6), utils/Makefile.am
+	  (1.11), utils/build_header.in (1.3), utils/text2cxxarray.in
+	  (1.2), utils/timings.cc (1.6), utils/timings.hh (1.4): Copyright
+	  years extended.
+
+2005-12-31 Saturday 18:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: primalsimplex1.cc (1.5), primalsimplex2.cc
+	  (1.5): No longer testing the primal_simplex method.
+
+2005-12-31 Saturday 18:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.171): Do not announce the primal_simplex() methods; do
+	  announce the LP_Problem class instead.
+
+2005-12-31 Saturday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.181): The widening on BD_Shape is now the
+	  BHMZ05 widening.
+
+2005-12-31 Saturday 18:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.146), ppl_c.h.in (1.59): Got rid of
+	  the old interfaces for the primal simplex algorithm.
+
+2005-12-31 Saturday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: LP_Problem1.cc (1.3), LP_Problem2.cc (1.3),
+	  Makefile.am (1.39), lpproblem1.cc (1.1), lpproblem2.cc (1.1):
+	  Renamed (and basically rewritten) tests for class LP_Problem.
+
+2005-12-31 Saturday 18:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.30), bhmz05widening1.cc (1.1),
+	  bhmz05widening2.cc (1.1), bhmz05widening3.cc (1.1),
+	  bhmz05widening4.cc (1.1), bhmz05widening5.cc (1.1),
+	  bhmz05widening6.cc (1.1), bhmz05widening7.cc (1.1),
+	  bhmz05widening8.cc (1.1), ch78widening1.cc (1.6),
+	  ch78widening2.cc (1.7), ch78widening3.cc (1.6), ch78widening4.cc
+	  (1.7), ch78widening5.cc (1.7), ch78widening6.cc (1.9),
+	  ch78widening7.cc (1.6), ch78widening8.cc (1.7), exceptions2.cc
+	  (1.8), limitedCC76extrapolation1.cc (1.6),
+	  limitedCC76extrapolation2.cc (1.8), limitedCC76extrapolation3.cc
+	  (1.8), limitedCH78extrapolation1.cc (1.7),
+	  limitedCH78extrapolation2.cc (1.6), limitedCH78extrapolation3.cc
+	  (1.6), limitedCH78extrapolation4.cc (1.6),
+	  limitedCH78extrapolation5.cc (1.6), limitedCH78extrapolation6.cc
+	  (1.6), limitedCH78extrapolation7.cc (1.6),
+	  limitedCH78extrapolation8.cc (1.6), limitedCH78extrapolation9.cc
+	  (1.6), limitedbhmz05extrapolation1.cc (1.1),
+	  limitedbhmz05extrapolation2.cc (1.1),
+	  limitedbhmz05extrapolation3.cc (1.1),
+	  limitedbhmz05extrapolation4.cc (1.1),
+	  limitedbhmz05extrapolation5.cc (1.1),
+	  limitedbhmz05extrapolation6.cc (1.1),
+	  limitedbhmz05extrapolation7.cc (1.1),
+	  limitedbhmz05extrapolation8.cc (1.1),
+	  limitedbhmz05extrapolation9.cc (1.1),
+	  limitedcc76extrapolation1.cc (1.1), limitedcc76extrapolation2.cc
+	  (1.1), limitedcc76extrapolation3.cc (1.1): Renaming the CH78
+	  widening into BHMZ05 widening.  Avoid uppercases in the tests'
+	  filenames.
+
+2005-12-31 Saturday 18:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.55), BD_Shape.inlines.hh (1.115):
+	  Method CH78_widening_assign() renamed as
+	  BHMZ05_widening_assign().  Fixed a few problems in the
+	  documentation.  Fixed several occurrences of a problem regarding
+	  the checked approximation of the negation of a Coefficient.
+
+2005-12-31 Saturday 18:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.129): Exploit LP_Problem when
+	  (efficiently) testing for emptyness of the Polyhedron in method
+	  shrink_bounding_box().
+
+2005-12-31 Saturday 18:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.62): Exploit the new LP_Problem
+	  class in the implementation of minimization for NNC polyhedra.
+
+2005-12-31 Saturday 18:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.inlines.hh (1.3): Properly initialize and copy the
+	  private member working_cost.
+
+2005-12-31 Saturday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.133), simplex.cc (1.35): Got rid of the old
+	  simplex implementation.
+
+2005-12-31 Saturday 18:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.21): Got rid of the primal
+	  simplex methods.
+
+2005-12-31 Saturday 18:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.111): Corrected documentation for
+	  private method set_is_inequality().
+
+2005-12-31 Saturday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.62), devref.doxyconf-latex.in
+	  (1.5), user.doxyconf-html.in (1.32), user.doxyconf-latex.in
+	  (1.4): Updated to the new version of doxygen (1.4.6).  Completed
+	  the list of input files for the devref manual.
+
+2005-12-31 Saturday 18:03  Abramo Bagnara
+
+	* src/checked.cc (1.10): Reverted to old version and fixed it.
+
+2005-12-31 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.19): Fixed another expected
+	  result.
+
+2005-12-31 Saturday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.18): Fixed some expected
+	  results.
+
+2005-12-31 Saturday 17:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.17): FIX comments removed:
+	  some were OK, some were not.
+
+2005-12-31 Saturday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.cc (1.5): Added a missing \relates Doxygen
+	  command.
+
+2005-12-31 Saturday 15:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.15), GMP_Integer.inlines.hh (1.10):
+	  Added binary version of neg_assign().
+
+2005-12-31 Saturday 12:23  Abramo Bagnara
+
+	* tests/Polyhedron/numberinput1.cc (1.16): Rewritten test function.
+
+2005-12-31 Saturday 12:17  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.50): Missing rename.
+
+2005-12-31 Saturday 11:40  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.51), interfaces/C/ppl_c.cc (1.145),
+	  interfaces/Prolog/ppl_prolog.icc (1.167),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.38),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.33),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.83),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.109),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.74),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.100), src/BD_Shape.inlines.hh
+	  (1.114), src/Bounding_Box.inlines.hh (1.13),
+	  src/Checked_Number.defs.hh (1.46), src/Checked_Number.inlines.hh
+	  (1.49), src/DB_Matrix.inlines.hh (1.20),
+	  src/Polyhedron.inlines.hh (1.128), src/Polyhedron_nonpublic.cc
+	  (1.61), tests/Random_Number_Generator.inlines.hh (1.6),
+	  tests/BD_Shape/closure1.cc (1.10): Renamed assign in assign_r for
+	  congruency.
+
+2005-12-30 Friday 23:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.180): Removed a repeated "the".
+
+2005-12-30 Friday 23:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.165): Removed two items:
+
+	  - Improve the documentation of Polyhedron::shrink_bounding_box().
+	     See
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2005-July/006191.html.
+	   (documentation of Polyhedron::shrink_bounding_box() has been
+	  improved.)
+
+	  - The documentation has been read through but a more careful
+	  check,   particularly on the detailed descriptions, should be
+	  done.
+
+2005-12-30 Friday 23:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.287): Added more explanation regarding
+	  shrink_bounding_box.
+
+2005-12-30 Friday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Expression.cc (1.7): Removed excessive uses of
+	  vertical space.
+
+2005-12-30 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Expression.defs.hh (1.15), Polyhedron.defs.hh
+	  (1.286): Removed excessive indentation in Doxygen comments.
+
+2005-12-30 Friday 21:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/LP_Problem3.cc (1.3): Avoid a space dimension
+	  compatibility problem.
+
+2005-12-30 Friday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.50), interfaces/C/ppl_c.cc (1.144),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.37),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.32),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.82),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.108),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.73), src/BD_Shape.inlines.hh
+	  (1.113), src/Bounding_Box.inlines.hh (1.12),
+	  src/Polyhedron.inlines.hh (1.127), src/Polyhedron_nonpublic.cc
+	  (1.60): Got rid of most uses of raw_value().
+
+2005-12-30 Friday 21:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.11): Delete trailing whitespace.
+
+2005-12-30 Friday 21:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.143): Added a couple of missing spaces.
+
+2005-12-30 Friday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.58): Corrected the documentation for
+	  the return value of ppl_LP_Problem_solve().
+
+2005-12-30 Friday 21:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.166): Fixed indentation in a
+	  switch statement.  Added the missing default case in another
+	  switch statement.
+
+2005-12-30 Friday 21:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.16), expected_mpz (1.5),
+	  expected_mpz_a (1.5): Make check now also perform many tests
+	  using the simplex algorithm.	Expected results for mpz
+	  coefficients changed accordingly.
+
+2005-12-30 Friday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.25): Check for all possible values
+	  that can be returned by ppl_LP_Problem_solve().
+
+2005-12-30 Friday 21:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.35): Added namespace
+	  qualification to a doxygen \relates command for a function that
+	  is no longer in the anonymous namespace.
+
+2005-12-30 Friday 21:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.types.hh (1.10): Let the brief doxygen
+	  documentation be actually printed.
+
+2005-12-30 Friday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ptr_Iterator.types.hh (1.4): Replaced a use of `class' with
+	  `typename'.
+
+2005-12-30 Friday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.types.hh (1.3), BD_Shape.types.hh (1.4),
+	  BHRZ03_Certificate.types.hh (1.3), Bounding_Box.types.hh (1.3),
+	  C_Polyhedron.types.hh (1.9), Constraint.types.hh (1.9),
+	  Constraint_System.types.hh (1.3), DB_Matrix.types.hh (1.4),
+	  DB_Row.types.hh (1.5), Determinate.types.hh (1.7),
+	  Generator.types.hh (1.9), Generator_System.types.hh (1.3),
+	  H79_Certificate.types.hh (1.3), Init.types.hh (1.8),
+	  Interval.types.hh (1.10), LP_Problem.types.hh (1.3),
+	  Linear_Expression.types.hh (1.3), Linear_Row.types.hh (1.3),
+	  Linear_System.types.hh (1.3), Matrix.types.hh (1.9),
+	  NNC_Polyhedron.types.hh (1.9), Poly_Con_Relation.types.hh (1.8),
+	  Poly_Gen_Relation.types.hh (1.8), Polyhedra_Powerset.types.hh
+	  (1.3), Powerset.types.hh (1.3), Row.types.hh (1.10),
+	  Saturation_Matrix.types.hh (1.3), Saturation_Row.types.hh (1.3),
+	  Variable.types.hh (1.9), Widening_Function.types.hh (1.4):
+	  Namespaces' closing brackets should always be commented.
+
+2005-12-30 Friday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Coefficient.types.hh (1.10): Include "Checked_Number.defs.hh"
+	  unconditionally.
+
+2005-12-30 Friday 19:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/namespaces.hh (1.4): Namespaces' closing brackets should
+	  always be commented.
+
+2005-12-30 Friday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.170), demos/ppl_lpsol/Makefile.am (1.15): With the new
+	  simplex implementation, ppl_lpsol is indeed a quite useful tool:
+	  it is now installed in $(bindir) upon `make install'.
+
+2005-12-30 Friday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.24): New option --enumerate, dual
+	  to --simplex.
+
+2005-12-30 Friday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Coefficient.defs.hh (1.5), Coefficient.types.hh (1.9),
+	  Makefile.am (1.132), Native_Integer.defs.hh (1.17),
+	  Native_Integer.inlines.hh (1.20), Native_Integer.types.hh (1.11):
+	  Old implementation of native integer coefficients phased out:
+	  checked numbers with the transparent policy are used instead.
+
+2005-12-30 Friday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.199): When native integers are requested, use
+	  checked numbers with the transparent policy for the coefficients.
+	  Version number bumped.
+
+2005-12-30 Friday 17:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.23): Require at least version 8 of
+	  the PPL.
+
+2005-12-30 Friday 17:10  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.45), Checked_Number.inlines.hh
+	  (1.48), checked.defs.hh (1.29): More visibility to
+	  Checked_Number_Transparent_Policy.
+
+2005-12-30 Friday 16:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.22): Now also accepting the long
+	  option --simplex.  Avoid a duplicated timing output and do not
+	  claim optimization (in the output) when the LP problem has been
+	  found unfeasible or unbounded.
+
+2005-12-30 Friday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.19): Implemented template
+	  <typename T> Native_Integer<T>::operator T() const.
+
+2005-12-30 Friday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.88): Added an assertion on the parameter of
+	  permute_columns().
+
+2005-12-30 Friday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.112): Added a missing namespace
+	  qualification in code expoiting the new simplex implementation.
+
+2005-12-30 Friday 09:36  Abramo Bagnara
+
+	* src/: BD_Shape.inlines.hh (1.111), Checked_Number.defs.hh (1.44),
+	  Checked_Number.inlines.hh (1.47), Constraint.cc (1.53),
+	  DB_Matrix.inlines.hh (1.19), GMP_Integer.defs.hh (1.14),
+	  GMP_Integer.inlines.hh (1.9), Generator.cc (1.66), LP_Problem.cc
+	  (1.3), Linear_Expression.cc (1.6), Linear_Row.cc (1.15),
+	  Linear_System.cc (1.32), Native_Integer.defs.hh (1.16),
+	  Native_Integer.inlines.hh (1.18), Polyhedron_public.cc (1.69),
+	  Row.cc (1.94), conversion.cc (1.76), simplex.cc (1.34): Renamed
+	  assign functors for congruency.
+
+2005-12-30 Friday 09:34  Abramo Bagnara
+
+	* src/: checked_int.inlines.hh (1.42), checked_numeric_limits.hh
+	  (1.8): Cleaner implementation of limits.
+
+2005-12-29 Thursday 22:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.21), doc/devref.doxyconf-html.in
+	  (1.61), interfaces/C/ppl_c.cc (1.142), interfaces/C/ppl_c.h.in
+	  (1.57), interfaces/Prolog/Prolog_interface.dox (1.139),
+	  interfaces/Prolog/exceptions.hh (1.18),
+	  interfaces/Prolog/ppl_prolog.icc (1.165),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.107),
+	  src/BD_Shape.inlines.hh (1.110), src/Constraint_System.defs.hh
+	  (1.20), src/LP_Problem.cc (1.2), src/LP_Problem.defs.hh (1.2),
+	  src/LP_Problem.inlines.hh (1.2), src/LP_Problem.types.hh (1.2),
+	  src/Linear_Expression.defs.hh (1.14), src/Makefile.am (1.131),
+	  src/Polyhedron_nonpublic.cc (1.59), src/globals.types.hh (1.3),
+	  src/simplex.cc (1.33), tests/Polyhedron/LP_Problem1.cc (1.2),
+	  tests/Polyhedron/LP_Problem2.cc (1.2),
+	  tests/Polyhedron/LP_Problem3.cc (1.2),
+	  tests/Polyhedron/Makefile.am (1.38),
+	  tests/Polyhedron/primalsimplex1.cc (1.4),
+	  tests/Polyhedron/primalsimplex2.cc (1.4): First merge of the
+	  simplex branch to the main trunk.
+
+2005-12-29 Thursday 20:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.4): Stick to use the new
+	  interface for the simplex algorithm.
+
+2005-12-29 Thursday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.198): Check for egrep: we use it to perform some
+	  version checks.
+
+2005-12-29 Thursday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.169), interfaces/Prolog/Prolog_interface.dox (1.138),
+	  m4/ac_check_swi_prolog.m4 (1.7): We now require SWI-Prolog 5.6.0
+	  or later version: the AC_CHECK_SWI_PROLOG macro checks that this
+	  requirement is fulfilled.
+
+2005-12-29 Thursday 07:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.93): Avoid shadowing variables (and the consequent
+	  compiler warnings).
+
+2005-12-28 Wednesday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.168): Added an item regarding the implementation of the
+	  domain of BD shapes.
+
+2005-12-28 Wednesday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[13,13]):
+	  Throwing the documented exceptions when appropriate.	Method OK()
+	  is no longer inlined and now performs some more accurate
+	  consistency check.
+
+2005-12-28 Wednesday 17:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LP_Problem.defs.hh (simplex.12): Added documentation about
+	  exceptions that should be thrown.
+
+2005-12-27 Tuesday 13:45  Andrea Cimino
+
+	* tests/Polyhedron/LP_Problem3.cc (simplex.3): Enabled by mistake
+	  NOISY macro: now disabled.
+
+2005-12-27 Tuesday 13:44  Andrea Cimino
+
+	* tests/Polyhedron/LP_Problem3.cc (simplex.2): Inserted another
+	  challenger: the problem is solved also adding `incrementally'
+	  constraints to a Constraint_System and applying the simplex
+	  algorithm.
+
+2005-12-25 Sunday 13:07  Andrea Cimino
+
+	* tests/Polyhedron/: LP_Problem1.cc, LP_Problem3.cc
+	  (simplex.[5,1]): Added another test to check LP_Problem's
+	  incrementality.  Avoid useless inclusions.
+
+2005-12-24 Saturday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.109), Checked_Number.defs.hh (1.43):
+	  Two FIXME replaced by corresponding TODO.  Minor variable name
+	  improvements in generalized_affine_preimage.	Splitted too long
+	  lines in Checked_Number.defs.hh.
+
+2005-12-24 Saturday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.54): Indentation fixed.
+
+2005-12-24 Saturday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.164): A couple of items dealt with.
+
+2005-12-24 Saturday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.167), STANDARDS (1.28): A couple of minor improvements.
+
+2005-12-24 Saturday 12:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc, src/BD_Shape.inlines.hh,
+	  src/Constraint_System.defs.hh, src/LP_Problem.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  src/LP_Problem.types.hh, src/Polyhedron_nonpublic.cc,
+	  src/globals.types.hh, src/simplex.cc,
+	  tests/Polyhedron/LP_Problem1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc
+	  (simplex.[3,3,3,2,2,2,3,12,11,12,2,1,2,2,4,2,1,1]): The
+	  enumeration Simplex_Status renamed as LP_Problem_Status.  Its
+	  definition moved into LP_Problem.types.hh.
+
+2005-12-23 Friday 17:03  Matthew Mundell
+
+	* src/Grid_public.cc (grids.127): Update the constraint system
+	  adding methods to leave the check on the existence of rows in the
+	  temporary congruence system to the method that will add that
+	  congruence system.
+
+2005-12-23 Friday 16:51  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.inlines.hh
+	  (grids.[38,12]): Ensure that all constructors create at least two
+	  columns.
+
+2005-12-23 Friday 15:48  Matthew Mundell
+
+	* src/Grid_public.cc (grids.126): Enable the all-zero parameter OK
+	  check.
+
+2005-12-23 Friday 15:48  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (grids.17): Add the all-zero
+	  parameter behaviour to the insert(g) description.
+
+2005-12-23 Friday 15:41  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.25): Adding setting of the
+	  first pending row index to the recycling_insert methods.
+
+2005-12-23 Friday 14:40  Matthew Mundell
+
+	* tests/Grid/isuniverse1.cc (grids.9): Add three tests where the
+	  grid is defined by a minimized congruence system.
+
+2005-12-23 Friday 14:39  Matthew Mundell
+
+	* src/Grid_public.cc (grids.125): Leave the is_universe assumption
+	  that the minimized universe congruence system always contains
+	  exactly the integrality congruence.
+
+2005-12-23 Friday 14:38  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.29): Add a query about using the
+	  congruence system in remove_space_dimensions.
+
+2005-12-23 Friday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.166): Our tentative release date for PPL 0.8 is January
+	  20, 2006.
+
+2005-12-23 Friday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.163): Two items moved from PPL 0.8 to PPL 0.9.  Added one
+	  more item to PPL 0.9.
+
+2005-12-23 Friday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: generalizedaffinepreimage1.cc (1.3),
+	  generalizedaffinepreimage2.cc (1.2): Avoid using useless explicit
+	  constructors for Linear_Expression.  Maximum allowed distances
+	  updated to reflect the approximations incurred by integer
+	  coefficient types.
+
+2005-12-23 Friday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.108): Minor improvements in the
+	  comments of generalized_affine_preimage.
+
+2005-12-23 Friday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (simplex.1): Added the
+	  list of predicates related to the new PPL object LP_Problem.
+
+2005-12-22 Thursday 20:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh, ppl_prolog.icc,
+	  SWI/ppl_swiprolog.cc, tests/pl_check.pl (simplex.[1,1,1,1]):
+	  Drafted the (SWI) Prolog interface for class LP_Problem.
+
+2005-12-22 Thursday 20:01  Matthew Mundell
+
+	* tests/Grid/relations2.cc (grids.7): Add test10 to test13, which
+	  test grids with divisors that are greater than one.
+
+2005-12-22 Thursday 20:00  Matthew Mundell
+
+	* src/Grid_public.cc (grids.124): Account for the divisor in the
+	  parameter case of relation_with(g) by modulating the scalar
+	  product by the product of the parameter divisor and the modulus,
+	  instead of by just the modulus.
+
+2005-12-22 Thursday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc, ppl_c.h.in (simplex.[2,2]): Added the
+	  encoding of domain_error.  The changes in the LP_Problem
+	  interface reflected here.
+
+2005-12-22 Thursday 17:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[11,10,11]): Methods is_satisfiable(), solve(),
+	  feasible_point() and optimizing_point() are now declared const.
+	  A few stylistic and doxygen comments improvements.
+
+2005-12-22 Thursday 17:41  Matthew Mundell
+
+	* src/Grid_public.cc (grids.123): Update OK to check that the
+	  con_sys and grid space dimensions match when con_sys is empty.
+
+	  Update add_recycled_generators_and_minimize to insert the
+	  generators with Grid_Generator_System::recycling_insert.
+
+	  Replace the add_recycled_generators call in
+	  generalized_affine_image(l,r,m) with equivalent, quicker code.
+
+2005-12-22 Thursday 17:37  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[24,16]): Add recycling_insert(g).
+
+2005-12-22 Thursday 17:35  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.inlines.hh
+	  (grids.[13,15]): Implement operator<< directly, adding divisor
+	  output for parameters.
+
+2005-12-22 Thursday 17:33  Matthew Mundell
+
+	* src/Matrix.defs.hh (grids.6): Correct typo in add_recycled_row
+	  description.
+
+2005-12-22 Thursday 13:21  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.23): Improve the insert query
+	  about wrapping an NNC generator.
+
+2005-12-22 Thursday 13:08  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.22): Leave the tmp_row
+	  allocation in insert alone (tmp_row is a stack variable so the
+	  Linear_Row destructor will be called and it will free the memory
+	  in tmp_row).
+
+2005-12-21 Wednesday 19:14  Matthew Mundell
+
+	* src/Grid_public.cc (grids.122): Add divisor normalization after
+	  the parameter insertion in generalized_affine_image.
+
+	  Update add_generator(g) to make one normalize_divisor call when
+	  the grid originally contained points.
+
+2005-12-21 Wednesday 19:09  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.65): Include parameters in the
+	  normalize_divisors(sys,d,f) LCM calculation.
+
+2005-12-21 Wednesday 19:07  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.28): Add divisor normalization after
+	  inserting parameters in add_space_dimensions and
+	  add_space_dimensions_and_project.
+
+2005-12-21 Wednesday 19:06  Matthew Mundell
+
+	* src/Grid_Generator.cc (grids.12): Update scale_to_divisor to
+	  leave the divisor column out of the scaling.
+
+2005-12-21 Wednesday 19:03  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.21): Update affine_image to
+	  use Grid_Generator and Grid_Generator_System instead of Generator
+	  and Generator_System.
+
+2005-12-21 Wednesday 19:01  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.16): Make parens in find_variation
+	  messages consistent.
+
+2005-12-21 Wednesday 17:10  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.20): Update method insert to
+	  leave alone the divisors of inserted parameters (Grid will
+	  normalize the divisors).
+
+2005-12-21 Wednesday 17:03  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.13): Revert to the actual
+	  known grid in test3.
+
+2005-12-21 Wednesday 17:02  Elena Mazzi
+
+	* tests/BD_Shape/generalizedaffinepreimage1.cc (1.2): Try to use
+	  the distance computation so as to detect when a computed result
+	  is ok even if different from the known result.
+
+2005-12-21 Wednesday 16:17  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.50): Update map_space_dimensions to
+	  call grid_line in place of line.
+
+2005-12-21 Wednesday 16:14  Matthew Mundell
+
+	* src/: Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[15,9]): Take out
+	  insert(g).
+
+2005-12-21 Wednesday 16:14  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh (grids.[11,18,14]): Add
+	  throw_invalid_argument.  Update the divisor methods to throw
+	  std::invalid_argument if the generator is a line.
+
+2005-12-21 Wednesday 16:14  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[91,64]): Take out
+	  the throw_topology_incompatible methods.
+
+2005-12-21 Wednesday 15:41  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[10,17]):
+	  Update scale_to_divisor to throw std::invalid_argument if the
+	  given divisor is zero.
+
+2005-12-21 Wednesday 14:31  Matthew Mundell
+
+	* src/Grid_public.cc (grids.121): Update Grid(n,k) to trust the
+	  divisor value of the trivially true point created by grid_point.
+
+2005-12-21 Wednesday 14:30  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.53), src/BD_Shape.inlines.hh (1.107),
+	  tests/BD_Shape/Makefile.am (1.29),
+	  tests/BD_Shape/generalizedaffinepreimage1.cc (1.1),
+	  tests/BD_Shape/generalizedaffinepreimage2.cc (1.1): Defined a new
+	  method: BD_Shape::generalized_affine_preimage(var, relsym, expr,
+	  den).  Added some tests about this method.
+
+2005-12-21 Wednesday 14:28  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.32): Correct a comment in the
+	  congruence to generator conversion.
+
+2005-12-21 Wednesday 14:27  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.19): Keep the
+	  add_universe_rows_and_columns num_columns assertion.
+
+2005-12-21 Wednesday 14:24  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_nonpublic.cc (grids.[90,9,16,63]): Update
+	  Grid::normalize_divisors(sys,d,f) to simply return zero when the
+	  given divisor is zero.  The previous special behaviour in the
+	  zero case be accomplished by passing a divisor of one.
+
+	  Rename Grid_Generator::multiply to
+	  Grid_Generator::scale_to_divisor.  Correct the description of
+	  this method.
+
+	  Leave the factor normalization in
+	  Grid_Generator::is_equivalent_to as the only normalization, as
+	  sign normalization would only be required if divisors could be
+	  negative.
+
+2005-12-21 Wednesday 14:04  Matthew Mundell
+
+	* tests/Grid/generator1.cc (grids.4): Enable test5 (comparison of
+	  parameters that have divisors > 1).
+
+2005-12-20 Tuesday 21:49  Matthew Mundell
+
+	* tests/Grid/relations1.cc (grids.6): Use parameter divisors in
+	  test6 and test7.
+
+2005-12-20 Tuesday 21:48  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.12): Temporarily match the
+	  expected result in test3 to the actual result.
+
+2005-12-20 Tuesday 21:48  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.12): Correct the expected result in
+	  test4.
+
+2005-12-20 Tuesday 21:47  Matthew Mundell
+
+	* tests/Grid/isuniverse1.cc (grids.8): Correct the fail case in
+	  test10.
+
+2005-12-20 Tuesday 21:46  Matthew Mundell
+
+	* tests/Grid/congruencesystem2.cc (grids.11): Use parameter
+	  divisors.
+
+2005-12-20 Tuesday 21:45  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.27): Take some old code out of
+	  add_space_dimensions_and_embed.
+
+2005-12-20 Tuesday 21:44  Matthew Mundell
+
+	* src/: Congruence_System.cc, Grid.inlines.hh,
+	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+	  (grids.[37,49,14,8,62,120,43]): [rest of previous commit]
+
+	  Add parameter divisors, encoding the divisors in an extra
+	  trailing Grid_Generator column:
+
+	   - implement the Grid_Generator methods point, line,
+	  is_equivalent_to
+	     and all_homogeneous_terms_are_zero directly, instead of
+	  wrapping
+	     the Generator equivalents
+
+	   - move Grid_Generator::strong_normalize to the private section
+
+	   - update Grid_Generator_System to swap the divisor column any
+	  time
+	     the system size changes
+
+	   - update methods Congruence_System::satisfies_all_congruences
+	  and
+	     Grid::relation_with(g) to use the given generator's divisor
+	  instead
+	     of a divisor passed in an extra argument
+
+	   - update the generator reduction and congruence to generator
+	     conversion to ensure that the parameter divisors match the
+	  divisor
+	     of the first point after the reduction or conversion
+
+	   - adapt Grid and Scalar_Product to the extra generator column
+	  (mostly
+	     changes to loop indexing)
+
+	   - add a Grid_Generator friend declaration to Linear_Expression.
+
+	  Take out Grid_Generator_System(const Generator&).
+
+2005-12-20 Tuesday 21:41  Matthew Mundell
+
+	* src/: Congruence_System.defs.hh, Grid.defs.hh, Grid_Generator.cc,
+	  Grid_Generator.defs.hh, Grid_Generator.inlines.hh,
+	  Grid_Generator_System.cc, Grid_conversion.cc,
+	  Linear_Expression.defs.hh, Scalar_Products.cc
+	  (grids.[22,89,8,15,13,18,31,10,5]): Add parameter divisors,
+	  encoding the divisors in an extra trailing Grid_Generator column:
+
+	   - implement the Grid_Generator methods point, line,
+	  is_equivalent_to
+	     and all_homogeneous_terms_are_zero directly, instead of
+	  wrapping
+	     the Generator equivalents
+
+	   - move Grid_Generator::strong_normalize to the private section
+
+	   - update Grid_Generator_System to swap the divisor column any
+	  time
+	     the system size changes
+
+	   - update methods Congruence_System::satisfies_all_congruences
+	  and
+	     Grid::relation_with(g) to use the given generator's divisor
+	  instead
+	     of a divisor passed in an extra argument
+
+	   - update the generator reduction and congruence to generator
+	     conversion to ensure that the parameter divisors match the
+	  divisor
+	     of the first point after the reduction or conversion
+
+	   - adapt Grid and Scalar_Product to the extra generator column
+	  (mostly
+	     changes to loop indexing)
+
+	   - add a Grid_Generator friend declaration to Linear_Expression.
+
+	  Take out Grid_Generator_System(const Generator&).
+
+2005-12-20 Tuesday 11:42  Andrea Cimino
+
+	* src/LP_Problem.defs.hh (simplex.9): Synchronized Doxygen stuff to
+	  reflect last changes to LP_Problem interface.
+
+2005-12-20 Tuesday 08:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Random_Number_Generator.inlines.hh (1.5): Avoid anonymous
+	  namespaces in files that are going to be included.
+
+2005-12-20 Tuesday 08:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.inlines.hh (1.8), BD_Shape.inlines.hh (1.106),
+	  Native_Integer.inlines.hh (1.17), Polyhedra_Powerset.inlines.hh
+	  (1.34), namespaces.hh (1.3): Avoid the use of anonymous
+	  namespaces in files that are going to be included.
+
+2005-12-19 Monday 20:22  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, copyconstruct1.cc (grids.[54,1]): Add
+	  copyconstruct1, to test Grid copy construction.
+
+2005-12-19 Monday 20:21  Matthew Mundell
+
+	* src/Grid_public.cc (grids.119): Update the copy constructor to
+	  always copy the systems when the space dimension is zero.
+
+2005-12-19 Monday 07:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.34), config.sub (1.32), install-sh (1.16),
+	  ltmain.sh (1.27), Watchdog/config.guess (1.18),
+	  Watchdog/config.sub (1.17), Watchdog/install-sh (1.13),
+	  Watchdog/ltmain.sh (1.16): Updated from Libtool 1.5.22.
+
+2005-12-18 Sunday 18:21  Andrea Cimino
+
+	* src/LP_Problem.cc (simplex.10): Improved swap_base(): now
+	  directly handles `base'.
+
+2005-12-18 Sunday 16:56  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[9,8,10]): second_phase() declared void.  Many inline
+	  methods simplified: `status' cases during the real simplex
+	  computations are now handled only by is_satisfiable() and
+	  second_phase().
+
+2005-12-17 Saturday 01:31  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.61): Enable the system equality
+	  checks in quick_equivalence_test.
+
+2005-12-17 Saturday 01:30  Matthew Mundell
+
+	* src/Congruence.inlines.hh (grids.19): Negate the coefficient used
+	  to create the zero_dim_integrality congruence (so that the
+	  resulting constant term is positive).
+
+2005-12-17 Saturday 01:25  Matthew Mundell
+
+	* src/: Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[13,7]): Add
+	  Grid_Generator_System::is_equal_to(ggs) and operator==(ggs,ggs).
+
+2005-12-16 Friday 23:38  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.48): Add note for map_space_dimensions
+	  code awaiting parameter divisors.
+
+2005-12-16 Friday 23:26  Matthew Mundell
+
+	* src/Grid_public.cc (grids.118): Improve relation descriptions in
+	  relation_with(cg).
+
+2005-12-16 Friday 23:01  Matthew Mundell
+
+	* src/: Grid_nonpublic.cc, Grid_simplify.cc (grids.[60,42]): Move
+	  update_generators system column assertion into congruence
+	  simplify.
+
+2005-12-16 Friday 21:13  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.36): Add Constraint_System
+	  includes.
+
+2005-12-16 Friday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.27): Avoid anonymous namespaces in header files.
+
+2005-12-15 Thursday 14:50  Matthew Mundell
+
+	* src/Grid_public.cc (grids.117): Update add_generator(g) to insert
+	  the given generator, instead of inserting a copy, when the grid
+	  contains points.
+
+2005-12-15 Thursday 14:25  Matthew Mundell
+
+	* src/Grid_public.cc (grids.116): Confirm that creation of the
+	  universe systems in Grid(n,k) works.	Slightly improve spacing
+	  and a few comments in Grid(n,k).
+
+2005-12-15 Thursday 14:15  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (grids.14): Move Grid_Generator(g) to
+	  the private section.
+
+2005-12-15 Thursday 14:14  Matthew Mundell
+
+	* src/Grid_Generator.cc (grids.7): Improve the note about
+	  converting the Generator in function `parameter' to a
+	  Grid_Generator.
+
+2005-12-15 Thursday 01:20  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[8,9]): Minor
+	  stylistic and performance improvements.
+
+2005-12-14 Wednesday 22:13  Matthew Mundell
+
+	* src/checked_mpz.inlines.hh (grids.6): Update the mpz_gcd call in
+	  gcdext_mpz to mpz_gcdext.
+
+2005-12-14 Wednesday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.162): New to-do item.
+
+2005-12-14 Wednesday 21:02  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.59): Update set_zero_dim_univ to
+	  leave the con_sys size adjustment to Congruence_System::clear.
+
+2005-12-14 Wednesday 20:24  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[17,12]): Update remove_higher_space_dimensions with a
+	  dimension compatibility check, to return immediately if the
+	  dimension will remain the same, and to clear the system if the
+	  new dimension is 0.
+
+2005-12-14 Wednesday 19:37  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[16,11]): Update remove_space_dimensions to check the
+	  space dim of the given set and to exit immediately if the set is
+	  empty.
+
+2005-12-14 Wednesday 18:21  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[15,10]): Update recycling_insert to increase the system
+	  space dimension if that of the system being inserted is bigger.
+
+2005-12-14 Wednesday 17:40  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.14): Leave it up to the
+	  add_universe_rows_and_columns to ensure that the system will
+	  contain a point.
+
+2005-12-14 Wednesday 17:10  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.47): Revert map_space_dimensions to
+	  insert parameters via function point for now (as the given
+	  expression already uses the system divisor).
+
+2005-12-14 Wednesday 16:56  Matthew Mundell
+
+	* tests/Grid/generalizedaffineimage1.cc (grids.6): Correct expected
+	  values in test2, test4, test5 and test6 (now that parameter
+	  divisors are adjusted at insertion).
+
+2005-12-14 Wednesday 16:38  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.13): Update method insert to
+	  represent inserted parameters with the divisor of the first
+	  point.
+
+2005-12-14 Wednesday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.26): Added a section about test programs.
+
+2005-12-14 Wednesday 12:44  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh (simplex.[7,7]): Better
+	  handled namespaces.  `PPL::LP_Problem::primal_simplex()' removed,
+	  was unused.  Fixed return types in
+	  `PPL::LP_Problem::is_feasible()'.
+
+2005-12-14 Wednesday 12:10  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[6,6,8]): Internal enum `Status' fields renamed from
+	  PROBLEM_* to *.  Added a FIXME.
+
+2005-12-14 Wednesday 11:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/addconstraints1.cc (1.5),
+	  BD_Shape/addspacedims1.cc (1.6), BD_Shape/addspacedims2.cc (1.6),
+	  BD_Shape/addspacedims3.cc (1.7), BD_Shape/addspacedims4.cc (1.7),
+	  BD_Shape/addspacedims5.cc (1.8), BD_Shape/addspacedims6.cc (1.8),
+	  BD_Shape/addspacedims7.cc (1.6), BD_Shape/affinedimension1.cc
+	  (1.2), BD_Shape/affineimage1.cc (1.6), BD_Shape/affineimage10.cc
+	  (1.4), BD_Shape/affineimage2.cc (1.6), BD_Shape/affineimage3.cc
+	  (1.6), BD_Shape/affineimage4.cc (1.6), BD_Shape/affineimage5.cc
+	  (1.6), BD_Shape/affineimage6.cc (1.6), BD_Shape/affineimage7.cc
+	  (1.6), BD_Shape/affineimage8.cc (1.11), BD_Shape/affineimage9.cc
+	  (1.9), BD_Shape/affinepreimage1.cc (1.6),
+	  BD_Shape/affinepreimage2.cc (1.6), BD_Shape/affinepreimage3.cc
+	  (1.6), BD_Shape/affinepreimage4.cc (1.6),
+	  BD_Shape/affinepreimage5.cc (1.6), BD_Shape/ascii_dump_load1.cc
+	  (1.8), BD_Shape/ascii_dump_load2.cc (1.7),
+	  BD_Shape/bdsdifference1.cc (1.2), BD_Shape/bdsdifference2.cc
+	  (1.2), BD_Shape/bdsdifference3.cc (1.2),
+	  BD_Shape/bdsdifference4.cc (1.2), BD_Shape/bdsdifference5.cc
+	  (1.2), BD_Shape/bdsdifference6.cc (1.2),
+	  BD_Shape/bdsdifference7.cc (1.2), BD_Shape/bdshull1.cc (1.2),
+	  BD_Shape/bdshull2.cc (1.2), BD_Shape/bdshull3.cc (1.2),
+	  BD_Shape/bdshull4.cc (1.2), BD_Shape/bgp99extrapolation1.cc
+	  (1.2), BD_Shape/bhz03widening1.cc (1.2),
+	  BD_Shape/cc76extrapolation1.cc (1.5),
+	  BD_Shape/cc76extrapolation2.cc (1.6),
+	  BD_Shape/cc76extrapolation3.cc (1.5),
+	  BD_Shape/cc76extrapolation4.cc (1.7),
+	  BD_Shape/cc76extrapolation5.cc (1.5),
+	  BD_Shape/cc76extrapolation6.cc (1.7), BD_Shape/cc76narrowing1.cc
+	  (1.5), BD_Shape/cc76narrowing2.cc (1.5),
+	  BD_Shape/cc76narrowing3.cc (1.5), BD_Shape/cc76narrowing4.cc
+	  (1.6), BD_Shape/cc76narrowing5.cc (1.6),
+	  BD_Shape/ch78widening1.cc (1.5), BD_Shape/ch78widening2.cc (1.6),
+	  BD_Shape/ch78widening3.cc (1.5), BD_Shape/ch78widening4.cc (1.6),
+	  BD_Shape/ch78widening5.cc (1.6), BD_Shape/ch78widening6.cc (1.8),
+	  BD_Shape/ch78widening7.cc (1.5), BD_Shape/ch78widening8.cc (1.6),
+	  BD_Shape/closure1.cc (1.9), BD_Shape/concatenate1.cc (1.6),
+	  BD_Shape/concatenate2.cc (1.6), BD_Shape/concatenate3.cc (1.5),
+	  BD_Shape/concatenate4.cc (1.5), BD_Shape/concatenate5.cc (1.6),
+	  BD_Shape/constraints1.cc (1.8), BD_Shape/constraints2.cc (1.6),
+	  BD_Shape/contains1.cc (1.5), BD_Shape/contains2.cc (1.7),
+	  BD_Shape/contains3.cc (1.7), BD_Shape/empty1.cc (1.5),
+	  BD_Shape/empty2.cc (1.5), BD_Shape/empty3.cc (1.6),
+	  BD_Shape/empty4.cc (1.5), BD_Shape/empty5.cc (1.5),
+	  BD_Shape/equality1.cc (1.8), BD_Shape/exceptions1.cc (1.9),
+	  BD_Shape/exceptions2.cc (1.7), BD_Shape/exceptions3.cc (1.9),
+	  BD_Shape/fromgensys1.cc (1.5),
+	  BD_Shape/generalizedaffineimage1.cc (1.7),
+	  BD_Shape/generalizedaffineimage10.cc (1.6),
+	  BD_Shape/generalizedaffineimage11.cc (1.5),
+	  BD_Shape/generalizedaffineimage12.cc (1.5),
+	  BD_Shape/generalizedaffineimage13.cc (1.5),
+	  BD_Shape/generalizedaffineimage14.cc (1.9),
+	  BD_Shape/generalizedaffineimage2.cc (1.6),
+	  BD_Shape/generalizedaffineimage3.cc (1.7),
+	  BD_Shape/generalizedaffineimage4.cc (1.6),
+	  BD_Shape/generalizedaffineimage5.cc (1.6),
+	  BD_Shape/generalizedaffineimage6.cc (1.5),
+	  BD_Shape/generalizedaffineimage7.cc (1.6),
+	  BD_Shape/generalizedaffineimage8.cc (1.6),
+	  BD_Shape/generalizedaffineimage9.cc (1.5),
+	  BD_Shape/geomcovers1.cc (1.2), BD_Shape/h79widening1.cc (1.5),
+	  BD_Shape/intersection1.cc (1.5), BD_Shape/intersection2.cc (1.5),
+	  BD_Shape/intersection3.cc (1.6), BD_Shape/intersection4.cc (1.7),
+	  BD_Shape/intersection5.cc (1.7), BD_Shape/intersection6.cc (1.6),
+	  BD_Shape/intersection7.cc (1.6), BD_Shape/intersection8.cc (1.6),
+	  BD_Shape/limitedCC76extrapolation1.cc (1.5),
+	  BD_Shape/limitedCC76extrapolation2.cc (1.7),
+	  BD_Shape/limitedCC76extrapolation3.cc (1.7),
+	  BD_Shape/limitedCH78extrapolation1.cc (1.6),
+	  BD_Shape/limitedCH78extrapolation2.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation3.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation4.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation5.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation6.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation7.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation8.cc (1.5),
+	  BD_Shape/limitedCH78extrapolation9.cc (1.5),
+	  BD_Shape/limitedh79extrapolation1.cc (1.5),
+	  BD_Shape/mapspacedims1.cc (1.5), BD_Shape/mapspacedims2.cc (1.7),
+	  BD_Shape/mapspacedims3.cc (1.6), BD_Shape/mapspacedims4.cc (1.6),
+	  BD_Shape/maxspacedim.cc (1.8), BD_Shape/minconstraints1.cc (1.2),
+	  BD_Shape/relations1.cc (1.9), BD_Shape/relations2.cc (1.9),
+	  BD_Shape/relations3.cc (1.8), BD_Shape/relations4.cc (1.7),
+	  BD_Shape/relations5.cc (1.9), BD_Shape/removespacedims1.cc (1.6),
+	  BD_Shape/removespacedims2.cc (1.7), BD_Shape/removespacedims3.cc
+	  (1.7), BD_Shape/timeelapse1.cc (1.6), BD_Shape/timeelapse2.cc
+	  (1.5), BD_Shape/timeelapse3.cc (1.5), BD_Shape/timeelapse4.cc
+	  (1.5), BD_Shape/timeelapse5.cc (1.6), BD_Shape/universe1.cc
+	  (1.6), BD_Shape/writebdshape1.cc (1.3), BD_Shape/writebdshape2.cc
+	  (1.4), Polyhedron/CbecomesNNC1.cc (1.5),
+	  Polyhedron/NNCbecomesC1.cc (1.5), Polyhedron/NNCminimize1.cc
+	  (1.5), Polyhedron/NNCminimize2.cc (1.5),
+	  Polyhedron/NNCminimize3.cc (1.5), Polyhedron/NNCminimize4.cc
+	  (1.5), Polyhedron/NNCminimize5.cc (1.5),
+	  Polyhedron/NNCminimize6.cc (1.5), Polyhedron/addconstraint1.cc
+	  (1.5), Polyhedron/addconstraint2.cc (1.6),
+	  Polyhedron/addconstraint3.cc (1.5), Polyhedron/addconstraints1.cc
+	  (1.6), Polyhedron/addconstraints10.cc (1.6),
+	  Polyhedron/addconstraints11.cc (1.5),
+	  Polyhedron/addconstraints12.cc (1.5),
+	  Polyhedron/addconstraints13.cc (1.6),
+	  Polyhedron/addconstraints2.cc (1.5),
+	  Polyhedron/addconstraints3.cc (1.6),
+	  Polyhedron/addconstraints4.cc (1.5),
+	  Polyhedron/addconstraints5.cc (1.6),
+	  Polyhedron/addconstraints6.cc (1.5),
+	  Polyhedron/addconstraints7.cc (1.6),
+	  Polyhedron/addconstraints8.cc (1.6),
+	  Polyhedron/addconstraints9.cc (1.5), Polyhedron/addgenerator1.cc
+	  (1.6), Polyhedron/addgenerator2.cc (1.6),
+	  Polyhedron/addgenerator3.cc (1.5), Polyhedron/addgenerator4.cc
+	  (1.6), Polyhedron/addgenerator5.cc (1.6),
+	  Polyhedron/addgenerators1.cc (1.6), Polyhedron/addgenerators10.cc
+	  (1.6), Polyhedron/addgenerators11.cc (1.6),
+	  Polyhedron/addgenerators12.cc (1.6),
+	  Polyhedron/addgenerators13.cc (1.6), Polyhedron/addgenerators2.cc
+	  (1.6), Polyhedron/addgenerators3.cc (1.5),
+	  Polyhedron/addgenerators4.cc (1.5), Polyhedron/addgenerators5.cc
+	  (1.5), Polyhedron/addgenerators6.cc (1.6),
+	  Polyhedron/addgenerators7.cc (1.5), Polyhedron/addgenerators8.cc
+	  (1.6), Polyhedron/addgenerators9.cc (1.5),
+	  Polyhedron/addspacedims1.cc (1.6), Polyhedron/addspacedims10.cc
+	  (1.5), Polyhedron/addspacedims11.cc (1.5),
+	  Polyhedron/addspacedims12.cc (1.5), Polyhedron/addspacedims13.cc
+	  (1.5), Polyhedron/addspacedims2.cc (1.6),
+	  Polyhedron/addspacedims3.cc (1.7), Polyhedron/addspacedims4.cc
+	  (1.5), Polyhedron/addspacedims5.cc (1.5),
+	  Polyhedron/addspacedims6.cc (1.5), Polyhedron/addspacedims7.cc
+	  (1.5), Polyhedron/addspacedims8.cc (1.6),
+	  Polyhedron/addspacedims9.cc (1.5), Polyhedron/affineimage1.cc
+	  (1.6), Polyhedron/affineimage2.cc (1.5),
+	  Polyhedron/affineimage3.cc (1.5), Polyhedron/affineimage4.cc
+	  (1.6), Polyhedron/affineimage5.cc (1.6),
+	  Polyhedron/affineimage6.cc (1.7), Polyhedron/affineimage7.cc
+	  (1.5), Polyhedron/affineimage8.cc (1.5),
+	  Polyhedron/affineimage9.cc (1.5), Polyhedron/affinepreimage1.cc
+	  (1.5), Polyhedron/affinepreimage10.cc (1.5),
+	  Polyhedron/affinepreimage11.cc (1.3),
+	  Polyhedron/affinepreimage2.cc (1.5),
+	  Polyhedron/affinepreimage3.cc (1.6),
+	  Polyhedron/affinepreimage4.cc (1.5),
+	  Polyhedron/affinepreimage5.cc (1.5),
+	  Polyhedron/affinepreimage6.cc (1.5),
+	  Polyhedron/affinepreimage7.cc (1.5),
+	  Polyhedron/affinepreimage8.cc (1.6),
+	  Polyhedron/affinepreimage9.cc (1.5), Polyhedron/affinetrans.cc
+	  (1.6), Polyhedron/append1.cc (1.5), Polyhedron/append2.cc (1.5),
+	  Polyhedron/ascii_dump_load1.cc (1.5),
+	  Polyhedron/ascii_dump_load2.cc (1.5),
+	  Polyhedron/ascii_dump_load3.cc (1.5),
+	  Polyhedron/ascii_dump_load4.cc (1.5),
+	  Polyhedron/ascii_dump_load5.cc (1.5),
+	  Polyhedron/ascii_dump_load6.cc (1.6),
+	  Polyhedron/ascii_dump_load7.cc (1.5),
+	  Polyhedron/bgp99extrapolation1.cc (1.6),
+	  Polyhedron/bgp99extrapolation2.cc (1.6),
+	  Polyhedron/bhrz03widening1.cc (1.5),
+	  Polyhedron/bhrz03widening10.cc (1.6),
+	  Polyhedron/bhrz03widening11.cc (1.5),
+	  Polyhedron/bhrz03widening12.cc (1.5),
+	  Polyhedron/bhrz03widening13.cc (1.5),
+	  Polyhedron/bhrz03widening14.cc (1.5),
+	  Polyhedron/bhrz03widening15.cc (1.6),
+	  Polyhedron/bhrz03widening16.cc (1.5),
+	  Polyhedron/bhrz03widening17.cc (1.5),
+	  Polyhedron/bhrz03widening18.cc (1.5),
+	  Polyhedron/bhrz03widening19.cc (1.5),
+	  Polyhedron/bhrz03widening2.cc (1.5),
+	  Polyhedron/bhrz03widening3.cc (1.5),
+	  Polyhedron/bhrz03widening4.cc (1.5),
+	  Polyhedron/bhrz03widening5.cc (1.5),
+	  Polyhedron/bhrz03widening6.cc (1.5),
+	  Polyhedron/bhrz03widening7.cc (1.5),
+	  Polyhedron/bhrz03widening8.cc (1.5),
+	  Polyhedron/bhrz03widening9.cc (1.5), Polyhedron/bhz03widening1.cc
+	  (1.7), Polyhedron/bhz03widening2.cc (1.7),
+	  Polyhedron/bhz03widening3.cc (1.7), Polyhedron/bhz03widening4.cc
+	  (1.6), Polyhedron/bhz03widening5.cc (1.6),
+	  Polyhedron/bhz03widening6.cc (1.7), Polyhedron/bounded1.cc (1.6),
+	  Polyhedron/boundedaffineimage1.cc (1.4),
+	  Polyhedron/boundedaffineimage2.cc (1.3),
+	  Polyhedron/boundedaffineimage3.cc (1.3),
+	  Polyhedron/boundedaffinepreimage1.cc (1.3),
+	  Polyhedron/boundedaffinepreimage2.cc (1.3),
+	  Polyhedron/boundedaffinepreimage3.cc (1.3),
+	  Polyhedron/boundedbhrz03extrapolation1.cc (1.4),
+	  Polyhedron/boundedh79extrapolation1.cc (1.6),
+	  Polyhedron/boundingbox1.cc (1.7), Polyhedron/boundingbox2.cc
+	  (1.6), Polyhedron/boundingbox3.cc (1.6),
+	  Polyhedron/boundingbox4.cc (1.6), Polyhedron/boundingbox5.cc
+	  (1.6), Polyhedron/bounds1.cc (1.6), Polyhedron/bounds2.cc (1.5),
+	  Polyhedron/bug2.cc (1.4), Polyhedron/concatenate1.cc (1.5),
+	  Polyhedron/concatenate2.cc (1.6), Polyhedron/concatenate3.cc
+	  (1.5), Polyhedron/concatenate4.cc (1.5),
+	  Polyhedron/concatenate5.cc (1.5), Polyhedron/concatenate6.cc
+	  (1.6), Polyhedron/concatenate7.cc (1.4),
+	  Polyhedron/constraints1.cc (1.5), Polyhedron/constraints2.cc
+	  (1.6), Polyhedron/constraints3.cc (1.5),
+	  Polyhedron/constraints4.cc (1.6), Polyhedron/constraints5.cc
+	  (1.4), Polyhedron/contains1.cc (1.5), Polyhedron/contains2.cc
+	  (1.5), Polyhedron/contains3.cc (1.5), Polyhedron/contains4.cc
+	  (1.5), Polyhedron/contains5.cc (1.5), Polyhedron/disjoint1.cc
+	  (1.5), Polyhedron/disjoint2.cc (1.6), Polyhedron/disjoint3.cc
+	  (1.6), Polyhedron/dualhypercubes.cc (1.5), Polyhedron/empty1.cc
+	  (1.6), Polyhedron/equals1.cc (1.5), Polyhedron/exceptions1.cc
+	  (1.8), Polyhedron/exceptions2.cc (1.6), Polyhedron/exceptions3.cc
+	  (1.7), Polyhedron/expandspacedim1.cc (1.6),
+	  Polyhedron/expandspacedim2.cc (1.6), Polyhedron/foldspacedims1.cc
+	  (1.6), Polyhedron/foldspacedims2.cc (1.6),
+	  Polyhedron/generalizedaffineimage1.cc (1.6),
+	  Polyhedron/generalizedaffineimage10.cc (1.5),
+	  Polyhedron/generalizedaffineimage11.cc (1.6),
+	  Polyhedron/generalizedaffineimage12.cc (1.5),
+	  Polyhedron/generalizedaffineimage13.cc (1.4),
+	  Polyhedron/generalizedaffineimage14.cc (1.4),
+	  Polyhedron/generalizedaffineimage2.cc (1.6),
+	  Polyhedron/generalizedaffineimage3.cc (1.6),
+	  Polyhedron/generalizedaffineimage4.cc (1.6),
+	  Polyhedron/generalizedaffineimage5.cc (1.5),
+	  Polyhedron/generalizedaffineimage6.cc (1.6),
+	  Polyhedron/generalizedaffineimage7.cc (1.6),
+	  Polyhedron/generalizedaffineimage8.cc (1.5),
+	  Polyhedron/generalizedaffineimage9.cc (1.5),
+	  Polyhedron/generalizedaffinepreimage1.cc (1.3),
+	  Polyhedron/generalizedaffinepreimage2.cc (1.3),
+	  Polyhedron/generalizedaffinepreimage3.cc (1.3),
+	  Polyhedron/generalizedaffinepreimage4.cc (1.3),
+	  Polyhedron/generators1.cc (1.5), Polyhedron/generators2.cc (1.5),
+	  Polyhedron/generators3.cc (1.6), Polyhedron/generators4.cc (1.6),
+	  Polyhedron/generators5.cc (1.5), Polyhedron/generators6.cc (1.6),
+	  Polyhedron/generators7.cc (1.5), Polyhedron/geomcovers1.cc (1.7),
+	  Polyhedron/gramschmidt1.cc (1.2), Polyhedron/h79widening1.cc
+	  (1.5), Polyhedron/h79widening2.cc (1.5),
+	  Polyhedron/h79widening3.cc (1.5), Polyhedron/h79widening4.cc
+	  (1.5), Polyhedron/h79widening5.cc (1.6),
+	  Polyhedron/h79widening6.cc (1.5), Polyhedron/h79widening7.cc
+	  (1.5), Polyhedron/h79widening8.cc (1.5),
+	  Polyhedron/intersection1.cc (1.5), Polyhedron/intersection10.cc
+	  (1.6), Polyhedron/intersection11.cc (1.6),
+	  Polyhedron/intersection2.cc (1.5), Polyhedron/intersection3.cc
+	  (1.5), Polyhedron/intersection4.cc (1.6),
+	  Polyhedron/intersection5.cc (1.6), Polyhedron/intersection6.cc
+	  (1.6), Polyhedron/intersection7.cc (1.5),
+	  Polyhedron/intersection8.cc (1.6), Polyhedron/intersection9.cc
+	  (1.6), Polyhedron/limitedbhrz03extrapolation1.cc (1.5),
+	  Polyhedron/limitedh79extrapolation1.cc (1.5),
+	  Polyhedron/limitedh79extrapolation2.cc (1.5),
+	  Polyhedron/limitedh79extrapolation3.cc (1.5),
+	  Polyhedron/limitedh79extrapolation4.cc (1.6),
+	  Polyhedron/linearpartition1.cc (1.5),
+	  Polyhedron/linearpartition2.cc (1.5),
+	  Polyhedron/linearpartition3.cc (1.5),
+	  Polyhedron/linearpartition4.cc (1.6), Polyhedron/linearsystem1.cc
+	  (1.2), Polyhedron/linexpression1.cc (1.5),
+	  Polyhedron/mapspacedims1.cc (1.6), Polyhedron/mapspacedims2.cc
+	  (1.5), Polyhedron/mapspacedims3.cc (1.5),
+	  Polyhedron/mapspacedims4.cc (1.5), Polyhedron/matrix1.cc (1.5),
+	  Polyhedron/max_min1.cc (1.6), Polyhedron/max_min2.cc (1.6),
+	  Polyhedron/maxspacedim1.cc (1.5), Polyhedron/mc91.cc (1.6),
+	  Polyhedron/membytes1.cc (1.6), Polyhedron/membytes2.cc (1.5),
+	  Polyhedron/memory1.cc (1.7), Polyhedron/memory2.cc (1.10),
+	  Polyhedron/minconstraints1.cc (1.5),
+	  Polyhedron/minconstraints2.cc (1.6),
+	  Polyhedron/minconstraints3.cc (1.5),
+	  Polyhedron/minconstraints4.cc (1.5), Polyhedron/mingenerators1.cc
+	  (1.5), Polyhedron/mingenerators2.cc (1.6),
+	  Polyhedron/mingenerators3.cc (1.5), Polyhedron/numberinput1.cc
+	  (1.15), Polyhedron/onepoint.cc (1.6), Polyhedron/permute.cc
+	  (1.5), Polyhedron/polydifference1.cc (1.5),
+	  Polyhedron/polydifference2.cc (1.5),
+	  Polyhedron/polydifference3.cc (1.5),
+	  Polyhedron/polydifference4.cc (1.6),
+	  Polyhedron/polydifference5.cc (1.5),
+	  Polyhedron/polydifference6.cc (1.5),
+	  Polyhedron/polydifference7.cc (1.6),
+	  Polyhedron/polydifference8.cc (1.5),
+	  Polyhedron/polydifference9.cc (1.6), Polyhedron/polyhull1.cc
+	  (1.5), Polyhedron/polyhull10.cc (1.5), Polyhedron/polyhull11.cc
+	  (1.5), Polyhedron/polyhull2.cc (1.6), Polyhedron/polyhull3.cc
+	  (1.6), Polyhedron/polyhull4.cc (1.5), Polyhedron/polyhull5.cc
+	  (1.6), Polyhedron/polyhull6.cc (1.5), Polyhedron/polyhull7.cc
+	  (1.5), Polyhedron/polyhull8.cc (1.6), Polyhedron/polyhull9.cc
+	  (1.6), Polyhedron/polypowerset1.cc (1.7), Polyhedron/powerset1.cc
+	  (1.3), Polyhedron/primalsimplex1.cc (1.3),
+	  Polyhedron/primalsimplex2.cc (1.3), Polyhedron/randphull1.cc
+	  (1.6), Polyhedron/randphull2.cc (1.7), Polyhedron/relations1.cc
+	  (1.5), Polyhedron/relations10.cc (1.5), Polyhedron/relations11.cc
+	  (1.5), Polyhedron/relations12.cc (1.5), Polyhedron/relations13.cc
+	  (1.5), Polyhedron/relations14.cc (1.5), Polyhedron/relations15.cc
+	  (1.5), Polyhedron/relations16.cc (1.5), Polyhedron/relations17.cc
+	  (1.6), Polyhedron/relations18.cc (1.5), Polyhedron/relations19.cc
+	  (1.6), Polyhedron/relations2.cc (1.6), Polyhedron/relations3.cc
+	  (1.5), Polyhedron/relations4.cc (1.5), Polyhedron/relations5.cc
+	  (1.5), Polyhedron/relations6.cc (1.6), Polyhedron/relations7.cc
+	  (1.5), Polyhedron/relations8.cc (1.5), Polyhedron/relations9.cc
+	  (1.5), Polyhedron/removespacedims1.cc (1.5),
+	  Polyhedron/removespacedims10.cc (1.6),
+	  Polyhedron/removespacedims2.cc (1.5),
+	  Polyhedron/removespacedims3.cc (1.6),
+	  Polyhedron/removespacedims4.cc (1.5),
+	  Polyhedron/removespacedims5.cc (1.6),
+	  Polyhedron/removespacedims6.cc (1.5),
+	  Polyhedron/removespacedims7.cc (1.5),
+	  Polyhedron/removespacedims8.cc (1.5),
+	  Polyhedron/removespacedims9.cc (1.5), Polyhedron/smm1.cc (1.5),
+	  Polyhedron/timeelapse1.cc (1.5), Polyhedron/timeelapse2.cc (1.6),
+	  Polyhedron/timeelapse3.cc (1.5), Polyhedron/timeelapse4.cc (1.5),
+	  Polyhedron/timeelapse5.cc (1.6), Polyhedron/timeelapse6.cc (1.5),
+	  Polyhedron/timeelapse7.cc (1.6), Polyhedron/timeelapse8.cc (1.6),
+	  Polyhedron/timeelapse9.cc (1.6), Polyhedron/topclosed1.cc (1.6),
+	  Polyhedron/topclosed2.cc (1.6), Polyhedron/topclosed3.cc (1.5),
+	  Polyhedron/topclosure1.cc (1.5), Polyhedron/topclosure2.cc (1.6),
+	  Polyhedron/topclosure3.cc (1.5), Polyhedron/topclosure4.cc (1.6),
+	  Polyhedron/universe1.cc (1.5), Polyhedron/universe2.cc (1.5),
+	  Polyhedron/universe3.cc (1.5), Polyhedron/universe4.cc (1.5),
+	  Polyhedron/universe5.cc (1.5), Polyhedron/universe6.cc (1.5),
+	  Polyhedron/universe7.cc (1.5), Polyhedron/watchdog1.cc (1.6),
+	  Polyhedron/writeconsys1.cc (1.5), Polyhedron/writegensys1.cc
+	  (1.5), Polyhedron/writegensys2.cc (1.6),
+	  Polyhedron/writegensys3.cc (1.5), Polyhedron/writepolyhedron1.cc
+	  (1.5), Polyhedron/writepolyhedron2.cc (1.5),
+	  Polyhedron/writepolyhedron3.cc (1.5),
+	  Polyhedron/writerelation1.cc (1.5), Polyhedron/writevariable1.cc
+	  (1.5): All the test programs in Polyhedron and BD_Shape rewritten
+	  so as to direct their output to nout and vnout without explicitly
+	  checking preprocessor variables.
+
+2005-12-14 Wednesday 11:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.30), print.cc (1.17), print.hh (1.21):
+	  Defined the output streams nout and vnout to help in the control
+	  of the noisy level of test programs. By default, the helper print
+	  functions now print on ostream nout. Also added in ppl_tests.hh
+	  an using directive for the whole PPL namespace and a using
+	  declaration for std::endl.
+
+2005-12-14 Wednesday 11:33  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[5,5,7]): Documentation stuff removed from
+	  implementation file.	Removed redundant parentheses.
+
+2005-12-13 Tuesday 14:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.49): Always add a space between
+	  "catch" and "(".
+
+2005-12-13 Tuesday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.10): Remove trailing whitespace; always
+	  add a space between "catch" and "(".
+
+2005-12-13 Tuesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.141): Always add a space between "catch"
+	  and the following "(".
+
+2005-12-13 Tuesday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.13): Remove trailing
+	  whitespace.
+
+2005-12-12 Monday 21:36  Matthew Mundell
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_Generator.cc,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator_System.defs.hh, src/Grid_nonpublic.cc,
+	  src/Grid_public.cc, tests/Grid/addcongruences1.cc,
+	  tests/Grid/addgenerator1.cc, tests/Grid/addspacedims1.cc,
+	  tests/Grid/addspacedims2.cc, tests/Grid/affinedim1.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/affinepreimage1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/bounds1.cc,
+	  tests/Grid/certificate1.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruences1.cc, tests/Grid/congruencesystem2.cc,
+	  tests/Grid/contains1.cc, tests/Grid/contains2.cc,
+	  tests/Grid/coveringbox1.cc, tests/Grid/coveringbox2.cc,
+	  tests/Grid/disjoint1.cc, tests/Grid/equals1.cc,
+	  tests/Grid/expandspacedim1.cc, tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generator1.cc, tests/Grid/generators1.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid2.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc, tests/Grid/join3.cc,
+	  tests/Grid/limitedextrapolation1.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/mingenerators1.cc,
+	  tests/Grid/pointed1.cc, tests/Grid/relations1.cc,
+	  tests/Grid/relations2.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosed1.cc, tests/Grid/topclosure1.cc,
+	  tests/Grid/widening1.cc
+	  (grids.[88,46,6,13,12,9,58,115,3,15,11,9,3,9,9,4,9,5,3,4,6,5,10,6,4,9,7,3,4,6,6,5,6,6,5,3,3,24,20,8,7,9,7,11,7,4,6,11,4,3,3,5,6,10,7,6,4,3,8]):
+	  Update Grid::map_space_dimensions() to use set_empty.  Make
+	  Grid_Generator(Generator&) explicit.	Enable insertion of
+	  parameters directly into a Grid.  Update Grid::is_universe,
+	  Grid::map_space_dimensions() and all the tests to use the grid
+	  generator creation functions.  Correct the expected values of a
+	  few tests that use parameters.
+
+2005-12-12 Monday 17:49  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[87,57,114]): Take out old parameter hiding.
+
+2005-12-12 Monday 16:21  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.defs.hh, LP_Problem.inlines.hh
+	  (simplex.[4,4,6]): Written some code in `PPL::LP_Problem::OK()'.
+	  Properly renamed `opt_kind' to `opt_mode'.
+
+2005-12-12 Monday 13:49  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[12,8]): Implement operator<<(s,ggs).
+
+2005-12-12 Monday 13:27  Andrea Cimino
+
+	* src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  tests/Polyhedron/LP_Problem1.cc (simplex.[3,5,3]): Added the
+	  method `PPL::LP_Problem::optimal_value()'.  Modified also
+	  LP_Problem1.cc: all seems to work as expected.
+
+2005-12-10 Saturday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (simplex.1): Exploiting the new
+	  LP_Problem class to build a precise BD_Shape starting from the
+	  constraints of a polyhedron when SIMPLEX_COMPLEXITY is allowed.
+
+2005-12-09 Friday 20:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.52): Some reorganization of the methods
+	  in documentation sections.
+
+2005-12-08 Thursday 20:26  Andrea Cimino
+
+	* src/LP_Problem.inlines.hh (simplex.4): Fixed a bug showed by
+	  `ppl_lpsol'.
+
+2005-12-08 Thursday 20:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.2): Corrected a bug in the
+	  call of ppl_LP_Problem_optimizing_point().
+
+2005-12-08 Thursday 15:22  Andrea Cimino
+
+	* src/: LP_Problem.cc, LP_Problem.inlines.hh (simplex.[3,3]):
+	  Some switches fixed.
+
+2005-12-08 Thursday 07:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.165), interfaces/Prolog/Prolog_interface.dox (1.137),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.106): Added support for
+	  SWI-Prolog's unbounded numbers.  This requires Prolog version
+	  5.5.40 or later version.
+
+2005-12-07 Wednesday 17:31  Andrea Cimino
+
+	* src/LP_Problem.cc, src/LP_Problem.defs.hh,
+	  src/LP_Problem.inlines.hh, tests/Polyhedron/LP_Problem1.cc,
+	  tests/Polyhedron/LP_Problem2.cc (simplex.[2,2,2,2,2]):
+	  LP_Problem prototypes modified to match the C interface.
+	  Modified also the tests.  The code needs to be hardly tested.
+
+2005-12-06 Tuesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (simplex.1): Using the new interface
+	  to the LP_Problem class.
+
+2005-12-06 Tuesday 16:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc, ppl_c.h.in (simplex.[1,1]): Added
+	  tentative interface for the LP_Problem class.
+
+2005-12-06 Tuesday 16:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh, globals.types.hh, simplex.cc
+	  (simplex.[2,1,1]): Enumeration Optimization_Kind renamed as
+	  Optimization_Mode.
+
+2005-12-06 Tuesday 13:24  Andrea Cimino
+
+	* doc/devref.doxyconf-html.in (simplex.1):
+	  Modified to produce PPL::LP_Problem documentation.
+
+2005-12-05 Monday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.22), Watchdog/ChangeLog (1.12): Updated.
+
+2005-12-05 Monday 20:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/limitedCH78extrapolation1.cc (1.5): Changed so as
+	  to rflect the improved precision of the widening.
+
+2005-12-05 Monday 19:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.105): Corrected trivial errors in
+	  calls to function that became a method.
+
+2005-12-05 Monday 19:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.56): Corrected references to the
+	  manual.
+
+2005-12-05 Monday 19:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: ch78widening6.cc (1.7), ch78widening8.cc (1.5):
+	  The known results updated to reflect the increased precision of
+	  the widening operator.
+
+2005-12-05 Monday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.104): The operator
+	  CH78_widening_assign() is now implemented as specified in the SAS
+	  paper BHMZ05, returning immediately if there has been a change in
+	  the affine dimension of the arguments, so that it is well-defined
+	  on the domain of BDSs.
+
+2005-12-05 Monday 19:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.51): Corrected references to the
+	  documentation. Do escape < and > when writing doxygen
+	  documentation.
+
+2005-12-05 Monday 19:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.26), Polyhedron.defs.hh
+	  (1.285): Corrected references to the documentation.
+
+2005-12-05 Monday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bounding_Box.defs.hh (1.10): Formatted doxygen commands
+	  according to STANDARDS. Corrected a couple of references to the
+	  manual.
+
+2005-12-05 Monday 19:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Bounding_Box.cc (1.12): Removed duplicated doxygen comment.
+
+2005-12-05 Monday 19:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.179): Removed some redundant anchors
+	  (prefer using the anchors automatically defined by sectioning
+	  commands).  Added subsection on the widening and extrapolation
+	  operators for BDSs.
+
+2005-12-05 Monday 14:54  Andrea Cimino
+
+	* src/Constraint_System.defs.hh, src/LP_Problem.cc,
+	  src/LP_Problem.defs.hh, src/LP_Problem.inlines.hh,
+	  src/LP_Problem.types.hh, src/Linear_Expression.defs.hh,
+	  src/Makefile.am, tests/Polyhedron/LP_Problem1.cc,
+	  tests/Polyhedron/LP_Problem2.cc, tests/Polyhedron/Makefile.am
+	  (simplex.[1,1,1,1,1,1,1,1,1,1]):
+	  Added the LP_Problem class to the branch, derived from the
+	  simplex.cc code.  The class is fully functional, but lacks of
+	  some features like `incrementality': in this case the problem is
+	  solved from scratch.	Added also a couple of tests playing with
+	  the class, but other tests are needed.  For significant tests a
+	  change to the C interface and to the	`ppl_lpsol' tool is
+	  required.  LP_Problem declared `friend class' of
+	  `Constraint_System' and `Linear_Expression' to allow compiling.
+
+2005-12-05 Monday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.cc (1.1), BD_Shape.defs.hh (1.50),
+	  BD_Shape.inlines.hh (1.103), Makefile.am (1.130): A couple of
+	  non-inline and non-template functions placed in BD_Shape.cc.	A
+	  few functions have become private members of the BD_Shape class.
+	  Some exception throwers are now declared static.  A few methods
+	  have been renamed for consistency.
+
+2005-12-05 Monday 14:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.13), DB_Matrix.inlines.hh (1.18):
+	  Avoid indirect inclusion dependencies.  Corrected a typo in a
+	  preprocessor variable name.
+
+2005-12-05 Monday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.types.hh (1.8): Also declare the
+	  Extended_Number_Policy type.
+
+2005-12-05 Monday 14:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.136): Corrected a few
+	  typos and removed a repeated paragraph.
+
+2005-12-05 Monday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Ask_Tell.inlines.hh (1.6), Bounding_Box.cc (1.11),
+	  Constraint_System.cc (1.14), DB_Matrix.defs.hh (1.12),
+	  DB_Matrix.inlines.hh (1.17), DB_Row.inlines.hh (1.15),
+	  Generator_System.cc (1.14), Linear_Row.cc (1.14),
+	  Linear_System.cc (1.31), Matrix.cc (1.87),
+	  Polyhedra_Powerset.inlines.hh (1.33), Polyhedron_public.cc
+	  (1.68), Row.cc (1.92), Saturation_Matrix.cc (1.6): Do not flush
+	  too often the ostream buffer when performing normal output.
+
+2005-12-05 Monday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.42), Checked_Number.inlines.hh
+	  (1.46): Added a missing \relates doxygen command.
+
+2005-12-05 Monday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.49), BD_Shape.inlines.hh (1.102):
+	  Helper functions forget_*_constraints_on_var() are now provate
+	  methods of class BD_Shape.  Corrected the implementation of
+	  method swap.
+
+2005-12-04 Sunday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.178): Draftet a section on BD shapes.
+
+2005-12-03 Saturday 15:33  Matthew Mundell
+
+	* src/Grid_Generator_System.inlines.hh (grids.6): Update insert to
+	  construct the generator directly into the constructor call.
+
+2005-12-03 Saturday 15:33  Matthew Mundell
+
+	* src/Grid_Generator_System.defs.hh (grids.7): Update the matrix
+	  diagram in the add_universe_rows_and_columns description.
+
+2005-12-03 Saturday 15:31  Matthew Mundell
+
+	* src/Grid_Generator.inlines.hh (grids.11): Update
+	  Grid_Generator(g) to swap with g instead of copying g.  Clean
+	  some comments.  Move the equality operators to better positions.
+	  Update line and point to use Grid_Generator(g).
+
+2005-12-03 Saturday 15:19  Matthew Mundell
+
+	* tests/Grid/generator1.cc (grids.2): Insert test8, to check
+	  construction from a Generator reference.
+
+2005-12-03 Saturday 15:09  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (grids.12): Move Grid_Generator(g) to
+	  the beginning of the public section.	Improve the
+	  Grid_Generator(g) description.
+
+2005-12-03 Saturday 12:55  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, generator1.cc (grids.[53,1]): Add
+	  generator1, to test Grid_Generator.
+
+2005-12-03 Saturday 12:21  Matthew Mundell
+
+	* src/Generator_System.defs.hh (grids.10): Keep the Grid friend
+	  declaration.
+
+2005-12-03 Saturday 12:13  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.11): Add a note that
+	  ascii_load is a copy of Generator_System::ascii_load.
+
+2005-12-03 Saturday 12:12  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+	  (grids.[11,10]): Add ascii_dump and ascii_load wrappers.
+
+2005-12-03 Saturday 12:04  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (grids.11): Update main to output the
+	  test name.  Convert variable names to A, B and C.
+
+2005-12-03 Saturday 00:38  Matthew Mundell
+
+	* src/: Generator.defs.hh, Grid.defs.hh, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh, Grid_Generator_System.cc,
+	  Grid_Generator_System.defs.hh, Grid_Generator_System.inlines.hh,
+	  Grid_chdims.cc, Grid_conversion.cc, Grid_nonpublic.cc,
+	  Grid_public.cc, Grid_simplify.cc
+	  (grids.[16,86,10,9,10,6,5,26,30,56,113,41]): Stabilize the grid
+	  friend declarations in Generator.
+
+	  Hence, in Grid
+
+	    - update the rest of the simplify methods to use Grid_Generator
+
+	    - convert reduce_pc_with_pc to a template
+
+	    - update to the Grid_Generator_System method names,
+
+	  and in Grid_Generator
+
+	    - add negate(gg,start,end)
+
+	    - add private wrapper methods topology, size, set_is_line and
+	      set_is_parameter,
+
+	  and in Grid_Generator_System
+
+	    - reduce insert, keeping only the relevant parts, and move
+	      linear_system_insert into insert
+
+	    - revert the affine image parameter list to the
+	  Generator_System
+	      form
+
+	    - take out Grid_Generator_System(topology) and add_row(g)
+
+	  Clean some comments.	Add some comments.  Take out the
+	  directed-out Grid code left in in the last few commits.
+
+2005-12-02 Friday 22:16  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+	  (grids.[85,25,29,55,112,40]): Reduce the dependency on the
+	  Grid_Generator_System Grid friend declaration:
+
+	    - declare function multiply_grid a static method
+
+	    - replace ggs::num_columns calls with equivalents which use
+		  ggs::space_dimension
+
+	    - leave handling of topology, pending rows and the sorted flag
+	  to
+		  Grid_Generator_System
+
+	    - replace add_zero_columns calls with insertions of all-zero
+	      parameters
+
+	    - replace private use of Grid_Generator_System and parents with
+	  use
+	      of remove_space_dimensions and recycling_insert
+
+	    - update to the Grid_Generator_System method names
+
+	    - replace direct resizing of gen_sys with sized system
+	  construction,
+	      or insertion of an all-zero parameter
+
+	    - update time_elapse_assign to leave any origin point in the
+	      resulting gen_sys
+
+	    - update conversion and minimization methods to use
+		  Grid_Generator_System instead of Linear_System.
+
+	  Take the resizing of gen_sys out of the add_generator(g) empty
+	  case, as the generator system is always the right size.
+
+	  Add const to the add_space_dimensions `dims' argument
+	  declarations.
+
+	  Take the topology and sorted checks out of OK.
+
+2005-12-02 Friday 22:13  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.9): Update
+	  add_universe_rows_and_columns to unset pending rows.	Update
+	  insert(gg) so that at most it adjusts the space dimension if an
+	  all-zero parameter is given.
+
+2005-12-02 Friday 20:45  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh
+	  (grids.[8,5]): Add recycling_insert, remove_space_dimensions,
+	  remove_higher_space_dimensions and an OK sorted check.  Move
+	  add_row to the private section.  Keep the Grid friend
+	  declaration, for now.
+
+2005-12-02 Friday 20:41  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+	  (grids.[9,8]): Add access operators.
+
+2005-12-02 Friday 17:38  Matthew Mundell
+
+	* src/Grid_public.cc (grids.111): Take the topology specification
+	  out of the generator system construction in Grid(n,k).
+
+2005-12-02 Friday 17:36  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.54): Reduce dependency on the
+	  Grid_Generator_System Grid friend declaration: let
+	  Grid_Generator_System handle pending rows and the sorted flag,
+	  define out the NNC handling in construct(gs,), replace manual
+	  topology and dimension adjustment with calls to
+	  Grid_Generator_System(dim) and replace a Grid_Generator_System
+	  num_columns call with an equivalent which uses
+	  Grid_Generator_System::space_dimension().
+
+2005-12-02 Friday 17:28  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[7,4,4]): Add a topology
+	  check to OK.	Update `insert' to clear the sorted flag after
+	  inserting.  Update constructors to set the sorted flag.  Add
+	  wrapper methods max_space_dimension, space_dimension and
+	  num_lines.  Add Grid_Generator_System(dim).
+
+2005-12-02 Friday 16:13  Matthew Mundell
+
+	* src/Grid_public.cc (grids.110): Update
+	  generalized_affine_image(v,e,d,m) to insert the parameter via
+	  function `parameter'.
+
+2005-12-02 Friday 16:12  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[6,3,3]): Add method
+	  linear_system_insert, a slightly modified copy of
+	  Linear_System::insert.  Update insert to use linear_system_insert
+	  instead of trying to handle parameters specially.  Make
+	  ascii_dump() a real (vs inline) method.  Set the affine_image
+	  grid parameter automatic value to true.
+
+2005-12-02 Friday 16:05  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.inlines.hh (grids.[5,7]):
+	  Implement method parameter locally to work around the
+	  normalization in Generator::ray.
+
+2005-12-02 Friday 16:04  Matthew Mundell
+
+	* src/Grid_Generator.defs.hh (grids.8): Keep the Grid friend
+	  declaration.
+
+2005-12-01 Thursday 22:43  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.10): Turn off test4 (includes ray
+	  insertion), for now.
+
+2005-12-01 Thursday 22:34  Matthew Mundell
+
+	* src/Grid_public.cc (grids.109): Update add_generator(g) to only
+	  adjust the divisor for points, for now.
+
+2005-12-01 Thursday 22:23  Matthew Mundell
+
+	* src/Grid_public.cc (grids.108): Revert is_universe to create a
+	  generator for each dimension.
+
+2005-12-01 Thursday 22:01  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.28): Improve a comment slightly.
+
+2005-12-01 Thursday 22:01  Matthew Mundell
+
+	* src/Grid_Generator.inlines.hh (grids.6): Add a temporary note.
+
+2005-12-01 Thursday 22:01  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.5): Update insert to work
+	  around the Linear_System::insert normalization check when
+	  inserting a parameter.
+
+2005-12-01 Thursday 21:46  Matthew Mundell
+
+	* src/Grid_public.cc (grids.107): Revert add_generator to multiply
+	  the given point after it has been inserted.
+
+2005-12-01 Thursday 20:44  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[4,7,5,53,106]): Add a Grid_Generator::divisor method
+	  which returns a writable reference.  Update Grid to use this
+	  method instead of casting.  Revert
+	  Grid::generalized_affine_image(v,e,d,m) to insert the parameter
+	  in stages.
+
+2005-12-01 Thursday 20:00  Matthew Mundell
+
+	* tests/Grid/membytes1.cc (grids.3): Update function add_generator
+	  to use Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 19:59  Matthew Mundell
+
+	* src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+	  (grids.[6,4]): Add methods total_memory_in_bytes and
+	  external_memory_in_bytes.
+
+2005-12-01 Thursday 19:35  Matthew Mundell
+
+	* tests/Grid/congruencesystem2.cc (grids.9): Update
+	  satisfies_all_congruences to use Generator instead of
+	  Grid_Generator.
+
+2005-12-01 Thursday 19:21  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.14): Update test4 to add all
+	  generators.
+
+2005-12-01 Thursday 19:10  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[84,52,105]): Reduce the dependency on the Grid_Generator
+	  Grid friend declaration: turn off hiding of parameters,
+	  temporarily let rays be inserted as parameters, always get the
+	  divisor via the divisor method, switch to use the
+	  Generator_System wrapper methods, multiply generators via
+	  Grid_Generator::multiply, construct grids by inserting rows
+	  instead of modifying inserted rows, compare generator systems in
+	  OK via is_equal_to, and swap entire rows via coefficient_swap.
+
+	  Take out the OK NC check and the add_generator NC handling.
+
+2005-12-01 Thursday 18:56  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.27): Update upper_triangular to use
+	  Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 18:56  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.24): In both add_space_dimensions
+	  methods use add_universe_rows_and_columns instead of manually
+	  adding the rows.
+
+2005-12-01 Thursday 18:55  Matthew Mundell
+
+	* src/: Grid_Generator_System.cc, Grid_Generator_System.defs.hh,
+	  Grid_Generator_System.inlines.hh (grids.[4,2,2]): Add
+	  Generator_System wrappers Grid_Generator_System(gg) and
+	  add_row(gg), and new method add_universe_rows_and_columns.  Use
+	  Generator instead of Grid_Generator in const_iterator.
+
+2005-12-01 Thursday 18:52  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh (grids.[3,5,3]): Add many Generator
+	  wrapper methods, and new methods multiply and coefficient_swap.
+	  Update OK to call methods directly, instead of via a reference.
+
+2005-12-01 Thursday 18:49  Matthew Mundell
+
+	* src/: Scalar_Products.cc, Scalar_Products.defs.hh,
+	  Scalar_Products.inlines.hh (grids.[4,4,4]): Use Grid_Generator
+	  instead of Generator in the Grid related methods.  Add
+	  Grid_Generator versions of homogeneous_sign(e,g) and
+	  homogeneous_assign(z,e,g).  Take out
+	  Topology_Adjusted_Scalar_Product_Assign.
+
+2005-12-01 Thursday 18:45  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[35,21]): Use Grid_Generator instead of Generator.
+
+2005-12-01 Thursday 18:44  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.23): Turn of ray test for now.
+
+2005-11-30 Wednesday 20:09  Matthew Mundell
+
+	* src/: Generator.defs.hh, Generator_System.defs.hh,
+	  Grid_Generator.defs.hh (grids.[15,9,4]): Comment inclusions above
+	  the line instead of at the line end, to please
+	  utils/build_header.
+
+2005-11-30 Wednesday 19:56  Matthew Mundell
+
+	* src/Grid_Generator_System.cc (grids.3): Update OK to call the
+	  updated Grid_Generator::OK, and to use Grid_Generator_System for
+	  the generator system type.
+
+2005-11-30 Wednesday 19:53  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[2,3]):
+	  Add OK method.
+
+2005-11-30 Wednesday 19:53  Matthew Mundell
+
+	* src/: Generator.cc, Generator.defs.hh (grids.[6,14]): Take out
+	  the OK method flag parameter hack.
+
+2005-11-30 Wednesday 19:52  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.13): Add only NC generators
+	  for now.
+
+2005-11-30 Wednesday 17:49  Matthew Mundell
+
+	* src/: Grid_Generator.cc, Grid_Generator.defs.hh,
+	  Grid_Generator.inlines.hh, Grid_Generator_System.cc, Makefile.am
+	  (grids.[1,2,2,2,12]): Inherit privately from Generator.  Add enum
+	  Type.  Add methods is_equivalent_to and swap.  Add
+	  operator<<(s,g) friend declaration.
+
+2005-11-30 Wednesday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.161): Testing the notification of commit messages.
+
+2005-11-30 Wednesday 17:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.160): Added an item.
+
+2005-11-30 Wednesday 16:55  Matthew Mundell
+
+	* src/Grid_public.cc, src/Grid_simplify.cc,
+	  src/Linear_Expression.defs.hh, src/Makefile.am,
+	  tests/ppl_test.hh, tests/Grid/addcongruence1.cc,
+	  tests/Grid/addcongruences1.cc, tests/Grid/addconstraint1.cc,
+	  tests/Grid/addconstraints1.cc, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
+	  tests/Grid/affinedim1.cc, tests/Grid/affineimage1.cc,
+	  tests/Grid/affinepreimage1.cc, tests/Grid/bhz03widening1.cc,
+	  tests/Grid/bounded1.cc, tests/Grid/boundingbox1.cc,
+	  tests/Grid/boundingbox2.cc, tests/Grid/concatenate1.cc,
+	  tests/Grid/congruence1.cc, tests/Grid/congruencesystem1.cc,
+	  tests/Grid/congruencesystem2.cc, tests/Grid/contains1.cc,
+	  tests/Grid/contains2.cc, tests/Grid/coveringbox1.cc,
+	  tests/Grid/coveringbox2.cc, tests/Grid/disjoint1.cc,
+	  tests/Grid/equals1.cc, tests/Grid/expandspacedim1.cc,
+	  tests/Grid/foldspacedims1.cc,
+	  tests/Grid/generalizedaffineimage1.cc,
+	  tests/Grid/generalizedaffineimage2.cc,
+	  tests/Grid/generalizedaffinepreimage1.cc,
+	  tests/Grid/generalizedaffinepreimage2.cc,
+	  tests/Grid/generators1.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/grid3.cc,
+	  tests/Grid/griddifference1.cc, tests/Grid/intersection1.cc,
+	  tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/join1.cc, tests/Grid/join2.cc, tests/Grid/join3.cc,
+	  tests/Grid/limitedextrapolation1.cc, tests/Grid/mapspacedims1.cc,
+	  tests/Grid/maxmin1.cc, tests/Grid/membytes1.cc,
+	  tests/Grid/mingenerators1.cc, tests/Grid/pointed1.cc,
+	  tests/Grid/relations1.cc, tests/Grid/removespacedims1.cc,
+	  tests/Grid/removespacedims2.cc, tests/Grid/timeelapse1.cc,
+	  tests/Grid/topclosure1.cc, tests/Grid/widening1.cc,
+	  tests/Grid/writecongruencesystem.cc, src/Generator.defs.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Grid.defs.hh, src/Grid.inlines.hh,
+	  src/Grid_Generator.defs.hh, src/Grid_Generator.inlines.hh,
+	  src/Grid_Generator.types.hh, src/Grid_Generator_System.cc,
+	  src/Grid_Generator_System.defs.hh,
+	  src/Grid_Generator_System.inlines.hh,
+	  src/Grid_Generator_System.types.hh, src/Grid_chdims.cc,
+	  src/Grid_conversion.cc, src/Grid_nonpublic.cc
+	  (grids.[104,39,9,11,15,7,2,2,11,12,10,8,2,8,8,3,3,8,4,5,10,8,8,5,3,8,6,2,3,5,5,4,5,5,4,2,22,19,6,7,6,8,6,9,6,3,5,10,3,2,2,2,4,9,6,5,2,7,6,13,18,8,83,45,1,1,1,1,1,1,1,23,26,51]):
+	  Rename find_variation_template in ppl_test.hh to find_variation.
+	  Update all tests to call find_variation directly instead of
+	  calling a wrapped instantiation of find_varition.  Update
+	  find_variation to always use nout.  Take the abort call out of
+	  find_variation.
+
+	  Add classes Grid_Generator and Grid_Generator_System.  Update the
+	  grid classes and all tests to use these instead of Generator and
+	  Generator_System.  Take the grid hacks out of Generator_System.
+
+	  Update a comment in Grid_conversion.cc.
+
+2005-11-30 Wednesday 15:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.41), Checked_Number.inlines.hh
+	  (1.45): Disabled ROUND_NOT_NEEDED debug check.
+
+2005-11-30 Wednesday 13:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.48): Removed trailing whitespace.
+
+2005-11-30 Wednesday 12:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.48): Removed trailing whitespace.
+
+2005-11-29 Tuesday 21:56  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.40): fpu_check_inexact is always
+	  set to true with assertions enabled for debugging purpose.
+
+2005-11-29 Tuesday 18:55  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.47),
+	  interfaces/Prolog/ppl_prolog.icc (1.164),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.36),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.31),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.81),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.105),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.72),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.99), src/BD_Shape.inlines.hh
+	  (1.101), src/Bounding_Box.cc (1.10), src/Bounding_Box.inlines.hh
+	  (1.11), src/Checked_Number.defs.hh (1.39),
+	  src/Checked_Number.inlines.hh (1.44), src/DB_Matrix.inlines.hh
+	  (1.16), src/Polyhedron.inlines.hh (1.126),
+	  src/Polyhedron_nonpublic.cc (1.58), src/Rounding_Dir.defs.hh
+	  (1.5), src/checked.inlines.hh (1.28),
+	  tests/Random_Number_Generator.inlines.hh (1.4),
+	  tests/BD_Shape/closure1.cc (1.8): Reorganized rounding modes.
+
+2005-11-29 Tuesday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.20): Removed trailing whitespace.
+
+2005-11-28 Monday 21:08  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.34): Compare to zero explicitly
+	  in normalize_moduli.
+
+2005-11-28 Monday 21:04  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.22): Update
+	  add_space_dimensions_and_embed and
+	  add_space_dimensions_and_project to use set_empty to empty the
+	  grid.  Update concatenate_assign to handle empty congruence
+	  systems.
+
+2005-11-28 Monday 21:01  Matthew Mundell
+
+	* src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_simplify.cc
+	  (grids.[44,50,38]): Improve a trace message slightly.  Improve a
+	  few comments.  Update the congruence system simplify method to
+	  accept empty congruence systems.
+
+2005-11-28 Monday 20:54  Matthew Mundell
+
+	* src/Grid_public.cc (grids.103): Improve a few comments.  Update
+	  intersection_assign to add the `y' congruence system only if it
+	  contains rows.  Take the setting of the up-to-date flag out of
+	  Grid(n,k).
+
+2005-11-28 Monday 20:50  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.10): Improve a comment slightly.
+
+2005-11-28 Monday 16:03  Matthew Mundell
+
+	* src/Grid_public.cc (grids.102): Update Grid(const Grid&) to
+	  ensure that the out of date systems are the correct size.
+
+2005-11-28 Monday 15:59  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.21): Update remove_space_dimensions and
+	  remove_higher_space_dimensions to call set_empty when the grid is
+	  empty.
+
+2005-11-28 Monday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.100): The more precise convex
+	  combination is now also used in method
+	  generalized_affine_image(). Common code factored out in a couple
+	  of helper functions.
+
+2005-11-28 Monday 13:27  Matthew Mundell
+
+	* src/Congruence_System.inlines.hh (grids.11): Align comment.
+
+2005-11-28 Monday 13:27  Matthew Mundell
+
+	* src/Grid_public.cc (grids.101): Take out query (set_zero_dim_univ
+	  will insert a point, which adjusts the space dimension).
+
+2005-11-28 Monday 11:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.sty (1.23): "newcommand"s needed for the documentation
+	  for the grid domain added.
+
+2005-11-28 Monday 10:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.99): The computation of convex
+	  combinations in the general case of affine images has been
+	  simplified and properly commented.
+
+2005-11-27 Sunday 23:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/ppl.sty (grids.4): Improved comments.
+
+2005-11-27 Sunday 19:03  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.37): In the generator simplify method
+	  also assert sys is OK in the empty case.  In both cases pass
+	  false to OK.
+
+2005-11-27 Sunday 18:54  Matthew Mundell
+
+	* src/Grid_public.cc (grids.100): Leave congruences as they are
+	  (update_generators will simplify them).
+
+2005-11-27 Sunday 18:27  Matthew Mundell
+
+	* src/Grid_public.cc (grids.99): Assert false if relation_with(cg)
+	  finds a closure point.
+
+2005-11-27 Sunday 18:05  Matthew Mundell
+
+	* src/Row.defs.hh (grids.7): Take out the Grid friend declaration.
+
+2005-11-27 Sunday 18:04  Matthew Mundell
+
+	* src/Polyhedron_public.cc (grids.9): Note a possible improvement
+	  in add_congruences(cgs).
+
+2005-11-27 Sunday 18:02  Matthew Mundell
+
+	* src/Matrix.defs.hh (grids.5): Mention size and capacity in the
+	  add_recycled_row parameter description.
+
+2005-11-27 Sunday 17:59  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.36): In the congruence simplify
+	  method always erase rows with erase_to_end.  Take out the
+	  capacity setting after erases.  Add three temporary comments.
+	  Improve two comments.  Compare to zero explicitly in two
+	  assertions.
+
+2005-11-27 Sunday 17:53  Matthew Mundell
+
+	* src/Constraint.defs.hh (grids.9): Take out the Congruence_System
+	  friend declaration.
+
+2005-11-27 Sunday 17:52  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.33): Update insert to use
+	  Constraint::space_dimension instead of the Constraint::size and
+	  Constraint::is_necessarily_closed.
+
+2005-11-27 Sunday 17:48  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Linear_Expression.defs.hh, Linear_Expression.inlines.hh
+	  (grids.[17,32,18,8,3]): Get the size in Congruence(c) via the
+	  space_dimension().  Add flag `capacity' to Congruence(le,m).	Use
+	  Linear_Expression(le,sz) in the Congruence %= operators.  Take
+	  out Linear_Expression(le,sz,capacity).
+
+2005-11-27 Sunday 17:37  Matthew Mundell
+
+	* STANDARDS (grids.8): Take out section "Standards for the Test
+	  Programs".
+
+2005-11-25 Friday 15:53  Matthew Mundell
+
+	* src/Row.defs.hh (grids.6): Take out the Congruence_System friend
+	  declaration.
+
+2005-11-25 Friday 14:08  Matthew Mundell
+
+	* src/Polyhedron_public.cc (grids.8): Take out a query that relates
+	  to the trunk.
+
+2005-11-25 Friday 14:04  Matthew Mundell
+
+	* tests/Grid/affinepreimage1.cc (grids.7): Simplify a congruence in
+	  test8.
+
+2005-11-25 Friday 14:00  Matthew Mundell
+
+	* STANDARDS (grids.7): Mention that OK is called in
+	  find_variation_template.  Give an example of calling
+	  find_variation_template.
+
+2005-11-25 Friday 13:57  Matthew Mundell
+
+	* src/Matrix.cc (grids.6): Improve a comment in add_recycled_row.
+
+2005-11-25 Friday 11:42  Matthew Mundell
+
+	* src/: Grid_chdims.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_widenings.cc (grids.[20,49,98,9]): In is_included_in merge
+	  some BE_LAZY=0 code into the BE_LAZY=1 case, and check if `x' is
+	  empty after minimization when BE_LAZY is 0.  In minimize() call
+	  simplify instead of update_generators and update_congruences,
+	  where possible.  Reduce all update_congruence calls to account
+	  for the fact the resulting grid always contains at least one
+	  point.
+
+2005-11-25 Friday 11:29  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.43): Keep the shrink_covering_box and
+	  get_covering_box dimension compatibility checks.
+
+2005-11-25 Friday 11:28  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.82): Improve the update_congruences() and
+	  minimize() descriptions.
+
+2005-11-24 Thursday 13:49  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.31): Take out Polyhedron friend
+	  declaration.
+
+2005-11-24 Thursday 13:14  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.42): In the covering box grid
+	  constructor return immediately after setting empty when a
+	  universe interval is encountered.
+
+2005-11-24 Thursday 12:37  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.25): Move TRACE definition into the
+	  PPL namespace.  #undef TRACE afterwards.
+
+2005-11-24 Thursday 12:37  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.35): Replace the tracing stream with
+	  cerr and a macro called TRACE.
+
+2005-11-24 Thursday 12:12  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.48): In bounds(expr,char*) use
+	  Generator::is_line_or_ray.
+
+2005-11-24 Thursday 12:05  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.24): Replace the tracing stream
+	  with cerr and macro TRACE.
+
+2005-11-23 Wednesday 20:53  Matthew Mundell
+
+	* src/Generator_System.cc (grids.17): Re-enable the OK assertion.
+
+2005-11-23 Wednesday 20:51  Matthew Mundell
+
+	* src/: Generator.cc, Generator.defs.hh (grids.[5,12]): Extend the
+	  OK method check_normalization argument to other
+	  polyhedron-specific checks.
+
+2005-11-23 Wednesday 19:12  Matthew Mundell
+
+	* src/Grid_public.cc (grids.97): In add_recycled_generators
+	  minimize via update_generators instead of via minimize.
+
+2005-11-23 Wednesday 18:37  Matthew Mundell
+
+	* src/: Grid_public.cc, Grid_nonpublic.cc (grids.[96,47]): In
+	  add_recycled_generators_and_minimize minimize via
+	  update_generators and update_congruences instead of via minimize.
+
+2005-11-23 Wednesday 17:43  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (grids.20): Make
+	  has_linear_equalities public.
+
+2005-11-23 Wednesday 17:41  Matthew Mundell
+
+	* src/Checked_Number.inlines.hh (grids.7): Update policy
+	  ROUND_DEFAULT to ROUND_DEFAULT_FUNCTION.
+
+2005-11-23 Wednesday 17:33  Matthew Mundell
+
+	* src/: Grid_nonpublic.cc, Grid_public.cc (grids.[46,95]): Use
+	  Generator::is_line_or_ray instead of Generator::is_point.
+
+2005-11-23 Wednesday 17:02  Matthew Mundell
+
+	* src/Linear_Expression.defs.hh (grids.7): Declare
+	  Congruence_System a friend.
+
+2005-11-23 Wednesday 17:01  Matthew Mundell
+
+	* src/Generator_System.cc (grids.16): Include compiler.hh.  Resolve
+	  two merge conflicts.
+
+2005-11-23 Wednesday 17:00  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence_System.cc,
+	  Generator.defs.hh, Grid_nonpublic.cc, Grid_public.cc,
+	  Scalar_Products.cc, Scalar_Products.defs.hh,
+	  Scalar_Products.inlines.hh, Scalar_Products.types.hh
+	  (grids.[30,32,11,45,94,3,3,3,3]): Move the grid scalar product
+	  functions into class Scalar_Products.  Add class
+	  Topology_Adjusted_Scalar_Product_Assign for
+	  Congruence_System::satisfies_all_congruences(g).
+
+2005-11-23 Wednesday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, NEWS, README.configure, STANDARDS, TODO, configure.ac,
+	  doc/definitions.dox, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/ppl.sty,
+	  doc/user.doxyconf-html.in, doc/user.doxyconf-latex.in,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected2_int16,
+	  interfaces/Prolog/XSB/expected2_int16_a,
+	  interfaces/Prolog/XSB/expected2_int32,
+	  interfaces/Prolog/XSB/expected2_int32_a,
+	  interfaces/Prolog/XSB/expected2_int64,
+	  interfaces/Prolog/XSB/expected2_int64_a,
+	  interfaces/Prolog/XSB/expected2_int8,
+	  interfaces/Prolog/XSB/expected2_int8_a,
+	  interfaces/Prolog/XSB/expected2_mpz,
+	  interfaces/Prolog/XSB/expected2_mpz_a,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int32_a,
+	  interfaces/Prolog/XSB/expected3_int64,
+	  interfaces/Prolog/XSB/expected3_int64_a,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/expected3_int8_a,
+	  interfaces/Prolog/XSB/expected3_mpz,
+	  interfaces/Prolog/XSB/expected3_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int16,
+	  interfaces/Prolog/XSB/expected_clpq2_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int32,
+	  interfaces/Prolog/XSB/expected_clpq2_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int64,
+	  interfaces/Prolog/XSB/expected_clpq2_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq2_int8,
+	  interfaces/Prolog/XSB/expected_clpq2_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz,
+	  interfaces/Prolog/XSB/expected_clpq2_mpz_a,
+	  interfaces/Prolog/XSB/expected_clpq_int16,
+	  interfaces/Prolog/XSB/expected_clpq_int16_a,
+	  interfaces/Prolog/XSB/expected_clpq_int32,
+	  interfaces/Prolog/XSB/expected_clpq_int32_a,
+	  interfaces/Prolog/XSB/expected_clpq_int64,
+	  interfaces/Prolog/XSB/expected_clpq_int64_a,
+	  interfaces/Prolog/XSB/expected_clpq_int8,
+	  interfaces/Prolog/XSB/expected_clpq_int8_a,
+	  interfaces/Prolog/XSB/expected_clpq_mpz,
+	  interfaces/Prolog/XSB/expected_clpq_mpz_a,
+	  interfaces/Prolog/XSB/expected_int16,
+	  interfaces/Prolog/XSB/expected_int16_a,
+	  interfaces/Prolog/XSB/expected_int32,
+	  interfaces/Prolog/XSB/expected_int32_a,
+	  interfaces/Prolog/XSB/expected_int64,
+	  interfaces/Prolog/XSB/expected_int64_a,
+	  interfaces/Prolog/XSB/expected_int8,
+	  interfaces/Prolog/XSB/expected_int8_a,
+	  interfaces/Prolog/XSB/expected_mpz,
+	  interfaces/Prolog/XSB/expected_mpz_a,
+	  interfaces/Prolog/XSB/expected_pchk_int16,
+	  interfaces/Prolog/XSB/expected_pchk_int16_a,
+	  interfaces/Prolog/XSB/expected_pchk_int32,
+	  interfaces/Prolog/XSB/expected_pchk_int32_a,
+	  interfaces/Prolog/XSB/expected_pchk_int64,
+	  interfaces/Prolog/XSB/expected_pchk_int64_a,
+	  interfaces/Prolog/XSB/expected_pchk_int8,
+	  interfaces/Prolog/XSB/expected_pchk_int8_a,
+	  interfaces/Prolog/XSB/expected_pchk_mpz,
+	  interfaces/Prolog/XSB/expected_pchk_mpz_a,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  m4/ac_check_sicstus_prolog.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_check_xsb_prolog.m4, m4/lib-ld.m4, m4/lib-link.m4,
+	  m4/lib-prefix.m4, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.inlines.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Congruence.defs.hh, src/Constraint.defs.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/Determinate.defs.hh, src/Float.cc,
+	  src/Float.defs.hh, src/Float.inlines.hh, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Init.cc, src/Linear_Expression.defs.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.inlines.hh, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Result.defs.hh,
+	  src/Rounding.defs.hh, src/Rounding.types.hh,
+	  src/Rounding_Dir.defs.hh, src/Rounding_Dir.inlines.hh,
+	  src/Scalar_Products.cc, src/Scalar_Products.defs.hh,
+	  src/Scalar_Products.inlines.hh, src/Scalar_Products.types.hh,
+	  src/checked.cc, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/conversion.cc, src/float.types.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/globals.types.hh,
+	  src/mp_numeric_limits.hh, src/ppl-config.cc.in,
+	  src/scalar_products.cc, src/scalar_products.defs.hh,
+	  src/scalar_products.inlines.hh, src/simplex.cc, src/simplify.cc,
+	  tests/ppl_test.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/affinedimension1.cc,
+	  tests/BD_Shape/affineimage10.cc, tests/BD_Shape/affineimage8.cc,
+	  tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/bdsdifference1.cc,
+	  tests/BD_Shape/bdsdifference2.cc,
+	  tests/BD_Shape/bdsdifference3.cc,
+	  tests/BD_Shape/bdsdifference4.cc,
+	  tests/BD_Shape/bdsdifference5.cc,
+	  tests/BD_Shape/bdsdifference6.cc,
+	  tests/BD_Shape/bdsdifference7.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/ch78widening4.cc, tests/BD_Shape/closure1.cc,
+	  tests/BD_Shape/constraints1.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+	  tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/mapspacedims2.cc, tests/BD_Shape/mapspacedims3.cc,
+	  tests/BD_Shape/minconstraints1.cc,
+	  tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc, tests/BD_Shape/run_tests,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/numberinput1.cc,
+	  tests/Polyhedron/primalsimplex1.cc,
+	  tests/Polyhedron/primalsimplex2.cc
+	  (grids.[2,4,2,6,16,8,9,5,2,3,4,2,5,5,3,4,2,2,2,4,3,6,3,4,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,4,2,2,2,2,2,3,3,3,3,3,3,3,2,3,2,1,1,1,3,3,6,6,3,3,2,8,6,29,8,3,4,3,2,2,4,2,4,2,3,3,10,4,15,7,2,4,6,5,3,10,5,4,5,6,6,7,8,6,5,6,7,4,3,3,2,2,2,2,2,2,2,4,5,8,5,7,6,4,5,4,3,2,5,4,2,2,2,5,6,3,5,2,14,6,3,3,2,2,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,3,3,4,3,3,3,3,3,2,2,2,2,2,3,2,2,2,2,2,3,3,3,2,3,2,2,2,10,2,3,2,2]):
+	  Sixth merge from main trunk.	(Note: build is currently broken.)
+
+2005-11-23 Wednesday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.98): Corrected an ambiguous call
+	  problem when coefficients are checked_int64.
+
+2005-11-23 Wednesday 00:06  Matthew Mundell
+
+	* src/: Congruence_System.cc, Grid.defs.hh, Grid_minimize.cc,
+	  Grid_nonpublic.cc, Grid_public.cc (grids.[31,81,24,44,93]): Move
+	  the code in the static minimize methods into update_congruences
+	  and update_generators.  Call update_congruences and
+	  update_generators instead of the static minimize methods in
+	  methods add_recycled_congruences_and_minimize and
+	  add_recycled_generators_and_minimize.  In OK test congruence to
+	  generator conversion via a temporary grid instead of a temporary
+	  congruence system.
+
+2005-11-22 Tuesday 12:08  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.23): Improve two comments.
+
+2005-11-22 Tuesday 11:34  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_conversion.cc (grids.[80,22]): Make
+	  conversion void of return.
+
+2005-11-22 Tuesday 11:21  Matthew Mundell
+
+	* src/Grid_public.cc (grids.92): Leave dim_kinds at the end of the
+	  ASCII dump.  Resign to reading dim_kind into a short temporary
+	  int in ascii_load.
+
+2005-11-22 Tuesday 11:01  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (grids.9): Use a local namespace.
+	  Merge test10 and test11.  Add is_trivial_* tests of the form b %=
+	  0 mod m where b <> 0 mod m.
+
+2005-11-22 Tuesday 10:38  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[16,28]): Consider
+	  b %= 0 mod m where b <> 0 mod m as false in is_trivial_false.
+	  Leave the constant term be after factoring out the modulus in
+	  normalize.
+
+2005-11-22 Tuesday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.4): Added new rounding modes
+	  ROUND_NOT_NEEDED and ROUND_DONT_CARE.
+
+2005-11-22 Tuesday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (grids.1): file Rounding_Dir.defs.hh was
+	  added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-11-22 Tuesday 07:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.defs.hh (1.3): Added a couple of comments.
+
+2005-11-21 Monday 16:29  Matthew Mundell
+
+	* tests/Grid/isuniverse1.cc (grids.5): Use a local namespace.
+	  Insert test4, where the gird is zero dimension empty.  Add tests
+	  with the systems in various states of minimization and
+	  up-to-date'ness.
+
+2005-11-21 Monday 16:02  Matthew Mundell
+
+	* src/Grid_public.cc (grids.91): In is_universe check for a single
+	  integrality congruence if the congruences are minimized, use a
+	  single temporary generator instead of creating a temporary grid,
+	  and take out the gen_sys check.
+
+2005-11-21 Monday 15:58  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.27): Correct is_trivial_true doc.
+
+2005-11-21 Monday 15:48  Elena Mazzi
+
+	* src/BD_Shape.defs.hh (1.47), src/BD_Shape.inlines.hh (1.97),
+	  tests/BD_Shape/Makefile.am (1.28),
+	  tests/BD_Shape/bdsdifference1.cc (1.1),
+	  tests/BD_Shape/bdsdifference2.cc (1.1),
+	  tests/BD_Shape/bdsdifference3.cc (1.1),
+	  tests/BD_Shape/bdsdifference4.cc (1.1),
+	  tests/BD_Shape/bdsdifference5.cc (1.1),
+	  tests/BD_Shape/bdsdifference6.cc (1.1),
+	  tests/BD_Shape/bdsdifference7.cc (1.1),
+	  tests/BD_Shape/exceptions1.cc (1.8),
+	  tests/BD_Shape/polydifference1.cc (1.7),
+	  tests/BD_Shape/polydifference2.cc (1.5),
+	  tests/BD_Shape/polydifference3.cc (1.5),
+	  tests/BD_Shape/polydifference4.cc (1.5),
+	  tests/BD_Shape/polydifference5.cc (1.6),
+	  tests/BD_Shape/polydifference6.cc (1.5),
+	  tests/BD_Shape/polydifference7.cc (1.2), tests/BD_Shape/run_tests
+	  (1.10): Method BD_Shape::poly_difference_assign() renamed
+	  BD_Shape::bds_difference_assign().  Corrected a bug in
+	  BD_Shape::bds_difference_assign().
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference1.cc (grids.1): file
+	  bdsdifference1.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference2.cc (grids.1): file
+	  bdsdifference2.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference3.cc (grids.1): file
+	  bdsdifference3.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference4.cc (grids.1): file
+	  bdsdifference4.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference5.cc (grids.1): file
+	  bdsdifference5.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference6.cc (grids.1): file
+	  bdsdifference6.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/bdsdifference7.cc (grids.1): file
+	  bdsdifference7.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-21 Monday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (grids.1): file run_tests was added on
+	  branch grids on 2005-11-23 13:24:08 +0000
+
+2005-11-21 Monday 15:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.96): Added a couple of missing inline
+	  declarations.  Let definitions of a few inline functions occur
+	  before their first use.
+
+2005-11-21 Monday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.10),
+	  generalizedaffineimage14.cc (1.8): Removed the last CHECKME's
+	  from the known results.
+
+2005-11-20 Sunday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_pchk_int32 (1.2),
+	  tests/expected_pchk_int32 (1.3): Updated.
+
+2005-11-20 Sunday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32 (grids.1): file
+	  expected_pchk_int32 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq_int16 (1.2),
+	  XSB/expected_pchk_int16 (1.2), tests/expected_clpq_int16 (1.2),
+	  tests/expected_pchk_int16 (1.3): Updated.
+
+2005-11-20 Sunday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16 (grids.1): file
+	  expected_clpq_int16 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16 (grids.1): file
+	  expected_pchk_int16 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.159): New to-do item.
+
+2005-11-20 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int8_a (1.2),
+	  XSB/expected_pchk_int8_a (1.2), tests/expected_clpq2_int8_a
+	  (1.2), tests/expected_pchk_int8_a (1.3): Updated.
+
+2005-11-20 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8_a (grids.1): file
+	  expected_clpq2_int8_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8_a (grids.1): file
+	  expected_pchk_int8_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_clpq2_int32_a (1.2),
+	  XSB/expected_clpq_int16_a (1.2), XSB/expected_pchk_int16_a (1.2),
+	  XSB/expected_pchk_int32_a (1.2), XSB/expected_pchk_int64_a (1.2),
+	  tests/expected_clpq2_int32_a (1.2), tests/expected_clpq_int16_a
+	  (1.2), tests/expected_pchk_int16_a (1.3),
+	  tests/expected_pchk_int32_a (1.3): Updated.
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32_a (grids.1): file
+	  expected_clpq2_int32_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int16_a (grids.1): file
+	  expected_clpq_int16_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int16_a (grids.1): file
+	  expected_pchk_int16_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int32_a (grids.1): file
+	  expected_pchk_int32_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64_a (grids.1): file
+	  expected_pchk_int64_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.38), expected2_int16
+	  (1.5), expected2_int16_a (1.4), expected2_int32 (1.4),
+	  expected2_int32_a (1.3), expected2_int64 (1.3), expected2_int64_a
+	  (1.3), expected2_int8 (1.4), expected2_int8_a (1.3),
+	  expected2_mpz (1.3), expected2_mpz_a (1.3), expected3_int16
+	  (1.3), expected3_int16_a (1.3), expected3_int32 (1.3),
+	  expected3_int32_a (1.2), expected3_int64 (1.2), expected3_int64_a
+	  (1.2), expected3_int8 (1.4), expected3_int8_a (1.2),
+	  expected3_mpz (1.2), expected3_mpz_a (1.2), expected_clpq2_int16
+	  (1.1), expected_clpq2_int16_a (1.1), expected_clpq2_int32 (1.1),
+	  expected_clpq2_int32_a (1.1), expected_clpq2_int64 (1.1),
+	  expected_clpq2_int64_a (1.1), expected_clpq2_int8 (1.1),
+	  expected_clpq2_int8_a (1.1), expected_clpq2_mpz (1.1),
+	  expected_clpq2_mpz_a (1.1), expected_clpq_int16 (1.1),
+	  expected_clpq_int16_a (1.1), expected_clpq_int32 (1.1),
+	  expected_clpq_int32_a (1.1), expected_clpq_int64 (1.1),
+	  expected_clpq_int64_a (1.1), expected_clpq_int8 (1.1),
+	  expected_clpq_int8_a (1.1), expected_clpq_mpz (1.1),
+	  expected_clpq_mpz_a (1.1), expected_int16 (1.3), expected_int16_a
+	  (1.3), expected_int32 (1.3), expected_int32_a (1.3),
+	  expected_int64 (1.3), expected_int64_a (1.3), expected_int8
+	  (1.4), expected_int8_a (1.4), expected_mpz (1.3), expected_mpz_a
+	  (1.3), expected_pchk_int16 (1.1), expected_pchk_int16_a (1.1),
+	  expected_pchk_int32 (1.1), expected_pchk_int32_a (1.1),
+	  expected_pchk_int64 (1.1), expected_pchk_int64_a (1.1),
+	  expected_pchk_int8 (1.1), expected_pchk_int8_a (1.1),
+	  expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1): Test files
+	  are now named as for the other Prolog systems.
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16 (grids.1): file
+	  expected_clpq2_int16 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int16_a (grids.1): file
+	  expected_clpq2_int16_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int32 (grids.1): file
+	  expected_clpq2_int32 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64 (grids.1): file
+	  expected_clpq2_int64 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int64_a (grids.1): file
+	  expected_clpq2_int64_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_int8 (grids.1): file
+	  expected_clpq2_int8 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz (grids.1): file
+	  expected_clpq2_mpz was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq2_mpz_a (grids.1): file
+	  expected_clpq2_mpz_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32 (grids.1): file
+	  expected_clpq_int32 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int32_a (grids.1): file
+	  expected_clpq_int32_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64 (grids.1): file
+	  expected_clpq_int64 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int64_a (grids.1): file
+	  expected_clpq_int64_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8 (grids.1): file
+	  expected_clpq_int8 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_int8_a (grids.1): file
+	  expected_clpq_int8_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz (grids.1): file
+	  expected_clpq_mpz was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_clpq_mpz_a (grids.1): file
+	  expected_clpq_mpz_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64 (altnum.1): file
+	  expected_pchk_int64 was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int64 (grids.1): file
+	  expected_pchk_int64 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_int8 (grids.1): file
+	  expected_pchk_int8 was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_mpz (altnum.1): file
+	  expected_pchk_mpz was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_mpz (grids.1): file
+	  expected_pchk_mpz was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_mpz_a (altnum.1): file
+	  expected_pchk_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:05 +0000
+
+2005-11-20 Sunday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected_pchk_mpz_a (grids.1): file
+	  expected_pchk_mpz_a was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-20 Sunday 16:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected2_int8 (1.3), XSB/expected3_int8
+	  (1.3), tests/expected_clpq2_int8 (1.2), tests/expected_pchk_int8
+	  (1.3): Updated.
+
+2005-11-20 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.14): Temporary hack to avoid
+	  failure of `make check'.
+
+2005-11-20 Sunday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/numberinput1.cc (1.13): Removed another instance
+	  of undue reliance on default rounding mode.
+
+2005-11-20 Sunday 00:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.95): Use rounding up in the definition
+	  of stop_points[] in BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.15): DB_Matrix<T>::ascii_load() was
+	  not failing in case of a conversion error.
+
+2005-11-19 Saturday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.defs.hh (1.11): Added some full stops.
+
+2005-11-19 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.14): DB_Row::OK() is now more
+	  informative upon failure, unless NDEBUG is defined.
+
+2005-11-19 Saturday 20:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.94): Another correction in
+	  BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.93): Fixed the definition of
+	  stop_points[] in BD_Shape<T>::CC76_extrapolation_assign().
+
+2005-11-19 Saturday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.92), DB_Matrix.inlines.hh (1.14):
+	  Fixed a copy and paste bug in the distance functions.  No longer
+	  rely on default rounding mode for extended numbers.
+
+2005-11-19 Saturday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.13), GMP_Integer.inlines.hh (1.8):
+	  Remove overloadings of raw_value() with an mpq_class argument.
+
+2005-11-19 Saturday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.9), affineimage9.cc (1.8):
+	  Fixed ambiguous calls to rectilinear_distance_assign().
+
+2005-11-19 Saturday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.27): XFAIL_TESTS should be empty
+	  here.
+
+2005-11-19 Saturday 16:47  Abramo Bagnara
+
+	* src/: Bounding_Box.cc (1.9), Bounding_Box.inlines.hh (1.10),
+	  Checked_Number.defs.hh (1.38), Checked_Number.inlines.hh (1.43),
+	  Polyhedron.inlines.hh (1.125): Don't permit rounding direction
+	  omission when it's relevant.
+
+2005-11-19 Saturday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.9): Temporarily let polydifference7
+	  be an XFAIL test, so as to allow systematic testing of all
+	  incarnations of BD_Shape using tinderbox.
+
+2005-11-19 Saturday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.8), affineimage9.cc (1.7):
+	  Try to use the distance computation so as to detect when a
+	  computed result is ok even if different from the known result
+	  (not really sure this one was the intended use of these distance
+	  functions).
+
+2005-11-19 Saturday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.91): Previous change reverted.
+
+2005-11-18 Friday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.90): Removed several useless
+	  invocations of raw_value().
+
+2005-11-18 Friday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh (1.12), GMP_Integer.inlines.hh (1.7):
+	  Defined overloaded raw_value() functions that are the identity
+	  functions on mpq_class& and const mpq_class&, respectively.  This
+	  avoids surprises when raw_value() is applied to an mpq_class
+	  object.  The problem is caused by the C++ interface of GMP, which
+	  defines an implicit constructor for mpz_class from an object of
+	  type mpq_class.
+
+2005-11-18 Friday 20:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.7), affineimage9.cc (1.6),
+	  affinepreimage5.cc (1.5), generalizedaffineimage13.cc (1.4): The
+	  expected results modified accoring to the new precision expected
+	  from method affine_image().
+
+2005-11-18 Friday 20:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.89): The precision of affine_image()
+	  improved further.
+
+2005-11-18 Friday 17:31  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.19): In concatenate_assign improve some
+	  comments and split an assert into two.
+
+2005-11-18 Friday 17:30  Matthew Mundell
+
+	* tests/Grid/concatenate1.cc (grids.4): Define tests in a local
+	  namespace.  Add a test where the second grid is empty.  Add tests
+	  for zero dimension grids and grids that are empty due to the
+	  congruence system.  In all tests call find_variation only on the
+	  grid under test and only after concatenating.
+
+2005-11-18 Friday 14:53  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.30): Add an extra loop to
+	  satisfies_all_congruences so that the scalar product is
+	  multiplied by the divisor only as required.
+
+2005-11-18 Friday 14:28  Matthew Mundell
+
+	* src/Grid_chdims.cc, tests/Grid/removespacedims1.cc
+	  (grids.[18,8]): Add test6 (where the variable set includes the
+	  first dim) and test7 (where the result contains an all-zero
+	  parameter).  Define the tests within a local namespace.
+
+2005-11-18 Friday 13:30  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.21): Reduce the number of known_gr
+	  congruences in test15.
+
+2005-11-18 Friday 13:03  Matthew Mundell
+
+	* tests/Grid/removespacedims1.cc (grids.7): Enable test4.  Rename
+	  test1 test5.	Add a simple test as test1.
+
+2005-11-18 Friday 12:46  Matthew Mundell
+
+	* tests/Grid/intersection2.cc (grids.7): Modify test7 slightly.
+
+2005-11-18 Friday 12:40  Matthew Mundell
+
+	* tests/Grid/congruencesystem1.cc (grids.7): Neaten formatting.
+	  Take out list of methods that could be tested.
+
+2005-11-18 Friday 09:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.26), run_tests (1.8): Let
+	  BD_Shape<mpq> be the first one to be tested.
+
+2005-11-17 Thursday 15:35  Matthew Mundell
+
+	* tests/Grid/foldspacedims1.cc (grids.4): Correct two comments.
+	  Add test11, in which a relational grid becomes a grid that is
+	  smaller than universe.
+
+2005-11-17 Thursday 15:20  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.15), checked_ext.inlines.hh (1.26),
+	  checked_float.inlines.hh (1.54), checked_mpz.inlines.hh (1.33):
+	  Removed traling whitespace.
+
+2005-11-17 Thursday 14:14  Matthew Mundell
+
+	* tests/Grid/congruencesystem2.cc (grids.7): Add a local namespace.
+	  Fit fulfils to satisfies_all_congruence.  Take out the closure
+	  point tests.	Add tests where the divisor is greater than one.
+
+2005-11-17 Thursday 13:33  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (grids.8): Resolve a query (the two
+	  grids should be equal).
+
+2005-11-17 Thursday 13:19  Matthew Mundell
+
+	* tests/Grid/addspacedims2.cc (grids.7): Take out two simple
+	  queries.  Use equalities where possible to create the test5 known
+	  congruence system.
+
+2005-11-17 Thursday 12:58  Matthew Mundell
+
+	* src/scalar_products.cc (grids.4): Clean a
+	  reduced_scalar_product_assign comment.
+
+2005-11-17 Thursday 12:51  Matthew Mundell
+
+	* src/Grid_Certificate.cc (grids.8): Format returns consistently.
+	  Quote variables consistently in comments.  Resign to creating a
+	  temporary certificate in compare(gr).
+
+2005-11-17 Thursday 12:15  Matthew Mundell
+
+	* src/scalar_products.defs.hh (grids.5): Keep
+	  homogeneous_scalar_product_sign, which is used in method
+	  `bounds'.
+
+2005-11-17 Thursday 10:14  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.29): Fixed proper use of rounding
+	  direction.
+
+2005-11-17 Thursday 09:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.25): Added a guideline regarding trailing
+	  whitespace, as well as an hint for exploiting the power of emacs
+	  in this respect (thanks to Matthew Mundell for pointing this
+	  out).
+
+2005-11-17 Thursday 09:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.88), simplex.cc (1.32): Removed
+	  trailing whitespace.
+
+2005-11-17 Thursday 07:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.7): Spurious line removed.
+
+2005-11-17 Thursday 07:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (grids.1): file closure1.cc was added
+	  on branch grids on 2005-11-23 13:24:07 +0000
+
+2005-11-16 Wednesday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.6): Distance computations enabled.
+
+2005-11-16 Wednesday 20:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpq.inlines.hh (1.28): Quick and dirty (very dirty)
+	  hack to provide mpq-based checked numbers with some sqrt
+	  capability.
+
+2005-11-16 Wednesday 20:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.13): Fixed
+	  Euclidean_Distance_Specialization.  Avoided a compiler warning.
+	  Factorized some common code.
+
+2005-11-16 Wednesday 18:12  Matthew Mundell
+
+	* src/scalar_products.defs.hh (grids.4): Keep
+	  homogeneous_scalar_product_assign, which is used in max_min.
+
+2005-11-16 Wednesday 18:03  Matthew Mundell
+
+	* src/Matrix.defs.hh (grids.4): Take out old friends.
+
+2005-11-16 Wednesday 18:02  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.34): Correct typo in temporary
+	  comment.
+
+2005-11-16 Wednesday 18:00  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.79): Mention only that expr in the
+	  bounded methods are bounded (instead of mentioning bounding from
+	  above or below.  Note that the two "bound_from" methods are the
+	  same.
+
+2005-11-16 Wednesday 16:59  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.8): Take out the inclusion of the
+	  bounding box header.
+
+2005-11-16 Wednesday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.5): Get ready to test with
+	  Euclidean and L-infinity distances.
+
+2005-11-16 Wednesday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.46): Added missing friend declarations.
+	  Removed superfluous friend declarations.
+
+2005-11-16 Wednesday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.45), BD_Shape.inlines.hh (1.87): Added
+	  methods BD_Shape::euclidean_distance_assign() and
+	  BD_Shape::l_infinity_distance_assign() along the lines of the
+	  existing methods BD_Shape::rectilinear_distance_assign().
+
+2005-11-16 Wednesday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh (1.11): Added the declaration of
+	  DB_Matrix::euclidean_distance_assign().
+
+2005-11-16 Wednesday 13:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.25), polydifference7.cc (1.1):
+	  News test shows a bug in BD_Shape::poly_difference_assign().
+
+2005-11-16 Wednesday 07:17  Abramo Bagnara
+
+	* src/DB_Matrix.inlines.hh (1.12): Fixed obnoxious typo. Added
+	  missing qualifiers.
+
+2005-11-15 Tuesday 21:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Congruence.defs.hh, Grid.defs.hh (grids.[26,78]): Reverted
+	  a previous change to the documentation in Congruence.defs.hh
+	  Corrected line expression in example 2 in Grid.defs.hh.
+
+2005-11-15 Tuesday 20:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.4): Added (experimental, commented
+	  out) invocations of the rectilinear_distance_assign() function.
+
+2005-11-15 Tuesday 19:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.10), DB_Matrix.inlines.hh (1.11): New
+	  functions euclidean_distance_assign() and
+	  l_infinity_distance_assign().  Along with
+	  rectilinear_distance_assign() they are all implemented in terms
+	  of the new, generalized function l_m_distance_assign().
+
+2005-11-15 Tuesday 18:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.10): Several improvements to template
+	  <typename Temp, typename To, typename T> inline bool
+	  rectilinear_distance_assign(Checked_Number<To,
+	  Extended_Number_Policy>& r, const DB_Matrix<T>& x, const
+	  DB_Matrix<T>& y, const Rounding_Dir dir, Temp& tmp0, Temp& tmp1,
+	  Temp& tmp2).	(Joint work with Abramo Bagnara.)
+
+2005-11-15 Tuesday 18:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.31): The steepest-edge technique should be
+	  enabled by default (it was disabled by error in the last commit).
+
+2005-11-15 Tuesday 17:35  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.inlines.hh (grids.[15,17]): Make
+	  is_trivial_true and is_trivial_false real (vs inline) methods.
+
+2005-11-15 Tuesday 17:19  Matthew Mundell
+
+	* src/Generator_System.cc (grids.14): "Use" parameter
+	  check_normalization in method `insert'.
+
+2005-11-15 Tuesday 17:17  Matthew Mundell
+
+	* src/: Grid_Certificate.cc, Grid_minimize.cc, Grid_public.cc,
+	  Grid_simplify.cc, Grid_widenings.cc (grids.[7,23,90,33,7]):
+	  Normalize moduli in the congruence system simplify method.  Clean
+	  a few comments.  In the zero dimension cases in
+	  add_recycled_generators and add_recycled_generators_and_minimize
+	  only set zero dimension universe when the grid is empty.
+
+2005-11-15 Tuesday 17:10  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.77): Doc the minimized_generators()
+	  parameter conversion.
+
+2005-11-15 Tuesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.86): Statically allocate temporaries
+	  in template <typename Temp, typename To, typename T> bool
+	  rectilinear_distance_assign(Checked_Number<To,
+	  Extended_Number_Policy>& r, const BD_Shape<T>& x, const
+	  BD_Shape<T>& y, const Rounding_Dir dir).
+
+2005-11-15 Tuesday 15:58  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (1.25): Added missing argument.
+
+2005-11-15 Tuesday 15:38  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, mingenerators1.cc (grids.[52,1]): Add
+	  mingenerators1, which tests Grid::minimized_generators().
+
+2005-11-15 Tuesday 15:37  Matthew Mundell
+
+	* src/Grid_public.cc (grids.89): In generators() use
+	  hide_parameters() and move the zero dim check to precede the
+	  empty check.	Implement minimized_generators() directly, instead
+	  of calling generators().
+
+2005-11-15 Tuesday 15:31  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[76,43]): Add
+	  hide_parameters().
+
+2005-11-15 Tuesday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.13): Two FIXMEs removed.
+
+2005-11-15 Tuesday 14:54  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.42): In construct(gs,) move the
+	  gen_sys sorted flag setting into the space_dim > 0 case.
+
+2005-11-15 Tuesday 14:46  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.37), Checked_Number.inlines.hh
+	  (1.42), DB_Row.inlines.hh (1.12), checked.defs.hh (1.28),
+	  checked.inlines.hh (1.27), checked_ext.inlines.hh (1.24),
+	  checked_mpq.inlines.hh (1.27), checked_mpz.inlines.hh (1.32):
+	  Added construct function to Checked_Number. Added specialization
+	  for mpq and mpz.
+
+2005-11-15 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.44), BD_Shape.inlines.hh (1.85),
+	  DB_Matrix.defs.hh (1.9), DB_Matrix.inlines.hh (1.9): Added a
+	  first version of some functions computing the rectilinear (or
+	  Manhattan) distance between BD_Shape objects.
+
+2005-11-15 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Rounding_Dir.defs.hh (1.2), Rounding_Dir.inlines.hh (1.2):
+	  Added Rounding_Dir inverse(Rounding_Dir dir): returns the inverse
+	  rounding mode of `dir', ROUND_IGNORE being the inverse of itself.
+
+2005-11-15 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Rounding_Dir.inlines.hh (grids.1): file
+	  Rounding_Dir.inlines.hh was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-11-15 Tuesday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.21), Makefile.am (1.129), Native_Integer.defs.hh
+	  (1.15), Rounding.defs.hh (1.14), Rounding.types.hh (1.5),
+	  Rounding_Dir.defs.hh (1.1), Rounding_Dir.inlines.hh (1.1),
+	  checked.defs.hh (1.27): Rounding.types.hh removed.  Other
+	  Rounding.defs.hh renamed Rounding_Dir.defs.hh.  Comments revised.
+	  New file Rounding_Dir.inlines.hh will contain inline functions
+	  operating on enum Rounding_Dir values.
+
+2005-11-15 Tuesday 12:38  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, generators1.cc, mincongruences1.cc
+	  (grids.[51,1,1]): Add generators1 and mincongruences1, which test
+	  Grid::generators() and Grid::minimized_congruences().
+
+2005-11-15 Tuesday 12:36  Matthew Mundell
+
+	* tests/Grid/congruences1.cc (grids.4): Insert test6, where the
+	  grid is defined by generators.  In test8 (was test7) minimize
+	  when adding congruence.
+
+2005-11-15 Tuesday 12:33  Matthew Mundell
+
+	* src/: Grid.inlines.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[41,41,88]): Always set zero dim universe via
+	  set_zero_dim_univ().	Insert a point in set_zero_dim_univ().
+	  Create a correctly sized gen_sys in set_empty().
+
+	  In the bounding box grid constructor move the generator system
+	  flag setting into the space_dim > 0 case.  In the covering box
+	  grid constructor jump over the sorted flag clearing when an empty
+	  grid is produced.
+
+	  In construct(gs,) set space_dim before the empty test and set
+	  zero dim universe when required.  In Grid(n,kind) set zero dim
+	  universe when required.  Handle the zero dimension case in
+	  minimized_congruences().
+
+	  In generators() just return gen_sys when the grid is marked
+	  empty, return the actual gen_sys for zero dim universe, ensure
+	  that gen_sys is up to date, and convert any parameters to points.
+
+	  In the zero dim cases of add_recycled_congruences_and_minimize
+	  and add_recycled_congruences set empty or zero dim universe only
+	  if required.
+
+2005-11-15 Tuesday 11:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.84): Method is_empty() now computes
+	  shortest-path closure instead of applying the Bellman-Ford
+	  algorithm.
+
+2005-11-15 Tuesday 11:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.30): Some further improvements to the function
+	  steepest().  Function get_exiting_base_index() now takes a
+	  *const* reference to base.
+
+2005-11-15 Tuesday 11:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Scalar_Products.cc (1.2): Don't break comment lines without
+	  reason.
+
+2005-11-15 Tuesday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.cc (grids.1): file Scalar_Products.cc was
+	  added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-11-15 Tuesday 10:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Congruence.defs.hh (grids.25): Improvements to the
+	  documentation about congruences and how to build them.
+
+2005-11-15 Tuesday 01:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.19), simplex.cc (1.29): In the
+	  primal simplex algorithm, better separated the first and second
+	  phase of the algorithm. Added a preprocessing flag enabling the
+	  steepest-edge technique: teh flag is enabled by default. Added a
+	  new method   bool Constraint_System::is_satisfiable(Generator&
+	  feasible_point) const; that check the satisfiability of a
+	  constraint system by the primal simplex algorithm, returning a
+	  feasible point if satisfiable.  All of the above based on
+	  implementation work by Andrea Cimino.
+
+2005-11-14 Monday 18:19  Matthew Mundell
+
+	* tests/Grid/congruences1.cc (grids.3): Add test7, where a
+	  congruence system reference is used after the zero dimension grid
+	  from which it comes has been made empty.
+
+2005-11-14 Monday 17:55  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.18): Add zero dimension construction
+	  tests.
+
+2005-11-14 Monday 17:55  Matthew Mundell
+
+	* tests/Grid/congruences1.cc (grids.2): Add test6, where a
+	  congruence system reference is used after the grid from which it
+	  comes has been made empty.
+
+2005-11-14 Monday 16:57  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, congruences1.cc (grids.[50,1]): Add
+	  congrueces1, which tests Grid::congruences().
+
+2005-11-14 Monday 16:56  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.75): Note the covering box constructor
+	  behaviour when the box is empty.  Improve the get_covering_box
+	  description.	Add the set_empty method to the methods required of
+	  the box class in the get_covering_box doc.
+
+2005-11-14 Monday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/mp_numeric_limits.hh (1.2): Fixed
+	  numeric_limits<mpz_class>::epsilon() and
+	  numeric_limits<mpz_class>::round_error(): they now return 0.
+
+2005-11-14 Monday 16:47  Matthew Mundell
+
+	* tests/Grid/maxmin1.cc (grids.2): Use check_both in test2.
+	  Implement the zero dimension universe test.
+
+2005-11-14 Monday 16:46  Matthew Mundell
+
+	* tests/Grid/coveringbox2.cc (grids.5): Add an empty fail check to
+	  operator==.  Update the boxes expected from empty grids.  Add
+	  zero dimension tests.
+
+2005-11-14 Monday 16:44  Matthew Mundell
+
+	* tests/Grid/boundingbox2.cc (grids.3): Add an empty fail check to
+	  operator==.  Add zero dimension tests.
+
+2005-11-14 Monday 16:42  Matthew Mundell
+
+	* src/Grid_public.cc (grids.87): In Grid(dims,kind),
+	  add_recycled_congruences(cgs) and
+	  add_recycled_congruences_and_minimize(cgs) call set_empty instead
+	  of setting the empty flag directly.
+
+	  In congruences() adjust the assertion on the number of cols for
+	  the modulus and constant term columns.
+
+	  Improve and correct some comments.  Neaten the OK zero dimension
+	  universe check.
+
+2005-11-14 Monday 16:32  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.22): In both minimize methods assert
+	  that there are the minimum required number of columns.
+
+2005-11-14 Monday 16:30  Matthew Mundell
+
+	* src/Grid_Certificate.cc (grids.6): Use gr instead of cgr, for
+	  consistency.
+
+2005-11-14 Monday 16:29  Matthew Mundell
+
+	* src/: Grid.inlines.hh, Grid_nonpublic.cc (grids.[40,40]): In
+	  set_empty make con_sys false.
+
+	  Add a zero dimension universe case to max_min.
+
+	  Take out an old topology comment.
+
+	  In construct(ccgs) insert the integrality congruence when the
+	  dimension is greater than zero, and only check for false
+	  congruences in dimension zero when there are two or more columns
+	  in the given congruence system.
+
+	  In the box constructors and construct(const_gs,bool) call
+	  set_empty instead of setting the empty flag directly.
+
+	  In get_covering_box add a zero dimension check and set the box
+	  empty when the grid is empty.  In shrink_bounding_box add a zero
+	  dimension check and take out a redundant check for rows in the
+	  generator system.
+
+2005-11-14 Monday 16:08  Matthew Mundell
+
+	* src/Congruence_System.inlines.hh (grids.10): Ensure that the
+	  modulus and constant term columns always exist.
+
+2005-11-14 Monday 16:05  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.29): Neaten formatting.
+
+2005-11-14 Monday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.177): Special Doxygen commands such as
+	  \subsection gets confused by line breaks.
+
+2005-11-14 Monday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.110): Corrected a typo in the
+	  documentation.
+
+2005-11-14 Monday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.43): Class documentation improved a
+	  little.
+
+2005-11-14 Monday 15:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.83): Helper functions min_assign() and
+	  max_assign() renamed as assign_min() and assign_max() for
+	  consistency with those defined in checked.defs.hh.
+
+2005-11-14 Monday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.60), devref.doxyconf-latex.in
+	  (1.4): Also consider BD shapes when building the developers'
+	  manual.
+
+2005-11-14 Monday 10:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.42): A few documentation improvements.
+
+2005-11-14 Monday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh (1.10): Typo corrected in the
+	  documentation.
+
+2005-11-14 Monday 10:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.41), Native_Integer.inlines.hh
+	  (1.16): Avoid a few redundant template qualifications.
+
+2005-11-14 Monday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.13): Unneeded friend declaration removed.
+
+2005-11-14 Monday 08:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.11): In new method
+	  DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+	  U& y) using y's public indexing operator [] instead of accessing
+	  the private member y.vec_.
+
+2005-11-13 Sunday 23:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.82), tests/BD_Shape/affineimage8.cc
+	  (1.6): Further improvement in the coding as well as precision of
+	  the general case of affineimage. The known result of
+	  affineimage8.cc changed accordingly.
+
+2005-11-13 Sunday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.defs.hh (1.15): Compiler warnings avoided.
+
+2005-11-13 Sunday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.3): Completed.
+
+2005-11-13 Sunday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: DB_Row.defs.hh (1.12), DB_Row.inlines.hh (1.10): New
+	  signature and definition of method void
+	  DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const
+	  U& y).
+
+2005-11-13 Sunday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.25), globals.inlines.hh (1.13): Removed
+	  no longer used function compute_capacity() using a single
+	  argument; always use the function also taking the maximum
+	  capacity as second argument.
+
+2005-11-13 Sunday 18:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.defs.hh (1.8), DB_Matrix.inlines.hh (1.8): Using
+	  max_num_rows() and max_num_columns() where appropriate.  Methods
+	  ascii_dump and ascii_load and the destructor should not be
+	  virtual.
+
+2005-11-13 Sunday 18:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.86), Matrix.inlines.hh (1.46): Using
+	  max_num_columns() where appropriate.
+
+2005-11-13 Sunday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.81): Added a first, tentative
+	  implementation of template <typename T> template <typename U>
+	  BD_Shape<T>::BD_Shape(const BD_Shape<U>& y).
+
+2005-11-13 Sunday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.41): Deckared a new template constructor
+	  template <typename U> explicit BD_Shape(const BD_Shape<U>& y): it
+	  builds a conservative, upward approximation of `y'.
+
+2005-11-13 Sunday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.inlines.hh (1.7): Added a first implementation of
+	  template <typename T> template <typename U>
+	  DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y).  Added the
+	  inclusion of checked.defs.hh, which is needed to get access to
+	  the compute_capacity() functions.
+
+2005-11-13 Sunday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Matrix.defs.hh (1.7): Declared new template constructor
+	  template <typename T> template <typename U> explicit
+	  DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y): it constructs a
+	  conservative approximation of `y'.  All DB_Matrix classes are now
+	  friends of each other.
+
+2005-11-13 Sunday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.inlines.hh (1.9): Added (not yet operational)
+	  skeletons for the implementation of template <typename T>
+	  template <typename U> void
+	  DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+	  dimension_type capacity) and template <typename T> template
+	  <typename U> void
+	  DB_Row_Impl_Handler<U>::Impl::construct_upward_approximation(const
+	  typename DB_Row_Impl_Handler<U>::Impl& y).
+
+2005-11-13 Sunday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.11): Declared new method template <typename
+	  T> template <typename U> void
+	  DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+	  dimension_type capacity).  Declared new method template <typename
+	  T> template <typename U> void
+	  DB_Row_Impl_Handler<U>::Impl::construct_upward_approximation(const
+	  typename DB_Row_Impl_Handler<U>::Impl& y).  Comments improved.
+
+2005-11-12 Saturday 17:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: addspacedims5.cc (1.7), addspacedims6.cc (1.7),
+	  affineimage10.cc (1.3), affineimage8.cc (1.5), affineimage9.cc
+	  (1.5), affinepreimage5.cc (1.4), ascii_dump_load1.cc (1.7),
+	  ascii_dump_load2.cc (1.6), cc76extrapolation4.cc (1.6),
+	  constraints1.cc (1.7), equality1.cc (1.7), exceptions1.cc (1.7),
+	  exceptions2.cc (1.6), exceptions3.cc (1.8),
+	  generalizedaffineimage13.cc (1.3), generalizedaffineimage14.cc
+	  (1.7), limitedCC76extrapolation2.cc (1.6),
+	  limitedCC76extrapolation3.cc (1.6), mapspacedims2.cc (1.6),
+	  mapspacedims3.cc (1.5), relations1.cc (1.8), relations2.cc (1.8),
+	  relations3.cc (1.7), relations4.cc (1.6), relations5.cc (1.8),
+	  removespacedims2.cc (1.6), removespacedims3.cc (1.6): Using the
+	  anonymous namespace instead of declaring static functions.
+
+2005-11-12 Saturday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affineimage10.cc (grids.1): file affineimage10.cc
+	  was added on branch grids on 2005-11-23 13:24:07 +0000
+
+2005-11-12 Saturday 13:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: lib-ld.m4 (1.3), lib-link.m4 (1.2), lib-prefix.m4 (1.3):
+	  Updated from Gettext 0.14.5.
+
+2005-11-12 Saturday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.197): Consistently use uppercase letters to
+	  specify (placeholders for) configuration options' arguments.
+	  Systematically use AC_HELP_STRING to format help messages.
+
+2005-11-12 Saturday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.21), NEWS (1.164): Corrected a typo.
+
+2005-11-12 Saturday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure (1.15): Corrected a couple of typos.
+
+2005-11-11 Friday 17:29  Matthew Mundell
+
+	* src/: Grid_public.cc, Grid.inlines.hh (grids.[86,39]): Inline
+	  method is_empty.  In is_empty add more fast-fail tests and
+	  minimize only the congruence system in the last-resort test.
+
+2005-11-11 Friday 17:25  Matthew Mundell
+
+	* src/: Grid_Status.cc, Grid_Status.idefs.hh,
+	  Grid_Status.inlines.hh (grids.[4,4,3]): Gridify the Grid_Status
+	  comments.
+
+2005-11-11 Friday 17:23  Matthew Mundell
+
+	* doc/definitions.dox (grids.8): Add anchor grid_space_dimensions.
+	  Refer to affine_function instead of affine_transformation.
+
+2005-11-11 Friday 17:03  Matthew Mundell
+
+	* tests/Grid/affinepreimage1.cc (grids.6): Correct expected result
+	  in test16.
+
+2005-11-11 Friday 15:35  Matthew Mundell
+
+	* src/Congruence_System.inlines.hh (grids.9): Only qualify the
+	  namespace of insert(cg) once.
+
+2005-11-11 Friday 15:32  Matthew Mundell
+
+	* src/Generator_System.defs.hh (grids.6): Document all parameters
+	  in a method when some are documented.
+
+2005-11-11 Friday 15:29  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.74): Improve the class description.
+	  Update to the newly named affine_function and
+	  generalized_affine_relation anchors.	Use \cL for grids instead
+	  of \cP.  Document the space dimension changing behaviour of
+	  map_space_dimension.	Document all parameters when some are
+	  documented.  Correct the return value documentation for the
+	  simplify methods.
+
+2005-11-10 Thursday 21:28  Matthew Mundell
+
+	* src/Grid_public.cc (grids.85): Add colon between namespace and
+	  class in comment.
+
+2005-11-10 Thursday 21:28  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.73): Convert the class doc examples into
+	  grid examples.  Correct a parameter name.
+
+2005-11-10 Thursday 21:26  Matthew Mundell
+
+	* src/Generator.defs.hh (grids.9): Keep Congruence_System as a
+	  friend.
+
+2005-11-10 Thursday 21:21  Matthew Mundell
+
+	* tests/Grid/: affineimage1.cc, affinepreimage1.cc (grids.[7,5]):
+	  Add three simple tests.
+
+2005-11-10 Thursday 19:14  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[14,24]): Add
+	  method throw_invalid_argument.  Use it in
+	  throw_dimension_incompatible.  In the constructors that take
+	  constraints move the check that the constraint is an equality to
+	  come before the construction of the underlying row.
+
+2005-11-10 Thursday 18:31  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh, Constraint.defs.hh
+	  (grids.[28,19,8,7]): In insert(cg) use add_recycled_row instead
+	  of add_row when a resized copy of cg is created, and call
+	  num_rows() in place instead of using a variable.
+
+	  Inline insert(cg).
+
+	  Doc the strong normalization of the insert methods.
+
+2005-11-10 Thursday 18:23  Matthew Mundell
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (grids.[4,3,3]): Add add_recycled_row(Row&).	Move the bulk of
+	  add_row to add_recycled_row.	Call add_recycled_row from add_row.
+	  Inline add_row.
+
+2005-11-10 Thursday 18:16  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[13,23]): Add
+	  Congruence(c, sz, capacity).
+
+2005-11-10 Thursday 15:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.80): Corrected a bug in method
+	  ascii_load().
+
+2005-11-10 Thursday 14:07  Matthew Mundell
+
+	* src/: Congruence.defs.hh, scalar_products.cc,
+	  scalar_products.defs.hh (grids.[22,3,3]): Take out
+	  scalar_product_assign(.., ref) and
+	  reduced_scalar_product_assign(.., ref), which were required by an
+	  older form of Congruence_System::satisfies_all_congruences.
+
+2005-11-10 Thursday 13:41  Matthew Mundell
+
+	* src/: Congruence_System.defs.hh, Congruence_System.inlines.hh
+	  (grids.[18,7]): Make the ascii_dump and ascii_load documentation
+	  implementation details.  Take out
+	  Congruence_System(n_rows,n_cols).  Keep has_linear_equalities().
+
+2005-11-10 Thursday 12:31  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, topclosure1.cc (grids.[49,1]): Add
+	  topclosure1, which tests Grid::topological_closure_assign().
+
+2005-11-10 Thursday 12:29  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
+	  (grids.[72,38,84]): Declare and implement
+	  topological_closure_assign().
+
+2005-11-10 Thursday 11:57  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, membytes1.cc, membytes2.cc
+	  (grids.[48,1,1]): Add membytes1 and membytes2, to exercise
+	  Grid::total_memory_in_bytes() and
+	  Grid::external_memory_in_bytes().
+
+2005-11-10 Thursday 11:56  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.6): Rename parameter selected_cgs as
+	  cgs_selected.
+
+2005-11-10 Thursday 11:55  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_minimize.cc,
+	  Grid_nonpublic.cc, Grid_public.cc (grids.[71,37,21,39,83]): Doc
+	  param convert_rays_to_lines in Grid(gs, convert_rays_to_lines).
+	  Neaten some comment widths.  Make the add_space_dimensions
+	  methods private.  Note in docs where Grid maths symbols must be
+	  used.  Doc the return of ascii_load formally.  Shorten the
+	  convert_rays_to_lines param doc for construct(gs,
+	  convert_rays_to_lines).  Use "minimize" instead of "reduce" and
+	  "generator system" instead of "parameter system".  Improve a few
+	  method descriptions.
+
+	  Enable method total_memory_in_bytes.	Take out the remaining
+	  pending row methods, strongly_minimize_congruences and
+	  strongly_minimize_generators.
+
+	  Void the return from minimize(cgs,ls).  Swap the return cases in
+	  minimize(gs,cgs) to match the other methods that return an
+	  indication of the grid's emptiness.
+
+2005-11-08 Tuesday 21:46  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.70): Correct and neaten comments.
+	  Document the parameters in the shrink and get bounding box
+	  methods.  Document the return in
+	  add_recycled_constraints_and_minimize.  Move the
+	  join_assign_and_minimize declaration to match the Polyhedron
+	  ordering.
+
+2005-11-08 Tuesday 20:25  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, disjoint1.cc (grids.[47,1]): Add
+	  disjoint1, which tests Grid::is_disjoint_from().
+
+2005-11-08 Tuesday 20:24  Matthew Mundell
+
+	* tests/Grid/contains1.cc (grids.4): Improve comments, messages and
+	  a variable name.
+
+2005-11-08 Tuesday 20:22  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.5): In limited_extrapolation_assign
+	  check dimension compatibility before falling back to the ordinary
+	  widening.
+
+2005-11-08 Tuesday 20:16  Matthew Mundell
+
+	* src/Grid_public.cc (grids.82): Enable the is_disjoint_from
+	  definition.  In intersection_assign pass true only to y.OK, as x
+	  can be empty.  Update a temporary comment.  In OK use
+	  "unsatisfiable" instead fo "insoluble".  Neaten a comment.
+
+2005-11-08 Tuesday 20:11  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.36): Take out is_necessarily_closed()
+	  and topology().
+
+2005-11-08 Tuesday 20:10  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.69): Neaten and correct comments.
+
+2005-11-08 Tuesday 19:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.79), tests/BD_Shape/Makefile.am
+	  (1.24), tests/BD_Shape/minconstraints1.cc (1.1): Corrected a few
+	  bugs in minimized_constraints(); added a new test for it.  The
+	  ascii_dump() and ascii_load() methods now also write/read the
+	  matrix encoding redundancy information.
+
+2005-11-08 Tuesday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/minconstraints1.cc (grids.1): file
+	  minconstraints1.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-11-08 Tuesday 17:54  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.17): Align copyright line.
+
+2005-11-08 Tuesday 17:54  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.68): Document the length_error exceptions
+	  that occur in many constructors.  Mention copying the given
+	  system in the brief descriptions for many constructors.  Improve
+	  formatting and correct typos in a few comments.
+
+2005-11-08 Tuesday 17:52  Matthew Mundell
+
+	* src/Grid_public.cc (grids.81): In the copy constructor create
+	  gen_sys NECESSARILY_CLOSED and assert that the given gen_sys was
+	  NECESSARILY_CLOSED.  Move operator= to match the order of method
+	  declarations.
+
+2005-11-08 Tuesday 17:50  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.35): Move box constructors to follow
+	  other constructors.
+
+2005-11-08 Tuesday 17:41  Matthew Mundell
+
+	* TODO (grids.15): Complete upper_bound_assign_and_minimize item.
+
+2005-11-08 Tuesday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.78): Corrected a couple of stupid bugs
+	  in the copy constructor and assignment operator of BD_Shape.	A
+	  few useful functions related to the computation of leaders have
+	  been extracted from shortest_path_reduction_assign(), so as to
+	  factor common code in minimized_constraints() and
+	  affine_dimension().  The method minimized_constraints() should
+	  now return a constraint system in minimal form, exploiting
+	  redundancy information. The method constraints() now invokes
+	  minimized_constraints() if the BD_Shape is known to be reduced.
+
+2005-11-08 Tuesday 14:09  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, addcongruences1.cc (grids.[46,1]): Add
+	  addcongruences1, to test methods which add multiple congruences
+	  to a grid.
+
+2005-11-08 Tuesday 14:08  Matthew Mundell
+
+	* tests/Grid/grid3.cc (grids.5): Align copyright line.
+
+2005-11-08 Tuesday 14:07  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (grids.6): Improve title comment.
+	  Add namespace with shared Variables.
+
+2005-11-08 Tuesday 13:41  Matthew Mundell
+
+	* tests/Grid/: grid3.cc, Makefile.am, addconstraint1.cc,
+	  addconstraints1.cc (grids.[4,45,1,10]): Add grid3, which tests
+	  construction of grids from constraints.
+
+	  Add addconstraint1, which tests adding single constraints to
+	  grids.  Move the single-constraint adding tests from
+	  addconstraints1 to addconstraint1.
+
+	  Add tests for add_constraints_and_minimize(cs),
+	  add_recycled_constraints(cs) and
+	  add_recycled_constraints_and_minimize(cs) to addconstraints1.
+
+2005-11-08 Tuesday 13:32  Matthew Mundell
+
+	* TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[14,67,80]):
+	  Add Grid(cs), add_constraint_and_minimize(c),
+	  add_constraints_and_minimize(cs), add_recycled_constraints(cs)
+	  and add_recycled_constraints_and_minimize(cs).
+
+	  In all of the constraint adding methods allow the addition of any
+	  kind of constraint (instead of only equalities).  In
+	  add_constraints(cs) use Congruence_System(cs) to add the
+	  constraints.
+
+	  Improve some method descriptions.
+
+2005-11-08 Tuesday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage8.cc (1.4), affineimage9.cc (1.4),
+	  generalizedaffineimage14.cc (1.6): Some suspect constraints in
+	  the known_results have been commented out.  They have to be
+	  carefully checked to see of they are really wanted.
+
+2005-11-08 Tuesday 12:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/affineimage10.cc (1.2): Do not be noisy.
+
+2005-11-08 Tuesday 12:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: ch78widening4.cc (1.5),
+	  generalizedaffineimage1.cc (1.6): Avoid lines that are too long.
+	  Removed a few (unnecessary) blank lines.
+
+2005-11-08 Tuesday 12:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.77): Corrected a bug in affine_image()
+	  whereby incorrect bounds for binary constraints could have been
+	  deduced.  In the invariant-checking method OK(), we now also
+	  check that no entry of the dbm has value MINUS_INFINITY; if the
+	  dbm is marked as shortest-path reduced, then we check that the
+	  dbm entry for a non-redundant constraint has a finite value.
+
+2005-11-08 Tuesday 11:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.76): Got rid of the wrong version of
+	  div_round_up().
+
+2005-11-07 Monday 18:29  Matthew Mundell
+
+	* tests/Grid/griddifference1 (grids.2): Remove file added in error
+	  earlier.
+
+2005-11-07 Monday 18:24  Matthew Mundell
+
+	* tests/Grid/maxmin1.cc (grids.1): Add maxmin1, which tests
+	  Grid::maximize(le&, ...) and Grid::minimize(le&, ...).
+
+2005-11-07 Monday 18:20  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.9): Add test10, for
+	  add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:20  Matthew Mundell
+
+	* src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[66,79,13]):
+	  Add add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:07  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.8): Add test9, for
+	  add_recycled_congruences(cs).
+
+2005-11-07 Monday 18:07  Matthew Mundell
+
+	* TODO, src/Grid.defs.hh, src/Grid_public.cc (grids.[12,65,78]):
+	  Add add_recycled_congruences(cs).  Add a dimension compatibility
+	  check to add_congruences(cgs).
+
+2005-11-07 Monday 17:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.23), affineimage10.cc (1.1): A
+	  test that was showing a bug in the old implementation of affine
+	  images.
+
+2005-11-07 Monday 17:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BDS_Status.idefs.hh (1.9), BDS_Status.inlines.hh (1.7),
+	  BD_Shape.defs.hh (1.40), BD_Shape.inlines.hh (1.75): A BD_Shape
+	  representation now also carries a dbm matrix of Boolean values,
+	  indicating whether or not the corresponding dbm entry is
+	  redundant.  The new matrix is meaningful only if the BDS_Status
+	  test	   marked_shortest_path_reduced() returns true, otherwise
+	  it is meaningless. Note that a dbm can be shortest-path reduced
+	  only if it is also shortest-path closed.  The redundancy
+	  information is established by shortest_path_reduction_assign()
+	  and is lost as soon as we modify the representation of the
+	  BD_Shape.  That is, currently no effort is done to keep it
+	  up-to-date. Moreover, when we reset the shortest-path closure
+	  flag, then the reduction flag is reset too.
+
+	  Added private helper methods	   add_dbm_constraint() that allow
+	  for the addition of a difference bound constraint without
+	  encoding it into a Constraint object. The method is particularly
+	  used in the computation of affine images.
+
+	  The methods computing affine images and preimages rewritten
+	  (almost) from scratch. (The old implementations, were not
+	  behaving correctly when the denominator was negative or when
+	  considering generalized images).
+
+	  Added a lot of const qualifications; avoided some dbm's
+	  coefficient copies, preferring the use of references instead.
+
+2005-11-07 Monday 16:52  Matthew Mundell
+
+	* src/Grid_public.cc (grids.77): Implement add_congruences and
+	  add_congruences_and_minimize via Congruence_System(cs).
+
+2005-11-07 Monday 16:52  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[27,17]): Add Congruence_System(Constraint_System&).  Move
+	  the normalize_moduli definition into order.
+
+2005-11-07 Monday 16:40  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.53): Don't add nothing to std
+	  namespace.
+
+2005-11-07 Monday 16:30  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.52): Fixed argument order.
+
+2005-11-07 Monday 16:27  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (1.26): Added add_mul and sub_mul.
+
+2005-11-07 Monday 14:35  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.7): Add test8, for
+	  add_congruences(cs).
+
+2005-11-07 Monday 14:35  Matthew Mundell
+
+	* src/Grid.defs.hh, src/Grid_public.cc, TODO (grids.[64,76,11]):
+	  Add add_congruences(cs).  In add_congruences_and_minimize(cs) add
+	  the congruences with add_recycled_congruences_and_minimize.
+
+2005-11-07 Monday 12:04  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (grids.16): Narrow a comment.
+
+2005-11-07 Monday 12:01  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, griddifference1 (grids.[44,1]): Add
+	  maxmin1, which tests Grid::maximize(le&, ...) and
+	  Grid::minimize(le&, ...).
+
+2005-11-07 Monday 11:59  Matthew Mundell
+
+	* tests/Grid/bounds1.cc (grids.2): Match expected values to updated
+	  method behaviour.
+
+2005-11-07 Monday 11:58  Matthew Mundell
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
+	  TODO (grids.[63,34,38,10]): Separate parameters with semicolons
+	  in descriptions.  Add minimize and maximize methods.	Match the
+	  behaviours of bounds_from_above and bounds_from_below to the
+	  Polyhedron versions.
+
+2005-11-05 Saturday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.176), interfaces/C/ppl_c.h.in (1.55),
+	  interfaces/Prolog/Prolog_interface.dox (1.135),
+	  src/BD_Shape.defs.hh (1.39), src/Constraint_System.defs.hh
+	  (1.18), src/Determinate.defs.hh (1.58),
+	  src/Polyhedra_Powerset.defs.hh (1.25), src/Polyhedron.defs.hh
+	  (1.284): In definitions.doc we were bricolating our own
+	  sectioning with <B> and </B> tags.  Started using Doxygen's
+	  \subsection command.	Started using label names that are easily
+	  obtained from the section or subsection title.  This is less
+	  likely to generate conflicts, but a better scheme must be devised
+	  that can work across the entire library's documentation.
+
+2005-11-05 Saturday 08:59  Abramo Bagnara
+
+	* tests/BD_Shape/run_tests (1.7): Remove dirty marker only after
+	  all is clean.
+
+2005-11-05 Saturday 08:30  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.14), checked_float.inlines.hh (1.51):
+	  *_BITS constants are unsigned.
+
+2005-11-04 Friday 22:22  Abramo Bagnara
+
+	* tests/BD_Shape/run_tests (1.6): Avoid initial make clean.
+
+2005-11-04 Friday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/closure1.cc (1.2): Fixed a copy and paste mistake.
+
+2005-11-04 Friday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ppl_test.hh (1.29), BD_Shape/run_tests (1.5): Do not
+	  define TBD_Shape: define BD_SHAPE_INSTANCE instead.
+
+2005-11-04 Friday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.22), closure1.cc (1.1): Draft
+	  test to check closure more seriously (it does not work as
+	  expected at the moment).
+
+2005-11-04 Friday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.74): Old code for div_round_up()
+	  temporarily restored, since some (wrong) tests depend on it.
+
+2005-11-04 Friday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.cc (grids.1): file Float.cc was added on branch grids
+	  on 2005-11-23 13:24:06 +0000
+
+2005-11-04 Friday 13:58  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.36), Float.cc (1.2),
+	  Float.defs.hh (1.13), Float.inlines.hh (1.14),
+	  Native_Integer.defs.hh (1.14), Native_Integer.inlines.hh (1.15),
+	  checked_ext.inlines.hh (1.23), checked_float.inlines.hh (1.50),
+	  checked_int.inlines.hh (1.41), float.types.hh (1.12): Fixed use
+	  of native types also when identical to others.
+
+2005-11-04 Friday 12:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.73): Reimplemented div_round_up().
+
+2005-11-04 Friday 11:16  Matthew Mundell
+
+	* tests/Grid/bounded1.cc (grids.2): Add test12, in which every
+	  generator is the same point.
+
+2005-11-04 Friday 11:15  Matthew Mundell
+
+	* src/Grid_public.cc (grids.75): In is_bounded use the generator
+	  system in any form.
+
+2005-11-04 Friday 11:13  Matthew Mundell
+
+	* tests/Grid/topclosed1.cc (grids.3): Take out the find_variation
+	  directive.
+
+2005-11-04 Friday 11:12  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, bounds1.cc (grids.[43,1]): Add bounds1,
+	  which tests Grid::bounds_from_above and Grid::bounds_from_below.
+
+2005-11-04 Friday 11:11  Matthew Mundell
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh, src/Grid_nonpublic.cc,
+	  TODO (grids.[62,33,37,9]): Add methods bounds, bounds_from_above
+	  and bounds_from_below.  Reorder a few method definitions.
+
+2005-11-04 Friday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.175): Removed some spurious percent signs.
+
+2005-11-03 Thursday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.158): Begging for a coding guideline as far as the use of
+	  (checked) arithmetic functions is concerned.
+
+2005-11-03 Thursday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: definitions.dox (1.174), ppl.sty (1.22): Added a draft new
+	  section on "Integers Represented by Floating Point Numbers".
+	  This contains results that are needed to prove the correctness of
+	  our implementation of the GCD and LCM operations.  (Joint work
+	  with Alessandro Zaccagnini and Abramo Bagnara.)
+
+2005-11-03 Thursday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.31): Be more robust in the
+	  definition of mp_size_field_t.
+
+2005-11-03 Thursday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.196): Added a safeguard against possible changes
+	  in the implementation of GMP.
+
+2005-11-03 Thursday 10:58  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (1.30): mp_size_t is not the size of
+	  size field.
+
+2005-11-03 Thursday 08:06  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.49): Avoid useless #if
+
+2005-11-02 Wednesday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.7): Added missing access control
+	  specification.
+
+2005-11-02 Wednesday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.defs.hh (1.12), Polyhedron_nonpublic.cc (1.57):
+	  Spurious semicolons removed.
+
+2005-11-02 Wednesday 21:07  Matthew Mundell
+
+	* TODO (grids.8): Complete operation is_bounded.
+
+2005-11-02 Wednesday 21:06  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, bounded1.cc (grids.[42,1]): Add
+	  bounded1, which tests Grid::is_bounded.
+
+2005-11-02 Wednesday 21:05  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[61,74]): Add method
+	  is_bounded.
+
+2005-11-02 Wednesday 20:45  Matthew Mundell
+
+	* TODO (grids.7): Complete operation affine_dimension.
+
+2005-11-02 Wednesday 20:43  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[60,36]): To
+	  normalize_divisors(gs,div) add third argument first_point, which
+	  implies that all points in gs have the same divisor.	Use this
+	  argument in normalize_divisors(gs,gs).
+
+2005-11-02 Wednesday 19:49  Matthew Mundell
+
+	* src/Grid_public.cc (grids.73): In is_topologically_closed search
+	  for a single parameter or proper congruence, instead of checking
+	  the counts of these.
+
+2005-11-02 Wednesday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.4): The long double incarnation of
+	  checked numbers is still not ready: do not test with it for the
+	  time being.
+
+2005-11-02 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.cc (1.1), Makefile.am (1.128): Obey verse 9.4.2.4 of
+	  the C++ standard: "The [static const data] member shall still be
+	  defined in a namespace scope if it is used in the program and the
+	  namespace scope definition shall not contain an initializer."
+
+2005-11-02 Wednesday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.11): Do not define symbols in the global
+	  namespace.
+
+2005-11-02 Wednesday 11:32  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, affinedim1.cc (grids.[41,1]): Add
+	  affinedim1, which tests Grid::affine_dimension().
+
+2005-11-02 Wednesday 11:31  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.26): In increase_space_dimension
+	  only add columns when more columns are requested (instead of
+	  always ensuring that the modulus and constant term column exist).
+
+2005-11-02 Wednesday 11:28  Matthew Mundell
+
+	* src/Grid_public.cc (grids.72): Enable and implement method
+	  affine_dimension.  In minimized_congruences and
+	  minimized_generators minimize only the required system.  In
+	  generators always set the topology to NECESSARILY_CLOSED.
+
+2005-11-02 Wednesday 11:22  Abramo Bagnara
+
+	* src/Float.defs.hh (1.11): Fixed typo.
+
+2005-11-01 Tuesday 18:45  Matthew Mundell
+
+	* TODO (grids.6): Complete operators is_topologally_closed and
+	  shrink_bounding_box.
+
+2005-11-01 Tuesday 18:44  Matthew Mundell
+
+	* tests/Grid/topclosed1.cc (grids.2): Replace function
+	  topclosed1_equal with copy_compare (in ppl_test.hh).	Correct
+	  error messages.
+
+2005-11-01 Tuesday 18:42  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.13): Add function copy_compare(Grid&,
+	  Grid&).
+
+2005-11-01 Tuesday 18:41  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, pointed1.cc (grids.[40,1]): Add
+	  pointed1, which tests Grid::is_pointed().
+
+2005-11-01 Tuesday 18:40  Matthew Mundell
+
+	* src/: Grid_public.cc, Grid.defs.hh (grids.[71,59]): Add the
+	  definition and improve the doc description of is_pointed.
+
+2005-11-01 Tuesday 14:51  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, topclosed1.cc (grids.[39,1]): Add
+	  topclosed1, which tests Grid::is_topologically_closed().
+
+2005-11-01 Tuesday 14:49  Matthew Mundell
+
+	* src/Grid_public.cc (grids.70): Implement method
+	  is_topologically_closed.
+
+2005-11-01 Tuesday 14:26  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.11): Add test8, in which the
+	  added generator has a divisor.  Only call find_variation on the
+	  grid under test.
+
+2005-11-01 Tuesday 14:24  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc (grids.[58,35]): In
+	  normalize_divisors(gs,coeff) read the initial divisor of gs into
+	  a temporary before the divisor modifying loop.  In the same loop
+	  only multiply the generator when the factor is greater than one.
+	  Improve the description of this method, and improve slightly the
+	  descriptions of a few others.
+
+	  In normalize_divisors(gs,gs) access the divisor via the array
+	  operator instead of the divisor method.
+
+2005-11-01 Tuesday 14:03  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.10), checked_float.inlines.hh (1.48):
+	  Simpler overflow return.
+
+2005-11-01 Tuesday 14:02  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh (1.25), checked_mpz.inlines.hh
+	  (1.29): Simplified assign when available in lower level class.
+
+2005-11-01 Tuesday 01:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_ext.inlines.hh (1.22): Corrected a bug in sub_ext()
+	  whereby subtracting any finite value from PLUS_INFINITY resulted
+	  in MINUS_INFINITY (and vice versa).
+
+2005-11-01 Tuesday 01:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Checked_Number.cc (1.8): Minor improvements in the exception
+	  messages.
+
+2005-10-31 Monday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.3): Test also with long doubles.
+
+2005-10-31 Monday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.13): Spurious redeclaration removed.
+
+2005-10-31 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.12): Spurious incomplete statement
+	  removed.
+
+2005-10-31 Monday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.11): Wrong syntax for static_cast fixed.
+
+2005-10-31 Monday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.47): An instance of float127_t
+	  changed to float128_t.
+
+2005-10-31 Monday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Float.defs.hh (1.9), Float.inlines.hh (1.10),
+	  float.types.hh (1.10): The <stdint.h> header file was included
+	  unnecessarily in float.types.hh and not included in Float.defs.hh
+	  and Float.inlines.hh.
+
+2005-10-31 Monday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.28): Define the utility type `long_double'.
+
+2005-10-31 Monday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.127): Added the dependency of ppl_install.hh
+	  on $(INCLUDE_FILES).	Reformatted some rules for consistency.
+
+2005-10-31 Monday 20:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.9): Define FLOAT96_TYPE or FLOAT128_TYPE
+	  depending on SIZEOF_LONG_DOUBLE.  Definition of float128_t fixed.
+
+2005-10-31 Monday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.21): Last change was only
+	  half-made: completed.
+
+2005-10-31 Monday 13:59  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.35), Checked_Number.inlines.hh
+	  (1.40): Added copy constructor and operator=.
+
+2005-10-31 Monday 13:58  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.26), checked.inlines.hh (1.26),
+	  checked_float.inlines.hh (1.46), checked_int.inlines.hh (1.40),
+	  checked_mpq.inlines.hh (1.24), checked_mpz.inlines.hh (1.28):
+	  Added copy function. Fixed float output.
+
+2005-10-31 Monday 07:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.20): The `run_tests' script is now
+	  distributed.
+
+2005-10-30 Sunday 18:53  Matthew Mundell
+
+	* tests/Grid/: addconstraints1.cc, addspacedims1.cc,
+	  addspacedims2.cc, concatenate1.cc, congruence1.cc, contains1.cc,
+	  contains2.cc, coveringbox2.cc, griddifference1.cc,
+	  intersection1.cc, intersection2.cc, isuniverse1.cc, join2.cc,
+	  join3.cc, limitedextrapolation1.cc, removespacedims1.cc,
+	  removespacedims2.cc, timeelapse1.cc, widening1.cc
+	  (grids.[6,9,6,3,7,3,2,4,6,5,6,4,5,2,4,6,5,4,6]): Make the title
+	  comments of the tests consistent.
+
+2005-10-30 Sunday 18:51  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[57,32]): Update
+	  get_covering_box to work directly with any form of generator
+	  system and to only ever attempt to set each bound once.
+
+2005-10-30 Sunday 00:44  Matthew Mundell
+
+	* tests/Grid/coveringbox2.cc (grids.3): Add test14 and test15, to
+	  test that fractions are reduced before being assigned to
+	  intervals.
+
+2005-10-30 Sunday 00:42  Matthew Mundell
+
+	* tests/Grid/boundingbox2.cc (grids.2): Improve comment slightly.
+
+2005-10-30 Sunday 00:42  Matthew Mundell
+
+	* src/: Grid.inlines.hh, Grid.defs.hh (grids.[31,56]): In
+	  get_covering_box reduce the fraction before assigning it to the
+	  interval.
+
+2005-10-29 Saturday 20:17  Matthew Mundell
+
+	* tests/Grid/coveringbox2.cc (grids.2): Name variables
+	  consistently, improve some comments and add test13 (in which an
+	  empty grid is defined by congruences).
+
+2005-10-29 Saturday 20:16  Matthew Mundell
+
+	* tests/Grid/boundingbox1.cc (grids.7): Note that boundingbox2 also
+	  tests the constructor under test.
+
+2005-10-29 Saturday 20:15  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, boundingbox2.cc (grids.[38,1]): Add
+	  boundingbox2, which tests shrink_bounding_box(Box&).
+
+2005-10-29 Saturday 20:11  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[55,30]): Add
+	  shrink_bounding_box(Box&).  Correct two comments in
+	  get_covering_box.  Declare method is_topologically_closed.
+
+2005-10-29 Saturday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/run_tests (1.2): Several improvements.
+
+2005-10-29 Saturday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.27): No longer define TBD_Shape.
+
+2005-10-29 Saturday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.19), run_tests (1.1): A first
+	  attempt at testing all the instantiations.
+
+2005-10-29 Saturday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.38), BD_Shape.inlines.hh (1.72): In the
+	  limited widening operators, we now avoid having to decode twice
+	  the limiting constraints (joint work with E. Mazzi).	In several
+	  places, upward loop iteration replaced by a downward one.
+
+2005-10-28 Friday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (grids.5): Added a list of TODO items for the grids branch.
+
+2005-10-28 Friday 12:38  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.29): Calculate the proper congruence
+	  coefficients in the covering box constructor via the GCD of the
+	  divisors, instead of getting the LCM of the divisors (with
+	  lcm_assign) and then repeating parts of this LCM calculation.
+	  Given that the divisors are known to be positive, this also saves
+	  the absolute value calculations that would have been performed in
+	  lcm_assign.
+
+2005-10-27 Thursday 18:10  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, boundingbox1.cc, coveringbox1.cc,
+	  coveringbox2.cc (grids.[37,6,7,1]): Add coveringbox2.  Move the
+	  coveringbox1 tests into coveringbox2, and move the boundingbox1
+	  tests into coveringbox1.  Fill boundingbox1 with tests of the
+	  bounding box constructor.
+
+2005-10-27 Thursday 18:04  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[54,28]): Add a
+	  bounding box constructor.  In the covering box constructor move
+	  the closed bound checks to come before the empty test.
+
+2005-10-27 Thursday 12:31  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.53): Add the open bound behaviour to the
+	  description of the covering box constructor.
+
+2005-10-27 Thursday 12:04  Matthew Mundell
+
+	* tests/Grid/boundingbox1.cc (grids.5): Add test11, in which a
+	  bound in the box is open.
+
+2005-10-27 Thursday 12:03  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.27): In the covering box constructor
+	  throw an exception if any bound is open.
+
+2005-10-26 Wednesday 17:47  Matthew Mundell
+
+	* src/Grid.defs.hh, src/Grid.inlines.hh,
+	  tests/Grid/boundingbox1.cc, tests/Grid/coveringbox1.cc
+	  (grids.[52,26,4,6]): Use From_Covering_Box instead of
+	  From_Bounding_Box in the Grid from box constructor.
+
+2005-10-26 Wednesday 17:44  Matthew Mundell
+
+	* src/globals.defs.hh (grids.4): Add tag class From_Covering_Box.
+
+2005-10-26 Wednesday 16:21  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.51): Improve the covering box constructor
+	  description.	Add the methods required of the box class to the
+	  get_covering_box description.
+
+2005-10-26 Wednesday 15:23  Matthew Mundell
+
+	* src/Grid_public.cc (grids.69): In OK, assert that the reduced
+	  temporary generator system defines a grid that contains points.
+
+2005-10-26 Wednesday 15:22  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.20): In the generator system minimize
+	  method assert that, after being reduced, the generator system
+	  defines a grid that contains points, instead of catering for an
+	  empty resulting grid.  Take out the Linear_Row.defs.hh include.
+	  Correct the title comment.
+
+2005-10-26 Wednesday 15:19  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.25): In get_covering_box assert that,
+	  after being reduced, the generator system defines a grid that
+	  contains points, instead of catering for an empty resulting grid.
+
+2005-10-26 Wednesday 15:14  Matthew Mundell
+
+	* src/Grid_Certificate.cc (grids.5): Simplify the
+	  Grid_Certificate(cgr) assertion that after being reduced the
+	  generator system defines a grid that contains points.
+
+2005-10-26 Wednesday 12:48  Matthew Mundell
+
+	* tests/Grid/boundingbox1.cc (grids.3): Add test10, where the box
+	  has a dimension open only from below.
+
+2005-10-26 Wednesday 12:47  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.50): Improve the descriptions of the box
+	  constructor and method get_covering_box.
+
+2005-10-26 Wednesday 12:46  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.24): In the Grid covering box
+	  constructor add an equality for each interval that is bounded
+	  only from below.
+
+2005-10-26 Wednesday 11:38  Matthew Mundell
+
+	* tests/Grid/coveringbox1.cc (grids.5): Use Bounding_Box instead of
+	  BBox.  Add a temporary Bounding_Box operator==.  Rename box to
+	  box1.  In every test add a further check which uses the Grid
+	  covering box constructor.  Always use closed bounds.
+
+2005-10-26 Wednesday 11:33  Matthew Mundell
+
+	* tests/Grid/boundingbox1.cc (grids.2): Match the expected values
+	  to the updated behaviour of the covering box constructor.
+
+2005-10-26 Wednesday 11:32  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.23): Update the covering box
+	  constructor to handle universe, empty and half open intervals in
+	  ways that match the behaviour of get_covering_box.  Always use
+	  closed bounds.
+
+2005-10-25 Tuesday 17:23  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.49): In the get_covering_box description
+	  note that the lower bounds are as close as possible to the
+	  origin, and add information about the calling guarantees.
+
+2005-10-25 Tuesday 14:33  Matthew Mundell
+
+	* tests/Grid/coveringbox1.cc (grids.4): Add test12, in which all
+	  the points have the same value in one of the dimensions.  Update
+	  the expected values in test2 so that the lower bounds are as
+	  close as possible to the origin.  Add the dimension in the test11
+	  description.
+
+2005-10-25 Tuesday 14:21  Matthew Mundell
+
+	* configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Grid_conversion.cc, src/Grid_minimize.cc,
+	  src/Grid_nonpublic.cc, src/Grid_simplify.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/coveringbox1.cc
+	  (grids.[7,5,7,3,3,21,19,34,32,6,3]): Revert files accidentally
+	  included in last change.
+
+2005-10-25 Tuesday 13:53  Matthew Mundell
+
+	* configure.ac, doc/Makefile.am, src/Checked_Number.defs.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh, src/Grid.inlines.hh,
+	  src/Grid_conversion.cc, src/Grid_minimize.cc,
+	  src/Grid_nonpublic.cc, src/Grid_simplify.cc,
+	  tests/Grid/affineimage1.cc, tests/Grid/coveringbox1.cc
+	  (grids.[6,4,6,2,2,22,20,18,33,31,5,2]): In get_covering_box
+	  rename gcds to interval_sizes and update the algorithm to always
+	  use the smallest possible absolute values for the lower bounds.
+
+2005-10-25 Tuesday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.71): Forgot to close namespace.
+
+2005-10-25 Tuesday 10:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.37), BD_Shape.inlines.hh (1.70): Added
+	  a new function extract_bounded_difference() to factorize repeated
+	  code for decoding a constraint.  A lot of repeated code also
+	  factorized in method relation_with().  Added a private method
+	  BD_Shape<T>::get_limiting_constraints() to be used in the
+	  implementations of limited widening operators.  Prefer assign()
+	  to the direct assignment operator when assigning zero.  Removed a
+	  couple of improper usages of the Coefficient_traits template.
+
+2005-10-24 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinedimension1.cc (grids.1): file
+	  affinedimension1.cc was added on branch grids on 2005-11-23
+	  13:24:07 +0000
+
+2005-10-24 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.36), src/BD_Shape.inlines.hh (1.69),
+	  tests/BD_Shape/Makefile.am (1.18),
+	  tests/BD_Shape/affinedimension1.cc (1.1): Added a first
+	  implementation of new method dimension_type
+	  BD_Shape<T>::affine_dimension() const.  The new program
+	  affinedimension1.cc containts some tests for it.  (Joint work
+	  with Elena Mazzi.)
+
+2005-10-24 Monday 14:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.35), BD_Shape.inlines.hh (1.68),
+	  DB_Matrix.defs.hh (1.6), DB_Matrix.inlines.hh (1.6),
+	  DB_Row.inlines.hh (1.8), checked.defs.hh (1.25): Removed a lot of
+	  commented out stuff from DB_Row.inlines.hh.  When creating DB_Row
+	  and DB_Matrix objects, the coefficients are now initialized to
+	  the value PLUS_INFINITY.  DB_Matrix no longer has unused (and
+	  unimplemented) methods space_dimensions() and
+	  add_rows_and_columns().  BD_Shape no longer needs the method
+	  init().  In the BD_Shape implementation, added a couple of
+	  utility function that help in factoring common code.	In methods
+	  adding space dimensions, take into accoount that the newly added
+	  coefficients are already initialized to PLUS_INFINITY.  Added a
+	  lot of missing const qualifications.	The
+	  shortest_path_reduction_assign() method has been almost
+	  reimplemented from scratch: it should now be easier to move
+	  towards an implementation where shortest-path closure is not
+	  compromised by reduction.  Several comments improved.
+
+2005-10-24 Monday 14:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/DB_Row.defs.hh (1.10): Some comments reworded. An unused
+	  preprocessor variable removed.
+
+2005-10-24 Monday 14:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.140), src/Constraint_System.defs.hh
+	  (1.17), src/globals.types.hh (1.2), src/simplex.cc (1.28),
+	  tests/Polyhedron/primalsimplex1.cc (1.2),
+	  tests/Polyhedron/primalsimplex2.cc (1.2): Using a new enumerated
+	  type Optimization_Kind to specify whether the primal simplex
+	  algorithm should maximize or minimize the object function.
+
+2005-10-24 Monday 12:39  Matthew Mundell
+
+	* configure.ac (1.195): Set text_md5sum, to complete last change.
+
+2005-10-24 Monday 11:30  Matthew Mundell
+
+	* configure.ac (1.194): Take out the attempt at checking for an
+	  md5sum -t option.
+
+2005-10-22 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (grids.1): file
+	  ac_check_sicstus_prolog.m4 was added on branch grids on
+	  2005-11-23 13:24:06 +0000
+
+2005-10-22 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_xsb_prolog.m4 (grids.1): file ac_check_xsb_prolog.m4
+	  was added on branch grids on 2005-11-23 13:24:06 +0000
+
+2005-10-22 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.193), interfaces/Prolog/SICStus/Makefile.am
+	  (1.57), interfaces/Prolog/SWI/Makefile.am (1.54),
+	  interfaces/Prolog/XSB/Makefile.am (1.37),
+	  m4/ac_check_sicstus_prolog.m4 (1.3), m4/ac_check_swi_prolog.m4
+	  (1.6), m4/ac_check_xsb_prolog.m4 (1.1): Treat SICStus, SWI and
+	  XSB Prolog in a uniform way.
+
+2005-10-22 Saturday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.163): Added blank lines to help readability.
+
+2005-10-22 Saturday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_sicstus_prolog.m4 (1.2): Make sure things work even
+	  if `sicstus' is a symbolic link.
+
+2005-10-21 Friday 21:27  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, coveringbox1.cc (grids.[36,1]): Add
+	  coveringbox1, which tests get_covering_box.
+
+2005-10-21 Friday 21:25  Matthew Mundell
+
+	* src/Grid_Certificate.cc (grids.4): Finalise calculation of number
+	  of congruences from number of generators.
+
+2005-10-21 Friday 21:25  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[48,21]): Add template
+	  get_covering_box.
+
+2005-10-21 Friday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.192), interfaces/Prolog/SICStus/Makefile.am
+	  (1.56), m4/ac_check_sicstus_prolog.m4 (1.1): New machinery to
+	  automatically detect the location where SICStus Prolog was
+	  installed.  Now, the only requirement imposed on the user is to
+	  have `sicstus' reachable from the shell's PATH.
+
+2005-10-21 Friday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.191): Version number bumped.
+
+2005-10-21 Friday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.5): Comment fixed.
+
+2005-10-21 Friday 14:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.24): Added a couple of missing
+	  declarations of template specializations, that were causing an
+	  error to be reported by the Intel compiler.
+
+2005-10-20 Thursday 11:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.34): The Doxygen documentation is now
+	  (almost) formatted according to STANDARDS.
+
+2005-10-20 Thursday 10:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh (1.8), src/BDS_Status.inlines.hh (1.6),
+	  src/BD_Shape.defs.hh (1.33), src/BD_Shape.inlines.hh (1.67),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.5): Started cleaning up the
+	  code for BD_Shape<T>.  The entailment clsoure method ofr BDSs is
+	  shortest-path closure (transitive closure is another thing):
+	  method names and status flags changed accordingly.  Now avoiding
+	  the (almost) useless initialization of BDS in the constructor
+	  BD_Shape(const Generator_System& gs); Source code in file
+	  BD_Shape.inlines.hh reordered so that all inline
+	  methods/functions come before the non-inline method/function
+	  templates.
+
+2005-10-20 Thursday 10:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundingbox1.cc (1.6): Added another test for
+	  shrinking a bounding box in polynomial time when there are
+	  redundant constraints.
+
+2005-10-19 Wednesday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.139), ppl_c.h.in (1.54): Public method
+	  Constraint_System::has_strict_inequalities() is now accessible
+	  even from the C interface.
+
+2005-10-19 Wednesday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.162): Method Constraint_System::has_strict_inequalities()
+	  is now public.
+
+2005-10-19 Wednesday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.27): The primal_simplex() is now also
+	  applicable to an NNC constraint system containing no strict
+	  inequality constraints.
+
+2005-10-19 Wednesday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.16): Method
+	  has_strict_inequalities() is no longer private.
+
+2005-10-19 Wednesday 16:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.32): Prefer qualified access
+	  to class template member data and functions.	Removed a wrong
+	  const qualification is concatenate_assign().
+
+2005-10-19 Wednesday 12:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.13): Added a missing const qualifier.
+
+2005-10-18 Tuesday 23:32  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.12): Include cstdlib.
+
+2005-10-18 Tuesday 23:28  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.11): Add a test where the
+	  parsing fails and whitespace follows the parsed number.
+
+2005-10-18 Tuesday 23:12  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.10): Check for expected
+	  spaces in residuals.	Always exit with 1 on error.
+
+2005-10-18 Tuesday 20:19  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.9): Add three tests with
+	  trailing whitespace.
+
+2005-10-17 Monday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.59), devref.doxyconf-latex.in
+	  (1.3), user.doxyconf-html.in (1.31), user.doxyconf-latex.in
+	  (1.3): In the devref manuals, also produce documentation for
+	  Scalar_Products.
+
+2005-10-17 Monday 09:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.126): Do not forget Scalar_Products.types.hh.
+
+2005-10-16 Sunday 17:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.109), Constraint_System.cc (1.12),
+	  Generator.defs.hh (1.111), Generator_System.cc (1.13),
+	  Linear_Expression.defs.hh (1.13), Linear_System.cc (1.30),
+	  Makefile.am (1.125), Polyhedron_nonpublic.cc (1.56),
+	  Polyhedron_public.cc (1.67), Polyhedron_widenings.cc (1.51),
+	  Scalar_Products.cc (1.1), Scalar_Products.defs.hh (1.1),
+	  Scalar_Products.inlines.hh (1.1), Scalar_Products.types.hh (1.1),
+	  conversion.cc (1.75), scalar_products.cc (1.3),
+	  scalar_products.defs.hh (1.5), scalar_products.inlines.hh (1.6),
+	  scalar_products.types.hh (1.2): Files "scalar_products.*" renamed
+	  as "Scalar_Products.*".
+
+2005-10-16 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.defs.hh (grids.1): file
+	  Scalar_Products.defs.hh was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-10-16 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.inlines.hh (grids.1): file
+	  Scalar_Products.inlines.hh was added on branch grids on
+	  2005-11-23 13:24:06 +0000
+
+2005-10-16 Sunday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Scalar_Products.types.hh (grids.1): file
+	  Scalar_Products.types.hh was added on branch grids on 2005-11-23
+	  13:24:06 +0000
+
+2005-10-15 Saturday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.161): Provide better visual separation for "displayed"
+	  material.
+
+2005-10-15 Saturday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.160): Ellipsis has a well-defined meaning in C++: avoid
+	  using it to signify "parameters omitted".
+
+2005-10-15 Saturday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.20): Updated.
+
+2005-10-15 Saturday 09:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.15),
+	  Constraint_System.inlines.hh (1.6), Generator_System.defs.hh
+	  (1.10), Generator_System.inlines.hh (1.5): Classes
+	  Constraint_System and Generator_System now have a private method
+	  simplify() that calls the new method of class Linear_System. In
+	  the case of generators, the wrapper method also removes any
+	  invalid rays or lines that may have been generated.
+
+2005-10-15 Saturday 09:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.inlines.hh (1.57), Generator_System.cc (1.12): Do
+	  exploit new method Generator::is_line_or_ray().
+
+2005-10-15 Saturday 09:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.37): Corrected a dependency bug:
+	  test nnc_boudningbox5 was compiling source file boundingbox3.cc.
+
+2005-10-14 Friday 19:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.29), Linear_System.defs.hh (1.18),
+	  Polyhedron.inlines.hh (1.124), Polyhedron_public.cc (1.66),
+	  simplify.cc (1.44): Linear_System methods gauss() and
+	  back_substitute() modified so as to assert all the known
+	  preconditions. Method gauss() also modified so as to receive as
+	  input the number of lines/equalities on which it should be
+	  applied. Added a new method Linear_System::simplify() that takes
+	  care of appropriately combine the two methods above when needed,
+	  so as to ensure that all preconditions are met. The new method is
+	  now used in the implementation of
+	  Polyhedron::shrink_bounding_box() and Polyhedron::OK().
+
+2005-10-14 Friday 13:09  Matthew Mundell
+
+	* src/checked.cc (1.9): Comment every function.  Slightly improve
+	  the formatting in parse_number and input_mpq.
+
+	  In parse_number1
+
+	   - move the error handling to the first error occurrence (this
+	  ensures
+	     that variables are always initialised at the destinations of
+	  the
+	     error jumps)
+
+	   - capatilise the second 'n' in the "inf" check
+
+	   - make the '+' case when parsing strings like "+inf" fall
+	  through to
+	     the "inf" parsing, instead of jumping to it
+
+	   - after the initial sign-and-symbol-parsing switch statement,
+	  split
+	     the validity check on the current character into two checks,
+	  one of
+	     which is already present
+
+	   - use only variable c when parsing a leading "0x", instead of
+	  using a
+	     second variable (d)
+
+	   - convert the parsing state machine into a series of loops, to
+	  save
+	     the state interpretation overhead and to lower the number of
+	  jumps
+	     and the size of the code
+
+	   - manually inline the small relevant portion of get_digit at the
+	     digit validity checks which call get_digit with a base of ten.
+
+2005-10-14 Friday 11:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.65): Prefer "unsatisfiable" to
+	  "insoluble".
+
+2005-10-14 Friday 09:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/scalar_products.types.hh (1.1): Put under CVS control.
+
+2005-10-13 Thursday 10:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.108), Constraint_System.cc (1.11),
+	  Generator.defs.hh (1.110), Generator.inlines.hh (1.56),
+	  Generator_System.cc (1.11), Generator_System.defs.hh (1.9),
+	  Linear_Expression.defs.hh (1.12), Linear_System.cc (1.28),
+	  Polyhedron_chdims.cc (1.34), Polyhedron_nonpublic.cc (1.55),
+	  Polyhedron_public.cc (1.64), Polyhedron_widenings.cc (1.50),
+	  conversion.cc (1.74), scalar_products.cc (1.2),
+	  scalar_products.defs.hh (1.4), scalar_products.inlines.hh (1.5):
+	  Added class Scalar_Products gathering all scalar product
+	  functions defined so far. Also added class
+	  Topology_Adjusted_Scalar_Product_Sign, implementing a function
+	  object choosing the correct scalar product function for the given
+	  context. Using these classes to simplify friend declarations and
+	  to allow for the removal of some friend declarations. In
+	  particular:  - Constraint_System is no longer a friend of
+	  Generator;  - Generator_System is no longer a friend of
+	  Constraint.  Also added a few missing const qualifications to
+	  local variables.
+
+2005-10-12 Wednesday 17:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.159), TODO (1.157): Updated for the with_token changes to
+	  the Prolog interface.
+
+2005-10-12 Wednesday 17:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.134): Documentation for
+	  the Prolog widening/extrapolation "with_tokens" predicates
+	  revised to match the changes to the actual implementation.
+	  General improvements to the descriptions of all the Prolog
+	  widening/extrapolation predicates.
+
+2005-10-11 Tuesday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.163), Ciao/ciao_pl_check.pl
+	  (1.14), Ciao/ppl_ciao.pl (1.82), GNU/ppl_gprolog.pl (1.54),
+	  SICStus/ppl_sicstus_sd.cc (1.80), SWI/ppl_swiprolog.cc (1.104),
+	  XSB/ppl_xsb.H (1.42), XSB/ppl_xsb.cc (1.71), XSB/xsb_pl_check.P
+	  (1.19), YAP/ppl_yap.cc (1.98), tests/pl_check.pl (1.12): Modified
+	  the "with_token" widening and extrapolation predicates to be
+	  "with_tokens" where each predicate has an extra argument (ie
+	  there are two arguments for the token numbers).
+
+	  All predicates require the number of available tokens as input in
+	  the first token argument and unify the second of the token
+	  arguments with the number of tokens available after the
+	  widening/extrapolation operation.
+
+	  pl_check.pl now tests the modified predicates and their possible
+	  exceptions.
+
+2005-10-11 Tuesday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.9): Help message now says something about
+	  the available options.
+
+2005-10-11 Tuesday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, STANDARDS, TODO, config.guess, configure.ac,
+	  Watchdog/config.guess, Watchdog/src/Makefile.am,
+	  Watchdog/src/Makefile.in, Watchdog/utils/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/README.doc,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/devref.doxyconf-latex.in, doc/devref.tex,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  doc/user.doxyconf-latex.in, doc/user.tex,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.types.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/Linear_System.cc,
+	  src/Makefile.am, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Polyhedra_Powerset.cc,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_public.cc, src/checked_float.inlines.hh,
+	  src/minimize.cc, src/simplex.cc,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/bgp99extrapolation1.cc,
+	  tests/BD_Shape/bhz03widening1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/numberinput1.cc,
+	  tests/Polyhedron/polypowerset1.cc, tests/Polyhedron/powerset1.cc,
+	  tests/Polyhedron/primalsimplex2.cc, utils/Makefile.am
+	  (grids.[4,5,4,3,5,3,2,2,3,4,4,3,2,4,4,4,1,1,3,3,3,1,1,4,2,3,5,5,5,5,4,6,6,2,4,8,3,2,4,9,4,5,2,5,6,4,6,6,2,4,2,5,1,1,9,2,2,1,1,3]):
+	  Fifth merge from main trunk.
+
+2005-10-11 Tuesday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.H (1.41): Reflect the
+	  reorganization of the Watchdog directory.
+
+2005-10-10 Monday 17:11  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.8): Add two hexadecimal tests
+	  where parsing will stop after the "0x".  Use valid digits in the
+	  exponent of "3^^e3" (i.e. use "3^^e2").
+
+2005-10-09 Sunday 08:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.97): Comparisons with
+	  LONG_MAX fixed.
+
+2005-10-08 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.26): Avoid requesting the inlining of complex
+	  functions.
+
+2005-10-08 Saturday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.96): YAP should now support
+	  unlimited precision integers.  Some FIXMEs dealt with, but had to
+	  add one because of what looks like a bug in YAP.
+
+2005-10-08 Saturday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.63): Use
+	  Constraint::inhomogeneous_term() instead of c[0] when
+	  appropriate.	Moved a useful comment outside assertion-like code,
+	  because the comment is relevant even when assertions are
+	  disabled.  When invoking scalar_product_sign(), the first
+	  argument should be the constraint and the second the generator
+	  (not the other way round).  Several occurrences of	 if
+	  (var_space_dim <= expr_space_dim && expr[var_space_dim] != 0) {
+	  replaced by the shorter (and as efficient as)     if
+	  (expr.coefficient(var) != 0) { One use of
+	  Coefficient_traits::const_reference inside a function body
+	  definition replaced by const Cefficient&.
+
+2005-10-08 Saturday 09:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.cc (1.4), Polyhedra_Powerset.inlines.hh
+	  (1.31), checked_float.inlines.hh (1.45): Comments revised.  Refer
+	  to GCC's Bugzilla when talking about GCC bugs.  GCC (the GNU
+	  Compiler Collection) is written with all capitals.
+
+2005-10-08 Saturday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.23): To work around a bug in
+	  GCC 3.3.3, we temporarily make all Polyhedra_Powerset's friends
+	  of each other.
+
+2005-10-08 Saturday 07:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.25): Stop being noisy.
+
+2005-10-07 Friday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.27): FIXME resolved.
+
+2005-10-07 Friday 18:43  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.7): Update temporary
+	  comments.  Increase stack space if large exponents are being
+	  used.  Add directive TEST_LARGE_EXPONENTS, which controls the
+	  inclusion of tests with large exponents.
+
+2005-10-07 Friday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.cc (1.3), Polyhedra_Powerset.inlines.hh
+	  (1.30): Applied workaround to a gcc bug affecting version 3.3.3.
+	  See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+
+2005-10-06 Thursday 18:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.19): In the first line comment,
+	  mentioned that the simplex solver can be used too.
+
+2005-10-06 Thursday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.46): Too long line has been split.
+
+2005-10-06 Thursday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.53): The Linear Programming demo is
+	  now in demos/ppl_lpsol/.
+
+2005-10-06 Thursday 17:59  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.6): Improve formatting and
+	  messages slightly.  Take out the "fix" macro.  Group tests into
+	  functions.  Add tests which expect characters trailing the
+	  number.  Add a test of the exponent size limit.  Revise temporary
+	  comments.
+
+2005-10-06 Thursday 12:26  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.5): Take out tracing function
+	  dump_mpz_ptr.  Only print output on error.
+
+2005-10-06 Thursday 12:21  Matthew Mundell
+
+	* src/checked_int.inlines.hh (1.39): Clip trailing spaces.
+
+2005-10-06 Thursday 11:56  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.25): In satisfies_all_congruences
+	  multiply the modulus by the divisor when the divisor is greater
+	  than 1 (was 0).
+
+2005-10-06 Thursday 11:55  Matthew Mundell
+
+	* src/GMP_Integer.defs.hh (grids.5): Take `inline' out of gcdext
+	  declarations.
+
+2005-10-06 Thursday 11:54  Matthew Mundell
+
+	* src/checked.inlines.hh (grids.7): In gcdext_generic do the s and
+	  t negation only once when the given x and y are negative.
+
+2005-10-06 Thursday 11:50  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.35): Add FAIL_TEST directives for
+	  the checked types.
+
+2005-10-04 Tuesday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.24): Do not use conditional expressions with
+	  expressions of different type.
+
+2005-10-04 Tuesday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.29):
+	  Polyhedra_Powerset<PH>::concatenate_assign() was still buggy.
+
+2005-10-04 Tuesday 20:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.28): Fixed a bug
+	  Polyhedra_Powerset<PH>::concatenate_assign() whereby a temporary
+	  Polyhedra_Powerset object was created with the wrong dimension.
+
+2005-10-04 Tuesday 20:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.6): New test simplified (it
+	  could not reproduce the time-dependent bug it was supposed to
+	  reproduce).
+
+2005-10-04 Tuesday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.5): Added a new test that
+	  exposes a bug in Polyhedra_Powerset<PH>::concatenate_assign().
+
+2005-10-04 Tuesday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.156): A PPL distribution is compilable on environments
+	  lacking Perl.
+
+2005-10-04 Tuesday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.155), src/GMP_Integer.defs.hh (1.11), src/simplex.cc
+	  (1.23): Added macro PPL_NOISY_SIMPLEX to enable a limited amount
+	  of debugging output when executing the primal simplex.  The
+	  documentation of function is_in_base() improved.  Function
+	  compute_generator() also simplified.
+
+2005-10-04 Tuesday 14:45  Matthew Mundell
+
+	* src/minimize.cc (1.42): Indent note consistently.
+
+2005-10-04 Tuesday 14:35  Matthew Mundell
+
+	* src/Polyhedron_public.cc (1.62): Take out two redundant `else'
+	  and a redundant `if'.  Correct some comments (mostly typos).
+	  Clip a trailing space.  Take out a \relates comment on a
+	  Polyhedron method.
+
+2005-10-04 Tuesday 13:20  Matthew Mundell
+
+	* src/Polyhedron_chdims.cc (1.33): Correct and update some comments
+	  (mostly grammar).  Add a space after two primitive calls in
+	  expand_space_dimension.
+
+2005-10-04 Tuesday 12:58  Matthew Mundell
+
+	* src/: Native_Integer.defs.hh (1.13), Native_Integer.inlines.hh
+	  (1.14): Add template assign(Native_Integer<To>&, const
+	  mpz_class&, Rounding_Dir).
+
+2005-10-04 Tuesday 12:57  Matthew Mundell
+
+	* tests/Random_Number_Generator.inlines.hh (1.3): Revert to using
+	  assign in method get.
+
+2005-10-04 Tuesday 12:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.44): Point 3 of Section 6.7.3
+	  [Type qualifiers] of the C99 standard says that "The properties
+	  associated with qualified types [const, restrict, volatile] are
+	  meaningful only for expressions that are lvalues." Point 8 of
+	  Section 7.1.5.1 [The cv qualifiers] of the C++98 standard says
+	  that "In general, the semantics of volatile are intended to be
+	  the same in C++ as they are in C." Since functions can only
+	  return rvalues, and since C++98 and C99 are (believed to be)
+	  converging, the type qualifier "volatile" on return type has been
+	  removed.  FIXME resolved.
+
+2005-10-03 Monday 23:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.22): Stupid bug recently introduced is now
+	  corrected.
+
+2005-10-03 Monday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.190): Revised the URI for the Perl directory at
+	  perl.org.
+
+2005-10-03 Monday 18:11  Matthew Mundell
+
+	* tests/Random_Number_Generator.inlines.hh (1.2): In method get
+	  "use" parameter info, and assign the generated number with
+	  operator= (via a temporary) instead of with method assign (as
+	  operator= is present in Native_Integer).
+
+2005-10-03 Monday 14:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/bgp99extrapolation1.cc (1.1): Put under CVS
+	  control.
+
+2005-10-03 Monday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.17), bhz03widening1.cc (1.1):
+	  Added a new test for the first implementation of a
+	  certificate-based widening on a powerset of BD_Shape's.
+
+2005-10-03 Monday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.32), BD_Shape.inlines.hh (1.66): Added
+	  methods difference_assign() and strictly_contains(), that are
+	  required when instantiating Polyhedra_Powerset<BD_Shape> and
+	  using the BHZ03 widening.  Widening methods now have a dummy
+	  token argument (not used yet).  Removed unreasonable inline
+	  directives from too complex class template member
+	  implementations.
+
+2005-10-03 Monday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: H79_Certificate.defs.hh (1.12), H79_Certificate.inlines.hh
+	  (1.6): Added constructor template and comparison member template,
+	  so as to provide a dummy (but working) certificate implementation
+	  for all classes PH providing method PH::constraints() (e.g.,
+	  BD_Shape).
+
+2005-10-02 Sunday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.65): Added a missing const qualifier
+	  and revised a comment in BD_Shape<T>::init().
+
+2005-10-02 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/Makefile.am (1.3), src/Makefile.am (1.124):
+	  Definition of BUILT_SOURCES revised.
+
+2005-10-02 Sunday 12:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.189): Version number bumped.
+
+2005-10-02 Sunday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.33), Watchdog/config.guess (1.17): Updated.
+
+2005-10-02 Sunday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.37), devref.doxyconf-html.in (1.58),
+	  devref.doxyconf-latex.in (1.2), devref.tex (1.18),
+	  user.doxyconf-html.in (1.30), user.doxyconf-latex.in (1.2),
+	  user.tex (1.19): We now generate PostScript from PDF.
+
+2005-10-02 Sunday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/powerset1.cc (1.2): Added Fcaibvp::OK().
+
+2005-10-01 Saturday 15:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.24): Added a section describing source file naming
+	  and structuring conventions.	Another section has to do with
+	  macros.
+
+2005-10-01 Saturday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.36), powerset1.cc (1.1): New
+	  (incomplete) test program to test the Powerset class.
+
+2005-10-01 Saturday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.188), doc/Makefile.am (1.36), doc/README.doc
+	  (1.6), doc/devref-browse.doxyconf-latex.in (1.57),
+	  doc/devref-print.doxyconf-latex.in (1.57),
+	  doc/devref.doxyconf-html.in (1.57), doc/devref.doxyconf-latex.in
+	  (1.1), doc/user-browse.doxyconf-latex.in (1.27),
+	  doc/user-print.doxyconf-latex.in (1.27),
+	  doc/user.doxyconf-html.in (1.29), doc/user.doxyconf-latex.in
+	  (1.1): No longer produce "browse" and "print" version, since the
+	  "browse" version is equally good for printing.  Construction of
+	  the documentation much simplified.  Doxygen configuration files
+	  updates.
+
+2005-09-30 Friday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.34): Header file instchk.hh listed in
+	  dist_noinst_HEADERS.
+
+2005-09-30 Friday 21:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.21): No longer using (and thus eliminated)
+	  functions insert_row_in_matrix(), add_element_to_row(),
+	  copy_column().  Function check_optimality() renamed as
+	  get_entering_index(), its signature restructured and its
+	  implementation made a little bit more efficient.  Function
+	  choose_out_var() renamed as get_exiting_index(), its signature
+	  restructured and its implementation heavily changed to
+	  (hopefully) made it more efficient.  Function compute_simplex()
+	  changed accordingly.	Function compute_tableau() further
+	  simplified by removing a lot of (not really necessary)
+	  bookkeeping. Local variables renamed for improved readability.
+
+2005-09-30 Friday 09:16  David Merchat
+
+	* src/GMP_Integer.types.hh (1.9): We use doxygen command
+	  ``\relates'' to put  all informations about GMP_Integer at the
+	  same place. Since \relates must refer to a class and GMP_Integer
+	  is not a class but a type we obtain a warning for all ``\relates
+	  GMP_Integer'' To eliminate those warnings we add a doxygen
+	  comment ``\class GMP_Integer'' just before declaration of type
+	  GMP_Integer
+
+2005-09-29 Thursday 18:03  Matthew Mundell
+
+	* src/: checked.inlines.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh (grids.[6,5,5]): Rename gcdext_generic to
+	  gcdext_exact.
+
+2005-09-29 Thursday 18:02  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  scalar_products.cc, scalar_products.defs.hh,
+	  scalar_products.inlines.hh (grids.[12,21,16,2,2,2]): Move scalar
+	  product functions into scalar_products.*.
+
+2005-09-29 Thursday 17:00  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.4): Improve the call to
+	  function input in function test.  Update temporary comments.	Add
+	  a test with a much larger integer.
+
+2005-09-29 Thursday 11:24  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.3): Convert test_template to
+	  function test, which uses an mpq_class checked number.  In
+	  function test read number with function input (instead of op>>),
+	  compare the result of the conversion with an expected result, and
+	  use is_not_a_number instead of classify.
+
+	  Narrow long test invocations.  Add an expected result value to
+	  each invocation.
+
+2005-09-28 Wednesday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.154), configure.ac (1.187), Watchdog/src/Makefile.am
+	  (1.2), src/Makefile.am (1.123): A PPL distribution should now be
+	  compilable even on environments lacking Perl.
+
+2005-09-28 Wednesday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/src/: .cvsignore, Doubly_Linked_Object.defs.hh,
+	  Doubly_Linked_Object.inlines.hh, Doubly_Linked_Object.types.hh,
+	  EList.defs.hh, EList.inlines.hh, EList.types.hh,
+	  EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+	  EList_Iterator.types.hh, Handler.defs.hh, Handler.inlines.hh,
+	  Handler.types.hh, Makefile.am, Makefile.in, Pending_Element.cc,
+	  Pending_Element.defs.hh, Pending_Element.inlines.hh,
+	  Pending_Element.types.hh, Pending_List.cc, Pending_List.defs.hh,
+	  Pending_List.inlines.hh, Pending_List.types.hh, Time.cc,
+	  Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+	  Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+	  pwl_header.hh
+	  (grids.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Files moved as in the main trunk.
+
+2005-09-28 Wednesday 21:04  Matthew Mundell
+
+	* CREDITS, ChangeLog, Makefile.am, NEWS, STANDARDS, TODO,
+	  configure.ac, instchk.hh, Watchdog/.cvsignore,
+	  Watchdog/ChangeLog, Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+	  Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh,
+	  Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+	  Watchdog/Makefile.am, Watchdog/Pending_Element.cc,
+	  Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh,
+	  Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/Pending_List.types.hh, Watchdog/Time.cc,
+	  Watchdog/Time.defs.hh, Watchdog/Time.inlines.hh,
+	  Watchdog/Time.types.hh, Watchdog/Watchdog.cc,
+	  Watchdog/Watchdog.defs.hh, Watchdog/Watchdog.inlines.hh,
+	  Watchdog/Watchdog.types.hh, Watchdog/configure.ac,
+	  Watchdog/pwl_header.hh, Watchdog/utils/Makefile.am,
+	  Watchdog/utils/build_header, Watchdog/utils/build_header.in,
+	  demos/ppl_lcdd/ppl_lcdd.cc, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/C/ppl_c.cc, interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/pl_check.pl, m4/ac_check_swi_prolog.m4,
+	  src/Ask_Tell.defs.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh, src/Bounding_Box.defs.hh,
+	  src/Bounding_Box.inlines.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Checked_Number.types.hh,
+	  src/Coefficient.types.hh, src/Constraint.defs.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/DB_Row.defs.hh,
+	  src/Determinate.defs.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GMP_Integer.types.hh,
+	  src/Generator.defs.hh, src/Generator_System.cc,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh, src/Init.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Row.cc,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh, src/Makefile.am,
+	  src/Matrix.cc, src/Matrix.inlines.hh, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Native_Integer.types.hh,
+	  src/Polyhedra_Powerset.cc, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Row.cc, src/Row.defs.hh,
+	  src/Saturation_Matrix.cc, src/Saturation_Row.cc,
+	  src/Saturation_Row.defs.hh, src/Saturation_Row.inlines.hh,
+	  src/Variable.defs.hh, src/algorithms.hh, src/checked.cc,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/conversion.cc, src/globals.defs.hh, src/globals.inlines.hh,
+	  src/globals.types.hh, src/mp_numeric_limits.hh,
+	  src/scalar_products.cc, src/scalar_products.defs.hh,
+	  src/scalar_products.inlines.hh, src/simplex.cc,
+	  tests/Makefile.am, tests/Random_Number_Generator.defs.hh,
+	  tests/Random_Number_Generator.inlines.hh,
+	  tests/Random_Number_Generator.types.hh, tests/ppl_test.hh,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/geomcovers1.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening6.cc,
+	  tests/Polyhedron/exceptions1.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramschmidt1.cc,
+	  tests/Polyhedron/gramshmidt1.cc,
+	  tests/Polyhedron/linearsystem1.cc, tests/Polyhedron/matrix1.cc,
+	  tests/Polyhedron/numberinput1.cc, utils/Makefile.am,
+	  utils/build_header, utils/build_header.in, utils/text2cxxarray,
+	  utils/text2cxxarray.in
+	  (grids.[1,1,3,3,4,3,4,1,1,1,2,2,1,2,2,1,2,2,1,3,3,1,2,2,2,2,1,2,2,2,1,2,2,3,1,2,2,2,1,2,2,2,2,1,3,3,3,3,2,2,2,4,2,3,4,2,3,2,3,2,5,2,3,1,1,1,1,2,3,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,3,2,4,4,1,1,5,2,3,2,3,3,4,3,1,7,13,2,2,3,5,5,5,4,3,2,8,3,2,3,4,1,1,4,5,7,5,3,5,5,3,2,5,2,2,2,2,2,3,3,4,5,4,4,4,3,4,3,2,3,3,1,1,1,1,1,3,3,1,1,1,12,4,1,2,8,2,2,2,2,2,2,2,2,1,2,1,1,1,2,2,1,2,1]):
+	  Fourth merge from the main trunk.
+
+2005-09-28 Wednesday 19:37  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.34), Checked_Number.inlines.hh
+	  (1.39): Added input and output functions
+
+2005-09-28 Wednesday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/utils/Makefile.am (1.4), utils/Makefile.am (1.10): Make
+	  sure the scripts in the `utils' subdirectory are made also at
+	  distribution time, even if they are not distributed themselves.
+
+2005-09-28 Wednesday 17:57  Matthew Mundell
+
+	* tests/Polyhedron/numberinput1.cc (1.2): In test_template add
+	  checks, including residual checks, and improve the comparison
+	  with the expected value.  Add expected residuals to all tests.
+
+2005-09-28 Wednesday 16:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.52), Constraint.defs.hh (1.107),
+	  Generator.cc (1.65), Generator.defs.hh (1.109): According to
+	  Doxygen manual, the \relates command should name a class, whereas
+	  Constraint::Type and Generator::Type are just enums.
+
+2005-09-28 Wednesday 14:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.20): Function compute_tableau() now directly
+	  detects trivially unbounded problems instead of leaving this
+	  simple check to the caller.  Function primal_simplex() corrected
+	  so as to return the origin point of the right space dimension
+	  when a trivial LP problem is given (fixing the bug uncovered by
+	  test primalsimplex2).
+
+2005-09-28 Wednesday 14:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.35), primalsimplex2.cc (1.1):
+	  New test shows a (space dimension mismatch) bug in the current
+	  implementation of the simplex algorithm.
+
+2005-09-27 Tuesday 21:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.19): Simplified function
+	  prepare_for_1st_ph_simplex(), avoiding useless copies and
+	  factoring 2nd and 3rd Row& arguments into a single Matrix&
+	  argument.  Adding slack variables all in one shot, instead of one
+	  at a time.  Simplified function first_phase() by avoiding useless
+	  matrix copies.
+
+2005-09-27 Tuesday 20:50  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.34), numberinput1.cc (1.1): Add
+	  numberinput1, a start at testing number input.
+
+2005-09-27 Tuesday 20:43  Matthew Mundell
+
+	* src/checked.cc (1.8): Really revert to revision 1.4.
+
+2005-09-27 Tuesday 12:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.18): Removed a few useless inclusions
+	  directives.  Added many const modifiers to local variable
+	  definitions.	Function swap_base() now takes a Row& (rather than
+	  a Matrix&) as its second argument.  Avoid recomputing the same
+	  value several times (using a reference instead).  Added some
+	  missing spaces for better readability.  Function erase_slacks()
+	  heavily rewritten so as to avoid a bunch of useless matrix
+	  copies.  Restructured the doxygen comments according to
+	  STANDARDS.  In primal_simplex(), use normalize2() instead of
+	  reinventing the wheel.
+
+2005-09-27 Tuesday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.14): Minor formatting
+	  improvement.
+
+2005-09-26 Monday 18:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.defs.hh (1.24): Removed a few useless inline
+	  directives and const modifiers from function declarations.
+
+2005-09-26 Monday 18:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.defs.hh (1.17): Removed a useless inline
+	  directive from a function declaration.
+
+2005-09-26 Monday 18:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.10): Removed many useless inline
+	  directives from function declarations.
+
+2005-09-26 Monday 18:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.inlines.hh (1.12): Added a const modifier to the
+	  low_bits_mask() parameter.
+
+2005-09-26 Monday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.17): Useless using declaration removed.  A few
+	  FIXME in the comments dealt with. Comments and code still deserve
+	  a lot of work to match the PPL quality standards.
+
+2005-09-26 Monday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.cc (1.2), Polyhedra_Powerset.defs.hh
+	  (1.22), Polyhedra_Powerset.inlines.hh (1.27): Dealt with a couple
+	  of FIXME's in the implementation by introducing a single FIXME in
+	  the definition of the templatic class.
+
+2005-09-26 Monday 16:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.cc (1.9), H79_Certificate.cc (1.8): A
+	  few FIXME's have been (properly) renamed into TODO's.
+
+2005-09-26 Monday 15:54  Matthew Mundell
+
+	* tests/Polyhedron/matrix1.cc (1.4): Correct spelling.
+
+2005-09-26 Monday 15:27  Matthew Mundell
+
+	* src/checked.defs.hh (1.24): Indent arguments to function
+	  declaration macros consistently.
+
+2005-09-26 Monday 15:24  Matthew Mundell
+
+	* tests/Polyhedron/linsysasciidumpload1.cc (1.2): Moved to
+	  linearsystem1.cc.
+
+2005-09-26 Monday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matrix1.cc (1.3): Avoid unnecessary inclusions.
+
+2005-09-26 Monday 13:44  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.33), linearsystem1.cc (1.1):
+	  Move linsysasciidumpload1 to linearsystem1.  Match linearsystem1
+	  to matrix1.
+
+2005-09-26 Monday 12:10  Matthew Mundell
+
+	* src/checked.cc (1.7): Revert to revision 1.4.
+
+2005-09-24 Saturday 22:28  Abramo Bagnara
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.35), tests/Makefile.am
+	  (1.246), tests/ppl_test.hh (1.26), tests/Polyhedron/matrix1.cc
+	  (1.2): Use new random number generator class.
+
+2005-09-24 Saturday 22:22  Abramo Bagnara
+
+	* tests/: Random_Number_Generator.defs.hh (1.1),
+	  Random_Number_Generator.inlines.hh (1.1),
+	  Random_Number_Generator.types.hh (1.1): Added random number
+	  generator class.
+
+2005-09-24 Saturday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.6): Class
+	  numeric_limits<Checked_Number<mp_class, Policy> now inherits from
+	  numeric_limits<mp_class> and ovverrides what must be overridden.
+
+2005-09-24 Saturday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.122), mp_numeric_limits.hh (1.1): New file
+	  mp_numeric_limits.hh contains specializations of
+	  std::numeric_limits for multi-precision types.  This will become
+	  obsolete when GMP and MPFR will provide the specializations by
+	  themselves.
+
+2005-09-24 Saturday 21:25  Abramo Bagnara
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.34),
+	  GNU/ppl_gprolog_sd.cc (1.30), SICStus/ppl_sicstus_sd.cc (1.79),
+	  SWI/ppl_swiprolog.cc (1.103), XSB/ppl_xsb.cc (1.70),
+	  YAP/ppl_yap.cc (1.95): Include higher level file for Checked.
+
+2005-09-24 Saturday 18:10  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.45), interfaces/C/ppl_c.cc (1.138),
+	  interfaces/Prolog/ppl_prolog.icc (1.162),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.33),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.29),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.78),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.102),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.69),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.94), src/BD_Shape.inlines.hh
+	  (1.64), src/Bounding_Box.inlines.hh (1.9),
+	  src/Checked_Number.defs.hh (1.33), src/Checked_Number.inlines.hh
+	  (1.38), src/Polyhedron.inlines.hh (1.123),
+	  src/Polyhedron_nonpublic.cc (1.54), src/checked.defs.hh (1.23),
+	  src/checked.inlines.hh (1.25), src/checked_mpq.inlines.hh (1.23),
+	  src/checked_mpz.inlines.hh (1.27): Allow Checked assign functors
+	  to accept native types as To argument. Reordered memory_size
+	  functors for Checked types.
+
+2005-09-24 Saturday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.types.hh (1.7), Coefficient.types.hh (1.8):
+	  Specializations of Coefficient_traits_template moved out from
+	  Checked_Number.types.hh, since they do not belong there.
+
+2005-09-24 Saturday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.32), Polyhedron_public.cc (1.61),
+	  Polyhedron_widenings.cc (1.49): FIXMEs that do not involve
+	  anything that can be considered broken have been retagged TODOs.
+
+2005-09-24 Saturday 08:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.32): Take into account the
+	  restructuring of the PWL tree.
+
+2005-09-23 Friday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.46), GNU/Makefile.am
+	  (1.49), SICStus/Makefile.am (1.55), SWI/Makefile.am (1.53),
+	  XSB/Makefile.am (1.36), YAP/Makefile.am (1.40): Changed according
+	  to the restructuring of the PWL source tree.
+
+2005-09-23 Friday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/.cvsignore (1.5): Updated.
+
+2005-09-23 Friday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Doubly_Linked_Object.defs.hh (1.4),
+	  Doubly_Linked_Object.inlines.hh (1.4),
+	  Doubly_Linked_Object.types.hh (1.3), EList.defs.hh (1.6),
+	  EList.inlines.hh (1.5), EList.types.hh (1.3),
+	  EList_Iterator.defs.hh (1.4), EList_Iterator.inlines.hh (1.5),
+	  EList_Iterator.types.hh (1.3), Handler.defs.hh (1.6),
+	  Handler.inlines.hh (1.5), Handler.types.hh (1.3), Makefile.am
+	  (1.23), Pending_Element.cc (1.4), Pending_Element.defs.hh (1.4),
+	  Pending_Element.inlines.hh (1.4), Pending_Element.types.hh (1.3),
+	  Pending_List.cc (1.4), Pending_List.defs.hh (1.4),
+	  Pending_List.inlines.hh (1.4), Pending_List.types.hh (1.3),
+	  Time.cc (1.4), Time.defs.hh (1.4), Time.inlines.hh (1.5),
+	  Time.types.hh (1.3), Watchdog.cc (1.21), Watchdog.defs.hh (1.17),
+	  Watchdog.inlines.hh (1.14), Watchdog.types.hh (1.7), configure.ac
+	  (1.32), pwl_header.hh (1.2), src/.cvsignore (1.1),
+	  src/Doubly_Linked_Object.defs.hh (1.1),
+	  src/Doubly_Linked_Object.inlines.hh (1.1),
+	  src/Doubly_Linked_Object.types.hh (1.1), src/EList.defs.hh (1.1),
+	  src/EList.inlines.hh (1.1), src/EList.types.hh (1.1),
+	  src/EList_Iterator.defs.hh (1.1), src/EList_Iterator.inlines.hh
+	  (1.1), src/EList_Iterator.types.hh (1.1), src/Handler.defs.hh
+	  (1.1), src/Handler.inlines.hh (1.1), src/Handler.types.hh (1.1),
+	  src/Makefile.am (1.1), src/Pending_Element.cc (1.1),
+	  src/Pending_Element.defs.hh (1.1), src/Pending_Element.inlines.hh
+	  (1.1), src/Pending_Element.types.hh (1.1), src/Pending_List.cc
+	  (1.1), src/Pending_List.defs.hh (1.1),
+	  src/Pending_List.inlines.hh (1.1), src/Pending_List.types.hh
+	  (1.1), src/Time.cc (1.1), src/Time.defs.hh (1.1),
+	  src/Time.inlines.hh (1.1), src/Time.types.hh (1.1),
+	  src/Watchdog.cc (1.1), src/Watchdog.defs.hh (1.1),
+	  src/Watchdog.inlines.hh (1.1), src/Watchdog.types.hh (1.1),
+	  src/pwl_header.hh (1.1): Restructured.
+
+2005-09-23 Friday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.31): Configure is no longer responsible
+	  for creating build_header.
+
+2005-09-23 Friday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.186), Watchdog/utils/Makefile.am (1.3),
+	  Watchdog/utils/build_header.in (1.2), utils/Makefile.am (1.9),
+	  utils/build_header.in (1.2): Generation of utility scripts fixed.
+
+2005-09-23 Friday 16:51  Matthew Mundell
+
+	* utils/Makefile.am (1.8): Add bin_SCRIPT.  Set bin_SCRIPT to
+	  build_header, text2cxxarray and a phony target which sets the
+	  script permissions.
+
+2005-09-23 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.31), matasciidumpload1.cc
+	  (1.5), matrix1.cc (1.1): Test program renamed.  The matrix1.cc
+	  (and, possibly, matrix2.cc and so forth) will contain tests of
+	  some functionalities of the class Matrix (especially those that
+	  are not exercised much in an indirect way by the clients of
+	  Matrix).
+
+2005-09-23 Friday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.185): Revised the warning message concerning the
+	  impossibility of propagating exceptions back from GMP.
+
+2005-09-23 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.33), configure.ac (1.184), Watchdog/Makefile.am
+	  (1.22), Watchdog/configure.ac (1.30), Watchdog/utils/Makefile.am
+	  (1.2), Watchdog/utils/build_header (1.2),
+	  Watchdog/utils/build_header.in (1.1),
+	  doc/devref-browse.doxyconf-latex.in (1.56),
+	  doc/devref-print.doxyconf-latex.in (1.56),
+	  doc/devref.doxyconf-html.in (1.56),
+	  doc/user-browse.doxyconf-latex.in (1.26),
+	  doc/user-print.doxyconf-latex.in (1.26),
+	  doc/user.doxyconf-html.in (1.28), src/Makefile.am (1.121),
+	  utils/Makefile.am (1.7), utils/build_header (1.2),
+	  utils/build_header.in (1.1), utils/text2cxxarray (1.3),
+	  utils/text2cxxarray.in (1.1): Allow Perl to be installed into
+	  non-standard places.
+
+2005-09-23 Friday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.29): Check for Perl.
+
+2005-09-23 Friday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.183): Check for Perl.
+
+2005-09-23 Friday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.91): Comment fixed.
+
+2005-09-23 Friday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/matasciidumpload1.cc (1.4): Include <ctime>.  It
+	  does not make sense to use TEMP_INTEGER here: use Coefficient
+	  instead.  Avoid unnecessary use of macros: std::numeric_limits<T>
+	  is (must) be available for all numerical types.  Use GMP's
+	  pseudo-random numbers instead of rand().
+
+2005-09-23 Friday 08:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.182): The C header file <time.h> is subsumed by
+	  C++'s <ctime>: there is no need to check for its availability.
+
+2005-09-22 Thursday 23:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.181): `sys/time.h' was listed twice in the
+	  argument of AC_CHECK_HEADERS.  Check also for `time.h'.
+
+2005-09-22 Thursday 18:08  Matthew Mundell
+
+	* src/Polyhedron.defs.hh (1.283): Correct grammar.
+
+2005-09-22 Thursday 17:30  Matthew Mundell
+
+	* src/checked_numeric_limits.hh (1.5): Specialize numeric_limits
+	  for int and all unsigned integer native types.
+
+2005-09-22 Thursday 15:51  Matthew Mundell
+
+	* src/Grid_public.cc (grids.68): Automatically initialise con_sys
+	  and gen_sys in Grid(n,k).
+
+2005-09-22 Thursday 15:28  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.30), linsysasciidumpload1.cc
+	  (1.1): Add linsysasciidumpload1, which tests Linear_System ASCII
+	  loading.
+
+2005-09-22 Thursday 15:21  Matthew Mundell
+
+	* src/: Linear_Row.cc (1.13), Linear_Row.defs.hh (1.12),
+	  Linear_System.cc (1.26): Add methods Linear_Row::ascii_load and
+	  Linear_Row::Flags::ascii_load.  Complete
+	  Linear_System::ascii_load.
+
+2005-09-22 Thursday 14:07  Matthew Mundell
+
+	* tests/Polyhedron/matasciidumpload1.cc (1.3): Correct the
+	  numeric_limits instantiation.  Only allow valid modulation.
+
+2005-09-22 Thursday 13:09  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am (1.29), matasciidumpload1.cc
+	  (1.2): In matasciidumpload1 limit the size of the random values
+	  according to the coefficient type and rename the data file
+	  uniquely.
+
+2005-09-21 Wednesday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.153): One item completed and removed (check_containment).
+
+2005-09-21 Wednesday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.158): Some of the recent changes and bugfixes announced.
+
+2005-09-21 Wednesday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.16), geomcovers1.cc (1.1): Added
+	  a new test showing that geometrically_covers() also works for
+	  powersets of BD_Shape's.
+
+2005-09-21 Wednesday 19:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.120), Polyhedra_Powerset.cc (1.1),
+	  Polyhedra_Powerset.defs.hh (1.21), Polyhedra_Powerset.inlines.hh
+	  (1.26), algorithms.hh (1.43): Added new specializations for
+	  Polyhedra_powerset mixed constructors.  Function
+	  check_containment() now works with different instantiations of
+	  Polyhedra_Powerset; the same happens for geometrically_covers()
+	  and geometrically_equals().  A few non-inline full specialization
+	  of member templates have been moved into file
+	  Polyhedra_Powerset.cc.
+
+2005-09-21 Wednesday 17:05  Matthew Mundell
+
+	* src/Linear_System.cc (1.25): Indent consistently in ascii_load.
+	  Correct typo, grammar and formatting in three comments.
+
+2005-09-21 Wednesday 16:56  Matthew Mundell
+
+	* src/: Congruence_System.defs.hh, Linear_System.cc,
+	  Congruence_System.cc (grids.[15,2,24]): Take out
+	  Congruence_System::add_row.  Replace the bulk of
+	  Linear_System::add_row with a call to Matrix::add_row.
+
+2005-09-21 Wednesday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/geomcovers1.cc (1.6): Test corrected.
+
+2005-09-21 Wednesday 16:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions1.cc (1.7): Added a new exception
+	  check for Polyhedra_Powerset::add_disjunct().
+
+2005-09-21 Wednesday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.20),
+	  Polyhedra_Powerset.inlines.hh (1.25): The new method
+	  Polyhedra_Powerset::add_disjunct() now performs the required
+	  check for space dimension compatibility. The check uncovers a
+	  previously unnoticed (client) bug in Polyhedron/geomcovers1.cc.
+
+2005-09-21 Wednesday 16:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.152): Item:
+
+	   - In the Prolog interface there are predicates such as
+	    ppl_Polyhedron_remove_space_dimensions/2 that require an input
+	  list;
+	    if the argument is not a list, in the current version, the call
+	  to
+	    this predicate will fail. This needs to be changed so that an
+	    exception is thrown.
+
+	  removed.
+
+2005-09-21 Wednesday 16:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: exceptions.hh (1.17), ppl_prolog.icc (1.161),
+	  tests/pl_check.pl (1.11): All Prolog interface predicates
+	  expecting a list as input from the user now throw an exception if
+	  the list is not nil terminated.  (This could be a list of
+	  constraints, generators, intervals, dimensiona or dimension maps)
+
+	  That is interface predicates: ppl_new_Polyhedron_from_constraints
+	  ppl_new_Polyhedron_from_generators
+	  ppl_new_Polyhedron_from_bounding_box
+	  ppl_Polyhedron_add_constraints
+	  ppl_Polyhedron_add_constraints_and_minimize
+	  ppl_Polyhedron_add_generators
+	  ppl_Polyhedron_add_generators_and_minimize
+	  ppl_Polyhedron_limited_H79_extrapolation_assign
+	  ppl_Polyhedron_limited_H79_extrapolation_assign_with_token
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token
+	  ppl_Polyhedron_remove_space_dimensions
+	  ppl_Polyhedron_fold_space_dimensions
+	  ppl_Polyhedron_map_space_dimensions
+
+	  class not_a_nil_terminated_list added to exception.hh.
+
+	  Code for throwing an exception added to ppl_prolog.icc Exception
+	  thrown for not nil terminating input lists for each of the above.
+	   Also indentation of code improved.
+
+	  Tests for not nil terminating list exceptions, for each of the
+	  above predicates, added to pl_check.pl.  Old tests for prolog
+	  failure when list is not nil terminated removed.  Some tests in
+	  pl_check.pl reordered.
+
+2005-09-21 Wednesday 16:18  Matthew Mundell
+
+	* src/Generator_System.cc (1.10): In
+	  adjust_topology_and_space_dimension pass to add_zero_columns the
+	  result of adding to or subtracting from cols_to_be_added, instead
+	  of an increased or decreased cols_to_be_added.
+
+2005-09-21 Wednesday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.31): Out-of-date comments concerning the
+	  template parameter T removed from the documentation of class
+	  BD_Shape.
+
+2005-09-21 Wednesday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.28), matasciidumpload1.cc
+	  (1.1): Test Matrix::ascii_dump() and Matrix::ascii_load().
+
+2005-09-21 Wednesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.180), tests/Makefile.am (1.245): Previous change
+	  reverted.
+
+2005-09-21 Wednesday 12:56  Matthew Mundell
+
+	* src/Generator_System.cc (1.9): Align argument indentation of
+	  affine_image.
+
+2005-09-21 Wednesday 12:49  Matthew Mundell
+
+	* configure.ac (1.179): Add tests/Matrix/Makefile to
+	  AC_CONFIG_FILES.
+
+2005-09-21 Wednesday 12:49  Matthew Mundell
+
+	* tests/Makefile.am (1.244): Add Matrix to SUBDIRS.
+
+2005-09-21 Wednesday 12:44  Matthew Mundell
+
+	* src/: Matrix.cc (1.85), Row.cc (1.90), Row.defs.hh (1.98):
+	  Complete Matrix::ascii_load.	Restore the stream attributes at
+	  the end of Row::ascii_dump.  Add ascii_load methods to Row::Flags
+	  and Row.
+
+2005-09-21 Wednesday 12:37  Matthew Mundell
+
+	* src/Constraint_System.cc (1.10): In method num_inequalities use
+	  dimension_type instead of int for temporary n.
+
+2005-09-20 Tuesday 21:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.151): Links in the CREDITS file checked and lists of
+	  collaborators and projects supporting the work updated. So todo
+	  item removed.
+
+2005-09-20 Tuesday 21:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.150): SWI 5.4.7 automatically initializes the library.
+	  So todo item for this removed.
+
+2005-09-20 Tuesday 19:39  Matthew Mundell
+
+	* configure.ac (1.178): Indent all lines with spaces in
+	  AC_CONFIG_FILES.
+
+2005-09-20 Tuesday 19:29  Matthew Mundell
+
+	* src/checked.inlines.hh (grids.4): Take a redundant assignment out
+	  of gcdext_generic.
+
+2005-09-20 Tuesday 19:29  Matthew Mundell
+
+	* src/Native_Integer.inlines.hh (grids.3): Take a redundant
+	  assignment out of gcdext.
+
+2005-09-20 Tuesday 19:28  Matthew Mundell
+
+	* src/Grid_public.cc (grids.67): Improve temporary comment.
+
+2005-09-20 Tuesday 19:27  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, boundingbox1.cc (grids.[34,1]): Add
+	  boundingbox1, which tests Grid(Box& box).
+
+2005-09-20 Tuesday 19:26  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[47,20]): Add template
+	  Grid(box, dummy).  Improve method descriptions.
+
+2005-09-20 Tuesday 15:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* CREDITS (1.19): Added Matthew Mundell as a contributor.
+
+	  Added the Royal Society project and the EPSRC project to the list
+	  of supporting projects.
+
+2005-09-20 Tuesday 13:46  Abramo Bagnara
+
+	* src/: checked_float.inlines.hh (1.43), checked_int.inlines.hh
+	  (1.38): Prepare inexact only when needed. Use new names for gcd
+	  and lcm.
+
+2005-09-20 Tuesday 13:44  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (1.21): Attempt to reduce code
+	  duplicate using explicit goto. Removed FIXME from add_mul_ext and
+	  sub_mul_ext.
+
+2005-09-20 Tuesday 13:42  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.24): Removed fixme and choosen a better
+	  name for functions.
+
+2005-09-20 Tuesday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.89): Use the ternary version of gcd_assign() so as
+	  to gain on checked numbers.
+
+2005-09-20 Tuesday 11:00  Matthew Mundell
+
+	* src/checked.cc (1.6): In parse_number1 move the maximum remainder
+	  calculation into a variable.
+
+2005-09-20 Tuesday 09:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.60): Unwanted inclusion removed.
+
+2005-09-20 Tuesday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.108), Linear_Expression.defs.hh
+	  (1.11): Friend declarations fixed.
+
+2005-09-20 Tuesday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/scalar_products.inlines.hh (1.4): Fixed
+	  homogeneous_scalar_product_assign(Coefficient&, const
+	  Linear_Expression&, const Generator&) and
+	  homogeneous_scalar_product_sign(const Linear_Expression&, const
+	  Generator&).
+
+2005-09-19 Monday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.107), Linear_Expression.defs.hh
+	  (1.10), Polyhedron_nonpublic.cc (1.53), scalar_products.defs.hh
+	  (1.3), scalar_products.inlines.hh (1.3): Another twist at
+	  reducing the dependency from friend class declarations.
+
+2005-09-19 Monday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.106), Generator.defs.hh (1.106),
+	  scalar_products.defs.hh (1.2), scalar_products.inlines.hh (1.2):
+	  Computing the scalar product between a Constraint and a Generator
+	  objects no longer requires Polyhedron to be a friend of
+	  Constraint and Generator.
+
+2005-09-19 Monday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.105), Constraint_System.defs.hh
+	  (1.13), Constraint_System.inlines.hh (1.5), Polyhedron.defs.hh
+	  (1.282), Polyhedron.inlines.hh (1.122), Polyhedron_nonpublic.cc
+	  (1.52): The functionality of
+	  Polyhedron::add_low_level_constraints(Constraint_System&) is now
+	  provided by Constraint_System::add_low_level_constraints().
+	  Among other things, this reduces the dependency on friend
+	  declarations.
+
+2005-09-19 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.88): Chosen the more elegant implementation of
+	  Row::normalize() (profiling was inconclusive: they were probably
+	  equivalent).
+
+2005-09-19 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.cc (1.9), Generator_System.cc (1.8),
+	  Linear_Row.cc (1.12), Linear_Row.defs.hh (1.11),
+	  Linear_Row.inlines.hh (1.9), Linear_System.cc (1.24), Makefile.am
+	  (1.119), Polyhedron_nonpublic.cc (1.51), Polyhedron_public.cc
+	  (1.59), Polyhedron_widenings.cc (1.48), conversion.cc (1.73),
+	  scalar_products.cc (1.1), scalar_products.defs.hh (1.1),
+	  scalar_products.inlines.hh (1.1): Scalar product functions moved
+	  from Linear_Row.* to scalar_products.*.
+
+2005-09-19 Monday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Row.cc (1.11): Long source line avoided.
+
+2005-09-19 Monday 20:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.13): Use memory_size_type, not
+	  size_t.
+
+2005-09-19 Monday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.37): FIXME dealt with:
+	  total_memory_in_bytes() and external_memory_in_bytes() properly
+	  implemented for checked numbers.
+
+2005-09-19 Monday 19:07  Matthew Mundell
+
+	* src/BD_Shape.defs.hh (1.30): Correct grammar in notes.
+
+2005-09-19 Monday 19:06  Matthew Mundell
+
+	* src/BD_Shape.defs.hh (1.29): Clip trailing whitespace.
+
+2005-09-19 Monday 18:55  Matthew Mundell
+
+	* src/checked.cc (1.5): In parse_number1 parse the exponent in the
+	  FRACTIONAL case.
+
+2005-09-19 Monday 17:11  Matthew Mundell
+
+	* tests/Polyhedron/affineimage6.cc (1.6): Neaten expression
+	  formatting.
+
+2005-09-19 Monday 17:11  Matthew Mundell
+
+	* tests/Polyhedron/addspacedims3.cc (1.6): Correct argument in
+	  print_generators message.
+
+2005-09-19 Monday 17:10  Matthew Mundell
+
+	* tests/Polyhedron/Makefile.am (1.27): Indent all lines in
+	  ORIGINAL_TESTS and DERIVED_TESTS with tabs.
+
+2005-09-19 Monday 17:06  Matthew Mundell
+
+	* tests/BD_Shape/Makefile.am (1.15): Clip trailing whitespace.
+
+2005-09-19 Monday 17:04  Matthew Mundell
+
+	* src/checked.cc (1.4): Use `true' to evaluate true.  Clip trailing
+	  whitespace.
+
+2005-09-19 Monday 17:03  Matthew Mundell
+
+	* src/Polyhedron_widenings.cc (1.47): Correct variable names in
+	  H79_widening_assign comments.
+
+2005-09-19 Monday 17:00  Matthew Mundell
+
+	* src/Polyhedron.defs.hh (1.281): Markup parameter in description.
+
+2005-09-19 Monday 16:56  Matthew Mundell
+
+	* src/Linear_System.defs.hh (1.16): Reformat comment.
+
+2005-09-19 Monday 16:43  Matthew Mundell
+
+	* configure.ac (1.177): Cater for the Debian dpkg version of
+	  md5sum.
+
+2005-09-19 Monday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplex.cc (1.16): Let the parameter names in the definition
+	  of primal_simplex() match those used in its declaration.
+
+2005-09-19 Monday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.21), Watchdog/ChangeLog (1.11): Updated.
+
+2005-09-19 Monday 14:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.defs.hh (1.12): Added documentation for
+	  Constraint_System::primal_simplex().
+
+2005-09-19 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.149): Updated.
+
+2005-09-19 Monday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Saturation_Row.inlines.hh (1.7): Include <cassert>.
+
+2005-09-19 Monday 10:00  Matthew Mundell
+
+	* src/Native_Integer.inlines.hh (1.12): In template gcd take the
+	  absolute value of the resulting gcd instead of initially taking
+	  the absolute value of both arguments.
+
+2005-09-19 Monday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.types.hh (1.10): Fixed struct
+	  Coefficient_traits_template<Native_Integer<int64_t>.
+
+2005-09-19 Monday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.28), Bounding_Box.defs.hh (1.9),
+	  DB_Row.defs.hh (1.9), Determinate.defs.hh (1.57), Init.cc (1.20),
+	  Linear_Row.cc (1.10), Linear_System.cc (1.23), Matrix.cc (1.84),
+	  Polyhedron.defs.hh (1.280), Row.cc (1.87), Row.defs.hh (1.97),
+	  conversion.cc (1.72), globals.cc (1.23): Include globals.types.hh
+	  or globals.defs.hh or none of them as required.
+
+2005-09-19 Monday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GMP_Integer.defs.hh (1.9): Doxygen comments and sectioning
+	  revised.
+
+2005-09-19 Monday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ask_Tell.defs.hh (1.6), BD_Shape.defs.hh (1.27),
+	  BHRZ03_Certificate.defs.hh (1.12), Bounding_Box.defs.hh (1.8),
+	  DB_Row.defs.hh (1.8), Determinate.defs.hh (1.56),
+	  GMP_Integer.defs.hh (1.8), GMP_Integer.inlines.hh (1.6),
+	  H79_Certificate.defs.hh (1.11), Init.cc (1.19), Linear_Row.cc
+	  (1.9), Linear_System.cc (1.22), Makefile.am (1.118), Matrix.cc
+	  (1.83), Matrix.inlines.hh (1.45), Polyhedra_Powerset.defs.hh
+	  (1.19), Polyhedron.defs.hh (1.279), Row.cc (1.86), Row.defs.hh
+	  (1.96), Saturation_Matrix.cc (1.5), Saturation_Row.defs.hh (1.7),
+	  Variable.defs.hh (1.47), conversion.cc (1.71), globals.cc (1.22),
+	  globals.defs.hh (1.23), globals.types.hh (1.1), simplex.cc
+	  (1.15): Memory size inspection functions and methods should
+	  always return a memory_size_type.  Header file global.types.hh
+	  split from global.defs.hh.  Only include global.types.hh when
+	  possible.
+
+2005-09-19 Monday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.63), Checked_Number.defs.hh (1.32),
+	  GMP_Integer.defs.hh (1.7), Native_Integer.defs.hh (1.12): Added a
+	  couple of blank lines to improve readability.
+
+2005-09-18 Sunday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.62): Use raw_value() to turn a
+	  Coefficient into its underlying type.
+
+2005-09-18 Sunday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.11): Avoid a "unused parameter"
+	  warning.
+
+2005-09-18 Sunday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.61): Avoid excessive assumptions on
+	  the nature of the Coefficient type.
+
+2005-09-18 Sunday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.31): Three FIXMEs investigated and
+	  removed.
+
+2005-09-18 Sunday 20:00  Matthew Mundell
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (grids.[3,3]): Add macros FUNC4, DEF_ASSIGN_FUN5_4 and
+	  DEF_ASSIGN_FUN5_5.  Add function assign_gcdext and the
+	  gcdext_assign user interface functions.
+
+2005-09-18 Sunday 19:55  Matthew Mundell
+
+	* src/: checked.defs.hh, checked.inlines.hh, checked_ext.defs.hh,
+	  checked_ext.inlines.hh, checked_float.inlines.hh,
+	  checked_int.inlines.hh, checked_mpz.inlines.hh
+	  (grids.[3,3,3,3,3,3,3]): Add macros DECLARE_FUN5_0_1,
+	  SPECIALIZE_FUN5_0_1 and SPECIALIZE_GCDEXT.  Add template
+	  gcdext_generic.  Specialize gcdext_generic for integers and
+	  floats.  Add wrapper gcdext_ext.  Add and specialize wrapper
+	  gcdext_mpz.
+
+2005-09-18 Sunday 19:40  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (grids.5): Only call find_variation
+	  on the grid under test.
+
+2005-09-18 Sunday 19:39  Matthew Mundell
+
+	* tests/print.cc (grids.4): Include Congruence_System definitions.
+
+2005-09-18 Sunday 19:38  Matthew Mundell
+
+	* src/: Native_Integer.defs.hh, Native_Integer.inlines.hh
+	  (grids.[2,2]): Add gcdext_assign methods.  "Use" the parameter in
+	  external_memory_in_bytes.
+
+2005-09-18 Sunday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.types.hh (1.9): The specializations of
+	  Coefficient_traits_template for native integers are now
+	  differentiated the same way as for checked integers.
+
+2005-09-18 Sunday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.types.hh (1.6), Coefficient.types.hh (1.7),
+	  GMP_Integer.types.hh (1.8), Native_Integer.types.hh (1.8): Treat
+	  the three basic coefficient types (GMP, checked and native) the
+	  same way, as far as the specialization of
+	  Coefficient_traits_template is concerned.
+
+2005-09-18 Sunday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.18), TODO (1.148): Two links fixed.  All the others
+	  need to be checked.
+
+2005-09-17 Saturday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.85): Added an alternative implementation for
+	  Row::normalize() that should be more efficient than the present
+	  one.
+
+2005-09-17 Saturday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.84): Row::normalize() speeded-up further.
+
+2005-09-16 Friday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int64_a (1.2): Adapted to
+	  the recent changes in pl_check.pl.
+
+2005-09-16 Friday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.83): Row::normalize() speeded up.
+
+2005-09-16 Friday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.14): Reduced the scope of a using declaration.
+
+2005-09-16 Friday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.13): Avoid duplicating code in order to
+	  normalize a Row object.
+
+2005-09-16 Friday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_Row.cc (1.8), Linear_Row.defs.hh (1.10), Row.cc
+	  (1.82), Row.defs.hh (1.95): The normalize() method has been moved
+	  from Linear_Row to its base class Row.
+
+2005-09-16 Friday 12:16  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.23): Removed unneeded checks.
+
+2005-09-16 Friday 09:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.21), src/Linear_System.defs.hh (1.15),
+	  tests/Polyhedron/gramschmidt1.cc (1.1),
+	  tests/Polyhedron/gramshmidt1.cc (1.2): Spelling correction: it is
+	  "Gram-Schmidt" (the orthonormalization procedure), not
+	  "Gram-Shmidt".
+
+2005-09-16 Friday 06:43  Abramo Bagnara
+
+	* src/: Bounding_Box.inlines.hh (1.8), Polyhedron.inlines.hh
+	  (1.121): Fixed mpq building from arbitrary coefficient type.
+
+2005-09-15 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected3_int16 (1.2),
+	  XSB/expected3_int32 (1.2), XSB/expected3_int8 (1.2),
+	  tests/expected_pchk_int16 (1.2), tests/expected_pchk_int32 (1.2),
+	  tests/expected_pchk_int8 (1.2): Adapted to the recent changes in
+	  pl_check.pl.
+
+2005-09-15 Thursday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int8_a (1.2): Adapted to
+	  the recent changes in pl_check.pl.
+
+2005-09-15 Thursday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_int32_a (1.2): Adapted to
+	  the recent changes in pl_check.pl.
+
+2005-09-15 Thursday 18:21  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.22): Faster and more precise
+	  implementation of gcd.
+
+2005-09-13 Tuesday 19:21  Matthew Mundell
+
+	* tests/Polyhedron/Makefile.am (grids.7): Add derived tests for the
+	  congruence adding tests.
+
+2005-09-13 Tuesday 19:21  Matthew Mundell
+
+	* tests/Polyhedron/addcongruence2.cc (grids.2): Use C_Polyhedron
+	  instead of NNC_Polyhedron.
+
+2005-09-13 Tuesday 18:57  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am, congruences1.cc (grids.[6,1]):
+	  Add test congruences1 and derived test nnc_congruences1, which
+	  test the polyhedra congruence constructors.
+
+2005-09-13 Tuesday 18:55  Matthew Mundell
+
+	* src/: C_Polyhedron.cc, C_Polyhedron.defs.hh, NNC_Polyhedron.cc,
+	  NNC_Polyhedron.defs.hh (grids.[3,3,3,3]): Add C_Polyhedron(const
+	  cgs), C_Polyhedron(cgs), NNC_Polyhedron(const cgs) and
+	  NNC_Polyhedron(cgs).
+
+2005-09-13 Tuesday 17:43  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am, addcongruences1.cc,
+	  addcongruences2.cc, addcongruences3.cc, addcongruences4.cc,
+	  addcongruences5.cc (grids.[5,1,1,1,1,1]): Add addcongruences1-5.
+
+2005-09-13 Tuesday 17:41  Matthew Mundell
+
+	* tests/: print.cc, print.hh (grids.[3,6]): Add
+	  print_constraints(cgs).
+
+2005-09-13 Tuesday 17:41  Matthew Mundell
+
+	* src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
+	  Polyhedron_public.cc (grids.[6,4,4]): Add
+	  throw_dimension_incompatible(m, cgs_name, cgs) and
+	  add_congruences(cgs).
+
+2005-09-13 Tuesday 17:39  Matthew Mundell
+
+	* src/Grid_public.cc (grids.66): In add_constraints(cs) only add
+	  cgs to the grid if congruences have been inserted into cgs.
+
+2005-09-13 Tuesday 17:37  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.46): Correct two descriptions.
+
+2005-09-13 Tuesday 15:56  Matthew Mundell
+
+	* tests/Polyhedron/: Makefile.am, addcongruence1.cc,
+	  addcongruence2.cc, addcongruence3.cc, addcongruence4.cc,
+	  addcongruence5.cc (grids.[4,1,1,1,1,1]): Add addcongruence1-5.
+
+2005-09-13 Tuesday 15:54  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.33): List related tests in TESTS on
+	  single lines.
+
+2005-09-13 Tuesday 15:52  Matthew Mundell
+
+	* src/: Polyhedron.defs.hh, Polyhedron_nonpublic.cc,
+	  Polyhedron_public.cc (grids.[5,3,3]): Add
+	  throw_dimension_incompatible(method, cg_name, cg) and
+	  add_congruence(cg).
+
+2005-09-13 Tuesday 15:51  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.20): Declare Polyhedron a friend.
+
+2005-09-13 Tuesday 15:46  Matthew Mundell
+
+	* src/: Constraint.cc, Constraint.defs.hh (grids.[3,4]): Add
+	  ascii_dump(s).
+
+2005-09-13 Tuesday 15:44  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.inlines.hh (grids.[11,15]): Make
+	  Congruence(c) a real function (was inline).
+
+2005-09-13 Tuesday 15:43  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.45): Use \brief on a line of its own.
+	  Prefer //! to \brief for single line comments.
+
+2005-09-13 Tuesday 15:41  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.5): Add test7 (adds an NNC
+	  constraint).
+
+2005-09-12 Monday 16:17  Matthew Mundell
+
+	* STANDARDS (1.23): Add coding standard entries for negation and
+	  comparison to zero.
+
+2005-09-12 Monday 14:29  Matthew Mundell
+
+	* tests/Grid/certificate1.cc (grids.3): Correct an error message in
+	  test3.  Add test6, which uses zero dimension universes.
+
+2005-09-12 Monday 14:28  Matthew Mundell
+
+	* src/Grid_Certificate.cc (grids.3): In Grid_Certificate(cgr)
+	  handle the zero dimension universe specially, and improve three
+	  comments.
+
+2005-09-12 Monday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected3_int16_a (1.2),
+	  tests/expected_pchk_int16_a (1.2): Adapted to the recent changes
+	  in pl_check.pl.
+
+2005-09-11 Sunday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/maxspacedim.cc (1.7): Pass the right parameters to
+	  the BD_Shape template class.
+
+2005-09-11 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.25): Pass the right parameters to the
+	  BD_Shape template class.
+
+2005-09-11 Sunday 21:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.26), BD_Shape.inlines.hh (1.60): Life
+	  of the user of BD_Shape is now simpler, as he can specify a
+	  BD_Shape by providing the base numerical type used to represent
+	  the inhomogeneous terms.
+
+2005-09-11 Sunday 11:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/tests/pl_check.pl (1.10): Improved error and
+	  exception messages.  Try and ensure that regardless of the error
+	  or exception, an informative message detailing the group test and
+	  the predicates it is testing is printed.
+
+	  An extra noisy level added (noisy(2) for debugging (set by the
+	  predicate make_extra_noisy).
+
+	  check_all now is quiet only as a default and does not change
+	  existing noisy level.
+
+	  Avoiding abbreviations in group names to improve readability.
+
+	  Made three groups for testing the constructor predicates instead
+	  of one.  Simplified test for new_Polyhedron_from_space_dimension.
+
+	  Added tests for
+	  ppl_Polyhedron_generalized_affine_preimage_lhs_rhs.
+
+	  Improved tests  for ppl_Polyhedron_maximize_with_point and
+	  ppl_Polyhedron_minimize_with_point to correct behaviour on
+	  failure.
+
+2005-09-11 Sunday 10:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.18),
+	  src/Polyhedra_Powerset.inlines.hh (1.24),
+	  tests/Polyhedron/bhz03widening1.cc (1.6),
+	  tests/Polyhedron/bhz03widening2.cc (1.6),
+	  tests/Polyhedron/bhz03widening3.cc (1.6),
+	  tests/Polyhedron/bhz03widening6.cc (1.6): Removed the shorthand
+	  notation for
+	  Polyhedra_Powerset::BHZ03_widening_assing<BHRZ03_Certificate>(...).
+	  Now the user should always explicitly mention the (type of)
+	  certificate used for the base-level widening operator.
+
+2005-09-10 Saturday 23:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* instchk.hh (1.2): Description and copyright notice added.
+
+2005-09-10 Saturday 23:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_mpz.inlines.hh (1.26): Avoid assert(0) and make sure
+	  the compiler does not think we are returning without a value.
+
+2005-09-10 Saturday 23:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.37): Avoid naming unused arguments.
+
+2005-09-10 Saturday 23:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.42): FIXME added.
+
+2005-09-10 Saturday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.176), instchk.hh (1.1): Started the
+	  implementation of the --enable-instances option.
+
+2005-09-08 Thursday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.175): Better logic to handle interfaces that are
+	  enabled by default.
+
+2005-09-08 Thursday 01:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.174), Watchdog/configure.ac (1.28): Allow the
+	  specification of --enable-optimization=zero to temporarily get
+	  around bugs such as the one affecting Intel C/C++ 9.0.25 under
+	  Fedora Core 4.
+
+2005-09-08 Thursday 01:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.173), interfaces/Prolog/Ciao/Makefile.am (1.45),
+	  interfaces/Prolog/GNU/Makefile.am (1.48),
+	  interfaces/Prolog/SICStus/Makefile.am (1.54),
+	  interfaces/Prolog/SWI/Makefile.am (1.52),
+	  interfaces/Prolog/XSB/Makefile.am (1.35),
+	  interfaces/Prolog/YAP/Makefile.am (1.39): Allow to selectively
+	  enable the construction of the Prolog interfaces.
+
+2005-09-07 Wednesday 23:37  Matthew Mundell
+
+	* src/Grid_Certificate.cc (grids.2): In Grid_Certificate(cgr) call
+	  simplify outside the points assertion.
+
+2005-09-07 Wednesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.4): Only set `have_swi_prolog' and
+	  leave it to the caller to decide whether define an Automake
+	  conditional and which one.
+
+2005-09-07 Wednesday 08:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.172): Started implementing the new
+	  `--enable-interfaces' option.
+
+2005-09-06 Tuesday 16:24  Matthew Mundell
+
+	* tests/Grid/widening1.cc (grids.5): Add test15, to show problems
+	  with using the Halbwachs method.
+
+2005-09-06 Tuesday 16:23  Matthew Mundell
+
+	* src/Grid_widenings.cc (grids.4): Add space between sentences.
+
+2005-09-06 Tuesday 15:27  Matthew Mundell
+
+	* tests/Grid/certificate1.cc (grids.2): Use compare(gr) or struct
+	  Compare::operator() instead of compare(grc) in some of the
+	  comparison tests.  Also test is_stabilising in some of the tests.
+
+2005-09-06 Tuesday 15:00  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, certificate1.cc (grids.[32,1]): Add
+	  certificate1, which tests class Grid_Certificate.
+
+2005-09-06 Tuesday 13:19  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, contains2.cc (grids.[31,1]): Add
+	  contains2, which tests strictly_contains.
+
+2005-09-06 Tuesday 13:19  Matthew Mundell
+
+	* tests/Grid/contains1.cc (grids.2): Improve failure messages.
+
+2005-09-06 Tuesday 13:07  Matthew Mundell
+
+	* tests/Grid/bhz03widening1.cc (grids.2): Describe test1.  Add
+	  test2, where the widening falls back to joining the grids.
+
+2005-09-05 Monday 23:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh, Widening_Function.inlines.hh,
+	  Widening_Function.types.hh (grids.[2,2,1]): Ported from the main
+	  trunk: the version of widen_fun_ref() building a limited widening
+	  function is now parametric on its second argument too (i.e., the
+	  limiting cs).
+
+2005-09-05 Monday 22:51  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (grids.6): Add colons to messages.
+
+2005-09-05 Monday 22:50  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, bhz03widening1.cc (grids.[30,1]): Add
+	  an initial bhz03widening1.
+
+2005-09-05 Monday 22:49  Matthew Mundell
+
+	* src/: Polyhedra_Powerset.inlines.hh, Polyhedron.defs.hh,
+	  Polyhedron.inlines.hh (grids.[4,4,4]): Add method
+	  Polyhedron::difference_assign, and use it in
+	  BHZ03_widening_assign (shadowing the trunk).
+
+2005-09-05 Monday 22:37  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.32): Shorten two comments.
+
+2005-09-05 Monday 22:37  Matthew Mundell
+
+	* src/: Congruence_System.defs.hh, Generator_System.defs.hh,
+	  Grid.defs.hh, Grid.inlines.hh (grids.[14,5,44,19]): Befriend
+	  Grid_Certificate where necessary.  Enable
+	  Grid::strictly_contains.  Add difference_assign.
+
+2005-09-05 Monday 22:34  Matthew Mundell
+
+	* src/: Grid_Certificate.cc, Grid_Certificate.defs.hh,
+	  Grid_Certificate.inlines.hh, Grid_Certificate.types.hh,
+	  Makefile.am (grids.[1,1,1,1,7]): Add class Grid_Certificate.
+
+2005-09-05 Monday 17:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.inlines.hh (1.23), Polyhedron.defs.hh
+	  (1.278), Polyhedron.inlines.hh (1.120): Added method
+	  difference_assign(), which is now used in the widening on
+	  powersets.
+
+2005-09-05 Monday 11:15  Matthew Mundell
+
+	* src/Grid_public.cc (grids.65): In relation_with(cg) use the
+	  scalar_product_assign that expects cg to be at most the size of
+	  the generator.
+
+2005-09-05 Monday 11:13  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[10,19]): Add
+	  scalar_product_assign(Coefficient&, const Congruence&, const
+	  Linear_Row&).
+
+2005-09-05 Monday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh (1.12),
+	  Widening_Function.inlines.hh (1.11), Widening_Function.types.hh
+	  (1.3): The version of widen_fun_ref() building a limited widening
+	  function is now parametric on its second argument too (i.e., the
+	  limiting cs).
+
+2005-09-04 Sunday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.21): Workaround and FIXME added for the
+	  bug affecting lcm_generic().
+
+2005-09-04 Sunday 23:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.70): FIXME dealt with.
+
+2005-09-04 Sunday 21:05  Matthew Mundell
+
+	* tests/Grid/: join1.cc, join2.cc (grids.[8,4]): Use common
+	  Variables for all the tests.	Only call find_variation for the
+	  grid under test.
+
+2005-09-04 Sunday 21:04  Matthew Mundell
+
+	* tests/Grid/generalizedaffinepreimage1.cc (grids.4): Correct the
+	  known grids in test3, test4 and test5.
+
+2005-09-04 Sunday 21:03  Matthew Mundell
+
+	* tests/Grid/affinepreimage1.cc (grids.4): Note which second grid
+	  is under test in failure messages.  Correct the known grid and
+	  given variable in test13.
+
+2005-09-04 Sunday 20:58  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.4): Comment the end of the
+	  namespace block.
+
+2005-09-04 Sunday 20:57  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, contains1.cc, join3.cc
+	  (grids.[29,1,1]): Add contains1, including a test for the
+	  is_included_in error found via CHINA.  Add join3, which tests
+	  join_assign_if_exact.
+
+2005-09-04 Sunday 20:52  Matthew Mundell
+
+	* src/Grid_public.cc (grids.64): Implement join_assign_if_exact.
+
+2005-09-04 Sunday 19:35  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.31): In is_included_in check that
+	  all generators (including the first one) satisfy the congruences.
+
+2005-09-04 Sunday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[18,14]):
+	  Avoid returning references to temporaries.
+
+2005-09-04 Sunday 00:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Saturation_Row.cc (1.8): FIXME dealt with.
+
+2005-09-03 Saturday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am, bug1.cc, bug1.dat (grids.[28,4,4]):
+	  Obsolete test program removed.
+
+2005-09-03 Saturday 23:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.inlines.hh (grids.2),
+	  NNC_Polyhedron.inlines.hh (1.30): Added the implementation of
+	  NNC_Polyhedron::upper_bound_assign_if_exact(const
+	  NNC_Polyhedron&).
+
+2005-09-03 Saturday 13:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, Determinate.inlines.hh,
+	  Polyhedra_Powerset.defs.hh, Polyhedra_Powerset.inlines.hh
+	  (grids.[2,3,3,3]): Added constructors taking congruence systems.
+
+2005-09-03 Saturday 13:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Constraint_System.defs.hh, src/Determinate.inlines.hh,
+	  src/NNC_Polyhedron.cc, src/NNC_Polyhedron.defs.hh,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_nonpublic.cc,
+	  src/Powerset.inlines.hh, src/algorithms.hh, src/simplex.cc,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/bdshull1.cc,
+	  tests/BD_Shape/bdshull2.cc, tests/BD_Shape/bdshull3.cc,
+	  tests/BD_Shape/bdshull4.cc, tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/ch78widening6.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/polyhull1.cc, tests/BD_Shape/polyhull2.cc,
+	  tests/BD_Shape/polyhull3.cc, tests/BD_Shape/polyhull4.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/primalsimplex1.cc
+	  (grids.[3,3,3,2,3,3,3,2,2,2,2,2,2,2,2,2,3,3,2,2,2,2,3,1,1,1,1,2,2,2,3,2,2,2,2,3,2,2,1]):
+	  Third merge from main trunk.
+
+2005-09-03 Saturday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.inlines.hh (1.12): Output function fixed.
+
+2005-09-03 Saturday 13:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Powerset.inlines.hh (1.11): Bracketing fixed in
+	  operator<<(std::ostream&, const Powerset<CS>&).
+
+2005-09-03 Saturday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.50): Do not refer to
+	  element().poly_hull_assign(): refer to
+	  element().upper_bound_assign() instead.
+
+2005-09-03 Saturday 12:47  Matthew Mundell
+
+	* src/: Congruence_System.inlines.hh, Grid_Status.cc,
+	  Grid_conversion.cc, Grid_nonpublic.cc (grids.[6,3,19,30]): Update
+	  FSF address.
+
+2005-09-03 Saturday 12:46  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_public.cc
+	  (grids.[43,18,63]): Add methods upper_bound_assign,
+	  join_assign_if_exact and upper_bound_assign_if_exact.
+
+2005-09-03 Saturday 12:44  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.7): Use upper_bound_assign in some of
+	  the tests.
+
+2005-09-03 Saturday 12:44  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.3): Update FSF address.
+
+2005-09-03 Saturday 12:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.25), BD_Shape.inlines.hh (1.59): Added
+	  declarations and dummy implementations for method bool
+	  BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) and its
+	  alias bool BD_Shape<T>::upper_bound_assign_if_exact(const
+	  BD_Shape&).
+
+2005-09-03 Saturday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.37), NNC_Polyhedron.defs.hh (1.39):
+	  Comments fixed and completed.
+
+2005-09-03 Saturday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.36), NNC_Polyhedron.defs.hh (1.38):
+	  Comments fixed.
+
+2005-09-03 Saturday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.35), C_Polyhedron.inlines.hh
+	  (1.28), NNC_Polyhedron.cc (1.16), NNC_Polyhedron.defs.hh (1.37):
+	  Be consistent in the choice of parameters' names.
+
+2005-09-03 Saturday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.22): Use the
+	  PH::upper_bound_assign_if_exact() method and not the function
+	  with the same name.
+
+2005-09-03 Saturday 12:07  Matthew Mundell
+
+	* tests/Grid/: addcongruence1.cc, addgenerator1.cc,
+	  addspacedims1.cc, addspacedims2.cc, affineimage1.cc,
+	  affinepreimage1.cc, bug1.cc, concatenate1.cc, congruence1.cc,
+	  congruencesystem1.cc, congruencesystem2.cc, equals1.cc,
+	  expandspacedim1.cc, foldspacedims1.cc,
+	  generalizedaffineimage1.cc, generalizedaffineimage2.cc,
+	  generalizedaffinepreimage1.cc, generalizedaffinepreimage2.cc,
+	  grid1.cc, grid2.cc, griddifference1.cc, intersection1.cc,
+	  intersection2.cc, isuniverse1.cc, join1.cc, join2.cc,
+	  limitedextrapolation1.cc, mapspacedims1.cc, relations1.cc,
+	  relations2.cc, removespacedims1.cc, removespacedims2.cc,
+	  timeelapse1.cc, widening1.cc, writecongruencesystem.cc
+	  (grids.[4,10,8,5,4,3,3,2,5,6,6,2,4,3,3,4,3,3,20,16,5,4,5,3,6,3,3,9,3,5,5,4,3,4,5]):
+	  Update FSF address.
+
+2005-09-03 Saturday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.16), C_Polyhedron.defs.hh (1.34),
+	  C_Polyhedron.inlines.hh (1.27), NNC_Polyhedron.cc (1.15),
+	  NNC_Polyhedron.defs.hh (1.36), algorithms.hh (1.42): New methods
+	  bool C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron&)
+	  and bool NNC_Polyhedron::poly_hull_assign_if_exact(const
+	  NNC_Polyhedron&) and their synonyms bool
+	  C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron&)
+	  and bool NNC_Polyhedron::upper_bound_assign_if_exact(const
+	  NNC_Polyhedron&).
+
+2005-09-03 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.277): Long source line avoided.
+
+2005-09-03 Saturday 11:53  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence_System.cc, Congruence_System.defs.hh, Grid.defs.hh,
+	  Grid.inlines.hh, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
+	  Grid_chdims.cc, Grid_minimize.cc, Grid_public.cc,
+	  Grid_simplify.cc, Grid_widenings.cc
+	  (grids.[9,17,13,23,13,42,17,3,2,17,17,62,30,3]): Update FSF
+	  address.
+
+2005-09-03 Saturday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: max_min1.cc (1.5), max_min2.cc (1.5): Adapted
+	  so as to use the new interfaces for maximize() and minimize().
+
+2005-09-03 Saturday 11:18  Matthew Mundell
+
+	* tests/Grid/writecongruencesystem.cc (grids.4): Use a single equal
+	  sign in the expected output string.
+
+2005-09-03 Saturday 11:17  Matthew Mundell
+
+	* tests/Grid/: addcongruence1.cc, addgenerator1.cc,
+	  affineimage1.cc, affinepreimage1.cc, expandspacedim1.cc,
+	  foldspacedims1.cc, generalizedaffineimage1.cc,
+	  generalizedaffineimage2.cc, generalizedaffinepreimage1.cc,
+	  generalizedaffinepreimage2.cc, grid1.cc, grid2.cc,
+	  griddifference1.cc, intersection1.cc, intersection2.cc,
+	  limitedextrapolation1.cc, mapspacedims1.cc, relations1.cc,
+	  relations2.cc, timeelapse1.cc, widening1.cc
+	  (grids.[3,9,3,2,3,2,2,3,2,2,19,15,4,3,4,2,8,2,4,2,3]): Use the
+	  new Degenerate_Element kinds.
+
+2005-09-03 Saturday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.21): Refer to
+	  "upper_bound_assign" methods rather than "poly_hull_assign" ones.
+	  Corrected several instances were the
+	  `Determinate<PH>::element()' accessor was not used.
+
+2005-09-03 Saturday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.17): New typedef `element_type'
+	  corresponding to the type of the underlying numeric domain.
+
+2005-09-03 Saturday 10:53  Matthew Mundell
+
+	* tests/Grid/addconstraints1.cc (grids.2): Dump grids on error.
+	  Test Grid(ccs).  Add tests where the resulting grid is empty.
+
+2005-09-03 Saturday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.24), src/BD_Shape.inlines.hh (1.58),
+	  tests/BD_Shape/Makefile.am (1.14), tests/BD_Shape/bdshull1.cc
+	  (1.1), tests/BD_Shape/bdshull2.cc (1.1),
+	  tests/BD_Shape/bdshull3.cc (1.1), tests/BD_Shape/bdshull4.cc
+	  (1.1), tests/BD_Shape/cc76extrapolation2.cc (1.5),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.6),
+	  tests/BD_Shape/ch78widening6.cc (1.6),
+	  tests/BD_Shape/exceptions1.cc (1.6), tests/BD_Shape/polyhull1.cc
+	  (1.5), tests/BD_Shape/polyhull2.cc (1.5),
+	  tests/BD_Shape/polyhull3.cc (1.5), tests/BD_Shape/polyhull4.cc
+	  (1.5): Methods BD_Shape::poly_hull_assign* renamed
+	  bds_hull_assign*.  New method void upper_bound_assign(const
+	  BD_Shape<T>& y) is the same as bds_hull_assign(y).
+
+2005-09-03 Saturday 10:51  Matthew Mundell
+
+	* src/Grid_public.cc (grids.61): In Grid(ccs) ensure that the grid
+	  is the same dimension as ccs.
+
+2005-09-03 Saturday 10:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.276), Polyhedron.inlines.hh (1.119):
+	  New method void upper_bound_assign(const Polyhedron& y) is the
+	  same as poly_hull_assign(y).
+
+2005-09-03 Saturday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.18): Corrected to match the new
+	  specifications for Polyhedron::maximize(), Polyhedron::minimize()
+	  and Constraint_System::primal_simplex().  Also corrected a memory
+	  leak bug.
+
+2005-09-03 Saturday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.137), C/ppl_c.h.in (1.52),
+	  Prolog/ppl_prolog.icc (1.160): Interfaces updated to match the
+	  new specifications of Polyhedron::maximize(),
+	  Polyhedron::minimize() and Constraint_System::primal_simplex().
+
+2005-09-03 Saturday 10:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.inlines.hh (1.57), Constraint_System.defs.hh
+	  (1.11), Polyhedron.defs.hh (1.275), Polyhedron.inlines.hh
+	  (1.118), Polyhedron_nonpublic.cc (1.50), simplex.cc (1.12):
+	  Corrected a bug in the implementation of
+	  Constraint_System::primal_simplex() whereby a feasible solution
+	  was claimed even for inconsistent constraint systems. Added
+	  private method   Simplex_Status
+	  Constraint_System::primal_simplex(obj, gen) that maximizes obj on
+	  the low-level polyhedron (i.e., the eps-polyhedron if topology is
+	  NNC) encoded by the constraint system.  New method used to
+	  correct a bug in the implementation of
+	  Polyhedron::minimized_constraints() whereby the constraint system
+	  could have been marked minimized even if it was not.	Simplified
+	  the interfaces of methods   Polyhedron::minimize(),
+	  Polyhedron::maximize(),   Constraint_System::primal_simplex() by
+	  avoiding memory-leakage prone parameter passing.
+
+2005-09-02 Friday 23:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.26), primalsimplex1.cc (1.1):
+	  This test shows an error in Constraint_System::primal_simplex().
+
+2005-09-02 Friday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[41,60]): Use the
+	  global DEGENERATE_ELEMENT enum instead of the local
+	  DEGENERATE_KIND.
+
+2005-09-02 Friday 19:15  Matthew Mundell
+
+	* src/Congruence.inlines.hh (grids.12): Compute the row capacity in
+	  Congruence(c).
+
+2005-09-02 Friday 18:54  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, addconstraints1.cc (grids.[27,1]): Add
+	  addconstraints1.
+
+2005-09-02 Friday 18:53  Matthew Mundell
+
+	* src/Congruence.inlines.hh (grids.11): Account for the extra
+	  element in NNC constraints in Congruence(c).
+
+2005-09-02 Friday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.44): Dividing by 10 the
+	  parameter GLOBALSTKSIZE seems to help testing with clpq2.
+
+2005-09-02 Friday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING, Makefile.am, NEWS, README, README.configure, STANDARDS,
+	  TODO, build_header, compile, config.guess, config.rpath,
+	  config.sub, configure.ac, depcomp, install-sh, ltmain.sh,
+	  missing, mkinstalldirs, Watchdog/COPYING,
+	  Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Makefile.am,
+	  Watchdog/Pending_Element.cc, Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/README, Watchdog/Time.cc, Watchdog/Time.defs.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/Watchdog.cc,
+	  Watchdog/Watchdog.defs.hh, Watchdog/Watchdog.inlines.hh,
+	  Watchdog/compile, Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/depcomp, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/missing, Watchdog/mkinstalldirs,
+	  Watchdog/pwl_header.bottom, Watchdog/pwl_header.hh,
+	  Watchdog/pwl_header.middle, Watchdog/pwl_header.top,
+	  Watchdog/utils/.cvsignore, Watchdog/utils/Makefile.am,
+	  Watchdog/utils/build_header, debian/libppl-pwl.copyright.in,
+	  debian/libppl.copyright.in, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/ppl_lpsol.c,
+	  demos/ppl_lpsol/examples/Makefile.am, doc/Makefile.am,
+	  doc/README.doc, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/fdl.tex, doc/fdl.txt, doc/gpl.dox, doc/gpl.tex,
+	  doc/gpl.txt, doc/ppl.sty, doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/Makefile.am, interfaces/C/Makefile.am,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/OCaml/Makefile.am, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/gp_clpq.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.h,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.cc,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/SWI/ppl_pl.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/ppl_yap.pl,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/pl_check.pl, m4/Makefile.am,
+	  m4/ac_check_gmp.m4, m4/ac_check_swi_prolog.m4,
+	  m4/ac_cxx_attribute_weak.m4, m4/ac_cxx_double_is_iec_559.m4,
+	  m4/ac_cxx_flexible_arrays.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_double_is_iec_559.m4,
+	  m4/ac_cxx_long_long.m4, m4/ppl.m4, src/Ask_Tell.defs.hh,
+	  src/Ask_Tell.inlines.hh, src/BDS_Status.idefs.hh,
+	  src/BDS_Status.inlines.hh, src/BD_Shape.defs.hh,
+	  src/BD_Shape.inlines.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/Checked_Number.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Coefficient.cc, src/Coefficient.defs.hh,
+	  src/Coefficient.inlines.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint_System.cc, src/Constraint_System.defs.hh,
+	  src/Constraint_System.inlines.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Row.defs.hh,
+	  src/DB_Row.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/E_NIT.defs.hh,
+	  src/E_NIT.inlines.hh, src/E_NIT.types.hh, src/E_Rational.defs.hh,
+	  src/E_Rational.inlines.hh, src/E_Rational.types.hh,
+	  src/Float.defs.hh, src/Float.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/Generator.cc,
+	  src/Generator.defs.hh, src/Generator.inlines.hh,
+	  src/Generator_System.cc, src/Generator_System.defs.hh,
+	  src/Generator_System.inlines.hh, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/Init.cc, src/Init.defs.hh, src/Interval.cc,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Interval.types.hh, src/Limits.hh, src/Linear_Expression.cc,
+	  src/Linear_Expression.defs.hh, src/Linear_Expression.inlines.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/NNC_Polyhedron.cc,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Numeric_Format.defs.hh, src/Ph_Status.cc,
+	  src/Ph_Status.idefs.hh, src/Ph_Status.inlines.hh,
+	  src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Con_Relation.inlines.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	  src/Result.defs.hh, src/Result.inlines.hh, src/Rounding.defs.hh,
+	  src/Rounding.types.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/Saturation_Matrix.cc,
+	  src/Saturation_Matrix.defs.hh, src/Saturation_Matrix.inlines.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+	  src/Saturation_Row.inlines.hh, src/Variable.cc,
+	  src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+	  src/algorithms.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/compiler.hh, src/conversion.cc, src/float.types.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh, src/initializer.hh,
+	  src/max_space_dimension.hh, src/minimize.cc, src/namespaces.hh,
+	  src/ppl-config.cc.in, src/ppl_header.hh, src/simplex.cc,
+	  src/simplify.cc, src/swapping_sort.icc, src/version.cc,
+	  src/version.hh.in, tests/BBox.cc, tests/BBox.hh,
+	  tests/Makefile.am, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/ehandlers.cc, tests/ehandlers.hh, tests/files.cc,
+	  tests/files.hh, tests/ppl_test.hh, tests/print.cc,
+	  tests/print.hh, tests/BD_Shape/Makefile.am,
+	  tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+	  tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+	  tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/empty5.cc, tests/BD_Shape/equality1.cc,
+	  tests/BD_Shape/exceptions1.cc, tests/BD_Shape/exceptions2.cc,
+	  tests/BD_Shape/exceptions3.cc, tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/h79widening1.cc, tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/intersection2.cc, tests/BD_Shape/intersection3.cc,
+	  tests/BD_Shape/intersection4.cc, tests/BD_Shape/intersection5.cc,
+	  tests/BD_Shape/intersection6.cc, tests/BD_Shape/intersection7.cc,
+	  tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+	  tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+	  tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/removespacedims2.cc,
+	  tests/BD_Shape/removespacedims3.cc,
+	  tests/BD_Shape/timeelapse1.cc, tests/BD_Shape/timeelapse2.cc,
+	  tests/BD_Shape/timeelapse3.cc, tests/BD_Shape/timeelapse4.cc,
+	  tests/BD_Shape/timeelapse5.cc, tests/BD_Shape/universe1.cc,
+	  tests/BD_Shape/writebdshape1.cc, tests/BD_Shape/writebdshape2.cc,
+	  tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage11.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedaffineimage1.cc,
+	  tests/Polyhedron/boundedaffineimage2.cc,
+	  tests/Polyhedron/boundedaffineimage3.cc,
+	  tests/Polyhedron/boundedaffinepreimage1.cc,
+	  tests/Polyhedron/boundedaffinepreimage2.cc,
+	  tests/Polyhedron/boundedaffinepreimage3.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/bug2.cc,
+	  tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc,
+	  tests/Polyhedron/constraints5.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generalizedaffinepreimage1.cc,
+	  tests/Polyhedron/generalizedaffinepreimage2.cc,
+	  tests/Polyhedron/generalizedaffinepreimage3.cc,
+	  tests/Polyhedron/generalizedaffinepreimage4.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/generators7.cc, tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/gramshmidt1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/memory2.cc, tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/polypowerset1.cc,
+	  tests/Polyhedron/randphull1.cc, tests/Polyhedron/randphull2.cc,
+	  tests/Polyhedron/relations1.cc, tests/Polyhedron/relations10.cc,
+	  tests/Polyhedron/relations11.cc, tests/Polyhedron/relations12.cc,
+	  tests/Polyhedron/relations13.cc, tests/Polyhedron/relations14.cc,
+	  tests/Polyhedron/relations15.cc, tests/Polyhedron/relations16.cc,
+	  tests/Polyhedron/relations17.cc, tests/Polyhedron/relations18.cc,
+	  tests/Polyhedron/relations19.cc, tests/Polyhedron/relations2.cc,
+	  tests/Polyhedron/relations3.cc, tests/Polyhedron/relations4.cc,
+	  tests/Polyhedron/relations5.cc, tests/Polyhedron/relations6.cc,
+	  tests/Polyhedron/relations7.cc, tests/Polyhedron/relations8.cc,
+	  tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/topclosed1.cc,
+	  tests/Polyhedron/topclosed2.cc, tests/Polyhedron/topclosed3.cc,
+	  tests/Polyhedron/topclosure1.cc, tests/Polyhedron/topclosure2.cc,
+	  tests/Polyhedron/topclosure3.cc, tests/Polyhedron/topclosure4.cc,
+	  tests/Polyhedron/universe1.cc, tests/Polyhedron/universe2.cc,
+	  tests/Polyhedron/universe3.cc, tests/Polyhedron/universe4.cc,
+	  tests/Polyhedron/universe5.cc, tests/Polyhedron/universe6.cc,
+	  tests/Polyhedron/universe7.cc, tests/Polyhedron/watchdog1.cc,
+	  tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc, utils/Makefile.am,
+	  utils/build_header, utils/text2cxxarray, utils/timings.cc,
+	  utils/timings.hh
+	  (grids.[1,2,2,2,1,3,2,2,1,2,1,2,3,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,2,2,1,2,1,7,2,2,2,1,1,1,1,1,1,2,1,1,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,2,4,1,1,1,1,1,2,2,1,1,2,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,2,2,1,1,1,1,1,2,2,1,1,1,2,3,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,2,2,3,2,3,6,3,12,4,1,1,1,1,2,2,1,2,2,1,1,2,4,2,4,4,3,1,1,1,6,2,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,1,2,1,2, [...]
+	  Second merge from main trunk.
+
+2005-09-02 Friday 17:00  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.16): Take reference to pending rows
+	  out of comment.
+
+2005-09-02 Friday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/timings.cc (1.5): Fixed print_clock().
+
+2005-09-02 Friday 17:00  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[40,29,59]): Add add_constraint, add_constraints and
+	  Grid(cs). Add throw_dimension_incompatible methods for
+	  Constraints and Constraint_Systems.
+
+2005-09-02 Friday 11:42  Matthew Mundell
+
+	* src/Congruence.inlines.hh (grids.10): Check for all cases of
+	  trivially true congruences.
+
+2005-09-02 Friday 11:41  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence_System.cc (grids.[16,22]):
+	  Strong normalize congruences before outputting them from the
+	  congruence system.
+
+2005-09-02 Friday 11:39  Matthew Mundell
+
+	* src/Congruence.cc (grids.8): In the output operator only output
+	  the modulus for proper congruences, and use `=' instead of `=='.
+
+2005-09-02 Friday 10:53  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.21): Use `while (true)' instead
+	  of `while (1)'.
+
+2005-09-02 Friday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator_System.cc (grids.11): Use booleans when booleans
+	  are intended.
+
+2005-09-02 Friday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (grids.58): Print only the minimized
+	  congruences.
+
+2005-09-01 Thursday 19:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.49): When strongly minimizing a
+	  constraint system, if we add back an epsilon upper bound
+	  constraint we should reset the minimization flag.
+
+2005-09-01 Thursday 18:31  Matthew Mundell
+
+	* src/Grid_public.cc (grids.57): In generalized_affine_preimage
+	  improve a variable name and skip the normalization check when
+	  inserting the lines.
+
+2005-09-01 Thursday 18:18  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.28): Set gen_sys's sortedness false
+	  after clearing gen_sys.  Correct a comment.
+
+2005-09-01 Thursday 18:17  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.15): In map_space_dimensions clear
+	  minimized flags after permuting columns, and skip the
+	  normalization check when inserting generators.
+
+2005-09-01 Thursday 17:17  Matthew Mundell
+
+	* src/Grid_public.cc (grids.56): In the copy constructor set
+	  gen_sys's sortedness to false when given grid's generators are
+	  out of date.	In OK correct a comment and a message and test that
+	  gen_sys's sortedness is false.
+
+2005-09-01 Thursday 17:15  Matthew Mundell
+
+	* src/: Grid.inlines.hh, Grid_chdims.cc, Grid_simplify.cc
+	  (grids.[14,16,29]): Set gen_sys's sortedness to false after
+	  clearing gen_sys.  Take extra set_sorted calls out of the
+	  generator simplify method.
+
+2005-09-01 Thursday 15:54  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.13): Set sortedness of the temporary
+	  generators system in map_space_dimensions to false.
+
+2005-09-01 Thursday 15:34  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.27): Take tracing out of
+	  is_included_in.
+
+2005-09-01 Thursday 15:29  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.20): Take tracing out of
+	  satisfies_all_congruences.
+
+2005-09-01 Thursday 15:23  Matthew Mundell
+
+	* src/: Grid_nonpublic.cc, Grid_public.cc (grids.[26,55]): Always
+	  and only set sorted to false when adding new generators.
+
+2005-09-01 Thursday 15:21  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.15): Use correct domain in comment.
+
+2005-09-01 Thursday 15:20  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.39): Take out old Polyhedra comments.
+
+2005-09-01 Thursday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.20): Prefer pre-increment to
+	  post-increment.
+
+2005-09-01 Thursday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.56): Using direct initialization
+	  instead of definition+assignment in a few places.
+
+2005-09-01 Thursday 14:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.64): Reverted previosu change, since it might
+	  result in poorer performance.
+
+2005-09-01 Thursday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.15), ltmain.sh (1.26), Watchdog/install-sh (1.12),
+	  Watchdog/ltmain.sh (1.15): Updated from Libtool 1.5.20.
+
+2005-08-31 Wednesday 18:09  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.38): Mark up parameter description
+	  correctly.
+
+2005-08-31 Wednesday 18:08  Matthew Mundell
+
+	* doc/definitions.dox (grids.6): Correct spelling of anchor.
+
+2005-08-31 Wednesday 17:19  Matthew Mundell
+
+	* doc/definitions.dox (grids.5): Clip trailing whitespace.
+
+2005-08-31 Wednesday 17:04  Matthew Mundell
+
+	* src/Makefile.am (grids.5): Add grid_widenings.cc to
+	  libppl_la_SOURCES.
+
+2005-08-31 Wednesday 17:03  Matthew Mundell
+
+	* tests/Grid/bug1.dat, src/Grid_public.cc (grids.[3,54]): Enable
+	  dumping and loading of the entire status.
+
+2005-08-31 Wednesday 16:58  Matthew Mundell
+
+	* src/Grid_Status.cc (grids.2): Append a newline to the ASCII dump.
+	  ASCII dump on failure of the empty flag check in the OK method.
+	  Correct the class name in the file header.
+
+2005-08-30 Tuesday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.49): Do not override the output
+	  function of PH.
+
+2005-08-30 Tuesday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.55): Do not refer to nonexistent
+	  constructors.
+
+2005-08-29 Monday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: Makefile.am (1.14), ppl.m4 (1.1): Initial revision of an
+	  Autoconf function to test for the existence and usability of
+	  particular versions of the PPL, defining macros containing the
+	  required paths.
+
+2005-08-29 Monday 18:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: tests/pl_check.pl (1.9),
+	  Ciao/ciao_pl_check.pl (1.13), XSB/xsb_pl_check.P (1.18): Added
+	  tests for Prolog interface predicates: bounded_affine_image,
+	  bounded_affine_preimage, generalized_affine_preimage.
+
+2005-08-29 Monday 17:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Coefficient.defs.hh (1.4), Coefficient.inlines.hh (1.4),
+	  Generator.cc (1.63), Linear_Row.cc (1.7), globals.defs.hh (1.22),
+	  globals.inlines.hh (1.11), simplex.cc (1.11): Do use
+	  Coefficient_traits where appropriate.
+
+2005-08-29 Monday 16:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.23), BD_Shape.inlines.hh (1.54): Using
+	  Coefficient_traits where appropriate.  Corrected a few comments.
+	  Trying to clean up affine_image().
+
+2005-08-29 Monday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.22): No longer mention is_nonnegative().
+
+2005-08-29 Monday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: cc76extrapolation6.cc (1.5), ch78widening6.cc
+	  (1.5), relations1.cc (1.7), relations2.cc (1.7), relations3.cc
+	  (1.6), relations4.cc (1.5), relations5.cc (1.7): Added, when
+	  needed, using directives for IO_Operators.
+
+2005-08-29 Monday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.53): No longer refer to the obsolete
+	  function is_nonnegative().
+
+2005-08-29 Monday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/gramshmidt1.cc (1.1): Draft test program for
+	  Constraint_System::gram_shmidt().
+
+2005-08-28 Sunday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.inlines.hh (1.7), Polyhedron.inlines.hh
+	  (1.117): Objects of type mpq_class now created properly.
+
+2005-08-28 Sunday 12:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.159), Ciao/ppl_ciao.pl
+	  (1.81), GNU/ppl_gprolog.pl (1.53), SICStus/ppl_sicstus_sd.cc
+	  (1.77), SWI/ppl_swiprolog.cc (1.101), XSB/ppl_xsb.H (1.40),
+	  XSB/ppl_xsb.cc (1.68), YAP/ppl_yap.cc (1.93): Interfaced new
+	  methods computing preimages of generalized affine relations.
+
+2005-08-28 Sunday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bounding_Box.inlines.hh (1.6): Temporary kludges to avoid the
+	  selection of the wrong mpq_class constructor.
+
+2005-08-28 Sunday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_check_gmp.m4 (1.22), ac_check_swi_prolog.m4 (1.3),
+	  ac_cxx_attribute_weak.m4 (1.6), ac_cxx_double_is_iec_559.m4
+	  (1.4), ac_cxx_flexible_arrays.m4 (1.11),
+	  ac_cxx_float_is_iec_559.m4 (1.4), ac_cxx_long_double.m4 (1.5),
+	  ac_cxx_long_double_is_iec_559.m4 (1.4), ac_cxx_long_long.m4
+	  (1.4): Broken comments restored.
+
+2005-08-28 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* missing (1.12), Watchdog/missing (1.8): Broken comments restored.
+
+2005-08-27 Saturday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.8): Progress on the --ldflags option.
+
+2005-08-27 Saturday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.32), Watchdog/Makefile.am (1.21): The `configure'
+	  script is now listed in `dist_noinst_SCRIPTS' and no longer in
+	  `EXTRA_DIST'.
+
+2005-08-27 Saturday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.31), build_header (1.3), Watchdog/Makefile.am
+	  (1.20), Watchdog/configure.ac (1.27), Watchdog/pwl_header.bottom
+	  (1.3), Watchdog/pwl_header.hh (1.1), Watchdog/pwl_header.middle
+	  (1.4), Watchdog/pwl_header.top (1.8), Watchdog/utils/.cvsignore
+	  (1.1), Watchdog/utils/Makefile.am (1.1),
+	  Watchdog/utils/build_header (1.1), src/Makefile.am (1.117),
+	  utils/Makefile.am (1.6), utils/build_header (1.1): Definitely
+	  switch to the new mechanism to build the library headers.  The
+	  `build_header' script belongs to the `utils' directories.
+
+2005-08-27 Saturday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.46): Fixed a couple of typos in
+	  comments.
+
+2005-08-27 Saturday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.158), src/Bounding_Box.cc
+	  (1.8), src/Bounding_Box.inlines.hh (1.5), src/Interval.cc (1.12),
+	  src/Interval.defs.hh (1.24), src/Interval.inlines.hh (1.23),
+	  src/Interval.types.hh (1.9), src/Polyhedron.inlines.hh (1.116),
+	  src/checked_mpq.inlines.hh (1.22): Obsolete class ERational
+	  removed.  In the process, fixed a couple of bugs whereby GMP
+	  rationals were created out of pairs of integers that could have
+	  common factors, yet the canonicalize() method was not invoked.
+
+2005-08-27 Saturday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.5): Ensure the `text2cxxarray' script is
+	  distributed.
+
+2005-08-27 Saturday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/Makefile.am (1.4): The `text2cxxarray' script is now listed
+	  in `noinst_SCRIPTS'.
+
+2005-08-27 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.171), src/checked_float.inlines.hh (1.41): Check
+	  for the declaration of long double rintl(long double x): rintl()
+	  is not provided on systems that do not have proper long doubles.
+
+2005-08-26 Friday 11:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.170): Comment restored.
+
+2005-08-26 Friday 10:04  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.22), checked_ext.inlines.hh (1.20),
+	  checked_float.inlines.hh (1.40), checked_int.inlines.hh (1.36),
+	  checked_mpq.inlines.hh (1.21), checked_mpz.inlines.hh (1.25):
+	  Finer grain for policy. New special values functions. Use
+	  assertions when policy does not request checks.
+
+2005-08-26 Friday 10:02  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.36): Added special values
+	  funcions.
+
+2005-08-26 Friday 10:01  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.31): Finer grain for policy.
+
+2005-08-25 Thursday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.defs.hh (1.6), src/E_NIT.inlines.hh (1.11),
+	  src/E_NIT.types.hh (1.4), src/E_Rational.defs.hh (1.6),
+	  src/E_Rational.inlines.hh (1.9), src/E_Rational.types.hh (1.4),
+	  src/Makefile.am (1.116), tests/BD_Shape/maxspacedim.cc (1.6):
+	  Obsolete classes E_NIT and E_Rational removed.
+
+2005-08-25 Thursday 18:37  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, limitedextrapolation1.cc
+	  (grids.[26,1]): Add limitedextrapolation1.
+
+2005-08-25 Thursday 18:36  Matthew Mundell
+
+	* tests/Grid/widening1.cc (grids.2): Add congruences to the correct
+	  grid in test5.  Improve a comment.  Use a definition for the
+	  token count in test10.  Take out the old test invocations.
+
+2005-08-25 Thursday 18:30  Matthew Mundell
+
+	* tests/Grid/relations2.cc (grids.3): Add test9, in which a grid
+	  with a line strictly intersects a relational congruence.
+
+2005-08-25 Thursday 18:19  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_widenings.cc (grids.[37,2]): Add method
+	  limited_extrapolation_assign.  Improve the description of
+	  dim_kinds.  Rename the congruence parameter in the relation_with
+	  declaration to cg.
+
+2005-08-25 Thursday 18:09  Matthew Mundell
+
+	* src/Grid_public.cc (grids.53): In relation_with(cg) only modulate
+	  the scalar product for points and parameters.
+
+2005-08-25 Thursday 18:06  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.12): Swap dim_kinds in method swap.
+
+2005-08-23 Tuesday 22:07  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, widening1.cc (grids.[25,1]): Add
+	  widening1.
+
+2005-08-23 Tuesday 22:06  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_widenings.cc (grids.[36,1]): Add methods
+	  widening_assign and select_wider_congruences.
+
+2005-08-23 Tuesday 11:22  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Grid_conversion.cc, Grid_simplify.cc
+	  (grids.[15,18,28]): Prefer postfix operators.
+
+2005-08-22 Monday 12:18  Matthew Mundell
+
+	* src/Grid_public.cc (grids.52): In OK check dim_kinds size before
+	  checking upper triangularity.
+
+2005-08-22 Monday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.21): Restored comment broken with previous commit.
+
+2005-08-22 Monday 00:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.32), config.sub (1.31), Watchdog/config.guess
+	  (1.16), Watchdog/config.sub (1.16): Updated.
+
+2005-08-22 Monday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.3), Makefile.am (1.30), README (1.37),
+	  README.configure (1.14), build_header (1.2), compile (1.6),
+	  config.guess (1.31), config.rpath (1.4), config.sub (1.30),
+	  configure.ac (1.169), depcomp (1.11), ltmain.sh (1.25), missing
+	  (1.11), Watchdog/COPYING (1.3),
+	  Watchdog/Doubly_Linked_Object.defs.hh (1.3),
+	  Watchdog/Doubly_Linked_Object.inlines.hh (1.3),
+	  Watchdog/EList.defs.hh (1.5), Watchdog/EList.inlines.hh (1.4),
+	  Watchdog/EList_Iterator.defs.hh (1.3),
+	  Watchdog/EList_Iterator.inlines.hh (1.4),
+	  Watchdog/Handler.defs.hh (1.5), Watchdog/Handler.inlines.hh
+	  (1.4), Watchdog/Makefile.am (1.19), Watchdog/Pending_Element.cc
+	  (1.3), Watchdog/Pending_Element.defs.hh (1.3),
+	  Watchdog/Pending_Element.inlines.hh (1.3),
+	  Watchdog/Pending_List.cc (1.3), Watchdog/Pending_List.defs.hh
+	  (1.3), Watchdog/Pending_List.inlines.hh (1.3), Watchdog/README
+	  (1.11), Watchdog/Time.cc (1.3), Watchdog/Time.defs.hh (1.3),
+	  Watchdog/Time.inlines.hh (1.4), Watchdog/Watchdog.cc (1.20),
+	  Watchdog/Watchdog.defs.hh (1.16), Watchdog/Watchdog.inlines.hh
+	  (1.13), Watchdog/compile (1.6), Watchdog/config.guess (1.15),
+	  Watchdog/config.sub (1.15), Watchdog/configure.ac (1.26),
+	  Watchdog/depcomp (1.9), Watchdog/ltmain.sh (1.14),
+	  Watchdog/missing (1.7), Watchdog/pwl_header.top (1.7),
+	  debian/libppl-pwl.copyright.in (1.2), debian/libppl.copyright.in
+	  (1.2), demos/Makefile.am (1.7), demos/ppl_lcdd/Makefile.am
+	  (1.20), demos/ppl_lcdd/ppl_lcdd.cc (1.44),
+	  demos/ppl_lcdd/examples/Makefile.am (1.5),
+	  demos/ppl_lpsol/Makefile.am (1.14), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.17), demos/ppl_lpsol/examples/Makefile.am (1.4),
+	  doc/Makefile.am (1.35), doc/README.doc (1.5), doc/fdl.dox (1.7),
+	  doc/fdl.tex (1.4), doc/fdl.txt (1.2), doc/gpl.dox (1.7),
+	  doc/gpl.tex (1.3), doc/gpl.txt (1.3), doc/ppl.sty (1.20),
+	  interfaces/Makefile.am (1.11), interfaces/C/Makefile.am (1.19),
+	  interfaces/C/ppl_c.cc (1.136), interfaces/C/ppl_c.h.in (1.51),
+	  interfaces/OCaml/Makefile.am (1.10),
+	  interfaces/Prolog/Makefile.am (1.28),
+	  interfaces/Prolog/Prolog_interface.dox (1.133),
+	  interfaces/Prolog/exceptions.hh (1.16),
+	  interfaces/Prolog/ppl_prolog.icc (1.157),
+	  interfaces/Prolog/track_allocation.hh (1.17),
+	  interfaces/Prolog/Ciao/Makefile.am (1.43),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.15),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.11),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.12),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.32),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.80),
+	  interfaces/Prolog/GNU/Makefile.am (1.47),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.6),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.9),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.52),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.28),
+	  interfaces/Prolog/SICStus/Makefile.am (1.53),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.25),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.76),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.5),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.6),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.12),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.12),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.4),
+	  interfaces/Prolog/SWI/Makefile.am (1.51),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.9),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.8),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.9),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.100),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.5),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.5),
+	  interfaces/Prolog/XSB/Makefile.am (1.34),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.39),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.67),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.14),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.12),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.17),
+	  interfaces/Prolog/YAP/Makefile.am (1.38),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.92),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.9),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.10),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.6),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.8),
+	  interfaces/Prolog/tests/Makefile.am (1.5),
+	  interfaces/Prolog/tests/clpq.pl (1.6),
+	  interfaces/Prolog/tests/clpq2.pl (1.6),
+	  interfaces/Prolog/tests/pl_check.pl (1.8), m4/Makefile.am (1.13),
+	  m4/ac_check_gmp.m4 (1.21), m4/ac_check_swi_prolog.m4 (1.2),
+	  m4/ac_cxx_attribute_weak.m4 (1.5), m4/ac_cxx_double_is_iec_559.m4
+	  (1.3), m4/ac_cxx_flexible_arrays.m4 (1.10),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.3), m4/ac_cxx_long_double.m4
+	  (1.4), m4/ac_cxx_long_double_is_iec_559.m4 (1.3),
+	  m4/ac_cxx_long_long.m4 (1.3), src/Ask_Tell.defs.hh (1.5),
+	  src/Ask_Tell.inlines.hh (1.5), src/BDS_Status.idefs.hh (1.7),
+	  src/BDS_Status.inlines.hh (1.5), src/BD_Shape.defs.hh (1.21),
+	  src/BD_Shape.inlines.hh (1.52), src/BHRZ03_Certificate.cc (1.8),
+	  src/BHRZ03_Certificate.defs.hh (1.11),
+	  src/BHRZ03_Certificate.inlines.hh (1.6), src/Bounding_Box.cc
+	  (1.7), src/Bounding_Box.defs.hh (1.7),
+	  src/Bounding_Box.inlines.hh (1.4), src/C_Polyhedron.cc (1.15),
+	  src/C_Polyhedron.defs.hh (1.33), src/C_Polyhedron.inlines.hh
+	  (1.26), src/Checked_Number.cc (1.7), src/Checked_Number.defs.hh
+	  (1.30), src/Checked_Number.inlines.hh (1.35), src/Coefficient.cc
+	  (1.3), src/Coefficient.defs.hh (1.3), src/Coefficient.inlines.hh
+	  (1.3), src/Constraint.cc (1.51), src/Constraint.defs.hh (1.104),
+	  src/Constraint.inlines.hh (1.60), src/Constraint_System.cc (1.8),
+	  src/Constraint_System.defs.hh (1.10),
+	  src/Constraint_System.inlines.hh (1.4), src/DB_Matrix.defs.hh
+	  (1.5), src/DB_Matrix.inlines.hh (1.5), src/DB_Row.defs.hh (1.7),
+	  src/DB_Row.inlines.hh (1.7), src/Determinate.defs.hh (1.55),
+	  src/Determinate.inlines.hh (1.48), src/E_NIT.defs.hh (1.5),
+	  src/E_NIT.inlines.hh (1.10), src/E_Rational.defs.hh (1.5),
+	  src/E_Rational.inlines.hh (1.8), src/Float.defs.hh (1.8),
+	  src/Float.inlines.hh (1.9), src/GMP_Integer.defs.hh (1.6),
+	  src/GMP_Integer.inlines.hh (1.5), src/Generator.cc (1.62),
+	  src/Generator.defs.hh (1.105), src/Generator.inlines.hh (1.55),
+	  src/Generator_System.cc (1.7), src/Generator_System.defs.hh
+	  (1.8), src/Generator_System.inlines.hh (1.4),
+	  src/H79_Certificate.cc (1.7), src/H79_Certificate.defs.hh (1.10),
+	  src/H79_Certificate.inlines.hh (1.5), src/Init.cc (1.18),
+	  src/Init.defs.hh (1.13), src/Interval.cc (1.11),
+	  src/Interval.defs.hh (1.23), src/Interval.inlines.hh (1.22),
+	  src/Limits.hh (1.7), src/Linear_Expression.cc (1.5),
+	  src/Linear_Expression.defs.hh (1.9),
+	  src/Linear_Expression.inlines.hh (1.5), src/Linear_Row.cc (1.6),
+	  src/Linear_Row.defs.hh (1.9), src/Linear_Row.inlines.hh (1.8),
+	  src/Linear_System.cc (1.19), src/Linear_System.defs.hh (1.14),
+	  src/Linear_System.inlines.hh (1.17), src/Makefile.am (1.115),
+	  src/Matrix.cc (1.82), src/Matrix.defs.hh (1.69),
+	  src/Matrix.inlines.hh (1.44), src/NNC_Polyhedron.cc (1.14),
+	  src/NNC_Polyhedron.defs.hh (1.35), src/NNC_Polyhedron.inlines.hh
+	  (1.29), src/Native_Integer.defs.hh (1.11),
+	  src/Native_Integer.inlines.hh (1.10), src/Numeric_Format.defs.hh
+	  (1.4), src/Ph_Status.cc (1.7), src/Ph_Status.idefs.hh (1.10),
+	  src/Ph_Status.inlines.hh (1.6), src/Poly_Con_Relation.cc (1.10),
+	  src/Poly_Con_Relation.defs.hh (1.27),
+	  src/Poly_Con_Relation.inlines.hh (1.13), src/Poly_Gen_Relation.cc
+	  (1.10), src/Poly_Gen_Relation.defs.hh (1.25),
+	  src/Poly_Gen_Relation.inlines.hh (1.13),
+	  src/Polyhedra_Powerset.defs.hh (1.16),
+	  src/Polyhedra_Powerset.inlines.hh (1.20), src/Polyhedron.defs.hh
+	  (1.274), src/Polyhedron.inlines.hh (1.115),
+	  src/Polyhedron_chdims.cc (1.30), src/Polyhedron_nonpublic.cc
+	  (1.48), src/Polyhedron_public.cc (1.58),
+	  src/Polyhedron_widenings.cc (1.45), src/Powerset.defs.hh (1.13),
+	  src/Powerset.inlines.hh (1.10), src/Ptr_Iterator.defs.hh (1.4),
+	  src/Ptr_Iterator.inlines.hh (1.4), src/Result.defs.hh (1.10),
+	  src/Result.inlines.hh (1.6), src/Rounding.defs.hh (1.13),
+	  src/Rounding.types.hh (1.4), src/Row.cc (1.81), src/Row.defs.hh
+	  (1.94), src/Row.inlines.hh (1.61), src/Saturation_Matrix.cc
+	  (1.4), src/Saturation_Matrix.defs.hh (1.3),
+	  src/Saturation_Matrix.inlines.hh (1.4), src/Saturation_Row.cc
+	  (1.7), src/Saturation_Row.defs.hh (1.6),
+	  src/Saturation_Row.inlines.hh (1.6), src/Variable.cc (1.19),
+	  src/Variable.defs.hh (1.46), src/Variable.inlines.hh (1.22),
+	  src/Widening_Function.defs.hh (1.11),
+	  src/Widening_Function.inlines.hh (1.10), src/algorithms.hh
+	  (1.41), src/checked.cc (1.3), src/checked.defs.hh (1.21),
+	  src/checked.inlines.hh (1.20), src/checked_ext.defs.hh (1.8),
+	  src/checked_ext.inlines.hh (1.19), src/checked_float.inlines.hh
+	  (1.39), src/checked_int.inlines.hh (1.35),
+	  src/checked_mpq.inlines.hh (1.20), src/checked_mpz.inlines.hh
+	  (1.24), src/checked_numeric_limits.hh (1.4), src/compiler.hh
+	  (1.5), src/conversion.cc (1.69), src/float.types.hh (1.8),
+	  src/fpu-c99.inlines.hh (1.7), src/fpu-ia32.inlines.hh (1.7),
+	  src/fpu-none.inlines.hh (1.2), src/fpu.defs.hh (1.5),
+	  src/globals.cc (1.21), src/globals.defs.hh (1.21),
+	  src/globals.inlines.hh (1.10), src/initializer.hh (1.11),
+	  src/max_space_dimension.hh (1.6), src/minimize.cc (1.41),
+	  src/namespaces.hh (1.2), src/ppl-config.cc.in (1.7),
+	  src/ppl_header.hh (1.3), src/simplex.cc (1.10), src/simplify.cc
+	  (1.43), src/swapping_sort.icc (1.9), src/version.cc (1.6),
+	  src/version.hh.in (1.11), tests/BBox.cc (1.10), tests/BBox.hh
+	  (1.9), tests/Makefile.am (1.243), tests/PFunction.cc (1.7),
+	  tests/PFunction.hh (1.7), tests/ehandlers.cc (1.7),
+	  tests/ehandlers.hh (1.12), tests/files.cc (1.7), tests/files.hh
+	  (1.8), tests/ppl_test.hh (1.24), tests/print.cc (1.16),
+	  tests/print.hh (1.20), tests/BD_Shape/Makefile.am (1.13),
+	  tests/BD_Shape/addconstraints1.cc (1.4),
+	  tests/BD_Shape/addspacedims1.cc (1.5),
+	  tests/BD_Shape/addspacedims2.cc (1.5),
+	  tests/BD_Shape/addspacedims3.cc (1.6),
+	  tests/BD_Shape/addspacedims4.cc (1.6),
+	  tests/BD_Shape/addspacedims5.cc (1.6),
+	  tests/BD_Shape/addspacedims6.cc (1.6),
+	  tests/BD_Shape/addspacedims7.cc (1.5),
+	  tests/BD_Shape/affineimage1.cc (1.5),
+	  tests/BD_Shape/affineimage2.cc (1.5),
+	  tests/BD_Shape/affineimage3.cc (1.5),
+	  tests/BD_Shape/affineimage4.cc (1.5),
+	  tests/BD_Shape/affineimage5.cc (1.5),
+	  tests/BD_Shape/affineimage6.cc (1.5),
+	  tests/BD_Shape/affineimage7.cc (1.5),
+	  tests/BD_Shape/affineimage8.cc (1.3),
+	  tests/BD_Shape/affineimage9.cc (1.3),
+	  tests/BD_Shape/affinepreimage1.cc (1.5),
+	  tests/BD_Shape/affinepreimage2.cc (1.5),
+	  tests/BD_Shape/affinepreimage3.cc (1.5),
+	  tests/BD_Shape/affinepreimage4.cc (1.5),
+	  tests/BD_Shape/affinepreimage5.cc (1.3),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.6),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.5),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.4),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.4),
+	  tests/BD_Shape/cc76narrowing1.cc (1.4),
+	  tests/BD_Shape/cc76narrowing2.cc (1.4),
+	  tests/BD_Shape/cc76narrowing3.cc (1.4),
+	  tests/BD_Shape/cc76narrowing4.cc (1.5),
+	  tests/BD_Shape/cc76narrowing5.cc (1.5),
+	  tests/BD_Shape/ch78widening1.cc (1.4),
+	  tests/BD_Shape/ch78widening2.cc (1.5),
+	  tests/BD_Shape/ch78widening3.cc (1.4),
+	  tests/BD_Shape/ch78widening4.cc (1.4),
+	  tests/BD_Shape/ch78widening5.cc (1.5),
+	  tests/BD_Shape/ch78widening6.cc (1.4),
+	  tests/BD_Shape/ch78widening7.cc (1.4),
+	  tests/BD_Shape/ch78widening8.cc (1.4),
+	  tests/BD_Shape/concatenate1.cc (1.5),
+	  tests/BD_Shape/concatenate2.cc (1.5),
+	  tests/BD_Shape/concatenate3.cc (1.4),
+	  tests/BD_Shape/concatenate4.cc (1.4),
+	  tests/BD_Shape/concatenate5.cc (1.5),
+	  tests/BD_Shape/constraints1.cc (1.6),
+	  tests/BD_Shape/constraints2.cc (1.5), tests/BD_Shape/contains1.cc
+	  (1.4), tests/BD_Shape/contains2.cc (1.6),
+	  tests/BD_Shape/contains3.cc (1.6), tests/BD_Shape/empty1.cc
+	  (1.4), tests/BD_Shape/empty2.cc (1.4), tests/BD_Shape/empty3.cc
+	  (1.5), tests/BD_Shape/empty4.cc (1.4), tests/BD_Shape/empty5.cc
+	  (1.4), tests/BD_Shape/equality1.cc (1.6),
+	  tests/BD_Shape/exceptions1.cc (1.5),
+	  tests/BD_Shape/exceptions2.cc (1.5),
+	  tests/BD_Shape/exceptions3.cc (1.7),
+	  tests/BD_Shape/fromgensys1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage13.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage14.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.6),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.5),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.4),
+	  tests/BD_Shape/h79widening1.cc (1.4),
+	  tests/BD_Shape/intersection1.cc (1.4),
+	  tests/BD_Shape/intersection2.cc (1.4),
+	  tests/BD_Shape/intersection3.cc (1.5),
+	  tests/BD_Shape/intersection4.cc (1.6),
+	  tests/BD_Shape/intersection5.cc (1.6),
+	  tests/BD_Shape/intersection6.cc (1.5),
+	  tests/BD_Shape/intersection7.cc (1.5),
+	  tests/BD_Shape/intersection8.cc (1.5),
+	  tests/BD_Shape/limitedCC76extrapolation1.cc (1.4),
+	  tests/BD_Shape/limitedCC76extrapolation2.cc (1.5),
+	  tests/BD_Shape/limitedCC76extrapolation3.cc (1.5),
+	  tests/BD_Shape/limitedCH78extrapolation1.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation2.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation3.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation4.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation5.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation6.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation7.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation8.cc (1.4),
+	  tests/BD_Shape/limitedCH78extrapolation9.cc (1.4),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.4),
+	  tests/BD_Shape/mapspacedims1.cc (1.4),
+	  tests/BD_Shape/mapspacedims2.cc (1.5),
+	  tests/BD_Shape/mapspacedims3.cc (1.4),
+	  tests/BD_Shape/mapspacedims4.cc (1.5),
+	  tests/BD_Shape/maxspacedim.cc (1.5),
+	  tests/BD_Shape/polydifference1.cc (1.6),
+	  tests/BD_Shape/polydifference2.cc (1.4),
+	  tests/BD_Shape/polydifference3.cc (1.4),
+	  tests/BD_Shape/polydifference4.cc (1.4),
+	  tests/BD_Shape/polydifference5.cc (1.5),
+	  tests/BD_Shape/polydifference6.cc (1.4),
+	  tests/BD_Shape/polyhull1.cc (1.4), tests/BD_Shape/polyhull2.cc
+	  (1.4), tests/BD_Shape/polyhull3.cc (1.4),
+	  tests/BD_Shape/polyhull4.cc (1.4), tests/BD_Shape/relations1.cc
+	  (1.6), tests/BD_Shape/relations2.cc (1.6),
+	  tests/BD_Shape/relations3.cc (1.5), tests/BD_Shape/relations4.cc
+	  (1.4), tests/BD_Shape/relations5.cc (1.6),
+	  tests/BD_Shape/removespacedims1.cc (1.5),
+	  tests/BD_Shape/removespacedims2.cc (1.5),
+	  tests/BD_Shape/removespacedims3.cc (1.5),
+	  tests/BD_Shape/timeelapse1.cc (1.5),
+	  tests/BD_Shape/timeelapse2.cc (1.4),
+	  tests/BD_Shape/timeelapse3.cc (1.4),
+	  tests/BD_Shape/timeelapse4.cc (1.4),
+	  tests/BD_Shape/timeelapse5.cc (1.5), tests/BD_Shape/universe1.cc
+	  (1.5), tests/BD_Shape/writebdshape1.cc (1.2),
+	  tests/BD_Shape/writebdshape2.cc (1.3),
+	  tests/Polyhedron/CbecomesNNC1.cc (1.4),
+	  tests/Polyhedron/Makefile.am (1.25),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.4),
+	  tests/Polyhedron/NNCminimize1.cc (1.4),
+	  tests/Polyhedron/NNCminimize2.cc (1.4),
+	  tests/Polyhedron/NNCminimize3.cc (1.4),
+	  tests/Polyhedron/NNCminimize4.cc (1.4),
+	  tests/Polyhedron/NNCminimize5.cc (1.4),
+	  tests/Polyhedron/NNCminimize6.cc (1.4), tests/Polyhedron/README
+	  (1.4), tests/Polyhedron/addconstraint1.cc (1.4),
+	  tests/Polyhedron/addconstraint2.cc (1.5),
+	  tests/Polyhedron/addconstraint3.cc (1.4),
+	  tests/Polyhedron/addconstraints1.cc (1.5),
+	  tests/Polyhedron/addconstraints10.cc (1.5),
+	  tests/Polyhedron/addconstraints11.cc (1.4),
+	  tests/Polyhedron/addconstraints12.cc (1.4),
+	  tests/Polyhedron/addconstraints13.cc (1.5),
+	  tests/Polyhedron/addconstraints2.cc (1.4),
+	  tests/Polyhedron/addconstraints3.cc (1.5),
+	  tests/Polyhedron/addconstraints4.cc (1.4),
+	  tests/Polyhedron/addconstraints5.cc (1.5),
+	  tests/Polyhedron/addconstraints6.cc (1.4),
+	  tests/Polyhedron/addconstraints7.cc (1.5),
+	  tests/Polyhedron/addconstraints8.cc (1.5),
+	  tests/Polyhedron/addconstraints9.cc (1.4),
+	  tests/Polyhedron/addgenerator1.cc (1.5),
+	  tests/Polyhedron/addgenerator2.cc (1.5),
+	  tests/Polyhedron/addgenerator3.cc (1.4),
+	  tests/Polyhedron/addgenerator4.cc (1.5),
+	  tests/Polyhedron/addgenerator5.cc (1.5),
+	  tests/Polyhedron/addgenerators1.cc (1.5),
+	  tests/Polyhedron/addgenerators10.cc (1.5),
+	  tests/Polyhedron/addgenerators11.cc (1.5),
+	  tests/Polyhedron/addgenerators12.cc (1.5),
+	  tests/Polyhedron/addgenerators13.cc (1.5),
+	  tests/Polyhedron/addgenerators2.cc (1.5),
+	  tests/Polyhedron/addgenerators3.cc (1.4),
+	  tests/Polyhedron/addgenerators4.cc (1.4),
+	  tests/Polyhedron/addgenerators5.cc (1.4),
+	  tests/Polyhedron/addgenerators6.cc (1.5),
+	  tests/Polyhedron/addgenerators7.cc (1.4),
+	  tests/Polyhedron/addgenerators8.cc (1.5),
+	  tests/Polyhedron/addgenerators9.cc (1.4),
+	  tests/Polyhedron/addspacedims1.cc (1.5),
+	  tests/Polyhedron/addspacedims10.cc (1.4),
+	  tests/Polyhedron/addspacedims11.cc (1.4),
+	  tests/Polyhedron/addspacedims12.cc (1.4),
+	  tests/Polyhedron/addspacedims13.cc (1.4),
+	  tests/Polyhedron/addspacedims2.cc (1.5),
+	  tests/Polyhedron/addspacedims3.cc (1.5),
+	  tests/Polyhedron/addspacedims4.cc (1.4),
+	  tests/Polyhedron/addspacedims5.cc (1.4),
+	  tests/Polyhedron/addspacedims6.cc (1.4),
+	  tests/Polyhedron/addspacedims7.cc (1.4),
+	  tests/Polyhedron/addspacedims8.cc (1.5),
+	  tests/Polyhedron/addspacedims9.cc (1.4),
+	  tests/Polyhedron/affineimage1.cc (1.5),
+	  tests/Polyhedron/affineimage2.cc (1.4),
+	  tests/Polyhedron/affineimage3.cc (1.4),
+	  tests/Polyhedron/affineimage4.cc (1.5),
+	  tests/Polyhedron/affineimage5.cc (1.5),
+	  tests/Polyhedron/affineimage6.cc (1.5),
+	  tests/Polyhedron/affineimage7.cc (1.4),
+	  tests/Polyhedron/affineimage8.cc (1.4),
+	  tests/Polyhedron/affineimage9.cc (1.4),
+	  tests/Polyhedron/affinepreimage1.cc (1.4),
+	  tests/Polyhedron/affinepreimage10.cc (1.4),
+	  tests/Polyhedron/affinepreimage11.cc (1.2),
+	  tests/Polyhedron/affinepreimage2.cc (1.4),
+	  tests/Polyhedron/affinepreimage3.cc (1.5),
+	  tests/Polyhedron/affinepreimage4.cc (1.4),
+	  tests/Polyhedron/affinepreimage5.cc (1.4),
+	  tests/Polyhedron/affinepreimage6.cc (1.4),
+	  tests/Polyhedron/affinepreimage7.cc (1.4),
+	  tests/Polyhedron/affinepreimage8.cc (1.5),
+	  tests/Polyhedron/affinepreimage9.cc (1.4),
+	  tests/Polyhedron/affinetrans.cc (1.5),
+	  tests/Polyhedron/append1.cc (1.4), tests/Polyhedron/append2.cc
+	  (1.4), tests/Polyhedron/ascii_dump_load1.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.4),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.5),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.4),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.5),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.5),
+	  tests/Polyhedron/bhrz03widening1.cc (1.4),
+	  tests/Polyhedron/bhrz03widening10.cc (1.5),
+	  tests/Polyhedron/bhrz03widening11.cc (1.4),
+	  tests/Polyhedron/bhrz03widening12.cc (1.4),
+	  tests/Polyhedron/bhrz03widening13.cc (1.4),
+	  tests/Polyhedron/bhrz03widening14.cc (1.4),
+	  tests/Polyhedron/bhrz03widening15.cc (1.5),
+	  tests/Polyhedron/bhrz03widening16.cc (1.4),
+	  tests/Polyhedron/bhrz03widening17.cc (1.4),
+	  tests/Polyhedron/bhrz03widening18.cc (1.4),
+	  tests/Polyhedron/bhrz03widening19.cc (1.4),
+	  tests/Polyhedron/bhrz03widening2.cc (1.4),
+	  tests/Polyhedron/bhrz03widening3.cc (1.4),
+	  tests/Polyhedron/bhrz03widening4.cc (1.4),
+	  tests/Polyhedron/bhrz03widening5.cc (1.4),
+	  tests/Polyhedron/bhrz03widening6.cc (1.4),
+	  tests/Polyhedron/bhrz03widening7.cc (1.4),
+	  tests/Polyhedron/bhrz03widening8.cc (1.4),
+	  tests/Polyhedron/bhrz03widening9.cc (1.4),
+	  tests/Polyhedron/bhz03widening1.cc (1.5),
+	  tests/Polyhedron/bhz03widening2.cc (1.5),
+	  tests/Polyhedron/bhz03widening3.cc (1.5),
+	  tests/Polyhedron/bhz03widening4.cc (1.5),
+	  tests/Polyhedron/bhz03widening5.cc (1.5),
+	  tests/Polyhedron/bhz03widening6.cc (1.5),
+	  tests/Polyhedron/bounded1.cc (1.5),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.3),
+	  tests/Polyhedron/boundedaffineimage2.cc (1.2),
+	  tests/Polyhedron/boundedaffineimage3.cc (1.2),
+	  tests/Polyhedron/boundedaffinepreimage1.cc (1.2),
+	  tests/Polyhedron/boundedaffinepreimage2.cc (1.2),
+	  tests/Polyhedron/boundedaffinepreimage3.cc (1.2),
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc (1.3),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.5),
+	  tests/Polyhedron/boundingbox1.cc (1.5),
+	  tests/Polyhedron/boundingbox2.cc (1.5),
+	  tests/Polyhedron/boundingbox3.cc (1.5),
+	  tests/Polyhedron/boundingbox4.cc (1.5),
+	  tests/Polyhedron/boundingbox5.cc (1.5),
+	  tests/Polyhedron/bounds1.cc (1.5), tests/Polyhedron/bounds2.cc
+	  (1.4), tests/Polyhedron/bug2.cc (1.3),
+	  tests/Polyhedron/concatenate1.cc (1.4),
+	  tests/Polyhedron/concatenate2.cc (1.5),
+	  tests/Polyhedron/concatenate3.cc (1.4),
+	  tests/Polyhedron/concatenate4.cc (1.4),
+	  tests/Polyhedron/concatenate5.cc (1.4),
+	  tests/Polyhedron/concatenate6.cc (1.5),
+	  tests/Polyhedron/concatenate7.cc (1.3),
+	  tests/Polyhedron/constraints1.cc (1.4),
+	  tests/Polyhedron/constraints2.cc (1.5),
+	  tests/Polyhedron/constraints3.cc (1.4),
+	  tests/Polyhedron/constraints4.cc (1.5),
+	  tests/Polyhedron/constraints5.cc (1.3),
+	  tests/Polyhedron/contains1.cc (1.4),
+	  tests/Polyhedron/contains2.cc (1.4),
+	  tests/Polyhedron/contains3.cc (1.4),
+	  tests/Polyhedron/contains4.cc (1.4),
+	  tests/Polyhedron/contains5.cc (1.4),
+	  tests/Polyhedron/disjoint1.cc (1.4),
+	  tests/Polyhedron/disjoint2.cc (1.5),
+	  tests/Polyhedron/disjoint3.cc (1.5),
+	  tests/Polyhedron/dualhypercubes.cc (1.4),
+	  tests/Polyhedron/empty1.cc (1.5), tests/Polyhedron/equals1.cc
+	  (1.4), tests/Polyhedron/exceptions1.cc (1.6),
+	  tests/Polyhedron/exceptions2.cc (1.5),
+	  tests/Polyhedron/exceptions3.cc (1.6),
+	  tests/Polyhedron/expandspacedim1.cc (1.5),
+	  tests/Polyhedron/expandspacedim2.cc (1.5),
+	  tests/Polyhedron/foldspacedims1.cc (1.5),
+	  tests/Polyhedron/foldspacedims2.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage13.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage14.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.5),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.4),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.4),
+	  tests/Polyhedron/generalizedaffinepreimage1.cc (1.2),
+	  tests/Polyhedron/generalizedaffinepreimage2.cc (1.2),
+	  tests/Polyhedron/generalizedaffinepreimage3.cc (1.2),
+	  tests/Polyhedron/generalizedaffinepreimage4.cc (1.2),
+	  tests/Polyhedron/generators1.cc (1.4),
+	  tests/Polyhedron/generators2.cc (1.4),
+	  tests/Polyhedron/generators3.cc (1.5),
+	  tests/Polyhedron/generators4.cc (1.5),
+	  tests/Polyhedron/generators5.cc (1.4),
+	  tests/Polyhedron/generators6.cc (1.5),
+	  tests/Polyhedron/generators7.cc (1.4),
+	  tests/Polyhedron/geomcovers1.cc (1.5),
+	  tests/Polyhedron/h79widening1.cc (1.4),
+	  tests/Polyhedron/h79widening2.cc (1.4),
+	  tests/Polyhedron/h79widening3.cc (1.4),
+	  tests/Polyhedron/h79widening4.cc (1.4),
+	  tests/Polyhedron/h79widening5.cc (1.5),
+	  tests/Polyhedron/h79widening6.cc (1.4),
+	  tests/Polyhedron/h79widening7.cc (1.4),
+	  tests/Polyhedron/h79widening8.cc (1.4),
+	  tests/Polyhedron/intersection1.cc (1.4),
+	  tests/Polyhedron/intersection10.cc (1.5),
+	  tests/Polyhedron/intersection11.cc (1.5),
+	  tests/Polyhedron/intersection2.cc (1.4),
+	  tests/Polyhedron/intersection3.cc (1.4),
+	  tests/Polyhedron/intersection4.cc (1.5),
+	  tests/Polyhedron/intersection5.cc (1.5),
+	  tests/Polyhedron/intersection6.cc (1.5),
+	  tests/Polyhedron/intersection7.cc (1.4),
+	  tests/Polyhedron/intersection8.cc (1.5),
+	  tests/Polyhedron/intersection9.cc (1.5),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.4),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.5),
+	  tests/Polyhedron/linearpartition1.cc (1.4),
+	  tests/Polyhedron/linearpartition2.cc (1.4),
+	  tests/Polyhedron/linearpartition3.cc (1.4),
+	  tests/Polyhedron/linearpartition4.cc (1.5),
+	  tests/Polyhedron/linexpression1.cc (1.4),
+	  tests/Polyhedron/mapspacedims1.cc (1.5),
+	  tests/Polyhedron/mapspacedims2.cc (1.4),
+	  tests/Polyhedron/mapspacedims3.cc (1.4),
+	  tests/Polyhedron/mapspacedims4.cc (1.4),
+	  tests/Polyhedron/max_min1.cc (1.4), tests/Polyhedron/max_min2.cc
+	  (1.4), tests/Polyhedron/maxspacedim1.cc (1.4),
+	  tests/Polyhedron/mc91.cc (1.5), tests/Polyhedron/membytes1.cc
+	  (1.5), tests/Polyhedron/membytes2.cc (1.4),
+	  tests/Polyhedron/memory1.cc (1.6), tests/Polyhedron/memory2.cc
+	  (1.9), tests/Polyhedron/minconstraints1.cc (1.4),
+	  tests/Polyhedron/minconstraints2.cc (1.5),
+	  tests/Polyhedron/minconstraints3.cc (1.4),
+	  tests/Polyhedron/minconstraints4.cc (1.4),
+	  tests/Polyhedron/mingenerators1.cc (1.4),
+	  tests/Polyhedron/mingenerators2.cc (1.5),
+	  tests/Polyhedron/mingenerators3.cc (1.4),
+	  tests/Polyhedron/onepoint.cc (1.5), tests/Polyhedron/permute.cc
+	  (1.4), tests/Polyhedron/polydifference1.cc (1.4),
+	  tests/Polyhedron/polydifference2.cc (1.4),
+	  tests/Polyhedron/polydifference3.cc (1.4),
+	  tests/Polyhedron/polydifference4.cc (1.5),
+	  tests/Polyhedron/polydifference5.cc (1.4),
+	  tests/Polyhedron/polydifference6.cc (1.4),
+	  tests/Polyhedron/polydifference7.cc (1.5),
+	  tests/Polyhedron/polydifference8.cc (1.4),
+	  tests/Polyhedron/polydifference9.cc (1.5),
+	  tests/Polyhedron/polyhull1.cc (1.4),
+	  tests/Polyhedron/polyhull10.cc (1.4),
+	  tests/Polyhedron/polyhull11.cc (1.4),
+	  tests/Polyhedron/polyhull2.cc (1.5),
+	  tests/Polyhedron/polyhull3.cc (1.5),
+	  tests/Polyhedron/polyhull4.cc (1.4),
+	  tests/Polyhedron/polyhull5.cc (1.5),
+	  tests/Polyhedron/polyhull6.cc (1.4),
+	  tests/Polyhedron/polyhull7.cc (1.4),
+	  tests/Polyhedron/polyhull8.cc (1.5),
+	  tests/Polyhedron/polyhull9.cc (1.5),
+	  tests/Polyhedron/polypowerset1.cc (1.4),
+	  tests/Polyhedron/randphull1.cc (1.5),
+	  tests/Polyhedron/randphull2.cc (1.6),
+	  tests/Polyhedron/relations1.cc (1.4),
+	  tests/Polyhedron/relations10.cc (1.4),
+	  tests/Polyhedron/relations11.cc (1.4),
+	  tests/Polyhedron/relations12.cc (1.4),
+	  tests/Polyhedron/relations13.cc (1.4),
+	  tests/Polyhedron/relations14.cc (1.4),
+	  tests/Polyhedron/relations15.cc (1.4),
+	  tests/Polyhedron/relations16.cc (1.4),
+	  tests/Polyhedron/relations17.cc (1.5),
+	  tests/Polyhedron/relations18.cc (1.4),
+	  tests/Polyhedron/relations19.cc (1.5),
+	  tests/Polyhedron/relations2.cc (1.5),
+	  tests/Polyhedron/relations3.cc (1.4),
+	  tests/Polyhedron/relations4.cc (1.4),
+	  tests/Polyhedron/relations5.cc (1.4),
+	  tests/Polyhedron/relations6.cc (1.5),
+	  tests/Polyhedron/relations7.cc (1.4),
+	  tests/Polyhedron/relations8.cc (1.4),
+	  tests/Polyhedron/relations9.cc (1.4),
+	  tests/Polyhedron/removespacedims1.cc (1.4),
+	  tests/Polyhedron/removespacedims10.cc (1.5),
+	  tests/Polyhedron/removespacedims2.cc (1.4),
+	  tests/Polyhedron/removespacedims3.cc (1.5),
+	  tests/Polyhedron/removespacedims4.cc (1.4),
+	  tests/Polyhedron/removespacedims5.cc (1.5),
+	  tests/Polyhedron/removespacedims6.cc (1.4),
+	  tests/Polyhedron/removespacedims7.cc (1.4),
+	  tests/Polyhedron/removespacedims8.cc (1.4),
+	  tests/Polyhedron/removespacedims9.cc (1.4),
+	  tests/Polyhedron/smm1.cc (1.4), tests/Polyhedron/timeelapse1.cc
+	  (1.4), tests/Polyhedron/timeelapse2.cc (1.5),
+	  tests/Polyhedron/timeelapse3.cc (1.4),
+	  tests/Polyhedron/timeelapse4.cc (1.4),
+	  tests/Polyhedron/timeelapse5.cc (1.5),
+	  tests/Polyhedron/timeelapse6.cc (1.4),
+	  tests/Polyhedron/timeelapse7.cc (1.5),
+	  tests/Polyhedron/timeelapse8.cc (1.5),
+	  tests/Polyhedron/timeelapse9.cc (1.5),
+	  tests/Polyhedron/topclosed1.cc (1.5),
+	  tests/Polyhedron/topclosed2.cc (1.5),
+	  tests/Polyhedron/topclosed3.cc (1.4),
+	  tests/Polyhedron/topclosure1.cc (1.4),
+	  tests/Polyhedron/topclosure2.cc (1.5),
+	  tests/Polyhedron/topclosure3.cc (1.4),
+	  tests/Polyhedron/topclosure4.cc (1.5),
+	  tests/Polyhedron/universe1.cc (1.4),
+	  tests/Polyhedron/universe2.cc (1.4),
+	  tests/Polyhedron/universe3.cc (1.4),
+	  tests/Polyhedron/universe4.cc (1.4),
+	  tests/Polyhedron/universe5.cc (1.4),
+	  tests/Polyhedron/universe6.cc (1.4),
+	  tests/Polyhedron/universe7.cc (1.4),
+	  tests/Polyhedron/watchdog1.cc (1.5),
+	  tests/Polyhedron/writeconsys1.cc (1.4),
+	  tests/Polyhedron/writegensys1.cc (1.4),
+	  tests/Polyhedron/writegensys2.cc (1.5),
+	  tests/Polyhedron/writegensys3.cc (1.4),
+	  tests/Polyhedron/writepolyhedron1.cc (1.4),
+	  tests/Polyhedron/writepolyhedron2.cc (1.4),
+	  tests/Polyhedron/writepolyhedron3.cc (1.4),
+	  tests/Polyhedron/writerelation1.cc (1.4),
+	  tests/Polyhedron/writevariable1.cc (1.4), utils/Makefile.am
+	  (1.3), utils/text2cxxarray (1.2), utils/timings.cc (1.4),
+	  utils/timings.hh (1.3): Address of the Free Software Foundation
+	  updated.
+
+2005-08-21 Sunday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.6): The --libs option has been removed
+	  (could not assign a decent semantics to it).
+
+2005-08-21 Sunday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.5): Completed the work announced in the
+	  previous commit.
+
+2005-08-21 Sunday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.4): Implemented the --interface option.
+	  Keywords are now case-insensitive.
+
+2005-08-21 Sunday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.3): Added the --coefficients option.
+
+2005-08-21 Sunday 01:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc.in (1.2): Several improvements and new options.
+
+2005-08-20 Saturday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.168), src/Makefile.am (1.114), src/ppl-config.cc
+	  (1.6), src/ppl-config.cc.in (1.1): A new implementation technique
+	  for `ppl-config' allows to deal with package relocations.
+
+2005-08-20 Saturday 00:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc (1.5): New option --banner.
+
+2005-08-20 Saturday 00:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc (1.4): Output format `raw' renamed `plain'.
+	  New output format `makefile'.
+
+2005-08-19 Friday 23:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.113), ppl-config.cc (1.3): Added support for
+	  the --prefix and the --exec-prefix options.
+
+2005-08-19 Friday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.167): Version number bumped.
+
+2005-08-19 Friday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl-config.cc (1.2): Added an option to print the `configure'
+	  options.
+
+2005-08-19 Friday 13:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.166): Keep track of the options with which
+	  `configure' was invoked.
+
+2005-08-19 Friday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.112), ppl-config.cc (1.1): The ppl-config
+	  program allows to enquire about the configuration of the PPL and
+	  of the applications using it.
+
+2005-08-19 Friday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* utils/text2cxxarray (1.1): Convert an ASCII text into the
+	  declaration of a C++ array.
+
+2005-08-18 Thursday 20:49  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, timeelapse1.cc (grids.[24,1]): Add
+	  timeelapse1.
+
+2005-08-18 Thursday 20:45  Matthew Mundell
+
+	* src/Grid_public.cc (grids.51): Enable method time_elapse_assign.
+
+2005-08-18 Thursday 20:44  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.25): Improve temporary comment.
+
+2005-08-18 Thursday 15:34  Matthew Mundell
+
+	* src/Grid_public.cc (grids.50): Check for points before adding
+	  lines in generalized_affine_image(lhs,rhs,m).
+
+2005-08-18 Thursday 15:24  Matthew Mundell
+
+	* tests/Grid/griddifference1.cc (grids.3): Add test11, in which
+	  many 2-complements are added to the result.
+
+2005-08-18 Thursday 12:59  Matthew Mundell
+
+	* tests/Grid/griddifference1.cc (grids.2): Add test10.
+
+2005-08-18 Thursday 12:21  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, generalizedaffinepreimage1.cc,
+	  generalizedaffinepreimage2.cc (grids.[23,1,1]): Add partial tests
+	  generalizedaffinepreimage1 and generalizedaffinepreimage2.
+
+2005-08-18 Thursday 12:18  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[35,49]): Add the
+	  generalized_affine_preimage methods.
+
+2005-08-18 Thursday 12:16  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.19): Add a comment.
+
+2005-08-18 Thursday 12:15  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.14): Declare Linear_Expression a
+	  friend.
+
+2005-08-17 Wednesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.50): Added
+	  -I$(SWI_PROLOG_INCLUDE_DIRECTORY) to AM_CPPFLAGS.
+
+2005-08-17 Wednesday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.165): Use AC_CHECK_SWI_PROLOG to perform the
+	  checks for SWI Prolog.
+
+2005-08-17 Wednesday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_swi_prolog.m4 (1.1): The new AC_CHECK_SWI_PROLOG
+	  function performs check for SWI Prolog by invoking the SWI-Prolog
+	  executable with `-dump-runtime-variables' option and interpreting
+	  the results.
+
+2005-08-17 Wednesday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.24): Added
+	  boundedaffinepreimage2, generalizedaffinepreimage3,
+	  nnc_boundedaffinepreimage2 and nnc_generalizedaffinepreimage3 to
+	  XFAIL_WITH_INT8.
+
+2005-08-16 Tuesday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.49): Removed the "-goal
+	  main" options from the invocations of `plld'.
+
+2005-08-16 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.132): Stray \endcode
+	  fixed.  Formatting improvements.
+
+2005-08-16 Tuesday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PFunction.cc (1.6): Code formatting improved.
+
+2005-08-16 Tuesday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.157): Announced new methods for computing preimages.
+
+2005-08-16 Tuesday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.57): Corrected error in the
+	  implementation of generalized_affine_(pre)image.
+
+2005-08-16 Tuesday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.135), ppl_c.h.in (1.50): Interfaced
+	  new methods for computing affine preimages.
+
+2005-08-16 Tuesday 12:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.173): Had another try at explaining the
+	  shorthand notation for affine relations.
+
+2005-08-16 Tuesday 11:44  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, griddifference1.cc (grids.[22,1]): Add
+	  griddifference1.
+
+2005-08-16 Tuesday 11:43  Matthew Mundell
+
+	* tests/: ppl_test.hh, print.hh (grids.[10,4]): Move dump_grids to
+	  print.hh.  Abort if the comparison in find_variation_template
+	  fails.
+
+2005-08-16 Tuesday 11:41  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_nonpublic.cc, Grid_public.cc
+	  (grids.[34,24,48]): Enable grid_difference_assign.  Add and
+	  improve a few comments.  Take out some old Polyhedron code.
+
+2005-08-16 Tuesday 11:39  Matthew Mundell
+
+	* src/: Linear_Expression.cc, Linear_Expression.defs.hh
+	  (grids.[1,3]): Add constructor Linear_Expression(cg).
+
+2005-08-16 Tuesday 10:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.23), affinepreimage11.cc (1.1),
+	  boundedaffineimage3.cc (1.1), boundedaffinepreimage1.cc (1.1),
+	  boundedaffinepreimage2.cc (1.1), boundedaffinepreimage3.cc (1.1),
+	  generalizedaffinepreimage1.cc (1.1),
+	  generalizedaffinepreimage2.cc (1.1),
+	  generalizedaffinepreimage3.cc (1.1),
+	  generalizedaffinepreimage4.cc (1.1): Added tests for new methods
+	  computing preimages of polyhedra.
+
+2005-08-16 Tuesday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.273), Polyhedron_public.cc (1.56):
+	  Added methods generalized_affine_preimage() and
+	  bounded_affine_preimage().  A few improvements also in other
+	  affine images and preimages methods.
+
+2005-08-16 Tuesday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.114): In map_space_dimensions,
+	  temporary constant declared const.
+
+2005-08-16 Tuesday 10:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.81): Remove spurious space.
+
+2005-08-16 Tuesday 10:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.7): Avoid a too long line.
+
+2005-08-15 Monday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.20), src/BD_Shape.inlines.hh (1.51),
+	  src/Checked_Number.defs.hh (1.29), src/DB_Row.inlines.hh (1.6),
+	  tests/ppl_test.hh (1.23): Old kludges removed.
+
+2005-08-15 Monday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.48): Use the "-goal main"
+	  option of `plld' instead of the more verbose (and obscure)
+	  "-pl-options,-g,main".
+
+2005-08-15 Monday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/bug2.cc (1.2): Be more verbose.
+
+2005-08-12 Friday 19:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.172), ppl.sty (1.19): Provided new
+	  description of affine transfer relations so as to also allow for
+	  preimages of (bounded or generalized) affine relations.
+
+2005-08-12 Friday 16:55  Matthew Mundell
+
+	* tests/Grid/generalizedaffineimage2.cc (grids.2): Add test22.
+
+2005-08-11 Thursday 17:29  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, generalizedaffineimage2.cc
+	  (grids.[21,1]): Add generalizedaffineimage2.
+
+2005-08-11 Thursday 17:27  Matthew Mundell
+
+	* tests/Grid/intersection2.cc (grids.3): Always call
+	  intersection_assign_and_minimize.  Only call find_variation after
+	  the operation.
+
+2005-08-11 Thursday 17:21  Matthew Mundell
+
+	* tests/Grid/intersection1.cc (grids.2): In test8 leave
+	  minimization to intersection_assign.
+
+2005-08-11 Thursday 17:20  Matthew Mundell
+
+	* src/Grid_public.cc (grids.47): In intersection_assign,
+	  add_recycled_congruences_and_minimize and
+	  add_recycled_congruences correct the sense of the test for
+	  emptiness.
+
+	  Enable generalized_affine_image(lhs,rhs,modulus).
+
+2005-08-11 Thursday 17:18  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.33): Improve some descriptions.
+
+2005-08-09 Tuesday 16:37  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.7): Correct comment.
+
+2005-08-09 Tuesday 16:36  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.32): Markup parameters in the
+	  construct(gs,convert_rays_to_lines) description.
+
+2005-08-09 Tuesday 16:29  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.6): Add test9, which tests a
+	  minimized grid in which the point contains factors and the
+	  divisor is greater than one.	Dump the grids on failure.
+
+2005-08-09 Tuesday 16:27  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc
+	  (grids.[31,11,23]): Add a convert_rays_to_line parameter to
+	  Grid(gs) and construct(gs).
+
+	  In map_space_dimensions, when the number of dimensions changes:
+
+	    - ensure that points and rays remain constant under the
+	  generator
+	      normalization that occurs when the points and rays are
+	  created
+
+	    - skip converting rays to lines when creating the temporary new
+	      grid.
+
+2005-08-08 Monday 20:01  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, generalizedaffineimage1.cc
+	  (grids.[20,1]): Add generalizedaffineimage1.
+
+2005-08-08 Monday 19:59  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[30,46]): Declare the
+	  generalized_affine_image methods.  Enable method
+	  generalized_affine_image(var,expr,denom,mod).  Clean some
+	  formatting.  Note where comments mention rays.
+
+2005-08-08 Monday 19:54  Matthew Mundell
+
+	* src/Generator_System.cc (grids.10): Call
+	  remove_invalid_lines_and_rays when grid is true.
+
+2005-08-03 Wednesday 20:36  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, foldspacedims1.cc (grids.[19,1]): Add
+	  foldspacedims1.
+
+2005-08-03 Wednesday 20:35  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.5): Add test6 and test7, in which the
+	  generators are initially out of date.
+
+2005-08-03 Wednesday 20:33  Matthew Mundell
+
+	* src/: Grid_chdims.cc, Grid_public.cc (grids.[14,45]): Enable
+	  fold_space_dimensions.  Invert the empty tests after updating in
+	  join_assign.
+
+2005-08-02 Tuesday 19:43  Matthew Mundell
+
+	* tests/Grid/affineimage1.cc (grids.2): Format linear expressions
+	  consistently.
+
+2005-08-02 Tuesday 19:42  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, affinepreimage1.cc (grids.[18,1]): Add
+	  affinepreimage1.
+
+2005-08-02 Tuesday 19:41  Matthew Mundell
+
+	* src/Grid_public.cc (grids.44): Enable affine_preimage.
+
+2005-08-01 Monday 18:32  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, affineimage1.cc (grids.[17,1]): Add
+	  affineimage1.
+
+2005-08-01 Monday 18:31  Matthew Mundell
+
+	* src/: Linear_Row.cc, Linear_Row.defs.hh (grids.[3,3]): Add method
+	  ascii_dump().
+
+2005-08-01 Monday 18:30  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.22): In normalize_divisors(sys,
+	  divisor) only set the divisor for points.
+
+2005-08-01 Monday 18:28  Matthew Mundell
+
+	* src/: Congruence_System.cc, Generator.cc, Generator.defs.hh,
+	  Generator_System.cc, Generator_System.defs.hh, Grid_public.cc,
+	  Linear_Expression.defs.hh (grids.[18,2,5,9,3,43,2]): Enable
+	  Congruence_System::affine_preimage and Grid::affine_image.
+
+	  Add parameter check_normalization to Generator::OK, which
+	  determines if normalization is checked.  Add parameter
+	  check_normalization to Generator_System methods OK and insert,
+	  which is passed through to Generator::OK.  Skip the normalization
+	  checks for the Grid generator system.
+
+	  Add parameter grid to Generator_System::affine_image, which
+	  determines if strong_normalize and remove_invalid_lines_and_rays
+	  are called.
+
+	  In add_generator normalize the generator's divisor after the
+	  generator is inserted.
+
+	  Declare Grid and Congruence_System friends of Linear_Expression.
+
+2005-07-27 Wednesday 13:18  Matthew Mundell
+
+	* tests/Grid/relations2.cc (grids.2): Add test4 to test8.
+
+2005-07-27 Wednesday 13:17  Matthew Mundell
+
+	* src/Grid_public.cc (grids.42): Update relation_with(cg) to handle
+	  any grid representation, instead of requiring a minimized
+	  representation.
+
+2005-07-24 Sunday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.22): Added boundedaffineimage2
+	  and nnc_boundedaffineimage2 to XFAIL_WITH_INT8.
+
+2005-07-20 Wednesday 09:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.131):    Corrected
+	  documentation for the Prolog interface where the specifications
+	     for the predicates ppl_Polyhedron_contains_Polyhedron/2 and
+	     ppl_Polyhedron_strictly_contains_Polyhedron/2 referred to
+	  their arguments
+	     the wrong way round.
+
+2005-07-14 Thursday 20:53  Matthew Mundell
+
+	* tests/Grid/expandspacedim1.cc (grids.2): Indent the copyright
+	  line.
+
+2005-07-14 Thursday 20:52  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, relations1.cc, relations2.cc
+	  (grids.[16,1,1]): Add relations1 and relations2.
+
+2005-07-14 Thursday 20:51  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_public.cc
+	  (grids.[29,13,41]): Enable and convert relation_with(cg) and
+	  relation_with(g), adding an optional divisor argument to
+	  relations_with(g).
+
+2005-07-14 Thursday 20:47  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[17,12]): Add method insert_verbatim.
+
+2005-07-13 Wednesday 14:58  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, expandspacedim1.cc (grids.[15,1]): Add
+	  expandspacedim1.
+
+2005-07-13 Wednesday 14:56  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.12): Enable and convert
+	  expand_space_dimension.
+
+2005-07-12 Tuesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/boundedaffineimage1.cc (1.2): Corrected a typo
+	  in the expected result.
+
+2005-07-12 Tuesday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.156): Announced new method
+	  Polyhedron::bounded_affine_image().
+
+2005-07-12 Tuesday 15:47  Matthew Mundell
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[18,14]): Dump grids on
+	  failure.  Only use find_variation for the grid under test.
+	  Insert test9 to test12, test14 and test22, from the revised
+	  Chiara tests.
+
+2005-07-12 Tuesday 15:44  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.9): Add macro dump_grids.
+
+2005-07-12 Tuesday 13:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.171), interfaces/C/ppl_c.cc (1.134),
+	  interfaces/C/ppl_c.h.in (1.49),
+	  interfaces/Prolog/Prolog_interface.dox (1.130),
+	  interfaces/Prolog/ppl_prolog.icc (1.156),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.11),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.79),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.51),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.75),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.99),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.38),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.66),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.16),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.91), src/Polyhedron.defs.hh
+	  (1.272), src/Polyhedron_public.cc (1.55),
+	  tests/Polyhedron/Makefile.am (1.21),
+	  tests/Polyhedron/boundedaffineimage1.cc (1.1),
+	  tests/Polyhedron/boundedaffineimage2.cc (1.1),
+	  tests/Polyhedron/exceptions1.cc (1.5): The new method
+	  Polyhedron::affine_bounds() renamed as
+	  Polyhedron::bounded_affine_image(), added to all available
+	  interfaces and documented. Added a few tests on its C++ version
+	  (no test added yet for Prolog).
+
+2005-07-12 Tuesday 12:49  Matthew Mundell
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[17,13]): Match tests to
+	  revised Chiara algorithm tests.
+
+2005-07-11 Monday 17:47  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
+	  (grids.[28,16,40]): Replace both add_and_minimize methods with
+	  code in each caller.
+
+2005-07-11 Monday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.5), config.guess (1.30), config.sub (1.29), depcomp
+	  (1.10), mkinstalldirs (1.9), missing (1.10), Watchdog/compile
+	  (1.5), Watchdog/config.guess (1.14), Watchdog/config.sub (1.14),
+	  Watchdog/depcomp (1.8), Watchdog/missing (1.6),
+	  Watchdog/mkinstalldirs (1.5): Updated from Automake 1.9.6.
+
+2005-07-08 Friday 20:02  Matthew Mundell
+
+	* tests/Grid/: Makefile.am, equals1.cc (grids.[14,1]): Add equals,
+	  which tests operator== and operator!=.
+
+2005-07-08 Friday 19:58  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.5): Correct test7 expected
+	  result.  Print test name from all tests.
+
+2005-07-08 Friday 19:57  Matthew Mundell
+
+	* tests/Grid/congruencesystem2.cc (grids.5): Add another line test,
+	  and some temporary comments.
+
+2005-07-08 Friday 19:56  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.8): Correct test3 expected
+	  result.
+
+2005-07-08 Friday 19:55  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.16): In satisfies_all_congruences
+	  compare the entire scalar product to zero when the generator is a
+	  line.
+
+2005-07-07 Thursday 16:41  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.4): Add test5, which requires divisor
+	  normalisation.  Call join_assign instead of
+	  join_assign_and_minimize in test4.
+
+2005-07-07 Thursday 16:39  Matthew Mundell
+
+	* src/Grid_public.cc (grids.39): Match the divisors of the two
+	  generator systems in join_assign.
+
+2005-07-06 Wednesday 20:21  Matthew Mundell
+
+	* tests/Grid/congruencesystem2.cc, tests/Grid/grid1.cc,
+	  tests/Grid/grid2.cc, tests/Grid/removespacedims1.cc,
+	  src/Congruence_System.cc, src/Congruence_System.defs.hh,
+	  src/Grid_nonpublic.cc, src/Grid_public.cc
+	  (grids.[4,16,12,4,15,11,21,38]): Normalize divisors after
+	  converting from rays to lines.  Use the system-wide divisor to
+	  calculate the factor used when normalizing parameters.  In
+	  satisfies_all_congruences multiply the modulus by the divisor to
+	  account for the divisor when comparing parameters.
+
+	  Correct Chiara function names in grid1.cc comments.  Correct the
+	  expected results in grid1.cc test13 and test14, grid2.cc test2
+	  and test10 and removespacedims1.cc test1.  Insert test16 (from
+	  the chiara water monitor example) into grid1.cc.
+
+2005-07-06 Wednesday 19:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.155): Mentioned the bug corrected in
+	  generalized_affine_image() and the renaming of enumeration
+	  Degenerate_Element.
+
+2005-07-06 Wednesday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.147): Degenerate_Kind is now named Degenerate_Element and
+	  placed outside of class Polyhedron. Namespaces are documented in
+	  namespaces.hh.
+
+2005-07-06 Wednesday 17:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.155): No longer using
+	  Degenerate_Kind.
+
+2005-07-06 Wednesday 17:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.133): Do use Degenerate_Element instead
+	  of Degenerate_Kind.
+
+2005-07-06 Wednesday 17:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.55),
+	  devref-print.doxyconf-latex.in (1.55), devref.doxyconf-html.in
+	  (1.55): Also include namespaces.hh.
+
+2005-07-06 Wednesday 17:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: BD_Shape/addspacedims3.cc (1.5),
+	  BD_Shape/addspacedims4.cc (1.5), BD_Shape/addspacedims5.cc (1.5),
+	  BD_Shape/addspacedims6.cc (1.5), BD_Shape/addspacedims7.cc (1.4),
+	  BD_Shape/cc76extrapolation4.cc (1.4), BD_Shape/cc76narrowing4.cc
+	  (1.4), BD_Shape/cc76narrowing5.cc (1.4),
+	  BD_Shape/ch78widening2.cc (1.4), BD_Shape/ch78widening5.cc (1.4),
+	  BD_Shape/concatenate2.cc (1.4), BD_Shape/concatenate5.cc (1.4),
+	  BD_Shape/constraints1.cc (1.5), BD_Shape/contains2.cc (1.5),
+	  BD_Shape/contains3.cc (1.5), BD_Shape/equality1.cc (1.5),
+	  BD_Shape/fromgensys1.cc (1.3),
+	  BD_Shape/generalizedaffineimage14.cc (1.4),
+	  BD_Shape/generalizedaffineimage3.cc (1.5),
+	  BD_Shape/intersection4.cc (1.5), BD_Shape/intersection5.cc (1.5),
+	  BD_Shape/limitedCC76extrapolation2.cc (1.4),
+	  BD_Shape/limitedCC76extrapolation3.cc (1.4),
+	  BD_Shape/mapspacedims2.cc (1.4), BD_Shape/polydifference1.cc
+	  (1.5), BD_Shape/polydifference5.cc (1.4), BD_Shape/relations1.cc
+	  (1.5), BD_Shape/relations5.cc (1.5), BD_Shape/removespacedims2.cc
+	  (1.4), BD_Shape/removespacedims3.cc (1.4),
+	  BD_Shape/timeelapse1.cc (1.4), BD_Shape/timeelapse5.cc (1.4),
+	  BD_Shape/writebdshape2.cc (1.2), Polyhedron/addconstraint2.cc
+	  (1.4), Polyhedron/addconstraints1.cc (1.4),
+	  Polyhedron/addconstraints10.cc (1.4),
+	  Polyhedron/addconstraints13.cc (1.4),
+	  Polyhedron/addconstraints3.cc (1.4),
+	  Polyhedron/addconstraints5.cc (1.4),
+	  Polyhedron/addconstraints7.cc (1.4),
+	  Polyhedron/addconstraints8.cc (1.4), Polyhedron/addgenerator1.cc
+	  (1.4), Polyhedron/addgenerator2.cc (1.4),
+	  Polyhedron/addgenerator4.cc (1.4), Polyhedron/addgenerator5.cc
+	  (1.4), Polyhedron/addgenerators1.cc (1.4),
+	  Polyhedron/addgenerators10.cc (1.4),
+	  Polyhedron/addgenerators11.cc (1.4),
+	  Polyhedron/addgenerators12.cc (1.4),
+	  Polyhedron/addgenerators13.cc (1.4), Polyhedron/addgenerators2.cc
+	  (1.4), Polyhedron/addgenerators6.cc (1.4),
+	  Polyhedron/addgenerators8.cc (1.4), Polyhedron/addspacedims1.cc
+	  (1.4), Polyhedron/addspacedims2.cc (1.4),
+	  Polyhedron/addspacedims3.cc (1.4), Polyhedron/addspacedims8.cc
+	  (1.4), Polyhedron/affineimage1.cc (1.4),
+	  Polyhedron/affineimage4.cc (1.4), Polyhedron/affineimage5.cc
+	  (1.4), Polyhedron/affineimage6.cc (1.4),
+	  Polyhedron/affinepreimage3.cc (1.4),
+	  Polyhedron/affinepreimage8.cc (1.4),
+	  Polyhedron/ascii_dump_load6.cc (1.4),
+	  Polyhedron/bgp99extrapolation1.cc (1.4),
+	  Polyhedron/bgp99extrapolation2.cc (1.4),
+	  Polyhedron/bhrz03widening10.cc (1.4),
+	  Polyhedron/bhrz03widening15.cc (1.4),
+	  Polyhedron/bhz03widening1.cc (1.4), Polyhedron/bhz03widening2.cc
+	  (1.4), Polyhedron/bhz03widening3.cc (1.4),
+	  Polyhedron/bhz03widening4.cc (1.4), Polyhedron/bhz03widening5.cc
+	  (1.4), Polyhedron/bhz03widening6.cc (1.4), Polyhedron/bounded1.cc
+	  (1.4), Polyhedron/boundedbhrz03extrapolation1.cc (1.2),
+	  Polyhedron/boundingbox1.cc (1.4), Polyhedron/boundingbox2.cc
+	  (1.4), Polyhedron/boundingbox3.cc (1.4),
+	  Polyhedron/boundingbox4.cc (1.4), Polyhedron/boundingbox5.cc
+	  (1.4), Polyhedron/bounds1.cc (1.4), Polyhedron/concatenate2.cc
+	  (1.4), Polyhedron/concatenate6.cc (1.4),
+	  Polyhedron/concatenate7.cc (1.2), Polyhedron/constraints2.cc
+	  (1.4), Polyhedron/constraints4.cc (1.4), Polyhedron/disjoint2.cc
+	  (1.4), Polyhedron/disjoint3.cc (1.4), Polyhedron/empty1.cc (1.4),
+	  Polyhedron/exceptions1.cc (1.4), Polyhedron/exceptions2.cc (1.4),
+	  Polyhedron/exceptions3.cc (1.5), Polyhedron/expandspacedim1.cc
+	  (1.4), Polyhedron/expandspacedim2.cc (1.4),
+	  Polyhedron/foldspacedims1.cc (1.4), Polyhedron/foldspacedims2.cc
+	  (1.4), Polyhedron/generalizedaffineimage1.cc (1.4),
+	  Polyhedron/generalizedaffineimage11.cc (1.4),
+	  Polyhedron/generalizedaffineimage13.cc (1.2),
+	  Polyhedron/generalizedaffineimage14.cc (1.2),
+	  Polyhedron/generalizedaffineimage2.cc (1.4),
+	  Polyhedron/generalizedaffineimage3.cc (1.4),
+	  Polyhedron/generalizedaffineimage4.cc (1.4),
+	  Polyhedron/generalizedaffineimage6.cc (1.4),
+	  Polyhedron/generalizedaffineimage7.cc (1.4),
+	  Polyhedron/generators3.cc (1.4), Polyhedron/generators4.cc (1.4),
+	  Polyhedron/generators6.cc (1.4), Polyhedron/generators7.cc (1.3),
+	  Polyhedron/geomcovers1.cc (1.4), Polyhedron/h79widening5.cc
+	  (1.4), Polyhedron/intersection10.cc (1.4),
+	  Polyhedron/intersection11.cc (1.4), Polyhedron/intersection4.cc
+	  (1.4), Polyhedron/intersection5.cc (1.4),
+	  Polyhedron/intersection6.cc (1.4), Polyhedron/intersection8.cc
+	  (1.4), Polyhedron/intersection9.cc (1.4),
+	  Polyhedron/limitedh79extrapolation4.cc (1.4),
+	  Polyhedron/linearpartition4.cc (1.4), Polyhedron/mapspacedims1.cc
+	  (1.4), Polyhedron/mc91.cc (1.4), Polyhedron/membytes1.cc (1.4),
+	  Polyhedron/minconstraints2.cc (1.4), Polyhedron/mingenerators2.cc
+	  (1.4), Polyhedron/onepoint.cc (1.4),
+	  Polyhedron/polydifference4.cc (1.4),
+	  Polyhedron/polydifference7.cc (1.4),
+	  Polyhedron/polydifference9.cc (1.4), Polyhedron/polyhull2.cc
+	  (1.4), Polyhedron/polyhull3.cc (1.4), Polyhedron/polyhull5.cc
+	  (1.4), Polyhedron/polyhull8.cc (1.4), Polyhedron/polyhull9.cc
+	  (1.4), Polyhedron/polypowerset1.cc (1.3),
+	  Polyhedron/randphull1.cc (1.4), Polyhedron/randphull2.cc (1.5),
+	  Polyhedron/relations17.cc (1.4), Polyhedron/relations19.cc (1.4),
+	  Polyhedron/relations2.cc (1.4), Polyhedron/relations6.cc (1.4),
+	  Polyhedron/removespacedims10.cc (1.4),
+	  Polyhedron/removespacedims3.cc (1.4),
+	  Polyhedron/removespacedims5.cc (1.4), Polyhedron/timeelapse2.cc
+	  (1.4), Polyhedron/timeelapse5.cc (1.4), Polyhedron/timeelapse7.cc
+	  (1.4), Polyhedron/timeelapse8.cc (1.4), Polyhedron/timeelapse9.cc
+	  (1.4), Polyhedron/topclosed1.cc (1.4), Polyhedron/topclosed2.cc
+	  (1.4), Polyhedron/topclosure2.cc (1.4), Polyhedron/topclosure4.cc
+	  (1.4), Polyhedron/writegensys2.cc (1.4): Using Degenerate_Element
+	  instead of Polyhedron::Degenerate_Kind.
+
+2005-07-06 Wednesday 17:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.19), BD_Shape.inlines.hh (1.50),
+	  C_Polyhedron.defs.hh (1.32), C_Polyhedron.inlines.hh (1.25),
+	  Determinate.defs.hh (1.54), Determinate.inlines.hh (1.47),
+	  Makefile.am (1.111), NNC_Polyhedron.defs.hh (1.34),
+	  NNC_Polyhedron.inlines.hh (1.28), Polyhedra_Powerset.defs.hh
+	  (1.15), Polyhedra_Powerset.inlines.hh (1.19), Polyhedron.defs.hh
+	  (1.271), Polyhedron.types.hh (1.15), Polyhedron_nonpublic.cc
+	  (1.47), algorithms.hh (1.40), globals.defs.hh (1.20),
+	  namespaces.hh (1.1): Doxygen documentation for namespaces moved
+	  into namespaces.hh.  Polyhedron::Degenerate_Kind renamed as
+	  Degenerate_Element and moved outside of class Polyhedron in
+	  globals.hh.
+
+2005-07-06 Wednesday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.5), utils/timings.cc (1.3):
+	  <sys/resource.h> should always be included after <time.h> and
+	  <sys/time.h> so as to make sure we have the definitions for,
+	  e.g., `ru_utime'.
+
+2005-07-06 Wednesday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.54),
+	  devref-print.doxyconf-latex.in (1.54), devref.doxyconf-html.in
+	  (1.54), user-browse.doxyconf-latex.in (1.25),
+	  user-print.doxyconf-latex.in (1.25), user.doxyconf-html.in
+	  (1.27): Changed so as to reflect the fact that macro __P has been
+	  renamed PPL_PROTO.
+
+2005-07-06 Wednesday 10:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.22): Minor typo correction.
+
+2005-07-06 Wednesday 10:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.146), src/Powerset.defs.hh (1.12): One item in the huge
+	  list has gone.
+
+2005-07-06 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README, TODO, build_header, config.guess,
+	  config.sub, configure.ac, install-sh, ltmain.sh, ppl.spec.in,
+	  Watchdog/Handler.defs.hh, Watchdog/Handler.inlines.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/install-sh, Watchdog/ltmain.sh,
+	  debian/.cvsignore, debian/changelog, debian/compat,
+	  debian/control, debian/libppl-c.dirs, debian/libppl-c.install,
+	  debian/libppl-c.links, debian/libppl-dev.dirs,
+	  debian/libppl-dev.doc-base, debian/libppl-dev.doc-base.user,
+	  debian/libppl-dev.docs, debian/libppl-dev.install,
+	  debian/libppl-dev.links, debian/libppl-gprolog.links,
+	  debian/libppl-pwl.copyright.in, debian/libppl-pwl.dirs,
+	  debian/libppl-pwl.docs, debian/libppl-pwl.install,
+	  debian/libppl-sicstus.links, debian/libppl-swi.links,
+	  debian/libppl-yap.links, debian/libppl.copyright.in,
+	  debian/libppl.dirs, debian/libppl.docs, debian/libppl.install,
+	  debian/rules, demos/ppl_lcdd/.cvsignore,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/README,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/definitions.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am, interfaces/Prolog/GNU/README,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/sp_pl_check.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/check_script,
+	  interfaces/Prolog/tests/check_script2,
+	  interfaces/Prolog/tests/check_script2_int8,
+	  interfaces/Prolog/tests/expected2_int16,
+	  interfaces/Prolog/tests/expected2_int16_a,
+	  interfaces/Prolog/tests/expected2_int32,
+	  interfaces/Prolog/tests/expected2_int32_a,
+	  interfaces/Prolog/tests/expected2_int64,
+	  interfaces/Prolog/tests/expected2_int64_a,
+	  interfaces/Prolog/tests/expected2_int8,
+	  interfaces/Prolog/tests/expected2_int8_a,
+	  interfaces/Prolog/tests/expected2_mpz,
+	  interfaces/Prolog/tests/expected2_mpz_a,
+	  interfaces/Prolog/tests/expected3_int16,
+	  interfaces/Prolog/tests/expected3_int16_a,
+	  interfaces/Prolog/tests/expected3_int32,
+	  interfaces/Prolog/tests/expected3_int32_a,
+	  interfaces/Prolog/tests/expected3_int64,
+	  interfaces/Prolog/tests/expected3_int64_a,
+	  interfaces/Prolog/tests/expected3_int8,
+	  interfaces/Prolog/tests/expected3_int8_a,
+	  interfaces/Prolog/tests/expected3_mpz,
+	  interfaces/Prolog/tests/expected3_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq2_int16,
+	  interfaces/Prolog/tests/expected_clpq2_int16_a,
+	  interfaces/Prolog/tests/expected_clpq2_int32,
+	  interfaces/Prolog/tests/expected_clpq2_int32_a,
+	  interfaces/Prolog/tests/expected_clpq2_int64,
+	  interfaces/Prolog/tests/expected_clpq2_int64_a,
+	  interfaces/Prolog/tests/expected_clpq2_int8,
+	  interfaces/Prolog/tests/expected_clpq2_int8_a,
+	  interfaces/Prolog/tests/expected_clpq2_mpz,
+	  interfaces/Prolog/tests/expected_clpq2_mpz_a,
+	  interfaces/Prolog/tests/expected_clpq_int16,
+	  interfaces/Prolog/tests/expected_clpq_int16_a,
+	  interfaces/Prolog/tests/expected_clpq_int32,
+	  interfaces/Prolog/tests/expected_clpq_int32_a,
+	  interfaces/Prolog/tests/expected_clpq_int64,
+	  interfaces/Prolog/tests/expected_clpq_int64_a,
+	  interfaces/Prolog/tests/expected_clpq_int8,
+	  interfaces/Prolog/tests/expected_clpq_int8_a,
+	  interfaces/Prolog/tests/expected_clpq_mpz,
+	  interfaces/Prolog/tests/expected_clpq_mpz_a,
+	  interfaces/Prolog/tests/expected_int16,
+	  interfaces/Prolog/tests/expected_int16_a,
+	  interfaces/Prolog/tests/expected_int32,
+	  interfaces/Prolog/tests/expected_int32_a,
+	  interfaces/Prolog/tests/expected_int64,
+	  interfaces/Prolog/tests/expected_int64_a,
+	  interfaces/Prolog/tests/expected_int8,
+	  interfaces/Prolog/tests/expected_int8_a,
+	  interfaces/Prolog/tests/expected_mpz,
+	  interfaces/Prolog/tests/expected_mpz_a,
+	  interfaces/Prolog/tests/expected_pchk_int16,
+	  interfaces/Prolog/tests/expected_pchk_int16_a,
+	  interfaces/Prolog/tests/expected_pchk_int32,
+	  interfaces/Prolog/tests/expected_pchk_int32_a,
+	  interfaces/Prolog/tests/expected_pchk_int64,
+	  interfaces/Prolog/tests/expected_pchk_int64_a,
+	  interfaces/Prolog/tests/expected_pchk_int8,
+	  interfaces/Prolog/tests/expected_pchk_int8_a,
+	  interfaces/Prolog/tests/expected_pchk_mpz,
+	  interfaces/Prolog/tests/expected_pchk_mpz_a,
+	  interfaces/Prolog/tests/script_clpq,
+	  interfaces/Prolog/tests/script_clpq2,
+	  interfaces/Prolog/tests/script_clpq2_int8, src/.cvsignore,
+	  src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/Bounding_Box.cc, src/Bounding_Box.defs.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh, src/DB_Row.defs.hh,
+	  src/E_Rational.inlines.hh, src/Float.defs.hh,
+	  src/Float.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Grid.defs.hh, src/Grid_Status.idefs.hh, src/Init.cc,
+	  src/Init.defs.hh, src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/Makefile.am, src/Ph_Status.idefs.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Result.defs.hh, src/Rounding.defs.hh,
+	  src/Rounding.inlines.hh, src/checked.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_ext.defs.hh,
+	  src/checked_ext.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/checked_numeric_limits.hh,
+	  src/fpu-c99.inlines.hh, src/fpu-ia32.inlines.hh,
+	  src/fpu-none.inlines.hh, src/fpu.defs.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/ppl_header.bottom, src/ppl_header.hh,
+	  src/ppl_header.middle, src/ppl_header.top, tests/BBox.cc,
+	  tests/BBox.hh, tests/PFunction.cc, tests/PFunction.hh,
+	  tests/ehandlers.hh, tests/files.hh, tests/ppl_test.hh,
+	  tests/print.cc, tests/print.hh, tests/BD_Shape/.cvsignore,
+	  tests/BD_Shape/Makefile.am, tests/BD_Shape/addspacedims1.cc,
+	  tests/BD_Shape/addspacedims2.cc, tests/BD_Shape/addspacedims3.cc,
+	  tests/BD_Shape/addspacedims4.cc, tests/BD_Shape/addspacedims5.cc,
+	  tests/BD_Shape/addspacedims6.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affineimage8.cc, tests/BD_Shape/affineimage9.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/affinepreimage5.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains2.cc,
+	  tests/BD_Shape/contains3.cc, tests/BD_Shape/empty3.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/fromgensys1.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage13.cc,
+	  tests/BD_Shape/generalizedaffineimage14.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/intersection3.cc, tests/BD_Shape/intersection4.cc,
+	  tests/BD_Shape/intersection5.cc, tests/BD_Shape/intersection6.cc,
+	  tests/BD_Shape/intersection7.cc, tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/polydifference1.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations5.cc, tests/BD_Shape/removespacedims1.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdiffs1.cc,
+	  tests/BD_Shape/writebdiffs2.cc, tests/BD_Shape/writebdshape1.cc,
+	  tests/BD_Shape/writebdshape2.cc, tests/Polyhedron/.cvsignore,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/affinetrans.cc,
+	  tests/Polyhedron/boundedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/bug2.cc, tests/Polyhedron/bug2.dat,
+	  tests/Polyhedron/concatenate7.cc,
+	  tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/generalizedaffineimage13.cc,
+	  tests/Polyhedron/generalizedaffineimage14.cc,
+	  tests/Polyhedron/randphull2.cc, tests/Polyhedron/watchdog1.cc
+	  (grids.[1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,4,27,2,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, [...]
+	  First merge from main trunk.
+
+2005-07-04 Monday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.54): Corrected symmetric bug on the
+	  other flavor of method Polyhedron::generalized_affine_inage().
+
+2005-07-04 Monday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.20),
+	  generalizedaffineimage14.cc (1.1): New test show symmetric bug on
+	  the other flavor of generalized_affine_image().
+
+2005-07-03 Sunday 23:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: Makefile.am (1.4), check_script2_int8
+	  (1.2), script_clpq2_int8 (1.1): Distribution fixed.
+
+2005-07-03 Sunday 23:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/script_clpq2_int8 (altnum.1): file
+	  script_clpq2_int8 was added on branch altnum on 2006-10-29
+	  19:27:09 +0000
+
+2005-07-03 Sunday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.37): Link against libYap.
+
+2005-07-03 Sunday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.129), XSB/Makefile.am
+	  (1.33), XSB/xsb_clpq.P (1.13), XSB/xsb_clpq2.P (1.11),
+	  XSB/xsb_pl_check.P (1.15): Updated to use new versions of XSB
+	  (older ones are too problematic).  Only XSB versions following
+	  2.7.1 and CVS HEAD versions starting from 2 July 2005 are now
+	  supported.
+
+2005-07-03 Sunday 23:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.36): Make the tests
+	  independent from one another.  Updated to use the new names of
+	  the test files.
+
+2005-07-03 Sunday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.145): We should not forget to update those bits of
+	  documentation that have proved to be not adequate.
+
+2005-07-03 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.46), gnu_pl_check.pl
+	  (1.5): Make the tests independent from one another.  Updated to
+	  use the new names of the test files.
+
+2005-07-03 Sunday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.52), sp_pl_check.pl
+	  (1.3): Make the tests independent from one another.  Updated to
+	  use the new names of the test files.
+
+2005-07-03 Sunday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.42): Make the tests
+	  independent from one another.  Updated to use the new names of
+	  the test files.
+
+2005-07-03 Sunday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.47), swi_pl_check.pl
+	  (1.4): Make the tests independent from one another.  Updated to
+	  use the new names of the test files.
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/: check_script (1.2), check_script2
+	  (1.2), expected2_int16 (1.5), expected2_int16_a (1.4),
+	  expected2_int32 (1.4), expected2_int32_a (1.3), expected2_int64
+	  (1.3), expected2_int64_a (1.3), expected2_int8 (1.3),
+	  expected2_int8_a (1.3), expected2_mpz (1.3), expected2_mpz_a
+	  (1.3), expected3_int16 (1.2), expected3_int16_a (1.2),
+	  expected3_int32 (1.2), expected3_int32_a (1.2), expected3_int64
+	  (1.3), expected3_int64_a (1.2), expected3_int8 (1.3),
+	  expected3_int8_a (1.2), expected3_mpz (1.2), expected3_mpz_a
+	  (1.2), expected_clpq2_int16 (1.1), expected_clpq2_int16_a (1.1),
+	  expected_clpq2_int32 (1.1), expected_clpq2_int32_a (1.1),
+	  expected_clpq2_int64 (1.1), expected_clpq2_int64_a (1.1),
+	  expected_clpq2_int8 (1.1), expected_clpq2_int8_a (1.1),
+	  expected_clpq2_mpz (1.1), expected_clpq2_mpz_a (1.1),
+	  expected_clpq_int16 (1.1), expected_clpq_int16_a (1.1),
+	  expected_clpq_int32 (1.1), expected_clpq_int32_a (1.1),
+	  expected_clpq_int64 (1.1), expected_clpq_int64_a (1.1),
+	  expected_clpq_int8 (1.1), expected_clpq_int8_a (1.1),
+	  expected_clpq_mpz (1.1), expected_clpq_mpz_a (1.1),
+	  expected_int16 (1.3), expected_int16_a (1.3), expected_int32
+	  (1.3), expected_int32_a (1.3), expected_int64 (1.3),
+	  expected_int64_a (1.3), expected_int8 (1.4), expected_int8_a
+	  (1.4), expected_mpz (1.3), expected_mpz_a (1.3),
+	  expected_pchk_int16 (1.1), expected_pchk_int16_a (1.1),
+	  expected_pchk_int32 (1.1), expected_pchk_int32_a (1.1),
+	  expected_pchk_int64 (1.1), expected_pchk_int64_a (1.1),
+	  expected_pchk_int8 (1.1), expected_pchk_int8_a (1.1),
+	  expected_pchk_mpz (1.1), expected_pchk_mpz_a (1.1), script_clpq
+	  (1.1), script_clpq2 (1.1): Use more sensible file names.
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_mpz (altnum.1): file
+	  expected_pchk_mpz was added on branch altnum on 2006-10-29
+	  19:27:08 +0000
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected_pchk_mpz_a (altnum.1): file
+	  expected_pchk_mpz_a was added on branch altnum on 2006-10-29
+	  19:27:08 +0000
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/script_clpq (altnum.1): file script_clpq
+	  was added on branch altnum on 2006-10-29 19:27:09 +0000
+
+2005-07-03 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/script_clpq2 (altnum.1): file
+	  script_clpq2 was added on branch altnum on 2006-10-29 19:27:09
+	  +0000
+
+2005-07-03 Sunday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.164): Version number bumped.
+
+2005-07-03 Sunday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.128), GNU/README
+	  (1.1): Specify how to obtain the only version of GNU Prolog that
+	  is known to work with the PPL's Prolog interface.
+
+2005-07-03 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.45): Always use $(CXX) to
+	  compile and link.
+
+2005-07-03 Sunday 10:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Polyhedron/Makefile.am (1.19), BD_Shape/Makefile.am
+	  (1.12): LDADD reordered so that libraries occur in dependence
+	  order (Cygwin seems to depend on this).
+
+2005-07-01 Friday 17:13  Matthew Mundell
+
+	* src/: Grid_public.cc, Grid.defs.hh, Grid_nonpublic.cc
+	  (grids.[37,26,20]): Add back normalizing of divisors.  Take out
+	  two temporary comments, and add one.	Take some old Polyhedron
+	  code out of add_recycled_generators_and_minimize.
+
+2005-06-30 Thursday 19:56  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_conversion.cc, Grid_simplify.cc,
+	  Row.inlines.hh (grids.[25,17,27,1]): Add strong reduction.  Use
+	  negate(x) instead of -x.  Slightly improve some comments.
+
+2005-06-27 Monday 13:15  Matthew Mundell
+
+	* tests/Grid/: addspacedims2.cc, removespacedims1.cc,
+	  removespacedims2.cc (grids.[4,3,3]): Correct known_gr.
+
+2005-06-27 Monday 13:12  Matthew Mundell
+
+	* src/: Generator_System.cc, Generator_System.defs.hh,
+	  Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc, Linear_Row.cc, Linear_Row.defs.hh,
+	  Linear_Row.inlines.hh, Congruence.cc, Congruence.defs.hh,
+	  Congruence.inlines.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Generator.defs.hh,
+	  Generator.inlines.hh
+	  (grids.[8,2,24,11,16,15,19,36,26,2,2,2,7,13,9,14,10,3,2]): Update
+	  to new treatment of virtual rows.  Add ascii_dump() methods to
+	  Congruence, Congruence_System and Generator_System.  Add macro
+	  print_dim_kinds to Grid.defs.hh.
+
+2005-06-22 Wednesday 12:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.53): Corrected the bug in
+	  Polyhedron::generalized_affine_image() that was shown by test
+	  generalizedaffineimage13.cc. We should actually check for
+	  emptyness before adding lines to the polyhedron.
+
+2005-06-22 Wednesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.18),
+	  generalizedaffineimage13.cc (1.1): Added a test program showing a
+	  bug in Polyhedron::generalized_affine_image().  The bug shows up
+	  (by throwing an exception) when the polyhedron is empty, but hte
+	  library hasn't yet detected emptyness.
+
+2005-06-21 Tuesday 18:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.270), Polyhedron_public.cc (1.52):
+	  Added new method Polyhedron::affine_bounds() to compute the
+	  effect of transfer functions providing upper and lower bound
+	  affine expressions for a dimension of the polyhedron.
+
+2005-06-18 Saturday 22:58  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.28), Checked_Number.inlines.hh
+	  (1.34), checked.defs.hh (1.20), checked_ext.inlines.hh (1.18),
+	  checked_float.inlines.hh (1.38), checked_int.inlines.hh (1.34),
+	  checked_mpq.inlines.hh (1.19), checked_mpz.inlines.hh (1.23):
+	  Added mul2exp and div2exp.
+
+2005-06-16 Thursday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.29): Typo fixed.
+
+2005-06-16 Thursday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.17), bug1.cc (1.2), bug1.dat
+	  (1.2), concatenate7.cc (1.1): Program `concatenate7' exhibits the
+	  same bug exhinited by `bug1'.
+
+2005-06-16 Thursday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.28): Corrected a bug in
+	  Polyhedron::concatenate_assign() whereby the produced result
+	  could have failed to satisfy the library invariants.
+
+2005-06-16 Thursday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.16), bug2.cc (1.1), bug2.dat
+	  (1.1): Program bug2.cc exhibits a misbehavior that, up to now,
+	  has only been observed on MacOs X.
+
+2005-06-16 Thursday 12:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.15), bug1.cc (1.1), bug1.dat
+	  (1.1): Program bug1.cc exhibits a bug in
+	  Polyhedron::concatenate_assign().
+
+2005-06-16 Thursday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.154): Colon added.
+
+2005-06-16 Thursday 11:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.153), src/Constraint.cc (1.50), src/Constraint.defs.hh
+	  (1.103), src/Generator.cc (1.61), src/Generator.defs.hh (1.104):
+	  New output operators in namespace IO_Operators: std::ostream&
+	  operator<<(std::ostream&, const Constraint::Type&) and
+	  std::ostream& operator<<(std::ostream&, const Generator::Type&).
+
+2005-06-16 Thursday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.132): FIXME dealt with.
+
+2005-06-16 Thursday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.49), Generator.cc (1.60): Avoid
+	  unnecessary qualification.
+
+2005-06-16 Thursday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/randphull2.cc (1.4): When NOISY, make noise in
+	  case of failure.
+
+2005-06-15 Wednesday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.41): Do not assume `.' is
+	  in the `PATH' environment variable.
+
+2005-06-14 Tuesday 15:22  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.7): Improve comment.
+
+2005-06-14 Tuesday 15:22  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.7): Print ASCII dump of a when loading
+	  it fails.
+
+2005-06-14 Tuesday 15:21  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_chdims.cc, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc (grids.[23,10,15,14,18,35,25]): Add enum
+	  Dimension_Kind and type Dimension_Kinds.  Add attribute
+	  dim_kinds, pass it to the minimize, simplify and conversion
+	  methods, and fill it in the simplify methods.  Add macro
+	  trace_dim_kinds.  Dump and load dim_kinds in ascii_load and
+	  ascii_dump.  Check dim_kinds in OK.  Adjust dim_kinds in
+	  add_space_dimensions*.
+
+	  Add ascii_dump(), which writes to cerr.
+
+2005-06-14 Tuesday 15:12  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.27), Checked_Number.inlines.hh
+	  (1.33), Rounding.defs.hh (1.12): Moved default rounding mode in
+	  policy. Removed bogus Checked_Pair trick.
+
+2005-06-14 Tuesday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.16): Do not refer to
+	  `option_index' if HAVE_GETOPT_H is undefined.
+
+2005-06-14 Tuesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BBox.hh (1.8): Avoid using directives in header files.
+
+2005-06-14 Tuesday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.49): Include "C_Polyhedron.defs.hh".
+
+2005-06-14 Tuesday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.9), BBox.hh (1.7), PFunction.cc (1.5),
+	  PFunction.hh (1.6), ehandlers.hh (1.11), files.hh (1.7),
+	  ppl_test.hh (1.22), print.cc (1.15), print.hh (1.19): Adjust
+	  inclusions so as to avoid multiple inclusion of ppl_install.hh.
+	  Besides speeding up the build, this works around a problem on
+	  Darwin.
+
+2005-06-14 Tuesday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/PFunction.hh (1.5): Multiple inclusion guard fixed.
+
+2005-06-14 Tuesday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.43): Fixes for systems that do not
+	  provide <getopt.h>.
+
+2005-06-14 Tuesday 09:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.15): Do not declare `option_index'
+	  when it is not needed.
+
+2005-06-14 Tuesday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BDS_Status.inlines.hh (1.4): Helper function get_field() is
+	  now declared inline.
+
+2005-06-14 Tuesday 07:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.14): Work also on systems that do
+	  not provide <getopt.h> and/or that do not provide a declaration
+	  for RLIMIT_AS.
+
+2005-06-14 Tuesday 07:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.163): Check also for the presence of
+	  <sys/time.h>.
+
+2005-06-14 Tuesday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.13), expected_int16 (1.3),
+	  expected_int16_a (1.3), expected_int32 (1.4), expected_int32_a
+	  (1.4), expected_int64 (1.4), expected_int64_a (1.4),
+	  expected_int8 (1.3), expected_int8_a (1.2), expected_mpz (1.4),
+	  expected_mpz_a (1.4): Do not use long options for testing, since
+	  they may be unavailable on some platforms.
+
+2005-06-13 Monday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.162): Version number bumped.
+
+2005-06-13 Monday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.152), interfaces/C/ppl_c.h.in (1.48): Do not infringe on
+	  system name space as well as on user name space.
+
+2005-06-10 Friday 18:33  Matthew Mundell
+
+	* src/Grid_public.cc (grids.34): Improve comment.
+
+2005-06-10 Friday 18:31  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.11): Add test14, which adds a
+	  congruence system having a row capacity larger than the row
+	  capacity of the grid's existing congruence system.
+
+2005-06-10 Friday 18:30  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.15): Take tracing out of test20.
+
+2005-06-10 Friday 18:26  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.13): Move bug1 to TESTS.
+
+2005-06-10 Friday 18:21  Matthew Mundell
+
+	* tests/Grid/bug1.cc (grids.2): Add header comment, use nout
+	  instead of cerr.
+
+2005-06-10 Friday 18:14  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.14): Improve comment.
+
+2005-06-10 Friday 18:05  Matthew Mundell
+
+	* src/Row.defs.hh (grids.3): Declare Congruence_System a friend
+	  when EXTRA_ROW_DEBUG.
+
+2005-06-10 Friday 18:01  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.24): In reduce_pc_with_pc add GCD
+	  tracing and use the ternary operator instead of !.
+
+2005-06-10 Friday 17:59  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.14): In generator to congruence
+	  conversion ensure that the resulting moduli and first element of
+	  the matrix are positive.
+
+2005-06-10 Friday 14:02  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.33): Avoided a warning.
+
+2005-06-10 Friday 11:16  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.23): In free_row in the congruence
+	  simplify, ensure that all the rows to have the same capacity.
+
+2005-06-10 Friday 11:13  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[13,9]): Add method add_row.
+
+2005-06-09 Thursday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/exceptions3.cc (1.4): Avoid a compiler warning.
+
+2005-06-09 Thursday 17:29  Matthew Mundell
+
+	* interfaces/Prolog/SWI/Makefile.am (grids.2): Revert last change.
+
+2005-06-09 Thursday 12:12  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_conversion.cc (grids.[22,13]): Move the
+	  grid multiplying code into two inline functions called
+	  multiply_grid.
+
+2005-06-08 Wednesday 17:00  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.13): Add test20, which constructs from
+	  a generator system containing a ray.
+
+2005-06-08 Wednesday 16:59  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.17): In method construct convert
+	  rays to lines.
+
+2005-06-08 Wednesday 16:58  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.9): Use a temporary variable in
+	  add_space_dimensions.
+
+2005-06-08 Wednesday 07:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: concatenate1.cc (1.4), contains2.cc (1.4),
+	  contains3.cc (1.4), empty3.cc (1.4), equality1.cc (1.4),
+	  exceptions1.cc (1.4), exceptions2.cc (1.4), intersection3.cc
+	  (1.4), intersection4.cc (1.4), intersection5.cc (1.4),
+	  intersection6.cc (1.4), intersection7.cc (1.4), intersection8.cc
+	  (1.4), mapspacedims4.cc (1.4), relations1.cc (1.4), relations2.cc
+	  (1.5), removespacedims1.cc (1.4), universe1.cc (1.4): Avoid
+	  unused variable warnings.
+
+2005-06-07 Tuesday 19:36  Matthew Mundell
+
+	* src/Row.defs.hh (grids.2): Only befriend Grid when
+	  EXTRA_ROW_DEBUG.  Take out declaration of operator==(gr,gr) as a
+	  friend.
+
+2005-06-07 Tuesday 18:17  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.21): Include
+	  Constraint_Systems.inlines.hh.
+
+2005-06-07 Tuesday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/.cvsignore (1.2), tests/Polyhedron/.cvsignore
+	  (1.5): Updated.
+
+2005-06-07 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/.cvsignore (1.1), src/.cvsignore (1.8),
+	  tests/BD_Shape/.cvsignore (1.3), tests/Polyhedron/.cvsignore
+	  (1.3), tests/Polyhedron/.cvsignore (1.4): Updated.
+
+2005-06-07 Tuesday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.cc (1.2): Indentation fixed.
+
+2005-06-07 Tuesday 16:28  Matthew Mundell
+
+	* interfaces/Prolog/SWI/Makefile.am (grids.1): Link against pl in
+	  rule ppl_pl$(EXEEXT).
+
+2005-06-07 Tuesday 12:43  Matthew Mundell
+
+	* src/Row.defs.hh (grids.1): Temporarily befriend operator==(gr,gr)
+	  and Grid, and make method capacity public, for tracing.
+
+2005-06-07 Tuesday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.6): Temporary kludge for Darwin that
+	  may turn out to be the right thing to do on any system.
+
+2005-06-07 Tuesday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.161): Version number bumped.
+
+2005-06-07 Tuesday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.19): Include "compiler.hh".
+
+2005-06-01 Wednesday 20:26  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_nonpublic.cc,
+	  Grid_public.cc (grids.[20,10,16,33]): Take out method
+	  add_low_level_congruences.
+
+2005-06-01 Wednesday 20:25  Matthew Mundell
+
+	* src/Generator_System.cc (grids.7): Update comments.  Re-enable
+	  the ascii_load comparison between actual and declared types.
+
+2005-06-01 Wednesday 20:23  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[12,8]): Update comments.  In OK add a message for the
+	  number of columns check and take out an old test.
+
+2005-06-01 Wednesday 20:20  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+	  (grids.[6,12,8]): Update comments.  Add a modulus method that
+	  returns a writable reference.
+
+2005-06-01 Wednesday 18:12  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.19): Make most of the constructors
+	  explicit.
+
+2005-06-01 Wednesday 17:07  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_public.cc
+	  (grids.[18,13,32]): Take out the add_and_minimize\3 methods.
+	  Update some comments.  In the add_and_minimize\2 methods add all
+	  the given rows to the system, instead of looking for duplicates.
+	  Convert rays to lines in all generator-adding methods, for now.
+
+2005-06-01 Wednesday 13:15  Matthew Mundell
+
+	* src/Grid_public.cc (grids.31): In add_generators add rays as
+	  lines, for now.
+
+2005-06-01 Wednesday 13:11  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.3): Add more interesting generators in
+	  test3.  Add test4, in which a ray is inserted.
+
+2005-05-28 Saturday 13:17  Matthew Mundell
+
+	* tests/Grid/bug1.dat, src/Generator_System.cc (grids.[2,6]): In
+	  Generator_System::asci_load leave the stream read position at the
+	  end of the dump.
+
+2005-05-27 Friday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/: Makefile.am, bug1.cc, bug1.dat (grids.[12,1,1]): The
+	  program `bug1' exhibits a bug triggered by an invocation of (to
+	  be renamed) Grid::add_congruences_and_minimize(const
+	  Constraint_System&).
+
+2005-05-27 Friday 21:02  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.12): Improve a comment.
+
+2005-05-27 Friday 21:02  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.10): Revert last change.
+
+2005-05-27 Friday 20:54  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.9): Improve a comment.
+
+2005-05-27 Friday 20:53  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_minimize.cc, Grid_nonpublic.cc,
+	  Grid_public.cc (grids.[17,12,15,30]): Take out methods
+	  normalize_divisors and parameterize.	In the construct methods
+	  leave the system as given (instead of simplifying it).  Always
+	  clear the pending rows flag of an added generator system.  Set
+	  the sorted flag in the generator construct method.  Neaten some
+	  formatting.
+
+2005-05-27 Friday 14:57  Matthew Mundell
+
+	* tests/ppl_test.hh, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/congruencesystem2.cc,
+	  tests/Grid/writecongruencesystem.cc, src/Congruence.cc,
+	  src/Congruence_System.cc, src/Generator_System.cc,
+	  src/Grid.inlines.hh, src/Grid_chdims.cc, src/Grid_conversion.cc,
+	  src/Grid_minimize.cc, src/Grid_nonpublic.cc, src/Grid_public.cc,
+	  src/Grid_simplify.cc
+	  (grids.[6,6,7,3,3,5,11,5,9,8,12,11,14,29,22]): Use `!' instead of
+	  comparing to `false'.
+
+2005-05-27 Friday 14:53  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.11): Make zero_dim_false and
+	  zero_dim_integrality public.
+
+2005-05-26 Thursday 20:50  Matthew Mundell
+
+	* tests/Grid/join2.cc (grids.2): Add test2 which joins with both
+	  grids universe.
+
+2005-05-26 Thursday 20:50  Matthew Mundell
+
+	* tests/Grid/join1.cc (grids.2): Add test2 and test3 which join
+	  with both and one grids universe.
+
+2005-05-26 Thursday 20:30  Matthew Mundell
+
+	* src/Grid_public.cc (grids.28): Rename adjust_space_dimension to
+	  increase_space_dimension.
+
+2005-05-26 Thursday 20:30  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh (grids.[10,7,5]): Rename
+	  adjust_space_dimension to increase_space_dimension, and
+	  num_non_equalities to num_proper_congruences.  Only count proper
+	  congruences in num_proper_congruences.  Take out method
+	  saturates_all_congruences.  Make the member access permissions
+	  more sensible.  Enable the definition of zero_dim_empty.
+
+2005-05-26 Thursday 20:24  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh,
+	  Grid_conversion.cc, Grid_simplify.cc (grids.[10,7,11,21]): Make
+	  the Congruence normalize methods protected and flag setting
+	  methods private.  In Congruence rename is_congruence to
+	  is_proper_congruence, and add method zero_dim_false.
+
+2005-05-26 Thursday 20:20  Matthew Mundell
+
+	* tests/Grid/: congruence1.cc, congruencesystem1.cc,
+	  congruencesystem2.cc (grids.[4,5,2]): Wrap the class under test,
+	  instead of requiring all methods to be public.
+
+2005-05-26 Thursday 17:01  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (grids.2): Add test2, which adds to
+	  an empty grid.
+
+2005-05-26 Thursday 17:01  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.5): Add test7, which adds a
+	  generator to a universe grid.
+
+2005-05-26 Thursday 17:00  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.20): Improve a variable name, and a
+	  comment.
+
+2005-05-26 Thursday 16:58  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_public.cc (grids.[16,27]): Restore the
+	  declaration of add_congruence(c), and add a new declaration for
+	  add_congruences_and_minimize(cs).  Take out the
+	  add_congruence_and_minimize(cs) declaration.	Improve the
+	  ordering of the public definitions.  Define add_congruence(c) and
+	  add_congruence_and_minimize(c).
+
+2005-05-26 Thursday 16:52  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh (grids.[9,6,4]): Call num_columns
+	  later in adjust_space_dimension.  Add insert(c).  Take out an old
+	  constraint comment.  Take out pending row code, old
+	  constraint_system code, and method
+	  satisfies_all_congruences(g,ref).  Clean up ascii_dump and some
+	  of ascii_load.  Correct the names in the Congruence_System(c)
+	  declaration.
+
+2005-05-26 Thursday 16:38  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+	  (grids.[4,9,6]): Take out throw_invalid_modulus.  Update some
+	  temporary comments.  In Congruence(c) throw an exception if the
+	  constraint is a relation, and set the modulus to 0 instead of 1.
+
+2005-05-26 Thursday 13:21  Matthew Mundell
+
+	* src/Grid_public.cc (grids.26): In add_generator also clear the
+	  congruences up-to-date flag when adding to an empty grid.
+
+2005-05-26 Thursday 12:52  Matthew Mundell
+
+	* tests/Grid/addspacedims2.cc (grids.3): Add test6, which add
+	  dimensions only to the grid's generator system.
+
+2005-05-26 Thursday 12:51  Matthew Mundell
+
+	* tests/Grid/addspacedims1.cc (grids.6): Improve comment.
+
+2005-05-25 Wednesday 21:18  Matthew Mundell
+
+	* src/Grid_public.cc (grids.25): In OK, take the extra copy of the
+	  generator system out of the minimized test, Use "generators"
+	  instead of "parameters", and print the minimized congruence
+	  system (instead of the original) in the congruence minimized
+	  test.
+
+2005-05-25 Wednesday 20:47  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.11): Add test addcongruence1.
+
+2005-05-25 Wednesday 20:47  Matthew Mundell
+
+	* tests/Grid/addcongruence1.cc (grids.1): Initial revision.
+
+2005-05-25 Wednesday 20:46  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.4): Add test6, which tests
+	  add_generator_and_minimize.
+
+2005-05-25 Wednesday 19:27  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.3): Add tests 2 to 5.
+
+2005-05-25 Wednesday 14:48  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.8): Start from the universe when
+	  constructing grids from congruences.
+
+2005-05-25 Wednesday 14:46  Matthew Mundell
+
+	* src/Grid_public.cc (grids.24): Take the extra temporary
+	  congruence system out of the OK minimize test.  Modify
+	  add_recycled_congruences and
+	  add_recycled_congruences_and_minimize to update the congruences
+	  before adding new ones.  Also improve the empty handling in both
+	  these methods.
+
+2005-05-25 Wednesday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.29), config.sub (1.28), install-sh (1.14),
+	  ltmain.sh (1.24), Watchdog/config.guess (1.13),
+	  Watchdog/config.sub (1.13), Watchdog/install-sh (1.11),
+	  Watchdog/ltmain.sh (1.13): Updated from Libtool 1.5.18.
+
+2005-05-25 Wednesday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.28), config.sub (1.27), ltmain.sh (1.23),
+	  Watchdog/config.guess (1.12), Watchdog/config.sub (1.12),
+	  Watchdog/ltmain.sh (1.12): Updated from Libtool 1.5.16.
+
+2005-05-25 Wednesday 07:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.144): Added one issue to be checked before releasing PPL
+	  0.8.
+
+2005-05-25 Wednesday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.46): The `libppl_swiprolog'
+	  library must be linked also with `libpwl'.
+
+2005-05-24 Tuesday 21:27  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_chdims.cc,
+	  Grid_nonpublic.cc, Grid_public.cc (grids.[15,8,7,13,23]): Take
+	  out all code for handling pending rows.  Add a check for pending
+	  rows to method OK.
+
+2005-05-24 Tuesday 21:23  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.19): Use unset_pending_rows instead
+	  of clearing the pending rows manually.
+
+2005-05-24 Tuesday 19:17  Matthew Mundell
+
+	* src/Grid_public.cc (grids.22): Always adjust the space dimension
+	  of con_sys in constructor Grid(num_dimensions, kind).  Clean a
+	  comment.
+
+2005-05-24 Tuesday 18:23  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.10): Take out tracing.
+
+2005-05-24 Tuesday 18:13  Matthew Mundell
+
+	* src/Grid.defs.hh, tests/Grid/addgenerator1.cc,
+	  tests/Grid/addspacedims1.cc, tests/Grid/addspacedims2.cc,
+	  tests/Grid/grid1.cc, tests/Grid/grid2.cc,
+	  tests/Grid/intersection2.cc, tests/Grid/isuniverse1.cc,
+	  tests/Grid/mapspacedims1.cc, tests/Grid/removespacedims2.cc
+	  (grids.[14,2,5,2,11,7,2,2,4,2]): In constructor
+	  Grid(num_dimensions, kind) kind is UNIVERSE if only
+	  num_dimensions if given.
+
+2005-05-24 Tuesday 17:14  Matthew Mundell
+
+	* src/Grid_public.cc (grids.21): Output "true" from operator<< if
+	  the grid is universe.
+
+2005-05-24 Tuesday 17:01  Matthew Mundell
+
+	* tests/Grid/addspacedims1.cc (grids.4): Add test5, where
+	  dimensions are only added to the congruence system.
+
+2005-05-24 Tuesday 16:55  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.10): Add test addgenerator1.
+
+2005-05-24 Tuesday 16:55  Matthew Mundell
+
+	* tests/Grid/addgenerator1.cc (grids.1): Initial revision.
+
+2005-05-24 Tuesday 16:54  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.3): Add test6 (maps additional
+	  dimensions to themselves), test7 (maps over existing dimensions)
+	  and test8 (maps away a dimension in an empty grid).
+
+2005-05-24 Tuesday 16:51  Matthew Mundell
+
+	* src/Grid_public.cc (grids.20): Set congruences up to date in
+	  add_congruence.  Implement the rest of add_generator.
+
+2005-05-23 Monday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (grids.19):
+	  Grid::add_congruences_and_minimize(const Constraint_System& cs)
+	  fixed.
+
+2005-05-23 Monday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Grid_public.cc (grids.18): In
+	  Grid::add_congruences_and_minimize(const Constraint_System& cs),
+	  non equality constraints that may be present in `cs' are simply
+	  ignored.
+
+2005-05-23 Monday 18:09  Matthew Mundell
+
+	* src/Grid_public.cc (grids.17): Implement some of add_generator.
+	  Modify add_congruences_and_minimize to match the dimension of the
+	  congruence system being constructed to the given constraint
+	  system.  Correct a doxygen comment.
+
+2005-05-23 Monday 15:57  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.2): Add test5.
+
+2005-05-23 Monday 15:51  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.18): Adjust the system's row capacity
+	  after inserting or erasing rows.
+
+2005-05-23 Monday 15:48  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.6): In add_space_dimensions_and_embed
+	  correct the clearing of the minimize flags and the loop that adds
+	  virtual rows.  Take some pending code out of concatenate_assign.
+
+2005-05-20 Friday 09:12  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.9): Add test mapspacedims1.
+
+2005-05-20 Friday 09:12  Matthew Mundell
+
+	* tests/Grid/mapspacedims1.cc (grids.1): Initial revision.
+
+2005-05-20 Friday 09:11  Matthew Mundell
+
+	* src/Grid.inlines.hh (grids.7): Enable and implement method
+	  map_space_dimensions.
+
+2005-05-19 Thursday 09:35  Matthew Mundell
+
+	* src/Grid_public.cc (grids.16): Take out some of the pending code.
+	  Add the definition of add_congruences_and_minimize.
+
+2005-05-19 Thursday 09:34  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.13): Temporarily add
+	  add_congruences_and_minimize and erroneously rename
+	  add_congruences to add_congruences_and_minimize.
+
+2005-05-19 Thursday 09:07  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.17): Rename pivot_num to pivot_index.
+	  In the congruence reduction swap the current row with a newly
+	  accessed pivot instead of with the original reference to the
+	  pivot.  Also decrement the pivot_index in macro free_row.
+
+2005-05-18 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/.cvsignore (grids.1): Put under CVS control.
+
+2005-05-18 Wednesday 17:45  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.10): Always define
+	  is_upper_triangular and is_lower_triangular.	Add some tracing.
+
+2005-05-18 Wednesday 17:43  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.12): Always declare is_upper_triangular
+	  and is_lower_triangular
+
+2005-05-18 Wednesday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Grid/Makefile.in (grids.2): Makefile.in is a generated file
+	  and should not be put under CVS.
+
+2005-05-18 Wednesday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (grids.3): Improvements to the section on
+	  rational grids.
+
+2005-05-17 Tuesday 22:06  Abramo Bagnara
+
+	* src/checked.inlines.hh (1.18): abs may legitimately fail with
+	  overflow.
+
+2005-05-17 Tuesday 19:31  Abramo Bagnara
+
+	* src/Init.cc (1.17): Fixed include file.
+
+2005-05-15 Sunday 20:03  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.21): Moved rounding mode handling to a lower
+	  level. Converted some method to functions.
+
+2005-05-15 Sunday 18:13  Abramo Bagnara
+
+	* src/: Init.cc (1.16), Init.defs.hh (1.12), Makefile.am (1.110),
+	  Rounding.defs.hh (1.11), Rounding.inlines.hh (1.8),
+	  checked.defs.hh (1.19), checked.inlines.hh (1.17),
+	  checked_float.inlines.hh (1.37), checked_int.inlines.hh (1.32),
+	  checked_mpz.inlines.hh (1.22), fpu-none.inlines.hh (1.1): Moved
+	  rounding mode handling to a lower level.
+
+2005-05-15 Sunday 18:11  Abramo Bagnara
+
+	* src/: BD_Shape.inlines.hh (1.48), Checked_Number.defs.hh (1.26),
+	  Checked_Number.inlines.hh (1.32): Converted many Checked_Number
+	  method in functions.
+
+2005-05-15 Sunday 10:34  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.8): Add test concatenate1.
+
+2005-05-15 Sunday 10:34  Matthew Mundell
+
+	* tests/Grid/concatenate1.cc (grids.1): Initial revision.
+
+2005-05-15 Sunday 10:33  Matthew Mundell
+
+	* tests/Grid/removespacedims1.cc (grids.2): Take out trace dumping.
+
+2005-05-15 Sunday 10:32  Matthew Mundell
+
+	* tests/Grid/addspacedims1.cc (grids.3): Shorten comments.
+
+2005-05-15 Sunday 10:31  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.16): In the congruence reduction,
+	  after erasing rows set the row capacity of the system from the
+	  first row.
+
+2005-05-15 Sunday 10:18  Matthew Mundell
+
+	* src/Grid_public.cc (grids.15): Add loading of the minimize flag
+	  to ascii_load.
+
+2005-05-15 Sunday 10:16  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.5): Enable and implement
+	  concatenate_assign.
+
+2005-05-15 Sunday 10:13  Matthew Mundell
+
+	* src/Generator_System.cc (grids.4): In method ascii_load, turn off
+	  the type check (for now), and correctly handle reading in the
+	  virtual flag.
+
+2005-05-15 Sunday 10:09  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.8): In operator== decrement the
+	  row count before the comparing the elements.
+
+2005-05-15 Sunday 10:08  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.5): In find_variation, dump the ASCII of
+	  `a' before loading it into `b', and print an error and exit if
+	  the load fails.
+
+2005-05-12 Thursday 18:11  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.7): Add test removespacedims1.
+
+2005-05-12 Thursday 18:10  Matthew Mundell
+
+	* tests/Grid/removespacedims1.cc (grids.1): Initial revision.
+
+2005-05-12 Thursday 18:10  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.12): Clean comments and take out
+	  tracing in normalize_divisors.
+
+2005-05-12 Thursday 18:09  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.4): Enable and implement
+	  add_space_dimensions.
+
+2005-05-12 Thursday 18:07  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.11): Integrate a too-deeply nested
+	  doxygen sublist into the parent item.  Correct parameter names in
+	  some method descriptions.
+
+2005-05-12 Thursday 16:04  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.8): Take doxygen \p's out of maths
+	  environments.
+
+2005-05-12 Thursday 14:49  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.7): Escape %'s in maths
+	  environments.
+
+2005-05-12 Thursday 14:13  Matthew Mundell
+
+	* src/Grid_public.cc (grids.14): In OK declare limit the scope of
+	  variable num_columns, instead of jumping into that scope.  Add
+	  the state of minimization to the ascii_dump output.
+
+2005-05-12 Thursday 13:20  Matthew Mundell
+
+	* src/Makefile.am (grids.3): Add Congruence, Congruence_System and
+	  Grid files to DOC_FILES.
+
+2005-05-12 Thursday 13:15  Matthew Mundell
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in (grids.[1,1]): Add files for
+	  Congruence, Congruence_System and Grid to INPUT.
+
+2005-05-12 Thursday 09:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (grids.2): Several small improvements to the
+	  new documentation on grids.
+
+2005-05-11 Wednesday 20:18  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.6): Add test removespacedims2.
+
+2005-05-11 Wednesday 20:17  Matthew Mundell
+
+	* tests/Grid/removespacedims2.cc (grids.1): Initial revision.
+
+2005-05-11 Wednesday 20:16  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.11): Enable
+	  remove_pending_to_obtain_generators.
+
+2005-05-11 Wednesday 20:15  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.3): Update
+	  add_space_dimensions_and_project to clear the generator system if
+	  the grid is empty.  Enable and implement method
+	  remove_higher_space_dimensions.
+
+2005-05-11 Wednesday 17:17  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.5): Add tests isuniverse1 and
+	  addspacedims2.
+
+2005-05-11 Wednesday 17:16  Matthew Mundell
+
+	* tests/Grid/addspacedims1.cc (grids.2): Improve the file
+	  description.	Take out excess variable declarations.	Add a check
+	  that the grid is the universe to test3.
+
+2005-05-11 Wednesday 17:12  Matthew Mundell
+
+	* tests/Grid/: addspacedims2.cc, isuniverse1.cc (grids.[1,1]):
+	  Initial revision.
+
+2005-05-11 Wednesday 17:07  Matthew Mundell
+
+	* src/Grid_public.cc (grids.13): Enable and finish off is_universe.
+
+2005-05-11 Wednesday 17:03  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_chdims.cc (grids.[10,2]): Add method
+	  add_space_dimensions(cgs, gs dims).  Declare the original
+	  add_space_dimensions inline.	Update the space dimension
+	  adjusting functions to set the created generators to lines via
+	  flags (instead of explicit calls to the respective methods).
+	  Implement add_space_dimensions_and_project.  Improve some
+	  comments.
+
+2005-05-11 Wednesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox, ppl.sty (grids.[1,1]): Introductory
+	  documentation for grids and draft specifications of most of the
+	  main operations to be implemented.
+
+2005-05-09 Monday 12:40  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.4): Add tests addspacedims1,
+	  intersection1, intersection2, join1 and join2.
+
+2005-05-09 Monday 12:39  Matthew Mundell
+
+	* tests/Grid/addspacedims1.cc (grids.1): Initial revision.
+
+2005-05-09 Monday 12:36  Matthew Mundell
+
+	* tests/Grid/: grid3.cc, intersection1.cc, intersection2.cc,
+	  join1.cc, join2.cc (grids.[3,1,1,1,1]): Move operation tests to
+	  per-operation files.	Add various tests of the
+	  intersection_assign methods.
+
+2005-05-09 Monday 12:32  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.6): Add test13 (an empty grid
+	  constructed with congruences).
+
+2005-05-09 Monday 12:32  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.10): Add test19 (a generator system
+	  with only a line).
+
+2005-05-09 Monday 12:31  Matthew Mundell
+
+	* tests/Grid/: congruence1.cc, congruencesystem1.cc (grids.[3,4]):
+	  Use C++ style single line comments.  Take out some duplicate
+	  Variables.
+
+2005-05-09 Monday 12:28  Matthew Mundell
+
+	* tests/print.hh (grids.2): Declare nout and vnout static.
+
+2005-05-09 Monday 12:27  Matthew Mundell
+
+	* src/Makefile.am (grids.2): Add Grid_chdims.cc to
+	  libppl_la_SOURCES.
+
+2005-05-09 Monday 12:26  Matthew Mundell
+
+	* src/Grid_chdims.cc (grids.1): Initial revision, with methods
+	  add_space_dimensions and add_space_dimensions_and_embed enabled.
+
+2005-05-09 Monday 12:24  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_public.cc, Grid_simplify.cc
+	  (grids.[9,12,15]): Add method add_space_dimensions.  Change the
+	  type of the reduce_equality_with_equality arguments to
+	  Congruence.  Rename reduce_line_with_parameter to
+	  reduce_parameter_with_line.  Rename
+	  reduce_equality_with_congruence to
+	  reduce_congruence_with_equality.  Enable the definition of method
+	  contains.  Update comments.  Take out some tracing.  Correct the
+	  asserts in two of the reduce functions.
+
+2005-05-09 Monday 12:05  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.10): Take out some tracing.  Update
+	  comments left from Polyhedron.
+
+2005-05-09 Monday 12:00  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[7,5]): Take out a line of tracing and the declaration of
+	  method insert(const Constraint&).  Update a comment.
+
+2005-05-06 Friday 11:47  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.9): Correct method name typo.
+
+2005-05-06 Friday 11:39  Matthew Mundell
+
+	* tests/Grid/grid3.cc (grids.2): Use A instead of C in test1.  Add
+	  test2, test3 and test4, which test
+	  intersection_assign_and_minimize, join_assign and
+	  join_assign_and_minimize.
+
+2005-05-06 Friday 11:37  Matthew Mundell
+
+	* src/: Grid_conversion.cc, Grid_simplify.cc (grids.[8,14]): Use
+	  new method Congruence_System::is_congruence.	Update parameter
+	  reduction to make all following rows virtual if the first row
+	  turns out to be virtual or a line.  Update congruence reduction
+	  to make the first row the integrality congruence if the resulting
+	  grid is empty.
+
+2005-05-06 Friday 11:29  Matthew Mundell
+
+	* src/Grid_public.cc (grids.11): Enable and implement
+	  intersection_assign_and_minimize, join_assign and
+	  join_assign_and_minimize.
+
+2005-05-06 Friday 11:27  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.9): Normalise moduli before
+	  simplifying in construct.  Correct some comments.
+
+2005-05-06 Friday 11:26  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.9): Reorder method definitions.  Add
+	  some temporary comments.
+
+2005-05-06 Friday 11:22  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence_System.cc (grids.[6,5,6]): Add method is_congruence.
+	  Adjust normalize_moduli to loop through all the rows when
+	  calculating the LCM.
+
+2005-05-05 Thursday 10:55  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.3): Add grid3_SOURCES and add grid3
+	  to TESTS.
+
+2005-05-05 Thursday 10:54  Matthew Mundell
+
+	* tests/Grid/grid3.cc (grids.1): Initial revision.
+
+2005-05-05 Thursday 10:49  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.13): Rename function
+	  trailing_rows_are_zero to rows_are_zero, and modify it to also
+	  take the last row (instead of just checking to the end).  Update
+	  the call of this function in the congruence simplify to correctly
+	  check the rows at the beginning of the matrix.
+
+	  In the congruence simplify decrement orig_row_num in macro
+	  free_row, to match it to the new number of rows.
+
+2005-05-05 Thursday 10:42  Matthew Mundell
+
+	* src/Grid_public.cc (grids.10): Simplify instead of processing
+	  pending, in is_universe.  Enable processing of pending generators
+	  in add_congruence.  Enable and implement intersection_assign.
+
+2005-05-05 Thursday 10:36  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.8): Minimize instead of simplifying
+	  in the process_pending methods.  Update a comment.
+
+2005-05-05 Thursday 10:34  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.8): Take out tracing, add a comment.
+
+2005-05-05 Thursday 10:34  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh
+	  (grids.[5,4]): Add void method add_rows(const
+	  Congruence_System&).
+
+2005-05-05 Thursday 10:32  Matthew Mundell
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[9,5]): Convert comments
+	  to C++ style.
+
+2005-05-04 Wednesday 15:04  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+	  Grid_nonpublic.cc, Grid_public.cc, Grid_simplify.cc
+	  (grids.[8,6,7,7,9,12]): Rename constructor parameters from cgs to
+	  const_gs, and from cs to cgs.  Add static methods
+	  lower_triangular and upper_triangular, and use them in OK.  Use
+	  these and new function identity as pre-conversion assertions.
+	  Take out the congruence-related and Grid versions of
+	  throw_topology_incompatible, and the old Polyhedron constructor
+	  definitions.	Clean up the topology checking in general.  Comment
+	  out the parameter name in add_low_level_congruences to work
+	  around a compiler warning.  Clean some argument spacing and
+	  update some comments.  Update construct to convert a given NNC
+	  generator system to NC.
+
+2005-05-03 Tuesday 15:20  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.11): Only throw the "type match" run
+	  time errors when assertions are enabled.
+
+2005-05-03 Tuesday 15:03  Matthew Mundell
+
+	* tests/Grid/: grid1.cc, grid2.cc (grids.[8,4]): Neaten tracing
+	  headers.  Use the single argument Grid constructor, instead of
+	  explicitly passing kind as EMPTY.  Create known grids using the
+	  copy constructor.  Add the known grid check to test15.  Add
+	  test16, test17 and test18, which test universe grids of one, many
+	  and zero dimensions.
+
+2005-05-03 Tuesday 15:02  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.10): Turn off tracing.
+
+2005-05-03 Tuesday 15:01  Matthew Mundell
+
+	* src/Grid_public.cc (grids.8): Ensure that dimensions given to the
+	  constructor are small enough.  Implement method is_universe.
+	  Enable, clean up and improve the OK method.  Add operator= (moved
+	  from Grid_nonpublic.cc).
+
+2005-05-03 Tuesday 14:48  Matthew Mundell
+
+	* src/Grid_nonpublic.cc (grids.6): Take out operator= (moved to
+	  Grid_public.cc).  Enable and update process_pending_congruences
+	  and process_pending_generators.  Enable the pending processing in
+	  minimize().  Drop the topol argument from calls to
+	  throw_space_dimension_overflow.
+
+2005-05-03 Tuesday 14:40  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.7): Simplify before initialising the
+	  destination in the minimize functions.  Improve the loops that
+	  create identity matrices.
+
+2005-05-03 Tuesday 14:35  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.6): Update some comments.  Add and
+	  use macro ctrace_dump.  Only throw the "type match" run time
+	  errors when assertions are enabled.  Move source_diag init out of
+	  the row-processing loop in the parameter to congruence
+	  conversion.
+
+2005-05-03 Tuesday 14:22  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[7,5]): Improve some
+	  comments.  Revert the miscellaneous methods to private.  Drop
+	  throw_space_dimension_overflow's topol argument.  Take out the
+	  bounding box method definitions.  Enable method process_pending.
+
+2005-05-03 Tuesday 14:11  Matthew Mundell
+
+	* tests/Grid/congruencesystem1.cc (grids.3): Neaten test7.
+
+2005-04-28 Thursday 18:50  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.7), checked_float.inlines.hh (1.36): Avoid
+	  some compiler warnings.
+
+2005-04-27 Wednesday 21:45  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc (grids.[6,4,5,6,5,7,9]): Take out all saturation
+	  matrix code, polyhedron method descriptions, some tracing, the
+	  polyhedron related parts of exception messages, and the methods
+	  obtain_sorted_congruences, obtain_sorted_generators,
+	  obtain_sorted_congruences_with_sat_c and
+	  obtain_sorted_generators_with_sat_g.
+
+	  Only pass the source and destination systems to the conversion
+	  and simplify methods.  Revert some of the temporarily public
+	  methods to private.  Clean up the minimize methods and enclose
+	  them in a namespace block.
+
+	  Conversion
+
+	    Enclose the method definitions in a namespace block.  Improve
+	    comments and initial asserts.  Skip multiplying the destination
+	  grid
+	    by the multiplier when the multiplier is one.  Use temporary
+	    variables better in the parameter to congruence version.
+
+	  Reduction
+
+	    Neaten the reduce_line_with_line description, and some variable
+	    names in the reduce methods.  Only define
+	  trailing_rows_are_zero
+	    when assertions are enabled.
+
+2005-04-27 Wednesday 21:10  Matthew Mundell
+
+	* src/Congruence_System.inlines.hh (grids.3): Take old comment out
+	  of resize_no_copy.
+
+2005-04-26 Tuesday 20:54  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.8): Use the new is_virtual and
+	  set_is_virtual methods instead of the old virtual row functions.
+	  Clean up many of the temporary comments and some of the others.
+	  Improve variable names.  Take out some of the trace printing.
+	  Improve the loop used to iterate through the preceding rows in
+	  the congruence reduction.  Move the congruence reduction OK
+	  assertion so that is is called in every return case.	Save doing
+	  one of the comparisons in the empty grid check at the end of the
+	  congruence reduction.
+
+2005-04-26 Tuesday 20:38  Matthew Mundell
+
+	* src/Grid_minimize.cc (grids.5): Add an assertion that there are
+	  rows to the 4 parameter congruence to generator minimize method.
+	  Take the Polhedron assertion comment out of both of the 4
+	  parameter minimize methods.
+
+2005-04-26 Tuesday 20:33  Matthew Mundell
+
+	* src/: Generator_System.cc, Grid_conversion.cc, Grid_nonpublic.cc
+	  (grids.[3,4,4]): Use new is_virtual and set_is_virtual methods
+	  instead of the old virtual row functions.
+
+2005-04-26 Tuesday 20:30  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh (grids.[5,3]): Take out the
+	  virtual row functions (replace with methods in the Generator and
+	  Congruence classes).
+
+2005-04-26 Tuesday 20:28  Matthew Mundell
+
+	* src/: Generator.defs.hh, Generator.inlines.hh (grids.[2,1]): Add
+	  is_virtual.
+
+2005-04-26 Tuesday 20:27  Matthew Mundell
+
+	* src/Congruence_System.defs.hh (grids.3): Correct comment.
+
+2005-04-26 Tuesday 20:26  Matthew Mundell
+
+	* src/: Congruence.defs.hh, Congruence.inlines.hh (grids.[5,4]):
+	  Add methods is_virtual and set_is_virtual.  Assert that there are
+	  elements in methods modulus and set_is_equality.
+
+2005-04-26 Tuesday 11:04  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.7): Add test15, which tests
+	  reduce_line_with_line.  Neaten the generator system definition in
+	  test9.
+
+2005-04-25 Monday 19:35  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid_simplify.cc (grids.[4,7]): Use
+	  strace_dump in the congruence system reduction.
+
+	  The previous log message should have been:
+
+	  Improve comments.  Split le_le_reduce into
+	  reduce_equality_with_equality and reduce_line_with_line.  Improve
+	  the names, arguments and variables of all the reduce functions.
+	  Also consider the divisor in reduce_line_with_line.  Use
+	  Coefficient_traits::const_reference in the reduce functions.
+	  Correct the assertions.  Add and use macro strace_dump and
+	  temporary tracing stream strace.
+
+2005-04-25 Monday 18:58  Matthew Mundell
+
+	* src/Grid_public.cc (grids.6): In
+	  add_recycled_congruences_and_minimize use the add_and_minimize
+	  return directly, instead of using a variable.
+
+2005-04-25 Monday 18:48  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.6): In
+	  add_recycled_congruences_and_minimize use the add_and_minimize
+	  return directly, instead of using a variable.
+
+2005-04-25 Monday 18:46  Matthew Mundell
+
+	* src/Grid_conversion.cc (grids.3): Rename the trace stream ctrace.
+
+2005-04-25 Monday 18:42  Matthew Mundell
+
+	* src/GMP_Integer.defs.hh (grids.2): Improve comment.
+
+2005-04-25 Monday 13:03  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.3): Add general tests test11 and
+	  test12, which have more and fewer rows than columns,
+	  respectively.
+
+2005-04-22 Friday 11:41  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.2): Add general test cong_test4.
+
+2005-04-21 Thursday 12:30  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.2): Add grid2_SOURCES, and add
+	  grid2 to TESTS.
+
+2005-04-21 Thursday 12:29  Matthew Mundell
+
+	* tests/Grid/grid2.cc (grids.1): Initial revision.
+
+2005-04-21 Thursday 12:28  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.6): Always compare the grid and known
+	  grid in the same order.  Match the test names in the comments to
+	  the new Chiara names.
+
+2005-04-21 Thursday 12:16  Matthew Mundell
+
+	* src/Grid_public.cc (grids.5): Update
+	  add_recycled_congruences_and_minimize to clear the empty flag and
+	  set the congruences up-to-date.  Take out the polyhedra comments
+	  in operator==, and neaten operator<<.
+
+2005-04-21 Thursday 12:10  Matthew Mundell
+
+	* src/: Grid_minimize.cc, Grid_nonpublic.cc, Grid_simplify.cc
+	  (grids.[4,3,5]): Return a bool from the update_congruences and
+	  simplify methods to indicate whether the grid is empty.  Pass
+	  this return on in the minimize and add_and_minimize methods which
+	  call simplify.  Assert an equal number of columns in source1 and
+	  source2 in add_and_minimize\5 (congruence to generator).
+
+	  In update_congruences and update_generators set the grid empty
+	  according to the minimize return.
+
+	  In both simplifys use the row number instead of the row to test
+	  if the original row and pivot must be swapped.  In the congruence
+	  simplify when adding the top row, search for a valid modulus and
+	  set the diagonal (and modulus) to the result of the search.
+
+2005-04-21 Thursday 11:51  Matthew Mundell
+
+	* src/Grid.defs.hh (grids.3): Return a bool from update_congruences
+	  and simplify to indicate whether the grid is empty.  Pass this
+	  return on in the minimize and add_and_minimize methods which call
+	  simplify.  Assert an equal number of columns in the sources in
+	  the congruence to generator add_and_minimize\5.
+
+2005-04-21 Thursday 11:40  Matthew Mundell
+
+	* src/Generator_System.cc (grids.2): In operator<< increment the
+	  iterator after the virtual row check, and loop with a single
+	  comparison.
+
+2005-04-21 Thursday 11:37  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.4): Take out normalize_moduli
+	  tracing.  Add satisfies_all_cgs tracing.  Update normalize_moduli
+	  to consider only positive moduli.  Make adjust_space_dimension
+	  move the moduli to the new last column.  Neaten the operator<<
+	  loop.
+
+2005-04-19 Tuesday 19:08  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.5): Add test14 which uses larger
+	  numbers than the existing tests.
+
+2005-04-19 Tuesday 14:22  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.4): Add test11-13 which test with an
+	  empty grid in one, an empty grid in many dimensions and a grid in
+	  which the values are larger than in the existing tests.
+
+2005-04-19 Tuesday 14:17  Matthew Mundell
+
+	* src/Linear_Row.cc (grids.1): Note the virtual row in
+	  Flags::ascii_dump.
+
+2005-04-19 Tuesday 14:15  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.4): Include the divisor in the
+	  parameter version of le_pc_reduce.  In the congruence version
+	  consider every row (instead of leaving out the last row) and skip
+	  modifying virtual rows.
+
+2005-04-19 Tuesday 14:07  Matthew Mundell
+
+	* src/: Grid_minimize.cc, Grid_public.cc (grids.[3,4]): Take out
+	  the pending row tracing.
+
+2005-04-17 Sunday 19:38  Abramo Bagnara
+
+	* src/: fpu-c99.inlines.hh (1.5), fpu-ia32.inlines.hh (1.6),
+	  fpu.defs.hh (1.4): Code cleaning. Added
+	  fpu_set_rounding_direction.
+
+2005-04-15 Friday 18:55  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.3): Take out tracing.  Enable
+	  comparison to known grid in test1.
+
+2005-04-15 Friday 18:51  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.4): ASCII dump `a'.
+
+2005-04-15 Friday 18:49  Matthew Mundell
+
+	* src/Grid_simplify.cc (grids.3): When the first row must be added,
+	  add an empty congruence or point instead of a virtual row.
+
+2005-04-15 Friday 17:29  Matthew Mundell
+
+	* tests/Grid/Makefile.am (grids.1): Initial revision.
+
+2005-04-15 Friday 15:23  Matthew Mundell
+
+	* src/Congruence.inlines.hh (grids.3): Take out tracing.
+
+2005-04-15 Friday 15:23  Matthew Mundell
+
+	* src/Congruence.defs.hh (grids.4): Take out inclusion of test
+	  file.
+
+2005-04-15 Friday 12:12  Matthew Mundell
+
+	* tests/Grid/grid1.cc (grids.2): Add test7 to test10, and update
+	  all tests to test reduction and conversion.
+
+2005-04-15 Friday 12:11  Matthew Mundell
+
+	* tests/Grid/congruencesystem1.cc (grids.2): Add test7, which
+	  includes an all-zero congruence and an equality.
+
+2005-04-15 Friday 12:07  Matthew Mundell
+
+	* src/: Linear_Row.defs.hh, Linear_Row.inlines.hh (grids.[1,1]):
+	  Add a virtual flag and methods is_virtual and set_is_virtual.
+
+2005-04-15 Friday 12:06  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid_conversion.cc,
+	  Grid_minimize.cc, Grid_nonpublic.cc, Grid_public.cc,
+	  Grid_simplify.cc (grids.[2,2,2,2,2,3,2]): Add much tracing.
+	  Neaten whitespace.  Improve comments.  Change the parameter
+	  system type to Generator_System in methods minimize and simplify.
+	   Rename convert to conversion (to match Polyhedron).	Temporarily
+	  make some private methods public (for testing).  Change
+	  parameterize to return the generator system and add the ability
+	  to pass a reference point to parameterize.  Add static methods
+	  virtual_row and mark_virtual.
+
+	  Adjust is_included_in to the parameter system.
+
+	  Move the definition of construct to Grid_nonpublic.cc.  Enable
+	  operator!=.
+
+	  Add conversion from parameter system to congruence system, and
+	  get both conversion methods working.	Add a trace stream.
+
+	  Update the minimize and add_and_minimize methods.  In all of
+	  these include negative values in the check for an empty grid
+	  after conversion, and always set the destination generators and
+	  generator system necessarily closed.
+
+	  Direct out some of the saturation matrix code.  Correct the empty
+	  flag handling after adding congruences to the grid.  In
+	  Grid(num_dimensions,kind) change the initial generator system
+	  topology to necessarily closed and set the congruences to
+	  minimized directly via status when the grid is empty.
+
+	  Update reduction (the simplify methods).
+
+2005-04-15 Friday 11:01  Matthew Mundell
+
+	* src/Generator_System.cc (grids.1): Add virtual_rows to loading
+	  and dumping.
+
+2005-04-15 Friday 10:55  Matthew Mundell
+
+	* src/: Congruence_System.cc, Congruence_System.defs.hh,
+	  Congruence_System.inlines.hh (grids.[3,2,2]): Add method
+	  resize_no_copy and a version of satisfies_all_congruences that
+	  accepts a parameter.	In operator== substitute a local
+	  implementation for the Matrix::operator== call.  Leave out
+	  equalities in normalize_moduli.  In both
+	  satisfies_all_congruences compare the scalar product with zero
+	  for equalities.
+
+2005-04-15 Friday 10:41  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh
+	  (grids.[3,3,2]): Add versions of reduced_scalar_product_assign
+	  and scalar_product_assign which accept parameters.  Add method
+	  set_is_equality.  In normalize set the inhomogeneous term to the
+	  modulus when the coefficients are all zero.  Correct the loading
+	  of the "m" in ascii_load.
+
+2005-04-15 Friday 10:30  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.3): In find_variation_template neaten
+	  the failure output, take out the tracing output, and note that
+	  `a' must be up to date.
+
+2005-04-11 Monday 00:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Time.inlines.hh (1.3): Fixed a bug in
+	  Time::operator+=(const Time&).
+
+2005-04-10 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.47), tests/BD_Shape/affineimage8.cc
+	  (1.2), tests/BD_Shape/affineimage9.cc (1.2),
+	  tests/BD_Shape/affinepreimage5.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage14.cc (1.3): Improved
+	  methods BD_Shape::affine_image(Variable, const
+	  Linear_Expression&, Coefficient_traits::const_reference),
+	  BD_Shape::affine_preimage(Variable, const Linear_Expression&,
+	  Coefficient_traits::const_reference), and
+	  BD_Shape::generalized_affine_image(Variable, Relation_Symbol,
+	  const Linear_Expression&, Coefficient_traits::const_reference).
+
+2005-04-06 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.20): Added negate_round_up().
+
+2005-04-03 Sunday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.51): Wrong indentation corrected.
+
+2005-04-03 Sunday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.36): Sentence fixed.
+
+2005-04-02 Saturday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.18), BD_Shape.inlines.hh (1.46): Added
+	  method Constraint_System BD_Shape<T>::minimized_constraints()
+	  const.
+
+2005-03-31 Thursday 12:14  Matthew Mundell
+
+	* doc/Makefile.am (1.34): Keep TXT_LICENSES in LICENSES.  Use
+	  specific licence variables in ALL_TARGETS, instead of LICENSES.
+
+2005-03-31 Thursday 12:11  Matthew Mundell
+
+	* demos/ppl_lcdd/examples/README (1.3): Make "example" plural.
+
+2005-03-31 Thursday 12:10  Matthew Mundell
+
+	* debian/: libppl.dirs (1.2), libppl.install (1.3), rules (1.4):
+	  Add ppl_lcdd to the libppl package.  Extract the PPL version
+	  string from configure.ac instead of from one of the documentation
+	  files.  Make the PWL.  Install the PWL and Debian changelog to
+	  libppl-pwl.  Copy the Debian changelog to libppl correctly.
+
+2005-03-31 Thursday 12:03  Matthew Mundell
+
+	* debian/: libppl-pwl.dirs (1.1), libppl-pwl.docs (1.1),
+	  libppl-pwl.install (1.1): Initial revision.
+
+2005-03-31 Thursday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.dirs (altnum.1): file libppl-pwl.dirs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-31 Thursday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-pwl.docs (altnum.1): file libppl-pwl.docs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-31 Thursday 12:02  Matthew Mundell
+
+	* debian/control (1.7): For the PWL package, correct long and short
+	  descriptions and take out the libppl dependency.
+
+2005-03-31 Thursday 11:59  Matthew Mundell
+
+	* configure.ac (1.160): Add Debian copyright files to
+	  AC_CONFIG_FILES.  Clean some whitespace.
+
+2005-03-31 Thursday 11:58  Matthew Mundell
+
+	* debian/libppl-pwl.links (1.2): Use libppl-pwl.docs instead of a
+	  symlink.
+
+2005-03-31 Thursday 11:56  Matthew Mundell
+
+	* debian/libppl.copyright (1.2): Move to libppl.copyright.in.
+
+2005-03-31 Thursday 11:55  Matthew Mundell
+
+	* debian/libppl.copyright.in (1.1): Initial revision (moved here
+	  from libppl.copyright).
+
+2005-03-31 Thursday 11:54  Matthew Mundell
+
+	* debian/libppl-pwl.copyright.in (1.1): Initial revision.
+
+2005-03-29 Tuesday 23:22  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.25), Checked_Number.inlines.hh
+	  (1.31), Float.defs.hh (1.6), Float.inlines.hh (1.8), Makefile.am
+	  (1.109), checked.cc (1.1), checked.defs.hh (1.18),
+	  checked.inlines.hh (1.16), checked_ext.defs.hh (1.7),
+	  checked_ext.inlines.hh (1.17), checked_float.inlines.hh (1.35),
+	  checked_int.inlines.hh (1.31), checked_mpq.inlines.hh (1.18),
+	  checked_mpz.inlines.hh (1.21): New implementation of standardized
+	  input of checked numbers. Added mpq to float conversion.
+
+2005-03-29 Tuesday 16:40  Matthew Mundell
+
+	* doc/README.doc (1.4): Revert accidental previous commit.
+
+2005-03-29 Tuesday 16:37  Matthew Mundell
+
+	* doc/: README.doc (1.3), Makefile.am (1.33): Preserve text
+	  licences across the clean rules by making CLEANFILES and
+	  ALL_TARGETS only refer to files that can be built.  Take
+	  duplicate text files out of EXTRA_DIST.  Take out the dist-hook
+	  rule.
+
+2005-03-29 Tuesday 16:29  Matthew Mundell
+
+	* debian/rules (1.3): For the config.status rule add a Watchdog
+	  configure command and take out the dependency on configure.
+
+2005-03-29 Tuesday 12:01  Matthew Mundell
+
+	* debian/rules (1.2): Add configure flags assignment suggested in
+	  Debian autotools-dev README.	Change DOC_DIR to libppl-dev (user
+	  manual moved to package libppl-dev).	Update comment.
+
+2005-03-29 Tuesday 11:50  Matthew Mundell
+
+	* debian/libppl.doc-base (1.2): Moved to libppl-dev.doc-base.user
+	  (user manual moved to package libppl-dev).
+
+2005-03-29 Tuesday 11:47  Matthew Mundell
+
+	* debian/libppl-dev.doc-base.user (1.1): Initial revision.
+
+2005-03-29 Tuesday 11:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.doc-base.user (altnum.1): file
+	  libppl-dev.doc-base.user was added on branch altnum on 2006-10-29
+	  19:26:52 +0000
+
+2005-03-29 Tuesday 11:45  Matthew Mundell
+
+	* debian/libppl-dev.doc-base (1.2): Make the fields in the first
+	  section contiguous.  Update HTML directory name.
+
+2005-03-29 Tuesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.doc-base (altnum.1): file libppl-dev.doc-base
+	  was added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-29 Tuesday 11:43  Matthew Mundell
+
+	* debian/control (1.6): Add automake1.4 build conflict.  Update
+	  interface short descriptions.  As per Developers Reference: take
+	  leading "The"'s out of short descriptions, add homepage field to
+	  long descriptions, take mention of Free Software out of the long
+	  descriptions.
+
+2005-03-26 Saturday 10:45  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.24), checked.defs.hh (1.17),
+	  checked_ext.inlines.hh (1.16), checked_float.inlines.hh (1.34),
+	  checked_int.inlines.hh (1.30): Cosmetic fix to conform to usual
+	  C++ guidelines.
+
+2005-03-26 Saturday 10:24  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.23), Checked_Number.inlines.hh
+	  (1.30), checked.defs.hh (1.16), checked_ext.inlines.hh (1.15),
+	  checked_float.inlines.hh (1.33), checked_int.inlines.hh (1.29),
+	  checked_mpq.inlines.hh (1.17), checked_mpz.inlines.hh (1.20):
+	  Fixed assignments from infinities.
+
+2005-03-25 Friday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.17), BD_Shape.inlines.hh (1.45): Pass
+	  arguments of type Coefficient using
+	  Coefficient_traits::const_reference instead of plain const
+	  reference.
+
+2005-03-25 Friday 15:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.16), BD_Shape.inlines.hh (1.44): Some
+	  unwanted const qualifiers have been removed.	Some desirable
+	  const qualifiers have been added.
+
+2005-03-25 Friday 12:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.43): Use the proper constructor when
+	  building a BDS from a polyhedron.
+
+2005-03-25 Friday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/exceptions3.cc (1.6): Reflect the recent changes
+	  in the behavior of BDS methods for affine images and preimages.
+
+2005-03-25 Friday 10:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.15): The documentation of
+	  generalized_affine_image(const Linear_Expression&, const
+	  Relation_Symbol, const Linear_Expression&) is now consistent with
+	  the implementation.
+
+2005-03-25 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.42): Comments of
+	  generalized_affine_image(Variable, Relation_Symbol,
+	  Linear_Expression&, const Coefficient&) somewhat cleaned up.
+
+2005-03-25 Friday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.14): The documentation of
+	  generalized_affine_image(Variable, Relation_Symbol,
+	  Linear_Expression&, const Coefficient&); is now consistent with
+	  the documentation.
+
+2005-03-25 Friday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.41): Comments of
+	  affine_preimage(Variable, Linear_Expression&, const Coefficient&)
+	  somewhat cleaned up.
+
+2005-03-25 Friday 09:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.13): The documentation of
+	  affine_preimage(Variable, Linear_Expression&, const Coefficient&)
+	  is now consistent with the documentation.
+
+2005-03-25 Friday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.40): Comments of
+	  affine_image(Variable, Linear_Expression&, const Coefficient&)
+	  somewhat cleaned up.
+
+2005-03-25 Friday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.12): File comment fixed.  The
+	  documentation of affine_image(Variable, Linear_Expression&, const
+	  Coefficient&) is now consistent with the documentation.
+
+2005-03-24 Thursday 11:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.127): Comments
+	  concerning the widening and extrapolation predicates changed so
+	  as to state explicitly that the polyhedron referenced by the 1st
+	  handle must contain the polyhedron referenced by the second
+	  handle.
+
+2005-03-24 Thursday 09:48  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.22), Checked_Number.inlines.hh
+	  (1.29), Rounding.defs.hh (1.10): Permit rounding default
+	  direction different from CURRENT. Added Checked_Number methods to
+	  save/restore rounding mode.
+
+2005-03-23 Wednesday 19:21  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.21), Checked_Number.inlines.hh
+	  (1.28), checked_float.inlines.hh (1.32), checked_int.inlines.hh
+	  (1.28), checked_mpq.inlines.hh (1.16), checked_mpz.inlines.hh
+	  (1.19), checked_numeric_limits.hh (1.3): Added explicit 'signed'
+	  to integral types. Fixed set_special for mpz and mpq. Use always
+	  extended assignment for Checked_Number.
+
+2005-03-22 Tuesday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.14): Programs
+	  boundedh79extrapolation1 and nnc_boundedh79extrapolation1 removed
+	  from XFAIL_WITH_INT8 and added to XFAIL_WITH_INT8_A.
+
+2005-03-22 Tuesday 14:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.20), Checked_Number.inlines.hh
+	  (1.27), Result.defs.hh (1.9), checked.defs.hh (1.15),
+	  checked_ext.inlines.hh (1.14), checked_float.inlines.hh (1.31),
+	  checked_int.inlines.hh (1.27), checked_mpq.inlines.hh (1.15),
+	  checked_mpz.inlines.hh (1.18): Removed unused pred/succ. Don't
+	  return special result for representable values.
+
+2005-03-22 Tuesday 13:01  Matthew Mundell
+
+	* STANDARDS (grids.2): Take out the paragraph about the check_dump
+	  function.
+
+2005-03-22 Tuesday 13:00  Matthew Mundell
+
+	* tests/Grid/writecongruencesystem.cc (grids.2): Take out the dump
+	  comparisons.	Add find_variation checks.  Use endl instead of
+	  '\n'.
+
+2005-03-22 Tuesday 12:58  Matthew Mundell
+
+	* tests/Grid/congruence1.cc (grids.2): Take out all dump
+	  comparisons.	Use find_variation instead of check_ok.  Print
+	  fewer NOISY tracing messages.  Add dumps to the NOISY test
+	  failure messages.
+
+2005-03-22 Tuesday 12:55  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.2): Take out check_dump.  Create the
+	  comparison object in find_variation_template with a copy
+	  constructor.
+
+2005-03-22 Tuesday 12:54  Matthew Mundell
+
+	* src/Grid_public.cc (grids.2): Define the copy constructor.
+
+2005-03-22 Tuesday 12:53  Matthew Mundell
+
+	* src/Congruence_System.cc (grids.2): Use Congruence::ascii_load.
+
+2005-03-22 Tuesday 12:52  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh (grids.[2,2]): Add method
+	  ascii_load.
+
+2005-03-21 Monday 20:12  Matthew Mundell
+
+	* src/: Matrix.cc, Matrix.defs.hh (grids.[1,1]): Declare Grid and
+	  an operator== as friends.  Add method add_row.
+
+2005-03-21 Monday 20:03  Matthew Mundell
+
+	* doc/devref.doxyconf-html.in (grids.1): Add Grid, Congruence and
+	  Congruence_System files to INPUT.
+
+2005-03-21 Monday 19:59  Matthew Mundell
+
+	* src/Row.defs.hh (1.93): Take out dot following \brief.
+
+2005-03-21 Monday 19:52  Matthew Mundell
+
+	* src/Makefile.am (grids.1): Add Grid, Congruence and
+	  Congruence_System files to INCLUDE_FILES and libppl_la_SOURCES.
+
+2005-03-21 Monday 19:49  Matthew Mundell
+
+	* src/: Linear_Expression.defs.hh, Linear_Expression.inlines.hh
+	  (grids.[1,1]): Declare Congruence, two operator%='s and
+	  swap(Linear_Expression&, Linear_Expression&) as friends.  Add
+	  copy constructor which takes size and capacity.
+
+2005-03-21 Monday 19:35  Matthew Mundell
+
+	* src/Generator_System.defs.hh (grids.1): Declare Grid friendship.
+
+2005-03-21 Monday 19:34  Matthew Mundell
+
+	* src/Generator.defs.hh (grids.1): Declare Grid and
+	  Congruence_System as friends.
+
+2005-03-21 Monday 19:33  Matthew Mundell
+
+	* src/Constraint.defs.hh (grids.1): Declare Congruence a friend.
+
+2005-03-21 Monday 19:32  Matthew Mundell
+
+	* src/: Congruence.cc, Congruence.defs.hh, Congruence.inlines.hh,
+	  Congruence.types.hh, Congruence_System.cc,
+	  Congruence_System.defs.hh, Congruence_System.inlines.hh,
+	  Congruence_System.types.hh (grids.[1,1,1,1,1,1,1,1]): Initial
+	  revision.
+
+2005-03-21 Monday 19:30  Matthew Mundell
+
+	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (grids.[1,1]):
+	  Add gcdext_assign.
+
+2005-03-21 Monday 19:27  Matthew Mundell
+
+	* tests/ppl_test.hh (grids.1): Include the std and PPL namespaces.
+	  Define macro stringify, function checkdump and template
+	  find_variation_template.
+
+2005-03-21 Monday 19:24  Matthew Mundell
+
+	* tests/print.hh (grids.1): Set NOISY and VERY_NOISY from the
+	  associated directives.  Create the nout and vnout streams.
+
+2005-03-21 Monday 19:22  Matthew Mundell
+
+	* tests/Makefile.am (grids.1): Add Grid to SUBDIRS.
+
+2005-03-21 Monday 19:21  Matthew Mundell
+
+	* tests/Grid/: Makefile.in, congruence1.cc, congruencesystem1.cc,
+	  congruencesystem2.cc, grid1.cc, writecongruencesystem.cc
+	  (grids.[1,1,1,1,1,1]): Initial revision.
+
+2005-03-21 Monday 19:15  Matthew Mundell
+
+	* src/: Grid.defs.hh, Grid.inlines.hh, Grid.types.hh,
+	  Grid_Status.cc, Grid_Status.idefs.hh, Grid_Status.inlines.hh,
+	  Grid_conversion.cc, Grid_minimize.cc, Grid_nonpublic.cc,
+	  Grid_public.cc, Grid_simplify.cc (grids.[1,1,1,1,1,1,1,1,1,1,1]):
+	  Initial, partial, rough revision.
+
+2005-03-21 Monday 19:11  Matthew Mundell
+
+	* configure.ac (grids.1): Add tests/Grid/Makefile to
+	  AC_CONFIG_FILES.
+
+2005-03-21 Monday 19:09  Matthew Mundell
+
+	* STANDARDS (grids.1): Add "Standards for the Test Programs"
+	  section.
+
+2005-03-16 Wednesday 21:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.13): Added
+	  `boundedbhrz03extrapolation1' and
+	  `nnc_boundedbhrz03extrapolation1' to `XFAIL_WITH_INT8'.
+
+2005-03-16 Wednesday 07:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.44): The limited widening methods
+	  now immediately fall back to their non-limited counterparts when
+	  given an empty constraint system.
+
+2005-03-14 Monday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.108): Added `ppl_include_files.hh' to
+	  `noinst_HEADERS' and `BUILT_SOURCES'.
+
+2005-03-13 Sunday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BD_Shape.defs.hh (1.11), BD_Shape.inlines.hh (1.39):
+	  BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape&) now has
+	  its stop-points stored in a local, static array..
+
+2005-03-13 Sunday 20:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.107): Added `fpu-c99.inlines.hh' to
+	  `INCLUDE_FILES'.
+
+2005-03-13 Sunday 20:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.29): Added `build_header' to `EXTRA_DIST'.
+
+2005-03-13 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: addspacedims1.cc (1.4), addspacedims2.cc (1.4),
+	  addspacedims4.cc (1.4), addspacedims5.cc (1.4), addspacedims6.cc
+	  (1.4): Unused variables removed or commented out.
+
+2005-03-13 Sunday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.hh (1.2): Include "version.hh".
+
+2005-03-13 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/addspacedims3.cc (1.4): Useless variable removed.
+
+2005-03-13 Sunday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.143), build_header (1.1), src/BDS_Status.idefs.hh (1.6),
+	  src/BD_Shape.defs.hh (1.10), src/DB_Row.defs.hh (1.6),
+	  src/E_Rational.inlines.hh (1.7), src/Float.inlines.hh (1.7),
+	  src/Makefile.am (1.106), src/Ph_Status.idefs.hh (1.9),
+	  src/Polyhedron.defs.hh (1.269), src/checked_int.inlines.hh
+	  (1.26), src/ppl_header.bottom (1.7), src/ppl_header.hh (1.1),
+	  src/ppl_header.middle (1.6), src/ppl_header.top (1.9),
+	  tests/ppl_test.hh (1.19): New, simpler and less problematic
+	  machinery to build ppl_install.hh.  (The `build_header' script
+	  has been written by Abramo Bagnara.)
+
+2005-03-11 Friday 21:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/generalizedaffineimage14.cc (1.2): Copyright years
+	  fixed.
+
+2005-03-11 Friday 20:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.11), constraints2.cc (1.4),
+	  exceptions3.cc (1.5), generalizedaffineimage2.cc (1.4),
+	  generalizedaffineimage3.cc (1.4), polydifference1.cc (1.4),
+	  relations2.cc (1.4), relations3.cc (1.4), relations5.cc (1.4),
+	  writebdiffs1.cc (1.4), writebdiffs2.cc (1.4), writebdshape1.cc
+	  (1.1), writebdshape2.cc (1.1): We no longer call them "bounded
+	  differences": we call them "bounded difference shapes" or "BDS"
+	  instead.
+
+2005-03-11 Friday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.38),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.4): Fixed a bug in
+	  BD_Shape<T>::generalized_affine_image(Variable, const
+	  Relation_Symbol, const Linear_Expression&, const Coefficient&).
+
+2005-03-09 Wednesday 17:19  Matthew Mundell
+
+	* debian/libppl.docs (1.2): TODO is currently for internal use.
+
+2005-03-09 Wednesday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl.docs (altnum.1): file libppl.docs was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:37  Matthew Mundell
+
+	* debian/copyright (1.2): Move to libppl.copyright.
+
+2005-03-09 Wednesday 12:24  Matthew Mundell
+
+	* debian/: libppl-c.dirs (1.1), libppl-c.install (1.1),
+	  libppl-c.links (1.1), libppl-dev.doc-base (1.1), libppl-dev.docs
+	  (1.1), libppl-dev.links (1.1), libppl-gprolog.links (1.1),
+	  libppl-pwl.links (1.1), libppl-sicstus.links (1.1),
+	  libppl-swi.links (1.1), libppl-yap.links (1.1), libppl.copyright
+	  (1.1), libppl.doc-base (1.1), libppl.docs (1.1): Initial
+	  revisions.
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-c.dirs (altnum.1): file libppl-c.dirs was added on
+	  branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-c.install (altnum.1): file libppl-c.install was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-c.links (altnum.1): file libppl-c.links was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.docs (altnum.1): file libppl-dev.docs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.links (altnum.1): file libppl-dev.links was
+	  added on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 11:46  Matthew Mundell
+
+	* debian/libppl.install (1.2): Only install the main library
+	  (others now installed in interface packages).
+
+2005-03-09 Wednesday 11:45  Matthew Mundell
+
+	* debian/libppl-dev.dirs (1.2): Replace package specific doc dir
+	  with the general libppl doc dir.  Take out usr/lib/pkgconfig.
+
+2005-03-09 Wednesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/libppl-dev.dirs (altnum.1): file libppl-dev.dirs was added
+	  on branch altnum on 2006-10-29 19:26:52 +0000
+
+2005-03-09 Wednesday 11:43  Matthew Mundell
+
+	* debian/control (1.5): Rename to libppl.  Add a source section
+	  name.  Depend on graphviz and debhelper version of 4 or higher.
+	  Drop libppl-c-dev.  Complete the entries for the interface
+	  packages.
+
+2005-03-09 Wednesday 11:38  Matthew Mundell
+
+	* debian/: changelog (1.1), rules (1.1): Initial revision.
+
+2005-03-05 Saturday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.12),
+	  boundedbhrz03extrapolation1.cc (1.1): A new, very interesting,
+	  test program showing an analysis of linear invariants divided
+	  into phases: a first propagation phase (without widening),
+	  followed by a widening phase employing the "widening up to"
+	  technique and further preserving interval constraints.  Notice
+	  that neither the H79 nor the BHRZ03 limited extrapolations (used
+	  as widenings here) allow to obtain the desired postfixpoint for
+	  this example (since they lose the crucial constraint `k <= 1').
+	  Both the H79 and the BHRZ03 bounded extrapolation operators do
+	  achieve this result.
+
+2005-03-05 Saturday 13:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.43): Internal implementation class
+	  BW_Box was no longer used: removed.
+
+2005-03-05 Saturday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.42),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.4):
+	  Polyhedron::bounded_BHRZ03_extrapolation_assign() and
+	  Polyhedron::bounded_H79_extrapolation_assign() now use
+	  Bounding_Box::CC76_widening_assign() to make sure the interval
+	  constraints that are preserved do not cause termination problems.
+	  Test program boundedh79extrapolation1.cc (it was testing nothing
+	  anyway).
+
+2005-03-05 Saturday 13:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.10), generalizedaffineimage14.cc
+	  (1.1): New test for BD_Shape::generalized_affine_image().
+
+2005-03-05 Saturday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.cc (1.6), Bounding_Box.defs.hh (1.6): New
+	  method Constraint_System Bounding_Box::constraints() const.
+
+2005-03-05 Saturday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Bounding_Box.cc (1.5): Fixed
+	  Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+	  Iterator first, Iterator last).
+
+2005-03-05 Saturday 00:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Bounding_Box.cc (1.4), Bounding_Box.defs.hh (1.5): Added
+	  Bounding_Box::CC76_widening_assign(const Bounding_Box& y) and
+	  template <typename Iterator>
+	  Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+	  Iterator first, Iterator last).
+
+2005-03-05 Saturday 00:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.22), Interval.inlines.hh (1.21): Added
+	  non-const versions of accessors.
+
+2005-03-04 Friday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.9): Comments for
+	  CC76_extrapolation_assign(const BD_Shape& y) and
+	  CC76_extrapolation_assign(const BD_Shape& y, Iterator first,
+	  Iterator last) revised.
+
+2005-03-04 Friday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.268): Misleading variable name changed
+	  in the Polyhedron class documentation.
+
+2005-03-03 Thursday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (1.4): Now libppl-dev depends on libppl.
+
+2005-03-03 Thursday 15:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.37):
+	  BD_Shape::generalized_affine_image(const Linear_Expression&,
+	  const Relation_Symbol, const Linear_Expression&) improved.
+
+2005-03-03 Thursday 12:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/: libppl-dev.dirs (1.1), libppl-dev.install (1.1),
+	  libppl.dirs (1.1), libppl.install (1.1): Directories and
+	  installed files for packages libppl and libppl-dev.
+
+2005-03-03 Thursday 12:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (1.3): Packages named `libppl*' instead of `ppl*'.
+	  Dependency from g++ fixed.
+
+2005-03-03 Thursday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.170): Some headings properly capitalized.
+
+2005-03-02 Wednesday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.36): Simplified the logic of
+	  BD_Shape<T>::BD_Shape(const Polyhedron&, Complexity_Class).
+
+2005-03-02 Wednesday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.267): Befriend template <typename T>
+	  class BD_Shape.
+
+2005-03-02 Wednesday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.113): Use of simplex temporarily
+	  disabled in Polyhedron::shrink_bounding_box() until we have an
+	  efficient way to compute the topological closure of a constraint
+	  system.
+
+2005-03-02 Wednesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.35): Added an initial, very rough
+	  implementation of BD_Shape<T>::BD_Shape(const Polyhedron&,
+	  Complexity_Class).
+
+2005-03-01 Tuesday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/affinetrans.cc (1.4): Misleading variable name
+	  changed.
+
+2005-03-01 Tuesday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: affineimage1.cc (1.4), affineimage2.cc (1.4),
+	  affineimage3.cc (1.4), affineimage4.cc (1.4), affineimage5.cc
+	  (1.4), affineimage6.cc (1.4), affineimage7.cc (1.4),
+	  affinepreimage1.cc (1.4), affinepreimage2.cc (1.4),
+	  affinepreimage3.cc (1.4), affinepreimage4.cc (1.4),
+	  exceptions3.cc (1.4): Avoid declaring variables when a temporary
+	  would do the same thing more clearly.
+
+2005-03-01 Tuesday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.34), tests/BD_Shape/Makefile.am (1.9),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage13.cc (1.1),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.4),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.4):
+	  BD_Shape<T>::generalized_affine_image() can now handle any
+	  expression.
+
+2005-03-01 Tuesday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.33), tests/BD_Shape/Makefile.am (1.8),
+	  tests/BD_Shape/affinepreimage5.cc (1.1):
+	  BD_Shape<T>::affine_preimage() can now handle any expression.
+
+2005-03-01 Tuesday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.32), tests/BD_Shape/Makefile.am (1.7),
+	  tests/BD_Shape/affineimage8.cc (1.1),
+	  tests/BD_Shape/affineimage9.cc (1.1): BD_Shape<T>::affine_image()
+	  can now handle any expression.
+
+2005-03-01 Tuesday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.26): Wrong dependency fixed.
+
+2005-03-01 Tuesday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/control (1.2): Dependencies changed so as to depend on g++
+	  == 3.4.  Added autoconf, automake1.9, libtool and doxygen to
+	  Build-Depends.  (Thanks to Michael Tautschnig.)
+
+2005-02-28 Monday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/: compat (1.1), control (1.1), copyright (1.1): Initial
+	  drafts put under CVS control.
+
+2005-02-28 Monday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* debian/compat (altnum.1): file compat was added on branch altnum
+	  on 2006-10-29 19:26:52 +0000
+
+2005-02-28 Monday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.25): URL for the source fixed.
+
+2005-02-27 Sunday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/watchdog1.cc (1.4): Empty throw specification
+	  added to ~Timeout().
+
+2005-02-27 Sunday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.112): Slight simplification in
+	  Polyhedron::shrink_bounding_box(Box&, Complexity_Class).
+
+2005-02-27 Sunday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.8): Added declaration for BD_Shape(const
+	  Polyhedron&, Complexity_Class).
+
+2005-02-27 Sunday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.19), globals.inlines.hh (1.9): Class
+	  Throwable was missing a virtual destructor: added.
+
+2005-02-27 Sunday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.111):
+	  Polyhedron::shrink_bounding_box(Box&, Complexity_Class) improved.
+
+2005-02-27 Sunday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Handler.defs.hh (1.4), Handler.inlines.hh (1.3): Class
+	  Handler was missing a virtual destructor: added.
+
+2005-02-27 Sunday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.7): Imprecisions in the comments for
+	  BD_Shape(const Generator_System&) corrected.
+
+2005-02-27 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.31): On exit from
+	  BD_Shape<T>::BD_Shape(const Generator_System&), the DBM is always
+	  transitively closed.
+
+2005-02-27 Sunday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.30): No longer print spurious newlines
+	  in operator<<(std::ostream&, const BD_Shape<T>&).
+
+2005-02-27 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.110): Useless temporary removed and
+	  scope of one variable reduced in
+	  Polyhedron::shrink_bounding_box().
+
+2005-02-27 Sunday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.142): Added one more thing to do.
+
+2005-02-27 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/constraints1.cc (1.4): Needlessly long comment
+	  shortened.
+
+2005-02-27 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/fromgensys1.cc (1.2): Be quiet.
+
+2005-02-27 Sunday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.6), fromgensys1.cc (1.1): New
+	  test program for BD_Shape::BD_Shape(const Generator_System&).
+
+2005-02-27 Sunday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.29): BD_Shape::BD_Shape(const
+	  Generator_System&) implemented.
+
+2005-02-26 Saturday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.6): Added declaration for
+	  BD_Shape::BD_Shape(const Generator_System& gs).  Comments for
+	  BD_Shape::BD_Shape(const Constraint_System& cs) further improved.
+
+2005-02-26 Saturday 17:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.5): Comments for BD_Shape::BD_Shape(const
+	  Constraint_System& cs) improved.
+
+2005-02-24 Thursday 19:05  Matthew Mundell
+
+	* src/: Generator.defs.hh (1.103), Linear_System.cc (1.18): Correct
+	  comment typo.
+
+2005-02-24 Thursday 19:05  Matthew Mundell
+
+	* src/Constraint_System.defs.hh (1.9): Correct comment typos and
+	  clip off trailing whitespace.
+
+2005-02-22 Tuesday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.inlines.hh (1.5): Removed a pair of
+	  redundant parentheses.
+
+2005-02-18 Friday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Float.inlines.hh (1.6): Include <climits>.
+
+2005-02-18 Friday 21:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.2): Added more attributes to the
+	  specializations of std::numeric_limits for "checked" integer
+	  types.
+
+2005-02-18 Friday 18:55  Abramo Bagnara
+
+	* src/: Float.inlines.hh (1.5), checked_int.inlines.hh (1.25):
+	  Added U to make explicit unsignedness for constants.
+
+2005-02-18 Friday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.131): Useless type qualifiers removed.
+
+2005-02-18 Friday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Saturation_Matrix.cc (1.3), Saturation_Row.cc (1.6),
+	  Saturation_Row.defs.hh (1.5), Saturation_Row.inlines.hh (1.5),
+	  conversion.cc (1.68): Several methods speeded up.  Now bit
+	  positions are represented by means of unsigned longs and the
+	  invalid position is represented by ULONG_MAX.
+
+2005-02-18 Friday 15:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.105): Added checked_numeric_limits.hh to
+	  INCLUDE_FILES.
+
+2005-02-18 Friday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/empty5.cc (1.3): Allow for every definition of
+	  Coefficient.
+
+2005-02-18 Friday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_numeric_limits.hh (1.1): Specializations of
+	  std::numeric_limits for "checked" types (still incomplete as far
+	  as `round_style' is concerned).
+
+2005-02-17 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.28): BD_Shape<T>::contains() improved.
+
+2005-02-17 Thursday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.27): BD_Shape<T>::poly_hull_assign()
+	  improved.
+
+2005-02-17 Thursday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.26):
+	  BD_Shape<T>::poly_difference_assign() improved.
+
+2005-02-17 Thursday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.25):
+	  BD_Shape<T>::CC76_extrapolation_assign() improved.
+
+2005-02-17 Thursday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.24):
+	  BD_Shape<T>::CH78_widening_assign() improved.
+
+2005-02-17 Thursday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.23):
+	  BD_Shape<T>::limited_CH78_extrapolation_assign() improved.
+
+2005-02-17 Thursday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.22):
+	  BD_Shape<T>::intersection_assign() improved.
+
+2005-02-17 Thursday 18:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.21):
+	  BD_Shape<T>::CC76_narrowing_assign() improved.
+
+2005-02-17 Thursday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.20):
+	  BD_Shape<T>::add_space_dimensions_and_embed() improved.
+
+2005-02-17 Thursday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.19):
+	  BD_Shape<T>::add_space_dimensions_and_project() improved.
+
+2005-02-17 Thursday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.18): BD_Shape<T>::relation_with(const
+	  Constraint&) improved.
+
+2005-02-17 Thursday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.17): BD_Shape<T>::relation_with()
+	  improved.
+
+2005-02-16 Wednesday 17:34  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.5), Float.inlines.hh (1.4),
+	  checked_float.inlines.hh (1.30), checked_mpz.inlines.hh (1.17):
+	  Added support for assignment from mpz to floating type.
+
+2005-02-16 Wednesday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.16): Improved
+	  BD_Shape<T>::add_constraint().
+
+2005-02-16 Wednesday 16:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.15): Variables renamed in
+	  BD_Shape<T>::contains().
+
+2005-02-16 Wednesday 16:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.14): Variables renamed in
+	  BD_Shape<T>::concatenate_assign().
+
+2005-02-16 Wednesday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.13): Variable renamed in
+	  BD_Shape<T>::is_empty().
+
+2005-02-16 Wednesday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.12): Variable renamed in
+	  BD_Shape<T>::is_universe().
+
+2005-02-16 Wednesday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.11): Fixed
+	  BD_Shape<T>::limited_CC76_extrapolation_assign().
+
+2005-02-16 Wednesday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.10): Removed redundant declaration
+	  from BD_Shape<T>::add_constraint().
+
+2005-02-16 Wednesday 12:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.9):
+	  BD_Shape<T>::limited_CC76_extrapolation_assign() cleaned up.
+
+2005-02-15 Tuesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.80), src/Row.defs.hh (1.92), src/Row.inlines.hh
+	  (1.60), tests/ppl_test.hh (1.18), tests/BD_Shape/Makefile.am
+	  (1.5), tests/BD_Shape/addconstraints1.cc (1.3),
+	  tests/BD_Shape/addspacedims1.cc (1.3),
+	  tests/BD_Shape/addspacedims2.cc (1.3),
+	  tests/BD_Shape/addspacedims3.cc (1.3),
+	  tests/BD_Shape/addspacedims4.cc (1.3),
+	  tests/BD_Shape/addspacedims5.cc (1.3),
+	  tests/BD_Shape/addspacedims6.cc (1.3),
+	  tests/BD_Shape/addspacedims7.cc (1.3),
+	  tests/BD_Shape/affineimage1.cc (1.3),
+	  tests/BD_Shape/affineimage2.cc (1.3),
+	  tests/BD_Shape/affineimage3.cc (1.3),
+	  tests/BD_Shape/affineimage4.cc (1.3),
+	  tests/BD_Shape/affineimage5.cc (1.3),
+	  tests/BD_Shape/affineimage6.cc (1.3),
+	  tests/BD_Shape/affineimage7.cc (1.3),
+	  tests/BD_Shape/affinepreimage1.cc (1.3),
+	  tests/BD_Shape/affinepreimage2.cc (1.3),
+	  tests/BD_Shape/affinepreimage3.cc (1.3),
+	  tests/BD_Shape/affinepreimage4.cc (1.3),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.5),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.3),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.3),
+	  tests/BD_Shape/cc76narrowing1.cc (1.3),
+	  tests/BD_Shape/cc76narrowing2.cc (1.3),
+	  tests/BD_Shape/cc76narrowing3.cc (1.3),
+	  tests/BD_Shape/cc76narrowing4.cc (1.3),
+	  tests/BD_Shape/cc76narrowing5.cc (1.3),
+	  tests/BD_Shape/ch78widening1.cc (1.3),
+	  tests/BD_Shape/ch78widening2.cc (1.3),
+	  tests/BD_Shape/ch78widening3.cc (1.3),
+	  tests/BD_Shape/ch78widening4.cc (1.3),
+	  tests/BD_Shape/ch78widening5.cc (1.3),
+	  tests/BD_Shape/ch78widening6.cc (1.3),
+	  tests/BD_Shape/ch78widening7.cc (1.3),
+	  tests/BD_Shape/ch78widening8.cc (1.3),
+	  tests/BD_Shape/concatenate1.cc (1.3),
+	  tests/BD_Shape/concatenate2.cc (1.3),
+	  tests/BD_Shape/concatenate3.cc (1.3),
+	  tests/BD_Shape/concatenate4.cc (1.3),
+	  tests/BD_Shape/concatenate5.cc (1.3),
+	  tests/BD_Shape/constraints1.cc (1.3),
+	  tests/BD_Shape/constraints2.cc (1.3), tests/BD_Shape/contains1.cc
+	  (1.3), tests/BD_Shape/contains2.cc (1.3),
+	  tests/BD_Shape/contains3.cc (1.3), tests/BD_Shape/empty1.cc
+	  (1.3), tests/BD_Shape/empty2.cc (1.3), tests/BD_Shape/empty3.cc
+	  (1.3), tests/BD_Shape/empty4.cc (1.3), tests/BD_Shape/empty5.cc
+	  (1.2), tests/BD_Shape/equality1.cc (1.3),
+	  tests/BD_Shape/exceptions1.cc (1.3),
+	  tests/BD_Shape/exceptions2.cc (1.3),
+	  tests/BD_Shape/exceptions3.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.3),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.3),
+	  tests/BD_Shape/h79widening1.cc (1.3),
+	  tests/BD_Shape/intersection1.cc (1.3),
+	  tests/BD_Shape/intersection2.cc (1.3),
+	  tests/BD_Shape/intersection3.cc (1.3),
+	  tests/BD_Shape/intersection4.cc (1.3),
+	  tests/BD_Shape/intersection5.cc (1.3),
+	  tests/BD_Shape/intersection6.cc (1.3),
+	  tests/BD_Shape/intersection7.cc (1.3),
+	  tests/BD_Shape/intersection8.cc (1.3),
+	  tests/BD_Shape/limitedCC76extrapolation1.cc (1.3),
+	  tests/BD_Shape/limitedCC76extrapolation2.cc (1.3),
+	  tests/BD_Shape/limitedCC76extrapolation3.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation1.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation2.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation3.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation4.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation5.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation6.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation7.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation8.cc (1.3),
+	  tests/BD_Shape/limitedCH78extrapolation9.cc (1.3),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.3),
+	  tests/BD_Shape/mapspacedims1.cc (1.3),
+	  tests/BD_Shape/mapspacedims2.cc (1.3),
+	  tests/BD_Shape/mapspacedims3.cc (1.3),
+	  tests/BD_Shape/mapspacedims4.cc (1.3),
+	  tests/BD_Shape/maxspacedim.cc (1.4),
+	  tests/BD_Shape/polydifference1.cc (1.3),
+	  tests/BD_Shape/polydifference2.cc (1.3),
+	  tests/BD_Shape/polydifference3.cc (1.3),
+	  tests/BD_Shape/polydifference4.cc (1.3),
+	  tests/BD_Shape/polydifference5.cc (1.3),
+	  tests/BD_Shape/polydifference6.cc (1.3),
+	  tests/BD_Shape/polyhull1.cc (1.3), tests/BD_Shape/polyhull2.cc
+	  (1.3), tests/BD_Shape/polyhull3.cc (1.3),
+	  tests/BD_Shape/polyhull4.cc (1.3),
+	  tests/BD_Shape/removespacedims1.cc (1.3),
+	  tests/BD_Shape/removespacedims2.cc (1.3),
+	  tests/BD_Shape/removespacedims3.cc (1.3),
+	  tests/BD_Shape/timeelapse1.cc (1.3),
+	  tests/BD_Shape/timeelapse2.cc (1.3),
+	  tests/BD_Shape/timeelapse3.cc (1.3),
+	  tests/BD_Shape/timeelapse4.cc (1.3),
+	  tests/BD_Shape/timeelapse5.cc (1.3), tests/BD_Shape/universe1.cc
+	  (1.3), tests/BD_Shape/writebdiffs1.cc (1.3),
+	  tests/BD_Shape/writebdiffs2.cc (1.3), tests/Polyhedron/memory2.cc
+	  (1.8), tests/Polyhedron/polypowerset1.cc (1.2): Copyright years
+	  updated.
+
+2005-02-15 Tuesday 19:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.8): BD_Shape<T>::is_empty() fixed:
+	  add_round_down() was used instead of add_round_up().
+
+2005-02-15 Tuesday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: Makefile.am (1.4), empty5.cc (1.1): New test
+	  triggering a bug in BD_Shape<T>::is_empty().
+
+2005-02-15 Tuesday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator_System.cc (1.6): Spurious redeclaration removed
+	  from Generator_System::ascii_load().
+
+2005-02-15 Tuesday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.16): Make sure inline methods
+	  Linear_System::num_pending_rows() and
+	  Linear_System::unset_pending_rows() are defined before being
+	  invoked.
+
+2005-02-15 Tuesday 18:16  Matthew Mundell
+
+	* src/BDS_Status.idefs.hh (1.5): Correct a typo.
+
+2005-02-14 Monday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.169), interfaces/C/ppl_c.h.in (1.47),
+	  src/BDS_Status.idefs.hh (1.4), src/BD_Shape.inlines.hh (1.7),
+	  src/BHRZ03_Certificate.defs.hh (1.10), src/Bounding_Box.defs.hh
+	  (1.4), src/Checked_Number.cc (1.6), src/Checked_Number.defs.hh
+	  (1.19), src/Constraint.cc (1.48), src/DB_Matrix.defs.hh (1.4),
+	  src/DB_Row.defs.hh (1.5), src/Generator.cc (1.59),
+	  src/Generator.defs.hh (1.102), src/Limits.hh (1.6),
+	  src/Linear_Row.defs.hh (1.8), src/Linear_System.cc (1.17),
+	  src/Linear_System.inlines.hh (1.15), src/Makefile.am (1.104),
+	  src/Native_Integer.defs.hh (1.10), src/Ph_Status.idefs.hh (1.8),
+	  src/Poly_Con_Relation.defs.hh (1.26),
+	  src/Poly_Gen_Relation.defs.hh (1.24),
+	  src/Polyhedra_Powerset.inlines.hh (1.18), src/Polyhedron.defs.hh
+	  (1.266), src/Polyhedron_widenings.cc (1.41), src/Powerset.defs.hh
+	  (1.11), src/Result.defs.hh (1.8), src/Saturation_Row.defs.hh
+	  (1.4), src/checked.inlines.hh (1.15), src/checked_int.inlines.hh
+	  (1.24), src/conversion.cc (1.67), src/globals.defs.hh (1.18):
+	  Fixed several spelling mistakes.
+
+2005-02-14 Monday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Saturation_Row.cc (1.5), Saturation_Row.inlines.hh (1.4):
+	  Saturation_Row::operator[](), operator==(const Saturation_Row&,
+	  const Saturation_Row&) and operator!=(const Saturation_Row&,
+	  const Saturation_Row&) speeded up.
+
+2005-02-14 Monday 17:19  Matthew Mundell
+
+	* src/Linear_System.inlines.hh (1.14): Improve comment.
+
+2005-02-14 Monday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-ia32.inlines.hh (1.5): Define HIJACK_FPU only if it is
+	  not already defined.
+
+2005-02-14 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.6): Do not use assignment with
+	  unspecified rounding mode.
+
+2005-02-14 Monday 14:49  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.29): Added rounding functions.
+	  Treat specially negative zero representation.
+
+2005-02-13 Sunday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.7), compile (1.4), config.guess (1.27), config.sub
+	  (1.26), depcomp (1.9), missing (1.9), mkinstalldirs (1.8),
+	  Watchdog/INSTALL (1.4), Watchdog/compile (1.4),
+	  Watchdog/config.guess (1.11), Watchdog/config.sub (1.11),
+	  Watchdog/depcomp (1.7), Watchdog/missing (1.5),
+	  Watchdog/mkinstalldirs (1.4): Updated from Automake 1.9.5.
+
+2005-02-12 Saturday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.50): Little comment improvements.
+
+2005-02-12 Saturday 17:53  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.28): Fixed cut and paste typo.
+
+2005-02-12 Saturday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: E_Rational.defs.hh (1.4), E_Rational.inlines.hh (1.6):
+	  Alternative interface functions added to make a comparison with
+	  new code possible.
+
+2005-02-12 Saturday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (1.9): Formatting change.
+
+2005-02-12 Saturday 15:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.22), Watchdog/ltmain.sh (1.11): Updated from Libtool
+	  1.5.14.
+
+2005-02-11 Friday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.16), Linear_System.defs.hh (1.13),
+	  Linear_System.inlines.hh (1.13), Polyhedron_nonpublic.cc (1.46),
+	  Polyhedron_public.cc (1.49): Pending rows in a linear (constraint
+	  or generator) system make sense only when the system is part of a
+	  polyhedron.  The ordinary copy constructor and assignment
+	  operator now turn pending rows into non-pending ones.  A full
+	  copy constructor and pseudo-assignment are now provided for those
+	  cases where the copy and assignment must preserve the pending
+	  status of pending rows.  These changes fix the bug exhibited by
+	  tests/Polyhedron/constraints5.cc and
+	  tests/Polyhedron/generators7.cc.
+
+2005-02-11 Friday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.17): Comment reformatted.
+
+2005-02-11 Friday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/generators7.cc (1.2): Fixed and made silent.
+
+2005-02-11 Friday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BD_Shape/ascii_dump_load1.cc (1.4),
+	  Polyhedron/constraints5.cc (1.2): Be quiet.
+
+2005-02-11 Friday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.cc (1.6), Constraint_System.inlines.hh
+	  (1.3), Generator_System.cc (1.5), Generator_System.inlines.hh
+	  (1.3), Linear_System.cc (1.15): Missing assertions added.  Code
+	  formatting improved.
+
+2005-02-10 Thursday 22:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.11), generators7.cc (1.1): New
+	  test triggering a bug in Generator_System::insert(const
+	  Generator&).
+
+2005-02-10 Thursday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.10), constraints5.cc (1.1): New
+	  test triggering a bug in Constraint_System::insert(const
+	  Constraint&).
+
+2005-02-10 Thursday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/fpu-c99.inlines.hh (1.4): Code reformatted as per our coding
+	  standards.
+
+2005-02-10 Thursday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic (1.11):
+	  Prolog_put_ulong() fixed.
+
+2005-02-10 Thursday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: compiler.hh (1.4), fpu-ia32.inlines.hh (1.4): Code
+	  reformatted as per our coding standards.
+
+2005-02-10 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.inlines.hh (1.14): Missing "used declaration" added.
+
+2005-02-10 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.cc (1.5): Useless break removed.
+
+2005-02-10 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.9): Missing std:: qualifier added.
+
+2005-02-10 Thursday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.27): Declare strtof() and
+	  strtod() if they are not declared by <cstdlib>.
+
+2005-02-10 Thursday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.159): Check for the declaration of strtof() and
+	  strtod().
+
+2005-02-10 Thursday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.cc (1.4): All *.cc files must include
+	  <config.h> first.
+
+2005-02-10 Thursday 16:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.26): Declare strtold() if this is
+	  not declared by <cstdlib>.
+
+2005-02-10 Thursday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.158): Check for the declaration of strtold().
+
+2005-02-08 Tuesday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.sub (1.25), install-sh (1.13), Watchdog/config.sub (1.10),
+	  Watchdog/install-sh (1.10): Updated.
+
+2005-02-08 Tuesday 20:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.21), Watchdog/ltmain.sh (1.10): Updated from Libtool
+	  1.5.12.
+
+2005-02-08 Tuesday 12:01  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.17): Fixed use of native types.
+
+2005-02-08 Tuesday 11:49  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.18), src/Checked_Number.inlines.hh
+	  (1.26), tests/ppl_test.hh (1.16): Allow rounding direction
+	  save/restore for both Checked_Number and native types.
+
+2005-02-08 Tuesday 11:10  Abramo Bagnara
+
+	* src/: checked.inlines.hh (1.13), checked_int.inlines.hh (1.23),
+	  checked_mpz.inlines.hh (1.16): Pushed rounding to a lowest level.
+
+2005-02-03 Thursday 10:02  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.15): Added inline keyword.
+
+2005-01-31 Monday 22:33  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.14): Fixed two typos.
+
+2005-01-31 Monday 22:30  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.42), interfaces/C/ppl_c.cc (1.130),
+	  interfaces/Prolog/ppl_prolog.icc (1.154),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.31),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.27),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.74),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.98),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.65),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.90),
+	  src/Checked_Number.defs.hh (1.17), src/Checked_Number.inlines.hh
+	  (1.25), src/E_NIT.inlines.hh (1.8), src/E_Rational.inlines.hh
+	  (1.5), src/Interval.inlines.hh (1.20),
+	  src/Polyhedron_nonpublic.cc (1.45), src/Rounding.defs.hh (1.9),
+	  src/Rounding.inlines.hh (1.7), src/checked.defs.hh (1.14),
+	  src/checked.inlines.hh (1.12), src/checked_ext.defs.hh (1.6),
+	  src/checked_ext.inlines.hh (1.13), src/checked_float.inlines.hh
+	  (1.25), src/checked_int.inlines.hh (1.22),
+	  src/checked_mpq.inlines.hh (1.14), src/checked_mpz.inlines.hh
+	  (1.15), tests/ppl_test.hh (1.13): Better efficiency for
+	  Checked_Number.
+
+2005-01-29 Saturday 09:38  Abramo Bagnara
+
+	* src/Checked_Number.defs.hh (1.16), src/Checked_Number.inlines.hh
+	  (1.24), src/checked_ext.inlines.hh (1.12),
+	  src/checked_float.inlines.hh (1.24), tests/ppl_test.hh (1.12):
+	  More work to improve performance on extended numbers.
+
+2005-01-28 Friday 12:24  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.13), checked.inlines.hh (1.11),
+	  checked_ext.inlines.hh (1.11), checked_int.inlines.hh (1.21),
+	  checked_mpq.inlines.hh (1.13), checked_mpz.inlines.hh (1.14):
+	  Attempt to improve performance of extended numbers.
+
+2005-01-28 Friday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.9): Removed ascii_dump_load4 from
+	  XFAIL_WITH_INT8_A.
+
+2005-01-27 Thursday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (1.7): Fixed exact_neg(E_NIT<T>& to, const
+	  E_NIT<T>& x).
+
+2005-01-27 Thursday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: E_NIT.defs.hh (1.4), E_NIT.inlines.hh (1.6): Added
+	  constructor and assignment operator from Plus_Infinity.
+
+2005-01-27 Thursday 20:25  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.15), Checked_Number.inlines.hh
+	  (1.23): Added constructors for special values. Added functors to
+	  return special values.
+
+2005-01-27 Thursday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (1.5), tests/ppl_test.hh (1.11): Temporarily
+	  added a modified interface for E_NIT.
+
+2005-01-27 Thursday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.103): Include the declaration and definition
+	  of E_NIT and E_Rational into ppl.hh.
+
+2005-01-27 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.8), memory2.cc (1.7): Now
+	  memory2 fails only if a memory leak is detected.  Check for
+	  possible memory leaks caused by any type of exception.
+
+2005-01-27 Thursday 00:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.7), memory2.cc (1.6): Added
+	  much more serious tests to guard against the introduction of
+	  memory leaks.
+
+2005-01-26 Wednesday 19:13  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh (1.22), checked_ext.inlines.hh
+	  (1.10), checked_mpq.inlines.hh (1.12), checked_mpz.inlines.hh
+	  (1.13): Bug fixes for checked numbers I/O.
+
+2005-01-26 Wednesday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.5): Corrected and generalized.
+
+2005-01-26 Wednesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/ascii_dump_load1.cc (1.3): Be noisy so as to show
+	  that things are not working as expected.
+
+2005-01-26 Wednesday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (1.5): Use the function is_nonnegative()
+	  instead of the method is_nonnegative().
+
+2005-01-26 Wednesday 15:45  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.14), Checked_Number.inlines.hh
+	  (1.21), checked.defs.hh (1.12), checked.inlines.hh (1.10),
+	  checked_ext.defs.hh (1.5), checked_ext.inlines.hh (1.9),
+	  checked_float.inlines.hh (1.23), checked_int.inlines.hh (1.20),
+	  checked_mpq.inlines.hh (1.11), checked_mpz.inlines.hh (1.12): New
+	  string based I/O implementation for checked numbers.
+
+2005-01-26 Wednesday 09:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.10): Added void
+	  negate_round_down(Checked_Number<T, Policy>& to, const
+	  Checked_Number<T, Policy>& x).
+
+2005-01-26 Wednesday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.9): Added bool is_nonnegative(const
+	  Checked_Number<T, Policy>&).
+
+2005-01-26 Wednesday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.18): Added void print_constraints(const
+	  BD_Shape<T>&, const string&, ostream&).
+
+2005-01-25 Tuesday 23:23  Abramo Bagnara
+
+	* tests/ppl_test.hh (1.8): Fixed compilation for mpz coefficients.
+
+2005-01-25 Tuesday 23:22  Abramo Bagnara
+
+	* src/Makefile.am (1.102): Checked_* include files are now needed.
+
+2005-01-25 Tuesday 18:25  Abramo Bagnara
+
+	* src/BD_Shape.inlines.hh (1.4), src/DB_Row.inlines.hh (1.5),
+	  tests/ppl_test.hh (1.7), tests/BD_Shape/maxspacedim.cc (1.3): Use
+	  new templatic implementation for extended numbers.
+
+2005-01-25 Tuesday 18:22  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (1.8): Fixed +inf text representation.
+
+2005-01-25 Tuesday 18:22  Abramo Bagnara
+
+	* src/: Rounding.defs.hh (1.8), Rounding.inlines.hh (1.6): Faster
+	  versions for use inside library.
+
+2005-01-25 Tuesday 18:21  Abramo Bagnara
+
+	* src/: Checked_Number.cc (1.3), Checked_Number.defs.hh (1.13),
+	  Checked_Number.inlines.hh (1.20): Better support for extended
+	  numbers.
+
+2005-01-25 Tuesday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.4): Be quiet.
+
+2005-01-24 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.22): Temporary workaround to
+	  allow compilation on systems not providing fma(), fmaf() or
+	  fmal().
+
+2005-01-24 Monday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.13): No longer use GLPK's obsolete
+	  functions lpx_get_obj_c0() and lpx_get_col_coef().
+
+2005-01-23 Sunday 22:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.141), demos/ppl_lpsol/examples/README (1.1): Added a
+	  README file in demos/ppl_lpsol/examples explaining the origin of
+	  the examples there contained.
+
+2005-01-23 Sunday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.157): Check for the availability of fma(), fmaf()
+	  and fmal() in C++.
+
+2005-01-13 Thursday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.151): Mentioned the correction of the exception-safety
+	  bug.
+
+2005-01-13 Thursday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.265): Typo fixed.
+
+2005-01-13 Thursday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: DB_Matrix.inlines.hh (1.4), DB_Row.defs.hh (1.4),
+	  DB_Row.inlines.hh (1.4), DB_Row.types.hh (1.4): Corrected an
+	  exception-safety bug in class DB_Row. Methods resize_no_copy()
+	  and grow_no_copy() have been replaced by method
+	  expand_within_capacity().
+
+2005-01-13 Thursday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.59): For clarity, explicitly invoke
+	  Row_Impl_Handler constructor in the Row constructors.
+
+2005-01-13 Thursday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.91): Documentation fixed: `impl' is a member,
+	  not a method.
+
+2005-01-13 Thursday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.264): Fixed a couple of sentences.
+
+2005-01-13 Thursday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.140): One more item added.
+
+2005-01-13 Thursday 14:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.139): Two items added.
+
+2005-01-13 Thursday 09:26  Abramo Bagnara
+
+	* src/Rounding.defs.hh (1.7): Removed old declarations.
+
+2005-01-12 Wednesday 22:05  Abramo Bagnara
+
+	* src/Rounding.defs.hh (1.6): save & restore are public methods.
+
+2005-01-12 Wednesday 18:37  Abramo Bagnara
+
+	* src/: E_NIT.inlines.hh (1.4), E_Rational.inlines.hh (1.4),
+	  Interval.inlines.hh (1.19), Polyhedron_nonpublic.cc (1.44): Use
+	  constructor implicitly.
+
+2005-01-12 Wednesday 18:36  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.12), Checked_Number.inlines.hh
+	  (1.19), Rounding.defs.hh (1.5), Rounding.inlines.hh (1.5): Given
+	  access to rounding via Checked_Number class.
+
+2005-01-12 Wednesday 14:39  Abramo Bagnara
+
+	* src/: Checked_Number.cc (1.2), Checked_Number.defs.hh (1.11),
+	  Checked_Number.inlines.hh (1.18), Checked_Number.types.hh (1.5),
+	  Makefile.am (1.101): Moved result handler in policy.
+
+2005-01-12 Wednesday 10:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.3): The memory leak should be
+	  fixed.
+
+2005-01-12 Wednesday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc (1.79), Row.inlines.hh (1.58): Fixed a couple of
+	  stupid typos.
+
+2005-01-11 Tuesday 17:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.150), src/Row.cc (1.78), src/Row.defs.hh (1.90),
+	  src/Row.inlines.hh (1.57), src/Row.types.hh (1.9): Class Row now
+	  provately inherits from Row_Impl_Handler instead of having a
+	  member of class Row::Impl_Handler. Corrected the handling of the
+	  capacity_ member of Row_Impl_Handler, so as to have a clean make
+	  check when enabling more assertions. The handling of Row
+	  implementation made a bit more elegant by introducing the
+	  function allocate().
+
+2005-01-11 Tuesday 08:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/polypowerset1.cc (1.1): Added tests to guard
+	  against reintroduction of recently corrected errors in
+	  Polyhedra_Powerset constructors.
+
+2005-01-10 Monday 10:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.cc (1.77), src/Row.defs.hh (1.89), src/Row.inlines.hh
+	  (1.56), tests/Polyhedron/Makefile.am (1.6): Provided a quick fix
+	  for the potential memory leak error.
+
+2005-01-07 Friday 23:39  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.10), Checked_Number.inlines.hh
+	  (1.17), Makefile.am (1.100), Rounding.inlines.hh (1.4),
+	  checked.defs.hh (1.11), checked.inlines.hh (1.9),
+	  checked_ext.inlines.hh (1.7): Allows Checked_Number to handle
+	  extended values via appropriate policy.
+
+2005-01-06 Thursday 21:28  Abramo Bagnara
+
+	* src/: Float.defs.hh (1.4), checked_int.inlines.hh (1.19),
+	  checked_float.inlines.hh (1.21): White spaces fix.
+
+2005-01-06 Thursday 21:27  Abramo Bagnara
+
+	* src/: Extended_Number.defs.hh (1.5), Extended_Number.inlines.hh
+	  (1.7), Extended_Number.types.hh (1.4): Removed files.
+
+2005-01-02 Sunday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory2.cc (1.2): Force failure everywhere until
+	  the bug is fixed.
+
+2005-01-01 Saturday 23:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/: Makefile.am (1.5), memory2.cc (1.1): Another
+	  program to test the allocation error recovery facility of the
+	  library.
+
+2005-01-01 Saturday 23:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/memory1.cc (1.4): Comment added to help decipher
+	  a #else.
+
+2005-01-01 Saturday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.8): The first_phase() function now returns a
+	  Simplex_Status().
+
+2005-01-01 Saturday 14:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.129): Fixed
+	  ppl_Constraint_System_minimize() (thanks to Andrea Cimino).
+
+2005-01-01 Saturday 12:24  Abramo Bagnara
+
+	* src/: checked.inlines.hh (1.8), checked_float.inlines.hh (1.20),
+	  checked_int.inlines.hh (1.18), checked_mpq.inlines.hh (1.10),
+	  checked_mpz.inlines.hh (1.11): Renamed mod to more appropriate
+	  rem.
+
+2005-01-01 Saturday 12:10  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh (1.9), Checked_Number.inlines.hh
+	  (1.16), Extended_Number.defs.hh (1.4), Extended_Number.inlines.hh
+	  (1.6), checked.defs.hh (1.10), checked.inlines.hh (1.7),
+	  checked_ext.defs.hh (1.4), checked_ext.inlines.hh (1.6),
+	  checked_float.inlines.hh (1.19), checked_int.inlines.hh (1.17),
+	  checked_mpq.inlines.hh (1.9), checked_mpz.inlines.hh (1.10):
+	  Renamed mod to more appropriate rem.
+
+2005-01-01 Saturday 00:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.28), README (1.35), README.configure (1.13),
+	  configure.ac (1.156), Watchdog/Doubly_Linked_Object.defs.hh
+	  (1.2), Watchdog/Doubly_Linked_Object.inlines.hh (1.2),
+	  Watchdog/Doubly_Linked_Object.types.hh (1.2),
+	  Watchdog/EList.defs.hh (1.4), Watchdog/EList.inlines.hh (1.3),
+	  Watchdog/EList.types.hh (1.2), Watchdog/EList_Iterator.defs.hh
+	  (1.2), Watchdog/EList_Iterator.inlines.hh (1.3),
+	  Watchdog/EList_Iterator.types.hh (1.2), Watchdog/Handler.defs.hh
+	  (1.3), Watchdog/Handler.inlines.hh (1.2),
+	  Watchdog/Handler.types.hh (1.2), Watchdog/Makefile.am (1.18),
+	  Watchdog/Pending_Element.cc (1.2),
+	  Watchdog/Pending_Element.defs.hh (1.2),
+	  Watchdog/Pending_Element.inlines.hh (1.2),
+	  Watchdog/Pending_Element.types.hh (1.2), Watchdog/Pending_List.cc
+	  (1.2), Watchdog/Pending_List.defs.hh (1.2),
+	  Watchdog/Pending_List.inlines.hh (1.2),
+	  Watchdog/Pending_List.types.hh (1.2), Watchdog/README (1.10),
+	  Watchdog/Time.cc (1.2), Watchdog/Time.defs.hh (1.2),
+	  Watchdog/Time.inlines.hh (1.2), Watchdog/Time.types.hh (1.2),
+	  Watchdog/Watchdog.cc (1.19), Watchdog/Watchdog.defs.hh (1.15),
+	  Watchdog/Watchdog.inlines.hh (1.12), Watchdog/Watchdog.types.hh
+	  (1.6), Watchdog/configure.ac (1.25), Watchdog/pwl_header.top
+	  (1.6), demos/Makefile.am (1.6), demos/ppl_lcdd/Makefile.am
+	  (1.19), demos/ppl_lcdd/ppl_lcdd.cc (1.41),
+	  demos/ppl_lcdd/examples/Makefile.am (1.4),
+	  demos/ppl_lpsol/Makefile.am (1.12), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.12), demos/ppl_lpsol/examples/Makefile.am (1.3),
+	  doc/Makefile.am (1.32), doc/README.doc (1.2), doc/definitions.dox
+	  (1.168), doc/devref.tex (1.17), doc/ppl.sty (1.18), doc/user.tex
+	  (1.18), interfaces/Makefile.am (1.10), interfaces/C/Makefile.am
+	  (1.18), interfaces/C/ppl_c.cc (1.128), interfaces/C/ppl_c.h.in
+	  (1.46), interfaces/OCaml/Makefile.am (1.9),
+	  interfaces/Prolog/Makefile.am (1.27),
+	  interfaces/Prolog/Prolog_interface.dox (1.126),
+	  interfaces/Prolog/exceptions.hh (1.15),
+	  interfaces/Prolog/ppl_prolog.icc (1.153),
+	  interfaces/Prolog/track_allocation.hh (1.16),
+	  interfaces/Prolog/Ciao/Makefile.am (1.40),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.14),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.10),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.10),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.30),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.78),
+	  interfaces/Prolog/GNU/Makefile.am (1.44),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.4),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.8),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.50),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.26),
+	  interfaces/Prolog/SICStus/Makefile.am (1.51),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.24),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.73),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.4),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.5),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.10),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.11),
+	  interfaces/Prolog/SICStus/sp_pl_check.pl (1.2),
+	  interfaces/Prolog/SWI/Makefile.am (1.45),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.8),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.7),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.8),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.97),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.4),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.3),
+	  interfaces/Prolog/XSB/Makefile.am (1.32),
+	  interfaces/Prolog/XSB/expected2_int16 (1.4),
+	  interfaces/Prolog/XSB/expected2_int16_a (1.3),
+	  interfaces/Prolog/XSB/expected2_int32 (1.3),
+	  interfaces/Prolog/XSB/expected2_int32_a (1.2),
+	  interfaces/Prolog/XSB/expected2_int64 (1.2),
+	  interfaces/Prolog/XSB/expected2_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected2_int8 (1.2),
+	  interfaces/Prolog/XSB/expected2_int8_a (1.2),
+	  interfaces/Prolog/XSB/expected2_mpz (1.2),
+	  interfaces/Prolog/XSB/expected2_mpz_a (1.2),
+	  interfaces/Prolog/XSB/expected_int16 (1.2),
+	  interfaces/Prolog/XSB/expected_int16_a (1.2),
+	  interfaces/Prolog/XSB/expected_int32 (1.2),
+	  interfaces/Prolog/XSB/expected_int32_a (1.2),
+	  interfaces/Prolog/XSB/expected_int64 (1.2),
+	  interfaces/Prolog/XSB/expected_int64_a (1.2),
+	  interfaces/Prolog/XSB/expected_int8 (1.3),
+	  interfaces/Prolog/XSB/expected_int8_a (1.3),
+	  interfaces/Prolog/XSB/expected_mpz (1.2),
+	  interfaces/Prolog/XSB/expected_mpz_a (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.37),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.64),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.12),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.10),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.14),
+	  interfaces/Prolog/YAP/Makefile.am (1.35),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.89),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.8),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.9),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.5),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.7),
+	  interfaces/Prolog/tests/Makefile.am (1.3),
+	  interfaces/Prolog/tests/clpq.pl (1.5),
+	  interfaces/Prolog/tests/clpq2.pl (1.5),
+	  interfaces/Prolog/tests/expected2_int16 (1.4),
+	  interfaces/Prolog/tests/expected2_int16_a (1.3),
+	  interfaces/Prolog/tests/expected2_int32 (1.3),
+	  interfaces/Prolog/tests/expected2_int32_a (1.2),
+	  interfaces/Prolog/tests/expected2_int64 (1.2),
+	  interfaces/Prolog/tests/expected2_int64_a (1.2),
+	  interfaces/Prolog/tests/expected2_int8 (1.2),
+	  interfaces/Prolog/tests/expected2_int8_a (1.2),
+	  interfaces/Prolog/tests/expected2_mpz (1.2),
+	  interfaces/Prolog/tests/expected2_mpz_a (1.2),
+	  interfaces/Prolog/tests/expected_int16 (1.2),
+	  interfaces/Prolog/tests/expected_int16_a (1.2),
+	  interfaces/Prolog/tests/expected_int32 (1.2),
+	  interfaces/Prolog/tests/expected_int32_a (1.2),
+	  interfaces/Prolog/tests/expected_int64 (1.2),
+	  interfaces/Prolog/tests/expected_int64_a (1.2),
+	  interfaces/Prolog/tests/expected_int8 (1.3),
+	  interfaces/Prolog/tests/expected_int8_a (1.3),
+	  interfaces/Prolog/tests/expected_mpz (1.2),
+	  interfaces/Prolog/tests/expected_mpz_a (1.2),
+	  interfaces/Prolog/tests/pl_check.pl (1.7), m4/Makefile.am (1.12),
+	  m4/ac_check_gmp.m4 (1.20), m4/ac_cxx_attribute_weak.m4 (1.4),
+	  m4/ac_cxx_double_is_iec_559.m4 (1.2),
+	  m4/ac_cxx_flexible_arrays.m4 (1.9), m4/ac_cxx_float_is_iec_559.m4
+	  (1.2), m4/ac_cxx_long_double.m4 (1.3),
+	  m4/ac_cxx_long_double_is_iec_559.m4 (1.2), m4/ac_cxx_long_long.m4
+	  (1.2), src/Ask_Tell.defs.hh (1.4), src/Ask_Tell.inlines.hh (1.4),
+	  src/Ask_Tell.types.hh (1.2), src/BDS_Status.idefs.hh (1.3),
+	  src/BDS_Status.inlines.hh (1.3), src/BD_Shape.defs.hh (1.4),
+	  src/BD_Shape.inlines.hh (1.3), src/BD_Shape.types.hh (1.3),
+	  src/BHRZ03_Certificate.cc (1.7), src/BHRZ03_Certificate.defs.hh
+	  (1.9), src/BHRZ03_Certificate.inlines.hh (1.4),
+	  src/BHRZ03_Certificate.types.hh (1.2), src/Bounding_Box.cc (1.3),
+	  src/Bounding_Box.defs.hh (1.3), src/Bounding_Box.inlines.hh
+	  (1.3), src/Bounding_Box.types.hh (1.2), src/C_Polyhedron.cc
+	  (1.14), src/C_Polyhedron.defs.hh (1.31),
+	  src/C_Polyhedron.inlines.hh (1.24), src/C_Polyhedron.types.hh
+	  (1.8), src/Checked_Number.defs.hh (1.8),
+	  src/Checked_Number.inlines.hh (1.15), src/Checked_Number.types.hh
+	  (1.4), src/Coefficient.cc (1.2), src/Coefficient.defs.hh (1.2),
+	  src/Coefficient.inlines.hh (1.2), src/Coefficient.types.hh (1.6),
+	  src/Coefficient_traits_template.hh (1.3), src/Constraint.cc
+	  (1.47), src/Constraint.defs.hh (1.102), src/Constraint.inlines.hh
+	  (1.59), src/Constraint.types.hh (1.8), src/Constraint_System.cc
+	  (1.5), src/Constraint_System.defs.hh (1.8),
+	  src/Constraint_System.inlines.hh (1.2),
+	  src/Constraint_System.types.hh (1.2), src/DB_Matrix.defs.hh
+	  (1.3), src/DB_Matrix.inlines.hh (1.3), src/DB_Matrix.types.hh
+	  (1.3), src/DB_Row.defs.hh (1.3), src/DB_Row.inlines.hh (1.3),
+	  src/DB_Row.types.hh (1.3), src/Determinate.defs.hh (1.53),
+	  src/Determinate.inlines.hh (1.46), src/Determinate.types.hh
+	  (1.6), src/E_NIT.defs.hh (1.3), src/E_NIT.inlines.hh (1.3),
+	  src/E_NIT.types.hh (1.3), src/E_Rational.defs.hh (1.3),
+	  src/E_Rational.inlines.hh (1.3), src/E_Rational.types.hh (1.3),
+	  src/Extended_Number.defs.hh (1.3), src/Extended_Number.inlines.hh
+	  (1.5), src/Extended_Number.types.hh (1.3), src/Float.defs.hh
+	  (1.3), src/Float.inlines.hh (1.3), src/GMP_Integer.defs.hh (1.5),
+	  src/GMP_Integer.inlines.hh (1.4), src/GMP_Integer.types.hh (1.7),
+	  src/Generator.cc (1.58), src/Generator.defs.hh (1.101),
+	  src/Generator.inlines.hh (1.54), src/Generator.types.hh (1.8),
+	  src/Generator_System.cc (1.4), src/Generator_System.defs.hh
+	  (1.7), src/Generator_System.inlines.hh (1.2),
+	  src/Generator_System.types.hh (1.2), src/H79_Certificate.cc
+	  (1.6), src/H79_Certificate.defs.hh (1.9),
+	  src/H79_Certificate.inlines.hh (1.4),
+	  src/H79_Certificate.types.hh (1.2), src/Init.cc (1.15),
+	  src/Init.defs.hh (1.11), src/Init.types.hh (1.7), src/Interval.cc
+	  (1.10), src/Interval.defs.hh (1.21), src/Interval.inlines.hh
+	  (1.18), src/Interval.types.hh (1.8), src/Limits.hh (1.5),
+	  src/Linear_Expression.cc (1.4), src/Linear_Expression.defs.hh
+	  (1.8), src/Linear_Expression.inlines.hh (1.4),
+	  src/Linear_Expression.types.hh (1.2), src/Linear_Row.cc (1.5),
+	  src/Linear_Row.defs.hh (1.7), src/Linear_Row.inlines.hh (1.7),
+	  src/Linear_Row.types.hh (1.2), src/Linear_System.cc (1.14),
+	  src/Linear_System.defs.hh (1.12), src/Linear_System.inlines.hh
+	  (1.12), src/Linear_System.types.hh (1.2), src/Makefile.am (1.99),
+	  src/Matrix.cc (1.80), src/Matrix.defs.hh (1.68),
+	  src/Matrix.inlines.hh (1.43), src/Matrix.types.hh (1.8),
+	  src/NNC_Polyhedron.cc (1.13), src/NNC_Polyhedron.defs.hh (1.33),
+	  src/NNC_Polyhedron.inlines.hh (1.27), src/NNC_Polyhedron.types.hh
+	  (1.8), src/Native_Integer.defs.hh (1.9),
+	  src/Native_Integer.inlines.hh (1.9), src/Native_Integer.types.hh
+	  (1.7), src/Numeric_Format.defs.hh (1.3), src/Ph_Status.cc (1.6),
+	  src/Ph_Status.idefs.hh (1.7), src/Ph_Status.inlines.hh (1.5),
+	  src/Poly_Con_Relation.cc (1.9), src/Poly_Con_Relation.defs.hh
+	  (1.25), src/Poly_Con_Relation.inlines.hh (1.12),
+	  src/Poly_Con_Relation.types.hh (1.7), src/Poly_Gen_Relation.cc
+	  (1.9), src/Poly_Gen_Relation.defs.hh (1.23),
+	  src/Poly_Gen_Relation.inlines.hh (1.12),
+	  src/Poly_Gen_Relation.types.hh (1.7),
+	  src/Polyhedra_Powerset.defs.hh (1.14),
+	  src/Polyhedra_Powerset.inlines.hh (1.17),
+	  src/Polyhedra_Powerset.types.hh (1.2), src/Polyhedron.defs.hh
+	  (1.263), src/Polyhedron.inlines.hh (1.109),
+	  src/Polyhedron.types.hh (1.14), src/Polyhedron_chdims.cc (1.27),
+	  src/Polyhedron_nonpublic.cc (1.43), src/Polyhedron_public.cc
+	  (1.48), src/Polyhedron_widenings.cc (1.40), src/Powerset.defs.hh
+	  (1.10), src/Powerset.inlines.hh (1.9), src/Powerset.types.hh
+	  (1.2), src/Ptr_Iterator.defs.hh (1.3),
+	  src/Ptr_Iterator.inlines.hh (1.3), src/Ptr_Iterator.types.hh
+	  (1.3), src/Result.defs.hh (1.7), src/Result.inlines.hh (1.5),
+	  src/Rounding.defs.hh (1.4), src/Rounding.inlines.hh (1.3),
+	  src/Rounding.types.hh (1.3), src/Row.cc (1.76), src/Row.defs.hh
+	  (1.88), src/Row.inlines.hh (1.55), src/Row.types.hh (1.8),
+	  src/Saturation_Matrix.cc (1.2), src/Saturation_Matrix.defs.hh
+	  (1.2), src/Saturation_Matrix.inlines.hh (1.3),
+	  src/Saturation_Matrix.types.hh (1.2), src/Saturation_Row.cc
+	  (1.4), src/Saturation_Row.defs.hh (1.3),
+	  src/Saturation_Row.inlines.hh (1.3), src/Saturation_Row.types.hh
+	  (1.2), src/Topology.hh (1.10), src/Variable.cc (1.18),
+	  src/Variable.defs.hh (1.45), src/Variable.inlines.hh (1.21),
+	  src/Variable.types.hh (1.8), src/Widening_Function.defs.hh
+	  (1.10), src/Widening_Function.inlines.hh (1.9),
+	  src/Widening_Function.types.hh (1.2), src/algorithms.hh (1.39),
+	  src/checked.defs.hh (1.9), src/checked.inlines.hh (1.6),
+	  src/checked_ext.defs.hh (1.3), src/checked_ext.inlines.hh (1.5),
+	  src/checked_float.inlines.hh (1.18), src/checked_int.inlines.hh
+	  (1.16), src/checked_mpq.inlines.hh (1.8),
+	  src/checked_mpz.inlines.hh (1.9), src/compiler.hh (1.3),
+	  src/conversion.cc (1.66), src/float.types.hh (1.7),
+	  src/fpu-c99.inlines.hh (1.3), src/fpu-ia32.inlines.hh (1.3),
+	  src/fpu.defs.hh (1.3), src/globals.cc (1.20), src/globals.defs.hh
+	  (1.16), src/globals.inlines.hh (1.8), src/initializer.hh (1.10),
+	  src/max_space_dimension.hh (1.5), src/minimize.cc (1.40),
+	  src/ppl_header.top (1.8), src/simplex.cc (1.7), src/simplify.cc
+	  (1.42), src/swapping_sort.icc (1.8), src/version.cc (1.5),
+	  src/version.hh.in (1.10), tests/BBox.cc (1.8), tests/BBox.hh
+	  (1.6), tests/Makefile.am (1.242), tests/PFunction.cc (1.4),
+	  tests/PFunction.hh (1.4), tests/ehandlers.cc (1.6),
+	  tests/ehandlers.hh (1.10), tests/files.cc (1.6), tests/files.hh
+	  (1.6), tests/ppl_test.hh (1.6), tests/print.cc (1.14),
+	  tests/print.hh (1.17), tests/BD_Shape/relations1.cc (1.3),
+	  tests/BD_Shape/relations2.cc (1.3), tests/BD_Shape/relations3.cc
+	  (1.3), tests/BD_Shape/relations4.cc (1.3),
+	  tests/BD_Shape/relations5.cc (1.3),
+	  tests/Polyhedron/CbecomesNNC1.cc (1.3),
+	  tests/Polyhedron/Makefile.am (1.4),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.3),
+	  tests/Polyhedron/NNCminimize1.cc (1.3),
+	  tests/Polyhedron/NNCminimize2.cc (1.3),
+	  tests/Polyhedron/NNCminimize3.cc (1.3),
+	  tests/Polyhedron/NNCminimize4.cc (1.3),
+	  tests/Polyhedron/NNCminimize5.cc (1.3),
+	  tests/Polyhedron/NNCminimize6.cc (1.3), tests/Polyhedron/README
+	  (1.3), tests/Polyhedron/addconstraint1.cc (1.3),
+	  tests/Polyhedron/addconstraint2.cc (1.3),
+	  tests/Polyhedron/addconstraint3.cc (1.3),
+	  tests/Polyhedron/addconstraints1.cc (1.3),
+	  tests/Polyhedron/addconstraints10.cc (1.3),
+	  tests/Polyhedron/addconstraints11.cc (1.3),
+	  tests/Polyhedron/addconstraints12.cc (1.3),
+	  tests/Polyhedron/addconstraints13.cc (1.3),
+	  tests/Polyhedron/addconstraints2.cc (1.3),
+	  tests/Polyhedron/addconstraints3.cc (1.3),
+	  tests/Polyhedron/addconstraints4.cc (1.3),
+	  tests/Polyhedron/addconstraints5.cc (1.3),
+	  tests/Polyhedron/addconstraints6.cc (1.3),
+	  tests/Polyhedron/addconstraints7.cc (1.3),
+	  tests/Polyhedron/addconstraints8.cc (1.3),
+	  tests/Polyhedron/addconstraints9.cc (1.3),
+	  tests/Polyhedron/addgenerator1.cc (1.3),
+	  tests/Polyhedron/addgenerator2.cc (1.3),
+	  tests/Polyhedron/addgenerator3.cc (1.3),
+	  tests/Polyhedron/addgenerator4.cc (1.3),
+	  tests/Polyhedron/addgenerator5.cc (1.3),
+	  tests/Polyhedron/addgenerators1.cc (1.3),
+	  tests/Polyhedron/addgenerators10.cc (1.3),
+	  tests/Polyhedron/addgenerators11.cc (1.3),
+	  tests/Polyhedron/addgenerators12.cc (1.3),
+	  tests/Polyhedron/addgenerators13.cc (1.3),
+	  tests/Polyhedron/addgenerators2.cc (1.3),
+	  tests/Polyhedron/addgenerators3.cc (1.3),
+	  tests/Polyhedron/addgenerators4.cc (1.3),
+	  tests/Polyhedron/addgenerators5.cc (1.3),
+	  tests/Polyhedron/addgenerators6.cc (1.3),
+	  tests/Polyhedron/addgenerators7.cc (1.3),
+	  tests/Polyhedron/addgenerators8.cc (1.3),
+	  tests/Polyhedron/addgenerators9.cc (1.3),
+	  tests/Polyhedron/addspacedims1.cc (1.3),
+	  tests/Polyhedron/addspacedims10.cc (1.3),
+	  tests/Polyhedron/addspacedims11.cc (1.3),
+	  tests/Polyhedron/addspacedims12.cc (1.3),
+	  tests/Polyhedron/addspacedims13.cc (1.3),
+	  tests/Polyhedron/addspacedims2.cc (1.3),
+	  tests/Polyhedron/addspacedims3.cc (1.3),
+	  tests/Polyhedron/addspacedims4.cc (1.3),
+	  tests/Polyhedron/addspacedims5.cc (1.3),
+	  tests/Polyhedron/addspacedims6.cc (1.3),
+	  tests/Polyhedron/addspacedims7.cc (1.3),
+	  tests/Polyhedron/addspacedims8.cc (1.3),
+	  tests/Polyhedron/addspacedims9.cc (1.3),
+	  tests/Polyhedron/affineimage1.cc (1.3),
+	  tests/Polyhedron/affineimage2.cc (1.3),
+	  tests/Polyhedron/affineimage3.cc (1.3),
+	  tests/Polyhedron/affineimage4.cc (1.3),
+	  tests/Polyhedron/affineimage5.cc (1.3),
+	  tests/Polyhedron/affineimage6.cc (1.3),
+	  tests/Polyhedron/affineimage7.cc (1.3),
+	  tests/Polyhedron/affineimage8.cc (1.3),
+	  tests/Polyhedron/affineimage9.cc (1.3),
+	  tests/Polyhedron/affinepreimage1.cc (1.3),
+	  tests/Polyhedron/affinepreimage10.cc (1.3),
+	  tests/Polyhedron/affinepreimage2.cc (1.3),
+	  tests/Polyhedron/affinepreimage3.cc (1.3),
+	  tests/Polyhedron/affinepreimage4.cc (1.3),
+	  tests/Polyhedron/affinepreimage5.cc (1.3),
+	  tests/Polyhedron/affinepreimage6.cc (1.3),
+	  tests/Polyhedron/affinepreimage7.cc (1.3),
+	  tests/Polyhedron/affinepreimage8.cc (1.3),
+	  tests/Polyhedron/affinepreimage9.cc (1.3),
+	  tests/Polyhedron/affinetrans.cc (1.3),
+	  tests/Polyhedron/append1.cc (1.3), tests/Polyhedron/append2.cc
+	  (1.3), tests/Polyhedron/ascii_dump_load1.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.3),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.3),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.3),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.3),
+	  tests/Polyhedron/bhrz03widening1.cc (1.3),
+	  tests/Polyhedron/bhrz03widening10.cc (1.3),
+	  tests/Polyhedron/bhrz03widening11.cc (1.3),
+	  tests/Polyhedron/bhrz03widening12.cc (1.3),
+	  tests/Polyhedron/bhrz03widening13.cc (1.3),
+	  tests/Polyhedron/bhrz03widening14.cc (1.3),
+	  tests/Polyhedron/bhrz03widening15.cc (1.3),
+	  tests/Polyhedron/bhrz03widening16.cc (1.3),
+	  tests/Polyhedron/bhrz03widening17.cc (1.3),
+	  tests/Polyhedron/bhrz03widening18.cc (1.3),
+	  tests/Polyhedron/bhrz03widening19.cc (1.3),
+	  tests/Polyhedron/bhrz03widening2.cc (1.3),
+	  tests/Polyhedron/bhrz03widening3.cc (1.3),
+	  tests/Polyhedron/bhrz03widening4.cc (1.3),
+	  tests/Polyhedron/bhrz03widening5.cc (1.3),
+	  tests/Polyhedron/bhrz03widening6.cc (1.3),
+	  tests/Polyhedron/bhrz03widening7.cc (1.3),
+	  tests/Polyhedron/bhrz03widening8.cc (1.3),
+	  tests/Polyhedron/bhrz03widening9.cc (1.3),
+	  tests/Polyhedron/bhz03widening1.cc (1.3),
+	  tests/Polyhedron/bhz03widening2.cc (1.3),
+	  tests/Polyhedron/bhz03widening3.cc (1.3),
+	  tests/Polyhedron/bhz03widening4.cc (1.3),
+	  tests/Polyhedron/bhz03widening5.cc (1.3),
+	  tests/Polyhedron/bhz03widening6.cc (1.3),
+	  tests/Polyhedron/bounded1.cc (1.3),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.3),
+	  tests/Polyhedron/boundingbox1.cc (1.3),
+	  tests/Polyhedron/boundingbox2.cc (1.3),
+	  tests/Polyhedron/boundingbox3.cc (1.3),
+	  tests/Polyhedron/boundingbox4.cc (1.3),
+	  tests/Polyhedron/boundingbox5.cc (1.3),
+	  tests/Polyhedron/bounds1.cc (1.3), tests/Polyhedron/bounds2.cc
+	  (1.3), tests/Polyhedron/concatenate1.cc (1.3),
+	  tests/Polyhedron/concatenate2.cc (1.3),
+	  tests/Polyhedron/concatenate3.cc (1.3),
+	  tests/Polyhedron/concatenate4.cc (1.3),
+	  tests/Polyhedron/concatenate5.cc (1.3),
+	  tests/Polyhedron/concatenate6.cc (1.3),
+	  tests/Polyhedron/constraints1.cc (1.3),
+	  tests/Polyhedron/constraints2.cc (1.3),
+	  tests/Polyhedron/constraints3.cc (1.3),
+	  tests/Polyhedron/constraints4.cc (1.3),
+	  tests/Polyhedron/contains1.cc (1.3),
+	  tests/Polyhedron/contains2.cc (1.3),
+	  tests/Polyhedron/contains3.cc (1.3),
+	  tests/Polyhedron/contains4.cc (1.3),
+	  tests/Polyhedron/contains5.cc (1.3),
+	  tests/Polyhedron/disjoint1.cc (1.3),
+	  tests/Polyhedron/disjoint2.cc (1.3),
+	  tests/Polyhedron/disjoint3.cc (1.3),
+	  tests/Polyhedron/dualhypercubes.cc (1.3),
+	  tests/Polyhedron/empty1.cc (1.3), tests/Polyhedron/equals1.cc
+	  (1.3), tests/Polyhedron/exceptions1.cc (1.3),
+	  tests/Polyhedron/exceptions2.cc (1.3),
+	  tests/Polyhedron/exceptions3.cc (1.3),
+	  tests/Polyhedron/expandspacedim1.cc (1.3),
+	  tests/Polyhedron/expandspacedim2.cc (1.3),
+	  tests/Polyhedron/foldspacedims1.cc (1.3),
+	  tests/Polyhedron/foldspacedims2.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.3),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.3),
+	  tests/Polyhedron/generators1.cc (1.3),
+	  tests/Polyhedron/generators2.cc (1.3),
+	  tests/Polyhedron/generators3.cc (1.3),
+	  tests/Polyhedron/generators4.cc (1.3),
+	  tests/Polyhedron/generators5.cc (1.3),
+	  tests/Polyhedron/generators6.cc (1.3),
+	  tests/Polyhedron/geomcovers1.cc (1.3),
+	  tests/Polyhedron/h79widening1.cc (1.3),
+	  tests/Polyhedron/h79widening2.cc (1.3),
+	  tests/Polyhedron/h79widening3.cc (1.3),
+	  tests/Polyhedron/h79widening4.cc (1.3),
+	  tests/Polyhedron/h79widening5.cc (1.3),
+	  tests/Polyhedron/h79widening6.cc (1.3),
+	  tests/Polyhedron/h79widening7.cc (1.3),
+	  tests/Polyhedron/h79widening8.cc (1.3),
+	  tests/Polyhedron/intersection1.cc (1.3),
+	  tests/Polyhedron/intersection10.cc (1.3),
+	  tests/Polyhedron/intersection11.cc (1.3),
+	  tests/Polyhedron/intersection2.cc (1.3),
+	  tests/Polyhedron/intersection3.cc (1.3),
+	  tests/Polyhedron/intersection4.cc (1.3),
+	  tests/Polyhedron/intersection5.cc (1.3),
+	  tests/Polyhedron/intersection6.cc (1.3),
+	  tests/Polyhedron/intersection7.cc (1.3),
+	  tests/Polyhedron/intersection8.cc (1.3),
+	  tests/Polyhedron/intersection9.cc (1.3),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.3),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.3),
+	  tests/Polyhedron/linearpartition1.cc (1.3),
+	  tests/Polyhedron/linearpartition2.cc (1.3),
+	  tests/Polyhedron/linearpartition3.cc (1.3),
+	  tests/Polyhedron/linearpartition4.cc (1.3),
+	  tests/Polyhedron/linexpression1.cc (1.3),
+	  tests/Polyhedron/mapspacedims1.cc (1.3),
+	  tests/Polyhedron/mapspacedims2.cc (1.3),
+	  tests/Polyhedron/mapspacedims3.cc (1.3),
+	  tests/Polyhedron/mapspacedims4.cc (1.3),
+	  tests/Polyhedron/max_min1.cc (1.3), tests/Polyhedron/max_min2.cc
+	  (1.3), tests/Polyhedron/maxspacedim1.cc (1.3),
+	  tests/Polyhedron/mc91.cc (1.3), tests/Polyhedron/membytes1.cc
+	  (1.3), tests/Polyhedron/membytes2.cc (1.3),
+	  tests/Polyhedron/memory1.cc (1.3),
+	  tests/Polyhedron/minconstraints1.cc (1.3),
+	  tests/Polyhedron/minconstraints2.cc (1.3),
+	  tests/Polyhedron/minconstraints3.cc (1.3),
+	  tests/Polyhedron/minconstraints4.cc (1.3),
+	  tests/Polyhedron/mingenerators1.cc (1.3),
+	  tests/Polyhedron/mingenerators2.cc (1.3),
+	  tests/Polyhedron/mingenerators3.cc (1.3),
+	  tests/Polyhedron/onepoint.cc (1.3), tests/Polyhedron/permute.cc
+	  (1.3), tests/Polyhedron/polydifference1.cc (1.3),
+	  tests/Polyhedron/polydifference2.cc (1.3),
+	  tests/Polyhedron/polydifference3.cc (1.3),
+	  tests/Polyhedron/polydifference4.cc (1.3),
+	  tests/Polyhedron/polydifference5.cc (1.3),
+	  tests/Polyhedron/polydifference6.cc (1.3),
+	  tests/Polyhedron/polydifference7.cc (1.3),
+	  tests/Polyhedron/polydifference8.cc (1.3),
+	  tests/Polyhedron/polydifference9.cc (1.3),
+	  tests/Polyhedron/polyhull1.cc (1.3),
+	  tests/Polyhedron/polyhull10.cc (1.3),
+	  tests/Polyhedron/polyhull11.cc (1.3),
+	  tests/Polyhedron/polyhull2.cc (1.3),
+	  tests/Polyhedron/polyhull3.cc (1.3),
+	  tests/Polyhedron/polyhull4.cc (1.3),
+	  tests/Polyhedron/polyhull5.cc (1.3),
+	  tests/Polyhedron/polyhull6.cc (1.3),
+	  tests/Polyhedron/polyhull7.cc (1.3),
+	  tests/Polyhedron/polyhull8.cc (1.3),
+	  tests/Polyhedron/polyhull9.cc (1.3),
+	  tests/Polyhedron/randphull1.cc (1.3),
+	  tests/Polyhedron/randphull2.cc (1.3),
+	  tests/Polyhedron/relations1.cc (1.3),
+	  tests/Polyhedron/relations10.cc (1.3),
+	  tests/Polyhedron/relations11.cc (1.3),
+	  tests/Polyhedron/relations12.cc (1.3),
+	  tests/Polyhedron/relations13.cc (1.3),
+	  tests/Polyhedron/relations14.cc (1.3),
+	  tests/Polyhedron/relations15.cc (1.3),
+	  tests/Polyhedron/relations16.cc (1.3),
+	  tests/Polyhedron/relations17.cc (1.3),
+	  tests/Polyhedron/relations18.cc (1.3),
+	  tests/Polyhedron/relations19.cc (1.3),
+	  tests/Polyhedron/relations2.cc (1.3),
+	  tests/Polyhedron/relations3.cc (1.3),
+	  tests/Polyhedron/relations4.cc (1.3),
+	  tests/Polyhedron/relations5.cc (1.3),
+	  tests/Polyhedron/relations6.cc (1.3),
+	  tests/Polyhedron/relations7.cc (1.3),
+	  tests/Polyhedron/relations8.cc (1.3),
+	  tests/Polyhedron/relations9.cc (1.3),
+	  tests/Polyhedron/removespacedims1.cc (1.3),
+	  tests/Polyhedron/removespacedims10.cc (1.3),
+	  tests/Polyhedron/removespacedims2.cc (1.3),
+	  tests/Polyhedron/removespacedims3.cc (1.3),
+	  tests/Polyhedron/removespacedims4.cc (1.3),
+	  tests/Polyhedron/removespacedims5.cc (1.3),
+	  tests/Polyhedron/removespacedims6.cc (1.3),
+	  tests/Polyhedron/removespacedims7.cc (1.3),
+	  tests/Polyhedron/removespacedims8.cc (1.3),
+	  tests/Polyhedron/removespacedims9.cc (1.3),
+	  tests/Polyhedron/smm1.cc (1.3), tests/Polyhedron/timeelapse1.cc
+	  (1.3), tests/Polyhedron/timeelapse2.cc (1.3),
+	  tests/Polyhedron/timeelapse3.cc (1.3),
+	  tests/Polyhedron/timeelapse4.cc (1.3),
+	  tests/Polyhedron/timeelapse5.cc (1.3),
+	  tests/Polyhedron/timeelapse6.cc (1.3),
+	  tests/Polyhedron/timeelapse7.cc (1.3),
+	  tests/Polyhedron/timeelapse8.cc (1.3),
+	  tests/Polyhedron/timeelapse9.cc (1.3),
+	  tests/Polyhedron/topclosed1.cc (1.3),
+	  tests/Polyhedron/topclosed2.cc (1.3),
+	  tests/Polyhedron/topclosed3.cc (1.3),
+	  tests/Polyhedron/topclosure1.cc (1.3),
+	  tests/Polyhedron/topclosure2.cc (1.3),
+	  tests/Polyhedron/topclosure3.cc (1.3),
+	  tests/Polyhedron/topclosure4.cc (1.3),
+	  tests/Polyhedron/universe1.cc (1.3),
+	  tests/Polyhedron/universe2.cc (1.3),
+	  tests/Polyhedron/universe3.cc (1.3),
+	  tests/Polyhedron/universe4.cc (1.3),
+	  tests/Polyhedron/universe5.cc (1.3),
+	  tests/Polyhedron/universe6.cc (1.3),
+	  tests/Polyhedron/universe7.cc (1.3),
+	  tests/Polyhedron/watchdog1.cc (1.3),
+	  tests/Polyhedron/writeconsys1.cc (1.3),
+	  tests/Polyhedron/writegensys1.cc (1.3),
+	  tests/Polyhedron/writegensys2.cc (1.3),
+	  tests/Polyhedron/writegensys3.cc (1.3),
+	  tests/Polyhedron/writepolyhedron1.cc (1.3),
+	  tests/Polyhedron/writepolyhedron2.cc (1.3),
+	  tests/Polyhedron/writepolyhedron3.cc (1.3),
+	  tests/Polyhedron/writerelation1.cc (1.3),
+	  tests/Polyhedron/writevariable1.cc (1.3), utils/Makefile.am
+	  (1.2), utils/timings.cc (1.2), utils/timings.hh (1.2): Copyright
+	  years extended.
+
+2004-12-31 Friday 23:36  Abramo Bagnara
+
+	* src/: Extended_Number.inlines.hh (1.4), checked_ext.inlines.hh
+	  (1.4), checked_float.inlines.hh (1.17): Added comparison and
+	  arithmetic binary operators.
+
+2004-12-31 Friday 23:36  Abramo Bagnara
+
+	* src/Result.defs.hh (1.6): Added V_INF_DIV_INF.
+
+2004-12-31 Friday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (1.3): Added membytes2 to
+	  XFAIL_WITH_INT8_A.
+
+2004-12-31 Friday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.6): ConSys renamed to Constraint_System in
+	  comments and error messages.
+
+2004-12-31 Friday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16_a (1.2), expected_int32 (1.3),
+	  expected_int32_a (1.3), expected_int64 (1.3), expected_int64_a
+	  (1.3): Adapted to recent changes in ppl_lpsol.
+
+2004-12-31 Friday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected_int8 (1.2), tests/expected_int8
+	  (1.2): Adapted to the recent changes in the implementation of
+	  checked numbers.
+
+2004-12-31 Friday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: XSB/expected2_int16_a (1.2),
+	  XSB/expected_int8_a (1.2), tests/expected2_int16_a (1.2),
+	  tests/expected_int8_a (1.2): Adapted to the recent changes in the
+	  implementation of checked numbers.
+
+2004-12-31 Friday 13:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected2_int16 (1.3): Adapted to the
+	  recent changes in the implementation of checked numbers.
+
+2004-12-31 Friday 13:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/tests/expected2_int16 (1.3): Adapted to the
+	  recent changes in the implementation of checked numbers.
+
+2004-12-31 Friday 13:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.39),
+	  interfaces/Prolog/GNU/Makefile.am (1.43),
+	  interfaces/Prolog/SICStus/Makefile.am (1.50),
+	  interfaces/Prolog/SWI/Makefile.am (1.44),
+	  interfaces/Prolog/XSB/Makefile.am (1.31),
+	  demos/ppl_lcdd/Makefile.am (1.18), demos/ppl_lpsol/Makefile.am
+	  (1.11), interfaces/Prolog/YAP/Makefile.am (1.34): When checking
+	  for differences between the obtained and the expected output, use
+	  `diff -u' instead of `diff -q'.
+
+2004-12-31 Friday 13:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.5): Comment fixed.
+
+2004-12-31 Friday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.4): Variable-length automatic arrays are not
+	  (yet) standard in C++: use vectors instead.
+
+2004-12-31 Friday 08:57  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh (1.14),
+	  Extended_Number.inlines.hh (1.3), Result.defs.hh (1.5),
+	  Result.inlines.hh (1.4), checked_ext.inlines.hh (1.3),
+	  checked_float.inlines.hh (1.16), checked_int.inlines.hh (1.15),
+	  checked_mpq.inlines.hh (1.7), checked_mpz.inlines.hh (1.8):
+	  Discriminate between special values sources.
+
+2004-12-30 Thursday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a (1.3): Adapted to the recent
+	  changes to ppl_lpsol.
+
+2004-12-30 Thursday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.100): Avoid a couple of long lines.
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/adlittle.mps (altnum.1): file
+	  adlittle.mps was added on branch altnum on 2006-10-29 19:26:55
+	  +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/blend.mps (altnum.1): file blend.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/boeing1.mps (altnum.1): file boeing1.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/boeing2.mps (altnum.1): file boeing2.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/kb2.mps (altnum.1): file kb2.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/mip.mps (altnum.1): file mip.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/sc105.mps (altnum.1): file sc105.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/sc50a.mps (altnum.1): file sc50a.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/sc50b.mps (altnum.1): file sc50b.mps was
+	  added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/examples/ship08l.mps (altnum.1): file ship08l.mps
+	  was added on branch altnum on 2006-10-29 19:26:55 +0000
+
+2004-12-30 Thursday 15:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.138), demos/ppl_lpsol/Makefile.am (1.10),
+	  demos/ppl_lpsol/examples/Makefile.am (1.2),
+	  demos/ppl_lpsol/examples/adlittle.mps (1.1),
+	  demos/ppl_lpsol/examples/blend.mps (1.1),
+	  demos/ppl_lpsol/examples/boeing1.mps (1.1),
+	  demos/ppl_lpsol/examples/boeing2.mps (1.1),
+	  demos/ppl_lpsol/examples/kb2.mps (1.1),
+	  demos/ppl_lpsol/examples/mip.mps (1.1),
+	  demos/ppl_lpsol/examples/sc105.mps (1.1),
+	  demos/ppl_lpsol/examples/sc50a.mps (1.1),
+	  demos/ppl_lpsol/examples/sc50b.mps (1.1),
+	  demos/ppl_lpsol/examples/ship08l.mps (1.1): New examples to test
+	  the simplex solver.
+
+2004-12-30 Thursday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.11), interfaces/C/ppl_c.cc
+	  (1.127), src/Constraint_System.defs.hh (1.7), src/simplex.cc
+	  (1.3): The simplex solver now returns a Simplex_Status instead of
+	  a bool.
+
+2004-12-30 Thursday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.108): In
+	  Polyhedron::map_space_dimensions(const Partial_Function& pfunc)
+	  we no longer completely trust the (user-provided) partial
+	  function `pfunc'.  Compiler warning silenced.
+
+2004-12-30 Thursday 15:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.152): Fixed
+	  term_to_Coefficient(Prolog_term_ref t).
+
+2004-12-30 Thursday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.52), Determinate.inlines.hh (1.45):
+	  All methods that are specific to the Polyhedra tempplate
+	  parameter have been dropped. If needed, they can still be invoked
+	  through element().
+
+2004-12-30 Thursday 15:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.53): Minor documentation improvement.
+
+2004-12-30 Thursday 15:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.16): Use element() to access
+	  those methods that are specific to the Polyhedron class.
+
+2004-12-30 Thursday 15:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.9): Minor documentation improvements.
+
+2004-12-30 Thursday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.107): Error messages fixed.
+
+2004-12-30 Thursday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.8), Powerset.inlines.hh (1.8): Added
+	  mixed comparison operators for iterator and const_iterator.
+	  Drafted some documentation with an iterator's usage example.
+
+2004-12-30 Thursday 11:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.126), ppl_c.h.in (1.45): Added support
+	  for simplex solver status to the C interface.
+
+2004-12-30 Thursday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.15): New enum Simplex_Status to represent
+	  the possible outcomes of a simplex solver.
+
+2004-12-30 Thursday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.10): Redundant print statement
+	  removed.
+
+2004-12-30 Thursday 08:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz (1.3): The objective function is now
+	  printed even if the problem is unfeasible.
+
+2004-12-29 Wednesday 21:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.13),
+	  Polyhedra_Powerset.inlines.hh (1.15), Powerset.defs.hh (1.7),
+	  Powerset.inlines.hh (1.7), algorithms.hh (1.38): Added support
+	  for the consident use of bidirectional iterators (iterator,
+	  const_iterator, reverse_iterator, const_reverse_iterator) for the
+	  class Powerset. The new iterators replace the low-level ones on
+	  the sequence of disjuncts, which are now protected and were not
+	  enforcing the consistency of the reduced flag. All the new
+	  iterators only provide read-only access to the disjuncts in a
+	  Powerset element.  It is possible to drop elements form the
+	  sequence (but not to directly modify them) by using `iterator' in
+	  conjunction with Powerset<CS> methods drop_disjunct(),
+	  drop_disjuncts() and clear().
+
+2004-12-29 Wednesday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.9): Optionally use the simplex
+	  method.
+
+2004-12-29 Wednesday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.137), interfaces/C/ppl_c.cc (1.125),
+	  interfaces/C/ppl_c.h.in (1.44): Temporary interfaces to our new
+	  simplex method added.
+
+2004-12-29 Wednesday 21:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.149): Announced the recent changes to Constraint and
+	  Generator.
+
+2004-12-29 Wednesday 21:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Result.defs.hh (1.4), Rounding.defs.hh (1.3): Avoid
+	  trailing commas: they are non standard.
+
+2004-12-29 Wednesday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplex.cc (1.2): Include "Constraint_System.inlines.hh".
+
+2004-12-29 Wednesday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.6), Makefile.am (1.98),
+	  Matrix.defs.hh (1.67), simplex.cc (1.1): Several methods of
+	  Matrix are now public instead of protected.  Added a first, very
+	  rough implementation of Constraint_System::primal_simplex().
+
+2004-12-29 Wednesday 16:45  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.14): Prefer esplicit overflow
+	  result.
+
+2004-12-29 Wednesday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.17): Added Maximiliano Marchesi and Andrea Cimino.
+	  Updated the contribution of Abramo.  Other minor improvements.
+
+2004-12-29 Wednesday 14:47  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.13): Don't throw exception when
+	  exactness of result is not checked.
+
+2004-12-29 Wednesday 14:45  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.13): Return overflow Result when
+	  Rounding direction is IGNORE.
+
+2004-12-29 Wednesday 11:06  Abramo Bagnara
+
+	* src/: checked.defs.hh (1.8), checked_int.inlines.hh (1.12),
+	  checked_mpz.inlines.hh (1.7): Don't compute relation with exact
+	  result if choosen rounding direction is IGNORE
+
+2004-12-29 Wednesday 08:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.inlines.hh (1.3): Comment fixed.  Indentation fixed.
+	  Use assert(false) instead of assert(0).  Include <cassert>.
+
+2004-12-29 Wednesday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Result.defs.hh (1.3): Comment fixed.
+
+2004-12-29 Wednesday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/Makefile.am (1.3): Added ascii_dump_load1.dat and
+	  ascii_dump_load2.dat to MOSTLYCLEANFILES.
+
+2004-12-29 Wednesday 08:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (1.3): Typo fixed.
+
+2004-12-29 Wednesday 00:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.defs.hh (altnum.3): Typos fixed.
+
+2004-12-28 Tuesday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.12): Reflect the fact that the `gmp' option
+	  for `--enable-coefficients' has been renamed `mpz'.
+
+2004-12-28 Tuesday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.148): Mention the fact that one of the possible values
+	  for the configuration option `--enable-coefficients' has been
+	  renamed from `gmp' to `mpz'.
+
+2004-12-28 Tuesday 22:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.16), configure.ac (1.155), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.40), interfaces/C/ppl_c.cc (1.124),
+	  interfaces/Prolog/ppl_prolog.icc (1.151),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.29),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.25),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.72),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.96),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.63),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.88), src/BDS_Status.idefs.hh
+	  (1.2), src/BDS_Status.inlines.hh (1.2), src/BD_Shape.defs.hh
+	  (1.2), src/BD_Shape.inlines.hh (1.2), src/BD_Shape.types.hh
+	  (1.2), src/Checked_Number.defs.hh (1.7),
+	  src/Checked_Number.inlines.hh (1.12), src/DB_Matrix.defs.hh
+	  (1.2), src/DB_Matrix.inlines.hh (1.2), src/DB_Matrix.types.hh
+	  (1.2), src/DB_Row.defs.hh (1.2), src/DB_Row.inlines.hh (1.2),
+	  src/DB_Row.types.hh (1.2), src/E_NIT.defs.hh (1.2),
+	  src/E_NIT.inlines.hh (1.2), src/E_NIT.types.hh (1.2),
+	  src/E_Rational.defs.hh (1.2), src/E_Rational.inlines.hh (1.2),
+	  src/E_Rational.types.hh (1.2), src/Extended_Number.defs.hh (1.2),
+	  src/Extended_Number.inlines.hh (1.2),
+	  src/Extended_Number.types.hh (1.2), src/Float.defs.hh (1.2),
+	  src/Float.inlines.hh (1.2), src/Interval.inlines.hh (1.17),
+	  src/Limits.hh (1.4), src/Makefile.am (1.97),
+	  src/Numeric_Format.defs.hh (1.2), src/Polyhedron_nonpublic.cc
+	  (1.42), src/Ptr_Iterator.defs.hh (1.2),
+	  src/Ptr_Iterator.inlines.hh (1.2), src/Ptr_Iterator.types.hh
+	  (1.2), src/Result.defs.hh (1.2), src/Result.inlines.hh (1.2),
+	  src/Rounding.defs.hh (1.2), src/Rounding.inlines.hh (1.2),
+	  src/Rounding.types.hh (1.2), src/checked.defs.hh (1.7),
+	  src/checked.inlines.hh (1.5), src/checked_ext.defs.hh (1.2),
+	  src/checked_ext.inlines.hh (1.2), src/checked_float.inlines.hh
+	  (1.15), src/checked_int.inlines.hh (1.11),
+	  src/checked_mpq.inlines.hh (1.6), src/checked_mpz.inlines.hh
+	  (1.6), src/compiler.hh (1.2), src/float.types.hh (1.6),
+	  src/fpu-c99.inlines.hh (1.2), src/fpu-ia32.inlines.hh (1.2),
+	  src/fpu.defs.hh (1.2), src/globals.defs.hh (1.14),
+	  src/globals.inlines.hh (1.7), tests/.cvsignore (1.11),
+	  tests/CbecomesNNC1.cc (1.7), tests/Makefile.am (1.241),
+	  tests/NNCbecomesC1.cc (1.2), tests/NNCminimize1.cc (1.13),
+	  tests/NNCminimize2.cc (1.13), tests/NNCminimize3.cc (1.13),
+	  tests/NNCminimize4.cc (1.14), tests/NNCminimize5.cc (1.13),
+	  tests/NNCminimize6.cc (1.13), tests/README (1.3),
+	  tests/addconstraint1.cc (1.8), tests/addconstraint2.cc (1.5),
+	  tests/addconstraint3.cc (1.5), tests/addconstraints1.cc (1.14),
+	  tests/addconstraints10.cc (1.12), tests/addconstraints11.cc
+	  (1.13), tests/addconstraints12.cc (1.6),
+	  tests/addconstraints13.cc (1.8), tests/addconstraints2.cc (1.21),
+	  tests/addconstraints3.cc (1.12), tests/addconstraints4.cc (1.13),
+	  tests/addconstraints5.cc (1.14), tests/addconstraints6.cc (1.15),
+	  tests/addconstraints7.cc (1.14), tests/addconstraints8.cc (1.15),
+	  tests/addconstraints9.cc (1.16), tests/addgenerator1.cc (1.10),
+	  tests/addgenerator2.cc (1.10), tests/addgenerator3.cc (1.6),
+	  tests/addgenerator4.cc (1.8), tests/addgenerator5.cc (1.3),
+	  tests/addgenerators1.cc (1.14), tests/addgenerators10.cc (1.6),
+	  tests/addgenerators11.cc (1.11), tests/addgenerators12.cc (1.8),
+	  tests/addgenerators13.cc (1.4), tests/addgenerators2.cc (1.14),
+	  tests/addgenerators3.cc (1.14), tests/addgenerators4.cc (1.14),
+	  tests/addgenerators5.cc (1.14), tests/addgenerators6.cc (1.14),
+	  tests/addgenerators7.cc (1.11), tests/addgenerators8.cc (1.9),
+	  tests/addgenerators9.cc (1.8), tests/addspacedims1.cc (1.3),
+	  tests/addspacedims10.cc (1.4), tests/addspacedims11.cc (1.3),
+	  tests/addspacedims12.cc (1.2), tests/addspacedims13.cc (1.2),
+	  tests/addspacedims2.cc (1.2), tests/addspacedims3.cc (1.4),
+	  tests/addspacedims4.cc (1.3), tests/addspacedims5.cc (1.3),
+	  tests/addspacedims6.cc (1.3), tests/addspacedims7.cc (1.3),
+	  tests/addspacedims8.cc (1.2), tests/addspacedims9.cc (1.3),
+	  tests/affineimage1.cc (1.13), tests/affineimage2.cc (1.12),
+	  tests/affineimage3.cc (1.6), tests/affineimage4.cc (1.5),
+	  tests/affineimage5.cc (1.6), tests/affineimage6.cc (1.5),
+	  tests/affineimage7.cc (1.6), tests/affineimage8.cc (1.9),
+	  tests/affineimage9.cc (1.3), tests/affinepreimage1.cc (1.13),
+	  tests/affinepreimage10.cc (1.9), tests/affinepreimage2.cc (1.12),
+	  tests/affinepreimage3.cc (1.12), tests/affinepreimage4.cc (1.14),
+	  tests/affinepreimage5.cc (1.5), tests/affinepreimage6.cc (1.6),
+	  tests/affinepreimage7.cc (1.6), tests/affinepreimage8.cc (1.5),
+	  tests/affinepreimage9.cc (1.6), tests/affinetrans.cc (1.17),
+	  tests/append1.cc (1.24), tests/append2.cc (1.24),
+	  tests/ascii_dump_load1.cc (1.14), tests/ascii_dump_load2.cc
+	  (1.12), tests/ascii_dump_load3.cc (1.15),
+	  tests/ascii_dump_load4.cc (1.16), tests/ascii_dump_load5.cc
+	  (1.11), tests/ascii_dump_load6.cc (1.8),
+	  tests/ascii_dump_load7.cc (1.9), tests/bgp99extrapolation1.cc
+	  (1.8), tests/bgp99extrapolation2.cc (1.9),
+	  tests/bhrz03widening1.cc (1.6), tests/bhrz03widening10.cc (1.5),
+	  tests/bhrz03widening11.cc (1.5), tests/bhrz03widening12.cc (1.6),
+	  tests/bhrz03widening13.cc (1.7), tests/bhrz03widening14.cc (1.9),
+	  tests/bhrz03widening15.cc (1.10), tests/bhrz03widening16.cc
+	  (1.6), tests/bhrz03widening17.cc (1.6), tests/bhrz03widening18.cc
+	  (1.6), tests/bhrz03widening19.cc (1.6), tests/bhrz03widening2.cc
+	  (1.8), tests/bhrz03widening3.cc (1.7), tests/bhrz03widening4.cc
+	  (1.5), tests/bhrz03widening5.cc (1.5), tests/bhrz03widening6.cc
+	  (1.7), tests/bhrz03widening7.cc (1.7), tests/bhrz03widening8.cc
+	  (1.6), tests/bhrz03widening9.cc (1.9), tests/bhz03widening1.cc
+	  (1.9), tests/bhz03widening2.cc (1.11), tests/bhz03widening3.cc
+	  (1.10), tests/bhz03widening4.cc (1.7), tests/bhz03widening5.cc
+	  (1.8), tests/bhz03widening6.cc (1.9), tests/bounded1.cc (1.15),
+	  tests/boundedh79extrapolation1.cc (1.3), tests/boundingbox1.cc
+	  (1.40), tests/boundingbox2.cc (1.24), tests/boundingbox3.cc
+	  (1.16), tests/boundingbox4.cc (1.13), tests/boundingbox5.cc
+	  (1.3), tests/bounds1.cc (1.8), tests/bounds2.cc (1.7),
+	  tests/concatenate1.cc (1.11), tests/concatenate2.cc (1.10),
+	  tests/concatenate3.cc (1.9), tests/concatenate4.cc (1.8),
+	  tests/concatenate5.cc (1.5), tests/concatenate6.cc (1.7),
+	  tests/constraints1.cc (1.8), tests/constraints2.cc (1.8),
+	  tests/constraints3.cc (1.9), tests/constraints4.cc (1.8),
+	  tests/contains1.cc (1.6), tests/contains2.cc (1.5),
+	  tests/contains3.cc (1.5), tests/contains4.cc (1.4),
+	  tests/contains5.cc (1.4), tests/disjoint1.cc (1.8),
+	  tests/disjoint2.cc (1.11), tests/disjoint3.cc (1.11),
+	  tests/dualhypercubes.cc (1.10), tests/empty1.cc (1.16),
+	  tests/equals1.cc (1.2), tests/exceptions1.cc (1.44),
+	  tests/exceptions2.cc (1.38), tests/exceptions3.cc (1.6),
+	  tests/expandspacedim1.cc (1.4), tests/expandspacedim2.cc (1.2),
+	  tests/foldspacedims1.cc (1.3), tests/foldspacedims2.cc (1.3),
+	  tests/generalizedaffineimage1.cc (1.9),
+	  tests/generalizedaffineimage10.cc (1.8),
+	  tests/generalizedaffineimage11.cc (1.7),
+	  tests/generalizedaffineimage12.cc (1.6),
+	  tests/generalizedaffineimage2.cc (1.8),
+	  tests/generalizedaffineimage3.cc (1.9),
+	  tests/generalizedaffineimage4.cc (1.7),
+	  tests/generalizedaffineimage5.cc (1.7),
+	  tests/generalizedaffineimage6.cc (1.7),
+	  tests/generalizedaffineimage7.cc (1.9),
+	  tests/generalizedaffineimage8.cc (1.7),
+	  tests/generalizedaffineimage9.cc (1.9), tests/generators1.cc
+	  (1.17), tests/generators2.cc (1.13), tests/generators3.cc (1.7),
+	  tests/generators4.cc (1.8), tests/generators5.cc (1.7),
+	  tests/generators6.cc (1.8), tests/geomcovers1.cc (1.3),
+	  tests/h79widening1.cc (1.7), tests/h79widening2.cc (1.8),
+	  tests/h79widening3.cc (1.8), tests/h79widening4.cc (1.6),
+	  tests/h79widening5.cc (1.6), tests/h79widening6.cc (1.8),
+	  tests/h79widening7.cc (1.4), tests/h79widening8.cc (1.3),
+	  tests/intersection1.cc (1.7), tests/intersection10.cc (1.7),
+	  tests/intersection11.cc (1.7), tests/intersection2.cc (1.13),
+	  tests/intersection3.cc (1.8), tests/intersection4.cc (1.9),
+	  tests/intersection5.cc (1.8), tests/intersection6.cc (1.9),
+	  tests/intersection7.cc (1.7), tests/intersection8.cc (1.6),
+	  tests/intersection9.cc (1.6),
+	  tests/limitedbhrz03extrapolation1.cc (1.6),
+	  tests/limitedh79extrapolation1.cc (1.5),
+	  tests/limitedh79extrapolation2.cc (1.5),
+	  tests/limitedh79extrapolation3.cc (1.6),
+	  tests/limitedh79extrapolation4.cc (1.6),
+	  tests/linearpartition1.cc (1.16), tests/linearpartition2.cc
+	  (1.16), tests/linearpartition3.cc (1.16),
+	  tests/linearpartition4.cc (1.4), tests/linexpression1.cc (1.6),
+	  tests/mapspacedims1.cc (1.3), tests/mapspacedims2.cc (1.2),
+	  tests/mapspacedims3.cc (1.2), tests/mapspacedims4.cc (1.2),
+	  tests/max_min1.cc (1.7), tests/max_min2.cc (1.7),
+	  tests/maxspacedim1.cc (1.6), tests/mc91.cc (1.16),
+	  tests/membytes1.cc (1.8), tests/membytes2.cc (1.4),
+	  tests/memory1.cc (1.24), tests/minconstraints1.cc (1.7),
+	  tests/minconstraints2.cc (1.7), tests/minconstraints3.cc (1.6),
+	  tests/minconstraints4.cc (1.10), tests/mingenerators1.cc (1.7),
+	  tests/mingenerators2.cc (1.6), tests/mingenerators3.cc (1.6),
+	  tests/onepoint.cc (1.11), tests/permute.cc (1.33),
+	  tests/polydifference1.cc (1.11), tests/polydifference2.cc (1.12),
+	  tests/polydifference3.cc (1.7), tests/polydifference4.cc (1.6),
+	  tests/polydifference5.cc (1.7), tests/polydifference6.cc (1.7),
+	  tests/polydifference7.cc (1.6), tests/polydifference8.cc (1.5),
+	  tests/polydifference9.cc (1.7), tests/polyhull1.cc (1.10),
+	  tests/polyhull10.cc (1.6), tests/polyhull11.cc (1.3),
+	  tests/polyhull2.cc (1.9), tests/polyhull3.cc (1.8),
+	  tests/polyhull4.cc (1.7), tests/polyhull5.cc (1.6),
+	  tests/polyhull6.cc (1.6), tests/polyhull7.cc (1.6),
+	  tests/polyhull8.cc (1.6), tests/polyhull9.cc (1.7),
+	  tests/ppl_test.hh (1.5), tests/randphull1.cc (1.14),
+	  tests/randphull2.cc (1.11), tests/relations1.cc (1.12),
+	  tests/relations10.cc (1.7), tests/relations11.cc (1.7),
+	  tests/relations12.cc (1.7), tests/relations13.cc (1.6),
+	  tests/relations14.cc (1.6), tests/relations15.cc (1.7),
+	  tests/relations16.cc (1.7), tests/relations17.cc (1.10),
+	  tests/relations18.cc (1.6), tests/relations19.cc (1.7),
+	  tests/relations2.cc (1.12), tests/relations3.cc (1.12),
+	  tests/relations4.cc (1.13), tests/relations5.cc (1.13),
+	  tests/relations6.cc (1.11), tests/relations7.cc (1.12),
+	  tests/relations8.cc (1.12), tests/relations9.cc (1.15),
+	  tests/removespacedims1.cc (1.3), tests/removespacedims10.cc
+	  (1.2), tests/removespacedims2.cc (1.4), tests/removespacedims3.cc
+	  (1.2), tests/removespacedims4.cc (1.3), tests/removespacedims5.cc
+	  (1.2), tests/removespacedims6.cc (1.2), tests/removespacedims7.cc
+	  (1.2), tests/removespacedims8.cc (1.3), tests/removespacedims9.cc
+	  (1.2), tests/smm1.cc (1.18), tests/timeelapse1.cc (1.10),
+	  tests/timeelapse2.cc (1.9), tests/timeelapse3.cc (1.11),
+	  tests/timeelapse4.cc (1.10), tests/timeelapse5.cc (1.10),
+	  tests/timeelapse6.cc (1.6), tests/timeelapse7.cc (1.5),
+	  tests/timeelapse8.cc (1.6), tests/timeelapse9.cc (1.2),
+	  tests/topclosed1.cc (1.8), tests/topclosed2.cc (1.8),
+	  tests/topclosed3.cc (1.10), tests/topclosure1.cc (1.9),
+	  tests/topclosure2.cc (1.5), tests/topclosure3.cc (1.5),
+	  tests/topclosure4.cc (1.7), tests/universe1.cc (1.11),
+	  tests/universe2.cc (1.12), tests/universe3.cc (1.13),
+	  tests/universe4.cc (1.13), tests/universe5.cc (1.13),
+	  tests/universe6.cc (1.12), tests/universe7.cc (1.3),
+	  tests/valgrind_suppressions (1.2), tests/watchdog1.cc (1.22),
+	  tests/writeconsys1.cc (1.10), tests/writegensys1.cc (1.10),
+	  tests/writegensys2.cc (1.10), tests/writegensys3.cc (1.10),
+	  tests/writepolyhedron1.cc (1.8), tests/writepolyhedron2.cc (1.9),
+	  tests/writepolyhedron3.cc (1.8), tests/writerelation1.cc (1.8),
+	  tests/writevariable1.cc (1.11), tests/BD_Shape/.cvsignore (1.2),
+	  tests/BD_Shape/Makefile.am (1.2),
+	  tests/BD_Shape/addconstraints1.cc (1.2),
+	  tests/BD_Shape/addspacedims1.cc (1.2),
+	  tests/BD_Shape/addspacedims2.cc (1.2),
+	  tests/BD_Shape/addspacedims3.cc (1.2),
+	  tests/BD_Shape/addspacedims4.cc (1.2),
+	  tests/BD_Shape/addspacedims5.cc (1.2),
+	  tests/BD_Shape/addspacedims6.cc (1.2),
+	  tests/BD_Shape/addspacedims7.cc (1.2),
+	  tests/BD_Shape/affineimage1.cc (1.2),
+	  tests/BD_Shape/affineimage2.cc (1.2),
+	  tests/BD_Shape/affineimage3.cc (1.2),
+	  tests/BD_Shape/affineimage4.cc (1.2),
+	  tests/BD_Shape/affineimage5.cc (1.2),
+	  tests/BD_Shape/affineimage6.cc (1.2),
+	  tests/BD_Shape/affineimage7.cc (1.2),
+	  tests/BD_Shape/affinepreimage1.cc (1.2),
+	  tests/BD_Shape/affinepreimage2.cc (1.2),
+	  tests/BD_Shape/affinepreimage3.cc (1.2),
+	  tests/BD_Shape/affinepreimage4.cc (1.2),
+	  tests/BD_Shape/ascii_dump_load1.cc (1.2),
+	  tests/BD_Shape/ascii_dump_load2.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation1.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation2.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation3.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation4.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation5.cc (1.2),
+	  tests/BD_Shape/cc76extrapolation6.cc (1.2),
+	  tests/BD_Shape/cc76narrowing1.cc (1.2),
+	  tests/BD_Shape/cc76narrowing2.cc (1.2),
+	  tests/BD_Shape/cc76narrowing3.cc (1.2),
+	  tests/BD_Shape/cc76narrowing4.cc (1.2),
+	  tests/BD_Shape/cc76narrowing5.cc (1.2),
+	  tests/BD_Shape/ch78widening1.cc (1.2),
+	  tests/BD_Shape/ch78widening2.cc (1.2),
+	  tests/BD_Shape/ch78widening3.cc (1.2),
+	  tests/BD_Shape/ch78widening4.cc (1.2),
+	  tests/BD_Shape/ch78widening5.cc (1.2),
+	  tests/BD_Shape/ch78widening6.cc (1.2),
+	  tests/BD_Shape/ch78widening7.cc (1.2),
+	  tests/BD_Shape/ch78widening8.cc (1.2),
+	  tests/BD_Shape/concatenate1.cc (1.2),
+	  tests/BD_Shape/concatenate2.cc (1.2),
+	  tests/BD_Shape/concatenate3.cc (1.2),
+	  tests/BD_Shape/concatenate4.cc (1.2),
+	  tests/BD_Shape/concatenate5.cc (1.2),
+	  tests/BD_Shape/constraints1.cc (1.2),
+	  tests/BD_Shape/constraints2.cc (1.2), tests/BD_Shape/contains1.cc
+	  (1.2), tests/BD_Shape/contains2.cc (1.2),
+	  tests/BD_Shape/contains3.cc (1.2), tests/BD_Shape/empty1.cc
+	  (1.2), tests/BD_Shape/empty2.cc (1.2), tests/BD_Shape/empty3.cc
+	  (1.2), tests/BD_Shape/empty4.cc (1.2),
+	  tests/BD_Shape/equality1.cc (1.2), tests/BD_Shape/exceptions1.cc
+	  (1.2), tests/BD_Shape/exceptions2.cc (1.2),
+	  tests/BD_Shape/exceptions3.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage1.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage10.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage11.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage12.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage2.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage3.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage4.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage5.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage6.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage7.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage8.cc (1.2),
+	  tests/BD_Shape/generalizedaffineimage9.cc (1.2),
+	  tests/BD_Shape/h79widening1.cc (1.2),
+	  tests/BD_Shape/intersection1.cc (1.2),
+	  tests/BD_Shape/intersection2.cc (1.2),
+	  tests/BD_Shape/intersection3.cc (1.2),
+	  tests/BD_Shape/intersection4.cc (1.2),
+	  tests/BD_Shape/intersection5.cc (1.2),
+	  tests/BD_Shape/intersection6.cc (1.2),
+	  tests/BD_Shape/intersection7.cc (1.2),
+	  tests/BD_Shape/intersection8.cc (1.2),
+	  tests/BD_Shape/limitedCC76extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedCC76extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedCC76extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation1.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation2.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation3.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation4.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation5.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation6.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation7.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation8.cc (1.2),
+	  tests/BD_Shape/limitedCH78extrapolation9.cc (1.2),
+	  tests/BD_Shape/limitedh79extrapolation1.cc (1.2),
+	  tests/BD_Shape/mapspacedims1.cc (1.2),
+	  tests/BD_Shape/mapspacedims2.cc (1.2),
+	  tests/BD_Shape/mapspacedims3.cc (1.2),
+	  tests/BD_Shape/mapspacedims4.cc (1.2),
+	  tests/BD_Shape/maxspacedim.cc (1.2),
+	  tests/BD_Shape/polydifference1.cc (1.2),
+	  tests/BD_Shape/polydifference2.cc (1.2),
+	  tests/BD_Shape/polydifference3.cc (1.2),
+	  tests/BD_Shape/polydifference4.cc (1.2),
+	  tests/BD_Shape/polydifference5.cc (1.2),
+	  tests/BD_Shape/polydifference6.cc (1.2),
+	  tests/BD_Shape/polyhull1.cc (1.2), tests/BD_Shape/polyhull2.cc
+	  (1.2), tests/BD_Shape/polyhull3.cc (1.2),
+	  tests/BD_Shape/polyhull4.cc (1.2), tests/BD_Shape/relations1.cc
+	  (1.2), tests/BD_Shape/relations2.cc (1.2),
+	  tests/BD_Shape/relations3.cc (1.2), tests/BD_Shape/relations4.cc
+	  (1.2), tests/BD_Shape/relations5.cc (1.2),
+	  tests/BD_Shape/removespacedims1.cc (1.2),
+	  tests/BD_Shape/removespacedims2.cc (1.2),
+	  tests/BD_Shape/removespacedims3.cc (1.2),
+	  tests/BD_Shape/timeelapse1.cc (1.2),
+	  tests/BD_Shape/timeelapse2.cc (1.2),
+	  tests/BD_Shape/timeelapse3.cc (1.2),
+	  tests/BD_Shape/timeelapse4.cc (1.2),
+	  tests/BD_Shape/timeelapse5.cc (1.2), tests/BD_Shape/universe1.cc
+	  (1.2), tests/BD_Shape/writebdiffs1.cc (1.2),
+	  tests/BD_Shape/writebdiffs2.cc (1.2), tests/Polyhedron/.cvsignore
+	  (1.2), tests/Polyhedron/CbecomesNNC1.cc (1.2),
+	  tests/Polyhedron/Makefile.am (1.2),
+	  tests/Polyhedron/NNCbecomesC1.cc (1.2),
+	  tests/Polyhedron/NNCminimize1.cc (1.2),
+	  tests/Polyhedron/NNCminimize2.cc (1.2),
+	  tests/Polyhedron/NNCminimize3.cc (1.2),
+	  tests/Polyhedron/NNCminimize4.cc (1.2),
+	  tests/Polyhedron/NNCminimize5.cc (1.2),
+	  tests/Polyhedron/NNCminimize6.cc (1.2), tests/Polyhedron/README
+	  (1.2), tests/Polyhedron/addconstraint1.cc (1.2),
+	  tests/Polyhedron/addconstraint2.cc (1.2),
+	  tests/Polyhedron/addconstraint3.cc (1.2),
+	  tests/Polyhedron/addconstraints1.cc (1.2),
+	  tests/Polyhedron/addconstraints10.cc (1.2),
+	  tests/Polyhedron/addconstraints11.cc (1.2),
+	  tests/Polyhedron/addconstraints12.cc (1.2),
+	  tests/Polyhedron/addconstraints13.cc (1.2),
+	  tests/Polyhedron/addconstraints2.cc (1.2),
+	  tests/Polyhedron/addconstraints3.cc (1.2),
+	  tests/Polyhedron/addconstraints4.cc (1.2),
+	  tests/Polyhedron/addconstraints5.cc (1.2),
+	  tests/Polyhedron/addconstraints6.cc (1.2),
+	  tests/Polyhedron/addconstraints7.cc (1.2),
+	  tests/Polyhedron/addconstraints8.cc (1.2),
+	  tests/Polyhedron/addconstraints9.cc (1.2),
+	  tests/Polyhedron/addgenerator1.cc (1.2),
+	  tests/Polyhedron/addgenerator2.cc (1.2),
+	  tests/Polyhedron/addgenerator3.cc (1.2),
+	  tests/Polyhedron/addgenerator4.cc (1.2),
+	  tests/Polyhedron/addgenerator5.cc (1.2),
+	  tests/Polyhedron/addgenerators1.cc (1.2),
+	  tests/Polyhedron/addgenerators10.cc (1.2),
+	  tests/Polyhedron/addgenerators11.cc (1.2),
+	  tests/Polyhedron/addgenerators12.cc (1.2),
+	  tests/Polyhedron/addgenerators13.cc (1.2),
+	  tests/Polyhedron/addgenerators2.cc (1.2),
+	  tests/Polyhedron/addgenerators3.cc (1.2),
+	  tests/Polyhedron/addgenerators4.cc (1.2),
+	  tests/Polyhedron/addgenerators5.cc (1.2),
+	  tests/Polyhedron/addgenerators6.cc (1.2),
+	  tests/Polyhedron/addgenerators7.cc (1.2),
+	  tests/Polyhedron/addgenerators8.cc (1.2),
+	  tests/Polyhedron/addgenerators9.cc (1.2),
+	  tests/Polyhedron/addspacedims1.cc (1.2),
+	  tests/Polyhedron/addspacedims10.cc (1.2),
+	  tests/Polyhedron/addspacedims11.cc (1.2),
+	  tests/Polyhedron/addspacedims12.cc (1.2),
+	  tests/Polyhedron/addspacedims13.cc (1.2),
+	  tests/Polyhedron/addspacedims2.cc (1.2),
+	  tests/Polyhedron/addspacedims3.cc (1.2),
+	  tests/Polyhedron/addspacedims4.cc (1.2),
+	  tests/Polyhedron/addspacedims5.cc (1.2),
+	  tests/Polyhedron/addspacedims6.cc (1.2),
+	  tests/Polyhedron/addspacedims7.cc (1.2),
+	  tests/Polyhedron/addspacedims8.cc (1.2),
+	  tests/Polyhedron/addspacedims9.cc (1.2),
+	  tests/Polyhedron/affineimage1.cc (1.2),
+	  tests/Polyhedron/affineimage2.cc (1.2),
+	  tests/Polyhedron/affineimage3.cc (1.2),
+	  tests/Polyhedron/affineimage4.cc (1.2),
+	  tests/Polyhedron/affineimage5.cc (1.2),
+	  tests/Polyhedron/affineimage6.cc (1.2),
+	  tests/Polyhedron/affineimage7.cc (1.2),
+	  tests/Polyhedron/affineimage8.cc (1.2),
+	  tests/Polyhedron/affineimage9.cc (1.2),
+	  tests/Polyhedron/affinepreimage1.cc (1.2),
+	  tests/Polyhedron/affinepreimage10.cc (1.2),
+	  tests/Polyhedron/affinepreimage2.cc (1.2),
+	  tests/Polyhedron/affinepreimage3.cc (1.2),
+	  tests/Polyhedron/affinepreimage4.cc (1.2),
+	  tests/Polyhedron/affinepreimage5.cc (1.2),
+	  tests/Polyhedron/affinepreimage6.cc (1.2),
+	  tests/Polyhedron/affinepreimage7.cc (1.2),
+	  tests/Polyhedron/affinepreimage8.cc (1.2),
+	  tests/Polyhedron/affinepreimage9.cc (1.2),
+	  tests/Polyhedron/affinetrans.cc (1.2),
+	  tests/Polyhedron/append1.cc (1.2), tests/Polyhedron/append2.cc
+	  (1.2), tests/Polyhedron/ascii_dump_load1.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load2.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load3.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load4.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load5.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load6.cc (1.2),
+	  tests/Polyhedron/ascii_dump_load7.cc (1.2),
+	  tests/Polyhedron/bgp99extrapolation1.cc (1.2),
+	  tests/Polyhedron/bgp99extrapolation2.cc (1.2),
+	  tests/Polyhedron/bhrz03widening1.cc (1.2),
+	  tests/Polyhedron/bhrz03widening10.cc (1.2),
+	  tests/Polyhedron/bhrz03widening11.cc (1.2),
+	  tests/Polyhedron/bhrz03widening12.cc (1.2),
+	  tests/Polyhedron/bhrz03widening13.cc (1.2),
+	  tests/Polyhedron/bhrz03widening14.cc (1.2),
+	  tests/Polyhedron/bhrz03widening15.cc (1.2),
+	  tests/Polyhedron/bhrz03widening16.cc (1.2),
+	  tests/Polyhedron/bhrz03widening17.cc (1.2),
+	  tests/Polyhedron/bhrz03widening18.cc (1.2),
+	  tests/Polyhedron/bhrz03widening19.cc (1.2),
+	  tests/Polyhedron/bhrz03widening2.cc (1.2),
+	  tests/Polyhedron/bhrz03widening3.cc (1.2),
+	  tests/Polyhedron/bhrz03widening4.cc (1.2),
+	  tests/Polyhedron/bhrz03widening5.cc (1.2),
+	  tests/Polyhedron/bhrz03widening6.cc (1.2),
+	  tests/Polyhedron/bhrz03widening7.cc (1.2),
+	  tests/Polyhedron/bhrz03widening8.cc (1.2),
+	  tests/Polyhedron/bhrz03widening9.cc (1.2),
+	  tests/Polyhedron/bhz03widening1.cc (1.2),
+	  tests/Polyhedron/bhz03widening2.cc (1.2),
+	  tests/Polyhedron/bhz03widening3.cc (1.2),
+	  tests/Polyhedron/bhz03widening4.cc (1.2),
+	  tests/Polyhedron/bhz03widening5.cc (1.2),
+	  tests/Polyhedron/bhz03widening6.cc (1.2),
+	  tests/Polyhedron/bounded1.cc (1.2),
+	  tests/Polyhedron/boundedh79extrapolation1.cc (1.2),
+	  tests/Polyhedron/boundingbox1.cc (1.2),
+	  tests/Polyhedron/boundingbox2.cc (1.2),
+	  tests/Polyhedron/boundingbox3.cc (1.2),
+	  tests/Polyhedron/boundingbox4.cc (1.2),
+	  tests/Polyhedron/boundingbox5.cc (1.2),
+	  tests/Polyhedron/bounds1.cc (1.2), tests/Polyhedron/bounds2.cc
+	  (1.2), tests/Polyhedron/concatenate1.cc (1.2),
+	  tests/Polyhedron/concatenate2.cc (1.2),
+	  tests/Polyhedron/concatenate3.cc (1.2),
+	  tests/Polyhedron/concatenate4.cc (1.2),
+	  tests/Polyhedron/concatenate5.cc (1.2),
+	  tests/Polyhedron/concatenate6.cc (1.2),
+	  tests/Polyhedron/constraints1.cc (1.2),
+	  tests/Polyhedron/constraints2.cc (1.2),
+	  tests/Polyhedron/constraints3.cc (1.2),
+	  tests/Polyhedron/constraints4.cc (1.2),
+	  tests/Polyhedron/contains1.cc (1.2),
+	  tests/Polyhedron/contains2.cc (1.2),
+	  tests/Polyhedron/contains3.cc (1.2),
+	  tests/Polyhedron/contains4.cc (1.2),
+	  tests/Polyhedron/contains5.cc (1.2),
+	  tests/Polyhedron/disjoint1.cc (1.2),
+	  tests/Polyhedron/disjoint2.cc (1.2),
+	  tests/Polyhedron/disjoint3.cc (1.2),
+	  tests/Polyhedron/dualhypercubes.cc (1.2),
+	  tests/Polyhedron/empty1.cc (1.2), tests/Polyhedron/equals1.cc
+	  (1.2), tests/Polyhedron/exceptions1.cc (1.2),
+	  tests/Polyhedron/exceptions2.cc (1.2),
+	  tests/Polyhedron/exceptions3.cc (1.2),
+	  tests/Polyhedron/expandspacedim1.cc (1.2),
+	  tests/Polyhedron/expandspacedim2.cc (1.2),
+	  tests/Polyhedron/foldspacedims1.cc (1.2),
+	  tests/Polyhedron/foldspacedims2.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage1.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage10.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage11.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage12.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage2.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage3.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage4.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage5.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage6.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage7.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage8.cc (1.2),
+	  tests/Polyhedron/generalizedaffineimage9.cc (1.2),
+	  tests/Polyhedron/generators1.cc (1.2),
+	  tests/Polyhedron/generators2.cc (1.2),
+	  tests/Polyhedron/generators3.cc (1.2),
+	  tests/Polyhedron/generators4.cc (1.2),
+	  tests/Polyhedron/generators5.cc (1.2),
+	  tests/Polyhedron/generators6.cc (1.2),
+	  tests/Polyhedron/geomcovers1.cc (1.2),
+	  tests/Polyhedron/h79widening1.cc (1.2),
+	  tests/Polyhedron/h79widening2.cc (1.2),
+	  tests/Polyhedron/h79widening3.cc (1.2),
+	  tests/Polyhedron/h79widening4.cc (1.2),
+	  tests/Polyhedron/h79widening5.cc (1.2),
+	  tests/Polyhedron/h79widening6.cc (1.2),
+	  tests/Polyhedron/h79widening7.cc (1.2),
+	  tests/Polyhedron/h79widening8.cc (1.2),
+	  tests/Polyhedron/intersection1.cc (1.2),
+	  tests/Polyhedron/intersection10.cc (1.2),
+	  tests/Polyhedron/intersection11.cc (1.2),
+	  tests/Polyhedron/intersection2.cc (1.2),
+	  tests/Polyhedron/intersection3.cc (1.2),
+	  tests/Polyhedron/intersection4.cc (1.2),
+	  tests/Polyhedron/intersection5.cc (1.2),
+	  tests/Polyhedron/intersection6.cc (1.2),
+	  tests/Polyhedron/intersection7.cc (1.2),
+	  tests/Polyhedron/intersection8.cc (1.2),
+	  tests/Polyhedron/intersection9.cc (1.2),
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation1.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation2.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation3.cc (1.2),
+	  tests/Polyhedron/limitedh79extrapolation4.cc (1.2),
+	  tests/Polyhedron/linearpartition1.cc (1.2),
+	  tests/Polyhedron/linearpartition2.cc (1.2),
+	  tests/Polyhedron/linearpartition3.cc (1.2),
+	  tests/Polyhedron/linearpartition4.cc (1.2),
+	  tests/Polyhedron/linexpression1.cc (1.2),
+	  tests/Polyhedron/mapspacedims1.cc (1.2),
+	  tests/Polyhedron/mapspacedims2.cc (1.2),
+	  tests/Polyhedron/mapspacedims3.cc (1.2),
+	  tests/Polyhedron/mapspacedims4.cc (1.2),
+	  tests/Polyhedron/max_min1.cc (1.2), tests/Polyhedron/max_min2.cc
+	  (1.2), tests/Polyhedron/maxspacedim1.cc (1.2),
+	  tests/Polyhedron/mc91.cc (1.2), tests/Polyhedron/membytes1.cc
+	  (1.2), tests/Polyhedron/membytes2.cc (1.2),
+	  tests/Polyhedron/memory1.cc (1.2),
+	  tests/Polyhedron/minconstraints1.cc (1.2),
+	  tests/Polyhedron/minconstraints2.cc (1.2),
+	  tests/Polyhedron/minconstraints3.cc (1.2),
+	  tests/Polyhedron/minconstraints4.cc (1.2),
+	  tests/Polyhedron/mingenerators1.cc (1.2),
+	  tests/Polyhedron/mingenerators2.cc (1.2),
+	  tests/Polyhedron/mingenerators3.cc (1.2),
+	  tests/Polyhedron/onepoint.cc (1.2), tests/Polyhedron/permute.cc
+	  (1.2), tests/Polyhedron/polydifference1.cc (1.2),
+	  tests/Polyhedron/polydifference2.cc (1.2),
+	  tests/Polyhedron/polydifference3.cc (1.2),
+	  tests/Polyhedron/polydifference4.cc (1.2),
+	  tests/Polyhedron/polydifference5.cc (1.2),
+	  tests/Polyhedron/polydifference6.cc (1.2),
+	  tests/Polyhedron/polydifference7.cc (1.2),
+	  tests/Polyhedron/polydifference8.cc (1.2),
+	  tests/Polyhedron/polydifference9.cc (1.2),
+	  tests/Polyhedron/polyhull1.cc (1.2),
+	  tests/Polyhedron/polyhull10.cc (1.2),
+	  tests/Polyhedron/polyhull11.cc (1.2),
+	  tests/Polyhedron/polyhull2.cc (1.2),
+	  tests/Polyhedron/polyhull3.cc (1.2),
+	  tests/Polyhedron/polyhull4.cc (1.2),
+	  tests/Polyhedron/polyhull5.cc (1.2),
+	  tests/Polyhedron/polyhull6.cc (1.2),
+	  tests/Polyhedron/polyhull7.cc (1.2),
+	  tests/Polyhedron/polyhull8.cc (1.2),
+	  tests/Polyhedron/polyhull9.cc (1.2),
+	  tests/Polyhedron/randphull1.cc (1.2),
+	  tests/Polyhedron/randphull2.cc (1.2),
+	  tests/Polyhedron/relations1.cc (1.2),
+	  tests/Polyhedron/relations10.cc (1.2),
+	  tests/Polyhedron/relations11.cc (1.2),
+	  tests/Polyhedron/relations12.cc (1.2),
+	  tests/Polyhedron/relations13.cc (1.2),
+	  tests/Polyhedron/relations14.cc (1.2),
+	  tests/Polyhedron/relations15.cc (1.2),
+	  tests/Polyhedron/relations16.cc (1.2),
+	  tests/Polyhedron/relations17.cc (1.2),
+	  tests/Polyhedron/relations18.cc (1.2),
+	  tests/Polyhedron/relations19.cc (1.2),
+	  tests/Polyhedron/relations2.cc (1.2),
+	  tests/Polyhedron/relations3.cc (1.2),
+	  tests/Polyhedron/relations4.cc (1.2),
+	  tests/Polyhedron/relations5.cc (1.2),
+	  tests/Polyhedron/relations6.cc (1.2),
+	  tests/Polyhedron/relations7.cc (1.2),
+	  tests/Polyhedron/relations8.cc (1.2),
+	  tests/Polyhedron/relations9.cc (1.2),
+	  tests/Polyhedron/removespacedims1.cc (1.2),
+	  tests/Polyhedron/removespacedims10.cc (1.2),
+	  tests/Polyhedron/removespacedims2.cc (1.2),
+	  tests/Polyhedron/removespacedims3.cc (1.2),
+	  tests/Polyhedron/removespacedims4.cc (1.2),
+	  tests/Polyhedron/removespacedims5.cc (1.2),
+	  tests/Polyhedron/removespacedims6.cc (1.2),
+	  tests/Polyhedron/removespacedims7.cc (1.2),
+	  tests/Polyhedron/removespacedims8.cc (1.2),
+	  tests/Polyhedron/removespacedims9.cc (1.2),
+	  tests/Polyhedron/smm1.cc (1.2), tests/Polyhedron/timeelapse1.cc
+	  (1.2), tests/Polyhedron/timeelapse2.cc (1.2),
+	  tests/Polyhedron/timeelapse3.cc (1.2),
+	  tests/Polyhedron/timeelapse4.cc (1.2),
+	  tests/Polyhedron/timeelapse5.cc (1.2),
+	  tests/Polyhedron/timeelapse6.cc (1.2),
+	  tests/Polyhedron/timeelapse7.cc (1.2),
+	  tests/Polyhedron/timeelapse8.cc (1.2),
+	  tests/Polyhedron/timeelapse9.cc (1.2),
+	  tests/Polyhedron/topclosed1.cc (1.2),
+	  tests/Polyhedron/topclosed2.cc (1.2),
+	  tests/Polyhedron/topclosed3.cc (1.2),
+	  tests/Polyhedron/topclosure1.cc (1.2),
+	  tests/Polyhedron/topclosure2.cc (1.2),
+	  tests/Polyhedron/topclosure3.cc (1.2),
+	  tests/Polyhedron/topclosure4.cc (1.2),
+	  tests/Polyhedron/universe1.cc (1.2),
+	  tests/Polyhedron/universe2.cc (1.2),
+	  tests/Polyhedron/universe3.cc (1.2),
+	  tests/Polyhedron/universe4.cc (1.2),
+	  tests/Polyhedron/universe5.cc (1.2),
+	  tests/Polyhedron/universe6.cc (1.2),
+	  tests/Polyhedron/universe7.cc (1.2),
+	  tests/Polyhedron/valgrind_suppressions (1.2),
+	  tests/Polyhedron/watchdog1.cc (1.2),
+	  tests/Polyhedron/writeconsys1.cc (1.2),
+	  tests/Polyhedron/writegensys1.cc (1.2),
+	  tests/Polyhedron/writegensys2.cc (1.2),
+	  tests/Polyhedron/writegensys3.cc (1.2),
+	  tests/Polyhedron/writepolyhedron1.cc (1.2),
+	  tests/Polyhedron/writepolyhedron2.cc (1.2),
+	  tests/Polyhedron/writepolyhedron3.cc (1.2),
+	  tests/Polyhedron/writerelation1.cc (1.2),
+	  tests/Polyhedron/writevariable1.cc (1.2): Second merge from the
+	  `altnum' branch.
+
+2004-12-28 Tuesday 20:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.21): Anonymous namespaces hve to do with visibility
+	  of names, not linkage.
+
+2004-12-28 Tuesday 20:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: track_allocation.hh (1.15), Ciao/ppl_ciao.cc
+	  (1.28), GNU/ppl_gprolog_sd.cc (1.24), SICStus/ppl_sicstus_sd.cc
+	  (1.71), SWI/ppl_swiprolog.cc (1.95), XSB/ppl_xsb.cc (1.62),
+	  YAP/ppl_yap.cc (1.87): Use anonymous namespaces instead of
+	  keyword "static" to hide functions and variables from the eyes of
+	  other translation units.
+
+2004-12-28 Tuesday 19:39  Abramo Bagnara
+
+	* src/: Extended_Number.defs.hh, Extended_Number.inlines.hh,
+	  Extended_Number.types.hh (altnum.[1,1,1]): Added preliminary
+	  Extended_Number implementation.
+
+2004-12-28 Tuesday 19:36  Abramo Bagnara
+
+	* src/: E_Rational.inlines.hh, Interval.inlines.hh,
+	  Polyhedron_nonpublic.cc (altnum.[2,9,12]): Fixed some
+	  Checked::assign use.
+
+2004-12-28 Tuesday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/: exceptions2.cc, exceptions3.cc (altnum.[3,3]):
+	  Refer to `Coefficient' instead of `Integer'.
+
+2004-12-28 Tuesday 18:35  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.25): Fixed incomplete change of
+	  return type for set_special.
+
+2004-12-28 Tuesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/.cvsignore (altnum.1): Put under CVS control.
+
+2004-12-28 Tuesday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.20): Added guideline for the specification of
+	  internal linkage functions and variables.
+
+2004-12-28 Tuesday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Polyhedron/: NNCbecomesC1.cc, addconstraints13.cc,
+	  addgenerators12.cc, affineimage8.cc, affinepreimage10.cc,
+	  affinepreimage9.cc, append1.cc, append2.cc, ascii_dump_load1.cc,
+	  ascii_dump_load2.cc, ascii_dump_load3.cc, ascii_dump_load4.cc,
+	  ascii_dump_load5.cc, ascii_dump_load6.cc, ascii_dump_load7.cc,
+	  bhrz03widening1.cc, bhrz03widening12.cc, bhrz03widening13.cc,
+	  bhrz03widening14.cc, bhrz03widening15.cc, bhrz03widening9.cc,
+	  bhz03widening6.cc, boundingbox1.cc, boundingbox2.cc,
+	  boundingbox3.cc, boundingbox4.cc, concatenate6.cc,
+	  constraints4.cc, contains5.cc, disjoint2.cc, disjoint3.cc,
+	  exceptions1.cc, exceptions2.cc, exceptions3.cc,
+	  expandspacedim1.cc, expandspacedim2.cc, foldspacedims1.cc,
+	  foldspacedims2.cc, generalizedaffineimage10.cc,
+	  generalizedaffineimage11.cc, generalizedaffineimage7.cc,
+	  generalizedaffineimage9.cc, generators6.cc, h79widening1.cc,
+	  intersection10.cc, intersection11.cc, intersection2.cc,
+	  intersection7.cc, limitedh79extrapolation4.cc,
+	  linearpartition1.cc, linearpartition2.cc, linearpartition3.cc,
+	  mapspacedims1.cc, mapspacedims2.cc, mapspacedims3.cc,
+	  mapspacedims4.cc, membytes1.cc, membytes2.cc, memory1.cc,
+	  permute.cc, polydifference7.cc, polydifference9.cc, polyhull4.cc,
+	  polyhull8.cc, polyhull9.cc, randphull1.cc, randphull2.cc,
+	  relations17.cc, relations19.cc, relations9.cc, smm1.cc,
+	  topclosure4.cc, watchdog1.cc, writeconsys1.cc, writegensys1.cc,
+	  writegensys2.cc, writegensys3.cc, writepolyhedron1.cc,
+	  writepolyhedron2.cc, writepolyhedron3.cc, writerelation1.cc,
+	  writevariable1.cc
+	  (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,3,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2]):
+	  Prefer using anonymous namespace to specify internal linkage.
+
+2004-12-28 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (altnum.3): New implementation for
+	  BD_Shape<T>::relation_with(const Generator& g).
+
+2004-12-28 Tuesday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BD_Shape/affinepreimage1.cc (altnum.3): Typo fixed.
+
+2004-12-28 Tuesday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, tests/BD_Shape/addconstraints1.cc,
+	  tests/BD_Shape/addspacedims1.cc, tests/BD_Shape/addspacedims2.cc,
+	  tests/BD_Shape/addspacedims3.cc, tests/BD_Shape/addspacedims4.cc,
+	  tests/BD_Shape/addspacedims5.cc, tests/BD_Shape/addspacedims6.cc,
+	  tests/BD_Shape/addspacedims7.cc, tests/BD_Shape/affineimage1.cc,
+	  tests/BD_Shape/affineimage2.cc, tests/BD_Shape/affineimage3.cc,
+	  tests/BD_Shape/affineimage4.cc, tests/BD_Shape/affineimage5.cc,
+	  tests/BD_Shape/affineimage6.cc, tests/BD_Shape/affineimage7.cc,
+	  tests/BD_Shape/affinepreimage1.cc,
+	  tests/BD_Shape/affinepreimage2.cc,
+	  tests/BD_Shape/affinepreimage3.cc,
+	  tests/BD_Shape/affinepreimage4.cc,
+	  tests/BD_Shape/ascii_dump_load1.cc,
+	  tests/BD_Shape/ascii_dump_load2.cc,
+	  tests/BD_Shape/cc76extrapolation1.cc,
+	  tests/BD_Shape/cc76extrapolation2.cc,
+	  tests/BD_Shape/cc76extrapolation3.cc,
+	  tests/BD_Shape/cc76extrapolation4.cc,
+	  tests/BD_Shape/cc76extrapolation5.cc,
+	  tests/BD_Shape/cc76extrapolation6.cc,
+	  tests/BD_Shape/cc76narrowing1.cc,
+	  tests/BD_Shape/cc76narrowing2.cc,
+	  tests/BD_Shape/cc76narrowing3.cc,
+	  tests/BD_Shape/cc76narrowing4.cc,
+	  tests/BD_Shape/cc76narrowing5.cc,
+	  tests/BD_Shape/ch78widening1.cc, tests/BD_Shape/ch78widening2.cc,
+	  tests/BD_Shape/ch78widening3.cc, tests/BD_Shape/ch78widening4.cc,
+	  tests/BD_Shape/ch78widening5.cc, tests/BD_Shape/ch78widening6.cc,
+	  tests/BD_Shape/ch78widening7.cc, tests/BD_Shape/ch78widening8.cc,
+	  tests/BD_Shape/concatenate1.cc, tests/BD_Shape/concatenate2.cc,
+	  tests/BD_Shape/concatenate3.cc, tests/BD_Shape/concatenate4.cc,
+	  tests/BD_Shape/concatenate5.cc, tests/BD_Shape/constraints1.cc,
+	  tests/BD_Shape/constraints2.cc, tests/BD_Shape/contains1.cc,
+	  tests/BD_Shape/contains2.cc, tests/BD_Shape/contains3.cc,
+	  tests/BD_Shape/empty1.cc, tests/BD_Shape/empty2.cc,
+	  tests/BD_Shape/empty3.cc, tests/BD_Shape/empty4.cc,
+	  tests/BD_Shape/equality1.cc, tests/BD_Shape/exceptions1.cc,
+	  tests/BD_Shape/exceptions2.cc, tests/BD_Shape/exceptions3.cc,
+	  tests/BD_Shape/generalizedaffineimage1.cc,
+	  tests/BD_Shape/generalizedaffineimage10.cc,
+	  tests/BD_Shape/generalizedaffineimage11.cc,
+	  tests/BD_Shape/generalizedaffineimage12.cc,
+	  tests/BD_Shape/generalizedaffineimage2.cc,
+	  tests/BD_Shape/generalizedaffineimage3.cc,
+	  tests/BD_Shape/generalizedaffineimage4.cc,
+	  tests/BD_Shape/generalizedaffineimage5.cc,
+	  tests/BD_Shape/generalizedaffineimage6.cc,
+	  tests/BD_Shape/generalizedaffineimage7.cc,
+	  tests/BD_Shape/generalizedaffineimage8.cc,
+	  tests/BD_Shape/generalizedaffineimage9.cc,
+	  tests/BD_Shape/h79widening1.cc, tests/BD_Shape/intersection1.cc,
+	  tests/BD_Shape/intersection2.cc, tests/BD_Shape/intersection3.cc,
+	  tests/BD_Shape/intersection4.cc, tests/BD_Shape/intersection5.cc,
+	  tests/BD_Shape/intersection6.cc, tests/BD_Shape/intersection7.cc,
+	  tests/BD_Shape/intersection8.cc,
+	  tests/BD_Shape/limitedCC76extrapolation1.cc,
+	  tests/BD_Shape/limitedCC76extrapolation2.cc,
+	  tests/BD_Shape/limitedCC76extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation1.cc,
+	  tests/BD_Shape/limitedCH78extrapolation2.cc,
+	  tests/BD_Shape/limitedCH78extrapolation3.cc,
+	  tests/BD_Shape/limitedCH78extrapolation4.cc,
+	  tests/BD_Shape/limitedCH78extrapolation5.cc,
+	  tests/BD_Shape/limitedCH78extrapolation6.cc,
+	  tests/BD_Shape/limitedCH78extrapolation7.cc,
+	  tests/BD_Shape/limitedCH78extrapolation8.cc,
+	  tests/BD_Shape/limitedCH78extrapolation9.cc,
+	  tests/BD_Shape/limitedh79extrapolation1.cc,
+	  tests/BD_Shape/mapspacedims1.cc, tests/BD_Shape/mapspacedims2.cc,
+	  tests/BD_Shape/mapspacedims3.cc, tests/BD_Shape/mapspacedims4.cc,
+	  tests/BD_Shape/maxspacedim.cc, tests/BD_Shape/polydifference1.cc,
+	  tests/BD_Shape/polydifference2.cc,
+	  tests/BD_Shape/polydifference3.cc,
+	  tests/BD_Shape/polydifference4.cc,
+	  tests/BD_Shape/polydifference5.cc,
+	  tests/BD_Shape/polydifference6.cc, tests/BD_Shape/polyhull1.cc,
+	  tests/BD_Shape/polyhull2.cc, tests/BD_Shape/polyhull3.cc,
+	  tests/BD_Shape/polyhull4.cc, tests/BD_Shape/relations1.cc,
+	  tests/BD_Shape/relations2.cc, tests/BD_Shape/relations3.cc,
+	  tests/BD_Shape/relations4.cc, tests/BD_Shape/relations5.cc,
+	  tests/BD_Shape/universe1.cc, tests/BD_Shape/writebdiffs1.cc,
+	  tests/BD_Shape/writebdiffs2.cc
+	  (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  No longer mention `BDiffs'.
+
+2004-12-28 Tuesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.21): Deal correctly with nested include
+	  files.
+
+2004-12-28 Tuesday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BD_Shape.inlines.hh (altnum.2): Added the required template
+	  function min_assign(T& x, const T& y).
+
+2004-12-28 Tuesday 16:51  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked_ext.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[24,3,16,25,18,21]): Changed lowlevel set_special to
+	  return Result info.
+
+2004-12-28 Tuesday 16:28  Abramo Bagnara
+
+	* src/E_NIT.inlines.hh (altnum.3): Added missing rounding argument.
+
+2004-12-28 Tuesday 16:21  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.23): Documentation fix.
+
+2004-12-28 Tuesday 16:19  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[16,17]): Transformed helper function in static method.
+
+2004-12-28 Tuesday 16:18  Abramo Bagnara
+
+	* src/checked_ext.inlines.hh (altnum.2): Removed useless function.
+
+2004-12-28 Tuesday 16:17  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.24): Added policy dependance
+	  to special values.
+
+2004-12-28 Tuesday 16:16  Abramo Bagnara
+
+	* configure.ac (altnum.18): Renamed gmp option value to mpz
+
+2004-12-28 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/E_NIT.inlines.hh (altnum.2): Failed attempt to fix a problem
+	  with E_NIT (the build is still broken).
+
+2004-12-28 Tuesday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.17): Configure the `tests/BD_Shape'
+	  directory.
+
+2004-12-28 Tuesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, ppl_test.hh, BD_Shape/Makefile.am,
+	  BD_Shape/addconstraints1.cc, BD_Shape/addspacedims1.cc,
+	  BD_Shape/addspacedims2.cc, BD_Shape/addspacedims3.cc,
+	  BD_Shape/addspacedims4.cc, BD_Shape/addspacedims5.cc,
+	  BD_Shape/addspacedims6.cc, BD_Shape/addspacedims7.cc,
+	  BD_Shape/affineimage1.cc, BD_Shape/affineimage2.cc,
+	  BD_Shape/affineimage3.cc, BD_Shape/affineimage4.cc,
+	  BD_Shape/affineimage5.cc, BD_Shape/affineimage6.cc,
+	  BD_Shape/affineimage7.cc, BD_Shape/affinepreimage1.cc,
+	  BD_Shape/affinepreimage2.cc, BD_Shape/affinepreimage3.cc,
+	  BD_Shape/affinepreimage4.cc, BD_Shape/ascii_dump_load1.cc,
+	  BD_Shape/ascii_dump_load2.cc, BD_Shape/cc76extrapolation1.cc,
+	  BD_Shape/cc76extrapolation2.cc, BD_Shape/cc76extrapolation3.cc,
+	  BD_Shape/cc76extrapolation4.cc, BD_Shape/cc76extrapolation5.cc,
+	  BD_Shape/cc76extrapolation6.cc, BD_Shape/cc76narrowing1.cc,
+	  BD_Shape/cc76narrowing2.cc, BD_Shape/cc76narrowing3.cc,
+	  BD_Shape/cc76narrowing4.cc, BD_Shape/cc76narrowing5.cc,
+	  BD_Shape/ch78widening1.cc, BD_Shape/ch78widening2.cc,
+	  BD_Shape/ch78widening3.cc, BD_Shape/ch78widening4.cc,
+	  BD_Shape/ch78widening5.cc, BD_Shape/ch78widening6.cc,
+	  BD_Shape/ch78widening7.cc, BD_Shape/ch78widening8.cc,
+	  BD_Shape/concatenate1.cc, BD_Shape/concatenate2.cc,
+	  BD_Shape/concatenate3.cc, BD_Shape/concatenate4.cc,
+	  BD_Shape/concatenate5.cc, BD_Shape/constraints1.cc,
+	  BD_Shape/constraints2.cc, BD_Shape/contains1.cc,
+	  BD_Shape/contains2.cc, BD_Shape/contains3.cc, BD_Shape/empty1.cc,
+	  BD_Shape/empty2.cc, BD_Shape/empty3.cc, BD_Shape/empty4.cc,
+	  BD_Shape/equality1.cc, BD_Shape/exceptions1.cc,
+	  BD_Shape/exceptions2.cc, BD_Shape/exceptions3.cc,
+	  BD_Shape/generalizedaffineimage1.cc,
+	  BD_Shape/generalizedaffineimage10.cc,
+	  BD_Shape/generalizedaffineimage11.cc,
+	  BD_Shape/generalizedaffineimage12.cc,
+	  BD_Shape/generalizedaffineimage2.cc,
+	  BD_Shape/generalizedaffineimage3.cc,
+	  BD_Shape/generalizedaffineimage4.cc,
+	  BD_Shape/generalizedaffineimage5.cc,
+	  BD_Shape/generalizedaffineimage6.cc,
+	  BD_Shape/generalizedaffineimage7.cc,
+	  BD_Shape/generalizedaffineimage8.cc,
+	  BD_Shape/generalizedaffineimage9.cc, BD_Shape/h79widening1.cc,
+	  BD_Shape/intersection1.cc, BD_Shape/intersection2.cc,
+	  BD_Shape/intersection3.cc, BD_Shape/intersection4.cc,
+	  BD_Shape/intersection5.cc, BD_Shape/intersection6.cc,
+	  BD_Shape/intersection7.cc, BD_Shape/intersection8.cc,
+	  BD_Shape/limitedCC76extrapolation1.cc,
+	  BD_Shape/limitedCC76extrapolation2.cc,
+	  BD_Shape/limitedCC76extrapolation3.cc,
+	  BD_Shape/limitedCH78extrapolation1.cc,
+	  BD_Shape/limitedCH78extrapolation2.cc,
+	  BD_Shape/limitedCH78extrapolation3.cc,
+	  BD_Shape/limitedCH78extrapolation4.cc,
+	  BD_Shape/limitedCH78extrapolation5.cc,
+	  BD_Shape/limitedCH78extrapolation6.cc,
+	  BD_Shape/limitedCH78extrapolation7.cc,
+	  BD_Shape/limitedCH78extrapolation8.cc,
+	  BD_Shape/limitedCH78extrapolation9.cc,
+	  BD_Shape/limitedh79extrapolation1.cc, BD_Shape/mapspacedims1.cc,
+	  BD_Shape/mapspacedims2.cc, BD_Shape/mapspacedims3.cc,
+	  BD_Shape/mapspacedims4.cc, BD_Shape/maxspacedim.cc,
+	  BD_Shape/polydifference1.cc, BD_Shape/polydifference2.cc,
+	  BD_Shape/polydifference3.cc, BD_Shape/polydifference4.cc,
+	  BD_Shape/polydifference5.cc, BD_Shape/polydifference6.cc,
+	  BD_Shape/polyhull1.cc, BD_Shape/polyhull2.cc,
+	  BD_Shape/polyhull3.cc, BD_Shape/polyhull4.cc,
+	  BD_Shape/relations1.cc, BD_Shape/relations2.cc,
+	  BD_Shape/relations3.cc, BD_Shape/relations4.cc,
+	  BD_Shape/relations5.cc, BD_Shape/removespacedims1.cc,
+	  BD_Shape/removespacedims2.cc, BD_Shape/removespacedims3.cc,
+	  BD_Shape/timeelapse1.cc, BD_Shape/timeelapse2.cc,
+	  BD_Shape/timeelapse3.cc, BD_Shape/timeelapse4.cc,
+	  BD_Shape/timeelapse5.cc, BD_Shape/universe1.cc,
+	  BD_Shape/writebdiffs1.cc, BD_Shape/writebdiffs2.cc
+	  (altnum.[9,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Tests for the BD_Shape class.
+
+2004-12-28 Tuesday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.14): Fixed the indentation of a
+	  few comments.
+
+2004-12-28 Tuesday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint_System.defs.hh (1.5), Generator_System.defs.hh
+	  (1.6): Header file inclusions fixed.
+
+2004-12-28 Tuesday 13:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint_System.cc (1.4): Avoid recomputing the same
+	  expression more than once.
+
+2004-12-28 Tuesday 11:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.19): Documented the new policy about swap method and
+	  std::swap specialization.
+
+2004-12-28 Tuesday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.46), Constraint.defs.hh (1.101),
+	  Constraint.inlines.hh (1.58), Constraint_System.cc (1.3),
+	  Constraint_System.defs.hh (1.4), Generator.cc (1.57),
+	  Generator.defs.hh (1.99), Generator.inlines.hh (1.52),
+	  Generator_System.defs.hh (1.5), Linear_Expression.defs.hh (1.7),
+	  Polyhedron.inlines.hh (1.106), Polyhedron_nonpublic.cc (1.41),
+	  Polyhedron_public.cc (1.47), Polyhedron_widenings.cc (1.39):
+	  Classes Constraint and Generator now have comparison operators ==
+	  and !=, checking for semantic equivalence.  Class constraint has
+	  publicly available methods is_tautological() and
+	  is_inconsistent(), replacing the preovate methods
+	  is_trivial_true() and is_trivial_false().  The swap methods of
+	  classes Constraint, Generator, Linear_Expression,
+	  Constraint_System and Generator_System are now publicly
+	  available.  Corrected a minor efficiency bug in
+	  Polyhedron::shrink_bounding_box().
+
+2004-12-28 Tuesday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.136): Two important items added.
+
+2004-12-26 Sunday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.100): Useless explicit qualification
+	  removed.
+
+2004-12-26 Sunday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.99): FIXME added: we do not seem to
+	  have strong reason to let Polyhedron be a friend of Constraint.
+
+2004-12-25 Saturday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, ChangeLog, NEWS, README, README.configure, STANDARDS,
+	  TODO, config.guess, config.rpath, config.sub, configure.ac,
+	  install-sh, ppl.lsm.in, ppl.spec.in, Watchdog/ChangeLog,
+	  Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/README,
+	  Watchdog/config.guess, Watchdog/config.sub,
+	  Watchdog/configure.ac, Watchdog/install-sh,
+	  Watchdog/pwl_filter_doxygen.sed, Watchdog/pwl_filter_install.sed,
+	  Watchdog/pwl_header.bottom, Watchdog/pwl_header.middle,
+	  Watchdog/pwl_header.top, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/dummy.cc, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/Makefile.am, doc/README, doc/README.doc, doc/definitions.dox,
+	  doc/devref.tex, doc/user.tex, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/GNU/gnu_pl_check.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/SWI/swi_pl_check.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  m4/ac_cxx_double_is_iec_559.m4, m4/ac_cxx_float_is_iec_559.m4,
+	  m4/ac_cxx_long_double_is_iec_559.m4, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Coefficient.types.hh,
+	  src/Coefficient_traits_template.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.types.hh, src/Generator_System.defs.hh,
+	  src/Interval.defs.hh, src/Interval.inlines.hh, src/Limits.hh,
+	  src/Linear_Expression.defs.hh, src/Linear_Row.cc,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Makefile.am,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.inlines.hh,
+	  src/Widening_Function.defs.hh, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_int.inlines.hh,
+	  src/globals.defs.hh, src/initializer.hh, src/ppl_header.bottom,
+	  src/ppl_header.middle, src/swapping_sort.icc, tests/BBox.cc,
+	  tests/Polyhedron/Makefile.am, tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/timeelapse9.cc, tests/Polyhedron/watchdog1.cc
+	  (altnum.[5,2,7,3,3,3,7,4,1,3,16,4,2,2,2,5,2,2,4,3,3,4,1,1,1,1,1,6,10,4,1,5,3,2,1,7,3,3,8,5,7,2,9,1,5,2,3,3,5,4,1,3,5,7,5,8,1,4,3,8,2,2,3,4,8,2,2,3,1,1,1,15,16,2,2,6,5,7,4,2,5,8,4,2,3,4,4,4,20,8,8,4,5,5,8,11,8,3,3,2,2,5,22,15,23,9,1,1,1,3,3,3,2,2,2,2,2,2,2,2,2,2,1,2]):
+	  Seventh merge from main trunk.
+
+2004-12-25 Saturday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.147), README (1.34), configure.ac (1.154),
+	  src/Makefile.am (1.96): Updated for PPL 0.8.
+
+2004-12-24 Friday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_7-branch.1): Update version.
+
+2004-12-24 Friday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_7-branch.[1,1]): Mark
+	  ChangeLog.
+
+2004-12-24 Friday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.20), Watchdog/ChangeLog (1.10): Updated.
+
+2004-12-24 Friday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.33), Watchdog/README (1.9): Updated.
+
+2004-12-24 Friday 14:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-browse.doxyconf-latex.in (1.24),
+	  doc/user-print.doxyconf-latex.in (1.24),
+	  doc/user.doxyconf-html.in (1.26), src/Coefficient.types.hh (1.5),
+	  src/GMP_Integer.types.hh (1.6), src/Makefile.am (1.95),
+	  src/Native_Integer.defs.hh (1.8), src/Native_Integer.types.hh
+	  (1.6): On a second thought, the user shouldn't care much about
+	  coefficient traits: the corresponding documentation now occurs in
+	  the devref manual only.
+
+2004-12-24 Friday 12:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.13): Typo fixed.
+
+2004-12-24 Friday 12:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/user-browse.doxyconf-latex.in (1.23),
+	  doc/user-print.doxyconf-latex.in (1.23),
+	  doc/user.doxyconf-html.in (1.25), src/Checked_Number.defs.hh
+	  (1.6), src/Coefficient.types.hh (1.4),
+	  src/Coefficient_traits_template.hh (1.2),
+	  src/GMP_Integer.types.hh (1.5), src/Linear_System.inlines.hh
+	  (1.11), src/Makefile.am (1.94), src/Native_Integer.defs.hh (1.7),
+	  src/Native_Integer.types.hh (1.5), src/checked.defs.hh (1.6),
+	  src/globals.defs.hh (1.13): Minor improvements to the
+	  documentation.
+
+2004-12-24 Friday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.38), ciao_clpq.pl (1.13),
+	  ciao_clpq2.pl (1.9), ciao_pl_check.pl (1.9): Fixed for the case
+	  where the source and the build directories coincide.
+
+2004-12-24 Friday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/.cvsignore (1.10): Updated.
+
+2004-12-24 Friday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.17): No longer mention erased files.
+
+2004-12-24 Friday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.bottom (1.6): The preprocessor symbol
+	  PPL_FLEXIBLE_ARRAY is no longer used.
+
+2004-12-24 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: pwl_header.bottom (1.2), pwl_header.top (1.5):
+	  Handling of NDEBUG improved.
+
+2004-12-24 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/pwl_header.middle (1.3): We no longer support GCC
+	  versions prior to 3.
+
+2004-12-24 Friday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.24): Require Autoconf 2.59.
+
+2004-12-24 Friday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README (1.8): Version number bumped.
+
+2004-12-24 Friday 11:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.16), pwl_filter_doxygen.sed (1.2),
+	  pwl_filter_install.sed (1.2): Obsolete filters removed.  Shared
+	  library version info updated.
+
+2004-12-24 Friday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.24): Sentence fixed.
+
+2004-12-24 Friday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.rpath (1.3): Updated.
+
+2004-12-24 Friday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.146), README.configure (1.11), TODO (1.135): Minor
+	  improvements.
+
+2004-12-24 Friday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.15): AIDA project credited.
+
+2004-12-24 Friday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Checked_Number.inlines.hh (1.11), Native_Integer.inlines.hh
+	  (1.8), checked.defs.hh (1.5): Added some \relates doxygen
+	  commands.
+
+2004-12-24 Friday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.15), Watchdog/configure.ac (1.23),
+	  interfaces/Prolog/YAP/Makefile.am (1.33): Enable the creation of
+	  DLLs under Cygwin.
+
+2004-12-24 Friday 08:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.134): More checking of the documentation should be done.
+
+2004-12-24 Friday 08:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Generator_System.defs.hh (1.4), Linear_Expression.defs.hh
+	  (1.6), Polyhedra_Powerset.defs.hh (1.12), Polyhedron.defs.hh
+	  (1.262), Powerset.defs.hh (1.6): Several small improvements to
+	  the documantation.
+
+2004-12-23 Thursday 22:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.145): Added quotes.
+
+2004-12-23 Thursday 22:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.144): Mentioned the new configuration option
+	  --enable-coefficients.
+
+2004-12-23 Thursday 21:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.32), src/Checked_Number.defs.hh (1.5),
+	  src/Coefficient.types.hh (1.3), src/GMP_Integer.defs.hh (1.4),
+	  src/GMP_Integer.types.hh (1.4), src/Makefile.am (1.93),
+	  src/Native_Integer.defs.hh (1.6), src/Native_Integer.types.hh
+	  (1.4): Drafted the doxygen documentation for Coefficient,
+	  GMP_Integer, Checked_Number and Native_Integer, as well as
+	  corresponding traits.  Corrected a minor error in the README
+	  file.
+
+2004-12-23 Thursday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.31), interfaces/Prolog/SWI/Makefile.am (1.43),
+	  src/globals.defs.hh (1.12): Redundant inline declarations
+	  removed.
+
+2004-12-23 Thursday 14:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.42): Let `plld' use the C++
+	  compiler to perform linking.
+
+2004-12-23 Thursday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.23), doc/README (1.5), doc/README.doc (1.1): The
+	  file doc/README has been renamed README.doc so as not to conflict
+	  with the library's main README file.
+
+2004-12-23 Thursday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.22): Updated.
+
+2004-12-23 Thursday 11:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.153), src/Makefile.am (1.92): Allow the creation
+	  of a PPL DLL under Cygwin.
+
+2004-12-23 Thursday 11:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.10): Small improvement.
+
+2004-12-23 Thursday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.9): Updated.
+
+2004-12-23 Thursday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.14): Make sure
+	  Polyhedra_Powerset<PH>::space_dimension() is defined before being
+	  used.
+
+2004-12-23 Thursday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (1.5): Never include <config.h> from a header
+	  file.
+
+2004-12-22 Wednesday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BBox.cc (1.7): Avoid repeating the inclusion of
+	  "ppl_install.hh".
+
+2004-12-22 Wednesday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/initializer.hh (1.9): Multiple inclusion guard fixed.
+
+2004-12-22 Wednesday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.8): Added a section on enabling the use of
+	  alternative coefficient types.
+
+2004-12-22 Wednesday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.9), dummy.cc (1.1): Force using
+	  the C++ compiler for linking.
+
+2004-12-22 Wednesday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.37), GNU/Makefile.am
+	  (1.42), SICStus/Makefile.am (1.49), SWI/Makefile.am (1.41),
+	  XSB/Makefile.am (1.30), YAP/Makefile.am (1.32): Do not use the
+	  `-no-undefined' Libtool option to build the dynamically loadable
+	  modules.
+
+2004-12-22 Wednesday 16:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.167):	Changed  "of" to "on"  in:
+
+	   Note that all the documented operators automatically
+	  perform reductions on their arguments, when needed or
+	  appropriate.
+
+2004-12-22 Wednesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.133): The remaining item postponed to version 0.8 or
+	  later.
+
+2004-12-22 Wednesday 16:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.132), doc/definitions.dox (1.166),
+	  src/Determinate.defs.hh (1.51): Added a note about lazy
+	  Omega-reduction in the documentation of the powerset domain.
+	  Avoid underscore when providing the name of operators, unless
+	  inside a <CODE> tag.
+
+2004-12-22 Wednesday 16:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.defs.hh (1.5): Added a reference to the description
+	  of the powerset domain in definitions.dox.  Documented the
+	  methods begin() and end() returning a const_iterator.
+
+2004-12-22 Wednesday 14:39  Abramo Bagnara
+
+	* src/float.types.hh (1.4): Added IEC559 conformance conditional
+	  for larger types.
+
+2004-12-22 Wednesday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.123): Better support for different
+	  definitions of `size_t'.
+
+2004-12-22 Wednesday 14:19  Abramo Bagnara
+
+	* src/float.types.hh (1.3): Added support for iec559 types
+	  detection.
+
+2004-12-22 Wednesday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Powerset.inlines.hh (1.6): Added a couple of inline
+	  declarations.
+
+2004-12-22 Wednesday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.152), demos/ppl_lcdd/Makefile.am (1.17): On
+	  Darwin, the `md5sum' program does not support the `-t' option and
+	  compilation is best done with the `-Wno-long-double' option.
+
+2004-12-22 Wednesday 13:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.131): Added an item saying that we should reconsider the
+	  "with_token" predicates in the Prolog interface.
+
+2004-12-22 Wednesday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.16): Fixed the way `md5sum' is
+	  invoked.
+
+2004-12-22 Wednesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.6): Updated with new authors and new size of the
+	  archive.
+
+2004-12-22 Wednesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.151): Version number bumped.
+
+2004-12-22 Wednesday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.130): Updated.
+
+2004-12-22 Wednesday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.18): The requirement of keeping source lines short
+	  has been softened.
+
+2004-12-22 Wednesday 10:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.129), interfaces/Prolog/Prolog_interface.dox (1.125),
+	  interfaces/Prolog/exceptions.hh (1.14),
+	  interfaces/Prolog/ppl_prolog.icc (1.150),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.77),
+	  interfaces/Prolog/tests/pl_check.pl (1.6): In the Prolog
+	  interface, exceptions now always thrown if input values (other
+	  than lists) are invalid.
+
+	  Tests for these new exceptions added to the pl_check.pl test
+	  file.
+
+	  Corrected bug in Prolog interface in the case when a list was
+	  expected but a non-list was input.
+
+	  The interface needs to be changed so that it throws an exception
+	  for non-lists (instead of just Prolog failure) when a list is
+	  expected; this job has been added to the TODO file.
+
+2004-12-22 Wednesday 00:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.240), timeelapse9.cc (1.1): Added a new
+	  test, experimenting method
+	  Polyhedra_Powerset::time_elapse_assign() as well as the new
+	  (corrected) implementation of the equality test for class
+	  Powerset.
+
+2004-12-22 Wednesday 00:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_Powerset.defs.hh (1.11),
+	  Polyhedra_Powerset.inlines.hh (1.13): Added methods
+	  intersection_assign() and time_elapse_assign(), exploiting the
+	  generic function Powerset::pairwise_apply_assign().  A lot of
+	  simple operators declared inline.
+
+2004-12-22 Wednesday 00:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Powerset.defs.hh (1.4), Powerset.inlines.hh (1.5): Member
+	  omega_reduce() made (temporarily) publicly available.  Added a
+	  generic method pairwise_apply_assign() to apply a binary operator
+	  to all pairs drawn from two powersets.  A lot of simple operators
+	  declared inline.
+
+2004-12-21 Tuesday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.150), m4/ac_cxx_double_is_iec_559.m4 (1.1),
+	  m4/ac_cxx_float_is_iec_559.m4 (1.1),
+	  m4/ac_cxx_long_double_is_iec_559.m4 (1.1): New tests to check
+	  whether C++ floats, doubles and long doubles comply to IEC 559.
+
+2004-12-21 Tuesday 23:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.149): Detect the sizes of float, double and long
+	  double.
+
+2004-12-21 Tuesday 22:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.50), Determinate.inlines.hh (1.44):
+	  Added a function object adapter to lift any "apply_and_assign"
+	  function object defined on PH so as to obtain the corresponding
+	  function object working on Determinate<PH>.
+
+2004-12-21 Tuesday 22:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.defs.hh (1.9): Unary constructor made
+	  explicit.
+
+2004-12-21 Tuesday 22:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.17): std::swap_iter() ===> std::iter_swap().
+
+2004-12-21 Tuesday 08:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.165), src/Polyhedron.defs.hh (1.261):
+	  Spelling and similar corrections to the documentation.
+
+2004-12-21 Tuesday 08:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.43): Spelling and similar corrections
+	  to documentation.
+
+2004-12-20 Monday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_Row.cc (1.4): Unused, duplicated code removed.
+
+2004-12-20 Monday 21:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.10): The Comeau and Intel C++
+	  compilers are actually right: if check_result() has internal
+	  linkage (is declared static) then, according to section 14.6.4.2
+	  of the C++ standard (Candidate Functions), it is not a candidate
+	  function and thus it is not found by the name lookup mechanism.
+
+2004-12-20 Monday 14:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/polydifference9.cc (1.6): Comment corrected.
+
+2004-12-20 Monday 11:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.122): Previous change corrected again.
+
+2004-12-20 Monday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.121): Previous change completed.
+
+2004-12-20 Monday 10:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.120): Support definitions for `size_t'
+	  different from `unsigned'.
+
+2004-12-20 Monday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.148): Detect the size of more C types.
+
+2004-12-20 Monday 07:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.10): Fixed an instance of LONG_MAX
+	  that should instead be ULONG_MAX.
+
+2004-12-19 Sunday 12:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.22), configure.ac (1.147): Version
+	  number bumped.
+
+2004-12-19 Sunday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.31): Updated.
+
+2004-12-19 Sunday 11:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.143), Watchdog/NEWS (1.5): The tentative release date for
+	  PPL 0.7 is December 24, 2004.
+
+2004-12-19 Sunday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/swapping_sort.icc (1.7): Make sure emacs recognizes this file
+	  as C++.
+
+2004-12-19 Sunday 09:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.16), interfaces/C/ppl_c.cc (1.119),
+	  interfaces/Prolog/track_allocation.hh (1.14),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.76),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.3),
+	  interfaces/Prolog/SWI/swi_pl_check.pl (1.2),
+	  interfaces/Prolog/tests/clpq.pl (1.4),
+	  interfaces/Prolog/tests/clpq2.pl (1.4),
+	  interfaces/Prolog/tests/pl_check.pl (1.5), src/Interval.defs.hh
+	  (1.20), src/Interval.inlines.hh (1.16), src/swapping_sort.icc
+	  (1.6), tests/bhz03widening2.cc (1.10), tests/bhz03widening3.cc
+	  (1.9), tests/bhz03widening5.cc (1.7), tests/bhz03widening6.cc
+	  (1.8), tests/expandspacedim1.cc (1.3), tests/foldspacedims1.cc
+	  (1.2), tests/foldspacedims2.cc (1.2), tests/watchdog1.cc (1.21):
+	  Avoid "baStudlyCaps" identifiers everywhere.
+
+2004-12-19 Sunday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.9): Workaround for the Comeau
+	  and Intel C++ compilers: they do not like the use of `static' in
+	  a particular context.
+
+2004-12-19 Sunday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.19), Watchdog/ChangeLog (1.9): Updated.
+
+2004-12-19 Sunday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.26), config.sub (1.24), Watchdog/config.guess
+	  (1.10), Watchdog/config.sub (1.9): Updated.
+
+2004-12-19 Sunday 07:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.12), Watchdog/install-sh (1.9): Updated from
+	  Automake 1.9.4.
+
+2004-12-18 Saturday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.29): Erase the *.xwam files
+	  so as to force XSB to recompile.
+
+2004-12-18 Saturday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.142): One entry slightly improved.
+
+2004-12-18 Saturday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.149): No longer support unary
+	  plus in linear expressions.  Avoid long source lines.
+
+2004-12-17 Friday 18:59  Abramo Bagnara
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc, XSB/ppl_xsb.cc,
+	  YAP/ppl_yap.cc (altnum.[6,7,7]): Added missing colons.
+
+2004-12-17 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (altnum.15): Created tests/Polyhedron/Makefile.
+
+2004-12-17 Friday 18:20  Abramo Bagnara
+
+	* configure.ac, demos/ppl_lcdd/ppl_lcdd.cc, interfaces/C/ppl_c.cc,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/Interval.inlines.hh,
+	  src/Polyhedron_nonpublic.cc, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh
+	  (altnum.[14,9,7,8,5,4,6,7,6,6,14,15,7,10,21,14,15,22,17,20]):
+	  Added rounding support to checked functions.
+
+2004-12-17 Friday 18:18  Abramo Bagnara
+
+	* src/Makefile.am (altnum.19): Added new files.
+
+2004-12-17 Friday 18:17  Abramo Bagnara
+
+	* src/: Limits.hh, float.types.hh (altnum.[3,4]): More portable
+	  code.
+
+2004-12-17 Friday 18:17  Abramo Bagnara
+
+	* src/: Float.defs.hh, Float.inlines.hh (altnum.[1,1]): Better
+	  place for IEC559 format related functions.
+
+2004-12-17 Friday 18:16  Abramo Bagnara
+
+	* src/Numeric_Format.defs.hh (altnum.1): Initial empty
+	  Numeric_Format definition.
+
+2004-12-17 Friday 18:15  Abramo Bagnara
+
+	* src/: Result.defs.hh, Result.inlines.hh (altnum.[1,1]): Better
+	  place for Result.
+
+2004-12-17 Friday 18:15  Abramo Bagnara
+
+	* src/: fpu-c99.inlines.hh, fpu-ia32.inlines.hh, fpu.defs.hh
+	  (altnum.[1,1,1]): FPU manipulation functions.
+
+2004-12-17 Friday 18:14  Abramo Bagnara
+
+	* src/: checked_ext.defs.hh, checked_ext.inlines.hh (altnum.[1,1]):
+	  Better place for new extended numbers functions.
+
+2004-12-17 Friday 18:13  Abramo Bagnara
+
+	* src/: Rounding.defs.hh, Rounding.inlines.hh, Rounding.types.hh
+	  (altnum.[1,1,1]): Rounding mode support.
+
+2004-12-17 Friday 18:11  Abramo Bagnara
+
+	* src/: compiler.hh, globals.defs.hh (altnum.[1,8]): Moved used
+	  helper to better place.
+
+2004-12-17 Friday 17:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.18): Do not mention DB_Shape.cc.
+
+2004-12-17 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.17): Do not mention DB_Matrix.cc.
+
+2004-12-17 Friday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.16): Do not mention DB_Row.cc.
+
+2004-12-17 Friday 12:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.141), interfaces/Prolog/Prolog_interface.dox (1.124): As
+	  it is not in standard Prolog, the unary "+" is not supported in
+	  the Prolog interface.
+
+2004-12-16 Thursday 19:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.128): Dealt with one item of the list.
+
+2004-12-16 Thursday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.118): Fixed a problem whereby
+	  ppl_set_error_handler() could have (depending on the compiler
+	  employed) C++ linkage instead of C linkage.
+
+2004-12-16 Thursday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.8): Define a dummy
+	  set_GMP_memory_allocation_functions(), if the C++ compiler does
+	  not support __attribute__((weak)).
+
+2004-12-16 Thursday 18:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.146), demos/ppl_lcdd/ppl_lcdd.cc (1.39): Do not
+	  use C++-style comments in config.h.
+
+2004-12-16 Thursday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.61): Unused variable
+	  `a_throw' removed.
+
+2004-12-16 Thursday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.145), src/Coefficient.types.hh (1.2),
+	  src/ppl_header.middle (1.5): Problem with Comeau C/C++ and the
+	  definition of `int64_t' solved in a better way.  Always link with
+	  the `libm' library.
+
+2004-12-16 Thursday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: addgenerator1.cc (1.9), addgenerator2.cc (1.9): Tests
+	  corrected: they were just calling generators(), yet relying on
+	  the fact that a non-redundant description would have been
+	  obtained.
+
+2004-12-16 Thursday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.46): Added a preprocessing flag to
+	  control whether we insist on returning sorted descriptions.
+	  Currently the flag is unset and we only order the generator
+	  systems of NNC polyhedra, if these are known to be in minimal
+	  form.
+
+2004-12-16 Thursday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.13): Corrected a bug in method
+	  add_rows(); the sortedness flag was not handled correctly when
+	  the arguemnt was not sorted or had pending rows. This bug was
+	  hidden by some unnecessary sorting done before calling the
+	  method.
+
+2004-12-16 Thursday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.12): We were relying on a
+	  GCC bug concerning name-lookup.
+
+2004-12-16 Thursday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.middle (1.4): // In order for the definition of
+	  `int64_t' to be seen by Comeau C/C++, // we must make sure
+	  <stdint.h> is included before <sys/types.hh> is // (even
+	  indirectly) included.  #include <stdint.h>
+
+2004-12-16 Thursday 09:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.123): Some errors
+	  corrected. The token C_unsigned now used to name a C unsigned
+	  integer.
+
+2004-12-16 Thursday 08:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.140), interfaces/Prolog/Prolog_interface.dox (1.122),
+	  interfaces/Prolog/ppl_prolog.icc (1.148),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.12),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.8),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.8),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.75),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.49),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.70),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.94),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.36),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.60),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.11),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.9),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.13),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.86),
+	  interfaces/Prolog/tests/clpq.pl (1.3),
+	  interfaces/Prolog/tests/clpq2.pl (1.3),
+	  interfaces/Prolog/tests/pl_check.pl (1.4): In the Prolog
+	  interface, the predicates
+	  ppl_new_polyhedron_universe_from_space_dimension/3 and
+	  ppl_new_polyhedron_empty_from_space_dimension/3 have been
+	  replaced by	 a single predicate
+	  ppl_new_polyhedron_from_space_dimension/4 where the (extra) third
+	  argument    indicates whether the polyhedron to be created should
+	  be the    universe or the empty polyhedron.  NEWS has been
+	  revised accordingly.
+
+2004-12-15 Wednesday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.9): Declare strtoll() and
+	  strtoull() if they are not already declared.
+
+2004-12-15 Wednesday 23:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.12): Fixed the return value of
+	  template <typename Policy, typename T> Result succ_float(T&).
+
+2004-12-15 Wednesday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.10): Fixed
+	  Linear_System::With_Saturation_Matrix_iterator::operator->().
+
+2004-12-15 Wednesday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Saturation_Row.cc (1.3), Saturation_Row.inlines.hh (1.2):
+	  Depend on HAVE_DECL_FFS instead of HAS_FFS.
+
+2004-12-15 Wednesday 23:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.144): Checks for the availability of ffs, strtoll
+	  and strtoull in C++.
+
+2004-12-15 Wednesday 23:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.defs.hh (1.11): Use
+	  std::iterator_traits<Iter1>::attribute instead of
+	  Iter1::attribute.
+
+2004-12-15 Wednesday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Limits.hh (1.3), checked_float.inlines.hh (1.11),
+	  checked_int.inlines.hh (1.8): Moved the declaration of LLONG_MIN,
+	  LLONG_MAX and ULLONG_MAX to Limits.hh.  Refer to C99 standard
+	  types uint*_t instead of u_int*_t.  Include <climits> and
+	  <cstdlib> instead of <limits.h> and <stdlib.h>.
+
+2004-12-15 Wednesday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.7): Define ULLONG_MAX, if it is not
+	  already defined.  Use ULLONG_MAX instead of ULONG_LONG_MAX, since
+	  the latter is GCC-specific.
+
+2004-12-15 Wednesday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.91): Explicitly pass CPPFLAGS when invoking
+	  CXXCPP explicitly.
+
+2004-12-15 Wednesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.143): Added a check for the size of long long.
+	  Fixed a couple of comments.
+
+2004-12-14 Tuesday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.139), interfaces/Prolog/Prolog_interface.dox (1.121),
+	  interfaces/Prolog/ppl_prolog.icc (1.147),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.11),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.7),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.7),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.74),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.48),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.69),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.93),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.35),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.59),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.10),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.8),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.12),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.85),
+	  interfaces/Prolog/tests/clpq.pl (1.2),
+	  interfaces/Prolog/tests/clpq2.pl (1.2),
+	  interfaces/Prolog/tests/pl_check.pl (1.3): In the Prolog
+	  interface, the predicate    ppl_new_polyhedron_from_dimension/3
+	  has been renamed
+	  ppl_new_polyhedron_universe_from_space_dimension/3	and the
+	  predicate    ppl_new_polyhedron_empty_from_dimension/3 has been
+	  renamed    ppl_new_polyhedron_empty_from_space_dimension/3.  NEWS
+	  updated to include this information.
+
+2004-12-14 Tuesday 11:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.120): Replace the date
+	  type "Integer" used in the syntax specification by
+	  "Dimension_Type", "Coefficient", "C_int", or "Token_Flag" as
+	  appropriate.	Some other small improvements and corrections also
+	  done.
+
+2004-12-14 Tuesday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.42): Reverted previous change, since
+	  it was hiding a doxygen bug, which is the actual source of the
+	  undefined reference.
+
+2004-12-13 Monday 15:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.41): Avoid autolink generation for
+	  ppl_c.h.
+
+2004-12-13 Monday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref.tex (1.16), user.tex (1.17): Also thank the new
+	  COFIN project.
+
+2004-12-13 Monday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_nonpublic.cc (1.40), Polyhedron_public.cc
+	  (1.45): Minor documentation changes; use const where appropriate.
+
+2004-12-13 Monday 08:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.127): The sorting routines have been completely
+	  rewritten.CVS:
+	  ----------------------------------------------------------------------
+
+2004-12-12 Sunday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, src/BDS_Status.idefs.hh, src/BDS_Status.inlines.hh,
+	  src/BD_Shape.defs.hh, src/BD_Shape.inlines.hh,
+	  src/BD_Shape.types.hh, src/DB_Matrix.defs.hh,
+	  src/DB_Matrix.inlines.hh, src/DB_Matrix.types.hh,
+	  src/DB_Row.defs.hh, src/DB_Row.inlines.hh, src/DB_Row.types.hh,
+	  src/E_NIT.defs.hh, src/E_NIT.inlines.hh, src/E_NIT.types.hh,
+	  src/E_Rational.defs.hh, src/E_Rational.inlines.hh,
+	  src/E_Rational.types.hh, src/Makefile.am,
+	  src/Ptr_Iterator.defs.hh, src/Ptr_Iterator.inlines.hh,
+	  src/Ptr_Iterator.types.hh, src/globals.defs.hh,
+	  src/globals.inlines.hh
+	  (altnum.[4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,15,1,1,1,7,4]):
+	  Added a draft implementation of bounded differences.
+
+2004-12-12 Sunday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Polyhedron/Makefile.am (altnum.2): The `BBox' class
+	  implementation is now contained in the convenience library
+	  `libppl_tests'.
+
+2004-12-12 Sunday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, tests/.cvsignore, tests/CbecomesNNC1.cc,
+	  tests/Makefile.am, tests/NNCbecomesC1.cc, tests/NNCminimize1.cc,
+	  tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+	  tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+	  tests/NNCminimize6.cc, tests/README, tests/addconstraint1.cc,
+	  tests/addconstraint2.cc, tests/addconstraint3.cc,
+	  tests/addconstraints1.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/addconstraints13.cc, tests/addconstraints2.cc,
+	  tests/addconstraints3.cc, tests/addconstraints4.cc,
+	  tests/addconstraints5.cc, tests/addconstraints6.cc,
+	  tests/addconstraints7.cc, tests/addconstraints8.cc,
+	  tests/addconstraints9.cc, tests/addgenerator1.cc,
+	  tests/addgenerator2.cc, tests/addgenerator3.cc,
+	  tests/addgenerator4.cc, tests/addgenerator5.cc,
+	  tests/addgenerators1.cc, tests/addgenerators10.cc,
+	  tests/addgenerators11.cc, tests/addgenerators12.cc,
+	  tests/addgenerators13.cc, tests/addgenerators2.cc,
+	  tests/addgenerators3.cc, tests/addgenerators4.cc,
+	  tests/addgenerators5.cc, tests/addgenerators6.cc,
+	  tests/addgenerators7.cc, tests/addgenerators8.cc,
+	  tests/addgenerators9.cc, tests/addspacedims1.cc,
+	  tests/addspacedims10.cc, tests/addspacedims11.cc,
+	  tests/addspacedims12.cc, tests/addspacedims13.cc,
+	  tests/addspacedims2.cc, tests/addspacedims3.cc,
+	  tests/addspacedims4.cc, tests/addspacedims5.cc,
+	  tests/addspacedims6.cc, tests/addspacedims7.cc,
+	  tests/addspacedims8.cc, tests/addspacedims9.cc,
+	  tests/affineimage1.cc, tests/affineimage2.cc,
+	  tests/affineimage3.cc, tests/affineimage4.cc,
+	  tests/affineimage5.cc, tests/affineimage6.cc,
+	  tests/affineimage7.cc, tests/affineimage8.cc,
+	  tests/affineimage9.cc, tests/affinepreimage1.cc,
+	  tests/affinepreimage10.cc, tests/affinepreimage2.cc,
+	  tests/affinepreimage3.cc, tests/affinepreimage4.cc,
+	  tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+	  tests/affinepreimage7.cc, tests/affinepreimage8.cc,
+	  tests/affinepreimage9.cc, tests/affinetrans.cc, tests/append1.cc,
+	  tests/append2.cc, tests/ascii_dump_load1.cc,
+	  tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+	  tests/ascii_dump_load4.cc, tests/ascii_dump_load5.cc,
+	  tests/ascii_dump_load6.cc, tests/ascii_dump_load7.cc,
+	  tests/bgp99extrapolation1.cc, tests/bgp99extrapolation2.cc,
+	  tests/bhrz03widening1.cc, tests/bhrz03widening10.cc,
+	  tests/bhrz03widening11.cc, tests/bhrz03widening12.cc,
+	  tests/bhrz03widening13.cc, tests/bhrz03widening14.cc,
+	  tests/bhrz03widening15.cc, tests/bhrz03widening16.cc,
+	  tests/bhrz03widening17.cc, tests/bhrz03widening18.cc,
+	  tests/bhrz03widening19.cc, tests/bhrz03widening2.cc,
+	  tests/bhrz03widening3.cc, tests/bhrz03widening4.cc,
+	  tests/bhrz03widening5.cc, tests/bhrz03widening6.cc,
+	  tests/bhrz03widening7.cc, tests/bhrz03widening8.cc,
+	  tests/bhrz03widening9.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+	  tests/bhz03widening6.cc, tests/bounded1.cc,
+	  tests/boundedh79extrapolation1.cc, tests/boundingbox1.cc,
+	  tests/boundingbox2.cc, tests/boundingbox3.cc,
+	  tests/boundingbox4.cc, tests/boundingbox5.cc, tests/bounds1.cc,
+	  tests/bounds2.cc, tests/concatenate1.cc, tests/concatenate2.cc,
+	  tests/concatenate3.cc, tests/concatenate4.cc,
+	  tests/concatenate5.cc, tests/concatenate6.cc,
+	  tests/constraints1.cc, tests/constraints2.cc,
+	  tests/constraints3.cc, tests/constraints4.cc, tests/contains1.cc,
+	  tests/contains2.cc, tests/contains3.cc, tests/contains4.cc,
+	  tests/contains5.cc, tests/disjoint1.cc, tests/disjoint2.cc,
+	  tests/disjoint3.cc, tests/dualhypercubes.cc, tests/empty1.cc,
+	  tests/equals1.cc, tests/exceptions1.cc, tests/exceptions2.cc,
+	  tests/exceptions3.cc, tests/expandspacedim1.cc,
+	  tests/expandspacedim2.cc, tests/foldspacedims1.cc,
+	  tests/foldspacedims2.cc, tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage11.cc,
+	  tests/generalizedaffineimage12.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/generators1.cc,
+	  tests/generators2.cc, tests/generators3.cc, tests/generators4.cc,
+	  tests/generators5.cc, tests/generators6.cc, tests/geomcovers1.cc,
+	  tests/h79widening1.cc, tests/h79widening2.cc,
+	  tests/h79widening3.cc, tests/h79widening4.cc,
+	  tests/h79widening5.cc, tests/h79widening6.cc,
+	  tests/h79widening7.cc, tests/h79widening8.cc,
+	  tests/intersection1.cc, tests/intersection10.cc,
+	  tests/intersection11.cc, tests/intersection2.cc,
+	  tests/intersection3.cc, tests/intersection4.cc,
+	  tests/intersection5.cc, tests/intersection6.cc,
+	  tests/intersection7.cc, tests/intersection8.cc,
+	  tests/intersection9.cc, tests/limitedbhrz03extrapolation1.cc,
+	  tests/limitedh79extrapolation1.cc,
+	  tests/limitedh79extrapolation2.cc,
+	  tests/limitedh79extrapolation3.cc,
+	  tests/limitedh79extrapolation4.cc, tests/linearpartition1.cc,
+	  tests/linearpartition2.cc, tests/linearpartition3.cc,
+	  tests/linearpartition4.cc, tests/linexpression1.cc,
+	  tests/mapspacedims1.cc, tests/mapspacedims2.cc,
+	  tests/mapspacedims3.cc, tests/mapspacedims4.cc,
+	  tests/max_min1.cc, tests/max_min2.cc, tests/maxspacedim1.cc,
+	  tests/mc91.cc, tests/membytes1.cc, tests/membytes2.cc,
+	  tests/memory1.cc, tests/minconstraints1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/minconstraints4.cc, tests/mingenerators1.cc,
+	  tests/mingenerators2.cc, tests/mingenerators3.cc,
+	  tests/onepoint.cc, tests/permute.cc, tests/polydifference1.cc,
+	  tests/polydifference2.cc, tests/polydifference3.cc,
+	  tests/polydifference4.cc, tests/polydifference5.cc,
+	  tests/polydifference6.cc, tests/polydifference7.cc,
+	  tests/polydifference8.cc, tests/polydifference9.cc,
+	  tests/polyhull1.cc, tests/polyhull10.cc, tests/polyhull11.cc,
+	  tests/polyhull2.cc, tests/polyhull3.cc, tests/polyhull4.cc,
+	  tests/polyhull5.cc, tests/polyhull6.cc, tests/polyhull7.cc,
+	  tests/polyhull8.cc, tests/polyhull9.cc, tests/randphull1.cc,
+	  tests/randphull2.cc, tests/relations1.cc, tests/relations10.cc,
+	  tests/relations11.cc, tests/relations12.cc, tests/relations13.cc,
+	  tests/relations14.cc, tests/relations15.cc, tests/relations16.cc,
+	  tests/relations17.cc, tests/relations18.cc, tests/relations19.cc,
+	  tests/relations2.cc, tests/relations3.cc, tests/relations4.cc,
+	  tests/relations5.cc, tests/relations6.cc, tests/relations7.cc,
+	  tests/relations8.cc, tests/relations9.cc,
+	  tests/removespacedims1.cc, tests/removespacedims10.cc,
+	  tests/removespacedims2.cc, tests/removespacedims3.cc,
+	  tests/removespacedims4.cc, tests/removespacedims5.cc,
+	  tests/removespacedims6.cc, tests/removespacedims7.cc,
+	  tests/removespacedims8.cc, tests/removespacedims9.cc,
+	  tests/smm1.cc, tests/timeelapse1.cc, tests/timeelapse2.cc,
+	  tests/timeelapse3.cc, tests/timeelapse4.cc, tests/timeelapse5.cc,
+	  tests/timeelapse6.cc, tests/timeelapse7.cc, tests/timeelapse8.cc,
+	  tests/topclosed1.cc, tests/topclosed2.cc, tests/topclosed3.cc,
+	  tests/topclosure1.cc, tests/topclosure2.cc, tests/topclosure3.cc,
+	  tests/topclosure4.cc, tests/universe1.cc, tests/universe2.cc,
+	  tests/universe3.cc, tests/universe4.cc, tests/universe5.cc,
+	  tests/universe6.cc, tests/universe7.cc,
+	  tests/valgrind_suppressions, tests/watchdog1.cc,
+	  tests/writeconsys1.cc, tests/writegensys1.cc,
+	  tests/writegensys2.cc, tests/writegensys3.cc,
+	  tests/writepolyhedron1.cc, tests/writepolyhedron2.cc,
+	  tests/writepolyhedron3.cc, tests/writerelation1.cc,
+	  tests/writevariable1.cc, tests/Polyhedron/.cvsignore,
+	  tests/Polyhedron/CbecomesNNC1.cc, tests/Polyhedron/Makefile.am,
+	  tests/Polyhedron/NNCbecomesC1.cc,
+	  tests/Polyhedron/NNCminimize1.cc,
+	  tests/Polyhedron/NNCminimize2.cc,
+	  tests/Polyhedron/NNCminimize3.cc,
+	  tests/Polyhedron/NNCminimize4.cc,
+	  tests/Polyhedron/NNCminimize5.cc,
+	  tests/Polyhedron/NNCminimize6.cc, tests/Polyhedron/README,
+	  tests/Polyhedron/addconstraint1.cc,
+	  tests/Polyhedron/addconstraint2.cc,
+	  tests/Polyhedron/addconstraint3.cc,
+	  tests/Polyhedron/addconstraints1.cc,
+	  tests/Polyhedron/addconstraints10.cc,
+	  tests/Polyhedron/addconstraints11.cc,
+	  tests/Polyhedron/addconstraints12.cc,
+	  tests/Polyhedron/addconstraints13.cc,
+	  tests/Polyhedron/addconstraints2.cc,
+	  tests/Polyhedron/addconstraints3.cc,
+	  tests/Polyhedron/addconstraints4.cc,
+	  tests/Polyhedron/addconstraints5.cc,
+	  tests/Polyhedron/addconstraints6.cc,
+	  tests/Polyhedron/addconstraints7.cc,
+	  tests/Polyhedron/addconstraints8.cc,
+	  tests/Polyhedron/addconstraints9.cc,
+	  tests/Polyhedron/addgenerator1.cc,
+	  tests/Polyhedron/addgenerator2.cc,
+	  tests/Polyhedron/addgenerator3.cc,
+	  tests/Polyhedron/addgenerator4.cc,
+	  tests/Polyhedron/addgenerator5.cc,
+	  tests/Polyhedron/addgenerators1.cc,
+	  tests/Polyhedron/addgenerators10.cc,
+	  tests/Polyhedron/addgenerators11.cc,
+	  tests/Polyhedron/addgenerators12.cc,
+	  tests/Polyhedron/addgenerators13.cc,
+	  tests/Polyhedron/addgenerators2.cc,
+	  tests/Polyhedron/addgenerators3.cc,
+	  tests/Polyhedron/addgenerators4.cc,
+	  tests/Polyhedron/addgenerators5.cc,
+	  tests/Polyhedron/addgenerators6.cc,
+	  tests/Polyhedron/addgenerators7.cc,
+	  tests/Polyhedron/addgenerators8.cc,
+	  tests/Polyhedron/addgenerators9.cc,
+	  tests/Polyhedron/addspacedims1.cc,
+	  tests/Polyhedron/addspacedims10.cc,
+	  tests/Polyhedron/addspacedims11.cc,
+	  tests/Polyhedron/addspacedims12.cc,
+	  tests/Polyhedron/addspacedims13.cc,
+	  tests/Polyhedron/addspacedims2.cc,
+	  tests/Polyhedron/addspacedims3.cc,
+	  tests/Polyhedron/addspacedims4.cc,
+	  tests/Polyhedron/addspacedims5.cc,
+	  tests/Polyhedron/addspacedims6.cc,
+	  tests/Polyhedron/addspacedims7.cc,
+	  tests/Polyhedron/addspacedims8.cc,
+	  tests/Polyhedron/addspacedims9.cc,
+	  tests/Polyhedron/affineimage1.cc,
+	  tests/Polyhedron/affineimage2.cc,
+	  tests/Polyhedron/affineimage3.cc,
+	  tests/Polyhedron/affineimage4.cc,
+	  tests/Polyhedron/affineimage5.cc,
+	  tests/Polyhedron/affineimage6.cc,
+	  tests/Polyhedron/affineimage7.cc,
+	  tests/Polyhedron/affineimage8.cc,
+	  tests/Polyhedron/affineimage9.cc,
+	  tests/Polyhedron/affinepreimage1.cc,
+	  tests/Polyhedron/affinepreimage10.cc,
+	  tests/Polyhedron/affinepreimage2.cc,
+	  tests/Polyhedron/affinepreimage3.cc,
+	  tests/Polyhedron/affinepreimage4.cc,
+	  tests/Polyhedron/affinepreimage5.cc,
+	  tests/Polyhedron/affinepreimage6.cc,
+	  tests/Polyhedron/affinepreimage7.cc,
+	  tests/Polyhedron/affinepreimage8.cc,
+	  tests/Polyhedron/affinepreimage9.cc,
+	  tests/Polyhedron/affinetrans.cc, tests/Polyhedron/append1.cc,
+	  tests/Polyhedron/append2.cc,
+	  tests/Polyhedron/ascii_dump_load1.cc,
+	  tests/Polyhedron/ascii_dump_load2.cc,
+	  tests/Polyhedron/ascii_dump_load3.cc,
+	  tests/Polyhedron/ascii_dump_load4.cc,
+	  tests/Polyhedron/ascii_dump_load5.cc,
+	  tests/Polyhedron/ascii_dump_load6.cc,
+	  tests/Polyhedron/ascii_dump_load7.cc,
+	  tests/Polyhedron/bgp99extrapolation1.cc,
+	  tests/Polyhedron/bgp99extrapolation2.cc,
+	  tests/Polyhedron/bhrz03widening1.cc,
+	  tests/Polyhedron/bhrz03widening10.cc,
+	  tests/Polyhedron/bhrz03widening11.cc,
+	  tests/Polyhedron/bhrz03widening12.cc,
+	  tests/Polyhedron/bhrz03widening13.cc,
+	  tests/Polyhedron/bhrz03widening14.cc,
+	  tests/Polyhedron/bhrz03widening15.cc,
+	  tests/Polyhedron/bhrz03widening16.cc,
+	  tests/Polyhedron/bhrz03widening17.cc,
+	  tests/Polyhedron/bhrz03widening18.cc,
+	  tests/Polyhedron/bhrz03widening19.cc,
+	  tests/Polyhedron/bhrz03widening2.cc,
+	  tests/Polyhedron/bhrz03widening3.cc,
+	  tests/Polyhedron/bhrz03widening4.cc,
+	  tests/Polyhedron/bhrz03widening5.cc,
+	  tests/Polyhedron/bhrz03widening6.cc,
+	  tests/Polyhedron/bhrz03widening7.cc,
+	  tests/Polyhedron/bhrz03widening8.cc,
+	  tests/Polyhedron/bhrz03widening9.cc,
+	  tests/Polyhedron/bhz03widening1.cc,
+	  tests/Polyhedron/bhz03widening2.cc,
+	  tests/Polyhedron/bhz03widening3.cc,
+	  tests/Polyhedron/bhz03widening4.cc,
+	  tests/Polyhedron/bhz03widening5.cc,
+	  tests/Polyhedron/bhz03widening6.cc, tests/Polyhedron/bounded1.cc,
+	  tests/Polyhedron/boundedh79extrapolation1.cc,
+	  tests/Polyhedron/boundingbox1.cc,
+	  tests/Polyhedron/boundingbox2.cc,
+	  tests/Polyhedron/boundingbox3.cc,
+	  tests/Polyhedron/boundingbox4.cc,
+	  tests/Polyhedron/boundingbox5.cc, tests/Polyhedron/bounds1.cc,
+	  tests/Polyhedron/bounds2.cc, tests/Polyhedron/concatenate1.cc,
+	  tests/Polyhedron/concatenate2.cc,
+	  tests/Polyhedron/concatenate3.cc,
+	  tests/Polyhedron/concatenate4.cc,
+	  tests/Polyhedron/concatenate5.cc,
+	  tests/Polyhedron/concatenate6.cc,
+	  tests/Polyhedron/constraints1.cc,
+	  tests/Polyhedron/constraints2.cc,
+	  tests/Polyhedron/constraints3.cc,
+	  tests/Polyhedron/constraints4.cc, tests/Polyhedron/contains1.cc,
+	  tests/Polyhedron/contains2.cc, tests/Polyhedron/contains3.cc,
+	  tests/Polyhedron/contains4.cc, tests/Polyhedron/contains5.cc,
+	  tests/Polyhedron/disjoint1.cc, tests/Polyhedron/disjoint2.cc,
+	  tests/Polyhedron/disjoint3.cc,
+	  tests/Polyhedron/dualhypercubes.cc, tests/Polyhedron/empty1.cc,
+	  tests/Polyhedron/equals1.cc, tests/Polyhedron/exceptions1.cc,
+	  tests/Polyhedron/exceptions2.cc, tests/Polyhedron/exceptions3.cc,
+	  tests/Polyhedron/expandspacedim1.cc,
+	  tests/Polyhedron/expandspacedim2.cc,
+	  tests/Polyhedron/foldspacedims1.cc,
+	  tests/Polyhedron/foldspacedims2.cc,
+	  tests/Polyhedron/generalizedaffineimage1.cc,
+	  tests/Polyhedron/generalizedaffineimage10.cc,
+	  tests/Polyhedron/generalizedaffineimage11.cc,
+	  tests/Polyhedron/generalizedaffineimage12.cc,
+	  tests/Polyhedron/generalizedaffineimage2.cc,
+	  tests/Polyhedron/generalizedaffineimage3.cc,
+	  tests/Polyhedron/generalizedaffineimage4.cc,
+	  tests/Polyhedron/generalizedaffineimage5.cc,
+	  tests/Polyhedron/generalizedaffineimage6.cc,
+	  tests/Polyhedron/generalizedaffineimage7.cc,
+	  tests/Polyhedron/generalizedaffineimage8.cc,
+	  tests/Polyhedron/generalizedaffineimage9.cc,
+	  tests/Polyhedron/generators1.cc, tests/Polyhedron/generators2.cc,
+	  tests/Polyhedron/generators3.cc, tests/Polyhedron/generators4.cc,
+	  tests/Polyhedron/generators5.cc, tests/Polyhedron/generators6.cc,
+	  tests/Polyhedron/geomcovers1.cc,
+	  tests/Polyhedron/h79widening1.cc,
+	  tests/Polyhedron/h79widening2.cc,
+	  tests/Polyhedron/h79widening3.cc,
+	  tests/Polyhedron/h79widening4.cc,
+	  tests/Polyhedron/h79widening5.cc,
+	  tests/Polyhedron/h79widening6.cc,
+	  tests/Polyhedron/h79widening7.cc,
+	  tests/Polyhedron/h79widening8.cc,
+	  tests/Polyhedron/intersection1.cc,
+	  tests/Polyhedron/intersection10.cc,
+	  tests/Polyhedron/intersection11.cc,
+	  tests/Polyhedron/intersection2.cc,
+	  tests/Polyhedron/intersection3.cc,
+	  tests/Polyhedron/intersection4.cc,
+	  tests/Polyhedron/intersection5.cc,
+	  tests/Polyhedron/intersection6.cc,
+	  tests/Polyhedron/intersection7.cc,
+	  tests/Polyhedron/intersection8.cc,
+	  tests/Polyhedron/intersection9.cc,
+	  tests/Polyhedron/limitedbhrz03extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation1.cc,
+	  tests/Polyhedron/limitedh79extrapolation2.cc,
+	  tests/Polyhedron/limitedh79extrapolation3.cc,
+	  tests/Polyhedron/limitedh79extrapolation4.cc,
+	  tests/Polyhedron/linearpartition1.cc,
+	  tests/Polyhedron/linearpartition2.cc,
+	  tests/Polyhedron/linearpartition3.cc,
+	  tests/Polyhedron/linearpartition4.cc,
+	  tests/Polyhedron/linexpression1.cc,
+	  tests/Polyhedron/mapspacedims1.cc,
+	  tests/Polyhedron/mapspacedims2.cc,
+	  tests/Polyhedron/mapspacedims3.cc,
+	  tests/Polyhedron/mapspacedims4.cc, tests/Polyhedron/max_min1.cc,
+	  tests/Polyhedron/max_min2.cc, tests/Polyhedron/maxspacedim1.cc,
+	  tests/Polyhedron/mc91.cc, tests/Polyhedron/membytes1.cc,
+	  tests/Polyhedron/membytes2.cc, tests/Polyhedron/memory1.cc,
+	  tests/Polyhedron/minconstraints1.cc,
+	  tests/Polyhedron/minconstraints2.cc,
+	  tests/Polyhedron/minconstraints3.cc,
+	  tests/Polyhedron/minconstraints4.cc,
+	  tests/Polyhedron/mingenerators1.cc,
+	  tests/Polyhedron/mingenerators2.cc,
+	  tests/Polyhedron/mingenerators3.cc, tests/Polyhedron/onepoint.cc,
+	  tests/Polyhedron/permute.cc, tests/Polyhedron/polydifference1.cc,
+	  tests/Polyhedron/polydifference2.cc,
+	  tests/Polyhedron/polydifference3.cc,
+	  tests/Polyhedron/polydifference4.cc,
+	  tests/Polyhedron/polydifference5.cc,
+	  tests/Polyhedron/polydifference6.cc,
+	  tests/Polyhedron/polydifference7.cc,
+	  tests/Polyhedron/polydifference8.cc,
+	  tests/Polyhedron/polydifference9.cc,
+	  tests/Polyhedron/polyhull1.cc, tests/Polyhedron/polyhull10.cc,
+	  tests/Polyhedron/polyhull11.cc, tests/Polyhedron/polyhull2.cc,
+	  tests/Polyhedron/polyhull3.cc, tests/Polyhedron/polyhull4.cc,
+	  tests/Polyhedron/polyhull5.cc, tests/Polyhedron/polyhull6.cc,
+	  tests/Polyhedron/polyhull7.cc, tests/Polyhedron/polyhull8.cc,
+	  tests/Polyhedron/polyhull9.cc, tests/Polyhedron/randphull1.cc,
+	  tests/Polyhedron/randphull2.cc, tests/Polyhedron/relations1.cc,
+	  tests/Polyhedron/relations10.cc, tests/Polyhedron/relations11.cc,
+	  tests/Polyhedron/relations12.cc, tests/Polyhedron/relations13.cc,
+	  tests/Polyhedron/relations14.cc, tests/Polyhedron/relations15.cc,
+	  tests/Polyhedron/relations16.cc, tests/Polyhedron/relations17.cc,
+	  tests/Polyhedron/relations18.cc, tests/Polyhedron/relations19.cc,
+	  tests/Polyhedron/relations2.cc, tests/Polyhedron/relations3.cc,
+	  tests/Polyhedron/relations4.cc, tests/Polyhedron/relations5.cc,
+	  tests/Polyhedron/relations6.cc, tests/Polyhedron/relations7.cc,
+	  tests/Polyhedron/relations8.cc, tests/Polyhedron/relations9.cc,
+	  tests/Polyhedron/removespacedims1.cc,
+	  tests/Polyhedron/removespacedims10.cc,
+	  tests/Polyhedron/removespacedims2.cc,
+	  tests/Polyhedron/removespacedims3.cc,
+	  tests/Polyhedron/removespacedims4.cc,
+	  tests/Polyhedron/removespacedims5.cc,
+	  tests/Polyhedron/removespacedims6.cc,
+	  tests/Polyhedron/removespacedims7.cc,
+	  tests/Polyhedron/removespacedims8.cc,
+	  tests/Polyhedron/removespacedims9.cc, tests/Polyhedron/smm1.cc,
+	  tests/Polyhedron/timeelapse1.cc, tests/Polyhedron/timeelapse2.cc,
+	  tests/Polyhedron/timeelapse3.cc, tests/Polyhedron/timeelapse4.cc,
+	  tests/Polyhedron/timeelapse5.cc, tests/Polyhedron/timeelapse6.cc,
+	  tests/Polyhedron/timeelapse7.cc, tests/Polyhedron/timeelapse8.cc,
+	  tests/Polyhedron/topclosed1.cc, tests/Polyhedron/topclosed2.cc,
+	  tests/Polyhedron/topclosed3.cc, tests/Polyhedron/topclosure1.cc,
+	  tests/Polyhedron/topclosure2.cc, tests/Polyhedron/topclosure3.cc,
+	  tests/Polyhedron/topclosure4.cc, tests/Polyhedron/universe1.cc,
+	  tests/Polyhedron/universe2.cc, tests/Polyhedron/universe3.cc,
+	  tests/Polyhedron/universe4.cc, tests/Polyhedron/universe5.cc,
+	  tests/Polyhedron/universe6.cc, tests/Polyhedron/universe7.cc,
+	  tests/Polyhedron/valgrind_suppressions,
+	  tests/Polyhedron/watchdog1.cc, tests/Polyhedron/writeconsys1.cc,
+	  tests/Polyhedron/writegensys1.cc,
+	  tests/Polyhedron/writegensys2.cc,
+	  tests/Polyhedron/writegensys3.cc,
+	  tests/Polyhedron/writepolyhedron1.cc,
+	  tests/Polyhedron/writepolyhedron2.cc,
+	  tests/Polyhedron/writepolyhedron3.cc,
+	  tests/Polyhedron/writerelation1.cc,
+	  tests/Polyhedron/writevariable1.cc
+	  (altnum.[13,2,2,8,2,2,2,2,2,3,2,2,3,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,3,3,2,2,4,2,2,2,2,2,2,2,2,2,2,3,4,3,2,2,2,3,3,3,3,3,2,3,1,1,2,1,1,1,2,1,3,2,1,1,1,2,1,1,2,1,1,2,2,2,1,1,1,2,1,1,2,5,4,2,1,1,2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,3,5,4,5,5,4,4,2,2,6,4,3,3,2,2,1,3,2,2,2,1,1,2,2,2,2,1,2,2,2,2,1,2,2,3,2,2,3,4,5,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,2,3,3,2,3,2,2,3,1,1,1,2,1,2,1,2,1,1,1,2,1,2,1,2,1,1,1,2,2,2,3,2,3,3,3,3,2,3,2,2,2,2,2,3,2,3,2,1,2,2,2,2,2,2,2,1,2,3,2,2,1,1,1,1,3,4,2,2,2,2,1,1,1,1,2,1,1 [...]
+	  Tests for the polyhedra classes are now in `tests/Polyhedron'.
+
+2004-12-12 Sunday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.7): Added the implementation of
+	  constructors from native floating-point types.
+
+2004-12-11 Saturday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, README, STANDARDS, TODO, configure.ac,
+	  Watchdog/EList_Iterator.inlines.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Makefile.am, Watchdog/Watchdog.defs.hh,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/allzero.ine,
+	  demos/ppl_lcdd/examples/ccc4.ext,
+	  demos/ppl_lcdd/examples/ccp4.ext,
+	  demos/ppl_lcdd/examples/cp4.ext, demos/ppl_lcdd/examples/cp4.ine,
+	  demos/ppl_lcdd/examples/cp5.ine, demos/ppl_lcdd/examples/cp6.ine,
+	  demos/ppl_lcdd/examples/cp7.ext,
+	  demos/ppl_lcdd/examples/cross10.ine,
+	  demos/ppl_lcdd/examples/cross12.ine,
+	  demos/ppl_lcdd/examples/cross4.ine,
+	  demos/ppl_lcdd/examples/cross6.ine,
+	  demos/ppl_lcdd/examples/cross8.ine,
+	  demos/ppl_lcdd/examples/cube.ext,
+	  demos/ppl_lcdd/examples/cubetop.ine,
+	  demos/ppl_lcdd/examples/cubocta.ine,
+	  demos/ppl_lcdd/examples/cut16_11.ext,
+	  demos/ppl_lcdd/examples/cut32_16.ext,
+	  demos/ppl_lcdd/examples/cyc.ine,
+	  demos/ppl_lcdd/examples/cyclic16-10.ext,
+	  demos/ppl_lcdd/examples/cyclic25_13.ext,
+	  demos/ppl_lcdd/examples/ex1.ine,
+	  demos/ppl_lcdd/examples/grcubocta.ine,
+	  demos/ppl_lcdd/examples/in0.ine, demos/ppl_lcdd/examples/in1.ine,
+	  demos/ppl_lcdd/examples/in2.ine, demos/ppl_lcdd/examples/in3.ine,
+	  demos/ppl_lcdd/examples/in4.ine, demos/ppl_lcdd/examples/in5.ine,
+	  demos/ppl_lcdd/examples/in6.ine, demos/ppl_lcdd/examples/in7.ine,
+	  demos/ppl_lcdd/examples/integralpoints.ine,
+	  demos/ppl_lcdd/examples/irbox20-4.ext,
+	  demos/ppl_lcdd/examples/irbox200-4.ext,
+	  demos/ppl_lcdd/examples/kkd18_4.ine,
+	  demos/ppl_lcdd/examples/kkd27_5.ine,
+	  demos/ppl_lcdd/examples/kkd38_6.ine,
+	  demos/ppl_lcdd/examples/kq20_11_m.ine,
+	  demos/ppl_lcdd/examples/metric40_11.ine,
+	  demos/ppl_lcdd/examples/metric80_16.ine,
+	  demos/ppl_lcdd/examples/mit.ine,
+	  demos/ppl_lcdd/examples/mit288-281.ine,
+	  demos/ppl_lcdd/examples/mit31-20.ine,
+	  demos/ppl_lcdd/examples/mit41-16.ine,
+	  demos/ppl_lcdd/examples/mit708-9.ine,
+	  demos/ppl_lcdd/examples/mit71-61.ine,
+	  demos/ppl_lcdd/examples/mit90-86.ine,
+	  demos/ppl_lcdd/examples/mp5.ext, demos/ppl_lcdd/examples/mp5.ine,
+	  demos/ppl_lcdd/examples/mp5a.ine,
+	  demos/ppl_lcdd/examples/mp6.ine,
+	  demos/ppl_lcdd/examples/origin.ine,
+	  demos/ppl_lcdd/examples/project2res.ine,
+	  demos/ppl_lcdd/examples/rcubocta.ine,
+	  demos/ppl_lcdd/examples/reg24-5.ext,
+	  demos/ppl_lcdd/examples/reg24-5.ine,
+	  demos/ppl_lcdd/examples/sampleh1.ine,
+	  demos/ppl_lcdd/examples/sampleh3.ine,
+	  demos/ppl_lcdd/examples/sampleh4.ine,
+	  demos/ppl_lcdd/examples/sampleh6.ine,
+	  demos/ppl_lcdd/examples/sampleh7.ine,
+	  demos/ppl_lcdd/examples/sampleh8.ine,
+	  demos/ppl_lcdd/examples/samplev1.ext,
+	  demos/ppl_lcdd/examples/samplev3.ext,
+	  demos/ppl_lcdd/examples/trunc10.ine,
+	  demos/ppl_lcdd/examples/trunc7.ine,
+	  demos/ppl_lcdd/examples/tsp5.ext,
+	  demos/ppl_lcdd/examples/tsp5.ine, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int32, demos/ppl_lpsol/expected_int32_a,
+	  demos/ppl_lpsol/expected_int64, demos/ppl_lpsol/expected_int64_a,
+	  demos/ppl_lpsol/expected_mpz, demos/ppl_lpsol/expected_mpz_a,
+	  demos/ppl_lpsol/ppl_lpsol.c, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.tex, doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/exceptions.hh,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/tests/pl_check.pl, src/AskTell.defs.hh,
+	  src/AskTell.inlines.hh, src/AskTell.types.hh,
+	  src/Ask_Tell.defs.hh, src/Ask_Tell.inlines.hh,
+	  src/Ask_Tell.types.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh, src/BoundingBox.cc,
+	  src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+	  src/BoundingBox.types.hh, src/Bounding_Box.cc,
+	  src/Bounding_Box.defs.hh, src/Bounding_Box.inlines.hh,
+	  src/Bounding_Box.types.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.inlines.hh, src/Coefficient.cc,
+	  src/Coefficient.defs.hh, src/Coefficient.inlines.hh,
+	  src/Coefficient.types.hh, src/Coefficient_traits_template.hh,
+	  src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+	  src/ConSys.types.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Constraint_System.cc,
+	  src/Constraint_System.defs.hh, src/Constraint_System.inlines.hh,
+	  src/Constraint_System.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GMP_Integer.types.hh,
+	  src/GenSys.cc, src/GenSys.defs.hh, src/GenSys.inlines.hh,
+	  src/GenSys.types.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator_System.cc,
+	  src/Generator_System.defs.hh, src/Generator_System.inlines.hh,
+	  src/Generator_System.types.hh, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/Integer.cc, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/Integer.types.hh,
+	  src/Integer_macros.hh, src/Integer_traits_template.hh,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/LinExpression.cc, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/LinExpression.types.hh,
+	  src/Linear_Expression.cc, src/Linear_Expression.defs.hh,
+	  src/Linear_Expression.inlines.hh, src/Linear_Expression.types.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_System.cc,
+	  src/Linear_System.defs.hh, src/Linear_System.inlines.hh,
+	  src/Makefile.am, src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/Row.inlines.hh, src/SatMatrix.cc,
+	  src/SatMatrix.defs.hh, src/SatMatrix.inlines.hh,
+	  src/SatMatrix.types.hh, src/SatRow.cc, src/SatRow.defs.hh,
+	  src/SatRow.inlines.hh, src/SatRow.types.hh,
+	  src/Saturation_Matrix.cc, src/Saturation_Matrix.defs.hh,
+	  src/Saturation_Matrix.inlines.hh, src/Saturation_Matrix.types.hh,
+	  src/Saturation_Row.cc, src/Saturation_Row.defs.hh,
+	  src/Saturation_Row.inlines.hh, src/Saturation_Row.types.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Widening_Function.defs.hh, src/Widening_Function.inlines.hh,
+	  src/algorithms.hh, src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/conversion.cc, src/globals.cc,
+	  src/globals.defs.hh, src/globals.inlines.hh, src/minimize.cc,
+	  src/simplify.cc, src/swapping_sort.icc, tests/BBox.cc,
+	  tests/BBox.hh, tests/Makefile.am, tests/NNCminimize1.cc,
+	  tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+	  tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+	  tests/NNCminimize6.cc, tests/addconstraint1.cc,
+	  tests/addconstraints1.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/addconstraints13.cc, tests/addconstraints2.cc,
+	  tests/addconstraints3.cc, tests/addconstraints4.cc,
+	  tests/addconstraints5.cc, tests/addconstraints6.cc,
+	  tests/addconstraints7.cc, tests/addconstraints8.cc,
+	  tests/addconstraints9.cc, tests/addgenerator1.cc,
+	  tests/addgenerator2.cc, tests/addgenerator3.cc,
+	  tests/addgenerator4.cc, tests/addgenerator5.cc,
+	  tests/addgenerators1.cc, tests/addgenerators10.cc,
+	  tests/addgenerators11.cc, tests/addgenerators12.cc,
+	  tests/addgenerators13.cc, tests/addgenerators2.cc,
+	  tests/addgenerators3.cc, tests/addgenerators4.cc,
+	  tests/addgenerators5.cc, tests/addgenerators6.cc,
+	  tests/addgenerators7.cc, tests/addgenerators8.cc,
+	  tests/addgenerators9.cc, tests/addspacedims1.cc,
+	  tests/addspacedims10.cc, tests/addspacedims11.cc,
+	  tests/addspacedims3.cc, tests/addspacedims4.cc,
+	  tests/addspacedims5.cc, tests/addspacedims6.cc,
+	  tests/addspacedims7.cc, tests/addspacedims9.cc,
+	  tests/affineimage3.cc, tests/affineimage7.cc,
+	  tests/affinepreimage1.cc, tests/affinepreimage4.cc,
+	  tests/affinepreimage7.cc, tests/affinetrans.cc,
+	  tests/ascii_dump_load4.cc, tests/ascii_dump_load7.cc,
+	  tests/bgp99extrapolation1.cc, tests/bhrz03widening1.cc,
+	  tests/bhrz03widening12.cc, tests/bhrz03widening13.cc,
+	  tests/bhrz03widening14.cc, tests/bhrz03widening15.cc,
+	  tests/bhrz03widening16.cc, tests/bhrz03widening17.cc,
+	  tests/bhrz03widening18.cc, tests/bhrz03widening19.cc,
+	  tests/bhrz03widening2.cc, tests/bhrz03widening6.cc,
+	  tests/bhrz03widening7.cc, tests/bhrz03widening8.cc,
+	  tests/bhrz03widening9.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening3.cc, tests/bhz03widening4.cc,
+	  tests/bounded1.cc, tests/boundedh79extrapolation1.cc,
+	  tests/boundingbox1.cc, tests/boundingbox2.cc,
+	  tests/boundingbox3.cc, tests/boundingbox4.cc, tests/bounds1.cc,
+	  tests/concatenate1.cc, tests/concatenate2.cc,
+	  tests/concatenate3.cc, tests/concatenate4.cc,
+	  tests/constraints1.cc, tests/constraints2.cc,
+	  tests/constraints3.cc, tests/constraints4.cc, tests/contains2.cc,
+	  tests/contains3.cc, tests/contains4.cc, tests/contains5.cc,
+	  tests/disjoint2.cc, tests/disjoint3.cc, tests/dualhypercubes.cc,
+	  tests/empty1.cc, tests/exceptions1.cc, tests/exceptions2.cc,
+	  tests/exceptions3.cc, tests/expandspacedim1.cc,
+	  tests/generalizedaffineimage9.cc, tests/generators1.cc,
+	  tests/generators2.cc, tests/generators3.cc, tests/generators4.cc,
+	  tests/generators5.cc, tests/generators6.cc, tests/geomcovers1.cc,
+	  tests/h79widening4.cc, tests/intersection2.cc,
+	  tests/intersection4.cc, tests/intersection6.cc,
+	  tests/limitedbhrz03extrapolation1.cc,
+	  tests/limitedh79extrapolation1.cc,
+	  tests/limitedh79extrapolation2.cc,
+	  tests/limitedh79extrapolation3.cc,
+	  tests/limitedh79extrapolation4.cc, tests/linexpression1.cc,
+	  tests/mapspacedims1.cc, tests/max_min1.cc, tests/max_min2.cc,
+	  tests/maxspacedim1.cc, tests/membytes1.cc, tests/membytes2.cc,
+	  tests/minconstraints1.cc, tests/minconstraints2.cc,
+	  tests/minconstraints3.cc, tests/minconstraints4.cc,
+	  tests/mingenerators1.cc, tests/mingenerators2.cc,
+	  tests/mingenerators3.cc, tests/polydifference1.cc,
+	  tests/polydifference2.cc, tests/polydifference3.cc,
+	  tests/polydifference8.cc, tests/polydifference9.cc,
+	  tests/polyhull1.cc, tests/polyhull2.cc, tests/polyhull7.cc,
+	  tests/print.cc, tests/print.hh, tests/randphull1.cc,
+	  tests/randphull2.cc, tests/relations1.cc, tests/relations12.cc,
+	  tests/relations15.cc, tests/relations16.cc, tests/relations17.cc,
+	  tests/relations4.cc, tests/relations5.cc, tests/relations7.cc,
+	  tests/relations8.cc, tests/relations9.cc,
+	  tests/removespacedims1.cc, tests/removespacedims2.cc,
+	  tests/removespacedims4.cc, tests/removespacedims8.cc,
+	  tests/smm1.cc, tests/timeelapse1.cc, tests/timeelapse3.cc,
+	  tests/timeelapse4.cc, tests/timeelapse6.cc, tests/topclosed2.cc,
+	  tests/topclosed3.cc, tests/topclosure1.cc, tests/universe3.cc,
+	  tests/universe4.cc, tests/universe6.cc, tests/universe7.cc,
+	  tests/writeconsys1.cc, tests/writegensys1.cc,
+	  tests/writegensys2.cc, tests/writegensys3.cc
+	  (altnum.[6,2,2,6,12,2,2,4,2,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,4,2,6,5,5,5,1,3,3,3,6,4,6,1,7,2,4,4,3,4,5,1,4,6,5,5,2,5,3,1,1,1,1,3,4,2,4,4,1,1,1,1,1,3,5,4,14,1,1,1,1,1,5,7,4,1,3,7,5,1,1,1,1,5,4,3,6,7,3,1,5,7,5,1,1,1,1,4,4,1,6,2,6,2,3,4,6,3,5,3,1,1,1,1,1,2,3,3,3,3,3,14,5,3,4,4,7,7,3,4,4,7,7,2,5,9,7,5,2,2,5,6,5,4,4,3,1,10,4,3,1,1,1,1,1,1,1,1,1,1,4,2,4,4,3,20,13,21,16,19,6 [...]
+	  Sixth merge from main trunk.
+
+2004-12-11 Saturday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.138), STANDARDS (1.15), TODO (1.126),
+	  Watchdog/EList_Iterator.inlines.hh (1.2),
+	  Watchdog/Handler.defs.hh (1.2), Watchdog/Makefile.am (1.14),
+	  Watchdog/Watchdog.defs.hh (1.14), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.38), demos/ppl_lcdd/examples/allzero.ine (1.2),
+	  demos/ppl_lcdd/examples/ccc4.ext (1.2),
+	  demos/ppl_lcdd/examples/ccp4.ext (1.2),
+	  demos/ppl_lcdd/examples/cp4.ext (1.2),
+	  demos/ppl_lcdd/examples/cp4.ine (1.2),
+	  demos/ppl_lcdd/examples/cp5.ine (1.2),
+	  demos/ppl_lcdd/examples/cp6.ine (1.2),
+	  demos/ppl_lcdd/examples/cp7.ext (1.2),
+	  demos/ppl_lcdd/examples/cross10.ine (1.2),
+	  demos/ppl_lcdd/examples/cross12.ine (1.2),
+	  demos/ppl_lcdd/examples/cross4.ine (1.2),
+	  demos/ppl_lcdd/examples/cross6.ine (1.2),
+	  demos/ppl_lcdd/examples/cross8.ine (1.2),
+	  demos/ppl_lcdd/examples/cube.ext (1.2),
+	  demos/ppl_lcdd/examples/cubetop.ine (1.2),
+	  demos/ppl_lcdd/examples/cubocta.ine (1.2),
+	  demos/ppl_lcdd/examples/cut16_11.ext (1.2),
+	  demos/ppl_lcdd/examples/cut32_16.ext (1.2),
+	  demos/ppl_lcdd/examples/cyc.ine (1.2),
+	  demos/ppl_lcdd/examples/cyclic16-10.ext (1.2),
+	  demos/ppl_lcdd/examples/cyclic25_13.ext (1.2),
+	  demos/ppl_lcdd/examples/ex1.ine (1.2),
+	  demos/ppl_lcdd/examples/grcubocta.ine (1.2),
+	  demos/ppl_lcdd/examples/in0.ine (1.2),
+	  demos/ppl_lcdd/examples/in1.ine (1.2),
+	  demos/ppl_lcdd/examples/in2.ine (1.2),
+	  demos/ppl_lcdd/examples/in3.ine (1.2),
+	  demos/ppl_lcdd/examples/in4.ine (1.2),
+	  demos/ppl_lcdd/examples/in5.ine (1.2),
+	  demos/ppl_lcdd/examples/in6.ine (1.2),
+	  demos/ppl_lcdd/examples/in7.ine (1.2),
+	  demos/ppl_lcdd/examples/integralpoints.ine (1.2),
+	  demos/ppl_lcdd/examples/irbox20-4.ext (1.2),
+	  demos/ppl_lcdd/examples/irbox200-4.ext (1.2),
+	  demos/ppl_lcdd/examples/kkd18_4.ine (1.2),
+	  demos/ppl_lcdd/examples/kkd27_5.ine (1.2),
+	  demos/ppl_lcdd/examples/kkd38_6.ine (1.2),
+	  demos/ppl_lcdd/examples/kq20_11_m.ine (1.2),
+	  demos/ppl_lcdd/examples/metric40_11.ine (1.2),
+	  demos/ppl_lcdd/examples/metric80_16.ine (1.2),
+	  demos/ppl_lcdd/examples/mit.ine (1.2),
+	  demos/ppl_lcdd/examples/mit288-281.ine (1.2),
+	  demos/ppl_lcdd/examples/mit31-20.ine (1.2),
+	  demos/ppl_lcdd/examples/mit41-16.ine (1.2),
+	  demos/ppl_lcdd/examples/mit708-9.ine (1.2),
+	  demos/ppl_lcdd/examples/mit71-61.ine (1.2),
+	  demos/ppl_lcdd/examples/mit90-86.ine (1.2),
+	  demos/ppl_lcdd/examples/mp5.ext (1.2),
+	  demos/ppl_lcdd/examples/mp5.ine (1.2),
+	  demos/ppl_lcdd/examples/mp5a.ine (1.2),
+	  demos/ppl_lcdd/examples/mp6.ine (1.2),
+	  demos/ppl_lcdd/examples/origin.ine (1.2),
+	  demos/ppl_lcdd/examples/project2res.ine (1.2),
+	  demos/ppl_lcdd/examples/rcubocta.ine (1.2),
+	  demos/ppl_lcdd/examples/reg24-5.ext (1.2),
+	  demos/ppl_lcdd/examples/reg24-5.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh1.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh3.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh4.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh6.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh7.ine (1.2),
+	  demos/ppl_lcdd/examples/sampleh8.ine (1.2),
+	  demos/ppl_lcdd/examples/samplev1.ext (1.2),
+	  demos/ppl_lcdd/examples/samplev3.ext (1.2),
+	  demos/ppl_lcdd/examples/trunc10.ine (1.2),
+	  demos/ppl_lcdd/examples/trunc7.ine (1.2),
+	  demos/ppl_lcdd/examples/tsp5.ext (1.2),
+	  demos/ppl_lcdd/examples/tsp5.ine (1.2), doc/Makefile.am (1.30),
+	  doc/definitions.dox (1.164), doc/devref-browse.doxyconf-latex.in
+	  (1.53), doc/devref-print.doxyconf-latex.in (1.53),
+	  doc/devref.doxyconf-html.in (1.53), doc/fdl.tex (1.3),
+	  doc/user-browse.doxyconf-latex.in (1.22),
+	  doc/user-print.doxyconf-latex.in (1.22),
+	  doc/user.doxyconf-html.in (1.24), interfaces/C/ppl_c.h.in (1.40),
+	  interfaces/Prolog/Prolog_interface.dox (1.119),
+	  interfaces/Prolog/exceptions.hh (1.13),
+	  interfaces/Prolog/ppl_prolog.icc (1.146),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.6),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.73),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.23),
+	  interfaces/Prolog/SICStus/Makefile.am (1.48),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.68),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.9),
+	  interfaces/Prolog/SWI/Makefile.am (1.40),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.92),
+	  interfaces/Prolog/tests/pl_check.pl (1.2), src/Ask_Tell.defs.hh
+	  (1.3), src/Ask_Tell.inlines.hh (1.3), src/BHRZ03_Certificate.cc
+	  (1.6), src/BHRZ03_Certificate.defs.hh (1.8),
+	  src/Checked_Number.inlines.hh (1.8), src/Constraint.defs.hh
+	  (1.98), src/Constraint.inlines.hh (1.57),
+	  src/Constraint_System.defs.hh (1.3), src/Generator.defs.hh
+	  (1.98), src/Generator.inlines.hh (1.51), src/Generator_System.cc
+	  (1.3), src/Generator_System.defs.hh (1.3),
+	  src/H79_Certificate.defs.hh (1.8), src/Interval.defs.hh (1.19),
+	  src/Interval.inlines.hh (1.15), src/Linear_Expression.cc (1.3),
+	  src/Linear_Expression.defs.hh (1.5),
+	  src/Linear_Expression.inlines.hh (1.3), src/Linear_Row.cc (1.3),
+	  src/Linear_Row.inlines.hh (1.6), src/Linear_System.cc (1.12),
+	  src/Linear_System.defs.hh (1.10), src/Linear_System.inlines.hh
+	  (1.9), src/Matrix.inlines.hh (1.42),
+	  src/Native_Integer.inlines.hh (1.6),
+	  src/Polyhedra_Powerset.defs.hh (1.10),
+	  src/Polyhedra_Powerset.inlines.hh (1.11), src/Polyhedron.defs.hh
+	  (1.260), src/Polyhedron.inlines.hh (1.105),
+	  src/Polyhedron_chdims.cc (1.26), src/Polyhedron_nonpublic.cc
+	  (1.39), src/Polyhedron_public.cc (1.44),
+	  src/Polyhedron_widenings.cc (1.38), src/Row.cc (1.75),
+	  src/Row.defs.hh (1.87), src/Row.inlines.hh (1.54),
+	  src/Saturation_Matrix.inlines.hh (1.2), src/Saturation_Row.cc
+	  (1.2), src/Saturation_Row.defs.hh (1.2),
+	  src/Widening_Function.defs.hh (1.8),
+	  src/Widening_Function.inlines.hh (1.8), src/checked.defs.hh
+	  (1.4), src/checked.inlines.hh (1.4), src/checked_float.inlines.hh
+	  (1.10), src/checked_int.inlines.hh (1.6),
+	  src/checked_mpq.inlines.hh (1.5), src/checked_mpz.inlines.hh
+	  (1.5), src/globals.defs.hh (1.11), src/globals.inlines.hh (1.6),
+	  src/swapping_sort.icc (1.5), tests/Makefile.am (1.239),
+	  tests/addspacedims9.cc (1.2), tests/bgp99extrapolation1.cc (1.7),
+	  tests/bhz03widening1.cc (1.8), tests/bhz03widening3.cc (1.8),
+	  tests/bhz03widening4.cc (1.6), tests/boundingbox1.cc (1.39),
+	  tests/boundingbox3.cc (1.15), tests/boundingbox4.cc (1.12),
+	  tests/disjoint3.cc (1.10), tests/dualhypercubes.cc (1.9),
+	  tests/expandspacedim1.cc (1.2), tests/generalizedaffineimage9.cc
+	  (1.8), tests/polydifference1.cc (1.10), tests/polydifference8.cc
+	  (1.4), tests/polydifference9.cc (1.5), tests/print.cc (1.13): Try
+	  to avoid very long lines.
+
+2004-12-11 Saturday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.125): Postponed a couple of items.
+
+2004-12-11 Saturday 20:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.137), README (1.30), TODO (1.124),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.37),
+	  doc/devref-browse.doxyconf-latex.in (1.52),
+	  doc/devref-print.doxyconf-latex.in (1.52),
+	  doc/devref.doxyconf-html.in (1.52), interfaces/C/ppl_c.cc
+	  (1.117), interfaces/Prolog/Prolog_interface.dox (1.118),
+	  interfaces/Prolog/exceptions.hh (1.12),
+	  interfaces/Prolog/ppl_prolog.icc (1.145),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.27),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.22),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.67),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.91),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.58),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.84), src/Bounding_Box.cc
+	  (1.2), src/Bounding_Box.defs.hh (1.2),
+	  src/Bounding_Box.inlines.hh (1.2), src/Coefficient.cc (1.1),
+	  src/Coefficient.defs.hh (1.1), src/Coefficient.inlines.hh (1.1),
+	  src/Coefficient.types.hh (1.1),
+	  src/Coefficient_traits_template.hh (1.1), src/Constraint.cc
+	  (1.45), src/Constraint.defs.hh (1.97), src/Constraint.inlines.hh
+	  (1.56), src/Constraint_System.cc (1.2),
+	  src/Constraint_System.defs.hh (1.2), src/GMP_Integer.types.hh
+	  (1.3), src/Generator.cc (1.56), src/Generator.defs.hh (1.97),
+	  src/Generator.inlines.hh (1.50), src/Generator_System.cc (1.2),
+	  src/Generator_System.defs.hh (1.2), src/Integer.cc (1.5),
+	  src/Integer.defs.hh (1.15), src/Integer.inlines.hh (1.14),
+	  src/Integer.types.hh (1.10), src/Integer_macros.hh (1.3),
+	  src/Integer_traits_template.hh (1.3), src/Interval.defs.hh
+	  (1.18), src/Interval.inlines.hh (1.14), src/Linear_Expression.cc
+	  (1.2), src/Linear_Expression.defs.hh (1.4),
+	  src/Linear_Expression.inlines.hh (1.2), src/Linear_Row.cc (1.2),
+	  src/Linear_Row.defs.hh (1.6), src/Linear_Row.inlines.hh (1.5),
+	  src/Linear_System.cc (1.11), src/Makefile.am (1.90),
+	  src/Matrix.defs.hh (1.66), src/Native_Integer.defs.hh (1.5),
+	  src/Native_Integer.types.hh (1.3), src/Polyhedron.defs.hh
+	  (1.259), src/Polyhedron.inlines.hh (1.104),
+	  src/Polyhedron_nonpublic.cc (1.38), src/Polyhedron_public.cc
+	  (1.43), src/Polyhedron_widenings.cc (1.37), src/Row.cc (1.74),
+	  src/Row.defs.hh (1.86), src/Row.inlines.hh (1.53),
+	  src/conversion.cc (1.65), src/globals.cc (1.19),
+	  src/globals.defs.hh (1.10), src/globals.inlines.hh (1.5),
+	  tests/BBox.cc (1.6), tests/BBox.hh (1.5),
+	  tests/bhrz03widening13.cc (1.6), tests/bhrz03widening14.cc (1.8),
+	  tests/dualhypercubes.cc (1.8), tests/exceptions1.cc (1.43),
+	  tests/intersection2.cc (1.12), tests/max_min1.cc (1.6),
+	  tests/max_min2.cc (1.6), tests/randphull1.cc (1.13),
+	  tests/randphull2.cc (1.10): The type Integer has been renamed
+	  Coefficient.
+
+2004-12-11 Saturday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.37): Useless inclusions removed.
+
+2004-12-11 Saturday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.136), README (1.29), TODO (1.123),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.36), doc/definitions.dox (1.163),
+	  doc/devref-browse.doxyconf-latex.in (1.51),
+	  doc/devref-print.doxyconf-latex.in (1.51),
+	  doc/devref.doxyconf-html.in (1.51), interfaces/C/ppl_c.cc
+	  (1.116), interfaces/C/ppl_c.h.in (1.39),
+	  interfaces/Prolog/ppl_prolog.icc (1.144),
+	  src/BHRZ03_Certificate.cc (1.5), src/C_Polyhedron.defs.hh (1.30),
+	  src/C_Polyhedron.inlines.hh (1.23), src/Constraint.defs.hh
+	  (1.96), src/GenSys.cc (1.102), src/GenSys.defs.hh (1.107),
+	  src/GenSys.inlines.hh (1.38), src/GenSys.types.hh (1.8),
+	  src/Generator.defs.hh (1.96), src/Generator_System.cc (1.1),
+	  src/Generator_System.defs.hh (1.1),
+	  src/Generator_System.inlines.hh (1.1),
+	  src/Generator_System.types.hh (1.1),
+	  src/Linear_Expression.defs.hh (1.3), src/Linear_System.defs.hh
+	  (1.9), src/Makefile.am (1.89), src/Matrix.defs.hh (1.65),
+	  src/NNC_Polyhedron.defs.hh (1.32), src/NNC_Polyhedron.inlines.hh
+	  (1.26), src/Polyhedron.defs.hh (1.258), src/Polyhedron.inlines.hh
+	  (1.103), src/Polyhedron_nonpublic.cc (1.37),
+	  src/Polyhedron_public.cc (1.42), src/Polyhedron_widenings.cc
+	  (1.36), tests/NNCminimize1.cc (1.12), tests/NNCminimize2.cc
+	  (1.12), tests/NNCminimize3.cc (1.12), tests/NNCminimize4.cc
+	  (1.13), tests/NNCminimize5.cc (1.12), tests/addconstraints9.cc
+	  (1.15), tests/addgenerator1.cc (1.8), tests/addgenerator2.cc
+	  (1.8), tests/addgenerator3.cc (1.5), tests/addgenerator4.cc
+	  (1.7), tests/addgenerator5.cc (1.2), tests/addgenerators1.cc
+	  (1.13), tests/addgenerators10.cc (1.5), tests/addgenerators11.cc
+	  (1.10), tests/addgenerators12.cc (1.7), tests/addgenerators13.cc
+	  (1.3), tests/addgenerators2.cc (1.13), tests/addgenerators3.cc
+	  (1.13), tests/addgenerators4.cc (1.13), tests/addgenerators5.cc
+	  (1.13), tests/addgenerators6.cc (1.13), tests/addgenerators7.cc
+	  (1.10), tests/addgenerators8.cc (1.8), tests/addgenerators9.cc
+	  (1.7), tests/addspacedims1.cc (1.2), tests/addspacedims10.cc
+	  (1.3), tests/addspacedims11.cc (1.2), tests/addspacedims3.cc
+	  (1.3), tests/addspacedims6.cc (1.2), tests/addspacedims7.cc
+	  (1.2), tests/affineimage3.cc (1.5), tests/affineimage7.cc (1.5),
+	  tests/affinepreimage1.cc (1.12), tests/affinepreimage4.cc (1.13),
+	  tests/affinepreimage7.cc (1.5), tests/affinetrans.cc (1.16),
+	  tests/ascii_dump_load7.cc (1.8), tests/bhrz03widening1.cc (1.5),
+	  tests/bhrz03widening12.cc (1.5), tests/bhrz03widening13.cc (1.5),
+	  tests/bhrz03widening14.cc (1.7), tests/bhrz03widening15.cc (1.9),
+	  tests/bhrz03widening16.cc (1.5), tests/bhrz03widening17.cc (1.5),
+	  tests/bhrz03widening18.cc (1.5), tests/bhrz03widening19.cc (1.5),
+	  tests/bhrz03widening2.cc (1.7), tests/bhrz03widening6.cc (1.6),
+	  tests/bhrz03widening7.cc (1.6), tests/bhrz03widening8.cc (1.5),
+	  tests/bhrz03widening9.cc (1.8), tests/concatenate4.cc (1.7),
+	  tests/contains2.cc (1.4), tests/contains3.cc (1.4),
+	  tests/contains4.cc (1.3), tests/disjoint2.cc (1.10),
+	  tests/disjoint3.cc (1.9), tests/dualhypercubes.cc (1.7),
+	  tests/empty1.cc (1.15), tests/exceptions1.cc (1.42),
+	  tests/exceptions2.cc (1.37), tests/generators1.cc (1.16),
+	  tests/generators2.cc (1.12), tests/generators3.cc (1.6),
+	  tests/generators4.cc (1.7), tests/generators5.cc (1.6),
+	  tests/generators6.cc (1.7), tests/h79widening4.cc (1.5),
+	  tests/intersection2.cc (1.11), tests/intersection6.cc (1.8),
+	  tests/limitedbhrz03extrapolation1.cc (1.5),
+	  tests/mapspacedims1.cc (1.2), tests/maxspacedim1.cc (1.5),
+	  tests/membytes1.cc (1.7), tests/mingenerators1.cc (1.6),
+	  tests/mingenerators2.cc (1.5), tests/mingenerators3.cc (1.5),
+	  tests/polydifference1.cc (1.9), tests/polydifference2.cc (1.11),
+	  tests/polydifference8.cc (1.3), tests/polyhull1.cc (1.9),
+	  tests/polyhull2.cc (1.8), tests/polyhull7.cc (1.5),
+	  tests/print.cc (1.12), tests/print.hh (1.16), tests/randphull1.cc
+	  (1.12), tests/randphull2.cc (1.9), tests/relations12.cc (1.6),
+	  tests/relations15.cc (1.6), tests/relations16.cc (1.6),
+	  tests/relations17.cc (1.9), tests/relations4.cc (1.12),
+	  tests/relations5.cc (1.12), tests/removespacedims1.cc (1.2),
+	  tests/removespacedims2.cc (1.3), tests/removespacedims4.cc (1.2),
+	  tests/removespacedims8.cc (1.2), tests/smm1.cc (1.17),
+	  tests/timeelapse1.cc (1.9), tests/timeelapse3.cc (1.10),
+	  tests/timeelapse4.cc (1.9), tests/timeelapse6.cc (1.5),
+	  tests/topclosed2.cc (1.7), tests/topclosed3.cc (1.9),
+	  tests/topclosure1.cc (1.8), tests/universe7.cc (1.2),
+	  tests/writegensys1.cc (1.9), tests/writegensys2.cc (1.9),
+	  tests/writegensys3.cc (1.9): The class GenSys has been renamed
+	  Generator_System.
+
+2004-12-11 Saturday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.135), README (1.28), TODO (1.122),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.35), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.7), doc/definitions.dox (1.162),
+	  doc/devref-browse.doxyconf-latex.in (1.50),
+	  doc/devref-print.doxyconf-latex.in (1.50),
+	  doc/devref.doxyconf-html.in (1.50), interfaces/C/ppl_c.cc
+	  (1.115), interfaces/C/ppl_c.h.in (1.38),
+	  interfaces/Prolog/ppl_prolog.icc (1.143), src/Ask_Tell.defs.hh
+	  (1.2), src/Ask_Tell.inlines.hh (1.2), src/BHRZ03_Certificate.cc
+	  (1.4), src/C_Polyhedron.cc (1.13), src/C_Polyhedron.defs.hh
+	  (1.29), src/C_Polyhedron.inlines.hh (1.22), src/ConSys.cc (1.76),
+	  src/ConSys.defs.hh (1.93), src/ConSys.inlines.hh (1.37),
+	  src/ConSys.types.hh (1.8), src/Constraint.defs.hh (1.95),
+	  src/Constraint_System.cc (1.1), src/Constraint_System.defs.hh
+	  (1.1), src/Constraint_System.inlines.hh (1.1),
+	  src/Constraint_System.types.hh (1.1), src/Determinate.defs.hh
+	  (1.49), src/Determinate.inlines.hh (1.43), src/GenSys.inlines.hh
+	  (1.37), src/Generator.defs.hh (1.95), src/H79_Certificate.cc
+	  (1.5), src/Linear_Expression.defs.hh (1.2),
+	  src/Linear_System.defs.hh (1.8), src/Makefile.am (1.88),
+	  src/Matrix.defs.hh (1.64), src/NNC_Polyhedron.defs.hh (1.31),
+	  src/NNC_Polyhedron.inlines.hh (1.25),
+	  src/Polyhedra_Powerset.defs.hh (1.9),
+	  src/Polyhedra_Powerset.inlines.hh (1.10), src/Polyhedron.defs.hh
+	  (1.257), src/Polyhedron.inlines.hh (1.102),
+	  src/Polyhedron.types.hh (1.13), src/Polyhedron_chdims.cc (1.25),
+	  src/Polyhedron_nonpublic.cc (1.36), src/Polyhedron_public.cc
+	  (1.41), src/Polyhedron_widenings.cc (1.35),
+	  src/Widening_Function.defs.hh (1.7),
+	  src/Widening_Function.inlines.hh (1.7), src/algorithms.hh (1.36),
+	  tests/NNCminimize1.cc (1.11), tests/NNCminimize2.cc (1.11),
+	  tests/NNCminimize3.cc (1.11), tests/NNCminimize5.cc (1.11),
+	  tests/NNCminimize6.cc (1.12), tests/addconstraint1.cc (1.7),
+	  tests/addconstraints1.cc (1.13), tests/addconstraints10.cc
+	  (1.11), tests/addconstraints11.cc (1.12),
+	  tests/addconstraints12.cc (1.5), tests/addconstraints13.cc (1.7),
+	  tests/addconstraints2.cc (1.20), tests/addconstraints3.cc (1.11),
+	  tests/addconstraints4.cc (1.12), tests/addconstraints5.cc (1.13),
+	  tests/addconstraints6.cc (1.14), tests/addconstraints7.cc (1.13),
+	  tests/addconstraints8.cc (1.14), tests/addconstraints9.cc (1.14),
+	  tests/addspacedims3.cc (1.2), tests/addspacedims4.cc (1.2),
+	  tests/addspacedims5.cc (1.2), tests/ascii_dump_load4.cc (1.15),
+	  tests/boundedh79extrapolation1.cc (1.2), tests/boundingbox1.cc
+	  (1.38), tests/boundingbox3.cc (1.14), tests/concatenate1.cc
+	  (1.10), tests/concatenate2.cc (1.9), tests/concatenate3.cc (1.8),
+	  tests/constraints1.cc (1.7), tests/constraints2.cc (1.7),
+	  tests/constraints3.cc (1.8), tests/constraints4.cc (1.7),
+	  tests/contains2.cc (1.3), tests/contains3.cc (1.3),
+	  tests/contains5.cc (1.3), tests/exceptions1.cc (1.41),
+	  tests/exceptions2.cc (1.36), tests/generators1.cc (1.15),
+	  tests/generators2.cc (1.11), tests/geomcovers1.cc (1.2),
+	  tests/intersection4.cc (1.8),
+	  tests/limitedbhrz03extrapolation1.cc (1.4),
+	  tests/limitedh79extrapolation1.cc (1.4),
+	  tests/limitedh79extrapolation2.cc (1.4),
+	  tests/limitedh79extrapolation3.cc (1.5),
+	  tests/limitedh79extrapolation4.cc (1.5), tests/maxspacedim1.cc
+	  (1.4), tests/membytes1.cc (1.6), tests/minconstraints1.cc (1.6),
+	  tests/minconstraints2.cc (1.6), tests/minconstraints3.cc (1.5),
+	  tests/minconstraints4.cc (1.9), tests/polydifference2.cc (1.10),
+	  tests/polydifference3.cc (1.6), tests/polydifference8.cc (1.2),
+	  tests/print.cc (1.11), tests/print.hh (1.15), tests/randphull2.cc
+	  (1.8), tests/relations1.cc (1.11), tests/relations8.cc (1.11),
+	  tests/relations9.cc (1.14), tests/smm1.cc (1.16),
+	  tests/timeelapse3.cc (1.9), tests/universe3.cc (1.12),
+	  tests/universe4.cc (1.12), tests/universe6.cc (1.11),
+	  tests/writeconsys1.cc (1.9): The class ConSys has been renamed
+	  Constraint_System.
+
+2004-12-11 Saturday 09:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.134), README (1.27), TODO (1.121), configure.ac (1.142),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.34), demos/ppl_lpsol/ppl_lpsol.c
+	  (1.6), doc/devref-browse.doxyconf-latex.in (1.49),
+	  doc/devref-print.doxyconf-latex.in (1.49),
+	  doc/devref.doxyconf-html.in (1.49), interfaces/C/ppl_c.cc
+	  (1.114), interfaces/C/ppl_c.h.in (1.37),
+	  interfaces/Prolog/ppl_prolog.icc (1.142),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.72), src/C_Polyhedron.cc
+	  (1.12), src/ConSys.cc (1.75), src/ConSys.defs.hh (1.92),
+	  src/Constraint.cc (1.44), src/Constraint.defs.hh (1.94),
+	  src/Constraint.inlines.hh (1.55), src/GenSys.cc (1.101),
+	  src/GenSys.defs.hh (1.106), src/Generator.cc (1.55),
+	  src/Generator.defs.hh (1.94), src/Generator.inlines.hh (1.49),
+	  src/LinExpression.cc (1.25), src/LinExpression.defs.hh (1.73),
+	  src/LinExpression.inlines.hh (1.34), src/LinExpression.types.hh
+	  (1.8), src/Linear_Expression.cc (1.1),
+	  src/Linear_Expression.defs.hh (1.1),
+	  src/Linear_Expression.inlines.hh (1.1),
+	  src/Linear_Expression.types.hh (1.1), src/Linear_Row.defs.hh
+	  (1.5), src/Linear_System.cc (1.10), src/Makefile.am (1.87),
+	  src/Polyhedra_Powerset.inlines.hh (1.9), src/Polyhedron.defs.hh
+	  (1.256), src/Polyhedron.inlines.hh (1.101),
+	  src/Polyhedron_chdims.cc (1.24), src/Polyhedron_nonpublic.cc
+	  (1.35), src/Polyhedron_public.cc (1.40),
+	  src/Polyhedron_widenings.cc (1.34), src/Variable.defs.hh (1.44),
+	  src/algorithms.hh (1.35), tests/addconstraints1.cc (1.12),
+	  tests/addconstraints3.cc (1.10), tests/addconstraints8.cc (1.13),
+	  tests/affinetrans.cc (1.15), tests/bhrz03widening14.cc (1.6),
+	  tests/bhrz03widening15.cc (1.8), tests/bounded1.cc (1.14),
+	  tests/bounds1.cc (1.7), tests/constraints3.cc (1.7),
+	  tests/disjoint2.cc (1.9), tests/disjoint3.cc (1.8),
+	  tests/dualhypercubes.cc (1.6), tests/exceptions1.cc (1.40),
+	  tests/exceptions2.cc (1.35), tests/exceptions3.cc (1.5),
+	  tests/generalizedaffineimage9.cc (1.7),
+	  tests/limitedh79extrapolation4.cc (1.4), tests/linexpression1.cc
+	  (1.5), tests/max_min1.cc (1.5), tests/max_min2.cc (1.5),
+	  tests/maxspacedim1.cc (1.3), tests/membytes1.cc (1.5),
+	  tests/polydifference3.cc (1.5), tests/randphull2.cc (1.7),
+	  tests/relations7.cc (1.11), tests/relations9.cc (1.13),
+	  tests/removespacedims2.cc (1.2), tests/universe6.cc (1.10),
+	  tests/writeconsys1.cc (1.8), tests/writegensys3.cc (1.8): The
+	  class LinExpression has been renamed Linear_Expression.
+
+2004-12-11 Saturday 09:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/expected_mpz_a (1.2): Adapted to the recent
+	  changes in the precision of ppl_lpsol's output.
+
+2004-12-09 Thursday 17:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/swapping_sort.icc (1.4): The swapping sort procedure
+	  rewritten from scratch (it was buggy).
+
+2004-12-08 Wednesday 11:12  Abramo Bagnara
+
+	* src/globals.defs.hh (altnum.5): Added used() function useful to
+	  suppress compiler warning.
+
+2004-12-08 Wednesday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Number.inlines.hh (1.7): Do not name an unused
+	  parameter.
+
+2004-12-07 Tuesday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: expected_int16 (1.2), expected_int32 (1.2),
+	  expected_int32_a (1.2), expected_int64 (1.2), expected_int64_a
+	  (1.2), expected_mpz (1.2), ppl_lpsol.c (1.5): Print optimum value
+	  and location with the format "%.10g" instead of "%g".
+
+2004-12-07 Tuesday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.133), README (1.26), TODO (1.120),
+	  doc/devref-browse.doxyconf-latex.in (1.48),
+	  doc/devref-print.doxyconf-latex.in (1.48),
+	  doc/devref.doxyconf-html.in (1.48), src/AskTell.defs.hh (1.28),
+	  src/AskTell.inlines.hh (1.24), src/AskTell.types.hh (1.7),
+	  src/Linear_System.cc (1.9), src/Linear_System.defs.hh (1.7),
+	  src/Linear_System.inlines.hh (1.8), src/Makefile.am (1.86),
+	  src/Matrix.defs.hh (1.63), src/Polyhedron.defs.hh (1.255),
+	  src/Polyhedron_chdims.cc (1.23), src/Polyhedron_nonpublic.cc
+	  (1.34), src/Polyhedron_public.cc (1.39),
+	  src/Polyhedron_widenings.cc (1.33), src/SatMatrix.cc (1.35),
+	  src/SatMatrix.defs.hh (1.39), src/SatMatrix.inlines.hh (1.27),
+	  src/SatMatrix.types.hh (1.8), src/SatRow.cc (1.31),
+	  src/SatRow.defs.hh (1.37), src/SatRow.inlines.hh (1.31),
+	  src/SatRow.types.hh (1.8), src/Saturation_Matrix.cc (1.1),
+	  src/Saturation_Matrix.defs.hh (1.1),
+	  src/Saturation_Matrix.inlines.hh (1.1),
+	  src/Saturation_Matrix.types.hh (1.1), src/Saturation_Row.cc
+	  (1.1), src/Saturation_Row.defs.hh (1.1),
+	  src/Saturation_Row.inlines.hh (1.1), src/Saturation_Row.types.hh
+	  (1.1), src/conversion.cc (1.64), src/minimize.cc (1.39),
+	  src/simplify.cc (1.41), src/swapping_sort.icc (1.3): The class
+	  SatRow has been renamed Saturation_Row.  The class SatMatrix has
+	  been renamed Saturation_Matrix.
+
+2004-12-07 Tuesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.132), README (1.25), TODO (1.119),
+	  doc/devref-browse.doxyconf-latex.in (1.47),
+	  doc/devref-print.doxyconf-latex.in (1.47),
+	  doc/devref.doxyconf-html.in (1.47),
+	  interfaces/Prolog/ppl_prolog.icc (1.141), src/BoundingBox.cc
+	  (1.10), src/BoundingBox.defs.hh (1.15),
+	  src/BoundingBox.inlines.hh (1.14), src/BoundingBox.types.hh
+	  (1.7), src/Bounding_Box.cc (1.1), src/Bounding_Box.defs.hh (1.1),
+	  src/Bounding_Box.inlines.hh (1.1), src/Bounding_Box.types.hh
+	  (1.1), src/Makefile.am (1.85), tests/boundingbox2.cc (1.23),
+	  tests/boundingbox3.cc (1.13), tests/boundingbox4.cc (1.11): The
+	  class BoundingBox has been renamed Bounding_Box.
+
+2004-12-06 Monday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.238): Added nnc_membytes2 to
+	  XFAIL_WITH_INT8_A.
+
+2004-12-06 Monday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.131), README (1.24), TODO (1.118), src/Ask_Tell.defs.hh
+	  (1.1), src/Ask_Tell.inlines.hh (1.1), src/Ask_Tell.types.hh
+	  (1.1): The class AskTell has been renamed Ask_Tell.
+
+2004-12-06 Monday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.130), src/Polyhedra_Powerset.defs.hh (1.8),
+	  src/Polyhedra_Powerset.inlines.hh (1.8), tests/membytes2.cc
+	  (1.3): New explicit constructor
+	  Polyhedra_Powerset<CS>::Polyhedra_Powerset(const PH& ph):  if
+	  `ph' is not empty, builds a powerset containing only `ph';
+	  builds the empty powerset otherwise.	Constructor
+	  Polyhedra_Powerset<PH>::Polyhedra_Powerset(const ConSys& cs) made
+	  explicit as well.
+
+2004-12-06 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.129), src/Powerset.defs.hh (1.3), src/Powerset.inlines.hh
+	  (1.4): New explicit constructor Powerset<CS>::Powerset(const CS&
+	  d):  if `d' is not bottom, builds a powerset containing only `d';
+	  builds the empty powerset otherwise.
+
+2004-12-06 Monday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.128): Restored an item erased by mistake.
+
+2004-12-06 Monday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.127): Improved.
+
+2004-12-06 Monday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.126), TODO (1.117), src/C_Polyhedron.defs.hh (1.28),
+	  src/C_Polyhedron.inlines.hh (1.21), src/NNC_Polyhedron.defs.hh
+	  (1.30), src/NNC_Polyhedron.inlines.hh (1.24): New methods
+	  C_Polyhedron& C_Polyhedron::operator=(const NNC_Polyhedron& y)
+	  and NNC_Polyhedron& NNC_Polyhedron::operator=(const C_Polyhedron&
+	  y).
+
+2004-12-06 Monday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.11): Efficiency bug fixed in
+	  C_Polyhedron::C_Polyhedron(const NNC_Polyhedron&).
+
+2004-12-06 Monday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.116): All the public classes of the library have been
+	  endowed with methods total_memory_in_bytes() and
+	  external_memory_in_bytes().
+
+2004-12-06 Monday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.72), Variable.defs.hh (1.43):
+	  Comments fixed/improved.
+
+2004-12-06 Monday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.7),
+	  src/Polyhedra_Powerset.inlines.hh (1.7), src/Powerset.defs.hh
+	  (1.2), src/Powerset.inlines.hh (1.3), tests/membytes2.cc (1.2):
+	  Added methods Powerset<CS>::external_memory_in_bytes() and
+	  Powerset<CS>::total_memory_in_bytes().  Added methods
+	  Polyhedra_Powerset<PH>::external_memory_in_bytes() and
+	  Polyhedra_Powerset<PH>::total_memory_in_bytes().
+
+2004-12-06 Monday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.48), src/Determinate.inlines.hh
+	  (1.42), tests/Makefile.am (1.237), tests/membytes2.cc (1.1):
+	  Added methods Determinate<PH>::external_memory_in_bytes() and
+	  Determinate<PH>::total_memory_in_bytes().
+
+2004-12-06 Monday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.47): Useless declarations removed.
+
+2004-12-05 Sunday 22:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Variable.cc (1.17), Variable.defs.hh (1.42): New method
+	  Variable::OK().
+
+2004-12-05 Sunday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.24), LinExpression.defs.hh (1.71): New
+	  method LinExpression::OK().
+
+2004-12-05 Sunday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.93), src/Generator.inlines.hh (1.48),
+	  src/LinExpression.defs.hh (1.70), src/LinExpression.inlines.hh
+	  (1.33), src/Variable.defs.hh (1.41), src/Variable.inlines.hh
+	  (1.20), tests/membytes1.cc (1.4): Added
+	  Variable::total_memory_in_bytes() and
+	  Variable::external_memory_in_bytes().  Added
+	  Generator::total_memory_in_bytes() and
+	  Generator::external_memory_in_bytes().  Added
+	  LinExpression::total_memory_in_bytes() and
+	  LinExpression::external_memory_in_bytes().
+
+2004-12-05 Sunday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/membytes1.cc (1.3): Avoid compiler warnings.
+
+2004-12-05 Sunday 07:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.115), interfaces/Prolog/Prolog_interface.dox (1.117): We
+	  now explain to the GNU Prolog user that GNU Prolog must be
+	  configured using the `--disable-regs' option, if it has to work
+	  with _any_ foreign code (not just the PPL).
+
+2004-11-28 Sunday 14:35  Abramo Bagnara
+
+	* configure.ac, src/checked_float.inlines.hh (altnum.[11,14]):
+	  Fixed cygwin support.
+
+2004-11-28 Sunday 14:34  Abramo Bagnara
+
+	* configure.ac (1.141), src/checked_float.inlines.hh (1.9): Fixed
+	  cygwin support
+
+2004-11-27 Saturday 19:32  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.20): Use signed explicitly.
+
+2004-11-27 Saturday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL, NEWS, TODO, compile, config.guess, configure.ac,
+	  install-sh, Watchdog/INSTALL, Watchdog/Makefile.am,
+	  Watchdog/compile, Watchdog/config.guess, Watchdog/configure.ac,
+	  Watchdog/install-sh, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/expected_int8,
+	  demos/ppl_lcdd/expected_int8_a, demos/ppl_lpsol/Makefile.am,
+	  demos/ppl_lpsol/expected, demos/ppl_lpsol/expected_int16,
+	  demos/ppl_lpsol/expected_int16_a, demos/ppl_lpsol/expected_int32,
+	  demos/ppl_lpsol/expected_int32_a, demos/ppl_lpsol/expected_int64,
+	  demos/ppl_lpsol/expected_int64_a, demos/ppl_lpsol/expected_int8,
+	  demos/ppl_lpsol/expected_int8_a, demos/ppl_lpsol/expected_mpz,
+	  demos/ppl_lpsol/expected_mpz_a, demos/ppl_lpsol/ppl_lpsol.c,
+	  doc/definitions.dox, doc/ppl.sty,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/YAP/Makefile.am, m4/Makefile.am,
+	  m4/ac_cxx_long_double.m4, m4/ac_cxx_long_long.m4,
+	  src/AskTell.defs.hh, src/AskTell.inlines.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/Checked_Number.types.hh, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GMP_Integer.defs.hh,
+	  src/GMP_Integer.inlines.hh, src/GenSys.defs.hh,
+	  src/GenSys.inlines.hh, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/LinExpression.defs.hh,
+	  src/Linear_Row.defs.hh, src/Linear_Row.inlines.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/SatRow.cc, src/SatRow.defs.hh,
+	  src/SatRow.inlines.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/checked.defs.hh,
+	  src/checked.inlines.hh, src/checked_float.inlines.hh,
+	  src/checked_int.inlines.hh, src/checked_mpq.inlines.hh,
+	  src/checked_mpz.inlines.hh, src/globals.defs.hh, src/simplify.cc,
+	  src/swapping_sort.icc, tests/Makefile.am, tests/affineimage9.cc,
+	  tests/bgp99extrapolation1.cc, tests/bgp99extrapolation2.cc,
+	  tests/bhz03widening1.cc, tests/bhz03widening2.cc,
+	  tests/bhz03widening3.cc, tests/bhz03widening4.cc,
+	  tests/bhz03widening5.cc, tests/bhz03widening6.cc,
+	  tests/equals1.cc, tests/exceptions3.cc, tests/mapspacedims4.cc,
+	  tests/maxspacedim1.cc, tests/membytes1.cc, tests/universe7.cc,
+	  tests/valgrind_suppressions
+	  (altnum.[1,5,5,2,3,10,3,1,3,2,3,2,3,2,5,2,2,3,3,1,1,1,1,1,1,1,1,1,1,3,5,3,5,6,4,3,3,3,3,3,1,1,1,4,2,4,3,13,13,4,6,3,6,4,4,3,6,6,6,2,6,4,4,2,2,2,2,2,13,5,4,2,3,3,6,6,3,3,6,6,4,8,6,4,5,4,3,3,2,9,3,2,3,3,19,12,13,19,15,18,4,4,1,6,2,3,3,3,3,3,3,3,3,1,3,1,1,1,1,1]):
+	  Fifth number from main repository.
+
+2004-11-27 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/ppl_lpsol.c (1.4): Little memory leaks fixed.
+
+2004-11-27 Saturday 15:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.20), NNC_Polyhedron.inlines.hh
+	  (1.23), Polyhedron.defs.hh (1.254), Polyhedron_chdims.cc (1.22),
+	  Polyhedron_nonpublic.cc (1.33): Private exception thrower method
+	  Polyhedron::throw_space_dimension_overflow() made static, as it
+	  is often called inside constructors (before actually constructing
+	  the polyhedron object).
+
+2004-11-27 Saturday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.236), valgrind_suppressions (1.1): Added a
+	  minimal infrastructure to perform regression testing using
+	  `valgrind'.
+
+2004-11-26 Friday 07:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int8_a (1.2): Fixed.
+
+2004-11-25 Thursday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.235): Added `ascii_dump_load4' to
+	  `XFAIL_WITH_INT8_A'.	iCVS:
+	  ----------------------------------------------------------------------
+
+2004-11-23 Tuesday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.140): Version number bumped.
+
+2004-11-23 Tuesday 22:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.30): The methods SatRow::last() and the
+	  functions compare(const SatRow&, const SatRow&),
+	  subset_or_equal(const SatRow&, const SatRow&),
+	  subset_or_equal(const SatRow&, const SatRow&, bool&) and
+	  strict_subset(const SatRow&, const SatRow&) have been simplified
+	  and optimized.
+
+2004-11-23 Tuesday 13:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/membytes1.cc (1.2): Be quiet.
+
+2004-11-23 Tuesday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.29), SatRow.defs.hh (1.36), simplify.cc
+	  (1.40): New function bool subset_or_equal(const SatRow& x, const
+	  SatRow& y, bool& strict_subset) allows a simple optimization of
+	  Polyhedron::simplify().  The function bool strict_subset(const
+	  SatRow& x, const SatRow& y) is currently unused but left in
+	  place: it may be needed and, moreover, when all what matters is
+	  strict inclusion, `strict_subset(x, y)' is faster than
+	  `subset_or_equal(x, y, s) && s'.
+
+2004-11-22 Monday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Linear_System.cc (1.8): The assertion at the beginning of
+	  add_pending_rows() made stronger: we assume that rows to be added
+	  have the same size.
+
+2004-11-22 Monday 06:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.15), demos/ppl_lpsol/Makefile.am
+	  (1.8), interfaces/Prolog/Ciao/Makefile.am (1.36),
+	  interfaces/Prolog/GNU/Makefile.am (1.41),
+	  interfaces/Prolog/SICStus/Makefile.am (1.47),
+	  interfaces/Prolog/SWI/Makefile.am (1.39),
+	  interfaces/Prolog/XSB/Makefile.am (1.28),
+	  interfaces/Prolog/YAP/Makefile.am (1.31): Do not depend on the
+	  current locale.
+
+2004-11-22 Monday 06:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.114): Postpone one item to PPL 0.8.
+
+2004-11-21 Sunday 15:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Row.defs.hh (1.4), Linear_Row.inlines.hh (1.4):
+	  Removed useless constructor for Linear_Row::Flags objects.
+
+2004-11-20 Saturday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.21): Define the PROFILING symbol when
+	  compiling for profiling.
+
+2004-11-15 Monday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.139): Version number bumped.
+
+2004-11-15 Monday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.73): Method Row::Impl::shrink() fixed: it was
+	  horribly broken on October 30, 2004 with the result that no
+	  memory could ever be deallocated.
+
+2004-11-15 Monday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.7), Linear_System.defs.hh (1.6),
+	  Linear_System.inlines.hh (1.7), SatMatrix.cc (1.34),
+	  SatMatrix.defs.hh (1.38), SatMatrix.inlines.hh (1.26),
+	  swapping_sort.icc (1.2): Function objects *LessThan() renamed as
+	  *_Less_Than.	Rewritten the sorting routine based on iter_swap's.
+
+2004-11-15 Monday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.138): Version number bumped.
+
+2004-11-15 Monday 09:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.125), TODO (1.113), src/Checked_Number.defs.hh (1.4),
+	  src/Checked_Number.inlines.hh (1.6), src/ConSys.defs.hh (1.91),
+	  src/ConSys.inlines.hh (1.36), src/Constraint.defs.hh (1.93),
+	  src/Constraint.inlines.hh (1.54), src/GMP_Integer.defs.hh (1.3),
+	  src/GMP_Integer.inlines.hh (1.3), src/GenSys.defs.hh (1.105),
+	  src/GenSys.inlines.hh (1.36), src/Linear_System.defs.hh (1.5),
+	  src/Linear_System.inlines.hh (1.6), src/Matrix.cc (1.79),
+	  src/Matrix.defs.hh (1.62), src/Matrix.inlines.hh (1.41),
+	  src/Native_Integer.defs.hh (1.4), src/Native_Integer.inlines.hh
+	  (1.5), src/Polyhedron.defs.hh (1.253), src/Polyhedron.inlines.hh
+	  (1.100), src/Polyhedron_public.cc (1.38), src/Row.cc (1.72),
+	  src/Row.defs.hh (1.85), src/Row.inlines.hh (1.52),
+	  src/SatMatrix.cc (1.33), src/SatMatrix.defs.hh (1.37),
+	  src/SatMatrix.inlines.hh (1.25), src/SatRow.defs.hh (1.35),
+	  src/SatRow.inlines.hh (1.30), src/globals.defs.hh (1.9),
+	  tests/Makefile.am (1.234), tests/membytes1.cc (1.1): Most of the
+	  public classes of the library have been endowed with methods
+	  `memory_size_type total_memory_in_bytes() const' and
+	  `memory_size_type external_memory_in_bytes() const' returning
+	  (lower bounds for) the total size in bytes of the memory occupied
+	  by *this and of the memory managed by *this, respectively.  The
+	  type `memory_size_type' is a newly added unsigned integral type
+	  suitable to the representation of such information.
+
+2004-11-11 Thursday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.defs.hh (1.6): Powerset::omega_reduce()
+	  made available to users of class Polyhedra_Powerset.
+
+2004-11-11 Thursday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.137): Version number bumped.
+
+2004-11-10 Wednesday 11:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.124), src/Polyhedra_Powerset.defs.hh (1.5),
+	  src/Widening_Function.defs.hh (1.6),
+	  src/Widening_Function.inlines.hh (1.6),
+	  tests/bgp99extrapolation1.cc (1.6), tests/bgp99extrapolation2.cc
+	  (1.8), tests/bhz03widening1.cc (1.7), tests/bhz03widening2.cc
+	  (1.9), tests/bhz03widening3.cc (1.7), tests/bhz03widening4.cc
+	  (1.5), tests/bhz03widening5.cc (1.6), tests/bhz03widening6.cc
+	  (1.7): The helper function widen_fun has been renamed
+	  widen_fun_ref.
+
+2004-11-08 Monday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/Makefile.am (1.7): Distribute all the expected*
+	  files.
+
+2004-11-08 Monday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.140): Handle
+	  std::length_error exceptions.
+
+2004-11-08 Monday 21:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.84): Concatenation order for ppl_install.hh
+	  fixed.
+
+2004-11-08 Monday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.112), src/AskTell.defs.hh (1.27), src/AskTell.inlines.hh
+	  (1.23), src/Determinate.defs.hh (1.46),
+	  src/Determinate.inlines.hh (1.41), src/Polyhedra_Powerset.defs.hh
+	  (1.4), src/Polyhedra_Powerset.inlines.hh (1.6),
+	  src/Polyhedron.defs.hh (1.252), src/Polyhedron.inlines.hh (1.99):
+	  `PartialFunction' renamed `Partial_Function'.
+
+2004-11-08 Monday 17:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.123), src/Polyhedron_public.cc (1.37): The bug shown by
+	  universe7.cc, affecting method Polyhedron::is_universe(), is now
+	  corrected.
+
+2004-11-08 Monday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.233), universe7.cc (1.1): New test shows a
+	  bug in method Polyhedron::is_universe().
+
+2004-11-08 Monday 17:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.32), SatMatrix.inlines.hh (1.24):
+	  Reimplemented SatMatrix::sorted_contains() usiong binary search
+	  (instead of linear-search).
+
+2004-11-08 Monday 14:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.6), Linear_System.defs.hh (1.4),
+	  Linear_System.inlines.hh (1.5), Makefile.am (1.83), SatMatrix.cc
+	  (1.31), SatMatrix.defs.hh (1.36), SatMatrix.inlines.hh (1.23),
+	  swapping_sort.icc (1.1): Added a simplified version of the STL
+	  sorting algorithm that avoids (almost all) copies of objects by
+	  performing more swaps.  The new algorithm is used when sorting
+	  Linear_System and SatMatrix objects.	The same algorithm is also
+	  used to provide a new implementation of method
+	  Linear_System::sort_and_remove_with_sat(SatMatrix& sat); by
+	  defining an iterator on Linear_System that mimics on the
+	  SatMatrix all the swaps made on the Linear_System.
+
+2004-11-08 Monday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.6), expected_int16_a (1.1),
+	  expected_int32_a (1.1), expected_int64_a (1.1), expected_int8_a
+	  (1.1), expected_mpz_a (1.1): Not all the examples can be tested
+	  with assertions enabled.
+
+2004-11-08 Monday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.14): Logic simplified.
+
+2004-11-08 Monday 07:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.136): In Cygwin, /usr/include/mingw contains
+	  header files that conflict with those in /usr/include: cannot add
+	  the former to the include path list.
+
+2004-11-08 Monday 07:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (1.8): Previous change reverted.
+
+2004-11-08 Monday 00:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.135), src/checked_float.inlines.hh (1.7): Support
+	  for Cygwin improved.
+
+2004-11-07 Sunday 17:59  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.6): Dirty tricks due to
+	  ppl_install.hh generation weirdness.
+
+2004-11-07 Sunday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.35): Erase the right
+	  temporary file.
+
+2004-11-07 Sunday 16:10  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.5): Added support for non C99
+	  conformant Cygwin.
+
+2004-11-07 Sunday 15:55  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (1.4): Avoided endian.h inclusion.
+
+2004-11-07 Sunday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/expected_int8 (1.2), ppl_lpsol/expected_int8
+	  (1.2): Adapted to the fixed output of 8-bits integers.
+
+2004-11-07 Sunday 11:09  Abramo Bagnara
+
+	* src/: Checked_Number.inlines.hh (1.5), checked.defs.hh (1.3),
+	  checked.inlines.hh (1.3), checked_float.inlines.hh (1.3),
+	  checked_int.inlines.hh (1.5), checked_mpq.inlines.hh (1.4),
+	  checked_mpz.inlines.hh (1.4): Added support for I/O
+	  specialization.
+
+2004-11-06 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.5), expected (1.3): The
+	  `expected' file is now obsolete.
+
+2004-11-06 Saturday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.27): Distribute all the
+	  expected* files.
+
+2004-11-06 Saturday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.134): Bumped version number.
+
+2004-11-06 Saturday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.122): Mention the bug fixed in
+	  Polyhedron::map_space_dimensions().
+
+2004-11-06 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.4), tests/Makefile.am (1.232),
+	  tests/mapspacedims4.cc (1.1): After the permutation of columns, a
+	  linear system must be sign-normalized.  The new test program
+	  mapspacedims4 shows this phenomenon.
+
+2004-11-06 Saturday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.5), Linear_System.defs.hh (1.3): New
+	  method Linear_System::sign_normalize().
+
+2004-11-06 Saturday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lpsol/: Makefile.am (1.4), expected_int16 (1.1),
+	  expected_int32 (1.1), expected_int64 (1.1), expected_int8 (1.1),
+	  expected_mpz (1.1): Added expected results for the various
+	  coeffcient types.
+
+2004-11-06 Saturday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.defs.hh (1.27), src/NNC_Polyhedron.defs.hh
+	  (1.29), TODO (1.111): Documented the std::length exceptions that
+	  can be thrown by constructors.
+
+2004-11-04 Thursday 13:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/Makefile.am (1.5): Re-add `ppl_lpsol' to `SUBDIRS'.
+
+2004-11-04 Thursday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.13): Distribute the expected_*
+	  files.
+
+2004-11-04 Thursday 10:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.110), doc/definitions.dox (1.161), doc/ppl.sty (1.17),
+	  interfaces/Prolog/Prolog_interface.dox (1.116): Explained the
+	  order of arguments in widening applications.	Better explained
+	  the reason for having C_Polyhedron and NNC_Polyhedron.
+
+2004-11-02 Tuesday 17:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions3.cc (1.4): Checking the detection of space
+	  dimension overflows in methods changing teh dimension of a
+	  polyhedron.
+
+2004-11-02 Tuesday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/maxspacedim1.cc (1.2): Testing the max_space_dimension()
+	  methods on Constraint and Generator.
+
+2004-11-02 Tuesday 17:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.21): Corrected exception message.
+
+2004-11-02 Tuesday 17:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.92), Constraint.inlines.hh (1.53),
+	  Generator.defs.hh (1.92), Generator.inlines.hh (1.47): Added
+	  static method max_space_dimension() to classes Constraint and
+	  Generator.
+
+2004-11-02 Tuesday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Native_Integer.inlines.hh (1.4): Added several constructors.
+
+2004-11-02 Tuesday 15:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/affineimage9.cc (1.2): A spurious dot resulted into an
+	  unknown floating point constant: fixed.
+
+2004-11-02 Tuesday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_int.inlines.hh (1.4): Include <cstdlib> for strtol(),
+	  strtoul(), strtoll() and strtoull().
+
+2004-11-02 Tuesday 12:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.133), m4/ac_cxx_long_double.m4 (1.2): Amended to
+	  check whether the C++ compiler provides long double numbers that
+	  have bigger range or precision than double.
+
+2004-11-02 Tuesday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Native_Integer.defs.hh (1.3), Native_Integer.inlines.hh
+	  (1.3): Reorganized.  All friend declarations removed.
+
+2004-11-02 Tuesday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Number.defs.hh (1.3), Checked_Number.inlines.hh
+	  (1.4), Checked_Number.types.hh (1.3): Minor changes to adhere to
+	  our coding conventions.  Added declarations for template
+	  <typename T, typename Policy> const T& raw_value(const
+	  Checked_Number<T, Policy>& x) and template <typename T, typename
+	  Policy> T& raw_value(Checked_Number<T, Policy>& x).
+
+2004-11-02 Tuesday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.231): The programs equals1 and nnc_equals1
+	  fail also with 32-bits integers.
+
+2004-11-01 Monday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.132), m4/Makefile.am (1.11),
+	  m4/ac_cxx_long_double.m4 (1.1), m4/ac_cxx_long_long.m4 (1.1): New
+	  Autoconf tests to check whether the C++ compiler supports long
+	  long integers and long double numbers.
+
+2004-11-01 Monday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.230), equals1.cc (1.1): Test
+	  operator==(const Polyhedron&, const Polyhedron&).
+
+2004-11-01 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.6), compile (1.3), config.guess (1.25), install-sh
+	  (1.11), Watchdog/INSTALL (1.3), Watchdog/compile (1.3),
+	  Watchdog/config.guess (1.9), Watchdog/install-sh (1.8): Updated
+	  from Automake 1.9.3.
+
+2004-11-01 Monday 11:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.4): Fixed a problem introduced with the
+	  previous commit.
+
+2004-11-01 Monday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.cc (1.3): Two FIXMEs dealt with.
+
+2004-11-01 Monday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.defs.hh (1.61): FIXME added.
+
+2004-10-30 Saturday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.71), Row.inlines.hh (1.51): Fixed a bug in
+	  Row::shrink() that could bite (but not with the current code)
+	  when using compilers not supporting flexible arrays.
+
+2004-10-30 Saturday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.131): Check for endianness.
+
+2004-10-29 Friday 19:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.229), maxspacedim1.cc (1.1): Test the
+	  *::max_space_dimension() methods.
+
+2004-10-29 Friday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh (1.3), checked_mpz.inlines.hh (1.3):
+	  Spurious semicolons removed.
+
+2004-10-29 Friday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Linear_System.inlines.hh (1.3): Make sure
+	  Linear_System::is_sorted() and Linear_System::set_sorted() are
+	  defined before being used.
+
+2004-10-29 Friday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.69): Meaningless type qualifier
+	  removed.
+
+2004-10-29 Friday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.13), demos/ppl_lcdd/Makefile.am (1.12),
+	  demos/ppl_lpsol/Makefile.am (1.3),
+	  interfaces/Prolog/Ciao/Makefile.am (1.34),
+	  interfaces/Prolog/GNU/Makefile.am (1.40),
+	  interfaces/Prolog/SICStus/Makefile.am (1.46),
+	  interfaces/Prolog/XSB/Makefile.am (1.26),
+	  interfaces/Prolog/YAP/Makefile.am (1.30), tests/Makefile.am
+	  (1.228): Always specify the condition which is closed by an
+	  Automake's `end',
+
+2004-10-29 Friday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.11): Run `ppl_lcdd' in the local
+	  directory, not some other executable with the same name.
+
+2004-10-28 Thursday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, TODO, configure.ac, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/expected, demos/ppl_lcdd/expected_int16,
+	  demos/ppl_lcdd/expected_int16_a, demos/ppl_lcdd/expected_int32,
+	  demos/ppl_lcdd/expected_int32_a, demos/ppl_lcdd/expected_int64,
+	  demos/ppl_lcdd/expected_int64_a, demos/ppl_lcdd/expected_int8,
+	  demos/ppl_lcdd/expected_int8_a, demos/ppl_lcdd/expected_mpz,
+	  demos/ppl_lcdd/expected_mpz_a, demos/ppl_lcdd/ppl_lcdd.cc,
+	  doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/devref.tex, doc/user.tex, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/ack.clpq, interfaces/Prolog/ackn.clpq,
+	  interfaces/Prolog/check_script, interfaces/Prolog/check_script2,
+	  interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+	  interfaces/Prolog/expected, interfaces/Prolog/expected2,
+	  interfaces/Prolog/expected3, interfaces/Prolog/fib.clpq,
+	  interfaces/Prolog/mc91.clpq, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/schedule.clpq, interfaces/Prolog/smm.clpq,
+	  interfaces/Prolog/smmdiff.clpq, interfaces/Prolog/sumto.clpq,
+	  interfaces/Prolog/tak.clpq, interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ppl_ciao.cc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SICStus/sp_clpq.pl,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/SWI/pl_clpq.pl,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/XSB/expected, interfaces/Prolog/XSB/expected2,
+	  interfaces/Prolog/XSB/expected2_int16,
+	  interfaces/Prolog/XSB/expected2_int16_a,
+	  interfaces/Prolog/XSB/expected2_int32,
+	  interfaces/Prolog/XSB/expected2_int32_a,
+	  interfaces/Prolog/XSB/expected2_int64,
+	  interfaces/Prolog/XSB/expected2_int64_a,
+	  interfaces/Prolog/XSB/expected2_int8,
+	  interfaces/Prolog/XSB/expected2_int8_a,
+	  interfaces/Prolog/XSB/expected2_mpz,
+	  interfaces/Prolog/XSB/expected2_mpz_a,
+	  interfaces/Prolog/XSB/expected3_int16,
+	  interfaces/Prolog/XSB/expected3_int16_a,
+	  interfaces/Prolog/XSB/expected3_int32,
+	  interfaces/Prolog/XSB/expected3_int32_a,
+	  interfaces/Prolog/XSB/expected3_int64,
+	  interfaces/Prolog/XSB/expected3_int64_a,
+	  interfaces/Prolog/XSB/expected3_int8,
+	  interfaces/Prolog/XSB/expected3_int8_a,
+	  interfaces/Prolog/XSB/expected3_mpz,
+	  interfaces/Prolog/XSB/expected3_mpz_a,
+	  interfaces/Prolog/XSB/expected_int16,
+	  interfaces/Prolog/XSB/expected_int16_a,
+	  interfaces/Prolog/XSB/expected_int32,
+	  interfaces/Prolog/XSB/expected_int32_a,
+	  interfaces/Prolog/XSB/expected_int64,
+	  interfaces/Prolog/XSB/expected_int64_a,
+	  interfaces/Prolog/XSB/expected_int8,
+	  interfaces/Prolog/XSB/expected_int8_a,
+	  interfaces/Prolog/XSB/expected_mpz,
+	  interfaces/Prolog/XSB/expected_mpz_a,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/Makefile.am,
+	  interfaces/Prolog/YAP/ppl_yap.cc,
+	  interfaces/Prolog/YAP/yap_clpq.pl,
+	  interfaces/Prolog/YAP/yap_clpq2.pl,
+	  interfaces/Prolog/YAP/yap_pl_check.pl,
+	  interfaces/Prolog/tests/.cvsignore,
+	  interfaces/Prolog/tests/Makefile.am,
+	  interfaces/Prolog/tests/ack.clpq,
+	  interfaces/Prolog/tests/ackn.clpq,
+	  interfaces/Prolog/tests/check_script,
+	  interfaces/Prolog/tests/check_script2,
+	  interfaces/Prolog/tests/check_script2_int8,
+	  interfaces/Prolog/tests/clpq.pl,
+	  interfaces/Prolog/tests/clpq2.pl,
+	  interfaces/Prolog/tests/expected2_int16,
+	  interfaces/Prolog/tests/expected2_int16_a,
+	  interfaces/Prolog/tests/expected2_int32,
+	  interfaces/Prolog/tests/expected2_int32_a,
+	  interfaces/Prolog/tests/expected2_int64,
+	  interfaces/Prolog/tests/expected2_int64_a,
+	  interfaces/Prolog/tests/expected2_int8,
+	  interfaces/Prolog/tests/expected2_int8_a,
+	  interfaces/Prolog/tests/expected2_mpz,
+	  interfaces/Prolog/tests/expected2_mpz_a,
+	  interfaces/Prolog/tests/expected3_int16,
+	  interfaces/Prolog/tests/expected3_int16_a,
+	  interfaces/Prolog/tests/expected3_int32,
+	  interfaces/Prolog/tests/expected3_int32_a,
+	  interfaces/Prolog/tests/expected3_int64,
+	  interfaces/Prolog/tests/expected3_int64_a,
+	  interfaces/Prolog/tests/expected3_int8,
+	  interfaces/Prolog/tests/expected3_int8_a,
+	  interfaces/Prolog/tests/expected3_mpz,
+	  interfaces/Prolog/tests/expected3_mpz_a,
+	  interfaces/Prolog/tests/expected_int16,
+	  interfaces/Prolog/tests/expected_int16_a,
+	  interfaces/Prolog/tests/expected_int32,
+	  interfaces/Prolog/tests/expected_int32_a,
+	  interfaces/Prolog/tests/expected_int64,
+	  interfaces/Prolog/tests/expected_int64_a,
+	  interfaces/Prolog/tests/expected_int8,
+	  interfaces/Prolog/tests/expected_int8_a,
+	  interfaces/Prolog/tests/expected_mpz,
+	  interfaces/Prolog/tests/expected_mpz_a,
+	  interfaces/Prolog/tests/fib.clpq,
+	  interfaces/Prolog/tests/mc91.clpq,
+	  interfaces/Prolog/tests/pl_check.pl,
+	  interfaces/Prolog/tests/schedule.clpq,
+	  interfaces/Prolog/tests/smm.clpq,
+	  interfaces/Prolog/tests/smmdiff.clpq,
+	  interfaces/Prolog/tests/sumto.clpq,
+	  interfaces/Prolog/tests/tak.clpq, m4/ac_check_gmp.m4,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/GenSys.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Linear_Row.cc, src/Linear_Row.defs.hh,
+	  src/Linear_Row.inlines.hh, src/Linear_Row.types.hh,
+	  src/Linear_System.cc, src/Linear_System.defs.hh,
+	  src/Linear_System.inlines.hh, src/Linear_System.types.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/Matrix.inlines.hh, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Ph_Status.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/Variable.defs.hh,
+	  src/Variable.inlines.hh, src/conversion.cc, src/globals.defs.hh,
+	  src/globals.inlines.hh, src/max_space_dimension.hh,
+	  src/minimize.cc, src/simplify.cc, tests/Makefile.am,
+	  tests/addgenerator1.cc, tests/addgenerator2.cc,
+	  tests/addgenerator5.cc, tests/addgenerators11.cc,
+	  tests/addspacedims10.cc, tests/affineimage9.cc,
+	  tests/bhrz03widening9.cc, tests/ehandlers.hh,
+	  tests/exceptions2.cc, tests/exceptions3.cc, tests/generators2.cc,
+	  tests/geomcovers1.cc, tests/polyhull10.cc, tests/polyhull11.cc,
+	  tests/randphull1.cc
+	  (altnum.[4,4,9,4,3,1,1,1,1,1,1,1,1,1,1,7,4,4,4,4,2,2,5,3,1,4,1,1,1,1,2,2,2,2,1,1,1,3,5,1,1,1,1,1,3,3,3,2,2,4,1,2,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,4,5,2,2,5,3,5,5,1,4,5,3,2,3,2,1,1,1,1,1,1,1,1,12,4,3,1,2,2,1,5,5,3,7,5,3,4,3,2,2,1,3,1,5,3,2,2,3,3,5,2,2,1,2,2,1,1,1,2,2,1,1,1,1,1]):
+	  Fourth merge from main trunk.
+
+2004-10-28 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.8), globals.inlines.hh (1.4):
+	  Implementation of not_a_dimension() and maybe_abandon() moved to
+	  global.inlines.hh.
+
+2004-10-28 Thursday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.defs.hh (1.7), globals.inlines.hh (1.3):
+	  Implementation of compute_capacity() moved to global.inlines.hh.
+
+2004-10-28 Thursday 17:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_System.cc (1.2), Matrix.cc (1.78), Matrix.inlines.hh
+	  (1.40), Row.cc (1.70), Row.inlines.hh (1.50), SatMatrix.cc
+	  (1.30), SatMatrix.defs.hh (1.35), SatMatrix.inlines.hh (1.22),
+	  globals.defs.hh (1.6): Avoid overflows when computing capacities
+	  for speculative memory allocations.  Added missing assertions on
+	  (user-unavailable) methods creating or extending data structures.
+
+2004-10-28 Thursday 08:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.19): Simplified the detection of
+	  sizeof(mp_limb_t): this works with Autoconf version 2.50 or
+	  higher (we already require 2.59 or higher).
+
+2004-10-28 Thursday 08:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.18): Second test program improved.
+
+2004-10-28 Thursday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.121), configure.ac (1.130), interfaces/C/ppl_c.h.in
+	  (1.36), m4/ac_check_gmp.m4 (1.17): We now require GMP 4.1.3 or
+	  higher.
+
+2004-10-27 Wednesday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.68), Variable.defs.hh (1.40): The
+	  new exceptions thrown by Variable and LinExpression are now
+	  mentioned in the documentation.
+
+2004-10-27 Wednesday 12:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.inlines.hh (1.35), GenSys.inlines.hh (1.35),
+	  Linear_System.defs.hh (1.2), Linear_System.inlines.hh (1.2):
+	  Added static method Linear_System::max_space_dimension().
+	  Corresponding methods of ConSys and GenSys are now implemented
+	  using this one.
+
+2004-10-27 Wednesday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.43), Constraint.inlines.hh (1.52),
+	  Generator.cc (1.54), Generator.inlines.hh (1.46),
+	  Polyhedron.defs.hh (1.251), Polyhedron_chdims.cc (1.20),
+	  Polyhedron_nonpublic.cc (1.32), Polyhedron_public.cc (1.36):
+	  Exploit the availability of Variable::space_dimension().
+
+2004-10-27 Wednesday 12:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Linear_Row.defs.hh (1.3), Linear_Row.inlines.hh (1.3):
+	  Implemented method max_space_dimension().
+
+2004-10-27 Wednesday 12:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions3.cc (1.3): Now also checking for exceptions
+	  thrown by Variable and LinExpression when exceeding the maximum
+	  space dimension.
+
+2004-10-27 Wednesday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.23), LinExpression.defs.hh (1.67),
+	  LinExpression.inlines.hh (1.32): Added method
+	  max_space_dimension(). Checking for space dimension overflows
+	  when building a LinExpression.
+
+2004-10-27 Wednesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Variable.defs.hh (1.39), Variable.inlines.hh (1.19): Added
+	  methods space_dimension() and max_space_dimension() to class
+	  Variable.  The constructor now checks for space dimension
+	  overflows.
+
+2004-10-26 Tuesday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.227): Take into account that some tests with
+	  checked-int8 fail only when assertions are enabled.
+
+2004-10-26 Tuesday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ehandlers.hh (1.9): Treat std::overflow_error specially.
+
+2004-10-26 Tuesday 18:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.115): Information about
+	  system-dependent features for the Prolog interface updated.
+
+2004-10-26 Tuesday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.74), GenSys.cc (1.100): Try to correctly deal
+	  with systems having no rows and possibly 0 columns.
+
+2004-10-26 Tuesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.39), tests/Makefile.am
+	  (1.2), tests/check_script2_int8 (1.1): Temporary kludge to avoid
+	  GNU Prolog's syntax errors when using clpq2 with checked-int8
+	  coefficients.
+
+2004-10-26 Tuesday 14:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/pl_clpq.pl (1.6): Temporary work-around to
+	  avoid a problem with the Prolog prompt whenusing SWI-Prolog.
+
+2004-10-26 Tuesday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.15), user.tex (1.16): Use
+	  \renewcommand{\footrulewidth}{0.4pt} instead of
+	  \setlength{\footrulewidth}{0.4pt}.
+
+2004-10-26 Tuesday 10:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.109): The last XFAILS has been dealt with (the only
+	  XFAILS remaining are those related to checked integers).
+
+2004-10-26 Tuesday 10:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.160): Typo corrected. Also stressed that
+	  NNC polyhedra have to be used only when actually needed.
+
+2004-10-26 Tuesday 10:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.120), tests/Makefile.am (1.226), tests/addgenerators11.cc
+	  (1.9), tests/exceptions2.cc (1.34): Test addgenerators11 is no
+	  longer in the XFAIL list.  Modified test2() in exceptions2.cc so
+	  as to no longer guard against an unwanted exception.	While at
+	  it, reordered the tests in Makefile.am so as to follow the
+	  alphabetical order.  The corrected bug announced in the NEWS
+	  file.
+
+2004-10-26 Tuesday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.99), GenSys.defs.hh (1.104): Private mathod
+	  bool GenSys::has_closure_points() const; now behaves assuming the
+	  point of view of the user, i.e., disregarding those closure
+	  points that are matched by corresponding points.  Fixed a bug in
+	  private method   void
+	  GenSys::adjust_topology_and_space_dimension(...); whereby an
+	  unwanted exception was thrown when converting an NNC generator
+	  system into a C generator system. This correction also makes test
+	  addgenerators11 behave correctly (i.e., no longer XFAILS).
+
+2004-10-25 Monday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected3_mpz (1.1): New and revised
+	  expectations.
+
+2004-10-25 Monday 17:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.33): Pathname fixed.
+
+2004-10-25 Monday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.119), TODO (1.108), src/C_Polyhedron.defs.hh (1.26),
+	  src/ConSys.defs.hh (1.90), src/GenSys.defs.hh (1.103),
+	  src/NNC_Polyhedron.defs.hh (1.28), tests/bhrz03widening9.cc
+	  (1.7): Avoid implicit constructors (except in very special
+	  cases).
+
+2004-10-25 Monday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.107): Added another item related to non-explicit
+	  constructors.
+
+2004-10-25 Monday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int16 (1.1),
+	  interfaces/Prolog/XSB/expected2_int16 (1.2),
+	  interfaces/Prolog/XSB/expected3_int16 (1.1),
+	  interfaces/Prolog/tests/expected2_int16 (1.2): New and revised
+	  expectations.
+
+2004-10-25 Monday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int8 (1.1),
+	  interfaces/Prolog/XSB/expected3_int8 (1.1),
+	  interfaces/Prolog/tests/expected3_int8 (1.2): New and revised
+	  expectations.
+
+2004-10-25 Monday 10:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected_int64 (1.1),
+	  interfaces/Prolog/XSB/expected2_int32 (1.2),
+	  interfaces/Prolog/XSB/expected3_int32 (1.1),
+	  interfaces/Prolog/XSB/expected3_int64 (1.1),
+	  interfaces/Prolog/tests/expected2_int32 (1.2),
+	  interfaces/Prolog/tests/expected3_int64 (1.2): New and revised
+	  expectations.
+
+2004-10-25 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.129), interfaces/Prolog/Makefile.am (1.26),
+	  interfaces/Prolog/ack.clpq (1.2), interfaces/Prolog/ackn.clpq
+	  (1.2), interfaces/Prolog/check_script (1.4),
+	  interfaces/Prolog/check_script2 (1.3), interfaces/Prolog/clpq.pl
+	  (1.18), interfaces/Prolog/clpq2.pl (1.29),
+	  interfaces/Prolog/expected2_int16 (1.2),
+	  interfaces/Prolog/expected2_int32 (1.2),
+	  interfaces/Prolog/expected2_int64 (1.2),
+	  interfaces/Prolog/expected2_int8 (1.2),
+	  interfaces/Prolog/expected2_mpz (1.2),
+	  interfaces/Prolog/expected3_int16 (1.2),
+	  interfaces/Prolog/expected3_int32 (1.2),
+	  interfaces/Prolog/expected3_int64 (1.2),
+	  interfaces/Prolog/expected3_int8 (1.3),
+	  interfaces/Prolog/expected3_mpz (1.2),
+	  interfaces/Prolog/expected_int16 (1.2),
+	  interfaces/Prolog/expected_int32 (1.2),
+	  interfaces/Prolog/expected_int64 (1.2),
+	  interfaces/Prolog/expected_int8 (1.2),
+	  interfaces/Prolog/expected_mpz (1.2), interfaces/Prolog/fib.clpq
+	  (1.2), interfaces/Prolog/mc91.clpq (1.2),
+	  interfaces/Prolog/pl_check.pl (1.103),
+	  interfaces/Prolog/schedule.clpq (1.4), interfaces/Prolog/smm.clpq
+	  (1.2), interfaces/Prolog/smmdiff.clpq (1.2),
+	  interfaces/Prolog/sumto.clpq (1.2), interfaces/Prolog/tak.clpq
+	  (1.2), interfaces/Prolog/Ciao/Makefile.am (1.32),
+	  interfaces/Prolog/GNU/Makefile.am (1.38),
+	  interfaces/Prolog/SICStus/Makefile.am (1.45),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.10),
+	  interfaces/Prolog/SWI/Makefile.am (1.38),
+	  interfaces/Prolog/XSB/Makefile.am (1.25),
+	  interfaces/Prolog/XSB/expected2_int16_a (1.1),
+	  interfaces/Prolog/XSB/expected2_int32_a (1.1),
+	  interfaces/Prolog/XSB/expected2_int64_a (1.1),
+	  interfaces/Prolog/XSB/expected2_int8_a (1.1),
+	  interfaces/Prolog/XSB/expected2_mpz_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int16_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int32_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int64_a (1.1),
+	  interfaces/Prolog/XSB/expected3_int8_a (1.1),
+	  interfaces/Prolog/XSB/expected3_mpz_a (1.1),
+	  interfaces/Prolog/XSB/expected_int16_a (1.1),
+	  interfaces/Prolog/XSB/expected_int32_a (1.1),
+	  interfaces/Prolog/XSB/expected_int64_a (1.1),
+	  interfaces/Prolog/XSB/expected_int8_a (1.1),
+	  interfaces/Prolog/XSB/expected_mpz_a (1.1),
+	  interfaces/Prolog/YAP/Makefile.am (1.29),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.8),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.4),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.6),
+	  interfaces/Prolog/tests/.cvsignore (1.1),
+	  interfaces/Prolog/tests/Makefile.am (1.1),
+	  interfaces/Prolog/tests/ack.clpq (1.1),
+	  interfaces/Prolog/tests/ackn.clpq (1.1),
+	  interfaces/Prolog/tests/check_script (1.1),
+	  interfaces/Prolog/tests/check_script2 (1.1),
+	  interfaces/Prolog/tests/clpq.pl (1.1),
+	  interfaces/Prolog/tests/clpq2.pl (1.1),
+	  interfaces/Prolog/tests/expected2_int16 (1.1),
+	  interfaces/Prolog/tests/expected2_int16_a (1.1),
+	  interfaces/Prolog/tests/expected2_int32 (1.1),
+	  interfaces/Prolog/tests/expected2_int32_a (1.1),
+	  interfaces/Prolog/tests/expected2_int64 (1.1),
+	  interfaces/Prolog/tests/expected2_int64_a (1.1),
+	  interfaces/Prolog/tests/expected2_int8 (1.1),
+	  interfaces/Prolog/tests/expected2_int8_a (1.1),
+	  interfaces/Prolog/tests/expected2_mpz (1.1),
+	  interfaces/Prolog/tests/expected2_mpz_a (1.1),
+	  interfaces/Prolog/tests/expected3_int16 (1.1),
+	  interfaces/Prolog/tests/expected3_int16_a (1.1),
+	  interfaces/Prolog/tests/expected3_int32 (1.1),
+	  interfaces/Prolog/tests/expected3_int32_a (1.1),
+	  interfaces/Prolog/tests/expected3_int64 (1.1),
+	  interfaces/Prolog/tests/expected3_int64_a (1.1),
+	  interfaces/Prolog/tests/expected3_int8 (1.1),
+	  interfaces/Prolog/tests/expected3_int8_a (1.1),
+	  interfaces/Prolog/tests/expected3_mpz (1.1),
+	  interfaces/Prolog/tests/expected3_mpz_a (1.1),
+	  interfaces/Prolog/tests/expected_int16 (1.1),
+	  interfaces/Prolog/tests/expected_int16_a (1.1),
+	  interfaces/Prolog/tests/expected_int32 (1.1),
+	  interfaces/Prolog/tests/expected_int32_a (1.1),
+	  interfaces/Prolog/tests/expected_int64 (1.1),
+	  interfaces/Prolog/tests/expected_int64_a (1.1),
+	  interfaces/Prolog/tests/expected_int8 (1.1),
+	  interfaces/Prolog/tests/expected_int8_a (1.1),
+	  interfaces/Prolog/tests/expected_mpz (1.1),
+	  interfaces/Prolog/tests/expected_mpz_a (1.1),
+	  interfaces/Prolog/tests/fib.clpq (1.1),
+	  interfaces/Prolog/tests/mc91.clpq (1.1),
+	  interfaces/Prolog/tests/pl_check.pl (1.1),
+	  interfaces/Prolog/tests/schedule.clpq (1.1),
+	  interfaces/Prolog/tests/smm.clpq (1.1),
+	  interfaces/Prolog/tests/smmdiff.clpq (1.1),
+	  interfaces/Prolog/tests/sumto.clpq (1.1),
+	  interfaces/Prolog/tests/tak.clpq (1.1): Prolog tests reorganized.
+
+2004-10-24 Sunday 22:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.128), demos/ppl_lcdd/Makefile.am (1.10),
+	  demos/ppl_lcdd/expected (1.4), demos/ppl_lcdd/expected_a (1.2),
+	  demos/ppl_lcdd/expected_int16_a (1.1),
+	  demos/ppl_lcdd/expected_int32 (1.1),
+	  demos/ppl_lcdd/expected_int32_a (1.1),
+	  demos/ppl_lcdd/expected_int64_a (1.1),
+	  demos/ppl_lcdd/expected_int8_a (1.1), demos/ppl_lcdd/expected_mpz
+	  (1.1), demos/ppl_lcdd/expected_mpz_a (1.1),
+	  interfaces/Prolog/Makefile.am (1.25), interfaces/Prolog/expected
+	  (1.8), interfaces/Prolog/expected2 (1.13),
+	  interfaces/Prolog/expected2_int16 (1.1),
+	  interfaces/Prolog/expected2_int32 (1.1),
+	  interfaces/Prolog/expected2_int64 (1.1),
+	  interfaces/Prolog/expected2_mpz (1.1),
+	  interfaces/Prolog/expected3 (1.2),
+	  interfaces/Prolog/expected3_int16 (1.1),
+	  interfaces/Prolog/expected3_int32 (1.1),
+	  interfaces/Prolog/expected3_int64 (1.1),
+	  interfaces/Prolog/expected3_mpz (1.1),
+	  interfaces/Prolog/expected_int16 (1.1),
+	  interfaces/Prolog/expected_int32 (1.1),
+	  interfaces/Prolog/expected_int64 (1.1),
+	  interfaces/Prolog/expected_mpz (1.1),
+	  interfaces/Prolog/Ciao/Makefile.am (1.31),
+	  interfaces/Prolog/GNU/Makefile.am (1.37),
+	  interfaces/Prolog/SICStus/Makefile.am (1.44),
+	  interfaces/Prolog/SWI/Makefile.am (1.37),
+	  interfaces/Prolog/XSB/Makefile.am (1.24),
+	  interfaces/Prolog/XSB/expected (1.9),
+	  interfaces/Prolog/XSB/expected2 (1.11),
+	  interfaces/Prolog/XSB/expected2_int16 (1.1),
+	  interfaces/Prolog/XSB/expected2_int32 (1.1),
+	  interfaces/Prolog/XSB/expected2_int64 (1.1),
+	  interfaces/Prolog/XSB/expected2_mpz (1.1),
+	  interfaces/Prolog/XSB/expected_int16 (1.1),
+	  interfaces/Prolog/XSB/expected_int32 (1.1),
+	  interfaces/Prolog/XSB/expected_int64 (1.1),
+	  interfaces/Prolog/XSB/expected_mpz (1.1),
+	  interfaces/Prolog/YAP/Makefile.am (1.28): Another step toward the
+	  generalization of the regression testing mechanisms.
+
+2004-10-24 Sunday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.33): Print more about which kind of
+	  arithmetic overflow occurred.
+
+2004-10-24 Sunday 16:38  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (1.3): Generate overflow exception
+	  instead of inappropriate domain one.
+
+2004-10-24 Sunday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected3_int8 (1.2), SWI/Makefile.am (1.36),
+	  XSB/Makefile.am (1.23), XSB/expected2_int8 (1.1),
+	  XSB/expected_int8 (1.1): More infrastructure to conditionalize
+	  our expectations about the tests outcome on the kind of
+	  coefficients we use.
+
+2004-10-24 Sunday 12:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.102): Catch all exceptions.
+
+2004-10-24 Sunday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.66):
+	  Integer_to_integer_term() fixed.
+
+2004-10-24 Sunday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.101): Variable name clash
+	  removed: this was causing XSB to crash (due to one of its many
+	  bugs).
+
+2004-10-24 Sunday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.127), interfaces/Prolog/expected2_int8 (1.1),
+	  interfaces/Prolog/expected3_int8 (1.1),
+	  interfaces/Prolog/expected_int8 (1.1),
+	  interfaces/Prolog/Ciao/Makefile.am (1.30),
+	  interfaces/Prolog/GNU/Makefile.am (1.36),
+	  interfaces/Prolog/SICStus/Makefile.am (1.43),
+	  interfaces/Prolog/YAP/Makefile.am (1.27): Started adding some
+	  infrastructure so as to conditionalize our expectations about the
+	  tests outcome on the kind of coefficients used.
+
+2004-10-24 Sunday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.225), geomcovers1.cc (1.1): New test for
+	  Polyhedra_Powerset<PH>::geometrically_covers().
+
+2004-10-24 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.106): Added a new item.
+
+2004-10-23 Saturday 23:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.28): Fail gracefully in those cases
+	  where an overflow exception or other PPL exception is thrown.
+
+2004-10-23 Saturday 23:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq.pl (1.17): Fail gracefully in those cases
+	  where an overflow exception or other PPL exception is thrown.
+
+2004-10-23 Saturday 23:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.139): Handle
+	  std::overflow_error.
+
+2004-10-21 Thursday 20:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.23): Be quiet.
+
+2004-10-21 Thursday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.224): The definition of XFAIL_TESTS now
+	  takes into account the type of coefficients being used.
+
+2004-10-21 Thursday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.126): Introduced new Automake variables that
+	  allow to keep track of the type of coefficients being used.
+
+2004-10-21 Thursday 13:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/randphull1.cc (1.11): Fixed to allow for generic
+	  coefficients.
+
+2004-10-21 Thursday 11:59  Abramo Bagnara
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.26): Generalized string
+	  conversion.
+
+2004-10-20 Wednesday 20:00  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (1.3): Use signed explicitly.
+
+2004-10-20 Wednesday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/: Makefile.am (1.9), expected_a (1.1): Exclude
+	  examples that are too heavy when assertions are enabled.
+
+2004-10-20 Wednesday 18:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.125): Introduced new Automake conditional
+	  ASSERTIONS_ENABLED.
+
+2004-10-20 Wednesday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.105): We now allow the specification of alternative
+	  coefficient implementations.
+
+2004-10-20 Wednesday 15:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.104): The bug concerning empty generator systems has been
+	  fixed.
+
+2004-10-20 Wednesday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.223): Added nnc_randphull1 and
+	  nnc_randphull2 to DERIVED_TESTS.
+
+2004-10-19 Tuesday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.14), configure.ac (1.124), demos/Makefile.am (1.4),
+	  demos/ppl_lcdd/ppl_lcdd.cc (1.32),
+	  doc/devref-browse.doxyconf-latex.in (1.46),
+	  doc/devref-print.doxyconf-latex.in (1.46),
+	  doc/devref.doxyconf-html.in (1.46), interfaces/C/ppl_c.cc
+	  (1.113), interfaces/Prolog/ppl_prolog.icc (1.138),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.25),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.21),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.65),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.90),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.57),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.83), src/BoundingBox.defs.hh
+	  (1.14), src/BoundingBox.inlines.hh (1.13),
+	  src/Checked_Number.defs.hh (1.2), src/Checked_Number.inlines.hh
+	  (1.2), src/Checked_Number.types.hh (1.2), src/ConSys.cc (1.73),
+	  src/ConSys.defs.hh (1.89), src/Constraint.defs.hh (1.91),
+	  src/Constraint.inlines.hh (1.51), src/GMP_Integer.defs.hh (1.2),
+	  src/GMP_Integer.inlines.hh (1.2), src/GMP_Integer.types.hh (1.2),
+	  src/GenSys.cc (1.98), src/GenSys.defs.hh (1.102),
+	  src/Generator.cc (1.53), src/Generator.defs.hh (1.91),
+	  src/Generator.inlines.hh (1.45), src/Integer.defs.hh (1.14),
+	  src/Integer.inlines.hh (1.13), src/Integer.types.hh (1.9),
+	  src/Integer_macros.hh (1.2), src/Integer_traits_template.hh
+	  (1.2), src/Interval.defs.hh (1.17), src/Interval.inlines.hh
+	  (1.13), src/Limits.hh (1.2), src/LinExpression.cc (1.22),
+	  src/LinExpression.defs.hh (1.66), src/LinExpression.inlines.hh
+	  (1.31), src/Linear_Row.defs.hh (1.2), src/Linear_Row.inlines.hh
+	  (1.2), src/Makefile.am (1.82), src/Native_Integer.defs.hh (1.2),
+	  src/Native_Integer.inlines.hh (1.2), src/Native_Integer.types.hh
+	  (1.2), src/Polyhedron.defs.hh (1.250), src/Polyhedron.inlines.hh
+	  (1.98), src/Polyhedron_nonpublic.cc (1.31),
+	  src/Polyhedron_public.cc (1.35), src/Polyhedron_widenings.cc
+	  (1.32), src/Row.defs.hh (1.84), src/Row.inlines.hh (1.49),
+	  src/checked.defs.hh (1.2), src/checked.inlines.hh (1.2),
+	  src/checked_float.inlines.hh (1.2), src/checked_int.inlines.hh
+	  (1.2), src/checked_mpq.inlines.hh (1.2),
+	  src/checked_mpz.inlines.hh (1.2), src/conversion.cc (1.63),
+	  src/float.types.hh (1.2), src/globals.defs.hh (1.5),
+	  tests/BBox.cc (1.5), tests/BBox.hh (1.4), tests/Makefile.am
+	  (1.222), tests/dualhypercubes.cc (1.5): First merge from the
+	  `altnum' branch.
+
+2004-10-19 Tuesday 22:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.100), Ciao/ppl_ciao.pl (1.71):
+	  Correction to ciao interface so it now allows for prolog failure
+	  for ppl_Polyhedron_map_space_dimensions/2 and
+	  ppl_Polyhedron_fold_dimensions/3.
+
+	  Negative tests for ppl_Polyhedron_map_space_dimensions/2 that
+	  caused make check when using pl_check.pl to fail have now been
+	  restored.  Now these tests pass with all the Prolog systems.
+
+2004-10-19 Tuesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.31),
+	  doc/devref-browse.doxyconf-latex.in (1.45),
+	  doc/devref-print.doxyconf-latex.in (1.45),
+	  doc/devref.doxyconf-html.in (1.45), src/ConSys.cc (1.72),
+	  src/ConSys.defs.hh (1.88), src/ConSys.inlines.hh (1.34),
+	  src/Constraint.cc (1.42), src/Constraint.defs.hh (1.90),
+	  src/Constraint.inlines.hh (1.50), src/GenSys.cc (1.97),
+	  src/GenSys.defs.hh (1.101), src/GenSys.inlines.hh (1.34),
+	  src/Generator.cc (1.52), src/Generator.defs.hh (1.90),
+	  src/Generator.inlines.hh (1.44), src/LinExpression.cc (1.21),
+	  src/LinExpression.defs.hh (1.65), src/LinExpression.inlines.hh
+	  (1.30), src/Linear_Row.cc (1.1), src/Linear_Row.defs.hh (1.1),
+	  src/Linear_Row.inlines.hh (1.1), src/Linear_Row.types.hh (1.1),
+	  src/Linear_System.cc (1.1), src/Linear_System.defs.hh (1.1),
+	  src/Linear_System.inlines.hh (1.1), src/Linear_System.types.hh
+	  (1.1), src/Makefile.am (1.81), src/Matrix.cc (1.77),
+	  src/Matrix.defs.hh (1.60), src/Matrix.inlines.hh (1.39),
+	  src/Ph_Status.cc (1.5), src/Polyhedron.defs.hh (1.249),
+	  src/Polyhedron_chdims.cc (1.19), src/Polyhedron_nonpublic.cc
+	  (1.30), src/Polyhedron_public.cc (1.34), src/Row.cc (1.69),
+	  src/Row.defs.hh (1.83), src/Row.inlines.hh (1.48),
+	  src/conversion.cc (1.62), src/globals.defs.hh (1.4),
+	  src/globals.inlines.hh (1.2), src/minimize.cc (1.38),
+	  src/simplify.cc (1.39): The class Matrix now represents a simple
+	  matrix of coefficients that is organized in rows, represented by
+	  the class Row.  Matrix and Row take care of all the memory
+	  allocation details and little more.  They are specialized by
+	  classes Linear_Row and Linear_System that, in turn constitute the
+	  basis upon which constraints, generators and systems thereof are
+	  built upon.  Several methods that were no longer needed have been
+	  removed.  Several methods have been given more sensible names and
+	  interfaces.
+
+2004-10-19 Tuesday 16:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.99): Tests causing "make check"
+	  to fail in Ciao and GNU Prolog temporarily disabled.	Now "make
+	  check" in all the prolog interfaces succeeds.
+
+2004-10-19 Tuesday 11:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.98): More tests added so as to
+	  test the Prolog interface more exhaustively.
+
+	  However, because of the more thorough testing, bugs in the Ciao
+	  Prolog and GNU Prolog interfaces have been exposed; as a result
+	  the  "make check" for Ciao Prolog and GNU Prolog now fails.
+
+2004-10-17 Sunday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.112): Fixed a couple of indentation
+	  glitches.
+
+2004-10-17 Sunday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.19), NNC_Polyhedron.inlines.hh
+	  (1.22): Simplified all constructors that need to check for
+	  dimension overflows removing, at the same time, the previous
+	  requirement imposed on the BoundingBox template concerning the
+	  availability of a default constructor.
+
+2004-10-16 Saturday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.118): Explain why functions in the C interface that
+	  compute (space) dimensions no longer return their result.
+
+2004-10-16 Saturday 23:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.117): Mention the bug fixed in
+	  ppl_new_LinExpression_with_dimension().
+
+2004-10-16 Saturday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.111): Fixed a bug in
+	  ppl_new_LinExpression_with_dimension() reported by Pedro
+	  Vasconcelos.
+
+2004-10-15 Friday 08:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.25), C_Polyhedron.inlines.hh
+	  (1.18), NNC_Polyhedron.defs.hh (1.27), NNC_Polyhedron.inlines.hh
+	  (1.21), Polyhedron.defs.hh (1.248), Polyhedron.inlines.hh (1.97),
+	  Polyhedron_chdims.cc (1.18), Polyhedron_nonpublic.cc (1.29),
+	  max_space_dimension.hh (1.4): Removed
+	  C_Polyhedron::max_space_dimension() and
+	  NNC_Polyehdron::max_space_dimension(): the method
+	  Polyhedron::max_space_dimension() no longer uses them and it is
+	  not hided by them. Changed all places where we check for
+	  dimensions overflows accordingly.  Exception throwers made
+	  protected to allow calling them from subclasses.  The BoundingBox
+	  template is now required to have a default constructor.
+
+2004-10-13 Wednesday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/addspacedims10.cc (1.2): Comment corrected.
+
+2004-10-13 Wednesday 12:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.116), TODO (1.103): Corrected the bug shown by
+	  generators2.cc.
+
+2004-10-13 Wednesday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.17), tests/addgenerator1.cc (1.7),
+	  tests/addgenerator2.cc (1.7), tests/memory1.cc (1.22): Small
+	  adjustments in comments.
+
+2004-10-13 Wednesday 11:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.33): Method generators() now
+	  correctly sets the space dimension of the generator system
+	  representing an empty polyhedron (thereby correcting the bug
+	  shown by test generators2.cc).
+
+2004-10-13 Wednesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.28): Constructors now correctly
+	  deal with empty systems of constraints/generators having a
+	  positive space dimension.
+
+2004-10-13 Wednesday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.71), GenSys.cc (1.96): Now methods
+	  adjust_topology_and_space_dimension() allow for empty systems
+	  having a positive space dimension.
+
+2004-10-13 Wednesday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.76), Matrix.inlines.hh (1.38): No longer
+	  enforcing the Matrix invariant   num_rows() == 0   ==>
+	  num_columns() == 0.
+
+2004-10-13 Wednesday 09:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.102): Documentation of affine dimension is now in the
+	  user manual.
+
+2004-10-11 Monday 11:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.221), addgenerator5.cc (1.1),
+	  generators2.cc (1.10): Tests generators2 and addgenerator5 show a
+	  bug in the handling of space dimensions for a generator system
+	  corresponding to an empty polyhedron.
+
+2004-10-07 Thursday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.220), affineimage9.cc (1.1): New test for
+	  Polyhedron::affine_image().
+
+2004-10-07 Thursday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polyhull11.cc (1.2): Small correction.
+
+2004-10-07 Thursday 12:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.219), polyhull11.cc (1.1): New test for
+	  Polyhedron::poly_hull_assign_and_minimize().
+
+2004-10-07 Thursday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polyhull10.cc (1.5): Completed.
+
+2004-10-03 Sunday 15:33  Abramo Bagnara
+
+	* src/: Makefile.am, checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[11,18,11,12,18,17]): Transformed
+	  implicit default implementation in esplicit specializations using
+	  generic implementation.
+
+2004-10-03 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh (altnum.17): Comment improved.
+
+2004-10-03 Sunday 00:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.24): Started implementing
+	  bidirectional communication of bignums.
+
+2004-10-02 Saturday 19:23  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.17): Fixed 64 bit
+	  architecture.
+
+2004-10-02 Saturday 19:18  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.16): Better architecture
+	  support for Larger.
+
+2004-10-02 Saturday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked.defs.hh (altnum.16): Comments improved.
+
+2004-10-02 Saturday 18:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (altnum.[3,3,3]): Add the new implementation files to the lists
+	  Doxygen uses to produce the developer's reference manual.
+
+2004-10-02 Saturday 18:03  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.15): Better name for Larger
+	  struct.
+
+2004-10-02 Saturday 17:59  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.16): Use GMP specific type for
+	  MP size.
+
+2004-10-02 Saturday 17:56  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.15): Use distinct policies for ext
+	  functions.
+
+2004-10-02 Saturday 17:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.27): Implemented another exception
+	  thrower.
+
+2004-10-02 Saturday 17:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.inlines.hh (1.20): Previous commit undone, as
+	  it was breaking the build.
+
+2004-10-02 Saturday 16:22  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.10): Use distinct policies for ext
+	  functions.
+
+2004-10-02 Saturday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Limits.hh, checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[2,14,9,11,14,14,15]): Started enforcing some of our
+	  coding conventions.
+
+2004-10-02 Saturday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/float.types.hh (altnum.3): Initial comment fixed.
+
+2004-10-02 Saturday 13:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc, XSB/ppl_xsb.cc,
+	  YAP/ppl_yap.cc (altnum.[2,3,3]): Use checked numbers to detect
+	  overflows.
+
+2004-10-02 Saturday 13:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/NNC_Polyhedron.inlines.hh (1.19): Using the exception thrower
+	  instead of directly throwing the exception.
+
+2004-10-02 Saturday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.247), Polyhedron_chdims.cc (1.16):
+	  Modified all the methods augmenting the space dimension of a
+	  polyhedron so as to throw std::length_error if the new vector
+	  space exceeds the maximum allowed space dimension.
+
+2004-10-02 Saturday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.115): Announced the new behavior of the
+	  H79_widening_assign() operator.  Formally, it is a bugfix since
+	  we were already promising the new behavior in the user manual.
+
+2004-10-02 Saturday 12:11  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.13): Removed unused code.
+
+2004-10-02 Saturday 10:42  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[13,12,13,14]): Use a typedef for pointer to C strings.
+
+2004-10-02 Saturday 08:42  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  checked_int.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[12,12,11,12,13]): Added
+	  constructors from char *.
+
+2004-10-02 Saturday 08:41  Abramo Bagnara
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (altnum.3): Attempt
+	  to fix compilation.
+
+2004-10-01 Friday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, TODO, compile, config.guess, config.sub, configure.ac,
+	  install-sh, ltmain.sh, missing, Watchdog/compile,
+	  Watchdog/config.guess, Watchdog/config.sub, Watchdog/install-sh,
+	  Watchdog/ltmain.sh, Watchdog/missing, demos/ppl_lcdd/Makefile.am,
+	  demos/ppl_lcdd/expected, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/Makefile.am,
+	  demos/ppl_lcdd/examples/README,
+	  demos/ppl_lcdd/examples/dcube10.ext,
+	  demos/ppl_lcdd/examples/dcube12.ext,
+	  demos/ppl_lcdd/examples/dcube3.ext,
+	  demos/ppl_lcdd/examples/dcube6.ext,
+	  demos/ppl_lcdd/examples/dcube8.ext, doc/README,
+	  doc/definitions.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+	  interfaces/Prolog/expected, interfaces/Prolog/expected2,
+	  interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ciao_clpq.pl,
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/expected, interfaces/Prolog/XSB/expected2,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/AskTell.inlines.hh, src/BHRZ03_Certificate.cc,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh, src/BoundingBox.defs.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh, src/ConSys.cc,
+	  src/ConSys.defs.hh, src/Constraint.defs.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/GenSys.cc, src/GenSys.defs.hh, src/Generator.defs.hh,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh,
+	  src/H79_Certificate.inlines.hh, src/LinExpression.defs.hh,
+	  src/Matrix.defs.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_chdims.cc,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/Variable.defs.hh,
+	  src/conversion.cc, src/globals.defs.hh, src/minimize.cc,
+	  src/simplify.cc, tests/CbecomesNNC1.cc, tests/Makefile.am,
+	  tests/NNCbecomesC1.cc, tests/README, tests/adddimensions1.cc,
+	  tests/adddimensions10.cc, tests/adddimensions11.cc,
+	  tests/adddimensions12.cc, tests/adddimensions13.cc,
+	  tests/adddimensions2.cc, tests/adddimensions3.cc,
+	  tests/adddimensions4.cc, tests/adddimensions5.cc,
+	  tests/adddimensions6.cc, tests/adddimensions7.cc,
+	  tests/adddimensions8.cc, tests/adddimensions9.cc,
+	  tests/addgenerators11.cc, tests/addspacedims1.cc,
+	  tests/addspacedims10.cc, tests/addspacedims11.cc,
+	  tests/addspacedims12.cc, tests/addspacedims13.cc,
+	  tests/addspacedims2.cc, tests/addspacedims3.cc,
+	  tests/addspacedims4.cc, tests/addspacedims5.cc,
+	  tests/addspacedims6.cc, tests/addspacedims7.cc,
+	  tests/addspacedims8.cc, tests/addspacedims9.cc, tests/append1.cc,
+	  tests/append2.cc, tests/boundingbox1.cc, tests/boundingbox2.cc,
+	  tests/concatenate1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/expanddim1.cc, tests/expanddim2.cc,
+	  tests/expandspacedim1.cc, tests/expandspacedim2.cc,
+	  tests/folddims1.cc, tests/folddims2.cc, tests/foldspacedims1.cc,
+	  tests/foldspacedims2.cc, tests/generators1.cc,
+	  tests/generators4.cc, tests/limitedh79extrapolation3.cc,
+	  tests/mapdim1.cc, tests/mapdim2.cc, tests/mapdim3.cc,
+	  tests/mapspacedims1.cc, tests/mapspacedims2.cc,
+	  tests/mapspacedims3.cc, tests/permute.cc,
+	  tests/polydifference1.cc, tests/polydifference9.cc,
+	  tests/removedim1.cc, tests/removedim10.cc, tests/removedim2.cc,
+	  tests/removedim3.cc, tests/removedim4.cc, tests/removedim5.cc,
+	  tests/removedim6.cc, tests/removedim7.cc, tests/removedim8.cc,
+	  tests/removedim9.cc, tests/removespacedims1.cc,
+	  tests/removespacedims10.cc, tests/removespacedims2.cc,
+	  tests/removespacedims3.cc, tests/removespacedims4.cc,
+	  tests/removespacedims5.cc, tests/removespacedims6.cc,
+	  tests/removespacedims7.cc, tests/removespacedims8.cc,
+	  tests/removespacedims9.cc
+	  (altnum.[3,3,1,2,2,8,2,2,1,1,2,2,2,2,1,3,2,6,2,2,1,1,1,1,1,1,3,4,2,3,1,1,1,1,2,4,1,1,2,2,2,2,5,1,1,2,2,1,1,2,2,3,1,2,3,2,3,2,2,3,4,4,3,2,4,4,4,3,3,2,2,2,2,2,4,4,2,6,4,4,2,4,2,2,2,1,4,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,2,1,1,1,2,2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Third merge from main trunk.
+
+2004-09-30 Thursday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.101): Added another thing not to be forgotten.
+
+2004-09-30 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.100): Added another item not to be forgotten.
+
+2004-09-30 Thursday 17:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.218), addgenerators11.cc (1.8): Restored
+	  previous version of test as that change wrongly destroyed the
+	  intention of the test.  Added this test to the XFAIL_TESTS list
+	  in Makefile.am.
+
+2004-09-30 Thursday 13:30  Abramo Bagnara
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (altnum.2): Added needed
+	  #include's.
+
+2004-09-30 Thursday 13:23  Abramo Bagnara
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (altnum.4): Include only
+	  the needed file.
+
+2004-09-30 Thursday 09:09  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[11,11]): Removed test #define.
+
+2004-09-30 Thursday 09:07  Abramo Bagnara
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (altnum.1): Fixes for
+	  generalized Integers.
+
+2004-09-29 Wednesday 21:46  Abramo Bagnara
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (altnum.1): Fixed compilation.
+
+2004-09-29 Wednesday 14:00  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, src/Checked_Number.defs.hh,
+	  src/checked.defs.hh (altnum.[5,10,12]): Fixed compilation for GMP
+	  Integers.
+
+2004-09-29 Wednesday 09:52  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc, interfaces/C/ppl_c.cc,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  src/Checked_Number.defs.hh, src/Checked_Number.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/Interval.inlines.hh, src/Native_Integer.defs.hh,
+	  src/Native_Integer.inlines.hh, src/Polyhedron_nonpublic.cc,
+	  src/checked.defs.hh, src/checked.inlines.hh,
+	  src/checked_int.inlines.hh
+	  (altnum.[4,3,3,3,9,10,5,5,5,5,5,5,11,8,10]): Fixed compilation
+	  for different types of Integers.
+
+2004-09-29 Wednesday 08:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.97): More tests added and
+	  improved structure for the tests for
+	  ppl_Polyhedron_topological_closure_assign/1.
+
+2004-09-28 Tuesday 17:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.114), TODO (1.99), doc/definitions.dox (1.159): Announced
+	  the renaming of methods changing space dimensions.  Added to the
+	  user manual the notion of affine independence, which is used to
+	  define the affine dimension of a polyhedron.	Small reordering to
+	  the devref part of definitions.dox.
+
+2004-09-28 Tuesday 17:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.31), tests/Makefile.am (1.217),
+	  tests/limitedh79extrapolation3.cc (1.4): The implementation of
+	  select_H79_constraints() changed so as to ignore trivially true
+	  constraints coming from homogenization or epsilon-polyhedra
+	  encoding. Thus, the H79 widening is now applied to the polyhedra
+	  and not their homogenized polyehdral cones. The known result of
+	  the test limitedh79extrapolation3 has been changed accordingly.
+
+2004-09-28 Tuesday 15:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.216), addgenerators11.cc (1.7),
+	  polydifference1.cc (1.8): Changes to tests so that
+	  addgenerators11, polydifference1 and nnc_polydifference1 tests
+	  succeed.  The tests addgenerators11 and nnc_polydifference1 are
+	  no longer named as failing tests by Makefile.
+
+2004-09-27 Monday 22:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.70): Added missing
+	  definition for ppl_Polyhedron_affine_dimension/2.
+
+2004-09-27 Monday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: xsb_clpq.P (1.9), xsb_clpq2.P (1.7),
+	  xsb_pl_check.P (1.11): The names of all the methods changing the
+	  space dimension of a polyhedron now contain "space_dimension" as
+	  a substring, therefore avoiding ambiguity with the concept of
+	  affine dimension.
+
+2004-09-27 Monday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.158), interfaces/C/ppl_c.cc (1.110),
+	  interfaces/C/ppl_c.h.in (1.35),
+	  interfaces/Prolog/Prolog_interface.dox (1.114),
+	  interfaces/Prolog/clpq.pl (1.16), interfaces/Prolog/clpq2.pl
+	  (1.27), interfaces/Prolog/pl_check.pl (1.96),
+	  interfaces/Prolog/ppl_prolog.icc (1.137),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.10),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.5),
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl (1.6),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.69),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.47),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.64),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.89),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.34),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.56),
+	  interfaces/Prolog/XSB/xsb_pl_check.P (1.10),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.82), src/AskTell.defs.hh
+	  (1.26), src/AskTell.inlines.hh (1.22), src/BHRZ03_Certificate.cc
+	  (1.3), src/BHRZ03_Certificate.defs.hh (1.7),
+	  src/BHRZ03_Certificate.inlines.hh (1.3), src/BoundingBox.defs.hh
+	  (1.13), src/ConSys.cc (1.70), src/ConSys.defs.hh (1.87),
+	  src/Constraint.defs.hh (1.89), src/Determinate.defs.hh (1.45),
+	  src/Determinate.inlines.hh (1.40), src/GenSys.cc (1.95),
+	  src/GenSys.defs.hh (1.100), src/Generator.defs.hh (1.89),
+	  src/H79_Certificate.cc (1.4), src/H79_Certificate.defs.hh (1.7),
+	  src/H79_Certificate.inlines.hh (1.3), src/LinExpression.defs.hh
+	  (1.64), src/Matrix.defs.hh (1.59), src/Polyhedra_Powerset.defs.hh
+	  (1.3), src/Polyhedra_Powerset.inlines.hh (1.5),
+	  src/Polyhedron.defs.hh (1.246), src/Polyhedron.inlines.hh (1.96),
+	  src/Polyhedron_chdims.cc (1.15), src/Polyhedron_nonpublic.cc
+	  (1.26), src/Polyhedron_public.cc (1.32), src/Variable.defs.hh
+	  (1.38), tests/Makefile.am (1.215), tests/adddimensions1.cc
+	  (1.15), tests/adddimensions10.cc (1.8), tests/adddimensions11.cc
+	  (1.7), tests/adddimensions12.cc (1.5), tests/adddimensions13.cc
+	  (1.4), tests/adddimensions2.cc (1.11), tests/adddimensions3.cc
+	  (1.13), tests/adddimensions4.cc (1.11), tests/adddimensions5.cc
+	  (1.9), tests/adddimensions6.cc (1.9), tests/adddimensions7.cc
+	  (1.9), tests/adddimensions8.cc (1.7), tests/adddimensions9.cc
+	  (1.8), tests/addspacedims1.cc (1.1), tests/addspacedims10.cc
+	  (1.1), tests/addspacedims11.cc (1.1), tests/addspacedims12.cc
+	  (1.1), tests/addspacedims13.cc (1.1), tests/addspacedims2.cc
+	  (1.1), tests/addspacedims3.cc (1.1), tests/addspacedims4.cc
+	  (1.1), tests/addspacedims5.cc (1.1), tests/addspacedims6.cc
+	  (1.1), tests/addspacedims7.cc (1.1), tests/addspacedims8.cc
+	  (1.1), tests/addspacedims9.cc (1.1), tests/append1.cc (1.23),
+	  tests/append2.cc (1.23), tests/concatenate1.cc (1.9),
+	  tests/exceptions1.cc (1.39), tests/expanddim1.cc (1.8),
+	  tests/expanddim2.cc (1.2), tests/expandspacedim1.cc (1.1),
+	  tests/expandspacedim2.cc (1.1), tests/folddims1.cc (1.3),
+	  tests/folddims2.cc (1.3), tests/foldspacedims1.cc (1.1),
+	  tests/foldspacedims2.cc (1.1), tests/mapdim1.cc (1.3),
+	  tests/mapdim2.cc (1.3), tests/mapdim3.cc (1.2),
+	  tests/mapspacedims1.cc (1.1), tests/mapspacedims2.cc (1.1),
+	  tests/mapspacedims3.cc (1.1), tests/permute.cc (1.32),
+	  tests/polydifference9.cc (1.4), tests/removedim1.cc (1.12),
+	  tests/removedim10.cc (1.4), tests/removedim2.cc (1.16),
+	  tests/removedim3.cc (1.12), tests/removedim4.cc (1.13),
+	  tests/removedim5.cc (1.11), tests/removedim6.cc (1.14),
+	  tests/removedim7.cc (1.10), tests/removedim8.cc (1.7),
+	  tests/removedim9.cc (1.7), tests/removespacedims1.cc (1.1),
+	  tests/removespacedims10.cc (1.1), tests/removespacedims2.cc
+	  (1.1), tests/removespacedims3.cc (1.1), tests/removespacedims4.cc
+	  (1.1), tests/removespacedims5.cc (1.1), tests/removespacedims6.cc
+	  (1.1), tests/removespacedims7.cc (1.1), tests/removespacedims8.cc
+	  (1.1), tests/removespacedims9.cc (1.1): The method
+	  Polyhedron::dimension() is now named
+	  Polyhedron::affine_dimension().  The names of all the methods
+	  changing the space dimension of a polyhedron now contain
+	  "space_dimension" as a substring, therefore avoiding ambiguity
+	  with the concept of affine dimension.  All the foreign interfaces
+	  changed accordingly.	Also tried to be consistent in the
+	  documentation.  All the tests related to methods changing space
+	  dimensions now follow a common naming scheme (***spacedim(s)*).
+
+2004-09-27 Monday 17:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.61): Improved the detailed documentation in
+	  a couple of places.  Using a reference to avoid multiple access
+	  to dest[num_lines_or_equalities].
+
+2004-09-27 Monday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc, SatRow.defs.hh, SatRow.inlines.hh
+	  (altnum.[8,2,1]): Updated from the main trunk.
+
+2004-09-26 Sunday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.28): SatRow::first() and SatRow::next() speeded
+	  up.
+
+2004-09-26 Sunday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.27): SatRow::last() and SatRow::prev() speeded
+	  up.
+
+2004-09-26 Sunday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.98): Added a set of possible renamings we may decide to
+	  perform before releasing PPL 0.7.
+
+2004-09-26 Sunday 15:44  Abramo Bagnara
+
+	* src/: checked_int.inlines.hh, checked_mpz.inlines.hh,
+	  checked_mpq.inlines.hh (altnum.[9,12,11]): Reorganizing
+	  specializations.
+
+2004-09-26 Sunday 15:44  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.10): Removed trailing
+	  semicolons.
+
+2004-09-26 Sunday 15:44  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.10): Removed trailing semicolon.
+
+2004-09-26 Sunday 15:43  Abramo Bagnara
+
+	* src/: Interval.inlines.hh, Polyhedron_nonpublic.cc
+	  (altnum.[4,4]): Call proper constructors.
+
+2004-09-26 Sunday 15:43  Abramo Bagnara
+
+	* src/Checked_Number.types.hh (altnum.3): Renamed default policy.
+
+2004-09-26 Sunday 15:42  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[8,9]): Make Checked_Number optionally implicitly
+	  convertible to base type.
+
+2004-09-26 Sunday 15:41  Abramo Bagnara
+
+	* interfaces/Prolog/: ppl_prolog.icc, SWI/ppl_swiprolog.cc
+	  (altnum.[2,2]): Preliminary step on generalization path.
+
+2004-09-26 Sunday 15:40  Abramo Bagnara
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (altnum.3): Call proper constructor.
+
+2004-09-26 Sunday 14:44  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.7): Fixed thinko. Added assertion for bogus
+	  call to last.
+
+2004-09-26 Sunday 13:47  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.6): Trivial bug fixes.
+
+2004-09-26 Sunday 11:24  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.5): Further optimizations.
+
+2004-09-26 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.113), interfaces/C/ppl_c.cc (1.109),
+	  interfaces/Prolog/ppl_prolog.icc (1.136), src/Polyhedron.defs.hh
+	  (1.245), src/Polyhedron.inlines.hh (1.95),
+	  src/Polyhedron_widenings.cc (1.30), src/globals.defs.hh (1.3),
+	  tests/boundingbox1.cc (1.37), tests/boundingbox2.cc (1.22): The
+	  enumeration values of enum Complexity_Class have been renamed
+	  POLYNOMIAL_COMPLEXITY, SIMPLEX_COMPLEXITY and ANY_COMPLEXITY.
+
+2004-09-26 Sunday 09:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.26), SatRow.inlines.hh (1.29): Use ffs(3) when
+	  possible.
+
+2004-09-26 Sunday 09:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.123): Added a check to determine sizeof(int).
+
+2004-09-26 Sunday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.25): Function strict_subset() speeded up
+	  further.
+
+2004-09-26 Sunday 00:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.122): Check whether the ffs(3) function is
+	  available.
+
+2004-09-25 Saturday 23:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.defs.hh (1.34): Fix two completely bogus comments.
+
+2004-09-25 Saturday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.24): Function strict_subset() speeded up.
+
+2004-09-25 Saturday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.23): Function subset_or_equal() speeded up.
+
+2004-09-25 Saturday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (altnum.4): Avoid a useless asymmetry.	All the
+	  other things being equal, prefer pre-increment and pre-decrement
+	  to post-increment and post-decrement.
+
+2004-09-25 Saturday 10:25  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.3): Minor residual optimization.
+
+2004-09-25 Saturday 10:23  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.2): Optimization second attempt.
+
+2004-09-25 Saturday 10:15  Abramo Bagnara
+
+	* src/SatRow.cc (altnum.1): Optimization first attempt.
+
+2004-09-22 Wednesday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (altnum.2): Activate the Prolog
+	  interfaces.
+
+2004-09-22 Wednesday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected (1.3): Updated to reflect the fact that
+	  we are not sorting constraints before returning them.
+
+2004-09-22 Wednesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected (1.7), expected2 (1.12),
+	  XSB/expected (1.8), XSB/expected2 (1.10): Updated to reflect the
+	  fact that we are not sorting constraints before returning them.
+
+2004-09-22 Wednesday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, configure.ac, src/Checked_Integer.defs.hh,
+	  src/Checked_Integer.inlines.hh, src/Checked_Integer.types.hh,
+	  src/Integer.defs.hh, src/Integer.types.hh, src/Makefile.am
+	  (altnum.[3,7,6,7,3,5,5,10]): Commit to the new implementation of
+	  checked numbers.
+
+2004-09-22 Wednesday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (altnum.2): Temporary kludge to make things
+	  work until we generalize the interface.
+
+2004-09-22 Wednesday 16:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (altnum.[4,4]):
+	  Added add_mul_assign() and sub_mul_assign().
+
+2004-09-22 Wednesday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.31): No longer sorting constraints in
+	  Polyhedron::constraints().  Two FIXMEs added so as not to forget
+	  to reconsider the situation when we will have better sorting
+	  methods.
+
+2004-09-22 Wednesday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.86), GenSys.defs.hh (1.99): Added a
+	  couple of missing \relates.
+
+2004-09-22 Wednesday 10:18  Abramo Bagnara
+
+	* src/: checked.inlines.hh, checked_float.inlines.hh
+	  (altnum.[7,9]): Separated approximated arithmentic add/sub.
+
+2004-09-20 Monday 17:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.113): Added
+	  documentation for ppl_Polyhedron_dimension/2.
+
+2004-09-20 Monday 15:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, interfaces/Makefile.am (altnum.[4,1]): Activate the
+	  C interface (this breaks the build).
+
+2004-09-20 Monday 13:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (altnum.3): Quiet again.
+
+2004-09-20 Monday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.inlines.hh, Interval.defs.hh,
+	  Interval.inlines.hh, Polyhedron.inlines.hh (altnum.[3,3,3,3]):
+	  Temporary hacks to avoid failures with checked 64-bits integers.
+
+2004-09-20 Monday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.2), install-sh (1.10), missing (1.8), Watchdog/compile
+	  (1.2), Watchdog/install-sh (1.7), Watchdog/missing (1.4): Updated
+	  from Automake 1.9.2.
+
+2004-09-20 Monday 09:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (altnum.2): Made noisy so as to make
+	  visible how test2() is failing.
+
+2004-09-19 Sunday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am, NEWS, README.configure, TODO, configure.ac,
+	  Watchdog/Makefile.am, Watchdog/Watchdog.cc,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/expected,
+	  demos/ppl_lcdd/ppl_lcdd.cc, demos/ppl_lcdd/examples/README,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected,
+	  demos/ppl_lpsol/ppl_lpsol.c, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/ppl.sty, doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/GNU/Makefile.am,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SWI/Makefile.am,
+	  interfaces/Prolog/XSB/Makefile.am,
+	  interfaces/Prolog/YAP/Makefile.am, src/AskTell.defs.hh,
+	  src/BHRZ03_Certificate.cc, src/BHRZ03_Certificate.defs.hh,
+	  src/BoundingBox.defs.hh, src/Checked_Number.defs.hh,
+	  src/Checked_Number.inlines.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/Constraint.defs.hh, src/Determinate.defs.hh, src/GenSys.cc,
+	  src/GenSys.defs.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/H79_Certificate.cc, src/H79_Certificate.defs.hh, src/Init.cc,
+	  src/Makefile.am, src/Matrix.cc, src/Polyhedra_PowerSet.defs.hh,
+	  src/Polyhedra_PowerSet.inlines.hh,
+	  src/Polyhedra_PowerSet.types.hh, src/Polyhedra_Powerset.defs.hh,
+	  src/Polyhedra_Powerset.inlines.hh,
+	  src/Polyhedra_Powerset.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron_nonpublic.cc, src/Polyhedron_public.cc,
+	  src/Polyhedron_widenings.cc, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/PowerSet.types.hh,
+	  src/Powerset.defs.hh, src/Powerset.inlines.hh,
+	  src/Powerset.types.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/SatMatrix.cc, src/SatRow.defs.hh,
+	  src/Variable.defs.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/algorithms.hh,
+	  src/checked.inlines.hh, src/conversion.cc, src/globals.cc,
+	  src/globals.defs.hh, src/globals.hh, src/globals.inlines.hh,
+	  src/max_space_dimension.hh, tests/Makefile.am,
+	  tests/NNCminimize5.cc, tests/addconstraint1.cc,
+	  tests/addgenerator1.cc, tests/addgenerator2.cc,
+	  tests/addgenerator4.cc, tests/bgp99extrapolation1.cc,
+	  tests/bgp99extrapolation2.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+	  tests/bhz03widening6.cc, tests/h79widening8.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/linearpartition4.cc,
+	  tests/mc91.cc, tests/polydifference9.cc, tests/relations17.cc,
+	  tests/timings.cc, tests/timings.hh, utils/.cvsignore,
+	  utils/Makefile.am, utils/timings.cc, utils/timings.hh
+	  (altnum.[3,2,2,2,6,2,2,2,1,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,2,2,7,8,2,3,3,2,3,3,3,3,2,2,2,9,3,2,2,1,1,1,1,3,3,3,3,2,2,1,1,1,1,2,3,2,1,1,1,2,2,2,6,3,3,1,3,1,1,3,1,1,1,1,1,2,2,2,2,2,2,2,2,1,2,2,2,2,1,1,1,1,1,1,1,1,1]):
+	  Second merge from main trunk.
+
+2004-09-19 Sunday 21:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.95), Ciao/ciao_pl_check.pl
+	  (1.5), GNU/ppl_gprolog.pl (1.46): Added tests for the Prolog
+	  interface predicate ppl_Polyhedron_dimension/2.  Updated
+	  interface files to correct obvious bugs for this predicate.
+
+2004-09-19 Sunday 21:28  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh,
+	  checked_float.inlines.hh, checked_int.inlines.hh,
+	  checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[9,5,8,8,10,11]): Better names for policy fields. Added
+	  add_assign_mul and sub_assign_mul. Enriched Result return codes.
+
+2004-09-19 Sunday 21:25  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh
+	  (altnum.[6,7]): Better names for policy fields. Added
+	  add_assign_mul and sub_assign_nul.
+
+2004-09-19 Sunday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/simplify.cc (1.38): Comments revised so as not to refer to
+	  (no longer existing) comparison operators between rows of the
+	  saturation matrices.
+
+2004-09-19 Sunday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/: Makefile.am (1.3), README (1.2),
+	  dcube10.ext (1.1), dcube12.ext (1.1), dcube3.ext (1.1),
+	  dcube6.ext (1.1), dcube8.ext (1.1): New examples with V
+	  representations of dual hypercubes.
+
+2004-09-19 Sunday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.24), config.sub (1.23), Watchdog/config.guess
+	  (1.8), Watchdog/config.sub (1.8): Updated.
+
+2004-09-19 Sunday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.20), Watchdog/ltmain.sh (1.9): Updated from Libtool
+	  1.5.10.
+
+2004-09-19 Sunday 09:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/README (1.2): Improved the text.
+
+2004-09-19 Sunday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/expected (1.2): Updated to reflect the fact that
+	  we no longer sort generators for closed polyhedra.
+
+2004-09-19 Sunday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.97): Two new important things to do.
+
+2004-09-19 Sunday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.112): Significant efficiency improvements have been
+	  achieved in the case of closed polyhedra.
+
+2004-09-19 Sunday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.68): Similar lines are now
+	  commented out in the same way.
+
+2004-09-19 Sunday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README (1.4): Copyright notice added.
+
+2004-09-19 Sunday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.defs.hh (1.2): Added code to experiment with an
+	  alternative way of dealing with temporaries.
+
+2004-09-19 Sunday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: minimize.cc (1.37), simplify.cc (1.37): Small improvements.
+
+2004-09-19 Sunday 08:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.30): In Polyhedron::generators(), we
+	  no longer insist in returning a sorted system of generators in
+	  the case of a closed polyhedron.
+
+2004-09-19 Sunday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_Powerset.inlines.hh (1.4): Use the new constructor
+	  C_Polyhedron::C_Polyhedron(const NNC_Polyhedron&).
+
+2004-09-19 Sunday 00:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.30): Added some comments to explain
+	  what we are doing.  Enahnced the function write_polyehdron() to
+	  also apply to Polka and PolyLib polyhedra objects.
+
+2004-09-18 Saturday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.29): With Polka, do not try to
+	  print the "frames" of an empty polyhedron.
+
+2004-09-18 Saturday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.28): Increase the magic parameter
+	  of polka_initialize() to 25000: with 22500 Polka 2.0.2 dies on
+	  mit31-20.ine with the error "Chernikova: out of table space".
+
+2004-09-18 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/: Makefile.am (1.8), ppl_lcdd.cc (1.27): A first,
+	  rough attempt at obtaining an `lcdd' clone that works also with
+	  (New) Polka and PolyLib.
+
+2004-09-17 Friday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.96), interfaces/Prolog/ppl_prolog.icc (1.135),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.67),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.63),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.88),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.33),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.55),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.81): Polyhedron::dimension()
+	  is now available in all the interfaces.
+
+2004-09-17 Friday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.111), interfaces/C/ppl_c.cc (1.108),
+	  interfaces/C/ppl_c.h.in (1.34): Functions in the C interface that
+	  compute (space) dimensions no longer return their result.  The
+	  caller is now required to pass, as an extra argument, a pointer
+	  to a memory area where the result will be written.
+
+2004-09-17 Friday 15:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.107), ppl_c.h.in (1.33): New function
+	  int ppl_Polyhedron_dimension(ppl_const_Polyhedron_t ph).
+
+2004-09-17 Friday 10:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.26): Remove support for the
+	  "project" command: it was undocumented and its usefulness is
+	  highly questionable.
+
+2004-09-17 Friday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.110), TODO (1.95), demos/ppl_lcdd/ppl_lcdd.cc (1.25): The
+	  `ppl_lcdd' demo is now able to parse problems produced by lrs,
+	  i.e., where the number of rows of the matrix is omitted and
+	  replaced by "*****" (five asterisks).
+
+2004-09-17 Friday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.94): Typo fixed.
+
+2004-09-16 Thursday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.93), tests/README (1.1): New README file explains how a
+	  program in our test suite can be used for a quick hands-on PPL.
+
+2004-09-16 Thursday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: CbecomesNNC1.cc (1.6), exceptions1.cc (1.38),
+	  exceptions2.cc (1.33), generators1.cc (1.14), generators4.cc
+	  (1.6): Replace "built" by "build" wherever appropriate.
+
+2004-09-16 Thursday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.109), TODO (1.92), src/C_Polyhedron.cc (1.10),
+	  src/C_Polyhedron.defs.hh (1.24), tests/Makefile.am (1.214),
+	  tests/NNCbecomesC1.cc (1.1), tests/exceptions2.cc (1.32): The
+	  constructor C_Polyhedron(const NNC_Polyhedron& y) no longer
+	  throws an exception if `y' is not topologically closed.  Rather,
+	  it constructs a C_Polyhedron representing the topological closure
+	  of `y'.
+
+2004-09-16 Thursday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.108), src/Polyhedra_Powerset.defs.hh (1.2),
+	  src/Polyhedra_Powerset.inlines.hh (1.3): The constructors
+	  allowing to obtain a Polyhedra_Powerset<NNC_Polyhedron> from a
+	  Polyhedra_Powerset<C_Polyhedron> and the other way around are now
+	  explicit.
+
+2004-09-16 Thursday 17:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.cc (1.9): Include <config.h>.
+
+2004-09-16 Thursday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/adddimensions11.cc (1.6): Inconsistency fixed.
+
+2004-09-16 Thursday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.18), src/Powerset.inlines.hh (1.2),
+	  src/algorithms.hh (1.34): Simplified the progrma logic in a few
+	  places where we remove elements from a container by using the
+	  return value of method erase().
+
+2004-09-15 Wednesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/linearpartition4.cc (1.3): Be quiet.
+
+2004-09-15 Wednesday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polydifference9.cc (1.3): Completed and made quiet.
+
+2004-09-15 Wednesday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.cc (1.2), src/ConSys.defs.hh (1.85),
+	  src/GenSys.defs.hh (1.98), src/H79_Certificate.cc (1.3),
+	  src/Matrix.cc (1.75), src/Polyhedra_Powerset.inlines.hh (1.2),
+	  src/Polyhedron_widenings.cc (1.29), tests/NNCminimize5.cc (1.10),
+	  tests/addconstraint1.cc (1.6), tests/addgenerator1.cc (1.6),
+	  tests/addgenerator2.cc (1.6), tests/addgenerator4.cc (1.6),
+	  tests/relations17.cc (1.8): Try to be consistent in the choice of
+	  variable names.
+
+2004-09-15 Wednesday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.107): Announce the bug just fixed.
+
+2004-09-15 Wednesday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.106), TODO (1.91), doc/devref-browse.doxyconf-latex.in
+	  (1.44), doc/devref-print.doxyconf-latex.in (1.44),
+	  doc/devref.doxyconf-html.in (1.44), src/Makefile.am (1.80),
+	  src/Polyhedra_PowerSet.defs.hh (1.36),
+	  src/Polyhedra_PowerSet.inlines.hh (1.42),
+	  src/Polyhedra_PowerSet.types.hh (1.3),
+	  src/Polyhedra_Powerset.defs.hh (1.1),
+	  src/Polyhedra_Powerset.inlines.hh (1.1),
+	  src/Polyhedra_Powerset.types.hh (1.1), src/PowerSet.defs.hh
+	  (1.49), src/PowerSet.inlines.hh (1.59), src/PowerSet.types.hh
+	  (1.7), src/Powerset.defs.hh (1.1), src/Powerset.inlines.hh (1.1),
+	  src/Powerset.types.hh (1.1), src/Widening_Function.defs.hh (1.5),
+	  src/Widening_Function.inlines.hh (1.5), src/algorithms.hh (1.33),
+	  src/max_space_dimension.hh (1.3), tests/bgp99extrapolation1.cc
+	  (1.5), tests/bgp99extrapolation2.cc (1.7),
+	  tests/bhz03widening1.cc (1.6), tests/bhz03widening2.cc (1.8),
+	  tests/bhz03widening3.cc (1.6), tests/bhz03widening4.cc (1.4),
+	  tests/bhz03widening5.cc (1.5), tests/bhz03widening6.cc (1.6),
+	  tests/linearpartition1.cc (1.15), tests/linearpartition2.cc
+	  (1.15), tests/linearpartition3.cc (1.15),
+	  tests/linearpartition4.cc (1.2), tests/mc91.cc (1.15),
+	  tests/polydifference9.cc (1.2): The classes PowerSet and
+	  Polyhedra_PowerSet have been renamed Powerset and
+	  Polyhedra_Powerset, respectively.
+
+2004-09-15 Wednesday 18:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (1.32): Corrected a bug in check_containment().
+	  The bug was affecting method geometrically_contains().
+
+2004-09-15 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.90): Polyhedra_PowerSet::poly_difference_assign() has
+	  been implemented.
+
+2004-09-15 Wednesday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.29): (Not well thought) FIXME
+	  removed.
+
+2004-09-15 Wednesday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.89): Several new things to do.
+
+2004-09-15 Wednesday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.213), polydifference9.cc (1.1): Test
+	  Polyhedra_PowerSet<PH>::poly_difference_assign().  (It presently
+	  fails, apparently due to a bug in
+	  Polyhedra_PowerSet<PH>::geometrically_equals().)
+
+2004-09-15 Wednesday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.31): The linear_partition() template
+	  function is now in Polyhedra_PowerSet.*.hh.
+
+2004-09-15 Wednesday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.105), src/Polyhedra_PowerSet.defs.hh (1.35),
+	  src/Polyhedra_PowerSet.inlines.hh (1.41): New constructors and
+	  assignment operators allowing to obtain a
+	  Polyhedra_PowerSet<NNC_Polyhedron> from a
+	  Polyhedra_PowerSet<C_Polyhedron> and the other way around.  In
+	  the latter case, the topological clusure of the element polyhedra
+	  is computed.	New method
+	  Polyhedra_PowerSet::poly_difference_assign(const
+	  Polyhedra_PowerSet& y) assigns to `*this' the poly-difference of
+	  `*this' and `y'.
+
+2004-09-15 Wednesday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.48), PowerSet.inlines.hh (1.58): New
+	  method PowerSet<CS>::clear().
+
+2004-09-15 Wednesday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.104), TODO (1.88), src/Polyhedron.defs.hh (1.244),
+	  src/Polyhedron_public.cc (1.28): Added a first, draft
+	  implementation of method dimension_type Polyhedron::dimension():
+	  it returns the dimension of *this (not to be confused with the
+	  dimension of its enclosing vector space) or 0, if *this is empty.
+
+2004-09-13 Monday 07:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.103): Mentioned the bug just corrected.
+
+2004-09-12 Sunday 18:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.212): Use h79widening8.cc also with NNC
+	  polyhedra.
+
+2004-09-08 Wednesday 17:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (ppl-0_6-branch.1): Corrected a bug reported by
+	  Sriram.
+
+2004-09-08 Wednesday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/h79widening8.cc (1.2): Made silent.
+
+2004-09-08 Wednesday 16:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.94): Corrected a bug in
+	  GenSys::satisfied_by_all_generators(), which was revealed by the
+	  test h79widening8.cc.
+
+2004-09-08 Wednesday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.211), h79widening8.cc (1.1): Added a test
+	  showing a bug in H79_widening_assign().
+
+2004-09-03 Friday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.7): Inclusion directive fixed.
+
+2004-09-03 Friday 10:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.87), demos/ppl_lcdd/ppl_lcdd.cc (1.24): Added support for
+	  printing timing information (on std::cerr).
+
+2004-09-02 Thursday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.102), demos/ppl_lpsol/expected (1.2),
+	  demos/ppl_lpsol/ppl_lpsol.c (1.3): Fixed a bug in the `ppl_lpsol'
+	  demo (thanks to Andrea Cimino).
+
+2004-09-02 Thursday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.12), src/Makefile.am (1.79): Prepared for
+	  PPL 0.7.
+
+2004-08-31 Tuesday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.210): Search for header files also in the
+	  `utils' directory.
+
+2004-08-31 Tuesday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.27), configure.ac (1.121),
+	  demos/ppl_lcdd/Makefile.am (1.6), tests/Makefile.am (1.209),
+	  tests/timings.cc (1.5), tests/timings.hh (1.5), utils/.cvsignore
+	  (1.1), utils/Makefile.am (1.1), utils/timings.cc (1.1),
+	  utils/timings.hh (1.1): The timings functions are now included in
+	  a `ppl_utils' convenience library, which is contained in the
+	  newly created `utils' directory.
+
+2004-08-30 Monday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.86): Three more things to do.
+
+2004-08-30 Monday 23:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.85): Added several new things to be done.
+
+2004-08-30 Monday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/README (1.1): Explain and give pointers
+	  to the origins of these examples.
+
+2004-08-30 Monday 16:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.43),
+	  devref-print.doxyconf-latex.in (1.43), devref.doxyconf-html.in
+	  (1.43), user-browse.doxyconf-latex.in (1.21),
+	  user-print.doxyconf-latex.in (1.21), user.doxyconf-html.in
+	  (1.23): Updated to the latest doxygen version (1.3.8).
+
+2004-08-28 Saturday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.42),
+	  devref-print.doxyconf-latex.in (1.42), devref.doxyconf-html.in
+	  (1.42): Replaced globals.hh with globals.defs.hh and
+	  globals.inlines.hh.
+
+2004-08-27 Friday 09:23  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[9,10]): Added support for special values.
+
+2004-08-27 Friday 09:23  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.7): Added implementation of
+	  extended integers
+
+2004-08-27 Friday 09:22  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.7): Better implementation of
+	  pred/succ.
+
+2004-08-27 Friday 09:21  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.4): Added extended functions.
+
+2004-08-26 Thursday 23:54  Abramo Bagnara
+
+	* src/Makefile.am (altnum.8): Fixed concatenation order.
+
+2004-08-26 Thursday 23:53  Abramo Bagnara
+
+	* src/Checked_Number.inlines.hh (altnum.6): Use Checked::functions
+
+2004-08-26 Thursday 23:52  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, checked.defs.hh (altnum.[5,8]):
+	  Added some policy fields. Better specialization infrastructure.
+
+2004-08-23 Monday 20:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.243), Polyhedron_widenings.cc (1.28):
+	  Removed the no-longer used function is_BHRZ03_stabilizing(),
+	  which has been superseded by the use of BHRZ03_Certificate.
+
+2004-08-23 Monday 16:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (1.30): Documented (for the developers) the
+	  function check_containment() and linear_partition_aux().
+
+2004-08-23 Monday 12:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.69), Matrix.cc (1.74): Use add_mul_assign()
+	  and sub_mul_assign() when possible.
+
+2004-08-23 Monday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_nonpublic.cc (1.25), Row.cc (1.68), Row.defs.hh
+	  (1.82), Row.inlines.hh (1.47): New funcions void
+	  homogeneous_scalar_product_assign(Integer& z, const Row& x, const
+	  Row& y) and int homogeneous_scalar_product_sign(const Row& x,
+	  const Row& y).
+
+2004-08-23 Monday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.93): Last change completed.
+
+2004-08-23 Monday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.92): Use scalar_product_assign() instead of
+	  replicating code..
+
+2004-08-23 Monday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.25), BHRZ03_Certificate.defs.hh (1.6),
+	  BoundingBox.defs.hh (1.12), Determinate.defs.hh (1.44),
+	  H79_Certificate.defs.hh (1.6), Init.cc (1.14), Makefile.am
+	  (1.78), Matrix.cc (1.73), Polyhedra_PowerSet.defs.hh (1.34),
+	  Polyhedron.defs.hh (1.242), Row.cc (1.67), Row.defs.hh (1.81),
+	  Row.inlines.hh (1.46), SatMatrix.cc (1.29), SatRow.defs.hh
+	  (1.33), Variable.defs.hh (1.37), conversion.cc (1.60), globals.cc
+	  (1.18), globals.defs.hh (1.1), globals.hh (1.42): Header file
+	  globals.hh renamed globals.defs.hh.
+
+2004-08-23 Monday 09:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.77), Row.cc (1.66), conversion.cc (1.59),
+	  globals.hh (1.41), globals.inlines.hh (1.1): New function void
+	  normalize2(const Integer& x, const Integer& y, Integer& nx,
+	  Integer& ny).  Start moving inline implementations of globals in
+	  globals.inlines.hh.
+
+2004-08-23 Monday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.65), conversion.cc (1.58): Avoid using some
+	  temporaries.	Avoid calling the same function twice.
+
+2004-08-22 Sunday 23:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.91), Integer.defs.hh (1.13),
+	  Integer.inlines.hh (1.12), Matrix.cc (1.72),
+	  Polyhedron_nonpublic.cc (1.24), Polyhedron_widenings.cc (1.27),
+	  Row.cc (1.64): New function void sub_mul_assign(Integer& x, const
+	  Integer& y, const Integer& z) to efficiently compute x -= y*z.
+
+	  Use add_mul_assign() and sub_mul_assign() when possible.
+
+2004-08-22 Sunday 23:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.43): Spurious friend declarations
+	  removed.
+
+2004-08-22 Sunday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.88), GenSys.cc (1.90),
+	  Generator.defs.hh (1.88), Polyhedron_nonpublic.cc (1.23),
+	  Polyhedron_public.cc (1.27), Polyhedron_widenings.cc (1.26),
+	  globals.cc (1.17), globals.hh (1.40): Functions const Integer&
+	  operator*(const Constraint& c, const Generator& g) and const
+	  Integer& reduced_scalar_product(const Constraint& c, const
+	  Generator& g) removed.  Used void scalar_product_assign(Integer&
+	  z, const Row& x, const Row& y) and void
+	  reduced_scalar_product_assign(Integer& z, const Row& x, const
+	  Row& y) instead.
+
+	  Use void scalar_product_sign(const Row& x, const Row& y) and void
+	  reduced_scalar_product_sign(const Row& x, const Row& y) wherever
+	  possible.
+
+2004-08-22 Sunday 19:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.68), GenSys.cc (1.89), Integer.defs.hh (1.12),
+	  Integer.inlines.hh (1.11), Matrix.cc (1.71), Polyhedron_public.cc
+	  (1.26), Polyhedron_widenings.cc (1.25), Row.cc (1.63),
+	  Row.defs.hh (1.80), Row.inlines.hh (1.45), conversion.cc (1.57):
+	  Functions const Integer& operator*(const Row& x, const Row& y)
+	  and const Integer& reduced_scalar_product(const Row& x, const
+	  Row& y) removed.  New functions void
+	  scalar_product_assign(Integer& z, const Row& x, const Row& y) and
+	  void reduced_scalar_product_assign(Integer& z, const Row& x,
+	  const Row& y) provide the same functionality, but without
+	  (explicitely) using temporaries.
+
+	  New functions int scalar_product_sign(const Row& x, const Row& y)
+	  and int reduced_scalar_product_sign(const Row& x, const Row& y)
+	  return the sign of the (reduced) scalar product of the given
+	  arguments.
+
+	  New function void add_mul_assign(Integer& x, const Integer& y,
+	  const Integer& z) to efficiently compute x += y*z.
+
+2004-08-22 Sunday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.88), Generator.cc (1.51), Init.cc (1.13),
+	  Matrix.cc (1.70), Polyhedron_nonpublic.cc (1.22),
+	  Polyhedron_widenings.cc (1.24), Row.cc (1.62), conversion.cc
+	  (1.56), globals.cc (1.16), globals.hh (1.39): Old code for the
+	  handling of temporary coefficients removed.
+
+2004-08-22 Sunday 17:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.87), Generator.cc (1.50), Init.cc (1.12),
+	  Matrix.cc (1.69), Polyhedron_nonpublic.cc (1.21),
+	  Polyhedron_widenings.cc (1.23), Row.cc (1.61), conversion.cc
+	  (1.55), globals.cc (1.15), globals.hh (1.38): Draft new code for
+	  the handling of temporary coefficients.
+
+2004-08-22 Sunday 08:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.inlines.hh (1.4): Added \relates doxygen
+	  command to function definition.
+
+2004-08-21 Saturday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.11), demos/ppl_lpsol/Makefile.am (1.2),
+	  interfaces/Prolog/Ciao/Makefile.am (1.29),
+	  interfaces/Prolog/GNU/Makefile.am (1.35),
+	  interfaces/Prolog/SICStus/Makefile.am (1.42),
+	  interfaces/Prolog/SWI/Makefile.am (1.35),
+	  interfaces/Prolog/XSB/Makefile.am (1.22),
+	  interfaces/Prolog/YAP/Makefile.am (1.26), tests/Makefile.am
+	  (1.208): Match every `endif' with the corresponding `if'
+	  condition.
+
+2004-08-21 Saturday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.5): Add `expected' to the list of
+	  files to be distributed.
+
+2004-08-21 Saturday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.101): Now `make check' runs a number of tests with
+	  `ppl_lcdd', comparing the results to expected ones.
+
+2004-08-21 Saturday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/: Makefile.am (1.4), expected (1.1): Use
+	  `ppl_lcdd' to perform regression testing.
+
+2004-08-20 Friday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.120): Check for md5sum.
+
+2004-08-20 Friday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.26): Option `--with-cxxflags=-Wno-deprecated'
+	  removed from `DISTCHECK_CONFIGURE_FLAGS'.
+
+2004-08-20 Friday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.3): Update version.
+
+2004-08-20 Friday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_6-branch.[3,5]): Mark
+	  ChangeLog.
+
+2004-08-20 Friday 19:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.4): Updated.
+
+2004-08-20 Friday 19:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_6-branch.2): Glitch fixed.
+
+2004-08-20 Friday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_6-branch.3): Updated.
+
+2004-08-20 Friday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.41),
+	  devref-print.doxyconf-latex.in (1.41), devref.doxyconf-html.in
+	  (1.41): Include certificates in the developer's reference.
+
+2004-08-20 Friday 18:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/H79_Certificate.defs.hh (1.5): Spurious comments removed.
+
+2004-08-20 Friday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_6-branch.[3,3,4]): Include certificates in the developer's
+	  reference.
+
+2004-08-20 Friday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/H79_Certificate.defs.hh (ppl-0_6-branch.2): Spurious comments
+	  removed.
+
+2004-08-20 Friday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog (ppl-0_6-branch.[2,2]): Updated.
+
+2004-08-20 Friday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox, doc/ppl.sty,
+	  interfaces/Prolog/Prolog_interface.dox (ppl-0_6-branch.[1,1,1]):
+	  Merge from the main trunk.
+
+2004-08-20 Friday 17:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.157): Minor English improvement.
+
+2004-08-20 Friday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (ppl-0_6-branch.3): The
+	  documentation of BHZ03_widening_assign made shorter by referring
+	  to the new section in the introduction.  The comment on
+	  concatenate_assign() made shorter (as suggested by Pat).
+
+2004-08-20 Friday 17:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.156): Link error corrected.
+
+2004-08-20 Friday 17:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.155): Added a paragraph on the BGP99
+	  extrapolation operator.
+
+2004-08-20 Friday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.154): After doing the meet on elements of
+	  the powerset domain elementwise, omega reduction is needed.
+
+2004-08-20 Friday 16:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.153): Small improvements.
+
+2004-08-20 Friday 16:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.33): The comment on
+	  concatenate_assign() made shorter (as suggested by Pat).
+
+2004-08-20 Friday 16:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.32): The documentation of
+	  BHZ03_widening_assign made shorter by referring to the new
+	  section in the introduction.
+
+2004-08-20 Friday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_6-branch.1): Ready for the release of PPL 0.6.1.
+
+2004-08-20 Friday 16:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.152): A couple of corrections.
+
+2004-08-20 Friday 16:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.151): Added a section on certificate-based
+	  widenings.
+
+2004-08-20 Friday 16:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.31): Corrected two comments.
+
+2004-08-20 Friday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/ppl_lcdd.cc, ppl_lpsol/ppl_lpsol.c
+	  (ppl-0_6-branch.[1,1]): Do not try to use RLIMIT_AS unless the
+	  configure script has determined its availability.
+
+2004-08-20 Friday 15:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: ppl_lcdd/ppl_lcdd.cc (1.23), ppl_lpsol/ppl_lpsol.c (1.2):
+	  Do not try to use RLIMIT_AS unless the configure script has
+	  determined its availability.
+
+2004-08-20 Friday 15:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.150): Some improvements for the section on
+	  polyhedra powersets.
+
+2004-08-20 Friday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.149): In the section about add_disjuct,
+	  \cS_1 ==> \cS.
+
+2004-08-20 Friday 15:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.112): Update cross
+	  reference.
+
+2004-08-20 Friday 15:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.148), ppl.sty (1.16): Added a short
+	  (incomplete) section on the polyhedral powerset domain and
+	  revised the description of the generic powerset meet operation.
+
+2004-08-20 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/NEWS (ppl-0_6-branch.1): Updated for the release of PPL
+	  0.6.1.
+
+2004-08-20 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh,
+	  src/Polyhedra_PowerSet.inlines.hh, tests/bgp99extrapolation2.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening5.cc, tests/bhz03widening6.cc
+	  (ppl-0_6-branch.[2,1,1,1,1,1,1]): The methods
+	  Polyhedra_PowerSet::semantically_contains(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::semantically_equals(const
+	  Polyhedra_PowerSet&) have been renamed
+	  Polyhedra_PowerSet::geometrically_covers(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::geometrically_equals(const
+	  Polyhedra_PowerSet& y), respectively.
+
+2004-08-20 Friday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_6-branch.1): Completed for 0.6.1.
+
+2004-08-20 Friday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (ppl-0_6-branch.2): Formatting glitch fixed.
+
+2004-08-20 Friday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.2): Version number bumped.
+
+2004-08-20 Friday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.100): Completed for 0.6.1.
+
+2004-08-20 Friday 14:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.7): Formatting glitch fixed.
+
+2004-08-20 Friday 14:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.147): Small improvements to section 1.6.
+
+2004-08-20 Friday 14:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.146): Some polyhedra where wrongly named P
+	  instead of \cP.  Replaced a couple of = signs by \defeq.  A first
+	  pass on Section 1.5 (PowerSet) to correct minor typos.
+
+2004-08-20 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.99), src/Polyhedra_PowerSet.defs.hh (1.30),
+	  src/Polyhedra_PowerSet.inlines.hh (1.40),
+	  tests/bgp99extrapolation2.cc (1.6), tests/bhz03widening2.cc
+	  (1.7), tests/bhz03widening3.cc (1.5), tests/bhz03widening5.cc
+	  (1.4), tests/bhz03widening6.cc (1.5): The methods
+	  Polyhedra_PowerSet::semantically_contains(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::semantically_equals(const
+	  Polyhedra_PowerSet&) have been renamed
+	  Polyhedra_PowerSet::geometrically_covers(const
+	  Polyhedra_PowerSet&) and
+	  Polyhedra_PowerSet::geometrically_equals(const
+	  Polyhedra_PowerSet& y), respectively.
+
+2004-08-20 Friday 14:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (ppl-0_6-branch.1): Documented
+	  function pairwise_reduce().
+
+2004-08-20 Friday 13:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.145): Some stuff (lazy/eager operators and
+	  polymorphism disclaimer) moved into section 1.6 (Using the
+	  Library).
+
+2004-08-20 Friday 13:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.144): Bug fixed.
+
+2004-08-20 Friday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.29): Documented method
+	  pairwise_reduce().
+
+2004-08-20 Friday 13:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.143), ppl.sty (1.15): First draft of
+	  description of the powerset construction added.
+
+2004-08-20 Friday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure (ppl-0_6-branch.1): Spurious indentation fixed.
+
+2004-08-20 Friday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh, H79_Certificate.defs.hh
+	  (ppl-0_6-branch.[1,1]): In the Doxygen comments: lgo --> limited
+	  growth ordering.
+
+2004-08-20 Friday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README.configure (1.6): A spurious indentation fixed.
+
+2004-08-20 Friday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh (1.5), H79_Certificate.defs.hh
+	  (1.4): In the Doxygen comment: lgo --> limited growth ordering
+
+2004-08-19 Thursday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS, CREDITS, ChangeLog, Makefile.am, NEWS, README,
+	  README.configure, STANDARDS, TODO, config.guess, config.sub,
+	  configure.ac, depcomp, install-sh, ltmain.sh, ppl.lsm.in,
+	  ppl.spec.in, Watchdog/ChangeLog,
+	  Watchdog/Doubly_Linked_Object.defs.hh,
+	  Watchdog/Doubly_Linked_Object.inlines.hh,
+	  Watchdog/Doubly_Linked_Object.types.hh, Watchdog/EList.defs.hh,
+	  Watchdog/EList.inlines.hh, Watchdog/EList.types.hh,
+	  Watchdog/EList_Iterator.defs.hh,
+	  Watchdog/EList_Iterator.inlines.hh,
+	  Watchdog/EList_Iterator.types.hh, Watchdog/Handler.defs.hh,
+	  Watchdog/Handler.inlines.hh, Watchdog/Handler.types.hh,
+	  Watchdog/Makefile.am, Watchdog/NEWS, Watchdog/Pending_Element.cc,
+	  Watchdog/Pending_Element.defs.hh,
+	  Watchdog/Pending_Element.inlines.hh,
+	  Watchdog/Pending_Element.types.hh, Watchdog/Pending_List.cc,
+	  Watchdog/Pending_List.defs.hh, Watchdog/Pending_List.inlines.hh,
+	  Watchdog/Pending_List.types.hh, Watchdog/README,
+	  Watchdog/Time.cc, Watchdog/Time.defs.hh,
+	  Watchdog/Time.inlines.hh, Watchdog/Time.types.hh,
+	  Watchdog/Watchdog.cc, Watchdog/Watchdog.defs.hh,
+	  Watchdog/Watchdog.inlines.hh, Watchdog/config.guess,
+	  Watchdog/config.sub, Watchdog/configure.ac, Watchdog/depcomp,
+	  Watchdog/install-sh, Watchdog/ltmain.sh, demos/Makefile.am,
+	  demos/ppl_lcdd/Makefile.am, demos/ppl_lcdd/ppl_lcdd.cc,
+	  demos/ppl_lcdd/examples/.cvsignore,
+	  demos/ppl_lcdd/examples/Makefile.am, demos/ppl_lpsol/.cvsignore,
+	  demos/ppl_lpsol/Makefile.am, demos/ppl_lpsol/expected,
+	  demos/ppl_lpsol/ppl_lpsol.c, demos/ppl_lpsol/examples/.cvsignore,
+	  demos/ppl_lpsol/examples/Makefile.am,
+	  demos/ppl_lpsol/examples/afiro.mps,
+	  demos/ppl_lpsol/examples/bgprtr.mps,
+	  demos/ppl_lpsol/examples/ex1.mps,
+	  demos/ppl_lpsol/examples/sample.mps,
+	  demos/ppl_lpsol/examples/unboundedmin.mps, doc/Makefile.am,
+	  doc/definitions.dox, doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/devref.tex, doc/fdl.txt, doc/gpl.txt, doc/ppl.sty,
+	  doc/user-browse.doxyconf-latex.in,
+	  doc/user-print.doxyconf-latex.in, doc/user.doxyconf-html.in,
+	  doc/user.tex, interfaces/C/Makefile.am, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h.in, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/Makefile.am,
+	  interfaces/Prolog/Ciao/ciao_pl_check.pl,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/.cvsignore,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_pl_check.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BHRZ03_Certificate.defs.hh,
+	  src/BHRZ03_Certificate.inlines.hh, src/BoundingBox.inlines.hh,
+	  src/C_Polyhedron.cc, src/C_Polyhedron.defs.hh,
+	  src/C_Polyhedron.inlines.hh, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/H79_Certificate.cc,
+	  src/H79_Certificate.defs.hh, src/H79_Certificate.inlines.hh,
+	  src/H79_Certificate.types.hh, src/Init.cc, src/Makefile.am,
+	  src/Matrix.defs.hh, src/NNC_Polyhedron.defs.hh,
+	  src/NNC_Polyhedron.inlines.hh, src/Ph_Status.idefs.hh,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.defs.hh,
+	  src/Polyhedra_PowerSet.defs.hh,
+	  src/Polyhedra_PowerSet.inlines.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron.types.hh,
+	  src/Polyhedron_chdims.cc, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.defs.hh,
+	  src/SatMatrix.defs.hh, src/Widening_Function.defs.hh,
+	  src/Widening_Function.inlines.hh, src/Widening_Function.types.hh,
+	  src/algorithms.hh, src/conversion.cc, src/globals.cc,
+	  src/globals.hh, src/minimize.cc, src/simplify.cc,
+	  src/statistics.hh, src/version.hh.in, tests/.cvsignore,
+	  tests/Makefile.am, tests/bgp99extrapolation1.cc,
+	  tests/bgp99extrapolation2.cc, tests/bhz03widening1.cc,
+	  tests/bhz03widening2.cc, tests/bhz03widening3.cc,
+	  tests/bhz03widening4.cc, tests/bhz03widening5.cc,
+	  tests/bhz03widening6.cc, tests/boundingbox1.cc,
+	  tests/boundingbox2.cc, tests/boundingbox3.cc,
+	  tests/boundingbox4.cc, tests/boundingbox5.cc,
+	  tests/exceptions3.cc, tests/expanddim1.cc, tests/expanddim2.cc,
+	  tests/folddims1.cc, tests/folddims2.cc, tests/h79widening6.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/linearpartition4.cc,
+	  tests/polydifference8.cc, tests/watchdog1.cc
+	  (altnum.[1,2,1,2,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,2,2,1,1,2,2,2,2,2,1,1,1,1,1,7,1,1,1,1,1,1,1,1,2,2,1,1,2,2,2,1,1,2,1,1,1,1,1,2,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  First merge from main trunk.
+
+2004-08-19 Thursday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.207), linearpartition4.cc (1.1): New test
+	  for linear_partition() (still to be completed).
+
+2004-08-19 Thursday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.119): Version number bumped.
+
+2004-08-19 Thursday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.18): Updated.
+
+2004-08-19 Thursday 15:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.142): This is a start in revising the
+	  introductory sections to the manual so as to allow for the
+	  inclusion of domains other than that of convex polyhedra.
+
+2004-08-19 Thursday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_6-branch.[2,2,3]), devref-browse.doxyconf-latex.in (1.40),
+	  devref-print.doxyconf-latex.in (1.40), devref.doxyconf-html.in
+	  (1.40): AskTell should not appear in the develper's reference.
+
+2004-08-19 Thursday 14:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.defs.hh (ppl-0_6-branch.1): Avoided a
+	  warning in the devref documentation.
+
+2004-08-19 Thursday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Widening_Function.defs.hh (1.4): Avoided a warning in the
+	  devref documentation.
+
+2004-08-19 Thursday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (ppl-0_6-branch.2), AskTell.defs.hh (1.24):
+	  Previous change reverted.
+
+2004-08-19 Thursday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.39),
+	  devref-print.doxyconf-latex.in (1.39), devref.doxyconf-html.in
+	  (1.39): Widening_Function and Polyhedra_PowerSet should appear in
+	  all the devref manuals.
+
+2004-08-19 Thursday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/AskTell.defs.hh (1.23): AskTell should not appear in the user
+	  documentation until working.
+
+2004-08-19 Thursday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_6-branch.[1,1,2]): Widening_Function should appear in the
+	  devref manuals.
+
+2004-08-19 Thursday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref.doxyconf-html.in (ppl-0_6-branch.1):
+	  Polyhedra_PowerSet has to also appear in the developers manual.
+
+2004-08-19 Thursday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/AskTell.defs.hh (ppl-0_6-branch.1): AskTell construction
+	  should not appear in the user manuals.
+
+2004-08-18 Wednesday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (ppl-0_6-branch.1), Makefile.am (1.76): AskTell
+	  is unfinished and not working: it should not be distributed.
+
+2004-08-18 Wednesday 22:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: configure.ac (ppl-0_6-branch.1), ChangeLog (1.8),
+	  configure.ac (1.20): Version number bumped.
+
+2004-08-18 Wednesday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_6-branch.1): Update version.
+
+2004-08-18 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_6-branch.[1,1]): Mark
+	  ChangeLog.
+
+2004-08-18 Wednesday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.21): Distribute more documentation.
+
+2004-08-18 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.38),
+	  devref-print.doxyconf-latex.in (1.38): The Polyhedra_PowerSet
+	  documentation has to appear in the devref manual too.
+
+2004-08-18 Wednesday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh (1.3), algorithms.hh (1.29):
+	  Applied the Doxygen \relates command in a couple of places.
+
+2004-08-18 Wednesday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bgp99extrapolation1.cc (1.4), bgp99extrapolation2.cc
+	  (1.5), bhz03widening1.cc (1.5), bhz03widening2.cc (1.6),
+	  bhz03widening3.cc (1.4), bhz03widening6.cc (1.4): Modified to
+	  comply with the new interface.
+
+2004-08-18 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.28),
+	  Polyhedra_PowerSet.inlines.hh (1.39): Added doxygen
+	  documentation.  Removed some methods that are now subsumed by the
+	  generic ones.
+
+2004-08-18 Wednesday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README (1.3): Last change reverted.
+
+2004-08-18 Wednesday 13:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.23): Ready for the release.
+
+2004-08-18 Wednesday 13:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/README (1.2): Revised.
+
+2004-08-18 Wednesday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.29): Installation of the documentation now
+	  works both for distribution archives and for CVS versions.
+
+2004-08-18 Wednesday 11:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.38): Include
+	  "Widening_Function.defs.hh" instead of
+	  "Widening_Function.types.hh".
+
+2004-08-18 Wednesday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.84): Ready for the release.
+
+2004-08-18 Wednesday 09:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bhz03widening4.cc (1.3), bhz03widening5.cc (1.3):
+	  Exploiting helper functions widen_fun().
+
+2004-08-18 Wednesday 09:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.37): Exploiting helper
+	  function widen_fun().
+
+2004-08-18 Wednesday 09:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: GenSys.cc (1.86), Polyhedron.types.hh (1.12),
+	  Polyhedron_widenings.cc (1.22), conversion.cc (1.54), simplify.cc
+	  (1.36): Comments improved.
+
+2004-08-18 Wednesday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.106), interfaces/C/ppl_c.h.in (1.32),
+	  src/C_Polyhedron.defs.hh (1.23), src/C_Polyhedron.inlines.hh
+	  (1.17), src/NNC_Polyhedron.defs.hh (1.26),
+	  src/NNC_Polyhedron.inlines.hh (1.18), tests/Makefile.am (1.206),
+	  tests/exceptions3.cc (1.2): Start dealing with requests to build
+	  "over-sized" objects.
+
+2004-08-18 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Widening_Function.defs.hh (1.2),
+	  Widening_Function.inlines.hh (1.3): Added helper function
+	  widen_fun() to simplify the creation of widening function
+	  objects. Added brief documentation.
+
+2004-08-18 Wednesday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: linearpartition2.cc (1.14), linearpartition3.cc (1.14):
+	  Fixed.
+
+2004-08-18 Wednesday 09:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: AskTell.defs.hh (1.22), ConSys.defs.hh (1.84),
+	  Determinate.defs.hh (1.42), GenSys.defs.hh (1.97),
+	  Polyhedra_PowerSet.defs.hh (1.27), Polyhedron.defs.hh (1.241),
+	  Polyhedron.inlines.hh (1.94): Comments improved.
+
+2004-08-18 Wednesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/linearpartition1.cc (1.14): Fixed.
+
+2004-08-17 Tuesday 23:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Widening_Function.inlines.hh (1.2):
+	  Limited_Widening_Function::operator() fixed.
+
+2004-08-17 Tuesday 23:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.28): Install documentation in text format.
+
+2004-08-17 Tuesday 21:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bhz03widening4.cc (1.2), bhz03widening5.cc (1.2):
+	  Corrected to work with the new implementation.
+
+2004-08-17 Tuesday 21:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.75), Polyhedra_PowerSet.defs.hh (1.26),
+	  Polyhedra_PowerSet.inlines.hh (1.36), Widening_Function.defs.hh
+	  (1.1), Widening_Function.inlines.hh (1.1),
+	  Widening_Function.types.hh (1.1): Factorized a lot of code
+	  related to widenings of powersets by using function objects
+	  instead of method pointers.
+
+2004-08-17 Tuesday 21:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.41), Determinate.inlines.hh (1.39),
+	  algorithms.hh (1.28): Improved a little bit the docuemntation for
+	  the Determinate construction.  Removed a few seemingly useless
+	  methods. The polyhedron() methods renamed as element().
+
+2004-08-17 Tuesday 19:43  Abramo Bagnara
+
+	* src/checked_mpq.inlines.hh (altnum.8): Fixed unhandled native
+	  integer type behaviour.
+
+2004-08-17 Tuesday 19:39  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.9): Fixed unhandled native
+	  integer type behaviour.
+
+2004-08-17 Tuesday 19:33  Abramo Bagnara
+
+	* src/Makefile.am (altnum.6): Added Limits.hh
+
+2004-08-17 Tuesday 19:33  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.6): Fixed float96_t format
+	  oddities. Cleaned code.
+
+2004-08-17 Tuesday 19:31  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Limits.hh, checked.defs.hh, checked_int.inlines.hh
+	  (altnum.[4,5,1,7,6]): Fixed unhandled native integer type
+	  behaviour.
+
+2004-08-17 Tuesday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/gpl.txt (1.2): Spacing fixed.
+
+2004-08-17 Tuesday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.25): Distribute also README.configure.
+
+2004-08-17 Tuesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.83): One less thing to do.
+
+2004-08-17 Tuesday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS (1.4), CREDITS (1.13): Formatted.
+
+2004-08-17 Tuesday 14:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* README.configure (1.5): Corrected a typo and improved the
+	  English.
+
+2004-08-17 Tuesday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* BUGS (1.3), CREDITS (1.12), STANDARDS (1.14): English
+	  improvements made.
+
+2004-08-17 Tuesday 12:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.40), Determinate.inlines.hh (1.38),
+	  PowerSet.defs.hh (1.47), PowerSet.inlines.hh (1.57):
+	  Determinate::operator+(), Determinate::operator*(),
+	  PowerSet::operator+() and PowerSet::operator*() removed.
+
+2004-08-17 Tuesday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.11): Small English improvement.
+
+2004-08-17 Tuesday 11:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/bhz03widening2.cc (1.5): Redundant code removed.
+
+2004-08-17 Tuesday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.39), Determinate.inlines.hh (1.37):
+	  The methods grouped according to constness and space-dim
+	  preservation, as done for the class Polyhedron.  Two inline
+	  directives moved from *.defs.hh into *.inlines.hh.
+
+2004-08-17 Tuesday 10:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.94): Tests for adding and
+	  removing dimensions now include cases where no dimensions are
+	  added or removed and also when all the dimensions are removed.
+
+2004-08-17 Tuesday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.141): The descriptions of the add and
+	  remove dimensions operators improved.  The description of the
+	  concatenate operation moved to just before the description of the
+	  add dimensions operators.
+
+2004-08-17 Tuesday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.98), configure.ac (1.118), doc/Makefile.am (1.27): The
+	  documentation for users, in PostScript, PDF and HTML formats, is
+	  now installed in a standard place by `make install'.
+
+2004-08-17 Tuesday 09:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.38): Small improvements.
+
+2004-08-17 Tuesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.140): Added a section on constructions on
+	  polyhedra.
+
+2004-08-17 Tuesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.25): Started documenting the
+	  widening operators.
+
+2004-08-17 Tuesday 09:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh (1.4),
+	  BHRZ03_Certificate.inlines.hh (1.2), H79_Certificate.cc (1.2),
+	  H79_Certificate.defs.hh (1.3), H79_Certificate.inlines.hh (1.2):
+	  H79_Certificate simplified by removing useless methods. The
+	  documentation of BHRZ03_Certificate method is_stabilizing() now
+	  only appears in the developers manual. Both classes now appear in
+	  the user manual, as they provide documentation of the method
+	  needed by any new certificate.
+
+2004-08-17 Tuesday 09:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.111): Several minor
+	  "English" corrections and some cross references improved or
+	  added.
+
+2004-08-17 Tuesday 09:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.139): An anchor has been added and minor
+	  English improvement.
+
+2004-08-17 Tuesday 08:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: bhz03widening3.cc (1.3), bhz03widening6.cc (1.3),
+	  boundingbox2.cc (1.21), boundingbox4.cc (1.10): Comments revised
+	  in boundinbox2.cc and boundingbox4.cc.  Known result in
+	  bhz03widening3.cc added and checked.	New test added to
+	  bhz03widening6.cc for the case when the multiset ordering wrt the
+	  lgo is converging.
+
+2004-08-17 Tuesday 00:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bgp99extrapolation2.cc (1.4): Be quiet.
+
+2004-08-17 Tuesday 00:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/folddims2.cc (1.2): Removed test that was already made in
+	  folddims1.cc.  Comment revised.
+
+2004-08-17 Tuesday 00:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.205): Spurious backslash removed.
+
+2004-08-17 Tuesday 00:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bgp99extrapolation2.cc (1.3): Completed (and made more
+	  interesting).
+
+2004-08-16 Monday 21:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.204), folddims2.cc (1.1): Tests for NNC
+	  polyhedra added.
+
+2004-08-16 Monday 21:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/bgp99extrapolation2.cc (1.2): Comment corrected.
+
+2004-08-16 Monday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/h79widening6.cc (1.7): An example taken from CH78.
+
+2004-08-16 Monday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.203), bgp99extrapolation2.cc (1.1),
+	  h79widening6.cc (1.6): Test program h79widening6.cc renamed
+	  bgp99extrapolation2.cc.
+
+2004-08-16 Monday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.20): Added the `ppl_lcdd' program to the main
+	  package.  Require gcc-c++ to be exactly version 3.4.1.
+
+2004-08-16 Monday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/Makefile.am (1.3): The `ppl_lcdd' program will be
+	  installed in `bindir'.
+
+2004-08-16 Monday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.5), ppl.spec.in (1.19): Updated.
+
+2004-08-16 Monday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.138): Definition of the folding operation
+	  improved.
+
+2004-08-16 Monday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.82): Some items postponed.  Main points of PPL 0.7
+	  drafted.
+
+2004-08-16 Monday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.22): Typo fixed.
+
+2004-08-16 Monday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/README (1.7): Updated.
+
+2004-08-16 Monday 18:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.defs.hh (1.3), H79_Certificate.defs.hh
+	  (1.2): Fixed the documentation of the certificates (for now, this
+	  will only appear in the developer manual).
+
+2004-08-16 Monday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.24),
+	  Polyhedra_PowerSet.inlines.hh (1.35): Fixed header inclusions.
+
+2004-08-16 Monday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.37), src/Polyhedron.defs.hh (1.240),
+	  doc/definitions.dox (1.137): Added a section about concatenation
+	  of polyhedra to the introduction of the user manual. Now the
+	  documentation of concatenate_assign() refers to it.
+
+2004-08-16 Monday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.54): Prolog_raise_exception()
+	  implemented.
+
+2004-08-16 Monday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.10): Specify that Andrea is with the University of
+	  Parma.  Email address omitted.
+
+2004-08-16 Monday 17:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.21): Formatting changes.
+
+2004-08-16 Monday 17:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.93): This test file now checks
+	  correctly that the exceptions do work ok.
+
+2004-08-16 Monday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.20): Updated.
+
+2004-08-16 Monday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.4): Added instructions about the use of
+	  Comeau C/C++ 4.3.3.
+
+2004-08-16 Monday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.97): Announce the new README.configure file.
+
+2004-08-16 Monday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.96): Drafted an announcement for the new Determinate,
+	  PowerSet and Polyhedra_PowerSet classes.
+
+2004-08-16 Monday 16:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.inlines.hh (1.33): Fixed
+	  ConSys::max_space_dimension().
+
+2004-08-16 Monday 14:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/bhz03widening6.cc (1.2): Comments added.
+
+2004-08-16 Monday 14:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.202), bhz03widening6.cc (1.1): dded more
+	  tests.
+
+2004-08-16 Monday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.81): Some items postponed.  Main points of PPL 0.7
+	  drafted.
+
+2004-08-16 Monday 12:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.95): Announce the new "expand" and "fold" operations.
+
+2004-08-16 Monday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.201), bhz03widening4.cc (1.1),
+	  bhz03widening5.cc (1.1): New tests are the same as
+	  bhz03widening1.cc and bhz03widening2.cc, but use the
+	  H79_Certificate instead of BHRZ03_Certificate.
+
+2004-08-16 Monday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: H79_Certificate.cc (1.1), H79_Certificate.defs.hh (1.1),
+	  H79_Certificate.inlines.hh (1.1), H79_Certificate.types.hh (1.1),
+	  Makefile.am (1.74), Polyhedra_PowerSet.defs.hh (1.23),
+	  Polyhedra_PowerSet.inlines.hh (1.34), Polyhedron.defs.hh (1.239):
+	  Added the H79 widening certificate.  The certificate-based
+	  widening methods for the Polyhedra_Powerset domain made generic
+	  by parameterizing the certificate used. The instance using the
+	  BHRZ03_Certificate still have the old name (so as old code still
+	  works).
+
+2004-08-16 Monday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.94), Watchdog/NEWS (1.4): Our tentative release date is
+	  August 18, 2004.
+
+2004-08-16 Monday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.17), Watchdog/ChangeLog (1.7): Updated.
+
+2004-08-16 Monday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.14): In
+	  Polyhedron::fold_dimensions(const Variables_Set&, Variable)
+	  correctly handle the case where the set is empty.
+
+2004-08-15 Sunday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.105), ppl_c.h.in (1.31): New C
+	  interface functions ppl_Polyhedron_expand_dimension() and
+	  ppl_Polyhedron_fold_dimensions().
+
+2004-08-15 Sunday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.13): Polyhedron::fold_dimensions()
+	  now checks its interface invariants.
+
+2004-08-15 Sunday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.238): Completed the documentation of
+	  Polyhedron::fold_dimensions().
+
+2004-08-15 Sunday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.136): Set-cardinality notation explained.
+
+2004-08-15 Sunday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.22): Do not mix extern "C" pointers
+	  and extern "C++" pointers: they are different types.
+
+2004-08-15 Sunday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.135): Drafted a formal definition of the
+	  "fold_dimensions" operation.
+
+2004-08-15 Sunday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.14): Added the definition of the set-cardinality
+	  operator `\card'.
+
+2004-08-15 Sunday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.134), src/Polyhedron.defs.hh (1.237):
+	  Added placeholder and reference to the (yet to be written)
+	  section on folding dimensions.
+
+2004-08-15 Sunday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: boundingbox1.cc (1.36), boundingbox3.cc (1.12),
+	  boundingbox4.cc (1.9): Comments corrected/revised.
+
+2004-08-15 Sunday 10:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.110): Documentation for
+	  the ppl_Polyhedron_expand_dimension/3 and
+	  ppl_Polyhedron_fold_dimensions/3 predicates, added.
+
+2004-08-15 Sunday 10:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.92): A bug has been fixed.  The
+	  tests for the bounding box predicates improved.
+
+2004-08-15 Sunday 10:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: boundingbox1.cc (1.35), boundingbox2.cc (1.20),
+	  boundingbox3.cc (1.11), boundingbox4.cc (1.8): The tests for
+	  shrink_bounding_box() and building polyhedra from boxes have been
+	  revised.
+
+2004-08-15 Sunday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.21): Catch and handle the
+	  exceptions that may be raised.
+
+2004-08-15 Sunday 08:44  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.8): Added conversion from mpz
+	  to int.
+
+2004-08-15 Sunday 00:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.20): Missing include files added.
+	  Reduced the scope of some variables in set_alarm_on_cpu_time().
+
+2004-08-14 Saturday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.3): Added instructions on how to use the
+	  Intel C/C++ compiler.
+
+2004-08-14 Saturday 23:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.117): Version number bumped.	Require Autoconf
+	  2.59 or later.
+
+2004-08-14 Saturday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox5.cc (1.2): Be quiet.
+
+2004-08-14 Saturday 23:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Ph_Status.idefs.hh (1.6): Inclusion guard added.
+
+2004-08-14 Saturday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Integer.defs.hh (altnum.5): Friend declarations
+	  fixed.
+
+2004-08-14 Saturday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Checked_Integer.inlines.hh (altnum.6): Horrible kludge to fix
+	  a bug in Checked_Integer<T>::Checked_Integer(U), where U is some
+	  native integral type.
+
+2004-08-14 Saturday 10:11  Abramo Bagnara
+
+	* src/checked_mpz.inlines.hh (altnum.7): Fixed unsigned/signed
+	  typo.
+
+2004-08-14 Saturday 10:10  Abramo Bagnara
+
+	* src/: Checked_Integer.inlines.hh, Checked_Number.inlines.hh,
+	  checked.defs.hh, checked_float.inlines.hh, checked_mpq.inlines.hh
+	  (altnum.[5,4,6,5,7]): Fixed code formatting.
+
+2004-08-14 Saturday 08:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (altnum.5): Include the contents of
+	  Integer.inlines.hh in ppl_install.hh.
+
+2004-08-14 Saturday 00:04  Abramo Bagnara
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[6,6]): Fixed signed/unsigned conversion.
+
+2004-08-13 Friday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bhz03widening3.cc (1.2): Be quiet.
+
+2004-08-13 Friday 19:21  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[5,5,5]): Always pass 'from'
+	  arguments by reference in inline helper functions
+
+2004-08-13 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: checked_mpq.inlines.hh, checked_mpz.inlines.hh
+	  (altnum.[4,4]): Qualified name is not allowed in namespace member
+	  declaration.
+
+2004-08-13 Friday 18:05  Abramo Bagnara
+
+	* configure.ac (altnum.4): Added AM_CONDITIONAL for new checked
+	  code.
+
+2004-08-13 Friday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.10), src/Makefile.am (1.73): Version info
+	  updated for the libtool libraries.
+
+2004-08-13 Friday 17:29  Abramo Bagnara
+
+	* src/checked.defs.hh (altnum.4): More explicit name for function
+	  container
+
+2004-08-13 Friday 17:20  Abramo Bagnara
+
+	* src/float.types.hh (altnum.2): Renamed float basic type.
+
+2004-08-13 Friday 17:19  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh,
+	  checked_int.inlines.hh, checked_mpq.inlines.hh,
+	  checked_mpz.inlines.hh (altnum.[3,3,5,3,3]): Added many const.
+	  Renamed float basic type.
+
+2004-08-13 Friday 17:19  Abramo Bagnara
+
+	* src/checked_float.inlines.hh (altnum.4): Added pred/succ.
+
+2004-08-13 Friday 17:17  Abramo Bagnara
+
+	* src/Makefile.am (altnum.4): Adjusted for use of new checked code.
+
+2004-08-13 Friday 17:17  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Checked_Number.types.hh (altnum.[3,3,2]): Added policy to
+	  Checked_Numbers. Added operator from basic types.
+
+2004-08-13 Friday 17:07  Abramo Bagnara
+
+	* src/Checked_Number.cc (altnum.2): Removed empty file.
+
+2004-08-13 Friday 17:06  Abramo Bagnara
+
+	* src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+	  GMP_Integer.defs.hh, GMP_Integer.inlines.hh, Integer.defs.hh,
+	  Integer.inlines.hh, Integer.types.hh, Native_Integer.defs.hh,
+	  Native_Integer.inlines.hh (altnum.[4,4,3,3,4,1,4,4,4]): Shared
+	  definitions and declarations Integer_{zero,one}.
+
+2004-08-13 Friday 16:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.9), doc/devref.tex (1.14), doc/user.tex (1.15):
+	  Authors lists adapted to reality.
+
+2004-08-13 Friday 16:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.116): Version number bumped.
+
+2004-08-13 Friday 16:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.13): Slightly modified the policy for the list of
+	  parameters: for increased flexibility, detailed comments may
+	  occur both before and after the list.
+
+2004-08-13 Friday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.21), C_Polyhedron.defs.hh (1.22),
+	  ConSys.defs.hh (1.83), Determinate.defs.hh (1.36), GenSys.defs.hh
+	  (1.96), Generator.defs.hh (1.87), Matrix.defs.hh (1.58),
+	  NNC_Polyhedron.defs.hh (1.25), Polyhedra_PowerSet.defs.hh (1.22),
+	  Polyhedron.defs.hh (1.236), Row.defs.hh (1.79), SatMatrix.defs.hh
+	  (1.34), conversion.cc (1.53), globals.hh (1.37), minimize.cc
+	  (1.36), simplify.cc (1.35): All parameter lists formatted
+	  according to the new policy in STANDARDS.
+
+2004-08-13 Friday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/.cvsignore (1.6), tests/.cvsignore (1.9):
+	  Updated.
+
+2004-08-13 Friday 15:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.91): Tests for
+	  ppl_new_Polyhedron_from_bounding_box/3 that use the empty box as
+	  input have been added.  Unwanted code removed.
+
+2004-08-13 Friday 14:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.93), interfaces/Prolog/ppl_prolog.icc (1.134): Fixed a
+	  bug in the Prolog interface predicate
+	  ppl_new_Polyhedron_from_bounding_box/3 whereby the predicate was
+	  failing when given an empty bounding box.
+
+2004-08-13 Friday 14:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.90): Improved documentation and
+	  tests.
+
+2004-08-13 Friday 12:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.235), Polyhedron_nonpublic.cc (1.20):
+	  Some parameters renamed so as to be more consistent with the rest
+	  of the code.
+
+2004-08-13 Friday 12:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.80): Updated.
+
+2004-08-13 Friday 12:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/version.hh.in (1.9): Split the brief and detailed parts of a
+	  couple of doxygen comments.
+
+2004-08-13 Friday 12:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.30): Split a few brief comments where
+	  seemingly appropriate.  Started applying the new formatting
+	  policy for doxygen lists of parameters.
+
+2004-08-13 Friday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.12): Drafted a policy for the formatting of
+	  parameter lists in doxygen comments.
+
+2004-08-13 Friday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.72): ppl.hh and ppl_install.hh also depend on
+	  version.hh.
+
+2004-08-13 Friday 11:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.92): Fixed a bug in the Prolog interface predicate
+	  ppl_Polyhedron_get_bounding_box/3 whereby a wrong result was
+	  sometimes computed in the case of an empty polyhedron.
+
+2004-08-13 Friday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.inlines.hh (1.12): BoundingBox::set_empty() now
+	  empties all the intervals.
+
+2004-08-13 Friday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: boundingbox1.cc (1.34), boundingbox2.cc (1.19),
+	  boundingbox3.cc (1.10), boundingbox4.cc (1.7): Comments fixed.
+
+2004-08-13 Friday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.200), boundingbox5.cc (1.1): New test for
+	  Polyhedron::shrink_bounding_box().
+
+2004-08-13 Friday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.89): Improved comments and
+	  better sequence of tests for the widening and extrapolation
+	  operators.
+
+2004-08-13 Friday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.37),
+	  devref-print.doxyconf-latex.in (1.37), devref.doxyconf-html.in
+	  (1.38), user-browse.doxyconf-latex.in (1.20),
+	  user-print.doxyconf-latex.in (1.20), user.doxyconf-html.in
+	  (1.22): Use the `:=' operator to PREDEFINE __P: this prevents the
+	  definition to be undefined by `#undef'.
+
+2004-08-13 Friday 08:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.88): Added simpler test defined
+	  by predicate boundingbox_test/0 to show bug in
+	  ppl_Polyhedron_get_bounding_box/3 predicate when the polyhedron
+	  is empty. Test can be run using check_noisy/0.
+
+2004-08-13 Friday 00:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.19), doc/devref-browse.doxyconf-latex.in (1.36),
+	  doc/devref-print.doxyconf-latex.in (1.36),
+	  doc/devref.doxyconf-html.in (1.37): The file statistics.hh has
+	  been removed.
+
+2004-08-13 Friday 00:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.79): Harmonization of methods Polyhedron::throw_*() dealt
+	  with.
+
+2004-08-13 Friday 00:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.9), Constraint.cc (1.41),
+	  Constraint.defs.hh (1.87), Constraint.inlines.hh (1.49),
+	  Generator.cc (1.49), Generator.defs.hh (1.86),
+	  Generator.inlines.hh (1.43), Matrix.defs.hh (1.57),
+	  Ph_Status.idefs.hh (1.5), Poly_Con_Relation.defs.hh (1.24),
+	  Poly_Gen_Relation.defs.hh (1.22), Polyhedron.defs.hh (1.234),
+	  Polyhedron.inlines.hh (1.93), Polyhedron_chdims.cc (1.12),
+	  Polyhedron_nonpublic.cc (1.19), Polyhedron_public.cc (1.25),
+	  Polyhedron_widenings.cc (1.21), Row.defs.hh (1.78): The various
+	  methods throw_incompatible_*() made more consistent with each
+	  other, as well as the way they are called.  When closing a
+	  doxygen comment group with @}, made clear the group closed.
+
+2004-08-12 Thursday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.91): Mention that a bug has been fixed in
+	  Polyhedron::poly_difference_assign(const Polyhedron&).
+
+2004-08-12 Thursday 18:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.87), ppl_prolog.icc (1.133),
+	  Ciao/ciao_pl_check.pl (1.4), Ciao/ppl_ciao.pl (1.66),
+	  GNU/ppl_gprolog.pl (1.45), SICStus/ppl_sicstus_sd.cc (1.62),
+	  SWI/ppl_swiprolog.cc (1.87), XSB/ppl_xsb.H (1.32), XSB/ppl_xsb.cc
+	  (1.53), XSB/xsb_pl_check.P (1.9), YAP/ppl_yap.cc (1.80): Added
+	  interface predicate for fold_dimensions().  Added test for this
+	  predicate.
+
+2004-08-12 Thursday 17:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.86): Bugs introduced by adding
+	  full stops corrected.
+
+2004-08-12 Thursday 17:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.24): The patch for poly-difference
+	  operator seems to be the right solution: CHECKME removed.
+
+2004-08-12 Thursday 17:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.133), src/Polyhedron.defs.hh (1.233):
+	  Pedantic correction to the explanation of poly-difference.
+
+2004-08-12 Thursday 17:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.29): Simplified comments about
+	  poly-hull operators.	For the poly-difference, added reference to
+	  appropriate section of the manual.
+
+2004-08-12 Thursday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.2), TODO (1.78): Explained the basics about
+	  configuring GMP and the PPL, as far as selecting the right
+	  version of GPM is concerned.
+
+2004-08-12 Thursday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.77), doc/definitions.dox (1.132): Added a paragraph
+	  explaining that PPL types should not be used polymorphically.
+	  This is at the beginning of section 7 (The library), since it is
+	  specific of the C++ language.
+
+2004-08-12 Thursday 15:14  Abramo Bagnara
+
+	* src/Integer.defs.hh (altnum.3): Fixed typos including new files.
+
+2004-08-12 Thursday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Integer.defs.hh, src/Integer.types.hh
+	  (altnum.[3,2,3]): First go at a setup that allows to test the new
+	  checked code against the old one.  The configure option
+	  `--enable-new-checked-code' does what is expected.
+
+2004-08-12 Thursday 12:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.76), doc/definitions.dox (1.131): Small improvement to
+	  the discussion about the use of iterators and references.
+
+2004-08-12 Thursday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.28): Corrected two doxygen comments:
+	  "const iterator system" --> "const iterator".
+
+2004-08-12 Thursday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.130): Drafted a section providing a
+	  warning about the possible invalidation of references and
+	  iterators.
+
+2004-08-12 Thursday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac, src/Integer.types.hh, src/Makefile.am
+	  (altnum.[2,2,3]): Do not use C types like char, short, long and
+	  long long.  Use the fixed width types int8_t, int16_t, int32_t
+	  and int64_t instead.
+
+2004-08-12 Thursday 10:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/folddims1.cc (1.2): A number of different tests for
+	  fold_dimensions() added.
+
+2004-08-12 Thursday 10:20  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.4): Added preliminary
+	  optimizations.
+
+2004-08-12 Thursday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/checked_float.inlines.hh (altnum.3): Parenthesis moved
+	  outside #if/#endif block.
+
+2004-08-12 Thursday 09:49  Abramo Bagnara
+
+	* src/checked.inlines.hh (altnum.2): Missing file from previous
+	  commit (policy addition).
+
+2004-08-12 Thursday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.23): Added a comment to the
+	  implementation of Polyhedron::poly_difference_assign().
+
+2004-08-12 Thursday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.85): Given a proper reference to
+	  the work of Gopan et al.  Comments terminated by a full-stop.
+
+2004-08-12 Thursday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.132): Indentation fixed.
+
+2004-08-12 Thursday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.199), expanddim1.cc (1.7), expanddim2.cc
+	  (1.1): Tests that are specific to NNC polyhedra must go in
+	  separate files: expanddim2.cc cut out from expanddim1.cc.
+
+2004-08-12 Thursday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/expanddim1.cc (1.6): Biobliographic reference fixed.
+
+2004-08-12 Thursday 08:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.84): Added another (simple) test
+	  for the poly difference predicate; Added a test for the
+	  expand_dimension predicate based on that in the TACAS04 paper on
+	  page 519.
+
+2004-08-12 Thursday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/expanddim1.cc (1.5): Added test corresponding to example in
+	  the TACAS04 paper on page 519.
+
+2004-08-12 Thursday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/expanddim1.cc (1.4): We always terminate sentences with a
+	  full stop.
+
+2004-08-11 Wednesday 23:49  Abramo Bagnara
+
+	* src/checked_int.inlines.hh (altnum.3): Changed approach to
+	  checked add/sub to avoid undefined behaviour caused by out of
+	  range expressions.
+
+2004-08-11 Wednesday 22:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.83): Test for
+	  ppl_Polyhedron_poly_difference_assign corrected.
+
+2004-08-11 Wednesday 21:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.82), ppl_prolog.icc (1.131),
+	  Ciao/ciao_pl_check.pl (1.3), Ciao/ppl_ciao.pl (1.65),
+	  GNU/ppl_gprolog.pl (1.44), SICStus/ppl_sicstus_sd.cc (1.61),
+	  SWI/ppl_swiprolog.cc (1.86), XSB/ppl_xsb.H (1.31), XSB/ppl_xsb.cc
+	  (1.52), XSB/xsb_pl_check.P (1.8), YAP/ppl_yap.cc (1.79): Prolog
+	  interface predicate added for expand_dimension().  Test for new
+	  predicate added to pl_check.pl.
+
+2004-08-11 Wednesday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/expanddim1.cc (1.3): More tests added for testing
+	  expand_dimensions().
+
+2004-08-11 Wednesday 19:25  Abramo Bagnara
+
+	* src/: Checked_Number.defs.hh, Checked_Number.inlines.hh,
+	  Result_Info.defs.hh, checked.defs.hh, checked_float.cc,
+	  checked_float.defs.hh, checked_float.inlines.hh, checked_int.cc,
+	  checked_int.defs.hh, checked_int.inlines.hh, checked_mpq.cc,
+	  checked_mpq.defs.hh, checked_mpq.inlines.hh, checked_mpz.cc,
+	  checked_mpz.defs.hh, checked_mpz.inlines.hh
+	  (altnum.[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]): Added policy to
+	  checked functions. Deleted useless files. Confined checked
+	  functions and helper class to Checked namespace.
+
+2004-08-11 Wednesday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.22): Drafted a patch to correct bug
+	  shown by polydifference8.cc.
+
+2004-08-11 Wednesday 18:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.198), bhz03widening3.cc (1.1),
+	  polydifference8.cc (1.1): New test polydifference8.cc (extracted
+	  from bhz03wodening3.cc) shows a bug in method
+	  Polyhedron::poly_difference_assign().
+
+2004-08-11 Wednesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.197), folddims1.cc (1.1): Use folddims1.cc
+	  for testing Polyhedron::fold_dimensions().
+
+2004-08-11 Wednesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.21),
+	  Polyhedra_PowerSet.inlines.hh (1.33): Use BHRZ03_Certificate
+	  instead of BHRZ03_info. First step towards generalizing the BHZ03
+	  widening to arbitrary certificates.
+
+2004-08-11 Wednesday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.232), Polyhedron.inlines.hh (1.92),
+	  Polyhedron_widenings.cc (1.20): Got rid of all the stuff related
+	  to Polyhedron::BHRZ03_info, superseded by the class
+	  BHRZ03_Certificate.
+
+2004-08-11 Wednesday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/BHRZ03_Certificate.defs.hh (1.2): The comparison function is
+	  now provided with a brief and a detailed doxygen descriptions.
+
+2004-08-11 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/expanddim1.cc (1.2): Two new tests sketched.
+
+2004-08-11 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.11): Fixed a bug in
+	  Polyhedron::expand_dimension().  Polyhedron::fold_dimensions()
+	  drafted.
+
+2004-08-11 Wednesday 12:03  Abramo Bagnara
+
+	* src/: Checked_Number.cc, Checked_Number.defs.hh,
+	  Checked_Number.inlines.hh, Checked_Number.types.hh
+	  (altnum.[1,1,1,1]): Replacement for Checked_Integer and more
+
+2004-08-11 Wednesday 12:03  Abramo Bagnara
+
+	* src/float.types.hh (altnum.1): Native float type declaration
+
+2004-08-11 Wednesday 12:02  Abramo Bagnara
+
+	* src/Result_Info.defs.hh (altnum.1): Result info for checked
+	  functions
+
+2004-08-11 Wednesday 12:02  Abramo Bagnara
+
+	* src/: checked.defs.hh, checked.inlines.hh, checked_float.cc,
+	  checked_float.defs.hh, checked_float.inlines.hh, checked_int.cc,
+	  checked_int.defs.hh, checked_int.inlines.hh, checked_mpq.cc,
+	  checked_mpq.defs.hh, checked_mpq.inlines.hh, checked_mpz.cc,
+	  checked_mpz.defs.hh, checked_mpz.inlines.hh
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1]): Checked functions for
+	  int, float, mpz and mpq
+
+2004-08-11 Wednesday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.10), tests/Makefile.am (1.196),
+	  tests/expanddim1.cc (1.1): Added a prototype implementation of
+	  Polyhedron::expand_dimension(Variable var, dimension_type m).
+
+2004-08-09 Monday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.18): Started revision for the PPL 0.6 release.
+
+2004-08-09 Monday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.75): Section on portability migrated to README.configure.
+	  Section on constructions on polyhedra revised.
+
+2004-08-09 Monday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README.configure (1.1): New file describing the PPL-specific
+	  aspects of configuration, compilation and installation of the
+	  library.
+
+2004-08-09 Monday 20:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.26), fdl.txt (1.1), gpl.txt (1.1): We now
+	  distribute the GPL and the FDL also in text format (so as not to
+	  assume that users have Doxygen and/or LaTeX and/or a
+	  PostScript/PDF viewer).
+
+2004-08-09 Monday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.11), Makefile.am (1.71), Polyhedron_widenings.cc
+	  (1.19), statistics.hh (1.4): Dealt with all the stuff needed to
+	  collect statistics about the BHRZ03 widening operator.
+
+2004-08-09 Monday 10:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.74), src/Polyhedron.defs.hh (1.231),
+	  src/Polyhedron.inlines.hh (1.91): In
+	  Polyhedron::map_dimensions(const PartialFunction&), the method
+	  PartialFunction::maps() is now called at most `n' times, where
+	  `n' is the dimension of the vector space enclosing the
+	  polyhedron.
+
+2004-08-09 Monday 08:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.90), TODO (1.73), interfaces/Prolog/ppl_prolog.icc
+	  (1.130), src/Polyhedra_PowerSet.inlines.hh (1.32),
+	  src/PowerSet.inlines.hh (1.56), src/conversion.cc (1.52),
+	  src/globals.cc (1.14), src/globals.hh (1.36), tests/watchdog1.cc
+	  (1.20): The variable `abandon_exponential_computations' has been
+	  renamed `abandon_expensive_computations'.  Its documentation has
+	  also been revised.
+
+2004-08-08 Sunday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.18): Two FIXMEs dealt with.
+
+2004-08-08 Sunday 19:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.89), demos/ppl_lcdd/ppl_lcdd.cc (1.19), src/version.hh.in
+	  (1.8): New macro PPL_VERSION expands to the version string of the
+	  library.
+
+2004-08-08 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.88), Watchdog/Makefile.am (1.9), Watchdog/Watchdog.cc
+	  (1.17), Watchdog/Watchdog.defs.hh (1.13),
+	  Watchdog/Watchdog.inlines.hh (1.11),
+	  interfaces/Prolog/ppl_prolog.icc (1.129), tests/watchdog1.cc
+	  (1.19): Watchdog library completely reorganized.  Deadlock bug
+	  fixed in the process.
+
+2004-08-08 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/Makefile.am (1.2): Distribute the
+	  examples.
+
+2004-08-08 Sunday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.types.hh (1.11): Namespace closing brace
+	  commented.
+
+2004-08-08 Sunday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Handler.defs.hh (1.1), Handler.inlines.hh (1.1),
+	  Handler.types.hh (1.1): Classes for handlers of the watchdog
+	  events.
+
+2004-08-08 Sunday 18:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.129): Corrected a typo.
+
+2004-08-08 Sunday 12:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.230): Documentation on map_dimensions
+	  wrt the specification of pfunc revised.
+
+2004-08-08 Sunday 10:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.229): Added to documentation of
+	  map_dimensions, in the specification of the partial function
+	  pfunc/2, an indication of the number of times the different
+	  methods will be called.
+
+2004-08-07 Saturday 19:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.19), Watchdog/ltmain.sh (1.8): Updated from Libtool
+	  1.5.8.
+
+2004-08-07 Saturday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Pending_List.cc (1.1), Pending_List.defs.hh (1.1),
+	  Pending_List.inlines.hh (1.1), Pending_List.types.hh (1.1): An
+	  ordered list for recording pending watchdog events.
+
+2004-08-07 Saturday 08:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: EList.defs.hh (1.3), EList.inlines.hh (1.2): The
+	  clear() method has been removed.  The destructor now destructs
+	  also the elements in the list.
+
+2004-08-06 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Pending_Element.cc (1.1), Pending_Element.defs.hh
+	  (1.1), Pending_Element.inlines.hh (1.1), Pending_Element.types.hh
+	  (1.1): A class for pending watchdog events with embedded links.
+
+2004-08-06 Friday 18:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Doubly_Linked_Object.defs.hh (1.1),
+	  Doubly_Linked_Object.inlines.hh (1.1),
+	  Doubly_Linked_Object.types.hh (1.1): A (base) class for doubly
+	  linked objects.
+
+2004-08-06 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: EList_Iterator.defs.hh (1.1),
+	  EList_Iterator.inlines.hh (1.1), EList_Iterator.types.hh (1.1): A
+	  class providing iterators for embedded lists.
+
+2004-08-06 Friday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/EList.defs.hh (1.2): Class comment revised.
+
+2004-08-06 Friday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: EList.defs.hh (1.1), EList.inlines.hh (1.1),
+	  EList.types.hh (1.1): A list of doubly linked objects (where the
+	  links are embedded in the objects themselves).
+
+2004-08-06 Friday 18:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Time.cc (1.1), Time.defs.hh (1.1), Time.inlines.hh
+	  (1.1), Time.types.hh (1.1): A class for representing and
+	  manipulating positive time intervals.
+
+2004-08-05 Thursday 08:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.72): ppl_Polyhedron_maximize,
+	  ppl_Polyhedron_maximize_with_point, and ppl_Polyhedron_minimize,
+	  ppl_Polyhedron_minimize_with_point have been added to the Prolog
+	  interface with corresponding additions to the documentation and
+	  pl_check.pl.	Todo item on this removed.
+
+2004-08-05 Thursday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+	  Checked_Integer.types.hh, GMP_Integer.defs.hh,
+	  GMP_Integer.inlines.hh, GMP_Integer.types.hh,
+	  Integer_traits_template.hh, Native_Integer.defs.hh,
+	  Native_Integer.inlines.hh, Native_Integer.types.hh
+	  (altnum.[3,3,2,2,2,2,2,3,3,2]): Copyright years updated.
+
+2004-08-04 Wednesday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.8), install-sh (1.9), Watchdog/depcomp (1.6),
+	  Watchdog/install-sh (1.6): Updated from Automake 1.9.
+
+2004-08-04 Wednesday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.87), configure.ac (1.115), demos/Makefile.am (1.3),
+	  demos/ppl_lcdd/Makefile.am (1.2),
+	  demos/ppl_lcdd/examples/.cvsignore (1.1),
+	  demos/ppl_lcdd/examples/Makefile.am (1.1),
+	  demos/ppl_lpsol/.cvsignore (1.1), demos/ppl_lpsol/Makefile.am
+	  (1.1), demos/ppl_lpsol/expected (1.1),
+	  demos/ppl_lpsol/ppl_lpsol.c (1.1),
+	  demos/ppl_lpsol/examples/.cvsignore (1.1),
+	  demos/ppl_lpsol/examples/Makefile.am (1.1),
+	  demos/ppl_lpsol/examples/afiro.mps (1.1),
+	  demos/ppl_lpsol/examples/bgprtr.mps (1.1),
+	  demos/ppl_lpsol/examples/ex1.mps (1.1),
+	  demos/ppl_lpsol/examples/sample.mps (1.1),
+	  demos/ppl_lpsol/examples/unboundedmin.mps (1.1),
+	  interfaces/C/Makefile.am (1.17): All demos are now under the
+	  `demos' directory.
+
+2004-08-04 Wednesday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.28): The source
+	  `fake_mail.pl' has gone long time ago.
+
+2004-08-04 Wednesday 20:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.23), config.sub (1.22), Watchdog/config.guess
+	  (1.7), Watchdog/config.sub (1.7): Updated.
+
+2004-08-04 Wednesday 20:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.71): The Polyhedron::*recycled*() methods do not make
+	  sense for the Prolog interface.
+
+2004-08-04 Wednesday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: adddimensions11.cc, dualhypercubes.cc (altnum.[1,1]): The
+	  main program must catch exceptions.
+
+2004-08-04 Wednesday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.70): Some things to do will only be done in PPL 0.7 or
+	  later version.
+
+2004-08-04 Wednesday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Interval.defs.hh, Interval.inlines.hh (altnum.[2,2]):
+	  Returning by const reference when appropriate. (numerator and
+	  denominator).
+
+2004-08-04 Wednesday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Checked_Integer.defs.hh, Checked_Integer.inlines.hh,
+	  Native_Integer.defs.hh, Native_Integer.inlines.hh
+	  (altnum.[2,2,2,2]): Use Integer_macros.hh to declare and define
+	  all the required functions.
+
+2004-08-04 Wednesday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (altnum.2): Wrongly-named variable references
+	  fixed.
+
+2004-08-04 Wednesday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Integer_macros.hh, Makefile.am (altnum.[1,2]): Helper
+	  macros for the implementation of Native_Integer and
+	  Checked_Integer.
+
+2004-08-04 Wednesday 15:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (altnum.1): Temporarily disable the `interfaces'
+	  directory.
+
+2004-08-04 Wednesday 13:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS, configure.ac, src/BoundingBox.cc,
+	  src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+	  src/Checked_Integer.defs.hh, src/Checked_Integer.inlines.hh,
+	  src/Checked_Integer.types.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/GMP_Integer.defs.hh, src/GMP_Integer.inlines.hh,
+	  src/GMP_Integer.types.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Integer.defs.hh,
+	  src/Integer.types.hh, src/Integer_traits_template.hh,
+	  src/Interval.defs.hh, src/Interval.inlines.hh,
+	  src/LinExpression.cc, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Native_Integer.defs.hh, src/Native_Integer.inlines.hh,
+	  src/Native_Integer.types.hh, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Polyhedron_nonpublic.cc,
+	  src/Polyhedron_public.cc, src/Polyhedron_widenings.cc,
+	  src/Row.cc, src/Row.defs.hh, src/Row.inlines.hh,
+	  src/conversion.cc, src/globals.cc, src/globals.hh, tests/BBox.cc,
+	  tests/BBox.hh, tests/Makefile.am
+	  (altnum.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Imported, with changes, from the `altnum' branch of the students'
+	  repository.  As the Purenum project seems dead, support for
+	  Purenum has been evicted.  Notice that both native and checked
+	  integers do not currently work due to the absence of some
+	  relational operators.
+
+2004-07-15 Thursday 18:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.18): Option `-c' (`--check')
+	  implemented.
+
+2004-07-15 Thursday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/: 1d.ine (1.1), 1da.ine (1.1), cp4.ext
+	  (1.1), cp4.ine (1.1), cp5.ext (1.1), cp5.ine (1.1), cp6.ext
+	  (1.1), cp6.ine (1.1), cp7.ext (1.1), cross4.ine (1.1), cube.ext
+	  (1.1), cube.ine (1.1), cubetop.ine (1.1), cut16_11.ext (1.1),
+	  cut32_16.ext (1.1), cyc.ine (1.1), cyclic17_8.ine (1.1),
+	  cyclic25_13.ext (1.1), diamond.ine (1.1), in0.ine (1.1), in1.ine
+	  (1.1), in2.ine (1.1), in3.ine (1.1), in4.ine (1.1), in5.ine
+	  (1.1), in6.ine (1.1), in7.ine (1.1), kq20_11_m.ine (1.1),
+	  metric40_11.ine (1.1), metric80_16.ine (1.1), mit.ine (1.1),
+	  mit288-281.ine (1.1), mit31-20.ine (1.1), mit41-16.ine (1.1),
+	  mit708-9.ine (1.1), mit71-61.ine (1.1), mit90-86.ine (1.1),
+	  mp5.ext (1.1), mp5.ine (1.1), mp5a.ine (1.1), mp6.ine (1.1),
+	  trunc10.ine (1.1), trunc7.ine (1.1), tsp5.ext (1.1), tsp5.ine
+	  (1.1): Borrowed, with some minor changes, from lrslib 042.
+
+2004-07-15 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/examples/: allzero.ine (1.1), ccc4.ext (1.1),
+	  ccc5.ext (1.1), ccc6.ext (1.1), ccp4.ext (1.1), ccp5.ext (1.1),
+	  ccp6.ext (1.1), cross10.ine (1.1), cross12.ine (1.1), cross6.ine
+	  (1.1), cross8.ine (1.1), cube10.ine (1.1), cube12.ine (1.1),
+	  cube3.ine (1.1), cube6.ine (1.1), cube8.ine (1.1), cubocta.ine
+	  (1.1), cyclic10-4.ext (1.1), cyclic12-6.ext (1.1), cyclic14-8.ext
+	  (1.1), cyclic16-10.ext (1.1), dodeca_m.ine (1.1), ex1.ine (1.1),
+	  grcubocta.ine (1.1), hexocta.ine (1.1), icododeca_m.ine (1.1),
+	  infeas.ine (1.1), integralpoints.ine (1.1), irbox20-4.ext (1.1),
+	  irbox200-4.ext (1.1), kkd18_4.ine (1.1), kkd27_5.ine (1.1),
+	  kkd38_6.ine (1.1), nonfull.ine (1.1), origin.ine (1.1),
+	  prodst62.ext (1.1), project1_m.ine (1.1), project1res.ine (1.1),
+	  project2_m.ine (1.1), project2res.ine (1.1), rcubocta.ine (1.1),
+	  redcheck.ext (1.1), reg24-5.ext (1.1), reg24-5.ine (1.1),
+	  reg600-5_m.ext (1.1), rhomtria_m.ine (1.1), sample.ine (1.1),
+	  sampleh1.ine (1.1), sampleh2.ine (1.1), sampleh3.ine (1.1),
+	  sampleh4.ine (1.1), sampleh5.ine (1.1), sampleh6.ine (1.1),
+	  sampleh7.ine (1.1), sampleh8.ine (1.1), samplev1.ext (1.1),
+	  samplev2.ext (1.1), samplev3.ext (1.1): Borrowed, with some minor
+	  changes, from cddlib 093c.
+
+2004-07-11 Sunday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.17): Append to the output file,
+	  instead of truncating it.
+
+2004-07-11 Sunday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.16): Error messages fixed.
+
+2004-07-10 Saturday 19:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.15): Fixed the handling of equality
+	  constraints in read_polyhedron().
+
+2004-07-10 Saturday 17:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.14): Corrected input and output of
+	  H-representations (a couple of sign errors).	When outputting
+	  rational coefficients, print 0 instead of 0/<denominator>.
+
+2004-07-10 Saturday 16:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.13): Bug fixed in function
+	  normalize().
+
+2004-07-10 Saturday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.12): Initial implementation of the
+	  `project' command (which seems to be unimplemented in the real
+	  lcdd).
+
+2004-07-10 Saturday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.11): Started adding a new option to
+	  check the result.  Bugs fixed in set_input() and set_output().
+	  Reject the `linearity' command when it does not appear before
+	  `begin'.
+
+2004-07-10 Saturday 01:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.10): Output made watertight.
+
+2004-07-09 Friday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.9): Several bugs fixed.  Formal
+	  parameters tightened.
+
+2004-07-09 Friday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.8): Obey the `-o' option.
+
+2004-07-09 Friday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.7): Make sure every non-empty
+	  generator system we create has at least one point.
+
+2004-07-09 Friday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.6): Input made more robust.
+
+2004-07-09 Friday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.5): Make sure points are created
+	  with the right denominator.
+
+2004-07-09 Friday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.4): Bug fixed in
+	  write_polyhedron().
+
+2004-07-09 Friday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.3): Input/output rewritten.
+
+2004-07-09 Friday 09:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.81): Some reorganisation of test
+	  predicates to match order of tests.  Improved handling of
+	  deletion of polyhedra in the exception tests.
+
+2004-07-09 Friday 08:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/ppl_lcdd/ppl_lcdd.cc (1.2): Started drafting the output
+	  function.  Several other improvements.
+
+2004-07-09 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/.cvsignore (1.3): Put under CVS control.
+
+2004-07-09 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.114), demos/.cvsignore (1.2), demos/Makefile.am
+	  (1.2), demos/ppl_lcdd.cc (1.2), demos/ppl_lcdd/.cvsignore (1.1),
+	  demos/ppl_lcdd/Makefile.am (1.1), demos/ppl_lcdd/ppl_lcdd.cc
+	  (1.1): The `ppl_lcdd' demo has now its own subdirectory.
+
+2004-07-08 Thursday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.16): Spacing fixed.
+
+2004-07-08 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.113): Added checks for getopt.h and signal.h.
+	  Added demos/Makefile to the output list.
+
+2004-07-08 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.24): Added `demos' to `SUBDIR'.
+
+2004-07-08 Thursday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* demos/: .cvsignore (1.1), Makefile.am (1.1), ppl_lcdd.cc (1.1):
+	  `ppl_lcdd' is a sort of clone of the cddlib test program `lcdd'.
+
+2004-07-08 Thursday 16:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.109): Brief
+	  descriptions of the new interface predicates are added.
+
+2004-07-08 Thursday 12:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.108): New Prolog
+	  interface predicates recently added have been added to the PPL
+	  Predicate List in the documentation for this interface.
+
+2004-05-26 Wednesday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.228): Fixed examples involving
+	  ConSys::insert() and GenSys::insert().
+
+2004-05-26 Wednesday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.86): Mention the documentation improvements.
+
+2004-05-21 Friday 22:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.112): Tests reordered so that an invalid
+	  combination of compiler options is detected earlier and diagnosed
+	  in an intelligible way.
+
+2004-05-09 Sunday 17:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.15): Anachronisms removed.
+
+2004-05-09 Sunday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.11), src/Polyhedra_PowerSet.inlines.hh (1.31),
+	  src/Polyhedron_public.cc (1.21), src/Polyhedron_widenings.cc
+	  (1.17), src/simplify.cc (1.34), tests/bhrz03widening14.cc (1.5),
+	  tests/bhrz03widening15.cc (1.7): All other things being equal,
+	  always prefer preincrement and predecrement to postincrement and
+	  postdecrement.
+
+2004-05-09 Sunday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_chdims.cc (1.9): Redundant test avoided.
+
+2004-05-08 Saturday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.68), Matrix.defs.hh (1.56),
+	  Polyhedron.inlines.hh (1.90): New declaration and implementation
+	  of Matrix::permute_columns().  Implementation of
+	  Polyhedron::map_dimensions() improved.
+
+2004-05-08 Saturday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.21): Missing dependency
+	  added.
+
+2004-05-07 Friday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.7): Code reordered.
+
+2004-05-07 Friday 21:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.51):
+	  Integer_to_integer_term() fixed.
+
+2004-05-07 Friday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/.cvsignore (1.5): Updated.
+
+2004-05-07 Friday 19:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.6): Small improvement to
+	  a comment.
+
+2004-05-07 Friday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.5): Kludge to to test the
+	  Prolog interface exceptions when converting PPL integers to XSB
+	  Prolog integer terms.
+
+2004-05-07 Friday 19:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BHRZ03_Certificate.cc (1.1), BHRZ03_Certificate.defs.hh
+	  (1.1), BHRZ03_Certificate.inlines.hh (1.1),
+	  BHRZ03_Certificate.types.hh (1.1): Put under CVS control.
+
+2004-05-07 Friday 19:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am (1.70), Polyhedron.defs.hh (1.227),
+	  Polyhedron_widenings.cc (1.16): Changed to use the new
+	  BHRZ03_Certificate class.  Current implementation for NNC
+	  polyhedra is an inefficient kludge, but should be correct. It
+	  will become efficient as soon as we implement lazy procedures for
+	  eps-minimization of NNC polyhedra.
+
+2004-05-07 Friday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.20): Avoid code
+	  duplication: Integer_to_integer_term() now uses
+	  Prolog_put_long().
+
+2004-05-07 Friday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/.cvsignore (1.5), SICStus/.cvsignore
+	  (1.5), SWI/.cvsignore (1.5), XSB/.cvsignore (1.4), YAP/.cvsignore
+	  (1.5): Updated.
+
+2004-05-07 Friday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/fake_main.pl (1.2): This is not necessary
+	  with new versions of Ciao Prolog.
+
+2004-05-07 Friday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.27): The previous change
+	  did not take into account that `ciaoc' always writes the object
+	  file in the same directory where the sources reside.	Copies
+	  restored, but now the copies are written in the right place.
+
+2004-05-07 Friday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/.cvsignore (1.3), src/.cvsignore (1.7),
+	  tests/.cvsignore (1.8): Updated.
+
+2004-05-07 Friday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.26), ciao_clpq.pl (1.9),
+	  ciao_clpq2.pl (1.4), ciao_pl_check.pl (1.2): New versions of Ciao
+	  Prolog no longer require the sources to be copied.
+
+2004-05-07 Friday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/Makefile.am (1.25), SICStus/Makefile.am
+	  (1.41), SWI/Makefile.am (1.34): Clean things up after `make
+	  check'.
+
+2004-05-07 Friday 10:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.80): Additional tests for system
+	  dependent exceptions when the integer values are max, max+1, min,
+	  or min-1.
+
+2004-05-07 Friday 10:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.79): More and improved tests for
+	  exceptions.  Code better commented and additional predicates for
+	  i/o etc reorganised.
+
+2004-05-07 Friday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.4): Corrected typo.
+
+2004-05-07 Friday 10:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.3): Added a definition
+	  for current_prolog_flag/3.
+
+2004-05-07 Friday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.19):
+	  Integer_to_integer_term() fixed.
+
+2004-05-06 Thursday 10:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.78): More tests for ppl Prolog
+	  interface exceptions added.
+
+2004-05-05 Wednesday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.33), swi_pl_check.pl
+	  (1.1): Use also pl_check.pl to test the SWI-Prolog interface.
+
+2004-05-05 Wednesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.40), sp_pl_check.pl
+	  (1.1): Use also pl_check.pl to test the SICStus-Prolog interface.
+
+2004-05-05 Wednesday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.24), ciao_pl_check.pl
+	  (1.1): Use also pl_check.pl to test the Ciao-Prolog interface.
+
+2004-05-05 Wednesday 10:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.77): Comment added explaining
+	  new code for exceptions tests
+
+2004-05-05 Wednesday 10:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.76): New tests for checking some
+	  possible exceptions in the C++ and Prolog interface added.
+
+2004-05-04 Tuesday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.226): Documentation for
+	  Polyhedron::expand_dimension() improved.  New method void
+	  Polyhedron::void fold_dimensions(const Variables_Set&
+	  to_be_folded, Variable var) declared: documentation still to be
+	  written.
+
+2004-05-04 Tuesday 21:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.128), src/Polyhedron.defs.hh (1.225): New
+	  declaration and documentation for void
+	  Polyhedron::expand_dimension(Variable var, dimension_type m).
+
+2004-05-04 Tuesday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.127): Added a section on the new
+	  `expand_dimension' operation.
+
+2004-05-04 Tuesday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.126): Additions to the bibliography.
+
+2004-05-04 Tuesday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.125): Definition of `map_dimensions'
+	  improved.
+
+2004-04-30 Friday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.11), ppl_prolog.icc (1.128),
+	  Ciao/ppl_ciao.cc (1.23), GNU/ppl_gprolog_sd.cc (1.18),
+	  SICStus/ppl_sicstus_sd.cc (1.60), SWI/ppl_swiprolog.cc (1.85),
+	  XSB/ppl_xsb.cc (1.50), YAP/ppl_yap.cc (1.78): Deal with different
+	  representations for integers in Prolog and C++ code.
+
+2004-04-30 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.104): Handle std::overflow_error.
+
+2004-04-30 Friday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.103), ppl_c.h.in (1.27): Missing
+	  try/catch blocks added.  Interface changed for
+	  ppl_version_major(), ppl_version_minor(), ppl_version_revision(),
+	  ppl_version_beta(), ppl_version() and ppl_banner().
+
+2004-04-30 Friday 16:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.102): CATCH_ALL fixed: was translating
+	  std::exception to PPL_ERROR_INTERNAL_ERROR instead of
+	  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION.
+
+2004-04-27 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.111), interfaces/OCaml/.cvsignore (1.3),
+	  interfaces/OCaml/Makefile.am (1.8), interfaces/OCaml/gmp.h (1.2),
+	  interfaces/OCaml/ppl_ocaml_c.swg (1.3): Our OCaml interface will
+	  not be based on SWIG.
+
+2004-04-26 Monday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_pl_check.pl (1.5): Previous change
+	  reverted.
+
+2004-04-26 Monday 22:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/YAP/yap_pl_check.pl (1.4): Paths to pl_check.pl
+	  and yap_pl_check.pl need to allow for working in a separate build
+	  directory.
+
+2004-04-26 Monday 22:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.75): Bug fixed in
+	  "format_banner" code.  Definitions of "make_noisy" and
+	  "make_quiet" corrected.  Added a new top-level predicate
+	  "check_noisy/0" since "check_all" is now forced to be quiet.	A
+	  redundant temporary test removed.
+
+2004-04-26 Monday 22:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.127): Removed unwanted line
+	  in ..._relations_with_constraints procedure.	Modified
+	  .._relations_with_generator procedure to be in line with changes
+	  to ..._relations_with_constraints procedure.
+
+2004-04-26 Monday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.126): Do not call any
+	  Prolog_put_*() function on a destination term that does not
+	  represent a free variable.
+
+2004-04-26 Monday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.20): Infrastructure for
+	  automatic testing with pl_check.pl completed.
+
+2004-04-26 Monday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_pl_check.P (1.2): Initial goal fixed.
+
+2004-04-26 Monday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.19), xsb_pl_check.P (1.1):
+	  Use also pl_check.pl when testing the XSB interface.
+
+2004-04-26 Monday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.49): Some assertion fixed: we
+	  cannot assume XSB's TRUE evaluates to C++'s true.
+
+2004-04-26 Monday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.74): A predicate is either
+	  static or dynamic (noisy/1).	The predicate retractall/1 is
+	  non-standard: do not use it.
+
+2004-04-25 Sunday 22:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.10), ppl_prolog.icc (1.125):
+	  New error handling code completed.
+
+2004-04-25 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.7), install-sh (1.8), mkinstalldirs (1.7),
+	  Watchdog/depcomp (1.5), Watchdog/install-sh (1.5),
+	  Watchdog/mkinstalldirs (1.3): Updated from Automake 1.8.4.
+
+2004-04-25 Sunday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.124): Previous changes
+	  reverted.  Rewritten a good part of the error handling code.
+	  Several bugs fixed.
+
+2004-04-25 Sunday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/exceptions.hh (1.9): Exception classes revised.
+
+2004-04-25 Sunday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.84): Prolog_put_long()
+	  and Integer_to_integer_term() implemented properly.  Added
+	  Prolog_put_ulong().
+
+2004-04-25 Sunday 22:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.59): The wrong
+	  exception was thrown by integer_term_to_Integer(): fixed.
+
+2004-04-25 Sunday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic (1.8): Added
+	  Prolog_put_ulong().
+
+2004-04-25 Sunday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.48): Added a temporary, buggy
+	  version of Prolog_put_ulong().  All the XSB c2p_*() functions
+	  require that the second argument is an unbound variable:
+	  assertions added to check that we abide by this rule.
+
+2004-04-25 Sunday 21:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.22),
+	  GNU/ppl_gprolog_sd.cc (1.17), YAP/ppl_yap.cc (1.77): Added a
+	  temporary, buggy version of Prolog_put_ulong().
+
+2004-04-25 Sunday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.73): Previous changes reverted.
+
+2004-04-25 Sunday 11:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.72), ppl_prolog.icc (1.123):
+	  Bug in an interface predicate
+	  (ppl_Polyhedron_relation_with_constraints) that only caused an
+	  error with the XSB interface now fixed.  pl_check revised to
+	  avoid warning messages with XSB compiler.
+
+2004-04-24 Saturday 23:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.83): SWI Prolog does
+	  not support unlimited precision integers.
+
+2004-04-24 Saturday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.21): If GMP does not support exceptions this
+	  test is pointless.
+
+2004-04-24 Saturday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.69): Flags for ICC changed.
+
+2004-04-24 Saturday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.34): Use the C++ compiler to
+	  compile and link.  Do not mention -lstcd++.
+
+2004-04-24 Saturday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.16): Work around
+	  gprolog.h namespace pollution.
+
+2004-04-24 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.122): Include
+	  "max_space_dimension.hh".
+
+2004-04-24 Saturday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.101): Include "max_space_dimension.hh".
+
+2004-04-24 Saturday 10:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.85): Explain the changes concerning the
+	  max_space_dimension() functions.
+
+2004-04-24 Saturday 10:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.inlines.hh (1.16), max_space_dimension.hh
+	  (1.2): C_Polyhedron::max_space_dimension() fixed.
+
+2004-04-24 Saturday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.defs.hh (1.95), GenSys.inlines.hh (1.33): New
+	  function GenSys::max_space_dimension().
+
+2004-04-24 Saturday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.82), ConSys.inlines.hh (1.32): New
+	  function ConSys::max_space_dimension().
+
+2004-04-24 Saturday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.44): Spurious newline removed.
+
+2004-04-24 Saturday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.55), Matrix.inlines.hh (1.37): New
+	  functions Matrix::max_num_rows() and Matrix::max_num_columns().
+
+2004-04-24 Saturday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.defs.hh (1.77), Row.inlines.hh (1.43): New functions
+	  Row::Impl::max_size() and Row::max_size().
+
+2004-04-24 Saturday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.21), C_Polyhedron.inlines.hh
+	  (1.15), Makefile.am (1.69), NNC_Polyhedron.defs.hh (1.24),
+	  NNC_Polyhedron.inlines.hh (1.17), Polyhedra_PowerSet.defs.hh
+	  (1.20), Polyhedra_PowerSet.inlines.hh (1.30), Polyhedron.defs.hh
+	  (1.224), algorithms.hh (1.27), globals.hh (1.35),
+	  max_space_dimension.hh (1.1): The function
+	  Parma_Polyhedra_Library::max_space_dimension() has been given a
+	  new semantics and destiny: it returns the maximum space dimension
+	  that _all_ the abstractions provided by the library can handle.
+	  Each individual abstraction provides its versions of this
+	  function.  Thus, e.g., NNC_Polyhedron::max_space_dimension()
+	  gives the maximum space dimensions an NNC_Polyhedron can handle.
+
+2004-04-24 Saturday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.inlines.hh (1.12), Topology.hh (1.9),
+	  initializer.hh (1.8): Comment added.
+
+2004-04-24 Saturday 00:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.32): Pass the C and C++
+	  compilers to plld.
+
+2004-04-23 Friday 18:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.71), ppl_prolog.icc (1.121),
+	  Ciao/ppl_ciao.pl (1.64), GNU/ppl_gprolog.pl (1.43),
+	  SICStus/ppl_sicstus_sd.cc (1.58), SWI/ppl_swiprolog.cc (1.82),
+	  XSB/ppl_xsb.H (1.30), XSB/ppl_xsb.cc (1.47), YAP/ppl_yap.cc
+	  (1.76): Minimize and maximize with generator point predicates
+	  added.
+
+2004-04-23 Friday 16:10  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.63): Interface definitions
+	  for the banner predicate corrected.
+
+2004-04-23 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.46): Temporary, kludgy
+	  definitions for `bool Prolog_has_unbounded_integers' and `long
+	  Prolog_max_integer'.	Comments added.
+
+2004-04-23 Friday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.21),
+	  GNU/ppl_gprolog_sd.cc (1.15), SICStus/ppl_sicstus_sd.cc (1.57),
+	  SWI/ppl_swiprolog.cc (1.81), YAP/ppl_yap.cc (1.75): Define `bool
+	  Prolog_has_unbounded_integers' and `long Prolog_max_integer'.
+	  Comments added.
+
+2004-04-23 Friday 11:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.70), ppl_prolog.icc (1.120),
+	  Ciao/ppl_ciao.pl (1.62), GNU/ppl_gprolog.pl (1.42),
+	  SICStus/ppl_sicstus_sd.cc (1.56), SWI/ppl_swiprolog.cc (1.80),
+	  XSB/ppl_xsb.H (1.29), XSB/ppl_xsb.cc (1.45), YAP/ppl_yap.cc
+	  (1.74): ppl_banner added. pl_check revised so that check_all
+	  calls for checks on all recently added predicates.
+
+2004-04-23 Friday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.119), Ciao/Makefile.am
+	  (1.23), GNU/Makefile.am (1.33), SICStus/Makefile.am (1.39),
+	  SWI/Makefile.am (1.31), XSB/Makefile.am (1.18), YAP/Makefile.am
+	  (1.25): Follow our programming conventions concerning code
+	  formatting.  Do not include "version.hh.in": include "version.hh"
+	  instead.
+
+2004-04-23 Friday 07:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.61): Ciao interface for the
+	  additional ppl predicates corrected.
+
+2004-04-22 Thursday 12:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.69), ppl_prolog.icc (1.118),
+	  Ciao/ppl_ciao.pl (1.60), GNU/ppl_gprolog.pl (1.41),
+	  SICStus/ppl_sicstus_sd.cc (1.55), SWI/ppl_swiprolog.cc (1.79),
+	  XSB/ppl_xsb.H (1.28), XSB/ppl_xsb.cc (1.44), YAP/ppl_yap.cc
+	  (1.73): Added version predicates and maximum dimension predicate.
+
+2004-04-22 Thursday 07:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.68), ppl_prolog.icc (1.117),
+	  Ciao/ppl_ciao.pl (1.59), GNU/ppl_gprolog.pl (1.40),
+	  SICStus/ppl_sicstus_sd.cc (1.54), SWI/ppl_swiprolog.cc (1.78),
+	  XSB/ppl_xsb.H (1.27), XSB/ppl_xsb.cc (1.43), YAP/ppl_yap.cc
+	  (1.72): Added predicates ppl_Polyhedron_maximize/5 and
+	  ppl_Polyhedron_minimize/5.  A second version of the same
+	  predicates with 6 arguments is still needed.
+
+2004-04-21 Wednesday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.37), exceptions2.cc (1.31): We were not
+	  flagging as errors the cases where an exception that must be
+	  thrown is not thrown.
+
+2004-04-21 Wednesday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.68): Remember to explain how to use the Intel C/C++
+	  compiler.
+
+2004-04-21 Wednesday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.195), exceptions3.cc (1.1): New test
+	  program: this shows that we are not checking against attempts of
+	  building polyhedra with a dimension greater than
+	  max_space_dimension() (which results in violated assertions and
+	  who knows what other nasty things).
+
+2004-04-21 Wednesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.36), exceptions2.cc (1.30): Comment
+	  improved.
+
+2004-04-21 Wednesday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: bgp99extrapolation1.cc (1.3), bhz03widening1.cc (1.4),
+	  bhz03widening2.cc (1.4), dualhypercubes.cc (1.4): Avoid defining
+	  things in the global namespace.
+
+2004-04-21 Wednesday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.26): The function check_containment(const
+	  PH&, const Polyhedra_PowerSet<PH>&s) is now declared before being
+	  defined.
+
+2004-04-21 Wednesday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.100): Use the `%u' conversion specifier
+	  (not `%d') for the conversion of an object of type
+	  ppl_dimension_type.
+
+2004-04-21 Wednesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.26): Unused SWIG stuff removed.
+
+2004-04-19 Monday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.67): Fixed Matrix::permute_columns().
+
+2004-04-19 Monday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.89): Avoid useless parentheses.
+
+2004-04-19 Monday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.194), mapdim3.cc (1.1): New test for
+	  Polyhedron::map_dimensions().
+
+2004-04-19 Monday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.88): Comment improved.
+
+2004-04-19 Monday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mapdim2.cc (1.2): Add some variety in the tested
+	  conditions.
+
+2004-04-19 Monday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.84), src/Polyhedron.inlines.hh (1.87): The method
+	  Polyhedron::map_dimensions(const PartialFunction& pfunc) has been
+	  significantly optimized for the case when `pfunc' is a
+	  permutation.	A simple "renaming" of the dimensions is now
+	  extremely cheap.
+
+2004-04-18 Sunday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.66), Matrix.defs.hh (1.54): Added
+	  Matrix::permute_columns().
+
+2004-04-18 Sunday 13:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.18): Spacing fixes in comments.
+
+2004-04-18 Sunday 13:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.20): Two messages fixed in
+	  Polyhedron::OK().
+
+2004-04-17 Saturday 23:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.65): Matrix::swap_columns() improved.  Be
+	  consistent in variable names.
+
+2004-04-17 Saturday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.76): Mathematical objects whose name is more
+	  than one character long are typeset in Roman.
+
+2004-04-17 Saturday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.124): Mathematical objects whose name is
+	  more than one character long are typeset in Roman.  Fixed two
+	  other font mistakes.
+
+2004-04-17 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.193): Put more things in the convenience
+	  library `libppl_tests'.
+
+2004-04-17 Saturday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.192), mapdim2.cc (1.1): New test for
+	  Polyhedron::map_dimensions().
+
+2004-04-16 Friday 16:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.191), boundedh79extrapolation1.cc (1.1):
+	  Test Polyhedron::bounded_H79_extrapolation_assign().
+
+2004-04-06 Tuesday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.22), config.sub (1.21), ltmain.sh (1.18),
+	  Watchdog/config.guess (1.6), Watchdog/config.sub (1.6),
+	  Watchdog/ltmain.sh (1.7): Updated from libtool-1.5.4.
+
+2004-03-06 Saturday 09:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.67), src/ConSys.defs.hh (1.81), src/GenSys.defs.hh
+	  (1.94), src/LinExpression.defs.hh (1.63), src/Matrix.defs.hh
+	  (1.53): Matrix::ascii_dump(), Matrix::ascii_load(),
+	  LinExpression::~LinExpression(), Matrix::~Matrix(),
+	  ConSys::~ConSys(), GenSys::~GenSys() and
+	  ConSys::const_iterator::~const_iterator() are no longer virtual.
+
+2004-03-04 Thursday 07:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.86):
+	  Constraint::Constraint(LinExpression& e) made explicit.
+
+2004-02-25 Wednesday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.66): Added a (monster) configure command line to compile
+	  with Comeau C/C++ compiler.
+
+2004-02-25 Wednesday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.65): Started adding instructions on how to compile with
+	  other C++ compilers.
+
+2004-02-24 Tuesday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.25): Fixed the comments for
+	  ppl_Polyhedron_minimize() and ppl_Polyhedron_maximize().
+
+2004-02-22 Sunday 18:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.20), AskTell.inlines.hh (1.21):
+	  AskTell<CS>::add_constraints() now takes a ConSys by const
+	  reference.
+
+2004-02-22 Sunday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.29): Avoid making
+	  unnecessary copies.
+
+2004-02-22 Sunday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_public.cc (1.19), Polyhedron_widenings.cc
+	  (1.15): Use the add_recycled_*() methods whenever necessary or
+	  desirable.
+
+2004-02-22 Sunday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.8), NNC_Polyhedron.cc (1.12),
+	  Polyhedra_PowerSet.inlines.hh (1.28), Polyhedron_public.cc
+	  (1.18), Polyhedron_widenings.cc (1.14): Use the add_recycled_*()
+	  methods whenever necessary or desirable.
+
+2004-02-22 Sunday 17:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.99): The function snprintf() is not in
+	  standard C++: use sprintf() instead, but play safely anyway.
+
+2004-02-22 Sunday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.24): Non-standard trailing comma
+	  removed from enumeration.
+
+2004-02-22 Sunday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.98): Meaningless type qualifiers
+	  removed.
+
+2004-02-22 Sunday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.83), TODO (1.64), interfaces/C/ppl_c.cc (1.97),
+	  interfaces/C/ppl_c.h.in (1.23), src/Polyhedron.defs.hh (1.223),
+	  src/Polyhedron_public.cc (1.17): The methods void
+	  Polyhedron::add_constraints(ConSys& cs), void
+	  Polyhedron::add_generators(GenSys& gs), bool
+	  Polyhedron::add_constraints_and_minimize(ConSys& cs), and bool
+	  Polyhedron::add_generators_and_minimize(GenSys& gs) have been
+	  renamed void Polyhedron::add_recycled_constraints(ConSys& cs),
+	  void Polyhedron::add_recycled_generators(GenSys& gs), bool
+	  Polyhedron::add_recycled_constraints_and_minimize(ConSys& cs),
+	  and bool Polyhedron::add_recycled_generators_and_minimize(GenSys&
+	  gs), respectively. At the same time, the methods void
+	  Polyhedron::add_constraints(const ConSys& cs), void
+	  Polyhedron::add_generators(const GenSys& gs), bool
+	  Polyhedron::add_constraints_and_minimize(const ConSys& cs), and
+	  bool Polyhedron::add_generators_and_minimize(const GenSys& gs)
+	  have been added. Corresponding changes have been made to the C
+	  interface.
+
+2004-02-22 Sunday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.rpath (1.2): Support Comeau's C/C++ compiler.
+
+2004-02-16 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.75): Comments fixed.
+
+2004-02-12 Thursday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.52), Matrix.inlines.hh (1.36): Do not put
+	  code into files named *.defs.hh.
+
+2004-02-09 Monday 08:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.27): All names that are not
+	  dependent on template parameters are bound to their present
+	  definitions when parsing a template function or class: make sure
+	  elements of the base class are correctly referred to.
+
+2004-02-08 Sunday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.110): Fixed some error messages.
+
+2004-02-08 Sunday 21:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/AskTell.inlines.hh (1.20): Missing `typename' added.
+
+2004-02-06 Friday 11:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.109): Disable the interface/OCaml directory, for
+	  the time being.
+
+2004-02-05 Thursday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Makefile.am (1.9): Ignore the OCaml subdirectory, for
+	  the time being.
+
+2004-02-05 Thursday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.108): Version number bumped.
+
+2004-02-05 Thursday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.96): Output functions fixed.
+
+2004-02-05 Thursday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.95), ppl_c.h.in (1.22): New functions
+	  ppl_io_print_variable() and ppl_io_fprint_variable().
+
+2004-02-05 Thursday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.82), interfaces/C/ppl_c.cc (1.94), src/Variable.cc
+	  (1.16), src/Variable.defs.hh (1.36), src/Variable.inlines.hh
+	  (1.18), tests/writevariable1.cc (1.10):
+	  Variable::Output_Function_Type renamed
+	  Variable::output_function_type.
+
+2004-02-05 Thursday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.93): cxx_Variable_output_function()
+	  partly fixed.
+
+2004-02-05 Thursday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.35): Comment corrected.
+
+2004-02-05 Thursday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.92), ppl_c.h.in (1.21): New functions
+	  ppl_io_set_variable_output_function() and
+	  ppl_io_get_variable_output_function().
+
+2004-02-05 Thursday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.91): Implemented most of the machinery
+	  allowing the user to select its preferred output function for
+	  Variable objects,
+
+2004-02-05 Thursday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.20): Make Doxygen comments uniformly
+	  brief.
+
+2004-02-05 Thursday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.7): Add `-I../C' to
+	  libppl_ocaml_c_la_CPPFLAGS.
+
+2004-02-05 Thursday 14:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.90), ppl_c.h.in (1.19): Documentation
+	  improvements.
+
+2004-02-05 Thursday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user-browse.doxyconf-latex.in (1.19),
+	  user-print.doxyconf-latex.in (1.19), user.doxyconf-html.in
+	  (1.21): Add PPL_DECLARE_PRINT_FUNCTIONS to EXPAND_AS_DEFINED.
+
+2004-02-05 Thursday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.18): Make sure not to leave
+	  unnecessary preprocessor symbols behind.
+
+2004-02-05 Thursday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.89), ppl_c.h.in (1.17): A first,
+	  tentative implementation of the new print functions.	New error
+	  codes PPL_STDIO_ERROR and PPL_ARITHMETIC_OVERFLOW.
+
+2004-02-05 Thursday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.16): Added a kludge to make the
+	  documentation on how to use the C interface easier to find.
+
+2004-02-04 Wednesday 18:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.15): A couple of corrections to the
+	  usage instructions.
+
+2004-02-04 Wednesday 18:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.14): Corrections to the explanation on
+	  using the C interface done.
+
+2004-02-04 Wednesday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.13): Two minor fixes.
+
+2004-02-04 Wednesday 16:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/C/ppl_c.h.in (1.12): The comment on how to use the C
+	  interface revised.
+
+2004-02-04 Wednesday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.11): Documentation on how to use the C
+	  interface finished (for the time being, at least).
+
+2004-02-04 Wednesday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.10): Finished the section on linking.
+
+2004-02-04 Wednesday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.9): Started explaining how to link.
+
+2004-02-04 Wednesday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.8): Better explained how to use the -I
+	  (or similar) compiler option.
+
+2004-02-04 Wednesday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.7): Finished dealing with version
+	  checking.
+
+2004-02-03 Tuesday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.6): Fix thinko in Doxygen's comments.
+
+2004-02-03 Tuesday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.cc (1.4): Put new functions into the PPL namespace.
+
+2004-02-03 Tuesday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.88), ppl_c.h.in (1.5): New functions:
+	  ppl_version_major(), ppl_version_minor(), ppl_version_revision(),
+	  and ppl_version_beta().
+
+2004-02-03 Tuesday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: version.cc (1.3), version.hh.in (1.7): New functions:
+	  version_major(), version_minor(), version_revision(), and
+	  version_beta().
+
+2004-02-03 Tuesday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.107): Some vertical space added.
+
+2004-02-03 Tuesday 14:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.4): New macro PPL_VERSION added.
+
+2004-02-03 Tuesday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h.in (1.3): Started dealing with version
+	  checking.
+
+2004-02-03 Tuesday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.16), ppl_c.cc (1.87), ppl_c.h.in
+	  (1.2): New C interface functions ppl_version() and ppl_banner().
+
+2004-02-03 Tuesday 09:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.hh.in (1.6): Tell emacs that this is C++.
+
+2004-02-03 Tuesday 09:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.106), doc/Makefile.am (1.25),
+	  doc/devref-browse.doxyconf-latex.in (1.35),
+	  doc/devref-print.doxyconf-latex.in (1.35),
+	  doc/devref.doxyconf-html.in (1.36),
+	  doc/user-browse.doxyconf-latex.in (1.18),
+	  doc/user-print.doxyconf-latex.in (1.18),
+	  doc/user.doxyconf-html.in (1.20), interfaces/C/ppl_c.h (1.100),
+	  interfaces/C/ppl_c.h.in (1.1), interfaces/OCaml/Makefile.am
+	  (1.6): The C interface's header file `ppl_c.h' is now generated
+	  at configuration time from `ppl_c.h.in' so as to carry the proper
+	  version information.
+
+2004-02-02 Monday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.86), ppl_c.h (1.99): Now
+	  ppl_initialize() and ppl_finalize() return
+	  PPL_ERROR_INVALID_ARGUMENT if called when they should not.
+
+2004-02-02 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.98): Explain initialization and
+	  finalization in the C interface.
+
+2004-02-02 Monday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.97): Explained what to do in case
+	  `#include <ppl_c.h>' seems not to work.  Explained what opaque
+	  data types are and why we use them.
+
+2004-02-01 Sunday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.96): Explain the usage of the header file
+	  for the C interface and its name space.
+
+2004-02-01 Sunday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: gpl.dox (1.6), gpl.tex (1.2): Avoid excessive
+	  capitalization.
+
+2004-02-01 Sunday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.13), fdl.dox (1.6), fdl.tex (1.2), user.tex
+	  (1.14): The documentation is now distributed under the terms of
+	  version 1.2 of the GNU Free Documentation License.
+
+2004-01-28 Wednesday 18:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/.cvsignore (1.2): Updated.
+
+2004-01-28 Wednesday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.5): Seriously hacked so that
+	  files are created in the right places.
+
+2004-01-28 Wednesday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/gmp.h (1.1): Hacked version of the main C header
+	  file of GMP 4.1.2.  This is to get around some bugs and
+	  limitations of SWIG 1.3.21.
+
+2004-01-28 Wednesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.8), Watchdog/README (1.6),
+	  Watchdog/Watchdog.cc (1.14), Watchdog/Watchdog.defs.hh (1.12),
+	  Watchdog/Watchdog.inlines.hh (1.10), Watchdog/Watchdog.types.hh
+	  (1.5), Watchdog/configure.ac (1.19), Watchdog/pwl_header.top
+	  (1.4), doc/devref.tex (1.12), doc/ppl.sty (1.13), doc/user.tex
+	  (1.13), interfaces/Prolog/XSB/ppl_xsb.H (1.26),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.42): Update copyright years.
+
+2004-01-27 Tuesday 23:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.23), README (1.17), configure.ac (1.105),
+	  doc/Makefile.am (1.24), doc/definitions.dox (1.123),
+	  interfaces/Makefile.am (1.8), interfaces/C/Makefile.am (1.15),
+	  interfaces/C/ppl_c.cc (1.85), interfaces/C/ppl_c.h (1.95),
+	  interfaces/OCaml/Makefile.am (1.4),
+	  interfaces/OCaml/ppl_ocaml_c.swg (1.2),
+	  interfaces/Prolog/Makefile.am (1.24),
+	  interfaces/Prolog/Prolog_interface.dox (1.107),
+	  interfaces/Prolog/clpq.pl (1.15), interfaces/Prolog/clpq2.pl
+	  (1.26), interfaces/Prolog/exceptions.hh (1.8),
+	  interfaces/Prolog/expected (1.6), interfaces/Prolog/expected2
+	  (1.11), interfaces/Prolog/pl_check.pl (1.67),
+	  interfaces/Prolog/ppl_prolog.icc (1.116),
+	  interfaces/Prolog/track_allocation.hh (1.13),
+	  interfaces/Prolog/Ciao/Makefile.am (1.22),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.8),
+	  interfaces/Prolog/Ciao/ciao_clpq2.pl (1.3),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.20),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.58),
+	  interfaces/Prolog/GNU/Makefile.am (1.32),
+	  interfaces/Prolog/GNU/gnu_pl_check.pl (1.2),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.7),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.39),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.14),
+	  interfaces/Prolog/SICStus/Makefile.am (1.38),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.23),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.53),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.3),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.4),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.7),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.9),
+	  interfaces/Prolog/SWI/Makefile.am (1.30),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.7),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.5),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.7),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.77),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.3),
+	  interfaces/Prolog/XSB/Makefile.am (1.17),
+	  interfaces/Prolog/XSB/expected (1.7),
+	  interfaces/Prolog/XSB/expected2 (1.9),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.41),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.8),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.6),
+	  interfaces/Prolog/YAP/Makefile.am (1.24),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.71),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.7),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.7),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.3),
+	  interfaces/Prolog/YAP/yap_pl_check.pl (1.3), m4/Makefile.am
+	  (1.10), m4/ac_check_gmp.m4 (1.16), m4/ac_cxx_attribute_weak.m4
+	  (1.3), m4/ac_cxx_flexible_arrays.m4 (1.8), src/AskTell.defs.hh
+	  (1.19), src/AskTell.inlines.hh (1.19), src/AskTell.types.hh
+	  (1.6), src/BoundingBox.cc (1.8), src/BoundingBox.defs.hh (1.11),
+	  src/BoundingBox.inlines.hh (1.11), src/BoundingBox.types.hh
+	  (1.6), src/C_Polyhedron.cc (1.7), src/C_Polyhedron.defs.hh
+	  (1.20), src/C_Polyhedron.inlines.hh (1.14),
+	  src/C_Polyhedron.types.hh (1.7), src/ConSys.cc (1.67),
+	  src/ConSys.defs.hh (1.80), src/ConSys.inlines.hh (1.31),
+	  src/ConSys.types.hh (1.7), src/Constraint.cc (1.40),
+	  src/Constraint.defs.hh (1.85), src/Constraint.inlines.hh (1.48),
+	  src/Constraint.types.hh (1.7), src/Determinate.defs.hh (1.35),
+	  src/Determinate.inlines.hh (1.36), src/Determinate.types.hh
+	  (1.5), src/GenSys.cc (1.85), src/GenSys.defs.hh (1.93),
+	  src/GenSys.inlines.hh (1.32), src/GenSys.types.hh (1.7),
+	  src/Generator.cc (1.48), src/Generator.defs.hh (1.85),
+	  src/Generator.inlines.hh (1.42), src/Generator.types.hh (1.7),
+	  src/Init.cc (1.10), src/Init.defs.hh (1.10), src/Init.types.hh
+	  (1.6), src/Integer.cc (1.4), src/Integer.defs.hh (1.11),
+	  src/Integer.inlines.hh (1.10), src/Integer.types.hh (1.8),
+	  src/Interval.cc (1.9), src/Interval.defs.hh (1.16),
+	  src/Interval.inlines.hh (1.11), src/Interval.types.hh (1.7),
+	  src/LinExpression.cc (1.20), src/LinExpression.defs.hh (1.62),
+	  src/LinExpression.inlines.hh (1.29), src/LinExpression.types.hh
+	  (1.7), src/Makefile.am (1.68), src/Matrix.cc (1.64),
+	  src/Matrix.defs.hh (1.51), src/Matrix.inlines.hh (1.35),
+	  src/Matrix.types.hh (1.7), src/NNC_Polyhedron.cc (1.11),
+	  src/NNC_Polyhedron.defs.hh (1.23), src/NNC_Polyhedron.inlines.hh
+	  (1.16), src/NNC_Polyhedron.types.hh (1.7), src/Ph_Status.cc
+	  (1.4), src/Ph_Status.idefs.hh (1.4), src/Ph_Status.inlines.hh
+	  (1.4), src/Poly_Con_Relation.cc (1.8),
+	  src/Poly_Con_Relation.defs.hh (1.23),
+	  src/Poly_Con_Relation.inlines.hh (1.11),
+	  src/Poly_Con_Relation.types.hh (1.6), src/Poly_Gen_Relation.cc
+	  (1.8), src/Poly_Gen_Relation.defs.hh (1.21),
+	  src/Poly_Gen_Relation.inlines.hh (1.11),
+	  src/Poly_Gen_Relation.types.hh (1.6),
+	  src/Polyhedra_PowerSet.defs.hh (1.19),
+	  src/Polyhedra_PowerSet.inlines.hh (1.26),
+	  src/Polyhedra_PowerSet.types.hh (1.2), src/Polyhedron.defs.hh
+	  (1.222), src/Polyhedron.inlines.hh (1.86),
+	  src/Polyhedron.types.hh (1.10), src/Polyhedron_chdims.cc (1.8),
+	  src/Polyhedron_nonpublic.cc (1.17), src/Polyhedron_public.cc
+	  (1.16), src/Polyhedron_widenings.cc (1.13), src/PowerSet.defs.hh
+	  (1.46), src/PowerSet.inlines.hh (1.55), src/PowerSet.types.hh
+	  (1.6), src/Row.cc (1.60), src/Row.defs.hh (1.74),
+	  src/Row.inlines.hh (1.42), src/Row.types.hh (1.7),
+	  src/SatMatrix.cc (1.28), src/SatMatrix.defs.hh (1.33),
+	  src/SatMatrix.inlines.hh (1.21), src/SatMatrix.types.hh (1.7),
+	  src/SatRow.cc (1.22), src/SatRow.defs.hh (1.32),
+	  src/SatRow.inlines.hh (1.28), src/SatRow.types.hh (1.7),
+	  src/Topology.hh (1.8), src/Variable.cc (1.15),
+	  src/Variable.defs.hh (1.34), src/Variable.inlines.hh (1.17),
+	  src/Variable.types.hh (1.7), src/algorithms.hh (1.25),
+	  src/conversion.cc (1.51), src/globals.cc (1.13), src/globals.hh
+	  (1.34), src/initializer.hh (1.7), src/minimize.cc (1.35),
+	  src/ppl_header.top (1.7), src/simplify.cc (1.33),
+	  src/statistics.hh (1.3), src/version.cc (1.2), src/version.hh.in
+	  (1.5), tests/BBox.cc (1.4), tests/BBox.hh (1.3),
+	  tests/CbecomesNNC1.cc (1.5), tests/Makefile.am (1.190),
+	  tests/NNCminimize1.cc (1.10), tests/NNCminimize2.cc (1.10),
+	  tests/NNCminimize3.cc (1.10), tests/NNCminimize4.cc (1.12),
+	  tests/NNCminimize5.cc (1.9), tests/NNCminimize6.cc (1.11),
+	  tests/PFunction.cc (1.3), tests/PFunction.hh (1.3),
+	  tests/addconstraint1.cc (1.5), tests/addconstraint2.cc (1.4),
+	  tests/addconstraint3.cc (1.4), tests/addconstraints1.cc (1.11),
+	  tests/addconstraints10.cc (1.10), tests/addconstraints11.cc
+	  (1.11), tests/addconstraints12.cc (1.4),
+	  tests/addconstraints13.cc (1.6), tests/addconstraints2.cc (1.19),
+	  tests/addconstraints3.cc (1.9), tests/addconstraints4.cc (1.11),
+	  tests/addconstraints5.cc (1.12), tests/addconstraints6.cc (1.13),
+	  tests/addconstraints7.cc (1.12), tests/addconstraints8.cc (1.12),
+	  tests/addconstraints9.cc (1.13), tests/adddimensions1.cc (1.14),
+	  tests/adddimensions10.cc (1.7), tests/adddimensions11.cc (1.5),
+	  tests/adddimensions12.cc (1.4), tests/adddimensions13.cc (1.3),
+	  tests/adddimensions2.cc (1.10), tests/adddimensions3.cc (1.12),
+	  tests/adddimensions4.cc (1.10), tests/adddimensions5.cc (1.8),
+	  tests/adddimensions6.cc (1.8), tests/adddimensions7.cc (1.8),
+	  tests/adddimensions8.cc (1.6), tests/adddimensions9.cc (1.7),
+	  tests/addgenerator1.cc (1.5), tests/addgenerator2.cc (1.5),
+	  tests/addgenerator3.cc (1.4), tests/addgenerator4.cc (1.5),
+	  tests/addgenerators1.cc (1.12), tests/addgenerators10.cc (1.4),
+	  tests/addgenerators11.cc (1.6), tests/addgenerators12.cc (1.6),
+	  tests/addgenerators13.cc (1.2), tests/addgenerators2.cc (1.12),
+	  tests/addgenerators3.cc (1.12), tests/addgenerators4.cc (1.12),
+	  tests/addgenerators5.cc (1.12), tests/addgenerators6.cc (1.12),
+	  tests/addgenerators7.cc (1.9), tests/addgenerators8.cc (1.7),
+	  tests/addgenerators9.cc (1.6), tests/affineimage1.cc (1.12),
+	  tests/affineimage2.cc (1.11), tests/affineimage3.cc (1.4),
+	  tests/affineimage4.cc (1.4), tests/affineimage5.cc (1.5),
+	  tests/affineimage6.cc (1.4), tests/affineimage7.cc (1.4),
+	  tests/affineimage8.cc (1.8), tests/affinepreimage1.cc (1.11),
+	  tests/affinepreimage10.cc (1.8), tests/affinepreimage2.cc (1.11),
+	  tests/affinepreimage3.cc (1.11), tests/affinepreimage4.cc (1.12),
+	  tests/affinepreimage5.cc (1.4), tests/affinepreimage6.cc (1.5),
+	  tests/affinepreimage7.cc (1.4), tests/affinepreimage8.cc (1.4),
+	  tests/affinepreimage9.cc (1.5), tests/affinetrans.cc (1.14),
+	  tests/append1.cc (1.22), tests/append2.cc (1.22),
+	  tests/ascii_dump_load1.cc (1.13), tests/ascii_dump_load2.cc
+	  (1.11), tests/ascii_dump_load3.cc (1.14),
+	  tests/ascii_dump_load4.cc (1.14), tests/ascii_dump_load5.cc
+	  (1.10), tests/ascii_dump_load6.cc (1.7),
+	  tests/ascii_dump_load7.cc (1.7), tests/bgp99extrapolation1.cc
+	  (1.2), tests/bhrz03widening1.cc (1.4), tests/bhrz03widening10.cc
+	  (1.4), tests/bhrz03widening11.cc (1.4), tests/bhrz03widening12.cc
+	  (1.4), tests/bhrz03widening13.cc (1.4), tests/bhrz03widening14.cc
+	  (1.4), tests/bhrz03widening15.cc (1.6), tests/bhrz03widening16.cc
+	  (1.4), tests/bhrz03widening17.cc (1.4), tests/bhrz03widening18.cc
+	  (1.4), tests/bhrz03widening19.cc (1.4), tests/bhrz03widening2.cc
+	  (1.6), tests/bhrz03widening3.cc (1.6), tests/bhrz03widening4.cc
+	  (1.4), tests/bhrz03widening5.cc (1.4), tests/bhrz03widening6.cc
+	  (1.5), tests/bhrz03widening7.cc (1.5), tests/bhrz03widening8.cc
+	  (1.4), tests/bhrz03widening9.cc (1.6), tests/bhz03widening1.cc
+	  (1.3), tests/bhz03widening2.cc (1.3), tests/bounded1.cc (1.13),
+	  tests/boundingbox1.cc (1.33), tests/boundingbox2.cc (1.18),
+	  tests/boundingbox3.cc (1.9), tests/boundingbox4.cc (1.6),
+	  tests/bounds1.cc (1.6), tests/bounds2.cc (1.6),
+	  tests/concatenate1.cc (1.8), tests/concatenate2.cc (1.8),
+	  tests/concatenate3.cc (1.7), tests/concatenate4.cc (1.6),
+	  tests/concatenate5.cc (1.4), tests/concatenate6.cc (1.6),
+	  tests/constraints1.cc (1.6), tests/constraints2.cc (1.6),
+	  tests/constraints3.cc (1.6), tests/constraints4.cc (1.6),
+	  tests/contains1.cc (1.5), tests/contains2.cc (1.2),
+	  tests/contains3.cc (1.2), tests/contains4.cc (1.2),
+	  tests/contains5.cc (1.2), tests/disjoint1.cc (1.7),
+	  tests/disjoint2.cc (1.8), tests/disjoint3.cc (1.7),
+	  tests/dualhypercubes.cc (1.3), tests/ehandlers.cc (1.5),
+	  tests/ehandlers.hh (1.8), tests/empty1.cc (1.14),
+	  tests/exceptions1.cc (1.35), tests/exceptions2.cc (1.29),
+	  tests/files.cc (1.5), tests/files.hh (1.5),
+	  tests/generalizedaffineimage1.cc (1.8),
+	  tests/generalizedaffineimage10.cc (1.7),
+	  tests/generalizedaffineimage11.cc (1.6),
+	  tests/generalizedaffineimage12.cc (1.5),
+	  tests/generalizedaffineimage2.cc (1.7),
+	  tests/generalizedaffineimage3.cc (1.8),
+	  tests/generalizedaffineimage4.cc (1.6),
+	  tests/generalizedaffineimage5.cc (1.6),
+	  tests/generalizedaffineimage6.cc (1.6),
+	  tests/generalizedaffineimage7.cc (1.8),
+	  tests/generalizedaffineimage8.cc (1.6),
+	  tests/generalizedaffineimage9.cc (1.6), tests/generators1.cc
+	  (1.13), tests/generators2.cc (1.9), tests/generators3.cc (1.5),
+	  tests/generators4.cc (1.5), tests/generators5.cc (1.5),
+	  tests/generators6.cc (1.6), tests/h79widening1.cc (1.6),
+	  tests/h79widening2.cc (1.7), tests/h79widening3.cc (1.7),
+	  tests/h79widening4.cc (1.4), tests/h79widening5.cc (1.5),
+	  tests/h79widening6.cc (1.5), tests/h79widening7.cc (1.3),
+	  tests/intersection1.cc (1.6), tests/intersection10.cc (1.6),
+	  tests/intersection11.cc (1.6), tests/intersection2.cc (1.10),
+	  tests/intersection3.cc (1.7), tests/intersection4.cc (1.7),
+	  tests/intersection5.cc (1.7), tests/intersection6.cc (1.7),
+	  tests/intersection7.cc (1.6), tests/intersection8.cc (1.5),
+	  tests/intersection9.cc (1.5),
+	  tests/limitedbhrz03extrapolation1.cc (1.3),
+	  tests/limitedh79extrapolation1.cc (1.3),
+	  tests/limitedh79extrapolation2.cc (1.3),
+	  tests/limitedh79extrapolation3.cc (1.3),
+	  tests/limitedh79extrapolation4.cc (1.3),
+	  tests/linearpartition1.cc (1.13), tests/linearpartition2.cc
+	  (1.13), tests/linearpartition3.cc (1.13), tests/linexpression1.cc
+	  (1.4), tests/mapdim1.cc (1.2), tests/max_min1.cc (1.4),
+	  tests/max_min2.cc (1.4), tests/mc91.cc (1.14), tests/memory1.cc
+	  (1.20), tests/minconstraints1.cc (1.5), tests/minconstraints2.cc
+	  (1.5), tests/minconstraints3.cc (1.4), tests/minconstraints4.cc
+	  (1.8), tests/mingenerators1.cc (1.5), tests/mingenerators2.cc
+	  (1.4), tests/mingenerators3.cc (1.4), tests/onepoint.cc (1.10),
+	  tests/permute.cc (1.31), tests/polydifference1.cc (1.7),
+	  tests/polydifference2.cc (1.9), tests/polydifference3.cc (1.4),
+	  tests/polydifference4.cc (1.5), tests/polydifference5.cc (1.6),
+	  tests/polydifference6.cc (1.6), tests/polydifference7.cc (1.5),
+	  tests/polyhull1.cc (1.8), tests/polyhull10.cc (1.4),
+	  tests/polyhull2.cc (1.7), tests/polyhull3.cc (1.7),
+	  tests/polyhull4.cc (1.6), tests/polyhull5.cc (1.5),
+	  tests/polyhull6.cc (1.5), tests/polyhull7.cc (1.4),
+	  tests/polyhull8.cc (1.5), tests/polyhull9.cc (1.6),
+	  tests/ppl_test.hh (1.4), tests/print.cc (1.10), tests/print.hh
+	  (1.14), tests/randphull1.cc (1.10), tests/randphull2.cc (1.6),
+	  tests/relations1.cc (1.10), tests/relations10.cc (1.6),
+	  tests/relations11.cc (1.6), tests/relations12.cc (1.5),
+	  tests/relations13.cc (1.5), tests/relations14.cc (1.5),
+	  tests/relations15.cc (1.5), tests/relations16.cc (1.5),
+	  tests/relations17.cc (1.7), tests/relations18.cc (1.5),
+	  tests/relations19.cc (1.6), tests/relations2.cc (1.11),
+	  tests/relations3.cc (1.11), tests/relations4.cc (1.11),
+	  tests/relations5.cc (1.11), tests/relations6.cc (1.10),
+	  tests/relations7.cc (1.10), tests/relations8.cc (1.10),
+	  tests/relations9.cc (1.12), tests/removedim1.cc (1.11),
+	  tests/removedim10.cc (1.3), tests/removedim2.cc (1.15),
+	  tests/removedim3.cc (1.11), tests/removedim4.cc (1.12),
+	  tests/removedim5.cc (1.10), tests/removedim6.cc (1.13),
+	  tests/removedim7.cc (1.9), tests/removedim8.cc (1.6),
+	  tests/removedim9.cc (1.6), tests/smm1.cc (1.15),
+	  tests/timeelapse1.cc (1.8), tests/timeelapse2.cc (1.8),
+	  tests/timeelapse3.cc (1.8), tests/timeelapse4.cc (1.8),
+	  tests/timeelapse5.cc (1.9), tests/timeelapse6.cc (1.4),
+	  tests/timeelapse7.cc (1.4), tests/timeelapse8.cc (1.5),
+	  tests/timings.cc (1.4), tests/timings.hh (1.4),
+	  tests/topclosed1.cc (1.7), tests/topclosed2.cc (1.6),
+	  tests/topclosed3.cc (1.8), tests/topclosure1.cc (1.7),
+	  tests/topclosure2.cc (1.4), tests/topclosure3.cc (1.4),
+	  tests/topclosure4.cc (1.6), tests/universe1.cc (1.10),
+	  tests/universe2.cc (1.11), tests/universe3.cc (1.11),
+	  tests/universe4.cc (1.11), tests/universe5.cc (1.12),
+	  tests/universe6.cc (1.9), tests/watchdog1.cc (1.18),
+	  tests/writeconsys1.cc (1.7), tests/writegensys1.cc (1.8),
+	  tests/writegensys2.cc (1.8), tests/writegensys3.cc (1.7),
+	  tests/writepolyhedron1.cc (1.7), tests/writepolyhedron2.cc (1.8),
+	  tests/writepolyhedron3.cc (1.7), tests/writerelation1.cc (1.7),
+	  tests/writevariable1.cc (1.9): Update copyright years.
+
+2004-01-27 Tuesday 23:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.3): Some little progress.
+
+2004-01-27 Tuesday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/: ppl_c.swg (1.2), ppl_ocaml_c.swg (1.1):
+	  Renamed.
+
+2004-01-27 Tuesday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* compile (1.1), Watchdog/compile (1.1): Added from Automake 1.8.2.
+
+2004-01-26 Monday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/Makefile.am (1.2): Avoid running swig multiple
+	  times.
+
+2004-01-26 Monday 16:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.104), interfaces/Makefile.am (1.7),
+	  interfaces/OCaml/.cvsignore (1.1), interfaces/OCaml/Makefile.am
+	  (1.1): Directory `interfaces/OCaml' activated.
+
+2004-01-26 Monday 16:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.23): It is no longer necessary to specify `-d
+	  Validate' on the Doxygen's command line.
+
+2004-01-26 Monday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.94): Temporarily avoid splitting
+	  preprocessor directives across multiple lines.  This is to get
+	  around a bug in SWIG 1.3.21.
+
+2004-01-26 Monday 08:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.93): Spacing fixed.
+
+2004-01-25 Sunday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/OCaml/ppl_c.swg (1.1): SWIG module declaration for the
+	  OCaml interface to the C interface.
+
+2004-01-25 Sunday 23:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.92): Explain to SWIG how to convert an
+	  OCaml array to a C array plus length.
+
+2004-01-25 Sunday 23:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.67): Avoid repeating the name of the target
+	  file.
+
+2004-01-25 Sunday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.6), install-sh (1.7), missing (1.7), mkinstalldirs
+	  (1.6), Watchdog/depcomp (1.4), Watchdog/install-sh (1.4),
+	  Watchdog/missing (1.3), Watchdog/mkinstalldirs (1.2): Update from
+	  Automake.
+
+2004-01-25 Sunday 22:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.103): Check for SWIG added.
+
+2004-01-25 Sunday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.21), config.sub (1.20), Watchdog/config.guess
+	  (1.5), Watchdog/config.sub (1.5): Updated from config.
+
+2004-01-25 Sunday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.17), Watchdog/ltmain.sh (1.6): Updated from Libtool
+	  1.5.2.
+
+2004-01-23 Friday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.221): Implement a new method to
+	  differentiate between the inclusion of Ph_Status.idefs.hh and the
+	  inclusion of all other header files.	This gets around a bug in
+	  doxygen.
+
+2004-01-23 Friday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.220): Documentation for
+	  Polyhedron::max_min() fixed.
+
+2004-01-21 Wednesday 13:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/dualhypercubes.cc (1.2): Corrected an error and made
+	  silent.
+
+2004-01-20 Tuesday 08:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.189), dualhypercubes.cc (1.1): Put under
+	  CVS control.
+
+2003-12-19 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ppl_header.bottom (1.5), ppl_header.top (1.6): Include
+	  <cassert> after restoring the status of NDEBUG: this should
+	  finally solve the NDEBUG problem.
+
+2003-12-17 Wednesday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.middle (1.3): GCC versions prior to 3.0 are no
+	  longer supported.
+
+2003-12-15 Monday 23:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.63): See if we can provide some guarantee on the maximum
+	  number of times we are calling the methods of the argument of
+	  Polyhedron::map_dimensions(const PartialFunction&).
+
+2003-12-05 Friday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.13): Do not use the ITIMER_PROF timer
+	  when profiling.
+
+2003-12-05 Friday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.102): Define the symbol `PROFILING' when
+	  profiling is enabled.
+
+2003-12-04 Thursday 10:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.34),
+	  devref-print.doxyconf-latex.in (1.34), devref.doxyconf-html.in
+	  (1.35): The source files for the Status class are now called
+	  Ph_Status.*.
+
+2003-12-02 Tuesday 21:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: lib-ld.m4 (1.2), lib-prefix.m4 (1.2): Updated from gettext
+	  0.13.
+
+2003-11-19 Wednesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.62): Remember to implement void
+	  Polyhedron::envelope_assign(const Polyhedron& y).
+
+2003-11-12 Wednesday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.22), acinclude.m4 (1.6): Implement a much simpler
+	  way of telling aclocal where to look for `.m4' files (in
+	  addition, `sinclude', which we used in `acinclude.m4', is an
+	  obsolete name for `m4_include').
+
+2003-11-09 Sunday 00:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.33): Comment for compute_capacity() improved.
+	  Added an alternative implementation (commented out) characterized
+	  a speculation factor of 1.5.
+
+2003-11-07 Friday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.73): Including Integer.types.hh is not enough:
+	  include Integer.defs.hh.
+
+2003-11-04 Tuesday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.20), config.sub (1.19), Watchdog/config.guess
+	  (1.4), Watchdog/config.sub (1.4): Updated.
+
+2003-10-30 Thursday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ph_Status.cc (1.3), Polyhedron_public.cc (1.15): OK()
+	  methods must print their own error messages (unless NDEBUG is
+	  defined).
+
+2003-10-29 Wednesday 06:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.15): In case libgmp and libgmpxx are
+	  installed in the same location, allow to specify the prefix for
+	  either one, the other being set automatically.
+
+2003-10-29 Wednesday 06:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_cxx_attribute_weak.m4 (1.2), ac_cxx_flexible_arrays.m4
+	  (1.7): Preserve CPPFLAGS.
+
+2003-10-28 Tuesday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.101), interfaces/C/Makefile.am (1.14),
+	  interfaces/Prolog/Ciao/Makefile.am (1.21),
+	  interfaces/Prolog/GNU/Makefile.am (1.31),
+	  interfaces/Prolog/SICStus/Makefile.am (1.37),
+	  interfaces/Prolog/SWI/Makefile.am (1.29),
+	  interfaces/Prolog/XSB/Makefile.am (1.16),
+	  interfaces/Prolog/YAP/Makefile.am (1.23), src/Makefile.am (1.66),
+	  tests/Makefile.am (1.188): Got rid of extra_cpp_flags (was used
+	  nowhere).
+
+2003-10-27 Monday 22:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.8), NEWS (1.81), TODO (1.61), acinclude.m4 (1.5),
+	  config.rpath (1.1), m4/ac_check_gmp.m4 (1.14), m4/lib-ld.m4
+	  (1.1), m4/lib-link.m4 (1.1), m4/lib-prefix.m4 (1.1): Thanks to
+	  Bruno Haible, it is now possible to use versions of the GMP
+	  library installed into nonstandard places.
+
+2003-10-27 Monday 10:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ph_Status.idefs.hh (1.3), Ph_Status.inlines.hh (1.3): Some
+	  useless code removed.
+
+2003-10-27 Monday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Ph_Status.cc (1.2), Ph_Status.idefs.hh (1.2),
+	  Ph_Status.inlines.hh (1.2): Comments fixed.
+
+2003-10-27 Monday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.65), Ph_Status.cc (1.1), Ph_Status.idefs.hh
+	  (1.1), Ph_Status.inlines.hh (1.1), Polyhedron.defs.hh (1.219),
+	  Status.cc (1.22), Status.defs.hh (1.30), Status.inlines.hh
+	  (1.15), Status.types.hh (1.7): The Status class is now a private
+	  member of class Polyhedron.
+
+2003-10-26 Sunday 18:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Status.defs.hh (1.29), Status.inlines.hh (1.14): Pass
+	  objects of type Status by value.
+
+2003-10-16 Thursday 17:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/polyhull1.cc (1.7): Debug message improved.
+
+2003-10-13 Monday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.59): Comment fixed.
+
+2003-10-06 Monday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.60), tests/h79widening6.cc (1.4): h79widening6.cc
+	  temporarily fixed, but must be turned into a proper test.
+
+2003-10-04 Saturday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.58): Revert previous change.
+
+2003-10-04 Saturday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.57): Avoid including <iostream>.
+
+2003-10-03 Friday 12:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.7), Watchdog/.cvsignore (1.4): Ignore config.h.in.
+
+2003-10-03 Friday 09:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.26), Watchdog/config.h.in (1.4): These should not
+	  be in the repository, since they are automatically generated.
+
+2003-09-23 Tuesday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.33),
+	  devref-print.doxyconf-latex.in (1.33), devref.doxyconf-html.in
+	  (1.34), user-browse.doxyconf-latex.in (1.17),
+	  user-print.doxyconf-latex.in (1.17), user.doxyconf-html.in
+	  (1.19): Updated for Doxygen 1.3.4.
+
+2003-09-10 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.19), config.h.in (1.25), config.sub (1.18),
+	  depcomp (1.5), install-sh (1.6), missing (1.6),
+	  Watchdog/config.guess (1.3), Watchdog/config.sub (1.3),
+	  Watchdog/depcomp (1.3), Watchdog/install-sh (1.3),
+	  Watchdog/missing (1.2): Updated.
+
+2003-09-10 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Variable.cc (1.14), Variable.defs.hh (1.33): Pass variables
+	  by const reference for uniformity.
+
+2003-09-01 Monday 23:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.54):
+	  PowerSet<CS>::check_omega_reduced() fixed: now it return false if
+	  a bottom element is encountered (even in a singleton).
+
+2003-09-01 Monday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.53): Modified
+	  PowerSet<CS>::omega_reduce() so that all bottom elements are
+	  removed first.
+
+2003-09-01 Monday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.24): Use Polyhedra_PowerSet<PH>::empty()
+	  instead of Polyhedra_PowerSet<PH>::is_bottom().
+
+2003-09-01 Monday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.18): Useless using declarations
+	  removed.
+
+2003-09-01 Monday 20:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.45), PowerSet.inlines.hh (1.52): Method
+	  bool PowerSet<CS>::empty() const added.  Useless using
+	  declarations removed.  Added a bool argument to
+	  PowerSet<CS>::OK() to decide whether bottom is or not allowed
+	  into the powerset.
+
+2003-09-01 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.17),
+	  Polyhedra_PowerSet.inlines.hh (1.25): Methods
+	  Polyhedra_PowerSet<PH>::add_constraint() and
+	  Polyhedra_PowerSet<PH>::add_constraints() made lazy.	Methods
+	  Polyhedra_PowerSet<PH>::add_constraint_and_minimize() and
+	  Polyhedra_PowerSet<PH>::add_constraints_and_minimize() added.
+
+2003-08-31 Sunday 23:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.51): Correct a mistake in previous
+	  change.
+
+2003-08-31 Sunday 23:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.50): PowerSet<CS>::collapse(iterator
+	  sink) improved.
+
+2003-08-30 Saturday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bhz03widening2.cc (1.2): Be quiet.
+
+2003-08-30 Saturday 12:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.24): Corrected a bug in
+	  pairwise_reduce(), whereby we were marking the wrong polyhedra in
+	  the sequence.  Corrected a bug in BHZ03_widening_assign(),
+	  whereby we were calling BGP99_extrapolation_assign() instead of
+	  BGP99_heuristics_assign (the latter does not pairwise-reduce nor
+	  collapse the sequence of polyhedra).	In the implementation of
+	  BGP99_heuristics_assign(), we now take a copy of polyhedron `pi'
+	  before computing the base-level widening.
+
+2003-08-30 Saturday 12:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.49): In function collapse(const
+	  unsigned max_disjuncts), removed the never used iterators sbegin
+	  and send.
+
+2003-08-30 Saturday 00:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.187), bhz03widening2.cc (1.1): New test
+	  for Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+
+2003-08-29 Friday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.59): The name of the `abandon_exponential_computations'
+	  variable is now misleading, as we use it also to abandon
+	  polynomial computations in the PowerSet domains.
+
+2003-08-29 Friday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.44), PowerSet.inlines.hh (1.48): Method
+	  PowerSet::collapse() added.  It provides the same functionality
+	  as the project() function, which has been removed.
+
+2003-08-29 Friday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.16),
+	  Polyhedra_PowerSet.inlines.hh (1.23), PowerSet.defs.hh (1.43),
+	  PowerSet.inlines.hh (1.47): Method collapse() reimplemented
+	  generically in the PowerSet class.  Methods
+	  PowerSet<CS>::omega_reduce() and
+	  Polyhedra_PowerSet<PH>::concatenate_assign() (which have
+	  quadratic complexity) now test the
+	  `abandon_exponential_computations' variable and hurry up (giving
+	  up precision) if necessary.
+
+2003-08-28 Thursday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.23): Function check_containment() fixed and
+	  silenced.
+
+2003-08-27 Wednesday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.22): Fixed a couple of bugs in
+	  check_containment().	Print statements added to the same function
+	  in order to help debugging it (it still does not work).
+
+2003-08-27 Wednesday 23:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.15),
+	  Polyhedra_PowerSet.inlines.hh (1.22): New methods `bool
+	  semantically_contains(const Polyhedra_PowerSet&) const' and `bool
+	  semantically_equals(const Polyhedra_PowerSet&) const'.  Fixed
+	  methods ascii_dump() and ascii_load().
+
+2003-08-27 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.14),
+	  Polyhedra_PowerSet.inlines.hh (1.21): Methods `void
+	  Polyhedra_PowerSet<PH>::ascii_dump(std::ostream&) const' and
+	  `bool Polyhedra_PowerSet<PH>::ascii_load(std::istream&)' added.
+
+2003-08-27 Wednesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.58), src/Init.cc (1.9): New mechanism to allow the user
+	  to redefine the GMP memory allocation functions being 100% sure
+	  that all GMP objects are allocated and deallocated by the same
+	  functions (nasty things happen if this is not the case).
+
+2003-08-27 Wednesday 18:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* acinclude.m4 (1.4), config.h.in (1.24), configure.ac (1.100),
+	  m4/ac_cxx_attribute_weak.m4 (1.1): Check whether the C++ compiler
+	  supports __attribute__ ((weak)).
+
+2003-08-26 Tuesday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.18), AskTell.inlines.hh (1.18),
+	  Determinate.defs.hh (1.34), Determinate.inlines.hh (1.35),
+	  Polyhedra_PowerSet.defs.hh (1.13), Polyhedra_PowerSet.inlines.hh
+	  (1.20), PowerSet.defs.hh (1.42), PowerSet.inlines.hh (1.46):
+	  Added the swap() method and the specialization of std::swap().
+
+2003-08-26 Tuesday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.21): Added a first version of the
+	  "check_containment" algorithm described in Srivastava93.
+	  Multiple inclusion guard added.
+
+2003-08-26 Tuesday 08:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.12),
+	  Polyhedra_PowerSet.inlines.hh (1.19): Added
+	  Polyhedra_PowerSet<PH>::limited_BHZ03_widening_assign().
+
+2003-08-26 Tuesday 08:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.18): TODO comment revised.
+	  Variable declaration turned into a constant declaration.
+
+2003-08-25 Monday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bhz03widening1.cc (1.2): Ensure the widening is always
+	  called properly.
+
+2003-08-25 Monday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.186), bhz03widening1.cc (1.1): Test
+	  Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+
+2003-08-25 Monday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.11),
+	  Polyhedra_PowerSet.inlines.hh (1.17): Method
+	  new_widening_assign() renamed BHZ03_widening_assign() and
+	  modified to accept a widening method on the underlying polyhedra
+	  domain.
+
+2003-08-25 Monday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.16): In BGP99 extrapolation,
+	  do pairwise reduction before collapsing.
+
+2003-08-25 Monday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.10),
+	  src/Polyhedra_PowerSet.inlines.hh (1.15), tests/Makefile.am
+	  (1.185), tests/bgp99extrapolation1.cc (1.1),
+	  tests/powersetwidening1.cc (1.8): Cleaned and simplified the code
+	  for the "simple powerset widening", now more appropriately called
+	  "BGP99 extrapolation".
+
+2003-08-25 Monday 00:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.99): Version number bumped.
+
+2003-08-25 Monday 00:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.16): Avoid two compiler warnings.
+
+2003-08-24 Sunday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.7): 20 iterations are enough.
+
+2003-08-24 Sunday 17:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.6): Corrected the affine image
+	  transformation.  Made the test silent.
+
+2003-08-24 Sunday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.84), ppl_c.h (1.91): Revised interface
+	  for ppl_Polyhedron_maximize() and ppl_Polyhedron_minimize().
+
+2003-08-24 Sunday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.218), src/Polyhedron.inlines.hh (1.85),
+	  src/Polyhedron_nonpublic.cc (1.15), tests/max_min1.cc (1.3),
+	  tests/max_min2.cc (1.3): Revised interface for
+	  Polyhedron::maximize() and Polyhedron::minimize().
+
+2003-08-24 Sunday 13:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.80): Section on bugfixes added for PPL 0.6.
+
+2003-08-24 Sunday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.79), src/LinExpression.cc (1.19),
+	  src/LinExpression.defs.hh (1.61): New output operator in
+	  namespace IO_Operators: std::ostream& operator<<(std::ostream&,
+	  const LinExpression&).
+
+2003-08-23 Saturday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.14): The applicability test
+	  asserted in Polyhedra_PowerSet<PH>::widening_assign() was
+	  reversed: fixed.
+
+2003-08-23 Saturday 18:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.83): Fixed indentation.
+
+2003-08-23 Saturday 18:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.5): Counter-example for the simple
+	  powerset widening is now working as expected.
+
+2003-08-23 Saturday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.4): Fixed an output statement.
+	  Avoid computing S(n) multiple times.
+
+2003-08-23 Saturday 16:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.3): For readability, use an
+	  alternate output function for variables.
+
+2003-08-23 Saturday 16:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.13): In
+	  Polyhedra_PowerSet<PH>::widening_assign(const Polyhedra_PowerSet&
+	  y, ...) assert that `*this' definitely entails `y'.
+
+2003-08-23 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.2): Started turning this program
+	  into an implementation of Enea's counterexample for the simple
+	  powerset widening.
+
+2003-08-22 Friday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: max_min1.cc (1.2), max_min2.cc (1.2): Be quiet.
+
+2003-08-22 Friday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.98): Version number bumped.
+
+2003-08-22 Friday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.78): Announce Polyhedron::maximize() and
+	  Polyhedron::minimize().
+
+2003-08-22 Friday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.57): New things to do before releasing PPL 0.6.
+
+2003-08-22 Friday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.82), ppl_c.h (1.90): Added
+	  ppl_Polyhedron_maximize() and ppl_Polyhedron_minimize().
+
+2003-08-22 Friday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.217): Documentation for
+	  Polyhedron::maximize(const LinExpression&, ...) and
+	  Polyhedron::minimize(const LinExpression&, ...) revised.
+
+2003-08-22 Friday 18:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.184), max_min1.cc (1.1), max_min2.cc
+	  (1.1): Test Polyhedron::maximize(const LinExpression&, ...) and
+	  Polyhedron::minimize(const LinExpression&, ...).
+
+2003-08-22 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.14): Method Polyhedron::max_min()
+	  implemented.
+
+2003-08-22 Friday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.13): Avoid useless iterations in
+	  Polyhedron::bounds().
+
+2003-08-22 Friday 13:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.216), Polyhedron.inlines.hh (1.84),
+	  Polyhedron_nonpublic.cc (1.12): Revised specification for the new
+	  methods Polyhedron::maximize(const LinExpression&, ...) and
+	  Polyhedron::minimize(const LinExpression&, ...).  Implementation
+	  work started.
+
+2003-08-22 Friday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.cc (1.47): Avoid useless calls to std::ostream&
+	  std::operator<<(std::ostream& s, ...).
+
+2003-08-20 Wednesday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.215): First tentative declaration for
+	  the new maximization and minimization methods.
+
+2003-08-20 Wednesday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.56): We must explain very well that iterators can be
+	  invalidated by several (actually, almost all) operations, and
+	  that use of an invalidated iterator causes undefined behavior.
+
+2003-08-20 Wednesday 16:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (ppl-0_5-branch.1): Fixed constructor
+	  `PIFunc::PIFunc(dimension_type* v, size_t n)': it was not
+	  initializing the `empty' member.  (Thanks to Axel Simon.)
+
+2003-08-20 Wednesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.81): Fixed constructor
+	  `PIFunc::PIFunc(dimension_type* v, size_t n)': it was not
+	  initializing the `empty' member.  (Thanks to Axel Simon.)
+
+2003-08-19 Tuesday 09:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.inlines.hh (1.12), PowerSet.defs.hh
+	  (1.41), PowerSet.inlines.hh (1.45): Lazy, much more efficient
+	  implementation of powersets.
+
+2003-08-18 Monday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.77), src/Variable.cc (1.13), src/Variable.defs.hh (1.32),
+	  tests/writevariable1.cc (1.8): The type of output functions for
+	  the class Variable, Variable::Output_Function_Type, is now
+	  defined as void Output_Function_Type(std::ostream& s, const
+	  Variable& v).  In other words, `v' is now passed by const
+	  reference and not by value.
+
+2003-08-10 Sunday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.11): Removed the final
+	  pairwise-reduction step from the 4th case of the new widening.
+
+2003-08-10 Sunday 12:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.10): Added a new case to the
+	  definition of the new widening for powerset polyhedra.
+
+2003-08-08 Friday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.9): Corrected the
+	  implementation of the new widening so that we now check for `y'
+	  not being a singleton before computing its multiset lgo
+	  information.
+
+2003-08-07 Thursday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/powersetwidening1.cc (1.1): Put under CVS control.
+
+2003-08-06 Wednesday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.9),
+	  src/Polyhedra_PowerSet.inlines.hh (1.8), src/Polyhedron.defs.hh
+	  (1.214), src/Polyhedron.inlines.hh (1.83),
+	  src/Polyhedron_widenings.cc (1.12), tests/Makefile.am (1.183):
+	  Added a (rough) draft for the new widening on Polyhedra_PowerSet,
+	  using the BHRZ03 widening and based on the lgo relation induced
+	  by the BHRZ03 lgo.
+
+2003-08-06 Wednesday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.97), Watchdog/configure.ac (1.18): Allow for
+	  `mild', -O1 optimization.
+
+2003-08-04 Monday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.8): Let the PPL compile.
+
+2003-08-04 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.7),
+	  Polyhedra_PowerSet.inlines.hh (1.7), PowerSet.defs.hh (1.40),
+	  PowerSet.inlines.hh (1.44): Currect, greedy implementation of the
+	  powerset construction and of its specialization on polyhedra.
+	  (Will be replaced by a lazy implementation ASAP.)
+
+2003-08-04 Monday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.6),
+	  Polyhedra_PowerSet.inlines.hh (1.6), Polyhedron.defs.hh (1.213),
+	  Polyhedron.inlines.hh (1.82), Polyhedron_widenings.cc (1.11):
+	  Drafted functions to compute multiset lgo for the powerset
+	  domain.
+
+2003-08-02 Saturday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.21): Alternative implementation for
+	  SatRow::next() added in a comment.
+
+2003-07-30 Wednesday 22:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.18): Build an RPM package also for the PWL.  The
+	  Prolog interfaces depend on the PWL.
+
+2003-07-30 Wednesday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: xsb_clpq.P (1.7), xsb_clpq2.P (1.5): XSB
+	  version 2.6 still does not offer read_term/2.
+
+2003-07-30 Wednesday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.106), XSB/.cvsignore
+	  (1.3), XSB/Makefile.am (1.15), XSB/ppl_xsb.cc (1.40): Removed
+	  most of the kludges we had for supporting old versions of XSB.
+	  We now only support XSB version 2.6 and following.
+
+2003-07-28 Monday 08:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/fdl.dox (1.5), doc/gpl.dox (1.5),
+	  interfaces/Prolog/Prolog_interface.dox (1.105): No longer using
+	  Doxygen sectioning commands inside normal documentation blocks
+	  (they only work inside \page and \mainpage blocks). Instead, now
+	  using \anchor and unnumbered section headings.
+
+2003-07-22 Tuesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.5): Ensure omega reductions
+	  in the widening and extrapolation methods.
+
+2003-07-22 Tuesday 13:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.43): PowerSet::is_top() now asserts
+	  this->is_omega_reduced().
+
+2003-07-21 Monday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.defs.hh (1.5),
+	  Polyhedra_PowerSet.inlines.hh (1.4): Limited extrapolation
+	  operators added.
+
+2003-07-20 Sunday 12:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.18), config.sub (1.17): Updated.
+
+2003-07-18 Friday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.122): Citations fixed.
+
+2003-07-18 Friday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.17), AskTell.inlines.hh (1.17): Entry
+	  point for AskTell<CS>::H79_extrapolation_assign() added.
+
+2003-07-18 Friday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.20): poly_hull_assign_if_exact() improved.
+
+2003-07-18 Friday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.inlines.hh (1.3):
+	  Polyhedra_PowerSet<PH>::collapse() improved.
+
+2003-07-16 Wednesday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/h79widening7.cc (1.2): Make sure the outcome is as
+	  expected.
+
+2003-07-16 Wednesday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/h79widening6.cc (1.3): Made silent.
+
+2003-07-16 Wednesday 15:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.63), Polyhedron_widenings.cc (1.10): Corrected
+	  a bug in H79_widening_assign() and BHRZ03_combining_constraints()
+	  whereby we could have created an illegal constraint system (the
+	  bug was showing up when running the test h79widening6 with
+	  assertions enabled).	Also added an assertion to the
+	  corresponding constructor of Matrix.
+
+2003-07-16 Wednesday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.121): Updated.
+
+2003-07-16 Wednesday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.4): Comment fixed.
+
+2003-07-16 Wednesday 09:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.182), h79widening7.cc (1.1):
+	  h79widening7.cc shows there is a bug somewhere.
+
+2003-07-15 Tuesday 22:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: h79widening6.cc (1.2), mc91.cc (1.13): Brought up-to-date
+	  with respect to the rest of the library.
+
+2003-07-15 Tuesday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedra_PowerSet.defs.hh (1.3): Initial fix for the problem
+	  concerning dependent names.
+
+2003-07-15 Tuesday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.96), m4/ac_check_gmp.m4 (1.13): Separated the
+	  check for the existence of the GMP library from the check that it
+	  has been compiled with the C++ interface enabled. Changed error
+	  messages accordingly, to avoid the user getting confused.
+
+2003-07-14 Monday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.34): Fixed two copy-and-paste
+	  errors.
+
+2003-07-14 Monday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedra_PowerSet.inlines.hh (1.2), PowerSet.defs.hh
+	  (1.39), PowerSet.inlines.hh (1.42): Lots of improvements and bug
+	  fixes.
+
+2003-07-14 Monday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.33): Exploit pointer equality to
+	  optimize equality and containment tests.
+
+2003-07-14 Monday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.16), AskTell.inlines.hh (1.16): Several
+	  improvements.
+
+2003-07-13 Sunday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.15), AskTell.inlines.hh (1.15),
+	  Polyhedra_PowerSet.defs.hh (1.2): Fixed a few glitches.
+
+2003-07-13 Sunday 11:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.19): Several functions moved (as methods) to
+	  the Polyhedra_PowerSet class.
+
+2003-07-13 Sunday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.64), Polyhedra_PowerSet.defs.hh (1.1),
+	  Polyhedra_PowerSet.inlines.hh (1.1), Polyhedra_PowerSet.types.hh
+	  (1.1): The powerset construction instantiated on PPL polyhedra.
+
+2003-07-13 Sunday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.38), PowerSet.inlines.hh (1.41):
+	  Rewritten so as to be truly generic.
+
+2003-07-13 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.14), AskTell.inlines.hh (1.14): Includes
+	  fixed.  Comment added.
+
+2003-07-10 Thursday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.181), h79widening6.cc (1.1): Test the
+	  simple powerset widening.
+
+2003-07-10 Thursday 17:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.18): Includes fixed.  Simple powerset
+	  widening reimplemented.
+
+2003-07-10 Thursday 17:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.14): Wrong call to
+	  Polyhedron::throw_topology_incompatible() replaced with call to
+	  Polyhedron::throw_dimension_incompatible().
+
+2003-07-10 Thursday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.63): Obsolete stuff out, AskTell class in.
+
+2003-07-10 Thursday 17:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.33), Determinate.inlines.hh (1.32):
+	  Big exception-safety bug fixed.  Some obsolete stuff removed.
+
+2003-07-10 Thursday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.37), PowerSet.inlines.hh (1.40),
+	  PowerSet.types.hh (1.5): Several improvements.
+
+2003-07-10 Thursday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.13), AskTell.inlines.hh (1.13),
+	  AskTell.types.hh (1.5), LCompare.defs.hh (1.6),
+	  LCompare.inlines.hh (1.5), LCompare.types.hh (1.5): Started
+	  reimplementing the AskTell class from scratch.
+
+2003-07-10 Thursday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.55): We must not forget to harmonize all the methods void
+	  PPL::Polyhedron::throw_...(): now they build error messages
+	  according to (confusingly) different styles.
+
+2003-07-05 Saturday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mc91.cc (1.12): Call PowerSet:add_disjunct() instead of the
+	  no longer existing PowerSet::inject().
+
+2003-07-05 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.12): Delete statement uncommented.
+
+2003-07-05 Saturday 17:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.17): Added simple widening on powersets of
+	  polyhedra.  They are based on the extrapolation operators but
+	  enforce a maximum number of polyhedra in the destination
+	  powerset.
+
+2003-07-05 Saturday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.36), PowerSet.inlines.hh (1.39): Added
+	  template <typename CS> void PowerSet<CS>::pop_back().
+
+2003-07-01 Tuesday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.35), PowerSet.inlines.hh (1.38),
+	  algorithms.hh (1.16): PowerSet::inject() renamed
+	  PowerSet::add_disjunct().
+
+2003-07-01 Tuesday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.12), AskTell.inlines.hh (1.12):
+	  AskTell::inject() renamed AskTell::add_pair().
+
+2003-07-01 Tuesday 09:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.inlines.hh (1.81), PowerSet.defs.hh (1.34):
+	  Corrected minor typo.  Renamed PowerSet::add_disjunct as
+	  PowerSet::inject.
+
+2003-06-17 Tuesday 23:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, Polyhedron_widenings.cc
+	  (alt_lgo.[1,1]): Initial support for the "facing constraints"
+	  technique, as provided by Pat.
+
+2003-06-17 Tuesday 23:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.defs.hh (1.33): Comments revised.  Some cleaning.
+
+2003-05-24 Saturday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* install-sh (1.5): Updated.
+
+2003-05-15 Thursday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.54): Started drafting a list of enhancements for PPL 0.6.
+
+2003-05-07 Wednesday 21:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (ppl-0_5-branch.1): Functon linear_partition()
+	  excluded from the user manual version 0.5.
+
+2003-05-07 Wednesday 21:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, PowerSet.defs.hh
+	  (ppl-0_5-branch.[1,1]): Determinate and PowerSet template classes
+	  excluded from the user manual of version 0.5.
+
+2003-05-04 Sunday 19:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.10), doc/devref-browse.doxyconf-latex.in (1.32),
+	  doc/devref-print.doxyconf-latex.in (1.32),
+	  doc/devref.doxyconf-html.in (1.33), src/Determinate.defs.hh
+	  (1.32), src/Determinate.inlines.hh (1.31), src/PowerSet.defs.hh
+	  (1.32), src/PowerSet.inlines.hh (1.37): In the STANDARDS,
+	  explained how the Doxygen documentation of a non-member method
+	  has to be related to a templatic class.  Added or improved the
+	  documentation of Determinate and PowerSet. Let these files be
+	  included in the devref manual (they were already in the user
+	  manual).
+
+2003-05-01 Thursday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.dox (ppl-0_5-branch.1): \ingroup replaced by \addtogroup,
+	  since otherwise the documentation page is not included in the
+	  produced manuals.
+
+2003-05-01 Thursday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/fdl.dox (1.4): \ingroup replaced by \addtogroup, since
+	  otherwise the documentation page is not included in the produced
+	  manuals.
+
+2003-05-01 Thursday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in,
+	  devref-print.doxyconf-latex.in, devref.doxyconf-html.in
+	  (ppl-0_5-branch.[1,1,1]): List CATCH_ALL in EXPAND_AS_DEFINED.
+	  This is a temporary kludge to get around a bug in Doxygen whereby
+	  occurrences of CATCH_ALL are otherwise interpreted as namespace
+	  declarations.
+
+2003-05-01 Thursday 10:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.31),
+	  devref-print.doxyconf-latex.in (1.31), devref.doxyconf-html.in
+	  (1.32): List CATCH_ALL in EXPAND_AS_DEFINED.	This is a temporary
+	  kludge to get around a bug in Doxygen whereby occurrences of
+	  CATCH_ALL are otherwise interpreted as namespace declarations.
+
+2003-04-30 Wednesday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (ppl-0_5-branch.1), Matrix.defs.hh (1.50):
+	  Use \genfrac instead of \atop, since the latter causes problems
+	  with the amsmath package.
+
+2003-04-30 Wednesday 20:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (ppl-0_5-branch.1), Polyhedron.defs.hh
+	  (1.212): Name the parameters of conversion() in a consistent way.
+
+2003-04-30 Wednesday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.95): Version number bumped.
+
+2003-04-27 Sunday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, Watchdog/ChangeLog, Watchdog/NEWS, Watchdog/README,
+	  Watchdog/configure.ac (ppl-0_5-branch.[2,2,1,1,1]): Synchronize
+	  with the main trunk.
+
+2003-04-27 Sunday 21:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_5-branch.1): Update version.
+
+2003-04-27 Sunday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_5-branch.[1,1]): Mark
+	  ChangeLog.
+
+2003-04-27 Sunday 21:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.16), Watchdog/ChangeLog (1.6): Updated.
+
+2003-04-27 Sunday 21:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.17): Version number bumped.
+
+2003-04-27 Sunday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.15), Watchdog/ChangeLog (1.5): Updated.
+
+2003-04-27 Sunday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: ChangeLog (1.4), NEWS (1.3), README (1.5): Updated for
+	  release 0.2.
+
+2003-04-27 Sunday 21:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.53), ChangeLog (1.14): Updated.
+
+2003-04-27 Sunday 20:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.13): Updated.
+
+2003-04-27 Sunday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.76): Reorganized.
+
+2003-04-27 Sunday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.7), BoundingBox.defs.hh (1.10),
+	  BoundingBox.inlines.hh (1.10), Polyhedron.inlines.hh (1.80):
+	  Added Doxygen comments for class BoundingBox.  Method
+	  Polyehdron::shrink_bounding_box() adapted to the lack of default
+	  constructors for LBoundary and UBoundary.
+
+2003-04-27 Sunday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Interval.cc (1.8), Interval.defs.hh (1.15),
+	  Interval.inlines.hh (1.10): Added Doxygen comments to classes
+	  ERational, Boundary, LBoundary, UBoundary, Interval. Removed all
+	  the comparison operators that are not currently used in the
+	  sources. Removed the default constructors for LBoundary and
+	  UBoundary.  Made explicit that the Interval class, as it is
+	  defined, can only manipulate standard (i.e., non-extended)
+	  rational intervals.
+
+2003-04-27 Sunday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.72): Added a scary comment to Row::assign(),
+	  since its improper use may cause memory leaks.
+
+2003-04-27 Sunday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.211): In the documentation of
+	  shrink_bounding_box, we now state that we will always call
+	  raise_lower_bound and lower_upper_bound with fractions in
+	  canonical form.
+
+2003-04-27 Sunday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.30),
+	  devref-print.doxyconf-latex.in (1.30), devref.doxyconf-html.in
+	  (1.31): Added files Interval.* and BoundingBox.* to the
+	  documentation of the developers.
+
+2003-04-27 Sunday 12:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/writevariable1.cc (1.7): Pass objects of type `Variable' by
+	  value.
+
+2003-04-27 Sunday 11:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.18), LinExpression.defs.hh (1.60),
+	  LinExpression.inlines.hh (1.28), Polyhedron.defs.hh (1.210),
+	  Polyhedron_public.cc (1.13), Variable.cc (1.12), Variable.defs.hh
+	  (1.31), Variable.inlines.hh (1.16): Be consistent: always pass
+	  objects of type `Variable' by value.
+
+2003-04-27 Sunday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.6), BoundingBox.inlines.hh (1.9),
+	  ConSys.cc (1.66), ConSys.inlines.hh (1.30), Constraint.cc (1.39),
+	  Constraint.inlines.hh (1.47), GenSys.cc (1.84), GenSys.inlines.hh
+	  (1.31), Generator.cc (1.46), Generator.inlines.hh (1.41): Declare
+	  variables `const' whenever possible or desirable.  Other little
+	  improvements.
+
+2003-04-27 Sunday 10:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.62): Fixed a typo in a comment.
+
+2003-04-27 Sunday 09:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.9): Avoid unnecessary explicit
+	  initialization of vectors.
+
+2003-04-27 Sunday 09:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.8): Some debugging output removed.
+
+2003-04-27 Sunday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_widenings.cc (1.7): Declare variables `const'
+	  whenever possible or desirable.
+
+2003-04-26 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.12): Declare variables `const'
+	  whenever possible or desirable.
+
+2003-04-26 Saturday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.11): Declare variables `const'
+	  whenever possible or desirable.
+
+2003-04-26 Saturday 19:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.16): Updated.
+
+2003-04-26 Saturday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.75): Tentative release date for PPL 0.5 is April 28,
+	  2003.
+
+2003-04-26 Saturday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.27), SatMatrix.inlines.hh (1.20): Declare
+	  variables `const' whenever possible or desirable.
+
+2003-04-26 Saturday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.20), SatRow.inlines.hh (1.27): Declare
+	  variables `const' whenever possible or desirable.
+
+2003-04-26 Saturday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.61): Added comments to Matrix::sort_rows(first,
+	  last).
+
+2003-04-26 Saturday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.74), TODO (1.52): Widening with tokens announced in the
+	  NEWS file.
+
+2003-04-26 Saturday 07:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.80), ppl_c.h (1.89): Stick to the C89
+	  standard.
+
+2003-04-26 Saturday 07:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.51): We must announce widening with tokens in the NEWS
+	  file.
+
+2003-04-25 Friday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.15): Changes made elsewhere (removal of the
+	  comparison operators over polyhedra and introduction of widenings
+	  with tokens) now reflected here.
+
+2003-04-25 Friday 21:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.50): All the functionalities are available in all
+	  interfaces.  The documentation for Polyhedron::map_dimensions()
+	  and its wrappers for all the interfaces is OK.
+
+2003-04-24 Thursday 22:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.73), TODO (1.49), doc/definitions.dox (1.120),
+	  interfaces/C/ppl_c.cc (1.79), interfaces/C/ppl_c.h (1.88),
+	  interfaces/Prolog/Prolog_interface.dox (1.104),
+	  interfaces/Prolog/pl_check.pl (1.66),
+	  interfaces/Prolog/ppl_prolog.icc (1.115),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.57),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.38),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.52),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.76),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.25),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.39),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.70), src/Determinate.defs.hh
+	  (1.31), src/Determinate.inlines.hh (1.30), src/Polyhedron.defs.hh
+	  (1.209), src/Polyhedron.inlines.hh (1.79), src/PowerSet.defs.hh
+	  (1.31), src/PowerSet.inlines.hh (1.36), tests/Makefile.am
+	  (1.180), tests/mapdim1.cc (1.1), tests/remapdim1.cc (1.3): The
+	  "remap_dimensions" operation is now called "map_dimensions".
+
+2003-04-23 Wednesday 14:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.103), pl_check.pl
+	  (1.65): Improved grammar specification for Prolog interface.
+	  Amended remap test so that it does not refer to unused
+	  (singleton) variable D.
+
+2003-04-22 Tuesday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.50), minimize.cc (1.34), simplify.cc
+	  (1.32): Declare variables `const' whenever possible or desirable.
+
+2003-04-22 Tuesday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.7), Polyhedron_nonpublic.cc (1.10),
+	  Polyhedron_public.cc (1.11), Polyhedron_widenings.cc (1.6):
+	  Consistently use `space_dim' instead of `space_dimension()' from
+	  within the Polyhedron class.
+
+2003-04-22 Tuesday 08:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.60), Matrix.inlines.hh (1.34), Row.cc (1.56),
+	  Row.inlines.hh (1.41): Declare variables `const' whenever
+	  possible or desirable.
+
+2003-04-20 Sunday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.87),
+	  interfaces/Prolog/Prolog_interface.dox (1.102),
+	  interfaces/Prolog/pl_check.pl (1.64),
+	  interfaces/Prolog/ppl_prolog.icc (1.114), src/Polyhedron.defs.hh
+	  (1.208), src/Polyhedron.inlines.hh (1.78), tests/remapdim1.cc
+	  (1.2): Changed the documentation of the remapping operator to
+	  refer to the specification provided in doc/definitions.dox;
+	  changed the tests to avoid experimenting with cases when the
+	  behavior is undefined; no longer insisting that the partial
+	  function is injective (since this is required but it is not
+	  enough to obtain a well-defined behavior).
+
+2003-04-19 Saturday 10:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.179), remapdim1.cc (1.1), renamedim1.cc
+	  (1.3): Test program renamedim1.cc renamed remapdim1.cc.
+
+2003-04-18 Friday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.119), doc/devref-browse.doxyconf-latex.in
+	  (1.29), doc/devref-print.doxyconf-latex.in (1.29),
+	  doc/devref.doxyconf-html.in (1.30),
+	  doc/user-browse.doxyconf-latex.in (1.16),
+	  doc/user-print.doxyconf-latex.in (1.16),
+	  doc/user.doxyconf-html.in (1.18), interfaces/C/ppl_c.cc (1.78),
+	  interfaces/C/ppl_c.h (1.86),
+	  interfaces/Prolog/Prolog_interface.dox (1.101),
+	  interfaces/Prolog/pl_check.pl (1.63),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.7),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.19),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.56),
+	  interfaces/Prolog/GNU/Makefile.am (1.30),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.13),
+	  interfaces/Prolog/SICStus/Makefile.am (1.36),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.6),
+	  interfaces/Prolog/SWI/Makefile.am (1.28),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.75),
+	  interfaces/Prolog/XSB/Makefile.am (1.14),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.38),
+	  interfaces/Prolog/YAP/Makefile.am (1.22),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.69), m4/Makefile.am (1.9),
+	  m4/ac_check_gmp.m4 (1.12), m4/ac_cxx_flexible_arrays.m4 (1.6),
+	  src/ConSys.cc (1.65), src/GenSys.cc (1.83), src/GenSys.defs.hh
+	  (1.92), src/Generator.defs.hh (1.84), src/Matrix.cc (1.59),
+	  src/Matrix.defs.hh (1.49), src/NNC_Polyhedron.defs.hh (1.22),
+	  src/Poly_Con_Relation.defs.hh (1.22), src/Polyhedron.defs.hh
+	  (1.207), src/Polyhedron.inlines.hh (1.77),
+	  src/Polyhedron_chdims.cc (1.6), src/Polyhedron_nonpublic.cc
+	  (1.9), src/Polyhedron_public.cc (1.10),
+	  src/Polyhedron_widenings.cc (1.5), src/PowerSet.inlines.hh
+	  (1.35), src/Row.cc (1.55), src/Row.defs.hh (1.71),
+	  src/SatMatrix.cc (1.26), src/SatMatrix.defs.hh (1.32),
+	  src/SatRow.cc (1.19), src/SatRow.defs.hh (1.31), src/Status.cc
+	  (1.21), src/conversion.cc (1.49), src/minimize.cc (1.33),
+	  src/simplify.cc (1.31): Trailing blanks removed.
+
+2003-04-18 Friday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.72), TODO (1.48), interfaces/C/ppl_c.cc (1.77),
+	  interfaces/C/ppl_c.h (1.85),
+	  interfaces/Prolog/Prolog_interface.dox (1.100),
+	  interfaces/Prolog/pl_check.pl (1.62),
+	  interfaces/Prolog/ppl_prolog.icc (1.113),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.55),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.37),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.51),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.74),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.24),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.37),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.68), src/Determinate.defs.hh
+	  (1.30), src/Determinate.inlines.hh (1.29), src/Polyhedron.defs.hh
+	  (1.206), src/Polyhedron.inlines.hh (1.76), src/PowerSet.defs.hh
+	  (1.30), src/PowerSet.inlines.hh (1.34), tests/renamedim1.cc
+	  (1.2): The "rename_dimensions" operation is now called
+	  "remap_dimensions".
+
+2003-04-18 Friday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.118): Section about "Remapping the
+	  Dimension of the Vector Space" rewritten.
+
+2003-04-18 Friday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/ppl.sty (1.12): New macro \pard[3] to typeset the signature
+	  of a partial function.
+
+2003-04-17 Thursday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.117), src/ConSys.cc (1.64),
+	  src/Matrix.defs.hh (1.48), src/Polyhedron_nonpublic.cc (1.8):
+	  Prefer "zeroes" to "zeros".
+
+2003-04-17 Thursday 22:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.112): The Boundary_Kind enum
+	  is now confined into the anonymous namespace.
+
+2003-04-17 Thursday 22:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.11), interfaces/Prolog/ppl_prolog.icc
+	  (1.111): Prefer anonymous namespaces to static declarations.
+
+2003-04-17 Thursday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.110),
+	  src/BoundingBox.inlines.hh (1.8), src/Interval.cc (1.7),
+	  src/Interval.defs.hh (1.14), src/Interval.inlines.hh (1.9),
+	  src/Interval.types.hh (1.6), src/Polyhedron.inlines.hh (1.75):
+	  Class `ExtendedRational' renamed `ERational'.
+
+2003-04-17 Thursday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.47), src/Matrix.defs.hh (1.47), src/Matrix.inlines.hh
+	  (1.33): Fixed the comments of the following methods of Matrix:
+	  void grow(dimension_type new_n_rows, dimension_type
+	  new_n_columns); void resize_no_copy(dimension_type new_n_rows,
+	  void add_rows_and_columns(dimension_type n).
+
+2003-04-17 Thursday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.94): Version number bumped.
+
+2003-04-17 Thursday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.21): Target `check-local'
+	  fixed.
+
+2003-04-17 Thursday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.20): Remove ciao_clpq and
+	  ciao_clpq2 when cleaning.
+
+2003-04-17 Thursday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.29): Remove check_script3
+	  when cleaning.
+
+2003-04-17 Thursday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.20): Distribute also
+	  yap_pl_check.pl.
+
+2003-04-17 Thursday 07:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.28): Distribute also
+	  gnu_pl_check.pl.
+
+2003-04-16 Wednesday 07:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.99): Small corrections
+	  made.
+
+2003-04-16 Wednesday 05:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.23): Distribute expected3.
+
+2003-04-15 Tuesday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.22): Distribute also
+	  pl_check.pl.
+
+2003-04-15 Tuesday 19:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.71), TODO (1.46), interfaces/C/ppl_c.cc (1.76),
+	  interfaces/C/ppl_c.h (1.84),
+	  interfaces/Prolog/Prolog_interface.dox (1.98),
+	  interfaces/Prolog/pl_check.pl (1.61),
+	  interfaces/Prolog/ppl_prolog.icc (1.109),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.54),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.36),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.50),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.73),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.23),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.36),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.67), src/C_Polyhedron.cc
+	  (1.6), src/Determinate.inlines.hh (1.28), src/Polyhedron.defs.hh
+	  (1.205), src/Polyhedron.inlines.hh (1.74),
+	  src/Polyhedron_public.cc (1.9), tests/bounded1.cc (1.12),
+	  tests/disjoint1.cc (1.6), tests/disjoint2.cc (1.7),
+	  tests/disjoint3.cc (1.6), tests/empty1.cc (1.13),
+	  tests/intersection2.cc (1.9), tests/linearpartition1.cc (1.12),
+	  tests/linearpartition2.cc (1.12), tests/linearpartition3.cc
+	  (1.12), tests/randphull1.cc (1.9), tests/smm1.cc (1.14),
+	  tests/timeelapse5.cc (1.8), tests/topclosed1.cc (1.6),
+	  tests/topclosed2.cc (1.5), tests/topclosed3.cc (1.7),
+	  tests/universe1.cc (1.9), tests/universe2.cc (1.10),
+	  tests/universe3.cc (1.10), tests/universe4.cc (1.10),
+	  tests/universe5.cc (1.11), tests/universe6.cc (1.8): The methods
+	  Polyhedron::check_empty() and Polyhedron::check_universe() have
+	  been renamed is_empty() and is_universe(), respectively.  The
+	  function check_disjoint(const Polyhedron&, const Polyhedron&) had
+	  been replaced by method Polyhedron::is_disjoint_from(const
+	  Polyhedron&).  The methods Polyhedron::check_bounded() and
+	  Polyhedron::check_topologically_closed() have been renamed
+	  is_bounded() and is_topologically_closed(), respectively.
+
+2003-04-15 Tuesday 19:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.19): Distribute also
+	  ciao_clpq2.pl.
+
+2003-04-15 Tuesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.204), Polyhedron.inlines.hh (1.73),
+	  Polyhedron_chdims.cc (1.5), Polyhedron_nonpublic.cc (1.7),
+	  Polyhedron_public.cc (1.8), Polyhedron_widenings.cc (1.4):
+	  Polyhedron::is_empty() renamed Polyhedron::marked_empty().
+
+2003-04-15 Tuesday 13:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.16), Watchdog/ltmain.sh (1.5): Updated.
+
+2003-04-15 Tuesday 09:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.70), interfaces/C/ppl_c.cc (1.75),
+	  interfaces/Prolog/ppl_prolog.icc (1.108), src/ConSys.defs.hh
+	  (1.79), src/GenSys.defs.hh (1.91), src/Generator.defs.hh (1.83),
+	  src/Polyhedron.defs.hh (1.203), src/Polyhedron.inlines.hh (1.72),
+	  src/Polyhedron_public.cc (1.7), src/Polyhedron_widenings.cc
+	  (1.3), tests/Makefile.am (1.178), tests/NNCinclusion1.cc (1.7),
+	  tests/contains1.cc (1.4), tests/contains2.cc (1.1),
+	  tests/contains3.cc (1.1), tests/contains4.cc (1.1),
+	  tests/contains5.cc (1.1), tests/exceptions1.cc (1.34),
+	  tests/exceptions2.cc (1.28), tests/inclusion1.cc (1.7),
+	  tests/inclusion2.cc (1.4), tests/linearpartition1.cc (1.11),
+	  tests/linearpartition2.cc (1.11), tests/linearpartition3.cc
+	  (1.11), tests/operator1.cc (1.5): The functions
+	  Polyhedron::operator<=(const Polyhedron&, const Polyhedron&),
+	  Polyhedron::operator>=(const Polyhedron&, const Polyhedron&),
+	  Polyhedron::operator<(const Polyhedron&, const Polyhedron&), and
+	  Polyhedron::operator>(const Polyhedron&, const Polyhedron&) have
+	  been removed.  The methods Polyhedron::contains(const
+	  Polyhedron&) and Polyhedron::strictly_contains(const Polyhedron&)
+	  provide the same functionality.
+
+2003-04-14 Monday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.202), Polyhedron_nonpublic.cc (1.6),
+	  Polyhedron_public.cc (1.6): Polyhedron::is_included(const
+	  Polyhedron&) renamed Polyhedron::is_included_in(const
+	  Polyhedron&).
+
+2003-04-14 Monday 12:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.60), Ciao/ppl_ciao.pl (1.53):
+	  The ciao system now allows for
+	  ppl_Polyhedron_generalized_affine_image to fail.  This is now
+	  tested in pl_check.
+
+2003-04-14 Monday 11:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.59), Ciao/ppl_ciao.pl (1.52):
+	  This allows for failure in ciao for timeout_exception_atom when
+	  the atom given does not unify with the current value and also for
+	  the new_Polyhedron predicates when unifying the new handle with
+	  the input value.  In order to test this, the tests in pl_check
+	  assume that unifying a new handle with value 0 will fail.
+
+2003-04-13 Sunday 21:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/expected2 (1.8): Adapted to strong
+	  normalization.
+
+2003-04-13 Sunday 13:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.63), GenSys.cc (1.82), Matrix.cc (1.58),
+	  Matrix.defs.hh (1.46), Row.cc (1.54), Row.defs.hh (1.70),
+	  simplify.cc (1.30): Added a boolean parameter to Matrix::OK() to
+	  control whether or not we also want to check for strong
+	  normalization of the rows in the matrix.  Strong normalization is
+	  now checked when this might be useful, i.e., avoiding bare
+	  repetitions of the same check.  Also added a method
+	  Row::check_strongly_normalized() with the obvious semantics.
+
+2003-04-13 Sunday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.18): Do not use the
+	  GLOBALSTKSIZE kludge for testing with clpq2.pl.
+
+2003-04-13 Sunday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.51): Indentation fixed.
+
+2003-04-12 Saturday 20:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/expected2 (1.10): Updated according to the
+	  enforcing of strong-normalization.
+
+2003-04-12 Saturday 20:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplify.cc (1.29): Method Polyhedron::simplify(mat, sat)
+	  takes as 1st input argument a well-formed Matrix mat.  When a
+	  ray-point-inequality is transformed into a line-equality,
+	  sign_normalization is applied to enforce strong-normalization.
+	  Well-formedness of mat also asserted on exit.
+
+2003-04-12 Saturday 20:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.57): Methods Matrix::gauss() and
+	  Matrix::back_substitute() are applied to well-formed matrices and
+	  will return well-formed matrices.  Corrected a bug in the
+	  handling of the sortedness flag in back_substitute().  Method
+	  Matrix::OK() now also checks strong normalization of rows.
+
+2003-04-12 Saturday 20:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc (1.53), Row.defs.hh (1.69), Row.inlines.hh (1.40):
+	  Strong normalization of rows made inline and implemented by
+	  calling Row::normalize() and Row::sign_normalize().
+
+2003-04-11 Friday 08:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.62), GenSys.cc (1.81): Fixed a couple of
+	  comments.
+
+2003-04-11 Friday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.15), Watchdog/ltmain.sh (1.4): Updated.
+
+2003-04-11 Friday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.61), Constraint.cc (1.38),
+	  Constraint.inlines.hh (1.46), GenSys.cc (1.80), Generator.cc
+	  (1.45), Matrix.cc (1.56), Matrix.inlines.hh (1.32), Row.cc
+	  (1.52), Row.defs.hh (1.68), conversion.cc (1.48), simplify.cc
+	  (1.28): Commit to EXTRA_NORMALIZATION=1.
+
+2003-04-10 Thursday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.60), GenSys.cc (1.79), Polyhedron_widenings.cc
+	  (1.2), conversion.cc (1.47): Strong normalization of rows called
+	  when EXTRA_NORMALIZATION is set; otherwise use (simple)
+	  normalization.
+
+2003-04-10 Thursday 12:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.59), GenSys.cc (1.78), Matrix.defs.hh (1.45),
+	  Matrix.inlines.hh (1.31), Polyhedron_chdims.cc (1.4): Added
+	  method Matrix::remove_columns(dimension_type new_n_columns) with
+	  the expected semantics. The method ensures that the resulting
+	  matrix is in normal form, thus correcting the bug shown by
+	  removedim10.cc.  The new method is now used everywhere we remove
+	  columns from a matrix.
+
+2003-04-10 Thursday 11:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/removedim10.cc (1.2): Corrected the known result.
+
+2003-04-10 Thursday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.177), removedim10.cc (1.1): New test
+	  showing a bug whereby rows of matrices are not re-normalized
+	  after the removal of some columns.
+
+2003-04-10 Thursday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/removedim9.cc (1.5): Indentation fixed.
+
+2003-04-09 Wednesday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.9): Improved the section about the production of
+	  Doxygen documentation.
+
+2003-04-09 Wednesday 09:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.58): Changed the way variables
+	  are bound to dimension names.  This avoids a problem due to a bug
+	  in XSB.
+
+2003-04-08 Tuesday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.45): For the moment, it is convenient to have
+	  Matrix::set_sorted(bool value) instead of, say,
+	  Matrix::set_sorted() and Matrix::set_unsorted().  Sortedness will
+	  have to be dealt with at a more fundamental level anyway.
+
+2003-04-08 Tuesday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.4): Updated.
+
+2003-04-08 Tuesday 19:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.44): Section on "Constructions on Polyhedra" revised.
+	  Minor fix in the section about "Cutting-Plane Methods".
+
+2003-04-08 Tuesday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.43): Remove the section about designing and
+	  implementating strict weak orderings on polyhedra.
+
+2003-04-08 Tuesday 19:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.15): Updated.
+
+2003-04-08 Tuesday 18:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.5): Copyright symbol added.
+
+2003-04-08 Tuesday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.12): Updated.
+
+2003-04-08 Tuesday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.7): Minor correction.
+
+2003-04-08 Tuesday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.97): Information on how
+	  to use the XSB interface added.
+
+2003-04-08 Tuesday 16:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatMatrix.defs.hh (1.31): Added short Doxygen description and
+	  improved the long one for SatMatrix.
+
+2003-04-08 Tuesday 13:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.49): Added missing
+	  definitions for
+	  ppl_Polyhedron_limited_H79_extrapolation_assign_with_token and
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token.
+
+2003-04-08 Tuesday 13:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.322): Implementation file Polyhedron.cc has
+	  been split in 4 chunks: - Polyhedron_widenings.cc contains the
+	  definitions of (non-inline) functions   related to widening and
+	  extrapolation operators; - Polyhedron_chdims.cc contains the
+	  definitions of (non-inline) functions   that change the space
+	  dimensions; - Polyhedron_public.cc contains the definitions of
+	  all the other public	 (non-inline) functions -
+	  Polyhedron_nonpublic.cc contains the definitions of all the other
+	  non-public (i.e., private or protected) (non-inline) functions.
+
+2003-04-08 Tuesday 13:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_chdims.cc (1.3), Polyhedron_nonpublic.cc (1.5),
+	  Row.defs.hh (1.67), statistics.hh (1.2): Added Doxygen
+	  documentation for a few #define's.
+
+2003-04-08 Tuesday 10:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.57), Ciao/ppl_ciao.pl (1.50):
+	  Added code and test to allow for Prolog failure in the
+	  ppl_Polyhedron_generalized_affine_image_lhs_rhs/4 predicate.
+
+2003-04-08 Tuesday 09:39  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.56): Added tests for Prolog
+	  failure for the "with_token" predicates.  Some reorganisation of
+	  the widening/extrapolation tests.
+
+2003-04-08 Tuesday 09:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.49): Modified the
+	  "with_token" predicates to allow for Prolog failure.
+
+2003-04-08 Tuesday 08:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.29), PowerSet.inlines.hh (1.33): Added
+	  \relates command for functions working on class template
+	  PowerSet.
+
+2003-04-08 Tuesday 08:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.66): Improved the detailed Doxygen description
+	  of class Row.
+
+2003-04-08 Tuesday 08:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.29), Determinate.inlines.hh (1.27):
+	  Added a few \relates commands, which however show a bug in the
+	  handling of template specializations by Doxygen.
+
+2003-04-08 Tuesday 08:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.cc (1.17): Added missing \relates Doxygen
+	  commands.
+
+2003-04-07 Monday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.14), Watchdog/ltmain.sh (1.3): Updated.
+
+2003-04-07 Monday 08:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.48): The local definition
+	  of many of the ppl predicates changed to allow for Prolog
+	  failure.  Some missing predicates added.
+
+2003-04-07 Monday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.55): Tests have been improved
+	  and extended to check negation and Prolog failure.  Some
+	  reorganisation done.
+
+2003-04-07 Monday 07:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.35):
+	  ppl_Polyhedron_limited_H79_extrapolation_assign_with_token was
+	  missing - is now added.
+
+2003-04-06 Sunday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.84), Constraint.inlines.hh (1.45),
+	  Generator.defs.hh (1.82), Generator.inlines.hh (1.40),
+	  LinExpression.defs.hh (1.59), LinExpression.inlines.hh (1.27),
+	  Polyhedron_public.cc (1.5): Adding a few missing \relates Doxygen
+	  commands.  Avoid adding Doxygen blocks near to *friend*
+	  declarations: comment the very function declarations instead.
+
+2003-04-06 Sunday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.21),
+	  Poly_Con_Relation.inlines.hh (1.10), Poly_Gen_Relation.defs.hh
+	  (1.20), Poly_Gen_Relation.inlines.hh (1.10), SatRow.inlines.hh
+	  (1.26), Status.defs.hh (1.28), Status.inlines.hh (1.13): Adding a
+	  few missing \relates Doxygen commands.  Avoid adding Doxygen
+	  blocks near to *friend* declarations: comment the very function
+	  declarations instead.
+
+2003-04-06 Sunday 18:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.defs.hh (1.30): Removed declared but unimplemented
+	  member function unsigned int size().
+
+2003-04-06 Sunday 12:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.65): Upgraded the detailed documentation of
+	  class Row to also describe the representation of NNC row objects.
+
+2003-04-05 Saturday 09:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Status.defs.hh (1.27): Modified class documentation to also
+	  consider the flags about pending constraints and generators.
+	  Moved Doxygen comments from friend declaration to the real
+	  function declaration. Avoid using preproc flag PPL_DOXYGEN_HYDE_
+	  IMPLEMENTATION_DETAILS when useless, i.e., when we are inside a
+	  class whose documentation is already hidden.
+
+2003-04-05 Saturday 09:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.55), Matrix.defs.hh (1.44): Adjusted a couple
+	  of Doxygen and code comments.
+
+2003-04-01 Tuesday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.93): Fixed a bug whereby building of the SICStus
+	  Prolog interface was attempted even if deemed to fail because the
+	  sicstus.h include could not be found.
+
+2003-04-01 Tuesday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron_public.cc (1.4), SatRow.cc (1.18): Added four
+	  \relates Doxygen commands to correctly match declaration and
+	  definition of functions in the devref manual.
+
+2003-03-31 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.83): Missing inline qualification added.
+
+2003-03-31 Monday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.13): Updated.
+
+2003-03-28 Friday 10:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.92): When checking for the presence of source
+	  files, avoid testing for `Polyhedron.cc', who is going to be
+	  removed from the repository.
+
+2003-03-27 Thursday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.42): New items to be checked.
+
+2003-03-27 Thursday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.54): Comments of Matrix::operator=(const Matrix&
+	  y) made more precise.
+
+2003-03-27 Thursday 14:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.39): Indentation of preprocessing
+	  directives fixed.
+
+2003-03-27 Thursday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.51): Row::Impl::copy_construct() slightly improved.
+
+2003-03-27 Thursday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.inlines.hh (1.30): Spacing adjusted.
+
+2003-03-25 Tuesday 18:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.96), pl_check.pl
+	  (1.54): The documentation for the relations_with predicates
+	  corrected.  The tests for the relations_with predicates improved.
+
+2003-03-25 Tuesday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.71): Inline functions should be
+	  *defined* before they are used.
+
+2003-03-19 Wednesday 09:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.53): All tests now test both c
+	  and nnc polyhedra.  Some more checks on the interface
+	  incorporated into these tests.
+
+2003-03-19 Wednesday 08:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.30): Avoid unnecessary calls to
+	  append_size_rel.
+
+2003-03-19 Wednesday 07:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.29): Bug fixed
+
+2003-03-18 Tuesday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.defs.hh (1.29): Added Doxygen comment to class SatRow.
+	  Avoiding commenting friend declarations.
+
+2003-03-18 Tuesday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.64): Added doxygen comment to class Row::Impl.
+
+2003-03-18 Tuesday 12:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.28),
+	  devref-print.doxyconf-latex.in (1.28), devref.doxyconf-html.in
+	  (1.29): Added input file version.hh.
+
+2003-03-18 Tuesday 11:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.44), Row.cc (1.50), Row.defs.hh
+	  (1.63), Row.inlines.hh (1.38), SatMatrix.defs.hh (1.30),
+	  SatMatrix.inlines.hh (1.19), SatRow.defs.hh (1.28),
+	  SatRow.inlines.hh (1.25): As suggested in our STANDARDS file, let
+	  all Doxygen comments be centralized before methods declarations
+	  in file *.defs.hh.  In class Row, be careful to use the same
+	  parameter naming in declarations and definitions.  For Row and
+	  SatRow, let std::iter_swap be declared in *.defs.hh.
+
+2003-03-18 Tuesday 11:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.107), Ciao/ppl_ciao.pl
+	  (1.47): Be more general with respect to different ways of raising
+	  Prolog exceptions in C code.
+
+2003-03-18 Tuesday 10:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.95): Bug in comment for
+	  ppl_Polyhedron_OK fixed.
+
+2003-03-18 Tuesday 10:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.34): Repeated declaration
+	  removed.
+
+2003-03-18 Tuesday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.94): Bug fixed in
+	  documentation of ppl_Polyhedron_OK.
+
+2003-03-18 Tuesday 08:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.33): Bug fixed.
+
+2003-03-18 Tuesday 08:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.93), pl_check.pl
+	  (1.52), ppl_prolog.icc (1.106), Ciao/ppl_ciao.pl (1.46),
+	  GNU/ppl_gprolog.pl (1.35), SICStus/ppl_sicstus_sd.cc (1.48),
+	  SWI/ppl_swiprolog.cc (1.72), XSB/ppl_xsb.H (1.22), XSB/ppl_xsb.cc
+	  (1.32), YAP/ppl_yap.cc (1.66): The "with_token" predicates added
+	  for the extrapolation operators.  The ppl_Polyhedron_OK predicate
+	  added.  The documentation predicates reorganised to match the
+	  standard ordering.  Tests added for the new predicates.
+
+2003-03-17 Monday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.82): Comments fixed.
+
+2003-03-17 Monday 09:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.51): Many improvements and extra
+	  tests added.
+
+2003-03-16 Sunday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.105): Default arguments are
+	  only permitted on functions.
+
+2003-03-16 Sunday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.104): Prefer anonymous
+	  namespaces to static linkage.
+
+2003-03-16 Sunday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.inlines.hh (1.70), Polyhedron_chdims.cc (1.2),
+	  Polyhedron_nonpublic.cc (1.4), Polyhedron_public.cc (1.3): A few
+	  harmless FIXME's replaced by TODO.
+
+2003-03-16 Sunday 10:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_public.cc (1.2): In affine_image(), added a
+	  comment explaining why in one case we can leave work correctly
+	  with a DD pair having pending rows.
+
+2003-03-16 Sunday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron_nonpublic.cc (1.3): Preferred unset_pending_rows()
+	  wrt set_index_first_pending_row().
+
+2003-03-16 Sunday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplify.cc (1.27): Preferring unset_pending_rows() wrt
+	  set_index_first_pending_row().
+
+2003-03-16 Sunday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.46): Dealt with a FIXME. Preferring the use
+	  of unset_pending_rows() wrt the use of set_index_first_pending(),
+	  since the first is more intuitive.
+
+2003-03-16 Sunday 10:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.77): Dealt with the CHECK ME in
+	  remove_invalid_rays_and_lines().
+
+2003-03-16 Sunday 10:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.58): Added a needed comment.
+
+2003-03-15 Saturday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.103): Some code duplication
+	  avoided.
+
+2003-03-15 Saturday 13:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.78), GenSys.defs.hh (1.90): Corrected
+	  typos in comments.
+
+2003-03-15 Saturday 13:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.69): Small corrections in
+	  rename_dimensions().
+
+2003-03-15 Saturday 13:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.h (1.81), ppl_c.cc (1.74): Added the
+	  equality test for polyhedra to the C interface.
+
+2003-03-14 Friday 21:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.27),
+	  doc/devref-print.doxyconf-latex.in (1.27),
+	  doc/devref.doxyconf-html.in (1.28), interfaces/C/ppl_c.h (1.80),
+	  interfaces/Prolog/Prolog_interface.dox (1.92),
+	  interfaces/Prolog/ppl_prolog.icc (1.102),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.45),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.34),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.47),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.71),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.21),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.31),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.65), src/Polyhedron.defs.hh
+	  (1.201), src/Polyhedron.inlines.hh (1.68),
+	  src/Polyhedron_nonpublic.cc (1.2): Reordered the functions and
+	  their documentation in all the interfaces to follow the
+	  reorganization done in Polyhedron.defs.hh.  Adjusted Doxygen
+	  configuration files for the devref manuals to get their input
+	  from the new .cc files of class Polyhedron.
+
+2003-03-14 Friday 13:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.69), TODO (1.41), interfaces/C/ppl_c.cc (1.73),
+	  interfaces/C/ppl_c.h (1.79),
+	  interfaces/Prolog/Prolog_interface.dox (1.91),
+	  interfaces/Prolog/pl_check.pl (1.50),
+	  interfaces/Prolog/ppl_prolog.icc (1.101),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.44),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.33),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.46),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.70),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.20),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.30),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.64): Interfaces changed to
+	  match method name changes (check_bound, check_topolo- giaclly
+	  close and check_disjoint). Change reported in the NEWS.
+
+2003-03-14 Friday 13:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bounded1.cc (1.11), disjoint1.cc (1.5), disjoint2.cc
+	  (1.6), disjoint3.cc (1.5), linearpartition1.cc (1.10),
+	  linearpartition2.cc (1.10), linearpartition3.cc (1.10),
+	  topclosed1.cc (1.5), topclosed2.cc (1.4), topclosed3.cc (1.6):
+	  Tests changed according to method renaming.
+
+2003-03-14 Friday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.5), Makefile.am (1.62), Polyhedron.cc
+	  (1.321), Polyhedron.defs.hh (1.200), Polyhedron.inlines.hh
+	  (1.67), Polyhedron_chdims.cc (1.1), Polyhedron_nonpublic.cc
+	  (1.1), Polyhedron_public.cc (1.1), Polyhedron_widenings.cc (1.1):
+	  Split file Polyhedron.cc into several files.	Methods
+	  is_bounded(), is_topologically_closed() and are_disjoint()
+	  renamed to check_bounded(), check_topologically_closed() and
+	  check_disjoint().  Documentation reorganized to match more
+	  closely the order in the introduction of the user manual, also
+	  grouping related methods.  Added exception thrower
+	  throw_runtime_error().  In the documentation, all examples using
+	  class `Polyhedron' changed to use the user-accessible class
+	  `C_Polyhedron'.
+
+2003-03-14 Friday 12:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.43), Poly_Con_Relation.defs.hh (1.20),
+	  Poly_Gen_Relation.defs.hh (1.19), Row.defs.hh (1.62),
+	  SatRow.defs.hh (1.27), Status.defs.hh (1.26): In Doxygen
+	  documentation, replaced `@name' by `\name'.
+
+2003-03-14 Friday 09:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.17): Corrected for clpq2.pl
+	  checks
+
+2003-03-13 Thursday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.27), gnu_pl_check.pl
+	  (1.1): Test all predicates with GNU Prolog.
+
+2003-03-13 Thursday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/yap_pl_check.pl (1.2): Comment corrected.
+
+2003-03-13 Thursday 08:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.19): Dependencies fixed.
+
+2003-03-12 Wednesday 19:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.116): Another attempt at specifying the
+	  space-dimensions remapping operator.
+
+2003-03-12 Wednesday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected3 (1.1), YAP/Makefile.am (1.18),
+	  YAP/yap_pl_check.pl (1.1): A first attempt at integrating
+	  `pl_check.pl' into the regression testing mechanism.
+
+2003-03-12 Wednesday 19:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: user-browse.doxyconf-latex.in (1.15),
+	  user-print.doxyconf-latex.in (1.15), user.doxyconf-html.in
+	  (1.17): Hide the listing of friend compounds in the user
+	  documentation.
+
+2003-03-12 Wednesday 16:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.49): Removed the "and_minimize"
+	  from the code for the "checks" predicate.
+
+2003-03-12 Wednesday 13:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.320): Corrected a bug in
+	  Polyhedron::add_genrators() whereby a generator system was
+	  wrongly declared sorted after the inclusion of pending rows.
+
+2003-03-12 Wednesday 10:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.pl (1.32): Added missing
+	  definitions and corrected a bug.
+
+2003-03-12 Wednesday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.176), addgenerators13.cc (1.1): New test
+	  exhibiting a bug triggered by an invocation to
+	  Polyhedron::add_generators()..
+
+2003-03-12 Wednesday 08:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.48): In many cases, predicates
+	  that are intended to cause Prolog failure in certain specified
+	  situations now tested more thoroughly.  Unnecessary uses of
+	  "and_minimize" removed.  Other general improvements.
+
+2003-03-11 Tuesday 20:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.90): Mention that we
+	  support only YAP version 4.4 or later and Ciao Prolog 1.9 #44 or
+	  later.
+
+2003-03-11 Tuesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.100): Now all the
+	  *_and_minimize/2 predicates fail if the resulting polyhedron is
+	  empty.
+
+2003-03-11 Tuesday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.99): Indentation fixed.
+
+2003-03-11 Tuesday 15:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.47), ppl_prolog.icc (1.98),
+	  Ciao/ppl_ciao.pl (1.43), GNU/ppl_gprolog.pl (1.31),
+	  SICStus/ppl_sicstus_sd.cc (1.45), SWI/ppl_swiprolog.cc (1.69),
+	  XSB/ppl_xsb.H (1.19), XSB/ppl_xsb.cc (1.29), YAP/ppl_yap.cc
+	  (1.63): The "..with_tokens" predicates are now "..with_token".
+	  The predicate ppl_Polyhedron_bounded_H79_extrapolation_assign/3
+	  added to Ciao, GNU, SICStus, XSB, and Yap.
+
+2003-03-11 Tuesday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ciao_clpq.pl (1.6), ciao_clpq2.pl (1.2):
+	  Import as few predicates as possible.
+
+2003-03-11 Tuesday 13:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.42): Complete declarations
+	  for ppl_Polyhedron_H79_widening_assign_with_tokens/3.
+
+2003-03-11 Tuesday 11:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.46), Ciao/ppl_ciao.pl (1.41),
+	  GNU/ppl_gprolog.pl (1.30), SICStus/ppl_sicstus_sd.cc (1.44),
+	  SWI/ppl_swiprolog.cc (1.68), XSB/ppl_xsb.H (1.18), XSB/ppl_xsb.cc
+	  (1.28), YAP/ppl_yap.cc (1.62): Tests for new interface predicates
+	  added.
+
+2003-03-11 Tuesday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.97): Translate std::bad_alloc
+	  into a usable Prolog exception.
+
+2003-03-11 Tuesday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.96):
+	  PIFunc::max_in_codomain() fixed.
+
+2003-03-11 Tuesday 09:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.89): Descriptions of
+	  "with_token" predicates improved.
+
+2003-03-10 Monday 19:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.16), ciao_clpq.pl (1.5),
+	  ciao_clpq2.pl (1.1), ppl_ciao.cc (1.18), ppl_ciao.pl (1.40): Ciao
+	  Prolog interface fixed and now part of the regression testing
+	  mechanism.
+
+2003-03-10 Monday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.68): The Prolog interface now supports also Ciao Prolog
+	  and XSB.
+
+2003-03-10 Monday 18:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.115): First attempt at describing the
+	  operator remapping dimensions.
+
+2003-03-10 Monday 12:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.114): Changed a bit the description about
+	  widenings to better clarify what has been done and we are still
+	  doing for NNC polyhedra.
+
+2003-03-10 Monday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.72), ppl_c.h (1.78): Modified the C
+	  interface to support the widening-with-tokens technique for all
+	  widening and extrapolation operators.
+
+2003-03-10 Monday 10:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.88): Descriptions for
+	  the bounded_..._extrapolation_assign predicates corrected.
+
+2003-03-10 Monday 10:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.87): Added
+	  documentation for the with_token versions of the widening
+	  predicates and for the bounded versions of the extrapolation
+	  predicates.
+
+2003-03-10 Monday 09:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.86): Prolog interface
+	  documentation reorganised with a summary list of all predicates.
+
+2003-03-09 Sunday 22:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.95): Started factorizing the
+	  implementation of the Prolog interface using pointers to members.
+
+2003-03-09 Sunday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.94), Ciao/ppl_ciao.pl
+	  (1.39), GNU/ppl_gprolog.pl (1.29), SICStus/ppl_sicstus_sd.cc
+	  (1.43), SWI/ppl_swiprolog.cc (1.67), XSB/ppl_xsb.H (1.17),
+	  XSB/ppl_xsb.cc (1.27), YAP/ppl_yap.cc (1.61): New predicate
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3.
+
+2003-03-09 Sunday 21:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.93), Ciao/ppl_ciao.pl
+	  (1.38), GNU/ppl_gprolog.pl (1.28), SICStus/ppl_sicstus_sd.cc
+	  (1.42), SWI/ppl_swiprolog.cc (1.66), XSB/ppl_xsb.H (1.16),
+	  XSB/ppl_xsb.cc (1.26), YAP/ppl_yap.cc (1.60): New predicate
+	  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/3.
+
+2003-03-09 Sunday 21:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.71), ppl_c.h (1.77): New function
+	  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens().	Some
+	  hyperlinks added.
+
+2003-03-09 Sunday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.23): Updated.
+
+2003-03-09 Sunday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.91): Check whether the C compiler supports the
+	  `inline' keyword.
+
+2003-03-09 Sunday 19:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.40), src/Interval.defs.hh (1.13): The Interval class has
+	  been documented.
+
+2003-03-09 Sunday 19:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.199): Polyhedron::OK() only prints
+	  something if run-time assertions are enabled.
+
+2003-03-09 Sunday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.39), src/Polyhedron.types.hh (1.9): Explained PPL's I/O
+	  operators and how to deal with the IO_Operators namespace.
+
+2003-03-09 Sunday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.38): It should now be clear how to build the
+	  documentation.
+
+2003-03-09 Sunday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.90): Version number bumped.
+
+2003-03-09 Sunday 08:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/adddimensions13.cc (1.2): Comments improved.
+
+2003-03-09 Sunday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.53): Explain the necessity of the guard against
+	  auto-assignments in Matrix::operator=(const Matrix&).
+
+2003-03-08 Saturday 22:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (1.52): Corrected Matrix::operator= to avoid the
+	  bug shown by tests adddimensions13.
+
+2003-03-08 Saturday 22:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.175), adddimensions13.cc (1.1): Added test
+	  showing a bug in teh assignment operator of Matrix. Bug is only
+	  visible when configuring with --enable-more-assertions.
+
+2003-03-08 Saturday 22:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.113): Removed wrong capitalization.
+
+2003-03-08 Saturday 21:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.11), user.tex (1.12): Apparently, CoVer is a
+	  MURST project.
+
+2003-03-08 Saturday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.70), ppl_c.h (1.76): New functions
+	  ppl_add_LinExpression_to_LinExpression(),
+	  ppl_subtract_LinExpression_from_LinExpression() and
+	  ppl_multiply_LinExpression_by_Coefficient().
+
+2003-03-08 Saturday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.30): Variable::Compare commented.
+
+2003-03-08 Saturday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.6), TODO (1.37): CREDITS updated.
+
+2003-03-08 Saturday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/README (1.1): Explain how to get (more) PPL documentation.
+
+2003-03-08 Saturday 09:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.69), ppl_c.h (1.75): Typos fixed.
+
+2003-03-08 Saturday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: adddimensions9.cc (1.6), affineimage8.cc (1.7),
+	  affinepreimage10.cc (1.7), bounded1.cc (1.10), concatenate2.cc
+	  (1.7), disjoint1.cc (1.4), exceptions1.cc (1.33), exceptions2.cc
+	  (1.27), intersection10.cc (1.5), removedim7.cc (1.8): Typos
+	  fixed.
+
+2003-03-08 Saturday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.83), GenSys.cc (1.76), Polyhedron.cc
+	  (1.319), Polyhedron.defs.hh (1.198), Polyhedron.inlines.hh
+	  (1.66), SatRow.defs.hh (1.26), Status.cc (1.20), conversion.cc
+	  (1.45), minimize.cc (1.32), simplify.cc (1.26): Typos fixed.
+
+2003-03-07 Friday 19:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.32), exceptions2.cc (1.26),
+	  generalizedaffineimage1.cc (1.7), generalizedaffineimage10.cc
+	  (1.6), generalizedaffineimage11.cc (1.5),
+	  generalizedaffineimage12.cc (1.4), generalizedaffineimage2.cc
+	  (1.6), generalizedaffineimage3.cc (1.7),
+	  generalizedaffineimage4.cc (1.5), generalizedaffineimage5.cc
+	  (1.5), generalizedaffineimage6.cc (1.5),
+	  generalizedaffineimage7.cc (1.7), generalizedaffineimage8.cc
+	  (1.5), generalizedaffineimage9.cc (1.5): Reflect the changes to
+	  the enumerate Relation_Symbol.
+
+2003-03-07 Friday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.68), ppl_c.h (1.74): New functions
+	  ppl_LinExpression_coefficient() and
+	  ppl_LinExpression_inhomogeneous_term().
+
+2003-03-07 Friday 17:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.73): Reorganized the C interface
+	  documentation using Doxygen member grouping and trying to use
+	  brief comments when possible.
+
+2003-03-07 Friday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.61): Old stuff removed.
+
+2003-03-07 Friday 15:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.67), doc/definitions.dox (1.112), doc/ppl.sty (1.11),
+	  interfaces/C/ppl_c.cc (1.67), interfaces/C/ppl_c.h (1.72),
+	  interfaces/Prolog/Prolog_interface.dox (1.85),
+	  interfaces/Prolog/ppl_prolog.icc (1.92), src/Constraint.defs.hh
+	  (1.82), src/LinExpression.defs.hh (1.58), src/Polyhedron.cc
+	  (1.318), src/Polyhedron.defs.hh (1.197), src/globals.hh (1.32):
+	  We now speak of "relation symbols", not of "relation operators"
+	  or "relational operators".
+
+2003-03-07 Friday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.111),
+	  interfaces/Prolog/Prolog_interface.dox (1.84): The discussion
+	  about eager methods moved from the prolog interface to the
+	  introduction (just before the bibliography).
+
+2003-03-07 Friday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.66), TODO (1.36), interfaces/C/ppl_c.cc (1.66),
+	  interfaces/C/ppl_c.h (1.71),
+	  interfaces/Prolog/Prolog_interface.dox (1.83),
+	  interfaces/Prolog/pl_check.pl (1.45),
+	  interfaces/Prolog/ppl_prolog.icc (1.91),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.37),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.27),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.41),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.65),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.15),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.25),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.59), src/Determinate.defs.hh
+	  (1.28), src/Determinate.inlines.hh (1.26), src/Polyhedron.defs.hh
+	  (1.196), src/Polyhedron.inlines.hh (1.65), src/PowerSet.defs.hh
+	  (1.28), src/PowerSet.inlines.hh (1.32), tests/Makefile.am
+	  (1.174), tests/renamedim1.cc (1.1), tests/shuffledim1.cc (1.11):
+	  We rename dimensions, we do not shuffle them.
+
+2003-03-07 Friday 11:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.110), devref-browse.doxyconf-latex.in
+	  (1.26), devref-print.doxyconf-latex.in (1.26),
+	  devref.doxyconf-html.in (1.27), user-browse.doxyconf-latex.in
+	  (1.14), user-print.doxyconf-latex.in (1.14),
+	  user.doxyconf-html.in (1.16): Updated Doxygen configuration files
+	  to version 1.3-rc3-20030223.	Small typo fixed in
+	  definitions.dox.
+
+2003-03-07 Friday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.90): Predicate
+	  ppl_Polyhedron_shuffle_dimensions/2 now fails when given a
+	  non-injective function.
+
+2003-03-07 Friday 09:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: CbecomesNNC1.cc (1.4), NNCinclusion1.cc (1.6),
+	  NNCminimize1.cc (1.9), NNCminimize2.cc (1.9), NNCminimize3.cc
+	  (1.9), NNCminimize4.cc (1.11), NNCminimize5.cc (1.8),
+	  NNCminimize6.cc (1.10), addconstraint1.cc (1.4),
+	  addconstraint2.cc (1.3), addconstraint3.cc (1.3),
+	  addconstraints1.cc (1.10), addconstraints10.cc (1.9),
+	  addconstraints11.cc (1.10), addconstraints12.cc (1.3),
+	  addconstraints13.cc (1.5), addconstraints2.cc (1.18),
+	  addconstraints3.cc (1.8), addconstraints4.cc (1.10),
+	  addconstraints5.cc (1.11), addconstraints6.cc (1.12),
+	  addconstraints7.cc (1.11), addconstraints8.cc (1.11),
+	  addconstraints9.cc (1.12), adddimensions1.cc (1.13),
+	  adddimensions10.cc (1.6), adddimensions11.cc (1.4),
+	  adddimensions12.cc (1.3), adddimensions2.cc (1.9),
+	  adddimensions3.cc (1.11), adddimensions4.cc (1.9),
+	  adddimensions5.cc (1.7), adddimensions6.cc (1.7),
+	  adddimensions7.cc (1.7), adddimensions8.cc (1.5),
+	  adddimensions9.cc (1.5), addgenerator1.cc (1.4), addgenerator2.cc
+	  (1.4), addgenerator3.cc (1.3), addgenerator4.cc (1.4),
+	  addgenerators1.cc (1.11), addgenerators10.cc (1.3),
+	  addgenerators11.cc (1.5), addgenerators12.cc (1.5),
+	  addgenerators2.cc (1.11), addgenerators3.cc (1.11),
+	  addgenerators4.cc (1.11), addgenerators5.cc (1.11),
+	  addgenerators6.cc (1.11), addgenerators7.cc (1.8),
+	  addgenerators8.cc (1.6), addgenerators9.cc (1.5), affineimage1.cc
+	  (1.11), affineimage2.cc (1.10), affineimage3.cc (1.3),
+	  affineimage4.cc (1.3), affineimage5.cc (1.4), affineimage6.cc
+	  (1.3), affineimage7.cc (1.3), affineimage8.cc (1.6),
+	  affinepreimage1.cc (1.10), affinepreimage10.cc (1.6),
+	  affinepreimage2.cc (1.10), affinepreimage3.cc (1.10),
+	  affinepreimage4.cc (1.11), affinepreimage5.cc (1.3),
+	  affinepreimage6.cc (1.4), affinepreimage7.cc (1.3),
+	  affinepreimage8.cc (1.3), affinepreimage9.cc (1.4),
+	  affinetrans.cc (1.13), append1.cc (1.21), append2.cc (1.21),
+	  ascii_dump_load1.cc (1.12), ascii_dump_load2.cc (1.10),
+	  ascii_dump_load3.cc (1.13), ascii_dump_load4.cc (1.13),
+	  ascii_dump_load5.cc (1.9), ascii_dump_load6.cc (1.6),
+	  ascii_dump_load7.cc (1.6), bhrz03widening1.cc (1.3),
+	  bhrz03widening10.cc (1.3), bhrz03widening11.cc (1.3),
+	  bhrz03widening12.cc (1.3), bhrz03widening13.cc (1.3),
+	  bhrz03widening14.cc (1.3), bhrz03widening15.cc (1.5),
+	  bhrz03widening16.cc (1.3), bhrz03widening17.cc (1.3),
+	  bhrz03widening18.cc (1.3), bhrz03widening19.cc (1.3),
+	  bhrz03widening2.cc (1.5), bhrz03widening3.cc (1.5),
+	  bhrz03widening4.cc (1.3), bhrz03widening5.cc (1.3),
+	  bhrz03widening6.cc (1.4), bhrz03widening7.cc (1.4),
+	  bhrz03widening8.cc (1.3), bhrz03widening9.cc (1.5), bounded1.cc
+	  (1.9), boundingbox1.cc (1.32), boundingbox2.cc (1.17),
+	  boundingbox3.cc (1.8), boundingbox4.cc (1.5), bounds1.cc (1.5),
+	  bounds2.cc (1.5), concatenate1.cc (1.7), concatenate2.cc (1.6),
+	  concatenate3.cc (1.6), concatenate4.cc (1.5), concatenate5.cc
+	  (1.3), concatenate6.cc (1.5), constraints1.cc (1.5),
+	  constraints2.cc (1.5), constraints3.cc (1.5), constraints4.cc
+	  (1.5), contains1.cc (1.3), disjoint1.cc (1.3), disjoint2.cc
+	  (1.5), disjoint3.cc (1.4), ehandlers.hh (1.7), empty1.cc (1.12),
+	  exceptions1.cc (1.31), exceptions2.cc (1.25),
+	  generalizedaffineimage1.cc (1.6), generalizedaffineimage10.cc
+	  (1.5), generalizedaffineimage11.cc (1.4),
+	  generalizedaffineimage12.cc (1.3), generalizedaffineimage2.cc
+	  (1.5), generalizedaffineimage3.cc (1.6),
+	  generalizedaffineimage4.cc (1.4), generalizedaffineimage5.cc
+	  (1.4), generalizedaffineimage6.cc (1.4),
+	  generalizedaffineimage7.cc (1.6), generalizedaffineimage8.cc
+	  (1.4), generalizedaffineimage9.cc (1.4), generators1.cc (1.12),
+	  generators2.cc (1.8), generators3.cc (1.4), generators4.cc (1.4),
+	  generators5.cc (1.4), generators6.cc (1.5), h79widening1.cc
+	  (1.5), h79widening2.cc (1.6), h79widening3.cc (1.6),
+	  h79widening4.cc (1.3), h79widening5.cc (1.4), inclusion1.cc
+	  (1.6), inclusion2.cc (1.3), intersection1.cc (1.5),
+	  intersection10.cc (1.4), intersection11.cc (1.5),
+	  intersection2.cc (1.8), intersection3.cc (1.6), intersection4.cc
+	  (1.6), intersection5.cc (1.6), intersection6.cc (1.6),
+	  intersection7.cc (1.5), intersection8.cc (1.4), intersection9.cc
+	  (1.4), limitedbhrz03extrapolation1.cc (1.2),
+	  limitedh79extrapolation1.cc (1.2), limitedh79extrapolation2.cc
+	  (1.2), limitedh79extrapolation3.cc (1.2),
+	  limitedh79extrapolation4.cc (1.2), linearpartition1.cc (1.9),
+	  linearpartition2.cc (1.9), linearpartition3.cc (1.9),
+	  linexpression1.cc (1.3), mc91.cc (1.11), memory1.cc (1.19),
+	  minconstraints1.cc (1.4), minconstraints2.cc (1.4),
+	  minconstraints3.cc (1.3), minconstraints4.cc (1.7),
+	  mingenerators1.cc (1.4), mingenerators2.cc (1.3),
+	  mingenerators3.cc (1.3), onepoint.cc (1.9), operator1.cc (1.4),
+	  permute.cc (1.28), polydifference1.cc (1.6), polydifference2.cc
+	  (1.8), polydifference3.cc (1.3), polydifference4.cc (1.4),
+	  polydifference5.cc (1.5), polydifference6.cc (1.5),
+	  polydifference7.cc (1.4), polyhull1.cc (1.6), polyhull10.cc
+	  (1.3), polyhull2.cc (1.6), polyhull3.cc (1.6), polyhull4.cc
+	  (1.5), polyhull5.cc (1.4), polyhull6.cc (1.4), polyhull7.cc
+	  (1.3), polyhull8.cc (1.4), polyhull9.cc (1.5), randphull1.cc
+	  (1.8), randphull2.cc (1.5), relations1.cc (1.9), relations10.cc
+	  (1.5), relations11.cc (1.5), relations12.cc (1.4), relations13.cc
+	  (1.4), relations14.cc (1.4), relations15.cc (1.4), relations16.cc
+	  (1.4), relations17.cc (1.6), relations18.cc (1.4), relations19.cc
+	  (1.5), relations2.cc (1.10), relations3.cc (1.10), relations4.cc
+	  (1.10), relations5.cc (1.10), relations6.cc (1.9), relations7.cc
+	  (1.9), relations8.cc (1.9), relations9.cc (1.11), removedim1.cc
+	  (1.10), removedim2.cc (1.14), removedim3.cc (1.10), removedim4.cc
+	  (1.11), removedim5.cc (1.9), removedim6.cc (1.12), removedim7.cc
+	  (1.7), removedim8.cc (1.5), removedim9.cc (1.4), shuffledim1.cc
+	  (1.10), smm1.cc (1.13), timeelapse1.cc (1.7), timeelapse2.cc
+	  (1.7), timeelapse3.cc (1.7), timeelapse4.cc (1.7), timeelapse5.cc
+	  (1.7), timeelapse6.cc (1.3), timeelapse7.cc (1.3), timeelapse8.cc
+	  (1.4), topclosed1.cc (1.4), topclosed2.cc (1.3), topclosed3.cc
+	  (1.5), topclosure1.cc (1.6), topclosure2.cc (1.3), topclosure3.cc
+	  (1.3), topclosure4.cc (1.5), universe1.cc (1.8), universe2.cc
+	  (1.9), universe3.cc (1.9), universe4.cc (1.9), universe5.cc
+	  (1.10), universe6.cc (1.7), watchdog1.cc (1.17), writeconsys1.cc
+	  (1.6), writegensys1.cc (1.7), writegensys2.cc (1.7),
+	  writegensys3.cc (1.6), writepolyhedron1.cc (1.6),
+	  writepolyhedron2.cc (1.7), writepolyhedron3.cc (1.6),
+	  writerelation1.cc (1.6), writevariable1.cc (1.6): Treatment of
+	  exceptions harmonized.  Some stylistic improvements.
+
+2003-03-07 Friday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.82), pl_check.pl
+	  (1.44): Added documentation and tests for the new Prolog
+	  interface predicates ppl_Polyhedron_generalized_affine_image/5
+	  and ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+
+2003-03-06 Thursday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.20), permute.cc (1.27), shuffledim1.cc
+	  (1.9): Return 1 on failure.
+
+2003-03-06 Thursday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.70): Avoid using `//' comments, since
+	  they are not in C89.	Let the multiple inclusion guard be
+	  external to everything.
+
+2003-03-06 Thursday 21:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.89), Ciao/ppl_ciao.pl
+	  (1.36), GNU/ppl_gprolog.pl (1.26), SICStus/ppl_sicstus_sd.cc
+	  (1.40), SWI/ppl_swiprolog.cc (1.64), XSB/ppl_xsb.H (1.14),
+	  XSB/ppl_xsb.cc (1.24), YAP/ppl_yap.cc (1.58): New predicates
+	  ppl_Polyhedron_generalized_affine_image/5 and
+	  ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+
+2003-03-06 Thursday 15:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/version.hh.in (1.4): Specify that the beta number is zero for
+	  official releases and nonzero for development snapshots.
+
+2003-03-06 Thursday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.81): Improved
+	  discussion about *_and_minimize predicates.
+
+2003-03-06 Thursday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/version.hh.in (1.3): Small correction of module heading.
+
+2003-03-06 Thursday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.109), doc/fdl.dox (1.3), doc/gpl.dox
+	  (1.4), interfaces/C/ppl_c.h (1.69),
+	  interfaces/Prolog/Prolog_interface.dox (1.80): Let the licence
+	  pages and the documentation of foreign language interfaces be
+	  grouped into ``modules'', so as to avoid spreading information in
+	  too many places of the user manual. We no longer have a ``PPL
+	  pages'' index.
+
+2003-03-06 Thursday 09:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.43): Updated the predicate
+	  testing the PPL watchdog predicates to use ppl_Polyhedron_swap/2.
+
+2003-03-06 Thursday 09:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.79), pl_check.pl
+	  (1.42): Added the ppl_Polyhedron_time_elapse_assign/2 to the
+	  Prolog documentation and to the tests in pl_check.pl.
+
+2003-03-05 Wednesday 23:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/version.hh.in (1.2): Library defines with version info put
+	  inside a \defgroup block to have them appear in the user
+	  documentation.
+
+2003-03-05 Wednesday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.19), append2.cc (1.20), concatenate1.cc
+	  (1.6), permute.cc (1.26): Do not use the obsolete
+	  operator>>(const Constraint&, unsigned int).
+
+2003-03-05 Wednesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.88), Ciao/ppl_ciao.pl
+	  (1.35), GNU/ppl_gprolog.pl (1.25), SICStus/ppl_sicstus_sd.cc
+	  (1.39), SWI/ppl_swiprolog.cc (1.63), XSB/ppl_xsb.H (1.13),
+	  XSB/ppl_xsb.cc (1.23), YAP/ppl_yap.cc (1.57): New predicate
+	  ppl_Polyhedron_time_elapse_assign/2.
+
+2003-03-05 Wednesday 17:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.64), tests/shuffledim1.cc (1.8):
+	  Corrected implementation of shuffle_dimensions() and the known
+	  result in the last test of shuffledim1.
+
+2003-03-05 Wednesday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.317): Avoid useless abbreviations.
+
+2003-03-05 Wednesday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.41): Call to polydiff_assign_min
+	  removed from check_all.
+
+2003-03-05 Wednesday 15:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.78), pl_check.pl
+	  (1.40): Added ppl_Polyhedron_swap/2.	Shuffle_Map syntax added
+	  and ppl_Polyhedron_shuffle_dimensions/2 documentation header
+	  added.
+
+2003-03-05 Wednesday 14:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.65), interfaces/C/ppl_c.cc (1.65), interfaces/C/ppl_c.h
+	  (1.68), interfaces/Prolog/Prolog_interface.dox (1.77),
+	  interfaces/Prolog/pl_check.pl (1.39),
+	  interfaces/Prolog/ppl_prolog.icc (1.87),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.34),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.24),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.38),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.62),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.12),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.22),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.56), src/Polyhedron.cc
+	  (1.316), src/Polyhedron.defs.hh (1.195), tests/polydifference6.cc
+	  (1.4): The method
+	  Polyhedron::poly_difference_assign_and_minimize(const
+	  Polyhedron&) has been removed.
+
+2003-03-05 Wednesday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.86), Ciao/ppl_ciao.pl
+	  (1.33), GNU/ppl_gprolog.pl (1.23), SICStus/ppl_sicstus_sd.cc
+	  (1.37), SWI/ppl_swiprolog.cc (1.61), XSB/ppl_xsb.H (1.11),
+	  XSB/ppl_xsb.cc (1.21), YAP/ppl_yap.cc (1.55): New predicate
+	  ppl_Polyhedron_swap/2.
+
+2003-03-05 Wednesday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.315), Polyhedron.defs.hh (1.194): The
+	  (dis-)equality boolean functions operator== and operator!= on
+	  objects of the class Polyhedron no longer require topological-
+	  and dimension-consistency. Inconsistent objects are not
+	  equivalent.
+
+2003-03-05 Wednesday 14:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.64), configure.ac (1.89), src/Makefile.am (1.60),
+	  src/version.cc (1.1), src/version.hh.in (1.1): New macros
+	  PPL_VERSION_MAJOR, PPL_VERSION_MINOR, PPL_VERSION_REVISION, and
+	  PPL_VERSION_BETA allow the client application to adapt to
+	  different versions of the library.
+
+	  New function const char* version() returns a character string
+	  containing the PPL version.
+
+	  New function const char* banner() returns a character string
+	  containing information about the PPL version, the licensing, the
+	  lack of any warranty whatsoever, the C++ compiler used to build
+	  the library, where to report bugs and where to look for further
+	  information.
+
+2003-03-05 Wednesday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.63): News item concerning the new
+	  Polyhedron::generalized_affine_image() operators revised.
+
+2003-03-05 Wednesday 10:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/shuffledim1.cc (1.7): Added a test showing a bug in
+	  Polyhedron::shuffle_dimensions().
+
+2003-03-05 Wednesday 10:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.62): Improved the synthetic description of methods
+	  generalized_affine_image().
+
+2003-03-04 Tuesday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.88): Require GMP version 4.1.2 or following.
+
+2003-03-04 Tuesday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.61): The C and Prolog interfaces have been extended so as
+	  to make more of the library's functionality available to Prolog
+	  and C users.
+
+2003-03-04 Tuesday 18:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.67): Comments fixed.
+
+2003-03-04 Tuesday 18:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.64), ppl_c.h (1.66): New functions
+	  ppl_ConSys_clear() and ppl_GenSys_clear().
+
+2003-03-04 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.85): Predicate
+	  ppl_Polyhedron_shuffle_dimensions(Ph, PFun) now fails if the
+	  domain of PFun is not contained in the space dimension of Ph.
+
+2003-03-04 Tuesday 17:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.60): Added the new Polyhedron::generalized_affine_image()
+	  method.
+
+2003-03-04 Tuesday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.59), src/Constraint.cc (1.37), src/Constraint.defs.hh
+	  (1.81): The operator Constraint operator>>(const Constraint&,
+	  dimension_type) has been removed.
+
+2003-03-04 Tuesday 15:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.108), src/Polyhedron.defs.hh (1.193):
+	  Reordered the sections in the final part of definitions.dox;
+	  added a section on extrapolation operators, describing the
+	  limited and bounded extrapolation operators.	Corrected
+	  capitalization of a doxygen reference.
+
+2003-03-04 Tuesday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.63), ppl_c.h (1.65): New functions
+	  ppl_Polyhedron_generalized_affine_image() and
+	  ppl_Polyhedron_generalized_affine_image_lhs_rhs().
+
+2003-03-04 Tuesday 08:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.38): Bug corrected.
+
+2003-03-04 Tuesday 08:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.37): Improved tests for widenig
+	  operators.  Added tests for ...shuffle_dimensions.
+
+2003-03-04 Tuesday 06:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.17): We require GMP at least 4.1.2.
+
+2003-03-03 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.64): For some reason, GMP up to and
+	  including version 4.1.2 requires <stdio.h> to be included before
+	  <gmp.h>.
+
+2003-03-03 Monday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.62), ppl_c.h (1.63): The `var'
+	  argument of ppl_Constraint_coefficient() and
+	  ppl_Generator_coefficient() is of type ppl_dimension_type.
+
+2003-03-03 Monday 21:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.62): FIXME added.
+
+2003-03-03 Monday 21:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.61): Do not worry about versions of GMP
+	  prior to 4.1.2 since they are not supported anyway.
+
+2003-03-03 Monday 21:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.61), ppl_c.h (1.60): New function
+	  ppl_Polyhedron_time_elapse_assign().
+
+2003-03-03 Monday 21:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.60), ppl_c.h (1.59): Added
+	  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign() and
+	  ppl_Polyhedron_bounded_H79_extrapolation_assign().  Comments of
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign() and
+	  ppl_Polyhedron_limited_H79_extrapolation_assign() fixed.
+
+2003-03-03 Monday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* depcomp (1.4), install-sh (1.4), Watchdog/depcomp (1.2),
+	  Watchdog/install-sh (1.2): Updated.
+
+2003-03-03 Monday 21:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.87), Watchdog/configure.ac (1.16): Require
+	  Autoconf 2.57 or following and Automake 1.7.3 or following.
+
+2003-03-03 Monday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.27), PowerSet.inlines.hh (1.31): The
+	  method PowerSet<CS>::limited_H79_extrapolation_assign() takes a
+	  constant constraint system.
+
+2003-03-03 Monday 19:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.59), ppl_c.h (1.58):
+	  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign() and
+	  ppl_Polyhedron_limited_H79_extrapolation_assign() take a constant
+	  constraint system.
+
+2003-03-03 Monday 18:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.12), Watchdog/COPYING (1.2), Watchdog/ChangeLog
+	  (1.3), Watchdog/INSTALL (1.2), Watchdog/NEWS (1.2),
+	  Watchdog/config.guess (1.2), Watchdog/config.sub (1.2),
+	  Watchdog/ltmain.sh (1.2): Updated.
+
+2003-03-03 Monday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.7): Update version info.
+
+2003-03-03 Monday 18:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.13), src/Makefile.am (1.59): AGE must
+	  be reset to 0 since we removed some interfaces.
+
+2003-03-03 Monday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.30), exceptions2.cc (1.24): Refer the
+	  new extrapolation operators.
+
+2003-03-03 Monday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.58), interfaces/C/ppl_c.cc (1.58), interfaces/C/ppl_c.h
+	  (1.57), interfaces/Prolog/Prolog_interface.dox (1.76),
+	  interfaces/Prolog/pl_check.pl (1.36),
+	  interfaces/Prolog/ppl_prolog.icc (1.84),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.32),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.22),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.36),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.60),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.10),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.20),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.54), src/Determinate.defs.hh
+	  (1.27), src/Determinate.inlines.hh (1.25), src/Polyhedron.cc
+	  (1.314), src/Polyhedron.defs.hh (1.192), src/PowerSet.defs.hh
+	  (1.26), src/PowerSet.inlines.hh (1.30), src/algorithms.hh (1.14),
+	  tests/Makefile.am (1.173), tests/limitedbhrz03extrapolation1.cc
+	  (1.1), tests/limitedbhrz03widening1.cc (1.5),
+	  tests/limitedh79extrapolation1.cc (1.1),
+	  tests/limitedh79extrapolation2.cc (1.1),
+	  tests/limitedh79extrapolation3.cc (1.1),
+	  tests/limitedh79extrapolation4.cc (1.1),
+	  tests/limitedh79widening1.cc (1.6), tests/limitedh79widening2.cc
+	  (1.7), tests/limitedh79widening3.cc (1.4),
+	  tests/limitedh79widening4.cc (1.4): From now on, the name
+	  `widening' is reserved for operators that come with a convergence
+	  guarantee (i.e., with the ability of turning infinite chains to
+	  finite ones).  Upper bound operators without such a guarantee
+	  contain the word `extrapolation' in their name.
+
+2003-03-03 Monday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.57): Confine implementation classes into
+	  anonymous namespaces.
+
+2003-03-03 Monday 16:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.57): News item for Polyhedron::shrink_bounding_box()
+	  completed.
+
+2003-03-03 Monday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.56): News item concerning
+	  Polyhedron::shuffle_dimensions() completed.
+
+2003-03-03 Monday 16:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.56), ppl_c.h (1.56): New function int
+	  ppl_Polyhedron_shuffle_dimensions().
+
+2003-03-03 Monday 15:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.191): Another reorganization for better
+	  documentation.
+
+2003-03-03 Monday 14:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.190): Let all the methods
+	  <method>_and_minimize be declared after the corresponding methods
+	  <method>, so that a less disordered documentation is produced.
+
+2003-03-03 Monday 12:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.313), Polyhedron.defs.hh (1.189): Now the
+	  constraint system parameter of methods bounded_*_widening_assign
+	  and limited_*_widening_assign is a const parameter.
+
+2003-03-03 Monday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.55), ppl_c.h (1.55): New function int
+	  ppl_not_a_dimension(ppl_dimension_type*).
+
+2003-03-03 Monday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.83), Ciao/ppl_ciao.pl
+	  (1.31), GNU/ppl_gprolog.pl (1.21), SICStus/ppl_sicstus_sd.cc
+	  (1.35), SWI/ppl_swiprolog.cc (1.59), XSB/ppl_xsb.H (1.9),
+	  XSB/ppl_xsb.cc (1.19), YAP/ppl_yap.cc (1.53): New predicate
+	  ppl_Polyhedron_shuffle_dimensions/2.
+
+2003-03-03 Monday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.55), src/globals.hh (1.31): New function dimension_type
+	  not_a_dimension(): returns a value that does not designate a
+	  valid dimension.
+
+2003-03-03 Monday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.35): We must explain to the users of CVS versions how to
+	  build the documentation.
+
+2003-03-02 Sunday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.34): Make sure all the functionalities are available in
+	  all interfaces.
+
+2003-03-02 Sunday 20:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.33), src/Polyhedron.defs.hh (1.188),
+	  src/Polyhedron.inlines.hh (1.63): Documentation of
+	  Polyhedron::shuffle_dimensions() improved.
+
+2003-03-02 Sunday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.32): More things that should not be forgotten.
+
+2003-03-02 Sunday 19:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.54): News items added, others improved, reorganized.
+
+2003-03-02 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.11): Updated.
+
+2003-03-01 Saturday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.312): Full stop added.
+
+2003-03-01 Saturday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sicstus_cfli.ic (1.5): Include
+	  assert.h.
+
+2003-03-01 Saturday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.34): Includes
+	  reordered.
+
+2003-03-01 Saturday 07:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.86): Enable shared the libraries by default.
+
+2003-03-01 Saturday 07:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.17), config.sub (1.16), ltmain.sh (1.11):
+	  Updated.
+
+2003-02-24 Monday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.25),
+	  doc/devref-print.doxyconf-latex.in (1.25),
+	  doc/devref.doxyconf-html.in (1.26), src/Init.cc (1.8),
+	  src/Makefile.am (1.58), src/Polyhedron.cc (1.311),
+	  src/Statistics.hh (1.2), src/statistics.hh (1.1): Statistics.hh
+	  improved, added to the documentation for developers, and renamed
+	  statistics.hh.
+
+2003-02-24 Monday 16:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.7), Makefile.am (1.57), Polyhedron.cc (1.310),
+	  Statistics.hh (1.1), globals.cc (1.12), globals.hh (1.30):
+	  Removed from globals.hh and globals.cc all the stuff related to
+	  statistics and placed into Statistics.hh; modified Polyhedron.cc
+	  and Init.cc accordingly.
+
+2003-02-23 Sunday 21:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bhrz03widening2.cc (1.4), limitedbhrz03widening1.cc
+	  (1.4): Restored expected result after correction on evolving
+	  points technique.
+
+2003-02-23 Sunday 20:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.309), tests/Makefile.am (1.172),
+	  tests/bhrz03widening3.cc (1.4): Improved is_BHRZ03_stabilizing to
+	  always avoid considering the low-level constraints when comparing
+	  the number of constraints. As a consequence, changed back the
+	  known result of test bhrz03widening3.
+
+2003-02-23 Sunday 16:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.31): Remember to comment uncommented classes.
+
+2003-02-23 Sunday 09:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.10), user.tex (1.11): Thank the CoVer
+	  project.
+
+2003-02-22 Saturday 22:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.44): Two FIXMEs dealt with and removed.
+
+2003-02-22 Saturday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.inlines.hh (1.37), SatRow.inlines.hh (1.24): Redundant
+	  comment removed.
+
+2003-02-22 Saturday 21:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.inlines.hh (1.36), SatRow.inlines.hh (1.23): FIXMEs
+	  related to Doxygen's bugs removed.
+
+2003-02-22 Saturday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.defs.hh (1.61): FIXME dealt with and removed.
+
+2003-02-22 Saturday 21:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.171), bhrz03widening2.cc (1.3),
+	  bhrz03widening3.cc (1.3), limitedbhrz03widening1.cc (1.3):
+	  Expected results adjusted.
+
+2003-02-22 Saturday 17:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.308): Commit to
+	  BHRZ03_EP_DELAY_INTERSECTION.
+
+2003-02-22 Saturday 09:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PowerSet.defs.hh (1.25): Fixed a parameter name mismatch in
+	  the documentation.
+
+2003-02-21 Friday 19:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.80): Doxygen documentation fix: "<" and
+	  ">" should not be escaped by "\" when occurring inside a \code
+	  ... \endcode section.
+
+2003-02-21 Friday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.107): Bibliography and bibliographic
+	  references improved.
+
+2003-02-21 Friday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/bib2html2.sed (1.3): Provide text for the \ref link commands.
+
+2003-02-21 Friday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: bib2dox (1.3), bib2html2.sed (1.2): Produce
+	  cross-references that work well with any Doxygen output.
+
+2003-02-21 Friday 16:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.106), src/Polyhedron.defs.hh (1.187): In
+	  the documentation, added explanation for the BHRZ03 widening and
+	  the widening with tokens technique.  Broken <a name=...> links
+	  replaced by \ref and \anchor.
+
+2003-02-21 Friday 11:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.10): Updated.
+
+2003-02-21 Friday 11:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.85): Version number bumped.
+
+2003-02-21 Friday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.307), Polyhedron.defs.hh (1.186): The
+	  widening-with-tokens delay technique is now also available for
+	  the standard widening as well as the ``limited'' and ``bounded''
+	  variants.
+
+2003-02-21 Friday 09:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* TODO (1.30): Items dealt with removed.
+
+2003-02-21 Friday 09:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.75), pl_check.pl
+	  (1.35): Prolog_interface.dox:   Added simple descriptions for the
+	  timeout predicates.	 Atom added to the syntax of the language
+	  specification.  pl_check.pl	Several small improvements.
+
+2003-02-21 Friday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.306), Polyhedron.defs.hh (1.185): In
+	  Polyhedron::BHRZ03_widening_assign(), pass the number of tokens
+	  as `unsigned', not `long'.
+
+2003-02-20 Thursday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.6), Polyhedron.cc (1.305), Polyhedron.defs.hh
+	  (1.184), globals.hh (1.29): The averaging_constraints technique
+	  is now called combining_constraints.	Added optional pointer
+	  argument to BHRZ03_widening_assign to implement the
+	  ``widening-with-tokens'' technique.
+
+2003-02-19 Wednesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.12): Declaration fixed.
+
+2003-02-16 Sunday 14:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.9): Updated.
+
+2003-02-16 Sunday 14:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: bhrz03widening15.cc (1.4), bhrz03widening6.cc (1.3),
+	  bhrz03widening7.cc (1.3): Expected results fixed.
+
+2003-02-11 Tuesday 11:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.304): Commit to
+	  BHRZ03_AC_CHECKS_H79_BOUNDARY=1.
+
+2003-02-11 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.303): Commit to BHRZ03_AC_IS_SUM=1.
+
+2003-02-11 Tuesday 11:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.302): Commit to BHRZ03_ER_CWQ=1.
+
+2003-02-09 Sunday 18:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.301): New candidate techniques for the
+	  implementation of BRHZ03.
+
+2003-02-07 Friday 20:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.300): Let an assertion in
+	  select_H79_constraints be satisfied.
+
+2003-02-07 Friday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.299): Unreachable statements removed.
+
+2003-02-07 Friday 17:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.62): Make sure inline functions are
+	  defined before being used.
+
+2003-02-07 Friday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.298): Added new preproc flag BHRZ03_EP_P1_P2
+	  to be experimented with.
+
+2003-02-07 Friday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.10): Throw std::runtime_error instead of
+	  calling abort().
+
+2003-02-07 Friday 10:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.inlines.hh (1.9): Throw std::invalid_argument
+	  if a Watchdog constructor is called with a non-positive number of
+	  time units.
+
+2003-02-06 Thursday 18:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.297): Added preprocessing flag
+	  BHRZ03_EP_DELAY_INTERSECTION, enabling a different implementation
+	  of the evolving points technique to be experimented with.
+
+2003-02-06 Thursday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.296): Make BHRZ03_AC_IS_SUM and
+	  BHRZ03_AC_CHECKS_H79_BOUNDARY default to 1.
+
+2003-02-05 Wednesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.295), tests/limitedh79widening2.cc (1.6):
+	  Corrected the implementation of limited_H79_widening_assign to
+	  match its specification; the same for
+	  limited_BHRZ03_widening_assign.  Corrected the known result of
+	  test limitedh79widening2, which was computed according to a
+	  flawed specification.
+
+2003-02-05 Wednesday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.294): Both BHRZ03_AC_IS_SUM and
+	  BHRZ03_AC_CHECKS_H79_BOUNDARY default to 0.
+
+2003-02-05 Wednesday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.293), Polyhedron.defs.hh (1.183): A first,
+	  totally untested implementation of
+	  Polyhedron::bounded_H79_widening_assign() and
+	  Polyhedron::bounded_BHRZ03_widening_assign().
+
+2003-02-05 Wednesday 11:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.182): Improved the Doxygen comments for
+	  the two limited widening operators.
+
+2003-02-05 Wednesday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.181): Give more guarantees to the user
+	  of Polyhedron::shrink_bounding_box().
+
+2003-02-05 Wednesday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.292): Added preprocessing flags to control
+	  whether or not, in the technique BHRZ03_averaging_constraints, we
+	  actually compute averages or just sum the constraints and whether
+	  the selected point can lie on the boundary of H79.
+
+2003-02-04 Tuesday 21:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.16), config.sub (1.15): Updated.
+
+2003-02-04 Tuesday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.291): Spurious newline removed.
+
+2003-02-04 Tuesday 19:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.290): Avoiding equality check in
+	  is_BHRZ03_stabilizing, which is called more than once, and
+	  computing it just once inside BHRZ03_widening_assign.
+
+2003-02-04 Tuesday 11:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.289): Corrected a bug in
+	  H79_widening_assign, whereby we were relying on the number of
+	  columns of a constraint system that was not up-to-date.
+
+2003-02-04 Tuesday 09:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.288), Polyhedron.inlines.hh (1.61): When
+	  declaring constraints (generators) no longer up-to-date, also
+	  clearing the pending constraints (generators) flag.  In
+	  H79_widening_assign, avoiding the creation of polyhedra having
+	  the wrong dimension.
+
+2003-02-03 Monday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.287), Polyhedron.defs.hh (1.180): The
+	  quick equivalence check is now a provate method of Polyhedron and
+	  it is called also by the inclusion test operator<=.  Improved the
+	  computation of the H79widening operator by resorting to CH78 when
+	  polyhedra x and y have the same dimension.
+
+2003-02-01 Saturday 15:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.286): Commented out conditionals removed.
+
+2003-02-01 Saturday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.51): Old garbage removed.
+
+2003-01-31 Friday 21:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.50): Fixed a very serious performance bug in
+	  Matrix::add_pending_rows() whereby adding one row to a matrix
+	  with `n' rows had complexity O(n) instead of amortized constant.
+
+2003-01-27 Monday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: expected (1.6), expected2 (1.7): Adapted
+	  to the new normal form.
+
+2003-01-27 Monday 11:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* configure.ac (1.84), interfaces/Prolog/expected (1.5),
+	  interfaces/Prolog/expected2 (1.9), src/Row.cc (1.49),
+	  src/Row.defs.hh (1.60): Modified strong normalization of rows, so
+	  that the first *homogeneous* coefficient is required to be
+	  positive.
+
+2003-01-27 Monday 10:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.285): Removed no longer used preprocessing
+	  flag.
+
+2003-01-27 Monday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.49), Matrix.defs.hh (1.42): Added private
+	  method Matrix::gram_shmidt() to orthogonalize a matrix so that
+	  its rays/points/inequalities have a unique representation.
+
+2003-01-27 Monday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: conversion.cc (1.43), minimize.cc (1.31), simplify.cc
+	  (1.25): Adjusted a few comments that became outdated after the
+	  merge with the lazy branch. Removed a couple of FIXME's.
+
+2003-01-26 Sunday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.cc (1.9): Ported to Cygwin (it only supports
+	  ITIMER_REAL).  Robustness increased.	Throw std:runtime_error
+	  exceptions instead of calling exit().
+
+2003-01-24 Friday 18:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.77), GenSys.defs.hh (1.89), Polyhedron.cc
+	  (1.284), Polyhedron.defs.hh (1.179), Polyhedron.inlines.hh
+	  (1.60): Equality test between polyhedra improved to first perform
+	  a few fast-fail checks, including a complete test for
+	  representations in normal form.
+
+2003-01-24 Friday 10:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.283), Polyhedron.defs.hh (1.178): Added
+	  private method  void select_CH78_constraints(const Polyhedron& y,
+	  ConSys& cs) const; performing a constraint selection from
+	  y.con_sys according to the definition of the widening as reported
+	  in Cousot&Halbwachs78.
+
+2003-01-24 Friday 10:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.79), GenSys.cc (1.75), GenSys.defs.hh
+	  (1.88): Added private method bool
+	  GenSys::satisfied_by_all_generators(const Constraint& c) const.
+
+2003-01-21 Tuesday 11:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.34): Test for time out
+	  predicates improved.
+
+2003-01-21 Tuesday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.82): Make sure that the
+	  timeout is reset when caught.
+
+2003-01-21 Tuesday 09:00  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.74), pl_check.pl
+	  (1.33), ppl_prolog.icc (1.81): Restored deleted text.
+
+2003-01-20 Monday 15:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/expected (1.4), interfaces/Prolog/expected2
+	  (1.8), interfaces/Prolog/XSB/expected (1.5),
+	  interfaces/Prolog/XSB/expected2 (1.6), tests/bhrz03widening15.cc
+	  (1.3), tests/bhrz03widening9.cc (1.4): Applying some semantically
+	  preserving syntactic changes to the expected results in order to
+	  match what is obtained after modification to methods
+	  Matrix::gauss() and Matrix::back_substitute().  The changes are
+	  also semantic for the known results of bhrz03widening9/15.
+
+2003-01-20 Monday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.282), Polyhedron.defs.hh (1.177):
+	  Rewritten methods related to the computation of the BHRZ03
+	  widening, which are no longer static and now take the polyhedron
+	  corresponding to the H79 widening as a parameter.
+
+2003-01-20 Monday 09:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.48), Row.cc (1.48), Row.defs.hh (1.59),
+	  minimize.cc (1.30), simplify.cc (1.24): Strong normalization of
+	  Row objects now enforce the first non-zero coefficient to be
+	  positive.  When creating a matrix having n copies of the same
+	  row, the matrix is now declared to be sorted (since sortedness by
+	  itself does not implies that it has no duplicates); this also
+	  includes the case of empty matrices.	Some improvements in
+	  methods Matrix::gauss() and Matrix::back_substitute().
+
+2003-01-18 Saturday 16:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.36), Constraint.inlines.hh (1.43),
+	  Generator.cc (1.44), Matrix.cc (1.47), Polyhedron.cc (1.281),
+	  minimize.cc (1.29), simplify.cc (1.23): Implemented changes
+	  required to make the library compile cleanly and pass `make
+	  check' when the flag EXTRA_NORMALIZATION is set to 1 (the default
+	  being still 0).
+
+2003-01-18 Saturday 12:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.170): The `libppl_tests.a' library should
+	  not be built until the `make check' command is run.
+
+2003-01-18 Saturday 11:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.280): Corrected a bug in
+	  poly_hull_assign_and_minimize().
+
+2003-01-15 Wednesday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.14), doc/devref-browse.doxyconf-latex.in (1.24),
+	  doc/devref-print.doxyconf-latex.in (1.24),
+	  doc/devref.doxyconf-html.in (1.25), src/Init.inlines.hh (1.8): No
+	  longer using file Init.inlines.hh.
+
+2003-01-15 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.279): After applying each of the techniques
+	  of the BHRZ03 widening, check whether we have obtained a
+	  polyhedron strictly smaller than that one obtainable using the
+	  H79 widening.
+
+2003-01-15 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.cc (1.5), Init.defs.hh (1.9), Makefile.am (1.56):
+	  Initialization and finalization of the library are no longer
+	  inlined.
+
+2003-01-13 Monday 23:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.278): Many improvements in the code and
+	  comments of method averaging_constraints().
+
+2003-01-12 Sunday 23:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.59): Try to avoid minimization in
+	  method check_empty().
+
+2003-01-12 Sunday 23:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.277): In add_generators_and_minimize(), an
+	  odd use of method check_empty() replaced by correct use of method
+	  minimize().
+
+2003-01-12 Sunday 23:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.defs.hh (1.41): Fixed documentation of method
+	  index_first_pending().
+
+2003-01-12 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.169), bug1.cc (1.4), bug1.dat (1.3):
+	  Obsolete bug witness removed.
+
+2003-01-12 Sunday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.168): No longer lie to automake.
+
+2003-01-12 Sunday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Watchdog.defs.hh (1.11): Spurious, illegal qualification
+	  removed.
+
+2003-01-12 Sunday 00:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.276): In check_universe(), try to avoid
+	  minimization as much as possible.
+
+2003-01-11 Saturday 22:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.275): Got rid of preprocessing flag
+	  NEW_LIMITED_GROWTH_ORDERING: now always using the new lgo in
+	  is_BHRZ03_stabilizing().  Added preprocessing flag
+	  EVOLVING_RAYS_SATURATORS for testing purposes on the evolving
+	  rays technique of BHRZ03_widening_assign().  Some improvements in
+	  the variable names and comments of the evolving rays technique.
+	  No longer testing for stabilization after applying H79 (unless
+	  assertions are turned on).
+
+2003-01-10 Friday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.15), config.sub (1.14): Updated.
+
+2003-01-10 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.80): Paranoid robustness
+	  improvements.
+
+2003-01-10 Friday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.79): Avoid leaking memory on
+	  exit and in the case of multiple calls to ppl_set_timeout/1 not
+	  intermixed to calls to ppl_reset_timeout/0.
+
+2003-01-10 Friday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.53), interfaces/Prolog/ppl_prolog.icc (1.78),
+	  interfaces/Prolog/Ciao/Makefile.am (1.15),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.30),
+	  interfaces/Prolog/GNU/Makefile.am (1.26),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.20),
+	  interfaces/Prolog/SICStus/Makefile.am (1.35),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.33),
+	  interfaces/Prolog/SWI/Makefile.am (1.27),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.58),
+	  interfaces/Prolog/XSB/Makefile.am (1.13),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.8),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.18),
+	  interfaces/Prolog/YAP/Makefile.am (1.17),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.52), src/Init.cc (1.4):
+	  Timeout computation facilities have been added to the Prolog
+	  interfaces: new predicates ppl_set_timeout_exception_atom/1,
+	  ppl_timeout_exception_atom/1, ppl_set_timeout/1,
+	  ppl_reset_timeout/0.
+
+2003-01-10 Friday 09:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.29): More urgent things to do.
+
+2003-01-10 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.16): Do not explicitly initialize the Parma
+	  Watchdog Library.
+
+2003-01-10 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.8), Watchdog.defs.hh (1.10),
+	  Watchdog.inlines.hh (1.8), Watchdog.types.hh (1.4): New "nifty
+	  counter" implementation of library's initialization and
+	  finalization.  Explicit initialization and finalization is no
+	  longer necessary nor possible.
+
+2003-01-10 Friday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: expected (1.4), expected2 (1.5): Update
+	  copyright years.
+
+2003-01-09 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.83), Watchdog/configure.ac (1.15): Building the
+	  Parma Watchdog Library is now enabled by default.
+
+2003-01-09 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.77): Added a new class
+	  `timeout_exception'.
+
+2003-01-07 Tuesday 16:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.73), pl_check.pl
+	  (1.32): A typo in the Prolog_interface,dox corrected and
+	  ppl_Polyhedron_is_disjoint_from_Polyhedron/2 documentation added.
+	  Many improvements to pl_check.pl and some bugs fixed.
+
+2003-01-07 Tuesday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.82): Bump version number.
+
+2003-01-07 Tuesday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: expected (1.3), expected2 (1.4): Update
+	  copyright years.
+
+2003-01-07 Tuesday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.52), configure.ac (1.81): We now require GMP 4.1.2 or
+	  higher.
+
+2003-01-07 Tuesday 15:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.5): Typo corrected.
+
+2003-01-07 Tuesday 15:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* CREDITS (1.4), doc/devref.tex (1.9), doc/user.tex (1.10): The
+	  MURST project COFIN01 credited.
+
+2003-01-07 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.12), Interval.inlines.hh (1.8): Old
+	  kludges removed.
+
+2003-01-07 Tuesday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/bhrz03widening9.cc (1.3): Updated the known result to match
+	  the output according to the new limited growth ordering
+	  convergence criterion.
+
+2003-01-07 Tuesday 12:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.hh (1.28): Do not output statistics by default.
+
+2003-01-01 Wednesday 02:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.21), README (1.13), configure.ac (1.80),
+	  Watchdog/Makefile.am (1.6), Watchdog/README (1.4),
+	  Watchdog/Watchdog.cc (1.7), Watchdog/Watchdog.defs.hh (1.9),
+	  Watchdog/Watchdog.inlines.hh (1.7), Watchdog/Watchdog.types.hh
+	  (1.3), Watchdog/configure.ac (1.14), Watchdog/pwl_header.top
+	  (1.3), doc/Makefile.am (1.22), doc/definitions.dox (1.105),
+	  doc/devref.tex (1.8), doc/user.tex (1.9), interfaces/Makefile.am
+	  (1.6), interfaces/C/Makefile.am (1.12), interfaces/C/ppl_c.cc
+	  (1.54), interfaces/C/ppl_c.h (1.54),
+	  interfaces/Prolog/Makefile.am (1.21),
+	  interfaces/Prolog/Prolog_interface.dox (1.72),
+	  interfaces/Prolog/clpq.pl (1.14), interfaces/Prolog/clpq2.pl
+	  (1.25), interfaces/Prolog/exceptions.hh (1.7),
+	  interfaces/Prolog/expected (1.3), interfaces/Prolog/expected2
+	  (1.7), interfaces/Prolog/pl_check.pl (1.31),
+	  interfaces/Prolog/ppl_prolog.icc (1.76),
+	  interfaces/Prolog/track_allocation.hh (1.11),
+	  interfaces/Prolog/Ciao/Makefile.am (1.14),
+	  interfaces/Prolog/Ciao/ciao_clpq.pl (1.4),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.17),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.29),
+	  interfaces/Prolog/GNU/Makefile.am (1.25),
+	  interfaces/Prolog/GNU/gp_clpq.pl (1.6),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.19),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.12),
+	  interfaces/Prolog/SICStus/Makefile.am (1.34),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.22),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.32),
+	  interfaces/Prolog/SICStus/sicstus_cfli.cc (1.2),
+	  interfaces/Prolog/SICStus/sicstus_cfli.h (1.3),
+	  interfaces/Prolog/SICStus/sicstus_cfli.ic (1.4),
+	  interfaces/Prolog/SICStus/sp_clpq.pl (1.8),
+	  interfaces/Prolog/SWI/Makefile.am (1.26),
+	  interfaces/Prolog/SWI/pl_clpq.cc (1.6),
+	  interfaces/Prolog/SWI/pl_clpq.pl (1.4),
+	  interfaces/Prolog/SWI/ppl_pl.cc (1.6),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.57),
+	  interfaces/Prolog/SWI/ppl_swiprolog.pl (1.2),
+	  interfaces/Prolog/XSB/Makefile.am (1.12),
+	  interfaces/Prolog/XSB/expected (1.2),
+	  interfaces/Prolog/XSB/expected2 (1.3),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.17),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.6),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.4),
+	  interfaces/Prolog/YAP/Makefile.am (1.16),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.51),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.6),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.6),
+	  interfaces/Prolog/YAP/yap_clpq2.pl (1.2), m4/Makefile.am (1.8),
+	  m4/ac_check_gmp.m4 (1.11), m4/ac_cxx_flexible_arrays.m4 (1.5),
+	  src/AskTell.defs.hh (1.11), src/AskTell.inlines.hh (1.11),
+	  src/AskTell.types.hh (1.4), src/BoundingBox.cc (1.5),
+	  src/BoundingBox.defs.hh (1.9), src/BoundingBox.inlines.hh (1.7),
+	  src/BoundingBox.types.hh (1.5), src/C_Polyhedron.cc (1.4),
+	  src/C_Polyhedron.defs.hh (1.19), src/C_Polyhedron.inlines.hh
+	  (1.13), src/C_Polyhedron.types.hh (1.6), src/ConSys.cc (1.57),
+	  src/ConSys.defs.hh (1.76), src/ConSys.inlines.hh (1.29),
+	  src/ConSys.types.hh (1.6), src/Constraint.cc (1.35),
+	  src/Constraint.defs.hh (1.78), src/Constraint.inlines.hh (1.42),
+	  src/Constraint.types.hh (1.6), src/Determinate.defs.hh (1.26),
+	  src/Determinate.inlines.hh (1.24), src/Determinate.types.hh
+	  (1.4), src/GenSys.cc (1.74), src/GenSys.defs.hh (1.87),
+	  src/GenSys.inlines.hh (1.30), src/GenSys.types.hh (1.6),
+	  src/Generator.cc (1.43), src/Generator.defs.hh (1.81),
+	  src/Generator.inlines.hh (1.39), src/Generator.types.hh (1.6),
+	  src/Init.cc (1.3), src/Init.defs.hh (1.8), src/Init.inlines.hh
+	  (1.7), src/Init.types.hh (1.5), src/Integer.cc (1.3),
+	  src/Integer.defs.hh (1.10), src/Integer.inlines.hh (1.9),
+	  src/Integer.types.hh (1.7), src/Interval.cc (1.6),
+	  src/Interval.defs.hh (1.11), src/Interval.inlines.hh (1.7),
+	  src/Interval.types.hh (1.5), src/LCompare.defs.hh (1.5),
+	  src/LCompare.inlines.hh (1.4), src/LCompare.types.hh (1.4),
+	  src/LinExpression.cc (1.16), src/LinExpression.defs.hh (1.57),
+	  src/LinExpression.inlines.hh (1.26), src/LinExpression.types.hh
+	  (1.6), src/Makefile.am (1.55), src/Matrix.cc (1.46),
+	  src/Matrix.defs.hh (1.40), src/Matrix.inlines.hh (1.29),
+	  src/Matrix.types.hh (1.6), src/NNC_Polyhedron.cc (1.10),
+	  src/NNC_Polyhedron.defs.hh (1.21), src/NNC_Polyhedron.inlines.hh
+	  (1.15), src/NNC_Polyhedron.types.hh (1.6),
+	  src/Poly_Con_Relation.cc (1.7), src/Poly_Con_Relation.defs.hh
+	  (1.19), src/Poly_Con_Relation.inlines.hh (1.9),
+	  src/Poly_Con_Relation.types.hh (1.5), src/Poly_Gen_Relation.cc
+	  (1.7), src/Poly_Gen_Relation.defs.hh (1.18),
+	  src/Poly_Gen_Relation.inlines.hh (1.9),
+	  src/Poly_Gen_Relation.types.hh (1.5), src/Polyhedron.cc (1.274),
+	  src/Polyhedron.defs.hh (1.176), src/Polyhedron.inlines.hh (1.58),
+	  src/Polyhedron.types.hh (1.8), src/PowerSet.defs.hh (1.24),
+	  src/PowerSet.inlines.hh (1.29), src/PowerSet.types.hh (1.4),
+	  src/Row.cc (1.47), src/Row.defs.hh (1.58), src/Row.inlines.hh
+	  (1.35), src/Row.types.hh (1.6), src/SatMatrix.cc (1.25),
+	  src/SatMatrix.defs.hh (1.29), src/SatMatrix.inlines.hh (1.18),
+	  src/SatMatrix.types.hh (1.6), src/SatRow.cc (1.17),
+	  src/SatRow.defs.hh (1.25), src/SatRow.inlines.hh (1.22),
+	  src/SatRow.types.hh (1.6), src/Status.cc (1.19),
+	  src/Status.defs.hh (1.25), src/Status.inlines.hh (1.12),
+	  src/Status.types.hh (1.6), src/Topology.hh (1.7), src/Variable.cc
+	  (1.11), src/Variable.defs.hh (1.29), src/Variable.inlines.hh
+	  (1.15), src/Variable.types.hh (1.6), src/algorithms.hh (1.13),
+	  src/conversion.cc (1.42), src/globals.cc (1.11), src/globals.hh
+	  (1.27), src/initializer.hh (1.6), src/minimize.cc (1.28),
+	  src/ppl_header.top (1.5), src/simplify.cc (1.22), tests/BBox.cc
+	  (1.3), tests/BBox.hh (1.2), tests/CbecomesNNC1.cc (1.3),
+	  tests/Makefile.am (1.167), tests/NNCinclusion1.cc (1.5),
+	  tests/NNCminimize1.cc (1.8), tests/NNCminimize2.cc (1.8),
+	  tests/NNCminimize3.cc (1.8), tests/NNCminimize4.cc (1.10),
+	  tests/NNCminimize5.cc (1.7), tests/NNCminimize6.cc (1.9),
+	  tests/PFunction.cc (1.2), tests/PFunction.hh (1.2),
+	  tests/addconstraint1.cc (1.3), tests/addconstraint2.cc (1.2),
+	  tests/addconstraint3.cc (1.2), tests/addconstraints1.cc (1.9),
+	  tests/addconstraints10.cc (1.8), tests/addconstraints11.cc (1.9),
+	  tests/addconstraints12.cc (1.2), tests/addconstraints13.cc (1.4),
+	  tests/addconstraints2.cc (1.17), tests/addconstraints3.cc (1.7),
+	  tests/addconstraints4.cc (1.9), tests/addconstraints5.cc (1.10),
+	  tests/addconstraints6.cc (1.11), tests/addconstraints7.cc (1.10),
+	  tests/addconstraints8.cc (1.10), tests/addconstraints9.cc (1.11),
+	  tests/adddimensions1.cc (1.12), tests/adddimensions10.cc (1.5),
+	  tests/adddimensions11.cc (1.3), tests/adddimensions12.cc (1.2),
+	  tests/adddimensions2.cc (1.8), tests/adddimensions3.cc (1.10),
+	  tests/adddimensions4.cc (1.8), tests/adddimensions5.cc (1.6),
+	  tests/adddimensions6.cc (1.6), tests/adddimensions7.cc (1.6),
+	  tests/adddimensions8.cc (1.4), tests/adddimensions9.cc (1.4),
+	  tests/addgenerator1.cc (1.3), tests/addgenerator2.cc (1.3),
+	  tests/addgenerator3.cc (1.2), tests/addgenerator4.cc (1.3),
+	  tests/addgenerators1.cc (1.10), tests/addgenerators10.cc (1.2),
+	  tests/addgenerators11.cc (1.4), tests/addgenerators12.cc (1.4),
+	  tests/addgenerators2.cc (1.10), tests/addgenerators3.cc (1.10),
+	  tests/addgenerators4.cc (1.10), tests/addgenerators5.cc (1.10),
+	  tests/addgenerators6.cc (1.10), tests/addgenerators7.cc (1.7),
+	  tests/addgenerators8.cc (1.5), tests/addgenerators9.cc (1.4),
+	  tests/affineimage1.cc (1.10), tests/affineimage2.cc (1.9),
+	  tests/affineimage3.cc (1.2), tests/affineimage4.cc (1.2),
+	  tests/affineimage5.cc (1.3), tests/affineimage6.cc (1.2),
+	  tests/affineimage7.cc (1.2), tests/affineimage8.cc (1.5),
+	  tests/affinepreimage1.cc (1.9), tests/affinepreimage10.cc (1.5),
+	  tests/affinepreimage2.cc (1.9), tests/affinepreimage3.cc (1.9),
+	  tests/affinepreimage4.cc (1.10), tests/affinepreimage5.cc (1.2),
+	  tests/affinepreimage6.cc (1.3), tests/affinepreimage7.cc (1.2),
+	  tests/affinepreimage8.cc (1.2), tests/affinepreimage9.cc (1.3),
+	  tests/affinetrans.cc (1.12), tests/append1.cc (1.18),
+	  tests/append2.cc (1.19), tests/ascii_dump_load1.cc (1.11),
+	  tests/ascii_dump_load2.cc (1.9), tests/ascii_dump_load3.cc
+	  (1.12), tests/ascii_dump_load4.cc (1.12),
+	  tests/ascii_dump_load5.cc (1.8), tests/ascii_dump_load6.cc (1.5),
+	  tests/ascii_dump_load7.cc (1.5), tests/bhrz03widening1.cc (1.2),
+	  tests/bhrz03widening10.cc (1.2), tests/bhrz03widening11.cc (1.2),
+	  tests/bhrz03widening12.cc (1.2), tests/bhrz03widening13.cc (1.2),
+	  tests/bhrz03widening14.cc (1.2), tests/bhrz03widening15.cc (1.2),
+	  tests/bhrz03widening16.cc (1.2), tests/bhrz03widening17.cc (1.2),
+	  tests/bhrz03widening18.cc (1.2), tests/bhrz03widening19.cc (1.2),
+	  tests/bhrz03widening2.cc (1.2), tests/bhrz03widening3.cc (1.2),
+	  tests/bhrz03widening4.cc (1.2), tests/bhrz03widening5.cc (1.2),
+	  tests/bhrz03widening6.cc (1.2), tests/bhrz03widening7.cc (1.2),
+	  tests/bhrz03widening8.cc (1.2), tests/bhrz03widening9.cc (1.2),
+	  tests/bounded1.cc (1.8), tests/boundingbox1.cc (1.31),
+	  tests/boundingbox2.cc (1.16), tests/boundingbox3.cc (1.7),
+	  tests/boundingbox4.cc (1.4), tests/bounds1.cc (1.4),
+	  tests/bounds2.cc (1.4), tests/concatenate1.cc (1.5),
+	  tests/concatenate2.cc (1.5), tests/concatenate3.cc (1.5),
+	  tests/concatenate4.cc (1.4), tests/concatenate5.cc (1.2),
+	  tests/concatenate6.cc (1.4), tests/constraints1.cc (1.4),
+	  tests/constraints2.cc (1.4), tests/constraints3.cc (1.4),
+	  tests/constraints4.cc (1.4), tests/contains1.cc (1.2),
+	  tests/disjoint1.cc (1.2), tests/disjoint2.cc (1.4),
+	  tests/disjoint3.cc (1.3), tests/ehandlers.cc (1.4),
+	  tests/ehandlers.hh (1.6), tests/empty1.cc (1.11),
+	  tests/exceptions1.cc (1.29), tests/exceptions2.cc (1.23),
+	  tests/files.cc (1.4), tests/files.hh (1.4),
+	  tests/generalizedaffineimage1.cc (1.5),
+	  tests/generalizedaffineimage10.cc (1.4),
+	  tests/generalizedaffineimage11.cc (1.3),
+	  tests/generalizedaffineimage12.cc (1.2),
+	  tests/generalizedaffineimage2.cc (1.4),
+	  tests/generalizedaffineimage3.cc (1.5),
+	  tests/generalizedaffineimage4.cc (1.3),
+	  tests/generalizedaffineimage5.cc (1.3),
+	  tests/generalizedaffineimage6.cc (1.3),
+	  tests/generalizedaffineimage7.cc (1.5),
+	  tests/generalizedaffineimage8.cc (1.3),
+	  tests/generalizedaffineimage9.cc (1.3), tests/generators1.cc
+	  (1.11), tests/generators2.cc (1.7), tests/generators3.cc (1.3),
+	  tests/generators4.cc (1.3), tests/generators5.cc (1.3),
+	  tests/generators6.cc (1.4), tests/h79widening1.cc (1.4),
+	  tests/h79widening2.cc (1.5), tests/h79widening3.cc (1.5),
+	  tests/h79widening4.cc (1.2), tests/h79widening5.cc (1.3),
+	  tests/inclusion1.cc (1.5), tests/inclusion2.cc (1.2),
+	  tests/intersection1.cc (1.4), tests/intersection10.cc (1.3),
+	  tests/intersection11.cc (1.4), tests/intersection2.cc (1.7),
+	  tests/intersection3.cc (1.5), tests/intersection4.cc (1.5),
+	  tests/intersection5.cc (1.5), tests/intersection6.cc (1.5),
+	  tests/intersection7.cc (1.4), tests/intersection8.cc (1.3),
+	  tests/intersection9.cc (1.3), tests/limitedbhrz03widening1.cc
+	  (1.2), tests/limitedh79widening1.cc (1.5),
+	  tests/limitedh79widening2.cc (1.5), tests/limitedh79widening3.cc
+	  (1.3), tests/limitedh79widening4.cc (1.3),
+	  tests/linearpartition1.cc (1.8), tests/linearpartition2.cc (1.8),
+	  tests/linearpartition3.cc (1.8), tests/linexpression1.cc (1.2),
+	  tests/mc91.cc (1.10), tests/memory1.cc (1.18),
+	  tests/minconstraints1.cc (1.3), tests/minconstraints2.cc (1.3),
+	  tests/minconstraints3.cc (1.2), tests/minconstraints4.cc (1.6),
+	  tests/mingenerators1.cc (1.3), tests/mingenerators2.cc (1.2),
+	  tests/mingenerators3.cc (1.2), tests/onepoint.cc (1.8),
+	  tests/operator1.cc (1.3), tests/permute.cc (1.25),
+	  tests/polydifference1.cc (1.5), tests/polydifference2.cc (1.7),
+	  tests/polydifference3.cc (1.2), tests/polydifference4.cc (1.3),
+	  tests/polydifference5.cc (1.4), tests/polydifference6.cc (1.3),
+	  tests/polydifference7.cc (1.3), tests/polyhull1.cc (1.5),
+	  tests/polyhull10.cc (1.2), tests/polyhull2.cc (1.5),
+	  tests/polyhull3.cc (1.5), tests/polyhull4.cc (1.4),
+	  tests/polyhull5.cc (1.3), tests/polyhull6.cc (1.3),
+	  tests/polyhull7.cc (1.2), tests/polyhull8.cc (1.3),
+	  tests/polyhull9.cc (1.4), tests/ppl_test.hh (1.3), tests/print.cc
+	  (1.9), tests/print.hh (1.13), tests/randphull1.cc (1.7),
+	  tests/randphull2.cc (1.4), tests/relations1.cc (1.8),
+	  tests/relations10.cc (1.4), tests/relations11.cc (1.4),
+	  tests/relations12.cc (1.3), tests/relations13.cc (1.3),
+	  tests/relations14.cc (1.3), tests/relations15.cc (1.3),
+	  tests/relations16.cc (1.3), tests/relations17.cc (1.5),
+	  tests/relations18.cc (1.3), tests/relations19.cc (1.4),
+	  tests/relations2.cc (1.9), tests/relations3.cc (1.9),
+	  tests/relations4.cc (1.9), tests/relations5.cc (1.9),
+	  tests/relations6.cc (1.8), tests/relations7.cc (1.8),
+	  tests/relations8.cc (1.8), tests/relations9.cc (1.10),
+	  tests/removedim1.cc (1.9), tests/removedim2.cc (1.13),
+	  tests/removedim3.cc (1.9), tests/removedim4.cc (1.10),
+	  tests/removedim5.cc (1.8), tests/removedim6.cc (1.11),
+	  tests/removedim7.cc (1.6), tests/removedim8.cc (1.4),
+	  tests/removedim9.cc (1.3), tests/shuffledim1.cc (1.6),
+	  tests/smm1.cc (1.12), tests/timeelapse1.cc (1.6),
+	  tests/timeelapse2.cc (1.6), tests/timeelapse3.cc (1.6),
+	  tests/timeelapse4.cc (1.6), tests/timeelapse5.cc (1.6),
+	  tests/timeelapse6.cc (1.2), tests/timeelapse7.cc (1.2),
+	  tests/timeelapse8.cc (1.3), tests/timings.cc (1.3),
+	  tests/timings.hh (1.3), tests/topclosed1.cc (1.3),
+	  tests/topclosed2.cc (1.2), tests/topclosed3.cc (1.4),
+	  tests/topclosure1.cc (1.5), tests/topclosure2.cc (1.2),
+	  tests/topclosure3.cc (1.2), tests/topclosure4.cc (1.4),
+	  tests/universe1.cc (1.7), tests/universe2.cc (1.8),
+	  tests/universe3.cc (1.8), tests/universe4.cc (1.8),
+	  tests/universe5.cc (1.9), tests/universe6.cc (1.6),
+	  tests/watchdog1.cc (1.15), tests/writeconsys1.cc (1.5),
+	  tests/writegensys1.cc (1.6), tests/writegensys2.cc (1.6),
+	  tests/writegensys3.cc (1.5), tests/writepolyhedron1.cc (1.5),
+	  tests/writepolyhedron2.cc (1.6), tests/writepolyhedron3.cc (1.5),
+	  tests/writerelation1.cc (1.5), tests/writevariable1.cc (1.5):
+	  Update copyright years.
+
+2002-12-31 Tuesday 17:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.273), Polyhedron.defs.hh (1.175): The
+	  three different techniques making up BHRZ03_widening_assign() are
+	  now isolated into corresponding members, to ease further
+	  experimentation.  Keeping track of the convergence reason and of
+	  the successful technique in order to later output statistics
+	  about it.
+
+2002-12-31 Tuesday 17:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Init.inlines.hh (1.6), globals.cc (1.10), globals.hh
+	  (1.26): Added a global struct to keep statistics about BHRZ03
+	  when the pre-proc flag PPL_STATISTICS is set (now set by
+	  default). Statistics are outputted during the library
+	  finalization.
+
+2002-12-30 Monday 19:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.272): In the NEW_LIMITED_GROWTH_ORDERING
+	  case of method is_BHRZ03_stabilizing(), when we have the same
+	  number of constraints for x and y, we now also check if the same
+	  number is obtained when disregarding the positivity constraint.
+
+2002-12-30 Monday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.271): Wrong reference to `abort()' corrected
+	  into a call.
+
+2002-12-30 Monday 09:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.270): Added preproc flag
+	  NEW_LIMITED_GROWTH_ORDERING to test the new convergence criterion
+	  for bhrz03. The new stabilization test now prints a '*' on
+	  std::cerr each time we miss an opportunity of applying the new
+	  widening techniques due to the new convergence criterion.
+
+2002-12-26 Thursday 14:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.75), Ciao/ppl_ciao.cc
+	  (1.16), GNU/ppl_gprolog_sd.cc (1.11), SICStus/sicstus_cfli.ic
+	  (1.3), SWI/ppl_swiprolog.cc (1.56), XSB/ppl_xsb.cc (1.16),
+	  YAP/ppl_yap.cc (1.50): Transition to C: avoid references.
+
+2002-12-26 Thursday 11:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.15),
+	  GNU/ppl_gprolog_sd.cc (1.10), SICStus/sicstus_cfli.h (1.2),
+	  SICStus/sicstus_cfli.ic (1.2), SWI/ppl_swiprolog.cc (1.55),
+	  XSB/ppl_xsb.cc (1.15), YAP/ppl_yap.cc (1.49): Transition to C:
+	  avoid `bool'.
+
+2002-12-26 Thursday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.33), ppl_sicstus_sd.cc
+	  (1.31), sicstus_cfli.cc (1.1), sicstus_cfli.h (1.1),
+	  sicstus_cfli.ic (1.1): Started carving the new Common Foreign
+	  Language Interface.
+
+2002-12-25 Wednesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.74): Spurious element removed
+	  from the `prolog_atoms' array.
+
+2002-12-22 Sunday 09:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.51): Mention the bug fixed in
+	  Polyhedron::minimized_constraints().
+
+2002-12-22 Sunday 08:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.79): Version number bumped.
+
+2002-12-21 Saturday 20:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.269), tests/topclosure1.cc (1.4): Corrected
+	  the bug pointed out by topclosure1.cc.
+
+2002-12-21 Saturday 20:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.73): In add_corresponding_points(), iteration
+	  now goes upward to insert the new points in a partially ordered
+	  sequence.
+
+2002-12-21 Saturday 19:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.8): Consistently follow "true" and "false" by a
+	  full stop.
+
+2002-12-21 Saturday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: print.cc (1.7), print.hh (1.12): Removal of easy_print()
+	  completed.
+
+2002-12-21 Saturday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.53), src/Status.cc (1.18),
+	  src/initializer.hh (1.5), tests/ehandlers.cc (1.3): Prefer
+	  anonymous namespaces to static declarations.
+
+2002-12-21 Saturday 13:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.6): The functions print_constraints() and
+	  print_generators() were ignoring the `intro' argument.
+
+2002-12-20 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/topclosure1.cc (1.3): Temporarily force NOISY to 1.
+
+2002-12-20 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.5): Avoid excess minimizations when printing
+	  constraints or generators.
+
+2002-12-20 Friday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.30): Minor adjustments to expression
+	  spacing; cutted away a few commented stmts.
+
+2002-12-20 Friday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/BBox.cc (1.2): Output functions greatly improved.
+
+2002-12-19 Thursday 07:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.78): Version number bumped.
+
+2002-12-18 Wednesday 20:10  Elisa Ricci
+
+	* src/conversion.cc (1.41): The bug witnessed by the `polyhull10'
+	  test program has been fixed: under some circumstances we were not
+	  indicating that the matrix no longer had pending rows.
+
+2002-12-17 Tuesday 19:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.166), polyhull10.cc (1.1): New test
+	  showing a bug in the current version of the library.
+
+2002-12-16 Monday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.21): Production of the documentation depends
+	  also on ppl.sty.
+
+2002-12-15 Sunday 20:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.165): The -lm flag for *randphull2 is in
+	  addition to the other LDFLAGS.
+
+2002-12-15 Sunday 19:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.164): The randphull2 and nnc_randphull2 test
+	  programs need to be linked against the math library.
+
+2002-12-15 Sunday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/shuffledim1.cc (1.5): Define print_function() only when
+	  noisy.
+
+2002-12-15 Sunday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/randphull2.cc (1.3): Define M_PI unless it is already
+	  defined.
+
+2002-12-14 Saturday 21:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: limitedbbrz02widening1.cc (1.4),
+	  limitedbhrz03widening1.cc (1.1): The new widening is now
+	  nicknamed BHRZ03.
+
+2002-12-14 Saturday 20:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: affineimage8.cc (1.4), affinepreimage10.cc (1.4): Use the
+	  NOISY flag to control noisiness.
+
+2002-12-14 Saturday 20:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints13.cc (1.3), addgenerators12.cc (1.3),
+	  affineimage8.cc (1.3), affinepreimage10.cc (1.3), boundingbox1.cc
+	  (1.29), concatenate6.cc (1.3), constraints4.cc (1.3),
+	  generators6.cc (1.3), intersection11.cc (1.3), polyhull9.cc
+	  (1.3), relations19.cc (1.3), shuffledim1.cc (1.4), topclosure4.cc
+	  (1.3): Use internal linkage when possible.
+
+2002-12-14 Saturday 20:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.cc (1.10): Variable::default_output_function()
+	  improved.
+
+2002-12-14 Saturday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.50), doc/definitions.dox (1.104), interfaces/C/ppl_c.cc
+	  (1.52), interfaces/C/ppl_c.h (1.53),
+	  interfaces/Prolog/Prolog_interface.dox (1.71),
+	  interfaces/Prolog/pl_check.pl (1.30),
+	  interfaces/Prolog/ppl_prolog.icc (1.73),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.28),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.30),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.54),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.7),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.14),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.48), src/Polyhedron.cc
+	  (1.268), src/Polyhedron.defs.hh (1.174), src/algorithms.hh
+	  (1.12), tests/Makefile.am (1.163), tests/bbrz02widening1.cc
+	  (1.5), tests/bbrz02widening10.cc (1.2), tests/bbrz02widening11.cc
+	  (1.2), tests/bbrz02widening12.cc (1.4), tests/bbrz02widening13.cc
+	  (1.7), tests/bbrz02widening14.cc (1.8), tests/bbrz02widening15.cc
+	  (1.7), tests/bbrz02widening16.cc (1.2), tests/bbrz02widening17.cc
+	  (1.2), tests/bbrz02widening18.cc (1.2), tests/bbrz02widening19.cc
+	  (1.2), tests/bbrz02widening2.cc (1.3), tests/bbrz02widening3.cc
+	  (1.3), tests/bbrz02widening4.cc (1.2), tests/bbrz02widening5.cc
+	  (1.2), tests/bbrz02widening6.cc (1.4), tests/bbrz02widening7.cc
+	  (1.4), tests/bbrz02widening8.cc (1.3), tests/bbrz02widening9.cc
+	  (1.7), tests/bhrz03widening1.cc (1.1), tests/bhrz03widening10.cc
+	  (1.1), tests/bhrz03widening11.cc (1.1), tests/bhrz03widening12.cc
+	  (1.1), tests/bhrz03widening13.cc (1.1), tests/bhrz03widening14.cc
+	  (1.1), tests/bhrz03widening15.cc (1.1), tests/bhrz03widening16.cc
+	  (1.1), tests/bhrz03widening17.cc (1.1), tests/bhrz03widening18.cc
+	  (1.1), tests/bhrz03widening19.cc (1.1), tests/bhrz03widening2.cc
+	  (1.1), tests/bhrz03widening3.cc (1.1), tests/bhrz03widening4.cc
+	  (1.1), tests/bhrz03widening5.cc (1.1), tests/bhrz03widening6.cc
+	  (1.1), tests/bhrz03widening7.cc (1.1), tests/bhrz03widening8.cc
+	  (1.1), tests/bhrz03widening9.cc (1.1), tests/exceptions1.cc
+	  (1.28), tests/exceptions2.cc (1.22),
+	  tests/limitedbbrz02widening1.cc (1.3): The new widening is now
+	  nicknamed BHRZ03.
+
+2002-12-06 Friday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.57): Avoid totally useless
+	  parentheses.	Make sure inline methods and functions are defined
+	  before being used.
+
+2002-12-05 Thursday 21:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.14), config.sub (1.13): Updated.
+
+2002-12-05 Thursday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.77): Bump version number.
+
+2002-12-05 Thursday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/minconstraints4.cc (1.5): Original testcase restored.
+
+2002-12-05 Thursday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.17), append2.cc (1.18), exceptions1.cc
+	  (1.27), minconstraints4.cc (1.4), permute.cc (1.24),
+	  removedim1.cc (1.8), removedim2.cc (1.12), removedim3.cc (1.8),
+	  removedim6.cc (1.10), removedim7.cc (1.5), removedim8.cc (1.3):
+	  Use PPL::Variables_Set instead of std::set<Variable>.
+
+2002-12-05 Thursday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.25), Determinate.inlines.hh (1.23),
+	  Polyhedron.cc (1.267), Polyhedron.defs.hh (1.173),
+	  PowerSet.defs.hh (1.23), PowerSet.inlines.hh (1.28),
+	  Variable.defs.hh (1.28), Variable.inlines.hh (1.14): The function
+	  bool operator<(const Variable&, const Variable&) has been
+	  substituted by bool less(const Variable&, const Variable&).  New
+	  predicate Variable::Compare useful for defining associative
+	  containers of variables.  New typedef Variables_Set standing for
+	  std::set<Variable, Variable::Compare>.  Use PPL::Variables_Set
+	  instead of std::set<Variable>.
+
+2002-12-05 Thursday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.51), Prolog/ppl_prolog.icc (1.72): Use
+	  PPL::Variables_Set instead of std::set<Variable>.
+
+2002-12-05 Thursday 12:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.28): Added an item about strong minimization.
+
+2002-12-05 Thursday 12:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.266): In
+	  Polyhedron::strongly_minimize_constraints(), corrected the bug
+	  spotted by test minconstraints4.cc.
+
+2002-12-05 Thursday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/minconstraints4.cc (1.3): Further simplified the test
+	  showing the bug.
+
+2002-12-05 Thursday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/minconstraints4.cc (1.2): Simplified the test showing the
+	  bug in the strong minimization of constraints.
+
+2002-12-05 Thursday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.162), minconstraints4.cc (1.1): New test
+	  showing a bug triggered by an invocation of
+	  Polyhedron::minimized_constraints().
+
+2002-12-03 Tuesday 20:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.56), src/ConSys.defs.hh (1.75),
+	  src/ConSys.inlines.hh (1.28), src/GenSys.cc (1.72),
+	  src/GenSys.defs.hh (1.86), src/GenSys.inlines.hh (1.29),
+	  src/Matrix.cc (1.45), src/Matrix.defs.hh (1.39),
+	  src/Matrix.inlines.hh (1.28), src/Polyhedron.cc (1.265),
+	  src/Polyhedron.defs.hh (1.172), src/Polyhedron.inlines.hh (1.56),
+	  src/Status.cc (1.17), src/Status.defs.hh (1.24),
+	  src/Status.inlines.hh (1.11), src/conversion.cc (1.40),
+	  src/minimize.cc (1.27), src/simplify.cc (1.21), tests/Makefile.am
+	  (1.161), tests/addconstraints13.cc (1.2),
+	  tests/addgenerators12.cc (1.2), tests/affineimage8.cc (1.2),
+	  tests/affinepreimage10.cc (1.2), tests/boundingbox1.cc (1.28),
+	  tests/bug1.cc (1.3), tests/bug1.dat (1.2), tests/concatenate6.cc
+	  (1.2), tests/constraints4.cc (1.2), tests/generators6.cc (1.2),
+	  tests/intersection11.cc (1.2), tests/polyhull9.cc (1.2),
+	  tests/relations19.cc (1.2), tests/timeelapse8.cc (1.2),
+	  tests/topclosure4.cc (1.2): The `lazy' branch has been merged.
+
+2002-12-03 Tuesday 11:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.264): Fixed a couple of comments.
+
+2002-12-02 Monday 18:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[12,12]): A
+	  whole pass on the code of the class, trying to use the new
+	  methods defined for the handling of pending rows; also tried to
+	  provide more uniform comments and to avoid useless reordering of
+	  rows when invoking add_and_minimize().
+
+2002-12-02 Monday 18:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (lazy.4): Modified methods
+	  add_corresponding_points() and add_corr_closure_points() to rely
+	  on the caller for the management of pending rows.
+
+2002-12-02 Monday 18:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (lazy.3): Modified method
+	  adjust_topology_and_dimensions() to rely on the caller for the
+	  management of pending rows.
+
+2002-12-02 Monday 18:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, minimize.cc (lazy.[7,4]): Provided
+	  slightly better names for methods dealing with pending rows.
+	  Modified the assertions for the two methods named
+	  add_and_minimize(...) and added new documentation.
+
+2002-12-02 Monday 18:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (lazy.8): No longer using flag
+	  KEEP_SOURCE_SORTEDNESS.
+
+2002-12-02 Monday 18:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (lazy.10): Corrected a typo in
+	  add_pending_rows(const Matrix&).  Removed an ill-placed
+	  well-formedness check.  Adjusted a few assertions.
+
+2002-12-02 Monday 09:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (lazy.[9,7,3]): Added new method unset_pending_rows() that sets
+	  the index_first_pending_row equal to the number of rows of the
+	  matrix.  Added new methods add_rows(const Matrix&) and
+	  add_pending_rows(const Matrix&) to add a set of rows with one
+	  matrix reallocation at most.	Adjusted a few comments.  Factored
+	  some common code in the sorting methods.
+
+2002-11-30 Saturday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ciao_clpq.pl (1.3): No longer use the
+	  debug package: use the debugger library instead.  Added
+	  use_module(library(prolog_sys)) in order to use statistics/0.
+
+2002-11-29 Friday 20:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.39): Committed to preserving the sortedness
+	  of `source', but changed the name of the new index, now using
+	  `source_num_redundant'.  Using a reference instead of evaluating
+	  source[k] many times.
+
+2002-11-29 Friday 11:51  Elisa Ricci
+
+	* src/: Matrix.cc, Matrix.defs.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh, Polyhedron.inlines.hh, conversion.cc,
+	  minimize.cc (lazy.[8,6,11,6,11,7,3]): Added
+	  Matrix::sort_rows(dimension_type first_row, dimension_type
+	  last_row) that sorts the the part of the matrix that is between
+	  `first_row' and `last_row'. Added also
+	  Matrix::sort_pending_and_remove_duplicates() that sorts the
+	  pending part of the matrix and remove the pending rows that are
+	  also in the upper part of the matrix.  Added
+	  Polyhedron::remove_pending_constraints_and_minimize() and
+	  Polyhedron::remove_pending_generators_and_minimize() that remove
+	  pending constraints/generators and minimize the polyhedron: now
+	  Polyhedron::remove_pending_and_minimze() only calls the two added
+	  methods.  Added also Polyhedron::add_and_minimize(bool, Matrix&,
+	  Matrix&, SatMatrix&) to obtain a polyhedron in minimal form
+	  defined by the system composed by the non-pending rows and by the
+	  pending rows of the first matrix.  This new method is called by
+	  Polyhedron::add_and_minimize(bool, Matrix&, Matrix&, SatMatrix&,
+	  const Matrix&) after We have added the row of the constant matrix
+	  to the first matrix.	Changed conversion so that when we swap the
+	  rows of source we set a flag and at the end we verify if the
+	  matrix is really sorted or not.
+
+2002-11-29 Friday 11:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.27): We should not forget to document
+	  Polyhedron::shuffle_dimensions().
+
+2002-11-29 Friday 10:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (lazy.6): The management of flag
+	  KEEP_SOURCE_SORTEDNESS reported into the branch lazy.
+
+2002-11-29 Friday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.38): Implemented a more efficient way to
+	  keep the sortedness of Matric `source', requiring max
+	  source_num_rows - 1 swaps of the rows in source.  The new code is
+	  controlled by pre-proc flag KEEP_SOURCE_SORTEDNESS, which is now
+	  set to 0 (i.e., still using old code).
+
+2002-11-28 Thursday 18:22  Elisa Ricci
+
+	* src/: SatMatrix.cc (1.24), SatMatrix.defs.hh (1.28), minimize.cc
+	  (1.26): Restored SatMatrix::transpose() and used it in
+	  add_and_minimize(), where it is possible, instead of
+	  SatMatrix::transpose_assign().  When we use add_row(), it sets
+	  correctly if the changed matrix is sorted or not: so we have not
+	  to say in add_and_minimize() that the changed matrix is not
+	  sorted.  In add_and_minimize(), after adding the new rows to the
+	  matrix `source1', we resize the saturation matrix `sat' instead
+	  of built a temporary saturation matrix.
+
+2002-11-28 Thursday 14:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.37): Added (a preprocessing controlled and
+	  now disabled) alternative code for the removal of rows in Matrix
+	  `source' that are found to be redundant.  The alternative code
+	  does keep the sortedness of `source'.
+
+2002-11-28 Thursday 14:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (lazy.5): Added (a preprocessing controlled and
+	  now disabled) alternative code for the removal of rows in Matrix
+	  source that are found to be redundant.  The alternative code does
+	  keep the sortedness of source.
+
+2002-11-27 Wednesday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.42), Poly_Con_Relation.cc (1.6),
+	  Poly_Gen_Relation.cc (1.6): Added missing \relates needed by
+	  Doxygen.
+
+2002-11-27 Wednesday 18:10  Elisa Ricci
+
+	* src/conversion.cc (lazy.4): Improve the last part of conversion:
+	  now we check if the sorted matrix `dest' is really sorted and
+	  then we update `index_first_pending' of `dest'.
+
+2002-11-27 Wednesday 16:19  Elisa Ricci
+
+	* src/conversion.cc (lazy.3): Improved the part in which we update
+	  `index_first_pending' of `dest'.
+
+2002-11-27 Wednesday 13:15  Elisa Ricci
+
+	* src/: Matrix.defs.hh, Matrix.cc, conversion.cc (lazy.[5,7,2]):
+	  Now we have Matrix::add_pending_row(Row::Type type) instead of
+	  Matrix::add_row(Row::Type type). This new method does not change
+	  `index_first_pending' and does not verify the sortedness of the
+	  matrix.  Used this new method in conversion.	At the end of
+	  conversion, we update the sortedness of `dest' and its
+	  `index_first_pending'.
+
+2002-11-27 Wednesday 11:45  Elisa Ricci
+
+	* src/minimize.cc (lazy.2): When we use add_row(), it sets
+	  correctly if the changed matrix is sorted or not: so we do not
+	  say in add_and_minimize() that then the vhanged matrix is not
+	  sorted.  In add_and_minimize(), after adding the new rows to the
+	  matrix `source1', we resize the saturation matrix `sat' instead
+	  of built a temporary saturation matrix.  In add_and_minimize(),
+	  also used SatMatrix::transpose() where it is possible instead of
+	  SatMatrix::transpose_assign().
+
+2002-11-27 Wednesday 11:21  Elisa Ricci
+
+	* tests/shuffledim1.cc (1.3): Added a test to verify
+	  Polyhedron::shuffle_dimensions() in the case that the polyhedron
+	  is zero-dimensional.
+
+2002-11-26 Tuesday 17:51  Elisa Ricci
+
+	* tests/shuffledim1.cc (1.2): Added void print_function() that is
+	  used to print a function in this test.  Added also other tests to
+	  verify Polyhedron::shuffle_dimensions().
+
+2002-11-26 Tuesday 17:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.4): Fixed a bug whereby universe polyhedra were
+	  sometimes wrongly printed.
+
+2002-11-26 Tuesday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.160), PFunction.cc (1.1), PFunction.hh
+	  (1.1), shuffledim1.cc (1.1): To test
+	  Polyhedron::shuffle_dimensions().
+
+2002-11-26 Tuesday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.263), SatRow.cc (1.16), SatRow.defs.hh
+	  (1.24), SatRow.inlines.hh (1.21), conversion.cc (1.36),
+	  simplify.cc (1.20): New functions bool subset_or_equal(const
+	  SatRow&, const SatRow&) and bool strict_subset(const SatRow&,
+	  const SatRow&) replace the misleading overloadings of the
+	  comparison operators `<', `<=', `>' and `>=' on SatRow's.
+
+2002-11-26 Tuesday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (lazy.1): From the main trunk: fixed int
+	  compare(const SatRow&, const SatRow&), bool operator<=(const
+	  SatRow&, const SatRow&), and bool operator<(const SatRow&, const
+	  SatRow&).
+
+2002-11-26 Tuesday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.cc (1.15): Fixed int compare(const SatRow& x, const
+	  SatRow& y), bool operator<=(const SatRow& x, const SatRow& y),
+	  and bool operator<(const SatRow& x, const SatRow& y): they were
+	  completely broken.
+
+2002-11-25 Monday 15:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (lazy.6): Fixed a bug in Matrix::grow() whereby,
+	  depending on the relations between the new rows' size and the old
+	  row's capacity, index_first_pending could erroneously be set to
+	  zero.
+
+2002-11-25 Monday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.32): Properly install
+	  ppl_sicstus.so.
+
+2002-11-25 Monday 09:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh, GenSys.defs.hh, Matrix.defs.hh
+	  (lazy.[3,4,4]): Added more details in the documentation for the
+	  split constructors.
+
+2002-11-25 Monday 09:25  Elisa Ricci
+
+	* src/: Matrix.cc, Polyhedron.cc (lazy.[5,10]): Corrected the bug
+	  in Matrix::ascii_load: we used "nrows" instead of "index", when
+	  we set the "index_first_pending".  In Matrix::add_row, erased in
+	  a condition of an "if" erased the check about the number of
+	  pending rows, because we use this method only when the matrix has
+	  no pending rows.  In Polyhedron::Polyhedron(Topology topol,
+	  ConSys& cs) and Polyhedron::Polyhedron(Topology topol, const
+	  ConSys& cs) erased an "if" that is repeated twice.
+
+2002-11-24 Sunday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug1.cc, bug1.dat (lazy.[4,1,1]): New test
+	  program (with input data) meant to witness the existence of a bug
+	  in Polyhedron::concatenate_assign().	Unfortunately, it shows
+	  that there are also problems in Polyhedron::ascii_dump() and/or
+	  Polyhedron::ascii_load().
+
+2002-11-24 Sunday 14:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh (lazy.[9,5]): Using the
+	  new split constructor to implement remove_pending_and_minimize().
+
+2002-11-24 Sunday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh, ConSys.inlines.hh, GenSys.defs.hh,
+	  GenSys.inlines.hh, Matrix.cc, Matrix.defs.hh
+	  (lazy.[2,1,3,1,4,3]): Added split constructors for Matrix, ConSys
+	  and GenSys.
+
+2002-11-23 Saturday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.31): Use libtool
+	  whenever possible.
+
+2002-11-23 Saturday 09:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.52): Include <stdio.h> before <gmp.h> so
+	  as to avoid warnings about the implicit declaration of all the
+	  I/O functions.
+
+2002-11-22 Friday 17:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/disjoint2.cc (1.3): Be quiet.
+
+2002-11-22 Friday 15:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.11): Practice information hiding.
+
+2002-11-22 Friday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: affinepreimage9.cc (1.2), append1.cc (1.16), append2.cc
+	  (1.17), ascii_dump_load1.cc (1.10), ascii_dump_load2.cc (1.8),
+	  ascii_dump_load3.cc (1.11), ascii_dump_load4.cc (1.11),
+	  ascii_dump_load5.cc (1.7), ascii_dump_load6.cc (1.4),
+	  ascii_dump_load7.cc (1.4), bbrz02widening1.cc (1.4),
+	  bbrz02widening12.cc (1.3), bbrz02widening13.cc (1.6),
+	  bbrz02widening14.cc (1.7), bbrz02widening15.cc (1.6),
+	  bbrz02widening9.cc (1.6), boundingbox1.cc (1.27), boundingbox2.cc
+	  (1.15), boundingbox3.cc (1.6), boundingbox4.cc (1.3),
+	  disjoint2.cc (1.2), disjoint3.cc (1.2), exceptions1.cc (1.26),
+	  exceptions2.cc (1.21), files.cc (1.3),
+	  generalizedaffineimage10.cc (1.3), generalizedaffineimage11.cc
+	  (1.2), generalizedaffineimage7.cc (1.4),
+	  generalizedaffineimage9.cc (1.2), intersection10.cc (1.2),
+	  intersection2.cc (1.6), limitedh79widening4.cc (1.2),
+	  linearpartition1.cc (1.7), linearpartition2.cc (1.7),
+	  linearpartition3.cc (1.7), memory1.cc (1.17), operator1.cc (1.2),
+	  permute.cc (1.23), polydifference7.cc (1.2), polyhull8.cc (1.2),
+	  randphull1.cc (1.6), randphull2.cc (1.2), relations17.cc (1.4),
+	  relations9.cc (1.9), smm1.cc (1.11), watchdog1.cc (1.14),
+	  writeconsys1.cc (1.4), writegensys1.cc (1.5), writegensys2.cc
+	  (1.5), writegensys3.cc (1.4), writepolyhedron1.cc (1.4),
+	  writepolyhedron2.cc (1.5), writepolyhedron3.cc (1.4),
+	  writerelation1.cc (1.4), writevariable1.cc (1.4): Consistency
+	  improvements.
+
+2002-11-22 Friday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/files.hh (1.3): Include <iostream> instead of <iosfwd>.
+
+2002-11-22 Friday 11:54  Elisa Ricci
+
+	* src/Matrix.inlines.hh (lazy.2): Added the assertion
+	  "assert(num_rows() >= first_pending_row())" in
+	  Matrix::num_pending_rows().
+
+2002-11-22 Friday 10:23  Elisa Ricci
+
+	* src/: ConSys.cc, GenSys.cc, Matrix.cc, Polyhedron.cc,
+	  Polyhedron.inlines.hh (lazy.[2,3,3,8,10]): Added some comments to
+	  explain the case in which the polyhedron has something pending.
+	  Added some assertions to verify that a method is not used in
+	  wrong cases.
+
+2002-11-22 Friday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.24): Teo declarations uncommented.
+
+2002-11-22 Friday 09:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.51): Declarations of ppl_ConSys_begin()
+	  and ppl_ConSys_end() fixed.
+
+2002-11-22 Friday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ppl_test.hh (1.2): Copyright notice added.
+
+2002-11-22 Friday 09:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ehandlers.cc (1.2): Include ehandlers.hh.
+
+2002-11-22 Friday 09:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.76): Bump version number.
+
+2002-11-21 Thursday 18:18  Elisa Ricci
+
+	* src/: ConSys.cc, ConSys.defs.hh, GenSys.cc, GenSys.defs.hh,
+	  Matrix.cc, Matrix.defs.hh, Polyhedron.cc, Polyhedron.defs.hh,
+	  Polyhedron.inlines.hh, conversion.cc, minimize.cc, simplify.cc
+	  (lazy.[1,1,2,2,2,2,7,4,9,1,1,1]): Added the methods
+	  Matrix::add_pending_row(), Matrix::insert_pending(),
+	  GenSys::insert_pending() and ConSys::insert_pending().  Erased
+	  the matrices `pending_cs' and `pending_gs' from polyhedron: now
+	  if the polyhedron has pending constraints/generators, they are in
+	  con_sys/gen_sys.  Modified the methods of Polyhedron, ConSys,
+	  GenSys and Matrix so that they always consider if the polyhedron
+	  contains something pending or if the matrix has some pending
+	  rows.
+
+2002-11-20 Wednesday 12:38  Elisa Ricci
+
+	* tests/: Makefile.am (1.159), disjoint2.cc (1.1), disjoint3.cc
+	  (1.1): Added new tests to verify are_disjoint(const Polyhedron&
+	  x, const Polyhedron& y).
+
+2002-11-15 Friday 16:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.158), intersection2.cc (1.5),
+	  randphull1.cc (1.5), randphull2.cc (1.1): New test computing
+	  random polytopes by generating points on the surface of an
+	  n-dimensional sphere.
+
+2002-11-15 Friday 12:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.29), ppl_prolog.icc (1.71):
+	  Bug in term_to_complexity_class/2 corrected (a_empty changed to
+	  a_any).  Tests for ppl_Polyhedron_get_bounding_box/3 added to
+	  pl_check.pl.
+
+2002-11-15 Friday 12:31  Elisa Ricci
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (lazy.[1,1,1]): Started to insert the pending system into the
+	  matrix.
+
+2002-11-15 Friday 09:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.70): Added
+	  documentation for the complexity classes allowed in
+	  ppl_Polyhedron_get_bounding_box/3
+
+2002-11-14 Thursday 10:30  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh (lazy.8): Erased a repeated comment.
+
+2002-11-14 Thursday 10:14  Elisa Ricci
+
+	* src/Polyhedron.cc, tests/topclosure4.cc (lazy.[6,2]): Improved
+	  Polyhedron::topological_closure_assign() in the case that the
+	  polyhedron has pending constraints.  Typo fixed in the test.
+
+2002-11-14 Thursday 09:43  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh, tests/boundingbox1.cc (lazy.[7,1]):
+	  Corrected an error in Polyhedron::shrink_bounding_box(Box& box,
+	  Complexity_Class complexity).  Added two tests to verify this
+	  method. In boundingbox1.cc, corrected also test10 that did not
+	  verify if the resulting box computed using POLYNOMIAL were equal
+	  to the "known_pbox".
+
+2002-11-13 Wednesday 18:51  Elisa Ricci
+
+	* tests/: Makefile.am, topclosure4.cc (lazy.[3,1]): Added a new
+	  test to verify Polyhedron::topological_closure_assign().
+
+2002-11-13 Wednesday 18:50  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[5,6]): Improved
+	  Polyhedron::intersection_assign(),
+	  Polyhedron::poly_hull_assign(), Polyhedron::add_generator(),
+	  Polyhedron::add_constraint(), Polyhedron::concatenate_assign(),
+	  Polyhedron::add_constraints(), Polyhedron::add_generators() and
+	  modified Polyhedron::topological_closure_assign() and
+	  Polyhedron::shrink_bounding_box(Box& box, Complexity_Class
+	  complexity) in the case in which the polyhedra can have something
+	  pending.
+
+2002-11-13 Wednesday 18:43  Elisa Ricci
+
+	* src/: GenSys.cc, GenSys.defs.hh (lazy.[1,1]): Added the method
+	  add_corresponding_points(const GenSys& gs) that add to *this the
+	  "corresponding point of the closure points of "gs" and of *this".
+
+2002-11-13 Wednesday 10:58  Elisa Ricci
+
+	* tests/: Makefile.am, addconstraints13.cc, addgenerators12.cc,
+	  affineimage8.cc, affinepreimage10.cc, relations19.cc,
+	  timeelapse8.cc (lazy.[2,2,1,1,1,1,1]): Added some other tests
+	  that verify the methods Polyhedron::add_generators(),
+	  Polyhedron::add_generators_and_minimize(),
+	  Polyhedron::affine_image(), Polyhedron::affine_preimage(),
+	  Polyhedron::relation_with() and Polyhedron::time_elapse_assign()
+	  in the case in which the polyhedra can have something pending.
+
+2002-11-13 Wednesday 10:49  Elisa Ricci
+
+	* src/Polyhedron.cc (lazy.4): Improved Polyhedron::is_bounded() and
+	  Polyhedron::bounds().  Corrected
+	  Polyhedron::is_topologically_closed().
+
+2002-11-13 Wednesday 09:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.28): pl_check.pl now avoids
+	  unifying terms with constraint and generator systems.
+
+2002-11-12 Tuesday 17:32  Elisa Ricci
+
+	* tests/: Makefile.am, addconstraints13.cc, concatenate6.cc,
+	  constraints4.cc, generators6.cc, intersection11.cc, polyhull9.cc
+	  (lazy.[1,1,1,1,1,1,1]): Added some new tests that verify the case
+	  in which the polyhedron can have something pending.
+
+2002-11-12 Tuesday 17:30  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.inlines.hh (lazy.[3,5]): Improved
+	  operator<=(x, y) and Polyhedron::concatenate_assign(y) in the
+	  case that the polyhedra have something pending.
+
+2002-11-12 Tuesday 16:21  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh (lazy.4): Considered the case of a
+	  polyhedron that has something pending in
+	  Polyhedron::shrink_bounding_box(Box& box, Complexity_Class
+	  complexity) and in Polyhedron::shuffle_dimensions(const
+	  PartialFunction& pfunc).
+
+2002-11-12 Tuesday 11:52  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (lazy.[2,3,3]): Improved the case of pending system in
+	  Polyhedron::generators() and Polyhedron::minimize() and
+	  Polyhedron::intersection_assign().  Corrected operator<= in the
+	  case that one of the two polyhedra have something pending.  Added
+	  the method Polyhedron::can_have_something_pending().	Considered
+	  the case of pending constraints or pending generators in
+	  concatenate_assign(), poly_hull_assign(),
+	  poly_hull_assign()_and_minimize, add_dimension_and_embed(),
+	  add_dimensions_and_project, remove_dimensions()
+	  remove_higher_dimensions, in all the methods that are used to add
+	  constraints and generators, in affine_image() and
+	  affine_preimage, in time_elapse_assign(), in check_universe(), in
+	  is_bounded() and bounds(), in is_topologically_closed() and in
+	  topological_closure_assign(), in Polyhedron::swap() and in
+	  Polyhedron(Topology topol, const Box& box).
+
+2002-11-12 Tuesday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.26): Revised the section on urgent things to do.
+
+2002-11-12 Tuesday 10:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.69), pl_check.pl
+	  (1.27), ppl_prolog.icc (1.70), Ciao/ppl_ciao.pl (1.27),
+	  SICStus/ppl_sicstus_sd.cc (1.29), SWI/ppl_swiprolog.cc (1.53),
+	  XSB/ppl_xsb.H (1.6), XSB/ppl_xsb.cc (1.13), YAP/ppl_yap.cc
+	  (1.47): Implemented ppl_Polyhedron_get_bounding_box/3.
+
+2002-11-10 Sunday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.16): Do not try to run the real test on
+	  Cygwin since the implementation of setrlimit() there is a dummy
+	  one.
+
+2002-11-10 Sunday 11:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.11): Allow to build in the
+	  sources' directory.
+
+2002-11-10 Sunday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/.cvsignore (1.4), tests/.cvsignore (1.7):
+	  Ignore more generated files.
+
+2002-11-09 Saturday 22:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.15): The LIMIT macro has been fixed.
+
+2002-11-08 Friday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.13), ciao_clpq.pl (1.2):
+	  Completed.
+
+2002-11-08 Friday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.cc (1.14): Fixed two critical
+	  bugs.
+
+2002-11-08 Friday 12:20  Elisa Ricci
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (lazy.[1,2,2]): Added to a polyhedron the system of pending
+	  constraints and the system of pending generators.  Added the
+	  methods that set the flags used for the pending systems and
+	  Polyhedron::remove_pending_and_minimize(),
+	  Polyhedron::remove_pending_to_obtain_constraints() and
+	  Polyhedron::remove_pending_to_obtain_generators().  Started to
+	  consider the pending systems and in particular used them
+	  operator<=(x, y), Polyhedron::intersection_assign_and_minimize(y)
+	  and Polyhedron::intersection_assign(y).
+
+2002-11-08 Friday 12:13  Elisa Ricci
+
+	* src/Status.cc (lazy.2): Modified Status::OK() so that it also
+	  verify if the polyhedron has both pending constraints and pending
+	  generators.
+
+2002-11-08 Friday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.12): Added missing patterns
+	  to MOSTLYCLEANFILES.
+
+2002-11-08 Friday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ascii_dump_load3.cc (1.10), ascii_dump_load4.cc (1.10),
+	  ascii_dump_load5.cc (1.6), ascii_dump_load6.cc (1.3): Be noisy
+	  when NOISY.
+
+2002-11-08 Friday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ascii_dump_load7.cc (1.3): Comment fixed.
+
+2002-11-08 Friday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.11): Add fake_main.pl and
+	  ciao_clpq.pl to EXTRA_DIST.
+
+2002-11-07 Thursday 18:32  Elisa Ricci
+
+	* src/: Polyhedron.defs.hh, Polyhedron.inlines.hh, Status.cc,
+	  Status.defs.hh, Status.inlines.hh (lazy.[1,1,1,1,1]): Added in
+	  the Status the flags that say if the polyhedron has something
+	  pending. Added the methods that check these flags.
+
+2002-11-07 Thursday 16:45  Elisa Ricci
+
+	* src/: SatMatrix.cc (1.23), SatMatrix.defs.hh (1.27),
+	  SatMatrix.inlines.hh (1.17): Erased SatMatrix::transpose(),
+	  operator==(const SatMatrix& x, const SatMatrix& y) and
+	  operator!=(const SatMatrix& x, const SatMatrix& y), because they
+	  were never used.
+
+2002-11-07 Thursday 16:04  Elisa Ricci
+
+	* src/Polyhedron.cc (1.262): Corrected the bug: we printed "sat_c"
+	  twice instead of "sat_c" and "sat_g".
+
+2002-11-07 Thursday 15:41  Elisa Ricci
+
+	* tests/ascii_dump_load7.cc (1.2): Simplify the test that shows the
+	  bug.
+
+2002-11-07 Thursday 15:35  Elisa Ricci
+
+	* tests/: Makefile.am (1.157), ascii_dump_load7.cc (1.1): This test
+	  shows a bug: we have a polyhedron with sat_g up-to-date but sat_g
+	  is dimensional incompatible with con_sys.
+
+2002-11-07 Thursday 15:20  Elisa Ricci
+
+	* tests/ascii_dump_load6.cc (1.2): Added two other tests to verify
+	  Status::ascii_dump() and Status::ascii_load().
+
+2002-11-06 Wednesday 19:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ascii_dump_load3.cc (1.9), ascii_dump_load4.cc (1.9):
+	  Added missing calls to seekp() where input was immediately
+	  followed by output on a stream open in read/write mode.
+
+2002-11-06 Wednesday 07:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.25): Added a few things to do rather urgently.
+
+2002-11-05 Tuesday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.13): Missing return statement added.
+
+2002-11-05 Tuesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.14): Missing return statement added.
+
+2002-11-05 Tuesday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.10): Detection of sizeof(mp_limb_t) fixed.
+
+2002-11-05 Tuesday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.13): The custom allocation functions must
+	  have C linkage.
+
+2002-11-05 Tuesday 14:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mc91.cc (1.9): Do not refer to the AskTell class.
+
+2002-11-05 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.23), PowerSet.defs.hh (1.22),
+	  PowerSet.inlines.hh (1.27): Include the required files.
+
+2002-11-05 Tuesday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.54): The AskTell constraint system class is
+	  nowhere near maturity: will not be distributed for the time
+	  being.
+
+2002-11-05 Tuesday 12:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.75): Check whether the C++ compiler supports
+	  flexible array only after having set CXXFLAGS.
+
+2002-11-05 Tuesday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/: ac_check_gmp.m4 (1.9), ac_cxx_flexible_arrays.m4 (1.4): More
+	  quoting where needed.
+
+2002-11-05 Tuesday 11:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.6), Watchdog.defs.hh (1.8): Standard
+	  conformance fixes.
+
+2002-11-05 Tuesday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.8): Updated.
+
+2002-11-05 Tuesday 10:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.13): Work around a bug in AC_CHECK_FUNCS
+	  as implemented in autoconf 2.54c and previous versions.  For more
+	  information, see
+	  http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html.
+
+2002-11-05 Tuesday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.74), Watchdog/configure.ac (1.12),
+	  m4/ac_check_gmp.m4 (1.8), m4/ac_cxx_flexible_arrays.m4 (1.3):
+	  Avoid using obsolete macros.
+
+2002-11-05 Tuesday 09:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.73), m4/ac_check_gmp.m4 (1.7),
+	  m4/ac_cxx_flexible_arrays.m4 (1.2): Avoid using obsolete macros.
+
+2002-11-05 Tuesday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.12): Warning avoided, FIXME
+	  added.
+
+2002-11-05 Tuesday 09:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/smm1.cc (1.10): Extend the Parma_Polyhedra_Library
+	  namespace with the output operators before using STL stream
+	  iterators.
+
+2002-11-05 Tuesday 00:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.55), ConSys.defs.hh (1.74), ConSys.inlines.hh
+	  (1.27), GenSys.cc (1.71), GenSys.defs.hh (1.85), Matrix.defs.hh
+	  (1.38): We were violating the C++ standard by referring to
+	  unaccessible base classes.
+
+2002-11-04 Monday 17:28  Elisa Ricci
+
+	* tests/: Makefile.am (1.156), affineimage7.cc (1.1),
+	  affinepreimage9.cc (1.1), ascii_dump_load4.cc (1.8),
+	  ascii_dump_load5.cc (1.5), ascii_dump_load6.cc (1.1): Added tests
+	  to verify ascii_dump() and ascii_load() of SatMatrix and of
+	  Status and to verify Polyhedron::affine_image() and
+	  Polyhedron::affine_preimage() with a negative denominator.
+
+2002-11-04 Monday 12:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.55): Reposition a declaration that
+	  was moved by mistake.
+
+2002-11-04 Monday 12:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: Makefile.am (1.10), ciao_clpq.pl (1.1):
+	  Little progress in the Ciao-Prolog interface.
+
+2002-11-04 Monday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.54): Improved comments for
+	  Polyhedron::shrink_bounding_box().
+
+2002-11-04 Monday 11:36  Elisa Ricci
+
+	* src/Polyhedron.inlines.hh (1.53): In
+	  Polyhedron::shrink_bounding_box() added the comment that explains
+	  why we change the sign of `n' when we built the ExtendedRational
+	  `r`.
+
+2002-11-04 Monday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.52): Avoid taking references to
+	  temporary GMP expressions.  FIXME about a missing comment added.
+
+2002-11-04 Monday 09:34  Elisa Ricci
+
+	* tests/: boundingbox3.cc (1.5), boundingbox4.cc (1.2): Modified
+	  these tests so that they also verify
+	  Polyhedron::shrink_bounding_box(box, POLYNOMIAL).
+
+2002-11-04 Monday 08:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.261): Avoid some useless copies.
+
+2002-11-03 Sunday 23:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.260): Avoid taking references to temporary
+	  GMP expressions.
+
+2002-11-03 Sunday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.155), ascii_dump_load1.cc (1.9),
+	  ascii_dump_load2.cc (1.7), ascii_dump_load3.cc (1.8),
+	  ascii_dump_load4.cc (1.7), ascii_dump_load5.cc (1.4): Be
+	  consistent in naming files.
+
+2002-11-03 Sunday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.46), Row.inlines.hh (1.34): Progress in
+	  supporting compilers that do not provide flexible arrays.
+
+2002-11-03 Sunday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.68),
+	  interfaces/Prolog/GNU/Makefile.am (1.24), m4/ac_check_gmp.m4
+	  (1.6): For the sake of not very smart linkers, link with `-lgmpxx
+	  -lgmp' instead of the other way around.
+
+2002-11-03 Sunday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: ascii_dump_load1.cc (1.8), ascii_dump_load2.cc (1.6),
+	  ascii_dump_load3.cc (1.7), ascii_dump_load4.cc (1.6),
+	  ascii_dump_load5.cc (1.3), linearpartition1.cc (1.6),
+	  linearpartition2.cc (1.6), linearpartition3.cc (1.6), memory1.cc
+	  (1.12), writeconsys1.cc (1.3), writegensys1.cc (1.4),
+	  writegensys2.cc (1.4), writegensys3.cc (1.3), writepolyhedron1.cc
+	  (1.3), writepolyhedron2.cc (1.4), writepolyhedron3.cc (1.3),
+	  writerelation1.cc (1.3), writevariable1.cc (1.3): Be consistent
+	  as far as inclusions are concerned.
+
+2002-11-03 Sunday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/pwl_header.middle (1.2): Include sys/time.h, if
+	  available.
+
+2002-11-03 Sunday 10:56  Elisa Ricci
+
+	* tests/: Makefile.am (1.154), boundingbox3.cc (1.4),
+	  boundingbox4.cc (1.1): Erased form boundingbox3.cc the flags
+	  "C_TESTS" and "NNC_TESTS".  boundingbox3.cc now contains only
+	  tests with C_Polyhedron; the tests that were in boundingbox3.cc
+	  and that contain polyhedron described by strict inequalities now
+	  are in boundingbox4.cc.
+
+2002-11-03 Sunday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.10): Always use the current
+	  C++ compiler, not simply `g++'.
+
+2002-11-03 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.defs.hh (1.7), Watchdog.inlines.hh (1.6):
+	  Little cleaning.
+
+2002-11-03 Sunday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: config.h.in (1.3), configure.ac (1.11): Get rid of
+	  AC_C_INLINE: we do not use inlines in C code and it was doing
+	  harm with some compilers.
+
+2002-11-02 Saturday 23:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.50), ppl_c.h (1.50): The function
+	  ppl_Polyhedron_shrink_bounding_box() has now a parameter allowing
+	  the selection of the desired complexity class.
+
+2002-11-02 Saturday 23:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.25): Spurious line removed.
+
+2002-11-02 Saturday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.9): Can now compile the
+	  Ciao-Prolog interface.
+
+2002-11-02 Saturday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.26): Properly declare all
+	  the predicates.
+
+2002-11-02 Saturday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.11): Uninitialized variable
+	  bug fixed.
+
+2002-11-02 Saturday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.10): Buggy conditional fixed.
+
+2002-11-02 Saturday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: adddimensions11.cc (1.2), addgenerators11.cc (1.3),
+	  exceptions1.cc (1.25), exceptions2.cc (1.20): Avoid inventing
+	  non-existing standard exceptions.
+
+2002-11-02 Saturday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.171), src/Polyhedron.inlines.hh (1.51),
+	  src/globals.hh (1.24), tests/boundingbox1.cc (1.26),
+	  tests/boundingbox2.cc (1.14): New enum Complexity_Class to
+	  represent complexity classes.  Polyhedron::shrink_bounding_box()
+	  now takes a complexity class, defaulting to ANY, instead of a
+	  bool.
+
+2002-11-02 Saturday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.49): Mention the bug fixed in operator-=(LinExpression&,
+	  const LinExpression&).
+
+2002-11-02 Saturday 09:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.22), configure.ac (1.72): Get rid of AC_C_INLINE:
+	  we do not use inlines in C code and it was doing harm with some
+	  compilers.
+
+2002-11-01 Friday 20:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.21), configure.ac (1.71), m4/ac_check_gmp.m4
+	  (1.5): Much improved detection of the size of GMP's mp_limb_t.
+
+2002-11-01 Friday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.14), SatRow.defs.hh (1.23): Got rid of
+	  operator<<(std::ostream&, const SatRow&).
+
+2002-11-01 Friday 18:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.73), Constraint.defs.hh (1.77),
+	  GenSys.defs.hh (1.84), Generator.defs.hh (1.80),
+	  Poly_Con_Relation.defs.hh (1.18), Poly_Gen_Relation.defs.hh
+	  (1.17), Polyhedron.defs.hh (1.170), Variable.defs.hh (1.27):
+	  Correctly relate the output operators to the corresponding
+	  classes.
+
+2002-11-01 Friday 18:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.24): There must be a more efficient way to implement bool
+	  are_disjoint(const Polyhedron&, const Polyhedron&).
+
+2002-11-01 Friday 18:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: NNCminimize1.cc (1.7), NNCminimize2.cc (1.7),
+	  NNCminimize3.cc (1.7), NNCminimize5.cc (1.6), ascii_dump_load3.cc
+	  (1.6), ascii_dump_load4.cc (1.5), bbrz02widening13.cc (1.5),
+	  bbrz02widening14.cc (1.6), bbrz02widening15.cc (1.5),
+	  bbrz02widening9.cc (1.5), concatenate1.cc (1.4), exceptions1.cc
+	  (1.24), generators1.cc (1.10), generators2.cc (1.6),
+	  linearpartition1.cc (1.5), linearpartition2.cc (1.5),
+	  linearpartition3.cc (1.5), memory1.cc (1.11), smm1.cc (1.9),
+	  watchdog1.cc (1.12): It is pointless to say `using namespace std'
+	  and `std::' at the same time.
+
+2002-11-01 Friday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.48), src/AskTell.defs.hh (1.10), src/AskTell.inlines.hh
+	  (1.10), src/BoundingBox.cc (1.4), src/BoundingBox.defs.hh (1.8),
+	  src/ConSys.cc (1.54), src/ConSys.defs.hh (1.72),
+	  src/Constraint.cc (1.34), src/Constraint.defs.hh (1.76),
+	  src/Determinate.defs.hh (1.22), src/Determinate.inlines.hh
+	  (1.22), src/GenSys.cc (1.70), src/GenSys.defs.hh (1.83),
+	  src/Generator.cc (1.41), src/Generator.defs.hh (1.79),
+	  src/Interval.cc (1.5), src/Interval.defs.hh (1.10),
+	  src/Poly_Con_Relation.cc (1.5), src/Poly_Con_Relation.defs.hh
+	  (1.17), src/Poly_Gen_Relation.cc (1.5),
+	  src/Poly_Gen_Relation.defs.hh (1.16), src/Polyhedron.cc (1.259),
+	  src/Polyhedron.defs.hh (1.169), src/Polyhedron.types.hh (1.7),
+	  src/PowerSet.defs.hh (1.21), src/PowerSet.inlines.hh (1.26),
+	  src/SatRow.cc (1.13), src/SatRow.defs.hh (1.22), src/Variable.cc
+	  (1.9), src/Variable.defs.hh (1.26), tests/NNCminimize4.cc (1.9),
+	  tests/NNCminimize6.cc (1.8), tests/bbrz02widening13.cc (1.4),
+	  tests/bbrz02widening14.cc (1.5), tests/bbrz02widening15.cc (1.4),
+	  tests/bbrz02widening9.cc (1.4), tests/boundingbox1.cc (1.25),
+	  tests/boundingbox2.cc (1.13), tests/linearpartition1.cc (1.4),
+	  tests/linearpartition2.cc (1.4), tests/linearpartition3.cc (1.4),
+	  tests/mc91.cc (1.8), tests/print.cc (1.3), tests/relations1.cc
+	  (1.7), tests/relations10.cc (1.3), tests/relations11.cc (1.3),
+	  tests/relations12.cc (1.2), tests/relations13.cc (1.2),
+	  tests/relations14.cc (1.2), tests/relations15.cc (1.2),
+	  tests/relations16.cc (1.2), tests/relations17.cc (1.3),
+	  tests/relations18.cc (1.2), tests/relations2.cc (1.8),
+	  tests/relations3.cc (1.8), tests/relations4.cc (1.8),
+	  tests/relations5.cc (1.8), tests/relations6.cc (1.7),
+	  tests/relations7.cc (1.7), tests/relations8.cc (1.7),
+	  tests/relations9.cc (1.8), tests/smm1.cc (1.8),
+	  tests/writeconsys1.cc (1.2), tests/writegensys1.cc (1.3),
+	  tests/writegensys2.cc (1.3), tests/writegensys3.cc (1.2),
+	  tests/writepolyhedron1.cc (1.2), tests/writepolyhedron2.cc (1.3),
+	  tests/writepolyhedron3.cc (1.2), tests/writerelation1.cc (1.2),
+	  tests/writevariable1.cc (1.2): All the input/output operators
+	  have been confined into namespace
+	  Parma_Polyhedra_Library::IO_Operators.  This way they do not
+	  conflict with the operators the user might want to define.
+
+2002-11-01 Friday 14:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.53): Exclude Topology.hh from the generation
+	  of user's documentation.
+
+2002-11-01 Friday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: BBox.cc (1.1), BBox.hh (1.1), Makefile.am (1.153),
+	  boundingbox1.cc (1.24), boundingbox2.cc (1.12), boundingbox3.cc
+	  (1.3): Avoid code duplication and some spaghetti-code.
+
+2002-11-01 Friday 12:03  Elisa Ricci
+
+	* tests/: boundingbox1.cc (1.23), boundingbox3.cc (1.2): Added
+	  operator<=(const BInterval& x, const BInterval& y) and
+	  operator<=(const BBox& x, const BBox& y).  In the tests, now we
+	  verify also if nbox <= pbox.
+
+2002-11-01 Friday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.cc (1.4): Always include <iostream>.
+
+2002-10-31 Thursday 18:08  Elisa Ricci
+
+	* tests/: Makefile.am (1.152), boundingbox1.cc (1.22),
+	  boundingbox3.cc (1.1): Modified the test boundingbox1.cc to use
+	  only necessarily closed polyhedron and to test also
+	  Polyhedron::shrink_bounding_box(Box& box, bool polynomial) when
+	  polynomial is "true".  Put the tests with not necessarily closed
+	  polyhedra into boundingbox3.cc.
+
+2002-10-31 Thursday 18:02  Elisa Ricci
+
+	* src/: Interval.cc (1.3), Interval.defs.hh (1.9),
+	  Interval.inlines.hh (1.6), Polyhedron.inlines.hh (1.50): Added
+	  :operator<<(std::ostream& s, const ExtendedRational& x).  In
+	  ExtendedRational(const Integer& num, const Integer& den) we
+	  temporary use `canonicalize()'.  Added the part that we use if
+	  the bounding box must be shrunk in polynomial time (if the
+	  generator system of the polyhedron is not up-to-date).
+
+2002-10-30 Wednesday 21:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.49): Two problems with the current
+	  implementation of Polyhedron::shrink_bounding_box() flagged.
+
+2002-10-30 Wednesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.47), src/Polyhedron.defs.hh (1.168),
+	  src/Polyhedron.inlines.hh (1.48): New boolean parameter for
+	  template <typename Box> void Polyhedron::shrink_bounding_box(Box&
+	  box, bool polynomial) const: when true it specifies the bounding
+	  box must be shrunk in polynomial time.
+
+2002-10-30 Wednesday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc, src/Polyhedron.defs.hh, tests/Makefile.am,
+	  tests/stronglyminimize1.cc, tests/stronglyminimize2.cc,
+	  tests/stronglyminimize3.cc (alt_nnc.[26,10,8,4,4,4]): Got rid of
+	  Polyhedron::strongly_minimize().
+
+2002-10-30 Wednesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.258), src/Polyhedron.defs.hh (1.167),
+	  tests/Makefile.am (1.151), tests/stronglyminimize1.cc (1.2),
+	  tests/stronglyminimize2.cc (1.2), tests/stronglyminimize3.cc
+	  (1.2): Got rid of Polyhedron::strongly_minimize().
+
+2002-10-30 Wednesday 17:24  Elisa Ricci
+
+	* tests/: NNCminimize5.cc (1.5), NNCminimize6.cc (1.7),
+	  addconstraints3.cc (1.6), generators1.cc (1.9), h79widening2.cc
+	  (1.4), h79widening3.cc (1.4): Now these tests verify if the used
+	  methods do the right thing.
+
+2002-10-30 Wednesday 17:18  Elisa Ricci
+
+	* tests/: Makefile.am (1.150), ascii_dump1.cc (1.2), operator1.cc
+	  (1.1), writerelation1.cc (1.1): The test ascii_dump1.cc now is
+	  called writerealtion1.cc, because it verifies operator<< of
+	  Poly_Gen_Relation and Poly_Con_Relation.  In operator1.cc put the
+	  tests to verify operator>=(const Polyhedron& x, const Polyhedron&
+	  y), operator>(const Polyhedron& x, const Polyhedron& y),
+	  operator!=(const Polyhedron& x, const Polyhedron& y) and
+	  operator<(const Polyhedron& x, const Polyhedron& y).
+
+2002-10-30 Wednesday 16:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.25): Duplicate `public' specification
+	  removed.
+
+2002-10-30 Wednesday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.25): extra_linker_opts/1
+	  directive added.
+
+2002-10-30 Wednesday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.149), writegensys4.cc (1.2),
+	  writevariable1.cc (1.1): Properly test operator<<(std::ostream&
+	  s, const Variable& v) and the related machinery.
+
+2002-10-29 Tuesday 18:35  Elisa Ricci
+
+	* tests/: Makefile.am (1.148), writegensys4.cc (1.1): Added a test
+	  to print a variable with id > 26.
+
+2002-10-29 Tuesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.45), Row.defs.hh (1.57): Removed
+	  operator<<(std::ostream&, const Row&).
+
+2002-10-29 Tuesday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.7): Updated.
+
+2002-10-29 Tuesday 14:49  Elisa Ricci
+
+	* tests/: Makefile.am (1.147), ascii_dump1.cc (1.1),
+	  ascii_dump_load1.cc (1.7), ascii_dump_load2.cc (1.5),
+	  ascii_dump_load3.cc (1.5), ascii_dump_load4.cc (1.4),
+	  ascii_dump_load5.cc (1.2): Added some tests to verify
+	  Poly_Gen_Relation::ascii_dump(), Poly_Gen_Relation::OK(),
+	  Poly_Con_Relation::ascii_dump() and Poly_Con_Relation::OK().
+	  Corrected the comment of the tests ascii_dump_load1.cc,
+	  ascii_dump_load2.cc, ascii_dump_load3.cc, ascii_dump_load4.cc,
+	  ascii_dump_load5.cc.
+
+2002-10-28 Monday 08:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.cc (ppl-0_4-branch.1): Fixed a bug in
+	  LinExpression::operator-=().
+
+2002-10-28 Monday 08:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, linexpression1.cc (ppl-0_4-branch.[5,1]):
+	  This test shows a bug in LinExpression::operator-=().
+
+2002-10-26 Saturday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.70): Bump version number.
+
+2002-10-25 Friday 20:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (alt_nnc.8): Definitions of num_cons()
+	  and num_gens().
+
+2002-10-25 Friday 19:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh, tests/hypercubes.cc (alt_nnc.[9,10]):
+	  Added methods for printing sizes of (low-level) con_sys and
+	  gen_sys.
+
+2002-10-25 Friday 18:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.25): n strong minimization of
+	  constraints, force all strict inequalities to have the same
+	  epsilon coefficient.
+
+2002-10-25 Friday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.9): Test exploiting smf's.
+
+2002-10-25 Friday 12:42  Elisa Ricci
+
+	* tests/: Makefile.am (1.146), ascii_dump_load4.cc (1.3),
+	  ascii_dump_load5.cc (1.1): Added some new test to verify
+	  ascii_dump() and ascii_load().
+
+2002-10-24 Thursday 18:07  Elisa Ricci
+
+	* tests/: Makefile.am (1.145), ascii_dump_load4.cc (1.2),
+	  writegensys3.cc (1.1): Added a new test to verify
+	  operator<<(std::ostream&, const GenSys&).  Erased form
+	  ascii_dump_load4.cc an unused const char*.
+
+2002-10-24 Thursday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Init.defs.hh (1.7): Useless file inclusion removed.
+
+2002-10-24 Thursday 15:45  Elisa Ricci
+
+	* src/LinExpression.cc (1.15): Corrected the bug in
+	  operator-=(LinExpression& e1, const LinExpression& e2): if
+	  e1.size() < e2.size(), we compute a copy e of e1 with the
+	  dimension of e2 and then we compute e - e2.
+
+2002-10-24 Thursday 15:09  Elisa Ricci
+
+	* tests/: Makefile.am (1.144), addgenerator4.cc (1.2),
+	  linexpression1.cc (1.1): Now, the test addgenerator4.cc verifies
+	  only Polyhedron::add_generator(g).  The bug of
+	  operator-=(LinExpression& e1, const LinExpression& e2) is now
+	  reported in the test linexpression1.cc.
+
+2002-10-24 Thursday 14:37  Elisa Ricci
+
+	* tests/: Makefile.am (1.143), addgenerator4.cc (1.1): Added a test
+	  for Polyhedron::add_generator(g). This test shows a bug in
+	  operator-=(LinExpression& e1, const LinExpression& e2) if
+	  e1.size() < e2.size().
+
+2002-10-23 Wednesday 12:19  Elisa Ricci
+
+	* src/Polyhedron.cc (alt_nnc.24): Corrected a problem in
+	  Polyhedron::is_BBRZ02_stabilizing(x, y): the vector `x_num_rays'
+	  must have `x.gen_sys.num_columns() - 1' elements and not
+	  `x.space_dimension()'. We have done the same change for the
+	  vector `y_num_rays'.
+
+2002-10-23 Wednesday 10:09  Elisa Ricci
+
+	* src/Polyhedron.cc (alt_nnc.23): Modified
+	  Polyhedron::is_BBRZ02_stabilizing(x, y) so that if `x' and `y'
+	  are not necessarily closed we compute the number of their points
+	  and closure points and not only the number of their closure
+	  points.
+
+2002-10-21 Monday 07:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, smfintersection.cc, smfpolyhull.cc
+	  (alt_nnc.[7,1,2]): Trying to better exploit smf's.
+
+2002-10-21 Monday 07:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.22): Disregarding the minusepsray when
+	  performing strong minimization of consys.
+
+2002-10-19 Saturday 00:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* mkinstalldirs (1.5): Updated.
+
+2002-10-19 Saturday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: config.guess (1.1), config.sub (1.1), depcomp (1.1),
+	  install-sh (1.1), ltmain.sh (1.1), missing (1.1), mkinstalldirs
+	  (1.1): Missing files added.
+
+2002-10-18 Friday 17:02  Elisa Ricci
+
+	* src/: ConSys.cc (1.53), ConSys.defs.hh (1.71): Modified
+	  ConSys:OK(): now we verify also if every row in the matrix is a
+	  valid constraint.
+
+2002-10-18 Friday 16:46  Elisa Ricci
+
+	* tests/: Makefile.am (1.142), ascii_dump_load1.cc (1.6),
+	  exceptions1.cc (1.23), writeconsys1.cc (1.1): The writeconsys1.cc
+	  test verifies operator<<(s, cs).  Added tests in exceptions1.cc
+	  to verify Generator::coefficient() and Constraint::coefficient().
+	  In ascii_dump_load1.cc erased an unused variable.
+
+2002-10-18 Friday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/smfpolyhull.cc (alt_nnc.1): Put under CVS control.
+
+2002-10-18 Friday 10:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.21): Modified the widening operators
+	  to also add the non-strict inequality corresponding to each
+	  strict inequality added.
+
+2002-10-17 Thursday 18:33  Elisa Ricci
+
+	* tests/: exceptions1.cc (1.22), exceptions2.cc (1.19),
+	  writegensys1.cc (1.2): Added some tests to verify
+	  Generator::ray(), Generator::line(), Generator::closure_point(),
+	  Generator::coefficient(), Generator::divisor() and operator<<(s,
+	  g).
+
+2002-10-17 Thursday 18:30  Elisa Ricci
+
+	* src/Polyhedron.cc (1.257): In
+	  Polyhedron::BBRZ02_widening_assign() and
+	  Polyhedron::is_BBRZ02_stabilizing() debugging-purpose output made
+	  silent.  Modified Polyhedron::select_H79_constraints(y, cs) so
+	  that when we use it the system of constraints has the right
+	  topology.
+
+2002-10-17 Thursday 17:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.8): Now committed the right file I
+	  was playing with.
+
+2002-10-17 Thursday 17:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, hypercubes.cc (alt_nnc.[6,7]): Playing with
+	  hypercubes and strong minimization.
+
+2002-10-17 Thursday 17:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.20): Debugging-purpose output made
+	  silent.
+
+2002-10-17 Thursday 15:39  Elisa Ricci
+
+	* tests/: Makefile.am (1.141), ascii_dump_load4.cc (1.1),
+	  relations18.cc (1.1), writepolyhedron3.cc (1.1): The
+	  ascii_dump_load4.cc test verifies some particular cases of
+	  ConSys::ascii_dump(s) and ConSys::ascii_load(s).  The
+	  relations18.cc test verifies Polyhedron::relation_with(g), where
+	  "g" is a closure point and the system of constraints of the
+	  polyhedron contains equalities.  The writepolyhedron3.cc test
+	  verifies operator<<(std::ostream&, const Polyhedron&) with an
+	  universe polyhedron.
+
+2002-10-17 Thursday 11:20  Elisa Ricci
+
+	* tests/: ascii_dump_load1.cc (1.5), relations17.cc (1.2): Added
+	  new tests and modified other tests to verify some other methods
+	  of the class GenSys.
+
+2002-10-16 Wednesday 19:02  Elisa Ricci
+
+	* tests/writegensys2.cc (1.2): Now we print the system of
+	  generators of an empty polyhedron.
+
+2002-10-16 Wednesday 19:00  Elisa Ricci
+
+	* tests/: Makefile.am (1.140), limitedbbrz02widening1.cc (1.2),
+	  relations17.cc (1.1), writegensys1.cc (1.1), writegensys2.cc
+	  (1.1): Added new tests for the methods of the class GenSys.
+	  limitedbbrz02widening1.cc is now silent.  Now we do not test
+	  nnc_bbrz02widening4.cc and nnc_bbrz02widening7.cc because they
+	  contains NNC polyhedra.
+
+2002-10-16 Wednesday 17:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.256): Fixed a topology problem in
+	  select_H79_constraints().
+
+2002-10-16 Wednesday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/writepolyhedron2.cc (1.2): Inconsistent spacing fixed.
+
+2002-10-16 Wednesday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.255), Polyhedron.defs.hh (1.166),
+	  Polyhedron.inlines.hh (1.47): Added static member
+	  add_low_level_constraints(ConSys&) to factorize common code
+	  adding either the positivity or the epsilon-bound constraints.
+
+2002-10-16 Wednesday 14:36  Elisa Ricci
+
+	* tests/: Makefile.am (1.139), bbrz02widening19.cc (1.1),
+	  limitedbbrz02widening1.cc (1.1), writepolyhedron2.cc (1.1): Added
+	  new tests to verify some methods of the class Polyhedron.
+
+2002-10-16 Wednesday 09:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.6): Experimenting with closed
+	  hypercubes from which we cut vertices using strict inequalities
+	  and open duals of hypercubes to which we add (relatively open)
+	  facets by adding points.
+
+2002-10-16 Wednesday 07:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.69): Handle unary plus:
+	  previously, `+A = 1' could not be valid syntax for a constraint.
+
+2002-10-16 Wednesday 07:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.69): Version number bumped.
+
+2002-10-15 Tuesday 18:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.254): Debugging code in
+	  Polyhedron::check_universe() fixed.
+
+2002-10-15 Tuesday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.138), writepolyhedron1.cc (1.1): Test
+	  operator<<(std::ostream&, const Polyhedron&).
+
+2002-10-15 Tuesday 18:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.46), src/LinExpression.defs.hh (1.56),
+	  src/LinExpression.inlines.hh (1.25): New function LinExpression
+	  operator+(const LinExpression&): previously an expressions like
+	  `+x2-x3-x4 <= 0' could not constitute valid syntax for a
+	  constraint.
+
+2002-10-15 Tuesday 17:55  Elisa Ricci
+
+	* src/Polyhedron.cc (1.253): Modified Polyhedron::check_univers():
+	  if we are considering a not necessarily closed polyhedron and if
+	  its system of constraints contains only two rows that are not
+	  equalities, we are sure that they are epsilon constraints.
+
+2002-10-15 Tuesday 17:48  Elisa Ricci
+
+	* tests/: Makefile.am (1.137), topclosure3.cc (1.1): Added a test
+	  to verify Polyhedron::topological_closure_assign().
+
+2002-10-15 Tuesday 15:27  Elisa Ricci
+
+	* tests/: Makefile.am (1.136), adddimensions12.cc (1.1),
+	  affineimage6.cc (1.1), affinepreimage8.cc (1.1), disjoint1.cc
+	  (1.1), generalizedaffineimage11.cc (1.1),
+	  generalizedaffineimage12.cc (1.1), limitedh79widening4.cc (1.1):
+	  Added new tests for some methods of the class Polyhedron.
+
+2002-10-15 Tuesday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+	  config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+	  doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BoundingBox.defs.hh, src/C_Polyhedron.defs.hh, src/ConSys.cc,
+	  src/ConSys.defs.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/GenSys.cc, src/GenSys.defs.hh, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/Row.cc, src/Row.defs.hh,
+	  src/SatMatrix.cc, src/SatMatrix.defs.hh, src/SatRow.cc,
+	  src/SatRow.defs.hh, src/Status.cc, src/Status.defs.hh,
+	  src/algorithms.hh, src/conversion.cc, src/globals.hh,
+	  src/minimize.cc, src/simplify.cc, tests/Makefile.am,
+	  tests/addconstraint2.cc, tests/addconstraint3.cc,
+	  tests/addconstraints10.cc, tests/addconstraints11.cc,
+	  tests/addconstraints12.cc, tests/adddimensions11.cc,
+	  tests/addgenerator3.cc, tests/addgenerators11.cc,
+	  tests/affineimage3.cc, tests/affineimage4.cc,
+	  tests/affineimage5.cc, tests/affinepreimage5.cc,
+	  tests/affinepreimage6.cc, tests/affinepreimage7.cc,
+	  tests/ascii_dump_load1.cc, tests/ascii_dump_load2.cc,
+	  tests/ascii_dump_load3.cc, tests/bbrz02widening1.cc,
+	  tests/bbrz02widening10.cc, tests/bbrz02widening11.cc,
+	  tests/bbrz02widening12.cc, tests/bbrz02widening13.cc,
+	  tests/bbrz02widening14.cc, tests/bbrz02widening15.cc,
+	  tests/bbrz02widening16.cc, tests/bbrz02widening17.cc,
+	  tests/bbrz02widening18.cc, tests/bbrz02widening6.cc,
+	  tests/bbrz02widening7.cc, tests/bbrz02widening9.cc,
+	  tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+	  tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+	  tests/intersection10.cc, tests/linearpartition1.cc,
+	  tests/linearpartition2.cc, tests/linearpartition3.cc,
+	  tests/mc91.cc, tests/memory1.cc, tests/minconstraints2.cc,
+	  tests/minconstraints3.cc, tests/mingenerators2.cc,
+	  tests/mingenerators3.cc, tests/polydifference7.cc,
+	  tests/polyhull7.cc, tests/polyhull8.cc, tests/relations10.cc,
+	  tests/relations11.cc, tests/relations12.cc, tests/relations13.cc,
+	  tests/relations14.cc, tests/relations15.cc, tests/relations16.cc,
+	  tests/stronglyminimize1.cc, tests/stronglyminimize2.cc,
+	  tests/stronglyminimize3.cc, tests/timeelapse6.cc,
+	  tests/timeelapse7.cc, tests/topclosed3.cc, tests/topclosure2.cc
+	  (alt_nnc.[3,6,4,3,5,3,5,3,3,3,3,3,3,4,3,3,3,3,3,6,6,4,4,4,5,4,4,3,4,4,4,4,4,5,5,5,8,7,7,7,7,7,10,7,4,4,4,5,5,4,4,5,5,4,5,4,5,19,8,6,6,4,5,4,5,3,5,4,5,3,4,5,5,4,5,3,3,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3,3,3,3,3,3,3,3,4,4,4,3,3,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]):
+	  Merged the changes on the main trunk within the tags
+	  third_merge_to_alt_nnc and fourth_merge_to_alt_nnc.
+
+2002-10-15 Tuesday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+	  config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+	  doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BoundingBox.defs.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatRow.cc, src/SatRow.defs.hh, src/Status.cc,
+	  src/Status.defs.hh, src/algorithms.hh, src/conversion.cc,
+	  src/globals.hh, src/minimize.cc, src/simplify.cc,
+	  tests/Makefile.am, tests/addconstraint2.cc,
+	  tests/addconstraint3.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/adddimensions11.cc, tests/addgenerator3.cc,
+	  tests/addgenerators11.cc, tests/affineimage3.cc,
+	  tests/affineimage4.cc, tests/affineimage5.cc,
+	  tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+	  tests/affinepreimage7.cc, tests/ascii_dump_load1.cc,
+	  tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+	  tests/bbrz02widening1.cc, tests/bbrz02widening10.cc,
+	  tests/bbrz02widening11.cc, tests/bbrz02widening12.cc,
+	  tests/bbrz02widening13.cc, tests/bbrz02widening14.cc,
+	  tests/bbrz02widening15.cc, tests/bbrz02widening16.cc,
+	  tests/bbrz02widening17.cc, tests/bbrz02widening18.cc,
+	  tests/bbrz02widening6.cc, tests/bbrz02widening7.cc,
+	  tests/bbrz02widening9.cc, tests/boundingbox2.cc,
+	  tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+	  tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+	  tests/hypercubes.cc, tests/intersection10.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/mc91.cc, tests/memory1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/mingenerators2.cc, tests/mingenerators3.cc,
+	  tests/polydifference7.cc, tests/polyhull7.cc, tests/polyhull8.cc,
+	  tests/relations10.cc, tests/relations11.cc, tests/relations12.cc,
+	  tests/relations13.cc, tests/relations14.cc, tests/relations15.cc,
+	  tests/relations16.cc, tests/stronglyminimize1.cc,
+	  tests/stronglyminimize2.cc, tests/stronglyminimize3.cc,
+	  tests/timeelapse6.cc, tests/timeelapse7.cc, tests/topclosed3.cc,
+	  tests/topclosure2.cc
+	  (alt_nnc.[2,5,3,2,4,2,4,2,2,2,2,2,2,3,2,2,2,2,2,5,5,3,3,3,4,3,3,2,3,3,3,3,3,4,4,3,4,7,6,5,6,6,5,6,6,9,6,7,7,5,3,3,3,4,4,3,3,4,4,3,4,3,4,18,7,7,5,5,3,4,3,4,2,4,3,4,2,3,4,4,3,4,2,2,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,3,3,3,5,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,5,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]):
+	  Erroneous merge undone.
+
+2002-10-15 Tuesday 12:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.67): Documentation for
+	  ppl_Polyhedron_add_constraint_and_minimize ppl_Polyhedron_and
+	  add_generator_and_minimize added.
+
+2002-10-15 Tuesday 12:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.10): Bug introduced in previous change
+	  fixed.
+
+2002-10-15 Tuesday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.20), configure.ac (1.68), tests/memory1.cc (1.10):
+	  Portability improvements for memory-guarded programs.  Mac OS X
+	  is now supported.  Operating systems not providing any mechanism
+	  to limit memory usage are also supported.
+
+2002-10-15 Tuesday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.252): Greatly simplified the
+	  strongly_minimize() procedure.
+
+2002-10-15 Tuesday 08:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.30): Specify -lstdc++ in
+	  splfr command invocation (this seems to help on Mac OS X).
+
+2002-10-15 Tuesday 08:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.9): Use
+	  Polyhedron::add_constraint_and_minimize().
+
+2002-10-14 Monday 21:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog, NEWS, STANDARDS, config.guess, config.h.in,
+	  config.sub, configure.ac, ltmain.sh, ppl.spec.in,
+	  doc/Makefile.am, doc/bib2dox, doc/bib2html1.sed,
+	  doc/bib2html2.sed, doc/definitions.dox,
+	  doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  doc/fdl.dox, doc/gpl.dox, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq2.pl, interfaces/Prolog/pl_check.pl,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/Makefile.am,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/AskTell.defs.hh,
+	  src/BoundingBox.defs.hh, src/C_Polyhedron.cc,
+	  src/C_Polyhedron.defs.hh, src/ConSys.cc, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Integer.defs.hh,
+	  src/Integer.inlines.hh, src/LinExpression.cc,
+	  src/LinExpression.defs.hh, src/LinExpression.inlines.hh,
+	  src/Makefile.am, src/Matrix.cc, src/Matrix.defs.hh,
+	  src/NNC_Polyhedron.defs.hh, src/Poly_Con_Relation.cc,
+	  src/Poly_Con_Relation.defs.hh, src/Poly_Gen_Relation.cc,
+	  src/Poly_Gen_Relation.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatRow.cc, src/SatRow.defs.hh, src/Status.cc,
+	  src/Status.defs.hh, src/algorithms.hh, src/conversion.cc,
+	  src/globals.hh, src/minimize.cc, src/simplify.cc,
+	  tests/Makefile.am, tests/addconstraint2.cc,
+	  tests/addconstraint3.cc, tests/addconstraints10.cc,
+	  tests/addconstraints11.cc, tests/addconstraints12.cc,
+	  tests/adddimensions11.cc, tests/addgenerator3.cc,
+	  tests/addgenerators11.cc, tests/affineimage3.cc,
+	  tests/affineimage4.cc, tests/affineimage5.cc,
+	  tests/affinepreimage5.cc, tests/affinepreimage6.cc,
+	  tests/affinepreimage7.cc, tests/ascii_dump_load1.cc,
+	  tests/ascii_dump_load2.cc, tests/ascii_dump_load3.cc,
+	  tests/bbrz02widening1.cc, tests/bbrz02widening10.cc,
+	  tests/bbrz02widening11.cc, tests/bbrz02widening12.cc,
+	  tests/bbrz02widening13.cc, tests/bbrz02widening14.cc,
+	  tests/bbrz02widening15.cc, tests/bbrz02widening16.cc,
+	  tests/bbrz02widening17.cc, tests/bbrz02widening18.cc,
+	  tests/bbrz02widening6.cc, tests/bbrz02widening7.cc,
+	  tests/bbrz02widening9.cc, tests/boundingbox2.cc,
+	  tests/concatenate5.cc, tests/contains1.cc, tests/exceptions1.cc,
+	  tests/exceptions2.cc, tests/files.cc, tests/files.hh,
+	  tests/generalizedaffineimage1.cc,
+	  tests/generalizedaffineimage10.cc,
+	  tests/generalizedaffineimage2.cc,
+	  tests/generalizedaffineimage3.cc,
+	  tests/generalizedaffineimage4.cc,
+	  tests/generalizedaffineimage5.cc,
+	  tests/generalizedaffineimage6.cc,
+	  tests/generalizedaffineimage7.cc,
+	  tests/generalizedaffineimage8.cc,
+	  tests/generalizedaffineimage9.cc, tests/h79widening5.cc,
+	  tests/hypercubes.cc, tests/intersection10.cc,
+	  tests/linearpartition1.cc, tests/linearpartition2.cc,
+	  tests/linearpartition3.cc, tests/mc91.cc, tests/memory1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/mingenerators2.cc, tests/mingenerators3.cc,
+	  tests/polydifference7.cc, tests/polyhull7.cc, tests/polyhull8.cc,
+	  tests/relations10.cc, tests/relations11.cc, tests/relations12.cc,
+	  tests/relations13.cc, tests/relations14.cc, tests/relations15.cc,
+	  tests/relations16.cc, tests/stronglyminimize1.cc,
+	  tests/stronglyminimize2.cc, tests/stronglyminimize3.cc,
+	  tests/timeelapse6.cc, tests/timeelapse7.cc, tests/topclosed3.cc,
+	  tests/topclosure2.cc
+	  (alt_nnc.[1,4,2,1,3,1,3,1,1,1,1,1,1,2,1,1,1,1,1,4,4,2,2,2,3,2,2,1,2,2,2,2,2,3,3,2,3,6,5,4,5,5,4,5,5,8,5,6,6,4,2,2,2,3,3,2,2,3,3,2,3,2,3,17,6,6,4,4,2,3,2,3,1,3,2,3,1,2,3,3,2,3,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,2,4,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Fourth merge from main trunk.
+
+2002-10-14 Monday 17:09  Elisa Ricci
+
+	* tests/: Makefile.am (1.135), addconstraint3.cc (1.1),
+	  addgenerator3.cc (1.1): Added a test for
+	  Polyhedron::add_constraint_and_minimize(c) and a test for
+	  Polyhedron::add_generator_and_minimize(g).
+
+2002-10-14 Monday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.45), interfaces/C/ppl_c.cc (1.49), interfaces/C/ppl_c.h
+	  (1.49), interfaces/Prolog/pl_check.pl (1.26),
+	  interfaces/Prolog/ppl_prolog.icc (1.68),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.24),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.28),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.52),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.5),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.10),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.46), src/Polyhedron.cc
+	  (1.251), src/Polyhedron.defs.hh (1.165): New methods bool
+	  Polyhedron::add_constraint_and_minimize(const Constraint&) and
+	  bool Polyhedron::add_generator_and_minimize(const Generator&) to
+	  add a constraint or a generator and minimizing the result at the
+	  same time.
+
+2002-10-14 Monday 14:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.44), interfaces/C/ppl_c.cc (1.48), interfaces/C/ppl_c.h
+	  (1.48), interfaces/Prolog/Prolog_interface.dox (1.66),
+	  interfaces/Prolog/pl_check.pl (1.25),
+	  interfaces/Prolog/ppl_prolog.icc (1.67),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.23),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.27),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.51),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.4),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.9),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.45), src/Polyhedron.cc
+	  (1.250), src/Polyhedron.defs.hh (1.164): New method void
+	  Polyhedron::BBRZ02_limited_widening_assign(const Polyhedron&,
+	  ConSys&).  Both this and void
+	  Polyhedron::BBRZ02_widening_assign(const Polyhedron&) are now
+	  available through all the interfaces.
+
+2002-10-14 Monday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.67): We now require autoconf (at least) 2.54 and
+	  automake (at least) 1.7.
+
+2002-10-14 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.66), interfaces/Prolog/SICStus/Makefile.am
+	  (1.29): An hack that was necessary to build the SICStus Prolog
+	  interface with SICStus 3.9.0 has been removed, since it prevented
+	  us to build on Darwin.  Consequently, we now require SICStus
+	  3.9.1 or later version.
+
+2002-10-14 Monday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.65): Bump version number.
+
+2002-10-13 Sunday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.6): Update to the latest version of libtool.
+
+2002-10-13 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.8): Bug fixed in widening_assign().
+
+2002-10-13 Sunday 16:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.75): We were too eager in converting
+	  "<" and ">" to "\<" and "\>" in Doxygen comments: this should not
+	  be done within LaTeX formulas.
+
+2002-10-12 Saturday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.35): Comment fixed for Doxygen.
+
+2002-10-12 Saturday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.9): Much improved portability.
+
+2002-10-12 Saturday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.19), configure.ac (1.64): Check for declarations
+	  of RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS in
+	  <sys/resource.h>.
+
+2002-10-12 Saturday 20:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.7): Two serious bugs have been fixed.  Other
+	  improvements.
+
+2002-10-12 Saturday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.21), Determinate.inlines.hh (1.21),
+	  PowerSet.defs.hh (1.20), PowerSet.inlines.hh (1.25): New default
+	  constructor.
+
+2002-10-12 Saturday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.103), src/AskTell.defs.hh (1.9),
+	  src/C_Polyhedron.defs.hh (1.18), src/Constraint.defs.hh (1.74),
+	  src/Determinate.defs.hh (1.20), src/NNC_Polyhedron.defs.hh
+	  (1.20): Fix all but one of the problems reported by the new
+	  version of Doxygen.
+
+2002-10-12 Saturday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/fdl.dox (1.2), doc/gpl.dox (1.3),
+	  interfaces/Prolog/Prolog_interface.dox (1.65): Sectioning fixed.
+
+2002-10-12 Saturday 09:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: bib2dox (1.2), bib2html1.sed (1.1), bib2html2.sed (1.1),
+	  bib2html2dox.sed (1.2), definitions.dox (1.102): Improvements to
+	  the machinery we use to build the bibliography section of the
+	  documentation.
+
+2002-10-11 Friday 18:41  Elisa Ricci
+
+	* tests/: Makefile.am (1.134), stronglyminimize1.cc (1.1),
+	  stronglyminimize2.cc (1.1), stronglyminimize3.cc (1.1): Added
+	  three tests for Polyhedron::strongly_minimize().
+
+2002-10-11 Friday 18:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.44): Use the new C interface
+	  provided by YAP.
+
+2002-10-11 Friday 16:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.64): Mention other
+	  problems we had with the GNU Prolog interface.
+
+2002-10-11 Friday 12:53  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.163): Polyhedron::strongly_minimize()
+	  is now public, but the user can not see its documentation.
+
+2002-10-11 Friday 11:49  Elisa Ricci
+
+	* tests/: Makefile.am (1.133), addconstraint2.cc (1.1),
+	  concatenate5.cc (1.1), intersection10.cc (1.1),
+	  polydifference7.cc (1.1), polyhull8.cc (1.1): Added these tests
+	  to verify some methods of the class Polyhedron in the case of
+	  empty or zero dimensional polyhedron.
+
+2002-10-11 Friday 11:46  Elisa Ricci
+
+	* tests/generalizedaffineimage10.cc (1.2): Added two tests to
+	  verify Polyhedron::generalized_affine_image(lhs, r, rhs) when the
+	  set of variables of left hand side and the set of the variable of
+	  the right hand side are disjoint.
+
+2002-10-10 Thursday 17:47  Elisa Ricci
+
+	* tests/: Makefile.am (1.132), generalizedaffineimage10.cc (1.1):
+	  Added a new test for Polyhedron::generalized_affine_image(lhs, r,
+	  rhs).
+
+2002-10-10 Thursday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.249): Do not use vector<bool>.
+
+2002-10-10 Thursday 11:20  Elisa Ricci
+
+	* src/Polyhedron.cc (1.248): Some improvements to the third
+	  technique of Polyhedron::BBRZ02_widening_assign(): - the test
+	  y.relation_with(x_g) == Poly_Gen_Relation::nothing() is done
+	  after testing if x_g is a ray; - corrected the test of the
+	  elements of the vector "considered"; - now we use a const
+	  reference x_g (for x.gen_sys[i]) to find how it evolved since a
+	  ray of "y" and a copy of "x_g" to built the new ray.	Use
+	  "H79_con_sys" instead of "common_con_sys" in
+	  Polyhedron::BBRZ02_widening_assign() and in
+	  Polyhedron::H79_widening_assign().
+
+2002-10-10 Thursday 10:35  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.247), Polyhedron.defs.hh (1.162): Improved
+	  the messages of the exceptions.
+
+2002-10-09 Wednesday 20:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addgenerators11.cc (1.2): Be quiet.
+
+2002-10-09 Wednesday 17:59  Elisa Ricci
+
+	* tests/: bbrz02widening13.cc (1.3), bbrz02widening14.cc (1.4),
+	  bbrz02widening15.cc (1.3), bbrz02widening9.cc (1.3): Added the
+	  "known_result" to verify if the resulting polyhedron is equal to
+	  the polyhedron that we want to have.
+
+2002-10-09 Wednesday 14:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.24): Problem due to bug in GNU
+	  Prolog now avoided by delaying as much as possible any reference
+	  to variables that are intended to be bound to polyhedral handles.
+
+2002-10-09 Wednesday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/algorithms.hh (1.6): poly_hull_assign_if_exact(p,q) now
+	  return true if the poly-hull is exact.
+
+2002-10-09 Wednesday 10:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.73), Polyhedron.defs.hh (1.161):
+	  Escaped a few ">" and "<" occurring inside HTML tags.
+
+2002-10-09 Wednesday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.101): "<" and ">" inside HTMK tags have to
+	  be escaped by "\".
+
+2002-10-09 Wednesday 09:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.131), bbrz02widening18.cc (1.1): New test
+	  for bbrz02widening18, showing that we fall back to H79 when we
+	  may have obtained more precise results by combining H79 and the
+	  bbrz02 heuristics.
+
+2002-10-09 Wednesday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.20): Use the `-d Validate' option of doxygen
+	  (and see the resulting disaster).
+
+2002-10-08 Tuesday 12:29  Elisa Ricci
+
+	* src/Polyhedron.cc (1.246), tests/Makefile.am (1.130),
+	  tests/bbrz02widening16.cc (1.1), tests/bbrz02widening17.cc (1.1):
+	  Improved the third technique: the rays that we want to add are
+	  modified so that they satisfy the constraints of
+	  "common_con_sys".  Added to test to verify these changes.
+
+2002-10-08 Tuesday 09:24  Elisa Ricci
+
+	* src/Polyhedron.cc (1.245): Modified
+	  Polyhedron::is_BBRZ02_stabilizing(): if the number of points (or
+	  closure points) of `y' is smaller than the number of points of
+	  `x', the chain is not stabilizing.
+
+2002-10-07 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.129), ascii_dump_load1.cc (1.4),
+	  ascii_dump_load2.cc (1.4), ascii_dump_load3.cc (1.4): Write files
+	  in the current directory.  Make sure the current directory is
+	  also properly cleaned afterwards.
+
+2002-10-07 Monday 17:16  Elisa Ricci
+
+	* src/Polyhedron.cc (1.244): Made a little improvement to the third
+	  technique of Polyhedron::BBRZ02_widening_assign(): we built a
+	  temporary system of generators and then we use
+	  Polyhedron::add_generators_and_minimize() to add this system to
+	  the polyhedron `x'.
+
+2002-10-07 Monday 16:07  Elisa Ricci
+
+	* src/Polyhedron.cc (1.243): Corrected an error in the second
+	  technique of Polyhedron::BBRZ02_widening_assign(): we add the
+	  system of generators `valid_rays' if the new ray has all
+	  homogeneous coefficients equal to zero or if adding only a ray
+	  there is not stabilization.
+
+2002-10-07 Monday 14:38  Elisa Ricci
+
+	* src/Polyhedron.cc (1.242): Modified the second technique of
+	  Polyhedron::BBRZ02_widening_assign() so that before we add only
+	  the averaged ray and if the result is not stabilizing we add all
+	  the rays of `valid_rays'.
+
+2002-10-07 Monday 12:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.241): In is_BBRZ02_stabilizing(), corrected
+	  a bug in the test on stabilization based on number of rays.
+
+2002-10-07 Monday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.24), ppl_prolog.icc (1.66),
+	  Ciao/ppl_ciao.pl (1.22), GNU/ppl_gprolog.pl (1.18),
+	  SICStus/ppl_sicstus_sd.cc (1.26), SWI/ppl_swiprolog.cc (1.50),
+	  XSB/ppl_xsb.H (1.3), XSB/ppl_xsb.cc (1.8), YAP/ppl_yap.cc (1.43):
+	  Added ppl_Polyhedron_is_disjoint_from_Polyhedron/2 to Prolog
+	  interface.  Tests for this added to pl_check.pl
+
+2002-10-07 Monday 11:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.240): Modified method
+	  Polyhedron::is_BBRZ02_stabilizing(x, y) so that:  - we check for
+	  a decreasing number of rays lying inside the faces	of an
+	  orthant.   - we check whether x and y do happens to be the same
+	  polyhedron.  Modified method
+	  Polyhedron::BBRZ02_widening_assign(y) to apply, as a last resort,
+	  the widening H79.
+
+2002-10-07 Monday 11:19  Elisa Ricci
+
+	* tests/: ascii_dump_load3.cc (1.3), bbrz02widening1.cc (1.3),
+	  bbrz02widening12.cc (1.2), exceptions1.cc (1.21), exceptions2.cc
+	  (1.18): Modified these tests so that there is only a
+	  `set_handlers()' for each test.
+
+2002-10-07 Monday 10:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.160): In the Doxygen documentation of
+	  affine (pre)-image operators, fixed a couple of mismatches in the
+	  naming of parameters.
+
+2002-10-07 Monday 07:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.20): PH&
+	  Determinate<PH>::polyhedron() fixed: it was not calling mutate().
+
+2002-10-06 Sunday 22:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.5): Added a tentative, inefficient
+	  implementation for template <typename PH> bool
+	  poly_hull_assign_if_exact(PH& p, const PH& q): if the poly-hull
+	  of `p' and `q' is exact, assigns it to `p' and returns `true'; it
+	  returns false otherwise.
+
+	  Added a tentative implementation for template <typename PH> void
+	  complete_reduction(PowerSet<Determinate<PH> >& p): it collapses
+	  all the elements of `p' that can be poly-hulled without loss of
+	  precision.
+
+	  Added tentative implementations of template <typename PH> void
+	  H79_widening_assign(PowerSet<Determinate<PH> >& r, const
+	  PowerSet<Determinate<PH> >& q) and template <typename PH> void
+	  BBRZ02_widening_assign(PowerSet<Determinate<PH> >& r, const
+	  PowerSet<Determinate<PH> >& q): they are meant to generalize the
+	  widenings on polyhedra to sets of polyhedra.
+
+2002-10-06 Sunday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.19), Determinate.inlines.hh (1.19):
+	  Added PH& polyhedron().
+
+2002-10-06 Sunday 22:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: linearpartition1.cc (1.3), linearpartition2.cc (1.3),
+	  linearpartition3.cc (1.3): Reduce the scope of declarations.
+
+2002-10-06 Sunday 20:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: linearpartition2.cc (1.2), linearpartition3.cc (1.2):
+	  Made quiet.
+
+2002-10-06 Sunday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.128), linearpartition2.cc (1.1),
+	  linearpartition3.cc (1.1): Test linear_partition() with two
+	  disjoint polyhedra and with two telescopic polyhedra.
+
+2002-10-06 Sunday 19:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.4): Relax the limitations of
+	  linear_partition().
+
+2002-10-06 Sunday 18:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.239): Many (small) improvements in the
+	  implementation of the 2nd technique of BBRZ02_widening_assign().
+
+2002-10-06 Sunday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.100): Bibliography added (perhaps not at
+	  the right place).
+
+2002-10-06 Sunday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: bib2dox (1.1), bib2html2dox.sed (1.1): A tool to convert a
+	  BibTeX file into something suitable for inclusion into the
+	  Doxygen documentation.
+
+2002-10-06 Sunday 09:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.3): Comment slightly improved.
+
+2002-10-06 Sunday 09:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.23),
+	  devref-print.doxyconf-latex.in (1.23), devref.doxyconf-html.in
+	  (1.24): Include `algorithms.hh' in the sources used to create the
+	  developer's reference manual.
+
+2002-10-06 Sunday 09:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.99): Use the condition
+	  `Include_Implementation_Details' instead of
+	  `Implementation_Info'.
+
+2002-10-06 Sunday 09:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.8): A few minor improvements.
+
+2002-10-05 Saturday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/algorithms.hh (1.2): Include implementation details for
+	  linear_partition().
+
+2002-10-05 Saturday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/linearpartition1.cc (1.2): Be quiet.
+
+2002-10-05 Saturday 22:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bbrz02widening13.cc (1.2), bbrz02widening14.cc (1.3):
+	  Made silent.
+
+2002-10-05 Saturday 22:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.238), Polyhedron.defs.hh (1.159): Added
+	  new private method void Polyhedron::select_H79_constraints(const
+	  Polyhedron& y,					ConSys&
+	  cs_selection) const; that selects the common constraints of *this
+	  and y (into cs_selection) according to H79.  Used the method both
+	  in H79_widening and in BBRZ02_widening.  Modified the second
+	  technique of BBRZ02 to have more chances that it will produce a
+	  stabilizing sequence of polyhedra.  Added a few outputs for the
+	  debugging of BBRZ02_widening.
+
+2002-10-05 Saturday 20:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.52), src/algorithms.hh (1.1),
+	  tests/Makefile.am (1.127), tests/linearpartition1.cc (1.1): New
+	  function template <typename PH> std::pair<PH,
+	  PowerSet<Determinate<NNC_Polyhedron> > > linear_partition(const
+	  PH& p, const PH& q) computing a partition of `q' with respect to
+	  `p'.
+
+2002-10-05 Saturday 20:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.18), Determinate.inlines.hh (1.18):
+	  Added const PH& polyhedron() const.
+
+2002-10-05 Saturday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.47), ppl_c.h (1.47): The function int
+	  ppl_Polyhedron_is_disjoint_from_Polyhedron() makes the
+	  disjointness test for polyhedra available to the C interface.
+
+2002-10-05 Saturday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.43), src/Polyhedron.cc (1.237), src/Polyhedron.defs.hh
+	  (1.158): New function bool are_disjoint(const Polyhedron&, const
+	  Polyhedron&) returning true if and only if the two polyhedra are
+	  disjoint.
+
+2002-10-05 Saturday 18:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.157): All the relational operators on
+	  polyhedra are now commented the same way.
+
+2002-10-05 Saturday 17:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.19), PowerSet.inlines.hh (1.24): The
+	  default constructor now builds an empty (bottom) PowerSet.
+
+2002-10-05 Saturday 16:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: BoundingBox.defs.hh (1.7), ConSys.cc (1.52), ConSys.defs.hh
+	  (1.70), Constraint.cc (1.33), Constraint.defs.hh (1.72),
+	  Determinate.defs.hh (1.17), GenSys.cc (1.69), GenSys.defs.hh
+	  (1.82), Generator.cc (1.40), Generator.defs.hh (1.78),
+	  Matrix.defs.hh (1.37), Poly_Con_Relation.defs.hh (1.16),
+	  Poly_Gen_Relation.defs.hh (1.15), Polyhedron.cc (1.236),
+	  Polyhedron.defs.hh (1.156), PowerSet.defs.hh (1.18), Row.cc
+	  (1.44), Row.defs.hh (1.56), SatMatrix.cc (1.22),
+	  SatMatrix.defs.hh (1.26), SatRow.cc (1.12), SatRow.defs.hh
+	  (1.21), Status.cc (1.16), Status.defs.hh (1.23), conversion.cc
+	  (1.34), minimize.cc (1.25), simplify.cc (1.19): Started enforcing
+	  STANDARDS rules as far as the doxygen documentation is concerned:
+	  - added a \brief declaration where needed;  - cut detailed
+	  doxygen comments from *.cc files and pasted in *.defs.hh    files
+	  (with the exceptions of conversion, minimize and simplify);  -
+	  started using the conditional section
+	  Include_Implementation_Details;  - avoided using \fn declaration
+	  where it is not needed (it was also	 causing problems since it
+	  does not support line breaks);  - fixed some problems with the
+	  naming of doxygen documentation groups.
+
+2002-10-05 Saturday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/mc91.cc (1.7): Fixed and made quiet.
+
+2002-10-05 Saturday 12:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.23): Fixed a couple of bugs concerning
+	  space dimensions.
+
+2002-10-05 Saturday 10:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.17), PowerSet.inlines.hh (1.22): The
+	  default constructor for PowerSet now takes the dimension of the
+	  enclosing space as an optional parameter, defaulting to zero.
+
+2002-10-05 Saturday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.68), Polyhedron.cc (1.235): Added missing
+	  \relates doxygen declarations.
+
+2002-10-05 Saturday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.33): Added a missing namespace qualification
+	  in the doxygen comment.
+
+2002-10-05 Saturday 10:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.51), ConSys.defs.hh (1.69): According to
+	  STANDARDS, moved doxygen documentation in the header file.  Added
+	  a missing \relates declaration to avoid a doxygen warning.
+
+2002-10-05 Saturday 10:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.22),
+	  devref-print.doxyconf-latex.in (1.22), devref.doxyconf-html.in
+	  (1.23): Added Include_Implementation_Details in the
+	  ENABLED_SECTIONS of the developer reference.
+
+2002-10-05 Saturday 10:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.7): Added specification on how to integrate an
+	  end-user comment block with further comments for the developer
+	  only.
+
+2002-10-04 Friday 23:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.42): Notified new function for manipulation
+	  LinExpression's.
+
+2002-10-04 Friday 23:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: bbrz02widening14.cc (1.2), bbrz02widening15.cc (1.2):
+	  Tests made silent.
+
+2002-10-04 Friday 22:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.98): Cut away previous spurious commit on
+	  the specification of generalized affine image. Added a missing
+	  transposition sign.
+
+2002-10-04 Friday 22:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.63): Typo corrected:
+	  closure-point ==> closure_point.
+
+2002-10-04 Friday 19:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.10): Updated.
+
+2002-10-04 Friday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.41): Report the news for PPL 0.4.2.
+
+2002-10-04 Friday 18:53  Elisa Ricci
+
+	* src/Polyhedron.cc (1.234): Modified the second technique of
+	  Polyhedron::BBRZ02_widening_assign(): we add all the chosen rays
+	  that satisfy the system of constraints `common_con_sys' to the
+	  system of generators of `x'.
+
+2002-10-04 Friday 18:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.126), bbrz02widening14.cc (1.1),
+	  bbrz02widening15.cc (1.1): Added two new tests. The first one is
+	  similar to bbrz02widening13, but this time the limit of the chain
+	  of polyhedra is a bounded polyhedron.  The second one is similar
+	  to the first one, but it is based on a chain of polyhedral cones.
+
+2002-10-04 Friday 18:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.14), LinExpression.defs.hh (1.55):
+	  Added new function   LinExpression& operator*=(LinExpression& e,
+	  const Integer& n); to multiply (in place) a given expression by
+	  an Integer constant.
+
+2002-10-04 Friday 15:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.97), tests/Makefile.am (1.125),
+	  tests/bbrz02widening13.cc (1.1): Added a new test for the bbrz02
+	  widening.
+
+2002-10-04 Friday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[3,7]): Mark
+	  ChangeLog.
+
+2002-10-04 Friday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.6): Updated.
+
+2002-10-04 Friday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.16): Require GCC 3.2 or later, require GMP 4.1 or
+	  later version.
+
+2002-10-04 Friday 10:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (ppl-0_4-branch.1): Require GCC 3.2 or later version.
+
+2002-10-04 Friday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.5): Updated.
+
+2002-10-04 Friday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.4): Version number bumped.
+
+2002-10-04 Friday 09:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.7): Try to release today.
+
+2002-10-03 Thursday 17:58  Elisa Ricci
+
+	* tests/: Makefile.am (1.124), exceptions1.cc (1.20),
+	  exceptions2.cc (1.17), generalizedaffineimage9.cc (1.1): Added
+	  some new tests for Polyhedron::generalized_affine_image(lhs, r,
+	  rhs).
+
+2002-10-03 Thursday 15:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.123), ascii_dump_load1.cc (1.3),
+	  ascii_dump_load2.cc (1.3), files.cc (1.2), files.hh (1.2):
+	  Several improvements.
+
+2002-10-03 Thursday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.122), ascii_dump_load3.cc (1.2), files.cc
+	  (1.1), files.hh (1.1): Avoid spaghetti-coding.
+
+2002-10-03 Thursday 15:01  Elisa Ricci
+
+	* tests/generalizedaffineimage7.cc (1.3): Corrected the test: we
+	  want "return 1" if there is at least a test that exits with
+	  "return 1".
+
+2002-10-03 Thursday 12:23  Elisa Ricci
+
+	* tests/: Makefile.am (1.121), ascii_dump_load2.cc (1.2),
+	  ascii_dump_load3.cc (1.1): Added a new test for
+	  Polyhedron::ascii_dump() and Polyhedron::ascii_load().  Corrected
+	  an error in the comment of ascii_dump_load2.cc.
+
+2002-10-03 Thursday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.233), src/Polyhedron.defs.hh (1.155),
+	  tests/generalizedaffineimage1.cc (1.4),
+	  tests/generalizedaffineimage7.cc (1.2): When the lhs of the
+	  generalized affine image is an arbitrary LinExpression, there is
+	  no need of having a denominator for the rhs.
+
+2002-10-03 Thursday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.96): Added missing transposition signs in
+	  documentation of affine images.  Improved comment of generalized
+	  affine images.
+
+2002-10-03 Thursday 11:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.40): Reported the bug on minimization of
+	  zero-dim-universe NNC polyhedra.
+
+2002-10-03 Thursday 11:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.50): Fixed a couple of comments.
+
+2002-10-03 Thursday 10:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, doc/definitions.dox, src/ConSys.cc, src/Polyhedron.cc,
+	  tests/Makefile.am, tests/minconstraints1.cc,
+	  tests/minconstraints2.cc, tests/minconstraints3.cc,
+	  tests/mingenerators1.cc, tests/mingenerators2.cc,
+	  tests/mingenerators3.cc (ppl-0_4-branch.[6,1,4,7,4,1,1,1,1,1,1]):
+	  Reported on the branch a couple of bugfixes and corresponding
+	  tests.
+
+2002-10-03 Thursday 09:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.95): Corrected the definition of affine
+	  preimage.
+
+2002-10-03 Thursday 04:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.13), config.sub (1.12): Updated.
+
+2002-10-02 Wednesday 17:32  Elisa Ricci
+
+	* tests/: Makefile.am (1.120), ascii_dump_load2.cc (1.1): Added a
+	  new test to verify Polyhedron::ascii_load() and
+	  Polyhedron::ascii_dump().
+
+2002-10-02 Wednesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.232): Fixed a typo in a comment.
+
+2002-10-02 Wednesday 16:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.231): The implementation of
+	  generalized_affine_image(lhs, rel, rhs, denom) now handles some
+	  special cases in a more efficient way.
+
+2002-10-02 Wednesday 16:14  Elisa Ricci
+
+	* src/Polyhedron.cc (1.230): In
+	  Polyhedron::strongly_minimize_constraints() and
+	  Polyhedron::strongly_minimize_generators() corrected the bug
+	  shown by minconstraints3.cc and mingenerators3.cc: now we verify
+	  if the polyhedron is not empty and zero-dimensional.
+
+2002-10-02 Wednesday 16:10  Elisa Ricci
+
+	* tests/: Makefile.am (1.119), minconstraints3.cc (1.1),
+	  mingenerators3.cc (1.1): The test minconstraints3.cc shows a bug
+	  in Polyhedron::strongly_minimize_constraints().  The test
+	  mingenerators3.cc shows a bug in
+	  Polyhedron::strongly_minimize_generators().
+
+2002-10-02 Wednesday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.118): Expect addgenerators11 to fail.
+
+2002-10-02 Wednesday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions1.cc (1.19): Fixed a few comments on tests about
+	  generalized_affine_image.
+
+2002-10-02 Wednesday 14:40  Elisa Ricci
+
+	* tests/generalizedaffineimage8.cc (1.2): Corrected an error in the
+	  comment of the test: the relation is `>' and not `<'.
+
+2002-10-02 Wednesday 14:39  Elisa Ricci
+
+	* tests/: Makefile.am (1.117), generalizedaffineimage8.cc (1.1):
+	  Added a new test for Polyhedron::generalized_affine_image(v, r,
+	  e, d) in the case of non necessarily closed polyhedron and the
+	  relation `>'.
+
+2002-10-02 Wednesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.18), exceptions2.cc (1.16): Adapted to
+	  the new interface of Polyhedron::generalized_affine_image().
+
+2002-10-02 Wednesday 14:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.116), generalizedaffineimage3.cc (1.4),
+	  generalizedaffineimage7.cc (1.1): Added a new test for method
+	  Polyhedron::generalized_affine_image(lhs, relop, rhs, denum)
+	  checking that, when lhs has a single variable, the current
+	  implementation does have the same behavior of
+	  Polyhedron::generalized_affine_image(var, relop, rhs, denum).
+
+2002-10-02 Wednesday 14:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.115): Specify the source for
+	  addgenerators11.
+
+2002-10-02 Wednesday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.114), addgenerators11.cc (1.1): New test
+	  for Polyhedron::add_generators_and_minimize().
+
+2002-10-02 Wednesday 12:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.229), src/Polyhedron.defs.hh (1.154),
+	  src/globals.hh (1.23), tests/generalizedaffineimage1.cc (1.3),
+	  tests/generalizedaffineimage2.cc (1.3),
+	  tests/generalizedaffineimage3.cc (1.3),
+	  tests/generalizedaffineimage4.cc (1.2),
+	  tests/generalizedaffineimage5.cc (1.2),
+	  tests/generalizedaffineimage6.cc (1.2): Added enumeration
+	  Relation_Operator to encode the operator <, <=, ==, >=, >.  Used
+	  the enumeration to specify the relation operator of methods
+	  Polyhedron::generalized_affine_image().  Patched the tests to use
+	  the enumeration instead of string encodings.
+
+2002-10-02 Wednesday 12:05  Elisa Ricci
+
+	* src/ConSys.cc (1.49): Modified
+	  ConSys::adjust_topology_and_dimension() so that if the system of
+	  constraints was sorted, does not contains strict inequalities and
+	  is not necessarily closed and if the new topology is
+	  NECESSARILY_CLOSED, we sort the system again.
+
+2002-10-02 Wednesday 11:20  Elisa Ricci
+
+	* src/ConSys.cc (1.48), tests/Makefile.am (1.113),
+	  tests/addconstraints12.cc (1.1): Corrected an error in
+	  ConSys::adjust_topology_and_dimension: now we erase the
+	  constraints 0 <= \epsilon <= 1 if the system of constraints does
+	  not contains strict inequalities and is not necessarily closed
+	  and the new topology is NECESSARILY_CLOSED.  Added a test to
+	  verify this function.
+
+2002-10-02 Wednesday 10:19  Elisa Ricci
+
+	* tests/topclosed3.cc (1.3): Added the comment to explain what this
+	  test does.
+
+2002-10-02 Wednesday 09:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/topclosed3.cc (1.2): New test made silent.
+
+2002-10-02 Wednesday 09:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.112), topclosed3.cc (1.1): Added a new
+	  test on the topological closure check.  It shows that an
+	  unmatched closure point lying on the same line of a point, after
+	  performing minimization, is converted by back_substitute() into
+	  the corresponding matched closure point: this property is needed
+	  to ensure the correctness of the current implementation.
+
+2002-10-01 Tuesday 21:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.228), tests/Makefile.am (1.111),
+	  tests/generalizedaffineimage6.cc (1.1): Added a first draft
+	  implementation for method
+	  Polyhedron::generalized_affine_image(const LinExpression& lhs,
+					       const char* relation,
+					     const LinExpression& rhs,
+					   const Integer& denominator);
+	  Added a first test to check if it works.
+
+2002-10-01 Tuesday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.94), src/Polyhedron.cc (1.227),
+	  src/Polyhedron.defs.hh (1.153): The specification of the
+	  generalized affine image operator further generalized to allow
+	  for an arbitrary affine expression in the lhs.  Added the
+	  declaration of this generalization (with a void implementation).
+
+2002-10-01 Tuesday 11:56  Elisa Ricci
+
+	* tests/: bbrz02widening6.cc (1.3), bbrz02widening7.cc (1.3):
+	  Modified the polyhedron `known_result' according to the changes
+	  of Polyhedron::BBRZ02_widening_assign().
+
+2002-10-01 Tuesday 11:22  Elisa Ricci
+
+	* src/Polyhedron.cc (1.226), tests/Makefile.am (1.110),
+	  tests/generalizedaffineimage5.cc (1.1): Corrected an error in
+	  Polyhedron::generalized_affine_image().  Added a test to verify
+	  this function.
+
+2002-09-30 Monday 11:32  Elisa Ricci
+
+	* tests/: Makefile.am (1.109), affinepreimage6.cc (1.2),
+	  affinepreimage7.cc (1.1), exceptions1.cc (1.17), exceptions2.cc
+	  (1.15), polyhull7.cc (1.1): Added new tests for some methods of
+	  the class Polyhedron.  Corrected a comment in the test
+	  affinepreimage6.cc.
+
+2002-09-29 Sunday 15:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.47), src/ConSys.defs.hh (1.68), src/GenSys.cc
+	  (1.67), src/GenSys.defs.hh (1.81), src/Matrix.cc (1.44),
+	  src/Matrix.defs.hh (1.36), src/Poly_Con_Relation.cc (1.4),
+	  src/Poly_Con_Relation.defs.hh (1.15), src/Poly_Gen_Relation.cc
+	  (1.4), src/Poly_Gen_Relation.defs.hh (1.14), src/Polyhedron.cc
+	  (1.225), src/Polyhedron.defs.hh (1.152), src/SatMatrix.cc (1.21),
+	  src/SatMatrix.defs.hh (1.25), src/Status.cc (1.15),
+	  src/Status.defs.hh (1.22), tests/ascii_dump_load1.cc (1.2): The
+	  ASCII_dump() and ASCII_load() methods have been renamed
+	  ascii_dump() and ascii_load().
+
+2002-09-29 Sunday 11:16  Elisa Ricci
+
+	* src/Status.cc (1.14), tests/Makefile.am (1.108),
+	  tests/ascii_dump_load1.cc (1.1): Corrected an error in
+	  Status::ASCII_load(std::istream& s).	Added a test to verify
+	  Polyhedron::ASCII_dump(std::ostream& s) and
+	  Polyhedron::ASCII_load(std::istream& s).
+
+2002-09-27 Friday 20:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.39), tests/affineimage5.cc (1.2): Test affineimage5 made
+	  silent.  The bug affecting affine_image() could have produced
+	  wrong results (not just violate a library invariant).
+
+2002-09-27 Friday 20:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, src/ConSys.cc, src/GenSys.cc, src/Polyhedron.cc,
+	  tests/Makefile.am, tests/affineimage4.cc, tests/affineimage5.cc
+	  (ppl-0_4-branch.[5,3,3,6,3,1,1]): The correction of the bug
+	  affecting Polyhedron::affine_image() and
+	  Polyhedron::affine_preimage() reported on ppl-0_4-branch.
+
+2002-09-27 Friday 15:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.93), src/Polyhedron.defs.hh (1.151): Fixed
+	  documentation reference for the generalized_affine_image
+	  operator.
+
+2002-09-27 Friday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.224): Methods Polyhedron::affine_image() and
+	  Polyhedron::affine_preimage() now only call
+	  ConSys::affine_preimage() and GenSys::affine_image() with a
+	  strictly positive denominator.  Added draft implementation of
+	  generalized_affine_image() for the case of a strict relation
+	  operator (only for NNC polyhedra).
+
+2002-09-27 Friday 15:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.46), GenSys.cc (1.66): Private methods
+	  ConSys::affine_preimage() and GenSys::affine_image() now assume
+	  that the third argument is a _positive_ Integer.
+
+2002-09-27 Friday 15:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.107), affineimage5.cc (1.1),
+	  generalizedaffineimage1.cc (1.2), generalizedaffineimage2.cc
+	  (1.2), generalizedaffineimage3.cc (1.2),
+	  generalizedaffineimage4.cc (1.1): Added new tests and adjusted
+	  the known_results of generalizedaffineimage* to match the
+	  specification.
+
+2002-09-27 Friday 09:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.92), src/Polyhedron.cc (1.223),
+	  src/Polyhedron.defs.hh (1.150): Method generalized_affine_image()
+	  reimplemented to match its specification.  The doxygen
+	  specification improved.
+
+2002-09-27 Friday 09:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.38): Reported the bugfix for Polyhedron::affine_image().
+
+2002-09-27 Friday 09:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.65): Corrected a bug in GenSys::affine_image()
+	  whereby we were creating points having a negative divisor when
+	  the denominator of the affine transformation was negative.
+
+2002-09-27 Friday 09:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.106), affineimage4.cc (1.1): New test
+	  showing a bug in Polyhedron::affine_image() when the divisor is
+	  negative.
+
+2002-09-26 Thursday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.222): The draft implementation of
+	  Polyhedron::generalized_affine_image() extended to work with NNC
+	  polyhedra.
+
+2002-09-26 Thursday 13:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.105), generalizedaffineimage3.cc (1.1):
+	  Added a test for generalized_affine_image where the points of the
+	  polyhedron have non-integral coordinates.
+
+2002-09-26 Thursday 12:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.104), generalizedaffineimage1.cc (1.1),
+	  generalizedaffineimage2.cc (1.1): Added a couple of tests for the
+	  new generalized_affine_image operator.
+
+2002-09-26 Thursday 12:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.91): Added draft specification of the
+	  generalized affine image operator.
+
+2002-09-26 Thursday 12:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.221), Polyhedron.defs.hh (1.149): Added a
+	  first draft implementation of the generalized_affine_image
+	  operator.  Current implementation should work correctly for
+	  C_Polyhedron.
+
+2002-09-26 Thursday 12:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.54), LinExpression.inlines.hh
+	  (1.24): Added methods to provide read-only access to the
+	  coefficients and the inhomogeneous term of a LinExpression.
+
+2002-09-25 Wednesday 18:25  Elisa Ricci
+
+	* src/Polyhedron.cc (1.220), tests/Makefile.am (1.103),
+	  tests/bbrz02widening12.cc (1.1): Corrected an improved the third
+	  technique of Polyhedron::BBRZ02_widening_assign().  Added a test
+	  to verify this technique.
+
+2002-09-25 Wednesday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.90): Greatly improved the matrix in the
+	  explanation of affine images and preimages.
+
+2002-09-25 Wednesday 14:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.37): Removed a few repetitions in the list of bugfixes.
+
+2002-09-25 Wednesday 10:12  Elisa Ricci
+
+	* src/: Integer.defs.hh (1.9), Integer.inlines.hh (1.8),
+	  Polyhedron.cc (1.219): Added the functions void
+	  sqrt_assign(Integer& x) and void sqrt_assign(Integer& x, const
+	  Integer& y) in Integer to compute he truncated integer part of
+	  the root of an Integer.  Used the function sqrt_assign(Integer&)
+	  in the first technique of BBRZ02_widening_assign().
+
+2002-09-24 Tuesday 19:05  Elisa Ricci
+
+	* src/: Integer.defs.hh (1.8), Integer.inlines.hh (1.7),
+	  Polyhedron.cc (1.218): Added the functions lcm_assign(Integer& x,
+	  const Integer& y) and lcm_assign(Integer& x, const Integer& y,
+	  const Integer& z) in Integer.  Modified the function
+	  Polyhedron::BBRZ02_widening_assing() so that in the first
+	  technique we choose the constraints to add in the right system
+	  and we normalize the vectors using a bad approximation of the
+	  norm; corrected also an error in the third technique in the case
+	  of rays with negative coefficients.
+
+2002-09-24 Tuesday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS, src/GenSys.cc, src/Polyhedron.cc (ppl-0_4-branch.[4,2,5]):
+	  Reported to the ppl-0_4-branch the corrections to a couple of
+	  bugs affecting methods GenSys::insert(const Generator& ) and
+	  Polyhedron::add_generator(const Generator& ).
+
+2002-09-24 Tuesday 10:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc, tests/Makefile.am, tests/relations14.cc
+	  (ppl-0_4-branch.[2,2,1]): Added the test showing a bug when
+	  invoking method   Polyhedron::relation_with(const Generator& ).
+	  Implemented the correction in method
+	  ConSys::satisfies_all_constraints(const Generator& ).
+
+2002-09-23 Monday 17:15  Elisa Ricci
+
+	* tests/: Makefile.am (1.102), relations11.cc (1.2), relations15.cc
+	  (1.1), relations16.cc (1.1): Added two tests for the methods of
+	  the class GenSys and corrected an error in the comment of the
+	  test relations11.cc.
+
+2002-09-23 Monday 12:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.36), src/ConSys.cc (1.45): Corrected a bug in
+	  ConSys::satisfies_all_constraints(const Generator& ) which was
+	  affecting the public method	Polyhedron::relation_with(const
+	  Generator& ).  The bug reported on the NEWS file.
+
+2002-09-23 Monday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.101), relations13.cc (1.1), relations14.cc
+	  (1.1): A couple of new tests. relations14 shows a bug in the
+	  implementation of ConSys::satisfies_all_constraints(const
+	  Generator& g) const.
+
+2002-09-20 Friday 11:54  Elisa Ricci
+
+	* tests/: Makefile.am (1.100), addconstraints11.cc (1.8),
+	  affinepreimage6.cc (1.1), relations10.cc (1.2), relations12.cc
+	  (1.1): Added other tests for some methods of the classes ConSys
+	  and GenSys.  Corrected the comment of the test in relations10.cc.
+
+2002-09-19 Thursday 17:16  Elisa Ricci
+
+	* tests/: Makefile.am (1.99), affineimage3.cc (1.1),
+	  affinepreimage5.cc (1.1), relations10.cc (1.1), relations11.cc
+	  (1.1): Added some tests for the methods of the classes
+	  Polyhedron, ConSys and GenSys.
+
+2002-09-18 Wednesday 11:54  Elisa Ricci
+
+	* tests/: Makefile.am (1.98), adddimensions11.cc (1.1),
+	  exceptions2.cc (1.14): Added two other tests to verify the
+	  methods of the class Polyhedron.
+
+2002-09-18 Wednesday 10:27  Elisa Ricci
+
+	* src/Polyhedron.cc (1.217): Made some little improvements to the
+	  function Polyhedron::BBRZ02_widenin_assign().  Improved also some
+	  comments of this function.
+
+2002-09-17 Tuesday 18:44  Elisa Ricci
+
+	* tests/: Makefile.am (1.97), contains1.cc (1.1), exceptions2.cc
+	  (1.13), h79widening5.cc (1.2), minconstraints2.cc (1.2): Improved
+	  some tests and added other tests to verify some methods of
+	  Polyhedron.cc and C_Polyhedron.cc.
+
+2002-09-17 Tuesday 11:29  Elisa Ricci
+
+	* tests/: Makefile.am (1.96), addconstraints10.cc (1.7),
+	  bbrz02widening10.cc (1.1), bbrz02widening11.cc (1.1),
+	  h79widening5.cc (1.1), minconstraints2.cc (1.1),
+	  mingenerators2.cc (1.1), timeelapse7.cc (1.1), topclosure2.cc
+	  (1.1): Added other tests to verify some methods of Polyhedron.cc.
+
+2002-09-12 Thursday 18:17  Elisa Ricci
+
+	* tests/: Makefile.am (1.95), timeelapse6.cc (1.1): Added a new
+	  test for the function Polyhedron::time_elapse_assign().
+
+2002-09-12 Thursday 16:30  Elisa Ricci
+
+	* src/Polyhedron.cc (1.216): Corrected an error in
+	  Polyhedron::BBRZ02_widening_assign(): the new generator was added
+	  to the polyhedron x instead of the polyhedron x2.
+
+2002-09-12 Thursday 11:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.51): Try to fix a long-standing problem in the
+	  generation of ppl_install.hh.
+
+2002-09-11 Wednesday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, STANDARDS, acinclude.m4, config.h.in, configure.ac,
+	  doc/definitions.dox, interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h,
+	  interfaces/Prolog/Makefile.am,
+	  interfaces/Prolog/Prolog_interface.dox,
+	  interfaces/Prolog/clpq.pl, interfaces/Prolog/clpq2.pl,
+	  interfaces/Prolog/pl_check.pl, interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/track_allocation.hh,
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.cc, m4/Makefile.am,
+	  m4/ac_cxx_flexible_arrays.m4, src/AskTell.defs.hh,
+	  src/AskTell.inlines.hh, src/BoundingBox.cc,
+	  src/BoundingBox.defs.hh, src/BoundingBox.inlines.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/ConSys.cc, src/ConSys.defs.hh, src/ConSys.inlines.hh,
+	  src/Constraint.cc, src/Constraint.defs.hh,
+	  src/Constraint.inlines.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/GenSys.cc, src/GenSys.defs.hh,
+	  src/GenSys.inlines.hh, src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Init.cc, src/Init.defs.hh,
+	  src/Init.inlines.hh, src/Interval.defs.hh, src/LCompare.defs.hh,
+	  src/LinExpression.cc, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/Makefile.am, src/Matrix.cc,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/Poly_Con_Relation.cc, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Gen_Relation.cc, src/Poly_Gen_Relation.defs.hh,
+	  src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/Row.cc, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/SatMatrix.cc, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/SatRow.defs.hh,
+	  src/SatRow.inlines.hh, src/Status.cc, src/Status.defs.hh,
+	  src/Variable.cc, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/conversion.cc, src/globals.cc, src/globals.hh,
+	  src/initializer.hh, src/minimize.cc, src/ppl_header.middle,
+	  src/simplify.cc, tests/CbecomesNNC1.cc, tests/Makefile.am,
+	  tests/addconstraint1.cc, tests/addconstraints2.cc,
+	  tests/addconstraints4.cc, tests/addconstraints5.cc,
+	  tests/addconstraints6.cc, tests/addconstraints7.cc,
+	  tests/addconstraints8.cc, tests/addconstraints9.cc,
+	  tests/adddimensions1.cc, tests/adddimensions10.cc,
+	  tests/adddimensions2.cc, tests/adddimensions3.cc,
+	  tests/adddimensions4.cc, tests/adddimensions5.cc,
+	  tests/adddimensions6.cc, tests/adddimensions7.cc,
+	  tests/adddimensions8.cc, tests/adddimensions9.cc,
+	  tests/addgenerator1.cc, tests/addgenerator2.cc,
+	  tests/addgenerators10.cc, tests/addgenerators3.cc,
+	  tests/addgenerators4.cc, tests/addgenerators5.cc,
+	  tests/addgenerators6.cc, tests/addgenerators7.cc,
+	  tests/addgenerators9.cc, tests/affineimage1.cc,
+	  tests/affineimage2.cc, tests/affinepreimage1.cc,
+	  tests/affinepreimage2.cc, tests/affinepreimage3.cc,
+	  tests/affinepreimage4.cc, tests/append1.cc, tests/append2.cc,
+	  tests/bbrz02widening1.cc, tests/bbrz02widening2.cc,
+	  tests/bbrz02widening3.cc, tests/bbrz02widening4.cc,
+	  tests/bbrz02widening5.cc, tests/bbrz02widening6.cc,
+	  tests/bbrz02widening7.cc, tests/bbrz02widening8.cc,
+	  tests/bbrz02widening9.cc, tests/bounded1.cc,
+	  tests/boundingbox1.cc, tests/boundingbox2.cc, tests/bounds1.cc,
+	  tests/bounds2.cc, tests/concatenate2.cc, tests/concatenate3.cc,
+	  tests/concatenate4.cc, tests/constraints1.cc,
+	  tests/constraints2.cc, tests/constraints3.cc, tests/empty1.cc,
+	  tests/exceptions1.cc, tests/exceptions2.cc, tests/generators3.cc,
+	  tests/generators4.cc, tests/generators5.cc,
+	  tests/h79widening4.cc, tests/inclusion2.cc,
+	  tests/intersection2.cc, tests/intersection3.cc,
+	  tests/intersection4.cc, tests/intersection5.cc,
+	  tests/intersection6.cc, tests/intersection8.cc,
+	  tests/intersection9.cc, tests/limitedh79widening1.cc,
+	  tests/limitedh79widening2.cc, tests/limitedh79widening3.cc,
+	  tests/memory1.cc, tests/minconstraints1.cc,
+	  tests/mingenerators1.cc, tests/permute.cc,
+	  tests/polydifference1.cc, tests/polydifference2.cc,
+	  tests/polydifference3.cc, tests/polydifference4.cc,
+	  tests/polydifference5.cc, tests/polydifference6.cc,
+	  tests/polyhull1.cc, tests/polyhull2.cc, tests/polyhull3.cc,
+	  tests/polyhull5.cc, tests/polyhull6.cc, tests/relations1.cc,
+	  tests/relations2.cc, tests/relations3.cc, tests/relations4.cc,
+	  tests/relations5.cc, tests/relations6.cc, tests/relations7.cc,
+	  tests/relations8.cc, tests/relations9.cc, tests/removedim4.cc,
+	  tests/removedim5.cc, tests/removedim6.cc, tests/removedim7.cc,
+	  tests/removedim8.cc, tests/removedim9.cc, tests/timeelapse1.cc,
+	  tests/timeelapse2.cc, tests/timeelapse3.cc, tests/timeelapse4.cc,
+	  tests/timeelapse5.cc, tests/topclosed1.cc, tests/topclosed2.cc,
+	  tests/topclosure1.cc, tests/universe1.cc, tests/universe2.cc,
+	  tests/universe3.cc, tests/universe4.cc, tests/universe5.cc,
+	  tests/universe6.cc, tests/watchdog1.cc
+	  (alt_nnc.[3,1,1,2,2,1,3,3,1,1,1,1,1,2,2,1,1,1,2,2,1,2,2,2,2,5,4,3,4,4,3,4,4,7,4,2,5,5,3,1,2,2,2,2,1,2,2,1,1,2,2,2,2,1,2,1,2,16,5,5,3,3,1,2,2,1,2,2,2,2,1,2,1,2,2,1,1,2,2,2,1,1,1,2,1,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,3,1,1,2,2,1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,2,2,1,2,1,1,2,2,2,1,1,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,2,2,2,2,2,1,1,1,2,2,2,2,2,2,2]):
+	  Merged changes in main trunk between tags
+	  "second_merge_to_alt_nnc" and "third_merge_to_alt_nnc".
+
+2002-09-11 Wednesday 19:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.63): Fixed a bug whereby the configuration
+	  options --enable-assertions and --enable-more-assertions were not
+	  working properly.
+
+2002-09-11 Wednesday 14:51  Elisa Ricci
+
+	* tests/bbrz02widening9.cc (1.2): Corrected this test: to built the
+	  increasing chain q_i we must do the widening between q_i_minus_1
+	  and the poly_hull of q_i_minus_1 and p_i (and not the widening
+	  between p_i and the poly_hull of q_i_minus_1 and p_i).
+
+2002-09-11 Wednesday 12:55  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.215), Polyhedron.defs.hh (1.148): Added
+	  the function static bool is_BBRZ02_stabilizing(const Polyhedron&
+	  x, const Polyhedron& y).  Used this new function in
+	  Polyhedron::BBRZ02_widening_assign().
+
+2002-09-10 Tuesday 23:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.214): A couple of comments adjusted in
+	  add_generator() and bbrz_widening_assign().
+
+2002-09-10 Tuesday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.35), doc/definitions.dox (1.89),
+	  interfaces/Prolog/Makefile.am (1.20),
+	  interfaces/Prolog/Prolog_interface.dox (1.62),
+	  interfaces/Prolog/clpq.pl (1.13), interfaces/Prolog/clpq2.pl
+	  (1.23), interfaces/Prolog/pl_check.pl (1.23),
+	  interfaces/Prolog/ppl_prolog.icc (1.65),
+	  interfaces/Prolog/track_allocation.hh (1.10),
+	  src/AskTell.inlines.hh (1.9), src/C_Polyhedron.defs.hh (1.17),
+	  src/ConSys.defs.hh (1.67), src/Constraint.cc (1.32),
+	  src/Constraint.defs.hh (1.71), src/conversion.cc (1.32),
+	  tests/addconstraints2.cc (1.16), tests/adddimensions10.cc (1.4),
+	  tests/adddimensions5.cc (1.5), tests/adddimensions6.cc (1.5),
+	  tests/adddimensions7.cc (1.5), tests/adddimensions8.cc (1.3),
+	  tests/adddimensions9.cc (1.3), tests/addgenerator1.cc (1.2),
+	  tests/addgenerator2.cc (1.2), tests/addgenerators7.cc (1.6),
+	  tests/addgenerators9.cc (1.3), tests/bbrz02widening1.cc (1.2),
+	  tests/bbrz02widening2.cc (1.2), tests/bbrz02widening3.cc (1.2),
+	  tests/bbrz02widening6.cc (1.2), tests/bbrz02widening7.cc (1.2),
+	  tests/bbrz02widening8.cc (1.2), tests/bounded1.cc (1.7),
+	  tests/boundingbox1.cc (1.21), tests/boundingbox2.cc (1.11),
+	  tests/bounds1.cc (1.3), tests/concatenate4.cc (1.3),
+	  tests/constraints1.cc (1.3), tests/constraints2.cc (1.3),
+	  tests/constraints3.cc (1.3): Lots of trailing blanks removed.
+
+2002-09-10 Tuesday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/topclosed1.cc (1.2): Indentation improvements.
+
+2002-09-10 Tuesday 18:05  Elisa Ricci
+
+	* src/Polyhedron.cc (1.213): Simplify the function
+	  `Polyhedron::add_generator(g)' in the case of a necessarily
+	  closed empty polyhedron and of a non-necessarily closed
+	  generator.
+
+2002-09-10 Tuesday 18:00  Elisa Ricci
+
+	* tests/: Makefile.am (1.94), topclosed1.cc (1.1), topclosed2.cc
+	  (1.1): Added two tests for the method
+	  `Polyhedron::is_topologically_closed()'.
+
+2002-09-10 Tuesday 17:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.15): The correction of the bug on
+	  Polyhedron::operator<=() reported on the alt_nnc branch.
+
+2002-09-10 Tuesday 16:46  Elisa Ricci
+
+	* tests/: Makefile.am (1.93), addgenerator1.cc (1.1),
+	  addgenerator2.cc (1.1), addgenerators10.cc (1.1), exceptions1.cc
+	  (1.16), exceptions2.cc (1.12), h79widening4.cc (1.1): Added some
+	  other tests to verify the functions of Polyhedron.cc.
+
+2002-09-10 Tuesday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (ppl-0_4-branch.4):
+	  Parma_Polyhedra_Library::dimension_type is undefined in PPL
+	  0.4.x.
+
+2002-09-10 Tuesday 14:48  Elisa Ricci
+
+	* tests/: bounds2.cc (1.3), polydifference5.cc (1.3),
+	  polydifference6.cc (1.2), polyhull5.cc (1.2), polyhull6.cc (1.2),
+	  removedim8.cc (1.2), removedim9.cc (1.2), topclosure1.cc (1.2):
+	  Added some explanations of what these tests do and improved the
+	  `return' of the test bounds2.
+
+2002-09-10 Tuesday 13:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (ppl-0_4-branch.3), NEWS (1.34): The correction
+	  of the bug affecting Polyhedron::operator<=() reported on the
+	  ppl_0_4-branch. Bug correction notified in the NEWS.
+
+2002-09-10 Tuesday 12:33  Elisa Ricci
+
+	* tests/: CbecomesNNC1.cc (1.2), Makefile.am (1.92),
+	  addconstraint1.cc (1.2), addconstraints2.cc (1.15),
+	  adddimensions10.cc (1.3), adddimensions8.cc (1.2),
+	  adddimensions9.cc (1.2), addgenerators9.cc (1.2), bounds1.cc
+	  (1.2), bounds2.cc (1.2), concatenate4.cc (1.2), constraints1.cc
+	  (1.2), constraints2.cc (1.2), constraints3.cc (1.2),
+	  generators3.cc (1.2), generators4.cc (1.2), generators5.cc (1.2),
+	  intersection8.cc (1.2), intersection9.cc (1.2),
+	  minconstraints1.cc (1.2), mingenerators1.cc (1.2),
+	  polydifference4.cc (1.2), polydifference5.cc (1.2): Improved some
+	  tests.
+
+2002-09-10 Tuesday 12:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/adddimensions10.cc (1.2): The old `known_result' was wrong.
+	  This was masking the bug in Polyhedron::operator<=().
+
+2002-09-10 Tuesday 12:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.212): Correcting the bug in operator<=()
+	  pointed out by test inclusion2.cc.
+
+2002-09-10 Tuesday 11:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.91), inclusion2.cc (1.1): New test showing
+	  a bug in Polyhedron::operator<=().
+
+2002-09-09 Monday 18:00  Elisa Ricci
+
+	* tests/: CbecomesNNC1.cc (1.1), Makefile.am (1.90),
+	  addconstraint1.cc (1.1), addconstraints2.cc (1.14),
+	  adddimensions10.cc (1.1), adddimensions8.cc (1.1),
+	  adddimensions9.cc (1.1), addgenerators9.cc (1.1), bounds1.cc
+	  (1.1), bounds2.cc (1.1), concatenate4.cc (1.1), constraints1.cc
+	  (1.1), constraints2.cc (1.1), constraints3.cc (1.1),
+	  exceptions1.cc (1.15), exceptions2.cc (1.11), generators3.cc
+	  (1.1), generators4.cc (1.1), generators5.cc (1.1),
+	  intersection8.cc (1.1), intersection9.cc (1.1),
+	  minconstraints1.cc (1.1), mingenerators1.cc (1.1),
+	  polydifference3.cc (1.1), polydifference4.cc (1.1),
+	  polydifference5.cc (1.1), polydifference6.cc (1.1), polyhull5.cc
+	  (1.1), polyhull6.cc (1.1), removedim8.cc (1.1), removedim9.cc
+	  (1.1), topclosure1.cc (1.1): Added tests to verify some methods
+	  of Polyhedron.cc and NNC_Polyhedron.cc.
+
+2002-09-09 Monday 17:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.211), src/Polyhedron.defs.hh (1.147),
+	  tests/Makefile.am (1.89), tests/bbrz02widening1.cc (1.1),
+	  tests/bbrz02widening2.cc (1.1), tests/bbrz02widening3.cc (1.1),
+	  tests/bbrz02widening4.cc (1.1), tests/bbrz02widening5.cc (1.1),
+	  tests/bbrz02widening6.cc (1.1), tests/bbrz02widening7.cc (1.1),
+	  tests/bbrz02widening8.cc (1.1), tests/bbrz02widening9.cc (1.1):
+	  Initial implementation of the new widening.
+
+2002-09-04 Wednesday 20:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.43), Row.inlines.hh (1.33): Changes to support
+	  C++ compilers not providing flexible arrays.
+
+2002-09-04 Wednesday 12:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.210): Method OK() adjusted to behave
+	  correctly on an empty polyhedron having a single trivially false
+	  constraint.
+
+2002-09-03 Tuesday 20:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* acinclude.m4 (1.3), config.h.in (1.18), configure.ac (1.62),
+	  m4/Makefile.am (1.7), m4/ac_cxx_flexible_arrays.m4 (1.1),
+	  src/Row.defs.hh (1.55), src/Row.inlines.hh (1.32): Initial
+	  support for compilers not providing flexible arrays.	(Flexible
+	  arrays are standard in C99 but not in the current C++ standard.)
+
+2002-09-03 Tuesday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.17), configure.ac (1.61): New configuration option
+	  --enable-more-assertions: for the time being it enables more
+	  complete debugging of the class Row by defining EXTRA_ROW_DEBUG.
+
+2002-09-03 Tuesday 18:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.3): Computing also the constraints
+	  for the dual of hypercubes.
+
+2002-09-02 Monday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.16), configure.ac (1.60), src/ppl_header.middle
+	  (1.2): Some portability enhancements.
+
+2002-09-02 Monday 22:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.16): Friend declaration fixed.
+
+2002-09-02 Monday 22:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LCompare.defs.hh (1.4): Use public inheritance.
+
+2002-09-02 Monday 17:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.33), interfaces/C/ppl_c.cc (1.46), interfaces/C/ppl_c.h
+	  (1.46), src/initializer.hh (1.4): Identifiers containing a double
+	  underscore ("__") are reserved: we no longer use them.
+
+2002-09-02 Monday 16:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.77), LinExpression.defs.hh (1.53):
+	  Illegal friend function declarations removed and substituted with
+	  (still unsatisfactory) friend class declarations.
+
+2002-09-02 Monday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.inlines.hh (1.31): Fixed typo in comment.
+
+2002-09-01 Sunday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog_sd.cc (1.9): Encode addresses
+	  with terms of the form `$address'(High, Low) instead of
+	  [High|Low].
+
+2002-09-01 Sunday 15:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.6), interfaces/C/ppl_c.cc (1.45),
+	  interfaces/C/ppl_c.h (1.45), interfaces/Prolog/ppl_prolog.icc
+	  (1.64), interfaces/Prolog/track_allocation.hh (1.9),
+	  src/AskTell.defs.hh (1.8), src/BoundingBox.defs.hh (1.6),
+	  src/C_Polyhedron.inlines.hh (1.12), src/ConSys.defs.hh (1.66),
+	  src/ConSys.inlines.hh (1.26), src/Constraint.defs.hh (1.70),
+	  src/Determinate.defs.hh (1.15), src/Determinate.inlines.hh
+	  (1.17), src/GenSys.defs.hh (1.80), src/GenSys.inlines.hh (1.28),
+	  src/Generator.cc (1.39), src/Generator.defs.hh (1.76),
+	  src/Interval.defs.hh (1.8), src/Matrix.cc (1.43),
+	  src/Matrix.defs.hh (1.35), src/NNC_Polyhedron.inlines.hh (1.14),
+	  src/Poly_Con_Relation.defs.hh (1.14),
+	  src/Poly_Gen_Relation.defs.hh (1.13), src/Polyhedron.cc (1.209),
+	  src/Polyhedron.defs.hh (1.146), src/SatMatrix.cc (1.20),
+	  src/conversion.cc (1.31), src/minimize.cc (1.24), src/simplify.cc
+	  (1.18), tests/append1.cc (1.15), tests/append2.cc (1.16),
+	  tests/empty1.cc (1.10), tests/exceptions1.cc (1.14),
+	  tests/permute.cc (1.22): Avoid source lines longer than 78
+	  characters.
+
+2002-09-01 Sunday 15:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatRow.cc (1.11), SatRow.defs.hh (1.20), SatRow.inlines.hh
+	  (1.20): Use the right integral types.  Avoid source lines longer
+	  than 78 characters.
+
+2002-09-01 Sunday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.44), GenSys.cc (1.64), Generator.defs.hh
+	  (1.75), LinExpression.defs.hh (1.52): Minor formatting changes.
+
+2002-09-01 Sunday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.46): Make sure inlines are defined
+	  before they are used.
+
+2002-09-01 Sunday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.32), configure.ac (1.59), interfaces/C/ppl_c.cc (1.44),
+	  interfaces/C/ppl_c.h (1.44), interfaces/Prolog/ppl_prolog.icc
+	  (1.63), interfaces/Prolog/track_allocation.hh (1.8),
+	  src/BoundingBox.cc (1.3), src/BoundingBox.defs.hh (1.5),
+	  src/BoundingBox.inlines.hh (1.6), src/C_Polyhedron.defs.hh
+	  (1.16), src/C_Polyhedron.inlines.hh (1.11), src/ConSys.cc (1.43),
+	  src/ConSys.defs.hh (1.65), src/ConSys.inlines.hh (1.25),
+	  src/Constraint.cc (1.31), src/Constraint.defs.hh (1.69),
+	  src/Constraint.inlines.hh (1.41), src/Determinate.defs.hh (1.14),
+	  src/Determinate.inlines.hh (1.16), src/GenSys.cc (1.63),
+	  src/GenSys.defs.hh (1.79), src/GenSys.inlines.hh (1.27),
+	  src/Generator.cc (1.38), src/Generator.defs.hh (1.74),
+	  src/Generator.inlines.hh (1.38), src/Init.cc (1.2),
+	  src/Init.defs.hh (1.6), src/LinExpression.cc (1.13),
+	  src/LinExpression.defs.hh (1.51), src/LinExpression.inlines.hh
+	  (1.23), src/Makefile.am (1.50), src/Matrix.cc (1.42),
+	  src/Matrix.defs.hh (1.34), src/Matrix.inlines.hh (1.27),
+	  src/NNC_Polyhedron.defs.hh (1.19), src/NNC_Polyhedron.inlines.hh
+	  (1.13), src/Polyhedron.cc (1.208), src/Polyhedron.defs.hh
+	  (1.145), src/Polyhedron.inlines.hh (1.45), src/PowerSet.defs.hh
+	  (1.16), src/PowerSet.inlines.hh (1.21), src/Row.cc (1.42),
+	  src/Row.defs.hh (1.54), src/Row.inlines.hh (1.30),
+	  src/SatMatrix.cc (1.19), src/SatMatrix.defs.hh (1.24),
+	  src/SatMatrix.inlines.hh (1.16), src/SatRow.cc (1.10),
+	  src/SatRow.defs.hh (1.19), src/SatRow.inlines.hh (1.19),
+	  src/Variable.cc (1.8), src/Variable.defs.hh (1.24),
+	  src/Variable.inlines.hh (1.13), src/conversion.cc (1.30),
+	  src/globals.cc (1.9), src/globals.hh (1.22), src/minimize.cc
+	  (1.23), src/simplify.cc (1.17), tests/append1.cc (1.14),
+	  tests/append2.cc (1.15), tests/boundingbox1.cc (1.20),
+	  tests/intersection2.cc (1.4), tests/memory1.cc (1.8),
+	  tests/permute.cc (1.21), tests/watchdog1.cc (1.11): No longer
+	  abuse `size_t'.  The new type `dimension_type' is an unsigned
+	  integral type for representing space dimensions.  The new
+	  function dimension_type max_space_dimension() returns the maximum
+	  space dimension this library can handle.
+
+2002-08-22 Thursday 15:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.61), pl_check.pl
+	  (1.22): Updated for concatenate_assign.
+
+2002-08-22 Thursday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.20): PowerSet<CS>::add_constraint()
+	  and PowerSet<CS>::add_constraints() fixed.
+
+2002-08-22 Thursday 01:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.2): Some more tests.
+
+2002-08-20 Tuesday 17:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.19): Several corrections.
+
+2002-08-19 Monday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.144): Avoid unnecessary qualification.
+
+2002-08-19 Monday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.42), ConSys.defs.hh (1.64), GenSys.cc (1.62),
+	  GenSys.defs.hh (1.78), Matrix.cc (1.41), Matrix.defs.hh (1.33),
+	  Poly_Con_Relation.cc (1.3), Poly_Con_Relation.defs.hh (1.13),
+	  Poly_Gen_Relation.cc (1.3), Poly_Gen_Relation.defs.hh (1.12),
+	  Polyhedron.cc (1.207), SatMatrix.cc (1.18), SatMatrix.defs.hh
+	  (1.23), Status.cc (1.13): Rewriting of all input/output functions
+	  and operators completed.
+
+2002-08-19 Monday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.206), Status.cc (1.12), Status.defs.hh
+	  (1.21): The input and output operators on Status have been
+	  replaced by methods void ASCII_dump(std::ostream&) const and bool
+	  ASCII_load(std::istream&).
+
+2002-08-19 Monday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.143): Comment corrected.
+
+2002-08-19 Monday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.205), Polyhedron.defs.hh (1.142): The
+	  historical operators operator<<(std::ostream&, const Polyhedron&)
+	  and oprator>>(std::istream&, Polyhedron&) have been replaced by
+	  (internal) methods Polyhedron::ASCII_dump(std::ostream& s) and
+	  ASCII_load(std::istream& s).	New version of
+	  operator<<(std::ostream& s, const Polyhedron& ph): writes a
+	  textual representation of \p ph on \p s: "false" is written if
+	  `ph' is an empty polyhedron; "true" is written if `ph' is a
+	  universe polyhedron; a minimized system of constraints defining
+	  `ph' is written otherwise, all constraints in one row separated
+	  by ", ".
+
+2002-08-19 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.inlines.hh (1.5), Makefile.am (1.49), Variable.cc
+	  (1.7), Variable.defs.hh (1.23), Variable.inlines.hh (1.12): Allow
+	  the user to change the output function for Variable objects by
+	  calling Variable::set_output_function().  Allow the user to
+	  obtain a pointer to the current output function by calling
+	  Variable::get_output_function().
+
+2002-08-19 Monday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.21): Obey the indentation rules.
+
+2002-08-18 Sunday 22:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.88): We know nnc_limitedh79widening3 should
+	  fail (for the time being).
+
+2002-08-18 Sunday 22:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints4.cc (1.8), addconstraints5.cc (1.9),
+	  addconstraints6.cc (1.10), addconstraints7.cc (1.9),
+	  addconstraints8.cc (1.9), addconstraints9.cc (1.10),
+	  adddimensions1.cc (1.11), adddimensions2.cc (1.7),
+	  adddimensions3.cc (1.9), adddimensions4.cc (1.7),
+	  adddimensions5.cc (1.4), adddimensions6.cc (1.4),
+	  adddimensions7.cc (1.4), addgenerators3.cc (1.9),
+	  addgenerators4.cc (1.9), addgenerators5.cc (1.9),
+	  addgenerators6.cc (1.9), addgenerators7.cc (1.5), affineimage1.cc
+	  (1.9), affineimage2.cc (1.8), affinepreimage1.cc (1.8),
+	  affinepreimage2.cc (1.8), affinepreimage3.cc (1.8),
+	  affinepreimage4.cc (1.9), bounded1.cc (1.6), boundingbox1.cc
+	  (1.19), boundingbox2.cc (1.10), concatenate2.cc (1.4),
+	  concatenate3.cc (1.4), intersection3.cc (1.4), intersection4.cc
+	  (1.4), intersection5.cc (1.4), intersection6.cc (1.4),
+	  limitedh79widening1.cc (1.4), limitedh79widening2.cc (1.4),
+	  limitedh79widening3.cc (1.2), polydifference1.cc (1.4),
+	  polydifference2.cc (1.6), polyhull1.cc (1.4), polyhull2.cc (1.4),
+	  polyhull3.cc (1.4), relations1.cc (1.6), relations2.cc (1.7),
+	  relations3.cc (1.7), relations4.cc (1.7), relations5.cc (1.7),
+	  relations6.cc (1.6), relations7.cc (1.6), relations8.cc (1.6),
+	  relations9.cc (1.7), removedim4.cc (1.9), removedim5.cc (1.7),
+	  removedim6.cc (1.9), removedim7.cc (1.4), timeelapse1.cc (1.5),
+	  timeelapse2.cc (1.5), timeelapse3.cc (1.5), timeelapse4.cc (1.5),
+	  timeelapse5.cc (1.5), universe1.cc (1.6), universe2.cc (1.7),
+	  universe3.cc (1.7), universe4.cc (1.7), universe5.cc (1.8),
+	  universe6.cc (1.5): Comments corrected.
+
+2002-08-18 Sunday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.14): Adjusted new constructors to
+	  produce the new epsilon representations.
+
+2002-08-18 Sunday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.87), limitedh79widening3.cc (1.1): New
+	  test showing an incongruence in the behavior of the limited
+	  widening operations in C and NNC polyhedra, respectively.
+
+2002-08-17 Saturday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.41): Properly terminate messages.
+
+2002-08-17 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.15), PowerSet.inlines.hh (1.18): Define
+	  `reverse_iterator' and `const_reverse_iterator'.  New methods
+	  rbegin() and rend().	New method definitely_contains(const CS&).
+	  First prototype of method limited_H79_widening_assign(const
+	  PowerSet&, ConSys&).
+
+2002-08-17 Saturday 18:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.13), Determinate.inlines.hh (1.15):
+	  New method is_definitely_equivalent_to(const Determinate&).
+
+2002-08-17 Saturday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.inlines.hh (1.14), PowerSet.inlines.hh (1.17):
+	  PowerSet<CS>::omega_reduction() properly implemented.
+	  operator<<(std::ostream&, const Determinate<PH>&) implemented so
+	  as to obtain something readable.
+
+2002-08-17 Saturday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, config.h.in, configure.ac, Watchdog/Watchdog.defs.hh,
+	  Watchdog/Watchdog.inlines.hh, Watchdog/Watchdog.types.hh,
+	  Watchdog/pwl_header.top, interfaces/C/ppl_c.cc,
+	  interfaces/C/ppl_c.h, interfaces/Prolog/track_allocation.hh,
+	  src/AskTell.defs.hh, src/AskTell.inlines.hh,
+	  src/AskTell.types.hh, src/BoundingBox.defs.hh,
+	  src/BoundingBox.inlines.hh, src/BoundingBox.types.hh,
+	  src/C_Polyhedron.defs.hh, src/C_Polyhedron.inlines.hh,
+	  src/C_Polyhedron.types.hh, src/ConSys.defs.hh,
+	  src/ConSys.inlines.hh, src/ConSys.types.hh, src/Constraint.cc,
+	  src/Constraint.defs.hh, src/Constraint.inlines.hh,
+	  src/Constraint.types.hh, src/Determinate.defs.hh,
+	  src/Determinate.inlines.hh, src/Determinate.types.hh,
+	  src/GenSys.defs.hh, src/GenSys.inlines.hh, src/GenSys.types.hh,
+	  src/Generator.cc, src/Generator.defs.hh,
+	  src/Generator.inlines.hh, src/Generator.types.hh,
+	  src/Init.defs.hh, src/Init.inlines.hh, src/Init.types.hh,
+	  src/Integer.defs.hh, src/Integer.inlines.hh,
+	  src/Integer.types.hh, src/Interval.defs.hh,
+	  src/Interval.inlines.hh, src/Interval.types.hh,
+	  src/LCompare.defs.hh, src/LCompare.inlines.hh,
+	  src/LCompare.types.hh, src/LinExpression.defs.hh,
+	  src/LinExpression.inlines.hh, src/LinExpression.types.hh,
+	  src/Matrix.defs.hh, src/Matrix.inlines.hh, src/Matrix.types.hh,
+	  src/NNC_Polyhedron.defs.hh, src/NNC_Polyhedron.inlines.hh,
+	  src/NNC_Polyhedron.types.hh, src/Poly_Con_Relation.defs.hh,
+	  src/Poly_Con_Relation.inlines.hh, src/Poly_Con_Relation.types.hh,
+	  src/Poly_Gen_Relation.defs.hh, src/Poly_Gen_Relation.inlines.hh,
+	  src/Poly_Gen_Relation.types.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh,
+	  src/Polyhedron.types.hh, src/PowerSet.defs.hh,
+	  src/PowerSet.inlines.hh, src/PowerSet.types.hh, src/Row.defs.hh,
+	  src/Row.inlines.hh, src/Row.types.hh, src/SatMatrix.defs.hh,
+	  src/SatMatrix.inlines.hh, src/SatMatrix.types.hh,
+	  src/SatRow.defs.hh, src/SatRow.inlines.hh, src/SatRow.types.hh,
+	  src/Status.defs.hh, src/Status.inlines.hh, src/Status.types.hh,
+	  src/Topology.hh, src/Variable.defs.hh, src/Variable.inlines.hh,
+	  src/Variable.types.hh, src/globals.hh, src/initializer.hh,
+	  src/ppl_header.top, tests/ehandlers.hh, tests/mc91.cc,
+	  tests/print.hh, tests/timings.hh
+	  (alt_nnc.[2,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,3,2,1,3,3,2,1,3,3,1,3,1,1,4,4,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13,4,4,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1]):
+	  Merge changes from the trunk between tags `merge_to_alt_nnc' and
+	  `second_merge_to_alt_nnc'.
+
+2002-08-17 Saturday 13:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PowerSet.inlines.hh (1.16):
+	  PowerSet<CS>::concatenate_assign() fixed.
+
+2002-08-17 Saturday 11:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.12): In method
+	  add_dimensions_and_project(), now adding the minus_epsilon_ray
+	  instead of the zero_dim_closure_point.
+
+2002-08-17 Saturday 10:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh, Polyhedron.inlines.hh (alt_nnc.[3,3]):
+	  Method shuffle_dimensions(...) implemented in tha alt_nnc branch
+	  too.
+
+2002-08-16 Friday 22:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.31), interfaces/C/ppl_c.cc (1.43), interfaces/C/ppl_c.h
+	  (1.43): The functions taking non-const arguments named
+	  ppl_new_<T>_from_<S> have been renamed ppl_new_<T>_recycle_<S>,
+	  where <T> is either "C" or "NNC", and <S> is either "ConSys" or
+	  "GenSys".  The old names have been given to the new const
+	  functions.
+
+2002-08-16 Friday 22:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.defs.hh (1.12), src/Determinate.inlines.hh
+	  (1.13), src/PowerSet.defs.hh (1.14), src/PowerSet.inlines.hh
+	  (1.15), tests/mc91.cc (1.6): Another bit of Determinate and
+	  PowerSet implementation written.
+
+2002-08-16 Friday 22:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.30): Updated.
+
+2002-08-16 Friday 22:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.30), Generator.cc (1.37): Exception
+	  messages improved.
+
+2002-08-16 Friday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.15), C_Polyhedron.inlines.hh
+	  (1.10), NNC_Polyhedron.defs.hh (1.18), NNC_Polyhedron.inlines.hh
+	  (1.12), Polyhedron.cc (1.204), Polyhedron.defs.hh (1.141): New
+	  constructors to build polyhedra from read-only constraint and
+	  generator systems: C_Polyhedron(const ConSys&),
+	  C_Polyhedron(const GenSys&), NNC_Polyhedron(const ConSys&), and
+	  NNC_Polyhedron(const GenSys&).  Some comments improved.  Poorly
+	  chosen variable name changed.  Exception messages improved.
+
+2002-08-16 Friday 16:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Determinate.defs.hh, Determinate.inlines.hh
+	  (alt_nnc.[2,2]): Chnages needed to let China compile (taken from
+	  the main trunk).
+
+2002-08-16 Friday 16:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.11): Widening operators now should
+	  work with the NER.
+
+2002-08-16 Friday 10:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.10): Corrected a comment.
+
+2002-08-16 Friday 10:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (alt_nnc.6): Corrected method
+	  adjust_topology_and_dimension(), which could have introduced an
+	  illegal (all zero's) ray when mapping a NNC to a C gensys.
+
+2002-08-16 Friday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (alt_nnc.1): Constructor
+	  C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y) now is
+	  implemented using generators (using constraints is not safe wrt
+	  NER).
+
+2002-08-16 Friday 10:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.15), configure.ac (1.58),
+	  Watchdog/Watchdog.defs.hh (1.6), Watchdog/Watchdog.inlines.hh
+	  (1.5), Watchdog/Watchdog.types.hh (1.2), Watchdog/pwl_header.top
+	  (1.2), interfaces/C/ppl_c.h (1.42),
+	  interfaces/Prolog/track_allocation.hh (1.7), src/AskTell.defs.hh
+	  (1.7), src/AskTell.inlines.hh (1.8), src/AskTell.types.hh (1.3),
+	  src/BoundingBox.defs.hh (1.4), src/BoundingBox.inlines.hh (1.5),
+	  src/BoundingBox.types.hh (1.4), src/C_Polyhedron.defs.hh (1.14),
+	  src/C_Polyhedron.inlines.hh (1.9), src/C_Polyhedron.types.hh
+	  (1.5), src/ConSys.defs.hh (1.63), src/ConSys.inlines.hh (1.24),
+	  src/ConSys.types.hh (1.5), src/Constraint.defs.hh (1.68),
+	  src/Constraint.inlines.hh (1.40), src/Constraint.types.hh (1.5),
+	  src/Determinate.defs.hh (1.11), src/Determinate.inlines.hh
+	  (1.12), src/Determinate.types.hh (1.3), src/GenSys.defs.hh
+	  (1.77), src/GenSys.inlines.hh (1.26), src/GenSys.types.hh (1.5),
+	  src/Generator.defs.hh (1.73), src/Generator.inlines.hh (1.37),
+	  src/Generator.types.hh (1.5), src/Init.defs.hh (1.5),
+	  src/Init.inlines.hh (1.4), src/Init.types.hh (1.4),
+	  src/Integer.defs.hh (1.7), src/Integer.inlines.hh (1.6),
+	  src/Integer.types.hh (1.6), src/Interval.defs.hh (1.7),
+	  src/Interval.inlines.hh (1.5), src/Interval.types.hh (1.4),
+	  src/LCompare.defs.hh (1.3), src/LCompare.inlines.hh (1.3),
+	  src/LCompare.types.hh (1.3), src/LinExpression.defs.hh (1.50),
+	  src/LinExpression.inlines.hh (1.22), src/LinExpression.types.hh
+	  (1.5), src/Matrix.defs.hh (1.32), src/Matrix.inlines.hh (1.26),
+	  src/Matrix.types.hh (1.5), src/NNC_Polyhedron.defs.hh (1.17),
+	  src/NNC_Polyhedron.inlines.hh (1.11), src/NNC_Polyhedron.types.hh
+	  (1.5), src/Poly_Con_Relation.defs.hh (1.12),
+	  src/Poly_Con_Relation.inlines.hh (1.8),
+	  src/Poly_Con_Relation.types.hh (1.4),
+	  src/Poly_Gen_Relation.defs.hh (1.11),
+	  src/Poly_Gen_Relation.inlines.hh (1.8),
+	  src/Poly_Gen_Relation.types.hh (1.4), src/Polyhedron.defs.hh
+	  (1.140), src/Polyhedron.inlines.hh (1.44),
+	  src/Polyhedron.types.hh (1.6), src/PowerSet.defs.hh (1.13),
+	  src/PowerSet.inlines.hh (1.14), src/PowerSet.types.hh (1.3),
+	  src/Row.defs.hh (1.53), src/Row.inlines.hh (1.29),
+	  src/Row.types.hh (1.5), src/SatMatrix.defs.hh (1.22),
+	  src/SatMatrix.inlines.hh (1.15), src/SatMatrix.types.hh (1.5),
+	  src/SatRow.defs.hh (1.18), src/SatRow.inlines.hh (1.18),
+	  src/SatRow.types.hh (1.5), src/Status.defs.hh (1.20),
+	  src/Status.inlines.hh (1.10), src/Status.types.hh (1.5),
+	  src/Topology.hh (1.6), src/Variable.defs.hh (1.22),
+	  src/Variable.inlines.hh (1.11), src/Variable.types.hh (1.5),
+	  src/globals.hh (1.20), src/initializer.hh (1.3),
+	  src/ppl_header.top (1.4), tests/ehandlers.hh (1.5),
+	  tests/print.hh (1.11), tests/timings.hh (1.2): According to the
+	  C++ standard (Section 17.4), every name that starts with an
+	  underscore is reserved to the implementation.  All the multiple
+	  inclusion guards have been renamed (some missing ones have been
+	  added).
+
+2002-08-15 Thursday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, GenSys.defs.hh, Generator.cc, Generator.defs.hh
+	  (alt_nnc.[5,2,3,3]): Removed useless methods
+	  Generator::is_matching_closure_point() and
+	  GenSys::add_corresponding_points().
+
+2002-08-15 Thursday 11:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.9): Corrected trivial errors in
+	  is_topologically_closed() and topological_closure_assign().
+
+2002-08-15 Thursday 11:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.10), Determinate.inlines.hh (1.11):
+	  Implemented the functionality required for testing with China.
+
+2002-08-15 Thursday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.203), Polyhedron.defs.hh (1.139),
+	  Polyhedron.inlines.hh (1.43): Added template <typename
+	  PartialFunction> void Polyhedron::shuffle_dimensions(const
+	  PartialFunction& pfunc).
+
+2002-08-14 Wednesday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.8): Comments of
+	  Polyhedron::concatenate_assign() improved.
+
+2002-08-14 Wednesday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.202): Polyhedron::concatenate_assign()
+	  improved.
+
+2002-08-14 Wednesday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.7): Rewritten methods
+	  is_topologically_closed() and topological_closure_assign().
+
+2002-08-14 Wednesday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.6): Some improvements to
+	  concatenate_assign().
+
+2002-08-14 Wednesday 16:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (alt_nnc.4): Corrected method has_points(), which
+	  was returning true even when finding the minus_epsilon ray.
+
+2002-08-14 Wednesday 15:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.41): Documentation of
+	  ppl_Polyhedron_concatenate_assign() corrected.
+
+2002-08-14 Wednesday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/hypercubes.cc (alt_nnc.1): Put under CVS control. It is not
+	  (yet) built and executed by `make check', because we should find
+	  the right performance tradeoff.
+
+2002-08-14 Wednesday 14:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS, interfaces/C/ppl_c.cc, interfaces/C/ppl_c.h,
+	  interfaces/Prolog/ppl_prolog.icc,
+	  interfaces/Prolog/Ciao/ppl_ciao.pl,
+	  interfaces/Prolog/GNU/ppl_gprolog.pl,
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc,
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc,
+	  interfaces/Prolog/XSB/ppl_xsb.H,
+	  interfaces/Prolog/XSB/ppl_xsb.cc,
+	  interfaces/Prolog/XSB/xsb_clpq.P,
+	  interfaces/Prolog/XSB/xsb_clpq2.P,
+	  interfaces/Prolog/YAP/ppl_yap.cc, src/ConSys.cc,
+	  src/Determinate.defs.hh, src/Determinate.inlines.hh,
+	  src/GenSys.cc, src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/PowerSet.defs.hh, src/PowerSet.inlines.hh, tests/Makefile.am,
+	  tests/NNCinclusion1.cc, tests/NNCminimize1.cc,
+	  tests/NNCminimize2.cc, tests/NNCminimize3.cc,
+	  tests/NNCminimize4.cc, tests/NNCminimize5.cc,
+	  tests/NNCminimize6.cc, tests/addconstraints1.cc,
+	  tests/addconstraints10.cc, tests/addconstraints11.cc,
+	  tests/addconstraints2.cc, tests/addconstraints3.cc,
+	  tests/addconstraints4.cc, tests/addconstraints5.cc,
+	  tests/addconstraints6.cc, tests/addconstraints7.cc,
+	  tests/addconstraints8.cc, tests/addconstraints9.cc,
+	  tests/adddimensions1.cc, tests/adddimensions2.cc,
+	  tests/adddimensions3.cc, tests/adddimensions4.cc,
+	  tests/adddimensions5.cc, tests/adddimensions6.cc,
+	  tests/adddimensions7.cc, tests/addgenerators1.cc,
+	  tests/addgenerators2.cc, tests/addgenerators3.cc,
+	  tests/addgenerators4.cc, tests/addgenerators5.cc,
+	  tests/addgenerators6.cc, tests/addgenerators7.cc,
+	  tests/addgenerators8.cc, tests/affineimage1.cc,
+	  tests/affineimage2.cc, tests/affinepreimage1.cc,
+	  tests/affinepreimage2.cc, tests/affinepreimage3.cc,
+	  tests/affinepreimage4.cc, tests/affinetrans.cc, tests/append1.cc,
+	  tests/append2.cc, tests/bounded1.cc, tests/boundingbox1.cc,
+	  tests/boundingbox2.cc, tests/concatenate1.cc,
+	  tests/concatenate2.cc, tests/concatenate3.cc, tests/empty1.cc,
+	  tests/exceptions1.cc, tests/exceptions2.cc, tests/generators1.cc,
+	  tests/generators2.cc, tests/h79widening1.cc,
+	  tests/h79widening2.cc, tests/h79widening3.cc,
+	  tests/inclusion1.cc, tests/inters1.cc, tests/inters2.cc,
+	  tests/inters3.cc, tests/inters4.cc, tests/inters5.cc,
+	  tests/inters6.cc, tests/inters7.cc, tests/intersection1.cc,
+	  tests/intersection2.cc, tests/intersection3.cc,
+	  tests/intersection4.cc, tests/intersection5.cc,
+	  tests/intersection6.cc, tests/intersection7.cc,
+	  tests/limitedh79widening1.cc, tests/limitedh79widening2.cc,
+	  tests/mc91.cc, tests/memory1.cc, tests/onepoint.cc,
+	  tests/permute.cc, tests/polydifference1.cc,
+	  tests/polydifference2.cc, tests/polyhull1.cc, tests/polyhull2.cc,
+	  tests/polyhull3.cc, tests/polyhull4.cc, tests/ppl_test.hh,
+	  tests/randphull1.cc, tests/relations1.cc, tests/relations2.cc,
+	  tests/relations3.cc, tests/relations4.cc, tests/relations5.cc,
+	  tests/relations6.cc, tests/relations7.cc, tests/relations8.cc,
+	  tests/relations9.cc, tests/removedim1.cc, tests/removedim2.cc,
+	  tests/removedim3.cc, tests/removedim4.cc, tests/removedim5.cc,
+	  tests/removedim6.cc, tests/removedim7.cc, tests/smm1.cc,
+	  tests/timeelapse1.cc, tests/timeelapse2.cc, tests/timeelapse3.cc,
+	  tests/timeelapse4.cc, tests/timeelapse5.cc, tests/universe1.cc,
+	  tests/universe2.cc, tests/universe3.cc, tests/universe4.cc,
+	  tests/universe5.cc, tests/universe6.cc, tests/watchdog1.cc
+	  (alt_nnc.[1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,3,5,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Merge changes from the trunk between tags `alt_nnc_root' and
+	  `merge_to_alt_nnc'.
+
+2002-08-14 Wednesday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: NNCinclusion1.cc (1.4), NNCminimize1.cc (1.6),
+	  NNCminimize2.cc (1.6), NNCminimize3.cc (1.6), NNCminimize4.cc
+	  (1.8), NNCminimize5.cc (1.4), NNCminimize6.cc (1.6),
+	  addconstraints1.cc (1.8), addconstraints3.cc (1.5),
+	  addconstraints4.cc (1.7), addconstraints5.cc (1.8),
+	  addconstraints6.cc (1.9), addconstraints7.cc (1.8),
+	  addconstraints8.cc (1.8), addconstraints9.cc (1.9),
+	  adddimensions1.cc (1.10), adddimensions2.cc (1.6),
+	  adddimensions3.cc (1.8), adddimensions4.cc (1.6),
+	  adddimensions5.cc (1.3), adddimensions6.cc (1.3),
+	  adddimensions7.cc (1.3), addgenerators1.cc (1.9),
+	  addgenerators2.cc (1.9), addgenerators3.cc (1.8),
+	  addgenerators4.cc (1.8), addgenerators5.cc (1.8),
+	  addgenerators6.cc (1.8), addgenerators7.cc (1.4),
+	  addgenerators8.cc (1.4), affineimage1.cc (1.8), affineimage2.cc
+	  (1.7), affinepreimage1.cc (1.7), affinepreimage2.cc (1.7),
+	  affinepreimage3.cc (1.7), affinepreimage4.cc (1.8),
+	  affinetrans.cc (1.11), append1.cc (1.13), append2.cc (1.14),
+	  bounded1.cc (1.5), boundingbox1.cc (1.18), boundingbox2.cc (1.9),
+	  concatenate1.cc (1.3), concatenate2.cc (1.3), concatenate3.cc
+	  (1.3), empty1.cc (1.9), exceptions1.cc (1.13), exceptions2.cc
+	  (1.10), generators1.cc (1.8), generators2.cc (1.5),
+	  h79widening1.cc (1.3), h79widening2.cc (1.3), h79widening3.cc
+	  (1.3), inclusion1.cc (1.4), intersection1.cc (1.3),
+	  intersection2.cc (1.3), intersection3.cc (1.3), intersection4.cc
+	  (1.3), intersection5.cc (1.3), intersection6.cc (1.3),
+	  intersection7.cc (1.3), limitedh79widening1.cc (1.3),
+	  limitedh79widening2.cc (1.3), mc91.cc (1.5), memory1.cc (1.7),
+	  onepoint.cc (1.7), permute.cc (1.20), polydifference1.cc (1.3),
+	  polydifference2.cc (1.5), polyhull1.cc (1.3), polyhull2.cc (1.3),
+	  polyhull3.cc (1.3), polyhull4.cc (1.3), randphull1.cc (1.4),
+	  relations1.cc (1.5), relations2.cc (1.6), relations3.cc (1.6),
+	  relations4.cc (1.6), relations5.cc (1.6), relations6.cc (1.5),
+	  relations7.cc (1.5), relations8.cc (1.5), relations9.cc (1.6),
+	  removedim1.cc (1.7), removedim2.cc (1.11), removedim3.cc (1.7),
+	  removedim4.cc (1.8), removedim5.cc (1.6), removedim6.cc (1.8),
+	  removedim7.cc (1.3), smm1.cc (1.7), timeelapse1.cc (1.4),
+	  timeelapse2.cc (1.4), timeelapse3.cc (1.4), timeelapse4.cc (1.4),
+	  timeelapse5.cc (1.4), universe1.cc (1.5), universe2.cc (1.6),
+	  universe3.cc (1.6), universe4.cc (1.6), universe5.cc (1.7),
+	  universe6.cc (1.4), watchdog1.cc (1.10): Minor improvements.
+
+2002-08-14 Wednesday 12:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.86): The test nnc_polydifference1 must fail.
+
+2002-08-14 Wednesday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, Generator.cc, Generator.defs.hh
+	  (alt_nnc.[2,2,2]): The skip_forward() method now only skips the
+	  minus_epsilon_ray.
+
+2002-08-14 Wednesday 12:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (alt_nnc.3): In the skip_forward() method, avoid
+	  useless computations for necessarily closed constraint systems.
+
+2002-08-14 Wednesday 12:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.85), NNCinclusion1.cc (1.3),
+	  NNCminimize1.cc (1.5), NNCminimize2.cc (1.5), NNCminimize3.cc
+	  (1.5), NNCminimize4.cc (1.7), NNCminimize5.cc (1.3),
+	  NNCminimize6.cc (1.5), addconstraints1.cc (1.7),
+	  addconstraints3.cc (1.4), addconstraints4.cc (1.6),
+	  addconstraints5.cc (1.7), addconstraints6.cc (1.8),
+	  addconstraints7.cc (1.7), addconstraints8.cc (1.7),
+	  addconstraints9.cc (1.8), adddimensions1.cc (1.9),
+	  adddimensions2.cc (1.5), adddimensions3.cc (1.7),
+	  adddimensions4.cc (1.5), adddimensions5.cc (1.2),
+	  adddimensions6.cc (1.2), adddimensions7.cc (1.2),
+	  addgenerators1.cc (1.8), addgenerators2.cc (1.8),
+	  addgenerators3.cc (1.7), addgenerators4.cc (1.7),
+	  addgenerators5.cc (1.7), addgenerators6.cc (1.7),
+	  addgenerators7.cc (1.3), addgenerators8.cc (1.3), affineimage1.cc
+	  (1.7), affineimage2.cc (1.6), affinepreimage1.cc (1.6),
+	  affinepreimage2.cc (1.6), affinepreimage3.cc (1.6),
+	  affinepreimage4.cc (1.7), affinetrans.cc (1.10), append1.cc
+	  (1.12), append2.cc (1.13), bounded1.cc (1.4), boundingbox1.cc
+	  (1.17), boundingbox2.cc (1.8), concatenate1.cc (1.2),
+	  concatenate2.cc (1.2), concatenate3.cc (1.2), empty1.cc (1.8),
+	  exceptions1.cc (1.12), exceptions2.cc (1.9), generators1.cc
+	  (1.7), generators2.cc (1.4), h79widening1.cc (1.2),
+	  h79widening2.cc (1.2), h79widening3.cc (1.2), inclusion1.cc
+	  (1.3), intersection1.cc (1.2), intersection2.cc (1.2),
+	  intersection3.cc (1.2), intersection4.cc (1.2), intersection5.cc
+	  (1.2), intersection6.cc (1.2), intersection7.cc (1.2),
+	  limitedh79widening1.cc (1.2), limitedh79widening2.cc (1.2),
+	  mc91.cc (1.4), memory1.cc (1.6), onepoint.cc (1.6), permute.cc
+	  (1.19), polydifference1.cc (1.2), polydifference2.cc (1.4),
+	  polyhull1.cc (1.2), polyhull2.cc (1.2), polyhull3.cc (1.2),
+	  polyhull4.cc (1.2), ppl_test.hh (1.1), randphull1.cc (1.3),
+	  relations1.cc (1.4), relations2.cc (1.5), relations3.cc (1.5),
+	  relations4.cc (1.5), relations5.cc (1.5), relations6.cc (1.4),
+	  relations7.cc (1.4), relations8.cc (1.4), relations9.cc (1.5),
+	  removedim1.cc (1.6), removedim2.cc (1.10), removedim3.cc (1.6),
+	  removedim4.cc (1.7), removedim5.cc (1.5), removedim6.cc (1.7),
+	  removedim7.cc (1.2), smm1.cc (1.6), timeelapse1.cc (1.3),
+	  timeelapse2.cc (1.3), timeelapse3.cc (1.3), timeelapse4.cc (1.3),
+	  timeelapse5.cc (1.3), universe1.cc (1.4), universe2.cc (1.5),
+	  universe3.cc (1.5), universe4.cc (1.5), universe5.cc (1.6),
+	  universe6.cc (1.3), watchdog1.cc (1.9): Most of the test programs
+	  are now used to test both closed and not necessarily closed
+	  polyhedra.
+
+2002-08-14 Wednesday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh,
+	  Constraint.cc, Constraint.defs.hh (alt_nnc.[2,2,1,2,2]): Now the
+	  iterators on constraint systems do skip the next constraint when
+	  the current one is a strict inequality and the next one is a
+	  non-strict inequality matching the current one (we still skip
+	  trivial-true constraints).
+
+2002-08-14 Wednesday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.29): Updated.
+
+2002-08-14 Wednesday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.201): Polyhedron::concatenate_assign()
+	  improved.
+
+2002-08-13 Tuesday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.84), inters1.cc (1.11), inters2.cc (1.14),
+	  inters3.cc (1.7), inters4.cc (1.6), inters5.cc (1.8), inters6.cc
+	  (1.7), inters7.cc (1.4), intersection1.cc (1.1), intersection2.cc
+	  (1.1), intersection3.cc (1.1), intersection4.cc (1.1),
+	  intersection5.cc (1.1), intersection6.cc (1.1), intersection7.cc
+	  (1.1): Renamed intersN.cc to intersectionN.cc, for N = 1, ..., 7.
+
+2002-08-13 Tuesday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: xsb_clpq.P (1.5), xsb_clpq2.P (1.3):
+	  Import as little as possible.
+
+2002-08-13 Tuesday 21:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.4): add_constraints_and_minimize()
+	  should now be ok for the new NNC repr.  Added a couple of FIXME's
+	  to mark methods that still need to be adjusted.
+
+2002-08-13 Tuesday 21:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, GenSys.defs.hh (alt_nnc.[1,1]): Removed method
+	  add_corresponding_closure_points().
+
+2002-08-13 Tuesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.42), interfaces/C/ppl_c.h (1.40),
+	  interfaces/Prolog/ppl_prolog.icc (1.62),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.21),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.17),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.25),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.49),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.2),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.7),
+	  interfaces/Prolog/XSB/xsb_clpq.P (1.4),
+	  interfaces/Prolog/XSB/xsb_clpq2.P (1.2),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.42), src/Determinate.defs.hh
+	  (1.9), src/Determinate.inlines.hh (1.10), src/Polyhedron.cc
+	  (1.200), src/Polyhedron.defs.hh (1.138), src/PowerSet.defs.hh
+	  (1.12), src/PowerSet.inlines.hh (1.13), tests/Makefile.am (1.83),
+	  tests/addconstraints10.cc (1.6), tests/addconstraints11.cc (1.7),
+	  tests/addconstraints2.cc (1.13), tests/concatenate1.cc (1.1),
+	  tests/concatenate2.cc (1.1), tests/concatenate3.cc (1.1),
+	  tests/exceptions2.cc (1.8): The method
+	  Polyhedron::add_dimensions_and_constraints(ConSys&) has gone.  A
+	  similar functionality is provided by the new method
+	  Polyhedron::concatenate_assign(const Polyhedron&).
+
+2002-08-13 Tuesday 18:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (alt_nnc.2): Fixed method	template
+	  <typename Box>   Polyhedron::Polyhedron(Topology topol, const
+	  Box& box) to work correctly with the new NNC representation.
+
+2002-08-13 Tuesday 18:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/boundingbox2.cc (alt_nnc.1): Some strange formatting fixed.
+
+2002-08-13 Tuesday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.8), Determinate.inlines.hh (1.9):
+	  Default constructor replaced with a generalized constructor.	New
+	  method Determinate::concatenate_assign(const Determinate& y).
+
+2002-08-13 Tuesday 16:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.3): Most methods now correctly use the
+	  new NNC representation (notable exceptions: the wideinings and
+	  the boundingbox operators).
+
+2002-08-13 Tuesday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (alt_nnc.1): When con_to_gen is false, no longer
+	  checking for the presence of the positivity constraint (C) or the
+	  presence of eps_geq_zero (NNC).
+
+2002-08-13 Tuesday 16:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc, Generator.defs.hh, Generator.inlines.hh
+	  (alt_nnc.[1,1,1]): Added method for getting the
+	  minus_epsilon_ray, needed for the new NNC representation;
+	  adjusted the OK() method so that it will no longer complain when
+	  finding a ray with a non-zero epsilon coefficient.
+
+2002-08-13 Tuesday 16:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh (alt_nnc.[1,1]): Added method
+	  add_corresponding_nonstrict_inequalities().
+
+2002-08-13 Tuesday 14:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.11), PowerSet.inlines.hh (1.12): Added
+	  a `space_dim' private member and its usual public accessor:
+	  space_dimension().
+
+2002-08-13 Tuesday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.7), Determinate.inlines.hh (1.8):
+	  Method space_dimension() added.  Added template <typename PH>
+	  bool operator==(const Determinate<PH>& x, const Determinate<PH>&
+	  y) and template <typename PH> bool operator!=(const
+	  Determinate<PH>& x, const Determinate<PH>& y).  Added several
+	  assertions.  Default constructor made public (it was left private
+	  by mistake).	Prepare for some cleanup.
+
+2002-08-13 Tuesday 11:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (alt_nnc.2): Started converting
+	  H-representations into P-representations.  The build is
+	  (obviously) broken.
+
+2002-08-13 Tuesday 10:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc, Constraint.defs.hh, Constraint.inlines.hh,
+	  Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (alt_nnc.[1,1,1,1,1,1]): Getting rid of the epsilon_geq_zero()
+	  constraint.  Added the static function
+	  Polyhedron::add_low_level_constraints(ConSys&) to centralize the
+	  issues related to the positivity and the epsilon_leq_one()
+	  low-level constraints.
+
+2002-08-13 Tuesday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.41), GenSys.cc (1.61): In methods
+	  ConSys::insert() and GenSys::insert(), when the systems are empty
+	  and NNC, computing the new size of the constraint/generators in a
+	  cleaner way.
+
+2002-08-12 Monday 20:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.60): Patched the method insert(const
+	  Generator&), which was doing nasty things when trying to insert a
+	  generator into an empty generator system that was declared to be
+	  NNC.
+
+2002-08-12 Monday 20:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/addgenerators8.cc (1.2): No longer NOISY.
+
+2002-08-12 Monday 20:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.199): Corrected a bug in add_generator(const
+	  Generator&) whereby we were not adding the corresponding closure
+	  point when adding a point to an empty NNC polyhedron.
+
+2002-08-12 Monday 20:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.137): Removed a /*! that was inside the
+	  scope of another /*!.
+
+2002-08-12 Monday 20:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.82), addgenerators8.cc (1.1): The new test
+	  addgenerators8 shows a bug when trying to insert a point into an
+	  empty NNC polyhedron using add_generator(const Generator&).
+
+2002-08-12 Monday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.6), Determinate.inlines.hh (1.7),
+	  PowerSet.defs.hh (1.10), PowerSet.inlines.hh (1.11): Classes
+	  Determinate and PowerSet equipped with initial implementations of
+	  methods add_constraint(), add_constraints(), and
+	  add_dimensions_and_constraints().
+
+2002-08-12 Monday 09:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.136): The documentation of
+	  Polyhedron::add_dimensions_and_constraints() has been made
+	  consistent with that of the other methods.
+
+2002-08-12 Monday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.22), interfaces/Prolog/expected2
+	  (1.6), interfaces/Prolog/XSB/expected2 (1.2), src/ConSys.cc
+	  (1.40), src/Constraint.cc (1.29), src/Constraint.inlines.hh
+	  (1.39), src/GenSys.cc (1.59), src/Generator.cc (1.36),
+	  src/Generator.inlines.hh (1.36), src/Matrix.cc (1.40),
+	  src/Matrix.defs.hh (1.31), src/Polyhedron.cc (1.198),
+	  src/Polyhedron.inlines.hh (1.42), src/minimize.cc (1.22): Avoid
+	  using LaTeX commands in ordinary C++ comments.
+
+2002-08-12 Monday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.197): Properly comment a couple of
+	  preprocessor directives.
+
+2002-08-11 Sunday 17:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.61), src/C_Polyhedron.defs.hh
+	  (1.13), src/C_Polyhedron.inlines.hh (1.8),
+	  src/NNC_Polyhedron.defs.hh (1.16), src/NNC_Polyhedron.inlines.hh
+	  (1.10), src/Polyhedron.defs.hh (1.135), src/Polyhedron.inlines.hh
+	  (1.41), src/PowerSet.defs.hh (1.9), src/PowerSet.inlines.hh
+	  (1.10): The syntax `template <class T>' is an anachronism: use
+	  `template <typename T>' instead.
+
+2002-08-11 Sunday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.types.hh (1.3), C_Polyhedron.types.hh (1.4),
+	  ConSys.types.hh (1.4), Constraint.types.hh (1.4), GenSys.types.hh
+	  (1.4), Generator.types.hh (1.4), Init.types.hh (1.3),
+	  Integer.types.hh (1.5), Interval.types.hh (1.3),
+	  LinExpression.types.hh (1.4), Matrix.types.hh (1.4),
+	  NNC_Polyhedron.types.hh (1.4), Poly_Con_Relation.types.hh (1.3),
+	  Poly_Gen_Relation.types.hh (1.3), Polyhedron.types.hh (1.5),
+	  Row.types.hh (1.4), SatMatrix.types.hh (1.4), SatRow.types.hh
+	  (1.4), Status.types.hh (1.4), Variable.types.hh (1.4): Obey our
+	  standard about namespace-level indentation.
+
+2002-08-11 Sunday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.6), AskTell.inlines.hh (1.7),
+	  AskTell.types.hh (1.2), BoundingBox.defs.hh (1.3),
+	  BoundingBox.inlines.hh (1.4), BoundingBox.types.hh (1.2),
+	  C_Polyhedron.defs.hh (1.12), C_Polyhedron.inlines.hh (1.7),
+	  C_Polyhedron.types.hh (1.3), ConSys.defs.hh (1.62),
+	  ConSys.inlines.hh (1.23), ConSys.types.hh (1.3),
+	  Constraint.defs.hh (1.67), Constraint.inlines.hh (1.38),
+	  Constraint.types.hh (1.3), Determinate.defs.hh (1.5),
+	  Determinate.inlines.hh (1.6), Determinate.types.hh (1.2),
+	  GenSys.defs.hh (1.76), GenSys.inlines.hh (1.25), GenSys.types.hh
+	  (1.3), Generator.defs.hh (1.72), Generator.inlines.hh (1.35),
+	  Generator.types.hh (1.3), Init.defs.hh (1.4), Init.inlines.hh
+	  (1.3), Init.types.hh (1.2), Integer.defs.hh (1.6),
+	  Integer.inlines.hh (1.5), Integer.types.hh (1.4),
+	  Interval.defs.hh (1.6), Interval.types.hh (1.2), LCompare.defs.hh
+	  (1.2), LCompare.inlines.hh (1.2), LCompare.types.hh (1.2),
+	  LinExpression.defs.hh (1.49), LinExpression.inlines.hh (1.21),
+	  LinExpression.types.hh (1.3), Matrix.defs.hh (1.30),
+	  Matrix.inlines.hh (1.25), Matrix.types.hh (1.3),
+	  NNC_Polyhedron.defs.hh (1.15), NNC_Polyhedron.inlines.hh (1.9),
+	  NNC_Polyhedron.types.hh (1.3), Poly_Con_Relation.defs.hh (1.11),
+	  Poly_Con_Relation.inlines.hh (1.7), Poly_Con_Relation.types.hh
+	  (1.2), Poly_Gen_Relation.defs.hh (1.10),
+	  Poly_Gen_Relation.inlines.hh (1.7), Poly_Gen_Relation.types.hh
+	  (1.2), Polyhedron.defs.hh (1.134), Polyhedron.inlines.hh (1.40),
+	  Polyhedron.types.hh (1.4), PowerSet.defs.hh (1.8),
+	  PowerSet.inlines.hh (1.9), PowerSet.types.hh (1.2), Row.defs.hh
+	  (1.52), Row.inlines.hh (1.28), Row.types.hh (1.3),
+	  SatMatrix.defs.hh (1.21), SatMatrix.inlines.hh (1.14),
+	  SatMatrix.types.hh (1.3), SatRow.defs.hh (1.17),
+	  SatRow.inlines.hh (1.17), SatRow.types.hh (1.3), Status.defs.hh
+	  (1.19), Status.inlines.hh (1.9), Status.types.hh (1.3),
+	  Variable.defs.hh (1.21), Variable.inlines.hh (1.10),
+	  Variable.types.hh (1.3): Multiple inclusion guards properly
+	  commented.
+
+2002-08-11 Sunday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.h (1.39), Prolog/XSB/ppl_xsb.cc (1.6),
+	  Prolog/YAP/ppl_yap.cc (1.41): Comment the closing brace of
+	  `extern "C"' blocks.
+
+2002-08-11 Sunday 15:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.61), Constraint.defs.hh (1.66),
+	  GenSys.defs.hh (1.75), Generator.defs.hh (1.71), Integer.defs.hh
+	  (1.5), Interval.defs.hh (1.5), LinExpression.defs.hh (1.48),
+	  Matrix.defs.hh (1.29), Poly_Con_Relation.defs.hh (1.10),
+	  Poly_Gen_Relation.defs.hh (1.9), Polyhedron.defs.hh (1.133),
+	  Row.defs.hh (1.51), SatMatrix.defs.hh (1.20), SatRow.defs.hh
+	  (1.16), Status.defs.hh (1.18), Variable.defs.hh (1.20):
+	  Namespace-level indentation fixed.
+
+2002-08-11 Sunday 15:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.5): Add rules concerning block closures and
+	  namespace indentation.
+
+2002-08-11 Sunday 11:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.4), Determinate.inlines.hh (1.5),
+	  PowerSet.defs.hh (1.7), PowerSet.inlines.hh (1.8): Added methods
+	  add_dimensions_and_project(), add_dimensions_and_embed(),
+	  remove_dimensions(), and remove_higher_dimensions().
+
+2002-08-10 Saturday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.57), interfaces/C/Makefile.am (1.11),
+	  src/Makefile.am (1.48): Bump version numbers.
+
+2002-08-10 Saturday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/.cvsignore (1.2): For those building in the sources
+	  directory.
+
+2002-08-10 Saturday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.9): Allow building in any
+	  directory (included the one containing the sources).
+
+2002-08-09 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.8): Distribute also expected
+	  and expected2.
+
+2002-08-09 Friday 21:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.19), devref-browse.doxyconf-latex.in (1.21),
+	  devref-print.doxyconf-latex.in (1.21), devref.doxyconf-html.in
+	  (1.22), user-browse.doxyconf-latex.in (1.13),
+	  user-print.doxyconf-latex.in (1.13), user.doxyconf-html.in
+	  (1.15): Transition to Doxygen 1.2.17 completed.
+
+2002-08-08 Thursday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/.cvsignore (1.6): Ignore also the newly added tests.
+
+2002-08-07 Wednesday 23:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: .cvsignore (1.2), Makefile.am (1.7):
+	  Support building in the sources' directory.
+
+2002-08-07 Wednesday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.6), expected2 (1.1): XSB
+	  interface now fully operational.
+
+2002-08-07 Wednesday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.5), expected (1.1),
+	  ppl_xsb.cc (1.5), xsb_clpq.P (1.3), xsb_clpq2.P (1.1): Bug fixed.
+	  Tests with clpq.pl now working.
+
+2002-08-07 Wednesday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.4): Improve the `make check'
+	  mechanism.
+
+2002-08-07 Wednesday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/Makefile.am (1.3): MOSTLYCLEANFILES
+	  integrated.
+
+2002-08-07 Wednesday 11:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/xsb_clpq.P (1.2): Unneeded parentheses
+	  removed.
+
+2002-08-07 Wednesday 11:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/: Makefile.am (1.2), xsb_clpq.P (1.1):
+	  Towards a working XSB interface.
+
+2002-08-06 Tuesday 19:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.38): Better comment for the closing
+	  #endif of the multiple inclusion guard.
+
+2002-08-06 Tuesday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.4): Wrong initializations
+	  fixed.
+
+2002-08-06 Tuesday 18:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.3): Try to get around bugs in
+	  XSB 2.5 foreign language interface (several foreign language
+	  interface functions do not properly dereference their arguments).
+
+2002-08-05 Monday 17:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.5), AskTell.inlines.hh (1.6),
+	  PowerSet.inlines.hh (1.7): Some cleaning.
+
+2002-08-04 Sunday 18:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.4), AskTell.inlines.hh (1.5),
+	  Determinate.defs.hh (1.3), Determinate.inlines.hh (1.4),
+	  PowerSet.defs.hh (1.6), PowerSet.inlines.hh (1.6): All the
+	  entails() functions became definitely_entails() methods.  More
+	  cleaning.
+
+2002-08-04 Sunday 14:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.3), AskTell.inlines.hh (1.4),
+	  PowerSet.defs.hh (1.5), PowerSet.inlines.hh (1.5): More cleaning.
+
+2002-08-04 Sunday 13:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/AskTell.inlines.hh (1.3), src/Determinate.defs.hh (1.2),
+	  src/Determinate.inlines.hh (1.3), src/PowerSet.defs.hh (1.4),
+	  src/PowerSet.inlines.hh (1.4), tests/mc91.cc (1.3):
+	  CS::operator*=() renamed CS::meet_assign().  CS::operator+=()
+	  renamed CS::upper_bound_assign().
+
+2002-08-04 Sunday 13:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.47), PowerSet.defs.hh (1.3),
+	  PowerSet.inlines.hh (1.3): Use the new classes also for the
+	  documentation.  The PowerSet construction is now implemented
+	  using a sequence.  PowerSet::omega_reduction() reimplemented.
+
+2002-08-03 Saturday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.2), PowerSet.inlines.hh (1.2): Complete
+	  redesign started.
+
+2002-08-02 Friday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/AskTell.defs.hh (1.2), src/AskTell.inlines.hh (1.2),
+	  tests/mc91.cc (1.2): Move all code to AskTell.inlines.hh.  Minor
+	  improvements.
+
+2002-08-02 Friday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.11), exceptions2.cc (1.7), print.hh
+	  (1.10), randphull1.cc (1.2): Include <iostream>.
+
+2002-08-02 Friday 09:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.56): Check whether the Mercury compiler is
+	  installed.
+
+2002-08-01 Thursday 18:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.81), mc91.cc (1.1): Test the constraint
+	  systems' constructions with McCarthy's 91 function.
+
+2002-08-01 Thursday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.46): Activate the new constraint systems'
+	  files.
+
+2002-08-01 Thursday 17:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Determinate.inlines.hh (1.2): Inclusion guard comment fixed.
+
+2002-08-01 Thursday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PowerSet.defs.hh (1.1), PowerSet.inlines.hh (1.1),
+	  PowerSet.types.hh (1.1): Initial implementation for the class
+	  `PowerSet': the powerset construction on constraint systems.
+
+2002-08-01 Thursday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: AskTell.defs.hh (1.1), AskTell.inlines.hh (1.1),
+	  AskTell.types.hh (1.1): Initial implementation for the class
+	  `AskTell': the ask and tell construction on constraint systems.
+
+2002-08-01 Thursday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LCompare.defs.hh (1.1), LCompare.inlines.hh (1.1),
+	  LCompare.types.hh (1.1): Initial implementation for the class
+	  `LCompare': a function object for lexical comparison.
+
+2002-08-01 Thursday 16:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Determinate.defs.hh (1.1), Determinate.inlines.hh (1.1),
+	  Determinate.types.hh (1.1): Initial implementation for the class
+	  `Determinate': it wraps a polyhedron class into a determinate
+	  constraint system interface.
+
+2002-07-30 Tuesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.3): Update version.
+
+2002-07-30 Tuesday 11:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[2,4]): Mark
+	  ChangeLog.
+
+2002-07-30 Tuesday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.3): Updated.
+
+2002-07-29 Monday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* COPYING (1.2), INSTALL (1.4), config.guess (1.12), config.sub
+	  (1.11), depcomp (1.3), install-sh (1.3), missing (1.5),
+	  mkinstalldirs (1.4): Updated to the respective latest versions.
+
+2002-07-29 Monday 10:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.196): Added an assertions to
+	  add_constraints(ConSys& cs).	Also added a test for emptyness, to
+	  avoid adding constraints to a polyhedron already known to be
+	  empty.
+
+2002-07-29 Monday 07:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.21): Comment removed.
+
+2002-07-29 Monday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (ppl-0_4-branch.1): Comment
+	  removed.
+
+2002-07-29 Monday 07:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.3): Mention the fixes to
+	  Polyhedron::check_universe() and
+	  NNC_Polyhedron::NNC_Polyhedron(ConSys& cs).
+
+2002-07-29 Monday 01:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc, src/GenSys.cc, tests/universe6.cc,
+	  src/Polyhedron.cc (ppl-0_4-branch.[1,1,1,2]): The following
+	  corrections made on HEAD are now reported in the ppl-0_4-branch:
+	  - fixed a bug in ConSys/GenSys.adjust_topology_and_dimension()  -
+	  fixed a bug in Polyhedron::check_universe().
+
+2002-07-29 Monday 00:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.195): Fixed a bug in check_universe(), which
+	  was returning the wrong result when called by a zero-dim universe
+	  polyhedron.
+
+2002-07-29 Monday 00:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.39), GenSys.cc (1.58): Methods
+	  adjust_topology_and_dimension() now behave properly even on
+	  constraint/generator systems having no rows.
+
+2002-07-29 Monday 00:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/universe6.cc (1.2): Added a new test, showing two bugs:  -
+	  the first bug has to do with an invariant that was not fullfilled
+	  when creating an NNC polyehdron starting from an empty
+	  constraint system;	this bug was only visible when compiling
+	  with assertions turned on.   - the second bug was due to the fact
+	  that check_universe() returns     the wrong result when applied
+	  to a zero-dim-universe polyhedron.
+
+2002-07-28 Sunday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/.cvsignore (1.1): Put under CVS control.
+
+2002-07-28 Sunday 20:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/pl_check.pl (1.20): Properly initialize and
+	  finalize the library.
+
+2002-07-28 Sunday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.13),
+	  GNU/ppl_gprolog_sd.cc (1.8), SICStus/ppl_sicstus_sd.cc (1.24),
+	  SWI/ppl_swiprolog.cc (1.48), YAP/ppl_yap.cc (1.40): Fixed some
+	  comments and assertions.
+
+2002-07-28 Sunday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/XSB/ppl_xsb.cc (1.2): Several bugs fixed.
+
+2002-07-28 Sunday 12:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_4-branch.2): Updated.
+
+2002-07-28 Sunday 11:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_4-branch.1): Updated for version 0.4.1.
+
+2002-07-28 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.2): Add news for version 0.4.1.
+
+2002-07-28 Sunday 11:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.2): Bump version number.
+
+2002-07-28 Sunday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Integer.types.hh, Makefile.am (ppl-0_4-branch.[1,1]):
+	  Document the fact that Parma_Polyhedra_Library::Integer is a
+	  synonym for GMP's mpz_class.
+
+2002-07-24 Wednesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/Makefile.am (1.8): Ciao Prolog library
+	  renamed.
+
+2002-07-24 Wednesday 14:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Integer.types.hh (1.3), Makefile.am (1.45): Document the
+	  fact that Parma_Polyhedra_Library::Integer is a synonym for GMP's
+	  mpz_class.
+
+2002-07-23 Tuesday 18:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.70): Corrected doxygen comments to
+	  shorthands functions line, ray, point.
+
+2002-07-23 Tuesday 18:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.88): Small correction in the example of
+	  the use of an extended generator system.
+
+2002-07-22 Monday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.12),
+	  GNU/ppl_gprolog_sd.cc (1.7), SICStus/ppl_sicstus_sd.cc (1.23),
+	  SWI/ppl_swiprolog.cc (1.47), YAP/ppl_yap.cc (1.39): Comments
+	  fixed.  Avoid macros with unused parameters.
+
+2002-07-22 Monday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.55), interfaces/Prolog/Makefile.am (1.19),
+	  interfaces/Prolog/XSB/Makefile.am (1.1),
+	  interfaces/Prolog/XSB/ppl_xsb.H (1.1),
+	  interfaces/Prolog/XSB/ppl_xsb.cc (1.1): New Prolog interface.
+
+2002-07-22 Monday 14:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, tests/Makefile.am, tests/polydifference2.cc
+	  (ppl-0_4-branch.[1,1,1]): The corrections of the bug identified
+	  in revisions 1.193 and 1.194 of the HEAD branch are now reported
+	  in the ppl-0_4-branch.  The same for the test that outlighted the
+	  bug.
+
+2002-07-10 Wednesday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/polydifference2.cc (1.3): Don't be noisy.
+
+2002-07-10 Wednesday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.194): Corrected a bug in
+	  poly_difference_assign(const Polyhedron& y).	No longer ignoring
+	  the equality constraints of `y' (the bug was affecting both C and
+	  NNC computations).
+
+2002-07-10 Wednesday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/polydifference2.cc (1.2): Output improved.
+
+2002-07-10 Wednesday 11:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.193): Corrected a bug in
+	  Polyhedron::operator=(...).  When assigning to *this a polyhedron
+	  declared to be empty, we now call set_empty() to also clear the
+	  constraint and generator systems, therefore enforcing the
+	  corresponding invariant.
+
+2002-07-10 Wednesday 11:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.80), polydifference2.cc (1.1): Added a new
+	  test showing two bugs:  - the assignment operator on Polyhedron
+	  breaks the invariant saying that    an empty polyhedron has a
+	  constraint system with either no rows or    a single
+	  unsatisfiable constraint;  - the current implementation of
+	  poly_difference_assign() is wrong in	  that it disregards
+	  equality constraints.
+
+2002-07-03 Wednesday 15:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: fake_main.pl (1.1), ppl_ciao.pl (1.20):
+	  Wrong declarations fixed (thanks to Jose Morales).  The file
+	  fake_main.pl is a kludge to convince ciaoc to produce object code
+	  (the `-c' option is broken in Ciao Prolog 1.8 #2).  Missing
+	  predicate declarations have been added.
+
+2002-07-02 Tuesday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.19): Some bugs have been
+	  fixed.
+
+2002-07-02 Tuesday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.54): Version bumped: we are now in the 0.5 era.
+
+2002-07-02 Tuesday 22:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.53), interfaces/Prolog/Makefile.am (1.18): The
+	  Ciao Prolog interface has been re-enabled.
+
+2002-07-02 Tuesday 21:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.52), Watchdog/configure.ac (1.9): Shared
+	  libraries are again turned off by default.
+
+2002-07-02 Tuesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_4-branch.1), NEWS (1.28): Cut and paste error fixed.
+
+2002-07-01 Monday 18:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_4-branch.1): Update version.
+
+2002-07-01 Monday 18:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog, ChangeLog (ppl-0_4-branch.[1,1]): Mark
+	  ChangeLog.
+
+2002-07-01 Monday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.9): Updated.
+
+2002-07-01 Monday 16:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.11), config.sub (1.10), ltmain.sh (1.5): Updated.
+
+2002-07-01 Monday 08:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.27): Updated.
+
+2002-06-30 Sunday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* STANDARDS (1.4): Use the same form of headings.
+
+2002-06-30 Sunday 22:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.12): Mention the support for NNC polyhedra.  Updated
+	  for PPL 0.4.	Organization of source distributions updated.
+
+2002-06-30 Sunday 22:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.pl (1.16): Bug fixed in
+	  limited_H79_widening_assign.
+
+2002-06-30 Sunday 21:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.15): Mention not necessarily closed convex
+	  polyhedra in the main %description.
+
+2002-06-30 Sunday 20:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: check_script (1.3), expected (1.2): Test
+	  ack.clpq with the easier query `?- ack(2, 1, Z).'.
+
+2002-06-30 Sunday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.defs.hh (1.5), Watchdog.inlines.hh (1.4):
+	  Implementation of inline functions moved to Watchdog.inlines.hh.
+
+2002-06-30 Sunday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/ChangeLog (1.2): This file will no longer be empty.
+
+2002-06-30 Sunday 15:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.51), Watchdog/configure.ac (1.8): Invocations to
+	  AC_PROG_* macros repositioned.
+
+2002-06-30 Sunday 15:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.69): Friend declaration split
+	  differently.
+
+2002-06-30 Sunday 15:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.defs.hh (1.4), Watchdog.inlines.hh (1.3): Use
+	  methods instead of friends for binary operators over Time.
+
+2002-06-30 Sunday 12:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/.cvsignore (1.4), SICStus/.cvsignore
+	  (1.4), SWI/.cvsignore (1.4), YAP/.cvsignore (1.4): Added files to
+	  be ignored.
+
+2002-06-30 Sunday 12:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/.cvsignore (1.3), GNU/.cvsignore (1.3),
+	  SICStus/.cvsignore (1.3), YAP/.cvsignore (1.3): For those
+	  building in the sources' directory.
+
+2002-06-30 Sunday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.50): Make building shared libraries the default.
+
+2002-06-29 Saturday 21:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.60), ppl_prolog.icc
+	  (1.60), Ciao/ppl_ciao.pl (1.18), GNU/ppl_gprolog.pl (1.15),
+	  SICStus/ppl_sicstus_sd.cc (1.22), SWI/ppl_swiprolog.cc (1.46),
+	  YAP/ppl_yap.cc (1.38): Added documentation for Prolog interface
+	  predicates bounds from above/below and moved definitions to
+	  follow that of is_bounded.
+
+2002-06-29 Saturday 14:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.19), ppl_prolog.icc (1.59),
+	  Ciao/ppl_ciao.pl (1.17), GNU/ppl_gprolog.pl (1.14),
+	  SICStus/ppl_sicstus_sd.cc (1.21), SWI/ppl_swiprolog.cc (1.45),
+	  YAP/ppl_yap.cc (1.37): Predicates for bounds_from_above/below
+	  added to Prolog interface.
+
+2002-06-29 Saturday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.41), ppl_c.h (1.37): Added
+	  ppl_Polyhedron_bounds_from_above() and
+	  ppl_Polyhedron_bounds_from_below().
+
+2002-06-29 Saturday 08:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.192), Polyhedron.defs.hh (1.132),
+	  Polyhedron.inlines.hh (1.39): Added bool bounds_from_above(const
+	  LinExpression&) const and bool bounds_from_below(const
+	  LinExpression&) const: both are implemented in terms of the new
+	  bool bounds(const LinExpression& expr, bool from_above) const.
+
+2002-06-28 Friday 22:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.191): Polyhedron::is_bounded() improved.
+
+2002-06-28 Friday 22:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq2.pl (1.21), expected2 (1.5): Undo the
+	  changes corresponding to the last two commits of clpq2.pl and to
+	  the last commit of expected2.
+
+2002-06-28 Friday 17:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq2.pl (1.20), expected2 (1.4): Updated the
+	  expected2 file to match current clpq2.pl clpq2.pl has a minor bug
+	  fixed when writing equality bindings that were not included as
+	  constraints (this does not affect the results of the
+	  check_script2).
+
+2002-06-28 Friday 09:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: memory1.cc (1.5), timings.cc (1.2): Improved error
+	  handling.
+
+2002-06-28 Friday 09:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/memory1.cc (1.4): Cleaned and improved error handling.
+
+2002-06-27 Thursday 09:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.defs.hh (1.60), src/ConSys.inlines.hh (1.22),
+	  src/GenSys.defs.hh (1.74), src/GenSys.inlines.hh (1.24),
+	  tests/NNCminimize1.cc (1.4), tests/NNCminimize2.cc (1.4),
+	  tests/NNCminimize3.cc (1.4), tests/NNCminimize4.cc (1.6): Added
+	  public method clear() to ConSys and GenSys.  Added a FIXME
+	  comment to NNCminimize* tests.
+
+2002-06-27 Thursday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.59), ConSys.inlines.hh (1.21),
+	  Constraint.defs.hh (1.65), Constraint.inlines.hh (1.37),
+	  GenSys.defs.hh (1.73), GenSys.inlines.hh (1.23),
+	  Generator.defs.hh (1.68), Generator.inlines.hh (1.34),
+	  LinExpression.defs.hh (1.47), LinExpression.inlines.hh (1.20):
+	  Added several versions of swap() to cope with the private
+	  inheritance problems caused by the departure of PPL_HIDDEN.
+
+2002-06-27 Thursday 08:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.33): Avoid redefinition of default
+	  arguments.
+
+2002-06-26 Wednesday 19:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.57), GenSys.defs.hh (1.72): Added
+	  std::ostream& operator<<(std::ostream&, const GenSys&) and
+	  std::istream& operator>>(std::istream&, GenSys&).
+
+2002-06-26 Wednesday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.38), ConSys.defs.hh (1.58), Matrix.cc (1.39):
+	  Added std::ostream& operator<<(std::ostream&, const ConSys&) and
+	  std::istream& operator>>(std::istream&, ConSys&).
+
+2002-06-26 Wednesday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.20),
+	  doc/devref-print.doxyconf-latex.in (1.20),
+	  doc/devref.doxyconf-html.in (1.21), interfaces/C/Makefile.am
+	  (1.10), interfaces/C/ppl_c.cc (1.40),
+	  interfaces/Prolog/Ciao/Makefile.am (1.7),
+	  interfaces/Prolog/GNU/Makefile.am (1.23),
+	  interfaces/Prolog/SICStus/Makefile.am (1.28),
+	  interfaces/Prolog/SWI/Makefile.am (1.25),
+	  interfaces/Prolog/YAP/Makefile.am (1.15), src/ConSys.defs.hh
+	  (1.57), src/Constraint.defs.hh (1.64), src/GenSys.defs.hh (1.71),
+	  src/Generator.defs.hh (1.67), src/LinExpression.defs.hh (1.46),
+	  src/Makefile.am (1.44), src/Poly_Con_Relation.defs.hh (1.9),
+	  src/Poly_Gen_Relation.defs.hh (1.8), src/ppl_filter_doxygen.sed
+	  (1.3), src/ppl_filter_install.sed (1.3): PPL_HIDDEN has gone.
+
+2002-06-26 Wednesday 18:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: ConSys.defs.hh (1.56), Constraint.defs.hh (1.63),
+	  GenSys.defs.hh (1.70): Minor improvements to comments (just
+	  English).
+
+2002-06-26 Wednesday 18:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.66), Generator.inlines.hh (1.32),
+	  Makefile.am (1.43): Added new shorthand non-member functions for
+	  creting generators: Generator line(const LinExpression&),
+	  Generator ray(const LinExpression&), Generator point(const
+	  LinExpression&, const Integer&), Generator closure_point(const
+	  LinExpression&, const Integer&).
+
+2002-06-26 Wednesday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.39), Prolog/ppl_prolog.icc (1.58): Use
+	  the new static members of Generator to construct generatos.
+
+2002-06-26 Wednesday 15:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.45): Removed spurious duplicated
+	  declaration (was already commented out).
+
+2002-06-26 Wednesday 15:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.40), Row.defs.hh (1.50), globals.cc (1.8),
+	  globals.hh (1.19): const Integer& operator*(const Constraint&,
+	  const Generator&) and const Integer& reduced_scalar_product(const
+	  Constraint&, const Generator&) moved from Row.* to globals.*.
+
+2002-06-26 Wednesday 14:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.62), Generator.cc (1.35),
+	  Generator.defs.hh (1.65), LinExpression.defs.hh (1.44),
+	  Makefile.am (1.42), Polyhedron.cc (1.190), Row.cc (1.39),
+	  Row.defs.hh (1.49): Started getting rid of preprocessing flag
+	  PPL_HIDDEN (work still in progress - build broken).
+
+2002-06-26 Wednesday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.55), GenSys.defs.hh (1.69): Input and
+	  output operator for Polyhedron made friends of ConSys and GenSys.
+
+2002-06-26 Wednesday 14:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.37): Comment alignment fixed.
+
+2002-06-26 Wednesday 08:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.87): Improved and corrected affine image
+	  paragraph.
+
+2002-06-25 Tuesday 16:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.86): More improvements to paragraph on
+	  affine image operations.
+
+2002-06-25 Tuesday 16:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.85): For uniformity, using \cQ instead of
+	  \cP' in the section about widening.
+
+2002-06-25 Tuesday 16:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.84): Improved the section about
+	  addition/removal of space dimensions.
+
+2002-06-25 Tuesday 16:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.131): The documentation for the swap
+	  function on Polyhedron objects now appears in the user manuals
+	  too.
+
+2002-06-25 Tuesday 15:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.types.hh (1.3): Added comments to `namespace std'.
+
+2002-06-25 Tuesday 15:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.83): Added more on an affine preimage.
+
+2002-06-25 Tuesday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/.cvsignore (1.3), src/.cvsignore (1.6), tests/.cvsignore
+	  (1.5): For those building in the sources' directory.
+
+2002-06-25 Tuesday 15:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.82): Added formal definition of the
+	  time-elapse operator.
+
+2002-06-25 Tuesday 14:16  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.81): Changed rows and columns round in the
+	  affine paragraph.
+
+2002-06-25 Tuesday 14:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.80), src/Polyhedron.defs.hh (1.130):
+	  Adding some references to the introduction to the documentation
+	  of operators.
+
+2002-06-25 Tuesday 14:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.19),
+	  devref-print.doxyconf-latex.in (1.19), devref.doxyconf-html.in
+	  (1.20): No longer including the second part of the introduction
+	  in the devref's manuals, since it is not up-to-date.
+
+2002-06-25 Tuesday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.79): Examples added to explanation of
+	  affine image operator.
+
+2002-06-25 Tuesday 13:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.78): Started explaining the affine
+	  operators.
+
+2002-06-25 Tuesday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.77), src/Polyhedron.defs.hh (1.129): In
+	  the widening and poly-difference comments, using the \anchor
+	  doxygen command to link to a specific paragraph of the
+	  introduction.
+
+2002-06-25 Tuesday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.128): A few docuemntation errors
+	  corrected.  Added a note about methods ending in _and_minimize(),
+	  to explain the menaing of their return value. From all of their
+	  brief doxygen comments, moved the corresponding sentence on their
+	  return value, which is now placed in the detailed doxygen
+	  comment, using the \return command.
+
+2002-06-25 Tuesday 11:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.76): Renamed variables in example in
+	  paragraph wrt adding dimensions.
+
+2002-06-25 Tuesday 11:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.19): Improved version of clpq2.pl:
+	  - Code formatting corrected;    - Unused predicate
+	  definitions removed;	       - Predicates renamed to match
+	  functionality;    - Much more efficient as it projects unwanted
+	  dimensions away;  - Allows input variables to bind to Herbrand
+	  terms;     - Allows integer expressions as input (eg fib(2,
+	  X+1)).
+
+2002-06-25 Tuesday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.75): Added paragraphs on adding and
+	  removing dimensions.
+
+2002-06-25 Tuesday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.18): More tidying of the tests.
+
+2002-06-25 Tuesday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.49): Version number bumped.
+
+2002-06-25 Tuesday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: ConSys.cc (1.36), Generator.defs.hh (1.64), Polyhedron.cc
+	  (1.189), Polyhedron.defs.hh (1.127), conversion.cc (1.29): In all
+	  files, changed reference to Introduction to the relevant section.
+	  In Polyhedron.defs.hh:   - A few minor changes to English
+	  expressions.	 - An x_1 changed to y.
+
+2002-06-25 Tuesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.26), doc/definitions.dox (1.74), interfaces/C/ppl_c.cc
+	  (1.38), interfaces/C/ppl_c.h (1.36),
+	  interfaces/Prolog/Prolog_interface.dox (1.59),
+	  interfaces/Prolog/pl_check.pl (1.17),
+	  interfaces/Prolog/ppl_prolog.icc (1.57),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.16),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.13),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.20),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.44),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.36), src/Polyhedron.cc
+	  (1.188), src/Polyhedron.defs.hh (1.126), tests/.cvsignore (1.4),
+	  tests/Makefile.am (1.79), tests/exceptions1.cc (1.10),
+	  tests/h79widening1.cc (1.1), tests/h79widening2.cc (1.1),
+	  tests/h79widening3.cc (1.1), tests/limitedh79widening1.cc (1.1),
+	  tests/limitedh79widening2.cc (1.1), tests/limitedwideningcc921.cc
+	  (1.2), tests/limitedwideningcc922.cc (1.2), tests/permute.cc
+	  (1.18), tests/wideningcc921.cc (1.3), tests/wideningcc922.cc
+	  (1.3), tests/wideningcc923.cc (1.2): The widening is now called
+	  H79 not to confuse the user.
+
+2002-06-25 Tuesday 06:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.14): %files section for gprolog package fixed.
+
+2002-06-24 Monday 23:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.13): %files section fixed for the yap package.
+
+2002-06-24 Monday 22:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.14): Do not forget
+	  yap_clpq2.pl.
+
+2002-06-24 Monday 21:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.58): Should now contain
+	  all the information need to use the Prolog interface.
+
+2002-06-24 Monday 18:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.187), Polyhedron.defs.hh (1.125): The
+	  detailed comments about class Polyhedron improved.  Better
+	  marking the start of detailed doxygen sections in the
+	  documentation of Polyhedron methods (using /*! ... */ instead of
+	  multi-line //!).  Adjusted a couple of old comments saying that
+	  the return value of minimize() was `true' when the polyhedron is
+	  found to be empty.
+
+2002-06-24 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.22): Added definitions for
+	  libppl_gprolog_la_LIBADD and libppl_gprolog_la_LDFLAGS.
+
+2002-06-24 Monday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.12): The %files sections of each package are now
+	  complete.
+
+2002-06-24 Monday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.57): Dealt with the
+	  issue of initialization and finalization.
+
+2002-06-24 Monday 17:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.21): Install also
+	  ppl_gprolog.pl.
+
+2002-06-24 Monday 17:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.56): Reorganization
+	  started.
+
+2002-06-24 Monday 15:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* NEWS (1.25), STANDARDS (1.3): Minor spelling/grammar corrections.
+
+2002-06-24 Monday 15:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.124), Polyhedron.inlines.hh (1.38):
+	  Adding short doxygen comment to Polyhedron related functions.
+
+2002-06-24 Monday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* STANDARDS (1.2): Sketching the first rules to obtain a somewhat
+	  standard Doxygen documentation style.
+
+2002-06-24 Monday 14:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.186): Polyhedron::remove_dimensions() fixed.
+
+2002-06-24 Monday 14:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/removedim6.cc (1.6): This test was carefully written so as
+	  to cover a bug in the library: fixed.
+
+2002-06-24 Monday 13:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.18): Final delete_Polyhedron for Q
+	  now replaced by cleanup call and by adding polyhedron Q to list
+	  of used polyhedra in head of solve_query.
+
+2002-06-24 Monday 13:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.185), Polyhedron.defs.hh (1.123): Going on
+	  enforcing new rules on doxygen comments of class Polyhedron.
+
+2002-06-24 Monday 12:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.16): Improved layout and
+	  comments.  Simplified and renamed some tests while adding others.
+
+2002-06-24 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.7): Fixed typo in a comment.
+
+2002-06-24 Monday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.48): Effectively disable the
+	  interface/Prolog/Ciao directory.
+
+2002-06-24 Monday 11:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.54), GenSys.defs.hh (1.68),
+	  Generator.defs.hh (1.63): Added examples to ConSys and GenSys
+	  documentation using strict inequalities and closure points.
+	  Improved terminology note point/vertex in Generator.
+
+2002-06-24 Monday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Poly_Con_Relation.defs.hh (1.8): Missing full stop added.
+
+2002-06-24 Monday 08:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.24): Distribute also
+	  ppl_swiprolog.pl.
+
+2002-06-24 Monday 00:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.184), Polyhedron.defs.hh (1.122),
+	  Polyhedron.inlines.hh (1.37): Started uniformizing doxygen
+	  comments of class Polyehdron according to new rules.
+
+2002-06-24 Monday 00:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.inlines.hh (1.20), GenSys.inlines.hh (1.22),
+	  LinExpression.inlines.hh (1.19), Row.inlines.hh (1.27),
+	  SatMatrix.inlines.hh (1.13), SatRow.inlines.hh (1.16): Relating
+	  std::swap functions to the corresponding classes.
+
+2002-06-23 Sunday 22:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.48): Surrounding the   #define
+	  EXTRA_NORMALIZATION 0 with   #ifndef EXTRA_NORMALIZATION.
+
+2002-06-23 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.55), ppl_prolog.icc
+	  (1.56), Ciao/ppl_ciao.cc (1.11), GNU/ppl_gprolog_sd.cc (1.6),
+	  SICStus/ppl_sicstus_sd.cc (1.19), SWI/Makefile.am (1.23),
+	  SWI/ppl_swiprolog.cc (1.43), SWI/ppl_swiprolog.pl (1.1),
+	  YAP/Makefile.am (1.13), YAP/ppl_yap.cc (1.35): Avoid unnecessary
+	  differences in the implementation of the various Prolog
+	  interfaces.  Hook ppl_Prolog_sysdep_deinit() added.
+
+2002-06-23 Sunday 22:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.35), ConSys.defs.hh (1.53), GenSys.cc (1.56),
+	  Matrix.cc (1.38), Matrix.defs.hh (1.28), Matrix.inlines.hh
+	  (1.24): Fixed doxygen comments in class Matrix.  Changed raw
+	  output methods get() and print() to also read/write information
+	  about topology. Changed the corresponding methods of ConSys and
+	  GenSys so that they no longer output this information.
+
+2002-06-23 Sunday 18:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.28), Generator.cc (1.34): Using flag
+	  EXTRA_NORMALIZATION instead of STRONG_NORMALIZATION.
+
+2002-06-23 Sunday 18:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Init.defs.hh (1.3): Added short doxygen comment to class
+	  Init.
+
+2002-06-23 Sunday 18:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.183), tests/timeelapse5.cc (1.2):
+	  Implementation of time_elapse corrected and cleaned.	The test
+	  timeelapse5 corrected according to the new specification.
+
+2002-06-23 Sunday 15:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.17): The Ciao-Prolog interface
+	  will not be included in PPL 0.4.
+
+2002-06-23 Sunday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.12), ppl_yap.cc (1.34),
+	  yap_clpq.pl (1.5), yap_clpq2.pl (1.1): The YAP interface is now
+	  complete and running.
+
+2002-06-22 Saturday 11:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Topology.hh (1.5): Nothing (apart comments) should follow
+	  #endif.
+
+2002-06-22 Saturday 08:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/globals.hh (1.18): Long comment for class Throwable improved.
+	  Function maybe_abandon() related to class Throwable.
+
+2002-06-22 Saturday 08:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.7), Poly_Gen_Relation.defs.hh
+	  (1.7): Comments of *_Relation classes adapted to new doxygen
+	  rules.
+
+2002-06-21 Friday 23:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.52), GenSys.defs.hh (1.67),
+	  Generator.defs.hh (1.62), Topology.hh (1.4): Adapted doxygen
+	  comments of classes ConSys and GenSys to the new style.  Added
+	  short description for the enumeration Topology (in the devref
+	  manual).
+
+2002-06-21 Friday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.35): No longer use __BEGIN_DECLS and
+	  __END_DECLS (so as not to provoke pollution).  Use a brief only
+	  description for the opaque pointers.	Undefine
+	  PPL_TYPE_DECLARATION as soon as we are done with it.
+	  Documentation for all the *_OK() functions improved: they do not
+	  always make noise (if the compilation was done with NDEBUG
+	  defined, they do not make any noise).
+
+2002-06-21 Friday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.defs.hh (1.11): Alignment fixed in a comment.
+
+2002-06-21 Friday 19:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.27), Constraint.defs.hh (1.61),
+	  Constraint.inlines.hh (1.36), Generator.defs.hh (1.61),
+	  LinExpression.defs.hh (1.43): Documentation of classes
+	  LinExpression, Constraint and Generator adapted to the new
+	  doxygen rules.
+
+2002-06-21 Friday 19:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.10), NNC_Polyhedron.defs.hh (1.14):
+	  Avoiding repetitions due to REPEAT_BRIEF = YES.
+
+2002-06-21 Friday 19:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.18),
+	  devref-print.doxyconf-latex.in (1.18), devref.doxyconf-html.in
+	  (1.19), user-browse.doxyconf-latex.in (1.12),
+	  user-print.doxyconf-latex.in (1.12), user.doxyconf-html.in
+	  (1.14): Changed doxygen configuration files so that brief
+	  comments are always repeated at the beginning of long comments
+	  (REPEAT_BRIEF = YES).
+
+2002-06-21 Friday 15:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.9), NNC_Polyhedron.defs.hh (1.13):
+	  For classes C_Polyhedron and NNC_Polyhedron, adopting the new
+	  doxygen standards about brief/long comments.
+
+2002-06-21 Friday 15:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.27), Row.inlines.hh (1.26): Non-friend
+	  but related functions should have the \relates special doxygen
+	  command.
+
+2002-06-21 Friday 15:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.cc (1.9): As things are now, doxygen comments to
+	  friend functions should not have the \relates special command.
+
+2002-06-21 Friday 09:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.47): Use C to test the presence and usability of
+	  <glpk.h>.  Use the new style AC_LANG(LANGUAGE) macro.
+
+2002-06-21 Friday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.20): Additions
+	  MOSTLYCLEANFILES.
+
+2002-06-20 Thursday 22:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.54),
+	  track_allocation.hh (1.6): Prolog allocation tracking properly
+	  reimplemented.
+
+2002-06-20 Thursday 22:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.17): Singleton variable renamed so
+	  as to disable the corresponding warning.
+
+2002-06-20 Thursday 22:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.cc (1.2): Do not redefine the default arguments.
+
+2002-06-20 Thursday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.73): A few improvements in the first
+	  paragraph of the introduction.  Better explained what a preimage
+	  is and some chnages to the paragraph on the DD method.
+
+2002-06-20 Thursday 21:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc (1.38), Row.defs.hh (1.47), Row.inlines.hh (1.25),
+	  SatMatrix.cc (1.17), SatMatrix.defs.hh (1.19),
+	  SatMatrix.inlines.hh (1.12), SatRow.cc (1.8), SatRow.defs.hh
+	  (1.15), SatRow.inlines.hh (1.15), Status.defs.hh (1.17): Added
+	  \relates doxygen commands to match related function declarations
+	  and definitions.
+
+2002-06-20 Thursday 13:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.72): Reordered the bibliography to be
+	  alphabetical.  Changed the syntax in Bounded Polyhedra.  Moved
+	  Rational Polyhedra to end of section on representations (it needs
+	  the definition of constraint representation).  Comment in
+	  Generators Representation wrt this moved to the Rational one.
+	  Small change of wording to Points... paragraph.
+
+2002-06-20 Thursday 13:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.53): Corrected the
+	  grammar rules for Rational and made other changes related to
+	  this.
+
+2002-06-20 Thursday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.37): Functions dealing with closure
+	  points and strict inequalities were still commented out: fixed.
+
+2002-06-20 Thursday 12:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.52): Improvements to
+	  grammar rules.  List_of_Constraints and List_of_Generators now
+	  specified formally as Constraint_System and Generator_System.
+
+2002-06-20 Thursday 12:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.51): Improved
+	  description of "relation with" predicates.
+
+2002-06-20 Thursday 11:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.50): In the grammar
+	  rules Numerator and Denominator are non-terminals and should
+	  start with capitals.
+
+2002-06-20 Thursday 11:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.49): Many improvements,
+	  including: Where comments were repeated elswhere (ie
+	  compatibility rules) they have been removed.	Where possible,
+	  references to relevant sections in the introduction have been
+	  made.  Grammar rule for Relation added.
+
+2002-06-20 Thursday 11:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.71): Improved the paragraph on topological
+	  compatibility.
+
+2002-06-20 Thursday 09:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.16): Cleaned up previous changes.
+
+2002-06-20 Thursday 08:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.15): Revised the way unwanted
+	  polyhedron are removed.  It has not been checked yet for leaks.
+
+2002-06-20 Thursday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.14): PPL is the right acronym in
+	  normal text.
+
+2002-06-20 Thursday 08:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/expected2 (1.3): Corrected with the right
+	  results.
+
+2002-06-20 Thursday 07:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.13): Bug fixed and I hope the
+	  variable ordering is now stable so that the constraints are
+	  presented uniformly in all Prologs.
+
+2002-06-19 Wednesday 23:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.60), Generator.defs.hh (1.60),
+	  Generator.inlines.hh (1.31), Variable.defs.hh (1.19): Using the
+	  \relates doxygen special command to have non-member and
+	  non-friend functions listed in the related classes.
+
+2002-06-19 Wednesday 22:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.55), track_allocation.hh
+	  (1.5): Leave the responsibility of TRACK_ALLOCATION to
+	  track_allocation.hh.
+
+2002-06-19 Wednesday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.12): A couple of trivial formatting
+	  changes.
+
+2002-06-19 Wednesday 20:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.20), STANDARDS (1.1): The `STANDARDS' file will
+	  contain a description of our coding standards.
+
+2002-06-19 Wednesday 20:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq.pl (1.12), clpq2.pl (1.11): Use a
+	  uniform coding style.
+
+2002-06-19 Wednesday 18:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.19): Use the 2nd CLP(Q)
+	  interpreter for regression testing.
+
+2002-06-19 Wednesday 18:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.22): Fixed the dependencies
+	  of the `check-local' target.
+
+2002-06-19 Wednesday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.10): Fixed calls meant to be to
+	  ppl_delete_Polyhedron/1.
+
+2002-06-19 Wednesday 18:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: expected2 (1.2), check_script2 (1.2):
+	  Trailing blank line removed.
+
+2002-06-19 Wednesday 17:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.48): Many ongoing
+	  changes.
+
+2002-06-19 Wednesday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.16): Distributes also
+	  check_script2 and expected2.
+
+2002-06-19 Wednesday 16:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.47): Corrected a typo
+	  in the first paragraph about the SICStus Prolog interface.
+
+2002-06-19 Wednesday 16:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.34): Corrected a typo in the
+	  documentation of PPL_CONSTRAINT_TYPE_GREATER_THAN.
+
+2002-06-19 Wednesday 16:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.18): Adjusted comment about the
+	  constructor.
+
+2002-06-19 Wednesday 16:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.70): Improvements to the space dimension
+	  and the relation with paragraphs.
+
+2002-06-19 Wednesday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.121), globals.hh (1.17): Added a
+	  short description for class Throwable.  Corrected a typo in
+	  comment for remove_dimensions.
+
+2002-06-19 Wednesday 15:18  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.69): Bounding box paragraph improved a
+	  little.
+
+2002-06-19 Wednesday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.68): Corrected spurious uses of the macro
+	  \mathord.  Some improvements in the paragraph on bounding boxes:
+	  the standard notation for the i-th vector of the canonical base
+	  is \vect{e}_i.
+
+2002-06-19 Wednesday 14:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.67): Changes to relation-wirh and widening
+	  paragraphs.
+
+2002-06-19 Wednesday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/sp_clpq.pl (1.7): Import append/3 and
+	  member/2 from library(lists).
+
+2002-06-19 Wednesday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/clpq2.pl (1.9): Avoid defining append/3 and
+	  member/2, since they are defined as built-ins or provided as
+	  library predicates by any supported Prolog implementation
+	  (SWI-Prolog seems to be annoyed if a user program tries to
+	  redefine them).
+
+2002-06-19 Wednesday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.4): Upgraded from the CVS version of libtool.
+
+2002-06-19 Wednesday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.27), sp_clpq.pl (1.6):
+	  Use the 2nd CLP(Q) interpreter for regression testing.
+
+2002-06-19 Wednesday 14:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Makefile.am (1.15): Distribute also the tests
+	  for strict inequalities.
+
+2002-06-19 Wednesday 14:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.66): Changes in the paragraph on the
+	  relation-with operators.
+
+2002-06-19 Wednesday 13:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.18), SWI/Makefile.am
+	  (1.21): Use the configured version of libtool.
+
+2002-06-19 Wednesday 11:43  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.46): Changed the
+	  description for the assignment predicates.
+
+2002-06-19 Wednesday 11:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.65): A first draft for a paragraph on the
+	  relation-with operators.
+
+2002-06-19 Wednesday 10:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.64): Using the macro \nonnegRset in the
+	  paragraph defiing extreme rays.
+
+2002-06-19 Wednesday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.63), ppl.sty (1.10): Some improvements
+	  in the introduction. Redefined the command \vec following
+	  llncs.cls.
+
+2002-06-19 Wednesday 08:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.45), pl_check.pl
+	  (1.15), ppl_prolog.icc (1.54), Ciao/ppl_ciao.pl (1.15),
+	  GNU/ppl_gprolog.pl (1.12), SICStus/ppl_sicstus_sd.cc (1.18),
+	  SWI/ppl_swiprolog.cc (1.42), YAP/ppl_yap.cc (1.33): Predicates
+	  ppl_Polyhedron_topological_closure_assign and
+	  ppl_Polyhedron_is_topologically_closed added.
+
+2002-06-19 Wednesday 08:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.36), interfaces/C/ppl_c.h (1.33),
+	  src/Polyhedron.defs.hh (1.120): Added topological closure test
+	  and assignment to the C interface.
+
+2002-06-19 Wednesday 07:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/schedule.clpq (1.3): Use a uniform syntax.
+
+2002-06-19 Wednesday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/Makefile.am (1.11): Checking mechanism
+	  fixed (but still commented out).
+
+2002-06-19 Wednesday 07:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: check_script2 (1.1), expected2 (1.1),
+	  SWI/Makefile.am (1.20): Test also with clpq2.pl.
+
+2002-06-19 Wednesday 07:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq.pl (1.11), clpq2.pl (1.8): Improved the
+	  query for more solutions.
+
+2002-06-18 Tuesday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.14): Use
+	  use_foreign_library/1 instead of use_foreign_source/1.
+
+2002-06-18 Tuesday 17:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.53): Indentation fixed.
+
+2002-06-18 Tuesday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/ppl_ciao.pl (1.13): Declarations
+	  completed.
+
+2002-06-18 Tuesday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.62): Corrected a typo in the definition of
+	  closed polyhedra.  Improved the paragraph on dimension
+	  compatibility to make it independent from th epolyhedra topology.
+
+2002-06-18 Tuesday 15:51  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.7): Just a little more robust in
+	  that it fails if there are variables in non-integer positions in
+	  a query rather than crashing.
+
+2002-06-18 Tuesday 15:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.14): Tidied the tests on
+	  bounding boxes.
+
+2002-06-18 Tuesday 14:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.44), pl_check.pl
+	  (1.13), ppl_prolog.icc (1.52), Ciao/ppl_ciao.pl (1.12),
+	  GNU/ppl_gprolog.pl (1.11), SICStus/ppl_sicstus_sd.cc (1.17),
+	  SWI/ppl_swiprolog.cc (1.41), YAP/ppl_yap.cc (1.32):
+	  ppl_new_Polyhedron_from_ConSys and ppl_new_Polyhedron_from_GenSys
+	  renamed ppl_new_Polyhedron_from_constraints and
+	  ppl_new_Polyhedron_from_generators, respectively.
+
+2002-06-18 Tuesday 12:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.61): Added a preamble based on the ppl
+	  home web page.
+
+2002-06-18 Tuesday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.60): Reorganised the introductory
+	  sections.
+
+2002-06-18 Tuesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.35): Corrected a trivial bug just
+	  introduced in   Constraint operator>(const LinExpression& e1,
+	  const LinExpression& e2).
+
+2002-06-18 Tuesday 10:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/schedule.clpq (1.2): Improved layout.
+
+2002-06-18 Tuesday 10:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq2.pl (1.6), schedule.clpq (1.1): clpq2.pl
+	  now allows Herbrand terms as arguments including lists.
+	  schedule.clpq tests the strict inequalities in clpq2.pl
+
+2002-06-18 Tuesday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.34): Avoiding the creation of
+	  temporaries in   Constraint operator>(const LinExpression& e1,
+	  const LinExpression& e2)   Constraint operator>(const Integer& n,
+	  const LinExpression& e)   Constraint operator>(const
+	  LinExpression& e, const Integer& n).
+
+2002-06-18 Tuesday 08:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.59): Paragraph for widening improved.
+	  Paragraph for time-elapse added (just a reference to the 1997
+	  Halbwachs paper).
+
+2002-06-18 Tuesday 07:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.31): Code for testing YAP
+	  exceptions temporarily included.
+
+2002-06-18 Tuesday 00:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.182), Polyhedron.defs.hh (1.119): Private
+	  methods strongly_minimize* now return a boolean which is false if
+	  the result is an empty polyhedron (this is consistent with the
+	  behavior of private method minimize()).  Patched method
+	  widening_CC92_assign() to also work for NNC polyhedra.
+
+2002-06-17 Monday 23:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.10), ppl_yap.pl (1.5),
+	  yap_clpq.pl (1.4): Some progress in the support for YAP.
+
+2002-06-17 Monday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.37), Row.defs.hh (1.46), Row.inlines.hh (1.24):
+	  The NDEBUG symbol no longer changes data layout.  Now, to obtain
+	  a version of Row where each object remembers its own capacity,
+	  the macro EXTRA_ROW_DEBUG must evaluate to true (whether this
+	  capacity is tested in run-time assertions or not depends, as
+	  usual, on the NDEBUG macro not being or being defined).
+
+2002-06-17 Monday 18:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.78), wideningcc921.cc (1.2),
+	  wideningcc922.cc (1.2), wideningcc923.cc (1.1): Added a new tests
+	  showing a bug in the current implementation of
+	  widening_CC92_assign, when the arguments are NNC polyhedra.
+	  Corrected the output of the other widening tests.
+
+2002-06-17 Monday 18:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.33), LinExpression.cc (1.12),
+	  LinExpression.defs.hh (1.42), LinExpression.inlines.hh (1.18):
+	  Added LinExpression& operator-=(LinExpression& e1, const
+	  LinExpression& e2), LinExpression& operator-=(LinExpression& e,
+	  const Variable& v), and LinExpression& operator-=(LinExpression&
+	  e, const Integer& n).  Useless creation of a temporary avoided
+	  thanks to the second of those.
+
+2002-06-17 Monday 17:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.58),
+	  interfaces/Prolog/Prolog_interface.dox (1.43): Added the
+	  condition that the CC92-widening requires the polyhedra to have
+	  the same topology.
+
+2002-06-17 Monday 17:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.23): We now have complete support for bounding boxes.
+	  List a couple of pending efficiency issues.
+
+2002-06-17 Monday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.57), interfaces/C/ppl_c.h (1.32),
+	  interfaces/Prolog/Prolog_interface.dox (1.42), src/Polyhedron.cc
+	  (1.181), src/Polyhedron.defs.hh (1.118): Added a draft paragraph
+	  about widening (and CC92-widening) to definitions.dox.  Replaced
+	  "widening" by CC92-widening" in the comments about the widening
+	  operators.
+
+2002-06-17 Monday 16:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.55), Polyhedron.cc (1.180): All the FIXME's in
+	  Polyhedron.cc and GenSys.cc transformed into TODO's, since they
+	  were just place-holders for possible performance improvements.
+
+2002-06-17 Monday 16:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.35), ppl_c.h (1.31): Added interfaces
+	  function for the copy constructors of classes Constraint and
+	  Generators and for the constructors of a LinExpression from a
+	  Constraint/Generator.
+
+2002-06-17 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.pl (1.10): The two widening
+	  predicates have been renamed.
+
+2002-06-17 Monday 15:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.24), interfaces/C/ppl_c.cc (1.34), interfaces/C/ppl_c.h
+	  (1.30), interfaces/Prolog/Prolog_interface.dox (1.41),
+	  interfaces/Prolog/pl_check.pl (1.12),
+	  interfaces/Prolog/ppl_prolog.icc (1.51),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.11),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.16),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.40),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.30), src/Polyhedron.cc
+	  (1.179), src/Polyhedron.defs.hh (1.117), tests/.cvsignore (1.3),
+	  tests/Makefile.am (1.77), tests/exceptions1.cc (1.9),
+	  tests/limitedwidening1.cc (1.8), tests/limitedwidening2.cc (1.5),
+	  tests/limitedwideningcc921.cc (1.1),
+	  tests/limitedwideningcc922.cc (1.1), tests/permute.cc (1.17),
+	  tests/widening1.cc (1.5), tests/widening2.cc (1.3),
+	  tests/wideningcc921.cc (1.1), tests/wideningcc922.cc (1.1):
+	  Widening methods, functions and test programs renamed so as to
+	  make clear that (currently) our widenings are extensions of the
+	  one proposed in the PLILP'92 paper by Cousot & Cousot.
+
+2002-06-17 Monday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.29): Added comment to functions building
+	  polyhedra from bounding boxes.
+
+2002-06-17 Monday 12:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq.pl (1.10): clpq.pl only uses C polyhedron
+	  again.
+
+2002-06-17 Monday 12:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.8), NNC_Polyhedron.defs.hh (1.12),
+	  Polyhedron.defs.hh (1.116), globals.hh (1.16): Added
+	  documentation for constructor of C_ and NNC_ polyhedra out of a
+	  bounding box.  The comment on the C_Polyhedron destructor is now
+	  a proper doxygen comment.  Added a short description doc for
+	  struct FromBoundingBox to avoid cluttering the ``PPL Compound
+	  List'' page.
+
+2002-06-17 Monday 11:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.41): Corrected typo in documentation
+	  of   explicit LinExpression(const Generator& g);
+
+2002-06-17 Monday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.115): Improved documentation of
+	  poly_difference_assign* methods, stating that topological closure
+	  is enforced when *this is a C_Polyhedron.
+
+2002-06-17 Monday 10:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.40): Constructors of a LinExpression
+	  out of a Constraint/Generator made public.  Added a more detailed
+	  comment about the unicity of the built expression.
+
+2002-06-17 Monday 10:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.32): Removed FIXME's about the
+	  efficiency of row-type setting methods.
+
+2002-06-17 Monday 08:59  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.40), clpq.pl (1.9):
+	  clpq.pl is updated to allow for strict constraints.  Improved
+	  comments for new polyhedron predicates from consys, gensys and
+	  boxes.
+
+2002-06-17 Monday 08:47  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.56): Paragraphs on intervals and bounding
+	  boxes improved.
+
+2002-06-17 Monday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.5), Watchdog.defs.hh (1.3): Use #ifdef
+	  to test configuration symbols that may be undefined or defined to
+	  1.
+
+2002-06-17 Monday 08:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.37): It is non-standard to omit the second
+	  argument of std::vector::iterator std::vector::insert(iterator
+	  position, const T& x).
+
+2002-06-17 Monday 07:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.inlines.hh (1.19), Constraint.cc (1.26),
+	  Constraint.inlines.hh (1.31), GenSys.inlines.hh (1.21),
+	  Generator.inlines.hh (1.30), LinExpression.inlines.hh (1.17),
+	  Row.defs.hh (1.45): Reduce our dependence on the PPL_HIDDEN
+	  trick.
+
+2002-06-16 Sunday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.h (1.28): Remove non-standard trailing comma.
+
+2002-06-16 Sunday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.30), Generator.inlines.hh (1.29),
+	  Matrix.inlines.hh (1.23), Polyhedron.inlines.hh (1.36),
+	  Row.inlines.hh (1.23): Make sure the first use of each inline
+	  function follows its definition.
+
+2002-06-16 Sunday 20:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.26): Modified SICStus
+	  interface makefile to find the ppl library even when this has not
+	  been installed yet.
+
+2002-06-16 Sunday 19:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.51), GenSys.defs.hh (1.66),
+	  LinExpression.defs.hh (1.39): Reposition friend declarations.
+	  Always put the public section before the protected one before the
+	  private one.
+
+2002-06-16 Sunday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.38): LinExpression(const
+	  Constraint&) and LinExpression(const Generator&) made private
+	  again, since they expose the library's internals.
+
+2002-06-16 Sunday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.54), Polyhedron.cc (1.178), minimize.cc
+	  (1.21), simplify.cc (1.16): No space before question mark in
+	  comments.
+
+2002-06-16 Sunday 18:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: generators1.cc (1.6), generators2.cc (1.3): Include
+	  <stdexcept>.
+
+2002-06-16 Sunday 17:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.25), Constraint.inlines.hh (1.29),
+	  Polyhedron.cc (1.177): Removed CHECKME comments from a few
+	  methods of classes Constraint and Polyhedron. A few FIXME changed
+	  to CHECKME.
+
+2002-06-16 Sunday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.cc (1.2): Replace `and' by `&&'.
+
+2002-06-16 Sunday 17:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.defs.hh (1.2), BoundingBox.inlines.hh (1.3),
+	  C_Polyhedron.defs.hh (1.7), ConSys.defs.hh (1.50),
+	  Constraint.defs.hh (1.59), GenSys.defs.hh (1.65),
+	  Generator.defs.hh (1.59), Init.defs.hh (1.2), Integer.defs.hh
+	  (1.4), Interval.defs.hh (1.4), LinExpression.defs.hh (1.37),
+	  Matrix.defs.hh (1.26), NNC_Polyhedron.defs.hh (1.11),
+	  Poly_Con_Relation.defs.hh (1.6), Poly_Gen_Relation.defs.hh (1.6),
+	  Polyhedron.defs.hh (1.114), Row.defs.hh (1.44), SatMatrix.defs.hh
+	  (1.18), SatRow.defs.hh (1.14), Status.defs.hh (1.16),
+	  Variable.defs.hh (1.17): Use uniform guards against multiple
+	  inclusion.  Include Interval.defs.hh in BoundingBox.defs.hh.
+
+2002-06-16 Sunday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.inlines.hh (1.22), SatRow.inlines.hh (1.14): Fully
+	  qualify `vector' as `std::vector'.
+
+2002-06-16 Sunday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.3), interfaces/C/ppl_c.cc (1.33): Include
+	  <stdexcept>.
+
+2002-06-16 Sunday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.inlines.hh (1.28), Integer.inlines.hh (1.4),
+	  LinExpression.defs.hh (1.36), LinExpression.inlines.hh (1.16):
+	  Remove unnecessary include files and add some necessary one.
+
+2002-06-16 Sunday 16:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.inlines.hh (1.2), C_Polyhedron.inlines.hh
+	  (1.6), ConSys.inlines.hh (1.18), Constraint.inlines.hh (1.28),
+	  GenSys.inlines.hh (1.20), Generator.inlines.hh (1.27),
+	  Init.inlines.hh (1.2), Integer.inlines.hh (1.3),
+	  LinExpression.inlines.hh (1.15), Matrix.inlines.hh (1.22),
+	  NNC_Polyhedron.inlines.hh (1.8), Poly_Con_Relation.inlines.hh
+	  (1.6), Poly_Gen_Relation.inlines.hh (1.6), Polyhedron.inlines.hh
+	  (1.35), Row.inlines.hh (1.21), SatMatrix.inlines.hh (1.11),
+	  SatRow.inlines.hh (1.13), Status.inlines.hh (1.8),
+	  Variable.inlines.hh (1.9): Guard against multiple inclusion.
+
+2002-06-16 Sunday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.49), GenSys.defs.hh (1.64),
+	  LinExpression.defs.hh (1.35), Matrix.defs.hh (1.25),
+	  Variable.defs.hh (1.16): Avoid being pedantic when commenting
+	  constructors.
+
+2002-06-16 Sunday 15:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.48), GenSys.defs.hh (1.63): All the OK()
+	  methods must be public.
+
+2002-06-16 Sunday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.17),
+	  doc/devref-print.doxyconf-latex.in (1.17),
+	  doc/devref.doxyconf-html.in (1.18), interfaces/C/Makefile.am
+	  (1.9), interfaces/Prolog/Ciao/Makefile.am (1.6),
+	  interfaces/Prolog/GNU/Makefile.am (1.17),
+	  interfaces/Prolog/SICStus/Makefile.am (1.25),
+	  interfaces/Prolog/SWI/Makefile.am (1.19),
+	  interfaces/Prolog/YAP/Makefile.am (1.9), src/ConSys.defs.hh
+	  (1.47), src/Constraint.defs.hh (1.58), src/GenSys.defs.hh (1.62),
+	  src/Generator.defs.hh (1.58), src/LinExpression.defs.hh (1.34),
+	  src/Makefile.am (1.41), src/Polyhedron.defs.hh (1.113),
+	  src/Row.defs.hh (1.43), src/ppl_filter_doxygen.sed (1.2),
+	  src/ppl_filter_install.sed (1.2): PPL_INTERNAL has gone: replaced
+	  with `private' everywhere.
+
+2002-06-16 Sunday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.24), sp_clpq.pl (1.5):
+	  Simplify `make check' in the SICStus directory and solve a `make
+	  distcheck' problem.
+
+2002-06-16 Sunday 08:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.16): Generation of gp_clpq
+	  fixed.
+
+2002-06-16 Sunday 00:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.50), src/ConSys.cc (1.34),
+	  src/ConSys.defs.hh (1.46), src/ConSys.inlines.hh (1.17),
+	  src/Constraint.defs.hh (1.57), src/GenSys.cc (1.53),
+	  src/GenSys.defs.hh (1.61), src/GenSys.inlines.hh (1.19),
+	  src/Generator.defs.hh (1.57), src/LinExpression.defs.hh (1.33),
+	  src/Makefile.am (1.40), src/Polyhedron.defs.hh (1.112),
+	  src/Polyhedron.inlines.hh (1.34): Phasing out PPL_INTERNAL.
+
+2002-06-15 Saturday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: memory1.cc (1.3), watchdog1.cc (1.8): Be quiet.
+
+2002-06-15 Saturday 18:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.32), interfaces/Prolog/ppl_prolog.icc
+	  (1.49), src/C_Polyhedron.defs.hh (1.6),
+	  src/C_Polyhedron.inlines.hh (1.5), src/ConSys.defs.hh (1.45),
+	  src/Constraint.defs.hh (1.56), src/GenSys.defs.hh (1.60),
+	  src/NNC_Polyhedron.defs.hh (1.10), src/NNC_Polyhedron.inlines.hh
+	  (1.7), tests/boundingbox2.cc (1.7): Start replacing our ad hoc
+	  protection mechanisms with friendship.  Got around the GCC bug
+	  described in http://gcc.gnu.org/bugs.html#known by exchanging the
+	  order of arguments in the constructors from bounding boxes of
+	  C_Polyhedron and NNC_Polyhedron.  The test program
+	  boundingbox2.cc has been cleaned up consequently.
+
+2002-06-15 Saturday 17:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.3): Revert previous change: the CVS version of
+	  libtool causes more problems than it solves.
+
+2002-06-15 Saturday 17:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.76): Always distribute the sources for
+	  watchdog1.
+
+2002-06-15 Saturday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ltmain.sh (1.2), missing (1.4): Updated to the CVS version of
+	  libtool.
+
+2002-06-15 Saturday 14:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.6): For those building in the sources' directory.
+
+2002-06-15 Saturday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/Makefile.am (1.5): dist-hook goes into the unconditional
+	  section.
+
+2002-06-15 Saturday 14:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.75): Always distribute $(watchdog1_SOURCES).
+
+2002-06-15 Saturday 14:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/.cvsignore (1.3), tests/.cvsignore (1.2):
+	  For those building in the sources' directory.
+
+2002-06-15 Saturday 13:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc (1.9), NNC_Polyhedron.defs.hh (1.9),
+	  Polyhedron.cc (1.176): Corrected method
+	  Polyhedron::limited_widening_assign to work with NNC polyehdra.
+	  Removed the overriding method from NNC_Polyhedron.
+
+2002-06-15 Saturday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.55): Added comment for
+	  construct_eps_geq_zero().
+
+2002-06-15 Saturday 12:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/.cvsignore (1.2), GNU/.cvsignore (1.2),
+	  SWI/.cvsignore (1.2), YAP/.cvsignore (1.2), YAP/ppl_yap.cc
+	  (1.29), YAP/yap_clpq.pl (1.3): Minor changes to YAP support.
+	  Changes for those building in the sources' directory.
+
+2002-06-15 Saturday 12:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.23): Removed
+	  ppl_sicstus.pl and sp_clpq.pl from MOSTLYCLEANFILES.
+
+2002-06-14 Friday 23:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.28): Support for YAP almost
+	  completed.
+
+2002-06-14 Friday 23:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.48): Include initializer.hh.
+
+2002-06-14 Friday 23:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/initializer.hh (1.2): Added the guard against multiple
+	  inclusion.  Include Init.defs.hh.
+
+2002-06-14 Friday 20:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.44), Constraint.defs.hh (1.54),
+	  GenSys.defs.hh (1.59): Temporary kludges removed.
+
+2002-06-14 Friday 19:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.47), Ciao/Makefile.am
+	  (1.5), Ciao/ppl_ciao.cc (1.10), GNU/Makefile.am (1.15),
+	  GNU/ppl_gprolog_sd.cc (1.5), SICStus/Makefile.am (1.22),
+	  SICStus/ppl_sicstus_sd.cc (1.15), SWI/Makefile.am (1.18),
+	  SWI/ppl_swiprolog.cc (1.39), YAP/Makefile.am (1.8),
+	  YAP/ppl_yap.cc (1.27): Include the true sources.
+
+2002-06-14 Friday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.26): Prolog_raise_exception()
+	  written.
+
+2002-06-14 Friday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Interval.defs.hh (1.3), Interval.inlines.hh (1.4): Provide
+	  a copy constructor and assignment operator for ExtendedRational.
+
+2002-06-14 Friday 18:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.16): Made it quiet and corrected a
+	  comment.
+
+2002-06-14 Friday 18:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: boundingbox1.cc (1.15), boundingbox2.cc (1.6): Test file
+	  boundingbox1.cc tidied.  Small changes to comments in
+	  boundingbox2.cc.
+
+2002-06-14 Friday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.2), BoundingBox.defs.hh (1.1),
+	  BoundingBox.hh (1.7), BoundingBox.inlines.hh (1.1),
+	  BoundingBox.types.hh (1.1), Interval.defs.hh (1.2),
+	  Interval.inlines.hh (1.3), Makefile.am (1.39),
+	  Polyhedron.inlines.hh (1.33): template <class Box> void
+	  Polyhedron::shrink_bounding_box(Box&) redesigned and simplified.
+	  Many other improvements in the code for dealing with bounding
+	  boxes.
+
+2002-06-14 Friday 17:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox2.cc (1.5): Made boundingbox2.cc quiet.
+
+2002-06-14 Friday 16:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox2.cc (1.4): Some tidying of the tests.
+
+2002-06-14 Friday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.55), src/Polyhedron.cc (1.175),
+	  src/Polyhedron.defs.hh (1.111): Removed strange mixing of short
+	  and detailed style doxygen comments, that was causing a warning
+	  when building the documentation.  Improved the user introduction,
+	  adding definition of poly-differences.
+
+2002-06-14 Friday 12:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.46): Added to
+	  term_to_boundary checks that the input numerator and denominator
+	  are integers and that the denominator is positive.
+
+2002-06-14 Friday 10:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.45):
+	  ppl_new_Polyhedron_from_bounding_box() fixed and simplified.
+
+2002-06-14 Friday 10:15  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.39): Added a short
+	  description for new_Polyhedron_from_bounding_box.
+
+2002-06-14 Friday 09:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.11), ppl_prolog.icc (1.44):
+	  Some tidying of the code for
+	  ppl_new_Polyhedron_from_bounding_box.
+
+2002-06-14 Friday 08:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox2.cc (1.3): Some bugs fixed.
+
+2002-06-13 Thursday 22:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.43): Fixed two occurrences of
+	  assignment where a test for equality was intended.
+
+2002-06-13 Thursday 16:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.42): In
+	  ppl_new_Polyhedron_from_bounding_box it now fails (ie
+	  PROLOG_FAILURE is returned) if the list is not properly
+	  terminated or it is not a list.  A few comments added to the
+	  code.
+
+2002-06-13 Thursday 16:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.10), ppl_prolog.icc (1.41),
+	  Ciao/ppl_ciao.pl (1.10), GNU/ppl_gprolog.pl (1.9),
+	  SICStus/ppl_sicstus_sd.cc (1.14), YAP/ppl_yap.cc (1.25):
+	  Completed the code for ppl_new_Polyhedron_from_bounding_box/3.
+
+2002-06-13 Thursday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.38): Prepare to explain
+	  the not-so-easy situation with GNU Prolog.
+
+2002-06-13 Thursday 13:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.cc (1.1), BoundingBox.hh (1.6): Start
+	  completing the BoundingBox class.
+
+2002-06-13 Thursday 12:42  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: boundingbox1.cc (1.14), boundingbox2.cc (1.2): More tests
+	  added.
+
+2002-06-13 Thursday 11:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.32), tests/Makefile.am (1.74),
+	  tests/boundingbox2.cc (1.1): A bug corrected in the constructor
+	  of a Polyhedron from a Box.  Added a new test boundingbox2.
+
+2002-06-13 Thursday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.hh (1.5): Fixed two bugs whereby call-by-value
+	  was used instead of call-by-reference.
+
+2002-06-12 Wednesday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.38):
+	  ppl_new_Polyhedron_from_bounding_box/3 added.
+
+2002-06-12 Wednesday 17:29  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.40): A start in completing
+	  ppl_new_Polyhedron_from_bounding_box.
+
+2002-06-12 Wednesday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: pl_clpq.cc (1.5), ppl_pl.cc (1.5),
+	  ppl_swiprolog.cc (1.37): Also uninstall() "returns" install_t.
+
+2002-06-12 Wednesday 14:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: pl_clpq.cc (1.4), ppl_pl.cc (1.4),
+	  ppl_swiprolog.cc (1.36): Make sure the library is always
+	  uninstalled.
+
+2002-06-12 Wednesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.11): Added file list for package gprolog.  Updated
+	  file list for package swi.
+
+2002-06-12 Wednesday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.17): Create dynamic
+	  libraries but link statically until we understand whether and if
+	  libtool can be made to interoperate with plld.
+
+2002-06-12 Wednesday 10:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.14): Create dynamic
+	  libraries but link statically until we understand whether and if
+	  libtool can be made to interoperate with gplc.
+
+2002-06-12 Wednesday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.37): Started writing
+	  the documentation for the GNU Prolog interface.
+
+2002-06-12 Wednesday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.15): Document struct From_Bounding_Box.
+
+2002-06-11 Tuesday 17:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.54): Added a few words on the double
+	  description method.  Adjusted capitalizations.
+
+2002-06-11 Tuesday 15:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.52), Polyhedron.cc (1.174): Enforcing
+	  normalization of constraints and generators in Polyhedron methods
+	  strongly_minimize_generators(), add_generator(),
+	  time_elapse_assign()	 and topological_closure_assign(); the same
+	  for method GenSys::add_corresponding_closure_points().
+
+2002-06-11 Tuesday 12:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.24), Constraint.defs.hh (1.53),
+	  Generator.cc (1.33): Added method Constraint::OK() to check for
+	  normalization of constraints.  Added the same check to method
+	  Generator::OK().
+
+2002-06-11 Tuesday 11:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.51), GenSys.defs.hh (1.58), GenSys.inlines.hh
+	  (1.18), Polyhedron.cc (1.173): Added method
+	  GenSys::const_iterator::skip_forward(): if the generator
+	  currently pointed is a closure point and the next generator is
+	  the point matching this closure point, then it skips to the next
+	  generator. This method is used to skip redundant closure points
+	  when iterating through strongly-minimized generator systems.
+	  Added note to Polyhedron::strongly_minimize_generators() stating
+	  that the approach is correct if the generator system is sorted.
+
+2002-06-11 Tuesday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.defs.hh (1.43): Corrected comment to the method
+	  skip_forward().
+
+2002-06-11 Tuesday 11:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh (1.27), Generator.cc (1.32):
+	  Enforcing the normalization of constraints and generators.
+
+2002-06-11 Tuesday 09:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.53), ppl.sty (1.9): Better explaning
+	  affine transformations.
+
+2002-06-11 Tuesday 09:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.36), pl_check.pl
+	  (1.9): Grammar for boxes and description of
+	  ppl_Polyhedron_get_bounding_box improved.
+
+2002-06-11 Tuesday 08:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.52): Added a paragraph on topologies and
+	  topological compatibility.
+
+2002-06-10 Monday 19:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.21): Fix packaging
+	  problem.
+
+2002-06-10 Monday 19:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.13): Updated so as to abide by the new
+	  interfaces.
+
+2002-06-10 Monday 18:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.31), interfaces/C/ppl_c.h (1.27),
+	  src/BoundingBox.hh (1.4), src/ConSys.defs.hh (1.42),
+	  src/Polyhedron.defs.hh (1.110), src/Polyhedron.inlines.hh (1.31):
+	  This should be the final version of the interfaces for dealing
+	  with bounding boxes.
+
+2002-06-10 Monday 18:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.51): Several improvements and a few
+	  corrections.
+
+2002-06-10 Monday 17:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.109), Polyhedron.inlines.hh (1.30):
+	  Improvements to the documentation of template <class Box>
+	  Polyhedron::Polyhedron(Topology topol, const Box& box).
+
+2002-06-10 Monday 17:09  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.50): A first attempt to define intervals,
+	  boxes and bounding boxes.
+
+2002-06-10 Monday 16:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.108), Polyhedron.inlines.hh (1.29):
+	  Finished the implementation of constructor   template <class Box>
+	  Polyhedron(Topology topol, const Box& box); Changed comments to
+	  require that class Box provides a method   bool is_empty();
+
+2002-06-10 Monday 15:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.49): Minor improvements and bug fixed in
+	  paragraph on the generators representation.
+
+2002-06-10 Monday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.28): Avoid a couple of compiler's
+	  warnings.
+
+2002-06-10 Monday 13:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.35): Added grammar for
+	  intervals and description for ppl_Polyhedron_get_bounding_box/2
+
+2002-06-10 Monday 11:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.12): Now it exits with return value 1 if
+	  the boxes are not as expected.
+
+2002-06-10 Monday 11:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.39), src/BoundingBox.hh
+	  (1.3), src/ConSys.defs.hh (1.41), src/Constraint.defs.hh (1.52),
+	  src/GenSys.defs.hh (1.57): ppl_new_Polyhedron_from_bounding_box/3
+	  sketched.  Class Parma_Polyhedra_Library::BoundingBox fixed.
+	  Inserted several temporary kludges related to the interaction of
+	  templates, access control, and the way we produce ppl_install.hh.
+
+2002-06-10 Monday 10:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.5): clpq2.pl now can handle strict
+	  constraints.
+
+2002-06-10 Monday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/BoundingBox.hh (1.2): Complete this implementation of
+	  bounding boxes.
+
+2002-06-10 Monday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.107): Fix the comment fix.
+
+2002-06-10 Monday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.106): Comment fixed.
+
+2002-06-10 Monday 09:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.11): Added operator==() and operator!=()
+	  for BInterval and BBox.
+
+2002-06-10 Monday 09:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.38): Formatting changes.
+
+2002-06-10 Monday 09:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.10): Further small improvements to test
+	  file boundingbox1.cc
+
+2002-06-10 Monday 08:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/clpq2.pl (1.4), tests/boundingbox1.cc (1.9):
+	  boundingbox1.cc is improved but needs further testing.  clpq2.pl
+	  now works with changed interface predicates.
+
+2002-06-10 Monday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.9): Only declarations here.
+
+2002-06-09 Sunday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.105): Useless `explicit' qualification
+	  removed.
+
+2002-06-09 Sunday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.14), ppl_prolog.pl (1.4),
+	  GNU/Makefile.am (1.13), GNU/ppl_gprolog.pl (1.8),
+	  GNU/ppl_gprolog_sd.pl (1.11), SICStus/Makefile.am (1.20),
+	  SICStus/ppl_sicstus.pl (1.21), SICStus/ppl_sicstus_sd.pl (1.3):
+	  Reorganization due to the fact that ppl_prolog.pl was obsolete.
+
+2002-06-09 Sunday 19:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/ppl_c.cc (1.30): Use the new bounding box
+	  constructors.
+
+2002-06-09 Sunday 19:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.5), C_Polyhedron.inlines.hh (1.4),
+	  NNC_Polyhedron.defs.hh (1.8), NNC_Polyhedron.inlines.hh (1.6),
+	  globals.hh (1.14): Differentiate the bounding box constructors
+	  for C_Polyhedron and NNC_Polyhedron from all the other
+	  constructors.
+
+2002-06-09 Sunday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.34), exceptions.hh
+	  (1.6), pl_check.pl (1.8), track_allocation.hh (1.4),
+	  Ciao/ppl_ciao.pl (1.9), GNU/gp_clpq.pl (1.5),
+	  GNU/ppl_gprolog_sd.pl (1.10), SICStus/ppl_sicstus_sd.pl (1.2),
+	  SICStus/sp_clpq.pl (1.4), SWI/pl_clpq.cc (1.3), SWI/pl_clpq.pl
+	  (1.3), SWI/ppl_pl.cc (1.3), YAP/ppl_yap.pl (1.4), YAP/yap_clpq.pl
+	  (1.2): Copyright and "no warranty" notices added.
+
+2002-06-09 Sunday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.3): Updated.
+
+2002-06-09 Sunday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.4), configure.ac (1.6): Consistent
+	  spelling for Autoconf and Automake.
+
+2002-06-09 Sunday 16:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.46): Set CFLAGS properly.  Quote systematically.
+
+2002-06-09 Sunday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/configure.ac (1.5): Set CFLAGS properly.  Check for
+	  header files and library functions only if we are building the
+	  library.
+
+2002-06-09 Sunday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.45), Watchdog/configure.ac (1.4): Be more
+	  friendly to compilers different from GCC.
+
+2002-06-09 Sunday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.29), ppl_c.h (1.26): Added
+	  ppl_new_C_Polyhedron_from_bounding_box() and
+	  ppl_new_NNC_Polyhedron_from_bounding_box().
+
+2002-06-09 Sunday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.4), C_Polyhedron.inlines.hh (1.3),
+	  NNC_Polyhedron.defs.hh (1.7), NNC_Polyhedron.inlines.hh (1.5),
+	  Polyhedron.defs.hh (1.104), Polyhedron.inlines.hh (1.27): Added
+	  template <class Box> C_Polyhedron::C_Polyhedron(const Box& box)
+	  and template <class Box> NNC_Polyhedron::NNC_Polyhedron(const
+	  Box& box).  Added the declaration and documentation and sketched
+	  the implementation of template <class Box>
+	  Polyhedron::Polyhedron(Topology topol, const Box& box): these
+	  constructor allow to builds a polyhedron out of a generic,
+	  interval-based bounding box.
+
+	  Documentation of Polyhedron::shrink_bounding_box(Box& box)
+	  revised: we now promise to communicate rational numbers using
+	  fractions in canonical form.	The fraction n/d is in canonical
+	  form if and only if n and d have no common factors and d is
+	  positive, 0/1 being the unique representation for zero.
+
+2002-06-09 Sunday 12:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.48): Added definitions of "minimized"
+	  constraints and generators.
+
+2002-06-09 Sunday 11:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.47): Further updating of the user manual
+	  to allow for NNC polyhedra.  Minkowski's and Weil's theorems and
+	  some definitions moved to the developers part.
+
+2002-06-09 Sunday 08:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Interval.inlines.hh (1.2): Removed redundant and erroneous
+	  default argument specification.
+
+2002-06-08 Saturday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Interval.hh (1.3), Makefile.am (1.13),
+	  ppl_prolog.icc (1.37): Use the new implementation of bounding
+	  boxes.
+
+2002-06-08 Saturday 17:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addconstraints2.cc (1.12): Shut up if not noisy.
+
+2002-06-08 Saturday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: BoundingBox.hh (1.1), Interval.cc (1.1), Interval.defs.hh
+	  (1.1), Interval.inlines.hh (1.1), Interval.types.hh (1.1),
+	  Makefile.am (1.38): New implementation of bounding boxes.
+
+2002-06-08 Saturday 17:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.73), addconstraints2.cc (1.11),
+	  boundingbox1.cc (1.8), ehandlers.cc (1.1), ehandlers.hh (1.4),
+	  memory1.cc (1.2), print.cc (1.1), print.hh (1.8), smm1.cc (1.5),
+	  watchdog1.cc (1.7): Better implementation for auxiliary
+	  functions.  Some more cleaning.
+
+2002-06-08 Saturday 12:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Interval.hh (1.2), ppl_prolog.icc (1.36),
+	  Ciao/ppl_ciao.cc (1.9), Ciao/ppl_ciao.pl (1.8), GNU/gp_clpq.pl
+	  (1.4), GNU/ppl_gprolog_sd.pl (1.9), SICStus/ppl_sicstus_sd.cc
+	  (1.13), SWI/ppl_swiprolog.cc (1.35), YAP/ppl_yap.cc (1.24):
+	  Initial implementation for ppl_Polyhedron_get_bounding_box/2.
+	  ppl_init/0 removed (was an inferior duplicate of
+	  ppl_initialize/0).
+
+2002-06-07 Friday 17:31  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.46): On-going reorganisation of
+	  introduction based on some of the items suggested by Enea.
+
+2002-06-07 Friday 16:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.5), ppl_prolog.icc (1.35):
+	  The function term_to_polyhedron_handle() replaces
+	  get_ph_pointer().  The new function either return a plausible
+	  polyhedron handle or throws the `not_a_polyhedron_handle'
+	  exception.  All sites that used to call get_ph_pointer() have
+	  been consequently simplified.
+
+2002-06-07 Friday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.12): Stub
+	  declarations fixed.
+
+2002-06-07 Friday 14:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.172): Corrected a bug in
+	  strongly_minimize_constraints() whereby sat_c was declared
+	  up-to-date even if it was not the case.
+
+2002-06-07 Friday 13:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.45), ppl.sty (1.8): Some further step
+	  toward the reorganization of user-manual intro.
+
+2002-06-07 Friday 13:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.33): Documentation for
+	  the Prolog interface updated to allow for the change to more
+	  generic predicates.
+
+2002-06-07 Friday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/exceptions2.cc (1.6): Typos fixed.
+
+2002-06-07 Friday 12:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.8), pl_check.pl (1.7),
+	  ppl_prolog.icc (1.34), Ciao/ppl_ciao.pl (1.7),
+	  GNU/ppl_gprolog_sd.pl (1.8), SICStus/ppl_sicstus_sd.cc (1.11),
+	  SWI/ppl_swiprolog.cc (1.34), YAP/ppl_yap.cc (1.23): All
+	  predicates specific to C or NNC now removed and replaced by
+	  generic predicates. Documentation needs to be updated.
+
+2002-06-07 Friday 11:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.6), ppl_prolog.icc (1.33),
+	  SWI/ppl_swiprolog.cc (1.33): Predicates
+	  ppl_new_Polyhedron_from_Polyhedron/4,
+	  ppl_new_Polyhedron_from_ConSys/3, and
+	  ppl_new_Polyhedron_from_GenSys/3 added - just defined in SWI
+	  Prolog in this commit.
+
+2002-06-07 Friday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.32): Explain how to
+	  enable polyhedra allocation tracking.
+
+2002-06-07 Friday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.32): Creation and disposal of
+	  polyhedra is enabled only if explicitely requested.
+
+2002-06-07 Friday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.31): Remove useless inclusion
+	  and using namespace directives.
+
+2002-06-07 Friday 10:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.30): Avoid quoting for better
+	  output.
+
+2002-06-07 Friday 10:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.4), ppl_prolog.icc (1.29):
+	  New internal_exception: not_a_polyhedron_kind.  New function
+	  term_to_polyhedron_kind() replaces term_to_atom().
+
+2002-06-07 Friday 08:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.28): `a_closed' renamed
+	  `a_c'.
+
+2002-06-07 Friday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.27), Ciao/ppl_ciao.cc
+	  (1.8), GNU/ppl_gprolog_sd.cc (1.4), SICStus/ppl_sicstus_sd.cc
+	  (1.10), SWI/ppl_swiprolog.cc (1.32), YAP/ppl_yap.cc (1.22):
+	  Prolog_get_name_arity() renamed Prolog_get_compound_name_arity().
+
+2002-06-07 Friday 08:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.26), Ciao/ppl_ciao.cc
+	  (1.7), GNU/ppl_gprolog_sd.cc (1.3), SICStus/ppl_sicstus_sd.cc
+	  (1.9), SWI/ppl_swiprolog.cc (1.31), YAP/ppl_yap.cc (1.21):
+	  Prolog_get_atom_name() added.
+
+2002-06-07 Friday 07:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Ciao/ppl_ciao.cc (1.6), Ciao/ppl_ciao.pl
+	  (1.6), GNU/ppl_gprolog_sd.cc (1.2), SICStus/ppl_sicstus_sd.cc
+	  (1.8), SWI/ppl_swiprolog.cc (1.30), YAP/ppl_yap.cc (1.20):
+	  Prolog_is_atom() added.
+
+2002-06-06 Thursday 18:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.5), ppl_prolog.icc (1.25),
+	  SWI/ppl_swiprolog.cc (1.29): Added 2 generic predicates
+	  ppl_new_Polyhedron_from_dimension/3 and
+	  ppl_new_Polyhedron_empty_from_dimension/3 where the 1st argument
+	  must be c or nnc.  The only Prolog system with interface changed
+	  is SWI.
+
+2002-06-06 Thursday 17:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.10): The `swi' package has now its `%files'
+	  section.
+
+2002-06-06 Thursday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.44): Version number bumped.
+
+2002-06-06 Thursday 17:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.31), SWI/Makefile.am
+	  (1.16), SWI/pl_clpq.cc (1.2), SWI/ppl_pl.cc (1.2),
+	  SWI/ppl_swiprolog.cc (1.28): Support for SWI-Prolog completed and
+	  documented.
+
+2002-06-06 Thursday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.44): Slowly progressing.
+
+2002-06-06 Thursday 12:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.43), ppl.sty (1.7): Started rewriting
+	  the introduction to the user manual.
+
+2002-06-06 Thursday 10:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.30): Explained how to
+	  use the library from SICStus Prolog.
+
+2002-06-06 Thursday 09:40  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.40), Constraint.defs.hh (1.51),
+	  Generator.defs.hh (1.56), LinExpression.defs.hh (1.32),
+	  Matrix.defs.hh (1.24), Polyhedron.defs.hh (1.103), Row.defs.hh
+	  (1.42), SatMatrix.defs.hh (1.17), SatRow.defs.hh (1.13),
+	  Status.defs.hh (1.15): Now, a Doxygen comment is separated by an
+	  empty line from the C++ item that precedes it.
+
+2002-06-05 Wednesday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.15), ppl_pl.cc (1.1),
+	  pplpl.cc (1.2): Renamed pplpl.cc to ppl_pl.cc.
+
+2002-06-05 Wednesday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.9): We will build several RPM packages out of our
+	  source tree.
+
+2002-06-05 Wednesday 17:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.23): Added support for timeout-guarded operations.
+
+2002-06-05 Wednesday 17:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.72), timings.cc (1.1), timings.hh (1.1),
+	  watchdog1.cc (1.6): When NOISY, watchdog1 prints the time after
+	  which the timeout exception has been received.
+
+2002-06-05 Wednesday 17:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.29): Added
+	  documentation for the minimized_constraints and
+	  minimized_generators predicates.  Removed comments that SWI, GNU,
+	  YAP are not yet supported.
+
+2002-06-05 Wednesday 17:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.28), ppl_c.h (1.25): Added support for
+	  minimized_constraints() and minimized_generators() to the C
+	  interface.
+
+2002-06-05 Wednesday 16:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.24), Ciao/ppl_ciao.pl
+	  (1.5), GNU/ppl_gprolog_sd.pl (1.7), SICStus/ppl_sicstus_sd.cc
+	  (1.7), SWI/ppl_swiprolog.cc (1.27), YAP/ppl_yap.cc (1.19): All
+	  Prolog interfaces now have methods for accessing the minimized
+	  constraint and generator systems.
+
+2002-06-05 Wednesday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.13): Simpler and more efficient implementation
+	  of Parma_Polyhedra_Library::maybe_abandon().
+
+2002-06-05 Wednesday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.28), globals.hh (1.12): Documentation of
+	  `abandon_exponential_computations' changed: we now provide a
+	  quite strong guarantee, which is implemented in
+	  Polyhedron::conversion().
+
+2002-06-05 Wednesday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.102), tests/NNCminimize1.cc (1.3),
+	  tests/NNCminimize2.cc (1.3), tests/NNCminimize3.cc (1.3),
+	  tests/NNCminimize4.cc (1.5), tests/NNCminimize6.cc (1.4): Methods
+	  strongly_minimize(), strongly_minimize_constraints() and
+	  strongly_minimize_generators() are now private; tests changed to
+	  call the public methods minimized_constraints() and
+	  minimized_generators(), instead.
+
+2002-06-05 Wednesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.22): More news.
+
+2002-06-05 Wednesday 14:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.21): News items added.  List sorted to match the
+	  (subjective) relative importance of the innovations.
+
+2002-06-05 Wednesday 12:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.22): Removed some obsolete entries.
+
+2002-06-05 Wednesday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.20): Mention the addition of the time-elapse operation.
+
+2002-06-05 Wednesday 08:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.19), configure.ac (1.43), doc/Makefile.am (1.18),
+	  interfaces/Makefile.am (1.5), interfaces/C/Makefile.am (1.8),
+	  interfaces/Prolog/Makefile.am (1.12),
+	  interfaces/Prolog/Ciao/Makefile.am (1.4),
+	  interfaces/Prolog/GNU/Makefile.am (1.12),
+	  interfaces/Prolog/SICStus/Makefile.am (1.19),
+	  interfaces/Prolog/SWI/Makefile.am (1.14),
+	  interfaces/Prolog/YAP/Makefile.am (1.7), m4/Makefile.am (1.6),
+	  src/Makefile.am (1.37), tests/Makefile.am (1.71): File
+	  description improved.
+
+2002-06-05 Wednesday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.18): Improved formatting.
+
+2002-06-04 Tuesday 20:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.10), config.sub (1.9): Updated.
+
+2002-06-04 Tuesday 18:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.3), ChangeLog (1.8): Updated.
+
+2002-06-04 Tuesday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.3): Updated.
+
+2002-06-04 Tuesday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS (1.2): Written.
+
+2002-06-04 Tuesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.13): Do not assume the
+	  library has already been installed.
+
+2002-06-04 Tuesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.11): Do not assume `.' is
+	  the first item of the current PATH.
+
+2002-06-04 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/Makefile.am (1.10): No longer require that
+	  the library is already installed for a successful `make check'.
+
+2002-05-31 Friday 11:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.14), configure.ac (1.42), interfaces/C/Makefile.am
+	  (1.7): Improvements in automatic configuration and make file
+	  generation.
+
+2002-05-31 Friday 11:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.70), memory1.cc (1.1): To test the
+	  allocation error recovery facility of the library.  Not yet
+	  operational.
+
+2002-05-31 Friday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.5): Minor improvements.
+
+2002-05-30 Thursday 16:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.171): Modified methos strongly_minimize()
+	  according to the recent findings by Pat.
+
+2002-05-30 Thursday 15:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.170): In method
+	  strongly_minimize_constraints(), corrected handling of the sorted
+	  flag for the constraint system and of the changed boolean flag.
+
+2002-05-30 Thursday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.169): In methods strongly_minimize_*(),
+	  keeping track of whether or not we modify the considered system.
+	  If there has been no changes, the dual system is not flagged as
+	  out-of-date at the end of the method.
+
+2002-05-30 Thursday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.168): The method
+	  strongly_minimize_generators() now forces all point encodings to
+	  have the same epsilon-coordinate (which is 1).
+
+2002-05-29 Wednesday 18:11  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.28), pl_check.pl
+	  (1.4): Documentation now introduces the C and NNC polyhedra.	The
+	  grammar rules allow for strict inequalities and closure points.
+	  The test file has minor improvements; checking that redundant
+	  strict inequalities are ignored when creating a C polyhedron as a
+	  copy of an NNC polyhedra.
+
+2002-05-29 Wednesday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: NNCminimize1.cc (1.2), NNCminimize2.cc (1.2),
+	  NNCminimize3.cc (1.2), NNCminimize4.cc (1.4), NNCminimize6.cc
+	  (1.3): Methods NNC_minimize* renamed as strongly_minimize*
+
+2002-05-29 Wednesday 15:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.167), Polyhedron.defs.hh (1.101): Methods
+	  NNC_minimize* renamed as strongly_minimize* and implemented
+	  (almost) according to the technical report Q286.  When strongly
+	  minimizing a constraint system, we now always remove any
+	  eps-upper-bound constraint and we later insert back the
+	  constraint eps-leq-one only if that is needed to obtain an
+	  epsilon-representation.
+
+2002-05-29 Wednesday 07:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: NNCinclusion1.cc (1.2), NNCminimize6.cc (1.2),
+	  boundingbox1.cc (1.7), watchdog1.cc (1.4), widening2.cc (1.2): Be
+	  quiet.
+
+2002-05-28 Tuesday 16:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.166): Several simplifications in strong
+	  minmization of constraints and generators and in check for
+	  topological closure of a NNC polyhedron.
+
+2002-05-28 Tuesday 16:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.31), Generator.defs.hh (1.55): Method
+	  is_corresponding_closure_point() renamed as
+	  is_matching_closure_point().
+
+2002-05-28 Tuesday 13:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.5), Watchdog/.cvsignore (1.2),
+	  interfaces/C/.cvsignore (1.2), interfaces/Prolog/ppl_prolog.icc
+	  (1.23), interfaces/Prolog/SICStus/.cvsignore (1.2): For those
+	  building in the sources' tree.
+
+2002-05-28 Tuesday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/watchdog1.cc (1.3): Adapted to the new version of the
+	  Watchdog library and "abandon" mechanism.
+
+2002-05-28 Tuesday 12:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: globals.cc (1.7), globals.hh (1.11): Improved
+	  implementation of the "abandon" mechanism.
+
+2002-05-28 Tuesday 12:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Watchdog.cc (1.4), Watchdog.defs.hh (1.2),
+	  Watchdog.inlines.hh (1.2): Better implementation using templates.
+
+2002-05-28 Tuesday 12:12  Elisa Ricci
+
+	* src/Polyhedron.cc (1.165): Corrected an error in
+	  Polyhedron::topological_closure_assign(): if we modify the system
+	  of constraints or of generators, it is no longer minimized.
+
+2002-05-27 Monday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: pl_check.pl (1.3), ppl_prolog.icc (1.22): Bug
+	  in ppl_prolog.icc corrected.	Tests in pl_check.pl amended to use
+	  poly_hull and poly_difference instead of convex_hull and
+	  convex_difference.
+
+2002-05-27 Monday 16:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/.cvsignore (1.5): For those that build in the source
+	  directory.
+
+2002-05-27 Monday 16:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ppl_header.bottom (1.4): Undefine all autoconf macros.
+
+2002-05-27 Monday 16:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/Makefile.am (1.6),
+	  interfaces/Prolog/Ciao/Makefile.am (1.3),
+	  interfaces/Prolog/GNU/Makefile.am (1.9),
+	  interfaces/Prolog/SICStus/Makefile.am (1.18),
+	  interfaces/Prolog/SWI/Makefile.am (1.12),
+	  interfaces/Prolog/YAP/Makefile.am (1.6), src/Makefile.am (1.36):
+	  INCLUDES is deprecated: use AM_CPPFLAGS instead.
+
+2002-05-27 Monday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.69), watchdog1.cc (1.2): Stress test for
+	  the timeout facility.
+
+2002-05-27 Monday 15:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.3), README (1.3), Timeout.hh (1.3),
+	  Watchdog.cc (1.3), Watchdog.defs.hh (1.1), Watchdog.hh (1.3),
+	  Watchdog.inlines.hh (1.1), Watchdog.types.hh (1.1), configure.ac
+	  (1.3), pwl_filter_doxygen.sed (1.1), pwl_filter_install.sed
+	  (1.1), pwl_header.bottom (1.1), pwl_header.middle (1.1),
+	  pwl_header.top (1.1): The Watchdog library is now complete.
+
+2002-05-27 Monday 13:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.27): Prolog interface
+	  predicates and their names in the documentation now agree with
+	  each other.
+
+2002-05-26 Sunday 14:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.164): Assertion fixed in
+	  time_elapse_assign().
+
+2002-05-26 Sunday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.163): Properly identify time_elapse_assign()
+	  when throwing an exception from there.
+
+2002-05-25 Saturday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.35), Row.cc (1.36), SatMatrix.cc (1.16),
+	  maxmin.hh (1.3): Baking our own versions of max() and min() was a
+	  bad idea.
+
+2002-05-25 Saturday 16:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.162), src/Polyhedron.defs.hh (1.100),
+	  tests/timeelapse1.cc (1.2), tests/timeelapse2.cc (1.2),
+	  tests/timeelapse3.cc (1.2), tests/timeelapse4.cc (1.2): Changed
+	  the function Polyhedron::time_elapse_assign() so that only
+	  polyhedra that are topology-compatible can be used and modified
+	  the tests so that the polyhedra satisfy this condition.
+
+2002-05-24 Friday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.161): Corrected method
+	  topological_closure_assign(): inserting the constraint
+	  eps_leq_one after modifying the polyhedron to enforce the epsilon
+	  upper bound.
+
+2002-05-24 Friday 10:34  Elisa Ricci
+
+	* src/Constraint.cc (1.23): Corrected an error in the function
+	  Constraint::is_trivial_true(): a strict inequality such as `lhs -
+	  k > 0' can not be trivial true if `k' is a non negative integer.
+
+2002-05-24 Friday 07:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.41), tests/Makefile.am (1.68), tests/watchdog1.cc
+	  (1.1): Prepare for testing the timeout facility.
+
+2002-05-24 Friday 07:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.17): If we are building the Watchdog library, make
+	  sure it is built before entering the `tests' directory.
+
+2002-05-24 Friday 07:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Watchdog/: Makefile.am (1.2), README (1.2), Timeout.hh (1.2),
+	  Watchdog.cc (1.2), Watchdog.hh (1.2), config.h.in (1.2),
+	  configure.ac (1.2): Several improvement (but still not
+	  operational).
+
+2002-05-24 Friday 07:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.26): Be more specific
+	  about how to use the library in SICStus Prolog.
+
+2002-05-23 Thursday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/widening2.cc (1.1): widening2.cc shows a precision problem
+	  in Polyhedron::widening_assign().
+
+2002-05-23 Thursday 09:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.67): widening2.cc shows a precision problem
+	  in Polyhedron::widening_assign().
+
+2002-05-22 Wednesday 13:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc (1.6): Definition of
+	  abandon_exponential_computations fixed again.
+
+2002-05-22 Wednesday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.27): Added a call to maybe_abandon(): this
+	  is supposed to be called on all the exponential paths within the
+	  library and, in such paths, invocations to it should be separated
+	  from one another by a distance that is bounded from above by a
+	  polynomial of the size of the input to conversion().
+
+2002-05-22 Wednesday 13:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.cc (1.5): Definition of
+	  abandon_exponential_computations fixed.
+
+2002-05-22 Wednesday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: convexdifference1.cc (1.10), convexhull1.cc (1.7),
+	  convexhull2.cc (1.6), convexhull3.cc (1.6), convexhull4.cc (1.5),
+	  randchull1.cc (1.15): Removed and replaced by tests named
+	  "poly*".
+
+2002-05-22 Wednesday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.66), NNCminimize5.cc (1.2), append1.cc
+	  (1.11), append2.cc (1.12), exceptions1.cc (1.8), permute.cc
+	  (1.16), polydifference1.cc (1.1), polyhull1.cc (1.1),
+	  polyhull2.cc (1.1), polyhull3.cc (1.1), polyhull4.cc (1.1),
+	  randchull1.cc (1.14), randphull1.cc (1.1), widening1.cc (1.4):
+	  Renaming convex-hull into poly-hull.
+
+2002-05-22 Wednesday 11:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.160), src/Polyhedron.defs.hh (1.99),
+	  interfaces/C/ppl_c.cc (1.27), interfaces/C/ppl_c.h (1.24),
+	  interfaces/Prolog/Prolog_interface.dox (1.25),
+	  interfaces/Prolog/pl_check.pl (1.2),
+	  interfaces/Prolog/ppl_prolog.icc (1.21),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.4),
+	  interfaces/Prolog/GNU/ppl_gprolog_sd.pl (1.6),
+	  interfaces/Prolog/SICStus/ppl_sicstus_sd.cc (1.6),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.26),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.18): Renamed convex-hull into
+	  poly-hull.
+
+2002-05-22 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.11): Build the SWI Prolog
+	  interface only if SWI Prolog is installed.
+
+2002-05-22 Wednesday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.16), configure.ac (1.40), Watchdog/.cvsignore
+	  (1.1), Watchdog/BUGS (1.1), Watchdog/COPYING (1.1),
+	  Watchdog/CREDITS (1.1), Watchdog/ChangeLog (1.1),
+	  Watchdog/INSTALL (1.1), Watchdog/Makefile.am (1.1), Watchdog/NEWS
+	  (1.1), Watchdog/README (1.1), Watchdog/Timeout.hh (1.1),
+	  Watchdog/Watchdog.cc (1.1), Watchdog/Watchdog.hh (1.1),
+	  Watchdog/config.h.in (1.1), Watchdog/configure.ac (1.1): Even
+	  though the Watchdog library is completely independent from the
+	  PPL, it will live with it, at least for a while.
+
+2002-05-22 Wednesday 08:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.34), globals.cc (1.4), globals.hh (1.10):
+	  New timeout mechanisms.
+
+2002-05-22 Wednesday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.159): Typo fixed.
+
+2002-05-22 Wednesday 08:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.50): Useless emphasis removed.
+
+2002-05-22 Wednesday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.11), Ciao/Makefile.am (1.2):
+	  Compile also the Ciao Prolog interface, if Ciao Prolog is
+	  available.
+
+2002-05-22 Wednesday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.16),
+	  devref-print.doxyconf-latex.in (1.16), devref.doxyconf-html.in
+	  (1.17): Fixes and additions for the developer's documentation of
+	  Prolog interfaces.
+
+2002-05-18 Saturday 16:56  Elisa Ricci
+
+	* src/Polyhedron.cc (1.158), src/Polyhedron.defs.hh (1.98),
+	  tests/Makefile.am (1.65), tests/exceptions1.cc (1.7),
+	  tests/timeelapse1.cc (1.1), tests/timeelapse2.cc (1.1),
+	  tests/timeelapse3.cc (1.1), tests/timeelapse4.cc (1.1),
+	  tests/timeelapse5.cc (1.1): Added the function void
+	  time_elapse_assign(const Polyhedron&) and some tests for it.
+
+2002-05-17 Friday 07:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.17): Commented out statement
+	  removed.
+
+2002-05-17 Friday 07:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: .cvsignore (1.1), Makefile.am (1.1),
+	  ppl_ciao.cc (1.5): Rewritten using the interface provided by Ciao
+	  Prolog 1.8 (still not operational).
+
+2002-05-14 Tuesday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/pl_check.pl (1.1): pl_check.pl can be used to
+	  run all the interface predicates with simple tests.
+
+2002-05-14 Tuesday 09:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.7), ppl_prolog.icc (1.20),
+	  GNU/ppl_gprolog_sd.pl (1.5), SICStus/ppl_sicstus_sd.cc (1.5),
+	  SWI/ppl_swiprolog.cc (1.25), YAP/ppl_yap.cc (1.16): All interface
+	  predicates now renamed and completed apart from
+	  shrink_bounding_box predicate.
+
+2002-05-13 Monday 18:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.19), GNU/ppl_gprolog_sd.pl
+	  (1.4), SICStus/ppl_sicstus_sd.cc (1.4), SWI/ppl_swiprolog.cc
+	  (1.24), YAP/ppl_yap.cc (1.15): Prolog interface predicates for
+	  removing dimensions renamed.
+
+2002-05-13 Monday 17:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.18), ppl_prolog.pl (1.3),
+	  GNU/ppl_gprolog_sd.pl (1.3), SICStus/ppl_sicstus_sd.cc (1.3),
+	  SWI/ppl_swiprolog.cc (1.23), YAP/ppl_yap.cc (1.14): The "add"
+	  predicates renamed or added to the Prolog interface.
+
+2002-05-13 Monday 15:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.6), ppl_prolog.icc (1.17),
+	  GNU/ppl_gprolog_sd.pl (1.2), SICStus/ppl_sicstus_sd.cc (1.2),
+	  SWI/ppl_swiprolog.cc (1.22), YAP/ppl_yap.cc (1.13): More
+	  interface predicates updated for NNC polyhedra
+
+2002-05-13 Monday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.15), configure.ac (1.39): Use --enable-shared when
+	  making distcheck.  Make sure we really have the Prolog systems.
+
+2002-05-13 Monday 10:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.10), ppl_prolog.icc (1.16):
+	  Always enter subdirectories.	Source file ppl_prolog.icc is a C++
+	  file.
+
+2002-05-13 Monday 10:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.8), ppl_gprolog.cc (1.13),
+	  ppl_gprolog.pl (1.7), ppl_gprolog_sd.cc (1.1), ppl_gprolog_sd.pl
+	  (1.1): Cleaned up.
+
+2002-05-13 Monday 10:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.17), ppl_sicstus.cc
+	  (1.54), ppl_sicstus.pl (1.20), ppl_sicstus_sd.cc (1.1),
+	  ppl_sicstus_sd.pl (1.1), sp_clpq.pl (1.3): Cleaned up: works both
+	  with static and dynamic linking.
+
+2002-05-13 Monday 10:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.5), ppl_yap.cc (1.12),
+	  ppl_yap.pl (1.3): Cleaned up, but still not operational.
+
+2002-05-10 Friday 13:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.38), interfaces/Prolog/SICStus/Makefile.am
+	  (1.16): Some Progress with the SICStus interface.
+
+2002-04-28 Sunday 22:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.26): Formatting change.
+
+2002-04-24 Wednesday 21:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.15): Fixed two declarations
+	  of std::ostringstream's.
+
+2002-04-20 Saturday 22:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.25), tests/boundingbox1.cc (1.6):
+	  shrink_bounding_box now works for NNC polyhedra defined both with
+	  and without strict inequalites.  The test file boundingbox1.cc
+	  has been also updated to deal with NNC polyhedra.  Extra tests
+	  have been added to check the changes.
+
+2002-04-19 Friday 17:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.14): Now including the
+	  closure points in the list of generators is ok when creating new
+	  polyhedra from lists of generators in the Prolog interface.
+
+2002-04-19 Friday 16:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.13), GNU/ppl_gprolog.pl
+	  (1.6): Predicates for GNU Prolog brought in line with the Prolog
+	  interface.
+
+2002-04-19 Friday 15:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.12): Now constraint_term()
+	  supports strict inequalities.
+
+2002-04-19 Friday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/inclusion1.cc (1.2): Be quiet.
+
+2002-04-19 Friday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.11): a_strictly_greater_than
+	  and a_strictly_less_than renamed a_greater_than and a_less_than.
+
+2002-04-19 Friday 14:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.10): Throw an exception
+	  instead of aborting in generator_term().
+
+2002-04-19 Friday 14:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.9), GNU/ppl_gprolog.cc
+	  (1.12), SICStus/ppl_sicstus.cc (1.53), SWI/ppl_swiprolog.cc
+	  (1.21), YAP/ppl_yap.cc (1.11): General cleanup.
+
+2002-04-19 Friday 13:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: clpq.pl (1.5), ppl_prolog.icc (1.8): The
+	  order of arguments in the revised predicates is input followed by
+	  output.  The ppl_prolog.icc now has code to handle strict
+	  inequalities and closure points.  clpq.pl has been updated to use
+	  the revised predicates.
+
+2002-04-19 Friday 11:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.20):
+	  ppl_delete_polyhedron/2 renamed ppl_delete_Polyhedron/2.
+
+2002-04-19 Friday 11:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.7), SICStus/ppl_sicstus.cc
+	  (1.52), SWI/ppl_swiprolog.cc (1.19), YAP/ppl_yap.cc (1.10): The
+	  code for ppl_new_NNC_Polyhedron_from_GenSys uncommented.
+
+2002-04-19 Friday 10:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.6), SICStus/ppl_sicstus.cc
+	  (1.51), SWI/ppl_swiprolog.cc (1.18): ppl_delete_polyhedron
+	  renamed ppl_delete_Polyhedron.  SP_STUB_0 macro fixed.
+
+2002-04-19 Friday 10:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/ppl_yap.cc (1.9): Added missing semicolons.
+
+2002-04-19 Friday 10:17  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.icc (1.5): In the copy
+	  methods/predicates the arguments have been reversed to match the
+	  corresponding ones in the C interface.  Now the 1st argument
+	  unifies with a handle for the new polyhedron and the 2nd argument
+	  is the handle for the source/original polyhedron.  Predicates
+	  affected are: ppl_new_C_Polyhedron_from_C_Polyhedron,
+	  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron,
+	  ppl_new_C_Polyhedron_from_NNC_Polyhedron,
+	  ppl_new_NNC_Polyhedron_from_C_Polyhedron.
+
+2002-04-19 Friday 10:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.4), SICStus/ppl_sicstus.cc
+	  (1.50), SWI/ppl_swiprolog.cc (1.17), YAP/ppl_yap.cc (1.8):
+	  Predicates: ppl_new_C_Polyhedron_from_ConSys,
+	  ppl_new_NNC_Polyhedron_from_ConSys,
+	  ppl_new_C_Polyhedron_from_GenSys added.
+
+2002-04-19 Friday 08:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.icc (1.3), SICStus/ppl_sicstus.cc
+	  (1.49), SWI/ppl_swiprolog.cc (1.16), YAP/ppl_yap.cc (1.7): The
+	  new, new_empty and copy predicates have been replaced by ones
+	  that allow for C and NNC polyhedra to match the same methods in
+	  the C interface.  Propositions ppl_initialize and ppl_finalize
+	  added.
+
+2002-04-16 Tuesday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.157): Test NNCminimize6 has shown that our
+	  check for topological closure was relying on a false invariant
+	  (namely, that in a weakly minimized constraint system any strict
+	  inequality can be made redundant by another strict inequality
+	  only).  Corrected the implementation of
+	  is_topologically_closed().
+
+2002-04-15 Monday 10:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.33): Corrected a memory allocation bug in
+	  ConSys::insert(const Constraint& c).	Now test NNCminimize6 shows
+	  that the strong minimization of constraints for NNC polyhedra
+	  does not fully minimize constraint systems, yet.
+
+2002-04-15 Monday 09:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.64), NNCminimize6.cc (1.1): Example
+	  NNCminimize6 shows a memory allocation bug in method
+	  ConSys::insert(const Constraint&).
+
+2002-04-14 Sunday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.cc (1.30): Avoid redundant test.
+
+2002-04-14 Sunday 17:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.22): Factorize some calls to
+	  operator<<(std::ostream&, ...).
+
+2002-04-13 Saturday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.24): Avoid shadowing in
+	  Polyhedron::shrink_bounding_box().
+
+2002-04-12 Friday 20:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.63), NNCminimize4.cc (1.3),
+	  NNCminimize5.cc (1.1): Test NNCminimize5 is a fake test showing
+	  that strong minimization problems can arise even when the user is
+	  only allowed to interact using constraint systems.
+
+2002-04-12 Friday 20:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.156): When performing strong minimization of
+	  constraints, no longer preventing the removal of the \esilon \leq
+	  1 constraint.  This modification is justified by the relaxation
+	  of the invariant on the class Generator, where we no longer
+	  require the coordinate of \epsilon to be \leq 1.
+
+2002-04-12 Friday 09:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.9), config.sub (1.8): Updated.
+
+2002-04-11 Thursday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Interval.hh (1.1), Makefile.am (1.9),
+	  ppl_prolog.icc (1.2): Progress in the implementation of
+	  ppl_get_bounding_box().
+
+2002-04-11 Thursday 18:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.8), ppl_prolog.icc (1.1),
+	  ppl_prolog.outlines.hh (1.26), GNU/ppl_gprolog.cc (1.11),
+	  SICStus/ppl_sicstus.cc (1.48), SWI/ppl_swiprolog.cc (1.15),
+	  YAP/ppl_yap.cc (1.6): The file `ppl_prolog.outlines.hh' has been
+	  renamed `ppl_prolog.icc'.
+
+2002-04-10 Wednesday 12:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.29): The OK() function for Generator no
+	  longer checks that, for points, the epsilon coordinate is less
+	  than or equal to 1 (because strong minimization does not maintain
+	  this invariant).
+
+2002-04-10 Wednesday 10:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: SICStus/ppl_sicstus.cc (1.47),
+	  SWI/ppl_swiprolog.cc (1.14), YAP/ppl_yap.cc (1.5): Provided the
+	  ppl_Prolog_sysdep_init() hook for system-dependent
+	  initialization.
+
+2002-04-10 Wednesday 10:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.cc (1.10):
+	  Prolog_raise_exception() implemented.  Provided the
+	  ppl_Prolog_sysdep_init() hook for system-dependent
+	  initialization.
+
+2002-04-10 Wednesday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.25): Started playing
+	  with the ppl_get_bounding_box() interface function.
+
+2002-04-09 Tuesday 18:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.155), Polyhedron.defs.hh (1.97): Added
+	  methods   const ConSys& Polyhedron::minimized_constraints()
+	  const;   const GenSys& Polyhedron::minimized_generators() const;
+	  together with the corresponding (unoptimized) implementations.
+
+2002-04-08 Monday 22:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.154): Typo fixed.
+
+2002-04-08 Monday 22:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.49), GenSys.defs.hh (1.56), Polyhedron.cc
+	  (1.153), Polyhedron.defs.hh (1.96): Added first draft for the
+	  method Polyhedron::topological_closure_assign().  Also added
+	  method GenSys::add_corresponding_points().
+
+2002-04-07 Sunday 15:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.26), ppl_c.h (1.23): Two bugs fixed.
+	  The swap functions have been removed.
+
+2002-04-07 Sunday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.152): Avoid an inconsistent mixture of
+	  useless emphasizers.
+
+2002-04-07 Sunday 13:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.62), inclusion1.cc (1.1): Test
+	  C_Polyhedron::operator<=().
+
+2002-04-07 Sunday 12:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: exceptions1.cc (1.6), exceptions2.cc (1.5): Replace
+	  "impossible" with "illegal" when the latter was meant.
+
+2002-04-07 Sunday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.151): There is no such a thing as the
+	  reduced scalar product operator^.
+
+2002-04-06 Saturday 08:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* m4/ac_check_gmp.m4 (1.4): Fixed two instances of the use of an
+	  inexistent GMP assignment operator from `char*'.  These gave no
+	  error because of the C++ pointer to `bool' conversion feature and
+	  because GMP had an assignment operator from `bool'.
+
+2002-04-05 Friday 12:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/boundingbox1.cc (1.5): Improved printed results: now says
+	  "none" when the denominator of the bound is 0.
+
+2002-04-05 Friday 12:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.23), tests/boundingbox1.cc (1.4):
+	  The dimension() method removed from BBox.
+
+2002-04-05 Friday 10:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.22), tests/boundingbox1.cc (1.3): In
+	  Polyhedron.inlines.hh:    shrink_bounding_box now handles the
+	  empty polyhedron correctly.
+
+	  In boundingbox1.cc:	 BBox and Interval improved and many tests
+	  added.
+
+2002-04-04 Thursday 14:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.inlines.hh (1.21): Initial implementation of
+	  Polyhedron::shrink_bounding_box().
+
+2002-04-04 Thursday 13:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.32), GenSys.cc (1.48), Polyhedron.cc (1.150),
+	  Row.cc (1.35), Row.defs.hh (1.41): PPL::operator^(const Row&,
+	  const Row&) renamed as "reduced_scalar_product".
+
+2002-04-04 Thursday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/boundingbox1.cc (1.2): Use a more concrete bounding-box
+	  class.
+
+2002-04-04 Thursday 11:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.15),
+	  devref-print.doxyconf-latex.in (1.15), devref.doxyconf-html.in
+	  (1.16): Configuration files updated after class names changes.
+
+2002-04-04 Thursday 11:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.types.hh (1.3): Forgot to remove this one.
+
+2002-04-04 Thursday 10:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.25), PolyBase.defs.hh (1.17),
+	  PolyBase.inlines.hh (1.5): Getting rid of these old files.
+
+2002-04-04 Thursday 10:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.149), Polyhedron.defs.hh (1.95),
+	  Polyhedron.inlines.hh (1.20): All functions created to throw
+	  exceptions are now private methods of the class Polyhedron.
+	  Exception messages modified to reflect the changes in the names
+	  of the classes and in the names of methods (e.g., add_constraint
+	  instead of insert).  Added topology-compatibility test to method
+	  swap(Polyhedron& y).	In all public methods, we now first check
+	  for topology inconsistencies, then we check for dimension
+	  inconsistencies.
+
+2002-04-04 Thursday 10:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.25), ppl_c.h (1.22): Add
+	  copy-conversion functions.
+
+2002-04-04 Thursday 08:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.24), ppl_c.h (1.21): Basic interface
+	  for the NNC polyhedra.
+
+2002-04-03 Wednesday 19:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/: C/ppl_c.cc (1.23), Prolog/ppl_prolog.outlines.hh
+	  (1.24): Allow the manipulation of closed polyhedra only (for the
+	  moment).
+
+2002-04-03 Wednesday 19:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.94): Make the destructor public (for
+	  the moment).
+
+2002-04-03 Wednesday 18:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.93): Modified doxygen comments to
+	  account for the possibility of exceptions caused by incompatible
+	  topologies.
+
+2002-04-03 Wednesday 17:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.types.hh (1.2): Cutted (redundant) brief
+	  namespace description to avoid a Doxygen warning.
+
+2002-04-03 Wednesday 17:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.defs.hh (1.40), Row.inlines.hh (1.20): Some cleaning in
+	  the Row::Type class:	- removed the useless static methods;  -
+	  the constants NNC and RPI are now tied to the Topology and
+	  Row::Kind    enumerations.
+
+2002-04-03 Wednesday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.148), Polyhedron.defs.hh (1.92): All the
+	  assertions regarding topology compatibility (but those inside the
+	  non-public methods) replaced by run-time checks so that, When
+	  identifying a topology mismatch, we now throw an exception.
+
+	  Since wrapper classes C_Polyhedron and NNC_Polyhedron will not
+	  override the methods of base class Polyhedron (they will just
+	  inherit them), all implementation specific members of Polyhedron,
+	  apart from the constructors and assignment, are now declared
+	  "private" instead of "protected".
+
+2002-04-03 Wednesday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.61), boundingbox1.cc (1.1): To test
+	  Polyhedron::shrink_bounding_box().
+
+2002-04-03 Wednesday 12:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.defs.hh (1.3), NNC_Polyhedron.cc (1.8),
+	  NNC_Polyhedron.defs.hh (1.6), Polyhedron.cc (1.147),
+	  Polyhedron.defs.hh (1.91): The method   bool
+	  is_topologycally_closed() const; is now a method of the _base_
+	  class Polyhedron, trivially returning true if the polyhedron is
+	  necessarily closed.
+
+2002-04-03 Wednesday 11:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/C_Polyhedron.cc (1.2), src/C_Polyhedron.defs.hh (1.2),
+	  src/C_Polyhedron.inlines.hh (1.2), src/Makefile.am (1.33),
+	  src/NNC_Polyhedron.cc (1.7), src/NNC_Polyhedron.defs.hh (1.5),
+	  src/NNC_Polyhedron.inlines.hh (1.4), src/Polyhedron.cc (1.146),
+	  src/Polyhedron.defs.hh (1.90), src/Polyhedron.inlines.hh (1.19),
+	  src/conversion.cc (1.26), src/minimize.cc (1.20), src/simplify.cc
+	  (1.15), tests/print.hh (1.7): Base class PolyBase renamed (back)
+	  as Polyhedron.
+
+2002-04-03 Wednesday 10:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Makefile.am (1.32), src/NNC_Polyhedron.cc (1.6),
+	  src/NNC_Polyhedron.defs.hh (1.4), tests/addconstraints1.cc (1.6),
+	  tests/addconstraints10.cc (1.5), tests/addconstraints11.cc (1.6),
+	  tests/addconstraints2.cc (1.10), tests/addconstraints3.cc (1.3),
+	  tests/addconstraints4.cc (1.5), tests/addconstraints5.cc (1.6),
+	  tests/addconstraints6.cc (1.7), tests/addconstraints7.cc (1.6),
+	  tests/addconstraints8.cc (1.6), tests/addconstraints9.cc (1.7),
+	  tests/adddimensions1.cc (1.8), tests/adddimensions2.cc (1.4),
+	  tests/adddimensions3.cc (1.6), tests/adddimensions4.cc (1.4),
+	  tests/addgenerators1.cc (1.7), tests/addgenerators2.cc (1.7),
+	  tests/addgenerators3.cc (1.6), tests/addgenerators4.cc (1.6),
+	  tests/addgenerators5.cc (1.6), tests/addgenerators6.cc (1.6),
+	  tests/addgenerators7.cc (1.2), tests/affineimage1.cc (1.6),
+	  tests/affineimage2.cc (1.5), tests/affinepreimage1.cc (1.5),
+	  tests/affinepreimage2.cc (1.5), tests/affinepreimage3.cc (1.5),
+	  tests/affinepreimage4.cc (1.6), tests/affinetrans.cc (1.9),
+	  tests/append1.cc (1.10), tests/append2.cc (1.11),
+	  tests/bounded1.cc (1.3), tests/convexdifference1.cc (1.9),
+	  tests/convexhull1.cc (1.6), tests/convexhull2.cc (1.5),
+	  tests/convexhull3.cc (1.5), tests/convexhull4.cc (1.4),
+	  tests/empty1.cc (1.7), tests/exceptions1.cc (1.5),
+	  tests/exceptions2.cc (1.4), tests/generators1.cc (1.5),
+	  tests/generators2.cc (1.2), tests/inters1.cc (1.10),
+	  tests/inters2.cc (1.13), tests/inters3.cc (1.6), tests/inters4.cc
+	  (1.5), tests/inters5.cc (1.7), tests/inters6.cc (1.6),
+	  tests/inters7.cc (1.3), tests/limitedwidening1.cc (1.7),
+	  tests/limitedwidening2.cc (1.4), tests/onepoint.cc (1.5),
+	  tests/permute.cc (1.15), tests/randchull1.cc (1.13),
+	  tests/relations1.cc (1.3), tests/relations2.cc (1.4),
+	  tests/relations3.cc (1.4), tests/relations4.cc (1.4),
+	  tests/relations5.cc (1.4), tests/relations6.cc (1.3),
+	  tests/relations7.cc (1.3), tests/relations8.cc (1.3),
+	  tests/relations9.cc (1.4), tests/removedim1.cc (1.5),
+	  tests/removedim2.cc (1.9), tests/removedim3.cc (1.5),
+	  tests/removedim4.cc (1.6), tests/removedim5.cc (1.4),
+	  tests/removedim6.cc (1.5), tests/smm1.cc (1.4),
+	  tests/universe1.cc (1.3), tests/universe2.cc (1.4),
+	  tests/universe3.cc (1.4), tests/universe4.cc (1.4),
+	  tests/universe5.cc (1.5), tests/widening1.cc (1.3): Wrapper class
+	  Polyhedron renamed as C_Polyhedron.  All test programs modified
+	  accordingly.
+
+2002-04-03 Wednesday 10:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: C_Polyhedron.cc (1.1), C_Polyhedron.defs.hh (1.1),
+	  C_Polyhedron.inlines.hh (1.1), C_Polyhedron.types.hh (1.1): Added
+	  wrapper class C_Polyhedron to implement necessarily closed
+	  polyhedra.
+
+2002-04-02 Tuesday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.24), tests/addconstraints6.cc (1.6): Corrected
+	  stupid bugs related to a misinterpretation of the value returned
+	  by minimize().
+
+2002-04-02 Tuesday 18:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.22), ppl_c.h (1.20): All the
+	  *_and_minimize functions return a positive integer if the
+	  reulting polyhedron is non-empty; they return 0 if it is empty
+	  (and, as usual, return a negative number if an error occurred).
+
+2002-04-02 Tuesday 17:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* TODO (1.21): Dealt with the first item (the *_and_minimize one).
+
+2002-04-02 Tuesday 17:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.23), PolyBase.defs.hh (1.16): All the public
+	  methods of PolyBase whose name ends in "_and_minimize" now return
+	  a boolean value (which is `false' iff the resulting polyhedron is
+	  empty).
+
+2002-04-02 Tuesday 16:48  Elisa Ricci
+
+	* tests/: Makefile.am (1.60), removedim7.cc (1.1), universe6.cc
+	  (1.1): Added a test for the functions remove_higher_dimensions()
+	  and remove_dimensions() and one for the function check_universe
+	  for NNC_Polyhedron.
+
+2002-04-02 Tuesday 16:43  Elisa Ricci
+
+	* tests/exceptions1.cc (1.4): Added a test to show when an
+	  exception is thrown in the function convex_difference_assign(ph).
+
+2002-04-02 Tuesday 12:08  Elisa Ricci
+
+	* tests/: Makefile.am (1.59), adddimensions5.cc (1.1),
+	  adddimensions6.cc (1.1), adddimensions7.cc (1.1): Added tests for
+	  the functions add_dimensions_and_embed and
+	  add_dimensions_and_project for NNC_Polyhedron.
+
+2002-04-02 Tuesday 09:43  Elisa Ricci
+
+	* tests/: Makefile.am (1.58), addgenerators7.cc (1.1), print.hh
+	  (1.6): Add a test for the function
+	  add_generators_and_minimize(gs) for a NNC_Polyhedron.  Changed
+	  the functions to print the polyhedra so that they can be used to
+	  print also for the NNC polyhedra.
+
+2002-04-02 Tuesday 08:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.22): Some nonsense removed from
+	  PolyBase::affine_image() and PolyBase::affine_preimage().
+
+2002-04-02 Tuesday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.21): PolyBase::limited_widening_assign()
+	  fixed: it was not checking the return value of
+	  PolyBase::update_generators().
+
+2002-03-31 Sunday 23:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.20), interfaces/C/Makefile.am (1.5),
+	  interfaces/C/ppl_c.cc (1.21),
+	  interfaces/Prolog/Prolog_interface.dox (1.24),
+	  interfaces/Prolog/ppl_prolog.outlines.hh (1.23),
+	  interfaces/Prolog/ppl_prolog.pl (1.2),
+	  interfaces/Prolog/Ciao/ppl_ciao.cc (1.4),
+	  interfaces/Prolog/Ciao/ppl_ciao.pl (1.3),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.5),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.46),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.13),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.4), src/PolyBase.cc (1.20),
+	  src/PolyBase.defs.hh (1.15), tests/addconstraints11.cc (1.5),
+	  tests/addconstraints2.cc (1.9), tests/addconstraints4.cc (1.4),
+	  tests/addconstraints6.cc (1.5), tests/addconstraints7.cc (1.5),
+	  tests/addconstraints8.cc (1.5), tests/addconstraints9.cc (1.6),
+	  tests/adddimensions1.cc (1.7), tests/adddimensions3.cc (1.5),
+	  tests/addgenerators1.cc (1.6), tests/addgenerators2.cc (1.6),
+	  tests/addgenerators3.cc (1.5), tests/addgenerators4.cc (1.5),
+	  tests/addgenerators5.cc (1.5), tests/addgenerators6.cc (1.5),
+	  tests/affineimage1.cc (1.5), tests/affineimage2.cc (1.4),
+	  tests/affinepreimage2.cc (1.4), tests/affinepreimage3.cc (1.4),
+	  tests/affinepreimage4.cc (1.5), tests/append1.cc (1.9),
+	  tests/append2.cc (1.10), tests/bounded1.cc (1.2),
+	  tests/convexhull3.cc (1.4), tests/convexhull4.cc (1.3),
+	  tests/exceptions1.cc (1.3), tests/exceptions2.cc (1.3),
+	  tests/inters1.cc (1.9), tests/inters2.cc (1.12), tests/inters3.cc
+	  (1.5), tests/inters4.cc (1.4), tests/inters5.cc (1.6),
+	  tests/inters6.cc (1.5), tests/inters7.cc (1.2),
+	  tests/limitedwidening1.cc (1.6), tests/onepoint.cc (1.4),
+	  tests/permute.cc (1.14), tests/randchull1.cc (1.12),
+	  tests/relations9.cc (1.3), tests/removedim6.cc (1.4),
+	  tests/smm1.cc (1.3), tests/universe2.cc (1.3), tests/universe3.cc
+	  (1.3), tests/universe4.cc (1.3), tests/universe5.cc (1.4),
+	  tests/widening1.cc (1.2): Renamed Polyhedron::insert(const
+	  Constraint&) to Polyhedron::add_constraint(const Constraint&).
+	  Likewise, renamed Polyhedron::insert(const Generator&) to
+	  Polyhedron::add_generator(const Generator&).
+
+2002-03-31 Sunday 21:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.37), interfaces/C/Makefile.am (1.4): Added a
+	  first starting draft of `lpenum', a program to solve linear
+	  programming problems by vertex/point enumeration.  Just a toy to
+	  test the C interface of the library.
+
+2002-03-31 Sunday 20:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.28), Matrix.cc (1.36), PolyBase.cc (1.19),
+	  Row.cc (1.34), SatMatrix.cc (1.15): All the OK() methods are now
+	  silent if the NDEBUG symbol is defined.
+
+2002-03-31 Sunday 19:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.18): Always provide default cases in switches.
+
+2002-03-31 Sunday 19:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.39), ConSys.inlines.hh (1.16),
+	  Constraint.inlines.hh (1.26), GenSys.defs.hh (1.55),
+	  GenSys.inlines.hh (1.17), Generator.inlines.hh (1.26), Matrix.cc
+	  (1.35), Matrix.defs.hh (1.23), Matrix.inlines.hh (1.21),
+	  PolyBase.cc (1.17), PolyBase.defs.hh (1.14), Row.defs.hh (1.39),
+	  Row.inlines.hh (1.19): Do not shadow the members of *this.
+
+2002-03-31 Sunday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.16): Started exploiting the return value of
+	  PolyBase::minimize().
+
+2002-03-31 Sunday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.57), widening1.cc (1.1): Test
+	  Polyhedron::widening_assign() with empty polyhedra.
+
+2002-03-31 Sunday 10:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.15):
+	  PolyBase::intersection_assign_and_minimize() fixed.
+
+2002-03-31 Sunday 10:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.56), inters7.cc (1.1): Test
+	  Polyhedron::intersection_assign_and_minimize() with empty
+	  polyhedra (exposes bugs in the current implementation of that
+	  method).
+
+2002-03-31 Sunday 10:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.14), PolyBase.defs.hh (1.13):
+	  PolyBase::minimize() now returns a Boolean: false if and only if
+	  *this turns out to be empty.	Handling of empty polyhedra fixed
+	  in PolyBase::convex_hull_assign_and_minimize().
+
+2002-03-31 Sunday 09:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/convexhull4.cc (1.2): Exercise
+	  PolyBase::convex_hull_assign_and_minimize() with empty polyhedra
+	  in all possible ways (exposes more bugs in the current PolyBase
+	  implementation).
+
+2002-03-31 Sunday 08:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.13):
+	  PolyBase::convex_hull_assign_and_minimize() fixed.
+
+2002-03-31 Sunday 00:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.55), convexhull4.cc (1.1): Test
+	  Polyhedron::convex_hull_assign_and_minimize() with an empty
+	  parameter polyhedron.
+
+2002-03-30 Saturday 22:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.20), ppl_c.h (1.19): New interface
+	  functions.
+
+2002-03-30 Saturday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.12), PolyBase.defs.hh (1.12):
+	  PolyBase::generators() fixed: no longer ignoring the return value
+	  of PolyBase::update_generators().
+
+2002-03-30 Saturday 11:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.11): Corrected bugs in methods insert(g),
+	  add_generators(gs) and add_generators_and_minimize(gs): in the
+	  case of NNC topology, we were not adding the closure points
+	  corresponding to each added point.
+
+2002-03-30 Saturday 11:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.47), GenSys.defs.hh (1.54): Added method
+	  GenSys::add_corresponding_closure_points().
+
+2002-03-30 Saturday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.19), ppl_c.h (1.18): Fixed
+	  ppl_assign_Coefficient_from_mpz_t() and ppl_Generator_type().
+
+2002-03-30 Saturday 10:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.18), ppl_c.h (1.17): More functions to
+	  deal with coefficients.  New function to get the type of a
+	  generator.
+
+2002-03-30 Saturday 10:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.inlines.hh (1.4): Added an empty implementation for
+	  PolyBase::shrink_bounding_box().
+
+2002-03-30 Saturday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.54), generators2.cc (1.1): New test
+	  computing the generators of an empty polyhedron.
+
+2002-03-30 Saturday 09:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.17), ppl_c.h (1.16): New functions and
+	  bug fixes.
+
+2002-03-29 Friday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.10), src/PolyBase.defs.hh (1.11),
+	  tests/NNCminimize4.cc (1.2): Added methods
+	  NNC_minimize_generators() and NNC_minimize_constraints(), which
+	  enforce NNC-minimization on only one system.	They have a common
+	  kernel, which might be factored out in a "generic"
+	  NNC-minimization function (something like the simplify() method).
+	  Now test NNCminimize4.cc uses the (more lazy)
+	  NNC_minimize_constraints() function.
+
+2002-03-29 Friday 10:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.53), NNCminimize4.cc (1.1): New test put
+	  under CVS control.
+
+2002-03-28 Thursday 22:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.16), ppl_c.h (1.15):
+	  ppl_Polyhedron_shrink_bounding_box() added to the C interface.
+
+2002-03-28 Thursday 20:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.27), Generator.defs.hh (1.54), Matrix.cc
+	  (1.34), NNC_Polyhedron.cc (1.5), PolyBase.cc (1.9): Added method
+	   bool Generator::is_corresponding_closure_point(const Generator&)
+	  const; Methods NNC_Polyhedron::is_necessarily_closed() and
+	  PolyBase::NNC_minimize() updated to use the above method; this
+	  also corrects a bug in the previous implementations.
+
+	  Added a \param Doxygen command in Matrix.cc to avoid a warning.
+
+2002-03-28 Thursday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (1.10): Redeclared `shrink_bounding_box' as
+	  template <class Box> void shrink_bounding_box(Box& box) const;
+	  the previous declaration was too concrete.
+
+2002-03-28 Thursday 16:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (1.9): Added the declaration and
+	  documentation of template <class Interval> void
+	  shrink_bounding_box(std::vector<Interval>& box) const.
+
+2002-03-28 Thursday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.52), NNCinclusion1.cc (1.1),
+	  NNCminimize1.cc (1.1), NNCminimize2.cc (1.1), NNCminimize3.cc
+	  (1.1): Added a test on the inclusion method for NNC_Polyhedron
+	  and three tests for the full minimization of NNC_Polyhedron.
+
+2002-03-28 Thursday 15:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc (1.8), PolyBase.defs.hh (1.8): Added method
+	  PolyBase::NNC_minimize() performing "full" minimization of
+	  constraint and generator systems of a NNC_Polyhedron.
+	  Temporarily public for testing and debugging purposes.
+
+2002-03-28 Thursday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.26): Printing closure points as c(lin-expr).
+
+2002-03-28 Thursday 09:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.31), GenSys.cc (1.46): Methods get() and
+	  print() of classes ConSys and GenSys modified in order to:  -
+	  read (and print) the new kinds of constraint/generators types;  -
+	  check for the correspondence between declared and actual row
+	  types    when reading them in;  - check for the well-formedness
+	  of the read ConSys/GenSys, using OK().
+
+2002-03-27 Wednesday 19:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.19), TODO (1.19): Updated.
+
+2002-03-27 Wednesday 19:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.18), interfaces/C/ppl_c.cc (1.15),
+	  interfaces/Prolog/ppl_prolog.outlines.hh (1.22),
+	  src/Constraint.defs.hh (1.50), src/Constraint.inlines.hh (1.25),
+	  src/Generator.inlines.hh (1.25), src/Row.defs.hh (1.38),
+	  src/Row.inlines.hh (1.18): Constraint::coefficient(void) and
+	  Row::coefficient(void) renamed to
+	  Constraint::inhomogeneous_term(void) and
+	  Row::inhomogeneous_term(void).
+
+2002-03-27 Wednesday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (1.7): Documentation for PolyBase::OK()
+	  improved.
+
+2002-03-27 Wednesday 18:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.17), interfaces/C/ppl_c.cc (1.14), src/NNC_Polyhedron.cc
+	  (1.4), src/PolyBase.cc (1.7), src/PolyBase.defs.hh (1.6),
+	  src/Polyhedron.cc (1.145): Now the default for PolyBase::OK() is
+	  not to check for non-emptiness.  This is more consistent since
+	  OK() without arguments now checks for well-formedness only as all
+	  the other methods with the same name.  Use OK(true) if you want
+	  the extra service of non-emptiness checking.
+
+2002-03-27 Wednesday 18:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.30), ConSys.defs.hh (1.38), Constraint.cc
+	  (1.21), Constraint.defs.hh (1.49), Constraint.inlines.hh (1.24),
+	  GenSys.cc (1.45), GenSys.defs.hh (1.53), Generator.cc (1.25),
+	  LinExpression.defs.hh (1.31), Matrix.cc (1.33), Matrix.defs.hh
+	  (1.22), Matrix.inlines.hh (1.20), NNC_Polyhedron.cc (1.3),
+	  NNC_Polyhedron.inlines.hh (1.3), PolyBase.cc (1.6),
+	  PolyBase.defs.hh (1.5), Poly_Con_Relation.defs.hh (1.5),
+	  Poly_Gen_Relation.defs.hh (1.5), Row.defs.hh (1.37),
+	  Row.inlines.hh (1.17), Topology.hh (1.3): Replaced everywhere
+	  "non_necessarily_closed" by "not_necessarily_closed".  Improved
+	  the documentation of class Constraint to consider examples using
+	  strict inequalities. Added brief description for classes
+	  Poly_xxx_Relation and for the const_iterators of ConSys and
+	  GenSys.
+
+2002-03-27 Wednesday 16:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/PolyBase.cc (1.5): PolyBase::OK(bool check_not_empty) was
+	  disregarding its argument in some cases.  This bug was hiding two
+	  bogus assertions in PolyBase::add_constraints() and
+	  PolyBase::add_constraints_and_minimize().
+
+2002-03-27 Wednesday 16:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addconstraints1.cc (1.5): Unused variable removed.
+
+2002-03-27 Wednesday 16:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.defs.hh (1.3), Polyhedron.defs.hh (1.89):
+	  Removed duplicate documentation stuff from Polyhedron.defs.hh.
+	  Documented constructors of classes Polyhedron and NNC_Polyhedron.
+	  Provided a brief explanation of the reason why we do have 2
+	  classes.
+
+2002-03-27 Wednesday 15:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.16): At a closer scrutiny, the <CODE> and </CODE> tags
+	  are actually superior to any other alternative.  Remove the TODO
+	  item that suggested not to use them.
+
+2002-03-27 Wednesday 12:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.37), GenSys.defs.hh (1.52),
+	  Generator.defs.hh (1.53), PolyBase.defs.hh (1.4), Row.cc (1.33):
+	  Started adjusting the documentation to made it aware of the new
+	  kind of constraints and generators.  Corrected a couple of
+	  docuementation problems causing Doxygen warnings.
+
+2002-03-27 Wednesday 10:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (1.4): One FIXME removed: was related to an
+	  efficiency concern where we really do not have any efficiency
+	  problem.
+
+2002-03-27 Wednesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.44), PolyBase.cc (1.3): Merged the changes
+	  made to the `strict' branch after yesterday's merge.
+
+2002-03-27 Wednesday 08:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.15), src/ConSys.defs.hh (1.36), src/ConSys.inlines.hh
+	  (1.15), src/Constraint.defs.hh (1.48), src/Constraint.inlines.hh
+	  (1.23), src/GenSys.defs.hh (1.51), src/GenSys.inlines.hh (1.16),
+	  src/Generator.defs.hh (1.52), src/Generator.inlines.hh (1.24),
+	  src/Integer.defs.hh (1.3), src/LinExpression.defs.hh (1.30),
+	  src/LinExpression.inlines.hh (1.14), src/Matrix.defs.hh (1.21),
+	  src/Matrix.inlines.hh (1.19), src/PolyBase.defs.hh (1.3),
+	  src/PolyBase.inlines.hh (1.3), src/Row.defs.hh (1.36),
+	  src/Row.inlines.hh (1.16), src/SatMatrix.defs.hh (1.16),
+	  src/SatMatrix.inlines.hh (1.10), src/SatRow.defs.hh (1.12),
+	  src/SatRow.inlines.hh (1.12): Added a specialization of the the
+	  std:swap() function for LinExpression.  Solved several
+	  documentation and stylistic issues concerning our specializations
+	  of std::swap().
+
+2002-03-27 Wednesday 08:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, PolyBase.cc (strict.[13,31]): Method
+	  GenSys::relation_with(c) now supports all the possible
+	  combinations of topology and type for both *this and the
+	  constraint parameter c.
+
+2002-03-27 Wednesday 08:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.14), src/Constraint.defs.hh (1.47), src/Generator.defs.hh
+	  (1.51): Avoid using \enum when it is not strictly necessary.
+
+2002-03-26 Tuesday 23:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in (1.14),
+	  doc/devref-print.doxyconf-latex.in (1.14),
+	  doc/devref.doxyconf-html.in (1.15),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.4), src/ConSys.cc (1.29),
+	  src/ConSys.defs.hh (1.35), src/ConSys.inlines.hh (1.14),
+	  src/Constraint.cc (1.20), src/Constraint.defs.hh (1.46),
+	  src/Constraint.inlines.hh (1.22), src/GenSys.cc (1.43),
+	  src/GenSys.defs.hh (1.50), src/GenSys.inlines.hh (1.15),
+	  src/Generator.cc (1.24), src/Generator.defs.hh (1.50),
+	  src/Generator.inlines.hh (1.23), src/LinExpression.cc (1.11),
+	  src/LinExpression.defs.hh (1.29), src/LinExpression.inlines.hh
+	  (1.13), src/Makefile.am (1.31), src/Matrix.cc (1.32),
+	  src/Matrix.defs.hh (1.20), src/Matrix.inlines.hh (1.18),
+	  src/NNC_Polyhedron.cc (1.2), src/NNC_Polyhedron.defs.hh (1.2),
+	  src/NNC_Polyhedron.inlines.hh (1.2), src/NNC_Polyhedron.types.hh
+	  (1.2), src/PolyBase.cc (1.2), src/PolyBase.defs.hh (1.2),
+	  src/PolyBase.inlines.hh (1.2), src/PolyBase.types.hh (1.2),
+	  src/Polyhedron.cc (1.144), src/Polyhedron.defs.hh (1.88),
+	  src/Polyhedron.inlines.hh (1.18), src/Row.cc (1.32),
+	  src/Row.defs.hh (1.35), src/Row.inlines.hh (1.15),
+	  src/Topology.hh (1.2), src/conversion.cc (1.25), src/minimize.cc
+	  (1.19), src/simplify.cc (1.14), tests/Makefile.am (1.51),
+	  tests/exceptions2.cc (1.2), tests/relations9.cc (1.2): The
+	  `strict' branch has been merged.
+
+2002-03-26 Tuesday 21:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.13), ppl_c.h (1.14): Implemented the
+	  error handling and reporting mechanisms.  Many other
+	  improvements.
+
+2002-03-26 Tuesday 19:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/minimize.cc (1.18): Throw `std::runtime_error' instead of
+	  `std::invalid_argument'.  Removed the inclusion of two unneeded
+	  header.
+
+2002-03-26 Tuesday 18:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.3), ppl_c.cc (1.12), ppl_c.h
+	  (1.13): All the interface functions should be there now.
+
+2002-03-26 Tuesday 17:54  Elisa Ricci
+
+	* src/: GenSys.cc, Polyhedron.cc, Polyhedron.defs.hh, minimize.cc
+	  (positive.[2,6,4,12]): Some changes in the part controlled by
+	  "POSITIVE_TRANSFORMATION".
+
+2002-03-26 Tuesday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.12): Some progresses in the generalization
+	  of method GenSys::relation_with(c) to work with a NNC system of
+	  generators.
+
+2002-03-26 Tuesday 17:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.23): Refer to handles
+	  rather than addresses.
+
+2002-03-26 Tuesday 16:41  Elisa Ricci
+
+	* tests/exceptions2.cc (strict.3): Added other two tests to show
+	  when an exception is thrown.
+
+2002-03-26 Tuesday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.28): Friend declarations fixed.
+
+2002-03-26 Tuesday 16:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Poly_Con_Relation.inlines.hh (strict.1): Bug (related to
+	  operator precedence) corrected in method implies().
+
+2002-03-26 Tuesday 14:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, relations9.cc (strict.[2,1]): Test
+	  relations9 calls method PolyBase::relation_with(c) when *this is
+	  a necessarily closed polyhedron and c is a strict inequality.
+
+2002-03-26 Tuesday 13:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, PolyBase.cc (strict.[11,30]): Methods
+	  PolyBase::relation_with(c) and GenSys::relation_with(c) modified
+	  to work as expected when *this.topology() == NECESSARILY_CLOSED
+	  and the c.type() == STRICT_INEQUALITY.
+
+2002-03-26 Tuesday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc, PolyBase.cc, PolyBase.defs.hh
+	  (strict.[13,10,29,9]): Some cleaning in ConSys/GenSys methods
+	  adjust_topology_and_dimension().  Adjusted a few comments and
+	  removed a few FIXME and CHECKME notes.
+
+2002-03-26 Tuesday 11:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.13): More things to do after the `strict' merge.
+
+2002-03-26 Tuesday 11:05  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog.pl (1.3),
+	  SICStus/ppl_sicstus.cc (1.45), YAP/ppl_yap.cc (1.3): Update so
+	  that they are all consistent with each other and SWI
+
+2002-03-25 Monday 21:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh,
+	  PolyBase.defs.hh, Polyhedron.cc, Polyhedron.defs.hh
+	  (strict.[3,3,8,4,4]): Added explicit constructors (to be used as
+	  conversion functions) for building a Polyhedron starting from a
+	  NNC_Polyhedron, and viceversa.  Added method	 bool
+	  NNC_Polyhedron::is_topologucally_closed() used in the above
+	  constructor to check if the argument is legal.
+	  NNC_Polyhedron::limited_widening_assign() reimplemented using the
+	  new constructor functions.
+
+2002-03-25 Monday 21:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.28): Corrected a bug in the assignment
+	  operator, which was not clearing matrices when a zero-dim
+	  polyhedron was assigned.
+
+2002-03-25 Monday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.12): More things to do after the merge with the `strict'
+	  branch.
+
+2002-03-25 Monday 19:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.11), ppl_c.h (1.12): More interface
+	  functions added.
+
+2002-03-25 Monday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.10), ppl_c.h (1.11): Widenings added.
+
+2002-03-25 Monday 17:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh (strict.[2,2]):
+	  Method limited_widening_assign() overridden in NNC_Polyhedron to
+	  avoid an annoying problem when testing with china.
+
+2002-03-25 Monday 17:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.27): When looping on constraints in
+	  widening_assign(), now going upward so as to avoid reversing the
+	  ordering of constraints.
+
+2002-03-25 Monday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.9), ppl_c.h (1.10): Added an interface
+	  for the Polyhedron::relation_with() methods.
+
+2002-03-25 Monday 16:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.12): Predicate
+	  add_dimensions_and_constraints/2 added.
+
+2002-03-25 Monday 16:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.12): Trivially true constraints (such as 1
+	  > 0, the eps_leq_one constraint) should not be considered by
+	  method "has_strict_inequalities()".
+
+2002-03-25 Monday 15:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Gen_Relation.defs.hh (1.4),
+	  Poly_Gen_Relation.inlines.hh (1.5): Provide a hidden
+	  Poly_Gen_Relation::get_flags() method for use by the foreign
+	  language interfaces.
+
+2002-03-25 Monday 15:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.4),
+	  Poly_Con_Relation.inlines.hh (1.5): Provide a hidden
+	  Poly_Con_Relation::get_flags() method for use by the foreign
+	  language interfaces.
+
+2002-03-25 Monday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.143), Polyhedron.defs.hh (1.87): Both
+	  Polyhedron::relation_with() methods were erroneously not declared
+	  const.
+
+2002-03-25 Monday 14:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.8), ppl_c.h (1.9): Added more
+	  interface functions for ordinary polyhedra.
+
+2002-03-24 Sunday 21:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.26): Coorected trivial bug in
+	  check_universe().
+
+2002-03-24 Sunday 20:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.7), ppl_c.h (1.8): All the
+	  functionality provided by the C++ classes Constraint, ConSys,
+	  Generator and GenSys is now available to the C user.
+
+2002-03-24 Sunday 20:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.25): Method check_universe() is now
+	  correct for NNC polyhedra.  Try to exploit the boolean value
+	  returned by update_generators() to shorthen computations when
+	  possible.
+
+2002-03-24 Sunday 16:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc, PolyBase.defs.hh (strict.[24,7]): Methods
+	  obtain_sorted_constraints(), obtain_sorted_generators(),
+	  obtain_sorted_constraints_with_sat_c(),
+	  obtain_sorted_generators_with_sat_g() now declared const, since
+	  they do not logically modify the polyhedron.	As a consequence,
+	  simplified (by removing the const_cast's) the methods
+	  constraints(), generators(), intersection_assign(),
+	  convex_hull_assign(), convex_hull_assign_and_minimize().
+
+2002-03-24 Sunday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.6), ppl_c.h (1.7): Added all the
+	  functions for the handling of generators and generators' systems.
+
+2002-03-24 Sunday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.23): Patched method convex_hull_assign().
+	  The error (not correctly handling the sorting of gen_sys rows for
+	  the parameter y) was NOT related to the changes done in the
+	  strict branch.  Changed (detailed) doxygen comments for the
+	  methods obtain_sorted_constraints() and
+	  obtain_sorted_generators().
+
+2002-03-23 Saturday 19:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.5), ppl_c.h (1.6): Finished the
+	  implementation of const iterators for constraints.
+
+2002-03-23 Saturday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.13), configure.ac (1.36): Support C compilers that
+	  do not support `const' and/or `inline'.
+
+2002-03-23 Saturday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: ppl_c.cc (1.4), ppl_c.h (1.5): Started interfacing
+	  ConSys::const_iterator.
+
+2002-03-23 Saturday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.7), gp_clpq.pl (1.3),
+	  ppl_gprolog.cc (1.9): The GNU Prolog interface is finally
+	  operational.	The problem was that a GNU Prolog integer is not
+	  wide enough to hold a memory address:  now memory addresses are
+	  represented by terms of the form `[u1|u2]' where `u1' and `u2'
+	  are GNU Prolog integers.
+
+2002-03-23 Saturday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/track_allocation.hh (1.3): This was always
+	  commented out due to a typo.	Missing qualification added.
+
+2002-03-22 Friday 20:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.11): Method satisfies_all_constraints(g)
+	  reimplemented to work with NNC polyhedra and to correctly deal
+	  with potential (legal) topology mismatches.  As a consequence,
+	  now PolyBase::relation_with(g) also works for NNC polyhedra
+	  and/or an NNC generator parameter g.
+
+2002-03-22 Friday 20:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.22): The inclusion operator<=
+	  re-implemented:  - using the new scalaro product operator ^ when
+	  appropriate;	- changed the order of the two nested loops to
+	  factor out some    tests that were repeated unnecessarily.
+
+2002-03-22 Friday 20:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Row.cc, Row.defs.hh (strict.[2,3]): Added the "strict"
+	  scalar product operator (PPL::operator^) computing the scalar
+	  product of two Row objects but ignoring the last coefficient of
+	  the first row.
+
+2002-03-22 Friday 15:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc, PolyBase.cc (strict.[10,9,21]):
+	  Metods GenSys::affine_image(v, e, d) and
+	  ConSys::affine_preimage(v, e, d) no longer require the expression
+	  `e' to have the _same_ number of columns of the matrix; now they
+	  only require dimension compatibility.  This change, while
+	  allowing a correct implementation for NNC topology matrices, also
+	  turns out to be a potentially remarkable performance improvement.
+
+	  The corresponding methods of PolyBase changed accordingly:  - no
+	  longer performing the dangerous const_cast on the expression;  -
+	  missing assertion OK(false) placed on exit.
+
+2002-03-22 Friday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.20): Cleaned the code trying to preserve
+	  the sortedness of matrices when swapping epsilon columns in
+	  methods add_dimensions*.  In operator<=, avoiding repeated tests
+	  on the generator kind when computing the scalar products for NNC
+	  polyhedra.
+
+2002-03-22 Friday 10:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.19): Corrected a bug in
+	  add_dimensions_and_constraint().  The OK() assertion at the end
+	  of limited_widening_assign() changed into OK(false), because the
+	  parameter cs may cause the polyhedron to become inconsistent. In
+	  widening_assign(), now adding the epsilon constraints (instead of
+	  the positivity one) when the topology requires them.
+
+2002-03-21 Thursday 18:08  Elisa Ricci
+
+	* src/: GenSys.cc, GenSys.defs.hh, Matrix.defs.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh, conversion.cc, minimize.cc
+	  (positive.[1,1,2,5,3,6,11]): Started to implement the new method
+	  that use a transformation to compute the system of constraints of
+	  a positive polyhedron described by its system of generators: this
+	  method is controlled by the flag "POSITIVE_TRANSFORMATION".
+
+2002-03-21 Thursday 16:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.18): Corrected a bug in the constructor
+	  PolyBase(t, gs): we were breaking the correctenss of the
+	  sortedness flag.
+
+2002-03-21 Thursday 16:03  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.17): Added missing OK(bool) assertions on
+	  exit of constructors and methos operator<=,
+	  intersection_assign(ph), convex_difference_assign(ph), insert(g),
+	  insert(c), add_dimensions_and_constraints(),
+	  add_generators_and_minimize().
+
+	  Corrected \epsilon-swapping bugs in methods add_dimensions(...),
+	  add_dimensions_and_project(), add_dimensions_and_embed() and
+	  add_dimensions_and_constraints().
+
+	  Patched topology-related bug in limited_widening_assign().
+
+2002-03-21 Thursday 15:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc (strict.[9,8]): Methods get() and
+	  print(), i.e., input/output operators >> and <<, now also handle
+	  topology information.
+
+2002-03-21 Thursday 10:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.22): Added a note to
+	  try and explain when the _and_minimize predicates should be used.
+
+2002-03-21 Thursday 09:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.21): Two bugs corrected
+	  in the description of the "relation_with" predicates.
+
+2002-03-20 Wednesday 19:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.16): Patched methods
+	  add_dimensions_and_embed(), add_dimensions_and_project() and
+	  add_dimensions() to properly handle the "sorted" flag of
+	  matrices.  Corrected a small bug in
+	  add_dimensions_and_constraints(), where we were trying to swap a
+	  column with itself.
+
+2002-03-20 Wednesday 17:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.15): In constructors for NNC polyhedra,
+	  add the \epsilon constraint in the order that is likely to
+	  preserve the sorted flag.
+
+2002-03-20 Wednesday 17:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh, Generator.cc (strict.[5,3]): Just a
+	  few spaces added for style.
+
+2002-03-20 Wednesday 17:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.8): Corrected a bug in
+	  has_strict_inequalities() whereby we were returning "true" when
+	  finding the epsilon_geq_zero() constraint.
+
+2002-03-20 Wednesday 16:48  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.inlines.hh, PolyBase.cc (strict.[4,14]): A
+	  strict inequality has a _negative_ \epsilon coefficient
+	  (previously, we were testing for a _non-zero_ coefficient,
+	  causing a bug in method operator<=(PolyBase&, PolyBase&).
+
+2002-03-20 Wednesday 16:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (strict.6): Constructors of the base class
+	  PolyBase are now protected, so that the user _has_ to create
+	  objects of the derived classes Polyhedron and NNC_Polyhedron.
+
+2002-03-20 Wednesday 15:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.13): Corrected a bug in operator<= for
+	  the NNC case.
+
+2002-03-20 Wednesday 14:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.12): Implemented operator<= for NNC
+	  polyhedra.  Added a couple of missing assertions to
+	  add_generators().
+
+2002-03-20 Wednesday 13:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, GenSys.cc, Matrix.cc (strict.[7,7,8]): In
+	  Matrix::OK(), restored the test checking that num_columns() == 0
+	  whenever num_rows() == 0.  Added assertions to
+	  ConSys::adjust_topology_and_dimension() and
+	  GenSys::adjust_topology_and_dimension().
+
+2002-03-20 Wednesday 12:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc, Matrix.defs.hh, Matrix.inlines.hh
+	  (strict.[7,4,3]): Corrected bugs:  - set_necessarily_closed() and
+	  set_non_necessarily_closed() now also    set the right topology
+	  for all the rows in the matrix;  - grow(...) no longer asserts
+	  OK() on exit, because it may leave	the matrix in a state where
+	  num_rows() == 0 and num_columns() > 0;  - grow(...) was comparing
+	  the first row to be added with the last row	 in the matrix even
+	  when there were no rows in the matrix;  - insert(...) no longer
+	  swaps a coefficient with itself when	  num_columns() and
+	  row.size() do match.
+
+2002-03-20 Wednesday 11:20  Elisa Ricci
+
+	* tests/exceptions2.cc (strict.2): Added some other tests that show
+	  when an exception is thrown: one of them shows that there is
+	  still a problem with the function Matrix::grow().
+
+2002-03-19 Tuesday 19:02  Elisa Ricci
+
+	* tests/: Makefile.am, exceptions2.cc (strict.[1,1]): In
+	  "exceptions2.cc" put two tests that show that an exception is
+	  thrown if we want to built a Polyhedron starting from a system of
+	  constraints that contains strict-inequalities or a a system of
+	  generators that contains closure_points.
+
+2002-03-19 Tuesday 18:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.11): The method OK() improved to check
+	  invariants for both NC and NNC polyhedra.
+
+2002-03-19 Tuesday 18:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (strict.6): One of the new tests added to OK() was
+	  causing Matrix::grow() to fail.  Temporarily commented out.
+
+2002-03-19 Tuesday 16:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.6): Method OK() now merely calls
+	  Matrix::OK(), since there are no other meaningful tests to
+	  perform. Overriding used just for better documenting this fact.
+
+2002-03-19 Tuesday 16:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (strict.5): In method OK(), added a check on
+	  matrices with no rows.
+
+2002-03-19 Tuesday 16:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.6): In method OK(), no longer checking for
+	  topology mismatches between the systems and its generators (this
+	  is already done when calling Matrix::OK()).  No longer checking
+	  for the existence of a point, because points are only required if
+	  the GenSys is representing a polyhedron (check has to be
+	  performed by PolyBase::OK()).
+
+2002-03-19 Tuesday 15:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.cc (strict.4): Method OK() now checks for topology
+	  mismatches between the matrix and its rows.  The check on the
+	  minimum number of columns updated to work correctly with NNC
+	  topology matrices.
+
+2002-03-19 Tuesday 15:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc, Generator.inlines.hh (strict.[2,4]): Method
+	  OK() updated to perform checks of invariants for generators
+	  defined on the NNC topology.
+
+2002-03-19 Tuesday 15:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.cc (strict.1): In method OK(), added a check on the
+	  minimum number of coefficients of a row (the minimum depends on
+	  the row topology).
+
+2002-03-19 Tuesday 13:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.5): In function OK(), when checking for the
+	  existence of a point, we now use is_point() to (correctly)
+	  disregard closure points.  Also checking for topology mismatches
+	  between gen_sys and its elements.
+
+2002-03-19 Tuesday 11:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.10): Exploiting the new explicit
+	  conversions from Constraint/Generator to LinExpression in
+	  PolyBase methods   - insert(const Constraint&)   - insert(const
+	  Generator&)	- convex_difference_assign(const PolyBase&).
+
+2002-03-19 Tuesday 11:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.cc (strict.2): Corrected a bug in the newly
+	  introduced constructors.
+
+2002-03-19 Tuesday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc, LinExpression.defs.hh (strict.[1,1]):
+	  Added explicit constructors taking a constraint/generator as
+	  parameter: they are PPL_INTERNAL and extract from the parameter a
+	  "necessarily closed" copy of the corresponding linear expression.
+
+2002-03-19 Tuesday 01:09  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/devref-browse.doxyconf-latex.in,
+	  doc/devref-print.doxyconf-latex.in, doc/devref.doxyconf-html.in,
+	  src/Makefile.am (strict.[1,1,1,3]): Added files NNC_Polyhedron.*
+	  and PolyBase_* to Makefile.am and to the INPUT_FILE flags for
+	  doxygen devref configuration files.
+
+2002-03-19 Tuesday 01:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.9): Consistency modification: all static
+	  functions defined to just throw an exception now print the class
+	  name of the invoking object (dirty kludge using the topology()
+	  accessor; may be improved).  Added a whole set of such functions
+	  for reporting topology clashes and illegal generator systems.
+	  Adjusted several comments.  In method remove_dimensions, the case
+	  when we remove _all_ dimensions captured earlier.  Provided a
+	  temporary patches for the methods PolyBase::insert(const
+	  Constraint&) and PolyBase::insert(const Generator&).	Added
+	  topology-inconsistency checks to add_generators(gs).
+
+2002-03-19 Tuesday 00:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (strict.4): Methods reordered according
+	  to Polyhedron.defs.hh.
+
+2002-03-19 Tuesday 00:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (strict.5): Method topology() made public.
+
+2002-03-19 Tuesday 00:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: NNC_Polyhedron.cc, NNC_Polyhedron.defs.hh,
+	  NNC_Polyhedron.inlines.hh, NNC_Polyhedron.types.hh
+	  (strict.[1,1,1,1]): Put under CVS control.
+
+2002-03-19 Tuesday 00:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (strict.3): Removed useless include
+	  directives (already included by PolyBase.defs.hh).
+
+2002-03-19 Tuesday 00:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (strict.2): In both minimize(...) methods,
+	  modified the emptyness check after conversion in order to work
+	  for NNC Polyhedra too.
+
+2002-03-18 Monday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/user-browse.doxyconf-latex.in (1.11),
+	  doc/user-print.doxyconf-latex.in (1.11),
+	  doc/user.doxyconf-html.in (1.13), interfaces/C/ppl_c.cc (1.3),
+	  interfaces/C/ppl_c.h (1.4): Several improvements to the C
+	  interface.
+
+2002-03-18 Monday 17:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.17), doc/devref-browse.doxyconf-latex.in
+	  (1.13), doc/devref-print.doxyconf-latex.in (1.13),
+	  doc/devref.doxyconf-html.in (1.14),
+	  doc/user-browse.doxyconf-latex.in (1.10),
+	  doc/user-print.doxyconf-latex.in (1.10),
+	  doc/user.doxyconf-html.in (1.12), interfaces/C/ppl_c.cc (1.2),
+	  interfaces/C/ppl_c.h (1.3), src/LinExpression.defs.hh (1.27):
+	  Started merging the new C interface.
+
+2002-03-18 Monday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.11): Another thing to remember.
+
+2002-03-18 Monday 15:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.8): Corrected a (just introduced) bug in
+	  add_dimensions_and_constraints(ConSys& cs).
+
+2002-03-18 Monday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.10): More things we should not forget to do.
+
+2002-03-18 Monday 14:58  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.defs.hh, PolyBase.cc (strict.[4,7]): Patched method
+	  PolyBase::add_generators_and_minimize(gs).
+
+2002-03-18 Monday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.6): Patched method
+	  PolyBase::add_dimensions_and_constraints(cs).
+
+2002-03-18 Monday 13:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.9): Things todo just after merging the `strict' branch.
+
+2002-03-18 Monday 11:43  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.5): Adding topology-compatibility checks
+	  where needed, throwing exceptions if necessary.  Consistently
+	  using the methods [ConSys/GenSys]::adjust_topology_and_dimension
+	  when building a new polyhedron (or augmenting an existing one)
+	  starting from a ConSys or a GenSys.  When building an NNC
+	  polyhedron using the constructor PolyBase(GenSys&), we now add a
+	  closure point for each point in the GenSys.  Patched the
+	  specification of convex_difference_assign() to work correctly for
+	  NNC polyhedra.  Patched the methods add_dimensions_and_* and
+	  remove*_dimensions() to work correctly for NNC polyhedra.  Added
+	  a few "placeholder" exceptions to point out places where the
+	  current implementation is still not correct.
+
+2002-03-18 Monday 11:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.defs.hh (strict.4): In doxygen comments, added
+	  specification for exceptions that should be thrown when
+	  identifying a topology-incompatibility.
+
+2002-03-18 Monday 11:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (strict.4): Using Matrix::swap_columns.  Corrected
+	  a bug in GenSys::insert(g).
+
+2002-03-18 Monday 11:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh (strict.[5,3]): Method
+	  contains_strict_inequalities() renamed as
+	  has_strict_inequalities().  Using Matrix::swap_columns(i, j)
+	  whene swapping the \epsilon coefficients after dimension changes.
+
+2002-03-18 Monday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc, Matrix.defs.hh (strict.[3,3]): Added method
+	  Matrix::swap_columns(size_t i, size_t j) to factorize the several
+	  places where we swap the column of \epsilon coefficients.
+
+2002-03-18 Monday 11:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh, Generator.cc, Generator.inlines.hh
+	  (strict.[2,1,3]): Implemented friend function closure_point(...)
+	  returning a closure point.  Added static method
+	  zero_dim_closure_point().
+
+2002-03-17 Sunday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc, GenSys.defs.hh (strict.[3,3]): Added methods
+	  adjust_topology_and_dimensions(), has_closure_points() and
+	  has_points() to help checking for legality and automatically
+	  adjusting generator systems when building polyhedra.
+
+2002-03-17 Sunday 14:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (strict.4): Optimized the method
+	  contains_strict_inequalities() by factoring out the topology
+	  tests.
+
+2002-03-17 Sunday 11:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/YAP/: Makefile.am (1.4), ppl_yap.cc (1.2),
+	  ppl_yap.pl (1.2): Slow and difficult progress on the YAP
+	  interface.
+
+2002-03-17 Sunday 11:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: definitions.dox (1.42), ppl.sty (1.6): Introcude the macro
+	  \cone.  Fix the macro \linspace.  Define commands using the
+	  \{new,renew,provide}command* form.
+
+2002-03-17 Sunday 11:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.35): Configuration for producing dlopen modules
+	  and WIN32 dlls.
+
+2002-03-17 Sunday 08:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (strict.3): Add missing `inline'
+	  qualifiers.
+
+2002-03-17 Sunday 00:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: PolyBase.cc, PolyBase.defs.hh, PolyBase.inlines.hh
+	  (strict.[4,3,3]): The Topology parameter is now the first one in
+	  constructors.  Added the missing topology consistency assertion
+	  to limited_widening_assign.  Using the static Constraint members
+	  for adding the positivity and epsilon related constraints in the
+	  constructors.  Constructor PolyBase(Topology, ConSys) now
+	  automatically adjust the constraint system according to the first
+	  parameter, throwing an exception if we try to insert a strict
+	  inequality into a Polyhedron.
+
+2002-03-17 Sunday 00:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh
+	  (strict.[3,2,2]): Added the assignment operator. All methods are
+	  now inlined.
+
+2002-03-17 Sunday 00:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.defs.hh, GenSys.inlines.hh (strict.[2,3]): The
+	  Topology parameter is now the first one in constructors.
+
+2002-03-17 Sunday 00:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh
+	  (strict.[3,2,3]): Added methods adjust_topology_and_dimensions()
+	  and contains_strict_inequality() to help checking for legality
+	  and automatically adjusting constraint systems when building
+	  polyhedra.  Now the Topology parameter is the first one in
+	  constructors.
+
+2002-03-17 Sunday 00:19  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc, Constraint.defs.hh, Constraint.inlines.hh
+	  (strict.[3,2,3]): Added static methods to produce the two
+	  (zero-dim) epsilon constraints replacing the positivity
+	  constraint in NNC polyhedra (0 \leq \epsilon \leq 1).  Methods
+	  is_trivial_true() and is_trivial_false() modified to also work
+	  for strict inequalities.
+
+2002-03-16 Saturday 13:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.defs.hh, ConSys.inlines.hh,
+	  Constraint.cc, Constraint.inlines.hh, GenSys.cc, GenSys.defs.hh,
+	  GenSys.inlines.hh, Generator.inlines.hh, Makefile.am, Matrix.cc,
+	  Matrix.defs.hh, Matrix.inlines.hh, PolyBase.cc, PolyBase.defs.hh,
+	  PolyBase.inlines.hh, Polyhedron.cc, Row.defs.hh, Row.inlines.hh,
+	  conversion.cc (strict.[2,1,2,2,2,2,1,2,2,2,2,2,2,3,2,2,2,2,3,3]):
+	  In constructors, now using an element of the enum Topology in
+	  order to control the kind of object created (instead of the
+	  previous boolean).  Started adding controls on Topology
+	  mismatches and automatic conversions of objects when needed.
+
+2002-03-16 Saturday 13:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Topology.hh (strict.1): Put under CVS control: new header
+	  file for the enumeration controlling the topological kind of Row,
+	  Matrix, Constraint, Generator, ConSys, GenSys and PolyBase
+	  objects.
+
+2002-03-15 Friday 11:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.inlines.hh (strict.2): Re-ordering the initializer in Row
+	  constrauctors to avoid the warnings.
+
+2002-03-15 Friday 10:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc, ConSys.inlines.hh, Constraint.cc,
+	  Constraint.defs.hh, Constraint.inlines.hh, GenSys.cc,
+	  GenSys.inlines.hh, Generator.defs.hh, Generator.inlines.hh,
+	  LinExpression.inlines.hh, Matrix.cc, Matrix.defs.hh,
+	  Matrix.inlines.hh, Row.defs.hh, Row.inlines.hh, conversion.cc
+	  (strict.[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2]): Removed enumeration
+	  Type from class Row: added enumerations PolyhedronKind and
+	  RowKind; they are merged into a single object using new class
+	  Row::Type.  Rows now rememberif they have or not the \epsilon
+	  coefficient.
+
+	  Constructors for Matrix now have a boolean flag indicating
+	  whether or not the matrix has the \epsilon coefficient. The flag
+	  is remembered in order to correctly set the type of new rows.
+
+	  Added support for creating constraints that are strict
+	  inequalities and generators that are closure points. Added
+	  support for adding these two new kind of objects to constraint
+	  systems and generator systems (with automatic detection and
+	  resizing if needed).
+
+	  Constraints, generators and the respective systems
+	  space-dimensions now depend on the Polyhedron kind of the
+	  corresponding rows.
+
+2002-03-15 Friday 08:55  Elisa Ricci
+
+	* doc/definitions.dox (1.41): Improved the proposition that is
+	  before the definition of the ray space: we were using an object
+	  that was not defined before.
+
+2002-03-14 Thursday 15:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.20): Draft descriptions
+	  for all the new predicates added.  A few other small improvements
+	  made.
+
+2002-03-14 Thursday 13:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.21): Improved
+	  ppl_affine_image and ppl_affine_preimage.
+
+2002-03-14 Thursday 12:22  Elisa Ricci
+
+	* doc/definitions.dox (1.40): Improved the definition of minimal
+	  proper face.
+
+2002-03-14 Thursday 10:56  Elisa Ricci
+
+	* doc/definitions.dox (1.39): Corrected two errors in the
+	  definition of minimal proper face: I have written "C" instead of
+	  "P".
+
+2002-03-14 Thursday 09:21  Elisa Ricci
+
+	* doc/definitions.dox (1.38): Improved the documentation about the
+	  faces of a polyhedron.
+
+2002-03-13 Wednesday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.50), relations9.cc (1.1): New test.
+
+2002-03-13 Wednesday 20:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.20),
+	  interfaces/Prolog/GNU/ppl_gprolog.pl (1.2),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.44),
+	  interfaces/Prolog/SWI/ppl_swiprolog.cc (1.11),
+	  src/Poly_Con_Relation.defs.hh (1.3),
+	  src/Poly_Con_Relation.inlines.hh (1.4),
+	  src/Poly_Gen_Relation.defs.hh (1.3),
+	  src/Poly_Gen_Relation.inlines.hh (1.4):
+	  Poly_Con_Relation::implies() and Poly_Gen_Relation::implies()
+	  were wrong because of missing parentheses.
+	  Poly_Con_Relation::operator!() and Poly_Gen_Relation::operator!()
+	  were ill-designed: removed.  Added Poly_Con_Relation
+	  operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y)
+	  and the similar operator dealing with Poly_Gen_Relation.  Prolog
+	  interface functions ppl_relation_with_constraint/2 and
+	  ppl_relation_with_generator/2 changed accordingly.  New Prolog
+	  interface functions made available to GNU, SICStus, and SWI
+	  Prolog.
+
+2002-03-13 Wednesday 18:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.19): ppl_affine_image
+	  and ppl_affine_preimage corrected and
+	  ppl_add_domensions_and_constraints added.
+
+2002-03-13 Wednesday 17:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/PolyBase.cc (strict.2): When constructing a PolyBase, now we
+	  store the value of the newly introduced boolean flag in the
+	  corresponding private member.
+
+2002-03-13 Wednesday 17:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Makefile.am, PolyBase.cc, PolyBase.defs.hh,
+	  PolyBase.inlines.hh, PolyBase.types.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh, Polyhedron.inlines.hh, conversion.cc,
+	  minimize.cc, simplify.cc (strict.[1,1,1,1,1,1,1,1,1,1,1]): Class
+	  Polyhedron renamed into PolyBase.  Added a private boolean flag
+	  "necessarily_closed_" and modified all constructors (but not the
+	  copy constructor) to also accept a boolean argument (which is
+	  ignored, for the moment).  Created a new class Polyhedron
+	  inheriting public-ly from PolyBase.  This will be the class
+	  defining "necessarily closed" polyhedra.
+
+2002-03-13 Wednesday 16:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.18):
+	  ppl_relation_with_constraint/3 and ppl_relation_with_generator/3
+	  added.
+
+2002-03-13 Wednesday 16:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.defs.hh (1.2),
+	  Poly_Con_Relation.inlines.hh (1.3), Poly_Gen_Relation.defs.hh
+	  (1.2), Poly_Gen_Relation.inlines.hh (1.3): The implies() methods
+	  were not qualified as const.	Poly_Con_Relation::operator!() and
+	  Poly_Gen_Relation::operator!() added.
+
+2002-03-13 Wednesday 16:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.17),
+	  SWI/ppl_swiprolog.cc (1.10): ppl_affine_image and
+	  ppl_affine_preimage added.
+
+2002-03-13 Wednesday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.43): Misspelled
+	  functions fixed.  ppl_polyhedron_strictly_included/2 added.
+
+2002-03-13 Wednesday 14:02  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.16): Definitions of
+	  equal, included_or_equal and strictly_included predicates
+	  corrected.
+
+2002-03-13 Wednesday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.15),
+	  SWI/ppl_swiprolog.cc (1.9): Some corrections to some of the new
+	  predicates definitions.
+
+2002-03-13 Wednesday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.10): Always build `pplpl'
+	  and `pl_clpq'.
+
+2002-03-13 Wednesday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.14): Added new atoms
+	  for the relations of polyhedra with constraints and generators.
+
+2002-03-13 Wednesday 07:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.42): Missing
+	  semicolons added.
+
+2002-03-12 Tuesday 20:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.41): Macro SP_STUB_3
+	  added and used for ppl_limited_widening_assign/3.
+
+2002-03-12 Tuesday 19:46  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.13),
+	  SICStus/ppl_sicstus.cc (1.40), SWI/ppl_swiprolog.cc (1.8): <=,
+	  ==, and < added as ppl predicates.  SWI and SICStus interfaces
+	  updated with <= and == predicates.
+
+2002-03-12 Tuesday 19:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.12),
+	  SICStus/ppl_sicstus.cc (1.39), SWI/ppl_swiprolog.cc (1.7): Added
+	  ppl_add_generators_and_minimize, ppl_check_universe, and
+	  ppl_is_bounded.  SICStus and SWI updated to use the new
+	  predicates.
+
+2002-03-12 Tuesday 18:57  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.11):
+	  ppl_add_generators_and_minimize added.
+
+2002-03-12 Tuesday 17:50  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.19): Restored comment
+	  for ppl_copy_polyhedron, small change to notation and added draft
+	  documentation for three predicates that were missing.
+
+2002-03-12 Tuesday 17:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/ppl_prolog.outlines.hh (1.10): Code for
+	  ppl_limited_widening_assign, ppl_relation_with_constraint and
+	  ppl_relation_with_generator added.
+
+2002-03-12 Tuesday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.18): Added a note on the change of terminology
+	  vertex/point.
+
+2002-03-12 Tuesday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.9),
+	  Ciao/ppl_ciao.cc (1.3): Using "point" instead of "vertex".
+
+2002-03-12 Tuesday 15:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: addconstraints9.cc (1.5), adddimensions1.cc (1.6),
+	  adddimensions3.cc (1.4), addgenerators1.cc (1.5),
+	  addgenerators2.cc (1.5), addgenerators3.cc (1.4),
+	  addgenerators4.cc (1.4), addgenerators5.cc (1.4),
+	  addgenerators6.cc (1.4), affineimage1.cc (1.4),
+	  affinepreimage1.cc (1.4), affinepreimage3.cc (1.3),
+	  affinepreimage4.cc (1.4), affinetrans.cc (1.8),
+	  convexdifference1.cc (1.8), convexhull1.cc (1.5), convexhull2.cc
+	  (1.4), convexhull3.cc (1.3), error1.cc (1.8), error10.cc (1.2),
+	  error11.cc (1.2), error12.cc (1.2), error13.cc (1.2), error14.cc
+	  (1.2), error15.cc (1.2), error16.cc (1.2), error17.cc (1.2),
+	  error18.cc (1.3), error19.cc (1.2), error2.cc (1.10), error20.cc
+	  (1.3), error21.cc (1.4), error22.cc (1.3), error23.cc (1.2),
+	  error24.cc (1.2), error25.cc (1.4), error26.cc (1.3), error27.cc
+	  (1.3), error28.cc (1.3), error29.cc (1.3), error3.cc (1.10),
+	  error4.cc (1.5), error5.cc (1.6), error6.cc (1.4), error7.cc
+	  (1.3), error8.cc (1.2), error9.cc (1.3), exceptions1.cc (1.2),
+	  generators1.cc (1.4), inters2.cc (1.11), inters5.cc (1.5),
+	  inters6.cc (1.4), onepoint.cc (1.3), randchull1.cc (1.11),
+	  relations2.cc (1.3), relations3.cc (1.3), relations4.cc (1.3),
+	  relations5.cc (1.3), removedim1.cc (1.4), removedim2.cc (1.8),
+	  removedim4.cc (1.5): In all the tests, now using "point" instead
+	  of "vertex".	Removed the old tests "errorN.cc", which are now
+	  all subsumed by the single test "exceptions1.cc".
+
+2002-03-12 Tuesday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.28), Constraint.defs.hh (1.45),
+	  Constraint.inlines.hh (1.21), GenSys.cc (1.42), GenSys.defs.hh
+	  (1.49), GenSys.inlines.hh (1.14), Generator.cc (1.23),
+	  Generator.defs.hh (1.49), Generator.inlines.hh (1.22),
+	  LinExpression.defs.hh (1.26), Matrix.cc (1.31), Polyhedron.cc
+	  (1.142), Polyhedron.defs.hh (1.86), Row.cc (1.31), Row.defs.hh
+	  (1.34), Row.inlines.hh (1.14), conversion.cc (1.24), minimize.cc
+	  (1.17), simplify.cc (1.13): The term "vertex" replaced almost
+	  everywhere by "point": this is because these kind of generators
+	  are not necessarily vertices of the polyhedron.  All comments
+	  adjusted accordingly.
+
+2002-03-12 Tuesday 15:02  Elisa Ricci
+
+	* src/minimize.cc (positive.10): Some changes in the part
+	  controlled by the flag " POS_SIMPLEX_TRICK".
+
+2002-03-12 Tuesday 14:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.18): Description of
+	  some of the Prolog predicates improved.
+
+2002-03-12 Tuesday 13:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.141): Do not use the amsmath's \text{} macro
+	  in contexts like $a_\text{var}$.  Use $a_\mathrm{var}$ instead.
+
+2002-03-12 Tuesday 12:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.30): Do not use the `-e' option of GNU grep
+	  (this solves a portability problem on Solaris).
+
+2002-03-12 Tuesday 11:44  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.44), Generator.defs.hh (1.48),
+	  Generator.inlines.hh (1.21): The method Constraint::type() and
+	  the corresponding enum Constraint::Type are now public.  Added
+	  new public type tests to Generator, is_ray() and is_vertex();
+	  also, the existing method is_line() is now public.
+
+2002-03-12 Tuesday 11:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.22), Generator.defs.hh (1.47),
+	  Generator.inlines.hh (1.20): We were still throwing an exception
+	  from the inlined method divisor(); added a non-inline function
+	  for that purpose.
+
+2002-03-12 Tuesday 11:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.6), SWI/Makefile.am (1.9),
+	  YAP/Makefile.am (1.3): More packaging glitches have been fixed.
+
+2002-03-12 Tuesday 09:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.7), GNU/Makefile.am (1.5),
+	  SICStus/Makefile.am (1.15), SWI/Makefile.am (1.8),
+	  YAP/Makefile.am (1.2): A first go at fixing the packaging
+	  problems.
+
+2002-03-11 Monday 19:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.17), src/Polyhedron.defs.hh (1.85): Visibility bug fixed:
+	  Polyhedron::is_empty() must be private.
+
+2002-03-11 Monday 18:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.17): Fixed a severe performance bug
+	  in operator<(const Polyhedron& x, const Polyhedron& y).
+
+2002-03-11 Monday 14:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.34), Constraint.defs.hh (1.43),
+	  GenSys.defs.hh (1.48), Generator.defs.hh (1.46), Matrix.defs.hh
+	  (1.19), Row.defs.hh (1.33): Added a few missing doxygen comments
+	  to avoid warnings.
+
+2002-03-11 Monday 14:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Matrix.inlines.hh (1.17): Fixed a \relates doxygen comment
+	  pointing to the wrong class.
+
+2002-03-11 Monday 14:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Variable.defs.hh (1.15): Removed a redundant namespace
+	  qualification.
+
+2002-03-11 Monday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.12),
+	  devref-print.doxyconf-latex.in (1.12), devref.doxyconf-html.in
+	  (1.13): Set the WARN_IF_UNDOCUMENTED flag to YES. This will have
+	  no effect until we will set EXTRACT_ALL to NO.  Added the
+	  *.types.hh files to the INPUT variable.
+
+2002-03-11 Monday 14:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.17): Documentation
+	  describing the PPL Prolog predicates revised.
+
+2002-03-11 Monday 12:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.16): Documentation for
+	  ppl_copy_polyhedron corrected.
+
+2002-03-11 Monday 12:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: clpq.pl (1.4), clpq2.pl (1.3): Now consulting
+	  'file' will try also 'file.pl' in case 'file' does not exist or
+	  is not readable.
+
+2002-03-11 Monday 01:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.19), Constraint.defs.hh (1.42),
+	  Generator.cc (1.21), Generator.defs.hh (1.45), Matrix.cc (1.30),
+	  Matrix.defs.hh (1.18), Matrix.inlines.hh (1.16), Polyhedron.cc
+	  (1.140), Polyhedron.defs.hh (1.84), Row.cc (1.30), Row.defs.hh
+	  (1.32), Row.inlines.hh (1.13), SatMatrix.cc (1.14),
+	  SatMatrix.defs.hh (1.15), SatRow.cc (1.7), SatRow.defs.hh (1.11),
+	  SatRow.inlines.hh (1.11), Status.cc (1.11), Status.defs.hh
+	  (1.14), Variable.cc (1.6), Variable.defs.hh (1.14),
+	  Variable.inlines.hh (1.8): Placing the doxygen \relates command
+	  before function definitions (instead of declarations) to avoid
+	  warnings for unmatched functions.
+
+2002-03-11 Monday 00:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.11),
+	  devref-print.doxyconf-latex.in (1.11), devref.doxyconf-html.in
+	  (1.12): Added the newer (and old ones too) source files to the
+	  INPUT tag.  Turned on the STRIP_CODE_COMMENTS flag, to avoid
+	  outputting dosygen comments in the devref detailed comments for
+	  enumerations (e.g., Generator::Type).
+
+2002-03-10 Sunday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.27), LinExpression.defs.hh (1.25),
+	  Polyhedron.cc (1.139): Just formatting.
+
+2002-03-10 Sunday 21:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.29), Row.defs.hh (1.31): Avoid the creation of
+	  temporaries in operator*(const Row& x, const Row& y).  This
+	  results in a speedup of at least 3%.
+
+2002-03-10 Sunday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.26), GenSys.cc (1.41): Missing full-stops
+	  added.
+
+2002-03-10 Sunday 16:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.25), GenSys.cc (1.40):
+	  ConSys::affine_preimage() and GenSys::affine_image() shortened
+	  and slightly optimized.  Moreover, each contained a wrong
+	  assertion.
+
+2002-03-10 Sunday 15:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.24): Avoid a useless temporary in
+	  ConSys::affine_preimage().
+
+2002-03-10 Sunday 14:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.23), ConSys.defs.hh (1.33), ConSys.inlines.hh
+	  (1.13), Constraint.defs.hh (1.41), Constraint.inlines.hh (1.20),
+	  GenSys.cc (1.39), GenSys.defs.hh (1.47), GenSys.inlines.hh
+	  (1.13), LinExpression.defs.hh (1.24), LinExpression.inlines.hh
+	  (1.12), Matrix.cc (1.29), Matrix.defs.hh (1.17), Polyhedron.cc
+	  (1.138), Row.defs.hh (1.30), Row.inlines.hh (1.12), SatMatrix.cc
+	  (1.13), SatMatrix.defs.hh (1.14), SatMatrix.inlines.hh (1.9),
+	  Variable.defs.hh (1.13), Variable.inlines.hh (1.7): Compile
+	  cleanly with gcc's -Wshadow.
+
+2002-03-10 Sunday 13:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.34): The configure options --with-cflags and
+	  --with-cxxflags now add more compiler options (as opposed to
+	  replace them).  In addition the --with-cflags options was simply
+	  broken.
+
+2002-03-10 Sunday 13:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swiprolog.cc (1.6): Assertion fixed.
+
+2002-03-10 Sunday 00:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.18), Generator.cc (1.20): Useless
+	  namespace qualification in argument was causing a doxygen
+	  warning.
+
+2002-03-10 Sunday 00:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.10),
+	  devref-print.doxyconf-latex.in (1.10), devref.doxyconf-html.in
+	  (1.11), user-browse.doxyconf-latex.in (1.9),
+	  user-print.doxyconf-latex.in (1.9), user.doxyconf-html.in (1.11):
+	  New configuration files obtained by using the -u options of
+	  doxygen 1.2.14 and a bit of manual editing.
+
+2002-03-09 Saturday 19:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/C/: Makefile.am (1.2), ppl_c.c (1.2), ppl_c.cc (1.1),
+	  ppl_c.h (1.2): Slow progress.  The C interface is implemented in
+	  C++ (of course).
+
+2002-03-09 Saturday 13:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.33), interfaces/Makefile.am (1.4),
+	  interfaces/C/.cvsignore (1.1), interfaces/C/Makefile.am (1.1),
+	  interfaces/C/ppl_c.c (1.1), interfaces/C/ppl_c.h (1.1): C
+	  interface started.
+
+2002-03-08 Friday 22:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.8): More things to do.
+
+2002-03-08 Friday 12:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.32): The SICStus Prolog interface is only built
+	  if the user has SICStus Prolog 3.9.0 or a later version.
+
+2002-03-08 Friday 11:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/ppl_gprolog.cc (1.8),
+	  SICStus/ppl_sicstus.cc (1.38), SWI/ppl_swiprolog.cc (1.5): Minor
+	  improvements.
+
+2002-03-08 Friday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.31), interfaces/Prolog/YAP/.cvsignore (1.1),
+	  interfaces/Prolog/YAP/Makefile.am (1.1),
+	  interfaces/Prolog/YAP/ppl_yap.cc (1.1),
+	  interfaces/Prolog/YAP/ppl_yap.pl (1.1),
+	  interfaces/Prolog/YAP/yap_clpq.pl (1.1): YAP Prolog interface
+	  started.
+
+2002-03-08 Friday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: relations1.cc (1.2), relations2.cc (1.2), relations3.cc
+	  (1.2), relations4.cc (1.2), relations5.cc (1.2), relations6.cc
+	  (1.2), relations7.cc (1.2), relations8.cc (1.2): Tests updated to
+	  correctly use the new classes Poly_Con_Relation and
+	  Poly_Gen_Relation.
+
+2002-03-08 Friday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.38), GenSys.defs.hh (1.46), Polyhedron.cc
+	  (1.137), Polyhedron.defs.hh (1.83): Methods relation_with(...)
+	  updated to correctly use the new classes Poly_Con_Relation and
+	  Poly_Gen_Relation.
+
+2002-03-08 Friday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.32), ConSys.inlines.hh (1.12),
+	  Constraint.cc (1.17), Constraint.defs.hh (1.40),
+	  Constraint.inlines.hh (1.19), GenSys.defs.hh (1.45),
+	  GenSys.inlines.hh (1.12), Generator.cc (1.19), Generator.defs.hh
+	  (1.44), LinExpression.cc (1.10), LinExpression.defs.hh (1.23),
+	  LinExpression.inlines.hh (1.11), Matrix.cc (1.28), Matrix.defs.hh
+	  (1.16), Matrix.inlines.hh (1.15), Poly_Con_Relation.cc (1.2),
+	  Poly_Gen_Relation.cc (1.2), Polyhedron.cc (1.136),
+	  Polyhedron.defs.hh (1.82), Polyhedron.inlines.hh (1.16), Row.cc
+	  (1.28), Row.defs.hh (1.29), Row.inlines.hh (1.11), SatMatrix.cc
+	  (1.12), SatMatrix.defs.hh (1.13), SatMatrix.inlines.hh (1.8),
+	  SatRow.cc (1.6), SatRow.defs.hh (1.10), SatRow.inlines.hh (1.10),
+	  Status.cc (1.10), Status.defs.hh (1.13), Status.inlines.hh (1.7),
+	  Variable.cc (1.5), Variable.defs.hh (1.12), Variable.inlines.hh
+	  (1.6): For each operator name @ different from `new' and
+	  `delete', the syntax `operator@()' has to be preferred to
+	  `operator @'.
+
+2002-03-08 Friday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Poly_Con_Relation.inlines.hh (1.2),
+	  Poly_Gen_Relation.inlines.hh (1.2): Add missing `inline'
+	  qualifiers.
+
+2002-03-08 Friday 10:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.37), GenSys.defs.hh (1.44), Makefile.am
+	  (1.29), Poly_Con_Relation.cc (1.1), Poly_Con_Relation.defs.hh
+	  (1.1), Poly_Con_Relation.inlines.hh (1.1),
+	  Poly_Con_Relation.types.hh (1.1), Poly_Gen_Relation.cc (1.1),
+	  Poly_Gen_Relation.defs.hh (1.1), Poly_Gen_Relation.inlines.hh
+	  (1.1), Poly_Gen_Relation.types.hh (1.1), Polyhedron.cc (1.135),
+	  Polyhedron.defs.hh (1.81), relations.cc (1.2), relations.hh
+	  (1.3): New classes for polyhedron/constraint and
+	  polyhedron/generator relations.
+
+2002-03-08 Friday 09:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Status.defs.hh (1.12), Status.inlines.hh (1.6): Only
+	  esthetics.
+
+2002-03-07 Thursday 19:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/Makefile.am (1.4), GNU/gp_clpq.pl (1.2),
+	  GNU/ppl_gprolog.cc (1.7), SWI/Makefile.am (1.7): GNU Prolog
+	  CLP(Q) interpreter almost working (the ack.clpq test provokes a
+	  segmentation fault though).
+
+2002-03-07 Thursday 16:35  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.37): First part of Section 1.2 -
+	  Homogeneous Systems of the developer's manual, revised.
+
+2002-03-07 Thursday 14:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.7): Started adding the list of minor things to do.
+
+2002-03-07 Thursday 12:48  Elisa Ricci
+
+	* tests/: Makefile.am (1.49), includes1.cc (1.7), includes2.cc
+	  (1.6), includes3.cc (1.6), includes4.cc (1.6), relations1.cc
+	  (1.1), relations2.cc (1.1), relations3.cc (1.1), relations4.cc
+	  (1.1), relations5.cc (1.1), relations6.cc (1.1), relations7.cc
+	  (1.1), relations8.cc (1.1), satisfies1.cc (1.8), satisfies2.cc
+	  (1.6), satisfies3.cc (1.7), satisfies4.cc (1.5): The tests
+	  includes1, includes2, includes3, includes4 are now renamed
+	  relations1, relations2, relations3, relations4 and the tests
+	  satisfies1, satisfies2,satisfies3, satisfies4 are renamed
+	  relations5, relations6, relations7, relations8.
+
+2002-03-07 Thursday 12:24  Elisa Ricci
+
+	* tests/: Makefile.am (1.48), exceptions1.cc (1.1): All the tests
+	  for the exceptions are now put in this file.
+
+2002-03-07 Thursday 12:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: check_script (1.2), clpq.pl (1.3),
+	  SICStus/sp_clpq.pl (1.2), SWI/Makefile.am (1.6), SWI/pl_clpq.cc
+	  (1.1), SWI/pl_clpq.pl (1.2): The CLP(Q) interpreter now behaves
+	  the same under SICStus and SWI-Prolog.  The two version now
+	  implement the same `make check' procedure.
+
+2002-03-07 Thursday 11:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.16): Corrected a cut&paste error and added a note on the
+	  bug fixed in Polyhedron::add_constraints().
+
+2002-03-07 Thursday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.8),
+	  GNU/ppl_gprolog.cc (1.6), SICStus/ppl_sicstus.cc (1.37),
+	  SWI/Makefile.am (1.5), SWI/ppl_swiprolog.cc (1.4): Use the names
+	  Prolog_is_cons and Prolog_get_cons instead of the ambiguous
+	  Prolog_is_list and Prolog_get_list.  Bugs fixed.  The CLP(Q)
+	  interpreter now works also under SWI-Prolog.
+
+2002-03-07 Thursday 11:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.36): Adjusted a few comments in
+	  GenSys::relation_with(c). Also avoided using the boolean variable
+	  first_vertex_or_nonsaturating_ray when c is an equality
+	  constraint.
+
+2002-03-07 Thursday 10:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.35), tests/satisfies4.cc (1.4): Method
+	  Polyhedron::relation_with(c) corrected to work as expected when c
+	  is an equality. Test satisfies4, modified to test for the right
+	  thing, now is correctly handled.
+
+2002-03-07 Thursday 08:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.134): "steel" corrected to "steal".
+
+2002-03-06 Wednesday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.6), check_script (1.1),
+	  clpq.pl (1.2), clpq2.pl (1.2), expected (1.1), GNU/Makefile.am
+	  (1.3), GNU/gp_clpq.pl (1.1), GNU/ppl_gprolog.cc (1.5),
+	  SICStus/Makefile.am (1.14), SICStus/check_script (1.2),
+	  SICStus/expected (1.5), SWI/Makefile.am (1.4), SWI/pl_clpq.pl
+	  (1.1): Slow progress on the unified Prolog interfaces.
+
+2002-03-06 Wednesday 19:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.80), tests/error21.cc (1.3),
+	  tests/error22.cc (1.2), tests/includes1.cc (1.6),
+	  tests/includes2.cc (1.5), tests/includes3.cc (1.5),
+	  tests/includes4.cc (1.5): Small fix in a comment of
+	  Polyhedron.defs.hh.  Modified a few tests to let them compile
+	  after the API changes.
+
+2002-03-06 Wednesday 15:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* NEWS (1.15), src/relations.hh (1.2): Small change in a comment to
+	  enum Relation_Poly_Con.  Added to NEWS information about the
+	  replacement of includes() and satisfies() by methods
+	  relation_with().
+
+2002-03-06 Wednesday 15:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.34), src/GenSys.defs.hh (1.43), src/Makefile.am
+	  (1.28), src/Polyhedron.cc (1.133), src/Polyhedron.defs.hh (1.79),
+	  src/relations.cc (1.1), src/relations.hh (1.1),
+	  tests/satisfies1.cc (1.7), tests/satisfies2.cc (1.5),
+	  tests/satisfies3.cc (1.6), tests/satisfies4.cc (1.3): Put under
+	  CVS control.
+
+2002-03-06 Wednesday 15:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ack.clpq (1.1), ackn.clpq (1.1), clpq.pl
+	  (1.1), clpq2.pl (1.1), fib.clpq (1.1), mc91.clpq (1.1),
+	  ppl_prolog.pl (1.1), smm.clpq (1.1), smmdiff.clpq (1.1),
+	  sumto.clpq (1.1), tak.clpq (1.1), SICStus/Makefile.am (1.13),
+	  SICStus/ack.clpq (1.4), SICStus/ackn.clpq (1.2), SICStus/clpq.pl
+	  (1.28), SICStus/clpq2.pl (1.4), SICStus/fib.clpq (1.3),
+	  SICStus/mc91.clpq (1.2), SICStus/ppl_sicstus.pl (1.19),
+	  SICStus/smm.clpq (1.2), SICStus/smmdiff.clpq (1.3),
+	  SICStus/sp_clpq.pl (1.1), SICStus/sumto.clpq (1.2),
+	  SICStus/tak.clpq (1.2): Share as much sources as possible among
+	  all supported Prolog implementations.
+
+2002-03-06 Wednesday 13:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.7),
+	  track_allocation.hh (1.2), SICStus/ppl_sicstus.cc (1.36),
+	  SICStus/ppl_sicstus.pl (1.18): GNU Prolog, SICStus Prolog and
+	  SWI-Prolog interfaces now share most of the code.
+
+2002-03-06 Wednesday 11:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.33): In GenSys::affine_image(), rays and lines
+	  can be mapped into the origin only if the transformation is NOT
+	  invertible.
+
+2002-03-06 Wednesday 11:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.132): Invertible affine transformations
+	  preserve both the minimality and the saturation relations of
+	  constraints and generators.
+
+2002-03-06 Wednesday 08:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: exceptions.hh (1.3), ppl_prolog.outlines.hh
+	  (1.6), track_allocation.hh (1.1), GNU/ppl_gprolog.cc (1.4),
+	  SWI/ppl_swiprolog.cc (1.3): GNU Prolog interface fixed.  More
+	  common code between the GNU Prolog and the SWI Prolog interfaces.
+	  Allocation tracking implemented in a separate file.
+
+2002-03-05 Tuesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/ppl_gprolog.cc (1.3): Work around a couple
+	  of bugs in GNU Prolog 1.2.8.
+
+2002-03-05 Tuesday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.32): Now GenSys::satisfy() correctly handles the
+	  case when c is an equality.  Still have to check the case of c
+	  being an inequality.
+
+2002-03-05 Tuesday 16:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/satisfies4.cc (1.2): Corrected the test just inserted (and
+	  set NOISY = 0).
+
+2002-03-05 Tuesday 15:46  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.47), satisfies4.cc (1.1): The test
+	  satisfies4 shows a bug whereby we return SOME_SATISFY even when
+	  the considered equality constraint has an empty intersection with
+	  the polyhedron.
+
+2002-03-05 Tuesday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.131): Corrected a bug in satisfies() for the
+	  case when *this is a zero-dim univ.  polyhedron. Now the test
+	  satisfies3 should pass.
+
+2002-03-05 Tuesday 14:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/satisfies3.cc (1.5): Test satisfies3 modified to check all
+	  the possibilities when calling Polyhedron::satisfies() on a
+	  zero-dim-universe polyhedron.  The old test was meaningless,
+	  since it was saying that the wrong result was ok. This new test
+	  shows a bug that I am going to correct.
+
+2002-03-05 Tuesday 12:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.39): A couple of spelling errors in
+	  comments fixed.
+
+2002-03-04 Monday 22:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.9),
+	  devref-print.doxyconf-latex.in (1.9), devref.doxyconf-html.in
+	  (1.10): Include the Prolog interfaces into the documentation for
+	  developers.
+
+2002-03-04 Monday 22:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: SICStus/ppl_sicstus.cc (1.35),
+	  SWI/ppl_swiprolog.cc (1.2): Small improvements.
+
+2002-03-04 Monday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/GNU/: Makefile.am (1.2), ppl_gprolog.cc (1.2),
+	  ppl_gprolog.pl (1.1): GNU Prolog interface almost complete.
+
+2002-03-04 Monday 17:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/simplify.cc (1.12): Adjusted the comments in the part where
+	  we check the independence rule for inequalities.
+
+2002-03-04 Monday 17:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: GNU/.cvsignore (1.1), SWI/.cvsignore (1.1):
+	  Put under CVS control.
+
+2002-03-04 Monday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.30), interfaces/Prolog/GNU/Makefile.am (1.1),
+	  interfaces/Prolog/GNU/ppl_gprolog.cc (1.1): GNU Prolog interface
+	  started.
+
+2002-03-04 Monday 17:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.12), ppl_sicstus.cc
+	  (1.34): Comment added.  Do not use the preprocessor to declare
+	  constants.
+
+2002-03-04 Monday 17:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/: Makefile.am (1.3), ppl_swi.cc (1.7),
+	  ppl_swiprolog.cc (1.1): Renamed.
+
+2002-03-04 Monday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swi.cc (1.6): More interface functions
+	  added.
+
+2002-03-04 Monday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/Makefile.am (1.2), src/Makefile.am (1.27):
+	  Comments fixed.
+
+2002-03-04 Monday 16:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.8): Updated.
+
+2002-03-04 Monday 15:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.29), interfaces/Prolog/exceptions.hh (1.2),
+	  interfaces/Prolog/ppl_prolog.outlines.hh (1.5),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.33),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.17),
+	  interfaces/Prolog/SWI/Makefile.am (1.1),
+	  interfaces/Prolog/SWI/ppl_swi.cc (1.5),
+	  interfaces/Prolog/SWI/pplpl.cc (1.1): SWI Prolog interface almost
+	  complete.
+
+2002-03-04 Monday 14:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.130): Since the Row::capacity() method is
+	  accessible only during debugging, we no longer swap rows in
+	  Polyhedron::add_constraints() (we always swap the coefficeints).
+
+2002-03-03 Sunday 11:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: minimize.cc (1.16), simplify.cc (1.11): Started polishing
+	  the comments, and also the code in a few places, for the function
+	  simplify(). Adjusted a few comments in minimize(), regarding the
+	  saturation matrix.
+
+2002-03-02 Saturday 17:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/exceptions.hh (1.1): Exceptions to be used by
+	  the Prolog interfaces.
+
+2002-03-02 Saturday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.4),
+	  SICStus/ppl_sicstus.cc (1.32), SICStus/ppl_sicstus.pl (1.16),
+	  SWI/ppl_swi.cc (1.4): Progress on the SWI and SICStus interfaces.
+	  More error checking added.
+
+2002-03-02 Saturday 14:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.3),
+	  SICStus/ppl_sicstus.cc (1.31), SWI/ppl_swi.cc (1.3): SICStus and
+	  SWI interfaces reconciled.
+
+2002-03-02 Saturday 09:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.129): In add_constraints(), corrected a bug
+	  whereby we were mixing constraints having different row's
+	  capoacities into a single constraint system.
+
+2002-03-02 Saturday 09:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (1.15): Small change in a comment.
+
+2002-03-02 Saturday 09:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.43): Added the right doxygen comments to
+	  enumeration Generator::Type.	The special command
+	  \hideinitializer allows to mask implementation details.
+
+2002-03-02 Saturday 07:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: ppl_prolog.outlines.hh (1.2),
+	  SICStus/ppl_sicstus.cc (1.30), SWI/ppl_swi.cc (1.2): Some
+	  progress on the combined SICStus/SWI interface.
+
+2002-03-01 Friday 16:55  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.defs.hh (1.78), minimize.cc (1.14): Polished the
+	  function add_and_minimize(...).  No longer using variable
+	  `index', which was useless.  Some style changes to made the code
+	  more uniform wrt what is done in function minimize(...). Also,
+	  con_to_ray renamed into con_to_gen.
+
+2002-03-01 Friday 16:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SWI/ppl_swi.cc (1.1): This will become the
+	  SWI-Prolog stub.
+
+2002-03-01 Friday 15:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.29): Use
+	  ppl_prolog.outlines.hh.
+
+2002-03-01 Friday 15:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Makefile.am (1.5), ppl_prolog.outlines.hh
+	  (1.1): Will try to derive as much Prolog interfaces as possible
+	  from this one.
+
+2002-03-01 Friday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ppl_ciao.cc (1.2), ppl_ciao.pl (1.2):
+	  Ciao only handles integer type `int'.  Added placeholders for
+	  linker and compiler options.
+
+2002-03-01 Friday 14:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* interfaces/Prolog/Ciao/: ppl_ciao.cc (1.1), ppl_ciao.pl (1.1):
+	  Put under CVS control.  The structure of ppl_ciao.pl is basically
+	  there, even if there still are gaps to be filled. ppl_ciao.cc,
+	  for the moment, is just a bare copy of the code written for
+	  SICStus.
+
+2002-03-01 Friday 12:42  Elisa Ricci
+
+	* src/: conversion.cc, minimize.cc (positive.[5,9]): Tried to
+	  implement a new method to compute the system of constraints of a
+	  positive polyhedron defined by its system of generators: it is
+	  controlled by the flag "POS_SIMPLEX_TRICK".
+
+2002-02-28 Thursday 17:08  Elisa Ricci
+
+	* src/conversion.cc, src/minimize.cc, src/simplify.cc,
+	  tests/Makefile.am, tests/bug7.cc, tests/bug7.dat
+	  (positive.[4,8,4,8,1,1]): We need the equalities that derived
+	  from the constraints of positivity of the variables: this
+	  resolves "bug6".  Added a test that still fails.
+
+2002-02-28 Thursday 12:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.6): Reference added.
+
+2002-02-28 Thursday 08:44  Elisa Ricci
+
+	* src/: Generator.defs.hh (1.42), Row.defs.hh (1.28): Changed the
+	  place of the comment about the inhomogeneous term of a vertex.
+
+2002-02-27 Wednesday 19:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.14): Better explanations.
+
+2002-02-27 Wednesday 19:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.8),
+	  devref-print.doxyconf-latex.in (1.8), devref.doxyconf-html.in
+	  (1.9): Predefine PPL_INTERNAL and PPL_HIDDEN.
+
+2002-02-27 Wednesday 18:26  Elisa Ricci
+
+	* NEWS (1.13), src/Polyhedron.cc (1.128), src/Polyhedron.defs.hh
+	  (1.77), tests/Makefile.am (1.46), tests/bounded1.cc (1.1): Added
+	  the function Polyhedron::is_bounded() that returns true if and
+	  only if the polyhedron is bounded.  Added a test for this
+	  function.
+
+2002-02-27 Wednesday 17:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (1.13): In minimize(), added an assertion saying
+	  that matrix source is not empty.  Removed a FIXME and added a
+	  comment explaining why dest is initialized as what would be a
+	  non-legal generator matrix.
+
+2002-02-27 Wednesday 16:52  Elisa Ricci
+
+	* NEWS (1.12): Added the new feature that says that PPL does not
+	  call abort(), but we have an error message and the correction of
+	  the bug of the negative denominator of the vertex.
+
+2002-02-27 Wednesday 16:36  Elisa Ricci
+
+	* src/: Generator.cc (1.18), Generator.defs.hh (1.41),
+	  Polyhedron.cc (1.127): Considered the fact that a vertex must
+	  always have a positive denominator.
+
+2002-02-27 Wednesday 14:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.5): Non-Necessarily-Closed Polyhedra.
+
+2002-02-27 Wednesday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.4): Constructions on polyhedra.
+
+2002-02-27 Wednesday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/generators1.cc (1.3): Print something only when NOISY.
+
+2002-02-27 Wednesday 13:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* TODO (1.3): Started with the definition of strict weak ordering
+	  and with a statement about why we need one or more of them.
+
+2002-02-27 Wednesday 11:16  Elisa Ricci
+
+	* src/minimize.cc (1.12), tests/generators1.cc (1.2): Used the
+	  exception instead of the abort() and modified the test.
+
+2002-02-27 Wednesday 10:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.11), configure.ac (1.28), src/Makefile.am (1.26): We are
+	  now in the 0.4 era.
+
+2002-02-27 Wednesday 10:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/minimize.cc (1.11): Polishing the comments in function
+	  minimize().  Small changes to the code (no longer using the flag
+	  empty_or_illegal).
+
+2002-02-27 Wednesday 09:18  Elisa Ricci
+
+	* tests/: Makefile.am (1.45), generators1.cc (1.1): Added a test
+	  for a polyhedron built form a system of generators with a vertex
+	  with negative denominator.
+
+2002-02-26 Tuesday 14:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.27): Release number back to 0.3 i order to
+	  generate the Web pages' documentation.
+
+2002-02-26 Tuesday 12:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_3-branch.2), README (1.11): Fixed.
+
+2002-02-26 Tuesday 12:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (ppl-0_3-branch.1), NEWS (1.10): Updated.
+
+2002-02-26 Tuesday 12:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.10): Updated.
+
+2002-02-26 Tuesday 12:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (ppl-0_3-branch.1): Updated.
+
+2002-02-26 Tuesday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.26): Bump version number: the main trunk is now
+	  in the 0.4 era.
+
+2002-02-26 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (ppl-0_3-branch.1): Update version.
+
+2002-02-26 Tuesday 12:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (ppl-0_3-branch.1): Mark ChangeLog.
+
+2002-02-26 Tuesday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (ppl-0_3-branch.1),
+	  Makefile.am (1.11): Ignore all space when comparing results.
+
+2002-02-26 Tuesday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.7): Updated.
+
+2002-02-26 Tuesday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.9): Updated.
+
+2002-02-26 Tuesday 11:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.6), config.guess (1.8), doc/definitions.dox (1.36),
+	  interfaces/Prolog/SICStus/clpq.pl (1.27),
+	  interfaces/Prolog/SICStus/clpq2.pl (1.3),
+	  interfaces/Prolog/SICStus/expected (1.4),
+	  interfaces/Prolog/SICStus/fib.clpq (1.2),
+	  interfaces/Prolog/SICStus/smmdiff.clpq (1.2),
+	  src/Constraint.defs.hh (1.38), src/GenSys.cc (1.31),
+	  src/Polyhedron.cc (1.126), tests/addconstraints11.cc (1.4),
+	  tests/addconstraints5.cc (1.5), tests/adddimensions1.cc (1.5),
+	  tests/convexdifference1.cc (1.7), tests/error28.cc (1.2),
+	  tests/error29.cc (1.2), tests/universe5.cc (1.3): Trailing blanks
+	  removed.
+
+2002-02-26 Tuesday 10:34  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.76): Added the documentation for the
+	  exception thrown in the function Polyhedron::add_generators and
+	  Polyhedron::add_generators_and_minimize if the polyhedron is
+	  empty and the system of generators has no vertices.
+
+2002-02-26 Tuesday 09:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.37): Simplified the example showing how
+	  to use the Constraint::coefficient() methods.
+
+2002-02-26 Tuesday 08:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.15):
+	  ppl_convex_difference_assign/2 mentioned.
+
+2002-02-26 Tuesday 02:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.23): Another big pass on all the comments,
+	  trying to uniformize the terminology.  Small changes in the code
+	  to avoid repeating tests that are useless under certain
+	  conditions.
+
+2002-02-25 Monday 22:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.36): Small changes in the
+	  documentation.
+
+2002-02-25 Monday 22:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.14), configure.ac (1.25), doc/Makefile.am (1.16),
+	  interfaces/Makefile.am (1.3), interfaces/Prolog/Makefile.am
+	  (1.4), interfaces/Prolog/SICStus/Makefile.am (1.10),
+	  m4/Makefile.am (1.5), m4/ac_check_gmp.m4 (1.3), src/Makefile.am
+	  (1.25), tests/Makefile.am (1.44): Limit the exceptions to the
+	  GPL.
+
+2002-02-25 Monday 21:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.40): The example on the use of
+	  coefficient(v) modified to keep into account the divisor of the
+	  vertex and to actually check that g1 is a vertex.
+
+2002-02-25 Monday 18:02  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.35), Generator.defs.hh (1.39):
+	  Modified the example of the use of coefficient(v) for a
+	  generator.  Modified also the similar example for a constraint,
+	  now using the assignment operator.
+
+2002-02-25 Monday 17:28  Elisa Ricci
+
+	* tests/: Makefile.am (1.43), addconstraints10.cc (1.4),
+	  addconstraints11.cc (1.3), addconstraints2.cc (1.8),
+	  addconstraints4.cc (1.3), addconstraints5.cc (1.4),
+	  addconstraints6.cc (1.4), addconstraints7.cc (1.4),
+	  addconstraints8.cc (1.4), addconstraints9.cc (1.4),
+	  adddimensions1.cc (1.4), adddimensions2.cc (1.3),
+	  adddimensions3.cc (1.3), adddimensions4.cc (1.3),
+	  addgenerators1.cc (1.4), addgenerators2.cc (1.4),
+	  addgenerators3.cc (1.3), addgenerators4.cc (1.3),
+	  addgenerators5.cc (1.3), addgenerators6.cc (1.3), affineimage1.cc
+	  (1.3), affineimage2.cc (1.3), affinepreimage1.cc (1.3),
+	  affinepreimage2.cc (1.3), affinepreimage3.cc (1.2),
+	  affinepreimage4.cc (1.3), convexdifference1.cc (1.6),
+	  convexhull1.cc (1.4), convexhull2.cc (1.3), error28.cc (1.1),
+	  error29.cc (1.1), includes2.cc (1.4), includes3.cc (1.4),
+	  includes4.cc (1.4), inters3.cc (1.4), inters4.cc (1.3),
+	  inters5.cc (1.4), inters6.cc (1.3), limitedwidening1.cc (1.5),
+	  removedim2.cc (1.7), removedim3.cc (1.4), removedim4.cc (1.4),
+	  removedim5.cc (1.3), removedim6.cc (1.3), satisfies1.cc (1.6),
+	  satisfies2.cc (1.4), satisfies3.cc (1.4), universe1.cc (1.2),
+	  universe2.cc (1.2), universe3.cc (1.2), universe4.cc (1.2),
+	  universe5.cc (1.2): We use the functions of the file print.hh to
+	  print when it is possible.  Added two tests for the functions
+	  Polyhedron::add_generators() and
+	  Polyhedron::add_generators_and_minimize().
+
+2002-02-25 Monday 17:23  Elisa Ricci
+
+	* src/Polyhedron.cc (1.125): In functions
+	  Polyhedron::add_generators() and
+	  Polyhedron::add_generators_and_minimize, we throw an exception if
+	  we add a system of generators with no vertex to an empty
+	  polyhedron.
+
+2002-02-25 Monday 17:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/globals.hh (1.9): Qualified name is not allowed in namespace
+	  member declaration.
+
+2002-02-25 Monday 17:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.34), Constraint.inlines.hh (1.18),
+	  Generator.defs.hh (1.38), Generator.inlines.hh (1.19),
+	  Row.defs.hh (1.27), Row.inlines.hh (1.10): Assignments operators
+	  added for Constraint and Generator.  Some cleaning meanwhile.
+
+2002-02-25 Monday 15:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.33): Changed the example showing how to
+	  use method coefficient(v) and is_equality(). This shows that we
+	  probably miss a public method that is capable to set the
+	  relational operator of a constraint.
+
+2002-02-25 Monday 15:02  Elisa Ricci
+
+	* tests/: addconstraints1.cc (1.4), addconstraints10.cc (1.3),
+	  addconstraints5.cc (1.3), addconstraints6.cc (1.3),
+	  addconstraints7.cc (1.3), addconstraints8.cc (1.3),
+	  addconstraints9.cc (1.3), error25.cc (1.3), includes1.cc (1.5),
+	  includes2.cc (1.3), includes3.cc (1.3), includes4.cc (1.3),
+	  inters5.cc (1.3), satisfies2.cc (1.3), satisfies3.cc (1.3):
+	  Corrected some errors in the tests.
+
+2002-02-25 Monday 14:51  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.16), Constraint.defs.hh (1.32),
+	  Constraint.inlines.hh (1.17), Generator.cc (1.17),
+	  Generator.defs.hh (1.37), Generator.inlines.hh (1.18): Added
+	  non-inlined methods that throw exceptions. These are now called
+	  by the inline methods coefficient(v).
+
+2002-02-25 Monday 14:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.7), config.sub (1.7): Updated.
+
+2002-02-25 Monday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.124), Row.cc (1.27), Row.defs.hh (1.26):
+	  Row::first(), Row::last(), Row::next() and Row::prev() are gone.
+
+2002-02-25 Monday 13:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/conversion.cc (1.22): Started polishing comments. Avoided
+	  swapping rows with themselves.  A few other tiny improvements.
+
+2002-02-25 Monday 12:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints10.cc (1.2), addconstraints11.cc (1.2),
+	  addconstraints2.cc (1.7), addconstraints4.cc (1.2),
+	  addconstraints5.cc (1.2), addconstraints6.cc (1.2),
+	  addconstraints7.cc (1.2), addconstraints8.cc (1.2),
+	  addconstraints9.cc (1.2), adddimensions1.cc (1.3),
+	  adddimensions2.cc (1.2), adddimensions3.cc (1.2),
+	  adddimensions4.cc (1.2), addgenerators1.cc (1.3),
+	  addgenerators2.cc (1.3), addgenerators3.cc (1.2),
+	  addgenerators4.cc (1.2), addgenerators5.cc (1.2),
+	  addgenerators6.cc (1.2), affineimage2.cc (1.2),
+	  affinepreimage1.cc (1.2), affinepreimage2.cc (1.2),
+	  affinepreimage4.cc (1.2), affinetrans.cc (1.7),
+	  convexdifference1.cc (1.5), convexhull1.cc (1.3), convexhull2.cc
+	  (1.2), convexhull3.cc (1.2), error18.cc (1.2), error20.cc (1.2),
+	  error21.cc (1.2), error25.cc (1.2), error26.cc (1.2), error27.cc
+	  (1.2), error6.cc (1.3), error7.cc (1.2), error9.cc (1.2),
+	  includes1.cc (1.4), includes2.cc (1.2), includes3.cc (1.2),
+	  includes4.cc (1.2), inters3.cc (1.3), inters4.cc (1.2),
+	  inters5.cc (1.2), inters6.cc (1.2), permute.cc (1.13), print.hh
+	  (1.5), removedim3.cc (1.3), removedim4.cc (1.3), removedim5.cc
+	  (1.2), removedim6.cc (1.2), satisfies1.cc (1.5), satisfies2.cc
+	  (1.2), satisfies3.cc (1.2): Started putting some order in the way
+	  results are returned how objects are built, and how we print
+	  things in NOISY mode.  While at it, a zillion of trailing blanks
+	  have been removed.
+
+2002-02-25 Monday 12:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.15): Unwanted change retracted.
+
+2002-02-25 Monday 11:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.31), Constraint.cc (1.14),
+	  Constraint.defs.hh (1.31), GenSys.defs.hh (1.42),
+	  Generator.defs.hh (1.36), Makefile.am (1.24),
+	  ppl_filter_doxygen.sed (1.1), ppl_filter_install.sed (1.1): Now
+	  PPL_INTERNAL means `private' everywhere we are not compiling the
+	  library itself.  PPL_HIDDEN, instead, is `private' only to keep
+	  doxygen from including documentation that is not for the user.
+
+2002-02-25 Monday 10:02  Elisa Ricci
+
+	* tests/: Makefile.am (1.42), addconstraints10.cc (1.1),
+	  addconstraints11.cc (1.1), addconstraints4.cc (1.1),
+	  addconstraints5.cc (1.1), addconstraints6.cc (1.1),
+	  addconstraints7.cc (1.1), addconstraints8.cc (1.1),
+	  addconstraints9.cc (1.1), adddimensions2.cc (1.1),
+	  adddimensions3.cc (1.1), adddimensions4.cc (1.1),
+	  addgenerators3.cc (1.1), addgenerators4.cc (1.1),
+	  addgenerators5.cc (1.1), addgenerators6.cc (1.1), affineimage2.cc
+	  (1.1), affinepreimage1.cc (1.1), affinepreimage2.cc (1.1),
+	  affinepreimage3.cc (1.1), affinepreimage4.cc (1.1),
+	  convexhull2.cc (1.1), convexhull3.cc (1.1), error10.cc (1.1),
+	  error11.cc (1.1), error12.cc (1.1), error13.cc (1.1), error14.cc
+	  (1.1), error15.cc (1.1), error16.cc (1.1), error17.cc (1.1),
+	  error18.cc (1.1), error19.cc (1.1), error20.cc (1.1), error21.cc
+	  (1.1), error22.cc (1.1), error23.cc (1.1), error24.cc (1.1),
+	  error25.cc (1.1), error26.cc (1.1), error27.cc (1.1), error6.cc
+	  (1.2), error7.cc (1.1), error8.cc (1.1), error9.cc (1.1),
+	  includes2.cc (1.1), includes3.cc (1.1), includes4.cc (1.1),
+	  inters4.cc (1.1), inters5.cc (1.1), inters6.cc (1.1),
+	  removedim5.cc (1.1), removedim6.cc (1.1), satisfies2.cc (1.1),
+	  satisfies3.cc (1.1), universe1.cc (1.1), universe2.cc (1.1),
+	  universe3.cc (1.1), universe4.cc (1.1), universe5.cc (1.1): Added
+	  new tests for the functions of the Polyhedron class.
+
+2002-02-25 Monday 09:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/conversion.cc (1.21): Two kludges (with FIXME) to continue
+	  supporting GCC 2.96.
+
+2002-02-25 Monday 08:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.14): Minor typos fixed.
+
+2002-02-25 Monday 08:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.13): Add CIAO Prolog to
+	  the list of (to be) supported systems and sort the list of
+	  prologs alphabetically.
+
+2002-02-25 Monday 01:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.30), Generator.defs.hh (1.35): Added
+	  examples on the use of methods coefficient(v), coefficient() and
+	  divisor(), as well as (en passant) the method Generator::type().
+
+2002-02-25 Monday 00:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Row.defs.hh (1.25): Added comments to methods first(),
+	  last(), next(...) and prev(...).
+
+2002-02-24 Sunday 22:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: addconstraints2.cc (1.6), includes1.cc (1.3),
+	  satisfies1.cc (1.4): Do not use private methods.
+
+2002-02-24 Sunday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Init.cc (1.1), Init.defs.hh (1.1), Init.inlines.hh (1.1),
+	  Init.types.hh (1.1), Makefile.am (1.23), Row.cc (1.26),
+	  conversion.cc (1.20), globals.cc (1.3), globals.hh (1.8),
+	  initializer.hh (1.1): New standard compliant mechanism for the
+	  library initialization and finalization.  New implementation for
+	  tmp_Integer (worth a speedup greater than 3%).
+
+2002-02-24 Sunday 19:31  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/SatRow.inlines.hh (1.9): Spurious space in comment removed.
+
+2002-02-24 Sunday 19:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (1.16): Using function
+	  all_homogeneous_terms_are_zero() when building a ray or line to
+	  check their validity.
+
+2002-02-24 Sunday 19:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.17): Throwing an exception if
+	  Generator::coefficient(v) is called with a variable beyond the
+	  space-dimension.
+
+2002-02-24 Sunday 19:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.inlines.hh (1.16): We now throw an exception if
+	  Constraint::coefficient(v) is called with a variable which is
+	  beyond the current space-dimension.
+
+2002-02-24 Sunday 19:25  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.123): Many comments adjusted. We now use the
+	  BE_LAZY flag in Polyhedron::operator<=, where we do not
+	  necessarily minimize given arguments.
+
+2002-02-24 Sunday 19:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.30): Using "satisfy" instead of "verify" when
+	  talking about the relation between a generator and a constraint.
+
+2002-02-24 Sunday 12:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.13), README (1.9), configure.ac (1.24),
+	  doc/Makefile.am (1.15), doc/definitions.dox (1.35),
+	  interfaces/Makefile.am (1.2), interfaces/Prolog/Makefile.am
+	  (1.3), interfaces/Prolog/SICStus/Makefile.am (1.9),
+	  interfaces/Prolog/SICStus/clpq.pl (1.26),
+	  interfaces/Prolog/SICStus/clpq2.pl (1.2),
+	  interfaces/Prolog/SICStus/expected (1.3), m4/Makefile.am (1.4),
+	  m4/ac_check_gmp.m4 (1.2), src/ConSys.cc (1.22),
+	  src/ConSys.defs.hh (1.30), src/ConSys.inlines.hh (1.11),
+	  src/ConSys.types.hh (1.2), src/Constraint.cc (1.13),
+	  src/Constraint.defs.hh (1.29), src/Constraint.inlines.hh (1.15),
+	  src/Constraint.types.hh (1.2), src/GenSys.cc (1.29),
+	  src/GenSys.defs.hh (1.41), src/GenSys.inlines.hh (1.11),
+	  src/GenSys.types.hh (1.2), src/Generator.cc (1.15),
+	  src/Generator.defs.hh (1.34), src/Generator.inlines.hh (1.16),
+	  src/Generator.types.hh (1.2), src/Integer.cc (1.2),
+	  src/Integer.defs.hh (1.2), src/Integer.inlines.hh (1.2),
+	  src/Integer.types.hh (1.2), src/LinExpression.cc (1.9),
+	  src/LinExpression.defs.hh (1.22), src/LinExpression.inlines.hh
+	  (1.10), src/LinExpression.types.hh (1.2), src/Makefile.am (1.22),
+	  src/Matrix.cc (1.27), src/Matrix.defs.hh (1.15),
+	  src/Matrix.inlines.hh (1.14), src/Matrix.types.hh (1.2),
+	  src/Polyhedron.cc (1.122), src/Polyhedron.defs.hh (1.75),
+	  src/Polyhedron.inlines.hh (1.15), src/Polyhedron.types.hh (1.2),
+	  src/Row.cc (1.25), src/Row.defs.hh (1.24), src/Row.inlines.hh
+	  (1.9), src/Row.types.hh (1.2), src/SatMatrix.cc (1.11),
+	  src/SatMatrix.defs.hh (1.12), src/SatMatrix.inlines.hh (1.7),
+	  src/SatMatrix.types.hh (1.2), src/SatRow.cc (1.5),
+	  src/SatRow.defs.hh (1.9), src/SatRow.inlines.hh (1.8),
+	  src/SatRow.types.hh (1.2), src/Status.cc (1.9),
+	  src/Status.defs.hh (1.11), src/Status.inlines.hh (1.5),
+	  src/Status.types.hh (1.2), src/Variable.cc (1.4),
+	  src/Variable.defs.hh (1.11), src/Variable.inlines.hh (1.5),
+	  src/Variable.types.hh (1.2), src/conversion.cc (1.19),
+	  src/globals.hh (1.7), src/minimize.cc (1.10), src/ppl_header.top
+	  (1.3), src/simplify.cc (1.10), tests/Makefile.am (1.41),
+	  tests/addconstraints1.cc (1.3), tests/addconstraints2.cc (1.5),
+	  tests/addconstraints3.cc (1.2), tests/adddimensions1.cc (1.2),
+	  tests/addgenerators1.cc (1.2), tests/addgenerators2.cc (1.2),
+	  tests/affineimage1.cc (1.2), tests/affinetrans.cc (1.6),
+	  tests/append1.cc (1.8), tests/append2.cc (1.9),
+	  tests/convexdifference1.cc (1.4), tests/convexhull1.cc (1.2),
+	  tests/ehandlers.hh (1.3), tests/empty1.cc (1.6), tests/error1.cc
+	  (1.7), tests/error2.cc (1.9), tests/error3.cc (1.9),
+	  tests/error4.cc (1.4), tests/error5.cc (1.5), tests/includes1.cc
+	  (1.2), tests/inters1.cc (1.8), tests/inters2.cc (1.10),
+	  tests/inters3.cc (1.2), tests/limitedwidening1.cc (1.4),
+	  tests/limitedwidening2.cc (1.3), tests/onepoint.cc (1.2),
+	  tests/permute.cc (1.12), tests/randchull1.cc (1.10),
+	  tests/removedim1.cc (1.3), tests/removedim2.cc (1.6),
+	  tests/removedim3.cc (1.2), tests/removedim4.cc (1.2),
+	  tests/satisfies1.cc (1.3), tests/smm1.cc (1.2), doc/devref.tex
+	  (1.7), doc/user.tex (1.8): Copyright year bumped.
+
+2002-02-23 Saturday 17:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/convexdifference1.cc (1.3): Do not be noisy.
+
+2002-02-23 Saturday 17:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.121), tests/convexdifference1.cc (1.2):
+	  Polyhedron::convex_difference_assign() fixed.
+
+2002-02-23 Saturday 16:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.120): Method
+	  Polyhedron::convex_diffrence_assign corrected.  The new version
+	  forces the result to be a _closed_ polyhedron.
+
+2002-02-23 Saturday 14:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.8), src/Polyhedron.cc (1.119), src/Polyhedron.defs.hh
+	  (1.74), tests/Makefile.am (1.40), tests/convexdifference1.cc
+	  (1.1): New methods Polyhedron::convex_difference_assign(const
+	  Polyhedron&) and
+	  Polyhedron::convex_difference_assign_and_minimize(const
+	  Polyhedron&).  They assigns to *this the convex hull of the
+	  set-theoretic difference of *this and the argument (possibly non
+	  minimized or minimized, respectively).
+	  Polyhedron::convex_hull_assign() was missing the final
+	  assert(OK()).
+
+2002-02-22 Friday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.7), src/Polyhedron.cc (1.118), src/Polyhedron.defs.hh
+	  (1.73), tests/limitedwidening1.cc (1.3),
+	  tests/limitedwidening2.cc (1.2):
+	  Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
+	  was erroneously returning a (random) boolean: it is now a void
+	  method.
+
+2002-02-22 Friday 19:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.39), limitedwidening2.cc (1.1): New test
+	  to check that the case where the passed constraint system is
+	  inconsistent with respect to the widened polyhedron.	Note: it
+	  currently fails, since Polyhedron::limited_widening_assign() is
+	  buggy, as it is now.
+
+2002-02-22 Friday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/limitedwidening1.cc (1.2): Improved: now we check also the
+	  returned boolean.
+
+2002-02-22 Friday 19:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/print.hh (1.4): New functions to print the constraints and
+	  the generators.
+
+2002-02-22 Friday 19:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.117): Readability improvements to
+	  Polyhedron::limited_widening_assign().
+
+2002-02-22 Friday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.116): Slightly optimized operator <=(const
+	  Polyhedron& x, const Polyhedron& y).
+
+2002-02-22 Friday 08:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.6): Updated for release 0.3.
+
+2002-02-20 Wednesday 19:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.5): Updated.
+
+2002-02-20 Wednesday 13:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.115): In Polyhedron::add_constraints(ConSys&
+	  cs), turned on the BE_LAZY version which does not sort matrices
+	  and does not perform unnecessary copies.
+
+2002-02-17 Sunday 23:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/satisfies1.cc (1.2): Avoid a compiler warning when NOISY is
+	  0.
+
+2002-02-17 Sunday 21:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* acinclude.m4 (1.2), configure.ac (1.23),
+	  interfaces/Prolog/SICStus/Makefile.am (1.8), m4/Makefile.am
+	  (1.3), m4/ac_check_gmp.m4 (1.1), m4/ac_check_gmp_exceptions.m4
+	  (1.3), m4/ac_check_have_gmp.m4 (1.3), tests/Makefile.am (1.38):
+	  GMP configuration machinery rewritten (this should help people
+	  trying to build the PPL under CygWin).
+
+2002-02-15 Friday 16:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bug6.dat (positive.2): This is the correct test data.
+
+2002-02-15 Friday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: bug1.cc, bug2.cc, bug3.cc, bug4.cc, bug5.cc, bug6.cc
+	  (positive.[3,2,2,2,2,2]): All the invocations of Polyhedron::OK()
+	  were misplaced.
+
+2002-02-15 Friday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug6.cc, bug6.dat (positive.[7,1,1]): bug6
+	  shows that problems minimizations problems persist.
+
+2002-02-14 Thursday 14:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.22), src/Integer.cc (1.1), src/Integer.defs.hh
+	  (1.1), src/Integer.inlines.hh (1.1), src/Integer.types.hh (1.1),
+	  src/Makefile.am (1.21): Integer stuff moved up one level.
+
+2002-02-14 Thursday 13:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.37), affine_image1.cc (1.2),
+	  affineimage1.cc (1.1): For consistency, affine_image1.cc has been
+	  renamed affineimage1.cc.
+
+2002-02-14 Thursday 13:17  Elisa Ricci
+
+	* tests/: Makefile.am (1.36), adddimensions1.cc (1.1),
+	  convexhull1.cc (1.1), inters3.cc (1.1), limitedwidening1.cc
+	  (1.1), removedim4.cc (1.1): Added tests for the functions
+	  Polyhedron::add_dimensions_and_project(),
+	  Polyhedron::convex_hull_assign(),
+	  Polyhedron::intersection_assign(),
+	  Polyhedron::limited_widening_assign() and
+	  Polyhedron::remove_higher_dimensions().
+
+2002-02-14 Thursday 11:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.114): Added comments regarding the handling
+	  of the `sorted' flag in methods remove_dimensions and
+	  remove_higher_dimensions.
+
+2002-02-14 Thursday 11:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.cc (1.28): In method remove_invalid_lines_and_rays(),
+	  we do not need to keep the generators sorted (this saves
+	  efficiency, since we were always calling it with a possibly
+	  non-sorted system).  Using remove_invalid_lines_and_rays() in
+	  affine_image.
+
+2002-02-14 Thursday 10:04  Elisa Ricci
+
+	* src/Generator.cc (1.14): Changed the error message and the
+	  comment in function Generator::OK().
+
+2002-02-14 Thursday 09:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.27), Polyhedron.cc (1.113): Avoiding all
+	  shadowing of the space_dim member of a Polyhedron.  Now using the
+	  accessor Polyhedron::space_dimension() only when needed.  Fixed a
+	  few comments.
+
+2002-02-14 Thursday 09:37  Elisa Ricci
+
+	* src/Polyhedron.cc (1.112), tests/Makefile.am (1.35),
+	  tests/includes1.cc (1.1): Erased the abort() at the end of
+	  function Polyhedron::includes(g) and added a test for this
+	  function.
+
+2002-02-13 Wednesday 23:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.21): Bump version number.
+
+2002-02-13 Wednesday 23:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.26), GenSys.defs.hh (1.40): Overload the
+	  output operator for GenSys_Con_Rel.
+
+2002-02-13 Wednesday 23:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.34), affine_image1.cc (1.1), satisfies1.cc
+	  (1.1): New test programs.
+
+2002-02-13 Wednesday 19:08  Elisa Ricci
+
+	* src/: GenSys.cc (1.25), Polyhedron.cc (1.111): Modified the
+	  function Polyhedron::satisfies(...).	In function
+	  GenSys::affine_image(...) we erase the rows that have all the
+	  terms equal to zero.
+
+2002-02-13 Wednesday 12:07  Elisa Ricci
+
+	* src/minimize.cc (positive.7): In functions minimize() and
+	  add_and_minimize(), to obtain the system of constraints in the
+	  case !con_to_gen now we use conversion().
+
+2002-02-12 Tuesday 15:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug5.cc, bug5.dat (positive.[6,1,1]): bug5
+	  shows that we still have problems with minimization.
+
+2002-02-12 Tuesday 10:10  Elisa Ricci
+
+	* src/minimize.cc (positive.6): We must simplify also `dest' in
+	  function minimize to erase all redundant constraints in the case
+	  !con_to_gen.	In functions minimize() and add_and_minimize(), in
+	  the case !con_to_gen, there was an error when we choose the
+	  constraints to erase.
+
+2002-02-11 Monday 12:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug4.cc, bug4.dat (positive.[5,1,1]): bug4
+	  shows that we still have minimization problems.
+
+2002-02-11 Monday 11:49  Elisa Ricci
+
+	* src/minimize.cc (positive.5): In function add_and_minimize, we
+	  must simplify `dest' in the case !con_to_gen because it can
+	  contain redundant constraints.
+
+2002-02-11 Monday 10:57  Elisa Ricci
+
+	* src/: conversion.cc, minimize.cc, simplify.cc (positive.[3,4,3]):
+	  In function add_and_minimize and in the case of !con_to_gen, the
+	  system of constraints (that in this case is `dest') must contain
+	  the constraints of positivity of variables.  In minimize and
+	  add_and_minimize, we must erase the constraints that are a linear
+	  combination of an equality and a constraint of positivity of
+	  variables.
+
+2002-02-09 Saturday 07:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (positive.4): Error message made more specific.
+
+2002-02-07 Thursday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug3.cc, bug3.dat (positive.[4,1,1]): bug3
+	  shows that Polyhedron::minimize() does not minimize.
+
+2002-02-07 Thursday 14:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc, SatMatrix.inlines.hh (positive.[1,1]):
+	  SatMatrix::columns_erase_to_end() fixed (and no longer inline).
+
+2002-02-07 Thursday 12:25  Elisa Ricci
+
+	* src/: Row.cc, minimize.cc (positive.[3,3]): Corrected an error in
+	  the function Row::only_a_term_is_positive().	In minimize and in
+	  the case !con_to_gen we must call simplify() also for the `dest'
+	  because there is the possibility that constraints that are
+	  redundant with the constraints of positivity of variables are
+	  present in dest.
+
+2002-02-06 Wednesday 08:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug2.cc, bug2.dat (positive.[3,1,1]): bug2
+	  shows another problem this time cropping up in
+	  SatMatrix::columns_erase_to_end().
+
+2002-02-06 Wednesday 08:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/bug1.cc (positive.2): Assert that the input polyhedra are
+	  OK.
+
+2002-02-06 Wednesday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.110): Error messages improved.
+
+2002-02-05 Tuesday 22:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am, bug1.cc, bug1.dat (positive.[2,1,1]): bug1
+	  shows a problem with
+	  Polyhedron::convex_hull_assign_and_minimize().
+
+2002-02-05 Tuesday 22:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (positive.3): The input operator now handles
+	  the `positive' flag.
+
+2002-02-05 Tuesday 16:02  Elisa Ricci
+
+	* src/Matrix.cc, src/Matrix.defs.hh, src/Polyhedron.cc,
+	  src/Polyhedron.defs.hh, src/Polyhedron.inlines.hh, src/Row.cc,
+	  src/Row.defs.hh, src/conversion.cc, src/minimize.cc,
+	  src/simplify.cc, tests/Makefile.am, tests/addconstraints1.cc,
+	  tests/addconstraints2.cc, tests/addconstraints3.cc,
+	  tests/addgenerators1.cc, tests/addgenerators2.cc,
+	  tests/affinetrans.cc, tests/append1.cc, tests/append2.cc,
+	  tests/empty1.cc, tests/error2.cc, tests/error3.cc,
+	  tests/error4.cc, tests/error5.cc, tests/error6.cc,
+	  tests/inters1.cc, tests/inters2.cc, tests/onepoint.cc,
+	  tests/permute.cc, tests/randchull1.cc, tests/removedim1.cc,
+	  tests/removedim2.cc, tests/removedim3.cc, tests/smm1.cc
+	  (positive.[1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]):
+	  Considered the case of a positive poited cone (i.e. a polyhedron
+	  composed by points that satisfies the constraints of positivity
+	  of all variables).  Added a test that shows that we can not add
+	  or insert a line in a positive pointed cone.	All the tests use
+	  positive pointed cones.
+
+2002-02-04 Monday 22:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.109): More concise usage of stringstreams.
+
+2002-02-03 Sunday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.6), config.sub (1.6): Updated.
+
+2002-02-01 Friday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc, Polyhedron.defs.hh, Polyhedron.inlines.hh,
+	  Row.cc, Row.defs.hh, conversion.cc, minimize.cc, simplify.cc
+	  (positive.[1,1,1,1,1,1,1,1]): The work on positive polyhedra is
+	  being moved onto the `positive' branch.  Phase 2: latest changes
+	  reapplied on the branch.
+
+2002-02-01 Friday 15:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.108), Polyhedron.defs.hh (1.72),
+	  Polyhedron.inlines.hh (1.14), Row.cc (1.24), Row.defs.hh (1.23),
+	  conversion.cc (1.18), minimize.cc (1.9), simplify.cc (1.9): The
+	  work on positive polyhedra is being moved onto the `positive'
+	  branch.  Phase 1: latest changes undone.
+
+2002-01-31 Thursday 08:35  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.107), Polyhedron.defs.hh (1.71),
+	  Polyhedron.inlines.hh (1.13), Row.cc (1.23), Row.defs.hh (1.22),
+	  conversion.cc (1.17), minimize.cc (1.8), simplify.cc (1.8):
+	  Started to consider the case of positive polyhedra: this part is
+	  controlled by POSITIVE.
+
+2002-01-29 Tuesday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.20): Tell the user how to configure GMP.
+
+2002-01-29 Tuesday 15:41  Elisa Ricci
+
+	* src/Polyhedron.cc (1.106): In function
+	  Polyhedron::remove_higher_dimensions, erased the command `size_t
+	  space_dim = space_dimension()' because it caused a problem.
+
+2002-01-29 Tuesday 11:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.19), interfaces/Prolog/SICStus/ppl_sicstus.cc
+	  (1.28), m4/ac_check_gmp_exceptions.m4 (1.2),
+	  m4/ac_check_have_gmp.m4 (1.2), src/Constraint.cc (1.12),
+	  src/Constraint.inlines.hh (1.14), src/Generator.cc (1.13),
+	  src/Generator.defs.hh (1.33), src/LinExpression.cc (1.8),
+	  src/LinExpression.inlines.hh (1.9), src/Matrix.cc (1.26),
+	  src/Matrix.inlines.hh (1.13), src/Polyhedron.defs.hh (1.70),
+	  src/Row.cc (1.22), src/Row.defs.hh (1.21), src/conversion.cc
+	  (1.16), src/globals.hh (1.6), tests/randchull1.cc (1.9): We now
+	  use the integer C++ class of GMP, instead of baking our own.
+	  Note: we now require GMP 4.0.1 or higher.
+
+2002-01-29 Tuesday 08:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.20): Finish backing out the unwanted commit.
+
+2002-01-29 Tuesday 08:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.105): Better formatting for error messages.
+
+2002-01-29 Tuesday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.11), Constraint.inlines.hh (1.13),
+	  Generator.cc (1.12), Generator.defs.hh (1.32), LinExpression.cc
+	  (1.7), LinExpression.inlines.hh (1.8), Matrix.cc (1.25),
+	  Matrix.defs.hh (1.14), Matrix.inlines.hh (1.12), Polyhedron.cc
+	  (1.104), Polyhedron.defs.hh (1.69), Row.cc (1.21), Row.defs.hh
+	  (1.20), conversion.cc (1.15), globals.hh (1.5): Back out previous
+	  commit.
+
+2002-01-29 Tuesday 08:23  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.10), Constraint.inlines.hh (1.12),
+	  Generator.cc (1.11), Generator.defs.hh (1.31), LinExpression.cc
+	  (1.6), LinExpression.inlines.hh (1.7), Makefile.am (1.19),
+	  Matrix.cc (1.24), Matrix.defs.hh (1.13), Matrix.inlines.hh
+	  (1.11), Polyhedron.cc (1.103), Polyhedron.defs.hh (1.68), Row.cc
+	  (1.20), Row.defs.hh (1.19), conversion.cc (1.14), globals.hh
+	  (1.4): Better formatting for error messages.
+
+2002-01-29 Tuesday 07:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.27): Fix a couple of
+	  namespace and include file glitches.
+
+2002-01-27 Sunday 22:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.18), ppl.spec.in (1.7), doc/Makefile.am (1.14),
+	  interfaces/Prolog/SICStus/Makefile.am (1.7), src/Makefile.am
+	  (1.18), tests/Makefile.am (1.33): The move to libtool is
+	  complete: we can now build and distribute (with, e.g., RPM)
+	  static and dynamic versions of the library.
+
+2002-01-27 Sunday 17:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.12), configure.ac (1.17), ltmain.sh (1.1): Start
+	  to migrate to libtool.
+
+2002-01-27 Sunday 15:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.28): Fixed a typo in a (documentation)
+	  comment.
+
+2002-01-19 Saturday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.29), ConSys.inlines.hh (1.10),
+	  GenSys.defs.hh (1.39), GenSys.inlines.hh (1.10): ConSys and
+	  GenSys were both missing the assignment operator.
+
+2002-01-14 Monday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.5), config.sub (1.5): Updated.
+
+2001-12-23 Sunday 22:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.19): Include maxmin.hh.
+
+2001-12-20 Thursday 09:21  Elisa Ricci
+
+	* src/Polyhedron.cc (1.102): Modified the part of function
+	  Polyhedron::add_constraints(cs) that is controlled by "#if 0":
+	  used Matrix::grow(size_t, size_t) instead of resize(size_t,
+	  size_t) and swap instead of "=", where it is possible.
+
+2001-12-15 Saturday 11:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.6): Distribute also
+	  clpq2.pl.
+
+2001-12-15 Saturday 11:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.23), Polyhedron.cc (1.101), conversion.cc
+	  (1.13): Some comments fixed.
+
+2001-12-14 Friday 16:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/smmdiff.clpq (1.1): smmdiff.clpq is
+	  based on smm.clpq and solves the classic send-more-money problem
+	  so that each variable is bound to a unique number.
+
+2001-12-14 Friday 16:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq2.pl (1.1): clpq2.pl is an
+	  alternative meta-interpreter with some extra features, including
+	  disjunction.
+
+2001-12-13 Thursday 16:52  Elisa Ricci
+
+	* tests/: Makefile.am (1.32), addgenerators1.cc (1.1),
+	  addgenerators2.cc (1.1): Added a test for the function
+	  Polyhedron::add_generators_and_minimize(gs) and one for the
+	  function Polyhedron::add_generators(gs).
+
+2001-12-13 Thursday 16:50  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.100), Polyhedron.defs.hh (1.67): The
+	  function Polyhedron::add_generators(gs) now is called
+	  Polyhedron::add_generators_and_minimize(gs).	Added the function
+	  Polyhedron::add_generators(gs) that adds the system of generators
+	  "gs" to the polyhedron without minimizing the resulting
+	  polyhedron.
+
+2001-12-13 Thursday 11:35  Elisa Ricci
+
+	* src/Polyhedron.cc (1.99): In functions
+	  Polyhedron::add_constraints() and add_constraints_and_minimize()
+	  improved the comments for the case of a zero-dimensional
+	  polyhedron.
+
+2001-12-13 Thursday 08:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.98): Some comments have been improved.
+
+2001-12-12 Wednesday 18:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.31), bug1.cc (1.2), bug2.cc (1.2):
+	  Obsolete bug witnesses removed.
+
+2001-12-12 Wednesday 18:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.30), addconstraints3.cc (1.1): New test.
+
+2001-12-12 Wednesday 18:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.10), Generator.defs.hh (1.30),
+	  LinExpression.defs.hh (1.21), Matrix.cc (1.22), Polyhedron.cc
+	  (1.97), Polyhedron.defs.hh (1.66), Polyhedron.inlines.hh (1.12),
+	  Row.cc (1.18), Row.defs.hh (1.18), conversion.cc (1.12),
+	  minimize.cc (1.7), simplify.cc (1.7): Kill trailing blanks.
+
+2001-12-12 Wednesday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Row.cc (1.17): The function compare(const Row& x, const Row&
+	  y) can now compare rows of different size.
+
+2001-12-12 Wednesday 17:16  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.96), Polyhedron.inlines.hh (1.11): The
+	  function Polyhedron::set_zero_dim_univ() is now in Polyhedron.cc
+	  (instead of Polyhedron.inlines.hh), says that a zero-dimensional
+	  polyhedron is in a 0-dimensional space and clears the system of
+	  the polyhedron.  Used "space_dim" instead of "space_dimension()"
+	  (where we call this function many times).
+
+2001-12-12 Wednesday 14:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.95): Some minor improvements.
+
+2001-12-11 Tuesday 22:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.94): Bad uses of the negation operator `!'
+	  have been fixed.  Some comments improved.
+
+2001-12-11 Tuesday 19:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.10), SatMatrix.defs.hh (1.11): Wrong
+	  comments fixed.
+
+2001-12-11 Tuesday 19:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.defs.hh (1.10): Spurious declarations removed: two
+	  methods were declared and never used nor implemented.
+
+2001-12-11 Tuesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.12), Matrix.inlines.hh (1.10): Comments
+	  for Matrix::clear() adjusted.
+
+2001-12-11 Tuesday 18:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: SatMatrix.cc (1.9), SatMatrix.defs.hh (1.9),
+	  SatMatrix.inlines.hh (1.6): SatMatrix::clear() was complete
+	  nonsense: rewritten.
+
+2001-12-11 Tuesday 17:10  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.inlines.hh (1.9): Matrix::clear() now releases as much
+	  memory as possible.
+
+2001-12-11 Tuesday 16:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.6), user.tex (1.7): People that are no longer
+	  contributing or willing to contribute take a back seat (will
+	  simplify the publication of the documentation as a technical
+	  report).
+
+2001-12-11 Tuesday 11:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatRow.inlines.hh (1.7): Much more efficient (and concise)
+	  implementation for SatRow::clear_from().
+
+2001-12-11 Tuesday 10:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.93), Polyhedron.defs.hh (1.65): Comments
+	  added for Polyhedron::remove_higher_dimensions().
+
+2001-12-11 Tuesday 09:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.92): Polyhedron::Polyhedron(ConSys& cs)
+	  improved.
+
+2001-12-11 Tuesday 00:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.21), Matrix.defs.hh (1.11): Always compile
+	  Matrix::check_sorted().  Matrix::OK() fixed: the symbols `cerr'
+	  and `endl' live in the `std' namespace.
+
+2001-12-11 Tuesday 00:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.20), Matrix.inlines.hh (1.8), Polyhedron.cc
+	  (1.91): A default-constructed (empty) Matrix is now declared as
+	  sorted.  Matrix::grow() was not handling the `sorted' flag
+	  correctly: fixed.  Matrix::add_zero_columns() is now an inline
+	  method.  Matrix::OK() now checks that the `sorted' flag is set
+	  only if the matrix is actually sorted.
+	  Matrix::add_rows_and_columns() now asserts OK() before returning.
+	  Some comments fixed.
+
+2001-12-10 Monday 16:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.cc (1.8): SatMatrix::resize() was not shrinking the
+	  matrix when requested to do so: fixed.
+
+2001-12-10 Monday 12:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.cc (1.7): Added speculative memory allocation for
+	  SatMatrix.
+
+2001-12-10 Monday 08:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.90), Row.defs.hh (1.17): Some comments
+	  have been fixed.
+
+2001-12-09 Sunday 11:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.16): Bump version number so as to avoid
+	  confusion.
+
+2001-12-08 Saturday 10:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/expected (1.2), src/Row.defs.hh (1.16):
+	  EXTRA_NORMALIZATION defaults to 0.  Expected outcome from the
+	  clpq test updated.
+
+2001-12-05 Wednesday 18:58  Elisa Ricci
+
+	* src/: ConSys.cc (1.21), GenSys.cc (1.24), Matrix.cc (1.19),
+	  Matrix.defs.hh (1.10), Polyhedron.cc (1.89), Row.cc (1.16),
+	  Row.defs.hh (1.15), conversion.cc (1.11): The method
+	  Row::normalize() has been restored so that it only ensures
+	  coefficients are mutually prime.  The new method
+	  Row::strong_normalize() also ensures that the first non-zero
+	  coefficient of lines and equalities is negative.  The new method
+	  Matrix::strong_normalize() that calls strongly normalizes each
+	  row.	Strong normalization is now used wherever it is guaranteed
+	  to be both safe and efficient.  The "EXTRA_NORMALIZATION" flag is
+	  used to decide whether strong_normalization is also used in
+	  Row::libear_combine() (since in this case strong normalization
+	  can incur performance penalties).
+
+2001-12-03 Monday 09:16  Elisa Ricci
+
+	* src/Row.cc (1.15): Changed the function Row::normalize() so that
+	  the first coefficient different from zero is negative (and not
+	  positive).
+
+2001-12-02 Sunday 16:09  Elisa Ricci
+
+	* src/: Matrix.cc (1.18), Polyhedron.cc (1.88), Row.cc (1.14): In
+	  Polyhedron::intersection_assign_and_minimize added the assertion
+	  to verify if the resulting polyhedron is OK.	In function
+	  Row::normalize() if we normalize an equality or a line, we decide
+	  that the first element of the corresponding row is positive.	In
+	  function Matrix::back_substitute(), if we call linear_combine
+	  with an equality and an inequality, we must change the
+	  coefficients of the equality so that the coefficient of the
+	  inequality in the linear combination is non-negative.
+
+2001-11-26 Monday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.4), config.sub (1.4): Updated.
+
+2001-11-26 Monday 17:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.26): Typo fixed.
+
+2001-11-21 Wednesday 19:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.87): Changed the message of some exceptions:
+	  where it is possible we use the functions
+	  `throw_different_dimensions' and `throw_dimension_incompatible'.
+
+2001-11-20 Tuesday 20:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.25): End-of-line characters
+	  left behind be read_term/2 are now eaten.
+
+2001-11-13 Tuesday 21:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.4): Updated.
+
+2001-11-13 Tuesday 21:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.5): Mention that we have greatly improved the
+	  documentation.
+
+2001-11-13 Tuesday 21:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.3): Updated.
+
+2001-11-13 Tuesday 21:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.12): Use `| ?-'
+	  everywhere a goal is introduced.
+
+2001-11-13 Tuesday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.11): `E.g.' and `i.e.'
+	  must always be followed by comma.  There are no exceptions to
+	  this rule.
+
+2001-11-13 Tuesday 18:14  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.10): Documentation for
+	  ppl_add_consraints_and _minimize and for ppl_copy_polyhedron
+	  added.  Two examples for ppl_insert_constraints added that
+	  compare with examples for those for
+	  ppl_add_consraints_and_minimize.  Introductory sentence added.
+	  "To be written"  replaced by "Support for XXX ...future release."
+
+2001-11-13 Tuesday 17:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.8): Updated for release 0.2.
+
+2001-11-13 Tuesday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.15): Version number bumped to 0.2.
+
+2001-11-13 Tuesday 17:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.4): PPL 0.2 will be released on November 14, 2001.
+
+2001-11-13 Tuesday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.5): Packaging issues
+	  solved.
+
+2001-11-13 Tuesday 15:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: Makefile.am (1.4), check_script
+	  (1.1), expected (1.1): Use the meta-interpreter for `make check'.
+
+2001-11-13 Tuesday 15:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.24): reconsult(File) command
+	  fixed.
+
+2001-11-13 Tuesday 15:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_check.pl (1.7): Gone, at last.
+
+2001-11-13 Tuesday 15:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.23): Legalese added.
+
+2001-11-13 Tuesday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.22): Better support for
+	  debugging.  Now the `spy' command works as expected by most
+	  Prolog users.
+
+2001-11-13 Tuesday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/tak.clpq (1.1): New test program.
+
+2001-11-13 Tuesday 09:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ack.clpq (1.3), ackn.clpq (1.1):
+	  ack.clpq is the original version whereas ackn.clpq is the
+	  normalized version.
+
+2001-11-12 Monday 22:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.21): Fixed a bug whereby
+	  original_goal_variables/1 was not retracted in some cases.
+	  Multiple clauses for original_goal_variables/1 were causing the
+	  use of already discarded polyhedra.
+
+2001-11-12 Monday 22:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.25): When compiled
+	  with run-time assertions switched on, the interface now checks
+	  that the Prolog caller is not messing around with Polyhedron's
+	  addresses.
+
+2001-11-12 Monday 17:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.20): Use
+	  ppl_add_constraints_and_minimize/2 instead of adding one
+	  constraint at a time and then checking for emptiness.
+
+2001-11-12 Monday 17:41  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.24), ppl_sicstus.pl
+	  (1.15): New interface predicate
+	  ppl_add_constraints_and_minimize/2.
+
+2001-11-12 Monday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.19): Fixed bug in
+	  read_clauses/1: now unit clauses are read correctly.
+
+2001-11-12 Monday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.18): The meta-interpreter
+	  core has been rewritten.  Computed answer constraints are also
+	  output in a readable way with variables named as in the original
+	  goal.
+
+2001-11-12 Monday 16:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.9): General
+	  improvements throughout the file.
+
+2001-11-12 Monday 09:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.8): A linear expression
+	  for defining constraints or generators can only have integer
+	  coefficients.  Therefore division by a number is not allowed and
+	  option removed from the grammar rules.  Also a number can
+	  multiply a PPL variable but not an arbitrary linear expression.
+
+2001-11-11 Sunday 18:19  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.guess (1.3), config.sub (1.3): Updated.
+
+2001-11-11 Sunday 18:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/Makefile.am (1.3): Missing dependency
+	  added: pplsp depends on the library.	Do not assume `.' is in
+	  PATH.
+
+2001-11-11 Sunday 17:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.27), Constraint.inlines.hh (1.11),
+	  Generator.defs.hh (1.29), Generator.inlines.hh (1.15),
+	  Row.defs.hh (1.14): std::swap() specialized both for Constraint
+	  and Generator.  Less verbose comments for such a simple
+	  operation.
+
+2001-11-11 Sunday 17:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.cc (1.23): Spurious assertions removed.
+
+2001-11-11 Sunday 17:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.28), ConSys.inlines.hh (1.9), GenSys.cc
+	  (1.22), GenSys.defs.hh (1.38), GenSys.inlines.hh (1.9):
+	  ConSys::swap() and GenSys::swap() removed: they are inherited
+	  from Matrix.	GenSys::remove_invalid_lines_and_rays()
+	  implemented.
+
+2001-11-11 Sunday 16:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: GenSys.cc (1.21), GenSys.defs.hh (1.37), Polyhedron.cc
+	  (1.86): Use Constraint::trivial_true() and
+	  Constraint::trivial_false().	Prepare to remove invalid line and
+	  rays from a GenSys.  This is necessary in the
+	  Polyhedron::remove_...() methods.
+
+2001-11-11 Sunday 16:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.cc (1.20): Use Constraint::is_trivial_true().
+
+2001-11-11 Sunday 15:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.9), Generator.defs.hh (1.28): Added `bool
+	  Generator::OK() const'.
+
+2001-11-11 Sunday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.cc (1.9), Constraint.defs.hh (1.26):
+	  Constraint::is_trivial() renamed is_trivial_true().
+	  Constraint::is_unsatisfiable() renamed is_trivial_false().  Both
+	  now use Row::all_homogeneous_terms_are_zero().
+
+2001-11-11 Sunday 15:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Row.cc (1.13), Row.defs.hh (1.13): Added `bool
+	  Row::all_homogeneous_terms_are_zero() const'.
+
+2001-11-11 Sunday 12:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.85): All other things being equal, prefer
+	  pre-increment/decrement to post-increment/decrement.
+
+2001-11-10 Saturday 20:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.7), append2.cc (1.8), permute.cc (1.11):
+	  Infamous relops are already neutralized in ppl_install.hh.
+
+2001-11-09 Friday 19:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.29), smm1.cc (1.1): New test program.
+
+2001-11-09 Friday 18:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.17): Now clpq.pl does not
+	  require the lists module.
+
+2001-11-09 Friday 17:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.16): Now a vertex is
+	  inserted before any lines or rays.  This avoids a bug when
+	  inserting generators into the empty polyhedron.
+
+2001-11-09 Friday 16:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.15): Now the interpreter
+	  answers "yes" or "no".  The listing/0 command has been improved.
+
+2001-11-09 Friday 15:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Matrix.cc (1.17), Matrix.defs.hh (1.9), Polyhedron.cc
+	  (1.84), Row.cc (1.12), Row.defs.hh (1.12), conversion.cc (1.10):
+	  Another go at smart memory allocation.
+
+2001-11-09 Friday 15:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/addconstraints2.cc (1.4): Catch standard exceptions.
+
+2001-11-09 Friday 14:22  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.7): Corrections and
+	  improvements as suggested by Enea implemented.  Other corrections
+	  done and examples added.
+
+2001-11-09 Friday 13:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.14): Now there are no calls
+	  to the ppl_convex_hull_assign operation.  This version keeps the
+	  list of generators and uses that to recover from failure paths.
+
+2001-11-09 Friday 08:48  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.13): Now many of the
+	  unwanted temporary copies of polyhedra are deleted earlier.
+
+2001-11-08 Thursday 22:23  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.6): More detailed
+	  specification of the interface predicates with many examples
+	  added.  Introduction includes grammar rules and list of some
+	  important issues wrt using the PPL in Prolog.
+
+2001-11-08 Thursday 17:37  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.12): Each constraint output
+	  on a new line.
+
+2001-11-08 Thursday 15:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.pl (1.14): Comment
+	  containing documentation removed.
+
+2001-11-08 Thursday 15:30  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.11): The main polyhedron is
+	  now deleted when solve(goal) fails.
+
+2001-11-08 Thursday 12:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.10): Unwanted polyhedra are
+	  deleted now when calls to solve/7 fail.
+
+2001-11-08 Thursday 11:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.16): Matrix::resize_no_copy() now deals with the
+	  case where the vector of rows must be reallocated.
+
+2001-11-08 Thursday 10:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/Prolog_interface.dox (1.5): Detailed predicate
+	  descriptions drafted for SICStus Prolog.
+
+2001-11-08 Thursday 08:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.9): Some improvements to the
+	  efficiency by replacing calls to member/2 by member_check/2 and
+	  by reducing the number of calls to ppl_check_empty.  Also,
+	  numbervars/3 replaced by numvars/3 defined within clpq.pl.
+
+2001-11-07 Wednesday 13:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.pl (1.13): First draft of
+	  documentation for ppl_sicstus.pl the interface for Prolog.
+
+2001-11-07 Wednesday 11:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.8): This version tries to
+	  reduce the amount of memory leakage between requests for more
+	  solutions and between tests.
+
+2001-11-06 Tuesday 16:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.7): More small improvements
+	  made.
+
+2001-11-06 Tuesday 16:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/: ack.clpq (1.2), clpq.pl (1.6):
+	  clpq.pl: The comments have been corrected and 	 some
+	  simplifications to the code.	ack.clpq: A bug in the second
+	  clause corrected.
+
+2001-11-06 Tuesday 15:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.5): Temporary version. This
+	  is working but needs commenting and further checking.
+
+2001-11-05 Monday 11:36  Elisa Ricci
+
+	* src/ConSys.cc (1.19), src/ConSys.defs.hh (1.27), src/GenSys.cc
+	  (1.20), src/GenSys.defs.hh (1.36), src/Polyhedron.cc (1.83),
+	  src/Polyhedron.defs.hh (1.64), tests/affinetrans.cc (1.5),
+	  tests/error2.cc (1.8): Changed the name of some functions:
+	  Polyhedron::assign_variable --> Polyhedron::affine_image
+	  Polyhedron::substitute_variable --> Polyhedron::affine_preimage
+	  GenSys::assign_variable --> GenSys::affine_image
+	  ConSys::substitute_variable --> ConSys::affine_preimage The new
+	  names are used in the examples and in the tests.
+
+2001-11-05 Monday 10:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/smm.clpq (1.1): A new example program.
+
+2001-11-05 Monday 09:57  Elisa Ricci
+
+	* src/Polyhedron.cc (1.82): At the end of the functions
+	  Polyhedron::add_dimensions_and_project and
+	  Polyhedron::add_dimensions_and_constraints, we can have an empty
+	  polyhedron without the flag EMPTY sets: so, the assertion OK() is
+	  modified not to verify if the system of constraints is
+	  satisfiable.
+
+2001-11-05 Monday 09:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ack.clpq (1.1), fib.clpq (1.1),
+	  mc91.clpq (1.1), sumto.clpq (1.1): Small programs to test
+	  clpq.pl.
+
+2001-11-05 Monday 08:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.81): The final OK() assertion of
+	  Polyhedron::add_dimensions_and_embed() has been modified so as to
+	  allow for empty polyhedra.  Needs checking.  A similar analysis
+	  must be conducted on Polyhedron::add_dimensions_and_project().
+
+2001-11-05 Monday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.4): Let `.clpq' be the
+	  default extension.
+
+2001-11-05 Monday 07:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.17), Matrix.cc (1.15), Matrix.inlines.hh
+	  (1.7), Row.defs.hh (1.11), Row.inlines.hh (1.8), globals.hh
+	  (1.3): Speculative memory allocation is now completely
+	  implemented.	The function `size_t compute_capacity(size_t
+	  requested_size)' is now in namespace scope, since it is used both
+	  for Row's and for Matrix columns.  Its current implementation
+	  (2*(requested_size+1)) is to be considered experimental.
+
+2001-11-04 Sunday 22:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.34): Doxygen no longer causes a spurious
+	  string of characters in the user manual.
+
+2001-11-04 Sunday 22:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.14): In Matrix(const Matrix& y) the right
+	  row-capacity is computed for the copy.
+
+2001-11-04 Sunday 19:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.13): The methods Matrix::add_row(...) are now
+	  careful with respect to reallocation of the `rows' vector.  The
+	  stage is now ready for speculative memory allocation.
+
+2001-11-04 Sunday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.25), Constraint.inlines.hh (1.10),
+	  Polyhedron.cc (1.80): Added and used `const Constraint&
+	  Constraint::zero_dim_positivity()'.
+
+2001-11-04 Sunday 15:59  Elisa Ricci
+
+	* src/Polyhedron.cc (1.79): In functions
+	  Polyhedron::update_constraints and Polyhedron::update_generators
+	  we only have a saturation matrix up-to-date: so, we must say that
+	  the other is not up-to-date.	In function
+	  Polyhedron::assign_variable, if the transformation is not
+	  invertible, we must have the system of generators up-to-date, and
+	  then if the polyhedron is non-empty, we use the function
+	  GenSys::assign_variable to find the resulting polyhedron. so, we
+	  always modify the polyhedron (we do not modify the polyhedron if
+	  it is empty or if there are dimensional problems).
+
+2001-11-04 Sunday 15:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.78): Polyhedron::remove_...() methods
+	  improved.
+
+2001-11-04 Sunday 12:56  Elisa Ricci
+
+	* src/Matrix.cc (1.12): A wrong comment erased: it is not true that
+	  the Row::linear_combine changes the flag `sorted' of the matrix.
+
+2001-11-04 Sunday 12:22  Elisa Ricci
+
+	* src/Polyhedron.cc (1.77): In functions
+	  Polyhedron::assign_variable and Polyhedron::substitute_variable
+	  we must clear the flags SAT_C_UP_TO_DATE and SAT_G_UP_TO_DATE,
+	  because after the operations the polyhedron is changed.
+
+2001-11-04 Sunday 12:01  Elisa Ricci
+
+	* src/Matrix.cc (1.11): In function Matrix::gauss(), we change a
+	  row without changing "changed" that indicates that the matrix is
+	  changed: so the flag "sorted" of the matrix was true even if the
+	  matrix was not sorted.
+
+2001-11-04 Sunday 10:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.23):
+	  ppl_intersection_assign/2 calls
+	  Polyhedron::intersection_assign().
+
+2001-11-04 Sunday 09:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.18), GenSys.cc (1.19), Makefile.am (1.16),
+	  Matrix.cc (1.10), Matrix.defs.hh (1.8), Matrix.inlines.hh (1.6),
+	  Polyhedron.cc (1.76), Row.cc (1.11), Row.defs.hh (1.10),
+	  Row.inlines.hh (1.7), SatRow.inlines.hh (1.6), conversion.cc
+	  (1.9), globals.cc (1.2), globals.hh (1.2), minimize.cc (1.6):
+	  OK() methods changed to allow for ConSys and GenSys with a single
+	  column.
+
+	  Temporary Integer's now incapsulated into a function: the source
+	  globals.cc is no longer necessary.
+
+	  The funcionality of Matrix::compute_row_capacity() is now
+	  provided by Row::compute_capacity().
+
+	  Tracking of capacity improved (there are still several problems
+	  though).  Matrix::sort_rows() rewritten: the STL algorithms keep
+	  the freedom of making copies of rows and we cannot accept that.
+
+	  Temporaty kludges added to the Matrix::add_row() methods: if the
+	  rows vector must grow, the implementation will copy the rows
+	  changing their capacity.  A proper solution to this problem must
+	  be found.
+
+	  OK() safety checks added tp Polyhedron::remove_dimensions() and
+	  Polyhedron::remove_higher_dimensions().
+
+	  Polyhedron::remove_dimensions() and
+	  Polyhedron::remove_higher_dimensions() where not clearing the
+	  "generators are minimized" flag.  With this change the flag is
+	  cleared a bit too often.  A proper solution must be found.
+
+	  Polyhedron::remove_dimensions() and
+	  Polyhedron::remove_higher_dimensions() now use
+	  Matrix::resize_no_copy() instead of Matrix::resize() in order to
+	  shrink matrices.
+
+	  Row::OK() added and used.  When compiling with assertions each
+	  rows brings its own capacity in the capacity_ flag.  The
+	  consistency of this information is checked by Row::OK() which, in
+	  turn, is called by Matrix::OK() for each row of the matrix.  For
+	  internal use, the capacity_ field can be accessed by `size_t
+	  Row::capacity() const'.
+
+	  `void Row::assign(Row& y)' added to assign the implementation of
+	  y to *this.
+
+	  `std::iter_swap()' specialized both for vector<Row> and
+	  vector<SatRow>.
+
+2001-11-04 Sunday 08:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.28), bug2.cc (1.1): bug2.cc shows a
+	  problem whereby we do not correctly keep track of the status of
+	  saturation matrices.
+
+2001-11-04 Sunday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.27), bug1.cc (1.1): bug1.cc shows a
+	  problem with the tracking of matrix sortedness.
+
+2001-11-03 Saturday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/append1.cc (1.6): Two assertions added: they prove that
+	  Polyhedron::remove_dimensions() is broken.
+
+2001-11-03 Saturday 13:49  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.26), GenSys.defs.hh (1.35): "no guarantee
+	  at all" changed into "no guarantees" as suggested by Pat.
+
+2001-11-03 Saturday 10:45  Elisa Ricci
+
+	* src/Polyhedron.cc (1.75): In a comment correct an error: there
+	  was "systemo" instead of "system".
+
+2001-11-03 Saturday 10:40  Elisa Ricci
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.22),
+	  src/Polyhedron.cc (1.74), src/Polyhedron.defs.hh (1.63),
+	  tests/inters1.cc (1.7), tests/inters2.cc (1.9): The function
+	  Polyhedron::intersection_assign now is
+	  Polyhedron::intersection_assign_and_minimize.  Added a new
+	  function Polyhedron::intersection_assign that computes the
+	  intersection between x and y without minimizing the result.
+
+2001-11-02 Friday 17:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.3): Use
+	  ppl_remove_higher_dimensions/2.
+
+2001-11-02 Friday 17:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.21), ppl_sicstus.pl
+	  (1.12): Added ppl_remove_higher_dimensions/2.
+
+2001-11-02 Friday 17:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.73), Polyhedron.defs.hh (1.62): New method
+	  drafted: void Polyhedron::remove_higher_dimensions(size_t
+	  new_dimension).
+
+2001-11-02 Friday 17:22  Elisa Ricci
+
+	* src/Polyhedron.cc (1.72), src/Polyhedron.defs.hh (1.61),
+	  tests/addconstraints1.cc (1.2), tests/append1.cc (1.5),
+	  tests/append2.cc (1.7), tests/error3.cc (1.8), tests/permute.cc
+	  (1.10): The Polyhedron::add_constraints now is
+	  Polyhedron::add_constraints_and_minimize, while
+	  Polyhedron::add_constraints_lazy now is only
+	  Polyhedron::add_constraints.	The Polyhedron::convex_hull_assign
+	  now is Polyhedron::convex_hull_assign_and_minimize, while
+	  Polyhedron::convex_hull_assign_lazy now is
+	  Polyhedron::convex_hull_assign.
+
+2001-11-02 Friday 16:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/clpq.pl (1.2): Some infrastructure
+	  added to simplify loading programs and trying them.
+
+2001-11-02 Friday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.33), src/ConSys.defs.hh (1.25),
+	  src/Constraint.defs.hh (1.24), src/GenSys.defs.hh (1.34),
+	  src/Generator.defs.hh (1.27), src/LinExpression.defs.hh (1.20),
+	  src/Polyhedron.defs.hh (1.60): A further scan on almost all user
+	  documentation in order to better comment on space-dimensionality
+	  checks.
+
+2001-11-02 Friday 14:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: clpq.pl (1.1), solve.pl (1.19):
+	  Renamed.
+
+2001-11-02 Friday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Matrix.cc (1.9): Matrix::resize_no_copy() improved.  It now
+	  preserves the sortedness flag in the easy cases.
+
+2001-11-02 Friday 13:28  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.18): Comments added
+	  throughout.
+
+2001-11-02 Friday 09:01  Elisa Ricci
+
+	* src/Row.cc (1.10): In a comment of operator *(Row, Row) used
+	  "dimension-compatible", instead of "dimension-compatibility".
+
+2001-11-02 Friday 08:24  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.17): An improved version of
+	  the interpreter. This is a bit faster.
+
+2001-11-01 Thursday 19:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.26): Link the GMP library after the PPL.
+
+2001-11-01 Thursday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.14): The --with-cc configure option has been
+	  fixed (it affected CXX instead of CC).
+
+2001-11-01 Thursday 18:08  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.16): Now only use the
+	  copied polyhedron when trying a clause.
+
+2001-11-01 Thursday 17:27  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.15): Bug is fixed and test
+	  added to check bug is dead.  Also, more care is taken to remove
+	  polyhedron that are no longer needed.
+
+2001-11-01 Thursday 15:44  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.14): Now, delete_polyhedron
+	  is used when the call to solve((A,B)...) fails as well as when it
+	  succeeds.
+
+2001-11-01 Thursday 15:36  Elisa Ricci
+
+	* src/: ConSys.cc (1.17), GenSys.cc (1.18), Row.cc (1.9),
+	  Row.defs.hh (1.9): Erased the function projected_scalar_prod(x,
+	  y) and used instead of it the operator * that it is changed to
+	  support also the case of x.size() < y.size (operator * so can be
+	  used in the case x.size <= y.size).  The functions
+	  GenSys::satisfy(Constraint) and
+	  ConSys::satisfies_all_constraints(Generator) are modified to use
+	  only the operator *.
+
+2001-11-01 Thursday 14:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.13): Names of terms made
+	  more descriptive.
+
+2001-11-01 Thursday 14:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.cc (1.8), Matrix.inlines.hh (1.5),
+	  Polyhedron.inlines.hh (1.10), Row.cc (1.8), Row.defs.hh (1.8),
+	  SatMatrix.defs.hh (1.8), SatMatrix.inlines.hh (1.5),
+	  SatRow.defs.hh (1.8), SatRow.inlines.hh (1.5), Status.cc (1.8),
+	  Status.defs.hh (1.10), Status.inlines.hh (1.4),
+	  Variable.inlines.hh (1.4): Using the \related doxygen command
+	  everywhere appropriate (but not using it for specialization of
+	  std::swap functions).  All inline functions enclosed in namespace
+	  delimiters: removed redundant namespace qualifiers accordingly.
+
+2001-11-01 Thursday 13:53  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.12): Now temporary
+	  polyhedra are deleted when they are no longer needed.
+
+2001-11-01 Thursday 13:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.11): Old code for
+	  ppl_renew_polyhedron that does not use ppl_delete_polyhedron has
+	  been restored.
+
+2001-11-01 Thursday 11:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.10): Now all but the head
+	  variables are projected away.  Other general improvements and
+	  corrections done.
+
+2001-11-01 Thursday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.7), Polyhedron.cc (1.71), Row.defs.hh
+	  (1.7), Row.inlines.hh (1.6): Using the \relates doxygen command
+	  for Row and Matrix.  Enclosing inline functions in the namespace
+	  delimiters.  Avoiding useless namespace qualifiers.
+
+2001-11-01 Thursday 07:48  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* NEWS (1.3): Drafted.
+
+2001-10-31 Wednesday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.20): Removed
+	  false_constraint_term(): it is no longer needed.
+
+2001-10-31 Wednesday 22:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.19), ppl_sicstus.pl
+	  (1.11), solve.pl (1.9): ppl_copy_polyhedron/2 is now provided by
+	  the interface.
+
+2001-10-31 Wednesday 22:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.18): In
+	  ppl_get_constraints/2, no longer treat empty polyhedra specially.
+	  get_generator() renamed generator_term().
+
+2001-10-31 Wednesday 21:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.17): In
+	  ppl_get_generators/2, no longer abort if the polyhedron is
+	  zero-dimensional.
+
+2001-10-31 Wednesday 21:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.23), Generator.defs.hh (1.26),
+	  Polyhedron.defs.hh (1.59), Variable.defs.hh (1.10): Exploiting
+	  the doxygen special command \relates to put the documentation of
+	  non-friend functions inside the documentation of the related
+	  class.
+
+2001-10-31 Wednesday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.16): All C++
+	  exceptions are now handled and translated into Prolog exceptions.
+
+2001-10-31 Wednesday 18:25  Elisa Ricci
+
+	* src/: Matrix.cc (1.7), Polyhedron.cc (1.70): Now, the function
+	  merge_row_assign resizes the second matrix if it is necessary: it
+	  means that in functions add_constraints_lazy and
+	  limited_widening_assign we do not resize the matrix cs.  In
+	  Polyhedron::OK the check of the number of columns is not
+	  necessary.
+
+2001-10-31 Wednesday 15:37  Elisa Ricci
+
+	* src/Polyhedron.cc (1.69): In function Polyhedron::OK() the case
+	  of is_empty == true is considered.
+
+2001-10-31 Wednesday 14:45  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.8): Now, backtracking works
+	  for some queries including fibonacci.  Also it works with a test
+	  that checks deeper backtracking.
+
+2001-10-31 Wednesday 14:36  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.68): In the checking function OK, we were
+	  forgetting return or jump to the appropriate code after having
+	  checked the correctness of a 0-space dim polyhedron.
+
+2001-10-31 Wednesday 12:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.67): A missing "return" added inside
+	  "add_dimensions_and_constraints".
+
+2001-10-31 Wednesday 12:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.58): Added specification for
+	  add_dimensions_and_constraints(ConSys& cs).
+
+2001-10-31 Wednesday 11:52  Elisa Ricci
+
+	* src/Polyhedron.cc (1.66): In functions
+	  Polyhedron::widening_assign and
+	  Polyhedron::limited_widening_assign considered the case of the
+	  polyhedra in a zero-dimensional space.  In function
+	  Polyhedron::limited_widening_assign considered the case of
+	  cs.space_dimension() < space_dimension().
+
+2001-10-31 Wednesday 11:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/GenSys.defs.hh (1.33): Added an example where a system of
+	  generators is printed by using more features of the STL.
+
+2001-10-31 Wednesday 11:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.65): When the user invokes
+	  Polyhedron::constraints() on an empty polyhedron, we now return
+	  the inconsistent constraint of the right dimension.  This also
+	  implies that a polyhedron with the EMPTY flag set can still have
+	  a non-empty con_sys; therefore, we clear the con_sys whenever we
+	  change the dimension of an empty polyhedron.
+
+2001-10-31 Wednesday 10:28  Elisa Ricci
+
+	* src/: ConSys.cc (1.16), Polyhedron.cc (1.64): In functions
+	  Polyhedron::includes and ConSys::satisfies_all_constraints the
+	  cases of a polyhedron in a zero-dimensional space and of
+	  g.space_dimension < space_dimension are considered.
+
+2001-10-31 Wednesday 09:56  Elisa Ricci
+
+	* src/: GenSys.cc (1.17), Polyhedron.cc (1.63), Row.cc (1.7),
+	  Row.defs.hh (1.6): The function projected_scalar_prod() moved in
+	  `namespace Parma_Polyhedra_Library'.	The case of
+	  c.space_dimension < polyhedron.space_dimension is considered in
+	  functions Polyhedron::satisfies and GenSys::satisy.  In function
+	  Polyhedron::satisfies the cases of empty polyhedron and of the
+	  polyhedron is a zero-dimensional space are considered.
+
+2001-10-31 Wednesday 08:47  Elisa Ricci
+
+	* src/LinExpression.defs.hh (1.19): The copy-constructor of a
+	  linear expression with a specified dimension is PPL_INTERNAL and
+	  not public.
+
+2001-10-30 Tuesday 22:01  Elisa Ricci
+
+	* tests/affinetrans.cc (1.4): We can use the linear expression `x +
+	  4' instead of `x + 0*y + 4'.
+
+2001-10-30 Tuesday 21:57  Elisa Ricci
+
+	* src/: LinExpression.defs.hh (1.18), Polyhedron.cc (1.62): In
+	  functions Polyhedron::assign_variable and
+	  Polyhedron::substitutte_variable considered the cases of an empty
+	  polyhedron and of space_dimension of linear expression <
+	  space_dimension of polyhedron.  In LinExpression the
+	  copy-constructor with the size of the new linear expression is
+	  now public.
+
+2001-10-30 Tuesday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.8), Constraint.defs.hh (1.22): Added
+	  PPL_INTERNAL method Constraint::is_unsatisfiable().
+
+2001-10-30 Tuesday 18:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.7): Now it allows for
+	  constants in the head.
+
+2001-10-30 Tuesday 17:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.6): The interpreter now
+	  accepts repeated variables in the head.
+
+2001-10-30 Tuesday 17:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.61), src/Polyhedron.defs.hh (1.57),
+	  tests/addconstraints2.cc (1.3): Method
+	  add_dimensions_and_constraints_lazy renamed as
+	  add_dimensions_and_constraints; signature changed (the argument
+	  is no longer const); in the implementation, we swap coefficients
+	  instead of copying them.
+
+2001-10-30 Tuesday 15:54  Elisa Ricci
+
+	* src/: Row.cc (1.6), Row.defs.hh (1.5): Added the function Integer
+	  projected_scalar_prod(const Row&, const Row&).
+
+2001-10-30 Tuesday 15:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.56): Spelling of "poject" to "project"
+	  changed.
+
+2001-10-30 Tuesday 15:17  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.60): Spelling error corrected in an output
+	  message; for consistency, try always to use the
+	  dimension-compatibility concept in error messages.
+
+2001-10-30 Tuesday 15:12  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.5): Adjusted to allow for =
+	  instead of == for equality.
+
+2001-10-30 Tuesday 14:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.17), LinExpression.inlines.hh
+	  (1.6): Added method space_dimension.
+
+2001-10-30 Tuesday 14:54  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.55): We do not have any exception if we
+	  use the function Polyhedron::constraints() with an empty
+	  polyhedron of the function Polyhedron::generators() with a
+	  zero-dimensional polyhedron.
+
+2001-10-30 Tuesday 14:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.15): Use '='/2
+	  instead of '=='/2 to denote equality.  Fixed a bug whereby the
+	  sign of the inhomogeneous term of constraints was inverted.
+
+2001-10-30 Tuesday 14:40  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.59): Started using the methods
+	  space_dimension() of classes Constraint, Generator, ConSys and
+	  GenSys.
+
+2001-10-30 Tuesday 14:30  Elisa Ricci
+
+	* src/Polyhedron.cc (1.58): In functions Polyhedron::insert used
+	  the function space_dimension() (of a constraint or of a
+	  generator) instead of size() - 1.
+
+2001-10-30 Tuesday 13:25  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.4): More improvements.
+
+2001-10-30 Tuesday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.24), ConSys.inlines.hh (1.8),
+	  GenSys.defs.hh (1.32), GenSys.inlines.hh (1.8): Added method
+	  space_dimension() to both ConSys and GenSys.
+
+2001-10-30 Tuesday 12:25  Elisa Ricci
+
+	* src/Polyhedron.cc (1.57): In function
+	  add_dimensions_and_constraints_lazy, if we are lazy we only say
+	  that the system of constraints is not sorted, otherwise we sort
+	  the system of constraints.
+
+2001-10-30 Tuesday 12:17  Elisa Ricci
+
+	* tests/addconstraints2.cc (1.2): Changed the second system of
+	  constraints (ConSys c2) to have a non-empty polyhedron.
+
+2001-10-30 Tuesday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.56): insert(const Generator&) improved.
+
+2001-10-30 Tuesday 11:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.3): Now upgraded to accept
+	  user predicates as well as constraints.
+
+2001-10-30 Tuesday 11:47  Elisa Ricci
+
+	* tests/: Makefile.am (1.25), addconstraints2.cc (1.1): Added the
+	  test for the function add_dimensions_and_constraints_lazy.
+
+2001-10-30 Tuesday 11:39  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.55): In add_constraints, after adding NO
+	  constraints at all we still need to check for the emptyness of
+	  the polyhedron.  In insert(const Constraint&), adjusted
+	  assertions and added triviality check when inserting into a
+	  zero-dim space polyhedron.
+
+2001-10-30 Tuesday 11:29  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.54), Polyhedron.defs.hh (1.54): Added the
+	  function add_dimensions_and_constraints_lazy(const ConSys& cs).
+
+2001-10-30 Tuesday 11:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.53): In add_constraints(_lazy), if a
+	  zero-dim space polyhedron is considered, using ConSys iterators
+	  to see if an inconsistent polyhedron is created.
+
+2001-10-30 Tuesday 10:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.24), addconstraints1.cc (1.1): Added test
+	  for the addition of consistent and inconsistent zero-dim
+	  constraints to a zero-dim space polyhedron.  Tests re-ordered
+	  alphabetically.
+
+2001-10-30 Tuesday 10:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.2): Some small bugs fixed.
+
+2001-10-30 Tuesday 10:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.23), removedim3.cc (1.1): Added simple
+	  test on the removal of dimensions from an empty polyhedron.
+
+2001-10-30 Tuesday 09:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.52), Polyhedron.defs.hh (1.53): BE_LAZY
+	  used also in Polyhedron::add_dimensions_and_project.	A couple of
+	  assertions added and old code (already commented out) removed.
+
+2001-10-30 Tuesday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* interfaces/Prolog/SICStus/solve.pl (1.1): A first start/attempt
+	  at a simple meta-interpreter for CLP(Q).  There is a bug to be
+	  fixed.
+
+2001-10-29 Monday 21:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.51): Be lazy.
+
+2001-10-29 Monday 21:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.8), minimize.cc (1.5), simplify.cc (1.6):
+	  Comments fixed: the class is called Polyhedron, not Poly.
+
+2001-10-29 Monday 18:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.14): Use
+	  Constraint/Generator::space_dimension() instead of the no longer
+	  existing last_variable().
+
+2001-10-29 Monday 16:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.21), Constraint.inlines.hh (1.9),
+	  Generator.defs.hh (1.25), Generator.inlines.hh (1.14): Removed
+	  methods last_variable() and added method space_dimension() to
+	  Constraint and Generator.
+
+2001-10-29 Monday 16:46  Elisa Ricci
+
+	* src/Polyhedron.cc (1.50): In Polyhedron(size_t num_dimensions,
+	  Degenerate_Kind kind) if we build an universe polyhedron the
+	  system of constraints is in the minimal form.  In the function
+	  insert(Constraint) added the comment that specify why when we
+	  insert the constraint the polyhedron is non-empty.
+
+2001-10-29 Monday 16:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.15), Constraint.cc (1.7), Constraint.defs.hh
+	  (1.20): Constraint::is_non_trivial() transformed into
+	  Constraint::is_trivial().  Btw, the old evrsion was still wrong.
+
+2001-10-29 Monday 16:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.49): In function add_constraints,
+	  add_constraints_lazy and add_generators the case of
+	  cs(gs)_num_columns == 1 && space_dimension() == 0 is considered.
+
+2001-10-29 Monday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* missing (1.3): Updated.
+
+2001-10-29 Monday 14:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Constraint.cc (1.6): Constraint::is_nontrivial() fixed.
+
+2001-10-29 Monday 14:29  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.48): In add_dimensions_and_embed, when
+	  embedding a zero-dim universe polyhedron the creation of the
+	  system of generators is now guarded by pre-proc flag BE_LAZY.
+
+2001-10-29 Monday 13:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.cc (1.16), GenSys.defs.hh (1.31), GenSys.inlines.hh
+	  (1.7), Polyhedron.cc (1.47): Added static member function
+	  GenSys::zero_dim_univ() to replace static member
+	  GenSys::zero_dim_univ. All inline functions enclosed in the
+	  namespace.
+
+2001-10-29 Monday 13:23  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.8), Generator.defs.hh (1.24),
+	  Generator.inlines.hh (1.13): Added static member function
+	  Generator::zero_dim_vertex().  Functions vertex, ray and line are
+	  no longer inlined; for ray and line we now check that the
+	  argument does not represent the origin of the space.
+
+2001-10-29 Monday 13:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/ConSys.defs.hh (1.23): Must include <iterator>.
+
+2001-10-29 Monday 12:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.14), ConSys.defs.hh (1.22), ConSys.inlines.hh
+	  (1.7), Polyhedron.cc (1.46): Added static member function
+	  ConSys::zero_dim_empty().
+
+2001-10-29 Monday 12:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.5), Constraint.defs.hh (1.19),
+	  Constraint.inlines.hh (1.8): Added static memebr function
+	  Constraint::zero_dim_false().  All inline functions enclosed in
+	  the namespace.
+
+2001-10-29 Monday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.cc (1.5), LinExpression.defs.hh (1.16),
+	  LinExpression.inlines.hh (1.5): Added static member function
+	  LinExpression::zero() in place of static member LinExpression
+	  zero.  All inline functions enclosed in the scope of namespace.
+
+2001-10-29 Monday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.45): Polyhedron::Polyhedron(GenSys& gs)
+	  improved.
+
+2001-10-29 Monday 10:21  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.13): Require autoconf 2.52e.
+
+2001-10-29 Monday 10:18  Elisa Ricci
+
+	* tests/: affinetrans.cc (1.3), append2.cc (1.6), empty1.cc (1.5),
+	  error1.cc (1.6), error2.cc (1.7), error3.cc (1.7), error4.cc
+	  (1.3), error5.cc (1.4), inters1.cc (1.6), inters2.cc (1.8),
+	  permute.cc (1.9), randchull1.cc (1.8), removedim1.cc (1.2),
+	  removedim2.cc (1.5): Added the comment to the tests, the
+	  inclusion of the file "ehandlers.hh", use the function
+	  set_handlers() and added some NOISY-print of the polyhedra (where
+	  they are necessary).
+
+2001-10-29 Monday 09:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/Makefile.am (1.22): Committing Makefile.am was unwanted
+	  (error6 is a non-meaningful dummy test).
+
+2001-10-29 Monday 06:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.7), Polyhedron.defs.hh (1.52),
+	  conversion.cc (1.7): The Integer constants 0 and 1 are now
+	  provided by the static methods Integer::zero() and
+	  Integer::one().
+
+2001-10-28 Sunday 21:41  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/ConSys.cc (1.13), src/ConSys.defs.hh (1.21),
+	  src/ConSys.inlines.hh (1.6), src/GenSys.cc (1.15),
+	  src/GenSys.defs.hh (1.30), src/GenSys.inlines.hh (1.6),
+	  src/Generator.defs.hh (1.23), src/Polyhedron.cc (1.44),
+	  tests/Makefile.am (1.21): Added static members denoting the
+	  zero-dim usatisfiable constraint, teh corresponding constraint
+	  system and the system of generators corresponding to the zero-dim
+	  universe.
+
+2001-10-28 Sunday 20:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.cc (1.4), Constraint.defs.hh (1.18):
+	  is_non_trivial() now correctly handles inconsistent constraints,
+	  which should NOT be considered trivial.  Output operator now
+	  correctly prints inconsistent constraints.
+
+2001-10-28 Sunday 18:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.4),
+	  SICStus/ppl_sicstus.pl (1.10): Added ppl_insert_constraints/2 and
+	  ppl_insert_generators/2.
+
+2001-10-28 Sunday 18:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.3),
+	  SICStus/ppl_sicstus.cc (1.13), SICStus/ppl_sicstus.pl (1.9):
+	  Added ppl_add_dimensions_and_embed/2 and
+	  ppl_add_dimensions_and_project/2.
+
+2001-10-28 Sunday 18:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/: Prolog_interface.dox (1.2),
+	  SICStus/ppl_check.pl (1.6), SICStus/ppl_sicstus.cc (1.12),
+	  SICStus/ppl_sicstus.pl (1.8): ppl_remove_dimensions/2 added.
+
+2001-10-28 Sunday 14:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.11), configure.ac (1.12),
+	  interfaces/Prolog/Makefile.am (1.2): Try not to bother people
+	  without the SICStus include file.
+
+2001-10-28 Sunday 14:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.cc (1.6), Generator.defs.hh (1.22),
+	  Generator.inlines.hh (1.12), LinExpression.cc (1.4),
+	  LinExpression.defs.hh (1.15): Now the friend function vertex(e,
+	  d) has also its first argument optional; calling vertex() creates
+	  the origin of the zero-dim vector space.  Added zero-dim checks
+	  to ray(e) and line(e).
+
+2001-10-28 Sunday 13:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.13), doc/devref-browse.doxyconf-latex.in
+	  (1.7), doc/devref-print.doxyconf-latex.in (1.7),
+	  doc/devref.doxyconf-html.in (1.8),
+	  doc/user-browse.doxyconf-latex.in (1.8),
+	  doc/user-print.doxyconf-latex.in (1.8), doc/user.doxyconf-html.in
+	  (1.10), interfaces/Prolog/Prolog_interface.dox (1.1): Provide a
+	  framework for the Prolog interface documentation.
+
+2001-10-28 Sunday 11:12  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/removedim2.cc (1.4): Moved creation of lin-expr
+	  infrastructure outside the loop.
+
+2001-10-28 Sunday 10:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.5), ppl_sicstus.cc
+	  (1.11), ppl_sicstus.pl (1.7): Added ppl_get_constraints/2 and
+	  ppl_get_generators/2.
+
+2001-10-28 Sunday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.51): Do not create yet another Integer
+	  set to one to use as default parameter: use Integer::one instead.
+
+2001-10-28 Sunday 10:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.17), Generator.defs.hh (1.21),
+	  Generator.inlines.hh (1.11): New methods of Generator:
+	  last_variable(), coefficient(), and divisor().  Harmonized with
+	  the ones of Constraint.  Do not create yet another Integer set to
+	  one to use as default parameter: use Integer::one instead.
+
+2001-10-28 Sunday 08:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.43): Corrected the error making test
+	  `randchull1' fail (I was forgetting to clear flags after
+	  insertion of the generator).
+
+2001-10-27 Saturday 22:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/onepoint.cc (1.1): New test on the creation of a one-point
+	  polyhedron.
+
+2001-10-27 Saturday 22:52  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.20), error1.cc (1.5), error2.cc (1.6),
+	  error3.cc (1.6), error4.cc (1.2), error5.cc (1.3), removedim.cc
+	  (1.3), removedim1.cc (1.1), removedim2.cc (1.3): Try to be
+	  consistent.
+
+2001-10-27 Saturday 18:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.16), Constraint.inlines.hh (1.7): New
+	  Constraint methods: last_variable(), coefficient(Variable v) and
+	  coefficient() to return the last variable, the homogeneous and
+	  inhomogeneous coefficients.
+
+2001-10-27 Saturday 17:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.4), ppl_sicstus.cc
+	  (1.10), ppl_sicstus.pl (1.6): ppl_new_polyhedron/1 replaced with
+	  ppl_new_polyhedron/2 and ppl_new_empty_polyhedron/2.
+
+2001-10-27 Saturday 16:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/definitions.dox (1.32), src/Constraint.defs.hh (1.15),
+	  src/Constraint.inlines.hh (1.6), src/Generator.cc (1.5),
+	  src/Generator.defs.hh (1.20), src/Generator.inlines.hh (1.10),
+	  src/Polyhedron.cc (1.42), src/Polyhedron.defs.hh (1.50),
+	  src/Polyhedron.inlines.hh (1.9), src/Status.cc (1.7),
+	  src/Status.defs.hh (1.9), src/Status.inlines.hh (1.3),
+	  tests/Makefile.am (1.19), tests/affinetrans.cc (1.2),
+	  tests/append1.cc (1.4), tests/append2.cc (1.5), tests/empty1.cc
+	  (1.4), tests/error3.cc (1.5), tests/error5.cc (1.2),
+	  tests/inters2.cc (1.7), tests/permute.cc (1.8), tests/print.hh
+	  (1.3), tests/randchull1.cc (1.7), tests/removedim.cc (1.2),
+	  tests/removedim2.cc (1.2): All changes on the `space_dim' branch
+	  have been merged to the main trunk.
+
+2001-10-27 Saturday 15:30  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.12): In Polyhedron::insert(const
+	  Generator&) added generator type check.
+
+2001-10-27 Saturday 15:24  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh, Constraint.inlines.hh, Polyhedron.cc,
+	  Polyhedron.defs.hh (space_dim.[1,1,11,6]): Default constructor
+	  for Constraint is now private and not implemented.  In
+	  Polyhedron::insert(const Generator&) we should check that the
+	  generator is a vertex if the polyhedron is empty (we cannot add
+	  just a ray or a line).
+
+2001-10-27 Saturday 15:12  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.9), ppl_sicstus.pl
+	  (1.5): ppl_widening_assign/2 added.
+
+2001-10-27 Saturday 15:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_sicstus.cc (1.8), ppl_sicstus.pl
+	  (1.4): ppl_intersection_assign/2 and ppl_convex_hull_assign/2
+	  added.  Try to be as const-correct as possible.
+
+2001-10-27 Saturday 14:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.3), ppl_sicstus.cc
+	  (1.7), ppl_sicstus.pl (1.3): ppl_check_empty/1 added.
+
+2001-10-27 Saturday 14:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.6):
+	  SP_register_atom() and SP_unregister_atom() can fail.
+
+2001-10-27 Saturday 14:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/: ppl_check.pl (1.2), ppl_sicstus.cc
+	  (1.5), ppl_sicstus.pl (1.2): ppl_insert_generator/2 added.
+
+2001-10-27 Saturday 12:35  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, src/Status.cc, src/Status.defs.hh,
+	  src/Status.inlines.hh, tests/empty1.cc, tests/inters2.cc,
+	  tests/print.hh, tests/randchull1.cc
+	  (space_dim.[10,5,2,1,1,1,1,1,1,1]): The zero_dim flag (and
+	  methods) in Status changed into more meaningful "zero_dim_univ".
+	  A lot of small changes to have a consistent dimension-checking.
+	  Now there is one "default" constructor for Polyhedron having two
+	  optional arguments: the space dimension (default 0) and the
+	  degenerate kind (default UNIVERSE).  Tests adapted to use the new
+	  constructor and to avoid using the removed
+	  Polyhedron::is_zero_dim().
+
+2001-10-27 Saturday 12:26  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.31): Proposition after Minkowsky's theorem
+	  corrected (we can CHOOSE extreme rays so that they have rational
+	  coefficients).
+
+2001-10-27 Saturday 11:54  Elisa Ricci
+
+	* tests/: affinetrans.cc, error3.cc (space_dim.[2,2]): To build the
+	  polyhedron that we want using the system of generators, we must
+	  create the system of generators and then use Polyhedron ph(gs).
+	  (If we use Polyhedron ph(num_dim), we have the universe
+	  polyhedron and then when we add the generators we do not have our
+	  polyhedron but the universe one).
+
+2001-10-27 Saturday 11:49  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (space_dim.4): Added an example for the
+	  function remove_dimensions (the example 8).  In the examples when
+	  we build a polyhedron we must specify the dimension of the space
+	  if then we use the function Polyhedron::insert(Constraint).  We
+	  can not do the same thing if then we want to use the function
+	  Polyhedron::insert(Generator) In fact, in this case we build the
+	  universe polyhedron and then we add the generators. To build a
+	  polyhedron starting from the system of generators we must create
+	  the system of generators and then use Polyhedron ph(gs).
+
+2001-10-27 Saturday 11:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.11): Version number bumped so as to avoid
+	  confusion: 0.2-pre1.
+
+2001-10-27 Saturday 10:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure.ac (1.10), interfaces/Prolog/SICStus/Makefile.am (1.2),
+	  interfaces/Prolog/SICStus/ppl_check.pl (1.1),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.4),
+	  interfaces/Prolog/SICStus/ppl_sicstus.pl (1.1): Check to see
+	  whether `sicstus' is installed: if it is, tests can be performed.
+	  Some progress in the interface itself.
+
+2001-10-27 Saturday 10:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.41): ConSys and GenSys do not yet provide a
+	  `bool empty() const' method.
+
+2001-10-27 Saturday 10:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.15): Distribute ppl_header.middle.
+
+2001-10-26 Friday 21:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.3): Exception
+	  handling improved.
+
+2001-10-26 Friday 19:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, tests/Makefile.am, tests/removedim2.cc
+	  (space_dim.[9,4,1]): Polyhedron::remove_dimensions(...) rewritten
+	  from scratch.  Added a new test to check its correctness.
+
+2001-10-26 Friday 18:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* interfaces/Prolog/SICStus/ppl_sicstus.cc (1.2): Can now insert
+	  constraints into a polyhedron.
+
+2001-10-26 Friday 16:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am, ppl_header.middle (space_dim.[1,1]): Get
+	  around a bug in GCC versions prior to 3 whereby the <cassert>
+	  header is wrongly guarded against multiple inclusion.
+
+2001-10-26 Friday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.12), config.h.in (1.10), configure.ac (1.9),
+	  interfaces/.cvsignore (1.1), interfaces/Makefile.am (1.1),
+	  interfaces/Prolog/.cvsignore (1.1), interfaces/Prolog/Makefile.am
+	  (1.1), interfaces/Prolog/SICStus/.cvsignore (1.1),
+	  interfaces/Prolog/SICStus/Makefile.am (1.1),
+	  interfaces/Prolog/SICStus/ppl_sicstus.cc (1.1): Start working on
+	  the Prolog interfaces.
+
+2001-10-26 Friday 16:51  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.14): ppl_install.hh depends also on
+	  ppl_header.middle.
+
+2001-10-26 Friday 16:46  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.13), ppl_header.middle (1.1): Get around a
+	  bug in GCC versions prior to 3 whereby the <cassert> header is
+	  wrongly guarded against multiple inclusion.
+
+2001-10-26 Friday 16:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.40), Variable.defs.hh (1.9): Just
+	  formatting.
+
+2001-10-26 Friday 13:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.8): A few trivial errors inside
+	  assertions fixed.
+
+2001-10-26 Friday 12:29  Elisa Ricci
+
+	* src/Polyhedron.cc (space_dim.7): In function add_generators we
+	  resize the matrix gs that we want to add if space_dimension() >
+	  num_columns() - 1.
+
+2001-10-26 Friday 12:14  Elisa Ricci
+
+	* src/Polyhedron.cc (space_dim.6): Added the dimension-consistency
+	  check in the function add_constraints_lazy and add_generators.
+	  In functions add_constraints and add_generators we use
+	  if(check_empty()) instead of	minimize() if(is_empty()) In
+	  functions add_constraints and add_constraints_lazy we resize the
+	  matrix of constraints that we add if	num_columns - 1 <
+	  space_dimension().
+
+2001-10-26 Friday 12:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh, Generator.inlines.hh (space_dim.[1,1]):
+	  The default constructor for Generator is now private and
+	  unimplemented.
+
+2001-10-26 Friday 11:22  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, error5.cc, removedim.cc (space_dim.[3,1,2]):
+	  New test for dimension-compatibility in
+	  Polyhedron::remove_dimensions.  The test still fails because
+	  objects of set<Variable> do not provide ordered access to their
+	  elements (yet).
+
+2001-10-26 Friday 10:42  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am, removedim.cc, remuvedim.cc
+	  (space_dim.[2,1,2]): Test file "remuvedim.cc" renamed.
+
+2001-10-26 Friday 10:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.5): Using begin() instead of max()
+	  to select the highest dimension variable from a set of variables.
+
+2001-10-26 Friday 10:34  Elisa Ricci
+
+	* tests/: Makefile.am, remuvedim.cc (space_dim.[1,1]): Added a test
+	  for the function remuve_dimensions(...).
+
+2001-10-26 Friday 10:34  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (space_dim.4): Some comments improved. Added
+	  dimension-compatibility checks to
+	  Polyhedron::remove_dimensions(...).
+
+2001-10-25 Thursday 23:21  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, tests/affinetrans.cc, tests/append1.cc,
+	  tests/append2.cc, tests/error3.cc, tests/permute.cc
+	  (space_dim.[3,1,1,1,1,2]): Going on ading the right
+	  dimension-compatibility checks.  Now the tests are all passed
+	  (some of them changed to declare polyhedra dimensions in the
+	  constructors, other changed by calling operator
+	  add_dimensions_and_embed).
+
+2001-10-25 Thursday 20:59  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.cc (space_dim.1): Strange code indentation fixed.
+
+2001-10-25 Thursday 20:36  Elisa Ricci
+
+	* src/Polyhedron.cc (space_dim.2): In operator <=(x,y) we only need
+	  the generators of x and the constraints of y.  In functions
+	  intersection_assign and convex_hull, we did two checks of the
+	  dimension of the space (one with space_dimension() and the other
+	  with num_columns()).	In functions add_dimensions_and_embed and
+	  add_dimensions_and_project we have both the system of constraints
+	  and the system of generators minimized when we add some
+	  dimensions to a polyhedron in a 0-dimensional space.
+
+2001-10-25 Thursday 16:45  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc, src/Polyhedron.defs.hh,
+	  src/Polyhedron.inlines.hh, tests/permute.cc
+	  (space_dim.[1,3,1,1]): Added private member
+	  Polyhedron::space_dim, which stores the number of dimensions of
+	  the enclosing space.	Public member Polyhedron::num_dimensions()
+	  renamed into Polyhedron::space_dimension() and now reads the
+	  member space_dim.  Started modifying methods of the class
+	  Polyhedron so that they consistently use space_dimension() and
+	  space_dim.  Started guarding methods by suitable
+	  dimension-compatibility checks.
+
+2001-10-25 Thursday 11:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (space_dim.2): All comparison operators on
+	  Polyhedron throw an exception when the two polyhedra are
+	  dimension-incompatible.
+
+2001-10-25 Thursday 11:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox, src/Polyhedron.defs.hh (space_dim.[1,1]):
+	  Added an informal specification for dimension-compatibility.	The
+	  specification of Polyhedron::insert now says that an exception is
+	  thrown if the argument is dimension-incompatible with the
+	  polyhedron.
+
+2001-10-24 Wednesday 20:16  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Generator.defs.hh (1.19), Polyhedron.cc (1.39),
+	  Polyhedron.defs.hh (1.49): Exceptions are thrown when polyhedra
+	  are dimension-incompatible.
+
+2001-10-24 Wednesday 20:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.30): Better explained the difference
+	  between the dimension of the polyhedron and the dimension of the
+	  enclosing space.  The terminology "dimension-consistent" added.
+	  Pointed out what seems to be a problem with empty polyhedrons
+	  (what is the dimensions of their enclosing space?)
+
+2001-10-24 Wednesday 14:57  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.29): A full scan on the user-manual
+	  portion of the introduction.	In particular: - added a
+	  proposition after Minkowsky's theorem for rational polyhedra; -
+	  preferring the use of \lambda wrt \mu for scalars; - yet another
+	  variation on the definition of extreme rays; - "non-negative"
+	  combinations are now "positive" combinations; - better explaining
+	  the border-line cases of the generators representation.
+
+2001-10-24 Wednesday 10:47  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.28): Doxygen does not accept "\f(" [and
+	  neither the potentially correct "\f\("] as a way to enter LaTeX
+	  mathematical environment.  Indexes of vectors goes from 0 to the
+	  dim-1.
+
+2001-10-23 Tuesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.7): Ready for distribution.
+
+2001-10-23 Tuesday 19:43  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.11): Distribute also the BUGS file.
+
+2001-10-23 Tuesday 19:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.12): Produce and make available HTML
+	  documentation to be used off-line.
+
+2001-10-23 Tuesday 19:35  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* BUGS (1.1), NEWS (1.2), TODO (1.2): Initial versions of these
+	  files.
+
+2001-10-23 Tuesday 19:23  Elisa Ricci
+
+	* tests/: Makefile.am (1.18), affinetrans.cc (1.1): Added a test
+	  for the functions assign_variable and substitute_variable.
+
+2001-10-23 Tuesday 19:21  Elisa Ricci
+
+	* src/Polyhedron.cc (1.38): In function assign_variable and
+	  substitute_variable we must have size_t num_columns =
+	  x.num_dimensions() + 1 instead of size_t num_columns =
+	  x.con_sys(gen_sys).num_columns() because at this point we do not
+	  know which system we have.
+
+2001-10-23 Tuesday 18:52  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.27): A small improvement on the
+	  explanation of the representation by generators.
+
+2001-10-23 Tuesday 18:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.37), Polyhedron.defs.hh (1.48):
+	  Polyhedron::constraints() no longer throws an exception when
+	  *this is a zero-dimensional polyhedron (now it returns the empty
+	  system of constraints).  Polyhedron::generators() no longer
+	  throws an exception when *this is an empty polyhedron (now it
+	  returns the empty system of generators).
+
+2001-10-23 Tuesday 18:12  Elisa Ricci
+
+	* src/minimize.cc (1.4): We see the definitions in the Introduction
+	  and not in the file definition.dox.
+
+2001-10-23 Tuesday 18:09  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.47): Typo fixed.
+
+2001-10-23 Tuesday 18:05  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: Makefile.am (1.17), error4.cc (1.1): Added a test on the
+	  exception thrown when building a polyhedron by using a non-empty
+	  system of generators with no vertices.
+
+2001-10-23 Tuesday 17:57  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.46): Added the explanation of why a
+	  parameter of a function is non-constant.
+
+2001-10-23 Tuesday 17:54  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.36): Exception messages now use the
+	  "function: message" convention.  The comment in
+	  PPL::Polyhedron::Polyhedron(GenSys& gs) related to the existence
+	  of a vertex improved.
+
+2001-10-23 Tuesday 17:27  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.26): In the proposition after the
+	  definition of rays, we need to consider a non-empty polyhedron
+	  and a non-zero vector \vect{r}.  It is NOT true that extreme rays
+	  define _all_ the directions in which an arbitrary polyhedron is
+	  infinite.  Definition of line simplified. A typo fixed in
+	  definition of Minkowsky's sum.
+
+2001-10-23 Tuesday 16:50  Elisa Ricci
+
+	* src/Polyhedron.cc (1.35): In function
+	  Polyhedron::insert(Constraint), if we add a constraint to an
+	  empty polyhedron it remains empty.
+
+2001-10-23 Tuesday 16:35  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.34), Polyhedron.defs.hh (1.45): When a
+	  polyhedron is built starting from a system of generators, this
+	  must have at least a vertex; otherwise an exception is thrown.
+
+2001-10-23 Tuesday 16:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Generator.cc (1.4), Generator.inlines.hh (1.9),
+	  Polyhedron.cc (1.33), Polyhedron.inlines.hh (1.8): Inlining is no
+	  longer requested for functions that may throw.
+
+2001-10-23 Tuesday 16:11  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.9), configure.ac (1.8), src/Makefile.am (1.12),
+	  src/Row.defs.hh (1.4), src/ppl_header.bottom (1.3),
+	  src/ppl_header.top (1.2): Better configuration and macro
+	  handling.
+
+2001-10-23 Tuesday 14:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.32): DLEVEL noise removed.
+
+2001-10-23 Tuesday 14:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.8), configure.ac (1.7), src/ConSys.cc (1.12),
+	  src/ConSys.defs.hh (1.20), src/ConSys.inlines.hh (1.5),
+	  src/Constraint.cc (1.3), src/Constraint.defs.hh (1.14),
+	  src/Constraint.inlines.hh (1.5), src/GenSys.cc (1.14),
+	  src/GenSys.defs.hh (1.29), src/GenSys.inlines.hh (1.5),
+	  src/Generator.cc (1.3), src/Generator.defs.hh (1.18),
+	  src/Generator.inlines.hh (1.8), src/LinExpression.cc (1.3),
+	  src/LinExpression.defs.hh (1.14), src/LinExpression.inlines.hh
+	  (1.4), src/Makefile.am (1.11), src/Matrix.cc (1.6),
+	  src/Matrix.defs.hh (1.6), src/Matrix.inlines.hh (1.4),
+	  src/Polyhedron.cc (1.31), src/Polyhedron.defs.hh (1.44),
+	  src/Polyhedron.inlines.hh (1.7), src/Row.cc (1.5),
+	  src/Row.defs.hh (1.3), src/Row.inlines.hh (1.5), src/SatMatrix.cc
+	  (1.6), src/SatMatrix.defs.hh (1.7), src/SatMatrix.inlines.hh
+	  (1.4), src/SatRow.cc (1.4), src/SatRow.defs.hh (1.7),
+	  src/SatRow.inlines.hh (1.4), src/Status.cc (1.6),
+	  src/Status.defs.hh (1.8), src/Status.inlines.hh (1.2),
+	  src/Variable.cc (1.3), src/Variable.defs.hh (1.8),
+	  src/Variable.inlines.hh (1.3), src/ppl_header.bottom (1.2): The
+	  INLINE/OUTLINE mechanism has gone: it caused too many problems.
+
+2001-10-23 Tuesday 14:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: GenSys.defs.hh (1.28), GenSys.inlines.hh (1.4): Inserting a
+	  generator in a GenSys automatically adjust the dimensions.
+	  Specialization of std:swap for GenSys's added.
+
+2001-10-23 Tuesday 14:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.19), ConSys.inlines.hh (1.4): Better
+	  documented the fact that, when inserting constraints in a ConSys,
+	  dimensions are automatically adjusted.  Added the specialization
+	  of function std:swap for ConSys's.
+
+2001-10-23 Tuesday 13:40  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.25), ppl.sty (1.5): Changes to allow for
+	  a decomposition when there are no vertices.
+
+2001-10-23 Tuesday 11:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.43): Brackets closing a namespace
+	  should be marked as in
+
+	  namespace Parma_Polyhedra_Library {	...  } // namespace
+	  Parma_Polyhedra_Library
+
+2001-10-23 Tuesday 11:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/SatMatrix.inlines.hh (1.3): Must include <cassert>.
+
+2001-10-23 Tuesday 11:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/maxmin.hh (1.2): Put everything in our namespace.
+
+2001-10-23 Tuesday 10:58  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.24): Changes to user introduction to
+	  clarify why a polyhedron represented by a system of generators
+	  needs a vertex.  On-going improvements to the developer's guide
+	  including the removal of some repeated definitions.  Minor bugs
+	  fixed.
+
+2001-10-23 Tuesday 10:02  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/Makefile.am (1.16): INCLUDES now includes @extra_includes at .
+
+2001-10-23 Tuesday 09:53  Elisa Ricci
+
+	* src/: ConSys.cc (1.11), GenSys.cc (1.13), simplify.cc (1.5): For
+	  the definitions and the rules, we must see the Introduction
+	  instead of the file definitions.dox.	In the functions
+	  assign_variable and substitute_variable, the parameter "expr" is
+	  the "numerator" of affine expression.
+
+2001-10-23 Tuesday 09:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.10), Constraint.cc (1.2),
+	  Constraint.inlines.hh (1.4), GenSys.cc (1.12), LinExpression.cc
+	  (1.2), Matrix.cc (1.5), Matrix.inlines.hh (1.3), Row.cc (1.4),
+	  Row.inlines.hh (1.4), SatMatrix.cc (1.5): Do not request the
+	  inlining of functions containing loops.  Be consistent in the use
+	  of namespace names and aliases.
+
+2001-10-23 Tuesday 08:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.7), configure.ac (1.6),
+	  doc/user-browse.doxyconf-latex.in (1.7),
+	  doc/user-print.doxyconf-latex.in (1.7), doc/user.doxyconf-html.in
+	  (1.9), src/Makefile.am (1.10), src/Polyhedron.inlines.hh (1.6),
+	  src/ppl.cc (1.3), src/ppl_header.bottom (1.1), src/ppl_header.top
+	  (1.1), src/protect.sed (1.3), src/restore.sed (1.3),
+	  tests/append1.cc (1.3), tests/append2.cc (1.4), tests/empty1.cc
+	  (1.3), tests/error1.cc (1.4), tests/error2.cc (1.5),
+	  tests/error3.cc (1.4), tests/inters1.cc (1.5), tests/inters2.cc
+	  (1.6), tests/permute.cc (1.7), tests/print.hh (1.2),
+	  tests/randchull1.cc (1.6): The mechanism for automatically
+	  generating the header files has been rewritten from scratch.	We
+	  no longer depend on kcc: we use CXXCPP instead.  Avoid checking
+	  for header files we do not use.  Try to convince Doxygen not to
+	  sort things the way he wants, at least in user's documentation
+	  (SORT_MEMBER_DOCS = no).  Using std::invalid argument requires
+	  including <stdexcept>.  All tests should include the header file
+	  that will be installed (ppl_install.hh) so that we avoid checking
+	  against an already installed header (ppl.hh).
+
+2001-10-23 Tuesday 08:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Status.cc (1.5): Do not fight against emacs indentation
+	  rules.
+
+2001-10-22 Monday 19:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.18), GenSys.defs.hh (1.27): When using
+	  the doxygen command \code, indentation really matters and, for
+	  consistency, we should start with a 2-spaces indentation.
+
+2001-10-22 Monday 19:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.17): Example on how to build vertices
+	  split into two parts: the first one shows how to build a generic
+	  vertex and, in particular, the origin of the space; the second
+	  one shows how to use the optional denominator argument.
+
+2001-10-22 Monday 19:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Status.cc (1.4), Status.defs.hh (1.7): An annoying warning
+	  about an unused argument dealt with by exploiting pre-processing
+	  macro NDEBUG.
+
+2001-10-22 Monday 16:18  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.30), conversion.cc (1.6), simplify.cc
+	  (1.4): Used the notation of "vect{..}" for all the vectors that
+	  are in the comments.	The definitions and the rules must be seen
+	  in the "Introduction" instead of "definitions.dox" or
+	  "user_definitions.dox".
+
+2001-10-22 Monday 16:08  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Polyhedron.cc (1.29), Polyhedron.defs.hh (1.42): Now the
+	  argument `denominator' for methods Polyhedron::assign_variable
+	  and Polyhedron::substitute_variable is a _const_ Integer&,
+	  optional and with a default value of 1.
+
+2001-10-22 Monday 15:58  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ChangeLog (1.2): Updated.
+
+2001-10-22 Monday 15:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* tests/: error1.cc (1.3), error2.cc (1.4), error3.cc (1.3),
+	  inters2.cc (1.5), randchull1.cc (1.5): All tests updated to use
+	  the new functions line, ray and vertex.
+
+2001-10-22 Monday 15:10  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.cc (1.9), ConSys.defs.hh (1.17), GenSys.cc (1.11),
+	  GenSys.defs.hh (1.26), Generator.defs.hh (1.16),
+	  Generator.inlines.hh (1.7), Polyhedron.defs.hh (1.41): Operators
+	  |, ^, /= have now been replaced by functions `line', 'ray' and
+	  'vertex'. Note that the function vertex has an _optional_ second
+	  argument (the denominator), with default value 1.  Hopefully, all
+	  the documentation has been changed accordingly (please check).
+	  In GenSys and ConSys, now the functions assign_variable and
+	  substitute_variable take a _const_ Integer& as their third
+	  argument.  The same change cannot be applied to the corresponding
+	  functions defined on Polyhedron, since we perform a swap on this
+	  argument, so that it cannot be const.  However, I am now seeing
+	  if it is possible to have also these as "optional" arguments,
+	  with a default value of 1. Alas, I need to read the C++ manual in
+	  order to see how I can define a default value for a non-const
+	  argument passed by reference.
+
+2001-10-22 Monday 15:05  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.6), configure.ac (1.5),
+	  doc/devref-browse.doxyconf-latex.in (1.6),
+	  doc/devref-print.doxyconf-latex.in (1.6),
+	  doc/devref.doxyconf-html.in (1.7), src/.cvsignore (1.4),
+	  src/Makefile.am (1.9), src/SatRow.cc (1.3), src/SatRow.defs.hh
+	  (1.6), src/SatRow.inlines.hh (1.3): SatRow reimplemented from
+	  scratch: we no longer depend on the BitSet class.
+
+2001-10-22 Monday 14:26  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.23): Changed \alpha in the definition of
+	  affine transformations to \lambda.  Added a comment after the
+	  definition of "Combinations" that the empty sum is the origin.
+
+2001-10-22 Monday 10:34  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.22): Changes to wording and restructuring
+	  of the definition of Polyhedra.  New headings added : Constraints
+	  representation and Rational polyheron.  Heading "Generators"
+	  replaced by "Generators representation".  Wording in this
+	  definition changed
+
+2001-10-22 Monday 10:02  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.40): In the comments, there was a
+	  system of constraints called "constraints" instead of "cs" and a
+	  variable called "var" instead of "v".
+
+2001-10-22 Monday 09:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Generator.defs.hh (1.15): Wording of comment on how to build
+	  a generator changed. Also minor changes to wording in the
+	  following examples.
+
+2001-10-22 Monday 09:52  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.21): I was wrong to remove the
+	  "^\transpose" in Weil's theorem - restored.
+
+2001-10-22 Monday 09:25  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.39): In two examples, erased the spaces
+	  between the factor and the variable.
+
+2001-10-22 Monday 09:04  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.20): Comment at the end of Weil's theorem
+	  had "convex" and "positive" and "rays" and "vertices" wrong way
+	  round.  Minor change to wording introducing the two theorems.  In
+	  final comment of user part, "blurb" removed.
+
+2001-10-22 Monday 08:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.19): Removed spurious ^\transpose (^T) in
+	  Weil's theorem.  Added "dual representation" as heading and
+	  emphasised in text at end of user definitions.
+
+2001-10-21 Sunday 15:50  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.16), GenSys.defs.hh (1.25),
+	  Generator.defs.hh (1.14), Generator.inlines.hh (1.6),
+	  LinExpression.defs.hh (1.13), LinExpression.inlines.hh (1.3),
+	  Polyhedron.defs.hh (1.38): Systems of constraints and generators
+	  do not define polyhedra; rather, they may "correspond to" a given
+	  polyhedron (the one that would be built by applying the adequate
+	  constructor).  A system of generator does not need to include a
+	  vertex, in general.  The vertex is needed if the system of
+	  generators is meant to correspond to a non-empty polyhedron.	The
+	  detailed description of class Generator changed to highlight that
+	  vertices, lines and rays are represented as a type plus a
+	  direction in the space.
+
+2001-10-21 Sunday 14:00  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.10): CREDITS added to the distribution.
+
+2001-10-21 Sunday 13:04  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.13), Constraint.inlines.hh (1.3): In
+	  the documentation, used n to denote the dimension of the space.
+	  In the renaming operator >>, the parameter p renamed into offset,
+	  consistently with the comment.  In the examples, removed spaces
+	  between factor and variable when specifying a linear expression
+	  (e.g., "3 * x + 4 * y" now is written "3*x + 4*y").
+
+2001-10-21 Sunday 13:01  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/definitions.dox (1.18): When specifying the coordinates of a
+	  point, indexes should range from 0 to n-1, if n is the dimension
+	  of the space.  This is to be consistent with definition of class
+	  Variable.  Change applied to the definitions of scalar-product,
+	  of polytope and to Weil's theorem.  Note: I do not like to say a
+	  polyhedron is "open" in one direction; I prefer the terminology
+	  "unbounded", so I changed it.
+
+2001-10-21 Sunday 12:09  Elisa Ricci
+
+	* doc/definitions.dox (1.17): Restored some mathematical changes
+	  and used the notation "\vect{..}" for all the vectors (also in
+	  the part that is not in the user manual).
+
+2001-10-21 Sunday 11:56  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.12), Generator.defs.hh (1.13),
+	  Polyhedron.defs.hh (1.37), Variable.cc (1.2), Variable.defs.hh
+	  (1.7): In the documentation of the namespace PPL, all non-friend
+	  operators are now grouped consistently. I do not like very much
+	  the current header of each group ("Non-friend operators on
+	  objects ..." is maybe too much implementation-aware), but in any
+	  case it is definitely better than the default grouping header
+	  ("Functions").
+
+2001-10-21 Sunday 11:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* README (1.6): Now it is in sync with the home page of the www
+	  documentation.
+
+2001-10-21 Sunday 11:14  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* doc/: definitions.dox (1.16), ppl.sty (1.4): The new macro \vect
+	  inserted in ppl.sty; now the macro simply uses the latex command
+	  \mathbf, but we can modify its meaning as we like.  Had a run on
+	  definitions.dox to consistently use the new macro: be careful, in
+	  the future, to use 0 when a scalar is meant, and \vect{0} when
+	  the origin of the space is meant.  Also made small, readability
+	  related changes to Minkowsky's and Weil's theorems.
+
+2001-10-20 Saturday 21:30  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.5): Equation -> equality.
+
+2001-10-20 Saturday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.4): Almost complete: only the directory structure is
+	  missing.
+
+2001-10-20 Saturday 16:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* CREDITS (1.2): Just a formatting change.
+
+2001-10-20 Saturday 16:25  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: definitions.dox (1.15), devref.tex (1.5), user.tex (1.6):
+	  Footers fixed.  Put the blame on Doxygen.
+
+2001-10-20 Saturday 16:22  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* AUTHORS (1.2), CREDITS (1.1): Renamed and completed.
+
+2001-10-20 Saturday 12:22  Elisa Ricci
+
+	* doc/definitions.dox (1.14), src/Polyhedron.defs.hh (1.36): Moved
+	  the definition of the universe polyhedron after the definition of
+	  the polyhedron.
+
+2001-10-20 Saturday 11:47  Elisa Ricci
+
+	* src/: GenSys.cc (1.10), GenSys.defs.hh (1.24), Polyhedron.cc
+	  (1.28), Polyhedron.defs.hh (1.35), Status.defs.hh (1.6),
+	  conversion.cc (1.5): Now, we always use `system of' instead of
+	  `set of' for GenSys and ConSys.  In the comment of polyhedron
+	  added the explanation of what an universal polyhedron is.  Some
+	  changes to the comment of the exception: we say that they "have
+	  different dimension" instead of that they "do not have the same
+	  dimension".
+
+2001-10-20 Saturday 10:26  Elisa Ricci
+
+	* src/LinExpression.defs.hh (1.12): In the second part of the
+	  example, we can use  LinExpression e = LinExpression(14) instead
+	  of   LinExpression e = LinExpression(Integer(14)).
+
+2001-10-19 Friday 20:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user-browse.doxyconf-latex.in (1.6),
+	  user-print.doxyconf-latex.in (1.6), user.doxyconf-html.in (1.8):
+	  No INTERNAL_DOCS, no INHERIT_DOCS, no FILE_PATTERNS, and no
+	  EXCLUDE_PATTERNS.
+
+2001-10-19 Friday 19:57  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.15), GenSys.defs.hh (1.23): Use
+	  PPL_INTERNAL inheritance.
+
+2001-10-19 Friday 18:13  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.13): Generators and associated terminology
+	  now defined in the user section.  There is now some repetition of
+	  definitions in the developer's section.
+
+2001-10-19 Friday 17:27  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.27), Polyhedron.defs.hh (1.34),
+	  Polyhedron.inlines.hh (1.5): Simplified the comment to the
+	  function swap.  Used `v' instead of `var', `dim' instead of
+	  `add_dim'.  All the ConSys are called `cs' and all the GenSys are
+	  called `gs'.	Used the expression "thrown if" to introduce the
+	  comment to the exceptions.  The variable is "substituted" in the
+	  function substitute_variable.
+
+2001-10-19 Friday 17:19  Elisa Ricci
+
+	* src/: ConSys.cc (1.8), ConSys.defs.hh (1.14), GenSys.cc (1.9),
+	  GenSys.defs.hh (1.22): The Generator is called `g' instead of `r'
+	  and the number that indicates the variable is called `v' instead
+	  of 'var'.
+
+2001-10-19 Friday 17:12  Elisa Ricci
+
+	* src/: Constraint.defs.hh (1.11), Generator.defs.hh (1.12):
+	  Constraint and Generator are :: PPL_INTERNAL Row instead of ::
+	  public Row (like LinExpression).
+
+2001-10-19 Friday 14:24  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.9), depcomp (1.2), install-sh (1.2), ppl.spec.in
+	  (1.6), doc/Makefile.am (1.11), doc/definitions.dox (1.12),
+	  doc/devref-browse.doxyconf-latex.in (1.5),
+	  doc/devref-print.doxyconf-latex.in (1.5),
+	  doc/devref.doxyconf-html.in (1.6), doc/gpl.dox (1.2),
+	  doc/user-browse.doxyconf-latex.in (1.5),
+	  doc/user-print.doxyconf-latex.in (1.5), doc/user.doxyconf-html.in
+	  (1.7), src/ConSys.cc (1.7), src/ConSys.defs.hh (1.13),
+	  src/ConSys.inlines.hh (1.3), src/Constraint.defs.hh (1.10),
+	  src/GenSys.cc (1.8), src/GenSys.defs.hh (1.21),
+	  src/GenSys.inlines.hh (1.3), src/Generator.defs.hh (1.11),
+	  src/LinExpression.defs.hh (1.11), src/Makefile.am (1.8),
+	  src/Matrix.cc (1.4), src/Matrix.defs.hh (1.5),
+	  src/Matrix.inlines.hh (1.2), src/Polyhedron.cc (1.26),
+	  src/Polyhedron.defs.hh (1.33), src/Polyhedron.inlines.hh (1.4),
+	  src/Row.cc (1.3), src/Row.inlines.hh (1.3), src/SatMatrix.cc
+	  (1.4), src/SatMatrix.defs.hh (1.6), src/SatMatrix.inlines.hh
+	  (1.2), src/SatRow.defs.hh (1.5), src/SatRow.inlines.hh (1.2),
+	  src/Status.cc (1.3), src/Status.defs.hh (1.5), src/conversion.cc
+	  (1.4), src/minimize.cc (1.3), src/simplify.cc (1.3),
+	  tests/Makefile.am (1.15), tests/append2.cc (1.3), tests/error2.cc
+	  (1.3), tests/inters1.cc (1.4), tests/inters2.cc (1.4),
+	  tests/permute.cc (1.6): Annoying trailing blanks removed.
+
+2001-10-19 Friday 14:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.10), LinExpression.inlines.hh
+	  (1.2): We now have only one sizing constructor, and it is
+	  private.
+
+2001-10-19 Friday 12:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: conversion.cc (1.3), minimize.cc (1.2), simplify.cc (1.2),
+	  Matrix.cc (1.3): Old junk removed.
+
+2001-10-19 Friday 12:15  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.25), Polyhedron.defs.hh (1.32): In
+	  functions widening_assign and limited_widening_assign considered
+	  the case of empty-polyhedron and the exception for the different
+	  dimension of the polyhedra and the matrix (this for the
+	  limited_widening); added some explanations for the parameters.
+	  In function assign_variable and substitute_variable considered
+	  the exceptions for the variable that is not inside the polyhedron
+	  and the expression that does not have the right dimension.
+
+2001-10-19 Friday 09:57  Elisa Ricci
+
+	* doc/definitions.dox (1.11): Some mathematical changes.
+
+2001-10-19 Friday 09:42  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.5), configure.ac (1.4): Add checks to determine
+	  the size of ints and longs.
+
+2001-10-19 Friday 09:06  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/Polyhedron.defs.hh (1.31): Examples 4 to 7 simplified.
+
+2001-10-19 Friday 08:56  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: Polyhedron.defs.hh (1.30), Variable.defs.hh (1.6): Changes
+	  to English.
+
+2001-10-18 Thursday 18:51  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.24), Polyhedron.defs.hh (1.29),
+	  Polyhedron.inlines.hh (1.3): In function add_dimensions_and_embed
+	  and add_dimensions_and_project the case of "add_dim" = 0 and the
+	  case of the empty polyhedron are considered.	In functions
+	  add_constraints, add_constraints_lazy, add_generators, generators
+	  and constraints instead of some assertion some exceptions are
+	  added.
+
+2001-10-18 Thursday 15:36  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: GenSys.defs.hh (1.20), LinExpression.defs.hh (1.9),
+	  Polyhedron.defs.hh (1.28): More improvements to the English.
+
+2001-10-18 Thursday 15:29  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.19): The real name of the function is
+	  GenSys_Con_Rel satisfy(const Constraint& c) const and not
+	  GenSys_Con_Rel satisfy_constraint(const Constraint& c) const.
+
+2001-10-18 Thursday 14:01  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/GenSys.defs.hh (1.18): Just "specify" changed to "specifies".
+
+2001-10-18 Thursday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/: ConSys.defs.hh (1.12), Constraint.defs.hh (1.9),
+	  GenSys.defs.hh (1.17), Generator.defs.hh (1.10): Changes to
+	  English.  In GenSys.defs.hh the explanation about a system of
+	  generators changed to:     An object of the class GenSys is a
+	  system of generators,     i.e. a container of objects of the
+	  class Generator     (lines, rays and vertices).      The set of
+	  generators must include at least one vertex.	    This is needed
+	  since a line or ray only specify a direction	    and a point is
+	  needed to indicate its position.
+
+2001-10-18 Thursday 12:40  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.23), Polyhedron.defs.hh (1.27): Now the
+	  function  GenSys_Con_Rel poly_satisfies_constraint(const
+	  Constraint& con) is called  GenSys_Con_Rel satisfies(const
+	  Constraint& c).  Added the exception for the functions
+	  convex_hull_lazy(), satisfies() and includes().
+
+2001-10-18 Thursday 12:37  Elisa Ricci
+
+	* src/: GenSys.cc (1.7), GenSys.defs.hh (1.16): Now the function
+	  PPL::GenSys::satisfy_constraint(const Constraint& c) const is
+	  called PPL::GenSys::satisfy(const Constraint& c) const.
+
+2001-10-18 Thursday 11:36  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/ehandlers.hh (1.2): Call exit(1) instead of abort().
+
+2001-10-18 Thursday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.14), append1.cc (1.2), ehandlers.hh (1.1):
+	  Set the handlers for unexpected and uncaught exceptions.
+
+2001-10-18 Thursday 09:38  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* src/GenSys.defs.hh (1.15): Small change to wording in
+	  GenSys_Con_Rel comment.
+
+2001-10-18 Thursday 09:07  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.5): Now the termination conditions are
+	  checked.
+
+2001-10-18 Thursday 08:32  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/permute.cc (1.4): Instead of giving the number of variables
+	  explicitly, it is obtained as needed using
+	  Polyhedron.num_dimensions.
+
+2001-10-18 Thursday 08:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.10): Now `make world' also produces the
+	  licenses in various formats.
+
+2001-10-17 Wednesday 20:18  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.22): throw_different_dimensions() fixed.
+
+2001-10-17 Wednesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.13), permute.cc (1.3): Made quiet.
+
+2001-10-17 Wednesday 20:17  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/error3.cc (1.2): Fixed and made quiet.
+
+2001-10-17 Wednesday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/append.cc (1.4): Renamed append1.cc.
+
+2001-10-17 Wednesday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: append1.cc (1.1), append2.cc (1.2): Renamed.
+
+2001-10-17 Wednesday 19:37  Elisa Ricci
+
+	* tests/error3.cc (1.1): Tests whether convex_hull assign throws
+	  when it should.
+
+2001-10-17 Wednesday 19:33  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.21), Polyhedron.defs.hh (1.26):
+	  Polyhedron::intersection_assign() and
+	  Polyhedron::convex_hull_assign() now throw an exception if asked
+	  to operate on polyhedra of different dimensions.
+
+2001-10-17 Wednesday 16:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/permute.cc (1.2): We now use the intended constraints.
+	  Termination is guaranteed by using Polyhedron::widening_assign().
+
+2001-10-17 Wednesday 16:31  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.11), ConSys.inlines.hh (1.2),
+	  GenSys.defs.hh (1.14), GenSys.inlines.hh (1.2): Added the
+	  function swap for GenSys and ConSys.
+
+2001-10-17 Wednesday 16:21  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/: Makefile.am (1.12), append2.cc (1.1), my_append.cc (1.2),
+	  permute.cc (1.1): The file my_append.cc renamed to append2.cc A
+	  new test program permute.cc added.  Makefile.am updated to
+	  include these tests.
+
+2001-10-17 Wednesday 16:08  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.20), Polyhedron.defs.hh (1.25): Added
+	  comments of the parameters to some public functions of
+	  Polyhedron.
+
+2001-10-17 Wednesday 15:27  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.10), Constraint.defs.hh (1.8),
+	  GenSys.defs.hh (1.13), Polyhedron.defs.hh (1.24): Now, the
+	  definitions of the variables used in the examples are before the
+	  examples (they are not inside the examples).
+
+2001-10-17 Wednesday 15:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* tests/my_append.cc (1.1): A modified version of append.cc where
+	  code is structured into two procedures, one for the initial
+	  polyhedra and one for the fix-point.
+
+2001-10-17 Wednesday 12:55  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.10): Definitions of linearly independent
+	  and affinely independent improved.
+
+2001-10-17 Wednesday 12:38  Elisa Ricci
+
+	* src/: Constraint.defs.hh (1.7), Generator.defs.hh (1.9),
+	  LinExpression.defs.hh (1.8): Now, "friend" mathods are inside the
+	  class documentation of these class.  In the "Detail Description"
+	  of the class LinExpression there is the paragraph "How to build a
+	  linear expression".
+
+2001-10-17 Wednesday 12:03  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.23): Used "check_not_empty" instead of
+	  "check_satisfiable" also in the comment of function
+	  Polyhedron::OK().
+
+2001-10-17 Wednesday 12:01  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.9), GenSys.defs.hh (1.12), Matrix.defs.hh
+	  (1.4), Polyhedron.cc (1.19), Polyhedron.defs.hh (1.22),
+	  SatMatrix.cc (1.3), SatMatrix.defs.hh (1.5), SatRow.defs.hh
+	  (1.4), Status.defs.hh (1.4): Changed the comments in the function
+	  OK().  In function Polyhedron::OK() used "check_not_empty"
+	  instead of "check_satisfiable".
+
+2001-10-17 Wednesday 11:05  Elisa Ricci
+
+	* src/: ConSys.cc (1.6), ConSys.defs.hh (1.8), GenSys.cc (1.6),
+	  GenSys.defs.hh (1.11), Polyhedron.cc (1.18), Polyhedron.defs.hh
+	  (1.21): In function assign_variable and substitute_variable and
+	  in their comments used "expr" instead of "coefficient".  Used the
+	  concatenation of two strings in the argument of
+	  std::invalid_argument(...).
+
+2001-10-17 Wednesday 11:03  Elisa Ricci
+
+	* src/Generator.inlines.hh (1.5): Used the concatenation of two
+	  strings in the argument of std::invalid_argument(...).
+
+2001-10-17 Wednesday 10:14  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.20): Erased the temporary debug
+	  constructor of a polyhedron.
+
+2001-10-17 Wednesday 09:19  Elisa Ricci
+
+	* src/: ConSys.cc (1.5), ConSys.defs.hh (1.7), GenSys.cc (1.5),
+	  GenSys.defs.hh (1.10), Matrix.cc (1.2), Matrix.defs.hh (1.3),
+	  Polyhedron.cc (1.17), Polyhedron.defs.hh (1.19), SatMatrix.cc
+	  (1.2), SatMatrix.defs.hh (1.4), SatRow.cc (1.2), SatRow.defs.hh
+	  (1.3), Status.cc (1.2), Status.defs.hh (1.3): Now, there is not
+	  NDEBUG before the function OK.
+
+2001-10-17 Wednesday 07:47  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: ConSys.cc (1.4), GenSys.cc (1.4), Generator.inlines.hh
+	  (1.4), Makefile.am (1.7), Polyhedron.cc (1.16), Row.cc (1.2),
+	  Row.inlines.hh (1.2): Now Integer and BitSet are in the PPL
+	  namespace.  Other namespace-related fixes.  Exception strings
+	  improved.
+
+2001-10-16 Tuesday 19:05  Elisa Ricci
+
+	* src/: Constraint.defs.hh (1.6), Generator.defs.hh (1.8): Changed
+	  the place of the paragraph "How to build ...".  In the comment of
+	  'Generator operator /=' used std::invalid_argument instead of
+	  invalid_argument.
+
+2001-10-16 Tuesday 18:59  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.18): Used std::invalid_argument instead
+	  of invalid_argument in the documentation of exception.
+
+2001-10-16 Tuesday 18:54  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.9), ppl.sty (1.3): More definitions
+	  added to ppl.sty.
+
+	  New definitions used in definitions.dox.  Layout of formula in
+	  Minkowski's theorem improved.
+
+2001-10-16 Tuesday 18:23  Elisa Ricci
+
+	* src/: ConSys.defs.hh (1.6), GenSys.defs.hh (1.9), Polyhedron.cc
+	  (1.15), Polyhedron.defs.hh (1.17), Status.defs.hh (1.2),
+	  conversion.cc (1.2): Used "\Rset" instead of "\mathbb{R}".
+
+2001-10-16 Tuesday 18:18  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Constraint.defs.hh (1.5), LinExpression.defs.hh (1.7),
+	  Variable.defs.hh (1.5): Examples on the creation of linear
+	  expressions and constraints moved to the right place. Comment
+	  about variable names moved into the definition of the class
+	  Variable.
+
+2001-10-16 Tuesday 18:06  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.7): The examples on how to build
+	  generators moved to the right place.
+
+2001-10-16 Tuesday 17:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: error1.cc (1.2), error2.cc (1.2): There is no point in
+	  including print.hh.
+
+2001-10-16 Tuesday 17:33  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/: definitions.dox (1.8), ppl.sty (1.2): Some logic notation
+	  and "things that hold by definition" added to ppl.sty \mathbb{R}
+	  replaced by \Rset in definitions.dox
+
+2001-10-16 Tuesday 17:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.14), src/Polyhedron.defs.hh (1.16),
+	  src/Variable.defs.hh (1.4), src/Variable.inlines.hh (1.2),
+	  tests/append.cc (1.3): The argument of
+	  Polyhedron::remove_dimensions() has changed again.  Now it is
+	  remove_dimensions(const std::set<Variable>& to_be_removed).
+
+2001-10-16 Tuesday 17:24  Elisa Ricci
+
+	* tests/: Makefile.am (1.11), error2.cc (1.1): Added a test for the
+	  expception of Polyhedron::assign_variable.
+
+2001-10-16 Tuesday 17:12  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.15): Commented the exception for the
+	  function assign_variable and substitute_variable.  Now, some
+	  important puclic function are in the user manual.
+
+2001-10-16 Tuesday 17:10  Elisa Ricci
+
+	* src/Generator.defs.hh (1.6): Commented the exception of the
+	  constructor of a vertex.
+
+2001-10-16 Tuesday 17:09  Elisa Ricci
+
+	* src/Generator.inlines.hh (1.3): A line has the inhomogeneus term
+	  equal to zero (like a ray).
+
+2001-10-16 Tuesday 16:40  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.8): Added two examples that show that at
+	  least a vertex is necessary in a set of generators.
+
+2001-10-16 Tuesday 15:20  Elisa Ricci
+
+	* src/Polyhedron.cc (1.13): In functions assign_variable and
+	  substitute_variable tha case of denominator == 0 is considered.
+
+2001-10-16 Tuesday 15:11  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.6), Variable.defs.hh (1.3): No
+	  longer using modules (\ingroup, \addgroup, etc.).
+
+2001-10-16 Tuesday 12:26  Elisa Ricci
+
+	* src/Polyhedron.cc (1.12): Erased a print.
+
+2001-10-16 Tuesday 12:23  Elisa Ricci
+
+	* src/: ConSys.cc (1.3), ConSys.defs.hh (1.5), GenSys.cc (1.3),
+	  GenSys.defs.hh (1.7): Corrected my previous error.
+
+2001-10-16 Tuesday 12:09  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.11), Polyhedron.defs.hh (1.14): The
+	  functions assingn_variable and substitute_variable use a Variable
+	  instead od a size_t and a const LinExpression instead of a
+	  vector<Integer>.  In this functions, we use a copy of the `coeff'
+	  to find the inverse transformations.	Changed the example in
+	  according to these changes.
+
+2001-10-16 Tuesday 12:04  Elisa Ricci
+
+	* src/: ConSys.cc (1.2), ConSys.defs.hh (1.4): Now
+	  substitute_variable uses LinExpression instead of a
+	  vector<Integer>.
+
+2001-10-16 Tuesday 12:03  Elisa Ricci
+
+	* src/: GenSys.cc (1.2), GenSys.defs.hh (1.6): Now
+	  assign_variable(..) uses an LinExpression instead of a
+	  vector<Integer>.
+
+2001-10-16 Tuesday 11:59  Elisa Ricci
+
+	* src/LinExpression.defs.hh (1.5): Now LinExpression is
+	  PPL_INTERNAL Row, instead of private Row.
+
+2001-10-16 Tuesday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.inlines.hh (1.2), tests/Makefile.am (1.10),
+	  tests/error1.cc (1.1): Throw an invalid_argument exception if
+	  Generator operator /=(const LinExpression& e, const Integer& n)
+	  is called with n == 0.  New test program error1.cc to test
+	  whether this situation is correctly handled.
+
+2001-10-16 Tuesday 10:54  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.3): New incipit.
+
+2001-10-16 Tuesday 10:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: Matrix.defs.hh (1.2), Row.defs.hh (1.2), SatMatrix.defs.hh
+	  (1.3), SatRow.defs.hh (1.2): All the specializations of the
+	  std::swap function related to implementation classes are now
+	  hidden from the user guide.
+
+2001-10-16 Tuesday 10:53  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.5): Summary changed.  Packager also changed in
+	  view of PGP signatures.
+
+2001-10-16 Tuesday 10:20  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.13): The parameter name of the
+	  "default" constructor for Polyhedron is `kind'.  Hal the comment
+	  was using a different parameter name (`full').
+
+2001-10-16 Tuesday 10:15  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.defs.hh (1.5): In the examples, replaced "\=" by "/=".
+
+2001-10-16 Tuesday 10:13  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.5): In the examples for defining
+	  vectors, all "\=" replaced by "/=".
+
+2001-10-16 Tuesday 08:31  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.lsm.in (1.2), src/Polyhedron.cc (1.10),
+	  src/Polyhedron.defs.hh (1.12), tests/append.cc (1.2): New
+	  interface for remove_dimensions(const std::vector<unsigned int>&
+	  to_be_removed).  Note: BitSet is an implementation detail that
+	  should not surface in the API.
+
+2001-10-16 Tuesday 07:38  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.4): First attempt at the LSM (Linux Software Map)
+	  entry form.
+
+2001-10-15 Monday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.9), append.cc (1.1): A first at the
+	  append's analysis test.
+
+2001-10-15 Monday 20:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/randchull1.cc (1.4): Do less work.
+
+2001-10-15 Monday 20:14  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/empty1.cc (1.2): Must return an int, not a bool.
+
+2001-10-15 Monday 18:35  Elisa Ricci
+
+	* src/Polyhedron.cc (1.9): Erased the "assert(OK())" from the
+	  function Polyhedron::insert(const Generator&): after an insertion
+	  of a generator the polyhedron can be not OK.
+
+2001-10-15 Monday 18:24  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.11): Added a new example to show the
+	  use of the function Polyhedron::insert(...).
+
+2001-10-15 Monday 18:13  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.8), src/Polyhedron.defs.hh (1.10),
+	  tests/Makefile.am (1.8), tests/empty1.cc (1.1): It is not
+	  possible to overload bool and unsigned int.  New enumeration
+	  Degenerate_Kind added with vales ZERO_DIMENSIONAL and EMPTY.	The
+	  constructor Polyhedron(Degenerate_Kind kind = ZERO_DIMENSIONAL)
+	  does the expected thing.  The program empty1.cc exemplifies two
+	  methods of obtaining an empty polyhedron.
+
+2001-10-15 Monday 18:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.9): ppl.sty must also be distributed.
+
+2001-10-15 Monday 17:14  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.7), Polyhedron.defs.hh (1.9): Now the
+	  default constructor of a polyhedron has a default argument.  If
+	  `full' is false, it builds an empty polyhedron (it has the flag
+	  set to empty); otherwise, if it has the default value (i.e.
+	  true), it bulids a zero-dimensional polyhedron.
+
+2001-10-15 Monday 16:44  Elisa Ricci
+
+	* src/Polyhedron.cc (1.6): If we build a polyhedron starting from a
+	  matrix of generators with no rows the polyhedron is empty.
+
+2001-10-15 Monday 16:15  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Makefile.am (1.8): Use an absolute path for adding to
+	  TEXINPUTS.
+
+2001-10-15 Monday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/.cvsignore (1.3): Here is the Integer class again.
+
+2001-10-15 Monday 15:40  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.inlines.hh (1.2): Multiple inclusion guard added.
+
+2001-10-15 Monday 15:20  Elisa Ricci
+
+	* src/Polyhedron.cc (1.5): In the constructors of a polyhedron that
+	  use a system of constraints or a set of generators these matrices
+	  must be at least two columns.  In the function
+	  remove_dimensions(..) if the matrix of generators does not have
+	  at least two columns (i.e num_columns() <= 1) the polyhedron
+	  becomes zero-dimensional and so we clear the `con_sys' and
+	  `gen_sys'.  In function insert(const Constraint& c) if the
+	  polyhedron is zero-dimensional we add also the positivity
+	  constraint.  In functions insert(...) it is no longer necessary
+	  clear `con_sys' and `gen_sys' before adding a row if the
+	  polyhedron is zero-dimensional.  In function OK(), we verify if
+	  in a zero-dimensional polyhedron `con_sys' and `gen_sys' have no
+	  rows.
+
+2001-10-15 Monday 15:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: Makefile.am (1.7), devref-browse.doxyconf-latex.in (1.4),
+	  devref-print.doxyconf-latex.in (1.4), devref.doxyconf-html.in
+	  (1.5), devref.tex (1.4), ppl.sty (1.1),
+	  user-browse.doxyconf-latex.in (1.4), user-print.doxyconf-latex.in
+	  (1.4), user.doxyconf-html.in (1.6), user.tex (1.5): New LaTeX
+	  commands can now be defined in ppl.sty and then freely used in
+	  the doxygen and LaTeX sources.  This works also when producing
+	  HTML pages.
+
+2001-10-15 Monday 13:59  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.8): Rewrite a part of the brief
+	  description of the class Polyhedron.	Added some more expanation
+	  for the examples 5 and 6.
+
+2001-10-15 Monday 12:19  Elisa Ricci
+
+	* src/SatMatrix.defs.hh (1.2): Added a briefly description for the
+	  saturation matrix.
+
+2001-10-15 Monday 11:59  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.3): Now we build a relocatable package.
+
+2001-10-15 Monday 11:34  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* ppl.spec.in (1.2): A first cut at a working RPM spec file.
+
+2001-10-15 Monday 09:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Makefile.am (1.6): It is now possible for the build directory
+	  to be the same as the source directory.
+
+2001-10-14 Sunday 22:32  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* INSTALL (1.2), missing (1.2), mkinstalldirs (1.3): Updated.
+
+2001-10-14 Sunday 21:28  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.8), configure.ac (1.3), doc/Makefile.am (1.6),
+	  m4/Makefile.am (1.2), src/Makefile.am (1.5), tests/Makefile.am
+	  (1.7): Several packaging bugs have been fixed: now `make
+	  distcheck' is OK.
+
+2001-10-14 Sunday 21:26  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref-browse.doxyconf-latex.in (1.3),
+	  devref-print.doxyconf-latex.in (1.3), devref.doxyconf-html.in
+	  (1.4), user-browse.doxyconf-latex.in (1.3),
+	  user-print.doxyconf-latex.in (1.3), user.doxyconf-html.in (1.5):
+	  The sysdep directory does not exist anymore.
+
+2001-10-14 Sunday 14:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.7), doc/Makefile.am (1.5), doc/definitions.dox
+	  (1.7), doc/devref-browse.doxyconf-latex.in (1.2),
+	  doc/devref-print.doxyconf-latex.in (1.2),
+	  doc/devref.doxyconf-html.in (1.3), doc/fdl.dox (1.1), doc/fdl.tex
+	  (1.1), doc/gfdl.dox (1.2), doc/gpl.tex (1.1), doc/gpl.texi (1.2),
+	  doc/gpl.texinfo (1.2), doc/texinfo.tex (1.2),
+	  doc/user-browse.doxyconf-latex.in (1.2),
+	  doc/user-print.doxyconf-latex.in (1.2), doc/user.doxyconf-html.in
+	  (1.4): Documentation reorganized.
+
+2001-10-14 Sunday 11:46  Elisa Ricci
+
+	* src/Polyhedron.cc (1.4): In functions Polyhedron::insert(const
+	  Constraint& c) e Polyhedron::insert(const Constraint& c) the case
+	  of a zero-dimensional polyhedron is considered.
+
+2001-10-13 Saturday 21:16  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/Polyhedra.texinfo (1.3): Was never meant to be here.
+
+2001-10-13 Saturday 19:06  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* config.h.in (1.4), configure.ac (1.2): Configuration fixed in
+	  various respects.
+
+	  Please note that:
+
+	  - debugging (-g) is ON by default; - standard optimization (-O2)
+	  is THE default; - run-time assertions are OFF by default.
+
+2001-10-13 Saturday 19:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.4), ppl.cc (1.2), protect.sed (1.2),
+	  restore.sed (1.2): Generation of libppl.a and ppl.hh fixed.
+
+2001-10-13 Saturday 19:03  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.6), inters1.cc (1.3), inters2.cc (1.3),
+	  randchull1.cc (1.3): Programs using the PPL need only include
+	  ppl.hh.
+
+2001-10-13 Saturday 19:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Polyhedron.cc (1.3), tests/randchull1.cc (1.2): It is now
+	  possible to insert a generator into an empty polyhedron.
+
+2001-10-13 Saturday 16:37  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.6), acconfig.h (1.2), acinclude.m4 (1.1),
+	  config.guess (1.2), config.h.in (1.3), config.sub (1.2),
+	  configure.ac (1.1), configure.in (1.5), doc/Makefile.am (1.4),
+	  m4/.cvsignore (1.1), src/Makefile.am (1.3), tests/Makefile.am
+	  (1.5): Upgraded to newer versions of autoconf.  Use the new
+	  checks for detecting GMP.
+
+2001-10-13 Saturday 12:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.5), m4/Makefile.am (1.1),
+	  m4/ac_check_gmp_exceptions.m4 (1.1), m4/ac_check_have_gmp.m4
+	  (1.1): New tests to check whether GMP is installed and, if so,
+	  whether it was compiled with -fexceptions.
+
+2001-10-13 Saturday 10:56  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.4), Makefile.am (1.4), Makefile.in (1.4),
+	  aclocal.m4 (1.2), configure (1.5), stamp-h.in (1.2),
+	  doc/.cvsignore (1.1), doc/Makefile.am (1.3), doc/Makefile.in
+	  (1.3), src/.cvsignore (1.2), src/Makefile.in (1.3),
+	  tests/.cvsignore (1.1), tests/Makefile.in (1.5): Automatically
+	  generated  files should not be in the repository and their
+	  presence in the directory structure should be ignored.
+
+2001-10-12 Friday 22:27  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* configure (1.4), configure.in (1.4), doc/Makefile.am (1.2),
+	  doc/Makefile.in (1.2), doc/devref-browse.doxyconf-latex.in (1.1),
+	  doc/devref-print.doxyconf-latex.in (1.1),
+	  doc/devref.doxyconf-pdf.in (1.3), doc/devref.tex (1.3),
+	  doc/user-browse.doxyconf-latex.in (1.1),
+	  doc/user-print.doxyconf-latex.in (1.1), doc/user.doxyconf-pdf.in
+	  (1.4), doc/user.tex (1.4): Several improvements to the
+	  documentation.  We now produce docs for printing and docs for
+	  browsing
+
+2001-10-12 Friday 18:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.doxyconf-html.in (1.2), devref.doxyconf-pdf.in
+	  (1.2), user.doxyconf-html.in (1.3), user.doxyconf-pdf.in (1.3),
+	  user.tex (1.3): The project name is "Parma Polyhedra Library",
+	  "PPL" for short.
+
+2001-10-12 Friday 18:01  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.4), Makefile.in (1.4), randchull1.cc
+	  (1.1): New test computing convex-hulls of random polytopes.
+
+2001-10-12 Friday 17:19  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.6): Title of document changed.  Sections
+	  changed so that there are two sections, an introduction to
+	  polyhedra and a more advanced section which talks about the PPL
+	  implementation.  Comment about vertices differing from rays only
+	  in the n+1'th  term moved to before "Valid linear inequalities"
+	  paragraph.
+
+2001-10-12 Friday 17:09  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/: Makefile.am (1.2), Makefile.in (1.2): Header file ppl.hh is
+	  now guarded against multiple inclusion.
+
+2001-10-12 Friday 17:08  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* src/Generator.cc (1.2): Bug fixed: a vertex in the origin was
+	  printed as "v()" instead of "v(0)".
+
+2001-10-12 Friday 16:51  Elisa Ricci
+
+	* src/: Polyhedron.cc (1.2), Polyhedron.defs.hh (1.7): Added the
+	  function Polyhedron::insert(const Generator& g).
+
+2001-10-12 Friday 16:36  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.6): Added other two examples: one is
+	  for the use of assign_variable(...) and the other is for the use
+	  of substitute_variable(...).
+
+2001-10-12 Friday 15:44  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.5): Corrected a my error: to build a
+	  vertex "/=" is needed instead of "\=".
+
+2001-10-12 Friday 15:12  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.4): Added two examples to the comment:
+	  one to specify the use of add_dimensions_and_embed(..) and the
+	  other to specify the use of add_dimensions_and_project(...).
+	  Corrected an error in a formula: now in the comment of
+	  convex_hull(...) and convex_hull_lazy(..) there is \f$\cup\f$
+	  instead of \f$\union\f$ (that caused an error in Latex).
+
+2001-10-12 Friday 15:07  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/inters2.cc (1.2): Fixed and extended.
+
+2001-10-12 Friday 14:20  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* tests/: Makefile.am (1.3), Makefile.in (1.3), inters1.cc (1.2),
+	  inters2.cc (1.1), print.hh (1.1): print.hh contains functions
+	  that are useful for printing polyhedra.  inters1.cc improved.
+	  New test inters2.cc computing the intersection of a pyramid with
+	  an half-space of variable height, then counting the number of
+	  vertices of the resulting polytope (the empty polyhedron, a
+	  proper frustum, or a singleton).
+
+2001-10-12 Friday 13:20  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.5): Section on the "equivalence of
+	  homogeneous and inhomogeneous systems" (up to the paragraph
+	  called "Valid linear inequalities") changed and reworded.  Title
+	  of section changed to "Homogeneous systems".
+
+2001-10-12 Friday 10:04  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* README (1.2), doc/Polyhedra.texinfo (1.2), tests/Makefile.am
+	  (1.2), tests/Makefile.in (1.2): Bump copyright year.
+
+2001-10-12 Friday 09:55  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.3), Makefile.in (1.3), config.h.in (1.2),
+	  configure (1.3), configure.in (1.3), tests/Makefile.am (1.1),
+	  tests/Makefile.in (1.1), tests/inters1.cc (1.1): Infrastructure
+	  for the tests directory and `make check'.  inters1.cc is a first
+	  example of how test programs could be written.
+
+2001-10-11 Thursday 17:37  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Polyhedron.defs.hh (1.3): Added a backslash to mathbb in the
+	  second example.  Removing empty lines that were causing Examples
+	  1 and 2 to end prematurely.
+
+2001-10-11 Thursday 17:00  Elisa Ricci
+
+	* src/Polyhedron.defs.hh (1.2): Added two examples to the comment:
+	  one is for the construction of a square using the constraints and
+	  the generators. The other is for the construction of an
+	  half-strip using the constraints and the generators.
+
+2001-10-11 Thursday 16:57  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.4): Added another example for the
+	  construction of a set of generators (it builds an half-strip).
+
+2001-10-11 Thursday 16:56  Elisa Ricci
+
+	* src/ConSys.defs.hh (1.3): Added another example for the
+	  constraction of a system of constraints (it builds an
+	  half-strip).
+
+2001-10-11 Thursday 16:41  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.4): The paragraph "The Minkowski's
+	  theorem" renamed to	"Minkowski's theorem.  The condition
+	  "rank(A) = n" changed to   "where A is a matrix of rank n".  The
+	  note following the definition is reworded so that the
+	  conditions are not bracketed.  "Linear equalities and
+	  inequalities" has been   changed to "constraints".  "positive
+	  multiples of each inequality and ray" has been    changed to
+	  "positive multiples of each constraint and ray".  The word "the"
+	  inserted where necessary.
+
+	  The paragraph "The Weil's theorem" renamed to "Weil's theorem.
+
+2001-10-11 Thursday 16:07  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Constraint.defs.hh (1.4): In the examples, variable "cs"
+	  renamed into "inequal" and "equal".
+
+2001-10-11 Thursday 15:49  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.3): In the definition of rays:  P is
+	  defined before P_0;  A and b are defined;  inserted "any point"
+	  before r; The comment that a ray is the direction in which P is
+	  infinite, moved from within the statement of the proposition to
+	  before the proposition and reworded.
+
+	  In the definition of lines, wording improved.  Comment relating
+	  opposite rays with lines made into a separate paragraph. It is
+	  not part of the definition.
+
+2001-10-11 Thursday 14:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.4): In the first two examples,
+	  variable z now has index 2 (using index 5 was correct, but a bit
+	  misleading).
+
+2001-10-11 Thursday 14:33  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.4): IN the first example, variable "g"
+	  renamed as "line".
+
+2001-10-11 Thursday 14:32  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/Generator.defs.hh (1.3): Examples modified:  - using more
+	  meaningful names (line, ray and vertex) for Generator variables;
+	  - explained that the first argument of operators | and ^ is
+	  meaningless;	- explained how to use the second argument of /= to
+	  obtain vertices    with non-integral coefficients.
+
+2001-10-11 Thursday 14:28  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/GenSys.defs.hh (1.3): In the first example, Variable y(0)
+	  changed in Variable y(1) to avoid dimension clash with Variable
+	  x(0).  In the second example, the computation of the past-the-end
+	  iterator moved outside the for-loop.
+
+2001-10-11 Thursday 13:53  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: ConSys.defs.hh (1.2), Constraint.defs.hh (1.3),
+	  Constraint.inlines.hh (1.2): Friend members building a constraint
+	  using operators < and > removed.  Example changed accordingly.
+	  In the example on the use of iterators for ConSys, the
+	  past-the-end iterator is now computed only once before the
+	  for-loop.
+
+2001-10-11 Thursday 13:49  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: user.doxyconf-html.in (1.2), user.doxyconf-pdf.in (1.2): Do
+	  not show inheritance graphs or diagrams.  Do not show a thousands
+	  times that the only PPL header file is ppl.hh.
+
+2001-10-11 Thursday 13:44  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* doc/: devref.tex (1.2), user.tex (1.2): Tatiana's email address
+	  fixed.  Better titles.
+
+2001-10-11 Thursday 13:03  Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+	* doc/definitions.dox (1.2): In the definition of the combinations,
+	  the p_1,...,p_k are changed to x_1,...,x_k.  In the definition of
+	  scalar product: "vector" is changed to "vectors".  In the
+	  definition of polyhedra there are a number of changes to
+	  notation, the definitions of the notation and to the wording.
+
+2001-10-11 Thursday 12:38  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/: LinExpression.defs.hh (1.3), Variable.defs.hh (1.2): Some
+	  errors (just introduced by me) removed.  Methods of class
+	  Variable added to group LinExpression.
+
+2001-10-11 Thursday 12:00  Enea Zaffanella <zaffanella at cs.unipr.it>
+
+	* src/LinExpression.defs.hh (1.2): A few changes in the example.
+
+2001-10-11 Thursday 11:22  Elisa Ricci
+
+	* src/Generator.defs.hh (1.2): Added three examples: one for the
+	  construction of a line, one for the construction of a ray and the
+	  other for the construction of a vertex.
+
+2001-10-11 Thursday 11:19  Elisa Ricci
+
+	* src/GenSys.defs.hh (1.2): Added an example in the comment: it is
+	  useful to specify the construction of a set of generators.
+
+2001-10-11 Thursday 11:16  Elisa Ricci
+
+	* src/Constraint.defs.hh (1.2): Added two examples in the comment:
+	  one for the building of an inequality and the other for the
+	  building of an equality.
+
+2001-10-11 Thursday 08:39  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* Makefile.am (1.2), Makefile.in (1.2), configure (1.2),
+	  configure.in (1.2): Disable the test directory.
+
+2001-10-11 Thursday 08:33  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.3), src/.cvsignore (1.1): My mistake: BitSet and
+	  Integer are subdirectories of src.
+
+2001-10-11 Thursday 08:29  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.2): Ignore the BitSet and Integer subdirectories:
+	  they must be here and must be ignored by CVS.
+
+2001-10-10 Wednesday 21:50  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* mkinstalldirs (1.2): $Id tag removed.
+
+2001-10-10 Wednesday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.1.1.1), AUTHORS (1.1.1.1), COPYING (1.1.1.1),
+	  ChangeLog (1.1.1.1), INSTALL (1.1.1.1), Makefile.am (1.1.1.1),
+	  Makefile.in (1.1.1.1), NEWS (1.1.1.1), README (1.1.1.1), TODO
+	  (1.1.1.1), acconfig.h (1.1.1.1), aclocal.m4 (1.1.1.1),
+	  config.guess (1.1.1.1), config.h.in (1.1.1.1), config.sub
+	  (1.1.1.1), configure (1.1.1.1), configure.in (1.1.1.1), depcomp
+	  (1.1.1.1), install-sh (1.1.1.1), missing (1.1.1.1), mkinstalldirs
+	  (1.1.1.1), ppl.lsm.in (1.1.1.1), ppl.spec.in (1.1.1.1),
+	  stamp-h.in (1.1.1.1), doc/Makefile.am (1.1.1.1), doc/Makefile.in
+	  (1.1.1.1), doc/Polyhedra.texinfo (1.1.1.1), doc/definitions.dox
+	  (1.1.1.1), doc/devref.doxyconf-html.in (1.1.1.1),
+	  doc/devref.doxyconf-pdf.in (1.1.1.1), doc/devref.tex (1.1.1.1),
+	  doc/gfdl.dox (1.1.1.1), doc/gpl.dox (1.1.1.1), doc/gpl.texi
+	  (1.1.1.1), doc/gpl.texinfo (1.1.1.1), doc/texinfo.tex (1.1.1.1),
+	  doc/user.doxyconf-html.in (1.1.1.1), doc/user.doxyconf-pdf.in
+	  (1.1.1.1), doc/user.tex (1.1.1.1), src/ConSys.cc (1.1.1.1),
+	  src/ConSys.defs.hh (1.1.1.1), src/ConSys.inlines.hh (1.1.1.1),
+	  src/ConSys.types.hh (1.1.1.1), src/Constraint.cc (1.1.1.1),
+	  src/Constraint.defs.hh (1.1.1.1), src/Constraint.inlines.hh
+	  (1.1.1.1), src/Constraint.types.hh (1.1.1.1), src/GenSys.cc
+	  (1.1.1.1), src/GenSys.defs.hh (1.1.1.1), src/GenSys.inlines.hh
+	  (1.1.1.1), src/GenSys.types.hh (1.1.1.1), src/Generator.cc
+	  (1.1.1.1), src/Generator.defs.hh (1.1.1.1),
+	  src/Generator.inlines.hh (1.1.1.1), src/Generator.types.hh
+	  (1.1.1.1), src/LinExpression.cc (1.1.1.1),
+	  src/LinExpression.defs.hh (1.1.1.1), src/LinExpression.inlines.hh
+	  (1.1.1.1), src/LinExpression.types.hh (1.1.1.1), src/Makefile.am
+	  (1.1.1.1), src/Makefile.in (1.1.1.1), src/Matrix.cc (1.1.1.1),
+	  src/Matrix.defs.hh (1.1.1.1), src/Matrix.inlines.hh (1.1.1.1),
+	  src/Matrix.types.hh (1.1.1.1), src/Polyhedron.cc (1.1.1.1),
+	  src/Polyhedron.defs.hh (1.1.1.1), src/Polyhedron.inlines.hh
+	  (1.1.1.1), src/Polyhedron.types.hh (1.1.1.1), src/Row.cc
+	  (1.1.1.1), src/Row.defs.hh (1.1.1.1), src/Row.inlines.hh
+	  (1.1.1.1), src/Row.types.hh (1.1.1.1), src/SatMatrix.cc
+	  (1.1.1.1), src/SatMatrix.defs.hh (1.1.1.1),
+	  src/SatMatrix.inlines.hh (1.1.1.1), src/SatMatrix.types.hh
+	  (1.1.1.1), src/SatRow.cc (1.1.1.1), src/SatRow.defs.hh (1.1.1.1),
+	  src/SatRow.inlines.hh (1.1.1.1), src/SatRow.types.hh (1.1.1.1),
+	  src/Status.cc (1.1.1.1), src/Status.defs.hh (1.1.1.1),
+	  src/Status.inlines.hh (1.1.1.1), src/Status.types.hh (1.1.1.1),
+	  src/Variable.cc (1.1.1.1), src/Variable.defs.hh (1.1.1.1),
+	  src/Variable.inlines.hh (1.1.1.1), src/Variable.types.hh
+	  (1.1.1.1), src/conversion.cc (1.1.1.1), src/globals.cc (1.1.1.1),
+	  src/globals.hh (1.1.1.1), src/maxmin.hh (1.1.1.1),
+	  src/minimize.cc (1.1.1.1), src/ppl.cc (1.1.1.1), src/protect.sed
+	  (1.1.1.1), src/restore.sed (1.1.1.1), src/simplify.cc (1.1.1.1):
+	  Imported into the new repository.
+
+2001-10-10 Wednesday 21:45  Roberto Bagnara <bagnara at cs.unipr.it>
+
+	* .cvsignore (1.1), AUTHORS (1.1), COPYING (1.1), ChangeLog (1.1),
+	  INSTALL (1.1), Makefile.am (1.1), Makefile.in (1.1), NEWS (1.1),
+	  README (1.1), TODO (1.1), acconfig.h (1.1), aclocal.m4 (1.1),
+	  config.guess (1.1), config.h.in (1.1), config.sub (1.1),
+	  configure (1.1), configure.in (1.1), depcomp (1.1), install-sh
+	  (1.1), missing (1.1), mkinstalldirs (1.1), ppl.lsm.in (1.1),
+	  ppl.spec.in (1.1), stamp-h.in (1.1), doc/Makefile.am (1.1),
+	  doc/Makefile.in (1.1), doc/Polyhedra.texinfo (1.1),
+	  doc/definitions.dox (1.1), doc/devref.doxyconf-html.in (1.1),
+	  doc/devref.doxyconf-pdf.in (1.1), doc/devref.tex (1.1),
+	  doc/gfdl.dox (1.1), doc/gpl.dox (1.1), doc/gpl.texi (1.1),
+	  doc/gpl.texinfo (1.1), doc/texinfo.tex (1.1),
+	  doc/user.doxyconf-html.in (1.1), doc/user.doxyconf-pdf.in (1.1),
+	  doc/user.tex (1.1), src/ConSys.cc (1.1), src/ConSys.defs.hh
+	  (1.1), src/ConSys.inlines.hh (1.1), src/ConSys.types.hh (1.1),
+	  src/Constraint.cc (1.1), src/Constraint.defs.hh (1.1),
+	  src/Constraint.inlines.hh (1.1), src/Constraint.types.hh (1.1),
+	  src/GenSys.cc (1.1), src/GenSys.defs.hh (1.1),
+	  src/GenSys.inlines.hh (1.1), src/GenSys.types.hh (1.1),
+	  src/Generator.cc (1.1), src/Generator.defs.hh (1.1),
+	  src/Generator.inlines.hh (1.1), src/Generator.types.hh (1.1),
+	  src/LinExpression.cc (1.1), src/LinExpression.defs.hh (1.1),
+	  src/LinExpression.inlines.hh (1.1), src/LinExpression.types.hh
+	  (1.1), src/Makefile.am (1.1), src/Makefile.in (1.1),
+	  src/Matrix.cc (1.1), src/Matrix.defs.hh (1.1),
+	  src/Matrix.inlines.hh (1.1), src/Matrix.types.hh (1.1),
+	  src/Polyhedron.cc (1.1), src/Polyhedron.defs.hh (1.1),
+	  src/Polyhedron.inlines.hh (1.1), src/Polyhedron.types.hh (1.1),
+	  src/Row.cc (1.1), src/Row.defs.hh (1.1), src/Row.inlines.hh
+	  (1.1), src/Row.types.hh (1.1), src/SatMatrix.cc (1.1),
+	  src/SatMatrix.defs.hh (1.1), src/SatMatrix.inlines.hh (1.1),
+	  src/SatMatrix.types.hh (1.1), src/SatRow.cc (1.1),
+	  src/SatRow.defs.hh (1.1), src/SatRow.inlines.hh (1.1),
+	  src/SatRow.types.hh (1.1), src/Status.cc (1.1),
+	  src/Status.defs.hh (1.1), src/Status.inlines.hh (1.1),
+	  src/Status.types.hh (1.1), src/Variable.cc (1.1),
+	  src/Variable.defs.hh (1.1), src/Variable.inlines.hh (1.1),
+	  src/Variable.types.hh (1.1), src/conversion.cc (1.1),
+	  src/globals.cc (1.1), src/globals.hh (1.1), src/maxmin.hh (1.1),
+	  src/minimize.cc (1.1), src/ppl.cc (1.1), src/protect.sed (1.1),
+	  src/restore.sed (1.1), src/simplify.cc (1.1): Initial revision
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..6e90e07
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation,
+Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf limitation.  Until the limitation is lifted, you can use
+this workaround:
+
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..6557fb9
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,85 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = . utils src tests interfaces demos doc m4
+
+dist_noinst_SCRIPTS = \
+configure
+
+nodist_noinst_HEADERS = \
+ppl-config.h
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+ppl-config.h: config.h $(srcdir)/ppl-config.sed
+	$(SED) -f $(srcdir)/ppl-config.sed config.h >$@
+
+ppl-config.h.in: $(srcdir)/config.h.in $(srcdir)/ppl-config.sed
+	$(SED) -f $(srcdir)/ppl-config.sed $(srcdir)/config.h.in >$@
+
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST';  but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+dist-hook:
+	rm -f $(distdir)/ppl-config.h \
+	&& $(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+	          -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+		<$(distdir)/configure.ac >$(distdir)/configure.ac.new \
+	&& touch $(distdir)/configure.ac.new -r $(distdir)/configure.ac \
+	&& mv -f $(distdir)/configure.ac.new $(distdir)/configure.ac
+	$(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+	          -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+		<$(distdir)/configure >$(distdir)/configure.new \
+	&& touch $(distdir)/configure.new -r $(distdir)/configure \
+	&& mv -f $(distdir)/configure.new $(distdir)/configure \
+	&& chmod +x $(distdir)/configure
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST';  but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+EXTRA_DIST = \
+ppl-config.h \
+ppl-config.h.in \
+ppl-config.sed \
+ppl.lsm.in \
+BUGS \
+CREDITS \
+ChangeLog_2001-2008 \
+README.alpha \
+README.arm \
+README.configure \
+README.solaris \
+STANDARDS
+
+DISTCLEANFILES = \
+ppl-config.h
+
+distcleancheck_listfiles = \
+  find -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..0842da0
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,988 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/configure $(am__configure_deps) \
+	$(srcdir)/config.h.in mkinstalldirs $(srcdir)/ppl.lsm.in \
+	$(dist_noinst_SCRIPTS) $(dist_noinst_HEADERS) COPYING \
+	ChangeLog INSTALL NEWS README TODO compile config.guess \
+	config.rpath config.sub depcomp install-sh missing ltmain.sh
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = ppl.lsm
+CONFIG_CLEAN_VPATH_FILES =
+SCRIPTS = $(dist_noinst_SCRIPTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(dist_noinst_HEADERS) $(nodist_noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).tar.xz \
+	$(distdir).zip
+GZIP_ENV = --best
+DIST_TARGETS = dist-xz dist-bzip2 dist-gzip dist-zip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = . utils src tests interfaces demos doc m4
+dist_noinst_SCRIPTS = \
+configure
+
+nodist_noinst_HEADERS = \
+ppl-config.h
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared
+
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST';  but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+EXTRA_DIST = \
+ppl-config.h \
+ppl-config.h.in \
+ppl-config.sed \
+ppl.lsm.in \
+BUGS \
+CREDITS \
+ChangeLog_2001-2008 \
+README.alpha \
+README.arm \
+README.configure \
+README.solaris \
+STANDARDS
+
+DISTCLEANFILES = \
+ppl-config.h
+
+distcleancheck_listfiles = \
+  find -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
+
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+ppl.lsm: $(top_builddir)/config.status $(srcdir)/ppl.lsm.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(SCRIPTS) $(HEADERS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--refresh check check-am clean clean-cscope clean-generic \
+	clean-libtool cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
+	dist-tarZ dist-xz dist-zip distcheck distclean \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+ppl-config.h: config.h $(srcdir)/ppl-config.sed
+	$(SED) -f $(srcdir)/ppl-config.sed config.h >$@
+
+ppl-config.h.in: $(srcdir)/config.h.in $(srcdir)/ppl-config.sed
+	$(SED) -f $(srcdir)/ppl-config.sed $(srcdir)/config.h.in >$@
+
+# Kludge: we need to force building `ppl-config.h' on `make dist',
+# hence we list it in `EXTRA_DIST';  but we do not want to distribute
+# it, hence we erase it in `dist-hook'.
+dist-hook:
+	rm -f $(distdir)/ppl-config.h \
+	&& $(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+	          -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+		<$(distdir)/configure.ac >$(distdir)/configure.ac.new \
+	&& touch $(distdir)/configure.ac.new -r $(distdir)/configure.ac \
+	&& mv -f $(distdir)/configure.ac.new $(distdir)/configure.ac
+	$(SED) -e "s/^enableval=thorough$$/enableval=quick/g" \
+	          -e "s/^default_interfaces=\$${available_interfaces}$$/default_interfaces=\$${non_prolog_interfaces}/g" \
+		<$(distdir)/configure >$(distdir)/configure.new \
+	&& touch $(distdir)/configure.new -r $(distdir)/configure \
+	&& mv -f $(distdir)/configure.new $(distdir)/configure \
+	&& chmod +x $(distdir)/configure
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..3fc1d9b
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,2053 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+Verbatim copying and distribution of this entire article is permitted
+in any medium, provided this notice is preserved.
+
+
+Parma Polyhedra Library NEWS -- history of user-visible changes
+===============================================================
+
+--------------------------------------------------------------------------
+NEWS for version 1.1  (released on October 28, 2013)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Added a new operator on polyhedra: the positive time elapse.
+
+o  In the Java language interface:
+
+    - The constraint/generator/... system classes now extend the ArrayList
+      generic container (rather than Vector);
+
+    - Variable objects are now built from a long (rather than int) value,
+      thereby matching the type used elsewhere for space dimensions;
+
+    - added new static method to Variable class
+          void setStringifier(Variable_Stringifier)
+      where Variable_Stringifier is an interface allowing for
+      customization of the output routine for variable's names
+      (see example in interfaces/Java/tests/Variable_Output_test1.java);
+
+    - added value NOT_EQUAL to enumeration Relation_Symbol.
+
+
+Bugfixes
+========
+
+o  Portability improved.
+
+o  Fixed a precision regression in Polyhedron method
+     void drop_some_non_integer_points(const Variables_Set&,
+                                       Complexity_Class);
+
+o  In the Java language interface, fixed a C++/Java conversion error
+   whereby the construction of a valid Variable object in JNI code
+   was leading to an exception being thrown. The bug has only been
+   observed on 32-bit builds.
+
+o  In the Java interface, fixed declaration of methods
+     void drop_some_non_integer_points(...);
+   so as to accept a Complexity_Class enum value.
+
+o  Fixed an issue in method MIP_Problem::OK() whereby the method
+   was trying to enforce a non-invariant condition.
+
+
+--------------------------------------------------------------------------
+NEWS for version 1.0  (released on June 28, 2012)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Significant improvements have been obtained in both time and space
+   resource usage by the definition of data structures and algorithms
+   for the case of "sparse rows", i.e., sequences of coefficients
+   where most of the values are zero.
+
+o  The library fully supports two different representations for rows:
+   the "dense" representation is an array-like representation tailored
+   to sequences having most of their coefficients different from zero;
+   the "sparse" representation saves memory space (as well as CPU
+   cycles) when most of the coefficients in the sequence are zero.
+
+o  A generic interface allows for a seamless interaction between the
+   dense and the sparse row representation. Most library entities
+   (linear expressions, constraints, generators, congruences, and
+   their systems) can be built using either representation, specified
+   as a constructor's argument.
+
+o  As a by-product of this sparse/dense refactoring work, efficiency
+   improvements have been obtained even for those computations that
+   are still based on the dense row representation.
+
+o  Reasonable default values for the row representation are provided
+   for each library entity, automatically leading to significant
+   memory space savings even in old client/library code, e.g., when
+   dealing with constraint systems describing weakly relational
+   abstractions such as boxes and octagonal shapes.
+
+o  If desired, these default values can be customized to user's needs
+   by changing just a few lines of library code.  For instance, the
+   constraint systems stored inside C_Polyhedron and NNC_Polyhedron
+   objects can be made to use the sparse representation by just
+   changing the following line in Polyhedron.defs.hh:
+
+     static const Representation default_con_sys_repr = DENSE;
+
+   to become
+
+     static const Representation default_con_sys_repr = SPARSE;
+
+
+Bugfixes
+========
+
+o  Fixed a bug affecting methods
+
+     bool BD_Shape<T>::contains(const BD_Shape& y) const;
+     bool Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const;
+
+   whereby the wrong result was obtained when *this is an empty
+   weakly-relational shape and y is not empty.
+
+o  Fixed a bug affecting the PIP solver whereby a wrong result could have
+   been obtained if the input constraint system contained multiple linear
+   equality constraints.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.12.1  (released on April 16, 2012)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  In the C, Java, OCaml and Prolog interfaces, modified the signature
+   of the function/method/predicate for setting the deterministic timeout
+   threshold. The new interfaces take two input values, named `unscaled'
+   and `scale', that are used to compute the threshold value as
+   `unscaled * 2^scale'.
+
+o  Added new Box<ITV> methods
+
+     bool has_upper_bound(Variable var,
+                          Coefficient& n, Coefficient& d, bool& closed) const;
+     bool has_lower_bound(Variable var,
+                          Coefficient& n, Coefficient& d, bool& closed) const;
+
+   to query a non-empty box for the existence and value of its upper/lower
+   bound on variable `var'. The methods have been also added to all the
+   available language interfaces.
+
+o  Two BibTeX databases of papers related to the Parma Polyhedra Library
+   have been added to the distribution (in the `doc' directory).
+
+
+Bugfixes
+========
+
+o  Restored the support for deterministic timeouts in the PIP solver
+   (it was removed by accident in PPL 0.12).
+
+o  Minor documentation fixes.
+
+o  Portability improved.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.12  (released on February 27, 2012)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  New configure options `--with-gmp=DIR', `--with-gmp-include=DIR' and
+   `--with-gmp-lib=DIR' supersede the (now removed) option
+   `--with-gmp-prefix'.  (The old option never really worked; hopefully
+   this is the last change in this area.)
+
+o  New configuration option `--disable-documentation'.  When specified
+   no new documentation is built: only the documentation already present
+   in the source tree is installed upon `make install'.
+
+o  The resolution process for PIP_Problem now better exploits the
+   integrality of parameters to simplify the newly generated tautological
+   constraints, the splitting constraints of decision nodes, and the
+   expressions defining artificial parameters.
+
+o  The implementations of the MIP and PIP solvers are based on a new
+   data structure leading to significant space and time savings when
+   the tableau matrix is sparse; the benchmarks of the ppl_lpsol demo
+   show an improvement on the average case, that grows when the toughest
+   tests in the benchmark suite are considered.
+
+o  When the `--check' option is used, the input data for demo ppl_lpsol
+   is perturbed the same way as GLPK does, thereby allowing for a
+   meaningful comparison of the results obtained.
+
+o  The input routine for PPL numeric datatypes has been extended to
+   accept the ISO9899 (C99) hexadecimal floating constant syntax.
+
+o  The Parma Watchdog Library has been merged into the
+   Parma Polyhedra Library.
+
+
+Bugfixes
+========
+
+o  Corrected a precision bug in methods
+
+     Box<ITV>::upper_bound_assign(const Box&)
+     Box<ITV>::upper_bound_assign_if_exact(const Box&)
+
+   whereby, provided any argument is an empty box and under other rather
+   specific conditions, the computed result was correct but unnecessarily
+   imprecise.
+
+o  Corrected a bug in method
+
+     Grid::relation_with(const Constraint&) const
+
+   whereby, under specific conditions, the method was creating invalid
+   Grid_Generator objects and providing an incorrect result.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.11.2  (released on February 27, 2011)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed the semantics of the `--disable-fpmath' configure option
+   (which is equivalent to `--enable-fpmath=no').  It now disables all
+   floating point computations and, consequently, all numerical
+   abstractions based on floating point numbers.
+
+o  The PPL no longer overwrites the SIGILL signal handler.
+
+o  Minor documentation fixes.
+
+o  Portability improved.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.11.1  (released on February 20, 2011)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Corrected a problem in the simplification of PIP_Problem solution trees
+   whereby, under specific conditions, the node merging process produced
+   decision nodes that did not satisfy their class invariant.
+
+o  Corrected a precision bug in method
+
+     Octagonal_Shape<T>::affine_image()
+
+   whereby in the case of an invertible affine transformation implementing
+   a variable sign symmetry (and optional translation), the computed result
+   was correct but unnecessarily imprecise.
+
+o  Corrected a problem in the input method for checked integers whereby,
+   under specific conditions, the input stream state bits were not updated.
+   The bug was only affecting builds using checked integer coefficients.
+
+o  Corrected a bug in the OCaml interface, which was affecting functions
+
+     ppl_Pointset_Powerset_<INSTANCE>_get_disjunct.
+
+o  Corrected a couple of resource (re-)allocation problems that, under
+   specific conditions, could affect the correctness of Grid constructor
+
+     Grid::Grid(const Box<Interval>& box)
+
+   and NNC_Polyhedron method
+
+     Polyhedron::generalized_affine_image().
+
+o  Corrected an efficiency bug in the C language interface function
+
+     ppl_Linear_Expression_add_to_coefficient().
+
+o  Corrected an efficiency bug in method
+
+     MIP_Problem::compute_generator().
+
+o  Corrected a bug affecting the input routine of ppl_lpsol, whereby
+   the inhomogeneous term of the objective function was disregarded.
+
+o  Corrected a bug affecting methods
+
+     Box::CC76_widening_assign(const T&, Iterator, Iterator)
+     Interval::CC76_widening_assign(const From&, Iterator, Iterator)
+
+   whereby a lower bound would not be computed correctly when the two
+   iterators specify an empty list of stop points.
+
+o  Fixed a bug affecting
+
+     Interval::Interval(const char* s)
+
+   whereby a wrong interval would be constructed if `s' denotes a number
+   that can only be represented as an infinity.
+
+o  Fixed a bug whereby the argument of all the methods
+
+     unconstrain(Variable var)
+
+   was not checked correctly for space dimension compatibility.
+
+o  Portability improved.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.11  (released on August 2, 2010)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  New class PIP_Problem provides a Parametric Integer Programming
+   (PIP) problem solver (mainly based on P. Feautrier's
+   specification).  The implementation combines a parametric dual
+   simplex algorithm using exact arithmetic with Gomory's cut
+   generation.
+
+o  New "deterministic" timeout computation facilities: it is now
+   possible to set computational bounds (on the library calls taking
+   exponential time) that do not depend on the actual elapsed time and
+   hence are independent from the actual computation environment (CPU,
+   operating system, etc.).
+
+o  New support for termination analysis via the automatic synthesis of
+   linear ranking functions.  Given a sound approximation of a loop,
+   the PPL provides methods to decide whether that approximation
+   admits a linear ranking function (possibly obtaining one as a
+   witness for termination) and to compute the space of all such
+   functions.  In addition, methods are provided to obtain the space
+   of all linear quasi-ranking functions, for use in conditional
+   termination analysis.
+
+o  New support for approximating computations involving (bounded)
+   machine integers.  A general wrapping operator is provided that is
+   parametric with respect to the set of space dimensions (variables)
+   to be wrapped, the width, representation and overflow behavior of
+   all these variables.  An optional constraint system can, when
+   given, improve the precision.
+
+o  All the PPL semantic objects provide new methods
+
+     void drop_some_non_integer_points(Complexity_Class)
+     void drop_some_non_integer_points(const Variables_Set&,
+                                       Complexity_Class)
+
+   which possibly tighten the object by dropping some points with
+   non-integer coordinates (for the space dimensions corresponding to
+   `vars'), within a certain computational complexity bound.
+
+o  New Linear_Expression methods
+
+     bool is_zero() const
+     bool all_homogeneous_terms_are_zero() const
+
+   return true if and only if `*this' is 0, and if and only if all the
+   homogeneous terms of `*this' are 0, respectively.
+
+o  New Linear_Expression methods
+
+     void add_mul_assign(Coefficient_traits::const_reference c, Variable v)
+     void sub_mul_assign(Coefficient_traits::const_reference c, Variable v)
+
+   assign linear expression *this + c * v (resp., *this - c * v) to *this,
+   while avoiding the allocation of a temporary Linear_Expression.
+
+o  For the PPL semantic objects, other than the Pointset_Powerset and
+   Partially_Reduced Product, there is a new method:
+
+     bool frequency(const Linear_Expression& expr,
+                    Coefficient& freq_n, Coefficient& freq_d,
+                    Coefficient& val_n, Coefficient& val_d)
+
+   This operator computes both the "frequency" (f = freq_n/freq_d)
+   and a value (v = val_n/val_d)  closest to zero so that every point
+   in the object satisfies the congruence (expr %= v) / f.
+
+o  New reduction operator "Shape_Preserving_Reduction" has been added
+   to the Partially_Reduced_Product abstraction.  This operator is
+   aimed at the product of a grid and a shape domain, allowing the
+   bounds of the shape to shrink to touch the points of the grid,
+   such that the new bounds are parallel to the old bounds.
+
+o  The Java interface has to be explicitly initialized before use by
+   calling static method Parma_Polyhedra_Library.initialize_library().
+   Initialization makes more explicit the exact point where PPL
+   floating point rounding mode is set; it also allows for the caching
+   of Java classes and field/method IDs, thereby reducing the overhead
+   of native method callbacks.
+
+o  The C and Java interfaces now support timeout computation facilities.
+
+o  Implementation of general (C and NNC) polyhedra speeded up.
+
+o  Implementation of the MIP solver speeded up.
+
+o  When the PPL has been configured with
+   CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1", the library initialization
+   procedure checks that the FPU can indeed be controlled and fails if
+   that is not the case.
+
+o  New configure option `--with-gmp-prefix' supersedes the (now removed)
+   options `--with-libgmp-prefix' and `--with-libgmpxx-prefix'.
+
+o  New configuration option `--with-gmp-build=DIR' allows to use a
+   non-installed build of GMP in DIR.
+
+
+Deprecated and Removed Methods
+==============================
+
+o  All methods having a name ending in `_and_minimize' (e.g.,
+   add_constraints_and_minimize, poly_hull_assign_and_minimize, ...)
+   have been removed (they were deprecated in version 0.10).
+
+
+Bugfixes
+========
+
+o  Corrected a bug in maximize and mininimize optimization methods of
+   class template Pointset_Powerset, whereby the Boolean value true
+   (indicating successful optimization) was returned for empty powersets.
+
+o  Corrected a bug in method
+     bool NNC_Polyhedron::poly_hull_assign_if_exact(const NNC_Polyhedron&);
+   whereby some inexact NNC hulls were incorrectly flagged as exact.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.10.2  (released on April 18, 2009)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Correctly detect GMP 4.3.0.
+
+o  Fixed the C interface library version information.
+
+o  Test program tests/Polyhedron/memory1 disabled on the zSeries s390x
+   platform.
+
+o  Makefiles fixed so as to avoid failure of `make -n check'.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.10.1  (released on April 14, 2009)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Added support for cross compilation.
+
+o  The configuration script now explicitly checks that a recent enough
+   version of GNU M4 is available if at least one non-C++ interface is
+   enabled (in previous versions this check was not performed and
+   building the library could fail in a mysterious way).
+
+o  Robustness improved.
+
+o  Some packaging issues have been fixed.
+
+o  New macro PPL_DIRTY_TEMP_COEFFICIENT allows users of the C++
+   interface to decrease memory allocation overhead and to improve
+   locality whenever they need a temporary variable of type
+   `Coefficient'.
+
+o  The C++, C, Java and OCaml interfaces now provide utility functions
+   to format the textual representations of constraints, congruences
+   and so on.  This makes it easy to code debugging prints with line
+   indentation and wrapping.
+
+o  The C interface now provides functions of the form
+
+     int ppl_io_asprint_Polyhedron(char** strp, P x)
+
+   where `P' is any opaque pointer to a const PPL object. These
+   functions print `x' to a malloc-allocated string, a pointer to
+   which is returned via `strp'.
+
+o  The OCaml interface can now be compiled to native code using ocamlopt.
+
+o  New configuration option `--with-mlgmp=DIR' allows to specify the
+   installation directory of the ML GMP package.
+
+o  The OCaml interface now supports timeout computation facilities
+   through functions ppl_set_timeout and ppl_reset_timeout.  Moreover,
+   new functions ppl_Coefficient_is_bounded, ppl_Coefficient_min,
+   ppl_Coefficient_max and ppl_max_space_dimension have been added.
+
+o  The Prolog interfaces are no longer enabled by default in the
+   release tarballs (they are enabled by default in the Git versions).
+
+
+Bugfixes
+========
+
+o  Fixed a bug whereby `make check' was failing when the library was
+   configured with the `--disable-watchdog' option.
+
+o  Fixed a bug in method
+
+     bool Polyhedron::contains_integer_point() const;
+
+   whereby, under very specific conditions, an empty polyhedron is
+   incorrectly said to contain an integer point.
+
+o  Fixed a bug in method
+
+     Partially_Reduced_Product<D1, D2, R>::time_elase_assign(y)
+
+  whereby, if the product y was not already reduced, the operation could
+  lose precision.
+
+o  Fixed a bug in the OCaml interface, which was affecting functions
+
+     ppl_Grid_generalized_affine_image_with_congruence
+
+   and
+
+     ppl_Grid_generalized_affine_preimage_with_congruence.
+
+o  Fixed a bug in the Grid class that affected the methods
+
+     Grid::bounds_from_above(), Grid::bounds_from_below(),
+     Grid::maximize() and Grid::minimize();
+
+   causing all of them to wrongly return true in certain cases where
+   the grid generators were not minimized.
+
+o  Fixed a bug whereby big-endian architectures were not properly
+   recognized by the configuration script.
+
+o  Fixed a bug in the Java/OCaml/Prolog interfaces, whereby
+   the method/function/predicate for dropping a disjunct from a
+   Pointset_Powerset object were returning an invalid iterator.
+
+o  Fixed a bug in method Octagonal_Shape<T>::affine_image(var, expr)
+   whereby a wrong result was computed under specific conditions.
+
+o  Fixed a bug in the OCaml interface, whereby functions of form
+
+     ppl_..._widening_assign_with_tokens
+
+   and
+
+     ppl_..._extrapolation_assign_with_tokens
+
+   could return a wrong number of tokens.
+
+o  Fixed a bug in the OCaml interface, whereby functions that returned
+   an OCaml 'unit' type were returning the wrong value.
+
+o  Fixed several garbage collection related bugs in the OCaml interface.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.10  (released on November 4, 2008)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+The license
+-----------
+
+o  The Parma Polyhedra Library is now released under the terms of the
+   version 3 (or later) of the GNU General Public License.
+
+New and renamed classes
+-----------------------
+
+o  The new class Octagonal_Shape provides an implementation of the domain
+   of octagonal shapes (including optimized algorithms and a provably
+   correct widening) as proposed by Roberto Bagnara, Patricia Hill,
+   Elena Mazzi and Enea Zaffanella in their SAS 2005 paper.
+
+o  A new abstraction called Box has been added.  Geometrically
+   speaking, a Box represents a not necessarily closed, iso-oriented
+   hyperrectangle.  This can also be seen as the smash product of `n'
+   not necessarily closed and possibly unbounded intervals, where `n'
+   is the space dimension of the box.  The Box template class is
+   parametric with respect to a class of intervals.
+
+o  A generic implementation of intervals has been added.  The template
+   class Interval is parametric on the type used to represent the
+   interval boundaries (all native integer and floating point types
+   are supported as well as unbounded integers and rational numbers
+   provided by GMP).  Another class template type parameter allows for
+   the control of a number of other features of the class (such as the
+   ability to represent: open as well as closed boundaries, empty
+   intervals in addition to nonempty ones, intervals of extended
+   number families that contain positive and negative infinities,
+   plain intervals of real numbers and intervals of integer numbers).
+   The Interval class still needs a lot of work and both its
+   implementation and its interface are likely to change significantly:
+   it is released now because it is needed for the Box class and as a
+   kind of technology preview.
+
+o  The class LP_Problem has been renamed MIP_Problem and now supports
+   the solution of Mixed Integer (Linear) Programming problems.
+   Support has been added for the incremental solution of MIP
+   problems: it is now possible to add new space dimensions or new
+   constraints to the feasible region, as well as change the objective
+   function and the optimization mode, while still exploiting some of
+   the computational work done before these changes.  Support has also
+   been added to change control parameters for the pricing method.
+   This allows a choice between the steepest edge pricing method,
+   either implemented with floating point numbers (default) or with
+   integer coefficients, and the textbook pricing method.
+
+o  The PPL semantic object Polyhedra_Powerset has been replaced by the
+   templatic object template <typename PS> Pointset_Powerset that can
+   take any (simple) PPL semantic object for the domain of its
+   disjuncts. In addition to the methods common to all the PPL
+   semantic objects, methods specific to this domain include:
+
+     void add_disjunct(const PS&),
+     void pairwise_reduce(),
+     void omega_reduce() const,
+     bool geometrically_covers(const Pointset_Powerset&) const,
+     bool geometrically_equals(const Pointset_Powerset&) const, and
+     bool simplify_using_context_assign(const Pointset_Powerset&).
+
+o  A new abstraction called Partially_Reduced_Product (PRP) has been
+   added. A PRP is a pair of two PPL semantic objects that is
+   parametric on the component domains and on a reduction operator.
+   The PPL currently provides three reduction operators and hence,
+   three different kinds of products:
+
+   - a Direct_Product where the reduction operator is the identity;
+
+   - a Smash_Product where the reduction operator shares emptiness
+      information between the components; and
+
+   - a Constraints_Product where the reduction operator refines each
+     component with the constraints satisfied by the other component.
+
+   The PRP class still needs a lot of work and both its implementation
+   and its interface are likely to change significantly: it is released
+   now as a kind of technology preview and any feedback is welcome.
+
+New and renamed methods
+-----------------------
+
+o  All PPL semantic objects can now be constructed from other simple
+   PPL semantic objects. All these constructors have an optional complexity
+   argument with default value allowing algorithms with any complexity to be
+   used.
+
+o   New methods
+
+      void restore_pre_PPL_rounding() and
+      void set_rounding_for_PPL()
+
+    allow the FPU rounding mode to be set to what it was before the
+    initialization of the PPL, and to set it (again) so that the PPL
+    abstractions based on floating point numbers work correctly, respectively.
+
+o  All PPL semantic objects now provide methods
+
+     void refine_with_constraint(const Constraint&),
+     void refine_with_congruence(const Congruence&),
+     void refine_with_constraints(const Constraint_System&), and
+     void refine_with_congruences(const Congruence_System&).
+
+   These methods are similar to the corresponding `add_' methods.
+   The difference is in the reaction policy when the argument
+   constraint/congruence is not optimally supported by the semantic
+   domain: while the `add_' methods will throw an exception, the
+   `refine_with_' methods will apply an upward approximation semantics.
+
+o  Default widening operators of the form:
+
+     void widening_assign(const ABSTRACTION&, unsigned*)
+
+   are now provided for all abstractions except for the Pointset_Powerset
+   abstractions.
+
+o  All PPL semantic objects now provide the method
+
+     int32_t hash_code() const
+
+   returning a 32-bit hash code for *this.  If x and y are such that
+   x == y evaluates to true, so does x.hash_code() == y.hash_code().
+
+o  All PPL semantic objects now provide the methods
+
+     memory_size_type total_memory_in_bytes() const
+     memory_size_type external_memory_in_bytes() const
+
+   returning, respectively, the total size in bytes of the memory
+   occupied by the PPL object and the size in bytes of the memory
+   managed by the PPL object.
+
+o  For all the PPL semantic objects there are new methods:
+
+    static bool can_recycle_constraint_systems() and
+    static bool can_recycle_congruence_systems()
+
+   that indicate whether or not a PPL semantic object is able to recycle
+   constraints and congruences, respectively.
+
+o  For all PPL semantic objects there is a new method:
+
+     bool contains_integer_point() const
+
+   which checks if a PPL semantic object contains an integer point;
+   Note that this is not currently provided for the Partially_Reduced_Product
+   classes.
+
+o  For all PPL semantic objects there is a new method:
+
+     bool constrains(Variable) const
+
+   which checks if a dimension is constrained by a PPL semantic object;
+
+o  For all PPL semantic objects there are new methods:
+
+     void unconstrain(Variable)
+     void unconstrain(const Variables_Set&)
+
+   which assign, to a PPL semantic object, the cylindrification
+   of the object with respect to one (resp., a set) of its dimensions,
+   as defined by L. Henkin, J. D. Monk, and A. Tarski in Cylindric Algebras:
+   Part I (published by North-Holland in 1971).
+
+o  Several methods
+
+     bool is_topologically_closed() const
+     void topological_closure_assign()
+
+   that were provided for just some of the PPL semantic objects are now
+   uniformly available for all the objects.
+
+o  Methods using the Congruence and Congruence_System classes
+   such as
+
+     Congruence_System congruences() const,
+     Congruence_System minimized_congruences() const,
+     void add_congruence(const Congruence&),
+     void add_congruences(const Congruence_System&),
+     void add_recycled_congruences(const Congruence_System&), and
+     Poly_Con_Relation relation_with(const Congruence&).
+
+   that were just provided for the Grid domain are now provided for
+   all the PPL semantic objects.
+
+o  For the Grid class, as it is not always possible to obtain a
+   Pointset_Powerset<Grid> object that is a finite linear partition of
+   the difference of two grids, we have added the method:
+     std::pair<Grid, Pointset_Powerset<Grid> >
+       approximate_partition(const Grid&, const Grid&, bool&)
+   where the third argument is set to false if there is no
+   finite linear partition.
+
+o  In the Congruence class, for consistency with the Constraint class,
+   the methods is_trivial_true() and is_trivial_false() have been renamed
+   as is_tautological() and is_inconsistent(), respectively.
+
+o  The methods
+
+     bool Constraint_System::empty() const,
+     bool Generator_System::empty() const,
+     bool Congruence_System::empty() const, and
+     bool Grid_Generator_System::empty() const
+
+   return true if and only if the system in question is empty
+   (i.e., it has no constraints, generators, congruences or grid-generators,
+   respectively).
+
+Deprecated and Removed Methods
+==============================
+
+o  As all PPL semantic objects can now be constructed from boxes,
+   the constructors
+
+     template <typename Box> C_Polyhedron(const Box&, From_Bounding_Box),
+     template <typename Box> NNC_Polyhedron(const Box&, From_Bounding_Box),
+     template <typename Box> Grid(const Box&, From_Bounding_Box)
+
+   have been removed. Similarly, as boxes can be constructed from other
+   PPL semantic objects, the method
+
+     template <typename Box>
+       void shrink_bounding_box(Box&, Complexity_Class) const
+
+   has been removed from all the classes.
+
+o  The use of methods having a name ending in `_and_minimize' (e.g.,
+   add_constraints_and_minimize, poly_hull_assign_and_minimize, ...)
+   is now deprecated (see the core library documentation for an
+   explanation); their complete removal is planned for version 0.11.
+
+o  Class BD_Shape and Grid no longer provide methods such as
+   bds_hull_*, join_*, bds_difference_* and grid_difference_*. The
+   uniformly named methods upper_bound_* and difference_assign should
+   be used instead.  For (C and NNC) polyhedra, the poly_hull_* and
+   poly_difference_assign methods have been kept for backward
+   compatibility (users should anyway prefer adopting the uniformly
+   named variants).
+
+o  For Grids, the PPL no longer supports covering boxes; hence the constructor
+
+     template <typename Box> Grid(const Box&, From_Covering_Box)
+
+   and also the method
+
+     template <typename Box> void get_covering_box(Box&) const
+
+   have been removed.
+
+Other changes for the C++ interface
+-----------------------------------
+
+o  All identifiers containing the strings `less_than_or_equal' or
+   `greater_than_or_equal', any case, have been renamed so as to contain
+   `less_or_equal' or `greater_or_equal', respectively.
+   A similar change also applies to the C interface (see below).
+
+o  The `ppl.hh' header file no longer defines macros not prefixed
+   by "PPL_".
+
+o  Users of the C++ interface of the library can now decide to disable
+   the automatic initialization mechanism of the PPL.  To do so, the
+   preprocessor symbol PPL_NO_AUTOMATIC_INITIALIZATION should be
+   defined before including the <ppl.hh> header file.  When automatic
+   initialization is disabled it is imperative to explicitly call the
+   new function
+
+     void Parma_Polyhedra_Library::initialize()
+
+   before using the library.  The new function
+
+     void Parma_Polyhedra_Library::finalize() and
+
+   should also be called (to release a small amount of memory) when
+   done with the library.
+
+Changes to the other language interfaces
+----------------------------------------
+
+o  Support for language interfaces has been expanded to include
+   OCaml and Java.  Thus the PPL now supports interfaces to
+   C++, C, Java, OCaml, Ciao Prolog, GNU Prolog, SICStus Prolog,
+   SWI Prolog, XSB Prolog and YAP Prolog.
+
+o  Most of the PPL semantic objects provided by the C++ interface
+   are also supported by all the non-C++ language interfaces. A few
+   domains (in particular, many of the possible Box instantiations)
+   are only available via the C++ interface.
+
+o  Almost all the public methods for the PPL semantic objects are
+   provided as methods/functions/predicates in the non-C++ language
+   interfaces with a uniform naming policy. In particular:
+
+   * in the C interface, the methods named
+
+       ppl_Polyhedron_{constraints,generators,congruences}
+       ppl_Polyhedron_minimized_{constraints,generators,congruences}
+
+     have been renamed
+
+       ppl_Polyhedron_get_{constraints,generators,congruences}
+       ppl_Polyhedron_get_minimized_{constraints,generators,congruences},
+
+     respectively;
+
+   * in the Prolog interfaces, the predicates
+
+       ppl_Grid_generalized_image_lhs_rhs/5 and
+       ppl_Grid_generalized_preimage_lhs_rhs/5
+       ppl_Grid_generalized_image/6 and
+       ppl_Grid_generalized_preimage/6
+
+     have been renamed as
+
+       ppl_Grid_generalized_image_lhs_rhs_with_congruence/5
+       ppl_Grid_generalized_preimage_lhs_rhs_with_congruence/5
+       ppl_Grid_generalized_image_with_congruence/6
+       ppl_Grid_generalized_preimage_with_congruence/6
+
+     respectively, so as to allow for /4 and /5, resp., versions.
+
+o  As already reported for the C++ interface, in the C interface,
+   all identifiers containing the strings `less_than_or_equal' or
+   `greater_than_or_equal', any case, have been renamed so as to contain
+   `less_or_equal' or `greater_or_equal', respectively.
+
+o  In the C interface it is no longer an error to call ppl_initialize()
+   or ppl_finalize() multiple times (this matches the behavior of the
+   other non-C++ language interfaces).
+
+Documentation changes
+---------------------
+
+o  The documentation for the library has been deeply reorganized and
+   split into several documents: besides the user and developer manuals
+   for the core library and its C++ interface, we now provide separate
+   user and developer manuals for each one of the other available
+   language interfaces (namely, C, Java, OCaml, and Prolog). It is
+   also possible to produce "configuration dependent" variants of the
+   non-C++ language interface manuals, where the contents of the
+   manual take into account the value of configuration option
+   `--enable-instantiations'.
+   All the manuals are provided in HTML, PDF and PostScript formats.
+
+o  New man pages libppl(3) and libppl_c(3) have been added.  These
+   give short overviews on how to use the PPL in C++ and C programs,
+   respectively, on Unix-like operating systems.
+
+Configuration changes
+---------------------
+
+o  Several options have been added to the configuration script.  These
+   allow to control the generated language interfaces, the floating
+   point instruction set to be used, the use of Valgrind during `make
+   check', the exclusion of some PPL-based programs from the build.
+   The README.configure file has been updated consequently.
+
+
+Bugfixes
+========
+
+o  Fixed bugs that prevented building the library on systems not supported
+   by the Parma Watchdog Library or when the `--disable-watchdog' configure
+   was used.
+
+o  Fixed a bug in Grid::constraints() and Grid::minimized_constraints()
+   that caused an internal assertion to fail when the grid had 0 space
+   dimensions.
+
+o  Fixed a bug in Linear_System::insert(const Linear_Row&) whereby a
+   wrong result could have been obtained when inserting a not necessarily
+   closed constraint/generator in an empty system having a higher space
+   dimension.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.9  (released on March 12, 2006)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The class Grid provides a complete implementation of the relational
+   domain of rational grids.  This can represent all sets that can
+   be expressed by the conjunction of a finite number of congruence
+   equations.  Operations provided include everything that is needed
+   in the field of static analysis and verification, including affine
+   images, preimages and their generalizations, grid-difference and
+   widening operators.  This is the first time such a complete domain
+   is made freely available to the community.
+
+o  Several important portability improvements.  Among other things,
+   it is now possible to build only the static libraries or only
+   the shared libraries.  (Notice that some interfaces depend on
+   the availability of the shared libraries: these will not be built
+   when shared libraries are disabled.)
+
+
+Bugfixes
+========
+
+o  Fixed a bug whereby the SICStus Prolog interface could not be built
+   on x86_64.
+
+o  Fixed a bug in an internal method that, under some circumstances,
+   could cause a wrong result to be computed.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.8  (released on January 20, 2006)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The class template BD_Shape<T> provides an implementation of the
+   abstract domain of bounded difference shapes. The template type
+   parameter T specifies the basic type used for the inhomogeneous term
+   of bounded difference constraints; it can be instantiated to either
+   GMP's unbounded precision types (mpq_class, mpz_class), native
+   floating point types (float, double), or native integer types
+   (8, 16, 32 and 64 bits wide).
+
+o  New class LP_Problem provides an implementation of the
+   primal simplex algorithm using exact arithmetic.
+
+o  The new program `ppl-config' returns information about the
+   configuration and the installed components of the PPL.
+   This greatly simplifies the task of writing makefiles and
+   automatic configuration scripts.  A manual page for `ppl-config'
+   has also been added.
+
+o  New Autoconf function
+
+     AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+
+   allows to test the existence and usability of particular versions of the
+   PPL, defining macros containing the required paths.  The simple addition
+   of, e.g.,
+
+     AM_PATH_PPL(0.8)
+
+   to an application's configure.ac file is all that is needed in most
+   cases.  Paths to the installed version of the PPL will be detected,
+   the version number will be checked to be at least the one
+   indicated, the variables PPL_CPPFLAGS and PPL_LDFLAGS will be set
+   accordingly and a quick sanity check of the PPL installation will
+   be performed.  For more complex tasks, the AM_PATH_PPL function
+   defines the `--with-ppl-prefix' and `--with-ppl-exec-prefix'
+   configure options (useful when the PPL is installed into a
+   non-standard place or when multiple versions of the PPL are
+   installed).  AM_PATH_PPL also defines the `--disable-ppltest'
+   configure option to disable the quick sanity check.  When something
+   fails, AM_PATH_PPL provides accurate indications about what went
+   wrong and how to fix it.  See the sources in m4/ppl.m4 for more
+   information.
+
+o  The browse and print versions of the PS and PDF formats of the user
+   manual have been merged into single documents: ppl-user-0.8.pdf and
+   ppl-user-0.8.ps.gz.  The equivalent developer reference documents
+   have also been merged.
+
+o  One of the possible values for the configuration option
+   `--enable-coefficients' has been renamed from `gmp' to `mpz'.
+
+o  New configuration option `--enable-interfaces' allows some or all of
+   the Prolog and C interfaces to be selectively enabled.
+
+o  Portability has been further improved.
+
+o  Added to C_Polyhedron (resp., NNC_Polyhedron) new method
+
+     bool poly_hull_assign_if_exact(const C_Polyhedron&)
+
+   (resp. bool poly_hull_assign_if_exact(const NNC_Polyhedron&))
+   and its synonym
+
+     bool upper_bound_assign_if_exact(const C_Polyhedron&)
+
+   (resp. bool upper_bound_assign_if_exact(const NNC_Polyhedron&)).
+
+o  Added new typedef `element_type' to template Polyhedra_Powerset,
+   which corresponds to the type of the underlying numeric domain.
+
+o  Output operators have been added for Generator::Type and
+   Constraint::Type.
+
+o  Class Bounding_Box has new method
+
+     Constraint_System Bounding_Box::constraints() const,
+
+   which returns the system of constraints.
+
+o  Class Bounding_Box has new widening methods
+
+     Bounding_Box::CC76_widening_assign(const Bounding_Box& y)
+
+   and
+
+     template <typename Iterator>
+     Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+                                        Iterator first,
+                                        Iterator last).
+
+o  All methods in class Determinate that are specific to the Polyhedra
+   template parameter have been dropped.  If needed, they can still be
+   invoked through element().
+
+o  Method
+
+     bool Constraint_System::has_strict_inequalities() const
+
+   is now publicly accessible.
+
+o  Added Polyhedron methods difference_assign() and join_assign(),
+   behaving as poly_difference_assign() and poly_hull_assign(),
+   so as to have more uniform interfaces.
+
+o  The helper function widen_fun_ref() building a limited widening
+   function is now templatic even on the second argument (i.e., the
+   limiting constraint system). The template widening method
+
+     Polyhedra_Powerset<PH>::BHZ03_widening_assign()
+
+   no longer has a default value for the certificate parameter.
+
+o  The signatures of Polyhedron methods maximize() and minimize()
+   have been greatly simplified.
+
+o  The function template
+
+     template <typename PH>
+     bool check_containment(const PH&, const Polyhedra_Powerset<PH>&)
+
+   now works whenever there exists a lossless conversion mapping an
+   object of type PH into an NNC_Polyhedron (e.g., when PH = BD_Shape).
+   The same holds for methods
+
+     bool Polyhedra_Powerset<PH>::geometrically_covers()
+
+   and
+
+     bool Polyhedra_Powerset<PH>::geometrically_equals().
+
+o  Disjuncts can be added to an instance of Polyhedra_Powerset with
+   the new method
+
+     void add_disjunct(const PH& ph).
+
+o  The two generalized_affine_image() methods of class Polyhedron
+   are now matched by corresponding methods for computing preimages
+   of affine relations.
+
+o  Added to class Polyhedron the method
+
+     void bounded_affine_image(Variable v,
+                               const Linear_Expression& lb,
+                               const Linear_Expression& ub,
+                               Coefficient_traits::const_reference d
+                                 = Coefficient_one())
+
+   computing the image of the polyhedron according to the
+   transfer relation lb/d <= v' <= ub/d.
+   Also added the corresponding method for computing preimages.
+
+o  The enumeration
+
+     Polyhedron::Degenerate_Kind
+
+   has been placed outside of class Polyhedron and renamed as
+
+     Degenerate_Element.
+
+o  New output operators in namespace IO_Operators:
+
+     std::ostream& operator<<(std::ostream&, const Constraint::Type&)
+
+   and
+
+     std::ostream& operator<<(std::ostream&, const Generator::Type&).
+
+o  Added to class Constraint the methods
+
+     bool is_tautological() const
+
+   and
+
+     bool is_inconsistent() const
+
+   returning true when the constraint is always or never satisfied,
+   respectively.
+
+o  Added to classes Constraint (resp., Generator) the method
+
+     bool is_equivalent_to(const Constraint& y) const
+
+   (resp., bool is_equivalent_to(const Generator& y) const)
+   which check for semantic equivalence of corresponding class
+   instances.  Also made available the (semantic) comparison operators
+   `==' and `!='.
+
+o  The swap() methods of classes Linear_Expression, Constraint, Generator,
+   Constraint_System and Generator_System are now publicly accessible.
+
+o  Added to classes Constraint and Generator the methods
+
+     void ascii_dump(std::ostream& s) const
+
+   and
+
+     void ascii_load(std::istream& s) const.
+
+o  In classes Poly_Con_Relation and Poly_Gen_Relation the methods
+
+     void ascii_dump(std::ostream& s) const
+
+   and
+
+     void ascii_load(std::istream& s) const
+
+   are now publicly accessible.
+
+o  All classes which provide the method
+
+     void ascii_dump(std::ostream& s) const
+
+   now also provide the methods
+
+     void ascii_dump() const
+
+   and
+
+     void print() const.
+
+   These methods print to std::cerr the textual and user-level
+   representation (resp.) of the given object.  This enables the
+   output of such object representations in GDB.
+
+o  New functions added to the C interface:
+
+     int ppl_Coefficient_is_bounded(void),
+     int ppl_Coefficient_min(mpz_t min),
+     int ppl_Coefficient_max(mpz_t max)
+
+   allow C applications to obtain information about the Coefficient
+   integer numerical type.
+
+   The new Prolog interface predicates ppl_Coefficient_is_bounded/0,
+   ppl_Coefficient_max/1 and ppl_Coefficient_min/1 provide the same
+   functionality.
+
+o  All predicates in the Prolog interface that require an input list
+   as an argument will now throw an exception if that argument is not
+   a list.  Before, some predicates, such as
+   ppl_Polyhedron_remove_space_dimensions/2, would fail.
+
+o  In the Prolog interface, the names and arities of the "with_token"
+   widening and extrapolation predicates have been revised to
+   "with_tokens" with an extra argument and the functionality has been
+   revised to match more closely the corresponding C++ interface
+   operators.
+
+o  In the Prolog interface, the names and arities of the predicates
+   that create handles for new polyhedra have been revised to match
+   more closely the corresponding C and C++ interface operators.  That
+   is, instead of having "c" and/or "nnc" as arguments to indicate the
+   topology of the polyhedron, the topologies are now part of the
+   names of the predicates.
+
+o  The SWI-Prolog interface allows now the exchange of unbounded numbers
+   between the PPL and Prolog applications.  This requires SWI-Prolog
+   version 5.6.0 or later version.  Previous versions of SWI-Prolog
+   are no longer supported.
+
+o  The YAP interface allows now the exchange of unbounded numbers
+   between the PPL and Prolog applications.  This requires YAP
+   version 5.1.0 or later version.  Previous versions of YAP
+   are no longer supported.
+
+o  The `ppl_lpsol' demo has now two more options: with `--enumerate' it
+   solves the given linear programming problem by vertex/point
+   enumeration; with `--simplex' (the default) it uses our simplex
+   implementation with exact arithmetic.  The `ppl_lpsol' program,
+   which is only built if a suitable version of GLPK is available, is
+   installed into the directory (selectable at configuration time) for
+   user executables.
+
+o  Manual pages have been added for the ppl_lpsol and ppl_lcdd
+   programs.
+
+o  The new class BD_Shape<T> as well as the "checked" native
+   coefficients selectable with the `--enable-coefficients' configure
+   options, are based on a very general and powerful notion of "number
+   family with a policy".  This is made available to the users of the
+   PPL via the wrapper template class Checked_Number<T, P>, where T is
+   the underlying numeric type (native integer or float of any width,
+   unbounded integer or rational) and `P' is a policy specifying
+   things such as whether to check for overflows and other
+   "exceptional" conditions and what to do in such cases.  The policy
+   also specifies whether T should be extended with representations
+   for infinities or NAN (Not A Number) and default rounding modes.
+   A complete set of arithmetic functions and operators are provided:
+   they either use the default rounding mode or accept a rounding mode
+   as an extra parameter and, depending on the policy, may return a result
+   that indicates the relation that exists between the true mathematical
+   result and the (possibly approximate) computed result. Input/output
+   functions with the same properties (controlled rounding and indications
+   of the approximations) are also provided.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in Polyhedra_Powerset<PH>::concatenate_assign() whereby
+   a temporary Polyhedra_Powerset object was created with the wrong
+   dimension.
+
+o  Corrected a memory leak bug in the demo ppl_lpsol.
+
+o  Corrected a bug in method
+
+     NNC_Polyhedron::minimized_constraints()
+
+   whereby an internal assertion might have been violated.
+
+o  Fixed a bug whereby calling the methods
+
+     Polyhedron::generalized_affine_image()
+
+   on an empty polyhedron could have resulted in an exception thrown.
+
+o  Fixed a bug whereby the occurrence of an `out of memory' error during
+   the allocation of a row of integer coefficients could have resulted
+   in a memory leak.
+
+o  Fixed a bug affecting the specialized constructors
+
+     Polyhedra_Powerset<NNC_Polyhedron>::
+     Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+
+   and
+
+     Polyhedra_Powerset<C_Polyhedron>::
+     Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+
+   whereby the newly built Polyhedra_Powerset object could have been
+   flagged as non-redundant even though it was containing redundant
+   disjuncts. Fixed a similar bug in generic constructor
+
+     Polyhedra_Powerset(const Constraint_System& cs)
+
+   that manifests when `cs' is denoting an empty polyhedron.
+
+--------------------------------------------------------------------------
+NEWS for version 0.7  (released on December 24, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  The new configuration option `--enable-coefficients' allows for the
+   use of alternative (integral) coefficient types.  Besides GMP
+   integers, the user can now use checked native integers (8, 16, 32
+   or 64 bits wide).  The use of such native coefficients is
+   completely safe, since systematic (yet efficient) overflow
+   detection is performed and, in case of overflow, an exception is
+   raised.  GMP coefficients are used by default.
+
+o  Significant efficiency improvements have been achieved everywhere.
+
+o  We now require GMP 4.1.3 or higher.
+
+o  The following classes have been renamed as indicated:
+
+     AskTell            -> Ask_Tell
+     BoundingBox        -> Bounding_Box
+     ConSys             -> Constraint_System
+     GenSys             -> Generator_System
+     Integer            -> Coefficient
+     LinExpression      -> Linear_Expression
+     Polyhedra_PowerSet -> Polyhedra_Powerset
+     PowerSet           -> Powerset
+     SatMatrix          -> Saturation_Matrix
+     SatRow             -> Saturation_Row
+
+o  The helper function `widen_fun' has been renamed `widen_fun_ref'.
+
+o  New assignment operators allowing to obtain an NNC_Polyhedron from a
+   C_Polyhedron and the other way around.  In the latter case, the
+   topological closure of the argument polyhedron is computed.
+
+o  New explicit constructors and assignment operators allowing to obtain a
+   Polyhedra_Powerset<NNC_Polyhedron> from a Polyhedra_Powerset<C_Polyhedron>
+   and the other way around.  In the latter case, the topological closure
+   of the element polyhedra is computed.
+
+o  New explicit constructor Powerset<CS>::Powerset(const CS& d):  if `d'
+   is not bottom, builds a powerset containing only `d';  builds the empty
+   powerset otherwise.
+
+o  New explicit constructor
+   Polyhedra_Powerset<CS>::Polyhedra_Powerset(const PH& ph):  if `ph' is
+   not empty, builds a powerset containing only `ph';  builds the empty
+   powerset otherwise.
+
+o  New method
+
+     Polyhedra_Powerset::poly_difference_assign(const Polyhedra_Powerset& y)
+
+   assigns to `*this' the poly-difference of `*this' and `y'.
+
+o  All the public classes of the library have been endowed with methods
+
+     memory_size_type total_memory_in_bytes() const
+
+   and
+
+     memory_size_type external_memory_in_bytes() const
+
+   returning (lower bounds for) the total size in bytes of the memory
+   occupied by *this and of the memory managed by *this, respectively.
+   The type `memory_size_type' is a newly added unsigned integral type
+   suitable to the representation of such information.
+
+o  New method dimension_type Polyhedron::affine_dimension() returns
+   the affine dimension of *this (not to be confused with the dimension
+   of its enclosing vector space) or 0, if *this is empty.
+
+o  All the methods changing (i.e., adding, removing, mapping, etc.)
+   the dimensions of the vector space have been renamed so as to avoid
+   any possible ambiguity with the affine dimension of the modified object.
+   For instance,
+
+     Polyhedron::add_dimensions_and_embed(dimension_type m);
+
+   has been renamed as
+
+     Polyhedron::add_space_dimensions_and_embed(dimension_type m);
+
+o  The constructor C_Polyhedron(const NNC_Polyhedron& y) no longer
+   throws an exception if `y' is not topologically closed.  Rather,
+   it constructs a C_Polyhedron representing the topological closure
+   of `y'.
+
+o  The following constructors have been made explicit:
+
+     Constraint_System::Constraint_System(const Constraint& c),
+     Generator_System::Generator_System(const Generator& g),
+     C_Polyhedron::C_Polyhedron(const Constraint_System& cs),
+     C_Polyhedron::C_Polyhedron(const Generator_System& cs),
+     C_Polyhedron::C_Polyhedron(Constraint_System& cs),
+     C_Polyhedron::C_Polyhedron(Generator_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(const Generator_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs),
+     NNC_Polyhedron::NNC_Polyhedron(Generator_System& cs).
+     Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs).
+
+o  Functions in the C interface that compute (space) dimensions
+   no longer return their result.  The caller is now required to pass,
+   as an extra argument, a pointer to a memory area where the result
+   will be written.  All the C interface functions now use the return
+   value to signal the success or failure of the requested operation.
+
+o  Now `make check' runs a number of tests with `ppl_lcdd', comparing
+   the results to expected ones.
+
+o  The `ppl_lcdd' demo is now able to parse problems produced by lrs,
+   i.e., where the number of rows of the matrix is omitted and replaced
+   by "*****" (five asterisks).
+
+o  The enumeration values of enum Complexity_Class have been renamed
+   POLYNOMIAL_COMPLEXITY, SIMPLEX_COMPLEXITY and ANY_COMPLEXITY.
+
+o  In the Prolog interface, the predicates
+   ppl_new_polyhedron_from_dimension/3 and
+   ppl_new_polyhedron_empty_from_dimension/3 have been replaced by a
+   single predicate ppl_new_polyhedron_from_space_dimension/4 where
+   the (extra) third argument indicates whether the polyhedron to be
+   created should be the universe or the empty polyhedron.
+
+o  As the unary plus operator is not in standard Prolog, '+'/1 in linear
+   expressions is no longer supported by the Prolog interface.
+
+
+Bugfixes
+========
+
+o  Fixed a bug that was causing an unwanted exception to be thrown
+   when adding to a C_Polyhedron some generators obtained from an
+   NNC_Polyhedron (even though no closure point was being added).
+
+o  Fixed a bug in the handling of empty generator systems having
+   a strictly positive space dimension.
+
+o  Fixed a bug that was affecting Polyhedra_PowerSet::geometrically_covers()
+   and Polyhedra_PowerSet::geometrically_equals().
+
+o  Method C_Polyhedron::H79_widening_assign() now widens the polyhedron
+   itself instead of the homogenized polyhedral cone representing it.
+
+o  Fixed a bug that was affecting Polyhedron::H79_widening_assign()
+   as well as all the limited and bounded extrapolation operators.
+
+o  Fixed a bug in Polyhedron::map_space_dimensions() that could manifest
+   itself when used with a partial function encoding permutation.
+
+o  Fixed a bug in the C interface function
+   ppl_new_Linear_Expression_with_dimension().
+
+o  Fixed a bug in the `ppl_lpsol' demo.
+
+o  Fixed a bug in Polyhedron::is_universe() that could manifest itself
+   when the polyhedron is described by a generator system that is
+   not in minimal form.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.6.1  (released on August 20, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Some packaging issues have been fixed.
+
+o  The documentation has been completed and improved.
+
+o  The methods
+
+     Polyhedra_PowerSet::semantically_contains(const Polyhedra_PowerSet&) and
+     Polyhedra_PowerSet::semantically_equals(const Polyhedra_PowerSet&)
+
+   have been renamed
+
+     Polyhedra_PowerSet::geometrically_covers(const Polyhedra_PowerSet&) and
+     Polyhedra_PowerSet::geometrically_equals(const Polyhedra_PowerSet& y),
+
+   respectively.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.6  (released on August 18, 2004)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  New template classes Determinate, PowerSet, and Polyhedra_PowerSet.
+   The first two classes realize, in a completely generic way, the
+   determinate and powerset constructions described by Roberto Bagnara
+   in his 1998, Science of Computer Programming paper.  The third class
+   is a specialization of the powerset construction on polyhedra.
+   The powerset construction comes with the generic widening technique
+   proposed by Roberto Bagnara, Patricia Hill and Enea Zaffanella
+   in their VMCAI 2004 paper.  Actually, the Polyhedra_PowerSet class
+   provides the first genuine, non-trivial widening ever proposed
+   (let alone made available) on a domain of sets of convex polyhedra.
+
+o  New methods
+
+     void Polyhedron::expand_dimension(Variable, dimension_type) and
+     void Polyhedron::fold_dimensions(const Variables_Set&, Variable)
+
+   allow the easy realization of summary dimensions as proposed
+   by Denis Gopan and colleagues in their TACAS 2004 paper.
+
+o  A new `demos' directory has been added.  In the `ppl_lcdd'
+   subdirectory, this contains a sort of clone of the cddlib test
+   program `lcdd', written using the PPL's C++ interface, together
+   with several example polyhedra in the formats that the program can
+   handle.  The `ppl_lpsol' subdirectory contains another demo program
+   that solves linear programming problems by vertex/point
+   enumeration.  This is written using the PPL's C interface and comes
+   with several example problems in the Mathematical Programming
+   System (MPS) format.  In order to read MPS files, `ppl_lpsol' uses
+   the GNU Linear Programming Kit (GLPK); thus `ppl_lpsol' is only compiled
+   if a suitable version of GLPK is available.
+
+o  New macro PPL_VERSION expands to the version string of the library.
+
+o  New file README.configure provides additional information about
+   the configuration and compilation of the library.
+
+o  The documentation has been improved in various ways.
+
+o  The documentation for users, in PostScript, PDF and HTML formats,
+   is now installed in a standard place by `make install'.
+
+o  The variable `abandon_exponential_computations' has been renamed
+   `abandon_expensive_computations'.
+
+o  The methods
+
+     void Polyhedron::add_constraints(ConSys& cs),
+     void Polyhedron::add_generators(GenSys& gs),
+     bool Polyhedron::add_constraints_and_minimize(ConSys& cs), and
+     bool Polyhedron::add_generators_and_minimize(GenSys& gs)
+
+   have been renamed
+
+     void Polyhedron::add_recycled_constraints(ConSys& cs),
+     void Polyhedron::add_recycled_generators(GenSys& gs),
+     bool Polyhedron::add_recycled_constraints_and_minimize(ConSys& cs), and
+     bool Polyhedron::add_recycled_generators_and_minimize(GenSys& gs),
+
+   respectively.  At the same time, the methods
+
+     void Polyhedron::add_constraints(const ConSys& cs),
+     void Polyhedron::add_generators(const GenSys& gs),
+     bool Polyhedron::add_constraints_and_minimize(const ConSys& cs), and
+     bool Polyhedron::add_generators_and_minimize(const GenSys& gs)
+
+   have been added.  Corresponding changes have been made to the C and
+   Prolog interfaces.
+
+o  New methods Polyhedron::maximize() and Polyhedron::minimize()
+   for maximizing and minimizing a linear expression subject to the
+   polyhedron.
+
+o  New output operator in namespace IO_Operators:
+   std::ostream& operator<<(std::ostream&, const LinExpression&).
+
+o  The method Polyhedron::map_dimensions(const PartialFunction& pfunc)
+   has been significantly optimized for the case when `pfunc' is a
+   permutation.  A simple "renaming" of the dimensions is now
+   extremely cheap.
+
+o  The function Parma_Polyhedra_Library::max_space_dimension() has been
+   given a new semantics and destiny: it returns the maximum space
+   dimension that _all_ the abstractions provided by the library can
+   handle.  Each individual abstraction provides its versions of this
+   function.  Thus, e.g., NNC_Polyhedron::max_space_dimension()
+   gives the maximum space dimensions an NNC_Polyhedron can handle.
+
+o  The type of output functions for the class Variable,
+   `Variable::Output_Function_Type', has been renamed
+   `Variable::output_function_type' and is now defined as
+   void output_function_type(std::ostream& s, const Variable& v).
+   In other words, `v' is now passed by const reference and not by value.
+
+o  Thanks to Bruno Haible, it is now possible to use versions of the
+   GMP library installed into nonstandard places.  The new configure
+   options `--with-libgmp-prefix[=DIR]' and `--with-libgmpxx-prefix[=DIR]'
+   substitute the old (and not really working) options
+   `--with-gmp-includes=DIR' and `--with-gmp-dir=DIR'.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in the C interface function ppl_Polyhedron_map_dimensions()
+   whereby a wrong result was computed.
+
+o  Fixed a bug in Polyhedron::poly_difference_assign(const Polyhedron&)
+   whereby a wrong result was computed.
+
+o  Fixed a bug in the Prolog interface predicate
+   ppl_Polyhedron_get_bounding_box/3 whereby a wrong result was
+   sometimes computed in the case of an empty polyhedron.
+
+o  Fixed a bug in the Prolog interface predicate
+   ppl_new_Polyhedron_from_bounding_box/3 whereby the predicate was
+   failing when given an empty bounding box.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.5  (released on April 28, 2003)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  New methods Polyhedron::BHRZ03_widening_assign() and
+   Polyhedron::BHRZ03_limited_extrapolation_assign().  The BHRZ03 widening
+   is a novel widening that is always more precise than the one, by now
+   standard, we call H79.
+
+o  The novel "widening with tokens" technique improves on the good old
+   widening delay technique by refraining from widening only when
+   necessary.  Precision is thus increased still guaranteeing
+   convergence.  All widening operators can now be supplied with an
+   optional argument, recording the number of available tokens, which
+   is decremented when tokens are used.
+
+o  Two new methods have been defined that compute the image of
+   a polyhedron under an affine relation. The first method,
+   Polyhedron::generalized_affine_image(var, relsym, expr, denom),
+   generalizes the classical Polyhedron::affine_image() method by allowing
+   `relsym' to denote any of the relations <, <=, =, >=, >.
+   The second method, Polyhedron::generalized_affine_image(lhs, relsym, rhs),
+   is a variant where an arbitrary linear expression `lhs' is allowed to
+   occur on the left-hand side of the affine relation.
+
+o  New constructors to build polyhedra from read-only constraint and
+   generator systems: C_Polyhedron(const ConSys&),
+   C_Polyhedron(const GenSys&), NNC_Polyhedron(const ConSys&), and
+   NNC_Polyhedron(const GenSys&).  In the C interface the functions
+   taking non-const arguments named ppl_new_<T>_from_<S> have been
+   renamed ppl_new_<T>_recycle_<S>, where <T> is either "C" or "NNC",
+   and <S> is either "ConSys" or "GenSys".  The old names have been
+   given to the new const functions.
+
+o  New function LinExpression& operator*=(LinExpression&, const Integer&)
+   to multiply (in place) an expression by a scalar.
+
+o  The methods Polyhedron::check_empty() and Polyhedron::check_universe()
+   have been renamed is_empty() and is_universe(), respectively.
+
+o  New method bool Polyhedron::is_disjoint_from(const Polyhedron& y)
+   returning true if and only `*this' and `y' are disjoint.
+
+o  New methods bool Polyhedron::add_constraint_and_minimize(const
+   Constraint&) and bool Polyhedron::add_generator_and_minimize(const
+   Generator&) to add a constraint or a generator and minimizing the
+   result at the same time.
+
+o  New method: template <typename PartialFunction>
+   void Polyhedron::map_dimensions(const PartialFunction&).
+   This allows to rename the dimensions of a polyhedron according
+   to a partial function mapping dimensions to dimensions.
+
+o  New function LinExpression operator+(const LinExpression&): previously
+   an expressions like `+x2-x3-x4 <= 0' could not constitute valid syntax
+   for a constraint.
+
+o  New type `dimension_type': an unsigned integral type for representing
+   space dimensions.
+
+o  New function dimension_type max_space_dimension():
+   returns the maximum space dimension this library can handle.
+
+o  New function dimension_type not_a_dimension():
+   returns a value that does not designate a valid dimension.
+
+o  The method Polyhedron::add_dimensions_and_constraints(ConSys&)
+   has gone.  A similar functionality is provided by the new method
+   Polyhedron::concatenate_assign(const Polyhedron&).  The same change
+   has, of course, been performed on all the PPL interfaces.
+
+o  New macros PPL_VERSION_MAJOR, PPL_VERSION_MINOR, PPL_VERSION_REVISION,
+   and PPL_VERSION_BETA allow the client application to adapt to different
+   versions of the library.
+
+o  New function const char* version() returns a character string
+   containing the PPL version.
+
+o  New function const char* banner() returns a character string
+   containing information about the PPL version, the licensing,
+   the lack of any warranty whatsoever, the C++ compiler used
+   to build the library, where to report bugs and where to look
+   for further information.
+
+o  The Prolog interface now supports also Ciao Prolog and XSB.
+
+o  The C and Prolog interfaces have been extended so as to make more of
+   the library's functionality available to Prolog and C users.
+
+o  Timeout computation facilities have been added to the Prolog interfaces:
+   new predicates ppl_set_timeout_exception_atom/1,
+   ppl_timeout_exception_atom/1, ppl_set_timeout/1, ppl_reset_timeout/0.
+
+o  Many efficiency improvements have been achieved.  Part of these have
+   been obtained by increasing the degree of "laziness" of the library.
+
+o  Many portability and standard-conformance improvements: the library
+   can now be compiled with GNU g++, Intel C++ Compiler 7.0 for Linux,
+   and Comeau C/C++ 4.3.0.1 Compiler Front-End; the library has also
+   been tested on a variety of platforms.
+
+o  The functions
+
+     Polyhedron::operator<=(const Polyhedron&, const Polyhedron&),
+     Polyhedron::operator>=(const Polyhedron&, const Polyhedron&),
+     Polyhedron::operator<(const Polyhedron&, const Polyhedron&), and
+     Polyhedron::operator>(const Polyhedron&, const Polyhedron&)
+
+   have been removed.  The methods
+
+     Polyhedron::contains(const Polyhedron&) and
+     Polyhedron::strictly_contains(const Polyhedron&)
+
+   provide the same functionality.
+
+o  The method Polyhedron::limited_H79_widening_assign() has been renamed
+   Polyhedron::limited_H79_extrapolation_assign().  From now on, the name
+   `widening' is reserved for operators that come with a convergence
+   guarantee (i.e., with the ability of turning infinite chains to finite
+   ones).  Upper bound operators without such a guarantee contain the word
+   `extrapolation' in their name.
+
+o  The renamed method Polyhedron::limited_H79_extrapolation_assign()
+   takes the constraint system argument by const reference (in the
+   old Polyhedron::limited_H79_widening_assign() that argument was
+   passed by non-const reference).
+
+o  We now require GMP 4.1.2 or higher.
+
+o  In conformance with the C++ standard [17.4.3.1.2], in all the
+   identifiers exported by the C interface, any occurrence
+   of "__" (double underscore) has been replaced by "_" (underscore).
+
+o  Added a parameter to Polyhedron::shrink_bounding_box(): this specifies
+   the complexity class of the algorithm to be used.
+
+o  All the input/output operators have been confined into namespace
+   Parma_Polyhedra_Library::IO_Operators.  This way they do not conflict
+   with the operators the user might want to define.
+
+o  The operator Constraint operator>>(const Constraint&, unsigned int)
+   has been removed.
+
+o  The method
+   Polyhedron::poly_difference_assign_and_minimize(const Polyhedron&)
+   has been removed.
+
+
+Bugfixes
+========
+
+o  Fixed a bug in operator-=(LinExpression&, const LinExpression&)
+   whereby we computed a wrong result in some circumstances.
+
+o  Fixed a bug in method Polyhedron::minimized_constraints() that,
+   under some circumstances, could cause a wrong result or a program
+   crash.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4.2 (released on October 4, 2002)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed a bug in method Polyhedron::add_generator(const Generator&)
+   whereby we were not adding the corresponding closure point when adding
+   a point to an empty NNC polyhedron.
+
+o  Fixed a bug in method GenSys::insert(const Generator&) whereby the
+   insertion of a generator into an empty generator system might be
+   mishandled.
+
+o  Fixed a bug in method Polyhedron::operator<=(const Polyhedron&)
+   whereby the lines of the polyhedron were handled improperly.
+
+o  Fixed a bug in a private method used to implement public method
+   Polyhedron::relation_with(const Generator& g),
+   whereby a wrong result was obtained when `g' was a line.
+
+o  Fixed a bug in methods Polyhedron::affine_image() and
+   Polyhedron::affine_preimage(), whereby a wrong result could be
+   obtained when using a negative denominator for the affine expression.
+
+o  Fixed a bug in methods Polyhedron::minimized_constraints() and
+   Polyhedron::minimized_generators(), whereby a library invariant
+   was violated when calling these methods on a zero-dimensional space
+   universe NNC polyhedron.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4.1 (released on July 30, 2002)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o  Fixed a bug in Polyhedron::poly_difference_assign(const Polyhedron& y)
+   whereby the equality constraints of `y' were ignored (the bug was
+   affecting both C and NNC computations).
+
+o  Fixed a bug in Polyhedron::operator=(const Polyhedron& y).  This bug,
+   which is triggered in some cases when `y' is empty, should only affect
+   versions of the library obtained with the `--enable-assertions'
+   configuration flag.
+
+o  Fixed a bug in Polyhedron::check_universe(), which was returning
+   the wrong result when called on a zero-dim universe polyhedron.
+
+o  Fixed a bug in NNC_Polyhedron::NNC_Polyhedron(ConSys& cs) whereby
+   an invariant was violated in case `cs' was empty.  This bug
+   should only affect versions of the library obtained with the
+   `--enable-assertions' configuration flag.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4 (released on July 1, 2002)
+--------------------------------------------------------------------------
+
+New and Changed Features
+========================
+
+o  Added full support for Not Necessarily Closed (NNC) polyhedra:
+   - creation of strict inequality constraints and mixed constraint
+     systems;
+   - creation of closure points and extended generator systems;
+   - added classes C_Polyhedron (for the representation of Closed
+     polyhedra) and NNC_Polyhedron (the user no longer can create
+     Polyhedron objects);
+   - added topology compatibility checks to avoid mixing objects of
+     the two kinds;
+   - added explicit constructors to create a polyhedron of a given
+     topology kind starting from a polyhedron of the other kind;
+   - added methods Polyhedron::is_topologically_closed() and
+     Polyhedron::topological_closure_assign();
+   - implemented methods Polyhedron::minimized_constraints() and
+     Polyhedron::minimized_generators() to obtain minimal
+     descriptions, both for closed and for NNC polyhedra.
+
+o  New method Polyhedron::time_elapse_assign(const Polyhedron&):
+   it computes the time-elapse operation defined in
+
+     N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+     Verification of real-time systems using linear relation analysis.
+     Formal Methods in System Design, 11(2):157-185, 1997.
+
+o  New method Polyhedron::is_bounded(): it returns true if and only
+   if the polyhedron is bounded, i.e., finite.
+
+o  New methods Polyhedron::bounds_from_above(const LinExpression& e)
+   and Polyhedron::bounds_from_below(const LinExpression& e): they
+   return true if and only if the linear expression `e' is bounded
+   from above/below in the polyhedron.
+
+o  New, complete C interface.  As a demo, a toy solver for pure linear
+   programming problems has been implemented using this interface.
+   Notice that solving linear programming problems is completely
+   outside the scope of the library.  As a consequence the toy provided
+   as a demo is only a toy provided as a demo.
+
+o  Revised and completed Prolog interface:
+   - now supporting GNU Prolog, SICStus Prolog, SWI-Prolog and YAP.
+   - all predicates have been renamed to match their intended
+     semantics;
+   - arguments have been reordered where necessary so as to follow the
+     rule "input arguments before output arguments";
+   - predicates added so that all the public methods for Polyhedra in
+     the C++ library are available as Prolog predicates;
+   - the interface has been extended to allow for closed and not
+     necessarily closed polyhedra.
+
+o  Added support for timeout-guarded operations.  It is now possible
+   for client applications to safely interrupt any exponential
+   computation paths in the library and get control back in a time
+   that is a linear function of the space dimension of the object
+   (polyhedron, system of constraints or generators) of highest
+   dimension on which the library is operating upon.
+
+o  The methods named convex_hull_* and convex_difference_*
+   have been renamed poly_hull_* and poly_difference_*.
+
+o  All methods named *_and_minimize() now return a Boolean
+   flag that is false if the result is empty.
+
+o  All method and variable names containing the word "vertex"
+   have been replaced by names containing the word "point"
+   (some previous uses of the word "vertex" were not formally correct).
+
+o  The methods Polyhedron::includes(const Generator&) and
+   Polyhedron::satisfies(const Constraint&) have been removed,
+   as well as the enumeration GenSys_Con_Rel.
+   They have been replaced by the new methods
+   Polyhedron::relation_with(const Generator&) and
+   Polyhedron::relation_with(const Constraint&),
+   which return values of the new enumeration types
+   Relation_Poly_Gen and Relation_Poly_Con, respectively.
+
+o  The method Constraint::coefficient(void) has been renamed
+   to Constraint::inhomogeneous_term(void).
+
+o  The methods Polyhedron::widening_assign() and
+   Polyhedron::limited_widening_assign() have been renamed
+   Polyhedron::H79_widening_assign() and
+   Polyhedron::limited_H79_widening_assign(), respectively.
+   This emphasizes the fact that they implement extensions
+   of the widenings introduced in
+
+     N. Halbwachs.
+     Determination Automatique de Relations Lineaires
+     Verifiees par les Variables d'un Programme.
+     These de 3eme cicle d'informatique,
+     Universite scientifique et medicale de Grenoble,
+     Grenoble, France, March 1979.
+
+   and described in
+
+     N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+     Verification of real-time systems using linear relation analysis.
+     Formal Methods in System Design, 11(2):157-185, 1997.
+
+o  The library no longer calls abort(): appropriate exceptions
+   are always thrown instead.
+
+
+Bugfixes
+========
+
+o  Fixed a bug whereby creating a point with a negative denominator
+   caused the library to misbehave.
+
+o  Fixed a bug in Polyhedron::add_constraints(ConSys&) whereby
+   we could have created constraint systems having rows with
+   different capacities.
+
+o  Several other bugs have been fixed.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.3 (released on February 26, 2002)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  The library has been ported under Libtool: it is now possible
+   to build dynamic libraries as well.
+
+o  We now use the integer C++ class of GMP to represent the
+   coefficients of constraints and generators, instead of our own
+   (very much inferior) Integer class.  The drawback is that we
+   now require GMP 4.0.1 or higher.
+
+o  New methods Polyhedron::convex_difference_assign(const Polyhedron&) and
+   Polyhedron::convex_difference_assign_and_minimize(const Polyhedron&).
+   They assign to `*this' the convex hull of the set-theoretic difference
+   of `*this' and the argument (possibly non minimized or minimized,
+   respectively).
+
+o  The method Polyhedron::add_generators(GenSys&) is now lazy,
+   i.e., no minimization is performed.  Adding generators and
+   minimizing at the same time is provided by the method
+   Polyhedron::add_generators_and_minimize(GenSys&).
+   These methods now throw an exception if the resulting
+   polyhedron would be illegal.
+
+o  Some performance improvements.
+
+o  Added more test programs.
+
+
+Bugfixes
+========
+
+o  Fixed Polyhedron::satisfies(const Constraint&) and
+   Polyhedron::affine_image().
+
+o  Polyhedron::limited_widening_assign(const Polyhedron&, ConSys&)
+   was erroneously returning a (random) Boolean: it is now a void
+   method.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.2 (released on November 14, 2001)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  Massive API changes.  This would not normally be called "a feature",
+   but the old API was very wrong in a number of ways.  More API changes
+   are to be expected for the next few releases.
+
+o  All user-accessible library methods are now guarded by suitable
+   sanity checks.  Exception are thrown whenever the library is not
+   called in the intended way.
+
+o  A SICStus Prolog interface is now available.  It comes with a somewhat
+   interesting demo: a toy CLP(Q) interpreter.
+
+o  Greatly improved documentation.
+
+
+Bugfixes
+========
+
+o  Many, many more than we would like to admit.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.1 (released on October 24, 2001)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o  The library has been released under the GNU General Public License.
diff --git a/README b/README
new file mode 100644
index 0000000..afc4f17
--- /dev/null
+++ b/README
@@ -0,0 +1,1768 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Parma Polyhedra Library (Release 1.0)
+=====================================
+
+This is the release 1.0 of the Parma Polyhedra Library:
+a C++ library for (not necessarily closed) convex polyhedra
+and other numerical abstractions.
+
+To be more precise, the Parma Polyhedra Library (PPL) can handle:
+
+  + all the convex polyhedra that can be defined as the intersection
+    of a finite number of (open or closed) hyperspaces, each described
+    by an equality or a (strict or non-strict) inequality with rational
+    coefficients;
+
+  + some special classes of polyhedra shapes that offer interesting
+    complexity/precision tradeoffs: boxes, bounded difference shapes
+    and octagonal shapes defined over a wide choice of integer,
+    rational or floating point coefficients;
+
+  + all grids (or, equivalently, lattices): a grid is defined by a set
+    of congruence relations with rational coefficients and consists of
+    the set of all points that satisfy these relations;
+
+  + finite powersets and products of the above;
+
+  + linear programming problems, solved with an implementation of the
+    primal simplex algorithm using exact arithmetic;
+
+  + parametric integer programming problems;
+
+  + termination analysis problems, via the automatic synthesis of
+    linear ranking functions.
+
+The Parma Polyhedra Library is:
+
+  + user friendly:
+      you write `x + 2*y + 5*z <= 7' when you mean it;
+
+  + fully dynamic:
+      available virtual memory is the only limitation to the dimension
+      of anything;
+
+  + written in standard C++:
+      meant to be portable;
+
+  + exception-safe:
+      never leaks resources or leaves invalid object fragments around;
+
+  + rather efficient:
+      and we hope to make it even more so;
+
+  + thoroughly documented:
+      perhaps not ``literate programming'' but close enough;
+
+  + free software:
+      distributed under the terms of the GNU General Public License.
+
+See the file COPYING for licensing information.
+See the file INSTALL for generic build and installation instructions.
+See the file README.configure for more specific configuration instructions.
+See the file NEWS for recent project news.
+See the file BUGS for known bugs and how to report new ones.
+See the file CREDITS for a list of people, projects and organizations
+that made the PPL a reality.
+See http://bugseng.com/products/ppl/ for more information on the PPL.
+For any additional questions you might have, please do not hesitate to
+write to ppl-devel at cs.unipr.it.
+
+Here is the contents of the PPL 1.0 source distribution
+(41 directories, 1616 files):
+
+ppl-1.0
+|-- BUGS
+|-- COPYING
+|-- CREDITS
+|-- ChangeLog
+|-- ChangeLog_2001-2008
+|-- INSTALL
+|-- Makefile.am
+|-- Makefile.in
+|-- NEWS
+|-- README
+|-- README.alpha
+|-- README.arm
+|-- README.configure
+|-- README.solaris
+|-- STANDARDS
+|-- TODO
+|-- aclocal.m4
+|-- compile
+|-- config.guess
+|-- config.h.in
+|-- config.rpath
+|-- config.sub
+|-- configure
+|-- configure.ac
+|-- demos
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- ppl_lcdd
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- examples
+|   |   |   |-- 1d.ine
+|   |   |   |-- 1da.ine
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README
+|   |   |   |-- allzero.ine
+|   |   |   |-- ccc4.ext
+|   |   |   |-- ccc5.ext
+|   |   |   |-- ccc6.ext
+|   |   |   |-- ccp4.ext
+|   |   |   |-- ccp5.ext
+|   |   |   |-- ccp6.ext
+|   |   |   |-- cp4.ext
+|   |   |   |-- cp4.ine
+|   |   |   |-- cp5.ext
+|   |   |   |-- cp5.ine
+|   |   |   |-- cp6.ext
+|   |   |   |-- cp6.ine
+|   |   |   |-- cp7.ext
+|   |   |   |-- cross10.ine
+|   |   |   |-- cross12.ine
+|   |   |   |-- cross4.ine
+|   |   |   |-- cross6.ine
+|   |   |   |-- cross8.ine
+|   |   |   |-- cube.ext
+|   |   |   |-- cube.ine
+|   |   |   |-- cube10.ine
+|   |   |   |-- cube12.ine
+|   |   |   |-- cube3.ine
+|   |   |   |-- cube6.ine
+|   |   |   |-- cube8.ine
+|   |   |   |-- cubetop.ine
+|   |   |   |-- cubocta.ine
+|   |   |   |-- cut16_11.ext
+|   |   |   |-- cut32_16.ext
+|   |   |   |-- cyc.ine
+|   |   |   |-- cyclic10-4.ext
+|   |   |   |-- cyclic12-6.ext
+|   |   |   |-- cyclic14-8.ext
+|   |   |   |-- cyclic16-10.ext
+|   |   |   |-- cyclic17_8.ine
+|   |   |   |-- cyclic25_13.ext
+|   |   |   |-- dcube10.ext
+|   |   |   |-- dcube12.ext
+|   |   |   |-- dcube3.ext
+|   |   |   |-- dcube6.ext
+|   |   |   |-- dcube8.ext
+|   |   |   |-- diamond.ine
+|   |   |   |-- dodeca_m.ine
+|   |   |   |-- ex1.ine
+|   |   |   |-- grcubocta.ine
+|   |   |   |-- hexocta.ine
+|   |   |   |-- icododeca_m.ine
+|   |   |   |-- in0.ine
+|   |   |   |-- in1.ine
+|   |   |   |-- in2.ine
+|   |   |   |-- in3.ine
+|   |   |   |-- in4.ine
+|   |   |   |-- in5.ine
+|   |   |   |-- in6.ine
+|   |   |   |-- in7.ine
+|   |   |   |-- infeas.ine
+|   |   |   |-- integralpoints.ine
+|   |   |   |-- irbox20-4.ext
+|   |   |   |-- irbox200-4.ext
+|   |   |   |-- kkd18_4.ine
+|   |   |   |-- kkd27_5.ine
+|   |   |   |-- kkd38_6.ine
+|   |   |   |-- kq20_11_m.ine
+|   |   |   |-- metric40_11.ine
+|   |   |   |-- metric80_16.ine
+|   |   |   |-- mit.ine
+|   |   |   |-- mit288-281.ine
+|   |   |   |-- mit31-20.ine
+|   |   |   |-- mit41-16.ine
+|   |   |   |-- mit708-9.ine
+|   |   |   |-- mit71-61.ine
+|   |   |   |-- mit90-86.ine
+|   |   |   |-- mp5.ext
+|   |   |   |-- mp5.ine
+|   |   |   |-- mp5a.ine
+|   |   |   |-- mp6.ine
+|   |   |   |-- nonfull.ine
+|   |   |   |-- origin.ine
+|   |   |   |-- prodst62.ext
+|   |   |   |-- project1_m.ine
+|   |   |   |-- project1res.ine
+|   |   |   |-- project2_m.ine
+|   |   |   |-- project2res.ine
+|   |   |   |-- rcubocta.ine
+|   |   |   |-- redcheck.ext
+|   |   |   |-- reg24-5.ext
+|   |   |   |-- reg24-5.ine
+|   |   |   |-- reg600-5_m.ext
+|   |   |   |-- rhomtria_m.ine
+|   |   |   |-- sample.ine
+|   |   |   |-- sampleh1.ine
+|   |   |   |-- sampleh2.ine
+|   |   |   |-- sampleh3.ine
+|   |   |   |-- sampleh4.ine
+|   |   |   |-- sampleh5.ine
+|   |   |   |-- sampleh6.ine
+|   |   |   |-- sampleh7.ine
+|   |   |   |-- sampleh8.ine
+|   |   |   |-- samplev1.ext
+|   |   |   |-- samplev2.ext
+|   |   |   |-- samplev3.ext
+|   |   |   |-- trunc10.ine
+|   |   |   |-- trunc7.ine
+|   |   |   |-- tsp5.ext
+|   |   |   `-- tsp5.ine
+|   |   |-- expected_int16
+|   |   |-- expected_int16_a
+|   |   |-- expected_int32
+|   |   |-- expected_int32_a
+|   |   |-- expected_int64
+|   |   |-- expected_int64_a
+|   |   |-- expected_int8
+|   |   |-- expected_int8_a
+|   |   |-- expected_mpz
+|   |   |-- expected_mpz_a
+|   |   |-- ppl_lcdd.1
+|   |   `-- ppl_lcdd.cc
+|   |-- ppl_lpsol
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- dummy.cc
+|   |   |-- examples
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README
+|   |   |   |-- adlittle.mps
+|   |   |   |-- afiro.mps
+|   |   |   |-- bgprtr.mps
+|   |   |   |-- blend.mps
+|   |   |   |-- boeing1.mps
+|   |   |   |-- boeing2.mps
+|   |   |   |-- egout.mps
+|   |   |   |-- ex1.mps
+|   |   |   |-- ex12.mps
+|   |   |   |-- kb2.mps
+|   |   |   |-- lseu.mps
+|   |   |   |-- markshare1.mps
+|   |   |   |-- markshare2.mps
+|   |   |   |-- mas74.mps
+|   |   |   |-- mas76.mps
+|   |   |   |-- mip.mps
+|   |   |   |-- modglob.mps
+|   |   |   |-- noswot.mps
+|   |   |   |-- opt1217.mps
+|   |   |   |-- p0033.mps
+|   |   |   |-- pk1.mps
+|   |   |   |-- rout.mps
+|   |   |   |-- sample.mps
+|   |   |   |-- sc105.mps
+|   |   |   |-- sc50a.mps
+|   |   |   |-- sc50b.mps
+|   |   |   |-- ship08l.mps
+|   |   |   `-- unboundedmin.mps
+|   |   |-- expected_int16
+|   |   |-- expected_int16_a
+|   |   |-- expected_int32
+|   |   |-- expected_int32_a
+|   |   |-- expected_int64
+|   |   |-- expected_int64_a
+|   |   |-- expected_int8
+|   |   |-- expected_int8_a
+|   |   |-- expected_mpz
+|   |   |-- expected_mpz_a
+|   |   |-- glpk_set_d_eps.c
+|   |   |-- ppl_lpsol.1
+|   |   `-- ppl_lpsol.c
+|   `-- ppl_pips
+|       |-- Makefile.am
+|       |-- Makefile.in
+|       |-- examples
+|       |   |-- Makefile.am
+|       |   |-- Makefile.in
+|       |   |-- README
+|       |   |-- big.pip
+|       |   |-- brisebarre.pip
+|       |   |-- cg1.pip
+|       |   |-- esced.pip
+|       |   |-- ex2.pip
+|       |   |-- fimmel.pip
+|       |   |-- invert.dat
+|       |   |-- linear.dat
+|       |   |-- lineri.dat
+|       |   |-- loz.dat
+|       |   |-- max.dat
+|       |   |-- max.pip
+|       |   |-- maxb.dat
+|       |   |-- pairi.dat
+|       |   |-- petit.dat
+|       |   |-- rairoi.dat
+|       |   |-- sor1d.pip
+|       |   |-- square.pip
+|       |   |-- test02.dat
+|       |   `-- test12i.dat
+|       |-- expected_int16
+|       |-- expected_int16_a
+|       |-- expected_int32
+|       |-- expected_int32_a
+|       |-- expected_int64
+|       |-- expected_int64_a
+|       |-- expected_int8
+|       |-- expected_int8_a
+|       |-- expected_mpz
+|       |-- expected_mpz_a
+|       |-- ppl_pips.1
+|       `-- ppl_pips.cc
+|-- depcomp
+|-- doc
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- README.doc
+|   |-- bugseng_logo.pdf
+|   |-- definitions.dox
+|   |-- devref-language-interface.doxyconf.in
+|   |-- devref-language-interface.tex
+|   |-- devref.doxyconf-html.in
+|   |-- devref.doxyconf-latex.in
+|   |-- devref.tex
+|   |-- fdl.dox
+|   |-- fdl.pdf
+|   |-- fdl.ps.gz
+|   |-- fdl.tex
+|   |-- fdl.txt
+|   |-- gpl.dox
+|   |-- gpl.pdf
+|   |-- gpl.ps.gz
+|   |-- gpl.tex
+|   |-- gpl.txt
+|   |-- interfaces-html.sed
+|   |-- interfaces-latex.sed
+|   |-- libppl.3
+|   |-- libppl_c.3
+|   |-- ppl-config.1
+|   |-- ppl-user-1.0-html.tar.gz
+|   |-- ppl-user-1.0.pdf
+|   |-- ppl-user-1.0.ps.gz
+|   |-- ppl-user-c-interface-1.0-html.tar.gz
+|   |-- ppl-user-c-interface-1.0.pdf
+|   |-- ppl-user-c-interface-1.0.ps.gz
+|   |-- ppl-user-ocaml-interface-1.0-html.tar.gz
+|   |-- ppl-user-ocaml-interface-1.0.pdf
+|   |-- ppl-user-ocaml-interface-1.0.ps.gz
+|   |-- ppl-user-prolog-interface-1.0-html.tar.gz
+|   |-- ppl-user-prolog-interface-1.0.pdf
+|   |-- ppl-user-prolog-interface-1.0.ps.gz
+|   |-- ppl.bib
+|   |-- ppl.sty
+|   |-- ppl_citations.bib
+|   |-- ppl_logo.pdf
+|   |-- ppl_logo_no_ppl.pdf
+|   |-- user-language-interface.doxyconf.in
+|   |-- user-language-interface.tex
+|   |-- user.doxyconf-html.in
+|   |-- user.doxyconf-latex.in
+|   `-- user.tex
+|-- install-sh
+|-- instchk.hh
+|-- interfaces
+|   |-- C
+|   |   |-- C_interface.dox
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- ppl_c.h.dist
+|   |   |-- ppl_c_header.h
+|   |   |-- ppl_c_implementation_common.cc
+|   |   |-- ppl_c_implementation_common_defs.hh
+|   |   |-- ppl_c_implementation_common_inlines.hh
+|   |   |-- ppl_c_version.h.in
+|   |   |-- ppl_interface_generator_c_cc_code.m4
+|   |   |-- ppl_interface_generator_c_cc_files.m4
+|   |   |-- ppl_interface_generator_c_h.m4
+|   |   |-- ppl_interface_generator_c_h_code.m4
+|   |   |-- ppl_interface_generator_c_hh_files.m4
+|   |   |-- ppl_interface_generator_c_procedure_generators.m4
+|   |   `-- tests
+|   |       |-- Makefile.am
+|   |       |-- Makefile.in
+|   |       |-- formatted_output.c
+|   |       |-- pip_test.c
+|   |       |-- ppl_c_test.cc
+|   |       |-- ppl_c_test.h
+|   |       |-- print_to_buffer.c
+|   |       |-- print_to_buffer.h
+|   |       |-- watchdog1.c
+|   |       `-- weightwatch1.c
+|   |-- Java
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- README.java
+|   |   |-- jni
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- ppl_interface_generator_java_classes_cc_code.m4
+|   |   |   |-- ppl_interface_generator_java_classes_cc_files.m4
+|   |   |   |-- ppl_java_common.cc
+|   |   |   |-- ppl_java_common_defs.hh
+|   |   |   |-- ppl_java_common_inlines.hh
+|   |   |   `-- ppl_java_globals.cc
+|   |   |-- parma_polyhedra_library
+|   |   |   |-- Artificial_Parameter.java
+|   |   |   |-- Artificial_Parameter_Sequence.java
+|   |   |   |-- Bounded_Integer_Type_Overflow.java
+|   |   |   |-- Bounded_Integer_Type_Representation.java
+|   |   |   |-- Bounded_Integer_Type_Width.java
+|   |   |   |-- By_Reference.java
+|   |   |   |-- Coefficient.java
+|   |   |   |-- Complexity_Class.java
+|   |   |   |-- Congruence.java
+|   |   |   |-- Congruence_System.java
+|   |   |   |-- Constraint.java
+|   |   |   |-- Constraint_System.java
+|   |   |   |-- Control_Parameter_Name.java
+|   |   |   |-- Control_Parameter_Value.java
+|   |   |   |-- Degenerate_Element.java
+|   |   |   |-- Domain_Error_Exception.java
+|   |   |   |-- Fake_Class_for_Doxygen.java
+|   |   |   |-- Generator.java
+|   |   |   |-- Generator_System.java
+|   |   |   |-- Generator_Type.java
+|   |   |   |-- Grid_Generator.java
+|   |   |   |-- Grid_Generator_System.java
+|   |   |   |-- Grid_Generator_Type.java
+|   |   |   |-- IO.java
+|   |   |   |-- Invalid_Argument_Exception.java
+|   |   |   |-- Length_Error_Exception.java
+|   |   |   |-- Linear_Expression.java
+|   |   |   |-- Linear_Expression_Coefficient.java
+|   |   |   |-- Linear_Expression_Difference.java
+|   |   |   |-- Linear_Expression_Sum.java
+|   |   |   |-- Linear_Expression_Times.java
+|   |   |   |-- Linear_Expression_Unary_Minus.java
+|   |   |   |-- Linear_Expression_Variable.java
+|   |   |   |-- Logic_Error_Exception.java
+|   |   |   |-- MIP_Problem.java
+|   |   |   |-- MIP_Problem_Status.java
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- Optimization_Mode.java
+|   |   |   |-- Overflow_Error_Exception.java
+|   |   |   |-- PIP_Decision_Node.java
+|   |   |   |-- PIP_Problem.java
+|   |   |   |-- PIP_Problem_Control_Parameter_Name.java
+|   |   |   |-- PIP_Problem_Control_Parameter_Value.java
+|   |   |   |-- PIP_Problem_Status.java
+|   |   |   |-- PIP_Solution_Node.java
+|   |   |   |-- PIP_Tree_Node.java
+|   |   |   |-- PPL_Object.java
+|   |   |   |-- Pair.java
+|   |   |   |-- Parma_Polyhedra_Library.java
+|   |   |   |-- Partial_Function.java
+|   |   |   |-- Poly_Con_Relation.java
+|   |   |   |-- Poly_Gen_Relation.java
+|   |   |   |-- Relation_Symbol.java
+|   |   |   |-- Timeout_Exception.java
+|   |   |   |-- Variable.java
+|   |   |   |-- Variables_Set.java
+|   |   |   |-- ppl_interface_generator_java_classes_java.m4
+|   |   |   `-- ppl_interface_generator_java_classes_java_code.m4
+|   |   |-- ppl_interface_generator_java_procedure_generators.m4
+|   |   `-- tests
+|   |       |-- C_Polyhedron_test1.java
+|   |       |-- MIP_Problem_test1.java
+|   |       |-- Makefile.am
+|   |       |-- Makefile.in
+|   |       |-- NNC_Polyhedron_test1.java
+|   |       |-- PIP_Problem_test1.java
+|   |       |-- PPL_Test.java
+|   |       |-- Parma_Polyhedra_Library_test1.java
+|   |       |-- Parma_Polyhedra_Library_test2.java
+|   |       |-- Test_Executor.java
+|   |       |-- ppl_interface_generator_java_test_java.m4
+|   |       |-- ppl_interface_generator_java_test_java_code.m4
+|   |       `-- ppl_java_tests_common
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- OCaml
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- OCaml_interface.dox
+|   |   |-- README.ocaml
+|   |   |-- ppl_interface_generator_ocaml_cc_code.m4
+|   |   |-- ppl_interface_generator_ocaml_cc_files.m4
+|   |   |-- ppl_interface_generator_ocaml_hh_code.m4
+|   |   |-- ppl_interface_generator_ocaml_hh_files.m4
+|   |   |-- ppl_interface_generator_ocaml_ml.m4
+|   |   |-- ppl_interface_generator_ocaml_ml_code.m4
+|   |   |-- ppl_interface_generator_ocaml_mli.m4
+|   |   |-- ppl_interface_generator_ocaml_mli_code.m4
+|   |   |-- ppl_interface_generator_ocaml_procedure_generators.m4
+|   |   |-- ppl_ocaml_common.cc
+|   |   |-- ppl_ocaml_common_defs.hh
+|   |   |-- ppl_ocaml_common_inlines.hh
+|   |   |-- ppl_ocaml_globals.ml
+|   |   |-- ppl_ocaml_globals.mli
+|   |   `-- tests
+|   |       |-- Makefile.am
+|   |       |-- Makefile.in
+|   |       |-- ppl_interface_generator_ocaml_test_ml.m4
+|   |       |-- ppl_interface_generator_ocaml_test_ml_code.m4
+|   |       |-- ppl_ocaml_tests_common
+|   |       `-- test1.ml
+|   |-- Prolog
+|   |   |-- Ciao
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README.ciao
+|   |   |   |-- ciao_cfli.hh
+|   |   |   |-- ciao_clpq.pl
+|   |   |   |-- ciao_clpq2.pl
+|   |   |   |-- ciao_efli.cc
+|   |   |   |-- ciao_efli.hh
+|   |   |   |-- ciao_pl_check.pl
+|   |   |   |-- ppl_interface_generator_ciao_pl.m4
+|   |   |   |-- ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+|   |   |   `-- ppl_prolog_sysdep.hh
+|   |   |-- GNU
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README.gprolog
+|   |   |   |-- gnu_pl_check.pl
+|   |   |   |-- gnu_prolog_generated_test.pl
+|   |   |   |-- gp_clpq.pl
+|   |   |   |-- gprolog_cfli.hh
+|   |   |   |-- gprolog_efli.cc
+|   |   |   |-- gprolog_efli.hh
+|   |   |   |-- ppl_interface_generator_gprolog_pl.m4
+|   |   |   `-- ppl_prolog_sysdep.hh
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- Prolog_configured_interface.dox
+|   |   |-- Prolog_interface.dox
+|   |   |-- Prolog_interface_compilation.dox
+|   |   |-- Prolog_interface_sysdep.dox
+|   |   |-- Prolog_interface_sysindep.dox
+|   |   |-- Prolog_interface_sysindep_domains.dox
+|   |   |-- SICStus
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- ppl_interface_generator_sicstus_sd_cc.m4
+|   |   |   |-- ppl_prolog_sysdep.hh
+|   |   |   |-- ppl_sicstus.pl
+|   |   |   |-- sicstus_cfli.cc
+|   |   |   |-- sicstus_cfli.h
+|   |   |   |-- sicstus_cfli.ic
+|   |   |   |-- sicstus_efli.cc
+|   |   |   |-- sicstus_efli.hh
+|   |   |   |-- sp_clpq.pl
+|   |   |   |-- sp_pl_check.pl
+|   |   |   `-- sp_prolog_generated_test.pl
+|   |   |-- SWI
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README.swiprolog
+|   |   |   |-- pl_clpq.cc
+|   |   |   |-- pl_clpq.pl
+|   |   |   |-- ppl_interface_generator_swiprolog_cc.m4
+|   |   |   |-- ppl_pl.cc
+|   |   |   |-- ppl_prolog_sysdep.hh
+|   |   |   |-- ppl_swiprolog.pl
+|   |   |   |-- swi_cfli.hh
+|   |   |   |-- swi_efli.cc
+|   |   |   |-- swi_efli.hh
+|   |   |   |-- swi_pl_check.pl
+|   |   |   `-- swi_prolog_generated_test.pl
+|   |   |-- XSB
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- ppl_interface_generator_xsb_H.m4
+|   |   |   |-- ppl_interface_generator_xsb_cc.m4
+|   |   |   |-- ppl_interface_generator_xsb_hh.m4
+|   |   |   |-- ppl_interface_generator_xsb_prolog_generated_test_P.m4
+|   |   |   |-- ppl_prolog_sysdep.hh
+|   |   |   |-- xsb_cfli.hh
+|   |   |   |-- xsb_clpq.P
+|   |   |   |-- xsb_clpq2.P
+|   |   |   |-- xsb_efli.cc
+|   |   |   |-- xsb_efli.hh
+|   |   |   `-- xsb_pl_check.P
+|   |   |-- YAP
+|   |   |   |-- Makefile.am
+|   |   |   |-- Makefile.in
+|   |   |   |-- README.yap
+|   |   |   |-- ppl_interface_generator_yap_cc.m4
+|   |   |   |-- ppl_prolog_sysdep.hh
+|   |   |   |-- ppl_yap.pl
+|   |   |   |-- yap_cfli.hh
+|   |   |   |-- yap_clpq.pl
+|   |   |   |-- yap_clpq2.pl
+|   |   |   |-- yap_efli.cc
+|   |   |   |-- yap_efli.hh
+|   |   |   |-- yap_pl_check.pl
+|   |   |   `-- yap_prolog_generated_test.pl
+|   |   |-- ppl_interface_generator_prolog_cc_code.m4
+|   |   |-- ppl_interface_generator_prolog_cc_files.m4
+|   |   |-- ppl_interface_generator_prolog_dox.m4
+|   |   |-- ppl_interface_generator_prolog_dox_code.m4
+|   |   |-- ppl_interface_generator_prolog_hh_code.m4
+|   |   |-- ppl_interface_generator_prolog_hh_files.m4
+|   |   |-- ppl_interface_generator_prolog_procedure_generators.m4
+|   |   |-- ppl_interface_generator_prolog_systems.m4
+|   |   |-- ppl_prolog_common.cc
+|   |   |-- ppl_prolog_common_defs.hh
+|   |   |-- ppl_prolog_common_inlines.hh
+|   |   `-- tests
+|   |       |-- Makefile.am
+|   |       |-- Makefile.in
+|   |       |-- ack.clpq
+|   |       |-- ackn.clpq
+|   |       |-- clpq.pl
+|   |       |-- clpq2.pl
+|   |       |-- expected_clpq2_int16
+|   |       |-- expected_clpq2_int16_a
+|   |       |-- expected_clpq2_int32
+|   |       |-- expected_clpq2_int32_a
+|   |       |-- expected_clpq2_int64
+|   |       |-- expected_clpq2_int64_a
+|   |       |-- expected_clpq2_int8
+|   |       |-- expected_clpq2_int8_a
+|   |       |-- expected_clpq2_mpz
+|   |       |-- expected_clpq2_mpz_a
+|   |       |-- expected_clpq_int16
+|   |       |-- expected_clpq_int16_a
+|   |       |-- expected_clpq_int32
+|   |       |-- expected_clpq_int32_a
+|   |       |-- expected_clpq_int64
+|   |       |-- expected_clpq_int64_a
+|   |       |-- expected_clpq_int8
+|   |       |-- expected_clpq_int8_a
+|   |       |-- expected_clpq_mpz
+|   |       |-- expected_clpq_mpz_a
+|   |       |-- expected_pchk_int16
+|   |       |-- expected_pchk_int16_a
+|   |       |-- expected_pchk_int32
+|   |       |-- expected_pchk_int32_a
+|   |       |-- expected_pchk_int64
+|   |       |-- expected_pchk_int64_a
+|   |       |-- expected_pchk_int8
+|   |       |-- expected_pchk_int8_a
+|   |       |-- expected_pchk_mpz
+|   |       |-- expected_pchk_mpz_a
+|   |       |-- expected_pgt
+|   |       |-- fib.clpq
+|   |       |-- mc91.clpq
+|   |       |-- pl_check.pl
+|   |       |-- ppl_interface_generator_prolog_generated_test_pl.m4
+|   |       |-- ppl_interface_generator_prolog_generated_test_pl_code.m4
+|   |       |-- ppl_prolog_generated_test_common.pl
+|   |       |-- schedule.clpq
+|   |       |-- script_clpq
+|   |       |-- script_clpq2
+|   |       |-- script_clpq2_int8
+|   |       |-- smm.clpq
+|   |       |-- sumto.clpq
+|   |       `-- tak.clpq
+|   |-- interfaced_boxes.hh
+|   |-- marked_pointers.hh
+|   |-- ppl_interface_generator_common.m4
+|   |-- ppl_interface_generator_common_dat.m4
+|   |-- ppl_interface_generator_common_procedure_generators.m4
+|   `-- ppl_interface_generator_copyright
+|-- ltmain.sh
+|-- m4
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- ac_check_ciao.m4
+|   |-- ac_check_classpath.m4
+|   |-- ac_check_fpu_control.m4
+|   |-- ac_check_gmp.m4
+|   |-- ac_check_sicstus_prolog.m4
+|   |-- ac_check_swi_prolog.m4
+|   |-- ac_check_xsb_prolog.m4
+|   |-- ac_check_yap.m4
+|   |-- ac_cxx_attribute_weak.m4
+|   |-- ac_cxx_double_binary_format.m4
+|   |-- ac_cxx_float_binary_format.m4
+|   |-- ac_cxx_ieee_inexact_flag.m4
+|   |-- ac_cxx_limit_memory.m4
+|   |-- ac_cxx_long_double_binary_format.m4
+|   |-- ac_cxx_plain_char_is_signed.m4
+|   |-- ac_cxx_proper_long_double.m4
+|   |-- ac_cxx_zero_length_arrays.m4
+|   |-- ac_prog_jar.m4
+|   |-- ac_prog_java.m4
+|   |-- ac_prog_javac.m4
+|   |-- ac_prog_javah.m4
+|   |-- ac_text_md5sum.m4
+|   |-- libtool.m4
+|   |-- ltoptions.m4
+|   |-- ltsugar.m4
+|   |-- ltversion.m4
+|   |-- lt~obsolete.m4
+|   |-- m4.m4
+|   |-- ocaml.m4
+|   |-- ppl.m4
+|   `-- ppl_c.m4
+|-- missing
+|-- mkinstalldirs
+|-- ppl-config.h.in
+|-- ppl-config.sed
+|-- ppl.lsm.in
+|-- src
+|   |-- BDS_Status.idefs.hh
+|   |-- BDS_Status_inlines.hh
+|   |-- BD_Shape.cc
+|   |-- BD_Shape_defs.hh
+|   |-- BD_Shape_inlines.hh
+|   |-- BD_Shape_templates.hh
+|   |-- BD_Shape_types.hh
+|   |-- BHRZ03_Certificate.cc
+|   |-- BHRZ03_Certificate_defs.hh
+|   |-- BHRZ03_Certificate_inlines.hh
+|   |-- BHRZ03_Certificate_types.hh
+|   |-- BUGS.cc.dist
+|   |-- BUGS.hh.dist
+|   |-- Bit_Matrix.cc
+|   |-- Bit_Matrix_defs.hh
+|   |-- Bit_Matrix_inlines.hh
+|   |-- Bit_Matrix_types.hh
+|   |-- Bit_Row.cc
+|   |-- Bit_Row_defs.hh
+|   |-- Bit_Row_inlines.hh
+|   |-- Bit_Row_types.hh
+|   |-- Boundary_defs.hh
+|   |-- Box.cc
+|   |-- Box_defs.hh
+|   |-- Box_inlines.hh
+|   |-- Box_templates.hh
+|   |-- Box_types.hh
+|   |-- Box_Status.idefs.hh
+|   |-- Box_Status_inlines.hh
+|   |-- COPYING.cc.dist
+|   |-- COPYING.hh.dist
+|   |-- CO_Tree.cc
+|   |-- CO_Tree_defs.hh
+|   |-- CO_Tree_inlines.hh
+|   |-- CO_Tree_templates.hh
+|   |-- CO_Tree_types.hh
+|   |-- CREDITS.cc.dist
+|   |-- CREDITS.hh.dist
+|   |-- C_Integer.hh
+|   |-- C_Polyhedron.cc
+|   |-- C_Polyhedron_defs.hh
+|   |-- C_Polyhedron_inlines.hh
+|   |-- C_Polyhedron_types.hh
+|   |-- Cast_Floating_Point_Expression_defs.hh
+|   |-- Cast_Floating_Point_Expression_inlines.hh
+|   |-- Cast_Floating_Point_Expression_templates.hh
+|   |-- Cast_Floating_Point_Expression_types.hh
+|   |-- Checked_Number.cc
+|   |-- Checked_Number_defs.hh
+|   |-- Checked_Number_inlines.hh
+|   |-- Checked_Number_templates.hh
+|   |-- Checked_Number_types.hh
+|   |-- Coefficient.cc
+|   |-- Coefficient_defs.hh
+|   |-- Coefficient_inlines.hh
+|   |-- Coefficient_types.hh
+|   |-- Coefficient_traits_template.hh
+|   |-- Concrete_Expression.cc
+|   |-- Concrete_Expression_defs.hh
+|   |-- Concrete_Expression_inlines.hh
+|   |-- Concrete_Expression_types.hh
+|   |-- Congruence.cc
+|   |-- Congruence_defs.hh
+|   |-- Congruence_inlines.hh
+|   |-- Congruence_types.hh
+|   |-- Congruence_System.cc
+|   |-- Congruence_System_defs.hh
+|   |-- Congruence_System_inlines.hh
+|   |-- Congruence_System_types.hh
+|   |-- Constant_Floating_Point_Expression_defs.hh
+|   |-- Constant_Floating_Point_Expression_inlines.hh
+|   |-- Constant_Floating_Point_Expression_types.hh
+|   |-- Constraint.cc
+|   |-- Constraint_defs.hh
+|   |-- Constraint_inlines.hh
+|   |-- Constraint_types.hh
+|   |-- Constraint_System.cc
+|   |-- Constraint_System_defs.hh
+|   |-- Constraint_System_inlines.hh
+|   |-- Constraint_System_types.hh
+|   |-- DB_Matrix_defs.hh
+|   |-- DB_Matrix_inlines.hh
+|   |-- DB_Matrix_templates.hh
+|   |-- DB_Matrix_types.hh
+|   |-- DB_Row_defs.hh
+|   |-- DB_Row_inlines.hh
+|   |-- DB_Row_templates.hh
+|   |-- DB_Row_types.hh
+|   |-- Dense_Row.cc
+|   |-- Dense_Row_defs.hh
+|   |-- Dense_Row_inlines.hh
+|   |-- Dense_Row_templates.hh
+|   |-- Dense_Row_types.hh
+|   |-- Determinate_defs.hh
+|   |-- Determinate_inlines.hh
+|   |-- Determinate_types.hh
+|   |-- Difference_Floating_Point_Expression_defs.hh
+|   |-- Difference_Floating_Point_Expression_inlines.hh
+|   |-- Difference_Floating_Point_Expression_templates.hh
+|   |-- Difference_Floating_Point_Expression_types.hh
+|   |-- Division_Floating_Point_Expression_defs.hh
+|   |-- Division_Floating_Point_Expression_inlines.hh
+|   |-- Division_Floating_Point_Expression_templates.hh
+|   |-- Division_Floating_Point_Expression_types.hh
+|   |-- Doubly_Linked_Object_defs.hh
+|   |-- Doubly_Linked_Object_inlines.hh
+|   |-- Doubly_Linked_Object_types.hh
+|   |-- EList_defs.hh
+|   |-- EList_inlines.hh
+|   |-- EList_types.hh
+|   |-- EList_Iterator_defs.hh
+|   |-- EList_Iterator_inlines.hh
+|   |-- EList_Iterator_types.hh
+|   |-- Expression_Hide_Inhomo_defs.hh
+|   |-- Expression_Hide_Inhomo_inlines.hh
+|   |-- Expression_Hide_Inhomo_types.hh
+|   |-- Expression_Hide_Last_defs.hh
+|   |-- Expression_Hide_Last_inlines.hh
+|   |-- Expression_Hide_Last_types.hh
+|   |-- Float.cc
+|   |-- Float_defs.hh
+|   |-- Float_inlines.hh
+|   |-- Float_templates.hh
+|   |-- Floating_Point_Expression_defs.hh
+|   |-- Floating_Point_Expression_inlines.hh
+|   |-- Floating_Point_Expression_templates.hh
+|   |-- Floating_Point_Expression_types.hh
+|   |-- GMP_Integer_defs.hh
+|   |-- GMP_Integer_inlines.hh
+|   |-- GMP_Integer_types.hh
+|   |-- Generator.cc
+|   |-- Generator_defs.hh
+|   |-- Generator_inlines.hh
+|   |-- Generator_types.hh
+|   |-- Generator_System.cc
+|   |-- Generator_System_defs.hh
+|   |-- Generator_System_inlines.hh
+|   |-- Generator_System_types.hh
+|   |-- Grid_defs.hh
+|   |-- Grid_inlines.hh
+|   |-- Grid_templates.hh
+|   |-- Grid_types.hh
+|   |-- Grid_Certificate.cc
+|   |-- Grid_Certificate_defs.hh
+|   |-- Grid_Certificate_inlines.hh
+|   |-- Grid_Certificate_types.hh
+|   |-- Grid_Generator.cc
+|   |-- Grid_Generator_defs.hh
+|   |-- Grid_Generator_inlines.hh
+|   |-- Grid_Generator_types.hh
+|   |-- Grid_Generator_System.cc
+|   |-- Grid_Generator_System_defs.hh
+|   |-- Grid_Generator_System_inlines.hh
+|   |-- Grid_Generator_System_types.hh
+|   |-- Grid_Status.cc
+|   |-- Grid_Status.idefs.hh
+|   |-- Grid_Status_inlines.hh
+|   |-- Grid_chdims.cc
+|   |-- Grid_conversion.cc
+|   |-- Grid_nonpublic.cc
+|   |-- Grid_public.cc
+|   |-- Grid_simplify.cc
+|   |-- Grid_widenings.cc
+|   |-- H79_Certificate.cc
+|   |-- H79_Certificate_defs.hh
+|   |-- H79_Certificate_inlines.hh
+|   |-- H79_Certificate_types.hh
+|   |-- Handler_defs.hh
+|   |-- Handler_inlines.hh
+|   |-- Handler_types.hh
+|   |-- Has_Assign_Or_Swap.hh
+|   |-- Init.cc
+|   |-- Init_defs.hh
+|   |-- Init_inlines.hh
+|   |-- Init_types.hh
+|   |-- Integer_Interval.hh
+|   |-- Interval_defs.hh
+|   |-- Interval_inlines.hh
+|   |-- Interval_templates.hh
+|   |-- Interval_types.hh
+|   |-- Interval_Info_defs.hh
+|   |-- Interval_Info_inlines.hh
+|   |-- Interval_Info_types.hh
+|   |-- Linear_Expression.cc
+|   |-- Linear_Expression_defs.hh
+|   |-- Linear_Expression_inlines.hh
+|   |-- Linear_Expression_types.hh
+|   |-- Linear_Expression_Impl.cc
+|   |-- Linear_Expression_Impl_defs.hh
+|   |-- Linear_Expression_Impl_inlines.hh
+|   |-- Linear_Expression_Impl_templates.hh
+|   |-- Linear_Expression_Impl_types.hh
+|   |-- Linear_Expression_Interface.cc
+|   |-- Linear_Expression_Interface_defs.hh
+|   |-- Linear_Expression_Interface_types.hh
+|   |-- Linear_Form.cc
+|   |-- Linear_Form_defs.hh
+|   |-- Linear_Form_inlines.hh
+|   |-- Linear_Form_templates.hh
+|   |-- Linear_Form_types.hh
+|   |-- Linear_System_defs.hh
+|   |-- Linear_System_inlines.hh
+|   |-- Linear_System_templates.hh
+|   |-- Linear_System_types.hh
+|   |-- MIP_Problem.cc
+|   |-- MIP_Problem_defs.hh
+|   |-- MIP_Problem_inlines.hh
+|   |-- MIP_Problem_templates.hh
+|   |-- MIP_Problem_types.hh
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- Matrix_defs.hh
+|   |-- Matrix_inlines.hh
+|   |-- Matrix_templates.hh
+|   |-- Matrix_types.hh
+|   |-- Multiplication_Floating_Point_Expression_defs.hh
+|   |-- Multiplication_Floating_Point_Expression_inlines.hh
+|   |-- Multiplication_Floating_Point_Expression_templates.hh
+|   |-- Multiplication_Floating_Point_Expression_types.hh
+|   |-- NNC_Polyhedron.cc
+|   |-- NNC_Polyhedron_defs.hh
+|   |-- NNC_Polyhedron_inlines.hh
+|   |-- NNC_Polyhedron_types.hh
+|   |-- Numeric_Format_defs.hh
+|   |-- OR_Matrix_defs.hh
+|   |-- OR_Matrix_inlines.hh
+|   |-- OR_Matrix_templates.hh
+|   |-- OR_Matrix_types.hh
+|   |-- Octagonal_Shape.cc
+|   |-- Octagonal_Shape_defs.hh
+|   |-- Octagonal_Shape_inlines.hh
+|   |-- Octagonal_Shape_templates.hh
+|   |-- Octagonal_Shape_types.hh
+|   |-- Og_Status.idefs.hh
+|   |-- Og_Status_inlines.hh
+|   |-- Opposite_Floating_Point_Expression_defs.hh
+|   |-- Opposite_Floating_Point_Expression_inlines.hh
+|   |-- Opposite_Floating_Point_Expression_types.hh
+|   |-- PIP_Problem.cc
+|   |-- PIP_Problem_defs.hh
+|   |-- PIP_Problem_inlines.hh
+|   |-- PIP_Problem_templates.hh
+|   |-- PIP_Problem_types.hh
+|   |-- PIP_Tree.cc
+|   |-- PIP_Tree_defs.hh
+|   |-- PIP_Tree_inlines.hh
+|   |-- PIP_Tree_types.hh
+|   |-- Partial_Function.cc
+|   |-- Partial_Function_defs.hh
+|   |-- Partial_Function_inlines.hh
+|   |-- Partial_Function_types.hh
+|   |-- Partially_Reduced_Product_defs.hh
+|   |-- Partially_Reduced_Product_inlines.hh
+|   |-- Partially_Reduced_Product_templates.hh
+|   |-- Partially_Reduced_Product_types.hh
+|   |-- Pending_Element_defs.hh
+|   |-- Pending_Element_inlines.hh
+|   |-- Pending_Element_types.hh
+|   |-- Pending_List_defs.hh
+|   |-- Pending_List_inlines.hh
+|   |-- Pending_List_templates.hh
+|   |-- Pending_List_types.hh
+|   |-- Ph_Status.cc
+|   |-- Ph_Status.idefs.hh
+|   |-- Ph_Status_inlines.hh
+|   |-- Pointset_Powerset.cc
+|   |-- Pointset_Powerset_defs.hh
+|   |-- Pointset_Powerset_inlines.hh
+|   |-- Pointset_Powerset_templates.hh
+|   |-- Pointset_Powerset_types.hh
+|   |-- Poly_Con_Relation.cc
+|   |-- Poly_Con_Relation_defs.hh
+|   |-- Poly_Con_Relation_inlines.hh
+|   |-- Poly_Con_Relation_types.hh
+|   |-- Poly_Gen_Relation.cc
+|   |-- Poly_Gen_Relation_defs.hh
+|   |-- Poly_Gen_Relation_inlines.hh
+|   |-- Poly_Gen_Relation_types.hh
+|   |-- Polyhedron_defs.hh
+|   |-- Polyhedron_inlines.hh
+|   |-- Polyhedron_templates.hh
+|   |-- Polyhedron_types.hh
+|   |-- Polyhedron_chdims.cc
+|   |-- Polyhedron_chdims_templates.hh
+|   |-- Polyhedron_conversion_templates.hh
+|   |-- Polyhedron_minimize_templates.hh
+|   |-- Polyhedron_nonpublic.cc
+|   |-- Polyhedron_public.cc
+|   |-- Polyhedron_simplify_templates.hh
+|   |-- Polyhedron_widenings.cc
+|   |-- Powerset_defs.hh
+|   |-- Powerset_inlines.hh
+|   |-- Powerset_templates.hh
+|   |-- Powerset_types.hh
+|   |-- Ptr_Iterator_defs.hh
+|   |-- Ptr_Iterator_inlines.hh
+|   |-- Ptr_Iterator_types.hh
+|   |-- Rational_Box.hh
+|   |-- Rational_Interval.hh
+|   |-- Result_defs.hh
+|   |-- Result_inlines.hh
+|   |-- Rounding_Dir_defs.hh
+|   |-- Rounding_Dir_inlines.hh
+|   |-- Scalar_Products.cc
+|   |-- Scalar_Products_defs.hh
+|   |-- Scalar_Products_inlines.hh
+|   |-- Scalar_Products_types.hh
+|   |-- Slow_Copy.hh
+|   |-- Sparse_Row.cc
+|   |-- Sparse_Row_defs.hh
+|   |-- Sparse_Row_inlines.hh
+|   |-- Sparse_Row_templates.hh
+|   |-- Sparse_Row_types.hh
+|   |-- Sum_Floating_Point_Expression_defs.hh
+|   |-- Sum_Floating_Point_Expression_inlines.hh
+|   |-- Sum_Floating_Point_Expression_templates.hh
+|   |-- Sum_Floating_Point_Expression_types.hh
+|   |-- Swapping_Vector_defs.hh
+|   |-- Swapping_Vector_inlines.hh
+|   |-- Swapping_Vector_types.hh
+|   |-- Temp_defs.hh
+|   |-- Temp_inlines.hh
+|   |-- Temp_templates.hh
+|   |-- Threshold_Watcher.cc
+|   |-- Threshold_Watcher_defs.hh
+|   |-- Threshold_Watcher_inlines.hh
+|   |-- Threshold_Watcher_templates.hh
+|   |-- Threshold_Watcher_types.hh
+|   |-- Time.cc
+|   |-- Time_defs.hh
+|   |-- Time_inlines.hh
+|   |-- Time_types.hh
+|   |-- Topology_types.hh
+|   |-- Variable.cc
+|   |-- Variable_defs.hh
+|   |-- Variable_inlines.hh
+|   |-- Variable_types.hh
+|   |-- Variable_Floating_Point_Expression_defs.hh
+|   |-- Variable_Floating_Point_Expression_inlines.hh
+|   |-- Variable_Floating_Point_Expression_types.hh
+|   |-- Variables_Set.cc
+|   |-- Variables_Set_defs.hh
+|   |-- Variables_Set_inlines.hh
+|   |-- Variables_Set_types.hh
+|   |-- WRD_coefficient_types_defs.hh
+|   |-- WRD_coefficient_types_inlines.hh
+|   |-- Watchdog.cc
+|   |-- Watchdog_defs.hh
+|   |-- Watchdog_inlines.hh
+|   |-- Watchdog_types.hh
+|   |-- Weight_Profiler.cc
+|   |-- Weight_Profiler_defs.hh
+|   |-- Widening_Function_defs.hh
+|   |-- Widening_Function_inlines.hh
+|   |-- Widening_Function_types.hh
+|   |-- algorithms.hh
+|   |-- assert.cc
+|   |-- assert.hh
+|   |-- assign_or_swap.hh
+|   |-- c_streambuf.cc
+|   |-- c_streambuf_defs.hh
+|   |-- c_streambuf_inlines.hh
+|   |-- c_streambuf_types.hh
+|   |-- checked.cc
+|   |-- checked_defs.hh
+|   |-- checked_inlines.hh
+|   |-- checked_ext_inlines.hh
+|   |-- checked_float_inlines.hh
+|   |-- checked_int_inlines.hh
+|   |-- checked_mpq_inlines.hh
+|   |-- checked_mpz_inlines.hh
+|   |-- checked_numeric_limits.hh
+|   |-- compiler.hh
+|   |-- distances_defs.hh
+|   |-- distances_inlines.hh
+|   |-- distances_types.hh
+|   |-- fpu-c99_inlines.hh
+|   |-- fpu-ia32.cc
+|   |-- fpu-ia32_inlines.hh
+|   |-- fpu-none_inlines.hh
+|   |-- fpu-sparc_inlines.hh
+|   |-- fpu_defs.hh
+|   |-- fpu_types.hh
+|   |-- globals.cc
+|   |-- globals_defs.hh
+|   |-- globals_inlines.hh
+|   |-- globals_types.hh
+|   |-- initializer.hh
+|   |-- intervals_defs.hh
+|   |-- iterator_to_const_defs.hh
+|   |-- iterator_to_const_inlines.hh
+|   |-- iterator_to_const_types.hh
+|   |-- linearize.hh
+|   |-- math_utilities_defs.hh
+|   |-- math_utilities_inlines.hh
+|   |-- max_space_dimension.hh
+|   |-- meta_programming.hh
+|   |-- mp_std_bits.cc
+|   |-- mp_std_bits_defs.hh
+|   |-- mp_std_bits_inlines.hh
+|   |-- namespaces.hh
+|   |-- ppl-config.cc.in
+|   |-- ppl.hh.dist
+|   |-- ppl_header.hh
+|   |-- stdiobuf.cc
+|   |-- stdiobuf_defs.hh
+|   |-- stdiobuf_inlines.hh
+|   |-- stdiobuf_types.hh
+|   |-- swapping_sort_templates.hh
+|   |-- termination.cc
+|   |-- termination_defs.hh
+|   |-- termination_templates.hh
+|   |-- termination_types.hh
+|   |-- version.cc
+|   |-- version.hh.in
+|   |-- wrap_assign.hh
+|   |-- wrap_string.cc
+|   `-- wrap_string.hh
+|-- tests
+|   |-- BD_Shape
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addconstraints1.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- affinedimension1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- bgp99extrapolation1.cc
+|   |   |-- bhmz05widening1.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- boundedaffinepreimage1.cc
+|   |   |-- bounds1.cc
+|   |   |-- cc76extrapolation1.cc
+|   |   |-- cc76narrowing1.cc
+|   |   |-- closure1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruences1.cc
+|   |   |-- constrains1.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- containsintegerpoint1.cc
+|   |   |-- difference1.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- dropsomenonintegerpoints1.cc
+|   |   |-- empty1.cc
+|   |   |-- equality1.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- frequency1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- fromgensys1.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- fromoctagonalshape1.cc
+|   |   |-- frompolyhedron1.cc
+|   |   |-- fromspacedim1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- generalizedaffinepreimage3.cc
+|   |   |-- geomcovers1.cc
+|   |   |-- h79widening1.cc
+|   |   |-- integerupperboundifexact1.cc
+|   |   |-- intersection1.cc
+|   |   |-- limitedbhmz05extrapolation1.cc
+|   |   |-- limitedcc76extrapolation1.cc
+|   |   |-- limitedh79extrapolation1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- max_min1.cc
+|   |   |-- max_min2.cc
+|   |   |-- maxspacedim1.cc
+|   |   |-- membytes1.cc
+|   |   |-- minconstraints1.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- relations3.cc
+|   |   |-- relations4.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- run_tests
+|   |   |-- simplifyusingcontext1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- unconstrain1.cc
+|   |   |-- universe1.cc
+|   |   |-- upperbound1.cc
+|   |   |-- upperboundifexact1.cc
+|   |   |-- wrap1.cc
+|   |   `-- writebdshape1.cc
+|   |-- Box
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addconstraints1.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- affinedimension1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- bgp99extrapolation1.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- boundedaffinepreimage1.cc
+|   |   |-- cc76narrowing1.cc
+|   |   |-- cc76widening.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruences1.cc
+|   |   |-- constrains1.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- containsintegerpoint1.cc
+|   |   |-- difference1.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- empty1.cc
+|   |   |-- equality1.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- frequency1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- fromgensys1.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- frompartiallyreducedproduct1.cc
+|   |   |-- frompolyhedron1.cc
+|   |   |-- frompolyhedron2.cc
+|   |   |-- fromspacedim1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- geomcovers1.cc
+|   |   |-- intersection1.cc
+|   |   |-- interval1.cc
+|   |   |-- limitedcc76extrapolation1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- max_min1.cc
+|   |   |-- maxspacedim1.cc
+|   |   |-- membytes1.cc
+|   |   |-- minconstraints1.cc
+|   |   |-- propagateconstraints1.cc
+|   |   |-- propagateconstraints2.cc
+|   |   |-- refinewithcongruence1.cc
+|   |   |-- refinewithcongruences1.cc
+|   |   |-- refinewithconstraint1.cc
+|   |   |-- refinewithconstraint2.cc
+|   |   |-- refinewithconstraints1.cc
+|   |   |-- refinewithconstraints2.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- relations3.cc
+|   |   |-- relations4.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- run_tests
+|   |   |-- simplifyusingcontext1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- topclosed1.cc
+|   |   |-- unconstrain1.cc
+|   |   |-- universe1.cc
+|   |   |-- upperbound1.cc
+|   |   |-- upperboundifexact1.cc
+|   |   |-- wrap1.cc
+|   |   `-- writebox1.cc
+|   |-- CO_Tree
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   `-- cotree1.cc
+|   |-- Concrete_Expression
+|   |   |-- C_Expr.cc
+|   |   |-- C_Expr_defs.hh
+|   |   |-- C_Expr_inlines.hh
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- bdshape1.cc
+|   |   |-- bdshape2.cc
+|   |   |-- digitalfilters1.cc
+|   |   |-- linearform1.cc
+|   |   |-- linearize.cc
+|   |   |-- octagonalshape1.cc
+|   |   |-- octagonalshape2.cc
+|   |   |-- polyhedron1.cc
+|   |   |-- polyhedron2.cc
+|   |   `-- run_tests
+|   |-- Grid
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addcongruence1.cc
+|   |   |-- addcongruences1.cc
+|   |   |-- addconstraint1.cc
+|   |   |-- addconstraints1.cc
+|   |   |-- addgenerator1.cc
+|   |   |-- addgenerators1.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- affinedim1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- affinepreimage2.cc
+|   |   |-- approximatepartition1.cc
+|   |   |-- asciidumpload1.cc
+|   |   |-- asciidumpload2.cc
+|   |   |-- asciidumpload3.cc
+|   |   |-- asciidumpload4.cc
+|   |   |-- asciidumpload5.cc
+|   |   |-- asciidumpload6.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- boundedaffinepreimage1.cc
+|   |   |-- bounds1.cc
+|   |   |-- certificate1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruence1.cc
+|   |   |-- congruences1.cc
+|   |   |-- congruences2.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- containsintegerpoint1.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- dropnonintegerpoints1.cc
+|   |   |-- equals1.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- frequency1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- fromoctagonalshape1.cc
+|   |   |-- frompolyhedron1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffineimage3.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- generalizedaffinepreimage3.cc
+|   |   |-- generator1.cc
+|   |   |-- generators1.cc
+|   |   |-- generators2.cc
+|   |   |-- grid1.cc
+|   |   |-- grid2.cc
+|   |   |-- grid3.cc
+|   |   |-- griddifference1.cc
+|   |   |-- intersection1.cc
+|   |   |-- isempty1.cc
+|   |   |-- isuniverse1.cc
+|   |   |-- limitedextrapolation1.cc
+|   |   |-- limitedextrapolation2.cc
+|   |   |-- limitedextrapolation3.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- maxmin1.cc
+|   |   |-- membytes1.cc
+|   |   |-- mincongruences1.cc
+|   |   |-- mingenerators1.cc
+|   |   |-- outputoperator1.cc
+|   |   |-- outputoperator2.cc
+|   |   |-- outputoperator3.cc
+|   |   |-- partition1.cc
+|   |   |-- powersetdifference1.cc
+|   |   |-- powersetgeometricallycovers1.cc
+|   |   |-- powersetgeometricallyequals1.cc
+|   |   |-- refinewithcongruences1.cc
+|   |   |-- refinewithconstraints1.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- relations3.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- removespacedims2.cc
+|   |   |-- simplifyusingcontext1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- topclosed1.cc
+|   |   |-- topclosure1.cc
+|   |   |-- unconstrain1.cc
+|   |   |-- upperbound1.cc
+|   |   |-- upperbound2.cc
+|   |   |-- widening1.cc
+|   |   |-- widening2.cc
+|   |   |-- widening3.cc
+|   |   |-- wrap1.cc
+|   |   `-- writecongruencesystem.cc
+|   |-- MIP_Problem
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- exceptions1.cc
+|   |   |-- mipproblem1.cc
+|   |   |-- mipproblem2.cc
+|   |   |-- mipproblem3.cc
+|   |   `-- mipproblem4.cc
+|   |-- Makefile.am
+|   |-- Makefile.in
+|   |-- Octagonal_Shape
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addspacedims1.cc
+|   |   |-- affinedimension1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- affinepreimage2.cc
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- bhmz05widening1.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- boundedaffinepreimage1.cc
+|   |   |-- bounds1.cc
+|   |   |-- cc76extrapolation1.cc
+|   |   |-- cc76narrowing1.cc
+|   |   |-- chinainit.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruences1.cc
+|   |   |-- constrains1.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- containsintegerpoint1.cc
+|   |   |-- difference1.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- dropsomenonintegerpoints1.cc
+|   |   |-- empty1.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- frequency1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- fromgensys1.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- fromoctagonalshape1.cc
+|   |   |-- frompolyhedron1.cc
+|   |   |-- fromspacedim1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffineimage3.cc
+|   |   |-- generalizedaffineimage4.cc
+|   |   |-- generalizedaffineimage5.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- generalizedaffinepreimage3.cc
+|   |   |-- generalizedaffinepreimage4.cc
+|   |   |-- integerupperboundifexact1.cc
+|   |   |-- intersection1.cc
+|   |   |-- limitedbhmz05extrapolation1.cc
+|   |   |-- limitedcc76extrapolation1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- max_min1.cc
+|   |   |-- max_min2.cc
+|   |   |-- maxspacedim1.cc
+|   |   |-- membytes1.cc
+|   |   |-- minconstraints1.cc
+|   |   |-- relatwithcons1.cc
+|   |   |-- relatwithcons2.cc
+|   |   |-- relatwithcons3.cc
+|   |   |-- relatwithgen1.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- run_tests
+|   |   |-- simplifyusingcontext1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- unconstrain1.cc
+|   |   |-- universe1.cc
+|   |   |-- upperbound1.cc
+|   |   |-- upperboundifexact1.cc
+|   |   |-- wrap1.cc
+|   |   `-- writeoctagon1.cc
+|   |-- PIP_Problem
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- exceptions1.cc
+|   |   |-- pipproblem1.cc
+|   |   |-- pipproblem2.cc
+|   |   |-- pipproblem3.cc
+|   |   `-- weightwatch1.cc
+|   |-- Partially_Reduced_Product
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addcongruences1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- asciidumpload1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- bounds1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruences1.cc
+|   |   |-- congruencesproduct1.cc
+|   |   |-- constraints1.cc
+|   |   |-- constraintsproduct1.cc
+|   |   |-- contains1.cc
+|   |   |-- difference1.cc
+|   |   |-- dimension1.cc
+|   |   |-- directproduct1.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- dropsomenonintegerpoints1.cc
+|   |   |-- equals1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- fromoctagonalshape1.cc
+|   |   |-- frompolyhedron1.cc
+|   |   |-- fromproduct1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- intersection1.cc
+|   |   |-- isempty1.cc
+|   |   |-- isuniverse1.cc
+|   |   |-- maxmin1.cc
+|   |   |-- partially_reduced_product_test.hh
+|   |   |-- refinewithcongruences1.cc
+|   |   |-- refinewithconstraints1.cc
+|   |   |-- relations1.cc
+|   |   |-- shapepreservingproduct1.cc
+|   |   |-- smashproduct1.cc
+|   |   |-- spacedims1.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- topclosed1.cc
+|   |   |-- topclosure1.cc
+|   |   `-- upperbound1.cc
+|   |-- Polyhedron
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addcongruence1.cc
+|   |   |-- addcongruences1.cc
+|   |   |-- addconstraint1.cc
+|   |   |-- addconstraints1.cc
+|   |   |-- addconstraints2.cc
+|   |   |-- addgenerator1.cc
+|   |   |-- addgenerator2.cc
+|   |   |-- addgenerators1.cc
+|   |   |-- addgenerators2.cc
+|   |   |-- addspacedims1.cc
+|   |   |-- addspacedims2.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affineimage2.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- affinetrans.cc
+|   |   |-- append1.cc
+|   |   |-- append2.cc
+|   |   |-- ascii_dump_load1.cc
+|   |   |-- ascii_dump_load2.cc
+|   |   |-- ascii_dump_load3.cc
+|   |   |-- bgp99extrapolation1.cc
+|   |   |-- bgp99extrapolation2.cc
+|   |   |-- bhrz03widening1.cc
+|   |   |-- bhrz03widening2.cc
+|   |   |-- bhrz03widening3.cc
+|   |   |-- bhz03widening1.cc
+|   |   |-- bounded1.cc
+|   |   |-- boundedaffineimage1.cc
+|   |   |-- boundedaffinepreimage1.cc
+|   |   |-- boundedbhrz03extrapolation1.cc
+|   |   |-- boundedh79extrapolation1.cc
+|   |   |-- bounds1.cc
+|   |   |-- cnncconversion1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- congruences1.cc
+|   |   |-- constrains1.cc
+|   |   |-- constraints1.cc
+|   |   |-- contains1.cc
+|   |   |-- contains2.cc
+|   |   |-- containsintegerpoint1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- disjoint2.cc
+|   |   |-- dropsomenonintegerpoints1.cc
+|   |   |-- dropsomenonintegerpoints2.cc
+|   |   |-- dualhypercubes.cc
+|   |   |-- empty1.cc
+|   |   |-- equals1.cc
+|   |   |-- exceptions1.cc
+|   |   |-- exceptions2.cc
+|   |   |-- exceptions3.cc
+|   |   |-- expandspacedim1.cc
+|   |   |-- expandspacedim2.cc
+|   |   |-- foldspacedims1.cc
+|   |   |-- foldspacedims2.cc
+|   |   |-- frequency1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- frombox2.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- fromoctagonalshape1.cc
+|   |   |-- generalizedaffineimage1.cc
+|   |   |-- generalizedaffineimage2.cc
+|   |   |-- generalizedaffinepreimage1.cc
+|   |   |-- generalizedaffinepreimage2.cc
+|   |   |-- generators1.cc
+|   |   |-- geomcovers1.cc
+|   |   |-- h79widening1.cc
+|   |   |-- h79widening2.cc
+|   |   |-- hybrid.cc
+|   |   |-- intersection1.cc
+|   |   |-- limitedbhrz03extrapolation1.cc
+|   |   |-- limitedh79extrapolation1.cc
+|   |   |-- linearexpression1.cc
+|   |   |-- linearpartition1.cc
+|   |   |-- linearsystem1.cc
+|   |   |-- mapspacedims1.cc
+|   |   |-- matrix1.cc
+|   |   |-- max_min1.cc
+|   |   |-- maxspacedim1.cc
+|   |   |-- mc91.cc
+|   |   |-- membytes1.cc
+|   |   |-- memory1.cc
+|   |   |-- memory2.cc
+|   |   |-- minconstraints1.cc
+|   |   |-- minconstraints2.cc
+|   |   |-- mingenerators1.cc
+|   |   |-- mingenerators2.cc
+|   |   |-- nncminimize1.cc
+|   |   |-- nncminimize2.cc
+|   |   |-- numberinput1.cc
+|   |   |-- onepoint.cc
+|   |   |-- permute.cc
+|   |   |-- polydifference1.cc
+|   |   |-- polydifference2.cc
+|   |   |-- polyhull1.cc
+|   |   |-- polyhull2.cc
+|   |   |-- polyhullifexact1.cc
+|   |   |-- polyhullifexact2.cc
+|   |   |-- randphull1.cc
+|   |   |-- refinewithcongruence1.cc
+|   |   |-- refinewithcongruences1.cc
+|   |   |-- refinewithconstraint1.cc
+|   |   |-- refinewithconstraints1.cc
+|   |   |-- relations1.cc
+|   |   |-- relations2.cc
+|   |   |-- relations3.cc
+|   |   |-- removespacedims1.cc
+|   |   |-- removespacedims2.cc
+|   |   |-- simplifyusingcontext1.cc
+|   |   |-- smm1.cc
+|   |   |-- sparserow1.cc
+|   |   |-- termination1.cc
+|   |   |-- termination2.cc
+|   |   |-- timeelapse1.cc
+|   |   |-- timeelapse2.cc
+|   |   |-- topclosed1.cc
+|   |   |-- topclosure1.cc
+|   |   |-- unconstrain1.cc
+|   |   |-- universe1.cc
+|   |   |-- universe2.cc
+|   |   |-- variablesset1.cc
+|   |   |-- watchdog1.cc
+|   |   |-- weightwatch1.cc
+|   |   |-- wrap1.cc
+|   |   |-- wrap2.cc
+|   |   |-- writeconsys1.cc
+|   |   |-- writegensys1.cc
+|   |   |-- writepolyhedron1.cc
+|   |   |-- writepolyhedron2.cc
+|   |   |-- writerelation1.cc
+|   |   `-- writevariable1.cc
+|   |-- Powerset
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   |-- addcongruences1.cc
+|   |   |-- addconstraints1.cc
+|   |   |-- affinedimension1.cc
+|   |   |-- affineimage1.cc
+|   |   |-- affinepreimage1.cc
+|   |   |-- bounded1.cc
+|   |   |-- bounds1.cc
+|   |   |-- closed1.cc
+|   |   |-- closure1.cc
+|   |   |-- collapse1.cc
+|   |   |-- concatenate1.cc
+|   |   |-- contains1.cc
+|   |   |-- containsintegerpoint1.cc
+|   |   |-- difference1.cc
+|   |   |-- discrete1.cc
+|   |   |-- disjoint1.cc
+|   |   |-- disjunct1.cc
+|   |   |-- empty1.cc
+|   |   |-- entails1.cc
+|   |   |-- equals1.cc
+|   |   |-- frombdshape1.cc
+|   |   |-- frombox1.cc
+|   |   |-- fromcongruences1.cc
+|   |   |-- fromconstraints1.cc
+|   |   |-- fromgrid1.cc
+|   |   |-- fromoctagonalshape1.cc
+|   |   |-- frompolyhedron1.cc
+|   |   |-- fromspacedimension1.cc
+|   |   |-- intersection1.cc
+|   |   |-- maxmin1.cc
+|   |   |-- meet1.cc
+|   |   |-- membytes1.cc
+|   |   |-- powerset1.cc
+|   |   |-- reduce1.cc
+|   |   |-- refinewith1.cc
+|   |   |-- relationwith1.cc
+|   |   |-- simplifyusingcontext1.cc
+|   |   |-- size1.cc
+|   |   |-- spacedims1.cc
+|   |   |-- universe1.cc
+|   |   `-- upperbound1.cc
+|   |-- README
+|   |-- Random_Number_Generator_defs.hh
+|   |-- Random_Number_Generator_inlines.hh
+|   |-- Random_Number_Generator_types.hh
+|   |-- Watchdog
+|   |   |-- Makefile.am
+|   |   |-- Makefile.in
+|   |   `-- watchdog1.cc
+|   |-- files.cc
+|   |-- files.hh
+|   |-- ppl_test.cc
+|   |-- ppl_test.hh
+|   `-- valgrind_suppressions
+`-- utils
+    |-- Makefile.am
+    |-- Makefile.in
+    |-- build_header.in
+    |-- cm_cleaner.sh
+    |-- cm_splitter.sh
+    |-- text2cxxarray.in
+    |-- timings.cc
+    `-- timings.hh
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.alpha b/README.alpha
new file mode 100644
index 0000000..490756c
--- /dev/null
+++ b/README.alpha
@@ -0,0 +1,59 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library on the Alpha
+=========================================================
+
+There appears to be a bug in GCC (all versions up to and including
+4.3.x) concerning exception handling on the Alpha.  This may be
+related to
+
+  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8966
+
+Strictily speaking, the PPL uses exception handling, so if that does
+not work on the Alpha, then the PPL does not work on the Alpha.  And
+there is nothing to do but fix the GCC bug.
+
+However, if that GCC bug really only affects exception handling and nothing
+else, given that the PPL only uses exceptions for error reporting, we can
+probably say that the PPL works on the Alpha *apart* from error reporting.
+In other words, under this hypothesis (which we have no way to check),
+users that are not interested in catching exceptions thrown by the PPL
+(in response to invalid arguments, heap exhaustion, overflows, ...)
+should probably not worry.  Your mileage may vary...
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.arm b/README.arm
new file mode 100644
index 0000000..435baae
--- /dev/null
+++ b/README.arm
@@ -0,0 +1,54 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library on the ARM
+=======================================================
+
+On the ARM, whether or not the rounding mode can be set in a way that
+allows the PPL to work with floating point numbers, will depend on the
+actual hardware.  However, disabling the affected PPL code at run-time
+is impractical.  Thus, to ensure that the binary distributions of the
+PPL for the ARM work as expected on any hardware, on the ARM, the
+affected code is disabled at compile-time.  It is still possible to
+build a binary for the ARM that assumes the hardware can control the
+rounding mode; for this, configure the PPL with
+`-DPPL_ARM_CAN_CONTROL_FPU=1' included in CPPFLAGS.
+For example:
+
+  CPPFLAGS="-DPPL_ARM_CAN_CONTROL_FPU=1" .../configure ...
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.configure b/README.configure
new file mode 100644
index 0000000..54268f8
--- /dev/null
+++ b/README.configure
@@ -0,0 +1,519 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library
+============================================
+
+Contents
+--------
+
+ 1. The Standard Thing (configure, make, make install)
+ 2. Using the Right Version of GMP
+ 3. Using the Right C and C++ Compilers
+ 4. Enabling the Use of Alternative Coefficient Types
+ 5. Configuring the Language Interfaces
+ 6. Configuring for Optimized Performance
+ 7. Advanced Performance Tuning
+ 8. Configuring for Debugging
+ 9. Programs that Come with the Library
+10. Using the Git Sources
+
+
+1. The Standard Thing (configure, make, make install)
+-----------------------------------------------------
+
+In an ideal situation (i.e., on a more or less standard Un*x
+environment, with the right C++ compiler to compile the core library
+as well as the right compilers to compile all the enabled language
+interfaces, with the GMP library installed in a standard place and
+provided the user is satisfied with all the options we chose as
+defaults), a source distribution of the Parma Polyhedra Library (PPL)
+can be unpacked, configured, built and installed with the following,
+well-known procedure:
+
+  $ tar jxf ppl-x.y.tar.bz2
+  $ ./configure
+  $ make
+  $ su
+  Password: <root password>
+  $ make install
+
+After successful completion of these steps the PPL is completely
+installed on the system and can be used as expected.
+
+On the other hand, the PPL `configure' shell script provides many
+options to customize the build and installation process.  The
+`INSTALL' file gives a detailed description of the non PPL-specific
+aspects of the configuration, compilation and installation process and
+describes the basic options of the `configure' script.  For a compact
+summary of all the available configuration options, run the command
+
+  $ ./configure --help
+
+The PPL-specific aspects of the configuration, compilation and
+installation process are discussed in the following sections.
+
+
+2. Using the Right Version of GMP
+---------------------------------
+
+In order to use this version of the PPL you must make sure that:
+
+(1) GMP version 4.1.3 or later is installed on your system;
+(2) that this version was compiled with the C++ interface enabled;
+(3) that this C++ interface was compiled with the same compiler
+    version with which you will compile the PPL;
+(4) that your C and C++ compilers and your linker will find _that_
+    version of GMP and not others that may be present in your system.
+
+Some binary distributions of GMP may contain a version that was compiled
+with the C++ interface disabled, or compiled with a C++ compiler
+implementing a different ABI than the compiler you will use to compile
+the PPL.  In these (increasingly rare) cases the only reliable way to
+ensure points (1), (2) and (3) above is to visit GMP's home page at
+
+  http://gmplib.org/
+
+and download the last available version.  Then decide where to install
+it and call this place in your file system <GMP prefix>.  Then, unless
+you have special needs, you can invoke the GMP's configure script with
+the options
+
+  --prefix=<GMP prefix> --enable-cxx
+
+If the C++ compiler you will use to compile the PPL is not the default
+on your system then, in order to satisfy point (3) above, you should
+set the `CXX', `CXXFLAGS' and `CXXCPP' environment variables so as to
+use the intended compiler with the intended options.  See the file
+`INSTALL.autoconf' in the GMP distribution for more on this subject.
+
+If you want to use the PPL ability to recover from out-of-memory
+situations, you should use a version of GMP compiled with GCC (which
+implies you should then compile also the PPL with GCC) using the
+`-fexceptions' option.  To build such a version, you can use the
+`CPPFLAGS' environment variable, so that it contains (among possibly
+other compiler options) `-fexceptions'.  Again, see `INSTALL.autoconf'
+in the GMP distribution for more on using environment variables to
+influence the configure script.
+
+In order to achieve point (4) above, if the directory <GMP prefix>
+is not standard for your compiler and/or for your linker, you will
+have to make sure the configure script of the PPL is invoked with,
+among others, the option
+
+  --with-gmp=<GMP prefix>
+
+If you use shared libraries, consult the documentation of your dynamic
+linker/loader (`man ld.so' will do on most Un*x-like systems) to see
+how to make sure that GMP's shared library will be found at run-time
+(setting the environment variable `LD_LIBRARY_PATH' to
+"<GMP prefix>/lib:$LD_LIBRARY_PATH" or
+"<GMP prefix>/lib64:$LD_LIBRARY_PATH" is the most commonly used
+solution).
+
+It is also possible to use a non-installed build of GMP.  In order to
+do that you should configure the PPL with, among others, the option
+
+  --with-gmp-build=<GMP build directory>
+
+
+3. Using the Right C and C++ Compilers
+--------------------------------------
+
+The configure script of the PPL, as you can see by using its `--help'
+option, besides recognizing `CC', `CXX', `CFLAGS', `CXXFLAGS' and
+other environment variables, provides four switches with which you can
+select the compilers and compilers' options to use for building the
+library.  These switches are
+
+  --with-cc=XXX           use XXX as the C compiler
+  --with-cxx=XXX          use XXX as the C++ compiler
+  --with-cflags=XXX       add XXX to the options for the C compiler
+  --with-cxxflags=XXX     add XXX to the options for the C++ compiler
+
+Among other things, the ability to specify the C and C++ compilation
+flags allows you to use special compilation options ---such as
+`-fno-threadsafe-statics'--- that, while not safe for general use,
+may be adequate for your particular application.
+
+Let us take the occasion to stress, once again, the fact that you
+must use exactly the same C++ compiler to compile the C++ interface of GMP,
+the PPL and your application, if it uses the C++ interface of the PPL.
+It should be noted that no version of GCC prior to 4.0.3 is known to
+reliably compile PPL 0.10.
+
+Here is an example of a configuration that uses the Intel C/C++ compiler
+version 11.1.x.  Assuming you have configured GMP with a command like
+
+  CC=icc CXX=icpc /path/to/gmp-5.0.1/configure --enable-cxx \
+    --prefix=/opt/intel/Compiler/11.1/072 \
+    --libdir=/opt/intel/Compiler/11.1/072/lib/intel64
+
+you can configure the PPL with a command like
+
+  /path/to/ppl-x.y/configure --with-cxx=icpc --with-cc=icc \
+    --with-cxxflags=-pch \
+    --with-gmp=/opt/intel/Compiler/11.1/072
+
+Notice that the `--with-cxxflags' option is not essential here and is
+only included to show how extra compiler options can be passed to the
+configure script.
+
+As another example, here is how you can compile the PPL with
+Comeau C/C++ 4.3.10.1.  First configure GMP with a command like
+
+  CXX=como /path/to/gmp-5.0.1/configure --enable-cxx \
+    --disable-shared --prefix=/opt/comeau/local
+
+Then you can configure the PPL with a command like
+
+  /path/to/ppl/configure --with-cc="como --c" --with-cxx="como -tused" \
+    --with-cxxflags="-g++ --remarks --long_long \
+    --display_error_number --diag_suppress 340,401,679" \
+    --disable-shared --with-gmp=/opt/comeau/local
+
+Notice the use of the option `--disable-shared' both in the configuration
+of GMP and the configuration of the PPL.  This is due to the fact that
+Comeau C/C++ 4.3.10.1 does not support shared libraries.
+
+
+4. Enabling the Use of Alternative Coefficient Types
+----------------------------------------------------
+
+When speed is important and the numerical coefficients involved are
+likely to be small, you can configure the PPL to use checked native
+integers (8, 16, 32 or 64 bits wide) for the representation of the
+coefficients.  This is a safe strategy since, when using checked
+native integers, the library also performs systematic (yet efficient)
+overflow detection and, in case of overflow, an exception is raised.
+To enable the use of various kinds of coefficients, you can use
+the configure option
+
+  --enable-coefficients=TYPE
+
+where TYPE is one of
+
+  mpz,              use GMP unbounded integers (default);
+  checked-int8,     use  8-bit checked integers;
+  checked-int16,    use 16-bit checked integers;
+  checked-int32,    use 32-bit checked integers;
+  checked-int64,    use 64-bit checked integers.
+
+When using checked integers it is also wise to increase the
+optimization level, since their efficiency largely depends on the
+compiler and on the optimization options used.  See below for how
+to do that (in later releases we may try to make the choice of the
+optimization options automatic).
+
+If you want to test the overhead of checked integers with respect
+to plain, unchecked native integers and you are really sure of what
+you are doing, you may be interested to know that these additional
+choices for TYPE are available:
+
+  native-int8,     use  8-bit *unchecked* integers;
+  native-int16,    use 16-bit *unchecked* integers;
+  native-int32,    use 32-bit *unchecked* integers;
+  native-int64,    use 64-bit *unchecked* integers.
+
+
+5. Configuring the Language Interfaces
+--------------------------------------
+
+The PPL comes equipped with interfaces for several programming
+languages.  Some of these interfaces are enabled by default,
+meaning that, if the configuration script finds support for
+a certain programming language, these interfaces are compiled
+(with `make') and installed (with `make install').
+The set of enabled interface can be customized with the configure option
+
+  --enable-interfaces=INTERFACES
+
+The INTERFACES argument can be
+
+  none,            no language interface is enabled;
+  all,             all language interfaces are enabled;
+
+or any space-separated list of interface specifiers chosen among
+
+  cxx,             the C++ interface;
+  c,               the C interface;
+  java,            the Java interface;
+  ocaml,           the OCaml interface;
+  ciao_prolog,     the Ciao Prolog interface;
+  gnu_prolog,      the GNU Prolog interface;
+  sicstus_prolog,  the SICStus Prolog interface;
+  swi_prolog,      the SWI-Prolog interface;
+  xsb_prolog,      the XSB interface;
+  yap_prolog,      the YAP interface.
+
+Note that, in order to build any interface different from the C++ one,
+a recent enough version of GNU M4 is required (the configuration script
+searches for one and gives an error if it cannot find it).
+
+The instantiations for the domains for interfaces other than the main
+C++ interface can be customized via the `instantiations' option for
+the PPL `configure' shell script which is described below. Some
+interfaces depend on language implementations that are somewhat
+problematic, either because they tend to be installed in rather
+unpredictable places, or because some published versions have bugs
+that prevent the PPL interface to run correctly.  In these cases,
+information is given in a README.* file.  Presently we have:
+
+  README.java,
+  README.ocaml,
+  README.gprolog,
+  README.swiprolog,
+  README.yap.
+
+For the Java interface, the `--with-java=DIR' configure option allows
+to select the Java SDK root directory.  We have tested the Java interface
+with the Java SE Development Kit 6 and OpenJDK 1.6.
+
+For the OCaml interface, the `--with-mlgmp=DIR' configure option allows
+to specify the installation directory of the ML GMP package (which allows
+to use GMP numbers in OCaml programs).  By default, ML GMP is searched
+in the `gmp' subdirectory of the OCaml standard library directory.
+
+The C++ interface provides access to all the numerical abstractions
+provided by the PPL.  The majority of these (we are talking about
+hundreds of different numerical abstractions) are provided by means
+of C++ templates.  The other languages interfaced to the PPL, except
+Java, do not have this facility.  Moreover, at the time of writing
+we do not know if and to which extent C++ templates can be mapped
+onto Java generics.  As a result, for all the language interfaces
+but the C++ one, the instantiation of the template-based numerical
+abstractions must be done at library-compile-time (instead of
+application-compile-time).  A small set of instantiations is enabled
+by default.  Currently this set is given by
+
+  Polyhedron (which stands for both C_Polyhedron and NNC_Polyhedron),
+  Grid,
+  Rational_Box,
+  BD_Shape<mpz_class>,
+  BD_Shape<mpq_class>,
+  Octagonal_Shape<mpz_class>,
+  Octagonal_Shape<mpq_class>,
+  Constraints_Product<C_Polyhedron, Grid>,
+  Pointset_Powerset<C_Polyhedron>,
+  Pointset_Powerset<NNC_Polyhedron>,
+
+plus, if the host architecture supports double precision floating point
+numbers conforming to the IEEE 754 standard,
+
+  Double_Box,
+  BD_Shape<double>,
+  Octagonal_Shape<double>.
+
+To enable a different set of instantiations, the configure option
+
+  --enable-instantiations=INSTANTIATIONS
+
+The list of of possibilities for the `INSTANTIATIONS' argument can be
+obtained by omitting the argument, i.e., with the configure option
+
+  --enable-instantiations
+
+Note that the stand-alone `Polyhedron' instantiation must be specified
+without any topology `C_' or `NNC_' as they are added automatically
+and both the domains `C_Polyhedron' and `NNC_Polyhedron' will be
+generated.
+
+
+6. Configuring for Optimized Performance
+----------------------------------------
+
+By default, the PPL is compiled with all the optimizations provided
+by the compiler that do not involve a space-speed tradeoff (a.k.a.
+-O2 optimization).  The same optimization level can be obtained by
+using the configure options
+
+  --enable-optimization
+or
+  --enable-optimization=standard
+
+You can try to squeeze more speed from your compiler by using the
+`--enable-optimization=speed' compiler option (a.k.a. -O3
+optimization): this is recommended if you use the checked integers
+coefficients, even though it does not come with an 100% guarantee of
+extra performance.  With the `--enable-optimization=sspeed'
+optimization even more optimization is requested, possibly at the cost
+of making debugging impossible on some machines.  The
+`--enable-optimization=size' configure option instructs the compiler
+to optimize for size and for speed, but only for speed improvements do
+not increase code size.
+
+Further optimization can be requested at the expense of portability
+of the generated code.  This can be achieved by means of the configure option
+
+  --enable-arch[=ARCH]
+
+If the ARCH argument is omitted the configure script attempts to
+detect the architecture of the system.  Allowed values for ARCH can be
+found in the documentation of the `-march' option of the used C/C++
+compiler.
+
+For floating point computations, the option
+
+  --enable-fpmath=INSTRUCTION_SET
+
+allows for selecting, on the IA32 and x86_64, the floating point instruction
+set.  The allowed values for INSTRUCTION_SET are `sse', `sse2', `387,
+`sse+387', and `sse2+387', `default', and `no'.  The latter option, which
+is equivalent to specifying `--disable-fpmath', has the effect of disabling
+all floating point computation and, consequently, all the numerical
+abstractions based on floating point numbers.
+
+On the other hand, there are configure options to request lesser
+degrees of optimization for the sake of debugging.  These are,
+in decreasing order of optimization, `--enable-optimization=mild'
+(a.k.a. -O1 optimization), `--enable-optimization=no' or, equivalently
+`--disable-optimization', and `--enable-optimization=zero'
+(a.k.a. -O0 optimization).  See below for more information on the
+configure options that are useful for debugging purposes.
+
+
+7. Advanced Performance Tuning
+------------------------------
+
+Starting from version 1.0, the library fully supports two different
+representations for rows (i.e., sequences of coefficients):
+
+  - the "dense" representation is an array-like representation tailored
+    to sequences having most of their coefficients different from zero;
+
+  - the "sparse" representation saves memory space (as well as CPU
+    cycles) when most of the coefficients in the sequence are zero.
+
+A generic interface allows for a seamless interaction between the
+dense and the sparse row representation. Most library entities (linear
+expressions, constraints, generators, congruences, and their systems)
+can be built using either representation, specified as a constructor's
+argument. Reasonable default values for the row representation are
+provided for each library entity, automatically leading to significant
+memory space savings even in old client/library code, e.g., when
+dealing with constraint systems describing weakly relational
+abstractions such as boxes and octagonal shapes.
+
+If desired, these default values can be customized to user's needs by
+changing just a few lines of library code. For instance, the
+constraint systems stored inside C_Polyhedron and NNC_Polyhedron
+objects can be made to use the sparse representation by just changing
+the following line in Polyhedron_defs.hh:
+
+  static const Representation default_con_sys_repr = DENSE;
+
+to become
+
+  static const Representation default_con_sys_repr = SPARSE;
+
+
+8. Configuring for Debugging
+----------------------------
+
+By default, the PPL is configured with debugging information enabled.
+In case you are absolutely, definitely, positively sure that you will
+not need to engage in debugging sessions and wish to save some little
+disk space and compilation time/memory you can configure with the
+`--disable-debugging' option.
+
+When the results you obtain with the PPL surprise you and make you think
+there might be a bug somewhere, it is a good idea to build a version
+of the library using the `--enable-assertions' configure option.  This
+causes many run-time assertions to be checked and often result in the
+easier identification of bugs in your application or the library itself.
+Even more run-time assertions can be enabled with the
+`--enable-more-assertions': this causes some PPL objects to carry
+additional data fields for the purpose of making extra checks possible.
+Of course, this breaks the ABI of the library, so you should recompile
+the part of your application that depends on the PPL.
+
+If you are disappointed by performance of the library and would like
+to check where the computation time is being spent, you can use the
+`--enable-profiling' option to generate a version that writes profile
+information suitable for the `gprof' analysis program.
+
+The `--enable-valgrind-tests' causes most of the tests run by `make check'
+under Valgrind's Memcheck tool.  This will show you if the library has
+memory leaks.  At release time, we guarantee that Memcheck does not
+reveal any memory leak for tests using the C++ and the C interfaces.
+We are not able to make a similar guarantee for other interfaces because
+the corresponding language implementations (e.g., OCaml and SWI-Prolog)
+purposely do not deallocate all memory on exit.
+
+In order to assess the coverage of the PPL test suite, the
+`--enable-coverage' configure option is provided.  This causes instrumented
+code to be used in conjunction with the `gcov' coverage testing tool.
+
+
+9. Programs that Come with the Library
+--------------------------------------
+
+The PPL is shipped with two programs that are interesting per se, and
+allow to sanity-check the build as well as to obtain performance
+comparisons.  The first such program is `ppl_lpsol', which offers some
+of the functionality of GLPK's `glpsol' using the service of the
+PPL, including its simplex solver.  Since `ppl_lpsol' uses GLPK's
+input routines, it is only built if a suitable version of GLPK is
+available.  If you prefer `ppl_lpsol' not to be built, use the
+configure option
+
+  --disable-ppl_lpsol
+
+Another program that is built by default and is used for regression
+testing and build validation is `ppl_lcdd'.  This is a program for
+vertex/facet enumeration, accepting the same input format as the
+similar programs shipped with cddlib and lrslib.  If you prefer `ppl_lcdd'
+not to be built, use the configure option
+
+  --disable-ppl_lcdd
+
+Disabling these programs will shorten the compilation time by a few
+seconds, and the time spent in `make check' by a dozen of minutes.
+In exchange, you will give up an important opportunity to discover
+whether the version of PPL you have built has been miscompiled.
+
+
+10. Using the Git Sources
+-------------------------
+
+If you use the Git sources, then you need recent versions of Autoconf
+Automake and Libtool installed.  After a `git clone' or `git pull'
+you should run the `autoreconf' command.  In case you have fiddled
+around with some of the configuration files, or if you have problems
+you cannot explain otherwise, use `autoreconf -f'.
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/README.solaris b/README.solaris
new file mode 100644
index 0000000..f940c14
--- /dev/null
+++ b/README.solaris
@@ -0,0 +1,50 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library on Solaris
+=======================================================
+
+Build problems have been reported for Solaris 10, affecting the build
+of the (C, Java, ...) language interfaces, which are due to the use of an
+incompatible version of sed:
+
+  https://www.cs.unipr.it/mantis/view.php?id=103
+
+The solution is to install and use GNU sed.
+This is recommended, even if only the C++ language interface is used.
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/STANDARDS b/STANDARDS
new file mode 100644
index 0000000..a73e161
--- /dev/null
+++ b/STANDARDS
@@ -0,0 +1,739 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+Coding Standards for the Parma Polyhedra Library
+================================================
+
+Please read the first chapters of "Ada 95 Quality and Style:
+Guidelines for Professional Programmers" (you will find a link to it
+in the "Links" section of the PPL web site).
+
+
+Names
+-----
+
+Carefully choose names that clarify the nature or the intended use of
+the entity you are naming.  Do not be afraid of long identifiers, even
+though conciseness is always a good thing.  Do not use abbreviations
+when shorter synonyms exist.  Use underscores to separate words in a
+compound name.  By all means, avoid baStudlyCaps: write
+available_widening_tokens (if it is a variable) or
+Available_Widening_Tokens (if it is a class or enum); never write
+availableWideningTokens or AvailableWideningTokens.
+In general, we use:
+
+  lower_case for variables, methods, functions, typedefs;
+  UPPER_CASE for macros and enum values;
+  Mixed_Case for class names and template parameter names.
+
+
+Pre and post increment and decrement operators
+----------------------------------------------
+
+All other things being equal, always prefer preincrement and
+predecrement to postincrement and postdecrement.
+
+
+Swap specialization
+-------------------
+
+All library types should provide a publicly available swap method.
+Whenever appropriate for ensuring efficiency, the generic std::swap
+algorithm should be specialized to use the swap method.
+
+
+Limiting the visibility of variables, functions, macros and so forth
+--------------------------------------------------------------------
+
+Avoid using the keyword `static' to specify that global variables or
+functions should be visible only inside the current translation unit;
+use the anonymous namespace, instead. The keyword `static' should
+only appear inside class definitions or function bodies. As an example,
+
+static const char* s = "Not accessible by other translation units";
+
+static void f() {
+  // ... function body ...
+}
+
+should be replaced by
+
+namespace {
+
+const char* s = "Not accessible by other translation units";
+
+void f() {
+  // ... function body ...
+}
+
+} // namespace
+
+However, do not use anonymous namespaces in a header file
+(any file that is meant to be included in other translation units).
+Instead, define and use a new non-anonymous namespace that should
+be placed inside the namespace
+
+    Parma_Polyhedra_Library::Implementation
+
+Concerning macros and the implementation languages (such as C and Prolog)
+that have a flat identifiers namespace, make sure the library limits
+its impact as much as possible by naming objects in a conspicuous way
+and by limiting as much as possible the scope of declarations.
+This means
+
+- all C and C++ macros should have names prefixed by `PPL_';
+  those that are not meant to be directly accessible by the user should
+  be #undef'ed as soon as possible in the source file they are defined in;
+- all functions and types declared by the C interface should have
+  names prefixed by `ppl_';
+- all Prolog predicates declared by the Prolog interfaces should have
+  names prefixed by `ppl_'.
+
+
+Macros
+------
+
+Macros should be used only if really needed (in many cases, macros can
+be replaced by inline functions).
+
+
+Block closures
+--------------
+
+Try to make clear what is being closed.  For example:
+
+1)
+
+namespace Parma_Polyhedra_Library {
+
+...
+
+} // namespace Parma_Polyhedra_Library
+
+2)
+
+extern "C" {
+
+...
+
+} // extern "C"
+
+3)
+
+#ifndef PPL_Class_defs_hh
+
+...
+
+#endif // !defined(PPL_Class_defs_hh)
+
+
+Negation
+--------
+
+Use `!' to negate a value.
+
+For example, use
+
+        if (!ph.is_empty())
+           std::cout << "ph contains at least one point" << endl;
+
+instead of
+
+        if (ph.is_empty() == false)
+           std::cout << "ph contains at least one point" << endl;
+
+
+Comparison with zero
+--------------------
+
+Be explicit when comparing a value with zero in a conditional context.
+
+For example, use
+
+        assert(sys.num_rows() != 0);
+
+instead of
+
+        assert(sys.num_rows());
+
+
+Formatting Conventions
+======================
+
+Indent each level using two spaces.
+Insert a space: after each comma, before and after each operator, after
+if/do/while keywords. As an exception to this rule, spaces can be omitted near
+arithmetic multiplication and division operator, if they would harm
+readability.
+Don't insert spaces between the name of a function and the following
+parenthesis.
+Braces should be cuddled on the preceding/following line.
+Avoid, when possible, source lines longer than 78 characters.
+In a function declaration, the return type of a function and the modifiers
+must be placed alone in one line.
+In pointer and reference types, the * and & characters should be followed, but
+not preceded, by a space.
+
+This is bad:
+
+inline void C::f(int *x,int y)
+{
+if( x!=0 )
+{
+    int &z=y;
+    foo (x / 2+y * 3,z/bar(5));
+}
+}
+
+This is good:
+
+inline void
+C::f(int* x, int y) {
+  if (x != 0) {
+    int& z = y;
+    foo(x/2 + y*3, z / bar(5));
+  }
+}
+
+
+Namespace indentation
+---------------------
+
+The entire library is in its own namespace.  We sometimes specialize
+std::swap() and std::iter_swap().  Other namespaces may be involved
+but only in restricted contexts.  Therefore, we have unindented
+namespace-level declarations, thus saving some precious horizontal
+space.  For example:
+
+namespace Parma_Polyhedra_Library {
+
+non-empty lines here start at column 0;
+
+} // namespace Parma_Polyhedra_Library
+
+If you use Emacs, you may want to put the following two lines in your
+.emacs:
+
+;; Disable indentation when in namespace blocks.
+(c-set-offset 'innamespace 0)
+
+
+Trailing whitespace
+-------------------
+
+Always avoid trailing whitespace.
+If you use Emacs, then all the trailing whitespace in the current
+buffer can be removed by using the command
+
+  M-x delete-trailing-whitespace
+
+If you keep inserting trailing whitespace when coding, then you may
+want to put the following two lines in your .emacs:
+
+;; Show trailing whitespace.
+(setq-default show-trailing-whitespace t)
+
+
+Standards for Structuring the Source Code in Files
+==================================================
+
+Source code should be organized so as to ensure that:
+  - the contents of a file are strongly related;
+  - each file is of manageable size.
+
+As a rule of thumb, each type (class, struct, class template, etc.)
+named `Xtype' that is relevant on its own for the user or the
+developer of the library should be provided with a set of source files
+whose filenames start with `Xtype'. The source files for such a type
+should be named and populated as follows:
+
+a) Xtype_types.hh
+Contains the forward declarations of type names (in particular, the
+one for `Xtype') and other useful typedef's.
+
+b) Xtype_defs.hh
+Contains the definition of the type, together with the declaration of
+any function that, even though not being formally part of the type, is
+nonetheless related to it and should therefore be considered part of
+its interface.
+
+c) Xtype_inlines.hh
+Contains the definitions of inline functions.
+
+d) Xtype_templates.hh
+Contains the non-inline definitions of all class template members and
+all (member or non-member) function templates that are not fully
+specialized.
+
+e) Xtype.cc
+Contains the definitions of non-inline functions, including non-inline
+full specializations of templates.
+
+f) When appropriate, further *.cc files can be used to split huge
+source files into more manageable components (e.g., see the files
+Polyhedron_public.cc, Polyhedron_nonpublic.cc, Polyhedron_chdims.cc
+and Polyhedron_widenings.cc, or even conversion.cc, minimize.cc, etc.).
+
+Note that:
+  - all interface functions should be declared in Xtype_defs.hh;
+  - no function definition should be placed in Xtype_defs.hh;
+  - bare declarations should not be declared inline (i.e., inline directives
+    should be placed only in front of the definition of the functions);
+  - inner classes are usually kept in the same files as the outer class;
+  - functions having the anonymous namespace scope can be (and usually are)
+    only declared and defined in file Xtype.cc, regardless of whether or not
+    the inline directive is specified.
+
+
+Standards for Writing the Makefile.am Files
+===========================================
+
+How to clean what
+-----------------
+
+Cleaning in this context means removing files from the build directory.
+In order to clean files, they must be listed in one of three variables:
+MOSTLYCLEANFILES, CLEANFILES and DISTCLEANFILES.  The rules (believed to
+have been first formulated by Francois Pinard) are:
+
+  - If `make' built the file, and it is commonly something that one would
+    want to rebuild (such as an object file), then list the file in
+    MOSTLYCLEANFILES.
+  - Otherwise, if `make' built the file, then list it in CLEANFILES.
+  - Otherwise, if `configure' built the file, then list it in DISTCLEANFILES.
+
+When cleaning is more complex than a simple deletion, you can use the hooks
+mostlyclean-local, clean-local and distclean-local.
+
+
+Standards for Documenting the Project with Doxygen
+==================================================
+
+1) All code entities (classes, structs, enums, variables, methods,
+   functions, etc.) should be provided with a brief Doxygen comment.
+   Brief comments are normally obtained as follows:
+
+     //! Brief comment for class C.
+     class C {
+       ...
+     };
+
+   If the comment is multi-line, then the following syntax should be adopted:
+
+     /*! \brief
+       A brief comment for class C, that is a bit too long
+       to be placed in a single line.
+     */
+     class C {
+       ...
+     };
+
+2) A *friend* declaration of a function should NOT be provided with
+   a Doxygen comment. Rather, it is the very declaration of the function
+   (which should be found outside of the class) that has to be documented.
+
+3) When needed or useful, brief comments should be followed by detailed
+   Doxygen comments. If the brief comment spans a single line of text, then
+   the following syntax can be adopted:
+
+     //! Brief comment for class C.
+     /*!
+       More details on class C.
+       Even more details.
+     */
+     class C {
+       ...
+     };
+
+   Otherwise, if the brief comment spans multiple lines of text, the
+   following syntax should be adopted, where the brief and the detailed
+   documentation are merged in a single multiline comment block:
+
+     /*! \brief
+       Brief comment for class C.
+
+       More details on class C.
+       Even more details.
+     */
+     class C {
+       ...
+     };
+
+   The first paragraph break (in this case, the empty line) marks the
+   separation between the brief and the detailed part. Note that
+   all the uses of \param, \result and \exception special commands
+   will automatically cause a paragraph break, therefore starting
+   the detailed part. This will happen even when using the //! style
+   documentation blocks.
+
+4) In the produced documentation, the brief comment will be
+   automatically repeated just before the detailed comment,
+   so that bare repetitions should be avoided.
+
+5) In the source files, detailed comments should be placed together
+   with the brief ones, so that all the documentation pertinent to a
+   code entity is kept in a single file (typically, the *_defs.hh file).
+
+6) Brief Doxygen comments should be brief (indeed).
+   If more than two lines are required, then the comment should be
+   split into a brief part and a detailed part.
+
+7) Code entities or details that should not be visible to the end-user
+   (but that are useful for the developers) should be surrounded by
+
+     #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+        //! ... Doxygen comments ...
+     #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+   so that they will only appear in the developer's reference.
+   Note that the above preprocessing flags are not necessary
+   (and should therefore be avoided) when documenting:
+    - a private member of a class (because private members never
+      appear in the user manual);
+    - a public member of a class that is not documented
+      (because even the documented members of an undocumented
+      class are automatically filtered out of the user manual).
+
+8) Merging multiple comment blocks is not (fully) supported by Doxygen.
+   Thus, the technique described in point 4) above is useless
+   when we want an end-user comment block to be integrated,
+   in the developer's reference only, by further comments.
+   In such a case, a single comment block should be used as follows:
+
+     /*!
+       ... Doxygen comments for both user and developer ...
+       \if Include_Implementation_Details
+       ... Doxygen comments for developer only ...
+       \endif
+       ... Doxygen comments for both user and developer ...
+     */
+
+9) The documentation of those functions that are neither methods
+   nor friends of a given class, but are related in some way to that
+   class, should be made part of the documentation of the class.
+   This is obtained by using the Doxygen \relates special command
+   as follows:
+
+     /*! \relates Classname */
+
+   It seems that, in order to correctly match function declarations
+   and definitions, the \relates command should be placed in both places.
+   Typically, this will be the only kind of Doxygen command
+   occurring in *_inlines.hh and *.cc source files.
+
+   If Classname is a template class, the arguments of the template
+   (as well as the angle brackets) should be omitted.
+   The namespace qualification of the class can be omitted, provided
+   the comment block is included in the namespace scope.
+
+10)
+  If the \return or \param special commands are used, then these have to
+  be placed after the brief Doxygen comment.  The \return special
+  command, if present, should come before any \param command.  The
+  \exception special command, if present, should come after any \param
+  command. All the parameters of the function should be provided by the
+  corresponding \param command, respecting their textual order,
+  separating them with a blank line.  The documentation of each
+  parameter should start at the line immediately following the \param
+  command.  Typically, the list of parameters should be formatted as
+  follows, where the \return command is optional.
+
+  /*! \brief
+    The brief description.
+
+    The detailed description, if any.
+
+    \return
+    Documentation for the return value, if provided.
+
+    \param p1
+    Documentation for p1;
+
+    \param p2
+    Documentation for p2;
+    other documentation for p2;
+
+    \param p3
+    Documentation for p3.
+
+    \exception exception_type1
+    Documentation for the exceptions of type exception_type1;
+
+    \exception exception_type2
+    Documentation for the exceptions of type exception_type2.
+
+    Another piece of detailed description, if needed.
+  */
+  int foo(const bar& p1, const bar& p2, int p3);
+
+
+Standards for the Test Programs
+===============================
+
+o  Include the header file `ppl_test.hh' to include common declarations
+   for test code (see below).
+
+o  Place the test code in test functions that return a Boolean value.
+   Name the test functions test01, test02, etc.
+
+o  Each test program should contain no more than 20 test functions.
+
+o  The test functions should be written
+
+        // Comment describing the test...
+        bool
+        test10() {
+            // ... test code ...
+        }
+
+   where the 10 in `test10' indicates that it is the 10th test function
+   in the program.
+
+o  The test functions should return true if the test succeeds and false
+   if it fails.
+
+o  If a test requires auxiliary functions and/or classes, put them
+   in a namespace named, e.g., `test10_namespace', which in turn is
+   within the anonymous namespace.
+
+o  Following all the test functions, include:
+
+        BEGIN_MAIN
+          DO_TEST(test01);
+          DO_TEST(test02);
+          ...
+        END_MAIN
+
+   where every test function in the program is included in the list.
+
+o  If any of the tests is known to fail due to an overflow when the
+   library is configured to use some of the bounded-precision checked
+   integers, then the corresponding test function should be called,
+   e.g., as follows
+
+          DO_TEST_F32(test07);
+
+   where the subscript "_F32" means that the overflow is expected for
+   all checked integers having 32 bits at most (i.e., 64 bits checked
+   integers are not expected to overflow). As an alternative,
+
+          DO_TEST_F32A(test07);
+
+   means that the overflow is expected, as before, for all checked
+   integers having less than 32 bits but in the case of 32 bits checked
+   integers the overflow occurs only if assertions are enabled.
+   Hence, the possible subscripts for DO_TEST are:
+
+          _F8A, _F8, _F16A, _F16, _F32A, _F32, _F64A, _F64.
+
+o  If any of the tests _may_ fail due to an overflow (when the library
+   is configured to use some of the bounded-precision checked integers)
+   when a templatic shape domain is instantiated using inexact
+   coefficients (e.g., the typedef TBD_Shape stands for BD_Shape<float>),
+   then the corresponding test function should be called as follows
+
+          DO_TEST_MAY_OVERFLOW_IF_INEXACT(test07, TBD_Shape);
+
+o  If a definite overflow (i.e., independent from exactness) is expected
+   for some of the coefficient sizes, then the two macro names above
+   can be combined, e.g., as follows
+
+          DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test07, TBD_Shape);
+
+   meaning that the overflow is expected for 16 (or fewer) bits
+   configurations, while it may occur for configurations using more bits
+   if the shape domain is instantiated usng inexact coefficients.
+
+o  Normally, test code should produce no output at all (independently from
+   whether the test succeeded or failed). Output is only meant to help
+   during debugging. In order to support for the coding of conditional
+   output, the header file `ppl_test.hh' defines the output streams `nout'
+   and `vnout'. By default, any output directed to these streams will be
+   simply discarded. For example,
+
+        nout << "A message when noisy." << endl;
+        vnout << "A message when very noisy." << endl;
+
+   will produce no output at all. By default, the helper print functions
+   (e.g., print_constraints, print_generators, etc.) are directed to
+   stream `nout', so that they will normally discard the output too.
+
+o  By defining the environment variables `PPL_NOISY_TESTS' and/or
+   `PPL_VERY_NOISY_TESTS' to any value, the streams `nout' and `vnout'
+   will be redirected to standard output and become noisy.
+
+o  On very weird platforms the above mechanism may not be supported.
+   In these rare cases, the same effect can be obtained by defining
+   the preprocessor variables NOISY and/or VERY_NOISY to any value other
+   than zero and recompiling the test program.  Thus, if some output is
+   (locally and temporarily) needed for debugging purposes, one option
+   is to add
+
+      #define NOISY 1
+      #define VERY_NOISY 1
+
+   as the very first line of the test source file and recompile it.
+
+o  To avoid repeated namespace qualifications, the header file `ppl_test.hh'
+   adds a using directive for the whole PPL namespace. It also adds a
+   using declaration for `std::endl'. All the other objects defined in
+   the namespace `std' should be explicitly qualified in the test files
+   (typically, by adding a corresponding using declaration).
+
+o  If PPL stream input and output is required, then an explicit using
+   directive for the Parma_Polyhedra_Library::IO_Operators namespace
+   should be added to the test file.
+
+o  Refer to the existing tests for examples. Many tests are written along
+   the following schema:
+     a) create a PPL object and perform some computations with it;
+     b) create a second object in a different (maybe simpler) way, having
+        as value the expected result of the computations done in point a);
+     c) check for equivalence of the two objects.
+
+o  Ideally the tests should exercise every line of code in the library.
+   To help ensure that, the test-coverage facilities provided by GCC
+   are very useful.  They are described in Chapter 9 of the GCC manual
+   ("`gcov'---a Test Coverage Program").  For a simpler user interaction
+   with gcov, also including the generation of nicer HTML output, the
+   adoption of `lcov' is recommended (LCOV, the Linux Test Project GCOV
+   extension, http://ltp.sourceforge.net/coverage/lcov.php).
+   Here we summarize the steps needed to produce coverage information
+   using `lcov' (see below for a few hints on the direct use of `gcov').
+   The build tree under test must be configured with the
+   `--enable-coverage' and `--disable-optimization' options (and possibly
+   also with --enable-profiling). Furthermore, according to this thread
+       http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12076
+   GCC performs NRV (Named Return Value) transformations even when
+   optimizations are turned off; hence, to avoid spurious zero counts
+   in return statements, the compilation flag `-fno-elide-constructors'
+   is recommended. For example:
+
+     $ configure --enable-coverage --enable-profiling \
+         --disable-optimization --with-cxxflags='-fno-elide-constructors' \
+         --enable-assertions --enable-more-assertions
+
+   Running the tests (with `make check') produces many .gcno and .gcda
+   files in src/.libs and in the test directories.  These are data
+   files for the `gcov' program. All the coverage data produced can be
+   automatically collected by `lcov' using the following command:
+
+     $ lcov --directory . --capture --output-file ppl-lcov.info
+
+   To generate HTML pages with the graphical view of the captured data,
+   use the `genhtml' command:
+
+     $ genhtml ppl-lcov.info --output-directory ppl-lcov-html
+
+   Coverage info can now be seen by pointing your favorite browser to
+   file ppl-lcov-html/index.html. The annotated sources will look like
+   the following (plus color information), where the value on the left
+   hand side of the colon is the number of executions of the corresponding
+   line of code (see also below on the use of coverage counters):
+
+    1636 :   PPL_DIRTY_TEMP(N, sum);
+    9828 :   for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    6556 :     const DB_Row<N>& x_dbm_k = x.dbm[k];
+   39648 :     for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+   26536 :       DB_Row<N>& x_dbm_i = x.dbm[i];
+   26536 :       const N& x_dbm_i_k = x_dbm_i[k];
+   26536 :       if (!is_plus_infinity(x_dbm_i_k))
+   55128 :         for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+   36904 :           const N& x_dbm_k_j = x_dbm_k[j];
+   36904 :           if (!is_plus_infinity(x_dbm_k_j)) {
+         :             // Rounding upward for correctness.
+   12136 :             add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+   12136 :             min_assign(x_dbm_i[j], sum);
+         :           }
+         :         }
+         :     }
+         :   }
+
+   Note that the collection of coverage information is incremental:
+   running again any tests will add to coverage counters (in order
+   to see the changes, coverage data has to be re-captured using the
+   `lcov' command and HTML pages re-generated using the `genhtml' command).
+   Coverage counters can be reset to zero by issuing the command:
+
+     $ lcov --directory . --zerocounters
+
+   As said above, `lcov' is just a wrapper on top of `gcov'. The direct
+   use of `gcov' produces plain-text based coverage information.
+   For example:
+
+     $ cd src
+     $ gcov -o .libs Grid_public.cc
+
+   will produce a file called Grid_public.cc.gcov containing the
+   coverage information for Grid_public.cc.  In a similar way
+
+     $ cd tests/Grid
+     $ gcov *.cc
+
+   will produce a file call tests/Grid/ppl.hh.gcov containing coverage
+   information for the header files.
+
+   Below is a section from a .gcov file.  The first column is the
+   number of times the line was run, the second is the line number of the
+   line in the source file.  Line 1006 has been run 48245 times.  Lines
+   1007, 1002 and 1013 have yet to be run.  It would be very difficult
+   to run line 1007, since this requires a Linear_System that does not
+   satisfy the invariants for its class and the PPL does everything it
+   can to make that impossible without fiddling with memory using raw
+   memory pointers.  Similarly for line 1013.  However, the fact that
+   line 1012 has never been run is suspicious and may indicate an area
+   that needs testing.
+
+        -: 1001:bool
+    48245: 1002:PPL::Generator_System::OK() const {
+        -: 1003:  // A Generator_System must be a valid Linear_System; do not check for
+        -: 1004:  // strong normalization, since this will be done when
+        -: 1005:  // checking each individual generator.
+    48245: 1006:  if (!Linear_System::OK(false))
+    #####: 1007:    return false;
+        -: 1008:
+        -: 1009:  // Checking each generator in the system.
+    48245: 1010:  const Generator_System& x = *this;
+    96490: 1011:  for (dimension_type i = num_rows(); i-- > 0; )
+    #####: 1012:    if (!x[i].OK())
+    #####: 1013:      return false;
+        -: 1014:
+        -: 1015:  // All checks passed.
+    48245: 1016:  return true;
+        -: 1017:}
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..4c74e74
--- /dev/null
+++ b/TODO
@@ -0,0 +1,111 @@
+
+Enhancements for PPL 1.1 or later versions
+==========================================
+
+- Make all the *affine*image() methods uniform as far as the
+  specification is concerned.
+- Add the domains of bounded integers and affine spaces.
+- Intervals are best instantiated with checked numbers with
+  particular policies: review all the interfaced boxes,
+  augment the testsuite, and update the documentation.
+- Make the library thread-safe.
+- Modify the Makefile.am's to extend silent mode to our own rules.
+- Reduce the number of FIXMEs to no more than 20.
+- Base the OCaml interface on Zarith
+  (http://forge.ocamlcore.org/projects/zarith/) instead of MLGMP.
+- Improve the OCaml interface by supporting dynamic loading.
+- Enhance the support for systems not providing support for the IEEE
+  inexact flag.
+- `make check' in ppl_lpsol must run also the incremental version
+  of the simplex solver.
+- Complete the implementation of the --enable-check configure option.
+  Explain it in README.configure.
+- Ensure the tests in tests/MIP_Problem/* cover every line of
+  code in MIP_Problem.*.
+- Suppose we want to sum three numbers, and suppose we do it by
+
+    add(T& to, const T& x, const T& y, const T& z) {
+      add(to, x, y);
+      add(to, to, z);
+    }
+
+  Now suppose that &to == &z, so that we compute the wrong result.
+  Perform a code audit to ensure that the above situation never happens.
+  In order to ensure that, ensure that the following rule (to be added
+  to STANDARDS) is always obeyed:
+
+    if an argument of type T and passed by reference is changed,
+    after the change no argument of type U and passed by const or
+    non-const reference should be read unless U is incompatible with T
+    or we are otherwise 100% sure that the changed argument and the
+    argument that is read afterward are not aliases (in the latter
+    case an assert(&to != &z) shall be added.
+- Improve the handling of the --enable-instantiations configure
+  option so that "closure by subdomain" is automatically implemented
+  (e.g., if Pointset_Powerset(X) is specified, X should be automatically
+  added in case it is not already present).
+- Add a "quick assign" function to checked numbers that allows
+  to efficiently assign small integer constants (like those in
+  the range [-2, 2]) that are guaranteed not to cause any
+  rounding or overflow problems.
+- Consider whether or not our interface for method time_elapse_assign()
+  is the one needed by users: in particular, see if it should take as
+  an argument a generator system, instead of an abstract element.
+- Provide a generic implementation for the `widening with tokens'.
+- Implement the extrapolation operators defined in HenzingerH95
+  and HenzingerPW01.
+- Implement void Polyhedron::envelope_assign(const Polyhedron& y).
+- Provide support for strict inequalities in MIP problems.
+- Pointset_Powerset and Partially_Reduced_Product domains:
+  Improve and add to the existing methods for the powerset and product domains
+  so that they can be subdomains of themselves and of each other;
+  tidy the tests directories for these domains and ensure the code
+  with all likely instantiations is fully tested;
+  add the same functionaity to the C, Java, OCaml and Prolog interfaces.
+- Any_Pointset domain: check the interface for lacking or useless methods.
+
+
+Enhancements for PPL 1.2 or later versions
+==========================================
+
+- Find a way to let the GMP and checked-int versions of the PPL coexist
+  so as to allow using them in the same application.
+- Provide methods computing approximations of the integer convex hull
+  of semantic domains for the case where we are only interested in integral
+  solutions (as is the case, e.g., in many program analyses).  Then
+  cutting-plane methods (Gomory, Chvatal, ...) allow to shrink polyhedra
+  still not losing any integral solution.
+  See http://bugseng.com/products/ppl/Documentation/bibliography#NemhauserW88
+  Check the work by Kent Andersen and Gerard Cornuejols on
+  reduce-and-split cuts.
+- Consider the addition of "constraint-only" methods (e.g., computing
+  projections and upper bounds using the MIP solver).
+- Consider extending the MIP solver to handle Parametric Integer
+  Programming.
+- In the OK() methods, instead of having all those #ifndef NDEBUG,
+  it is probably worthwhile to use a suitable defined `barf' stream
+  that does the right thing.
+- Using meta_programming.hh it is possible to define all the swap functions
+  "automatically".  Consider whether it is worth doing it.
+- Provide a single, generic implementation to replace all our status
+  classes.
+- Provide optimized implementations of Polyhedron::expand_dimension()
+  Polyhedron::fold_dimensions().
+- Add an implementation of Minkowski addition.  Check the algorithm
+  described in
+
+    K. Fukuda.
+    From the zonotope construction to the Minkowski addition
+    of convex polytopes.
+    J. Symbolic Comput., 38(4):1261-1272, 2004.
+
+
+
+Efficiency Issues
+=================
+
+- There must be a more efficient way to implement
+  bool Polyhedron::is_disjoint_from(const Polyhedron&).
+- There must be a more efficient way to compute convex differences.
+- Provide a better implementation of computing squares in MIP_Problem's
+  steepest-edge to avoid big numbers.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..c0d06d9
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1177 @@
+# generated automatically by aclocal 1.14 -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.14'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.14], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.14])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/ac_check_ciao.m4])
+m4_include([m4/ac_check_fpu_control.m4])
+m4_include([m4/ac_check_gmp.m4])
+m4_include([m4/ac_check_sicstus_prolog.m4])
+m4_include([m4/ac_check_swi_prolog.m4])
+m4_include([m4/ac_check_xsb_prolog.m4])
+m4_include([m4/ac_check_yap.m4])
+m4_include([m4/ac_cxx_attribute_weak.m4])
+m4_include([m4/ac_cxx_double_binary_format.m4])
+m4_include([m4/ac_cxx_float_binary_format.m4])
+m4_include([m4/ac_cxx_ieee_inexact_flag.m4])
+m4_include([m4/ac_cxx_limit_memory.m4])
+m4_include([m4/ac_cxx_long_double_binary_format.m4])
+m4_include([m4/ac_cxx_plain_char_is_signed.m4])
+m4_include([m4/ac_cxx_proper_long_double.m4])
+m4_include([m4/ac_cxx_zero_length_arrays.m4])
+m4_include([m4/ac_prog_jar.m4])
+m4_include([m4/ac_prog_java.m4])
+m4_include([m4/ac_prog_javac.m4])
+m4_include([m4/ac_prog_javah.m4])
+m4_include([m4/ac_text_md5sum.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([m4/m4.m4])
+m4_include([m4/ocaml.m4])
diff --git a/compile b/compile
new file mode 100755
index 0000000..531136b
--- /dev/null
+++ b/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey at cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..b79252d
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1558 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2013 Free Software Foundation, Inc.
+
+timestamp='2013-06-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2013 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	;;
+    or1k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    or32:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		case $UNAME_PROCESSOR in
+		    i386) UNAME_PROCESSOR=x86_64 ;;
+		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		esac
+	    fi
+	fi
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+	"4"
+#else
+	""
+#endif
+	); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..9e7e5bf
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,411 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+   floating point format.  */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#undef HAVE_DECL_FFS
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#undef HAVE_DECL_FMA
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+   */
+#undef HAVE_DECL_FMAF
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+   */
+#undef HAVE_DECL_FMAL
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+   */
+#undef HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETRUSAGE
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+   */
+#undef HAVE_DECL_RINTF
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+   */
+#undef HAVE_DECL_RINTL
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_AS
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_DATA
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_RSS
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+   don't. */
+#undef HAVE_DECL_RLIMIT_VMEM
+
+/* Define to 1 if you have the declaration of `setitimer', and to 0 if you
+   don't. */
+#undef HAVE_DECL_SETITIMER
+
+/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you
+   don't. */
+#undef HAVE_DECL_SETRLIMIT
+
+/* Define to 1 if you have the declaration of `sigaction', and to 0 if you
+   don't. */
+#undef HAVE_DECL_SIGACTION
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+   */
+#undef HAVE_DECL_STRTOD
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+   */
+#undef HAVE_DECL_STRTOF
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRTOLD
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRTOLL
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRTOULL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#undef HAVE_FENV_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+#undef HAVE_GLPK_GLPK_H
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#undef HAVE_GLPK_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#undef HAVE_INT_FAST16_T
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#undef HAVE_INT_FAST32_T
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#undef HAVE_INT_FAST64_T
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#undef HAVE_SIGINFO_T
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `timeval'. */
+#undef HAVE_TIMEVAL
+
+/* Define to 1 if typeof works with your compiler. */
+#undef HAVE_TYPEOF
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_T
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#undef HAVE_UINT_FAST16_T
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#undef HAVE_UINT_FAST32_T
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#undef HAVE_UINT_FAST64_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if `_mp_alloc' is a member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_ALLOC
+
+/* Define to 1 if `_mp_d' is a member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_D
+
+/* Define to 1 if `_mp_size' is a member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_SIZE
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* ABI-breaking extra assertions are enabled when this is defined. */
+#undef PPL_ABI_BREAKING_EXTRA_DEBUG
+
+/* Not zero if the FPU can be controlled. */
+#undef PPL_CAN_CONTROL_FPU
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+   */
+#undef PPL_CHECKED_INTEGERS
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#undef PPL_COEFFICIENT_BITS
+
+/* The integral type used to represent coefficients. */
+#undef PPL_COEFFICIENT_TYPE
+
+/* This contains the options with which `configure' was invoked. */
+#undef PPL_CONFIGURE_OPTIONS
+
+/* The unique code of the binary format of C++ doubles, if supported;
+   undefined otherwise. */
+#undef PPL_CXX_DOUBLE_BINARY_FORMAT
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#undef PPL_CXX_FLOAT_BINARY_FORMAT
+
+/* The unique code of the binary format of C++ long doubles, if supported;
+   undefined otherwise. */
+#undef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+/* Not zero if the the plain char type is signed. */
+#undef PPL_CXX_PLAIN_CHAR_IS_SIGNED
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+   range or precision than double. */
+#undef PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#undef PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+/* Not zero if the the IEEE inexact flag is supported in C++. */
+#undef PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+
+/* Not zero if it is possible to limit memory using setrlimit(). */
+#undef PPL_CXX_SUPPORTS_LIMITING_MEMORY
+
+/* Not zero if the C++ compiler supports zero_length arrays. */
+#undef PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+
+/* Defined if floating point arithmetic may use the 387 unit. */
+#undef PPL_FPMATH_MAY_USE_387
+
+/* Defined if floating point arithmetic may use the SSE instruction set. */
+#undef PPL_FPMATH_MAY_USE_SSE
+
+/* Defined if GLPK provides glp_term_hook(). */
+#undef PPL_GLPK_HAS_GLP_TERM_HOOK
+
+/* Defined if GLPK provides glp_term_out(). */
+#undef PPL_GLPK_HAS_GLP_TERM_OUT
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+#undef PPL_GLPK_HAS_LIB_SET_PRINT_HOOK
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+#undef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#undef PPL_GMP_INTEGERS
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#undef PPL_GMP_SUPPORTS_EXCEPTIONS
+
+/* Defined if the integral type to be used for coefficients is a native one.
+   */
+#undef PPL_NATIVE_INTEGERS
+
+/* Assertions are disabled when this is defined. */
+#undef PPL_NDEBUG
+
+/* Not zero if doubles are supported. */
+#undef PPL_SUPPORTED_DOUBLE
+
+/* Not zero if floats are supported. */
+#undef PPL_SUPPORTED_FLOAT
+
+/* Not zero if long doubles are supported. */
+#undef PPL_SUPPORTED_LONG_DOUBLE
+
+/* The size of `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of `fp', as computed by sizeof. */
+#undef SIZEOF_FP
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `int*', as computed by sizeof. */
+#undef SIZEOF_INTP
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The size of `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of `mp_limb_t', as computed by sizeof. */
+#undef SIZEOF_MP_LIMB_T
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* When defined and libstdc++ is used, it is used in debug mode. */
+#undef _GLIBCXX_DEBUG
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+#undef _GLIBCXX_DEBUG_PEDANTIC
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to __typeof__ if your compiler spells it that way. */
+#undef typeof
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+   pointer, if such a type exists, and if the system does not define it. */
+#undef uintptr_t
+
+
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+   we must make sure <stdint.h> is included before <sys/types.hh> is
+   (even indirectly) included.  Moreover we need to define
+   __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+   in order to have the macros defined also in C++.  */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+
diff --git a/config.rpath b/config.rpath
new file mode 100755
index 0000000..c547c68
--- /dev/null
+++ b/config.rpath
@@ -0,0 +1,666 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2007 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+#
+#   This file is free software; the Free Software Foundation gives
+#   unlimited permission to copy and/or distribute it, with or without
+#   modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    darwin*)
+      case $cc_basename in
+        xlc*)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    mingw* | cygwin* | pw32* | os2*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    newsos6)
+      ;;
+    linux* | k*bsd*-gnu)
+      case $cc_basename in
+        icc* | ecc*)
+          wl='-Wl,'
+          ;;
+        pgcc | pgf77 | pgf90)
+          wl='-Wl,'
+          ;;
+        ccc*)
+          wl='-Wl,'
+          ;;
+        como)
+          wl='-lopt='
+          ;;
+        *)
+          case `$CC -V 2>&1 | sed 5q` in
+            *Sun\ C*)
+              wl='-Wl,'
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    rdos*)
+      ;;
+    solaris*)
+      wl='-Wl,'
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      wl='-Wl,'
+      ;;
+    unicos*)
+      wl='-Wl,'
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # Set some defaults for GNU ld with shared library support. These
+  # are reset later if shared libraries are not supported. Putting them
+  # here allows them to be overridden if necessary.
+  # Unlike libtool, we use -rpath here, not --rpath, since the documented
+  # option of GNU ld is called -rpath, not --rpath.
+  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  case "$host_os" in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # Samuel A. Falvo II <kc5tja at dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we cannot use
+      # them.
+      ld_shlibs=no
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      ;;
+    gnu* | linux* | k*bsd*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+          ld_shlibs=no
+          ;;
+        *)
+          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+          else
+            ld_shlibs=no
+          fi
+          ;;
+      esac
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = no; then
+    hardcode_libdir_flag_spec=
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+          ;;
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            :
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+          ;;
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+    bsdi[45]*)
+      ;;
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      hardcode_direct=no
+      if test "$GCC" = yes ; then
+        :
+      else
+        case $cc_basename in
+          xlc*)
+            ;;
+          *)
+            ld_shlibs=no
+            ;;
+        esac
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+    freebsd2.2*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    freebsd2*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd* | dragonfly*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        hardcode_direct=yes
+        # hardcode_minus_L: Not really in the search PATH,
+        # but as the default location of the library.
+        hardcode_minus_L=yes
+      fi
+      ;;
+    hpux11*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct=no
+            ;;
+          *)
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+        hardcode_direct=yes
+        if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+          hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        else
+          case "$host_os" in
+            openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+              hardcode_libdir_flag_spec='-R$libdir'
+              ;;
+            *)
+              hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+              ;;
+          esac
+        fi
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      ;;
+    sysv5* | sco3.2v5* | sco5v6*)
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec=      # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    library_names_spec='$libname.a'
+    ;;
+  aix4* | aix5*)
+    library_names_spec='$libname$shrext'
+    ;;
+  amigaos*)
+    library_names_spec='$libname.a'
+    ;;
+  beos*)
+    library_names_spec='$libname$shrext'
+    ;;
+  bsdi[45]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  cygwin* | mingw* | pw32*)
+    shrext=.dll
+    library_names_spec='$libname.dll.a $libname.lib'
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    library_names_spec='$libname$shrext'
+    ;;
+  dgux*)
+    library_names_spec='$libname$shrext'
+    ;;
+  freebsd1*)
+    ;;
+  freebsd* | dragonfly*)
+    case "$host_os" in
+      freebsd[123]*)
+        library_names_spec='$libname$shrext$versuffix' ;;
+      *)
+        library_names_spec='$libname$shrext' ;;
+    esac
+    ;;
+  gnu*)
+    library_names_spec='$libname$shrext'
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case $host_cpu in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    library_names_spec='$libname$shrext'
+    ;;
+  interix[3-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  irix5* | irix6* | nonstopux*)
+    library_names_spec='$libname$shrext'
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux* | k*bsd*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  knetbsd*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  netbsd*)
+    library_names_spec='$libname$shrext'
+    ;;
+  newsos6)
+    library_names_spec='$libname$shrext'
+    ;;
+  nto-qnx*)
+    library_names_spec='$libname$shrext'
+    ;;
+  openbsd*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    library_names_spec='$libname.a'
+    ;;
+  osf3* | osf4* | osf5*)
+    library_names_spec='$libname$shrext'
+    ;;
+  rdos*)
+    ;;
+  solaris*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sunos4*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  sysv4 | sysv4.3*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv4*MP*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+    library_names_spec='$libname$shrext'
+    ;;
+  uts4*)
+    library_names_spec='$libname$shrext'
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..8b612ab
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1788 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2013 Free Software Foundation, Inc.
+
+timestamp='2013-04-24'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2013 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze*)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| be32 | be64 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
+	| ns16k | ns32k \
+	| open8 \
+	| or1k | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i386-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or1k-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..896c61f
--- /dev/null
+++ b/configure
@@ -0,0 +1,27096 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for the Parma Polyhedra Library 1.1.
+#
+# Report bugs to <ppl-devel at cs.unipr.it>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: ppl-devel at cs.unipr.it about your system, including any
+$0: error possibly output before this message. Then install
+$0: a modern shell, or manually run the script under such a
+$0: shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='the Parma Polyhedra Library'
+PACKAGE_TARNAME='ppl'
+PACKAGE_VERSION='1.1'
+PACKAGE_STRING='the Parma Polyhedra Library 1.1'
+PACKAGE_BUGREPORT='ppl-devel at cs.unipr.it'
+PACKAGE_URL=''
+
+ac_unique_file="src/Polyhedron_public.cc"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+mlgmp_dir
+required_instantiations_ocaml_cxx_objects
+required_instantiations_ocaml_cxx_sources
+required_instantiations_ocaml_cxx_headers
+required_instantiations_java_cxx_objects
+required_instantiations_java_cxx_sources
+required_instantiations_java_cxx_headers_sources
+required_instantiations_java_cxx_headers
+required_instantiations_java_classes
+required_instantiations_java_sources
+required_instantiations_prolog_generated_test_sources
+required_instantiations_prolog_cxx_objects
+required_instantiations_prolog_cxx_sources
+required_instantiations_prolog_cxx_headers
+required_instantiations_c_cxx_objects
+required_instantiations_c_cxx_sources
+required_instantiations_c_cxx_headers
+required_instantiations_canonical_names
+required_instantiations
+coefficient_mnemonic
+debug_flag
+extra_libraries
+extra_includes
+SHREXT
+LIBEXT
+HAVE_GLPK_FALSE
+HAVE_GLPK_TRUE
+TEXT_MD5SUM
+HAVE_MD5SUM_FALSE
+HAVE_MD5SUM_TRUE
+MD5SUM
+ENABLE_STATIC_FALSE
+ENABLE_STATIC_TRUE
+ENABLE_SHARED_FALSE
+ENABLE_SHARED_TRUE
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+LIBTOOL
+THOROUGH_MAKE_CHECK_FALSE
+THOROUGH_MAKE_CHECK_TRUE
+VALGRIND_TESTS_ENABLED_FALSE
+VALGRIND_TESTS_ENABLED_TRUE
+VALGRIND
+M4_DEBUGFILE
+M4
+BUILD_SOME_PROLOG_INTERFACES_FALSE
+BUILD_SOME_PROLOG_INTERFACES_TRUE
+BUILD_YAP_PROLOG_INTERFACE_FALSE
+BUILD_YAP_PROLOG_INTERFACE_TRUE
+YAP_PROLOG_LD_OPTIONS
+YAP_PROLOG_INCLUDE_OPTIONS
+YAP_PROLOG
+yap_prolog
+BUILD_XSB_PROLOG_INTERFACE_FALSE
+BUILD_XSB_PROLOG_INTERFACE_TRUE
+XSB_PROLOG_INCLUDE_OPTIONS
+xsb_prolog
+BUILD_SWI_PROLOG_INTERFACE_FALSE
+BUILD_SWI_PROLOG_INTERFACE_TRUE
+SWI_PROLOG_LD_OPTIONS
+SWI_PROLOG_INCLUDE_OPTIONS
+SWI_PROLOG_LD
+SWI_PROLOG
+swi_prolog_ld
+swi_prolog
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE
+SICSTUS_PROLOG_INCLUDE_OPTIONS
+sicstus_prolog
+BUILD_GNU_PROLOG_INTERFACE_FALSE
+BUILD_GNU_PROLOG_INTERFACE_TRUE
+GNU_PROLOG
+BUILD_CIAO_PROLOG_INTERFACE_FALSE
+BUILD_CIAO_PROLOG_INTERFACE_TRUE
+CIAO_PROLOG_INCLUDE_OPTIONS
+CIAO_PROLOG
+ciao_prolog
+BUILD_OCAML_INTERFACE_FALSE
+BUILD_OCAML_INTERFACE_TRUE
+HAVE_OCAMLOPT_FALSE
+HAVE_OCAMLOPT_TRUE
+HAVE_OCAMLC_FALSE
+HAVE_OCAMLC_TRUE
+OCAMLBUILD
+OCAMLDOC
+OCAMLMKLIB
+OCAMLMKTOP
+OCAMLDEP
+OCAMLOPTDOTOPT
+OCAMLCDOTOPT
+OCAMLBEST
+OCAMLOPT
+OCAMLLIB
+OCAMLVERSION
+OCAMLC
+BUILD_JAVA_INTERFACE_FALSE
+BUILD_JAVA_INTERFACE_TRUE
+JNIFLAGS
+JAVAH
+JAR
+uudecode
+JAVA
+JAVAC
+BUILD_C_INTERFACE_FALSE
+BUILD_C_INTERFACE_TRUE
+BUILD_CXX_INTERFACE_FALSE
+BUILD_CXX_INTERFACE_TRUE
+BUILD_DOCUMENTATION_FALSE
+BUILD_DOCUMENTATION_TRUE
+BUILD_PPL_PIPS_FALSE
+BUILD_PPL_PIPS_TRUE
+BUILD_PPL_LPSOL_FALSE
+BUILD_PPL_LPSOL_TRUE
+BUILD_PPL_LCDD_FALSE
+BUILD_PPL_LCDD_TRUE
+SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE
+SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE
+SUPPORTED_LONG_DOUBLE_FALSE
+SUPPORTED_LONG_DOUBLE_TRUE
+SUPPORTED_DOUBLE_FALSE
+SUPPORTED_DOUBLE_TRUE
+SUPPORTED_FLOAT_FALSE
+SUPPORTED_FLOAT_TRUE
+CAN_CONTROL_FPU_FALSE
+CAN_CONTROL_FPU_TRUE
+HAVE_PERL_FALSE
+HAVE_PERL_TRUE
+PERL
+CPP
+USE_INT64_FALSE
+USE_INT64_TRUE
+USE_INT32_FALSE
+USE_INT32_TRUE
+USE_INT16_FALSE
+USE_INT16_TRUE
+USE_INT8_FALSE
+USE_INT8_TRUE
+USE_GMP_INTEGERS_FALSE
+USE_GMP_INTEGERS_TRUE
+USE_CHECKED_INTEGERS_FALSE
+USE_CHECKED_INTEGERS_TRUE
+USE_NATIVE_INTEGERS_FALSE
+USE_NATIVE_INTEGERS_TRUE
+NO_UNDEFINED_FALSE
+NO_UNDEFINED_TRUE
+HOST_CPU_X86_64_FALSE
+HOST_CPU_X86_64_TRUE
+HOST_OS_SOLARIS_FALSE
+HOST_OS_SOLARIS_TRUE
+HOST_OS_MINGW_FALSE
+HOST_OS_MINGW_TRUE
+HOST_OS_HPUX_FALSE
+HOST_OS_HPUX_TRUE
+HOST_OS_DARWIN_FALSE
+HOST_OS_DARWIN_TRUE
+HOST_OS_CYGWIN_FALSE
+HOST_OS_CYGWIN_TRUE
+USE_PRECOMPILED_HEADERS_FALSE
+USE_PRECOMPILED_HEADERS_TRUE
+ASSERTIONS_ENABLED_FALSE
+ASSERTIONS_ENABLED_TRUE
+DEBUGGING_ENABLED_FALSE
+DEBUGGING_ENABLED_TRUE
+CXXCPP
+SED
+EGREP
+FGREP
+GREP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+ICC_FALSE
+ICC_TRUE
+GCC_FALSE
+GCC_TRUE
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+ISODATE
+CONFIGURE_OPTIONS
+PPL_VERSION_BETA
+PPL_VERSION_REVISION
+PPL_VERSION_MINOR
+PPL_VERSION_MAJOR
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+with_cc
+with_cxx
+enable_dependency_tracking
+enable_debugging
+enable_profiling
+enable_coverage
+enable_assertions
+enable_more_assertions
+enable_optimization
+enable_arch
+enable_fpmath
+enable_pch
+enable_coefficients
+with_cflags
+with_cxxflags
+with_gmp
+with_gmp_include
+with_gmp_lib
+with_gmp_build
+enable_ppl_lcdd
+enable_ppl_lpsol
+enable_ppl_pips
+enable_documentation
+enable_interfaces
+with_java
+with_mlgmp
+enable_instantiations
+enable_valgrind_tests
+enable_check
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+CPP
+M4'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures the Parma Polyhedra Library 1.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/ppl]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of the Parma Polyhedra Library 1.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --enable-debugging      compile with debugging information
+  --enable-profiling      compile for profiling
+  --enable-coverage       compile for test coverage
+  --enable-assertions     check run-time assertions
+  --enable-more-assertions
+                          break the ABI to check even more run-time assertions
+  --enable-optimization[=LEVEL]
+                          enable compiler optimizations
+  --enable-arch[=ARCH]    optimize for architecture ARCH
+  --enable-fpmath=INSTRUCTION_SET
+                          select floating point arithmetic
+  --enable-pch            use precompiled headers, if available
+  --enable-coefficients=TYPE
+                          select the type of the coefficients
+  --enable-ppl_lcdd       build the ppl_lcdd program
+  --enable-ppl_lpsol      build the ppl_lpsol program
+  --enable-ppl_pips       build the ppl_pips program
+  --enable-documentation  build the PPL documentation
+  --enable-interfaces=INTERFACES
+                          enable some or all the library interfaces
+  --enable-instantiations=INSTANTIATIONS
+                          enable instantiations for the non-C++ interfaces
+  --enable-valgrind-tests run library tests under Valgrind
+  --enable-check=KIND     select thorough or quick `make check'
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-cc=XXX           use XXX as the C compiler
+  --with-cxx=XXX          use XXX as the C++ compiler
+  --with-cflags=XXX       add XXX to the options for the C compiler
+  --with-cxxflags=XXX     add XXX to the options for the C++ compiler
+  --with-gmp=DIR          search for libgmp/libgmpxx in DIR/include and
+                          DIR/lib
+  --with-gmp-include=DIR  search for libgmp/libgmpxx headers in DIR
+  --with-gmp-lib=DIR      search for libgmp/libgmpxx library objects in DIR
+  --with-gmp-build=DIR    use a non-installed build of GMP in DIR
+  --with-java=DIR         use the Java SDK installed in DIR
+  --with-mlgmp=DIR        use the ML GMP package installed in DIR
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CXXCPP      C++ preprocessor
+  CPP         C preprocessor
+  M4          Location of GNU M4 1.4.5 or later. Defaults to the first program
+              of `m4', `gm4', or `gnum4' on PATH that meets Autoconf needs.
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <ppl-devel at cs.unipr.it>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+the Parma Polyhedra Library configure 1.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_cxx_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_mongrel
+
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
+# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
+# -----------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_cxx_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_decl
+
+# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
+# ---------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_cxx_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_type
+
+# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES
+# ----------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_cxx_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_compute_int
+
+# ac_fn_cxx_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ------------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_cxx_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_member
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by the Parma Polyhedra Library $as_me 1.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Minimum Autoconf version required.
+
+
+# Make sure the sources are there.
+
+
+# Specify the location of additional local Autoconf macros.
+
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+# Use Automake.
+am__api_version='1.14'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='ppl'
+ VERSION='1.1'
+
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+
+# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5
+$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; }
+      if test $am_uid -le $am_max_uid; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+         _am_tools=none
+      fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5
+$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; }
+      if test $am_gid -le $am_max_gid; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+        _am_tools=none
+      fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
+$as_echo_n "checking how to create a ustar tar archive... " >&6; }
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        { echo "$as_me:$LINENO: $_am_tar --version" >&5
+   ($_am_tar --version) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } && break
+      done
+      am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x ustar -w "$$tardir"'
+      am__tar_='pax -L -x ustar -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+      am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+      am__untar='cpio -i -H ustar -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_ustar}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
+   ($am__untar <conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+      { echo "$as_me:$LINENO: cat conftest.dir/file" >&5
+   (cat conftest.dir/file) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  if ${am_cv_prog_tar_ustar+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_prog_tar_ustar=$_am_tool
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
+$as_echo "$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+
+
+# Version number machinery.
+if test -n "`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`"
+then
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_REVISION=`expr $VERSION : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*\.[0-9]*pre\([0-9]*\)'`
+else
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_REVISION=0
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*pre\([0-9]*\)'`
+fi
+if test -z "$PPL_VERSION_BETA"
+then
+  PPL_VERSION_BETA=0
+fi
+
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CONFIGURE_OPTIONS "$ac_configure_args"
+_ACEOF
+
+PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
+
+
+# Generate a configuration header file.
+ac_config_headers="$ac_config_headers config.h"
+
+
+ISODATE=`date +%Y-%m-%d`
+
+
+
+
+
+
+
+# C compiler.
+
+
+# Check whether --with-cc was given.
+if test "${with_cc+set}" = set; then :
+  withval=$with_cc; CC=$with_cc
+fi
+
+
+# C++ compiler.
+
+
+# Check whether --with-cxx was given.
+if test "${with_cxx+set}" = set; then :
+  withval=$with_cxx; CXX=$with_cxx
+fi
+
+
+# Checks for programs.
+
+# Note that AC_PROG_CC must precede the first use of $GCC and AC_PROG_CXX
+# must precede the first use of $GXX.  Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+CFLAGS="$save_CFLAGS"
+
+ if test x"$GCC" = xyes; then
+  GCC_TRUE=
+  GCC_FALSE='#'
+else
+  GCC_TRUE='#'
+  GCC_FALSE=
+fi
+
+
+# The Intel C compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using the Intel C compiler" >&5
+$as_echo_n "checking whether we are actually using the Intel C compiler... " >&6; }
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ICC=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ICC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+ if test x"$ICC" = xyes; then
+  ICC_TRUE=
+  ICC_FALSE='#'
+else
+  ICC_TRUE='#'
+  ICC_FALSE=
+fi
+
+
+# The clang compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using clang" >&5
+$as_echo_n "checking whether we are actually using clang... " >&6; }
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifndef __clang__
+choke me
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  CLANG=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  CLANG=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+# The llvm-gcc compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using llvm-gcc" >&5
+$as_echo_n "checking whether we are actually using llvm-gcc... " >&6; }
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int main() {
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  LLVM_GCC=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  LLVM_GCC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS="$save_CFLAGS"
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+save_CXXFLAGS="$CXXFLAGS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+CXXFLAGS="$save_CXXFLAGS"
+
+# The Intel C++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using the Intel C++ compiler" >&5
+$as_echo_n "checking whether we are actually using the Intel C++ compiler... " >&6; }
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ICPC=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ICPC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+# The clang++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using clang++" >&5
+$as_echo_n "checking whether we are actually using clang++... " >&6; }
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifndef __clang__
+choke me
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  CLANGXX=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  CLANGXX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+# The llvm-++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are actually using llvm-g++" >&5
+$as_echo_n "checking whether we are actually using llvm-g++... " >&6; }
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int main() {
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  LLVM_GXX=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  LLVM_GXX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CXXFLAGS="$save_CXXFLAGS"
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+# Compilation flags.
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile with debug info" >&5
+$as_echo_n "checking whether to compile with debug info... " >&6; }
+# Check whether --enable-debugging was given.
+if test "${enable_debugging+set}" = set; then :
+  enableval=$enable_debugging;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  OPT_FLAGS="-g"
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-debugging, needs yes or no" "$LINENO" 5
+  ;;
+esac
+ if test x"$enableval" = xyes; then
+  DEBUGGING_ENABLED_TRUE=
+  DEBUGGING_ENABLED_FALSE='#'
+else
+  DEBUGGING_ENABLED_TRUE='#'
+  DEBUGGING_ENABLED_FALSE=
+fi
+
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile for profiling" >&5
+$as_echo_n "checking whether to compile for profiling... " >&6; }
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then :
+  enableval=$enable_profiling;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1"
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-profiling, needs yes or no" "$LINENO" 5
+  ;;
+esac
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile for test coverage" >&5
+$as_echo_n "checking whether to compile for test coverage... " >&6; }
+# Check whether --enable-coverage was given.
+if test "${enable_coverage+set}" = set; then :
+  enableval=$enable_coverage;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  extra_libraries="${extra_libraries} -lgcov"
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-coverage, needs yes or no" "$LINENO" 5
+  ;;
+esac
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable checking of run-time assertions" >&5
+$as_echo_n "checking whether to enable checking of run-time assertions... " >&6; }
+# Check whether --enable-assertions was given.
+if test "${enable_assertions+set}" = set; then :
+  enableval=$enable_assertions;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-assertions, needs yes or no" "$LINENO" 5
+  ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable even more run-time assertions" >&5
+$as_echo_n "checking whether to enable even more run-time assertions... " >&6; }
+# Check whether --enable-more-assertions was given.
+if test "${enable_more_assertions+set}" = set; then :
+  enableval=$enable_more_assertions;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-more-assertions, needs yes or no" "$LINENO" 5
+  ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+  enable_assertions=yes
+
+$as_echo "#define PPL_ABI_BREAKING_EXTRA_DEBUG 1" >>confdefs.h
+
+
+$as_echo "#define _GLIBCXX_DEBUG 1" >>confdefs.h
+
+
+$as_echo "#define _GLIBCXX_DEBUG_PEDANTIC 1" >>confdefs.h
+
+fi
+
+if test x"$enable_assertions" = xno
+then
+
+$as_echo "#define PPL_NDEBUG 1" >>confdefs.h
+
+  debug_flag="-DNDEBUG=1"
+fi
+
+ if test x"$enable_assertions" = xyes; then
+  ASSERTIONS_ENABLED_TRUE=
+  ASSERTIONS_ENABLED_FALSE='#'
+else
+  ASSERTIONS_ENABLED_TRUE='#'
+  ASSERTIONS_ENABLED_FALSE=
+fi
+
+
+
+arch=no
+enableval=standard
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable optimizations" >&5
+$as_echo_n "checking whether to enable optimizations... " >&6; }
+# Check whether --enable-optimization was given.
+if test "${enable_optimization+set}" = set; then :
+  enableval=$enable_optimization;
+fi
+
+case "${enableval}" in
+sspeed)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: sspeed" >&5
+$as_echo "sspeed" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: speed" >&5
+$as_echo "speed" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: size" >&5
+$as_echo "size" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: standard" >&5
+$as_echo "standard" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: mild" >&5
+$as_echo "mild" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: zero" >&5
+$as_echo "zero" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" "$LINENO" 5
+  ;;
+esac
+
+enableval=$arch
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for which architecture to optimize" >&5
+$as_echo_n "checking for which architecture to optimize... " >&6; }
+# Check whether --enable-arch was given.
+if test "${enable_arch+set}" = set; then :
+  enableval=$enable_arch;
+fi
+
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $m" >&5
+$as_echo "$m" >&6; }
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: default" >&5
+$as_echo "default" >&6; }
+    ;;
+  esac
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: default" >&5
+$as_echo "default" >&6; }
+  ;;
+*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enableval" >&5
+$as_echo "$enableval" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+enableval=default
+use_fpmath=yes
+fpmath_may_use_387=yes
+fpmath_may_use_sse=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use (a specific) floating point arithmetic" >&5
+$as_echo_n "checking whether to use (a specific) floating point arithmetic... " >&6; }
+# Check whether --enable-fpmath was given.
+if test "${enable_fpmath+set}" = set; then :
+  enableval=$enable_fpmath;
+fi
+
+case "${enableval}" in
+sse)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse" >&5
+$as_echo "sse" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse"
+  # The SSE instruction set only supports single precision arithmetic:
+  # double and extended precision arithmetic is still done using 387.
+  ;;
+sse2)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse2" >&5
+$as_echo "sse2" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse"
+  # SSE2 still does not support extended precision arithmetic.
+  ;;
+387)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: 387" >&5
+$as_echo "387" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -mno-sse -mno-sse2 -mfpmath=387"
+  # Note that the -mno-sse* and -mfpmath options are only guaranteed
+  # to work with GCC.
+  if test x"$GCC" = xyes
+  then
+    fpmath_may_use_sse=no
+  fi
+  ;;
+sse+387)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse+387" >&5
+$as_echo "sse+387" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387"
+  ;;
+sse2+387)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: sse2+387" >&5
+$as_echo "sse2+387" >&6; }
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387"
+  ;;
+default)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: default" >&5
+$as_echo "default" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  use_fpmath=no
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no" "$LINENO" 5
+  ;;
+esac
+
+if test x"$fpmath_may_use_387" = xyes
+then
+
+$as_echo "#define PPL_FPMATH_MAY_USE_387 1" >>confdefs.h
+
+fi
+
+if test x"$fpmath_may_use_sse" = xyes
+then
+
+$as_echo "#define PPL_FPMATH_MAY_USE_SSE 1" >>confdefs.h
+
+fi
+
+# Disable all transformations and optimizations that assume default
+# floating point rounding behavior.
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    OPT_FLAGS="$OPT_FLAGS -fp-model strict -fp-speculation off"
+  else
+    # -frounding-math is not yet supported in clang++ or llvm-g++.
+    if test x"$CLANGXX" = xyes || x"$LLVM_GXX" = xyes
+    then
+      if test x"$use_fpmath" = xyes
+      then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CANNOT RELY ON DIRECTED ROUNDING:
+*** DISABLED ALL ABSTRACTIONS BASED ON MACHINE FLOATING-POINT NUMBERS.
+*** A compiler has been detected that does not provide support for
+*** -frounding-math (or any other option with the same semantics).
+*** Hence, we cannot rely on floating-point computations to happen
+*** in agreement with the rounding direction(s) used by the PPL." >&5
+$as_echo "$as_me: WARNING: CANNOT RELY ON DIRECTED ROUNDING:
+*** DISABLED ALL ABSTRACTIONS BASED ON MACHINE FLOATING-POINT NUMBERS.
+*** A compiler has been detected that does not provide support for
+*** -frounding-math (or any other option with the same semantics).
+*** Hence, we cannot rely on floating-point computations to happen
+*** in agreement with the rounding direction(s) used by the PPL." >&2;}
+        use_fpmath=no
+      fi
+    else
+      OPT_FLAGS="$OPT_FLAGS -frounding-math"
+    fi
+  fi
+fi
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use precompiled headers" >&5
+$as_echo_n "checking whether to use precompiled headers... " >&6; }
+# Check whether --enable-pch was given.
+if test "${enable_pch+set}" = set; then :
+  enableval=$enable_pch;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-pch, needs yes or no" "$LINENO" 5
+  ;;
+esac
+ if test x"$enableval" = xyes; then
+  USE_PRECOMPILED_HEADERS_TRUE=
+  USE_PRECOMPILED_HEADERS_FALSE='#'
+else
+  USE_PRECOMPILED_HEADERS_TRUE='#'
+  USE_PRECOMPILED_HEADERS_FALSE=
+fi
+
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
+
+# System-dependent adjustments.
+cygwin=no
+mingw=no
+darwin=no
+solaris=no
+x86_64=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+    CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+  else
+    CFLAGS="$CFLAGS -fprm d -ieee_with_inexact"
+    CXXFLAGS="$CXXFLAGS -fprm d -ieee_with_inexact"
+  fi
+  ;;
+x86_64*)
+  x86_64=yes
+  ;;
+*)
+  ;;
+esac
+
+case "${host_os}" in
+cygwin*)
+  cygwin=yes
+  no_undefined=yes
+  shared_library_path_env_var=PATH
+  ;;
+darwin*)
+  darwin=yes
+  shared_library_path_env_var=DYLD_LIBRARY_PATH
+  ;;
+hpux*)
+  hpux=yes
+  shared_library_path_env_var=SHLIB_PATH
+  ;;
+mingw*)
+  mingw=yes
+  no_undefined=yes
+  shared_library_path_env_var=PATH
+  ;;
+solaris*)
+  solaris=yes
+  shared_library_path_env_var=LD_LIBRARY_PATH
+  ;;
+*)
+  shared_library_path_env_var=LD_LIBRARY_PATH
+  ;;
+esac
+
+ if test x$cygwin = xyes; then
+  HOST_OS_CYGWIN_TRUE=
+  HOST_OS_CYGWIN_FALSE='#'
+else
+  HOST_OS_CYGWIN_TRUE='#'
+  HOST_OS_CYGWIN_FALSE=
+fi
+
+ if test x$darwin = xyes; then
+  HOST_OS_DARWIN_TRUE=
+  HOST_OS_DARWIN_FALSE='#'
+else
+  HOST_OS_DARWIN_TRUE='#'
+  HOST_OS_DARWIN_FALSE=
+fi
+
+ if test x$hpux = xyes; then
+  HOST_OS_HPUX_TRUE=
+  HOST_OS_HPUX_FALSE='#'
+else
+  HOST_OS_HPUX_TRUE='#'
+  HOST_OS_HPUX_FALSE=
+fi
+
+ if test x$mingw = xyes; then
+  HOST_OS_MINGW_TRUE=
+  HOST_OS_MINGW_FALSE='#'
+else
+  HOST_OS_MINGW_TRUE='#'
+  HOST_OS_MINGW_FALSE=
+fi
+
+ if test x$solaris = xyes; then
+  HOST_OS_SOLARIS_TRUE=
+  HOST_OS_SOLARIS_FALSE='#'
+else
+  HOST_OS_SOLARIS_TRUE='#'
+  HOST_OS_SOLARIS_FALSE=
+fi
+
+
+ if test x$x86_64 = xyes; then
+  HOST_CPU_X86_64_TRUE=
+  HOST_CPU_X86_64_FALSE='#'
+else
+  HOST_CPU_X86_64_TRUE='#'
+  HOST_CPU_X86_64_FALSE=
+fi
+
+
+ if test x$no_undefined = xyes; then
+  NO_UNDEFINED_TRUE=
+  NO_UNDEFINED_FALSE='#'
+else
+  NO_UNDEFINED_TRUE='#'
+  NO_UNDEFINED_FALSE=
+fi
+
+
+
+enableval=mpz
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the type of integral values to use as coefficients" >&5
+$as_echo_n "checking the type of integral values to use as coefficients... " >&6; }
+# Check whether --enable-coefficients was given.
+if test "${enable_coefficients+set}" = set; then :
+  enableval=$enable_coefficients;
+fi
+
+case "${enableval}" in
+native-int8)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 8 bits integers" >&5
+$as_echo "native 8 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=8
+  coefficient_mnemonic=nint8
+  ;;
+native-int16)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 16 bits integers" >&5
+$as_echo "native 16 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=16
+  coefficient_mnemonic=nint16
+  ;;
+native-int32)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 32 bits integers" >&5
+$as_echo "native 32 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=32
+  coefficient_mnemonic=nint32
+  ;;
+native-int64)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: native 64 bits integers" >&5
+$as_echo "native 64 bits integers" >&6; }
+  coefficient_kind=native
+  coefficient_bits=64
+  coefficient_mnemonic=nint64
+  ;;
+checked-int8)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 8 bits integers" >&5
+$as_echo "checked 8 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=8
+  coefficient_mnemonic=int8
+  ;;
+checked-int16)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 16 bits integers" >&5
+$as_echo "checked 16 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=16
+  coefficient_mnemonic=int16
+  ;;
+checked-int32)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 32 bits integers" >&5
+$as_echo "checked 32 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=32
+  coefficient_mnemonic=int32
+  ;;
+checked-int64)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: checked 64 bits integers" >&5
+$as_echo "checked 64 bits integers" >&6; }
+  coefficient_kind=checked
+  coefficient_bits=64
+  coefficient_mnemonic=int64
+  ;;
+mpz)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: GMP mpz" >&5
+$as_echo "GMP mpz" >&6; }
+  coefficient_kind=unbounded
+  coefficient_bits=0
+  coefficient_mnemonic=mpz
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8" "$LINENO" 5
+  ;;
+esac
+
+ if test x"$coefficient_kind" = xnative; then
+  USE_NATIVE_INTEGERS_TRUE=
+  USE_NATIVE_INTEGERS_FALSE='#'
+else
+  USE_NATIVE_INTEGERS_TRUE='#'
+  USE_NATIVE_INTEGERS_FALSE=
+fi
+
+ if test x"$coefficient_kind" = xchecked; then
+  USE_CHECKED_INTEGERS_TRUE=
+  USE_CHECKED_INTEGERS_FALSE='#'
+else
+  USE_CHECKED_INTEGERS_TRUE='#'
+  USE_CHECKED_INTEGERS_FALSE=
+fi
+
+ if test x"$coefficient_kind" = xunbounded; then
+  USE_GMP_INTEGERS_TRUE=
+  USE_GMP_INTEGERS_FALSE='#'
+else
+  USE_GMP_INTEGERS_TRUE='#'
+  USE_GMP_INTEGERS_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x8; then
+  USE_INT8_TRUE=
+  USE_INT8_FALSE='#'
+else
+  USE_INT8_TRUE='#'
+  USE_INT8_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x16; then
+  USE_INT16_TRUE=
+  USE_INT16_FALSE='#'
+else
+  USE_INT16_TRUE='#'
+  USE_INT16_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x32; then
+  USE_INT32_TRUE=
+  USE_INT32_FALSE='#'
+else
+  USE_INT32_TRUE='#'
+  USE_INT32_FALSE=
+fi
+
+ if test x"$coefficient_bits" = x64; then
+  USE_INT64_TRUE=
+  USE_INT64_FALSE='#'
+else
+  USE_INT64_TRUE='#'
+  USE_INT64_FALSE=
+fi
+
+
+
+if test x"$coefficient_kind" = xnative
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy<int${coefficient_bits}_t> >"
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+$as_echo "#define PPL_NATIVE_INTEGERS 1" >>confdefs.h
+
+elif test x"$coefficient_kind" = xchecked
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Bounded_Integer_Coefficient_Policy>"
+  cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+  cat >>confdefs.h <<_ACEOF
+#define PPL_COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+$as_echo "#define PPL_CHECKED_INTEGERS 1" >>confdefs.h
+
+elif test x"$coefficient_kind" = xunbounded
+then
+  $as_echo "#define PPL_COEFFICIENT_TYPE mpz_class" >>confdefs.h
+
+  $as_echo "#define PPL_COEFFICIENT_BITS 0" >>confdefs.h
+
+
+$as_echo "#define PPL_GMP_INTEGERS 1" >>confdefs.h
+
+fi
+
+# Allow additions to C compilation flags.
+
+# Check whether --with-cflags was given.
+if test "${with_cflags+set}" = set; then :
+  withval=$with_cflags; CFLAGS="$CFLAGS $with_cflags"
+fi
+
+
+# Allow additions to C++ compilation flags.
+
+# Check whether --with-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then :
+  withval=$with_cxxflags; CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi
+
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this sort of thing.  */
+  typedef int charset[2];
+  const charset cs = { 0, 0 };
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this sort of thing.  */
+    char tx;
+    char *t = &tx;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; } bx;
+    struct s *b = &bx; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
+else
+  ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for typeof syntax and keyword spelling" >&5
+$as_echo_n "checking for typeof syntax and keyword spelling... " >&6; }
+if ${ac_cv_c_typeof+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_typeof=no
+     for ac_kw in typeof __typeof__ no; do
+       test $ac_kw = no && break
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+	   int value;
+	   typedef struct {
+		   char a [1
+			   + ! (($ac_kw (value))
+				(($ac_kw (value)) 0 < ($ac_kw (value)) -1
+				 ? ($ac_kw (value)) - 1
+				 : ~ (~ ($ac_kw (value)) 0
+				      << sizeof ($ac_kw (value)))))]; }
+	      ac__typeof_type_;
+	   return
+	     (! ((void) ((ac__typeof_type_ *) 0), 0));
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_typeof=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+       test $ac_cv_c_typeof != no && break
+     done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_typeof" >&5
+$as_echo "$ac_cv_c_typeof" >&6; }
+  if test $ac_cv_c_typeof != no; then
+
+$as_echo "#define HAVE_TYPEOF 1" >>confdefs.h
+
+    if test $ac_cv_c_typeof != typeof; then
+
+cat >>confdefs.h <<_ACEOF
+#define typeof $ac_cv_c_typeof
+_ACEOF
+
+    fi
+  fi
+
+
+# Checks for C type sizes.
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
+$as_echo_n "checking size of char... " >&6; }
+if ${ac_cv_sizeof_char+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_char" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (char)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_char=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
+$as_echo "$ac_cv_sizeof_char" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CHAR $ac_cv_sizeof_char
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+$as_echo_n "checking size of short... " >&6; }
+if ${ac_cv_sizeof_short+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_short" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (short)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_short=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+$as_echo "$ac_cv_sizeof_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_int=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+$as_echo_n "checking size of long long... " >&6; }
+if ${ac_cv_sizeof_long_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_long_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+$as_echo "$ac_cv_sizeof_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_size_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (size_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
+$as_echo_n "checking size of float... " >&6; }
+if ${ac_cv_sizeof_float+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_float" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (float)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_float=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
+$as_echo "$ac_cv_sizeof_float" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
+$as_echo_n "checking size of double... " >&6; }
+if ${ac_cv_sizeof_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_double=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
+$as_echo "$ac_cv_sizeof_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
+$as_echo_n "checking size of long double... " >&6; }
+if ${ac_cv_sizeof_long_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_long_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long_double=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
+$as_echo "$ac_cv_sizeof_long_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
+
+# The following are required to validate an horrible kludge working
+# around an horrible bug in <gprolog.h> (see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int*" >&5
+$as_echo_n "checking size of int*... " >&6; }
+if ${ac_cv_sizeof_intp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int*))" "ac_cv_sizeof_intp"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_intp" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int*)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_intp=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_intp" >&5
+$as_echo "$ac_cv_sizeof_intp" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INTP $ac_cv_sizeof_intp
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fp" >&5
+$as_echo_n "checking size of fp... " >&6; }
+if ${ac_cv_sizeof_fp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fp))" "ac_cv_sizeof_fp"        "typedef int *(*fp)();
+"; then :
+
+else
+  if test "$ac_cv_type_fp" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (fp)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_fp=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_fp" >&5
+$as_echo "$ac_cv_sizeof_fp" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FP $ac_cv_sizeof_fp
+_ACEOF
+
+
+
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PERL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+$as_echo "$PERL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ if test x"$PERL" != xno; then
+  HAVE_PERL_TRUE=
+  HAVE_PERL_FALSE='#'
+else
+  HAVE_PERL_TRUE='#'
+  HAVE_PERL_FALSE=
+fi
+
+
+# Use C++ for the remaining checks.
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# The PPL uses <cmath> for sqrt and other functions in several places.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5
+$as_echo_n "checking for library containing sqrt... " >&6; }
+if ${ac_cv_search_sqrt+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char sqrt ();
+int
+main ()
+{
+return sqrt ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_cxx_try_link "$LINENO"; then :
+  ac_cv_search_sqrt=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_sqrt+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_sqrt+:} false; then :
+
+else
+  ac_cv_search_sqrt=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5
+$as_echo "$ac_cv_search_sqrt" >&6; }
+ac_res=$ac_cv_search_sqrt
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+if test x"$use_fpmath" = xyes
+then
+  # Check for the possibility to control the FPU.
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+for ac_header in fenv.h ieeefp.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if it is possible to control the FPU" >&5
+$as_echo_n "checking if it is possible to control the FPU... " >&6; }
+if test "$cross_compiling" = yes; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if i386 || (sparc && defined(HAVE_IEEEFP_H))
+
+int
+main() {
+  return 0;
+}
+
+#else
+
+  choke me
+
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    ac_cv_can_control_fpu=1
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ac_cv_can_control_fpu=0
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if i386
+
+int
+main() {
+  return 0;
+}
+
+#elif defined(HAVE_FENV_H)
+
+# include <fenv.h>
+
+# if !defined(FE_UPWARD) || !defined(FE_DOWNWARD)
+
+  choke me
+
+# elif defined(__arm__) \
+  && (!defined(PPL_ARM_CAN_CONTROL_FPU) || !PPL_ARM_CAN_CONTROL_FPU)
+
+  choke me
+
+#else
+
+     float  nf1 =  -3, pf1 = 3,  f2 =  5;
+     double nd1 =  -7, pd1 = 7,  d2 = 11;
+long double nl1 = -13, pl1 = 13, l2 = 17;
+
+      float nf[2], pf[2];
+     double nd[2], pd[2];
+long double nl[2], pl[2];
+
+int
+ppl_check_function() {
+  int r = 0;
+  if (nf[0] == nf[1] || pf[0] == pf[1] || -nf[0] != pf[1] || -nf[1] != pf[0])
+    r |= 1;
+  if (nd[0] == nd[1] || pd[0] == pd[1] || -nd[0] != pd[1] || -nd[1] != pd[0])
+    r |= 2;
+  if (nl[0] == nl[1] || pl[0] == pl[1] || -nl[0] != pl[1] || -nl[1] != pl[0])
+    r |= 4;
+  return r;
+}
+
+int
+ppl_setround_function(int rounding_mode) {
+  return fesetround(rounding_mode);
+}
+
+int (* volatile ppl_check_function_p)() = ppl_check_function;
+int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
+
+int
+main() {
+  if ((*ppl_setround_function_p)(FE_DOWNWARD) != 0)
+    return 255;
+
+  nf[0] = nf1 / f2;
+  nd[0] = nd1 / d2;
+  nl[0] = nl1 / l2;
+  pf[0] = pf1 / f2;
+  pd[0] = pd1 / d2;
+  pl[0] = pl1 / l2;
+
+  if ((*ppl_setround_function_p)(FE_UPWARD) != 0)
+    return 255;
+
+  nf[1] = nf1 / f2;
+  nd[1] = nd1 / d2;
+  nl[1] = nl1 / l2;
+  pf[1] = pf1 / f2;
+  pd[1] = pd1 / d2;
+  pl[1] = pl1 / l2;
+
+  return (*ppl_check_function_p)();
+}
+
+# endif
+
+#elif sparc && defined(HAVE_IEEEFP_H)
+
+int
+main() {
+  return 0;
+}
+
+#else
+
+  choke me
+
+#endif
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cv_can_control_fpu=1
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cv_can_control_fpu=0
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+else
+  ac_cv_can_control_fpu=0
+fi
+ if test $ac_cv_can_control_fpu = 1; then
+  CAN_CONTROL_FPU_TRUE=
+  CAN_CONTROL_FPU_FALSE='#'
+else
+  CAN_CONTROL_FPU_TRUE='#'
+  CAN_CONTROL_FPU_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CAN_CONTROL_FPU $ac_cv_can_control_fpu
+_ACEOF
+
+
+# Check whether for the C++ compiler the plain char type is signed.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the plain char type is signed" >&5
+$as_echo_n "checking whether the plain char type is signed... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+
+int foo[std::numeric_limits<char>::is_signed ? 1 : -1];
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cxx_plain_char_is_signed=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cxx_plain_char_is_signed=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test x"$ac_cxx_plain_char_is_signed" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_PLAIN_CHAR_IS_SIGNED $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler provides proper long doubles.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler provides proper long doubles" >&5
+$as_echo_n "checking whether the C++ compiler provides proper long doubles... " >&6; }
+if test "$cross_compiling" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming not" >&5
+$as_echo "assuming not" >&6; }
+  ac_cxx_provides_proper_long_double=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <cfloat>
+
+long double f = 0.0;
+
+int main() {
+  if ((LDBL_MAX <= DBL_MAX) && (DBL_EPSILON <= LDBL_EPSILON)
+      && (LDBL_MAX_EXP <= DBL_MAX_EXP) && (LDBL_MANT_DIG <= DBL_MANT_DIG))
+    return 1;
+  else
+    return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cxx_provides_proper_long_double=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cxx_provides_proper_long_double=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_provides_proper_long_double" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ floats.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the binary format of C++ floats" >&5
+$as_echo_n "checking the binary format of C++ floats... " >&6; }
+if test "$cross_compiling" = yes; then :
+  ac_cxx_float_binary_format=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_FLOAT == 4
+
+inline float
+convert(uint32_t x) {
+  union {
+    float value;
+    uint32_t word;
+  } u;
+
+  u.word = x;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<float>::is_iec559
+      && (   convert(0xaaacccaaU)
+          == -3.069535185924732179074680971098132431507110595703125e-13
+          && convert(0xcccaaaccU)
+          == -106255968
+          && convert(0x00000001U)
+          == 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45
+          && convert(0x80000001U)
+          == -1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45))
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_FLOAT_BINARY_FORMAT PPL_FLOAT_IEEE754_SINGLE" >>confdefs.h
+
+  ac_cxx_float_binary_format="IEEE754 Single Precision"
+else
+  ac_cxx_float_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cxx_float_binary_format" >&5
+$as_echo "$ac_cxx_float_binary_format" >&6; }
+
+if test x"$ac_cxx_float_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+  ac_supported_float=0
+else
+  ac_supported_float=1
+fi
+ if test $ac_supported_float = 1; then
+  SUPPORTED_FLOAT_TRUE=
+  SUPPORTED_FLOAT_FALSE='#'
+else
+  SUPPORTED_FLOAT_TRUE='#'
+  SUPPORTED_FLOAT_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_FLOAT $ac_supported_float
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ doubles.
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the binary format of C++ doubles" >&5
+$as_echo_n "checking the binary format of C++ doubles... " >&6; }
+
+if test "$cross_compiling" = yes; then :
+  ac_cxx_double_binary_format=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<double>::is_iec559
+      && (convert(0xaaacccaaUL, 0xacccaaacUL)
+          == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103
+          && convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0
+          && convert(0x00000000UL, 0x00000001UL)
+          == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+          && convert(0x80000000UL, 0x00000001UL)
+          == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE" >>confdefs.h
+
+  ac_cxx_double_binary_format="IEEE754 Double Precision"
+else
+  ac_cxx_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cxx_double_binary_format" >&5
+$as_echo "$ac_cxx_double_binary_format" >&6; }
+
+if test x"$ac_cxx_double_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+  ac_supported_double=0
+else
+  ac_supported_double=1
+fi
+ if test $ac_supported_double = 1; then
+  SUPPORTED_DOUBLE_TRUE=
+  SUPPORTED_DOUBLE_FALSE='#'
+else
+  SUPPORTED_DOUBLE_TRUE='#'
+  SUPPORTED_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_DOUBLE $ac_supported_double
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Detect the binary format used by C++ long doubles.
+
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the binary format of C++ long doubles" >&5
+$as_echo_n "checking the binary format of C++ long doubles... " >&6; }
+
+if test "$cross_compiling" = yes; then :
+  ac_cxx_long_double_binary_format=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 12
+
+long double
+convert(uint32_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+          == -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034 [...]
+          && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+          == -3.23434990843367356978836243375823670140137920038631047807023049120171609457620808873309220935271108176353097313943940275472100621788903190230956690534410676669705059335585140518969412596610080153759381132049385057915293867970546587078868452351854180615879140837871859693613285468342558175420524259461419246587664010262843224689767458364974546764113923420713958481010186877291531245407558226524068718427924386121735166705992087823616450647326179770339398151079922803077815239965 [...]
+          && convert(0x00000000UL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+          && convert(0x80000000UL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED" >>confdefs.h
+
+  ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+  ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then :
+  ac_cxx_long_double_binary_format=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+#if defined(__sparc__) && defined(__arch64__) \
+    && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+
+// Work around http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37661
+int
+main() {
+  return 1;
+}
+
+#else // !defined(__sparc__) || !defined(__arch64__) ...
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+          == -8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182 [...]
+          && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+          == -1245145811075115522107964569349668036873048429802955738289544979224937529833971888147113044115600185809657440463151337899852742080173681519641002844007842161066491872877272689899483098933357761372012363074222544903849943421327866952518563408226075393323377411859119799862094642227761121175434773105923957353216410161917656139242348962530519313341883531064222310528951125334264629650711950000833461188453888512224682758538996197678583645934917458956166559210225915729833706160100 [...]
+          && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+          == 6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215 [...]
+          && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+          == -6.47517511943802511092443895822764655249956933803468100968988438919703954012411937101767149127664994025587814147684811967658721988638254204668511007197261798304279271075133493441673462563847174023944852650555399039145555625217114806807082203468825698247627282878910302835733756134803106238656459263982622699190790786766326206571121158306465719606830833284523445306976052648944766096457931375140340263180435003994887007525564871336806611787940315576671330346743493706240941168521 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#endif // !defined(__sparc__) || !defined(__arch64__) ...
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_QUAD" >>confdefs.h
+
+  ac_cxx_long_double_binary_format="IEEE754 Quad Precision"
+else
+  ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then :
+  ac_cxx_long_double_binary_format=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+          == -7.60485409436602033833759988758780020217551374528569429669911873757906182254327119546821375294569706862634123096006179131975601459939317923749460760611755945509159249553133915285667773529968161411385504730903997838176525168965533046787887965329768475303861077507591270048979509969375307518720976751563959372182344600137482199546034650881151618280482157637543315750344472366897650456745841889271161287700829333629145672371870175300825285400580026318002741921464859617583666254762 [...]
+          && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+          == -9965833187718142564038919371244528880400911264240719763322990704886435019238181462823338415353952436874830526964270445045957245891305882920209440893355853355213758922643053767150375473715384555384564609917951254069603870739549122332594610600777084466038134002807982723703367090044608379335368276188508415489863689777967712401011928894574027307241589899644172257148781505238731702567519166576191811900643182875678049360454665894916648664135478300253607136628778029068062099599179 [...]
+          && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+          && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED" >>confdefs.h
+
+  ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+  ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then :
+  ac_cxx_long_double_binary_format=unknown
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaUL, 0xacccaaacUL)
+          == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103L
+          && convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0L
+          && convert(0x00000000UL, 0x00000001UL)
+          == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+          && convert(0x80000000UL, 0x00000001UL)
+          == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+
+$as_echo "#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE" >>confdefs.h
+
+  ac_cxx_long_double_binary_format="IEEE754 Double Precision"
+else
+  ac_cxx_long_double_binary_format=unknown
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cxx_long_double_binary_format" >&5
+$as_echo "$ac_cxx_long_double_binary_format" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether std::floor(long double) is buggy" >&5
+$as_echo_n "checking whether std::floor(long double) is buggy... " >&6; }
+if test "$cross_compiling" = yes; then :
+  ac_std_floor_long_double_is_buggy=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming is not" >&5
+$as_echo "assuming is not" >&6; }
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <cmath>
+#include <cstdlib>
+
+long double x = 13311002825915415087.0L;
+
+int main() {
+  long double y = std::floor(x);
+  if (x != y)
+    return 1;
+  else
+    return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  ac_std_floor_long_double_is_buggy=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+else
+  ac_std_floor_long_double_is_buggy=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown" \
+|| test $ac_cv_can_control_fpu = 0 \
+|| test x"$ac_std_floor_long_double_is_buggy" = x"yes"
+then
+  ac_supported_long_double=0
+else
+  ac_supported_long_double=1
+fi
+ if test $ac_supported_long_double = 1; then
+  SUPPORTED_LONG_DOUBLE_TRUE=
+  SUPPORTED_LONG_DOUBLE_FALSE='#'
+else
+  SUPPORTED_LONG_DOUBLE_TRUE='#'
+  SUPPORTED_LONG_DOUBLE_FALSE=
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_SUPPORTED_LONG_DOUBLE $ac_supported_long_double
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Test if some floating-point type is supported.
+if test $ac_supported_float = 1 \
+|| test $ac_supported_double = 1 \
+|| test $ac_supported_long_double = 1
+then
+  supported_some_floating_point_type=yes
+fi
+ if test x$supported_some_floating_point_type = xyes; then
+  SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE=
+  SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE='#'
+else
+  SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE='#'
+  SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE=
+fi
+
+
+# Check whether the C++ compiler supports zero-length arrays.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports zero-length arrays" >&5
+$as_echo_n "checking whether the C++ compiler supports zero-length arrays... " >&6; }
+if test "$cross_compiling" = yes; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+  int i;
+  bool b;
+
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec0;
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    ac_cxx_supports_zero_length_arrays=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ac_cxx_supports_zero_length_arrays=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+  int i;
+  bool b;
+
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec[];
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cxx_supports_zero_length_arrays=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cxx_supports_zero_length_arrays=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_supports_zero_length_arrays" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the IEEE inexact flag is supported in C++.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the IEEE inexact flag is supported in C++" >&5
+$as_echo_n "checking whether the IEEE inexact flag is supported in C++... " >&6; }
+if test "$cross_compiling" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming not" >&5
+$as_echo "assuming not" >&6; }
+  ac_cxx_supports_ieee_inexact_flag=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+int
+main() {
+  return 0;
+}
+
+#elif defined(PPL_HAVE_IEEEFP_H)					\
+  && (defined(__sparc)							\
+      || defined(sparc)							\
+      || defined(__sparc__))
+
+int
+main() {
+  return 0;
+}
+
+#elif !defined(HAVE_FENV_H)
+
+int
+main() {
+  return 1;
+}
+
+#else
+
+#include <fenv.h>
+
+#if !defined(FE_INEXACT)
+
+int
+main() {
+  return 1;
+}
+
+#else // defined(FE_INEXACT)
+
+struct A {
+  double dividend;
+  double divisor;
+  bool inexact;
+} a[] = {
+  { 1.0, 2.0, false },
+  { 2.0, 3.0, true },
+};
+
+int main() {
+  for (unsigned i = 0; i < sizeof(a)/sizeof(a[0]); ++i) {
+    {
+      volatile float x = a[i].dividend;
+      volatile float y = a[i].divisor;
+      feclearexcept(FE_INEXACT);
+      x = x / y;
+      if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+        return 1;
+    }
+    {
+      volatile double x = a[i].dividend;
+      volatile double y = a[i].divisor;
+      feclearexcept(FE_INEXACT);
+      x = x / y;
+      if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+        return 1;
+    }
+    {
+      volatile long double x = a[i].dividend;
+      volatile long double y = a[i].divisor;
+      feclearexcept(FE_INEXACT);
+      x = x / y;
+      if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+        return 1;
+    }
+  }
+  return 0;
+}
+
+#endif // defined(FE_INEXACT)
+
+#endif
+
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cxx_supports_ieee_inexact_flag=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cxx_supports_ieee_inexact_flag=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_supports_ieee_inexact_flag" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler supports __attribute__ ((weak))" >&5
+$as_echo_n "checking whether the C++ compiler supports __attribute__ ((weak))... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cxx_supports_attribute_weak=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cxx_supports_attribute_weak=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Checks for header files.
+for ac_header in fenv.h ieeefp.h getopt.h signal.h string.h strings.h sys/resource.h sys/time.h sys/types.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Checks for the availability of C library functions in C++.
+ac_fn_cxx_check_decl "$LINENO" "ffs" "ac_cv_have_decl_ffs" "
+#if defined(HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(HAVE_STRING_H)
+# include <string.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_ffs" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFS $ac_have_decl
+_ACEOF
+
+ac_fn_cxx_check_decl "$LINENO" "getenv" "ac_cv_have_decl_getenv" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_getenv" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtof" "ac_cv_have_decl_strtof" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtof" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOF $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtod" "ac_cv_have_decl_strtod" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtod" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOD $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtold" "ac_cv_have_decl_strtold" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtold" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLD $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtoll" "ac_cv_have_decl_strtoll" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtoll" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "strtoull" "ac_cv_have_decl_strtoull" "#include <cstdlib>
+"
+if test "x$ac_cv_have_decl_strtoull" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL $ac_have_decl
+_ACEOF
+
+ac_fn_cxx_check_decl "$LINENO" "fma" "ac_cv_have_decl_fma" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_fma" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "fmaf" "ac_cv_have_decl_fmaf" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_fmaf" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "fmal" "ac_cv_have_decl_fmal" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_fmal" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "rintf" "ac_cv_have_decl_rintf" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_rintf" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "rintl" "ac_cv_have_decl_rintl" "#include <cmath>
+"
+if test "x$ac_cv_have_decl_rintl" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL $ac_have_decl
+_ACEOF
+
+
+# Checks for the availability of "fast" integral types.
+ac_fn_cxx_check_type "$LINENO" "int_fast16_t" "ac_cv_type_int_fast16_t" "$ac_includes_default"
+if test "x$ac_cv_type_int_fast16_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST16_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "$ac_includes_default"
+if test "x$ac_cv_type_int_fast32_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST32_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "int_fast64_t" "ac_cv_type_int_fast64_t" "$ac_includes_default"
+if test "x$ac_cv_type_int_fast64_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST64_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "uint_fast16_t" "ac_cv_type_uint_fast16_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint_fast16_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST16_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "uint_fast32_t" "ac_cv_type_uint_fast32_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint_fast32_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST32_T 1
+_ACEOF
+
+
+fi
+ac_fn_cxx_check_type "$LINENO" "uint_fast64_t" "ac_cv_type_uint_fast64_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint_fast64_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST64_T 1
+_ACEOF
+
+
+fi
+
+
+# Make sure uintptr_t is defined to an unsigned integer type wide enough
+# to hold a pointer, if such a type exists.
+
+  ac_fn_cxx_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintptr_t" = xyes; then :
+
+$as_echo "#define HAVE_UINTPTR_T 1" >>confdefs.h
+
+else
+  for ac_type in 'unsigned int' 'unsigned long int' \
+	'unsigned long long int'; do
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(sizeof (void *) <= sizeof ($ac_type))];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define uintptr_t $ac_type
+_ACEOF
+
+	  ac_type=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+       test -z "$ac_type" && break
+     done
+fi
+
+
+
+
+# Checks on the GMP library.
+
+
+
+# Check whether --with-gmp was given.
+if test "${with_gmp+set}" = set; then :
+  withval=$with_gmp;
+fi
+
+
+
+# Check whether --with-gmp-include was given.
+if test "${with_gmp_include+set}" = set; then :
+  withval=$with_gmp_include;
+fi
+
+
+
+# Check whether --with-gmp-lib was given.
+if test "${with_gmp_lib+set}" = set; then :
+  withval=$with_gmp_lib;
+fi
+
+
+if test -n "$with_gmp"
+then
+  gmp_include_options="-I$with_gmp/include"
+  gmp_library_paths="$with_gmp/lib"
+  gmp_library_options="-L$gmp_library_paths"
+fi
+
+if test -n "$with_gmp_include"
+then
+  gmp_include_options="-I$with_gmp_include"
+fi
+
+if test -n "$with_gmp_lib"
+then
+  gmp_library_paths="$with_gmp_lib"
+  gmp_library_options="-L$gmp_library_paths"
+fi
+
+gmp_libs="-lgmpxx -lgmp"
+
+
+# Check whether --with-gmp-build was given.
+if test "${with_gmp_build+set}" = set; then :
+  withval=$with_gmp_build; gmp_build_dir=$with_gmp_build
+  if test -n "$with_gmp" \
+  || test -n "$with_gmp_include" || test -n "$with_gmp_lib"
+  then
+    as_fn_error $? "cannot use --with-gmp-build and other --with-gmp* options together" "$LINENO" 5
+  else
+    gmp_srcdir=`echo @abs_srcdir@ | $gmp_build_dir/config.status --file=-`
+    gmp_include_options="-I$gmp_build_dir -I$gmp_build_dir/tune -I$gmp_srcdir"
+    gmp_libs="$gmp_build_dir/libgmp.la $gmp_build_dir/libgmpxx.la"
+  fi
+fi
+
+
+gmp_library_options="$gmp_library_options $gmp_libs"
+
+if test -n "$with_gmp_build"
+then
+  ac_save_CXX="$CXX"
+  CXX="libtool --mode=link --tag=CXX $CXX"
+fi
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $gmp_include_options"
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $gmp_library_options"
+eval ac_save_shared_library_path="\$$shared_library_path_env_var"
+eval $shared_library_path_env_var=\"$gmp_library_paths:$ac_save_shared_library_path\"
+export $shared_library_path_env_var
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the GMP library version 4.1.3 or above" >&5
+$as_echo_n "checking for the GMP library version 4.1.3 or above... " >&6; }
+if test "$cross_compiling" = yes; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gmpxx.h>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+int
+main() {
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    ac_cv_have_gmp=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ac_cv_have_gmp=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gmpxx.h>
+#include <climits>
+#include <string>
+#include <sstream>
+#include <iostream>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+#ifndef BITS_PER_MP_LIMB
+#define BITS_PER_MP_LIMB GMP_LIMB_BITS
+#endif
+
+int
+main() {
+  std::string header_version;
+  {
+    std::ostringstream s(header_version);
+    s << __GNU_MP_VERSION << "." << __GNU_MP_VERSION_MINOR;
+    // Starting from GMP version 4.3.0, the gmp_version variable
+    // always contains three parts.  In previous versions the
+    // patchlevel was omitted if it was 0.
+    if (__GNU_MP_VERSION_PATCHLEVEL != 0
+        || __GNU_MP_VERSION > 4
+        || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 3))
+      s << "." << __GNU_MP_VERSION_PATCHLEVEL;
+    header_version = s.str();
+  }
+
+  std::string library_version = gmp_version;
+
+  if (header_version != library_version) {
+    std::cerr
+      << "GMP header (gmpxx.h) and library (ligmpxx.*) version mismatch:\n"
+      << "header gives " << header_version << ";\n"
+      << "library gives " << library_version << "." << std::endl;
+    return 1;
+  }
+
+  if (sizeof(mp_limb_t)*CHAR_BIT != BITS_PER_MP_LIMB
+      || BITS_PER_MP_LIMB != mp_bits_per_limb) {
+    std::cerr
+      << "GMP header (gmpxx.h) and library (ligmpxx.*) bits-per-limb mismatch:\n"
+      << "header gives " << BITS_PER_MP_LIMB << ";\n"
+      << "library gives " << mp_bits_per_limb << ".\n"
+      << "This probably means you are on a bi-arch system and\n"
+      << "you are compiling with the wrong header or linking with\n"
+      << "the wrong library." << std::endl;
+    return 1;
+  }
+
+  mpz_class n("3141592653589793238462643383279502884");
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cv_have_gmp=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cv_have_gmp=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of mp_limb_t" >&5
+$as_echo_n "checking size of mp_limb_t... " >&6; }
+if ${ac_cv_sizeof_mp_limb_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (mp_limb_t))" "ac_cv_sizeof_mp_limb_t"        "#include <gmpxx.h>
+"; then :
+
+else
+  if test "$ac_cv_type_mp_limb_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (mp_limb_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_mp_limb_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_mp_limb_t" >&5
+$as_echo "$ac_cv_sizeof_mp_limb_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t
+_ACEOF
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GMP has been compiled with support for exceptions" >&5
+$as_echo_n "checking whether GMP has been compiled with support for exceptions... " >&6; }
+if test "$cross_compiling" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming yes" >&5
+$as_echo "assuming yes" >&6; }
+  ac_cv_gmp_supports_exceptions=yes
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gmpxx.h>
+#include <new>
+#include <cstddef>
+
+static void*
+x_malloc(size_t) {
+  throw std::bad_alloc();
+}
+
+static void*
+x_realloc(void*, size_t, size_t) {
+  throw std::bad_alloc();
+}
+
+static void
+x_free(void*, size_t) {
+}
+
+int main() {
+  mp_set_memory_functions(x_malloc, x_realloc, x_free);
+  try {
+    mpz_class n("3141592653589793238462643383279502884");
+  }
+  catch (std::bad_alloc&) {
+    return 0;
+  }
+  return 1;
+}
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cv_gmp_supports_exceptions=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cv_gmp_supports_exceptions=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
+if test x"$gmp_supports_exceptions" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_GMP_SUPPORTS_EXCEPTIONS $value
+_ACEOF
+
+
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+eval $shared_library_path_env_var=\"$ac_save_shared_library_path\"
+LIBS="$ac_save_LIBS"
+CPPFLAGS="$ac_save_CPPFLAGS"
+
+if test -n "$with_gmp_build"
+then
+  CXX="$ac_save_CXX"
+fi
+
+if test x"$have_gmp" = xno
+then
+  as_fn_error $? "Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." "$LINENO" 5
+else
+  if test x"$have_gmpxx" = xno
+  then
+    as_fn_error $? "GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options." "$LINENO" 5
+  fi
+fi
+
+ac_fn_cxx_check_member "$LINENO" "__mpz_struct" "_mp_alloc" "ac_cv_member___mpz_struct__mp_alloc" "#include <gmp.h>
+"
+if test "x$ac_cv_member___mpz_struct__mp_alloc" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+_ACEOF
+
+
+else
+  gmp_has_changes=yes
+fi
+ac_fn_cxx_check_member "$LINENO" "__mpz_struct" "_mp_size" "ac_cv_member___mpz_struct__mp_size" "#include <gmp.h>
+"
+if test "x$ac_cv_member___mpz_struct__mp_size" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_SIZE 1
+_ACEOF
+
+
+else
+  gmp_has_changes=yes
+fi
+ac_fn_cxx_check_member "$LINENO" "__mpz_struct" "_mp_d" "ac_cv_member___mpz_struct__mp_d" "#include <gmp.h>
+"
+if test "x$ac_cv_member___mpz_struct__mp_d" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_D 1
+_ACEOF
+
+
+else
+  gmp_has_changes=yes
+fi
+
+
+if test x"$gmp_has_changed" = xyes
+then
+  as_fn_error $? "GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP.  You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it." "$LINENO" 5
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_include_options}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_options}"
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the ppl_lcdd program" >&5
+$as_echo_n "checking whether to build the ppl_lcdd program... " >&6; }
+# Check whether --enable-ppl_lcdd was given.
+if test "${enable_ppl_lcdd+set}" = set; then :
+  enableval=$enable_ppl_lcdd;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-ppl_lcdd, needs yes or no" "$LINENO" 5
+  ;;
+esac
+build_ppl_lcdd=$enableval
+ if test x"$build_ppl_lcdd" = xyes; then
+  BUILD_PPL_LCDD_TRUE=
+  BUILD_PPL_LCDD_FALSE='#'
+else
+  BUILD_PPL_LCDD_TRUE='#'
+  BUILD_PPL_LCDD_FALSE=
+fi
+
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the ppl_lpsol program" >&5
+$as_echo_n "checking whether to build the ppl_lpsol program... " >&6; }
+# Check whether --enable-ppl_lpsol was given.
+if test "${enable_ppl_lpsol+set}" = set; then :
+  enableval=$enable_ppl_lpsol;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-ppl_lpsol, needs yes or no" "$LINENO" 5
+  ;;
+esac
+build_ppl_lpsol=$enableval
+ if test x"$build_ppl_lpsol" = xyes; then
+  BUILD_PPL_LPSOL_TRUE=
+  BUILD_PPL_LPSOL_FALSE='#'
+else
+  BUILD_PPL_LPSOL_TRUE='#'
+  BUILD_PPL_LPSOL_FALSE=
+fi
+
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the ppl_pips program" >&5
+$as_echo_n "checking whether to build the ppl_pips program... " >&6; }
+# Check whether --enable-ppl_pips was given.
+if test "${enable_ppl_pips+set}" = set; then :
+  enableval=$enable_ppl_pips;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-ppl_pips, needs yes or no" "$LINENO" 5
+  ;;
+esac
+build_ppl_pips=$enableval
+ if test x"$build_ppl_pips" = xyes; then
+  BUILD_PPL_PIPS_TRUE=
+  BUILD_PPL_PIPS_FALSE='#'
+else
+  BUILD_PPL_PIPS_TRUE='#'
+  BUILD_PPL_PIPS_FALSE=
+fi
+
+
+enableval=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build the PPL documentation" >&5
+$as_echo_n "checking whether to build the PPL documentation... " >&6; }
+# Check whether --enable-documentation was given.
+if test "${enable_documentation+set}" = set; then :
+  enableval=$enable_documentation;
+fi
+
+case "${enableval}" in
+yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-documentation, needs yes or no" "$LINENO" 5
+  ;;
+esac
+build_documentation=$enableval
+ if test x"$build_documentation" = xyes; then
+  BUILD_DOCUMENTATION_TRUE=
+  BUILD_DOCUMENTATION_FALSE='#'
+else
+  BUILD_DOCUMENTATION_TRUE='#'
+  BUILD_DOCUMENTATION_FALSE=
+fi
+
+
+# Define lists of available interfaces: lowercase and blank-separated.
+non_prolog_interfaces="cxx c ocaml java"
+prolog_interfaces="ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+available_interfaces="${non_prolog_interfaces} ${prolog_interfaces}"
+
+# This is the list of interfaces that are enabled by default.
+default_interfaces=${non_prolog_interfaces}
+
+enableval=not_specified
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which interfaces are enabled" >&5
+$as_echo_n "checking which interfaces are enabled... " >&6; }
+# Check whether --enable-interfaces was given.
+if test "${enable_interfaces+set}" = set; then :
+  enableval=$enable_interfaces;
+fi
+
+case x"${enableval}" in
+xyes | x)
+  as_fn_error $? "--enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" "$LINENO" 5
+  ;;
+xnone | xno)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=no
+  done
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+  ;;
+xall)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=yes
+  done
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${available_interfaces}" >&5
+$as_echo "${available_interfaces}" >&6; }
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_interfaces}
+  fi
+  # Make the list blank-separated and lowercase; turn "c++" into "cxx".
+  required_interfaces=`echo "${enableval}" | sed -e 's/-/_/g' -e 's/[  ,][   ,]*/ /g' -e 's/c++/cxx/g' | tr '[:upper:]' '[:lower:]'`
+  # Check that the specified interfaces exist.
+  for interface in ${required_interfaces}
+  do
+    case " ${available_interfaces} " in
+    *\ ${interface}\ *)
+      ;;
+    *)
+      as_fn_error $? "unknown interface ${interface}: must be one of ${available_interfaces}" "$LINENO" 5
+      ;;
+    esac
+  done
+  # Initialize the enabled variable for each interface.
+  for interface in ${available_interfaces}
+  do
+    case " ${required_interfaces} " in
+    *\ ${interface}\ *)
+      eval ${interface}_interface_enabled=yes
+      enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}"
+      ;;
+    *)
+      eval ${interface}_interface_enabled=no
+      ;;
+    esac
+  done
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enabled_interfaces}" >&5
+$as_echo "${enabled_interfaces}" >&6; }
+  ;;
+esac
+
+if test x${cxx_interface_enabled} = xyes
+then
+  build_cxx_interface=yes
+fi
+ if test x$build_cxx_interface = xyes; then
+  BUILD_CXX_INTERFACE_TRUE=
+  BUILD_CXX_INTERFACE_FALSE='#'
+else
+  BUILD_CXX_INTERFACE_TRUE='#'
+  BUILD_CXX_INTERFACE_FALSE=
+fi
+
+
+if test x${c_interface_enabled} = xyes
+then
+  build_c_interface=yes
+fi
+ if test x$build_c_interface = xyes; then
+  BUILD_C_INTERFACE_TRUE=
+  BUILD_C_INTERFACE_FALSE='#'
+else
+  BUILD_C_INTERFACE_TRUE='#'
+  BUILD_C_INTERFACE_FALSE=
+fi
+
+
+# Checks for systems for which the interface is enabled.
+
+# Allow to specify the Java SDK installation directory.
+
+# Check whether --with-java was given.
+if test "${with_java+set}" = set; then :
+  withval=$with_java; java_dir=$with_java
+fi
+
+
+case "${host_os}" in
+# On Darwin the JDK, if present, is installed in /Library/Java/Home .
+darwin*)
+  if test "x$java_dir" = x
+  then
+    java_dir="/Library/Java/Home"
+  fi
+  ;;
+# On modern Fedora systems the JDK is usually in /usr/lib/jvm/java .
+linux*)
+  if test "x$java_dir" = x
+  then
+    java_dir="/usr/lib/jvm/java"
+  fi
+  ;;
+*)
+  ;;
+esac
+
+if test "x$java_dir" != x
+then
+  JAVAPREFIX="${java_dir}/bin"
+fi
+
+# Checks for Java.
+if test x${java_interface_enabled} = xyes
+then
+  # Check for Java programs. Order here is important: check first
+  # for the compiler.
+
+
+if test "x$JAVAPREFIX" = x
+then
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVAC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$JAVAC"; then
+  ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAVAC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+else
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVAC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $JAVAC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+JAVAC=$ac_cv_path_JAVAC
+if test -n "$JAVAC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+fi
+if test ! x$JAVAC = "xno"
+then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $JAVAC supports enums" >&5
+$as_echo_n "checking whether $JAVAC supports enums... " >&6; }
+if ${ac_cv_javac_supports_enums+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 10459 "configure" */
+public class Test {
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+ }
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null 2>&1; then
+  ac_cv_javac_supports_enums=yes
+else
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_javac_supports_enums" >&5
+$as_echo "$ac_cv_javac_supports_enums" >&6; }
+
+fi
+
+
+if test x$JAVAPREFIX = x; then
+        test x$JAVA = x && for ac_prog in java$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVA+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$JAVA"; then
+  ac_cv_prog_JAVA="$JAVA" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAVA="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVA=$ac_cv_prog_JAVA
+if test -n "$JAVA"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5
+$as_echo "$JAVA" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVA" && break
+done
+test -n "$JAVA" || JAVA="no"
+
+else
+        test x$JAVA = x && for ac_prog in java$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVA+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $JAVA in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+JAVA=$ac_cv_path_JAVA
+if test -n "$JAVA"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5
+$as_echo "$JAVA" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVA" && break
+done
+test -n "$JAVA" || JAVA="no"
+
+fi
+if test ! x$JAVA = "xno"
+then
+
+# Extract the first word of "uudecode$EXEEXT", so it can be a program name with args.
+set dummy uudecode$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_uudecode+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$uudecode"; then
+  ac_cv_prog_uudecode="$uudecode" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_uudecode="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+uudecode=$ac_cv_prog_uudecode
+if test -n "$uudecode"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $uudecode" >&5
+$as_echo "$uudecode" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$uudecode = xyes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if uudecode can decode base 64 file" >&5
+$as_echo_n "checking if uudecode can decode base 64 file... " >&6; }
+if ${ac_cv_prog_uudecode_base64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+        ac_cv_prog_uudecode_base64=yes
+else
+        echo "configure: 10650: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+        echo "configure: failed file was:" >&5
+        cat Test.uue >&5
+        ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_uudecode_base64" >&5
+$as_echo "$ac_cv_prog_uudecode_base64" >&6; }
+fi
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        rm -f Test.class
+        if test x$ac_cv_javac_supports_enums = x; then
+
+if test "x$JAVAPREFIX" = x
+then
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVAC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$JAVAC"; then
+  ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAVAC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAC=$ac_cv_prog_JAVAC
+if test -n "$JAVAC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+else
+        test "x$JAVAC" = x && for ac_prog in javac$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVAC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $JAVAC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAVAC="$JAVAC" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_JAVAC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+JAVAC=$ac_cv_path_JAVAC
+if test -n "$JAVAC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+$as_echo "$JAVAC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVAC" && break
+done
+test -n "$JAVAC" || JAVAC="no"
+
+fi
+if test ! x$JAVAC = "xno"
+then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $JAVAC supports enums" >&5
+$as_echo_n "checking whether $JAVAC supports enums... " >&6; }
+if ${ac_cv_javac_supports_enums+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* #line 10769 "configure" */
+public class Test {
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+ }
+}
+EOF
+if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null 2>&1; then
+  ac_cv_javac_supports_enums=yes
+else
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_javac_supports_enums" >&5
+$as_echo "$ac_cv_javac_supports_enums" >&6; }
+
+fi
+
+        fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $JAVA works" >&5
+$as_echo_n "checking if $JAVA works... " >&6; }
+if ${ac_cv_prog_java_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+cat << \EOF > $JAVA_TEST
+/* [#]line 10818 "configure" */
+public class Test {
+public static void main (String args[]) {
+        System.exit (0);
+} }
+EOF
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } && test -s $CLASS_TEST; then
+                :
+        else
+          echo "configure: failed program was:" >&5
+          cat $JAVA_TEST >&5
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&5
+$as_echo "$as_me: WARNING: The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" >&2;}
+        fi
+fi
+# if we don't have a Java compiler installed, it's useless to check if Java
+# works beacause a working javac is needed.
+if test x$ac_cv_javac_supports_enums = xno; then
+ ac_cv_prog_java_works=skipping
+else
+if { ac_try='$JAVA $JAVAFLAGS $TEST'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null 2>&1; then
+  ac_cv_prog_java_works=yes
+else
+  echo "configure: failed program was:" >&5
+  cat $JAVA_TEST >&5
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&5
+$as_echo "$as_me: WARNING: The Java VM $JAVA failed (see config.log, check the CLASSPATH?)" >&2;}
+  fi
+fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_java_works" >&5
+$as_echo "$ac_cv_prog_java_works" >&6; }
+
+
+fi
+
+
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAR" = x && for ac_prog in jar$EXEEXT
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$JAR"; then
+  ac_cv_prog_JAR="$JAR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+JAR=$ac_cv_prog_JAR
+if test -n "$JAR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5
+$as_echo "$JAR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="no"
+
+else
+        test "x$JAR" = x && for ac_prog in jar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $JAR in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAR="$JAR" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_JAR="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+JAR=$ac_cv_path_JAR
+if test -n "$JAR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5
+$as_echo "$JAR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAR" && break
+done
+test -n "$JAR" || JAR="no"
+
+fi
+test "x$JAR" = xno
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test "x$JAVAPREFIX" = x; then
+        for ac_prog in javah
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JAVAH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$JAVAH"; then
+  ac_cv_prog_JAVAH="$JAVAH" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_JAVAH="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+JAVAH=$ac_cv_prog_JAVAH
+if test -n "$JAVAH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAH" >&5
+$as_echo "$JAVAH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVAH" && break
+done
+test -n "$JAVAH" || JAVAH="no"
+
+else
+	for ac_prog in javah
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_JAVAH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $JAVAH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_JAVAH="$JAVAH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $JAVAPREFIX
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_JAVAH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+JAVAH=$ac_cv_path_JAVAH
+if test -n "$JAVAH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAH" >&5
+$as_echo "$JAVAH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$JAVAH" && break
+done
+test -n "$JAVAH" || JAVAH="no"
+
+fi
+
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != xno ; then
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <jni.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+
+    ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+    ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+    JNIFLAGS="-I$ac_dir -I$ac_dir/$ac_machdep"
+    CPPFLAGS="$ac_save_CPPFLAGS $JNIFLAGS"
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <jni.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  CPPFLAGS="$ac_save_CPPFLAGS"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to include <jni.h>" >&5
+$as_echo "$as_me: WARNING: unable to include <jni.h>" >&2;}
+	       JAVAH=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+    CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $JNIFLAGS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether jlong can contain data pointers" >&5
+$as_echo_n "checking whether jlong can contain data pointers... " >&6; }
+  if test "$cross_compiling" = yes; then :
+  ac_jlong_can_contain_pointers=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming it cannot" >&5
+$as_echo "assuming it cannot" >&6; }
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <jni.h>
+
+    int
+    main() {
+      if (sizeof(jlong) >= sizeof(void*))
+        return 0;
+      else
+        return 1;
+    }
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  ac_jlong_can_contain_pointers=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  ac_jlong_can_contain_pointers=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+# In order to build the Java interface, it must be enabled and all the
+# Java tools must be available.
+if test x${java_interface_enabled} = xyes \
+&& test "x$JAVA" != xno \
+&& test "x$ac_cv_javac_supports_enums" != xno \
+&& test "x$JAR" != xno \
+&& test "x$JAVAH" != xno \
+&& test x${ac_jlong_can_contain_pointers} = xyes
+then
+  build_java_interface=yes
+fi
+ if test x$build_java_interface = xyes; then
+  BUILD_JAVA_INTERFACE_TRUE=
+  BUILD_JAVA_INTERFACE_FALSE='#'
+else
+  BUILD_JAVA_INTERFACE_TRUE='#'
+  BUILD_JAVA_INTERFACE_FALSE=
+fi
+
+
+
+# Allow to specify the ML GMP installation directory.
+
+# Check whether --with-mlgmp was given.
+if test "${with_mlgmp+set}" = set; then :
+  withval=$with_mlgmp; mlgmp_dir=$with_mlgmp
+else
+  mlgmp_dir=+gmp
+fi
+
+
+# Checks for OCaml.
+if test x${ocaml_interface_enabled} = xyes
+then
+  # Detect which tools of the OCaml toolchain are available.
+    # checking for ocamlc
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLC"; then
+  ac_cv_prog_OCAMLC="$OCAMLC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLC="${ac_tool_prefix}ocamlc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLC=$ac_cv_prog_OCAMLC
+if test -n "$OCAMLC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5
+$as_echo "$OCAMLC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLC"; then
+  ac_ct_OCAMLC=$OCAMLC
+  # Extract the first word of "ocamlc", so it can be a program name with args.
+set dummy ocamlc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLC"; then
+  ac_cv_prog_ac_ct_OCAMLC="$ac_ct_OCAMLC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLC="ocamlc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLC=$ac_cv_prog_ac_ct_OCAMLC
+if test -n "$ac_ct_OCAMLC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLC" >&5
+$as_echo "$ac_ct_OCAMLC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLC" = x; then
+    OCAMLC="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLC=$ac_ct_OCAMLC
+  fi
+else
+  OCAMLC="$ac_cv_prog_OCAMLC"
+fi
+
+
+  if test "$OCAMLC" != "no"; then
+     OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'`
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCaml version is $OCAMLVERSION" >&5
+$as_echo "OCaml version is $OCAMLVERSION" >&6; }
+     OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4`
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCaml library path is $OCAMLLIB" >&5
+$as_echo "OCaml library path is $OCAMLLIB" >&6; }
+
+
+
+
+     # checking for ocamlopt
+     if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlopt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlopt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLOPT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLOPT"; then
+  ac_cv_prog_OCAMLOPT="$OCAMLOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLOPT="${ac_tool_prefix}ocamlopt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLOPT=$ac_cv_prog_OCAMLOPT
+if test -n "$OCAMLOPT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPT" >&5
+$as_echo "$OCAMLOPT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLOPT"; then
+  ac_ct_OCAMLOPT=$OCAMLOPT
+  # Extract the first word of "ocamlopt", so it can be a program name with args.
+set dummy ocamlopt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLOPT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLOPT"; then
+  ac_cv_prog_ac_ct_OCAMLOPT="$ac_ct_OCAMLOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLOPT="ocamlopt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLOPT=$ac_cv_prog_ac_ct_OCAMLOPT
+if test -n "$ac_ct_OCAMLOPT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLOPT" >&5
+$as_echo "$ac_ct_OCAMLOPT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLOPT" = x; then
+    OCAMLOPT="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLOPT=$ac_ct_OCAMLOPT
+  fi
+else
+  OCAMLOPT="$ac_cv_prog_OCAMLOPT"
+fi
+
+     OCAMLBEST=byte
+     if test "$OCAMLOPT" = "no"; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find ocamlopt; bytecode compilation only." >&5
+$as_echo "$as_me: WARNING: Cannot find ocamlopt; bytecode compilation only." >&2;}
+     else
+	TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+	if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc; ocamlopt discarded." >&5
+$as_echo "versions differs from ocamlc; ocamlopt discarded." >&6; }
+	    OCAMLOPT=no
+	else
+	    OCAMLBEST=opt
+	fi
+     fi
+
+
+
+     # checking for ocamlc.opt
+     if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlc.opt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlc.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLCDOTOPT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLCDOTOPT"; then
+  ac_cv_prog_OCAMLCDOTOPT="$OCAMLCDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLCDOTOPT="${ac_tool_prefix}ocamlc.opt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLCDOTOPT=$ac_cv_prog_OCAMLCDOTOPT
+if test -n "$OCAMLCDOTOPT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLCDOTOPT" >&5
+$as_echo "$OCAMLCDOTOPT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLCDOTOPT"; then
+  ac_ct_OCAMLCDOTOPT=$OCAMLCDOTOPT
+  # Extract the first word of "ocamlc.opt", so it can be a program name with args.
+set dummy ocamlc.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLCDOTOPT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLCDOTOPT"; then
+  ac_cv_prog_ac_ct_OCAMLCDOTOPT="$ac_ct_OCAMLCDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLCDOTOPT="ocamlc.opt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLCDOTOPT=$ac_cv_prog_ac_ct_OCAMLCDOTOPT
+if test -n "$ac_ct_OCAMLCDOTOPT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLCDOTOPT" >&5
+$as_echo "$ac_ct_OCAMLCDOTOPT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLCDOTOPT" = x; then
+    OCAMLCDOTOPT="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLCDOTOPT=$ac_ct_OCAMLCDOTOPT
+  fi
+else
+  OCAMLCDOTOPT="$ac_cv_prog_OCAMLCDOTOPT"
+fi
+
+     if test "$OCAMLCDOTOPT" != "no"; then
+	TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+	if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc; ocamlc.opt discarded." >&5
+$as_echo "versions differs from ocamlc; ocamlc.opt discarded." >&6; }
+	else
+	    OCAMLC=$OCAMLCDOTOPT
+	fi
+     fi
+
+     # checking for ocamlopt.opt
+     if test "$OCAMLOPT" != "no" ; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlopt.opt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlopt.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLOPTDOTOPT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLOPTDOTOPT"; then
+  ac_cv_prog_OCAMLOPTDOTOPT="$OCAMLOPTDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLOPTDOTOPT="${ac_tool_prefix}ocamlopt.opt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLOPTDOTOPT=$ac_cv_prog_OCAMLOPTDOTOPT
+if test -n "$OCAMLOPTDOTOPT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPTDOTOPT" >&5
+$as_echo "$OCAMLOPTDOTOPT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLOPTDOTOPT"; then
+  ac_ct_OCAMLOPTDOTOPT=$OCAMLOPTDOTOPT
+  # Extract the first word of "ocamlopt.opt", so it can be a program name with args.
+set dummy ocamlopt.opt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLOPTDOTOPT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
+  ac_cv_prog_ac_ct_OCAMLOPTDOTOPT="$ac_ct_OCAMLOPTDOTOPT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLOPTDOTOPT="ocamlopt.opt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLOPTDOTOPT=$ac_cv_prog_ac_ct_OCAMLOPTDOTOPT
+if test -n "$ac_ct_OCAMLOPTDOTOPT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLOPTDOTOPT" >&5
+$as_echo "$ac_ct_OCAMLOPTDOTOPT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLOPTDOTOPT" = x; then
+    OCAMLOPTDOTOPT="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLOPTDOTOPT=$ac_ct_OCAMLOPTDOTOPT
+  fi
+else
+  OCAMLOPTDOTOPT="$ac_cv_prog_OCAMLOPTDOTOPT"
+fi
+
+	if test "$OCAMLOPTDOTOPT" != "no"; then
+	   TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+	   if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: version differs from ocamlc; ocamlopt.opt discarded." >&5
+$as_echo "version differs from ocamlc; ocamlopt.opt discarded." >&6; }
+	   else
+	      OCAMLOPT=$OCAMLOPTDOTOPT
+	   fi
+        fi
+     fi
+
+
+  fi
+
+
+
+  # checking for ocamldep
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamldep", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamldep; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLDEP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLDEP"; then
+  ac_cv_prog_OCAMLDEP="$OCAMLDEP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLDEP="${ac_tool_prefix}ocamldep"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLDEP=$ac_cv_prog_OCAMLDEP
+if test -n "$OCAMLDEP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDEP" >&5
+$as_echo "$OCAMLDEP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLDEP"; then
+  ac_ct_OCAMLDEP=$OCAMLDEP
+  # Extract the first word of "ocamldep", so it can be a program name with args.
+set dummy ocamldep; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLDEP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLDEP"; then
+  ac_cv_prog_ac_ct_OCAMLDEP="$ac_ct_OCAMLDEP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLDEP="ocamldep"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLDEP=$ac_cv_prog_ac_ct_OCAMLDEP
+if test -n "$ac_ct_OCAMLDEP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLDEP" >&5
+$as_echo "$ac_ct_OCAMLDEP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLDEP" = x; then
+    OCAMLDEP="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLDEP=$ac_ct_OCAMLDEP
+  fi
+else
+  OCAMLDEP="$ac_cv_prog_OCAMLDEP"
+fi
+
+
+  # checking for ocamlmktop
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlmktop", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlmktop; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLMKTOP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLMKTOP"; then
+  ac_cv_prog_OCAMLMKTOP="$OCAMLMKTOP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLMKTOP="${ac_tool_prefix}ocamlmktop"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLMKTOP=$ac_cv_prog_OCAMLMKTOP
+if test -n "$OCAMLMKTOP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKTOP" >&5
+$as_echo "$OCAMLMKTOP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLMKTOP"; then
+  ac_ct_OCAMLMKTOP=$OCAMLMKTOP
+  # Extract the first word of "ocamlmktop", so it can be a program name with args.
+set dummy ocamlmktop; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLMKTOP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLMKTOP"; then
+  ac_cv_prog_ac_ct_OCAMLMKTOP="$ac_ct_OCAMLMKTOP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLMKTOP="ocamlmktop"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLMKTOP=$ac_cv_prog_ac_ct_OCAMLMKTOP
+if test -n "$ac_ct_OCAMLMKTOP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLMKTOP" >&5
+$as_echo "$ac_ct_OCAMLMKTOP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLMKTOP" = x; then
+    OCAMLMKTOP="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLMKTOP=$ac_ct_OCAMLMKTOP
+  fi
+else
+  OCAMLMKTOP="$ac_cv_prog_OCAMLMKTOP"
+fi
+
+
+  # checking for ocamlmklib
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlmklib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlmklib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLMKLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLMKLIB"; then
+  ac_cv_prog_OCAMLMKLIB="$OCAMLMKLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLMKLIB="${ac_tool_prefix}ocamlmklib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLMKLIB=$ac_cv_prog_OCAMLMKLIB
+if test -n "$OCAMLMKLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKLIB" >&5
+$as_echo "$OCAMLMKLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLMKLIB"; then
+  ac_ct_OCAMLMKLIB=$OCAMLMKLIB
+  # Extract the first word of "ocamlmklib", so it can be a program name with args.
+set dummy ocamlmklib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLMKLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLMKLIB"; then
+  ac_cv_prog_ac_ct_OCAMLMKLIB="$ac_ct_OCAMLMKLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLMKLIB="ocamlmklib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLMKLIB=$ac_cv_prog_ac_ct_OCAMLMKLIB
+if test -n "$ac_ct_OCAMLMKLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLMKLIB" >&5
+$as_echo "$ac_ct_OCAMLMKLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLMKLIB" = x; then
+    OCAMLMKLIB="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLMKLIB=$ac_ct_OCAMLMKLIB
+  fi
+else
+  OCAMLMKLIB="$ac_cv_prog_OCAMLMKLIB"
+fi
+
+
+  # checking for ocamldoc
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamldoc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamldoc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLDOC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLDOC"; then
+  ac_cv_prog_OCAMLDOC="$OCAMLDOC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLDOC="${ac_tool_prefix}ocamldoc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLDOC=$ac_cv_prog_OCAMLDOC
+if test -n "$OCAMLDOC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDOC" >&5
+$as_echo "$OCAMLDOC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLDOC"; then
+  ac_ct_OCAMLDOC=$OCAMLDOC
+  # Extract the first word of "ocamldoc", so it can be a program name with args.
+set dummy ocamldoc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLDOC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLDOC"; then
+  ac_cv_prog_ac_ct_OCAMLDOC="$ac_ct_OCAMLDOC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLDOC="ocamldoc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLDOC=$ac_cv_prog_ac_ct_OCAMLDOC
+if test -n "$ac_ct_OCAMLDOC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLDOC" >&5
+$as_echo "$ac_ct_OCAMLDOC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLDOC" = x; then
+    OCAMLDOC="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLDOC=$ac_ct_OCAMLDOC
+  fi
+else
+  OCAMLDOC="$ac_cv_prog_OCAMLDOC"
+fi
+
+
+  # checking for ocamlbuild
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ocamlbuild", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ocamlbuild; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLBUILD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OCAMLBUILD"; then
+  ac_cv_prog_OCAMLBUILD="$OCAMLBUILD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OCAMLBUILD="${ac_tool_prefix}ocamlbuild"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLBUILD=$ac_cv_prog_OCAMLBUILD
+if test -n "$OCAMLBUILD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLBUILD" >&5
+$as_echo "$OCAMLBUILD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OCAMLBUILD"; then
+  ac_ct_OCAMLBUILD=$OCAMLBUILD
+  # Extract the first word of "ocamlbuild", so it can be a program name with args.
+set dummy ocamlbuild; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OCAMLBUILD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OCAMLBUILD"; then
+  ac_cv_prog_ac_ct_OCAMLBUILD="$ac_ct_OCAMLBUILD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OCAMLBUILD="ocamlbuild"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OCAMLBUILD=$ac_cv_prog_ac_ct_OCAMLBUILD
+if test -n "$ac_ct_OCAMLBUILD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLBUILD" >&5
+$as_echo "$ac_ct_OCAMLBUILD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OCAMLBUILD" = x; then
+    OCAMLBUILD="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OCAMLBUILD=$ac_ct_OCAMLBUILD
+  fi
+else
+  OCAMLBUILD="$ac_cv_prog_OCAMLBUILD"
+fi
+
+
+  if test x"$OCAMLC" != xno
+  then
+    # Check for the bytecode version of ML GMP.
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ML GMP bytecode module gmp.cma" >&5
+$as_echo_n "checking for ML GMP bytecode module gmp.cma... " >&6; }
+    if ( test ${mlgmp_dir} = +gmp && test -f ${OCAMLLIB}/gmp/gmp.cma ) \
+      || test -f ${mlgmp_dir}/gmp.cma;
+    then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      ocamlc_gmp="yes"
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      ocamlc_gmp="no"
+    fi
+    if test x"$OCAMLOPT" != xno
+    then
+      ocamlopt_root=`${OCAMLOPT} -where`
+      # Check for the native version of ML GMP.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ML GMP native module gmp.cmxa" >&5
+$as_echo_n "checking for ML GMP native module gmp.cmxa... " >&6; }
+      if ( test ${mlgmp_dir} = +gmp && test -f ${ocamlopt_root}/gmp/gmp.cmxa ) \
+        || test -f ${mlgmp_dir}/gmp.cmxa;
+      then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+        ocamlopt_gmp="yes"
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+        ocamlopt_gmp="no"
+      fi
+    fi
+  fi
+fi
+ if test x$ocamlc_gmp = xyes; then
+  HAVE_OCAMLC_TRUE=
+  HAVE_OCAMLC_FALSE='#'
+else
+  HAVE_OCAMLC_TRUE='#'
+  HAVE_OCAMLC_FALSE=
+fi
+
+ if test x$ocamlopt_gmp = xyes; then
+  HAVE_OCAMLOPT_TRUE=
+  HAVE_OCAMLOPT_FALSE='#'
+else
+  HAVE_OCAMLOPT_TRUE='#'
+  HAVE_OCAMLOPT_FALSE=
+fi
+
+
+if test x${ocaml_interface_enabled} = xyes \
+&& (test x$ocamlc_gmp = xyes || test x$ocamlopt_gmp = xyes)
+then
+  build_ocaml_interface=yes
+fi
+ if test x$build_ocaml_interface = xyes; then
+  BUILD_OCAML_INTERFACE_TRUE=
+  BUILD_OCAML_INTERFACE_FALSE='#'
+else
+  BUILD_OCAML_INTERFACE_TRUE='#'
+  BUILD_OCAML_INTERFACE_FALSE=
+fi
+
+
+# Checks for Ciao Prolog.
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "ciao", so it can be a program name with args.
+set dummy ciao; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ciao_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ciao_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ciao_prolog="$ciao_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ciao_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ciao_prolog=$ac_cv_path_ciao_prolog
+if test -n "$ciao_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ciao_prolog" >&5
+$as_echo "$ciao_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$ciao_prolog != x
+then
+  # Create a temporary directory $tmp in $TMPDIR (default /tmp).
+  # Use mktemp if possible; otherwise fall back on mkdir,
+  # with $RANDOM to make collisions less likely.
+  : ${TMPDIR=/tmp}
+  {
+    tmp=`
+      (umask 077 && mktemp -d "$TMPDIR/ppl_ciao_XXXXXX") 2>/dev/null
+    ` &&
+    test -n "$tmp" && test -d "$tmp"
+  } || {
+    tmp=$TMPDIR/ppl_ciao_$$-$RANDOM
+    (umask 077 && mkdir "$tmp")
+  } || exit $?
+  cat >$tmp/print_include_dir.pl <<_CIAO_PRINT_INCLUDE_DIR_EOF
+main(_) :-
+    ciaolibdir(Lib_Dir),
+    get_os(Os),
+    get_arch(Arch),
+    format("~p/include/~p~p", [Lib_Dir, Os, Arch]).
+_CIAO_PRINT_INCLUDE_DIR_EOF
+  ciao_prolog_include_dir=`$ciao_prolog $tmp/print_include_dir.pl`
+  rm -rf $tmp
+
+  CIAO_PROLOG_INCLUDE_OPTIONS="-I${ciao_prolog_include_dir}"
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $CIAO_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  ac_fn_cxx_check_header_mongrel "$LINENO" "ciao_prolog.h" "ac_cv_header_ciao_prolog_h" "$ac_includes_default"
+if test "x$ac_cv_header_ciao_prolog_h" = xyes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ciao Prolog version x.y.z or later" >&5
+$as_echo_n "checking for Ciao Prolog version x.y.z or later... " >&6; }
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <ciao_prolog.h>
+
+int
+main() {
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  ciao_prolog=""
+                    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  ciao_prolog=""
+fi
+
+
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  CIAO_PROLOG="$ciao_prolog"
+
+
+  fi
+
+if test x$ciao_prolog != x
+then
+  have_ciao_prolog=yes
+else
+  have_ciao_prolog=no
+fi
+
+fi
+
+if test x${ciao_prolog_interface_enabled} = xyes \
+&& test x$have_ciao_prolog = xyes
+then
+  build_ciao_prolog_interface=yes
+fi
+ if test x$build_ciao_prolog_interface = xyes; then
+  BUILD_CIAO_PROLOG_INTERFACE_TRUE=
+  BUILD_CIAO_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_CIAO_PROLOG_INTERFACE_TRUE='#'
+  BUILD_CIAO_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for GNU Prolog.
+if test x${gnu_prolog_interface_enabled} = xyes
+then
+  # Extract the first word of "gprolog", so it can be a program name with args.
+set dummy gprolog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GNU_PROLOG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$GNU_PROLOG"; then
+  ac_cv_prog_GNU_PROLOG="$GNU_PROLOG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_GNU_PROLOG="gprolog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+GNU_PROLOG=$ac_cv_prog_GNU_PROLOG
+if test -n "$GNU_PROLOG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GNU_PROLOG" >&5
+$as_echo "$GNU_PROLOG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test x"$GNU_PROLOG" = xgprolog
+  then
+    ac_fn_cxx_check_header_mongrel "$LINENO" "gprolog.h" "ac_cv_header_gprolog_h" "$ac_includes_default"
+if test "x$ac_cv_header_gprolog_h" = xyes; then :
+
+else
+  GNU_PROLOG=""
+fi
+
+
+  fi
+fi
+
+if test x${gnu_prolog_interface_enabled} = xyes \
+&& test x$GNU_PROLOG = xgprolog
+then
+  build_gnu_prolog_interface=yes
+fi
+ if test x$build_gnu_prolog_interface = xyes; then
+  BUILD_GNU_PROLOG_INTERFACE_TRUE=
+  BUILD_GNU_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_GNU_PROLOG_INTERFACE_TRUE='#'
+  BUILD_GNU_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for SICStus.
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "sicstus", so it can be a program name with args.
+set dummy sicstus; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_sicstus_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $sicstus_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_sicstus_prolog="$sicstus_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+sicstus_prolog=$ac_cv_path_sicstus_prolog
+if test -n "$sicstus_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sicstus_prolog" >&5
+$as_echo "$sicstus_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$sicstus_prolog != x
+then
+  sicstus_prolog_app_dir=`$sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."`
+  sicstus_prolog_base=`dirname $sicstus_prolog_app_dir`
+  SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  # We require SICStus Prolog 3.9.1 or later.
+  ac_fn_cxx_check_header_mongrel "$LINENO" "sicstus/sicstus.h" "ac_cv_header_sicstus_sicstus_h" "$ac_includes_default"
+if test "x$ac_cv_header_sicstus_sicstus_h" = xyes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SICStus version 3.9.1 or later" >&5
+$as_echo_n "checking for SICStus version 3.9.1 or later... " >&6; }
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+                      #include <sicstus/sicstus.h>
+                      #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+                      yes
+                      #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  sicstus_prolog=""
+                    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f conftest*
+
+else
+  sicstus_prolog=""
+fi
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+fi
+
+if test x$sicstus_prolog != x
+then
+  have_sicstus_prolog=yes
+else
+  have_sicstus_prolog=no
+fi
+
+fi
+
+if test x${sicstus_prolog_interface_enabled} = xyes \
+&& test x$have_sicstus_prolog = xyes
+then
+  build_sicstus_prolog_interface=yes
+fi
+ if test x$build_sicstus_prolog_interface = xyes; then
+  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE=
+  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_SICSTUS_PROLOG_INTERFACE_TRUE='#'
+  BUILD_SICSTUS_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for SWI-Prolog.
+if test x${swi_prolog_interface_enabled} = xyes
+then
+
+
+# Extract the first word of "swipl$EXEEXT", so it can be a program name with args.
+set dummy swipl$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test -z $swi_prolog
+then
+  # Extract the first word of "swi-prolog$EXEEXT", so it can be a program name with args.
+set dummy swi-prolog$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test -z $swi_prolog
+  then
+    # Extract the first word of "pl$EXEEXT", so it can be a program name with args.
+set dummy pl$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    if test -z $swi_prolog
+    then
+      # Extract the first word of "plcon$EXEEXT", so it can be a program name with args.
+set dummy plcon$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $swi_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog="$swi_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+if test -n "$swi_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog" >&5
+$as_echo "$swi_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    fi
+  fi
+fi
+if test x$swi_prolog != x
+then
+  swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\([a-z]:\)\{0,1\}\(.*\)";.*/\2/'`
+  swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";.*/\1/'`
+  swi_prolog_arch=`$swi_prolog -dump-runtime-variables | grep PLARCH= | sed 's/PLARCH="\(.*\)";.*/\1/'`
+  swi_prolog_libs=`$swi_prolog -dump-runtime-variables | grep PLLIBS= | sed 's/PLLIBS="\(.*\)";.*/\1/'`
+  swi_prolog_lib=`$swi_prolog -dump-runtime-variables | grep PLLIB= | sed 's/PLLIB="\(.*\)";.*/\1/'`
+
+
+  # Extract the first word of "swipl-ld$EXEEXT", so it can be a program name with args.
+set dummy swipl-ld$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $swi_prolog_ld in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog_ld="$swi_prolog_ld" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog_ld="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+swi_prolog_ld=$ac_cv_path_swi_prolog_ld
+if test -n "$swi_prolog_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog_ld" >&5
+$as_echo "$swi_prolog_ld" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test -z $swi_prolog_ld
+  then
+    # Extract the first word of "plld$EXEEXT", so it can be a program name with args.
+set dummy plld$EXEEXT; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_swi_prolog_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $swi_prolog_ld in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_swi_prolog_ld="$swi_prolog_ld" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_swi_prolog_ld="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+swi_prolog_ld=$ac_cv_path_swi_prolog_ld
+if test -n "$swi_prolog_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swi_prolog_ld" >&5
+$as_echo "$swi_prolog_ld" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+
+  # In Fedora, SWI-Prolog.h is installed only in /usr/include/pl, which,
+  # IMHO, is a bug (https://bugzilla.redhat.com/show_bug.cgi?id=471071).
+  SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include -I/usr/include/pl"
+  # If SWI-Prolog was configured with `--disable-libdirversion', then
+  # the files are not in the `${swi_prolog_arch}' subdirectory.  Since
+  # currently there is no way to know that, we look in both places.
+  SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} -L${swi_prolog_base}/lib ${swi_prolog_lib} ${swi_prolog_libs}"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  # We require SWI-Prolog 5.6.0 or later.
+  ac_fn_cxx_check_header_mongrel "$LINENO" "SWI-Prolog.h" "ac_cv_header_SWI_Prolog_h" "$ac_includes_default"
+if test "x$ac_cv_header_SWI_Prolog_h" = xyes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SWI-Prolog version 5.6.0 or later" >&5
+$as_echo_n "checking for SWI-Prolog version 5.6.0 or later... " >&6; }
+                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+  choke me
+#endif
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  swi_prolog=""
+                    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  swi_prolog=""
+fi
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  SWI_PROLOG="$swi_prolog"
+  SWI_PROLOG_LD="$swi_prolog_ld"
+
+
+
+
+fi
+
+if test x$swi_prolog != x
+then
+  have_swi_prolog=yes
+else
+  have_swi_prolog=no
+fi
+
+fi
+
+# Under Cygwin, SWI-Prolog does not work with foreign code:
+# see http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007838.html
+if test x${swi_prolog_interface_enabled} = xyes \
+&& test x$have_swi_prolog = xyes \
+&& test x"${host_os}" != xcygwin
+then
+  build_swi_prolog_interface=yes
+fi
+ if test x$build_swi_prolog_interface = xyes; then
+  BUILD_SWI_PROLOG_INTERFACE_TRUE=
+  BUILD_SWI_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_SWI_PROLOG_INTERFACE_TRUE='#'
+  BUILD_SWI_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for XSB.
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "xsb", so it can be a program name with args.
+set dummy xsb; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_xsb_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $xsb_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_xsb_prolog="$xsb_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+xsb_prolog=$ac_cv_path_xsb_prolog
+if test -n "$xsb_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsb_prolog" >&5
+$as_echo "$xsb_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$xsb_prolog != x
+then
+        xsb_emu_dir=`xsb --nobanner --quietload --noprompt \
+                -e "write('emudir='), \
+                  xsb_configuration(emudir, X), write(X), nl, halt." \
+                    2>/dev/null | sed "s/^emudir=//g"`
+  xsb_config_dir=`xsb --nobanner --quietload --noprompt \
+                   -e "write('config_dir='), \
+                     xsb_configuration(config_dir,X), write(X), nl, halt." \
+                       2>/dev/null | sed "s/^config_dir=//g"`
+  XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+
+fi
+
+if test x$xsb_prolog != x
+then
+  have_xsb_prolog=yes
+else
+  have_xsb_prolog=no
+fi
+
+fi
+
+if test x${xsb_prolog_interface_enabled} = xyes \
+&& test x$have_xsb_prolog = xyes
+then
+  build_xsb_prolog_interface=yes
+fi
+ if test x$build_xsb_prolog_interface = xyes; then
+  BUILD_XSB_PROLOG_INTERFACE_TRUE=
+  BUILD_XSB_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_XSB_PROLOG_INTERFACE_TRUE='#'
+  BUILD_XSB_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Checks for YAP.
+if test x${yap_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "yap", so it can be a program name with args.
+set dummy yap; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_yap_prolog+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $yap_prolog in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_yap_prolog="$yap_prolog" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_yap_prolog="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+yap_prolog=$ac_cv_path_yap_prolog
+if test -n "$yap_prolog"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $yap_prolog" >&5
+$as_echo "$yap_prolog" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$yap_prolog != x
+then
+
+  YAP_PROLOG_INCLUDE_OPTIONS=""
+  YAP_PROLOG_LD_OPTIONS="-lYap"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $YAP_PROLOG_INCLUDE_OPTIONS"
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  # Check for YAP's foreign language interface header file.
+  ac_fn_cxx_check_header_mongrel "$LINENO" "Yap/c_interface.h" "ac_cv_header_Yap_c_interface_h" "$ac_includes_default"
+if test "x$ac_cv_header_Yap_c_interface_h" = xyes; then :
+
+else
+  yap_prolog=""
+fi
+
+
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  YAP_PROLOG="$yap_prolog"
+
+
+
+fi
+
+if test x$yap_prolog != x
+then
+  have_yap_prolog=yes
+else
+  have_yap_prolog=no
+fi
+
+fi
+
+if test x${yap_prolog_interface_enabled} = xyes \
+&& test x$have_yap_prolog = xyes
+then
+  build_yap_prolog_interface=yes
+fi
+ if test x$build_yap_prolog_interface = xyes; then
+  BUILD_YAP_PROLOG_INTERFACE_TRUE=
+  BUILD_YAP_PROLOG_INTERFACE_FALSE='#'
+else
+  BUILD_YAP_PROLOG_INTERFACE_TRUE='#'
+  BUILD_YAP_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# Test if some Prolog interfaces have to be built.
+if test x$build_ciao_prolog_interface = xyes \
+|| test x$build_gnu_prolog_interface = xyes \
+|| test x$build_sicstus_prolog_interface = xyes \
+|| test x$build_swi_prolog_interface = xyes \
+|| test x$build_xsb_prolog_interface = xyes \
+|| test x$build_yap_prolog_interface = xyes
+then
+  build_some_prolog_interfaces=yes
+fi
+ if test x$build_some_prolog_interfaces = xyes; then
+  BUILD_SOME_PROLOG_INTERFACES_TRUE=
+  BUILD_SOME_PROLOG_INTERFACES_FALSE='#'
+else
+  BUILD_SOME_PROLOG_INTERFACES_TRUE='#'
+  BUILD_SOME_PROLOG_INTERFACES_FALSE=
+fi
+
+
+if test x$build_c_interface = xyes \
+|| test x$build_java_interface = xyes \
+|| test x$build_ocaml_interface = xyes \
+|| test x$build_some_prolog_interfaces = xyes
+then
+  # Look for a recent enough version of GNU M4.
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU M4 that supports accurate traces" >&5
+$as_echo_n "checking for GNU M4 that supports accurate traces... " >&6; }
+if ${ac_cv_path_M4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f conftest.m4f
+if test -z "$M4"; then
+  ac_path_M4_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in m4 gm4 gnum4; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_M4="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_M4" || continue
+      # Root out GNU M4 1.4.4, as well as non-GNU m4 that ignore -t, -F.
+      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)d'nl
+      test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
+      && test -z "`echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
+      && test -f conftest.m4f \
+      && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
+      rm -f conftest.m4f
+      $ac_path_M4_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_M4"; then
+    as_fn_error $? "no acceptable m4 could be found in \$PATH.
+GNU M4 1.4.5 or later is required; 1.4.11 or later is recommended" "$LINENO" 5
+  fi
+else
+  ac_cv_path_M4=$M4
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_M4" >&5
+$as_echo "$ac_cv_path_M4" >&6; }
+  M4=$ac_cv_path_M4
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how m4 supports trace files" >&5
+$as_echo_n "checking how m4 supports trace files... " >&6; }
+if ${ac_cv_prog_gnu_m4_debugfile+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case `$M4 --help < /dev/null 2>&1` in
+      *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
+      *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
+    esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gnu_m4_debugfile" >&5
+$as_echo "$ac_cv_prog_gnu_m4_debugfile" >&6; }
+  M4_DEBUGFILE=$ac_cv_prog_gnu_m4_debugfile
+
+
+fi
+
+# Define the list of instantiations that are enabled by default.
+# Different instantiations are separated by a '@' character.
+di="        Polyhedron @ Grid"
+di="${di} @ Rational_Box"
+di="${di} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+di="${di} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+di="${di} @ Constraints_Product<C_Polyhedron, Grid>"
+di="${di} @ Pointset_Powerset<C_Polyhedron>"
+di="${di} @ Pointset_Powerset<NNC_Polyhedron>"
+if test $ac_supported_double = 1
+then
+  di="${di} @ Double_Box @ BD_Shape<double> @ Octagonal_Shape<double>"
+fi
+default_instantiations="${di}"
+
+# Define the list of all instantiations.
+# Different instantiations are separated by a '@' character.
+ai="        Int8_Box @ Int16_Box @ Int32_Box @ Int64_Box"
+ai="${ai} @ Uint8_Box @ Uint16_Box @ Uint32_Box @ Uint64_Box"
+ai="${ai} @ Z_Box @ Rational_Box"
+ai="${ai} @ BD_Shape<int8_t> @ BD_Shape<int16_t>"
+ai="${ai} @ BD_Shape<int32_t> @ BD_Shape<int64_t>"
+ai="${ai} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+ai="${ai} @ Octagonal_Shape<int8_t> @ Octagonal_Shape<int16_t>"
+ai="${ai} @ Octagonal_Shape<int32_t> @ Octagonal_Shape<int64_t>"
+ai="${ai} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+ai="${ai} @ Polyhedron @ Grid"
+ai="${ai} @ Pointset_Powerset<Int8_Box> @ Pointset_Powerset<Int16_Box>"
+ai="${ai} @ Pointset_Powerset<Int32_Box> @ Pointset_Powerset<Int64_Box>"
+ai="${ai} @ Pointset_Powerset<Uint8_Box> @ Pointset_Powerset<Uint16_Box>"
+ai="${ai} @ Pointset_Powerset<Uint32_Box> @ Pointset_Powerset<Uint64_Box>"
+ai="${ai} @ Pointset_Powerset<Rational_Box> @ Pointset_Powerset<Z_Box>"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<C_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<NNC_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<Grid>"
+ai="${ai} @ Constraints_Product<C_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<NNC_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<Grid, C_Polyhedron>"
+ai="${ai} @ Constraints_Product<Grid, NNC_Polyhedron>"
+if test $ac_supported_float = 1
+then
+  ai="${ai} @ Float_Box @ BD_Shape<float>"
+  ai="${ai} @ Octagonal_Shape<float>"
+  ai="${ai} @ Pointset_Powerset<Float_Box>"
+  ai="${ai} @ Pointset_Powerset<BD_Shape<float> >"
+  ai="${ai} @ Pointset_Powerset<Octagonal_Shape<float> >"
+fi
+if test $ac_supported_double = 1
+then
+  ai="${ai} @ Double_Box @ BD_Shape<double>"
+  ai="${ai} @ Octagonal_Shape<double>"
+  ai="${ai} @ Pointset_Powerset<Double_Box>"
+  ai="${ai} @ Pointset_Powerset<BD_Shape<double> >"
+  ai="${ai} @ Pointset_Powerset<Octagonal_Shape<double> >"
+fi
+if test $ac_supported_long_double = 1
+then
+  ai="${ai} @ Long_Double_Box @ BD_Shape<long double>"
+  ai="${ai} @ Octagonal_Shape<long double>"
+  ai="${ai} @ Pointset_Powerset<Long_Double_Box>"
+  ai="${ai} @ Pointset_Powerset<BD_Shape<long double> >"
+  ai="${ai} @ Pointset_Powerset<Octagonal_Shape<long double> >"
+fi
+available_instantiations=${ai}
+
+enableval=not_specified
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which instantiations are enabled" >&5
+$as_echo_n "checking which instantiations are enabled... " >&6; }
+# Check whether --enable-instantiations was given.
+if test "${enable_instantiations+set}" = set; then :
+  enableval=$enable_instantiations;
+fi
+
+case x"${enableval}" in
+xyes | x)
+  ai_one_per_line=`echo "${available_instantiations}" | sed -e 's/ *@ */\n/g' -e 's/ *\([A-Z]\)/\1/g'`
+  as_fn_error $? "
+--enable-instantiations needs at least one argument chosen among none,
+all, and an @-separated list of instantiation specifiers included
+in the following list:
+${ai_one_per_line}" "$LINENO" 5
+  ;;
+xno | xnone)
+  enableval=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_instantiations}
+  elif test x"${enableval}" = xall
+  then
+    enableval=${available_instantiations}
+  fi
+  # Avoid extra blanks.
+  required_instantiations=`echo "${enableval}" | sed -e 's/[    ][    ]*/ /g' -e 's/[ ]*\([@<>,]\)/\1/g' -e 's/\([@<>,]\)[ ]*/\1/g' -e 's/>>/> >/g' -e 's/^[ ]//g' -e 's/[ ]$//g'`
+  # Check the specified instantiations for validity.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS -I${srcdir} ${gmp_include_options}"
+  old_IFS="${IFS}"
+  IFS=@
+  set -- ${required_instantiations}
+  IFS="${old_IFS}"
+  for instantiation
+  do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include "instchk.hh"
+
+using namespace Parma_Polyhedra_Library;
+
+bool valid = ${instantiation}::valid_instantiation();
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  valid_instantiation=yes
+else
+  valid_instantiation=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test x${valid_instantiation} != xyes
+    then
+      as_fn_error $? "invalid instantiation ${instantiation}" "$LINENO" 5
+    fi
+  done
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  required_instantiations_canonical_names=`echo "${required_instantiations}" | sed -e 's/> //g' -e 's/>//g' -e 's/[< ,]/_/g'`
+
+  required_instantiations_c_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_c_cxx_objects=`echo "${required_instantiations_c_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\)\.lo/ppl_c_\1.lo/g'`
+  required_instantiations_c_cxx_sources=`echo "${required_instantiations_c_cxx_objects}" | sed -e 's/\([^. ]*\)\.lo/\1.cc/g'`
+  required_instantiations_c_cxx_headers=`echo "${required_instantiations_c_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+  required_instantiations_prolog_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_prolog_cxx_objects=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\)\.lo/ppl_prolog_\1.lo/g'`
+  required_instantiations_prolog_cxx_sources=`echo "${required_instantiations_prolog_cxx_objects}" | sed -e 's/\([^. ]*\)\.lo/\1.cc/g'`
+  required_instantiations_prolog_cxx_headers=`echo "${required_instantiations_prolog_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+  required_instantiations_prolog_generated_test_sources=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.pl /g' -e 's/$/.pl/g' | sed -e 's/\([^. ]*\)\.pl/ppl_prolog_generated_test_\1.pl/g'`
+
+  required_instantiations_java_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/^Polyhedron/Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' | sed -e 's/Pointset_Powerset_[a-zA-Z0-9_]*/&@&_Iterator/g'`
+  required_instantiations_java_sources=`echo "${required_instantiations_java_source_names}" | sed -e 's/@/.java /g' -e 's/$/.java/g'`
+  required_instantiations_java_classes=`echo "${required_instantiations_java_sources}" | sed -e 's/\.java/.class/g'`
+  required_instantiations_java_cxx_headers=`echo "${required_instantiations_java_sources}" | sed -e 's/\([^. ]*\)\.java/parma_polyhedra_library.\1/g'`
+  required_instantiations_java_cxx_headers_sources=`echo "${required_instantiations_java_sources}" | sed -e 's/\([^. ]*\)\.java/parma_polyhedra_library_\1.h/g'`
+  required_instantiations_java_cxx_objects=`echo "${required_instantiations_canonical_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([^. ]*\)\.lo/ppl_java_\1.lo/g'`
+  required_instantiations_java_cxx_sources=`echo "${required_instantiations_java_cxx_objects}" | sed -e 's/\([^. ]*\)\.lo/\1.cc/g'`
+
+  required_instantiations_ocaml_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_ocaml_cxx_objects=`echo "${required_instantiations_ocaml_source_names}" | sed -e 's/@/.o /g' -e 's/$/.o/g' | sed -e 's/\([^. ]*\)\.o/ppl_ocaml_\1.o/g'`
+  required_instantiations_ocaml_cxx_sources=`echo "${required_instantiations_ocaml_cxx_objects}" | sed -e 's/\([^. ]*\)\.o/\1.cc/g'`
+  required_instantiations_ocaml_cxx_headers=`echo "${required_instantiations_ocaml_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${required_instantiations}" >&5
+$as_echo "${required_instantiations}" >&6; }
+  ;;
+esac
+
+enableval=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests should be run under Valgrind" >&5
+$as_echo_n "checking whether tests should be run under Valgrind... " >&6; }
+# Check whether --enable-valgrind-tests was given.
+if test "${enable_valgrind_tests+set}" = set; then :
+  enableval=$enable_valgrind_tests;
+fi
+
+case "${enableval}" in
+yes)
+  # Extract the first word of "valgrind", so it can be a program name with args.
+set dummy valgrind; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_VALGRIND+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$VALGRIND"; then
+  ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_VALGRIND="valgrind"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+VALGRIND=$ac_cv_prog_VALGRIND
+if test -n "$VALGRIND"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND" >&5
+$as_echo "$VALGRIND" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test x"$VALGRIND" = xvalgrind
+  then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    enable_valgrind_tests=yes
+  else
+    as_fn_error $? "bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind" "$LINENO" 5
+  fi
+  ;;
+no)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  enable_valgrind_tests=no
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-valgrind-tests, needs yes or no" "$LINENO" 5
+  ;;
+esac
+ if test x"$enable_valgrind_tests" = xyes; then
+  VALGRIND_TESTS_ENABLED_TRUE=
+  VALGRIND_TESTS_ENABLED_FALSE='#'
+else
+  VALGRIND_TESTS_ENABLED_TRUE='#'
+  VALGRIND_TESTS_ENABLED_FALSE=
+fi
+
+
+enableval=quick
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`make check' does a thorough or quick check" >&5
+$as_echo_n "checking whether \`make check' does a thorough or quick check... " >&6; }
+# Check whether --enable-check was given.
+if test "${enable_check+set}" = set; then :
+  enableval=$enable_check;
+fi
+
+case "${enableval}" in
+thorough)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: thorough" >&5
+$as_echo "thorough" >&6; }
+  ;;
+quick)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: quick" >&5
+$as_echo "quick" >&6; }
+  ;;
+*)
+  as_fn_error $? "bad value ${enableval} for --enable-check, needs thorough or quick" "$LINENO" 5
+  ;;
+esac
+ if test x"$enableval" = xthorough; then
+  THOROUGH_MAKE_CHECK_TRUE=
+  THOROUGH_MAKE_CHECK_FALSE='#'
+else
+  THOROUGH_MAKE_CHECK_TRUE='#'
+  THOROUGH_MAKE_CHECK_FALSE=
+fi
+
+
+# Libtool.
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+enable_dlopen=yes
+
+
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	ld_shlibs_CXX=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='${wl}-E'
+	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='${wl}-z,text'
+	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+	      '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+	      '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+ if test x"$enable_shared" = xyes; then
+  ENABLE_SHARED_TRUE=
+  ENABLE_SHARED_FALSE='#'
+else
+  ENABLE_SHARED_TRUE='#'
+  ENABLE_SHARED_FALSE=
+fi
+
+ if test x"$enable_static" = xyes; then
+  ENABLE_STATIC_TRUE=
+  ENABLE_STATIC_FALSE='#'
+else
+  ENABLE_STATIC_TRUE='#'
+  ENABLE_STATIC_FALSE=
+fi
+
+
+# Checks for md5sum.
+# Extract the first word of "md5sum", so it can be a program name with args.
+set dummy md5sum; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MD5SUM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MD5SUM"; then
+  ac_cv_prog_MD5SUM="$MD5SUM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MD5SUM="md5sum"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MD5SUM=$ac_cv_prog_MD5SUM
+if test -n "$MD5SUM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MD5SUM" >&5
+$as_echo "$MD5SUM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x$MD5SUM = xmd5sum; then
+  HAVE_MD5SUM_TRUE=
+  HAVE_MD5SUM_FALSE='#'
+else
+  HAVE_MD5SUM_TRUE='#'
+  HAVE_MD5SUM_FALSE=
+fi
+
+if test x$MD5SUM = xmd5sum
+then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the text md5sum command" >&5
+$as_echo_n "checking for the text md5sum command... " >&6; }
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+  ac_cv_prog_text_md5sum='md5sum -t'
+else
+  ac_cv_prog_text_md5sum='md5sum'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_text_md5sum" >&5
+$as_echo "$ac_cv_prog_text_md5sum" >&6; }
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+
+
+fi
+
+# Check for the GLPK library.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+for ac_header in glpk.h glpk/glpk.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ have_glpk=yes
+fi
+
+done
+
+ if test x$have_glpk = xyes; then
+  HAVE_GLPK_TRUE=
+  HAVE_GLPK_FALSE='#'
+else
+  HAVE_GLPK_TRUE='#'
+  HAVE_GLPK_FALSE=
+fi
+
+if test x$have_glpk = xyes
+then
+  ac_save_LIBS="$LIBS"
+  LIBS="$LIBS -lglpk"
+  ac_fn_c_check_decl "$LINENO" "lib_set_print_hook" "ac_cv_have_decl_lib_set_print_hook" "
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_lib_set_print_hook" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS_LIB_SET_PRINT_HOOK 1" >>confdefs.h
+
+fi
+
+  ac_fn_c_check_func "$LINENO" "_glp_lib_print_hook" "ac_cv_func__glp_lib_print_hook"
+if test "x$ac_cv_func__glp_lib_print_hook" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK 1" >>confdefs.h
+
+fi
+
+  ac_fn_c_check_decl "$LINENO" "glp_term_out" "ac_cv_have_decl_glp_term_out" "
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_glp_term_out" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS_GLP_TERM_OUT 1" >>confdefs.h
+
+fi
+
+  ac_fn_c_check_decl "$LINENO" "glp_term_hook" "ac_cv_have_decl_glp_term_hook" "
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_glp_term_hook" = xyes; then :
+
+$as_echo "#define PPL_GLPK_HAS_GLP_TERM_HOOK 1" >>confdefs.h
+
+fi
+
+  LIBS="$ac_save_LIBS"
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+# Checks for header declarations.
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_DATA" "ac_cv_have_decl_RLIMIT_DATA" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_DATA" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_RSS" "ac_cv_have_decl_RLIMIT_RSS" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_RSS" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_VMEM" "ac_cv_have_decl_RLIMIT_VMEM" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_VMEM" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "RLIMIT_AS" "ac_cv_have_decl_RLIMIT_AS" "
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_RLIMIT_AS" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS $ac_have_decl
+_ACEOF
+
+
+ac_fn_cxx_check_decl "$LINENO" "getrusage" "ac_cv_have_decl_getrusage" "
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_getrusage" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETRUSAGE $ac_have_decl
+_ACEOF
+ac_fn_cxx_check_decl "$LINENO" "setrlimit" "ac_cv_have_decl_setrlimit" "
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_setrlimit" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SETRLIMIT $ac_have_decl
+_ACEOF
+
+
+ac_fn_cxx_check_decl "$LINENO" "setitimer" "ac_cv_have_decl_setitimer" "
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_setitimer" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SETITIMER $ac_have_decl
+_ACEOF
+
+
+ac_fn_cxx_check_decl "$LINENO" "sigaction" "ac_cv_have_decl_sigaction" "#include <csignal>
+"
+if test "x$ac_cv_have_decl_sigaction" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SIGACTION $ac_have_decl
+_ACEOF
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+ac_fn_cxx_check_type "$LINENO" "timeval" "ac_cv_type_timeval" "$ac_includes_default"
+if test "x$ac_cv_type_timeval" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_TIMEVAL 1
+_ACEOF
+
+
+fi
+
+ac_fn_cxx_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_siginfo_t" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGINFO_T 1
+_ACEOF
+
+
+fi
+
+
+# Check whether we can limit memory in C and C++ using setrlimit().
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can limit memory in C++ using setrlimit()" >&5
+$as_echo_n "checking whether we can limit memory in C++ using setrlimit()... " >&6; }
+if test "$cross_compiling" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming not" >&5
+$as_echo "assuming not" >&6; }
+  ac_cxx_supports_limiting_memory=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if !HAVE_DECL_SETRLIMIT
+# error "cannot limit memory without setrlimit()"
+#endif
+
+#include <stdexcept>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., ru_utime.
+# include <sys/resource.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#define LIMIT(WHAT) \
+  do {									\
+    if (getrlimit(WHAT, &t) != 0) 					\
+      return false;                                                     \
+    t.rlim_cur = bytes;							\
+    if (setrlimit(WHAT, &t) != 0)					\
+      return false;                                                     \
+  } while (0)
+
+bool
+limit_memory(unsigned long bytes) {
+  struct rlimit t;
+#if HAVE_DECL_RLIMIT_DATA
+  // Limit heap size.
+  LIMIT(RLIMIT_DATA);
+#endif
+#if HAVE_DECL_RLIMIT_RSS
+  // Limit resident set size.
+  LIMIT(RLIMIT_RSS);
+#endif
+#if HAVE_DECL_RLIMIT_VMEM
+  // Limit mapped memory (brk + mmap).
+  LIMIT(RLIMIT_VMEM);
+#endif
+#if HAVE_DECL_RLIMIT_AS
+  // Limit virtual memory.
+  LIMIT(RLIMIT_AS);
+#endif
+  return true;
+}
+
+int
+main() try {
+  if (!limit_memory(10000))
+    return 1;
+  (void) new char[20000];
+  return 1;
+ }
+ catch (std::bad_alloc) {
+   return 0;
+ }
+ catch (...) {
+   return 1;
+ }
+
+_ACEOF
+if ac_fn_cxx_try_run "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  ac_cxx_supports_limiting_memory=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  ac_cxx_supports_limiting_memory=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+if test x"$ac_cxx_supports_limiting_memory" = xyes
+then
+  value=1
+else
+  value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define PPL_CXX_SUPPORTS_LIMITING_MEMORY $value
+_ACEOF
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC or the Intel C/C++ compiler we want to compile
+# with lots of warnings enabled.
+if test x"$GCC" = xyes
+then
+  if test x"$ICC" = xyes
+  then
+    CFLAGS="$CFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+  else
+    CFLAGS="$CFLAGS -W -Wall"
+  fi
+fi
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    CXXFLAGS="$CXXFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+  else
+    CXXFLAGS="$CXXFLAGS -W -Wall"
+  fi
+fi
+
+
+LIBEXT=$libext
+
+SHREXT=$shrext_cmds
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# FIXME: rename headers_sources into sources.
+
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile ppl.lsm src/Makefile src/version.hh src/ppl-config.cc tests/Makefile tests/BD_Shape/Makefile tests/Box/Makefile tests/Concrete_Expression/Makefile tests/CO_Tree/Makefile tests/Grid/Makefile tests/MIP_Problem/Makefile tests/Octagonal_Shape/Makefile tests/Partially_Reduced_Product/Makefile tests/PIP_Problem/Makefile tests/Polyhedron/Makefile tests/Powerset/Makefile tests/Watchdog/Makefile utils/Makefile m4/Makefile demos/Makefile demos/ppl_lcdd/Ma [...]
+
+#               tests/Ask_Tell/Makefile
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GCC_TRUE}" && test -z "${GCC_FALSE}"; then
+  as_fn_error $? "conditional \"GCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ICC_TRUE}" && test -z "${ICC_FALSE}"; then
+  as_fn_error $? "conditional \"ICC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DEBUGGING_ENABLED_TRUE}" && test -z "${DEBUGGING_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"DEBUGGING_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then
+  as_fn_error $? "conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then
+  as_fn_error $? "conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then
+  as_fn_error $? "conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_HPUX_TRUE}" && test -z "${HOST_OS_HPUX_FALSE}"; then
+  as_fn_error $? "conditional \"HOST_OS_HPUX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_MINGW_TRUE}" && test -z "${HOST_OS_MINGW_FALSE}"; then
+  as_fn_error $? "conditional \"HOST_OS_MINGW\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then
+  as_fn_error $? "conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HOST_CPU_X86_64_TRUE}" && test -z "${HOST_CPU_X86_64_FALSE}"; then
+  as_fn_error $? "conditional \"HOST_CPU_X86_64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+  as_fn_error $? "conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then
+  as_fn_error $? "conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then
+  as_fn_error $? "conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then
+  as_fn_error $? "conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then
+  as_fn_error $? "conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then
+  as_fn_error $? "conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then
+  as_fn_error $? "conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then
+  as_fn_error $? "conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then
+  as_fn_error $? "conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then
+  as_fn_error $? "conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then
+  as_fn_error $? "conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then
+  as_fn_error $? "conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE}" && test -z "${SUPPORTED_SOME_FLOATING_POINT_TYPE_FALSE}"; then
+  as_fn_error $? "conditional \"SUPPORTED_SOME_FLOATING_POINT_TYPE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PPL_LCDD_TRUE}" && test -z "${BUILD_PPL_LCDD_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_PPL_LCDD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PPL_LPSOL_TRUE}" && test -z "${BUILD_PPL_LPSOL_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_PPL_LPSOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PPL_PIPS_TRUE}" && test -z "${BUILD_PPL_PIPS_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_PPL_PIPS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_DOCUMENTATION_TRUE}" && test -z "${BUILD_DOCUMENTATION_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_DOCUMENTATION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_CXX_INTERFACE_TRUE}" && test -z "${BUILD_CXX_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_CXX_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_JAVA_INTERFACE_TRUE}" && test -z "${BUILD_JAVA_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_JAVA_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_OCAMLC_TRUE}" && test -z "${HAVE_OCAMLC_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_OCAMLC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_OCAMLOPT_TRUE}" && test -z "${HAVE_OCAMLOPT_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_OCAMLOPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_OCAML_INTERFACE_TRUE}" && test -z "${BUILD_OCAML_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_OCAML_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_SOME_PROLOG_INTERFACES_TRUE}" && test -z "${BUILD_SOME_PROLOG_INTERFACES_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_SOME_PROLOG_INTERFACES\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${VALGRIND_TESTS_ENABLED_TRUE}" && test -z "${VALGRIND_TESTS_ENABLED_FALSE}"; then
+  as_fn_error $? "conditional \"VALGRIND_TESTS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${THOROUGH_MAKE_CHECK_TRUE}" && test -z "${THOROUGH_MAKE_CHECK_FALSE}"; then
+  as_fn_error $? "conditional \"THOROUGH_MAKE_CHECK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by the Parma Polyhedra Library $as_me 1.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <ppl-devel at cs.unipr.it>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+the Parma Polyhedra Library config.status 1.1
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "ppl.lsm") CONFIG_FILES="$CONFIG_FILES ppl.lsm" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "src/version.hh") CONFIG_FILES="$CONFIG_FILES src/version.hh" ;;
+    "src/ppl-config.cc") CONFIG_FILES="$CONFIG_FILES src/ppl-config.cc" ;;
+    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+    "tests/BD_Shape/Makefile") CONFIG_FILES="$CONFIG_FILES tests/BD_Shape/Makefile" ;;
+    "tests/Box/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Box/Makefile" ;;
+    "tests/Concrete_Expression/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Concrete_Expression/Makefile" ;;
+    "tests/CO_Tree/Makefile") CONFIG_FILES="$CONFIG_FILES tests/CO_Tree/Makefile" ;;
+    "tests/Grid/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Grid/Makefile" ;;
+    "tests/MIP_Problem/Makefile") CONFIG_FILES="$CONFIG_FILES tests/MIP_Problem/Makefile" ;;
+    "tests/Octagonal_Shape/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Octagonal_Shape/Makefile" ;;
+    "tests/Partially_Reduced_Product/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Partially_Reduced_Product/Makefile" ;;
+    "tests/PIP_Problem/Makefile") CONFIG_FILES="$CONFIG_FILES tests/PIP_Problem/Makefile" ;;
+    "tests/Polyhedron/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;;
+    "tests/Powerset/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Powerset/Makefile" ;;
+    "tests/Watchdog/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Watchdog/Makefile" ;;
+    "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "demos/Makefile") CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;;
+    "demos/ppl_lcdd/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/Makefile" ;;
+    "demos/ppl_lcdd/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lcdd/examples/Makefile" ;;
+    "demos/ppl_lpsol/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/Makefile" ;;
+    "demos/ppl_lpsol/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_lpsol/examples/Makefile" ;;
+    "demos/ppl_pips/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_pips/Makefile" ;;
+    "demos/ppl_pips/examples/Makefile") CONFIG_FILES="$CONFIG_FILES demos/ppl_pips/examples/Makefile" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "doc/user.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-latex" ;;
+    "doc/devref.doxyconf-latex") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-latex" ;;
+    "doc/user.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/user.doxyconf-html" ;;
+    "doc/devref.doxyconf-html") CONFIG_FILES="$CONFIG_FILES doc/devref.doxyconf-html" ;;
+    "doc/user-language-interface.doxyconf") CONFIG_FILES="$CONFIG_FILES doc/user-language-interface.doxyconf" ;;
+    "doc/devref-language-interface.doxyconf") CONFIG_FILES="$CONFIG_FILES doc/devref-language-interface.doxyconf" ;;
+    "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
+    "interfaces/C/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/C/Makefile" ;;
+    "interfaces/C/ppl_c_version.h") CONFIG_FILES="$CONFIG_FILES interfaces/C/ppl_c_version.h" ;;
+    "interfaces/C/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/C/tests/Makefile" ;;
+    "interfaces/Java/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/Makefile" ;;
+    "interfaces/Java/jni/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/jni/Makefile" ;;
+    "interfaces/Java/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/tests/Makefile" ;;
+    "interfaces/Java/parma_polyhedra_library/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Java/parma_polyhedra_library/Makefile" ;;
+    "interfaces/OCaml/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/OCaml/Makefile" ;;
+    "interfaces/OCaml/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/OCaml/tests/Makefile" ;;
+    "interfaces/Prolog/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Makefile" ;;
+    "interfaces/Prolog/Ciao/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/Ciao/Makefile" ;;
+    "interfaces/Prolog/GNU/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/GNU/Makefile" ;;
+    "interfaces/Prolog/SICStus/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SICStus/Makefile" ;;
+    "interfaces/Prolog/SWI/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/SWI/Makefile" ;;
+    "interfaces/Prolog/XSB/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/XSB/Makefile" ;;
+    "interfaces/Prolog/YAP/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/YAP/Makefile" ;;
+    "interfaces/Prolog/tests/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Prolog/tests/Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+if test x"$gmp_supports_exceptions" = xno
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL.  Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** \`-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local" >&5
+$as_echo "$as_me: WARNING: CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL.  Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** \`-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local" >&2;}
+fi
+
+if test x"$PERL" = xno
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PERL UNAVAILABLE:
+***  CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system.  This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy.  If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information." >&5
+$as_echo "$as_me: WARNING: PERL UNAVAILABLE:
+***  CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system.  This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy.  If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information." >&2;}
+fi
+
+if test x"$coefficient_kind" = xnative
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients.  This means that arithmetic overflows will be possible
+*** and will not be detected.  The consequence of that is that nothing
+*** can be said about the behavior of the library:  whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build.  Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved.  Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+***     computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+***     cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+***     trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead." >&5
+$as_echo "$as_me: WARNING: USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients.  This means that arithmetic overflows will be possible
+*** and will not be detected.  The consequence of that is that nothing
+*** can be said about the behavior of the library:  whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build.  Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved.  Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+***     computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+***     cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+***     trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead." >&2;}
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..25f3ba3
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,1751 @@
+# Autoconf source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Process this file with Autoconf to produce a configure script.
+
+# Every other copy of the package version number gets its value from here.
+AC_INIT([the Parma Polyhedra Library], [1.1], [ppl-devel at cs.unipr.it], [ppl])
+
+# Minimum Autoconf version required.
+AC_PREREQ(2.61)
+
+# Make sure the sources are there.
+AC_CONFIG_SRCDIR(src/Polyhedron_public.cc)
+
+# Specify the location of additional local Autoconf macros.
+AC_CONFIG_MACRO_DIR([m4])
+
+# Determine the system type and set output variables to the names of
+# the canonical system types.
+AC_CANONICAL_HOST
+
+# Use Automake.
+AM_INIT_AUTOMAKE([foreign no-define dist-bzip2 dist-zip dist-xz tar-ustar silent-rules 1.11])
+
+AC_SUBST(VERSION)
+
+# Version number machinery.
+changequote(<<, >>)dnl
+if test -n "`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`"
+then
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_REVISION=`expr $VERSION : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*\.[0-9]*pre\([0-9]*\)'`
+else
+  PPL_VERSION_MAJOR=`expr $VERSION : '\([0-9]*\)\.[0-9]*'`
+  PPL_VERSION_MINOR=`expr $VERSION : '[0-9]*\.\([0-9]*\)'`
+  PPL_VERSION_REVISION=0
+  PPL_VERSION_BETA=`expr $VERSION : '[0-9]*\.[0-9]*pre\([0-9]*\)'`
+fi
+if test -z "$PPL_VERSION_BETA"
+then
+  PPL_VERSION_BETA=0
+fi
+changequote([, ])dnl
+AC_SUBST(PPL_VERSION_MAJOR)
+AC_SUBST(PPL_VERSION_MINOR)
+AC_SUBST(PPL_VERSION_REVISION)
+AC_SUBST(PPL_VERSION_BETA)
+
+AC_DEFINE_UNQUOTED(PPL_CONFIGURE_OPTIONS, "$ac_configure_args", [This contains the options with which `configure' was invoked.])
+PPL_CONFIGURE_OPTIONS="\"$ac_configure_args\""
+AC_SUBST(CONFIGURE_OPTIONS)
+
+# Generate a configuration header file.
+AC_CONFIG_HEADER([config.h])
+
+ISODATE=`date +%Y-%m-%d`
+AC_SUBST(ISODATE)
+
+AH_TOP([
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+   floating point format.  */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+])
+
+AH_BOTTOM([
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+   we must make sure <stdint.h> is included before <sys/types.hh> is
+   (even indirectly) included.  Moreover we need to define
+   __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+   in order to have the macros defined also in C++.  */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+])
+
+
+# C compiler.
+
+AC_ARG_WITH(cc,
+  AS_HELP_STRING([--with-cc=XXX], [use XXX as the C compiler]),
+  CC=$with_cc)
+
+# C++ compiler.
+
+AC_ARG_WITH(cxx,
+  AS_HELP_STRING([--with-cxx=XXX], [use XXX as the C++ compiler]),
+  CXX=$with_cxx)
+
+# Checks for programs.
+
+# Note that AC_PROG_CC must precede the first use of $GCC and AC_PROG_CXX
+# must precede the first use of $GXX.  Note also that we do not allow
+# AC_PROG_CC and AC_PROG_CXX to affect CFLAGS and CXXFLAGS.
+save_CFLAGS="$CFLAGS"
+AC_PROG_CC
+CFLAGS="$save_CFLAGS"
+
+AM_CONDITIONAL(GCC, test x"$GCC" = xyes)
+
+# The Intel C compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using the Intel C compiler])
+  AC_LANG_PUSH(C)
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  ICC=yes,
+  AC_MSG_RESULT(no)
+  ICC=no,
+  AC_MSG_RESULT(no)
+  ICC=no)
+  AC_LANG_POP(C)
+fi
+
+AM_CONDITIONAL(ICC, test x"$ICC" = xyes)
+
+# The clang compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using clang])
+  AC_LANG_PUSH(C)
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __clang__
+choke me
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  CLANG=yes,
+  AC_MSG_RESULT(no)
+  CLANG=no,
+  AC_MSG_RESULT(no)
+  CLANG=no)
+  AC_LANG_POP(C)
+fi
+
+# The llvm-gcc compiler masquerades as gcc, but we want to know.
+if test x"$GCC" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using llvm-gcc])
+  AC_LANG_PUSH(C)
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+int main() {
+  return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  LLVM_GCC=yes,
+  AC_MSG_RESULT(no)
+  LLVM_GCC=no,
+  AC_MSG_RESULT(no)
+  LLVM_GCC=no)
+  CFLAGS="$save_CFLAGS"
+  AC_LANG_POP(C)
+fi
+
+save_CXXFLAGS="$CXXFLAGS"
+AC_PROG_CXX
+CXXFLAGS="$save_CXXFLAGS"
+
+# The Intel C++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using the Intel C++ compiler])
+  AC_LANG_PUSH(C++)
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __INTEL_COMPILER
+choke me
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  ICPC=yes,
+  AC_MSG_RESULT(no)
+  ICPC=no,
+  AC_MSG_RESULT(no)
+  ICPC=no)
+  AC_LANG_POP(C++)
+fi
+
+# The clang++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using clang++])
+  AC_LANG_PUSH(C++)
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#ifndef __clang__
+choke me
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  CLANGXX=yes,
+  AC_MSG_RESULT(no)
+  CLANGXX=no,
+  AC_MSG_RESULT(no)
+  CLANGXX=no)
+  AC_LANG_POP(C++)
+fi
+
+# The llvm-++ compiler masquerades as g++, but we want to know.
+if test x"$GXX" = xyes
+then
+  AC_MSG_CHECKING([whether we are actually using llvm-g++])
+  AC_LANG_PUSH(C++)
+  save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS="-fplugin-arg-dragonegg-emit-ir -S"
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+int main() {
+  return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  LLVM_GXX=yes,
+  AC_MSG_RESULT(no)
+  LLVM_GXX=no,
+  AC_MSG_RESULT(no)
+  LLVM_GXX=no)
+  CXXFLAGS="$save_CXXFLAGS"
+  AC_LANG_POP(C++)
+fi
+
+
+AC_PROG_FGREP
+AC_PROG_EGREP
+AC_PROG_SED
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Compilation flags.
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+AC_MSG_CHECKING([whether to compile with debug info])
+AC_ARG_ENABLE(debugging,
+  AS_HELP_STRING([--enable-debugging], [compile with debugging information]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-debugging, needs yes or no])
+  ;;
+esac
+AM_CONDITIONAL(DEBUGGING_ENABLED, test x"$enableval" = xyes)
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for profiling])
+AC_ARG_ENABLE(profiling,
+  AS_HELP_STRING([--enable-profiling], [compile for profiling]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -pg -DPPL_PROFILING=1"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-profiling, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for test coverage])
+AC_ARG_ENABLE(coverage,
+  AS_HELP_STRING([--enable-coverage], [compile for test coverage]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  OPT_FLAGS="-g"
+  COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+  extra_libraries="${extra_libraries} -lgcov"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-coverage, needs yes or no])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether to enable checking of run-time assertions])
+AC_ARG_ENABLE(assertions,
+  AS_HELP_STRING([--enable-assertions], [check run-time assertions]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-assertions, needs yes or no])
+  ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+AC_MSG_CHECKING([whether to enable even more run-time assertions])
+AC_ARG_ENABLE(more-assertions,
+  AS_HELP_STRING([--enable-more-assertions],
+                 [break the ABI to check even more run-time assertions]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-more-assertions, needs yes or no])
+  ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+  enable_assertions=yes
+  AC_DEFINE(PPL_ABI_BREAKING_EXTRA_DEBUG, 1, [ABI-breaking extra assertions are enabled when this is defined.])
+  AC_DEFINE(_GLIBCXX_DEBUG, 1, [When defined and libstdc++ is used, it is used in debug mode.])
+  AC_DEFINE(_GLIBCXX_DEBUG_PEDANTIC, 1, [When defined and libstdc++ is used, it is used in pedantic debug mode.])
+fi
+
+if test x"$enable_assertions" = xno
+then
+  AC_DEFINE(PPL_NDEBUG, 1, [Assertions are disabled when this is defined.])
+  debug_flag="-DNDEBUG=1"
+fi
+
+AM_CONDITIONAL(ASSERTIONS_ENABLED, test x"$enable_assertions" = xyes)
+
+
+arch=no
+enableval=standard
+AC_MSG_CHECKING([whether to enable optimizations])
+AC_ARG_ENABLE(optimization,
+  AS_HELP_STRING([--enable-optimization@<:@=LEVEL@:>@],
+                 [enable compiler optimizations]))
+case "${enableval}" in
+sspeed)
+  AC_MSG_RESULT(sspeed)
+  OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+  arch=yes
+  ;;
+speed)
+  AC_MSG_RESULT(speed)
+  OPT_FLAGS="$OPT_FLAGS -O3"
+  arch=yes
+  ;;
+size)
+  AC_MSG_RESULT(size)
+  OPT_FLAGS="$OPT_FLAGS -Os"
+  arch=yes
+  ;;
+standard | yes)
+  AC_MSG_RESULT(standard)
+  OPT_FLAGS="$OPT_FLAGS -O2"
+  ;;
+mild)
+  AC_MSG_RESULT(mild)
+  OPT_FLAGS="$OPT_FLAGS -O1"
+  ;;
+zero)
+  AC_MSG_RESULT(zero)
+  OPT_FLAGS="$OPT_FLAGS -O0"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no])
+  ;;
+esac
+
+enableval=$arch
+AC_MSG_CHECKING([for which architecture to optimize])
+AC_ARG_ENABLE(arch,
+  AS_HELP_STRING([--enable-arch@<:@=ARCH@:>@],
+                 [optimize for architecture ARCH]))
+case "${enableval}" in
+yes)
+  m=`uname -m`
+  case $m in
+  i?86 | k6 | athlon)
+    AC_MSG_RESULT($m)
+    OPT_FLAGS="$OPT_FLAGS -march=$m"
+    ;;
+  *)
+    AC_MSG_RESULT(default)
+    ;;
+  esac
+  ;;
+no)
+  AC_MSG_RESULT(default)
+  ;;
+*)
+  AC_MSG_RESULT($enableval)
+  OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+  ;;
+esac
+
+enableval=default
+use_fpmath=yes
+fpmath_may_use_387=yes
+fpmath_may_use_sse=yes
+AC_MSG_CHECKING([whether to use (a specific) floating point arithmetic])
+AC_ARG_ENABLE(fpmath,
+  AS_HELP_STRING([--enable-fpmath=INSTRUCTION_SET],
+                 [select floating point arithmetic]))
+case "${enableval}" in
+sse)
+  AC_MSG_RESULT(sse)
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse"
+  # The SSE instruction set only supports single precision arithmetic:
+  # double and extended precision arithmetic is still done using 387.
+  ;;
+sse2)
+  AC_MSG_RESULT(sse2)
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse"
+  # SSE2 still does not support extended precision arithmetic.
+  ;;
+387)
+  AC_MSG_RESULT(387)
+  OPT_FLAGS="$OPT_FLAGS -mno-sse -mno-sse2 -mfpmath=387"
+  # Note that the -mno-sse* and -mfpmath options are only guaranteed
+  # to work with GCC.
+  if test x"$GCC" = xyes
+  then
+    fpmath_may_use_sse=no
+  fi
+  ;;
+sse+387)
+  AC_MSG_RESULT(sse+387)
+  OPT_FLAGS="$OPT_FLAGS -msse -mfpmath=sse,387"
+  ;;
+sse2+387)
+  AC_MSG_RESULT(sse2+387)
+  OPT_FLAGS="$OPT_FLAGS -msse2 -mfpmath=sse,387"
+  ;;
+default)
+  AC_MSG_RESULT(default)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  use_fpmath=no
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-fpmath, needs sse, sse2, 387, sse+387, sse2+387, default or no])
+  ;;
+esac
+
+if test x"$fpmath_may_use_387" = xyes
+then
+  AC_DEFINE(PPL_FPMATH_MAY_USE_387, 1, [Defined if floating point arithmetic may use the 387 unit.])
+fi
+
+if test x"$fpmath_may_use_sse" = xyes
+then
+  AC_DEFINE(PPL_FPMATH_MAY_USE_SSE, 1, [Defined if floating point arithmetic may use the SSE instruction set.])
+fi
+
+# Disable all transformations and optimizations that assume default
+# floating point rounding behavior.
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    OPT_FLAGS="$OPT_FLAGS -fp-model strict -fp-speculation off"
+  else
+    # -frounding-math is not yet supported in clang++ or llvm-g++.
+    if test x"$CLANGXX" = xyes || x"$LLVM_GXX" = xyes
+    then
+      if test x"$use_fpmath" = xyes
+      then
+        AC_MSG_WARN([CANNOT RELY ON DIRECTED ROUNDING:
+*** DISABLED ALL ABSTRACTIONS BASED ON MACHINE FLOATING-POINT NUMBERS.
+*** A compiler has been detected that does not provide support for
+*** -frounding-math (or any other option with the same semantics).
+*** Hence, we cannot rely on floating-point computations to happen
+*** in agreement with the rounding direction(s) used by the PPL.])
+        use_fpmath=no
+      fi
+    else
+      OPT_FLAGS="$OPT_FLAGS -frounding-math"
+    fi
+  fi
+fi
+
+enableval=no
+AC_MSG_CHECKING([whether to use precompiled headers])
+AC_ARG_ENABLE(pch,
+  AS_HELP_STRING([--enable-pch],
+                 [use precompiled headers, if available]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-pch, needs yes or no])
+  ;;
+esac
+AM_CONDITIONAL(USE_PRECOMPILED_HEADERS, test x"$enableval" = xyes)
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS $CFLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS $CXXFLAGS"
+
+# System-dependent adjustments.
+cygwin=no
+mingw=no
+darwin=no
+solaris=no
+x86_64=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+  if test x"$GCC" = xyes
+  then
+    CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+    CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee-with-inexact"
+  else
+    CFLAGS="$CFLAGS -fprm d -ieee_with_inexact"
+    CXXFLAGS="$CXXFLAGS -fprm d -ieee_with_inexact"
+  fi
+  ;;
+x86_64*)
+  x86_64=yes
+  ;;
+*)
+  ;;
+esac
+
+case "${host_os}" in
+cygwin*)
+  cygwin=yes
+  no_undefined=yes
+  shared_library_path_env_var=PATH
+  ;;
+darwin*)
+  darwin=yes
+  shared_library_path_env_var=DYLD_LIBRARY_PATH
+  ;;
+hpux*)
+  hpux=yes
+  shared_library_path_env_var=SHLIB_PATH
+  ;;
+mingw*)
+  mingw=yes
+  no_undefined=yes
+  shared_library_path_env_var=PATH
+  ;;
+solaris*)
+  solaris=yes
+  shared_library_path_env_var=LD_LIBRARY_PATH
+  ;;
+*)
+  shared_library_path_env_var=LD_LIBRARY_PATH
+  ;;
+esac
+
+AM_CONDITIONAL(HOST_OS_CYGWIN, test x$cygwin = xyes)
+AM_CONDITIONAL(HOST_OS_DARWIN, test x$darwin = xyes)
+AM_CONDITIONAL(HOST_OS_HPUX, test x$hpux = xyes)
+AM_CONDITIONAL(HOST_OS_MINGW, test x$mingw = xyes)
+AM_CONDITIONAL(HOST_OS_SOLARIS, test x$solaris = xyes)
+
+AM_CONDITIONAL(HOST_CPU_X86_64, test x$x86_64 = xyes)
+
+AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
+
+
+enableval=mpz
+AC_MSG_CHECKING([the type of integral values to use as coefficients])
+AC_ARG_ENABLE(coefficients,
+  AS_HELP_STRING([--enable-coefficients=TYPE],
+                 [select the type of the coefficients]))
+case "${enableval}" in
+native-int8)
+  AC_MSG_RESULT([native 8 bits integers])
+  coefficient_kind=native
+  coefficient_bits=8
+  coefficient_mnemonic=nint8
+  ;;
+native-int16)
+  AC_MSG_RESULT([native 16 bits integers])
+  coefficient_kind=native
+  coefficient_bits=16
+  coefficient_mnemonic=nint16
+  ;;
+native-int32)
+  AC_MSG_RESULT([native 32 bits integers])
+  coefficient_kind=native
+  coefficient_bits=32
+  coefficient_mnemonic=nint32
+  ;;
+native-int64)
+  AC_MSG_RESULT([native 64 bits integers])
+  coefficient_kind=native
+  coefficient_bits=64
+  coefficient_mnemonic=nint64
+  ;;
+checked-int8)
+  AC_MSG_RESULT([checked 8 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=8
+  coefficient_mnemonic=int8
+  ;;
+checked-int16)
+  AC_MSG_RESULT([checked 16 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=16
+  coefficient_mnemonic=int16
+  ;;
+checked-int32)
+  AC_MSG_RESULT([checked 32 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=32
+  coefficient_mnemonic=int32
+  ;;
+checked-int64)
+  AC_MSG_RESULT([checked 64 bits integers])
+  coefficient_kind=checked
+  coefficient_bits=64
+  coefficient_mnemonic=int64
+  ;;
+mpz)
+  AC_MSG_RESULT([GMP mpz])
+  coefficient_kind=unbounded
+  coefficient_bits=0
+  coefficient_mnemonic=mpz
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-coefficients, checked-int32, checked-int64, checked-int16, checked-int8, mpz, native-int32, native-int64, native-int16 or native-int8])
+  ;;
+esac
+
+AM_CONDITIONAL(USE_NATIVE_INTEGERS, test x"$coefficient_kind" = xnative)
+AM_CONDITIONAL(USE_CHECKED_INTEGERS, test x"$coefficient_kind" = xchecked)
+AM_CONDITIONAL(USE_GMP_INTEGERS, test x"$coefficient_kind" = xunbounded)
+AM_CONDITIONAL(USE_INT8, test x"$coefficient_bits" = x8)
+AM_CONDITIONAL(USE_INT16, test x"$coefficient_bits" = x16)
+AM_CONDITIONAL(USE_INT32, test x"$coefficient_bits" = x32)
+AM_CONDITIONAL(USE_INT64, test x"$coefficient_bits" = x64)
+
+
+if test x"$coefficient_kind" = xnative
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Checked_Number_Transparent_Policy<int${coefficient_bits}_t> >"
+  AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_TYPE, $coefficient_type, [The integral type used to represent coefficients.])
+  AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_BITS, $coefficient_bits, [The number of bits of coefficients; 0 if unbounded.])
+  AC_DEFINE(PPL_NATIVE_INTEGERS, 1, [Defined if the integral type to be used for coefficients is a native one.])
+elif test x"$coefficient_kind" = xchecked
+then
+  coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t, Bounded_Integer_Coefficient_Policy>"
+  AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_TYPE, $coefficient_type)
+  AC_DEFINE_UNQUOTED(PPL_COEFFICIENT_BITS, $coefficient_bits)
+  AC_DEFINE(PPL_CHECKED_INTEGERS, 1, [Defined if the integral type to be used for coefficients is a checked one.])
+elif test x"$coefficient_kind" = xunbounded
+then
+  AC_DEFINE(PPL_COEFFICIENT_TYPE, mpz_class)
+  AC_DEFINE(PPL_COEFFICIENT_BITS, 0)
+  AC_DEFINE(PPL_GMP_INTEGERS, 1, [Defined if the integral type to be used for coefficients is GMP's one.])
+fi
+
+# Allow additions to C compilation flags.
+AC_ARG_WITH(cflags,
+  AS_HELP_STRING([--with-cflags=XXX],
+                 [add XXX to the options for the C compiler]),
+  CFLAGS="$CFLAGS $with_cflags")
+
+# Allow additions to C++ compilation flags.
+AC_ARG_WITH(cxxflags,
+  AS_HELP_STRING([--with-cxxflags=XXX],
+                 [add XXX to the options for the C++ compiler]),
+  CXXFLAGS="$CXXFLAGS $with_cxxflags")
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+AC_LANG(C)
+AC_C_CONST
+AC_C_INLINE
+AC_C_BIGENDIAN
+AC_C_TYPEOF
+
+# Checks for C type sizes.
+AC_CHECK_SIZEOF(char)
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(long long)
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(float)
+AC_CHECK_SIZEOF(double)
+AC_CHECK_SIZEOF(long double)
+# The following are required to validate an horrible kludge working
+# around an horrible bug in <gprolog.h> (see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+AC_CHECK_SIZEOF([int*])
+AC_CHECK_SIZEOF([fp], [], [typedef int *(*fp)();])
+
+# Check for Perl.
+AC_PATH_PROG([PERL], perl, no)
+AC_SUBST([PERL])
+AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno)
+
+# Use C++ for the remaining checks.
+AC_LANG(C++)
+
+# The PPL uses <cmath> for sqrt and other functions in several places.
+AC_SEARCH_LIBS([sqrt], [m])
+
+if test x"$use_fpmath" = xyes
+then
+  # Check for the possibility to control the FPU.
+  AC_CHECK_FPU_CONTROL
+else
+  ac_cv_can_control_fpu=0
+fi
+AM_CONDITIONAL(CAN_CONTROL_FPU, test $ac_cv_can_control_fpu = 1)
+AC_DEFINE_UNQUOTED(PPL_CAN_CONTROL_FPU, $ac_cv_can_control_fpu,
+    [Not zero if the FPU can be controlled.])
+
+# Check whether for the C++ compiler the plain char type is signed.
+AC_CXX_PLAIN_CHAR_IS_SIGNED
+
+# Check whether the C++ compiler provides proper long doubles.
+AC_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
+# Detect the binary format used by C++ floats.
+AC_CXX_FLOAT_BINARY_FORMAT
+
+# Detect the binary format used by C++ doubles.
+AC_CXX_DOUBLE_BINARY_FORMAT
+
+# Detect the binary format used by C++ long doubles.
+AC_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+# Test if some floating-point type is supported.
+if test $ac_supported_float = 1 \
+|| test $ac_supported_double = 1 \
+|| test $ac_supported_long_double = 1
+then
+  supported_some_floating_point_type=yes
+fi
+AM_CONDITIONAL(SUPPORTED_SOME_FLOATING_POINT_TYPE,
+               test x$supported_some_floating_point_type = xyes)
+
+# Check whether the C++ compiler supports zero-length arrays.
+AC_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+
+# Check whether the IEEE inexact flag is supported in C++.
+AC_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+AC_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+# Checks for header files.
+AC_CHECK_HEADERS([fenv.h ieeefp.h getopt.h signal.h string.h strings.h sys/resource.h sys/time.h sys/types.h unistd.h])
+
+# Checks for the availability of C library functions in C++.
+AC_CHECK_DECLS([ffs],
+               ,
+               ,
+               [
+#if defined(HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(HAVE_STRING_H)
+# include <string.h>
+#endif
+               ])
+AC_CHECK_DECLS([getenv,strtof,strtod,strtold,strtoll,strtoull], , , [#include <cstdlib>])
+AC_CHECK_DECLS([fma,fmaf,fmal,rintf,rintl], , , [#include <cmath>])
+
+# Checks for the availability of "fast" integral types.
+AC_CHECK_TYPES([int_fast16_t,int_fast32_t,int_fast64_t,uint_fast16_t,uint_fast32_t,uint_fast64_t])
+
+# Make sure uintptr_t is defined to an unsigned integer type wide enough
+# to hold a pointer, if such a type exists.
+AC_TYPE_UINTPTR_T
+
+
+# Checks on the GMP library.
+
+AC_CHECK_GMP
+if test x"$have_gmp" = xno
+then
+  AC_MSG_ERROR([Cannot find GMP version 4.1.3 or higher.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options.])
+else
+  if test x"$have_gmpxx" = xno
+  then
+    AC_MSG_ERROR([GMP compiled without enabling the C++ interface.
+GMP is the GNU Multi-Precision library:
+see http://www.swox.com/gmp/ for more information.
+When compiling the GMP library, do not forget to enable the C++ interface:
+add --enable-cxx to the configuration options.])
+  fi
+fi
+
+AC_CHECK_MEMBERS([__mpz_struct._mp_alloc,
+                  __mpz_struct._mp_size,
+                  __mpz_struct._mp_d],
+                 ,
+                 gmp_has_changes=yes,
+                 [#include <gmp.h>])
+
+if test x"$gmp_has_changed" = xyes
+then
+  AC_MSG_ERROR([GMP HAS CHANGED:
+*** The PPL exploits some implementation details of GMP that were current
+*** until (at least) version 4.1.4 of GMP.  You seem to be using a version
+*** where these details have changed.
+*** Please report this to ppl-devel at cs.unipr.it.])
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_include_options}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_options}"
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the ppl_lcdd program])
+AC_ARG_ENABLE(ppl_lcdd,
+  AS_HELP_STRING([--enable-ppl_lcdd], [build the ppl_lcdd program]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-ppl_lcdd, needs yes or no])
+  ;;
+esac
+build_ppl_lcdd=$enableval
+AM_CONDITIONAL(BUILD_PPL_LCDD, test x"$build_ppl_lcdd" = xyes)
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the ppl_lpsol program])
+AC_ARG_ENABLE(ppl_lpsol,
+  AS_HELP_STRING([--enable-ppl_lpsol], [build the ppl_lpsol program]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-ppl_lpsol, needs yes or no])
+  ;;
+esac
+build_ppl_lpsol=$enableval
+AM_CONDITIONAL(BUILD_PPL_LPSOL, test x"$build_ppl_lpsol" = xyes)
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the ppl_pips program])
+AC_ARG_ENABLE(ppl_pips,
+  AS_HELP_STRING([--enable-ppl_pips], [build the ppl_pips program]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-ppl_pips, needs yes or no])
+  ;;
+esac
+build_ppl_pips=$enableval
+AM_CONDITIONAL(BUILD_PPL_PIPS, test x"$build_ppl_pips" = xyes)
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the PPL documentation])
+AC_ARG_ENABLE(documentation,
+  AS_HELP_STRING([--enable-documentation], [build the PPL documentation]))
+case "${enableval}" in
+yes)
+  AC_MSG_RESULT(yes)
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-documentation, needs yes or no])
+  ;;
+esac
+build_documentation=$enableval
+AM_CONDITIONAL(BUILD_DOCUMENTATION, test x"$build_documentation" = xyes)
+
+# Define lists of available interfaces: lowercase and blank-separated.
+non_prolog_interfaces="cxx c ocaml java"
+prolog_interfaces="ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+available_interfaces="${non_prolog_interfaces} ${prolog_interfaces}"
+
+# This is the list of interfaces that are enabled by default.
+default_interfaces=${non_prolog_interfaces}
+
+enableval=not_specified
+AC_MSG_CHECKING([which interfaces are enabled])
+AC_ARG_ENABLE(interfaces,
+  AS_HELP_STRING([--enable-interfaces=INTERFACES],
+                 [enable some or all the library interfaces]))
+case x"${enableval}" in
+xyes | x)
+  AC_MSG_ERROR([--enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all])
+  ;;
+xnone | xno)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=no
+  done
+  AC_MSG_RESULT(none)
+  ;;
+xall)
+  for interface in ${available_interfaces}
+  do
+    eval ${interface}_interface_enabled=yes
+  done
+  AC_MSG_RESULT([${available_interfaces}])
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_interfaces}
+  fi
+  # Make the list blank-separated and lowercase; turn "c++" into "cxx".
+  required_interfaces=`echo "${enableval}" | sed -e 's/-/_/g' -e 's/[[  ,]][[   ,]]*/ /g' -e 's/c++/cxx/g' | tr '[[:upper:]]' '[[:lower:]]'`
+  # Check that the specified interfaces exist.
+  for interface in ${required_interfaces}
+  do
+    case " ${available_interfaces} " in
+    *\ ${interface}\ *)
+      ;;
+    *)
+      AC_MSG_ERROR([unknown interface ${interface}: must be one of ${available_interfaces}])
+      ;;
+    esac
+  done
+  # Initialize the enabled variable for each interface.
+  for interface in ${available_interfaces}
+  do
+    case " ${required_interfaces} " in
+    *\ ${interface}\ *)
+      eval ${interface}_interface_enabled=yes
+      enabled_interfaces="${enabled_interfaces}${enabled_interfaces:+ }${interface}"
+      ;;
+    *)
+      eval ${interface}_interface_enabled=no
+      ;;
+    esac
+  done
+  AC_MSG_RESULT([${enabled_interfaces}])
+  ;;
+esac
+
+if test x${cxx_interface_enabled} = xyes
+then
+  build_cxx_interface=yes
+fi
+AM_CONDITIONAL(BUILD_CXX_INTERFACE, test x$build_cxx_interface = xyes)
+
+if test x${c_interface_enabled} = xyes
+then
+  build_c_interface=yes
+fi
+AM_CONDITIONAL(BUILD_C_INTERFACE, test x$build_c_interface = xyes)
+
+# Checks for systems for which the interface is enabled.
+
+# Allow to specify the Java SDK installation directory.
+AC_ARG_WITH(java,
+  AS_HELP_STRING([--with-java=DIR], [use the Java SDK installed in DIR]),
+  java_dir=$with_java)
+
+case "${host_os}" in
+# On Darwin the JDK, if present, is installed in /Library/Java/Home .
+darwin*)
+  if test "x$java_dir" = x
+  then
+    java_dir="/Library/Java/Home"
+  fi
+  ;;
+# On modern Fedora systems the JDK is usually in /usr/lib/jvm/java .
+linux*)
+  if test "x$java_dir" = x
+  then
+    java_dir="/usr/lib/jvm/java"
+  fi
+  ;;
+*)
+  ;;
+esac
+
+if test "x$java_dir" != x
+then
+  JAVAPREFIX="${java_dir}/bin"
+fi
+
+# Checks for Java.
+if test x${java_interface_enabled} = xyes
+then
+  # Check for Java programs. Order here is important: check first
+  # for the compiler.
+  AC_PROG_JAVAC
+  AC_PROG_JAVA
+  AC_PROG_JAR
+  AC_PROG_JAVAH
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $JNIFLAGS"
+  AC_LANG_PUSH(C++)
+  AC_MSG_CHECKING([whether jlong can contain data pointers])
+  AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <jni.h>
+
+    int
+    main() {
+      if (sizeof(jlong) >= sizeof(void*))
+        return 0;
+      else
+        return 1;
+    }
+  ]])],
+  ac_jlong_can_contain_pointers=yes
+  AC_MSG_RESULT(yes),
+  ac_jlong_can_contain_pointers=no
+  AC_MSG_RESULT(no),
+  ac_jlong_can_contain_pointers=no
+  AC_MSG_RESULT([assuming it cannot]))
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+# In order to build the Java interface, it must be enabled and all the
+# Java tools must be available.
+if test x${java_interface_enabled} = xyes \
+&& test "x$JAVA" != xno \
+&& test "x$ac_cv_javac_supports_enums" != xno \
+&& test "x$JAR" != xno \
+&& test "x$JAVAH" != xno \
+&& test x${ac_jlong_can_contain_pointers} = xyes
+then
+  build_java_interface=yes
+fi
+AM_CONDITIONAL(BUILD_JAVA_INTERFACE, test x$build_java_interface = xyes)
+
+
+# Allow to specify the ML GMP installation directory.
+AC_ARG_WITH(mlgmp,
+  AS_HELP_STRING([--with-mlgmp=DIR],
+                 [use the ML GMP package installed in DIR]),
+  mlgmp_dir=$with_mlgmp,
+  mlgmp_dir=+gmp)
+
+# Checks for OCaml.
+if test x${ocaml_interface_enabled} = xyes
+then
+  # Detect which tools of the OCaml toolchain are available.
+  AC_PROG_OCAML
+  if test x"$OCAMLC" != xno
+  then
+    # Check for the bytecode version of ML GMP.
+    AC_MSG_CHECKING([for ML GMP bytecode module gmp.cma])
+    if ( test ${mlgmp_dir} = +gmp && test -f ${OCAMLLIB}/gmp/gmp.cma ) \
+      || test -f ${mlgmp_dir}/gmp.cma;
+    then
+      AC_MSG_RESULT(yes)
+      ocamlc_gmp="yes"
+    else
+      AC_MSG_RESULT(no)
+      ocamlc_gmp="no"
+    fi
+    if test x"$OCAMLOPT" != xno
+    then
+      ocamlopt_root=`${OCAMLOPT} -where`
+      # Check for the native version of ML GMP.
+      AC_MSG_CHECKING([for ML GMP native module gmp.cmxa])
+      if ( test ${mlgmp_dir} = +gmp && test -f ${ocamlopt_root}/gmp/gmp.cmxa ) \
+        || test -f ${mlgmp_dir}/gmp.cmxa;
+      then
+        AC_MSG_RESULT(yes)
+        ocamlopt_gmp="yes"
+      else
+        AC_MSG_RESULT(no)
+        ocamlopt_gmp="no"
+      fi
+    fi
+  fi
+fi
+AM_CONDITIONAL(HAVE_OCAMLC, test x$ocamlc_gmp = xyes)
+AM_CONDITIONAL(HAVE_OCAMLOPT, test x$ocamlopt_gmp = xyes)
+
+if test x${ocaml_interface_enabled} = xyes \
+&& (test x$ocamlc_gmp = xyes || test x$ocamlopt_gmp = xyes)
+then
+  build_ocaml_interface=yes
+fi
+AM_CONDITIONAL(BUILD_OCAML_INTERFACE, test x$build_ocaml_interface = xyes)
+
+# Checks for Ciao Prolog.
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_CIAO_PROLOG
+fi
+
+if test x${ciao_prolog_interface_enabled} = xyes \
+&& test x$have_ciao_prolog = xyes
+then
+  build_ciao_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_CIAO_PROLOG_INTERFACE,
+               test x$build_ciao_prolog_interface = xyes)
+
+# Checks for GNU Prolog.
+if test x${gnu_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_PROG(GNU_PROLOG, gprolog, gprolog)
+  if test x"$GNU_PROLOG" = xgprolog
+  then
+    AC_CHECK_HEADER(gprolog.h,
+                    [],
+                    GNU_PROLOG="")
+  fi
+fi
+
+if test x${gnu_prolog_interface_enabled} = xyes \
+&& test x$GNU_PROLOG = xgprolog
+then
+  build_gnu_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_GNU_PROLOG_INTERFACE,
+               test x$build_gnu_prolog_interface = xyes)
+
+# Checks for SICStus.
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_SICSTUS_PROLOG
+fi
+
+if test x${sicstus_prolog_interface_enabled} = xyes \
+&& test x$have_sicstus_prolog = xyes
+then
+  build_sicstus_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_SICSTUS_PROLOG_INTERFACE,
+               test x$build_sicstus_prolog_interface = xyes)
+
+# Checks for SWI-Prolog.
+if test x${swi_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_SWI_PROLOG
+fi
+
+# Under Cygwin, SWI-Prolog does not work with foreign code:
+# see http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007838.html
+if test x${swi_prolog_interface_enabled} = xyes \
+&& test x$have_swi_prolog = xyes \
+&& test x"${host_os}" != xcygwin
+then
+  build_swi_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_SWI_PROLOG_INTERFACE,
+               test x$build_swi_prolog_interface = xyes)
+
+# Checks for XSB.
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_XSB_PROLOG
+fi
+
+if test x${xsb_prolog_interface_enabled} = xyes \
+&& test x$have_xsb_prolog = xyes
+then
+  build_xsb_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_XSB_PROLOG_INTERFACE,
+               test x$build_xsb_prolog_interface = xyes)
+
+# Checks for YAP.
+if test x${yap_prolog_interface_enabled} = xyes
+then
+  AC_CHECK_YAP_PROLOG
+fi
+
+if test x${yap_prolog_interface_enabled} = xyes \
+&& test x$have_yap_prolog = xyes
+then
+  build_yap_prolog_interface=yes
+fi
+AM_CONDITIONAL(BUILD_YAP_PROLOG_INTERFACE,
+               test x$build_yap_prolog_interface = xyes)
+
+# Test if some Prolog interfaces have to be built.
+if test x$build_ciao_prolog_interface = xyes \
+|| test x$build_gnu_prolog_interface = xyes \
+|| test x$build_sicstus_prolog_interface = xyes \
+|| test x$build_swi_prolog_interface = xyes \
+|| test x$build_xsb_prolog_interface = xyes \
+|| test x$build_yap_prolog_interface = xyes
+then
+  build_some_prolog_interfaces=yes
+fi
+AM_CONDITIONAL(BUILD_SOME_PROLOG_INTERFACES,
+               test x$build_some_prolog_interfaces = xyes)
+
+if test x$build_c_interface = xyes \
+|| test x$build_java_interface = xyes \
+|| test x$build_ocaml_interface = xyes \
+|| test x$build_some_prolog_interfaces = xyes
+then
+  # Look for a recent enough version of GNU M4.
+  AC_PROG_GNU_M4
+fi
+
+# Define the list of instantiations that are enabled by default.
+# Different instantiations are separated by a '@' character.
+di="        Polyhedron @ Grid"
+di="${di} @ Rational_Box"
+di="${di} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+di="${di} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+di="${di} @ Constraints_Product<C_Polyhedron, Grid>"
+di="${di} @ Pointset_Powerset<C_Polyhedron>"
+di="${di} @ Pointset_Powerset<NNC_Polyhedron>"
+if test $ac_supported_double = 1
+then
+  di="${di} @ Double_Box @ BD_Shape<double> @ Octagonal_Shape<double>"
+fi
+default_instantiations="${di}"
+
+# Define the list of all instantiations.
+# Different instantiations are separated by a '@' character.
+ai="        Int8_Box @ Int16_Box @ Int32_Box @ Int64_Box"
+ai="${ai} @ Uint8_Box @ Uint16_Box @ Uint32_Box @ Uint64_Box"
+ai="${ai} @ Z_Box @ Rational_Box"
+ai="${ai} @ BD_Shape<int8_t> @ BD_Shape<int16_t>"
+ai="${ai} @ BD_Shape<int32_t> @ BD_Shape<int64_t>"
+ai="${ai} @ BD_Shape<mpz_class> @ BD_Shape<mpq_class>"
+ai="${ai} @ Octagonal_Shape<int8_t> @ Octagonal_Shape<int16_t>"
+ai="${ai} @ Octagonal_Shape<int32_t> @ Octagonal_Shape<int64_t>"
+ai="${ai} @ Octagonal_Shape<mpz_class> @ Octagonal_Shape<mpq_class>"
+ai="${ai} @ Polyhedron @ Grid"
+ai="${ai} @ Pointset_Powerset<Int8_Box> @ Pointset_Powerset<Int16_Box>"
+ai="${ai} @ Pointset_Powerset<Int32_Box> @ Pointset_Powerset<Int64_Box>"
+ai="${ai} @ Pointset_Powerset<Uint8_Box> @ Pointset_Powerset<Uint16_Box>"
+ai="${ai} @ Pointset_Powerset<Uint32_Box> @ Pointset_Powerset<Uint64_Box>"
+ai="${ai} @ Pointset_Powerset<Rational_Box> @ Pointset_Powerset<Z_Box>"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<BD_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int8_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int16_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int32_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<int64_t> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpq_class> >"
+ai="${ai} @ Pointset_Powerset<Octagonal_Shape<mpz_class> >"
+ai="${ai} @ Pointset_Powerset<C_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<NNC_Polyhedron>"
+ai="${ai} @ Pointset_Powerset<Grid>"
+ai="${ai} @ Constraints_Product<C_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<NNC_Polyhedron, Grid>"
+ai="${ai} @ Constraints_Product<Grid, C_Polyhedron>"
+ai="${ai} @ Constraints_Product<Grid, NNC_Polyhedron>"
+if test $ac_supported_float = 1
+then
+  ai="${ai} @ Float_Box @ BD_Shape<float>"
+  ai="${ai} @ Octagonal_Shape<float>"
+  ai="${ai} @ Pointset_Powerset<Float_Box>"
+  ai="${ai} @ Pointset_Powerset<BD_Shape<float> >"
+  ai="${ai} @ Pointset_Powerset<Octagonal_Shape<float> >"
+fi
+if test $ac_supported_double = 1
+then
+  ai="${ai} @ Double_Box @ BD_Shape<double>"
+  ai="${ai} @ Octagonal_Shape<double>"
+  ai="${ai} @ Pointset_Powerset<Double_Box>"
+  ai="${ai} @ Pointset_Powerset<BD_Shape<double> >"
+  ai="${ai} @ Pointset_Powerset<Octagonal_Shape<double> >"
+fi
+if test $ac_supported_long_double = 1
+then
+  ai="${ai} @ Long_Double_Box @ BD_Shape<long double>"
+  ai="${ai} @ Octagonal_Shape<long double>"
+  ai="${ai} @ Pointset_Powerset<Long_Double_Box>"
+  ai="${ai} @ Pointset_Powerset<BD_Shape<long double> >"
+  ai="${ai} @ Pointset_Powerset<Octagonal_Shape<long double> >"
+fi
+available_instantiations=${ai}
+
+enableval=not_specified
+AC_MSG_CHECKING([which instantiations are enabled])
+AC_ARG_ENABLE(instantiations,
+  AS_HELP_STRING([--enable-instantiations=INSTANTIATIONS],
+                 [enable instantiations for the non-C++ interfaces]))
+case x"${enableval}" in
+xyes | x)
+  ai_one_per_line=`echo "${available_instantiations}" | sed -e 's/ *@ */\n/g' -e 's/ *\([[A-Z]]\)/\1/g'`
+  AC_MSG_ERROR([
+--enable-instantiations needs at least one argument chosen among none,
+all, and an @-separated list of instantiation specifiers included
+in the following list:
+${ai_one_per_line}])
+  ;;
+xno | xnone)
+  enableval=
+  AC_MSG_RESULT(none)
+  ;;
+*)
+  if test x"${enableval}" = xnot_specified
+  then
+    enableval=${default_instantiations}
+  elif test x"${enableval}" = xall
+  then
+    enableval=${available_instantiations}
+  fi
+  # Avoid extra blanks.
+  required_instantiations=`echo "${enableval}" | sed -e 's/[[    ]][[    ]]*/ /g' -e 's/[[ ]]*\([[@<>,]]\)/\1/g' -e 's/\([[@<>,]]\)[[ ]]*/\1/g' -e 's/>>/> >/g' -e 's/^[[ ]]//g' -e 's/[[ ]]$//g'`
+  # Check the specified instantiations for validity.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS -I${srcdir} ${gmp_include_options}"
+  old_IFS="${IFS}"
+  IFS=@
+  set -- ${required_instantiations}
+  IFS="${old_IFS}"
+  for instantiation
+  do
+    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include "instchk.hh"
+
+using namespace Parma_Polyhedra_Library;
+
+bool valid = ${instantiation}::valid_instantiation();
+]])],
+      valid_instantiation=yes,
+      valid_instantiation=no)
+    if test x${valid_instantiation} != xyes
+    then
+      AC_MSG_ERROR([invalid instantiation ${instantiation}])
+    fi
+  done
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  required_instantiations_canonical_names=`echo "${required_instantiations}" | sed -e 's/> //g' -e 's/>//g' -e 's/[[< ,]]/_/g'`
+
+  required_instantiations_c_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_c_cxx_objects=`echo "${required_instantiations_c_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\)\.lo/ppl_c_\1.lo/g'`
+  required_instantiations_c_cxx_sources=`echo "${required_instantiations_c_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.lo/\1.cc/g'`
+  required_instantiations_c_cxx_headers=`echo "${required_instantiations_c_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+  required_instantiations_prolog_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_prolog_cxx_objects=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\)\.lo/ppl_prolog_\1.lo/g'`
+  required_instantiations_prolog_cxx_sources=`echo "${required_instantiations_prolog_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.lo/\1.cc/g'`
+  required_instantiations_prolog_cxx_headers=`echo "${required_instantiations_prolog_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+  required_instantiations_prolog_generated_test_sources=`echo "${required_instantiations_prolog_source_names}" | sed -e 's/@/.pl /g' -e 's/$/.pl/g' | sed -e 's/\([[^. ]]*\)\.pl/ppl_prolog_generated_test_\1.pl/g'`
+
+  required_instantiations_java_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/^Polyhedron/Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Polyhedron/@Polyhedron at C_Polyhedron@NNC_Polyhedron/g' -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' | sed -e 's/Pointset_Powerset_[[a-zA-Z0-9_]]*/&@&_Iterator/g'`
+  required_instantiations_java_sources=`echo "${required_instantiations_java_source_names}" | sed -e 's/@/.java /g' -e 's/$/.java/g'`
+  required_instantiations_java_classes=`echo "${required_instantiations_java_sources}" | sed -e 's/\.java/.class/g'`
+  required_instantiations_java_cxx_headers=`echo "${required_instantiations_java_sources}" | sed -e 's/\([[^. ]]*\)\.java/parma_polyhedra_library.\1/g'`
+  required_instantiations_java_cxx_headers_sources=`echo "${required_instantiations_java_sources}" | sed -e 's/\([[^. ]]*\)\.java/parma_polyhedra_library_\1.h/g'`
+  required_instantiations_java_cxx_objects=`echo "${required_instantiations_canonical_names}" | sed -e 's/@/.lo /g' -e 's/$/.lo/g' | sed -e 's/\([[^. ]]*\)\.lo/ppl_java_\1.lo/g'`
+  required_instantiations_java_cxx_sources=`echo "${required_instantiations_java_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.lo/\1.cc/g'`
+
+  required_instantiations_ocaml_source_names=`echo "${required_instantiations_canonical_names}" | sed -e 's/@Pointset_Powerset_Polyhedron/@Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g' -e 's/^Pointset_Powerset_Polyhedron/Pointset_Powerset_C_Polyhedron at Pointset_Powerset_NNC_Polyhedron/g'`
+  required_instantiations_ocaml_cxx_objects=`echo "${required_instantiations_ocaml_source_names}" | sed -e 's/@/.o /g' -e 's/$/.o/g' | sed -e 's/\([[^. ]]*\)\.o/ppl_ocaml_\1.o/g'`
+  required_instantiations_ocaml_cxx_sources=`echo "${required_instantiations_ocaml_cxx_objects}" | sed -e 's/\([[^. ]]*\)\.o/\1.cc/g'`
+  required_instantiations_ocaml_cxx_headers=`echo "${required_instantiations_ocaml_cxx_sources}" | sed -e 's/\.cc/.hh/g'`
+
+  AC_MSG_RESULT([${required_instantiations}])
+  ;;
+esac
+
+enableval=no
+AC_MSG_CHECKING([whether tests should be run under Valgrind])
+AC_ARG_ENABLE(valgrind-tests,
+  AS_HELP_STRING([--enable-valgrind-tests],
+                 [run library tests under Valgrind]))
+case "${enableval}" in
+yes)
+  AC_CHECK_PROG(VALGRIND, valgrind, valgrind)
+  if test x"$VALGRIND" = xvalgrind
+  then
+    AC_MSG_RESULT(yes)
+    enable_valgrind_tests=yes
+  else
+    AC_MSG_ERROR([bad value ${enableval} for --enable-valgrind-tests, cannot find Valgrind])
+  fi
+  ;;
+no)
+  AC_MSG_RESULT(no)
+  enable_valgrind_tests=no
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-valgrind-tests, needs yes or no])
+  ;;
+esac
+AM_CONDITIONAL(VALGRIND_TESTS_ENABLED, test x"$enable_valgrind_tests" = xyes)
+
+enableval=quick
+AC_MSG_CHECKING([whether `make check' does a thorough or quick check])
+AC_ARG_ENABLE(check,
+  AS_HELP_STRING([--enable-check=KIND],
+                 [select thorough or quick `make check']))
+case "${enableval}" in
+thorough)
+  AC_MSG_RESULT(thorough)
+  ;;
+quick)
+  AC_MSG_RESULT(quick)
+  ;;
+*)
+  AC_MSG_ERROR([bad value ${enableval} for --enable-check, needs thorough or quick])
+  ;;
+esac
+AM_CONDITIONAL(THOROUGH_MAKE_CHECK, test x"$enableval" = xthorough)
+
+# Libtool.
+LT_PREREQ([1.5.24])
+LT_INIT([dlopen,win32-dll])
+AM_CONDITIONAL(ENABLE_SHARED, test x"$enable_shared" = xyes)
+AM_CONDITIONAL(ENABLE_STATIC, test x"$enable_static" = xyes)
+
+# Checks for md5sum.
+AC_CHECK_PROG(MD5SUM, md5sum, md5sum)
+AM_CONDITIONAL(HAVE_MD5SUM, test x$MD5SUM = xmd5sum)
+if test x$MD5SUM = xmd5sum
+then
+  AC_TEXT_MD5SUM
+fi
+
+# Check for the GLPK library.
+AC_LANG_PUSH(C)
+AC_CHECK_HEADERS([glpk.h glpk/glpk.h], have_glpk=yes)
+AM_CONDITIONAL(HAVE_GLPK, test x$have_glpk = xyes)
+if test x$have_glpk = xyes
+then
+  ac_save_LIBS="$LIBS"
+  LIBS="$LIBS -lglpk"
+  AC_CHECK_DECL(lib_set_print_hook,
+                AC_DEFINE(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK,
+                          1,
+                          [Defined if GLPK provides lib_set_print_hook().]),
+                ,
+                [
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+                ])
+  AC_CHECK_FUNC(_glp_lib_print_hook,
+                AC_DEFINE(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK,
+                          1,
+                          [Defined if GLPK provides _glp_lib_print_hook().]))
+  AC_CHECK_DECL(glp_term_out,
+                AC_DEFINE(PPL_GLPK_HAS_GLP_TERM_OUT,
+                          1,
+                          [Defined if GLPK provides glp_term_out().]),
+                ,
+                [
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+                ])
+  AC_CHECK_DECL(glp_term_hook,
+                AC_DEFINE(PPL_GLPK_HAS_GLP_TERM_HOOK,
+                          1,
+                          [Defined if GLPK provides glp_term_hook().]),
+                ,
+                [
+#if defined(HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+                ])
+  LIBS="$ac_save_LIBS"
+fi
+AC_LANG_POP(C)
+
+# Checks for header declarations.
+AC_CHECK_DECLS([RLIMIT_DATA, RLIMIT_RSS, RLIMIT_VMEM, RLIMIT_AS],
+               ,
+               ,
+               [
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+               ])
+
+AC_CHECK_DECLS([getrusage, setrlimit],
+               ,
+               ,
+               [
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+])
+
+AC_CHECK_DECLS([setitimer], [], [], [[
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+]])
+
+AC_CHECK_DECLS([sigaction], , , [#include <csignal>])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_CHECK_TYPES([timeval])
+AC_CHECK_TYPES([siginfo_t], [], [], [[
+#include <signal.h>
+]])
+
+# Check whether we can limit memory in C and C++ using setrlimit().
+AC_CXX_SUPPORTS_LIMITING_MEMORY
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC or the Intel C/C++ compiler we want to compile
+# with lots of warnings enabled.
+if test x"$GCC" = xyes
+then
+  if test x"$ICC" = xyes
+  then
+    CFLAGS="$CFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+  else
+    CFLAGS="$CFLAGS -W -Wall"
+  fi
+fi
+if test x"$GXX" = xyes
+then
+  if test x"$ICPC" = xyes
+  then
+    CXXFLAGS="$CXXFLAGS -w2 -wd161,177,193,279,383,444,981,1098,1188,1418,1419,1572"
+  else
+    CXXFLAGS="$CXXFLAGS -W -Wall"
+  fi
+fi
+
+
+AC_SUBST(LIBEXT, [$libext])
+AC_SUBST(SHREXT, [$shrext_cmds])
+AC_SUBST(extra_includes)
+AC_SUBST(extra_libraries)
+AC_SUBST(debug_flag)
+AC_SUBST(coefficient_mnemonic)
+AC_SUBST(required_instantiations)
+AC_SUBST(required_instantiations_canonical_names)
+AC_SUBST(required_instantiations_c_cxx_headers)
+AC_SUBST(required_instantiations_c_cxx_sources)
+AC_SUBST(required_instantiations_c_cxx_objects)
+AC_SUBST(required_instantiations_prolog_cxx_headers)
+AC_SUBST(required_instantiations_prolog_cxx_sources)
+AC_SUBST(required_instantiations_prolog_cxx_objects)
+AC_SUBST(required_instantiations_prolog_generated_test_sources)
+AC_SUBST(required_instantiations_java_sources)
+AC_SUBST(required_instantiations_java_classes)
+AC_SUBST(required_instantiations_java_cxx_headers)
+# FIXME: rename headers_sources into sources.
+AC_SUBST(required_instantiations_java_cxx_headers_sources)
+AC_SUBST(required_instantiations_java_cxx_sources)
+AC_SUBST(required_instantiations_java_cxx_objects)
+AC_SUBST(required_instantiations_ocaml_cxx_headers)
+AC_SUBST(required_instantiations_ocaml_cxx_sources)
+AC_SUBST(required_instantiations_ocaml_cxx_objects)
+AC_SUBST(mlgmp_dir)
+
+AC_CONFIG_FILES(Makefile
+                ppl.lsm
+                src/Makefile
+                src/version.hh
+                src/ppl-config.cc
+                tests/Makefile
+                tests/BD_Shape/Makefile
+                tests/Box/Makefile
+                tests/Concrete_Expression/Makefile
+                tests/CO_Tree/Makefile
+                tests/Grid/Makefile
+                tests/MIP_Problem/Makefile
+                tests/Octagonal_Shape/Makefile
+                tests/Partially_Reduced_Product/Makefile
+                tests/PIP_Problem/Makefile
+                tests/Polyhedron/Makefile
+                tests/Powerset/Makefile
+                tests/Watchdog/Makefile
+                utils/Makefile
+                m4/Makefile
+                demos/Makefile
+                demos/ppl_lcdd/Makefile
+                demos/ppl_lcdd/examples/Makefile
+                demos/ppl_lpsol/Makefile
+                demos/ppl_lpsol/examples/Makefile
+                demos/ppl_pips/Makefile
+                demos/ppl_pips/examples/Makefile
+                doc/Makefile
+                doc/user.doxyconf-latex
+                doc/devref.doxyconf-latex
+                doc/user.doxyconf-html
+                doc/devref.doxyconf-html
+                doc/user-language-interface.doxyconf
+                doc/devref-language-interface.doxyconf
+                interfaces/Makefile
+                interfaces/C/Makefile
+                interfaces/C/ppl_c_version.h
+                interfaces/C/tests/Makefile
+                interfaces/Java/Makefile
+                interfaces/Java/jni/Makefile
+                interfaces/Java/tests/Makefile
+                interfaces/Java/parma_polyhedra_library/Makefile
+                interfaces/OCaml/Makefile
+                interfaces/OCaml/tests/Makefile
+                interfaces/Prolog/Makefile
+                interfaces/Prolog/Ciao/Makefile
+                interfaces/Prolog/GNU/Makefile
+                interfaces/Prolog/SICStus/Makefile
+                interfaces/Prolog/SWI/Makefile
+                interfaces/Prolog/XSB/Makefile
+                interfaces/Prolog/YAP/Makefile
+                interfaces/Prolog/tests/Makefile
+                )
+#               tests/Ask_Tell/Makefile
+AC_OUTPUT
+
+if test x"$gmp_supports_exceptions" = xno
+then
+  AC_MSG_WARN([CANNOT PROPAGATE EXCEPTIONS BACK FROM GMP:
+*** MEMORY EXHAUSTION MAY RESULT IN ABRUPT TERMINATION.
+*** This is OK, if you do not plan to use the bounded memory capabilities
+*** offered by the PPL.  Otherwise, if you are using GCC or the Intel C/C++
+*** compiler, please make sure you use a version of GMP compiled with the
+*** `-fexceptions' compiler option.
+*** To build such a version, you can configure GMP as follows:
+*** CPPFLAGS=-fexceptions ./configure --enable-cxx --prefix=/usr/local])
+fi
+
+if test x"$PERL" = xno
+then
+  AC_MSG_WARN([PERL UNAVAILABLE:
+***  CANNOT REBUILD SOME FILES IF SOURCES ARE CHANGED.
+*** Perl could not be found on your system.  This is OK, if you only plan
+*** to build the PPL without modifying the sources and without trying to
+*** build a distribution out of a CVS working copy.  If this is not the case,
+*** then you need to add Perl to your development environment:
+*** see http://www.perl.org/ for more information.])
+fi
+
+if test x"$coefficient_kind" = xnative
+then
+  AC_MSG_WARN([USING NATIVE INTEGERS IS EXTREMELY DANGEROUS:
+*** CONSIDER ANY RESULT YOU WILL GET FROM THE LIBRARY AS PSEUDO-RANDOM!!!
+*** You have requested to use a native integral type to represent
+*** coefficients.  This means that arithmetic overflows will be possible
+*** and will not be detected.  The consequence of that is that nothing
+*** can be said about the behavior of the library:  whatever the
+*** documentation says, it does not apply to the version of the library
+*** you are about to build.  Just one arithmetic overflow is enough
+*** to invalidate any possible significance of the results.
+*** Please, do not assume that your computation will not overflow because
+*** only small coefficients are involved.  Do not do it because
+*** (1) coefficients may grow very rapidly depending on the polyhedra
+***     computations being performed;
+*** (2) the library may do internal polyhedra computations that you
+***     cannot easily anticipate;
+*** (3) the library has never had, among its design goals, the one of
+***     trying to keep the coefficients small.
+***
+*** Please, consider using a _checked_ native integral type instead.])
+fi
diff --git a/demos/Makefile.am b/demos/Makefile.am
new file mode 100644
index 0000000..646b0dd
--- /dev/null
+++ b/demos/Makefile.am
@@ -0,0 +1,36 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if BUILD_PPL_LCDD
+PPL_LCDD_SUBDIR = ppl_lcdd
+endif BUILD_PPL_LCDD
+
+if BUILD_PPL_LPSOL
+PPL_LPSOL_SUBDIR = ppl_lpsol
+endif BUILD_PPL_LPSOL
+
+if BUILD_PPL_PIPS
+PPL_PIPS_SUBDIR = ppl_pips
+endif BUILD_PPL_PIPS
+
+SUBDIRS = $(PPL_LCDD_SUBDIR) $(PPL_LPSOL_SUBDIR) $(PPL_PIPS_SUBDIR)
diff --git a/demos/Makefile.in b/demos/Makefile.in
new file mode 100644
index 0000000..fa9d62a
--- /dev/null
+++ b/demos/Makefile.in
@@ -0,0 +1,728 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = ppl_lcdd ppl_lpsol ppl_pips
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at BUILD_PPL_LCDD_TRUE@PPL_LCDD_SUBDIR = ppl_lcdd
+ at BUILD_PPL_LPSOL_TRUE@PPL_LPSOL_SUBDIR = ppl_lpsol
+ at BUILD_PPL_PIPS_TRUE@PPL_PIPS_SUBDIR = ppl_pips
+SUBDIRS = $(PPL_LCDD_SUBDIR) $(PPL_LPSOL_SUBDIR) $(PPL_PIPS_SUBDIR)
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/Makefile.am b/demos/ppl_lcdd/Makefile.am
new file mode 100644
index 0000000..2d2c462
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.am
@@ -0,0 +1,135 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = examples
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_lcdd
+ppl_lcdd_SOURCES = ppl_lcdd.cc
+ppl_lcdd_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_lcdd.1
+
+polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLKA $(srcdir)/ppl_lcdd.cc
+
+polka_lcdd: polka_lcdd.o
+	$(CXXLINK) polka_lcdd.o \
+	    -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+
+polylib_lcdd.o:	$(srcdir)/ppl_lcdd.cc
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc
+
+polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a
+	$(CXXLINK) polylib_lcdd.o \
+	    -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+if HAVE_MD5SUM
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \
+ccc6.ext \
+ccp6.ext \
+cut32_16.ext \
+cyclic16-10.ext \
+reg600-5_m.ext \
+cyclic17_8.ine \
+in6.ine \
+in7.ine \
+kq20_11_m.ine \
+mit31-20.ine \
+sampleh8.ine \
+trunc10.ine
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES = \
+cp7.ext \
+cyclic25_13.ext \
+prodst62.ext \
+cp6.ine \
+mit.ine \
+mit288-281.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+check-local: ppl_lcdd$(EXEEXT)
+	echo $(TOUGH_EXAMPLES) >tough_examples
+	echo $(ECHO_N) "$(ECHO_C)" >obtained
+	export LC_ALL=C; \
+	for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+	do \
+	  file=`basename $$path`; \
+	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+	  echo ppl_lcdd$(EXEEXT) $$path; \
+	  ./ppl_lcdd$(EXEEXT) $$path | tr -d '\015' | $(TEXT_MD5SUM) \
+            >>obtained; \
+	done
+	diff obtained $(srcdir)/$(EXPECTED)
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained
+
+endif HAVE_MD5SUM
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/demos/ppl_lcdd/Makefile.in b/demos/ppl_lcdd/Makefile.in
new file mode 100644
index 0000000..f40e738
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.in
@@ -0,0 +1,1027 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_lcdd$(EXEEXT)
+subdir = demos/ppl_lcdd
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_lcdd_OBJECTS = ppl_lcdd.$(OBJEXT)
+ppl_lcdd_OBJECTS = $(am_ppl_lcdd_OBJECTS)
+ppl_lcdd_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+	$(top_builddir)/utils/libppl_utils.a
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(ppl_lcdd_SOURCES)
+DIST_SOURCES = $(ppl_lcdd_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = examples
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+ppl_lcdd_SOURCES = ppl_lcdd.cc
+ppl_lcdd_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_lcdd.1
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+ at HAVE_MD5SUM_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at ccc6.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at ccp6.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cut32_16.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cyclic16-10.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at reg600-5_m.ext \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at cyclic17_8.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at in6.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at in7.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at kq20_11_m.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at mit31-20.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at sampleh8.ine \
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at trunc10.ine
+
+ at ASSERTIONS_ENABLED_FALSE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES = \
+ at HAVE_MD5SUM_TRUE@cp7.ext \
+ at HAVE_MD5SUM_TRUE@cyclic25_13.ext \
+ at HAVE_MD5SUM_TRUE@prodst62.ext \
+ at HAVE_MD5SUM_TRUE@cp6.ine \
+ at HAVE_MD5SUM_TRUE@mit.ine \
+ at HAVE_MD5SUM_TRUE@mit288-281.ine \
+ at HAVE_MD5SUM_TRUE@mit41-16.ine \
+ at HAVE_MD5SUM_TRUE@mit708-9.ine \
+ at HAVE_MD5SUM_TRUE@mit71-61.ine \
+ at HAVE_MD5SUM_TRUE@mit90-86.ine \
+ at HAVE_MD5SUM_TRUE@$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+ at HAVE_MD5SUM_TRUE@MOSTLYCLEANFILES = \
+ at HAVE_MD5SUM_TRUE@tough_examples \
+ at HAVE_MD5SUM_TRUE@obtained
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+ppl_lcdd$(EXEEXT): $(ppl_lcdd_OBJECTS) $(ppl_lcdd_DEPENDENCIES) $(EXTRA_ppl_lcdd_DEPENDENCIES) 
+	@rm -f ppl_lcdd$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ppl_lcdd_OBJECTS) $(ppl_lcdd_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lcdd.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+ at HAVE_MD5SUM_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am check-local clean clean-binPROGRAMS clean-generic \
+	clean-libtool cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-man1 install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+
+polka_lcdd.o: $(srcdir)/ppl_lcdd.cc $(top_builddir)/utils/libppl_utils.a
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLKA $(srcdir)/ppl_lcdd.cc
+
+polka_lcdd: polka_lcdd.o
+	$(CXXLINK) polka_lcdd.o \
+	    -lpolkag -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+polylib_lcdd.o:	$(srcdir)/ppl_lcdd.cc
+	$(CXXCOMPILE) -c -o $@ -DUSE_POLYLIB $(srcdir)/ppl_lcdd.cc
+
+polylib_lcdd: polylib_lcdd.o $(top_builddir)/utils/libppl_utils.a
+	$(CXXLINK) polylib_lcdd.o \
+	    -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+ at HAVE_MD5SUM_TRUE@check-local: ppl_lcdd$(EXEEXT)
+ at HAVE_MD5SUM_TRUE@	echo $(TOUGH_EXAMPLES) >tough_examples
+ at HAVE_MD5SUM_TRUE@	echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at HAVE_MD5SUM_TRUE@	export LC_ALL=C; \
+ at HAVE_MD5SUM_TRUE@	for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+ at HAVE_MD5SUM_TRUE@	do \
+ at HAVE_MD5SUM_TRUE@	  file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@	  echo ppl_lcdd$(EXEEXT) $$path; \
+ at HAVE_MD5SUM_TRUE@	  ./ppl_lcdd$(EXEEXT) $$path | tr -d '\015' | $(TEXT_MD5SUM) \
+ at HAVE_MD5SUM_TRUE@            >>obtained; \
+ at HAVE_MD5SUM_TRUE@	done
+ at HAVE_MD5SUM_TRUE@	diff obtained $(srcdir)/$(EXPECTED)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/examples/1d.ine b/demos/ppl_lcdd/examples/1d.ine
new file mode 100644
index 0000000..e07de85
--- /dev/null
+++ b/demos/ppl_lcdd/examples/1d.ine
@@ -0,0 +1,5 @@
+H-representation
+begin
+1 2 rational
+-1 1
+end
diff --git a/demos/ppl_lcdd/examples/1da.ine b/demos/ppl_lcdd/examples/1da.ine
new file mode 100644
index 0000000..b0c0534
--- /dev/null
+++ b/demos/ppl_lcdd/examples/1da.ine
@@ -0,0 +1,6 @@
+H-representation
+begin
+2 2 rational
+-1 1
+0 1
+end
diff --git a/demos/ppl_lcdd/examples/Makefile.am b/demos/ppl_lcdd/examples/Makefile.am
new file mode 100644
index 0000000..8a516bf
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.am
@@ -0,0 +1,136 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+EXT_FILES = \
+ccc4.ext \
+ccc5.ext \
+ccc6.ext \
+ccp4.ext \
+ccp5.ext \
+ccp6.ext \
+cp4.ext \
+cp5.ext \
+cp6.ext \
+cp7.ext \
+cube.ext \
+cut16_11.ext \
+cut32_16.ext \
+cyclic10-4.ext \
+cyclic12-6.ext \
+cyclic14-8.ext \
+cyclic16-10.ext \
+cyclic25_13.ext \
+dcube10.ext \
+dcube12.ext \
+dcube3.ext \
+dcube6.ext \
+dcube8.ext \
+irbox20-4.ext \
+irbox200-4.ext \
+mp5.ext \
+prodst62.ext \
+redcheck.ext \
+reg24-5.ext \
+reg600-5_m.ext \
+samplev1.ext \
+samplev2.ext \
+samplev3.ext \
+tsp5.ext
+
+INE_FILES = \
+1d.ine \
+1da.ine \
+allzero.ine \
+cp4.ine \
+cp5.ine \
+cp6.ine \
+cross10.ine \
+cross12.ine \
+cross4.ine \
+cross6.ine \
+cross8.ine \
+cube.ine \
+cube10.ine \
+cube12.ine \
+cube3.ine \
+cube6.ine \
+cube8.ine \
+cubetop.ine \
+cubocta.ine \
+cyc.ine \
+cyclic17_8.ine \
+diamond.ine \
+dodeca_m.ine \
+ex1.ine \
+grcubocta.ine \
+hexocta.ine \
+icododeca_m.ine \
+in0.ine \
+in1.ine \
+in2.ine \
+in3.ine \
+in4.ine \
+in5.ine \
+in6.ine \
+in7.ine \
+infeas.ine \
+integralpoints.ine \
+kkd18_4.ine \
+kkd27_5.ine \
+kkd38_6.ine \
+kq20_11_m.ine \
+metric40_11.ine \
+metric80_16.ine \
+mit.ine \
+mit288-281.ine \
+mit31-20.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+mp5.ine \
+mp5a.ine \
+mp6.ine \
+nonfull.ine \
+origin.ine \
+project1_m.ine \
+project1res.ine \
+project2_m.ine \
+project2res.ine \
+rcubocta.ine \
+reg24-5.ine \
+rhomtria_m.ine \
+sample.ine \
+sampleh1.ine \
+sampleh2.ine \
+sampleh3.ine \
+sampleh4.ine \
+sampleh5.ine \
+sampleh6.ine \
+sampleh7.ine \
+sampleh8.ine \
+trunc10.ine \
+trunc7.ine \
+tsp5.ine
+
+dist_noinst_DATA = $(EXT_FILES) $(INE_FILES)
diff --git a/demos/ppl_lcdd/examples/Makefile.in b/demos/ppl_lcdd/examples/Makefile.in
new file mode 100644
index 0000000..30b5f1d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.in
@@ -0,0 +1,659 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_lcdd/examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_noinst_DATA) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(dist_noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+EXT_FILES = \
+ccc4.ext \
+ccc5.ext \
+ccc6.ext \
+ccp4.ext \
+ccp5.ext \
+ccp6.ext \
+cp4.ext \
+cp5.ext \
+cp6.ext \
+cp7.ext \
+cube.ext \
+cut16_11.ext \
+cut32_16.ext \
+cyclic10-4.ext \
+cyclic12-6.ext \
+cyclic14-8.ext \
+cyclic16-10.ext \
+cyclic25_13.ext \
+dcube10.ext \
+dcube12.ext \
+dcube3.ext \
+dcube6.ext \
+dcube8.ext \
+irbox20-4.ext \
+irbox200-4.ext \
+mp5.ext \
+prodst62.ext \
+redcheck.ext \
+reg24-5.ext \
+reg600-5_m.ext \
+samplev1.ext \
+samplev2.ext \
+samplev3.ext \
+tsp5.ext
+
+INE_FILES = \
+1d.ine \
+1da.ine \
+allzero.ine \
+cp4.ine \
+cp5.ine \
+cp6.ine \
+cross10.ine \
+cross12.ine \
+cross4.ine \
+cross6.ine \
+cross8.ine \
+cube.ine \
+cube10.ine \
+cube12.ine \
+cube3.ine \
+cube6.ine \
+cube8.ine \
+cubetop.ine \
+cubocta.ine \
+cyc.ine \
+cyclic17_8.ine \
+diamond.ine \
+dodeca_m.ine \
+ex1.ine \
+grcubocta.ine \
+hexocta.ine \
+icododeca_m.ine \
+in0.ine \
+in1.ine \
+in2.ine \
+in3.ine \
+in4.ine \
+in5.ine \
+in6.ine \
+in7.ine \
+infeas.ine \
+integralpoints.ine \
+kkd18_4.ine \
+kkd27_5.ine \
+kkd38_6.ine \
+kq20_11_m.ine \
+metric40_11.ine \
+metric80_16.ine \
+mit.ine \
+mit288-281.ine \
+mit31-20.ine \
+mit41-16.ine \
+mit708-9.ine \
+mit71-61.ine \
+mit90-86.ine \
+mp5.ine \
+mp5a.ine \
+mp6.ine \
+nonfull.ine \
+origin.ine \
+project1_m.ine \
+project1res.ine \
+project2_m.ine \
+project2res.ine \
+rcubocta.ine \
+reg24-5.ine \
+rhomtria_m.ine \
+sample.ine \
+sampleh1.ine \
+sampleh2.ine \
+sampleh3.ine \
+sampleh4.ine \
+sampleh5.ine \
+sampleh6.ine \
+sampleh7.ine \
+sampleh8.ine \
+trunc10.ine \
+trunc7.ine \
+tsp5.ine
+
+dist_noinst_DATA = $(EXT_FILES) $(INE_FILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lcdd/examples/README b/demos/ppl_lcdd/examples/README
new file mode 100644
index 0000000..c1c4b14
--- /dev/null
+++ b/demos/ppl_lcdd/examples/README
@@ -0,0 +1,13 @@
+Most of the examples in this directory have been taken (sometimes with
+changes) from cddlib version 0.93c [1] and lrslib version 4.2 [2].
+The changes consisted in the removal of commands that are not
+implemented in `ppl_lcdd', the revision of some comments and, for some
+examples, in the conversion of floating point coefficients to integer
+or rational numbers.  In this last case, the name of the example has
+been changed from, e.g., `file.ine' to `file_m.ine'.
+
+
+--------
+
+[1] http://www.cs.mcgill.ca/~fukuda/soft/cdd_home/cdd.html
+[2] http://cgm.cs.mcgill.ca/~avis/C/lrs.html
diff --git a/demos/ppl_lcdd/examples/allzero.ine b/demos/ppl_lcdd/examples/allzero.ine
new file mode 100644
index 0000000..9c9c353
--- /dev/null
+++ b/demos/ppl_lcdd/examples/allzero.ine
@@ -0,0 +1,11 @@
+H-representation
+begin
+    6   4    integer
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+end
+
diff --git a/demos/ppl_lcdd/examples/ccc4.ext b/demos/ppl_lcdd/examples/ccc4.ext
new file mode 100644
index 0000000..8f98f5f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc4.ext
@@ -0,0 +1,14 @@
+* Complete cut cone on 4 vertices
+* The number of facets is 12.
+V-representation
+begin
+    7    7    integer
+ 0  1  1  1  0  0  0
+ 0  0  1  1  1  1  0
+ 0  1  0  1  1  0  1
+ 0  1  1  0  0  1  1
+ 0  0  0  1  0  1  1
+ 0  0  1  0  1  0  1
+ 0  1  0  0  1  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/ccc5.ext b/demos/ppl_lcdd/examples/ccc5.ext
new file mode 100644
index 0000000..007cad2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc5.ext
@@ -0,0 +1,21 @@
+* Complete cut cone on 5 vertices
+* The number of facets is 40.
+V-representation
+begin
+  15  11  integer
+0 1 1 1 1 0 0 0 0 0 0
+0 0 1 1 1 1 1 1 0 0 0
+0 1 0 1 1 1 0 0 1 1 0
+0 1 1 0 1 0 1 0 1 0 1
+0 1 1 1 0 0 0 1 0 1 1
+0 0 0 1 1 0 1 1 1 1 0
+0 0 1 0 1 1 0 1 1 0 1
+0 0 1 1 0 1 1 0 0 1 1
+0 1 0 0 1 1 1 0 0 1 1
+0 1 0 1 0 1 0 1 1 0 1
+0 1 1 0 0 0 1 1 1 1 0
+0 0 0 0 1 0 0 1 0 1 1
+0 0 0 1 0 0 1 0 1 0 1
+0 0 1 0 0 1 0 0 1 1 0
+0 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccc6.ext b/demos/ppl_lcdd/examples/ccc6.ext
new file mode 100644
index 0000000..08f4879
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccc6.ext
@@ -0,0 +1,37 @@
+* Complete cut cone on 6 vertices
+* The number of facets is 210.
+V-representation
+begin
+  31  16   integer
+0   1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+0   0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+0   1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+0   1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+0   1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+0   1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+0   0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+0   0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+0   0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+0   0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+0   1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+0   1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+0   1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+0   1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+0   1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+0   1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+0   0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+0   0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+0   0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+0   0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+0   0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+0   0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+0   1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+0   1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+0   1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+0   1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+0   0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+0   0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+0   0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+0   0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+0   1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp4.ext b/demos/ppl_lcdd/examples/ccp4.ext
new file mode 100644
index 0000000..0c3e44c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp4.ext
@@ -0,0 +1,14 @@
+* Input file for computing the facets of the complete cut polytope on 4 vertices
+* The number of facets is 16.
+V-representation
+begin
+    8    7    integer
+ 1  0  0  0  0  0  0
+ 1  1  1  1  0  0  0
+ 1  0  1  1  1  1  0
+ 1  1  0  1  1  0  1
+ 1  1  1  0  0  1  1
+ 1  0  0  1  0  1  1
+ 1  0  1  0  1  0  1
+ 1  1  0  0  1  1  0
+end
diff --git a/demos/ppl_lcdd/examples/ccp5.ext b/demos/ppl_lcdd/examples/ccp5.ext
new file mode 100644
index 0000000..bd56d93
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp5.ext
@@ -0,0 +1,22 @@
+* Input file for computing the facets of the complete cut polytope on 5 vertices
+* The number of facets is 56.
+V-representation
+begin
+  16  11  integer
+1 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 0 0 0 0 0 0
+1 0 1 1 1 1 1 1 0 0 0
+1 1 0 1 1 1 0 0 1 1 0
+1 1 1 0 1 0 1 0 1 0 1
+1 1 1 1 0 0 0 1 0 1 1
+1 0 0 1 1 0 1 1 1 1 0
+1 0 1 0 1 1 0 1 1 0 1
+1 0 1 1 0 1 1 0 0 1 1
+1 1 0 0 1 1 1 0 0 1 1
+1 1 0 1 0 1 0 1 1 0 1
+1 1 1 0 0 0 1 1 1 1 0
+1 0 0 0 1 0 0 1 0 1 1
+1 0 0 1 0 0 1 0 1 0 1
+1 0 1 0 0 1 0 0 1 1 0
+1 1 0 0 0 1 1 1 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/ccp6.ext b/demos/ppl_lcdd/examples/ccp6.ext
new file mode 100644
index 0000000..def0444
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ccp6.ext
@@ -0,0 +1,38 @@
+* Input file for computing the facets of the complete cut polytope on 6 vertices
+* The number of facets is 368.
+V-representation
+begin
+  32  16   integer
+1   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1   1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1   0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1   1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1   1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1   1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1   1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1   0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1   0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1   0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1   0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1   1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1   1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1   1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1   1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1   1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1   1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1   0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1   0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1   0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1   0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1   0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1   0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1   1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1   1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1   1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1   1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1   0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1   0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1   0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1   0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1   1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cp4.ext b/demos/ppl_lcdd/examples/cp4.ext
new file mode 100644
index 0000000..2de9fb7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp4.ext
@@ -0,0 +1,12 @@
+V-representation
+begin
+8 7 integer
+1 0 0 0 0 0 0
+1 0 1 1 1 1 0
+1 0 0 1 0 1 1
+1 1 0 0 1 1 0
+1 1 1 1 0 0 0
+1 0 1 0 1 0 1
+1 1 1 0 0 1 1
+1 1 0 1 1 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cp4.ine b/demos/ppl_lcdd/examples/cp4.ine
new file mode 100644
index 0000000..0a2ec5e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp4.ine
@@ -0,0 +1,20 @@
+H-representation
+begin
+16 7 rational
+ 2  0 -1 -1  0  0 -1
+ 2 -1 -1  0 -1  0  0
+ 2  0  0  0 -1 -1 -1
+ 2 -1  0 -1  0 -1  0
+ 0  0  0  0  1  1 -1
+ 0 -1  0  1  0  1  0
+ 0  0  1  1  0  0 -1
+ 0 -1  1  0  1  0  0
+ 0  1  0 -1  0  1  0
+ 0  0  0  0 -1  1  1
+ 0  1  1  0 -1  0  0
+ 0  0  1 -1  0  0  1
+ 0  1 -1  0  1  0  0
+ 0  0 -1  1  0  0  1
+ 0  1  0  1  0 -1  0
+ 0  0  0  0  1 -1  1
+end
diff --git a/demos/ppl_lcdd/examples/cp5.ext b/demos/ppl_lcdd/examples/cp5.ext
new file mode 100644
index 0000000..3aa967a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp5.ext
@@ -0,0 +1,21 @@
+* 5 point cut polytope
+V-representation
+begin
+  16  11  integer
+1   0  0  0  0  0  0  0  0  0  0
+1   1  1  1  1  0  0  0  0  0  0
+1   0  1  1  1  1  1  1  0  0  0
+1   1  0  1  1  1  0  0  1  1  0
+1   1  1  0  1  0  1  0  1  0  1
+1   1  1  1  0  0  0  1  0  1  1
+1   0  0  1  1  0  1  1  1  1  0
+1   0  1  0  1  1  0  1  1  0  1
+1   0  1  1  0  1  1  0  0  1  1
+1   1  0  0  1  1  1  0  0  1  1
+1   1  0  1  0  1  0  1  1  0  1
+1   1  1  0  0  0  1  1  1  1  0
+1   0  0  0  1  0  0  1  0  1  1
+1   0  0  1  0  0  1  0  1  0  1
+1   0  1  0  0  1  0  0  1  1  0
+1   1  0  0  0  1  1  1  0  0  0
+end
diff --git a/demos/ppl_lcdd/examples/cp5.ine b/demos/ppl_lcdd/examples/cp5.ine
new file mode 100644
index 0000000..8b21e42
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp5.ine
@@ -0,0 +1,61 @@
+* 6 point cut polytope
+H-representation
+begin
+56 11 rational
+ 2  0  0  0  0  0  0  0 -1 -1 -1
+ 2  0  0  0  0  0 -1 -1  0  0 -1
+ 2  0  0  0  0 -1  0 -1  0 -1  0
+ 0  1  0  0  1  0  0 -1  0  0  0
+ 0  0  1  0  1  0  0  0  0 -1  0
+ 0  0  0  1  1  0  0  0  0  0 -1
+ 2  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 0  0  1  1  0  0  0  0 -1  0  0
+ 0 -1  1  0  0  1  0  0  0  0  0
+ 0 -1  1  1  1  1  1  1 -1 -1 -1
+ 0  0  0  0  0  1  1  0 -1  0  0
+ 0  0  0  0  0  1  0 -1  0  1  0
+ 0  0  1  0 -1  0  0  0  0  1  0
+ 2 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 2 -1  0  0 -1  0  0 -1  0  0  0
+ 0 -1  0  1  0  0  1  0  0  0  0
+ 0  0  0  0  0  0  1 -1  0  0  1
+ 0 -1  1  1 -1  1  1 -1 -1  1  1
+ 0  0  0  1 -1  0  0  0  0  0  1
+ 2 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 0  1  0  1  0  0 -1  0  0  0  0
+ 0  0  0  0  0  1  0  1  0 -1  0
+ 0  0  0  0  0  1 -1  0  1  0  0
+ 0  1 -1  0  0  1  0  0  0  0  0
+ 0  1 -1  1  1  1 -1 -1  1  1 -1
+ 0  1  0  0 -1  0  0  1  0  0  0
+ 0  1  1  1 -1 -1 -1  1 -1  1  1
+ 2  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 2  0 -1  0 -1  0  0  0  0 -1  0
+ 0  0 -1  1  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  0  0  1 -1  1
+ 0  1 -1  1 -1  1 -1  1  1 -1  1
+ 0  1  1  0  0 -1  0  0  0  0  0
+ 0  0  0  0  0  0  1  1  0  0 -1
+ 0  0  0  0  0 -1  1  0  1  0  0
+ 0  1  0 -1  0  0  1  0  0  0  0
+ 0  1  1 -1  1 -1  1 -1  1 -1  1
+ 2  0  0 -1 -1  0  0  0  0  0 -1
+ 0  0  1 -1  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  0  0  1  1 -1
+ 0  1  1 -1 -1 -1  1  1  1  1 -1
+ 2  0  0  0  0 -1 -1  0 -1  0  0
+ 2 -1  0 -1  0  0 -1  0  0  0  0
+ 0 -1  0  0  1  0  0  1  0  0  0
+ 0  0  0 -1  1  0  0  0  0  0  1
+ 2 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 0  0  0  0  0  0 -1  1  0  0  1
+ 0 -1  1 -1  1  1 -1  1  1 -1  1
+ 2  0 -1 -1  0  0  0  0 -1  0  0
+ 0  0 -1  0  1  0  0  0  0  1  0
+ 0  0  0  0  0  0  0  0 -1  1  1
+ 0  1 -1 -1  1  1  1 -1 -1  1  1
+ 0  0  0  0  0 -1  0  1  0  1  0
+ 0 -1 -1  1  1 -1  1  1  1  1 -1
+ 2 -1 -1  0  0 -1  0  0  0  0  0
+ 6 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cp6.ext b/demos/ppl_lcdd/examples/cp6.ext
new file mode 100644
index 0000000..81b136e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp6.ext
@@ -0,0 +1,37 @@
+* 6 point cut cone
+V-representation
+begin
+  32  16   integer
+1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
+1  1  1  1  1  1  0  0  0  0  0  0  0  0  0  0
+1  0  1  1  1  1  1  1  1  1  0  0  0  0  0  0
+1  1  0  1  1  1  1  0  0  0  1  1  1  0  0  0
+1  1  1  0  1  1  0  1  0  0  1  0  0  1  1  0
+1  1  1  1  0  1  0  0  1  0  0  1  0  1  0  1
+1  1  1  1  1  0  0  0  0  1  0  0  1  0  1  1
+1  0  0  1  1  1  0  1  1  1  1  1  1  0  0  0
+1  0  1  0  1  1  1  0  1  1  1  0  0  1  1  0
+1  0  1  1  0  1  1  1  0  1  0  1  0  1  0  1
+1  0  1  1  1  0  1  1  1  0  0  0  1  0  1  1
+1  1  0  0  1  1  1  1  0  0  0  1  1  1  1  0
+1  1  0  1  0  1  1  0  1  0  1  0  1  1  0  1
+1  1  0  1  1  0  1  0  0  1  1  1  0  0  1  1
+1  1  1  0  0  1  0  1  1  0  1  1  0  0  1  1
+1  1  1  0  1  0  0  1  0  1  1  0  1  1  0  1
+1  1  1  1  0  0  0  0  1  1  0  1  1  1  1  0
+1  0  0  0  1  1  0  0  1  1  0  1  1  1  1  0
+1  0  0  1  0  1  0  1  0  1  1  0  1  1  0  1
+1  0  0  1  1  0  0  1  1  0  1  1  0  0  1  1
+1  0  1  0  0  1  1  0  0  1  1  1  0  0  1  1
+1  0  1  0  1  0  1  0  1  0  1  0  1  1  0  1
+1  0  1  1  0  0  1  1  0  0  0  1  1  1  1  0
+1  1  0  0  0  1  1  1  1  0  0  0  1  0  1  1
+1  1  0  0  1  0  1  1  0  1  0  1  0  1  0  1
+1  1  0  1  0  0  1  0  1  1  1  0  0  1  1  0
+1  1  1  0  0  0  0  1  1  1  1  1  1  0  0  0
+1  0  0  0  0  1  0  0  0  1  0  0  1  0  1  1
+1  0  0  0  1  0  0  0  1  0  0  1  0  1  0  1
+1  0  0  1  0  0  0  1  0  0  1  0  0  1  1  0
+1  0  1  0  0  0  1  0  0  0  1  1  1  0  0  0
+1  1  0  0  0  0  1  1  1  1  0  0  0  0  0  0
+end
diff --git a/demos/ppl_lcdd/examples/cp6.ine b/demos/ppl_lcdd/examples/cp6.ine
new file mode 100644
index 0000000..a26068e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp6.ine
@@ -0,0 +1,373 @@
+* 6 point cut polytope
+H-representation
+begin
+368 16 integer
+ 2  0  1  1  1  1  0  0  0  0 -1 -1 -1 -1 -1 -1
+ 2  1  0  1  1  1  0 -1 -1 -1  0  0  0 -1 -1 -1
+ 2  1  1  0  1  1 -1  0 -1 -1  0 -1 -1  0  0 -1
+ 0  1  0  0  1  0  0  0 -1  0  0  0  0  0  0  0
+ 0  1  0  0  0  1  0  0  0 -1  0  0  0  0  0  0
+ 0  0  1  0  1  0  0  0  0  0  0 -1  0  0  0  0
+ 0  0  1  0  0  1  0  0  0  0  0  0 -1  0  0  0
+ 0  0  0  1  1  0  0  0  0  0  0  0  0 -1  0  0
+ 0  0  0  1  0  1  0  0  0  0  0  0  0  0 -1  0
+ 0  0  0  0  1  1  0  0  0  0  0  0  0  0  0 -1
+ 2  2  2  2  2  2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 0  0  1  1  0  0  0  0  0  0 -1  0  0  0  0  0
+ 0 -1  1  0  0  0  1  0  0  0  0  0  0  0  0  0
+ 0 -2  2  2  2  2  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 0 -2  1  1  1  1  2  2  2  2 -1 -1 -1 -1 -1 -1
+ 0  1 -1  2 -1 -1  1 -2  1  1  2 -1 -1  2  2 -1
+ 0  1 -1 -1  2 -1  1  1 -2  1 -1  2 -1  2 -1  2
+ 2 -2  1  1 -1 -1  2  2 -2 -2 -1  1  1  1  1 -1
+ 0 -1  2  1 -1 -1  2  1 -1 -1 -2  2  2  1  1 -1
+ 2 -2  1 -1 -1  1  2 -2 -2  2  1  1 -1 -1  1  1
+ 0 -1  2 -1 -1  1  2 -1 -1  1  2  2 -2 -1  1  1
+ 2 -1  2  1  1  1  2  1  1  1 -2 -2 -2 -1 -1 -1
+ 2 -2  1 -1  1 -1  2 -2  2 -2  1 -1  1  1 -1  1
+ 0 -1  2 -1  1 -1  2 -1  1 -1  2 -2  2  1 -1  1
+ 0  1 -1 -1 -1  2  1  1  1 -2 -1 -1  2 -1  2  2
+ 0  0  0  0  0  0  1  0  0 -1  0  0  1  0  0  0
+ 0 -1  1  1  1  0  1  1  1  0 -1 -1  0 -1  0  0
+ 2  1 -2 -1 -1  1  2  1  1 -1 -2 -2  2 -1  1  1
+ 0  2 -1 -1 -1  1  2  2  2 -2 -1 -1  1 -1  1  1
+ 0  0  1  1  1 -1  0  0  0  0 -1 -1  1 -1  1  1
+ 0 -1  2  1  1 -1  2  1  1 -1 -2 -2  2 -1  1  1
+ 0  0  0  0  0  0  1  1  1 -1 -1 -1  1 -1  1  1
+ 0  1  2 -1 -1 -1 -2  1  1  1  2  2  2 -1 -1 -1
+ 2 -2  2 -2  2 -2  1 -1  1 -1  1 -1  1  1 -1  1
+ 2 -1  1 -1  1 -2  1 -1  1 -2  1 -1  2  1 -2  2
+ 0  0  1  0  0 -1  0  0  0  0  0  0  1  0  0  0
+ 2 -1  2 -1 -1 -1  2 -1 -1 -1  2  2  2 -1 -1 -1
+ 6 -1  1 -1 -1 -2  1 -1 -1 -2  1  1  2 -1 -2 -2
+ 2  0  1 -1 -1 -1  0  0  0  0  1  1  1 -1 -1 -1
+ 2 -1  1 -1  0 -1  1 -1  0 -1  1  0  1  0 -1  0
+ 2 -1  1  0 -1 -1  1  0 -1 -1  0  1  1  0  0 -1
+ 2  0  0  0  0  0  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 2  1 -1  1  1  2  1 -1 -1 -2  1  1  2 -1 -2 -2
+ 0 -2  1  1  1 -1  2  2  2 -2 -1 -1  1 -1  1  1
+ 0 -1  1  0  1 -1  1  0  1 -1  0 -1  1  0  0  1
+ 0 -1  1  1  0 -1  1  1  0 -1 -1  0  1  0  1  0
+ 2 -1  0  0  0 -1  0  0  0 -1  0  0  0  0  0  0
+ 0 -1  0  1  1 -1  0  1  1 -1  0  0  0 -1  1  1
+ 0 -2  2  2  2 -2  1  1  1 -1 -1 -1  1 -1  1  1
+ 2 -2 -2  2  2 -2 -1  1  1 -1  1  1 -1 -1  1  1
+ 2 -1 -1  1  1 -2 -1  1  1 -2  1  1 -2 -1  2  2
+ 12 -1 -1 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -2
+ 0  0  0  0  0  0  1  0 -1  0  0  1  0  0  0  0
+ 0 -1  1  1  0  1  1  1  0  1 -1  0 -1  0 -1  0
+ 2  1 -2 -1  1 -1  2  1 -1  1 -2  2 -2  1 -1  1
+ 0  2 -1 -1  1 -1  2  2 -2  2 -1  1 -1  1 -1  1
+ 0  0  1  1 -1  1  0  0  0  0 -1  1 -1  1 -1  1
+ 0 -1  2  1 -1  1  2  1 -1  1 -2  2 -2  1 -1  1
+ 0  0  0  0  0  0  1  1 -1  1 -1  1 -1  1 -1  1
+ 0  0  0  0  0  0  1  1  0  0 -1  0  0  0  0  0
+ 0  1 -1  0  1  1  1  0 -1 -1  0  1  1  0  0 -1
+ 2  1 -1 -2  1 -1  1  2 -1  1 -2  1 -1  2 -2  1
+ 2 -2 -1  1 -1  1 -2  2 -2  2  1 -1  1  1 -1  1
+ 0 -1 -1  2 -1  1 -1  2 -1  1  2 -1  1  2 -2  1
+ 2 -1  1  2  1  1  1  2  1  1 -2 -1 -1 -2 -2 -1
+ 2  1 -1  1  2  1  1 -1 -2 -1  1  2  1 -2 -1 -2
+ 0  0  0  0  0  0  0  0  0  0 -1  1  0  1  0  0
+ 0  1 -1 -1  1  0  1  1 -1  0 -1  1  0  1  0  0
+ 0  0  0  0  0  0  0  1 -1  0  0  0  0  1  0  0
+ 0  1  0 -1  1  1  0  1 -1 -1  0  0  0  1  1 -1
+ 0  2 -1 -1  1  1  2  2 -2 -2 -1  1  1  1  1 -1
+ 2  1  1 -1  2  1 -1  1 -2 -1  1 -2 -1  2  1 -2
+ 0  1 -1 -1  2  1  1  1 -2 -1 -1  2  1  2  1 -2
+ 0 -1  1  2 -1 -1  1  2 -1 -1 -2  1  1  2  2 -1
+ 0 -1  1  1 -1  0  1  1 -1  0 -1  1  0  1  0  0
+ 0 -1  1  2 -1  1  1  2 -1  1 -2  1 -1  2 -2  1
+ 0  0  0  0  0  0  1  1 -1 -1 -1  1  1  1  1 -1
+ 2 -2 -1  1  1 -1 -2  2  2 -2  1  1 -1 -1  1  1
+ 0 -1 -1  2  1 -1 -1  2  1 -1  2  1 -1 -2  2  1
+ 0  0  1  0 -1  0  0  0  0  0  0  1  0  0  0  0
+ 0  0  0  0  0  0  0  0  0  0  0  1  1  0  0 -1
+ 0 -2  1  1 -1  1  2  2 -2  2 -1  1 -1  1 -1  1
+ 0 -1  1  0 -1  1  1  0 -1  1  0  1 -1  0  0  1
+ 0  0  0  0  0  0  0  0  0  0 -1  0  1  0  1  0
+ 0  1 -2 -1  1  1  2  1 -1 -1 -2  2  2  1  1 -1
+ 0  1 -1 -1  0  1  1  1  0 -1 -1  0  1  0  1  0
+ 2 -2  2 -2 -2  2  1 -1 -1  1  1  1 -1 -1  1  1
+ 2 -1  1 -1 -2  1  1 -1 -2  1  1  2 -1 -2  1  2
+ 2  1 -1 -2 -1  1  1  2  1 -1 -2 -1  1 -2  2  1
+ 6 -1  1 -1 -2 -1  1 -1 -2 -1  1  2  1 -2 -1 -2
+ 2 -1  1 -1 -1  0  1 -1 -1  0  1  1  0 -1  0  0
+ 0  1 -1 -2  1  1  1  2 -1 -1 -2  1  1  2  2 -1
+ 0 -1  1  2  1 -1  1  2  1 -1 -2 -1  1 -2  2  1
+ 6 -1 -1  1 -2 -1 -1  1 -2 -1  1 -2 -1  2  1 -2
+ 2 -1 -1  1 -1  0 -1  1 -1  0  1 -1  0  1  0  0
+ 2 -1  0  0 -1  0  0  0 -1  0  0  0  0  0  0  0
+ 0 -1  0  1 -1  1  0  1 -1  1  0  0  0  1 -1  1
+ 0 -2  2  2 -2  2  1  1 -1  1 -1  1 -1  1 -1  1
+ 2 -2 -2  2 -2  2 -1  1 -1  1  1 -1  1  1 -1  1
+ 2 -1 -1  1 -2  1 -1  1 -2  1  1 -2  1  2 -1  2
+ 12 -1 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -1 -2
+ 0  1 -1 -1  1  2  1  1 -1 -2 -1  1  2  1  2 -2
+ 2  0  0  0  0  0  0  0 -1 -1  0  0  0  0  0 -1
+ 0  0  0  0  0  0  0  1  0 -1  0  0  0  0  1  0
+ 0 -1  0  1  0  0  0  1  0  0  0  0  0  0  0  0
+ 0  0  0  1  0 -1  0  0  0  0  0  0  0  0  1  0
+ 2 -1 -1  2 -1 -1 -1  2 -1 -1  2 -1 -1  2  2 -1
+ 6 -1 -1  1 -1 -2 -1  1 -1 -2  1 -1 -2  1  2 -2
+ 2  0 -1  1 -1 -1  0  0  0  0  1 -1 -1  1  1 -1
+ 2 -1 -1  1  0 -1 -1  1  0 -1  1  0 -1  0  1  0
+ 2 -1  0  1 -1 -1  0  1 -1 -1  0  0  0  1  1 -1
+ 2  0  0  0  0  0 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 2  1  1 -1  1  2 -1  1 -1 -2  1 -1 -2  1  2 -2
+ 0  0  0  1 -1  0  0  0  0  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  1  1 -1
+ 0  1  0  1  0  0  0 -1  0  0  0  0  0  0  0  0
+ 0  0  0  0  0  0  1 -1  0  0  1  0  0  0  0  0
+ 0 -1  1  0  1  1  1  0  1  1  0 -1 -1  0  0 -1
+ 2  1 -2  1 -1 -1  2 -1  1  1  2 -2 -2  1  1 -1
+ 0  2 -1  1 -1 -1  2 -2  2  2  1 -1 -1  1  1 -1
+ 0  0  1 -1  1  1  0  0  0  0  1 -1 -1  1  1 -1
+ 0 -1  2 -1  1  1  2 -1  1  1  2 -2 -2  1  1 -1
+ 0  0  0  0  0  0  1 -1  1  1  1 -1 -1  1  1 -1
+ 0  0  0  0  0  0  1  0  1  0  0 -1  0  0  0  0
+ 0  1 -1  1  0  1  1 -1  0 -1  1  0  1  0 -1  0
+ 2  1 -1  1 -2 -1  1 -1  2  1  1 -2 -1  2  1 -2
+ 2 -2 -1 -1  1  1 -2 -2  2  2 -1  1  1  1  1 -1
+ 0 -1 -1 -1  2  1 -1 -1  2  1 -1  2  1  2  1 -2
+ 2 -2  2  2 -2 -2  1  1 -1 -1 -1  1  1  1  1 -1
+ 2  1 -1  2  1  1  1 -2 -1 -1  2  1  1 -2 -2 -1
+ 2  1  2 -1  1  1 -2  1 -1 -1  2 -2 -2  1  1 -1
+ 2 -1  1  1  2  1  1  1  2  1 -1 -2 -1 -2 -1 -2
+ 2  2 -2 -2  2 -2  1  1 -1  1 -1  1 -1  1 -1  1
+ 2 -1  1  1 -1 -2  1  1 -1 -2 -1  1  2  1  2 -2
+ 2  1 -1 -1  1 -2  1  1 -1  2 -1  1 -2  1 -2  2
+ 0  0  0  0  0  0  0 -1  1  0  0  0  0  1  0  0
+ 0  1  0  1 -1  1  0 -1  1 -1  0  0  0  1 -1  1
+ 0  2 -1  1 -1  1  2 -2  2 -2  1 -1  1  1 -1  1
+ 2  1  1  2 -1  1 -1 -2  1 -1 -2  1 -1  2 -2  1
+ 0  1 -1  2 -1  1  1 -2  1 -1  2 -1  1  2 -2  1
+ 0 -1  1 -1  2 -1  1 -1  2 -1  1 -2  1  2 -1  2
+ 0 -1  1 -1  1  0  1 -1  1  0  1 -1  0  1  0  0
+ 0 -1  1 -1  2  1  1 -1  2  1  1 -2 -1  2  1 -2
+ 0  0  0  0  0  0  1 -1  1 -1  1 -1  1  1 -1  1
+ 0  0  0  0  0  0  0  0  0  0  1 -1  0  1  0  0
+ 0  1 -1  1 -1  0  1 -1  1  0  1 -1  0  1  0  0
+ 0  0  0  0  0  0  1  0  0  1  0  0 -1  0  0  0
+ 0  1 -1  1  1  0  1 -1 -1  0  1  1  0 -1  0  0
+ 0  1 -1  0  0  0  1  0  0  0  0  0  0  0  0  0
+ 0  2 -2  2  2  2  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 0  1 -2  1  1  1  2 -1 -1 -1  2  2  2 -1 -1 -1
+ 2  2 -1  1  1  1  2 -2 -2 -2  1  1  1 -1 -1 -1
+ 0  1  0  0  0 -1  0  0  0  1  0  0  0  0  0  0
+ 0  1  1  1  1 -2 -1 -1 -1  2 -1 -1  2 -1  2  2
+ 0  2  2  2  2 -2 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 2  2  1  1  1 -1 -2 -2 -2  2 -1 -1  1 -1  1  1
+ 2  2  2 -2 -2 -2 -1  1  1  1  1  1  1 -1 -1 -1
+ 2  2 -1 -1 -1 -1  2  2  2  2 -1 -1 -1 -1 -1 -1
+ 6  1 -1 -1 -1 -2  1  1  1  2 -1 -1 -2 -1 -2 -2
+ 2  1  0 -1 -1 -1  0  1  1  1  0  0  0 -1 -1 -1
+ 2  1  1 -1 -1 -2 -1  1  1  2  1  1  2 -1 -2 -2
+ 2  1 -1 -1  0 -1  1  1  0  1 -1  0 -1  0 -1  0
+ 6  1 -1 -1 -2 -1  1  1  2  1 -1 -2 -1 -2 -1 -2
+ 2  1 -1  0 -1 -1  1  0  1  1  0 -1 -1  0  0 -1
+ 2  2 -2  2 -2 -2  1 -1  1  1  1 -1 -1  1  1 -1
+ 2  1 -1  1 -1 -2  1 -1  1  2  1 -1 -2  1  2 -2
+ 2 -1 -2  1  1 -1 -2  1  1 -1  2  2 -2 -1  1  1
+ 2 -1  1  1 -2 -1  1  1 -2 -1 -1  2  1  2  1 -2
+ 2 -1  1  1  1  2  1  1  1  2 -1 -1 -2 -1 -2 -2
+ 2  2 -2 -2 -2  2  1  1  1 -1 -1 -1  1 -1  1  1
+ 2 -1  1 -2  1 -1  1 -2  1 -1  2 -1  1  2 -2  1
+ 2  1 -1 -1 -1  0  1  1  1  0 -1 -1  0 -1  0  0
+ 2  0  0  0  0  0  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 0  1 -2  1  1 -1  2 -1 -1  1  2  2 -2 -1  1  1
+ 0  1 -1  0  1 -1  1  0 -1  1  0  1 -1  0  0  1
+ 0  1 -1  1  0 -1  1 -1  0  1  1  0 -1  0  1  0
+ 2  0 -1  0  0 -1  0  0  0  0  0  0 -1  0  0  0
+ 0  0 -1  1  1 -1  0  0  0  0  1  1 -1 -1  1  1
+ 0  2 -2  2  2 -2  1 -1 -1  1  1  1 -1 -1  1  1
+ 0  0  0  0  0  0  0  0  1  1  0  0  0  0  0 -1
+ 0  1  1  1 -1  0 -1 -1  1  0 -1  1  0  1  0  0
+ 0  1  0  0 -1  0  0  0  1  0  0  0  0  0  0  0
+ 2  2  1  1 -1  1 -2 -2  2 -2 -1  1 -1  1 -1  1
+ 0  2  2  2 -2  2 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 0  1  1  1 -2  1 -1 -1  2 -1 -1  2 -1  2 -1  2
+ 0  1  1  1 -2 -1 -1 -1  2  1 -1  2  1  2  1 -2
+ 0  1  0  1 -1 -1  0 -1  1  1  0  0  0  1  1 -1
+ 0  1  1  0 -1 -1 -1  0  1  1  0  1  1  0  0 -1
+ 2  0  0  0 -1 -1  0  0  0  0  0  0  0  0  0 -1
+ 0  0  1  1 -1 -1  0  0  0  0 -1  1  1  1  1 -1
+ 0  2  2  2 -2 -2 -1 -1  1  1 -1  1  1  1  1 -1
+ 2  1  1 -1 -2 -1 -1  1  2  1  1  2  1 -2 -1 -2
+ 0  0  0  0  0  0  0 -1  0  1  0  0  0  0  1  0
+ 2  1  1  2  1 -1 -1 -2 -1  1 -2 -1  1 -2  2  1
+ 0  1  0  1  1 -1  0 -1 -1  1  0  0  0 -1  1  1
+ 0  2 -1  1  1 -1  2 -2 -2  2  1  1 -1 -1  1  1
+ 0  1 -1  2  1 -1  1 -2 -1  1  2  1 -1 -2  2  1
+ 0 -1  1 -1 -1  2  1 -1 -1  2  1  1 -2 -1  2  2
+ 0 -2  1 -1  1  1  2 -2  2  2  1 -1 -1  1  1 -1
+ 0 -1  1 -1  0  1  1 -1  0  1  1  0 -1  0  1  0
+ 0 -1  1 -2  1  1  1 -2  1  1  2 -1 -1  2  2 -1
+ 0 -1  1 -1  1  2  1 -1  1  2  1 -1 -2  1  2 -2
+ 0  0  0  0  0  0  1 -1 -1  1  1  1 -1 -1  1  1
+ 0  1 -2  1 -1  1  2 -1  1 -1  2 -2  2  1 -1  1
+ 0  1 -1  0 -1  1  1  0  1 -1  0 -1  1  0  0  1
+ 0  0  0  0  0  0 -1 -1  1  1 -1  1  1  1  1 -1
+ 0  1  1  2 -1 -1 -1 -2  1  1 -2  1  1  2  2 -1
+ 2 -1 -2  1 -1  1 -2  1 -1  1  2 -2  2  1 -1  1
+ 0 -1 -1 -1  1  2 -1 -1  1  2 -1  1  2  1  2 -2
+ 2  1 -1 -1 -2  1  1  1  2 -1 -1 -2  1 -2  1  2
+ 2 -1  1 -2 -1  1  1 -2 -1  1  2  1 -1 -2  2  1
+ 2  0 -1  0 -1  0  0  0  0  0  0 -1  0  0  0  0
+ 0  0 -1  1 -1  1  0  0  0  0  1 -1  1  1 -1  1
+ 0  2 -2  2 -2  2  1 -1  1 -1  1 -1  1  1 -1  1
+ 2  0  0  0  0  0  0  0  0  0  0 -1 -1  0  0 -1
+ 0  0  0  0  0  0  0  0  0  0  1  0 -1  0  1  0
+ 0  0 -1  1  0  0  0  0  0  0  1  0  0  0  0  0
+ 0  1  1  0  0  0 -1  0  0  0  0  0  0  0  0  0
+ 0  0  0  0  0  0 -1  1  0  0  1  0  0  0  0  0
+ 0 -1  0  1  1  1  0  1  1  1  0  0  0 -1 -1 -1
+ 2  1  1 -2 -1 -1 -1  2  1  1  2  1  1 -2 -2 -1
+ 0  2  1 -1 -1 -1 -2  2  2  2  1  1  1 -1 -1 -1
+ 0  0 -1  1  1  1  0  0  0  0  1  1  1 -1 -1 -1
+ 0 -1 -1  2  1  1 -1  2  1  1  2  1  1 -2 -2 -1
+ 0  0  0  0  0  0 -1  1  1  1  1  1  1 -1 -1 -1
+ 0  0  0  0  0  0  0  1  1  0  0  0  0 -1  0  0
+ 0  1  1 -1  0  1 -1  1  0 -1  1  0 -1  0  1  0
+ 0  0  0  0  0  0  0  0  0  0  1  1  0 -1  0  0
+ 0  1  1 -1 -1  0 -1  1  1  0  1  1  0 -1  0  0
+ 0  0  0  0  0  0  0  1  0  1  0  0  0  0 -1  0
+ 0  1  1 -1  1  0 -1  1 -1  0  1 -1  0  1  0  0
+ 0  1  0 -1  0  0  0  1  0  0  0  0  0  0  0  0
+ 2  2  1 -1  1  1 -2  2 -2 -2  1 -1 -1  1  1 -1
+ 0  2  2 -2  2  2 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 0  1  1 -2  1  1 -1  2 -1 -1  2 -1 -1  2  2 -1
+ 0  1  1 -2  1 -1 -1  2 -1  1  2 -1  1  2 -2  1
+ 0  1  0 -1  1 -1  0  1 -1  1  0  0  0  1 -1  1
+ 0  1  1 -1  0 -1 -1  1  0  1  1  0  1  0 -1  0
+ 2  0  0 -1  0 -1  0  0  0  0  0  0  0  0 -1  0
+ 0  0  1 -1  1 -1  0  0  0  0  1 -1  1  1 -1  1
+ 0  2  2 -2  2 -2 -1  1 -1  1  1 -1  1  1 -1  1
+ 2  0  0  0  0  0  0  0  0  0  0  0  0 -1 -1 -1
+ 0  0  1 -1  0  0  0  0  0  0  1  0  0  0  0  0
+ 0  0  0  0  0  0  0  0  0  0  1  0  1  0 -1  0
+ 2  1  1  1  1  0 -1 -1 -1  0 -1 -1  0 -1  0  0
+ 2  0  0  0  0  0  0 -1 -1  0  0  0  0 -1  0  0
+ 0  0  0  0  0  0  0  0 -1  1  0  0  0  0  0  1
+ 0 -1  0  0  0  1  0  0  0  1  0  0  0  0  0  0
+ 0  0  0  0 -1  1  0  0  0  0  0  0  0  0  0  1
+ 2 -1 -1 -1 -1  2 -1 -1 -1  2 -1 -1  2 -1  2  2
+ 6 -1 -1 -1 -2  1 -1 -1 -2  1 -1 -2  1 -2  1  2
+ 2  0 -1 -1 -1  1  0  0  0  0 -1 -1  1 -1  1  1
+ 2 -1 -1  0 -1  1 -1  0 -1  1  0 -1  1  0  0  1
+ 2 -1  0 -1 -1  1  0 -1 -1  1  0  0  0 -1  1  1
+ 2  0  0  0  0  0 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 2  1  1  1  2 -1 -1 -1 -2  1 -1 -2  1 -2  1  2
+ 0  0  0  0  0  0  0  0  0  0  0  0  0 -1  1  1
+ 0  0  0 -1  0  1  0  0  0  0  0  0  0  0  1  0
+ 2  0  0  0  0  0  0  0  0  0 -1 -1  0 -1  0  0
+ 0  0  0  0  0  0  0  0  0  0  0 -1  1  0  0  1
+ 0  0 -1  0  0  1  0  0  0  0  0  0  1  0  0  0
+ 0  0  0  0  0  0 -1  0  0  1  0  0  1  0  0  0
+ 2  1  2  1  1 -1 -2 -1 -1  1 -2 -2  2 -1  1  1
+ 0  1  1  0  1 -1 -1  0 -1  1  0 -1  1  0  0  1
+ 0  2  1 -1  1 -1 -2  2 -2  2  1 -1  1  1 -1  1
+ 0  1  2 -1  1 -1 -2  1 -1  1  2 -2  2  1 -1  1
+ 0  1  1  1  0 -1 -1 -1  0  1 -1  0  1  0  1  0
+ 0  2  1  1 -1 -1 -2 -2  2  2 -1  1  1  1  1 -1
+ 0  1  1  1 -1 -2 -1 -1  1  2 -1  1  2  1  2 -2
+ 0  1  2  1 -1 -1 -2 -1  1  1 -2  2  2  1  1 -1
+ 0  1  1 -1  1 -2 -1  1 -1  2  1 -1  2  1 -2  2
+ 0 -2 -1  1  1  1 -2  2  2  2  1  1  1 -1 -1 -1
+ 0 -1 -1  1  0  1 -1  1  0  1  1  0  1  0 -1  0
+ 0 -1 -2  1  1  1 -2  1  1  1  2  2  2 -1 -1 -1
+ 0 -1 -1  1  1  2 -1  1  1  2  1  1  2 -1 -2 -2
+ 0 -1 -1  1 -1  2 -1  1 -1  2  1 -1  2  1 -2  2
+ 0  1  1 -2 -1  1 -1  2  1 -1  2  1 -1 -2  2  1
+ 0  1  0 -1 -1  1  0  1  1 -1  0  0  0 -1  1  1
+ 2  0  0 -1 -1  0  0  0  0  0  0  0  0 -1  0  0
+ 0  0  1 -1 -1  1  0  0  0  0  1  1 -1 -1  1  1
+ 0  2  2 -2 -2  2 -1  1  1 -1  1  1 -1 -1  1  1
+ 0  0  0  0  0  0 -1  1 -1  1  1 -1  1  1 -1  1
+ 0  1  1 -1  2 -1 -1  1 -2  1  1 -2  1  2 -1  2
+ 6  1 -1 -2 -1 -1  1  2  1  1 -2 -1 -1 -2 -2 -1
+ 2  0  0  0  0  0 -1  0 -1  0  0 -1  0  0  0  0
+ 6  1  1  1  2  1 -1 -1 -2 -1 -1 -2 -1 -2 -1 -2
+ 2  1  1  1  0  1 -1 -1  0 -1 -1  0 -1  0 -1  0
+ 2  0  0  0  0  0  0 -1  0 -1  0  0  0  0 -1  0
+ 0  0  0  0  0  0  0  0  1 -1  0  0  0  0  0  1
+ 0 -1  0  0  1  0  0  0  1  0  0  0  0  0  0  0
+ 0  0  0  0  1 -1  0  0  0  0  0  0  0  0  0  1
+ 2 -1 -1 -1  2 -1 -1 -1  2 -1 -1  2 -1  2 -1  2
+ 6 -1 -1 -1  1 -2 -1 -1  1 -2 -1  1 -2  1 -2  2
+ 2  0 -1 -1  1 -1  0  0  0  0 -1  1 -1  1 -1  1
+ 2 -1 -1  0  1 -1 -1  0  1 -1  0  1 -1  0  0  1
+ 2 -1  0 -1  1 -1  0 -1  1 -1  0  0  0  1 -1  1
+ 2  0  0  0  0  0 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 2  1  1  1 -1  2 -1 -1  1 -2 -1  1 -2  1 -2  2
+ 0  0  0  0  0  0  0  0  0  0  0  0  0  1 -1  1
+ 0  0  0 -1  1  0  0  0  0  0  0  0  0  1  0  0
+ 2  0  0  0  0  0  0  0  0  0 -1  0 -1  0 -1  0
+ 0  0  0  0  0  0  0  0  0  0  0  1 -1  0  0  1
+ 0  0 -1  0  1  0  0  0  0  0  0  1  0  0  0  0
+ 0  0  0  0  0  0 -1  0  1  0  0  1  0  0  0  0
+ 0  1  1  0 -1  1 -1  0  1 -1  0  1 -1  0  0  1
+ 0  2  1 -1 -1  1 -2  2  2 -2  1  1 -1 -1  1  1
+ 2  1  2  1 -1  1 -2 -1  1 -1 -2  2 -2  1 -1  1
+ 0  1  2 -1 -1  1 -2  1  1 -1  2  2 -2 -1  1  1
+ 0 -1 -1  1  1  0 -1  1  1  0  1  1  0 -1  0  0
+ 0 -1 -1  1  2  1 -1  1  2  1  1  2  1 -2 -1 -2
+ 0 -1 -1  1  2 -1 -1  1  2 -1  1  2 -1 -2  1  2
+ 0  0  0  0  0  0 -1  1  1 -1  1  1 -1 -1  1  1
+ 2  0  0  0  0  0 -1 -1  0  0 -1  0  0  0  0  0
+ 6  1  1  2  1  1 -1 -2 -1 -1 -2 -1 -1 -2 -2 -1
+ 0  1 -1  1  1 -2  1 -1 -1  2  1  1 -2 -1  2  2
+ 0 -1  1  1 -2  1  1  1 -2  1 -1  2 -1  2 -1  2
+ 6 -1 -1 -2 -1  1 -1 -2 -1  1 -2 -1  1 -2  2  1
+ 2 -1 -1 -1  0  1 -1 -1  0  1 -1  0  1  0  1  0
+ 0 -1  1  1 -1  2  1  1 -1  2 -1  1 -2  1 -2  2
+ 0  1 -1  1  2 -1  1 -1 -2  1  1  2 -1 -2  1  2
+ 0  1 -1  1 -2  1  1 -1  2 -1  1 -2  1  2 -1  2
+ 0 -1  1  1  1 -2  1  1  1 -2 -1 -1  2 -1  2  2
+ 0 -1  1  1  2 -1  1  1  2 -1 -1 -2  1 -2  1  2
+ 6 -1 -1 -2  1 -1 -1 -2  1 -1 -2  1 -1  2 -2  1
+ 2 -1 -1 -1  1  0 -1 -1  1  0 -1  1  0  1  0  0
+ 2 -2 -2 -2  2  2 -1 -1  1  1 -1  1  1  1  1 -1
+ 0 -2  2 -2  2  2  1 -1  1  1  1 -1 -1  1  1 -1
+ 0 -1  0 -1  1  1  0 -1  1  1  0  0  0  1  1 -1
+ 2 -1 -1 -2  1  1 -1 -2  1  1 -2  1  1  2  2 -1
+ 2 -1  0 -1  0  0  0 -1  0  0  0  0  0  0  0  0
+ 12 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 12 -1 -1 -2 -1 -1 -1 -2 -1 -1 -2 -1 -1 -2 -2 -1
+ 6 -1  1 -2 -1 -1  1 -2 -1 -1  2  1  1 -2 -2 -1
+ 6 -1  0 -1 -1 -1  0 -1 -1 -1  0  0  0 -1 -1 -1
+ 6 -2  1 -1 -1 -1  2 -2 -2 -2  1  1  1 -1 -1 -1
+ 0  1 -1  1 -1  2  1 -1  1 -2  1 -1  2  1 -2  2
+ 0  2 -2 -2  2  2  1  1 -1 -1 -1  1  1  1  1 -1
+ 0  0 -1 -1  1  1  0  0  0  0 -1  1  1  1  1 -1
+ 2  0 -1 -1  0  0  0  0  0  0 -1  0  0  0  0  0
+ 0  1  1 -1 -2  1 -1  1  2 -1  1  2 -1 -2  1  2
+ 0 -2 -2  2  2  2 -1  1  1  1  1  1  1 -1 -1 -1
+ 0 -1 -1  0  1  1 -1  0  1  1  0  1  1  0  0 -1
+ 2 -1 -2 -1  1  1 -2 -1  1  1 -2  2  2  1  1 -1
+ 0  1  1 -1 -1  2 -1  1  1 -2  1  1 -2 -1  2  2
+ 6  1  2  1  1  1 -2 -1 -1 -1 -2 -2 -2 -1 -1 -1
+ 6  2 -2 -2 -2 -2  1  1  1  1 -1 -1 -1 -1 -1 -1
+ 6  2  1  1  1  1 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1
+ 6 -2  2 -2 -2 -2  1 -1 -1 -1  1  1  1 -1 -1 -1
+ 6 -2 -2  2 -2 -2 -1  1 -1 -1  1 -1 -1  1  1 -1
+ 2 -1 -1  0  0  0 -1  0  0  0  0  0  0  0  0  0
+ 12 -1 -2 -1 -1 -1 -2 -1 -1 -1 -2 -2 -2 -1 -1 -1
+ 6 -1 -2  1 -1 -1 -2  1 -1 -1  2 -2 -2  1  1 -1
+ 6 -1 -1  0 -1 -1 -1  0 -1 -1  0 -1 -1  0  0 -1
+ 6 -2 -1  1 -1 -1 -2  2 -2 -2  1 -1 -1  1  1 -1
+ 6 -1 -2 -1  1 -1 -2 -1  1 -1 -2  2 -2  1 -1  1
+ 6 -2 -2 -2  2 -2 -1 -1  1 -1 -1  1 -1  1 -1  1
+ 6 -1 -1 -1  0 -1 -1 -1  0 -1 -1  0 -1  0 -1  0
+ 6 -2 -1 -1  1 -1 -2 -2  2 -2 -1  1 -1  1 -1  1
+ 12 -2 -1 -1 -1 -1 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1
+ 6 -1 -2 -1 -1  1 -2 -1 -1  1 -2 -2  2 -1  1  1
+ 6 -2 -2 -2 -2  2 -1 -1 -1  1 -1 -1  1 -1  1  1
+ 6 -1 -1 -1 -1  0 -1 -1 -1  0 -1 -1  0 -1  0  0
+ 6 -2 -1 -1 -1  1 -2 -2 -2  2 -1 -1  1 -1  1  1
+ 6  0 -1 -1 -1 -1  0  0  0  0 -1 -1 -1 -1 -1 -1
+ 6  1 -2 -1 -1 -1  2  1  1  1 -2 -2 -2 -1 -1 -1
+ 6  0  0  0  0  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 2  0  0  0  0  0 -1  0  0 -1  0  0 -1  0  0  0
+ 6  1  1  1  1  2 -1 -1 -1 -2 -1 -1 -2 -1 -2 -2
+end
diff --git a/demos/ppl_lcdd/examples/cp7.ext b/demos/ppl_lcdd/examples/cp7.ext
new file mode 100644
index 0000000..390c068
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cp7.ext
@@ -0,0 +1,70 @@
+* Complete Cut Polytope on 7 vertices
+* The number of facets is 116,764.
+V-representation
+begin
+  64  22   integer
+1   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1   1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1   0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1   1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+1   1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1   1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1   1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1   1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1   0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1   0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1   0 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1   0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1   0 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1   1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1   1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1   1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1   1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1   1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1   1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1   1 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1   1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1   1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1   1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1   0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1   0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1   0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1   0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1   0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1   0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1   0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1   0 1 1 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1   0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1   0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1   1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0
+1   1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1
+1   1 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1
+1   1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1
+1   1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1
+1   1 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0
+1   1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1
+1   1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1
+1   1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0
+1   1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0
+1   0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0
+1   0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1
+1   0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1
+1   0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1
+1   0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1
+1   0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0
+1   0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1
+1   0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1
+1   0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0
+1   0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0
+1   1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1
+1   1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1
+1   1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0
+1   1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0
+1   1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1   0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1
+1   0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1
+1   0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0
+1   0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0
+1   0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0
+1   1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/cross10.ine b/demos/ppl_lcdd/examples/cross10.ine
new file mode 100644
index 0000000..ad45922
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross10.ine
@@ -0,0 +1,1030 @@
+* 10-dim cross polytope
+H-representation
+begin
+1024  11  integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/cross12.ine b/demos/ppl_lcdd/examples/cross12.ine
new file mode 100644
index 0000000..ce5b2fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross12.ine
@@ -0,0 +1,4102 @@
+* 12-dim cross polytope
+H-representation
+begin
+4096  13   integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 -1 1 1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 -1 1 1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/cross4.ine b/demos/ppl_lcdd/examples/cross4.ine
new file mode 100644
index 0000000..b716562
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross4.ine
@@ -0,0 +1,20 @@
+H-representation
+begin
+16 5 integer
+1 1 1 1 -1
+1 -1 -1 1 -1
+1 -1 1 -1 -1
+1 -1 1 1 -1
+1 1 -1 -1 1
+1 1 -1 1 1
+1 1 1 -1 1
+1 1 1 1 1
+1 -1 -1 -1 1
+1 -1 -1 1 1
+1 -1 1 -1 1
+1 -1 1 1 1
+1 1 -1 -1 -1
+1 1 -1 1 -1
+1 1 1 -1 -1
+1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cross6.ine b/demos/ppl_lcdd/examples/cross6.ine
new file mode 100644
index 0000000..a4024b8
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross6.ine
@@ -0,0 +1,69 @@
+* 6-dim cross polytope
+H-representation
+begin
+64  7  integer
+ 1 1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1
+ 1 1 -1 -1 1 1 -1
+ 1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 1
+ 1 1 -1 1 1 -1 -1
+ 1 1 -1 1 1 -1 1
+ 1 1 -1 1 1 1 -1
+ 1 1 -1 1 1 1 1
+ 1 1 1 1 -1 -1 -1
+ 1 1 1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1
+ 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1
+ 1 1 1 1 1 -1 1
+ 1 1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 1
+ 1 1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 -1
+ 1 1 1 -1 -1 1 1
+ 1 1 1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1
+ 1 -1 1 1 1 1 -1
+ 1 -1 1 1 1 -1 1
+ 1 -1 1 1 1 -1 -1
+ 1 -1 1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1
+ 1 -1 1 1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1
+ 1 -1 -1 1 1 1 -1
+ 1 -1 -1 1 1 -1 1
+ 1 -1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cross8.ine b/demos/ppl_lcdd/examples/cross8.ine
new file mode 100644
index 0000000..b045ac5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cross8.ine
@@ -0,0 +1,261 @@
+* 8-dim cross polytope
+H-representation
+begin
+256  9  integer
+ 1 1 -1 -1 -1 -1 -1 -1 -1
+ 1 1 -1 -1 -1 -1 -1 -1 1
+ 1 1 -1 -1 -1 -1 -1 1 -1
+ 1 1 -1 -1 -1 -1 -1 1 1
+ 1 1 -1 -1 -1 -1 1 -1 -1
+ 1 1 -1 -1 -1 -1 1 -1 1
+ 1 1 -1 -1 -1 -1 1 1 -1
+ 1 1 -1 -1 -1 -1 1 1 1
+ 1 1 -1 -1 -1 1 -1 -1 -1
+ 1 1 -1 -1 -1 1 -1 -1 1
+ 1 1 -1 -1 -1 1 -1 1 -1
+ 1 1 -1 -1 -1 1 -1 1 1
+ 1 1 -1 -1 -1 1 1 -1 -1
+ 1 1 -1 -1 -1 1 1 -1 1
+ 1 1 -1 -1 -1 1 1 1 -1
+ 1 1 -1 -1 -1 1 1 1 1
+ 1 1 -1 -1 1 -1 -1 -1 -1
+ 1 1 -1 -1 1 -1 -1 -1 1
+ 1 1 -1 -1 1 -1 -1 1 -1
+ 1 1 -1 -1 1 -1 -1 1 1
+ 1 1 -1 -1 1 -1 1 -1 -1
+ 1 1 -1 -1 1 -1 1 -1 1
+ 1 1 -1 -1 1 -1 1 1 -1
+ 1 1 -1 -1 1 -1 1 1 1
+ 1 1 -1 -1 1 1 -1 -1 -1
+ 1 1 -1 -1 1 1 -1 -1 1
+ 1 1 -1 -1 1 1 -1 1 -1
+ 1 1 -1 -1 1 1 -1 1 1
+ 1 1 -1 -1 1 1 1 -1 -1
+ 1 1 -1 -1 1 1 1 -1 1
+ 1 1 -1 -1 1 1 1 1 -1
+ 1 1 -1 -1 1 1 1 1 1
+ 1 1 -1 1 -1 -1 -1 -1 -1
+ 1 1 -1 1 -1 -1 -1 -1 1
+ 1 1 -1 1 -1 -1 -1 1 -1
+ 1 1 -1 1 -1 -1 -1 1 1
+ 1 1 -1 1 -1 -1 1 -1 -1
+ 1 1 -1 1 -1 -1 1 -1 1
+ 1 1 -1 1 -1 -1 1 1 -1
+ 1 1 -1 1 -1 -1 1 1 1
+ 1 1 -1 1 -1 1 -1 -1 -1
+ 1 1 -1 1 -1 1 -1 -1 1
+ 1 1 -1 1 -1 1 -1 1 -1
+ 1 1 -1 1 -1 1 -1 1 1
+ 1 1 -1 1 -1 1 1 -1 -1
+ 1 1 -1 1 -1 1 1 -1 1
+ 1 1 -1 1 -1 1 1 1 -1
+ 1 1 -1 1 -1 1 1 1 1
+ 1 1 -1 1 1 -1 -1 -1 -1
+ 1 1 -1 1 1 -1 -1 -1 1
+ 1 1 -1 1 1 -1 -1 1 -1
+ 1 1 -1 1 1 -1 -1 1 1
+ 1 1 -1 1 1 -1 1 -1 -1
+ 1 1 -1 1 1 -1 1 -1 1
+ 1 1 -1 1 1 -1 1 1 -1
+ 1 1 -1 1 1 -1 1 1 1
+ 1 1 -1 1 1 1 -1 -1 -1
+ 1 1 -1 1 1 1 -1 -1 1
+ 1 1 -1 1 1 1 -1 1 -1
+ 1 1 -1 1 1 1 -1 1 1
+ 1 1 -1 1 1 1 1 -1 -1
+ 1 1 -1 1 1 1 1 -1 1
+ 1 1 -1 1 1 1 1 1 -1
+ 1 1 -1 1 1 1 1 1 1
+ 1 1 1 1 -1 -1 -1 -1 -1
+ 1 1 1 1 -1 -1 -1 -1 1
+ 1 1 1 1 -1 -1 -1 1 -1
+ 1 1 1 1 -1 -1 -1 1 1
+ 1 1 1 1 -1 -1 1 -1 -1
+ 1 1 1 1 -1 -1 1 -1 1
+ 1 1 1 1 -1 -1 1 1 -1
+ 1 1 1 1 -1 -1 1 1 1
+ 1 1 1 1 -1 1 -1 -1 -1
+ 1 1 1 1 -1 1 -1 -1 1
+ 1 1 1 1 -1 1 -1 1 -1
+ 1 1 1 1 -1 1 -1 1 1
+ 1 1 1 1 -1 1 1 -1 -1
+ 1 1 1 1 -1 1 1 -1 1
+ 1 1 1 1 -1 1 1 1 -1
+ 1 1 1 1 -1 1 1 1 1
+ 1 1 1 1 1 1 -1 -1 -1
+ 1 1 1 1 1 1 -1 -1 1
+ 1 1 1 1 1 1 -1 1 -1
+ 1 1 1 1 1 1 -1 1 1
+ 1 1 1 1 1 1 1 1 -1
+ 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 -1 1
+ 1 1 1 1 1 1 1 -1 -1
+ 1 1 1 1 1 -1 1 1 1
+ 1 1 1 1 1 -1 1 1 -1
+ 1 1 1 1 1 -1 1 -1 1
+ 1 1 1 1 1 -1 1 -1 -1
+ 1 1 1 1 1 -1 -1 1 1
+ 1 1 1 1 1 -1 -1 1 -1
+ 1 1 1 1 1 -1 -1 -1 1
+ 1 1 1 1 1 -1 -1 -1 -1
+ 1 1 1 -1 1 1 1 1 1
+ 1 1 1 -1 1 1 1 1 -1
+ 1 1 1 -1 1 1 1 -1 1
+ 1 1 1 -1 1 1 1 -1 -1
+ 1 1 1 -1 1 1 -1 1 1
+ 1 1 1 -1 1 1 -1 1 -1
+ 1 1 1 -1 1 1 -1 -1 1
+ 1 1 1 -1 1 1 -1 -1 -1
+ 1 1 1 -1 1 -1 1 1 1
+ 1 1 1 -1 1 -1 1 1 -1
+ 1 1 1 -1 1 -1 1 -1 1
+ 1 1 1 -1 1 -1 1 -1 -1
+ 1 1 1 -1 1 -1 -1 1 1
+ 1 1 1 -1 1 -1 -1 1 -1
+ 1 1 1 -1 1 -1 -1 -1 1
+ 1 1 1 -1 1 -1 -1 -1 -1
+ 1 1 1 -1 -1 1 1 1 1
+ 1 1 1 -1 -1 1 1 1 -1
+ 1 1 1 -1 -1 1 1 -1 1
+ 1 1 1 -1 -1 1 1 -1 -1
+ 1 1 1 -1 -1 1 -1 1 1
+ 1 1 1 -1 -1 1 -1 1 -1
+ 1 1 1 -1 -1 1 -1 -1 1
+ 1 1 1 -1 -1 1 -1 -1 -1
+ 1 1 1 -1 -1 -1 1 1 1
+ 1 1 1 -1 -1 -1 1 1 -1
+ 1 1 1 -1 -1 -1 1 -1 1
+ 1 1 1 -1 -1 -1 1 -1 -1
+ 1 1 1 -1 -1 -1 -1 1 1
+ 1 1 1 -1 -1 -1 -1 1 -1
+ 1 1 1 -1 -1 -1 -1 -1 1
+ 1 1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 1 1 1 1 1 1 1
+ 1 -1 1 1 1 1 1 1 -1
+ 1 -1 1 1 1 1 1 -1 1
+ 1 -1 1 1 1 1 1 -1 -1
+ 1 -1 1 1 1 1 -1 1 1
+ 1 -1 1 1 1 1 -1 1 -1
+ 1 -1 1 1 1 1 -1 -1 1
+ 1 -1 1 1 1 1 -1 -1 -1
+ 1 -1 1 1 1 -1 1 1 1
+ 1 -1 1 1 1 -1 1 1 -1
+ 1 -1 1 1 1 -1 1 -1 1
+ 1 -1 1 1 1 -1 1 -1 -1
+ 1 -1 1 1 1 -1 -1 1 1
+ 1 -1 1 1 1 -1 -1 1 -1
+ 1 -1 1 1 1 -1 -1 -1 1
+ 1 -1 1 1 1 -1 -1 -1 -1
+ 1 -1 1 1 -1 1 1 1 1
+ 1 -1 1 1 -1 1 1 1 -1
+ 1 -1 1 1 -1 1 1 -1 1
+ 1 -1 1 1 -1 1 1 -1 -1
+ 1 -1 1 1 -1 1 -1 1 1
+ 1 -1 1 1 -1 1 -1 1 -1
+ 1 -1 1 1 -1 1 -1 -1 1
+ 1 -1 1 1 -1 1 -1 -1 -1
+ 1 -1 1 1 -1 -1 1 1 1
+ 1 -1 1 1 -1 -1 1 1 -1
+ 1 -1 1 1 -1 -1 1 -1 1
+ 1 -1 1 1 -1 -1 1 -1 -1
+ 1 -1 1 1 -1 -1 -1 1 1
+ 1 -1 1 1 -1 -1 -1 1 -1
+ 1 -1 1 1 -1 -1 -1 -1 1
+ 1 -1 1 1 -1 -1 -1 -1 -1
+ 1 -1 1 -1 1 1 1 1 1
+ 1 -1 1 -1 1 1 1 1 -1
+ 1 -1 1 -1 1 1 1 -1 1
+ 1 -1 1 -1 1 1 1 -1 -1
+ 1 -1 1 -1 1 1 -1 1 1
+ 1 -1 1 -1 1 1 -1 1 -1
+ 1 -1 1 -1 1 1 -1 -1 1
+ 1 -1 1 -1 1 1 -1 -1 -1
+ 1 -1 1 -1 1 -1 1 1 1
+ 1 -1 1 -1 1 -1 1 1 -1
+ 1 -1 1 -1 1 -1 1 -1 1
+ 1 -1 1 -1 1 -1 1 -1 -1
+ 1 -1 1 -1 1 -1 -1 1 1
+ 1 -1 1 -1 1 -1 -1 1 -1
+ 1 -1 1 -1 1 -1 -1 -1 1
+ 1 -1 1 -1 1 -1 -1 -1 -1
+ 1 -1 1 -1 -1 1 1 1 1
+ 1 -1 1 -1 -1 1 1 1 -1
+ 1 -1 1 -1 -1 1 1 -1 1
+ 1 -1 1 -1 -1 1 1 -1 -1
+ 1 -1 1 -1 -1 1 -1 1 1
+ 1 -1 1 -1 -1 1 -1 1 -1
+ 1 -1 1 -1 -1 1 -1 -1 1
+ 1 -1 1 -1 -1 1 -1 -1 -1
+ 1 -1 1 -1 -1 -1 1 1 1
+ 1 -1 1 -1 -1 -1 1 1 -1
+ 1 -1 1 -1 -1 -1 1 -1 1
+ 1 -1 1 -1 -1 -1 1 -1 -1
+ 1 -1 1 -1 -1 -1 -1 1 1
+ 1 -1 1 -1 -1 -1 -1 1 -1
+ 1 -1 1 -1 -1 -1 -1 -1 1
+ 1 -1 1 -1 -1 -1 -1 -1 -1
+ 1 -1 -1 1 1 1 1 1 1
+ 1 -1 -1 1 1 1 1 1 -1
+ 1 -1 -1 1 1 1 1 -1 1
+ 1 -1 -1 1 1 1 1 -1 -1
+ 1 -1 -1 1 1 1 -1 1 1
+ 1 -1 -1 1 1 1 -1 1 -1
+ 1 -1 -1 1 1 1 -1 -1 1
+ 1 -1 -1 1 1 1 -1 -1 -1
+ 1 -1 -1 1 1 -1 1 1 1
+ 1 -1 -1 1 1 -1 1 1 -1
+ 1 -1 -1 1 1 -1 1 -1 1
+ 1 -1 -1 1 1 -1 1 -1 -1
+ 1 -1 -1 1 1 -1 -1 1 1
+ 1 -1 -1 1 1 -1 -1 1 -1
+ 1 -1 -1 1 1 -1 -1 -1 1
+ 1 -1 -1 1 1 -1 -1 -1 -1
+ 1 -1 -1 1 -1 1 1 1 1
+ 1 -1 -1 1 -1 1 1 1 -1
+ 1 -1 -1 1 -1 1 1 -1 1
+ 1 -1 -1 1 -1 1 1 -1 -1
+ 1 -1 -1 1 -1 1 -1 1 1
+ 1 -1 -1 1 -1 1 -1 1 -1
+ 1 -1 -1 1 -1 1 -1 -1 1
+ 1 -1 -1 1 -1 1 -1 -1 -1
+ 1 -1 -1 1 -1 -1 1 1 1
+ 1 -1 -1 1 -1 -1 1 1 -1
+ 1 -1 -1 1 -1 -1 1 -1 1
+ 1 -1 -1 1 -1 -1 1 -1 -1
+ 1 -1 -1 1 -1 -1 -1 1 1
+ 1 -1 -1 1 -1 -1 -1 1 -1
+ 1 -1 -1 1 -1 -1 -1 -1 1
+ 1 -1 -1 1 -1 -1 -1 -1 -1
+ 1 -1 -1 -1 1 1 1 1 1
+ 1 -1 -1 -1 1 1 1 1 -1
+ 1 -1 -1 -1 1 1 1 -1 1
+ 1 -1 -1 -1 1 1 1 -1 -1
+ 1 -1 -1 -1 1 1 -1 1 1
+ 1 -1 -1 -1 1 1 -1 1 -1
+ 1 -1 -1 -1 1 1 -1 -1 1
+ 1 -1 -1 -1 1 1 -1 -1 -1
+ 1 -1 -1 -1 1 -1 1 1 1
+ 1 -1 -1 -1 1 -1 1 1 -1
+ 1 -1 -1 -1 1 -1 1 -1 1
+ 1 -1 -1 -1 1 -1 1 -1 -1
+ 1 -1 -1 -1 1 -1 -1 1 1
+ 1 -1 -1 -1 1 -1 -1 1 -1
+ 1 -1 -1 -1 1 -1 -1 -1 1
+ 1 -1 -1 -1 1 -1 -1 -1 -1
+ 1 -1 -1 -1 -1 1 1 1 1
+ 1 -1 -1 -1 -1 1 1 1 -1
+ 1 -1 -1 -1 -1 1 1 -1 1
+ 1 -1 -1 -1 -1 1 1 -1 -1
+ 1 -1 -1 -1 -1 1 -1 1 1
+ 1 -1 -1 -1 -1 1 -1 1 -1
+ 1 -1 -1 -1 -1 1 -1 -1 1
+ 1 -1 -1 -1 -1 1 -1 -1 -1
+ 1 -1 -1 -1 -1 -1 1 1 1
+ 1 -1 -1 -1 -1 -1 1 1 -1
+ 1 -1 -1 -1 -1 -1 1 -1 1
+ 1 -1 -1 -1 -1 -1 1 -1 -1
+ 1 -1 -1 -1 -1 -1 -1 1 1
+ 1 -1 -1 -1 -1 -1 -1 1 -1
+ 1 -1 -1 -1 -1 -1 -1 -1 1
+ 1 -1 -1 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube.ext b/demos/ppl_lcdd/examples/cube.ext
new file mode 100644
index 0000000..b55a875
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube.ext
@@ -0,0 +1,13 @@
+* cube
+V-representation
+begin
+8 4 rational
+ 1  1  1  1
+ 1 -1  1  1
+ 1  1 -1  1
+ 1 -1 -1  1
+ 1  1  1 -1
+ 1 -1  1 -1
+ 1  1 -1 -1
+ 1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube.ine b/demos/ppl_lcdd/examples/cube.ine
new file mode 100644
index 0000000..28301fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube.ine
@@ -0,0 +1,12 @@
+* cube of side 2 centred at origin
+H-representation
+linearity 1 1
+begin
+6  4 rational
+1 -1 0 0
+1 0 -1 0
+1 0 0 -1
+1 1 0 0
+1 0 1 0
+1 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/cube10.ine b/demos/ppl_lcdd/examples/cube10.ine
new file mode 100644
index 0000000..7318f48
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube10.ine
@@ -0,0 +1,25 @@
+* 10-dim hypercube
+H-representation
+begin
+   20  11  integer
+  1  1  0  0  0  0  0  0  0  0  0
+  1  0  1  0  0  0  0  0  0  0  0
+  1  0  0  1  0  0  0  0  0  0  0
+  1  0  0  0  1  0  0  0  0  0  0
+  1  0  0  0  0  1  0  0  0  0  0
+  1  0  0  0  0  0  1  0  0  0  0
+  1  0  0  0  0  0  0  1  0  0  0
+  1  0  0  0  0  0  0  0  1  0  0
+  1  0  0  0  0  0  0  0  0  1  0
+  1  0  0  0  0  0  0  0  0  0  1
+  1 -1  0  0  0  0  0  0  0  0  0
+  1  0 -1  0  0  0  0  0  0  0  0
+  1  0  0 -1  0  0  0  0  0  0  0
+  1  0  0  0 -1  0  0  0  0  0  0
+  1  0  0  0  0 -1  0  0  0  0  0
+  1  0  0  0  0  0 -1  0  0  0  0
+  1  0  0  0  0  0  0 -1  0  0  0
+  1  0  0  0  0  0  0  0 -1  0  0
+  1  0  0  0  0  0  0  0  0 -1  0
+  1  0  0  0  0  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube12.ine b/demos/ppl_lcdd/examples/cube12.ine
new file mode 100644
index 0000000..4206e39
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube12.ine
@@ -0,0 +1,29 @@
+* 12-dim hypercube
+H-representation
+begin
+   24  13  integer
+  1  1  0  0  0  0  0  0  0  0  0  0  0
+  1  0  1  0  0  0  0  0  0  0  0  0  0
+  1  0  0  1  0  0  0  0  0  0  0  0  0
+  1  0  0  0  1  0  0  0  0  0  0  0  0
+  1  0  0  0  0  1  0  0  0  0  0  0  0
+  1  0  0  0  0  0  1  0  0  0  0  0  0
+  1  0  0  0  0  0  0  1  0  0  0  0  0
+  1  0  0  0  0  0  0  0  1  0  0  0  0
+  1  0  0  0  0  0  0  0  0  1  0  0  0
+  1  0  0  0  0  0  0  0  0  0  1  0  0
+  1  0  0  0  0  0  0  0  0  0  0  1  0
+  1  0  0  0  0  0  0  0  0  0  0  0  1
+  1 -1  0  0  0  0  0  0  0  0  0  0  0
+  1  0 -1  0  0  0  0  0  0  0  0  0  0
+  1  0  0 -1  0  0  0  0  0  0  0  0  0
+  1  0  0  0 -1  0  0  0  0  0  0  0  0
+  1  0  0  0  0 -1  0  0  0  0  0  0  0
+  1  0  0  0  0  0 -1  0  0  0  0  0  0
+  1  0  0  0  0  0  0 -1  0  0  0  0  0
+  1  0  0  0  0  0  0  0 -1  0  0  0  0
+  1  0  0  0  0  0  0  0  0 -1  0  0  0
+  1  0  0  0  0  0  0  0  0  0 -1  0  0
+  1  0  0  0  0  0  0  0  0  0  0 -1  0
+  1  0  0  0  0  0  0  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube3.ine b/demos/ppl_lcdd/examples/cube3.ine
new file mode 100644
index 0000000..601dd13
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube3.ine
@@ -0,0 +1,11 @@
+* Hypercube of dimension 3
+H-representation
+begin
+    6    4    integer
+ 1  1  0  0
+ 1  0  1  0
+ 1  0  0  1
+ 1 -1  0  0
+ 1  0 -1  0
+ 1  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube6.ine b/demos/ppl_lcdd/examples/cube6.ine
new file mode 100644
index 0000000..98b2553
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube6.ine
@@ -0,0 +1,17 @@
+* 6-dim hypercube
+H-representation
+begin
+    12    7    integer
+ 1  1  0  0  0  0  0
+ 1  0  1  0  0  0  0
+ 1  0  0  1  0  0  0
+ 1  0  0  0  1  0  0
+ 1  0  0  0  0  1  0
+ 1  0  0  0  0  0  1
+ 1 -1  0  0  0  0  0
+ 1  0 -1  0  0  0  0
+ 1  0  0 -1  0  0  0
+ 1  0  0  0 -1  0  0
+ 1  0  0  0  0 -1  0
+ 1  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cube8.ine b/demos/ppl_lcdd/examples/cube8.ine
new file mode 100644
index 0000000..2028c83
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cube8.ine
@@ -0,0 +1,21 @@
+* 8-dim hypercube
+H-representation
+begin
+   16  9  integer
+  1  1  0  0  0  0  0  0  0
+  1  0  1  0  0  0  0  0  0
+  1  0  0  1  0  0  0  0  0
+  1  0  0  0  1  0  0  0  0
+  1  0  0  0  0  1  0  0  0
+  1  0  0  0  0  0  1  0  0
+  1  0  0  0  0  0  0  1  0
+  1  0  0  0  0  0  0  0  1
+  1 -1  0  0  0  0  0  0  0
+  1  0 -1  0  0  0  0  0  0
+  1  0  0 -1  0  0  0  0  0
+  1  0  0  0 -1  0  0  0  0
+  1  0  0  0  0 -1  0  0  0
+  1  0  0  0  0  0 -1  0  0
+  1  0  0  0  0  0  0 -1  0
+  1  0  0  0  0  0  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/cubetop.ine b/demos/ppl_lcdd/examples/cubetop.ine
new file mode 100644
index 0000000..bc0b835
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cubetop.ine
@@ -0,0 +1,12 @@
+* top facet of cube
+linearity 1 3
+H-representation
+begin
+6  4 integer
+ 1 -1  0  0
+ 1  0 -1  0
+ 1  0  0 -1
+ 0  1  0  0
+ 0  0  1  0
+ 0  0  0  1
+end
diff --git a/demos/ppl_lcdd/examples/cubocta.ine b/demos/ppl_lcdd/examples/cubocta.ine
new file mode 100644
index 0000000..d467383
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cubocta.ine
@@ -0,0 +1,19 @@
+* Cuboctahedron
+H-representation
+begin
+  14    4   integer
+   1  1  0  0
+   1  0  1  0
+   1  0  0  1
+   1 -1  0  0
+   1  0 -1  0
+   1  0  0 -1
+   2  1  1  1
+   2 -1  1  1
+   2  1 -1  1
+   2  1  1 -1
+   2 -1 -1  1
+   2  1 -1 -1
+   2 -1  1 -1
+   2 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/cut16_11.ext b/demos/ppl_lcdd/examples/cut16_11.ext
new file mode 100644
index 0000000..c7370ff
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cut16_11.ext
@@ -0,0 +1,21 @@
+* 5 point cut polytope
+V-representation
+begin
+16 11 integer
+1 1 1 -1 -1 -1 1 1 1 1 -1
+1 -1 -1 -1 1 -1 -1 1 -1 1 1
+1 -1 -1 1 -1 -1 1 -1 1 -1 1
+1 -1 1 -1 -1 1 -1 -1 1 1 -1
+1 1 -1 -1 -1 1 1 1 -1 -1 -1
+1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1 1 1 1 1 -1 -1 -1 -1 -1 -1
+1 -1 1 1 1 1 1 1 -1 -1 -1
+1 1 -1 1 1 1 -1 -1 1 1 -1
+1 1 1 -1 1 -1 1 -1 1 -1 1
+1 1 1 1 -1 -1 -1 1 -1 1 1
+1 -1 -1 1 1 -1 1 1 1 1 -1
+1 -1 1 -1 1 1 -1 1 1 -1 1
+1 -1 1 1 -1 1 1 -1 -1 1 1
+1 1 -1 -1 1 1 1 -1 -1 1 1
+1 1 -1 1 -1 1 -1 1 1 -1 1
+end
diff --git a/demos/ppl_lcdd/examples/cut32_16.ext b/demos/ppl_lcdd/examples/cut32_16.ext
new file mode 100644
index 0000000..5d68397
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cut32_16.ext
@@ -0,0 +1,37 @@
+* 6 point cut polytope
+V-representation
+begin
+  32  16   integer
+1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+1  1  1  1  1  1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1
+1  -1  1  1  1  1  1  1  1  1  -1  -1  -1  -1  -1  -1
+1  1  -1  1  1  1  1  -1  -1  -1  1  1  1  -1  -1  -1
+1  1  1  -1  1  1  -1  1  -1  -1  1  -1  -1  1  1  -1
+1  1  1  1  -1  1  -1  -1  1  -1  -1  1  -1  1  -1  1
+1  1  1  1  1  -1  -1  -1  -1  1  -1  -1  1  -1  1  1
+1  -1  -1  1  1  1  -1  1  1  1  1  1  1  -1  -1  -1
+1  -1  1  -1  1  1  1  -1  1  1  1  -1  -1  1  1  -1
+1  -1  1  1  -1  1  1  1  -1  1  -1  1  -1  1  -1  1
+1  -1  1  1  1  -1  1  1  1  -1  -1  -1  1  -1  1  1
+1  1  -1  -1  1  1  1  1  -1  -1  -1  1  1  1  1  -1
+1  1  -1  1  -1  1  1  -1  1  -1  1  -1  1  1  -1  1
+1  1  -1  1  1  -1  1  -1  -1  1  1  1  -1  -1  1  1
+1  1  1  -1  -1  1  -1  1  1  -1  1  1  -1  -1  1  1
+1  1  1  -1  1  -1  -1  1  -1  1  1  -1  1  1  -1  1
+1  1  1  1  -1  -1  -1  -1  1  1  -1  1  1  1  1  -1
+1  -1  -1  -1  1  1  -1  -1  1  1  -1  1  1  1  1  -1
+1  -1  -1  1  -1  1  -1  1  -1  1  1  -1  1  1  -1  1
+1  -1  -1  1  1  -1  -1  1  1  -1  1  1  -1  -1  1  1
+1  -1  1  -1  -1  1  1  -1  -1  1  1  1  -1  -1  1  1
+1  -1  1  -1  1  -1  1  -1  1  -1  1  -1  1  1  -1  1
+1  -1  1  1  -1  -1  1  1  -1  -1  -1  1  1  1  1  -1
+1  1  -1  -1  -1  1  1  1  1  -1  -1  -1  1  -1  1  1
+1  1  -1  -1  1  -1  1  1  -1  1  -1  1  -1  1  -1  1
+1  1  -1  1  -1  -1  1  -1  1  1  1  -1  -1  1  1  -1
+1  1  1  -1  -1  -1  -1  1  1  1  1  1  1  -1  -1  -1
+1  -1  -1  -1  -1  1  -1  -1  -1  1  -1  -1  1  -1  1  1
+1  -1  -1  -1  1  -1  -1  -1  1  -1  -1  1  -1  1  -1  1
+1  -1  -1  1  -1  -1  -1  1  -1  -1  1  -1  -1  1  1  -1
+1  -1  1  -1  -1  -1  1  -1  -1  -1  1  1  1  -1  -1  -1
+1  1  -1  -1  -1  -1  1  1  1  1  -1  -1  -1  -1  -1  -1
+end
diff --git a/demos/ppl_lcdd/examples/cyc.ine b/demos/ppl_lcdd/examples/cyc.ine
new file mode 100644
index 0000000..9eeadd9
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyc.ine
@@ -0,0 +1,10 @@
+* cyclic polytope: 5 vertices in R^3
+V-representation
+begin
+5 4 integer
+1 1 1 1
+1 2 4 8
+1 3 9 27
+1 4 16 64
+1 5 25 125
+end
diff --git a/demos/ppl_lcdd/examples/cyclic10-4.ext b/demos/ppl_lcdd/examples/cyclic10-4.ext
new file mode 100644
index 0000000..84629a5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic10-4.ext
@@ -0,0 +1,16 @@
+* 3-dim cyclic polytope with 10 vertices
+* Number of facets (outputs) =16
+V-representation
+begin
+10  4  integer
+  1  1  1  1
+  1  2  4  8
+  1  3  9  27
+  1  4  16  64
+  1  5  25  125
+  1  6  36  216
+  1  7  49  343
+  1  8  64  512
+  1  9  81  729
+  1  10  100  1000
+end
diff --git a/demos/ppl_lcdd/examples/cyclic12-6.ext b/demos/ppl_lcdd/examples/cyclic12-6.ext
new file mode 100644
index 0000000..4dfa2f6
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic12-6.ext
@@ -0,0 +1,18 @@
+* 5-dim cyclic polytope with12 vertices
+* Number of facets (outputs) =72
+V-representation
+begin
+12  6  integer
+  1  1  1  1  1  1
+  1  2  4  8  16  32
+  1  3  9  27  81  243
+  1  4  16  64  256  1024
+  1  5  25  125  625  3125
+  1  6  36  216  1296  7776
+  1  7  49  343  2401  16807
+  1  8  64  512  4096  32768
+  1  9  81  729  6561  59049
+  1  10  100  1000  10000  100000
+  1  11  121  1331  14641  161051
+  1  12  144  1728  20736  248832
+end
diff --git a/demos/ppl_lcdd/examples/cyclic14-8.ext b/demos/ppl_lcdd/examples/cyclic14-8.ext
new file mode 100644
index 0000000..df59976
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic14-8.ext
@@ -0,0 +1,20 @@
+* 7-dim cyclic polytope with 14 vertices
+* Number of facets (outputs) =240
+V-representation
+begin
+14  8  integer
+  1  1  1  1  1  1  1  1
+  1  2  4  8  16  32  64  128
+  1  3  9  27  81  243  729  2187
+  1  4  16  64  256  1024  4096  16384
+  1  5  25  125  625  3125  15625  78125
+  1  6  36  216  1296  7776  46656  279936
+  1  7  49  343  2401  16807  117649  823543
+  1  8  64  512  4096  32768  262144  2097152
+  1  9  81  729  6561  59049  531441  4782969
+  1  10  100  1000  10000  100000  1000000  10000000
+  1  11  121  1331  14641  161051  1771561  19487171
+  1  12  144  1728  20736  248832  2985984  35831808
+  1  13  169  2197  28561  371293  4826809  62748517
+  1  14  196  2744  38416  537824  7529536  105413504
+end
diff --git a/demos/ppl_lcdd/examples/cyclic16-10.ext b/demos/ppl_lcdd/examples/cyclic16-10.ext
new file mode 100644
index 0000000..c7d90da
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic16-10.ext
@@ -0,0 +1,23 @@
+* 9-dim cyclic polytope with 16 vertices
+* Number of facets (outputs) =660
+* This must be computed with exact arithmetic
+V-representation
+begin
+16  10  integer
+  1  1  1  1  1  1  1  1  1  1
+  1  2  4  8  16  32  64  128  256  512
+  1  3  9  27  81  243  729  2187  6561  19683
+  1  4  16  64  256  1024  4096  16384  65536  262144
+  1  5  25  125  625  3125  15625  78125  390625  1953125
+  1  6  36  216  1296  7776  46656  279936  1679616  10077696
+  1  7  49  343  2401  16807  117649  823543  5764801  40353607
+  1  8  64  512  4096  32768  262144  2097152  16777216  134217728
+  1  9  81  729  6561  59049  531441  4782969  43046721  387420489
+  1  10  100  1000  10000  100000  1000000  10000000  100000000  1000000000
+  1  11  121  1331  14641  161051  1771561  19487171  214358881  2357947691
+  1  12  144  1728  20736  248832  2985984  35831808  429981696  5159780352
+  1  13  169  2197  28561  371293  4826809  62748517  815730721  10604499373
+  1  14  196  2744  38416  537824  7529536  105413504  1475789056 20661046784
+  1  15  225  3375  50625  759375  11390625  170859375  2562890625 38443359375
+  1  16  256  4096  65536  1048576  16777216  268435456  4294967296 68719476736
+end
diff --git a/demos/ppl_lcdd/examples/cyclic17_8.ine b/demos/ppl_lcdd/examples/cyclic17_8.ine
new file mode 100644
index 0000000..af885fc
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic17_8.ine
@@ -0,0 +1,20 @@
+begin
+17 9 integer
+1   -72   516   -4608   36156   -294912   2349516   -18874368   150850236
+1   -63   381   -3087   20901   -151263   1049061   -7411887   51738501
+1   -54   264   -1944   10956   -69984   410124   -2519424   14971836
+1   -45   165   -1125   4917   -28125   130845   -703125   3370917
+1   -36   84   -576   1596   -9216   27084   -147456   445116
+1   -27   21   -243   21   -2187   -3219   -19683   -85659
+1   -18   -24   -72   -564   -288   -9204   -1152   -142404
+1   -9   -51   -9   -699   -9   -9771   -9   -144699
+1   0   -60   0   -708   0   -9780   0   -144708
+1   9   -51   9   -699   9   -9771   9   -144699
+1   18   -24   72   -564   288   -9204   1152   -142404
+1   27   21   243   21   2187   -3219   19683   -85659
+1   36   84   576   1596   9216   27084   147456   445116
+1   45   165   1125   4917   28125   130845   703125   3370917
+1   54   264   1944   10956   69984   410124   2519424   14971836
+1   63   381   3087   20901   151263   1049061   7411887   51738501
+1   72   516   4608   36156   294912   2349516   18874368   150850236
+end
diff --git a/demos/ppl_lcdd/examples/cyclic25_13.ext b/demos/ppl_lcdd/examples/cyclic25_13.ext
new file mode 100644
index 0000000..fdd1448
--- /dev/null
+++ b/demos/ppl_lcdd/examples/cyclic25_13.ext
@@ -0,0 +1,54 @@
+H-representation
+begin
+25 13 integer
+1   -156   1690   -22464   265018   -3234816   38683450   -465813504
+5585476858   -67077144576   804783054010   -9659108818944   115904429355898
+1   -143   1391   -17303   185783   -2093663   22895951   -253333223
+2782380263   -30653319983   337043838911   -3709051717943   40794692425943
+1   -130   1118   -13000   125450   -1300000   12865658   -130000000
+1295714810   -13000000000   129857319098   -1300000000000   12995123528570
+1   -117   871   -9477   80743   -767637   6774391   -62178597   555322183
+-5036466357   45185516311   -407953774917   3666707502823
+1   -104   650   -6656   48698   -425984   3273530   -27262976   213818618
+-1744830464   13815962810   -111669149696   888476726138
+1   -91   455   -4459   26663   -218491   1395095   -10706059   70657223
+-524596891   3529497335   -25705247659   175060262183
+1   -78   286   -2808   12298   -101088   472186   -3639168   17549818
+-131010048   643379386   -4716361728   23421698938
+1   -65   143   -1625   3575   -40625   68783   -1015625   792935   -25390625
+   -15727777   -634765625   -1702643305
+1   -52   26   -832   -1222   -13312   -81094   -212992   -3433222   -3407872
+   -129049414   -54525952   -4658367622
+1   -39   -65   -351   -3497   -3159   -124865   -28431   -4199897   -255879
+-141913265   -2302911   -4869562697
+1   -26   -130   -104   -4342   -416   -133510   -1664   -4281862   -6656
+-142667590   -26624   -4876418182
+1   -13   -169   -13   -4537   -13   -134329   -13   -4285177   -13
+-142680889   -13   -4876471417
+1   0   -182   0   -4550   0   -134342   0   -4285190   0   -142680902   0
+-4876471430
+1   13   -169   13   -4537   13   -134329   13   -4285177   13   -142680889
+13   -4876471417
+1   26   -130   104   -4342   416   -133510   1664   -4281862   6656
+-142667590   26624   -4876418182
+1   39   -65   351   -3497   3159   -124865   28431   -4199897   255879
+-141913265   2302911   -4869562697
+1   52   26   832   -1222   13312   -81094   212992   -3433222   3407872
+-129049414   54525952   -4658367622
+1   65   143   1625   3575   40625   68783   1015625   792935   25390625
+-15727777   634765625   -1702643305
+1   78   286   2808   12298   101088   472186   3639168   17549818   131010048
+   643379386   4716361728   23421698938
+1   91   455   4459   26663   218491   1395095   10706059   70657223
+524596891   3529497335   25705247659   175060262183
+1   104   650   6656   48698   425984   3273530   27262976   213818618
+1744830464   13815962810   111669149696   888476726138
+1   117   871   9477   80743   767637   6774391   62178597   555322183
+5036466357   45185516311   407953774917   3666707502823
+1   130   1118   13000   125450   1300000   12865658   130000000   1295714810
+   13000000000   129857319098   1300000000000   12995123528570
+1   143   1391   17303   185783   2093663   22895951   253333223   2782380263
+   30653319983   337043838911   3709051717943   40794692425943
+1   156   1690   22464   265018   3234816   38683450   465813504   5585476858
+   67077144576   804783054010   9659108818944   115904429355898
+end
diff --git a/demos/ppl_lcdd/examples/dcube10.ext b/demos/ppl_lcdd/examples/dcube10.ext
new file mode 100644
index 0000000..67db319
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube10.ext
@@ -0,0 +1,24 @@
+V-representation
+begin
+20 11 rational
+1 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 0 0 -1 0 0
+1 0 0 0 0 0 0 1 0 0 0
+1 0 0 0 0 0 0 -1 0 0 0
+1 0 0 0 0 0 1 0 0 0 0
+1 0 0 0 0 0 -1 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 -1 0 0 0 0 0 0
+1 0 0 1 0 0 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0 0 0
+1 0 1 0 0 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube12.ext b/demos/ppl_lcdd/examples/dcube12.ext
new file mode 100644
index 0000000..0e4b7f5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube12.ext
@@ -0,0 +1,28 @@
+V-representation
+begin
+24 13 rational
+1 0 0 0 0 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 0 0 0 0 -1 0 0
+1 0 0 0 0 0 0 0 0 1 0 0 0
+1 0 0 0 0 0 0 0 0 -1 0 0 0
+1 0 0 0 0 0 0 0 1 0 0 0 0
+1 0 0 0 0 0 0 0 -1 0 0 0 0
+1 0 0 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 0 0 1 0 0 0 0 0 0
+1 0 0 0 0 0 -1 0 0 0 0 0 0
+1 0 0 0 0 1 0 0 0 0 0 0 0
+1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 0 0 0 1 0 0 0 0 0 0 0 0
+1 0 0 0 -1 0 0 0 0 0 0 0 0
+1 0 0 1 0 0 0 0 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0 0 0 0 0
+1 0 1 0 0 0 0 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube3.ext b/demos/ppl_lcdd/examples/dcube3.ext
new file mode 100644
index 0000000..5702d28
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube3.ext
@@ -0,0 +1,10 @@
+V-representation
+begin
+6 4 rational
+1 0 0 1
+1 0 0 -1
+1 0 1 0
+1 0 -1 0
+1 1 0 0
+1 -1 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube6.ext b/demos/ppl_lcdd/examples/dcube6.ext
new file mode 100644
index 0000000..43861a0
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube6.ext
@@ -0,0 +1,16 @@
+V-representation
+begin
+12 7 rational
+1 0 0 0 0 0 1
+1 0 0 0 0 0 -1
+1 0 0 0 0 1 0
+1 0 0 0 0 -1 0
+1 0 0 0 1 0 0
+1 0 0 0 -1 0 0
+1 0 0 1 0 0 0
+1 0 0 -1 0 0 0
+1 0 1 0 0 0 0
+1 0 -1 0 0 0 0
+1 1 0 0 0 0 0
+1 -1 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/dcube8.ext b/demos/ppl_lcdd/examples/dcube8.ext
new file mode 100644
index 0000000..d151797
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dcube8.ext
@@ -0,0 +1,20 @@
+V-representation
+begin
+16 9 rational
+1 0 0 0 0 0 0 0 1
+1 0 0 0 0 0 0 0 -1
+1 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 -1 0
+1 0 0 0 0 0 1 0 0
+1 0 0 0 0 0 -1 0 0
+1 0 0 0 0 1 0 0 0
+1 0 0 0 0 -1 0 0 0
+1 0 0 0 1 0 0 0 0
+1 0 0 0 -1 0 0 0 0
+1 0 0 1 0 0 0 0 0
+1 0 0 -1 0 0 0 0 0
+1 0 1 0 0 0 0 0 0
+1 0 -1 0 0 0 0 0 0
+1 1 0 0 0 0 0 0 0
+1 -1 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/diamond.ine b/demos/ppl_lcdd/examples/diamond.ine
new file mode 100644
index 0000000..8522f1c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/diamond.ine
@@ -0,0 +1,10 @@
+* Unit diamond centred at origin
+* Last two inequalities define vertex (-1/2,0)
+begin
+4 3 rational
+1/2 -1 -1
+1/2 -1  1
+1/2  1 -1
+1/2  1  1
+end
+
diff --git a/demos/ppl_lcdd/examples/dodeca_m.ine b/demos/ppl_lcdd/examples/dodeca_m.ine
new file mode 100644
index 0000000..6599d78
--- /dev/null
+++ b/demos/ppl_lcdd/examples/dodeca_m.ine
@@ -0,0 +1,17 @@
+* dodecahedron inequalities
+H-representation
+begin
+12 4 integer
+562949953421312 -562949953421312 0 -347922205179541
+562949953421312 -562949953421312 0 347922205179541
+562949953421312 -347922205179541 -562949953421312 0
+562949953421312 -347922205179541 562949953421312 0
+562949953421312 0 -347922205179541 -562949953421312
+562949953421312 0 -347922205179541 562949953421312
+562949953421312 0 347922205179541 -562949953421312
+562949953421312 0 347922205179541 562949953421312
+562949953421312 347922205179541 -562949953421312 0
+562949953421312 347922205179541 562949953421312 0
+562949953421312 562949953421312 0 -347922205179541
+562949953421312 562949953421312 0 347922205179541
+end
diff --git a/demos/ppl_lcdd/examples/ex1.ine b/demos/ppl_lcdd/examples/ex1.ine
new file mode 100644
index 0000000..790b897
--- /dev/null
+++ b/demos/ppl_lcdd/examples/ex1.ine
@@ -0,0 +1,10 @@
+* 2 dimensional polyhedron with three vertices (0,3), (-1, 4) and (-1,10) and
+* two extremal rays (2,1) and (1,2).
+H-representation
+begin
+  4   3   integer
+ 12   2  -1
+ -6  -1   2
+ -3   1   1
+  1   1   0
+end
diff --git a/demos/ppl_lcdd/examples/grcubocta.ine b/demos/ppl_lcdd/examples/grcubocta.ine
new file mode 100644
index 0000000..9fd74c4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/grcubocta.ine
@@ -0,0 +1,31 @@
+* Great rhombicuboctahedron
+H-representation
+begin
+  26    4   integer
+   1  1  0  0
+   1  0  1  0
+   1  0  0  1
+   1 -1  0  0
+   1  0 -1  0
+   1  0  0 -1
+   2  1  1  1
+   2 -1  1  1
+   2  1 -1  1
+   2  1  1 -1
+   2 -1 -1  1
+   2  1 -1 -1
+   2 -1  1 -1
+   2 -1 -1 -1
+   5  3  3  0
+   5  0  3  3
+   5  3  0  3
+   5 -3  3  0
+   5  0 -3  3
+   5  3  0 -3
+   5  3 -3  0
+   5  0  3 -3
+   5 -3  0  3
+   5 -3 -3  0
+   5  0 -3 -3
+   5 -3  0 -3
+end
diff --git a/demos/ppl_lcdd/examples/hexocta.ine b/demos/ppl_lcdd/examples/hexocta.ine
new file mode 100644
index 0000000..57ffede
--- /dev/null
+++ b/demos/ppl_lcdd/examples/hexocta.ine
@@ -0,0 +1,54 @@
+* Hexakis octahedron
+H-representation
+begin
+ 48  4  integer
+  3 -3  1 -2
+  3 -2 -1 -3
+  3 -2  1 -3
+  3 -3 -1 -2
+  3 -2  3 -1
+  3 -2  3  1
+  3 -3  2 -1
+  3 -3  2  1
+  3  1 -3  2
+  3  1 -2  3
+  3 -1 -3  2
+  3 -1 -2  3
+  3  1  2  3
+  3  1  3  2
+  3 -1  2  3
+  3 -1  3  2
+  3  3  1 -2
+  3  2 -1 -3
+  3  3 -1 -2
+  3  2  1 -3
+  3  2  3 -1
+  3  3  2 -1
+  3  2  3  1
+  3  3  2  1
+  3  2  1  3
+  3  3 -1  2
+  3  2 -1  3
+  3  3  1  2
+  3  2 -3  1
+  3  2 -3 -1
+  3  3 -2  1
+  3  3 -2 -1
+  3 -1  3 -2
+  3 -1  2 -3
+  3  1  3 -2
+  3  1  2 -3
+  3 -1 -2 -3
+  3 -1 -3 -2
+  3  1 -2 -3
+  3  1 -3 -2
+  3 -3 -1  2
+  3 -2  1  3
+  3 -2 -1  3
+  3 -3  1  2
+  3 -2 -3  1
+  3 -2 -3 -1
+  3 -3 -2  1
+  3 -3 -2 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/icododeca_m.ine b/demos/ppl_lcdd/examples/icododeca_m.ine
new file mode 100644
index 0000000..3f095ec
--- /dev/null
+++ b/demos/ppl_lcdd/examples/icododeca_m.ine
@@ -0,0 +1,39 @@
+* Icosidodecahedron
+% rational numbers appearing here are [approximations of]
+% -3-5^(1/2), -1-5^(1/2) and their negatives.
+H-representation
+begin
+32 4 integer
+2251799813685248 -11790576896177794 -7286977268807297 0
+2251799813685248 -11790576896177794 7286977268807297 0
+2251799813685248 -7286977268807297 -7286977268807297 -7286977268807297
+2251799813685248 -7286977268807297 -7286977268807297 7286977268807297
+2251799813685248 -7286977268807297 0 -11790576896177794
+2251799813685248 -7286977268807297 0 11790576896177794
+2251799813685248 -7286977268807297 7286977268807297 -7286977268807297
+2251799813685248 -7286977268807297 7286977268807297 7286977268807297
+1125899906842624 -5895288448088897 0 -2251799813685248
+1125899906842624 -5895288448088897 0 2251799813685248
+1125899906842624 -2251799813685248 -5895288448088897 0
+1125899906842624 -2251799813685248 5895288448088897 0
+2251799813685248 0 -11790576896177794 -7286977268807297
+2251799813685248 0 -11790576896177794 7286977268807297
+1125899906842624 0 -2251799813685248 -5895288448088897
+1125899906842624 0 -2251799813685248 5895288448088897
+1125899906842624 0 2251799813685248 -5895288448088897
+1125899906842624 0 2251799813685248 5895288448088897
+2251799813685248 0 11790576896177794 -7286977268807297
+2251799813685248 0 11790576896177794 7286977268807297
+1125899906842624 2251799813685248 -5895288448088897 0
+1125899906842624 2251799813685248 5895288448088897 0
+1125899906842624 5895288448088897 0 -2251799813685248
+1125899906842624 5895288448088897 0 2251799813685248
+2251799813685248 7286977268807297 -7286977268807297 -7286977268807297
+2251799813685248 7286977268807297 -7286977268807297 7286977268807297
+2251799813685248 7286977268807297 0 -11790576896177794
+2251799813685248 7286977268807297 0 11790576896177794
+2251799813685248 7286977268807297 7286977268807297 -7286977268807297
+2251799813685248 7286977268807297 7286977268807297 7286977268807297
+2251799813685248 11790576896177794 -7286977268807297 0
+2251799813685248 11790576896177794 7286977268807297 0
+end
diff --git a/demos/ppl_lcdd/examples/in0.ine b/demos/ppl_lcdd/examples/in0.ine
new file mode 100644
index 0000000..8c3d751
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in0.ine
@@ -0,0 +1,11 @@
+begin
+8 6 integer
+9 -2 -3 -3 -2 -2
+9 -2 0 0 2 0
+9 -2 -1 -1 -1 -3
+0 1 0 0 0 0
+0 0 1 0 0 0
+0 0 0 1 0 0
+0 0 0 0 1 0
+0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in1.ine b/demos/ppl_lcdd/examples/in1.ine
new file mode 100644
index 0000000..e231e52
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in1.ine
@@ -0,0 +1,37 @@
+begin
+34 5 integer
+1 -299 -534 815 807
+1 -887 -399 -867 -543
+1 683 632 958 -181
+1 -756 681 -658 470
+1 -99 135 -921 -825
+1 -795 -874 -286 732
+1 43 -567 588 -143
+1 -955 414 -159 -378
+1 -235 -695 947 166
+1 957 853 -194 -258
+1 487 -914 -100 -991
+1 -515 -786 -169 200
+1 954 -758 -178 985
+1 505 -970 400 -211
+1 714 997 401 661
+1 -475 618 459 775
+1 -219 704 -111 -876
+1 152 -390 -629 984
+1 -240 -621 -62 583
+1 -76 531 -606 -676
+1 490 -519 -240 -109
+1 -635 860 -798 825
+1 5 49 781 895
+1 495 490 -774 866
+1 -78 69 853 861
+1 -340 228 -374 498
+1 390 -12 -524 -408
+1 -382 -42 -376 264
+1 -299 -731 -283 -518
+1 892 -581 654 -439
+0 1 0 0 0
+0 0 1 0 0
+0 0 0 1 0
+0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in2.ine b/demos/ppl_lcdd/examples/in2.ine
new file mode 100644
index 0000000..cb49112
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in2.ine
@@ -0,0 +1,19 @@
+begin
+16 6 integer
+1 -1 0 -1 0 0
+1 -1 0 0 0 -1
+1 0 -1 -1 0 0
+1 0 -1 0 -1 0
+1 0 0 0 -1 -1
+0 -1 1 0 0 1
+0 1 -1 0 1 0
+0 0 0 -1 1 1
+0 0 1 1 -1 0
+0 1 0 1 0 -1
+2 -1 -1 -1 -1 -1
+0 1 0 0 0 0
+0 0 1 0 0 0
+0 0 0 1 0 0
+0 0 0 0 1 0
+0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in3.ine b/demos/ppl_lcdd/examples/in3.ine
new file mode 100644
index 0000000..a5db732
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in3.ine
@@ -0,0 +1,16 @@
+begin
+13 7 integer
+0 1 -1 0 1 0 0
+0 0 -1 1 0 0 1
+0 -1 1 0 1 0 0
+0 -1 0 1 0 1 0
+0 0 1 -1 0 0 1
+0 1 1 0 -1 0 0
+0 0 0 0 -1 1 1
+0 1 0 1 0 -1 0
+0 0 0 0 1 -1 1
+0 0 1 1 0 0 -1
+0 0 0 0 1 1 -1
+0 1 0 -1 0 1 0
+12 -1 -1 -1 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/in4.ine b/demos/ppl_lcdd/examples/in4.ine
new file mode 100644
index 0000000..8c11b95
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in4.ine
@@ -0,0 +1,15 @@
+begin
+12 8 integer
+10 -8 -1 -2 -3 -3 -2 -2
+10 8 -2 -2 0 0 2 0
+10 -11 3 -2 -1 -1 -1 -3
+5 23 -4 -2 -3 0 0 1
+27 5 -4 -1 3 9 11 -12
+0 1 0 0 0 0 0 0
+0 0 1 0 0 0 0 0
+0 0 0 1 0 0 0 0
+0 0 0 0 1 0 0 0
+0 0 0 0 0 1 0 0
+0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in5.ine b/demos/ppl_lcdd/examples/in5.ine
new file mode 100644
index 0000000..e429d0b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in5.ine
@@ -0,0 +1,17 @@
+begin
+14 10 integer
+10 2 3 -8 -1 -2 -3 -3 -2 -2
+10 -6 33 8 -2 -2 0 0 2 0
+10 93 3 -11 3 -2 -1 -1 -1 -3
+5 -9 21 23 -4 -2 -3 0 0 1
+27 31 23 5 -4 -1 3 9 11 -12
+0 1 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in6.ine b/demos/ppl_lcdd/examples/in6.ine
new file mode 100644
index 0000000..faa493a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in6.ine
@@ -0,0 +1,26 @@
+begin
+23 11 integer
+1 1 1 1 1 1 1 1 1 1 0
+2 -2 -3 8 1 2 3 3 2 2 -9
+3 6 -3 -8 2 2 0 0 -2 0 -9
+4 -9 -3 1 -3 2 1 1 1 3 -9
+5 9 -2 -2 4 2 3 0 0 -1 -5
+6 -3 -2 -5 4 1 -3 -9 -1 2 -7
+7 -9 -3 -5 -2 2 4 -2 4 -1 -7
+8 -8 -4 5 -2 2 4 -2 4 -1 -7
+9 -7 -5 -5 -2 2 4 -2 4 -1 -7
+10 -6 -6 5 -2 2 4 -2 4 -1 -7
+11 -5 -7 -5 -2 2 4 -2 4 -1 -7
+12 -4 -8 5 -2 2 4 -2 4 -1 -7
+13 -3 -9 -5 -2 2 4 -2 4 -1 -7
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/in7.ine b/demos/ppl_lcdd/examples/in7.ine
new file mode 100644
index 0000000..5e82762
--- /dev/null
+++ b/demos/ppl_lcdd/examples/in7.ine
@@ -0,0 +1,23 @@
+begin
+20 11 integer
+10000 -915 -828 -303 -632 -786 -231 -12 -568 -351 -308
+10000 -930 -217 -480 -704 -700 -91 -441 -927 -33 -330
+10000 -765 -616 -962 -274 -276 -39 -924 -541 -444 -838
+10000 -747 -470 -506 -329 -481 -425 -679 -140 -764 -960
+10000 -243 -664 -760 -333 -456 -686 -717 -137 -721 -833
+10000 -682 -107 -380 -720 -382 -920 -164 -220 -640 -262
+10000 -145 -942 -873 -570 -973 -365 -685 -932 -424 -928
+10000 -183 -612 -402 -869 -681 -539 -941 -513 -290 -622
+10000 -669 -694 -353 -941 -209 -572 -580 -822 -964 -725
+10000 -188 -646 -87 -552 -330 -19 -976 -609 -965 -158
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/infeas.ine b/demos/ppl_lcdd/examples/infeas.ine
new file mode 100644
index 0000000..0f2a496
--- /dev/null
+++ b/demos/ppl_lcdd/examples/infeas.ine
@@ -0,0 +1,18 @@
+* The empty polytope. No vertices and rays.
+H-representation
+begin
+   13   7   integer
+ 0  1  0  0  0  0  0
+ 0  0  1  0  0  0  0
+ 0  0  0  1  0  0  0
+ 0  0  0  0  1  0  0
+ 0  0  0  0  0  1  0
+ 0  0  0  0  0  0  1
+ 1 -1  0  0  0  0  0
+ 1  0 -1  0  0  0  0
+ 1  0  0 -1  0  0  0
+ 1  0  0  0 -1  0  0
+ 1  0  0  0  0 -1  0
+ 1  0  0  0  0  0  -1
+ -2 1  0  0  0  0   0
+end
diff --git a/demos/ppl_lcdd/examples/integralpoints.ine b/demos/ppl_lcdd/examples/integralpoints.ine
new file mode 100644
index 0000000..8f75e27
--- /dev/null
+++ b/demos/ppl_lcdd/examples/integralpoints.ine
@@ -0,0 +1,36 @@
+* This input file is an example for generating
+* integral solutions to the following system of linear inequalities:
+* 10 x1 + 7 x2  <= 70
+* 11 x1 + 5 x2  >= 55
+*    x1 >= 0,  x2 >= 0
+* By using the fact that  0<=x1<=7 and 0<=x2<=10, we apply
+* the (binary representation) substitution:
+    x1 =         4 x13 + 2 x12 + x11  (all binary variables)
+    x2 = 8 x24 + 4 x23 + 2 x22 + x21  (all binary variables)
+* The reduced system of linear inequalities is the input data.
+* Since all integral (i.e. 0-1) solutions are extreme points,
+* the integral extreme points are in one-to-one correspondence
+* with the integral solutions to the original system.  In this
+* example, there are 194 extreme points among which 10 are
+* integral (0-1) solutions.
+
+H-representation
+begin
+ 16  8   integer
+ 0  1  0  0  0  0  0  0
+ 0  0  1  0  0  0  0  0
+ 0  0  0  1  0  0  0  0
+ 0  0  0  0  1  0  0  0
+ 0  0  0  0  0  1  0  0
+ 0  0  0  0  0  0  1  0
+ 0  0  0  0  0  0  0  1
+ 1 -1  0  0  0  0  0  0
+ 1  0 -1  0  0  0  0  0
+ 1  0  0 -1  0  0  0  0
+ 1  0  0  0 -1  0  0  0
+ 1  0  0  0  0 -1  0  0
+ 1  0  0  0  0  0 -1  0
+ 1  0  0  0  0  0  0 -1
+  70 -40 -20 -10 -56 -28 -14 -7
+ -55  44  22  11  40  20  10  5
+end
diff --git a/demos/ppl_lcdd/examples/irbox20-4.ext b/demos/ppl_lcdd/examples/irbox20-4.ext
new file mode 100644
index 0000000..8fba299
--- /dev/null
+++ b/demos/ppl_lcdd/examples/irbox20-4.ext
@@ -0,0 +1,25 @@
+* Randomly generated 20 integral points in [-100..100]^3
+V-representation
+begin
+  20   4   integer
+  1    -45      1     47
+  1    -34     19      4
+  1      5    -11     28
+  1     17    -43     17
+  1    -46      8    -15
+  1     35    -26     -6
+  1     41     -3     -8
+  1    -39     41     34
+  1    -46     49     40
+  1    -18    -29     46
+  1    -20    -25     -2
+  1    -22     -9    -32
+  1     31     46      5
+  1     10     14     11
+  1    -22     17    -29
+  1     12      3     -5
+  1    -44     -5     40
+  1     -2      4     32
+  1    -18      8     31
+  1    -27     40    -48
+end
diff --git a/demos/ppl_lcdd/examples/irbox200-4.ext b/demos/ppl_lcdd/examples/irbox200-4.ext
new file mode 100644
index 0000000..d218b33
--- /dev/null
+++ b/demos/ppl_lcdd/examples/irbox200-4.ext
@@ -0,0 +1,205 @@
+* Randomly generated 200 integral points in [-100..100]^3
+V-representation
+begin
+  200   4   integer
+  1     12    -49      2
+  1    -38     25     -3
+  1    -26     39     -7
+  1    -25     28     44
+  1    -20    -41    -31
+  1     49     45     28
+  1    -42     12    -25
+  1     -9    -31    -20
+  1     49      5     33
+  1     15     34     30
+  1    -18     -3     31
+  1     34      8      6
+  1    -19     31     -4
+  1     23    -44    -25
+  1     17    -14    -16
+  1     36    -14    -20
+  1     15     -7     42
+  1     39     33    -39
+  1    -30     33     15
+  1    -46     -1      0
+  1     33     30     47
+  1     14     14      5
+  1    -28     45    -13
+  1     17     18     -7
+  1     41    -13     27
+  1    -24    -27    -36
+  1      5     37      5
+  1     -2     27    -11
+  1      7     47    -28
+  1    -26    -49     20
+  1     24     34      0
+  1     21      0    -35
+  1    -23     20    -39
+  1     13    -12     28
+  1    -44    -20    -35
+  1     33      4    -12
+  1     46    -39    -25
+  1      2      7    -47
+  1     41    -34     49
+  1    -36    -11    -49
+  1     33    -37     34
+  1    -16     34    -15
+  1     -1    -39    -45
+  1      8     23     -8
+  1    -12     29     21
+  1      2     13    -23
+  1     39     10    -13
+  1    -36    -37     43
+  1    -34    -46    -41
+  1    -34    -32     -2
+  1    -33    -49     10
+  1    -48    -15     -5
+  1    -14     33      4
+  1    -10     -7    -21
+  1     31     29    -42
+  1      2    -18     21
+  1     29    -29    -18
+  1    -34    -15     -6
+  1    -41      0     -2
+  1    -32     16     14
+  1     14     32     15
+  1    -25     33    -49
+  1     19    -31     33
+  1    -26      8    -24
+  1      2    -10    -44
+  1      9     42    -12
+  1    -19     21      8
+  1     12     37     43
+  1    -44     45     -6
+  1      3    -36    -40
+  1    -31     27     42
+  1     33    -47     25
+  1     33     21     43
+  1     17     45      1
+  1     43     -2     41
+  1     49    -42     34
+  1    -13    -11      5
+  1     45    -49     -7
+  1     38    -43    -11
+  1    -18     10      2
+  1     -8     28    -19
+  1    -16     12    -17
+  1    -40     -4    -45
+  1    -46    -36    -49
+  1      5    -43     -2
+  1     -3    -44      5
+  1    -18     -7     43
+  1     36    -12     44
+  1    -20    -24    -49
+  1     18      7     10
+  1    -29     48    -10
+  1      0    -17    -48
+  1     33     -8     -2
+  1     37     -4     10
+  1     38    -49     17
+  1    -14     -2     22
+  1     41     28    -35
+  1     35     15      2
+  1     29     44     27
+  1     30     13    -15
+  1     -8     33    -16
+  1     30    -16     15
+  1     31    -32    -42
+  1    -20    -44      3
+  1     39     43      3
+  1      6    -20    -49
+  1    -20    -29     29
+  1     -5    -44     -5
+  1     46     34    -11
+  1     24     15    -48
+  1    -41    -43     35
+  1     -8     37    -30
+  1    -42     19    -13
+  1    -34     48     -8
+  1     18     37    -15
+  1    -27     -5     13
+  1    -27     23     33
+  1    -48    -32     39
+  1     -3    -35     23
+  1     34     38    -10
+  1     36     47     -4
+  1     22    -11    -17
+  1     41     -3    -47
+  1    -22     12    -49
+  1     18    -18     37
+  1    -46      3    -17
+  1     17     26    -44
+  1      1     28    -26
+  1     -9    -25    -11
+  1    -35    -40    -23
+  1      3     46    -26
+  1     49     18     12
+  1    -18      9    -40
+  1    -16     37     21
+  1    -15      5    -46
+  1    -27      9      6
+  1      4    -23    -16
+  1     10     27    -38
+  1     34    -31    -14
+  1    -27    -17     -4
+  1     -1     35     -8
+  1     22     34    -40
+  1    -15    -33     19
+  1     -5      0      6
+  1    -33     34    -37
+  1    -30    -43     21
+  1     26     11     48
+  1    -40    -28     26
+  1    -29    -43     44
+  1      6    -21    -23
+  1    -48     27    -38
+  1     -7      0     46
+  1      2     34    -36
+  1    -28    -21     13
+  1     27     -5     -1
+  1     39     14      5
+  1     11     -9    -33
+  1      9      0    -11
+  1    -14     20     -5
+  1    -20    -22     23
+  1      6    -21      0
+  1     18     21     49
+  1     14    -25     34
+  1     27     -4    -37
+  1     -8    -26      7
+  1     39    -36    -27
+  1     -4     24     13
+  1     11    -15    -36
+  1    -49     20     33
+  1     -4     49    -38
+  1    -31      6    -10
+  1     18    -25    -38
+  1     18     39    -13
+  1      2     17     32
+  1     14    -41    -44
+  1    -27     48    -31
+  1     -5     -6     43
+  1    -42    -44    -22
+  1    -29    -44     48
+  1    -45      1     47
+  1    -34     19      4
+  1      5    -11     28
+  1     17    -43     17
+  1    -46      8    -15
+  1     35    -26     -6
+  1     41     -3     -8
+  1    -39     41     34
+  1    -46     49     40
+  1    -18    -29     46
+  1    -20    -25     -2
+  1    -22     -9    -32
+  1     31     46      5
+  1     10     14     11
+  1    -22     17    -29
+  1     12      3     -5
+  1    -44     -5     40
+  1     -2      4     32
+  1    -18      8     31
+  1    -27     40    -48
+  1    -31    -29    -23
+end
diff --git a/demos/ppl_lcdd/examples/kkd18_4.ine b/demos/ppl_lcdd/examples/kkd18_4.ine
new file mode 100644
index 0000000..ad6b26b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd18_4.ine
@@ -0,0 +1,25 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+18   5   integer
+3976210973720   -5964591245895   -33802508475500   -161110322828670
+-745886931169976
+5   -10   -50   -220   -974
+5   -5   -35   -185   -899
+5   0   -10   -90   -574
+5   5   25   95   301
+5   10   70   400   2146
+5   15   125   855   5501
+5   20   190   1490   11026
+5   25   265   2335   19501
+5   30   350   3420   31826
+5   35   445   4775   49021
+5   40   550   6430   72226
+5   45   665   8415   102701
+5   50   790   10760   141826
+5   55   925   13495   191101
+5   60   1070   16650   252146
+5   65   1225   20255   326701
+-3976210973719   5964591245895   33802508475500   161110322828670
+745886931169976
+end
diff --git a/demos/ppl_lcdd/examples/kkd27_5.ine b/demos/ppl_lcdd/examples/kkd27_5.ine
new file mode 100644
index 0000000..7a8954c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd27_5.ine
@@ -0,0 +1,34 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+27 6 integer
+1172039901841798080   -1758060515119739835   -12306436783413558955
+-72080893223436992535   -406122552605284841587   -2275777153240670950215
+6   -15   -85   -435   -2269   -12195
+6   -9   -67   -393   -2179   -12009
+6   -3   -37   -279   -1789   -10743
+6   3   5   -57   -739   -6057
+6   9   59   309   1475   6549
+6   15   125   855   5501   34455
+6   21   203   1617   12131   88641
+6   27   293   2631   22301   184407
+6   33   395   3933   37091   342093
+6   39   509   5559   57725   587799
+6   45   635   7545   85571   954105
+6   51   773   9927   122141   1480791
+6   57   923   12741   169091   2215557
+6   63   1085   16023   228221   3214743
+6   69   1259   19809   301475   4544049
+6   75   1445   24135   390941   6279255
+6   81   1643   29037   498851   8506941
+6   87   1853   34551   627581   11325207
+6   93   2075   40713   779651   14844393
+6   99   2309   47559   957725   19187799
+6   105   2555   55125   1164611   24492405
+6   111   2813   63447   1403261   30909591
+6   117   3083   72561   1676771   38605857
+6   123   3365   82503   1988381   47763543
+6   129   3659   93309   2341475   58581549
+-1172039901841798079   1758060515119739835   12306436783413558955
+72080893223436992535   406122552605284841587   2275777153240670950215
+end
diff --git a/demos/ppl_lcdd/examples/kkd38_6.ine b/demos/ppl_lcdd/examples/kkd38_6.ine
new file mode 100644
index 0000000..4ea9b0b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kkd38_6.ine
@@ -0,0 +1,49 @@
+* This must be computed with rational arithmetic.
+H-representation
+begin
+38 7 integer
+2919394390774395218459334   -4379091595292464054287507
+-36492430237104184038520181   -253987324572060483286422939
+-1691789494531258045567157717   -11149182918946980113429731347
+-73511950112254277868261780941
+7   -21   -133   -777   -4669   -29001   -184813
+7   -14   -112   -728   -4564   -28784   -184372
+7   -7   -77   -595   -4109   -27307   -179717
+7   0   -28   -336   -2884   -21840   -156148
+7   7   35   91   -301   -7133   -75445
+7   14   112   728   4396   25424   141772
+7   21   203   1617   12131   88641   638723
+7   28   308   2800   23996   200368   1650188
+7   35   427   4319   41251   384335   3535267
+7   42   560   6216   65324   670992   6815180
+7   49   707   8533   97811   1098349   12216107
+7   56   868   11312   140476   1712816   20717068
+7   63   1043   14595   195251   2570043   33602843
+7   70   1232   18424   264236   3735760   52521932
+7   77   1435   22841   349699   5286617   79549555
+7   84   1652   27888   454076   7311024   117255692
+7   91   1883   33607   579971   9909991   168778163
+7   98   2128   40040   730156   13197968   237900748
+7   105   2387   47229   907571   17303685   329136347
+7   112   2660   55216   1115324   22370992   447815180
+7   119   2947   64043   1356691   28559699   600178027
+7   126   3248   73752   1635116   36046416   793474508
+7   133   3563   84385   1954211   45025393   1036066403
+7   140   3892   95984   2317756   55709360   1337536012
+7   147   4235   108591   2729699   68330367   1708799555
+7   154   4592   122248   3194156   83140624   2162225612
+7   161   4963   136997   3715411   100413341   2711758603
+7   168   5348   152880   4297916   120443568   3373047308
+7   175   5747   169939   4946291   143549035   4163578427
+7   182   6160   188216   5665324   170070992   5102815180
+7   189   6587   207753   6459971   200375049   6212340947
+7   196   7028   228592   7335356   234852016   7516007948
+7   203   7483   250775   8296771   273918743   9040090963
+7   210   7952   274344   9349676   318018960   10813446092
+7   217   8435   299341   10499699   367624117   12867674555
+7   224   8932   325808   11752636   423234224   15237291532
+-2919394390774395218459333   4379091595292464054287507
+36492430237104184038520181   253987324572060483286422939
+1691789494531258045567157717   11149182918946980113429731347
+73511950112254277868261780941
+end
diff --git a/demos/ppl_lcdd/examples/kq20_11_m.ine b/demos/ppl_lcdd/examples/kq20_11_m.ine
new file mode 100644
index 0000000..19a589d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/kq20_11_m.ine
@@ -0,0 +1,24 @@
+H-representation
+begin
+20 11 integer
+10000 -915 -828 -303 -632 -786 -231 -12 -568 -351 -308
+10000 -930 -217 -480 -704 -700 -91 -441 -927 -33 -330
+10000 -765 -616 -962 -274 -276 -39 -924 -541 -444 -838
+10000 -747 -470 -506 -329 -481 -425 -679 -140 -764 -960
+10000 -243 -664 -760 -333 -456 -686 -717 -137 -721 -833
+10000 -682 -107 -380 -720 -382 -920 -164 -220 -640 -262
+10000 -145 -942 -873 -570 -973 -365 -685 -932 -424 -928
+10000 -183 -612 -402 -869 -681 -539 -941 -513 -290 -622
+10000 -669 -694 -353 -941 -209 -572 -580 -822 -964 -725
+10000 -188 -646 -87 -552 -330 -19 -976 -609 -965 -158
+0 1 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/metric40_11.ine b/demos/ppl_lcdd/examples/metric40_11.ine
new file mode 100644
index 0000000..2fec9a5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/metric40_11.ine
@@ -0,0 +1,45 @@
+* metric polytope on 5 points
+H-representation
+begin
+40 11 integer
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 -1 0 1 0 1 0
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 -1 1 0 1 0 0
+2 -1 -1 0 0 -1 0 0 0 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 1 0 -1 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 1 1 -1
+0 0 1 -1 0 0 0 0 1 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 1 -1 0 0 1 0 0 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 1 1 0 0 -1
+0 1 0 -1 0 0 1 0 0 0 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 0 0 0 0 0 0 -1 -1 -1
+end
diff --git a/demos/ppl_lcdd/examples/metric80_16.ine b/demos/ppl_lcdd/examples/metric80_16.ine
new file mode 100644
index 0000000..065eae3
--- /dev/null
+++ b/demos/ppl_lcdd/examples/metric80_16.ine
@@ -0,0 +1,86 @@
+* metric polytope on 6 points
+H-representation
+linearity 3 1 2 3
+begin
+80 16 integer
+0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+6 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+6 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+6 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+6 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+6 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+6 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+6 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+6 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+6 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+6 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+6 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+6 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+6 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+6 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+6 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+6 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+6 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+6 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+6 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+6 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mit.ine b/demos/ppl_lcdd/examples/mit.ine
new file mode 100644
index 0000000..5d31d88
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit.ine
@@ -0,0 +1,732 @@
+begin
+729 9 integer
+72 0 0 -4 -4 -2 0 0 0
+216 -2 -2 -10 -12 -6 0 0 0
+192 -4 -2 -8 -8 -8 0 0 0
+288 -12 6 8 -16 -8 0 0 0
+96 -4 2 0 -4 -4 0 0 0
+144 -5 1 -4 -6 -6 0 0 0
+288 -8 -2 -10 -12 -12 0 0 0
+96 -4 2 -4 -2 -4 0 0 0
+240 -7 -1 -10 -8 -10 0 0 0
+288 -8 -2 -12 -8 -12 0 0 0
+288 -8 -2 -8 -16 -8 0 0 0
+96 -4 2 -8 0 0 0 0 0
+0 0 6 -8 4 8 0 0 0
+0 4 6 -8 0 8 0 0 0
+24 2 2 -4 -2 2 0 0 0
+864 -24 -6 -40 -16 -32 0 0 0
+24 0 0 -2 -2 2 0 0 0
+0 4 10 -16 0 24 0 0 0
+0 1 1 -4 0 12 0 0 0
+0 0 6 -16 8 40 0 0 0
+96 -4 2 -16 16 32 0 0 0
+288 -8 -2 -16 0 0 0 0 0
+96 -4 2 8 -8 8 0 0 0
+288 -8 -2 8 -24 24 0 0 0
+0 0 2 -8 8 24 0 0 0
+96 -1 -1 -4 -8 8 0 0 0
+576 -12 -6 -16 -40 16 0 0 0
+192 -4 -2 0 -16 16 0 0 0
+576 -8 -6 -24 -32 -16 0 0 0
+576 -12 -6 -20 -32 -16 0 0 0
+960 -16 -10 -40 -56 -16 0 0 0
+160 0 0 -7 -7 -6 -1 0 -1
+480 -4 -4 -21 -21 -18 -1 0 -3
+192 -4 -4 -12 -4 -8 4 2 -4
+640 -16 -8 -28 -28 -24 4 2 -4
+640 -8 -6 -28 -28 -24 0 0 -4
+192 -8 0 -8 -8 -8 4 2 0
+384 -12 -4 -16 -16 -16 4 2 0
+960 -20 -12 -42 -42 -36 4 2 -6
+240 -9 -1 -11 -9 -10 3 2 -1
+0 2 2 4 0 0 -4 -2 0
+640 -22 -4 -24 -28 -24 8 4 -4
+1920 -60 -20 -76 -84 -72 20 10 -12
+1920 -32 -22 -84 -84 -72 4 2 -12
+960 -28 -10 -44 -36 -40 8 4 -4
+1152 -36 -12 -52 -44 -48 12 6 -4
+720 -23 -7 -33 -27 -30 7 4 -3
+1920 -48 -24 -88 -72 -80 12 6 -8
+3456 -96 -40 -160 -128 -144 28 14 -16
+576 -15 -7 -26 -20 -24 4 2 -4
+384 -12 -4 -20 -12 -16 4 2 0
+336 -11 -3 -17 -11 -14 3 2 -1
+192 -8 0 -12 -4 -8 4 2 0
+0 0 0 -4 4 0 4 2 0
+0 0 2 -8 8 0 8 4 -2
+192 -12 12 -28 12 -8 20 10 -4
+192 -12 12 -20 4 -8 12 6 -2
+1920 -48 -24 -92 -60 -80 12 6 -4
+576 -15 -7 -28 -18 -24 4 2 -2
+1536 -42 -18 -76 -40 -64 12 6 -8
+384 -12 -4 -20 4 -16 4 2 -4
+1920 -60 -20 -102 18 -76 14 10 -18
+1920 -60 -20 -102 -46 -76 14 10 -2
+672 -22 -6 -37 -17 -26 5 4 -1
+640 -22 -4 -36 -16 -24 4 4 0
+960 -40 0 -64 -16 -32 8 10 0
+64 -4 4 -8 0 0 0 2 0
+0 0 8 -6 2 4 -2 2 0
+0 8 18 -8 0 8 -8 2 0
+64 36 60 -28 -4 24 -28 6 -4
+192 28 36 -20 -12 8 -20 2 -4
+96 4 4 -5 -5 -2 -3 0 -1
+64 4 6 -4 -4 0 -4 0 0
+96 0 0 -5 -5 -2 -1 0 -1
+16 0 0 -1 -1 0 0 0 0
+192 -6 0 -8 12 -8 0 0 -4
+192 -6 0 -8 -4 -8 0 0 0
+960 -30 -8 -48 -20 -40 8 4 -4
+960 -32 -8 -52 -20 -40 12 6 -4
+960 -32 -8 -52 44 -40 12 6 -20
+960 -30 -8 -48 12 -40 8 4 -12
+576 -16 -6 -28 -12 -24 4 2 -4
+208 -8 0 -8 -8 -8 4 2 -2
+160 -7 1 -5 -7 -6 3 2 -1
+192 -12 12 0 -8 -8 8 6 0
+160 -9 7 -1 -7 -6 5 4 -1
+640 -20 -4 -20 -28 -24 4 2 -4
+96 -5 3 -2 -4 -4 2 2 0
+192 -6 0 -4 -8 -8 0 0 0
+480 -18 -2 -17 -21 -18 7 4 -3
+528 -19 -3 -20 -22 -20 8 4 -4
+960 -30 -4 -32 -36 -40 4 2 -4
+1152 -36 -4 -32 -40 -48 0 2 -8
+1152 -36 -12 -48 -40 -48 8 6 -8
+192 -8 0 -4 -4 -8 4 2 -4
+192 -6 0 0 -4 -8 0 0 -4
+384 -12 -4 -8 -8 -16 4 2 -8
+1920 -48 -24 -48 -40 -80 12 6 -40
+384 -16 2 -20 -12 -16 4 4 0
+576 -24 0 -32 -16 -24 8 6 0
+432 -17 -1 -23 -13 -18 5 4 -1
+576 -28 12 -36 -12 -24 12 10 -4
+960 -52 36 -92 12 -40 52 26 -12
+0 0 4 -14 10 4 6 6 -2
+2688 -72 -32 -120 -104 -112 16 10 -8
+0 0 8 -20 12 56 -12 2 -4
+64 -4 4 -16 8 24 -4 2 0
+192 -8 0 -16 0 0 0 2 0
+64 8 16 -20 -4 24 -12 2 -4
+0 2 4 -4 0 8 -4 0 0
+288 -13 3 -12 -10 -12 6 4 -2
+336 -14 2 -15 -11 -14 7 4 -3
+96 3 1 -8 -6 4 0 0 -2
+192 12 0 -20 -12 8 4 2 -4
+0 4 8 -6 2 4 -2 2 -2
+192 -12 12 -28 28 -8 20 10 -12
+0 0 0 -4 16 0 4 2 -6
+0 0 0 -4 40 0 4 2 -12
+192 -8 0 -12 44 -8 4 2 -12
+0 0 2 0 32 0 0 0 -8
+192 -12 12 -20 300 -8 12 6 -76
+960 -40 0 -64 208 -32 8 10 -56
+2112 -72 -16 -120 120 -80 16 14 -48
+512 -16 -4 -26 6 -20 2 2 -6
+512 -16 -4 -26 -10 -20 2 2 -2
+448 -16 0 -24 -8 -16 0 2 0
+448 24 8 -68 -20 56 12 6 -20
+192 8 2 -24 -8 16 4 2 -8
+192 16 0 -36 -4 24 12 6 -12
+448 -13 -5 -23 -13 -18 3 2 -1
+64 -2 0 -4 0 0 0 0 0
+0 2 -2 -4 4 0 4 2 -2
+0 0 0 -22 22 4 14 10 0
+0 0 0 -22 82 4 14 10 -30
+0 0 4 -14 34 4 6 6 -14
+480 -21 3 -20 -18 -20 8 6 -2
+480 -19 1 -16 -18 -20 4 4 -2
+1344 -52 0 -44 -52 -56 12 10 -4
+576 -22 0 -12 -24 -24 4 4 0
+768 -28 -4 -24 -32 -32 8 6 0
+768 -28 -4 40 -32 -32 -8 6 0
+576 -22 0 20 -24 -24 -4 4 0
+320 -12 0 10 -14 -12 -2 2 -2
+160 -7 1 3 -7 -6 1 2 -1
+0 2 2 -12 8 16 4 2 -4
+0 22 14 -52 16 80 12 6 -16
+192 32 16 -68 -4 88 12 6 -20
+128 18 10 -36 -8 48 4 2 -8
+64 8 8 -20 -4 24 -4 2 -4
+0 4 2 -4 4 8 0 0 -4
+0 4 8 -14 2 20 -4 2 -2
+0 1 7 -11 3 14 -3 2 -1
+0 0 8 -12 4 16 -4 2 0
+0 4 12 -20 4 32 -8 2 0
+0 0 24 -44 20 64 -16 6 0
+0 0 4 -10 6 12 -2 2 -2
+0 14 22 -44 8 64 -12 6 -8
+0 6 10 -18 2 28 -6 2 -2
+192 28 36 -52 -12 72 -36 2 -12
+96 3 3 -8 -6 4 -4 0 -2
+0 1 1 -2 0 4 0 0 0
+0 0 12 -10 6 12 -6 2 -2
+48 0 0 -3 -3 2 -1 0 -1
+192 16 24 -44 -12 72 -28 2 -12
+0 4 12 -14 2 20 -8 2 -2
+0 1 9 -11 3 14 -5 2 -1
+192 32 40 -68 -4 88 -36 6 -20
+16 1 1 -3 -1 6 -1 0 -1
+64 4 6 -12 -4 24 -8 0 -4
+0 4 12 -20 4 40 -12 2 -4
+0 0 10 -16 8 24 -8 2 0
+192 -12 12 -40 16 32 -8 6 0
+0 0 24 -34 14 44 -14 6 -2
+64 -4 4 -16 8 16 0 2 0
+0 0 8 -20 12 32 0 2 0
+0 0 4 -14 10 20 2 2 -2
+0 0 2 -2 2 4 -2 0 0
+0 0 24 -44 20 72 -20 6 -4
+0 0 24 -60 36 104 -4 6 -4
+0 6 10 -16 4 24 -8 2 -4
+0 1 1 -1 1 2 -1 0 -1
+0 6 18 -16 4 24 -12 2 -4
+384 0 -2 -20 -20 -8 0 0 -4
+384 -12 -4 -12 -20 -8 4 2 -4
+640 -16 -8 -20 -36 -8 4 2 -4
+960 -20 -12 -32 -56 -8 4 2 -4
+96 -1 -1 -4 -6 0 0 0 0
+1280 -6 -14 -60 -80 0 -4 2 0
+1024 -2 -10 -52 -64 0 -4 2 0
+1024 -12 -12 -48 -56 -16 0 2 -8
+384 8 -4 -24 -24 0 0 2 0
+256 4 -4 -16 -16 0 2 2 0
+1024 0 -16 -56 -56 -16 8 6 -8
+960 0 -16 -52 -52 -16 12 6 -8
+6400 -96 -72 -280 -280 -240 8 6 -40
+960 -16 -12 -42 -42 -36 2 2 -6
+3840 -48 -40 -168 -168 -144 0 2 -24
+4032 -72 -48 -178 -178 -148 10 6 -26
+1152 -20 -14 -52 -52 -40 4 2 -8
+0 2 -2 0 0 0 2 2 0
+192 -6 0 12 -8 -8 -4 0 0
+192 -4 -4 -8 -8 -8 4 2 0
+6912 -176 -88 -288 -288 -288 40 26 0
+1920 -48 -24 -80 -80 -80 10 6 0
+576 -12 -10 -24 -24 -24 6 4 0
+5760 -168 -64 -264 -216 -240 48 26 -24
+960 -48 24 -36 -36 -40 20 18 -4
+960 -44 12 -28 -36 -40 12 14 -4
+192 -12 12 4 -4 -8 4 6 -4
+960 -56 48 -20 -36 -40 28 26 -4
+640 -20 0 -4 -28 -24 -2 0 -4
+576 -24 0 -28 -12 -24 4 6 -4
+0 0 0 4 8 0 -2 0 -4
+192 -6 0 -4 12 -8 -4 0 -6
+960 -30 0 -32 -12 -40 -8 0 -6
+960 -32 0 -36 -20 -40 -4 2 -4
+640 -20 0 -28 -4 -24 -4 0 -2
+0 0 20 -4 12 8 -12 0 -2
+16 0 0 -1 -1 6 -1 0 -1
+720 -23 -3 -25 -27 -30 3 2 -3
+624 -21 -1 -27 -17 -26 1 2 -1
+768 -26 0 -32 -20 -32 0 2 0
+1536 -62 0 -80 -44 -64 16 14 0
+1344 -42 -12 -64 -44 -56 12 6 -4
+2880 -90 -28 -128 -108 -120 28 14 -12
+960 -30 0 -12 -32 -40 -6 0 -8
+768 -30 0 -24 -28 -32 6 6 -4
+576 -24 0 -20 -20 -24 8 6 -4
+576 -24 0 -15 -23 -22 9 6 -5
+192 -8 0 12 -4 -8 -4 2 -4
+0 0 2 -4 4 8 0 0 0
+0 0 0 -8 8 8 4 2 0
+192 -12 12 -76 76 88 20 10 -12
+0 0 6 -28 28 40 8 4 -6
+576 -15 -7 -29 -15 -22 3 2 -1
+448 -13 -5 -25 -7 -14 3 2 -1
+512 -14 -6 -26 -14 -20 4 2 -2
+448 -13 -5 -23 -5 -18 3 2 -3
+384 -6 -4 -16 -20 -8 0 0 -4
+0 6 8 -16 4 40 -4 0 -4
+0 8 8 -24 8 48 0 2 -8
+96 -1 -1 0 -6 36 -4 0 -6
+192 -4 -4 12 -12 72 -4 2 -12
+0 0 0 -6 6 4 2 2 0
+384 -12 -4 -22 -6 -12 2 2 0
+1216 -31 -15 -59 -37 -50 7 4 -3
+960 -20 -16 -42 -42 -36 10 6 -6
+2304 -72 -20 -112 -64 -96 16 10 -8
+1344 -42 -12 -64 -36 -56 8 6 -6
+1152 -36 -12 -56 -32 -48 8 6 -4
+384 -12 -4 -16 -8 -16 0 2 0
+192 -6 0 -4 0 -8 -4 0 0
+912 -26 -10 -43 -31 -38 5 4 -1
+960 -27 -11 -46 -32 -40 6 4 -2
+1344 -39 -15 -66 -44 -56 10 6 -4
+4224 -120 -48 -200 -152 -176 32 18 -16
+4992 -132 -60 -240 -168 -208 32 18 -16
+3456 -96 -40 -168 -104 -144 24 14 -16
+2688 -76 -28 -128 -72 -112 16 10 -16
+960 -29 -9 -46 -28 -40 6 4 -4
+0 2 -2 12 0 0 -4 2 0
+960 -20 -20 134 -42 -36 -38 10 -6
+1920 -60 -20 148 -84 -72 -36 10 -12
+1920 -68 -12 100 -84 -72 -20 14 -12
+320 -12 0 -6 -14 -12 2 2 -2
+960 -40 0 -26 -42 -36 18 10 -6
+576 -12 -8 -22 -30 -12 2 2 -6
+576 -12 -10 -8 -24 -24 -2 4 0
+2304 -56 -32 -80 -96 -96 8 10 0
+960 -20 -20 -38 -42 -36 20 10 -6
+192 -6 0 -4 -4 -8 -2 0 -2
+0 0 0 1 1 2 -1 0 -1
+192 -8 0 -4 28 -8 -4 2 -12
+192 -8 0 -4 60 -8 -4 2 -20
+0 0 2 -4 4 16 -4 0 0
+1792 -28 -20 -80 -88 -48 0 2 -16
+384 -3 -3 -18 -20 -8 -2 0 -4
+8064 -204 -100 -384 -264 -336 48 26 -24
+1920 -48 -24 -88 -56 -80 8 6 -8
+384 -12 -4 -16 8 -16 0 2 -8
+192 -12 12 -12 -4 -8 4 6 0
+192 -12 12 -12 12 -8 4 6 -8
+192 -12 12 4 60 -8 -12 6 -28
+0 0 0 -8 8 16 0 2 0
+192 -4 -2 -4 -4 -8 0 0 -4
+192 -4 -4 16 -12 0 -4 2 0
+768 -20 -12 40 -48 0 -8 6 0
+512 -14 -6 20 -32 0 -4 2 0
+64 -2 0 0 -4 0 0 0 0
+1344 -60 12 -68 -44 -56 20 18 -4
+2112 -92 12 -116 -60 -88 28 26 -4
+960 -44 12 -52 -28 -40 12 14 0
+1920 -48 -24 -72 -56 -80 8 6 -24
+96 -5 3 -4 -2 -4 0 2 0
+0 0 2 -8 24 0 8 4 -10
+0 4 4 -16 8 112 -16 2 -8
+384 -12 -4 -24 0 0 0 2 0
+0 2 -2 -4 16 0 4 2 -8
+64 -4 4 -20 20 24 4 2 -2
+128 -6 2 -20 16 16 4 2 -2
+192 -8 0 -20 12 8 4 2 0
+96 -4 0 -14 10 8 4 2 -2
+448 -20 4 -76 60 56 20 10 -12
+192 -4 -2 -4 -12 8 0 0 -4
+384 -12 -4 0 -24 16 4 2 -8
+192 -8 0 4 -12 8 4 2 -4
+192 12 20 -20 -12 8 -12 2 -4
+192 12 4 -20 -12 8 -4 2 -4
+192 76 20 -84 -12 72 -4 18 -12
+64 20 12 -28 -4 24 -4 6 -4
+64 20 44 -28 -4 24 -20 6 -4
+0 12 36 -22 2 20 -14 6 -2
+0 4 10 -8 0 8 -4 2 0
+0 4 6 -8 0 8 -2 2 0
+0 4 0 -6 2 4 2 2 -2
+0 0 4 -6 2 4 0 2 0
+192 4 2 -12 -12 0 -4 0 0
+0 8 8 -16 0 24 -4 2 0
+64 20 4 -28 -4 24 4 6 -4
+0 20 4 -24 0 24 4 6 0
+0 8 0 -8 0 8 4 2 0
+0 5 -1 -6 2 4 4 2 -2
+64 24 0 -28 -4 24 12 6 -4
+96 46 -10 -42 -6 36 18 14 -6
+32 18 -6 -14 -2 12 10 6 -2
+192 112 -40 -84 -12 72 76 38 -12
+0 6 -2 -4 0 4 4 2 0
+0 0 0 0 16 0 0 2 -8
+192 -12 12 4 28 -8 4 6 -20
+960 -40 0 38 -42 -36 2 10 -6
+960 -40 8 -20 -36 -40 4 10 -4
+192 -8 2 0 -8 -8 0 2 0
+384 -18 6 -4 -16 -16 4 6 0
+192 -8 0 8 -8 -8 0 2 0
+320 -20 20 10 -14 -12 14 10 -2
+576 -8 -6 -20 -36 24 -4 0 -12
+96 -1 -1 -4 -6 4 0 0 -2
+192 16 -8 -20 -12 8 12 6 -4
+960 12 -20 -60 -52 -8 20 10 -12
+576 -12 -8 -26 -26 -20 4 2 -4
+1920 -48 -24 -68 -100 -40 12 6 -20
+640 -16 -8 -32 -16 -24 4 2 0
+384 -12 -4 -24 0 -8 4 2 0
+192 -8 0 -36 44 24 12 6 -12
+192 -8 0 -36 76 24 12 6 -20
+128 -6 2 -20 40 16 4 2 -8
+64 -4 4 -20 60 24 4 2 -12
+0 0 2 -4 20 8 0 0 -4
+624 -21 -5 -34 -16 -24 4 4 0
+400 -12 -4 -20 -12 -16 2 2 0
+192 1 -1 -10 -12 0 -2 0 0
+640 -16 -8 -8 -40 48 0 2 -16
+1920 -48 -24 -24 -120 80 8 6 -40
+96 8 8 -22 -6 36 -10 2 -6
+0 8 8 -16 0 32 -8 2 0
+2112 -72 -16 -120 -40 -80 16 14 -8
+3456 -100 -36 -160 -120 -144 24 14 -16
+1152 -36 -12 -59 -27 -46 7 6 -3
+1920 -48 -24 -96 -32 -64 8 6 0
+640 -16 -8 -32 0 0 0 2 0
+240 -2 -2 -11 -15 10 -3 0 -5
+960 -20 -12 -32 -56 16 0 2 -16
+1920 -48 -24 216 -80 -80 -64 6 0
+384 -12 -4 32 -16 -16 -8 2 0
+320 -10 0 18 -14 -12 -6 0 -2
+192 -6 0 20 -4 -8 -8 0 -4
+320 -10 0 -14 18 -12 -2 0 -6
+32 -1 1 -4 6 20 -4 0 -2
+192 -8 0 -16 32 0 0 2 -8
+192 -8 0 -20 28 8 4 2 -4
+0 0 0 -8 28 8 4 2 -8
+0 0 0 -6 34 4 2 2 -10
+384 -12 -4 -22 2 -12 2 2 -2
+192 -12 12 28 -12 8 12 6 -4
+576 -24 0 -8 -24 -16 8 6 -8
+192 -8 0 -2 -10 -4 4 2 -2
+768 0 -8 -40 -40 -16 0 2 -8
+3840 0 -56 -200 -200 -80 24 18 -40
+384 0 -6 -20 -20 -8 4 2 -4
+768 -12 -10 -36 -36 -24 4 2 -6
+192 -8 0 -20 28 88 -12 2 -4
+64 -4 4 -20 52 200 -28 2 -12
+0 0 8 -24 72 336 -48 2 -24
+0 1 1 -2 4 40 -6 0 -4
+0 0 2 -4 12 48 -8 0 -4
+1792 -4 -20 -88 -112 0 -8 6 0
+768 4 -12 -40 -48 0 0 6 0
+192 0 -4 -10 -10 -4 2 2 -2
+96 -5 3 1 -5 -2 3 2 -1
+96 6 -2 -10 -6 4 2 2 -2
+528 9 -11 -35 -29 -2 9 6 -7
+480 38 -18 -50 -30 20 22 14 -10
+640 12 -12 -40 -40 0 8 6 0
+48 -3 3 -14 8 24 -4 2 0
+384 2 -6 -20 -24 144 4 2 -24
+192 -4 -2 -6 -10 -4 0 0 -2
+1344 -24 -16 -56 -72 -16 0 2 -16
+2880 -60 -36 -112 -152 -56 12 6 -28
+1344 -24 -16 -56 -72 -24 4 2 -12
+384 -6 -6 -12 -24 0 0 2 0
+64 -4 4 4 -4 0 4 2 0
+384 -12 -4 48 -8 -16 -16 2 -8
+192 -6 0 12 -4 -8 -6 0 -4
+576 -18 0 -23 -3 -22 -5 0 -3
+0 0 0 -22 194 4 14 10 -58
+64 -4 4 -8 96 0 0 2 -24
+0 0 10 -2 154 4 -6 0 -38
+384 -12 -4 16 -24 80 0 2 -16
+64 -2 0 8 -4 24 0 0 -4
+384 -12 -4 48 -24 144 0 2 -24
+192 -8 0 4 -12 0 4 2 0
+384 -12 -4 16 -24 16 0 2 -8
+0 0 6 1 9 2 -5 0 -3
+0 0 2 4 16 0 -4 0 -6
+1344 -56 8 -60 -44 -56 12 14 -4
+192 -4 -2 32 -4 -8 -12 0 -4
+1920 -48 -24 296 -40 -80 -104 6 -40
+192 -4 -2 24 -8 -8 -8 0 0
+960 -20 -10 114 -42 -36 -38 0 -6
+640 -16 -8 68 -28 -24 -20 2 -4
+0 10 2 -12 0 160 -20 2 0
+0 3 -1 -6 4 40 -2 2 -4
+0 8 -8 -24 24 80 8 10 -8
+0 116 -36 -80 0 80 64 38 0
+0 136 -56 -120 40 80 104 58 -40
+0 14 -6 -12 4 8 12 6 -4
+0 10 -6 -12 8 16 12 6 -8
+192 8 -8 -20 -4 88 12 6 -20
+960 0 -16 -52 -52 248 12 6 -52
+0 0 2 -4 20 80 -12 0 -4
+64 -2 0 -4 8 24 -4 0 0
+1920 -40 -20 -68 -84 -72 -2 0 -12
+576 -12 -6 -19 -23 -22 -1 0 -5
+1920 -48 -24 -72 -72 -80 4 6 -8
+192 -4 -4 4 -4 -8 -4 2 -4
+1920 -68 -12 -60 -84 -72 20 14 -12
+0 1 1 -2 4 24 -4 0 -4
+0 0 2 -4 12 32 -6 0 -4
+64 -4 4 -20 52 72 -12 2 -12
+192 -8 0 -20 28 24 -4 2 -4
+448 -16 0 -36 28 56 -12 2 -4
+288 -8 -4 -2 -18 12 2 2 -6
+192 -4 -4 12 -12 8 -4 2 -4
+192 -12 12 14 -10 -4 10 6 -2
+192 -8 0 36 -12 72 4 2 -12
+1344 -24 -16 -36 -84 120 -12 2 -36
+960 -20 -12 -20 -60 72 -4 2 -24
+640 -16 -8 -20 -36 0 4 2 -8
+576 -12 -8 -18 -34 -4 2 2 -2
+192 -4 -4 -4 -12 0 4 2 0
+192 -4 -4 -6 -10 -4 4 2 -2
+192 -4 -4 36 -4 -8 -12 2 -4
+192 -4 -4 28 -8 -8 -8 2 0
+192 -4 -4 4 -8 -8 -2 2 0
+960 -20 -20 22 -42 -36 -10 10 -6
+384 -12 -4 16 -8 -16 -8 2 -8
+576 -12 -6 0 -16 -24 -10 0 -8
+1920 -48 -24 -24 -56 -80 -16 6 -24
+1920 -48 -24 72 -40 -80 -48 6 -40
+192 -4 -2 8 -4 -8 -6 0 -4
+576 -12 -6 -15 -23 -22 -3 0 -5
+0 0 0 -8 24 80 -8 2 -8
+64 -4 4 -20 20 72 -12 2 -4
+192 -8 0 -20 12 24 -4 2 0
+192 -6 0 -12 8 8 -4 0 0
+0 0 0 -8 24 16 0 2 -8
+0 0 2 -4 20 16 -4 0 -4
+0 0 2 -4 12 24 -4 0 -4
+96 -4 0 -14 10 20 -2 2 -2
+64 -4 4 -20 52 40 -4 2 -12
+192 -12 12 -60 188 152 -28 6 -36
+192 -4 -2 -4 -12 0 0 0 0
+0 16 24 -52 12 120 -12 2 -12
+0 0 14 -18 6 20 -6 4 0
+576 -8 -8 -20 -36 24 -4 2 -12
+640 -16 -8 24 -40 48 -8 2 -16
+192 -6 0 8 -12 8 0 0 -4
+640 -20 -4 16 -40 48 0 2 -16
+960 -20 -12 -4 -60 168 -12 2 -36
+640 -16 -8 24 -40 176 -8 2 -32
+640 -16 -8 56 -40 240 -8 2 -40
+960 -20 -12 28 -60 296 -20 2 -52
+192 -4 -2 12 -12 72 -4 0 -12
+1920 -48 -24 156 -100 -40 -44 6 -20
+384 -12 -4 20 -20 -8 -4 2 -4
+192 -8 0 6 -10 -4 2 2 -2
+0 0 0 8 4 0 -4 0 -2
+192 -12 12 4 12 -8 -12 6 -4
+192 -8 0 -4 4 -8 -4 2 0
+192 -6 0 -4 20 -8 -4 0 -8
+0 3 11 -9 1 10 -5 2 -1
+576 -12 -6 -16 -16 -24 -2 0 -8
+1920 -48 -24 -48 -112 32 8 6 -32
+640 -16 -8 -8 -40 16 0 2 -8
+1152 -12 -12 -52 -60 -24 -4 2 -12
+2880 -60 -36 -112 -152 -48 8 6 -32
+0 8 16 -36 12 120 -28 2 -12
+0 2 4 -8 4 40 -8 0 -4
+0 0 4 -16 16 48 -8 2 -4
+0 4 4 -16 8 48 -8 2 -8
+128 -6 2 -2 -6 -4 2 2 0
+160 -7 1 1 -9 -2 3 2 -1
+288 -8 -4 -2 -18 0 2 2 0
+768 -20 -12 8 -48 0 0 6 0
+0 8 0 0 0 96 -16 2 0
+192 4 -4 12 -12 72 -20 2 -12
+0 6 -2 12 0 48 -12 2 0
+0 12 -4 -8 0 96 -8 6 0
+192 16 -16 -12 -12 72 4 14 -12
+0 14 -10 -4 0 48 4 10 0
+640 -16 -8 32 -40 0 -8 2 0
+1920 -48 -24 104 -120 80 -24 6 -40
+1920 -48 -24 116 -108 8 -36 6 -28
+640 -16 -8 24 -40 16 -8 2 -8
+192 -4 -2 12 -12 8 -4 0 -4
+192 -4 -2 13 -11 2 -5 0 -3
+576 -12 -6 28 -36 16 -12 0 -8
+192 -4 -2 12 -12 0 -4 0 0
+192 -4 -2 18 -10 -4 -6 0 -2
+384 -12 -4 16 -24 0 0 2 0
+384 -12 -4 0 -24 0 4 2 0
+1920 -48 -24 -56 -56 -80 -8 6 -8
+0 20 4 -24 0 288 -40 6 0
+0 2 0 4 0 8 -4 0 0
+0 10 -6 -4 0 16 4 6 0
+0 14 -6 -8 0 8 8 6 0
+0 20 -4 -16 0 16 8 6 0
+0 8 2 -8 0 8 0 2 0
+0 32 0 -32 0 32 8 10 0
+48 19 -1 -21 -3 18 5 6 -3
+1152 -18 -14 -50 -62 -20 2 2 -10
+0 2 -2 -2 2 4 2 2 -2
+192 -4 -2 4 -12 40 -4 0 -8
+192 -4 -2 4 -12 24 -4 0 -6
+128 -3 -1 2 -8 16 -2 0 -4
+64 -4 4 -20 20 40 -4 2 -4
+192 -12 12 -52 36 104 -20 6 -4
+0 0 6 -12 20 40 -8 0 -4
+384 -12 -4 -24 32 64 -8 2 0
+0 0 0 -6 18 4 2 2 -6
+0 0 0 -8 20 8 4 2 -6
+0 0 8 -24 40 208 -32 2 -16
+0 0 8 -24 40 144 -24 2 -16
+0 0 8 -24 40 112 -16 2 -16
+192 -8 0 -20 60 152 -20 2 -4
+64 -4 4 -20 84 264 -36 2 -12
+960 -16 -12 -26 -42 -36 -6 2 -6
+960 -20 -12 -34 -42 -36 0 2 -6
+960 -20 -16 -18 -42 -36 -2 6 -6
+576 -8 -8 -20 -36 88 -4 2 -20
+192 132 -60 -84 -12 72 76 58 -12
+192 20 -12 -20 -12 8 12 10 -4
+96 3 -3 -6 -6 0 2 2 0
+768 16 -16 -48 -48 0 8 10 0
+96 -1 -1 0 -6 20 -4 0 -4
+0 3 5 -10 8 72 -14 0 -8
+0 4 12 -32 24 176 -32 2 -16
+192 -12 12 -60 60 152 -28 6 -4
+192 -12 12 -76 76 184 -28 10 -12
+0 0 0 0 48 0 0 2 -16
+576 -12 -8 -12 -36 24 0 2 -12
+192 -4 -4 -4 -12 8 4 2 -4
+0 0 12 -32 32 96 -16 2 -8
+0 24 -8 -24 8 16 16 10 -8
+0 52 -28 -64 40 80 48 30 -40
+192 -12 12 20 156 -8 -28 6 -60
+192 -12 12 20 380 -8 -28 6 -116
+0 0 2 4 40 0 -4 0 -12
+0 0 6 8 24 0 -8 0 -10
+0 0 8 -36 28 152 -20 6 -4
+32 -2 2 -12 8 32 -4 2 0
+0 0 2 4 4 0 -4 0 0
+0 0 6 8 8 0 -8 0 -2
+0 0 6 1 5 2 -5 0 -1
+1024 -16 -12 -48 -48 -32 4 2 -8
+1248 -23 -15 -55 -57 -42 3 2 -9
+1344 -24 -16 -58 -66 -36 2 2 -12
+1056 -21 -13 -45 -51 -30 3 2 -9
+960 -20 -12 -40 -48 -24 4 2 -8
+0 0 8 -24 24 112 -20 2 -8
+0 4 12 -32 24 144 -24 2 -16
+0 0 8 -24 24 80 -12 2 -8
+0 8 0 -8 24 80 -8 2 -24
+0 6 -2 -4 16 48 4 2 -16
+0 14 -10 -20 16 48 20 10 -16
+0 20 -12 -32 24 80 16 14 -24
+0 14 -2 -20 8 16 12 6 -8
+0 12 -4 -16 8 16 8 6 -8
+0 2 0 0 4 8 0 0 -4
+192 4 -4 -12 -4 88 4 2 -20
+96 1 -3 -4 -6 36 0 2 -6
+192 4 -12 -4 -12 72 12 10 -12
+192 -4 -4 22 -10 -4 -6 2 -2
+1344 -28 -16 -54 -62 -44 2 2 -10
+2688 -36 -28 -120 -144 -32 -8 2 -32
+640 -8 -6 -28 -36 0 -4 0 -8
+112 -1 -1 -5 -7 2 -1 0 -1
+48 2 2 -7 -3 18 -5 0 -3
+0 1 1 -2 0 8 -2 0 0
+0 12 20 -48 24 240 -48 2 -24
+4864 -80 -56 -216 -216 -176 8 6 -32
+2304 -32 -24 -104 -104 -80 0 2 -16
+1152 -24 -14 -44 -60 -24 4 2 -12
+384 -6 -4 -12 -24 24 -4 0 -8
+1728 -28 -20 -64 -104 48 -8 2 -32
+1344 -24 -16 -36 -84 88 -12 2 -28
+192 8 -8 -12 -12 8 4 6 -4
+192 48 -32 -28 -12 72 20 30 -12
+1920 -48 -24 -44 -108 8 4 6 -28
+960 -20 -12 -20 -60 40 -4 2 -16
+1344 -28 -16 -28 -84 40 -4 2 -20
+768 -14 -8 -20 -48 24 -4 0 -12
+2112 -32 -24 -68 -132 152 -20 2 -52
+192 -4 -2 -3 -11 2 -1 0 -3
+576 -12 -6 -4 -36 16 -4 0 -8
+192 -4 -2 4 -12 16 -4 0 -4
+1728 -36 -18 -59 -75 -62 -3 0 -13
+192 4 -4 -12 -12 0 4 2 0
+96 -1 -1 -3 -5 -2 -1 0 -1
+192 0 -2 -4 -12 0 -4 0 0
+2496 -36 -28 -96 -152 16 -8 2 -16
+960 -12 -12 -36 -60 8 -4 2 -4
+1920 -18 -26 -76 -120 0 -4 6 0
+2688 -42 -34 -116 -144 -48 4 6 -24
+864 -17 -11 -37 -43 -22 3 2 -7
+2880 -60 -36 -118 -142 -76 10 6 -26
+192 -6 0 -10 10 -4 -2 0 -2
+192 -6 0 -10 2 -4 -2 0 0
+0 0 2 -2 26 4 -2 0 -6
+192 -12 12 -40 240 32 -8 6 -56
+480 -7 -5 -12 -30 52 -8 0 -14
+0 0 4 -16 16 80 -12 2 -4
+0 4 6 -12 4 48 -12 0 -4
+1152 -36 -12 -60 -20 -40 4 6 -4
+0 2 8 -16 12 56 -12 0 -4
+0 10 16 -32 12 120 -28 0 -12
+96 9 -1 16 -6 36 -20 0 -6
+96 1 -1 0 -6 4 -4 0 -2
+416 -10 -6 -12 -24 16 4 2 -8
+192 -4 -4 6 -10 -4 -2 2 -2
+192 -4 -4 8 -12 0 -2 2 0
+0 4 -2 -3 1 2 3 2 -1
+960 -12 -12 -44 -52 -16 4 2 -8
+576 -8 -8 -28 -28 -16 4 2 -4
+0 3 5 -9 1 10 -1 2 -1
+0 3 7 -9 1 10 -3 2 -1
+1792 -16 -24 -88 -88 -48 8 6 -16
+864 -15 -11 -39 -41 -26 3 2 -7
+672 -11 -9 -31 -33 -18 3 2 -5
+960 -16 -12 -42 -50 -20 2 2 -8
+3200 -80 -40 -154 -90 -132 18 10 -6
+1920 -48 -24 -94 -46 -76 10 6 -2
+1056 -12 -12 -50 -58 -4 -2 2 -14
+960 -12 -12 -44 -52 -8 4 2 -12
+0 0 6 -20 20 56 -8 2 -6
+192 8 8 -24 -8 16 -8 2 -8
+0 3 1 -2 4 8 -2 0 -4
+0 11 1 -2 20 40 -6 0 -20
+0 0 18 -3 13 10 -13 0 -3
+400 -6 -4 -16 -20 -8 -2 0 -4
+3648 -64 -40 -144 -176 -96 -8 2 -32
+624 -8 -6 -26 -34 -4 -4 0 -8
+576 0 -6 -28 -36 0 -4 2 0
+4608 -60 -52 -200 -240 -96 -8 6 -48
+1152 -18 -14 -48 -60 -24 0 2 -12
+1920 -34 -22 -80 -92 -56 0 2 -16
+1728 -36 -22 -74 -82 -52 8 4 -14
+1344 -28 -20 -40 -80 96 8 6 -32
+576 -12 -8 -12 -36 56 0 2 -16
+528 -13 -7 -16 -30 4 4 2 -8
+192 -12 12 -48 40 80 -16 6 -8
+192 -12 12 -48 200 80 -16 6 -48
+0 0 6 -12 52 40 -8 0 -12
+0 0 2 -3 21 10 -3 0 -5
+256 -8 0 -12 12 -8 -2 0 -4
+192 -6 0 -7 13 -6 -3 0 -5
+512 -16 0 -24 0 -16 -4 0 -2
+512 -14 -6 -4 -32 0 2 2 0
+640 -16 -8 -8 -40 0 2 2 0
+960 -20 -14 -20 -60 0 2 4 0
+960 -20 -12 -4 -60 72 -12 2 -20
+960 -20 -12 -4 -60 104 -12 2 -28
+192 -12 12 20 36 -8 -28 6 0
+0 0 2 -3 5 10 -3 0 -1
+192 28 -4 -44 -4 24 20 10 -12
+64 8 0 -12 -4 8 4 2 -2
+256 14 6 -36 -16 32 4 2 -8
+48 4 6 -10 -2 20 -8 0 -4
+16 2 4 -4 0 8 -4 0 -2
+0 12 36 -28 12 56 -28 2 -12
+0 4 4 -8 0 8 0 2 0
+64 4 8 -12 -4 8 -4 2 0
+448 12 12 -36 -28 8 -12 2 -4
+768 -10 -8 -28 -48 8 -4 0 -4
+1536 -22 -16 -52 -96 56 -12 0 -28
+1792 -16 -16 -88 -88 -48 0 2 -16
+384 6 -10 -20 -24 0 4 6 0
+2304 -12 -28 -104 -144 0 -8 6 0
+3840 -48 -40 -168 -200 -80 -8 2 -40
+0 0 8 -6 10 4 -2 2 -4
+0 4 8 -6 18 4 -2 2 -10
+768 -16 -10 -16 -48 24 -2 2 -12
+2304 -56 -32 -32 -144 96 8 10 -48
+1792 -48 -24 -16 -112 0 8 10 0
+2304 -56 -32 -32 -144 0 8 10 0
+192 -6 0 -7 5 -6 -3 0 -3
+448 -14 0 -19 1 -14 -5 0 -3
+576 -18 0 -24 4 -16 -8 0 -4
+2880 -60 -36 -96 -168 -16 8 6 -16
+192 -6 0 10 -10 -4 -2 0 -2
+256 -8 0 12 -12 -8 -4 0 -2
+512 -16 0 0 -24 -16 -2 0 -4
+192 -6 0 2 -10 -4 0 0 -2
+576 -18 0 4 -24 -16 -4 0 -8
+448 -14 0 1 -19 -14 -3 0 -5
+576 -18 0 -3 -23 -22 -3 0 -5
+192 -6 0 5 -7 -6 -3 0 -3
+192 -6 0 13 -7 -6 -5 0 -3
+64 -4 4 20 -4 24 4 2 -4
+2304 -56 -32 -96 -96 -96 16 10 0
+768 -30 0 -32 -28 -32 8 6 0
+0 1 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0
+0 0 0 0 1 0 0 0 0
+0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit288-281.ine b/demos/ppl_lcdd/examples/mit288-281.ine
new file mode 100644
index 0000000..895a518
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit288-281.ine
@@ -0,0 +1,291 @@
+begin
+288 281 rational
+1 -3 0 10 -4 -8 8 4 -4 -4 4 4 2 4 8 -12 -4 4 0 -2 1 0 -8 -4 0 4 -4 0 -8 -16 2 -8 4 4 12 8 2 0 -8 16 0 0 -4 -4 -8 -4 -4 0 24 8 0 -4 -2 8 -2 0 -8 -1 -16 -10 -8 -4 -12 0 24 8 -12 2 4 -4 4 -8 12 0 -8 -8 16 8 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 -16 -24 10 16 16 -16 0 4 -16 4 16 4 -16 8 16 8 12 -8 -4 -8 0 8 -8 4 -12 0 -8 4 16 4 -24 -6 8 -4 -8 12 8 8 4 8 -16 0 16 0 -16 0 -24 0 8 0 0 4 -16 -8 -4 -8 16 12 8 -16 -16 16 16 8 16 -16 16 -16 8 4 -8 8 0 8 4 0 0 -12 -16 16 -8 -8 4 0 4 0 10 8 4 0 12 -4 4 -24 - [...]
+1 -5 0 12 -2 -4 0 4 -8 0 2 0 4 8 8 -8 0 0 0 -4 -1 -8 -8 -8 8 0 -4 0 0 -8 2 0 0 4 8 0 -2 0 0 4 -4 -8 0 0 -8 0 0 8 8 8 0 0 -2 0 2 0 -8 1 -4 0 0 0 -4 -8 0 0 0 0 0 0 -4 0 0 0 0 -8 8 0 8 4 0 8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 -8 0 8 4 0 4 0 4 8 0 0 0 -4 4 0 -8 0 -8 0 0 0 -8 0 0 0 0 8 8 0 8 0 0 0 0 0 0 0 0 0 -8 0 -4 8 0 0 -8 -8 0 -8 0 0 -8 0 8 0 -4 0 -4 0 -4 0 0 4 0 0 8 0 0 0 0 0 0 0 0 -8 0 -4 -4 0 0 8 0 -8 0 8 0 0 0 0 0 0 0 4 -8 0 8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 8 -2 0 -8 [...]
+1 -7 4 14 0 0 -8 4 -12 4 0 -4 -2 4 8 -8 4 -4 0 2 1 0 -8 -4 0 -4 -4 0 24 0 -2 0 4 4 4 -8 -2 0 0 -8 -8 -16 4 4 8 4 4 0 -8 -8 0 -4 2 0 2 0 8 -1 8 2 -8 4 4 0 8 0 -4 -10 -4 -4 4 -8 12 0 8 8 0 8 16 8 4 8 -16 0 0 8 0 0 0 0 0 0 16 -8 -2 0 0 0 0 -4 0 -4 0 -4 -16 -8 -16 -8 -4 -8 -4 -8 0 -8 -4 -4 -12 0 0 -4 16 4 8 6 8 4 8 4 4 8 4 -8 0 0 0 0 0 0 -8 0 8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 16 16 0 4 0 8 0 4 -4 0 0 -12 -16 -16 -8 -4 -4 0 -4 0 -2 -8 -4 0 -4 4 4 8 6 -8 0 -8 0 0 8 -8 4 0 8 4 -8 -4 8 -8  [...]
+1 -7 0 18 0 0 0 4 -12 0 0 -12 6 12 0 -12 0 0 12 -6 -3 -24 0 -12 24 0 -4 0 0 -12 6 0 0 12 12 0 -6 0 0 0 0 -24 12 12 -24 12 0 24 0 24 -12 12 -6 0 6 0 0 3 0 6 0 -12 12 -24 0 0 0 6 0 -12 -12 0 -12 0 0 0 12 0 24 0 -12 24 0 -12 4 -12 0 0 0 0 12 0 -24 0 -6 -24 0 24 -4 12 0 -12 -24 -12 0 -24 24 24 -12 0 12 12 0 0 0 -12 12 0 0 12 0 12 0 -6 0 0 -24 0 0 0 -12 0 0 0 0 0 24 -12 0 0 0 0 0 -12 0 0 12 -24 -24 0 0 24 0 -24 0 0 0 24 0 -24 0 -12 0 -12 0 0 12 0 0 12 0 24 12 0 12 4 -12 -4 -6 0 -12 0 -12 0 12 [...]
+1 -7 0 14 0 4 0 0 -12 -4 0 -4 6 4 0 -4 4 4 -8 -6 -3 -16 0 -4 0 0 0 -8 8 8 2 0 0 0 4 0 -2 -8 0 4 -4 0 4 -12 8 4 0 16 0 0 8 12 -2 0 2 8 0 3 -4 -2 0 12 0 0 0 0 4 -2 12 4 0 0 -4 8 0 0 -8 8 0 4 -4 -8 -8 4 -4 -8 0 4 0 0 -4 0 0 0 2 16 -8 -16 4 -12 8 12 0 -4 8 8 0 -8 0 -8 0 8 0 0 0 -4 4 0 -4 4 -8 -4 0 2 0 -12 0 -4 0 0 -12 0 -8 0 8 0 0 4 0 0 0 0 0 -4 -8 -8 0 0 0 -4 0 -16 8 16 -8 0 8 0 -8 0 4 -12 -4 -8 0 0 4 0 0 4 8 0 8 0 -12 -4 12 4 2 0 -4 0 0 -12 -4 0 2 -8 -4 8 0 0 0 0 4 8 8 0 0 4 0 0 12 -2 -4 - [...]
+1 -9 4 20 2 8 -8 0 -16 -4 -2 -16 0 0 -8 -12 4 4 4 0 -1 -8 8 0 8 0 0 0 24 4 2 0 0 8 8 0 -2 0 0 0 0 -8 8 0 0 8 0 8 -8 0 -4 8 -2 0 2 0 8 1 0 4 -8 0 8 -8 8 0 -4 -4 4 0 0 8 0 0 0 8 -4 8 8 0 -8 0 -16 0 0 -4 8 -8 -4 0 0 -8 8 -8 -4 -8 0 -8 0 0 0 0 -8 -8 0 0 8 0 -8 -8 0 -4 -4 -8 -4 -8 0 4 -8 8 0 0 8 4 8 -4 0 4 -4 -8 -8 -8 -16 0 -16 0 -8 0 8 8 -8 0 0 8 16 8 0 0 8 -4 8 8 0 8 0 8 16 8 0 -8 8 8 8 4 4 4 -8 -4 -8 0 0 -8 4 4 0 0 0 0 4 8 8 4 8 4 0 -8 -4 0 0 0 0 0 -8 8 -8 0 -8 0 0 4 -8 -8 -8 2 8 0 0 0 4 4 [...]
+1 -11 8 26 4 16 -24 -4 -20 -12 -4 -28 -6 -12 -24 -20 4 12 8 6 1 16 24 12 16 4 4 16 40 8 2 8 4 12 12 8 2 16 8 8 8 16 -4 -4 -8 -4 -4 -16 -8 -8 -8 -4 -2 -8 -2 -16 -8 -1 -8 -2 -8 -4 -4 -16 -8 -8 -4 -6 -4 -4 -4 -8 -4 -16 -8 -8 -8 -8 -16 -8 -4 -8 -16 0 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 0 0 8 0 4 4 0 0 4 0 4 8 2 8 4 8 4 0 8 4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 -8 -8 -4 -16 -8 -4 -8 -4 -8  [...]
+1 -13 12 36 6 24 -48 -8 -32 -24 -6 -48 -12 -24 -48 -36 8 24 24 12 3 48 48 24 48 12 8 48 96 24 6 24 12 24 24 24 6 48 24 24 24 48 -24 -24 -48 -24 -12 -48 -48 -48 -24 -24 -6 -24 -6 -48 -48 -3 -24 -12 -48 -24 -24 -48 -48 -24 -24 -24 -24 -24 -24 -48 -24 -48 -24 -48 -24 -48 -48 -24 -24 -48 -48 12 4 24 24 24 12 48 12 24 48 48 12 48 48 48 4 24 48 24 48 24 48 48 48 48 24 48 24 24 12 48 12 24 24 12 24 24 48 24 48 12 48 24 48 24 12 48 24 48 48 16 48 48 48 -12 -48 -24 -48 -48 -16 -24 -48 -48 -24 -48 [...]
+1 13 12 36 6 24 48 8 32 24 6 48 12 24 48 36 8 24 24 12 3 48 48 24 48 12 8 48 96 24 6 24 12 24 24 24 6 48 24 24 24 48 24 24 48 24 12 48 48 48 24 24 6 24 6 48 48 3 24 12 48 24 24 48 48 24 24 24 24 24 24 48 24 48 24 48 24 48 48 24 24 48 48 12 4 24 24 24 12 48 12 24 48 48 12 48 48 48 4 24 48 24 48 24 48 48 48 48 24 48 24 24 12 48 12 24 24 12 24 24 48 24 48 12 48 24 48 24 12 48 24 48 48 16 48 48 48 12 48 24 48 48 16 24 48 48 24 48 48 24 48 48 48 48 48 48 48 48 48 48 24 24 24 24 12 12 24 12 24 [...]
+1 11 8 26 4 16 24 4 20 12 4 28 6 12 24 20 4 12 8 6 1 16 24 12 16 4 4 16 40 8 2 8 4 12 12 8 2 16 8 8 8 16 4 4 8 4 4 16 8 8 8 4 2 8 2 16 8 1 8 2 8 4 4 16 8 8 4 6 4 4 4 8 4 16 8 8 8 8 16 8 4 8 16 0 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 0 0 8 0 4 4 0 0 4 0 4 8 2 8 4 8 4 0 8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 -4 -16 -8 -4 -8 -4 -8 -8 -4 -2 -4 -4 -8 -8 -8 -8 - [...]
+1 11 12 12 6 24 48 8 -16 24 -6 0 12 24 48 12 -8 -24 24 -12 3 48 -48 -24 48 12 -8 48 0 24 6 24 12 -24 -24 24 6 48 24 24 24 48 24 24 48 24 -12 -48 48 48 -24 24 -6 -24 -6 -48 48 -3 -24 12 48 24 24 -48 48 -24 24 0 24 24 24 48 24 -48 -24 48 -24 48 -48 -24 24 48 -48 12 4 24 24 24 12 48 12 24 48 -48 -12 48 48 48 4 -24 48 -24 48 -24 48 -48 48 -48 -24 -48 -24 24 12 -48 12 -24 -24 12 24 -24 48 -24 -48 -12 -48 -24 -48 -24 12 -48 -24 -48 48 16 48 48 48 -12 48 -24 48 -48 -16 24 -48 48 24 48 -48 24 48 [...]
+1 9 8 16 2 8 16 0 8 0 2 8 8 8 0 16 0 0 -8 8 3 16 0 8 0 -4 0 16 16 -8 2 8 4 0 8 0 2 0 0 -8 -8 0 8 -16 -16 0 -4 16 -16 0 -8 16 2 8 2 16 -16 3 -8 0 0 -16 0 0 0 0 0 4 0 0 0 16 8 0 0 0 -8 0 0 -8 0 -16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 -16 -16 -16 0 0 0 -16 0 -16 0 0 0 8 4 0 8 8 8 -4 8 0 0 0 -16 0 0 0 0 0 8 16 16 -16 0 0 0 -16 0 -4 0 0 0 -16 0 8 0 0 0 0 0 0 0 -16 -16 -16 -16 16 0 0 0 0 8 16 8 8 4 8 0 -4 0 8 0 0 8 8 -16 -4 -16 -4 0 -16 0 -4 0 0 0 -16 0 -16 -4 -16 -32 8 0 0 8 16 0 0 [...]
+1 9 4 20 2 8 8 0 16 4 2 16 0 0 8 12 4 4 4 0 -1 -8 8 0 8 0 0 0 24 4 2 0 0 8 8 0 -2 0 0 0 0 -8 -8 0 0 -8 0 -8 8 0 4 -8 2 0 -2 0 -8 -1 0 -4 8 0 -8 8 -8 0 4 4 -4 0 0 -8 0 0 0 -8 4 -8 -8 0 8 0 16 0 0 -4 8 -8 -4 0 0 -8 8 -8 -4 -8 0 -8 0 0 0 0 -8 -8 0 0 8 0 -8 -8 0 -4 -4 -8 -4 -8 0 4 -8 8 0 0 8 4 8 -4 0 4 -4 -8 -8 -8 -16 0 -16 0 -8 0 -8 -8 8 0 0 -8 -16 -8 0 0 -8 4 -8 -8 0 -8 0 -8 -16 -8 0 8 -8 -8 -8 -4 -4 -4 8 4 8 0 0 8 -4 -4 0 0 0 0 -4 -8 -8 -4 -8 -4 0 8 4 0 0 0 0 0 -8 8 -8 0 -8 0 0 4 -8 -8 -8 [...]
+1 9 4 16 6 8 0 0 8 0 6 8 8 0 32 4 0 0 8 8 3 16 32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 16 0 -16 12 16 0 0 8 16 -2 -8 -2 16 0 3 8 -8 -32 16 0 -16 -32 8 0 -12 0 -16 0 0 0 -16 8 32 8 0 -16 8 -16 0 -16 -4 4 8 -24 8 -4 16 -4 -24 -16 -32 -8 16 16 16 4 16 16 16 -16 -16 -16 0 -16 0 0 0 0 8 12 32 4 0 0 -4 8 -16 -16 -16 0 -8 -32 0 0 0 4 0 16 0 -16 -16 -16 -16 -16 -4 -32 -24 -32 -16 -16 0 -16 0 0 0 -16 0 32 16 16 16 16 0 -16 -16 -16 -16 8 16 8 8 12 4 -16 -4 -24 0 -16 -16 8 4 16 4 1 [...]
+1 9 4 16 2 12 8 4 8 8 2 16 0 8 8 4 0 8 0 0 -1 0 8 8 0 0 4 -8 0 0 -2 0 0 4 0 0 2 8 0 4 4 16 0 0 0 8 0 0 -8 -8 0 -8 -2 0 2 -8 8 -1 4 4 -8 0 4 0 8 0 -8 -4 0 0 -4 -8 -8 8 0 -8 0 0 16 4 -8 0 -8 0 0 -8 -8 -4 4 0 0 8 -16 8 4 0 -8 0 0 0 -8 0 0 8 -8 0 -16 0 4 0 -4 -8 -4 -8 -4 0 -8 -4 -4 -8 -8 0 -8 -4 -8 0 -8 -8 -4 -8 -8 8 8 0 8 0 0 0 8 8 -8 0 0 0 8 0 -4 -8 0 -8 -8 0 -8 0 -8 -8 8 0 -8 -16 -4 -8 -4 -8 -4 -4 -8 -4 -8 -8 -8 -16 -8 -4 0 0 0 0 4 8 8 4 4 0 0 -8 -4 0 0 0 0 0 8 -8 0 -8 0 -4 -8 -8 -8 -8 -8 [...]
+1 9 8 6 4 16 24 4 -12 12 -4 -4 6 12 24 4 -4 -12 8 -6 1 16 -24 -12 16 4 -4 16 -8 8 2 8 4 -12 -12 8 2 16 8 8 8 16 4 4 8 4 -4 -16 8 8 -8 4 -2 -8 -2 -16 8 -1 -8 2 8 4 4 -16 8 -8 4 -2 4 4 4 8 4 -16 -8 8 -8 8 -16 -8 4 8 -16 0 0 0 0 0 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 0 0 -8 0 -4 -4 0 0 -4 0 -4 -8 -2 -8 -4 -8 -4 0 -8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 8 8 4 - [...]
+1 7 4 14 0 0 8 -4 12 -4 0 4 2 -4 -8 8 4 -4 0 2 1 0 -8 -4 0 -4 -4 0 24 0 -2 0 4 4 4 -8 -2 0 0 -8 -8 -16 -4 -4 -8 -4 -4 0 8 8 0 4 -2 0 -2 0 -8 1 -8 -2 8 -4 -4 0 -8 0 4 10 4 4 -4 8 -12 0 -8 -8 0 -8 -16 -8 -4 -8 16 0 0 8 0 0 0 0 0 0 16 -8 -2 0 0 0 0 -4 0 -4 0 -4 -16 -8 -16 -8 -4 -8 -4 -8 0 -8 -4 -4 -12 0 0 -4 16 4 8 6 8 4 8 4 4 8 4 -8 0 0 0 0 0 0 8 0 -8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 -16 -16 0 -4 0 -8 0 -4 4 0 0 12 16 16 8 4 4 0 4 0 2 8 4 0 4 -4 -4 -8 -6 8 0 8 0 0 8 -8 4 0 8 4 -8 -4 8  [...]
+1 7 8 6 4 0 8 -4 -4 -12 4 -12 10 4 8 12 -4 -12 -8 10 1 16 8 4 -16 4 -4 16 -8 -8 2 8 4 -12 4 8 2 -16 8 -8 -8 -16 12 -4 -8 -4 4 16 -8 -8 -8 -4 2 8 2 16 -8 1 -8 -2 -8 -4 -4 -16 -8 8 -4 2 -4 -4 -4 24 12 -16 8 24 -8 -8 -16 -8 -4 -8 -16 0 0 -16 0 16 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 16 0 24 0 12 12 0 -16 -4 0 -4 -8 -2 -8 -4 -8 -4 0 24 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -12 0 8 4 8 0 4 -24 0 0 0 0 -24 0 0 0 0 -16 4 16 16 0 0 4 0 0 -12 0 0 -16 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 - [...]
+1 7 4 6 0 8 8 4 -4 4 0 4 2 4 -8 0 -4 4 -8 2 1 0 -8 4 0 -4 4 0 -8 -8 -2 0 4 -4 -4 -8 -2 0 0 0 0 16 -12 -4 -8 -4 -4 0 -8 -8 -8 4 -2 0 -2 0 8 1 0 6 -8 -4 4 0 8 0 -4 2 -4 4 4 8 -4 0 -8 -8 -8 8 16 0 -4 -8 -16 0 0 0 0 -8 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 -16 -4 0 -8 0 -8 4 8 4 0 0 -8 -4 -12 -4 0 8 -4 0 4 -8 -2 -8 -4 -8 -4 4 8 4 8 -16 0 16 0 16 0 -8 0 8 0 0 12 16 -8 -4 8 16 4 8 0 0 0 0 -8 -16 -16 0 0 8 -4 -8 0 0 -4 4 0 0 4 0 0 0 4 4 0 4 0 -6 -8 4 0 -4 4 -4 8 2 8 0 8 0 0 -8 8 12 0 -8 -4 8 4 8 -8 -4  [...]
+1 7 4 10 0 4 0 0 4 0 0 4 2 4 -8 8 0 0 -4 2 1 0 -8 4 0 -4 0 0 0 -4 2 0 -4 0 4 0 2 0 -8 -4 -4 0 4 -4 0 4 -4 0 -8 0 -4 4 2 0 2 0 -8 1 -4 -2 0 -4 0 0 0 -8 0 -6 0 -4 0 -16 4 0 0 -8 -4 0 0 -4 4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 8 0 8 0 0 0 0 -4 0 -8 4 4 4 0 4 4 -8 -4 -8 -2 0 0 0 0 -4 -16 4 -8 8 0 -8 0 -8 0 0 0 0 0 0 -4 -8 0 0 0 -8 0 8 0 0 0 0 16 8 8 8 8 4 -4 -4 -4 0 4 -4 0 0 -4 -8 -8 4 -4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 16 -4 -2 -4 -4 4 4 4 4 4 4 4 8 4  [...]
+1 7 8 0 2 8 16 0 -8 0 -2 -8 8 8 0 0 0 0 -8 -8 3 16 0 -8 0 -4 0 16 -16 -8 2 8 4 0 -8 0 2 0 0 -8 -8 0 8 -16 -16 0 4 -16 -16 0 8 16 -2 -8 -2 -16 -16 -3 8 0 0 -16 0 0 0 0 0 -4 0 0 0 16 8 0 0 0 8 0 0 8 0 -16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 16 -16 16 0 0 0 16 0 16 0 0 0 8 4 0 8 -8 -8 -4 8 0 0 0 16 0 0 0 0 0 8 -16 -16 16 0 0 0 -16 0 4 0 0 0 16 0 8 0 0 0 0 0 0 0 16 16 16 16 16 0 0 0 0 -8 16 -8 -8 -4 -8 0 4 0 8 0 0 -8 -8 -16 4 -16 4 0 -16 0 4 0 0 0 -16 0 -16 4 -16 32 8 0 0 -8 16 0  [...]
+1 7 0 10 4 4 -8 0 4 0 4 4 2 -4 16 -4 0 0 4 2 1 0 16 -4 -8 4 0 0 -16 4 -2 -8 -4 0 -4 0 -2 -8 0 4 4 -8 -4 4 0 -4 4 0 0 0 4 4 -2 -8 -2 0 0 1 4 -2 -8 4 0 -8 -8 0 0 -6 0 -4 0 -8 -4 -8 0 0 4 0 -8 4 -4 0 -8 0 0 4 0 -4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 0 -4 -4 0 4 -4 0 -4 0 -2 -8 0 0 0 0 -8 4 0 0 0 0 0 0 0 8 0 8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 -4 -4 -4 0 0 4 0 0 4 0 0 4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 8 8 4 0 0 0 0 0 0 8 -4 2 4 4 -4 -4 -4 -4 -4 -4 -4 0 4 8 2 [...]
+1 7 0 18 0 0 0 -4 12 0 0 12 -6 -12 0 12 0 0 12 -6 -3 -24 0 -12 24 0 -4 0 0 -12 6 0 0 12 12 0 -6 0 0 0 0 -24 -12 -12 24 -12 0 -24 0 -24 12 -12 6 0 -6 0 0 -3 0 -6 0 12 -12 24 0 0 0 -6 0 12 12 0 12 0 0 0 -12 0 -24 0 12 -24 0 -12 4 -12 0 0 0 0 12 0 -24 0 -6 -24 0 24 -4 12 0 -12 -24 -12 0 -24 24 24 -12 0 12 12 0 0 0 -12 12 0 0 12 0 12 0 -6 0 0 -24 0 0 0 -12 0 0 0 0 0 24 12 0 0 0 0 0 12 0 0 -12 24 24 0 0 -24 0 24 0 0 0 -24 0 24 0 12 0 12 0 0 -12 0 0 -12 0 -24 -12 0 -12 -4 12 4 6 0 12 0 12 0 -1 [...]
+1 7 0 14 0 4 0 0 12 4 0 4 -6 -4 0 4 4 4 -8 -6 -3 -16 0 -4 0 0 0 -8 8 8 2 0 0 0 4 0 -2 -8 0 4 -4 0 -4 12 -8 -4 0 -16 0 0 -8 -12 2 0 -2 -8 0 -3 4 2 0 -12 0 0 0 0 -4 2 -12 -4 0 0 4 -8 0 0 8 -8 0 -4 4 8 8 4 -4 -8 0 4 0 0 -4 0 0 0 2 16 -8 -16 4 -12 8 12 0 -4 8 8 0 -8 0 -8 0 8 0 0 0 -4 4 0 -4 4 -8 -4 0 2 0 -12 0 -4 0 0 -12 0 -8 0 8 0 0 -4 0 0 0 0 0 4 8 8 0 0 0 4 0 16 -8 -16 8 0 -8 0 8 0 -4 12 4 8 0 0 -4 0 0 -4 -8 0 -8 0 12 4 -12 -4 -2 0 4 0 0 12 4 0 -2 8 4 -8 0 0 0 0 4 8 8 0 0 4 0 0 12 -2 -4 - [...]
+1 7 0 10 0 8 0 4 4 0 0 12 -6 4 0 -4 0 0 4 -6 -3 -8 0 4 -8 0 4 -16 0 -4 -2 0 0 4 -4 0 2 0 0 -8 8 8 4 -12 -8 4 0 -8 0 -8 4 -12 -2 0 2 -16 0 -3 -8 2 0 12 -4 -8 0 0 0 2 0 -4 -12 0 -4 0 0 0 -4 0 8 8 -4 8 0 4 4 -4 0 8 0 0 -4 0 8 0 2 -8 16 8 -4 12 -16 -12 8 4 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 -8 -4 0 -4 0 2 0 0 -8 0 0 0 -12 0 0 0 0 0 -8 -4 0 0 0 0 0 -4 0 0 12 8 -8 0 0 -8 16 8 -16 0 0 8 0 -8 -8 12 8 4 0 0 4 0 0 4 0 8 -4 0 -12 -4 12 4 -2 0 -4 0 4 0 4 0 -2 8 4 -8 0 0 0 0 -4 16 0 12 8 0 0 0 12 2 4  [...]
+1 7 4 4 2 8 8 0 -8 4 -2 0 0 0 8 4 -4 -4 4 0 -1 -8 -8 0 8 0 0 0 8 4 2 0 0 -8 -8 0 -2 0 0 0 0 -8 -8 0 0 -8 0 8 8 0 -4 -8 -2 0 2 0 -8 1 0 -4 8 0 -8 -8 -8 0 4 4 -4 0 0 -8 0 0 0 -8 -4 -8 8 0 8 0 -16 0 0 -4 8 -8 -4 0 0 -8 8 8 4 -8 0 -8 0 0 0 0 -8 8 0 0 8 0 8 8 0 -4 -4 8 -4 8 0 4 -8 -8 0 0 -8 -4 -8 4 0 -4 -4 8 8 8 -16 0 -16 0 -8 0 -8 8 8 0 0 -8 16 -8 0 0 8 4 -8 8 0 8 0 -8 16 8 0 -8 8 -8 8 4 4 4 8 -4 -8 0 0 -8 4 4 0 0 0 0 -4 -8 -8 4 -8 -4 0 8 4 0 0 0 0 0 8 -8 8 0 8 0 0 -4 8 8 8 2 -8 0 0 0 4 4 0  [...]
+1 7 4 0 6 8 0 0 -8 0 -6 -8 8 0 32 -4 0 0 8 -8 3 16 -32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 16 0 -16 -12 -16 0 0 -8 16 2 8 2 -16 0 -3 -8 -8 -32 16 0 16 -32 -8 0 -4 0 -16 0 0 0 16 -8 32 -8 0 16 -8 -16 0 16 -4 4 8 -24 8 -4 16 -4 -24 -16 32 8 16 16 16 4 -16 16 -16 -16 16 -16 0 -16 0 0 0 0 8 12 -32 4 0 0 -4 8 16 -16 16 0 8 32 0 0 0 4 0 -16 0 -16 -16 -16 -16 -16 4 -32 24 -32 16 16 0 16 0 0 0 16 0 32 -16 -16 -16 -16 0 16 16 16 16 -8 16 -8 -8 -12 -4 -16 4 24 0 16 16 -8 -4 16 -4 [...]
+1 7 0 6 0 12 0 0 -4 12 0 12 -6 12 0 -12 -4 12 0 -6 -3 0 0 12 0 0 0 -24 -24 0 -6 0 0 0 -12 0 6 24 0 12 -12 0 12 12 24 12 0 0 0 0 0 -12 -6 0 6 -24 0 -3 12 -6 0 -12 0 0 0 0 -12 -6 12 12 0 0 -12 24 0 0 0 -24 0 -12 -12 -24 -24 -12 -4 0 0 12 0 0 12 0 0 0 -6 0 -24 0 4 -12 24 12 0 12 -24 -24 0 24 0 -24 0 0 0 0 0 12 -12 0 -12 -12 24 12 0 -6 0 12 0 -12 0 0 -12 0 24 0 -24 0 0 12 0 0 0 0 0 -12 -24 24 0 0 0 12 0 0 -24 0 24 0 24 0 -24 0 -12 12 12 0 0 0 12 0 0 12 24 0 0 0 12 4 -12 -4 6 0 -12 0 0 -12 -1 [...]
+1 7 4 0 2 12 8 4 -8 8 -2 -8 0 8 8 -4 0 -8 0 0 -1 0 -8 -8 0 0 -4 -8 -16 0 -2 0 0 -4 0 0 2 8 0 4 4 16 0 0 0 8 0 0 -8 -8 0 -8 2 0 -2 8 8 1 -4 4 -8 0 4 0 8 0 -8 -4 0 0 -4 -8 -8 -8 0 -8 0 0 -16 -4 -8 0 8 0 0 -8 -8 -4 4 0 0 8 -16 -8 -4 0 -8 0 0 0 -8 0 0 -8 -8 0 -16 0 -4 0 4 -8 -4 8 -4 0 8 -4 -4 8 -8 0 8 4 8 0 8 8 -4 8 8 -8 8 0 8 0 0 0 8 -8 -8 0 0 0 -8 0 -4 -8 0 -8 -8 0 8 0 8 -8 -8 0 8 16 4 -8 4 8 4 4 -8 4 8 -8 8 16 8 4 0 0 0 0 4 8 8 -4 4 0 0 -8 -4 0 0 0 0 0 -8 8 0 -8 0 4 8 8 8 8 8 -2 8 8 4 4 0 [...]
+1 5 4 12 -2 -8 16 -8 16 -8 -2 0 4 -8 -16 -4 8 -8 8 4 3 16 -16 -8 -16 -4 -8 -16 32 8 -2 -8 12 8 -8 -24 -2 16 8 -8 -8 -16 -8 8 -16 8 -4 16 16 16 8 8 -2 -8 -2 -16 16 3 -8 4 -16 8 8 -16 -16 8 -8 16 24 8 -24 16 -8 16 -24 -16 8 -16 -16 -8 8 -16 16 -4 4 8 8 -8 12 16 -4 8 -16 -16 4 16 -16 16 4 8 -16 8 -16 8 16 -16 -16 -16 8 -16 -24 8 -4 -16 4 -8 -8 12 -8 8 16 8 16 4 -16 24 16 -8 4 16 8 16 16 -16 16 -16 -16 -4 -16 8 -16 -16 -16 -8 16 -16 -24 16 -16 -8 -16 16 -16 16 -16 16 16 -16 16 -16 -8 8 -8 8  [...]
+1 5 4 4 2 -4 0 -4 0 -8 2 -8 4 0 0 4 0 -8 0 4 -1 0 0 0 -8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 -8 0 0 0 8 0 0 0 8 0 -8 -2 0 2 8 0 -1 -4 0 0 0 -4 -8 0 0 8 0 0 0 4 0 0 0 0 0 0 0 -8 -4 -8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 8 0 0 8 0 -4 0 4 0 -4 0 -4 0 0 -4 -4 -8 0 0 0 0 0 0 8 8 -4 0 -8 0 0 0 0 0 8 0 0 8 0 0 0 0 0 0 4 8 8 8 0 0 8 0 8 0 0 8 0 8 -4 -8 -4 0 -4 -4 -8 -4 -8 0 0 8 0 -4 0 0 0 0 0 0 8 4 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 4 8 8 0 0 -8 -2 -8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 8 0  [...]
+1 5 4 4 -2 0 0 0 0 0 -2 0 4 0 -16 4 0 0 0 4 3 0 -16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 8 0 -8 -4 0 0 0 0 8 -2 8 -2 0 0 3 0 -4 16 8 0 0 16 -8 0 -8 0 -8 0 0 0 0 -8 -16 0 0 0 0 -8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 16 -4 0 0 0 4 8 0 8 0 -8 0 0 0 0 0 0 0 0 -4 -16 4 0 0 -4 0 -8 0 -8 0 -4 16 0 0 0 4 0 8 0 0 16 0 16 0 -4 16 -8 16 16 16 0 0 0 0 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 4 -8 -4 -8 0 0 0 0 4 8 4 8 4 -4 0 -8 -4 0 0 -8 0 -4 0 -4 0 16 8 16 16 0 0 0 0 0 0 -16 0 8 -2 -8 0 0 0 0 0 -4 [...]
+1 5 0 4 2 0 0 0 0 0 2 0 4 -8 0 -8 0 0 0 4 3 0 0 -8 0 -4 0 0 0 0 -6 -8 4 0 -8 0 -6 0 0 0 0 0 -8 -8 16 -8 -4 0 0 0 0 8 -6 -8 -6 0 0 3 0 4 0 -8 0 0 0 0 0 8 0 8 0 0 -8 0 0 0 0 0 0 0 -8 16 0 12 -4 0 0 0 -4 0 12 0 0 0 4 0 0 0 -4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 4 0 0 -8 -8 -4 0 -8 0 8 0 4 0 0 0 0 0 0 8 0 0 0 0 16 0 12 0 0 0 16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 4 0 -8 -4 0 -8 0 0 0 0 -8 -4 -8 -4 4 0 -8 -4 0 0 8 0 4 16 12 16 0 -8 0 0 -8 0 0 0 0 0 0 0 8 -6 -8 -8 0 0 0 0 -4 -8 -8 0 4 0 4  [...]
+1 5 0 12 -2 -4 0 -4 8 0 -2 0 -4 -8 -8 8 0 0 0 -4 -1 -8 -8 -8 8 0 -4 0 0 -8 2 0 0 4 8 0 -2 0 0 4 -4 -8 0 0 8 0 0 -8 -8 -8 0 0 2 0 -2 0 8 -1 4 0 0 0 4 8 0 0 0 0 0 0 4 0 0 0 0 8 -8 0 -8 -4 0 -8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 -8 0 8 4 0 4 0 4 8 0 0 0 -4 4 0 -8 0 -8 0 0 0 -8 0 0 0 0 8 8 0 8 0 0 0 0 0 0 0 0 0 8 0 4 -8 0 0 8 8 0 8 0 0 8 0 -8 0 4 0 4 0 4 0 0 -4 0 0 -8 0 0 0 0 0 0 0 0 8 0 4 4 0 0 -8 0 8 0 -8 0 0 0 0 0 0 0 4 -8 0 8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 8 -2 0 -8 4 0 [...]
+1 5 0 8 -2 0 0 0 8 -4 -2 0 -4 0 -8 0 4 -4 -4 -4 -1 0 -8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 8 0 -8 0 0 0 8 0 -4 0 -2 0 2 -8 -8 -1 -8 0 0 0 0 0 0 0 -4 0 -4 0 0 0 -8 -8 0 8 4 8 0 0 0 8 8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 8 -8 -8 0 8 0 -4 4 8 0 8 -8 4 8 0 0 0 8 0 0 -4 0 -4 0 0 0 -8 0 0 0 0 8 0 0 0 0 0 0 8 0 8 0 0 8 -4 8 0 8 0 8 0 0 8 0 -8 8 0 8 -4 4 0 0 4 0 -8 0 -8 -4 0 0 0 0 0 0 -8 0 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 8 -8 8 0 0 -4 8 0 0 -2 0 -8 -8 0 -4 4 0 0 0 0 0 0 0 -8 -8 2 [...]
+1 5 4 2 0 0 8 -4 -4 -4 0 4 2 -4 -8 0 -4 4 0 -2 1 0 8 4 0 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 0 0 -8 -8 -16 -4 -4 -8 -4 4 0 8 8 0 4 2 0 2 0 -8 -1 8 -2 8 -4 -4 0 -8 0 4 2 4 4 -4 8 -12 0 8 -8 0 -8 16 8 -4 -8 -16 0 0 8 0 0 0 0 0 0 16 8 2 0 0 0 0 4 0 4 0 4 -16 8 -16 8 4 8 4 -8 0 8 -4 4 12 0 0 4 16 -4 -8 -6 -8 -4 -8 -4 4 -8 -4 8 0 0 0 0 0 0 8 0 -8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 16 16 0 -4 0 8 0 4 4 0 0 12 -16 -16 -8 -4 4 0 4 0 2 8 4 0 4 -4 -4 -8 -6 8 0 8 0 0 -8 8 -4 0 -8 -4 8 4 -8 8 4 2 -4 -12 [...]
+1 5 12 -4 6 -8 16 -8 -16 -24 6 -32 4 8 16 20 -8 -24 -8 4 3 -16 16 8 -16 12 -8 -16 0 -8 6 24 12 -24 8 24 6 -16 24 -8 -8 -16 8 8 16 8 12 -16 16 -48 -8 8 6 24 6 -16 16 3 -8 4 16 8 -24 -16 16 24 -24 16 -24 8 -24 16 8 -16 24 16 -8 -48 -16 -8 8 16 -16 12 4 -8 24 -8 12 48 12 24 -16 16 4 -16 -16 -16 4 8 -16 8 -16 8 -16 16 -16 16 -24 -48 -24 -8 12 16 12 8 8 12 -8 8 -16 8 16 4 16 -24 -48 -24 12 16 8 16 -16 16 -16 48 -16 12 16 24 16 48 16 8 -16 -48 -24 -48 -16 -24 16 -16 -16 -16 -16 16 -16 -16 -16  [...]
+1 5 4 0 2 0 0 0 -8 -4 2 -8 4 0 0 4 -4 -4 -4 4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 -8 0 0 -2 -8 0 0 0 0 0 0 0 -8 0 8 0 0 -4 -8 2 0 -2 0 0 -1 0 0 0 0 8 0 0 0 -4 0 4 0 0 0 0 -8 0 0 -4 8 0 0 8 0 -8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 -8 8 0 0 0 8 8 0 -4 -4 0 -4 0 0 4 0 8 8 0 0 0 0 4 0 -4 -4 0 -8 0 8 0 8 0 0 0 0 -8 0 0 0 0 8 8 0 0 0 -4 0 8 0 8 0 0 8 0 8 0 0 -8 0 -4 -4 -4 8 4 8 0 8 0 -4 -4 0 0 0 0 0 0 -8 -4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 -8 2 8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 -8 8  [...]
+1 5 8 -6 4 0 8 -4 -4 -12 -4 -12 10 4 8 -4 4 12 -8 -10 1 16 -8 -4 -16 4 4 16 -24 -8 2 8 4 12 -4 8 2 -16 8 -8 -8 -16 12 -4 -8 -4 -4 -16 -8 -8 8 -4 -2 -8 -2 -16 -8 -1 8 -2 -8 -4 -4 16 -8 -8 -4 -6 -4 -4 -4 24 12 16 -8 24 8 -8 16 8 -4 -8 16 0 0 -16 0 16 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 16 0 -24 0 -12 -12 0 -16 4 0 4 8 2 8 4 8 4 0 -24 4 8 0 0 0 0 0 0 8 0 8 0 0 -12 0 8 4 8 0 4 -24 0 0 0 0 -24 0 0 0 0 16 4 -16 -16 0 0 4 0 0 -12 0 0 16 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 -8 -8 12  [...]
+1 5 4 -4 -2 8 16 8 -16 8 -2 0 4 -8 -16 -4 -8 8 -8 4 3 -16 -16 -8 16 -4 8 16 0 -8 -2 -8 12 -8 -8 -24 -2 -16 8 8 8 16 -8 8 -16 8 -4 -16 16 -16 -8 8 -2 -8 -2 16 16 3 8 4 -16 8 -8 16 -16 8 8 16 -24 8 24 16 -8 -16 -24 -16 -8 16 16 8 8 -16 -16 -4 4 -8 8 8 12 16 -4 8 16 -16 4 -16 16 -16 4 8 16 8 16 8 -16 -16 16 -16 -8 16 24 -8 -4 -16 4 -8 -8 12 8 8 -16 8 16 4 -16 -24 -16 8 4 16 8 16 -16 -16 -16 -16 16 -4 -16 8 -16 -16 -16 -8 -16 16 24 -16 16 8 -16 -16 16 -16 16 16 -16 16 -16 16 8 8 8 -8 -4 4 8  [...]
+1 5 0 4 -2 4 0 4 0 0 -2 0 -4 0 -8 0 0 0 -8 -4 -1 -8 -8 0 -8 0 4 0 0 0 2 0 0 -4 0 0 -2 0 0 -4 4 8 -8 0 -8 0 0 -8 -8 8 -8 0 2 0 -2 0 8 -1 -4 0 0 0 -4 -8 0 0 0 0 0 0 -4 0 8 0 0 8 0 0 8 4 0 8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 8 0 -8 -4 0 -4 8 4 8 0 -8 8 -4 -4 0 8 0 -8 0 0 0 8 0 0 0 0 8 -8 0 -8 0 0 0 0 0 0 0 0 -8 -8 0 -4 8 0 0 8 8 0 8 0 0 -8 0 8 0 -4 0 -4 8 4 0 0 -4 0 8 8 0 8 0 0 0 0 0 0 8 0 4 -4 0 0 -8 0 -8 0 8 0 0 0 0 -8 0 0 -4 8 0 8 0 0 2 0 8 -4 4 -8 0 0 0 0 0 0 8 0 0 8 -2 0 - [...]
+1 5 0 0 -2 8 0 0 -8 4 -2 8 -4 8 -8 -8 -4 4 4 -4 -1 0 -8 8 0 0 0 -8 -8 -4 -2 0 0 0 -8 0 2 8 0 0 -8 0 0 0 8 0 0 0 8 0 4 0 -2 0 2 -8 -8 -1 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 8 0 8 -4 -8 0 -8 0 -8 -8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 -8 8 8 0 -8 0 4 4 8 0 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 -8 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 0 0 -8 4 8 0 8 0 8 0 0 -8 0 8 0 0 0 4 4 0 0 4 0 0 0 8 4 0 0 0 0 0 0 -8 0 -4 0 4 0 8 0 8 0 -8 0 0 0 0 0 -8 -8 0 0 4 8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 -8 2 0 0 0 4 - [...]
+1 5 4 -6 0 8 8 4 -4 4 0 -12 2 4 -8 -8 4 -4 -8 -2 1 0 8 -4 0 -4 -4 0 -24 -8 -2 0 4 4 4 -8 -2 0 0 0 0 16 -12 -4 -8 -4 4 0 -8 -8 8 4 2 0 2 0 8 -1 0 6 -8 -4 4 0 8 0 -4 -6 -4 4 4 8 -4 0 8 -8 8 8 -16 0 -4 -8 16 0 0 0 0 -8 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 -16 4 0 8 0 8 -4 -8 -4 0 0 8 -4 12 4 0 8 4 0 -4 8 2 8 4 8 4 4 -8 -4 -8 -16 0 16 0 16 0 -8 0 8 0 0 12 -16 -8 -4 8 -16 4 8 0 0 0 0 -8 16 16 0 0 -8 -4 8 0 0 4 4 0 0 4 0 0 0 -4 4 0 4 0 -6 -8 4 0 -4 4 -4 8 2 8 0 8 0 0 8 -8 -12 0 8 4 -8 -4 -8 8 4 2 -4  [...]
+1 5 4 4 -2 0 -16 0 0 0 -2 0 4 8 -16 12 0 0 0 4 3 0 -16 8 0 -4 0 0 -16 0 6 -8 -4 0 8 8 6 0 -24 0 0 0 8 8 16 8 -4 0 -16 0 0 8 6 -8 6 0 -16 3 0 4 -16 8 0 0 -16 -24 0 0 0 8 0 -16 8 0 8 -16 0 0 0 0 8 16 0 12 4 0 8 0 -4 16 12 8 0 -16 4 0 0 0 4 8 0 8 0 8 0 16 0 16 0 0 0 0 -4 -16 4 8 8 -4 0 8 0 8 -16 4 -16 0 0 0 4 -16 8 -16 0 -16 0 -16 0 12 -16 8 -16 -16 -16 8 0 0 0 0 0 0 -16 0 0 0 0 -16 0 0 0 0 0 8 0 0 -4 4 8 -4 8 8 0 0 0 4 8 4 8 4 4 -16 8 -4 0 0 8 -16 4 16 12 16 16 -8 -16 -16 8 0 0 0 0 0 -16 - [...]
+1 5 0 4 2 0 -16 0 0 0 2 0 4 0 0 0 0 0 0 4 3 0 0 0 0 -4 0 0 -16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 -8 0 8 -4 0 16 0 0 8 2 -8 2 0 16 3 0 -4 0 -8 0 0 0 0 0 -16 0 -8 0 -16 0 0 0 0 0 0 0 0 8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 -4 0 0 0 -4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 8 0 -8 16 -4 0 0 0 0 0 -16 8 16 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 -16 0 0 0 0 0 8 0 0 4 0 8 12 0 0 0 0 0 0 -8 -4 -8 -4 -4 16 8 12 0 0 -8 16 -4 0 -4 0 0 -8 0 0 0 0 0 0 0 0 0 -16 8 2 8 0 0 0 0 0 -4 -8 -8 0 -12 0  [...]
+1 5 4 -2 0 4 0 0 -4 0 0 -4 2 4 -8 0 0 0 -4 -2 1 0 8 -4 0 -4 0 0 0 -4 2 0 -4 0 -4 0 2 0 -8 -4 -4 0 4 -4 0 4 4 0 -8 0 4 4 -2 0 -2 0 -8 -1 4 -2 0 -4 0 0 0 8 0 2 0 -4 0 -16 4 0 0 -8 4 0 0 4 4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 8 0 8 0 0 0 0 -4 0 8 4 -4 -4 0 4 -4 -8 4 8 2 0 0 0 0 -4 16 -4 8 8 0 -8 0 -8 0 0 0 0 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 16 -8 -8 -8 -8 -4 -4 4 4 0 -4 -4 0 0 -4 8 8 -4 4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 -16 4 -2 4 4 4 4 4 4 4 -4 -4 8 4 0 -2 [...]
+1 5 -4 4 6 0 -16 0 0 0 6 0 4 -8 16 -12 0 0 0 4 3 0 16 -8 0 12 0 0 -16 0 -2 -8 -4 0 -8 -8 -2 0 -8 0 0 0 -8 8 -16 8 12 0 -16 0 0 8 -2 -8 -2 0 -16 3 0 4 16 8 0 0 16 -8 0 0 0 8 0 -16 -8 0 -8 16 0 0 0 0 8 -16 0 -4 4 0 24 0 -4 -16 -4 24 0 16 4 0 0 0 4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 12 16 -4 -8 -8 -4 0 8 0 8 -16 4 16 0 0 0 -4 -16 8 -16 0 16 0 -16 0 -4 16 24 16 -16 16 -8 0 0 0 0 0 0 16 0 0 0 0 -16 0 0 0 0 0 8 0 0 12 -4 8 -4 24 -8 0 0 0 -4 8 4 8 4 4 -16 8 -4 0 0 8 -16 4 -16 -4 -16 -16 -8 16 16 -8  [...]
+1 5 -4 8 2 0 -8 0 0 -4 2 8 -4 -8 8 -4 -4 -4 12 -4 -1 -8 8 -8 8 0 0 0 -24 -4 2 0 0 8 0 0 -2 0 0 -8 8 -8 0 -8 0 0 0 -8 8 0 12 0 2 0 -2 0 -8 -1 -8 0 -8 8 -8 8 8 0 -4 -8 4 8 0 8 8 0 0 -8 -4 8 -8 8 0 0 -16 0 0 4 -8 0 -4 0 0 8 -8 8 0 -8 0 -8 0 8 0 -8 8 0 16 0 -8 0 -8 8 0 4 -4 -8 4 0 8 4 0 0 16 8 8 -8 -8 4 0 -4 4 8 0 -8 0 0 0 0 8 0 8 8 -8 0 0 0 0 8 0 0 8 -4 -8 -8 0 -8 0 8 0 8 16 -8 0 0 0 4 -4 4 0 4 -8 8 16 -8 4 4 8 0 -8 0 0 -8 0 -4 -8 4 8 8 -8 0 0 0 0 0 8 -8 0 0 8 0 0 -4 -8 8 0 2 0 8 -8 8 12 -4 [...]
+1 5 -4 8 2 0 -8 0 8 4 2 -8 -4 -8 8 -4 4 4 -4 -4 -1 -8 8 -8 -8 0 0 0 -8 12 2 0 0 -8 0 0 -2 -16 0 8 -8 8 0 8 0 0 0 -8 8 0 -4 0 2 0 -2 0 -8 -1 8 8 -8 -8 8 -8 8 0 4 0 -4 -8 0 8 8 -16 0 -8 12 -8 8 -8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 8 8 -8 0 -8 0 -8 0 8 -8 0 0 0 8 0 8 -8 0 4 -4 -8 4 0 8 4 0 0 0 -8 8 0 -8 -4 0 4 4 8 0 -8 16 0 16 0 -8 0 8 8 -8 0 0 0 16 -8 0 0 -8 4 -8 -8 0 -8 0 8 16 -8 0 8 0 0 0 4 -4 4 0 4 -8 8 0 8 4 4 -8 0 8 0 8 -8 0 -4 8 -4 -8 8 0 0 0 0 0 0 8 -8 0 0 -8 0 0 4 -8 8 0 2 0 8 8 -8 -4 12 [...]
+1 5 -4 4 2 4 -8 -4 0 8 2 0 -4 0 8 -12 0 8 -8 -4 -1 0 8 0 0 0 -4 -8 -16 8 -2 0 0 -4 -8 0 2 8 0 12 -4 -16 8 8 0 0 0 0 -8 8 -8 0 -2 0 2 -8 8 -1 12 -8 8 -8 -4 0 -8 0 -8 0 0 8 4 8 0 8 0 -8 8 0 -16 -4 0 0 -8 0 0 0 8 4 4 0 0 -8 0 -8 -8 0 -8 0 0 -8 -8 8 16 0 8 0 0 0 -4 0 4 0 -4 -8 4 8 0 -4 4 0 8 8 -8 0 8 0 8 -8 4 8 0 8 -8 0 -8 0 16 0 -8 -8 8 0 0 8 -8 0 4 8 16 -8 -8 0 -8 0 -8 8 -8 16 8 0 4 0 4 0 -4 4 0 -4 8 0 8 0 0 4 -8 0 8 0 -8 8 0 4 -4 0 8 -8 0 0 0 0 0 0 -8 8 8 -8 0 4 8 -8 -8 8 0 -2 0 0 12 -4 - [...]
+1 5 -4 4 2 4 -8 4 0 -8 2 8 -4 0 8 -12 0 -8 8 -4 -1 0 8 0 -16 0 4 -8 0 -8 -2 0 0 4 -8 0 2 -8 0 -4 12 0 8 -8 0 0 0 0 -8 -8 8 0 -2 0 2 -8 8 -1 -4 0 8 8 4 -16 -8 0 8 8 0 -8 -4 8 0 -8 0 -8 -8 0 0 12 0 0 8 0 0 0 8 4 4 0 0 -8 16 -8 0 0 -8 0 0 8 -8 -8 0 0 -8 0 16 0 4 0 -4 0 -4 -8 4 8 0 -4 4 0 -8 -8 -8 8 8 0 -8 8 4 8 0 8 8 0 8 0 0 0 -8 -8 8 0 0 8 8 0 -4 -8 0 8 -8 0 -8 0 -8 8 8 0 -8 16 4 0 4 0 -4 4 0 -4 8 0 -8 16 0 4 8 0 -8 0 0 8 0 4 4 0 -8 -8 8 0 0 0 0 0 -8 8 8 -8 0 -4 -8 8 -8 8 0 -2 0 0 -4 12 8  [...]
+1 5 0 -2 4 4 -8 0 -4 0 -4 -4 2 -4 16 -4 0 0 4 -2 1 0 -16 4 -8 4 0 0 0 4 -2 -8 -4 0 4 0 -2 -8 0 4 4 -8 -4 4 0 -4 -4 0 0 0 -4 4 2 8 2 0 0 -1 -4 -2 -8 4 0 8 -8 0 0 2 0 -4 0 -8 -4 8 0 0 -4 0 8 -4 -4 0 8 0 0 4 0 -4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 0 4 4 0 4 4 0 4 0 2 8 0 0 0 0 8 -4 0 0 0 0 0 0 0 8 0 8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 -4 4 4 0 0 4 0 0 4 0 0 -4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 -8 -8 -4 0 0 0 0 0 0 -8 4 2 -4 -4 -4 -4 -4 -4 -4 4 4 0 4 8 -2 8 0 [...]
+1 5 0 6 0 0 0 -4 -12 0 0 12 -6 -12 0 12 0 0 12 6 -3 -24 0 12 24 0 4 0 0 -12 6 0 0 -12 -12 0 -6 0 0 0 0 -24 -12 -12 24 -12 0 24 0 -24 -12 -12 -6 0 6 0 0 3 0 -6 0 12 -12 -24 0 0 0 -6 0 12 12 0 12 0 0 0 12 0 24 0 12 -24 0 -12 4 -12 0 0 0 0 12 0 -24 0 6 -24 0 24 -4 -12 0 12 -24 12 0 24 24 -24 12 0 -12 12 0 0 0 12 -12 0 0 -12 0 -12 0 6 0 0 24 0 0 0 12 0 0 0 0 0 24 -12 0 0 0 0 0 12 0 0 -12 24 -24 0 0 24 0 -24 0 0 0 24 0 -24 0 12 0 -12 0 0 -12 0 0 -12 0 24 12 0 -12 4 12 -4 6 0 12 0 12 0 -12 0 6 [...]
+1 5 0 2 0 4 0 0 -4 4 0 -4 -6 -4 0 4 -4 -4 -8 6 -3 -16 0 4 0 0 0 -8 8 8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 -4 12 -8 -4 0 16 0 0 8 -12 -2 0 2 8 0 3 -4 2 0 -12 0 0 0 0 -4 2 -12 -4 0 0 4 8 0 0 -8 -8 0 4 4 8 -8 4 -4 -8 0 4 0 0 -4 0 0 0 -2 16 -8 -16 4 12 8 -12 0 4 8 -8 0 8 0 8 0 8 0 0 0 4 -4 0 -4 -4 -8 4 0 -2 0 12 0 4 0 0 12 0 -8 0 8 0 0 4 0 0 0 0 0 4 -8 8 0 0 0 4 0 -16 8 16 -8 0 8 0 -8 0 4 12 -4 -8 0 0 -4 0 0 -4 8 0 8 0 12 -4 -12 4 -2 0 4 0 0 12 4 0 -2 8 -4 -8 0 0 0 0 -4 8 -8 0 0 -4 0 0 -12 -2 4 4 - [...]
+1 5 0 -2 0 8 0 4 -4 0 0 -4 -6 4 0 -4 0 0 4 6 -3 -8 0 -4 -8 0 -4 -16 0 -4 -2 0 0 -4 4 0 2 0 0 -8 8 8 4 -12 -8 4 0 8 0 -8 -4 -12 2 0 -2 16 0 3 8 2 0 12 -4 8 0 0 0 2 0 -4 -12 0 -4 0 0 0 4 0 -8 -8 -4 8 0 4 4 -4 0 8 0 0 -4 0 8 0 -2 -8 16 8 -4 -12 -16 12 8 -4 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 -8 4 0 4 0 -2 0 0 8 0 0 0 12 0 0 0 0 0 -8 4 0 0 0 0 0 -4 0 0 12 8 8 0 0 8 -16 -8 16 0 0 -8 0 8 8 12 -8 -4 0 0 4 0 0 4 0 -8 4 0 -12 4 12 -4 -2 0 -4 0 4 0 4 0 -2 8 -4 -8 0 0 0 0 4 16 0 -12 -8 0 0 0 -12 2 -4 - [...]
+1 5 0 -6 0 12 0 0 -4 12 0 -12 -6 12 0 -12 4 -12 0 6 -3 0 0 -12 0 0 0 -24 -24 0 -6 0 0 0 12 0 6 24 0 12 -12 0 12 12 24 12 0 0 0 0 0 -12 6 0 -6 24 0 3 -12 -6 0 -12 0 0 0 0 -12 -6 12 12 0 0 -12 -24 0 0 0 -24 0 12 -12 -24 24 -12 -4 0 0 12 0 0 12 0 0 0 6 0 -24 0 4 12 24 -12 0 -12 -24 24 0 -24 0 24 0 0 0 0 0 -12 12 0 -12 12 24 -12 0 6 0 -12 0 12 0 0 12 0 24 0 -24 0 0 -12 0 0 0 0 0 -12 24 24 0 0 0 12 0 0 24 0 -24 0 -24 0 24 0 12 12 -12 0 0 0 12 0 0 12 -24 0 0 0 12 -4 -12 4 6 0 -12 0 0 -12 -12 0 [...]
+1 3 4 2 0 -8 8 -4 4 -4 0 -4 6 -4 -8 -8 4 -4 8 6 1 0 -8 -4 -16 -4 -4 0 8 8 -2 0 4 4 -12 -8 -2 16 0 0 0 0 -4 4 8 4 -4 0 -8 8 8 -4 -2 0 -2 0 8 1 0 2 -8 4 -4 -16 8 0 4 -2 4 -4 -4 8 4 16 -8 -8 8 -8 0 0 4 8 0 0 0 0 0 8 0 0 0 0 -16 8 2 0 0 0 0 4 0 4 0 4 16 8 16 8 -4 -8 -4 0 0 -8 -4 -4 4 0 -8 4 -16 -4 -8 -6 -8 4 8 4 4 8 -4 8 0 0 0 0 0 0 -8 0 8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 16 16 -8 4 8 0 0 -4 -4 0 0 -4 -16 -16 0 4 -4 0 -4 0 -2 -8 -4 0 4 -4 4 8 6 -8 0 -8 0 0 -8 8 4 0 8 4 -8 -4 8 -8 4 2 -4  [...]
+1 3 0 10 -4 -8 8 -4 12 -4 -4 -4 -2 -4 -8 -4 4 -4 0 -2 1 16 -8 -4 0 4 -4 -16 8 0 2 -8 4 4 -4 -8 2 0 8 0 0 0 4 4 -8 4 4 16 8 -8 0 4 2 -8 2 -16 8 1 0 2 -8 4 12 0 -8 8 -12 6 4 4 -4 -8 4 0 -8 8 0 8 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 12 8 -4 8 0 8 8 4 4 0 8 4 0 4 8 2 -8 4 -8 -12 -8 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 4 8 0 12 -8 0 0 0 0 8 0 0 0 0 8 -4 -8 8 0 8 -4 0 0 -4 0 0 -8 -8 -4 0 -4 0 -2 -8 -4 0 -12 -4 -4 -8 -2 8 0 8 0 8 8 8 -4 16 -8 4 8 12 -8 8 -4 -2 -4 -4 [...]
+1 3 4 4 -2 -8 16 -8 0 -8 2 16 4 -8 -16 -12 -8 8 8 -4 3 16 16 8 -16 -4 8 -16 0 8 -2 -8 12 -8 8 -24 -2 16 8 -8 -8 -16 -8 8 -16 8 4 -16 16 16 -8 8 2 8 2 16 16 -3 8 4 -16 8 8 16 -16 -8 -8 -8 24 8 -24 16 -8 -16 24 -16 -8 -16 16 8 8 -16 -16 -4 4 8 8 -8 12 16 -4 8 -16 16 -4 16 -16 16 4 -8 -16 -8 -16 -8 16 16 -16 16 -8 16 24 8 -4 16 4 8 8 12 -8 -8 16 -8 -16 -4 16 -24 -16 8 4 -16 -8 -16 16 -16 16 -16 -16 4 -16 -8 -16 16 16 -8 -16 -16 -24 16 16 -8 -16 -16 16 -16 16 16 -16 16 -16 16 8 8 8 -8 4 -4 8 [...]
+1 3 8 -6 4 -8 8 -4 -12 -12 4 -20 -2 4 8 12 -4 -12 0 -2 1 -16 8 4 0 4 -4 -16 8 0 2 8 4 -12 4 8 2 0 8 0 0 0 -4 4 8 4 4 -16 8 -8 0 4 2 8 2 -16 8 1 0 2 8 4 -4 0 8 8 -4 6 -4 4 -4 -8 -4 0 8 -8 0 -8 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 -4 -8 -4 -8 0 -8 0 -4 -4 0 8 4 0 4 8 2 8 -4 -8 -4 0 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 8 -4 -8 -8 0 0 -4 0 0 4 0 0 8 0 -4 0 -4 0 -2 -8 -4 0 4 4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 4 16 8 4 8 4 8 8 -4 -2 -4 4 0 0 0 0 - [...]
+1 3 4 -2 0 -4 -16 0 -4 0 0 -4 6 4 -8 8 0 0 4 6 1 0 -8 4 0 -4 0 0 -16 4 2 0 -4 0 4 0 2 0 -8 4 4 0 4 4 0 -4 -4 0 8 0 4 -4 2 0 2 0 8 1 4 2 0 4 0 0 0 -8 0 -2 0 4 0 0 4 0 0 -8 4 0 0 4 -4 0 0 0 0 -4 0 4 0 0 0 0 8 0 2 0 0 0 0 4 0 4 -8 -4 -8 0 -8 0 0 0 0 4 0 -8 4 4 4 0 -4 -4 8 4 8 2 0 0 0 0 -4 0 -4 8 -8 0 8 0 8 0 0 0 0 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 -8 -8 -8 -8 -4 4 4 4 0 4 4 0 0 -4 8 8 -4 -4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 0 4 -2 4 -4 -4 -4 -4 -4 4 -4 -4 8 4 0 -2 0 [...]
+1 3 0 -2 4 -4 -8 0 -4 0 4 -4 6 -4 0 -4 0 0 -4 6 1 0 0 -4 8 4 0 0 0 -4 -2 -8 -4 0 -4 0 -2 8 0 -4 -4 8 -4 -4 0 4 4 0 0 0 -4 -4 -2 -8 -2 0 0 1 -4 2 8 -4 0 8 8 0 0 -2 0 4 0 -8 -4 8 0 16 -4 0 8 -4 4 0 8 0 0 -4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 16 0 -4 -4 0 -4 4 0 4 0 2 8 0 0 0 0 -8 -4 0 0 0 0 0 0 0 -8 0 -8 0 0 4 0 0 0 0 0 0 -16 0 0 0 0 8 0 0 0 0 -4 4 4 4 0 0 -4 0 0 4 0 0 -4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 -8 -8 4 0 0 0 0 0 -16 8 4 2 -4 4 4 4 4 4 -4 4 4 0 4 -8 - [...]
+1 3 0 6 0 -8 0 -4 4 0 0 -12 -2 -4 0 4 0 0 4 -2 -3 -8 0 -4 -8 0 -4 16 0 -4 -2 0 0 -4 4 0 2 0 0 8 -8 8 -4 -4 8 12 0 -8 0 8 4 -4 -2 0 2 16 0 -3 8 6 0 4 4 -8 0 0 0 6 0 -12 12 0 4 0 0 0 -4 0 8 -8 -12 -8 0 4 4 -4 0 -8 0 0 -4 0 8 0 6 -8 -16 8 -4 4 16 -4 8 12 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 8 -12 0 -12 0 6 0 0 8 0 0 0 -4 0 0 0 0 0 -8 -4 0 0 0 0 0 4 0 0 -12 -8 -8 0 0 -8 -16 8 16 0 0 8 0 -8 8 4 -8 4 0 0 12 0 0 -4 0 8 -4 0 -4 -4 4 4 -6 0 -12 0 -4 0 12 0 -6 -8 4 8 0 0 0 0 4 -16 0 -12 -8 0 0 0 4 2 12 [...]
+1 3 0 2 0 -4 0 0 -4 -4 0 -4 -2 -4 0 4 -4 -4 0 -2 -3 0 0 -4 0 0 0 8 -8 0 2 0 0 0 4 0 -2 8 0 -4 4 0 -4 4 -8 4 0 0 0 0 0 -4 2 0 -2 8 0 -3 -4 -2 0 -4 0 0 0 0 4 -2 12 4 0 0 4 8 0 0 0 8 0 4 -4 8 -8 4 -4 0 0 -4 0 0 -4 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 -8 8 0 -8 0 8 0 0 0 0 0 -4 4 0 4 -4 8 4 0 -2 0 12 0 4 0 0 -4 0 8 0 -8 0 0 -4 0 0 0 0 0 4 -8 -8 0 0 0 -4 0 0 8 0 -8 0 8 0 -8 0 4 4 -4 0 0 0 4 0 0 -4 8 0 0 0 4 4 -4 -4 2 0 -4 0 0 -12 -4 0 2 8 4 -8 0 0 0 0 4 -8 -8 0 0 -4 0 0 4 -2 4 -4 4 -4 0 0 0 4 -4 0 0  [...]
+1 3 0 2 0 -4 0 0 4 -12 0 -4 -2 4 0 -4 4 -12 0 -2 -3 0 0 4 0 0 0 8 8 0 -6 0 0 0 -4 0 6 -8 0 -4 4 0 4 4 8 4 0 0 0 0 0 -4 -6 0 6 8 0 -3 -4 -2 0 -4 0 0 0 0 12 -2 -12 4 0 0 -4 -8 0 0 0 24 0 4 -4 -8 8 -12 -4 0 0 -4 0 0 12 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 8 -8 0 8 0 24 0 0 0 0 0 4 -4 0 4 -4 -8 4 0 -2 0 -12 0 12 0 0 -4 0 -8 0 8 0 0 12 0 0 0 0 0 -4 8 -24 0 0 0 -12 0 0 8 0 -8 0 -8 0 8 0 4 4 -4 0 0 0 4 0 0 4 -8 0 0 0 4 4 -4 -4 2 0 -4 0 0 12 -4 0 2 -8 -12 8 0 0 0 0 -4 -8 -24 0 0 -12 0 0 4 6 4 4 4 -4 0 0 [...]
+1 3 0 -2 0 0 0 -4 -4 0 0 -4 -2 4 0 -4 0 0 -4 -2 -3 8 0 4 8 0 -4 0 0 4 -2 0 0 -4 -4 0 2 0 0 0 0 -8 4 -4 -8 -4 0 8 0 8 -4 -4 -2 0 2 0 0 -3 0 -2 0 4 4 8 0 0 0 -2 0 4 12 0 -4 0 0 0 4 0 -8 0 4 8 0 4 4 4 0 0 0 0 -4 0 -8 0 -2 8 0 -8 -4 4 0 -4 -8 -4 0 8 8 -8 4 0 12 -4 0 0 0 4 -4 0 0 4 0 4 0 -2 0 0 8 0 0 0 -4 0 0 0 0 0 8 -4 0 0 0 0 0 -4 0 0 -12 -8 8 0 0 8 0 -8 0 0 0 -8 0 8 0 4 0 -4 0 0 -4 0 0 4 0 -8 4 0 -4 -4 4 4 2 0 4 0 -4 0 -4 0 2 8 4 -8 0 0 0 0 -4 0 0 -12 -8 0 0 0 4 2 -4 4 0 0 4 -4 0 -4 4 0 0  [...]
+1 3 4 -4 2 -4 0 -4 0 -8 -2 0 4 0 0 -4 0 8 0 -4 -1 0 0 0 -8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 -8 0 0 0 8 0 0 0 8 0 -8 2 0 -2 -8 0 1 4 0 0 0 -4 8 0 0 8 0 0 0 4 0 0 0 0 0 0 0 8 4 -8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 -8 0 0 8 0 4 0 -4 0 -4 0 -4 0 0 -4 -4 8 0 0 0 0 0 0 -8 -8 -4 0 8 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 4 8 -8 8 0 0 -8 0 -8 0 0 -8 0 -8 4 -8 4 0 4 4 -8 4 8 0 0 -8 0 4 0 0 0 0 0 0 8 -4 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 -4 -8 -8 0 0 8 -2 8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 -8 0  [...]
+1 3 4 -6 0 0 8 4 -12 4 0 -4 6 -12 -8 0 -4 4 0 6 1 0 -8 -12 16 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 -16 0 8 8 0 4 4 8 4 -4 0 8 -8 0 -4 -2 0 -2 0 -8 1 8 -6 8 4 4 16 -8 0 -4 6 -4 -4 4 8 -4 -16 -8 -8 0 8 0 8 4 8 0 0 0 -8 0 0 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 16 4 0 8 0 8 4 8 4 8 0 -8 -4 4 -4 0 0 4 0 -4 8 2 8 -4 -8 -4 4 8 -4 -8 16 0 -16 0 -16 0 8 0 -8 0 0 -4 -16 -8 -4 8 -16 4 8 0 0 0 0 -8 16 16 0 0 0 4 0 8 0 -4 -4 0 0 4 0 0 -8 4 -4 0 -4 0 6 8 -4 0 -4 4 4 -8 -2 -8 0 -8 0 0 8 -8 -4 0 -8 -4 8 4 8 -8 4 2 -4 [...]
+1 3 0 6 -4 -4 0 0 4 0 -4 -4 -2 -4 -8 4 0 0 -4 -2 1 0 -8 -4 0 4 0 0 0 -4 -2 8 -4 0 4 0 -2 0 0 4 4 0 4 4 0 -4 4 0 -8 0 -4 4 -2 8 -2 0 8 1 4 -6 0 4 0 0 16 0 0 -2 0 -4 0 0 -4 0 0 8 -4 0 0 4 -4 0 0 0 0 4 0 4 0 0 0 0 8 16 -6 0 0 0 0 4 0 4 -8 -4 8 0 -8 0 0 0 0 -4 0 8 0 4 -4 0 -4 -4 -8 -4 -8 2 0 0 0 0 0 0 4 8 8 0 -8 0 8 0 -16 0 0 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 -8 8 -8 -4 -4 4 -4 0 0 4 0 0 4 -8 8 4 0 -4 0 -4 0 6 -8 4 0 0 0 4 8 -2 0 0 0 0 -8 -16 0 -4 0 0 0 0 0 -8 0 -4 2 4 4 -4 -4 4 4 -4 -4 -4  [...]
+1 3 0 -2 -4 4 0 0 -4 0 -4 4 -2 4 -8 -4 0 0 4 -2 1 0 -8 4 0 4 0 0 0 4 -2 8 -4 0 -4 0 -2 0 0 -4 -4 0 -4 4 0 -4 4 0 8 0 4 4 -2 8 -2 0 -8 1 -4 2 16 4 0 0 0 0 0 -10 0 -4 0 0 4 0 0 8 4 0 0 -4 -4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 -8 0 8 0 0 0 0 4 0 8 0 -4 4 0 4 -4 8 -4 8 -6 16 0 0 0 0 0 4 -8 -8 0 8 0 -8 0 0 0 -16 0 0 4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 8 -8 8 4 -4 -4 4 0 0 4 0 0 -4 8 -8 -4 0 -4 0 -4 0 -2 8 4 0 0 0 4 -8 6 0 0 0 0 -8 0 -16 4 0 0 0 0 0 -8 0 -4 2 4 -4 4 4 -4 -4 -4 -4 -4  [...]
+1 3 4 -4 -2 0 0 0 0 0 2 0 4 0 -16 -4 0 0 0 -4 3 0 16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 8 0 -8 4 0 0 0 0 8 2 -8 2 0 0 -3 0 -4 16 8 0 0 16 8 0 0 0 -8 0 0 0 0 8 -16 0 0 0 0 -8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 -16 4 0 0 0 4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 -4 16 4 0 0 -4 0 8 0 8 0 4 -16 0 0 0 4 0 -8 0 0 16 0 16 0 4 16 8 16 -16 -16 0 0 0 0 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 8 0 0 4 -4 -8 4 8 0 0 0 0 -4 8 -4 8 -4 -4 0 -8 4 0 0 -8 0 -4 0 4 0 -16 8 -16 -16 0 0 0 0 0 0 16 0 -8 -2 8 0 0 0 0 0 -4 -8 [...]
+1 3 -4 2 0 0 0 -4 -4 4 0 4 -2 -4 0 -8 -4 4 0 -2 1 0 0 -4 8 -4 -4 0 -8 0 -2 0 4 4 -4 8 -2 8 0 0 0 -8 4 -4 8 -4 -4 0 0 8 0 4 -2 0 -2 0 0 1 0 2 0 -4 -4 8 0 0 -4 6 -4 4 -4 0 4 8 8 0 0 8 -8 0 -4 8 -8 0 0 0 0 0 0 0 0 0 8 0 2 0 0 0 0 -4 0 -4 8 -4 8 8 -8 8 -4 8 -4 0 0 0 4 4 4 0 0 -4 -8 4 0 2 0 -4 8 -4 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 0 0 -4 8 -8 4 -8 -8 4 0 0 0 0 0 0 -8 8 8 -8 0 -4 0 0 0 4 4 0 0 -4 -8 8 0 -4 4 0 4 0 -2 0 4 0 4 4 -4 0 -2 -8 0 -8 0 0 0 0 -4 0 -8 4 -8 4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 [...]
+1 3 -4 2 0 0 0 4 4 -4 0 -4 -2 -4 0 -8 4 -4 0 -2 1 0 0 -4 -8 -4 4 0 8 0 -2 0 4 -4 -4 8 -2 -8 0 0 0 8 4 -4 8 -4 -4 0 0 -8 0 4 -2 0 -2 0 0 1 0 2 0 -4 4 -8 0 0 4 6 4 4 4 0 4 -8 8 0 0 -8 8 0 -4 8 8 0 0 0 0 0 0 0 0 0 -8 0 2 0 0 0 0 -4 0 -4 -8 -4 -8 8 8 8 4 -8 4 0 0 0 4 4 4 0 0 -4 8 4 0 2 0 4 -8 4 -4 0 4 0 8 0 -8 0 8 0 0 0 0 0 0 -4 -8 8 -4 8 8 -4 0 0 0 0 0 0 8 -8 -8 8 0 -4 0 0 0 4 4 0 0 -4 8 -8 0 -4 4 0 4 0 -2 0 4 0 -4 -4 -4 0 -2 -8 0 -8 0 0 0 0 -4 0 8 -4 8 -4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 - [...]
+1 3 0 -4 2 0 0 0 0 0 -2 0 4 -8 0 -8 0 0 0 -4 3 0 0 8 0 -4 0 0 0 0 -6 -8 4 0 8 0 -6 0 0 0 0 0 -8 -8 16 -8 4 0 0 0 0 8 6 8 6 0 0 -3 0 4 0 -8 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 0 -8 16 0 12 -4 0 0 0 -4 0 12 0 0 0 -4 0 0 0 -4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 4 0 0 8 8 -4 0 8 0 -8 0 -4 0 0 0 0 0 0 -8 0 0 0 0 16 0 -12 0 0 0 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 -8 4 0 -8 0 0 0 0 -8 4 -8 4 4 0 -8 4 0 0 8 0 4 16 -12 16 0 -8 0 0 8 0 0 0 0 0 0 0 -8 -6 8 8 0 0 0 0 -4 8 8 0 4 0 -4 0 0 - [...]
+1 3 0 10 -4 -8 -8 -4 4 4 -4 -4 -2 -4 -8 12 -4 4 0 -2 1 0 -8 -4 0 4 -4 0 -8 -16 2 -8 4 4 12 8 2 0 -8 16 0 0 4 4 8 4 4 0 -24 -8 0 4 2 -8 2 0 8 1 16 10 8 4 12 0 -24 -8 12 -2 -4 4 -4 8 -12 0 8 8 -16 -8 0 0 4 8 0 0 0 8 0 8 0 0 0 0 -16 -24 10 16 16 -16 0 4 -16 4 16 4 -16 8 16 8 12 -8 -4 -8 0 8 -8 4 -12 0 -8 4 16 4 -24 -6 8 -4 -8 12 8 8 4 8 -16 0 16 0 -16 0 24 0 -8 0 0 -4 16 8 4 8 -16 -12 -8 16 16 -16 -16 -8 -16 16 -16 16 -8 -4 8 -8 0 -8 -4 0 0 12 16 -16 8 8 -4 0 -4 0 -10 -8 -4 0 -12 4 -4 24 6  [...]
+1 3 -4 6 0 -4 -8 0 4 0 0 -4 -2 -4 0 0 0 0 4 -2 1 0 0 -4 8 -4 0 0 -16 4 2 0 -4 0 4 0 2 -8 8 -4 -4 8 4 -4 0 4 -4 0 16 0 4 4 2 0 2 0 0 1 -4 2 -8 -4 0 8 8 8 0 -10 0 -4 0 8 -4 -8 0 0 4 0 8 -4 4 0 -8 0 0 4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 -4 4 -4 0 -4 4 0 -4 16 -6 -8 0 0 0 4 8 4 0 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 -4 4 -4 0 -4 -4 0 0 4 0 0 4 4 4 0 4 0 -2 0 -4 0 0 0 4 -16 6 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 -8 -4 -2 -4 4 4 4 -4 -4 4 4 4 -8 4 -8  [...]
+1 3 0 4 -2 -4 0 -4 -8 0 2 8 -4 -8 -8 8 0 0 0 4 -1 -8 8 8 8 0 4 0 0 -8 2 0 0 -4 -8 0 -2 0 0 4 -4 -8 0 0 8 0 0 8 -8 -8 0 0 -2 0 2 0 8 1 -4 0 0 0 4 -8 0 0 0 0 0 0 4 0 0 0 0 8 8 0 8 4 0 -8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 8 0 -8 -4 0 -4 0 4 -8 0 0 0 -4 4 0 -8 0 8 0 0 0 8 0 0 0 0 -8 8 0 8 0 0 0 0 0 0 0 0 0 -8 0 4 -8 0 0 8 -8 0 -8 0 0 -8 0 8 0 -4 0 -4 0 -4 0 0 4 0 0 8 0 0 0 0 0 0 0 0 8 0 -4 4 0 0 -8 0 8 0 -8 0 0 0 0 0 0 0 -4 8 0 -8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 -8 -2 0 -8  [...]
+1 3 0 2 -4 0 -8 4 4 -4 -4 -4 -2 4 -8 4 4 -4 -8 -2 1 0 -8 4 0 4 4 0 -8 8 2 -8 4 -4 4 8 2 0 -8 -8 8 0 -4 4 8 4 4 0 -8 8 -8 4 2 -8 2 0 -8 1 -8 2 -8 4 -12 0 -8 -8 -12 6 4 4 4 8 -4 0 8 8 8 8 0 8 4 8 0 0 0 0 0 0 0 0 0 0 0 -8 2 -16 -16 16 0 4 16 4 0 4 0 8 0 8 -12 8 4 0 0 8 -8 -4 -4 0 0 4 0 4 -8 2 -8 4 8 -12 8 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 -4 -8 0 12 -8 -16 -16 16 16 -8 0 0 0 0 0 -4 0 0 0 -8 -4 0 0 4 0 0 0 8 -4 0 -4 0 -2 8 -4 0 12 -4 -4 8 -2 -8 0 -8 0 8 8 8 4 0 -8 -4 -8 12 -8 -8 -4 -2 -4 4 [...]
+1 3 0 0 -2 0 0 0 0 -4 2 0 -4 0 -8 0 -4 4 -4 4 -1 0 8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 8 0 -8 0 0 0 8 0 4 0 2 0 -2 8 -8 1 8 0 0 0 0 0 0 0 -4 0 -4 0 0 0 -8 8 0 8 -4 8 0 0 0 8 -8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 -8 -8 8 0 -8 0 -4 4 -8 0 -8 8 4 8 0 0 0 -8 0 0 4 0 4 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 8 0 8 0 0 -8 -4 8 0 -8 0 -8 0 0 -8 0 8 -8 0 -8 4 -4 0 0 -4 0 -8 0 8 4 0 0 0 0 0 0 -8 0 4 0 -4 0 8 0 -8 0 8 0 0 0 0 -8 -8 -8 0 0 4 -8 0 0 -2 0 8 -8 0 -4 4 0 0 0 0 0 0 0 -8 8 2 0  [...]
+1 3 12 -12 6 -8 16 -8 0 -24 -6 -16 4 8 16 -4 8 24 -8 -4 3 -16 -16 -8 -16 12 8 -16 -32 -8 6 24 12 24 -8 24 6 -16 24 -8 -8 -16 8 8 16 8 -12 16 16 -48 8 8 -6 -24 -6 16 16 -3 8 4 16 8 -24 16 16 -24 -24 -8 -24 8 -24 16 8 16 -24 16 8 -48 16 8 8 16 16 12 4 -8 24 -8 12 48 12 24 -16 -16 -4 -16 -16 -16 4 -8 -16 -8 -16 -8 -16 -16 -16 -16 24 48 24 -8 12 -16 12 -8 -8 12 -8 -8 -16 -8 -16 -4 -16 24 48 24 12 -16 -8 -16 -16 16 -16 48 -16 -12 16 -24 16 -48 -16 8 16 -48 -24 -48 16 -24 16 16 16 16 16 16 16  [...]
+1 3 0 -2 0 0 0 4 -4 0 0 -12 -2 -4 0 4 0 0 -4 -2 -3 8 0 -4 -8 0 4 0 0 4 6 0 0 -12 4 0 -6 0 0 0 0 8 -4 -4 8 -4 0 8 0 24 -4 -4 6 0 -6 0 0 -3 0 -2 0 4 12 -8 0 0 0 -2 0 4 -12 0 4 0 0 0 4 0 8 0 4 -8 0 -12 4 4 0 0 0 0 12 0 8 0 -2 8 0 -8 -4 4 0 -4 8 -4 0 -8 -8 8 12 0 -12 -4 0 0 0 -4 4 0 0 4 0 4 0 -2 0 0 24 0 0 0 -4 0 0 0 0 0 -8 12 0 0 0 0 0 4 0 0 12 -24 -8 0 0 8 0 -8 0 0 0 8 0 -8 0 4 0 -4 0 0 -4 0 0 -4 0 8 4 0 -4 -4 4 4 2 0 4 0 -12 0 -4 0 2 -8 -12 8 0 0 0 0 4 0 0 12 -24 0 0 0 4 -6 -4 -4 0 0 4 -4 [...]
+1 3 0 -6 0 4 0 0 -12 -4 0 4 -2 4 0 -4 -4 -4 8 -2 -3 16 0 4 0 0 0 -8 8 -8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 4 4 8 -12 0 16 0 0 8 -4 2 0 -2 -8 0 -3 4 6 0 -4 0 0 0 0 4 6 12 -12 0 0 -4 -8 0 0 -8 8 0 -4 12 -8 8 4 -4 8 0 4 0 0 -4 0 0 0 6 -16 -8 16 4 -4 8 4 0 -12 8 -8 0 8 0 8 0 -8 0 0 0 4 -4 0 -4 12 -8 -12 0 6 0 12 0 4 0 0 -4 0 -8 0 8 0 0 -4 0 0 0 0 0 -4 8 -8 0 0 0 -4 0 -16 -8 16 8 0 -8 0 8 0 -4 4 4 -8 0 0 -12 0 0 4 -8 0 8 0 4 4 -4 -4 -6 0 12 0 0 -12 12 0 -6 -8 4 8 0 0 0 0 -4 8 -8 0 0 -4 0 0 4 -2 -12 [...]
+1 3 4 -8 2 0 0 0 0 -4 -2 -8 4 0 0 -4 4 4 -4 -4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 8 0 0 -2 -8 0 0 0 0 0 0 0 -8 0 -8 0 0 4 -8 -2 0 2 0 0 1 0 0 0 0 8 0 0 0 -4 0 4 0 0 0 0 8 0 0 4 8 0 0 8 0 8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 8 8 0 0 0 -8 -8 0 -4 -4 0 -4 0 0 4 0 -8 8 0 0 0 0 -4 0 4 -4 0 8 0 8 0 8 0 0 0 0 8 0 0 0 0 -8 8 0 0 0 -4 0 -8 0 -8 0 0 -8 0 -8 0 0 -8 0 4 4 4 8 -4 -8 0 -8 0 4 4 0 0 0 0 0 0 -8 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 8 2 -8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 8 8 -8  [...]
+1 3 0 -6 -4 8 8 4 -12 4 -4 4 -2 -4 -8 -4 -4 4 0 -2 1 -16 -8 -4 0 4 4 16 8 0 2 -8 4 -4 -4 -8 2 0 8 0 0 0 4 4 -8 4 4 -16 8 8 0 4 2 -8 2 16 8 1 0 2 -8 4 -12 0 -8 8 12 6 -4 4 4 -8 4 0 -8 8 0 -8 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 -12 -8 4 -8 0 8 8 4 4 0 -8 4 0 4 8 2 -8 -4 8 12 -8 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 8 -4 -8 0 -12 -8 0 0 0 0 8 0 0 0 0 -8 -4 8 -8 0 8 -4 0 0 -4 0 0 8 -8 -4 0 -4 0 -2 -8 -4 0 12 4 -4 -8 -2 8 0 8 0 8 8 8 -4 -16 8 -4 -8 -12 -8 8 -4 -2 -4 -4 [...]
+1 3 4 -12 -2 8 16 8 0 8 2 -16 4 -8 -16 -12 8 -8 -8 -4 3 -16 16 8 16 -4 -8 16 -32 -8 -2 -8 12 8 8 -24 -2 -16 8 8 8 16 -8 8 -16 8 4 16 16 -16 8 8 2 8 2 -16 16 -3 -8 4 -16 8 -8 -16 -16 -8 8 -8 -24 8 24 16 -8 16 24 -16 8 16 -16 -8 8 -16 16 -4 4 -8 8 8 12 16 -4 8 16 16 -4 -16 16 -16 4 -8 16 -8 16 -8 -16 16 16 16 8 -16 -24 -8 -4 16 4 8 8 12 8 -8 -16 -8 -16 -4 16 24 16 -8 4 -16 -8 -16 -16 -16 -16 -16 16 4 -16 -8 -16 16 16 -8 16 16 24 -16 -16 8 -16 16 -16 16 -16 16 16 -16 16 -16 -8 8 -8 8 4 -4 8 [...]
+1 3 -4 -2 0 4 -8 0 -4 0 0 4 -2 4 0 -8 0 0 -4 -2 1 0 0 4 -8 -4 0 0 0 -4 2 0 -4 0 -4 0 2 8 8 4 4 -8 -4 -4 0 4 -4 0 0 0 -4 4 2 0 2 0 16 1 4 -6 8 -4 0 -8 -8 8 0 -2 0 -4 0 8 4 8 0 0 -4 0 -8 4 4 0 8 0 0 -4 0 -4 0 0 0 0 0 -8 -6 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 0 -4 -4 4 0 4 4 0 -4 0 2 8 0 0 0 4 8 4 16 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 -4 -4 4 0 -4 -4 0 0 -4 0 0 -4 4 4 0 4 0 6 -16 -4 0 0 0 4 0 -2 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 -8 -4 -2 -4 -4 -4 -4 4 4 4 4 4 -8 4 8 6  [...]
+1 3 0 -4 -2 4 0 4 0 0 2 -8 -4 0 -8 0 0 0 -8 4 -1 -8 8 0 -8 0 -4 0 0 0 2 0 0 4 0 0 -2 0 0 -4 4 8 -8 0 -8 0 0 8 -8 8 8 0 -2 0 2 0 8 1 4 0 0 0 -4 8 0 0 0 0 0 0 -4 0 8 0 0 8 0 0 -8 -4 0 8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 -8 0 8 4 0 4 8 4 -8 0 8 -8 -4 -4 0 8 0 8 0 0 0 -8 0 0 0 0 -8 -8 0 -8 0 0 0 0 0 0 0 0 -8 8 0 -4 8 0 0 8 -8 0 -8 0 0 8 0 -8 0 4 0 4 -8 -4 0 0 4 0 8 -8 0 -8 0 0 0 0 0 0 8 0 -4 -4 0 0 -8 0 -8 0 8 0 0 0 0 8 0 0 4 -8 0 -8 0 0 2 0 -8 -4 4 -8 0 0 0 0 0 0 8 0 0 -8 -2 0  [...]
+1 3 0 -6 -4 8 -8 -4 -12 4 -4 12 -2 12 -8 -4 -4 4 16 -2 1 0 -8 12 0 4 -4 0 -8 0 2 -8 4 4 -4 8 2 0 -8 0 -16 0 -12 4 8 4 4 0 8 -8 16 4 2 -8 2 0 -24 1 0 -6 -24 4 12 0 8 -8 12 14 -4 4 -4 8 4 0 8 8 0 -8 0 -16 4 8 0 0 0 -8 0 -8 0 0 0 0 16 8 -6 16 16 -16 0 4 -16 4 -16 4 16 8 -16 8 12 -8 -4 8 0 8 -8 -12 4 0 8 4 -16 4 8 10 -24 -4 -8 12 8 8 4 -24 16 0 -16 0 16 0 -8 0 24 0 0 12 -16 8 4 8 16 -12 -8 16 16 -16 -16 -8 16 -16 16 -16 8 -4 -8 8 0 -8 -4 0 0 -4 -16 16 -8 8 -4 0 -4 0 6 24 -4 0 -12 4 -4 -8 -10 [...]
+1 3 0 -8 -2 8 0 0 0 4 2 -8 -4 8 -8 -8 4 -4 4 4 -1 0 8 -8 0 0 0 -8 -8 -4 -2 0 0 0 8 0 2 8 0 0 -8 0 0 0 8 0 0 0 8 0 -4 0 2 0 -2 8 -8 1 0 0 0 0 0 0 0 0 4 0 4 0 0 0 0 -8 0 8 4 -8 0 8 0 -8 8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 8 0 4 4 -8 0 0 0 4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 8 0 0 0 0 -8 0 0 0 0 0 0 0 0 -8 0 0 8 4 8 0 -8 0 -8 0 0 8 0 -8 0 0 0 -4 -4 0 0 -4 0 0 0 -8 -4 0 0 0 0 0 0 -8 0 4 0 4 0 8 0 8 0 -8 0 0 0 0 0 -8 8 0 0 -4 -8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 8 2 0 0 0 - [...]
+1 3 4 -4 -2 0 -16 0 0 0 2 0 4 8 -16 4 0 0 0 -4 3 0 16 -8 0 -4 0 0 16 0 6 -8 -4 0 -8 8 6 0 -24 0 0 0 8 8 16 8 4 0 -16 0 0 8 -6 8 -6 0 -16 -3 0 4 -16 8 0 0 -16 24 0 8 0 8 0 -16 8 0 -8 -16 0 0 0 0 8 16 0 12 4 0 8 0 -4 16 12 8 0 16 -4 0 0 0 4 -8 0 -8 0 -8 0 -16 0 -16 0 0 0 0 -4 16 4 -8 -8 -4 0 -8 0 -8 16 -4 16 0 0 0 4 16 -8 16 0 -16 0 -16 0 -12 -16 -8 -16 16 16 8 0 0 0 0 0 0 -16 0 0 0 0 -16 0 0 0 0 0 8 0 0 4 -4 8 4 -8 8 0 0 0 -4 8 -4 8 -4 4 -16 8 4 0 0 8 -16 4 16 -12 16 -16 -8 16 16 -8 0 0 0 [...]
+1 3 0 -4 2 0 -16 0 0 0 -2 0 4 0 0 0 0 0 0 -4 3 0 0 0 0 -4 0 0 16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 -8 0 8 4 0 16 0 0 8 -2 8 -2 0 16 -3 0 -4 0 -8 0 0 0 0 0 8 0 -8 0 -16 0 0 0 0 0 0 0 0 8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 4 0 0 0 -4 8 0 8 0 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 -8 0 8 -16 4 0 0 0 0 0 16 -8 -16 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 -16 0 0 0 0 0 8 0 0 -4 0 8 -12 0 0 0 0 0 0 -8 4 -8 4 -4 16 8 -12 0 0 -8 16 -4 0 4 0 0 -8 0 0 0 0 0 0 0 0 0 16 -8 2 -8 0 0 0 0 0 -4 8 8 0 -12 0 4 [...]
+1 3 -8 2 4 0 -8 4 -4 -12 4 12 -2 -4 8 -12 -4 -12 8 -2 1 0 8 -4 0 4 4 0 -8 -8 2 8 4 12 -4 -8 2 0 -8 -8 8 0 4 4 -8 4 4 0 -8 8 8 4 2 8 2 0 -8 1 -8 2 8 4 4 0 8 -8 -4 6 -4 4 4 8 4 0 -8 -8 -8 -8 0 8 4 -8 0 0 0 0 0 0 0 0 0 0 0 8 2 16 -16 -16 0 4 16 4 0 4 0 -8 0 -8 4 -8 4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 -4 8 -4 0 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 -4 -8 0 4 8 16 -16 -16 16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 -4 4 -4 8 -2 8 0 8 0 -8 -8 -8 -4 0 8 -4 -8 4 8 -8 -4 -2 -4 -4 [...]
+1 3 -8 2 4 0 -8 -4 4 12 4 -12 -2 -4 8 -12 4 12 -8 -2 1 0 8 -4 0 4 -4 0 -8 8 2 8 4 -12 -4 -8 2 0 -8 8 -8 0 4 4 -8 4 4 0 -8 -8 -8 4 2 8 2 0 -8 1 8 2 8 4 -4 0 8 -8 4 6 4 4 -4 8 4 0 -8 -8 8 8 0 -8 4 -8 0 0 0 0 0 0 0 0 0 0 0 8 2 -16 16 16 0 4 -16 4 0 4 0 -8 0 -8 -4 8 -4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 4 -8 4 0 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 4 8 0 -4 8 -16 16 16 -16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 4 -4 -4 8 -2 8 0 8 0 -8 -8 -8 -4 0 -8 4 8 -4 8 -8 -4 -2 -4 -4 [...]
+1 3 -4 -4 6 0 -16 0 0 0 -6 0 4 -8 16 -4 0 0 0 -4 3 0 -16 8 0 12 0 0 16 0 -2 -8 -4 0 8 -8 -2 0 -8 0 0 0 -8 8 -16 8 -12 0 -16 0 0 8 2 8 2 0 -16 -3 0 4 16 8 0 0 16 8 0 8 0 8 0 -16 -8 0 8 16 0 0 0 0 8 -16 0 -4 4 0 24 0 -4 -16 -4 24 0 -16 -4 0 0 0 4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 12 -16 -4 8 8 -4 0 -8 0 -8 16 -4 -16 0 0 0 -4 16 -8 16 0 16 0 -16 0 4 16 -24 16 16 -16 -8 0 0 0 0 0 0 16 0 0 0 0 -16 0 0 0 0 0 8 0 0 -12 4 8 4 -24 -8 0 0 0 4 8 -4 8 -4 4 -16 8 4 0 0 8 -16 4 -16 4 -16 16 -8 -16 -16 8  [...]
+1 3 -4 0 2 0 -8 0 -8 -4 -2 8 -4 -8 8 4 4 4 12 4 -1 -8 -8 8 8 0 0 0 -8 -4 2 0 0 -8 0 0 -2 0 0 -8 8 -8 0 -8 0 0 0 8 8 0 -12 0 -2 0 2 0 -8 1 8 0 -8 8 -8 -8 8 0 -4 -8 4 8 0 8 8 0 0 -8 4 8 8 -8 0 0 16 0 0 4 -8 0 -4 0 0 8 -8 -8 0 -8 0 -8 0 -8 0 8 8 0 16 0 -8 0 8 -8 0 4 -4 8 4 0 -8 4 0 0 16 -8 -8 8 8 -4 0 4 4 -8 0 8 0 0 0 0 8 0 8 -8 -8 0 0 0 0 8 0 0 -8 -4 -8 8 0 8 0 8 0 -8 -16 8 0 0 0 -4 4 -4 0 -4 8 8 -16 8 -4 -4 8 0 -8 0 0 -8 0 4 -8 4 8 8 -8 0 0 0 0 0 -8 8 0 0 -8 0 0 4 8 -8 0 2 0 -8 -8 8 12 -4 [...]
+1 3 -4 0 2 0 -8 0 0 4 -2 -8 -4 -8 8 4 -4 -4 -4 4 -1 -8 -8 8 -8 0 0 0 8 12 2 0 0 8 0 0 -2 -16 0 8 -8 8 0 8 0 0 0 8 8 0 4 0 -2 0 2 0 -8 1 -8 8 -8 -8 8 8 8 0 4 0 -4 -8 0 8 8 16 0 -8 -12 -8 -8 8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 -8 -8 -8 0 -8 0 8 0 -8 -8 0 0 0 8 0 -8 8 0 4 -4 8 4 0 -8 4 0 0 0 8 -8 0 8 4 0 -4 4 -8 0 8 16 0 16 0 -8 0 8 -8 -8 0 0 0 -16 -8 0 0 8 4 -8 8 0 8 0 8 -16 8 0 -8 0 0 0 -4 4 -4 0 -4 8 8 0 -8 -4 -4 -8 0 8 0 8 -8 0 4 8 -4 -8 8 0 0 0 0 0 0 -8 8 0 0 8 0 0 -4 8 -8 0 2 0 -8 8 -8 -4 1 [...]
+1 3 -4 -4 2 4 -8 -4 0 8 -2 -8 -4 0 8 -4 0 -8 -8 4 -1 0 -8 0 0 0 4 -8 0 8 -2 0 0 4 8 0 2 8 0 12 -4 -16 8 8 0 0 0 0 -8 8 8 0 2 0 -2 8 8 1 -12 -8 8 -8 -4 0 -8 0 -8 0 0 8 4 8 0 -8 0 -8 -8 0 16 4 0 0 8 0 0 0 8 4 4 0 0 -8 0 8 8 0 -8 0 0 8 -8 -8 16 0 8 0 0 0 4 0 -4 0 -4 8 4 -8 0 -4 4 0 8 -8 8 0 -8 0 -8 8 4 -8 0 -8 -8 0 -8 0 16 0 -8 8 8 0 0 8 8 0 4 8 -16 -8 -8 0 8 0 8 8 8 -16 -8 0 -4 0 -4 0 4 -4 0 4 -8 0 -8 0 0 -4 -8 0 8 0 -8 8 0 -4 -4 0 8 -8 0 0 0 0 0 0 8 -8 -8 -8 0 -4 -8 8 8 -8 0 -2 0 0 12 -4  [...]
+1 3 -4 -4 2 4 -8 4 0 -8 -2 0 -4 0 8 -4 0 8 8 4 -1 0 -8 0 -16 0 -4 -8 16 -8 -2 0 0 -4 8 0 2 -8 0 -4 12 0 8 -8 0 0 0 0 -8 -8 -8 0 2 0 -2 8 8 1 4 0 8 8 4 16 -8 0 8 8 0 -8 -4 8 0 8 0 -8 8 0 0 -12 0 0 -8 0 0 0 8 4 4 0 0 -8 16 8 0 0 -8 0 0 -8 -8 8 0 0 -8 0 16 0 -4 0 4 0 -4 8 4 -8 0 -4 4 0 -8 8 8 -8 -8 0 8 -8 4 -8 0 -8 8 0 8 0 0 0 -8 8 8 0 0 8 -8 0 -4 -8 0 8 -8 0 8 0 8 8 -8 0 8 -16 -4 0 -4 0 4 -4 0 4 -8 0 8 -16 0 -4 8 0 -8 0 0 8 0 -4 4 0 -8 -8 8 0 0 0 0 0 8 -8 -8 -8 0 4 8 -8 8 -8 0 -2 0 0 -4 12 [...]
+1 1 8 -8 2 -8 16 0 -8 0 2 -8 0 -8 0 0 0 0 8 0 3 -16 0 -8 0 -4 0 -16 16 8 2 8 4 0 -8 0 2 0 0 8 8 0 -8 0 16 16 -4 -16 -16 0 8 0 2 8 2 -16 -16 3 8 -8 0 0 0 0 0 0 0 -4 0 -16 0 16 -8 0 0 0 8 0 0 8 16 16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 -8 16 16 16 -4 0 16 0 0 16 0 16 0 16 0 0 0 -8 4 0 8 -8 -8 -4 -8 16 0 -16 -16 -8 0 0 0 0 8 16 0 -16 0 0 0 -16 0 -4 0 0 0 -16 0 -8 0 0 0 0 0 0 0 16 16 16 16 16 0 0 0 0 -8 0 -8 -8 4 8 16 -4 0 -8 0 0 -8 8 0 -4 0 -4 -8 -16 16 -4 0 0 -16 -16 -8 16 -4 16 -32 8 0 0 -8 - [...]
+1 1 4 -4 2 -8 -8 0 0 4 2 0 8 0 -8 -4 4 4 4 8 -1 -8 -8 0 -8 0 0 0 -8 4 2 0 0 8 -8 0 -2 16 0 0 0 8 8 0 0 -8 0 -8 -8 0 4 -8 2 0 -2 0 8 -1 0 4 -8 0 -8 -8 8 0 4 -4 -4 0 0 8 0 16 0 8 4 -8 8 0 8 0 0 0 0 12 8 8 -4 0 0 -8 -8 8 4 -8 0 -8 0 0 0 0 8 -8 -16 0 -8 0 -8 -8 0 12 -4 8 -4 8 0 4 8 8 -16 0 -8 -4 -8 -4 0 4 -4 8 -8 8 0 0 0 0 8 0 8 -8 -8 0 0 8 0 -8 0 0 8 4 8 -8 0 -8 0 8 0 8 -16 -8 8 -8 8 12 -4 -4 8 4 8 0 -16 -8 12 -4 0 0 0 0 4 8 -8 -4 -8 -4 0 -8 -4 0 0 0 0 0 8 -8 8 0 -8 0 0 4 8 8 -8 2 8 0 0 0 4 [...]
+1 1 0 4 -2 -8 8 0 8 -4 -2 -8 0 0 0 -8 4 -4 4 0 -1 0 0 0 -8 0 0 8 8 -4 -2 0 0 0 -8 0 2 0 0 8 0 8 0 0 8 0 0 0 0 0 4 0 -2 0 2 8 0 -1 8 -4 -8 0 0 -8 8 0 -4 4 -4 0 0 -8 8 0 0 0 -4 8 8 0 0 -8 0 0 0 -4 0 0 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 8 -8 0 8 0 8 0 -4 4 0 0 0 8 4 0 0 8 0 0 4 -8 -4 0 -4 0 -8 0 0 -8 0 -8 0 0 0 8 0 -8 0 0 0 -8 8 0 0 0 -4 0 0 -8 0 -8 -8 -8 0 8 0 0 0 0 -4 4 0 0 4 0 8 8 0 -4 0 0 0 0 0 -4 0 0 -4 0 -4 0 0 4 8 0 -8 0 0 8 -8 0 8 8 0 0 -4 0 -8 0 -2 0 8 8 0 4 -4 0 0 0 0 0 8 -4 0 0  [...]
+1 1 0 0 -2 -4 8 -4 0 0 -2 0 0 0 0 -8 0 0 0 0 -1 8 0 0 0 0 -4 0 0 8 2 0 0 4 -8 0 -2 8 0 -4 4 0 0 0 -8 0 0 8 0 -8 0 0 2 0 -2 0 0 -1 -4 4 8 0 4 0 -8 0 0 -4 0 0 4 -8 8 8 0 0 8 0 0 4 0 8 -8 0 0 -8 0 4 4 0 0 0 8 -8 4 -8 0 -8 0 0 0 0 -8 0 0 8 8 -8 4 0 4 -8 4 0 0 0 8 -4 4 0 0 0 0 -4 8 0 -8 0 0 -8 0 0 0 0 0 0 -8 0 -8 0 8 0 0 0 0 0 4 -8 -8 0 0 -8 0 -8 0 -8 0 -8 0 8 4 0 4 -8 4 0 0 -4 0 8 0 8 -8 0 0 0 0 0 4 0 0 4 4 0 0 0 -4 -8 0 8 0 0 -8 8 0 0 0 4 -8 0 0 -8 0 2 0 8 -4 4 0 8 0 0 0 0 0 0 4 8 0 -2 0 8  [...]
+1 1 4 -2 0 -8 8 -4 4 -4 0 12 6 -4 -8 -16 -4 4 8 -6 1 0 8 4 -16 -4 4 0 -8 8 -2 0 4 -4 12 -8 -2 16 0 0 0 0 -4 4 8 4 4 0 -8 8 -8 -4 2 0 2 0 8 -1 0 2 -8 4 -4 16 8 0 4 -10 4 -4 -4 8 4 -16 8 -8 -8 -8 0 0 4 8 0 0 0 0 0 8 0 0 0 0 -16 -8 -2 0 0 0 0 -4 0 -4 0 -4 16 -8 16 -8 4 8 4 0 0 8 -4 4 -4 0 -8 -4 -16 4 8 6 8 -4 -8 -4 4 -8 4 -8 0 0 0 0 0 0 -8 0 8 0 0 4 0 8 4 -8 0 -4 8 0 0 0 0 -8 0 0 -16 -16 8 4 -8 0 0 4 -4 0 0 -4 16 16 0 -4 -4 0 -4 0 -2 -8 -4 0 4 -4 4 8 6 -8 0 -8 0 0 8 -8 -4 0 -8 -4 8 4 -8 8 - [...]
+1 1 0 8 -6 -8 0 0 8 0 -6 -8 0 0 0 0 0 0 -8 0 3 16 0 0 0 12 0 -16 0 -8 2 -8 4 0 0 0 2 0 0 8 8 0 0 0 0 0 12 16 0 0 -8 0 2 -8 2 -16 0 3 8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 -4 -4 8 0 -8 -4 0 -4 0 0 0 0 -16 16 -16 -4 0 16 0 0 0 0 0 0 0 0 0 0 8 -12 0 0 0 0 -4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 -16 16 -16 16 0 0 0 0 0 -8 0 -8 8 -12 0 0 -4 0 0 0 0 8 0 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 0 -8 0 0 0 -16 0 0 0 0 0 0 0 2 0 0 8 8 -8 -8 12 0 0 0 4 0 0  [...]
+1 1 -4 8 -2 -8 0 0 8 0 -2 -8 0 0 0 -4 0 0 8 0 3 16 0 0 16 -4 0 -16 -16 8 6 -8 -4 0 0 -8 6 -16 24 -8 -8 16 0 0 0 0 -4 16 0 0 8 0 6 -8 6 -16 0 3 -8 0 0 0 0 16 0 24 0 -4 0 0 0 0 0 -16 -8 0 8 0 16 -8 0 0 -16 12 4 8 -8 -8 -4 -16 12 -8 16 0 0 16 -16 16 4 0 -16 0 16 0 -16 0 16 0 0 0 0 8 -4 0 -4 0 0 -4 -8 0 -16 0 0 0 0 0 0 0 -4 0 0 0 -16 16 -16 -16 16 12 0 -8 0 -16 16 0 -16 0 0 0 16 0 0 16 -16 16 -16 0 -16 16 -16 16 -8 0 -8 8 -4 -4 0 -4 -8 0 -16 16 8 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 12 0 -16 -8 0 [...]
+1 1 0 6 -4 -8 8 -4 -4 -4 4 12 -2 -4 -8 -4 -4 4 0 2 1 16 8 4 0 4 4 -16 -8 0 2 -8 4 -4 4 -8 2 0 8 0 0 0 4 4 -8 4 -4 -16 8 -8 0 4 -2 8 -2 16 8 -1 0 2 -8 4 12 0 -8 -8 -12 -2 4 4 -4 -8 4 0 8 8 0 8 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 -12 -8 4 8 0 -8 8 -4 -4 0 8 -4 0 -4 -8 -2 8 -4 8 12 -8 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 4 8 0 12 -8 0 0 0 0 8 0 0 0 0 -8 -4 8 -8 0 -8 -4 0 0 -4 0 0 8 8 -4 0 -4 0 -2 -8 -4 0 -12 -4 -4 -8 -2 8 0 8 0 8 -8 -8 4 16 8 -4 -8 -12 8 -8 4 [...]
+1 1 8 -8 2 -8 -16 0 -8 0 2 -8 0 8 0 16 0 0 8 0 3 -16 0 8 0 -4 0 -16 -16 8 2 8 4 0 8 0 2 0 0 8 8 0 8 0 -16 -16 -4 -16 16 0 8 0 2 8 2 -16 16 3 8 8 0 0 0 0 0 0 0 12 0 16 0 -16 8 0 0 0 8 0 0 8 -16 -16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 8 16 16 16 -4 0 16 0 0 -16 0 -16 0 -16 0 0 0 -8 4 0 8 8 8 -4 -8 -16 0 16 16 8 0 0 0 0 8 -16 0 16 0 0 0 -16 0 -4 0 0 0 -16 0 8 0 0 0 0 0 0 0 16 16 16 16 -16 0 0 0 0 -8 0 -8 -8 4 8 -16 -4 0 8 0 0 -8 8 0 -4 0 -4 8 16 -16 -4 0 0 16 16 8 -16 -4 -16 -32 8 0 0 8 -16 0 0 [...]
+1 1 4 -8 6 -8 0 0 -8 0 6 -8 0 0 0 4 0 0 -8 0 3 -16 0 0 16 12 0 -16 16 -8 -2 -8 -4 0 0 8 -2 16 8 -8 -8 16 0 0 0 0 12 -16 0 0 -8 0 -2 -8 -2 -16 0 3 -8 0 0 0 0 16 0 8 0 -4 0 0 0 0 0 16 8 0 -8 0 16 -8 0 0 16 -4 4 -8 -24 -8 -4 16 -4 -24 16 0 0 -16 -16 -16 4 0 -16 0 16 0 16 0 16 0 0 0 0 -8 12 0 4 0 0 -4 -8 0 16 0 0 0 0 0 0 0 4 0 0 0 16 -16 16 -16 16 -4 0 -24 0 -16 -16 0 16 0 0 0 16 0 0 -16 -16 -16 -16 0 16 16 16 16 -8 0 -8 -8 12 4 0 -4 -24 0 16 16 -8 4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 -4 0 16 -8 0 [...]
+1 1 4 -4 2 -8 8 0 -8 -4 2 -16 -8 0 8 12 -4 -4 4 -8 -1 -8 8 0 -8 0 0 0 8 4 2 0 0 -8 8 0 -2 16 0 0 0 8 -8 0 0 8 0 -8 8 0 4 8 2 0 -2 0 -8 -1 0 -4 8 0 8 -8 -8 0 -4 4 4 0 0 -8 0 16 0 -8 4 8 8 0 -8 0 0 0 0 12 8 8 -4 0 0 -8 -8 -8 -4 -8 0 -8 0 0 0 0 8 8 -16 0 -8 0 8 8 0 12 -4 -8 -4 -8 0 4 8 -8 -16 0 8 4 8 4 0 -4 -4 -8 8 -8 0 0 0 0 8 0 -8 -8 8 0 0 -8 0 8 0 0 8 -4 -8 -8 0 -8 0 -8 0 8 -16 -8 8 8 8 12 -4 -4 -8 4 8 0 -16 -8 12 -4 0 0 0 0 -4 -8 8 -4 8 4 0 8 4 0 0 0 0 0 -8 8 -8 0 8 0 0 -4 -8 -8 8 2 -8  [...]
+1 1 4 -8 2 -4 8 -4 -8 -8 2 -8 -8 8 8 4 0 -8 0 -8 -1 0 8 8 16 0 -4 -8 16 0 -2 0 0 -4 0 0 2 -8 0 4 4 0 0 0 0 -8 0 0 -8 8 0 8 -2 0 2 -8 8 -1 4 4 -8 0 -4 16 8 0 8 -4 0 0 4 -8 -8 -8 0 -8 0 0 0 4 8 0 8 0 0 8 -8 12 4 0 0 8 0 8 4 0 -8 0 0 0 -8 0 -16 -8 8 0 0 0 -4 0 4 8 -4 -8 -4 0 -8 -4 12 8 8 0 -8 -4 -8 0 8 8 -4 -8 8 8 -8 0 -8 0 -16 0 8 8 -8 0 0 0 -8 0 4 8 -16 8 -8 0 -8 0 -8 -8 -8 -16 8 0 12 8 12 8 -4 -4 8 -4 -8 -8 8 0 8 -4 0 0 0 0 4 8 -8 4 -4 0 0 -8 -4 0 0 0 0 0 8 -8 0 -8 0 4 8 8 -8 -8 8 -2 8 - [...]
+1 1 8 -10 4 -8 8 -4 4 -12 -4 -4 -2 4 8 -4 4 12 0 2 1 -16 -8 -4 0 4 4 -16 -8 0 2 8 4 12 -4 8 2 0 8 0 0 0 -4 4 8 4 -4 16 8 -8 0 4 -2 -8 -2 16 8 -1 0 2 8 4 -4 0 8 -8 -4 -2 -4 4 -4 -8 -4 0 -8 -8 0 -8 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 4 8 4 -8 0 8 0 4 4 0 8 -4 0 -4 -8 -2 -8 4 8 4 0 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 -8 -4 8 8 0 0 -4 0 0 4 0 0 -8 0 -4 0 -4 0 -2 -8 -4 0 4 4 -4 -8 -2 -8 0 -8 0 -8 8 8 -4 16 -8 -4 -8 -4 -8 -8 4 -2 4  [...]
+1 1 4 -8 2 -4 -8 4 -8 8 2 0 8 -8 -8 4 0 8 0 8 -1 0 -8 -8 16 0 4 -8 0 0 -2 0 0 4 0 0 2 -8 0 4 4 0 0 0 0 8 0 0 8 -8 0 -8 -2 0 2 -8 -8 -1 4 -4 8 0 4 16 -8 0 -8 4 0 0 -4 8 8 -8 0 8 0 0 0 4 -8 0 8 0 0 8 -8 12 4 0 0 8 0 -8 -4 0 -8 0 0 0 -8 0 -16 8 8 0 0 0 4 0 -4 8 -4 8 -4 0 8 -4 12 -8 8 0 8 4 8 0 -8 -8 -4 8 -8 -8 -8 0 -8 0 -16 0 -8 8 8 0 0 0 -8 0 -4 -8 -16 -8 8 0 -8 0 -8 8 -8 -16 8 0 12 -8 12 8 -4 -4 -8 -4 -8 8 8 0 8 -4 0 0 0 0 -4 -8 8 4 4 0 0 8 4 0 0 0 0 0 -8 8 0 -8 0 -4 -8 -8 8 8 -8 -2 -8 8  [...]
+1 1 0 4 -2 -8 -8 0 0 4 -2 -8 0 0 0 8 -4 4 4 0 -1 0 0 0 -8 0 0 8 -8 -4 -2 0 0 0 8 0 2 0 0 8 0 8 0 0 -8 0 0 0 0 0 4 0 -2 0 2 8 0 -1 8 4 8 0 0 -8 -8 0 4 -4 4 0 0 8 -8 0 0 0 -4 -8 8 0 0 8 0 0 0 -4 0 0 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 8 8 0 -8 0 -8 0 -4 4 0 0 0 -8 4 0 0 8 0 0 -4 8 4 0 4 0 8 0 0 -8 0 -8 0 0 0 -8 0 8 0 0 0 -8 -8 0 0 0 4 0 0 -8 0 -8 8 -8 0 8 0 0 0 0 -4 4 0 0 4 0 -8 8 0 -4 0 0 0 0 0 4 0 0 -4 0 4 0 0 -4 -8 0 8 0 0 -8 8 0 8 -8 0 0 4 0 8 0 -2 0 -8 8 0 4 -4 0 0 0 0 0 8 4 0 0 2 0 0 [...]
+1 1 0 0 -2 -4 -8 4 0 0 -2 -8 0 0 0 8 0 0 0 0 -1 8 0 0 0 0 4 0 -16 8 2 0 0 -4 8 0 -2 8 0 -4 4 0 0 0 8 0 0 8 0 8 0 0 2 0 -2 0 0 -1 -4 -4 -8 0 -4 0 8 0 0 4 0 0 -4 8 -8 8 0 0 8 0 0 4 0 -8 -8 0 0 -8 0 4 4 0 0 0 8 8 -4 -8 0 -8 0 0 0 0 -8 0 0 -8 8 8 -4 0 -4 -8 4 0 0 0 -8 -4 4 0 0 0 0 4 -8 0 8 0 0 8 0 0 0 0 0 0 -8 0 8 0 -8 0 0 0 0 0 -4 8 -8 0 0 -8 0 -8 0 8 0 -8 0 8 4 0 4 -8 4 0 0 -4 0 -8 0 8 -8 0 0 0 0 0 -4 0 0 4 -4 0 0 0 4 8 0 -8 0 0 8 -8 0 0 0 -4 8 0 0 8 0 2 0 -8 -4 4 0 8 0 0 0 0 0 0 -4 8 0 -2 [...]
+1 1 0 -4 -2 0 -8 0 0 -4 -2 0 0 8 0 0 4 -4 -4 0 -1 0 0 8 8 0 0 8 -8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 -8 0 8 0 0 0 0 0 -4 0 -2 0 2 8 0 -1 0 4 8 0 0 8 -8 0 -4 -4 -4 0 0 8 0 0 0 0 4 8 -8 8 0 -8 0 0 0 4 0 -8 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 -8 -8 0 8 0 8 0 4 4 0 0 -8 0 4 -8 0 -8 0 0 -4 8 -4 0 -4 0 8 0 0 8 0 8 0 0 0 -8 0 8 0 0 -8 8 8 0 0 0 -4 0 0 -8 0 -8 8 8 0 -8 0 -8 0 -8 4 4 0 0 4 0 0 -8 0 4 0 0 0 0 0 4 0 0 -4 0 -4 0 0 -4 8 0 -8 0 0 -8 8 -8 8 8 0 0 -4 0 8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 4 0 0 2 [...]
+1 1 0 -8 -2 4 -8 -4 -8 0 -2 8 0 8 0 0 0 0 8 0 -1 8 0 8 0 0 -4 0 0 0 2 0 0 4 0 0 -2 -8 0 4 -4 0 -8 0 -8 0 0 8 0 -8 8 0 2 0 -2 0 0 -1 4 -4 -8 0 4 0 8 0 0 4 0 0 4 8 0 -8 0 0 0 0 0 -4 0 8 8 0 0 0 0 -4 4 0 0 0 -8 8 -4 -8 0 -8 0 0 0 0 8 0 0 8 -8 -8 4 0 4 0 4 0 0 -8 0 -4 -4 0 0 0 0 4 -8 0 -8 0 0 8 0 0 0 0 0 0 8 0 8 0 -8 0 0 -8 0 0 4 -8 8 0 0 -8 0 -8 0 8 0 8 0 -8 -4 0 -4 0 4 0 0 -4 0 0 0 -8 0 0 0 0 0 0 -4 0 0 4 4 0 0 0 4 -8 0 8 0 0 8 -8 -8 0 0 4 -8 0 0 8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 -4 -8 0 -2 0 [...]
+1 1 4 -6 0 -4 -16 0 4 0 0 4 6 4 -8 0 0 0 4 -6 1 0 8 -4 0 -4 0 0 16 4 2 0 -4 0 -4 0 2 0 -8 4 4 0 4 4 0 -4 4 0 8 0 -4 -4 -2 0 -2 0 8 -1 -4 2 0 4 0 0 0 8 0 6 0 4 0 0 4 0 0 -8 -4 0 0 -4 -4 0 0 0 0 -4 0 4 0 0 0 0 8 0 -2 0 0 0 0 -4 0 -4 -8 4 -8 0 -8 0 0 0 0 4 0 8 4 -4 -4 0 -4 4 8 -4 -8 -2 0 0 0 0 -4 0 4 -8 -8 0 8 0 8 0 0 0 0 0 0 -4 -8 0 0 0 -8 0 8 0 0 0 0 0 8 8 8 8 4 4 -4 -4 0 -4 4 0 0 -4 -8 -8 4 4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 0 -4 -2 -4 4 -4 -4 -4 -4 4 4 4 8 4 [...]
+1 1 -4 0 2 -4 0 -4 0 8 2 -8 0 0 0 -4 0 8 0 0 -1 0 0 0 8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 8 0 -8 0 0 0 0 0 8 0 0 -2 0 2 8 0 -1 -4 4 0 8 -4 8 0 0 -8 4 0 -8 4 0 0 0 0 0 0 0 8 -4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 4 0 8 0 0 8 8 -8 -8 0 0 0 -8 0 -4 0 4 0 -4 0 4 0 0 -4 -4 0 0 -8 0 4 0 0 8 -8 4 0 0 0 0 0 0 0 -8 0 0 -8 0 0 0 0 0 0 4 8 -8 -8 0 0 8 0 8 0 0 -8 0 -8 -4 0 -4 0 -4 4 0 -4 8 0 0 -8 0 4 8 0 -8 0 4 0 0 4 -4 0 -8 0 4 0 0 0 0 0 0 0 0 8 0 4 8 -8 0 0 0 -2 0 0 -4 -4 0 0 0 8 -8 0 0 8 4 0 0 2 0  [...]
+1 1 -4 -4 2 0 0 0 -8 -4 2 8 0 0 0 -4 -4 -4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 8 0 0 -2 8 0 0 0 0 0 8 0 0 0 8 0 0 -4 0 2 0 -2 0 0 -1 0 4 0 -8 -8 0 0 0 -4 4 4 -8 0 0 0 8 0 0 -4 8 0 0 0 0 8 0 0 -4 -8 0 -4 0 0 8 0 0 4 8 0 8 0 -8 0 8 0 0 -8 0 0 0 -8 8 0 -4 -4 0 4 0 0 4 0 0 -8 -8 0 4 0 4 0 -4 4 0 0 0 -8 0 -8 0 0 0 0 8 0 0 0 0 -8 8 0 0 0 -4 0 8 0 8 0 0 -8 0 -8 0 0 0 0 -4 -4 4 0 4 -8 0 -8 0 -4 4 -8 0 8 0 4 0 0 -4 -8 4 -8 0 4 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 0 2 0 0 0 0 -4 -4 0 -8 8 0 0 0 4 8 0 -2 0  [...]
+1 1 -4 0 2 -4 0 4 0 -8 2 0 0 0 0 -4 0 -8 0 0 -1 0 0 0 8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 8 0 8 0 0 0 0 0 -8 0 0 -2 0 2 8 0 -1 -4 -4 0 -8 4 8 0 0 8 -4 0 8 -4 0 0 0 0 0 0 0 8 -4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 -4 0 8 0 0 -8 8 8 -8 0 0 0 -8 0 4 0 -4 0 -4 0 4 0 0 -4 -4 0 0 8 0 -4 0 0 -8 8 4 0 0 0 0 0 0 0 -8 0 0 -8 0 0 0 0 0 0 -4 -8 -8 8 0 0 8 0 8 0 0 -8 0 -8 -4 0 -4 0 -4 4 0 -4 8 0 0 -8 0 4 -8 0 8 0 -4 0 0 4 4 0 8 0 -4 0 0 0 0 0 0 0 0 8 0 -4 -8 8 0 0 0 -2 0 0 -4 -4 0 0 0 -8 8 0 0 8 -4 0 0 2 [...]
+1 1 -4 -4 2 0 0 0 0 4 2 -8 0 0 0 -4 4 4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 -8 0 0 -2 8 0 0 0 0 0 -8 0 0 0 8 0 0 -4 0 2 0 -2 0 0 -1 0 -4 0 8 8 0 0 0 4 -4 -4 8 0 0 0 8 0 0 -4 -8 0 0 0 0 8 0 0 -4 -8 0 -4 0 0 8 0 0 -4 8 0 8 0 8 0 -8 0 0 -8 0 0 0 8 -8 0 -4 -4 0 4 0 0 4 0 0 -8 8 0 -4 0 -4 0 4 4 0 0 0 -8 0 -8 0 0 0 0 8 0 0 0 0 -8 -8 0 0 0 4 0 8 0 8 0 0 -8 0 -8 0 0 0 0 -4 -4 4 0 4 -8 0 -8 0 -4 4 8 0 -8 0 -4 0 0 -4 8 -4 8 0 -4 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 0 2 0 0 0 0 -4 -4 0 8 -8 0 0 0 -4 8 0 -2  [...]
+1 1 0 -6 4 -4 -8 0 4 0 -4 4 6 -4 0 -4 0 0 -4 -6 1 0 0 4 8 4 0 0 16 -4 -2 -8 -4 0 4 0 -2 8 0 -4 -4 8 -4 -4 0 4 -4 0 0 0 4 -4 2 8 2 0 0 -1 4 2 8 -4 0 -8 8 0 0 6 0 4 0 -8 -4 -8 0 16 4 0 -8 4 4 0 -8 0 0 -4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 -16 0 4 4 0 -4 -4 0 -4 0 -2 -8 0 0 0 0 8 4 0 0 0 0 0 0 0 -8 0 -8 0 0 4 0 0 0 0 0 0 -16 0 0 0 0 8 0 0 0 0 4 4 -4 -4 0 0 -4 0 0 4 0 0 4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 8 8 -4 0 0 0 0 0 16 -8 -4 2 4 -4 4 4 4 4 -4 -4 -4 0 4 -8  [...]
+1 1 0 2 0 -8 0 -4 -4 0 0 4 -2 -4 0 4 0 0 4 2 -3 -8 0 4 -8 0 4 16 0 -4 -2 0 0 4 -4 0 2 0 0 8 -8 8 -4 -4 8 12 0 8 0 8 -4 -4 2 0 -2 -16 0 3 -8 6 0 4 4 8 0 0 0 6 0 -12 12 0 4 0 0 0 4 0 -8 8 -12 -8 0 4 4 -4 0 -8 0 0 -4 0 8 0 -6 -8 -16 8 -4 -4 16 4 8 -12 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 8 12 0 12 0 -6 0 0 -8 0 0 0 4 0 0 0 0 0 -8 4 0 0 0 0 0 4 0 0 -12 -8 8 0 0 8 16 -8 -16 0 0 -8 0 8 -8 4 8 -4 0 0 12 0 0 -4 0 -8 4 0 -4 4 4 -4 -6 0 -12 0 -4 0 12 0 -6 -8 -4 8 0 0 0 0 -4 -16 0 12 8 0 0 0 -4 2 -12  [...]
+1 1 0 -4 -2 0 8 0 -8 4 -2 0 0 -8 0 0 -4 4 -4 0 -1 0 0 -8 8 0 0 8 8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 8 0 -8 0 0 0 0 0 -4 0 -2 0 2 8 0 -1 0 -4 -8 0 0 8 8 0 4 4 4 0 0 -8 0 0 0 0 4 -8 -8 8 0 8 0 0 0 4 0 -8 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 -8 8 0 -8 0 -8 0 4 4 0 0 8 0 4 -8 0 -8 0 0 4 -8 4 0 4 0 -8 0 0 8 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 0 0 4 0 0 -8 0 -8 -8 8 0 -8 0 -8 0 -8 4 4 0 0 4 0 0 -8 0 4 0 0 0 0 0 -4 0 0 -4 0 4 0 0 4 -8 0 8 0 0 8 -8 8 8 -8 0 0 4 0 -8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 -4 0 0 2 0 [...]
+1 1 0 -2 0 -4 0 0 -4 -4 0 4 -2 -4 0 4 4 4 0 2 -3 0 0 4 0 0 0 8 -8 0 2 0 0 0 -4 0 -2 8 0 -4 4 0 -4 4 -8 4 0 0 0 0 0 -4 -2 0 2 -8 0 3 4 -2 0 -4 0 0 0 0 4 -2 12 4 0 0 4 -8 0 0 0 8 0 -4 -4 8 8 4 -4 0 0 -4 0 0 -4 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 -8 -8 0 8 0 -8 0 0 0 0 0 4 -4 0 4 4 8 -4 0 2 0 -12 0 -4 0 0 4 0 8 0 -8 0 0 4 0 0 0 0 0 4 8 -8 0 0 0 -4 0 0 -8 0 8 0 -8 0 8 0 -4 4 4 0 0 0 4 0 0 -4 -8 0 0 0 4 -4 -4 4 2 0 -4 0 0 -12 -4 0 2 8 -4 -8 0 0 0 0 -4 -8 8 0 0 4 0 0 -4 -2 -4 4 4 -4 0 0 0 -4 4 0 0 0  [...]
+1 1 0 -2 0 -4 0 0 4 -12 0 4 -2 4 0 -4 -4 12 0 2 -3 0 0 -4 0 0 0 8 8 0 -6 0 0 0 4 0 6 -8 0 -4 4 0 4 4 8 4 0 0 0 0 0 -4 6 0 -6 -8 0 3 4 -2 0 -4 0 0 0 0 12 -2 -12 4 0 0 -4 8 0 0 0 24 0 -4 -4 -8 -8 -12 -4 0 0 -4 0 0 12 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 8 8 0 -8 0 -24 0 0 0 0 0 -4 4 0 4 4 -8 -4 0 2 0 12 0 -12 0 0 4 0 -8 0 8 0 0 -12 0 0 0 0 0 -4 -8 -24 0 0 0 -12 0 0 -8 0 8 0 8 0 -8 0 -4 4 4 0 0 0 4 0 0 4 8 0 0 0 4 -4 -4 4 2 0 -4 0 0 12 -4 0 2 -8 12 8 0 0 0 0 4 -8 24 0 0 12 0 0 -4 6 -4 -4 4 -4 0 0 0 [...]
+1 1 0 -6 0 0 0 -4 4 0 0 -4 -2 4 0 -4 0 0 -4 2 -3 8 0 -4 8 0 4 0 0 4 -2 0 0 4 4 0 2 0 0 0 0 -8 4 -4 -8 -4 0 -8 0 8 4 -4 2 0 -2 0 0 3 0 -2 0 4 4 -8 0 0 0 -2 0 4 12 0 -4 0 0 0 -4 0 8 0 4 8 0 4 4 4 0 0 0 0 -4 0 -8 0 2 8 0 -8 -4 -4 0 4 -8 4 0 -8 8 8 -4 0 -12 -4 0 0 0 -4 4 0 0 -4 0 -4 0 2 0 0 -8 0 0 0 4 0 0 0 0 0 8 4 0 0 0 0 0 -4 0 0 -12 -8 -8 0 0 -8 0 8 0 0 0 8 0 -8 0 4 0 4 0 0 -4 0 0 4 0 8 -4 0 -4 4 4 -4 2 0 4 0 -4 0 -4 0 2 8 -4 -8 0 0 0 0 4 0 0 12 8 0 0 0 -4 2 4 -4 0 0 4 -4 0 4 -4 0 0 8 -2  [...]
+1 1 0 -8 -2 4 8 4 -8 0 -2 0 0 -8 0 0 0 0 8 0 -1 8 0 -8 0 0 4 0 16 0 2 0 0 -4 0 0 -2 -8 0 4 -4 0 8 0 8 0 0 8 0 8 8 0 2 0 -2 0 0 -1 4 4 8 0 -4 0 -8 0 0 -4 0 0 -4 -8 0 -8 0 0 0 0 0 -4 0 -8 8 0 0 0 0 -4 4 0 0 0 -8 -8 4 -8 0 -8 0 0 0 0 8 0 0 -8 -8 8 -4 0 -4 0 4 0 0 8 0 -4 -4 0 0 0 0 -4 8 0 8 0 0 -8 0 0 0 0 0 0 8 0 -8 0 8 0 0 8 0 0 -4 8 8 0 0 -8 0 -8 0 -8 0 8 0 -8 -4 0 -4 0 4 0 0 -4 0 0 0 -8 0 0 0 0 0 0 4 0 0 4 -4 0 0 0 -4 8 0 -8 0 0 -8 8 8 0 0 -4 8 0 0 -8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 4 -8 0 - [...]
+1 1 4 -10 0 0 8 4 4 4 0 -4 6 -12 -8 -8 4 -4 0 -6 1 0 8 12 16 -4 -4 0 -8 0 -2 0 4 4 4 -8 -2 -16 0 8 8 0 4 4 8 4 4 0 8 -8 0 -4 2 0 2 0 -8 -1 -8 -6 8 4 4 -16 -8 0 -4 -2 -4 -4 4 8 -4 16 8 -8 0 8 0 -8 4 8 0 0 0 -8 0 0 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 16 -4 0 -8 0 -8 -4 -8 -4 8 0 8 -4 -4 4 0 0 -4 0 4 -8 -2 -8 4 8 4 4 -8 4 8 16 0 -16 0 -16 0 8 0 -8 0 0 -4 16 -8 -4 8 16 4 8 0 0 0 0 -8 -16 -16 0 0 0 4 0 -8 0 4 -4 0 0 4 0 0 8 -4 -4 0 -4 0 6 8 -4 0 -4 4 4 -8 -2 -8 0 -8 0 0 -8 8 4 0 8 4 -8 -4 -8 8 -4 2 [...]
+1 1 0 0 -6 0 0 0 0 0 -6 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0 0 -6 24 -12 0 0 0 -6 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 -6 24 -6 0 0 3 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -4 0 0 0 12 0 12 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -48 0 12 0 0 0 -48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 12 0 0 0 0 0 0 0 -4 0 -4 0 0 0 12 0 0 0 0 0 0 12 0 0 24 0 0 0 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 0 12 0 0 0 -12 0 0 0 0 -6 0 0 0 0 3 0  [...]
+1 1 -4 0 -2 0 0 0 0 0 -2 0 0 0 0 -4 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 -2 8 -4 0 0 8 -2 0 8 0 0 0 0 0 0 0 -4 0 0 0 0 0 -2 8 -2 0 0 3 0 0 0 0 0 0 0 8 0 -4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 -4 4 0 8 0 -4 -16 -4 8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 0 -4 0 0 -4 0 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 -16 0 16 0 -4 0 8 0 16 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 -4 8 0 0 0 0 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 -4 0 -16 8 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 8 -4 0 0 0 0 -2 0 0 0 0 3 0  [...]
+1 1 0 2 -4 -4 0 0 -4 0 4 4 -2 -4 -8 4 0 0 -4 2 1 0 8 4 0 4 0 0 0 -4 -2 8 -4 0 -4 0 -2 0 0 4 4 0 4 4 0 -4 -4 0 -8 0 4 4 2 -8 2 0 8 -1 -4 -6 0 4 0 0 16 0 0 6 0 -4 0 0 -4 0 0 8 4 0 0 -4 -4 0 0 0 0 4 0 4 0 0 0 0 8 -16 6 0 0 0 0 -4 0 -4 -8 4 8 0 -8 0 0 0 0 -4 0 -8 0 -4 4 0 -4 4 -8 4 8 -2 0 0 0 0 0 0 -4 -8 8 0 -8 0 8 0 -16 0 0 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 8 -8 8 4 -4 -4 4 0 0 4 0 0 4 8 -8 -4 0 -4 0 -4 0 6 -8 4 0 0 0 4 8 -2 0 0 0 0 -8 16 0 4 0 0 0 0 0 8 0 4 2 -4 -4 -4 -4 4 4 -4 4 4 0 4 0 [...]
+1 1 0 -8 -6 8 0 0 -8 0 -6 8 0 0 0 0 0 0 8 0 3 -16 0 0 0 12 0 16 0 8 2 -8 4 0 0 0 2 0 0 -8 -8 0 0 0 0 0 12 -16 0 0 8 0 2 -8 2 16 0 3 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 -4 -4 -8 0 8 -4 0 -4 0 0 0 0 16 -16 16 -4 0 -16 0 0 0 0 0 0 0 0 0 0 -8 -12 0 0 0 0 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 16 -16 16 -16 0 0 0 0 0 8 0 8 -8 -12 0 0 -4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 0 -8 0 0 0 16 0 0 0 0 0 0 0 2 0 0 -8 -8 8 8 12 0 0 0 4 0 0 0 [...]
+1 1 0 -6 -4 4 0 0 4 0 4 -4 -2 4 -8 -4 0 0 4 2 1 0 8 -4 0 4 0 0 0 4 -2 8 -4 0 4 0 -2 0 0 -4 -4 0 -4 4 0 -4 -4 0 8 0 -4 4 2 -8 2 0 -8 -1 4 2 16 4 0 0 0 0 0 -2 0 -4 0 0 4 0 0 8 -4 0 0 4 -4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 -8 0 8 0 0 0 0 4 0 -8 0 4 -4 0 4 4 8 4 -8 6 -16 0 0 0 0 0 -4 8 -8 0 8 0 -8 0 0 0 -16 0 0 4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 -8 8 -8 -4 -4 4 -4 0 0 4 0 0 -4 -8 8 4 0 -4 0 -4 0 -2 8 4 0 0 0 4 -8 6 0 0 0 0 -8 0 16 -4 0 0 0 0 0 8 0 4 2 -4 4 4 4 -4 -4 -4 4 4 0 4 0 [...]
+1 1 -4 0 -2 0 0 -8 -8 8 -2 8 0 0 0 -4 -8 8 0 0 3 0 0 0 0 -4 -8 0 0 0 -2 -8 12 8 0 24 -2 0 -8 0 0 0 0 0 0 0 -4 0 0 16 0 0 -2 -8 -2 0 0 3 0 0 0 0 8 0 0 -8 8 12 -24 0 -24 0 0 0 24 0 0 16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 8 16 -24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 -24 16 8 -4 0 0 0 0 16 0 -16 0 -4 0 -8 0 -16 16 0 0 16 -24 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 12 -8 0 0 0 0 -4 0 4 0 4 0 0 0 12 8 -24 0 0 0 0 -4 0 -16 -8 0 0 0 0 16 -24 16 8 0 0 0 -2 0 0 0 0 0  [...]
+1 1 -8 0 2 0 0 0 0 0 2 0 0 0 0 -8 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 2 8 4 0 0 0 2 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 2 8 2 0 0 3 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 0 0 -4 32 -4 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 -16 0 -4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 -4 0 0 0 0 0 -8 0 -4 0 -4 0 0 0 -4 0 0 0 0 0 0 -4 0 32 8 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 -4 0 0 0 4 0 0 0 0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 [...]
+1 1 -4 -2 0 0 0 -4 -4 4 0 4 -2 -4 0 0 4 -4 0 2 1 0 0 4 8 -4 4 0 -8 0 -2 0 4 -4 4 8 -2 8 0 0 0 -8 4 -4 8 -4 4 0 0 8 0 4 2 0 2 0 0 -1 0 2 0 -4 -4 -8 0 0 -4 -2 -4 4 -4 0 4 -8 -8 0 0 8 8 0 -4 8 8 0 0 0 0 0 0 0 0 0 8 0 -2 0 0 0 0 4 0 4 8 4 8 -8 -8 -8 4 -8 4 0 0 0 4 -4 -4 0 0 4 -8 -4 0 -2 0 4 -8 4 -4 0 -4 0 -8 0 8 0 -8 0 0 0 0 0 0 -4 -8 -8 4 -8 8 4 0 0 0 0 0 0 8 -8 -8 8 0 -4 0 0 0 -4 4 0 0 -4 8 -8 0 4 4 0 4 0 -2 0 4 0 4 4 -4 0 -2 -8 0 -8 0 0 0 0 4 0 8 -4 8 -4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4  [...]
+1 1 -4 0 -2 0 0 8 8 -8 -2 -8 0 0 0 -4 8 -8 0 0 3 0 0 0 0 -4 8 0 0 0 -2 -8 12 -8 0 24 -2 0 -8 0 0 0 0 0 0 0 -4 0 0 -16 0 0 -2 -8 -2 0 0 3 0 0 0 0 -8 0 0 -8 -8 12 24 0 24 0 0 0 24 0 0 -16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -8 -16 24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 24 -16 -8 -4 0 0 0 0 16 0 -16 0 -4 0 -8 0 -16 16 0 0 -16 24 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 12 -8 0 0 0 0 -4 0 4 0 4 0 0 0 12 -8 24 0 0 0 0 -4 0 -16 -8 0 0 0 0 -16 24 -16 -8 0 0 0 -2 0  [...]
+1 1 -4 -2 0 0 0 4 4 -4 0 -4 -2 -4 0 0 -4 4 0 2 1 0 0 4 -8 -4 -4 0 8 0 -2 0 4 4 4 8 -2 -8 0 0 0 8 4 -4 8 -4 4 0 0 -8 0 4 2 0 2 0 0 -1 0 2 0 -4 4 8 0 0 4 -2 4 4 4 0 4 8 -8 0 0 -8 -8 0 -4 8 -8 0 0 0 0 0 0 0 0 0 -8 0 -2 0 0 0 0 4 0 4 -8 4 -8 -8 8 -8 -4 8 -4 0 0 0 4 -4 -4 0 0 4 8 -4 0 -2 0 -4 8 -4 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 0 0 -4 8 8 -4 8 -8 -4 0 0 0 0 0 0 -8 8 8 -8 0 -4 0 0 0 -4 4 0 0 -4 -8 8 0 4 4 0 4 0 -2 0 4 0 -4 -4 -4 0 -2 -8 0 -8 0 0 0 0 4 0 -8 4 -8 4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 - [...]
+1 1 0 6 -4 -8 -8 -4 -12 4 4 12 -2 -4 -8 12 4 -4 0 2 1 0 8 4 0 4 4 0 8 -16 2 -8 4 -4 -12 8 2 0 -8 16 0 0 4 4 8 4 -4 0 -24 -8 0 4 -2 8 -2 0 8 -1 -16 10 8 4 12 0 -24 8 12 -10 -4 4 -4 8 -12 0 -8 8 16 -8 0 0 4 8 0 0 0 8 0 8 0 0 0 0 -16 24 -10 16 16 -16 0 -4 -16 -4 16 -4 -16 -8 16 -8 -12 8 4 -8 0 -8 -8 -4 12 0 -8 -4 16 -4 24 6 -8 4 8 -12 8 -8 -4 -8 -16 0 16 0 -16 0 24 0 -8 0 0 -4 -16 8 4 8 16 -12 -8 -16 -16 16 16 -8 16 -16 16 -16 8 -4 -8 8 0 8 -4 0 0 12 -16 16 -8 -8 -4 0 -4 0 -10 -8 -4 0 -12 4 [...]
+1 1 -4 2 0 -4 -8 0 -4 0 0 4 -2 -4 0 8 0 0 4 2 1 0 0 4 8 -4 0 0 0 4 2 0 -4 0 -4 0 2 -8 8 -4 -4 8 4 -4 0 4 4 0 16 0 -4 4 -2 0 -2 0 0 -1 4 2 -8 -4 0 -8 8 -8 0 -2 0 -4 0 8 -4 8 0 0 -4 0 -8 4 4 0 8 0 0 4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 -4 -4 4 0 -4 -4 0 4 -16 6 8 0 0 0 4 -8 -4 0 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 -4 -4 4 0 4 -4 0 0 4 0 0 -4 -4 4 0 4 0 -2 0 -4 0 0 0 4 -16 6 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 8 4 -2 4 -4 4 4 -4 -4 4 -4 -4 -8 4 -8  [...]
+1 1 0 -2 -4 0 -8 4 4 -4 4 -4 -2 4 -8 4 -4 4 -8 2 1 0 8 -4 0 4 -4 0 8 8 2 -8 4 4 -4 8 2 0 -8 -8 8 0 -4 4 8 4 -4 0 -8 8 8 4 -2 8 -2 0 -8 -1 8 2 -8 4 -12 0 -8 8 -12 -2 4 4 4 8 -4 0 -8 8 -8 8 0 -8 4 8 0 0 0 0 0 0 0 0 0 0 0 8 -2 -16 -16 16 0 -4 16 -4 0 -4 0 -8 0 -8 12 -8 -4 0 0 -8 -8 4 4 0 0 -4 0 -4 8 -2 8 -4 -8 12 8 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 -4 -8 0 12 -8 16 16 -16 -16 -8 0 0 0 0 0 -4 0 0 0 8 -4 0 0 4 0 0 0 -8 -4 0 -4 0 -2 8 -4 0 12 -4 -4 8 -2 -8 0 -8 0 8 -8 -8 -4 0 8 4 8 -12 8 8  [...]
+1 1 0 -6 0 0 0 4 4 0 0 -12 -2 -4 0 4 0 0 -4 2 -3 8 0 4 -8 0 -4 0 0 4 6 0 0 12 -4 0 -6 0 0 0 0 8 -4 -4 8 -4 0 -8 0 24 4 -4 -6 0 6 0 0 3 0 -2 0 4 12 8 0 0 0 -2 0 4 -12 0 4 0 0 0 -4 0 -8 0 4 -8 0 -12 4 4 0 0 0 0 12 0 8 0 2 8 0 -8 -4 -4 0 4 8 4 0 8 -8 -8 -12 0 12 -4 0 0 0 4 -4 0 0 -4 0 -4 0 2 0 0 -24 0 0 0 4 0 0 0 0 0 -8 -12 0 0 0 0 0 4 0 0 12 -24 8 0 0 -8 0 8 0 0 0 -8 0 8 0 4 0 4 0 0 -4 0 0 -4 0 -8 -4 0 -4 4 4 -4 2 0 4 0 -12 0 -4 0 2 -8 12 8 0 0 0 0 -4 0 0 -12 24 0 0 0 -4 -6 4 4 0 0 4 -4 0  [...]
+1 1 0 -10 0 4 0 0 4 -4 0 -4 -2 4 0 -4 4 4 8 2 -3 16 0 -4 0 0 0 -8 8 -8 2 0 0 0 4 0 -2 -8 0 4 -4 0 4 4 8 -12 0 -16 0 0 -8 -4 -2 0 2 8 0 3 -4 6 0 -4 0 0 0 0 4 6 12 -12 0 0 -4 8 0 0 8 8 0 4 12 -8 -8 4 -4 8 0 4 0 0 -4 0 0 0 -6 -16 -8 16 4 4 8 -4 0 12 8 8 0 -8 0 -8 0 -8 0 0 0 -4 4 0 -4 -12 -8 12 0 -6 0 -12 0 -4 0 0 4 0 -8 0 8 0 0 4 0 0 0 0 0 -4 -8 -8 0 0 0 -4 0 16 8 -16 -8 0 8 0 -8 0 4 4 -4 8 0 0 -12 0 0 4 8 0 -8 0 4 -4 -4 4 -6 0 12 0 0 -12 12 0 -6 -8 -4 8 0 0 0 0 4 8 8 0 0 4 0 0 -4 -2 12 -4  [...]
+1 1 -4 -8 -2 8 0 0 -8 0 -2 8 0 0 0 -4 0 0 -8 0 3 -16 0 0 -16 -4 0 16 16 -8 6 -8 -4 0 0 -8 6 16 24 8 8 -16 0 0 0 0 -4 -16 0 0 -8 0 6 -8 6 16 0 3 8 0 0 0 0 -16 0 24 0 -4 0 0 0 0 0 16 -8 0 -8 0 -16 8 0 0 16 12 4 -8 -8 8 -4 -16 12 -8 -16 0 0 -16 16 -16 4 0 16 0 -16 0 16 0 -16 0 0 0 0 -8 -4 0 -4 0 0 -4 8 0 16 0 0 0 0 0 0 0 -4 0 0 0 16 16 16 -16 -16 12 0 -8 0 -16 16 0 16 0 0 0 -16 0 0 -16 16 -16 16 0 16 -16 16 -16 8 0 8 -8 -4 -4 0 -4 -8 0 16 -16 -8 -4 0 4 0 4 0 0 0 -4 0 0 0 0 0 0 12 0 -16 -8 0 [...]
+1 1 0 -10 -4 8 8 4 4 4 4 -12 -2 -4 -8 -4 4 -4 0 2 1 -16 8 4 0 4 -4 16 -8 0 2 -8 4 4 4 -8 2 0 8 0 0 0 4 4 -8 4 -4 16 8 8 0 4 -2 8 -2 -16 8 -1 0 2 -8 4 -12 0 -8 -8 12 -2 -4 4 4 -8 4 0 8 8 0 -8 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 12 8 -4 -8 0 -8 8 -4 -4 0 -8 -4 0 -4 -8 -2 8 4 -8 -12 -8 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 8 -4 -8 0 -12 -8 0 0 0 0 8 0 0 0 0 8 -4 -8 8 0 -8 -4 0 0 -4 0 0 -8 8 -4 0 -4 0 -2 -8 -4 0 12 4 -4 -8 -2 8 0 8 0 8 -8 -8 4 -16 -8 4 8 12 8 -8 4 - [...]
+1 1 -4 -6 0 4 -8 0 4 0 0 -4 -2 4 0 0 0 0 -4 2 1 0 0 -4 -8 -4 0 0 16 -4 2 0 -4 0 4 0 2 8 8 4 4 -8 -4 -4 0 4 4 0 0 0 4 4 -2 0 -2 0 16 -1 -4 -6 8 -4 0 8 -8 -8 0 6 0 -4 0 8 4 -8 0 0 4 0 8 -4 4 0 -8 0 0 -4 0 -4 0 0 0 0 0 8 6 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 0 -4 4 -4 0 4 -4 0 4 0 -2 -8 0 0 0 4 -8 -4 -16 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 -4 4 -4 0 4 -4 0 0 -4 0 0 4 -4 4 0 4 0 6 -16 -4 0 0 0 4 0 -2 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 8 4 -2 4 4 -4 -4 4 4 4 -4 -4 -8 4 8  [...]
+1 1 0 -10 -4 8 -8 -4 4 4 4 -4 -2 12 -8 -4 4 -4 16 2 1 0 8 -12 0 4 4 0 8 0 2 -8 4 -4 4 8 2 0 -8 0 -16 0 -12 4 8 4 -4 0 8 -8 -16 4 -2 8 -2 0 -24 -1 0 -6 -24 4 12 0 8 8 12 6 -4 4 -4 8 4 0 -8 8 0 -8 0 16 4 8 0 0 0 -8 0 -8 0 0 0 0 16 -8 6 16 16 -16 0 -4 -16 -4 -16 -4 16 -8 -16 -8 -12 8 4 8 0 -8 -8 12 -4 0 8 -4 -16 -4 -8 -10 24 4 8 -12 8 -8 -4 24 16 0 -16 0 16 0 -8 0 24 0 0 12 16 8 4 8 -16 -12 -8 -16 -16 16 16 -8 -16 16 -16 16 -8 -4 8 -8 0 8 -4 0 0 -4 16 -16 8 -8 -4 0 -4 0 6 24 -4 0 -12 4 -4 - [...]
+1 1 -12 0 6 0 0 8 -8 -24 6 24 0 0 0 -12 -8 -24 0 0 3 0 0 0 0 12 8 0 0 0 6 24 12 24 0 -24 6 0 -24 0 0 0 0 0 0 0 12 0 0 48 0 0 6 24 6 0 0 3 0 0 0 0 24 0 0 -24 -24 12 -24 0 24 0 0 0 -24 0 0 -48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 24 -48 24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 -24 48 -24 -12 0 0 0 0 -16 0 48 0 12 0 -24 0 48 -16 0 0 -48 24 48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -12 0 12 -24 0 0 0 0 -12 0 4 0 4 0 0 0 12 24 -24 0 0 0 0 12 0 -48 24 0 0 0 0 -48 24 48  [...]
+1 1 -8 -2 4 0 -8 4 -4 -12 -4 12 -2 -4 8 4 4 12 8 2 1 0 -8 4 0 4 -4 0 8 -8 2 8 4 -12 4 -8 2 0 -8 -8 8 0 4 4 -8 4 -4 0 -8 8 -8 4 -2 -8 -2 0 -8 -1 8 2 8 4 4 0 8 8 -4 -2 -4 4 4 8 4 0 8 -8 8 -8 0 -8 4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 16 -16 -16 0 -4 16 -4 0 -4 0 8 0 8 -4 8 -4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 4 -8 4 0 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 -4 -8 0 4 8 -16 16 16 -16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 -4 4 -4 8 -2 8 0 8 0 -8 8 8 4 0 -8 4 8 -4 -8 8 4 -2  [...]
+1 1 -12 0 6 0 0 -8 8 24 6 -24 0 0 0 -12 8 24 0 0 3 0 0 0 0 12 -8 0 0 0 6 24 12 -24 0 -24 6 0 -24 0 0 0 0 0 0 0 12 0 0 -48 0 0 6 24 6 0 0 3 0 0 0 0 -24 0 0 -24 24 12 24 0 -24 0 0 0 -24 0 0 48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -24 48 -24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 24 -48 24 -12 0 0 0 0 -16 0 48 0 12 0 -24 0 48 -16 0 0 48 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -12 0 12 -24 0 0 0 0 -12 0 4 0 4 0 0 0 12 -24 24 0 0 0 0 12 0 -48 24 0 0 0 0 48 -24 -48 [...]
+1 1 -8 -2 4 0 -8 -4 4 12 -4 -12 -2 -4 8 4 -4 -12 -8 2 1 0 -8 4 0 4 4 0 8 8 2 8 4 12 4 -8 2 0 -8 8 -8 0 4 4 -8 4 -4 0 -8 -8 8 4 -2 -8 -2 0 -8 -1 -8 2 8 4 -4 0 8 8 4 -2 4 4 -4 8 4 0 8 -8 -8 8 0 8 4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 -16 16 16 0 -4 -16 -4 0 -4 0 8 0 8 4 -8 4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 -4 8 -4 0 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 -8 4 8 0 -4 8 16 -16 -16 16 -8 0 0 0 0 0 -4 0 0 0 0 -4 0 0 -4 0 0 0 0 -4 0 -4 0 -2 8 -4 0 4 -4 -4 8 -2 8 0 8 0 -8 8 8 4 0 8 -4 -8 4 -8 8 4 -2  [...]
+1 -1 8 -10 4 -8 -8 4 -4 12 4 4 2 -4 -8 4 4 12 0 2 1 -16 -8 -4 0 4 4 -16 -8 0 2 8 4 12 -4 8 2 0 8 0 0 0 4 -4 -8 -4 4 -16 -8 8 0 -4 2 8 2 -16 -8 1 0 -2 -8 -4 4 0 -8 8 4 2 4 -4 4 8 4 0 8 8 0 8 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 4 8 4 -8 0 8 0 4 4 0 8 -4 0 -4 -8 -2 -8 4 8 4 0 8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 8 4 -8 -8 0 0 4 0 0 -4 0 0 8 0 4 0 4 0 2 8 4 0 -4 -4 4 8 2 8 0 8 0 -8 8 8 -4 16 -8 -4 -8 -4 -8 -8 4 -2 4 -4 0 0 0 [...]
+1 -1 4 -6 0 -4 16 0 -4 0 0 -4 -6 -4 8 0 0 0 4 -6 1 0 8 -4 0 -4 0 0 16 4 2 0 -4 0 -4 0 2 0 -8 4 4 0 -4 -4 0 4 -4 0 -8 0 4 4 2 0 2 0 -8 1 4 -2 0 -4 0 0 0 -8 0 -6 0 -4 0 0 -4 0 0 8 4 0 0 4 4 0 0 0 0 -4 0 4 0 0 0 0 8 0 -2 0 0 0 0 -4 0 -4 -8 4 -8 0 -8 0 0 0 0 4 0 8 4 -4 -4 0 -4 4 8 -4 -8 -2 0 0 0 0 -4 0 4 -8 -8 0 8 0 8 0 0 0 0 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 0 -8 -8 -8 -8 -4 -4 4 4 0 4 -4 0 0 4 8 8 -4 -4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 0 -4 -2 -4 4 -4 -4 -4 -4 4 4 4 8 4 0 [...]
+1 -1 8 -8 2 -8 16 0 8 0 -2 8 0 -8 0 -16 0 0 8 0 3 -16 0 8 0 -4 0 -16 -16 8 2 8 4 0 8 0 2 0 0 8 8 0 -8 0 16 16 4 16 -16 0 -8 0 -2 -8 -2 16 -16 -3 -8 -8 0 0 0 0 0 0 0 -12 0 -16 0 16 -8 0 0 0 -8 0 0 -8 16 16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 8 16 16 16 -4 0 16 0 0 -16 0 -16 0 -16 0 0 0 -8 4 0 8 8 8 -4 -8 -16 0 16 16 8 0 0 0 0 8 -16 0 16 0 0 0 -16 0 4 0 0 0 16 0 -8 0 0 0 0 0 0 0 -16 -16 -16 -16 16 0 0 0 0 8 0 8 8 -4 -8 16 4 0 -8 0 0 8 -8 0 4 0 4 -8 -16 16 4 0 0 -16 -16 -8 16 4 16 32 8 0 0 8 -1 [...]
+1 -1 0 2 0 -8 0 4 4 0 0 -4 2 4 0 -4 0 0 4 2 -3 -8 0 4 -8 0 4 16 0 -4 -2 0 0 4 -4 0 2 0 0 8 -8 8 4 4 -8 -12 0 -8 0 -8 4 4 -2 0 2 16 0 -3 8 -6 0 -4 -4 -8 0 0 0 -6 0 12 -12 0 -4 0 0 0 -4 0 8 -8 12 8 0 4 4 -4 0 -8 0 0 -4 0 8 0 -6 -8 -16 8 -4 -4 16 4 8 -12 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 8 12 0 12 0 -6 0 0 -8 0 0 0 4 0 0 0 0 0 -8 -4 0 0 0 0 0 -4 0 0 12 8 -8 0 0 -8 -16 8 16 0 0 8 0 -8 8 -4 -8 4 0 0 -12 0 0 4 0 8 -4 0 4 -4 -4 4 6 0 12 0 4 0 -12 0 6 8 4 -8 0 0 0 0 -4 -16 0 12 8 0 0 0 -4 2 -12  [...]
+1 -1 0 -2 0 -4 0 0 4 4 0 -4 2 4 0 -4 4 4 0 2 -3 0 0 4 0 0 0 8 -8 0 2 0 0 0 -4 0 -2 8 0 -4 4 0 4 -4 8 -4 0 0 0 0 0 4 2 0 -2 8 0 -3 -4 2 0 4 0 0 0 0 -4 2 -12 -4 0 0 -4 8 0 0 0 -8 0 4 4 -8 -8 4 -4 0 0 -4 0 0 -4 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 -8 -8 0 8 0 -8 0 0 0 0 0 4 -4 0 4 4 8 -4 0 2 0 -12 0 -4 0 0 4 0 8 0 -8 0 0 -4 0 0 0 0 0 -4 -8 8 0 0 0 4 0 0 8 0 -8 0 8 0 -8 0 4 -4 -4 0 0 0 -4 0 0 4 8 0 0 0 -4 4 4 -4 -2 0 4 0 0 12 4 0 -2 -8 4 8 0 0 0 0 -4 -8 8 0 0 4 0 0 -4 -2 -4 4 4 -4 0 0 0 -4 4 0 0 0 - [...]
+1 -1 0 -6 0 0 0 -4 -4 0 0 12 2 4 0 -4 0 0 -4 2 -3 8 0 4 -8 0 -4 0 0 4 6 0 0 12 -4 0 -6 0 0 0 0 8 4 4 -8 4 0 8 0 -24 -4 4 6 0 -6 0 0 -3 0 2 0 -4 -12 -8 0 0 0 2 0 -4 12 0 -4 0 0 0 4 0 8 0 -4 8 0 -12 4 4 0 0 0 0 12 0 8 0 2 8 0 -8 -4 -4 0 4 8 4 0 8 -8 -8 -12 0 12 -4 0 0 0 4 -4 0 0 -4 0 -4 0 2 0 0 -24 0 0 0 4 0 0 0 0 0 -8 12 0 0 0 0 0 -4 0 0 -12 24 -8 0 0 8 0 -8 0 0 0 8 0 -8 0 -4 0 -4 0 0 4 0 0 4 0 8 4 0 4 -4 -4 4 -2 0 -4 0 12 0 4 0 -2 8 -12 -8 0 0 0 0 -4 0 0 -12 24 0 0 0 -4 -6 4 4 0 0 4 -4 0 [...]
+1 -1 4 -4 2 -8 -8 0 8 4 -2 16 8 0 -8 -12 -4 -4 4 -8 -1 -8 8 0 -8 0 0 0 8 4 2 0 0 -8 8 0 -2 16 0 0 0 8 8 0 0 -8 0 8 -8 0 -4 -8 -2 0 2 0 8 1 0 4 -8 0 -8 8 8 0 4 -4 -4 0 0 8 0 -16 0 8 -4 -8 -8 0 8 0 0 0 0 12 8 8 -4 0 0 -8 -8 -8 -4 -8 0 -8 0 0 0 0 8 8 -16 0 -8 0 8 8 0 12 -4 -8 -4 -8 0 4 8 -8 -16 0 8 4 8 4 0 -4 -4 -8 8 -8 0 0 0 0 8 0 8 8 -8 0 0 8 0 -8 0 0 -8 4 8 8 0 8 0 8 0 -8 16 8 -8 -8 -8 -12 4 4 8 -4 -8 0 16 8 -12 4 0 0 0 0 4 8 -8 4 -8 -4 0 -8 -4 0 0 0 0 0 -8 8 -8 0 8 0 0 -4 -8 -8 8 2 -8 0 [...]
+1 -1 0 2 -4 -4 0 0 4 0 -4 -4 2 4 8 -4 0 0 -4 2 1 0 8 4 0 4 0 0 0 -4 -2 8 -4 0 -4 0 -2 0 0 4 4 0 -4 -4 0 4 4 0 8 0 -4 -4 -2 8 -2 0 -8 1 4 6 0 -4 0 0 -16 0 0 -6 0 4 0 0 4 0 0 -8 -4 0 0 4 4 0 0 0 0 4 0 4 0 0 0 0 8 -16 6 0 0 0 0 -4 0 -4 -8 4 8 0 -8 0 0 0 0 -4 0 -8 0 -4 4 0 -4 4 -8 4 8 -2 0 0 0 0 0 0 -4 -8 8 0 -8 0 8 0 16 0 0 0 0 4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -8 8 -8 -4 4 4 -4 0 0 -4 0 0 -4 -8 8 4 0 4 0 4 0 -6 8 -4 0 0 0 -4 -8 2 0 0 0 0 -8 16 0 4 0 0 0 0 0 8 0 4 2 -4 -4 -4 -4 4 4 -4 4 4 0 4 0  [...]
+1 -1 0 6 -4 -8 8 4 12 -4 -4 -12 2 4 8 -12 4 -4 0 2 1 0 8 4 0 4 4 0 8 -16 2 -8 4 -4 -12 8 2 0 -8 16 0 0 -4 -4 -8 -4 4 0 24 8 0 -4 2 -8 2 0 -8 1 16 -10 -8 -4 -12 0 24 -8 -12 10 4 -4 4 -8 12 0 8 -8 -16 8 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 -16 24 -10 16 16 -16 0 -4 -16 -4 16 -4 -16 -8 16 -8 -12 8 4 -8 0 -8 -8 -4 12 0 -8 -4 16 -4 24 6 -8 4 8 -12 8 -8 -4 -8 -16 0 16 0 -16 0 -24 0 8 0 0 4 16 -8 -4 -8 -16 12 8 16 16 -16 -16 8 -16 16 -16 16 -8 4 8 -8 0 -8 4 0 0 -12 16 -16 8 8 4 0 4 0 10 8 4 0 12 -4 4  [...]
+1 -1 -4 2 0 -4 8 0 4 0 0 -4 2 4 0 -8 0 0 4 2 1 0 0 4 8 -4 0 0 0 4 2 0 -4 0 -4 0 2 -8 8 -4 -4 8 -4 4 0 -4 -4 0 -16 0 4 -4 2 0 2 0 0 1 -4 -2 8 4 0 8 -8 8 0 2 0 4 0 -8 4 -8 0 0 4 0 8 -4 -4 0 -8 0 0 4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 -4 -4 4 0 -4 -4 0 4 -16 6 8 0 0 0 4 -8 -4 0 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 4 4 -4 0 -4 4 0 0 -4 0 0 4 4 -4 0 -4 0 2 0 4 0 0 0 -4 16 -6 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 8 4 -2 4 -4 4 4 -4 -4 4 -4 -4 -8 4 -8 2 8  [...]
+1 -1 0 4 -2 -8 8 0 0 -4 2 8 0 0 0 -8 -4 4 4 0 -1 0 0 0 -8 0 0 8 -8 -4 -2 0 0 0 8 0 2 0 0 8 0 8 0 0 8 0 0 0 0 0 -4 0 2 0 -2 -8 0 1 -8 -4 -8 0 0 8 8 0 -4 4 -4 0 0 -8 8 0 0 0 4 8 -8 0 0 -8 0 0 0 -4 0 0 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 8 8 0 -8 0 -8 0 -4 4 0 0 0 -8 4 0 0 8 0 0 -4 8 4 0 4 0 8 0 0 -8 0 -8 0 0 0 8 0 -8 0 0 0 8 8 0 0 0 -4 0 0 8 0 8 -8 8 0 -8 0 0 0 0 4 -4 0 0 -4 0 8 -8 0 4 0 0 0 0 0 -4 0 0 4 0 -4 0 0 4 8 0 -8 0 0 -8 8 0 8 -8 0 0 4 0 8 0 -2 0 -8 8 0 4 -4 0 0 0 0 0 8 4 0 0 2 0 0 [...]
+1 -1 0 -2 -4 0 8 -4 -4 4 -4 4 2 -4 8 -4 -4 4 -8 2 1 0 8 -4 0 4 -4 0 8 8 2 -8 4 4 -4 8 2 0 -8 -8 8 0 4 -4 -8 -4 4 0 8 -8 -8 -4 2 -8 2 0 8 1 -8 -2 8 -4 12 0 8 -8 12 2 -4 -4 -4 -8 4 0 8 -8 8 -8 0 8 -4 -8 0 0 0 0 0 0 0 0 0 0 0 8 -2 -16 -16 16 0 -4 16 -4 0 -4 0 -8 0 -8 12 -8 -4 0 0 -8 -8 4 4 0 0 -4 0 -4 8 -2 8 -4 -8 12 8 -8 -4 8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 4 8 0 -12 8 -16 -16 16 16 8 0 0 0 0 0 4 0 0 0 -8 4 0 0 -4 0 0 0 8 4 0 4 0 2 -8 4 0 -12 4 4 -8 2 8 0 8 0 8 -8 -8 -4 0 8 4 8 -12 8 8 4 -2 [...]
+1 -1 0 0 -2 -4 8 -4 0 0 2 8 0 0 0 -8 0 0 0 0 -1 8 0 0 0 0 4 0 -16 8 2 0 0 -4 8 0 -2 8 0 -4 4 0 0 0 -8 0 0 -8 0 -8 0 0 -2 0 2 0 0 1 4 4 8 0 4 0 -8 0 0 -4 0 0 4 -8 8 -8 0 0 -8 0 0 -4 0 8 8 0 0 -8 0 4 4 0 0 0 8 8 -4 -8 0 -8 0 0 0 0 -8 0 0 -8 8 8 -4 0 -4 -8 4 0 0 0 -8 -4 4 0 0 0 0 4 -8 0 8 0 0 8 0 0 0 0 0 0 -8 0 -8 0 8 0 0 0 0 0 4 -8 8 0 0 8 0 8 0 -8 0 8 0 -8 -4 0 -4 8 -4 0 0 4 0 8 0 -8 8 0 0 0 0 0 4 0 0 -4 4 0 0 0 -4 -8 0 8 0 0 8 -8 0 0 0 -4 8 0 0 8 0 2 0 -8 -4 4 0 8 0 0 0 0 0 0 -4 8 0 -2 0 [...]
+1 -1 0 6 -4 -8 -8 4 4 4 -4 -12 2 4 8 4 -4 4 0 2 1 16 8 4 0 4 4 -16 -8 0 2 -8 4 -4 4 -8 2 0 8 0 0 0 -4 -4 8 -4 4 16 -8 8 0 -4 2 -8 2 -16 -8 1 0 -2 8 -4 -12 0 8 8 12 2 -4 -4 4 8 -4 0 -8 -8 0 -8 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 -12 -8 4 8 0 -8 8 -4 -4 0 8 -4 0 -4 -8 -2 8 -4 8 12 -8 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 -4 -8 0 -12 8 0 0 0 0 -8 0 0 0 0 8 4 -8 8 0 8 4 0 0 4 0 0 -8 -8 4 0 4 0 2 8 4 0 12 4 4 8 2 -8 0 -8 0 8 -8 -8 4 16 8 -4 -8 -12 8 -8 4 -2 4 4  [...]
+1 -1 0 8 -6 -8 0 0 -8 0 6 8 0 0 0 0 0 0 -8 0 3 16 0 0 0 12 0 -16 0 -8 2 -8 4 0 0 0 2 0 0 8 8 0 0 0 0 0 -12 -16 0 0 8 0 -2 8 -2 16 0 -3 -8 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 8 0 0 -8 0 0 0 -4 -4 8 0 -8 -4 0 -4 0 0 0 0 -16 16 -16 -4 0 16 0 0 0 0 0 0 0 0 0 0 8 -12 0 0 0 0 -4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 16 -16 16 -16 0 0 0 0 0 8 0 8 -8 12 0 0 4 0 0 0 0 -8 0 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 0 -8 0 0 0 -16 0 0 0 0 0 0 0 2 0 0 8 8 -8 -8 12 0 0 0 4 0 0 0  [...]
+1 -1 -4 8 -2 -8 0 0 -8 0 2 8 0 0 0 4 0 0 8 0 3 16 0 0 16 -4 0 -16 -16 8 6 -8 -4 0 0 -8 6 -16 24 -8 -8 16 0 0 0 0 4 -16 0 0 -8 0 -6 8 -6 16 0 -3 8 0 0 0 0 -16 0 -24 0 4 0 0 0 0 0 16 8 0 -8 0 -16 8 0 0 16 12 4 8 -8 -8 -4 -16 12 -8 16 0 0 16 -16 16 4 0 -16 0 16 0 -16 0 16 0 0 0 0 8 -4 0 -4 0 0 -4 -8 0 -16 0 0 0 0 0 0 0 -4 0 0 0 -16 16 -16 -16 16 -12 0 8 0 16 -16 0 16 0 0 0 -16 0 0 -16 16 -16 16 0 16 -16 16 -16 8 0 8 -8 4 4 0 4 8 0 16 -16 -8 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 -12 0 16 -8 0 0 0  [...]
+1 -1 4 -2 0 -8 -8 4 -4 4 0 -12 -6 4 8 16 -4 4 8 -6 1 0 8 4 -16 -4 4 0 -8 8 -2 0 4 -4 12 -8 -2 16 0 0 0 0 4 -4 -8 -4 -4 0 8 -8 8 4 -2 0 -2 0 -8 1 0 -2 8 -4 4 -16 -8 0 -4 10 -4 4 4 -8 -4 16 -8 8 8 8 0 0 -4 -8 0 0 0 0 0 8 0 0 0 0 -16 -8 -2 0 0 0 0 -4 0 -4 0 -4 16 -8 16 -8 4 8 4 0 0 8 -4 4 -4 0 -8 -4 -16 4 8 6 8 -4 -8 -4 4 -8 4 -8 0 0 0 0 0 0 8 0 -8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 16 16 -8 -4 8 0 0 -4 4 0 0 4 -16 -16 0 4 4 0 4 0 2 8 4 0 -4 4 -4 -8 -6 8 0 8 0 0 8 -8 -4 0 -8 -4 8 4 -8 8  [...]
+1 -1 4 -10 0 0 -8 -4 -4 -4 0 4 -6 12 8 8 4 -4 0 -6 1 0 8 12 16 -4 -4 0 -8 0 -2 0 4 4 4 -8 -2 -16 0 8 8 0 -4 -4 -8 -4 -4 0 -8 8 0 4 -2 0 -2 0 8 1 8 6 -8 -4 -4 16 8 0 4 2 4 4 -4 -8 4 -16 -8 8 0 -8 0 8 -4 -8 0 0 0 -8 0 0 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 16 -4 0 -8 0 -8 -4 -8 -4 8 0 8 -4 -4 4 0 0 -4 0 4 -8 -2 -8 4 8 4 4 -8 4 8 16 0 -16 0 -16 0 -8 0 8 0 0 4 -16 8 4 -8 -16 -4 -8 0 0 0 0 8 16 16 0 0 0 -4 0 8 0 -4 4 0 0 -4 0 0 -8 4 4 0 4 0 -6 -8 4 0 4 -4 -4 8 2 8 0 8 0 0 -8 8 4 0 8 4 -8 -4 -8 8 -4  [...]
+1 -1 8 -8 2 -8 -16 0 8 0 -2 8 0 8 0 0 0 0 8 0 3 -16 0 -8 0 -4 0 -16 16 8 2 8 4 0 -8 0 2 0 0 8 8 0 8 0 -16 -16 4 16 16 0 -8 0 -2 -8 -2 16 16 -3 -8 8 0 0 0 0 0 0 0 4 0 16 0 -16 8 0 0 0 -8 0 0 -8 -16 -16 0 -4 -4 -8 0 -8 -4 -32 -4 0 0 0 -8 16 16 16 -4 0 16 0 0 16 0 16 0 16 0 0 0 -8 4 0 8 -8 -8 -4 -8 16 0 -16 -16 -8 0 0 0 0 8 16 0 -16 0 0 0 -16 0 4 0 0 0 16 0 8 0 0 0 0 0 0 0 -16 -16 -16 -16 -16 0 0 0 0 8 0 8 8 -4 -8 -16 4 0 8 0 0 8 -8 0 4 0 4 8 16 -16 4 0 0 16 16 8 -16 4 -16 32 8 0 0 -8 -16 0 [...]
+1 -1 0 -6 4 -4 8 0 -4 0 4 -4 -6 4 0 4 0 0 -4 -6 1 0 0 4 8 4 0 0 16 -4 -2 -8 -4 0 4 0 -2 8 0 -4 -4 8 4 4 0 -4 4 0 0 0 -4 4 -2 -8 -2 0 0 1 -4 -2 -8 4 0 8 -8 0 0 -6 0 -4 0 8 4 8 0 -16 -4 0 8 -4 -4 0 8 0 0 -4 0 4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 -16 0 4 4 0 -4 -4 0 -4 0 -2 -8 0 0 0 0 8 4 0 0 0 0 0 0 0 8 0 8 0 0 -4 0 0 0 0 0 0 16 0 0 0 0 -8 0 0 0 0 -4 -4 4 4 0 0 4 0 0 -4 0 0 -4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 8 8 -4 0 0 0 0 0 16 -8 -4 2 4 -4 4 4 4 4 -4 -4 -4 0 4 -8 [...]
+1 -1 4 -8 6 -8 0 0 8 0 -6 8 0 0 0 -4 0 0 -8 0 3 -16 0 0 16 12 0 -16 16 -8 -2 -8 -4 0 0 8 -2 16 8 -8 -8 16 0 0 0 0 -12 16 0 0 8 0 2 8 2 16 0 -3 8 0 0 0 0 -16 0 -8 0 4 0 0 0 0 0 -16 -8 0 8 0 -16 8 0 0 -16 -4 4 -8 -24 -8 -4 16 -4 -24 16 0 0 -16 -16 -16 4 0 -16 0 16 0 16 0 16 0 0 0 0 -8 12 0 4 0 0 -4 -8 0 16 0 0 0 0 0 0 0 4 0 0 0 16 -16 16 -16 16 4 0 24 0 16 16 0 -16 0 0 0 -16 0 0 16 16 16 16 0 -16 -16 -16 -16 8 0 8 8 -12 -4 0 4 24 0 -16 -16 8 -4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 4 0 -16 -8 0 0  [...]
+1 -1 4 -4 2 -8 8 0 0 -4 -2 0 -8 0 8 4 4 4 4 8 -1 -8 -8 0 -8 0 0 0 -8 4 2 0 0 8 -8 0 -2 16 0 0 0 8 -8 0 0 8 0 8 8 0 -4 8 -2 0 2 0 -8 1 0 -4 8 0 8 8 -8 0 -4 4 4 0 0 -8 0 -16 0 -8 -4 8 -8 0 -8 0 0 0 0 12 8 8 -4 0 0 -8 -8 8 4 -8 0 -8 0 0 0 0 8 -8 -16 0 -8 0 -8 -8 0 12 -4 8 -4 8 0 4 8 8 -16 0 -8 -4 -8 -4 0 4 -4 8 -8 8 0 0 0 0 8 0 -8 8 8 0 0 -8 0 8 0 0 -8 -4 -8 8 0 8 0 -8 0 -8 16 8 -8 8 -8 -12 4 4 -8 -4 -8 0 16 8 -12 4 0 0 0 0 -4 -8 8 4 8 4 0 8 4 0 0 0 0 0 8 -8 8 0 -8 0 0 4 8 8 -8 2 8 0 0 0 4  [...]
+1 -1 4 -8 2 -4 8 -4 8 -8 -2 0 -8 8 8 -4 0 8 0 8 -1 0 -8 -8 16 0 4 -8 0 0 -2 0 0 4 0 0 2 -8 0 4 4 0 0 0 0 -8 0 0 -8 8 0 8 2 0 -2 8 8 1 -4 4 -8 0 -4 -16 8 0 8 -4 0 0 4 -8 -8 8 0 -8 0 0 0 -4 8 0 -8 0 0 8 -8 12 4 0 0 8 0 -8 -4 0 -8 0 0 0 -8 0 -16 8 8 0 0 0 4 0 -4 8 -4 8 -4 0 8 -4 12 -8 8 0 8 4 8 0 -8 -8 -4 8 -8 -8 -8 0 -8 0 -16 0 8 -8 -8 0 0 0 8 0 4 8 16 8 -8 0 8 0 8 -8 8 16 -8 0 -12 8 -12 -8 4 4 8 4 8 -8 -8 0 -8 4 0 0 0 0 4 8 -8 -4 -4 0 0 -8 -4 0 0 0 0 0 -8 8 0 -8 0 -4 -8 -8 8 8 -8 -2 -8 8  [...]
+1 -1 0 -2 0 -4 0 0 -4 12 0 -4 2 -4 0 4 -4 12 0 2 -3 0 0 -4 0 0 0 8 8 0 -6 0 0 0 4 0 6 -8 0 -4 4 0 -4 -4 -8 -4 0 0 0 0 0 4 -6 0 6 8 0 -3 -4 2 0 4 0 0 0 0 -12 2 12 -4 0 0 4 -8 0 0 0 -24 0 4 4 8 8 -12 -4 0 0 -4 0 0 12 0 0 0 2 0 8 0 4 4 -8 -4 0 -4 8 8 0 -8 0 -24 0 0 0 0 0 -4 4 0 4 4 -8 -4 0 2 0 12 0 -12 0 0 4 0 -8 0 8 0 0 12 0 0 0 0 0 4 8 24 0 0 0 12 0 0 8 0 -8 0 -8 0 8 0 4 -4 -4 0 0 0 -4 0 0 -4 -8 0 0 0 -4 4 4 -4 -2 0 4 0 0 -12 4 0 -2 8 -12 -8 0 0 0 0 4 -8 24 0 0 12 0 0 -4 6 -4 -4 4 -4 0 0  [...]
+1 -1 0 -6 0 0 0 4 -4 0 0 4 2 -4 0 4 0 0 -4 2 -3 8 0 -4 8 0 4 0 0 4 -2 0 0 4 4 0 2 0 0 0 0 -8 -4 4 8 4 0 8 0 -8 -4 4 -2 0 2 0 0 -3 0 2 0 -4 -4 8 0 0 0 2 0 -4 -12 0 4 0 0 0 4 0 -8 0 -4 -8 0 4 4 4 0 0 0 0 -4 0 -8 0 2 8 0 -8 -4 -4 0 4 -8 4 0 -8 8 8 -4 0 -12 -4 0 0 0 -4 4 0 0 -4 0 -4 0 2 0 0 -8 0 0 0 4 0 0 0 0 0 8 -4 0 0 0 0 0 4 0 0 12 8 8 0 0 8 0 -8 0 0 0 -8 0 8 0 -4 0 -4 0 0 4 0 0 -4 0 -8 4 0 4 -4 -4 4 -2 0 -4 0 4 0 4 0 -2 -8 4 8 0 0 0 0 4 0 0 12 8 0 0 0 -4 2 4 -4 0 0 4 -4 0 4 -4 0 0 8 -2 0 [...]
+1 -1 0 -10 0 4 0 0 -4 4 0 4 2 -4 0 4 4 4 8 2 -3 16 0 -4 0 0 0 -8 8 -8 2 0 0 0 4 0 -2 -8 0 4 -4 0 -4 -4 -8 12 0 16 0 0 8 4 2 0 -2 -8 0 -3 4 -6 0 4 0 0 0 0 -4 -6 -12 12 0 0 4 -8 0 0 -8 -8 0 -4 -12 8 8 4 -4 8 0 4 0 0 -4 0 0 0 -6 -16 -8 16 4 4 8 -4 0 12 8 8 0 -8 0 -8 0 -8 0 0 0 -4 4 0 -4 -12 -8 12 0 -6 0 -12 0 -4 0 0 4 0 -8 0 8 0 0 -4 0 0 0 0 0 4 8 8 0 0 0 4 0 -16 -8 16 8 0 -8 0 8 0 -4 -4 4 -8 0 0 12 0 0 -4 -8 0 8 0 -4 4 4 -4 6 0 -12 0 0 12 -12 0 6 8 4 -8 0 0 0 0 4 8 8 0 0 4 0 0 -4 -2 12 -4  [...]
+1 -1 4 -8 2 -4 -8 4 8 8 -2 8 8 -8 -8 -4 0 -8 0 -8 -1 0 8 8 16 0 -4 -8 16 0 -2 0 0 -4 0 0 2 -8 0 4 4 0 0 0 0 8 0 0 8 -8 0 -8 2 0 -2 8 -8 1 -4 -4 8 0 4 -16 -8 0 -8 4 0 0 -4 8 8 8 0 8 0 0 0 -4 -8 0 -8 0 0 8 -8 12 4 0 0 8 0 8 4 0 -8 0 0 0 -8 0 -16 -8 8 0 0 0 -4 0 4 8 -4 -8 -4 0 -8 -4 12 8 8 0 -8 -4 -8 0 8 8 -4 -8 8 8 -8 0 -8 0 -16 0 -8 -8 8 0 0 0 8 0 -4 -8 16 -8 8 0 8 0 8 8 8 16 -8 0 -12 -8 -12 -8 4 4 -8 4 8 8 -8 0 -8 4 0 0 0 0 -4 -8 8 -4 4 0 0 8 4 0 0 0 0 0 8 -8 0 -8 0 4 8 8 -8 -8 8 -2 8 -8 [...]
+1 -1 -4 -2 0 0 0 -4 -4 4 0 4 2 4 0 0 -4 4 0 2 1 0 0 4 -8 -4 -4 0 8 0 -2 0 4 4 4 8 -2 -8 0 0 0 8 -4 4 -8 4 -4 0 0 8 0 -4 -2 0 -2 0 0 1 0 -2 0 4 -4 -8 0 0 -4 2 -4 -4 -4 0 -4 -8 8 0 0 8 8 0 4 -8 8 0 0 0 0 0 0 0 0 0 -8 0 -2 0 0 0 0 4 0 4 -8 4 -8 -8 8 -8 -4 8 -4 0 0 0 4 -4 -4 0 0 4 8 -4 0 -2 0 -4 8 -4 -4 0 -4 0 8 0 -8 0 8 0 0 0 0 0 0 4 -8 -8 4 -8 8 4 0 0 0 0 0 0 8 -8 -8 8 0 4 0 0 0 4 -4 0 0 4 8 -8 0 -4 -4 0 -4 0 2 0 -4 0 4 4 4 0 2 8 0 8 0 0 0 0 4 0 -8 4 -8 4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4  [...]
+1 -1 0 4 -2 -8 -8 0 -8 4 2 8 0 0 0 8 4 -4 4 0 -1 0 0 0 -8 0 0 8 8 -4 -2 0 0 0 -8 0 2 0 0 8 0 8 0 0 -8 0 0 0 0 0 -4 0 2 0 -2 -8 0 1 -8 4 8 0 0 8 -8 0 4 -4 4 0 0 8 -8 0 0 0 4 -8 -8 0 0 8 0 0 0 -4 0 0 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 8 -8 0 8 0 8 0 -4 4 0 0 0 8 4 0 0 8 0 0 4 -8 -4 0 -4 0 -8 0 0 -8 0 -8 0 0 0 -8 0 8 0 0 0 8 -8 0 0 0 4 0 0 8 0 8 8 8 0 -8 0 0 0 0 4 -4 0 0 -4 0 -8 -8 0 4 0 0 0 0 0 4 0 0 4 0 4 0 0 -4 -8 0 8 0 0 8 -8 0 8 8 0 0 -4 0 -8 0 -2 0 8 8 0 4 -4 0 0 0 0 0 8 -4 0 0 2 0 0 [...]
+1 -1 -4 -2 0 0 0 4 4 -4 0 -4 2 4 0 0 4 -4 0 2 1 0 0 4 8 -4 4 0 -8 0 -2 0 4 -4 4 8 -2 8 0 0 0 -8 -4 4 -8 4 -4 0 0 -8 0 -4 -2 0 -2 0 0 1 0 -2 0 4 4 8 0 0 4 2 4 -4 4 0 -4 8 8 0 0 -8 -8 0 4 -8 -8 0 0 0 0 0 0 0 0 0 8 0 -2 0 0 0 0 4 0 4 8 4 8 -8 -8 -8 4 -8 4 0 0 0 4 -4 -4 0 0 4 -8 -4 0 -2 0 4 -8 4 -4 0 -4 0 -8 0 8 0 -8 0 0 0 0 0 0 4 8 8 -4 8 -8 -4 0 0 0 0 0 0 -8 8 8 -8 0 4 0 0 0 4 -4 0 0 4 -8 8 0 -4 -4 0 -4 0 2 0 -4 0 -4 -4 4 0 2 8 0 8 0 0 0 0 4 0 8 -4 8 -4 0 0 4 2 -4 4 0 0 0 0 4 -4 -4 0 -4 8  [...]
+1 -1 0 -6 -4 4 0 0 -4 0 -4 4 2 -4 8 4 0 0 4 2 1 0 8 -4 0 4 0 0 0 4 -2 8 -4 0 4 0 -2 0 0 -4 -4 0 4 -4 0 4 4 0 -8 0 4 -4 -2 8 -2 0 8 1 -4 -2 -16 -4 0 0 0 0 0 2 0 4 0 0 -4 0 0 -8 4 0 0 -4 4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 -8 0 8 0 0 0 0 4 0 -8 0 4 -4 0 4 4 8 4 -8 6 -16 0 0 0 0 0 -4 8 -8 0 8 0 -8 0 0 0 16 0 0 -4 8 0 0 0 -8 0 8 0 0 0 0 0 -8 8 -8 8 4 4 -4 4 0 0 -4 0 0 4 8 -8 -4 0 4 0 4 0 2 -8 -4 0 0 0 -4 8 -6 0 0 0 0 -8 0 16 -4 0 0 0 0 0 8 0 4 2 -4 4 4 4 -4 -4 -4 4 4 0 4 0  [...]
+1 -1 0 0 -2 -4 -8 4 0 0 2 0 0 0 0 8 0 0 0 0 -1 8 0 0 0 0 -4 0 0 8 2 0 0 4 -8 0 -2 8 0 -4 4 0 0 0 8 0 0 -8 0 8 0 0 -2 0 2 0 0 1 4 -4 -8 0 -4 0 8 0 0 4 0 0 -4 8 -8 -8 0 0 -8 0 0 -4 0 -8 8 0 0 -8 0 4 4 0 0 0 8 -8 4 -8 0 -8 0 0 0 0 -8 0 0 8 8 -8 4 0 4 -8 4 0 0 0 8 -4 4 0 0 0 0 -4 8 0 -8 0 0 -8 0 0 0 0 0 0 -8 0 8 0 -8 0 0 0 0 0 -4 8 8 0 0 8 0 8 0 8 0 8 0 -8 -4 0 -4 8 -4 0 0 4 0 -8 0 -8 8 0 0 0 0 0 -4 0 0 -4 -4 0 0 0 4 8 0 -8 0 0 -8 8 0 0 0 4 -8 0 0 -8 0 2 0 8 -4 4 0 8 0 0 0 0 0 0 4 8 0 -2 0 8 [...]
+1 -1 0 -10 -4 8 -8 -4 -4 -4 -4 12 2 4 8 4 4 -4 0 2 1 -16 8 4 0 4 -4 16 -8 0 2 -8 4 4 4 -8 2 0 8 0 0 0 -4 -4 8 -4 4 -16 -8 -8 0 -4 2 -8 2 16 -8 1 0 -2 8 -4 12 0 8 8 -12 2 4 -4 -4 8 -4 0 -8 -8 0 8 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 8 -2 0 0 0 0 -4 0 -4 0 -4 0 8 0 8 12 8 -4 -8 0 -8 8 -4 -4 0 -8 -4 0 -4 -8 -2 8 4 -8 -12 -8 8 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 -8 4 8 0 12 8 0 0 0 0 -8 0 0 0 0 -8 4 8 -8 0 8 4 0 0 4 0 0 8 -8 4 0 4 0 2 8 4 0 -12 -4 4 8 2 -8 0 -8 0 8 -8 -8 4 -16 -8 4 8 12 8 -8 4 -2 4  [...]
+1 -1 0 -4 -2 0 -8 0 8 -4 2 0 0 8 0 0 -4 4 -4 0 -1 0 0 -8 8 0 0 8 8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 -8 0 8 0 0 0 0 0 4 0 2 0 -2 -8 0 1 0 4 8 0 0 -8 -8 0 -4 -4 -4 0 0 8 0 0 0 0 -4 8 8 -8 0 -8 0 0 0 4 0 -8 -4 0 0 0 0 8 -4 0 -8 0 0 0 -8 0 0 0 -8 8 0 -8 0 -8 0 4 4 0 0 8 0 4 -8 0 -8 0 0 4 -8 4 0 4 0 -8 0 0 8 0 8 0 0 0 -8 0 8 0 0 -8 -8 8 0 0 0 -4 0 0 8 0 8 8 -8 0 8 0 8 0 8 -4 -4 0 0 -4 0 0 8 0 -4 0 0 0 0 0 4 0 0 4 0 -4 0 0 -4 8 0 -8 0 0 8 -8 8 8 -8 0 0 4 0 -8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 -4 0 0 2 [...]
+1 -1 0 -8 -2 4 -8 -4 8 0 2 0 0 8 0 0 0 0 8 0 -1 8 0 -8 0 0 4 0 16 0 2 0 0 -4 0 0 -2 -8 0 4 -4 0 -8 0 -8 0 0 -8 0 -8 -8 0 -2 0 2 0 0 1 -4 -4 -8 0 4 0 8 0 0 4 0 0 4 8 0 8 0 0 0 0 0 4 0 8 -8 0 0 0 0 -4 4 0 0 0 -8 -8 4 -8 0 -8 0 0 0 0 8 0 0 -8 -8 8 -4 0 -4 0 4 0 0 8 0 -4 -4 0 0 0 0 -4 8 0 8 0 0 -8 0 0 0 0 0 0 8 0 8 0 -8 0 0 -8 0 0 4 -8 -8 0 0 8 0 8 0 8 0 -8 0 8 4 0 4 0 -4 0 0 4 0 0 0 8 0 0 0 0 0 0 -4 0 0 -4 4 0 0 0 4 -8 0 8 0 0 -8 8 8 0 0 -4 8 0 0 -8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 4 -8 0 -2 0  [...]
+1 -1 -8 -2 4 0 8 -4 4 12 4 -12 2 4 -8 -4 4 12 8 2 1 0 -8 4 0 4 -4 0 8 -8 2 8 4 -12 4 -8 2 0 -8 -8 8 0 -4 -4 8 -4 4 0 8 -8 8 -4 2 8 2 0 8 1 -8 -2 -8 -4 -4 0 -8 -8 4 2 4 -4 -4 -8 -4 0 -8 8 -8 8 0 8 -4 8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 16 -16 -16 0 -4 16 -4 0 -4 0 8 0 8 -4 8 -4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 4 -8 4 0 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 4 8 0 -4 -8 16 -16 -16 16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 4 -4 4 -8 2 -8 0 -8 0 -8 8 8 4 0 -8 4 8 -4 -8 8 4 -2 4 4 8  [...]
+1 -1 -4 0 2 -4 0 -4 0 8 -2 0 0 0 0 4 0 -8 0 0 -1 0 0 0 8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 8 0 -8 0 0 0 0 0 8 0 0 2 0 -2 -8 0 1 4 4 0 8 -4 -8 0 0 -8 4 0 -8 4 0 0 0 0 0 0 0 -8 4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 -4 0 8 0 0 -8 8 8 -8 0 0 0 -8 0 4 0 -4 0 -4 0 4 0 0 -4 -4 0 0 8 0 -4 0 0 -8 8 4 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 4 8 8 -8 0 0 -8 0 -8 0 0 8 0 8 4 0 4 0 4 -4 0 4 -8 0 0 8 0 -4 8 0 -8 0 4 0 0 -4 -4 0 -8 0 4 0 0 0 0 0 0 0 0 8 0 -4 -8 8 0 0 0 -2 0 0 -4 -4 0 0 0 -8 8 0 0 8 -4 0 0 2 0 0 [...]
+1 -1 -8 -2 4 0 8 4 -4 -12 4 12 2 4 -8 -4 -4 -12 -8 2 1 0 -8 4 0 4 4 0 8 8 2 8 4 12 4 -8 2 0 -8 8 -8 0 -4 -4 8 -4 4 0 8 8 -8 -4 2 8 2 0 8 1 8 -2 -8 -4 4 0 -8 -8 -4 2 -4 -4 4 -8 -4 0 -8 8 8 -8 0 -8 -4 8 0 0 0 0 0 0 0 0 0 0 0 -8 -2 -16 16 16 0 -4 -16 -4 0 -4 0 8 0 8 4 -8 4 0 0 8 0 -4 -4 0 0 -4 0 -4 8 -2 -8 -4 8 -4 0 -8 -4 8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 -4 -8 0 4 -8 -16 16 16 -16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 -4 4 4 -8 2 -8 0 -8 0 -8 8 8 4 0 8 -4 -8 4 -8 8 4 -2 4 4 -8 [...]
+1 -1 -4 -6 0 4 8 0 -4 0 0 4 2 -4 0 0 0 0 -4 2 1 0 0 -4 -8 -4 0 0 16 -4 2 0 -4 0 4 0 2 8 8 4 4 -8 4 4 0 -4 -4 0 0 0 -4 -4 2 0 2 0 -16 1 4 6 -8 4 0 -8 8 8 0 -6 0 4 0 -8 -4 8 0 0 -4 0 -8 4 -4 0 8 0 0 -4 0 -4 0 0 0 0 0 8 6 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 4 0 0 -4 4 -4 0 4 -4 0 4 0 -2 -8 0 0 0 4 -8 -4 -16 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 4 -4 4 0 -4 4 0 0 4 0 0 -4 4 -4 0 -4 0 -6 16 4 0 0 0 -4 0 2 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 8 4 -2 4 4 -4 -4 4 4 4 -4 -4 -8 4 8 -6  [...]
+1 -1 -4 -4 2 0 0 0 0 -4 -2 8 0 0 0 4 4 4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 -8 0 0 -2 8 0 0 0 0 0 8 0 0 0 -8 0 0 4 0 -2 0 2 0 0 1 0 4 0 -8 -8 0 0 0 -4 4 4 -8 0 0 0 -8 0 0 4 8 0 0 0 0 -8 0 0 -4 -8 0 -4 0 0 8 0 0 -4 8 0 8 0 8 0 -8 0 0 -8 0 0 0 8 -8 0 -4 -4 0 4 0 0 4 0 0 -8 8 0 -4 0 -4 0 4 4 0 0 0 -8 0 -8 0 0 0 0 -8 0 0 0 0 8 8 0 0 0 -4 0 -8 0 -8 0 0 8 0 8 0 0 0 0 4 4 -4 0 -4 8 0 8 0 4 -4 -8 0 8 0 4 0 0 4 -8 4 -8 0 4 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 0 2 0 0 0 0 -4 -4 0 8 -8 0 0 0 -4 8 0 -2 0 8  [...]
+1 -1 -4 0 2 -4 0 4 0 -8 -2 8 0 0 0 4 0 8 0 0 -1 0 0 0 8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 8 0 8 0 0 0 0 0 -8 0 0 2 0 -2 -8 0 1 4 -4 0 -8 4 -8 0 0 8 -4 0 8 -4 0 0 0 0 0 0 0 -8 4 0 0 0 0 0 0 8 -4 4 0 0 -8 -8 0 4 0 8 0 0 8 8 -8 -8 0 0 0 -8 0 -4 0 4 0 -4 0 4 0 0 -4 -4 0 0 -8 0 4 0 0 8 -8 4 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 -4 -8 8 8 0 0 -8 0 -8 0 0 8 0 8 4 0 4 0 4 -4 0 4 -8 0 0 8 0 -4 -8 0 8 0 -4 0 0 -4 4 0 8 0 -4 0 0 0 0 0 0 0 0 8 0 4 8 -8 0 0 0 -2 0 0 -4 -4 0 0 0 8 -8 0 0 8 4 0 0 2 0 0 [...]
+1 -1 -4 -4 2 0 0 0 8 4 -2 -8 0 0 0 4 -4 -4 -4 0 -1 8 0 0 0 0 0 0 8 -4 2 0 0 8 0 0 -2 8 0 0 0 0 0 -8 0 0 0 -8 0 0 4 0 -2 0 2 0 0 1 0 -4 0 8 8 0 0 0 4 -4 -4 8 0 0 0 -8 0 0 4 -8 0 0 0 0 -8 0 0 -4 -8 0 -4 0 0 8 0 0 4 8 0 8 0 -8 0 8 0 0 -8 0 0 0 -8 8 0 -4 -4 0 4 0 0 4 0 0 -8 -8 0 4 0 4 0 -4 4 0 0 0 -8 0 -8 0 0 0 0 -8 0 0 0 0 8 -8 0 0 0 4 0 -8 0 -8 0 0 8 0 8 0 0 0 0 4 4 -4 0 -4 8 0 8 0 4 -4 8 0 -8 0 -4 0 0 4 8 -4 8 0 -4 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 0 2 0 0 0 0 -4 -4 0 -8 8 0 0 0 4 8 0 -2 0 8 [...]
+1 -1 0 -4 -2 0 8 0 0 4 2 0 0 -8 0 0 4 -4 -4 0 -1 0 0 8 8 0 0 8 -8 4 -2 0 0 0 0 0 2 0 0 0 8 -8 8 0 -8 0 0 0 0 0 4 0 2 0 -2 -8 0 1 0 -4 -8 0 0 -8 8 0 4 4 4 0 0 -8 0 0 0 0 -4 -8 8 -8 0 8 0 0 0 4 0 -8 -4 0 0 0 0 -8 4 0 -8 0 0 0 -8 0 0 0 -8 -8 0 8 0 8 0 4 4 0 0 -8 0 4 -8 0 -8 0 0 -4 8 -4 0 -4 0 8 0 0 8 0 8 0 0 0 8 0 -8 0 0 8 -8 -8 0 0 0 4 0 0 8 0 8 -8 -8 0 8 0 8 0 8 -4 -4 0 0 -4 0 0 8 0 -4 0 0 0 0 0 -4 0 0 4 0 4 0 0 4 -8 0 8 0 0 -8 8 -8 8 8 0 0 -4 0 8 0 -2 0 0 0 8 -4 4 0 0 0 0 0 -8 4 0 0 2 0  [...]
+1 -1 0 -10 -4 8 8 4 -4 -4 -4 4 2 -12 8 4 4 -4 16 2 1 0 8 -12 0 4 4 0 8 0 2 -8 4 -4 4 8 2 0 -8 0 -16 0 12 -4 -8 -4 4 0 -8 8 16 -4 2 -8 2 0 24 1 0 6 24 -4 -12 0 -8 -8 -12 -6 4 -4 4 -8 -4 0 8 -8 0 8 0 -16 -4 -8 0 0 0 -8 0 -8 0 0 0 0 16 -8 6 16 16 -16 0 -4 -16 -4 -16 -4 16 -8 -16 -8 -12 8 4 8 0 -8 -8 12 -4 0 8 -4 -16 -4 -8 -10 24 4 8 -12 8 -8 -4 24 16 0 -16 0 16 0 8 0 -24 0 0 -12 -16 -8 -4 -8 16 12 8 16 16 -16 -16 8 16 -16 16 -16 8 4 -8 8 0 -8 4 0 0 4 -16 16 -8 8 4 0 4 0 -6 -24 4 0 12 -4 4 8 [...]
+1 -1 0 -8 -2 4 8 4 8 0 2 -8 0 -8 0 0 0 0 8 0 -1 8 0 8 0 0 -4 0 0 0 2 0 0 4 0 0 -2 -8 0 4 -4 0 8 0 8 0 0 -8 0 8 -8 0 -2 0 2 0 0 1 -4 4 8 0 -4 0 -8 0 0 -4 0 0 -4 -8 0 8 0 0 0 0 0 4 0 -8 -8 0 0 0 0 -4 4 0 0 0 -8 8 -4 -8 0 -8 0 0 0 0 8 0 0 8 -8 -8 4 0 4 0 4 0 0 -8 0 -4 -4 0 0 0 0 4 -8 0 -8 0 0 8 0 0 0 0 0 0 8 0 -8 0 8 0 0 8 0 0 -4 8 -8 0 0 8 0 8 0 -8 0 -8 0 8 4 0 4 0 -4 0 0 4 0 0 0 8 0 0 0 0 0 0 4 0 0 -4 -4 0 0 0 -4 8 0 -8 0 0 8 -8 -8 0 0 4 -8 0 0 8 0 2 0 0 4 -4 8 0 0 0 0 0 0 0 -4 -8 0 -2 0  [...]
+1 -1 0 0 -6 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 3 0 0 0 0 12 0 0 0 0 -6 24 -12 0 0 0 -6 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 0 6 -24 6 0 0 -3 0 0 0 0 0 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 -4 0 0 0 12 0 12 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 0 0 0 0 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -48 0 -12 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 0 -12 0 0 0 0 0 0 0 4 0 4 0 0 0 -12 0 0 0 0 0 0 -12 0 0 24 0 0 0 0 0 0 0 0 0 0 0 -6 0 0 0 0 0 0 12 0 0 0 -12 0 0 0 0 -6 0 0 0 0 3 0  [...]
+1 -1 -4 0 -2 0 0 0 0 0 2 0 0 0 0 4 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 -2 8 -4 0 0 8 -2 0 8 0 0 0 0 0 0 0 4 0 0 0 0 0 2 -8 2 0 0 -3 0 0 0 0 0 0 0 -8 0 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 0 -4 4 0 8 0 -4 -16 -4 8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 0 -4 0 0 -4 0 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 -16 0 16 0 4 0 -8 0 -16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 4 -8 0 0 0 0 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 4 0 16 8 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 8 -4 0 0 0 0 -2 0 0 0 0 3 0 0 0 0 [...]
+1 -1 0 -8 -6 8 0 0 8 0 6 -8 0 0 0 0 0 0 8 0 3 -16 0 0 0 12 0 16 0 8 2 -8 4 0 0 0 2 0 0 -8 -8 0 0 0 0 0 -12 16 0 0 -8 0 -2 8 -2 -16 0 -3 8 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 -4 -4 -8 0 8 -4 0 -4 0 0 0 0 16 -16 16 -4 0 -16 0 0 0 0 0 0 0 0 0 0 -8 -12 0 0 0 0 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 -16 16 -16 16 0 0 0 0 0 -8 0 -8 8 12 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 0 -8 0 0 0 16 0 0 0 0 0 0 0 2 0 0 -8 -8 8 8 12 0 0 0 4 0 0 0 0 [...]
+1 -1 -4 0 -2 0 0 -8 -8 8 2 8 0 0 0 4 8 -8 0 0 3 0 0 0 0 -4 8 0 0 0 -2 -8 12 -8 0 24 -2 0 -8 0 0 0 0 0 0 0 4 0 0 16 0 0 2 8 2 0 0 -3 0 0 0 0 8 0 0 8 8 -12 -24 0 -24 0 0 0 -24 0 0 16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -8 -16 24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 24 -16 -8 -4 0 0 0 0 16 0 -16 0 4 0 8 0 16 -16 0 0 16 -24 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 -12 8 0 0 0 0 4 0 -4 0 -4 0 0 0 -12 8 -24 0 0 0 0 4 0 16 -8 0 0 0 0 -16 24 -16 -8 0 0 0 -2 0 0 0 0 0 0 - [...]
+1 -1 -8 0 2 0 0 0 0 0 -2 0 0 0 0 8 0 0 0 0 3 0 0 0 0 -4 0 0 0 0 2 8 4 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 -2 -8 -2 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -4 0 0 0 -4 32 -4 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 0 0 -16 0 4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 8 0 4 0 0 0 0 0 8 0 4 0 4 0 0 0 4 0 0 0 0 0 0 4 0 -32 8 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 -4 0 0 0 4 0 0 0 0 2 0 0 0 0 3 0 0 0 0 0 0 0 0 0 [...]
+1 -1 -4 0 -2 0 0 8 8 -8 2 -8 0 0 0 4 -8 8 0 0 3 0 0 0 0 -4 -8 0 0 0 -2 -8 12 8 0 24 -2 0 -8 0 0 0 0 0 0 0 4 0 0 -16 0 0 2 8 2 0 0 -3 0 0 0 0 -8 0 0 8 -8 -12 24 0 24 0 0 0 -24 0 0 -16 0 0 0 0 0 -4 4 0 -8 0 12 -16 -4 -8 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 8 16 -24 0 -4 0 -4 0 0 12 0 0 0 0 0 0 0 -24 16 8 -4 0 0 0 0 16 0 -16 0 4 0 8 0 16 -16 0 0 -16 24 -16 0 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 0 -12 8 0 0 0 0 4 0 -4 0 -4 0 0 0 -12 -8 24 0 0 0 0 4 0 16 -8 0 0 0 0 16 -24 16 8 0 0 0 -2 0 0 0 0 0 0 - [...]
+1 -1 -4 -8 -2 8 0 0 8 0 2 -8 0 0 0 4 0 0 -8 0 3 -16 0 0 -16 -4 0 16 16 -8 6 -8 -4 0 0 -8 6 16 24 8 8 -16 0 0 0 0 4 16 0 0 8 0 -6 8 -6 -16 0 -3 -8 0 0 0 0 16 0 -24 0 4 0 0 0 0 0 -16 8 0 8 0 16 -8 0 0 -16 12 4 -8 -8 8 -4 -16 12 -8 -16 0 0 -16 16 -16 4 0 16 0 -16 0 16 0 -16 0 0 0 0 -8 -4 0 -4 0 0 -4 8 0 16 0 0 0 0 0 0 0 -4 0 0 0 16 16 16 -16 -16 -12 0 8 0 16 -16 0 -16 0 0 0 16 0 0 16 -16 16 -16 0 -16 16 -16 16 -8 0 -8 8 4 4 0 4 8 0 -16 16 8 4 0 -4 0 -4 0 0 0 4 0 0 0 0 0 0 -12 0 16 -8 0 0 0  [...]
+1 -1 -12 0 6 0 0 8 -8 -24 -6 24 0 0 0 12 8 24 0 0 3 0 0 0 0 12 -8 0 0 0 6 24 12 -24 0 -24 6 0 -24 0 0 0 0 0 0 0 -12 0 0 48 0 0 -6 -24 -6 0 0 -3 0 0 0 0 24 0 0 24 -24 -12 -24 0 24 0 0 0 24 0 0 -48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 -24 48 -24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 24 -48 24 -12 0 0 0 0 -16 0 48 0 -12 0 24 0 -48 16 0 0 -48 24 48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 12 0 -12 24 0 0 0 0 12 0 -4 0 -4 0 0 0 -12 24 -24 0 0 0 0 -12 0 48 24 0 0 0 0 48  [...]
+1 -1 -12 0 6 0 0 -8 8 24 -6 -24 0 0 0 12 -8 -24 0 0 3 0 0 0 0 12 8 0 0 0 6 24 12 24 0 -24 6 0 -24 0 0 0 0 0 0 0 -12 0 0 -48 0 0 -6 -24 -6 0 0 -3 0 0 0 0 -24 0 0 24 24 -12 24 0 -24 0 0 0 24 0 0 48 0 0 0 0 0 12 4 0 -24 0 12 -48 12 -24 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 24 -48 24 0 12 0 -12 0 0 12 0 0 0 0 0 0 0 -24 48 -24 -12 0 0 0 0 -16 0 48 0 -12 0 24 0 -48 16 0 0 48 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12 12 0 -12 24 0 0 0 0 12 0 -4 0 -4 0 0 0 -12 -24 24 0 0 0 0 -12 0 48 24 0 0 0 0 -48 [...]
+1 -3 12 -12 6 -8 -16 8 0 24 6 16 -4 -8 -16 4 8 24 -8 -4 3 -16 -16 -8 -16 12 8 -16 -32 -8 6 24 12 24 -8 24 6 -16 24 -8 -8 -16 -8 -8 -16 -8 12 -16 -16 48 -8 -8 6 24 6 -16 -16 3 -8 -4 -16 -8 24 -16 -16 24 24 8 24 -8 24 -16 -8 -16 24 -16 -8 48 -16 -8 -8 -16 -16 12 4 -8 24 -8 12 48 12 24 -16 -16 -4 -16 -16 -16 4 -8 -16 -8 -16 -8 -16 -16 -16 -16 24 48 24 -8 12 -16 12 -8 -8 12 -8 -8 -16 -8 -16 -4 -16 24 48 24 12 -16 -8 -16 -16 16 -16 48 -16 12 -16 24 -16 48 16 -8 -16 48 24 48 -16 24 -16 -16 -16 [...]
+1 -3 4 -4 2 -4 0 4 0 8 2 0 -4 0 0 4 0 8 0 -4 -1 0 0 0 -8 0 4 8 0 0 -2 0 0 4 0 0 2 0 0 -4 -4 -8 0 0 0 -8 0 0 0 -8 0 8 -2 0 2 8 0 -1 -4 0 0 0 4 -8 0 0 -8 0 0 0 -4 0 0 0 0 0 0 0 -8 -4 8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 -8 0 0 8 0 4 0 -4 0 -4 0 -4 0 0 -4 -4 8 0 0 0 0 0 0 -8 -8 -4 0 8 0 0 0 0 0 8 0 0 8 0 0 0 0 0 0 -4 -8 8 -8 0 0 8 0 8 0 0 8 0 8 -4 8 -4 0 -4 -4 8 -4 -8 0 0 8 0 -4 0 0 0 0 0 0 -8 4 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 -4 -8 -8 0 0 8 -2 8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 -8 [...]
+1 -3 4 -8 2 0 0 0 0 4 2 8 -4 0 0 4 4 4 -4 -4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 8 0 0 -2 -8 0 0 0 0 0 0 0 8 0 8 0 0 -4 8 2 0 -2 0 0 -1 0 0 0 0 -8 0 0 0 4 0 -4 0 0 0 0 -8 0 0 -4 -8 0 0 -8 0 -8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 8 8 0 0 0 -8 -8 0 -4 -4 0 -4 0 0 4 0 -8 8 0 0 0 0 -4 0 4 -4 0 8 0 8 0 8 0 0 0 0 -8 0 0 0 0 8 -8 0 0 0 4 0 8 0 8 0 0 8 0 8 0 0 8 0 -4 -4 -4 -8 4 8 0 8 0 -4 -4 0 0 0 0 0 0 8 -4 -8 -4 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 0 8 2 -8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 8 8  [...]
+1 -3 8 -6 4 -8 -8 4 12 12 -4 20 2 -4 -8 -12 -4 -12 0 -2 1 -16 8 4 0 4 -4 -16 8 0 2 8 4 -12 4 8 2 0 8 0 0 0 4 -4 -8 -4 -4 16 -8 8 0 -4 -2 -8 -2 16 -8 -1 0 -2 -8 -4 4 0 -8 -8 4 -6 4 -4 4 8 4 0 -8 8 0 8 0 0 -4 -8 0 0 0 8 0 -8 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 -4 -8 -4 -8 0 -8 0 -4 -4 0 8 4 0 4 8 2 8 -4 -8 -4 0 -8 4 8 0 0 0 0 0 0 8 0 8 0 0 -4 0 -8 -4 -8 0 -4 -8 0 0 0 0 -8 0 0 0 0 -8 4 8 8 0 0 4 0 0 -4 0 0 -8 0 4 0 4 0 2 8 4 0 -4 -4 4 8 2 8 0 8 0 -8 -8 -8 4 16 8 4 8 4 8 8 -4 -2 -4 4 0 0 [...]
+1 -3 4 -4 -2 0 0 0 0 0 -2 0 -4 0 16 4 0 0 0 -4 3 0 16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 -8 0 8 -4 0 0 0 0 -8 -2 8 -2 0 0 3 0 4 -16 -8 0 0 -16 -8 0 0 0 8 0 0 0 0 -8 16 0 0 0 0 8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 -16 4 0 0 0 4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 -4 16 4 0 0 -4 0 8 0 8 0 4 -16 0 0 0 4 0 -8 0 0 16 0 16 0 -4 -16 -8 -16 16 16 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 -8 0 0 -4 4 8 -4 -8 0 0 0 0 4 -8 4 -8 4 4 0 8 -4 0 0 8 0 4 0 -4 0 16 8 -16 -16 0 0 0 0 0 0 16 0 -8 -2 8 0 0 0 0 0 -4 [...]
+1 -3 4 -4 -2 0 16 0 0 0 -2 0 -4 -8 16 -4 0 0 0 -4 3 0 16 -8 0 -4 0 0 16 0 6 -8 -4 0 -8 8 6 0 -24 0 0 0 -8 -8 -16 -8 -4 0 16 0 0 -8 6 -8 6 0 16 3 0 -4 16 -8 0 0 16 -24 0 -8 0 -8 0 16 -8 0 8 16 0 0 0 0 -8 -16 0 12 4 0 8 0 -4 16 12 8 0 16 -4 0 0 0 4 -8 0 -8 0 -8 0 -16 0 -16 0 0 0 0 -4 16 4 -8 -8 -4 0 -8 0 -8 16 -4 16 0 0 0 4 16 -8 16 0 -16 0 -16 0 12 16 8 16 -16 -16 -8 0 0 0 0 0 0 16 0 0 0 0 16 0 0 0 0 0 -8 0 0 -4 4 -8 -4 8 -8 0 0 0 4 -8 4 -8 4 -4 16 -8 -4 0 0 -8 16 -4 -16 12 -16 16 -8 16 1 [...]
+1 -3 0 -4 2 0 16 0 0 0 2 0 -4 0 0 0 0 0 0 -4 3 0 0 0 0 -4 0 0 16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 8 0 -8 -4 0 -16 0 0 -8 2 -8 2 0 -16 3 0 4 0 8 0 0 0 0 0 -8 0 8 0 16 0 0 0 0 0 0 0 0 -8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 4 0 0 0 -4 8 0 8 0 -8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 -8 0 8 -16 4 0 0 0 0 0 16 -8 -16 0 0 0 16 0 -4 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 -8 0 0 4 0 -8 12 0 0 0 0 0 0 8 -4 8 -4 4 -16 -8 12 0 0 8 -16 4 0 -4 0 0 -8 0 0 0 0 0 0 0 0 0 16 -8 2 -8 0 0 0 0 0 -4 8 8 0 -12 0 4  [...]
+1 -3 4 -2 0 -4 16 0 4 0 0 4 -6 -4 8 -8 0 0 4 6 1 0 -8 4 0 -4 0 0 -16 4 2 0 -4 0 4 0 2 0 -8 4 4 0 -4 -4 0 4 4 0 -8 0 -4 4 -2 0 -2 0 -8 -1 -4 -2 0 -4 0 0 0 8 0 2 0 -4 0 0 -4 0 0 8 -4 0 0 -4 4 0 0 0 0 -4 0 4 0 0 0 0 8 0 2 0 0 0 0 4 0 4 -8 -4 -8 0 -8 0 0 0 0 4 0 -8 4 4 4 0 -4 -4 8 4 8 2 0 0 0 0 -4 0 -4 8 -8 0 8 0 8 0 0 0 0 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 0 8 8 8 8 4 -4 -4 -4 0 -4 -4 0 0 4 -8 -8 4 4 4 0 4 0 2 8 -4 0 0 0 4 8 2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 0 4 -2 4 -4 -4 -4 -4 -4 4 -4 -4 8 4 0 - [...]
+1 -3 0 4 -2 -4 0 4 8 0 -2 -8 4 8 8 -8 0 0 0 4 -1 -8 8 8 8 0 4 0 0 -8 2 0 0 -4 -8 0 -2 0 0 4 -4 -8 0 0 -8 0 0 -8 8 8 0 0 2 0 -2 0 -8 -1 4 0 0 0 -4 8 0 0 0 0 0 0 -4 0 0 0 0 -8 -8 0 -8 -4 0 8 0 0 0 0 0 4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 -8 8 0 -8 -4 0 -4 0 4 -8 0 0 0 -4 4 0 -8 0 8 0 0 0 8 0 0 0 0 -8 8 0 8 0 0 0 0 0 0 0 0 0 8 0 -4 8 0 0 -8 8 0 8 0 0 8 0 -8 0 4 0 4 0 4 0 0 -4 0 0 -8 0 0 0 0 0 0 0 0 -8 0 4 -4 0 0 8 0 -8 0 8 0 0 0 0 0 0 0 -4 8 0 -8 0 0 2 0 0 4 -4 0 -8 0 0 0 0 0 -8 0 0 -8 -2 0 -8 [...]
+1 -3 -4 0 2 0 8 0 0 -4 2 8 4 8 -8 -4 -4 -4 -4 4 -1 -8 -8 8 -8 0 0 0 8 12 2 0 0 8 0 0 -2 -16 0 8 -8 8 0 -8 0 0 0 -8 -8 0 -4 0 2 0 -2 0 8 -1 8 -8 8 8 -8 -8 -8 0 -4 0 4 8 0 -8 -8 -16 0 8 12 8 8 -8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 -8 -8 -8 0 -8 0 8 0 -8 -8 0 0 0 8 0 -8 8 0 4 -4 8 4 0 -8 4 0 0 0 8 -8 0 8 4 0 -4 4 -8 0 8 16 0 16 0 -8 0 -8 8 8 0 0 0 16 8 0 0 -8 -4 8 -8 0 -8 0 -8 16 -8 0 8 0 0 0 4 -4 4 0 4 -8 -8 0 8 4 4 8 0 -8 0 -8 8 0 -4 -8 4 8 -8 0 0 0 0 0 0 -8 8 0 0 8 0 0 -4 8 -8 0 2 0 -8 8 -8 -4  [...]
+1 -3 0 6 0 -8 0 4 -4 0 0 12 2 4 0 -4 0 0 4 -2 -3 -8 0 -4 -8 0 -4 16 0 -4 -2 0 0 -4 4 0 2 0 0 8 -8 8 4 4 -8 -12 0 8 0 -8 -4 4 2 0 -2 -16 0 3 -8 -6 0 -4 -4 8 0 0 0 -6 0 12 -12 0 -4 0 0 0 4 0 -8 8 12 8 0 4 4 -4 0 -8 0 0 -4 0 8 0 6 -8 -16 8 -4 4 16 -4 8 12 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 8 -12 0 -12 0 6 0 0 8 0 0 0 -4 0 0 0 0 0 -8 4 0 0 0 0 0 -4 0 0 12 8 8 0 0 8 16 -8 -16 0 0 -8 0 8 -8 -4 8 -4 0 0 -12 0 0 4 0 -8 4 0 4 4 -4 -4 6 0 12 0 4 0 -12 0 6 8 -4 -8 0 0 0 0 4 -16 0 -12 -8 0 0 0 4 2 12 - [...]
+1 -3 -4 0 2 0 8 0 8 4 2 -8 4 8 -8 -4 4 4 12 4 -1 -8 -8 8 8 0 0 0 -8 -4 2 0 0 -8 0 0 -2 0 0 -8 8 -8 0 8 0 0 0 -8 -8 0 12 0 2 0 -2 0 8 -1 -8 0 8 -8 8 8 -8 0 4 8 -4 -8 0 -8 -8 0 0 8 -4 -8 -8 8 0 0 -16 0 0 4 -8 0 -4 0 0 8 -8 -8 0 -8 0 -8 0 -8 0 8 8 0 16 0 -8 0 8 -8 0 4 -4 8 4 0 -8 4 0 0 16 -8 -8 8 8 -4 0 4 4 -8 0 8 0 0 0 0 8 0 -8 8 8 0 0 0 0 -8 0 0 8 4 8 -8 0 -8 0 -8 0 8 16 -8 0 0 0 4 -4 4 0 4 -8 -8 16 -8 4 4 -8 0 8 0 0 8 0 -4 8 -4 -8 -8 8 0 0 0 0 0 -8 8 0 0 -8 0 0 4 8 -8 0 2 0 -8 -8 8 12 -4 [...]
+1 -3 0 -4 -2 4 0 -4 0 0 -2 8 4 0 8 0 0 0 -8 4 -1 -8 8 0 -8 0 -4 0 0 0 2 0 0 4 0 0 -2 0 0 -4 4 8 8 0 8 0 0 -8 8 -8 -8 0 2 0 -2 0 -8 -1 -4 0 0 0 4 -8 0 0 0 0 0 0 4 0 -8 0 0 -8 0 0 8 4 0 -8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 -8 0 8 4 0 4 8 4 -8 0 8 -8 -4 -4 0 8 0 8 0 0 0 -8 0 0 0 0 -8 -8 0 -8 0 0 0 0 0 0 0 0 8 -8 0 4 -8 0 0 -8 8 0 8 0 0 -8 0 8 0 -4 0 -4 8 4 0 0 -4 0 -8 8 0 8 0 0 0 0 0 0 -8 0 4 4 0 0 8 0 8 0 -8 0 0 0 0 8 0 0 4 -8 0 -8 0 0 2 0 -8 -4 4 -8 0 0 0 0 0 0 8 0 0 -8 -2 0  [...]
+1 -3 0 2 0 -4 0 0 4 4 0 4 2 4 0 -4 -4 -4 0 -2 -3 0 0 -4 0 0 0 8 -8 0 2 0 0 0 4 0 -2 8 0 -4 4 0 4 -4 8 -4 0 0 0 0 0 4 -2 0 2 -8 0 3 4 2 0 4 0 0 0 0 -4 2 -12 -4 0 0 -4 -8 0 0 0 -8 0 -4 4 -8 8 4 -4 0 0 -4 0 0 -4 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 -8 8 0 -8 0 8 0 0 0 0 0 -4 4 0 4 -4 8 4 0 -2 0 12 0 4 0 0 -4 0 8 0 -8 0 0 4 0 0 0 0 0 -4 8 8 0 0 0 4 0 0 -8 0 8 0 -8 0 8 0 -4 -4 4 0 0 0 -4 0 0 4 -8 0 0 0 -4 -4 4 4 -2 0 4 0 0 12 4 0 -2 -8 -4 8 0 0 0 0 4 -8 -8 0 0 -4 0 0 4 -2 4 -4 4 -4 0 0 0 4 -4 0 0 0 2 [...]
+1 -3 0 -2 0 0 0 -4 4 0 0 12 2 4 0 -4 0 0 -4 -2 -3 8 0 -4 -8 0 4 0 0 4 6 0 0 -12 4 0 -6 0 0 0 0 8 4 4 -8 4 0 -8 0 -24 4 4 -6 0 6 0 0 3 0 2 0 -4 -12 8 0 0 0 2 0 -4 12 0 -4 0 0 0 -4 0 -8 0 -4 8 0 -12 4 4 0 0 0 0 12 0 8 0 -2 8 0 -8 -4 4 0 -4 8 -4 0 -8 -8 8 12 0 -12 -4 0 0 0 -4 4 0 0 4 0 4 0 -2 0 0 24 0 0 0 -4 0 0 0 0 0 -8 -12 0 0 0 0 0 -4 0 0 -12 24 8 0 0 -8 0 8 0 0 0 -8 0 8 0 -4 0 4 0 0 4 0 0 4 0 -8 -4 0 4 4 -4 -4 -2 0 -4 0 12 0 4 0 -2 8 12 -8 0 0 0 0 4 0 0 12 -24 0 0 0 4 -6 -4 -4 0 0 4 -4  [...]
+1 -3 0 0 -2 0 0 0 0 4 -2 0 4 0 8 0 -4 4 -4 4 -1 0 8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 -8 0 8 0 0 0 -8 0 -4 0 -2 0 2 -8 8 -1 -8 0 0 0 0 0 0 0 4 0 4 0 0 0 8 -8 0 -8 4 -8 0 0 0 -8 8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 -8 -8 8 0 -8 0 -4 4 -8 0 -8 8 4 8 0 0 0 -8 0 0 4 0 4 0 0 0 8 0 0 0 0 8 0 0 0 0 0 0 -8 0 -8 0 0 8 4 -8 0 8 0 8 0 0 8 0 -8 8 0 8 -4 4 0 0 4 0 8 0 -8 -4 0 0 0 0 0 0 8 0 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 -8 -8 -8 0 0 4 -8 0 0 -2 0 8 -8 0 -4 4 0 0 0 0 0 0 0 -8 8 2 0 0 [...]
+1 -3 0 6 -4 -4 0 0 -4 0 4 4 2 4 8 -4 0 0 -4 -2 1 0 -8 -4 0 4 0 0 0 -4 -2 8 -4 0 4 0 -2 0 0 4 4 0 -4 -4 0 4 -4 0 8 0 4 -4 2 -8 2 0 -8 -1 -4 6 0 -4 0 0 -16 0 0 2 0 4 0 0 4 0 0 -8 4 0 0 -4 4 0 0 0 0 4 0 4 0 0 0 0 8 16 -6 0 0 0 0 4 0 4 -8 -4 8 0 -8 0 0 0 0 -4 0 8 0 4 -4 0 -4 -4 -8 -4 -8 2 0 0 0 0 0 0 4 8 8 0 -8 0 8 0 16 0 0 0 0 4 8 0 0 0 -8 0 8 0 0 0 0 0 -8 8 -8 8 4 4 -4 4 0 0 -4 0 0 -4 8 -8 -4 0 4 0 4 0 -6 8 -4 0 0 0 -4 -8 2 0 0 0 0 -8 -16 0 -4 0 0 0 0 0 -8 0 -4 2 4 4 -4 -4 4 4 -4 -4 -4 0 4 [...]
+1 -3 -4 6 0 -4 8 0 -4 0 0 4 2 4 0 0 0 0 4 -2 1 0 0 -4 8 -4 0 0 -16 4 2 0 -4 0 4 0 2 -8 8 -4 -4 8 -4 4 0 -4 4 0 -16 0 -4 -4 -2 0 -2 0 0 -1 4 -2 8 4 0 -8 -8 -8 0 10 0 4 0 -8 4 8 0 0 -4 0 -8 4 -4 0 8 0 0 4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 -4 4 -4 0 -4 4 0 -4 16 -6 -8 0 0 0 4 8 4 0 0 0 0 0 0 0 8 0 -8 0 0 4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 4 4 -4 4 0 4 4 0 0 -4 0 0 -4 -4 -4 0 -4 0 2 0 4 0 0 0 -4 16 -6 0 0 0 0 0 -8 8 -4 0 0 0 0 0 0 -8 -4 -2 -4 4 4 4 -4 -4 4 4 4 -8 4 -8 [...]
+1 -3 0 2 -4 0 8 -4 -4 4 4 4 2 -4 8 -4 4 -4 -8 -2 1 0 -8 4 0 4 4 0 -8 8 2 -8 4 -4 4 8 2 0 -8 -8 8 0 4 -4 -8 -4 -4 0 8 -8 8 -4 -2 8 -2 0 8 -1 8 -2 8 -4 12 0 8 8 12 -6 -4 -4 -4 -8 4 0 -8 -8 -8 -8 0 -8 -4 -8 0 0 0 0 0 0 0 0 0 0 0 -8 2 -16 -16 16 0 4 16 4 0 4 0 8 0 8 -12 8 4 0 0 8 -8 -4 -4 0 0 4 0 4 -8 2 -8 4 8 -12 8 8 4 -8 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 8 4 8 0 -12 8 16 16 -16 -16 8 0 0 0 0 0 4 0 0 0 8 4 0 0 -4 0 0 0 -8 4 0 4 0 2 -8 4 0 -12 4 4 -8 2 8 0 8 0 8 8 8 4 0 -8 -4 -8 12 -8 -8 -4 -2 -4 [...]
+1 -3 4 4 -2 -8 -16 8 0 8 -2 -16 -4 8 16 12 -8 8 8 -4 3 16 16 8 -16 -4 8 -16 0 8 -2 -8 12 -8 8 -24 -2 16 8 -8 -8 -16 8 -8 16 -8 -4 16 -16 -16 8 -8 -2 -8 -2 -16 -16 3 -8 -4 16 -8 -8 -16 16 8 8 8 -24 -8 24 -16 8 16 -24 16 8 16 -16 -8 -8 16 16 -4 4 8 8 -8 12 16 -4 8 -16 16 -4 16 -16 16 4 -8 -16 -8 -16 -8 16 16 -16 16 -8 16 24 8 -4 16 4 8 8 12 -8 -8 16 -8 -16 -4 16 -24 -16 8 4 -16 -8 -16 16 -16 16 -16 -16 -4 16 8 16 -16 -16 8 16 16 24 -16 -16 8 16 16 -16 16 -16 -16 16 -16 16 -16 -8 -8 -8 8 -4 [...]
+1 -3 0 10 -4 -8 -8 4 -12 4 4 4 2 4 8 4 4 -4 0 -2 1 16 -8 -4 0 4 -4 -16 8 0 2 -8 4 4 -4 -8 2 0 8 0 0 0 -4 -4 8 -4 -4 -16 -8 8 0 -4 -2 8 -2 16 -8 -1 0 -2 8 -4 -12 0 8 -8 12 -6 -4 -4 4 8 -4 0 8 -8 0 -8 0 0 -4 8 0 0 0 -8 0 -8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 12 8 -4 8 0 8 8 4 4 0 8 4 0 4 8 2 -8 4 -8 -12 -8 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 8 -4 -8 0 -12 8 0 0 0 0 -8 0 0 0 0 -8 4 8 -8 0 -8 4 0 0 4 0 0 8 8 4 0 4 0 2 8 4 0 12 4 4 8 2 -8 0 -8 0 8 8 8 -4 16 -8 4 8 12 -8 8 -4 -2 -4 -4 0 [...]
+1 -3 0 -4 2 0 0 0 0 0 2 0 -4 8 0 8 0 0 0 -4 3 0 0 8 0 -4 0 0 0 0 -6 -8 4 0 8 0 -6 0 0 0 0 0 8 8 -16 8 -4 0 0 0 0 -8 -6 -8 -6 0 0 3 0 -4 0 8 0 0 0 0 0 0 0 -8 0 0 8 0 0 0 0 0 0 0 8 -16 0 12 -4 0 0 0 -4 0 12 0 0 0 -4 0 0 0 -4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 4 0 0 8 8 -4 0 8 0 -8 0 -4 0 0 0 0 0 0 -8 0 0 0 0 16 0 12 0 0 0 16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 0 8 -4 0 8 0 0 0 0 8 -4 8 -4 -4 0 8 -4 0 0 -8 0 -4 -16 12 -16 0 -8 0 0 8 0 0 0 0 0 0 0 -8 -6 8 8 0 0 0 0 -4 8 8 0 4 0 -4 0 0  [...]
+1 -3 4 2 0 -8 -8 4 -4 4 0 4 -6 4 8 8 4 -4 8 6 1 0 -8 -4 -16 -4 -4 0 8 8 -2 0 4 4 -12 -8 -2 16 0 0 0 0 4 -4 -8 -4 4 0 8 -8 -8 4 2 0 2 0 -8 -1 0 -2 8 -4 4 16 -8 0 -4 2 -4 4 4 -8 -4 -16 8 8 -8 8 0 0 -4 -8 0 0 0 0 0 8 0 0 0 0 -16 8 2 0 0 0 0 4 0 4 0 4 16 8 16 8 -4 -8 -4 0 0 -8 -4 -4 4 0 -8 4 -16 -4 -8 -6 -8 4 8 4 4 8 -4 8 0 0 0 0 0 0 8 0 -8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 -16 -16 8 -4 -8 0 0 4 4 0 0 4 16 16 0 -4 4 0 4 0 2 8 4 0 -4 4 -4 -8 -6 8 0 8 0 0 -8 8 4 0 8 4 -8 -4 8 -8 4 2 -4 -4  [...]
+1 -3 4 -12 -2 8 -16 -8 0 -8 -2 16 -4 8 16 12 8 -8 -8 -4 3 -16 16 8 16 -4 -8 16 -32 -8 -2 -8 12 8 8 -24 -2 -16 8 8 8 16 8 -8 16 -8 -4 -16 -16 16 -8 -8 -2 -8 -2 16 -16 3 8 -4 16 -8 8 16 16 8 -8 8 24 -8 -24 -16 8 -16 -24 16 -8 -16 16 8 -8 16 -16 -4 4 -8 8 8 12 16 -4 8 16 16 -4 -16 16 -16 4 -8 16 -8 16 -8 -16 16 16 16 8 -16 -24 -8 -4 16 4 8 8 12 8 -8 -16 -8 -16 -4 16 24 16 -8 4 -16 -8 -16 -16 -16 -16 -16 16 -4 16 8 16 -16 -16 8 -16 -16 -24 16 16 -8 16 -16 16 -16 16 -16 -16 16 -16 16 8 -8 8 - [...]
+1 -3 4 -6 0 0 -8 -4 12 -4 0 4 -6 12 8 0 -4 4 0 6 1 0 -8 -12 16 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 -16 0 8 8 0 -4 -4 -8 -4 4 0 -8 8 0 4 2 0 2 0 8 -1 -8 6 -8 -4 -4 -16 8 0 4 -6 4 4 -4 -8 4 16 8 8 0 -8 0 -8 -4 -8 0 0 0 -8 0 0 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 16 4 0 8 0 8 4 8 4 8 0 -8 -4 4 -4 0 0 4 0 -4 8 2 8 -4 -8 -4 4 8 -4 -8 16 0 -16 0 -16 0 -8 0 8 0 0 4 16 8 4 -8 16 -4 -8 0 0 0 0 8 -16 -16 0 0 0 -4 0 -8 0 4 4 0 0 -4 0 0 8 -4 4 0 4 0 -6 -8 4 0 4 -4 -4 8 2 8 0 8 0 0 8 -8 -4 0 -8 -4 8 4 8 -8 4 2 -4 [...]
+1 -3 -4 -4 6 0 16 0 0 0 6 0 -4 8 -16 4 0 0 0 -4 3 0 -16 8 0 12 0 0 16 0 -2 -8 -4 0 8 -8 -2 0 -8 0 0 0 8 -8 16 -8 12 0 16 0 0 -8 -2 -8 -2 0 16 3 0 -4 -16 -8 0 0 -16 -8 0 -8 0 -8 0 16 8 0 -8 -16 0 0 0 0 -8 16 0 -4 4 0 24 0 -4 -16 -4 24 0 -16 -4 0 0 0 4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 12 -16 -4 8 8 -4 0 -8 0 -8 16 -4 -16 0 0 0 -4 16 -8 16 0 16 0 -16 0 -4 -16 24 -16 -16 16 8 0 0 0 0 0 0 -16 0 0 0 0 16 0 0 0 0 0 -8 0 0 12 -4 -8 -4 24 8 0 0 0 -4 -8 4 -8 4 -4 16 -8 -4 0 0 -8 16 -4 16 -4 16 -16 - [...]
+1 -3 0 -2 4 -4 8 0 4 0 -4 4 -6 4 0 4 0 0 -4 6 1 0 0 -4 8 4 0 0 0 -4 -2 -8 -4 0 -4 0 -2 8 0 -4 -4 8 4 4 0 -4 -4 0 0 0 4 4 2 8 2 0 0 -1 4 -2 -8 4 0 -8 -8 0 0 2 0 -4 0 8 4 -8 0 -16 4 0 -8 4 -4 0 -8 0 0 -4 0 4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 16 0 -4 -4 0 -4 4 0 4 0 2 8 0 0 0 0 -8 -4 0 0 0 0 0 0 0 8 0 8 0 0 -4 0 0 0 0 0 0 16 0 0 0 0 -8 0 0 0 0 4 -4 -4 -4 0 0 4 0 0 -4 0 0 4 0 -4 0 -4 0 2 0 4 0 0 0 4 0 2 0 0 0 0 8 -8 -8 4 0 0 0 0 0 -16 8 4 2 -4 4 4 4 4 4 -4 4 4 0 4 -8 -2 -8  [...]
+1 -3 -4 -4 2 4 8 -4 0 8 2 0 4 0 -8 4 0 8 8 4 -1 0 -8 0 -16 0 -4 -8 16 -8 -2 0 0 -4 8 0 2 -8 0 -4 12 0 -8 8 0 0 0 0 8 8 8 0 -2 0 2 -8 -8 -1 -4 0 -8 -8 -4 -16 8 0 -8 -8 0 8 4 -8 0 -8 0 8 -8 0 0 12 0 0 8 0 0 0 8 4 4 0 0 -8 16 8 0 0 -8 0 0 -8 -8 8 0 0 -8 0 16 0 -4 0 4 0 -4 8 4 -8 0 -4 4 0 -8 8 8 -8 -8 0 8 -8 4 -8 0 -8 8 0 8 0 0 0 8 -8 -8 0 0 -8 8 0 4 8 0 -8 8 0 -8 0 -8 -8 8 0 -8 16 4 0 4 0 -4 4 0 -4 8 0 -8 16 0 4 -8 0 8 0 0 -8 0 4 -4 0 8 8 -8 0 0 0 0 0 8 -8 -8 -8 0 4 8 -8 8 -8 0 -2 0 0 -4 12 [...]
+1 -3 0 2 0 -4 0 0 -4 12 0 4 2 -4 0 4 4 -12 0 -2 -3 0 0 4 0 0 0 8 8 0 -6 0 0 0 -4 0 6 -8 0 -4 4 0 -4 -4 -8 -4 0 0 0 0 0 4 6 0 -6 -8 0 3 4 2 0 4 0 0 0 0 -12 2 12 -4 0 0 4 8 0 0 0 -24 0 -4 4 8 -8 -12 -4 0 0 -4 0 0 12 0 0 0 -2 0 8 0 4 -4 -8 4 0 4 8 -8 0 8 0 24 0 0 0 0 0 4 -4 0 4 -4 -8 4 0 -2 0 -12 0 12 0 0 -4 0 -8 0 8 0 0 -12 0 0 0 0 0 4 -8 24 0 0 0 12 0 0 -8 0 8 0 8 0 -8 0 -4 -4 4 0 0 0 -4 0 0 -4 8 0 0 0 -4 -4 4 4 -2 0 4 0 0 -12 4 0 -2 8 12 -8 0 0 0 0 -4 -8 -24 0 0 -12 0 0 4 6 4 4 4 -4 0 0  [...]
+1 -3 -4 -4 2 4 8 4 0 -8 2 8 4 0 -8 4 0 -8 -8 4 -1 0 -8 0 0 0 4 -8 0 8 -2 0 0 4 8 0 2 8 0 12 -4 -16 -8 -8 0 0 0 0 8 -8 -8 0 -2 0 2 -8 -8 -1 12 8 -8 8 4 0 8 0 8 0 0 -8 -4 -8 0 8 0 8 8 0 -16 -4 0 0 -8 0 0 0 8 4 4 0 0 -8 0 8 8 0 -8 0 0 8 -8 -8 16 0 8 0 0 0 4 0 -4 0 -4 8 4 -8 0 -4 4 0 8 -8 8 0 -8 0 -8 8 4 -8 0 -8 -8 0 -8 0 16 0 8 -8 -8 0 0 -8 -8 0 -4 -8 16 8 8 0 -8 0 -8 -8 -8 16 8 0 4 0 4 0 -4 4 0 -4 8 0 8 0 0 4 8 0 -8 0 8 -8 0 4 4 0 -8 8 0 0 0 0 0 0 8 -8 -8 -8 0 -4 -8 8 8 -8 0 -2 0 0 12 -4 - [...]
+1 -3 0 -8 -2 8 0 0 0 -4 -2 8 4 -8 8 8 4 -4 4 4 -1 0 8 -8 0 0 0 -8 -8 -4 -2 0 0 0 8 0 2 8 0 0 -8 0 0 0 -8 0 0 0 -8 0 4 0 -2 0 2 -8 8 -1 0 0 0 0 0 0 0 0 -4 0 -4 0 0 0 0 8 0 -8 -4 8 0 -8 0 8 -8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 8 8 -8 0 8 0 4 4 -8 0 0 0 4 0 0 0 0 -8 0 0 -4 0 -4 0 0 0 8 0 0 0 0 -8 0 0 0 0 0 0 0 0 8 0 0 -8 -4 -8 0 8 0 8 0 0 -8 0 8 0 0 0 4 4 0 0 4 0 0 0 8 4 0 0 0 0 0 0 8 0 -4 0 -4 0 -8 0 -8 0 8 0 0 0 0 0 -8 8 0 0 -4 -8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 8 2 0 0 0 [...]
+1 -3 0 -2 0 0 0 4 4 0 0 4 2 -4 0 4 0 0 -4 -2 -3 8 0 4 8 0 -4 0 0 4 -2 0 0 -4 -4 0 2 0 0 0 0 -8 -4 4 8 4 0 -8 0 -8 4 4 2 0 -2 0 0 3 0 2 0 -4 -4 -8 0 0 0 2 0 -4 -12 0 4 0 0 0 -4 0 8 0 -4 -8 0 4 4 4 0 0 0 0 -4 0 -8 0 -2 8 0 -8 -4 4 0 -4 -8 -4 0 8 8 -8 4 0 12 -4 0 0 0 4 -4 0 0 4 0 4 0 -2 0 0 8 0 0 0 -4 0 0 0 0 0 8 4 0 0 0 0 0 4 0 0 12 8 -8 0 0 -8 0 8 0 0 0 8 0 -8 0 -4 0 4 0 0 4 0 0 -4 0 8 -4 0 4 4 -4 -4 -2 0 -4 0 4 0 4 0 -2 -8 -4 8 0 0 0 0 -4 0 0 -12 -8 0 0 0 4 2 -4 4 0 0 4 -4 0 -4 4 0 0 8 2 [...]
+1 -3 0 -6 0 4 0 0 12 4 0 -4 2 -4 0 4 -4 -4 8 -2 -3 16 0 4 0 0 0 -8 8 -8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 -4 -4 -8 12 0 -16 0 0 -8 4 -2 0 2 8 0 3 -4 -6 0 4 0 0 0 0 -4 -6 -12 12 0 0 4 8 0 0 8 -8 0 4 -12 8 -8 4 -4 8 0 4 0 0 -4 0 0 0 6 -16 -8 16 4 -4 8 4 0 -12 8 -8 0 8 0 8 0 -8 0 0 0 4 -4 0 -4 12 -8 -12 0 6 0 12 0 4 0 0 -4 0 -8 0 8 0 0 4 0 0 0 0 0 4 -8 8 0 0 0 4 0 16 8 -16 -8 0 8 0 -8 0 4 -4 -4 8 0 0 12 0 0 -4 8 0 -8 0 -4 -4 4 4 6 0 -12 0 0 12 -12 0 6 8 -4 -8 0 0 0 0 -4 8 -8 0 0 -4 0 0 4 -2 -12 4 [...]
+1 -3 -4 2 0 0 0 -4 -4 4 0 4 2 4 0 8 4 -4 0 -2 1 0 0 -4 -8 -4 4 0 8 0 -2 0 4 -4 -4 8 -2 -8 0 0 0 8 -4 4 -8 4 4 0 0 8 0 -4 2 0 2 0 0 -1 0 -2 0 4 -4 8 0 0 -4 -6 -4 -4 -4 0 -4 8 -8 0 0 8 -8 0 4 -8 -8 0 0 0 0 0 0 0 0 0 -8 0 2 0 0 0 0 -4 0 -4 -8 -4 -8 8 8 8 4 -8 4 0 0 0 4 4 4 0 0 -4 8 4 0 2 0 4 -8 4 -4 0 4 0 8 0 -8 0 8 0 0 0 0 0 0 4 8 -8 4 -8 -8 4 0 0 0 0 0 0 -8 8 8 -8 0 4 0 0 0 -4 -4 0 0 4 -8 8 0 4 -4 0 -4 0 2 0 -4 0 4 4 4 0 2 8 0 8 0 0 0 0 -4 0 8 -4 8 -4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 -8 - [...]
+1 -3 -4 2 0 0 0 4 4 -4 0 -4 2 4 0 8 -4 4 0 -2 1 0 0 -4 8 -4 -4 0 -8 0 -2 0 4 4 -4 8 -2 8 0 0 0 -8 -4 4 -8 4 4 0 0 -8 0 -4 2 0 2 0 0 -1 0 -2 0 4 4 -8 0 0 4 -6 4 -4 4 0 -4 -8 -8 0 0 -8 8 0 4 -8 8 0 0 0 0 0 0 0 0 0 8 0 2 0 0 0 0 -4 0 -4 8 -4 8 8 -8 8 -4 8 -4 0 0 0 4 4 4 0 0 -4 -8 4 0 2 0 -4 8 -4 -4 0 4 0 -8 0 8 0 -8 0 0 0 0 0 0 4 -8 8 -4 8 8 -4 0 0 0 0 0 0 8 -8 -8 8 0 4 0 0 0 -4 -4 0 0 4 8 -8 0 4 -4 0 -4 0 2 0 -4 0 -4 -4 4 0 2 8 0 8 0 0 0 0 -4 0 -8 4 -8 4 0 0 -4 2 4 -4 0 0 0 0 4 4 4 0 -4 8  [...]
+1 -3 0 -2 -4 4 0 0 4 0 4 -4 2 -4 8 4 0 0 4 -2 1 0 -8 4 0 4 0 0 0 4 -2 8 -4 0 -4 0 -2 0 0 -4 -4 0 4 -4 0 4 -4 0 -8 0 -4 -4 2 -8 2 0 8 -1 4 -2 -16 -4 0 0 0 0 0 10 0 4 0 0 -4 0 0 -8 -4 0 0 4 4 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 -8 0 8 0 0 0 0 4 0 8 0 -4 4 0 4 -4 8 -4 8 -6 16 0 0 0 0 0 4 -8 -8 0 8 0 -8 0 0 0 16 0 0 -4 -8 0 0 0 8 0 8 0 0 0 0 0 8 -8 8 -8 -4 4 4 -4 0 0 -4 0 0 4 -8 8 4 0 4 0 4 0 2 -8 -4 0 0 0 -4 8 -6 0 0 0 0 -8 0 -16 4 0 0 0 0 0 -8 0 -4 2 4 -4 4 4 -4 -4 -4 -4 -4 0 [...]
+1 -3 0 -6 -4 8 -8 -4 12 -4 4 -4 2 4 8 4 -4 4 0 -2 1 -16 -8 -4 0 4 4 16 8 0 2 -8 4 -4 -4 -8 2 0 8 0 0 0 -4 -4 8 -4 -4 16 -8 -8 0 -4 -2 8 -2 -16 -8 -1 0 -2 8 -4 12 0 8 -8 -12 -6 4 -4 -4 8 -4 0 8 -8 0 8 0 0 -4 8 0 0 0 8 0 8 0 0 0 0 0 -8 2 0 0 0 0 4 0 4 0 4 0 -8 0 -8 -12 -8 4 -8 0 8 8 4 4 0 -8 4 0 4 8 2 -8 -4 8 12 -8 -8 4 8 0 0 0 0 0 0 -8 0 -8 0 0 4 0 -8 4 8 0 12 8 0 0 0 0 -8 0 0 0 0 8 4 -8 8 0 -8 4 0 0 4 0 0 -8 8 4 0 4 0 2 8 4 0 -12 -4 4 8 2 -8 0 -8 0 8 8 8 -4 -16 8 -4 -8 -12 -8 8 -4 -2 -4  [...]
+1 -3 -8 2 4 0 8 -4 4 12 -4 -12 2 4 -8 12 -4 -12 8 -2 1 0 8 -4 0 4 4 0 -8 -8 2 8 4 12 -4 -8 2 0 -8 -8 8 0 -4 -4 8 -4 -4 0 8 -8 -8 -4 -2 -8 -2 0 8 -1 8 -2 -8 -4 -4 0 -8 8 4 -6 4 -4 -4 -8 -4 0 8 8 8 8 0 -8 -4 8 0 0 0 0 0 0 0 0 0 0 0 8 2 16 -16 -16 0 4 16 4 0 4 0 -8 0 -8 4 -8 4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 -4 8 -4 0 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 -8 4 8 0 -4 -8 -16 16 16 -16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 4 -4 4 -8 2 -8 0 -8 0 -8 -8 -8 -4 0 8 -4 -8 4 8 -8 -4 -2 -4  [...]
+1 -3 -8 2 4 0 8 4 -4 -12 -4 12 2 4 -8 12 4 12 -8 -2 1 0 8 -4 0 4 -4 0 -8 8 2 8 4 -12 -4 -8 2 0 -8 8 -8 0 -4 -4 8 -4 -4 0 8 8 8 -4 -2 -8 -2 0 8 -1 -8 -2 -8 -4 4 0 -8 8 -4 -6 -4 -4 4 -8 -4 0 8 8 -8 -8 0 8 -4 8 0 0 0 0 0 0 0 0 0 0 0 8 2 -16 16 16 0 4 -16 4 0 4 0 -8 0 -8 -4 8 -4 0 0 -8 0 4 4 0 0 4 0 4 -8 2 8 4 -8 4 0 8 4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 -4 -8 0 4 -8 16 -16 -16 16 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 -8 4 0 -4 4 4 -8 2 -8 0 -8 0 -8 -8 -8 -4 0 -8 4 8 -4 8 -8 -4 -2 -4  [...]
+1 -3 -4 -2 0 4 8 0 4 0 0 -4 2 -4 0 8 0 0 -4 -2 1 0 0 4 -8 -4 0 0 0 -4 2 0 -4 0 -4 0 2 8 8 4 4 -8 4 4 0 -4 4 0 0 0 4 -4 -2 0 -2 0 -16 -1 -4 6 -8 4 0 8 8 -8 0 2 0 4 0 -8 -4 -8 0 0 4 0 8 -4 -4 0 -8 0 0 -4 0 -4 0 0 0 0 0 -8 -6 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 4 0 0 -4 -4 4 0 4 4 0 -4 0 2 8 0 0 0 4 8 4 16 0 0 0 0 0 0 -8 0 8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 -4 4 4 -4 0 4 4 0 0 4 0 0 4 -4 -4 0 -4 0 -6 16 4 0 0 0 -4 0 2 0 0 0 0 0 8 -8 4 0 0 0 0 0 0 -8 -4 -2 -4 -4 -4 -4 4 4 4 4 4 -8 4 8 6  [...]
+1 -3 0 -6 -4 8 8 4 12 -4 4 -12 2 -12 8 4 -4 4 16 -2 1 0 -8 12 0 4 -4 0 -8 0 2 -8 4 4 -4 8 2 0 -8 0 -16 0 12 -4 -8 -4 -4 0 -8 8 -16 -4 -2 8 -2 0 24 -1 0 6 24 -4 -12 0 -8 8 -12 -14 4 -4 4 -8 -4 0 -8 -8 0 8 0 16 -4 -8 0 0 0 -8 0 -8 0 0 0 0 16 8 -6 16 16 -16 0 4 -16 4 -16 4 16 8 -16 8 12 -8 -4 8 0 8 -8 -12 4 0 8 4 -16 4 8 10 -24 -4 -8 12 8 8 4 -24 16 0 -16 0 16 0 8 0 -24 0 0 -12 16 -8 -4 -8 -16 12 8 -16 -16 16 16 8 -16 16 -16 16 -8 4 8 -8 0 8 4 0 0 4 16 -16 8 -8 4 0 4 0 -6 -24 4 0 12 -4 4 8  [...]
+1 -5 8 -6 4 0 -8 4 4 12 4 12 -10 -4 -8 4 4 12 -8 -10 1 16 -8 -4 -16 4 4 16 -24 -8 2 8 4 12 -4 8 2 -16 8 -8 -8 -16 -12 4 8 4 4 16 8 8 -8 4 2 8 2 16 8 1 -8 2 8 4 4 -16 8 8 4 6 4 4 4 -24 -12 -16 8 -24 -8 8 -16 -8 4 8 -16 0 0 -16 0 16 0 0 0 0 0 8 2 0 0 0 0 4 0 4 0 4 0 8 0 8 4 8 4 16 0 -24 0 -12 -12 0 -16 4 0 4 8 2 8 4 8 4 0 -24 4 8 0 0 0 0 0 0 -8 0 -8 0 0 12 0 -8 -4 -8 0 -4 24 0 0 0 0 24 0 0 0 0 -16 -4 16 16 0 0 -4 0 0 12 0 0 -16 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0 -8 0 -8 -8 -8 12 -1 [...]
+1 -5 12 -4 6 -8 -16 8 16 24 -6 32 -4 -8 -16 -20 -8 -24 -8 4 3 -16 16 8 -16 12 -8 -16 0 -8 6 24 12 -24 8 24 6 -16 24 -8 -8 -16 -8 -8 -16 -8 -12 16 -16 48 8 -8 -6 -24 -6 16 -16 -3 8 -4 -16 -8 24 16 -16 -24 24 -16 24 -8 24 -16 -8 16 -24 -16 8 48 16 8 -8 -16 16 12 4 -8 24 -8 12 48 12 24 -16 16 4 -16 -16 -16 4 8 -16 8 -16 8 -16 16 -16 16 -24 -48 -24 -8 12 16 12 8 8 12 -8 8 -16 8 16 4 16 -24 -48 -24 12 16 8 16 -16 16 -16 48 -16 -12 -16 -24 -16 -48 -16 -8 16 48 24 48 16 24 -16 16 16 16 16 -16 1 [...]
+1 -5 4 2 0 0 -8 4 4 4 0 -4 -2 4 8 0 -4 4 0 -2 1 0 8 4 0 -4 4 0 8 0 -2 0 4 -4 -4 -8 -2 0 0 -8 -8 -16 4 4 8 4 -4 0 -8 -8 0 -4 -2 0 -2 0 8 1 -8 2 -8 4 4 0 8 0 -4 -2 -4 -4 4 -8 12 0 -8 8 0 8 -16 -8 4 8 16 0 0 8 0 0 0 0 0 0 16 8 2 0 0 0 0 4 0 4 0 4 -16 8 -16 8 4 8 4 -8 0 8 -4 4 12 0 0 4 16 -4 -8 -6 -8 -4 -8 -4 4 -8 -4 8 0 0 0 0 0 0 -8 0 8 0 0 -4 0 -8 -4 8 0 4 -8 0 0 0 0 8 0 0 -16 -16 0 4 0 -8 0 -4 -4 0 0 -12 16 16 8 4 -4 0 -4 0 -2 -8 -4 0 -4 4 4 8 6 -8 0 -8 0 0 -8 8 -4 0 -8 -4 8 4 -8 8 4 2 -4 [...]
+1 -5 4 -2 0 4 0 0 4 0 0 4 -2 -4 8 0 0 0 -4 -2 1 0 8 -4 0 -4 0 0 0 -4 2 0 -4 0 -4 0 2 0 -8 -4 -4 0 -4 4 0 -4 -4 0 8 0 -4 -4 2 0 2 0 8 1 -4 2 0 4 0 0 0 -8 0 -2 0 4 0 16 -4 0 0 8 -4 0 0 -4 -4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 2 0 0 0 0 4 0 4 8 -4 8 0 8 0 0 0 0 -4 0 8 4 -4 -4 0 4 -4 -8 4 8 2 0 0 0 0 -4 16 -4 8 8 0 -8 0 -8 0 0 0 0 0 0 4 -8 0 0 0 -8 0 -8 0 0 0 0 -16 8 8 8 8 4 4 -4 -4 0 4 4 0 0 4 -8 -8 4 -4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 4 0 0 0 0 0 -8 -16 4 -2 4 4 4 4 4 4 4 -4 -4 8 4 [...]
+1 -5 0 -2 4 4 8 0 4 0 4 4 -2 4 -16 4 0 0 4 -2 1 0 -16 4 -8 4 0 0 0 4 -2 -8 -4 0 4 0 -2 -8 0 4 4 -8 4 -4 0 4 4 0 0 0 4 -4 -2 -8 -2 0 0 1 4 2 8 -4 0 -8 8 0 0 -2 0 4 0 8 4 -8 0 0 4 0 -8 4 4 0 -8 0 0 4 0 -4 0 0 0 0 0 8 2 0 0 0 0 -4 0 -4 0 4 0 0 0 0 0 0 0 -4 0 0 0 4 4 0 4 4 0 4 0 2 8 0 0 0 0 8 -4 0 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 4 4 -4 -4 0 0 -4 0 0 -4 0 0 4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 -8 -8 -4 0 0 0 0 0 0 -8 4 2 -4 -4 -4 -4 -4 -4 -4 4 4 0 4 8 -2 8 0 [...]
+1 -5 4 4 2 -4 0 4 0 8 -2 8 -4 0 0 -4 0 -8 0 4 -1 0 0 0 -8 0 -4 8 0 0 -2 0 0 -4 0 0 2 0 0 -4 -4 -8 0 0 0 -8 0 0 0 -8 0 8 2 0 -2 -8 0 1 4 0 0 0 4 8 0 0 -8 0 0 0 -4 0 0 0 0 0 0 0 8 4 8 0 0 0 0 0 -8 -4 4 0 0 8 8 0 0 0 8 0 0 0 8 0 8 8 0 0 8 0 -4 0 4 0 -4 0 -4 0 0 -4 -4 -8 0 0 0 0 0 0 8 8 -4 0 -8 0 0 0 0 0 8 0 0 -8 0 0 0 0 0 0 -4 -8 -8 -8 0 0 -8 0 -8 0 0 -8 0 -8 4 8 4 0 4 4 8 4 8 0 0 -8 0 4 0 0 0 0 0 0 -8 -4 4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 4 8 8 0 0 -8 -2 -8 0 -4 -4 0 0 0 0 0 0 0 -8 0 0 0 2 8 0  [...]
+1 -5 4 -6 0 8 -8 -4 4 -4 0 12 -2 -4 8 8 4 -4 -8 -2 1 0 8 -4 0 -4 -4 0 -24 -8 -2 0 4 4 4 -8 -2 0 0 0 0 16 12 4 8 4 -4 0 8 8 -8 -4 -2 0 -2 0 -8 1 0 -6 8 4 -4 0 -8 0 4 6 4 -4 -4 -8 4 0 -8 8 -8 -8 16 0 4 8 -16 0 0 0 0 -8 0 0 0 0 0 -8 -6 0 0 0 0 4 0 4 -16 4 0 8 0 8 -4 -8 -4 0 0 8 -4 12 4 0 8 4 0 -4 8 2 8 4 8 4 4 -8 -4 -8 -16 0 16 0 16 0 8 0 -8 0 0 -12 16 8 4 -8 16 -4 -8 0 0 0 0 8 -16 -16 0 0 8 4 -8 0 0 -4 -4 0 0 -4 0 0 0 4 -4 0 -4 0 6 8 -4 0 4 -4 4 -8 -2 -8 0 -8 0 0 8 -8 -12 0 8 4 -8 -4 -8 8  [...]
+1 -5 4 0 2 0 0 0 8 4 -2 8 -4 0 0 -4 -4 -4 -4 4 -1 8 0 0 0 0 0 0 -8 -4 2 0 0 -8 0 0 -2 -8 0 0 0 0 0 0 0 8 0 -8 0 0 4 8 -2 0 2 0 0 1 0 0 0 0 -8 0 0 0 4 0 -4 0 0 0 0 8 0 0 4 -8 0 0 -8 0 8 0 0 -4 8 0 -4 0 0 -8 0 0 0 8 0 8 0 0 0 0 0 -8 8 0 0 0 8 8 0 -4 -4 0 -4 0 0 4 0 8 8 0 0 0 0 4 0 -4 -4 0 -8 0 8 0 8 0 0 0 0 8 0 0 0 0 -8 -8 0 0 0 4 0 -8 0 -8 0 0 -8 0 -8 0 0 8 0 4 4 4 -8 -4 -8 0 -8 0 4 4 0 0 0 0 0 0 8 4 -8 -4 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 -4 0 0 -8 2 8 0 0 0 -4 -4 0 0 0 0 0 0 0 -8 0 -2 -8 8  [...]
+1 -5 4 4 -2 0 0 0 0 0 2 0 -4 0 16 -4 0 0 0 4 3 0 -16 0 0 -4 0 0 0 0 -2 8 -4 0 0 -8 -2 0 -8 0 0 0 0 -8 0 8 4 0 0 0 0 -8 2 -8 2 0 0 -3 0 4 -16 -8 0 0 -16 8 0 8 0 8 0 0 0 0 8 16 0 0 0 0 8 0 0 -4 4 0 -8 0 -4 16 -4 -8 0 16 -4 0 0 0 4 8 0 8 0 -8 0 0 0 0 0 0 0 0 -4 -16 4 0 0 -4 0 -8 0 -8 0 -4 16 0 0 0 4 0 8 0 0 16 0 16 0 4 -16 8 -16 -16 -16 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 -8 0 0 4 -4 8 4 8 0 0 0 0 -4 -8 -4 -8 -4 4 0 8 4 0 0 8 0 4 0 4 0 -16 8 16 16 0 0 0 0 0 0 -16 0 8 -2 -8 0 0 0 0 0 -4 8 8 [...]
+1 -5 4 4 -2 0 16 0 0 0 2 0 -4 -8 16 -12 0 0 0 4 3 0 -16 8 0 -4 0 0 -16 0 6 -8 -4 0 8 8 6 0 -24 0 0 0 -8 -8 -16 -8 4 0 16 0 0 -8 -6 8 -6 0 16 -3 0 -4 16 -8 0 0 16 24 0 0 0 -8 0 16 -8 0 -8 16 0 0 0 0 -8 -16 0 12 4 0 8 0 -4 16 12 8 0 -16 4 0 0 0 4 8 0 8 0 8 0 16 0 16 0 0 0 0 -4 -16 4 8 8 -4 0 8 0 8 -16 4 -16 0 0 0 4 -16 8 -16 0 -16 0 -16 0 -12 16 -8 16 16 16 -8 0 0 0 0 0 0 16 0 0 0 0 16 0 0 0 0 0 -8 0 0 4 -4 -8 4 -8 -8 0 0 0 -4 -8 -4 -8 -4 -4 16 -8 4 0 0 -8 16 -4 -16 -12 -16 -16 -8 -16 -16  [...]
+1 -5 0 4 2 0 16 0 0 0 -2 0 -4 0 0 0 0 0 0 4 3 0 0 0 0 -4 0 0 -16 0 2 -8 -12 0 0 0 2 0 0 0 0 0 0 8 0 -8 4 0 -16 0 0 -8 -2 8 -2 0 -16 -3 0 4 0 8 0 0 0 0 0 16 0 8 0 16 0 0 0 0 0 0 0 0 -8 0 0 -4 -4 0 0 0 12 0 -4 0 0 0 -4 0 0 0 -4 -8 0 -8 0 8 0 0 0 0 0 0 0 0 4 0 0 0 0 12 0 8 0 -8 16 -4 0 0 0 0 0 -16 8 16 0 0 0 16 0 4 0 0 0 -16 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 -8 0 0 -4 0 -8 -12 0 0 0 0 0 0 8 4 8 4 4 -16 -8 -12 0 0 8 -16 4 0 4 0 0 -8 0 0 0 0 0 0 0 0 0 -16 8 2 8 0 0 0 0 0 -4 -8 -8 0 -12 0 [...]
+1 -5 0 6 0 0 0 4 12 0 0 -12 6 12 0 -12 0 0 12 6 -3 -24 0 12 24 0 4 0 0 -12 6 0 0 -12 -12 0 -6 0 0 0 0 -24 12 12 -24 12 0 -24 0 24 12 12 6 0 -6 0 0 -3 0 6 0 -12 12 24 0 0 0 6 0 -12 -12 0 -12 0 0 0 -12 0 -24 0 -12 24 0 -12 4 -12 0 0 0 0 12 0 -24 0 6 -24 0 24 -4 -12 0 12 -24 12 0 24 24 -24 12 0 -12 12 0 0 0 12 -12 0 0 -12 0 -12 0 6 0 0 24 0 0 0 12 0 0 0 0 0 24 12 0 0 0 0 0 -12 0 0 12 -24 24 0 0 -24 0 24 0 0 0 -24 0 24 0 -12 0 12 0 0 12 0 0 12 0 -24 -12 0 12 -4 -12 4 -6 0 -12 0 -12 0 12 0 -6 [...]
+1 -5 0 2 0 4 0 0 4 -4 0 4 6 4 0 -4 -4 -4 -8 6 -3 -16 0 4 0 0 0 -8 8 8 2 0 0 0 -4 0 -2 -8 0 4 -4 0 4 -12 8 4 0 -16 0 0 -8 12 2 0 -2 -8 0 -3 4 -2 0 12 0 0 0 0 4 -2 12 4 0 0 -4 -8 0 0 8 8 0 -4 -4 -8 8 4 -4 -8 0 4 0 0 -4 0 0 0 -2 16 -8 -16 4 12 8 -12 0 4 8 -8 0 8 0 8 0 8 0 0 0 4 -4 0 -4 -4 -8 4 0 -2 0 12 0 4 0 0 12 0 -8 0 8 0 0 -4 0 0 0 0 0 -4 8 -8 0 0 0 -4 0 16 -8 -16 8 0 -8 0 8 0 -4 -12 4 8 0 0 4 0 0 4 -8 0 -8 0 -12 4 12 -4 2 0 -4 0 0 -12 -4 0 2 -8 4 8 0 0 0 0 -4 8 -8 0 0 -4 0 0 -12 -2 4 4 [...]
+1 -5 -4 8 2 0 8 0 -8 -4 -2 8 4 8 -8 4 4 4 -4 -4 -1 -8 8 -8 -8 0 0 0 -8 12 2 0 0 -8 0 0 -2 -16 0 8 -8 8 0 -8 0 0 0 8 -8 0 4 0 -2 0 2 0 8 1 -8 -8 8 8 -8 8 -8 0 -4 0 4 8 0 -8 -8 16 0 8 -12 8 -8 8 0 0 0 0 0 4 -8 0 -4 0 0 8 8 8 8 -8 0 -8 0 -8 0 8 -8 0 0 0 8 0 8 -8 0 4 -4 -8 4 0 8 4 0 0 0 -8 8 0 -8 -4 0 4 4 8 0 -8 16 0 16 0 -8 0 -8 -8 8 0 0 0 -16 8 0 0 8 -4 8 8 0 8 0 -8 -16 8 0 -8 0 0 0 -4 4 -4 0 -4 8 -8 0 -8 -4 -4 8 0 -8 0 -8 8 0 4 -8 4 8 -8 0 0 0 0 0 0 8 -8 0 0 -8 0 0 4 -8 8 0 2 0 8 8 -8 -4  [...]
+1 -5 0 -2 0 8 0 -4 4 0 0 4 6 -4 0 4 0 0 4 6 -3 -8 0 -4 -8 0 -4 -16 0 -4 -2 0 0 -4 4 0 2 0 0 -8 8 8 -4 12 8 -4 0 -8 0 8 4 12 -2 0 2 -16 0 -3 -8 -2 0 -12 4 -8 0 0 0 -2 0 4 12 0 4 0 0 0 -4 0 8 8 4 -8 0 4 4 -4 0 8 0 0 -4 0 8 0 -2 -8 16 8 -4 -12 -16 12 8 -4 0 -8 -8 8 4 0 12 4 0 0 0 -4 4 0 -8 4 0 4 0 -2 0 0 8 0 0 0 12 0 0 0 0 0 -8 -4 0 0 0 0 0 4 0 0 -12 -8 -8 0 0 -8 16 8 -16 0 0 8 0 -8 -8 -12 8 4 0 0 -4 0 0 -4 0 8 -4 0 12 -4 -12 4 2 0 4 0 -4 0 -4 0 2 -8 4 8 0 0 0 0 4 16 0 -12 -8 0 0 0 -12 2 -4 [...]
+1 -5 -4 8 2 0 8 0 0 4 -2 -8 4 8 -8 4 -4 -4 12 -4 -1 -8 8 -8 8 0 0 0 -24 -4 2 0 0 8 0 0 -2 0 0 -8 8 -8 0 8 0 0 0 8 -8 0 -12 0 -2 0 2 0 8 1 8 0 8 -8 8 -8 -8 0 4 8 -4 -8 0 -8 -8 0 0 8 4 -8 8 -8 0 0 16 0 0 4 -8 0 -4 0 0 8 -8 8 0 -8 0 -8 0 8 0 -8 8 0 16 0 -8 0 -8 8 0 4 -4 -8 4 0 8 4 0 0 16 8 8 -8 -8 4 0 -4 4 8 0 -8 0 0 0 0 8 0 -8 -8 8 0 0 0 0 -8 0 0 -8 4 8 8 0 8 0 -8 0 -8 -16 8 0 0 0 -4 4 -4 0 -4 8 -8 -16 8 -4 -4 -8 0 8 0 0 8 0 4 8 -4 -8 -8 8 0 0 0 0 0 8 -8 0 0 8 0 0 -4 -8 8 0 2 0 8 -8 8 12 - [...]
+1 -5 0 4 -2 4 0 -4 0 0 2 0 4 0 8 0 0 0 -8 -4 -1 -8 -8 0 -8 0 4 0 0 0 2 0 0 -4 0 0 -2 0 0 -4 4 8 8 0 8 0 0 8 8 -8 8 0 -2 0 2 0 -8 1 4 0 0 0 4 8 0 0 0 0 0 0 4 0 -8 0 0 -8 0 0 -8 -4 0 -8 0 0 0 8 0 -4 4 0 0 0 0 0 0 8 0 8 0 0 0 0 0 0 8 8 0 -8 -4 0 -4 8 4 8 0 -8 8 -4 -4 0 8 0 -8 0 0 0 8 0 0 0 0 8 -8 0 -8 0 0 0 0 0 0 0 0 8 8 0 4 -8 0 0 -8 -8 0 -8 0 0 8 0 -8 0 4 0 4 -8 -4 0 0 4 0 -8 -8 0 -8 0 0 0 0 0 0 -8 0 -4 4 0 0 8 0 8 0 -8 0 0 0 0 -8 0 0 -4 8 0 8 0 0 2 0 8 -4 4 -8 0 0 0 0 0 0 8 0 0 8 -2 0 -8 [...]
+1 -5 0 8 -2 0 0 0 -8 4 2 0 4 0 8 0 4 -4 -4 -4 -1 0 -8 0 0 0 0 -8 8 4 -2 0 0 0 0 0 2 -8 0 -8 0 0 -8 0 8 0 0 0 -8 0 4 0 2 0 -2 8 8 1 8 0 0 0 0 0 0 0 4 0 4 0 0 0 8 8 0 -8 -4 -8 0 0 0 -8 -8 0 0 -4 0 8 -4 0 0 0 -8 0 0 0 8 0 0 0 8 0 8 0 0 8 -8 -8 0 8 0 -4 4 8 0 8 -8 4 8 0 0 0 8 0 0 -4 0 -4 0 0 0 -8 0 0 0 0 8 0 0 0 0 0 0 -8 0 -8 0 0 -8 4 -8 0 -8 0 -8 0 0 -8 0 8 -8 0 -8 4 -4 0 0 -4 0 8 0 8 4 0 0 0 0 0 0 8 0 4 0 4 0 -8 0 8 0 -8 0 0 0 0 8 -8 8 0 0 -4 8 0 0 -2 0 -8 -8 0 -4 4 0 0 0 0 0 0 0 -8 -8 2 0 [...]
+1 -5 4 12 -2 -8 -16 8 -16 8 2 0 -4 8 16 4 8 -8 8 4 3 16 -16 -8 -16 -4 -8 -16 32 8 -2 -8 12 8 -8 -24 -2 16 8 -8 -8 -16 8 -8 16 -8 4 -16 -16 -16 -8 -8 2 8 2 16 -16 -3 8 -4 16 -8 -8 16 16 -8 8 -16 -24 -8 24 -16 8 -16 24 16 -8 16 16 8 -8 16 -16 -4 4 8 8 -8 12 16 -4 8 -16 -16 4 16 -16 16 4 8 -16 8 -16 8 16 -16 -16 -16 8 -16 -24 8 -4 -16 4 -8 -8 12 -8 8 16 8 16 4 -16 24 16 -8 4 16 8 16 16 -16 16 -16 -16 4 16 -8 16 16 16 8 -16 16 24 -16 16 8 16 -16 16 -16 16 -16 -16 16 -16 16 8 -8 8 -8 4 -4 -8  [...]
+1 -5 0 4 2 0 0 0 0 0 -2 0 -4 8 0 8 0 0 0 4 3 0 0 -8 0 -4 0 0 0 0 -6 -8 4 0 -8 0 -6 0 0 0 0 0 8 8 -16 8 4 0 0 0 0 -8 6 8 6 0 0 -3 0 -4 0 8 0 0 0 0 0 -8 0 -8 0 0 8 0 0 0 0 0 0 0 8 -16 0 12 -4 0 0 0 -4 0 12 0 0 0 4 0 0 0 -4 -8 0 -8 0 -8 0 16 0 16 0 0 0 0 4 0 0 -8 -8 -4 0 -8 0 8 0 4 0 0 0 0 0 0 8 0 0 0 0 16 0 -12 0 0 0 -16 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 -4 0 8 4 0 8 0 0 0 0 8 4 8 4 -4 0 8 4 0 0 -8 0 -4 -16 -12 -16 0 -8 0 0 -8 0 0 0 0 0 0 0 8 -6 -8 -8 0 0 0 0 -4 -8 -8 0 4 0 4 0  [...]
+1 -5 4 -4 -2 8 -16 -8 16 -8 2 0 -4 8 16 4 -8 8 -8 4 3 -16 -16 -8 16 -4 8 16 0 -8 -2 -8 12 -8 -8 -24 -2 -16 8 8 8 16 8 -8 16 -8 4 16 -16 16 8 -8 2 8 2 -16 -16 -3 -8 -4 16 -8 8 -16 16 -8 -8 -16 24 -8 -24 -16 8 16 24 16 8 -16 -16 -8 -8 16 16 -4 4 -8 8 8 12 16 -4 8 16 -16 4 -16 16 -16 4 8 16 8 16 8 -16 -16 16 -16 -8 16 24 -8 -4 -16 4 -8 -8 12 8 8 -16 8 16 4 -16 -24 -16 8 4 16 8 16 -16 -16 -16 -16 16 4 16 -8 16 16 16 8 16 -16 -24 16 -16 -8 16 16 -16 16 -16 -16 16 -16 16 -16 -8 -8 -8 8 4 -4 -8 [...]
+1 -5 -4 4 6 0 16 0 0 0 -6 0 -4 8 -16 12 0 0 0 4 3 0 16 -8 0 12 0 0 -16 0 -2 -8 -4 0 -8 -8 -2 0 -8 0 0 0 8 -8 16 -8 -12 0 16 0 0 -8 2 8 2 0 16 -3 0 -4 -16 -8 0 0 -16 8 0 0 0 -8 0 16 8 0 8 -16 0 0 0 0 -8 16 0 -4 4 0 24 0 -4 -16 -4 24 0 16 4 0 0 0 4 8 0 8 0 8 0 -16 0 -16 0 0 0 0 12 16 -4 -8 -8 -4 0 8 0 8 -16 4 16 0 0 0 -4 -16 8 -16 0 16 0 -16 0 4 -16 -24 -16 16 -16 8 0 0 0 0 0 0 -16 0 0 0 0 16 0 0 0 0 0 -8 0 0 -12 4 -8 4 -24 8 0 0 0 4 -8 -4 -8 -4 -4 16 -8 4 0 0 -8 16 -4 16 4 16 16 -8 16 16  [...]
+1 -5 -4 4 2 4 8 -4 0 8 -2 -8 4 0 -8 12 0 -8 8 -4 -1 0 8 0 -16 0 4 -8 0 -8 -2 0 0 4 -8 0 2 -8 0 -4 12 0 -8 8 0 0 0 0 8 8 -8 0 2 0 -2 8 -8 1 4 0 -8 -8 -4 16 8 0 -8 -8 0 8 4 -8 0 8 0 8 8 0 0 -12 0 0 -8 0 0 0 8 4 4 0 0 -8 16 -8 0 0 -8 0 0 8 -8 -8 0 0 -8 0 16 0 4 0 -4 0 -4 -8 4 8 0 -4 4 0 -8 -8 -8 8 8 0 -8 8 4 8 0 8 8 0 8 0 0 0 8 8 -8 0 0 -8 -8 0 4 8 0 -8 8 0 8 0 8 -8 -8 0 8 -16 -4 0 -4 0 4 -4 0 4 -8 0 8 -16 0 -4 -8 0 8 0 0 -8 0 -4 -4 0 8 8 -8 0 0 0 0 0 -8 8 8 -8 0 -4 -8 8 -8 8 0 -2 0 0 -4 12 [...]
+1 -5 0 -6 0 12 0 0 4 -12 0 12 6 -12 0 12 4 -12 0 6 -3 0 0 -12 0 0 0 -24 -24 0 -6 0 0 0 12 0 6 24 0 12 -12 0 -12 -12 -24 -12 0 0 0 0 0 12 -6 0 6 -24 0 -3 12 6 0 12 0 0 0 0 12 6 -12 -12 0 0 12 24 0 0 0 24 0 -12 12 24 -24 -12 -4 0 0 12 0 0 12 0 0 0 6 0 -24 0 4 12 24 -12 0 -12 -24 24 0 -24 0 24 0 0 0 0 0 -12 12 0 -12 12 24 -12 0 6 0 -12 0 12 0 0 12 0 24 0 -24 0 0 12 0 0 0 0 0 12 -24 -24 0 0 0 -12 0 0 -24 0 24 0 24 0 -24 0 -12 -12 12 0 0 0 -12 0 0 -12 24 0 0 0 -12 4 12 -4 -6 0 12 0 0 12 12 0  [...]
+1 -5 -4 4 2 4 8 4 0 -8 -2 0 4 0 -8 12 0 8 -8 -4 -1 0 8 0 0 0 -4 -8 -16 8 -2 0 0 -4 -8 0 2 8 0 12 -4 -16 -8 -8 0 0 0 0 8 -8 8 0 2 0 -2 8 -8 1 -12 8 -8 8 4 0 8 0 8 0 0 -8 -4 -8 0 -8 0 8 -8 0 16 4 0 0 8 0 0 0 8 4 4 0 0 -8 0 -8 -8 0 -8 0 0 -8 -8 8 16 0 8 0 0 0 -4 0 4 0 -4 -8 4 8 0 -4 4 0 8 8 -8 0 8 0 8 -8 4 8 0 8 -8 0 -8 0 16 0 8 8 -8 0 0 -8 8 0 -4 -8 -16 8 8 0 8 0 8 -8 8 -16 -8 0 -4 0 -4 0 4 -4 0 4 -8 0 -8 0 0 -4 8 0 -8 0 8 -8 0 -4 4 0 -8 8 0 0 0 0 0 0 -8 8 8 -8 0 4 8 -8 -8 8 0 -2 0 0 12 -4 [...]
+1 -5 0 0 -2 8 0 0 8 -4 2 -8 4 -8 8 8 -4 4 4 -4 -1 0 -8 8 0 0 0 -8 -8 -4 -2 0 0 0 -8 0 2 8 0 0 -8 0 0 0 -8 0 0 0 -8 0 -4 0 2 0 -2 8 8 1 0 0 0 0 0 0 0 0 -4 0 -4 0 0 0 0 -8 0 -8 4 8 0 8 0 8 8 0 0 4 0 0 -4 0 0 0 8 0 0 0 8 0 0 0 8 0 -8 0 0 -8 8 8 0 -8 0 4 4 8 0 0 0 4 0 0 0 0 8 0 0 4 0 4 0 0 0 -8 0 0 0 0 -8 0 0 0 0 0 0 0 0 8 0 0 8 -4 -8 0 -8 0 -8 0 0 8 0 -8 0 0 0 -4 -4 0 0 -4 0 0 0 -8 -4 0 0 0 0 0 0 8 0 4 0 -4 0 -8 0 -8 0 8 0 0 0 0 0 -8 -8 0 0 4 8 0 0 -2 0 0 0 -8 4 -4 0 0 0 0 0 0 0 8 -8 2 0 0  [...]
+1 -7 8 0 2 8 -16 0 8 0 2 8 -8 -8 0 0 0 0 -8 -8 3 16 0 -8 0 -4 0 16 -16 -8 2 8 4 0 -8 0 2 0 0 -8 -8 0 -8 16 16 0 -4 16 16 0 -8 -16 2 8 2 16 16 3 -8 0 0 16 0 0 0 0 0 4 0 0 0 -16 -8 0 0 0 -8 0 0 -8 0 16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 16 -16 16 0 0 0 16 0 16 0 0 0 8 4 0 8 -8 -8 -4 8 0 0 0 16 0 0 0 0 0 8 -16 -16 16 0 0 0 -16 0 -4 0 0 0 -16 0 -8 0 0 0 0 0 0 0 -16 -16 -16 -16 -16 0 0 0 0 8 -16 8 8 4 8 0 -4 0 -8 0 0 8 8 16 -4 16 -4 0 16 0 -4 0 0 0 16 0 16 -4 16 -32 8 0 0 -8 16 0  [...]
+1 -7 4 0 6 8 0 0 8 0 6 8 -8 0 -32 4 0 0 8 -8 3 16 -32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 -16 0 16 12 16 0 0 8 -16 -2 -8 -2 16 0 3 8 8 32 -16 0 -16 32 8 0 4 0 16 0 0 0 -16 8 -32 8 0 -16 8 16 0 -16 -4 4 8 -24 8 -4 16 -4 -24 -16 32 8 16 16 16 4 -16 16 -16 -16 16 -16 0 -16 0 0 0 0 8 12 -32 4 0 0 -4 8 16 -16 16 0 8 32 0 0 0 4 0 -16 0 -16 -16 -16 -16 -16 -4 32 -24 32 -16 -16 0 -16 0 0 0 -16 0 -32 16 16 16 16 0 -16 -16 -16 -16 8 -16 8 8 12 4 16 -4 -24 0 -16 -16 8 4 -16 4 -16  [...]
+1 -7 8 6 4 0 -8 4 4 12 -4 12 -10 -4 -8 -12 -4 -12 -8 10 1 16 8 4 -16 4 -4 16 -8 -8 2 8 4 -12 4 8 2 -16 8 -8 -8 -16 -12 4 8 4 -4 -16 8 8 8 4 -2 -8 -2 -16 8 -1 8 2 8 4 4 16 8 -8 4 -2 4 4 4 -24 -12 16 -8 -24 8 8 16 8 4 8 16 0 0 -16 0 16 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 16 0 24 0 12 12 0 -16 -4 0 -4 -8 -2 -8 -4 -8 -4 0 24 -4 -8 0 0 0 0 0 0 -8 0 -8 0 0 12 0 -8 -4 -8 0 -4 24 0 0 0 0 24 0 0 0 0 16 -4 -16 -16 0 0 -4 0 0 12 0 0 16 0 -4 0 -4 0 -2 -8 -4 0 -4 -4 -4 -8 -2 -8 0  [...]
+1 -7 4 4 2 8 -8 0 8 -4 2 0 0 0 -8 -4 -4 -4 4 0 -1 -8 -8 0 8 0 0 0 8 4 2 0 0 -8 -8 0 -2 0 0 0 0 -8 8 0 0 8 0 -8 -8 0 4 8 2 0 -2 0 8 -1 0 4 -8 0 8 8 8 0 -4 -4 4 0 0 8 0 0 0 8 4 8 -8 0 -8 0 16 0 0 -4 8 -8 -4 0 0 -8 8 8 4 -8 0 -8 0 0 0 0 -8 8 0 0 8 0 8 8 0 -4 -4 8 -4 8 0 4 -8 -8 0 0 -8 -4 -8 4 0 -4 -4 8 8 8 -16 0 -16 0 -8 0 8 -8 -8 0 0 8 -16 8 0 0 -8 -4 8 -8 0 -8 0 8 -16 -8 0 8 -8 8 -8 -4 -4 -4 -8 4 8 0 0 8 -4 -4 0 0 0 0 4 8 8 -4 8 4 0 -8 -4 0 0 0 0 0 8 -8 8 0 8 0 0 -4 8 8 8 2 -8 0 0 0 4 4 0 [...]
+1 -7 4 0 2 12 -8 -4 8 -8 2 8 0 -8 -8 4 0 -8 0 0 -1 0 -8 -8 0 0 -4 -8 -16 0 -2 0 0 -4 0 0 2 8 0 4 4 16 0 0 0 -8 0 0 8 8 0 8 -2 0 2 -8 -8 -1 4 -4 8 0 -4 0 -8 0 8 4 0 0 4 8 8 8 0 8 0 0 16 4 8 0 -8 0 0 -8 -8 -4 4 0 0 8 -16 -8 -4 0 -8 0 0 0 -8 0 0 -8 -8 0 -16 0 -4 0 4 -8 -4 8 -4 0 8 -4 -4 8 -8 0 8 4 8 0 8 8 -4 8 8 -8 8 0 8 0 0 0 -8 8 8 0 0 0 8 0 4 8 0 8 8 0 -8 0 -8 8 8 0 -8 -16 -4 8 -4 -8 -4 -4 8 -4 -8 8 -8 -16 -8 -4 0 0 0 0 -4 -8 -8 4 -4 0 0 8 4 0 0 0 0 0 -8 8 0 -8 0 4 8 8 8 8 8 -2 8 8 4 4 0 [...]
+1 -7 4 10 0 4 0 0 -4 0 0 -4 -2 -4 8 -8 0 0 -4 2 1 0 -8 4 0 -4 0 0 0 -4 2 0 -4 0 4 0 2 0 -8 -4 -4 0 -4 4 0 -4 4 0 8 0 4 -4 -2 0 -2 0 8 -1 4 2 0 4 0 0 0 8 0 6 0 4 0 16 -4 0 0 8 4 0 0 4 -4 0 0 0 0 4 0 -4 0 0 0 0 -8 0 -2 0 0 0 0 -4 0 -4 8 4 8 0 8 0 0 0 0 -4 0 -8 4 4 4 0 4 4 -8 -4 -8 -2 0 0 0 0 -4 -16 4 -8 8 0 -8 0 -8 0 0 0 0 0 0 4 8 0 0 0 8 0 -8 0 0 0 0 -16 -8 -8 -8 -8 -4 4 4 4 0 -4 4 0 0 4 8 8 -4 4 -4 0 -4 0 -2 -8 4 0 0 0 -4 -8 -2 0 0 0 0 0 0 0 -4 0 0 0 0 0 8 16 -4 -2 -4 -4 4 4 4 4 4 4 4 8  [...]
+1 -7 0 10 4 4 8 0 -4 0 -4 -4 -2 4 -16 4 0 0 4 2 1 0 16 -4 -8 4 0 0 -16 4 -2 -8 -4 0 -4 0 -2 -8 0 4 4 -8 4 -4 0 4 -4 0 0 0 -4 -4 2 8 2 0 0 -1 -4 2 8 -4 0 8 8 0 0 6 0 4 0 8 4 8 0 0 -4 0 8 -4 4 0 8 0 0 4 0 -4 0 0 0 0 0 -8 -2 0 0 0 0 4 0 4 0 -4 0 0 0 0 0 0 0 -4 0 0 0 -4 -4 0 4 -4 0 -4 0 -2 -8 0 0 0 0 -8 4 0 0 0 0 0 0 0 -8 0 -8 0 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 0 0 -4 4 4 4 0 0 -4 0 0 -4 0 0 -4 0 4 0 4 0 -2 0 -4 0 0 0 -4 0 -2 0 0 0 0 8 8 8 4 0 0 0 0 0 0 8 -4 2 4 4 -4 -4 -4 -4 -4 -4 -4 0 4 8 [...]
+1 -7 4 6 0 8 -8 -4 4 -4 0 -4 -2 -4 8 0 -4 4 -8 2 1 0 -8 4 0 -4 4 0 -8 -8 -2 0 4 -4 -4 -8 -2 0 0 0 0 16 12 4 8 4 4 0 8 8 8 -4 2 0 2 0 -8 -1 0 -6 8 4 -4 0 -8 0 4 -2 4 -4 -4 -8 4 0 8 8 8 -8 -16 0 4 8 16 0 0 0 0 -8 0 0 0 0 0 8 6 0 0 0 0 -4 0 -4 -16 -4 0 -8 0 -8 4 8 4 0 0 -8 -4 -12 -4 0 8 -4 0 4 -8 -2 -8 -4 -8 -4 4 8 4 8 -16 0 16 0 16 0 8 0 -8 0 0 -12 -16 8 4 -8 -16 -4 -8 0 0 0 0 8 16 16 0 0 -8 4 8 0 0 4 -4 0 0 -4 0 0 0 -4 -4 0 -4 0 6 8 -4 0 4 -4 4 -8 -2 -8 0 -8 0 0 -8 8 12 0 -8 -4 8 4 8 -8 - [...]
+1 -7 0 10 0 8 0 -4 -4 0 0 -12 6 -4 0 4 0 0 4 -6 -3 -8 0 4 -8 0 4 -16 0 -4 -2 0 0 4 -4 0 2 0 0 -8 8 8 -4 12 8 -4 0 8 0 8 -4 12 2 0 -2 16 0 3 8 -2 0 -12 4 8 0 0 0 -2 0 4 12 0 4 0 0 0 4 0 -8 -8 4 -8 0 4 4 -4 0 8 0 0 -4 0 8 0 2 -8 16 8 -4 12 -16 -12 8 4 0 8 -8 -8 -4 0 -12 4 0 0 0 4 -4 0 -8 -4 0 -4 0 2 0 0 -8 0 0 0 -12 0 0 0 0 0 -8 4 0 0 0 0 0 4 0 0 -12 -8 8 0 0 8 -16 -8 16 0 0 -8 0 8 8 -12 -8 -4 0 0 -4 0 0 -4 0 -8 4 0 12 4 -12 -4 2 0 4 0 -4 0 -4 0 2 -8 -4 8 0 0 0 0 -4 16 0 12 8 0 0 0 12 2 4  [...]
+1 -7 0 6 0 12 0 0 4 -12 0 -12 6 -12 0 12 -4 12 0 -6 -3 0 0 12 0 0 0 -24 -24 0 -6 0 0 0 -12 0 6 24 0 12 -12 0 -12 -12 -24 -12 0 0 0 0 0 12 6 0 -6 24 0 3 -12 6 0 12 0 0 0 0 12 6 -12 -12 0 0 12 -24 0 0 0 24 0 12 12 24 24 -12 -4 0 0 12 0 0 12 0 0 0 -6 0 -24 0 4 -12 24 12 0 12 -24 -24 0 24 0 -24 0 0 0 0 0 12 -12 0 -12 -12 24 12 0 -6 0 12 0 -12 0 0 -12 0 24 0 -24 0 0 -12 0 0 0 0 0 12 24 -24 0 0 0 -12 0 0 24 0 -24 0 -24 0 24 0 12 -12 -12 0 0 0 -12 0 0 -12 -24 0 0 0 -12 -4 12 4 -6 0 12 0 0 12 12 [...]
+1 -9 8 6 4 16 -24 -4 12 -12 4 4 -6 -12 -24 -4 -4 -12 8 -6 1 16 -24 -12 16 4 -4 16 -8 8 2 8 4 -12 -12 8 2 16 8 8 8 16 -4 -4 -8 -4 4 16 -8 -8 8 -4 2 8 2 16 -8 1 8 -2 -8 -4 -4 16 -8 8 -4 2 -4 -4 -4 -8 -4 16 8 -8 8 -8 16 8 -4 -8 16 0 0 0 0 0 0 0 0 0 0 -8 -2 0 0 0 0 -4 0 -4 0 -4 0 -8 0 -8 -4 -8 -4 0 0 -8 0 -4 -4 0 0 -4 0 -4 -8 -2 -8 -4 -8 -4 0 -8 -4 -8 0 0 0 0 0 0 8 0 8 0 0 4 0 8 4 8 0 4 8 0 0 0 0 8 0 0 0 0 0 4 0 0 0 0 4 0 0 4 0 0 0 0 4 0 4 0 2 8 4 0 4 4 4 8 2 8 0 8 0 -8 8 8 4 -16 8 4 8 4 8 8 [...]
+1 -9 8 16 2 8 -16 0 -8 0 -2 -8 -8 -8 0 -16 0 0 -8 8 3 16 0 8 0 -4 0 16 16 -8 2 8 4 0 8 0 2 0 0 -8 -8 0 -8 16 16 0 4 -16 16 0 8 -16 -2 -8 -2 -16 16 -3 8 0 0 16 0 0 0 0 0 -4 0 0 0 -16 -8 0 0 0 8 0 0 8 0 16 0 -4 -4 8 0 8 -4 -32 -4 0 0 0 0 -16 -16 -16 -4 -16 -16 -16 0 0 0 -16 0 -16 0 0 0 8 4 0 8 8 8 -4 8 0 0 0 -16 0 0 0 0 0 8 16 16 -16 0 0 0 -16 0 4 0 0 0 16 0 -8 0 0 0 0 0 0 0 16 16 16 16 -16 0 0 0 0 -8 -16 -8 -8 -4 -8 0 4 0 -8 0 0 -8 -8 16 4 16 4 0 16 0 4 0 0 0 16 0 16 4 16 32 8 0 0 8 16 0  [...]
+1 -9 4 16 6 8 0 0 -8 0 -6 -8 -8 0 -32 -4 0 0 8 8 3 16 32 0 -16 12 0 16 -16 8 -2 -8 -4 0 0 8 -2 -16 8 8 8 -16 0 -16 0 16 -12 -16 0 0 -8 -16 2 8 2 -16 0 -3 -8 8 32 -16 0 16 32 -8 0 12 0 16 0 0 0 16 -8 -32 -8 0 16 -8 16 0 16 -4 4 8 -24 8 -4 16 -4 -24 -16 -32 -8 16 16 16 4 16 16 16 -16 -16 -16 0 -16 0 0 0 0 8 12 32 4 0 0 -4 8 -16 -16 -16 0 -8 -32 0 0 0 4 0 16 0 -16 -16 -16 -16 -16 4 32 24 32 16 16 0 16 0 0 0 16 0 -32 -16 -16 -16 -16 0 16 16 16 16 -8 -16 -8 -8 -12 -4 16 4 24 0 16 16 -8 -4 -16 [...]
+1 -9 4 16 2 12 -8 -4 -8 -8 -2 -16 0 -8 -8 -4 0 8 0 0 -1 0 8 8 0 0 4 -8 0 0 -2 0 0 4 0 0 2 8 0 4 4 16 0 0 0 -8 0 0 8 8 0 8 2 0 -2 8 -8 1 -4 -4 8 0 -4 0 -8 0 8 4 0 0 4 8 8 -8 0 8 0 0 -16 -4 8 0 8 0 0 -8 -8 -4 4 0 0 8 -16 8 4 0 -8 0 0 0 -8 0 0 8 -8 0 -16 0 4 0 -4 -8 -4 -8 -4 0 -8 -4 -4 -8 -8 0 -8 -4 -8 0 -8 -8 -4 -8 -8 8 8 0 8 0 0 0 -8 -8 8 0 0 0 -8 0 4 8 0 8 8 0 8 0 8 8 -8 0 8 16 4 8 4 8 4 4 8 4 8 8 8 16 8 4 0 0 0 0 -4 -8 -8 -4 -4 0 0 8 4 0 0 0 0 0 8 -8 0 -8 0 -4 -8 -8 -8 -8 -8 -2 -8 -8 4  [...]
+1 -11 12 12 6 24 -48 -8 16 -24 6 0 -12 -24 -48 -12 -8 -24 24 -12 3 48 -48 -24 48 12 -8 48 0 24 6 24 12 -24 -24 24 6 48 24 24 24 48 -24 -24 -48 -24 12 48 -48 -48 24 -24 6 24 6 48 -48 3 24 -12 -48 -24 -24 48 -48 24 -24 0 -24 -24 -24 -48 -24 48 24 -48 24 -48 48 24 -24 -48 48 12 4 24 24 24 12 48 12 24 48 -48 -12 48 48 48 4 -24 48 -24 48 -24 48 -48 48 -48 -24 -48 -24 24 12 -48 12 -24 -24 12 24 -24 48 -24 -48 -12 -48 -24 -48 -24 12 -48 -24 -48 48 16 48 48 48 12 -48 24 -48 48 16 -24 48 -48 -24  [...]
+end
diff --git a/demos/ppl_lcdd/examples/mit31-20.ine b/demos/ppl_lcdd/examples/mit31-20.ine
new file mode 100644
index 0000000..d38798a
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit31-20.ine
@@ -0,0 +1,34 @@
+begin
+31 20 integer
+1 -6 12 3 0 0 0 -12 -8 0 0 12 3 0 0 0 -6 0 1 0
+1 2 -1 2 -2 0 -4 4 -4 -2 0 2 0 1 -2 2 0 0 0 1
+1 0 -3 0 0 2 0 0 -2 0 4 0 0 -1 0 -2 0 2 0 -1
+1 0 1 -2 -2 0 0 0 0 2 0 2 0 1 -2 0 0 0 0 -1
+1 0 -3 2 -2 0 0 0 0 2 0 -2 0 1 2 0 0 0 0 -1
+1 -2 -1 0 0 2 0 0 2 0 0 0 0 -1 0 0 0 -2 0 1
+1 -2 -5 2 2 -4 4 4 0 2 -8 2 0 1 2 2 0 -4 0 1
+1 -2 3 -2 -2 0 4 4 -4 -2 0 -2 0 1 2 -2 0 0 0 1
+1 -2 -1 2 -2 0 4 -4 4 -2 0 2 0 1 -2 -2 0 0 0 1
+1 -4 1 2 2 -4 0 0 4 -2 0 -2 0 1 -2 0 0 4 0 -1
+1 -4 5 0 0 2 0 0 -2 0 -4 0 0 -1 0 2 0 2 0 -1
+1 -6 11 2 2 -4 -4 -4 -8 2 8 2 0 1 2 -2 0 -4 0 1
+1 6 12 3 0 0 0 12 8 0 0 12 3 0 0 0 6 0 1 0
+1 4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 -4 0 -1 0
+1 2 0 -1 0 0 0 -4 0 0 0 0 -1 0 0 0 2 0 1 0
+1 2 -4 3 0 0 0 4 -8 0 0 -4 3 0 0 0 2 0 1 0
+1 0 -4 1 0 0 0 0 0 0 0 4 -1 0 0 0 0 0 -1 0
+1 0 0 -3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 -1 0
+1 -2 -4 3 0 0 0 -4 8 0 0 -4 3 0 0 0 -2 0 1 0
+1 -2 0 -1 0 0 0 4 0 0 0 0 -1 0 0 0 -2 0 1 0
+1 -4 4 1 0 0 0 0 0 0 0 -4 -1 0 0 0 4 0 -1 0
+1 6 11 2 2 4 4 4 8 2 8 2 0 1 2 2 0 4 0 1
+1 4 5 0 0 -2 0 0 2 0 -4 0 0 -1 0 -2 0 -2 0 -1
+1 4 1 2 2 4 0 0 -4 -2 0 -2 0 1 -2 0 0 -4 0 -1
+1 2 3 -2 -2 0 -4 -4 4 -2 0 -2 0 1 2 2 0 0 0 1
+1 2 -1 0 0 -2 0 0 -2 0 0 0 0 -1 0 0 0 2 0 1
+1 2 -1 -2 2 0 4 -4 -4 2 0 -2 0 1 -2 2 0 0 0 1
+1 2 -5 2 2 4 -4 -4 0 2 -8 2 0 1 2 -2 0 4 0 1
+1 0 -3 -2 2 0 0 0 0 -2 0 2 0 1 2 0 0 0 0 -1
+1 0 -3 0 0 -2 0 0 2 0 4 0 0 -1 0 2 0 -2 0 -1
+1 -2 -1 -2 2 0 -4 4 4 2 0 -2 0 1 -2 -2 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit41-16.ine b/demos/ppl_lcdd/examples/mit41-16.ine
new file mode 100644
index 0000000..bb26798
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit41-16.ine
@@ -0,0 +1,44 @@
+begin
+41 16 rational
+1 -1 0 0 -1 0 1 0 0 0 0 0 0 0 0 0
+1 -3 2 0 1 0 -1 0 0 0 0 0 0 0 0 0
+1 1 0 -1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 -1 0 -1 0 0 0 0 1 0 0 0 0 0 0 0
+1 -1 -2 1 0 0 0 0 1 0 0 0 0 0 0 0
+1 -3 2 1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 1 -1 1 -1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 -1 -1 1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 1 -1 -1 0 0 0 0 -1 0 0 0 0 0 0
+1 -1 1 -1 -1 0 0 0 0 1 0 0 0 0 0 0
+1 -1 -1 -1 1 0 0 0 0 1 0 0 0 0 0 0
+1 -1 -1 1 -1 0 0 0 0 1 0 0 0 0 0 0
+1 -3 1 1 1 0 0 0 0 -1 0 0 0 0 0 0
+1 1 -1 0 0 0 0 0 0 0 -1 0 0 0 0 0
+1 1 1 0 -2 0 0 0 0 0 -1 0 0 0 0 0
+1 -1 -1 0 0 0 0 0 0 0 1 0 0 0 0 0
+1 -1 1 0 -2 0 0 0 0 0 1 0 0 0 0 0
+1 -3 1 0 2 0 0 0 0 0 -1 0 0 0 0 0
+1 0 0 0 -2 0 0 0 0 0 0 0 1 0 0 0
+1 -2 0 0 0 2 0 0 0 0 0 0 -1 0 0 0
+1 -4 0 0 6 -4 0 0 0 0 0 0 1 0 0 0
+1 0 0 -3 0 0 0 0 0 0 0 0 0 3 0 -1
+1 -2 0 3 -4 8 0 -4 0 0 0 -4 0 3 -2 1
+1 -2 0 -1 0 0 0 4 0 0 0 0 0 -1 -2 1
+1 -4 0 1 4 0 0 0 0 0 0 -4 0 -1 4 -1
+1 -6 0 3 12 -8 0 -12 0 0 0 12 0 3 -6 1
+1 3 2 0 1 0 1 0 0 0 0 0 0 0 0 0
+1 1 0 0 -1 0 -1 0 0 0 0 0 0 0 0 0
+1 1 -2 0 1 0 -1 0 0 0 0 0 0 0 0 0
+1 -1 -2 0 1 0 1 0 0 0 0 0 0 0 0 0
+1 3 2 1 0 0 0 0 1 0 0 0 0 0 0 0
+1 1 -2 1 0 0 0 0 -1 0 0 0 0 0 0 0
+1 3 1 1 1 0 0 0 0 1 0 0 0 0 0 0
+1 3 1 0 2 0 0 0 0 0 1 0 0 0 0 0
+1 4 0 0 6 4 0 0 0 0 0 0 1 0 0 0
+1 2 0 0 0 -2 0 0 0 0 0 0 -1 0 0 0
+1 6 0 3 12 8 0 12 0 0 0 12 0 3 6 1
+1 4 0 1 4 0 0 0 0 0 0 -4 0 -1 -4 -1
+1 2 0 -1 0 0 0 -4 0 0 0 0 0 -1 2 1
+1 2 0 3 -4 -8 0 4 0 0 0 -4 0 3 2 1
+1 0 0 1 -4 0 0 0 0 0 0 4 0 -1 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mit708-9.ine b/demos/ppl_lcdd/examples/mit708-9.ine
new file mode 100644
index 0000000..a30a095
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit708-9.ine
@@ -0,0 +1,711 @@
+begin
+708 9 rational
+72 0 0 -4 -4 -2 0 0 0
+216 -2 -2 -10 -12 -6 0 0 0
+192 -4 -2 -8 -8 -8 0 0 0
+288 -12 6 8 -16 -8 0 0 0
+96 -4 2 0 -4 -4 0 0 0
+144 -5 1 -4 -6 -6 0 0 0
+288 -8 -2 -10 -12 -12 0 0 0
+96 -4 2 -4 -2 -4 0 0 0
+240 -7 -1 -10 -8 -10 0 0 0
+288 -8 -2 -12 -8 -12 0 0 0
+288 -8 -2 -8 -16 -8 0 0 0
+96 -4 2 -8 0 0 0 0 0
+0 0 6 -8 4 8 0 0 0
+0 4 6 -8 0 8 0 0 0
+24 2 2 -4 -2 2 0 0 0
+864 -24 -6 -40 -16 -32 0 0 0
+24 0 0 -2 -2 2 0 0 0
+0 4 10 -16 0 24 0 0 0
+0 1 1 -4 0 12 0 0 0
+0 0 6 -16 8 40 0 0 0
+96 -4 2 -16 16 32 0 0 0
+288 -8 -2 -16 0 0 0 0 0
+96 -4 2 8 -8 8 0 0 0
+288 -8 -2 8 -24 24 0 0 0
+0 0 2 -8 8 24 0 0 0
+96 -1 -1 -4 -8 8 0 0 0
+576 -12 -6 -16 -40 16 0 0 0
+192 -4 -2 0 -16 16 0 0 0
+576 -8 -6 -24 -32 -16 0 0 0
+576 -12 -6 -20 -32 -16 0 0 0
+960 -16 -10 -40 -56 -16 0 0 0
+160 0 0 -7 -7 -6 -1 0 -1
+480 -4 -4 -21 -21 -18 -1 0 -3
+192 -4 -4 -12 -4 -8 4 2 -4
+640 -16 -8 -28 -28 -24 4 2 -4
+640 -8 -6 -28 -28 -24 0 0 -4
+192 -8 0 -8 -8 -8 4 2 0
+384 -12 -4 -16 -16 -16 4 2 0
+960 -20 -12 -42 -42 -36 4 2 -6
+240 -9 -1 -11 -9 -10 3 2 -1
+0 2 2 4 0 0 -4 -2 0
+640 -22 -4 -24 -28 -24 8 4 -4
+1920 -60 -20 -76 -84 -72 20 10 -12
+1920 -32 -22 -84 -84 -72 4 2 -12
+960 -28 -10 -44 -36 -40 8 4 -4
+1152 -36 -12 -52 -44 -48 12 6 -4
+720 -23 -7 -33 -27 -30 7 4 -3
+1920 -48 -24 -88 -72 -80 12 6 -8
+3456 -96 -40 -160 -128 -144 28 14 -16
+576 -15 -7 -26 -20 -24 4 2 -4
+384 -12 -4 -20 -12 -16 4 2 0
+336 -11 -3 -17 -11 -14 3 2 -1
+192 -8 0 -12 -4 -8 4 2 0
+0 0 0 -4 4 0 4 2 0
+0 0 2 -8 8 0 8 4 -2
+192 -12 12 -28 12 -8 20 10 -4
+192 -12 12 -20 4 -8 12 6 -2
+1920 -48 -24 -92 -60 -80 12 6 -4
+576 -15 -7 -28 -18 -24 4 2 -2
+1536 -42 -18 -76 -40 -64 12 6 -8
+384 -12 -4 -20 4 -16 4 2 -4
+1920 -60 -20 -102 18 -76 14 10 -18
+1920 -60 -20 -102 -46 -76 14 10 -2
+672 -22 -6 -37 -17 -26 5 4 -1
+640 -22 -4 -36 -16 -24 4 4 0
+960 -40 0 -64 -16 -32 8 10 0
+64 -4 4 -8 0 0 0 2 0
+0 0 8 -6 2 4 -2 2 0
+0 8 18 -8 0 8 -8 2 0
+64 36 60 -28 -4 24 -28 6 -4
+192 28 36 -20 -12 8 -20 2 -4
+96 4 4 -5 -5 -2 -3 0 -1
+64 4 6 -4 -4 0 -4 0 0
+96 0 0 -5 -5 -2 -1 0 -1
+192 -6 0 -8 12 -8 0 0 -4
+960 -30 -8 -48 -20 -40 8 4 -4
+960 -32 -8 -52 -20 -40 12 6 -4
+960 -32 -8 -52 44 -40 12 6 -20
+960 -30 -8 -48 12 -40 8 4 -12
+576 -16 -6 -28 -12 -24 4 2 -4
+208 -8 0 -8 -8 -8 4 2 -2
+160 -7 1 -5 -7 -6 3 2 -1
+192 -12 12 0 -8 -8 8 6 0
+160 -9 7 -1 -7 -6 5 4 -1
+640 -20 -4 -20 -28 -24 4 2 -4
+96 -5 3 -2 -4 -4 2 2 0
+480 -18 -2 -17 -21 -18 7 4 -3
+528 -19 -3 -20 -22 -20 8 4 -4
+1152 -36 -4 -32 -40 -48 0 2 -8
+1152 -36 -12 -48 -40 -48 8 6 -8
+192 -8 0 -4 -4 -8 4 2 -4
+192 -6 0 0 -4 -8 0 0 -4
+384 -12 -4 -8 -8 -16 4 2 -8
+1920 -48 -24 -48 -40 -80 12 6 -40
+384 -16 2 -20 -12 -16 4 4 0
+576 -24 0 -32 -16 -24 8 6 0
+432 -17 -1 -23 -13 -18 5 4 -1
+576 -28 12 -36 -12 -24 12 10 -4
+960 -52 36 -92 12 -40 52 26 -12
+0 0 4 -14 10 4 6 6 -2
+2688 -72 -32 -120 -104 -112 16 10 -8
+0 0 8 -20 12 56 -12 2 -4
+64 -4 4 -16 8 24 -4 2 0
+192 -8 0 -16 0 0 0 2 0
+64 8 16 -20 -4 24 -12 2 -4
+0 2 4 -4 0 8 -4 0 0
+288 -13 3 -12 -10 -12 6 4 -2
+336 -14 2 -15 -11 -14 7 4 -3
+96 3 1 -8 -6 4 0 0 -2
+192 12 0 -20 -12 8 4 2 -4
+0 4 8 -6 2 4 -2 2 -2
+192 -12 12 -28 28 -8 20 10 -12
+0 0 0 -4 16 0 4 2 -6
+0 0 0 -4 40 0 4 2 -12
+192 -8 0 -12 44 -8 4 2 -12
+0 0 2 0 32 0 0 0 -8
+192 -12 12 -20 300 -8 12 6 -76
+960 -40 0 -64 208 -32 8 10 -56
+2112 -72 -16 -120 120 -80 16 14 -48
+512 -16 -4 -26 6 -20 2 2 -6
+512 -16 -4 -26 -10 -20 2 2 -2
+448 -16 0 -24 -8 -16 0 2 0
+448 24 8 -68 -20 56 12 6 -20
+192 8 2 -24 -8 16 4 2 -8
+192 16 0 -36 -4 24 12 6 -12
+448 -13 -5 -23 -13 -18 3 2 -1
+0 2 -2 -4 4 0 4 2 -2
+0 0 0 -22 22 4 14 10 0
+0 0 0 -22 82 4 14 10 -30
+0 0 4 -14 34 4 6 6 -14
+480 -21 3 -20 -18 -20 8 6 -2
+480 -19 1 -16 -18 -20 4 4 -2
+1344 -52 0 -44 -52 -56 12 10 -4
+576 -22 0 -12 -24 -24 4 4 0
+768 -28 -4 -24 -32 -32 8 6 0
+768 -28 -4 40 -32 -32 -8 6 0
+576 -22 0 20 -24 -24 -4 4 0
+320 -12 0 10 -14 -12 -2 2 -2
+160 -7 1 3 -7 -6 1 2 -1
+0 2 2 -12 8 16 4 2 -4
+0 22 14 -52 16 80 12 6 -16
+192 32 16 -68 -4 88 12 6 -20
+128 18 10 -36 -8 48 4 2 -8
+64 8 8 -20 -4 24 -4 2 -4
+0 4 2 -4 4 8 0 0 -4
+0 4 8 -14 2 20 -4 2 -2
+0 1 7 -11 3 14 -3 2 -1
+0 0 8 -12 4 16 -4 2 0
+0 4 12 -20 4 32 -8 2 0
+0 0 24 -44 20 64 -16 6 0
+0 0 4 -10 6 12 -2 2 -2
+0 14 22 -44 8 64 -12 6 -8
+0 6 10 -18 2 28 -6 2 -2
+192 28 36 -52 -12 72 -36 2 -12
+96 3 3 -8 -6 4 -4 0 -2
+0 0 12 -10 6 12 -6 2 -2
+48 0 0 -3 -3 2 -1 0 -1
+192 16 24 -44 -12 72 -28 2 -12
+0 4 12 -14 2 20 -8 2 -2
+0 1 9 -11 3 14 -5 2 -1
+192 32 40 -68 -4 88 -36 6 -20
+16 1 1 -3 -1 6 -1 0 -1
+64 4 6 -12 -4 24 -8 0 -4
+0 4 12 -20 4 40 -12 2 -4
+0 0 10 -16 8 24 -8 2 0
+192 -12 12 -40 16 32 -8 6 0
+0 0 24 -34 14 44 -14 6 -2
+64 -4 4 -16 8 16 0 2 0
+0 0 4 -14 10 20 2 2 -2
+0 0 2 -2 2 4 -2 0 0
+0 0 24 -44 20 72 -20 6 -4
+0 6 10 -16 4 24 -8 2 -4
+0 1 1 -1 1 2 -1 0 -1
+0 6 18 -16 4 24 -12 2 -4
+384 0 -2 -20 -20 -8 0 0 -4
+384 -12 -4 -12 -20 -8 4 2 -4
+640 -16 -8 -20 -36 -8 4 2 -4
+1280 -6 -14 -60 -80 0 -4 2 0
+1024 -2 -10 -52 -64 0 -4 2 0
+1024 -12 -12 -48 -56 -16 0 2 -8
+384 8 -4 -24 -24 0 0 2 0
+256 4 -4 -16 -16 0 2 2 0
+1024 0 -16 -56 -56 -16 8 6 -8
+960 0 -16 -52 -52 -16 12 6 -8
+6400 -96 -72 -280 -280 -240 8 6 -40
+960 -16 -12 -42 -42 -36 2 2 -6
+3840 -48 -40 -168 -168 -144 0 2 -24
+4032 -72 -48 -178 -178 -148 10 6 -26
+1152 -20 -14 -52 -52 -40 4 2 -8
+0 2 -2 0 0 0 2 2 0
+192 -6 0 12 -8 -8 -4 0 0
+192 -4 -4 -8 -8 -8 4 2 0
+6912 -176 -88 -288 -288 -288 40 26 0
+1920 -48 -24 -80 -80 -80 10 6 0
+576 -12 -10 -24 -24 -24 6 4 0
+5760 -168 -64 -264 -216 -240 48 26 -24
+960 -48 24 -36 -36 -40 20 18 -4
+960 -44 12 -28 -36 -40 12 14 -4
+192 -12 12 4 -4 -8 4 6 -4
+960 -56 48 -20 -36 -40 28 26 -4
+640 -20 0 -4 -28 -24 -2 0 -4
+576 -24 0 -28 -12 -24 4 6 -4
+0 0 0 4 8 0 -2 0 -4
+192 -6 0 -4 12 -8 -4 0 -6
+960 -30 0 -32 -12 -40 -8 0 -6
+960 -32 0 -36 -20 -40 -4 2 -4
+640 -20 0 -28 -4 -24 -4 0 -2
+0 0 20 -4 12 8 -12 0 -2
+16 0 0 -1 -1 6 -1 0 -1
+1536 -62 0 -80 -44 -64 16 14 0
+1344 -42 -12 -64 -44 -56 12 6 -4
+2880 -90 -28 -128 -108 -120 28 14 -12
+960 -30 0 -12 -32 -40 -6 0 -8
+768 -30 0 -24 -28 -32 6 6 -4
+576 -24 0 -20 -20 -24 8 6 -4
+576 -24 0 -15 -23 -22 9 6 -5
+192 -8 0 12 -4 -8 -4 2 -4
+0 0 0 -8 8 8 4 2 0
+192 -12 12 -76 76 88 20 10 -12
+0 0 6 -28 28 40 8 4 -6
+576 -15 -7 -29 -15 -22 3 2 -1
+448 -13 -5 -25 -7 -14 3 2 -1
+512 -14 -6 -26 -14 -20 4 2 -2
+448 -13 -5 -23 -5 -18 3 2 -3
+384 -6 -4 -16 -20 -8 0 0 -4
+0 8 8 -24 8 48 0 2 -8
+96 -1 -1 0 -6 36 -4 0 -6
+192 -4 -4 12 -12 72 -4 2 -12
+0 0 0 -6 6 4 2 2 0
+384 -12 -4 -22 -6 -12 2 2 0
+1216 -31 -15 -59 -37 -50 7 4 -3
+960 -20 -16 -42 -42 -36 10 6 -6
+2304 -72 -20 -112 -64 -96 16 10 -8
+1344 -42 -12 -64 -36 -56 8 6 -6
+1152 -36 -12 -56 -32 -48 8 6 -4
+384 -12 -4 -16 -8 -16 0 2 0
+192 -6 0 -4 0 -8 -4 0 0
+912 -26 -10 -43 -31 -38 5 4 -1
+960 -27 -11 -46 -32 -40 6 4 -2
+1344 -39 -15 -66 -44 -56 10 6 -4
+4224 -120 -48 -200 -152 -176 32 18 -16
+4992 -132 -60 -240 -168 -208 32 18 -16
+3456 -96 -40 -168 -104 -144 24 14 -16
+2688 -76 -28 -128 -72 -112 16 10 -16
+960 -29 -9 -46 -28 -40 6 4 -4
+0 2 -2 12 0 0 -4 2 0
+960 -20 -20 134 -42 -36 -38 10 -6
+1920 -60 -20 148 -84 -72 -36 10 -12
+1920 -68 -12 100 -84 -72 -20 14 -12
+320 -12 0 -6 -14 -12 2 2 -2
+960 -40 0 -26 -42 -36 18 10 -6
+576 -12 -8 -22 -30 -12 2 2 -6
+576 -12 -10 -8 -24 -24 -2 4 0
+2304 -56 -32 -80 -96 -96 8 10 0
+960 -20 -20 -38 -42 -36 20 10 -6
+192 -6 0 -4 -4 -8 -2 0 -2
+0 0 0 1 1 2 -1 0 -1
+192 -8 0 -4 28 -8 -4 2 -12
+192 -8 0 -4 60 -8 -4 2 -20
+0 0 2 -4 4 16 -4 0 0
+1792 -28 -20 -80 -88 -48 0 2 -16
+384 -3 -3 -18 -20 -8 -2 0 -4
+8064 -204 -100 -384 -264 -336 48 26 -24
+1920 -48 -24 -88 -56 -80 8 6 -8
+384 -12 -4 -16 8 -16 0 2 -8
+192 -12 12 -12 -4 -8 4 6 0
+192 -12 12 -12 12 -8 4 6 -8
+192 -12 12 4 60 -8 -12 6 -28
+0 0 0 -8 8 16 0 2 0
+192 -4 -2 -4 -4 -8 0 0 -4
+192 -4 -4 16 -12 0 -4 2 0
+768 -20 -12 40 -48 0 -8 6 0
+512 -14 -6 20 -32 0 -4 2 0
+1344 -60 12 -68 -44 -56 20 18 -4
+2112 -92 12 -116 -60 -88 28 26 -4
+960 -44 12 -52 -28 -40 12 14 0
+1920 -48 -24 -72 -56 -80 8 6 -24
+96 -5 3 -4 -2 -4 0 2 0
+0 0 2 -8 24 0 8 4 -10
+0 4 4 -16 8 112 -16 2 -8
+384 -12 -4 -24 0 0 0 2 0
+0 2 -2 -4 16 0 4 2 -8
+64 -4 4 -20 20 24 4 2 -2
+128 -6 2 -20 16 16 4 2 -2
+192 -8 0 -20 12 8 4 2 0
+96 -4 0 -14 10 8 4 2 -2
+448 -20 4 -76 60 56 20 10 -12
+192 -4 -2 -4 -12 8 0 0 -4
+384 -12 -4 0 -24 16 4 2 -8
+192 -8 0 4 -12 8 4 2 -4
+192 12 20 -20 -12 8 -12 2 -4
+192 12 4 -20 -12 8 -4 2 -4
+192 76 20 -84 -12 72 -4 18 -12
+64 20 12 -28 -4 24 -4 6 -4
+64 20 44 -28 -4 24 -20 6 -4
+0 12 36 -22 2 20 -14 6 -2
+0 4 10 -8 0 8 -4 2 0
+0 4 6 -8 0 8 -2 2 0
+0 4 0 -6 2 4 2 2 -2
+0 0 4 -6 2 4 0 2 0
+192 4 2 -12 -12 0 -4 0 0
+0 8 8 -16 0 24 -4 2 0
+64 20 4 -28 -4 24 4 6 -4
+0 20 4 -24 0 24 4 6 0
+0 8 0 -8 0 8 4 2 0
+0 5 -1 -6 2 4 4 2 -2
+64 24 0 -28 -4 24 12 6 -4
+96 46 -10 -42 -6 36 18 14 -6
+32 18 -6 -14 -2 12 10 6 -2
+192 112 -40 -84 -12 72 76 38 -12
+0 6 -2 -4 0 4 4 2 0
+0 0 0 0 16 0 0 2 -8
+192 -12 12 4 28 -8 4 6 -20
+960 -40 0 38 -42 -36 2 10 -6
+960 -40 8 -20 -36 -40 4 10 -4
+192 -8 2 0 -8 -8 0 2 0
+384 -18 6 -4 -16 -16 4 6 0
+192 -8 0 8 -8 -8 0 2 0
+320 -20 20 10 -14 -12 14 10 -2
+576 -8 -6 -20 -36 24 -4 0 -12
+96 -1 -1 -4 -6 4 0 0 -2
+192 16 -8 -20 -12 8 12 6 -4
+960 12 -20 -60 -52 -8 20 10 -12
+576 -12 -8 -26 -26 -20 4 2 -4
+1920 -48 -24 -68 -100 -40 12 6 -20
+640 -16 -8 -32 -16 -24 4 2 0
+384 -12 -4 -24 0 -8 4 2 0
+192 -8 0 -36 44 24 12 6 -12
+192 -8 0 -36 76 24 12 6 -20
+128 -6 2 -20 40 16 4 2 -8
+64 -4 4 -20 60 24 4 2 -12
+0 0 2 -4 20 8 0 0 -4
+624 -21 -5 -34 -16 -24 4 4 0
+400 -12 -4 -20 -12 -16 2 2 0
+192 1 -1 -10 -12 0 -2 0 0
+640 -16 -8 -8 -40 48 0 2 -16
+1920 -48 -24 -24 -120 80 8 6 -40
+96 8 8 -22 -6 36 -10 2 -6
+0 8 8 -16 0 32 -8 2 0
+2112 -72 -16 -120 -40 -80 16 14 -8
+3456 -100 -36 -160 -120 -144 24 14 -16
+1152 -36 -12 -59 -27 -46 7 6 -3
+1920 -48 -24 -96 -32 -64 8 6 0
+640 -16 -8 -32 0 0 0 2 0
+240 -2 -2 -11 -15 10 -3 0 -5
+960 -20 -12 -32 -56 16 0 2 -16
+1920 -48 -24 216 -80 -80 -64 6 0
+384 -12 -4 32 -16 -16 -8 2 0
+320 -10 0 18 -14 -12 -6 0 -2
+192 -6 0 20 -4 -8 -8 0 -4
+320 -10 0 -14 18 -12 -2 0 -6
+32 -1 1 -4 6 20 -4 0 -2
+192 -8 0 -16 32 0 0 2 -8
+192 -8 0 -20 28 8 4 2 -4
+0 0 0 -8 28 8 4 2 -8
+0 0 0 -6 34 4 2 2 -10
+384 -12 -4 -22 2 -12 2 2 -2
+192 -12 12 28 -12 8 12 6 -4
+576 -24 0 -8 -24 -16 8 6 -8
+192 -8 0 -2 -10 -4 4 2 -2
+768 0 -8 -40 -40 -16 0 2 -8
+3840 0 -56 -200 -200 -80 24 18 -40
+384 0 -6 -20 -20 -8 4 2 -4
+768 -12 -10 -36 -36 -24 4 2 -6
+192 -8 0 -20 28 88 -12 2 -4
+64 -4 4 -20 52 200 -28 2 -12
+0 0 8 -24 72 336 -48 2 -24
+0 1 1 -2 4 40 -6 0 -4
+0 0 2 -4 12 48 -8 0 -4
+1792 -4 -20 -88 -112 0 -8 6 0
+768 4 -12 -40 -48 0 0 6 0
+192 0 -4 -10 -10 -4 2 2 -2
+96 -5 3 1 -5 -2 3 2 -1
+96 6 -2 -10 -6 4 2 2 -2
+528 9 -11 -35 -29 -2 9 6 -7
+480 38 -18 -50 -30 20 22 14 -10
+640 12 -12 -40 -40 0 8 6 0
+48 -3 3 -14 8 24 -4 2 0
+384 2 -6 -20 -24 144 4 2 -24
+192 -4 -2 -6 -10 -4 0 0 -2
+1344 -24 -16 -56 -72 -16 0 2 -16
+2880 -60 -36 -112 -152 -56 12 6 -28
+1344 -24 -16 -56 -72 -24 4 2 -12
+384 -6 -6 -12 -24 0 0 2 0
+64 -4 4 4 -4 0 4 2 0
+384 -12 -4 48 -8 -16 -16 2 -8
+192 -6 0 12 -4 -8 -6 0 -4
+576 -18 0 -23 -3 -22 -5 0 -3
+0 0 0 -22 194 4 14 10 -58
+64 -4 4 -8 96 0 0 2 -24
+0 0 10 -2 154 4 -6 0 -38
+384 -12 -4 16 -24 80 0 2 -16
+64 -2 0 8 -4 24 0 0 -4
+384 -12 -4 48 -24 144 0 2 -24
+192 -8 0 4 -12 0 4 2 0
+384 -12 -4 16 -24 16 0 2 -8
+0 0 6 1 9 2 -5 0 -3
+0 0 2 4 16 0 -4 0 -6
+1344 -56 8 -60 -44 -56 12 14 -4
+192 -4 -2 32 -4 -8 -12 0 -4
+1920 -48 -24 296 -40 -80 -104 6 -40
+192 -4 -2 24 -8 -8 -8 0 0
+960 -20 -10 114 -42 -36 -38 0 -6
+640 -16 -8 68 -28 -24 -20 2 -4
+0 10 2 -12 0 160 -20 2 0
+0 3 -1 -6 4 40 -2 2 -4
+0 8 -8 -24 24 80 8 10 -8
+0 116 -36 -80 0 80 64 38 0
+0 136 -56 -120 40 80 104 58 -40
+0 14 -6 -12 4 8 12 6 -4
+0 10 -6 -12 8 16 12 6 -8
+192 8 -8 -20 -4 88 12 6 -20
+960 0 -16 -52 -52 248 12 6 -52
+0 0 2 -4 20 80 -12 0 -4
+64 -2 0 -4 8 24 -4 0 0
+1920 -40 -20 -68 -84 -72 -2 0 -12
+576 -12 -6 -19 -23 -22 -1 0 -5
+1920 -48 -24 -72 -72 -80 4 6 -8
+192 -4 -4 4 -4 -8 -4 2 -4
+1920 -68 -12 -60 -84 -72 20 14 -12
+0 1 1 -2 4 24 -4 0 -4
+0 0 2 -4 12 32 -6 0 -4
+64 -4 4 -20 52 72 -12 2 -12
+192 -8 0 -20 28 24 -4 2 -4
+448 -16 0 -36 28 56 -12 2 -4
+288 -8 -4 -2 -18 12 2 2 -6
+192 -4 -4 12 -12 8 -4 2 -4
+192 -12 12 14 -10 -4 10 6 -2
+192 -8 0 36 -12 72 4 2 -12
+1344 -24 -16 -36 -84 120 -12 2 -36
+960 -20 -12 -20 -60 72 -4 2 -24
+640 -16 -8 -20 -36 0 4 2 -8
+576 -12 -8 -18 -34 -4 2 2 -2
+192 -4 -4 -4 -12 0 4 2 0
+192 -4 -4 -6 -10 -4 4 2 -2
+192 -4 -4 36 -4 -8 -12 2 -4
+192 -4 -4 28 -8 -8 -8 2 0
+192 -4 -4 4 -8 -8 -2 2 0
+960 -20 -20 22 -42 -36 -10 10 -6
+384 -12 -4 16 -8 -16 -8 2 -8
+576 -12 -6 0 -16 -24 -10 0 -8
+1920 -48 -24 -24 -56 -80 -16 6 -24
+1920 -48 -24 72 -40 -80 -48 6 -40
+192 -4 -2 8 -4 -8 -6 0 -4
+576 -12 -6 -15 -23 -22 -3 0 -5
+0 0 0 -8 24 80 -8 2 -8
+64 -4 4 -20 20 72 -12 2 -4
+192 -8 0 -20 12 24 -4 2 0
+192 -6 0 -12 8 8 -4 0 0
+0 0 0 -8 24 16 0 2 -8
+0 0 2 -4 20 16 -4 0 -4
+0 0 2 -4 12 24 -4 0 -4
+96 -4 0 -14 10 20 -2 2 -2
+64 -4 4 -20 52 40 -4 2 -12
+192 -12 12 -60 188 152 -28 6 -36
+0 0 14 -18 6 20 -6 4 0
+576 -8 -8 -20 -36 24 -4 2 -12
+640 -16 -8 24 -40 48 -8 2 -16
+192 -6 0 8 -12 8 0 0 -4
+640 -20 -4 16 -40 48 0 2 -16
+960 -20 -12 -4 -60 168 -12 2 -36
+640 -16 -8 24 -40 176 -8 2 -32
+640 -16 -8 56 -40 240 -8 2 -40
+960 -20 -12 28 -60 296 -20 2 -52
+192 -4 -2 12 -12 72 -4 0 -12
+1920 -48 -24 156 -100 -40 -44 6 -20
+384 -12 -4 20 -20 -8 -4 2 -4
+192 -8 0 6 -10 -4 2 2 -2
+0 0 0 8 4 0 -4 0 -2
+192 -12 12 4 12 -8 -12 6 -4
+192 -8 0 -4 4 -8 -4 2 0
+192 -6 0 -4 20 -8 -4 0 -8
+0 3 11 -9 1 10 -5 2 -1
+576 -12 -6 -16 -16 -24 -2 0 -8
+1920 -48 -24 -48 -112 32 8 6 -32
+640 -16 -8 -8 -40 16 0 2 -8
+1152 -12 -12 -52 -60 -24 -4 2 -12
+2880 -60 -36 -112 -152 -48 8 6 -32
+0 8 16 -36 12 120 -28 2 -12
+0 2 4 -8 4 40 -8 0 -4
+0 0 4 -16 16 48 -8 2 -4
+0 4 4 -16 8 48 -8 2 -8
+128 -6 2 -2 -6 -4 2 2 0
+160 -7 1 1 -9 -2 3 2 -1
+288 -8 -4 -2 -18 0 2 2 0
+768 -20 -12 8 -48 0 0 6 0
+0 8 0 0 0 96 -16 2 0
+192 4 -4 12 -12 72 -20 2 -12
+0 6 -2 12 0 48 -12 2 0
+0 12 -4 -8 0 96 -8 6 0
+192 16 -16 -12 -12 72 4 14 -12
+0 14 -10 -4 0 48 4 10 0
+640 -16 -8 32 -40 0 -8 2 0
+1920 -48 -24 104 -120 80 -24 6 -40
+1920 -48 -24 116 -108 8 -36 6 -28
+640 -16 -8 24 -40 16 -8 2 -8
+192 -4 -2 12 -12 8 -4 0 -4
+192 -4 -2 13 -11 2 -5 0 -3
+576 -12 -6 28 -36 16 -12 0 -8
+192 -4 -2 12 -12 0 -4 0 0
+192 -4 -2 18 -10 -4 -6 0 -2
+384 -12 -4 16 -24 0 0 2 0
+384 -12 -4 0 -24 0 4 2 0
+1920 -48 -24 -56 -56 -80 -8 6 -8
+0 20 4 -24 0 288 -40 6 0
+0 2 0 4 0 8 -4 0 0
+0 10 -6 -4 0 16 4 6 0
+0 14 -6 -8 0 8 8 6 0
+0 20 -4 -16 0 16 8 6 0
+0 8 2 -8 0 8 0 2 0
+0 32 0 -32 0 32 8 10 0
+48 19 -1 -21 -3 18 5 6 -3
+1152 -18 -14 -50 -62 -20 2 2 -10
+0 2 -2 -2 2 4 2 2 -2
+192 -4 -2 4 -12 40 -4 0 -8
+192 -4 -2 4 -12 24 -4 0 -6
+128 -3 -1 2 -8 16 -2 0 -4
+64 -4 4 -20 20 40 -4 2 -4
+192 -12 12 -52 36 104 -20 6 -4
+0 0 6 -12 20 40 -8 0 -4
+384 -12 -4 -24 32 64 -8 2 0
+0 0 0 -6 18 4 2 2 -6
+0 0 0 -8 20 8 4 2 -6
+0 0 8 -24 40 208 -32 2 -16
+0 0 8 -24 40 144 -24 2 -16
+0 0 8 -24 40 112 -16 2 -16
+192 -8 0 -20 60 152 -20 2 -4
+64 -4 4 -20 84 264 -36 2 -12
+960 -16 -12 -26 -42 -36 -6 2 -6
+960 -20 -12 -34 -42 -36 0 2 -6
+960 -20 -16 -18 -42 -36 -2 6 -6
+576 -8 -8 -20 -36 88 -4 2 -20
+192 132 -60 -84 -12 72 76 58 -12
+192 20 -12 -20 -12 8 12 10 -4
+96 3 -3 -6 -6 0 2 2 0
+768 16 -16 -48 -48 0 8 10 0
+96 -1 -1 0 -6 20 -4 0 -4
+0 3 5 -10 8 72 -14 0 -8
+0 4 12 -32 24 176 -32 2 -16
+192 -12 12 -60 60 152 -28 6 -4
+192 -12 12 -76 76 184 -28 10 -12
+0 0 0 0 48 0 0 2 -16
+576 -12 -8 -12 -36 24 0 2 -12
+192 -4 -4 -4 -12 8 4 2 -4
+0 0 12 -32 32 96 -16 2 -8
+0 24 -8 -24 8 16 16 10 -8
+0 52 -28 -64 40 80 48 30 -40
+192 -12 12 20 156 -8 -28 6 -60
+192 -12 12 20 380 -8 -28 6 -116
+0 0 2 4 40 0 -4 0 -12
+0 0 6 8 24 0 -8 0 -10
+0 0 8 -36 28 152 -20 6 -4
+32 -2 2 -12 8 32 -4 2 0
+0 0 2 4 4 0 -4 0 0
+0 0 6 8 8 0 -8 0 -2
+0 0 6 1 5 2 -5 0 -1
+1024 -16 -12 -48 -48 -32 4 2 -8
+1248 -23 -15 -55 -57 -42 3 2 -9
+1344 -24 -16 -58 -66 -36 2 2 -12
+1056 -21 -13 -45 -51 -30 3 2 -9
+960 -20 -12 -40 -48 -24 4 2 -8
+0 0 8 -24 24 112 -20 2 -8
+0 4 12 -32 24 144 -24 2 -16
+0 0 8 -24 24 80 -12 2 -8
+0 8 0 -8 24 80 -8 2 -24
+0 6 -2 -4 16 48 4 2 -16
+0 14 -10 -20 16 48 20 10 -16
+0 20 -12 -32 24 80 16 14 -24
+0 14 -2 -20 8 16 12 6 -8
+0 12 -4 -16 8 16 8 6 -8
+0 2 0 0 4 8 0 0 -4
+192 4 -4 -12 -4 88 4 2 -20
+96 1 -3 -4 -6 36 0 2 -6
+192 4 -12 -4 -12 72 12 10 -12
+192 -4 -4 22 -10 -4 -6 2 -2
+1344 -28 -16 -54 -62 -44 2 2 -10
+2688 -36 -28 -120 -144 -32 -8 2 -32
+640 -8 -6 -28 -36 0 -4 0 -8
+112 -1 -1 -5 -7 2 -1 0 -1
+48 2 2 -7 -3 18 -5 0 -3
+0 1 1 -2 0 8 -2 0 0
+0 12 20 -48 24 240 -48 2 -24
+4864 -80 -56 -216 -216 -176 8 6 -32
+2304 -32 -24 -104 -104 -80 0 2 -16
+1152 -24 -14 -44 -60 -24 4 2 -12
+384 -6 -4 -12 -24 24 -4 0 -8
+1728 -28 -20 -64 -104 48 -8 2 -32
+1344 -24 -16 -36 -84 88 -12 2 -28
+192 8 -8 -12 -12 8 4 6 -4
+192 48 -32 -28 -12 72 20 30 -12
+1920 -48 -24 -44 -108 8 4 6 -28
+960 -20 -12 -20 -60 40 -4 2 -16
+1344 -28 -16 -28 -84 40 -4 2 -20
+768 -14 -8 -20 -48 24 -4 0 -12
+2112 -32 -24 -68 -132 152 -20 2 -52
+192 -4 -2 -3 -11 2 -1 0 -3
+576 -12 -6 -4 -36 16 -4 0 -8
+192 -4 -2 4 -12 16 -4 0 -4
+1728 -36 -18 -59 -75 -62 -3 0 -13
+192 4 -4 -12 -12 0 4 2 0
+96 -1 -1 -3 -5 -2 -1 0 -1
+192 0 -2 -4 -12 0 -4 0 0
+960 -12 -12 -36 -60 8 -4 2 -4
+1920 -18 -26 -76 -120 0 -4 6 0
+2688 -42 -34 -116 -144 -48 4 6 -24
+864 -17 -11 -37 -43 -22 3 2 -7
+2880 -60 -36 -118 -142 -76 10 6 -26
+192 -6 0 -10 10 -4 -2 0 -2
+192 -6 0 -10 2 -4 -2 0 0
+0 0 2 -2 26 4 -2 0 -6
+192 -12 12 -40 240 32 -8 6 -56
+480 -7 -5 -12 -30 52 -8 0 -14
+0 0 4 -16 16 80 -12 2 -4
+0 4 6 -12 4 48 -12 0 -4
+1152 -36 -12 -60 -20 -40 4 6 -4
+0 2 8 -16 12 56 -12 0 -4
+0 10 16 -32 12 120 -28 0 -12
+96 9 -1 16 -6 36 -20 0 -6
+96 1 -1 0 -6 4 -4 0 -2
+416 -10 -6 -12 -24 16 4 2 -8
+192 -4 -4 6 -10 -4 -2 2 -2
+192 -4 -4 8 -12 0 -2 2 0
+0 4 -2 -3 1 2 3 2 -1
+960 -12 -12 -44 -52 -16 4 2 -8
+576 -8 -8 -28 -28 -16 4 2 -4
+0 3 5 -9 1 10 -1 2 -1
+0 3 7 -9 1 10 -3 2 -1
+1792 -16 -24 -88 -88 -48 8 6 -16
+864 -15 -11 -39 -41 -26 3 2 -7
+672 -11 -9 -31 -33 -18 3 2 -5
+960 -16 -12 -42 -50 -20 2 2 -8
+3200 -80 -40 -154 -90 -132 18 10 -6
+1920 -48 -24 -94 -46 -76 10 6 -2
+1056 -12 -12 -50 -58 -4 -2 2 -14
+960 -12 -12 -44 -52 -8 4 2 -12
+0 0 6 -20 20 56 -8 2 -6
+192 8 8 -24 -8 16 -8 2 -8
+0 3 1 -2 4 8 -2 0 -4
+0 11 1 -2 20 40 -6 0 -20
+0 0 18 -3 13 10 -13 0 -3
+400 -6 -4 -16 -20 -8 -2 0 -4
+3648 -64 -40 -144 -176 -96 -8 2 -32
+624 -8 -6 -26 -34 -4 -4 0 -8
+576 0 -6 -28 -36 0 -4 2 0
+4608 -60 -52 -200 -240 -96 -8 6 -48
+1152 -18 -14 -48 -60 -24 0 2 -12
+1920 -34 -22 -80 -92 -56 0 2 -16
+1728 -36 -22 -74 -82 -52 8 4 -14
+1344 -28 -20 -40 -80 96 8 6 -32
+576 -12 -8 -12 -36 56 0 2 -16
+528 -13 -7 -16 -30 4 4 2 -8
+192 -12 12 -48 40 80 -16 6 -8
+192 -12 12 -48 200 80 -16 6 -48
+0 0 6 -12 52 40 -8 0 -12
+0 0 2 -3 21 10 -3 0 -5
+256 -8 0 -12 12 -8 -2 0 -4
+192 -6 0 -7 13 -6 -3 0 -5
+512 -16 0 -24 0 -16 -4 0 -2
+512 -14 -6 -4 -32 0 2 2 0
+640 -16 -8 -8 -40 0 2 2 0
+960 -20 -14 -20 -60 0 2 4 0
+960 -20 -12 -4 -60 72 -12 2 -20
+960 -20 -12 -4 -60 104 -12 2 -28
+192 -12 12 20 36 -8 -28 6 0
+0 0 2 -3 5 10 -3 0 -1
+192 28 -4 -44 -4 24 20 10 -12
+64 8 0 -12 -4 8 4 2 -2
+256 14 6 -36 -16 32 4 2 -8
+48 4 6 -10 -2 20 -8 0 -4
+16 2 4 -4 0 8 -4 0 -2
+0 12 36 -28 12 56 -28 2 -12
+0 4 4 -8 0 8 0 2 0
+64 4 8 -12 -4 8 -4 2 0
+448 12 12 -36 -28 8 -12 2 -4
+1536 -22 -16 -52 -96 56 -12 0 -28
+1792 -16 -16 -88 -88 -48 0 2 -16
+384 6 -10 -20 -24 0 4 6 0
+2304 -12 -28 -104 -144 0 -8 6 0
+3840 -48 -40 -168 -200 -80 -8 2 -40
+0 0 8 -6 10 4 -2 2 -4
+0 4 8 -6 18 4 -2 2 -10
+768 -16 -10 -16 -48 24 -2 2 -12
+2304 -56 -32 -32 -144 96 8 10 -48
+1792 -48 -24 -16 -112 0 8 10 0
+2304 -56 -32 -32 -144 0 8 10 0
+192 -6 0 -7 5 -6 -3 0 -3
+448 -14 0 -19 1 -14 -5 0 -3
+576 -18 0 -24 4 -16 -8 0 -4
+192 -6 0 10 -10 -4 -2 0 -2
+256 -8 0 12 -12 -8 -4 0 -2
+512 -16 0 0 -24 -16 -2 0 -4
+192 -6 0 2 -10 -4 0 0 -2
+576 -18 0 4 -24 -16 -4 0 -8
+448 -14 0 1 -19 -14 -3 0 -5
+576 -18 0 -3 -23 -22 -3 0 -5
+192 -6 0 5 -7 -6 -3 0 -3
+192 -6 0 13 -7 -6 -5 0 -3
+64 -4 4 20 -4 24 4 2 -4
+2304 -56 -32 -96 -96 -96 16 10 0
+768 -30 0 -32 -28 -32 8 6 0
+0 1 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0
+0 0 0 0 1 0 0 0 0
+0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 1
+end
diff --git a/demos/ppl_lcdd/examples/mit71-61.ine b/demos/ppl_lcdd/examples/mit71-61.ine
new file mode 100644
index 0000000..dcc420d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit71-61.ine
@@ -0,0 +1,74 @@
+begin
+71 61 rational
+64 -384 0 192 0 0 768 0 0 -512 0 0 0 -768 0 0 0 0 0 768 0 0 0 0 0 0 0 0 0 0 0 0 0 192 0 0 0 0 0 -384 0 0 0 0 0 0 0 0 0 0 0 64 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 -6 6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 6 -6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 -2 -2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 2 2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 2 -2 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 2 6 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 -6 -6 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 -8 4 -8 16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 0 -4 -8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 4 8 4 -8 -16 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 8 -8 0 0 0 -24 24 0 24 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 8 8 0 0 0 -24 -24 0 24 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -8 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+16 -64 0 0 0 0 96 0 0 -64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -6 12 3 -12 -8 3 12 -6 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 4 1 0 0 -1 -4 4 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 -1 4 0 -1 0 -2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 -4 3 -4 8 3 -4 -2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -4 1 0 0 -1 4 0 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -3 0 0 3 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 -4 3 4 -8 3 -4 2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -1 -4 0 -1 0 2 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 4 1 0 0 -1 -4 -4 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 6 12 3 12 8 3 12 6 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 -2 8 4 8 -4 -8 -8 8 2 -2 -2 10 -16 -4 12 8 -2 -8 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 -2 4 0 0 0 0 4 -4 -2 2 -2 6 -4 0 -4 0 2 4 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -8 2 -8 4 8 4 8 -8 -8 2 2 -2 6 0 -4 4 -8 -2 8 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 -4 2 -4 0 0 0 0 4 4 -2 -2 -2 2 4 0 -4 0 2 -4 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 4 -8 -4 8 0 0 2 -2 -2 2 8 -4 4 -8 -2 0 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 -2 0 -4 0 4 0 0 0 2 -2 -2 2 0 4 -4 0 -2 0 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 4 -8 4 -8 0 0 2 2 -2 -2 8 -4 -4 8 -2 0 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 -4 0 -4 0 0 0 2 2 -2 -2 0 4 4 0 -2 0 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 -2 -4 0 0 0 0 -4 4 -2 2 -2 -2 4 0 4 0 2 -4 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 2 4 0 0 0 0 -4 -4 -2 -2 -2 -6 -4 0 4 0 2 4 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 -2 -8 4 8 -4 -8 8 -8 2 -2 -2 -6 0 -4 -4 8 -2 8 2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 8 2 8 4 8 4 8 8 8 2 2 -2 -10 -16 -4 -12 -8 -2 -8 -2 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 -8 4 16 4 -8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 24 8 -24 -8 -16 8 16 8 -8 0 0 4 -16 20 4 -8 -8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 -4 0 4 8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 16 0 8 -8 0 0 -16 0 8 0 0 4 -8 -4 4 0 8 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 4 0 -4 0 8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 8 8 -8 8 0 -8 0 -8 8 0 0 4 -8 4 -4 8 0 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 -8 4 -16 4 -8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 8 -8 8 -8 16 -8 16 -8 -8 0 0 4 0 -12 4 8 -8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 0 0 0 -8 0 0 8 8 0 0 0 0 -8 0 0 4 0 -4 -4 0 0 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 8 4 -16 4 8 -8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 8 8 -8 16 8 -16 8 -8 0 0 4 0 -12 4 -8 8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 4 0 -4 0 -8 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -8 -8 -8 8 0 8 0 8 8 0 0 4 8 4 -4 -8 0 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -4 0 4 -8 0 -4 0 0 0 0 0 0 0 0 0 0 0 -8 -16 0 8 -8 0 0 16 0 8 0 0 4 8 -4 4 0 -8 0 -4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 8 4 16 4 8 8 4 0 0 0 0 0 0 0 0 0 0 0 -8 -24 -8 -24 -8 -16 -8 -16 -8 -8 0 0 4 16 20 4 8 8 0 4 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -16 8 16 -16 4 -8 32 0 0 -16 -32 0 0 32 0 -8 0 4 -16 16 8 -16 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 -8 0 0 8 -4 -8 16 0 0 0 0 0 0 -16 0 8 0 4 -8 0 0 8 0 -4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 8 -16 0 4 -8 0 0 0 -16 32 0 0 0 0 -8 0 4 0 -16 8 0 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 -8 0 0 4 -8 0 0 0 16 0 0 0 0 0 -8 0 4 0 0 -8 0 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 0 0 -8 -4 -8 -16 0 0 0 0 0 0 16 0 8 0 4 8 0 0 -8 0 -4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 16 8 16 16 4 -8 -32 0 0 -16 -32 0 0 -32 0 -8 0 4 16 16 8 16 0 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 -16 16 8 -8 -16 16 32 0 -32 -16 0 16 0 0 0 0 0 0 -8 24 -8 -16 8 0 24 -64 -8 16 24 32 -8 0 -16 0 0 0 -8 24 -16 -8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 -16 -16 8 8 -16 -16 32 0 32 -16 0 -16 0 0 0 0 0 0 -8 8 -8 16 -8 0 24 -32 8 -16 24 -32 8 0 16 0 0 0 -8 8 16 -8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 0 0 -8 8 -16 16 0 0 0 16 0 -16 0 0 0 0 0 0 -8 8 8 0 -8 0 24 -16 -8 0 -24 0 8 0 16 0 0 0 -8 8 0 8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 0 0 -8 -8 -16 -16 0 0 0 16 0 16 0 0 0 0 0 0 -8 -8 8 0 8 0 24 16 8 0 -24 0 -8 0 -16 0 0 0 -8 -8 0 8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 -8 16 -16 8 -8 -16 16 -32 0 32 -16 0 16 0 0 0 0 0 0 -8 -8 -8 16 8 0 24 32 -8 -16 24 -32 -8 0 -16 0 0 0 -8 -8 16 -8 8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 16 16 8 8 -16 -16 -32 0 -32 -16 0 -16 0 0 0 0 0 0 -8 -24 -8 -16 -8 0 24 64 8 16 24 32 8 0 16 0 0 0 -8 -24 -16 -8 -8 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 -24 24 -8 0 0 0 0 0 0 -24 48 24 -24 -48 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -48 -24 48 0 24 0 -24 0 0 0 0 -8 24 -24 0 0 8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 -8 -8 8 0 0 0 0 0 0 -24 16 8 8 16 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 -16 -8 -16 0 -8 0 24 0 0 0 0 -8 8 8 0 0 -8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 8 -8 -8 0 0 0 0 0 0 -24 -16 -8 8 16 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 16 8 -16 0 -8 0 -24 0 0 0 0 -8 -8 8 0 0 8 0 0 0 0
+0 0 0 0 0 0 0 0 0 8 24 24 8 0 0 0 0 0 0 -24 -48 -24 -24 -48 0 -24 0 0 0 0 0 0 0 0 0 0 0 0 0 24 48 24 48 0 24 0 24 0 0 0 0 -8 -24 -24 0 0 -8 0 0 0 0
+0 0 0 16 -32 16 0 0 0 0 0 0 0 -64 0 128 0 -64 0 64 0 -128 0 0 64 0 0 0 0 0 0 0 0 32 -64 32 0 0 0 -64 128 0 0 -64 0 0 0 0 0 0 0 16 -32 0 16 0 0 0 0 0 0
+0 0 0 16 0 -16 0 0 0 0 0 0 0 -64 0 0 0 64 0 64 0 0 0 0 -64 0 0 0 0 0 0 0 0 32 0 -32 0 0 0 -64 0 0 0 64 0 0 0 0 0 0 0 16 0 0 -16 0 0 0 0 0 0
+0 0 0 16 32 16 0 0 0 0 0 0 0 -64 0 -128 0 -64 0 64 0 128 0 0 64 0 0 0 0 0 0 0 0 32 64 32 0 0 0 -64 -128 0 0 -64 0 0 0 0 0 0 0 16 32 0 16 0 0 0 0 0 0
+0 0 0 0 0 0 16 -32 16 -32 64 -32 0 -32 32 32 -32 0 0 80 -96 -64 16 64 0 0 0 0 0 0 0 0 0 16 -32 0 16 0 0 -64 96 32 -32 0 -32 0 0 0 0 0 0 16 -32 16 0 0 0 0 0 0 0
+0 0 0 0 0 0 16 0 -16 -32 0 32 0 -32 0 0 32 0 0 80 0 0 -16 -64 0 0 0 0 0 0 0 0 0 16 0 0 -16 0 0 -64 0 0 32 0 32 0 0 0 0 0 0 16 0 -16 0 0 0 0 0 0 0
+0 0 0 0 0 0 16 32 16 -32 -64 -32 0 -32 -32 -32 -32 0 0 80 96 64 16 64 0 0 0 0 0 0 0 0 0 16 32 0 16 0 0 -64 -96 -32 -32 0 -32 0 0 0 0 0 0 16 32 16 0 0 0 0 0 0 0
+0 32 -32 -32 32 0 -128 128 0 128 -128 0 0 192 -64 -128 0 0 0 -256 128 128 0 0 0 0 0 0 0 0 0 0 0 -64 64 0 0 0 0 160 -128 -32 0 0 0 0 0 0 0 0 0 -32 32 0 0 0 0 0 0 0 0
+0 32 32 -32 -32 0 -128 -128 0 128 128 0 0 192 64 128 0 0 0 -256 -128 -128 0 0 0 0 0 0 0 0 0 0 0 -64 -64 0 0 0 0 160 128 32 0 0 0 0 0 0 0 0 0 -32 -32 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -4 6 -4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -2 0 2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 -2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 -2 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 6 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/mit90-86.ine b/demos/ppl_lcdd/examples/mit90-86.ine
new file mode 100644
index 0000000..5bee933
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mit90-86.ine
@@ -0,0 +1,93 @@
+begin
+90 86 rational
+1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 -12 0 12 0 0 0 0 -12 0 0 0 12 0 -12 12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 -4 4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1
+1 -4 6 0 -3 0 0 12 0 0 0 0 0 0 -4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 12 0 12 0 0 0 0 -12 0 0 0 -12 0 12 -12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 4 -4 -12 0 0 0 4 0 0 0 0 3 0 0 -6 0 4 0 -1
+1 -6 6 4 -1 4 0 4 -2 -8 0 4 0 -2 -4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 -2 4 0 0 8 4 0 0 0 -2 4 0 8 0 0 4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 4 -8 0 0 -4 -2 -2 0 4 -1 4 0 6 4 -4 -2 1
+1 -8 6 8 1 12 -4 -4 -4 -16 -4 0 -8 -4 -4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 -4 0 4 0 0 -4 -4 -8 -4 4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 4 16 8 4 4 4 4 4 0 -1 -8 -4 -6 -8 4 4 -1
+1 -10 6 12 3 24 -12 -12 -6 -24 -20 -12 -24 -6 -4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 -6 -12 -12 -12 -24 -12 -12 -24 -12 -6 -12 -24 -24 -12 -12 -12 -12 -12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 -4 -4 -12 -24 -24 -12 -4 -6 -6 -12 -12 3 12 12 6 12 -4 -6 1
+1 10 6 12 3 24 12 12 6 24 20 12 24 6 4 12 4 24 4 24 12 12 24 12 1 12 12 3 6 12 12 24 6 12 12 12 24 12 12 24 12 6 12 24 24 12 12 12 12 12 12 24 24 12 12 12 24 4 12 6 12 24 1 3 4 12 12 4 4 12 24 24 12 4 6 6 12 12 3 12 12 6 12 4 6 1
+1 8 6 8 1 12 4 4 4 16 4 0 8 4 4 4 0 8 0 8 4 -4 0 0 1 8 8 -1 2 4 0 0 4 0 -4 0 0 4 4 8 4 -4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 -8 -8 -1 1 0 4 -8 0 0 -4 -16 -8 -4 -4 -4 -4 -4 0 -1 -8 -4 -6 -8 -4 -4 -1
+1 8 0 6 3 18 6 6 0 0 14 12 12 0 -2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 -6 0 6 0 0 -6 -6 -12 -6 6 6 12 0 6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 -4 -4 -6 0 -12 -6 2 0 0 -6 -12 -3 -6 -12 0 -6 -2 -6 -1
+1 6 0 2 1 10 -2 2 2 0 6 0 4 -2 -2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 -4 -4 -6 -4 0 -2 -6 -4 2 -4 -2 -4 0 2 -4 4 4 4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 2 0 4 6 -2 -2 2 -2 0 1 2 4 0 6 2 4 1
+1 6 6 4 -1 4 0 -4 2 8 0 -4 0 2 4 0 0 0 0 0 -4 0 -8 0 1 4 4 -1 -2 0 0 -8 2 -4 0 0 -8 -4 0 0 0 2 -4 0 -8 0 0 -4 0 0 -4 0 -8 0 0 0 -8 0 0 -2 4 0 1 -1 0 0 4 0 0 -4 8 0 0 4 2 2 0 -4 -1 4 0 6 4 4 2 1
+1 6 0 6 1 6 6 2 -2 0 -2 0 4 2 -2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 -4 4 2 4 0 -2 2 -4 -6 -4 -2 -4 0 -6 4 -4 -4 -4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 2 0 4 -2 -2 2 -2 6 0 1 6 4 0 2 2 4 1
+1 6 6 4 3 0 -4 12 2 8 -12 4 -8 2 4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 2 4 -4 -12 8 12 -4 -8 -4 2 12 -8 8 -4 -12 4 -12 -12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 -4 -4 12 8 -8 -4 4 2 2 -4 4 3 4 -4 6 4 4 2 1
+1 6 -2 0 3 12 0 0 -2 -8 8 12 0 -2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 6 -4 0 -4 -8 0 0 0 0 6 0 0 -8 0 -4 -4 -4 -4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 4 4 0 -8 0 0 0 -2 -2 0 12 3 0 12 -2 0 0 6 1
+1 4 -2 -4 1 8 -8 0 -4 0 8 0 0 -4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 4 0 -8 0 -16 0 8 0 -8 -4 0 0 16 8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 -8 0 4 4 8 0 -1 4 -4 2 -4 0 -4 -1
+1 4 0 -2 -1 6 -6 -2 4 0 2 -4 4 -4 -2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 -2 0 2 -4 0 2 -2 -4 6 2 -2 4 0 -6 4 0 4 -4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 2 0 -4 -2 2 4 -4 6 4 1 2 0 0 -6 -2 -2 -1
+1 4 0 2 -1 2 2 -2 0 0 2 -4 -4 0 -2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 -2 0 2 4 0 2 -2 4 -2 2 -2 -4 0 2 -4 0 -4 4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 2 0 4 -2 2 0 0 -2 4 1 -2 0 0 -2 -2 -2 -1
+1 4 -2 0 1 4 0 0 0 -8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 4 0 0 0 8 0 0 0 0 -4 0 0 -8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 -4 -1
+1 4 0 2 3 -2 -2 6 0 0 -10 4 -4 0 -2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 -2 0 -2 0 0 -6 2 4 2 2 6 -4 0 -2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 4 4 -6 0 4 2 2 0 0 2 -4 -3 -2 4 0 -2 -2 -2 -1
+1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 4 0 -4 0 -12 0 0 -12 1 0 0 3 -6 0 12 0 0 0 0 -12 0 -12 0 0 0 0 12 0 0 0 12 0 -12 12 12 0 0 0 -12 0 0 -4 12 6 0 0 -1 -3 4 0 0 -4 4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1
+1 4 6 0 -3 0 0 -12 0 0 0 0 0 0 4 0 -4 0 4 0 -12 0 0 12 1 0 0 3 -6 0 -12 0 0 0 0 12 0 -12 0 0 0 0 12 0 0 0 -12 0 12 -12 12 0 0 0 12 0 0 4 -12 6 0 0 -1 -3 -4 0 0 4 -4 12 0 0 0 -4 0 0 0 0 3 0 0 -6 0 -4 0 -1
+1 4 6 0 1 -4 -4 4 0 0 -4 0 -8 0 4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 4 0 0 4 -4 -8 -4 0 -4 8 0 4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 -4 0 8 4 -4 0 0 4 0 -1 0 4 -6 0 -4 0 -1
+1 4 0 6 -1 -2 2 -2 -4 0 -6 -4 4 4 -2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 -2 0 -6 -4 0 2 6 -4 -2 2 -2 4 0 2 4 0 4 -4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 2 0 -4 6 2 -4 4 -2 4 1 -6 0 0 2 -2 -2 -1
+1 4 -2 4 1 0 8 0 -4 0 -8 0 0 -4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 4 0 8 0 -16 0 -8 0 8 -4 0 0 16 -8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 8 0 4 4 -8 0 -1 -4 -4 2 4 0 -4 -1
+1 4 0 -6 3 6 -6 -6 0 0 2 12 -12 0 2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 -6 0 -6 0 0 6 6 12 6 6 -6 -12 0 -6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 -4 -4 6 0 12 6 -2 0 0 6 -12 -3 6 -12 0 6 2 -6 -1
+1 2 -2 -4 -1 4 -4 0 -2 0 4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 2 4 4 0 0 0 4 0 -4 2 0 0 0 -4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 4 0 -2 -2 -4 -4 -1 -4 0 -2 4 0 2 1
+1 2 0 -6 1 2 -6 -2 -2 0 2 0 -4 2 2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 -4 4 -2 4 0 2 -2 4 6 -4 2 4 0 6 4 -4 -4 -4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 -2 0 -4 2 2 2 -2 -6 0 1 -6 4 0 -2 -2 4 1
+1 2 -2 0 3 -4 0 0 -6 8 -8 4 0 -6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 2 -12 0 4 8 0 0 0 0 2 0 0 8 0 4 -12 4 4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 -4 -4 0 8 0 0 0 -6 -6 0 4 3 0 -4 -2 0 0 2 1
+1 2 0 -2 -3 2 2 -6 2 0 2 0 -4 -2 -2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 -4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 4 -4 -6 0 -4 2 -2 -2 2 2 0 -3 -2 0 0 2 2 0 1
+1 2 0 -6 -3 6 -6 -6 6 0 -6 0 12 -6 -2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 -12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 -4 4 -6 0 12 -6 -2 -6 6 -6 0 -3 -6 0 0 6 2 0 1
+1 2 0 -2 1 -2 -2 2 2 0 -2 0 -4 -2 -2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 -4 2 4 0 -2 2 4 2 0 -2 4 0 2 4 4 -4 -4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 2 0 -4 -2 -2 -2 2 -2 0 1 -2 -4 0 2 2 0 1
+1 2 -2 0 -1 0 -4 0 2 -8 -4 -4 8 2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 2 -4 -4 0 8 0 -4 8 -4 2 0 8 8 -4 0 -4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 -8 8 -4 0 2 2 -4 -4 -1 0 0 -2 0 0 2 1
+1 2 0 2 -3 -2 2 -6 -2 0 2 0 -4 2 -2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 -4 -2 0 0 6 -2 4 -2 0 6 4 0 -2 0 4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 -4 4 -6 0 -4 2 -2 2 -2 2 0 -3 2 0 0 -2 2 0 1
+1 2 -2 0 -1 0 4 0 2 -8 4 -4 -8 2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 2 -4 4 0 8 0 4 -8 4 2 0 -8 8 4 0 -4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 -8 -8 4 0 2 2 4 -4 -1 0 0 -2 0 0 2 1
+1 2 0 2 1 -6 -2 2 -2 0 -2 0 -4 2 -2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 4 2 -4 0 -2 2 4 2 0 -2 4 0 2 -4 -4 4 4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 2 0 -4 -2 -2 2 -2 -2 0 1 2 -4 0 -2 2 0 1
+1 2 -2 4 -1 -4 4 0 -2 0 -4 -4 0 -2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 2 4 -4 0 0 0 -4 0 4 2 0 0 0 4 0 4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 -4 0 -2 -2 4 -4 -1 4 0 -2 -4 0 2 1
+1 2 -2 0 3 -4 0 0 2 -8 -8 4 0 2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 2 4 0 4 -8 0 0 0 0 2 0 0 -8 0 4 4 4 4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 -4 -4 0 -8 0 0 0 2 2 0 4 3 0 -4 -2 0 0 2 1
+1 2 0 -2 1 -2 2 -2 2 0 -6 0 -4 -2 2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 -4 -4 6 -4 0 2 6 4 -2 -4 2 4 0 -2 -4 4 4 4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 -2 0 -4 -6 2 -2 2 2 0 1 -2 4 0 -6 -2 4 1
+1 2 6 -4 -1 -4 0 -4 -2 -8 0 4 0 -2 4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 -2 4 0 0 8 -4 0 0 0 -2 -4 0 8 0 0 4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 -4 -8 0 0 4 -2 -2 0 4 -1 -4 0 6 -4 4 -2 1
+1 2 0 6 -3 -6 -6 -6 -6 0 -6 0 12 6 -2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 -12 6 0 0 6 6 -12 6 0 6 -12 0 6 0 12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 4 -4 -6 0 12 -6 -2 6 -6 -6 0 -3 6 0 0 -6 2 0 1
+1 2 6 -4 3 -8 -4 12 -2 -8 4 -4 -8 -2 4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 -2 -4 -4 12 -8 12 -4 -8 -4 -2 12 -8 -8 -4 12 -4 12 12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 4 4 12 -8 -8 -4 4 -2 -2 -4 -4 3 -4 -4 6 -4 4 -2 1
+1 2 6 -12 3 0 -12 -12 6 24 -4 12 -24 6 -4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 6 12 -12 12 24 -12 -12 -24 -12 6 -12 -24 24 -12 12 12 12 12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 4 4 -12 24 -24 -12 -4 6 6 -12 12 3 -12 12 6 -12 -4 6 1
+1 0 -2 -4 -3 4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 -4 4 0 0 4 -8 4 0 0 8 0 -4 -4 0 4 -4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 -4 4 0 0 8 -4 0 0 0 -4 0 3 4 0 2 -4 0 0 -1
+1 0 -2 -4 -3 4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 -8 0 1 4 -4 3 2 0 0 8 0 0 4 -4 0 0 -4 8 -4 0 0 -8 0 4 4 0 -4 4 -4 0 -8 0 0 0 8 0 0 -2 4 0 -1 -3 0 0 -4 4 -4 0 0 -8 4 0 0 0 4 0 3 4 0 2 -4 0 0 -1
+1 0 -2 -4 1 0 0 0 0 0 0 0 0 0 0 -4 -4 8 4 8 4 4 8 -4 1 4 -4 -1 -6 -4 4 -8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 8 4 -4 4 -8 4 4 6 4 -8 -1 1 -4 -4 -4 0 0 0 0 0 0 0 0 0 0 0 -1 4 4 2 -4 0 0 -1
+1 0 0 -6 -1 2 -2 2 -4 0 6 -4 -4 4 2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 -2 0 6 -4 0 -2 -6 4 2 2 2 -4 0 -2 4 0 4 -4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 -2 0 4 -6 -2 -4 4 2 4 1 6 0 0 -2 2 -2 -1
+1 0 -2 0 1 -4 0 0 -4 8 0 0 0 -4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 8 0 0 0 0 0 0 0 -8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 -8 0 0 0 4 4 0 0 -1 0 4 2 0 0 0 -1
+1 0 0 -2 -1 -2 -2 2 0 0 -2 -4 4 0 2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 -2 0 -2 4 0 -2 2 -4 2 2 2 4 0 -2 -4 0 -4 4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 -2 0 -4 2 -2 0 0 2 4 1 2 0 0 2 2 -2 -1
+1 0 0 -2 3 -6 2 -6 0 0 -6 4 4 0 2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 -2 0 2 0 0 6 -2 -4 -2 2 -6 4 0 2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 4 4 6 0 -4 -2 -2 0 0 -2 -4 -3 2 4 0 2 2 -2 -1
+1 0 6 -8 1 -4 -4 -4 4 16 -4 0 -8 4 -4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 4 0 4 0 0 -4 -4 -8 -4 -4 4 8 0 4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 4 -16 8 4 4 -4 -4 4 0 -1 8 -4 -6 8 4 -4 -1
+1 0 0 -6 -1 2 2 -2 4 0 -6 4 4 -4 -2 -4 2 -8 2 8 0 0 4 -2 -1 -2 6 -1 0 4 -2 4 2 0 -6 4 0 2 6 -4 -2 -2 -2 4 0 2 -4 0 -4 4 0 -8 -4 -4 2 4 -4 -2 2 0 -6 8 1 1 -2 0 2 0 0 2 0 -4 6 2 4 -4 -2 -4 1 6 0 0 -2 -2 2 -1
+1 0 0 -2 -1 -2 2 -2 0 0 2 4 -4 0 -2 4 -2 0 -2 0 0 0 4 2 -1 2 2 -1 0 -4 2 4 2 0 2 -4 0 2 -2 4 -2 -2 -2 -4 0 2 4 0 4 -4 0 0 -4 4 -2 -4 -4 2 -2 0 -2 0 1 1 2 0 -2 0 0 2 0 4 -2 2 0 0 -2 -4 1 2 0 0 2 -2 2 -1
+1 0 -2 4 -3 -4 -4 0 0 0 -4 0 8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 4 4 0 0 -4 8 -4 0 0 -8 0 4 -4 0 4 -4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 -4 4 0 0 -8 4 0 0 0 4 0 3 -4 0 2 4 0 0 -1
+1 0 0 -2 3 -6 -2 6 0 0 6 -4 -4 0 -2 0 2 0 2 0 0 -4 -4 6 -1 2 2 3 0 0 6 -4 2 0 -2 0 0 -6 2 4 2 -2 6 -4 0 -2 0 0 0 0 0 0 4 0 -6 0 4 -2 -6 0 -2 0 1 -3 -2 4 -2 -4 -4 -6 0 4 2 2 0 0 2 4 -3 2 4 0 2 -2 2 -1
+1 0 -2 0 1 -4 0 0 4 -8 0 0 0 4 0 4 0 0 0 0 -4 4 0 0 1 0 0 -1 2 4 0 0 0 0 0 0 -8 0 0 0 0 0 0 0 8 0 0 0 0 0 4 0 0 -4 0 -4 0 0 0 -2 0 0 -1 1 0 -4 0 0 0 0 8 0 0 0 -4 -4 0 0 -1 0 4 2 0 0 0 -1
+1 0 -2 4 -3 -4 4 0 0 0 4 0 -8 0 0 0 0 0 0 0 4 0 8 0 1 -4 4 3 2 0 0 -8 0 0 -4 -4 0 0 4 -8 4 0 0 8 0 -4 4 0 -4 4 -4 0 8 0 0 0 -8 0 0 -2 -4 0 -1 -3 0 0 4 4 -4 0 0 8 -4 0 0 0 -4 0 3 -4 0 2 4 0 0 -1
+1 0 0 2 -1 -6 -6 -2 -4 0 2 4 4 4 -2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 2 0 2 4 0 2 -2 -4 6 -2 -2 4 0 -6 -4 0 -4 4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 2 0 -4 -2 2 -4 4 6 -4 1 -2 0 0 6 -2 2 -1
+1 0 0 2 -1 -6 6 2 4 0 -2 -4 -4 -4 2 -4 2 8 2 -8 0 0 4 -2 -1 6 -2 -1 0 4 -2 4 -2 0 -2 -4 0 -2 2 4 -6 2 2 -4 0 6 4 0 4 -4 0 8 -4 -4 2 4 -4 -2 2 0 2 -8 1 1 -2 0 -6 0 0 -2 0 4 2 -2 4 -4 -6 4 1 -2 0 0 6 2 -2 -1
+1 0 -2 4 1 -8 0 0 0 0 0 0 0 0 0 -4 4 8 -4 8 4 4 -8 4 1 -4 4 -1 -6 -4 -4 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4 -8 -8 4 4 4 8 -4 -4 6 -4 -8 -1 1 4 -4 4 0 0 0 0 0 0 0 0 0 0 0 -1 -4 4 2 4 0 0 -1
+1 0 6 -8 1 -4 4 4 -4 -16 4 0 8 -4 4 4 0 8 0 8 4 -4 0 0 1 -8 -8 -1 2 4 0 0 -4 0 -4 0 0 4 4 8 4 4 -4 -8 0 -4 0 0 0 0 -4 -8 0 -4 0 -4 0 0 0 -2 8 -8 -1 1 0 4 8 0 0 -4 16 -8 -4 -4 4 4 -4 0 -1 8 -4 -6 8 -4 4 -1
+1 -2 -2 -4 -1 4 4 0 2 0 -4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 4 -4 -1 -2 0 0 0 -2 -4 -4 0 0 0 -4 0 4 -2 0 0 0 4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 -4 0 1 -1 0 0 4 0 0 0 0 0 -4 0 2 2 4 4 -1 -4 0 -2 4 0 -2 1
+1 -2 0 -6 -3 6 6 6 -6 0 6 0 -12 6 2 -12 -2 0 2 0 0 0 -12 6 -1 -6 6 3 0 12 -6 12 0 -12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 12 0 0 0 0 12 12 -6 -12 -12 -2 6 0 6 0 -1 3 2 0 -6 4 -4 6 0 -12 6 2 6 -6 6 0 -3 -6 0 0 6 -2 0 1
+1 -2 -2 0 -1 0 4 0 -2 8 4 4 -8 -2 0 0 -4 0 -4 0 -4 0 0 4 1 0 0 -1 6 0 4 0 -2 4 4 0 -8 0 4 -8 4 -2 0 -8 -8 4 0 4 0 0 -4 0 0 0 4 0 0 -4 4 6 0 0 1 -1 -4 0 0 0 0 0 8 -8 4 0 -2 -2 4 4 -1 0 0 -2 0 0 -2 1
+1 -2 0 2 -3 -2 -2 6 2 0 -2 0 4 -2 2 4 -2 0 2 0 0 0 4 6 -1 2 -2 3 0 -4 -6 -4 0 4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 -4 0 0 0 0 -4 -4 -6 4 4 -2 6 0 -2 0 -1 3 2 0 2 4 -4 6 0 4 -2 2 -2 2 -2 0 -3 2 0 0 -2 -2 0 1
+1 -2 0 -2 -3 2 -2 6 -2 0 -2 0 4 2 2 4 2 0 -2 0 0 0 -4 -6 -1 -2 2 3 0 -4 6 4 0 -4 2 0 0 -6 2 -4 2 0 -6 -4 0 2 0 4 0 0 0 0 4 -4 6 4 -4 2 -6 0 2 0 -1 3 -2 0 -2 -4 4 6 0 4 -2 2 2 -2 -2 0 -3 -2 0 0 2 -2 0 1
+1 -2 -2 0 -1 0 -4 0 -2 8 -4 4 8 -2 0 0 4 0 4 0 -4 0 0 -4 1 0 0 -1 6 0 -4 0 -2 4 -4 0 -8 0 -4 8 -4 -2 0 8 -8 -4 0 4 0 0 -4 0 0 0 -4 0 0 4 -4 6 0 0 1 -1 4 0 0 0 0 0 8 8 -4 0 -2 -2 -4 4 -1 0 0 -2 0 0 -2 1
+1 -2 0 -2 1 -2 2 -2 -2 0 2 0 4 2 2 0 -2 0 2 0 0 4 4 -2 -1 -2 2 -1 0 0 2 -4 0 4 -2 -4 0 2 -2 -4 -2 0 2 -4 0 -2 -4 -4 4 4 0 0 -4 0 2 0 4 -2 -2 0 2 0 -1 -1 2 4 -2 0 0 -2 0 4 2 2 2 -2 2 0 1 -2 -4 0 2 -2 0 1
+1 -2 -2 0 3 -4 0 0 -2 8 8 -4 0 -2 0 -4 0 8 0 8 -4 -4 0 0 1 0 0 3 -2 -4 0 0 -2 -4 0 -4 8 0 0 0 0 -2 0 0 8 0 -4 -4 -4 -4 -4 8 0 -4 0 -4 0 0 0 -2 0 8 1 3 0 -4 0 4 4 0 8 0 0 0 -2 -2 0 -4 3 0 -4 -2 0 0 -2 1
+1 -2 6 -4 -1 -4 0 4 2 8 0 -4 0 2 -4 0 0 0 0 0 -4 0 8 0 1 -4 -4 -1 -2 0 0 8 2 -4 0 0 -8 4 0 0 0 2 4 0 -8 0 0 -4 0 0 -4 0 8 0 0 0 8 0 0 -2 -4 0 1 -1 0 0 -4 0 0 4 8 0 0 -4 2 2 0 -4 -1 -4 0 6 -4 -4 2 1
+1 -2 0 2 1 -6 2 -2 2 0 2 0 4 -2 2 0 2 0 -2 0 0 4 -4 2 -1 2 -2 -1 0 0 -2 4 0 -4 -2 4 0 2 -2 -4 -2 0 2 -4 0 -2 4 4 -4 -4 0 0 4 0 -2 0 -4 2 2 0 -2 0 -1 -1 -2 4 2 0 0 -2 0 4 2 2 -2 2 2 0 1 2 -4 0 -2 -2 0 1
+1 -2 6 -4 3 -8 4 -12 2 8 -4 4 8 2 -4 -4 4 -8 4 -8 12 -4 -8 12 1 -4 -4 3 6 -4 12 -8 2 4 4 -12 8 -12 4 8 4 2 -12 8 8 4 -12 4 -12 -12 12 -8 -8 -4 12 -4 -8 4 12 6 -4 -8 1 3 4 -4 -4 -4 -4 -12 8 8 4 -4 2 2 4 4 3 -4 -4 6 -4 -4 2 1
+1 -2 0 -6 1 2 6 2 2 0 -2 0 4 -2 -2 0 2 -8 -2 8 0 -4 4 2 -1 2 6 -1 0 0 -2 -4 4 -4 2 -4 0 -2 2 -4 -6 4 -2 -4 0 -6 -4 4 4 4 0 8 -4 0 -2 0 4 2 2 0 6 -8 -1 -1 -2 -4 2 0 0 2 0 4 -2 -2 -2 2 6 0 1 -6 4 0 -2 2 -4 1
+1 -2 0 -2 1 -2 -2 2 -2 0 6 0 4 2 -2 0 -2 8 2 -8 0 -4 -4 -2 -1 6 2 -1 0 0 2 4 4 4 -6 4 0 -2 -6 -4 2 4 -2 -4 0 2 4 -4 -4 -4 0 -8 4 0 2 0 -4 -2 -2 0 2 8 -1 -1 2 -4 6 0 0 2 0 4 6 -2 2 -2 -2 0 1 -2 4 0 -6 2 -4 1
+1 -2 -2 4 -1 -4 -4 0 2 0 4 4 0 2 0 0 0 0 0 0 4 0 0 0 1 -4 4 -1 -2 0 0 0 -2 -4 4 0 0 0 4 0 -4 -2 0 0 0 -4 0 -4 0 0 4 0 0 0 0 0 0 0 0 -2 4 0 1 -1 0 0 -4 0 0 0 0 0 4 0 2 2 -4 4 -1 4 0 -2 -4 0 -2 1
+1 -2 -2 0 3 -4 0 0 6 -8 8 -4 0 6 0 12 0 -8 0 -8 -4 -4 0 0 1 0 0 3 -2 12 0 0 -2 12 0 -4 -8 0 0 0 0 -2 0 0 -8 0 -4 12 -4 -4 -4 -8 0 12 0 12 0 0 0 -2 0 -8 1 3 0 -4 0 4 4 0 -8 0 0 0 6 6 0 -4 3 0 -4 -2 0 0 -2 1
+1 -2 0 6 -3 -6 6 6 6 0 6 0 -12 -6 2 -12 2 0 -2 0 0 0 12 -6 -1 6 -6 3 0 12 6 -12 0 12 -6 0 0 -6 -6 12 -6 0 -6 12 0 -6 0 -12 0 0 0 0 -12 12 6 -12 12 2 -6 0 -6 0 -1 3 -2 0 6 -4 4 6 0 -12 6 2 -6 6 6 0 -3 6 0 0 -6 -2 0 1
+1 -2 6 -12 3 0 12 12 -6 -24 4 -12 24 -6 4 12 -4 24 -4 24 12 12 -24 -12 1 -12 -12 3 6 12 -12 -24 -6 -12 12 -12 -24 12 12 24 12 -6 12 24 -24 12 -12 -12 -12 -12 12 24 -24 12 -12 12 -24 -4 -12 6 -12 24 1 3 -4 12 -12 -4 -4 12 -24 24 12 4 -6 -6 12 -12 3 -12 12 6 -12 4 -6 1
+1 -4 -2 -4 1 8 8 0 4 0 -8 0 0 4 0 4 4 -8 -4 -8 4 -4 8 4 1 4 -4 -1 -6 4 -4 -8 -4 0 8 0 16 0 -8 0 8 4 0 0 -16 -8 0 0 0 0 -4 8 8 -4 4 -4 -8 -4 -4 6 4 8 -1 1 4 4 -4 0 0 0 0 0 8 0 -4 -4 -8 0 -1 4 -4 2 -4 0 4 -1
+1 -4 0 -2 -1 6 6 2 -4 0 -2 4 -4 4 2 -4 -2 8 -2 -8 0 0 -4 2 -1 -6 2 -1 0 4 2 -4 2 0 -2 4 0 -2 2 4 -6 -2 2 -4 0 6 -4 0 -4 4 0 8 4 -4 -2 4 4 2 -2 0 -2 -8 1 1 2 0 6 0 0 -2 0 4 2 -2 -4 4 -6 -4 1 2 0 0 -6 2 2 -1
+1 -4 -2 0 1 4 0 0 0 8 0 0 0 0 0 -4 0 0 0 0 -4 -4 0 0 1 0 0 -1 2 -4 0 0 -4 0 0 0 -8 0 0 0 0 4 0 0 8 0 0 0 0 0 4 0 0 4 0 4 0 0 0 -2 0 0 -1 1 0 4 0 0 0 0 -8 0 0 0 0 0 0 0 -1 0 -4 2 0 0 4 -1
+1 -4 0 2 -1 2 -2 2 0 0 -2 4 4 0 2 4 2 0 2 0 0 0 -4 -2 -1 -2 -2 -1 0 -4 -2 -4 2 0 -2 -4 0 -2 2 -4 2 -2 2 4 0 -2 4 0 4 -4 0 0 4 4 2 -4 4 -2 2 0 2 0 1 1 -2 0 2 0 0 -2 0 -4 2 -2 0 0 2 -4 1 -2 0 0 -2 2 2 -1
+1 -4 0 6 -1 -2 -2 2 4 0 6 4 -4 -4 2 -4 -2 -8 -2 8 0 0 -4 2 -1 2 -6 -1 0 4 2 -4 2 0 6 4 0 -2 -6 4 2 -2 2 -4 0 -2 -4 0 -4 4 0 -8 4 -4 -2 4 4 2 -2 0 6 8 1 1 2 0 -2 0 0 -2 0 4 -6 -2 4 -4 2 -4 1 -6 0 0 2 2 2 -1
+1 -4 0 2 3 -2 2 -6 0 0 10 -4 4 0 2 0 -2 0 -2 0 0 -4 4 -6 -1 -2 -2 3 0 0 -6 4 2 0 2 0 0 6 -2 -4 -2 -2 -6 4 0 2 0 0 0 0 0 0 -4 0 6 0 -4 2 6 0 2 0 1 -3 2 4 2 -4 -4 6 0 -4 -2 -2 0 0 -2 4 -3 -2 4 0 -2 2 2 -1
+1 -4 6 0 1 -4 4 -4 0 0 4 0 8 0 -4 -4 0 -8 0 -8 4 4 0 0 1 0 0 -1 2 -4 0 0 0 0 -4 0 0 -4 4 8 4 0 4 -8 0 -4 0 0 0 0 -4 8 0 4 0 4 0 0 0 -2 0 8 -1 1 0 -4 0 0 0 4 0 -8 -4 4 0 0 -4 0 -1 0 4 -6 0 4 0 -1
+1 -4 0 -6 3 6 6 6 0 0 -2 -12 12 0 -2 0 -2 0 -2 0 0 12 -12 -6 -1 6 6 3 0 0 -6 -12 6 0 6 0 0 -6 -6 -12 -6 -6 6 12 0 6 0 0 0 0 0 0 12 0 6 0 12 2 6 0 -6 0 1 -3 2 -12 -6 4 4 -6 0 -12 -6 2 0 0 -6 12 -3 6 -12 0 6 -2 6 -1
+1 -4 -2 4 1 0 -8 0 4 0 8 0 0 4 0 4 -4 -8 4 -8 4 -4 -8 -4 1 -4 4 -1 -6 4 4 8 -4 0 -8 0 16 0 8 0 -8 4 0 0 -16 8 0 0 0 0 -4 8 -8 -4 -4 -4 8 4 4 6 -4 8 -1 1 -4 4 4 0 0 0 0 0 -8 0 -4 -4 8 0 -1 -4 -4 2 4 0 4 -1
+1 -6 0 2 1 10 2 -2 -2 0 -6 0 -4 2 2 0 2 8 -2 -8 0 -4 4 2 -1 -6 -2 -1 0 0 -2 -4 4 4 6 4 0 2 6 4 -2 4 2 4 0 -2 4 -4 -4 -4 0 -8 -4 0 -2 0 4 2 2 0 -2 8 -1 -1 -2 -4 -6 0 0 -2 0 -4 -6 2 2 -2 2 0 1 2 4 0 6 -2 -4 1
+1 -6 -2 0 3 12 0 0 2 8 -8 -12 0 2 0 -4 0 -8 0 -8 -4 12 0 0 1 0 0 3 -2 -4 0 0 -6 4 0 4 8 0 0 0 0 -6 0 0 8 0 4 4 4 4 -4 -8 0 -4 0 -4 0 0 0 -2 0 -8 1 3 0 12 0 -4 -4 0 8 0 0 0 2 2 0 -12 3 0 12 -2 0 0 -6 1
+1 -6 0 6 1 6 -6 -2 2 0 2 0 -4 -2 2 0 -2 -8 2 8 0 -4 -4 -2 -1 -2 -6 -1 0 0 2 4 4 -4 -2 -4 0 2 -2 4 6 4 2 4 0 6 -4 4 4 4 0 8 4 0 2 0 -4 -2 -2 0 -6 -8 -1 -1 2 -4 -2 0 0 -2 0 -4 2 2 -2 2 -6 0 1 6 4 0 2 -2 -4 1
+1 -6 6 4 3 0 4 -12 -2 -8 12 -4 8 -2 -4 -4 -4 -8 -4 -8 12 -4 8 -12 1 4 4 3 6 -4 -12 8 -2 -4 4 12 -8 -12 4 8 4 -2 -12 8 -8 4 12 -4 12 12 12 -8 8 -4 -12 -4 8 -4 -12 6 4 -8 1 3 -4 -4 4 4 4 -12 -8 8 4 -4 -2 -2 4 -4 3 4 -4 6 4 -4 -2 1
+1 -8 0 6 3 18 -6 -6 0 0 -14 -12 -12 0 2 0 2 0 2 0 0 12 12 6 -1 -6 -6 3 0 0 6 12 6 0 -6 0 0 6 6 12 6 -6 -6 -12 0 -6 0 0 0 0 0 0 -12 0 -6 0 -12 -2 -6 0 6 0 1 -3 -2 -12 6 4 4 6 0 12 6 -2 0 0 6 12 -3 -6 -12 0 -6 2 6 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp5.ext b/demos/ppl_lcdd/examples/mp5.ext
new file mode 100644
index 0000000..dff1bf7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5.ext
@@ -0,0 +1,36 @@
+V-representation
+begin
+32 11 rational
+ 1  1  1  1  1  0  0  0  0  0  0
+ 1  0  0  1  1  0  1  1  1  1  0
+ 1  2/3  2/3  2/3  2/3  2/3  2/3  2/3  2/3  2/3  2/3
+ 1  1  0  1  1  1  0  0  1  1  0
+ 1  0  1  1  1  1  1  1  0  0  0
+ 1  2/3  2/3  1/3  1/3  2/3  1/3  1/3  1/3  1/3  2/3
+ 1  0  1  0  1  1  0  1  1  0  1
+ 1  1  1  0  1  0  1  0  1  0  1
+ 1  1/3  2/3  2/3  2/3  1/3  1/3  1/3  2/3  2/3  2/3
+ 1  0  1  1  0  1  1  0  0  1  1
+ 1  1  1  1  0  0  0  1  0  1  1
+ 1  1/3  1/3  2/3  2/3  2/3  1/3  1/3  1/3  1/3  2/3
+ 1  0  0  0  1  0  0  1  0  1  1
+ 1  1  0  0  1  1  1  0  0  1  1
+ 1  2/3  1/3  2/3  2/3  1/3  2/3  2/3  1/3  1/3  2/3
+ 1  1/3  2/3  1/3  1/3  1/3  2/3  2/3  1/3  1/3  2/3
+ 1  2/3  1/3  1/3  1/3  1/3  1/3  1/3  2/3  2/3  2/3
+ 1  0  0  1  0  0  1  0  1  0  1
+ 1  2/3  2/3  2/3  1/3  2/3  2/3  1/3  2/3  1/3  1/3
+ 1  1  0  1  0  1  0  1  1  0  1
+ 1  2/3  1/3  1/3  2/3  1/3  1/3  2/3  2/3  1/3  1/3
+ 1  1/3  1/3  1/3  2/3  2/3  2/3  1/3  2/3  1/3  1/3
+ 1  1/3  1/3  1/3  1/3  2/3  2/3  2/3  2/3  2/3  2/3
+ 1  0  1  0  0  1  0  0  1  1  0
+ 1  2/3  1/3  2/3  1/3  1/3  2/3  1/3  1/3  2/3  1/3
+ 1  1/3  2/3  1/3  2/3  1/3  2/3  1/3  1/3  2/3  1/3
+ 1  1/3  1/3  2/3  1/3  2/3  1/3  2/3  1/3  2/3  1/3
+ 1  1  1  0  0  0  1  1  1  1  0
+ 1  1/3  2/3  2/3  1/3  1/3  1/3  2/3  2/3  1/3  1/3
+ 1  1  0  0  0  1  1  1  0  0  0
+ 1  2/3  2/3  1/3  2/3  2/3  1/3  2/3  1/3  2/3  1/3
+ 1  0  0  0  0  0  0  0  0  0  0
+end
diff --git a/demos/ppl_lcdd/examples/mp5.ine b/demos/ppl_lcdd/examples/mp5.ine
new file mode 100644
index 0000000..b901024
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5.ine
@@ -0,0 +1,45 @@
+* metric polytope on 5 points
+H-representation
+begin
+40 11 integer
+2 -1 -1 0 0 -1 0 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 1 -1 0 0 0 0 1 0 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 -1 1 0 0 0 0 0 1
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 -1 1 0 1 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 -1 0 1 0 1 0
+0 0 0 0 0 1 0 -1 0 1 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 1 1 0 0 -1
+2 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 0 0 0 1 1 -1
+0 -1 1 0 0 1 0 0 0 0 0
+0 1 -1 0 0 1 0 0 0 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+0 1 0 -1 0 0 1 0 0 0 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp5a.ine b/demos/ppl_lcdd/examples/mp5a.ine
new file mode 100644
index 0000000..6e18548
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp5a.ine
@@ -0,0 +1,44 @@
+* metric polytope on 5 points
+begin
+40 11 integer
+2 -1 -1 0 0 -1 0 0 0 0 0
+0 1 1 0 0 -1 0 0 0 0 0
+0 -1 0 1 0 0 1 0 0 0 0
+0 1 0 1 0 0 -1 0 0 0 0
+0 -1 0 0 1 0 0 1 0 0 0
+0 1 0 0 1 0 0 -1 0 0 0
+0 0 -1 1 0 0 0 0 1 0 0
+0 0 1 -1 0 0 0 0 1 0 0
+0 0 1 1 0 0 0 0 -1 0 0
+0 0 -1 0 1 0 0 0 0 1 0
+0 0 1 0 -1 0 0 0 0 1 0
+0 0 1 0 1 0 0 0 0 -1 0
+0 0 0 1 1 0 0 0 0 0 -1
+0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 -1 1 0 0 0 0 0 1
+2 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 -1 1 0 1 0 0
+0 0 0 0 0 1 -1 0 1 0 0
+2 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 -1 0 1 0 1 0
+0 0 0 0 0 1 0 -1 0 1 0
+2 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 -1 1 0 0 1
+0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 1 1 0 0 -1
+2 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 -1 1 1
+0 0 0 0 0 0 0 0 1 1 -1
+0 -1 1 0 0 1 0 0 0 0 0
+0 1 -1 0 0 1 0 0 0 0 0
+2 -1 0 -1 0 0 -1 0 0 0 0
+0 1 0 -1 0 0 1 0 0 0 0
+2 -1 0 0 -1 0 0 -1 0 0 0
+0 1 0 0 -1 0 0 1 0 0 0
+2 0 -1 -1 0 0 0 0 -1 0 0
+2 0 -1 0 -1 0 0 0 0 -1 0
+2 0 0 -1 -1 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/mp6.ine b/demos/ppl_lcdd/examples/mp6.ine
new file mode 100644
index 0000000..7359781
--- /dev/null
+++ b/demos/ppl_lcdd/examples/mp6.ine
@@ -0,0 +1,84 @@
+* metric polytope on 6 points
+begin
+80 16 integer
+0 1 1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 0 1 0 0 0 1 0 0 0 0 0 0 0 0
+0 1 0 1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 -1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+0 1 0 0 1 0 0 0 -1 0 0 0 0 0 0 0
+0 -1 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+0 1 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
+0 0 -1 1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 -1 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 1 1 0 0 0 0 0 0 -1 0 0 0 0 0
+0 0 -1 0 1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 -1 0 0 0 0 0 0 1 0 0 0 0
+0 0 1 0 1 0 0 0 0 0 0 -1 0 0 0 0
+0 0 -1 0 0 1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 1 0 0 1 0 0 0 0 0 0 -1 0 0 0
+0 0 0 1 1 0 0 0 0 0 0 0 0 -1 0 0
+0 0 0 1 -1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 -1 1 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 1 0 1 0 0 0 0 0 0 0 0 -1 0
+0 0 0 1 0 -1 0 0 0 0 0 0 0 0 1 0
+0 0 0 -1 0 1 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 -1
+0 0 0 0 -1 1 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 1
+2 0 0 0 0 0 -1 -1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 1 1 0 0 -1 0 0 0 0 0
+0 0 0 0 0 0 -1 1 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 1 -1 0 0 1 0 0 0 0 0
+2 0 0 0 0 0 -1 0 -1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 1 0 1 0 0 -1 0 0 0 0
+0 0 0 0 0 0 -1 0 1 0 0 1 0 0 0 0
+0 0 0 0 0 0 1 0 -1 0 0 1 0 0 0 0
+2 0 0 0 0 0 -1 0 0 -1 0 0 -1 0 0 0
+0 0 0 0 0 0 -1 0 0 1 0 0 1 0 0 0
+0 0 0 0 0 0 1 0 0 1 0 0 -1 0 0 0
+0 0 0 0 0 0 1 0 0 -1 0 0 1 0 0 0
+2 0 0 0 0 0 0 -1 -1 0 0 0 0 -1 0 0
+0 0 0 0 0 0 0 -1 1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 -1 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 1 1 0 0 0 0 -1 0 0
+2 0 0 0 0 0 0 -1 0 -1 0 0 0 0 -1 0
+0 0 0 0 0 0 0 -1 0 1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 -1 0 0 0 0 1 0
+0 0 0 0 0 0 0 1 0 1 0 0 0 0 -1 0
+2 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1
+0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 -1 1 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 -1
+2 0 0 0 0 0 0 0 0 0 -1 -1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 1 0 -1 0 0
+0 0 0 0 0 0 0 0 0 0 1 -1 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 -1 1 0 1 0 0
+2 0 0 0 0 0 0 0 0 0 -1 0 -1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 1 0 -1 0
+0 0 0 0 0 0 0 0 0 0 1 0 -1 0 1 0
+0 0 0 0 0 0 0 0 0 0 -1 0 1 0 1 0
+2 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 -1
+0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 -1 1 0 0 1
+2 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1
+2 -1 -1 0 0 0 -1 0 0 0 0 0 0 0 0 0
+0 -1 1 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 1 -1 0 0 0 1 0 0 0 0 0 0 0 0 0
+2 -1 0 -1 0 0 0 -1 0 0 0 0 0 0 0 0
+0 1 0 -1 0 0 0 1 0 0 0 0 0 0 0 0
+2 -1 0 0 -1 0 0 0 -1 0 0 0 0 0 0 0
+0 1 0 0 -1 0 0 0 1 0 0 0 0 0 0 0
+2 -1 0 0 0 -1 0 0 0 -1 0 0 0 0 0 0
+0 1 0 0 0 -1 0 0 0 1 0 0 0 0 0 0
+2 0 -1 -1 0 0 0 0 0 0 -1 0 0 0 0 0
+2 0 -1 0 -1 0 0 0 0 0 0 -1 0 0 0 0
+2 0 -1 0 0 -1 0 0 0 0 0 0 -1 0 0 0
+2 0 0 -1 -1 0 0 0 0 0 0 0 0 -1 0 0
+2 0 0 -1 0 -1 0 0 0 0 0 0 0 0 -1 0
+2 0 0 0 -1 -1 0 0 0 0 0 0 0 0 0 -1
+end
diff --git a/demos/ppl_lcdd/examples/nonfull.ine b/demos/ppl_lcdd/examples/nonfull.ine
new file mode 100644
index 0000000..b662f47
--- /dev/null
+++ b/demos/ppl_lcdd/examples/nonfull.ine
@@ -0,0 +1,11 @@
+* non full-dimensional polyhedron
+H-representation
+begin
+    6      4    integer
+  2   -1   0   0
+ -2    1   0   0
+  2    0  -1   0
+ -1    1   0   0
+ -1    0   1   0
+ -1    0   0   1
+end
diff --git a/demos/ppl_lcdd/examples/origin.ine b/demos/ppl_lcdd/examples/origin.ine
new file mode 100644
index 0000000..a755533
--- /dev/null
+++ b/demos/ppl_lcdd/examples/origin.ine
@@ -0,0 +1,14 @@
+* The polytope consists of a single point, the origin.
+* cddlib now works properly for this input (version 090c and up).
+H-representation
+begin
+    7   7     integer
+ 0  1  0  0  0  0  0
+ 0  0  1  0  0  0  0
+ 0  0  0  1  0  0  0
+ 0  0  0  0  1  0  0
+ 0  0  0  0  0  1  0
+ 0  0  0  0  0  0  1
+ 0 -1 -1 -1 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/prodst62.ext b/demos/ppl_lcdd/examples/prodst62.ext
new file mode 100644
index 0000000..6fcd39e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/prodst62.ext
@@ -0,0 +1,3467 @@
+* Created by Alain Prodon.
+* Convex hull problem and the number of facets is 168.
+V-representation
+begin
+  3461 25  integer
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0
+ 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0
+ 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0
+ 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
+ 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0
+ 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
+ 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+ 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+ 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+end
diff --git a/demos/ppl_lcdd/examples/project1_m.ine b/demos/ppl_lcdd/examples/project1_m.ine
new file mode 100644
index 0000000..af7e014
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project1_m.ine
@@ -0,0 +1,24 @@
+H-representation
+begin
+20  7  integer
+  1  0  0  0  1  0  0
+  1  0  0  0  0  1  0
+  1  0  0  0  0  0  1
+  1  0  0  0  -1  0  0
+  1  0  0  0  0  -1  0
+  1  0  0  0  0  0  -1
+  1  1  0  0  -1  0  0
+  1  0  1  0  0  -1  0
+  1  0  0  1  0  0  -1
+  1  -1  0  0  1  0  0
+  1  0  -1  0  0  1  0
+  1  0  0  -1  0  0  1
+  2  1  1  1  -1  -1  -1
+  2  -1  1  1  1  -1  -1
+  2  1  -1  1  -1  1  -1
+  2  1  1  -1  -1  -1  1
+  2  -1  -1  1  1  1  -1
+  2  1  -1  -1  -1  1  1
+  2  -1  1  -1  1  -1  1
+  2  -1  -1  -1  1  1  1
+end
diff --git a/demos/ppl_lcdd/examples/project1res.ine b/demos/ppl_lcdd/examples/project1res.ine
new file mode 100644
index 0000000..d89603e
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project1res.ine
@@ -0,0 +1,18 @@
+H-representation
+begin
+14  4  integer
+  5  -1  -1  1
+  2  0  0  1
+  5  -1  1  1
+  5  1  -1  1
+  2  1  0  0
+  5  1  1  1
+  5  1  1  -1
+  5  1  -1  -1
+  2  0  1  0
+  5  -1  1  -1
+  2  0  0  -1
+  5  -1  -1  -1
+  2  0  -1  0
+  2  -1  0  0
+end
diff --git a/demos/ppl_lcdd/examples/project2_m.ine b/demos/ppl_lcdd/examples/project2_m.ine
new file mode 100644
index 0000000..a71cbff
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project2_m.ine
@@ -0,0 +1,66 @@
+H-representation
+begin
+62  7  integer
+  7  0  0  0  -3  1  -2
+  9  0  0  0  -2  -1  -3
+  7  0  0  0  -2  1  -3
+  9  0  0  0  -3  -1  -2
+  3  0  0  0  -2  3  -1
+  1  0  0  0  -2  3  1
+  5  0  0  0  -3  2  -1
+  3  0  0  0  -3  2  1
+  3  0  0  0  1  -3  2
+  1  0  0  0  1  -2  3
+  5  0  0  0  -1  -3  2
+  3  0  0  0  -1  -2  3
+  -3  0  0  0  1  2  3
+  -3  0  0  0  1  3  2
+  -1  0  0  0  -1  2  3
+  -1  0  0  0  -1  3  2
+  1  0  0  0  3  1  -2
+  5  0  0  0  2  -1  -3
+  3  0  0  0  3  -1  -2
+  3  0  0  0  2  1  -3
+  -1  0  0  0  2  3  -1
+  -1  0  0  0  3  2  -1
+  -3  0  0  0  2  3  1
+  -3  0  0  0  3  2  1
+  -3  0  0  0  2  1  3
+  -1  0  0  0  3  -1  2
+  -1  0  0  0  2  -1  3
+  -3  0  0  0  3  1  2
+  3  0  0  0  2  -3  1
+  5  0  0  0  2  -3  -1
+  1  0  0  0  3  -2  1
+  3  0  0  0  3  -2  -1
+  3  0  0  0  -1  3  -2
+  5  0  0  0  -1  2  -3
+  1  0  0  0  1  3  -2
+  3  0  0  0  1  2  -3
+  9  0  0  0  -1  -2  -3
+  9  0  0  0  -1  -3  -2
+  7  0  0  0  1  -2  -3
+  7  0  0  0  1  -3  -2
+  5  0  0  0  -3  -1  2
+  1  0  0  0  -2  1  3
+  3  0  0  0  -2  -1  3
+  3  0  0  0  -3  1  2
+  7  0  0  0  -2  -3  1
+  9  0  0  0  -2  -3  -1
+  7  0  0  0  -3  -2  1
+  9  0  0  0  -3  -2  -1
+  0  1  0  0  -1  0  0
+  0  0  1  0  0  -1  0
+  0  0  0  1  0  0  -1
+  2  -1  0  0  1  0  0
+  2  0  -1  0  0  1  0
+  2  0  0  -1  0  0  1
+  -1  1  1  1  -1  -1  -1
+  1  -1  1  1  1  -1  -1
+  1  1  -1  1  -1  1  -1
+  1  1  1  -1  -1  -1  1
+  3  -1  -1  1  1  1  -1
+  3  1  -1  -1  -1  1  1
+  3  -1  1  -1  1  -1  1
+  5  -1  -1  -1  1  1  1
+end
diff --git a/demos/ppl_lcdd/examples/project2res.ine b/demos/ppl_lcdd/examples/project2res.ine
new file mode 100644
index 0000000..740f2aa
--- /dev/null
+++ b/demos/ppl_lcdd/examples/project2res.ine
@@ -0,0 +1,90 @@
+H-representation
+begin
+86  4  integer
+  9  -2  1  -1
+  16  -3  1  -2
+  20  -3  -1  -2
+  12  -3  2  -1
+  8  -3  2  1
+  8  -2  -1  3
+  4  -2  1  3
+  8  -2  3  -1
+  4  -2  3  1
+  9  -1  -2  1
+  11  -2  -2  2
+  5  -1  -1  2
+  1  -1  1  2
+  3  -2  2  2
+  1  -1  2  1
+  4  0  0  -1
+  0  0  1  0
+  8  -1  -2  3
+  12  -1  -3  2
+  0  -1  2  3
+  0  -1  3  2
+  5  1  -2  1
+  8  1  -3  2
+  4  1  -2  3
+  1  1  -1  2
+  -3  1  1  2
+  -4  1  2  3
+  -4  1  3  2
+  -3  1  2  1
+  3  2  -2  2
+ -5  2  2  2
+  8  2  1  -3
+  12  2  -1  -3
+  0  2  3  -1
+  -4  2  3  1
+  1  2  -1  1
+  4  3  -2  1
+  0  3  -1  2
+  -3  2  1  1
+  -4  3  1  2
+  -4  3  2  1
+  0  1  0  0
+  0  3  2  -1
+  4  3  1  -2
+  1  2  1  -1
+  8  3  -1  -2
+  8  3  -2  -1
+  5  2  -1  -1
+  0  2  -1  3
+  -4  2  1  3
+  8  2  -3  1
+  12  2  -3  -1
+  3  2  2  -2
+  11 2  -2  -2
+  1  1  2  -1
+  4  1  3  -2
+  8  1  2  -3
+  5  1  1  -2
+  9  1  -1  -2
+  16  1  -2  -3
+  16  1  -3  -2
+  9  1  -2  -1
+  12  -1  2  -3
+  8  -1  3  -2
+  20  -1  -2  -3
+  20  -1  -3  -2
+  0  0  0  1
+  4  0  -1  0
+  5  -1  2  -1
+  11 -2  2  -2
+  9  -1  1  -2
+  13  -1  -1  -2
+  19 -2  -2  -2
+  13  -1  -2  -1
+  16  -2  1  -3
+  20  -2  -1  -3
+  16  -2  -3  1
+  20  -2  -3  -1
+  12  -3  -1  2
+  8  -3  1  2
+  5  -2  1  1
+  16  -3  -2  1
+  20  -3  -2  -1
+  9  -2  -1  1
+  13  -2  -1  -1
+  4  -1  0  0
+end
diff --git a/demos/ppl_lcdd/examples/rcubocta.ine b/demos/ppl_lcdd/examples/rcubocta.ine
new file mode 100644
index 0000000..909db72
--- /dev/null
+++ b/demos/ppl_lcdd/examples/rcubocta.ine
@@ -0,0 +1,31 @@
+* Rhombicuboctahedron
+H-representation
+begin
+  26    4   integer
+   1  1  0  0
+   1  0  1  0
+   1  0  0  1
+   1 -1  0  0
+   1  0 -1  0
+   1  0  0 -1
+   2  1  1  1
+   2 -1  1  1
+   2  1 -1  1
+   2  1  1 -1
+   2 -1 -1  1
+   2  1 -1 -1
+   2 -1  1 -1
+   2 -1 -1 -1
+   3  2  2  0
+   3  0  2  2
+   3  2  0  2
+   3 -2  2  0
+   3  0 -2  2
+   3  2  0 -2
+   3  2 -2  0
+   3  0  2 -2
+   3 -2  0  2
+   3 -2 -2  0
+   3  0 -2 -2
+   3 -2  0 -2
+end
diff --git a/demos/ppl_lcdd/examples/redcheck.ext b/demos/ppl_lcdd/examples/redcheck.ext
new file mode 100644
index 0000000..e970c42
--- /dev/null
+++ b/demos/ppl_lcdd/examples/redcheck.ext
@@ -0,0 +1,11 @@
+V-representation
+begin
+  7  3  integer
+ 1 0 0
+ 1 2 0
+ 1 0 2
+ 1 1 1
+ 1 2 1
+ 1 1 2
+ 1 2 2
+end
diff --git a/demos/ppl_lcdd/examples/reg24-5.ext b/demos/ppl_lcdd/examples/reg24-5.ext
new file mode 100644
index 0000000..b755b67
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg24-5.ext
@@ -0,0 +1,31 @@
+* The vertices of a self-dual 4-dim regular polytope
+* with 24 octahedron facets.
+* We use hull option to compute all (24) facet inequalities.
+V-representation
+begin
+  24  5  integer
+ 1  1  1  1  1
+ 1  1  1  1 -1
+ 1  1  1 -1  1
+ 1  1  1 -1 -1
+ 1  1 -1  1  1
+ 1  1 -1  1 -1
+ 1  1 -1 -1  1
+ 1  1 -1 -1 -1
+ 1 -1  1  1  1
+ 1 -1  1  1 -1
+ 1 -1  1 -1  1
+ 1 -1  1 -1 -1
+ 1 -1 -1  1  1
+ 1 -1 -1  1 -1
+ 1 -1 -1 -1  1
+ 1 -1 -1 -1 -1
+ 1  2  0  0  0
+ 1  0  2  0  0
+ 1  0  0  2  0
+ 1  0  0  0  2
+ 1 -2  0  0  0
+ 1  0 -2  0  0
+ 1  0  0 -2  0
+ 1  0  0  0 -2
+end
diff --git a/demos/ppl_lcdd/examples/reg24-5.ine b/demos/ppl_lcdd/examples/reg24-5.ine
new file mode 100644
index 0000000..d984817
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg24-5.ine
@@ -0,0 +1,30 @@
+* The facets of a self-dual 4-dim regular polytope
+* with 24 octahedron facets.
+H-representation
+begin
+  24  5  integer
+ 1  1  1  1  1
+ 1  1  1  1 -1
+ 1  1  1 -1  1
+ 1  1  1 -1 -1
+ 1  1 -1  1  1
+ 1  1 -1  1 -1
+ 1  1 -1 -1  1
+ 1  1 -1 -1 -1
+ 1 -1  1  1  1
+ 1 -1  1  1 -1
+ 1 -1  1 -1  1
+ 1 -1  1 -1 -1
+ 1 -1 -1  1  1
+ 1 -1 -1  1 -1
+ 1 -1 -1 -1  1
+ 1 -1 -1 -1 -1
+ 1  2  0  0  0
+ 1  0  2  0  0
+ 1  0  0  2  0
+ 1  0  0  0  2
+ 1 -2  0  0  0
+ 1  0 -2  0  0
+ 1  0  0 -2  0
+ 1  0  0  0 -2
+end
diff --git a/demos/ppl_lcdd/examples/reg600-5_m.ext b/demos/ppl_lcdd/examples/reg600-5_m.ext
new file mode 100644
index 0000000..4147d7f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/reg600-5_m.ext
@@ -0,0 +1,606 @@
+* The vertices of a 4-dim regular polytope with 600 vertices.
+* Hull computation for finding all 120 facets.
+V-representation
+begin
+600 5 rational
+1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 -18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 -2 -2 0 0
+1 -2 0 -2 0
+1 -2 0 0 -2
+1 -2 0 0 2
+1 -2 0 2 0
+1 -2 2 0 0
+1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 -47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 -20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 -18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 -6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 -5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 -2 -2 0
+1 0 -2 0 -2
+1 0 -2 0 2
+1 0 -2 2 0
+1 0 0 -2 -2
+1 0 0 -2 2
+1 0 0 2 -2
+1 0 0 2 2
+1 0 2 -2 0
+1 0 2 0 -2
+1 0 2 0 2
+1 0 2 2 0
+1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 -14573954539866394/9007199254740992
+1 0 5566755282423243/9007199254740992 20140709815984596/9007199254740992 14573954539866394/9007199254740992
+1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 -18014398509481984/18014398509481984
+1 0 6880887944635499/18014398509481984 47162307589214776/18014398509481984 18014398509481984/18014398509481984
+1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -20140709815984596/9007199254740992
+1 0 14573954539866394/9007199254740992 5566755282423243/9007199254740992 20140709815984596/9007199254740992
+1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 -47162307589214776/18014398509481984
+1 0 18014398509481984/18014398509481984 6880887944635499/18014398509481984 47162307589214776/18014398509481984
+1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 0 20140709815984596/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 -6880887944635499/18014398509481984
+1 0 47162307589214776/18014398509481984 18014398509481984/18014398509481984 6880887944635499/18014398509481984
+1 2 -2 0 0
+1 2 0 -2 0
+1 2 0 0 -2
+1 2 0 0 2
+1 2 0 2 0
+1 2 2 0 0
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 2251799813685248/2251799813685248 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 -2251799813685248/2251799813685248
+1 5035177453996149/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248 2251799813685248/2251799813685248
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 -14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 -20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 0 14573954539866394/9007199254740992 20140709815984596/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992 18014398509481984/9007199254740992
+1 5566755282423243/9007199254740992 14573954539866394/9007199254740992 20140709815984596/9007199254740992 0
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 18014398509481984/9007199254740992 14573954539866394/9007199254740992 9007199254740992/9007199254740992
+1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 -14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 20140709815984596/9007199254740992 0 14573954539866394/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 5566755282423243/9007199254740992 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 -47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 -18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 -47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 0 18014398509481984/18014398509481984 47162307589214776/18014398509481984
+1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 18014398509481984/18014398509481984 47162307589214776/18014398509481984 0
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 -18014398509481984/18014398509481984
+1 6880887944635499/18014398509481984 47162307589214776/18014398509481984 0 18014398509481984/18014398509481984
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 14573954539866394/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 9007199254740992/9007199254740992 18014398509481984/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 -20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 -20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 0 20140709815984596/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 -20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 0 20140709815984596/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 -18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992 18014398509481984/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 18014398509481984/9007199254740992 9007199254740992/9007199254740992 5566755282423243/9007199254740992
+1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 0
+1 14573954539866394/9007199254740992 20140709815984596/9007199254740992 5566755282423243/9007199254740992 0
+1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 18014398509481984/18014398509481984 -47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 18014398509481984/18014398509481984 -6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 -47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 -6880887944635499/18014398509481984
+1 18014398509481984/18014398509481984 0 47162307589214776/18014398509481984 6880887944635499/18014398509481984
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992
+1 18014398509481984/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992
+1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 -47162307589214776/18014398509481984
+1 18014398509481984/18014398509481984 6880887944635499/18014398509481984 0 47162307589214776/18014398509481984
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 -14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 9007199254740992/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 -5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 -9007199254740992/9007199254740992
+1 18014398509481984/9007199254740992 14573954539866394/9007199254740992 5566755282423243/9007199254740992 9007199254740992/9007199254740992
+1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 0
+1 18014398509481984/18014398509481984 47162307589214776/18014398509481984 6880887944635499/18014398509481984 0
+1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 -14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 -5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 -5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 -14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 0 5566755282423243/9007199254740992 14573954539866394/9007199254740992
+1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 -14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 5566755282423243/9007199254740992 14573954539866394/9007199254740992 0
+1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 -5566755282423243/9007199254740992
+1 20140709815984596/9007199254740992 14573954539866394/9007199254740992 0 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 -5566755282423243/9007199254740992
+1 23581153794607388/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992 5566755282423243/9007199254740992
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 -29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984 29147909079732788/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 -6880887944635499/18014398509481984
+1 29147909079732788/18014398509481984 29147909079732788/18014398509481984 29147909079732788/18014398509481984 6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 -6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 -6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 -18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 0 6880887944635499/18014398509481984 18014398509481984/18014398509481984
+1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 -18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 6880887944635499/18014398509481984 18014398509481984/18014398509481984 0
+1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 -6880887944635499/18014398509481984
+1 47162307589214776/18014398509481984 18014398509481984/18014398509481984 0 6880887944635499/18014398509481984
+end
diff --git a/demos/ppl_lcdd/examples/rhomtria_m.ine b/demos/ppl_lcdd/examples/rhomtria_m.ine
new file mode 100644
index 0000000..26757d4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/rhomtria_m.ine
@@ -0,0 +1,35 @@
+* Rhombic Triacontahedron
+H-representation
+begin
+30 4 integer
+14411518807585588 -22267021104472812 -8505245247627733 -13761775885668118
+14411518807585588 -22267021104472812 -8505245247627733 13761775885668118
+14411518807585588 -22267021104472812 8505245247627733 -13761775885668118
+14411518807585588 -22267021104472812 8505245247627733 13761775885668118
+14411518807585588 -13761775885668118 -22267021104472812 -8505245247627733
+14411518807585588 -13761775885668118 -22267021104472812 8505245247627733
+14411518807585588 -13761775885668118 22267021104472812 -8505245247627733
+14411518807585588 -13761775885668118 22267021104472812 8505245247627733
+14411518807585588 -8505245247627733 -13761775885668118 -22267021104472812
+14411518807585588 -8505245247627733 -13761775885668118 22267021104472812
+14411518807585588 -8505245247627733 13761775885668118 -22267021104472812
+14411518807585588 -8505245247627733 13761775885668118 22267021104472812
+3602879701896397 -6880887957245578 0 0
+3602879701896397 0 -6880887957245578 0
+3602879701896397 0 0 -6880887957245578
+3602879701896397 0 0 6880887957245578
+3602879701896397 0 6880887957245578 0
+3602879701896397 6880887957245578 0 0
+14411518807585588 8505245247627733 -13761775885668118 -22267021104472812
+14411518807585588 8505245247627733 -13761775885668118 22267021104472812
+14411518807585588 8505245247627733 13761775885668118 -22267021104472812
+14411518807585588 8505245247627733 13761775885668118 22267021104472812
+14411518807585588 13761775885668118 -22267021104472812 -8505245247627733
+14411518807585588 13761775885668118 -22267021104472812 8505245247627733
+14411518807585588 13761775885668118 22267021104472812 -8505245247627733
+14411518807585588 13761775885668118 22267021104472812 8505245247627733
+14411518807585588 22267021104472812 -8505245247627733 -13761775885668118
+14411518807585588 22267021104472812 -8505245247627733 13761775885668118
+14411518807585588 22267021104472812 8505245247627733 -13761775885668118
+14411518807585588 22267021104472812 8505245247627733 13761775885668118
+end
diff --git a/demos/ppl_lcdd/examples/sample.ine b/demos/ppl_lcdd/examples/sample.ine
new file mode 100644
index 0000000..452e1bf
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sample.ine
@@ -0,0 +1,11 @@
+* 3-cube
+H-representation
+begin
+    6    4    rational
+ 10/3  1  0  0
+ 10/3  0  1  0
+ 10/3  0  0  1
+ 10/3 -1  0  0
+ 10/3  0 -1  0
+ 10/3  0  0 -1
+end
diff --git a/demos/ppl_lcdd/examples/sampleh1.ine b/demos/ppl_lcdd/examples/sampleh1.ine
new file mode 100644
index 0000000..93f3df3
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh1.ine
@@ -0,0 +1,9 @@
+* a 3-D cone containing no vertices and a line
+H-representation
+begin
+    3    4   integer
+ 2 -1 -1  0
+ 0  1  0  0
+ 0  0  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh2.ine b/demos/ppl_lcdd/examples/sampleh2.ine
new file mode 100644
index 0000000..082026d
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh2.ine
@@ -0,0 +1,7 @@
+* a hyperplane with no vertices and rays
+H-representation
+begin
+    1    4   integer
+-1  0  0  1
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh3.ine b/demos/ppl_lcdd/examples/sampleh3.ine
new file mode 100644
index 0000000..b2ace9b
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh3.ine
@@ -0,0 +1,7 @@
+* a 3-D homogeneous cone with no vertices
+H-representation
+begin
+    2    4   integer
+ 0  1  1  0
+ 0  0  1  0
+end
diff --git a/demos/ppl_lcdd/examples/sampleh4.ine b/demos/ppl_lcdd/examples/sampleh4.ine
new file mode 100644
index 0000000..f929e10
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh4.ine
@@ -0,0 +1,12 @@
+* trivial inequalities: the polyhedron is the whole space.
+H-representation
+begin
+    6   4    integer
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+ 0  0  0  0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh5.ine b/demos/ppl_lcdd/examples/sampleh5.ine
new file mode 100644
index 0000000..ec122d5
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh5.ine
@@ -0,0 +1,15 @@
+* test file for redundancy removal
+H-representation
+linearity 1 3
+begin
+    8   4   integer
+ 0  1  0  0
+ 0  0  1  0
+ 0  0  0  1
+ 1 -1 -1 -1
+ 1 -1 -1  0
+ 1  0 -1 -1
+ 1 -1  0 -1
+ 2 -1 -1 -1
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh6.ine b/demos/ppl_lcdd/examples/sampleh6.ine
new file mode 100644
index 0000000..b9c93a7
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh6.ine
@@ -0,0 +1,11 @@
+* test file for forced-equality checking
+H-representation
+begin
+    5   4   integer
+ 0  1  0  0
+ 0  0  1  0
+ 0  0  0  1
+ 1 -1 -1 -1
+-1  1  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh7.ine b/demos/ppl_lcdd/examples/sampleh7.ine
new file mode 100644
index 0000000..c4c09d2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh7.ine
@@ -0,0 +1,19 @@
+* test file for redundancy removal
+* the redundant rows are
+* 3 4 5 9 10
+* LP type =  1   Seed = 123
+H-representation
+begin
+  10  3  integer
+ 0 1 0
+ 0 0 1
+ -10000 651 693
+ -10000 697 637
+ -10000 368 824
+ -10000 87 725
+ -10000 387 219
+ -10000 430 202
+ -10000 356 988
+ -10000 674 979
+end
+
diff --git a/demos/ppl_lcdd/examples/sampleh8.ine b/demos/ppl_lcdd/examples/sampleh8.ine
new file mode 100644
index 0000000..cf5f54c
--- /dev/null
+++ b/demos/ppl_lcdd/examples/sampleh8.ine
@@ -0,0 +1,110 @@
+* test file for redundancy removal
+* the redundant rows are
+* 10 11 12 14 21 23 26 32 39 40 41 44 46
+* 50 51 54 56 57 59 62 63 64 69 76 77 78
+* 79 83 84 85 87 88 91 94 97
+* LP type =  1   Seed = 123
+H-representation
+begin
+  100  10  integer
+ 0 1 0 0 0 0 0 0 0 0
+ 0 0 1 0 0 0 0 0 0 0
+ 0 0 0 1 0 0 0 0 0 0
+ 0 0 0 0 1 0 0 0 0 0
+ 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 0 1 0 0 0
+ 0 0 0 0 0 0 0 1 0 0
+ 0 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 1
+ -10000 651 693 84 697 637 340 368 824 663
+ -10000 725 742 387 219 751 430 202 745 356
+ -10000 377 674 979 167 815 988 412 676 475
+ -10000 710 275 949 284 629 1 422 974 510
+ -10000 692 945 725 488 271 430 724 225 726
+ -10000 465 258 450 343 87 168 161 103 919
+ -10000 86 79 656 493 832 514 791 506 29
+ -10000 63 630 874 918 877 272 992 119 480
+ -10000 598 926 42 378 288 66 927 919 99
+ -10000 256 354 106 979 641 160 395 225 837
+ -10000 202 388 900 471 160 751 300 731 818
+ -10000 342 502 825 563 639 261 194 984 990
+ -10000 266 406 364 216 448 675 145 694 866
+ -10000 362 983 732 378 134 902 946 877 205
+ -10000 926 125 949 888 234 630 275 707 67
+ -10000 634 81 192 768 652 822 311 961 895
+ -10000 983 597 743 314 696 585 367 396 826
+ -10000 511 545 539 97 111 996 477 35 372
+ -10000 474 103 152 753 159 120 929 161 563
+ -10000 549 793 307 456 444 184 149 792 894
+ -10000 839 488 917 192 168 788 959 245 25
+ -10000 750 165 338 182 392 381 962 117 713
+ -10000 738 827 943 507 914 814 951 663 815
+ -10000 493 339 225 351 450 788 992 167 792
+ -10000 174 773 247 247 180 517 445 599 596
+ -10000 303 26 967 39 535 4 7 335 217
+ -10000 772 173 189 291 668 191 610 677 544
+ -10000 848 642 40 125 865 100 259 534 648
+ -10000 501 622 398 624 118 416 30 17 236
+ -10000 218 602 697 892 322 314 361 573 985
+ -10000 958 856 608 492 563 478 311 614 740
+ -10000 582 913 938 949 715 338 39 726 998
+ -10000 521 805 708 221 624 316 24 127 322
+ -10000 491 189 412 774 418 200 193 633 315
+ -10000 144 679 383 447 989 939 441 631 482
+ -10000 940 241 153 215 149 457 254 207 125
+ -10000 80 873 207 904 684 600 940 431 825
+ -10000 75 100 353 637 432 377 940 758 164
+ -10000 627 721 915 710 8 786 96 17 576
+ -10000 247 104 607 432 540 164 597 282 317
+ -10000 553 787 881 942 152 318 44 509 518
+ -10000 181 772 942 993 916 900 713 694 812
+ -10000 625 26 638 261 385 196 676 717 572
+ -10000 11 911 296 761 658 631 757 817 400
+ -10000 964 989 879 491 490 751 490 97 405
+ -10000 28 461 343 452 480 504 411 242 892
+ -10000 768 746 347 352 724 487 185 767 287
+ -10000 924 228 958 554 352 460 765 742 430
+ -10000 737 986 499 993 721 29 821 416 813
+ -10000 483 458 249 781 584 321 779 209 570
+ -10000 222 166 975 53 765 256 859 469 164
+ -10000 82 696 181 166 375 145 415 496 261
+ -10000 540 309 526 918 439 489 846 417 775
+ -10000 699 145 327 873 467 866 711 393 603
+ -10000 445 668 729 224 654 970 279 789 680
+ -10000 28 659 365 306 186 520 427 176 191
+ -10000 919 58 859 436 105 35 560 716 14
+ -10000 641 238 340 524 205 255 272 14 472
+ -10000 817 22 904 782 573 847 649 100 280
+ -10000 925 277 930 495 736 960 276 726 657
+ -10000 336 54 357 979 941 765 593 630 286
+ -10000 65 113 104 915 222 158 580 520 188
+ -10000 42 617 904 414 588 857 416 94 988
+ -10000 716 49 849 67 607 99 934 184 217
+ -10000 458 32 500 552 108 980 255 998 935
+ -10000 860 936 115 268 231 281 948 209 766
+ -10000 293 330 940 570 857 421 574 481 364
+ -10000 959 949 372 757 306 757 752 312 137
+ -10000 769 303 737 260 187 695 946 723 433
+ -10000 980 564 605 363 776 893 558 616 603
+ -10000 945 23 632 820 54 677 795 616 625
+ -10000 629 692 585 33 674 703 304 489 949
+ -10000 52 903 723 746 692 232 917 933 211
+ -10000 367 566 364 318 607 818 424 234 605
+ -10000 915 305 354 829 469 447 925 188 799
+ -10000 387 596 946 888 751 614 539 295 299
+ -10000 969 902 10 739 289 923 808 28 151
+ -10000 537 152 546 442 182 301 258 265 762
+ -10000 671 288 343 199 694 391 457 947 250
+ -10000 415 734 423 435 696 111 53 227 784
+ -10000 800 992 720 76 40 419 608 182 683
+ -10000 619 627 278 526 453 960 772 992 86
+ -10000 836 623 0 21 371 4 676 964 658
+ -10000 258 677 64 968 62 219 587 308 299
+ -10000 224 823 258 449 575 526 908 585 405
+ -10000 593 660 663 341 36 79 50 242 293
+ -10000 80 761 270 460 82 133 874 559 41
+ -10000 169 539 257 827 222 743 873 929 523
+ -10000 403 167 259 377 76 160 749 448 902
+ -10000 290 5 276 509 342 909 193 443 552
+ -10000 928 326 757 405 598 765 143 833 150
+end
diff --git a/demos/ppl_lcdd/examples/samplev1.ext b/demos/ppl_lcdd/examples/samplev1.ext
new file mode 100644
index 0000000..b68bf9f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev1.ext
@@ -0,0 +1,8 @@
+* a 1-D cone in 3D space
+V-representation
+begin
+    2    4   integer
+  1  1  0  1
+  0  0  1  0
+end
+
diff --git a/demos/ppl_lcdd/examples/samplev2.ext b/demos/ppl_lcdd/examples/samplev2.ext
new file mode 100644
index 0000000..99ab9f6
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev2.ext
@@ -0,0 +1,11 @@
+* a 1-D cone in 3D space without any vertices
+V-representation
+linearity  1  3
+begin
+    3    4   integer
+  0  0  0  1
+  1  1  0  0
+  0  1 -1  0
+end
+
+
diff --git a/demos/ppl_lcdd/examples/samplev3.ext b/demos/ppl_lcdd/examples/samplev3.ext
new file mode 100644
index 0000000..bc92ef4
--- /dev/null
+++ b/demos/ppl_lcdd/examples/samplev3.ext
@@ -0,0 +1,16 @@
+* test file for redundancy removal
+* the redundant rows: 2 4 5 6 7
+* the implicit linearities : 8 9
+V-representation
+begin
+  9  3  integer
+ 1 0 0
+ 1 2 0
+ 1 0 2
+ 1 1 1
+ 1 2 1
+ 1 1 2
+ 1 2 2
+ 0 1 0
+ 0 -1 0
+end
diff --git a/demos/ppl_lcdd/examples/trunc10.ine b/demos/ppl_lcdd/examples/trunc10.ine
new file mode 100644
index 0000000..3f5bd91
--- /dev/null
+++ b/demos/ppl_lcdd/examples/trunc10.ine
@@ -0,0 +1,119 @@
+* delta=1/10
+* eps0=1/20
+* scut=1/40
+* pcut=1/40
+begin
+112 11 integer
+3 5 -5 -5 -5 -5 -5 -5 -5 -5 20
+3 -5 -5 -5 -5 -5 -5 -5 -5 -5 20
+3 0 10 0 0 0 0 0 0 0 20
+3 0 20 0 0 0 0 0 0 0 10
+3 5 20 -5 -5 -5 -5 -5 -5 -5 -5
+3 -5 20 -5 -5 -5 -5 -5 -5 -5 -5
+3 0 20 10 0 0 0 0 0 0 0
+3 0 20 0 10 0 0 0 0 0 0
+3 0 20 0 0 10 0 0 0 0 0
+3 0 20 0 0 0 10 0 0 0 0
+3 0 20 0 0 0 0 10 0 0 0
+3 0 20 0 0 0 0 0 10 0 0
+3 0 20 0 0 0 0 0 0 10 0
+3 0 0 10 0 0 0 0 0 0 20
+3 0 0 20 0 0 0 0 0 0 10
+3 5 -5 20 -5 -5 -5 -5 -5 -5 -5
+3 -5 -5 20 -5 -5 -5 -5 -5 -5 -5
+3 0 10 20 0 0 0 0 0 0 0
+3 0 0 20 10 0 0 0 0 0 0
+3 0 0 20 0 10 0 0 0 0 0
+3 0 0 20 0 0 10 0 0 0 0
+3 0 0 20 0 0 0 10 0 0 0
+3 0 0 20 0 0 0 0 10 0 0
+3 0 0 20 0 0 0 0 0 10 0
+3 0 0 0 10 0 0 0 0 0 20
+3 0 0 0 20 0 0 0 0 0 10
+3 5 -5 -5 20 -5 -5 -5 -5 -5 -5
+3 -5 -5 -5 20 -5 -5 -5 -5 -5 -5
+3 0 10 0 20 0 0 0 0 0 0
+3 0 0 10 20 0 0 0 0 0 0
+3 0 0 0 20 10 0 0 0 0 0
+3 0 0 0 20 0 10 0 0 0 0
+3 0 0 0 20 0 0 10 0 0 0
+3 0 0 0 20 0 0 0 10 0 0
+3 0 0 0 20 0 0 0 0 10 0
+3 0 0 0 0 10 0 0 0 0 20
+3 0 0 0 0 20 0 0 0 0 10
+3 5 -5 -5 -5 20 -5 -5 -5 -5 -5
+3 -5 -5 -5 -5 20 -5 -5 -5 -5 -5
+3 0 10 0 0 20 0 0 0 0 0
+3 0 0 10 0 20 0 0 0 0 0
+3 0 0 0 10 20 0 0 0 0 0
+3 0 0 0 0 20 10 0 0 0 0
+3 0 0 0 0 20 0 10 0 0 0
+3 0 0 0 0 20 0 0 10 0 0
+3 0 0 0 0 20 0 0 0 10 0
+3 0 0 0 0 0 10 0 0 0 20
+3 0 0 0 0 0 20 0 0 0 10
+3 5 -5 -5 -5 -5 20 -5 -5 -5 -5
+3 -5 -5 -5 -5 -5 20 -5 -5 -5 -5
+3 0 10 0 0 0 20 0 0 0 0
+3 0 0 10 0 0 20 0 0 0 0
+3 0 0 0 10 0 20 0 0 0 0
+3 0 0 0 0 10 20 0 0 0 0
+3 0 0 0 0 0 20 10 0 0 0
+3 0 0 0 0 0 20 0 10 0 0
+3 0 0 0 0 0 20 0 0 10 0
+3 0 0 0 0 0 0 10 0 0 20
+3 0 0 0 0 0 0 20 0 0 10
+3 5 -5 -5 -5 -5 -5 20 -5 -5 -5
+3 -5 -5 -5 -5 -5 -5 20 -5 -5 -5
+3 0 10 0 0 0 0 20 0 0 0
+3 0 0 10 0 0 0 20 0 0 0
+3 0 0 0 10 0 0 20 0 0 0
+3 0 0 0 0 10 0 20 0 0 0
+3 0 0 0 0 0 10 20 0 0 0
+3 0 0 0 0 0 0 20 10 0 0
+3 0 0 0 0 0 0 20 0 10 0
+3 0 0 0 0 0 0 0 10 0 20
+3 0 0 0 0 0 0 0 20 0 10
+3 5 -5 -5 -5 -5 -5 -5 20 -5 -5
+3 -5 -5 -5 -5 -5 -5 -5 20 -5 -5
+3 0 10 0 0 0 0 0 20 0 0
+3 0 0 10 0 0 0 0 20 0 0
+3 0 0 0 10 0 0 0 20 0 0
+3 0 0 0 0 10 0 0 20 0 0
+3 0 0 0 0 0 10 0 20 0 0
+3 0 0 0 0 0 0 10 20 0 0
+3 0 0 0 0 0 0 0 20 10 0
+3 0 0 0 0 0 0 0 0 10 20
+3 0 0 0 0 0 0 0 0 20 10
+3 5 -5 -5 -5 -5 -5 -5 -5 20 -5
+3 -5 -5 -5 -5 -5 -5 -5 -5 20 -5
+3 0 10 0 0 0 0 0 0 20 0
+3 0 0 10 0 0 0 0 0 20 0
+3 0 0 0 10 0 0 0 0 20 0
+3 0 0 0 0 10 0 0 0 20 0
+3 0 0 0 0 0 10 0 0 20 0
+3 0 0 0 0 0 0 10 0 20 0
+3 0 0 0 0 0 0 0 10 20 0
+1 10 -10 -10 -10 -10 -10 -10 -10 -10 -10
+1 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10
+39 40 0 0 0 0 0 0 0 0 0
+39 -40 0 0 0 0 0 0 0 0 0
+1 0 8 0 0 0 0 0 0 0 0
+1 0 0 8 0 0 0 0 0 0 0
+1 0 0 0 8 0 0 0 0 0 0
+1 0 0 0 0 8 0 0 0 0 0
+1 0 0 0 0 0 8 0 0 0 0
+1 0 0 0 0 0 0 8 0 0 0
+1 0 0 0 0 0 0 0 8 0 0
+1 0 0 0 0 0 0 0 0 8 0
+1 0 0 0 0 0 0 0 0 0 8
+7 0 -8 0 0 0 0 0 0 0 0
+7 0 0 -8 0 0 0 0 0 0 0
+7 0 0 0 -8 0 0 0 0 0 0
+7 0 0 0 0 -8 0 0 0 0 0
+7 0 0 0 0 0 -8 0 0 0 0
+7 0 0 0 0 0 0 -8 0 0 0
+7 0 0 0 0 0 0 0 -8 0 0
+7 0 0 0 0 0 0 0 0 -8 0
+7 0 0 0 0 0 0 0 0 0 -8
+end
diff --git a/demos/ppl_lcdd/examples/trunc7.ine b/demos/ppl_lcdd/examples/trunc7.ine
new file mode 100644
index 0000000..8250bc0
--- /dev/null
+++ b/demos/ppl_lcdd/examples/trunc7.ine
@@ -0,0 +1,65 @@
+* delta=1/7
+* eps0=1/14
+* scut=1/28
+* pcut=1/28
+begin
+58 8 integer
+6 7 -7 -7 -7 -7 -7 28
+6 -7 -7 -7 -7 -7 -7 28
+3 0 7 0 0 0 0 14
+3 0 14 0 0 0 0 7
+6 7 28 -7 -7 -7 -7 -7
+6 -7 28 -7 -7 -7 -7 -7
+3 0 14 7 0 0 0 0
+3 0 14 0 7 0 0 0
+3 0 14 0 0 7 0 0
+3 0 14 0 0 0 7 0
+3 0 0 7 0 0 0 14
+3 0 0 14 0 0 0 7
+6 7 -7 28 -7 -7 -7 -7
+6 -7 -7 28 -7 -7 -7 -7
+3 0 7 14 0 0 0 0
+3 0 0 14 7 0 0 0
+3 0 0 14 0 7 0 0
+3 0 0 14 0 0 7 0
+3 0 0 0 7 0 0 14
+3 0 0 0 14 0 0 7
+6 7 -7 -7 28 -7 -7 -7
+6 -7 -7 -7 28 -7 -7 -7
+3 0 7 0 14 0 0 0
+3 0 0 7 14 0 0 0
+3 0 0 0 14 7 0 0
+3 0 0 0 14 0 7 0
+3 0 0 0 0 7 0 14
+3 0 0 0 0 14 0 7
+6 7 -7 -7 -7 28 -7 -7
+6 -7 -7 -7 -7 28 -7 -7
+3 0 7 0 0 14 0 0
+3 0 0 7 0 14 0 0
+3 0 0 0 7 14 0 0
+3 0 0 0 0 14 7 0
+3 0 0 0 0 0 7 14
+3 0 0 0 0 0 14 7
+6 7 -7 -7 -7 -7 28 -7
+6 -7 -7 -7 -7 -7 28 -7
+3 0 7 0 0 0 14 0
+3 0 0 7 0 0 14 0
+3 0 0 0 7 0 14 0
+3 0 0 0 0 7 14 0
+1 7 -7 -7 -7 -7 -7 -7
+1 -7 -7 -7 -7 -7 -7 -7
+27 28 0 0 0 0 0 0
+27 -28 0 0 0 0 0 0
+5 0 28 0 0 0 0 0
+5 0 0 28 0 0 0 0
+5 0 0 0 28 0 0 0
+5 0 0 0 0 28 0 0
+5 0 0 0 0 0 28 0
+5 0 0 0 0 0 0 28
+23 0 -28 0 0 0 0 0
+23 0 0 -28 0 0 0 0
+23 0 0 0 -28 0 0 0
+23 0 0 0 0 -28 0 0
+23 0 0 0 0 0 -28 0
+23 0 0 0 0 0 0 -28
+end
diff --git a/demos/ppl_lcdd/examples/tsp5.ext b/demos/ppl_lcdd/examples/tsp5.ext
new file mode 100644
index 0000000..b4e6874
--- /dev/null
+++ b/demos/ppl_lcdd/examples/tsp5.ext
@@ -0,0 +1,16 @@
+V-representation
+begin
+12 11 rational
+ 1  0  0  1  1  1  1  0  0  1  0
+ 1  1  0  0  1  0  1  0  1  1  0
+ 1  0  1  0  1  0  1  1  1  0  0
+ 1  0  1  0  1  1  1  0  0  0  1
+ 1  0  1  1  0  0  1  1  0  1  0
+ 1  0  1  1  0  1  0  1  0  0  1
+ 1  1  1  0  0  0  0  1  1  0  1
+ 1  1  1  0  0  0  1  0  0  1  1
+ 1  1  0  1  0  0  0  1  1  1  0
+ 1  1  0  1  0  1  0  0  0  1  1
+ 1  0  0  1  1  1  0  1  1  0  0
+ 1  1  0  0  1  1  0  0  1  0  1
+end
diff --git a/demos/ppl_lcdd/examples/tsp5.ine b/demos/ppl_lcdd/examples/tsp5.ine
new file mode 100644
index 0000000..04563a2
--- /dev/null
+++ b/demos/ppl_lcdd/examples/tsp5.ine
@@ -0,0 +1,30 @@
+H-representation
+linearity 5  1 2 3 4 5
+begin
+25 11 rational
+-2  1  1  1  1  0  0  0  0  0  0
+-2  1  0  0  0  1  1  1  0  0  0
+-3  1  1  1  0  1  1  0  1  0  0
+ 1 -1  0 -1  0  0 -1  0  0  1  0
+ 1 -1 -1  0  0 -1  0  0  0  0  1
+ 1 -1  0  0  0  0  0  0  0  0  0
+ 0  0  0  0  0  0  1  0  0  0  0
+ 0  0  1  0  0  0  0  0  0  0  0
+ 2 -1 -1  0  0 -1  0  0  0  0  0
+ 1  0  0  0  0 -1  0  0  0  0  0
+ 2 -1  0  0  0 -1 -1  0  0  0  0
+-1  1  0  1  0  0  1  0  0  0  0
+ 0  0  0  1  0  0  0  0  0  0  0
+-1  1  1  1  0  0  0  0  0  0  0
+-2  1  1  1  0  1  1  0  0  0  0
+ 2 -1 -1 -1  0  0  0  0  0  0  0
+ 1  0  0 -1  0  0  0  0  0  0  0
+ 2 -1  0 -1  0  0 -1  0  0  0  0
+ 3 -1 -1 -1  0 -1 -1  0  0  0  0
+-1  1  0  0  0  1  1  0  0  0  0
+ 0  0  0  0  0  1  0  0  0  0  0
+-1  1  1  0  0  1  0  0  0  0  0
+ 1  0 -1  0  0  0  0  0  0  0  0
+ 1  0  0  0  0  0 -1  0  0  0  0
+ 0  1  0  0  0  0  0  0  0  0  0
+end
diff --git a/demos/ppl_lcdd/expected_int16 b/demos/ppl_lcdd/expected_int16
new file mode 100644
index 0000000..281f13b
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int16
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int16_a b/demos/ppl_lcdd/expected_int16_a
new file mode 100644
index 0000000..8dbcb68
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int16_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int32 b/demos/ppl_lcdd/expected_int32
new file mode 100644
index 0000000..351a73b
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int32
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+in6.ine  1d81f92f878af596166bc64c20392e5b  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  edecfb72df1fe7f8c4849cdb3c47bfce  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int32_a b/demos/ppl_lcdd/expected_int32_a
new file mode 100644
index 0000000..afac8d7
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int32_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int64 b/demos/ppl_lcdd/expected_int64
new file mode 100644
index 0000000..bae6f3d
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int64
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  a4a97e43ad11ff98450b2a94618e373d  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  1324d63c4fe3e0902178254e768e9504  -
+irbox200-4.ext  eb69ce06ed90547eeb9ff98a62ce3b7e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+in6.ine  1d81f92f878af596166bc64c20392e5b  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  edecfb72df1fe7f8c4849cdb3c47bfce  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int64_a b/demos/ppl_lcdd/expected_int64_a
new file mode 100644
index 0000000..b8e517c
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int64_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int8 b/demos/ppl_lcdd/expected_int8
new file mode 100644
index 0000000..179b90d
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int8
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic16-10.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  d41d8cd98f00b204e9800998ecf8427e  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic17_8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  d41d8cd98f00b204e9800998ecf8427e  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kq20_11_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+project2res.ine  d41d8cd98f00b204e9800998ecf8427e  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sampleh8.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc10.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_int8_a b/demos/ppl_lcdd/expected_int8_a
new file mode 100644
index 0000000..5e7a7d0
--- /dev/null
+++ b/demos/ppl_lcdd/expected_int8_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic10-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic12-6.ext  d41d8cd98f00b204e9800998ecf8427e  -
+cyclic14-8.ext  d41d8cd98f00b204e9800998ecf8427e  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+irbox200-4.ext  d41d8cd98f00b204e9800998ecf8427e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  d41d8cd98f00b204e9800998ecf8427e  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  d41d8cd98f00b204e9800998ecf8427e  -
+hexocta.ine  d41d8cd98f00b204e9800998ecf8427e  -
+icododeca_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in0.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in1.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+in5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd18_4.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd27_5.ine  d41d8cd98f00b204e9800998ecf8427e  -
+kkd38_6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  d41d8cd98f00b204e9800998ecf8427e  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+project2res.ine  d41d8cd98f00b204e9800998ecf8427e  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  d41d8cd98f00b204e9800998ecf8427e  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+trunc7.ine  d41d8cd98f00b204e9800998ecf8427e  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_mpz b/demos/ppl_lcdd/expected_mpz
new file mode 100644
index 0000000..0f5701e
--- /dev/null
+++ b/demos/ppl_lcdd/expected_mpz
@@ -0,0 +1,98 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccc6.ext  c458b6a2a77990c6d8fe562c9d223c2c  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+ccp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp6.ext  ac5556e9e9fd1100c6b9f97384f609da  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cut32_16.ext  2f524bae3b4ba2edf72f54183cb702a5  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  a4a97e43ad11ff98450b2a94618e373d  -
+cyclic16-10.ext  a7b2ba7c494b41e0f7faf6f34cb6ca48  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  1324d63c4fe3e0902178254e768e9504  -
+irbox200-4.ext  eb69ce06ed90547eeb9ff98a62ce3b7e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+reg600-5_m.ext  bf50ec3c18bc063d041f07259cbe0977  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+cyclic17_8.ine  7dde598eeb61433637ff7ecd1d9689e0  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  4a3d6132b5a0f2ee9a65e422b520bcce  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  8a75d6463098ed2e2160c33f6955f3ac  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  bba9cb757ba441e33e0a3628fc13ed2c  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+in6.ine  1d81f92f878af596166bc64c20392e5b  -
+in7.ine  a5f569a088696cf71dbd23ccf5a2cca6  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  1736867592c3f53fb4d062ace63e6ba4  -
+kkd27_5.ine  9c376148791743bbb9d2a6b1467b8a11  -
+kkd38_6.ine  1c692bb63e7d61fad11d3b1e196eabe4  -
+kq20_11_m.ine  a5f569a088696cf71dbd23ccf5a2cca6  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mit31-20.ine  03aef81d50c861b73302866415184106  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  a351f4fc25819a278bdf2244f3f1c3a4  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+sampleh8.ine  8ddc3026fccbbeb3699fc6db254ff981  -
+trunc10.ine  edecfb72df1fe7f8c4849cdb3c47bfce  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/expected_mpz_a b/demos/ppl_lcdd/expected_mpz_a
new file mode 100644
index 0000000..561cef3
--- /dev/null
+++ b/demos/ppl_lcdd/expected_mpz_a
@@ -0,0 +1,85 @@
+ccc4.ext  bc96322497eecd12c4d0582ff2311cb4  -
+ccc5.ext  4964babfa462514ddeb8b3b549e92982  -
+ccp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+ccp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cp4.ext  c57dd7951e50033fa8955810bbe273a3  -
+cp5.ext  226f386e8780b30e239586b8b2964a0d  -
+cube.ext  45f31680d2301d58a1d57c0dc09bb1f0  -
+cut16_11.ext  56ec06c653436caff88819989a739b74  -
+cyclic10-4.ext  0ddde1f99cd5b3cf899fa6778e67569e  -
+cyclic12-6.ext  d72a192a8057e34b9cd3a9ad112b6cd2  -
+cyclic14-8.ext  a4a97e43ad11ff98450b2a94618e373d  -
+dcube10.ext  aab7857f665af827774614f090f72b51  -
+dcube12.ext  d2e47db88b9ea21f7fabb03c60421297  -
+dcube3.ext  f37f7234953ac36f582bfcad6e933397  -
+dcube6.ext  09056814a1944456ce283f5839411c38  -
+dcube8.ext  e2ac7f22e55e7b2009d0625dd4ec724a  -
+irbox20-4.ext  1324d63c4fe3e0902178254e768e9504  -
+irbox200-4.ext  eb69ce06ed90547eeb9ff98a62ce3b7e  -
+mp5.ext  064e5fd8ec28e712f2c475cb19cee4e3  -
+redcheck.ext  12a70972a9385cf228abe8484f68f1c6  -
+reg24-5.ext  8e8fa94ededd63732112f68094fe0559  -
+samplev1.ext  0d931a85a14850fc76a3b1d5c373b917  -
+samplev2.ext  6718e59a777d0ae297dbe7d6d305961a  -
+samplev3.ext  425b227f7720ee71af25fadbec2560b9  -
+tsp5.ext  e9e56d002855db0d1ba399d6cf991799  -
+1d.ine  89d8b1916d823aaf7563740c09f71470  -
+1da.ine  89d8b1916d823aaf7563740c09f71470  -
+allzero.ine  360296f0fb93ab70b1528453d6cf02ca  -
+cp4.ine  a868d7ab4d206871d4af3311059caa32  -
+cp5.ine  a329d8a17d135c38d9bbc5709a523f9a  -
+cross10.ine  38178216a0010320f29334df7a2f9eac  -
+cross12.ine  1c24d854ca16cbb6281648219c37cf0a  -
+cross4.ine  a9bab74fd8c29016443a117b88827ca6  -
+cross6.ine  3b41f0b924526fec2616f6299fe14c6f  -
+cross8.ine  32274fa3bd0758c81380bb305ec09d8f  -
+cube.ine  e2498d1cd888aa8cf2762bb5a8613592  -
+cube10.ine  9511f2116a3863917e7c75067ca2c2e5  -
+cube12.ine  a71ae423c627c68442fc2dff2b2b9e0a  -
+cube3.ine  4872fb1845557d484af5c09e47890ccc  -
+cube6.ine  59218da4f6db0b742bd18271c9d5f6da  -
+cube8.ine  857e4c7484b1dc5919a1629e46b856e8  -
+cubetop.ine  f963c1b731386d994e03975ac98b5c25  -
+cubocta.ine  526a2d84e3661ead8dc6cd05c090a776  -
+cyc.ine  1f3ffeef795b27e5bfc2c3de20be70f4  -
+diamond.ine  a8b60aa3d60bafed0d49a05a7a260a9c  -
+dodeca_m.ine  4a3d6132b5a0f2ee9a65e422b520bcce  -
+ex1.ine  846681e0741bb57be1673b8c9170cd49  -
+grcubocta.ine  49ed87ceef0f9dd80caaa7e9798886ab  -
+hexocta.ine  9e79ebd2ae4be939363e8a8fc9391908  -
+icododeca_m.ine  8a75d6463098ed2e2160c33f6955f3ac  -
+in0.ine  aee5c7fb5cdf7881c33ac3e379986b79  -
+in1.ine  bba9cb757ba441e33e0a3628fc13ed2c  -
+in2.ine  30fc1812a724bad238f8af157ef58729  -
+in3.ine  662e46c09123c5aa87ae82a792dc3df6  -
+in4.ine  9e3e0e301762546a26557c8bee786732  -
+in5.ine  c29524500ec4656ca26c5671df46db96  -
+infeas.ine  8dba32fa5e973205c7cd850bbcf5bb14  -
+integralpoints.ine  e8057c28540aa563ef831399d8a15654  -
+kkd18_4.ine  1736867592c3f53fb4d062ace63e6ba4  -
+kkd27_5.ine  9c376148791743bbb9d2a6b1467b8a11  -
+kkd38_6.ine  1c692bb63e7d61fad11d3b1e196eabe4  -
+metric40_11.ine  8730ceaec3e4fe9f4155779510300011  -
+metric80_16.ine  60bc723581cb4ef986f654967511b104  -
+mp5.ine  8730ceaec3e4fe9f4155779510300011  -
+mp5a.ine  8730ceaec3e4fe9f4155779510300011  -
+mp6.ine  a1d322a1bf98569f129efe4774099f0a  -
+nonfull.ine  960129e6c4b3856ca3ebc5ed2dbb0c0e  -
+origin.ine  58ac995e1d9ce9dcc73d546675db0c91  -
+project1_m.ine  5330d7ef41d67f29d6102ae6d961112f  -
+project1res.ine  e2e2c0f79a34d73dfa68f44e5f3a0b76  -
+project2_m.ine  629a0c15eed90e3f84307bad56301493  -
+project2res.ine  aaf40e2fe14795fb63f647773c0e13fe  -
+rcubocta.ine  b75aae81c225ab7a2bcaa6217384346f  -
+reg24-5.ine  cba2ab338cfdfd3d2374d66ce10dbca8  -
+rhomtria_m.ine  a351f4fc25819a278bdf2244f3f1c3a4  -
+sample.ine  1b6dfffb7025fbca392de0a359db1f01  -
+sampleh1.ine  4fd28c2bca346a3fc8ab41a49ab9eede  -
+sampleh2.ine  4f65ae11c6bc71f613ecc33989fe760c  -
+sampleh3.ine  55a3fbd3f1c495a0ec66651b901f9231  -
+sampleh4.ine  360296f0fb93ab70b1528453d6cf02ca  -
+sampleh5.ine  a93fd99d5bbfc33715db65b01fc452dc  -
+sampleh6.ine  a62303e71a549a4ae051e0a66d98bb61  -
+sampleh7.ine  3b9b5d0e083f6754a8a208e438159547  -
+trunc7.ine  989656d77040b040f10b241041f7c404  -
+tsp5.ine  214457d06fa51e69e2edd126f66e07fc  -
diff --git a/demos/ppl_lcdd/ppl_lcdd.1 b/demos/ppl_lcdd/ppl_lcdd.1
new file mode 100644
index 0000000..ff895ef
--- /dev/null
+++ b/demos/ppl_lcdd/ppl_lcdd.1
@@ -0,0 +1,66 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.11.
+.TH PPL_LCDD "1" "October 2013" "ppl_lcdd 1.1" "User Commands"
+.SH NAME
+ppl_lcdd \- a PPL-based program for vertex/facet enumeration of convex polyhedra
+.SH SYNOPSIS
+.B ppl_lcdd
+[\fIOPTION\fR]... [\fIFILE\fR]
+.SH DESCRIPTION
+Reads an H\-representation (resp., a V\-representation) of a polyhedron
+and generates a V\-representation (resp., an H\-representation) of
+the same polyhedron.
+.PP
+See the
+.IR "cddlib Reference Manual"
+for information on the file formats.
+.SH OPTIONS
+.TP
+\fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
+limits CPU usage to SECS seconds
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+produces lots of output
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
+\fB\-cPATH\fR, \fB\-\-check\fR=\fIPATH\fR
+checks if the result is equal to what is in PATH
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+.SH NOTES
+The option \fB\-CSECS\fR (\fB\-\-max\-cpu\fR=\fISECS\fR) is not available
+on some platforms.
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Komei Fukuda.
+.IR "cddlib Reference Manual",
+available (in several formats) at
+\fBhttp://www.ifor.math.ethz.ch/~fukuda/cdd_home/index.html\fR .
diff --git a/demos/ppl_lcdd/ppl_lcdd.cc b/demos/ppl_lcdd/ppl_lcdd.cc
new file mode 100644
index 0000000..8e2e2f4
--- /dev/null
+++ b/demos/ppl_lcdd/ppl_lcdd.cc
@@ -0,0 +1,1357 @@
+/* A sort of clone of the cddlib test program `lcdd'.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+//#define USE_POLKA 1
+//#define USE_POLYLIB 1
+
+#if (!defined(USE_PPL) && !defined(USE_POLKA) && !defined(USE_POLYLIB))
+#define USE_PPL 1
+#elif \
+   (defined(USE_PPL)   && defined(USE_POLKA)) \
+|| (defined(USE_PPL)   && defined(USE_POLYLIB)) \
+|| (defined(USE_POLKA) && defined(USE_POLYLIB))
+#error "Exactly one among USE_PPL, USE_POLKA and USE_POLYLIB must be defined"
+#endif
+
+#if defined(USE_PPL)
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+#error "PPL version 0.6 or following is required"
+#endif
+
+typedef PPL::C_Polyhedron POLYHEDRON_TYPE;
+
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#elif defined(USE_POLKA)
+
+#include <ppl-config.h>
+#include <gmp.h>
+
+extern "C" {
+#define bool polka_bool
+#define true polka_true
+#define false polka_false
+#define POLKA_NUM 3
+#include <polka/poly.h>
+#undef POLKA_NUM
+#undef false
+#undef true
+#undef bool
+#undef pkint_set
+#define pkint_set(a,b) mpz_set((a).rep, (b))
+}
+
+typedef poly_t* POLYHEDRON_TYPE;
+
+#elif defined(USE_POLYLIB)
+
+#include <ppl-config.h>
+#include <gmp.h>
+
+extern "C" {
+#include "polylib/polylibgmp.h"
+}
+
+// This is required (and, yes, 20000 is a magic number ;-)
+const unsigned max_constraints_or_generators = 20000;
+
+typedef Polyhedron* POLYHEDRON_TYPE;
+
+#endif
+
+#include "timings.hh"
+#include <gmpxx.h>
+#include <vector>
+#include <set>
+#include <limits>
+#include <climits>
+#include <cassert>
+#include <cstdarg>
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_HAVE_GETOPT_H
+#include <getopt.h>
+
+// Try to accommodate non-GNU implementations of `getopt()'.
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif // defined(PPL_HAVE_GETOPT_H)
+
+#ifdef PPL_HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+# include <unistd.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+#if defined(PPL_HAVE_SYS_RESOURCE_H) \
+  && PPL_CXX_SUPPORTS_LIMITING_MEMORY \
+  && (defined(SA_ONESHOT) || defined(SA_RESETHAND))
+# define PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+#endif
+
+namespace {
+
+#ifdef PPL_HAVE_GETOPT_H
+struct option long_options[] = {
+  {"max-cpu",        required_argument, 0, 'C'},
+  {"max-memory",     required_argument, 0, 'R'},
+  {"help",           no_argument,       0, 'h'},
+  {"output",         required_argument, 0, 'o'},
+  {"timings",        no_argument,       0, 't'},
+  {"verbose",        no_argument,       0, 'v'},
+#if defined(USE_PPL)
+  {"version",        no_argument,       0, 'V'},
+  {"check",          required_argument, 0, 'c'},
+#endif
+  {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]\n"
+"Reads an H-representation (resp., a V-representation) of a polyhedron\n"
+"and generates a V-representation (resp., an H-representation) of\n"
+"the same polyhedron.\n\n"
+"Options:\n"
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+"  -CSECS, --max-cpu=SECS  limits CPU usage to SECS seconds\n"
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+"  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"
+"  -h, --help              prints this help text to stdout\n"
+"  -oPATH, --output=PATH   appends output to PATH\n"
+"  -t, --timings           prints timings to stderr\n"
+"  -v, --verbose           produces lots of output\n"
+#if defined(USE_PPL)
+"  -V, --version           prints version information to stdout\n"
+"  -cPATH, --check=PATH    checks if the result is equal to what is in PATH\n"
+#endif
+#ifndef PPL_HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#if defined(USE_PPL)
+#define OPTION_LETTERS "C:R:ho:tvVc:"
+#else
+#define OPTION_LETTERS "C:R:ho:tv"
+#endif
+
+const char* program_name = 0;
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+unsigned long max_seconds_of_cpu_time = 0;
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+
+unsigned long max_bytes_of_virtual_memory = 0;
+bool print_timings = false;
+bool verbose = false;
+const char* check_file_name = 0;
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+namespace {
+
+const char* input_file_name = 0;
+std::istream* input_stream_p = 0;
+
+void
+set_input(const char* file_name) {
+  if (input_stream_p && *input_stream_p != std::cin)
+    delete input_stream_p;
+
+  if (file_name) {
+    input_stream_p = new std::ifstream(file_name, std::ios_base::in);
+    if (!*input_stream_p)
+      fatal("cannot open input file `%s'", file_name);
+    input_file_name = file_name;
+  }
+  else {
+    input_stream_p = &std::cin;
+    input_file_name = "<cin>";
+  }
+}
+
+std::istream&
+input() {
+  assert(input_stream_p != 0);
+  return *input_stream_p;
+}
+
+const char* output_file_name = 0;
+std::ostream* output_stream_p = 0;
+
+void
+set_output(const char* file_name) {
+  if (output_stream_p && *output_stream_p != std::cout)
+    delete output_stream_p;
+
+  if (file_name) {
+    output_stream_p = new std::ofstream(file_name,
+                                        std::ios_base::out
+                                        | std::ios_base::app);
+    if (!*output_stream_p)
+      fatal("cannot open output file `%s'", file_name);
+    output_file_name = file_name;
+  }
+  else {
+    output_stream_p = &std::cout;
+    output_file_name = "<cout>";
+  }
+}
+
+std::ostream&
+output() {
+  assert(output_stream_p != 0);
+  return *output_stream_p;
+}
+
+} // namespace
+
+void
+error(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: in `%s': ", program_name, input_file_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: Warning: in `%s': ", program_name, input_file_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+extern "C" typedef void (* const sig_handler_type)(int);
+
+void
+set_alarm_on_cpu_time(const unsigned long seconds, sig_handler_type handler) {
+  sigset_t mask;
+  sigemptyset(&mask);
+
+  struct sigaction s;
+  s.sa_handler = handler;
+  s.sa_mask = mask;
+#if defined(SA_ONESHOT)
+  s.sa_flags = SA_ONESHOT;
+#elif defined(SA_RESETHAND)
+  s.sa_flags = SA_RESETHAND;
+#else
+# error "Either SA_ONESHOT or SA_RESETHAND must be defined."
+#endif
+
+  if (sigaction(SIGXCPU, &s, 0) != 0)
+    fatal("sigaction failed: %s", strerror(errno));
+
+  struct rlimit t;
+  if (getrlimit(RLIMIT_CPU, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (seconds < t.rlim_cur) {
+    t.rlim_cur = seconds;
+    if (setrlimit(RLIMIT_CPU, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#endif // PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+#if PPL_CXX_SUPPORTS_LIMITING_MEMORY && PPL_HAVE_DECL_RLIMIT_AS
+
+void
+limit_virtual_memory(const unsigned long bytes) {
+  struct rlimit t;
+
+  if (getrlimit(RLIMIT_AS, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (bytes < t.rlim_cur) {
+    t.rlim_cur = bytes;
+    if (setrlimit(RLIMIT_AS, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#else
+
+void
+limit_virtual_memory(unsigned long) {
+}
+
+#endif // !PPL_HAVE_DECL_RLIMIT_AS
+
+extern "C" void
+timeout(int) {
+  try {
+    std::cerr << "TIMEOUT"
+              << std::endl;
+  }
+  catch (...) {
+  }
+
+  try {
+    if (output_file_name)
+      output() << "TIMEOUT"
+               << std::endl;
+  }
+  catch (...) {
+  }
+
+  exit(0);
+}
+
+void
+process_options(int argc, char* argv[]) {
+  while (true) {
+#ifdef PPL_HAVE_GETOPT_H
+    int option_index = 0;
+    const int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+                              &option_index);
+#else
+    const int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+    if (c == EOF)
+      break;
+
+    char* endptr;
+    long l;
+    switch (c) {
+    case 0:
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      exit(0);
+      break;
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+    case 'C':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+        fatal("a non-negative integer must follow `-C'");
+      else
+        max_seconds_of_cpu_time = static_cast<unsigned long>(l);
+      break;
+
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+
+    case 'R':
+      {
+        const unsigned long MEGA = 1024U*1024U;
+        l = strtol(optarg, &endptr, 10);
+        if (*endptr || l < 0)
+          fatal("a non-negative integer must follow `-R'");
+        else if (static_cast<unsigned long>(l) > ULONG_MAX/MEGA)
+          max_bytes_of_virtual_memory = ULONG_MAX;
+        else
+          max_bytes_of_virtual_memory = static_cast<unsigned long>(l)*MEGA;
+      }
+      break;
+
+    case 'o':
+      output_file_name = optarg;
+      break;
+
+    case 't':
+      print_timings = true;
+      break;
+
+    case 'v':
+      verbose = true;
+      break;
+
+#if defined(USE_PPL)
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      exit(0);
+      break;
+
+    case 'c':
+      check_file_name = optarg;
+      break;
+
+#endif
+
+    default:
+      abort();
+    }
+  }
+
+  if (argc - optind > 1)
+    // We have multiple input files.
+    fatal("at most one input file is accepted");
+
+  // We have one input files.
+  if (optind < argc)
+    input_file_name = argv[optind];
+  else
+    // If no input files have been specified: we will read from standard input.
+    assert(input_file_name == 0);
+}
+
+void
+maybe_start_clock() {
+  if (print_timings)
+    start_clock();
+}
+
+void
+maybe_print_clock() {
+  if (print_timings) {
+    std::cerr << input_file_name << " ";
+    print_clock(std::cerr);
+    std::cerr << std::endl;
+  }
+}
+
+
+void
+normalize(const std::vector<mpq_class>& source,
+          std::vector<mpz_class>& dest,
+          mpz_class& denominator) {
+  typedef std::vector<mpq_class>::size_type size_type;
+  const size_type n = source.size();
+  denominator = 1;
+  for (size_type i = 0; i < n; ++i)
+    mpz_lcm(denominator.get_mpz_t(),
+            denominator.get_mpz_t(),
+            source[i].get_den().get_mpz_t());
+  for (size_type i = 0; i < n; ++i)
+    dest[i] = denominator*source[i];
+}
+
+template <typename T>
+bool
+guarded_read(std::istream& in, T& x) {
+  try {
+    in >> x;
+    return !in.fail();
+  }
+  catch (...) {
+    return false;
+  }
+}
+
+template <typename T>
+void
+guarded_write(std::ostream& out, const T& x) {
+  bool succeeded = false;
+  try {
+    out << x;
+    succeeded = !out.fail();
+  }
+  catch (...) {
+  }
+  if (!succeeded)
+    fatal("cannot write to output file `%s'", output_file_name);
+}
+
+#if defined (USE_POLKA)
+template <>
+void
+guarded_write(std::ostream& out, const pkint_t& x) {
+  bool succeeded = false;
+  try {
+    succeeded = out << x.rep;
+  }
+  catch (...) {
+  }
+  if (!succeeded)
+    fatal("cannot write to output file `%s'", output_file_name);
+}
+#endif
+
+enum Number_Type { INTEGER, RATIONAL, REAL };
+
+void
+read_coefficients(std::istream& in,
+                  const Number_Type number_type,
+                  std::vector<mpz_class>& coefficients,
+                  mpz_class& denominator) {
+  typedef std::vector<mpz_class>::size_type size_type;
+  const size_type num_coefficients = coefficients.size();
+  switch (number_type) {
+  case INTEGER:
+    {
+      for (unsigned i = 0; i < num_coefficients; ++i)
+        if (!guarded_read(in, coefficients[i]))
+          error("missing or invalid integer coefficient");
+      denominator = 1;
+      break;
+    }
+  case RATIONAL:
+    {
+      std::vector<mpq_class> rational_coefficients(num_coefficients);
+      for (unsigned i = 0; i < num_coefficients; ++i)
+        if (!guarded_read(in, rational_coefficients[i]))
+          error("missing or invalid rational coefficient");
+      normalize(rational_coefficients, coefficients, denominator);
+      break;
+    }
+  case REAL:
+    {
+      std::vector<mpq_class> rational_coefficients(num_coefficients);
+      for (unsigned i = 0; i < num_coefficients; ++i) {
+        double d;
+        if (!guarded_read(in, d))
+          error("missing or invalid real coefficient");
+        rational_coefficients[i] = mpq_class(d);
+      }
+      normalize(rational_coefficients, coefficients, denominator);
+      break;
+    }
+  }
+}
+
+void
+read_indexes_set(std::istream& in,
+                 std::set<unsigned>& dest,
+                 const char* what) {
+  assert(dest.empty());
+  unsigned num_elements;
+  if (!guarded_read(in, num_elements))
+    error("missing or invalid number of set elements in `%s'", what);
+  while (num_elements--) {
+    unsigned i;
+    if (!guarded_read(in, i))
+      error("missing or invalid set element in `%s'", what);
+    dest.insert(i);
+  }
+}
+
+enum Representation { H, V };
+
+Representation
+read_polyhedron(std::istream& in, POLYHEDRON_TYPE& ph) {
+  // By default we have an H-representation.
+  Representation rep = H;
+
+  std::string s;
+  std::set<unsigned> linearity;
+  while (true) {
+    if (!guarded_read(in, s))
+      error("premature end of file while seeking for `begin'");
+
+    if (s == "V-representation")
+      rep = V;
+    else if (s == "H-representation")
+      rep = H;
+    else if (s == "linearity" || s == "equality" || s == "partial_enum") {
+      read_indexes_set(in, linearity, "linearity");
+      if (verbose) {
+        std::cerr << "Linearity: ";
+        for (std::set<unsigned>::const_iterator j = linearity.begin(),
+               linearity_end = linearity.end(); j != linearity_end; ++j)
+          std::cerr << *j << " ";
+        std::cerr << std::endl;
+      }
+    }
+    else if (s == "begin")
+      break;
+    else
+      // A comment: skip to end of line.
+      in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+  }
+
+  // Tools such as `lrs' produce "*****" instead of the number of
+  // rows.  We will accept that as valid input and compute the number
+  // of rows ourselves.
+  bool has_num_rows = false;
+  unsigned num_rows;
+  if (!guarded_read(in, s))
+    error("missing number of rows");
+  if (s != "*****") {
+    std::istringstream iss(s);
+    if (!guarded_read(iss, num_rows))
+      error("illegal number of rows `%s' (\"*****\" would be accepted)",
+            s.c_str());
+    has_num_rows = true;
+  }
+
+  unsigned num_columns;
+  if (!guarded_read(in, num_columns))
+    error("illegal or missing number of columns");
+  const unsigned space_dim = num_columns - 1;
+
+  if (!guarded_read(in, s))
+    error("missing number type");
+  Number_Type number_type = INTEGER;
+  if (s == "integer")
+    number_type = INTEGER;
+  else if (s == "rational")
+    number_type = RATIONAL;
+  else if (s == "real")
+    number_type = REAL;
+  else
+    error("illegal number type `%s'", s.c_str());
+
+  if (verbose) {
+    std::cerr << "Problem dimension: ";
+    if (has_num_rows)
+      std::cerr << num_rows;
+    else
+      std::cerr << '?';
+    std::cerr << " x " << num_columns
+              << "; number type: " << s
+              << std::endl;
+  }
+
+#if defined(USE_PPL)
+
+  PPL::Constraint_System cs;
+  PPL::Generator_System gs;
+
+#elif defined(USE_POLKA)
+
+  // Initialize polka in non-strict mode.
+  // 25000 is a magic number: with 22500 Polka 2.0.2 dies on
+  // mit31-20.ine with the error "Chernikova: out of table space".
+  polka_initialize(polka_false, space_dim, 25000);
+  // Declare and allocate a Polka matrix.
+  matrix_t* mat = matrix_alloc(num_rows+1, space_dim+2, polka_false);
+
+#elif defined(USE_POLYLIB)
+
+  // Declare and allocate a PolyLib matrix.
+  Matrix* mat = Matrix_Alloc(num_rows+1, space_dim+2);
+
+#endif
+
+  unsigned row = 0;
+  std::set<unsigned>::iterator linearity_end = linearity.end();
+  if (rep == V) {
+    // The V representation allows for `space_dim' coordinates.
+    std::vector<mpz_class> coefficients(space_dim);
+    mpz_class denominator;
+    bool has_a_point = false;
+    for (row = 0; !has_num_rows || row < num_rows; ++row) {
+      int vertex_marker;
+      if (!has_num_rows) {
+        // Must be prepared to read an "end" here.
+        if (!guarded_read(in, s))
+          error("missing vertex marker");
+        if (s == "end")
+          break;
+        std::istringstream iss(s);
+        if (!guarded_read(iss, vertex_marker)
+            || vertex_marker < 0 || vertex_marker > 1)
+          error("illegal vertex marker `%s'", s.c_str());
+      }
+      else if (!guarded_read(in, vertex_marker)
+                 || vertex_marker < 0 || vertex_marker > 1)
+        error("illegal or missing vertex marker");
+      read_coefficients(in, number_type, coefficients, denominator);
+
+#if defined(USE_PPL)
+      // PPL variables have indices 0, 1, ..., space_dim-1.
+      PPL::Linear_Expression e;
+      for (unsigned j = space_dim; j-- > 0; )
+        e += coefficients[j] * PPL::Variable(j);
+#elif defined(USE_POLKA)
+      // NewPolka variables have indices 2, 3, ..., space_dim+1.
+      for (unsigned j = space_dim; j-- > 0; )
+        pkint_set(mat->p[row][j+2], coefficients[j].get_mpz_t());
+#elif defined(USE_POLYLIB)
+      // PolyLib variables have indices 1, 2, ..., space_dim.
+      for (unsigned j = space_dim; j-- > 0; )
+        value_assign(mat->p[row][j+1], coefficients[j].get_mpz_t());
+#endif
+      if (vertex_marker == 1) {
+        assert(linearity.find(row+1) == linearity_end);
+#if defined(USE_PPL)
+        gs.insert(point(e, denominator));
+#elif defined(USE_POLKA)
+        // NewPolka stores the generator kind at index 0 (1 = ray/point)
+        // and the common denominator at index 1.
+        pkint_set_si(mat->p[row][0], 1);
+        pkint_set(mat->p[row][1], denominator.get_mpz_t());
+#elif defined(USE_POLYLIB)
+        // PolyLib stores the generator kind at index 0 (1 = ray/point)
+        // and the common denominator at index space_dim+1.
+        value_set_si(mat->p[row][0], 1);
+        value_assign(mat->p[row][space_dim+1], denominator.get_mpz_t());
+#endif
+        has_a_point = true;
+      }
+      else if (linearity.find(row+1) != linearity_end) {
+#if defined(USE_PPL)
+        gs.insert(line(e));
+#elif defined(USE_POLKA)
+        // NewPolka stores the generator kind at index 0 (0 = line)
+        // and the common denominator at index 1 (0 for ray/line).
+        pkint_set_si(mat->p[row][0], 0);
+        pkint_set_si(mat->p[row][1], 0);
+#elif defined(USE_POLYLIB)
+        // PolyLib stores the generator kind at index 0 (0 = line)
+        // and the common denominator at index space_dim+1 (0 for ray/line).
+        value_set_si(mat->p[row][0], 0);
+        value_set_si(mat->p[row][space_dim+1], 0);
+#endif
+      }
+      else {
+#if defined(USE_PPL)
+        gs.insert(ray(e));
+#elif defined(USE_POLKA)
+        // NewPolka stores the generator kind at index 0 (1 = ray/point)
+        // and the common denominator at index 1 (0 for ray/line).
+        pkint_set_si(mat->p[row][0], 1);
+        pkint_set_si(mat->p[row][1], 0);
+#elif defined(USE_POLYLIB)
+        // PolyLib stores the generator kind at index 0 (1 = ray/point)
+        // and the common denominator at index space_dim+1 (0 for ray/line).
+        value_set_si(mat->p[row][0], 1);
+        value_set_si(mat->p[row][space_dim+1], 0);
+#endif
+      }
+    }
+    // Every non-empty generator system must have at least one point.
+    if (row > 0 && !has_a_point) {
+#if defined(USE_PPL)
+      gs.insert(PPL::point());
+#elif defined(USE_POLKA)
+      // Add the origin as a point.
+      pkint_set_si(mat->p[num_rows][0], 1);
+      pkint_set_si(mat->p[num_rows][1], 1);
+      for (unsigned j = space_dim; j-- > 0; )
+        pkint_set_si(mat->p[num_rows][j+2], 0);
+      ++num_rows;
+#elif defined(USE_POLYLIB)
+      // Add the origin as a point.
+      value_set_si(mat->p[num_rows][0], 1);
+      value_set_si(mat->p[num_rows][space_dim+1], 1);
+      for (unsigned j = space_dim; j-- > 0; )
+        value_set_si(mat->p[num_rows][j+1], 0);
+      ++num_rows;
+#endif
+    }
+
+    if (verbose) {
+      if (!has_num_rows)
+        std::cerr << "Problem dimension: " << row << " x " << num_columns
+                  << "; number type: " << s
+                  << std::endl;
+
+#if defined(USE_PPL)
+      using namespace PPL::IO_Operators;
+      std::cerr << "Generator system:\n" << gs << std::endl;
+#elif defined(USE_POLKA)
+      // Polka can only print to stdout.
+      printf("Generator system:\n");
+      matrix_print(mat);
+#elif defined(USE_POLYLIB)
+      fprintf(stderr, "Generator system:\n");
+      Matrix_Print(stderr, 0, mat);
+#endif
+    }
+  }
+  else {
+    assert(rep == H);
+    // The H representation stores the inhomogeneous term at index 0,
+    // and the variables' coefficients at indices 1, 2, ..., space_dim.
+    std::vector<mpz_class> coefficients(space_dim+1);
+    mpz_class denominator;
+    for (row = 0; !has_num_rows || row < num_rows; ++row) {
+      if (!has_num_rows) {
+        // Must be prepared to read an "end" here.
+        std::getline(in, s);
+        if (!in)
+          error("premature end of file while seeking "
+                "for coefficients or `end'");
+        if (s.substr(0, 2) == "end")
+          break;
+        std::istringstream iss(s);
+        read_coefficients(iss, number_type, coefficients, denominator);
+      }
+      else
+        read_coefficients(in, number_type, coefficients, denominator);
+
+#if defined(USE_PPL)
+      // PPL variables have indices 0, 1, ..., space_dim-1.
+      PPL::Linear_Expression e;
+      for (unsigned j = num_columns; j-- > 1; )
+        e += coefficients[j] * PPL::Variable(j-1);
+      e += coefficients[0];
+#elif defined(USE_POLKA)
+      // NewPolka variables have indices 2, 3, ..., space_dim+1.
+      for (unsigned j = num_columns; j-- > 1; )
+        pkint_set(mat->p[row][j+1], coefficients[j].get_mpz_t());
+      // NewPolka stores the inhomogeneous term at index 1.
+      pkint_set(mat->p[row][1], coefficients[0].get_mpz_t());
+#elif defined(USE_POLYLIB)
+      // PolyLib variables have indices 1, 2, ..., space_dim.
+      for (unsigned j = num_columns; j-- > 1; )
+        value_assign(mat->p[row][j], coefficients[j].get_mpz_t());
+      // PolyLib stores the inhomogeneous term at index space_dim+1.
+      value_assign(mat->p[row][space_dim+1], coefficients[0].get_mpz_t());
+#endif
+
+      if (linearity.find(row+1) != linearity_end) {
+#if defined(USE_PPL)
+        cs.insert(e == 0);
+#elif defined(USE_POLKA)
+        // NewPolka stores the constraint kind at index 0 (0 = equality).
+        pkint_set_si(mat->p[row][0], 0);
+#elif defined(USE_POLYLIB)
+        // PolyLib stores the constraint kind at index 0 (0 = equality).
+        value_set_si(mat->p[row][0], 0);
+#endif
+      }
+      else {
+#if defined(USE_PPL)
+        cs.insert(e >= 0);
+#elif defined(USE_POLKA)
+        // NewPolka stores the constraint kind at index 0 (1 = inequality).
+        pkint_set_si(mat->p[row][0], 1);
+#elif defined(USE_POLYLIB)
+        // PolyLib stores the constraint kind at index 0 (1 = inequality).
+        value_set_si(mat->p[row][0], 1);
+#endif
+      }
+    }
+
+    if (verbose) {
+      if (!has_num_rows)
+        std::cerr << "Problem dimension: " << row << " x " << num_columns
+                  << "; number type: " << s
+                  << std::endl;
+
+#if defined(USE_PPL)
+      using namespace PPL::IO_Operators;
+      std::cerr << "Constraint system:\n" << cs << std::endl;
+#elif defined(USE_POLKA)
+      // Polka can only print to stdout.
+      printf("Constraint system:\n");
+      matrix_print(mat);
+#elif defined(USE_POLYLIB)
+      fprintf(stderr, "Constraint system:\n");
+      Matrix_Print(stderr, 0, mat);
+#endif
+    }
+  }
+
+  if (has_num_rows) {
+    if (!guarded_read(in, s))
+      error("premature end of file while seeking for `end'");
+
+    if (s != "end")
+      error("`%s' found while seeking for `end'", s.c_str());
+  }
+
+  if (rep == H) {
+#if defined(USE_PPL)
+    ph = PPL::C_Polyhedron(cs, PPL::Recycle_Input());
+#elif defined(USE_POLKA)
+    ph = poly_universe(space_dim);
+    ph = poly_add_constraints_lazy(ph, mat);
+#elif defined(USE_POLYLIB)
+    ph = Universe_Polyhedron(space_dim);
+
+    // PolyLib is not lazy: it will perform the conversion immediately.
+    maybe_start_clock();
+    ph = AddConstraints(mat->p[0], num_rows, ph,
+                        max_constraints_or_generators);
+    maybe_print_clock();
+#endif
+  }
+  else {
+#if defined(USE_PPL)
+    ph = PPL::C_Polyhedron(gs, PPL::Recycle_Input());
+#elif defined(USE_POLKA)
+    ph = poly_of_frames(mat);
+#elif defined(USE_POLYLIB)
+    ph = Empty_Polyhedron(space_dim);
+
+    // PolyLib is not lazy: it will perform the conversion immediately.
+    maybe_start_clock();
+    ph = AddRays(mat->p[0], num_rows, ph,
+                 max_constraints_or_generators);
+    maybe_print_clock();
+#endif
+  }
+  return rep;
+}
+
+void
+write_polyhedron(std::ostream& out,
+                 const POLYHEDRON_TYPE& ph,
+                 const Representation rep) {
+  if (rep == H)
+    guarded_write(out, "H-representation\n");
+  else {
+    assert(rep == V);
+    guarded_write(out, "V-representation\n");
+  }
+
+  std::set<unsigned> linearity;
+#if defined(USE_PPL)
+  unsigned num_rows = 0;
+  if (rep == H) {
+    const PPL::Constraint_System& cs = ph.constraints();
+    for (PPL::Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i) {
+      ++num_rows;
+      if (i->is_equality())
+        linearity.insert(linearity.end(), num_rows);
+    }
+  }
+  else {
+    const PPL::Generator_System& gs = ph.generators();
+    for (PPL::Generator_System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i) {
+      ++num_rows;
+      if (i->is_line())
+        linearity.insert(linearity.end(), num_rows);
+    }
+  }
+#elif defined(USE_POLKA)
+  // Don't even try to get frames if the polyhedron is empty.
+  const matrix_t* mat = (rep == H)
+    ? poly_constraints(ph)
+    : (poly_is_empty(ph) ? 0 : poly_frames(ph));
+  const unsigned num_rows = (rep == V && poly_is_empty(ph)) ? 0 : mat->nbrows;
+  for (unsigned i = 0; i < num_rows; ++i)
+    if (pkint_sgn(mat->p[i][0]) == 0)
+      linearity.insert(linearity.end(), i+1);
+#elif defined(USE_POLYLIB)
+  const Matrix* mat = (rep == H)
+    ? Polyhedron2Constraints(ph)
+    : Polyhedron2Rays(ph);
+  const unsigned num_rows = mat->NbRows;
+  for (unsigned i = 0; i < num_rows; ++i)
+    if (value_sign(mat->p[i][0]) == 0)
+      linearity.insert(linearity.end(), i+1);
+#endif
+
+  if (!linearity.empty()) {
+    guarded_write(out, "linearity ");
+    guarded_write(out, linearity.size());
+    for (std::set<unsigned>::const_iterator j = linearity.begin(),
+           linearity_end = linearity.end(); j != linearity_end; ++j) {
+      guarded_write(out, ' ');
+      guarded_write(out, *j);
+    }
+    guarded_write(out, '\n');
+  }
+
+#if defined(USE_PPL)
+  const PPL::dimension_type space_dim = ph.space_dimension();
+#elif defined(USE_POLKA)
+  const unsigned space_dim = poly_dimension(ph);
+#elif defined(USE_POLYLIB)
+  const unsigned space_dim = mat->NbColumns - 2;
+#endif
+
+  guarded_write(out, "begin\n");
+  guarded_write(out, num_rows);
+  guarded_write(out, ' ');
+  guarded_write(out, space_dim+1);
+  guarded_write(out, ' ');
+  if (rep == H)
+    guarded_write(out, "integer\n");
+  else
+    guarded_write(out, "rational\n");
+
+#if defined(USE_PPL)
+  if (rep == H) {
+    const PPL::Constraint_System& cs = ph.constraints();
+    for (PPL::Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i) {
+      const PPL::Constraint& c = *i;
+      guarded_write(out, c.inhomogeneous_term());
+      for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+        guarded_write(out, ' ');
+        guarded_write(out, c.coefficient(PPL::Variable(j)));
+      }
+      guarded_write(out, '\n');
+    }
+  }
+  else {
+    assert(rep == V);
+    const PPL::Generator_System& gs = ph.generators();
+    for (PPL::Generator_System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i) {
+      const PPL::Generator& g = *i;
+      if (g.is_point()) {
+        guarded_write(out, '1');
+        const PPL::Coefficient& divisor = g.divisor();
+        for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+          guarded_write(out, ' ');
+          if (g.coefficient(PPL::Variable(j)) == 0)
+            guarded_write(out, '0');
+          else {
+            mpz_class numer, denom;
+            PPL::assign_r(numer,
+                        g.coefficient(PPL::Variable(j)),
+                        PPL::ROUND_NOT_NEEDED);
+            PPL::assign_r(denom, divisor, PPL::ROUND_NOT_NEEDED);
+            guarded_write(out, mpq_class(numer, denom));
+          }
+        }
+      }
+      else {
+        // `g' is a ray or a line.
+        guarded_write(out, '0');
+        for (PPL::dimension_type j = 0; j < space_dim; ++j) {
+          guarded_write(out, ' ');
+          guarded_write(out, g.coefficient(PPL::Variable(j)));
+        }
+      }
+      guarded_write(out, '\n');
+    }
+  }
+#elif defined(USE_POLKA)
+  if (rep == H) {
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const pkint_t* c = mat->p[i];
+      // The inhomogeneous term.
+      guarded_write(out, c[1]);
+      // The variables' coefficients.
+      for (unsigned j = 0; j < space_dim; ++j) {
+        guarded_write(out, ' ');
+        guarded_write(out, c[j+2]);
+      }
+      guarded_write(out, '\n');
+    }
+  }
+  else {
+    assert(rep == V);
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const pkint_t* g = mat->p[i];
+      guarded_write(out, g[0]);
+      const pkint_t divisor = g[1];
+      if (pkint_sgn(divisor) != 0)
+        // `g' is a point.
+        for (unsigned j = 0; j < space_dim; ++j) {
+          guarded_write(out, ' ');
+          if (pkint_sgn(g[j+2]) == 0)
+            guarded_write(out, '0');
+          else
+            guarded_write(out, mpq_class(mpz_class(g[j+2].rep),
+                                         mpz_class(divisor.rep)));
+        }
+      else
+        // `g' is a ray or a line.
+        for (unsigned j = 0; j < space_dim; ++j) {
+          guarded_write(out, ' ');
+          guarded_write(out, g[j+2]);
+        }
+      guarded_write(out, '\n');
+    }
+  }
+#elif defined (USE_POLYLIB)
+  if (rep == H) {
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const Value* c = mat->p[i];
+      // The inhomogeneous term.
+      guarded_write(out, c[space_dim+1]);
+      // The variables' coefficients.
+      for (unsigned j = 0; j < space_dim; ++j) {
+        guarded_write(out, ' ');
+        guarded_write(out, c[j+1]);
+      }
+      guarded_write(out, '\n');
+    }
+  }
+  else {
+    assert(rep == V);
+    for (unsigned i = 0; i < num_rows; ++i) {
+      const Value* g = mat->p[i];
+      guarded_write(out, g[0]);
+      const Value& divisor = g[space_dim+1];
+      if (value_sign(divisor) != 0)
+        // `g' is a point.
+        for (unsigned j = 0; j < space_dim; ++j) {
+          guarded_write(out, ' ');
+          if (value_sign(g[j+1]) == 0)
+            guarded_write(out, '0');
+          else
+            guarded_write(out, mpq_class(mpz_class(g[j+1]),
+                                         mpz_class(divisor)));
+        }
+      else
+        // `g' is a ray or a line.
+        for (unsigned j = 0; j < space_dim; ++j) {
+          guarded_write(out, ' ');
+          guarded_write(out, g[j+1]);
+        }
+      guarded_write(out, '\n');
+    }
+  }
+#endif
+  guarded_write(out, "end\n");
+
+  // Flush `out'.
+  bool flush_succeeded = false;
+  try {
+    out.flush();
+    flush_succeeded = !out.fail();
+  }
+  catch (...) {
+  }
+  if (!flush_succeeded)
+    fatal("cannot write to output file `%s'", output_file_name);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+  program_name = argv[0];
+
+#if defined(USE_PPL)
+  if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+          PPL_VERSION, PPL::version());
+
+  if (verbose)
+    std::cerr << "Parma Polyhedra Library version:\n" << PPL::version()
+              << "\n\nParma Polyhedra Library banner:\n" << PPL::banner()
+              << std::endl;
+#endif
+
+  // Process command line options.
+  process_options(argc, argv);
+
+#ifdef PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME
+
+  if (max_seconds_of_cpu_time > 0)
+    set_alarm_on_cpu_time(max_seconds_of_cpu_time, &timeout);
+
+#endif // defined(PPL_LCDD_SUPPORTS_LIMIT_ON_CPU_TIME)
+
+  if (max_bytes_of_virtual_memory > 0)
+    limit_virtual_memory(max_bytes_of_virtual_memory);
+
+  // Set up the input and output streams.
+  set_input(input_file_name);
+  set_output(output_file_name);
+
+  POLYHEDRON_TYPE ph;
+  const Representation rep = read_polyhedron(input(), ph);
+
+  enum Command { None, H_to_V, V_to_H };
+  Command command = None;
+
+  // Warn for misplaced linearity commands, and ignore all what follows.
+  std::string s;
+  while (guarded_read(input(), s)) {
+    if (s == "linearity" || s == "equality" || s == "partial_enum")
+      error("the `linearity' command must occur before `begin'");
+    input().ignore(std::numeric_limits<std::streamsize>::max(), '\n');
+  }
+
+
+#if defined(USE_PPL) || defined(USE_POLKA)
+  maybe_start_clock();
+#endif
+
+  // Compute the dual representation.
+  if (rep == V) {
+    command = V_to_H;
+#if defined(USE_PPL)
+    ph.minimized_constraints();
+#elif defined(USE_POLKA)
+    poly_minimize(ph);
+#endif
+  }
+  else {
+    command = H_to_V;
+#if defined(USE_PPL)
+    ph.minimized_generators();
+#elif defined(USE_POLKA)
+    poly_minimize(ph);
+#endif
+  }
+
+#if defined(USE_PPL) || defined(USE_POLKA)
+  maybe_print_clock();
+#endif
+
+  // Write the result of the conversion.
+  if (rep == V)
+    write_polyhedron(output(), ph, H);
+  else
+    write_polyhedron(output(), ph, V);
+
+#if defined(USE_PPL)
+  // Check the result, if requested to do so.
+  if (check_file_name) {
+    set_input(check_file_name);
+    // Read the polyhedron containing the expected result.
+    PPL::C_Polyhedron e_ph;
+    const Representation e_rep = read_polyhedron(input(), e_ph);
+
+    switch (command) {
+    case H_to_V:
+      {
+        if (e_rep == H)
+          warning("checking an H-to-V conversion with an H representation");
+
+        // Count the number of generators of `ph'.
+        unsigned ph_num_generators = 0;
+        const PPL::Generator_System& ph_gs = ph.generators();
+        for (PPL::Generator_System::const_iterator i = ph_gs.begin(),
+               ph_gs_end = ph_gs.end(); i != ph_gs_end; ++i)
+          ++ph_num_generators;
+
+        // Count the number of generators of `e_ph'.
+        unsigned e_ph_num_generators = 0;
+        const PPL::Generator_System& e_ph_gs = e_ph.generators();
+        for (PPL::Generator_System::const_iterator i = e_ph_gs.begin(),
+               e_ph_gs_end = e_ph_gs.end(); i != e_ph_gs_end; ++i)
+          ++e_ph_num_generators;
+
+        // If the polyhedra differ, that is the problem.
+        if (ph != e_ph) {
+          if (verbose)
+            std::cerr << "Check failed: polyhedra differ"
+                      << std::endl;
+          return 1;
+        }
+        else if (ph_num_generators != e_ph_num_generators)
+          // If we have different number of generators, we fail.
+          std::cerr << "Check failed: different number of generators:\n"
+                    << "expected " << e_ph_num_generators
+                    << ", obtained " << ph_num_generators
+                    << std::endl;
+        break;
+      }
+    case V_to_H:
+      {
+        if (e_rep == V)
+          warning("checking an V-to-H conversion with a V representation");
+
+        // Count the number of constraints of `ph'.
+        unsigned ph_num_constraints = 0;
+        const PPL::Constraint_System& ph_cs = ph.constraints();
+        for (PPL::Constraint_System::const_iterator i = ph_cs.begin(),
+               ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i)
+          ++ph_num_constraints;
+
+        // Count the number of constraints of `e_ph'.
+        unsigned e_ph_num_constraints = 0;
+        const PPL::Constraint_System& e_ph_cs = e_ph.constraints();
+        for (PPL::Constraint_System::const_iterator i = e_ph_cs.begin(),
+               e_ph_cs_end = e_ph_cs.end(); i != e_ph_cs_end; ++i)
+          ++e_ph_num_constraints;
+
+        // If the polyhedra differ, that is the problem.
+        if (ph != e_ph) {
+          if (verbose)
+            std::cerr << "Check failed: polyhedra differ"
+                      << std::endl;
+          return 1;
+        }
+        else if (ph_num_constraints != e_ph_num_constraints)
+          // If we have different number of constraints, we fail.
+          std::cerr << "Check failed: different number of constraints:\n"
+                    << "expected " << e_ph_num_constraints
+                    << ", obtained " << ph_num_constraints
+                    << std::endl;
+        break;
+      }
+    case None:
+      break;
+    }
+  }
+#endif
+
+#if defined(USE_POLKA)
+    // Finalize the library.
+    polka_finalize();
+#endif
+
+  return 0;
+}
+catch (const std::bad_alloc&) {
+  fatal("out of memory");
+  exit(1);
+}
+catch (const std::overflow_error& e) {
+  fatal("arithmetic overflow (%s)", e.what());
+  exit(1);
+}
+catch (...) {
+  fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+  exit(1);
+}
diff --git a/demos/ppl_lpsol/Makefile.am b/demos/ppl_lpsol/Makefile.am
new file mode 100644
index 0000000..2291d5b
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.am
@@ -0,0 +1,334 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = examples
+
+EXTRA_DIST = \
+ppl_lpsol.c \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+dist_man_MANS = \
+ppl_lpsol.1
+
+if BUILD_C_INTERFACE
+if HAVE_GLPK
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_lpsol
+
+# dummy.cc serves the only purpose to force linking using the C++ compiler.
+ppl_lpsol_SOURCES = \
+ppl_lpsol.c \
+dummy.cc
+
+if GCC
+
+if ICC
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ppl_lpsol_CFLAGS = -std=gnu89
+
+else !ICC
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ppl_lpsol_CFLAGS = -pedantic -std=gnu89
+
+endif !ICC
+
+endif GCC
+
+ppl_lpsol_LDADD = \
+libglpk_set_d_eps.a \
+-lglpk \
+$(top_builddir)/interfaces/C/libppl_c.la \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+noinst_LIBRARIES = libglpk_set_d_eps.a
+libglpk_set_d_eps_a_SOURCES = \
+glpk_set_d_eps.c
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+afiro.mps
+
+TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \
+opt1217.mps \
+rout.mps
+
+TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+pk1.mps \
+rout.mps
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+CHECK_OPTION =
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+CHECK_OPTION = -c
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM = \
+adlittle.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+egout.mps \
+kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ship08l.mps\
+$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \
+$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \
+egout.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+pk1.mps \
+rout.mps
+
+LP_PROBLEMS = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+kb2.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps
+
+DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \
+adlittle.mps \
+boeing1.mps \
+boeing2.mps \
+rout.mps
+
+INDIVIDUALLY_CHECKED_PROBLEMS = \
+boeing1.mps \
+boeing2.mps \
+ex12.mps \
+mas74.mps \
+modglob.mps
+
+if HOST_OS_CYGWIN
+
+DIFF_COMMAND = \
+$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_CYGWIN
+
+if HOST_OS_DARWIN
+
+DIFF_COMMAND = \
+$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_DARWIN
+
+if HOST_OS_SOLARIS
+
+DIFF_COMMAND = \
+$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) \
+| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >expected_optima \
+&& $(EGREP) "^Optimum value: " obtained \
+| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_SOLARIS
+
+if HOST_OS_MINGW
+
+DIFF_COMMAND = \
+tr -d '\015' <obtained \
+| sed -e "s/ppl_lpsol.exe/ppl_lpsol/g" -e "s/1e+012/1e+12/g" \
+| diff $(srcdir)/$(EXPECTED) -
+
+else !HOST_OS_MINGW
+
+DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+
+endif !HOST_OS_MINGW
+
+endif !HOST_OS_SOLARIS
+
+endif !HOST_OS_DARWIN
+
+endif !HOST_OS_CYGWIN
+
+# NOTE: use exact steepest-edge pricing (-p1) instead float-based one.
+# This has an efficiency penalty, but it guarantees deterministic
+# results across different architectures.
+SIMPLEX = ./ppl_lpsol$(EXEEXT) -s -p1 $(CHECK_OPTION) -oobtained
+SIMPLEX_NOCHECK = ./ppl_lpsol$(EXEEXT) -s -p1 -oobtained
+ECHO_SIMPLEX = echo "***" $(SIMPLEX)
+ECHO_SIMPLEX_NOCHECK = echo "***" $(SIMPLEX_NOCHECK)
+
+check-local: ppl_lpsol$(EXEEXT)
+	echo $(ECHO_N) "$(ECHO_C)" >obtained
+	echo $(LP_PROBLEMS) >lp_problems
+	echo $(INDIVIDUALLY_CHECKED_PROBLEMS) >individually_checked_problems
+	export LC_ALL=C; \
+	echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples
+	-for path in $(srcdir)/examples/*.mps; \
+	do \
+	  file=`basename $$path`; \
+	  $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+	  $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	  $(ECHO_SIMPLEX) "-n $$m $$file" >>obtained; \
+	  $(SIMPLEX) -n $$path >/dev/null; \
+	done
+	echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples
+	-for path in $(srcdir)/examples/*.mps; \
+	do \
+	  file=`basename $$path`; \
+	  $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+	  $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	  for m in -m -M; \
+	  do \
+	    $(ECHO_SIMPLEX) "$$m $$file" >>obtained; \
+	    $(SIMPLEX) $$m $$path >/dev/null; \
+	  done \
+	done
+	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+	echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location
+	-for path in $(srcdir)/examples/*.mps; \
+	do \
+	 file=`basename $$path`; \
+	 $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+	 $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	 verbosity=''; \
+	 $(FGREP) $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \
+	 for m in -m -M; \
+	 do \
+	    $(ECHO_SIMPLEX) "-r $$m $$file" >>obtained; \
+	    $(SIMPLEX) -r $$verbosity $$m $$path >/dev/null; \
+	  done \
+	done
+	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+	-for path in $(srcdir)/examples/*.mps; \
+	do \
+	  file=`basename $$path`; \
+	  $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	  echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \
+	  ./ppl_lpsol$(EXEEXT) -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+	done
+	$(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000518 boeing1.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -m -c0.00000000518 $(srcdir)/examples/boeing1.mps >/dev/null
+	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0000000105 boeing1.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -M -c0.0000000105 $(srcdir)/examples/boeing1.mps $$m >/dev/null
+	$(ECHO_SIMPLEX) "-n boeing1.mps" >>obtained
+	-$(SIMPLEX) -n $(srcdir)/examples/boeing1.mps >/dev/null
+	$(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000863 boeing2.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -m -c0.00000000863 $(srcdir)/examples/boeing2.mps >/dev/null
+	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.00000000213 boeing2.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -M -c0.00000000213 $(srcdir)/examples/boeing2.mps $$m >/dev/null
+	$(ECHO_SIMPLEX) "-n boeing2.mps" >>obtained
+	-$(SIMPLEX) -n $(srcdir)/examples/boeing2.mps >/dev/null
+
+	$(ECHO_SIMPLEX) "-r -m mas74.mps" >>obtained
+	-$(SIMPLEX) -r -m $(srcdir)/examples/mas74.mps >/dev/null
+	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000123 mas74.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas74.mps $$m >/dev/null
+	$(ECHO_SIMPLEX) "-n mas74.mps" >>obtained
+	-$(SIMPLEX) -n $(srcdir)/examples/mas74.mps >/dev/null
+	$(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.0000273 modglob.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -m -c0.0000273 $(srcdir)/examples/modglob.mps >/dev/null
+	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0290 modglob.mps" >>obtained
+	-$(SIMPLEX_NOCHECK) -r -M -c0.0290 $(srcdir)/examples/modglob.mps >/dev/null
+	$(ECHO_SIMPLEX) "-n modglob.mps" >>obtained
+	-$(SIMPLEX) -n $(srcdir)/examples/modglob.mps >/dev/null
+	$(DIFF_COMMAND)
+
+endif HAVE_GLPK
+endif BUILD_C_INTERFACE
+
+MOSTLYCLEANFILES = \
+individually_checked_problems \
+do_not_output_location \
+expected_optima \
+lp_problems \
+obtained \
+obtained_optima \
+tough_examples
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
diff --git a/demos/ppl_lpsol/Makefile.in b/demos/ppl_lpsol/Makefile.in
new file mode 100644
index 0000000..6c0b8e7
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.in
@@ -0,0 +1,1272 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at bin_PROGRAMS =  \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	ppl_lpsol$(EXEEXT)
+subdir = demos/ppl_lpsol
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libglpk_set_d_eps_a_AR = $(AR) $(ARFLAGS)
+libglpk_set_d_eps_a_LIBADD =
+am__libglpk_set_d_eps_a_SOURCES_DIST = glpk_set_d_eps.c
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at am_libglpk_set_d_eps_a_OBJECTS = glpk_set_d_eps.$(OBJEXT)
+libglpk_set_d_eps_a_OBJECTS = $(am_libglpk_set_d_eps_a_OBJECTS)
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__ppl_lpsol_SOURCES_DIST = ppl_lpsol.c dummy.cc
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at am_ppl_lpsol_OBJECTS = ppl_lpsol-ppl_lpsol.$(OBJEXT) \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	dummy.$(OBJEXT)
+ppl_lpsol_OBJECTS = $(am_ppl_lpsol_OBJECTS)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_DEPENDENCIES =  \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	libglpk_set_d_eps.a \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(libglpk_set_d_eps_a_SOURCES) $(ppl_lpsol_SOURCES)
+DIST_SOURCES = $(am__libglpk_set_d_eps_a_SOURCES_DIST) \
+	$(am__ppl_lpsol_SOURCES_DIST)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = examples
+EXTRA_DIST = \
+ppl_lpsol.c \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+dist_man_MANS = \
+ppl_lpsol.1
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at AM_CPPFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at -I$(top_builddir)/interfaces/C \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_includes@
+
+
+# dummy.cc serves the only purpose to force linking using the C++ compiler.
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_SOURCES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol.c \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at dummy.cc
+
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ at BUILD_C_INTERFACE_TRUE@@GCC_TRUE@@HAVE_GLPK_TRUE@@ICC_FALSE at ppl_lpsol_CFLAGS = -pedantic -std=gnu89
+
+# We cannot use -std=c89 because of the definition of sigaction in <signal.h>.
+ at BUILD_C_INTERFACE_TRUE@@GCC_TRUE@@HAVE_GLPK_TRUE@@ICC_TRUE at ppl_lpsol_CFLAGS = -std=gnu89
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_LDADD = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at libglpk_set_d_eps.a \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at -lglpk \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@extra_libraries@
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noinst_LIBRARIES = libglpk_set_d_eps.a
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at libglpk_set_d_eps_a_SOURCES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at glpk_set_d_eps.c
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps
+
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED = \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION = -c
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at CHECK_OPTION = 
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_ENUM = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at egout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at lseu.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at p0033.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps\
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_SIMPLEX_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@$(TOUGH_EXAMPLES_FOR_BB_SATISFIABILTY_IF_ASSERTIONS_ENABLED)
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at TOUGH_EXAMPLES_FOR_BB_OPTIMALITY = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at egout.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at lseu.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at markshare2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas76.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at noswot.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at opt1217.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at pk1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at LP_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at afiro.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at bgprtr.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at blend.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sample.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc105.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50a.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at sc50b.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ship08l.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at adlittle.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at rout.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at INDIVIDUALLY_CHECKED_PROBLEMS = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing1.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at boeing2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ex12.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mas74.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at modglob.mps
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE@@HOST_OS_SOLARIS_FALSE at DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE at tr -d '\015' <obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE@| sed -e "s/ppl_lpsol.exe/ppl_lpsol/g" -e "s/1e+012/1e+12/g" \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@@HOST_OS_SOLARIS_FALSE@| diff $(srcdir)/$(EXPECTED) -
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& $(EGREP) "^Optimum value: " obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@| $(SED) -e "s/^Optimum value: \(-*[0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\.][0-9\\.][0-9\.][0-9\.]\)[0-9]*$/Optimum value: \1/g" >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_FALSE@@HOST_OS_SOLARIS_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE at DIFF_COMMAND = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@$(EGREP) "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& $(EGREP) "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+
+# NOTE: use exact steepest-edge pricing (-p1) instead float-based one.
+# This has an efficiency penalty, but it guarantees deterministic
+# results across different architectures.
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at SIMPLEX = ./ppl_lpsol$(EXEEXT) -s -p1 $(CHECK_OPTION) -oobtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at SIMPLEX_NOCHECK = ./ppl_lpsol$(EXEEXT) -s -p1 -oobtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ECHO_SIMPLEX = echo "***" $(SIMPLEX)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ECHO_SIMPLEX_NOCHECK = echo "***" $(SIMPLEX_NOCHECK)
+MOSTLYCLEANFILES = \
+individually_checked_problems \
+do_not_output_location \
+expected_optima \
+lp_problems \
+obtained \
+obtained_optima \
+tough_examples
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libglpk_set_d_eps.a: $(libglpk_set_d_eps_a_OBJECTS) $(libglpk_set_d_eps_a_DEPENDENCIES) $(EXTRA_libglpk_set_d_eps_a_DEPENDENCIES) 
+	$(AM_V_at)-rm -f libglpk_set_d_eps.a
+	$(AM_V_AR)$(libglpk_set_d_eps_a_AR) libglpk_set_d_eps.a $(libglpk_set_d_eps_a_OBJECTS) $(libglpk_set_d_eps_a_LIBADD)
+	$(AM_V_at)$(RANLIB) libglpk_set_d_eps.a
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+ppl_lpsol$(EXEEXT): $(ppl_lpsol_OBJECTS) $(ppl_lpsol_DEPENDENCIES) $(EXTRA_ppl_lpsol_DEPENDENCIES) 
+	@rm -f ppl_lpsol$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ppl_lpsol_OBJECTS) $(ppl_lpsol_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/glpk_set_d_eps.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_lpsol-ppl_lpsol.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+ppl_lpsol-ppl_lpsol.o: ppl_lpsol.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -MT ppl_lpsol-ppl_lpsol.o -MD -MP -MF $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo -c -o ppl_lpsol-ppl_lpsol.o `test -f 'ppl_lpsol.c' || echo '$(srcdir)/'`ppl_lpsol.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo $(DEPDIR)/ppl_lpsol-ppl_lpsol.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ppl_lpsol.c' object='ppl_lpsol-ppl_lpsol.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -c -o ppl_lpsol-ppl_lpsol.o `test -f 'ppl_lpsol.c' || echo '$(srcdir)/'`ppl_lpsol.c
+
+ppl_lpsol-ppl_lpsol.obj: ppl_lpsol.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -MT ppl_lpsol-ppl_lpsol.obj -MD -MP -MF $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo -c -o ppl_lpsol-ppl_lpsol.obj `if test -f 'ppl_lpsol.c'; then $(CYGPATH_W) 'ppl_lpsol.c'; else $(CYGPATH_W) '$(srcdir)/ppl_lpsol.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_lpsol-ppl_lpsol.Tpo $(DEPDIR)/ppl_lpsol-ppl_lpsol.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ppl_lpsol.c' object='ppl_lpsol-ppl_lpsol.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ppl_lpsol_CFLAGS) $(CFLAGS) -c -o ppl_lpsol-ppl_lpsol.obj `if test -f 'ppl_lpsol.c'; then $(CYGPATH_W) 'ppl_lpsol.c'; else $(CYGPATH_W) '$(srcdir)/ppl_lpsol.c'; fi`
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+ at BUILD_C_INTERFACE_FALSE@check-local:
+ at HAVE_GLPK_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am check-local clean clean-binPROGRAMS clean-generic \
+	clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-man1 \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-man \
+	uninstall-man1
+
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at check-local: ppl_lpsol$(EXEEXT)
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(LP_PROBLEMS) >lp_problems
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(INDIVIDUALLY_CHECKED_PROBLEMS) >individually_checked_problems
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	export LC_ALL=C; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_BB_SATISFIABILITY) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(ECHO_SIMPLEX) "-n $$m $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(SIMPLEX) -n $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_BB_OPTIMALITY) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file lp_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    $(ECHO_SIMPLEX) "$$m $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    $(SIMPLEX) $$m $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(DO_NOT_OUTPUT_OPTIMUM_LOCATION_PROBLEMS) >do_not_output_location
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 verbosity=''; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 $(FGREP) $$file do_not_output_location >/dev/null 2>&1 && verbosity='-v 2'; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 for m in -m -M; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	 do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    $(ECHO_SIMPLEX) "-r $$m $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	    $(SIMPLEX) -r $$verbosity $$m $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  done \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-for path in $(srcdir)/examples/*.mps; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	do \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  file=`basename $$path`; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file individually_checked_problems >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  echo "*** ppl_lpsol -e -r $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	  ./ppl_lpsol$(EXEEXT) -e -r $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	done
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000518 boeing1.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -m -c0.00000000518 $(srcdir)/examples/boeing1.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0000000105 boeing1.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -M -c0.0000000105 $(srcdir)/examples/boeing1.mps $$m >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX) "-n boeing1.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX) -n $(srcdir)/examples/boeing1.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.00000000863 boeing2.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -m -c0.00000000863 $(srcdir)/examples/boeing2.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.00000000213 boeing2.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -M -c0.00000000213 $(srcdir)/examples/boeing2.mps $$m >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX) "-n boeing2.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX) -n $(srcdir)/examples/boeing2.mps >/dev/null
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX) "-r -m mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX) -r -m $(srcdir)/examples/mas74.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.000123 mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -M -c0.000123 $(srcdir)/examples/mas74.mps $$m >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX) "-n mas74.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX) -n $(srcdir)/examples/mas74.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -m -c0.0000273 modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -m -c0.0000273 $(srcdir)/examples/modglob.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX_NOCHECK) "-r -M -c0.0290 modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX_NOCHECK) -r -M -c0.0290 $(srcdir)/examples/modglob.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(ECHO_SIMPLEX) "-n modglob.mps" >>obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	-$(SIMPLEX) -n $(srcdir)/examples/modglob.mps >/dev/null
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@	$(DIFF_COMMAND)
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lpsol/dummy.cc b/demos/ppl_lpsol/dummy.cc
new file mode 100644
index 0000000..67adace
--- /dev/null
+++ b/demos/ppl_lpsol/dummy.cc
@@ -0,0 +1,13 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+// This file intentionally contains only this comment :-)
diff --git a/demos/ppl_lpsol/examples/Makefile.am b/demos/ppl_lpsol/examples/Makefile.am
new file mode 100644
index 0000000..88ff354
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.am
@@ -0,0 +1,52 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+egout.mps \
+ex12.mps \
+ex1.mps \
+kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+mip.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+unboundedmin.mps
diff --git a/demos/ppl_lpsol/examples/Makefile.in b/demos/ppl_lpsol/examples/Makefile.in
new file mode 100644
index 0000000..924730b
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.in
@@ -0,0 +1,576 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_lpsol/examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_noinst_DATA) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(dist_noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+egout.mps \
+ex12.mps \
+ex1.mps \
+kb2.mps \
+lseu.mps \
+markshare1.mps \
+markshare2.mps \
+mas74.mps \
+mas76.mps \
+mip.mps \
+modglob.mps \
+noswot.mps \
+opt1217.mps \
+p0033.mps \
+pk1.mps \
+rout.mps \
+sample.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+unboundedmin.mps
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_lpsol/examples/README b/demos/ppl_lpsol/examples/README
new file mode 100644
index 0000000..671c211
--- /dev/null
+++ b/demos/ppl_lpsol/examples/README
@@ -0,0 +1,9 @@
+Most of the examples in this directory have been taken from:
+  - the `lp' library of Netlib [1];
+  - the problem sets MIPLIB 3.0 [2] and MIPLIB 2003 [3].
+
+--------
+
+[1] http://www.netlib.org/lp/index.html
+[2] http://miplib.zib.de/miplib3/miplib3.html
+[3] http://miplib.zib.de/miplib2003.php
diff --git a/demos/ppl_lpsol/examples/adlittle.mps b/demos/ppl_lpsol/examples/adlittle.mps
new file mode 100644
index 0000000..6620f06
--- /dev/null
+++ b/demos/ppl_lpsol/examples/adlittle.mps
@@ -0,0 +1,335 @@
+NAME          ADLITTLE
+ROWS
+ N  .Z....
+ L  ....01
+ E  ....02
+ L  ....03
+ L  ....04
+ L  ....05
+ L  ....06
+ L  ....07
+ L  ....08
+ L  ....09
+ E  ....10
+ L  ....11
+ L  ....12
+ L  ....13
+ L  ....14
+ L  ....15
+ L  ....16
+ L  ....17
+ L  ....18
+ L  ....19
+ L  ....20
+ L  ....21
+ L  ....22
+ L  ....23
+ L  ....24
+ E  ....25
+ L  ....26
+ L  ....27
+ E  ....28
+ L  ....29
+ L  ....30
+ E  ....31
+ E  ....32
+ E  ....33
+ L  ....34
+ L  ....35
+ E  ....36
+ L  ....37
+ L  ....38
+ L  ....39
+ E  ....40
+ L  ....41
+ E  ....42
+ E  ....43
+ E  ....44
+ L  ....45
+ L  ....46
+ L  ....47
+ L  ....48
+ E  ....49
+ E  ....50
+ G  ....51
+ L  ....52
+ L  ....53
+ E  ....54
+ L  ....55
+ L  ....56
+COLUMNS
+    ...100    .Z....          -3280.   ....01            .506
+    ...100    ....04              1.   ....05            .182
+    ...100    ....55            .312
+    ...101    .Z....          -3280.   ....01            .638
+    ...101    ....04              1.   ....05             .05
+    ...101    ....55            .312
+    ...102    .Z....           3310.   ....01             -1.
+    ...103    .Z....          -1890.   ....05             .92
+    ...103    ....30              1.   ....49            -9.5
+    ...103    ....52           -.042   ....53           -.063
+    ...103    ....55             .08
+    ...104    ....34            .825   ....35            .175
+    ...104    ....40              1.   ....51             16.
+    ...105    ....35            .175   ....40              1.
+    ...105    ....46            .825   ....51             21.
+    ...106    .Z....          -1890.   ....06              1.
+    ...106    ....30              1.   ....49             3.6
+    ...106    ....52           -.042   ....53           -.063
+    ...107    .Z....           -903.   ....06              1.
+    ...107    ....38              1.
+    ...108    ....06              1.   ....50             -.8
+    ...109    .Z....            432.   ....31           -1.23
+    ...109    ....42             .23
+    ...110    .Z....            432.   ....32           -1.23
+    ...110    ....43             .23   ....56              1.
+    ...111    .Z....            432.   ....33           -1.23
+    ...111    ....44             .23   ....56              1.
+    ...112    .Z....            446.   ....07              1.
+    ...112    ....31             -1.
+    ...113    .Z....            446.   ....07              1.
+    ...113    ....32             -1.
+    ...114    .Z....            446.   ....07              1.
+    ...114    ....33             -1.
+    ...115    .Z....            450.   ....08              1.
+    ...115    ....31            -.95   ....42            -.05
+    ...116    .Z....            450.   ....08              1.
+    ...116    ....32            -.95   ....43            -.05
+    ...117    .Z....            450.   ....08              1.
+    ...117    ....33            -.95   ....44            -.05
+    ...118    .Z....            459.   ....09              1.
+    ...118    ....31            -.79   ....42            -.21
+    ...119    .Z....            459.   ....09              1.
+    ...119    ....32            -.79   ....43            -.21
+    ...120    .Z....            459.   ....09              1.
+    ...120    ....33            -.79   ....44            -.21
+    ...121    .Z....            483.   ....11              1.
+    ...121    ....31            -.42   ....42            -.58
+    ...122    .Z....            483.   ....11              1.
+    ...122    ....32            -.42   ....43            -.58
+    ...123    .Z....            483.   ....11              1.
+    ...123    ....33            -.42   ....44            -.58
+    ...124    .Z....            500.   ....12              1.
+    ...124    ....31            -.05   ....42            -.95
+    ...125    .Z....            500.   ....12              1.
+    ...125    ....32            -.05   ....43            -.95
+    ...126    .Z....            500.   ....12              1.
+    ...126    ....33            -.05   ....44            -.95
+    ...127    .Z....            493.   ....13              1.
+    ...127    ....31            -.26   ....42            -.74
+    ...128    .Z....            493.   ....13              1.
+    ...128    ....32            -.26   ....43            -.74
+    ...129    .Z....            493.   ....13              1.
+    ...129    ....33            -.26   ....44            -.74
+    ...130    .Z....          -1890.   ....14              1.
+    ...130    ....30              1.   ....49            -3.2
+    ...130    ....52           -.042   ....53           -.063
+    ...131    .Z....           -903.   ....14              1.
+    ...131    ....38              1.
+    ...132    .Z....            506.   ....17              1.
+    ...132    ....31             .26   ....42           -1.26
+    ...133    ....14              1.   ....50             -.8
+    ...134    .Z....            506.   ....17              1.
+    ...134    ....32             .26   ....43           -1.26
+    ...135    .Z....            506.   ....17              1.
+    ...135    ....33             .26   ....44           -1.26
+    ...136    .Z....            505.   ....15              1.
+    ...136    ....31             .16   ....42           -1.16
+    ...137    .Z....            505.   ....15              1.
+    ...137    ....32             .16   ....43           -1.16
+    ...138    .Z....            505.   ....15              1.
+    ...138    ....33             .16   ....44           -1.16
+    ...139    .Z....            499.   ....16              1.
+    ...139    ....31            -.16   ....42            -.84
+    ...140    .Z....            499.   ....16              1.
+    ...140    ....32            -.16   ....43            -.84
+    ...141    .Z....            499.   ....16              1.
+    ...141    ....33            -.16   ....44            -.84
+    ...142    ....10             -1.
+    ...143    ....02              1.   ....03             .79
+    ...143    ....10             37.   ....28            .494
+    ...143    ....34            .506   ....54         2.27424
+    ...144    ....02              1.   ....03             .53
+    ...144    ....10             47.   ....28            .492
+    ...144    ....46            .508   ....54          2.2632
+    ...145    .Z....            512.   ....18              1.
+    ...145    ....31             .62   ....42           -1.62
+    ...146    .Z....            512.   ....18              1.
+    ...146    ....32             .62   ....43           -1.62
+    ...147    .Z....            512.   ....18              1.
+    ...147    ....33             .62   ....44           -1.62
+    ...148    .Z....            70.9   ....01           -.247
+    ...148    ....06           .1726   ....14          -.3122
+    ...148    ....20           1.783   ....28           .4703
+    ...148    ....50          -.0928   ....54         1.40015
+    ...149    .Z....            39.8   ....01           -.157
+    ...149    ....14          -.2399   ....20              1.
+    ...149    ....28           .4273   ....50          -.0361
+    ...149    ....54         1.20404
+    ...150    .Z....            39.8   ....01           -.157
+    ...150    ....14          -.2789   ....20              1.
+    ...150    ....28           .4663   ....50          -.0361
+    ...150    ....54         1.43498
+    ...151    .Z....            2.04   ....26              1.
+    ...151    ....28             .55   ....50            -.52
+    ...151    ....54              .6
+    ...152    ....28              1.   ....50             -1.
+    ...152    ....54             1.8
+    ...153    .Z....             1.8   ....03            -.33
+    ...153    ....21              1.   ....50            .017
+    ...154    .Z....             1.8   ....21              1.
+    ...154    ....37            -.33
+    ...155    .Z....          -2600.   ....01              .2
+    ...155    ....14             .73   ....29              1.
+    ...155    ....55             .07
+    ...156    .Z....          -2600.   ....14             .72
+    ...156    ....29              1.   ....47              .2
+    ...156    ....55             .08
+    ...157    .Z....            10.4   ....02              1.
+    ...157    ....03             .25   ....10             45.
+    ...157    ....22            .875   ....28           .3675
+    ...157    ....34           .6325   ....50          .02536
+    ...157    ....54           1.614
+    ...158    .Z....            10.4   ....02              1.
+    ...158    ....03              .2   ....10             55.
+    ...158    ....22            .875   ....28            .365
+    ...158    ....46            .635   ....50          .02538
+    ...158    ....54            1.59
+    ...159    .Z....            28.8   ....19              1.
+    ...159    ....28           -.828   ....31              1.
+    ...159    ....34           -.095   ....35            -.02
+    ...159    ....50            .012   ....54           -1.42
+    ...159    ....55          -.0467
+    ...160    .Z....            43.4   ....01          -.0022
+    ...160    ....06          -.0192   ....19              1.
+    ...160    ....27            .679   ....28           -.808
+    ...160    ....32              1.   ....34           -.095
+    ...160    ....35            -.02   ....50           .0205
+    ...160    ....54           -1.84   ....55          -.0467
+    ...161    .Z....            30.4   ....01          -.0022
+    ...161    ....06          -.0192   ....24              1.
+    ...161    ....27            .679   ....28           -.808
+    ...161    ....33              1.   ....34           -.095
+    ...161    ....35            -.02   ....50           .0205
+    ...161    ....54           -1.84   ....55          -.0467
+    ...162    ....28             -1.   ....34              1.
+    ...162    ....54            -5.2
+    ...163    ....28             -1.   ....35              1.
+    ...163    ....54            -6.7
+    ...164    .Z....          -1218.   ....35              1.
+    ...164    ....48              1.
+    ...165    ....35              1.   ....50             -.8
+    ...166    ....28            .482   ....34            .498
+    ...166    ....35             .02   ....36              1.
+    ...166    ....37             .79   ....54           2.217
+    ...167    ....28            .474   ....35             .02
+    ...167    ....36              1.   ....37             .53
+    ...167    ....46            .506   ....54            2.18
+    ...168    .Z....          -1322.   ....06             .07
+    ...168    ....35              .1   ....39              1.
+    ...168    ....55             .83
+    ...169    .Z....          -1322.   ....35             .07
+    ...169    ....39              1.   ....46             .33
+    ...169    ....55              .6
+    ...170    .Z....          -1322.   ....34             .33
+    ...170    ....35             .07   ....39              1.
+    ...170    ....55              .6
+    ...171    .Z....          -1660.   ....22            .625
+    ...171    ....28           -.125   ....34           1.125
+    ...171    ....41              1.   ....50          .01812
+    ...171    ....54            -.65
+    ...172    .Z....          -1670.   ....41              1.
+    ...172    ....46              1.
+    ...173    .Z....            14.8   ....22            1.25
+    ...173    ....28            -.25   ....34         1.03125
+    ...173    ....35          .21875   ....40              1.
+    ...173    ....50          .03625   ....51             30.
+    ...173    ....54        -1.36562
+    ...174    .Z....            14.8   ....22            1.25
+    ...174    ....28            -.25   ....35          .21875
+    ...174    ....40              1.   ....46         1.03125
+    ...174    ....50          .03625   ....51             35.
+    ...174    ....54        -1.38375
+    ...175    .Z....            28.8   ....19           1.072
+    ...175    ....28           -.706   ....35           -.027
+    ...175    ....42              1.   ....46           -.128
+    ...175    ....50           .0129   ....54           -1.61
+    ...175    ....55          -.1203
+    ...176    .Z....             43.   ....01          -.0012
+    ...176    ....06          -.0159   ....19           1.072
+    ...176    ....27            .534   ....28            -.69
+    ...176    ....35           -.027   ....43              1.
+    ...176    ....46           -.128   ....50           .0195
+    ...176    ....54           -1.84   ....55          -.1203
+    ...177    .Z....             30.   ....01          -.0012
+    ...177    ....06          -.0159   ....24              1.
+    ...177    ....27            .534   ....28            -.69
+    ...177    ....35           -.027   ....44              1.
+    ...177    ....46           -.128   ....50           .0195
+    ...177    ....54           -1.84   ....55          -.1203
+    ...178    .Z....          -1763.   ....05            .181
+    ...178    ....45              1.   ....47             .11
+    ...178    ....55            .709
+    ...179    .Z....          -1722.   ....05            .051
+    ...179    ....45              1.   ....47            .055
+    ...179    ....55            .894
+    ...180    .Z....          -1680.   ....05            .036
+    ...180    ....45              1.   ....55            .964
+    ...181    ....28             -1.   ....46              1.
+    ...181    ....54            -5.3
+    ...182    .Z....          -1890.   ....30              1.
+    ...182    ....47             .92   ....49           -10.1
+    ...182    ....52           -.042   ....53           -.063
+    ...182    ....55             .08
+    ...183    .Z....           1780.   ....02              1.
+    ...183    ....03              .4   ....10             45.
+    ...184    .Z....           1600.   ....28             -1.
+    ...184    ....54           -4.35
+    ...185    .Z....            903.   ....28             -1.
+    ...185    ....54            -2.1
+    ...186    .Z....           1760.   ....36              1.
+    ...186    ....37              .8
+    ...187    .Z....           2100.   ....40              1.
+    ...187    ....51             24.
+    ...188    .Z....           1000.   ....49           -64.3
+    ...188    ....52              1.
+    ...189    .Z....           1000.   ....49           -27.4
+    ...189    ....53              1.
+    ...190    .Z....          -1890.   ....30              1.
+    ...190    ....49             9.1   ....52           -.042
+    ...190    ....53           -.063   ....55              1.
+    ...191    .Z....            92.1   ....05            -.36
+    ...191    ....23              1.   ....28           -.026
+    ...191    ....47           -.134   ....50           -.182
+    ...191    ....54          -.1742   ....55            .826
+    ...192    .Z....           -903.   ....38              1.
+    ...192    ....55              1.
+    ...193    .Z....            78.7   ....55              1.
+    ...194    .Z....          -1218.   ....48              1.
+    ...194    ....55              1.
+    ...195    .Z....            15.6   ....05           -.396
+    ...195    ....25              1.   ....28           -.029
+    ...195    ....47           -.147   ....50           -.119
+    ...195    ....54           -.194   ....55             .81
+    ...196    ....50             -.8   ....55              1.
+RHS
+    ZZZZ0001  ....02            52.6   ....03            22.7
+    ZZZZ0001  ....04            23.4   ....07            108.
+    ZZZZ0001  ....08             50.   ....09             13.
+    ZZZZ0001  ....10           2366.   ....11            200.
+    ZZZZ0001  ....12            265.   ....13            300.
+    ZZZZ0001  ....15             31.   ....16             60.
+    ZZZZ0001  ....17            134.   ....18             34.
+    ZZZZ0001  ....19            413.   ....20            41.5
+    ZZZZ0001  ....21             15.   ....22            20.6
+    ZZZZ0001  ....23            13.5   ....24            440.
+    ZZZZ0001  ....26             16.   ....27            290.
+    ZZZZ0001  ....28          -524.9   ....29             3.1
+    ZZZZ0001  ....30             9.1   ....36             43.
+    ZZZZ0001  ....37            34.4   ....38            15.6
+    ZZZZ0001  ....39            19.2   ....40            44.9
+    ZZZZ0001  ....41             6.1   ....45            13.2
+    ZZZZ0001  ....48            31.2   ....50             2.5
+    ZZZZ0001  ....51           1080.   ....54         -1231.6
+    ZZZZ0001  ....56            107.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/afiro.mps b/demos/ppl_lpsol/examples/afiro.mps
new file mode 100644
index 0000000..26002a3
--- /dev/null
+++ b/demos/ppl_lpsol/examples/afiro.mps
@@ -0,0 +1,83 @@
+NAME          AFIRO
+ROWS
+ E  R09
+ E  R10
+ L  X05
+ L  X21
+ E  R12
+ E  R13
+ L  X17
+ L  X18
+ L  X19
+ L  X20
+ E  R19
+ E  R20
+ L  X27
+ L  X44
+ E  R22
+ E  R23
+ L  X40
+ L  X41
+ L  X42
+ L  X43
+ L  X45
+ L  X46
+ L  X47
+ L  X48
+ L  X49
+ L  X50
+ L  X51
+ N  COST
+COLUMNS
+    X01       X48               .301   R09                -1.
+    X01       R10              -1.06   X05                 1.
+    X02       X21                -1.   R09                 1.
+    X02       COST               -.4
+    X03       X46                -1.   R09                 1.
+    X04       X50                 1.   R10                 1.
+    X06       X49               .301   R12                -1.
+    X06       R13              -1.06   X17                 1.
+    X07       X49               .313   R12                -1.
+    X07       R13              -1.06   X18                 1.
+    X08       X49               .313   R12                -1.
+    X08       R13               -.96   X19                 1.
+    X09       X49               .326   R12                -1.
+    X09       R13               -.86   X20                 1.
+    X10       X45              2.364   X17                -1.
+    X11       X45              2.386   X18                -1.
+    X12       X45              2.408   X19                -1.
+    X13       X45              2.429   X20                -1.
+    X14       X21                1.4   R12                 1.
+    X14       COST              -.32
+    X15       X47                -1.   R12                 1.
+    X16       X51                 1.   R13                 1.
+    X22       X46               .109   R19                -1.
+    X22       R20               -.43   X27                 1.
+    X23       X44                -1.   R19                 1.
+    X23       COST               -.6
+    X24       X48                -1.   R19                 1.
+    X25       X45                -1.   R19                 1.
+    X26       X50                 1.   R20                 1.
+    X28       X47               .109   R22               -.43
+    X28       R23                 1.   X40                 1.
+    X29       X47               .108   R22               -.43
+    X29       R23                 1.   X41                 1.
+    X30       X47               .108   R22               -.39
+    X30       R23                 1.   X42                 1.
+    X31       X47               .107   R22               -.37
+    X31       R23                 1.   X43                 1.
+    X32       X45              2.191   X40                -1.
+    X33       X45              2.219   X41                -1.
+    X34       X45              2.249   X42                -1.
+    X35       X45              2.279   X43                -1.
+    X36       X44                1.4   R23                -1.
+    X36       COST              -.48
+    X37       X49                -1.   R23                 1.
+    X38       X51                 1.   R22                 1.
+    X39       R23                 1.   COST               10.
+RHS
+    B         X50               310.   X51               300.
+    B         X05                80.   X17                80.
+    B         X27               500.   R23                44.
+    B         X40               500.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/bgprtr.mps b/demos/ppl_lpsol/examples/bgprtr.mps
new file mode 100644
index 0000000..50e56cd
--- /dev/null
+++ b/demos/ppl_lpsol/examples/bgprtr.mps
@@ -0,0 +1,84 @@
+NAME          BGPRTR
+ROWS
+ N  1
+ E  2
+ E  3
+ L  4
+ L  5
+ L  6
+ L  7
+ L  8
+ L  9
+ E  10
+ E  11
+ E  12
+ E  13
+ E  14
+ E  15
+ E  16
+ E  17
+ E  18
+ E  19
+ E  20
+ E  21
+COLUMNS
+    P1T1      1               29970.   2                   1.
+    P1T1      14                  1.
+    P1T2      1               29970.   3                   1.
+    P1T2      15                  1.
+    P2T1      1               29910.   2                   1.
+    P2T1      16                  1.
+    P2T2      1               29910.   3                   1.
+    P2T2      17                  1.
+    I1T1      1               -1000.   8                   1.
+    I1T1      10                 -1.
+    I1T2      1               -1000.   9                   1.
+    I1T2      12                 -1.
+    I2T1      1               -1000.   8                   1.
+    I2T1      11                 -1.
+    I2T2      1               -1000.   9                   1.
+    I2T2      13                 -1.
+    E1T1      1               -1200.   10                 -1.
+    E1T2      1               -1200.   12                 -1.
+    E2T1      1               -1200.   11                 -1.
+    E2T2      1               -1200.   13                 -1.
+    C1T1      1                 -20.   18                  1.
+    C1T1      21                 -1.
+    C1T2      1                 -20.   19                  1.
+    C2T1      1                 -20.   19                 -1.
+    C2T1      20                  1.
+    C2T2      1                 -20.   21                  1.
+    NDT1      1               -3000.   2                  -1.
+    NDT2      1               -3000.   3                  -1.
+    R1T1      1                 -20.   18                  1.
+    R1T1      19                 -1.
+    R1T2      1                 -20.   19                  1.
+    R2T1      1                 -20.   20                  1.
+    R2T1      21                 -1.
+    R2T2      1                 -20.   21                  1.
+    N1T1      1                -300.   14                  1.
+    N1T1      15                 -1.
+    N1T2      1                -300.   15                  1.
+    N2T1      1                -300.   16                  1.
+    N2T1      17                 -1.
+    N2T2      1                -300.   17                  1.
+    B1T1      4                 900.   10                  6.
+    B1T1      14                 -1.   18                  1.
+    T1T1      4                  90.   18                 -1.
+    B1T2      5                 900.   12                  6.
+    B1T2      15                 -1.   19                  1.
+    T1T2      5                  90.   19                 -1.
+    B2T1      6                 600.   11                  6.
+    B2T1      16                 -1.   20                  1.
+    T2T1      6                  60.   20                 -1.
+    B2T2      7                 600.   13                  6.
+    B2T2      17                 -1.   21                  1.
+    T2T2      7                  60.   21                 -1.
+RHS
+    RHS       2                 130.   3                 190.
+    RHS       4                   8.   5               80000.
+    RHS       6               70000.   7               70000.
+    RHS       8                1000.   9                1000.
+    RHS       14                  5.   16                  2.
+    RHS       18                  6.   20                  4.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/blend.mps b/demos/ppl_lpsol/examples/blend.mps
new file mode 100644
index 0000000..2a37ae6
--- /dev/null
+++ b/demos/ppl_lpsol/examples/blend.mps
@@ -0,0 +1,366 @@
+* Problem:    BLEND
+* Class:      LP
+* Rows:       75
+* Columns:    83
+* Non-zeros:  521
+* Format:     Free MPS
+*
+NAME BLEND
+ROWS
+ E 1
+ E 2
+ E 3
+ E 4
+ E 5
+ E 6
+ E 7
+ E 8
+ E 9
+ E 10
+ E 11
+ E 12
+ E 13
+ E 14
+ E 15
+ E 16
+ E 17
+ E 18
+ E 19
+ E 20
+ E 21
+ E 22
+ E 23
+ E 24
+ E 25
+ E 26
+ E 27
+ E 28
+ E 29
+ E 30
+ E 31
+ E 32
+ E 33
+ E 34
+ E 35
+ E 36
+ E 37
+ E 38
+ E 39
+ E 40
+ E 41
+ E 42
+ E 43
+ L 44
+ L 45
+ L 46
+ L 47
+ L 48
+ L 49
+ L 50
+ L 51
+ L 52
+ L 53
+ L 54
+ L 55
+ L 56
+ L 57
+ L 58
+ L 59
+ L 60
+ L 61
+ L 62
+ L 63
+ L 64
+ L 65
+ L 66
+ L 67
+ L 68
+ L 69
+ L 70
+ L 71
+ L 72
+ L 73
+ L 74
+ N C
+COLUMNS
+ 1 2 -0.537 3 -0.131
+ 1 4 -0.1155 5 -0.0365
+ 1 6 -0.143 7 -0.037
+ 1 40 0.003 41 0.0587
+ 1 42 0.15 43 0.302
+ 1 67 1 C 3.2
+ 2 1 -0.2931 3 -0.117
+ 2 4 -0.0649 5 -0.1233
+ 2 6 -0.2217 8 -0.18
+ 2 39 0.0042 40 0.003
+ 2 41 0.1053 42 0.185
+ 2 43 0.384 50 -0.00862
+ 2 51 -0.00862 56 -0.0101
+ 2 57 -0.0101 68 1
+ 2 C 2.87
+ 3 2 1 9 -0.0277
+ 3 10 -0.0563 11 -0.199
+ 3 12 -0.6873 13 -0.017
+ 3 40 0.01303 41 0.0506
+ 3 42 0.209 43 0.495
+ 3 65 1
+ 4 1 1 9 -0.0112
+ 4 10 -0.0378 11 -0.1502
+ 4 12 -0.7953 13 -0.0099
+ 4 40 0.01303 41 0.0448
+ 4 42 0.185 43 0.721
+ 4 65 1
+ 5 9 -0.175 10 -0.27
+ 5 11 -0.028 13 -0.455
+ 5 21 1 40 0.01303
+ 5 41 0.0506 42 0.209
+ 5 43 0.495
+ 6 9 -0.271 10 -0.3285
+ 6 11 -0.0255 13 -0.2656
+ 6 18 1 40 0.01303
+ 6 41 0.0506 42 0.209
+ 6 43 0.495
+ 7 9 -0.2836 10 -0.3285
+ 7 11 -0.0241 13 -0.2502
+ 7 17 1 40 0.01303
+ 7 41 0.0506 42 0.209
+ 7 43 0.495
+ 8 12 1 14 -1
+ 8 39 0.0327 41 0.094
+ 8 42 0.045 43 0.793
+ 8 C 0.0044
+ 9 15 -1 22 1
+ 10 16 -1 22 1
+ 11 14 1 15 -1
+ 12 14 1 16 -1
+ 13 15 1 17 -0.0588
+ 13 19 -0.8145 23 -0.0091
+ 13 39 -0.8239 40 0.0081
+ 13 41 -0.2112 42 0.387
+ 13 43 1.03 69 1.3
+ 13 C 0.07
+ 14 16 1 18 -0.0404
+ 14 20 -0.8564 23 -0.0069
+ 14 39 -0.7689 40 0.0063
+ 14 41 -0.156 42 0.297
+ 14 43 0.792 69 1
+ 14 C 0.0378
+ 15 5 1 21 -0.3321
+ 15 22 -0.5875 23 -0.362
+ 15 39 2.3 41 -0.2049
+ 15 42 0.826 43 14.61
+ 15 65 1 70 1
+ 15 C 0.155
+ 16 6 1 21 -0.3321
+ 16 22 -0.5875 23 -0.362
+ 16 39 2.3 41 -0.2049
+ 16 42 0.826 43 14.61
+ 16 66 1 70 1
+ 16 C 0.155
+ 17 4 1 21 -0.2414
+ 17 22 -0.6627 23 -0.293
+ 17 39 2.3 41 -0.1531
+ 17 42 0.826 43 14.61
+ 17 65 1 70 1
+ 17 C 0.155
+ 18 21 -0.2414 22 -0.6627
+ 18 23 -0.293 28 1
+ 18 39 2.3 41 -0.1531
+ 18 42 0.826 43 14.61
+ 18 70 1 C 0.155
+ 19 5 1 10 -0.0185
+ 19 13 -0.0568 24 -0.0806
+ 19 25 -0.0658 26 -0.0328
+ 19 27 -0.4934 28 -0.2922
+ 19 29 -0.0096 40 -0.0654
+ 19 41 -0.2535 42 0.632
+ 19 43 0.6807 65 1
+ 19 71 1 C 0.0528
+ 20 6 1 10 -0.0185
+ 20 13 -0.0568 24 -0.0806
+ 20 25 -0.0658 26 -0.0328
+ 20 27 -0.4934 28 -0.2922
+ 20 29 -0.0096 40 -0.0654
+ 20 41 -0.2535 42 0.632
+ 20 43 0.6807 66 1
+ 20 71 1 C 0.0528
+ 21 4 1 10 -0.0184
+ 21 13 -0.0564 24 -0.078
+ 21 25 -0.0655 26 -0.0303
+ 21 27 -0.475 28 -0.305
+ 21 40 -0.0654 41 -0.2703
+ 21 42 0.632 43 0.6807
+ 21 65 1 71 1
+ 21 C 0.0528
+ 22 3 1 10 -0.0184
+ 22 13 -0.0564 24 -0.078
+ 22 25 -0.0655 26 -0.0303
+ 22 27 -0.475 28 -0.305
+ 22 40 -0.0654 41 -0.2703
+ 22 42 0.632 43 0.6807
+ 22 65 1 71 1
+ 22 C 0.0528
+ 23 13 0.76 25 0.5714
+ 23 30 -1 40 0.1869
+ 23 41 0.2796 42 2.241
+ 23 43 2.766 72 1
+ 23 C 0.128
+ 24 9 -0.0571 10 -0.0114
+ 24 13 0.6571 24 0.5714
+ 24 31 -1 40 0.1724
+ 24 41 0.2579 42 2.067
+ 24 43 2.552 72 1
+ 24 C 0.118
+ 25 9 -1 25 1
+ 26 10 -1 24 1
+ 27 10 -1 13 1
+ 28 11 1 32 -1
+ 28 44 -7.95 45 -8.7
+ 28 46 -3 47 14
+ 28 48 1 49 -1
+ 29 23 1 32 -1
+ 29 44 -8.84 45 -9.45
+ 29 46 -3 47 12
+ 29 48 1 49 -1
+ 30 19 1 32 -1
+ 30 44 -9.43 45 -9.57
+ 30 46 -3 47 3.5
+ 30 48 0.233 49 -0.358
+ 31 20 1 32 -1
+ 31 44 -9.03 45 -9.32
+ 31 46 -3 47 3.5
+ 31 48 0.205 49 -0.333
+ 32 27 1 32 -1
+ 32 44 -9.23 45 -9.22
+ 32 46 -3 47 6
+ 32 48 0.381 49 -0.509
+ 33 30 1 32 -1
+ 33 44 -9.4 45 -9.85
+ 33 46 -3 47 2.5
+ 33 48 0.39 49 -0.77
+ 34 31 1 32 -1
+ 34 44 -9.74 45 -10.1
+ 34 46 -3 47 3.3
+ 34 48 0.233 49 -0.58
+ 35 10 1 32 -1
+ 35 44 -9.74 45 -9.9
+ 35 46 -3 47 66
+ 35 48 1 49 -1
+ 36 44 -0.493 45 -0.165
+ 36 46 1 C 0.0924
+ 37 32 1 44 10.03
+ 37 45 10.03 47 -9.5
+ 37 48 -0.5 49 0.5
+ 37 73 0.64 74 0.35
+ 37 C -5.36
+ 38 11 1 33 -1
+ 38 50 -7.98 51 -8.58
+ 38 52 -3 53 14
+ 38 54 1 55 -1
+ 39 23 1 33 -1
+ 39 50 -8.87 51 -9.33
+ 39 52 -3 53 12
+ 39 54 1 55 -1
+ 40 19 1 33 -1
+ 40 50 -9.46 51 -9.45
+ 40 52 -3 53 3.5
+ 40 54 0.233 55 -0.358
+ 41 20 1 33 -1
+ 41 50 -9.06 51 -9.2
+ 41 52 -3 53 3.5
+ 41 54 0.205 55 -0.333
+ 42 27 1 33 -1
+ 42 50 -9.26 51 -9.13
+ 42 52 -3 53 6
+ 42 54 0.318 55 -0.509
+ 43 10 1 33 -1
+ 43 50 -9.77 51 -9.78
+ 43 52 -3 53 66
+ 43 54 1 55 -1
+ 44 50 -0.435 51 -0.208
+ 44 52 1 C 0.0924
+ 45 33 1 50 9.65
+ 45 51 9.65 53 -9.5
+ 45 54 -0.5 55 0.5
+ 45 73 -0.36 74 0.35
+ 45 C -5.08
+ 46 11 1 36 -1
+ 46 56 -7.99 57 -8.59
+ 46 58 -3 59 14
+ 46 60 1 61 -1
+ 47 23 1 36 -1
+ 47 56 -8.88 57 -9.34
+ 47 58 -3 59 12
+ 47 60 1 61 -1
+ 48 19 1 36 -1
+ 48 56 -9.47 57 -9.46
+ 48 58 -3 59 3.5
+ 48 60 0.233 61 -0.358
+ 49 20 1 36 -1
+ 49 56 -9.07 57 -9.21
+ 49 58 -3 59 3.5
+ 49 60 0.205 61 -0.333
+ 50 27 1 36 -1
+ 50 56 -9.27 57 -9.14
+ 50 58 -3 59 6
+ 50 60 0.318 61 -0.509
+ 51 10 1 36 -1
+ 51 56 -9.78 57 -9.79
+ 51 58 -3 59 66
+ 51 60 1 61 -1
+ 52 56 -0.426 57 -0.204
+ 52 58 1 C 0.0924
+ 53 36 1 56 9.05
+ 53 57 9.05 59 -9.5
+ 53 60 -0.5 61 0.5
+ 53 73 -0.36 74 -0.65
+ 53 C -4.51
+ 54 9 -1 26 1
+ 55 9 1 37 -1
+ 56 10 1 37 -1
+ 57 37 1 C -2.75
+ 58 11 1 38 -1
+ 58 63 -14 64 14
+ 59 12 1 38 -1
+ 59 63 -0.8 64 0.8
+ 60 38 1 63 2
+ 60 64 -3 C -4.2
+ 61 4 1 34 -1
+ 62 3 1 34 -1
+ 63 34 1 65 1
+ 63 C -3.6
+ 64 7 1 35 -1
+ 64 62 10.1
+ 65 8 1 35 -1
+ 65 62 12.63
+ 66 6 1 35 -1
+ 66 62 8.05 66 1
+ 67 5 1 35 -1
+ 67 62 6.9 65 1
+ 68 29 1 35 -1
+ 68 62 8.05
+ 69 28 1 35 -1
+ 69 62 4.4
+ 70 35 1 62 -10.1
+ 70 C -2
+ 71 39 1 41 -0.325
+ 72 13 1 41 -4.153
+ 73 10 1 41 -4.316
+ 74 9 1 41 -3.814
+ 75 25 1 41 -3.808
+ 76 24 1 41 -4.44
+ 77 40 -1 41 1.42
+ 77 C 0.04
+ 78 40 1
+ 79 10 -0.5 13 -0.5
+ 79 C 3
+ 80 41 -1 C 0.4
+ 81 41 1
+ 82 42 -1 C 0.0132
+ 83 43 -1 C 0.01
+RHS
+ RHS1 65 23.26 66 5.25
+ RHS1 67 26.32 68 21.05
+ RHS1 69 13.45 70 2.58
+ RHS1 71 10 72 10
+ENDATA
diff --git a/demos/ppl_lpsol/examples/boeing1.mps b/demos/ppl_lpsol/examples/boeing1.mps
new file mode 100644
index 0000000..bbe16dd
--- /dev/null
+++ b/demos/ppl_lpsol/examples/boeing1.mps
@@ -0,0 +1,2636 @@
+NAME          BOEING1  (FLAPINTL)
+ROWS
+ G  REVENUES
+ G  ACOCOSTS
+ N  OBJECTIV
+ G  SYSTDEPT
+ G  ACMILES
+ G  ASMILES
+ G  PASSNGRS
+ G  RPMILES
+ G  LFRPMASM
+ G  ATONMILE
+ G  RTONMILE
+ G  LFTNMILE
+ E  FLAV*1
+ E  FLAV*2
+ E  FLAV*3
+ E  FLAV*4
+ E  FLAV*5
+ E  FLAV*6
+ G  LF1001S1
+ G  LF1002S1
+ G  LF1002S2
+ G  LF1003S1
+ G  LF1004S1
+ G  LF1004S2
+ G  LF1005S1
+ G  LF1005S2
+ G  LF1105S1
+ G  LF1105S2
+ G  LF1006S1
+ G  LF1006S2
+ G  LF1007S1
+ G  LF1007S2
+ G  LF1008S1
+ G  LF1008S2
+ G  LF1008S3
+ G  LF1009S1
+ G  LF1009S2
+ G  LF1010S1
+ G  LF1011S1
+ G  LF1011S2
+ G  LF1012S1
+ G  LF1013S1
+ G  LF1013S2
+ G  LF1014S1
+ G  LF1014S2
+ G  LF1015S1
+ G  LF1015S2
+ G  LF1016S1
+ G  LF1016S2
+ G  LF1017S1
+ G  LF1017S2
+ G  LF1018S1
+ G  LF1018S2
+ G  LF1019S1
+ G  LF1019S2
+ G  LF1020S1
+ G  LF1021S1
+ G  LF1022S1
+ G  LF1022S2
+ G  LF1022S3
+ G  LF1023S1
+ G  LF1023S2
+ G  LF1023S3
+ G  LF1026S1
+ G  LF1026S2
+ G  LF1026S3
+ G  LF1027S1
+ G  LF1027S2
+ G  LF1027S3
+ G  LF1028S1
+ G  LF1028S2
+ G  LF1028S3
+ G  LF1029S1
+ G  LF1029S2
+ G  LF1029S3
+ G  LF1029S4
+ G  LF1029S5
+ G  LF1030S1
+ G  LF1030S2
+ G  LF1030S3
+ G  LF1030S4
+ G  LF1032S1
+ G  LF1032S2
+ G  LF1032S3
+ G  LF1032S4
+ G  LF1032S5
+ G  LF1033S1
+ G  LF1033S2
+ G  LF1033S3
+ G  LF1034S1
+ G  LF1034S2
+ G  LF1035S1
+ G  LF1035S2
+ G  LF1036S1
+ G  LF1036S2
+ G  LF1037S1
+ G  LF1037S2
+ G  LF1038S1
+ G  LF1039S1
+ G  LF1040S1
+ G  LF1040S2
+ G  LF1041S1
+ G  LF1042S1
+ G  LF1043S1
+ G  LF1044S1
+ G  LF1046S1
+ G  LF1046S2
+ G  LF1047S1
+ G  LF1047S2
+ G  LF1047S3
+ G  LF1050S1
+ G  LF1050S2
+ G  LF1051S1
+ L  NOPTLON0
+ G  NOPTLON1
+ L  NOPTTYO0
+ G  NOPTTYO1
+ L  DMBOSHNL
+ L  DMBOSLAX
+ L  DMBOSSEA
+ L  DMBOSSFO
+ L  DMBOSTPE
+ L  DMBOSTYO
+ L  DMBOSYUL
+ L  DMBOSYVR
+ L  DMBOSYWG
+ L  DMBOSYYZ
+ L  DMBUROAK
+ L  DMBURSEA
+ L  DMBURSFO
+ L  DMHNLLAX
+ L  DMHNLLON
+ L  DMHNLPAR
+ L  DMHNLSEA
+ L  DMHNLSFO
+ L  DMHNLYVR
+ L  DMLASSEA
+ L  DMLASYVR
+ L  DMLAXOAK
+ L  DMLAXSEA
+ L  DMLAXSFO
+ L  DMLAXTPE
+ L  DMLAXTYO
+ L  DMLAXYVR
+ L  DMLONPAR
+ L  DMLONSEA
+ L  DMLONYVR
+ L  DMOAKONT
+ L  DMOAKSEA
+ L  DMONTSFO
+ L  DMONTSEA
+ L  DMPARSEA
+ L  DMPARYVR
+ L  DMRNOSEA
+ L  DMRNOYVR
+ L  DMSEASFO
+ L  DMSEATPE
+ L  DMSEATYO
+ L  DMSEAYVR
+ L  DMSFOTPE
+ L  DMSFOTYO
+ L  DMSFOYVR
+ L  DMTPETYO
+ L  DMTPEYVR
+ L  DMTYOYVR
+ L  DMYULYVR
+ L  DMYULYWG
+ L  DMYULYYZ
+ L  DMYVRYWG
+ L  DMYVRYYZ
+ L  DMYWGYYZ
+ L  DMBOSOAK
+ L  DMBOSBUR
+ L  DMBOSONT
+ L  DMBURYVR
+ L  DMBURTYO
+ L  DMBURTPE
+ L  DMBURHNL
+ L  DMHNLOAK
+ L  DMHNLONT
+ L  DMHNLYWG
+ L  DMHNLYYZ
+ L  DMHNLYUL
+ L  DMLASTYO
+ L  DMLASTPE
+ L  DMLAXLON
+ L  DMLAXPAR
+ L  DMBURLON
+ L  DMBURPAR
+ L  DMLONONT
+ L  DMLONOAK
+ L  DMOAKPAR
+ L  DMOAKTYO
+ L  DMOAKTPE
+ L  DMONTPAR
+ L  DMONTTYO
+ L  DMONTTPE
+ L  DMPARSFO
+ L  DMRNOTYO
+ L  DMRNOTPE
+ L  DMTPEYWG
+ L  DMTPEYYZ
+ L  DMTPEYUL
+ L  DMTYOYUL
+ L  DMTYOYYZ
+ L  DMTYOYWG
+ E  DMSFOOAK
+ E  DMLAXBUR
+ E  DMLAXONT
+ G  MSBOSHNL
+ G  MSBOSSEA
+ G  MSBOSSFO
+ G  MSBOSYUL
+ G  MSBOSYVR
+ G  MSBOSYWG
+ G  MSBOSYYZ
+ G  MSBUROAK
+ G  MSBURSEA
+ G  MSBURSFO
+ G  MSHNLLAX
+ G  MSHNLSEA
+ G  MSHNLSFO
+ G  MSHNLYVR
+ G  MSLASSEA
+ G  MSLASYVR
+ G  MSLAXOAK
+ G  MSLAXSEA
+ G  MSLAXSFO
+ G  MSLAXTPE
+ G  MSLAXYVR
+ G  MSLONPAR
+ G  MSLONSEA
+ L  MSLONYVR
+ G  MSOAKONT
+ G  MSOAKSEA
+ G  MSONTSFO
+ G  MSONTSEA
+ L  MSPARSEA
+ G  MSRNOSEA
+ G  MSRNOYVR
+ G  MSSEASFO
+ G  MSSEATPE
+ G  MSSEATYO
+ G  MSSEAYVR
+ G  MSSFOYVR
+ G  MSTPETYO
+ G  MSYULYVR
+ G  MSYULYWG
+ G  MSYULYYZ
+ G  MSYVRYWG
+ G  MSYVRYYZ
+ G  MSYWGYYZ
+ G  MSBOSOAK
+ G  MSHNLOAK
+ G  MSLAXLON
+ G  P1044X32
+ G  P1047X54
+ G  P1032X76
+ G  P1033X54
+ G  P1036X43
+ G  P1040X43
+ G  P1042X32
+ G  P1032X75
+ G  P1040X42
+ G  P1016X43
+ G  P1003X32
+ G  P1004X43
+ G  P1105X43
+ G  P1047X23
+ G  P1001X32
+ G  P1002X43
+ G  P1007X43
+ G  P1002X42
+ G  P1022X23
+ G  P1019X43
+ G  P1021X32
+ G  P1105X32
+ G  P1017X43
+ G  P1046X23
+ G  P1008X53
+ G  P1009X43
+ G  P1011X42
+ G  P1012X32
+ G  P1017X42
+ G  P1026X23
+ G  P1027X23
+ G  P1029X24
+ G  P1030X24
+ G  P1050X32
+ G  P1004X32
+ G  P1008X54
+ G  P1011X43
+ G  P1029X23
+ G  P1030X23
+ G  P1047X34
+ G  P1051X23
+ G  P1027X25
+ G  P1029X27
+ G  P1030X26
+ G  P1008X52
+ G  P1009X42
+ G  P1029X25
+ G  P1013X32
+ G  P1014X32
+ G  P1017X32
+ G  P1015X43
+ G  P1013X42
+ G  P1015X42
+ G  P1050X42
+ G  P1018X43
+ G  P1020X32
+ G  P1008X34
+ G  P1011X23
+ G  P1015X23
+ G  P1016X23
+ G  P1028X32
+ G  P1029X43
+ G  P1030X43
+ G  P1002X32
+ G  P1008X32
+ G  P1009X32
+ G  P1010X32
+ G  P1018X32
+ G  P1019X32
+ G  P1023X32
+ G  P1029X45
+ G  P1032X23
+ G  P1008X42
+ G  P1029X35
+ G  P1032X63
+ G  P1033X42
+ G  P1034X42
+ G  P1036X32
+ G  P1032X64
+ G  P1033X43
+ G  P1037X42
+ G  P1039X32
+ G  P1032X65
+ G  P1034X43
+ G  P1037X43
+ G  P1040X32
+ G  P1041X32
+ G  P1032X34
+ G  P1033X23
+ G  P1035X23
+ G  P1032X35
+ G  P1034X23
+ G  P1035X24
+ G  P1032X45
+ G  P1035X34
+ G  P1037X23
+ G  P1038X23
+COLUMNS
+    PBOSHNL0  REVENUES        .23519   OBJECTIV       -.23519
+    PBOSHNL0  PASSNGRS            1.   RPMILES        5.16595
+    PBOSHNL0  LFRPMASM      -5.16595   DMBOSHNL            1.
+    PBOSHNL0  LF1007S1           -1.   LF1007S2           -1.
+    PBOSHNL1  REVENUES        .23519   OBJECTIV       -.23519
+    PBOSHNL1  PASSNGRS            1.   RPMILES        5.59035
+    PBOSHNL1  LFRPMASM      -5.59035   DMBOSHNL            1.
+    PBOSHNL1  LF1047S1           -1.   LF1047S2           -1.
+    PBOSHNL1  LF1047S3           -1.
+    PBOSHNL7  REVENUES       -.02469   OBJECTIV        .02469
+    PBOSHNL7  PASSNGRS           -1.   DMBOSHNL            1.
+    PBOSHNL7  DMBOSSEA           -1.   DMHNLSEA           -1.
+    PBOSHNL8  REVENUES       -.02665   OBJECTIV        .02665
+    PBOSHNL8  PASSNGRS           -1.   DMBOSHNL            1.
+    PBOSHNL8  DMBOSYVR           -1.   DMHNLYVR           -1.
+    PBOSLAX0  REVENUES        .13092   OBJECTIV       -.13092
+    PBOSLAX0  PASSNGRS            1.   RPMILES        3.02542
+    PBOSLAX0  LFRPMASM      -3.02542   DMBOSLAX            1.
+    PBOSLAX0  LF1046S1           -1.   LF1046S2           -1.
+    PBOSLAX1  REVENUES        .13092   OBJECTIV       -.13092
+    PBOSLAX1  PASSNGRS            1.   RPMILES        3.03697
+    PBOSLAX1  LFRPMASM      -3.03697   DMBOSLAX            1.
+    PBOSLAX1  LF1047S2           -1.   LF1047S3           -1.
+    PBOSLAX7  REVENUES       -.03462   OBJECTIV        .03462
+    PBOSLAX7  PASSNGRS           -1.   DMBOSLAX            1.
+    PBOSLAX7  DMBOSSFO           -1.   DMLAXSFO           -1.
+    PBOSSEA0  REVENUES        .12596   OBJECTIV       -.12596
+    PBOSSEA0  PASSNGRS            1.   RPMILES        2.48884
+    PBOSSEA0  LFRPMASM      -2.48884   DMBOSSEA            1.
+    PBOSSEA0  LF1007S1           -1.
+    PBOSSEA1  REVENUES        .12596   OBJECTIV       -.12596
+    PBOSSEA1  PASSNGRS            1.   RPMILES        2.78679
+    PBOSSEA1  LFRPMASM      -2.78679   DMBOSSEA            1.
+    PBOSSEA1  LF1032S1           -1.   LF1032S2           -1.
+    PBOSSEA1  LF1032S3           -1.   LF1032S4           -1.
+    PBOSSEA1  LF1032S5           -1.
+    PBOSSEA2  REVENUES        .12596   OBJECTIV       -.12596
+    PBOSSEA2  PASSNGRS            1.   RPMILES        2.48884
+    PBOSSEA2  LFRPMASM      -2.48884   DMBOSSEA            1.
+    PBOSSEA2  LF1043S1           -1.
+    PBOSSFO0  REVENUES        .13481   OBJECTIV       -.13481
+    PBOSSFO0  PASSNGRS            1.   RPMILES        2.69845
+    PBOSSFO0  LFRPMASM      -2.69845   DMBOSSFO            1.
+    PBOSSFO0  P1044X32           -1.   LF1044S1           -1.
+    PBOSSFO1  REVENUES        .13481   OBJECTIV       -.13481
+    PBOSSFO1  PASSNGRS            1.   RPMILES        2.69845
+    PBOSSFO1  LFRPMASM      -2.69845   DMBOSSFO            1.
+    PBOSSFO1  P1047X54           -1.   LF1047S3           -1.
+    PBOSTPE1  REVENUES       -.05629   OBJECTIV        .05629
+    PBOSTPE1  PASSNGRS           -1.   DMBOSTPE            1.
+    PBOSTPE1  DMBOSSEA           -1.   DMSEATPE           -1.
+    PBOSTPE2  REVENUES        -.0528   OBJECTIV         .0528
+    PBOSTPE2  PASSNGRS           -1.   DMBOSTPE            1.
+    PBOSTPE2  DMBOSYVR           -1.   DMTPEYVR           -1.
+    PBOSTYO1  REVENUES       -.04525   OBJECTIV        .04525
+    PBOSTYO1  PASSNGRS           -1.   DMBOSTYO            1.
+    PBOSTYO1  DMBOSSEA           -1.   DMSEATYO           -1.
+    PBOSTYO2  REVENUES       -.04206   OBJECTIV        .04206
+    PBOSTYO2  PASSNGRS           -1.   DMBOSTYO            1.
+    PBOSTYO2  DMBOSYVR           -1.   DMTYOYVR           -1.
+    PBOSYUL0  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL0  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL0  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL0  P1032X76           -1.   LF1032S5           -1.
+    PBOSYUL1  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL1  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL1  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL1  P1033X54           -1.   LF1033S3           -1.
+    PBOSYUL2  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL2  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL2  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL2  P1036X43           -1.   LF1036S2           -1.
+    PBOSYUL3  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL3  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL3  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL3  P1040X43           -1.   LF1040S2           -1.
+    PBOSYUL4  REVENUES        .02799   OBJECTIV       -.02799
+    PBOSYUL4  PASSNGRS            1.   RPMILES         .25418
+    PBOSYUL4  LFRPMASM       -.25418   DMBOSYUL            1.
+    PBOSYUL4  P1042X32           -1.   LF1042S1           -1.
+    PBOSYVR0  REVENUES        .12674   OBJECTIV       -.12674
+    PBOSYVR0  PASSNGRS            1.   RPMILES        2.66058
+    PBOSYVR0  LFRPMASM      -2.66058   DMBOSYVR            1.
+    PBOSYVR0  LF1032S2           -1.   LF1032S3           -1.
+    PBOSYVR0  LF1032S4           -1.   LF1032S5           -1.
+    PBOSYVR1  REVENUES        .12674   OBJECTIV       -.12674
+    PBOSYVR1  PASSNGRS            1.   RPMILES         2.5415
+    PBOSYVR1  LFRPMASM       -2.5415   DMBOSYVR            1.
+    PBOSYVR1  LF1033S1           -1.   LF1033S2           -1.
+    PBOSYVR1  LF1033S3           -1.
+    PBOSYVR2  REVENUES        .12674   OBJECTIV       -.12674
+    PBOSYVR2  PASSNGRS            1.   RPMILES        2.54144
+    PBOSYVR2  LFRPMASM      -2.54144   DMBOSYVR            1.
+    PBOSYVR2  LF1036S1           -1.   LF1036S2           -1.
+    PBOSYWG0  REVENUES        .07408   OBJECTIV       -.07408
+    PBOSYWG0  PASSNGRS            1.   RPMILES        1.50255
+    PBOSYWG0  LFRPMASM      -1.50255   DMBOSYWG            1.
+    PBOSYWG0  LF1032S3           -1.   LF1032S4           -1.
+    PBOSYWG0  LF1032S5           -1.
+    PBOSYWG1  REVENUES        .07408   OBJECTIV       -.07408
+    PBOSYWG1  PASSNGRS            1.   RPMILES        1.38348
+    PBOSYWG1  LFRPMASM      -1.38348   DMBOSYWG            1.
+    PBOSYWG1  LF1033S2           -1.   LF1033S3           -1.
+    PBOSYWG7  REVENUES       -.01789   OBJECTIV        .01789
+    PBOSYWG7  PASSNGRS           -1.   DMBOSYWG            1.
+    PBOSYWG7  DMBOSYUL           -1.   DMYULYWG           -1.
+    PBOSYYZ0  REVENUES        .03418   OBJECTIV       -.03418
+    PBOSYYZ0  PASSNGRS            1.   RPMILES         .56879
+    PBOSYYZ0  LFRPMASM       -.56879   DMBOSYYZ            1.
+    PBOSYYZ0  P1032X75           -1.   LF1032S4           -1.
+    PBOSYYZ0  LF1032S5           -1.
+    PBOSYYZ1  REVENUES        .03418   OBJECTIV       -.03418
+    PBOSYYZ1  PASSNGRS            1.   RPMILES         .56879
+    PBOSYYZ1  LFRPMASM       -.56879   DMBOSYYZ            1.
+    PBOSYYZ1  P1040X42           -1.   LF1040S1           -1.
+    PBOSYYZ1  LF1040S2           -1.
+    PBUROAK0  REVENUES        .03032   OBJECTIV       -.03032
+    PBUROAK0  PASSNGRS            1.   RPMILES         .32608
+    PBUROAK0  LFRPMASM       -.32608   DMBUROAK            1.
+    PBUROAK0  LF1005S1           -1.
+    PBUROAK1  REVENUES        .03032   OBJECTIV       -.03032
+    PBUROAK1  PASSNGRS            1.   RPMILES         .32608
+    PBUROAK1  LFRPMASM       -.32608   DMBUROAK            1.
+    PBUROAK1  LF1014S2           -1.
+    PBURSEA0  REVENUES        .05527   OBJECTIV       -.05527
+    PBURSEA0  PASSNGRS            1.   RPMILES          .9975
+    PBURSEA0  LFRPMASM        -.9975   DMBURSEA            1.
+    PBURSEA0  LF1014S1           -1.   LF1014S2           -1.
+    PBURSEA1  REVENUES        .05527   OBJECTIV       -.05527
+    PBURSEA1  PASSNGRS            1.   RPMILES        1.00605
+    PBURSEA1  LFRPMASM      -1.00605   DMBURSEA            1.
+    PBURSEA1  LF1016S1           -1.   LF1016S2           -1.
+    PBURSFO0  REVENUES        .03033   OBJECTIV       -.03033
+    PBURSFO0  PASSNGRS            1.   RPMILES         .32657
+    PBURSFO0  LFRPMASM       -.32657   DMBURSFO            1.
+    PBURSFO0  P1016X43           -1.   LF1016S2           -1.
+    PHNLLAX0  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX0  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX0  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX0  P1003X32           -1.   LF1003S1           -1.
+    PHNLLAX1  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX1  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX1  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX1  P1004X43           -1.   LF1004S2           -1.
+    PHNLLAX2  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX2  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX2  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX2  P1105X43           -1.   LF1105S2           -1.
+    PHNLLAX3  REVENUES        .12871   OBJECTIV       -.12871
+    PHNLLAX3  PASSNGRS            1.   RPMILES        2.55338
+    PHNLLAX3  LFRPMASM      -2.55338   DMHNLLAX            1.
+    PHNLLAX3  P1047X23           -1.   LF1047S1           -1.
+    PHNLLON0  REVENUES        .32504   OBJECTIV       -.32504
+    PHNLLON0  PASSNGRS            1.   RPMILES        7.41547
+    PHNLLON0  LFRPMASM      -7.41547   DMHNLLON            1.
+    PHNLLON0  LF1022S1           -1.   LF1022S2           -1.
+    PHNLLON6  REVENUES       -.03143   OBJECTIV        .03143
+    PHNLLON6  PASSNGRS           -1.   DMHNLLON            1.
+    PHNLLON6  DMHNLSEA           -1.   DMLONSEA           -1.
+    PHNLPAR0  REVENUES         .3343   OBJECTIV        -.3343
+    PHNLPAR0  PASSNGRS            1.   RPMILES        7.64184
+    PHNLPAR0  LFRPMASM      -7.64184   DMHNLPAR            1.
+    PHNLPAR0  LF1022S1           -1.   LF1022S2           -1.
+    PHNLPAR0  LF1022S3           -1.
+    PHNLPAR6  REVENUES       -.03166   OBJECTIV        .03166
+    PHNLPAR6  PASSNGRS           -1.   DMHNLPAR            1.
+    PHNLPAR6  DMHNLSEA           -1.   DMPARSEA           -1.
+    PHNLSEA0  REVENUES        .13391   OBJECTIV       -.13391
+    PHNLSEA0  PASSNGRS            1.   RPMILES        2.67711
+    PHNLSEA0  LFRPMASM      -2.67711   DMHNLSEA            1.
+    PHNLSEA0  P1001X32           -1.   LF1001S1           -1.
+    PHNLSEA1  REVENUES        .13391   OBJECTIV       -.13391
+    PHNLSEA1  PASSNGRS            1.   RPMILES        2.67711
+    PHNLSEA1  LFRPMASM      -2.67711   DMHNLSEA            1.
+    PHNLSEA1  P1002X43           -1.   LF1002S2           -1.
+    PHNLSEA2  REVENUES        .13391   OBJECTIV       -.13391
+    PHNLSEA2  PASSNGRS            1.   RPMILES        2.67711
+    PHNLSEA2  LFRPMASM      -2.67711   DMHNLSEA            1.
+    PHNLSEA2  P1007X43           -1.   LF1007S2           -1.
+    PHNLSFO0  REVENUES        .12174   OBJECTIV       -.12174
+    PHNLSFO0  PASSNGRS            1.   RPMILES         2.8919
+    PHNLSFO0  LFRPMASM       -2.8919   DMHNLSFO            1.
+    PHNLSFO0  LF1004S1           -1.   LF1004S2           -1.
+    PHNLSFO1  REVENUES        .12174   OBJECTIV       -.12174
+    PHNLSFO1  PASSNGRS            1.   RPMILES         2.8919
+    PHNLSFO1  LFRPMASM       -2.8919   DMHNLSFO            1.
+    PHNLSFO1  LF1047S1           -1.   LF1047S2           -1.
+    PHNLSFO7  REVENUES        -.0377   OBJECTIV         .0377
+    PHNLSFO7  PASSNGRS           -1.   DMHNLSFO            1.
+    PHNLSFO7  DMHNLLAX           -1.   DMLAXSFO           -1.
+    PHNLYVR0  REVENUES         .1351   OBJECTIV        -.1351
+    PHNLYVR0  PASSNGRS            1.   RPMILES        2.80333
+    PHNLYVR0  LFRPMASM      -2.80333   DMHNLYVR            1.
+    PHNLYVR0  P1002X42           -1.   LF1002S1           -1.
+    PHNLYVR0  LF1002S2           -1.
+    PHNLYVR1  REVENUES         .1351   OBJECTIV        -.1351
+    PHNLYVR1  PASSNGRS            1.   RPMILES        2.70531
+    PHNLYVR1  LFRPMASM      -2.70531   DMHNLYVR            1.
+    PHNLYVR1  P1022X23           -1.   LF1022S1           -1.
+    PHNLYVR7  REVENUES       -.01809   OBJECTIV        .01809
+    PHNLYVR7  PASSNGRS           -1.   DMHNLYVR            1.
+    PHNLYVR7  DMHNLSEA           -1.   DMSEAYVR           -1.
+    PLASSEA0  REVENUES        .05205   OBJECTIV       -.05205
+    PLASSEA0  PASSNGRS            1.   RPMILES         .86771
+    PLASSEA0  LFRPMASM       -.86771   DMLASSEA            1.
+    PLASSEA0  P1019X43           -1.   LF1019S2           -1.
+    PLASSEA1  REVENUES        .05205   OBJECTIV       -.05205
+    PLASSEA1  PASSNGRS            1.   RPMILES         .86771
+    PLASSEA1  LFRPMASM       -.86771   DMLASSEA            1.
+    PLASSEA1  P1021X32           -1.   LF1021S1           -1.
+    PLASYVR0  REVENUES        .05774   OBJECTIV       -.05774
+    PLASYVR0  PASSNGRS            1.   RPMILES         .99393
+    PLASYVR0  LFRPMASM       -.99393   DMLASYVR            1.
+    PLASYVR0  LF1019S1           -1.   LF1019S2           -1.
+    PLASYVR6  REVENUES       -.01359   OBJECTIV        .01359
+    PLASYVR6  PASSNGRS           -1.   DMLASYVR            1.
+    PLASYVR6  DMLASSEA           -1.   DMSEAYVR           -1.
+    PLAXOAK0  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXOAK0  PASSNGRS            1.   RPMILES         .33855
+    PLAXOAK0  LFRPMASM       -.33855   DMLAXOAK            1.
+    PLAXOAK0  P1105X32           -1.   LF1105S1           -1.
+    PLAXOAK1  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXOAK1  PASSNGRS            1.   RPMILES         .33855
+    PLAXOAK1  LFRPMASM       -.33855   DMLAXOAK            1.
+    PLAXOAK1  P1017X43           -1.   LF1017S2           -1.
+    PLAXOAK2  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXOAK2  PASSNGRS            1.   RPMILES         .33855
+    PLAXOAK2  LFRPMASM       -.33855   DMLAXOAK            1.
+    PLAXOAK2  P1046X23           -1.   LF1046S1           -1.
+    PLAXSEA0  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA0  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA0  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA0  P1008X53           -1.   LF1008S2           -1.
+    PLAXSEA0  LF1008S3           -1.
+    PLAXSEA1  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA1  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA1  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA1  P1009X43           -1.   LF1009S2           -1.
+    PLAXSEA2  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA2  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA2  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA2  P1011X42           -1.   LF1011S1           -1.
+    PLAXSEA2  LF1011S2           -1.
+    PLAXSEA3  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA3  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA3  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA3  P1012X32           -1.   LF1012S1           -1.
+    PLAXSEA4  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA4  PASSNGRS            1.   RPMILES        1.00997
+    PLAXSEA4  LFRPMASM      -1.00997   DMLAXSEA            1.
+    PLAXSEA4  P1017X42           -1.   LF1017S1           -1.
+    PLAXSEA4  LF1017S2           -1.
+    PLAXSEA5  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA5  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA5  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA5  P1026X23           -1.   LF1026S1           -1.
+    PLAXSEA6  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA6  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA6  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA6  P1027X23           -1.   LF1027S1           -1.
+    PLAXSEA7  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA7  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA7  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA7  P1029X24           -1.   LF1029S1           -1.
+    PLAXSEA7  LF1029S2           -1.
+    PLAXSEA8  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA8  PASSNGRS            1.   RPMILES        1.01801
+    PLAXSEA8  LFRPMASM      -1.01801   DMLAXSEA            1.
+    PLAXSEA8  P1030X24           -1.   LF1030S1           -1.
+    PLAXSEA8  LF1030S2           -1.
+    PLAXSEA9  REVENUES        .05607   OBJECTIV       -.05607
+    PLAXSEA9  PASSNGRS            1.   RPMILES         .95575
+    PLAXSEA9  LFRPMASM       -.95575   DMLAXSEA            1.
+    PLAXSEA9  P1050X32           -1.   LF1050S1           -1.
+    PLAXSFO0  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO0  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO0  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO0  P1004X32           -1.   LF1004S1           -1.
+    PLAXSFO1  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO1  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO1  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO1  P1008X54           -1.   LF1008S3           -1.
+    PLAXSFO2  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO2  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO2  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO2  P1011X43           -1.   LF1011S2           -1.
+    PLAXSFO3  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO3  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO3  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO3  P1029X23           -1.   LF1029S1           -1.
+    PLAXSFO4  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO4  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO4  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO4  P1030X23           -1.   LF1030S1           -1.
+    PLAXSFO5  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO5  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO5  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO5  P1047X34           -1.   LF1047S2           -1.
+    PLAXSFO6  REVENUES        .03072   OBJECTIV       -.03072
+    PLAXSFO6  PASSNGRS            1.   RPMILES         .33852
+    PLAXSFO6  LFRPMASM       -.33852   DMLAXSFO            1.
+    PLAXSFO6  P1051X23           -1.   LF1051S1           -1.
+    PLAXTPE0  REVENUES        .30609   OBJECTIV       -.30609
+    PLAXTPE0  PASSNGRS            1.   RPMILES        7.05137
+    PLAXTPE0  LFRPMASM      -7.05137   DMLAXTPE            1.
+    PLAXTPE0  P1027X25           -1.   LF1027S1           -1.
+    PLAXTPE0  LF1027S2           -1.   LF1027S3           -1.
+    PLAXTPE1  REVENUES        .30609   OBJECTIV       -.30609
+    PLAXTPE1  PASSNGRS            1.   RPMILES        7.14547
+    PLAXTPE1  LFRPMASM      -7.14547   DMLAXTPE            1.
+    PLAXTPE1  P1029X27           -1.   LF1029S1           -1.
+    PLAXTPE1  LF1029S2           -1.   LF1029S3           -1.
+    PLAXTPE1  LF1029S4           -1.   LF1029S5           -1.
+    PLAXTPE2  REVENUES        .30609   OBJECTIV       -.30609
+    PLAXTPE2  PASSNGRS            1.   RPMILES        7.11364
+    PLAXTPE2  LFRPMASM      -7.11364   DMLAXTPE            1.
+    PLAXTPE2  P1030X26           -1.   LF1030S1           -1.
+    PLAXTPE2  LF1030S2           -1.   LF1030S3           -1.
+    PLAXTPE2  LF1030S4           -1.
+    PLAXTPE8  REVENUES       -.02571   OBJECTIV        .02571
+    PLAXTPE8  PASSNGRS           -1.   DMLAXTPE            1.
+    PLAXTPE8  DMLAXSEA           -1.   DMSEATPE           -1.
+    PLAXTYO0  REVENUES         .2516   OBJECTIV        -.2516
+    PLAXTYO0  PASSNGRS            1.   RPMILES        5.74891
+    PLAXTYO0  LFRPMASM      -5.74891   DMLAXTYO            1.
+    PLAXTYO0  LF1027S1           -1.   LF1027S2           -1.
+    PLAXTYO1  REVENUES         .2516   OBJECTIV        -.2516
+    PLAXTYO1  PASSNGRS            1.   RPMILES          5.843
+    PLAXTYO1  LFRPMASM        -5.843   DMLAXTYO            1.
+    PLAXTYO1  LF1029S1           -1.   LF1029S2           -1.
+    PLAXTYO1  LF1029S3           -1.   LF1029S4           -1.
+    PLAXTYO2  REVENUES         .2516   OBJECTIV        -.2516
+    PLAXTYO2  PASSNGRS            1.   RPMILES        5.81118
+    PLAXTYO2  LFRPMASM      -5.81118   DMLAXTYO            1.
+    PLAXTYO2  LF1030S1           -1.   LF1030S2           -1.
+    PLAXTYO2  LF1030S3           -1.
+    PLAXTYO8  REVENUES        -.0273   OBJECTIV         .0273
+    PLAXTYO8  PASSNGRS           -1.   DMLAXTYO            1.
+    PLAXTYO8  DMLAXSEA           -1.   DMSEATYO           -1.
+    PLAXYVR0  REVENUES        .06181   OBJECTIV       -.06181
+    PLAXYVR0  PASSNGRS            1.   RPMILES        1.14422
+    PLAXYVR0  LFRPMASM      -1.14422   DMLAXYVR            1.
+    PLAXYVR0  P1008X52           -1.   LF1008S1           -1.
+    PLAXYVR0  LF1008S2           -1.   LF1008S3           -1.
+    PLAXYVR1  REVENUES        .06181   OBJECTIV       -.06181
+    PLAXYVR1  PASSNGRS            1.   RPMILES        1.08196
+    PLAXYVR1  LFRPMASM      -1.08196   DMLAXYVR            1.
+    PLAXYVR1  P1009X42           -1.   LF1009S1           -1.
+    PLAXYVR1  LF1009S2           -1.
+    PLAXYVR2  REVENUES        .06181   OBJECTIV       -.06181
+    PLAXYVR2  PASSNGRS            1.   RPMILES        1.14422
+    PLAXYVR2  LFRPMASM      -1.14422   DMLAXYVR            1.
+    PLAXYVR2  P1029X25           -1.   LF1029S1           -1.
+    PLAXYVR2  LF1029S2           -1.   LF1029S3           -1.
+    PLONPAR0  REVENUES        .02622   OBJECTIV       -.02622
+    PLONPAR0  PASSNGRS            1.   RPMILES         .22636
+    PLONPAR0  LFRPMASM       -.22636   DMLONPAR            1.
+    PLONPAR0  LF1022S3           -1.
+    PLONPAR1  REVENUES        .02622   OBJECTIV       -.02622
+    PLONPAR1  PASSNGRS            1.   RPMILES         .22636
+    PLONPAR1  LFRPMASM       -.22636   DMLONPAR            1.
+    PLONPAR1  LF1023S3           -1.
+    PLONPAR2  REVENUES        .02622   OBJECTIV       -.02622
+    PLONPAR2  PASSNGRS            1.   RPMILES         .22636
+    PLONPAR2  LFRPMASM       -.22636   DMLONPAR            1.
+    PLONPAR2  LF1026S3           -1.
+    PLONSEA0  REVENUES        .22255   OBJECTIV       -.22255
+    PLONSEA0  PASSNGRS            1.   RPMILES        4.78646
+    PLONSEA0  LFRPMASM      -4.78646   DMLONSEA            1.
+    PLONSEA0  LF1023S2           -1.
+    PLONSEA1  REVENUES        .22255   OBJECTIV       -.22255
+    PLONSEA1  PASSNGRS            1.   RPMILES        4.78646
+    PLONSEA1  LFRPMASM      -4.78646   DMLONSEA            1.
+    PLONSEA1  LF1026S2           -1.
+    PLONYVR0  REVENUES        .21935   OBJECTIV       -.21935
+    PLONYVR0  PASSNGRS            1.   RPMILES        4.71017
+    PLONYVR0  LFRPMASM      -4.71017   DMLONYVR            1.
+    PLONYVR0  LF1022S2           -1.
+    PLONYVR1  REVENUES        .21935   OBJECTIV       -.21935
+    PLONYVR1  PASSNGRS            1.   RPMILES        4.91267
+    PLONYVR1  LFRPMASM      -4.91267   DMLONYVR            1.
+    PLONYVR1  LF1023S1           -1.   LF1023S2           -1.
+    PLONYVR7  REVENUES       -.02248   OBJECTIV        .02248
+    PLONYVR7  PASSNGRS           -1.   DMLONYVR            1.
+    PLONYVR7  DMLONSEA           -1.   DMSEAYVR           -1.
+    POAKONT0  REVENUES        .03148   OBJECTIV       -.03148
+    POAKONT0  PASSNGRS            1.   RPMILES         .36196
+    POAKONT0  LFRPMASM       -.36196   DMOAKONT            1.
+    POAKONT0  LF1006S1           -1.
+    POAKONT1  REVENUES        .03148   OBJECTIV       -.03148
+    POAKONT1  PASSNGRS            1.   RPMILES         .36196
+    POAKONT1  LFRPMASM       -.36196   DMOAKONT            1.
+    POAKONT1  LF1013S2           -1.
+    POAKSEA0  REVENUES        .04311   OBJECTIV       -.04311
+    POAKSEA0  PASSNGRS            1.   RPMILES         .67142
+    POAKSEA0  LFRPMASM       -.67142   DMOAKSEA            1.
+    POAKSEA0  P1013X32           -1.   LF1013S1           -1.
+    POAKSEA1  REVENUES        .04311   OBJECTIV       -.04311
+    POAKSEA1  PASSNGRS            1.   RPMILES         .67142
+    POAKSEA1  LFRPMASM       -.67142   DMOAKSEA            1.
+    POAKSEA1  P1014X32           -1.   LF1014S1           -1.
+    POAKSEA2  REVENUES        .04311   OBJECTIV       -.04311
+    POAKSEA2  PASSNGRS            1.   RPMILES         .67142
+    POAKSEA2  LFRPMASM       -.67142   DMOAKSEA            1.
+    POAKSEA2  P1017X32           -1.   LF1017S1           -1.
+    PONTSFO0  REVENUES        .03152   OBJECTIV       -.03152
+    PONTSFO0  PASSNGRS            1.   RPMILES         .36328
+    PONTSFO0  LFRPMASM       -.36328   DMONTSFO            1.
+    PONTSFO0  P1015X43           -1.   LF1015S2           -1.
+    PONTSEA0  REVENUES        .05614   OBJECTIV       -.05614
+    PONTSEA0  PASSNGRS            1.   RPMILES        1.03338
+    PONTSEA0  LFRPMASM      -1.03338   DMONTSEA            1.
+    PONTSEA0  P1013X42           -1.   LF1013S1           -1.
+    PONTSEA0  LF1013S2           -1.
+    PONTSEA1  REVENUES        .05614   OBJECTIV       -.05614
+    PONTSEA1  PASSNGRS            1.   RPMILES        1.04277
+    PONTSEA1  LFRPMASM      -1.04277   DMONTSEA            1.
+    PONTSEA1  P1015X42           -1.   LF1015S1           -1.
+    PONTSEA1  LF1015S2           -1.
+    PONTSEA2  REVENUES        .05614   OBJECTIV       -.05614
+    PONTSEA2  PASSNGRS            1.   RPMILES        1.00139
+    PONTSEA2  LFRPMASM      -1.00139   DMONTSEA            1.
+    PONTSEA2  P1050X42           -1.   LF1050S1           -1.
+    PONTSEA2  LF1050S2           -1.
+    PPARSEA0  REVENUES        .23205   OBJECTIV       -.23205
+    PPARSEA0  PASSNGRS            1.   RPMILES        5.01282
+    PPARSEA0  LFRPMASM      -5.01282   DMPARSEA            1.
+    PPARSEA0  LF1023S2           -1.   LF1023S3           -1.
+    PPARSEA1  REVENUES        .23205   OBJECTIV       -.23205
+    PPARSEA1  PASSNGRS            1.   RPMILES        5.01282
+    PPARSEA1  LFRPMASM      -5.01282   DMPARSEA            1.
+    PPARSEA1  LF1026S2           -1.   LF1026S3           -1.
+    PPARYVR0  REVENUES        .22885   OBJECTIV       -.22885
+    PPARYVR0  PASSNGRS            1.   RPMILES        4.93653
+    PPARYVR0  LFRPMASM      -4.93653   DMPARYVR            1.
+    PPARYVR0  LF1022S2           -1.   LF1022S3           -1.
+    PPARYVR1  REVENUES        .22885   OBJECTIV       -.22885
+    PPARYVR1  PASSNGRS            1.   RPMILES        5.13904
+    PPARYVR1  LFRPMASM      -5.13904   DMPARYVR            1.
+    PPARYVR1  LF1023S1           -1.   LF1023S2           -1.
+    PPARYVR1  LF1023S3           -1.
+    PPARYVR7  REVENUES       -.02247   OBJECTIV        .02247
+    PPARYVR7  PASSNGRS           -1.   DMPARYVR            1.
+    PPARYVR7  DMPARSEA           -1.   DMSEAYVR           -1.
+    PRNOSEA0  REVENUES         .0382   OBJECTIV        -.0382
+    PRNOSEA0  PASSNGRS            1.   RPMILES         .56374
+    PRNOSEA0  LFRPMASM       -.56374   DMRNOSEA            1.
+    PRNOSEA0  P1018X43           -1.   LF1018S2           -1.
+    PRNOSEA1  REVENUES         .0382   OBJECTIV        -.0382
+    PRNOSEA1  PASSNGRS            1.   RPMILES         .56374
+    PRNOSEA1  LFRPMASM       -.56374   DMRNOSEA            1.
+    PRNOSEA1  P1020X32           -1.   LF1020S1           -1.
+    PRNOYVR0  REVENUES        .04394   OBJECTIV       -.04394
+    PRNOYVR0  PASSNGRS            1.   RPMILES         .68996
+    PRNOYVR0  LFRPMASM       -.68996   DMRNOYVR            1.
+    PRNOYVR0  LF1018S1           -1.   LF1018S2           -1.
+    PSEASFO0  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO0  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO0  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO0  P1008X34           -1.   LF1008S2           -1.
+    PSEASFO1  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO1  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO1  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO1  P1011X23           -1.   LF1011S1           -1.
+    PSEASFO2  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO2  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO2  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO2  P1015X23           -1.   LF1015S1           -1.
+    PSEASFO3  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO3  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO3  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO3  P1016X23           -1.   LF1016S1           -1.
+    PSEASFO4  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO4  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO4  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO4  P1028X32           -1.   LF1028S1           -1.
+    PSEASFO5  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO5  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO5  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO5  P1029X43           -1.   LF1029S2           -1.
+    PSEASFO6  REVENUES        .04347   OBJECTIV       -.04347
+    PSEASFO6  PASSNGRS            1.   RPMILES         .67949
+    PSEASFO6  LFRPMASM       -.67949   DMSEASFO            1.
+    PSEASFO6  P1030X43           -1.   LF1030S2           -1.
+    PSEATPE0  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE0  PASSNGRS            1.   RPMILES        6.09563
+    PSEATPE0  LFRPMASM      -6.09563   DMSEATPE            1.
+    PSEATPE0  LF1027S2           -1.   LF1027S3           -1.
+    PSEATPE1  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE1  PASSNGRS            1.   RPMILES        6.09563
+    PSEATPE1  LFRPMASM      -6.09563   DMSEATPE            1.
+    PSEATPE1  LF1028S2           -1.   LF1028S3           -1.
+    PSEATPE2  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE2  PASSNGRS            1.   RPMILES        6.12746
+    PSEATPE2  LFRPMASM      -6.12746   DMSEATPE            1.
+    PSEATPE2  LF1029S3           -1.   LF1029S4           -1.
+    PSEATPE2  LF1029S5           -1.
+    PSEATPE3  REVENUES        .27573   OBJECTIV       -.27573
+    PSEATPE3  PASSNGRS            1.   RPMILES        6.09563
+    PSEATPE3  LFRPMASM      -6.09563   DMSEATPE            1.
+    PSEATPE3  LF1030S3           -1.   LF1030S4           -1.
+    PSEATYO0  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO0  PASSNGRS            1.   RPMILES        4.79317
+    PSEATYO0  LFRPMASM      -4.79317   DMSEATYO            1.
+    PSEATYO0  LF1027S2           -1.
+    PSEATYO1  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO1  PASSNGRS            1.   RPMILES        4.79317
+    PSEATYO1  LFRPMASM      -4.79317   DMSEATYO            1.
+    PSEATYO1  LF1028S2           -1.
+    PSEATYO2  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO2  PASSNGRS            1.   RPMILES          4.825
+    PSEATYO2  LFRPMASM        -4.825   DMSEATYO            1.
+    PSEATYO2  LF1029S3           -1.   LF1029S4           -1.
+    PSEATYO3  REVENUES        .22283   OBJECTIV       -.22283
+    PSEATYO3  PASSNGRS            1.   RPMILES        4.79317
+    PSEATYO3  LFRPMASM      -4.79317   DMSEATYO            1.
+    PSEATYO3  LF1030S3           -1.
+    PSEAYVR0  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR0  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR0  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR0  P1002X32           -1.   LF1002S1           -1.
+    PSEAYVR1  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR1  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR1  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR1  P1008X32           -1.   LF1008S1           -1.
+    PSEAYVR2  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR2  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR2  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR2  P1009X32           -1.   LF1009S1           -1.
+    PSEAYVR3  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR3  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR3  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR3  P1010X32           -1.   LF1010S1           -1.
+    PSEAYVR4  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR4  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR4  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR4  P1018X32           -1.   LF1018S1           -1.
+    PSEAYVR5  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR5  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR5  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR5  P1019X32           -1.   LF1019S1           -1.
+    PSEAYVR6  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR6  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR6  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR6  P1023X32           -1.   LF1023S1           -1.
+    PSEAYVR7  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR7  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR7  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR7  P1029X45           -1.   LF1029S3           -1.
+    PSEAYVR8  REVENUES        .01928   OBJECTIV       -.01928
+    PSEAYVR8  PASSNGRS            1.   RPMILES         .12622
+    PSEAYVR8  LFRPMASM       -.12622   DMSEAYVR            1.
+    PSEAYVR8  P1032X23           -1.   LF1032S1           -1.
+    PSFOTPE0  REVENUES        .29218   OBJECTIV       -.29218
+    PSFOTPE0  PASSNGRS            1.   RPMILES        6.77512
+    PSFOTPE0  LFRPMASM      -6.77512   DMSFOTPE            1.
+    PSFOTPE0  LF1028S1           -1.   LF1028S2           -1.
+    PSFOTPE0  LF1028S3           -1.
+    PSFOTPE1  REVENUES        .29218   OBJECTIV       -.29218
+    PSFOTPE1  PASSNGRS            1.   RPMILES        6.80694
+    PSFOTPE1  LFRPMASM      -6.80694   DMSFOTPE            1.
+    PSFOTPE1  LF1029S2           -1.   LF1029S3           -1.
+    PSFOTPE1  LF1029S4           -1.   LF1029S5           -1.
+    PSFOTPE2  REVENUES        .29218   OBJECTIV       -.29218
+    PSFOTPE2  PASSNGRS            1.   RPMILES        6.77512
+    PSFOTPE2  LFRPMASM      -6.77512   DMSFOTPE            1.
+    PSFOTPE2  LF1030S2           -1.   LF1030S3           -1.
+    PSFOTPE2  LF1030S4           -1.
+    PSFOTPE8  REVENUES       -.02702   OBJECTIV        .02702
+    PSFOTPE8  PASSNGRS           -1.   DMSFOTPE            1.
+    PSFOTPE8  DMSEASFO           -1.   DMSEATPE           -1.
+    PSFOTYO0  REVENUES         .2378   OBJECTIV        -.2378
+    PSFOTYO0  PASSNGRS            1.   RPMILES        5.47265
+    PSFOTYO0  LFRPMASM      -5.47265   DMSFOTYO            1.
+    PSFOTYO0  LF1028S1           -1.   LF1028S2           -1.
+    PSFOTYO1  REVENUES         .2378   OBJECTIV        -.2378
+    PSFOTYO1  PASSNGRS            1.   RPMILES        5.50448
+    PSFOTYO1  LFRPMASM      -5.50448   DMSFOTYO            1.
+    PSFOTYO1  LF1029S2           -1.   LF1029S3           -1.
+    PSFOTYO1  LF1029S4           -1.
+    PSFOTYO2  REVENUES         .2378   OBJECTIV        -.2378
+    PSFOTYO2  PASSNGRS            1.   RPMILES        5.47265
+    PSFOTYO2  LFRPMASM      -5.47265   DMSFOTYO            1.
+    PSFOTYO2  LF1030S2           -1.   LF1030S3           -1.
+    PSFOTYO8  REVENUES        -.0285   OBJECTIV         .0285
+    PSFOTYO8  PASSNGRS           -1.   DMSFOTYO            1.
+    PSFOTYO8  DMSEASFO           -1.   DMSEATYO           -1.
+    PSFOYVR0  REVENUES        .04898   OBJECTIV       -.04898
+    PSFOYVR0  PASSNGRS            1.   RPMILES          .8057
+    PSFOYVR0  LFRPMASM        -.8057   DMSFOYVR            1.
+    PSFOYVR0  P1008X42           -1.   LF1008S1           -1.
+    PSFOYVR0  LF1008S2           -1.
+    PSFOYVR1  REVENUES        .04898   OBJECTIV       -.04898
+    PSFOYVR1  PASSNGRS            1.   RPMILES          .8057
+    PSFOYVR1  LFRPMASM        -.8057   DMSFOYVR            1.
+    PSFOYVR1  P1029X35           -1.   LF1029S2           -1.
+    PSFOYVR1  LF1029S3           -1.
+    PTPETYO0  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO0  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO0  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO0  LF1027S3           -1.
+    PTPETYO1  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO1  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO1  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO1  LF1028S3           -1.
+    PTPETYO2  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO2  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO2  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO2  LF1029S5           -1.
+    PTPETYO3  REVENUES        .07188   OBJECTIV       -.07188
+    PTPETYO3  PASSNGRS            1.   RPMILES        1.30247
+    PTPETYO3  LFRPMASM      -1.30247   DMTPETYO            1.
+    PTPETYO3  LF1030S4           -1.
+    PTPEYVR0  REVENUES        .27146   OBJECTIV       -.27146
+    PTPEYVR0  PASSNGRS            1.   RPMILES        6.00125
+    PTPEYVR0  LFRPMASM      -6.00125   DMTPEYVR            1.
+    PTPEYVR0  LF1029S4           -1.   LF1029S5           -1.
+    PTYOYVR0  REVENUES        .21887   OBJECTIV       -.21887
+    PTYOYVR0  PASSNGRS            1.   RPMILES        4.69878
+    PTYOYVR0  LFRPMASM      -4.69878   DMTYOYVR            1.
+    PTYOYVR0  LF1029S4           -1.
+    PYULYVR0  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR0  PASSNGRS            1.   RPMILES         2.4064
+    PYULYVR0  LFRPMASM       -2.4064   DMYULYVR            1.
+    PYULYVR0  P1032X63           -1.   LF1032S2           -1.
+    PYULYVR0  LF1032S3           -1.   LF1032S4           -1.
+    PYULYVR1  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR1  PASSNGRS            1.   RPMILES        2.28733
+    PYULYVR1  LFRPMASM      -2.28733   DMYULYVR            1.
+    PYULYVR1  P1033X42           -1.   LF1033S1           -1.
+    PYULYVR1  LF1033S2           -1.
+    PYULYVR2  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR2  PASSNGRS            1.   RPMILES        2.39258
+    PYULYVR2  LFRPMASM      -2.39258   DMYULYVR            1.
+    PYULYVR2  P1034X42           -1.   LF1034S1           -1.
+    PYULYVR2  LF1034S2           -1.
+    PYULYVR3  REVENUES        .11677   OBJECTIV       -.11677
+    PYULYVR3  PASSNGRS            1.   RPMILES        2.28726
+    PYULYVR3  LFRPMASM      -2.28726   DMYULYVR            1.
+    PYULYVR3  P1036X32           -1.   LF1036S1           -1.
+    PYULYWG0  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG0  PASSNGRS            1.   RPMILES        1.24837
+    PYULYWG0  LFRPMASM      -1.24837   DMYULYWG            1.
+    PYULYWG0  P1032X64           -1.   LF1032S3           -1.
+    PYULYWG0  LF1032S4           -1.
+    PYULYWG1  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG1  PASSNGRS            1.   RPMILES         1.1293
+    PYULYWG1  LFRPMASM       -1.1293   DMYULYWG            1.
+    PYULYWG1  P1033X43           -1.   LF1033S2           -1.
+    PYULYWG2  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG2  PASSNGRS            1.   RPMILES        1.24837
+    PYULYWG2  LFRPMASM      -1.24837   DMYULYWG            1.
+    PYULYWG2  P1037X42           -1.   LF1037S1           -1.
+    PYULYWG2  LF1037S2           -1.
+    PYULYWG3  REVENUES        .06398   OBJECTIV       -.06398
+    PYULYWG3  PASSNGRS            1.   RPMILES         1.1293
+    PYULYWG3  LFRPMASM       -1.1293   DMYULYWG            1.
+    PYULYWG3  P1039X32           -1.   LF1039S1           -1.
+    PYULYYZ0  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ0  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ0  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ0  P1032X65           -1.   LF1032S4           -1.
+    PYULYYZ1  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ1  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ1  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ1  P1034X43           -1.   LF1034S2           -1.
+    PYULYYZ2  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ2  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ2  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ2  P1037X43           -1.   LF1037S2           -1.
+    PYULYYZ3  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ3  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ3  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ3  P1040X32           -1.   LF1040S1           -1.
+    PYULYYZ4  REVENUES        .02995   OBJECTIV       -.02995
+    PYULYYZ4  PASSNGRS            1.   RPMILES         .31461
+    PYULYYZ4  LFRPMASM       -.31461   DMYULYYZ            1.
+    PYULYYZ4  P1041X32           -1.   LF1041S1           -1.
+    PYVRYWG0  REVENUES        .06529   OBJECTIV       -.06529
+    PYVRYWG0  PASSNGRS            1.   RPMILES        1.15803
+    PYVRYWG0  LFRPMASM      -1.15803   DMYVRYWG            1.
+    PYVRYWG0  P1032X34           -1.   LF1032S2           -1.
+    PYVRYWG1  REVENUES        .06529   OBJECTIV       -.06529
+    PYVRYWG1  PASSNGRS            1.   RPMILES        1.15803
+    PYVRYWG1  LFRPMASM      -1.15803   DMYVRYWG            1.
+    PYVRYWG1  P1033X23           -1.   LF1033S1           -1.
+    PYVRYWG2  REVENUES        .06529   OBJECTIV       -.06529
+    PYVRYWG2  PASSNGRS            1.   RPMILES        1.15803
+    PYVRYWG2  LFRPMASM      -1.15803   DMYVRYWG            1.
+    PYVRYWG2  P1035X23           -1.   LF1035S1           -1.
+    PYVRYYZ0  REVENUES        .10723   OBJECTIV       -.10723
+    PYVRYYZ0  PASSNGRS            1.   RPMILES        2.09179
+    PYVRYYZ0  LFRPMASM      -2.09179   DMYVRYYZ            1.
+    PYVRYYZ0  P1032X35           -1.   LF1032S2           -1.
+    PYVRYYZ0  LF1032S3           -1.
+    PYVRYYZ1  REVENUES        .10723   OBJECTIV       -.10723
+    PYVRYYZ1  PASSNGRS            1.   RPMILES        2.07796
+    PYVRYYZ1  LFRPMASM      -2.07796   DMYVRYYZ            1.
+    PYVRYYZ1  P1034X23           -1.   LF1034S1           -1.
+    PYVRYYZ2  REVENUES        .10723   OBJECTIV       -.10723
+    PYVRYYZ2  PASSNGRS            1.   RPMILES        2.09179
+    PYVRYYZ2  LFRPMASM      -2.09179   DMYVRYYZ            1.
+    PYVRYYZ2  P1035X24           -1.   LF1035S1           -1.
+    PYVRYYZ2  LF1035S2           -1.
+    PYWGYYZ0  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ0  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ0  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ0  P1032X45           -1.   LF1032S3           -1.
+    PYWGYYZ1  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ1  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ1  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ1  P1035X34           -1.   LF1035S2           -1.
+    PYWGYYZ2  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ2  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ2  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ2  P1037X23           -1.   LF1037S1           -1.
+    PYWGYYZ3  REVENUES        .05507   OBJECTIV       -.05507
+    PYWGYYZ3  PASSNGRS            1.   RPMILES         .93376
+    PYWGYYZ3  LFRPMASM       -.93376   DMYWGYYZ            1.
+    PYWGYYZ3  P1038X23           -1.   LF1038S1           -1.
+    PBOSOAK0  REVENUES        .13432   OBJECTIV       -.13432
+    PBOSOAK0  PASSNGRS            1.   RPMILES        2.68687
+    PBOSOAK0  LFRPMASM      -2.68687   DMBOSOAK            1.
+    PBOSOAK0  LF1046S2           -1.
+    PBOSOAK6  REVENUES       -.01157   OBJECTIV        .01157
+    PBOSOAK6  PASSNGRS           -1.   DMBOSOAK            1.
+    PBOSOAK6  DMBOSSFO           -1.   DMSFOOAK           -1.
+    PBOSBUR1  REVENUES       -.03469   OBJECTIV        .03469
+    PBOSBUR1  PASSNGRS           -1.   DMBOSBUR            1.
+    PBOSBUR1  DMBOSSFO           -1.   DMBURSFO           -1.
+    PBOSBUR2  REVENUES       -.04664   OBJECTIV        .04664
+    PBOSBUR2  PASSNGRS           -2.   DMBOSBUR            1.
+    PBOSBUR2  DMBOSSFO           -1.   DMLAXSFO           -1.
+    PBOSBUR2  DMLAXBUR           -1.
+    PBOSONT1  REVENUES       -.03725   OBJECTIV        .03725
+    PBOSONT1  PASSNGRS           -1.   DMBOSONT            1.
+    PBOSONT1  DMBOSSFO           -1.   DMONTSFO           -1.
+    PBOSONT2  REVENUES       -.04996   OBJECTIV        .04996
+    PBOSONT2  PASSNGRS           -2.   DMBOSONT            1.
+    PBOSONT2  DMBOSSFO           -1.   DMLAXSFO           -1.
+    PBOSONT2  DMLAXONT           -1.
+    PBURYVR1  REVENUES       -.01353   OBJECTIV        .01353
+    PBURYVR1  PASSNGRS           -1.   DMBURYVR            1.
+    PBURYVR1  DMBURSEA           -1.   DMSEAYVR           -1.
+    PBURTYO1  REVENUES       -.02686   OBJECTIV        .02686
+    PBURTYO1  PASSNGRS           -1.   DMBURTYO            1.
+    PBURTYO1  DMBURSEA           -1.   DMSEATYO           -1.
+    PBURTPE1  REVENUES       -.02529   OBJECTIV        .02529
+    PBURTPE1  PASSNGRS           -1.   DMBURTPE            1.
+    PBURTPE1  DMBURSEA           -1.   DMSEATPE           -1.
+    PBURHNL0  REVENUES        .12896   OBJECTIV       -.12896
+    PBURHNL0  PASSNGRS            1.   RPMILES        2.55929
+    PBURHNL0  LFRPMASM      -2.55929   DMBURHNL            1.
+    PBURHNL0  LF1005S2           -1.
+    PBURHNL6  REVENUES       -.01132   OBJECTIV        .01132
+    PBURHNL6  PASSNGRS           -1.   DMBURHNL            1.
+    PBURHNL6  DMLAXBUR           -1.   DMHNLLAX           -1.
+    PHNLOAK0  REVENUES        .12225   OBJECTIV       -.12225
+    PHNLOAK0  PASSNGRS            1.   RPMILES        2.88537
+    PHNLOAK0  LFRPMASM      -2.88537   DMHNLOAK            1.
+    PHNLOAK0  LF1005S1           -1.   LF1005S2           -1.
+    PHNLOAK1  REVENUES        .12225   OBJECTIV       -.12225
+    PHNLOAK1  PASSNGRS            1.   RPMILES        2.89192
+    PHNLOAK1  LFRPMASM      -2.89192   DMHNLOAK            1.
+    PHNLOAK1  LF1105S1           -1.   LF1105S2           -1.
+    PHNLOAK2  REVENUES        .12225   OBJECTIV       -.12225
+    PHNLOAK2  PASSNGRS            1.   RPMILES        2.96093
+    PHNLOAK2  LFRPMASM      -2.96093   DMHNLOAK            1.
+    PHNLOAK2  LF1006S1           -1.   LF1006S2           -1.
+    PHNLOAK8  REVENUES       -.03719   OBJECTIV        .03719
+    PHNLOAK8  PASSNGRS           -1.   DMHNLOAK            1.
+    PHNLOAK8  DMHNLLAX           -1.   DMLAXOAK           -1.
+    PHNLONT0  REVENUES        .13063   OBJECTIV       -.13063
+    PHNLONT0  PASSNGRS            1.   RPMILES        2.59897
+    PHNLONT0  LFRPMASM      -2.59897   DMHNLONT            1.
+    PHNLONT0  LF1006S2           -1.
+    PHNLONT6  REVENUES        -.0116   OBJECTIV         .0116
+    PHNLONT6  PASSNGRS           -1.   DMHNLONT            1.
+    PHNLONT6  DMHNLLAX           -1.   DMLAXONT           -1.
+    PHNLYWG1  REVENUES       -.01893   OBJECTIV        .01893
+    PHNLYWG1  PASSNGRS           -1.   DMHNLYWG            1.
+    PHNLYWG1  DMHNLYVR           -1.   DMYVRYWG           -1.
+    PHNLYYZ1  REVENUES       -.02585   OBJECTIV        .02585
+    PHNLYYZ1  PASSNGRS           -1.   DMHNLYYZ            1.
+    PHNLYYZ1  DMHNLYVR           -1.   DMYVRYYZ           -1.
+    PHNLYUL1  REVENUES       -.02429   OBJECTIV        .02429
+    PHNLYUL1  PASSNGRS           -1.   DMHNLYUL            1.
+    PHNLYUL1  DMHNLYVR           -1.   DMYULYVR           -1.
+    PLASTYO1  REVENUES       -.02076   OBJECTIV        .02076
+    PLASTYO1  PASSNGRS           -1.   DMLASTYO            1.
+    PLASTYO1  DMLASSEA           -1.   DMSEATYO           -1.
+    PLASTPE1  REVENUES       -.01956   OBJECTIV        .01956
+    PLASTPE1  PASSNGRS           -1.   DMLASTPE            1.
+    PLASTPE1  DMLASSEA           -1.   DMSEATPE           -1.
+    PLAXLON0  REVENUES        .25019   OBJECTIV       -.25019
+    PLAXLON0  PASSNGRS            1.   RPMILES         5.7422
+    PLAXLON0  LFRPMASM       -5.7422   DMLAXLON            1.
+    PLAXLON0  LF1026S1           -1.   LF1026S2           -1.
+    PLAXLON6  REVENUES       -.02843   OBJECTIV        .02843
+    PLAXLON6  PASSNGRS           -1.   DMLAXLON            1.
+    PLAXLON6  DMLAXSEA           -1.   DMLONSEA           -1.
+    PLAXLON7  REVENUES       -.03096   OBJECTIV        .03096
+    PLAXLON7  PASSNGRS           -1.   DMLAXLON            1.
+    PLAXLON7  DMLAXYVR           -1.   DMLONYVR           -1.
+    PLAXPAR0  REVENUES        .25943   OBJECTIV       -.25943
+    PLAXPAR0  PASSNGRS            1.   RPMILES        5.96857
+    PLAXPAR0  LFRPMASM      -5.96857   DMLAXPAR            1.
+    PLAXPAR0  LF1026S1           -1.   LF1026S2           -1.
+    PLAXPAR0  LF1026S3           -1.
+    PLAXPAR6  REVENUES       -.02868   OBJECTIV        .02868
+    PLAXPAR6  PASSNGRS           -1.   DMLAXPAR            1.
+    PLAXPAR6  DMLAXSEA           -1.   DMPARSEA           -1.
+    PLAXPAR7  REVENUES       -.03123   OBJECTIV        .03123
+    PLAXPAR7  PASSNGRS           -1.   DMLAXPAR            1.
+    PLAXPAR7  DMLAXYVR           -1.   DMPARYVR           -1.
+    PBURLON1  REVENUES       -.02834   OBJECTIV        .02834
+    PBURLON1  PASSNGRS           -1.   DMBURLON            1.
+    PBURLON1  DMBURSEA           -1.   DMLONSEA           -1.
+    PBURPAR1  REVENUES       -.02859   OBJECTIV        .02859
+    PBURPAR1  PASSNGRS           -1.   DMBURPAR            1.
+    PBURPAR1  DMBURSEA           -1.   DMPARSEA           -1.
+    PLONONT1  REVENUES       -.02984   OBJECTIV        .02984
+    PLONONT1  PASSNGRS           -1.   DMLONONT            1.
+    PLONONT1  DMLONSEA           -1.   DMONTSEA           -1.
+    PLONOAK1  REVENUES        -.0197   OBJECTIV         .0197
+    PLONOAK1  PASSNGRS           -1.   DMLONOAK            1.
+    PLONOAK1  DMLONSEA           -1.   DMOAKSEA           -1.
+    POAKPAR1  REVENUES        -.0198   OBJECTIV         .0198
+    POAKPAR1  PASSNGRS           -1.   DMOAKPAR            1.
+    POAKPAR1  DMOAKSEA           -1.   DMPARSEA           -1.
+    POAKTYO1  REVENUES         -.028   OBJECTIV          .028
+    POAKTYO1  PASSNGRS           -1.   DMOAKTYO            1.
+    POAKTYO1  DMOAKSEA           -1.   DMSEATYO           -1.
+    POAKTPE1  REVENUES       -.02654   OBJECTIV        .02654
+    POAKTPE1  PASSNGRS           -1.   DMOAKTPE            1.
+    POAKTPE1  DMOAKSEA           -1.   DMSEATPE           -1.
+    PONTPAR1  REVENUES       -.03012   OBJECTIV        .03012
+    PONTPAR1  PASSNGRS           -1.   DMONTPAR            1.
+    PONTPAR1  DMONTSEA           -1.   DMPARSEA           -1.
+    PONTTYO1  REVENUES       -.02605   OBJECTIV        .02605
+    PONTTYO1  PASSNGRS           -1.   DMONTTYO            1.
+    PONTTYO1  DMONTSEA           -1.   DMSEATYO           -1.
+    PONTTPE1  REVENUES       -.02451   OBJECTIV        .02451
+    PONTTPE1  PASSNGRS           -1.   DMONTTPE            1.
+    PONTTPE1  DMONTSEA           -1.   DMSEATPE           -1.
+    PPARSFO1  REVENUES       -.01968   OBJECTIV        .01968
+    PPARSFO1  PASSNGRS           -1.   DMPARSFO            1.
+    PPARSFO1  DMPARSEA           -1.   DMSEASFO           -1.
+    PRNOTYO1  REVENUES       -.02132   OBJECTIV        .02132
+    PRNOTYO1  PASSNGRS           -1.   DMRNOTYO            1.
+    PRNOTYO1  DMRNOSEA           -1.   DMSEATYO           -1.
+    PRNOTPE1  REVENUES        -.0202   OBJECTIV         .0202
+    PRNOTPE1  PASSNGRS           -1.   DMRNOTPE            1.
+    PRNOTPE1  DMRNOSEA           -1.   DMSEATPE           -1.
+    PTPEYWG1  REVENUES       -.03219   OBJECTIV        .03219
+    PTPEYWG1  PASSNGRS           -1.   DMTPEYWG            1.
+    PTPEYWG1  DMTPEYVR           -1.   DMYVRYWG           -1.
+    PTPEYYZ1  REVENUES       -.04208   OBJECTIV        .04208
+    PTPEYYZ1  PASSNGRS           -1.   DMTPEYYZ            1.
+    PTPEYYZ1  DMTPEYVR           -1.   DMYVRYYZ           -1.
+    PTPEYUL1  REVENUES       -.05292   OBJECTIV        .05292
+    PTPEYUL1  PASSNGRS           -1.   DMTPEYUL            1.
+    PTPEYUL1  DMTPEYVR           -1.   DMYULYVR           -1.
+    PTYOYUL1  REVENUES        -.0427   OBJECTIV         .0427
+    PTYOYUL1  PASSNGRS           -1.   DMTYOYUL            1.
+    PTYOYUL1  DMTYOYVR           -1.   DMYULYVR           -1.
+    PTYOYYZ1  REVENUES       -.03452   OBJECTIV        .03452
+    PTYOYYZ1  PASSNGRS           -1.   DMTYOYYZ            1.
+    PTYOYYZ1  DMTYOYVR           -1.   DMYVRYYZ           -1.
+    PTYOYWG1  REVENUES       -.02803   OBJECTIV        .02803
+    PTYOYWG1  PASSNGRS           -1.   DMTYOYWG            1.
+    PTYOYWG1  DMTYOYVR           -1.   DMYVRYWG           -1.
+    PLAXONT0  REVENUES        .01351   OBJECTIV       -.01351
+    PLAXONT0  PASSNGRS            1.   RPMILES         .04564
+    PLAXONT0  LFRPMASM       -.04564   DMLAXONT            1.
+    PLAXONT0  LF1050S2           -1.
+    GRDTIMO1  FLAV*1              1.   ACOCOSTS          .457
+    GRDTIMO1  OBJECTIV          .457
+    GRDTIMN1  FLAV*1              1.   ACOCOSTS       -.13333
+    GRDTIMN1  OBJECTIV       -.13333
+    GRDTIMO2  FLAV*2              1.   ACOCOSTS          .318
+    GRDTIMO2  OBJECTIV          .318
+    GRDTIMN2  FLAV*2              1.   ACOCOSTS       -.10692
+    GRDTIMN2  OBJECTIV       -.10692
+    GRDTIMO3  FLAV*3              1.   ACOCOSTS          .206
+    GRDTIMO3  OBJECTIV          .206
+    GRDTIMN3  FLAV*3              1.
+    GRDTIMO4  FLAV*4              1.   ACOCOSTS           .25
+    GRDTIMO4  OBJECTIV           .25
+    GRDTIMN4  FLAV*4              1.
+    GRDTIMO5  FLAV*5              1.   ACOCOSTS          .163
+    GRDTIMO5  OBJECTIV          .163
+    GRDTIMN5  FLAV*5              1.
+    GRDTIMO6  FLAV*6              1.   ACOCOSTS          .095
+    GRDTIMO6  OBJECTIV          .095
+    GRDTIMN6  FLAV*6              1.
+    N1001AC1  ACOCOSTS       14.0062   OBJECTIV       14.0062
+    N1001AC1  SYSTDEPT            1.   ACMILES        2.67711
+    N1001AC1  ASMILES     1086.90576   LFRPMASM    760.834032
+    N1001AC1  FLAV*1         5.53037   LF1001S1          284.
+    N1001AC1  MSHNLSEA            1.   P1001X32           67.
+    N1001AC2  ACOCOSTS      10.44277   OBJECTIV      10.44277
+    N1001AC2  SYSTDEPT            1.   ACMILES        2.67711
+    N1001AC2  ASMILES      690.69434   LFRPMASM    483.486038
+    N1001AC2  FLAV*2          5.5491   LF1001S1          180.
+    N1001AC2  MSHNLSEA            1.   P1001X32           67.
+    N1001AC3  ACOCOSTS       7.65023   OBJECTIV       7.65023
+    N1001AC3  SYSTDEPT            1.   ACMILES        2.67711
+    N1001AC3  ASMILES      492.58813   LFRPMASM    344.811691
+    N1001AC3  FLAV*3         5.74745   LF1001S1          128.
+    N1001AC3  MSHNLSEA            1.   P1001X32           67.
+    N1002AC1  ACOCOSTS      16.89049   OBJECTIV      16.89049
+    N1002AC1  SYSTDEPT            2.   ACMILES        2.80333
+    N1002AC1  ASMILES      1138.1499   LFRPMASM     796.70493
+    N1002AC1  FLAV*1         6.41046   LF1002S1          243.
+    N1002AC1  LF1002S2          284.   MSSEAYVR            1.
+    N1002AC1  MSHNLYVR            1.   MSHNLSEA            1.
+    N1002AC1  P1002X32          109.   P1002X42           40.
+    N1002AC1  P1002X43           67.
+    N1002AC2  ACOCOSTS      12.39107   OBJECTIV      12.39107
+    N1002AC2  SYSTDEPT            2.   ACMILES        2.80333
+    N1002AC2  ASMILES      723.25806   LFRPMASM    506.280642
+    N1002AC2  FLAV*2         6.35099   LF1002S1          154.
+    N1002AC2  LF1002S2          180.   MSSEAYVR            1.
+    N1002AC2  MSHNLYVR            1.   MSHNLSEA            1.
+    N1002AC2  P1002X32          109.   P1002X42           40.
+    N1002AC2  P1002X43           67.
+    N1002AC3  ACOCOSTS       8.97425   OBJECTIV       8.97425
+    N1002AC3  SYSTDEPT            2.   ACMILES        2.80333
+    N1002AC3  ASMILES      515.81177   LFRPMASM    361.068239
+    N1002AC3  FLAV*3         6.41862   LF1002S1          110.
+    N1002AC3  LF1002S2          128.   MSSEAYVR            1.
+    N1002AC3  MSHNLYVR            1.   MSHNLSEA            1.
+    N1002AC3  P1002X32          109.   P1002X42           40.
+    N1002AC3  P1002X43           67.
+    N1003AC1  ACOCOSTS      13.46672   OBJECTIV      13.46672
+    N1003AC1  SYSTDEPT            1.   ACMILES        2.55338
+    N1003AC1  ASMILES     1036.67114   LFRPMASM    725.669798
+    N1003AC1  FLAV*1         5.30481   LF1003S1          243.
+    N1003AC1  MSHNLLAX            1.   P1003X32          118.
+    N1003AC2  ACOCOSTS      10.03075   OBJECTIV      10.03075
+    N1003AC2  SYSTDEPT            1.   ACMILES        2.55338
+    N1003AC2  ASMILES      658.77124   LFRPMASM    461.139868
+    N1003AC2  FLAV*2         5.31883   LF1003S1          154.
+    N1003AC2  MSHNLLAX            1.   P1003X32          118.
+    N1003AC3  ACOCOSTS       7.34337   OBJECTIV       7.34337
+    N1003AC3  SYSTDEPT            1.   ACMILES        2.55338
+    N1003AC3  ASMILES      469.82129   LFRPMASM    328.874903
+    N1003AC3  FLAV*3         5.50122   LF1003S1          110.
+    N1003AC3  MSHNLLAX            1.   P1003X32          118.
+    N1004AC1  ACOCOSTS      17.27667   OBJECTIV      17.27667
+    N1004AC1  SYSTDEPT            2.   ACMILES         2.8919
+    N1004AC1  ASMILES     1174.11182   LFRPMASM    821.878274
+    N1004AC1  FLAV*1         6.57193   LF1004S1          243.
+    N1004AC1  LF1004S2          243.   MSLAXSFO            1.
+    N1004AC1  MSHNLSFO            1.   MSHNLLAX            1.
+    N1004AC1  P1004X32          168.   P1004X43          118.
+    N1004AC2  ACOCOSTS      12.68603   OBJECTIV      12.68603
+    N1004AC2  SYSTDEPT            2.   ACMILES         2.8919
+    N1004AC2  ASMILES      746.11035   LFRPMASM    522.277245
+    N1004AC2  FLAV*2         6.51583   LF1004S1          154.
+    N1004AC2  LF1004S2          154.   MSLAXSFO            1.
+    N1004AC2  MSHNLSFO            1.   MSHNLLAX            1.
+    N1004AC2  P1004X32          168.   P1004X43          118.
+    N1004AC3  ACOCOSTS       9.19391   OBJECTIV       9.19391
+    N1004AC3  SYSTDEPT            2.   ACMILES         2.8919
+    N1004AC3  ASMILES      532.10986   LFRPMASM    372.476902
+    N1004AC3  FLAV*3         6.59488   LF1004S1          110.
+    N1004AC3  LF1004S2          110.   MSLAXSFO            1.
+    N1004AC3  MSHNLSFO            1.   MSHNLLAX            1.
+    N1004AC3  P1004X32          168.   P1004X43          118.
+    N1005AC3  ACOCOSTS        9.1777   OBJECTIV        9.1777
+    N1005AC3  SYSTDEPT            2.   ACMILES        2.88537
+    N1005AC3  ASMILES      530.90723   LFRPMASM    371.635061
+    N1005AC3  FLAV*3         6.58188   LF1005S1          128.
+    N1005AC3  LF1005S2          128.   MSBUROAK            1.
+    N1005AC3  MSHNLOAK            1.
+    N1105AC3  ACOCOSTS       9.19396   OBJECTIV       9.19396
+    N1105AC3  SYSTDEPT            2.   ACMILES        2.89192
+    N1105AC3  ASMILES      532.11377   LFRPMASM    372.479639
+    N1105AC3  FLAV*3         6.59493   LF1105S1          128.
+    N1105AC3  LF1105S2          110.   MSLAXOAK            1.
+    N1105AC3  MSHNLOAK            1.   MSHNLLAX            1.
+    N1105AC3  P1105X32           46.   P1105X43          118.
+    N1006AC3  ACOCOSTS        9.3651   OBJECTIV        9.3651
+    N1006AC3  SYSTDEPT            2.   ACMILES        2.96093
+    N1006AC3  ASMILES      544.81104   LFRPMASM    381.367728
+    N1006AC3  FLAV*3         6.73225   LF1006S1          128.
+    N1006AC3  LF1006S2          128.   MSOAKONT            1.
+    N1006AC3  MSHNLOAK            1.
+    N1007AC1  ACOCOSTS      27.19154   OBJECTIV      27.19154
+    N1007AC1  SYSTDEPT            2.   ACMILES        5.16595
+    N1007AC1  ASMILES     2097.37598   LFRPMASM   1468.163186
+    N1007AC1  FLAV*1        10.71753   LF1007S1          284.
+    N1007AC1  LF1007S2          284.   MSBOSSEA            1.
+    N1007AC1  MSBOSHNL            1.   MSHNLSEA            1.
+    N1007AC1  P1007X43           67.
+    N1007AC2  ACOCOSTS      20.25861   OBJECTIV      20.25861
+    N1007AC2  SYSTDEPT            2.   ACMILES        5.16595
+    N1007AC2  ASMILES     1332.81494   LFRPMASM    932.970458
+    N1007AC2  FLAV*2        10.74784   LF1007S1          180.
+    N1007AC2  LF1007S2          180.   MSBOSSEA            1.
+    N1007AC2  MSBOSHNL            1.   MSHNLSEA            1.
+    N1007AC2  P1007X43           67.
+    N1007AC3  ACOCOSTS      14.83356   OBJECTIV      14.83356
+    N1007AC3  SYSTDEPT            2.   ACMILES        5.16595
+    N1007AC3  ASMILES      950.53516   LFRPMASM    665.374612
+    N1007AC3  FLAV*3        11.12024   LF1007S1          128.
+    N1007AC3  LF1007S2          128.   MSBOSSEA            1.
+    N1007AC3  MSBOSHNL            1.   MSHNLSEA            1.
+    N1007AC3  P1007X43           67.
+    N1008AC1  ACOCOSTS      11.99082   OBJECTIV      11.99082
+    N1008AC1  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC1  ASMILES      464.55518   LFRPMASM    325.188626
+    N1008AC1  FLAV*1         4.03592   LF1008S1          243.
+    N1008AC1  LF1008S2          243.   LF1008S3          243.
+    N1008AC1  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC1  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC1  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC1  P1008X32          109.   P1008X42           71.
+    N1008AC1  P1008X52           77.   P1008X34          170.
+    N1008AC1  P1008X53          139.   P1008X54          168.
+    N1008AC2  ACOCOSTS       8.39427   OBJECTIV       8.39427
+    N1008AC2  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC2  ASMILES      295.20972   LFRPMASM    206.646804
+    N1008AC2  FLAV*2          3.8304   LF1008S1          154.
+    N1008AC2  LF1008S2          154.   LF1008S3          154.
+    N1008AC2  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC2  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC2  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC2  P1008X32          109.   P1008X42           71.
+    N1008AC2  P1008X52           77.   P1008X34          170.
+    N1008AC2  P1008X53          139.   P1008X54          168.
+    N1008AC3  ACOCOSTS       5.87068   OBJECTIV       5.87068
+    N1008AC3  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC3  ASMILES      210.53731   LFRPMASM    147.376117
+    N1008AC3  FLAV*3         3.53701   LF1008S1          110.
+    N1008AC3  LF1008S2          110.   LF1008S3          110.
+    N1008AC3  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC3  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC3  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC3  P1008X32          109.   P1008X42           71.
+    N1008AC3  P1008X52           77.   P1008X34          170.
+    N1008AC3  P1008X53          139.   P1008X54          168.
+    N1008AC4  ACOCOSTS       3.99147   OBJECTIV       3.99147
+    N1008AC4  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC4  ASMILES      109.84555   LFRPMASM     76.891885
+    N1008AC4  FLAV*4         3.40841   LF1008S1           57.
+    N1008AC4  LF1008S2           57.   LF1008S3           57.
+    N1008AC4  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC4  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC4  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC4  P1008X32          109.   P1008X42           71.
+    N1008AC4  P1008X52           77.   P1008X34          170.
+    N1008AC4  P1008X53          139.   P1008X54          168.
+    N1008AC5  ACOCOSTS       4.41133   OBJECTIV       4.41133
+    N1008AC5  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC5  ASMILES       141.8838   LFRPMASM      99.31866
+    N1008AC5  FLAV*5         3.42334   LF1008S1           74.
+    N1008AC5  LF1008S2           74.   LF1008S3           74.
+    N1008AC5  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC5  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC5  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC5  P1008X32          109.   P1008X42           71.
+    N1008AC5  P1008X52           77.   P1008X34          170.
+    N1008AC5  P1008X53          139.   P1008X54          168.
+    N1008AC6  ACOCOSTS       3.43737   OBJECTIV       3.43737
+    N1008AC6  SYSTDEPT            3.   ACMILES        1.14422
+    N1008AC6  ASMILES      108.70131   LFRPMASM     76.090917
+    N1008AC6  FLAV*6         3.59515   LF1008S1           56.
+    N1008AC6  LF1008S2           56.   LF1008S3           56.
+    N1008AC6  MSSEAYVR            1.   MSSFOYVR            1.
+    N1008AC6  MSLAXYVR            1.   MSSEASFO            1.
+    N1008AC6  MSLAXSEA            1.   MSLAXSFO            1.
+    N1008AC6  P1008X32          109.   P1008X42           71.
+    N1008AC6  P1008X52           77.   P1008X34          170.
+    N1008AC6  P1008X53          139.   P1008X54          168.
+    N1009AC1  ACOCOSTS       9.38535   OBJECTIV       9.38535
+    N1009AC1  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC1  ASMILES      439.27612   LFRPMASM    307.493284
+    N1009AC1  FLAV*1         3.27241   LF1009S1          243.
+    N1009AC1  LF1009S2          243.   MSSEAYVR            1.
+    N1009AC1  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC1  P1009X32          109.   P1009X42           77.
+    N1009AC1  P1009X43          139.
+    N1009AC2  ACOCOSTS       6.65893   OBJECTIV       6.65893
+    N1009AC2  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC2  ASMILES      279.14575   LFRPMASM    195.402025
+    N1009AC2  FLAV*2         3.14753   LF1009S1          154.
+    N1009AC2  LF1009S2          154.   MSSEAYVR            1.
+    N1009AC2  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC2  P1009X32          109.   P1009X42           77.
+    N1009AC2  P1009X43          139.
+    N1009AC3  ACOCOSTS       4.70526   OBJECTIV       4.70526
+    N1009AC3  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC3  ASMILES      199.08081   LFRPMASM    139.356567
+    N1009AC3  FLAV*3          2.9931   LF1009S1          110.
+    N1009AC3  LF1009S2          110.   MSSEAYVR            1.
+    N1009AC3  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC3  P1009X32          109.   P1009X42           77.
+    N1009AC3  P1009X43          139.
+    N1009AC4  ACOCOSTS       3.27055   OBJECTIV       3.27055
+    N1009AC4  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC4  ASMILES      103.86824   LFRPMASM     72.707768
+    N1009AC4  FLAV*4         2.90163   LF1009S1           57.
+    N1009AC4  LF1009S2           57.   MSSEAYVR            1.
+    N1009AC4  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC4  P1009X32          109.   P1009X42           77.
+    N1009AC4  P1009X43          139.
+    N1009AC5  ACOCOSTS       3.58556   OBJECTIV       3.58556
+    N1009AC5  SYSTDEPT            2.   ACMILES        1.08196
+    N1009AC5  ASMILES      134.16312   LFRPMASM     93.914184
+    N1009AC5  FLAV*5         2.92913   LF1009S1           74.
+    N1009AC5  LF1009S2           74.   MSSEAYVR            1.
+    N1009AC5  MSLAXYVR            1.   MSLAXSEA            1.
+    N1009AC5  P1009X32          109.   P1009X42           77.
+    N1009AC5  P1009X43          139.
+    N1010AC1  ACOCOSTS        2.8843   OBJECTIV        2.8843
+    N1010AC1  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC1  ASMILES       51.24359   LFRPMASM     35.870513
+    N1010AC1  FLAV*1          .88009   LF1010S1          243.
+    N1010AC1  MSSEAYVR            1.   P1010X32          109.
+    N1010AC2  ACOCOSTS        1.9483   OBJECTIV        1.9483
+    N1010AC2  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC2  ASMILES       32.56366   LFRPMASM     22.794562
+    N1010AC2  FLAV*2          .80189   LF1010S1          154.
+    N1010AC2  MSSEAYVR            1.   P1010X32          109.
+    N1010AC3  ACOCOSTS       1.32401   OBJECTIV       1.32401
+    N1010AC3  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC3  ASMILES       23.22369   LFRPMASM     16.256583
+    N1010AC3  FLAV*3          .67117   LF1010S1          110.
+    N1010AC3  MSSEAYVR            1.   P1010X32          109.
+    N1010AC4  ACOCOSTS        .84307   OBJECTIV        .84307
+    N1010AC4  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC4  ASMILES       12.11671   LFRPMASM      8.481697
+    N1010AC4  FLAV*4           .6329   LF1010S1           57.
+    N1010AC4  MSSEAYVR            1.   P1010X32          109.
+    N1010AC5  ACOCOSTS        .95496   OBJECTIV        .95496
+    N1010AC5  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC5  ASMILES       15.65075   LFRPMASM     10.955525
+    N1010AC5  FLAV*5          .62384   LF1010S1           74.
+    N1010AC5  MSSEAYVR            1.   P1010X32          109.
+    N1010AC6  ACOCOSTS        .67624   OBJECTIV        .67624
+    N1010AC6  SYSTDEPT            1.   ACMILES         .12622
+    N1010AC6  ASMILES        11.9905   LFRPMASM       8.39335
+    N1010AC6  FLAV*6          .61067   LF1010S1           56.
+    N1010AC6  MSSEAYVR            1.   P1010X32          109.
+    N1011AC1  ACOCOSTS       9.10651   OBJECTIV       9.10651
+    N1011AC1  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC1  ASMILES      413.31152   LFRPMASM    289.318064
+    N1011AC1  FLAV*1         3.15583   LF1011S1          243.
+    N1011AC1  LF1011S2          243.   MSSEASFO            1.
+    N1011AC1  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC1  P1011X23          170.   P1011X42          139.
+    N1011AC1  P1011X43          168.
+    N1011AC2  ACOCOSTS       6.44597   OBJECTIV       6.44597
+    N1011AC2  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC2  ASMILES      262.64624   LFRPMASM    183.852368
+    N1011AC2  FLAV*2         3.02851   LF1011S1          154.
+    N1011AC2  LF1011S2          154.   MSSEASFO            1.
+    N1011AC2  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC2  P1011X23          170.   P1011X42          139.
+    N1011AC2  P1011X43          168.
+    N1011AC3  ACOCOSTS       4.54666   OBJECTIV       4.54666
+    N1011AC3  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC3  ASMILES      187.31361   LFRPMASM    131.119527
+    N1011AC3  FLAV*3         2.86584   LF1011S1          110.
+    N1011AC3  LF1011S2          110.   MSSEASFO            1.
+    N1011AC3  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC3  P1011X23          170.   P1011X42          139.
+    N1011AC3  P1011X43          168.
+    N1011AC4  ACOCOSTS        3.1484   OBJECTIV        3.1484
+    N1011AC4  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC4  ASMILES       97.72881   LFRPMASM     68.410167
+    N1011AC4  FLAV*4         2.77551   LF1011S1           57.
+    N1011AC4  LF1011S2           57.   MSSEASFO            1.
+    N1011AC4  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC4  P1011X23          170.   P1011X42          139.
+    N1011AC4  P1011X43          168.
+    N1011AC5  ACOCOSTS       3.45638   OBJECTIV       3.45638
+    N1011AC5  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC5  ASMILES      126.23305   LFRPMASM     88.363135
+    N1011AC5  FLAV*5          2.7995   LF1011S1           74.
+    N1011AC5  LF1011S2           74.   MSSEASFO            1.
+    N1011AC5  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC5  P1011X23          170.   P1011X42          139.
+    N1011AC5  P1011X43          168.
+    N1011AC6  ACOCOSTS       2.76114   OBJECTIV       2.76114
+    N1011AC6  SYSTDEPT            2.   ACMILES        1.01801
+    N1011AC6  ASMILES        96.7108   LFRPMASM      67.69756
+    N1011AC6  FLAV*6         2.98447   LF1011S1           56.
+    N1011AC6  LF1011S2           56.   MSSEASFO            1.
+    N1011AC6  MSLAXSEA            1.   MSLAXSFO            1.
+    N1011AC6  P1011X23          170.   P1011X42          139.
+    N1011AC6  P1011X43          168.
+    N1012AC1  ACOCOSTS       6.50105   OBJECTIV       6.50105
+    N1012AC1  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC1  ASMILES      388.03247   LFRPMASM    271.622729
+    N1012AC1  FLAV*1         2.39232   LF1012S1          243.
+    N1012AC1  MSLAXSEA            1.   P1012X32          139.
+    N1012AC2  ACOCOSTS       4.71063   OBJECTIV       4.71063
+    N1012AC2  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC2  ASMILES      246.58224   LFRPMASM    172.607568
+    N1012AC2  FLAV*2         2.34564   LF1012S1          154.
+    N1012AC2  MSLAXSEA            1.   P1012X32          139.
+    N1012AC3  ACOCOSTS       3.38125   OBJECTIV       3.38125
+    N1012AC3  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC3  ASMILES      175.85712   LFRPMASM    123.099984
+    N1012AC3  FLAV*3         2.32193   LF1012S1          110.
+    N1012AC3  MSLAXSEA            1.   P1012X32          139.
+    N1012AC4  ACOCOSTS       2.42747   OBJECTIV       2.42747
+    N1012AC4  SYSTDEPT            1.   ACMILES         .95575
+    N1012AC4  ASMILES        91.7515   LFRPMASM      64.22605
+    N1012AC4  FLAV*4         2.26873   LF1012S1           57.
+    N1012AC4  MSLAXSEA            1.   P1012X32          139.
+    N1012AC5  MSLAXSEA            1.   P1012X32          139.
+    N1012AC5  ASMILES      118.51237   LFRPMASM     82.958659
+    N1012AC5  FLAV*5         2.30529   SYSTDEPT            1.
+    N1012AC5  ACMILES         .95575   ACOCOSTS        2.6306
+    N1012AC5  OBJECTIV        2.6306   LF1012S1           74.
+    N1013AC3  ACOCOSTS       4.58479   OBJECTIV       4.58479
+    N1013AC3  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC3  ASMILES      190.14275   LFRPMASM    133.099925
+    N1013AC3  FLAV*3         2.89643   LF1013S1          128.
+    N1013AC3  LF1013S2          128.   MSOAKSEA            1.
+    N1013AC3  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC3  P1013X32           43.   P1013X42           25.
+    N1013AC4  ACOCOSTS       3.17776   OBJECTIV       3.17776
+    N1013AC4  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC4  ASMILES       99.20493   LFRPMASM     69.443451
+    N1013AC4  FLAV*4         2.80583   LF1013S1           67.
+    N1013AC4  LF1013S2           67.   MSOAKSEA            1.
+    N1013AC4  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC4  P1013X32           43.   P1013X42           25.
+    N1013AC5  ACOCOSTS       3.48744   OBJECTIV       3.48744
+    N1013AC5  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC5  ASMILES      128.13968   LFRPMASM     89.697776
+    N1013AC5  FLAV*5         2.83067   LF1013S1           86.
+    N1013AC5  LF1013S2           86.   MSOAKSEA            1.
+    N1013AC5  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC5  P1013X32           43.   P1013X42           25.
+    N1013AC6  ACOCOSTS       2.78943   OBJECTIV       2.78943
+    N1013AC6  SYSTDEPT            2.   ACMILES        1.03338
+    N1013AC6  ASMILES       98.17149   LFRPMASM     68.720043
+    N1013AC6  FLAV*6         3.01988   LF1013S1           66.
+    N1013AC6  LF1013S2           66.   MSOAKSEA            1.
+    N1013AC6  MSONTSEA            1.   MSOAKONT            1.
+    N1013AC6  P1013X32           43.   P1013X42           25.
+    N1014AC3  ACOCOSTS        4.4958   OBJECTIV        4.4958
+    N1014AC3  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC3  ASMILES      183.53999   LFRPMASM    128.477993
+    N1014AC3  FLAV*3         2.82502   LF1014S1          128.
+    N1014AC3  LF1014S2          128.   MSOAKSEA            1.
+    N1014AC3  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC3  P1014X32           43.
+    N1014AC4  ACOCOSTS       3.10922   OBJECTIV       3.10922
+    N1014AC4  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC4  ASMILES       95.75999   LFRPMASM     67.031993
+    N1014AC4  FLAV*4         2.73507   LF1014S1           67.
+    N1014AC4  LF1014S2           67.   MSOAKSEA            1.
+    N1014AC4  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC4  P1014X32           43.
+    N1014AC5  ACOCOSTS       3.41495   OBJECTIV       3.41495
+    N1014AC5  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC5  ASMILES      123.68999   LFRPMASM     86.582993
+    N1014AC5  FLAV*5         2.75793   LF1014S1           86.
+    N1014AC5  LF1014S2           86.   MSOAKSEA            1.
+    N1014AC5  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC5  P1014X32           43.
+    N1014AC6  ACOCOSTS        2.7234   OBJECTIV        2.7234
+    N1014AC6  SYSTDEPT            2.   ACMILES          .9975
+    N1014AC6  ASMILES        94.7625   LFRPMASM      66.33375
+    N1014AC6  FLAV*6         2.93724   LF1014S1           66.
+    N1014AC6  LF1014S2           66.   MSOAKSEA            1.
+    N1014AC6  MSBURSEA            1.   MSBUROAK            1.
+    N1014AC6  P1014X32           43.
+    N1015AC3  ACOCOSTS       4.60806   OBJECTIV       4.60806
+    N1015AC3  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC3  ASMILES      191.86919   LFRPMASM    134.308433
+    N1015AC3  FLAV*3         2.91511   LF1015S1          110.
+    N1015AC3  LF1015S2          128.   MSSEASFO            1.
+    N1015AC3  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC3  P1015X23          170.   P1015X42           25.
+    N1015AC3  P1015X43           69.
+    N1015AC4  ACOCOSTS       3.19568   OBJECTIV       3.19568
+    N1015AC4  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC4  ASMILES      100.10562   LFRPMASM     70.073934
+    N1015AC4  FLAV*4         2.82434   LF1015S1           57.
+    N1015AC4  LF1015S2           67.   MSSEASFO            1.
+    N1015AC4  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC4  P1015X23          170.   P1015X42           25.
+    N1015AC4  P1015X43           69.
+    N1015AC5  ACOCOSTS       3.50639   OBJECTIV       3.50639
+    N1015AC5  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC5  ASMILES      129.30312   LFRPMASM     90.512184
+    N1015AC5  FLAV*5         2.84969   LF1015S1           74.
+    N1015AC5  LF1015S2           86.   MSSEASFO            1.
+    N1015AC5  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC5  P1015X23          170.   P1015X42           25.
+    N1015AC5  P1015X43           69.
+    N1015AC6  ACOCOSTS       2.80669   OBJECTIV       2.80669
+    N1015AC6  SYSTDEPT            2.   ACMILES        1.04277
+    N1015AC6  ASMILES       99.06287   LFRPMASM     69.344009
+    N1015AC6  FLAV*6         3.04149   LF1015S1           56.
+    N1015AC6  LF1015S2           66.   MSSEASFO            1.
+    N1015AC6  MSONTSEA            1.   MSONTSFO            1.
+    N1015AC6  P1015X23          170.   P1015X42           25.
+    N1015AC6  P1015X43           69.
+    N1016AC3  ACOCOSTS       4.51701   OBJECTIV       4.51701
+    N1016AC3  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC3  ASMILES      185.11406   LFRPMASM    129.579842
+    N1016AC3  FLAV*3         2.84205   LF1016S1          110.
+    N1016AC3  LF1016S2          128.   MSSEASFO            1.
+    N1016AC3  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC3  P1016X23          170.   P1016X43           81.
+    N1016AC4  ACOCOSTS       3.12556   OBJECTIV       3.12556
+    N1016AC4  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC4  ASMILES       96.58124   LFRPMASM     67.606868
+    N1016AC4  FLAV*4         2.75194   LF1016S1           57.
+    N1016AC4  LF1016S2           67.   MSSEASFO            1.
+    N1016AC4  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC4  P1016X23          170.   P1016X43           81.
+    N1016AC5  ACOCOSTS       3.43223   OBJECTIV       3.43223
+    N1016AC5  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC5  ASMILES      124.75075   LFRPMASM     87.325525
+    N1016AC5  FLAV*5         2.77527   LF1016S1           74.
+    N1016AC5  LF1016S2           86.   MSSEASFO            1.
+    N1016AC5  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC5  P1016X23          170.   P1016X43           81.
+    N1016AC6  ACOCOSTS       2.73914   OBJECTIV       2.73914
+    N1016AC6  SYSTDEPT            2.   ACMILES        1.00605
+    N1016AC6  ASMILES       95.57518   LFRPMASM     66.902626
+    N1016AC6  FLAV*6         2.95694   LF1016S1           56.
+    N1016AC6  LF1016S2           66.   MSSEASFO            1.
+    N1016AC6  MSBURSEA            1.   MSBURSFO            1.
+    N1016AC6  P1016X23          170.   P1016X43           81.
+    N1017AC3  ACOCOSTS       4.52672   OBJECTIV       4.52672
+    N1017AC3  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC3  ASMILES       185.8343   LFRPMASM     130.08401
+    N1017AC3  FLAV*3         2.84984   LF1017S1          128.
+    N1017AC3  LF1017S2          128.   MSOAKSEA            1.
+    N1017AC3  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC3  P1017X32           43.   P1017X42          139.
+    N1017AC3  P1017X43           46.
+    N1017AC4  ACOCOSTS       3.13304   OBJECTIV       3.13304
+    N1017AC4  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC4  ASMILES       96.95699   LFRPMASM     67.869893
+    N1017AC4  FLAV*4         2.75966   LF1017S1           67.
+    N1017AC4  LF1017S2           67.   MSOAKSEA            1.
+    N1017AC4  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC4  P1017X32           43.   P1017X42          139.
+    N1017AC4  P1017X43           46.
+    N1017AC5  ACOCOSTS       3.44014   OBJECTIV       3.44014
+    N1017AC5  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC5  ASMILES      125.23611   LFRPMASM     87.665277
+    N1017AC5  FLAV*5         2.78321   LF1017S1           86.
+    N1017AC5  LF1017S2           86.   MSOAKSEA            1.
+    N1017AC5  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC5  P1017X32           43.   P1017X42          139.
+    N1017AC5  P1017X43           46.
+    N1017AC6  ACOCOSTS       2.74634   OBJECTIV       2.74634
+    N1017AC6  SYSTDEPT            2.   ACMILES        1.00997
+    N1017AC6  ASMILES       95.94705   LFRPMASM     67.162935
+    N1017AC6  FLAV*6         2.96596   LF1017S1           66.
+    N1017AC6  LF1017S2           66.   MSOAKSEA            1.
+    N1017AC6  MSLAXSEA            1.   MSLAXOAK            1.
+    N1017AC6  P1017X32           43.   P1017X42          139.
+    N1017AC6  P1017X43           46.
+    N1018AC1  ACOCOSTS       7.67623   OBJECTIV       7.67623
+    N1018AC1  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC1  ASMILES      280.12378   LFRPMASM    196.086646
+    N1018AC1  FLAV*1          2.5578   LF1018S1          243.
+    N1018AC1  LF1018S2          243.   MSSEAYVR            1.
+    N1018AC1  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC1  P1018X32          109.   P1018X43           85.
+    N1018AC2  ACOCOSTS       5.35357   OBJECTIV       5.35357
+    N1018AC2  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC2  ASMILES      178.00974   LFRPMASM    124.606818
+    N1018AC2  FLAV*2         2.41802   LF1018S1          154.
+    N1018AC2  LF1018S2          154.   MSSEAYVR            1.
+    N1018AC2  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC2  P1018X32          109.   P1018X43           85.
+    N1018AC3  ACOCOSTS        3.7331   OBJECTIV        3.7331
+    N1018AC3  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC3  ASMILES      126.95268   LFRPMASM     88.866876
+    N1018AC3  FLAV*3         2.21302   LF1018S1          110.
+    N1018AC3  LF1018S2          110.   MSSEAYVR            1.
+    N1018AC3  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC3  P1018X32          109.   P1018X43           85.
+    N1018AC4  ACOCOSTS       2.52182   OBJECTIV       2.52182
+    N1018AC4  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC4  ASMILES       66.23618   LFRPMASM     46.365326
+    N1018AC4  FLAV*4          2.1286   LF1018S1           57.
+    N1018AC4  LF1018S2           57.   MSSEAYVR            1.
+    N1018AC4  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC4  P1018X32          109.   P1018X43           85.
+    N1018AC5  ACOCOSTS       2.79372   OBJECTIV       2.79372
+    N1018AC5  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC5  ASMILES       85.55505   LFRPMASM     59.888535
+    N1018AC5  FLAV*5         2.13455   LF1018S1           74.
+    N1018AC5  LF1018S2           74.   MSSEAYVR            1.
+    N1018AC5  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC5  P1018X32          109.   P1018X43           85.
+    N1018AC6  ACOCOSTS       2.15753   OBJECTIV       2.15753
+    N1018AC6  SYSTDEPT            2.   ACMILES         .68996
+    N1018AC6  ASMILES       65.54617   LFRPMASM     45.882319
+    N1018AC6  FLAV*6         2.22898   LF1018S1           56.
+    N1018AC6  LF1018S2           56.   MSSEAYVR            1.
+    N1018AC6  MSRNOYVR            1.   MSRNOSEA            1.
+    N1018AC6  P1018X32          109.   P1018X43           85.
+    N1019AC1  ACOCOSTS       9.00153   OBJECTIV       9.00153
+    N1019AC1  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC1  ASMILES      403.53516   LFRPMASM    282.474612
+    N1019AC1  FLAV*1         3.11193   LF1019S1          243.
+    N1019AC1  LF1019S2          243.   MSSEAYVR            1.
+    N1019AC1  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC1  P1019X32          109.   P1019X43          110.
+    N1019AC2  ACOCOSTS       6.36578   OBJECTIV       6.36578
+    N1019AC2  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC2  ASMILES      256.43359   LFRPMASM    179.503513
+    N1019AC2  FLAV*2          2.9837   LF1019S1          154.
+    N1019AC2  LF1019S2          154.   MSSEAYVR            1.
+    N1019AC2  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC2  P1019X32          109.   P1019X43          110.
+    N1019AC3  ACOCOSTS       4.48694   OBJECTIV       4.48694
+    N1019AC3  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC3  ASMILES      182.88293   LFRPMASM    128.018051
+    N1019AC3  FLAV*3         2.81792   LF1019S1          110.
+    N1019AC3  LF1019S2          110.   MSSEAYVR            1.
+    N1019AC3  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC3  P1019X32          109.   P1019X43          110.
+    N1019AC4  ACOCOSTS        3.1024   OBJECTIV        3.1024
+    N1019AC4  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC4  ASMILES       95.41718   LFRPMASM     66.792026
+    N1019AC4  FLAV*4         2.72803   LF1019S1           57.
+    N1019AC4  LF1019S2           57.   MSSEAYVR            1.
+    N1019AC4  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC4  P1019X32          109.   P1019X43          110.
+    N1019AC5  ACOCOSTS       3.40774   OBJECTIV       3.40774
+    N1019AC5  SYSTDEPT            2.   ACMILES         .99393
+    N1019AC5  ASMILES      123.24718   LFRPMASM     86.273026
+    N1019AC5  FLAV*5         2.75069   LF1019S1           74.
+    N1019AC5  LF1019S2           74.   MSSEAYVR            1.
+    N1019AC5  MSLASYVR            1.   MSLASSEA            1.
+    N1019AC5  P1019X32          109.   P1019X43          110.
+    N1020AC1  ACOCOSTS       4.79193   OBJECTIV       4.79193
+    N1020AC1  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC1  ASMILES      228.88037   LFRPMASM    160.216259
+    N1020AC1  FLAV*1         1.67771   LF1020S1          243.
+    N1020AC1  MSRNOSEA            1.   P1020X32           85.
+    N1020AC2  ACOCOSTS       3.40527   OBJECTIV       3.40527
+    N1020AC2  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC2  ASMILES      145.44612   LFRPMASM    101.812284
+    N1020AC2  FLAV*2         1.61613   LF1020S1          154.
+    N1020AC2  MSRNOSEA            1.   P1020X32           85.
+    N1020AC3  ACOCOSTS       2.40909   OBJECTIV       2.40909
+    N1020AC3  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC3  ASMILES      103.72899   LFRPMASM     72.610293
+    N1020AC3  FLAV*3         1.54185   LF1020S1          110.
+    N1020AC3  MSRNOSEA            1.   P1020X32           85.
+    N1020AC4  ACOCOSTS       1.67875   OBJECTIV       1.67875
+    N1020AC4  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC4  ASMILES       54.11951   LFRPMASM     37.883657
+    N1020AC4  FLAV*4          1.4957   LF1020S1           57.
+    N1020AC4  MSRNOSEA            1.   P1020X32           85.
+    N1020AC5  ACOCOSTS       1.83876   OBJECTIV       1.83876
+    N1020AC5  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC5  ASMILES       69.90431   LFRPMASM     48.933017
+    N1020AC5  FLAV*5         1.51071   LF1020S1           74.
+    N1020AC5  MSRNOSEA            1.   P1020X32           85.
+    N1020AC6  ACOCOSTS       1.48129   OBJECTIV       1.48129
+    N1020AC6  SYSTDEPT            1.   ACMILES         .56374
+    N1020AC6  ASMILES       53.55576   LFRPMASM     37.489032
+    N1020AC6  FLAV*6          1.6183   LF1020S1           56.
+    N1020AC6  MSRNOSEA            1.   P1020X32           85.
+    N1021AC1  ACOCOSTS       6.11723   OBJECTIV       6.11723
+    N1021AC1  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC1  ASMILES       352.2915   LFRPMASM     246.60405
+    N1021AC1  FLAV*1         2.23184   LF1021S1          243.
+    N1021AC1  MSLASSEA            1.   P1021X32          110.
+    N1021AC2  ACOCOSTS       4.41748   OBJECTIV       4.41748
+    N1021AC2  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC2  ASMILES      223.87006   LFRPMASM    156.709042
+    N1021AC2  FLAV*2         2.18181   LF1021S1          154.
+    N1021AC2  MSLASSEA            1.   P1021X32          110.
+    N1021AC3  ACOCOSTS       3.16293   OBJECTIV       3.16293
+    N1021AC3  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC3  ASMILES      159.65924   LFRPMASM    111.761468
+    N1021AC3  FLAV*3         2.14675   LF1021S1          110.
+    N1021AC3  MSLASSEA            1.   P1021X32          110.
+    N1021AC4  ACOCOSTS       2.25933   OBJECTIV       2.25933
+    N1021AC4  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC4  ASMILES       83.30049   LFRPMASM     58.310343
+    N1021AC4  FLAV*4         2.09513   LF1021S1           57.
+    N1021AC4  MSLASSEA            1.   P1021X32          110.
+    N1021AC5  ACOCOSTS       2.45278   OBJECTIV       2.45278
+    N1021AC5  SYSTDEPT            1.   ACMILES         .86771
+    N1021AC5  ASMILES      107.59644   LFRPMASM     75.317508
+    N1021AC5  FLAV*5         2.12685   LF1021S1           74.
+    N1021AC5  MSLASSEA            1.   P1021X32          110.
+    N1022AC1  ACOCOSTS      40.32039   OBJECTIV      40.32039
+    N1022AC1  SYSTDEPT            3.   ACMILES        7.64184
+    N1022AC1  ASMILES     3102.58496   LFRPMASM   2171.809472
+    N1022AC1  FLAV*1        15.88107   LF1022S1          284.
+    N1022AC1  LF1022S2          284.   LF1022S3          284.
+    N1022AC1  NOPTLON1            2.   NOPTLON0            2.
+    N1022AC1  MSHNLYVR            1.   MSLONYVR            1.
+    N1022AC1  MSLONPAR            1.   P1022X23           40.
+    N1023AC1  ACOCOSTS       29.4082   OBJECTIV       29.4082
+    N1023AC1  SYSTDEPT            3.   ACMILES        5.13904
+    N1023AC1  ASMILES     2086.44897   LFRPMASM   1460.514279
+    N1023AC1  FLAV*1        11.31847   LF1023S1          243.
+    N1023AC1  LF1023S2          243.   LF1023S3          284.
+    N1023AC1  NOPTLON1            2.   NOPTLON0            2.
+    N1023AC1  MSSEAYVR            1.   MSLONYVR            1.
+    N1023AC1  MSLONSEA            1.   MSPARSEA            1.
+    N1023AC1  MSLONPAR            1.   P1023X32          109.
+    N1026AC1  ACOCOSTS      33.02493   OBJECTIV      33.02493
+    N1026AC1  SYSTDEPT            3.   ACMILES        5.96857
+    N1026AC1  ASMILES     2423.23682   LFRPMASM   1696.265774
+    N1026AC1  FLAV*1         12.8307   LF1026S1          243.
+    N1026AC1  LF1026S2          243.   LF1026S3          284.
+    N1026AC1  NOPTLON1            2.   NOPTLON0            2.
+    N1026AC1  MSLAXSEA            1.   MSLAXLON            1.
+    N1026AC1  MSLONSEA            1.   MSPARSEA            1.
+    N1026AC1  MSLONPAR            1.   P1026X23          139.
+    N1027AC1  ACOCOSTS      37.74599   OBJECTIV      37.74599
+    N1027AC1  SYSTDEPT            3.   ACMILES        7.05137
+    N1027AC1  ASMILES     2862.85791   LFRPMASM   2004.000537
+    N1027AC1  FLAV*1        14.80466   LF1027S1          243.
+    N1027AC1  LF1027S2          263.   LF1027S3          284.
+    N1027AC1  NOPTTYO1            2.   NOPTTYO0            2.
+    N1027AC1  MSLAXSEA            1.   MSLAXTPE            1.
+    N1027AC1  MSSEATYO            1.   MSSEATPE            1.
+    N1027AC1  MSTPETYO            1.   P1027X23          139.
+    N1027AC1  P1027X25           18.
+    N1028AC1  ACOCOSTS       36.5415   OBJECTIV       36.5415
+    N1028AC1  SYSTDEPT            3.   ACMILES        6.77512
+    N1028AC1  ASMILES     2750.69678   LFRPMASM   1925.487746
+    N1028AC1  FLAV*1        14.30104   LF1028S1          243.
+    N1028AC1  LF1028S2          263.   LF1028S3          284.
+    N1028AC1  NOPTTYO1            2.   NOPTTYO0            2.
+    N1028AC1  MSSEASFO            1.   MSSEATYO            1.
+    N1028AC1  MSSEATPE            1.   MSTPETYO            1.
+    N1028AC1  P1028X32          170.
+    N1029AC1  ACOCOSTS      42.82423   OBJECTIV      42.82423
+    N1029AC1  SYSTDEPT            5.   ACMILES        7.14547
+    N1029AC1  ASMILES     2901.05981   LFRPMASM   2030.741867
+    N1029AC1  FLAV*1        16.27618   LF1029S1          243.
+    N1029AC1  LF1029S2          243.   LF1029S3          243.
+    N1029AC1  LF1029S4          304.   LF1029S5          284.
+    N1029AC1  NOPTTYO1            2.   NOPTTYO0            2.
+    N1029AC1  MSLAXSFO            1.   MSLAXSEA            1.
+    N1029AC1  MSLAXYVR            1.   MSLAXTPE            1.
+    N1029AC1  MSSEASFO            1.   MSSFOYVR            1.
+    N1029AC1  MSSEAYVR            1.   MSSEATYO            1.
+    N1029AC1  MSSEATPE            1.   MSTPETYO            1.
+    N1029AC1  P1029X23          168.   P1029X24          139.
+    N1029AC1  P1029X25           77.   P1029X27           18.
+    N1029AC1  P1029X43          170.   P1029X35           71.
+    N1029AC1  P1029X45          109.
+    N1030AC1  ACOCOSTS      40.35146   OBJECTIV      40.35146
+    N1030AC1  SYSTDEPT            4.   ACMILES        7.11364
+    N1030AC1  ASMILES     2888.13794   LFRPMASM   2021.696558
+    N1030AC1  FLAV*1        15.56816   LF1030S1          243.
+    N1030AC1  LF1030S2          243.   LF1030S3          263.
+    N1030AC1  LF1030S4          284.   NOPTTYO1            2.
+    N1030AC1  NOPTTYO0            2.   MSLAXSFO            1.
+    N1030AC1  MSLAXSEA            1.   MSLAXTPE            1.
+    N1030AC1  MSSEASFO            1.   MSSEATYO            1.
+    N1030AC1  MSSEATPE            1.   MSTPETYO            1.
+    N1030AC1  P1030X23          168.   P1030X24          139.
+    N1030AC1  P1030X26           18.   P1030X43          170.
+    N1032AC1  ACOCOSTS       23.8204   OBJECTIV       23.8204
+    N1032AC1  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC1  ASMILES     1131.43799   LFRPMASM    792.006593
+    N1032AC1  FLAV*1         8.33032   LF1032S1          243.
+    N1032AC1  LF1032S2          284.   LF1032S3          284.
+    N1032AC1  LF1032S4          284.   LF1032S5          243.
+    N1032AC1  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC1  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC1  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC1  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC1  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC1  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC1  P1032X23          109.   P1032X34           89.
+    N1032AC1  P1032X35           76.   P1032X63           44.
+    N1032AC1  P1032X45           83.   P1032X64           99.
+    N1032AC1  P1032X65          130.   P1032X75           85.
+    N1032AC1  P1032X76          115.
+    N1032AC2  ACOCOSTS      16.92001   OBJECTIV      16.92001
+    N1032AC2  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC2  ASMILES      718.99268   LFRPMASM    503.294876
+    N1032AC2  FLAV*2         8.02122   LF1032S1          154.
+    N1032AC2  LF1032S2          180.   LF1032S3          180.
+    N1032AC2  LF1032S4          180.   LF1032S5          154.
+    N1032AC2  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC2  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC2  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC2  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC2  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC2  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC2  P1032X23          109.   P1032X34           89.
+    N1032AC2  P1032X35           76.   P1032X63           44.
+    N1032AC2  P1032X45           83.   P1032X64           99.
+    N1032AC2  P1032X65          130.   P1032X75           85.
+    N1032AC2  P1032X76          115.
+    N1032AC3  ACOCOSTS      11.96625   OBJECTIV      11.96625
+    N1032AC3  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC3  ASMILES      512.76978   LFRPMASM    358.938846
+    N1032AC3  FLAV*3         7.64572   LF1032S1          110.
+    N1032AC3  LF1032S2          128.   LF1032S3          128.
+    N1032AC3  LF1032S4          128.   LF1032S5          110.
+    N1032AC3  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC3  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC3  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC3  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC3  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC3  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC3  P1032X23          109.   P1032X34           89.
+    N1032AC3  P1032X35           76.   P1032X63           44.
+    N1032AC3  P1032X45           83.   P1032X64           99.
+    N1032AC3  P1032X65          130.   P1032X75           85.
+    N1032AC3  P1032X76          115.
+    N1032AC4  ACOCOSTS       8.33277   OBJECTIV       8.33277
+    N1032AC4  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC4  ASMILES      267.53198   LFRPMASM    187.272386
+    N1032AC4  FLAV*4         7.41556   LF1032S1           57.
+    N1032AC4  LF1032S2           67.   LF1032S3           67.
+    N1032AC4  LF1032S4           67.   LF1032S5           57.
+    N1032AC4  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC4  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC4  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC4  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC4  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC4  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC4  P1032X23          109.   P1032X34           89.
+    N1032AC4  P1032X35           76.   P1032X63           44.
+    N1032AC4  P1032X45           83.   P1032X64           99.
+    N1032AC4  P1032X65          130.   P1032X75           85.
+    N1032AC4  P1032X76          115.
+    N1032AC5  ACOCOSTS       9.12932   OBJECTIV       9.12932
+    N1032AC5  SYSTDEPT            5.   ACMILES        2.78679
+    N1032AC5  ASMILES      345.56226   LFRPMASM    241.893582
+    N1032AC5  FLAV*5         7.48883   LF1032S1           74.
+    N1032AC5  LF1032S2           86.   LF1032S3           86.
+    N1032AC5  LF1032S4           86.   LF1032S5           74.
+    N1032AC5  MSSEAYVR            1.   MSBOSSEA            1.
+    N1032AC5  MSYVRYWG            1.   MSYVRYYZ            1.
+    N1032AC5  MSYULYVR            1.   MSBOSYVR            1.
+    N1032AC5  MSYWGYYZ            1.   MSYULYWG            1.
+    N1032AC5  MSBOSYWG            1.   MSYULYYZ            1.
+    N1032AC5  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1032AC5  P1032X23          109.   P1032X34           89.
+    N1032AC5  P1032X35           76.   P1032X63           44.
+    N1032AC5  P1032X45           83.   P1032X64           99.
+    N1032AC5  P1032X65          130.   P1032X75           85.
+    N1032AC5  P1032X76          115.
+    N1033AC1  ACOCOSTS      18.08295   OBJECTIV      18.08295
+    N1033AC1  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC1  ASMILES      1031.8501   LFRPMASM     722.29507
+    N1033AC1  FLAV*1         6.58316   LF1033S1          284.
+    N1033AC1  LF1033S2          284.   LF1033S3          243.
+    N1033AC1  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC1  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC1  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC1  P1033X23           89.   P1033X42           44.
+    N1033AC1  P1033X43           99.   P1033X54          115.
+    N1033AC2  ACOCOSTS       13.0472   OBJECTIV       13.0472
+    N1033AC2  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC2  ASMILES      655.70752   LFRPMASM    458.995264
+    N1033AC2  FLAV*2         6.43074   LF1033S1          180.
+    N1033AC2  LF1033S2          180.   LF1033S3          154.
+    N1033AC2  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC2  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC2  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC2  P1033X23           89.   P1033X42           44.
+    N1033AC2  P1033X43           99.   P1033X54          115.
+    N1033AC3  ACOCOSTS       9.33593   OBJECTIV       9.33593
+    N1033AC3  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC3  ASMILES      467.63647   LFRPMASM    327.345529
+    N1033AC3  FLAV*3         6.31759   LF1033S1          128.
+    N1033AC3  LF1033S2          128.   LF1033S3          110.
+    N1033AC3  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC3  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC3  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC3  P1033X23           89.   P1033X42           44.
+    N1033AC3  P1033X43           99.   P1033X54          115.
+    N1033AC4  ACOCOSTS       6.66027   OBJECTIV       6.66027
+    N1033AC4  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC4  ASMILES      243.98424   LFRPMASM    170.788968
+    N1033AC4  FLAV*4         6.16384   LF1033S1           67.
+    N1033AC4  LF1033S2           67.   LF1033S3           57.
+    N1033AC4  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC4  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC4  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC4  P1033X23           89.   P1033X42           44.
+    N1033AC4  P1033X43           99.   P1033X54          115.
+    N1033AC5  ACOCOSTS       7.23383   OBJECTIV       7.23383
+    N1033AC5  SYSTDEPT            3.   ACMILES         2.5415
+    N1033AC5  ASMILES      315.14624   LFRPMASM    220.602368
+    N1033AC5  FLAV*5         6.25562   LF1033S1           86.
+    N1033AC5  LF1033S2           86.   LF1033S3           74.
+    N1033AC5  MSYVRYWG            1.   MSYULYVR            1.
+    N1033AC5  MSBOSYVR            1.   MSYULYWG            1.
+    N1033AC5  MSBOSYWG            1.   MSBOSYUL            1.
+    N1033AC5  P1033X23           89.   P1033X42           44.
+    N1033AC5  P1033X43           99.   P1033X54          115.
+    N1034AC1  ACOCOSTS      15.09963   OBJECTIV      15.09963
+    N1034AC1  SYSTDEPT            2.   ACMILES        2.39258
+    N1034AC1  ASMILES      971.38599   LFRPMASM    679.970193
+    N1034AC1  FLAV*1         5.66166   LF1034S1          284.
+    N1034AC1  LF1034S2          284.   MSYVRYYZ            1.
+    N1034AC1  MSYULYVR            1.   MSYULYYZ            1.
+    N1034AC1  P1034X23           76.   P1034X42           44.
+    N1034AC1  P1034X43          130.
+    N1034AC2  ACOCOSTS      11.02328   OBJECTIV      11.02328
+    N1034AC2  SYSTDEPT            2.   ACMILES        2.39258
+    N1034AC2  ASMILES      617.28467   LFRPMASM    432.099269
+    N1034AC2  FLAV*2         5.58658   LF1034S1          180.
+    N1034AC2  LF1034S2          180.   MSYVRYYZ            1.
+    N1034AC2  MSYULYVR            1.   MSYULYYZ            1.
+    N1034AC2  P1034X23           76.   P1034X42           44.
+    N1034AC2  P1034X43          130.
+    N1034AC3  ACOCOSTS       7.95559   OBJECTIV       7.95559
+    N1034AC3  SYSTDEPT            2.   ACMILES        2.39258
+    N1034AC3  ASMILES      440.23389   LFRPMASM    308.163723
+    N1034AC3  FLAV*3         5.60122   LF1034S1          128.
+    N1034AC3  LF1034S2          128.   MSYVRYYZ            1.
+    N1034AC3  MSYULYVR            1.   MSYULYYZ            1.
+    N1034AC3  P1034X23           76.   P1034X42           44.
+    N1034AC3  P1034X43          130.
+    N1035AC1  ACOCOSTS      13.78819   OBJECTIV      13.78819
+    N1035AC1  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC1  ASMILES      849.26563   LFRPMASM    594.485941
+    N1035AC1  FLAV*1         5.11333   LF1035S1          284.
+    N1035AC1  LF1035S2          284.   MSYVRYWG            1.
+    N1035AC1  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC1  P1035X23           89.   P1035X24           76.
+    N1035AC1  P1035X34           83.
+    N1035AC2  ACOCOSTS      10.02165   OBJECTIV      10.02165
+    N1035AC2  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC2  ASMILES      539.68115   LFRPMASM    377.776805
+    N1035AC2  FLAV*2         5.02682   LF1035S1          180.
+    N1035AC2  LF1035S2          180.   MSYVRYWG            1.
+    N1035AC2  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC2  P1035X23           89.   P1035X24           76.
+    N1035AC2  P1035X34           83.
+    N1035AC3  ACOCOSTS       7.20963   OBJECTIV       7.20963
+    N1035AC3  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC3  ASMILES      384.88867   LFRPMASM    269.422069
+    N1035AC3  FLAV*3         5.00266   LF1035S1          128.
+    N1035AC3  LF1035S2          128.   MSYVRYWG            1.
+    N1035AC3  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC3  P1035X23           89.   P1035X24           76.
+    N1035AC3  P1035X34           83.
+    N1035AC4  ACOCOSTS       5.19931   OBJECTIV       5.19931
+    N1035AC4  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC4  ASMILES      200.81155   LFRPMASM    140.568085
+    N1035AC4  FLAV*4           4.893   LF1035S1           67.
+    N1035AC4  LF1035S2           67.   MSYVRYWG            1.
+    N1035AC4  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC4  P1035X23           89.   P1035X24           76.
+    N1035AC4  P1035X34           83.
+    N1035AC5  ACOCOSTS       5.62541   OBJECTIV       5.62541
+    N1035AC5  SYSTDEPT            2.   ACMILES        2.09179
+    N1035AC5  ASMILES      259.38159   LFRPMASM    181.567113
+    N1035AC5  FLAV*5         4.97605   LF1035S1           86.
+    N1035AC5  LF1035S2           86.   MSYVRYWG            1.
+    N1035AC5  MSYVRYYZ            1.   MSYWGYYZ            1.
+    N1035AC5  P1035X23           89.   P1035X24           76.
+    N1035AC5  P1035X34           83.
+    N1036AC1  ACOCOSTS      15.74868   OBJECTIV      15.74868
+    N1036AC1  SYSTDEPT            2.   ACMILES        2.54144
+    N1036AC1  ASMILES     1031.82446   LFRPMASM    722.277122
+    N1036AC1  FLAV*1         5.93304   LF1036S1          284.
+    N1036AC1  LF1036S2          243.   MSYULYVR            1.
+    N1036AC1  MSBOSYVR            1.   MSBOSYUL            1.
+    N1036AC1  P1036X32           44.   P1036X43          115.
+    N1036AC2  ACOCOSTS      11.51899   OBJECTIV      11.51899
+    N1036AC2  SYSTDEPT            2.   ACMILES        2.54144
+    N1036AC2  ASMILES      655.69141   LFRPMASM    458.983987
+    N1036AC2  FLAV*2         5.86362   LF1036S1          180.
+    N1036AC2  LF1036S2          154.   MSYULYVR            1.
+    N1036AC2  MSBOSYVR            1.   MSBOSYUL            1.
+    N1036AC2  P1036X32           44.   P1036X43          115.
+    N1036AC3  ACOCOSTS       8.32477   OBJECTIV       8.32477
+    N1036AC3  SYSTDEPT            2.   ACMILES        2.54144
+    N1036AC3  ASMILES      467.62476   LFRPMASM    327.337332
+    N1036AC3  FLAV*3         5.89746   LF1036S1          128.
+    N1036AC3  LF1036S2          110.   MSYULYVR            1.
+    N1036AC3  MSBOSYVR            1.   MSBOSYUL            1.
+    N1036AC3  P1036X32           44.   P1036X43          115.
+    N1037AC4  ACOCOSTS        3.5884   OBJECTIV        3.5884
+    N1037AC4  SYSTDEPT            2.   ACMILES        1.24837
+    N1037AC4  ASMILES      119.84406   LFRPMASM     83.890842
+    N1037AC4  FLAV*4          3.2298   LF1037S1           67.
+    N1037AC4  LF1037S2           67.   MSYWGYYZ            1.
+    N1037AC4  MSYULYWG            1.   MSYULYYZ            1.
+    N1037AC4  P1037X23           83.   P1037X42           99.
+    N1037AC4  P1037X43          130.
+    N1037AC5  ACOCOSTS       3.92172   OBJECTIV       3.92172
+    N1037AC5  SYSTDEPT            2.   ACMILES        1.24837
+    N1037AC5  ASMILES      154.79855   LFRPMASM    108.358985
+    N1037AC5  FLAV*5         3.26646   LF1037S1           86.
+    N1037AC5  LF1037S2           86.   MSYWGYYZ            1.
+    N1037AC5  MSYULYWG            1.   MSYULYYZ            1.
+    N1037AC5  P1037X23           83.   P1037X42           99.
+    N1037AC5  P1037X43          130.
+    N1038AC4  ACOCOSTS       2.38548   OBJECTIV       2.38548
+    N1038AC4  SYSTDEPT            1.   ACMILES         .93376
+    N1038AC4  ASMILES       89.64105   LFRPMASM     62.748735
+    N1038AC4  FLAV*4         2.22538   LF1038S1           67.
+    N1038AC4  MSYWGYYZ            1.   P1038X23           83.
+    N1038AC5  ACOCOSTS        2.5862   OBJECTIV        2.5862
+    N1038AC5  SYSTDEPT            1.   ACMILES         .93376
+    N1038AC5  ASMILES      115.78636   LFRPMASM     81.050452
+    N1038AC5  FLAV*5         2.26073   LF1038S1           86.
+    N1038AC5  MSYWGYYZ            1.   P1038X23           83.
+    N1039AC4  ACOCOSTS       2.75896   OBJECTIV       2.75896
+    N1039AC4  SYSTDEPT            1.   ACMILES         1.1293
+    N1039AC4  ASMILES      108.41281   LFRPMASM     75.888967
+    N1039AC4  FLAV*4         2.61098   LF1039S1           67.
+    N1039AC4  MSYULYWG            1.   P1039X32           99.
+    N1039AC5  ACOCOSTS       2.98119   OBJECTIV       2.98119
+    N1039AC5  SYSTDEPT            1.   ACMILES         1.1293
+    N1039AC5  ASMILES      140.03325   LFRPMASM     98.023275
+    N1039AC5  FLAV*5         2.65709   LF1039S1           86.
+    N1039AC5  MSYULYWG            1.   P1039X32           99.
+    N1040AC4  ACOCOSTS       2.29039   OBJECTIV       2.29039
+    N1040AC4  SYSTDEPT            2.   ACMILES         .56879
+    N1040AC4  ASMILES       54.60388   LFRPMASM     38.222716
+    N1040AC4  FLAV*4         1.88965   LF1040S1           67.
+    N1040AC4  LF1040S2           57.   MSYULYYZ            1.
+    N1040AC4  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1040AC4  P1040X32          130.   P1040X42           85.
+    N1040AC4  P1040X43          115.
+    N1040AC5  ACOCOSTS       2.54896   OBJECTIV       2.54896
+    N1040AC5  SYSTDEPT            2.   ACMILES         .56879
+    N1040AC5  ASMILES          70.53   LFRPMASM        49.371
+    N1040AC5  FLAV*5         1.88894   LF1040S1           86.
+    N1040AC5  LF1040S2           74.   MSYULYYZ            1.
+    N1040AC5  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1040AC5  P1040X32          130.   P1040X42           85.
+    N1040AC5  P1040X43          115.
+    N1040AC6  ACOCOSTS       1.93457   OBJECTIV       1.93457
+    N1040AC6  SYSTDEPT            2.   ACMILES         .56879
+    N1040AC6  ASMILES        54.0351   LFRPMASM      37.82457
+    N1040AC6  FLAV*6         1.94992   LF1040S1           66.
+    N1040AC6  LF1040S2           56.   MSYULYYZ            1.
+    N1040AC6  MSBOSYYZ            1.   MSBOSYUL            1.
+    N1040AC6  P1040X32          130.   P1040X42           85.
+    N1040AC6  P1040X43          115.
+    N1041AC4  ACOCOSTS       1.20291   OBJECTIV       1.20291
+    N1041AC4  SYSTDEPT            1.   ACMILES         .31461
+    N1041AC4  ASMILES       30.20299   LFRPMASM     21.142093
+    N1041AC4  FLAV*4         1.00442   LF1041S1           67.
+    N1041AC4  MSYULYYZ            1.   P1041X32          130.
+    N1041AC5  ACOCOSTS       1.33552   OBJECTIV       1.33552
+    N1041AC5  SYSTDEPT            1.   ACMILES         .31461
+    N1041AC5  ASMILES       39.01219   LFRPMASM     27.308533
+    N1041AC5  FLAV*5         1.00572   LF1041S1           86.
+    N1041AC5  MSYULYYZ            1.   P1041X32          130.
+    N1041AC6  ACOCOSTS       1.02289   OBJECTIV       1.02289
+    N1041AC6  SYSTDEPT            1.   ACMILES         .31461
+    N1041AC6  ASMILES       29.88837   LFRPMASM     20.921859
+    N1041AC6  FLAV*6         1.04456   LF1041S1           66.
+    N1041AC6  MSYULYYZ            1.   P1041X32          130.
+    N1042AC4  ACOCOSTS       1.08748   OBJECTIV       1.08748
+    N1042AC4  SYSTDEPT            1.   ACMILES         .25418
+    N1042AC4  ASMILES       24.40089   LFRPMASM     17.080623
+    N1042AC4  FLAV*4          .88524   LF1042S1           57.
+    N1042AC4  MSBOSYUL            1.   P1042X32          115.
+    N1042AC5  ACOCOSTS       1.21344   OBJECTIV       1.21344
+    N1042AC5  SYSTDEPT            1.   ACMILES         .25418
+    N1042AC5  ASMILES       31.51784   LFRPMASM     22.062488
+    N1042AC5  FLAV*5          .88321   LF1042S1           74.
+    N1042AC5  MSBOSYUL            1.   P1042X32          115.
+    N1042AC6  ACOCOSTS        .91168   OBJECTIV        .91168
+    N1042AC6  SYSTDEPT            1.   ACMILES         .25418
+    N1042AC6  ASMILES       24.14673   LFRPMASM     16.902711
+    N1042AC6  FLAV*6          .90537   LF1042S1           56.
+    N1042AC6  MSBOSYUL            1.   P1042X32          115.
+    N1043AC1  ACOCOSTS      13.18536   OBJECTIV      13.18536
+    N1043AC1  SYSTDEPT            1.   ACMILES        2.48884
+    N1043AC1  ASMILES     1010.47021   LFRPMASM    707.329147
+    N1043AC1  FLAV*1         5.18716   LF1043S1          284.
+    N1043AC1  MSBOSSEA            1.
+    N1043AC2  ACOCOSTS       9.81585   OBJECTIV       9.81585
+    N1043AC2  SYSTDEPT            1.   ACMILES        2.48884
+    N1043AC2  ASMILES      642.12134   LFRPMASM    449.484938
+    N1043AC2  FLAV*2         5.19874   LF1043S1          180.
+    N1043AC2  MSBOSSEA            1.
+    N1043AC3  ACOCOSTS       7.18333   OBJECTIV       7.18333
+    N1043AC3  SYSTDEPT            1.   ACMILES        2.48884
+    N1043AC3  ASMILES      457.94702   LFRPMASM    320.562914
+    N1043AC3  FLAV*3          5.3728   LF1043S1          128.
+    N1043AC3  MSBOSSEA            1.
+    N1044AC1  ACOCOSTS      14.09924   OBJECTIV      14.09924
+    N1044AC1  SYSTDEPT            1.   ACMILES        2.69845
+    N1044AC1  ASMILES     1095.56982   LFRPMASM    766.898874
+    N1044AC1  FLAV*1         5.56927   LF1044S1          243.
+    N1044AC1  MSBOSSFO            1.   P1044X32           73.
+    N1044AC2  ACOCOSTS      10.51384   OBJECTIV      10.51384
+    N1044AC2  SYSTDEPT            1.   ACMILES        2.69845
+    N1044AC2  ASMILES      696.19995   LFRPMASM    487.339965
+    N1044AC2  FLAV*2         5.58881   LF1044S1          154.
+    N1044AC2  MSBOSSFO            1.   P1044X32           73.
+    N1044AC3  ACOCOSTS       7.70315   OBJECTIV       7.70315
+    N1044AC3  SYSTDEPT            1.   ACMILES        2.69845
+    N1044AC3  ASMILES      496.51465   LFRPMASM    347.560255
+    N1044AC3  FLAV*3         5.78991   LF1044S1          110.
+    N1044AC3  MSBOSSFO            1.   P1044X32           73.
+    N1046AC3  ACOCOSTS       9.52503   OBJECTIV       9.52503
+    N1046AC3  SYSTDEPT            2.   ACMILES        3.02542
+    N1046AC3  ASMILES      556.67676   LFRPMASM    389.673732
+    N1046AC3  FLAV*3         6.86058   LF1046S1          128.
+    N1046AC3  LF1046S2          128.   MSLAXOAK            1.
+    N1046AC3  MSBOSOAK            1.   P1046X23           46.
+    N1047AC1  ACOCOSTS      31.37592   OBJECTIV      31.37592
+    N1047AC1  SYSTDEPT            3.   ACMILES        5.59035
+    N1047AC1  ASMILES     2269.68188   LFRPMASM   1588.777316
+    N1047AC1  FLAV*1        12.14121   LF1047S1          243.
+    N1047AC1  LF1047S2          243.   LF1047S3          243.
+    N1047AC1  MSHNLLAX            1.   MSHNLSFO            1.
+    N1047AC1  MSBOSHNL            1.   MSLAXSFO            1.
+    N1047AC1  MSBOSSFO            1.   P1047X23          118.
+    N1047AC1  P1047X34          168.   P1047X54           73.
+    N1047AC2  ACOCOSTS      23.19986   OBJECTIV      23.19986
+    N1047AC2  SYSTDEPT            3.   ACMILES        5.59035
+    N1047AC2  ASMILES     1442.30981   LFRPMASM   1009.616867
+    N1047AC2  FLAV*2        12.10464   LF1047S1          154.
+    N1047AC2  LF1047S2          154.   LF1047S3          154.
+    N1047AC2  MSHNLLAX            1.   MSHNLSFO            1.
+    N1047AC2  MSBOSHNL            1.   MSLAXSFO            1.
+    N1047AC2  MSBOSSFO            1.   P1047X23          118.
+    N1047AC2  P1047X34          168.   P1047X54           73.
+    N1047AC3  ACOCOSTS      16.89706   OBJECTIV      16.89706
+    N1047AC3  SYSTDEPT            3.   ACMILES        5.59035
+    N1047AC3  ASMILES     1028.62451   LFRPMASM    720.037157
+    N1047AC3  FLAV*3         12.3848   LF1047S1          110.
+    N1047AC3  LF1047S2          110.   LF1047S3          110.
+    N1047AC3  MSHNLLAX            1.   MSHNLSFO            1.
+    N1047AC3  MSBOSHNL            1.   MSLAXSFO            1.
+    N1047AC3  MSBOSSFO            1.   P1047X23          118.
+    N1047AC3  P1047X34          168.   P1047X54           73.
+    N1050AC3  ACOCOSTS       4.50544   OBJECTIV       4.50544
+    N1050AC3  SYSTDEPT            2.   ACMILES        1.00139
+    N1050AC3  ASMILES      184.25568   LFRPMASM    128.978976
+    N1050AC3  FLAV*3         2.83276   LF1050S1          110.
+    N1050AC3  LF1050S2          128.   MSLAXSEA            1.
+    N1050AC3  MSONTSEA            1.   P1050X32          139.
+    N1050AC3  P1050X42           25.
+    N1050AC4  ACOCOSTS       3.11665   OBJECTIV       3.11665
+    N1050AC4  SYSTDEPT            2.   ACMILES        1.00139
+    N1050AC4  ASMILES       96.13336   LFRPMASM     67.293352
+    N1050AC4  FLAV*4         2.74274   LF1050S1           57.
+    N1050AC4  LF1050S2           67.   MSLAXSEA            1.
+    N1050AC4  MSONTSEA            1.   P1050X32          139.
+    N1050AC4  P1050X42           25.
+    N1050AC5  ACOCOSTS       3.42281   OBJECTIV       3.42281
+    N1050AC5  SYSTDEPT            2.   ACMILES        1.00139
+    N1050AC5  ASMILES       124.1723   LFRPMASM      86.92061
+    N1050AC5  FLAV*5         2.76582   LF1050S1           74.
+    N1050AC5  LF1050S2           86.   MSLAXSEA            1.
+    N1050AC5  MSONTSEA            1.   P1050X32          139.
+    N1050AC5  P1050X42           25.
+    N1051AC1  ACOCOSTS       3.80996   OBJECTIV       3.80996
+    N1051AC1  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC1  ASMILES      137.44067   LFRPMASM     96.208469
+    N1051AC1  FLAV*1         1.26713   LF1051S1          243.
+    N1051AC1  MSLAXSFO            1.   P1051X23          168.
+    N1051AC2  ACOCOSTS       2.65528   OBJECTIV       2.65528
+    N1051AC2  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC2  ASMILES       87.33911   LFRPMASM     61.137377
+    N1051AC2  FLAV*2         1.19699   LF1051S1          154.
+    N1051AC2  MSLAXSFO            1.   P1051X23          168.
+    N1051AC3  ACOCOSTS       1.85054   OBJECTIV       1.85054
+    N1051AC3  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC3  ASMILES       62.28839   LFRPMASM     43.601873
+    N1051AC3  FLAV*3         1.09366   LF1051S1          110.
+    N1051AC3  MSLAXSFO            1.   P1051X23          168.
+    N1051AC4  ACOCOSTS       1.24858   OBJECTIV       1.24858
+    N1051AC4  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC4  ASMILES       32.49829   LFRPMASM     22.748803
+    N1051AC4  FLAV*4         1.05157   LF1051S1           57.
+    N1051AC4  MSLAXSFO            1.   P1051X23          168.
+    N1051AC5  ACOCOSTS       1.38382   OBJECTIV       1.38382
+    N1051AC5  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC5  ASMILES       41.97696   LFRPMASM     29.383872
+    N1051AC5  FLAV*5         1.05419   LF1051S1           74.
+    N1051AC5  MSLAXSFO            1.   P1051X23          168.
+    N1051AC6  ACOCOSTS       1.06688   OBJECTIV       1.06688
+    N1051AC6  SYSTDEPT            1.   ACMILES         .33852
+    N1051AC6  ASMILES       32.15976   LFRPMASM     22.511832
+    N1051AC6  FLAV*6         1.09962   LF1051S1           56.
+    N1051AC6  MSLAXSFO            1.   P1051X23          168.
+RHS
+    RHS1      SYSTDEPT          200.   FLAV*1            10.5
+    RHS1      FLAV*2           13.65   FLAV*3            23.5
+    RHS1      FLAV*4           21.75   FLAV*5           21.75
+    RHS1      FLAV*6            24.3   DMBOSHNL           12.
+    RHS1      DMBOSLAX           14.   DMBOSSEA           45.
+    RHS1      DMBOSSFO          122.   DMBOSTPE            1.
+    RHS1      DMBOSTYO            3.   DMBOSYUL          676.
+    RHS1      DMBOSYVR           26.   DMBOSYWG           37.
+    RHS1      DMBOSYYZ          215.   DMBUROAK           27.
+    RHS1      DMBURSEA           52.   DMBURSFO          271.
+    RHS1      DMHNLLAX          297.   DMHNLLON            5.
+    RHS1      DMHNLPAR            1.   DMHNLSEA          112.
+    RHS1      DMHNLSFO           35.   DMHNLYVR           67.
+    RHS1      DMLASSEA          370.   DMLASYVR           37.
+    RHS1      DMLAXOAK           78.   DMLAXSEA          813.
+    RHS1      DMLAXSFO         2952.   DMLAXTPE           31.
+    RHS1      DMLAXTYO           41.   DMLAXYVR          193.
+    RHS1      DMLONPAR            2.   DMLONSEA           92.
+    RHS1      DMLONYVR           51.   DMOAKONT           13.
+    RHS1      DMOAKSEA          110.   DMONTSFO          173.
+    RHS1      DMONTSEA           42.   DMPARSEA           36.
+    RHS1      DMPARYVR           24.   DMRNOSEA          284.
+    RHS1      DMRNOYVR           67.   DMSEASFO         1417.
+    RHS1      DMSEATPE           47.   DMSEATYO          114.
+    RHS1      DMSEAYVR          547.   DMSFOTPE            6.
+    RHS1      DMSFOTYO           17.   DMSFOYVR          298.
+    RHS1      DMTPETYO          111.   DMTPEYVR           17.
+    RHS1      DMTYOYVR           42.   DMYULYVR          262.
+    RHS1      DMYULYWG          413.   DMYULYYZ         2612.
+    RHS1      DMYVRYWG          375.   DMYVRYYZ          318.
+    RHS1      DMYWGYYZ          278.   DMBOSOAK           11.
+    RHS1      DMBOSBUR            7.   DMBOSONT            4.
+    RHS1      DMBURYVR           26.   DMBURTYO            2.
+    RHS1      DMBURTPE            1.   DMBURHNL           11.
+    RHS1      DMHNLOAK           24.   DMHNLONT           16.
+    RHS1      DMHNLYWG            3.   DMHNLYYZ           24.
+    RHS1      DMHNLYUL           40.   DMLASTYO            5.
+    RHS1      DMLASTPE            1.   DMLAXLON           13.
+    RHS1      DMLAXPAR            8.   DMBURLON            1.
+    RHS1      DMBURPAR            1.   DMLONONT            1.
+    RHS1      DMLONOAK            1.   DMOAKPAR            2.
+    RHS1      DMOAKTYO            7.   DMOAKTPE            2.
+    RHS1      DMONTPAR            2.   DMONTTYO            2.
+    RHS1      DMONTTPE            1.   DMPARSFO            2.
+    RHS1      DMRNOTYO            5.   DMRNOTPE            2.
+    RHS1      DMTPEYWG           21.   DMTPEYYZ           13.
+    RHS1      DMTPEYUL            6.   DMTYOYUL            7.
+    RHS1      DMTYOYYZ           17.   DMTYOYWG           25.
+    RHS1      MSBOSHNL            1.   MSBOSSEA            1.
+    RHS1      MSBOSSFO            2.   MSBOSYUL            7.
+    RHS1      MSBOSYVR            1.   MSBOSYWG            1.
+    RHS1      MSBOSYYZ            3.   MSBUROAK            1.
+    RHS1      MSBURSEA            1.   MSBURSFO            4.
+    RHS1      MSHNLLAX            3.   MSHNLSEA            2.
+    RHS1      MSHNLSFO            1.   MSHNLYVR            2.
+    RHS1      MSLASSEA            4.   MSLASYVR            1.
+    RHS1      MSLAXOAK            2.   MSLAXSEA            7.
+    RHS1      MSLAXSFO           21.   MSLAXTPE            2.
+    RHS1      MSLAXYVR            3.   MSLONPAR            1.
+    RHS1      MSLONSEA            1.   MSLONYVR            1.
+    RHS1      MSOAKONT            1.   MSOAKSEA            3.
+    RHS1      MSONTSFO            3.   MSONTSEA            2.
+    RHS1      MSPARSEA            1.   MSRNOSEA            4.
+    RHS1      MSRNOYVR            1.   MSSEASFO           10.
+    RHS1      MSSEATPE            1.   MSSEATYO            1.
+    RHS1      MSSEAYVR            6.   MSSFOYVR            5.
+    RHS1      MSTPETYO            1.   MSYULYVR            7.
+    RHS1      MSYULYWG            5.   MSYULYYZ           24.
+    RHS1      MSYVRYWG            5.   MSYVRYYZ            5.
+    RHS1      MSYWGYYZ            4.   MSBOSOAK            1.
+    RHS1      MSHNLOAK            1.   MSLAXLON            1.
+    RHS1      NOPTLON0            4.   NOPTLON1            2.
+    RHS1      NOPTTYO0            4.   NOPTTYO1            2.
+RANGES
+    RANGE1    DMBOSHNL            2.   DMBOSLAX            2.
+    RANGE1    DMBOSSEA            5.   DMBOSSFO           13.
+    RANGE1    DMBOSTPE            1.   DMBOSTYO            3.
+    RANGE1    DMBOSYUL           68.   DMBOSYVR            3.
+    RANGE1    DMBOSYWG            4.   DMBOSYYZ           22.
+    RANGE1    DMBUROAK            3.   DMBURSEA            6.
+    RANGE1    DMBURSFO           28.   DMHNLLAX           30.
+    RANGE1    DMHNLLON            5.   DMHNLPAR            1.
+    RANGE1    DMHNLSEA           12.   DMHNLSFO            4.
+    RANGE1    DMHNLYVR            7.   DMLASSEA           38.
+    RANGE1    DMLASYVR            4.   DMLAXOAK            8.
+    RANGE1    DMLAXSEA           82.   DMLAXSFO          296.
+    RANGE1    DMLAXTPE            4.   DMLAXTYO            5.
+    RANGE1    DMLAXYVR           20.   DMLONPAR            2.
+    RANGE1    DMLONSEA           10.   DMLONYVR            6.
+    RANGE1    DMOAKONT            2.   DMOAKSEA           12.
+    RANGE1    DMONTSFO           18.   DMONTSEA            5.
+    RANGE1    DMPARSEA            4.   DMPARYVR            3.
+    RANGE1    DMRNOSEA           29.   DMRNOYVR            7.
+    RANGE1    DMSEASFO          142.   DMSEATPE            5.
+    RANGE1    DMSEATYO           12.   DMSEAYVR           55.
+    RANGE1    DMSFOTPE            6.   DMSFOTYO            2.
+    RANGE1    DMSFOYVR           30.   DMTPETYO           12.
+    RANGE1    DMTPEYVR            2.   DMTYOYVR            5.
+    RANGE1    DMYULYVR           27.   DMYULYWG           42.
+    RANGE1    DMYULYYZ          262.   DMYVRYWG           38.
+    RANGE1    DMYVRYYZ           32.   DMYWGYYZ           28.
+    RANGE1    DMBOSOAK            2.   DMBOSBUR            7.
+    RANGE1    DMBOSONT            4.   DMBURYVR            3.
+    RANGE1    DMBURTYO            2.   DMBURTPE            1.
+    RANGE1    DMBURHNL            2.   DMHNLOAK            3.
+    RANGE1    DMHNLONT            2.   DMHNLYWG            3.
+    RANGE1    DMHNLYYZ            3.   DMHNLYUL            5.
+    RANGE1    DMLASTYO            5.   DMLASTPE            1.
+    RANGE1    DMLAXLON            2.   DMLAXPAR            8.
+    RANGE1    DMBURLON            1.   DMBURPAR            1.
+    RANGE1    DMLONONT            1.   DMLONOAK            1.
+    RANGE1    DMOAKPAR            2.   DMOAKTYO            7.
+    RANGE1    DMOAKTPE            2.   DMONTPAR            2.
+    RANGE1    DMONTTYO            2.   DMONTTPE            1.
+    RANGE1    DMPARSFO            2.   DMRNOTYO            5.
+    RANGE1    DMRNOTPE            2.   DMTPEYWG            3.
+    RANGE1    DMTPEYYZ            2.   DMTPEYUL            6.
+    RANGE1    DMTYOYUL            7.   DMTYOYYZ            2.
+    RANGE1    DMTYOYWG            3.
+BOUNDS
+ LO INTBOU    GRDTIMN1         -105.
+ UP INTBOU    GRDTIMN1            0.
+ LO INTBOU    GRDTIMN2          -91.
+ UP INTBOU    GRDTIMN2            0.
+ LO INTBOU    GRDTIMN3          -47.
+ UP INTBOU    GRDTIMN3            0.
+ LO INTBOU    GRDTIMN4         -43.5
+ UP INTBOU    GRDTIMN4            0.
+ LO INTBOU    GRDTIMN5          -87.
+ UP INTBOU    GRDTIMN5            0.
+ LO INTBOU    GRDTIMN6          -81.
+ UP INTBOU    GRDTIMN6            0.
+ UP INTBOU    N1001AC1            3.
+ UP INTBOU    N1001AC2            3.
+ UP INTBOU    N1001AC3            3.
+ UP INTBOU    N1002AC1            3.
+ UP INTBOU    N1002AC2            3.
+ UP INTBOU    N1002AC3            3.
+ UP INTBOU    N1003AC1            4.
+ UP INTBOU    N1003AC2            4.
+ UP INTBOU    N1003AC3            4.
+ UP INTBOU    N1004AC1            4.
+ UP INTBOU    N1004AC2            4.
+ UP INTBOU    N1004AC3            4.
+ UP INTBOU    N1005AC3            2.
+ UP INTBOU    N1105AC3            1.
+ UP INTBOU    N1006AC3            2.
+ UP INTBOU    N1007AC1            2.
+ UP INTBOU    N1007AC2            2.
+ UP INTBOU    N1007AC3            2.
+ UP INTBOU    N1008AC1            7.
+ UP INTBOU    N1008AC2            7.
+ UP INTBOU    N1008AC3            7.
+ UP INTBOU    N1008AC4            7.
+ UP INTBOU    N1008AC5            7.
+ UP INTBOU    N1008AC6            7.
+ UP INTBOU    N1009AC1            7.
+ UP INTBOU    N1009AC2            7.
+ UP INTBOU    N1009AC3            7.
+ UP INTBOU    N1009AC4            7.
+ UP INTBOU    N1009AC5            7.
+ UP INTBOU    N1010AC1            7.
+ UP INTBOU    N1010AC2            7.
+ UP INTBOU    N1010AC3            7.
+ UP INTBOU    N1010AC4            7.
+ UP INTBOU    N1010AC5            7.
+ UP INTBOU    N1010AC6            7.
+ UP INTBOU    N1011AC1            7.
+ UP INTBOU    N1011AC2            7.
+ UP INTBOU    N1011AC3            7.
+ UP INTBOU    N1011AC4            7.
+ UP INTBOU    N1011AC5            7.
+ UP INTBOU    N1011AC6            7.
+ UP INTBOU    N1012AC1            7.
+ UP INTBOU    N1012AC2            7.
+ UP INTBOU    N1012AC3            7.
+ UP INTBOU    N1012AC4            7.
+ UP INTBOU    N1012AC5            7.
+ UP INTBOU    N1013AC3            4.
+ UP INTBOU    N1013AC4            4.
+ UP INTBOU    N1013AC5            4.
+ UP INTBOU    N1013AC6            4.
+ UP INTBOU    N1014AC3            4.
+ UP INTBOU    N1014AC4            4.
+ UP INTBOU    N1014AC5            4.
+ UP INTBOU    N1014AC6            4.
+ UP INTBOU    N1015AC3            4.
+ UP INTBOU    N1015AC4            4.
+ UP INTBOU    N1015AC5            4.
+ UP INTBOU    N1015AC6            4.
+ UP INTBOU    N1016AC3            4.
+ UP INTBOU    N1016AC4            4.
+ UP INTBOU    N1016AC5            4.
+ UP INTBOU    N1016AC6            4.
+ UP INTBOU    N1017AC3            4.
+ UP INTBOU    N1017AC4            4.
+ UP INTBOU    N1017AC5            4.
+ UP INTBOU    N1017AC6            4.
+ UP INTBOU    N1018AC1            7.
+ UP INTBOU    N1018AC2            7.
+ UP INTBOU    N1018AC3            7.
+ UP INTBOU    N1018AC4            7.
+ UP INTBOU    N1018AC5            7.
+ UP INTBOU    N1018AC6            7.
+ UP INTBOU    N1019AC1            7.
+ UP INTBOU    N1019AC2            7.
+ UP INTBOU    N1019AC3            7.
+ UP INTBOU    N1019AC4            7.
+ UP INTBOU    N1019AC5            7.
+ UP INTBOU    N1020AC1            7.
+ UP INTBOU    N1020AC2            7.
+ UP INTBOU    N1020AC3            7.
+ UP INTBOU    N1020AC4            7.
+ UP INTBOU    N1020AC5            7.
+ UP INTBOU    N1020AC6            7.
+ UP INTBOU    N1021AC1            7.
+ UP INTBOU    N1021AC2            7.
+ UP INTBOU    N1021AC3            7.
+ UP INTBOU    N1021AC4            7.
+ UP INTBOU    N1021AC5            7.
+ UP INTBOU    N1022AC1            1.
+ UP INTBOU    N1023AC1            1.
+ UP INTBOU    N1026AC1            1.
+ UP INTBOU    N1027AC1            1.
+ UP INTBOU    N1028AC1            1.
+ UP INTBOU    N1029AC1            1.
+ UP INTBOU    N1030AC1            1.
+ UP INTBOU    N1032AC1            1.
+ UP INTBOU    N1032AC2            1.
+ UP INTBOU    N1032AC3            1.
+ UP INTBOU    N1032AC4            1.
+ UP INTBOU    N1032AC5            1.
+ UP INTBOU    N1033AC1            5.
+ UP INTBOU    N1033AC2            5.
+ UP INTBOU    N1033AC3            5.
+ UP INTBOU    N1033AC4            5.
+ UP INTBOU    N1033AC5            5.
+ UP INTBOU    N1034AC1            5.
+ UP INTBOU    N1034AC2            5.
+ UP INTBOU    N1034AC3            5.
+ UP INTBOU    N1035AC1            5.
+ UP INTBOU    N1035AC2            5.
+ UP INTBOU    N1035AC3            5.
+ UP INTBOU    N1035AC4            5.
+ UP INTBOU    N1035AC5            5.
+ UP INTBOU    N1036AC1            5.
+ UP INTBOU    N1036AC2            5.
+ UP INTBOU    N1036AC3            5.
+ UP INTBOU    N1037AC4            5.
+ UP INTBOU    N1037AC5            5.
+ UP INTBOU    N1038AC4           10.
+ UP INTBOU    N1038AC5           10.
+ UP INTBOU    N1039AC4            7.
+ UP INTBOU    N1039AC5            7.
+ UP INTBOU    N1040AC4           10.
+ UP INTBOU    N1040AC5           10.
+ UP INTBOU    N1040AC6           10.
+ UP INTBOU    N1041AC4           20.
+ UP INTBOU    N1041AC5           20.
+ UP INTBOU    N1041AC6           20.
+ UP INTBOU    N1042AC4           20.
+ UP INTBOU    N1042AC5           20.
+ UP INTBOU    N1042AC6           20.
+ UP INTBOU    N1043AC1            3.
+ UP INTBOU    N1043AC2            3.
+ UP INTBOU    N1043AC3            3.
+ UP INTBOU    N1044AC1            3.
+ UP INTBOU    N1044AC2            3.
+ UP INTBOU    N1044AC3            3.
+ UP INTBOU    N1046AC3            2.
+ UP INTBOU    N1047AC1            1.
+ UP INTBOU    N1047AC2            1.
+ UP INTBOU    N1047AC3            1.
+ UP INTBOU    N1050AC3            5.
+ UP INTBOU    N1050AC4            5.
+ UP INTBOU    N1050AC5            5.
+ UP INTBOU    N1051AC1           20.
+ UP INTBOU    N1051AC2           20.
+ UP INTBOU    N1051AC3           20.
+ UP INTBOU    N1051AC4           20.
+ UP INTBOU    N1051AC5           20.
+ UP INTBOU    N1051AC6           20.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/boeing2.mps b/demos/ppl_lpsol/examples/boeing2.mps
new file mode 100644
index 0000000..254aed7
--- /dev/null
+++ b/demos/ppl_lpsol/examples/boeing2.mps
@@ -0,0 +1,970 @@
+NAME          BOEING2
+ROWS
+ G  REVENUES
+ G  ACOCOSTS
+ N  OBJECTIV
+ L  FUELAVAL
+ G  SYSTDEPT
+ G  ACMILES
+ G  ASMILES
+ G  PASSNGRS
+ G  RPMILES
+ G  LFRPMASM
+ G  ATONMILE
+ G  RTONMILE
+ G  LFTNMILE
+ E  FLAV*1
+ E  FLAV*2
+ E  FLAV*3
+ E  FLAV*4
+ G  LF1003S1
+ G  LF1003B1
+ G  LF1003C1
+ G  LF1005S1
+ G  LF1005B1
+ G  LF1005C1
+ G  LF1011S1
+ G  LF1011S2
+ G  LF1011B1
+ G  LF1011B2
+ G  LF1011C1
+ G  LF1011C2
+ G  LF1013S1
+ G  LF1013S2
+ G  LF1013B1
+ G  LF1013B2
+ G  LF1013C1
+ G  LF1013C2
+ G  LF1015S1
+ G  LF1015B1
+ G  LF1015C1
+ G  LF1017S1
+ G  LF1017B1
+ G  LF1017C1
+ G  LF1019S1
+ G  LF1019S2
+ G  LF1019B1
+ G  LF1019B2
+ G  LF1019C1
+ G  LF1019C2
+ G  LF1021S1
+ G  LF1021B1
+ G  LF1021C1
+ G  LF1002S1
+ G  LF1002B1
+ G  LF1002C1
+ G  LF1004S1
+ G  LF1004B1
+ G  LF1004C1
+ G  LF1006S1
+ G  LF1006S2
+ G  LF1006B1
+ G  LF1006B2
+ G  LF1006C1
+ G  LF1006C2
+ G  LF1008S1
+ G  LF1008S2
+ G  LF1008B1
+ G  LF1008B2
+ G  LF1008C1
+ G  LF1008C2
+ G  LF1010S1
+ G  LF1010S2
+ G  LF1010S3
+ G  LF1010B1
+ G  LF1010B2
+ G  LF1010B3
+ G  LF1010C1
+ G  LF1010C2
+ G  LF1010C3
+ G  LF1012S1
+ G  LF1012B1
+ G  LF1012C1
+ G  LF1014S1
+ G  LF1014S2
+ G  LF1014B1
+ G  LF1014B2
+ G  LF1014C1
+ G  LF1014C2
+ G  LF1100S1
+ G  LF1100S2
+ G  LF1100S3
+ G  LF1100S4
+ G  LF1100S5
+ G  LF1100B1
+ G  LF1100B2
+ G  LF1100B3
+ G  LF1100B4
+ G  LF1100B5
+ G  LF1100C1
+ G  LF1100C2
+ G  LF1100C3
+ G  LF1100C4
+ G  LF1100C5
+ G  LF1102S1
+ G  LF1102S2
+ G  LF1102S3
+ G  LF1102S4
+ G  LF1102B1
+ G  LF1102B2
+ G  LF1102B3
+ G  LF1102B4
+ G  LF1102C1
+ G  LF1102C2
+ G  LF1102C3
+ G  LF1102C4
+ G  LF1200S1
+ G  LF1200B1
+ G  LF1200C1
+ G  LF1201S1
+ G  LF1201B1
+ G  LF1201C1
+ G  NOPTCLE0
+ G  CONTBOS1
+ G  CONTBOS2
+ G  CONTBOS3
+ G  CONTBOS4
+ G  CONTORD1
+ G  CONTORD2
+ G  CONTORD3
+ G  CONTORD4
+ G  CONTLGA2
+ G  CONTLGA4
+ G  CONTCLE1
+ G  CONTCLE2
+ G  CONTCLE3
+ G  CONTCLE4
+ L  DMBOSORD
+ L  DMBOSLGA
+ L  DMBOSCLE
+ L  DMORDBOS
+ L  DMORDLGA
+ L  DMORDCLE
+ L  DMLGABOS
+ L  DMLGAORD
+ L  DMLGACLE
+ L  DMCLEBOS
+ L  DMCLEORD
+ L  DMCLELGA
+ G  MSBOSORD
+ G  MSBOSLGA
+ G  MSBOSCLE
+ G  MSORDBOS
+ G  MSORDLGA
+ G  MSORDCLE
+ G  MSLGABOS
+ G  MSLGAORD
+ G  MSLGACLE
+ G  MSCLEBOS
+ G  MSCLEORD
+ G  MSCLELGA
+ L  DCBOSORD
+ L  DCBOSCLE
+ L  DCORDBOS
+ L  DCORDLGA
+ L  DCLGAORD
+ L  DCLGACLE
+ L  DCCLELGA
+ G  MCORDBOS
+ G  MCLGAORD
+COLUMNS
+    PBOSORD0  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD0  PASSNGRS            1.   RPMILES         .86441
+    PBOSORD0  LFRPMASM       -.86441   DMBOSORD            1.
+    PBOSORD0  LF1003S1           -1.
+    PBOSORD1  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD1  PASSNGRS            1.   RPMILES         .87605
+    PBOSORD1  LFRPMASM       -.87605   DMBOSORD            1.
+    PBOSORD1  LF1011S1           -1.   LF1011S2           -1.
+    PBOSORD2  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD2  PASSNGRS            1.   RPMILES         .91637
+    PBOSORD2  LFRPMASM       -.91637   DMBOSORD            1.
+    PBOSORD2  LF1013S1           -1.   LF1013S2           -1.
+    PBOSORD3  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD3  PASSNGRS            1.   RPMILES         .91722
+    PBOSORD3  LFRPMASM       -.91722   DMBOSORD            1.
+    PBOSORD3  LF1100S1           -1.   LF1100S2           -1.
+    PBOSORD3  LF1100S3           -1.
+    PBOSORD4  REVENUES          .075   OBJECTIV         -.075
+    PBOSORD4  PASSNGRS            1.   RPMILES         .87605
+    PBOSORD4  LFRPMASM       -.87605   DMBOSORD            1.
+    PBOSORD4  LF1102S1           -1.   LF1102S2           -1.
+    PBOSLGA0  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA0  PASSNGRS            1.   RPMILES         .18557
+    PBOSLGA0  LFRPMASM       -.18557   DMBOSLGA            1.
+    PBOSLGA0  LF1013S1           -1.
+    PBOSLGA1  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA1  PASSNGRS            1.   RPMILES         .18557
+    PBOSLGA1  LFRPMASM       -.18557   DMBOSLGA            1.
+    PBOSLGA1  LF1100S1           -1.
+    PBOSLGA2  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA2  PASSNGRS            1.   RPMILES        1.60685
+    PBOSLGA2  LFRPMASM      -1.60685   DMBOSLGA            1.
+    PBOSLGA2  LF1102S1           -1.   LF1102S2           -1.
+    PBOSLGA2  LF1102S3           -1.
+    PBOSLGA3  REVENUES          .027   OBJECTIV         -.027
+    PBOSLGA3  PASSNGRS            1.   RPMILES         .18557
+    PBOSLGA3  LFRPMASM       -.18557   DMBOSLGA            1.
+    PBOSLGA3  LF1200S1           -1.
+    PBOSCLE0  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE0  PASSNGRS            1.   RPMILES         .56156
+    PBOSCLE0  LFRPMASM       -.56156   DMBOSCLE            1.
+    PBOSCLE0  LF1005S1           -1.
+    PBOSCLE1  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE1  PASSNGRS            1.   RPMILES         .56156
+    PBOSCLE1  LFRPMASM       -.56156   DMBOSCLE            1.
+    PBOSCLE1  LF1011S1           -1.
+    PBOSCLE2  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE2  PASSNGRS            1.   RPMILES         .60273
+    PBOSCLE2  LFRPMASM       -.60273   DMBOSCLE            1.
+    PBOSCLE2  LF1100S1           -1.   LF1100S2           -1.
+    PBOSCLE3  REVENUES          .053   OBJECTIV         -.053
+    PBOSCLE3  PASSNGRS            1.   RPMILES         .56156
+    PBOSCLE3  LFRPMASM       -.56156   DMBOSCLE            1.
+    PBOSCLE3  LF1102S1           -1.
+    PORDBOS0  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS0  PASSNGRS            1.   RPMILES         .87605
+    PORDBOS0  LFRPMASM       -.87605   DMORDBOS            1.
+    PORDBOS0  LF1006S1           -1.   LF1006S2           -1.
+    PORDBOS1  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS1  PASSNGRS            1.   RPMILES         .91637
+    PORDBOS1  LFRPMASM       -.91637   DMORDBOS            1.
+    PORDBOS1  LF1008S1           -1.   LF1008S2           -1.
+    PORDBOS2  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS2  PASSNGRS            1.   RPMILES         .91722
+    PORDBOS2  LFRPMASM       -.91722   DMORDBOS            1.
+    PORDBOS2  LF1010S1           -1.   LF1010S2           -1.
+    PORDBOS2  LF1010S3           -1.
+    PORDBOS3  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS3  PASSNGRS            1.   RPMILES         .87605
+    PORDBOS3  LFRPMASM       -.87605   DMORDBOS            1.
+    PORDBOS3  LF1100S4           -1.   LF1100S5           -1.
+    PORDBOS4  REVENUES          .075   OBJECTIV         -.075
+    PORDBOS4  PASSNGRS            1.   RPMILES         .91637
+    PORDBOS4  LFRPMASM       -.91637   DMORDBOS            1.
+    PORDBOS4  LF1102S3           -1.   LF1102S4           -1.
+    PORDLGA0  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA0  PASSNGRS            1.   RPMILES          .7308
+    PORDLGA0  LFRPMASM        -.7308   DMORDLGA            1.
+    PORDLGA0  LF1004S1           -1.
+    PORDLGA1  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA1  PASSNGRS            1.   RPMILES          .7308
+    PORDLGA1  LFRPMASM        -.7308   DMORDLGA            1.
+    PORDLGA1  LF1008S1           -1.
+    PORDLGA2  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA2  PASSNGRS            1.   RPMILES         .73165
+    PORDLGA2  LFRPMASM       -.73165   DMORDLGA            1.
+    PORDLGA2  LF1010S1           -1.   LF1010S2           -1.
+    PORDLGA3  REVENUES          .068   OBJECTIV         -.068
+    PORDLGA3  PASSNGRS            1.   RPMILES          .7308
+    PORDLGA3  LFRPMASM        -.7308   DMORDLGA            1.
+    PORDLGA3  LF1102S3           -1.
+    PORDCLE0  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE0  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE0  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE0  LF1002S1           -1.
+    PORDCLE1  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE1  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE1  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE1  LF1006S1           -1.
+    PORDCLE2  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE2  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE2  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE2  LF1010S1           -1.
+    PORDCLE3  REVENUES          .035   OBJECTIV         -.035
+    PORDCLE3  PASSNGRS            1.   RPMILES          .3145
+    PORDCLE3  LFRPMASM        -.3145   DMORDCLE            1.
+    PORDCLE3  LF1100S4           -1.
+    PLGABOS0  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS0  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS0  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS0  LF1008S2           -1.
+    PLGABOS1  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS1  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS1  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS1  LF1010S3           -1.
+    PLGABOS2  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS2  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS2  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS2  LF1014S2           -1.
+    PLGABOS3  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS3  PASSNGRS            1.   RPMILES         1.6077
+    PLGABOS3  LFRPMASM       -1.6077   DMLGABOS            1.
+    PLGABOS3  LF1100S2           -1.   LF1100S3           -1.
+    PLGABOS3  LF1100S4           -1.   LF1100S5           -1.
+    PLGABOS4  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS4  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS4  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS4  LF1102S4           -1.
+    PLGABOS5  REVENUES          .027   OBJECTIV         -.027
+    PLGABOS5  PASSNGRS            1.   RPMILES         .18557
+    PLGABOS5  LFRPMASM       -.18557   DMLGABOS            1.
+    PLGABOS5  LF1201S1           -1.
+    PLGAORD0  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD0  PASSNGRS            1.   RPMILES          .7308
+    PLGAORD0  LFRPMASM        -.7308   DMLGAORD            1.
+    PLGAORD0  LF1013S2           -1.
+    PLGAORD1  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD1  PASSNGRS            1.   RPMILES          .7308
+    PLGAORD1  LFRPMASM        -.7308   DMLGAORD            1.
+    PLGAORD1  LF1017S1           -1.
+    PLGAORD2  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD2  PASSNGRS            1.   RPMILES         .73165
+    PLGAORD2  LFRPMASM       -.73165   DMLGAORD            1.
+    PLGAORD2  LF1019S1           -1.   LF1019S2           -1.
+    PLGAORD3  REVENUES          .068   OBJECTIV         -.068
+    PLGAORD3  PASSNGRS            1.   RPMILES         .73165
+    PLGAORD3  LFRPMASM       -.73165   DMLGAORD            1.
+    PLGAORD3  LF1100S2           -1.   LF1100S3           -1.
+    PLGACLE0  REVENUES          .037   OBJECTIV         -.037
+    PLGACLE0  PASSNGRS            1.   RPMILES         .41715
+    PLGACLE0  LFRPMASM       -.41715   DMLGACLE            1.
+    PLGACLE0  LF1015S1           -1.
+    PLGACLE1  REVENUES          .037   OBJECTIV         -.037
+    PLGACLE1  PASSNGRS            1.   RPMILES         .41715
+    PLGACLE1  LFRPMASM       -.41715   DMLGACLE            1.
+    PLGACLE1  LF1019S1           -1.
+    PLGACLE2  REVENUES          .037   OBJECTIV         -.037
+    PLGACLE2  PASSNGRS            1.   RPMILES         .41715
+    PLGACLE2  LFRPMASM       -.41715   DMLGACLE            1.
+    PLGACLE2  LF1100S2           -1.
+    PCLEBOS0  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS0  PASSNGRS            1.   RPMILES         .56156
+    PCLEBOS0  LFRPMASM       -.56156   DMCLEBOS            1.
+    PCLEBOS0  LF1006S2           -1.
+    PCLEBOS1  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS1  PASSNGRS            1.   RPMILES         .60273
+    PCLEBOS1  LFRPMASM       -.60273   DMCLEBOS            1.
+    PCLEBOS1  LF1010S2           -1.   LF1010S3           -1.
+    PCLEBOS2  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS2  PASSNGRS            1.   RPMILES         .60273
+    PCLEBOS2  LFRPMASM       -.60273   DMCLEBOS            1.
+    PCLEBOS2  LF1014S1           -1.   LF1014S2           -1.
+    PCLEBOS3  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS3  PASSNGRS            1.   RPMILES         .56156
+    PCLEBOS3  LFRPMASM       -.56156   DMCLEBOS            1.
+    PCLEBOS3  LF1100S5           -1.
+    PCLEBOS4  REVENUES          .053   OBJECTIV         -.053
+    PCLEBOS4  PASSNGRS            1.   RPMILES        1.23087
+    PCLEBOS4  LFRPMASM      -1.23087   DMCLEBOS            1.
+    PCLEBOS4  LF1102S2           -1.   LF1102S3           -1.
+    PCLEBOS4  LF1102S4           -1.
+    PCLEORD0  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD0  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD0  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD0  LF1011S2           -1.
+    PCLEORD1  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD1  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD1  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD1  LF1019S2           -1.
+    PCLEORD2  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD2  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD2  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD2  LF1021S1           -1.
+    PCLEORD3  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD3  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD3  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD3  LF1100S3           -1.
+    PCLEORD4  REVENUES          .035   OBJECTIV         -.035
+    PCLEORD4  PASSNGRS            1.   RPMILES          .3145
+    PCLEORD4  LFRPMASM        -.3145   DMCLEORD            1.
+    PCLEORD4  LF1102S2           -1.
+    PCLELGA0  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA0  PASSNGRS            1.   RPMILES         .41715
+    PCLELGA0  LFRPMASM       -.41715   DMCLELGA            1.
+    PCLELGA0  LF1010S2           -1.
+    PCLELGA1  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA1  PASSNGRS            1.   RPMILES         .41715
+    PCLELGA1  LFRPMASM       -.41715   DMCLELGA            1.
+    PCLELGA1  LF1012S1           -1.
+    PCLELGA2  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA2  PASSNGRS            1.   RPMILES         .41715
+    PCLELGA2  LFRPMASM       -.41715   DMCLELGA            1.
+    PCLELGA2  LF1014S1           -1.
+    PCLELGA3  REVENUES          .037   OBJECTIV         -.037
+    PCLELGA3  PASSNGRS            1.   RPMILES         1.0453
+    PCLELGA3  LFRPMASM       -1.0453   DMCLELGA            1.
+    PCLELGA3  LF1102S2           -1.   LF1102S3           -1.
+    BBOSORD0  REVENUES           .75   OBJECTIV          -.75
+    BBOSORD0  RTONMILE        .86441   LFTNMILE       -.86441
+    BBOSORD0  DCBOSORD            1.   LF1003B1           -1.
+    BBOSORD1  REVENUES           .75   OBJECTIV          -.75
+    BBOSORD1  RTONMILE        .87605   LFTNMILE       -.87605
+    BBOSORD1  DCBOSORD            1.   LF1011B1           -1.
+    BBOSORD1  LF1011B2           -1.
+    BBOSCLE0  REVENUES           .53   OBJECTIV          -.53
+    BBOSCLE0  RTONMILE        .56156   LFTNMILE       -.56156
+    BBOSCLE0  DCBOSCLE            1.   LF1005B1           -1.
+    BBOSCLE1  REVENUES           .53   OBJECTIV          -.53
+    BBOSCLE1  RTONMILE        .56156   LFTNMILE       -.56156
+    BBOSCLE1  DCBOSCLE            1.   LF1011B1           -1.
+    BORDBOS0  REVENUES           .75   OBJECTIV          -.75
+    BORDBOS0  RTONMILE        .87605   LFTNMILE       -.87605
+    BORDBOS0  DCORDBOS            1.   LF1006B1           -1.
+    BORDBOS0  LF1006B2           -1.
+    CBOSORD0  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD0  RTONMILE        .86441   LFTNMILE       -.86441
+    CBOSORD0  DCBOSORD            1.   LF1003C1           -1.
+    CBOSORD1  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD1  RTONMILE        .87605   LFTNMILE       -.87605
+    CBOSORD1  DCBOSORD            1.   LF1011C1           -1.
+    CBOSORD1  LF1011C2           -1.
+    CBOSORD2  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD2  RTONMILE        .91637   LFTNMILE       -.91637
+    CBOSORD2  DCBOSORD            1.   LF1013C1           -1.
+    CBOSORD2  LF1013C2           -1.
+    CBOSORD3  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD3  RTONMILE        .91722   LFTNMILE       -.91722
+    CBOSORD3  DCBOSORD            1.   LF1100C1           -1.
+    CBOSORD3  LF1100C2           -1.   LF1100C3           -1.
+    CBOSORD4  REVENUES           .75   OBJECTIV          -.75
+    CBOSORD4  RTONMILE        .87605   LFTNMILE       -.87605
+    CBOSORD4  DCBOSORD            1.   LF1102C1           -1.
+    CBOSORD4  LF1102C2           -1.
+    CBOSCLE0  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE0  RTONMILE        .56156   LFTNMILE       -.56156
+    CBOSCLE0  DCBOSCLE            1.   LF1005C1           -1.
+    CBOSCLE1  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE1  RTONMILE        .56156   LFTNMILE       -.56156
+    CBOSCLE1  DCBOSCLE            1.   LF1011C1           -1.
+    CBOSCLE2  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE2  RTONMILE        .60273   LFTNMILE       -.60273
+    CBOSCLE2  DCBOSCLE            1.   LF1100C1           -1.
+    CBOSCLE2  LF1100C2           -1.
+    CBOSCLE3  REVENUES           .53   OBJECTIV          -.53
+    CBOSCLE3  RTONMILE        .56156   LFTNMILE       -.56156
+    CBOSCLE3  DCBOSCLE            1.   LF1102C1           -1.
+    CORDBOS0  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS0  RTONMILE        .87605   LFTNMILE       -.87605
+    CORDBOS0  DCORDBOS            1.   LF1006C1           -1.
+    CORDBOS0  LF1006C2           -1.
+    CORDBOS1  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS1  RTONMILE        .91637   LFTNMILE       -.91637
+    CORDBOS1  DCORDBOS            1.   LF1008C1           -1.
+    CORDBOS1  LF1008C2           -1.
+    CORDBOS2  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS2  RTONMILE        .91722   LFTNMILE       -.91722
+    CORDBOS2  DCORDBOS            1.   LF1010C1           -1.
+    CORDBOS2  LF1010C2           -1.   LF1010C3           -1.
+    CORDBOS3  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS3  RTONMILE        .87605   LFTNMILE       -.87605
+    CORDBOS3  DCORDBOS            1.   LF1100C4           -1.
+    CORDBOS3  LF1100C5           -1.
+    CORDBOS4  REVENUES           .75   OBJECTIV          -.75
+    CORDBOS4  RTONMILE        .91637   LFTNMILE       -.91637
+    CORDBOS4  DCORDBOS            1.   LF1102C3           -1.
+    CORDBOS4  LF1102C4           -1.
+    CORDLGA0  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA0  RTONMILE         .7308   LFTNMILE        -.7308
+    CORDLGA0  DCORDLGA            1.   LF1004C1           -1.
+    CORDLGA1  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA1  RTONMILE         .7308   LFTNMILE        -.7308
+    CORDLGA1  DCORDLGA            1.   LF1008C1           -1.
+    CORDLGA2  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA2  RTONMILE        .73165   LFTNMILE       -.73165
+    CORDLGA2  DCORDLGA            1.   LF1010C1           -1.
+    CORDLGA2  LF1010C2           -1.
+    CORDLGA3  REVENUES           .68   OBJECTIV          -.68
+    CORDLGA3  RTONMILE         .7308   LFTNMILE        -.7308
+    CORDLGA3  DCORDLGA            1.   LF1102C3           -1.
+    CLGAORD0  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD0  RTONMILE         .7308   LFTNMILE        -.7308
+    CLGAORD0  DCLGAORD            1.   LF1013C2           -1.
+    CLGAORD1  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD1  RTONMILE         .7308   LFTNMILE        -.7308
+    CLGAORD1  DCLGAORD            1.   LF1017C1           -1.
+    CLGAORD2  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD2  RTONMILE        .73165   LFTNMILE       -.73165
+    CLGAORD2  DCLGAORD            1.   LF1019C1           -1.
+    CLGAORD2  LF1019C2           -1.
+    CLGAORD3  REVENUES           .68   OBJECTIV          -.68
+    CLGAORD3  RTONMILE        .73165   LFTNMILE       -.73165
+    CLGAORD3  DCLGAORD            1.   LF1100C2           -1.
+    CLGAORD3  LF1100C3           -1.
+    CLGACLE0  REVENUES           .37   OBJECTIV          -.37
+    CLGACLE0  RTONMILE        .41715   LFTNMILE       -.41715
+    CLGACLE0  DCLGACLE            1.   LF1015C1           -1.
+    CLGACLE1  REVENUES           .37   OBJECTIV          -.37
+    CLGACLE1  RTONMILE        .41715   LFTNMILE       -.41715
+    CLGACLE1  DCLGACLE            1.   LF1019C1           -1.
+    CLGACLE2  REVENUES           .37   OBJECTIV          -.37
+    CLGACLE2  RTONMILE        .41715   LFTNMILE       -.41715
+    CLGACLE2  DCLGACLE            1.   LF1100C2           -1.
+    CCLELGA0  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA0  RTONMILE        .41715   LFTNMILE       -.41715
+    CCLELGA0  DCCLELGA            1.   LF1010C2           -1.
+    CCLELGA1  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA1  RTONMILE        .41715   LFTNMILE       -.41715
+    CCLELGA1  DCCLELGA            1.   LF1012C1           -1.
+    CCLELGA2  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA2  RTONMILE        .41715   LFTNMILE       -.41715
+    CCLELGA2  DCCLELGA            1.   LF1014C1           -1.
+    CCLELGA3  REVENUES           .37   OBJECTIV          -.37
+    CCLELGA3  RTONMILE        1.0453   LFTNMILE       -1.0453
+    CCLELGA3  DCCLELGA            1.   LF1102C2           -1.
+    CCLELGA3  LF1102C3           -1.
+    GRDTIMO1  FLAV*1              1.   ACOCOSTS           .65
+    GRDTIMO1  OBJECTIV           .65
+    GRDTIMN1  FLAV*1              1.   ACOCOSTS          -.05
+    GRDTIMN1  OBJECTIV          -.05
+    GRDTIMO2  FLAV*2              1.   ACOCOSTS          .275
+    GRDTIMO2  OBJECTIV          .275
+    GRDTIMN2  FLAV*2              1.   ACOCOSTS       -.02889
+    GRDTIMN2  OBJECTIV       -.02889
+    GRDTIMN3  FLAV*3              1.   ACOCOSTS       -.03611
+    GRDTIMN3  OBJECTIV       -.03611
+    GRDTIMN4  FLAV*4              1.   ACOCOSTS       -.01333
+    GRDTIMN4  OBJECTIV       -.01333
+    N1003AC1  ACOCOSTS           .01   OBJECTIV           .01
+    N1003AC1  FUELAVAL       7.98429   SYSTDEPT            1.
+    N1003AC1  ACMILES         .86441   ASMILES      351.81396
+    N1003AC1  LFRPMASM    211.088376   FLAV*1         2.32729
+    N1003AC1  ATONMILE      25.93224   LFTNMILE      12.96612
+    N1003AC1  LF1003S1          305.   LF1003B1           12.
+    N1003AC1  CONTBOS1            1.   CONTORD1           -1.
+    N1003AC1  MSBOSORD            1.
+    N1003AC2  ACOCOSTS           .02   OBJECTIV           .02
+    N1003AC2  FUELAVAL       2.51914   SYSTDEPT            1.
+    N1003AC2  ACMILES         .86441   ASMILES      113.23743
+    N1003AC2  LFRPMASM     67.942458   FLAV*2         2.10966
+    N1003AC2  LF1003S1           98.   CONTBOS2            1.
+    N1003AC2  CONTORD2           -1.   MSBOSORD            1.
+    N1003AC3  ACOCOSTS           .03   OBJECTIV           .03
+    N1003AC3  FUELAVAL       3.15178   SYSTDEPT            1.
+    N1003AC3  ACMILES         .86441   FLAV*3         2.10966
+    N1003AC3  ATONMILE      34.57631   LFTNMILE     17.288155
+    N1003AC3  LF1003C1           30.   CONTBOS3            1.
+    N1003AC3  CONTORD3           -1.
+    N1003AC4  ACOCOSTS           .04   OBJECTIV           .04
+    N1003AC4  FUELAVAL       1.99337   SYSTDEPT            1.
+    N1003AC4  ACMILES         .86441   FLAV*4         2.10966
+    N1003AC4  ATONMILE      12.96612   LFTNMILE       6.48306
+    N1003AC4  LF1003C1         11.25   CONTBOS4            1.
+    N1003AC4  CONTORD4           -1.
+    N1005AC1  ACOCOSTS       4.04337   OBJECTIV       4.04337
+    N1005AC1  FUELAVAL       5.83404   SYSTDEPT            1.
+    N1005AC1  ACMILES         .56156   ASMILES      228.55299
+    N1005AC1  LFRPMASM    137.131794   FLAV*1           1000.
+    N1005AC1  ATONMILE      16.84665   LFTNMILE      8.423325
+    N1005AC1  LF1005S1          305.   LF1005B1           12.
+    N1005AC1  NOPTCLE0            1.   CONTBOS1            1.
+    N1005AC1  CONTCLE1           -1.   MSBOSCLE            1.
+    N1005AC2  ACOCOSTS       1.60964   OBJECTIV       1.60964
+    N1005AC2  FUELAVAL       1.82258   SYSTDEPT            1.
+    N1005AC2  ACMILES         .56156   ASMILES       73.56374
+    N1005AC2  LFRPMASM     44.138244   FLAV*2           2000.
+    N1005AC2  LF1005S1           98.   NOPTCLE0            1.
+    N1005AC2  CONTBOS2            1.   CONTCLE2           -1.
+    N1005AC2  MSBOSCLE            1.
+    N1005AC3  ACOCOSTS       1.93119   OBJECTIV       1.93119
+    N1005AC3  FUELAVAL       2.27351   SYSTDEPT            1.
+    N1005AC3  ACMILES         .56156   FLAV*3           3000.
+    N1005AC3  ATONMILE       22.4622   LFTNMILE       11.2311
+    N1005AC3  LF1005C1           30.   NOPTCLE0            1.
+    N1005AC3  CONTBOS3            1.   CONTCLE3           -1.
+    N1005AC4  ACOCOSTS       1.34618   OBJECTIV       1.34618
+    N1005AC4  FUELAVAL       1.41795   SYSTDEPT            1.
+    N1005AC4  ACMILES         .56156   FLAV*4           1500.
+    N1005AC4  ATONMILE       8.42333   LFTNMILE      4.211665
+    N1005AC4  LF1005C1         11.25   NOPTCLE0            1.
+    N1005AC4  CONTBOS4            1.   CONTCLE4           -1.
+    N1011AC1  ACOCOSTS           1.1   OBJECTIV           1.1
+    N1011AC1  FUELAVAL       9.91398   SYSTDEPT            2.
+    N1011AC1  ACMILES         .87605   ASMILES      356.55371
+    N1011AC1  LFRPMASM    213.932226   FLAV*1             25.
+    N1011AC1  ATONMILE       26.2816   LFTNMILE       13.1408
+    N1011AC1  LF1011S1          305.   LF1011S2          305.
+    N1011AC1  LF1011B1           12.   LF1011B2           12.
+    N1011AC1  NOPTCLE0            2.   CONTBOS1            1.
+    N1011AC1  CONTORD1           -1.   MSBOSCLE            1.
+    N1011AC1  MSBOSORD            1.   MSCLEORD            1.
+    N1011AC2  ACOCOSTS           1.2   OBJECTIV           1.2
+    N1011AC2  FUELAVAL       3.07692   SYSTDEPT            2.
+    N1011AC2  ACMILES         .87605   ASMILES      114.76299
+    N1011AC2  LFRPMASM     68.857794   FLAV*2             25.
+    N1011AC2  LF1011S1           98.   LF1011S2           98.
+    N1011AC2  NOPTCLE0            2.   CONTBOS2            1.
+    N1011AC2  CONTORD2           -1.   MSBOSCLE            1.
+    N1011AC2  MSBOSORD            1.   MSCLEORD            1.
+    N1011AC3  ACOCOSTS           1.3   OBJECTIV           1.3
+    N1011AC3  FUELAVAL       3.83055   SYSTDEPT            2.
+    N1011AC3  ACMILES         .87605   FLAV*3             26.
+    N1011AC3  ATONMILE      35.04214   LFTNMILE      17.52107
+    N1011AC3  LF1011C1           30.   LF1011C2           30.
+    N1011AC3  NOPTCLE0            2.   CONTBOS3            1.
+    N1011AC3  CONTORD3           -1.
+    N1011AC4  ACOCOSTS       2.34647   OBJECTIV       2.34647
+    N1011AC4  FUELAVAL        2.3665   SYSTDEPT            2.
+    N1011AC4  ACMILES         .87605   FLAV*4             27.
+    N1011AC4  ATONMILE       13.1408   LFTNMILE        6.5704
+    N1011AC4  LF1011C1         11.25   LF1011C2         11.25
+    N1011AC4  NOPTCLE0            2.   CONTBOS4            1.
+    N1011AC4  CONTORD4           -1.
+    N1013AC2  ACOCOSTS       2.36783   OBJECTIV       2.36783
+    N1013AC2  FUELAVAL       3.16965   SYSTDEPT            2.
+    N1013AC2  ACMILES         .91637   ASMILES      120.04449
+    N1013AC2  LFRPMASM     72.026694   FLAV*2         2.65943
+    N1013AC2  LF1013S1           98.   LF1013S2           98.
+    N1013AC2  CONTBOS2            1.   CONTORD2           -1.
+    N1013AC2  MSBOSLGA            1.   MSBOSORD            1.
+    N1013AC2  MSLGAORD            1.
+    N1013AC4  ACOCOSTS       1.90292   OBJECTIV       1.90292
+    N1013AC4  FUELAVAL        2.4431   SYSTDEPT            2.
+    N1013AC4  ACMILES         .91637   FLAV*4         2.65943
+    N1013AC4  ATONMILE      13.74556   LFTNMILE       6.87278
+    N1013AC4  LF1013C1         11.25   LF1013C2         11.25
+    N1013AC4  CONTBOS4            1.   CONTORD4           -1.
+    N1013AC4  MCLGAORD            1.
+    N1015AC2  ACOCOSTS       1.36416   OBJECTIV       1.36416
+    N1015AC2  FUELAVAL       1.49045   SYSTDEPT            1.
+    N1015AC2  ACMILES         .41715   ASMILES       54.64705
+    N1015AC2  LFRPMASM      32.78823   FLAV*2         1.25093
+    N1015AC2  LF1015S1           98.   NOPTCLE0            1.
+    N1015AC2  CONTLGA2            1.   CONTCLE2           -1.
+    N1015AC2  MSLGACLE            1.
+    N1015AC4  ACOCOSTS       1.14401   OBJECTIV       1.14401
+    N1015AC4  FUELAVAL       1.14359   SYSTDEPT            1.
+    N1015AC4  ACMILES         .41715   FLAV*4         1.25093
+    N1015AC4  ATONMILE       6.25729   LFTNMILE      3.128645
+    N1015AC4  LF1015C1         11.25   NOPTCLE0            1.
+    N1015AC4  CONTLGA4            1.   CONTCLE4           -1.
+    N1017AC2  ACOCOSTS       1.64736   OBJECTIV       1.64736
+    N1017AC2  FUELAVAL       2.21183   SYSTDEPT            1.
+    N1017AC2  ACMILES          .7308   ASMILES       95.73444
+    N1017AC2  LFRPMASM     57.440664   FLAV*2         1.85313
+    N1017AC2  LF1017S1           98.   CONTLGA2            1.
+    N1017AC2  CONTORD2           -1.   MSLGAORD            1.
+    N1017AC4  ACOCOSTS       1.33312   OBJECTIV       1.33312
+    N1017AC4  FUELAVAL       1.73951   SYSTDEPT            1.
+    N1017AC4  ACMILES          .7308   FLAV*4         1.85313
+    N1017AC4  ATONMILE      10.96196   LFTNMILE       5.48098
+    N1017AC4  LF1017C1         11.25   CONTLGA4            1.
+    N1017AC4  CONTORD4           -1.   MCLGAORD            1.
+    N1019AC2  ACOCOSTS       2.55381   OBJECTIV       2.55381
+    N1019AC2  FUELAVAL        2.7448   SYSTDEPT            2.
+    N1019AC2  ACMILES         .73165   ASMILES        95.8463
+    N1019AC2  LFRPMASM      57.50778   FLAV*2         2.30477
+    N1019AC2  LF1019S1           98.   LF1019S2           98.
+    N1019AC2  NOPTCLE0            2.   CONTLGA2            1.
+    N1019AC2  CONTORD2           -1.   MSLGACLE            1.
+    N1019AC2  MSLGAORD            1.   MSCLEORD            1.
+    N1019AC4  ACOCOSTS       2.14431   OBJECTIV       2.14431
+    N1019AC4  FUELAVAL       2.09214   SYSTDEPT            2.
+    N1019AC4  ACMILES         .73165   FLAV*4         2.30477
+    N1019AC4  ATONMILE      10.97477   LFTNMILE      5.487385
+    N1019AC4  LF1019C1         11.25   LF1019C2         11.25
+    N1019AC4  NOPTCLE0            2.   CONTLGA4            1.
+    N1019AC4  CONTORD4           -1.   MCLGAORD            1.
+    N1021AC1  ACOCOSTS       3.12679   OBJECTIV       3.12679
+    N1021AC1  FUELAVAL       4.07994   SYSTDEPT            1.
+    N1021AC1  ACMILES          .3145   ASMILES      128.00075
+    N1021AC1  LFRPMASM      76.80045   FLAV*1         1.34295
+    N1021AC1  ATONMILE       9.43495   LFTNMILE      4.717475
+    N1021AC1  LF1021S1          305.   LF1021B1           12.
+    N1021AC1  NOPTCLE0            1.   CONTCLE1            1.
+    N1021AC1  CONTORD1           -1.   MSCLEORD            1.
+    N1021AC2  ACOCOSTS       1.18965   OBJECTIV       1.18965
+    N1021AC2  FUELAVAL       1.25435   SYSTDEPT            1.
+    N1021AC2  ACMILES          .3145   ASMILES       41.19926
+    N1021AC2  LFRPMASM     24.719556   FLAV*2         1.05384
+    N1021AC2  LF1021S1           98.   NOPTCLE0            1.
+    N1021AC2  CONTCLE2            1.   CONTORD2           -1.
+    N1021AC2  MSCLEORD            1.
+    N1021AC3  ACOCOSTS       1.42472   OBJECTIV       1.42472
+    N1021AC3  FUELAVAL       1.55704   SYSTDEPT            1.
+    N1021AC3  ACMILES          .3145   FLAV*3         1.05384
+    N1021AC3  ATONMILE      12.57993   LFTNMILE      6.289965
+    N1021AC3  LF1021C1           30.   NOPTCLE0            1.
+    N1021AC3  CONTCLE3            1.   CONTORD3           -1.
+    N1021AC4  ACOCOSTS        1.0003   OBJECTIV        1.0003
+    N1021AC4  FUELAVAL        .94855   SYSTDEPT            1.
+    N1021AC4  ACMILES          .3145   FLAV*4         1.05384
+    N1021AC4  ATONMILE       4.71747   LFTNMILE      2.358735
+    N1021AC4  LF1021C1         11.25   NOPTCLE0            1.
+    N1021AC4  CONTCLE4            1.   CONTORD4           -1.
+    N1002AC1  ACOCOSTS       3.12679   OBJECTIV       3.12679
+    N1002AC1  FUELAVAL       4.07994   SYSTDEPT            1.
+    N1002AC1  ACMILES          .3145   ASMILES      128.00075
+    N1002AC1  LFRPMASM      76.80045   FLAV*1         1.34295
+    N1002AC1  ATONMILE       9.43495   LFTNMILE      4.717475
+    N1002AC1  LF1002S1          305.   LF1002B1           12.
+    N1002AC1  NOPTCLE0            1.   CONTORD1            1.
+    N1002AC1  CONTCLE1           -1.   MSORDCLE            1.
+    N1002AC2  ACOCOSTS       1.18965   OBJECTIV       1.18965
+    N1002AC2  FUELAVAL       1.25435   SYSTDEPT            1.
+    N1002AC2  ACMILES          .3145   ASMILES       41.19926
+    N1002AC2  LFRPMASM     24.719556   FLAV*2         1.05384
+    N1002AC2  LF1002S1           98.   NOPTCLE0            1.
+    N1002AC2  CONTORD2            1.   CONTCLE2           -1.
+    N1002AC2  MSORDCLE            1.
+    N1002AC3  ACOCOSTS       1.42472   OBJECTIV       1.42472
+    N1002AC3  FUELAVAL       1.55704   SYSTDEPT            1.
+    N1002AC3  ACMILES          .3145   FLAV*3         1.05384
+    N1002AC3  ATONMILE      12.57993   LFTNMILE      6.289965
+    N1002AC3  LF1002C1           30.   NOPTCLE0            1.
+    N1002AC3  CONTORD3            1.   CONTCLE3           -1.
+    N1002AC4  ACOCOSTS        1.0003   OBJECTIV        1.0003
+    N1002AC4  FUELAVAL        .94855   SYSTDEPT            1.
+    N1002AC4  ACMILES          .3145   FLAV*4         1.05384
+    N1002AC4  ATONMILE       4.71747   LFTNMILE      2.358735
+    N1002AC4  LF1002C1         11.25   NOPTCLE0            1.
+    N1002AC4  CONTORD4            1.   CONTCLE4           -1.
+    N1004AC2  ACOCOSTS       1.64736   OBJECTIV       1.64736
+    N1004AC2  FUELAVAL       2.21183   SYSTDEPT            1.
+    N1004AC2  ACMILES          .7308   ASMILES       95.73444
+    N1004AC2  LFRPMASM     57.440664   FLAV*2         1.85313
+    N1004AC2  LF1004S1           98.   CONTORD2            1.
+    N1004AC2  CONTLGA2           -1.   MSORDLGA            1.
+    N1004AC4  ACOCOSTS       1.33312   OBJECTIV       1.33312
+    N1004AC4  FUELAVAL       1.73951   SYSTDEPT            1.
+    N1004AC4  ACMILES          .7308   FLAV*4         1.85313
+    N1004AC4  ATONMILE      10.96196   LFTNMILE       5.48098
+    N1004AC4  LF1004C1         11.25   CONTORD4            1.
+    N1004AC4  CONTLGA4           -1.
+    N1006AC1  ACOCOSTS       7.17016   OBJECTIV       7.17016
+    N1006AC1  FUELAVAL       9.91398   SYSTDEPT            2.
+    N1006AC1  ACMILES         .87605   ASMILES      356.55371
+    N1006AC1  LFRPMASM    213.932226   FLAV*1         3.12813
+    N1006AC1  ATONMILE       26.2816   LFTNMILE       13.1408
+    N1006AC1  LF1006S1          305.   LF1006S2          305.
+    N1006AC1  LF1006B1           12.   LF1006B2           12.
+    N1006AC1  NOPTCLE0            2.   CONTORD1            1.
+    N1006AC1  CONTBOS1           -1.   MSORDCLE            1.
+    N1006AC1  MSORDBOS            1.   MSCLEBOS            1.
+    N1006AC2  ACOCOSTS       2.79929   OBJECTIV       2.79929
+    N1006AC2  FUELAVAL       3.07692   SYSTDEPT            2.
+    N1006AC2  ACMILES         .87605   ASMILES      114.76299
+    N1006AC2  LFRPMASM     68.857794   FLAV*2         2.58202
+    N1006AC2  LF1006S1           98.   LF1006S2           98.
+    N1006AC2  NOPTCLE0            2.   CONTORD2            1.
+    N1006AC2  CONTBOS2           -1.   MSORDCLE            1.
+    N1006AC2  MSORDBOS            1.   MSCLEBOS            1.
+    N1006AC3  ACOCOSTS       3.35591   OBJECTIV       3.35591
+    N1006AC3  FUELAVAL       3.83055   SYSTDEPT            2.
+    N1006AC3  ACMILES         .87605   FLAV*3         2.58202
+    N1006AC3  ATONMILE      35.04214   LFTNMILE      17.52107
+    N1006AC3  LF1006C1           30.   LF1006C2           30.
+    N1006AC3  NOPTCLE0            2.   CONTORD3            1.
+    N1006AC3  CONTBOS3           -1.   MCORDBOS            1.
+    N1006AC4  ACOCOSTS       2.34647   OBJECTIV       2.34647
+    N1006AC4  FUELAVAL        2.3665   SYSTDEPT            2.
+    N1006AC4  ACMILES         .87605   FLAV*4         2.58202
+    N1006AC4  ATONMILE       13.1408   LFTNMILE        6.5704
+    N1006AC4  LF1006C1         11.25   LF1006C2         11.25
+    N1006AC4  NOPTCLE0            2.   CONTORD4            1.
+    N1006AC4  CONTBOS4           -1.   MCORDBOS            1.
+    N1008AC2  ACOCOSTS       2.36783   OBJECTIV       2.36783
+    N1008AC2  FUELAVAL       3.16965   SYSTDEPT            2.
+    N1008AC2  ACMILES         .91637   ASMILES      120.04449
+    N1008AC2  LFRPMASM     72.026694   FLAV*2         2.65943
+    N1008AC2  LF1008S1           98.   LF1008S2           98.
+    N1008AC2  CONTORD2            1.   CONTBOS2           -1.
+    N1008AC2  MSORDLGA            1.   MSORDBOS            1.
+    N1008AC2  MSLGABOS            1.
+    N1008AC4  ACOCOSTS       1.90292   OBJECTIV       1.90292
+    N1008AC4  FUELAVAL        2.4431   SYSTDEPT            2.
+    N1008AC4  ACMILES         .91637   FLAV*4         2.65943
+    N1008AC4  ATONMILE      13.74556   LFTNMILE       6.87278
+    N1008AC4  LF1008C1         11.25   LF1008C2         11.25
+    N1008AC4  CONTORD4            1.   CONTBOS4           -1.
+    N1008AC4  MCORDBOS            1.
+    N1010AC2  ACOCOSTS       3.27428   OBJECTIV       3.27428
+    N1010AC2  FUELAVAL       3.70262   SYSTDEPT            3.
+    N1010AC2  ACMILES         .91722   ASMILES      120.15637
+    N1010AC2  LFRPMASM     72.093822   FLAV*2         3.11107
+    N1010AC2  LF1010S1           98.   LF1010S2           98.
+    N1010AC2  LF1010S3           98.   NOPTCLE0            2.
+    N1010AC2  CONTORD2            1.   CONTBOS2           -1.
+    N1010AC2  MSORDCLE            1.   MSORDLGA            1.
+    N1010AC2  MSORDBOS            1.   MSCLELGA            1.
+    N1010AC2  MSCLEBOS            1.   MSLGABOS            1.
+    N1010AC4  ACOCOSTS       2.71411   OBJECTIV       2.71411
+    N1010AC4  FUELAVAL       2.79573   SYSTDEPT            3.
+    N1010AC4  ACMILES         .91722   FLAV*4         3.11107
+    N1010AC4  ATONMILE      13.75836   LFTNMILE       6.87918
+    N1010AC4  LF1010C1         11.25   LF1010C2         11.25
+    N1010AC4  LF1010C3         11.25   NOPTCLE0            2.
+    N1010AC4  CONTORD4            1.   CONTBOS4           -1.
+    N1010AC4  MCORDBOS            1.
+    N1012AC2  ACOCOSTS       1.36416   OBJECTIV       1.36416
+    N1012AC2  FUELAVAL       1.49045   SYSTDEPT            1.
+    N1012AC2  ACMILES         .41715   ASMILES       54.64705
+    N1012AC2  LFRPMASM      32.78823   FLAV*2         1.25093
+    N1012AC2  LF1012S1           98.   NOPTCLE0            1.
+    N1012AC2  CONTCLE2            1.   CONTLGA2           -1.
+    N1012AC2  MSCLELGA            1.
+    N1012AC4  ACOCOSTS       1.14401   OBJECTIV       1.14401
+    N1012AC4  FUELAVAL       1.14359   SYSTDEPT            1.
+    N1012AC4  ACMILES         .41715   FLAV*4         1.25093
+    N1012AC4  ATONMILE       6.25729   LFTNMILE      3.128645
+    N1012AC4  LF1012C1         11.25   NOPTCLE0            1.
+    N1012AC4  CONTCLE4            1.   CONTLGA4           -1.
+    N1014AC2  ACOCOSTS       2.08463   OBJECTIV       2.08463
+    N1014AC2  FUELAVAL       2.44827   SYSTDEPT            2.
+    N1014AC2  ACMILES         .60273   ASMILES       78.95706
+    N1014AC2  LFRPMASM     47.374236   FLAV*2         2.05723
+    N1014AC2  LF1014S1           98.   LF1014S2           98.
+    N1014AC2  NOPTCLE0            1.   CONTCLE2            1.
+    N1014AC2  CONTBOS2           -1.   MSCLELGA            1.
+    N1014AC2  MSCLEBOS            1.   MSLGABOS            1.
+    N1014AC4  ACOCOSTS       1.71382   OBJECTIV       1.71382
+    N1014AC4  FUELAVAL       1.84718   SYSTDEPT            2.
+    N1014AC4  ACMILES         .60273   FLAV*4         2.05723
+    N1014AC4  ATONMILE       9.04089   LFTNMILE      4.520445
+    N1014AC4  LF1014C1         11.25   LF1014C2         11.25
+    N1014AC4  NOPTCLE0            1.   CONTCLE4            1.
+    N1014AC4  CONTBOS4           -1.
+    N1100AC2  ACOCOSTS       6.07357   OBJECTIV       6.07357
+    N1100AC2  FUELAVAL       6.77953   SYSTDEPT            5.
+    N1100AC2  ACMILES        1.79328   ASMILES      234.91937
+    N1100AC2  LFRPMASM    140.951622   FLAV*2         5.69309
+    N1100AC2  LF1100S1           98.   LF1100S2           98.
+    N1100AC2  LF1100S3           98.   LF1100S4           98.
+    N1100AC2  LF1100S5           98.   NOPTCLE0            4.
+    N1100AC2  MSBOSLGA            1.   MSBOSCLE            1.
+    N1100AC2  MSBOSORD            1.   MSLGACLE            1.
+    N1100AC2  MSLGAORD            1.   MSLGABOS            1.
+    N1100AC2  MSCLEORD            1.   MSORDCLE            1.
+    N1100AC2  MSORDBOS            1.   MSCLEBOS            1.
+    N1100AC4  ACOCOSTS       5.06059   OBJECTIV       5.06059
+    N1100AC4  FUELAVAL       5.16223   SYSTDEPT            5.
+    N1100AC4  ACMILES        1.79328   FLAV*4         5.69309
+    N1100AC4  ATONMILE      26.89915   LFTNMILE     13.449575
+    N1100AC4  LF1100C1         11.25   LF1100C2         11.25
+    N1100AC4  LF1100C3         11.25   LF1100C4         11.25
+    N1100AC4  LF1100C5         11.25   NOPTCLE0            4.
+    N1100AC4  MCLGAORD            1.   MCORDBOS            1.
+    N1102AC2  ACOCOSTS       5.16712   OBJECTIV       5.16712
+    N1102AC2  FUELAVAL       6.24657   SYSTDEPT            4.
+    N1102AC2  ACMILES        1.79242   ASMILES      234.80756
+    N1102AC2  LFRPMASM    140.884536   FLAV*2         5.24145
+    N1102AC2  LF1102S1           98.   LF1102S2           98.
+    N1102AC2  LF1102S3           98.   LF1102S4           98.
+    N1102AC2  NOPTCLE0            2.   MSBOSCLE            1.
+    N1102AC2  MSBOSORD            1.   MSBOSLGA            1.
+    N1102AC2  MSCLEORD            1.   MSCLELGA            1.
+    N1102AC2  MSCLEBOS            1.   MSORDLGA            1.
+    N1102AC2  MSORDBOS            1.   MSLGABOS            1.
+    N1102AC4  ACOCOSTS       4.24939   OBJECTIV       4.24939
+    N1102AC4  FUELAVAL        4.8096   SYSTDEPT            4.
+    N1102AC4  ACMILES        1.79242   FLAV*4         5.24145
+    N1102AC4  ATONMILE      26.88635   LFTNMILE     13.443175
+    N1102AC4  LF1102C1         11.25   LF1102C2         11.25
+    N1102AC4  LF1102C3         11.25   LF1102C4         11.25
+    N1102AC4  NOPTCLE0            2.   MCORDBOS            1.
+    N1200AC2  ACOCOSTS        .72047   OBJECTIV        .72047
+    N1200AC2  FUELAVAL        .95782   SYSTDEPT            1.
+    N1200AC2  ACMILES         .18557   ASMILES       24.31007
+    N1200AC2  LFRPMASM     14.586042   FLAV*2           .8063
+    N1200AC2  LF1200S1           98.   CONTBOS2            1.
+    N1200AC2  CONTLGA2           -1.   MSBOSLGA            1.
+    N1200AC4  ACOCOSTS         .5698   OBJECTIV         .5698
+    N1200AC4  FUELAVAL        .70359   SYSTDEPT            1.
+    N1200AC4  ACMILES         .18557   FLAV*4           .8063
+    N1200AC4  ATONMILE        2.7836   LFTNMILE        1.3918
+    N1200AC4  LF1200C1         11.25   CONTBOS4            1.
+    N1200AC4  CONTLGA4           -1.
+    N1201AC2  ACOCOSTS        .72047   OBJECTIV        .72047
+    N1201AC2  FUELAVAL        .95782   SYSTDEPT            1.
+    N1201AC2  ACMILES         .18557   ASMILES       24.31007
+    N1201AC2  LFRPMASM     14.586042   FLAV*2           .8063
+    N1201AC2  LF1201S1           98.   CONTLGA2            1.
+    N1201AC2  CONTBOS2           -1.   MSLGABOS            1.
+    N1201AC4  ACOCOSTS         .5698   OBJECTIV         .5698
+    N1201AC4  FUELAVAL        .70359   SYSTDEPT            1.
+    N1201AC4  ACMILES         .18557   FLAV*4           .8063
+    N1201AC4  ATONMILE        2.7836   LFTNMILE        1.3918
+    N1201AC4  LF1201C1         11.25   CONTLGA4            1.
+    N1201AC4  CONTBOS4           -1.
+RHS
+    RHS1      FUELAVAL       100000.   PASSNGRS         9431.
+    RHS1      SYSTDEPT           50.   FLAV*1             30.
+    RHS1      FLAV*2             45.   DMBOSORD          302.
+    RHS1      DMBOSLGA         2352.   DMBOSCLE          142.
+    RHS1      DMORDBOS          302.   DMORDLGA          515.
+    RHS1      DMORDCLE          619.   DMLGABOS         2743.
+    RHS1      DMLGAORD          712.   DMLGACLE          517.
+    RHS1      DMCLEBOS          131.   DMCLEORD          712.
+    RHS1      DMCLELGA          409.   MSBOSORD            3.
+    RHS1      MSBOSLGA            7.   MSBOSCLE            1.
+    RHS1      MSORDBOS            3.   MSORDLGA            4.
+    RHS1      MSORDCLE            5.   MSLGABOS            7.
+    RHS1      MSLGAORD            5.   MSLGACLE            4.
+    RHS1      MSCLEBOS            1.   MSCLEORD            6.
+    RHS1      MSCLELGA            3.   MCORDBOS            1.
+    RHS1      MCLGAORD            2.   DCBOSORD           12.
+    RHS1      DCBOSCLE           16.   DCORDBOS           24.
+    RHS1      DCORDLGA           13.   DCLGAORD           45.
+    RHS1      DCLGACLE           16.   DCCLELGA            5.
+    RHS1      NOPTCLE0           24.
+RANGES
+    RANGE1    DMBOSORD           61.   DMBOSLGA          471.
+    RANGE1    DMBOSCLE           29.   DMORDBOS           61.
+    RANGE1    DMORDLGA          103.   DMORDCLE          124.
+    RANGE1    DMLGABOS          549.   DMLGAORD          143.
+    RANGE1    DMLGACLE          104.   DMCLEBOS           27.
+    RANGE1    DMCLEORD          143.   DMCLELGA           82.
+    RANGE1    DCBOSORD           12.   DCBOSCLE           3.2
+    RANGE1    DCORDBOS           4.8   DCORDLGA           2.6
+    RANGE1    DCLGAORD            9.   DCLGACLE           3.2
+    RANGE1    DCCLELGA            5.
+BOUNDS
+ LO INTBOU    GRDTIMN1         -100.
+ UP INTBOU    GRDTIMN1            0.
+ LO INTBOU    GRDTIMN2          -90.
+ UP INTBOU    GRDTIMN2            0.
+ LO INTBOU    GRDTIMN3          -45.
+ UP INTBOU    GRDTIMN3            0.
+ LO INTBOU    GRDTIMN4          -45.
+ UP INTBOU    GRDTIMN4            0.
+ UP INTBOU    N1003AC1            7.
+ UP INTBOU    N1003AC2            7.
+ UP INTBOU    N1003AC3            2.
+ UP INTBOU    N1003AC4            2.
+ UP INTBOU    N1005AC1            7.
+ UP INTBOU    N1005AC2            7.
+ UP INTBOU    N1005AC3            2.
+ UP INTBOU    N1005AC4            2.
+ UP INTBOU    N1011AC1            7.
+ UP INTBOU    N1011AC2            7.
+ UP INTBOU    N1011AC3            2.
+ UP INTBOU    N1011AC4            2.
+ UP INTBOU    N1013AC2           14.
+ UP INTBOU    N1013AC4            2.
+ UP INTBOU    N1015AC2            7.
+ UP INTBOU    N1015AC4            2.
+ UP INTBOU    N1017AC2            7.
+ UP INTBOU    N1017AC4            2.
+ UP INTBOU    N1019AC2            7.
+ UP INTBOU    N1019AC4            2.
+ UP INTBOU    N1021AC1            7.
+ UP INTBOU    N1021AC2            7.
+ UP INTBOU    N1021AC3            2.
+ UP INTBOU    N1021AC4            2.
+ UP INTBOU    N1002AC1            7.
+ UP INTBOU    N1002AC2            7.
+ UP INTBOU    N1002AC3            2.
+ UP INTBOU    N1002AC4            2.
+ UP INTBOU    N1004AC2            7.
+ UP INTBOU    N1004AC4            2.
+ UP INTBOU    N1006AC1            7.
+ UP INTBOU    N1006AC2            7.
+ UP INTBOU    N1006AC3            2.
+ UP INTBOU    N1006AC4            2.
+ UP INTBOU    N1008AC2           14.
+ UP INTBOU    N1008AC4            2.
+ UP INTBOU    N1010AC2           14.
+ UP INTBOU    N1010AC4            2.
+ UP INTBOU    N1012AC2            7.
+ UP INTBOU    N1012AC4            2.
+ UP INTBOU    N1014AC2           14.
+ UP INTBOU    N1014AC4            2.
+ UP INTBOU    N1100AC2            7.
+ UP INTBOU    N1100AC4            7.
+ UP INTBOU    N1102AC2            7.
+ UP INTBOU    N1102AC4            7.
+ UP INTBOU    N1200AC2           14.
+ UP INTBOU    N1200AC4            7.
+ UP INTBOU    N1201AC2           14.
+ UP INTBOU    N1201AC4            7.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/egout.mps b/demos/ppl_lpsol/examples/egout.mps
new file mode 100644
index 0000000..dab1108
--- /dev/null
+++ b/demos/ppl_lpsol/examples/egout.mps
@@ -0,0 +1,403 @@
+*NAME:         egout
+*ROWS:         98
+*COLUMNS:      141
+*INTEGER:      55
+*NONZERO:      282
+*BEST SOLN:    568.101 (opt)
+*LP SOLN:      149.589
+*SOURCE:       Etienne Loute (Univ. of Louvain)
+*              Laurence A. Wolsey (Univ. of Louvain)
+*              Martin Savelsbergh (Eindhoven Univ. of Technology)
+*APPLICATION:  drainage system design, 42 nodes, 55 arcs
+*COMMENTS:     all integer variables are binary
+*              solution reported by Martin W. P. Savelsbergh
+*      
+NAME          EGOUT
+ROWS
+ N  COST    
+ E  ...     
+ E  001     
+ E  002     
+ E  004     
+ E  006     
+ E  007     
+ E  009     
+ E  010     
+ E  011     
+ E  013     
+ E  014     
+ E  015     
+ E  017     
+ E  019     
+ E  020     
+ E  021     
+ E  023     
+ E  025     
+ E  026     
+ E  028     
+ E  029     
+ E  030     
+ E  031     
+ E  033     
+ E  034     
+ E  035     
+ E  036     
+ E  038     
+ E  039     
+ E  040     
+ E  041     
+ E  042     
+ E  003     
+ E  005     
+ E  008     
+ E  012     
+ E  016     
+ E  018     
+ E  024     
+ E  022     
+ E  027     
+ E  032     
+ E  037     
+ L  U.001...
+ L  U.001003
+ L  U.002003
+ L  U.002...
+ L  U.003005
+ L  U.004005
+ L  U.004...
+ L  U.005007
+ L  U.006007
+ L  U.007008
+ L  U.008...
+ L  U.008009
+ L  U.010012
+ L  U.011012
+ L  U.012...
+ L  U.012013
+ L  U.013016
+ L  U.014015
+ L  U.015016
+ L  U.016...
+ L  U.016017
+ L  U.017018
+ L  U.009018
+ L  U.018019
+ L  U.019024
+ L  U.024...
+ L  U.023024
+ L  U.022023
+ L  U.020022
+ L  U.021022
+ L  U.022...
+ L  U.024026
+ L  U.025026
+ L  U.025...
+ L  U.026027
+ L  U.027...
+ L  U.027032
+ L  U.030031
+ L  U.031032
+ L  U.029031
+ L  U.028029
+ L  U.028...
+ L  U.032033
+ L  U.033037
+ L  U.036037
+ L  U.034036
+ L  U.035036
+ L  U.037038
+ L  U.038040
+ L  U.039040
+ L  U.040...
+ L  U.041...
+ L  U.040041
+ L  U.041042
+ L  U.042...
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    I.001...  COST             28.21   U.001...       -117.04
+    I.001003  COST             18.57   U.001003       -117.04
+    I.002003  COST              8.45   U.002003       -117.04
+    I.002...  COST             21.16   U.002...       -117.04
+    I.003005  COST             28.38   U.003005       -117.04
+    I.004005  COST               9.8   U.004005       -117.04
+    I.004...  COST             23.29   U.004...       -117.04
+    I.005007  COST              5.07   U.005007       -117.04
+    I.006007  COST              6.78   U.006007       -117.04
+    I.007008  COST               2.9   U.007008       -117.04
+    I.008...  COST             27.89   U.008...       -117.04
+    I.008009  COST             10.03   U.008009       -117.04
+    I.010012  COST             14.74   U.010012       -117.04
+    I.011012  COST              6.19   U.011012       -117.04
+    I.012...  COST              22.1   U.012...       -117.04
+    I.012013  COST             15.82   U.012013       -117.04
+    I.013016  COST             11.33   U.013016       -117.04
+    I.014015  COST              5.79   U.014015       -117.04
+    I.015016  COST               3.9   U.015016       -117.04
+    I.016...  COST             24.79   U.016...       -117.04
+    I.016017  COST             16.36   U.016017       -117.04
+    I.017018  COST              3.45   U.017018       -117.04
+    I.009018  COST              2.26   U.009018       -117.04
+    I.018019  COST              3.86   U.018019       -117.04
+    I.019024  COST              8.41   U.019024       -117.04
+    I.024...  COST             26.46   U.024...       -117.04
+    I.023024  COST             16.01   U.023024       -117.04
+    I.022023  COST             16.73   U.022023       -117.04
+    I.020022  COST             11.75   U.020022       -117.04
+    I.021022  COST              3.25   U.021022       -117.04
+    I.022...  COST             27.41   U.022...       -117.04
+    I.024026  COST              5.98   U.024026       -117.04
+    I.025026  COST             21.88   U.025026       -117.04
+    I.025...  COST             43.71   U.025...       -117.04
+    I.026027  COST             11.42   U.026027       -117.04
+    I.027...  COST              23.4   U.027...       -117.04
+    I.027032  COST               7.5   U.027032       -117.04
+    I.030031  COST              6.73   U.030031       -117.04
+    I.031032  COST              5.92   U.031032       -117.04
+    I.029031  COST               9.7   U.029031       -117.04
+    I.028029  COST             12.67   U.028029       -117.04
+    I.028...  COST             26.45   U.028...       -117.04
+    I.032033  COST              2.71   U.032033       -117.04
+    I.033037  COST              5.89   U.033037       -117.04
+    I.036037  COST              9.85   U.036037       -117.04
+    I.034036  COST               8.5   U.034036       -117.04
+    I.035036  COST                 9   U.035036       -117.04
+    I.037038  COST              2.27   U.037038       -117.04
+    I.038040  COST              6.37   U.038040       -117.04
+    I.039040  COST              16.2   U.039040       -117.04
+    I.040...  COST             23.58   U.040...       -117.04
+    I.041...  COST             29.93   U.041...       -117.04
+    I.040041  COST              6.73   U.040041       -117.04
+    I.041042  COST             20.66   U.041042       -117.04
+    I.042...  COST             30.92   U.042...       -117.04
+    MARK0001  'MARKER'                 'INTEND'
+    F....001  ...                  1   001                 -1
+    F....002  ...                  1   002                 -1
+    F....004  ...                  1   004                 -1
+    F....006  ...                  1   006                 -1
+    F....007  ...                  1   007                 -1
+    F....009  ...                  1   009                 -1
+    F....010  ...                  1   010                 -1
+    F....011  ...                  1   011                 -1
+    F....013  ...                  1   013                 -1
+    F....014  ...                  1   014                 -1
+    F....015  ...                  1   015                 -1
+    F....017  ...                  1   017                 -1
+    F....019  ...                  1   019                 -1
+    F....020  ...                  1   020                 -1
+    F....021  ...                  1   021                 -1
+    F....023  ...                  1   023                 -1
+    F....025  ...                  1   025                 -1
+    F....026  ...                  1   026                 -1
+    F....028  ...                  1   028                 -1
+    F....029  ...                  1   029                 -1
+    F....030  ...                  1   030                 -1
+    F....031  ...                  1   031                 -1
+    F....033  ...                  1   033                 -1
+    F....034  ...                  1   034                 -1
+    F....035  ...                  1   035                 -1
+    F....036  ...                  1   036                 -1
+    F....038  ...                  1   038                 -1
+    F....039  ...                  1   039                 -1
+    F....040  ...                  1   040                 -1
+    F....041  ...                  1   041                 -1
+    F....042  ...                  1   042                 -1
+    F.001...  COST             0.979   ...                 -1
+    F.001...  001                  1   U.001...             1
+    F.001003  COST             0.034   001                  1
+    F.001003  003                 -1   U.001003             1
+    F.002003  COST             0.016   002                  1
+    F.002003  003                 -1   U.002003             1
+    F.002...  COST             0.914   ...                 -1
+    F.002...  002                  1   U.002...             1
+    F.003005  COST             0.057   003                  1
+    F.003005  005                 -1   U.003005             1
+    F.004005  COST             0.016   004                  1
+    F.004005  005                 -1   U.004005             1
+    F.004...  COST             0.969   ...                 -1
+    F.004...  004                  1   U.004...             1
+    F.005007  COST             0.006   007                 -1
+    F.005007  005                  1   U.005007             1
+    F.006007  COST              0.01   006                  1
+    F.006007  007                 -1   U.006007             1
+    F.007008  COST             0.002   007                  1
+    F.007008  008                 -1   U.007008             1
+    F.008...  COST             0.976   ...                 -1
+    F.008...  008                  1   U.008...             1
+    F.008009  COST             0.017   009                 -1
+    F.008009  008                  1   U.008009             1
+    F.010012  COST             0.027   010                  1
+    F.010012  012                 -1   U.010012             1
+    F.011012  COST             0.009   011                  1
+    F.011012  012                 -1   U.011012             1
+    F.012...  COST             0.964   ...                 -1
+    F.012...  012                  1   U.012...             1
+    F.012013  COST             0.025   013                 -1
+    F.012013  012                  1   U.012013             1
+    F.013016  COST             0.015   013                  1
+    F.013016  016                 -1   U.013016             1
+    F.014015  COST              0.01   014                  1
+    F.014015  015                 -1   U.014015             1
+    F.015016  COST             0.006   015                  1
+    F.015016  016                 -1   U.015016             1
+    F.016...  COST              0.97   ...                 -1
+    F.016...  016                  1   U.016...             1
+    F.016017  COST             0.022   017                 -1
+    F.016017  016                  1   U.016017             1
+    F.017018  COST             0.003   017                  1
+    F.017018  018                 -1   U.017018             1
+    F.009018  COST             0.002   009                  1
+    F.009018  018                 -1   U.009018             1
+    F.018019  COST             0.004   019                 -1
+    F.018019  018                  1   U.018019             1
+    F.019024  COST             0.969   019                  1
+    F.019024  024                 -1   U.019024             1
+    F.024...  COST             0.021   ...                 -1
+    F.024...  024                  1   U.024...             1
+    F.023024  COST             0.026   023                  1
+    F.023024  024                 -1   U.023024             1
+    F.022023  COST             0.022   023                 -1
+    F.022023  022                  1   U.022023             1
+    F.020022  COST             0.005   020                  1
+    F.020022  022                 -1   U.020022             1
+    F.021022  COST             0.971   021                  1
+    F.021022  022                 -1   U.021022             1
+    F.022...  COST             0.004   ...                 -1
+    F.022...  022                  1   U.022...             1
+    F.024026  COST             0.054   026                 -1
+    F.024026  024                  1   U.024026             1
+    F.025026  COST             0.054   025                  1
+    F.025026  026                 -1   U.025026             1
+    F.025...  COST             1.017   ...                 -1
+    F.025...  025                  1   U.025...             1
+    F.026027  COST              0.02   026                  1
+    F.026027  027                 -1   U.026027             1
+    F.027...  COST             0.967   ...                 -1
+    F.027...  027                  1   U.027...             1
+    F.027032  COST             0.011   027                  1
+    F.027032  032                 -1   U.027032             1
+    F.030031  COST             0.012   030                  1
+    F.030031  031                 -1   U.030031             1
+    F.031032  COST             0.004   031                  1
+    F.031032  032                 -1   U.031032             1
+    F.029031  COST             0.012   029                  1
+    F.029031  031                 -1   U.029031             1
+    F.028029  COST             0.024   028                  1
+    F.028029  029                 -1   U.028029             1
+    F.028...  COST             0.975   ...                 -1
+    F.028...  028                  1   U.028...             1
+    F.032033  COST             0.002   033                 -1
+    F.032033  032                  1   U.032033             1
+    F.033037  COST             0.004   033                  1
+    F.033037  037                 -1   U.033037             1
+    F.036037  COST             0.018   036                  1
+    F.036037  037                 -1   U.036037             1
+    F.034036  COST             0.016   034                  1
+    F.034036  036                 -1   U.034036             1
+    F.035036  COST             0.015   035                  1
+    F.035036  036                 -1   U.035036             1
+    F.037038  COST             0.001   038                 -1
+    F.037038  037                  1   U.037038             1
+    F.038040  COST             0.009   038                  1
+    F.038040  040                 -1   U.038040             1
+    F.039040  COST             0.025   039                  1
+    F.039040  040                 -1   U.039040             1
+    F.040...  COST             0.967   ...                 -1
+    F.040...  040                  1   U.040...             1
+    F.041...  COST              0.98   ...                 -1
+    F.041...  041                  1   U.041...             1
+    F.040041  COST              0.01   040                  1
+    F.040041  041                 -1   U.040041             1
+    F.041042  COST             0.035   041                  1
+    F.041042  042                 -1   U.041042             1
+    F.042...  COST             0.978   ...                 -1
+    F.042...  042                  1   U.042...             1
+RHS
+BOUNDS
+ UP BOUNDS    I.001...             1
+ UP BOUNDS    I.001003             1
+ UP BOUNDS    I.002003             1
+ UP BOUNDS    I.002...             1
+ UP BOUNDS    I.003005             1
+ UP BOUNDS    I.004005             1
+ UP BOUNDS    I.004...             1
+ UP BOUNDS    I.005007             1
+ UP BOUNDS    I.006007             1
+ UP BOUNDS    I.007008             1
+ UP BOUNDS    I.008...             1
+ UP BOUNDS    I.008009             1
+ UP BOUNDS    I.010012             1
+ UP BOUNDS    I.011012             1
+ UP BOUNDS    I.012...             1
+ UP BOUNDS    I.012013             1
+ UP BOUNDS    I.013016             1
+ UP BOUNDS    I.014015             1
+ UP BOUNDS    I.015016             1
+ UP BOUNDS    I.016...             1
+ UP BOUNDS    I.016017             1
+ UP BOUNDS    I.017018             1
+ UP BOUNDS    I.009018             1
+ UP BOUNDS    I.018019             1
+ UP BOUNDS    I.019024             1
+ UP BOUNDS    I.024...             1
+ UP BOUNDS    I.023024             1
+ UP BOUNDS    I.022023             1
+ UP BOUNDS    I.020022             1
+ UP BOUNDS    I.021022             1
+ UP BOUNDS    I.022...             1
+ UP BOUNDS    I.024026             1
+ UP BOUNDS    I.025026             1
+ UP BOUNDS    I.025...             1
+ UP BOUNDS    I.026027             1
+ UP BOUNDS    I.027...             1
+ UP BOUNDS    I.027032             1
+ UP BOUNDS    I.030031             1
+ UP BOUNDS    I.031032             1
+ UP BOUNDS    I.029031             1
+ UP BOUNDS    I.028029             1
+ UP BOUNDS    I.028...             1
+ UP BOUNDS    I.032033             1
+ UP BOUNDS    I.033037             1
+ UP BOUNDS    I.036037             1
+ UP BOUNDS    I.034036             1
+ UP BOUNDS    I.035036             1
+ UP BOUNDS    I.037038             1
+ UP BOUNDS    I.038040             1
+ UP BOUNDS    I.039040             1
+ UP BOUNDS    I.040...             1
+ UP BOUNDS    I.041...             1
+ UP BOUNDS    I.040041             1
+ UP BOUNDS    I.041042             1
+ UP BOUNDS    I.042...             1
+ FX BOUNDS    F....001          2.45
+ FX BOUNDS    F....002          0.61
+ FX BOUNDS    F....004          7.91
+ FX BOUNDS    F....006          4.54
+ FX BOUNDS    F....007          1.14
+ FX BOUNDS    F....009          0.28
+ FX BOUNDS    F....010          1.13
+ FX BOUNDS    F....011         21.46
+ FX BOUNDS    F....013          4.64
+ FX BOUNDS    F....014          0.31
+ FX BOUNDS    F....015          1.24
+ FX BOUNDS    F....017          0.07
+ FX BOUNDS    F....019          2.41
+ FX BOUNDS    F....020          0.39
+ FX BOUNDS    F....021          7.41
+ FX BOUNDS    F....023          0.07
+ FX BOUNDS    F....025         19.22
+ FX BOUNDS    F....026         10.49
+ FX BOUNDS    F....028          0.88
+ FX BOUNDS    F....029           5.7
+ FX BOUNDS    F....030          0.28
+ FX BOUNDS    F....031          0.28
+ FX BOUNDS    F....033          0.19
+ FX BOUNDS    F....034          0.19
+ FX BOUNDS    F....035          0.28
+ FX BOUNDS    F....036          0.57
+ FX BOUNDS    F....038           5.3
+ FX BOUNDS    F....039          5.32
+ FX BOUNDS    F....040          0.76
+ FX BOUNDS    F....041          5.08
+ FX BOUNDS    F....042          6.44
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ex1.mps b/demos/ppl_lpsol/examples/ex1.mps
new file mode 100644
index 0000000..fcbc51a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex1.mps
@@ -0,0 +1,21 @@
+NAME          from_lp_file
+ROWS
+ N  r_000000
+ L  C1
+ L  r_000002
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        r_000000  1
+    x1        C1        2
+    x1        r_000002  -4
+    x2        r_000000  -2
+    x2        C1        1
+    x2        r_000002  4
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       C1        5
+    RHS       r_000002  5
+BOUNDS
+ PL FOO       x1
+ PL FOO       x2
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ex12.mps b/demos/ppl_lpsol/examples/ex12.mps
new file mode 100644
index 0000000..755462b
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex12.mps
@@ -0,0 +1,25 @@
+* Problem:    UNKNOWN
+* Class:      MIP
+* Rows:       2
+* Columns:    2 (1 integer, 0 binary)
+* Non-zeros:  4
+* Format:     Fixed MPS
+*
+NAME
+ROWS
+ N  R0000000
+ L  R0000001
+ L  R0000002
+COLUMNS
+    M0000001  'MARKER'                 'INTORG'
+    C0000001  R0000000             4   R0000001           0.7
+    C0000001  R0000002           0.1
+    M0000002  'MARKER'                 'INTEND'
+    C0000002  R0000000             1   R0000001             1
+    C0000002  R0000002         0.025
+RHS
+    RHS1      R0000001           630   R0000002           135
+BOUNDS
+ LO BND1      C0000002            20
+ UP BND1      C0000002           500
+ENDATA
diff --git a/demos/ppl_lpsol/examples/kb2.mps b/demos/ppl_lpsol/examples/kb2.mps
new file mode 100644
index 0000000..625ceba
--- /dev/null
+++ b/demos/ppl_lpsol/examples/kb2.mps
@@ -0,0 +1,219 @@
+NAME          KB2
+ROWS
+ N  FAT7..J.
+ E  BAL...BW
+ E  BHC...BW
+ E  BLC...BW
+ E  BLV...BW
+ E  BN4...BW
+ E  BP8...BW
+ E  BTO...BW
+ E  B3E...BW
+ E  B3P...BW
+ E  B3R...BW
+ E  B3T...BW
+ E  B3E.VOBW
+ E  B3P.VOBW
+ E  B3R.VOBW
+ G  HMH.3EBW
+ G  HML.3EBW
+ G  HMM.3EBW
+ G  HRH.3EBW
+ G  HRL.3EBW
+ G  HRM.3EBW
+ G  HMH.3RBW
+ G  HML.3RBW
+ G  HMM.3RBW
+ G  HRH.3RBW
+ G  HRL.3RBW
+ G  HRM.3RBW
+ G  NOI.3EBW
+ G  NOI.3PBW
+ G  NOI.3RBW
+ E  WMO.3PBW
+ E  WRO.3PBW
+ L  XPB.3ABW
+ L  XCV.3EBW
+ L  XPB.3EBW
+ L  XRV.3EBW
+ L  X12.3EBW
+ L  XCV.3PBW
+ L  XRV.3PBW
+ L  X12.3PBW
+ L  XCV.3RBW
+ L  XPB.3RBW
+ L  XRV.3RBW
+ L  X12.3RBW
+COLUMNS
+    BAL.3EBW  BAL...BW           -1.   B3E.VOBW            1.
+    BAL.3EBW  XCV.3EBW            6.   XRV.3EBW            4.
+    BAL.3EBW  X12.3EBW          50.3   HRL.3EBW      98.70277
+    BAL.3EBW  HML.3EBW      94.63568   HRM.3EBW     102.02191
+    BAL.3EBW  HMM.3EBW      98.08976   HRH.3EBW      103.0581
+    BAL.3EBW  HMH.3EBW      99.18559
+    BHC.3EBW  BHC...BW           -1.   B3E.VOBW            1.
+    BHC.3EBW  XCV.3EBW           -2.   XRV.3EBW            .5
+    BHC.3EBW  X12.3EBW         -15.6   HRL.3EBW      92.89535
+    BHC.3EBW  HML.3EBW      79.40534   HRM.3EBW      94.57094
+    BHC.3EBW  HMM.3EBW      81.47009   HRH.3EBW      95.02163
+    BHC.3EBW  HMH.3EBW      82.04308
+    BLC.3EBW  BLC...BW           -1.   B3E.VOBW            1.
+    BLC.3EBW  XCV.3EBW            7.   XRV.3EBW           4.5
+    BLC.3EBW  X12.3EBW          57.9   HRL.3EBW      95.38345
+    BLC.3EBW  HML.3EBW      80.37873   HRM.3EBW      97.97965
+    BLC.3EBW  HMM.3EBW      83.22026   HRH.3EBW      98.64634
+    BLC.3EBW  HMH.3EBW       83.9937
+    BLV.3EBW  BLV...BW           -1.   B3E.VOBW            1.
+    BLV.3EBW  XCV.3EBW           14.   XRV.3EBW           7.2
+    BLV.3EBW  X12.3EBW         102.3   HRL.3EBW       82.8797
+    BLV.3EBW  HML.3EBW      80.36789   HRM.3EBW      87.33298
+    BLV.3EBW  HMM.3EBW       84.5191   HRH.3EBW      88.46612
+    BLV.3EBW  HMH.3EBW      85.61385
+    BN4.3EBW  BN4...BW           -1.   B3E.VOBW            1.
+    BN4.3EBW  XCV.3EBW           80.   XRV.3EBW           70.
+    BN4.3EBW  X12.3EBW          113.   HRL.3EBW      97.32996
+    BN4.3EBW  HML.3EBW      92.71594   HRM.3EBW        100.65
+    BN4.3EBW  HMM.3EBW      96.86628   HRH.3EBW     101.66321
+    BN4.3EBW  HMH.3EBW      98.06433
+    BP8.3EBW  BP8...BW           -1.   B3E.VOBW            1.
+    BP8.3EBW  XCV.3EBW            4.   XRV.3EBW           3.6
+    BP8.3EBW  X12.3EBW          28.9   HRL.3EBW     101.17309
+    BP8.3EBW  HML.3EBW      90.03844   HRM.3EBW     102.21363
+    BP8.3EBW  HMM.3EBW      91.26611   HRH.3EBW     102.51818
+    BP8.3EBW  HMH.3EBW      91.62642
+    BTO.3EBW  BTO...BW           -1.   B3E.VOBW            1.
+    BTO.3EBW  XCV.3EBW           -1.   XRV.3EBW           1.2
+    BTO.3EBW  X12.3EBW            5.   HRL.3EBW     105.47666
+    BTO.3EBW  HML.3EBW      89.10432   HRM.3EBW     106.21918
+    BTO.3EBW  HMM.3EBW      90.14887   HRH.3EBW     106.46719
+    BTO.3EBW  HMH.3EBW      90.49629
+    BAL.3PBW  BAL...BW           -1.   B3P.VOBW            1.
+    BAL.3PBW  XCV.3PBW            6.   XRV.3PBW            4.
+    BAL.3PBW  X12.3PBW          50.3   WRO.3PBW      96.13556
+    BAL.3PBW  WMO.3PBW      91.96313
+    BHC.3PBW  BHC...BW           -1.   B3P.VOBW            1.
+    BHC.3PBW  XCV.3PBW           -2.   XRV.3PBW            .5
+    BHC.3PBW  X12.3PBW         -15.6   WRO.3PBW      90.99637
+    BHC.3PBW  WMO.3PBW      78.09095
+    BLC.3PBW  BLC...BW           -1.   B3P.VOBW            1.
+    BLC.3PBW  XCV.3PBW            7.   XRV.3PBW           4.5
+    BLC.3PBW  X12.3PBW          57.9   WRO.3PBW      93.95665
+    BLC.3PBW  WMO.3PBW      80.74635
+    BLV.3PBW  BLV...BW           -1.   B3P.VOBW            1.
+    BLV.3PBW  XCV.3PBW           14.   XRV.3PBW           7.2
+    BLV.3PBW  X12.3PBW         102.3   WRO.3PBW      79.78002
+    BLV.3PBW  WMO.3PBW      77.37441
+    BN4.3PBW  BN4...BW           -1.   B3P.VOBW            1.
+    BN4.3PBW  XCV.3PBW           80.   XRV.3PBW           70.
+    BN4.3PBW  X12.3PBW          113.   WRO.3PBW      94.11062
+    BN4.3PBW  WMO.3PBW      88.35436
+    BP8.3PBW  BP8...BW           -1.   B3P.VOBW            1.
+    BP8.3PBW  XCV.3PBW            4.   XRV.3PBW           3.6
+    BP8.3PBW  X12.3PBW          28.9   WRO.3PBW      99.83178
+    BP8.3PBW  WMO.3PBW      88.58029
+    BTO.3PBW  BTO...BW           -1.   B3P.VOBW            1.
+    BTO.3PBW  XCV.3PBW           -1.   XRV.3PBW           1.2
+    BTO.3PBW  X12.3PBW            5.   WRO.3PBW     105.07558
+    BTO.3PBW  WMO.3PBW      88.18188
+    BAL.3RBW  BAL...BW           -1.   B3R.VOBW            1.
+    BAL.3RBW  XCV.3RBW            6.   XRV.3RBW            4.
+    BAL.3RBW  X12.3RBW          50.3   HRL.3RBW      99.19039
+    BAL.3RBW  HML.3RBW      95.17073   HRM.3RBW      101.0885
+    BAL.3RBW  HMM.3RBW      97.11016   HRH.3RBW      103.0581
+    BAL.3RBW  HMH.3RBW      99.18559
+    BHC.3RBW  BHC...BW           -1.   B3R.VOBW            1.
+    BHC.3RBW  XCV.3RBW           -2.   XRV.3RBW            .5
+    BHC.3RBW  X12.3RBW         -15.6   HRL.3RBW      93.16124
+    BHC.3RBW  HML.3RBW      79.72867   HRM.3RBW      94.14769
+    BHC.3RBW  HMM.3RBW      80.94047   HRH.3RBW      95.02163
+    BHC.3RBW  HMH.3RBW      82.04308
+    BLC.3RBW  BLC...BW           -1.   B3R.VOBW            1.
+    BLC.3RBW  XCV.3RBW            7.   XRV.3RBW           4.5
+    BLC.3RBW  X12.3RBW          57.9   HRL.3RBW      95.80861
+    BLC.3RBW  HML.3RBW      80.82888   HRM.3RBW      97.34183
+    BLC.3RBW  HMM.3RBW      82.49926   HRH.3RBW      98.64634
+    BLC.3RBW  HMH.3RBW       83.9937
+    BLV.3RBW  BLV...BW           -1.   B3R.VOBW            1.
+    BLV.3RBW  XCV.3RBW           14.   XRV.3RBW           7.2
+    BLV.3RBW  X12.3RBW         102.3   HRL.3RBW      83.61375
+    BLV.3RBW  HML.3RBW      81.03825   HRM.3RBW      86.24515
+    BLV.3RBW  HMM.3RBW      83.48458   HRH.3RBW      88.46612
+    BLV.3RBW  HMH.3RBW      85.61385
+    BN4.3RBW  BN4...BW           -1.   B3R.VOBW            1.
+    BN4.3RBW  XCV.3RBW           80.   XRV.3RBW           70.
+    BN4.3RBW  X12.3RBW          113.   HRL.3RBW      97.86876
+    BN4.3RBW  HML.3RBW      93.41749   HRM.3RBW      99.77765
+    BN4.3RBW  HMM.3RBW      95.86635   HRH.3RBW     101.66321
+    BN4.3RBW  HMH.3RBW      98.06433
+    BP8.3RBW  BP8...BW           -1.   B3R.VOBW            1.
+    BP8.3RBW  XCV.3RBW            4.   XRV.3RBW           3.6
+    BP8.3RBW  X12.3RBW          28.9   HRL.3RBW     101.32905
+    BP8.3RBW  HML.3RBW      90.22411   HRM.3RBW     101.93754
+    BP8.3RBW  HMM.3RBW      90.94112   HRH.3RBW     102.51818
+    BP8.3RBW  HMH.3RBW      91.62642
+    BTO.3RBW  BTO...BW           -1.   B3R.VOBW            1.
+    BTO.3RBW  XCV.3RBW           -1.   XRV.3RBW           1.2
+    BTO.3RBW  X12.3RBW            5.   HRL.3RBW     105.58392
+    BTO.3RBW  HML.3RBW      89.25587   HRM.3RBW      106.0019
+    BTO.3RBW  HMM.3RBW      89.84584   HRH.3RBW     106.46719
+    BTO.3RBW  HMH.3RBW      90.49629
+    D3T...BW  B3T...BW           -1.   FAT7..J.         -16.5
+    EAL...BW  BAL...BW            1.
+    EHC...BW  BHC...BW            1.
+    ELC...BW  BLC...BW            1.
+    ELV...BW  BLV...BW            1.
+    EN4...BW  BN4...BW            1.   FAT7..J.           12.
+    EP8...BW  BP8...BW            1.
+    ETO...BW  BTO...BW            1.   FAT7..J.           16.
+    M3..3TBW  B3T...BW            1.   B3E...BW          -.29
+    M3..3TBW  B3P...BW          -.17   B3R...BW          -.54
+    QPB73EBW  FAT7..J.        .08757   XPB.3EBW            1.
+    QPB73EBW  HRL.3EBW       2.52143   HML.3EBW       3.42918
+    QPB73EBW  HRM.3EBW       1.54954   HMM.3EBW       1.55751
+    QPB73EBW  HRH.3EBW       1.27141   HMH.3EBW       1.23842
+    QPB73EBW  XPB.3ABW            1.
+    QVO73EBW  B3E...BW            1.   B3E.VOBW           -1.
+    QVO73EBW  XCV.3EBW          -16.   XRV.3EBW          -12.
+    QVO73EBW  X12.3EBW          -61.   NOI.3EBW       -107.52
+    QVO73EBW  XPB.3EBW          -1.7   HRL.3EBW      -1.00857
+    QVO73EBW  HML.3EBW      -1.37167   HRM.3EBW       -2.0144
+    QVO73EBW  HMM.3EBW      -2.02477   HRH.3EBW      -2.16139
+    QVO73EBW  HMH.3EBW      -2.10531   XPB.3ABW          -1.5
+    QVO73PBW  B3P...BW            1.   B3P.VOBW           -1.
+    QVO73PBW  XCV.3PBW          -16.   XRV.3PBW          -12.
+    QVO73PBW  X12.3PBW          -61.   NOI.3PBW        -97.41
+    QVO73PBW  XPB.3ABW          -1.5
+    QPB73RBW  FAT7..J.        .08757   XPB.3RBW            1.
+    QPB73RBW  HRL.3RBW       4.31949   HML.3RBW       4.41873
+    QPB73RBW  HRM.3RBW       2.62696   HMM.3RBW       2.74531
+    QPB73RBW  HRH.3RBW       1.64391   HMH.3RBW       1.75028
+    QPB73RBW  XPB.3ABW            1.
+    QVO73RBW  B3R...BW            1.   B3R.VOBW           -1.
+    QVO73RBW  XCV.3RBW          -16.   XRV.3RBW          -12.
+    QVO73RBW  X12.3RBW          -61.   NOI.3RBW         -98.5
+    QVO73RBW  XPB.3RBW          -1.7   HRL.3RBW      -2.15975
+    QVO73RBW  HML.3RBW      -2.20937   HRM.3RBW      -2.62696
+    QVO73RBW  HMM.3RBW      -2.74531   HRH.3RBW      -2.79464
+    QVO73RBW  HMH.3RBW      -2.97548   XPB.3ABW          -1.5
+    WMO73EBW  NOI.3EBW           .73   HML.3EBW           -1.
+    WMO73EBW  HMM.3EBW           -1.   HMH.3EBW           -1.
+    WRO73EBW  NOI.3EBW           .41   HRL.3EBW           -1.
+    WRO73EBW  HRM.3EBW           -1.   HRH.3EBW           -1.
+    WMO73PBW  WMO.3PBW           -1.   NOI.3PBW           .84
+    WRO73PBW  WRO.3PBW           -1.   NOI.3PBW           .27
+    WMO73RBW  NOI.3RBW           .81   HML.3RBW           -1.
+    WMO73RBW  HMM.3RBW           -1.   HMH.3RBW           -1.
+    WRO73RBW  NOI.3RBW           .31   HRL.3RBW           -1.
+    WRO73RBW  HRM.3RBW           -1.   HRH.3RBW           -1.
+RHS
+BOUNDS
+ UP 77BOUND   BHC.3EBW           10.
+ UP 77BOUND   D3T...BW          200.
+ UP 77BOUND   EAL...BW           10.
+ UP 77BOUND   EHC...BW           20.
+ UP 77BOUND   ELC...BW           25.
+ UP 77BOUND   ELV...BW           12.
+ UP 77BOUND   EN4...BW          100.
+ UP 77BOUND   EP8...BW           35.
+ UP 77BOUND   ETO...BW            5.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/lseu.mps b/demos/ppl_lpsol/examples/lseu.mps
new file mode 100644
index 0000000..00e6b5a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/lseu.mps
@@ -0,0 +1,371 @@
+*NAME:         lseu   
+*ROWS:         28
+*COLUMNS:      89
+*INTEGER:      89
+*NONZERO:      309
+*BEST SOLN:    1120 (opt)
+*LP SOLN:      834.68
+*SOURCE:       C. E. Lemke and K. Spielberg
+*              Ellis L. Johnson and Uwe H. Suhl 
+*              John J. Forrest (IBM)
+*APPLICATION:  unknown
+*COMMENTS:     pure 0/1 IP
+*              
+*      
+NAME          LSEU
+ROWS
+ N  R100    
+ L  R101    
+ L  R102    
+ L  R103    
+ L  R104    
+ L  R105    
+ L  R106    
+ L  R107    
+ L  R108    
+ L  R109    
+ L  R110    
+ L  R111    
+ L  R112    
+ L  R113    
+ L  R114    
+ L  R115    
+ L  R116    
+ L  R117    
+ L  R118    
+ L  R119    
+ L  R120    
+ L  R121    
+ L  R122    
+ L  R123    
+ L  R124    
+ L  R125    
+ L  R126    
+ L  R127    
+ L  R128    
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    C101      R100                 7   R119               525
+    C101      R120              -525   R122              -525
+    C101      R123              -525
+    C102      R100                10   R119               500
+    C102      R120              -500   R122              -500
+    C102      R123              -500
+    C103      R100               179   R101                 1
+    C103      R119               475   R120              -475
+    C103      R124              -475   R125              -475
+    C104      R100               186   R101                 1
+    C104      R119               475   R120              -475
+    C104      R122              -475   R123              -475
+    C105      R100               179   R101                 1
+    C105      R119               475   R120              -475
+    C105      R122              -190   R123              -190
+    C105      R124              -285   R125              -285
+    C106      R102                 1   R118              -450
+    C107      R102                 1   R124              -450
+    C107      R125              -450
+    C108      R100                 6   R102                 1
+    C108      R122              -450   R123              -450
+    C109      R102                 1   R122              -165
+    C109      R123              -165   R124              -285
+    C109      R125              -285
+    C110      R102                 1   R124              -150
+    C110      R125              -150
+    C111      R100               164   R103                 1
+    C111      R118              -435
+    C112      R100               164   R103                 1
+    C112      R124              -435   R125              -435
+    C113      R100               170   R103                 1
+    C113      R119               435   R120              -435
+    C113      R123              -435
+    C114      R100               164   R103                 1
+    C114      R119               435   R120              -435
+    C114      R121              -435
+    C115      R100               346   R104                 1
+    C115      R124              -435   R125              -435
+    C116      R100               346   R104                 1
+    C116      R119               435   R120              -435
+    C116      R125              -435
+    C117      R100               248   R105                 1
+    C117      R119               435   R120              -435
+    C117      R124              -435   R125              -435
+    C118      R100               253   R105                 1
+    C118      R119               435   R120              -435
+    C118      R122              -435   R123              -435
+    C119      R100               248   R105                 1
+    C119      R119               435   R120              -435
+    C119      R122              -300   R123              -300
+    C119      R124              -135   R125              -135
+    C120      R100               346   R106                 1
+    C120      R118              -435
+    C121      R100               346   R106                 1
+    C121      R123              -400
+    C122      R100               346   R106                 1
+    C122      R121              -400
+    C123      R100               346   R106                 1
+    C123      R124              -100   R125              -100
+    C123      R127              -300
+    C124      R100               160   R107                 1
+    C124      R124              -400   R125              -400
+    C125      R100               161   R107                 1
+    C125      R122              -400   R123              -400
+    C126      R100               160   R107                 1
+    C126      R122              -115   R123              -115
+    C126      R124              -285   R125              -285
+    C127      R100               160   R107                 1
+    C127      R119               425   R120              -425
+    C127      R125              -425
+    C128      R100               161   R107                 1
+    C128      R119               425   R120              -425
+    C128      R123              -425
+    C129      R100               160   R107                 1
+    C129      R119               425   R120              -425
+    C129      R123              -140   R125              -285
+    C130      R100               160   R107                 1
+    C130      R124              -100   R125              -100
+    C130      R126              -300   R127              -300
+    C131      R100               278   R108                 1
+    C131      R118              -350
+    C132      R100               278   R108                 1
+    C132      R124              -350   R125              -350
+    C133      R100               278   R108                 1
+    C133      R121              -350
+    C134      R100                86   R109                 1
+    C134      R122              -330   R123              -330
+    C135      R100                86   R109                 1
+    C135      R126              -330   R127              -330
+    C136      R100                86   R109                 1
+    C136      R119               330   R120              -330
+    C136      R124              -330   R125              -330
+    C137      R100                86   R109                 1
+    C137      R119               330   R120              -330
+    C137      R123              -330
+    C138      R100                86   R109                 1
+    C138      R119               330   R120              -330
+    C138      R121              -330
+    C139      R100                86   R119               330
+    C139      R120              -330   R122              -330
+    C139      R123              -330
+    C140      R100               188   R110                 1
+    C140      R122              -330   R123              -330
+    C141      R100               188   R110                 1
+    C141      R119               330   R120              -330
+    C141      R124              -330   R125              -330
+    C142      R100               188   R110                 1
+    C142      R119               330   R120              -330
+    C142      R121              -330
+    C143      R100                85   R111                 1
+    C143      R122              -325   R123              -325
+    C144      R100                85   R111                 1
+    C144      R126              -325   R127              -325
+    C145      R100                85   R111                 1
+    C145      R119               325   R120              -325
+    C145      R124              -325   R125              -325
+    C146      R100                85   R111                 1
+    C146      R119               325   R120              -325
+    C146      R123              -325
+    C147      R100                85   R111                 1
+    C147      R119               325   R120              -325
+    C147      R121              -325
+    C148      R100                78   R112                 1
+    C148      R122              -300   R123              -300
+    C149      R100                78   R112                 1
+    C149      R119               300   R120              -300
+    C149      R124              -300   R125              -300
+    C150      R100                78   R112                 1
+    C150      R119               300   R120              -300
+    C150      R121              -300
+    C151      R100                78   R112                 1
+    C151      R128              -300
+    C152      R100                78   R113                 1
+    C152      R122              -300   R123              -300
+    C153      R100                78   R113                 1
+    C153      R126              -300   R127              -300
+    C154      R100                78   R113                 1
+    C154      R119               300   R120              -300
+    C154      R124              -300   R125              -300
+    C155      R100                78   R113                 1
+    C155      R119               300   R120              -300
+    C155      R123              -300
+    C156      R100                78   R113                 1
+    C156      R119               300   R120              -300
+    C156      R121              -300
+    C157      R100               171   R114                 1
+    C157      R122              -300   R123              -300
+    C158      R100               171   R114                 1
+    C158      R126              -300   R127              -300
+    C159      R100               171   R114                 1
+    C159      R119               300   R120              -300
+    C159      R123              -300
+    C160      R100               171   R114                 1
+    C160      R119               300   R120              -300
+    C160      R121              -300
+    C161      R100               163   R115                 1
+    C161      R119               285   R120              -285
+    C161      R124              -285   R125              -285
+    C162      R100               163   R115                 1
+    C162      R119               285   R120              -285
+    C162      R122              -285   R123              -285
+    C163      R100               163   R115                 1
+    C163      R128              -285
+    C164      R100                69   R116                 1
+    C164      R119               265   R120              -265
+    C164      R124              -265   R125              -265
+    C165      R100                69   R116                 1
+    C165      R119               265   R120              -265
+    C165      R122              -265   R123              -265
+    C166      R100               183   R117                 1
+    C166      R118              -230
+    C167      R100               183   R117                 1
+    C167      R124              -230   R125              -230
+    C168      R100               183   R117                 1
+    C168      R119               230   R120              -230
+    C168      R125              -230
+    C169      R100               183   R117                 1
+    C169      R119               230   R120              -230
+    C169      R123              -230
+    C170      R100                49   R119               190
+    C170      R120              -190   R122              -190
+    C170      R123              -190
+    C171      R100               183   R117                 1
+    C172      R100               258   R118              -200
+    C173      R100               517   R118              -400
+    C174      R100               250   R126              -200
+    C174      R127              -200
+    C175      R100               500   R126              -400
+    C175      R127              -400
+    C176      R100               250   R127              -200
+    C177      R100               500   R127              -400
+    C178      R100               159   R119               200
+    C178      R120              -200   R124              -200
+    C178      R125              -200
+    C179      R100               318   R119               400
+    C179      R120              -400   R124              -400
+    C179      R125              -400
+    C180      R100               159   R119               200
+    C180      R120              -200   R125              -200
+    C181      R100               318   R119               400
+    C181      R120              -400   R125              -400
+    C182      R100               159   R119               200
+    C182      R120              -200   R122              -200
+    C182      R123              -200
+    C183      R100               318   R119               400
+    C183      R120              -400   R122              -400
+    C183      R123              -400
+    C184      R100               159   R119               200
+    C184      R120              -200   R123              -200
+    C185      R100               318   R119               400
+    C185      R120              -400   R123              -400
+    C186      R100               114   R119               200
+    C186      R120              -200   R121              -200
+    C187      R100               228   R119               400
+    C187      R120              -400   R121              -400
+    C188      R100               159   R128              -200
+    C189      R100               318   R128              -400
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       R101                 1   R102                 1
+    RHS       R103                 1   R104                 1
+    RHS       R105                 1   R106                 1
+    RHS       R107                 1   R108                 1
+    RHS       R109                 1   R110                 1
+    RHS       R111                 1   R112                 1
+    RHS       R113                 1   R114                 1
+    RHS       R115                 1   R116                 1
+    RHS       R117                 1   R118              -190
+    RHS       R119              2700   R120             -2600
+    RHS       R121              -630   R122              -900
+    RHS       R123             -1656   R124              -335
+    RHS       R125             -1026   R126              -150
+    RHS       R127              -500   R128              -270
+BOUNDS
+ UP ONE       C101                 1
+ UP ONE       C102                 1
+ UP ONE       C103                 1
+ UP ONE       C104                 1
+ UP ONE       C105                 1
+ UP ONE       C106                 1
+ UP ONE       C107                 1
+ UP ONE       C108                 1
+ UP ONE       C109                 1
+ UP ONE       C110                 1
+ UP ONE       C111                 1
+ UP ONE       C112                 1
+ UP ONE       C113                 1
+ UP ONE       C114                 1
+ UP ONE       C115                 1
+ UP ONE       C116                 1
+ UP ONE       C117                 1
+ UP ONE       C118                 1
+ UP ONE       C119                 1
+ UP ONE       C120                 1
+ UP ONE       C121                 1
+ UP ONE       C122                 1
+ UP ONE       C123                 1
+ UP ONE       C124                 1
+ UP ONE       C125                 1
+ UP ONE       C126                 1
+ UP ONE       C127                 1
+ UP ONE       C128                 1
+ UP ONE       C129                 1
+ UP ONE       C130                 1
+ UP ONE       C131                 1
+ UP ONE       C132                 1
+ UP ONE       C133                 1
+ UP ONE       C134                 1
+ UP ONE       C135                 1
+ UP ONE       C136                 1
+ UP ONE       C137                 1
+ UP ONE       C138                 1
+ UP ONE       C139                 1
+ UP ONE       C140                 1
+ UP ONE       C141                 1
+ UP ONE       C142                 1
+ UP ONE       C143                 1
+ UP ONE       C144                 1
+ UP ONE       C145                 1
+ UP ONE       C146                 1
+ UP ONE       C147                 1
+ UP ONE       C148                 1
+ UP ONE       C149                 1
+ UP ONE       C150                 1
+ UP ONE       C151                 1
+ UP ONE       C152                 1
+ UP ONE       C153                 1
+ UP ONE       C154                 1
+ UP ONE       C155                 1
+ UP ONE       C156                 1
+ UP ONE       C157                 1
+ UP ONE       C158                 1
+ UP ONE       C159                 1
+ UP ONE       C160                 1
+ UP ONE       C161                 1
+ UP ONE       C162                 1
+ UP ONE       C163                 1
+ UP ONE       C164                 1
+ UP ONE       C165                 1
+ UP ONE       C166                 1
+ UP ONE       C167                 1
+ UP ONE       C168                 1
+ UP ONE       C169                 1
+ UP ONE       C170                 1
+ UP ONE       C171                 1
+ UP ONE       C172                 1
+ UP ONE       C173                 1
+ UP ONE       C174                 1
+ UP ONE       C175                 1
+ UP ONE       C176                 1
+ UP ONE       C177                 1
+ UP ONE       C178                 1
+ UP ONE       C179                 1
+ UP ONE       C180                 1
+ UP ONE       C181                 1
+ UP ONE       C182                 1
+ UP ONE       C183                 1
+ UP ONE       C184                 1
+ UP ONE       C185                 1
+ UP ONE       C186                 1
+ UP ONE       C187                 1
+ UP ONE       C188                 1
+ UP ONE       C189                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/markshare1.mps b/demos/ppl_lpsol/examples/markshare1.mps
new file mode 100644
index 0000000..1efa1f5
--- /dev/null
+++ b/demos/ppl_lpsol/examples/markshare1.mps
@@ -0,0 +1,236 @@
+NAME           markshare1
+ROWS
+ N  obj     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+COLUMNS
+    x1        obj                  1   c1                   1
+    x2        obj                 -1   c1                   1
+    x3        obj                  1   c2                   1
+    x4        obj                 -1   c2                   1
+    x5        obj                  1   c3                   1
+    x6        obj                 -1   c3                   1
+    x7        obj                  1   c4                   1
+    x8        obj                 -1   c4                   1
+    x9        obj                  1   c5                   1
+    x10       obj                 -1   c5                   1
+    x11       obj                  1   c6                   1
+    x12       obj                 -1   c6                   1
+    MARK0000  'MARKER'                 'INTORG'
+    x13       c1                  25   c2                  97
+    x13       c3                  95   c4                   1
+    x13       c5                   3   c6                  69
+    x14       c1                  35   c2                  64
+    x14       c3                  71   c4                  27
+    x14       c5                  94   c6                  72
+    x15       c1                  14   c2                  24
+    x15       c3                  19   c4                  46
+    x15       c5                  51   c6                  94
+    x16       c1                  76   c2                  63
+    x16       c3                  15   c4                  48
+    x16       c5                   4   c6                  56
+    x17       c1                  58   c2                  58
+    x17       c3                  66   c4                  66
+    x17       c5                  25   c6                  90
+    x18       c1                  10   c2                  45
+    x18       c3                  76   c4                  58
+    x18       c5                  46   c6                  20
+    x19       c1                  20   c2                  20
+    x19       c3                   4   c4                  52
+    x19       c5                  30   c6                  56
+    x20       c1                  51   c2                  71
+    x20       c3                  50   c4                   6
+    x20       c5                   2   c6                  50
+    x21       c1                  58   c2                  32
+    x21       c3                  50   c4                  14
+    x21       c5                  89   c6                  79
+    x22       c1                   1   c2                   7
+    x22       c3                  97   c4                  26
+    x22       c5                  65   c6                  59
+    x23       c1                  35   c2                  28
+    x23       c3                  83   c4                  55
+    x23       c5                  28   c6                  36
+    x24       c1                  40   c2                  77
+    x24       c3                  14   c4                  61
+    x24       c5                  46   c6                  24
+    x25       c1                  65   c2                  95
+    x25       c3                  27   c4                  60
+    x25       c5                  36   c6                  42
+    x26       c1                  59   c2                  96
+    x26       c3                  14   c4                   3
+    x26       c5                  53   c6                   9
+    x27       c1                  24   c2                  70
+    x27       c3                  34   c4                  33
+    x27       c5                  30   c6                  29
+    x28       c1                  44   c2                  22
+    x28       c3                   9   c4                  99
+    x28       c5                  73   c6                  68
+    x29       c1                   1   c2                  93
+    x29       c3                  99   c4                  36
+    x29       c5                  37   c6                  10
+    x30       c1                  93   c2                  32
+    x30       c3                  62   c4                  55
+    x30       c5                  60   c6                   1
+    x31       c1                  24   c2                  17
+    x31       c3                  92   c4                  70
+    x31       c5                  21   c6                  44
+    x32       c1                  68   c2                  56
+    x32       c3                  39   c4                  73
+    x32       c5                  41   c6                  74
+    x33       c1                  38   c2                  74
+    x33       c3                  56   c4                  70
+    x33       c5                   2   c6                  61
+    x34       c1                  64   c2                  62
+    x34       c3                  53   c4                  38
+    x34       c5                  21   c6                  37
+    x35       c1                  93   c2                  94
+    x35       c3                  91   c4                  66
+    x35       c5                  93   c6                  71
+    x36       c1                  14   c2                   9
+    x36       c3                  81   c4                  39
+    x36       c5                  82   c6                  63
+    x37       c1                  83   c2                  92
+    x37       c3                  46   c4                  43
+    x37       c5                  16   c6                  44
+    x38       c1                   6   c2                  90
+    x38       c3                  94   c4                  63
+    x38       c5                  97   c6                  77
+    x39       c1                  58   c2                  40
+    x39       c3                  76   c4                  88
+    x39       c5                  75   c6                  57
+    x40       c1                  14   c2                  45
+    x40       c3                  53   c4                  47
+    x40       c5                  50   c6                  46
+    x41       c1                  71   c2                  84
+    x41       c3                  58   c4                  18
+    x41       c5                  13   c6                  51
+    x42       c1                  17   c2                  62
+    x42       c3                  23   c4                  73
+    x42       c5                  43   c6                  43
+    x43       c1                  18   c2                  62
+    x43       c3                  15   c4                  40
+    x43       c5                  45   c6                   4
+    x44       c1                   8   c2                  34
+    x44       c3                  63   c4                  91
+    x44       c5                  64   c6                  85
+    x45       c1                  57   c2                  21
+    x45       c3                   2   c4                  96
+    x45       c5                  78   c6                  59
+    x46       c1                  48   c2                   2
+    x46       c3                  31   c4                  49
+    x46       c5                  78   c6                   7
+    x47       c1                  35   c2                  75
+    x47       c3                  55   c4                  13
+    x47       c5                   6   c6                  25
+    x48       c1                  13   c2                  42
+    x48       c3                  71   c4                  27
+    x48       c5                  35   c6                  46
+    x49       c1                  47   c2                  75
+    x49       c3                  97   c4                  22
+    x49       c5                  72   c6                  25
+    x50       c1                  46   c2                  29
+    x50       c3                  71   c4                  71
+    x50       c5                  31   c6                  70
+    x51       c1                   8   c2                   4
+    x51       c3                  55   c4                  99
+    x51       c5                  28   c6                  78
+    x52       c1                  82   c2                  64
+    x52       c3                   8   c4                  66
+    x52       c5                  56   c6                  88
+    x53       c1                  51   c2                  80
+    x53       c3                  57   c4                  57
+    x53       c5                  60   c6                  20
+    x54       c1                  49   c2                  17
+    x54       c3                  14   c4                   1
+    x54       c5                  23   c6                  40
+    x55       c1                  85   c2                  55
+    x55       c3                  76   c4                  54
+    x55       c5                  70   c6                  40
+    x56       c1                  66   c2                  73
+    x56       c3                   1   c4                  35
+    x56       c5                  46   c6                  16
+    x57       c1                  45   c2                  23
+    x57       c3                  46   c4                  52
+    x57       c5                  88   c6                   3
+    x58       c1                  99   c2                  13
+    x58       c3                  87   c4                  66
+    x58       c5                  20   c6                   3
+    x59       c1                  21   c2                  91
+    x59       c3                  22   c4                  26
+    x59       c5                  69   c6                   5
+    x60       c1                  75   c2                  70
+    x60       c3                  97   c4                   1
+    x60       c5                  13   c6                  77
+    x61       c1                  78   c2                  73
+    x61       c3                  99   c4                  26
+    x61       c5                  40   c6                  88
+    x62       c1                  43   c2                  28
+    x62       c3                  92   c4                  12
+    x62       c5                  73   c6                  16
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c1                1116   c2                1325
+    rhs       c3                1353   c4                1169
+    rhs       c5                1160   c6                1163
+BOUNDS
+ FX bnd       x2                   0
+ FX bnd       x4                   0
+ FX bnd       x6                   0
+ FX bnd       x8                   0
+ FX bnd       x10                  0
+ FX bnd       x12                  0
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/markshare2.mps b/demos/ppl_lpsol/examples/markshare2.mps
new file mode 100644
index 0000000..3e50b0a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/markshare2.mps
@@ -0,0 +1,341 @@
+NAME           markshare2
+ROWS
+ N  obj     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+ E  c7      
+COLUMNS
+    x1        obj                  1   c1                   1
+    x2        obj                 -1   c1                   1
+    x3        obj                  1   c2                   1
+    x4        obj                 -1   c2                   1
+    x5        obj                  1   c3                   1
+    x6        obj                 -1   c3                   1
+    x7        obj                  1   c4                   1
+    x8        obj                 -1   c4                   1
+    x9        obj                  1   c5                   1
+    x10       obj                 -1   c5                   1
+    x11       obj                  1   c6                   1
+    x12       obj                 -1   c6                   1
+    x13       obj                  1   c7                   1
+    x14       obj                 -1   c7                   1
+    MARK0000  'MARKER'                 'INTORG'
+    x15       c1                  74   c2                  20
+    x15       c3                  85   c4                  13
+    x15       c5                  35   c6                  86
+    x15       c7                  41
+    x16       c1                  49   c2                   7
+    x16       c3                  47   c4                  71
+    x16       c5                  61   c6                   8
+    x16       c7                  64
+    x17       c1                  12   c2                  68
+    x17       c3                  67   c4                  78
+    x17       c5                  66   c6                  44
+    x17       c7                  82
+    x18       c1                  93   c2                  69
+    x18       c3                  59   c4                  84
+    x18       c5                  78   c6                  96
+    x18       c7                  24
+    x19       c1                  56   c2                  95
+    x19       c3                  84   c4                  56
+    x19       c5                  46   c6                  64
+    x19       c7                  48
+    x20       c1                  16   c2                  64
+    x20       c3                  59   c4                  66
+    x20       c5                  89   c6                  65
+    x20       c7                  41
+    x21       c1                  39   c2                  76
+    x21       c3                  19   c4                   8
+    x21       c5                  61   c6                  68
+    x21       c7                  29
+    x22       c1                  77   c2                  12
+    x22       c3                   8   c4                  68
+    x22       c5                  25   c6                  53
+    x22       c7                  93
+    x23       c1                  56   c2                  45
+    x23       c3                  50   c4                  48
+    x23       c5                  55   c6                  19
+    x23       c7                  64
+    x24       c1                  73   c2                  43
+    x24       c3                  66   c4                  28
+    x24       c5                  16   c6                  33
+    x24       c7                  39
+    x25       c1                   1   c2                  83
+    x25       c3                   5   c4                  33
+    x25       c5                  81   c6                  28
+    x25       c7                  92
+    x26       c1                   3   c2                  15
+    x26       c3                  51   c4                  34
+    x26       c5                  35   c6                  42
+    x26       c7                  86
+    x27       c1                  68   c2                  90
+    x27       c3                  51   c4                   8
+    x27       c5                  96   c6                  72
+    x27       c7                  64
+    x28       c1                  61   c2                  10
+    x28       c3                  64   c4                  99
+    x28       c5                  23   c6                  39
+    x28       c7                  45
+    x29       c1                   8   c2                  96
+    x29       c3                  64   c4                  80
+    x29       c5                  83   c6                   5
+    x29       c7                  87
+    x30       c1                  55   c2                  98
+    x30       c3                  53   c4                  74
+    x30       c5                  39   c6                  77
+    x30       c7                  34
+    x31       c1                  18   c2                  53
+    x31       c3                  61   c4                   2
+    x31       c5                  14   c6                  37
+    x31       c7                  39
+    x32       c1                  21   c2                   1
+    x32       c3                  45   c4                  10
+    x32       c5                  53   c6                  89
+    x32       c7                  88
+    x33       c1                  57   c2                   2
+    x33       c3                   3   c4                  96
+    x33       c5                  23   c6                   7
+    x33       c7                  99
+    x34       c1                  98   c2                  58
+    x34       c3                  76   c4                  41
+    x34       c5                  23   c6                  78
+    x34       c7                  63
+    x35       c1                  58   c2                  24
+    x35       c3                  17   c4                  98
+    x35       c5                  93   c6                  10
+    x35       c7                  85
+    x36       c1                  57   c2                  90
+    x36       c3                  54   c4                  74
+    x36       c5                  38   c6                  78
+    x36       c7                  48
+    x37       c1                  46   c2                  29
+    x37       c3                  13   c4                  39
+    x37       c5                  15   c6                  10
+    x37       c7                  83
+    x38       c1                  72   c2                  57
+    x38       c3                  89   c4                  91
+    x38       c5                  20   c6                  96
+    x38       c7                  88
+    x39       c1                   6   c2                  19
+    x39       c3                  68   c4                  85
+    x39       c5                  19   c6                  55
+    x39       c7                  85
+    x40       c1                  16   c2                  73
+    x40       c3                  57   c4                  95
+    x40       c5                  28   c6                   1
+    x40       c7                   5
+    x41       c1                  76   c2                  89
+    x41       c3                   4   c4                  96
+    x41       c5                  79   c6                  64
+    x41       c7                  14
+    x42       c1                  21   c2                  31
+    x42       c3                  24   c4                   1
+    x42       c5                  51   c6                  61
+    x42       c7                  31
+    x43       c1                  78   c2                  12
+    x43       c3                  96   c4                  80
+    x43       c5                  24   c6                  63
+    x43       c7                  12
+    x44       c1                  18   c2                  34
+    x44       c3                  81   c4                  90
+    x44       c5                   6   c6                  90
+    x44       c7                  93
+    x45       c1                  11   c2                  67
+    x45       c3                  36   c4                  97
+    x45       c5                   3   c6                  22
+    x45       c7                  55
+    x46       c1                  58   c2                  48
+    x46       c3                  54   c4                  36
+    x46       c5                  47   c6                  78
+    x46       c7                   1
+    x47       c1                  59   c2                  11
+    x47       c3                   3   c4                   7
+    x47       c5                  61   c6                  92
+    x47       c7                   2
+    x48       c1                  25   c2                  22
+    x48       c3                  82   c4                  69
+    x48       c5                  60   c6                  25
+    x48       c7                  22
+    x49       c1                  32   c2                  36
+    x49       c3                  33   c4                   9
+    x49       c5                  71   c6                  24
+    x49       c7                  93
+    x50       c1                  14   c2                  78
+    x50       c3                  88   c4                   9
+    x50       c5                  63   c6                  65
+    x50       c7                  49
+    x51       c1                  16   c2                  75
+    x51       c3                   1   c4                  93
+    x51       c5                  26   c6                   6
+    x51       c7                  35
+    x52       c1                   3   c2                  52
+    x52       c3                  29   c4                  94
+    x52       c5                  66   c6                  68
+    x52       c7                  25
+    x53       c1                  60   c2                  95
+    x53       c3                   4   c4                  44
+    x53       c5                  71   c6                  66
+    x53       c7                  39
+    x54       c1                  12   c2                  57
+    x54       c3                  48   c4                  36
+    x54       c5                  63   c6                  66
+    x54       c7                   1
+    x55       c1                   7   c2                  62
+    x55       c3                  51   c4                  71
+    x55       c5                  56   c6                   1
+    x55       c7                  77
+    x56       c1                  42   c2                  94
+    x56       c3                  14   c4                  37
+    x56       c5                  32   c6                  67
+    x56       c7                  43
+    x57       c1                  98   c2                  10
+    x57       c3                  86   c4                  72
+    x57       c5                  39   c6                  78
+    x57       c7                   7
+    x58       c1                  34   c2                  42
+    x58       c3                  64   c4                  38
+    x58       c5                  31   c6                  21
+    x58       c7                  42
+    x59       c1                  33   c2                  89
+    x59       c3                  73   c4                  74
+    x59       c5                  64   c6                  47
+    x59       c7                  36
+    x60       c1                  16   c2                  11
+    x60       c3                  78   c4                  89
+    x60       c5                  89   c6                  17
+    x60       c7                  63
+    x61       c1                  97   c2                  77
+    x61       c3                  45   c4                  37
+    x61       c5                  62   c6                  89
+    x61       c7                   5
+    x62       c1                  63   c2                  85
+    x62       c3                  65   c4                  24
+    x62       c5                  68   c6                  77
+    x62       c7                   8
+    x63       c1                  66   c2                  30
+    x63       c3                  30   c4                  88
+    x63       c5                  59   c6                  88
+    x63       c7                  43
+    x64       c1                  28   c2                  82
+    x64       c3                  52   c4                  77
+    x64       c5                  71   c6                  54
+    x64       c7                  18
+    x65       c1                  57   c2                  20
+    x65       c3                   6   c4                  61
+    x65       c5                  48   c6                  10
+    x65       c7                  60
+    x66       c1                  19   c2                  52
+    x66       c3                  78   c4                  80
+    x66       c5                  76   c6                  87
+    x66       c7                  47
+    x67       c1                  74   c2                  78
+    x67       c3                   9   c4                   2
+    x67       c5                  96   c6                  88
+    x67       c7                  47
+    x68       c1                  44   c2                   6
+    x68       c3                  19   c4                  60
+    x68       c5                  74   c6                  80
+    x68       c7                  46
+    x69       c1                  45   c2                  57
+    x69       c3                  87   c4                  87
+    x69       c5                  61   c6                  76
+    x69       c7                  45
+    x70       c1                  49   c2                  65
+    x70       c3                  73   c4                  80
+    x70       c5                  21   c6                   9
+    x70       c7                  38
+    x71       c1                  76   c2                  79
+    x71       c3                  10   c4                  74
+    x71       c5                  46   c6                  83
+    x71       c7                   9
+    x72       c1                  74   c2                  83
+    x72       c3                  87   c4                  42
+    x72       c5                  18   c6                  95
+    x72       c7                  37
+    x73       c1                   9   c2                  16
+    x73       c3                  33   c4                   2
+    x73       c5                  23   c6                  86
+    x73       c7                   8
+    x74       c1                  44   c2                  67
+    x74       c3                   1   c4                  37
+    x74       c5                  24   c6                  24
+    x74       c7                  82
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c1                1324   c2                1554
+    rhs       c3                1429   c4                1686
+    rhs       c5                1482   c6                1613
+    rhs       c7                1424
+BOUNDS
+ FX bnd       x2                   0
+ FX bnd       x4                   0
+ FX bnd       x6                   0
+ FX bnd       x8                   0
+ FX bnd       x10                  0
+ FX bnd       x12                  0
+ FX bnd       x14                  0
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mas74.mps b/demos/ppl_lpsol/examples/mas74.mps
new file mode 100644
index 0000000..c5ed04a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mas74.mps
@@ -0,0 +1,1131 @@
+NAME           mas74
+ROWS
+ N  obj     
+ L  c1      
+ G  c2      
+ G  c3      
+ G  c4      
+ G  c5      
+ G  c6      
+ G  c7      
+ G  c8      
+ G  c9      
+ G  c10     
+ G  c11     
+ G  c12     
+ G  c13     
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        obj               1E-5   c1                   1
+    x1        c2        3857.5340376   c3                4264
+    x1        c4                4264   c5                4264
+    x1        c6                4264   c7                4264
+    x1        c8                4264   c9                4264
+    x1        c10               4264   c11               4264
+    x1        c12       1530.2702703   c13               4264
+    x2        obj               1E-5   c1                   1
+    x2        c2        125.76760563   c3                5339
+    x2        c4                5339   c5        5026.3323601
+    x2        c6                5339   c7                5339
+    x2        c8        3236.6488464   c9                5339
+    x2        c10               5339   c11               5339
+    x2        c13               5339
+    x3        obj               1E-5   c1                   1
+    x3        c2        7165.7769953   c3              7227.5
+    x3        c4        5876.7923949   c5        4212.5800487
+    x3        c7                3489   c8                8260
+    x3        c9                8260   c11               4540
+    x3        c13               8260
+    x4        obj               1E-5   c1                   1
+    x4        c2                2876   c3                2876
+    x4        c4                2876   c5                2876
+    x4        c6                2876   c7                2876
+    x4        c8                2876   c9                2876
+    x4        c10               2876   c11               2876
+    x4        c12               2876   c13               2876
+    x5        obj               1E-5   c1                   1
+    x5        c2                9723   c4                9723
+    x5        c6                9723   c9        6324.0237443
+    x5        c10       5706.6236192   c11       6007.4739286
+    x5        c12       6622.5405405   c13        7071.525641
+    x6        obj               1E-5   c1                   1
+    x6        c2                7310   c3                7310
+    x6        c4                7310   c7                7310
+    x6        c8                6884   c9                7310
+    x6        c11               7310   c13               7310
+    x7        obj               1E-5   c1                   1
+    x7        c2                1529   c3                1529
+    x7        c4                1529   c5                1529
+    x7        c6                1529   c7                1529
+    x7        c8                1529   c9                1529
+    x7        c10               1529   c11               1529
+    x7        c12               1529   c13               1529
+    x8        obj               1E-5   c1                   1
+    x8        c2                1585   c3                1585
+    x8        c4                1585   c5                1585
+    x8        c6                1585   c7                1585
+    x8        c8                1585   c9                1585
+    x8        c10               1585   c11               1585
+    x8        c12               1585   c13               1585
+    x9        obj               1E-5   c1                   1
+    x9        c2                2949   c3                2949
+    x9        c4                2949   c5                2949
+    x9        c6                2949   c7                2949
+    x9        c8                2949   c9                2949
+    x9        c10               2949   c11               2949
+    x9        c12               2949   c13               2949
+    x10       obj               1E-5   c1                   1
+    x10       c2                7097   c3        5404.8448466
+    x10       c4                7097   c5                7097
+    x10       c7        5864.7752809   c10               7097
+    x10       c12       2091.1486486   c13               1239
+    x11       obj               1E-5   c1                   1
+    x11       c2                1239   c3                1239
+    x11       c4                1239   c5                1239
+    x11       c6                1239   c7                1239
+    x11       c8                1239   c9                1239
+    x11       c10               1239   c11               1239
+    x11       c12               1239   c13               1239
+    x12       obj               1E-5   c1                   1
+    x12       c2                6449   c3        8128.2443156
+    x12       c4        3263.9478854   c5                6449
+    x12       c6                2475   c7        9321.7752809
+    x12       c9        2669.5520548   c11       5164.8090243
+    x12       c12               5210   c13       1431.2820513
+    x13       obj               1E-5   c1                   1
+    x13       c2          4596.07277   c3        2473.8400699
+    x13       c4        4787.9998652   c5        1673.7990268
+    x13       c6        6817.4161987   c7        7919.9662921
+    x13       c8        5586.9236606   c9                3224
+    x13       c10        3270.405833   c11       1287.8998662
+    x13       c12       2116.7297297   c13               4388
+    x14       obj               1E-5   c1                   1
+    x14       c2                8037   c3                8037
+    x14       c5                8037   c7                8037
+    x14       c9                8037   c10               8037
+    x14       c12               8037
+    x15       obj               1E-5   c1                   1
+    x15       c2                7123   c3                7123
+    x15       c4        3932.0774689   c5                7123
+    x15       c6                7123   c8                7123
+    x15       c13               7123
+    x16       obj               1E-5   c1                   1
+    x16       c2                8067   c4                4508
+    x16       c5        4902.0158151   c6                3754
+    x16       c7                2923   c8        2980.0315887
+    x16       c9         721.8803653   c10       6814.5238232
+    x16       c11        6755.136625   c12       421.86486486
+    x16       c13       3091.3205128
+    x17       obj               1E-5   c1                   1
+    x17       c2                5704   c3                5704
+    x17       c4        5383.2865918   c5        2299.7472019
+    x17       c6                5704   c7                5704
+    x17       c8                4171   c9                5704
+    x17       c10               5704   c11               5704
+    x17       c12               5704   c13               5704
+    x18       obj               1E-5   c1                   1
+    x18       c2                1582   c3                1582
+    x18       c4        1007.7206724   c5                1582
+    x18       c6                1582   c7                1582
+    x18       c8                1582   c9                1582
+    x18       c10               1582   c11               1582
+    x18       c12               1582   c13       1144.5384615
+    x19       obj               1E-5   c1                   1
+    x19       c2                8713   c4                8713
+    x19       c5                8713   c7        8171.3932584
+    x19       c9                8713   c10               8713
+    x19       c13               8713
+    x20       obj               1E-5   c1                   1
+    x20       c2                9232   c4                9232
+    x20       c6                9232   c7                9232
+    x20       c9                9232   c10               9232
+    x20       c11               9232
+    x21       obj               1E-5   c1                   1
+    x21       c2                3371   c3                4035
+    x21       c4        3733.6777996   c5                4035
+    x21       c6                4035   c7                4600
+    x21       c8                3371   c9                3371
+    x21       c10               4600   c11               4600
+    x21       c12               4035   c13       2933.5384615
+    x22       obj               1E-5   c1                   1
+    x22       c2                2637   c3                2637
+    x22       c4                2637   c5                2637
+    x22       c6                2637   c7                2637
+    x22       c8                2637   c9                2637
+    x22       c10               2637   c11               2637
+    x22       c12               2637   c13               2637
+    x23       obj               1E-5   c1                   1
+    x23       c2                7131   c3         2505.925667
+    x23       c4        2622.9478854   c5                7131
+    x23       c6                7131   c7        3525.6966292
+    x23       c8                7131   c9        7048.9675799
+    x23       c10               7131   c11       5166.9799255
+    x23       c12               1313   c13       1662.1153846
+    x24       obj               1E-5   c1                   1
+    x24       c2         418.3028169   c3                9861
+    x24       c4        5572.0948907   c5         2435.796837
+    x24       c6        5429.5829374   c8        922.29134407
+    x24       c9        5007.8803653   c10       4652.0215414
+    x24       c11       1899.2210109
+    x25       obj               1E-5   c1                   1
+    x25       c2                3647   c3                3647
+    x25       c4                3647   c5                3647
+    x25       c6                3647   c7                3647
+    x25       c8                3647   c9                3647
+    x25       c10               3647   c11               3647
+    x25       c12               3647   c13               3647
+    x26       obj               1E-5   c1                   1
+    x26       c2        5688.4859155   c3        5478.2871361
+    x26       c4                8494   c5        1160.0158151
+    x26       c6                7496   c8        805.25526479
+    x26       c9        2201.1196347   c10       3891.5238232
+    x26       c11        3013.136625   c12       421.86486486
+    x26       c13       2501.1474359
+    x27       obj               1E-5   c1                   1
+    x27       c2        7832.5997653   c3        5665.9031945
+    x27       c4        1590.9888423   c5        1850.9749392
+    x27       c6               583.5   c7        4272.9662921
+    x27       c8        2660.5892304   c9         1631.030137
+    x27       c10       5039.7045485   c11       5571.6006929
+    x27       c12       2940.1756757   c13       1070.4038462
+    x28       obj               1E-5   c1                   1
+    x28       c2        4409.1255869   c3                5880
+    x28       c4                5880   c5                5880
+    x28       c6              5162.5   c7                5880
+    x28       c8                5880   c9                5880
+    x28       c13       5649.4038462
+    x29       obj               1E-5   c1                   1
+    x29       c2                1053   c3                1053
+    x29       c4                1053   c5                1053
+    x29       c6                1053   c7                1053
+    x29       c8                1053   c9                1053
+    x29       c10               1053   c11               1053
+    x29       c12               1053   c13               1053
+    x30       obj               1E-5   c1                   1
+    x30       c2                2869   c3                2869
+    x30       c4                2869   c5        1573.9406326
+    x30       c6        449.31447084   c7                2869
+    x30       c8                2869   c9        204.02305936
+    x30       c10               2869   c11               2869
+    x30       c12               1053
+    x31       obj               1E-5   c1                   1
+    x31       c2                5410   c3                5410
+    x31       c4                5410   c5                5410
+    x31       c6        3240.6855292   c7                5410
+    x31       c8                5410   c9          2678.01621
+    x31       c10               5410   c12               5287
+    x31       c13       2480.7179487
+    x32       obj               1E-5   c1                   1
+    x32       c2                3948   c3                3948
+    x32       c4                3948   c5                3948
+    x32       c6                3948   c7                3948
+    x32       c8                3948   c9                3948
+    x32       c10               3948   c11               3948
+    x32       c12               3948   c13               3948
+    x33       obj               1E-5   c1                   1
+    x33       c2                6049   c3                6049
+    x33       c4                6049   c5                6049
+    x33       c6                6049   c9                6049
+    x33       c10               6049   c11               6049
+    x34       obj               1E-5   c1                   1
+    x34       c2                9317   c5                9317
+    x34       c6                9317   c7                9317
+    x34       c8                9317   c9                9317
+    x34       c12       5488.7162162   c13                888
+    x35       obj               1E-5   c1                   1
+    x35       c2                6880   c3                6880
+    x35       c4        1928.2865918   c5                6880
+    x35       c6                1950   c7        2311.7191011
+    x35       c8        1762.3431016   c9        4388.8803653
+    x35       c10               6880   c11       3103.6850787
+    x35       c12       4446.6621622
+    x36       obj               1E-5   c1                   1
+    x36       c2                3779   c3                3779
+    x36       c4                3779   c5                3779
+    x36       c6                3779   c7                3779
+    x36       c8                3779   c9                3779
+    x36       c10               3779   c11               3779
+    x36       c12               3779   c13               3779
+    x37       obj               1E-5   c1                   1
+    x37       c2                3641   c3                3641
+    x37       c4                3641   c5                3641
+    x37       c6                3641   c7                3641
+    x37       c8                3641   c9                3641
+    x37       c10               3641   c11               3641
+    x37       c12               3641   c13               3641
+    x38       obj               1E-5   c1                   1
+    x38       c2                5567   c3                5567
+    x38       c4                5567   c5                5567
+    x38       c6                5567   c7                5567
+    x38       c8                5567   c10       1477.4963355
+    x38       c11               5567   c12       4894.9189189
+    x38       c13               5567
+    x39       obj               1E-5   c1                   1
+    x39       c2                2197   c3                2197
+    x39       c4                2197   c5                2197
+    x39       c6                2197   c7                2197
+    x39       c8                2197   c9                2197
+    x39       c10               2197   c11               2197
+    x39       c12               2197   c13               2197
+    x40       obj               1E-5   c1                   1
+    x40       c2                2842   c3        1164.8704111
+    x40       c4                2842   c5                2842
+    x40       c6                2842   c7                2842
+    x40       c8                2842   c9                2842
+    x40       c10               2842   c11               2842
+    x40       c12       2103.3243243   c13               2842
+    x41       obj               1E-5   c1                   1
+    x41       c2                4846   c3                4846
+    x41       c4                4846   c5                4846
+    x41       c6                4846   c7                4846
+    x41       c8                4846   c9                4846
+    x41       c10               4846   c11               4846
+    x41       c12               4846   c13               4846
+    x42       obj               1E-5   c1                   1
+    x42       c2                4616   c3        139.72342842
+    x42       c4                4616   c5                4616
+    x42       c6                4616   c7                4616
+    x42       c8                4616   c9                4616
+    x42       c10               4616   c11               4616
+    x42       c12               4616   c13       2765.2179487
+    x43       obj               1E-5   c1                   1
+    x43       c2                8807   c4                8807
+    x43       c6                8807   c7                8807
+    x43       c8                8807   c10               8807
+    x43       c11               8807   c12               8807
+    x44       obj               1E-5   c1                   1
+    x44       c2                3261   c3                3261
+    x44       c4                3261   c5                3261
+    x44       c6                3261   c7                3261
+    x44       c8                3261   c9                3261
+    x44       c10               3261   c11               3261
+    x44       c12               3261   c13               3261
+    x45       obj               1E-5   c1                   1
+    x45       c2                3553   c3                3553
+    x45       c4                3553   c5                3553
+    x45       c6                3553   c7                3553
+    x45       c8                3553   c9                3553
+    x45       c10               3553   c11               3553
+    x45       c12               3553   c13               3553
+    x46       obj               1E-5   c1                   1
+    x46       c2                5239   c3                5239
+    x46       c4                5239   c5                2665
+    x46       c6                5239   c7                5239
+    x46       c8        3338.1665376   c9                5239
+    x46       c10               5239   c11               5239
+    x46       c12               2665   c13               2665
+    x47       obj               1E-5   c1                   1
+    x47       c2                6665   c3                6665
+    x47       c4                6665   c5                6665
+    x47       c6                6665   c11               6665
+    x48       obj               1E-5   c1                   1
+    x48       c2        3257.4906103   c3        1655.7848997
+    x48       c4                8172   c5        4492.4068127
+    x48       c6                8172   c7        5877.6685393
+    x48       c8        2589.3009446   c9                8172
+    x48       c10               8172   c11               8172
+    x48       c12       1009.4459459
+    x49       obj               1E-5   c1                   1
+    x49       c2         7219.556338   c3        1655.7848997
+    x49       c4        5587.4533223   c5        4492.4068127
+    x49       c6                8425   c7        4262.3764045
+    x49       c8        2589.3009446   c9                8425
+    x49       c10               8425   c11       3203.5967077
+    x49       c12       1009.4459459
+    x50       obj               1E-5   c1                   1
+    x50       c2                2536   c3                2536
+    x50       c4                2536   c5                2536
+    x50       c6                2536   c7                2536
+    x50       c8                2536   c9                2536
+    x50       c10               2536   c11               2536
+    x50       c12               2536   c13               2536
+    x51       obj               1E-5   c1                   1
+    x51       c2                8013   c3                8013
+    x51       c5        3924.9124088   c6        4869.6696544
+    x51       c7         7090.005618   c8                6077
+    x51       c9        1351.1242009   c10               8013
+    x51       c12       2956.6621622   c13               2768
+    x52       obj               1E-5   c1                   1
+    x52       c2                3541   c3                3541
+    x52       c4        509.74314193   c5                3541
+    x52       c6                3541   c7         1074.011236
+    x52       c8                3541   c9                3541
+    x52       c10               3541   c12       420.66216216
+    x52       c13               3541
+    x53       obj               1E-5   c1                   1
+    x53       c2                8080   c3                8080
+    x53       c5        3336.9664234   c6                8080
+    x53       c7                8080   c10               8080
+    x53       c11               8080   c13               8080
+    x54       obj               1E-5   c1                   1
+    x54       c2        5593.0586854   c3        2778.8438922
+    x54       c4        5130.4842654   c5        509.94136253
+    x54       c6        5337.9205184   c7        2240.3595506
+    x54       c8        257.07955249   c9                6767
+    x54       c10        2672.975731   c11               6767
+    x54       c13       759.60897436
+    x55       obj               1E-5   c1                   1
+    x55       c2                5036   c3                5036
+    x55       c4                5036   c5                5036
+    x55       c6                5036   c7                5036
+    x55       c8                5036   c9                5036
+    x55       c10               5036   c11               5036
+    x55       c12               5036   c13               5036
+    x56       obj               1E-5   c1                   1
+    x56       c2                1782   c3                1782
+    x56       c4                1782   c5                1782
+    x56       c6                1782   c7                1782
+    x56       c8                1782   c9                1782
+    x56       c10               1782   c11               1782
+    x56       c12               1782   c13               1782
+    x57       obj               1E-5   c1                   1
+    x57       c2                3895   c3        1724.2205458
+    x57       c4        476.85677148   c5        2066.1187348
+    x57       c6                3895   c7                3895
+    x57       c8                3895   c9                3895
+    x57       c10               3895   c11               3895
+    x57       c12               3895   c13               3895
+    x58       obj               1E-5   c1                   1
+    x58       c2                4205   c4                4205
+    x58       c5                4205   c6                4205
+    x58       c7                4205   c8                4205
+    x58       c9                4205   c10               4205
+    x58       c11               4205   c12               4205
+    x58       c13               4205
+    x59       obj               1E-5   c1                   1
+    x59       c2                7772   c3                7772
+    x59       c5                7772   c7        7106.3258427
+    x59       c8                7772   c10       2726.2276162
+    x59       c11               7772   c12               7772
+    x60       obj               1E-5   c1                   1
+    x60       c2                9326   c5        8367.2374696
+    x60       c6              5256.5   c7                7383
+    x60       c8        6619.0778105   c9        6075.1340183
+    x60       c10       3171.9293238   c11       4961.8312283
+    x60       c12       5919.7837838   c13               9326
+    x61       obj               1E-5   c1                   1
+    x61       c2                4757   c3                4757
+    x61       c4        2026.2568581   c5                4757
+    x61       c6        2104.6903888   c7         3561.488764
+    x61       c9        88.128310502   c10               4757
+    x61       c11               2536   c13       1576.5448718
+    x62       obj               1E-5   c1                   1
+    x62       c2                5355   c4                5355
+    x62       c5        2978.6437956   c7        2033.3258427
+    x62       c8                5355   c9                5355
+    x62       c10               5355   c11               5355
+    x62       c12               5355   c13               5355
+    x63       obj               1E-5   c1                   1
+    x63       c2                1919   c3                1919
+    x63       c4                1919   c5                1919
+    x63       c6                1919   c7                1919
+    x63       c8                1919   c9                1919
+    x63       c10               1919   c11               1919
+    x63       c12               1919   c13               1919
+    x64       obj               1E-5   c1                   1
+    x64       c2        7510.5774648   c3         8722.393681
+    x64       c4        3652.6973102   c6        4473.0773218
+    x64       c7        6121.0505618   c8                9948
+    x64       c10       4389.7373933   c11       5846.2742077
+    x64       c12       6017.0810811
+    x65       obj               1E-5   c1                   1
+    x65       c2                7341   c3                7341
+    x65       c5                7341   c6                7341
+    x65       c8                7341   c11               7341
+    x65       c12       5188.3918919   c13       2995.1025641
+    x66       obj               1E-5   c1                   1
+    x66       c2                8541   c4                8541
+    x66       c5                4655   c6                4655
+    x66       c7                8541   c8        6962.5370084
+    x66       c11       7926.8090243   c12       7281.4594595
+    x66       c13               8541
+    x67       obj               1E-5   c1                   1
+    x67       c2                8352   c4                8352
+    x67       c5                8352   c6                8352
+    x67       c9                8352   c11               8352
+    x67       c12       2160.4594595   c13               8352
+    x68       obj               1E-5   c1                   1
+    x68       c2                3291   c3                3291
+    x68       c4                3291   c5                3291
+    x68       c6                3291   c7                3291
+    x68       c8                3291   c9                3291
+    x68       c10               3291   c11               3291
+    x68       c12               3291   c13               3291
+    x69       obj               1E-5   c1                   1
+    x69       c2                7328   c3                7328
+    x69       c5                7328   c6                7328
+    x69       c8                7328   c11               7328
+    x69       c12       6739.2972973
+    x70       obj               1E-5   c1                   1
+    x70       c2                4506   c3                4506
+    x70       c4                4506   c5                4506
+    x70       c6                4506   c7                4429
+    x70       c8                4506   c9                4506
+    x70       c10               4506   c11               4506
+    x70       c12               4429   c13               4506
+    x71       obj               1E-5   c1                   1
+    x71       c2                4429   c3                4429
+    x71       c4                4429   c5                4429
+    x71       c6                4429   c7                4429
+    x71       c8                4429   c9                4429
+    x71       c10               4429   c11               4429
+    x71       c12               4429   c13               4429
+    x72       obj               1E-5   c1                   1
+    x72       c2                4593   c3                4593
+    x72       c4                4593   c5        896.82189781
+    x72       c6                4593   c7        4081.3146067
+    x72       c8                4593   c9                4593
+    x72       c10               4593   c11               4593
+    x72       c12               4593   c13               4593
+    x73       obj               1E-5   c1                   1
+    x73       c2                9138   c4        6903.6330621
+    x73       c5         2486.593674   c6                9138
+    x73       c7        4272.9662921   c8                9138
+    x73       c10       4769.9270193   c11       2864.5421929
+    x73       c13               9138
+    x74       obj               1E-5   c1                   1
+    x74       c2        3731.7664319   c3        4857.7089899
+    x74       c4        4972.5996947   c5        7925.6586375
+    x74       c6        5052.5596112   c7        7999.5842697
+    x74       c8        940.48633478   c9        1881.3954338
+    x74       c10        560.5962977   c11        3452.764849
+    x74       c12       1530.2702703   c13       7740.9358974
+    x75       obj               1E-5   c1                   1
+    x75       c2        5124.2922535   c3                7404
+    x75       c4        4006.8453527   c5        1794.7394161
+    x75       c6        1174.3740821   c7        5324.3033708
+    x75       c8        6731.8123645   c9        4723.3954338
+    x75       c10       3402.5962977   c11       4126.5871636
+    x75       c12       4615.3378378   c13               7404
+    x76       obj               1E-5   c1                   1
+    x76       c2                4378   c3                4378
+    x76       c4                4378   c5                4378
+    x76       c6                4378   c7                4378
+    x76       c8         2220.491406   c9                4378
+    x76       c10               4378   c11               4378
+    x76       c12       1530.2702703   c13               4378
+    x77       obj               1E-5   c1                   1
+    x77       c2                3647   c3                3647
+    x77       c4                3647   c5                3647
+    x77       c6                3647   c7                3647
+    x77       c8                3647   c9                3647
+    x77       c10               3647   c11               3647
+    x77       c12               3647   c13               3647
+    x78       obj               1E-5   c1                   1
+    x78       c2                3795   c3                3795
+    x78       c4                3795   c5        1205.9406326
+    x78       c6                3795   c7                3795
+    x78       c8                3795   c9                3795
+    x78       c10               3795   c11               3795
+    x78       c12               3795   c13               3795
+    x79       obj               1E-5   c1                   1
+    x79       c2                2912   c3                2912
+    x79       c4                2912   c5        1205.9406326
+    x79       c6                2912   c7        2559.6067416
+    x79       c8                2912   c9                2912
+    x79       c10               2912   c11               2912
+    x79       c12               2912   c13               2912
+    x80       obj               1E-5   c1                   1
+    x80       c2                8830   c3        7601.2456701
+    x80       c6                8830   c7        2550.0224719
+    x80       c8                6707   c9                8830
+    x80       c10               8830   c12               8830
+    x80       c13       390.93589744
+    x81       obj               1E-5   c1                   1
+    x81       c2                5445   c3                5445
+    x81       c4                5445   c5                5445
+    x81       c6                5445   c7         5008.247191
+    x81       c8                5445   c9                5445
+    x81       c11               5445   c13               5445
+    x82       obj               1E-5   c1                   1
+    x83       obj               1E-5   c1                   1
+    x83       c2                6112   c3                6112
+    x83       c4                6112   c5                6112
+    x83       c6                6112   c9                6112
+    x83       c10               6112   c12               6112
+    x84       obj               1E-5   c1                   1
+    x84       c2                8841   c4                8841
+    x84       c5                8841   c8                8841
+    x84       c10               8841   c13               8841
+    x85       obj               1E-5   c1                   1
+    x85       c2                1236   c3                1236
+    x85       c4                1236   c5                1236
+    x85       c6                1236   c7                1236
+    x85       c8                1236   c9                1236
+    x85       c10               1236   c11               1236
+    x85       c12               1236   c13               1236
+    x86       obj               1E-5   c1                   1
+    x86       c2                7010   c3                7010
+    x86       c4                7010   c7                7010
+    x86       c8                2909   c9                7010
+    x86       c10               7010   c11               7010
+    x86       c12               1324   c13               7010
+    x87       obj               1E-5   c1                   1
+    x87       c2                2909   c3                2909
+    x87       c4        1599.0521146   c5                2909
+    x87       c6                2909   c7                2909
+    x87       c8                2909   c9                2909
+    x87       c10               2909   c11               2909
+    x87       c12               2909   c13               2909
+    x88       obj               1E-5   c1                   1
+    x88       c2                7622   c3        5342.1452962
+    x88       c4                7622   c5                7622
+    x88       c9                7622   c10               7622
+    x88       c11               7622
+    x89       obj               1E-5   c1                   1
+    x89       c2                7393   c3                7393
+    x89       c5                7393   c6                7393
+    x89       c9                7393   c10               7393
+    x89       c12               7393   c13               7393
+    x90       obj               1E-5   c1                   1
+    x90       c2        8317.6971831   c3        6883.3314132
+    x90       c5                8830   c7        4261.7191011
+    x90       c8        2953.3115129   c9        6338.8803653
+    x90       c10       4727.2211862   c11       5053.6850787
+    x90       c12       6396.6621622
+    x91       obj               1E-5   c1                   1
+    x91       c2                1950   c3                1950
+    x91       c4                1950   c5                1950
+    x91       c6                1950   c7                1950
+    x91       c8                1950   c9                1950
+    x91       c10               1950   c11               1950
+    x91       c12               1950
+    x92       obj               1E-5   c1                   1
+    x92       c2                4654   c3                4654
+    x92       c4                4654   c5                4654
+    x92       c6                4654   c7                4654
+    x92       c8                4654   c9                4654
+    x92       c10               4654   c11               1188
+    x92       c12               4654   c13               4654
+    x93       obj               1E-5   c1                   1
+    x93       c2                2255   c3                2255
+    x93       c4                2255   c5                2255
+    x93       c6                2255   c7        117.03370787
+    x93       c8                2255   c9                2255
+    x93       c10               2255   c11               2255
+    x93       c12               2255   c13               2255
+    x94       obj               1E-5   c1                   1
+    x94       c2                7104   c3                7104
+    x94       c4                7104   c7                7104
+    x94       c8                7104   c9                7104
+    x94       c10       6114.1385266   c11               7104
+    x94       c12               7104
+    x95       obj               1E-5   c1                   1
+    x95       c2        7534.7887324   c3        7435.0469687
+    x95       c4                7744   c7        3406.2808989
+    x95       c8                7744   c9                7744
+    x95       c11               7744   c12       3202.5945946
+    x95       c13               7744
+    x96       obj               1E-5   c1                   1
+    x96       c2                2054   c3                2054
+    x96       c4                2054   c5                2054
+    x96       c6                2054   c7                2054
+    x96       c8                2054   c9                2054
+    x96       c10               2054   c11               2054
+    x96       c12               2054   c13               2054
+    x97       obj               1E-5   c1                   1
+    x97       c2                6682   c3                6682
+    x97       c4                6682   c5                6682
+    x97       c8        1726.1613116   c9                6682
+    x97       c11               6682   c12       4613.5135135
+    x97       c13       1696.5128205
+    x98       obj               1E-5   c1                   1
+    x98       c2                3234   c3                3234
+    x98       c4                3234   c5                3234
+    x98       c6                3234   c7                3234
+    x98       c8                3234   c9                3234
+    x98       c10               3234   c11               3234
+    x98       c12               3234   c13               3234
+    x99       obj               1E-5   c1                   1
+    x99       c2                2842   c3        1164.8704111
+    x99       c4                2842   c5                2842
+    x99       c6                2842   c7        2675.2808989
+    x99       c8                2842   c9                2842
+    x99       c10               2842   c11               2842
+    x99       c12       2103.3243243   c13               2842
+    x100      obj               1E-5   c1                   1
+    x100      c2                3974   c3                3974
+    x100      c4                3974   c5                3974
+    x100      c6                3974   c7                3974
+    x100      c8                3974   c9                3974
+    x100      c10               3974   c11               3974
+    x100      c12               3974   c13       2670.2820513
+    x101      obj               1E-5   c1                   1
+    x101      c2                3624   c3                3624
+    x101      c4                3624   c5                3624
+    x101      c6                3624   c7                3624
+    x101      c8                3624   c9                3624
+    x101      c10               3624   c11               3624
+    x101      c12               3624   c13               3624
+    x102      obj               1E-5   c1                   1
+    x102      c2                5415   c3                5415
+    x102      c4                5415   c5                5415
+    x102      c6                5415   c7                5415
+    x102      c8                5415   c9                5415
+    x102      c10               5415
+    x103      obj               1E-5   c1                   1
+    x103      c2                2246   c3                1582
+    x103      c4                2246   c5                1582
+    x103      c6                2246   c7                2246
+    x103      c8                2246   c9                2246
+    x103      c10       1807.7609822   c11               2246
+    x103      c12               1582   c13               2246
+    x104      obj               1E-5   c1                   1
+    x104      c2                8590   c4                8590
+    x104      c5                8590   c7                8590
+    x104      c8                8590   c11       5312.3064276
+    x104      c12       5392.9324324
+    x105      obj               1E-5   c1                   1
+    x105      c2                2633   c3                2633
+    x105      c4                2633   c5                2633
+    x105      c6                2633   c7        40.747191011
+    x105      c8                2633   c9                2633
+    x105      c10               2633   c11               2633
+    x105      c12       732.93243243   c13               2633
+    x106      obj               1E-5   c1                   1
+    x106      c2                4655   c3                4655
+    x106      c4                4655   c5                4655
+    x106      c6                4655   c7                4655
+    x106      c8                4655   c9                4655
+    x106      c10               4655   c11               4655
+    x106      c12       418.45945946   c13                691
+    x107      obj               1E-5   c1                   1
+    x107      c2                2923   c3                2923
+    x107      c4                2923   c5                2923
+    x107      c6                2923   c7                2923
+    x107      c8                2923   c9                2923
+    x107      c10               2923   c11               2923
+    x107      c12               2923   c13               2923
+    x108      obj               1E-5   c1                   1
+    x108      c2                6318   c3                6318
+    x108      c5                6318   c6                6318
+    x108      c7        4285.6853933   c8                6318
+    x108      c9                6318   c10               6318
+    x108      c11               6318   c13               6318
+    x109      obj               1E-5   c1                   1
+    x109      c2                7440   c3                7440
+    x109      c4         5080.614002   c6                1739
+    x109      c7         6319.247191   c8                7440
+    x109      c9        3677.0954338   c10               7440
+    x109      c13       1402.1282051
+    x110      obj               1E-5   c1                   1
+    x110      c2                4579   c3                4579
+    x110      c4                4579   c5                4579
+    x110      c6                4579   c7                4579
+    x110      c8                4579   c9        1172.1497717
+    x110      c10       3472.3863166   c11               4579
+    x110      c12               4579   c13               4579
+    x111      obj               1E-5   c1                   1
+    x111      c2                8342   c3                8342
+    x111      c6                8342   c7                8342
+    x111      c9                8342   c11               8342
+    x111      c12               8342   c13               3445
+    x112      obj               1E-5   c1                   1
+    x112      c2        3813.4002347   c3                5050
+    x112      c4        4677.0111577   c5        81.974939173
+    x112      c6                1239   c7        3764.0337079
+    x112      c8        2660.5892304   c9        2180.2694064
+    x112      c10       3270.7045485   c11               5050
+    x112      c12               1102   c13       3648.6794872
+    x113      obj               1E-5   c1                   1
+    x113      c2                6268   c3                6268
+    x113      c4                6268   c5                6268
+    x113      c6              1822.5   c9                6268
+    x113      c10               6268   c11       4575.3149213
+    x113      c12               6268   c13       4719.0833333
+    x114      obj               1E-5   c1                   1
+    x114      c2                8570   c3                8570
+    x114      c6                8570   c8                8570
+    x114      c9        6425.2703196   c10               8570
+    x114      c11               7133
+    x115      obj               1E-5   c1                   1
+    x115      c2                9838   c5         6831.392944
+    x115      c6                9838   c7        5613.6853933
+    x115      c8                9838   c9        4293.1287671
+    x115      c10               9838   c11               5180
+    x115      c13       2068.8974359
+    x116      obj               1E-5   c1                   1
+    x116      c2                4876   c3                4876
+    x116      c4         2157.614002   c5                4876
+    x116      c6                4876   c7                4876
+    x116      c8                4876   c9                4876
+    x116      c10       4624.3962297   c11               4876
+    x116      c13        1920.724359
+    x117      obj               1E-5   c1                   1
+    x117      c2         418.3028169   c3                9861
+    x117      c4        5572.0948907   c5         2435.796837
+    x117      c6        5429.5829374   c8        922.29134407
+    x117      c9        5007.8803653   c10       4652.0215414
+    x117      c11       1899.2210109
+    x118      obj               1E-5   c1                   1
+    x118      c2                4922   c3                4922
+    x118      c4                4922   c5                4922
+    x118      c6                4922   c7                3647
+    x118      c8                4922   c9                4922
+    x118      c10       2886.5022818   c11               4922
+    x118      c12       3225.1351351   c13       1741.5064103
+    x119      obj               1E-5   c1                   1
+    x119      c2                3590   c3                3590
+    x119      c4                3590   c5                3590
+    x119      c6                3590   c7        625.96629213
+    x119      c8                3590   c9                3590
+    x119      c10               3590   c11       2057.4578071
+    x119      c12       1866.4459459   c13       899.94871795
+    x120      obj               1E-5   c1                   1
+    x120      c2                7152   c3                7152
+    x120      c4                7152   c6                7152
+    x120      c8                7152   c9                7152
+    x120      c12       3625.7162162   c13               7152
+    x121      obj               1E-5   c1                   1
+    x121      c2                7056   c3                7056
+    x121      c4                7056   c5                7056
+    x121      c10               7056   c11               7056
+    x121      c13       3555.5641026
+    x122      obj               1E-5   c1                   1
+    x122      c2                9136   c4                9136
+    x122      c5                9136   c8                9136
+    x122      c9                9136   c12               9136
+    x123      obj               1E-5   c1                   1
+    x123      c2                7850   c3                4655
+    x123      c4                7850   c7                7850
+    x123      c8        5952.0905079   c9                4655
+    x123      c10               4655   c11               7850
+    x123      c12               7850   c13               7850
+    x124      obj               1E-5   c1                   1
+    x124      c2                6863   c3                6863
+    x124      c4                6863   c6                6863
+    x124      c7                6863   c10               6863
+    x124      c12               6863   c13               6863
+    x125      obj               1E-5   c1                   1
+    x125      c2                9356   c4                9356
+    x125      c6                9356   c7                9356
+    x125      c9                9091   c11       5319.7567851
+    x125      c12               9356   c13       7943.6794872
+    x126      obj               1E-5   c1                   1
+    x126      c2                2933   c3                2933
+    x126      c4                2933   c5                2933
+    x126      c6                2933   c7                2933
+    x126      c8                2933   c9                2933
+    x126      c10               2933   c11               2933
+    x126      c12               2933   c13               2933
+    x127      obj               1E-5   c1                   1
+    x127      c2                2665   c3                2665
+    x127      c4                2665   c5                2665
+    x127      c6                2665   c7                2665
+    x127      c8                2665   c9                2665
+    x127      c10               2665   c11               2665
+    x127      c12               2665   c13               2665
+    x128      obj               1E-5   c1                   1
+    x128      c2                4063   c3                4063
+    x128      c4                4063   c5                4063
+    x128      c6                4063   c7                4063
+    x128      c8                4063   c9                4063
+    x128      c10               4063   c11               4063
+    x128      c12               4020   c13               4063
+    x129      obj               1E-5   c1                   1
+    x129      c2                7502   c3        4120.6364834
+    x129      c4                7502   c5                7502
+    x129      c7         5485.988764   c8        2002.5321694
+    x129      c10               7502   c11               7502
+    x129      c13       6355.8974359
+    x130      obj               1E-5   c1                   1
+    x130      c2                1966   c3                1966
+    x130      c4                1966   c5                1966
+    x130      c6                1966   c7                1966
+    x130      c8                1966   c9                1966
+    x130      c10               1966   c11               1966
+    x130      c12               1966   c13               1966
+    x131      obj               1E-5   c1                   1
+    x131      c2                4540   c3                4540
+    x131      c4                4540   c5                4540
+    x131      c6                4540   c7                4540
+    x131      c8                4540   c9                4540
+    x131      c10               4540   c11               4540
+    x131      c12               4540   c13               4540
+    x132      obj               1E-5   c1                   1
+    x132      c2                1370   c3                1370
+    x132      c4                1370   c5                1370
+    x132      c6                1370   c7                1370
+    x132      c8                1370   c9                1370
+    x132      c10               1370   c11               1370
+    x132      c12               1370   c13               1370
+    x133      obj               1E-5   c1                   1
+    x133      c2                9828   c5        6682.7810219
+    x133      c6                9828   c7         4661.988764
+    x133      c8                9828   c9                9828
+    x133      c10               9828   c11        7435.893535
+    x134      obj               1E-5   c1                   1
+    x134      c2                9376   c4                9376
+    x134      c6                9376   c8                9376
+    x134      c9                7354   c10               9376
+    x134      c12               4540   c13               9376
+    x135      obj               1E-5   c1                   1
+    x135      c2        3856.6326291   c3        2379.6660405
+    x135      c4                6443   c5        5038.2167883
+    x135      c6        5616.8782937   c7        5761.1011236
+    x135      c8                6443   c9                6443
+    x135      c10       2784.1324972   c11       4802.8550525
+    x135      c13       816.93589744
+    x136      obj               1E-5   c1                   1
+    x136      c2                1996   c3                1996
+    x136      c4                1996   c5                1996
+    x136      c6                1996   c7                1996
+    x136      c8                1996   c9                1996
+    x136      c10               1996   c11               1996
+    x136      c12               1996   c13               1996
+    x137      obj               1E-5   c1                   1
+    x137      c2                5320   c3                5320
+    x137      c4                5320   c5        4660.7472019
+    x137      c6                5320   c7                5320
+    x137      c8                5320   c9                5320
+    x137      c10       2436.2770533   c11               5320
+    x137      c12       1390.0810811   c13               5320
+    x138      obj               1E-5   c1                   1
+    x138      c2        3107.4788732   c3        5533.7993219
+    x138      c4        2524.7428057   c5                6754
+    x138      c6        1358.4934125   c7        3269.2808989
+    x138      c8        6041.6761381   c9        801.50639269
+    x138      c10       579.50663393   c12                275
+    x138      c13       1376.7820513
+    x139      obj               1E-5   c1                   1
+    x139      c2                1645   c3                1645
+    x139      c4                1645   c5                1645
+    x139      c6                1645   c7                1645
+    x139      c8                1645   c9                1645
+    x139      c10               1645   c11               1645
+    x139      c12               1645   c13               1645
+    x140      obj               1E-5   c1                   1
+    x140      c2        2890.0046948   c3                4365
+    x140      c4        499.32083911   c5        2864.8812652
+    x140      c6                4365   c7         3781.011236
+    x140      c8                 647   c9                4920
+    x140      c10       3851.4963355   c11       3400.7613107
+    x140      c12       7967.1621622   c13                433
+    x141      obj               1E-5   c1                   1
+    x141      c2                4920   c3                4920
+    x141      c4                4920   c5                4920
+    x141      c6                4920   c7        4396.0561798
+    x141      c8                4920   c9                4920
+    x141      c10               4920   c11               4920
+    x141      c12               4920   c13               4920
+    x142      obj               1E-5   c1                   1
+    x142      c2                8107   c3                8107
+    x142      c5                8107   c7                8107
+    x142      c9        4475.8803653   c10               8107
+    x142      c11               8107   c12       3561.7972973
+    x143      obj               1E-5   c1                   1
+    x143      c2                6103   c3                6103
+    x143      c4                6103   c5                6103
+    x143      c6                6103   c9                6103
+    x143      c10               6103   c12       2247.6351351
+    x144      obj               1E-5   c1                   1
+    x144      c2                4970   c3                4970
+    x144      c4                4970   c5                4970
+    x144      c6                4970   c7                4970
+    x144      c8                4970   c9                4970
+    x144      c10               4970   c11               4970
+    x144      c12               4970   c13               3647
+    x145      obj               1E-5   c1                   1
+    x145      c2                1582   c3                1582
+    x145      c4        1007.7206724   c5                1582
+    x145      c6                1582   c7                1582
+    x145      c8                1582   c9                1582
+    x145      c10               1582   c11               1582
+    x145      c12               1582   c13               1582
+    x146      obj               1E-5   c1                   1
+    x146      c2                6146   c3                6146
+    x146      c4                6146   c6                6146
+    x146      c7                4694   c8                6146
+    x146      c9        4153.7584475   c10       956.80938421
+    x146      c11               6146   c12               6146
+    x146      c13               3939
+    x147      obj               1E-5   c1                   1
+    x147      c2                6295   c3                6295
+    x147      c4                6295   c5        5403.1975669
+    x147      c6                6295   c10               6295
+    x147      c11       4239.4996656   c12               6295
+    x147      c13               6295
+    x148      obj               1E-5   c1                   1
+    x148      c2                8177   c3                8177
+    x148      c5        3640.0593674   c6                8177
+    x148      c8                8177   c11       5869.4915429
+    x148      c12       1942.6756757   c13               8177
+    x149      obj               1E-5   c1                   1
+    x149      c2                5339   c3              6015.5
+    x149      c4                8641   c6                8742
+    x149      c7        4299.5617978   c8                8742
+    x149      c10               4836
+    x150      obj               1E-5   c1                   1
+    x150      c2                9936   c3                9936
+    x150      c8                9936   c9                8641
+    x150      c10               5887   c11               9936
+    x150      c12               9936   c13               9936
+    MARK0001  'MARKER'                 'INTEND'
+    x151      obj                  1   c2                   1
+    x151      c3                   1   c4                   1
+    x151      c5                   1   c6                   1
+    x151      c7                   1   c8                   1
+    x151      c9                   1   c10                  1
+    x151      c11                  1   c12                  1
+    x151      c13                  1
+RHS
+    rhs       c1                  20   c2        157344.61033
+    rhs       c3        110007.77718   c4        113089.95355
+    rhs       c5              107767   c6        107283.94838
+    rhs       c7               86376   c8              107309
+    rhs       c9        105490.73653   c10       117802.11377
+    rhs       c11              97934   c12              85137
+    rhs       c13            94358.5
+BOUNDS
+ UP bnd       x1                   1
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ UP bnd       x75                  1
+ UP bnd       x76                  1
+ UP bnd       x77                  1
+ UP bnd       x78                  1
+ UP bnd       x79                  1
+ UP bnd       x80                  1
+ UP bnd       x81                  1
+ UP bnd       x82                  1
+ UP bnd       x83                  1
+ UP bnd       x84                  1
+ UP bnd       x85                  1
+ UP bnd       x86                  1
+ UP bnd       x87                  1
+ UP bnd       x88                  1
+ UP bnd       x89                  1
+ UP bnd       x90                  1
+ UP bnd       x91                  1
+ UP bnd       x92                  1
+ UP bnd       x93                  1
+ UP bnd       x94                  1
+ UP bnd       x95                  1
+ UP bnd       x96                  1
+ UP bnd       x97                  1
+ UP bnd       x98                  1
+ UP bnd       x99                  1
+ UP bnd       x100                 1
+ UP bnd       x101                 1
+ UP bnd       x102                 1
+ UP bnd       x103                 1
+ UP bnd       x104                 1
+ UP bnd       x105                 1
+ UP bnd       x106                 1
+ UP bnd       x107                 1
+ UP bnd       x108                 1
+ UP bnd       x109                 1
+ UP bnd       x110                 1
+ UP bnd       x111                 1
+ UP bnd       x112                 1
+ UP bnd       x113                 1
+ UP bnd       x114                 1
+ UP bnd       x115                 1
+ UP bnd       x116                 1
+ UP bnd       x117                 1
+ UP bnd       x118                 1
+ UP bnd       x119                 1
+ UP bnd       x120                 1
+ UP bnd       x121                 1
+ UP bnd       x122                 1
+ UP bnd       x123                 1
+ UP bnd       x124                 1
+ UP bnd       x125                 1
+ UP bnd       x126                 1
+ UP bnd       x127                 1
+ UP bnd       x128                 1
+ UP bnd       x129                 1
+ UP bnd       x130                 1
+ UP bnd       x131                 1
+ UP bnd       x132                 1
+ UP bnd       x133                 1
+ UP bnd       x134                 1
+ UP bnd       x135                 1
+ UP bnd       x136                 1
+ UP bnd       x137                 1
+ UP bnd       x138                 1
+ UP bnd       x139                 1
+ UP bnd       x140                 1
+ UP bnd       x141                 1
+ UP bnd       x142                 1
+ UP bnd       x143                 1
+ UP bnd       x144                 1
+ UP bnd       x145                 1
+ UP bnd       x146                 1
+ UP bnd       x147                 1
+ UP bnd       x148                 1
+ UP bnd       x149                 1
+ UP bnd       x150                 1
+ UP bnd       x151             1E+12
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mas76.mps b/demos/ppl_lpsol/examples/mas76.mps
new file mode 100644
index 0000000..7ff9a64
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mas76.mps
@@ -0,0 +1,1134 @@
+NAME           mas76
+ROWS
+ N  obj     
+ L  c1      
+ G  c2      
+ G  c3      
+ G  c4      
+ G  c5      
+ G  c6      
+ G  c7      
+ G  c8      
+ G  c9      
+ G  c10     
+ G  c11     
+ G  c12     
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        obj               1E-5   c1                   1
+    x1        c2        3857.5340376   c3                4264
+    x1        c4                4264   c5                4264
+    x1        c6                4264   c7                4264
+    x1        c8                4264   c9                4264
+    x1        c10               4264   c11               4264
+    x1        c12               4264
+    x2        obj               1E-5   c1                   1
+    x2        c2        125.76760563   c3                5339
+    x2        c4                5339   c5                5339
+    x2        c6                4264   c7                5339
+    x2        c8                5339   c9        3875.8958001
+    x2        c10       1218.3024772   c11       2349.7029047
+    x2        c12       3717.0066721
+    x3        obj               1E-5   c1                   1
+    x3        c2        7165.7769953   c3        5997.5298448
+    x3        c4                4020   c5        2551.0705817
+    x3        c6                7749   c7                5950
+    x3        c8                8260   c9        4091.5157068
+    x3        c11       5954.3061901   c12               3906
+    x4        obj               1E-5   c1                   1
+    x4        c2                2876   c3                2876
+    x4        c4                2876   c5                2876
+    x4        c6                2876   c7                2876
+    x4        c8                2876   c9                2876
+    x4        c10               2876   c11               2876
+    x4        c12               2876
+    x5        obj               1E-5   c1                   1
+    x5        c2                9723   c5                9723
+    x5        c6                9723   c7                9723
+    x5        c8                8445   c9                9723
+    x5        c11               9723   c12       7630.8567538
+    x6        obj               1E-5   c1                   1
+    x6        c2                7310   c3                7310
+    x6        c4                7310   c5                7310
+    x6        c8                7310   c11               7310
+    x6        c12               7310
+    x7        obj               1E-5   c1                   1
+    x7        c2                1529   c3                1529
+    x7        c4                1529   c5                1529
+    x7        c6                1529   c7                1529
+    x7        c8                1529   c9                1529
+    x7        c10               1529   c11               1529
+    x7        c12               1529
+    x8        obj               1E-5   c1                   1
+    x8        c2                1585   c3                1585
+    x8        c4                1585   c5                1585
+    x8        c6                1585   c7                1585
+    x8        c8                1585   c9                1585
+    x8        c10               1585   c11               1585
+    x8        c12               1585
+    x9        obj               1E-5   c1                   1
+    x9        c2                2949   c3                2949
+    x9        c4                2949   c5                2949
+    x9        c6                2949   c7                2949
+    x9        c8                2949   c9                2949
+    x9        c10               2949   c11               2949
+    x9        c12               2949
+    x10       obj               1E-5   c1                   1
+    x10       c2                7097   c3        4194.6948608
+    x10       c4                7097   c5                7097
+    x10       c6        5307.6683033   c7        3402.7992571
+    x10       c8                7097   c9                7097
+    x10       c11               7097   c12       3993.4803922
+    x11       obj               1E-5   c1                   1
+    x11       c2                1239   c3                1239
+    x11       c4                1239   c5                1239
+    x11       c6                1239   c7                1239
+    x11       c8                1239   c9                1239
+    x11       c10               1239   c11               1239
+    x11       c12               1239
+    x12       obj               1E-5   c1                   1
+    x12       c2                6449   c3                9402
+    x12       c4                5213   c5        5460.1237005
+    x12       c6        4623.3631424   c7                6449
+    x12       c8        2364.3477082   c9                9402
+    x12       c11       6019.7713621
+    x13       obj               1E-5   c1                   1
+    x13       c2          4596.07277   c3                8025
+    x13       c4        5205.5725555   c5        6988.5590257
+    x13       c6        5095.7938067   c7                3647
+    x13       c8                2463   c9        141.85254951
+    x13       c10       2623.8400161   c11               8025
+    x13       c12       996.84041394
+    x14       obj               1E-5   c1                   1
+    x14       c2                8037   c3                8037
+    x14       c5                8037   c6                8037
+    x14       c8                8037   c9                8037
+    x14       c10               8037   c12               8037
+    x15       obj               1E-5   c1                   1
+    x15       c2                7123   c3                7123
+    x15       c4        3447.1997813   c5                7123
+    x15       c6                7123   c7        4517.0858346
+    x15       c8                7123   c10               7123
+    x15       c11               7123
+    x16       obj               1E-5   c1                   1
+    x16       c2                8067   c3        4956.3455567
+    x16       c4        5187.6249609   c5                8067
+    x16       c6                8067   c10       3697.4308858
+    x16       c11               8067
+    x17       obj               1E-5   c1                   1
+    x17       c2                5704   c3                5704
+    x17       c4                5704   c5                5704
+    x17       c6                5704   c7                5704
+    x17       c8                2933   c9                5704
+    x17       c10               5704   c11               5704
+    x17       c12               5704
+    x18       obj               1E-5   c1                   1
+    x18       c2                1582   c3                1582
+    x18       c4        1506.6047419   c5                1582
+    x18       c6                1582   c7                1582
+    x18       c8                1582   c9                1582
+    x18       c10               1582   c11               1582
+    x18       c12               1582
+    x19       obj               1E-5   c1                   1
+    x19       c2                8713   c4                8713
+    x19       c5        4132.4582009   c6         6570.524825
+    x19       c7        7115.7257058   c8                8713
+    x19       c10               8713   c11               8713
+    x19       c12       7955.7135076
+    x20       obj               1E-5   c1                   1
+    x20       c2                9232   c4                9232
+    x20       c6                9232   c8                9232
+    x20       c9                8172   c10               8172
+    x20       c11               9232   c12               9232
+    x21       obj               1E-5   c1                   1
+    x21       c2                3371   c3        4450.6085385
+    x21       c4                4600   c5                4035
+    x21       c6                4035   c7                3371
+    x21       c8                4600   c9                4600
+    x21       c10               4600   c11               4600
+    x21       c12               4600
+    x22       obj               1E-5   c1                   1
+    x22       c2                2637   c3                2637
+    x22       c4                2637   c5                2637
+    x22       c6                2637   c7                2637
+    x22       c8                2637   c9                2637
+    x22       c10               2637   c11               2637
+    x22       c12               2637
+    x23       obj               1E-5   c1                   1
+    x23       c2                7131   c3        2834.0627677
+    x23       c4        3022.4184269   c5        5161.2867944
+    x23       c6        5112.4181569   c7                7131
+    x23       c8        6859.5538378   c9        6201.8467448
+    x23       c10        3993.954677   c11               7131
+    x23       c12       6771.8233932
+    x24       obj               1E-5   c1                   1
+    x24       c2         418.3028169   c3        6800.7326017
+    x24       c4        1444.7264377   c5        4438.6399605
+    x24       c6        4376.4583031   c7        5896.5208271
+    x24       c8        2400.0713317   c9                4056
+    x24       c10               9861   c11       4486.3993937
+    x24       c12       425.53118192
+    x25       obj               1E-5   c1                   1
+    x25       c2                3647   c3                3647
+    x25       c4                3647   c5                3647
+    x25       c6                3647   c7                3647
+    x25       c8                3647   c9                3647
+    x25       c10               3647   c11               3647
+    x25       c12               3647
+    x26       obj               1E-5   c1                   1
+    x26       c2        5688.4859155   c3        5067.3705835
+    x26       c4                8494   c5        4130.3600395
+    x26       c6        6202.6957438   c7                8494
+    x26       c8                2923   c9                4370
+    x26       c10               8494   c11       5761.3993937
+    x26       c12       2913.3760893
+    x27       obj               1E-5   c1                   1
+    x27       c2        7832.5997653   c3                9897
+    x27       c5                9897   c7        379.40517583
+    x27       c8        1683.2694603   c9        692.80030731
+    x27       c10       1978.1561741   c11       3143.4143401
+    x27       c12       2587.7352941
+    x28       obj               1E-5   c1                   1
+    x28       c2        4409.1255869   c3                5880
+    x28       c4                4579   c5                5880
+    x28       c6                5880   c7                5880
+    x28       c8                5880   c9                1252
+    x28       c10               5880   c11       4322.1433305
+    x28       c12       3416.7352941
+    x29       obj               1E-5   c1                   1
+    x29       c2                1053   c3                1053
+    x29       c4                1053   c5                1053
+    x29       c6                1053   c7                1053
+    x29       c8                1053   c9                1053
+    x29       c10               1053   c11               1053
+    x29       c12               1053
+    x30       obj               1E-5   c1                   1
+    x30       c2                2869   c3                2869
+    x30       c4                2869   c5                2869
+    x30       c6                2869   c7                2869
+    x30       c8        2781.1171684   c9                2869
+    x30       c10               2869   c11               2869
+    x30       c12               2869
+    x31       obj               1E-5   c1                   1
+    x31       c2                5410   c3                5410
+    x31       c4                5410   c5                4453
+    x31       c6                5410   c7                5410
+    x31       c8         1920.896664   c9                5410
+    x31       c10               5410   c11               5410
+    x31       c12       1867.9586057
+    x32       obj               1E-5   c1                   1
+    x32       c2                3948   c3                3948
+    x32       c4                3948   c5                3948
+    x32       c6                3948   c7                3948
+    x32       c8                3948   c9                3948
+    x32       c10               3948   c11               3948
+    x32       c12               3948
+    x33       obj               1E-5   c1                   1
+    x33       c2                6049   c3                6049
+    x33       c4                6049   c5                6049
+    x33       c6                6049   c7                6049
+    x33       c8                6049   c9                6049
+    x33       c10               6049   c11               6049
+    x33       c12               6049
+    x34       obj               1E-5   c1                   1
+    x34       c2                9317   c4                9317
+    x34       c6                9317   c8                9317
+    x34       c9                9317   c10               9317
+    x35       obj               1E-5   c1                   1
+    x35       c2                6880   c3                6880
+    x35       c4               179.5   c5                1950
+    x35       c6                6880   c7        2814.2200099
+    x35       c8        2633.4930838   c9        4584.1996927
+    x35       c10       2002.5472941   c11       4666.1862662
+    x35       c12               6880
+    x36       obj               1E-5   c1                   1
+    x36       c2                3779   c3                3779
+    x36       c4                3779   c5                3779
+    x36       c6                3779   c7                3779
+    x36       c8                3779   c9                3779
+    x36       c10               3779   c11               3779
+    x36       c12               3779
+    x37       obj               1E-5   c1                   1
+    x37       c2                3641   c3                3641
+    x37       c4                3641   c5                3641
+    x37       c6                3641   c7                3641
+    x37       c8                3641   c9                3641
+    x37       c10               3641   c11               3641
+    x37       c12               3641
+    x38       obj               1E-5   c1                   1
+    x38       c2                5567   c3        4989.1615364
+    x38       c4                5567   c5                5567
+    x38       c6                5567   c7                5567
+    x38       c8                5567   c9                5567
+    x38       c10               5567   c11               5353
+    x38       c12               5567
+    x39       obj               1E-5   c1                   1
+    x39       c2                2197   c3                2197
+    x39       c4                2197   c5                2197
+    x39       c6                2197   c7                2197
+    x39       c8                2197   c9                2197
+    x39       c10               2197   c11               2197
+    x39       c12               2197
+    x40       obj               1E-5   c1                   1
+    x40       c2                2842   c3                2842
+    x40       c4                2842   c5                2842
+    x40       c6                2842   c7                2842
+    x40       c8                2842   c9                2842
+    x40       c10               2842   c11               2842
+    x40       c12               2842
+    x41       obj               1E-5   c1                   1
+    x41       c2                4846   c3                4846
+    x41       c4                4846   c5                4846
+    x41       c6                4846   c7                4846
+    x41       c8                4846   c9                4846
+    x41       c10               4846   c11               4846
+    x41       c12               4846
+    x42       obj               1E-5   c1                   1
+    x42       c2                4616   c3                4616
+    x42       c4                4616   c5                4616
+    x42       c6        4386.6285041   c7                4616
+    x42       c8                4616   c9                4616
+    x42       c10               4616   c11               4616
+    x42       c12               4616
+    x43       obj               1E-5   c1                   1
+    x43       c2                8807   c4                8807
+    x43       c5                8807   c8                8807
+    x43       c9                8807   c10               8807
+    x43       c11               8807   c12               8807
+    x44       obj               1E-5   c1                   1
+    x44       c2                3261   c3                3261
+    x44       c4                3261   c5                3261
+    x44       c6                3261   c7                3261
+    x44       c8                3261   c9                3261
+    x44       c10               3261   c11               3261
+    x44       c12               3261
+    x45       obj               1E-5   c1                   1
+    x45       c2                3553   c3                3553
+    x45       c4                3553   c5                3553
+    x45       c6                3553   c7                3553
+    x45       c8                3553   c9                3553
+    x45       c10               3553   c11               3553
+    x45       c12               3553
+    x46       obj               1E-5   c1                   1
+    x46       c2                5239   c3                5239
+    x46       c4                5239   c5                5239
+    x46       c6                5239   c7                5239
+    x46       c8                5239   c9                5239
+    x46       c10               5239   c11               5239
+    x46       c12               5239
+    x47       obj               1E-5   c1                   1
+    x47       c2                6665   c3                6665
+    x47       c4                6665   c5                6665
+    x47       c6                6665   c7                6665
+    x47       c9                6665   c10               6665
+    x47       c11               6665
+    x48       obj               1E-5   c1                   1
+    x48       c2        3257.4906103   c3        6513.6694995
+    x48       c4                8172   c6                8172
+    x48       c7        5519.3776127   c8                8172
+    x48       c9                8172   c10               8172
+    x48       c11               8172   c12               8172
+    x49       obj               1E-5   c1                   1
+    x49       c2         7219.556338   c3        6513.6694995
+    x49       c4                8425   c6                8425
+    x49       c7        5519.3776127   c8                8425
+    x49       c11               8425   c12       4380.7073802
+    x50       obj               1E-5   c1                   1
+    x50       c2                2536   c3                2536
+    x50       c4                2536   c5                2536
+    x50       c6                2536   c7                2536
+    x50       c8                2536   c9                2536
+    x50       c10               2536   c11               2536
+    x50       c12               2536
+    x51       obj               1E-5   c1                   1
+    x51       c2                8013   c3                5762
+    x51       c5        5175.6917691   c6        2922.0679176
+    x51       c7        2679.7992571   c8        6292.9194467
+    x51       c9        7163.2213749   c10       5780.0146168
+    x51       c11               8013   c12        5333.267293
+    x52       obj               1E-5   c1                   1
+    x52       c2                3541   c3                3541
+    x52       c4                3541   c5                3541
+    x52       c6        922.71451306   c7                3541
+    x52       c8                3541   c9                3541
+    x52       c10               3541   c11               3541
+    x52       c12               3541
+    x53       obj               1E-5   c1                   1
+    x53       c2                8080   c3                8080
+    x53       c5                8080   c6                8080
+    x53       c9                8080   c10               8080
+    x53       c11               8080   c12               8080
+    x54       obj               1E-5   c1                   1
+    x54       c2        5593.0586854   c3                6767
+    x54       c4        4966.4377418   c5        2857.9555159
+    x54       c6                6767   c7        5991.3240713
+    x54       c8        4602.7549498   c9        3568.8679718
+    x54       c10       6701.5752929   c11               6767
+    x54       c12       3547.4434913
+    x55       obj               1E-5   c1                   1
+    x55       c2                5036   c3                5036
+    x55       c4                5036   c5                5036
+    x55       c6                5036   c7                5036
+    x55       c8                5036   c9                5036
+    x55       c10               5036   c11               5036
+    x55       c12               5036
+    x56       obj               1E-5   c1                   1
+    x56       c2                1782   c3                1782
+    x56       c4                1782   c5                1782
+    x56       c6                1782   c7                1782
+    x56       c8                1782   c9                1782
+    x56       c10               1782   c11               1782
+    x56       c12               1782
+    x57       obj               1E-5   c1                   1
+    x57       c2                3895   c3                3895
+    x57       c4                3895   c5                3895
+    x57       c6                3895   c7                3895
+    x57       c8                3895   c9                3895
+    x57       c10               3895   c11               3895
+    x57       c12       769.38126362
+    x58       obj               1E-5   c1                   1
+    x58       c2                4205   c3                4205
+    x58       c4                4205   c5                4205
+    x58       c6                4205   c7                4205
+    x58       c8                4205   c9                4205
+    x58       c10               4205   c11               4205
+    x58       c12               4205
+    x59       obj               1E-5   c1                   1
+    x59       c2                7772   c3                7772
+    x59       c4                7772   c7                7772
+    x59       c9                7772   c10               7772
+    x59       c11       6995.3832487
+    x60       obj               1E-5   c1                   1
+    x60       c2                9326   c4        6887.3290528
+    x60       c5        2548.0705817   c6                9326
+    x60       c7                9326   c8        5781.2161649
+    x60       c10               9326   c11               9326
+    x61       obj               1E-5   c1                   1
+    x61       c2                4757   c3                4757
+    x61       c4        1337.1303919   c5        1766.2736704
+    x61       c8        3828.0930296   c9        2546.4977806
+    x61       c10       4720.6651742   c11               1936
+    x61       c12       1374.3269336
+    x62       obj               1E-5   c1                   1
+    x62       c2                5355   c3                5355
+    x62       c4                5355   c5                5355
+    x62       c6                5355   c7                5355
+    x62       c8                5355   c9        920.44109948
+    x62       c10               5355   c11               5355
+    x62       c12               5355
+    x63       obj               1E-5   c1                   1
+    x63       c2                1919   c3                1919
+    x63       c4                1919   c5                1919
+    x63       c6                1919   c7                1919
+    x63       c8                1919   c9                1919
+    x63       c10               1919   c11               1919
+    x63       c12               1919
+    x64       obj               1E-5   c1                   1
+    x64       c2        7510.5774648   c3        7988.4333512
+    x64       c4        6185.1233268   c6        5491.8578076
+    x64       c7        6851.4383853   c8        6803.6804991
+    x64       c10       3921.3900634   c11       7066.1811901
+    x64       c12       1296.5245098
+    x65       obj               1E-5   c1                   1
+    x65       c2                7341   c3                7341
+    x65       c4                7341   c5                7341
+    x65       c8                7341   c9        6295.6057364
+    x65       c11               7341
+    x66       obj               1E-5   c1                   1
+    x66       c2                8541   c3                8541
+    x66       c6                4655   c7                8541
+    x66       c8                4655   c9                3195
+    x66       c10               8541   c11               4655
+    x66       c12               8541
+    x67       obj               1E-5   c1                   1
+    x67       c2                8352   c3                8352
+    x67       c5                8352   c7                8352
+    x67       c10               8352   c11               8352
+    x67       c12               8352
+    x68       obj               1E-5   c1                   1
+    x68       c2                3291   c3                3291
+    x68       c4                3291   c5                3291
+    x68       c6                3291   c7                3291
+    x68       c8                3291   c9                3291
+    x68       c10               3291   c11               3291
+    x68       c12               3291
+    x69       obj               1E-5   c1                   1
+    x69       c2                7328   c3                7328
+    x69       c4                7328   c5                7328
+    x69       c8                7328   c11               7328
+    x69       c12               7328
+    x70       obj               1E-5   c1                   1
+    x70       c2                4506   c3                4506
+    x70       c4                4506   c5                4506
+    x70       c6                4506   c7                4506
+    x70       c8                4506   c9                4506
+    x70       c10               4506   c11               4506
+    x70       c12               4506
+    x71       obj               1E-5   c1                   1
+    x71       c2                4429   c3                4429
+    x71       c4                4429   c5                4429
+    x71       c6                4429   c7                4429
+    x71       c8                4429   c9                4429
+    x71       c10               4429   c11               4429
+    x71       c12               4429
+    x72       obj               1E-5   c1                   1
+    x72       c2                4593   c3                4593
+    x72       c4        2038.6351681   c5                4593
+    x72       c6        3783.7812896   c7        2671.1703318
+    x72       c8        2068.3189585   c9                4593
+    x72       c10               4593   c11               4593
+    x72       c12       758.29711329
+    x73       obj               1E-5   c1                   1
+    x73       c2                9138   c4         6121.179313
+    x73       c5                8484   c7        4071.8888806
+    x73       c8                8484   c9        2896.1020089
+    x73       c10               9138   c11       2081.7976241
+    x73       c12       2184.2401961
+    x74       obj               1E-5   c1                   1
+    x74       c2        3731.7664319   c3        6465.6610011
+    x74       c4         6197.801258   c5         6175.543002
+    x74       c7        5999.3406637   c8        4290.3138053
+    x74       c9        5877.0429661   c10       3472.3031042
+    x74       c11       3545.8932953   c12       4236.1090686
+    x75       obj               1E-5   c1                   1
+    x75       c2        5124.2922535   c3        5806.8664347
+    x75       c4         1698.801258   c5        2921.3990893
+    x75       c6        654.39121533   c7        3781.9888063
+    x75       c8        5470.8814755   c9        984.49846346
+    x75       c10       630.30310424   c11       5202.9097575
+    x75       c12       5406.1224129
+    x76       obj               1E-5   c1                   1
+    x76       c2                4378   c3                4378
+    x76       c4        2279.4274445   c5                4378
+    x76       c6                4378   c8                4378
+    x76       c9                4378   c10               4378
+    x76       c11               4378   c12               4378
+    x77       obj               1E-5   c1                   1
+    x77       c2                3647   c3                3647
+    x77       c4                3647   c5                3647
+    x77       c6                3647   c7                3647
+    x77       c8                3647   c9                3647
+    x77       c10               3647   c11               3647
+    x77       c12               3647
+    x78       obj               1E-5   c1                   1
+    x78       c2                3795   c3        1395.1358405
+    x78       c4                3795   c5                3795
+    x78       c6                3795   c7                3795
+    x78       c8                3795   c9                3795
+    x78       c10               2912   c11               3795
+    x78       c12               3795
+    x79       obj               1E-5   c1                   1
+    x79       c2                2912   c3                2912
+    x79       c4                2912   c5                2912
+    x79       c6                2912   c7                2912
+    x79       c8                2912   c9                2912
+    x79       c10               2912   c11               2912
+    x79       c12               2912
+    x80       obj               1E-5   c1                   1
+    x80       c2                8830   c4                8830
+    x80       c5        2505.1281467   c6                8830
+    x80       c7                8830   c8                8830
+    x80       c9                8830   c12        40.55787037
+    x81       obj               1E-5   c1                   1
+    x81       c2                5445   c3                5445
+    x81       c4                5445   c5                5445
+    x81       c6                5445   c7                5445
+    x81       c8                5445   c9        2395.8979911
+    x81       c10               5445   c11               5445
+    x81       c12               5445
+    x82       obj               1E-5   c1                   1
+    x83       obj               1E-5   c1                   1
+    x83       c2                6112   c3                6112
+    x83       c4        4478.7723368   c5                6112
+    x83       c6                6112   c7                6112
+    x83       c8                6112   c9                6112
+    x83       c10               6112   c11               6112
+    x83       c12               6112
+    x84       obj               1E-5   c1                   1
+    x84       c2                8841   c4                8841
+    x84       c5                8841   c6                8841
+    x84       c10               8841   c12               8841
+    x85       obj               1E-5   c1                   1
+    x85       c2                1236   c3                1236
+    x85       c4                1236   c5                1236
+    x85       c6                1236   c7                1236
+    x85       c8                1236   c9                1236
+    x85       c10               1236   c11               1236
+    x85       c12               1236
+    x86       obj               1E-5   c1                   1
+    x86       c2                7010   c3                7010
+    x86       c4                7010   c5                7010
+    x86       c6                7010   c9                7010
+    x86       c10               7010
+    x87       obj               1E-5   c1                   1
+    x87       c2                2909   c3                2909
+    x87       c4                2909   c5                2909
+    x87       c6                2909   c7                2909
+    x87       c8                2909   c9                2909
+    x87       c10               2909   c11               2909
+    x87       c12               2909
+    x88       obj               1E-5   c1                   1
+    x88       c2                7622   c3                7622
+    x88       c4                7622   c7                7622
+    x88       c8                7622   c9                7622
+    x88       c10               7622   c12               7622
+    x89       obj               1E-5   c1                   1
+    x89       c2                7393   c3         6594.385439
+    x89       c4        1997.1997813   c5        6110.5626987
+    x89       c6        5966.6503463   c7        6281.3502229
+    x89       c8                7393   c9                7393
+    x89       c10               7393   c12               7393
+    x90       obj               1E-5   c1                   1
+    x90       c2        8317.6971831   c3                8830
+    x90       c6        4789.3781866   c7        4764.2200099
+    x90       c8        3307.7596962   c9        4019.8003073
+    x90       c10       3952.5472941   c11       5757.7289904
+    x90       c12               8830
+    x91       obj               1E-5   c1                   1
+    x91       c2                1950   c3                1950
+    x91       c4               179.5   c5                1950
+    x91       c6                1950   c7                1950
+    x91       c8                1950   c9                1950
+    x91       c10               1950   c11               1950
+    x91       c12               1950
+    x92       obj               1E-5   c1                   1
+    x92       c2                4654   c3                4654
+    x92       c4                4654   c5                4654
+    x92       c6                4654   c7                4654
+    x92       c8                4654   c9        2510.3471432
+    x92       c10               4654   c11               4654
+    x92       c12               4654
+    x93       obj               1E-5   c1                   1
+    x93       c2                2255   c3                2255
+    x93       c4                2255   c5                2255
+    x93       c6                2255   c7                2255
+    x93       c8                2255   c9                2255
+    x93       c10               2255   c11               2255
+    x93       c12               2255
+    x94       obj               1E-5   c1                   1
+    x94       c2                7104   c3                7104
+    x94       c4                7104   c5                7104
+    x94       c6                7104   c10               7104
+    x94       c12               7104
+    x95       obj               1E-5   c1                   1
+    x95       c2        7534.7887324   c3                7744
+    x95       c4                7744   c6                7744
+    x95       c9        4404.6020089   c11               7744
+    x95       c12       5858.9893791
+    x96       obj               1E-5   c1                   1
+    x96       c2                2054   c3                2054
+    x96       c4                2054   c5                2054
+    x96       c6                2054   c7                2054
+    x96       c8                2054   c9                2054
+    x96       c10               2054   c11               2054
+    x96       c12               2054
+    x97       obj               1E-5   c1                   1
+    x97       c2                6682   c3                6682
+    x97       c4                6682   c5        2501.4582009
+    x97       c6        3124.5817884   c7                6682
+    x97       c8                6682   c9        1366.8979911
+    x97       c10               6682   c11       1810.9409546
+    x97       c12               6682
+    x98       obj               1E-5   c1                   1
+    x98       c2                3234   c3                3234
+    x98       c4                3234   c5                3234
+    x98       c6                3234   c7                3234
+    x98       c8                3234   c9                3234
+    x98       c10               3234   c11               3234
+    x98       c12               3234
+    x99       obj               1E-5   c1                   1
+    x99       c2                2842   c3                2842
+    x99       c4                2842   c5                2842
+    x99       c6        654.39121533   c7        2706.9888063
+    x99       c8                2842   c9                2842
+    x99       c10               2842   c11        1339.329068
+    x99       c12               2842
+    x100      obj               1E-5   c1                   1
+    x100      c2                3974   c3                3974
+    x100      c4                3974   c5                3974
+    x100      c6                3974   c7                3974
+    x100      c8                3974   c9                3974
+    x100      c10               3974   c11               3974
+    x100      c12               3974
+    x101      obj               1E-5   c1                   1
+    x101      c2                3624   c3                3624
+    x101      c4                3624   c5                3624
+    x101      c6                3624   c7                3624
+    x101      c8                3624   c9                3624
+    x101      c10               3624   c11               3624
+    x101      c12               3624
+    x102      obj               1E-5   c1                   1
+    x102      c2                5415   c3                5415
+    x102      c4                5415   c5                5415
+    x102      c6                5415   c7                5415
+    x102      c8                5415   c9                5415
+    x102      c10               5415   c11               5415
+    x102      c12               5415
+    x103      obj               1E-5   c1                   1
+    x103      c2                2246   c3        1997.6085385
+    x103      c4                2246   c5                1582
+    x103      c6                2246   c7                2246
+    x103      c8                2246   c9                2246
+    x103      c10               2246   c11               2246
+    x103      c12               2246
+    x104      obj               1E-5   c1                   1
+    x104      c2                8590   c3                8590
+    x104      c6                8590   c8                8590
+    x104      c9                8590   c10               8590
+    x104      c11               8590   c12               8590
+    x105      obj               1E-5   c1                   1
+    x105      c2                2633   c3         2373.137781
+    x105      c4                2633   c5                2633
+    x105      c6                2633   c7                2633
+    x105      c8                2633   c9                2633
+    x105      c10               2633   c11               2633
+    x105      c12               2633
+    x106      obj               1E-5   c1                   1
+    x106      c2                4655   c3                4655
+    x106      c4                4655   c5                4655
+    x106      c6                4655   c7                4655
+    x106      c8                4655   c9                4655
+    x106      c10               4655   c11               4655
+    x106      c12               4655
+    x107      obj               1E-5   c1                   1
+    x107      c2                2923   c3                2923
+    x107      c4                2923   c5                2923
+    x107      c6                2923   c7                2923
+    x107      c8                2923   c9                2923
+    x107      c10               2923   c11               2923
+    x107      c12               2923
+    x108      obj               1E-5   c1                   1
+    x108      c2                6318   c3                6318
+    x108      c4                6318   c5                6318
+    x108      c6                6318   c7                6318
+    x108      c8                6318   c9                6318
+    x108      c10               6318   c12               6318
+    x109      obj               1E-5   c1                   1
+    x109      c2                7440   c3                7440
+    x109      c4                7440   c6                7440
+    x109      c7                7440   c9                7440
+    x109      c12               7440
+    x110      obj               1E-5   c1                   1
+    x110      c2                4579   c3                4579
+    x110      c4                4579   c5                4579
+    x110      c6                4579   c7                4579
+    x110      c8                4579   c9                4579
+    x110      c10               4579   c11               4579
+    x110      c12               4579
+    x111      obj               1E-5   c1                   1
+    x111      c2                8342   c3                8342
+    x111      c5                8342   c7        5211.7323923
+    x111      c8                8342   c9                8342
+    x111      c10               8342
+    x112      obj               1E-5   c1                   1
+    x112      c2        3813.4002347   c3                5050
+    x112      c4                5050   c5        1365.1296074
+    x112      c6        3650.9002494   c7        1367.1828628
+    x112      c8        2259.9591809   c9                1582
+    x112      c10       4641.0618824   c12       1839.3216231
+    x113      obj               1E-5   c1                   1
+    x113      c2                6268   c3                6268
+    x113      c4                5050   c5                6268
+    x113      c6                6268   c7        987.77768697
+    x113      c8                6268   c9                6268
+    x113      c10               6268   c11       3143.4143401
+    x113      c12               6268
+    x114      obj               1E-5   c1                   1
+    x114      c2                8570   c3                8570
+    x114      c6                8570   c7                8570
+    x114      c8                8570   c10       2672.8901642
+    x114      c11               8570   c12       7847.8483115
+    x115      obj               1E-5   c1                   1
+    x115      c2                9838   c5                7799
+    x115      c6        7119.5646547   c7        8392.0859336
+    x115      c8                9838   c9                9838
+    x115      c10               9838   c11               9838
+    x115      c12               9838
+    x116      obj               1E-5   c1                   1
+    x116      c2                4876   c3                4876
+    x116      c4                4876   c5                4876
+    x116      c6                4876   c7                4876
+    x116      c8        1677.8517765   c9                4876
+    x116      c10               4876   c11               4876
+    x116      c12               4876
+    x117      obj               1E-5   c1                   1
+    x117      c2         418.3028169   c3        6800.7326017
+    x117      c4        1444.7264377   c5        4438.6399605
+    x117      c6        4376.4583031   c7        5896.5208271
+    x117      c8        2400.0713317   c9                4056
+    x117      c10               9861   c11       4486.3993937
+    x117      c12       425.53118192
+    x118      obj               1E-5   c1                   1
+    x118      c2                4922   c3                4922
+    x118      c4                4922   c5                4922
+    x118      c6                3590   c7                4922
+    x118      c8                4922   c9                3333
+    x118      c10               4922   c11               4922
+    x118      c12               4922
+    x119      obj               1E-5   c1                   1
+    x119      c2                3590   c3                3590
+    x119      c4                3590   c5                3590
+    x119      c6                3590   c7                3590
+    x119      c8                3590   c9                3590
+    x119      c10               3590   c11               3590
+    x119      c12               3590
+    x120      obj               1E-5   c1                   1
+    x120      c2                7152   c3                7152
+    x120      c4                7152   c5                7152
+    x120      c7                7152   c8                7152
+    x120      c10               7152
+    x121      obj               1E-5   c1                   1
+    x121      c2                7056   c3                7056
+    x121      c4                 805   c5                7056
+    x121      c6                7056   c7                7056
+    x121      c8                7056   c9        6684.7360005
+    x121      c10               7056   c11               7056
+    x121      c12               7056
+    x122      obj               1E-5   c1                   1
+    x122      c2                9136   c4                9136
+    x122      c6                9136   c7                9136
+    x122      c9                9136   c10               9136
+    x122      c11               9136
+    x123      obj               1E-5   c1                   1
+    x123      c2                7850   c3                7850
+    x123      c4                4655   c5                4655
+    x123      c7                7850   c9                7850
+    x123      c10               7850   c12               7850
+    x124      obj               1E-5   c1                   1
+    x124      c2                6863   c3                6863
+    x124      c4                6863   c5                6863
+    x124      c6                6863   c7                6863
+    x124      c12               6863
+    x125      obj               1E-5   c1                   1
+    x125      c2                9356   c4        6006.1685651
+    x125      c5                9356   c7                9356
+    x125      c9        7984.5952083   c11               4448
+    x125      c12       7131.2908497
+    x126      obj               1E-5   c1                   1
+    x126      c2                2933   c3                2933
+    x126      c4                2933   c5                2933
+    x126      c6                2933   c7                2933
+    x126      c8                2933   c9                2933
+    x126      c10               2933   c11               2933
+    x126      c12               2933
+    x127      obj               1E-5   c1                   1
+    x127      c2                2665   c3                2665
+    x127      c4                2665   c5                2665
+    x127      c6                2665   c7                2665
+    x127      c8                2665   c9                2665
+    x127      c10               2665   c11               2665
+    x127      c12               2665
+    x128      obj               1E-5   c1                   1
+    x128      c2                4063   c3                4063
+    x128      c4                4063   c5                4063
+    x128      c6                4063   c7                4063
+    x128      c8                4063   c9                4063
+    x128      c10               4063   c11               4063
+    x128      c12               4063
+    x129      obj               1E-5   c1                   1
+    x129      c2                7502   c3        7194.4958512
+    x129      c4                7502   c6        5805.6941235
+    x129      c7                7502   c8        2838.1593436
+    x129      c9         2973.398674   c10               7502
+    x129      c11       6324.7029047   c12       6844.4421296
+    x130      obj               1E-5   c1                   1
+    x130      c2                1966   c3                1966
+    x130      c4                1966   c5                1966
+    x130      c6                1966   c7                1966
+    x130      c8                1966   c9                1966
+    x130      c10               1966   c11               1966
+    x130      c12               1966
+    x131      obj               1E-5   c1                   1
+    x131      c2                4540   c3                4540
+    x131      c4                4540   c5                4540
+    x131      c6                4540   c7                4540
+    x131      c8                4540   c9                4540
+    x131      c10               4540   c11               4540
+    x131      c12               4540
+    x132      obj               1E-5   c1                   1
+    x132      c2                1370   c3                1370
+    x132      c4                1370   c5                1370
+    x132      c6                1370   c7                1370
+    x132      c8                1370   c9                1370
+    x132      c10               1370   c11               1370
+    x132      c12               1370
+    x133      obj               1E-5   c1                   1
+    x133      c2                9828   c5                9828
+    x133      c6                9828   c7                9828
+    x133      c9                9828   c11               9828
+    x133      c12               9828
+    x134      obj               1E-5   c1                   1
+    x134      c2                9376   c4                9376
+    x134      c7                9376   c8                9376
+    x134      c9                9376   c10               9376
+    x134      c11               9376   c12               9376
+    x135      obj               1E-5   c1                   1
+    x135      c2        3856.6326291   c3        699.33050054
+    x135      c4                6443   c5        2459.7239454
+    x135      c6                6443   c7        4204.3776127
+    x135      c8                6443   c9        5442.4805372
+    x135      c10       4223.2163061   c11               6443
+    x135      c12       4023.7207244
+    x136      obj               1E-5   c1                   1
+    x136      c2                1996   c3                1996
+    x136      c4                1996   c5                1996
+    x136      c6                1996   c7                1996
+    x136      c8                1996   c9                1996
+    x136      c10               1996   c11               1996
+    x136      c12               1996
+    x137      obj               1E-5   c1                   1
+    x137      c2                5320   c3                5320
+    x137      c4                5320   c5                5320
+    x137      c6        2230.8578076   c7                5320
+    x137      c8                5320   c9                5320
+    x137      c10               5320   c11               5320
+    x137      c12               5320
+    x138      obj               1E-5   c1                   1
+    x138      c2        3107.4788732   c3        2686.2422377
+    x138      c4        190.29012568   c6        35.415531264
+    x138      c7        3688.0699604   c8                6754
+    x138      c10               3234   c12        5299.145561
+    x139      obj               1E-5   c1                   1
+    x139      c2                1645   c3                1645
+    x139      c4                1645   c5                1645
+    x139      c6                1645   c7                1645
+    x139      c8                1645   c9                1645
+    x139      c10               1645   c11               1645
+    x139      c12               1645
+    x140      obj               1E-5   c1                   1
+    x140      c2        2890.0046948   c3        2194.0980996
+    x140      c4                1966   c5        234.37039265
+    x140      c6        6184.8933866   c7                 433
+    x140      c8        8057.6528343   c9        5264.9477578
+    x140      c10       7785.9167409   c11                433
+    x140      c12       5743.9670479
+    x141      obj               1E-5   c1                   1
+    x141      c2                4920   c3                4920
+    x141      c4        4276.6272259   c5                4920
+    x141      c6                4920   c7                4920
+    x141      c8                4920   c9                4920
+    x141      c10               4920   c11               4920
+    x141      c12               4920
+    x142      obj               1E-5   c1                   1
+    x142      c2                8107   c3                8107
+    x142      c5                8107   c6                8107
+    x142      c8                8107   c9                8107
+    x142      c11               8107
+    x143      obj               1E-5   c1                   1
+    x143      c2                6103   c3                6103
+    x143      c4                6103   c5        2850.6425595
+    x143      c6                6103   c7                6103
+    x143      c8        4014.9286683   c9                6103
+    x143      c10               6103   c11               6103
+    x143      c12               3705
+    x144      obj               1E-5   c1                   1
+    x144      c2                4970   c3                4970
+    x144      c4                4970   c5                4970
+    x144      c6                4970   c7                4970
+    x144      c8                4970   c9                4970
+    x144      c10               4970   c11               4970
+    x144      c12               4970
+    x145      obj               1E-5   c1                   1
+    x145      c2                1582   c3                1582
+    x145      c4                1582   c5                1582
+    x145      c6                1582   c7                1582
+    x145      c8                1582   c9                1582
+    x145      c10               1582   c11               1582
+    x145      c12               1582
+    x146      obj               1E-5   c1                   1
+    x146      c2                6146   c3        6007.6066649
+    x146      c4                6146   c5                6146
+    x146      c6        1807.4118259   c7                6146
+    x146      c8                6146   c9                6146
+    x146      c10        4055.643386   c11               6146
+    x146      c12       3889.5196078
+    x147      obj               1E-5   c1                   1
+    x147      c2                6295   c3                6295
+    x147      c4                6295   c5                6295
+    x147      c6                6295   c7                6295
+    x147      c8                6295   c9                6295
+    x147      c10               6295   c11               6295
+    x148      obj               1E-5   c1                   1
+    x148      c2                8177   c3              4739.5
+    x148      c4                8177   c7                8177
+    x148      c8                8177   c9                8177
+    x148      c10               8177   c11               8177
+    x148      c12               8177
+    x149      obj               1E-5   c1                   1
+    x149      c2                5339   c3        3384.6358405
+    x149      c4                8742   c5                3373
+    x149      c6        4547.1370064   c7                8742
+    x149      c8                8742   c9                8742
+    x149      c10               8742   c11               8742
+    x149      c12               8742
+    x150      obj               1E-5   c1                   1
+    x150      c2                9936   c5                9936
+    x150      c6                9936   c7                9936
+    x150      c8                9936   c10               9936
+    MARK0001  'MARKER'                 'INTEND'
+    x151      obj                  1   c2                   1
+    x151      c3                   1   c4                   1
+    x151      c5                   1   c6                   1
+    x151      c7                   1   c8                   1
+    x151      c9                   1   c10                  1
+    x151      c11                  1   c12                  1
+RHS
+    rhs       c1                  15   c2        157344.61033
+    rhs       c3        117845.82287   c4        121387.97778
+    rhs       c5         122529.5819   c6        124193.83991
+    rhs       c7        110802.52457   c8        111973.66667
+    rhs       c9              115941   c10       127089.14155
+    rhs       c11        112419.0906   c12             123188
+BOUNDS
+ UP bnd       x1                   1
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ UP bnd       x75                  1
+ UP bnd       x76                  1
+ UP bnd       x77                  1
+ UP bnd       x78                  1
+ UP bnd       x79                  1
+ UP bnd       x80                  1
+ UP bnd       x81                  1
+ UP bnd       x82                  1
+ UP bnd       x83                  1
+ UP bnd       x84                  1
+ UP bnd       x85                  1
+ UP bnd       x86                  1
+ UP bnd       x87                  1
+ UP bnd       x88                  1
+ UP bnd       x89                  1
+ UP bnd       x90                  1
+ UP bnd       x91                  1
+ UP bnd       x92                  1
+ UP bnd       x93                  1
+ UP bnd       x94                  1
+ UP bnd       x95                  1
+ UP bnd       x96                  1
+ UP bnd       x97                  1
+ UP bnd       x98                  1
+ UP bnd       x99                  1
+ UP bnd       x100                 1
+ UP bnd       x101                 1
+ UP bnd       x102                 1
+ UP bnd       x103                 1
+ UP bnd       x104                 1
+ UP bnd       x105                 1
+ UP bnd       x106                 1
+ UP bnd       x107                 1
+ UP bnd       x108                 1
+ UP bnd       x109                 1
+ UP bnd       x110                 1
+ UP bnd       x111                 1
+ UP bnd       x112                 1
+ UP bnd       x113                 1
+ UP bnd       x114                 1
+ UP bnd       x115                 1
+ UP bnd       x116                 1
+ UP bnd       x117                 1
+ UP bnd       x118                 1
+ UP bnd       x119                 1
+ UP bnd       x120                 1
+ UP bnd       x121                 1
+ UP bnd       x122                 1
+ UP bnd       x123                 1
+ UP bnd       x124                 1
+ UP bnd       x125                 1
+ UP bnd       x126                 1
+ UP bnd       x127                 1
+ UP bnd       x128                 1
+ UP bnd       x129                 1
+ UP bnd       x130                 1
+ UP bnd       x131                 1
+ UP bnd       x132                 1
+ UP bnd       x133                 1
+ UP bnd       x134                 1
+ UP bnd       x135                 1
+ UP bnd       x136                 1
+ UP bnd       x137                 1
+ UP bnd       x138                 1
+ UP bnd       x139                 1
+ UP bnd       x140                 1
+ UP bnd       x141                 1
+ UP bnd       x142                 1
+ UP bnd       x143                 1
+ UP bnd       x144                 1
+ UP bnd       x145                 1
+ UP bnd       x146                 1
+ UP bnd       x147                 1
+ UP bnd       x148                 1
+ UP bnd       x149                 1
+ UP bnd       x150                 1
+ UP bnd       x151             1E+12
+ENDATA
diff --git a/demos/ppl_lpsol/examples/mip.mps b/demos/ppl_lpsol/examples/mip.mps
new file mode 100644
index 0000000..d2da1a3
--- /dev/null
+++ b/demos/ppl_lpsol/examples/mip.mps
@@ -0,0 +1,27 @@
+NAME          SAMP2
+ROWS
+ N  Z
+ G  R1
+ G  R2
+ G  R3
+COLUMNS
+    X1        R1                2.0    R2                 1.0
+    X1        R3                5.0    Z                  3.0
+    X2        R1               -1.0    R2                -1.0
+    X2        R3                3.0    Z                  7.0
+    X3        R1                1.0    R2                -6.0
+    X3        Z                -1.0
+    X4        R1               -1.0    R2                 4.0
+    X4        R3                1.0    Z                  1.0
+RHS
+    RHS1      R1                1.0
+    RHS1      R2                8.0
+    RHS1      R3                5.0
+BOUNDS
+ UP BND1      X1                4.0
+ LO BND1      X2                2.0
+ UI BND1      X2                5.0
+ BV BND1      X3
+ LO BND1      X4                3.0
+ UP BND1      X4                8.0
+ENDATA
diff --git a/demos/ppl_lpsol/examples/modglob.mps b/demos/ppl_lpsol/examples/modglob.mps
new file mode 100644
index 0000000..fe9611e
--- /dev/null
+++ b/demos/ppl_lpsol/examples/modglob.mps
@@ -0,0 +1,1192 @@
+NAME           modglob
+ROWS
+ N  OBJ     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+ E  c7      
+ E  c8      
+ E  c9      
+ E  c10     
+ E  c11     
+ E  c12     
+ E  c13     
+ E  c14     
+ E  c15     
+ E  c16     
+ E  c17     
+ E  c18     
+ E  c19     
+ E  c20     
+ E  c21     
+ E  c22     
+ E  c23     
+ E  c24     
+ E  c25     
+ E  c26     
+ E  c27     
+ E  c28     
+ E  c29     
+ E  c30     
+ E  c31     
+ E  c32     
+ E  c33     
+ E  c34     
+ E  c35     
+ E  c36     
+ E  c37     
+ E  c38     
+ E  c39     
+ E  c40     
+ E  c41     
+ E  c42     
+ E  c43     
+ E  c44     
+ E  c45     
+ E  c46     
+ E  c47     
+ E  c48     
+ E  c49     
+ E  c50     
+ E  c51     
+ E  c52     
+ E  c53     
+ E  c54     
+ E  c55     
+ E  c56     
+ E  c57     
+ E  c58     
+ E  c59     
+ E  c60     
+ E  c61     
+ E  c62     
+ E  c63     
+ E  c64     
+ E  c65     
+ E  c66     
+ E  c67     
+ E  c68     
+ E  c69     
+ E  c70     
+ E  c71     
+ E  c72     
+ E  c73     
+ E  c74     
+ E  c75     
+ E  c76     
+ E  c77     
+ E  c78     
+ E  c79     
+ E  c80     
+ E  c81     
+ E  c82     
+ E  c83     
+ E  c84     
+ E  c85     
+ E  c86     
+ E  c87     
+ E  c88     
+ E  c89     
+ E  c90     
+ E  c91     
+ E  c92     
+ E  c93     
+ E  c94     
+ E  c95     
+ L  c96     
+ L  c97     
+ L  c98     
+ L  c99     
+ L  c100    
+ L  c101    
+ L  c102    
+ L  c103    
+ L  c104    
+ L  c105    
+ L  c106    
+ L  c107    
+ L  c108    
+ L  c109    
+ L  c110    
+ L  c111    
+ L  c112    
+ L  c113    
+ L  c114    
+ L  c115    
+ L  c116    
+ L  c117    
+ L  c118    
+ L  c119    
+ L  c120    
+ L  c121    
+ L  c122    
+ L  c123    
+ L  c124    
+ L  c125    
+ L  c126    
+ L  c127    
+ L  c128    
+ L  c129    
+ L  c130    
+ L  c131    
+ L  c132    
+ L  c133    
+ L  c134    
+ L  c135    
+ L  c136    
+ L  c137    
+ L  c138    
+ L  c139    
+ L  c140    
+ L  c141    
+ L  c142    
+ L  c143    
+ L  c144    
+ L  c145    
+ L  c146    
+ L  c147    
+ L  c148    
+ L  c149    
+ L  c150    
+ L  c151    
+ L  c152    
+ L  c153    
+ L  c154    
+ L  c155    
+ L  c156    
+ L  c157    
+ L  c158    
+ L  c159    
+ L  c160    
+ L  c161    
+ L  c162    
+ L  c163    
+ L  c164    
+ L  c165    
+ L  c166    
+ L  c167    
+ L  c168    
+ L  c169    
+ L  c170    
+ L  c171    
+ L  c172    
+ L  c173    
+ L  c174    
+ L  c175    
+ L  c176    
+ L  c177    
+ L  c178    
+ L  c179    
+ L  c180    
+ L  c181    
+ L  c182    
+ L  c183    
+ L  c184    
+ L  c185    
+ L  c186    
+ L  c187    
+ L  c188    
+ L  c189    
+ L  c190    
+ L  c191    
+ L  c192    
+ L  c193    
+ L  c194    
+ L  c195    
+ L  c196    
+ L  c197    
+ L  c198    
+ L  c199    
+ L  c200    
+ L  c201    
+ L  c202    
+ L  c203    
+ L  c204    
+ L  c205    
+ L  c206    
+ L  c207    
+ L  c208    
+ L  c209    
+ L  c210    
+ L  c211    
+ L  c212    
+ L  c213    
+ L  c214    
+ L  c215    
+ L  c216    
+ L  c217    
+ L  c218    
+ L  c219    
+ L  c220    
+ L  c221    
+ L  c222    
+ L  c223    
+ L  c224    
+ L  c225    
+ L  c226    
+ L  c227    
+ L  c228    
+ L  c229    
+ L  c230    
+ L  c231    
+ L  c232    
+ L  c233    
+ L  c234    
+ L  c235    
+ L  c236    
+ L  c237    
+ L  c238    
+ L  c239    
+ L  c240    
+ L  c241    
+ L  c242    
+ L  c243    
+ L  c244    
+ L  c245    
+ L  c246    
+ L  c247    
+ L  c248    
+ L  c249    
+ L  c250    
+ L  c251    
+ L  c252    
+ L  c253    
+ L  c254    
+ L  c255    
+ L  c256    
+ L  c257    
+ L  c258    
+ L  c259    
+ L  c260    
+ L  c261    
+ L  c262    
+ L  c263    
+ L  c264    
+ L  c265    
+ L  c266    
+ L  c267    
+ L  c268    
+ L  c269    
+ L  c270    
+ L  c271    
+ L  c272    
+ L  c273    
+ L  c274    
+ L  c275    
+ L  c276    
+ L  c277    
+ L  c278    
+ L  c279    
+ L  c280    
+ L  c281    
+ L  c282    
+ L  c283    
+ L  c284    
+ L  c285    
+ L  c286    
+ L  c287    
+ L  c288    
+ L  c289    
+ L  c290    
+ L  c291    
+COLUMNS
+    x1        OBJ                432   c1                -0.9
+    x2        OBJ                432   c3                -0.9
+    x3        OBJ                367   c2                  -1
+    x4        OBJ                367   c4                  -1
+    x5        OBJ            0.65392   c36                 -1
+    x5        c38               0.98   c98                  1
+    x6        OBJ           3.224038   c36                 -1
+    x6        c42               0.98   c96                  1
+    x7        OBJ            0.65392   c36               0.98
+    x7        c38                 -1   c196                 1
+    x8        OBJ           2.985518   c38                 -1
+    x8        c44               0.98   c100                 1
+    x9        OBJ           1.599959   c40                 -1
+    x9        c42               0.98   c206                 1
+    x10       OBJ           4.336906   c40                 -1
+    x10       c46               0.98   c110                 1
+    x11       OBJ           3.224038   c36               0.98
+    x11       c42                 -1   c194                 1
+    x12       OBJ           1.599959   c40               0.98
+    x12       c42                 -1   c108                 1
+    x13       OBJ           1.135649   c42                 -1
+    x13       c44               0.98   c200                 1
+    x14       OBJ           4.795188   c42                 -1
+    x14       c48               0.98   c106                 1
+    x15       OBJ           2.985518   c38               0.98
+    x15       c44                 -1   c198                 1
+    x16       OBJ           1.135649   c42               0.98
+    x16       c44                 -1   c102                 1
+    x17       OBJ           5.424316   c44                 -1
+    x17       c50               0.98   c104                 1
+    x18       OBJ           4.336906   c40               0.98
+    x18       c46                 -1   c208                 1
+    x19       OBJ           1.938308   c46                 -1
+    x19       c48               0.98   c210                 1
+    x20       OBJ           3.851157   c46                 -1
+    x20       c60               0.98   c124                 1
+    x21       OBJ           4.795188   c42               0.98
+    x21       c48                 -1   c204                 1
+    x22       OBJ           1.938308   c46               0.98
+    x22       c48                 -1   c112                 1
+    x23       OBJ             1.6951   c48                 -1
+    x23       c50               0.98   c114                 1
+    x24       OBJ           4.293357   c48                 -1
+    x24       c58               0.98   c122                 1
+    x25       OBJ           5.424316   c44               0.98
+    x25       c50                 -1   c202                 1
+    x26       OBJ             1.6951   c48               0.98
+    x26       c50                 -1   c212                 1
+    x27       OBJ           1.461269   c50                 -1
+    x27       c52               0.98   c116                 1
+    x28       OBJ           3.782818   c50                 -1
+    x28       c56               0.98   c120                 1
+    x29       OBJ           1.461269   c50               0.98
+    x29       c52                 -1   c214                 1
+    x30       OBJ           3.392878   c52                 -1
+    x30       c54               0.98   c118                 1
+    x31       OBJ           3.392878   c52               0.98
+    x31       c54                 -1   c216                 1
+    x32       OBJ           2.129257   c54                 -1
+    x32       c56               0.98   c126                 1
+    x33       OBJ           3.449157   c54                 -1
+    x33       c132                 1
+    x34       OBJ           3.782818   c50               0.98
+    x34       c56                 -1   c218                 1
+    x35       OBJ           2.129257   c54               0.98
+    x35       c56                 -1   c224                 1
+    x36       OBJ           2.294749   c56                 -1
+    x36       c58               0.98   c128                 1
+    x37       OBJ             3.3768   c56                 -1
+    x37       c64               0.98   c134                 1
+    x38       OBJ           4.293357   c48               0.98
+    x38       c58                 -1   c220                 1
+    x39       OBJ           2.294749   c56               0.98
+    x39       c58                 -1   c226                 1
+    x40       OBJ           2.068289   c58                 -1
+    x40       c60               0.98   c130                 1
+    x41       OBJ           3.107457   c58                 -1
+    x41       c66               0.98   c136                 1
+    x42       OBJ           3.851157   c46               0.98
+    x42       c60                 -1   c222                 1
+    x43       OBJ           2.068289   c58               0.98
+    x43       c60                 -1   c228                 1
+    x44       OBJ           1.222749   c60                 -1
+    x44       c62               0.98   c140                 1
+    x45       OBJ           2.622378   c60                 -1
+    x45       c68               0.98   c138                 1
+    x46       OBJ           1.222749   c60               0.98
+    x46       c62                 -1   c238                 1
+    x47       OBJ           2.252539   c62                 -1
+    x47       c70               0.98   c142                 1
+    x48       OBJ             3.3768   c56               0.98
+    x48       c64                 -1   c232                 1
+    x49       OBJ           2.510489   c64                 -1
+    x49       c66               0.98   c150                 1
+    x50       OBJ           4.276607   c64                 -1
+    x50       c80               0.98   c148                 1
+    x51       OBJ           2.449518   c64                 -1
+    x51       c244                 1
+    x52       OBJ           3.107457   c58               0.98
+    x52       c66                 -1   c234                 1
+    x53       OBJ           2.510489   c64               0.98
+    x53       c66                 -1   c248                 1
+    x54       OBJ           2.576149   c66                 -1
+    x54       c68               0.98   c154                 1
+    x55       OBJ           3.762717   c66                 -1
+    x55       c78               0.98   c152                 1
+    x56       OBJ           2.622378   c60               0.98
+    x56       c68                 -1   c236                 1
+    x57       OBJ           2.576149   c66               0.98
+    x57       c68                 -1   c252                 1
+    x58       OBJ           2.059578   c68                 -1
+    x58       c70               0.98   c158                 1
+    x59       OBJ             2.9078   c68                 -1
+    x59       c76               0.98   c156                 1
+    x60       OBJ           2.252539   c62               0.98
+    x60       c70                 -1   c240                 1
+    x61       OBJ           2.059578   c68               0.98
+    x61       c70                 -1   c256                 1
+    x62       OBJ             1.9631   c70                 -1
+    x62       c74               0.98   c160                 1
+    x63       OBJ           1.797607   c72                 -1
+    x63       c74               0.98   c278                 1
+    x64       OBJ           1.727258   c72                 -1
+    x64       c94               0.98   c182                 1
+    x65       OBJ             1.9631   c70               0.98
+    x65       c74                 -1   c258                 1
+    x66       OBJ           1.797607   c72               0.98
+    x66       c74                 -1   c180                 1
+    x67       OBJ           2.842138   c74                 -1
+    x67       c76               0.98   c274                 1
+    x68       OBJ           2.178839   c74                 -1
+    x68       c92               0.98   c178                 1
+    x69       OBJ             2.9078   c68               0.98
+    x69       c76                 -1   c254                 1
+    x70       OBJ           2.842138   c74               0.98
+    x70       c76                 -1   c176                 1
+    x71       OBJ           4.285317   c76                 -1
+    x71       c78               0.98   c270                 1
+    x72       OBJ           3.573778   c76                 -1
+    x72       c90               0.98   c174                 1
+    x73       OBJ           3.762717   c66               0.98
+    x73       c78                 -1   c250                 1
+    x74       OBJ           4.285317   c76               0.98
+    x74       c78                 -1   c172                 1
+    x75       OBJ           3.946967   c78                 -1
+    x75       c80               0.98   c266                 1
+    x76       OBJ           4.337578   c78                 -1
+    x76       c88               0.98   c170                 1
+    x77       OBJ           4.276607   c64               0.98
+    x77       c80                 -1   c246                 1
+    x78       OBJ           3.946967   c78               0.98
+    x78       c80                 -1   c168                 1
+    x79       OBJ           2.714838   c80                 -1
+    x79       c82               0.98   c262                 1
+    x80       OBJ              4.556   c80                 -1
+    x80       c86               0.98   c166                 1
+    x81       OBJ           2.714838   c80               0.98
+    x81       c82                 -1   c164                 1
+    x82       OBJ           4.397878   c82                 -1
+    x82       c84               0.98   c162                 1
+    x83       OBJ           4.060867   c82                 -1
+    x83       c242                 1
+    x84       OBJ           4.397878   c82               0.98
+    x84       c84                 -1   c260                 1
+    x85       OBJ           2.985518   c84                 -1
+    x85       c86               0.98   c184                 1
+    x86       OBJ              4.556   c80               0.98
+    x86       c86                 -1   c264                 1
+    x87       OBJ           2.985518   c84               0.98
+    x87       c86                 -1   c282                 1
+    x88       OBJ           5.672216   c86                 -1
+    x88       c88               0.98   c186                 1
+    x89       OBJ           4.337578   c78               0.98
+    x89       c88                 -1   c268                 1
+    x90       OBJ           5.672216   c86               0.98
+    x90       c88                 -1   c284                 1
+    x91       OBJ           6.280577   c88                 -1
+    x91       c90               0.98   c188                 1
+    x92       OBJ           3.573778   c76               0.98
+    x92       c90                 -1   c272                 1
+    x93       OBJ           6.280577   c88               0.98
+    x93       c90                 -1   c286                 1
+    x94       OBJ           4.728188   c90                 -1
+    x94       c92               0.98   c190                 1
+    x95       OBJ           2.178839   c74               0.98
+    x95       c92                 -1   c276                 1
+    x96       OBJ           4.728188   c90               0.98
+    x96       c92                 -1   c288                 1
+    x97       OBJ           2.384528   c92                 -1
+    x97       c94               0.98   c192                 1
+    x98       OBJ           1.727258   c72               0.98
+    x98       c94                 -1   c280                 1
+    x99       OBJ           2.384528   c92               0.98
+    x99       c94                 -1   c290                 1
+    x100      OBJ           3.449157   c3                   1
+    x100      c54               0.98   c230                 1
+    x101      OBJ           2.449518   c3                   1
+    x101      c64               0.98   c146                 1
+    x102      OBJ           4.060867   c3                   1
+    x102      c82               0.98   c144                 1
+    x103      OBJ            0.35136   c37                 -1
+    x103      c39               0.98   c99                  1
+    x104      OBJ           1.732319   c37                 -1
+    x104      c43               0.98   c97                  1
+    x105      OBJ            0.35136   c37               0.98
+    x105      c39                 -1   c197                 1
+    x106      OBJ           1.604159   c39                 -1
+    x106      c45               0.98   c101                 1
+    x107      OBJ            0.85968   c41                 -1
+    x107      c43               0.98   c207                 1
+    x108      OBJ           2.330278   c41                 -1
+    x108      c47               0.98   c111                 1
+    x109      OBJ           1.732319   c37               0.98
+    x109      c43                 -1   c195                 1
+    x110      OBJ            0.85968   c41               0.98
+    x110      c43                 -1   c109                 1
+    x111      OBJ             0.6102   c43                 -1
+    x111      c45               0.98   c201                 1
+    x112      OBJ           2.576519   c43                 -1
+    x112      c49               0.98   c107                 1
+    x113      OBJ           1.604159   c39               0.98
+    x113      c45                 -1   c199                 1
+    x114      OBJ             0.6102   c43               0.98
+    x114      c45                 -1   c103                 1
+    x115      OBJ           2.914559   c45                 -1
+    x115      c51               0.98   c105                 1
+    x116      OBJ           2.330278   c41               0.98
+    x116      c47                 -1   c209                 1
+    x117      OBJ           1.041479   c47                 -1
+    x117      c49               0.98   c211                 1
+    x118      OBJ           2.069279   c47                 -1
+    x118      c61               0.98   c125                 1
+    x119      OBJ           2.576519   c43               0.98
+    x119      c49                 -1   c205                 1
+    x120      OBJ           1.041479   c47               0.98
+    x120      c49                 -1   c113                 1
+    x121      OBJ             0.9108   c49                 -1
+    x121      c51               0.98   c115                 1
+    x122      OBJ           2.306879   c49                 -1
+    x122      c59               0.98   c123                 1
+    x123      OBJ           2.914559   c45               0.98
+    x123      c51                 -1   c203                 1
+    x124      OBJ             0.9108   c49               0.98
+    x124      c51                 -1   c213                 1
+    x125      OBJ            0.78516   c51                 -1
+    x125      c53               0.98   c117                 1
+    x126      OBJ           2.032559   c51                 -1
+    x126      c57               0.98   c121                 1
+    x127      OBJ            0.78516   c51               0.98
+    x127      c53                 -1   c215                 1
+    x128      OBJ           1.823039   c53                 -1
+    x128      c55               0.98   c119                 1
+    x129      OBJ           1.823039   c53               0.98
+    x129      c55                 -1   c217                 1
+    x130      OBJ           1.144079   c55                 -1
+    x130      c57               0.98   c127                 1
+    x131      OBJ           1.853279   c55                 -1
+    x131      c133                 1
+    x132      OBJ           2.032559   c51               0.98
+    x132      c57                 -1   c219                 1
+    x133      OBJ           1.144079   c55               0.98
+    x133      c57                 -1   c225                 1
+    x134      OBJ              1.233   c57                 -1
+    x134      c59               0.98   c129                 1
+    x135      OBJ             1.8144   c57                 -1
+    x135      c65               0.98   c135                 1
+    x136      OBJ           2.306879   c49               0.98
+    x136      c59                 -1   c221                 1
+    x137      OBJ              1.233   c57               0.98
+    x137      c59                 -1   c227                 1
+    x138      OBJ            1.11132   c59                 -1
+    x138      c61               0.98   c131                 1
+    x139      OBJ           1.669679   c59                 -1
+    x139      c67               0.98   c137                 1
+    x140      OBJ           2.069279   c47               0.98
+    x140      c61                 -1   c223                 1
+    x141      OBJ            1.11132   c59               0.98
+    x141      c61                 -1   c229                 1
+    x142      OBJ              0.657   c61                 -1
+    x142      c63               0.98   c141                 1
+    x143      OBJ           1.409039   c61                 -1
+    x143      c69               0.98   c139                 1
+    x144      OBJ              0.657   c61               0.98
+    x144      c63                 -1   c239                 1
+    x145      OBJ            1.21032   c63                 -1
+    x145      c71               0.98   c143                 1
+    x146      OBJ             1.8144   c57               0.98
+    x146      c65                 -1   c233                 1
+    x147      OBJ           1.348919   c65                 -1
+    x147      c67               0.98   c151                 1
+    x148      OBJ           2.297879   c65                 -1
+    x148      c81               0.98   c149                 1
+    x149      OBJ           1.316159   c65                 -1
+    x149      c245                 1
+    x150      OBJ           1.669679   c59               0.98
+    x150      c67                 -1   c235                 1
+    x151      OBJ           1.348919   c65               0.98
+    x151      c67                 -1   c249                 1
+    x152      OBJ             1.3842   c67                 -1
+    x152      c69               0.98   c155                 1
+    x153      OBJ           2.021759   c67                 -1
+    x153      c79               0.98   c153                 1
+    x154      OBJ           1.409039   c61               0.98
+    x154      c69                 -1   c237                 1
+    x155      OBJ             1.3842   c67               0.98
+    x155      c69                 -1   c253                 1
+    x156      OBJ           1.106639   c69                 -1
+    x156      c71               0.98   c159                 1
+    x157      OBJ             1.5624   c69                 -1
+    x157      c77               0.98   c157                 1
+    x158      OBJ            1.21032   c63               0.98
+    x158      c71                 -1   c241                 1
+    x159      OBJ           1.106639   c69               0.98
+    x159      c71                 -1   c257                 1
+    x160      OBJ             1.0548   c71                 -1
+    x160      c75               0.98   c161                 1
+    x161      OBJ           0.965879   c73                 -1
+    x161      c75               0.98   c279                 1
+    x162      OBJ           0.928079   c73                 -1
+    x162      c95               0.98   c183                 1
+    x163      OBJ             1.0548   c71               0.98
+    x163      c75                 -1   c259                 1
+    x164      OBJ           0.965879   c73               0.98
+    x164      c75                 -1   c181                 1
+    x165      OBJ            1.52712   c75                 -1
+    x165      c77               0.98   c275                 1
+    x166      OBJ           1.170719   c75                 -1
+    x166      c93               0.98   c179                 1
+    x167      OBJ             1.5624   c69               0.98
+    x167      c77                 -1   c255                 1
+    x168      OBJ            1.52712   c75               0.98
+    x168      c77                 -1   c177                 1
+    x169      OBJ           2.302559   c77                 -1
+    x169      c79               0.98   c271                 1
+    x170      OBJ           1.920239   c77                 -1
+    x170      c91               0.98   c175                 1
+    x171      OBJ           2.021759   c67               0.98
+    x171      c79                 -1   c251                 1
+    x172      OBJ           2.302559   c77               0.98
+    x172      c79                 -1   c173                 1
+    x173      OBJ           2.120759   c79                 -1
+    x173      c81               0.98   c267                 1
+    x174      OBJ           2.330639   c79                 -1
+    x174      c89               0.98   c171                 1
+    x175      OBJ           2.297879   c65               0.98
+    x175      c81                 -1   c247                 1
+    x176      OBJ           2.120759   c79               0.98
+    x176      c81                 -1   c169                 1
+    x177      OBJ           1.458719   c81                 -1
+    x177      c83               0.98   c263                 1
+    x178      OBJ              2.448   c81                 -1
+    x178      c87               0.98   c167                 1
+    x179      OBJ           1.458719   c81               0.98
+    x179      c83                 -1   c165                 1
+    x180      OBJ           2.363039   c83                 -1
+    x180      c85               0.98   c163                 1
+    x181      OBJ           2.181959   c83                 -1
+    x181      c243                 1
+    x182      OBJ           2.363039   c83               0.98
+    x182      c85                 -1   c261                 1
+    x183      OBJ           1.604159   c85                 -1
+    x183      c87               0.98   c185                 1
+    x184      OBJ              2.448   c81               0.98
+    x184      c87                 -1   c265                 1
+    x185      OBJ           1.604159   c85               0.98
+    x185      c87                 -1   c283                 1
+    x186      OBJ           3.047759   c87                 -1
+    x186      c89               0.98   c187                 1
+    x187      OBJ           2.330639   c79               0.98
+    x187      c89                 -1   c269                 1
+    x188      OBJ           3.047759   c87               0.98
+    x188      c89                 -1   c285                 1
+    x189      OBJ            3.37464   c89                 -1
+    x189      c91               0.98   c189                 1
+    x190      OBJ           1.920239   c77               0.98
+    x190      c91                 -1   c273                 1
+    x191      OBJ            3.37464   c89               0.98
+    x191      c91                 -1   c287                 1
+    x192      OBJ            2.54052   c91                 -1
+    x192      c93               0.98   c191                 1
+    x193      OBJ           1.170719   c75               0.98
+    x193      c93                 -1   c277                 1
+    x194      OBJ            2.54052   c91               0.98
+    x194      c93                 -1   c289                 1
+    x195      OBJ            1.28124   c93                 -1
+    x195      c95               0.98   c193                 1
+    x196      OBJ           0.928079   c73               0.98
+    x196      c95                 -1   c281                 1
+    x197      OBJ            1.28124   c93               0.98
+    x197      c95                 -1   c291                 1
+    x198      OBJ           1.853279   c4                   1
+    x198      c55               0.98   c231                 1
+    x199      OBJ           1.316159   c4                   1
+    x199      c65               0.98   c147                 1
+    x200      OBJ           2.181959   c4                   1
+    x200      c83               0.98   c145                 1
+    MARK0000  'MARKER'                 'INTORG'
+    x201      OBJ        15061.55078   c96             -17360
+    x201      c194            -17360
+    x202      OBJ        9479.636719   c97             -17360
+    x202      c195            -17360
+    x203      OBJ        3054.878418   c98             -17360
+    x203      c196            -17360
+    x204      OBJ        1922.719482   c99             -17360
+    x204      c197            -17360
+    x205      OBJ        13947.26953   c100            -17360
+    x205      c198            -17360
+    x206      OBJ          8778.3125   c101            -17360
+    x206      c199            -17360
+    x207      OBJ        5305.347656   c102            -17360
+    x207      c200            -17360
+    x208      OBJ        3339.149414   c103            -17360
+    x208      c201            -17360
+    x209      OBJ        25340.46484   c104            -17360
+    x209      c202            -17360
+    x210      OBJ        15949.11328   c105            -17360
+    x210      c203            -17360
+    x211      OBJ        22401.39844   c106            -17360
+    x211      c204            -17360
+    x212      OBJ        14099.28516   c107            -17360
+    x212      c205            -17360
+    x213      OBJ        7474.433594   c108            -17360
+    x213      c206            -17360
+    x214      OBJ        4704.355469   c109            -17360
+    x214      c207            -17360
+    x215      OBJ        20260.47266   c110            -17360
+    x215      c208            -17360
+    x216      OBJ        12751.80078   c111            -17360
+    x216      c209            -17360
+    x217      OBJ        9055.078125   c112            -17360
+    x217      c210            -17360
+    x218      OBJ        5699.203125   c113            -17360
+    x218      c211            -17360
+    x219      OBJ        7918.894531   c114            -17360
+    x219      c212            -17360
+    x220      OBJ        4984.097656   c115            -17360
+    x220      c213            -17360
+    x221      OBJ        6826.523438   c116            -17360
+    x221      c214            -17360
+    x222      OBJ        4296.566406   c117            -17360
+    x222      c215            -17360
+    x223      OBJ        15850.30859   c118            -17360
+    x223      c216            -17360
+    x224      OBJ        9976.074219   c119            -17360
+    x224      c217            -17360
+    x225      OBJ        17671.96484   c120            -17360
+    x225      c218            -17360
+    x226      OBJ        11122.61328   c121            -17360
+    x226      c219            -17360
+    x227      OBJ        20057.02344   c122            -17360
+    x227      c220            -17360
+    x228      OBJ        12623.75391   c123            -17360
+    x228      c221            -17360
+    x229      OBJ        17991.22656   c124            -17360
+    x229      c222            -17360
+    x230      OBJ        11323.55078   c125            -17360
+    x230      c223            -17360
+    x231      OBJ        9947.128906   c126            -17360
+    x231      c224            -17360
+    x232      OBJ        6260.652344   c127            -17360
+    x232      c225            -17360
+    x233      OBJ        10720.24219   c128            -17360
+    x233      c226            -17360
+    x234      OBJ        6747.246094   c129            -17360
+    x234      c227            -17360
+    x235      OBJ        9662.304688   c130            -17360
+    x235      c228            -17360
+    x236      OBJ        6081.386719   c131            -17360
+    x236      c229            -17360
+    x237      OBJ        16113.22656   c132            -17360
+    x237      c230            -17360
+    x238      OBJ        10141.55078   c133            -17360
+    x238      c231            -17360
+    x239      OBJ        15775.19141   c134            -17360
+    x239      c232            -17360
+    x240      OBJ        9928.796875   c135            -17360
+    x240      c233            -17360
+    x241      OBJ        14516.92578   c136            -17360
+    x241      c234            -17360
+    x242      OBJ        9136.851563   c137            -17360
+    x242      c235            -17360
+    x243      OBJ        12250.80859   c138            -17360
+    x243      c236            -17360
+    x244      OBJ        7710.574219   c139            -17360
+    x244      c237            -17360
+    x245      OBJ        5712.246094   c140            -17360
+    x245      c238            -17360
+    x246      OBJ        3595.249268   c141            -17360
+    x246      c239            -17360
+    x247      OBJ        10523.05078   c142            -17360
+    x247      c240            -17360
+    x248      OBJ        6623.136719   c143            -17360
+    x248      c241            -17360
+    x249      OBJ        18970.91797   c144            -17360
+    x249      c242            -17360
+    x250      OBJ        11940.16406   c145            -17360
+    x250      c243            -17360
+    x251      OBJ        11443.26953   c146            -17360
+    x251      c244            -17360
+    x252      OBJ          7202.3125   c147            -17360
+    x252      c245            -17360
+    x253      OBJ        19978.77344   c148            -17360
+    x253      c246            -17360
+    x254      OBJ        12574.50391   c149            -17360
+    x254      c247            -17360
+    x255      OBJ        11728.10156   c150            -17360
+    x255      c248            -17360
+    x256      OBJ        7381.585938   c151            -17360
+    x256      c249            -17360
+    x257      OBJ        17578.06641   c152            -17360
+    x257      c250            -17360
+    x258      OBJ        11063.51172   c153            -17360
+    x258      c251            -17360
+    x259      OBJ        12034.84375   c154            -17360
+    x259      c252            -17360
+    x260      OBJ        7574.648438   c155            -17360
+    x260      c253            -17360
+    x261      OBJ        13584.19141   c156            -17360
+    x261      c254            -17360
+    x262      OBJ        8549.796875   c157            -17360
+    x262      c255            -17360
+    x263      OBJ        9621.609375   c158            -17360
+    x263      c256            -17360
+    x264      OBJ        6055.773438   c159            -17360
+    x264      c257            -17360
+    x265      OBJ        9170.894531   c160            -17360
+    x265      c258            -17360
+    x266      OBJ        5772.097656   c161            -17360
+    x266      c259            -17360
+    x267      OBJ        20545.30859   c162            -17360
+    x267      c260            -17360
+    x268      OBJ        12931.07422   c163            -17360
+    x268      c261            -17360
+    x269      OBJ           12682.75   c164            -17360
+    x269      c262            -17360
+    x270      OBJ          7982.4375   c165            -17360
+    x270      c263            -17360
+    x271      OBJ        21283.98828   c166            -17360
+    x271      c264            -17360
+    x272      OBJ        13395.99609   c167            -17360
+    x272      c265            -17360
+    x273      OBJ        18438.81641   c168            -17360
+    x273      c266            -17360
+    x274      OBJ        11605.26172   c169            -17360
+    x274      c267            -17360
+    x275      OBJ        20263.60547   c170            -17360
+    x275      c268            -17360
+    x276      OBJ        12753.77344   c171            -17360
+    x276      c269            -17360
+    x277      OBJ        20019.46484   c172            -17360
+    x277      c270            -17360
+    x278      OBJ        12600.11328   c173            -17360
+    x278      c271            -17360
+    x279      OBJ        16695.41016   c174            -17360
+    x279      c272            -17360
+    x280      OBJ        10507.97266   c175            -17360
+    x280      c273            -17360
+    x281      OBJ        13277.45313   c176            -17360
+    x281      c274            -17360
+    x282      OBJ        8356.734375   c177            -17360
+    x282      c275            -17360
+    x283      OBJ        10178.75391   c178            -17360
+    x283      c276            -17360
+    x284      OBJ          6406.4375   c179            -17360
+    x284      c277            -17360
+    x285      OBJ        8397.777344   c180            -17360
+    x285      c278            -17360
+    x286      OBJ        5285.503906   c181            -17360
+    x286      c279            -17360
+    x287      OBJ        8069.128906   c182            -17360
+    x287      c280            -17360
+    x288      OBJ        5078.652344   c183            -17360
+    x288      c281            -17360
+    x289      OBJ        13947.26953   c184            -17360
+    x289      c282            -17360
+    x290      OBJ          8778.3125   c185            -17360
+    x290      c283            -17360
+    x291      OBJ         26498.5625   c186            -17360
+    x291      c284            -17360
+    x292      OBJ        16678.01172   c187            -17360
+    x292      c285            -17360
+    x293      OBJ        29340.60547   c188            -17360
+    x293      c286            -17360
+    x294      OBJ        18466.77344   c189            -17360
+    x294      c287            -17360
+    x295      OBJ        22088.39844   c190            -17360
+    x295      c288            -17360
+    x296      OBJ        13902.28516   c191            -17360
+    x296      c289            -17360
+    x297      OBJ        11139.66016   c192            -17360
+    x297      c290            -17360
+    x298      OBJ        7011.226563   c193            -17360
+    x298      c291            -17360
+    MARK0001  'MARKER'                 'INTEND'
+    x299      OBJ         935.779785   c5                   1
+    x299      c36          -1.197604
+    x300      OBJ          590.19458   c6                   1
+    x300      c38          -1.197604
+    x301      OBJ         586.431152   c7                   1
+    x301      c40          -1.197604
+    x302      OBJ         586.384521   c8                   1
+    x302      c42          -1.197604
+    x303      OBJ         585.222412   c9                   1
+    x303      c44          -1.197604
+    x304      OBJ           584.8667   c10                  1
+    x304      c46          -1.197604
+    x305      OBJ         584.592285   c11                  1
+    x305      c48          -1.197604
+    x306      OBJ         586.196533   c12                  1
+    x306      c50          -1.197604
+    x307      OBJ         607.073486   c13                  1
+    x307      c52          -1.197604
+    x308      OBJ         593.749756   c14                  1
+    x308      c54          -1.197604
+    x309      OBJ          585.37793   c15                  1
+    x309      c56          -1.197604
+    x310      OBJ         584.541016   c16                  1
+    x310      c58          -1.197604
+    x311      OBJ         585.455078   c17                  1
+    x311      c60          -1.197604
+    x312      OBJ         587.869385   c18                  1
+    x312      c62          -1.197604
+    x313      OBJ         584.969482   c19                  1
+    x313      c64          -1.197604
+    x314      OBJ         584.601318   c20                  1
+    x314      c66          -1.197604
+    x315      OBJ         585.421143   c21                  1
+    x315      c68          -1.197604
+    x316      OBJ         586.946777   c22                  1
+    x316      c70          -1.197604
+    x317      OBJ         592.529541   c23                  1
+    x317      c72          -1.197604
+    x318      OBJ         585.983643   c24                  1
+    x318      c74          -1.197604
+    x319      OBJ         585.921387   c25                  1
+    x319      c76          -1.197604
+    x320      OBJ         586.138184   c26                  1
+    x320      c78          -1.197604
+    x321      OBJ         585.365967   c27                  1
+    x321      c80          -1.197604
+    x322      OBJ           593.9563   c28                  1
+    x322      c82          -1.197604
+    x323      OBJ         586.775391   c29                  1
+    x323      c84          -1.197604
+    x324      OBJ         590.526367   c30                  1
+    x324      c86          -1.197604
+    x325      OBJ         588.990479   c31                  1
+    x325      c88          -1.197604
+    x326      OBJ         628.276367   c32                  1
+    x326      c90          -1.197604
+    x327      OBJ         589.911133   c33                  1
+    x327      c92          -1.197604
+    x328      OBJ         590.110107   c34                  1
+    x328      c94          -1.197604
+    x329      OBJ         585.704346   c3            1.197604
+    x329      c35                  1
+    x330      OBJ         994.519775   c5                   1
+    x330      c37          -1.503759
+    x331      OBJ         764.129639   c6                   1
+    x331      c39          -1.503759
+    x332      OBJ          761.62085   c7                   1
+    x332      c41          -1.503759
+    x333      OBJ           761.5896   c8                   1
+    x333      c43          -1.503759
+    x334      OBJ         760.814697   c9                   1
+    x334      c45          -1.503759
+    x335      OBJ         760.577881   c10                  1
+    x335      c47          -1.503759
+    x336      OBJ         760.394287   c11                  1
+    x336      c49          -1.503759
+    x337      OBJ         761.463867   c12                  1
+    x337      c51          -1.503759
+    x338      OBJ          775.38208   c13                  1
+    x338      c53          -1.503759
+    x339      OBJ         766.499756   c14                  1
+    x339      c55          -1.503759
+    x340      OBJ         760.918457   c15                  1
+    x340      c57          -1.503759
+    x341      OBJ         760.360107   c16                  1
+    x341      c59          -1.503759
+    x342      OBJ         760.969971   c17                  1
+    x342      c61          -1.503759
+    x343      OBJ         762.579346   c18                  1
+    x343      c63          -1.503759
+    x344      OBJ          760.64624   c19                  1
+    x344      c65          -1.503759
+    x345      OBJ              760.4   c20                  1
+    x345      c67          -1.503759
+    x346      OBJ         760.947021   c21                  1
+    x346      c69          -1.503759
+    x347      OBJ         761.964355   c22                  1
+    x347      c71          -1.503759
+    x348      OBJ         765.686279   c23                  1
+    x348      c73          -1.503759
+    x349      OBJ         761.322021   c24                  1
+    x349      c75          -1.503759
+    x350      OBJ         761.280518   c25                  1
+    x350      c77          -1.503759
+    x351      OBJ         761.425293   c26                  1
+    x351      c79          -1.503759
+    x352      OBJ           760.9104   c27                  1
+    x352      c81          -1.503759
+    x353      OBJ         766.636475   c28                  1
+    x353      c83          -1.503759
+    x354      OBJ         761.849609   c29                  1
+    x354      c85          -1.503759
+    x355      OBJ          764.35083   c30                  1
+    x355      c87          -1.503759
+    x356      OBJ          763.32666   c31                  1
+    x356      c89          -1.503759
+    x357      OBJ         789.517578   c32                  1
+    x357      c91          -1.503759
+    x358      OBJ         763.940186   c33                  1
+    x358      c93          -1.503759
+    x359      OBJ         764.072754   c34                  1
+    x359      c95          -1.503759
+    x360      OBJ         761.135986   c4            1.503759
+    x360      c35                  1
+    x361      OBJ              40996   c5                   1
+    x362      OBJ              40996   c6                   1
+    x363      OBJ        40995.97266   c7                   1
+    x364      OBJ        40995.97656   c8                   1
+    x365      OBJ        40995.99609   c9                   1
+    x366      OBJ        40995.99219   c10                  1
+    x367      OBJ        40995.99609   c11                  1
+    x368      OBJ        40995.99219   c12                  1
+    x369      OBJ        40995.99609   c13                  1
+    x370      OBJ        40995.99609   c14                  1
+    x371      OBJ        40995.97266   c15                  1
+    x372      OBJ        40995.99609   c16                  1
+    x373      OBJ        40995.98438   c17                  1
+    x374      OBJ        40995.99609   c18                  1
+    x375      OBJ        40995.98828   c19                  1
+    x376      OBJ        40995.99609   c20                  1
+    x377      OBJ        40995.99219   c21                  1
+    x378      OBJ        40995.99609   c22                  1
+    x379      OBJ              40996   c23                  1
+    x380      OBJ        40995.99609   c24                  1
+    x381      OBJ        40995.97656   c25                  1
+    x382      OBJ        40995.98438   c26                  1
+    x383      OBJ        40995.98047   c27                  1
+    x384      OBJ        40995.98828   c28                  1
+    x385      OBJ        40995.98828   c29                  1
+    x386      OBJ        40995.99219   c30                  1
+    x387      OBJ        40995.98828   c31                  1
+    x388      OBJ              40996   c32                  1
+    x389      OBJ        40995.99609   c33                  1
+    x390      OBJ        40995.99609   c34                  1
+    x391      OBJ        40995.98047   c35                  1
+    x392      OBJ           2184.375   c5                   1
+    x393      OBJ           2184.375   c6                   1
+    x394      OBJ           2184.375   c7                   1
+    x395      OBJ        2184.374268   c8                   1
+    x396      OBJ        2184.374512   c9                   1
+    x397      OBJ           2184.375   c10                  1
+    x398      OBJ        2184.374512   c11                  1
+    x399      OBJ        2184.374512   c12                  1
+    x400      OBJ        2184.374512   c13                  1
+    x401      OBJ        2184.373779   c14                  1
+    x402      OBJ        2184.374268   c15                  1
+    x403      OBJ        2184.374268   c16                  1
+    x404      OBJ        2184.374268   c17                  1
+    x405      OBJ        2184.374512   c18                  1
+    x406      OBJ        2184.374512   c19                  1
+    x407      OBJ        2184.374512   c20                  1
+    x408      OBJ        2184.374268   c21                  1
+    x409      OBJ        2184.374512   c22                  1
+    x410      OBJ           2184.375   c23                  1
+    x411      OBJ        2184.374268   c24                  1
+    x412      OBJ        2184.374512   c25                  1
+    x413      OBJ        2184.374512   c26                  1
+    x414      OBJ        2184.374512   c27                  1
+    x415      OBJ        2184.374268   c28                  1
+    x416      OBJ        2184.374512   c29                  1
+    x417      OBJ        2184.374512   c30                  1
+    x418      OBJ        2184.374512   c31                  1
+    x419      OBJ           2184.375   c32                  1
+    x420      OBJ        2184.374512   c33                  1
+    x421      OBJ        2184.374512   c34                  1
+    x422      OBJ        2184.374268   c35                  1
+RHS
+    rhs       c5                 1.5   c6                  69
+    rhs       c7               520.5   c8          495.299805
+    rhs       c9          754.099854   c10             1198.5
+    rhs       c11        2188.799805   c12              594.4
+    rhs       c13               51.4   c14               75.6
+    rhs       c15         563.099854   c16        1533.099854
+    rhs       c17         556.299805   c18              167.8
+    rhs       c19         975.799805   c20             1642.9
+    rhs       c21         347.099854   c22         262.799805
+    rhs       c23                 62   c24              395.9
+    rhs       c25              691.7   c26              936.7
+    rhs       c27         791.099854   c28              106.7
+    rhs       c29              393.7   c30              173.7
+    rhs       c31              466.2   c32                 34
+    rhs       c33              116.9   c34              103.4
+    rhs       c35         552.099854
+BOUNDS
+ UP bnd       x201                 1
+ UP bnd       x202                 1
+ UP bnd       x203                 1
+ UP bnd       x204                 1
+ UP bnd       x205                 1
+ UP bnd       x206                 1
+ UP bnd       x207                 1
+ UP bnd       x208                 1
+ UP bnd       x209                 1
+ UP bnd       x210                 1
+ UP bnd       x211                 1
+ UP bnd       x212                 1
+ UP bnd       x213                 1
+ UP bnd       x214                 1
+ UP bnd       x215                 1
+ UP bnd       x216                 1
+ UP bnd       x217                 1
+ UP bnd       x218                 1
+ UP bnd       x219                 1
+ UP bnd       x220                 1
+ UP bnd       x221                 1
+ UP bnd       x222                 1
+ UP bnd       x223                 1
+ UP bnd       x224                 1
+ UP bnd       x225                 1
+ UP bnd       x226                 1
+ UP bnd       x227                 1
+ UP bnd       x228                 1
+ UP bnd       x229                 1
+ UP bnd       x230                 1
+ UP bnd       x231                 1
+ UP bnd       x232                 1
+ UP bnd       x233                 1
+ UP bnd       x234                 1
+ UP bnd       x235                 1
+ UP bnd       x236                 1
+ UP bnd       x237                 1
+ UP bnd       x238                 1
+ UP bnd       x239                 1
+ UP bnd       x240                 1
+ UP bnd       x241                 1
+ UP bnd       x242                 1
+ UP bnd       x243                 1
+ UP bnd       x244                 1
+ UP bnd       x245                 1
+ UP bnd       x246                 1
+ UP bnd       x247                 1
+ UP bnd       x248                 1
+ UP bnd       x249                 1
+ UP bnd       x250                 1
+ UP bnd       x251                 1
+ UP bnd       x252                 1
+ UP bnd       x253                 1
+ UP bnd       x254                 1
+ UP bnd       x255                 1
+ UP bnd       x256                 1
+ UP bnd       x257                 1
+ UP bnd       x258                 1
+ UP bnd       x259                 1
+ UP bnd       x260                 1
+ UP bnd       x261                 1
+ UP bnd       x262                 1
+ UP bnd       x263                 1
+ UP bnd       x264                 1
+ UP bnd       x265                 1
+ UP bnd       x266                 1
+ UP bnd       x267                 1
+ UP bnd       x268                 1
+ UP bnd       x269                 1
+ UP bnd       x270                 1
+ UP bnd       x271                 1
+ UP bnd       x272                 1
+ UP bnd       x273                 1
+ UP bnd       x274                 1
+ UP bnd       x275                 1
+ UP bnd       x276                 1
+ UP bnd       x277                 1
+ UP bnd       x278                 1
+ UP bnd       x279                 1
+ UP bnd       x280                 1
+ UP bnd       x281                 1
+ UP bnd       x282                 1
+ UP bnd       x283                 1
+ UP bnd       x284                 1
+ UP bnd       x285                 1
+ UP bnd       x286                 1
+ UP bnd       x287                 1
+ UP bnd       x288                 1
+ UP bnd       x289                 1
+ UP bnd       x290                 1
+ UP bnd       x291                 1
+ UP bnd       x292                 1
+ UP bnd       x293                 1
+ UP bnd       x294                 1
+ UP bnd       x295                 1
+ UP bnd       x296                 1
+ UP bnd       x297                 1
+ UP bnd       x298                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/noswot.mps b/demos/ppl_lpsol/examples/noswot.mps
new file mode 100644
index 0000000..bf3f987
--- /dev/null
+++ b/demos/ppl_lpsol/examples/noswot.mps
@@ -0,0 +1,729 @@
+NAME           noswot
+ROWS
+ N  1       
+ L  c1      
+ L  c2      
+ L  c3      
+ L  c4      
+ L  c5      
+ L  c6      
+ G  c7      
+ L  c8      
+ G  c9      
+ L  c10     
+ G  c11     
+ L  c12     
+ G  c13     
+ L  c14     
+ G  c15     
+ L  c16     
+ G  c17     
+ G  c18     
+ G  c19     
+ G  c20     
+ G  c21     
+ G  c22     
+ G  c23     
+ G  c24     
+ G  c25     
+ G  c26     
+ G  c27     
+ G  c28     
+ G  c29     
+ G  c30     
+ G  c31     
+ G  c32     
+ G  c33     
+ G  c34     
+ G  c35     
+ G  c36     
+ G  c37     
+ G  c38     
+ G  c39     
+ G  c40     
+ G  c41     
+ G  c42     
+ G  c43     
+ G  c44     
+ G  c45     
+ G  c46     
+ G  c47     
+ G  c48     
+ G  c49     
+ G  c50     
+ G  c51     
+ G  c52     
+ G  c53     
+ G  c54     
+ G  c55     
+ G  c56     
+ L  c57     
+ L  c58     
+ L  c59     
+ L  c60     
+ L  c61     
+ L  c62     
+ G  c63     
+ L  c64     
+ G  c65     
+ L  c66     
+ G  c67     
+ L  c68     
+ G  c69     
+ L  c70     
+ G  c71     
+ L  c72     
+ G  c73     
+ G  c74     
+ G  c75     
+ G  c76     
+ G  c77     
+ G  c78     
+ G  c79     
+ G  c80     
+ G  c81     
+ G  c82     
+ G  c83     
+ G  c84     
+ G  c85     
+ G  c86     
+ G  c87     
+ G  c88     
+ G  c89     
+ G  c90     
+ G  c91     
+ G  c92     
+ G  c93     
+ G  c94     
+ G  c95     
+ G  c96     
+ G  c97     
+ G  c98     
+ G  c99     
+ G  c100    
+ G  c101    
+ G  c102    
+ G  c103    
+ L  c104    
+ L  c105    
+ L  c106    
+ L  c107    
+ L  c108    
+ L  c109    
+ G  c110    
+ L  c111    
+ G  c112    
+ L  c113    
+ G  c114    
+ L  c115    
+ G  c116    
+ L  c117    
+ G  c118    
+ L  c119    
+ G  c120    
+ G  c121    
+ G  c122    
+ G  c123    
+ G  c124    
+ G  c125    
+ G  c126    
+ G  c127    
+ G  c128    
+ G  c129    
+ G  c130    
+ G  c131    
+ G  c132    
+ G  c133    
+ G  c134    
+ G  c135    
+ G  c136    
+ G  c137    
+ G  c138    
+ G  c139    
+ L  c140    
+ L  c141    
+ L  c142    
+ L  c143    
+ L  c144    
+ L  c145    
+ G  c146    
+ E  c147    
+ G  c148    
+ E  c149    
+ G  c150    
+ L  c151    
+ G  c152    
+ L  c153    
+ G  c154    
+ L  c155    
+ G  c156    
+ G  c157    
+ G  c158    
+ G  c159    
+ G  c160    
+ G  c161    
+ G  c162    
+ G  c163    
+ G  c164    
+ G  c165    
+ L  c166    
+ L  c167    
+ L  c168    
+ L  c169    
+ L  c170    
+ L  c171    
+ G  c172    
+ L  c173    
+ G  c174    
+ L  c175    
+ G  c176    
+ L  c177    
+ G  c178    
+ L  c179    
+ G  c180    
+ L  c181    
+ L  c182    
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        c17                 21   c18                -21
+    x2        c19                 21   c20                -21
+    x3        c21                 21   c22                -21
+    x4        c23                 21   c24                -21
+    x5        c25                 21   c26                -21
+    x6        c27                 21   c28                -21
+    x7        c29                 21   c30                -21
+    x8        c31                 21   c32                -21
+    x9        c33                 21   c34                -21
+    x10       c35                 21   c36                -21
+    x11       c37                 21   c38                -21
+    x12       c39                 21   c40                -21
+    x13       c41                 21   c42                -21
+    x14       c43                 21   c44                -21
+    x15       c45                 21   c46                -21
+    x16       c47                 21   c48                -21
+    x17       c49                 21   c50                -21
+    x18       c51                 21   c52                -21
+    x19       c53                 21   c54                -21
+    x20       c55                 21   c56                -21
+    x21       c73                 21   c74                -21
+    x22       c75                 21   c76                -21
+    x23       c77                 21   c78                -21
+    x24       c79                 21   c80                -21
+    x25       c81                 21   c82                -21
+    x26       c83                 21   c84                -21
+    x27       c85                 21   c86                -21
+    x28       c87                 21   c88                -21
+    x29       c89                 21   c90                -21
+    x30       c91                 21   c92                -21
+    x31       c93                 21   c94                -21
+    x32       c95                 21   c96                -21
+    x33       c97                 21   c98                -21
+    x34       c99                 21   c100               -21
+    x35       c101                21   c102               -21
+    x36       c120                21   c121               -21
+    x37       c122                21   c123               -21
+    x38       c124                21   c125               -21
+    x39       c126                21   c127               -21
+    x40       c128                21   c129               -21
+    x41       c130                21   c131               -21
+    x42       c132                21   c133               -21
+    x43       c134                21   c135               -21
+    x44       c136                21   c137               -21
+    x45       c138                21   c139               -21
+    x46       c156                21   c157               -21
+    x47       c158                21   c159               -21
+    x48       c160                21   c161               -21
+    x49       c162                21   c163               -21
+    x50       c164                21   c165               -21
+    x51       c2                 -20   c7                  -1
+    x51       c8          -9.6000004   c18              -0.75
+    x51       c28        -0.66670000   c38              -0.25
+    x51       c48              -0.25
+    x52       1                   -1   c1                   1
+    x52       c2           2.0833001   c7                   1
+    x52       c8                   1   c18         -2.0833001
+    x52       c28         -2.0833001   c38         -2.0833001
+    x52       c48         -2.0833001   c57                  1
+    x53       c3                 -20   c9                  -1
+    x53       c10         -9.6000004   c20              -0.75
+    x53       c30        -0.66670000   c40              -0.25
+    x53       c50              -0.25
+    x54       1                   -1   c1                   1
+    x54       c3           2.0833001   c9                   1
+    x54       c10                  1   c20         -2.0833001
+    x54       c30         -2.0833001   c40         -2.0833001
+    x54       c50         -2.0833001   c57                  1
+    x55       c4                 -20   c11                 -1
+    x55       c12         -9.6000004   c22              -0.75
+    x55       c32        -0.66670000   c42              -0.25
+    x55       c52              -0.25
+    x56       1                   -1   c1                   1
+    x56       c4           2.0833001   c11                  1
+    x56       c12                  1   c22         -2.0833001
+    x56       c32         -2.0833001   c42         -2.0833001
+    x56       c52         -2.0833001   c57                  1
+    x57       c5                 -20   c13                 -1
+    x57       c14         -9.6000004   c24              -0.75
+    x57       c34        -0.66670000   c44              -0.25
+    x57       c54              -0.25
+    x58       1                   -1   c1                   1
+    x58       c5           2.0833001   c13                  1
+    x58       c14                  1   c24         -2.0833001
+    x58       c34         -2.0833001   c44         -2.0833001
+    x58       c54         -2.0833001   c57                  1
+    x59       c6                 -16   c15                 -1
+    x59       c16         -7.6799998   c26              -0.75
+    x59       c36        -0.66670000   c46              -0.25
+    x59       c56              -0.25
+    x60       1                   -1   c1                   1
+    x60       c6           2.0833001   c15                  1
+    x60       c16                  1   c26         -2.0833001
+    x60       c36         -2.0833001   c46         -2.0833001
+    x60       c56         -2.0833001   c57                  1
+    x61       c17        -0.66670000   c58                -20
+    x61       c63                 -1   c64         -6.7199998
+    x61       c74        -0.66670000   c84        -0.66670000
+    x61       c94        -0.66670000
+    x62       1                   -1   c1                   1
+    x62       c17         -2.9762001   c58          2.9762001
+    x62       c63                  1   c64                  1
+    x62       c74         -2.9762001   c84         -2.9762001
+    x62       c94         -2.9762001   c103                 1
+    x62       c104                 1
+    x63       c19        -0.66670000   c59                -20
+    x63       c65                 -1   c66         -6.7199998
+    x63       c76        -0.66670000   c86        -0.66670000
+    x63       c96        -0.66670000
+    x64       1                   -1   c1                   1
+    x64       c19         -2.9762001   c59          2.9762001
+    x64       c65                  1   c66                  1
+    x64       c76         -2.9762001   c86         -2.9762001
+    x64       c96         -2.9762001   c103                 1
+    x64       c104                 1
+    x65       c21        -0.66670000   c60                -20
+    x65       c67                 -1   c68         -6.7199998
+    x65       c78        -0.66670000   c88        -0.66670000
+    x65       c98        -0.66670000
+    x66       1                   -1   c1                   1
+    x66       c21         -2.9762001   c60          2.9762001
+    x66       c67                  1   c68                  1
+    x66       c78         -2.9762001   c88         -2.9762001
+    x66       c98         -2.9762001   c103                 1
+    x66       c104                 1
+    x67       c23        -0.66670000   c61                -20
+    x67       c69                 -1   c70         -6.7199998
+    x67       c80        -0.66670000   c90        -0.66670000
+    x67       c100       -0.66670000
+    x68       1                   -1   c1                   1
+    x68       c23         -2.9762001   c61          2.9762001
+    x68       c69                  1   c70                  1
+    x68       c80         -2.9762001   c90         -2.9762001
+    x68       c100        -2.9762001   c103                 1
+    x68       c104                 1
+    x69       c25        -0.66670000   c62                -16
+    x69       c71                 -1   c72         -5.3759999
+    x69       c82        -0.66670000   c92        -0.66670000
+    x69       c102       -0.66670000
+    x70       1                   -1   c1                   1
+    x70       c25         -2.9762001   c62          2.9762001
+    x70       c71                  1   c72                  1
+    x70       c82         -2.9762001   c92         -2.9762001
+    x70       c102        -2.9762001   c103                 1
+    x70       c104                 1
+    x71       c27        -0.66670000   c73              -0.75
+    x71       c105               -20   c110                -1
+    x71       c111        -5.7600002   c121       -0.66670000
+    x71       c131       -0.66670000
+    x72       1                   -1   c1                   1
+    x72       c27         -3.4721999   c73         -3.4721999
+    x72       c105         3.4721999   c110                 1
+    x72       c111                 1   c121        -3.4721999
+    x72       c131        -3.4721999   c140                 1
+    x73       c29        -0.66670000   c75              -0.75
+    x73       c106               -20   c112                -1
+    x73       c113        -5.7600002   c123       -0.66670000
+    x73       c133       -0.66670000
+    x74       1                   -1   c1                   1
+    x74       c29         -3.4721999   c75         -3.4721999
+    x74       c106         3.4721999   c112                 1
+    x74       c113                 1   c123        -3.4721999
+    x74       c133        -3.4721999   c140                 1
+    x75       c31        -0.66670000   c77              -0.75
+    x75       c107               -20   c114                -1
+    x75       c115        -5.7600002   c125       -0.66670000
+    x75       c135       -0.66670000
+    x76       1                   -1   c1                   1
+    x76       c31         -3.4721999   c77         -3.4721999
+    x76       c107         3.4721999   c114                 1
+    x76       c115                 1   c125        -3.4721999
+    x76       c135        -3.4721999   c140                 1
+    x77       c33        -0.66670000   c79              -0.75
+    x77       c108               -20   c116                -1
+    x77       c117        -5.7600002   c127       -0.66670000
+    x77       c137       -0.66670000
+    x78       1                   -1   c1                   1
+    x78       c33         -3.4721999   c79         -3.4721999
+    x78       c108         3.4721999   c116                 1
+    x78       c117                 1   c127        -3.4721999
+    x78       c137        -3.4721999   c140                 1
+    x79       c35        -0.66670000   c81              -0.75
+    x79       c109               -16   c118                -1
+    x79       c119        -4.6079998   c129       -0.66670000
+    x79       c139       -0.66670000
+    x80       1                   -1   c1                   1
+    x80       c35         -3.4721999   c81         -3.4721999
+    x80       c109         3.4721999   c118                 1
+    x80       c119                 1   c129        -3.4721999
+    x80       c139        -3.4721999   c140                 1
+    x81       c37              -0.25   c83              -0.75
+    x81       c120       -0.66670000   c141               -20
+    x81       c146                -1   c147        -8.9280005
+    x81       c157             -0.25
+    x82       1                   -1   c1                   1
+    x82       c37         -2.2400999   c83         -2.2400999
+    x82       c120        -2.2400999   c141         2.2400999
+    x82       c146                 1   c147                 1
+    x82       c157        -2.2400999   c166                 1
+    x83       c39              -0.25   c85              -0.75
+    x83       c122       -0.66670000   c142               -20
+    x83       c148                -1   c149        -8.9280005
+    x83       c159             -0.25
+    x84       1                   -1   c1                   1
+    x84       c39         -2.2400999   c85         -2.2400999
+    x84       c122        -2.2400999   c142         2.2400999
+    x84       c148                 1   c149                 1
+    x84       c159        -2.2400999   c166                 1
+    x85       c41              -0.25   c87              -0.75
+    x85       c124       -0.66670000   c143               -20
+    x85       c150                -1   c151        -8.9280005
+    x85       c161             -0.25
+    x86       1                   -1   c1                   1
+    x86       c41         -2.2400999   c87         -2.2400999
+    x86       c124        -2.2400999   c143         2.2400999
+    x86       c150                 1   c151                 1
+    x86       c161        -2.2400999   c166                 1
+    x87       c43              -0.25   c89              -0.75
+    x87       c126       -0.66670000   c144               -20
+    x87       c152                -1   c153        -8.9280005
+    x87       c163             -0.25
+    x88       1                   -1   c1                   1
+    x88       c43         -2.2400999   c89         -2.2400999
+    x88       c126        -2.2400999   c144         2.2400999
+    x88       c152                 1   c153                 1
+    x88       c163        -2.2400999   c166                 1
+    x89       c45              -0.25   c91              -0.75
+    x89       c128       -0.66670000   c145               -16
+    x89       c154                -1   c155        -7.1423998
+    x89       c165             -0.25
+    x90       1                   -1   c1                   1
+    x90       c45         -2.2400999   c91         -2.2400999
+    x90       c128        -2.2400999   c145         2.2400999
+    x90       c154                 1   c155                 1
+    x90       c165        -2.2400999   c166                 1
+    x91       c47        -0.66670000   c93              -0.75
+    x91       c130       -0.66670000   c156       -0.66670000
+    x91       c167               -20   c172                -1
+    x91       c173        -9.6000004
+    x92       1                   -1   c1                   1
+    x92       c47         -2.0833001   c93         -2.0833001
+    x92       c130        -2.0833001   c156        -2.0833001
+    x92       c167         2.0833001   c172                 1
+    x92       c173                 1   c182                 1
+    x93       c49        -0.66670000   c95              -0.75
+    x93       c132       -0.66670000   c158       -0.66670000
+    x93       c168               -20   c174                -1
+    x93       c175        -9.6000004
+    x94       1                   -1   c1                   1
+    x94       c49         -2.0833001   c95         -2.0833001
+    x94       c132        -2.0833001   c158        -2.0833001
+    x94       c168         2.0833001   c174                 1
+    x94       c175                 1   c182                 1
+    x95       c51        -0.66670000   c97              -0.75
+    x95       c134       -0.66670000   c160       -0.66670000
+    x95       c169               -20   c176                -1
+    x95       c177        -9.6000004
+    x96       1                   -1   c1                   1
+    x96       c51         -2.0833001   c97         -2.0833001
+    x96       c134        -2.0833001   c160        -2.0833001
+    x96       c169         2.0833001   c176                 1
+    x96       c177                 1   c182                 1
+    x97       c53        -0.66670000   c99              -0.75
+    x97       c136       -0.66670000   c162       -0.66670000
+    x97       c170               -20   c178                -1
+    x97       c179        -9.6000004
+    x98       1                   -1   c1                   1
+    x98       c53         -2.0833001   c99         -2.0833001
+    x98       c136        -2.0833001   c162        -2.0833001
+    x98       c170         2.0833001   c178                 1
+    x98       c179                 1   c182                 1
+    x99       c55        -0.66670000   c101             -0.75
+    x99       c138       -0.66670000   c164       -0.66670000
+    x99       c171               -16   c180                -1
+    x99       c181        -7.6799998
+    x100      1                   -1   c1                   1
+    x100      c55         -2.0833001   c101        -2.0833001
+    x100      c138        -2.0833001   c164        -2.0833001
+    x100      c171         2.0833001   c180                 1
+    x100      c181                 1   c182                 1
+    MARK0001  'MARKER'                 'INTEND'
+    x101      c2                   1   c17                  1
+    x101      c18                 -1   c27                  1
+    x101      c28                 -1   c37                  1
+    x101      c38                 -1   c47                  1
+    x101      c48                 -1
+    x102      c3                   1   c19                  1
+    x102      c20                 -1   c29                  1
+    x102      c30                 -1   c39                  1
+    x102      c40                 -1   c49                  1
+    x102      c50                 -1
+    x103      c4                   1   c21                  1
+    x103      c22                 -1   c31                  1
+    x103      c32                 -1   c41                  1
+    x103      c42                 -1   c51                  1
+    x103      c52                 -1
+    x104      c5                   1   c23                  1
+    x104      c24                 -1   c33                  1
+    x104      c34                 -1   c43                  1
+    x104      c44                 -1   c53                  1
+    x104      c54                 -1
+    x105      c6                   1   c25                  1
+    x105      c26                 -1   c35                  1
+    x105      c36                 -1   c45                  1
+    x105      c46                 -1   c55                  1
+    x105      c56                 -1
+    x106      c17                 -1   c18                  1
+    x106      c58                  1   c73                  1
+    x106      c74                 -1   c83                  1
+    x106      c84                 -1   c93                  1
+    x106      c94                 -1
+    x107      c19                 -1   c20                  1
+    x107      c59                  1   c75                  1
+    x107      c76                 -1   c85                  1
+    x107      c86                 -1   c95                  1
+    x107      c96                 -1
+    x108      c21                 -1   c22                  1
+    x108      c60                  1   c77                  1
+    x108      c78                 -1   c87                  1
+    x108      c88                 -1   c97                  1
+    x108      c98                 -1
+    x109      c23                 -1   c24                  1
+    x109      c61                  1   c79                  1
+    x109      c80                 -1   c89                  1
+    x109      c90                 -1   c99                  1
+    x109      c100                -1
+    x110      c25                 -1   c26                  1
+    x110      c62                  1   c81                  1
+    x110      c82                 -1   c91                  1
+    x110      c92                 -1   c101                 1
+    x110      c102                -1
+    x111      c27                 -1   c28                  1
+    x111      c73                 -1   c74                  1
+    x111      c105                 1   c120                 1
+    x111      c121                -1   c130                 1
+    x111      c131                -1
+    x112      c29                 -1   c30                  1
+    x112      c75                 -1   c76                  1
+    x112      c106                 1   c122                 1
+    x112      c123                -1   c132                 1
+    x112      c133                -1
+    x113      c31                 -1   c32                  1
+    x113      c77                 -1   c78                  1
+    x113      c107                 1   c124                 1
+    x113      c125                -1   c134                 1
+    x113      c135                -1
+    x114      c33                 -1   c34                  1
+    x114      c79                 -1   c80                  1
+    x114      c108                 1   c126                 1
+    x114      c127                -1   c136                 1
+    x114      c137                -1
+    x115      c35                 -1   c36                  1
+    x115      c81                 -1   c82                  1
+    x115      c109                 1   c128                 1
+    x115      c129                -1   c138                 1
+    x115      c139                -1
+    x116      c37                 -1   c38                  1
+    x116      c83                 -1   c84                  1
+    x116      c120                -1   c121                 1
+    x116      c141                 1   c156                 1
+    x116      c157                -1
+    x117      c39                 -1   c40                  1
+    x117      c85                 -1   c86                  1
+    x117      c122                -1   c123                 1
+    x117      c142                 1   c158                 1
+    x117      c159                -1
+    x118      c41                 -1   c42                  1
+    x118      c87                 -1   c88                  1
+    x118      c124                -1   c125                 1
+    x118      c143                 1   c160                 1
+    x118      c161                -1
+    x119      c43                 -1   c44                  1
+    x119      c89                 -1   c90                  1
+    x119      c126                -1   c127                 1
+    x119      c144                 1   c162                 1
+    x119      c163                -1
+    x120      c45                 -1   c46                  1
+    x120      c91                 -1   c92                  1
+    x120      c128                -1   c129                 1
+    x120      c145                 1   c164                 1
+    x120      c165                -1
+    x121      c47                 -1   c48                  1
+    x121      c93                 -1   c94                  1
+    x121      c130                -1   c131                 1
+    x121      c156                -1   c157                 1
+    x121      c167                 1
+    x122      c49                 -1   c50                  1
+    x122      c95                 -1   c96                  1
+    x122      c132                -1   c133                 1
+    x122      c158                -1   c159                 1
+    x122      c168                 1
+    x123      c51                 -1   c52                  1
+    x123      c97                 -1   c98                  1
+    x123      c134                -1   c135                 1
+    x123      c160                -1   c161                 1
+    x123      c169                 1
+    x124      c53                 -1   c54                  1
+    x124      c99                 -1   c100                 1
+    x124      c136                -1   c137                 1
+    x124      c162                -1   c163                 1
+    x124      c170                 1
+    x125      c55                 -1   c56                  1
+    x125      c101                -1   c102                 1
+    x125      c138                -1   c139                 1
+    x125      c164                -1   c165                 1
+    x125      c171                 1
+    x126      c149                 1
+    x127      c147                 1
+    x128      c151                 2   c153                 3
+    x128      c155                 4
+RHS
+    rhs       c1                  43   c18                -21
+    rhs       c20                -21   c22                -21
+    rhs       c24                -21   c26                -21
+    rhs       c28                -21   c30                -21
+    rhs       c32                -21   c34                -21
+    rhs       c36                -21   c38                -21
+    rhs       c40                -21   c42                -21
+    rhs       c44                -21   c46                -21
+    rhs       c48                -21   c50                -21
+    rhs       c52                -21   c54                -21
+    rhs       c56                -21   c57                 38
+    rhs       c74                -21   c76                -21
+    rhs       c78                -21   c80                -21
+    rhs       c82                -21   c84                -21
+    rhs       c86                -21   c88                -21
+    rhs       c90                -21   c92                -21
+    rhs       c94                -21   c96                -21
+    rhs       c98                -21   c100               -21
+    rhs       c102               -21   c103                 5
+    rhs       c104                 9   c121               -21
+    rhs       c123               -21   c125               -21
+    rhs       c127               -21   c129               -21
+    rhs       c131               -21   c133               -21
+    rhs       c135               -21   c137               -21
+    rhs       c139               -21   c140                 2
+    rhs       c157               -21   c159               -21
+    rhs       c161               -21   c163               -21
+    rhs       c165               -21   c166                 1
+    rhs       c182                 2
+BOUNDS
+ UP bnd       x1                   1
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52             100000
+ UP bnd       x53                  1
+ UP bnd       x54             100000
+ UP bnd       x55                  1
+ UP bnd       x56             100000
+ UP bnd       x57                  1
+ UP bnd       x58             100000
+ UP bnd       x59                  1
+ UP bnd       x60             100000
+ UP bnd       x61                  1
+ UP bnd       x62             100000
+ UP bnd       x63                  1
+ UP bnd       x64             100000
+ UP bnd       x65                  1
+ UP bnd       x66             100000
+ UP bnd       x67                  1
+ UP bnd       x68             100000
+ UP bnd       x69                  1
+ UP bnd       x70             100000
+ UP bnd       x71                  1
+ UP bnd       x72             100000
+ UP bnd       x73                  1
+ UP bnd       x74             100000
+ UP bnd       x75                  1
+ UP bnd       x76             100000
+ UP bnd       x77                  1
+ UP bnd       x78             100000
+ UP bnd       x79                  1
+ UP bnd       x80             100000
+ UP bnd       x81                  1
+ UP bnd       x82             100000
+ UP bnd       x83                  1
+ UP bnd       x84             100000
+ UP bnd       x85                  1
+ UP bnd       x86             100000
+ UP bnd       x87                  1
+ UP bnd       x88             100000
+ UP bnd       x89                  1
+ UP bnd       x90             100000
+ UP bnd       x91                  1
+ UP bnd       x92             100000
+ UP bnd       x93                  1
+ UP bnd       x94             100000
+ UP bnd       x95                  1
+ UP bnd       x96             100000
+ UP bnd       x97                  1
+ UP bnd       x98             100000
+ UP bnd       x99                  1
+ UP bnd       x100            100000
+ENDATA
diff --git a/demos/ppl_lpsol/examples/opt1217.mps b/demos/ppl_lpsol/examples/opt1217.mps
new file mode 100644
index 0000000..afc134c
--- /dev/null
+++ b/demos/ppl_lpsol/examples/opt1217.mps
@@ -0,0 +1,1643 @@
+NAME           opt1217
+ROWS
+ N  MINIMIZE
+ G  c1      
+ G  c2      
+ G  c3      
+ G  c4      
+ G  c5      
+ G  c6      
+ G  c7      
+ G  c8      
+ G  c9      
+ G  c10     
+ G  c11     
+ G  c12     
+ G  c13     
+ G  c14     
+ G  c15     
+ G  c16     
+ E  c17     
+ E  c18     
+ E  c19     
+ E  c20     
+ E  c21     
+ E  c22     
+ E  c23     
+ E  c24     
+ E  c25     
+ E  c26     
+ E  c27     
+ E  c28     
+ E  c29     
+ E  c30     
+ E  c31     
+ E  c32     
+ E  c33     
+ E  c34     
+ E  c35     
+ E  c36     
+ E  c37     
+ E  c38     
+ E  c39     
+ E  c40     
+ E  c41     
+ E  c42     
+ E  c43     
+ E  c44     
+ E  c45     
+ E  c46     
+ E  c47     
+ E  c48     
+ E  c49     
+ E  c50     
+ E  c51     
+ E  c52     
+ E  c53     
+ E  c54     
+ E  c55     
+ E  c56     
+ E  c57     
+ E  c58     
+ E  c59     
+ E  c60     
+ E  c61     
+ E  c62     
+ E  c63     
+ E  c64     
+COLUMNS
+    x1        MINIMIZE            -1   c1                  -1
+    x1        c2                  -1   c3                  -1
+    x1        c4                  -1   c5                  -1
+    x1        c6                  -1   c7                  -1
+    x1        c8                  -1   c9                  -1
+    x1        c10                 -1   c11                 -1
+    x1        c12                 -1   c13                 -1
+    x1        c14                 -1   c15                 -1
+    x1        c16                 -1
+    MARK0000  'MARKER'                 'INTORG'
+    x2        c1                   4   c17                  1
+    x3        c1                   4   c18                  1
+    x4        c1                   4   c19                  1
+    x5        c1                   4   c20                  1
+    x6        c1                   4   c21                  1
+    x7        c1                   4   c22                  1
+    x8        c1                   4   c23                  1
+    x9        c1                   2   c24                  1
+    x10       c1                   2   c25                  1
+    x11       c1                   2   c26                  1
+    x12       c1                   2   c27                  1
+    x13       c1                   2   c28                  1
+    x14       c1                   2   c29                  1
+    x15       c1                   2   c30                  1
+    x16       c1                   2   c31                  1
+    x17       c1                   1   c32                  1
+    x18       c1                   1   c34                  1
+    x19       c1                   2   c35                  1
+    x20       c1                   2   c36                  1
+    x21       c1                   2   c37                  1
+    x22       c1                   2   c38                  1
+    x23       c1                   2   c39                  1
+    x24       c1                   2   c40                  1
+    x25       c1                   4   c41                  1
+    x26       c1                   4   c42                  1
+    x27       c1                   4   c43                  1
+    x28       c1                   4   c44                  1
+    x29       c1                   4   c45                  1
+    x30       c1                   2   c46                  1
+    x31       c1                   2   c47                  1
+    x32       c1                   2   c48                  1
+    x33       c1                   4   c49                  1
+    x34       c1                   4   c50                  1
+    x35       c1                   6   c51                  1
+    x36       c1                   6   c52                  1
+    x37       c1                   6   c53                  1
+    x38       c1                   6   c54                  1
+    x39       c1                   8   c55                  1
+    x40       c1                   6   c56                  1
+    x41       c1                   6   c57                  1
+    x42       c1                   6   c58                  1
+    x43       c1                   6   c59                  1
+    x44       c1                   4   c60                  1
+    x45       c1                   4   c61                  1
+    x46       c1                   4   c62                  1
+    x47       c1                   4   c63                  1
+    x48       c1                   4   c64                  1
+    x49       c2                   2   c17                  1
+    x50       c2                   2   c18                  1
+    x51       c2                   2   c19                  1
+    x52       c2                   4   c20                  1
+    x53       c2                   4   c21                  1
+    x54       c2                   4   c22                  1
+    x55       c2                   4   c23                  1
+    x56       c2                   4   c24                  1
+    x57       c2                   2   c25                  1
+    x58       c2                   4   c26                  1
+    x59       c2                   4   c27                  1
+    x60       c2                   4   c28                  1
+    x61       c2                   2   c29                  1
+    x62       c2                   2   c30                  1
+    x63       c2                   4   c31                  1
+    x64       c2                   6   c32                  1
+    x65       c2                   6   c33                  1
+    x66       c2                   4   c34                  1
+    x67       c2                   4   c35                  1
+    x68       c2                   4   c36                  1
+    x69       c2                   4   c37                  1
+    x70       c2                   4   c38                  1
+    x71       c2                   2   c39                  1
+    x72       c2                   1   c40                  1
+    x73       c2                   2   c41                  1
+    x74       c2                   4   c42                  1
+    x75       c2                   2   c43                  1
+    x76       c2                   2   c44                  1
+    x77       c2                   4   c45                  1
+    x78       c2                   4   c46                  1
+    x79       c2                   4   c47                  1
+    x80       c2                   2   c48                  1
+    x81       c2                   2   c49                  1
+    x82       c2                   4   c50                  1
+    x83       c2                   4   c51                  1
+    x84       c2                   4   c52                  1
+    x85       c2                   4   c53                  1
+    x86       c2                   4   c54                  1
+    x87       c2                   4   c55                  1
+    x88       c2                   4   c56                  1
+    x89       c2                   4   c57                  1
+    x90       c2                   4   c58                  1
+    x91       c2                   4   c59                  1
+    x92       c2                   2   c60                  1
+    x93       c2                   2   c61                  1
+    x94       c2                   4   c62                  1
+    x95       c2                   4   c63                  1
+    x96       c2                   4   c64                  1
+    x97       c3                   2   c17                  1
+    x98       c3                   4   c18                  1
+    x99       c3                   4   c19                  1
+    x100      c3                   4   c20                  1
+    x101      c3                   6   c21                  1
+    x102      c3                   6   c22                  1
+    x103      c3                   6   c23                  1
+    x104      c3                   6   c24                  1
+    x105      c3                   6   c25                  1
+    x106      c3                   6   c26                  1
+    x107      c3                   6   c27                  1
+    x108      c3                   4   c28                  1
+    x109      c3                   4   c29                  1
+    x110      c3                   4   c30                  1
+    x111      c3                   4   c31                  1
+    x112      c3                   4   c32                  1
+    x113      c3                   4   c33                  1
+    x114      c3                   4   c34                  1
+    x115      c3                   4   c35                  1
+    x116      c3                   2   c36                  1
+    x117      c3                   2   c37                  1
+    x118      c3                   1   c38                  1
+    x119      c3                   1   c40                  1
+    x120      c3                   2   c41                  1
+    x121      c3                   4   c42                  1
+    x122      c3                   4   c43                  1
+    x123      c3                   6   c44                  1
+    x124      c3                   6   c45                  1
+    x125      c3                   6   c46                  1
+    x126      c3                   4   c47                  1
+    x127      c3                   4   c48                  1
+    x128      c3                   2   c49                  1
+    x129      c3                   2   c50                  1
+    x130      c3                   2   c51                  1
+    x131      c3                   4   c52                  1
+    x132      c3                   4   c53                  1
+    x133      c3                   2   c54                  1
+    x134      c3                   2   c55                  1
+    x135      c3                   4   c56                  1
+    x136      c3                   4   c57                  1
+    x137      c3                   4   c58                  1
+    x138      c3                   4   c59                  1
+    x139      c3                   1   c60                  1
+    x140      c3                   2   c61                  1
+    x141      c3                   4   c62                  1
+    x142      c3                   6   c63                  1
+    x143      c3                   6   c64                  1
+    x144      c4                   4   c17                  1
+    x145      c4                   4   c18                  1
+    x146      c4                   4   c19                  1
+    x147      c4                   4   c20                  1
+    x148      c4                   4   c21                  1
+    x149      c4                   2   c22                  1
+    x150      c4                   1   c23                  1
+    x151      c4                   2   c24                  1
+    x152      c4                   4   c25                  1
+    x153      c4                   4   c26                  1
+    x154      c4                   4   c27                  1
+    x155      c4                   4   c28                  1
+    x156      c4                   4   c29                  1
+    x157      c4                   6   c30                  1
+    x158      c4                   6   c31                  1
+    x159      c4                   6   c32                  1
+    x160      c4                   6   c33                  1
+    x161      c4                   6   c34                  1
+    x162      c4                   6   c35                  1
+    x163      c4                   6   c36                  1
+    x164      c4                   6   c37                  1
+    x165      c4                   6   c38                  1
+    x166      c4                   4   c39                  1
+    x167      c4                   4   c40                  1
+    x168      c4                   4   c41                  1
+    x169      c4                   4   c42                  1
+    x170      c4                   6   c43                  1
+    x171      c4                   4   c44                  1
+    x172      c4                   4   c45                  1
+    x173      c4                   4   c46                  1
+    x174      c4                   2   c47                  1
+    x175      c4                   2   c48                  1
+    x176      c4                   4   c49                  1
+    x177      c4                   6   c50                  1
+    x178      c4                   6   c51                  1
+    x179      c4                   6   c52                  1
+    x180      c4                   6   c53                  1
+    x181      c4                   6   c54                  1
+    x182      c4                   4   c55                  1
+    x183      c4                   4   c56                  1
+    x184      c4                   6   c57                  1
+    x185      c4                   6   c58                  1
+    x186      c4                   6   c59                  1
+    x187      c4                   6   c60                  1
+    x188      c4                   4   c61                  1
+    x189      c4                   2   c62                  1
+    x190      c4                   2   c63                  1
+    x191      c4                   2   c64                  1
+    x192      c5                   6   c17                  1
+    x193      c5                   6   c18                  1
+    x194      c5                   6   c19                  1
+    x195      c5                   6   c20                  1
+    x196      c5                   4   c21                  1
+    x197      c5                   4   c22                  1
+    x198      c5                   4   c23                  1
+    x199      c5                   4   c24                  1
+    x200      c5                   4   c25                  1
+    x201      c5                   4   c26                  1
+    x202      c5                   6   c27                  1
+    x203      c5                   6   c28                  1
+    x204      c5                   6   c29                  1
+    x205      c5                   6   c30                  1
+    x206      c5                   6   c31                  1
+    x207      c5                   6   c32                  1
+    x208      c5                   6   c33                  1
+    x209      c5                   6   c34                  1
+    x210      c5                   6   c35                  1
+    x211      c5                   4   c36                  1
+    x212      c5                   4   c37                  1
+    x213      c5                   4   c38                  1
+    x214      c5                   2   c39                  1
+    x215      c5                   2   c40                  1
+    x216      c5                   2   c41                  1
+    x217      c5                   1   c42                  1
+    x218      c5                   1   c43                  1
+    x219      c5                   2   c44                  1
+    x220      c5                   2   c45                  1
+    x221      c5                   2   c46                  1
+    x222      c5                   2   c47                  1
+    x223      c5                   2   c48                  1
+    x224      c5                   2   c49                  1
+    x225      c5                   2   c50                  1
+    x226      c5                   2   c51                  1
+    x227      c5                   2   c52                  1
+    x228      c5                   2   c53                  1
+    x229      c5                   2   c54                  1
+    x230      c5                   2   c55                  1
+    x231      c5                   2   c56                  1
+    x232      c5                   2   c57                  1
+    x233      c5                   2   c58                  1
+    x234      c5                   2   c59                  1
+    x235      c5                   2   c60                  1
+    x236      c5                   2   c61                  1
+    x237      c5                   2   c62                  1
+    x238      c5                   2   c63                  1
+    x239      c5                   2   c64                  1
+    x240      c6                   2   c17                  1
+    x241      c6                   2   c18                  1
+    x242      c6                   2   c19                  1
+    x243      c6                   2   c20                  1
+    x244      c6                   2   c21                  1
+    x245      c6                   1   c22                  1
+    x246      c6                   1   c23                  1
+    x247      c6                   1   c24                  1
+    x248      c6                   1   c25                  1
+    x249      c6                   1   c30                  1
+    x250      c6                   1   c31                  1
+    x251      c6                   1   c32                  1
+    x252      c6                   2   c33                  1
+    x253      c6                   2   c34                  1
+    x254      c6                   2   c35                  1
+    x255      c6                   2   c36                  1
+    x256      c6                   2   c37                  1
+    x257      c6                   2   c38                  1
+    x258      c6                   2   c39                  1
+    x259      c6                   2   c40                  1
+    x260      c6                   1   c41                  1
+    x261      c6                   1   c42                  1
+    x262      c6                   2   c43                  1
+    x263      c6                   2   c44                  1
+    x264      c6                   4   c45                  1
+    x265      c6                   4   c46                  1
+    x266      c6                   4   c47                  1
+    x267      c6                   4   c48                  1
+    x268      c6                   4   c49                  1
+    x269      c6                   4   c50                  1
+    x270      c6                   4   c51                  1
+    x271      c6                   4   c52                  1
+    x272      c6                   4   c53                  1
+    x273      c6                   4   c54                  1
+    x274      c6                   2   c55                  1
+    x275      c6                   2   c56                  1
+    x276      c6                   2   c57                  1
+    x277      c6                   4   c58                  1
+    x278      c6                   4   c59                  1
+    x279      c6                   4   c60                  1
+    x280      c6                   6   c61                  1
+    x281      c6                   6   c62                  1
+    x282      c6                   6   c63                  1
+    x283      c6                   6   c64                  1
+    x284      c7                   4   c17                  1
+    x285      c7                   4   c18                  1
+    x286      c7                   4   c19                  1
+    x287      c7                   4   c20                  1
+    x288      c7                   2   c21                  1
+    x289      c7                   1   c22                  1
+    x290      c7                   2   c23                  1
+    x291      c7                   4   c24                  1
+    x292      c7                   4   c25                  1
+    x293      c7                   6   c26                  1
+    x294      c7                   4   c27                  1
+    x295      c7                   4   c28                  1
+    x296      c7                   4   c29                  1
+    x297      c7                   4   c30                  1
+    x298      c7                   4   c31                  1
+    x299      c7                   6   c32                  1
+    x300      c7                   6   c33                  1
+    x301      c7                   6   c34                  1
+    x302      c7                   6   c35                  1
+    x303      c7                   6   c36                  1
+    x304      c7                   6   c37                  1
+    x305      c7                   4   c38                  1
+    x306      c7                   4   c39                  1
+    x307      c7                   4   c40                  1
+    x308      c7                   4   c41                  1
+    x309      c7                   4   c42                  1
+    x310      c7                   4   c43                  1
+    x311      c7                   4   c44                  1
+    x312      c7                   4   c45                  1
+    x313      c7                   4   c46                  1
+    x314      c7                   6   c47                  1
+    x315      c7                   6   c48                  1
+    x316      c7                   6   c49                  1
+    x317      c7                   6   c50                  1
+    x318      c7                   6   c51                  1
+    x319      c7                   6   c52                  1
+    x320      c7                   6   c53                  1
+    x321      c7                   6   c54                  1
+    x322      c7                   4   c55                  1
+    x323      c7                   4   c56                  1
+    x324      c7                   4   c57                  1
+    x325      c7                   4   c58                  1
+    x326      c7                   4   c59                  1
+    x327      c7                   4   c60                  1
+    x328      c7                   4   c61                  1
+    x329      c7                   4   c62                  1
+    x330      c7                   4   c63                  1
+    x331      c7                   4   c64                  1
+    x332      c8                   4   c17                  1
+    x333      c8                   4   c18                  1
+    x334      c8                   4   c19                  1
+    x335      c8                   4   c20                  1
+    x336      c8                   2   c21                  1
+    x337      c8                   4   c22                  1
+    x338      c8                   4   c23                  1
+    x339      c8                   6   c24                  1
+    x340      c8                   6   c25                  1
+    x341      c8                   6   c26                  1
+    x342      c8                   6   c27                  1
+    x343      c8                   8   c28                  1
+    x344      c8                   8   c29                  1
+    x345      c8                   8   c30                  1
+    x346      c8                   8   c31                  1
+    x347      c8                   8   c32                  1
+    x348      c8                   6   c33                  1
+    x349      c8                   6   c34                  1
+    x350      c8                   6   c35                  1
+    x351      c8                   6   c36                  1
+    x352      c8                   4   c37                  1
+    x353      c8                   4   c38                  1
+    x354      c8                   2   c39                  1
+    x355      c8                   2   c40                  1
+    x356      c8                   2   c41                  1
+    x357      c8                   2   c42                  1
+    x358      c8                   4   c43                  1
+    x359      c8                   4   c44                  1
+    x360      c8                   4   c45                  1
+    x361      c8                   4   c46                  1
+    x362      c8                   4   c47                  1
+    x363      c8                   4   c48                  1
+    x364      c8                   4   c49                  1
+    x365      c8                   6   c50                  1
+    x366      c8                   6   c51                  1
+    x367      c8                   6   c52                  1
+    x368      c8                   6   c53                  1
+    x369      c8                   6   c54                  1
+    x370      c8                   6   c55                  1
+    x371      c8                   6   c56                  1
+    x372      c8                   6   c57                  1
+    x373      c8                   6   c58                  1
+    x374      c8                   6   c59                  1
+    x375      c8                   4   c60                  1
+    x376      c8                   4   c61                  1
+    x377      c8                   2   c62                  1
+    x378      c8                   1   c63                  1
+    x379      c8                   1   c64                  1
+    x380      c9                   4   c17                  1
+    x381      c9                   4   c18                  1
+    x382      c9                   6   c19                  1
+    x383      c9                   6   c20                  1
+    x384      c9                   6   c21                  1
+    x385      c9                   6   c22                  1
+    x386      c9                   4   c23                  1
+    x387      c9                   4   c24                  1
+    x388      c9                   2   c25                  1
+    x389      c9                   2   c26                  1
+    x390      c9                   2   c27                  1
+    x391      c9                   2   c28                  1
+    x392      c9                   2   c29                  1
+    x393      c9                   2   c30                  1
+    x394      c9                   4   c31                  1
+    x395      c9                   4   c32                  1
+    x396      c9                   4   c33                  1
+    x397      c9                   4   c34                  1
+    x398      c9                   4   c35                  1
+    x399      c9                   4   c36                  1
+    x400      c9                   4   c37                  1
+    x401      c9                   6   c38                  1
+    x402      c9                   6   c39                  1
+    x403      c9                   6   c40                  1
+    x404      c9                   6   c41                  1
+    x405      c9                   4   c42                  1
+    x406      c9                   4   c43                  1
+    x407      c9                   2   c44                  1
+    x408      c9                   2   c45                  1
+    x409      c9                   4   c46                  1
+    x410      c9                   4   c47                  1
+    x411      c9                   4   c48                  1
+    x412      c9                   4   c49                  1
+    x413      c9                   4   c50                  1
+    x414      c9                   4   c51                  1
+    x415      c9                   4   c52                  1
+    x416      c9                   4   c53                  1
+    x417      c9                   6   c54                  1
+    x418      c9                   6   c55                  1
+    x419      c9                   6   c56                  1
+    x420      c9                   6   c57                  1
+    x421      c9                   6   c58                  1
+    x422      c9                   6   c59                  1
+    x423      c9                   4   c60                  1
+    x424      c9                   4   c61                  1
+    x425      c9                   4   c62                  1
+    x426      c9                   4   c63                  1
+    x427      c9                   4   c64                  1
+    x428      c10                  1   c17                  1
+    x429      c10                  2   c18                  1
+    x430      c10                  2   c19                  1
+    x431      c10                  4   c20                  1
+    x432      c10                  4   c21                  1
+    x433      c10                  4   c22                  1
+    x434      c10                  4   c23                  1
+    x435      c10                  4   c24                  1
+    x436      c10                  4   c25                  1
+    x437      c10                  4   c26                  1
+    x438      c10                  4   c27                  1
+    x439      c10                  4   c28                  1
+    x440      c10                  2   c29                  1
+    x441      c10                  2   c30                  1
+    x442      c10                  2   c31                  1
+    x443      c10                  2   c32                  1
+    x444      c10                  4   c33                  1
+    x445      c10                  4   c34                  1
+    x446      c10                  4   c35                  1
+    x447      c10                  4   c36                  1
+    x448      c10                  4   c37                  1
+    x449      c10                  4   c38                  1
+    x450      c10                  4   c39                  1
+    x451      c10                  4   c40                  1
+    x452      c10                  4   c41                  1
+    x453      c10                  2   c42                  1
+    x454      c10                  1   c43                  1
+    x455      c10                  2   c45                  1
+    x456      c10                  4   c46                  1
+    x457      c10                  4   c47                  1
+    x458      c10                  6   c48                  1
+    x459      c10                  6   c49                  1
+    x460      c10                  6   c50                  1
+    x461      c10                  6   c51                  1
+    x462      c10                  8   c52                  1
+    x463      c10                  8   c53                  1
+    x464      c10                  8   c54                  1
+    x465      c10                  8   c55                  1
+    x466      c10                  8   c56                  1
+    x467      c10                  8   c57                  1
+    x468      c10                  8   c58                  1
+    x469      c10                  6   c59                  1
+    x470      c10                  6   c60                  1
+    x471      c10                  6   c61                  1
+    x472      c10                  6   c62                  1
+    x473      c10                  6   c63                  1
+    x474      c10                  4   c64                  1
+    x475      c11                  4   c18                  1
+    x476      c11                  6   c19                  1
+    x477      c11                  6   c20                  1
+    x478      c11                  4   c21                  1
+    x479      c11                  2   c22                  1
+    x480      c11                  4   c23                  1
+    x481      c11                  4   c24                  1
+    x482      c11                  2   c25                  1
+    x483      c11                  2   c26                  1
+    x484      c11                  4   c27                  1
+    x485      c11                  4   c28                  1
+    x486      c11                  6   c29                  1
+    x487      c11                  6   c30                  1
+    x488      c11                  6   c31                  1
+    x489      c11                  6   c32                  1
+    x490      c11                  6   c33                  1
+    x491      c11                  6   c34                  1
+    x492      c11                  6   c35                  1
+    x493      c11                  4   c36                  1
+    x494      c11                  2   c37                  1
+    x495      c11                  2   c38                  1
+    x496      c11                  4   c39                  1
+    x497      c11                  4   c40                  1
+    x498      c11                  2   c41                  1
+    x499      c11                  2   c42                  1
+    x500      c11                  4   c43                  1
+    x501      c11                  4   c44                  1
+    x502      c11                  4   c45                  1
+    x503      c11                  4   c46                  1
+    x504      c11                  2   c47                  1
+    x505      c11                  2   c48                  1
+    x506      c11                  4   c49                  1
+    x507      c11                  6   c50                  1
+    x508      c11                  4   c51                  1
+    x509      c11                  4   c52                  1
+    x510      c11                  6   c53                  1
+    x511      c11                  6   c54                  1
+    x512      c11                  6   c55                  1
+    x513      c11                  6   c56                  1
+    x514      c11                  4   c57                  1
+    x515      c11                  6   c58                  1
+    x516      c11                  6   c59                  1
+    x517      c11                  6   c60                  1
+    x518      c11                  6   c61                  1
+    x519      c11                  8   c62                  1
+    x520      c11                  8   c63                  1
+    x521      c11                  8   c64                  1
+    x522      c12                  6   c17                  1
+    x523      c12                  6   c18                  1
+    x524      c12                  8   c19                  1
+    x525      c12                  8   c20                  1
+    x526      c12                  8   c21                  1
+    x527      c12                  8   c22                  1
+    x528      c12                  8   c23                  1
+    x529      c12                  6   c24                  1
+    x530      c12                  6   c25                  1
+    x531      c12                  6   c26                  1
+    x532      c12                  4   c27                  1
+    x533      c12                  4   c28                  1
+    x534      c12                  2   c29                  1
+    x535      c12                  2   c30                  1
+    x536      c12                  2   c31                  1
+    x537      c12                  2   c32                  1
+    x538      c12                  2   c33                  1
+    x539      c12                  2   c34                  1
+    x540      c12                  2   c35                  1
+    x541      c12                  2   c36                  1
+    x542      c12                  4   c37                  1
+    x543      c12                  4   c38                  1
+    x544      c12                  4   c39                  1
+    x545      c12                  6   c40                  1
+    x546      c12                  6   c41                  1
+    x547      c12                  6   c42                  1
+    x548      c12                  6   c43                  1
+    x549      c12                  6   c44                  1
+    x550      c12                  6   c45                  1
+    x551      c12                  6   c46                  1
+    x552      c12                  8   c47                  1
+    x553      c12                  8   c48                  1
+    x554      c12                  8   c49                  1
+    x555      c12                  6   c50                  1
+    x556      c12                  6   c51                  1
+    x557      c12                  6   c52                  1
+    x558      c12                  6   c53                  1
+    x559      c12                  6   c54                  1
+    x560      c12                  6   c55                  1
+    x561      c12                  6   c56                  1
+    x562      c12                  8   c57                  1
+    x563      c12                  8   c58                  1
+    x564      c12                  6   c59                  1
+    x565      c12                  6   c60                  1
+    x566      c12                  6   c61                  1
+    x567      c12                  6   c62                  1
+    x568      c12                  4   c63                  1
+    x569      c12                  6   c64                  1
+    x570      c13                  6   c17                  1
+    x571      c13                  6   c18                  1
+    x572      c13                  4   c19                  1
+    x573      c13                  4   c20                  1
+    x574      c13                  6   c21                  1
+    x575      c13                  6   c22                  1
+    x576      c13                  6   c23                  1
+    x577      c13                  6   c24                  1
+    x578      c13                  6   c25                  1
+    x579      c13                  6   c26                  1
+    x580      c13                  6   c27                  1
+    x581      c13                  6   c28                  1
+    x582      c13                  8   c29                  1
+    x583      c13                  8   c30                  1
+    x584      c13                  8   c31                  1
+    x585      c13                  6   c32                  1
+    x586      c13                  6   c33                  1
+    x587      c13                  6   c34                  1
+    x588      c13                  4   c35                  1
+    x589      c13                  2   c36                  1
+    x590      c13                  4   c37                  1
+    x591      c13                  4   c38                  1
+    x592      c13                  4   c39                  1
+    x593      c13                  2   c40                  1
+    x594      c13                  1   c41                  1
+    x595      c13                  1   c42                  1
+    x596      c13                  4   c43                  1
+    x597      c13                  4   c44                  1
+    x598      c13                  4   c45                  1
+    x599      c13                  4   c46                  1
+    x600      c13                  4   c47                  1
+    x601      c13                  6   c48                  1
+    x602      c13                  6   c49                  1
+    x603      c13                  6   c50                  1
+    x604      c13                  6   c51                  1
+    x605      c13                  6   c52                  1
+    x606      c13                  6   c53                  1
+    x607      c13                  6   c54                  1
+    x608      c13                  4   c55                  1
+    x609      c13                  2   c56                  1
+    x610      c13                  2   c58                  1
+    x611      c13                  4   c59                  1
+    x612      c13                  4   c60                  1
+    x613      c13                  4   c61                  1
+    x614      c13                  4   c62                  1
+    x615      c13                  4   c63                  1
+    x616      c13                  4   c64                  1
+    x617      c14                  8   c17                  1
+    x618      c14                  8   c18                  1
+    x619      c14                  8   c19                  1
+    x620      c14                  6   c20                  1
+    x621      c14                  6   c21                  1
+    x622      c14                  6   c22                  1
+    x623      c14                  8   c23                  1
+    x624      c14                  6   c24                  1
+    x625      c14                  6   c25                  1
+    x626      c14                  4   c26                  1
+    x627      c14                  4   c27                  1
+    x628      c14                  4   c28                  1
+    x629      c14                  4   c29                  1
+    x630      c14                  2   c30                  1
+    x631      c14                  6   c31                  1
+    x632      c14                  6   c32                  1
+    x633      c14                  8   c33                  1
+    x634      c14                  8   c34                  1
+    x635      c14                  8   c35                  1
+    x636      c14                  6   c36                  1
+    x637      c14                  6   c37                  1
+    x638      c14                  6   c38                  1
+    x639      c14                  6   c39                  1
+    x640      c14                  6   c40                  1
+    x641      c14                  6   c41                  1
+    x642      c14                  8   c42                  1
+    x643      c14                  8   c43                  1
+    x644      c14                  8   c44                  1
+    x645      c14                  8   c45                  1
+    x646      c14                  8   c46                  1
+    x647      c14                  8   c47                  1
+    x648      c14                  6   c48                  1
+    x649      c14                  6   c49                  1
+    x650      c14                  6   c50                  1
+    x651      c14                  6   c51                  1
+    x652      c14                  2   c52                  1
+    x653      c14                  4   c53                  1
+    x654      c14                  4   c54                  1
+    x655      c14                  4   c55                  1
+    x656      c14                  2   c56                  1
+    x657      c14                  4   c57                  1
+    x658      c14                  6   c58                  1
+    x659      c14                  8   c59                  1
+    x660      c14                  6   c60                  1
+    x661      c14                  6   c61                  1
+    x662      c14                  6   c62                  1
+    x663      c14                  6   c63                  1
+    x664      c14                  6   c64                  1
+    x665      c15                  8   c17                  1
+    x666      c15                  8   c18                  1
+    x667      c15                  8   c19                  1
+    x668      c15                  8   c20                  1
+    x669      c15                  8   c21                  1
+    x670      c15                  8   c22                  1
+    x671      c15                  8   c23                  1
+    x672      c15                  8   c24                  1
+    x673      c15                  8   c25                  1
+    x674      c15                  8   c26                  1
+    x675      c15                  8   c27                  1
+    x676      c15                  8   c28                  1
+    x677      c15                  8   c29                  1
+    x678      c15                  6   c30                  1
+    x679      c15                  6   c31                  1
+    x680      c15                  6   c32                  1
+    x681      c15                  6   c33                  1
+    x682      c15                  8   c34                  1
+    x683      c15                  8   c35                  1
+    x684      c15                  6   c36                  1
+    x685      c15                  6   c37                  1
+    x686      c15                  4   c38                  1
+    x687      c15                  2   c40                  1
+    x688      c15                  4   c41                  1
+    x689      c15                  4   c42                  1
+    x690      c15                  2   c43                  1
+    x691      c15                  2   c44                  1
+    x692      c15                  4   c45                  1
+    x693      c15                  4   c46                  1
+    x694      c15                  4   c47                  1
+    x695      c15                  4   c48                  1
+    x696      c15                  2   c49                  1
+    x697      c15                  2   c50                  1
+    x698      c15                  4   c51                  1
+    x699      c15                  6   c52                  1
+    x700      c15                  6   c53                  1
+    x701      c15                  8   c54                  1
+    x702      c15                  6   c55                  1
+    x703      c15                  6   c56                  1
+    x704      c15                  4   c57                  1
+    x705      c15                  2   c58                  1
+    x706      c15                  2   c59                  1
+    x707      c15                  4   c60                  1
+    x708      c15                  6   c61                  1
+    x709      c15                  6   c62                  1
+    x710      c15                  6   c63                  1
+    x711      c15                  6   c64                  1
+    x712      c16                  8   c17                  1
+    x713      c16                  8   c18                  1
+    x714      c16                  8   c19                  1
+    x715      c16                  8   c20                  1
+    x716      c16                  6   c21                  1
+    x717      c16                  4   c22                  1
+    x718      c16                  6   c23                  1
+    x719      c16                  8   c24                  1
+    x720      c16                  8   c25                  1
+    x721      c16                  8   c26                  1
+    x722      c16                  8   c27                  1
+    x723      c16                  8   c28                  1
+    x724      c16                  8   c29                  1
+    x725      c16                  8   c30                  1
+    x726      c16                  8   c31                  1
+    x727      c16                  8   c32                  1
+    x728      c16                  8   c33                  1
+    x729      c16                  8   c34                  1
+    x730      c16                  8   c35                  1
+    x731      c16                  8   c36                  1
+    x732      c16                  6   c37                  1
+    x733      c16                  6   c38                  1
+    x734      c16                  4   c39                  1
+    x735      c16                  4   c40                  1
+    x736      c16                  6   c41                  1
+    x737      c16                  6   c42                  1
+    x738      c16                  6   c43                  1
+    x739      c16                  6   c44                  1
+    x740      c16                  6   c45                  1
+    x741      c16                  8   c46                  1
+    x742      c16                  8   c47                  1
+    x743      c16                  8   c48                  1
+    x744      c16                  8   c49                  1
+    x745      c16                  8   c50                  1
+    x746      c16                  8   c51                  1
+    x747      c16                  8   c52                  1
+    x748      c16                  6   c53                  1
+    x749      c16                  6   c54                  1
+    x750      c16                  2   c55                  1
+    x751      c16                  6   c56                  1
+    x752      c16                  8   c57                  1
+    x753      c16                  8   c58                  1
+    x754      c16                  8   c59                  1
+    x755      c16                  8   c60                  1
+    x756      c16                  8   c61                  1
+    x757      c16                  8   c62                  1
+    x758      c16                  6   c63                  1
+    x759      c16                  8   c64                  1
+    x760      c17                  1
+    x761      c26                  1
+    x762      c27                  1
+    x763      c28                  1
+    x764      c29                  1
+    x765      c33                  1
+    x766      c39                  1
+    x767      c39                  1
+    x768      c44                  1
+    x769      c57                  1
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c17                  1   c18                  1
+    rhs       c19                  1   c20                  1
+    rhs       c21                  1   c22                  1
+    rhs       c23                  1   c24                  1
+    rhs       c25                  1   c26                  1
+    rhs       c27                  1   c28                  1
+    rhs       c29                  1   c30                  1
+    rhs       c31                  1   c32                  1
+    rhs       c33                  1   c34                  1
+    rhs       c35                  1   c36                  1
+    rhs       c37                  1   c38                  1
+    rhs       c39                  1   c40                  1
+    rhs       c41                  1   c42                  1
+    rhs       c43                  1   c44                  1
+    rhs       c45                  1   c46                  1
+    rhs       c47                  1   c48                  1
+    rhs       c49                  1   c50                  1
+    rhs       c51                  1   c52                  1
+    rhs       c53                  1   c54                  1
+    rhs       c55                  1   c56                  1
+    rhs       c57                  1   c58                  1
+    rhs       c59                  1   c60                  1
+    rhs       c61                  1   c62                  1
+    rhs       c63                  1   c64                  1
+BOUNDS
+ UP bnd       x1                 384
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ UP bnd       x57                  1
+ UP bnd       x58                  1
+ UP bnd       x59                  1
+ UP bnd       x60                  1
+ UP bnd       x61                  1
+ UP bnd       x62                  1
+ UP bnd       x63                  1
+ UP bnd       x64                  1
+ UP bnd       x65                  1
+ UP bnd       x66                  1
+ UP bnd       x67                  1
+ UP bnd       x68                  1
+ UP bnd       x69                  1
+ UP bnd       x70                  1
+ UP bnd       x71                  1
+ UP bnd       x72                  1
+ UP bnd       x73                  1
+ UP bnd       x74                  1
+ UP bnd       x75                  1
+ UP bnd       x76                  1
+ UP bnd       x77                  1
+ UP bnd       x78                  1
+ UP bnd       x79                  1
+ UP bnd       x80                  1
+ UP bnd       x81                  1
+ UP bnd       x82                  1
+ UP bnd       x83                  1
+ UP bnd       x84                  1
+ UP bnd       x85                  1
+ UP bnd       x86                  1
+ UP bnd       x87                  1
+ UP bnd       x88                  1
+ UP bnd       x89                  1
+ UP bnd       x90                  1
+ UP bnd       x91                  1
+ UP bnd       x92                  1
+ UP bnd       x93                  1
+ UP bnd       x94                  1
+ UP bnd       x95                  1
+ UP bnd       x96                  1
+ UP bnd       x97                  1
+ UP bnd       x98                  1
+ UP bnd       x99                  1
+ UP bnd       x100                 1
+ UP bnd       x101                 1
+ UP bnd       x102                 1
+ UP bnd       x103                 1
+ UP bnd       x104                 1
+ UP bnd       x105                 1
+ UP bnd       x106                 1
+ UP bnd       x107                 1
+ UP bnd       x108                 1
+ UP bnd       x109                 1
+ UP bnd       x110                 1
+ UP bnd       x111                 1
+ UP bnd       x112                 1
+ UP bnd       x113                 1
+ UP bnd       x114                 1
+ UP bnd       x115                 1
+ UP bnd       x116                 1
+ UP bnd       x117                 1
+ UP bnd       x118                 1
+ UP bnd       x119                 1
+ UP bnd       x120                 1
+ UP bnd       x121                 1
+ UP bnd       x122                 1
+ UP bnd       x123                 1
+ UP bnd       x124                 1
+ UP bnd       x125                 1
+ UP bnd       x126                 1
+ UP bnd       x127                 1
+ UP bnd       x128                 1
+ UP bnd       x129                 1
+ UP bnd       x130                 1
+ UP bnd       x131                 1
+ UP bnd       x132                 1
+ UP bnd       x133                 1
+ UP bnd       x134                 1
+ UP bnd       x135                 1
+ UP bnd       x136                 1
+ UP bnd       x137                 1
+ UP bnd       x138                 1
+ UP bnd       x139                 1
+ UP bnd       x140                 1
+ UP bnd       x141                 1
+ UP bnd       x142                 1
+ UP bnd       x143                 1
+ UP bnd       x144                 1
+ UP bnd       x145                 1
+ UP bnd       x146                 1
+ UP bnd       x147                 1
+ UP bnd       x148                 1
+ UP bnd       x149                 1
+ UP bnd       x150                 1
+ UP bnd       x151                 1
+ UP bnd       x152                 1
+ UP bnd       x153                 1
+ UP bnd       x154                 1
+ UP bnd       x155                 1
+ UP bnd       x156                 1
+ UP bnd       x157                 1
+ UP bnd       x158                 1
+ UP bnd       x159                 1
+ UP bnd       x160                 1
+ UP bnd       x161                 1
+ UP bnd       x162                 1
+ UP bnd       x163                 1
+ UP bnd       x164                 1
+ UP bnd       x165                 1
+ UP bnd       x166                 1
+ UP bnd       x167                 1
+ UP bnd       x168                 1
+ UP bnd       x169                 1
+ UP bnd       x170                 1
+ UP bnd       x171                 1
+ UP bnd       x172                 1
+ UP bnd       x173                 1
+ UP bnd       x174                 1
+ UP bnd       x175                 1
+ UP bnd       x176                 1
+ UP bnd       x177                 1
+ UP bnd       x178                 1
+ UP bnd       x179                 1
+ UP bnd       x180                 1
+ UP bnd       x181                 1
+ UP bnd       x182                 1
+ UP bnd       x183                 1
+ UP bnd       x184                 1
+ UP bnd       x185                 1
+ UP bnd       x186                 1
+ UP bnd       x187                 1
+ UP bnd       x188                 1
+ UP bnd       x189                 1
+ UP bnd       x190                 1
+ UP bnd       x191                 1
+ UP bnd       x192                 1
+ UP bnd       x193                 1
+ UP bnd       x194                 1
+ UP bnd       x195                 1
+ UP bnd       x196                 1
+ UP bnd       x197                 1
+ UP bnd       x198                 1
+ UP bnd       x199                 1
+ UP bnd       x200                 1
+ UP bnd       x201                 1
+ UP bnd       x202                 1
+ UP bnd       x203                 1
+ UP bnd       x204                 1
+ UP bnd       x205                 1
+ UP bnd       x206                 1
+ UP bnd       x207                 1
+ UP bnd       x208                 1
+ UP bnd       x209                 1
+ UP bnd       x210                 1
+ UP bnd       x211                 1
+ UP bnd       x212                 1
+ UP bnd       x213                 1
+ UP bnd       x214                 1
+ UP bnd       x215                 1
+ UP bnd       x216                 1
+ UP bnd       x217                 1
+ UP bnd       x218                 1
+ UP bnd       x219                 1
+ UP bnd       x220                 1
+ UP bnd       x221                 1
+ UP bnd       x222                 1
+ UP bnd       x223                 1
+ UP bnd       x224                 1
+ UP bnd       x225                 1
+ UP bnd       x226                 1
+ UP bnd       x227                 1
+ UP bnd       x228                 1
+ UP bnd       x229                 1
+ UP bnd       x230                 1
+ UP bnd       x231                 1
+ UP bnd       x232                 1
+ UP bnd       x233                 1
+ UP bnd       x234                 1
+ UP bnd       x235                 1
+ UP bnd       x236                 1
+ UP bnd       x237                 1
+ UP bnd       x238                 1
+ UP bnd       x239                 1
+ UP bnd       x240                 1
+ UP bnd       x241                 1
+ UP bnd       x242                 1
+ UP bnd       x243                 1
+ UP bnd       x244                 1
+ UP bnd       x245                 1
+ UP bnd       x246                 1
+ UP bnd       x247                 1
+ UP bnd       x248                 1
+ UP bnd       x249                 1
+ UP bnd       x250                 1
+ UP bnd       x251                 1
+ UP bnd       x252                 1
+ UP bnd       x253                 1
+ UP bnd       x254                 1
+ UP bnd       x255                 1
+ UP bnd       x256                 1
+ UP bnd       x257                 1
+ UP bnd       x258                 1
+ UP bnd       x259                 1
+ UP bnd       x260                 1
+ UP bnd       x261                 1
+ UP bnd       x262                 1
+ UP bnd       x263                 1
+ UP bnd       x264                 1
+ UP bnd       x265                 1
+ UP bnd       x266                 1
+ UP bnd       x267                 1
+ UP bnd       x268                 1
+ UP bnd       x269                 1
+ UP bnd       x270                 1
+ UP bnd       x271                 1
+ UP bnd       x272                 1
+ UP bnd       x273                 1
+ UP bnd       x274                 1
+ UP bnd       x275                 1
+ UP bnd       x276                 1
+ UP bnd       x277                 1
+ UP bnd       x278                 1
+ UP bnd       x279                 1
+ UP bnd       x280                 1
+ UP bnd       x281                 1
+ UP bnd       x282                 1
+ UP bnd       x283                 1
+ UP bnd       x284                 1
+ UP bnd       x285                 1
+ UP bnd       x286                 1
+ UP bnd       x287                 1
+ UP bnd       x288                 1
+ UP bnd       x289                 1
+ UP bnd       x290                 1
+ UP bnd       x291                 1
+ UP bnd       x292                 1
+ UP bnd       x293                 1
+ UP bnd       x294                 1
+ UP bnd       x295                 1
+ UP bnd       x296                 1
+ UP bnd       x297                 1
+ UP bnd       x298                 1
+ UP bnd       x299                 1
+ UP bnd       x300                 1
+ UP bnd       x301                 1
+ UP bnd       x302                 1
+ UP bnd       x303                 1
+ UP bnd       x304                 1
+ UP bnd       x305                 1
+ UP bnd       x306                 1
+ UP bnd       x307                 1
+ UP bnd       x308                 1
+ UP bnd       x309                 1
+ UP bnd       x310                 1
+ UP bnd       x311                 1
+ UP bnd       x312                 1
+ UP bnd       x313                 1
+ UP bnd       x314                 1
+ UP bnd       x315                 1
+ UP bnd       x316                 1
+ UP bnd       x317                 1
+ UP bnd       x318                 1
+ UP bnd       x319                 1
+ UP bnd       x320                 1
+ UP bnd       x321                 1
+ UP bnd       x322                 1
+ UP bnd       x323                 1
+ UP bnd       x324                 1
+ UP bnd       x325                 1
+ UP bnd       x326                 1
+ UP bnd       x327                 1
+ UP bnd       x328                 1
+ UP bnd       x329                 1
+ UP bnd       x330                 1
+ UP bnd       x331                 1
+ UP bnd       x332                 1
+ UP bnd       x333                 1
+ UP bnd       x334                 1
+ UP bnd       x335                 1
+ UP bnd       x336                 1
+ UP bnd       x337                 1
+ UP bnd       x338                 1
+ UP bnd       x339                 1
+ UP bnd       x340                 1
+ UP bnd       x341                 1
+ UP bnd       x342                 1
+ UP bnd       x343                 1
+ UP bnd       x344                 1
+ UP bnd       x345                 1
+ UP bnd       x346                 1
+ UP bnd       x347                 1
+ UP bnd       x348                 1
+ UP bnd       x349                 1
+ UP bnd       x350                 1
+ UP bnd       x351                 1
+ UP bnd       x352                 1
+ UP bnd       x353                 1
+ UP bnd       x354                 1
+ UP bnd       x355                 1
+ UP bnd       x356                 1
+ UP bnd       x357                 1
+ UP bnd       x358                 1
+ UP bnd       x359                 1
+ UP bnd       x360                 1
+ UP bnd       x361                 1
+ UP bnd       x362                 1
+ UP bnd       x363                 1
+ UP bnd       x364                 1
+ UP bnd       x365                 1
+ UP bnd       x366                 1
+ UP bnd       x367                 1
+ UP bnd       x368                 1
+ UP bnd       x369                 1
+ UP bnd       x370                 1
+ UP bnd       x371                 1
+ UP bnd       x372                 1
+ UP bnd       x373                 1
+ UP bnd       x374                 1
+ UP bnd       x375                 1
+ UP bnd       x376                 1
+ UP bnd       x377                 1
+ UP bnd       x378                 1
+ UP bnd       x379                 1
+ UP bnd       x380                 1
+ UP bnd       x381                 1
+ UP bnd       x382                 1
+ UP bnd       x383                 1
+ UP bnd       x384                 1
+ UP bnd       x385                 1
+ UP bnd       x386                 1
+ UP bnd       x387                 1
+ UP bnd       x388                 1
+ UP bnd       x389                 1
+ UP bnd       x390                 1
+ UP bnd       x391                 1
+ UP bnd       x392                 1
+ UP bnd       x393                 1
+ UP bnd       x394                 1
+ UP bnd       x395                 1
+ UP bnd       x396                 1
+ UP bnd       x397                 1
+ UP bnd       x398                 1
+ UP bnd       x399                 1
+ UP bnd       x400                 1
+ UP bnd       x401                 1
+ UP bnd       x402                 1
+ UP bnd       x403                 1
+ UP bnd       x404                 1
+ UP bnd       x405                 1
+ UP bnd       x406                 1
+ UP bnd       x407                 1
+ UP bnd       x408                 1
+ UP bnd       x409                 1
+ UP bnd       x410                 1
+ UP bnd       x411                 1
+ UP bnd       x412                 1
+ UP bnd       x413                 1
+ UP bnd       x414                 1
+ UP bnd       x415                 1
+ UP bnd       x416                 1
+ UP bnd       x417                 1
+ UP bnd       x418                 1
+ UP bnd       x419                 1
+ UP bnd       x420                 1
+ UP bnd       x421                 1
+ UP bnd       x422                 1
+ UP bnd       x423                 1
+ UP bnd       x424                 1
+ UP bnd       x425                 1
+ UP bnd       x426                 1
+ UP bnd       x427                 1
+ UP bnd       x428                 1
+ UP bnd       x429                 1
+ UP bnd       x430                 1
+ UP bnd       x431                 1
+ UP bnd       x432                 1
+ UP bnd       x433                 1
+ UP bnd       x434                 1
+ UP bnd       x435                 1
+ UP bnd       x436                 1
+ UP bnd       x437                 1
+ UP bnd       x438                 1
+ UP bnd       x439                 1
+ UP bnd       x440                 1
+ UP bnd       x441                 1
+ UP bnd       x442                 1
+ UP bnd       x443                 1
+ UP bnd       x444                 1
+ UP bnd       x445                 1
+ UP bnd       x446                 1
+ UP bnd       x447                 1
+ UP bnd       x448                 1
+ UP bnd       x449                 1
+ UP bnd       x450                 1
+ UP bnd       x451                 1
+ UP bnd       x452                 1
+ UP bnd       x453                 1
+ UP bnd       x454                 1
+ UP bnd       x455                 1
+ UP bnd       x456                 1
+ UP bnd       x457                 1
+ UP bnd       x458                 1
+ UP bnd       x459                 1
+ UP bnd       x460                 1
+ UP bnd       x461                 1
+ UP bnd       x462                 1
+ UP bnd       x463                 1
+ UP bnd       x464                 1
+ UP bnd       x465                 1
+ UP bnd       x466                 1
+ UP bnd       x467                 1
+ UP bnd       x468                 1
+ UP bnd       x469                 1
+ UP bnd       x470                 1
+ UP bnd       x471                 1
+ UP bnd       x472                 1
+ UP bnd       x473                 1
+ UP bnd       x474                 1
+ UP bnd       x475                 1
+ UP bnd       x476                 1
+ UP bnd       x477                 1
+ UP bnd       x478                 1
+ UP bnd       x479                 1
+ UP bnd       x480                 1
+ UP bnd       x481                 1
+ UP bnd       x482                 1
+ UP bnd       x483                 1
+ UP bnd       x484                 1
+ UP bnd       x485                 1
+ UP bnd       x486                 1
+ UP bnd       x487                 1
+ UP bnd       x488                 1
+ UP bnd       x489                 1
+ UP bnd       x490                 1
+ UP bnd       x491                 1
+ UP bnd       x492                 1
+ UP bnd       x493                 1
+ UP bnd       x494                 1
+ UP bnd       x495                 1
+ UP bnd       x496                 1
+ UP bnd       x497                 1
+ UP bnd       x498                 1
+ UP bnd       x499                 1
+ UP bnd       x500                 1
+ UP bnd       x501                 1
+ UP bnd       x502                 1
+ UP bnd       x503                 1
+ UP bnd       x504                 1
+ UP bnd       x505                 1
+ UP bnd       x506                 1
+ UP bnd       x507                 1
+ UP bnd       x508                 1
+ UP bnd       x509                 1
+ UP bnd       x510                 1
+ UP bnd       x511                 1
+ UP bnd       x512                 1
+ UP bnd       x513                 1
+ UP bnd       x514                 1
+ UP bnd       x515                 1
+ UP bnd       x516                 1
+ UP bnd       x517                 1
+ UP bnd       x518                 1
+ UP bnd       x519                 1
+ UP bnd       x520                 1
+ UP bnd       x521                 1
+ UP bnd       x522                 1
+ UP bnd       x523                 1
+ UP bnd       x524                 1
+ UP bnd       x525                 1
+ UP bnd       x526                 1
+ UP bnd       x527                 1
+ UP bnd       x528                 1
+ UP bnd       x529                 1
+ UP bnd       x530                 1
+ UP bnd       x531                 1
+ UP bnd       x532                 1
+ UP bnd       x533                 1
+ UP bnd       x534                 1
+ UP bnd       x535                 1
+ UP bnd       x536                 1
+ UP bnd       x537                 1
+ UP bnd       x538                 1
+ UP bnd       x539                 1
+ UP bnd       x540                 1
+ UP bnd       x541                 1
+ UP bnd       x542                 1
+ UP bnd       x543                 1
+ UP bnd       x544                 1
+ UP bnd       x545                 1
+ UP bnd       x546                 1
+ UP bnd       x547                 1
+ UP bnd       x548                 1
+ UP bnd       x549                 1
+ UP bnd       x550                 1
+ UP bnd       x551                 1
+ UP bnd       x552                 1
+ UP bnd       x553                 1
+ UP bnd       x554                 1
+ UP bnd       x555                 1
+ UP bnd       x556                 1
+ UP bnd       x557                 1
+ UP bnd       x558                 1
+ UP bnd       x559                 1
+ UP bnd       x560                 1
+ UP bnd       x561                 1
+ UP bnd       x562                 1
+ UP bnd       x563                 1
+ UP bnd       x564                 1
+ UP bnd       x565                 1
+ UP bnd       x566                 1
+ UP bnd       x567                 1
+ UP bnd       x568                 1
+ UP bnd       x569                 1
+ UP bnd       x570                 1
+ UP bnd       x571                 1
+ UP bnd       x572                 1
+ UP bnd       x573                 1
+ UP bnd       x574                 1
+ UP bnd       x575                 1
+ UP bnd       x576                 1
+ UP bnd       x577                 1
+ UP bnd       x578                 1
+ UP bnd       x579                 1
+ UP bnd       x580                 1
+ UP bnd       x581                 1
+ UP bnd       x582                 1
+ UP bnd       x583                 1
+ UP bnd       x584                 1
+ UP bnd       x585                 1
+ UP bnd       x586                 1
+ UP bnd       x587                 1
+ UP bnd       x588                 1
+ UP bnd       x589                 1
+ UP bnd       x590                 1
+ UP bnd       x591                 1
+ UP bnd       x592                 1
+ UP bnd       x593                 1
+ UP bnd       x594                 1
+ UP bnd       x595                 1
+ UP bnd       x596                 1
+ UP bnd       x597                 1
+ UP bnd       x598                 1
+ UP bnd       x599                 1
+ UP bnd       x600                 1
+ UP bnd       x601                 1
+ UP bnd       x602                 1
+ UP bnd       x603                 1
+ UP bnd       x604                 1
+ UP bnd       x605                 1
+ UP bnd       x606                 1
+ UP bnd       x607                 1
+ UP bnd       x608                 1
+ UP bnd       x609                 1
+ UP bnd       x610                 1
+ UP bnd       x611                 1
+ UP bnd       x612                 1
+ UP bnd       x613                 1
+ UP bnd       x614                 1
+ UP bnd       x615                 1
+ UP bnd       x616                 1
+ UP bnd       x617                 1
+ UP bnd       x618                 1
+ UP bnd       x619                 1
+ UP bnd       x620                 1
+ UP bnd       x621                 1
+ UP bnd       x622                 1
+ UP bnd       x623                 1
+ UP bnd       x624                 1
+ UP bnd       x625                 1
+ UP bnd       x626                 1
+ UP bnd       x627                 1
+ UP bnd       x628                 1
+ UP bnd       x629                 1
+ UP bnd       x630                 1
+ UP bnd       x631                 1
+ UP bnd       x632                 1
+ UP bnd       x633                 1
+ UP bnd       x634                 1
+ UP bnd       x635                 1
+ UP bnd       x636                 1
+ UP bnd       x637                 1
+ UP bnd       x638                 1
+ UP bnd       x639                 1
+ UP bnd       x640                 1
+ UP bnd       x641                 1
+ UP bnd       x642                 1
+ UP bnd       x643                 1
+ UP bnd       x644                 1
+ UP bnd       x645                 1
+ UP bnd       x646                 1
+ UP bnd       x647                 1
+ UP bnd       x648                 1
+ UP bnd       x649                 1
+ UP bnd       x650                 1
+ UP bnd       x651                 1
+ UP bnd       x652                 1
+ UP bnd       x653                 1
+ UP bnd       x654                 1
+ UP bnd       x655                 1
+ UP bnd       x656                 1
+ UP bnd       x657                 1
+ UP bnd       x658                 1
+ UP bnd       x659                 1
+ UP bnd       x660                 1
+ UP bnd       x661                 1
+ UP bnd       x662                 1
+ UP bnd       x663                 1
+ UP bnd       x664                 1
+ UP bnd       x665                 1
+ UP bnd       x666                 1
+ UP bnd       x667                 1
+ UP bnd       x668                 1
+ UP bnd       x669                 1
+ UP bnd       x670                 1
+ UP bnd       x671                 1
+ UP bnd       x672                 1
+ UP bnd       x673                 1
+ UP bnd       x674                 1
+ UP bnd       x675                 1
+ UP bnd       x676                 1
+ UP bnd       x677                 1
+ UP bnd       x678                 1
+ UP bnd       x679                 1
+ UP bnd       x680                 1
+ UP bnd       x681                 1
+ UP bnd       x682                 1
+ UP bnd       x683                 1
+ UP bnd       x684                 1
+ UP bnd       x685                 1
+ UP bnd       x686                 1
+ UP bnd       x687                 1
+ UP bnd       x688                 1
+ UP bnd       x689                 1
+ UP bnd       x690                 1
+ UP bnd       x691                 1
+ UP bnd       x692                 1
+ UP bnd       x693                 1
+ UP bnd       x694                 1
+ UP bnd       x695                 1
+ UP bnd       x696                 1
+ UP bnd       x697                 1
+ UP bnd       x698                 1
+ UP bnd       x699                 1
+ UP bnd       x700                 1
+ UP bnd       x701                 1
+ UP bnd       x702                 1
+ UP bnd       x703                 1
+ UP bnd       x704                 1
+ UP bnd       x705                 1
+ UP bnd       x706                 1
+ UP bnd       x707                 1
+ UP bnd       x708                 1
+ UP bnd       x709                 1
+ UP bnd       x710                 1
+ UP bnd       x711                 1
+ UP bnd       x712                 1
+ UP bnd       x713                 1
+ UP bnd       x714                 1
+ UP bnd       x715                 1
+ UP bnd       x716                 1
+ UP bnd       x717                 1
+ UP bnd       x718                 1
+ UP bnd       x719                 1
+ UP bnd       x720                 1
+ UP bnd       x721                 1
+ UP bnd       x722                 1
+ UP bnd       x723                 1
+ UP bnd       x724                 1
+ UP bnd       x725                 1
+ UP bnd       x726                 1
+ UP bnd       x727                 1
+ UP bnd       x728                 1
+ UP bnd       x729                 1
+ UP bnd       x730                 1
+ UP bnd       x731                 1
+ UP bnd       x732                 1
+ UP bnd       x733                 1
+ UP bnd       x734                 1
+ UP bnd       x735                 1
+ UP bnd       x736                 1
+ UP bnd       x737                 1
+ UP bnd       x738                 1
+ UP bnd       x739                 1
+ UP bnd       x740                 1
+ UP bnd       x741                 1
+ UP bnd       x742                 1
+ UP bnd       x743                 1
+ UP bnd       x744                 1
+ UP bnd       x745                 1
+ UP bnd       x746                 1
+ UP bnd       x747                 1
+ UP bnd       x748                 1
+ UP bnd       x749                 1
+ UP bnd       x750                 1
+ UP bnd       x751                 1
+ UP bnd       x752                 1
+ UP bnd       x753                 1
+ UP bnd       x754                 1
+ UP bnd       x755                 1
+ UP bnd       x756                 1
+ UP bnd       x757                 1
+ UP bnd       x758                 1
+ UP bnd       x759                 1
+ UP bnd       x760                 1
+ UP bnd       x761                 1
+ UP bnd       x762                 1
+ UP bnd       x763                 1
+ UP bnd       x764                 1
+ UP bnd       x765                 1
+ UP bnd       x766                 1
+ UP bnd       x767                 1
+ UP bnd       x768                 1
+ UP bnd       x769                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/p0033.mps b/demos/ppl_lpsol/examples/p0033.mps
new file mode 100644
index 0000000..7237e25
--- /dev/null
+++ b/demos/ppl_lpsol/examples/p0033.mps
@@ -0,0 +1,152 @@
+*NAME:         p0033
+*ROWS:         16
+*COLUMNS:      33
+*INTEGER:      33
+*NONZERO:      98
+*BEST SOLN:    3089 (opt)
+*LP SOLN:      2520.57
+*SOURCE:       Crowder-Johnson-Padberg test set
+*              
+*              E. Andrew Boyd (Rice University)
+*APPLICATION:  unknown
+*COMMENTS:     pure 0/1 IP
+*              5 SOS constraints 
+*              
+NAME          P0033  
+ROWS
+ N  R100    
+ L  R114    
+ L  R115    
+ L  R116    
+ L  R117    
+ L  R118    
+ L  R119    
+ L  R120    
+ L  R121    
+ L  R122    
+ L  R123    
+ L  R124    
+ L  R125    
+ L  R126    
+ L  R127    
+ L  R128    
+ L  ZBESTROW
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    C157      R100               171   R114                 1
+    C157      R122              -300   R123              -300
+    C158      R100               171   R114                 1
+    C158      R126              -300   R127              -300
+    C159      R100               171   R114                 1
+    C159      R119               300   R120              -300
+    C159      R123              -300
+    C160      R100               171   R114                 1
+    C160      R119               300   R120              -300
+    C160      R121              -300
+    C161      R100               163   R115                 1
+    C161      R119               285   R120              -285
+    C161      R124              -285   R125              -285
+    C162      R100               162   R115                 1
+    C162      R119               285   R120              -285
+    C162      R122              -285   R123              -285
+    C163      R100               163   R115                 1
+    C163      R128              -285
+    C164      R100                69   R116                 1
+    C164      R119               265   R120              -265
+    C164      R124              -265   R125              -265
+    C165      R100                69   R116                 1
+    C165      R119               265   R120              -265
+    C165      R122              -265   R123              -265
+    C166      R100               183   R117                 1
+    C166      R118              -230
+    C167      R100               183   R117                 1
+    C167      R124              -230   R125              -230
+    C168      R100               183   R117                 1
+    C168      R119               230   R120              -230
+    C168      R125              -230
+    C169      R100               183   R117                 1
+    C169      R119               230   R120              -230
+    C169      R123              -230
+    C170      R100                49   R119               190
+    C170      R120              -190   R122              -190
+    C170      R123              -190
+    C171      R100               183   R117                 1
+    C172      R100               258   R118              -200
+    C173      R100               517   R118              -400
+    C174      R100               250   R126              -200
+    C174      R127              -200
+    C175      R100               500   R126              -400
+    C175      R127              -400
+    C176      R100               250   R127              -200
+    C177      R100               500   R127              -400
+    C178      R100               159   R119               200
+    C178      R120              -200   R124              -200
+    C178      R125              -200
+    C179      R100               318   R119               400
+    C179      R120              -400   R124              -400
+    C179      R125              -400
+    C180      R100               159   R119               200
+    C180      R120              -200   R125              -200
+    C181      R100               318   R119               400
+    C181      R120              -400   R125              -400
+    C182      R100               159   R119               200
+    C182      R120              -200   R122              -200
+    C182      R123              -200
+    C183      R100               318   R119               400
+    C183      R120              -400   R122              -400
+    C183      R123              -400
+    C184      R100               159   R119               200
+    C184      R120              -200   R123              -200
+    C185      R100               318   R119               400
+    C185      R120              -400   R123              -400
+    C186      R100               114   R119               200
+    C186      R120              -200   R121              -200
+    C187      R100               228   R119               400
+    C187      R120              -400   R121              -400
+    C188      R100               159   R128              -200
+    C189      R100               318   R128              -400
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       R114                 1   R115                 1
+    RHS       R116                 1   R117                 1
+    RHS       R118                -5   R119              2700
+    RHS       R120             -2600   R121              -100
+    RHS       R122              -900   R123             -1656
+    RHS       R124              -335   R125             -1026
+    RHS       R126                -5   R127              -500
+    RHS       R128              -270
+BOUNDS
+ UP ONE       C157                 1
+ UP ONE       C158                 1
+ UP ONE       C159                 1
+ UP ONE       C160                 1
+ UP ONE       C161                 1
+ UP ONE       C162                 1
+ UP ONE       C163                 1
+ UP ONE       C164                 1
+ UP ONE       C165                 1
+ UP ONE       C166                 1
+ UP ONE       C167                 1
+ UP ONE       C168                 1
+ UP ONE       C169                 1
+ UP ONE       C170                 1
+ UP ONE       C171                 1
+ UP ONE       C172                 1
+ UP ONE       C173                 1
+ UP ONE       C174                 1
+ UP ONE       C175                 1
+ UP ONE       C176                 1
+ UP ONE       C177                 1
+ UP ONE       C178                 1
+ UP ONE       C179                 1
+ UP ONE       C180                 1
+ UP ONE       C181                 1
+ UP ONE       C182                 1
+ UP ONE       C183                 1
+ UP ONE       C184                 1
+ UP ONE       C185                 1
+ UP ONE       C186                 1
+ UP ONE       C187                 1
+ UP ONE       C188                 1
+ UP ONE       C189                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/pk1.mps b/demos/ppl_lpsol/examples/pk1.mps
new file mode 100644
index 0000000..283ea72
--- /dev/null
+++ b/demos/ppl_lpsol/examples/pk1.mps
@@ -0,0 +1,603 @@
+NAME           pk1
+ROWS
+ N  obj     
+ E  c1      
+ E  c2      
+ E  c3      
+ E  c4      
+ E  c5      
+ E  c6      
+ E  c7      
+ E  c8      
+ E  c9      
+ E  c10     
+ E  c11     
+ E  c12     
+ E  c13     
+ E  c14     
+ E  c15     
+ G  c16     
+ G  c17     
+ G  c18     
+ G  c19     
+ G  c20     
+ G  c21     
+ G  c22     
+ G  c23     
+ G  c24     
+ G  c25     
+ G  c26     
+ G  c27     
+ G  c28     
+ G  c29     
+ G  c30     
+ G  c31     
+ G  c32     
+ G  c33     
+ G  c34     
+ G  c35     
+ G  c36     
+ G  c37     
+ G  c38     
+ G  c39     
+ G  c40     
+ G  c41     
+ G  c42     
+ G  c43     
+ G  c44     
+ G  c45     
+COLUMNS
+    x1        obj                  1   c16                  1
+    x1        c17                  1   c18                  1
+    x1        c19                  1   c20                  1
+    x1        c21                  1   c22                  1
+    x1        c23                  1   c24                  1
+    x1        c25                  1   c26                  1
+    x1        c27                  1   c28                  1
+    x1        c29                  1   c30                  1
+    x1        c31                  1   c32                  1
+    x1        c33                  1   c34                  1
+    x1        c35                  1   c36                  1
+    x1        c37                  1   c38                  1
+    x1        c39                  1   c40                  1
+    x1        c41                  1   c42                  1
+    x1        c43                  1   c44                  1
+    x1        c45                  1
+    MARK0000  'MARKER'                 'INTORG'
+    x2        c1                  14   c2                  53
+    x2        c3                  48   c4                  33
+    x2        c5                  15   c6                  43
+    x2        c7                   8   c8                  38
+    x2        c9                  34   c10                 37
+    x2        c11                 25   c12                 42
+    x2        c13                 16   c14                 10
+    x2        c15                 28
+    x3        c1                  36   c2                  48
+    x3        c3                  34   c4                  34
+    x3        c5                   9   c6                  28
+    x3        c7                  30   c8                  42
+    x3        c9                  13   c10                 42
+    x3        c11                 47   c12                 33
+    x3        c13                  6   c14                 51
+    x3        c15                 47
+    x4        c1                  11   c2                  48
+    x4        c3                   8   c4                  36
+    x4        c5                  24   c6                  30
+    x4        c7                  18   c8                  24
+    x4        c9                  39   c10                 23
+    x4        c11                 25   c12                 45
+    x4        c13                 47   c14                 33
+    x4        c15                 16
+    x5        c1                  27   c2                  12
+    x5        c3                   5   c4                  34
+    x5        c5                  43   c6                  30
+    x5        c7                  16   c8                  46
+    x5        c9                  19   c10                 41
+    x5        c11                 29   c12                  6
+    x5        c13                 30   c14                 23
+    x5        c15                 32
+    x6        c1                  49   c2                  43
+    x6        c3                  49   c4                  19
+    x6        c5                  53   c6                  10
+    x6        c7                  18   c8                  20
+    x6        c9                  51   c10                 33
+    x6        c11                 44   c12                 33
+    x6        c13                 45   c14                 31
+    x6        c15                 28
+    x7        c1                  26   c2                  42
+    x7        c3                  21   c4                  19
+    x7        c5                  54   c6                  26
+    x7        c7                  21   c8                  11
+    x7        c9                  13   c10                 14
+    x7        c11                 22   c12                  6
+    x7        c13                 37   c14                 34
+    x7        c15                 16
+    x8        c1                  37   c2                  14
+    x8        c3                  38   c4                  30
+    x8        c5                  29   c6                  32
+    x8        c7                  24   c8                  32
+    x8        c9                  22   c10                 40
+    x8        c11                 10   c12                 24
+    x8        c13                 16   c14                 32
+    x8        c15                 32
+    x9        c1                  45   c2                  48
+    x9        c3                  11   c4                  48
+    x9        c5                  24   c6                  54
+    x9        c7                  46   c8                  52
+    x9        c9                  20   c10                 53
+    x9        c11                 21   c12                 54
+    x9        c13                 19   c14                 23
+    x9        c15                 15
+    x10       c1                  21   c2                  16
+    x10       c3                  26   c4                  32
+    x10       c5                  11   c6                  26
+    x10       c7                  47   c8                  24
+    x10       c9                  24   c10                 14
+    x10       c11                  5   c12                  9
+    x10       c13                  5   c14                 38
+    x10       c15                 11
+    x11       c1                   6   c2                  23
+    x11       c3                  12   c4                  30
+    x11       c5                  47   c6                  52
+    x11       c7                   6   c8                  31
+    x11       c9                  45   c10                 23
+    x11       c11                 10   c12                 12
+    x11       c13                 44   c14                 32
+    x11       c15                  8
+    x12       c1                  48   c2                  25
+    x12       c3                  30   c4                  26
+    x12       c5                  24   c6                  34
+    x12       c7                  48   c8                  45
+    x12       c9                  30   c10                 37
+    x12       c11                 35   c12                 48
+    x12       c13                 45   c14                 40
+    x12       c15                 21
+    x13       c1                  38   c2                  36
+    x13       c3                  18   c4                  39
+    x13       c5                  34   c6                  24
+    x13       c7                  27   c8                  50
+    x13       c9                  51   c10                  9
+    x13       c11                 17   c12                 51
+    x13       c13                 53   c14                 30
+    x13       c15                 33
+    x14       c1                  37   c2                  54
+    x14       c3                  23   c4                  47
+    x14       c5                  29   c6                  21
+    x14       c7                  10   c8                  47
+    x14       c9                  24   c10                 14
+    x14       c11                 20   c12                 16
+    x14       c13                 22   c14                 14
+    x14       c15                 15
+    x15       c1                  10   c2                  34
+    x15       c3                   8   c4                  37
+    x15       c5                  49   c6                  39
+    x15       c7                  26   c8                   6
+    x15       c9                  17   c10                 38
+    x15       c11                 33   c12                 48
+    x15       c13                 40   c14                 19
+    x15       c15                 54
+    x16       c1                  16   c2                  45
+    x16       c3                  55   c4                  52
+    x16       c5                  50   c6                  41
+    x16       c7                   6   c8                  15
+    x16       c9                  23   c10                 19
+    x16       c11                 27   c12                  8
+    x16       c13                 47   c14                 37
+    x16       c15                 22
+    x17       c1                  35   c2                  51
+    x17       c3                  46   c4                  33
+    x17       c5                  39   c6                  47
+    x17       c7                  36   c8                  53
+    x17       c9                  22   c10                 24
+    x17       c11                 39   c12                 21
+    x17       c13                 55   c14                 48
+    x17       c15                 55
+    x18       c1                  17   c2                  45
+    x18       c3                   5   c4                   5
+    x18       c5                  50   c6                  36
+    x18       c7                  52   c8                  20
+    x18       c9                  29   c10                 29
+    x18       c11                 50   c12                 54
+    x18       c13                 43   c14                 36
+    x18       c15                 13
+    x19       c1                   7   c2                  46
+    x19       c3                  10   c4                  39
+    x19       c5                  36   c6                  27
+    x19       c7                  14   c8                  24
+    x19       c9                  36   c10                 55
+    x19       c11                 17   c12                 46
+    x19       c13                 34   c14                 33
+    x19       c15                 47
+    x20       c1                  46   c2                  30
+    x20       c3                  50   c4                  34
+    x20       c5                  32   c6                  52
+    x20       c7                  29   c8                  31
+    x20       c9                  14   c10                 29
+    x20       c11                 11   c12                 39
+    x20       c13                 33   c14                 27
+    x20       c15                 19
+    x21       c1                  26   c2                  38
+    x21       c3                  52   c4                  42
+    x21       c5                  42   c6                   7
+    x21       c7                  43   c8                  40
+    x21       c9                  33   c10                 40
+    x21       c11                 25   c12                 23
+    x21       c13                  6   c14                 20
+    x21       c15                 33
+    x22       c1                   8   c2                  52
+    x22       c3                  45   c4                  30
+    x22       c5                  55   c6                   6
+    x22       c7                   7   c8                  54
+    x22       c9                  51   c10                 52
+    x22       c11                 42   c12                 11
+    x22       c13                 13   c14                 14
+    x22       c15                 35
+    x23       c1                  40   c2                  21
+    x23       c3                  42   c4                  33
+    x23       c5                  21   c6                  52
+    x23       c7                   8   c8                  10
+    x23       c9                  17   c10                 54
+    x23       c11                 50   c12                 28
+    x23       c13                 15   c14                 50
+    x23       c15                 15
+    x24       c1                  19   c2                   9
+    x24       c3                  43   c4                  19
+    x24       c5                  11   c6                  13
+    x24       c7                  26   c8                  40
+    x24       c9                  35   c10                 16
+    x24       c11                 19   c12                 27
+    x24       c13                 36   c14                 54
+    x24       c15                 44
+    x25       c1                  33   c2                  21
+    x25       c3                  19   c4                  21
+    x25       c5                  24   c6                  30
+    x25       c7                  31   c8                  30
+    x25       c9                  31   c10                 23
+    x25       c11                 40   c12                 21
+    x25       c13                 41   c14                 34
+    x25       c15                 55
+    x26       c1                   5   c2                  15
+    x26       c3                  25   c4                  38
+    x26       c5                  45   c6                  32
+    x26       c7                  10   c8                  50
+    x26       c9                  39   c10                  8
+    x26       c11                 37   c12                 30
+    x26       c13                 39   c14                 50
+    x26       c15                 39
+    x27       c1                  42   c2                  22
+    x27       c3                   8   c4                  40
+    x27       c5                  10   c6                  46
+    x27       c7                   6   c8                  14
+    x27       c9                  12   c10                 53
+    x27       c11                 38   c12                 38
+    x27       c13                 50   c14                 14
+    x27       c15                 28
+    x28       c1                  22   c2                  12
+    x28       c3                  27   c4                   9
+    x28       c5                  30   c6                  41
+    x28       c7                   7   c8                  44
+    x28       c9                  47   c10                 23
+    x28       c11                 22   c12                 52
+    x28       c13                 38   c14                 54
+    x28       c15                 39
+    x29       c1                  14   c2                  12
+    x29       c3                   5   c4                  33
+    x29       c5                  42   c6                  12
+    x29       c7                  12   c8                  41
+    x29       c9                   9   c10                  9
+    x29       c11                 20   c12                 18
+    x29       c13                 18   c14                  9
+    x29       c15                 23
+    x30       c1                  51   c2                  19
+    x30       c3                  41   c4                  48
+    x30       c5                  38   c6                  44
+    x30       c7                  33   c8                  42
+    x30       c9                  46   c10                 52
+    x30       c11                  5   c12                 43
+    x30       c13                 36   c14                 37
+    x30       c15                  6
+    x31       c1                  49   c2                  17
+    x31       c3                  39   c4                  35
+    x31       c5                  51   c6                   7
+    x31       c7                  42   c8                  29
+    x31       c9                  46   c10                 52
+    x31       c11                 16   c12                 46
+    x31       c13                  6   c14                 55
+    x31       c15                 20
+    x32       c1                   7   c2                  38
+    x32       c3                  52   c4                  42
+    x32       c5                   6   c6                  12
+    x32       c7                  41   c8                   8
+    x32       c9                  55   c10                 37
+    x32       c11                 22   c12                 42
+    x32       c13                 13   c14                 55
+    x32       c15                 36
+    x33       c1                  10   c2                  17
+    x33       c3                  33   c4                  26
+    x33       c5                  48   c6                  32
+    x33       c7                  37   c8                  24
+    x33       c9                  25   c10                 33
+    x33       c11                 25   c12                 29
+    x33       c13                 47   c14                 42
+    x33       c15                 29
+    x34       c1                  30   c2                   9
+    x34       c3                  17   c4                  13
+    x34       c5                   5   c6                  30
+    x34       c7                  17   c8                  16
+    x34       c9                  55   c10                 39
+    x34       c11                  8   c12                 23
+    x34       c13                  8   c14                 51
+    x34       c15                 12
+    x35       c1                  14   c2                  30
+    x35       c3                   5   c4                  23
+    x35       c5                  25   c6                  38
+    x35       c7                  55   c8                  27
+    x35       c9                  38   c10                 55
+    x35       c11                 43   c12                 32
+    x35       c13                  5   c14                 32
+    x35       c15                 48
+    x36       c1                  32   c2                  24
+    x36       c3                  34   c4                  55
+    x36       c5                  36   c6                   6
+    x36       c7                  48   c8                  15
+    x36       c9                  39   c10                 18
+    x36       c11                 50   c12                 31
+    x36       c13                 22   c14                 10
+    x36       c15                  6
+    x37       c1                  24   c2                  48
+    x37       c3                  11   c4                  27
+    x37       c5                  53   c6                  36
+    x37       c7                  31   c8                  31
+    x37       c9                  51   c10                 17
+    x37       c11                 47   c12                 52
+    x37       c13                 48   c14                 26
+    x37       c15                 35
+    x38       c1                  36   c2                  16
+    x38       c3                  21   c4                  37
+    x38       c5                  24   c6                   8
+    x38       c7                  20   c8                  34
+    x38       c9                  46   c10                 14
+    x38       c11                  9   c12                 33
+    x38       c13                 37   c14                 11
+    x38       c15                  8
+    x39       c1                  14   c2                  34
+    x39       c3                  16   c4                  30
+    x39       c5                  10   c6                  34
+    x39       c7                  17   c8                  42
+    x39       c9                   6   c10                 54
+    x39       c11                  5   c12                 51
+    x39       c13                 34   c14                 38
+    x39       c15                 33
+    x40       c1                  13   c2                  41
+    x40       c3                  17   c4                  20
+    x40       c5                  22   c6                  34
+    x40       c7                  21   c8                  28
+    x40       c9                  15   c10                 14
+    x40       c11                 12   c12                 50
+    x40       c13                 11   c14                 45
+    x40       c15                 46
+    x41       c1                  52   c2                  28
+    x41       c3                  42   c4                  14
+    x41       c5                  31   c6                  30
+    x41       c7                  11   c8                  53
+    x41       c9                  15   c10                 24
+    x41       c11                 10   c12                 38
+    x41       c13                 38   c14                 44
+    x41       c15                 15
+    x42       c1                  16   c2                  52
+    x42       c3                  23   c4                   5
+    x42       c5                  53   c6                  31
+    x42       c7                  19   c8                  17
+    x42       c9                  47   c10                 21
+    x42       c11                 10   c12                  7
+    x42       c13                 22   c14                 14
+    x42       c15                 37
+    x43       c1                   5   c2                  10
+    x43       c3                  43   c4                  42
+    x43       c5                  41   c6                  13
+    x43       c7                  13   c8                  18
+    x43       c9                  40   c10                 46
+    x43       c11                 42   c12                 42
+    x43       c13                 52   c14                 30
+    x43       c15                 11
+    x44       c1                  35   c2                   8
+    x44       c3                   5   c4                  49
+    x44       c5                  10   c6                  49
+    x44       c7                  34   c8                  48
+    x44       c9                  10   c10                 28
+    x44       c11                 22   c12                 34
+    x44       c13                 35   c14                 19
+    x44       c15                 44
+    x45       c1                  48   c2                  51
+    x45       c3                  42   c4                  47
+    x45       c5                  26   c6                  47
+    x45       c7                  24   c8                   8
+    x45       c9                  15   c10                 30
+    x45       c11                 25   c12                 18
+    x45       c13                 39   c14                 24
+    x45       c15                 48
+    x46       c1                  11   c2                  40
+    x46       c3                  47   c4                  24
+    x46       c5                  35   c6                  48
+    x46       c7                  35   c8                  19
+    x46       c9                  52   c10                 29
+    x46       c11                 20   c12                 35
+    x46       c13                 37   c14                 44
+    x46       c15                  9
+    x47       c1                  47   c2                  48
+    x47       c3                  55   c4                  45
+    x47       c5                  55   c6                  35
+    x47       c7                  35   c8                   7
+    x47       c9                  29   c10                 43
+    x47       c11                 45   c12                 37
+    x47       c13                 27   c14                 52
+    x47       c15                 11
+    x48       c1                  27   c2                  46
+    x48       c3                  32   c4                  25
+    x48       c5                  10   c6                  39
+    x48       c7                  55   c8                   6
+    x48       c9                  32   c10                 50
+    x48       c11                  9   c12                 35
+    x48       c13                 38   c14                 16
+    x48       c15                 47
+    x49       c1                  24   c2                  30
+    x49       c3                  47   c4                  24
+    x49       c5                  29   c6                  29
+    x49       c7                  31   c8                  35
+    x49       c9                  26   c10                 53
+    x49       c11                 15   c12                 33
+    x49       c13                 24   c14                 24
+    x49       c15                 18
+    x50       c1                  49   c2                  38
+    x50       c3                   9   c4                  28
+    x50       c5                  36   c6                   6
+    x50       c7                  44   c8                  27
+    x50       c9                  10   c10                 43
+    x50       c11                  7   c12                 28
+    x50       c13                  5   c14                 29
+    x50       c15                 54
+    x51       c1                  17   c2                  21
+    x51       c3                  26   c4                  54
+    x51       c5                  37   c6                  35
+    x51       c7                  29   c8                  33
+    x51       c9                  42   c10                 24
+    x51       c11                 15   c12                 18
+    x51       c13                 16   c14                 39
+    x51       c15                 10
+    x52       c1                  46   c2                  12
+    x52       c3                  43   c4                  11
+    x52       c5                  15   c6                  32
+    x52       c7                  19   c8                  20
+    x52       c9                  55   c10                 38
+    x52       c11                 35   c12                 52
+    x52       c13                 25   c14                 39
+    x52       c15                 46
+    x53       c1                  53   c2                  35
+    x53       c3                  50   c4                  53
+    x53       c5                  36   c6                   7
+    x53       c7                  46   c8                  25
+    x53       c9                   6   c10                 39
+    x53       c11                 44   c12                 34
+    x53       c13                 14   c14                 39
+    x53       c15                 34
+    x54       c1                  53   c2                  38
+    x54       c3                  13   c4                  32
+    x54       c5                  54   c6                  32
+    x54       c7                  33   c8                  39
+    x54       c9                  54   c10                 22
+    x54       c11                  9   c12                 42
+    x54       c13                 27   c14                 33
+    x54       c15                 20
+    x55       c1                  10   c2                  17
+    x55       c3                  30   c4                  25
+    x55       c5                  22   c6                  40
+    x55       c7                  41   c8                  55
+    x55       c9                  34   c10                 49
+    x55       c11                 50   c12                 24
+    x55       c13                  6   c14                 37
+    x55       c15                 35
+    x56       c1                  30   c2                  52
+    x56       c3                  14   c4                  19
+    x56       c5                  55   c6                  33
+    x56       c7                  22   c8                  51
+    x56       c9                  32   c10                  7
+    x56       c11                 28   c12                 51
+    x56       c13                 51   c14                 17
+    x56       c15                 33
+    MARK0001  'MARKER'                 'INTEND'
+    x57       c1                   1   c16                 -1
+    x58       c1                  -1   c17                 -1
+    x59       c2                   1   c18                 -1
+    x60       c2                  -1   c19                 -1
+    x61       c3                   1   c20                 -1
+    x62       c3                  -1   c21                 -1
+    x63       c4                   1   c22                 -1
+    x64       c4                  -1   c23                 -1
+    x65       c5                   1   c24                 -1
+    x66       c5                  -1   c25                 -1
+    x67       c6                   1   c26                 -1
+    x68       c6                  -1   c27                 -1
+    x69       c7                   1   c28                 -1
+    x70       c7                  -1   c29                 -1
+    x71       c8                   1   c30                 -1
+    x72       c8                  -1   c31                 -1
+    x73       c9                   1   c32                 -1
+    x74       c9                  -1   c33                 -1
+    x75       c10                  1   c34                 -1
+    x76       c10                 -1   c35                 -1
+    x77       c11                  1   c36                 -1
+    x78       c11                 -1   c37                 -1
+    x79       c12                  1   c38                 -1
+    x80       c12                 -1   c39                 -1
+    x81       c13                  1   c40                 -1
+    x82       c13                 -1   c41                 -1
+    x83       c14                  1   c42                 -1
+    x84       c14                 -1   c43                 -1
+    x85       c15                  1   c44                 -1
+    x86       c15                 -1   c45                 -1
+RHS
+    rhs       c1                 731   c2                 731
+    rhs       c3                 731   c4                 731
+    rhs       c5                 731   c6                 731
+    rhs       c7                 731   c8                 731
+    rhs       c9                 731   c10                731
+    rhs       c11                731   c12                731
+    rhs       c13                731   c14                731
+    rhs       c15                731
+BOUNDS
+ UP bnd       x2                   1
+ UP bnd       x3                   1
+ UP bnd       x4                   1
+ UP bnd       x5                   1
+ UP bnd       x6                   1
+ UP bnd       x7                   1
+ UP bnd       x8                   1
+ UP bnd       x9                   1
+ UP bnd       x10                  1
+ UP bnd       x11                  1
+ UP bnd       x12                  1
+ UP bnd       x13                  1
+ UP bnd       x14                  1
+ UP bnd       x15                  1
+ UP bnd       x16                  1
+ UP bnd       x17                  1
+ UP bnd       x18                  1
+ UP bnd       x19                  1
+ UP bnd       x20                  1
+ UP bnd       x21                  1
+ UP bnd       x22                  1
+ UP bnd       x23                  1
+ UP bnd       x24                  1
+ UP bnd       x25                  1
+ UP bnd       x26                  1
+ UP bnd       x27                  1
+ UP bnd       x28                  1
+ UP bnd       x29                  1
+ UP bnd       x30                  1
+ UP bnd       x31                  1
+ UP bnd       x32                  1
+ UP bnd       x33                  1
+ UP bnd       x34                  1
+ UP bnd       x35                  1
+ UP bnd       x36                  1
+ UP bnd       x37                  1
+ UP bnd       x38                  1
+ UP bnd       x39                  1
+ UP bnd       x40                  1
+ UP bnd       x41                  1
+ UP bnd       x42                  1
+ UP bnd       x43                  1
+ UP bnd       x44                  1
+ UP bnd       x45                  1
+ UP bnd       x46                  1
+ UP bnd       x47                  1
+ UP bnd       x48                  1
+ UP bnd       x49                  1
+ UP bnd       x50                  1
+ UP bnd       x51                  1
+ UP bnd       x52                  1
+ UP bnd       x53                  1
+ UP bnd       x54                  1
+ UP bnd       x55                  1
+ UP bnd       x56                  1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/rout.mps b/demos/ppl_lpsol/examples/rout.mps
new file mode 100644
index 0000000..cf0541a
--- /dev/null
+++ b/demos/ppl_lpsol/examples/rout.mps
@@ -0,0 +1,2038 @@
+NAME           rout
+ROWS
+ N  R0000292
+ E  c1      
+ L  c2      
+ L  c3      
+ L  c4      
+ L  c5      
+ L  c6      
+ L  c7      
+ L  c8      
+ L  c9      
+ L  c10     
+ L  c11     
+ L  c12     
+ L  c13     
+ L  c14     
+ L  c15     
+ L  c16     
+ L  c17     
+ L  c18     
+ L  c19     
+ L  c20     
+ L  c21     
+ E  c22     
+ E  c23     
+ E  c24     
+ E  c25     
+ E  c26     
+ E  c27     
+ E  c28     
+ E  c29     
+ E  c30     
+ E  c31     
+ E  c32     
+ E  c33     
+ E  c34     
+ E  c35     
+ E  c36     
+ E  c37     
+ E  c38     
+ E  c39     
+ E  c40     
+ E  c41     
+ E  c42     
+ E  c43     
+ E  c44     
+ E  c45     
+ E  c46     
+ E  c47     
+ E  c48     
+ E  c49     
+ E  c50     
+ E  c51     
+ L  c52     
+ L  c53     
+ L  c54     
+ L  c55     
+ L  c56     
+ L  c57     
+ L  c58     
+ L  c59     
+ L  c60     
+ L  c61     
+ L  c62     
+ L  c63     
+ L  c64     
+ L  c65     
+ L  c66     
+ L  c67     
+ L  c68     
+ L  c69     
+ L  c70     
+ L  c71     
+ L  c72     
+ L  c73     
+ L  c74     
+ L  c75     
+ L  c76     
+ L  c77     
+ L  c78     
+ L  c79     
+ L  c80     
+ L  c81     
+ L  c82     
+ L  c83     
+ L  c84     
+ L  c85     
+ L  c86     
+ L  c87     
+ L  c88     
+ L  c89     
+ L  c90     
+ L  c91     
+ L  c92     
+ L  c93     
+ L  c94     
+ L  c95     
+ L  c96     
+ L  c97     
+ L  c98     
+ L  c99     
+ L  c100    
+ L  c101    
+ L  c102    
+ L  c103    
+ L  c104    
+ L  c105    
+ L  c106    
+ L  c107    
+ L  c108    
+ L  c109    
+ L  c110    
+ L  c111    
+ L  c112    
+ L  c113    
+ L  c114    
+ L  c115    
+ L  c116    
+ L  c117    
+ L  c118    
+ L  c119    
+ L  c120    
+ L  c121    
+ L  c122    
+ L  c123    
+ L  c124    
+ L  c125    
+ L  c126    
+ L  c127    
+ L  c128    
+ L  c129    
+ L  c130    
+ L  c131    
+ L  c132    
+ L  c133    
+ L  c134    
+ L  c135    
+ L  c136    
+ L  c137    
+ L  c138    
+ L  c139    
+ L  c140    
+ L  c141    
+ L  c142    
+ L  c143    
+ L  c144    
+ L  c145    
+ L  c146    
+ L  c147    
+ L  c148    
+ L  c149    
+ L  c150    
+ L  c151    
+ L  c152    
+ L  c153    
+ L  c154    
+ L  c155    
+ L  c156    
+ L  c157    
+ L  c158    
+ L  c159    
+ L  c160    
+ L  c161    
+ L  c162    
+ L  c163    
+ L  c164    
+ L  c165    
+ L  c166    
+ L  c167    
+ L  c168    
+ L  c169    
+ L  c170    
+ L  c171    
+ L  c172    
+ L  c173    
+ L  c174    
+ L  c175    
+ L  c176    
+ L  c177    
+ L  c178    
+ L  c179    
+ L  c180    
+ L  c181    
+ L  c182    
+ L  c183    
+ L  c184    
+ L  c185    
+ L  c186    
+ L  c187    
+ L  c188    
+ L  c189    
+ L  c190    
+ L  c191    
+ L  c192    
+ L  c193    
+ L  c194    
+ L  c195    
+ L  c196    
+ L  c197    
+ L  c198    
+ L  c199    
+ L  c200    
+ L  c201    
+ L  c202    
+ L  c203    
+ L  c204    
+ L  c205    
+ L  c206    
+ L  c207    
+ L  c208    
+ L  c209    
+ L  c210    
+ L  c211    
+ L  c212    
+ L  c213    
+ L  c214    
+ L  c215    
+ L  c216    
+ L  c217    
+ L  c218    
+ L  c219    
+ L  c220    
+ L  c221    
+ L  c222    
+ L  c223    
+ L  c224    
+ L  c225    
+ L  c226    
+ L  c227    
+ L  c228    
+ L  c229    
+ L  c230    
+ L  c231    
+ L  c232    
+ L  c233    
+ L  c234    
+ L  c235    
+ L  c236    
+ L  c237    
+ L  c238    
+ L  c239    
+ L  c240    
+ L  c241    
+ L  c242    
+ L  c243    
+ L  c244    
+ L  c245    
+ L  c246    
+ L  c247    
+ L  c248    
+ L  c249    
+ L  c250    
+ L  c251    
+ L  c252    
+ L  c253    
+ L  c254    
+ L  c255    
+ L  c256    
+ L  c257    
+ L  c258    
+ L  c259    
+ L  c260    
+ L  c261    
+ L  c262    
+ L  c263    
+ L  c264    
+ L  c265    
+ L  c266    
+ L  c267    
+ L  c268    
+ L  c269    
+ L  c270    
+ L  c271    
+ L  c272    
+ L  c273    
+ L  c274    
+ L  c275    
+ L  c276    
+ L  c277    
+ L  c278    
+ L  c279    
+ L  c280    
+ L  c281    
+ L  c282    
+ L  c283    
+ L  c284    
+ L  c285    
+ L  c286    
+ L  c287    
+ L  c288    
+ L  c289    
+ L  c290    
+ L  c291    
+COLUMNS
+    x1        c37                 -1   c52                  1
+    x2        c38                 -1   c53                  1
+    x3        c39                 -1   c54                  1
+    x4        c40                 -1   c55                  1
+    x5        c41                 -1   c56                  1
+    x6        c42                 -1   c57                  1
+    x7        c43                 -1   c58                  1
+    x8        c44                 -1   c59                  1
+    x9        c45                 -1   c60                  1
+    x10       c46                 -1   c61                  1
+    x11       c47                 -1   c62                  1
+    x12       c48                 -1   c63                  1
+    x13       c49                 -1   c64                  1
+    x14       c50                 -1   c65                  1
+    x15       c51                 -1   c66                  1
+    x16       c47                  1   c67                  1
+    x17       c48                  1   c68                  1
+    x18       c49                  1   c69                  1
+    x19       c50                  1   c70                  1
+    x20       c51                  1   c71                  1
+    x21       c37                 -1   c47                  1
+    x21       c72                  1
+    x22       c38                 -1   c48                  1
+    x22       c73                  1
+    x23       c39                 -1   c49                  1
+    x23       c74                  1
+    x24       c40                 -1   c50                  1
+    x24       c75                  1
+    x25       c41                 -1   c51                  1
+    x25       c76                  1
+    x26       c42                 -1   c47                  1
+    x26       c77                  1
+    x27       c43                 -1   c48                  1
+    x27       c78                  1
+    x28       c44                 -1   c49                  1
+    x28       c79                  1
+    x29       c45                 -1   c50                  1
+    x29       c80                  1
+    x30       c46                 -1   c51                  1
+    x30       c81                  1
+    x31       c42                  1   c82                  1
+    x32       c43                  1   c83                  1
+    x33       c44                  1   c84                  1
+    x34       c45                  1   c85                  1
+    x35       c46                  1   c86                  1
+    x36       c37                 -1   c42                  1
+    x36       c87                  1
+    x37       c38                 -1   c43                  1
+    x37       c88                  1
+    x38       c39                 -1   c44                  1
+    x38       c89                  1
+    x39       c40                 -1   c45                  1
+    x39       c90                  1
+    x40       c41                 -1   c46                  1
+    x40       c91                  1
+    x41       c42                  1   c47                 -1
+    x41       c92                  1
+    x42       c43                  1   c48                 -1
+    x42       c93                  1
+    x43       c44                  1   c49                 -1
+    x43       c94                  1
+    x44       c45                  1   c50                 -1
+    x44       c95                  1
+    x45       c46                  1   c51                 -1
+    x45       c96                  1
+    x46       c37                  1   c97                  1
+    x47       c38                  1   c98                  1
+    x48       c39                  1   c99                  1
+    x49       c40                  1   c100                 1
+    x50       c41                  1   c101                 1
+    x51       c37                  1   c42                 -1
+    x51       c102                 1
+    x52       c38                  1   c43                 -1
+    x52       c103                 1
+    x53       c39                  1   c44                 -1
+    x53       c104                 1
+    x54       c40                  1   c45                 -1
+    x54       c105                 1
+    x55       c41                  1   c46                 -1
+    x55       c106                 1
+    x56       c37                  1   c47                 -1
+    x56       c107                 1
+    x57       c38                  1   c48                 -1
+    x57       c108                 1
+    x58       c39                  1   c49                 -1
+    x58       c109                 1
+    x59       c40                  1   c50                 -1
+    x59       c110                 1
+    x60       c41                  1   c51                 -1
+    x60       c111                 1
+    x61       c47                  1   c112                 1
+    x62       c48                  1   c113                 1
+    x63       c49                  1   c114                 1
+    x64       c50                  1   c115                 1
+    x65       c51                  1   c116                 1
+    x66       c37                 -1   c47                  1
+    x66       c117                 1
+    x67       c38                 -1   c48                  1
+    x67       c118                 1
+    x68       c39                 -1   c49                  1
+    x68       c119                 1
+    x69       c40                 -1   c50                  1
+    x69       c120                 1
+    x70       c41                 -1   c51                  1
+    x70       c121                 1
+    x71       c42                 -1   c47                  1
+    x71       c122                 1
+    x72       c43                 -1   c48                  1
+    x72       c123                 1
+    x73       c44                 -1   c49                  1
+    x73       c124                 1
+    x74       c45                 -1   c50                  1
+    x74       c125                 1
+    x75       c46                 -1   c51                  1
+    x75       c126                 1
+    x76       c47                  1   c127                 1
+    x77       c48                  1   c128                 1
+    x78       c49                  1   c129                 1
+    x79       c50                  1   c130                 1
+    x80       c51                  1   c131                 1
+    x81       c37                 -1   c47                  1
+    x81       c132                 1
+    x82       c38                 -1   c48                  1
+    x82       c133                 1
+    x83       c39                 -1   c49                  1
+    x83       c134                 1
+    x84       c40                 -1   c50                  1
+    x84       c135                 1
+    x85       c41                 -1   c51                  1
+    x85       c136                 1
+    x86       c42                 -1   c47                  1
+    x86       c137                 1
+    x87       c43                 -1   c48                  1
+    x87       c138                 1
+    x88       c44                 -1   c49                  1
+    x88       c139                 1
+    x89       c45                 -1   c50                  1
+    x89       c140                 1
+    x90       c46                 -1   c51                  1
+    x90       c141                 1
+    x91       c47                  1   c142                 1
+    x92       c48                  1   c143                 1
+    x93       c49                  1   c144                 1
+    x94       c50                  1   c145                 1
+    x95       c51                  1   c146                 1
+    x96       c37                 -1   c47                  1
+    x96       c147                 1
+    x97       c38                 -1   c48                  1
+    x97       c148                 1
+    x98       c39                 -1   c49                  1
+    x98       c149                 1
+    x99       c40                 -1   c50                  1
+    x99       c150                 1
+    x100      c41                 -1   c51                  1
+    x100      c151                 1
+    x101      c42                 -1   c47                  1
+    x101      c152                 1
+    x102      c43                 -1   c48                  1
+    x102      c153                 1
+    x103      c44                 -1   c49                  1
+    x103      c154                 1
+    x104      c45                 -1   c50                  1
+    x104      c155                 1
+    x105      c46                 -1   c51                  1
+    x105      c156                 1
+    x106      c42                  1   c157                 1
+    x107      c43                  1   c158                 1
+    x108      c44                  1   c159                 1
+    x109      c45                  1   c160                 1
+    x110      c46                  1   c161                 1
+    x111      c37                 -1   c42                  1
+    x111      c162                 1
+    x112      c38                 -1   c43                  1
+    x112      c163                 1
+    x113      c39                 -1   c44                  1
+    x113      c164                 1
+    x114      c40                 -1   c45                  1
+    x114      c165                 1
+    x115      c41                 -1   c46                  1
+    x115      c166                 1
+    x116      c42                  1   c47                 -1
+    x116      c167                 1
+    x117      c43                  1   c48                 -1
+    x117      c168                 1
+    x118      c44                  1   c49                 -1
+    x118      c169                 1
+    x119      c45                  1   c50                 -1
+    x119      c170                 1
+    x120      c46                  1   c51                 -1
+    x120      c171                 1
+    x121      c42                  1   c172                 1
+    x122      c43                  1   c173                 1
+    x123      c44                  1   c174                 1
+    x124      c45                  1   c175                 1
+    x125      c46                  1   c176                 1
+    x126      c37                 -1   c42                  1
+    x126      c177                 1
+    x127      c38                 -1   c43                  1
+    x127      c178                 1
+    x128      c39                 -1   c44                  1
+    x128      c179                 1
+    x129      c40                 -1   c45                  1
+    x129      c180                 1
+    x130      c41                 -1   c46                  1
+    x130      c181                 1
+    x131      c42                  1   c47                 -1
+    x131      c182                 1
+    x132      c43                  1   c48                 -1
+    x132      c183                 1
+    x133      c44                  1   c49                 -1
+    x133      c184                 1
+    x134      c45                  1   c50                 -1
+    x134      c185                 1
+    x135      c46                  1   c51                 -1
+    x135      c186                 1
+    x136      c37                  1   c187                 1
+    x137      c38                  1   c188                 1
+    x138      c39                  1   c189                 1
+    x139      c40                  1   c190                 1
+    x140      c41                  1   c191                 1
+    x141      c37                  1   c42                 -1
+    x141      c192                 1
+    x142      c38                  1   c43                 -1
+    x142      c193                 1
+    x143      c39                  1   c44                 -1
+    x143      c194                 1
+    x144      c40                  1   c45                 -1
+    x144      c195                 1
+    x145      c41                  1   c46                 -1
+    x145      c196                 1
+    x146      c37                  1   c47                 -1
+    x146      c197                 1
+    x147      c38                  1   c48                 -1
+    x147      c198                 1
+    x148      c39                  1   c49                 -1
+    x148      c199                 1
+    x149      c40                  1   c50                 -1
+    x149      c200                 1
+    x150      c41                  1   c51                 -1
+    x150      c201                 1
+    x151      c37                  1   c202                 1
+    x152      c38                  1   c203                 1
+    x153      c39                  1   c204                 1
+    x154      c40                  1   c205                 1
+    x155      c41                  1   c206                 1
+    x156      c37                  1   c42                 -1
+    x156      c207                 1
+    x157      c38                  1   c43                 -1
+    x157      c208                 1
+    x158      c39                  1   c44                 -1
+    x158      c209                 1
+    x159      c40                  1   c45                 -1
+    x159      c210                 1
+    x160      c41                  1   c46                 -1
+    x160      c211                 1
+    x161      c37                  1   c47                 -1
+    x161      c212                 1
+    x162      c38                  1   c48                 -1
+    x162      c213                 1
+    x163      c39                  1   c49                 -1
+    x163      c214                 1
+    x164      c40                  1   c50                 -1
+    x164      c215                 1
+    x165      c41                  1   c51                 -1
+    x165      c216                 1
+    x166      c37                  1   c217                 1
+    x167      c38                  1   c218                 1
+    x168      c39                  1   c219                 1
+    x169      c40                  1   c220                 1
+    x170      c41                  1   c221                 1
+    x171      c37                  1   c42                 -1
+    x171      c222                 1
+    x172      c38                  1   c43                 -1
+    x172      c223                 1
+    x173      c39                  1   c44                 -1
+    x173      c224                 1
+    x174      c40                  1   c45                 -1
+    x174      c225                 1
+    x175      c41                  1   c46                 -1
+    x175      c226                 1
+    x176      c37                  1   c47                 -1
+    x176      c227                 1
+    x177      c38                  1   c48                 -1
+    x177      c228                 1
+    x178      c39                  1   c49                 -1
+    x178      c229                 1
+    x179      c40                  1   c50                 -1
+    x179      c230                 1
+    x180      c41                  1   c51                 -1
+    x180      c231                 1
+    x181      c47                  1   c232                 1
+    x182      c48                  1   c233                 1
+    x183      c49                  1   c234                 1
+    x184      c50                  1   c235                 1
+    x185      c51                  1   c236                 1
+    x186      c37                 -1   c47                  1
+    x186      c237                 1
+    x187      c38                 -1   c48                  1
+    x187      c238                 1
+    x188      c39                 -1   c49                  1
+    x188      c239                 1
+    x189      c40                 -1   c50                  1
+    x189      c240                 1
+    x190      c41                 -1   c51                  1
+    x190      c241                 1
+    x191      c42                 -1   c47                  1
+    x191      c242                 1
+    x192      c43                 -1   c48                  1
+    x192      c243                 1
+    x193      c44                 -1   c49                  1
+    x193      c244                 1
+    x194      c45                 -1   c50                  1
+    x194      c245                 1
+    x195      c46                 -1   c51                  1
+    x195      c246                 1
+    x196      c37                  1   c247                 1
+    x197      c38                  1   c248                 1
+    x198      c39                  1   c249                 1
+    x199      c40                  1   c250                 1
+    x200      c41                  1   c251                 1
+    x201      c37                  1   c42                 -1
+    x201      c252                 1
+    x202      c38                  1   c43                 -1
+    x202      c253                 1
+    x203      c39                  1   c44                 -1
+    x203      c254                 1
+    x204      c40                  1   c45                 -1
+    x204      c255                 1
+    x205      c41                  1   c46                 -1
+    x205      c256                 1
+    x206      c37                  1   c47                 -1
+    x206      c257                 1
+    x207      c38                  1   c48                 -1
+    x207      c258                 1
+    x208      c39                  1   c49                 -1
+    x208      c259                 1
+    x209      c40                  1   c50                 -1
+    x209      c260                 1
+    x210      c41                  1   c51                 -1
+    x210      c261                 1
+    x211      c47                  1   c262                 1
+    x212      c48                  1   c263                 1
+    x213      c49                  1   c264                 1
+    x214      c50                  1   c265                 1
+    x215      c51                  1   c266                 1
+    x216      c37                 -1   c47                  1
+    x216      c267                 1
+    x217      c38                 -1   c48                  1
+    x217      c268                 1
+    x218      c39                 -1   c49                  1
+    x218      c269                 1
+    x219      c40                 -1   c50                  1
+    x219      c270                 1
+    x220      c41                 -1   c51                  1
+    x220      c271                 1
+    x221      c42                 -1   c47                  1
+    x221      c272                 1
+    x222      c43                 -1   c48                  1
+    x222      c273                 1
+    x223      c44                 -1   c49                  1
+    x223      c274                 1
+    x224      c45                 -1   c50                  1
+    x224      c275                 1
+    x225      c46                 -1   c51                  1
+    x225      c276                 1
+    x226      c47                  1   c277                 1
+    x227      c48                  1   c278                 1
+    x228      c49                  1   c279                 1
+    x229      c50                  1   c280                 1
+    x230      c51                  1   c281                 1
+    x231      c37                 -1   c47                  1
+    x231      c282                 1
+    x232      c38                 -1   c48                  1
+    x232      c283                 1
+    x233      c39                 -1   c49                  1
+    x233      c284                 1
+    x234      c40                 -1   c50                  1
+    x234      c285                 1
+    x235      c41                 -1   c51                  1
+    x235      c286                 1
+    x236      c42                 -1   c47                  1
+    x236      c287                 1
+    x237      c43                 -1   c48                  1
+    x237      c288                 1
+    x238      c44                 -1   c49                  1
+    x238      c289                 1
+    x239      c45                 -1   c50                  1
+    x239      c290                 1
+    x240      c46                 -1   c51                  1
+    x240      c291                 1
+    x241      R0000292             1   c1                   1
+    MARK0000  'MARKER'                 'INTORG'
+    x242      c1               -5.43   c2                0.22
+    x242      c22                  1   c37                 -1
+    x242      c52                 -7
+    x243      c1               -5.43   c3                0.22
+    x243      c23                  1   c38                 -1
+    x243      c53                 -7
+    x244      c1               -5.43   c4                0.22
+    x244      c24                  1   c39                 -1
+    x244      c54                 -7
+    x245      c1               -5.43   c5                0.22
+    x245      c25                  1   c40                 -1
+    x245      c55                 -7
+    x246      c1               -5.43   c6                0.22
+    x246      c26                  1   c41                 -1
+    x246      c56                 -7
+    x247      c1              -53.78   c2                 2.2
+    x247      c27                  1   c42                 -1
+    x247      c57                 -7
+    x248      c1              -53.78   c3                 2.2
+    x248      c28                  1   c43                 -1
+    x248      c58                 -7
+    x249      c1              -53.78   c4                 2.2
+    x249      c29                  1   c44                 -1
+    x249      c59                 -7
+    x250      c1              -53.78   c5                 2.2
+    x250      c30                  1   c45                 -1
+    x250      c60                 -7
+    x251      c1              -53.78   c6                 2.2
+    x251      c31                  1   c46                 -1
+    x251      c61                 -7
+    x252      c1              -23.36   c2                0.96
+    x252      c32                  1   c47                 -1
+    x252      c62                 -7
+    x253      c1              -23.36   c3                0.96
+    x253      c33                  1   c48                 -1
+    x253      c63                 -7
+    x254      c1              -23.36   c4                0.96
+    x254      c34                  1   c49                 -1
+    x254      c64                 -7
+    x255      c1              -23.36   c5                0.96
+    x255      c35                  1   c50                 -1
+    x255      c65                 -7
+    x256      c1              -23.36   c6                0.96
+    x256      c36                  1   c51                 -1
+    x256      c66                 -7
+    x257      c1               74.52   c2                3.79
+    x257      c7                   1   c32                 -1
+    x257      c67                 -7
+    x258      c1               74.52   c3                3.79
+    x258      c7                   1   c33                 -1
+    x258      c68                 -7
+    x259      c1               74.52   c4                3.79
+    x259      c7                   1   c34                 -1
+    x259      c69                 -7
+    x260      c1               74.52   c5                3.79
+    x260      c7                   1   c35                 -1
+    x260      c70                 -7
+    x261      c1               74.52   c6                3.79
+    x261      c7                   1   c36                 -1
+    x261      c71                 -7
+    x262      c1               78.87   c2                3.62
+    x262      c7                   1   c22                  1
+    x262      c32                 -1   c37                 -1
+    x262      c72                 -7
+    x263      c1               78.87   c3                3.62
+    x263      c7                   1   c23                  1
+    x263      c33                 -1   c38                 -1
+    x263      c73                 -7
+    x264      c1               78.87   c4                3.62
+    x264      c7                   1   c24                  1
+    x264      c34                 -1   c39                 -1
+    x264      c74                 -7
+    x265      c1               78.87   c5                3.62
+    x265      c7                   1   c25                  1
+    x265      c35                 -1   c40                 -1
+    x265      c75                 -7
+    x266      c1               78.87   c6                3.62
+    x266      c7                   1   c26                  1
+    x266      c36                 -1   c41                 -1
+    x266      c76                 -7
+    x267      c1               79.41   c2                3.59
+    x267      c7                   1   c27                  1
+    x267      c32                 -1   c42                 -1
+    x267      c77                 -7
+    x268      c1               79.41   c3                3.59
+    x268      c7                   1   c28                  1
+    x268      c33                 -1   c43                 -1
+    x268      c78                 -7
+    x269      c1               79.41   c4                3.59
+    x269      c7                   1   c29                  1
+    x269      c34                 -1   c44                 -1
+    x269      c79                 -7
+    x270      c1               79.41   c5                3.59
+    x270      c7                   1   c30                  1
+    x270      c35                 -1   c45                 -1
+    x270      c80                 -7
+    x271      c1               79.41   c6                3.59
+    x271      c7                   1   c31                  1
+    x271      c36                 -1   c46                 -1
+    x271      c81                 -7
+    x272      c1                84.3   c2                3.39
+    x272      c7                   1   c47                 -1
+    x273      c1                84.3   c3                3.39
+    x273      c7                   1   c48                 -1
+    x274      c1                84.3   c4                3.39
+    x274      c7                   1   c49                 -1
+    x275      c1                84.3   c5                3.39
+    x275      c7                   1   c50                 -1
+    x276      c1                84.3   c6                3.39
+    x276      c7                   1   c51                 -1
+    x277      c1               29.18   c2                4.48
+    x277      c8                   1   c27                 -1
+    x277      c82                 -7
+    x278      c1               29.18   c3                4.48
+    x278      c8                   1   c28                 -1
+    x278      c83                 -7
+    x279      c1               29.18   c4                4.48
+    x279      c8                   1   c29                 -1
+    x279      c84                 -7
+    x280      c1               29.18   c5                4.48
+    x280      c8                   1   c30                 -1
+    x280      c85                 -7
+    x281      c1               29.18   c6                4.48
+    x281      c8                   1   c31                 -1
+    x281      c86                 -7
+    x282      c1               38.96   c2                4.08
+    x282      c8                   1   c22                  1
+    x282      c27                 -1   c37                 -1
+    x282      c87                 -7
+    x283      c1               38.96   c3                4.08
+    x283      c8                   1   c23                  1
+    x283      c28                 -1   c38                 -1
+    x283      c88                 -7
+    x284      c1               38.96   c4                4.08
+    x284      c8                   1   c24                  1
+    x284      c29                 -1   c39                 -1
+    x284      c89                 -7
+    x285      c1               38.96   c5                4.08
+    x285      c8                   1   c25                  1
+    x285      c30                 -1   c40                 -1
+    x285      c90                 -7
+    x286      c1               38.96   c6                4.08
+    x286      c8                   1   c26                  1
+    x286      c31                 -1   c41                 -1
+    x286      c91                 -7
+    x287      c1               69.92   c2                2.82
+    x287      c8                   1   c42                 -1
+    x288      c1               69.92   c3                2.82
+    x288      c8                   1   c43                 -1
+    x289      c1               69.92   c4                2.82
+    x289      c8                   1   c44                 -1
+    x290      c1               69.92   c5                2.82
+    x290      c8                   1   c45                 -1
+    x291      c1               69.92   c6                2.82
+    x291      c8                   1   c46                 -1
+    x292      c1               51.45   c2                3.57
+    x292      c8                   1   c27                 -1
+    x292      c32                  1   c47                 -1
+    x292      c92                 -7
+    x293      c1               51.45   c3                3.57
+    x293      c8                   1   c28                 -1
+    x293      c33                  1   c48                 -1
+    x293      c93                 -7
+    x294      c1               51.45   c4                3.57
+    x294      c8                   1   c29                 -1
+    x294      c34                  1   c49                 -1
+    x294      c94                 -7
+    x295      c1               51.45   c5                3.57
+    x295      c8                   1   c30                 -1
+    x295      c35                  1   c50                 -1
+    x295      c95                 -7
+    x296      c1               51.45   c6                3.57
+    x296      c8                   1   c31                 -1
+    x296      c36                  1   c51                 -1
+    x296      c96                 -7
+    x297      c1              120.54   c2                5.19
+    x297      c9                   1   c22                 -1
+    x297      c97                 -7
+    x298      c1              120.54   c3                5.19
+    x298      c9                   1   c23                 -1
+    x298      c98                 -7
+    x299      c1              120.54   c4                5.19
+    x299      c9                   1   c24                 -1
+    x299      c99                 -7
+    x300      c1              120.54   c5                5.19
+    x300      c9                   1   c25                 -1
+    x300      c100                -7
+    x301      c1              120.54   c6                5.19
+    x301      c9                   1   c26                 -1
+    x301      c101                -7
+    x302      c1              125.43   c2                4.99
+    x302      c9                   1   c37                 -1
+    x303      c1              125.43   c3                4.99
+    x303      c9                   1   c38                 -1
+    x304      c1              125.43   c4                4.99
+    x304      c9                   1   c39                 -1
+    x305      c1              125.43   c5                4.99
+    x305      c9                   1   c40                 -1
+    x306      c1              125.43   c6                4.99
+    x306      c9                   1   c41                 -1
+    x307      c1              108.05   c2                5.71
+    x307      c9                   1   c22                 -1
+    x307      c27                  1   c42                 -1
+    x307      c102                -7
+    x308      c1              108.05   c3                5.71
+    x308      c9                   1   c23                 -1
+    x308      c28                  1   c43                 -1
+    x308      c103                -7
+    x309      c1              108.05   c4                5.71
+    x309      c9                   1   c24                 -1
+    x309      c29                  1   c44                 -1
+    x309      c104                -7
+    x310      c1              108.05   c5                5.71
+    x310      c9                   1   c25                 -1
+    x310      c30                  1   c45                 -1
+    x310      c105                -7
+    x311      c1              108.05   c6                5.71
+    x311      c9                   1   c26                 -1
+    x311      c31                  1   c46                 -1
+    x311      c106                -7
+    x312      c1              142.82   c2                4.28
+    x312      c9                   1   c22                 -1
+    x312      c32                  1   c47                 -1
+    x312      c107                -7
+    x313      c1              142.82   c3                4.28
+    x313      c9                   1   c23                 -1
+    x313      c33                  1   c48                 -1
+    x313      c108                -7
+    x314      c1              142.82   c4                4.28
+    x314      c9                   1   c24                 -1
+    x314      c34                  1   c49                 -1
+    x314      c109                -7
+    x315      c1              142.82   c5                4.28
+    x315      c9                   1   c25                 -1
+    x315      c35                  1   c50                 -1
+    x315      c110                -7
+    x316      c1              142.82   c6                4.28
+    x316      c9                   1   c26                 -1
+    x316      c36                  1   c51                 -1
+    x316      c111                -7
+    x317      c1               74.43   c2                4.99
+    x317      c10                  1   c32                 -1
+    x317      c112                -7
+    x318      c1               74.43   c3                4.99
+    x318      c10                  1   c33                 -1
+    x318      c113                -7
+    x319      c1               74.43   c4                4.99
+    x319      c10                  1   c34                 -1
+    x319      c114                -7
+    x320      c1               74.43   c5                4.99
+    x320      c10                  1   c35                 -1
+    x320      c115                -7
+    x321      c1               74.43   c6                4.99
+    x321      c10                  1   c36                 -1
+    x321      c116                -7
+    x322      c1               83.13   c2                4.64
+    x322      c10                  1   c22                  1
+    x322      c32                 -1   c37                 -1
+    x322      c117                -7
+    x323      c1               83.13   c3                4.64
+    x323      c10                  1   c23                  1
+    x323      c33                 -1   c38                 -1
+    x323      c118                -7
+    x324      c1               83.13   c4                4.64
+    x324      c10                  1   c24                  1
+    x324      c34                 -1   c39                 -1
+    x324      c119                -7
+    x325      c1               83.13   c5                4.64
+    x325      c10                  1   c25                  1
+    x325      c35                 -1   c40                 -1
+    x325      c120                -7
+    x326      c1               83.13   c6                4.64
+    x326      c10                  1   c26                  1
+    x326      c36                 -1   c41                 -1
+    x326      c121                -7
+    x327      c1               93.99   c2                4.19
+    x327      c10                  1   c27                  1
+    x327      c32                 -1   c42                 -1
+    x327      c122                -7
+    x328      c1               93.99   c3                4.19
+    x328      c10                  1   c28                  1
+    x328      c33                 -1   c43                 -1
+    x328      c123                -7
+    x329      c1               93.99   c4                4.19
+    x329      c10                  1   c29                  1
+    x329      c34                 -1   c44                 -1
+    x329      c124                -7
+    x330      c1               93.99   c5                4.19
+    x330      c10                  1   c30                  1
+    x330      c35                 -1   c45                 -1
+    x330      c125                -7
+    x331      c1               93.99   c6                4.19
+    x331      c10                  1   c31                  1
+    x331      c36                 -1   c46                 -1
+    x331      c126                -7
+    x332      c1               96.16   c2                4.11
+    x332      c10                  1   c47                 -1
+    x333      c1               96.16   c3                4.11
+    x333      c10                  1   c48                 -1
+    x334      c1               96.16   c4                4.11
+    x334      c10                  1   c49                 -1
+    x335      c1               96.16   c5                4.11
+    x335      c10                  1   c50                 -1
+    x336      c1               96.16   c6                4.11
+    x336      c10                  1   c51                 -1
+    x337      c1               48.09   c2                3.37
+    x337      c11                  1   c32                 -1
+    x337      c127                -7
+    x338      c1               48.09   c3                3.37
+    x338      c11                  1   c33                 -1
+    x338      c128                -7
+    x339      c1               48.09   c4                3.37
+    x339      c11                  1   c34                 -1
+    x339      c129                -7
+    x340      c1               48.09   c5                3.37
+    x340      c11                  1   c35                 -1
+    x340      c130                -7
+    x341      c1               48.09   c6                3.37
+    x341      c11                  1   c36                 -1
+    x341      c131                -7
+    x342      c1               56.24   c2                3.04
+    x342      c11                  1   c22                  1
+    x342      c32                 -1   c37                 -1
+    x342      c132                -7
+    x343      c1               56.24   c3                3.04
+    x343      c11                  1   c23                  1
+    x343      c33                 -1   c38                 -1
+    x343      c133                -7
+    x344      c1               56.24   c4                3.04
+    x344      c11                  1   c24                  1
+    x344      c34                 -1   c39                 -1
+    x344      c134                -7
+    x345      c1               56.24   c5                3.04
+    x345      c11                  1   c25                  1
+    x345      c35                 -1   c40                 -1
+    x345      c135                -7
+    x346      c1               56.24   c6                3.04
+    x346      c11                  1   c26                  1
+    x346      c36                 -1   c41                 -1
+    x346      c136                -7
+    x347      c1                26.9   c2                4.24
+    x347      c11                  1   c27                  1
+    x347      c32                 -1   c42                 -1
+    x347      c137                -7
+    x348      c1                26.9   c3                4.24
+    x348      c11                  1   c28                  1
+    x348      c33                 -1   c43                 -1
+    x348      c138                -7
+    x349      c1                26.9   c4                4.24
+    x349      c11                  1   c29                  1
+    x349      c34                 -1   c44                 -1
+    x349      c139                -7
+    x350      c1                26.9   c5                4.24
+    x350      c11                  1   c30                  1
+    x350      c35                 -1   c45                 -1
+    x350      c140                -7
+    x351      c1                26.9   c6                4.24
+    x351      c11                  1   c31                  1
+    x351      c36                 -1   c46                 -1
+    x351      c141                -7
+    x352      c1               66.02   c2                2.64
+    x352      c11                  1   c47                 -1
+    x353      c1               66.02   c3                2.64
+    x353      c11                  1   c48                 -1
+    x354      c1               66.02   c4                2.64
+    x354      c11                  1   c49                 -1
+    x355      c1               66.02   c5                2.64
+    x355      c11                  1   c50                 -1
+    x356      c1               66.02   c6                2.64
+    x356      c11                  1   c51                 -1
+    x357      c1               94.53   c2                4.17
+    x357      c12                  1   c32                 -1
+    x357      c142                -7
+    x358      c1               94.53   c3                4.17
+    x358      c12                  1   c33                 -1
+    x358      c143                -7
+    x359      c1               94.53   c4                4.17
+    x359      c12                  1   c34                 -1
+    x359      c144                -7
+    x360      c1               94.53   c5                4.17
+    x360      c12                  1   c35                 -1
+    x360      c145                -7
+    x361      c1               94.53   c6                4.17
+    x361      c12                  1   c36                 -1
+    x361      c146                -7
+    x362      c1               96.71   c2                4.08
+    x362      c12                  1   c22                  1
+    x362      c32                 -1   c37                 -1
+    x362      c147                -7
+    x363      c1               96.71   c3                4.08
+    x363      c12                  1   c23                  1
+    x363      c33                 -1   c38                 -1
+    x363      c148                -7
+    x364      c1               96.71   c4                4.08
+    x364      c12                  1   c24                  1
+    x364      c34                 -1   c39                 -1
+    x364      c149                -7
+    x365      c1               96.71   c5                4.08
+    x365      c12                  1   c25                  1
+    x365      c35                 -1   c40                 -1
+    x365      c150                -7
+    x366      c1               96.71   c6                4.08
+    x366      c12                  1   c26                  1
+    x366      c36                 -1   c41                 -1
+    x366      c151                -7
+    x367      c1               93.45   c2                4.22
+    x367      c12                  1   c27                  1
+    x367      c32                 -1   c42                 -1
+    x367      c152                -7
+    x368      c1               93.45   c3                4.22
+    x368      c12                  1   c28                  1
+    x368      c33                 -1   c43                 -1
+    x368      c153                -7
+    x369      c1               93.45   c4                4.22
+    x369      c12                  1   c29                  1
+    x369      c34                 -1   c44                 -1
+    x369      c154                -7
+    x370      c1               93.45   c5                4.22
+    x370      c12                  1   c30                  1
+    x370      c35                 -1   c45                 -1
+    x370      c155                -7
+    x371      c1               93.45   c6                4.22
+    x371      c12                  1   c31                  1
+    x371      c36                 -1   c46                 -1
+    x371      c156                -7
+    x372      c1               93.99   c2                4.19
+    x372      c12                  1   c47                 -1
+    x373      c1               93.99   c3                4.19
+    x373      c12                  1   c48                 -1
+    x374      c1               93.99   c4                4.19
+    x374      c12                  1   c49                 -1
+    x375      c1               93.99   c5                4.19
+    x375      c12                  1   c50                 -1
+    x376      c1               93.99   c6                4.19
+    x376      c12                  1   c51                 -1
+    x377      c1               22.76   c2                5.08
+    x377      c13                  1   c27                 -1
+    x377      c157                -7
+    x378      c1               22.76   c3                5.08
+    x378      c13                  1   c28                 -1
+    x378      c158                -7
+    x379      c1               22.76   c4                5.08
+    x379      c13                  1   c29                 -1
+    x379      c159                -7
+    x380      c1               22.76   c5                5.08
+    x380      c13                  1   c30                 -1
+    x380      c160                -7
+    x381      c1               22.76   c6                5.08
+    x381      c13                  1   c31                 -1
+    x381      c161                -7
+    x382      c1               37.97   c2                4.46
+    x382      c13                  1   c22                  1
+    x382      c27                 -1   c37                 -1
+    x382      c162                -7
+    x383      c1               37.97   c3                4.46
+    x383      c13                  1   c23                  1
+    x383      c28                 -1   c38                 -1
+    x383      c163                -7
+    x384      c1               37.97   c4                4.46
+    x384      c13                  1   c24                  1
+    x384      c29                 -1   c39                 -1
+    x384      c164                -7
+    x385      c1               37.97   c5                4.46
+    x385      c13                  1   c25                  1
+    x385      c30                 -1   c40                 -1
+    x385      c165                -7
+    x386      c1               37.97   c6                4.46
+    x386      c13                  1   c26                  1
+    x386      c31                 -1   c41                 -1
+    x386      c166                -7
+    x387      c1               74.91   c2                2.95
+    x387      c13                  1   c42                 -1
+    x388      c1               74.91   c3                2.95
+    x388      c13                  1   c43                 -1
+    x389      c1               74.91   c4                2.95
+    x389      c13                  1   c44                 -1
+    x390      c1               74.91   c5                2.95
+    x390      c13                  1   c45                 -1
+    x391      c1               74.91   c6                2.95
+    x391      c13                  1   c46                 -1
+    x392      c1               47.75   c2                4.06
+    x392      c13                  1   c27                 -1
+    x392      c32                  1   c47                 -1
+    x392      c167                -7
+    x393      c1               47.75   c3                4.06
+    x393      c13                  1   c28                 -1
+    x393      c33                  1   c48                 -1
+    x393      c168                -7
+    x394      c1               47.75   c4                4.06
+    x394      c13                  1   c29                 -1
+    x394      c34                  1   c49                 -1
+    x394      c169                -7
+    x395      c1               47.75   c5                4.06
+    x395      c13                  1   c30                 -1
+    x395      c35                  1   c50                 -1
+    x395      c170                -7
+    x396      c1               47.75   c6                4.06
+    x396      c13                  1   c31                 -1
+    x396      c36                  1   c51                 -1
+    x396      c171                -7
+    x397      c1               85.38   c2                3.99
+    x397      c14                  1   c27                 -1
+    x397      c172                -7
+    x398      c1               85.38   c3                3.99
+    x398      c14                  1   c28                 -1
+    x398      c173                -7
+    x399      c1               85.38   c4                3.99
+    x399      c14                  1   c29                 -1
+    x399      c174                -7
+    x400      c1               85.38   c5                3.99
+    x400      c14                  1   c30                 -1
+    x400      c175                -7
+    x401      c1               85.38   c6                3.99
+    x401      c14                  1   c31                 -1
+    x401      c176                -7
+    x402      c1               86.47   c2                3.95
+    x402      c14                  1   c22                  1
+    x402      c27                 -1   c37                 -1
+    x402      c177                -7
+    x403      c1               86.47   c3                3.95
+    x403      c14                  1   c23                  1
+    x403      c28                 -1   c38                 -1
+    x403      c178                -7
+    x404      c1               86.47   c4                3.95
+    x404      c14                  1   c24                  1
+    x404      c29                 -1   c39                 -1
+    x404      c179                -7
+    x405      c1               86.47   c5                3.95
+    x405      c14                  1   c25                  1
+    x405      c30                 -1   c40                 -1
+    x405      c180                -7
+    x406      c1               86.47   c6                3.95
+    x406      c14                  1   c26                  1
+    x406      c31                 -1   c41                 -1
+    x406      c181                -7
+    x407      c1               90.27   c2                3.79
+    x407      c14                  1   c42                 -1
+    x408      c1               90.27   c3                3.79
+    x408      c14                  1   c43                 -1
+    x409      c1               90.27   c4                3.79
+    x409      c14                  1   c44                 -1
+    x410      c1               90.27   c5                3.79
+    x410      c14                  1   c45                 -1
+    x411      c1               90.27   c6                3.79
+    x411      c14                  1   c46                 -1
+    x412      c1               76.69   c2                4.35
+    x412      c14                  1   c27                 -1
+    x412      c32                  1   c47                 -1
+    x412      c182                -7
+    x413      c1               76.69   c3                4.35
+    x413      c14                  1   c28                 -1
+    x413      c33                  1   c48                 -1
+    x413      c183                -7
+    x414      c1               76.69   c4                4.35
+    x414      c14                  1   c29                 -1
+    x414      c34                  1   c49                 -1
+    x414      c184                -7
+    x415      c1               76.69   c5                4.35
+    x415      c14                  1   c30                 -1
+    x415      c35                  1   c50                 -1
+    x415      c185                -7
+    x416      c1               76.69   c6                4.35
+    x416      c14                  1   c31                 -1
+    x416      c36                  1   c51                 -1
+    x416      c186                -7
+    x417      c1               87.17   c2                3.46
+    x417      c15                  1   c22                 -1
+    x417      c187                -7
+    x418      c1               87.17   c3                3.46
+    x418      c15                  1   c23                 -1
+    x418      c188                -7
+    x419      c1               87.17   c4                3.46
+    x419      c15                  1   c24                 -1
+    x419      c189                -7
+    x420      c1               87.17   c5                3.46
+    x420      c15                  1   c25                 -1
+    x420      c190                -7
+    x421      c1               87.17   c6                3.46
+    x421      c15                  1   c26                 -1
+    x421      c191                -7
+    x422      c1               83.37   c2                3.62
+    x422      c15                  1   c37                 -1
+    x423      c1               83.37   c3                3.62
+    x423      c15                  1   c38                 -1
+    x424      c1               83.37   c4                3.62
+    x424      c15                  1   c39                 -1
+    x425      c1               83.37   c5                3.62
+    x425      c15                  1   c40                 -1
+    x426      c1               83.37   c6                3.62
+    x426      c15                  1   c41                 -1
+    x427      c1               38.27   c2                5.46
+    x427      c15                  1   c22                 -1
+    x427      c27                  1   c42                 -1
+    x427      c192                -7
+    x428      c1               38.27   c3                5.46
+    x428      c15                  1   c23                 -1
+    x428      c28                  1   c43                 -1
+    x428      c193                -7
+    x429      c1               38.27   c4                5.46
+    x429      c15                  1   c24                 -1
+    x429      c29                  1   c44                 -1
+    x429      c194                -7
+    x430      c1               38.27   c5                5.46
+    x430      c15                  1   c25                 -1
+    x430      c30                  1   c45                 -1
+    x430      c195                -7
+    x431      c1               38.27   c6                5.46
+    x431      c15                  1   c26                 -1
+    x431      c31                  1   c46                 -1
+    x431      c196                -7
+    x432      c1               75.76   c2                3.93
+    x432      c15                  1   c22                 -1
+    x432      c32                  1   c47                 -1
+    x432      c197                -7
+    x433      c1               75.76   c3                3.93
+    x433      c15                  1   c23                 -1
+    x433      c33                  1   c48                 -1
+    x433      c198                -7
+    x434      c1               75.76   c4                3.93
+    x434      c15                  1   c24                 -1
+    x434      c34                  1   c49                 -1
+    x434      c199                -7
+    x435      c1               75.76   c5                3.93
+    x435      c15                  1   c25                 -1
+    x435      c35                  1   c50                 -1
+    x435      c200                -7
+    x436      c1               75.76   c6                3.93
+    x436      c15                  1   c26                 -1
+    x436      c36                  1   c51                 -1
+    x436      c201                -7
+    x437      c1               69.51   c2                2.13
+    x437      c16                  1   c22                 -1
+    x437      c202                -7
+    x438      c1               69.51   c3                2.13
+    x438      c16                  1   c23                 -1
+    x438      c203                -7
+    x439      c1               69.51   c4                2.13
+    x439      c16                  1   c24                 -1
+    x439      c204                -7
+    x440      c1               69.51   c5                2.13
+    x440      c16                  1   c25                 -1
+    x440      c205                -7
+    x441      c1               69.51   c6                2.13
+    x441      c16                  1   c26                 -1
+    x441      c206                -7
+    x442      c1               65.71   c2                2.28
+    x442      c16                  1   c37                 -1
+    x443      c1               65.71   c3                2.28
+    x443      c16                  1   c38                 -1
+    x444      c1               65.71   c4                2.28
+    x444      c16                  1   c39                 -1
+    x445      c1               65.71   c5                2.28
+    x445      c16                  1   c40                 -1
+    x446      c1               65.71   c6                2.28
+    x446      c16                  1   c41                 -1
+    x447      c1               20.62   c2                4.13
+    x447      c16                  1   c22                 -1
+    x447      c27                  1   c42                 -1
+    x447      c207                -7
+    x448      c1               20.62   c3                4.13
+    x448      c16                  1   c23                 -1
+    x448      c28                  1   c43                 -1
+    x448      c208                -7
+    x449      c1               20.62   c4                4.13
+    x449      c16                  1   c24                 -1
+    x449      c29                  1   c44                 -1
+    x449      c209                -7
+    x450      c1               20.62   c5                4.13
+    x450      c16                  1   c25                 -1
+    x450      c30                  1   c45                 -1
+    x450      c210                -7
+    x451      c1               20.62   c6                4.13
+    x451      c16                  1   c26                 -1
+    x451      c31                  1   c46                 -1
+    x451      c211                -7
+    x452      c1               53.22   c2                2.79
+    x452      c16                  1   c22                 -1
+    x452      c32                  1   c47                 -1
+    x452      c212                -7
+    x453      c1               53.22   c3                2.79
+    x453      c16                  1   c23                 -1
+    x453      c33                  1   c48                 -1
+    x453      c213                -7
+    x454      c1               53.22   c4                2.79
+    x454      c16                  1   c24                 -1
+    x454      c34                  1   c49                 -1
+    x454      c214                -7
+    x455      c1               53.22   c5                2.79
+    x455      c16                  1   c25                 -1
+    x455      c35                  1   c50                 -1
+    x455      c215                -7
+    x456      c1               53.22   c6                2.79
+    x456      c16                  1   c26                 -1
+    x456      c36                  1   c51                 -1
+    x456      c216                -7
+    x457      c1               87.47   c2                4.46
+    x457      c17                  1   c22                 -1
+    x457      c217                -7
+    x458      c1               87.47   c3                4.46
+    x458      c17                  1   c23                 -1
+    x458      c218                -7
+    x459      c1               87.47   c4                4.46
+    x459      c17                  1   c24                 -1
+    x459      c219                -7
+    x460      c1               87.47   c5                4.46
+    x460      c17                  1   c25                 -1
+    x460      c220                -7
+    x461      c1               87.47   c6                4.46
+    x461      c17                  1   c26                 -1
+    x461      c221                -7
+    x462      c1               95.08   c2                4.15
+    x462      c17                  1   c37                 -1
+    x463      c1               95.08   c3                4.15
+    x463      c17                  1   c38                 -1
+    x464      c1               95.08   c4                4.15
+    x464      c17                  1   c39                 -1
+    x465      c1               95.08   c5                4.15
+    x465      c17                  1   c40                 -1
+    x466      c1               95.08   c6                4.15
+    x466      c17                  1   c41                 -1
+    x467      c1               39.66   c2                6.42
+    x467      c17                  1   c22                 -1
+    x467      c27                  1   c42                 -1
+    x467      c222                -7
+    x468      c1               39.66   c3                6.42
+    x468      c17                  1   c23                 -1
+    x468      c28                  1   c43                 -1
+    x468      c223                -7
+    x469      c1               39.66   c4                6.42
+    x469      c17                  1   c24                 -1
+    x469      c29                  1   c44                 -1
+    x469      c224                -7
+    x470      c1               39.66   c5                6.42
+    x470      c17                  1   c25                 -1
+    x470      c30                  1   c45                 -1
+    x470      c225                -7
+    x471      c1               39.66   c6                6.42
+    x471      c17                  1   c26                 -1
+    x471      c31                  1   c46                 -1
+    x471      c226                -7
+    x472      c1               76.06   c2                4.93
+    x472      c17                  1   c22                 -1
+    x472      c32                  1   c47                 -1
+    x472      c227                -7
+    x473      c1               76.06   c3                4.93
+    x473      c17                  1   c23                 -1
+    x473      c33                  1   c48                 -1
+    x473      c228                -7
+    x474      c1               76.06   c4                4.93
+    x474      c17                  1   c24                 -1
+    x474      c34                  1   c49                 -1
+    x474      c229                -7
+    x475      c1               76.06   c5                4.93
+    x475      c17                  1   c25                 -1
+    x475      c35                  1   c50                 -1
+    x475      c230                -7
+    x476      c1               76.06   c6                4.93
+    x476      c17                  1   c26                 -1
+    x476      c36                  1   c51                 -1
+    x476      c231                -7
+    x477      c1               43.98   c2                3.17
+    x477      c18                  1   c32                 -1
+    x477      c232                -7
+    x478      c1               43.98   c3                3.17
+    x478      c18                  1   c33                 -1
+    x478      c233                -7
+    x479      c1               43.98   c4                3.17
+    x479      c18                  1   c34                 -1
+    x479      c234                -7
+    x480      c1               43.98   c5                3.17
+    x480      c18                  1   c35                 -1
+    x480      c235                -7
+    x481      c1               43.98   c6                3.17
+    x481      c18                  1   c36                 -1
+    x481      c236                -7
+    x482      c1                46.7   c2                3.06
+    x482      c18                  1   c22                  1
+    x482      c32                 -1   c37                 -1
+    x482      c237                -7
+    x483      c1                46.7   c3                3.06
+    x483      c18                  1   c23                  1
+    x483      c33                 -1   c38                 -1
+    x483      c238                -7
+    x484      c1                46.7   c4                3.06
+    x484      c18                  1   c24                  1
+    x484      c34                 -1   c39                 -1
+    x484      c239                -7
+    x485      c1                46.7   c5                3.06
+    x485      c18                  1   c25                  1
+    x485      c35                 -1   c40                 -1
+    x485      c240                -7
+    x486      c1                46.7   c6                3.06
+    x486      c18                  1   c26                  1
+    x486      c36                 -1   c41                 -1
+    x486      c241                -7
+    x487      c1               29.31   c2                3.77
+    x487      c18                  1   c27                  1
+    x487      c32                 -1   c42                 -1
+    x487      c242                -7
+    x488      c1               29.31   c3                3.77
+    x488      c18                  1   c28                  1
+    x488      c33                 -1   c43                 -1
+    x488      c243                -7
+    x489      c1               29.31   c4                3.77
+    x489      c18                  1   c29                  1
+    x489      c34                 -1   c44                 -1
+    x489      c244                -7
+    x490      c1               29.31   c5                3.77
+    x490      c18                  1   c30                  1
+    x490      c35                 -1   c45                 -1
+    x490      c245                -7
+    x491      c1               29.31   c6                3.77
+    x491      c18                  1   c31                  1
+    x491      c36                 -1   c46                 -1
+    x491      c246                -7
+    x492      c1               65.71   c2                2.28
+    x492      c18                  1   c47                 -1
+    x493      c1               65.71   c3                2.28
+    x493      c18                  1   c48                 -1
+    x494      c1               65.71   c4                2.28
+    x494      c18                  1   c49                 -1
+    x495      c1               65.71   c5                2.28
+    x495      c18                  1   c50                 -1
+    x496      c1               65.71   c6                2.28
+    x496      c18                  1   c51                 -1
+    x497      c1               68.29   c2                2.88
+    x497      c19                  1   c22                 -1
+    x497      c247                -7
+    x498      c1               68.29   c3                2.88
+    x498      c19                  1   c23                 -1
+    x498      c248                -7
+    x499      c1               68.29   c4                2.88
+    x499      c19                  1   c24                 -1
+    x499      c249                -7
+    x500      c1               68.29   c5                2.88
+    x500      c19                  1   c25                 -1
+    x500      c250                -7
+    x501      c1               68.29   c6                2.88
+    x501      c19                  1   c26                 -1
+    x501      c251                -7
+    x502      c1               71.01   c2                2.77
+    x502      c19                  1   c37                 -1
+    x503      c1               71.01   c3                2.77
+    x503      c19                  1   c38                 -1
+    x504      c1               71.01   c4                2.77
+    x504      c19                  1   c39                 -1
+    x505      c1               71.01   c5                2.77
+    x505      c19                  1   c40                 -1
+    x506      c1               71.01   c6                2.77
+    x506      c19                  1   c41                 -1
+    x507      c1               40.59   c2                4.02
+    x507      c19                  1   c22                 -1
+    x507      c27                  1   c42                 -1
+    x507      c252                -7
+    x508      c1               40.59   c3                4.02
+    x508      c19                  1   c23                 -1
+    x508      c28                  1   c43                 -1
+    x508      c253                -7
+    x509      c1               40.59   c4                4.02
+    x509      c19                  1   c24                 -1
+    x509      c29                  1   c44                 -1
+    x509      c254                -7
+    x510      c1               40.59   c5                4.02
+    x510      c19                  1   c25                 -1
+    x510      c30                  1   c45                 -1
+    x510      c255                -7
+    x511      c1               40.59   c6                4.02
+    x511      c19                  1   c26                 -1
+    x511      c31                  1   c46                 -1
+    x511      c256                -7
+    x512      c1                  52   c2                3.55
+    x512      c19                  1   c22                 -1
+    x512      c32                  1   c47                 -1
+    x512      c257                -7
+    x513      c1                  52   c3                3.55
+    x513      c19                  1   c23                 -1
+    x513      c33                  1   c48                 -1
+    x513      c258                -7
+    x514      c1                  52   c4                3.55
+    x514      c19                  1   c24                 -1
+    x514      c34                  1   c49                 -1
+    x514      c259                -7
+    x515      c1                  52   c5                3.55
+    x515      c19                  1   c25                 -1
+    x515      c35                  1   c50                 -1
+    x515      c260                -7
+    x516      c1                  52   c6                3.55
+    x516      c19                  1   c26                 -1
+    x516      c36                  1   c51                 -1
+    x516      c261                -7
+    x517      c1               64.59   c2                3.37
+    x517      c20                  1   c32                 -1
+    x517      c262                -7
+    x518      c1               64.59   c3                3.37
+    x518      c20                  1   c33                 -1
+    x518      c263                -7
+    x519      c1               64.59   c4                3.37
+    x519      c20                  1   c34                 -1
+    x519      c264                -7
+    x520      c1               64.59   c5                3.37
+    x520      c20                  1   c35                 -1
+    x520      c265                -7
+    x521      c1               64.59   c6                3.37
+    x521      c20                  1   c36                 -1
+    x521      c266                -7
+    x522      c1               62.96   c2                3.44
+    x522      c20                  1   c22                  1
+    x522      c32                 -1   c37                 -1
+    x522      c267                -7
+    x523      c1               62.96   c3                3.44
+    x523      c20                  1   c23                  1
+    x523      c33                 -1   c38                 -1
+    x523      c268                -7
+    x524      c1               62.96   c4                3.44
+    x524      c20                  1   c24                  1
+    x524      c34                 -1   c39                 -1
+    x524      c269                -7
+    x525      c1               62.96   c5                3.44
+    x525      c20                  1   c25                  1
+    x525      c35                 -1   c40                 -1
+    x525      c270                -7
+    x526      c1               62.96   c6                3.44
+    x526      c20                  1   c26                  1
+    x526      c36                 -1   c41                 -1
+    x526      c271                -7
+    x527      c1               29.82   c2                4.79
+    x527      c20                  1   c27                  1
+    x527      c32                 -1   c42                 -1
+    x527      c272                -7
+    x528      c1               29.82   c3                4.79
+    x528      c20                  1   c28                  1
+    x528      c33                 -1   c43                 -1
+    x528      c273                -7
+    x529      c1               29.82   c4                4.79
+    x529      c20                  1   c29                  1
+    x529      c34                 -1   c44                 -1
+    x529      c274                -7
+    x530      c1               29.82   c5                4.79
+    x530      c20                  1   c30                  1
+    x530      c35                 -1   c45                 -1
+    x530      c275                -7
+    x531      c1               29.82   c6                4.79
+    x531      c20                  1   c31                  1
+    x531      c36                 -1   c46                 -1
+    x531      c276                -7
+    x532      c1               74.91   c2                2.95
+    x532      c20                  1   c47                 -1
+    x533      c1               74.91   c3                2.95
+    x533      c20                  1   c48                 -1
+    x534      c1               74.91   c4                2.95
+    x534      c20                  1   c49                 -1
+    x535      c1               74.91   c5                2.95
+    x535      c20                  1   c50                 -1
+    x536      c1               74.91   c6                2.95
+    x536      c20                  1   c51                 -1
+    x537      c1               62.18   c2                4.48
+    x537      c21                  1   c32                 -1
+    x537      c277                -7
+    x538      c1               62.18   c3                4.48
+    x538      c21                  1   c33                 -1
+    x538      c278                -7
+    x539      c1               62.18   c4                4.48
+    x539      c21                  1   c34                 -1
+    x539      c279                -7
+    x540      c1               62.18   c5                4.48
+    x540      c21                  1   c35                 -1
+    x540      c280                -7
+    x541      c1               62.18   c6                4.48
+    x541      c21                  1   c36                 -1
+    x541      c281                -7
+    x542      c1               67.07   c2                4.28
+    x542      c21                  1   c22                  1
+    x542      c32                 -1   c37                 -1
+    x542      c282                -7
+    x543      c1               67.07   c3                4.28
+    x543      c21                  1   c23                  1
+    x543      c33                 -1   c38                 -1
+    x543      c283                -7
+    x544      c1               67.07   c4                4.28
+    x544      c21                  1   c24                  1
+    x544      c34                 -1   c39                 -1
+    x544      c284                -7
+    x545      c1               67.07   c5                4.28
+    x545      c21                  1   c25                  1
+    x545      c35                 -1   c40                 -1
+    x545      c285                -7
+    x546      c1               67.07   c6                4.28
+    x546      c21                  1   c26                  1
+    x546      c36                 -1   c41                 -1
+    x546      c286                -7
+    x547      c1               49.68   c2                4.99
+    x547      c21                  1   c27                  1
+    x547      c32                 -1   c42                 -1
+    x547      c287                -7
+    x548      c1               49.68   c3                4.99
+    x548      c21                  1   c28                  1
+    x548      c33                 -1   c43                 -1
+    x548      c288                -7
+    x549      c1               49.68   c4                4.99
+    x549      c21                  1   c29                  1
+    x549      c34                 -1   c44                 -1
+    x549      c289                -7
+    x550      c1               49.68   c5                4.99
+    x550      c21                  1   c30                  1
+    x550      c35                 -1   c45                 -1
+    x550      c290                -7
+    x551      c1               49.68   c6                4.99
+    x551      c21                  1   c31                  1
+    x551      c36                 -1   c46                 -1
+    x551      c291                -7
+    x552      c1               84.45   c2                3.57
+    x552      c21                  1   c47                 -1
+    x553      c1               84.45   c3                3.57
+    x553      c21                  1   c48                 -1
+    x554      c1               84.45   c4                3.57
+    x554      c21                  1   c49                 -1
+    x555      c1               84.45   c5                3.57
+    x555      c21                  1   c50                 -1
+    x556      c1               84.45   c6                3.57
+    x556      c21                  1   c51                 -1
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    rhs       c1             2375.25   c2                12.5
+    rhs       c3                12.5   c4                12.5
+    rhs       c5                12.5   c6                12.5
+    rhs       c7                   1   c8                   1
+    rhs       c9                   2   c10                  1
+    rhs       c11                  1   c12                  1
+    rhs       c13                  1   c14                  1
+    rhs       c15                  1   c16                  1
+    rhs       c17                  1   c18                  1
+    rhs       c19                  1   c20                  1
+    rhs       c21                  1
+BOUNDS
+ FR bnd       x241    
+ UP bnd       x242                 1
+ UP bnd       x243                 1
+ UP bnd       x244                 1
+ UP bnd       x245                 1
+ UP bnd       x246                 1
+ UP bnd       x247                 1
+ UP bnd       x248                 1
+ UP bnd       x249                 1
+ UP bnd       x250                 1
+ UP bnd       x251                 1
+ UP bnd       x252                 1
+ UP bnd       x253                 1
+ UP bnd       x254                 1
+ UP bnd       x255                 1
+ UP bnd       x256                 1
+ UP bnd       x257                 1
+ UP bnd       x258                 1
+ UP bnd       x259                 1
+ UP bnd       x260                 1
+ UP bnd       x261                 1
+ UP bnd       x262                 1
+ UP bnd       x263                 1
+ UP bnd       x264                 1
+ UP bnd       x265                 1
+ UP bnd       x266                 1
+ UP bnd       x267                 1
+ UP bnd       x268                 1
+ UP bnd       x269                 1
+ UP bnd       x270                 1
+ UP bnd       x271                 1
+ UP bnd       x272                 1
+ UP bnd       x273                 1
+ UP bnd       x274                 1
+ UP bnd       x275                 1
+ UP bnd       x276                 1
+ UP bnd       x277                 1
+ UP bnd       x278                 1
+ UP bnd       x279                 1
+ UP bnd       x280                 1
+ UP bnd       x281                 1
+ UP bnd       x282                 1
+ UP bnd       x283                 1
+ UP bnd       x284                 1
+ UP bnd       x285                 1
+ UP bnd       x286                 1
+ UP bnd       x287                 1
+ UP bnd       x288                 1
+ UP bnd       x289                 1
+ UP bnd       x290                 1
+ UP bnd       x291                 1
+ UP bnd       x292                 1
+ UP bnd       x293                 1
+ UP bnd       x294                 1
+ UP bnd       x295                 1
+ UP bnd       x296                 1
+ UP bnd       x297                 1
+ UP bnd       x298                 1
+ UP bnd       x299                 1
+ UP bnd       x300                 1
+ UP bnd       x301                 1
+ UP bnd       x302                 2
+ UP bnd       x303                 2
+ UP bnd       x304                 2
+ UP bnd       x305                 2
+ UP bnd       x306                 2
+ UP bnd       x307                 2
+ UP bnd       x308                 2
+ UP bnd       x309                 2
+ UP bnd       x310                 2
+ UP bnd       x311                 2
+ UP bnd       x312                 2
+ UP bnd       x313                 2
+ UP bnd       x314                 2
+ UP bnd       x315                 2
+ UP bnd       x316                 2
+ UP bnd       x317                 1
+ UP bnd       x318                 1
+ UP bnd       x319                 1
+ UP bnd       x320                 1
+ UP bnd       x321                 1
+ UP bnd       x322                 1
+ UP bnd       x323                 1
+ UP bnd       x324                 1
+ UP bnd       x325                 1
+ UP bnd       x326                 1
+ UP bnd       x327                 1
+ UP bnd       x328                 1
+ UP bnd       x329                 1
+ UP bnd       x330                 1
+ UP bnd       x331                 1
+ UP bnd       x332                 1
+ UP bnd       x333                 1
+ UP bnd       x334                 1
+ UP bnd       x335                 1
+ UP bnd       x336                 1
+ UP bnd       x337                 1
+ UP bnd       x338                 1
+ UP bnd       x339                 1
+ UP bnd       x340                 1
+ UP bnd       x341                 1
+ UP bnd       x342                 1
+ UP bnd       x343                 1
+ UP bnd       x344                 1
+ UP bnd       x345                 1
+ UP bnd       x346                 1
+ UP bnd       x347                 1
+ UP bnd       x348                 1
+ UP bnd       x349                 1
+ UP bnd       x350                 1
+ UP bnd       x351                 1
+ UP bnd       x352                 1
+ UP bnd       x353                 1
+ UP bnd       x354                 1
+ UP bnd       x355                 1
+ UP bnd       x356                 1
+ UP bnd       x357                 1
+ UP bnd       x358                 1
+ UP bnd       x359                 1
+ UP bnd       x360                 1
+ UP bnd       x361                 1
+ UP bnd       x362                 1
+ UP bnd       x363                 1
+ UP bnd       x364                 1
+ UP bnd       x365                 1
+ UP bnd       x366                 1
+ UP bnd       x367                 1
+ UP bnd       x368                 1
+ UP bnd       x369                 1
+ UP bnd       x370                 1
+ UP bnd       x371                 1
+ UP bnd       x372                 1
+ UP bnd       x373                 1
+ UP bnd       x374                 1
+ UP bnd       x375                 1
+ UP bnd       x376                 1
+ UP bnd       x377                 1
+ UP bnd       x378                 1
+ UP bnd       x379                 1
+ UP bnd       x380                 1
+ UP bnd       x381                 1
+ UP bnd       x382                 1
+ UP bnd       x383                 1
+ UP bnd       x384                 1
+ UP bnd       x385                 1
+ UP bnd       x386                 1
+ UP bnd       x387                 1
+ UP bnd       x388                 1
+ UP bnd       x389                 1
+ UP bnd       x390                 1
+ UP bnd       x391                 1
+ UP bnd       x392                 1
+ UP bnd       x393                 1
+ UP bnd       x394                 1
+ UP bnd       x395                 1
+ UP bnd       x396                 1
+ UP bnd       x397                 1
+ UP bnd       x398                 1
+ UP bnd       x399                 1
+ UP bnd       x400                 1
+ UP bnd       x401                 1
+ UP bnd       x402                 1
+ UP bnd       x403                 1
+ UP bnd       x404                 1
+ UP bnd       x405                 1
+ UP bnd       x406                 1
+ UP bnd       x407                 1
+ UP bnd       x408                 1
+ UP bnd       x409                 1
+ UP bnd       x410                 1
+ UP bnd       x411                 1
+ UP bnd       x412                 1
+ UP bnd       x413                 1
+ UP bnd       x414                 1
+ UP bnd       x415                 1
+ UP bnd       x416                 1
+ UP bnd       x417                 1
+ UP bnd       x418                 1
+ UP bnd       x419                 1
+ UP bnd       x420                 1
+ UP bnd       x421                 1
+ UP bnd       x422                 1
+ UP bnd       x423                 1
+ UP bnd       x424                 1
+ UP bnd       x425                 1
+ UP bnd       x426                 1
+ UP bnd       x427                 1
+ UP bnd       x428                 1
+ UP bnd       x429                 1
+ UP bnd       x430                 1
+ UP bnd       x431                 1
+ UP bnd       x432                 1
+ UP bnd       x433                 1
+ UP bnd       x434                 1
+ UP bnd       x435                 1
+ UP bnd       x436                 1
+ UP bnd       x437                 1
+ UP bnd       x438                 1
+ UP bnd       x439                 1
+ UP bnd       x440                 1
+ UP bnd       x441                 1
+ UP bnd       x442                 1
+ UP bnd       x443                 1
+ UP bnd       x444                 1
+ UP bnd       x445                 1
+ UP bnd       x446                 1
+ UP bnd       x447                 1
+ UP bnd       x448                 1
+ UP bnd       x449                 1
+ UP bnd       x450                 1
+ UP bnd       x451                 1
+ UP bnd       x452                 1
+ UP bnd       x453                 1
+ UP bnd       x454                 1
+ UP bnd       x455                 1
+ UP bnd       x456                 1
+ UP bnd       x457                 1
+ UP bnd       x458                 1
+ UP bnd       x459                 1
+ UP bnd       x460                 1
+ UP bnd       x461                 1
+ UP bnd       x462                 1
+ UP bnd       x463                 1
+ UP bnd       x464                 1
+ UP bnd       x465                 1
+ UP bnd       x466                 1
+ UP bnd       x467                 1
+ UP bnd       x468                 1
+ UP bnd       x469                 1
+ UP bnd       x470                 1
+ UP bnd       x471                 1
+ UP bnd       x472                 1
+ UP bnd       x473                 1
+ UP bnd       x474                 1
+ UP bnd       x475                 1
+ UP bnd       x476                 1
+ UP bnd       x477                 1
+ UP bnd       x478                 1
+ UP bnd       x479                 1
+ UP bnd       x480                 1
+ UP bnd       x481                 1
+ UP bnd       x482                 1
+ UP bnd       x483                 1
+ UP bnd       x484                 1
+ UP bnd       x485                 1
+ UP bnd       x486                 1
+ UP bnd       x487                 1
+ UP bnd       x488                 1
+ UP bnd       x489                 1
+ UP bnd       x490                 1
+ UP bnd       x491                 1
+ UP bnd       x492                 1
+ UP bnd       x493                 1
+ UP bnd       x494                 1
+ UP bnd       x495                 1
+ UP bnd       x496                 1
+ UP bnd       x497                 1
+ UP bnd       x498                 1
+ UP bnd       x499                 1
+ UP bnd       x500                 1
+ UP bnd       x501                 1
+ UP bnd       x502                 1
+ UP bnd       x503                 1
+ UP bnd       x504                 1
+ UP bnd       x505                 1
+ UP bnd       x506                 1
+ UP bnd       x507                 1
+ UP bnd       x508                 1
+ UP bnd       x509                 1
+ UP bnd       x510                 1
+ UP bnd       x511                 1
+ UP bnd       x512                 1
+ UP bnd       x513                 1
+ UP bnd       x514                 1
+ UP bnd       x515                 1
+ UP bnd       x516                 1
+ UP bnd       x517                 1
+ UP bnd       x518                 1
+ UP bnd       x519                 1
+ UP bnd       x520                 1
+ UP bnd       x521                 1
+ UP bnd       x522                 1
+ UP bnd       x523                 1
+ UP bnd       x524                 1
+ UP bnd       x525                 1
+ UP bnd       x526                 1
+ UP bnd       x527                 1
+ UP bnd       x528                 1
+ UP bnd       x529                 1
+ UP bnd       x530                 1
+ UP bnd       x531                 1
+ UP bnd       x532                 1
+ UP bnd       x533                 1
+ UP bnd       x534                 1
+ UP bnd       x535                 1
+ UP bnd       x536                 1
+ UP bnd       x537                 1
+ UP bnd       x538                 1
+ UP bnd       x539                 1
+ UP bnd       x540                 1
+ UP bnd       x541                 1
+ UP bnd       x542                 1
+ UP bnd       x543                 1
+ UP bnd       x544                 1
+ UP bnd       x545                 1
+ UP bnd       x546                 1
+ UP bnd       x547                 1
+ UP bnd       x548                 1
+ UP bnd       x549                 1
+ UP bnd       x550                 1
+ UP bnd       x551                 1
+ UP bnd       x552                 1
+ UP bnd       x553                 1
+ UP bnd       x554                 1
+ UP bnd       x555                 1
+ UP bnd       x556                 1
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sample.mps b/demos/ppl_lpsol/examples/sample.mps
new file mode 100644
index 0000000..da97e46
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sample.mps
@@ -0,0 +1,24 @@
+* Problem:    sample
+* Class:      LP
+* Rows:       4
+* Columns:    3
+* Non-zeros:  12
+* Format:     Free MPS
+*
+NAME sample
+ROWS
+ N R______0
+ L p
+ L q
+ L r
+COLUMNS
+ x1 R______0 -10 p 1
+ x1 q 10 r 2
+ x2 R______0 -6 p 1
+ x2 q 4 r 2
+ x3 R______0 -4 p 1
+ x3 q 5 r 6
+RHS
+ RHS1 p 100 q 600
+ RHS1 r 300
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc105.mps b/demos/ppl_lpsol/examples/sc105.mps
new file mode 100644
index 0000000..4de391e
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc105.mps
@@ -0,0 +1,296 @@
+NAME          SC105
+ROWS
+ N  MAXIM
+ L  ROW00001
+ L  ROW00002
+ L  ROW00003
+ E  ROW00004
+ E  ROW00005
+ E  ROW00006
+ E  ROW00007
+ L  ROW00008
+ L  ROW00009
+ L  ROW00010
+ L  ROW00011
+ L  ROW00012
+ L  ROW00013
+ E  ROW00014
+ E  ROW00015
+ E  ROW00016
+ E  ROW00017
+ E  ROW00018
+ L  ROW00019
+ L  ROW00020
+ L  ROW00021
+ L  ROW00022
+ L  ROW00023
+ L  ROW00024
+ E  ROW00025
+ E  ROW00026
+ E  ROW00027
+ E  ROW00028
+ E  ROW00029
+ L  ROW00030
+ L  ROW00031
+ L  ROW00032
+ L  ROW00033
+ L  ROW00034
+ L  ROW00035
+ E  ROW00036
+ E  ROW00037
+ E  ROW00038
+ E  ROW00039
+ E  ROW00040
+ L  ROW00041
+ L  ROW00042
+ L  ROW00043
+ L  ROW00044
+ L  ROW00045
+ L  ROW00046
+ E  ROW00047
+ E  ROW00048
+ E  ROW00049
+ E  ROW00050
+ E  ROW00051
+ L  ROW00052
+ L  ROW00053
+ L  ROW00054
+ L  ROW00055
+ L  ROW00056
+ L  ROW00057
+ E  ROW00058
+ E  ROW00059
+ E  ROW00060
+ E  ROW00061
+ E  ROW00062
+ L  ROW00063
+ L  ROW00064
+ L  ROW00065
+ L  ROW00066
+ L  ROW00067
+ L  ROW00068
+ E  ROW00069
+ E  ROW00070
+ E  ROW00071
+ E  ROW00072
+ E  ROW00073
+ L  ROW00074
+ L  ROW00075
+ L  ROW00076
+ L  ROW00077
+ L  ROW00078
+ L  ROW00079
+ E  ROW00080
+ E  ROW00081
+ E  ROW00082
+ E  ROW00083
+ E  ROW00084
+ L  ROW00085
+ L  ROW00086
+ L  ROW00087
+ L  ROW00088
+ L  ROW00089
+ L  ROW00090
+ E  ROW00091
+ E  ROW00092
+ E  ROW00093
+ E  ROW00094
+ E  ROW00095
+ L  ROW00096
+ L  ROW00097
+ L  ROW00098
+ L  ROW00099
+ L  ROW00100
+ L  ROW00101
+ E  ROW00102
+ L  ROW00103
+ L  ROW00104
+ L  ROW00105
+COLUMNS
+    COL00001  ROW00001            2.   ROW00002            1.
+    COL00001  ROW00005           -1.
+    COL00002  ROW00001            1.   ROW00002            2.
+    COL00002  ROW00006           -1.
+    COL00003  ROW00001           1.5   ROW00002           1.5
+    COL00003  ROW00007           -1.
+    COL00004  MAXIM              -1.   ROW00004            1.
+    COL00004  ROW00014           1.1
+    COL00005  ROW00004           -1.   ROW00013            1.
+    COL00005  ROW00015            1.
+    COL00006  ROW00005            1.   ROW00008           -1.
+    COL00006  ROW00016           -1.
+    COL00007  ROW00006            1.   ROW00009           -1.
+    COL00007  ROW00017           -1.
+    COL00008  ROW00007            1.   ROW00010           -1.
+    COL00008  ROW00018           -1.
+    COL00009  ROW00008            1.   ROW00011           -1.
+    COL00010  ROW00009            1.   ROW00012           -1.
+    COL00011  ROW00010            1.   ROW00013           -1.
+    COL00012  ROW00011            2.   ROW00012            1.
+    COL00012  ROW00016           -1.
+    COL00013  ROW00011            1.   ROW00012            2.
+    COL00013  ROW00017           -1.
+    COL00014  ROW00011           1.5   ROW00012           1.5
+    COL00014  ROW00018           -1.
+    COL00015  ROW00014           -1.   ROW00015            1.
+    COL00015  ROW00025           1.1
+    COL00016  ROW00015           -1.   ROW00024            1.
+    COL00016  ROW00026            1.
+    COL00017  ROW00016            1.   ROW00019           -1.
+    COL00017  ROW00027           -1.
+    COL00018  ROW00017            1.   ROW00020           -1.
+    COL00018  ROW00028           -1.
+    COL00019  ROW00018            1.   ROW00021           -1.
+    COL00019  ROW00029           -1.
+    COL00020  ROW00019            1.   ROW00022           -1.
+    COL00021  ROW00020            1.   ROW00023           -1.
+    COL00022  ROW00021            1.   ROW00024           -1.
+    COL00023  ROW00022            2.   ROW00023            1.
+    COL00023  ROW00027           -1.
+    COL00024  ROW00022            1.   ROW00023            2.
+    COL00024  ROW00028           -1.
+    COL00025  ROW00022           1.5   ROW00023           1.5
+    COL00025  ROW00029           -1.
+    COL00026  ROW00025           -1.   ROW00026            1.
+    COL00026  ROW00036           1.1
+    COL00027  ROW00026           -1.   ROW00035            1.
+    COL00027  ROW00037            1.
+    COL00028  ROW00027            1.   ROW00030           -1.
+    COL00028  ROW00038           -1.
+    COL00029  ROW00028            1.   ROW00031           -1.
+    COL00029  ROW00039           -1.
+    COL00030  ROW00029            1.   ROW00032           -1.
+    COL00030  ROW00040           -1.
+    COL00031  ROW00030            1.   ROW00033           -1.
+    COL00032  ROW00031            1.   ROW00034           -1.
+    COL00033  ROW00032            1.   ROW00035           -1.
+    COL00034  ROW00033            2.   ROW00034            1.
+    COL00034  ROW00038           -1.
+    COL00035  ROW00033            1.   ROW00034            2.
+    COL00035  ROW00039           -1.
+    COL00036  ROW00033           1.5   ROW00034           1.5
+    COL00036  ROW00040           -1.
+    COL00037  ROW00036           -1.   ROW00037            1.
+    COL00037  ROW00047           1.1
+    COL00038  ROW00037           -1.   ROW00046            1.
+    COL00038  ROW00048            1.
+    COL00039  ROW00038            1.   ROW00041           -1.
+    COL00039  ROW00049           -1.
+    COL00040  ROW00039            1.   ROW00042           -1.
+    COL00040  ROW00050           -1.
+    COL00041  ROW00040            1.   ROW00043           -1.
+    COL00041  ROW00051           -1.
+    COL00042  ROW00041            1.   ROW00044           -1.
+    COL00043  ROW00042            1.   ROW00045           -1.
+    COL00044  ROW00043            1.   ROW00046           -1.
+    COL00045  ROW00044            2.   ROW00045            1.
+    COL00045  ROW00049           -1.
+    COL00046  ROW00044            1.   ROW00045            2.
+    COL00046  ROW00050           -1.
+    COL00047  ROW00044           1.5   ROW00045           1.5
+    COL00047  ROW00051           -1.
+    COL00048  ROW00047           -1.   ROW00048            1.
+    COL00048  ROW00058           1.1
+    COL00049  ROW00048           -1.   ROW00057            1.
+    COL00049  ROW00059            1.
+    COL00050  ROW00049            1.   ROW00052           -1.
+    COL00050  ROW00060           -1.
+    COL00051  ROW00050            1.   ROW00053           -1.
+    COL00051  ROW00061           -1.
+    COL00052  ROW00051            1.   ROW00054           -1.
+    COL00052  ROW00062           -1.
+    COL00053  ROW00052            1.   ROW00055           -1.
+    COL00054  ROW00053            1.   ROW00056           -1.
+    COL00055  ROW00054            1.   ROW00057           -1.
+    COL00056  ROW00055            2.   ROW00056            1.
+    COL00056  ROW00060           -1.
+    COL00057  ROW00055            1.   ROW00056            2.
+    COL00057  ROW00061           -1.
+    COL00058  ROW00055           1.5   ROW00056           1.5
+    COL00058  ROW00062           -1.
+    COL00059  ROW00058           -1.   ROW00059            1.
+    COL00059  ROW00069           1.1
+    COL00060  ROW00059           -1.   ROW00068            1.
+    COL00060  ROW00070            1.
+    COL00061  ROW00060            1.   ROW00063           -1.
+    COL00061  ROW00071           -1.
+    COL00062  ROW00061            1.   ROW00064           -1.
+    COL00062  ROW00072           -1.
+    COL00063  ROW00062            1.   ROW00065           -1.
+    COL00063  ROW00073           -1.
+    COL00064  ROW00063            1.   ROW00066           -1.
+    COL00065  ROW00064            1.   ROW00067           -1.
+    COL00066  ROW00065            1.   ROW00068           -1.
+    COL00067  ROW00066            2.   ROW00067            1.
+    COL00067  ROW00071           -1.
+    COL00068  ROW00066            1.   ROW00067            2.
+    COL00068  ROW00072           -1.
+    COL00069  ROW00066           1.5   ROW00067           1.5
+    COL00069  ROW00073           -1.
+    COL00070  ROW00069           -1.   ROW00070            1.
+    COL00070  ROW00080           1.1
+    COL00071  ROW00070           -1.   ROW00079            1.
+    COL00071  ROW00081            1.
+    COL00072  ROW00071            1.   ROW00074           -1.
+    COL00072  ROW00082           -1.
+    COL00073  ROW00072            1.   ROW00075           -1.
+    COL00073  ROW00083           -1.
+    COL00074  ROW00073            1.   ROW00076           -1.
+    COL00074  ROW00084           -1.
+    COL00075  ROW00074            1.   ROW00077           -1.
+    COL00076  ROW00075            1.   ROW00078           -1.
+    COL00077  ROW00076            1.   ROW00079           -1.
+    COL00078  ROW00077            2.   ROW00078            1.
+    COL00078  ROW00082           -1.
+    COL00079  ROW00077            1.   ROW00078            2.
+    COL00079  ROW00083           -1.
+    COL00080  ROW00077           1.5   ROW00078           1.5
+    COL00080  ROW00084           -1.
+    COL00081  ROW00080           -1.   ROW00081            1.
+    COL00081  ROW00091           1.1
+    COL00082  ROW00081           -1.   ROW00090            1.
+    COL00082  ROW00092            1.
+    COL00083  ROW00082            1.   ROW00085           -1.
+    COL00083  ROW00093           -1.
+    COL00084  ROW00083            1.   ROW00086           -1.
+    COL00084  ROW00094           -1.
+    COL00085  ROW00084            1.   ROW00087           -1.
+    COL00085  ROW00095           -1.
+    COL00086  ROW00085            1.   ROW00088           -1.
+    COL00087  ROW00086            1.   ROW00089           -1.
+    COL00088  ROW00087            1.   ROW00090           -1.
+    COL00089  ROW00088            2.   ROW00089            1.
+    COL00089  ROW00093           -1.
+    COL00090  ROW00088            1.   ROW00089            2.
+    COL00090  ROW00094           -1.
+    COL00091  ROW00088           1.5   ROW00089           1.5
+    COL00091  ROW00095           -1.
+    COL00092  ROW00091           -1.   ROW00092            1.
+    COL00092  ROW00102           1.1
+    COL00093  ROW00092           -1.   ROW00101            1.
+    COL00094  ROW00093            1.   ROW00096           -1.
+    COL00095  ROW00094            1.   ROW00097           -1.
+    COL00096  ROW00095            1.   ROW00098           -1.
+    COL00097  ROW00096            1.   ROW00099           -1.
+    COL00098  ROW00097            1.   ROW00100           -1.
+    COL00099  ROW00098            1.   ROW00101           -1.
+    COL00100  ROW00099            2.   ROW00100            1.
+    COL00100  ROW00103           -.8   ROW00104            .1
+    COL00101  ROW00099            1.   ROW00100            2.
+    COL00101  ROW00103            .1   ROW00104           -.8
+    COL00102  ROW00099           1.5   ROW00100           1.5
+    COL00102  ROW00103           .15   ROW00104           .15
+    COL00102  ROW00105           -1.
+    COL00103  ROW00102           -1.   ROW00105            1.
+RHS
+    CONST     ROW00001          200.   ROW00002          100.
+    CONST     ROW00011          200.   ROW00012          100.
+    CONST     ROW00022          200.   ROW00023          100.
+    CONST     ROW00033          200.   ROW00034          100.
+    CONST     ROW00044          200.   ROW00045          100.
+    CONST     ROW00055          200.   ROW00056          100.
+    CONST     ROW00066          200.   ROW00067          100.
+    CONST     ROW00077          200.   ROW00078          100.
+    CONST     ROW00088          200.   ROW00089          100.
+    CONST     ROW00099          200.   ROW00100          100.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc50a.mps b/demos/ppl_lpsol/examples/sc50a.mps
new file mode 100644
index 0000000..a59623f
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc50a.mps
@@ -0,0 +1,141 @@
+NAME          SC50A
+ROWS
+ N  MAXIM
+ L  ROW00001
+ L  ROW00002
+ L  ROW00003
+ E  ROW00004
+ E  ROW00005
+ E  ROW00006
+ E  ROW00007
+ L  ROW00008
+ L  ROW00009
+ L  ROW00010
+ L  ROW00011
+ L  ROW00012
+ L  ROW00013
+ E  ROW00014
+ E  ROW00015
+ E  ROW00016
+ E  ROW00017
+ E  ROW00018
+ L  ROW00019
+ L  ROW00020
+ L  ROW00021
+ L  ROW00022
+ L  ROW00023
+ L  ROW00024
+ E  ROW00025
+ E  ROW00026
+ E  ROW00027
+ E  ROW00028
+ E  ROW00029
+ L  ROW00030
+ L  ROW00031
+ L  ROW00032
+ L  ROW00033
+ L  ROW00034
+ L  ROW00035
+ E  ROW00036
+ E  ROW00037
+ E  ROW00038
+ E  ROW00039
+ E  ROW00040
+ L  ROW00041
+ L  ROW00042
+ L  ROW00043
+ L  ROW00044
+ L  ROW00045
+ L  ROW00046
+ E  ROW00047
+ L  ROW00048
+ L  ROW00049
+ L  ROW00050
+COLUMNS
+    COL00001  ROW00001            2.   ROW00002            1.
+    COL00001  ROW00005           -1.
+    COL00002  ROW00001            1.   ROW00002            2.
+    COL00002  ROW00006           -1.
+    COL00003  ROW00001           1.5   ROW00002           1.5
+    COL00003  ROW00007           -1.
+    COL00004  MAXIM              -1.   ROW00004            1.
+    COL00004  ROW00014           1.1
+    COL00005  ROW00004           -1.   ROW00013            1.
+    COL00005  ROW00015            1.
+    COL00006  ROW00005            1.   ROW00008           -1.
+    COL00006  ROW00016           -1.
+    COL00007  ROW00006            1.   ROW00009           -1.
+    COL00007  ROW00017           -1.
+    COL00008  ROW00007            1.   ROW00010           -1.
+    COL00008  ROW00018           -1.
+    COL00009  ROW00008            1.   ROW00011           -1.
+    COL00010  ROW00009            1.   ROW00012           -1.
+    COL00011  ROW00010            1.   ROW00013           -1.
+    COL00012  ROW00011            2.   ROW00012            1.
+    COL00012  ROW00016           -1.
+    COL00013  ROW00011            1.   ROW00012            2.
+    COL00013  ROW00017           -1.
+    COL00014  ROW00011           1.5   ROW00012           1.5
+    COL00014  ROW00018           -1.
+    COL00015  ROW00014           -1.   ROW00015            1.
+    COL00015  ROW00025           1.1
+    COL00016  ROW00015           -1.   ROW00024            1.
+    COL00016  ROW00026            1.
+    COL00017  ROW00016            1.   ROW00019           -1.
+    COL00017  ROW00027           -1.
+    COL00018  ROW00017            1.   ROW00020           -1.
+    COL00018  ROW00028           -1.
+    COL00019  ROW00018            1.   ROW00021           -1.
+    COL00019  ROW00029           -1.
+    COL00020  ROW00019            1.   ROW00022           -1.
+    COL00021  ROW00020            1.   ROW00023           -1.
+    COL00022  ROW00021            1.   ROW00024           -1.
+    COL00023  ROW00022            2.   ROW00023            1.
+    COL00023  ROW00027           -1.
+    COL00024  ROW00022            1.   ROW00023            2.
+    COL00024  ROW00028           -1.
+    COL00025  ROW00022           1.5   ROW00023           1.5
+    COL00025  ROW00029           -1.
+    COL00026  ROW00025           -1.   ROW00026            1.
+    COL00026  ROW00036           1.1
+    COL00027  ROW00026           -1.   ROW00035            1.
+    COL00027  ROW00037            1.
+    COL00028  ROW00027            1.   ROW00030           -1.
+    COL00028  ROW00038           -1.
+    COL00029  ROW00028            1.   ROW00031           -1.
+    COL00029  ROW00039           -1.
+    COL00030  ROW00029            1.   ROW00032           -1.
+    COL00030  ROW00040           -1.
+    COL00031  ROW00030            1.   ROW00033           -1.
+    COL00032  ROW00031            1.   ROW00034           -1.
+    COL00033  ROW00032            1.   ROW00035           -1.
+    COL00034  ROW00033            2.   ROW00034            1.
+    COL00034  ROW00038           -1.
+    COL00035  ROW00033            1.   ROW00034            2.
+    COL00035  ROW00039           -1.
+    COL00036  ROW00033           1.5   ROW00034           1.5
+    COL00036  ROW00040           -1.
+    COL00037  ROW00036           -1.   ROW00037            1.
+    COL00037  ROW00047           1.1
+    COL00038  ROW00037           -1.   ROW00046            1.
+    COL00039  ROW00038            1.   ROW00041           -1.
+    COL00040  ROW00039            1.   ROW00042           -1.
+    COL00041  ROW00040            1.   ROW00043           -1.
+    COL00042  ROW00041            1.   ROW00044           -1.
+    COL00043  ROW00042            1.   ROW00045           -1.
+    COL00044  ROW00043            1.   ROW00046           -1.
+    COL00045  ROW00044            2.   ROW00045            1.
+    COL00045  ROW00048           -.8   ROW00049            .1
+    COL00046  ROW00044            1.   ROW00045            2.
+    COL00046  ROW00048            .1   ROW00049           -.8
+    COL00047  ROW00044           1.5   ROW00045           1.5
+    COL00047  ROW00048           .15   ROW00049           .15
+    COL00047  ROW00050           -1.
+    COL00048  ROW00047           -1.   ROW00050            1.
+RHS
+    CONST     ROW00001          170.   ROW00002          130.
+    CONST     ROW00011          170.   ROW00012          130.
+    CONST     ROW00022          170.   ROW00023          130.
+    CONST     ROW00033          170.   ROW00034          130.
+    CONST     ROW00044          170.   ROW00045          130.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/sc50b.mps b/demos/ppl_lpsol/examples/sc50b.mps
new file mode 100644
index 0000000..8d517ef
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sc50b.mps
@@ -0,0 +1,127 @@
+NAME          SC50B
+ROWS
+ N  MAXIM
+ L  ROW00001
+ L  ROW00002
+ L  ROW00003
+ E  ROW00004
+ E  ROW00005
+ E  ROW00006
+ E  ROW00007
+ L  ROW00008
+ L  ROW00009
+ L  ROW00010
+ L  ROW00011
+ L  ROW00012
+ L  ROW00013
+ E  ROW00014
+ E  ROW00015
+ E  ROW00016
+ E  ROW00017
+ E  ROW00018
+ L  ROW00019
+ L  ROW00020
+ L  ROW00021
+ L  ROW00022
+ L  ROW00023
+ L  ROW00024
+ E  ROW00025
+ E  ROW00026
+ E  ROW00027
+ E  ROW00028
+ E  ROW00029
+ L  ROW00030
+ L  ROW00031
+ L  ROW00032
+ L  ROW00033
+ L  ROW00034
+ L  ROW00035
+ E  ROW00036
+ E  ROW00037
+ E  ROW00038
+ E  ROW00039
+ E  ROW00040
+ L  ROW00041
+ L  ROW00042
+ L  ROW00043
+ L  ROW00044
+ L  ROW00045
+ L  ROW00046
+ E  ROW00047
+ L  ROW00048
+ L  ROW00049
+ L  ROW00050
+COLUMNS
+    COL00001  ROW00001            3.   ROW00005           -1.
+    COL00002  ROW00001            3.   ROW00006           -1.
+    COL00003  ROW00001            3.   ROW00007           -1.
+    COL00004  MAXIM              -1.   ROW00004            1.
+    COL00004  ROW00014           1.1
+    COL00005  ROW00004           -1.   ROW00012            .4
+    COL00005  ROW00013            .6   ROW00015            1.
+    COL00006  ROW00005            1.   ROW00008           -1.
+    COL00006  ROW00016           -1.
+    COL00007  ROW00006            1.   ROW00009           -1.
+    COL00007  ROW00017           -1.
+    COL00008  ROW00007            1.   ROW00010           -1.
+    COL00008  ROW00018           -1.
+    COL00009  ROW00008            1.   ROW00011           -1.
+    COL00010  ROW00009            1.   ROW00012           -1.
+    COL00011  ROW00010            1.   ROW00013           -1.
+    COL00012  ROW00011            3.   ROW00016           -1.
+    COL00013  ROW00011            3.   ROW00017           -1.
+    COL00014  ROW00011            3.   ROW00018           -1.
+    COL00015  ROW00014           -1.   ROW00015            1.
+    COL00015  ROW00025           1.1
+    COL00016  ROW00015           -1.   ROW00023            .4
+    COL00016  ROW00024            .6   ROW00026            1.
+    COL00017  ROW00016            1.   ROW00019           -1.
+    COL00017  ROW00027           -1.
+    COL00018  ROW00017            1.   ROW00020           -1.
+    COL00018  ROW00028           -1.
+    COL00019  ROW00018            1.   ROW00021           -1.
+    COL00019  ROW00029           -1.
+    COL00020  ROW00019            1.   ROW00022           -1.
+    COL00021  ROW00020            1.   ROW00023           -1.
+    COL00022  ROW00021            1.   ROW00024           -1.
+    COL00023  ROW00022            3.   ROW00027           -1.
+    COL00024  ROW00022            3.   ROW00028           -1.
+    COL00025  ROW00022            3.   ROW00029           -1.
+    COL00026  ROW00025           -1.   ROW00026            1.
+    COL00026  ROW00036           1.1
+    COL00027  ROW00026           -1.   ROW00034            .4
+    COL00027  ROW00035            .6   ROW00037            1.
+    COL00028  ROW00027            1.   ROW00030           -1.
+    COL00028  ROW00038           -1.
+    COL00029  ROW00028            1.   ROW00031           -1.
+    COL00029  ROW00039           -1.
+    COL00030  ROW00029            1.   ROW00032           -1.
+    COL00030  ROW00040           -1.
+    COL00031  ROW00030            1.   ROW00033           -1.
+    COL00032  ROW00031            1.   ROW00034           -1.
+    COL00033  ROW00032            1.   ROW00035           -1.
+    COL00034  ROW00033            3.   ROW00038           -1.
+    COL00035  ROW00033            3.   ROW00039           -1.
+    COL00036  ROW00033            3.   ROW00040           -1.
+    COL00037  ROW00036           -1.   ROW00037            1.
+    COL00037  ROW00047           1.1
+    COL00038  ROW00037           -1.   ROW00045            .4
+    COL00038  ROW00046            .6
+    COL00039  ROW00038            1.   ROW00041           -1.
+    COL00040  ROW00039            1.   ROW00042           -1.
+    COL00041  ROW00040            1.   ROW00043           -1.
+    COL00042  ROW00041            1.   ROW00044           -1.
+    COL00043  ROW00042            1.   ROW00045           -1.
+    COL00044  ROW00043            1.   ROW00046           -1.
+    COL00045  ROW00044            3.   ROW00048           -.7
+    COL00046  ROW00044            3.   ROW00048            .3
+    COL00046  ROW00049           -1.
+    COL00047  ROW00044            3.   ROW00048            .3
+    COL00047  ROW00050           -1.
+    COL00048  ROW00047           -1.   ROW00049            .4
+    COL00048  ROW00050            .6
+RHS
+    CONST     ROW00001          300.   ROW00011          300.
+    CONST     ROW00022          300.   ROW00033          300.
+    CONST     ROW00044          300.
+ENDATA
diff --git a/demos/ppl_lpsol/examples/ship08l.mps b/demos/ppl_lpsol/examples/ship08l.mps
new file mode 100644
index 0000000..afb09b8
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ship08l.mps
@@ -0,0 +1,9547 @@
+NAME          SHIP08L
+ROWS
+ N  COST
+ G  REGMIN
+ L  REGMAX
+ G  OVRMIN
+ L  OVRMAX
+ G  REGMIN01
+ G  REGMIN02
+ E  REGMIN03
+ G  REGMIN04
+ E  REGMIN05
+ E  REGMIN06
+ E  REGMIN07
+ E  REGMIN08
+ L  REGMAX01
+ L  REGMAX02
+ L  REGMAX04
+ G  OVRMIN01
+ G  OVRMIN02
+ E  OVRMIN03
+ G  OVRMIN04
+ E  OVRMIN05
+ E  OVRMIN06
+ E  OVRMIN07
+ E  OVRMIN08
+ L  OVRMAX01
+ L  OVRMAX02
+ L  OVRMAX04
+ L  TRAN0101
+ L  TRAN0102
+ L  TRAN0103
+ L  TRAN0104
+ L  TRAN0105
+ L  TRAN0106
+ L  TRAN0107
+ L  TRAN0108
+ L  TRAN0201
+ L  TRAN0202
+ L  TRAN0203
+ L  TRAN0204
+ L  TRAN0205
+ L  TRAN0206
+ L  TRAN0207
+ L  TRAN0208
+ L  TRAN0301
+ L  TRAN0302
+ L  TRAN0303
+ L  TRAN0304
+ L  TRAN0305
+ L  TRAN0306
+ L  TRAN0307
+ L  TRAN0308
+ L  TRAN0401
+ L  TRAN0402
+ L  TRAN0403
+ L  TRAN0404
+ L  TRAN0405
+ L  TRAN0406
+ L  TRAN0407
+ L  TRAN0408
+ L  TRAN0501
+ L  TRAN0502
+ L  TRAN0503
+ L  TRAN0504
+ L  TRAN0505
+ L  TRAN0506
+ L  TRAN0507
+ L  TRAN0508
+ L  TRAN0601
+ L  TRAN0602
+ L  TRAN0603
+ L  TRAN0604
+ L  TRAN0605
+ L  TRAN0606
+ L  TRAN0607
+ L  TRAN0608
+ L  TRAN0701
+ L  TRAN0702
+ L  TRAN0703
+ L  TRAN0704
+ L  TRAN0705
+ L  TRAN0706
+ L  TRAN0707
+ L  TRAN0708
+ L  TRAN0801
+ L  TRAN0802
+ L  TRAN0803
+ L  TRAN0804
+ L  TRAN0805
+ L  TRAN0806
+ L  TRAN0807
+ L  TRAN0808
+ E  BAL0101
+ E  BAL0102
+ E  BAL0103
+ E  BAL0104
+ E  BAL0105
+ E  BAL0106
+ E  BAL0107
+ E  BAL0108
+ E  BAL0109
+ E  BAL0110
+ E  BAL0111
+ E  BAL0112
+ E  BAL0113
+ E  BAL0114
+ E  BAL0115
+ E  BAL0116
+ E  BAL0117
+ E  BAL0118
+ E  BAL0119
+ E  BAL0120
+ E  BAL0121
+ E  BAL0122
+ E  BAL0123
+ E  BAL0124
+ E  BAL0125
+ E  BAL0126
+ E  BAL0127
+ E  BAL0128
+ E  BAL0129
+ E  BAL0130
+ E  BAL0131
+ E  BAL0132
+ E  BAL0133
+ E  BAL0134
+ E  BAL0135
+ E  BAL0136
+ E  BAL0137
+ E  BAL0138
+ E  BAL0139
+ E  BAL0140
+ E  BAL0141
+ E  BAL0142
+ E  BAL0143
+ E  BAL0144
+ E  BAL0145
+ E  BAL0146
+ E  BAL0147
+ E  BAL0148
+ E  BAL0149
+ E  BAL0150
+ E  BAL0151
+ E  BAL0152
+ E  BAL0153
+ E  BAL0154
+ E  BAL0155
+ E  BAL0156
+ E  BAL0157
+ E  BAL0158
+ E  BAL0159
+ E  BAL0160
+ E  BAL0161
+ E  BAL0162
+ E  BAL0163
+ E  BAL0164
+ E  BAL0165
+ E  BAL0166
+ E  BAL0167
+ E  BAL0168
+ E  BAL0169
+ E  BAL0170
+ E  BAL0171
+ E  BAL0172
+ E  BAL0173
+ E  BAL0174
+ E  BAL0175
+ E  BAL0176
+ E  BAL0177
+ E  BAL0178
+ E  BAL0179
+ E  BAL0180
+ E  BAL0181
+ E  BAL0182
+ E  BAL0183
+ E  BAL0184
+ E  BAL0185
+ E  BAL0186
+ E  BAL0201
+ E  BAL0202
+ E  BAL0203
+ E  BAL0204
+ E  BAL0205
+ E  BAL0206
+ E  BAL0207
+ E  BAL0208
+ E  BAL0209
+ E  BAL0210
+ E  BAL0211
+ E  BAL0212
+ E  BAL0213
+ E  BAL0214
+ E  BAL0215
+ E  BAL0216
+ E  BAL0217
+ E  BAL0218
+ E  BAL0219
+ E  BAL0220
+ E  BAL0221
+ E  BAL0222
+ E  BAL0223
+ E  BAL0224
+ E  BAL0225
+ E  BAL0226
+ E  BAL0227
+ E  BAL0228
+ E  BAL0229
+ E  BAL0230
+ E  BAL0231
+ E  BAL0232
+ E  BAL0233
+ E  BAL0234
+ E  BAL0235
+ E  BAL0236
+ E  BAL0237
+ E  BAL0238
+ E  BAL0239
+ E  BAL0240
+ E  BAL0241
+ E  BAL0242
+ E  BAL0243
+ E  BAL0244
+ E  BAL0245
+ E  BAL0246
+ E  BAL0247
+ E  BAL0248
+ E  BAL0249
+ E  BAL0250
+ E  BAL0251
+ E  BAL0252
+ E  BAL0253
+ E  BAL0254
+ E  BAL0255
+ E  BAL0256
+ E  BAL0257
+ E  BAL0258
+ E  BAL0259
+ E  BAL0260
+ E  BAL0261
+ E  BAL0262
+ E  BAL0263
+ E  BAL0264
+ E  BAL0265
+ E  BAL0266
+ E  BAL0267
+ E  BAL0268
+ E  BAL0269
+ E  BAL0270
+ E  BAL0271
+ E  BAL0272
+ E  BAL0273
+ E  BAL0274
+ E  BAL0275
+ E  BAL0276
+ E  BAL0277
+ E  BAL0278
+ E  BAL0279
+ E  BAL0280
+ E  BAL0281
+ E  BAL0282
+ E  BAL0283
+ E  BAL0284
+ E  BAL0285
+ E  BAL0286
+ E  BAL0301
+ E  BAL0302
+ E  BAL0303
+ E  BAL0304
+ E  BAL0305
+ E  BAL0306
+ E  BAL0307
+ E  BAL0308
+ E  BAL0309
+ E  BAL0310
+ E  BAL0311
+ E  BAL0312
+ E  BAL0313
+ E  BAL0314
+ E  BAL0315
+ E  BAL0316
+ E  BAL0317
+ E  BAL0318
+ E  BAL0319
+ E  BAL0320
+ E  BAL0321
+ E  BAL0322
+ E  BAL0323
+ E  BAL0324
+ E  BAL0325
+ E  BAL0326
+ E  BAL0327
+ E  BAL0328
+ E  BAL0329
+ E  BAL0330
+ E  BAL0331
+ E  BAL0332
+ E  BAL0333
+ E  BAL0334
+ E  BAL0335
+ E  BAL0336
+ E  BAL0337
+ E  BAL0338
+ E  BAL0339
+ E  BAL0340
+ E  BAL0341
+ E  BAL0342
+ E  BAL0343
+ E  BAL0344
+ E  BAL0345
+ E  BAL0346
+ E  BAL0347
+ E  BAL0348
+ E  BAL0349
+ E  BAL0350
+ E  BAL0351
+ E  BAL0352
+ E  BAL0353
+ E  BAL0354
+ E  BAL0355
+ E  BAL0356
+ E  BAL0357
+ E  BAL0358
+ E  BAL0359
+ E  BAL0360
+ E  BAL0361
+ E  BAL0362
+ E  BAL0363
+ E  BAL0364
+ E  BAL0365
+ E  BAL0366
+ E  BAL0367
+ E  BAL0368
+ E  BAL0369
+ E  BAL0370
+ E  BAL0371
+ E  BAL0372
+ E  BAL0373
+ E  BAL0374
+ E  BAL0375
+ E  BAL0376
+ E  BAL0377
+ E  BAL0378
+ E  BAL0379
+ E  BAL0380
+ E  BAL0381
+ E  BAL0382
+ E  BAL0383
+ E  BAL0384
+ E  BAL0385
+ E  BAL0386
+ E  BAL0401
+ E  BAL0402
+ E  BAL0403
+ E  BAL0404
+ E  BAL0405
+ E  BAL0406
+ E  BAL0407
+ E  BAL0408
+ E  BAL0409
+ E  BAL0410
+ E  BAL0411
+ E  BAL0412
+ E  BAL0413
+ E  BAL0414
+ E  BAL0415
+ E  BAL0416
+ E  BAL0417
+ E  BAL0418
+ E  BAL0419
+ E  BAL0420
+ E  BAL0421
+ E  BAL0422
+ E  BAL0423
+ E  BAL0424
+ E  BAL0425
+ E  BAL0426
+ E  BAL0427
+ E  BAL0428
+ E  BAL0429
+ E  BAL0430
+ E  BAL0431
+ E  BAL0432
+ E  BAL0433
+ E  BAL0434
+ E  BAL0435
+ E  BAL0436
+ E  BAL0437
+ E  BAL0438
+ E  BAL0439
+ E  BAL0440
+ E  BAL0441
+ E  BAL0442
+ E  BAL0443
+ E  BAL0444
+ E  BAL0445
+ E  BAL0446
+ E  BAL0447
+ E  BAL0448
+ E  BAL0449
+ E  BAL0450
+ E  BAL0451
+ E  BAL0452
+ E  BAL0453
+ E  BAL0454
+ E  BAL0455
+ E  BAL0456
+ E  BAL0457
+ E  BAL0458
+ E  BAL0459
+ E  BAL0460
+ E  BAL0461
+ E  BAL0462
+ E  BAL0463
+ E  BAL0464
+ E  BAL0465
+ E  BAL0466
+ E  BAL0467
+ E  BAL0468
+ E  BAL0469
+ E  BAL0470
+ E  BAL0471
+ E  BAL0472
+ E  BAL0473
+ E  BAL0474
+ E  BAL0475
+ E  BAL0476
+ E  BAL0477
+ E  BAL0478
+ E  BAL0479
+ E  BAL0480
+ E  BAL0481
+ E  BAL0482
+ E  BAL0483
+ E  BAL0484
+ E  BAL0485
+ E  BAL0486
+ E  BAL0501
+ E  BAL0502
+ E  BAL0503
+ E  BAL0504
+ E  BAL0505
+ E  BAL0506
+ E  BAL0507
+ E  BAL0508
+ E  BAL0509
+ E  BAL0510
+ E  BAL0511
+ E  BAL0512
+ E  BAL0513
+ E  BAL0514
+ E  BAL0515
+ E  BAL0516
+ E  BAL0517
+ E  BAL0518
+ E  BAL0519
+ E  BAL0520
+ E  BAL0521
+ E  BAL0522
+ E  BAL0523
+ E  BAL0524
+ E  BAL0525
+ E  BAL0526
+ E  BAL0527
+ E  BAL0528
+ E  BAL0529
+ E  BAL0530
+ E  BAL0531
+ E  BAL0532
+ E  BAL0533
+ E  BAL0534
+ E  BAL0535
+ E  BAL0536
+ E  BAL0537
+ E  BAL0538
+ E  BAL0539
+ E  BAL0540
+ E  BAL0541
+ E  BAL0542
+ E  BAL0543
+ E  BAL0544
+ E  BAL0545
+ E  BAL0546
+ E  BAL0547
+ E  BAL0548
+ E  BAL0549
+ E  BAL0550
+ E  BAL0551
+ E  BAL0552
+ E  BAL0553
+ E  BAL0554
+ E  BAL0555
+ E  BAL0556
+ E  BAL0557
+ E  BAL0558
+ E  BAL0559
+ E  BAL0560
+ E  BAL0561
+ E  BAL0562
+ E  BAL0563
+ E  BAL0564
+ E  BAL0565
+ E  BAL0566
+ E  BAL0567
+ E  BAL0568
+ E  BAL0569
+ E  BAL0570
+ E  BAL0571
+ E  BAL0572
+ E  BAL0573
+ E  BAL0574
+ E  BAL0575
+ E  BAL0576
+ E  BAL0577
+ E  BAL0578
+ E  BAL0579
+ E  BAL0580
+ E  BAL0581
+ E  BAL0582
+ E  BAL0583
+ E  BAL0584
+ E  BAL0585
+ E  BAL0586
+ E  BAL0601
+ E  BAL0602
+ E  BAL0603
+ E  BAL0604
+ E  BAL0605
+ E  BAL0606
+ E  BAL0607
+ E  BAL0608
+ E  BAL0609
+ E  BAL0610
+ E  BAL0611
+ E  BAL0612
+ E  BAL0613
+ E  BAL0614
+ E  BAL0615
+ E  BAL0616
+ E  BAL0617
+ E  BAL0618
+ E  BAL0619
+ E  BAL0620
+ E  BAL0621
+ E  BAL0622
+ E  BAL0623
+ E  BAL0624
+ E  BAL0625
+ E  BAL0626
+ E  BAL0627
+ E  BAL0628
+ E  BAL0629
+ E  BAL0630
+ E  BAL0631
+ E  BAL0632
+ E  BAL0633
+ E  BAL0634
+ E  BAL0635
+ E  BAL0636
+ E  BAL0637
+ E  BAL0638
+ E  BAL0639
+ E  BAL0640
+ E  BAL0641
+ E  BAL0642
+ E  BAL0643
+ E  BAL0644
+ E  BAL0645
+ E  BAL0646
+ E  BAL0647
+ E  BAL0648
+ E  BAL0649
+ E  BAL0650
+ E  BAL0651
+ E  BAL0652
+ E  BAL0653
+ E  BAL0654
+ E  BAL0655
+ E  BAL0656
+ E  BAL0657
+ E  BAL0658
+ E  BAL0659
+ E  BAL0660
+ E  BAL0661
+ E  BAL0662
+ E  BAL0663
+ E  BAL0664
+ E  BAL0665
+ E  BAL0666
+ E  BAL0667
+ E  BAL0668
+ E  BAL0669
+ E  BAL0670
+ E  BAL0671
+ E  BAL0672
+ E  BAL0673
+ E  BAL0674
+ E  BAL0675
+ E  BAL0676
+ E  BAL0677
+ E  BAL0678
+ E  BAL0679
+ E  BAL0680
+ E  BAL0681
+ E  BAL0682
+ E  BAL0683
+ E  BAL0684
+ E  BAL0685
+ E  BAL0686
+ E  BAL0701
+ E  BAL0702
+ E  BAL0703
+ E  BAL0704
+ E  BAL0705
+ E  BAL0706
+ E  BAL0707
+ E  BAL0708
+ E  BAL0709
+ E  BAL0710
+ E  BAL0711
+ E  BAL0712
+ E  BAL0713
+ E  BAL0714
+ E  BAL0715
+ E  BAL0716
+ E  BAL0717
+ E  BAL0718
+ E  BAL0719
+ E  BAL0720
+ E  BAL0721
+ E  BAL0722
+ E  BAL0723
+ E  BAL0724
+ E  BAL0725
+ E  BAL0726
+ E  BAL0727
+ E  BAL0728
+ E  BAL0729
+ E  BAL0730
+ E  BAL0731
+ E  BAL0732
+ E  BAL0733
+ E  BAL0734
+ E  BAL0735
+ E  BAL0736
+ E  BAL0737
+ E  BAL0738
+ E  BAL0739
+ E  BAL0740
+ E  BAL0741
+ E  BAL0742
+ E  BAL0743
+ E  BAL0744
+ E  BAL0745
+ E  BAL0746
+ E  BAL0747
+ E  BAL0748
+ E  BAL0749
+ E  BAL0750
+ E  BAL0751
+ E  BAL0752
+ E  BAL0753
+ E  BAL0754
+ E  BAL0755
+ E  BAL0756
+ E  BAL0757
+ E  BAL0758
+ E  BAL0759
+ E  BAL0760
+ E  BAL0761
+ E  BAL0762
+ E  BAL0763
+ E  BAL0764
+ E  BAL0765
+ E  BAL0766
+ E  BAL0767
+ E  BAL0768
+ E  BAL0769
+ E  BAL0770
+ E  BAL0771
+ E  BAL0772
+ E  BAL0773
+ E  BAL0774
+ E  BAL0775
+ E  BAL0776
+ E  BAL0777
+ E  BAL0778
+ E  BAL0779
+ E  BAL0780
+ E  BAL0781
+ E  BAL0782
+ E  BAL0783
+ E  BAL0784
+ E  BAL0785
+ E  BAL0786
+ E  BAL0801
+ E  BAL0802
+ E  BAL0803
+ E  BAL0804
+ E  BAL0805
+ E  BAL0806
+ E  BAL0807
+ E  BAL0808
+ E  BAL0809
+ E  BAL0810
+ E  BAL0811
+ E  BAL0812
+ E  BAL0813
+ E  BAL0814
+ E  BAL0815
+ E  BAL0816
+ E  BAL0817
+ E  BAL0818
+ E  BAL0819
+ E  BAL0820
+ E  BAL0821
+ E  BAL0822
+ E  BAL0823
+ E  BAL0824
+ E  BAL0825
+ E  BAL0826
+ E  BAL0827
+ E  BAL0828
+ E  BAL0829
+ E  BAL0830
+ E  BAL0831
+ E  BAL0832
+ E  BAL0833
+ E  BAL0834
+ E  BAL0835
+ E  BAL0836
+ E  BAL0837
+ E  BAL0838
+ E  BAL0839
+ E  BAL0840
+ E  BAL0841
+ E  BAL0842
+ E  BAL0843
+ E  BAL0844
+ E  BAL0845
+ E  BAL0846
+ E  BAL0847
+ E  BAL0848
+ E  BAL0849
+ E  BAL0850
+ E  BAL0851
+ E  BAL0852
+ E  BAL0853
+ E  BAL0854
+ E  BAL0855
+ E  BAL0856
+ E  BAL0857
+ E  BAL0858
+ E  BAL0859
+ E  BAL0860
+ E  BAL0861
+ E  BAL0862
+ E  BAL0863
+ E  BAL0864
+ E  BAL0865
+ E  BAL0866
+ E  BAL0867
+ E  BAL0868
+ E  BAL0869
+ E  BAL0870
+ E  BAL0871
+ E  BAL0872
+ E  BAL0873
+ E  BAL0874
+ E  BAL0875
+ E  BAL0876
+ E  BAL0877
+ E  BAL0878
+ E  BAL0879
+ E  BAL0880
+ E  BAL0881
+ E  BAL0882
+ E  BAL0883
+ E  BAL0884
+ E  BAL0885
+ E  BAL0886
+COLUMNS
+    PREG0101  COST             4862.   REGMIN        .0210855
+    PREG0101  REGMAX        .0210855   REGMIN01      .0210855
+    PREG0101  REGMAX01      .0210855   TRAN0101           -1.
+    PREG0101  BAL0101             1.
+    PREG0102  COST             4688.   REGMIN        .0175461
+    PREG0102  REGMAX        .0175461   REGMIN01      .0175461
+    PREG0102  REGMAX01      .0175461   TRAN0201           -1.
+    PREG0102  BAL0201             1.
+    PREG0103  COST             4872.   REGMIN        .0175461
+    PREG0103  REGMAX        .0175461   REGMIN01      .0175461
+    PREG0103  REGMAX01      .0175461   TRAN0301           -1.
+    PREG0103  BAL0301             1.
+    PREG0105  COST             4655.   REGMIN        .0175461
+    PREG0105  REGMAX        .0175461   REGMIN01      .0175461
+    PREG0105  REGMAX01      .0175461   TRAN0501           -1.
+    PREG0105  BAL0501             1.
+    PREG0202  COST             4196.   REGMIN        .0187961
+    PREG0202  REGMAX        .0187961   REGMIN02      .0187961
+    PREG0202  REGMAX02      .0187961   TRAN0202           -1.
+    PREG0202  BAL0202             1.
+    PREG0203  COST             4338.   REGMIN        .0328947
+    PREG0203  REGMAX        .0328947   REGMIN02      .0328947
+    PREG0203  REGMAX02      .0328947   TRAN0302           -1.
+    PREG0203  BAL0302             1.
+    PREG0205  COST             4283.   REGMIN        .0112105
+    PREG0205  REGMAX        .0112105   REGMIN02      .0112105
+    PREG0205  REGMAX02      .0112105   TRAN0502           -1.
+    PREG0205  BAL0502             1.
+    PREG0207  COST             4156.   REGMIN        .0131579
+    PREG0207  REGMAX        .0131579   REGMIN02      .0131579
+    PREG0207  REGMAX02      .0131579   TRAN0702           -1.
+    PREG0207  BAL0702             1.
+    PREG0401  COST             4691.   REGMIN        .0175461
+    PREG0401  REGMAX        .0175461   REGMIN04      .0175461
+    PREG0401  REGMAX04      .0175461   TRAN0104           -1.
+    PREG0401  BAL0104             1.
+    PREG0402  COST             4669.   REGMIN        .0181711
+    PREG0402  REGMAX        .0181711   REGMIN04      .0181711
+    PREG0402  REGMAX04      .0181711   TRAN0204           -1.
+    PREG0402  BAL0204             1.
+    PREG0404  COST             6724.   REGMIN        .0263158
+    PREG0404  REGMAX        .0263158   REGMIN04      .0263158
+    PREG0404  REGMAX04      .0263158   TRAN0404           -1.
+    PREG0404  BAL0404             1.
+    PREG0405  COST             4615.   REGMIN        .0181711
+    PREG0405  REGMAX        .0181711   REGMIN04      .0181711
+    PREG0405  REGMAX04      .0181711   TRAN0504           -1.
+    PREG0405  BAL0504             1.
+    PREG0406  COST             4148.   REGMIN        .0181711
+    PREG0406  REGMAX        .0181711   REGMIN04      .0181711
+    PREG0406  REGMAX04      .0181711   TRAN0604           -1.
+    PREG0406  BAL0604             1.
+    PREG0408  COST             6411.   REGMIN        .0239211
+    PREG0408  REGMAX        .0239211   REGMIN04      .0239211
+    PREG0408  REGMAX04      .0239211   TRAN0804           -1.
+    PREG0408  BAL0804             1.
+    POVR0101  COST             6552.   OVRMIN           3.205
+    POVR0101  OVRMAX           3.205   OVRMIN01         3.205
+    POVR0101  OVRMAX01         3.205   TRAN0101           -1.
+    POVR0101  BAL0101             1.
+    POVR0102  COST             6351.   OVRMIN           2.667
+    POVR0102  OVRMAX           2.667   OVRMIN01         2.667
+    POVR0102  OVRMAX01         2.667   TRAN0201           -1.
+    POVR0102  BAL0201             1.
+    POVR0103  COST             6554.   OVRMIN           2.667
+    POVR0103  OVRMAX           2.667   OVRMIN01         2.667
+    POVR0103  OVRMAX01         2.667   TRAN0301           -1.
+    POVR0103  BAL0301             1.
+    POVR0105  COST             6325.   OVRMIN           2.667
+    POVR0105  OVRMAX           2.667   OVRMIN01         2.667
+    POVR0105  OVRMAX01         2.667   TRAN0501           -1.
+    POVR0105  BAL0501             1.
+    POVR0202  COST             5756.   OVRMIN           2.857
+    POVR0202  OVRMAX           2.857   OVRMIN02         2.857
+    POVR0202  OVRMAX02         2.857   TRAN0202           -1.
+    POVR0202  BAL0202             1.
+    POVR0203  COST             6777.   OVRMIN              5.
+    POVR0203  OVRMAX              5.   OVRMIN02            5.
+    POVR0203  OVRMAX02            5.   TRAN0302           -1.
+    POVR0203  BAL0302             1.
+    POVR0205  COST             5844.   OVRMIN           1.704
+    POVR0205  OVRMAX           1.704   OVRMIN02         1.704
+    POVR0205  OVRMAX02         1.704   TRAN0502           -1.
+    POVR0205  BAL0502             1.
+    POVR0207  COST             5673.   OVRMIN              2.
+    POVR0207  OVRMAX              2.   OVRMIN02            2.
+    POVR0207  OVRMAX02            2.   TRAN0702           -1.
+    POVR0207  BAL0702             1.
+    POVR0401  COST             5794.   OVRMIN           2.667
+    POVR0401  OVRMAX           2.667   OVRMIN04         2.667
+    POVR0401  OVRMAX04         2.667   TRAN0104           -1.
+    POVR0401  BAL0104             1.
+    POVR0402  COST             5787.   OVRMIN           2.762
+    POVR0402  OVRMAX           2.762   OVRMIN04         2.762
+    POVR0402  OVRMAX04         2.762   TRAN0204           -1.
+    POVR0402  BAL0204             1.
+    POVR0404  COST             8111.   OVRMIN              4.
+    POVR0404  OVRMAX              4.   OVRMIN04            4.
+    POVR0404  OVRMAX04            4.   TRAN0404           -1.
+    POVR0404  BAL0404             1.
+    POVR0405  COST             5721.   OVRMIN           2.762
+    POVR0405  OVRMAX           2.762   OVRMIN04         2.762
+    POVR0405  OVRMAX04         2.762   TRAN0504           -1.
+    POVR0405  BAL0504             1.
+    POVR0406  COST             5303.   OVRMIN           2.762
+    POVR0406  OVRMAX           2.762   OVRMIN04         2.762
+    POVR0406  OVRMAX04         2.762   TRAN0604           -1.
+    POVR0406  BAL0604             1.
+    SH010201  COST            323.73   TRAN0102            1.
+    SH010201  BAL0102            -1.   BAL0101             1.
+    SH010301  COST            124.26   TRAN0103            1.
+    SH010301  BAL0103            -1.   BAL0101             1.
+    SH010401  COST            226.72   TRAN0104            1.
+    SH010401  BAL0104            -1.   BAL0101             1.
+    SH010501  COST            258.33   TRAN0105            1.
+    SH010501  BAL0105            -1.   BAL0101             1.
+    SH010601  COST            137.34   TRAN0106            1.
+    SH010601  BAL0152            -1.   BAL0101             1.
+    SH010801  COST            155.87   TRAN0108            1.
+    SH010801  BAL0183            -1.   BAL0101             1.
+    SH010102  COST            516.66   TRAN0101            1.
+    SH010102  BAL0101            -1.   BAL0102             1.
+    SH010302  COST            454.53   TRAN0103            1.
+    SH010302  BAL0103            -1.   BAL0102             1.
+    SH010402  COST            667.08   TRAN0104            1.
+    SH010402  BAL0104            -1.   BAL0102             1.
+    SH010502  COST            807.69   TRAN0105            1.
+    SH010502  BAL0105            -1.   BAL0102             1.
+    SH010602  COST            412.02   TRAN0106            1.
+    SH010602  BAL0152            -1.   BAL0102             1.
+    SH010802  COST            567.89   TRAN0108            1.
+    SH010802  BAL0183            -1.   BAL0102             1.
+    SH010103  COST            267.05   TRAN0101            1.
+    SH010103  BAL0101            -1.   BAL0103             1.
+    SH010203  COST            516.66   TRAN0102            1.
+    SH010203  BAL0102            -1.   BAL0103             1.
+    SH010403  COST            400.03   TRAN0104            1.
+    SH010403  BAL0104            -1.   BAL0103             1.
+    SH010503  COST            309.56   TRAN0105            1.
+    SH010503  BAL0105            -1.   BAL0103             1.
+    SH010603  COST              98.1   TRAN0106            1.
+    SH010603  BAL0152            -1.   BAL0103             1.
+    SH010803  COST            277.95   TRAN0108            1.
+    SH010803  BAL0183            -1.   BAL0103             1.
+    SH010104  COST            189.66   TRAN0101            1.
+    SH010104  BAL0101            -1.   BAL0104             1.
+    SH010204  COST            548.27   TRAN0102            1.
+    SH010204  BAL0102            -1.   BAL0104             1.
+    SH010304  COST            264.87   TRAN0103            1.
+    SH010304  BAL0103            -1.   BAL0104             1.
+    SH010504  COST            347.71   TRAN0105            1.
+    SH010504  BAL0105            -1.   BAL0104             1.
+    SH010604  COST            267.05   TRAN0106            1.
+    SH010604  BAL0152            -1.   BAL0104             1.
+    SH010704  COST            293.21   TRAN0107            1.
+    SH010704  BAL0164            -1.   BAL0104             1.
+    SH010804  COST             63.22   TRAN0108            1.
+    SH010804  BAL0183            -1.   BAL0104             1.
+    SH010105  COST             294.3   TRAN0101            1.
+    SH010105  BAL0101            -1.   BAL0105             1.
+    SH010205  COST            562.44   TRAN0102            1.
+    SH010205  BAL0102            -1.   BAL0105             1.
+    SH010305  COST            309.56   TRAN0103            1.
+    SH010305  BAL0103            -1.   BAL0105             1.
+    SH010405  COST            310.65   TRAN0104            1.
+    SH010405  BAL0104            -1.   BAL0105             1.
+    SH010605  COST            355.34   TRAN0106            1.
+    SH010605  BAL0152            -1.   BAL0105             1.
+    SH010705  COST            364.06   TRAN0107            1.
+    SH010705  BAL0164            -1.   BAL0105             1.
+    SH010805  COST            295.39   TRAN0108            1.
+    SH010805  BAL0183            -1.   BAL0105             1.
+    SH010106  COST            216.91   TRAN0101            1.
+    SH010106  BAL0101            -1.   BAL0106             1.
+    SH010206  COST            454.53   TRAN0102            1.
+    SH010206  BAL0102            -1.   BAL0106             1.
+    SH010306  COST            232.17   TRAN0103            1.
+    SH010306  BAL0103            -1.   BAL0106             1.
+    SH010406  COST            238.71   TRAN0104            1.
+    SH010406  BAL0104            -1.   BAL0106             1.
+    SH010506  COST            274.68   TRAN0105            1.
+    SH010506  BAL0105            -1.   BAL0106             1.
+    SH010606  COST            224.54   TRAN0106            1.
+    SH010606  BAL0152            -1.   BAL0106             1.
+    SH010706  COST              218.   TRAN0107            1.
+    SH010706  BAL0164            -1.   BAL0106             1.
+    SH010806  COST            164.59   TRAN0108            1.
+    SH010806  BAL0183            -1.   BAL0106             1.
+    SH010107  COST             22.89   TRAN0101            1.
+    SH010107  BAL0101            -1.   BAL0107             1.
+    SH010207  COST            318.28   TRAN0102            1.
+    SH010207  BAL0102            -1.   BAL0107             1.
+    SH010307  COST            135.16   TRAN0103            1.
+    SH010307  BAL0103            -1.   BAL0107             1.
+    SH010407  COST            225.63   TRAN0104            1.
+    SH010407  BAL0104            -1.   BAL0107             1.
+    SH010507  COST            249.61   TRAN0105            1.
+    SH010507  BAL0105            -1.   BAL0107             1.
+    SH010607  COST            136.25   TRAN0106            1.
+    SH010607  BAL0152            -1.   BAL0107             1.
+    SH010707  COST            252.88   TRAN0107            1.
+    SH010707  BAL0164            -1.   BAL0107             1.
+    SH010807  COST            168.95   TRAN0108            1.
+    SH010807  BAL0183            -1.   BAL0107             1.
+    SH010108  COST             71.94   TRAN0101            1.
+    SH010108  BAL0101            -1.   BAL0108             1.
+    SH010208  COST            409.84   TRAN0102            1.
+    SH010208  BAL0102            -1.   BAL0108             1.
+    SH010308  COST            153.69   TRAN0103            1.
+    SH010308  BAL0103            -1.   BAL0108             1.
+    SH010408  COST            269.23   TRAN0104            1.
+    SH010408  BAL0104            -1.   BAL0108             1.
+    SH010508  COST            198.38   TRAN0105            1.
+    SH010508  BAL0105            -1.   BAL0108             1.
+    SH010608  COST            180.94   TRAN0106            1.
+    SH010608  BAL0152            -1.   BAL0108             1.
+    SH010808  COST            203.83   TRAN0108            1.
+    SH010808  BAL0183            -1.   BAL0108             1.
+    SH010109  COST            150.42   TRAN0101            1.
+    SH010109  BAL0101            -1.   BAL0109             1.
+    SH010209  COST            417.47   TRAN0102            1.
+    SH010209  BAL0102            -1.   BAL0109             1.
+    SH010309  COST            183.12   TRAN0103            1.
+    SH010309  BAL0103            -1.   BAL0109             1.
+    SH010409  COST            275.77   TRAN0104            1.
+    SH010409  BAL0104            -1.   BAL0109             1.
+    SH010509  COST            260.51   TRAN0105            1.
+    SH010509  BAL0105            -1.   BAL0109             1.
+    SH010709  COST            213.64   TRAN0107            1.
+    SH010709  BAL0164            -1.   BAL0109             1.
+    SH010809  COST            211.46   TRAN0108            1.
+    SH010809  BAL0183            -1.   BAL0109             1.
+    SH010110  COST            269.23   TRAN0101            1.
+    SH010110  BAL0101            -1.   BAL0110             1.
+    SH010210  COST            172.22   TRAN0102            1.
+    SH010210  BAL0102            -1.   BAL0110             1.
+    SH010310  COST             261.6   TRAN0103            1.
+    SH010310  BAL0103            -1.   BAL0110             1.
+    SH010410  COST            391.31   TRAN0104            1.
+    SH010410  BAL0104            -1.   BAL0110             1.
+    SH010510  COST            419.65   TRAN0105            1.
+    SH010510  BAL0105            -1.   BAL0110             1.
+    SH010610  COST            245.25   TRAN0106            1.
+    SH010610  BAL0152            -1.   BAL0110             1.
+    SH010810  COST            332.45   TRAN0108            1.
+    SH010810  BAL0183            -1.   BAL0110             1.
+    SH010111  COST            115.54   TRAN0101            1.
+    SH010111  BAL0101            -1.   BAL0111             1.
+    SH010211  COST            539.55   TRAN0102            1.
+    SH010211  BAL0102            -1.   BAL0111             1.
+    SH010311  COST            270.32   TRAN0103            1.
+    SH010311  BAL0103            -1.   BAL0111             1.
+    SH010411  COST            151.51   TRAN0104            1.
+    SH010411  BAL0104            -1.   BAL0111             1.
+    SH010511  COST            371.69   TRAN0105            1.
+    SH010511  BAL0105            -1.   BAL0111             1.
+    SH010611  COST            213.64   TRAN0106            1.
+    SH010611  BAL0152            -1.   BAL0111             1.
+    SH010811  COST            111.18   TRAN0108            1.
+    SH010811  BAL0183            -1.   BAL0111             1.
+    SH010112  COST             95.92   TRAN0101            1.
+    SH010112  BAL0101            -1.   BAL0112             1.
+    SH010212  COST            369.51   TRAN0102            1.
+    SH010212  BAL0102            -1.   BAL0112             1.
+    SH010312  COST            159.14   TRAN0103            1.
+    SH010312  BAL0103            -1.   BAL0112             1.
+    SH010412  COST              218.   TRAN0104            1.
+    SH010412  BAL0104            -1.   BAL0112             1.
+    SH010512  COST            291.03   TRAN0105            1.
+    SH010512  BAL0105            -1.   BAL0112             1.
+    SH010612  COST            158.05   TRAN0106            1.
+    SH010612  BAL0152            -1.   BAL0112             1.
+    SH010812  COST            159.14   TRAN0108            1.
+    SH010812  BAL0183            -1.   BAL0112             1.
+    SH010114  COST            154.78   TRAN0101            1.
+    SH010114  BAL0101            -1.   BAL0114             1.
+    SH010214  COST            449.08   TRAN0102            1.
+    SH010214  BAL0102            -1.   BAL0114             1.
+    SH010314  COST            213.64   TRAN0103            1.
+    SH010314  BAL0103            -1.   BAL0114             1.
+    SH010414  COST            216.91   TRAN0104            1.
+    SH010414  BAL0104            -1.   BAL0114             1.
+    SH010514  COST            383.68   TRAN0105            1.
+    SH010514  BAL0105            -1.   BAL0114             1.
+    SH010614  COST            204.92   TRAN0106            1.
+    SH010614  BAL0152            -1.   BAL0114             1.
+    SH010814  COST            137.34   TRAN0108            1.
+    SH010814  BAL0183            -1.   BAL0114             1.
+    SH010115  COST            330.27   TRAN0101            1.
+    SH010115  BAL0101            -1.   BAL0115             1.
+    SH010215  COST            173.31   TRAN0102            1.
+    SH010215  BAL0102            -1.   BAL0115             1.
+    SH010315  COST            255.06   TRAN0103            1.
+    SH010315  BAL0103            -1.   BAL0115             1.
+    SH010415  COST            518.84   TRAN0104            1.
+    SH010415  BAL0104            -1.   BAL0115             1.
+    SH010515  COST            433.82   TRAN0105            1.
+    SH010515  BAL0105            -1.   BAL0115             1.
+    SH010615  COST            204.92   TRAN0106            1.
+    SH010615  BAL0152            -1.   BAL0115             1.
+    SH010815  COST            406.57   TRAN0108            1.
+    SH010815  BAL0183            -1.   BAL0115             1.
+    SH010116  COST            172.22   TRAN0101            1.
+    SH010116  BAL0101            -1.   BAL0116             1.
+    SH010216  COST             305.2   TRAN0102            1.
+    SH010216  BAL0102            -1.   BAL0116             1.
+    SH010316  COST            247.43   TRAN0103            1.
+    SH010316  BAL0103            -1.   BAL0116             1.
+    SH010416  COST            312.83   TRAN0104            1.
+    SH010416  BAL0104            -1.   BAL0116             1.
+    SH010516  COST            347.71   TRAN0105            1.
+    SH010516  BAL0105            -1.   BAL0116             1.
+    SH010616  COST            142.79   TRAN0106            1.
+    SH010616  BAL0152            -1.   BAL0116             1.
+    SH010816  COST            223.45   TRAN0108            1.
+    SH010816  BAL0183            -1.   BAL0116             1.
+    SH010117  COST            164.59   TRAN0101            1.
+    SH010117  BAL0101            -1.   BAL0117             1.
+    SH010217  COST            550.45   TRAN0102            1.
+    SH010217  BAL0102            -1.   BAL0117             1.
+    SH010317  COST            298.66   TRAN0103            1.
+    SH010317  BAL0103            -1.   BAL0117             1.
+    SH010417  COST             62.13   TRAN0104            1.
+    SH010417  BAL0104            -1.   BAL0117             1.
+    SH010517  COST            324.82   TRAN0105            1.
+    SH010517  BAL0105            -1.   BAL0117             1.
+    SH010717  COST            321.55   TRAN0107            1.
+    SH010717  BAL0164            -1.   BAL0117             1.
+    SH010817  COST             29.43   TRAN0108            1.
+    SH010817  BAL0183            -1.   BAL0117             1.
+    SH010118  COST            190.75   TRAN0101            1.
+    SH010118  BAL0101            -1.   BAL0118             1.
+    SH010218  COST            393.49   TRAN0102            1.
+    SH010218  BAL0102            -1.   BAL0118             1.
+    SH010318  COST             294.3   TRAN0103            1.
+    SH010318  BAL0103            -1.   BAL0118             1.
+    SH010418  COST            167.86   TRAN0104            1.
+    SH010418  BAL0104            -1.   BAL0118             1.
+    SH010518  COST            443.63   TRAN0105            1.
+    SH010518  BAL0105            -1.   BAL0118             1.
+    SH010618  COST            383.68   TRAN0106            1.
+    SH010618  BAL0152            -1.   BAL0118             1.
+    SH010818  COST            112.27   TRAN0108            1.
+    SH010818  BAL0183            -1.   BAL0118             1.
+    SH010119  COST            270.32   TRAN0101            1.
+    SH010119  BAL0101            -1.   BAL0119             1.
+    SH010219  COST            748.83   TRAN0102            1.
+    SH010219  BAL0102            -1.   BAL0119             1.
+    SH010319  COST            345.53   TRAN0103            1.
+    SH010319  BAL0103            -1.   BAL0119             1.
+    SH010419  COST            173.31   TRAN0104            1.
+    SH010419  BAL0104            -1.   BAL0119             1.
+    SH010519  COST            226.72   TRAN0105            1.
+    SH010519  BAL0105            -1.   BAL0119             1.
+    SH010619  COST            376.05   TRAN0106            1.
+    SH010619  BAL0152            -1.   BAL0119             1.
+    SH010819  COST            107.91   TRAN0108            1.
+    SH010819  BAL0183            -1.   BAL0119             1.
+    SH010120  COST            223.45   TRAN0101            1.
+    SH010120  BAL0101            -1.   BAL0120             1.
+    SH010220  COST            744.47   TRAN0102            1.
+    SH010220  BAL0102            -1.   BAL0120             1.
+    SH010320  COST            323.73   TRAN0103            1.
+    SH010320  BAL0103            -1.   BAL0120             1.
+    SH010420  COST            123.17   TRAN0104            1.
+    SH010420  BAL0104            -1.   BAL0120             1.
+    SH010520  COST            317.19   TRAN0105            1.
+    SH010520  BAL0105            -1.   BAL0120             1.
+    SH010820  COST            137.34   TRAN0108            1.
+    SH010820  BAL0183            -1.   BAL0120             1.
+    SH010121  COST            439.27   TRAN0101            1.
+    SH010121  BAL0101            -1.   BAL0121             1.
+    SH010221  COST            401.12   TRAN0102            1.
+    SH010221  BAL0102            -1.   BAL0121             1.
+    SH010321  COST            486.14   TRAN0103            1.
+    SH010321  BAL0103            -1.   BAL0121             1.
+    SH010421  COST             348.8   TRAN0104            1.
+    SH010421  BAL0104            -1.   BAL0121             1.
+    SH010521  COST             599.5   TRAN0105            1.
+    SH010521  BAL0105            -1.   BAL0121             1.
+    SH010821  COST             348.8   TRAN0108            1.
+    SH010821  BAL0183            -1.   BAL0121             1.
+    SH010122  COST            270.32   TRAN0101            1.
+    SH010122  BAL0101            -1.   BAL0122             1.
+    SH010222  COST            630.02   TRAN0102            1.
+    SH010222  BAL0102            -1.   BAL0122             1.
+    SH010322  COST            325.91   TRAN0103            1.
+    SH010322  BAL0103            -1.   BAL0122             1.
+    SH010422  COST            244.16   TRAN0104            1.
+    SH010422  BAL0104            -1.   BAL0122             1.
+    SH010522  COST            195.11   TRAN0105            1.
+    SH010522  BAL0105            -1.   BAL0122             1.
+    SH010622  COST             337.9   TRAN0106            1.
+    SH010622  BAL0152            -1.   BAL0122             1.
+    SH010822  COST            151.51   TRAN0108            1.
+    SH010822  BAL0183            -1.   BAL0122             1.
+    SH010123  COST            255.06   TRAN0101            1.
+    SH010123  BAL0101            -1.   BAL0123             1.
+    SH010223  COST            589.69   TRAN0102            1.
+    SH010223  BAL0102            -1.   BAL0123             1.
+    SH010323  COST            312.83   TRAN0103            1.
+    SH010323  BAL0103            -1.   BAL0123             1.
+    SH010423  COST            182.03   TRAN0104            1.
+    SH010423  BAL0104            -1.   BAL0123             1.
+    SH010523  COST            180.94   TRAN0105            1.
+    SH010523  BAL0105            -1.   BAL0123             1.
+    SH010823  COST            151.51   TRAN0108            1.
+    SH010823  BAL0183            -1.   BAL0123             1.
+    SH010124  COST           1565.24   TRAN0101            1.
+    SH010124  BAL0101            -1.   BAL0124             1.
+    SH010125  COST            421.83   TRAN0101            1.
+    SH010125  BAL0101            -1.   BAL0125             1.
+    SH010225  COST            465.43   TRAN0102            1.
+    SH010225  BAL0102            -1.   BAL0125             1.
+    SH010325  COST            556.99   TRAN0103            1.
+    SH010325  BAL0103            -1.   BAL0125             1.
+    SH010425  COST            379.32   TRAN0104            1.
+    SH010425  BAL0104            -1.   BAL0125             1.
+    SH010525  COST            616.94   TRAN0105            1.
+    SH010525  BAL0105            -1.   BAL0125             1.
+    SH010625  COST            439.27   TRAN0106            1.
+    SH010625  BAL0152            -1.   BAL0125             1.
+    SH010825  COST            332.45   TRAN0108            1.
+    SH010825  BAL0183            -1.   BAL0125             1.
+    SH010426  COST             294.3   TRAN0104            1.
+    SH010426  BAL0104            -1.   BAL0126             1.
+    SH010127  COST            255.06   TRAN0101            1.
+    SH010127  BAL0101            -1.   BAL0127             1.
+    SH010227  COST            309.56   TRAN0102            1.
+    SH010227  BAL0102            -1.   BAL0127             1.
+    SH010327  COST            315.01   TRAN0103            1.
+    SH010327  BAL0103            -1.   BAL0127             1.
+    SH010427  COST            365.15   TRAN0104            1.
+    SH010427  BAL0104            -1.   BAL0127             1.
+    SH010527  COST            412.02   TRAN0105            1.
+    SH010527  BAL0105            -1.   BAL0127             1.
+    SH010627  COST            292.12   TRAN0106            1.
+    SH010627  BAL0152            -1.   BAL0127             1.
+    SH010827  COST            274.68   TRAN0108            1.
+    SH010827  BAL0183            -1.   BAL0127             1.
+    SH010128  COST            264.87   TRAN0101            1.
+    SH010128  BAL0101            -1.   BAL0128             1.
+    SH010228  COST            620.21   TRAN0102            1.
+    SH010228  BAL0102            -1.   BAL0128             1.
+    SH010328  COST            322.64   TRAN0103            1.
+    SH010328  BAL0103            -1.   BAL0128             1.
+    SH010428  COST            321.55   TRAN0104            1.
+    SH010428  BAL0104            -1.   BAL0128             1.
+    SH010528  COST            111.18   TRAN0105            1.
+    SH010528  BAL0105            -1.   BAL0128             1.
+    SH010628  COST            284.49   TRAN0106            1.
+    SH010628  BAL0152            -1.   BAL0128             1.
+    SH010728  COST            116.63   TRAN0107            1.
+    SH010728  BAL0164            -1.   BAL0128             1.
+    SH010828  COST            276.86   TRAN0108            1.
+    SH010828  BAL0183            -1.   BAL0128             1.
+    SH010129  COST            243.07   TRAN0101            1.
+    SH010129  BAL0101            -1.   BAL0129             1.
+    SH010229  COST            505.76   TRAN0102            1.
+    SH010229  BAL0102            -1.   BAL0129             1.
+    SH010329  COST            262.69   TRAN0103            1.
+    SH010329  BAL0103            -1.   BAL0129             1.
+    SH010429  COST            216.91   TRAN0104            1.
+    SH010429  BAL0104            -1.   BAL0129             1.
+    SH010529  COST             468.7   TRAN0105            1.
+    SH010529  BAL0105            -1.   BAL0129             1.
+    SH010629  COST            284.49   TRAN0106            1.
+    SH010629  BAL0152            -1.   BAL0129             1.
+    SH010829  COST            156.96   TRAN0108            1.
+    SH010829  BAL0183            -1.   BAL0129             1.
+    SH010130  COST            507.94   TRAN0101            1.
+    SH010130  BAL0101            -1.   BAL0130             1.
+    SH010230  COST            475.24   TRAN0102            1.
+    SH010230  BAL0102            -1.   BAL0130             1.
+    SH010330  COST            570.07   TRAN0103            1.
+    SH010330  BAL0103            -1.   BAL0130             1.
+    SH010430  COST            331.36   TRAN0104            1.
+    SH010430  BAL0104            -1.   BAL0130             1.
+    SH010530  COST            486.14   TRAN0105            1.
+    SH010530  BAL0105            -1.   BAL0130             1.
+    SH010830  COST            416.38   TRAN0108            1.
+    SH010830  BAL0183            -1.   BAL0130             1.
+    SH010131  COST            120.99   TRAN0101            1.
+    SH010131  BAL0101            -1.   BAL0131             1.
+    SH010231  COST            382.59   TRAN0102            1.
+    SH010231  BAL0102            -1.   BAL0131             1.
+    SH010331  COST             119.9   TRAN0103            1.
+    SH010331  BAL0103            -1.   BAL0131             1.
+    SH010431  COST            275.77   TRAN0104            1.
+    SH010431  BAL0104            -1.   BAL0131             1.
+    SH010531  COST            334.63   TRAN0105            1.
+    SH010531  BAL0105            -1.   BAL0131             1.
+    SH010631  COST            122.08   TRAN0106            1.
+    SH010631  BAL0152            -1.   BAL0131             1.
+    SH010831  COST            243.07   TRAN0108            1.
+    SH010831  BAL0183            -1.   BAL0131             1.
+    SH010132  COST            325.91   TRAN0101            1.
+    SH010132  BAL0101            -1.   BAL0132             1.
+    SH010232  COST            521.02   TRAN0102            1.
+    SH010232  BAL0102            -1.   BAL0132             1.
+    SH010332  COST            461.07   TRAN0103            1.
+    SH010332  BAL0103            -1.   BAL0132             1.
+    SH010432  COST            171.13   TRAN0104            1.
+    SH010432  BAL0104            -1.   BAL0132             1.
+    SH010532  COST            427.28   TRAN0105            1.
+    SH010532  BAL0105            -1.   BAL0132             1.
+    SH010832  COST             196.2   TRAN0108            1.
+    SH010832  BAL0183            -1.   BAL0132             1.
+    SH010133  COST            537.37   TRAN0101            1.
+    SH010133  BAL0101            -1.   BAL0133             1.
+    SH010233  COST              436.   TRAN0102            1.
+    SH010233  BAL0102            -1.   BAL0133             1.
+    SH010333  COST            591.87   TRAN0103            1.
+    SH010333  BAL0103            -1.   BAL0133             1.
+    SH010433  COST            485.05   TRAN0104            1.
+    SH010433  BAL0104            -1.   BAL0133             1.
+    SH010533  COST            687.79   TRAN0105            1.
+    SH010533  BAL0105            -1.   BAL0133             1.
+    SH010833  COST            415.29   TRAN0108            1.
+    SH010833  BAL0183            -1.   BAL0133             1.
+    SH010134  COST            420.74   TRAN0101            1.
+    SH010134  BAL0101            -1.   BAL0134             1.
+    SH010234  COST            713.95   TRAN0102            1.
+    SH010234  BAL0102            -1.   BAL0134             1.
+    SH010334  COST            548.27   TRAN0103            1.
+    SH010334  BAL0103            -1.   BAL0134             1.
+    SH010434  COST            229.99   TRAN0104            1.
+    SH010434  BAL0104            -1.   BAL0134             1.
+    SH010534  COST            480.69   TRAN0105            1.
+    SH010534  BAL0105            -1.   BAL0134             1.
+    SH010834  COST            286.67   TRAN0108            1.
+    SH010834  BAL0183            -1.   BAL0134             1.
+    SH010135  COST            502.49   TRAN0101            1.
+    SH010135  BAL0101            -1.   BAL0135             1.
+    SH010235  COST            485.05   TRAN0102            1.
+    SH010235  BAL0102            -1.   BAL0135             1.
+    SH010335  COST            410.93   TRAN0103            1.
+    SH010335  BAL0103            -1.   BAL0135             1.
+    SH010435  COST            132.98   TRAN0104            1.
+    SH010435  BAL0104            -1.   BAL0135             1.
+    SH010535  COST            469.79   TRAN0105            1.
+    SH010535  BAL0105            -1.   BAL0135             1.
+    SH010835  COST            256.15   TRAN0108            1.
+    SH010835  BAL0183            -1.   BAL0135             1.
+    SH010136  COST            223.45   TRAN0101            1.
+    SH010136  BAL0101            -1.   BAL0136             1.
+    SH010236  COST            488.32   TRAN0102            1.
+    SH010236  BAL0102            -1.   BAL0136             1.
+    SH010336  COST            115.54   TRAN0103            1.
+    SH010336  BAL0103            -1.   BAL0136             1.
+    SH010436  COST             403.3   TRAN0104            1.
+    SH010436  BAL0104            -1.   BAL0136             1.
+    SH010536  COST            377.14   TRAN0105            1.
+    SH010536  BAL0105            -1.   BAL0136             1.
+    SH010636  COST             119.9   TRAN0106            1.
+    SH010636  BAL0152            -1.   BAL0136             1.
+    SH010836  COST            349.89   TRAN0108            1.
+    SH010836  BAL0183            -1.   BAL0136             1.
+    SH010137  COST            100.28   TRAN0101            1.
+    SH010137  BAL0101            -1.   BAL0137             1.
+    SH010237  COST            372.78   TRAN0102            1.
+    SH010237  BAL0102            -1.   BAL0137             1.
+    SH010337  COST            172.22   TRAN0103            1.
+    SH010337  BAL0103            -1.   BAL0137             1.
+    SH010437  COST            331.36   TRAN0104            1.
+    SH010437  BAL0104            -1.   BAL0137             1.
+    SH010537  COST            198.38   TRAN0105            1.
+    SH010537  BAL0105            -1.   BAL0137             1.
+    SH010637  COST            211.46   TRAN0106            1.
+    SH010637  BAL0152            -1.   BAL0137             1.
+    SH010837  COST            274.68   TRAN0108            1.
+    SH010837  BAL0183            -1.   BAL0137             1.
+    SH010138  COST            148.24   TRAN0101            1.
+    SH010138  BAL0101            -1.   BAL0138             1.
+    SH010238  COST            265.96   TRAN0102            1.
+    SH010238  BAL0102            -1.   BAL0138             1.
+    SH010338  COST            103.55   TRAN0103            1.
+    SH010338  BAL0103            -1.   BAL0138             1.
+    SH010438  COST            335.72   TRAN0104            1.
+    SH010438  BAL0104            -1.   BAL0138             1.
+    SH010538  COST            303.02   TRAN0105            1.
+    SH010538  BAL0105            -1.   BAL0138             1.
+    SH010638  COST             42.51   TRAN0106            1.
+    SH010638  BAL0152            -1.   BAL0138             1.
+    SH010738  COST            235.44   TRAN0107            1.
+    SH010738  BAL0164            -1.   BAL0138             1.
+    SH010838  COST            258.33   TRAN0108            1.
+    SH010838  BAL0183            -1.   BAL0138             1.
+    SH010139  COST             141.7   TRAN0101            1.
+    SH010139  BAL0101            -1.   BAL0139             1.
+    SH010239  COST            369.51   TRAN0102            1.
+    SH010239  BAL0102            -1.   BAL0139             1.
+    SH010339  COST             174.4   TRAN0103            1.
+    SH010339  BAL0103            -1.   BAL0139             1.
+    SH010439  COST            271.41   TRAN0104            1.
+    SH010439  BAL0104            -1.   BAL0139             1.
+    SH010539  COST            467.61   TRAN0105            1.
+    SH010539  BAL0105            -1.   BAL0139             1.
+    SH010639  COST            222.36   TRAN0106            1.
+    SH010639  BAL0152            -1.   BAL0139             1.
+    SH010839  COST            183.12   TRAN0108            1.
+    SH010839  BAL0183            -1.   BAL0139             1.
+    SH010140  COST            179.85   TRAN0101            1.
+    SH010140  BAL0101            -1.   BAL0140             1.
+    SH010240  COST            412.02   TRAN0102            1.
+    SH010240  BAL0102            -1.   BAL0140             1.
+    SH010340  COST            112.27   TRAN0103            1.
+    SH010340  BAL0103            -1.   BAL0140             1.
+    SH010440  COST            323.73   TRAN0104            1.
+    SH010440  BAL0104            -1.   BAL0140             1.
+    SH010540  COST            240.89   TRAN0105            1.
+    SH010540  BAL0105            -1.   BAL0140             1.
+    SH010640  COST            142.79   TRAN0106            1.
+    SH010640  BAL0152            -1.   BAL0140             1.
+    SH010840  COST            298.66   TRAN0108            1.
+    SH010840  BAL0183            -1.   BAL0140             1.
+    SH010141  COST            213.64   TRAN0101            1.
+    SH010141  BAL0101            -1.   BAL0141             1.
+    SH010241  COST              327.   TRAN0102            1.
+    SH010241  BAL0102            -1.   BAL0141             1.
+    SH010341  COST             163.5   TRAN0103            1.
+    SH010341  BAL0103            -1.   BAL0141             1.
+    SH010441  COST            353.16   TRAN0104            1.
+    SH010441  BAL0104            -1.   BAL0141             1.
+    SH010541  COST            401.12   TRAN0105            1.
+    SH010541  BAL0105            -1.   BAL0141             1.
+    SH010641  COST              109.   TRAN0106            1.
+    SH010641  BAL0152            -1.   BAL0141             1.
+    SH010841  COST            325.91   TRAN0108            1.
+    SH010841  BAL0183            -1.   BAL0141             1.
+    SH010142  COST              98.1   TRAN0101            1.
+    SH010142  BAL0101            -1.   BAL0142             1.
+    SH010242  COST            451.26   TRAN0102            1.
+    SH010242  BAL0102            -1.   BAL0142             1.
+    SH010342  COST             174.4   TRAN0103            1.
+    SH010342  BAL0103            -1.   BAL0142             1.
+    SH010442  COST            212.55   TRAN0104            1.
+    SH010442  BAL0104            -1.   BAL0142             1.
+    SH010542  COST            393.49   TRAN0105            1.
+    SH010542  BAL0105            -1.   BAL0142             1.
+    SH010642  COST            175.49   TRAN0106            1.
+    SH010642  BAL0152            -1.   BAL0142             1.
+    SH010842  COST            165.68   TRAN0108            1.
+    SH010842  BAL0183            -1.   BAL0142             1.
+    SH010143  COST            173.31   TRAN0101            1.
+    SH010143  BAL0101            -1.   BAL0143             1.
+    SH010243  COST            430.55   TRAN0102            1.
+    SH010243  BAL0102            -1.   BAL0143             1.
+    SH010343  COST             27.25   TRAN0103            1.
+    SH010343  BAL0103            -1.   BAL0143             1.
+    SH010443  COST            322.64   TRAN0104            1.
+    SH010443  BAL0104            -1.   BAL0143             1.
+    SH010543  COST            281.22   TRAN0105            1.
+    SH010543  BAL0105            -1.   BAL0143             1.
+    SH010643  COST              109.   TRAN0106            1.
+    SH010643  BAL0152            -1.   BAL0143             1.
+    SH010743  COST            262.69   TRAN0107            1.
+    SH010743  BAL0164            -1.   BAL0143             1.
+    SH010843  COST            295.39   TRAN0108            1.
+    SH010843  BAL0183            -1.   BAL0143             1.
+    SH010144  COST            173.31   TRAN0101            1.
+    SH010144  BAL0101            -1.   BAL0144             1.
+    SH010244  COST            413.11   TRAN0102            1.
+    SH010244  BAL0102            -1.   BAL0144             1.
+    SH010344  COST            139.52   TRAN0103            1.
+    SH010344  BAL0103            -1.   BAL0144             1.
+    SH010444  COST            340.08   TRAN0104            1.
+    SH010444  BAL0104            -1.   BAL0144             1.
+    SH010544  COST             337.9   TRAN0105            1.
+    SH010544  BAL0105            -1.   BAL0144             1.
+    SH010644  COST             97.01   TRAN0106            1.
+    SH010644  BAL0152            -1.   BAL0144             1.
+    SH010844  COST            324.82   TRAN0108            1.
+    SH010844  BAL0183            -1.   BAL0144             1.
+    SH010145  COST            187.48   TRAN0101            1.
+    SH010145  BAL0101            -1.   BAL0145             1.
+    SH010245  COST            475.24   TRAN0102            1.
+    SH010245  BAL0102            -1.   BAL0145             1.
+    SH010345  COST            175.49   TRAN0103            1.
+    SH010345  BAL0103            -1.   BAL0145             1.
+    SH010445  COST            318.28   TRAN0104            1.
+    SH010445  BAL0104            -1.   BAL0145             1.
+    SH010545  COST            255.06   TRAN0105            1.
+    SH010545  BAL0105            -1.   BAL0145             1.
+    SH010645  COST            208.19   TRAN0106            1.
+    SH010645  BAL0152            -1.   BAL0145             1.
+    SH010745  COST            214.73   TRAN0107            1.
+    SH010745  BAL0164            -1.   BAL0145             1.
+    SH010845  COST            332.45   TRAN0108            1.
+    SH010845  BAL0183            -1.   BAL0145             1.
+    SH010146  COST            267.05   TRAN0101            1.
+    SH010146  BAL0101            -1.   BAL0146             1.
+    SH010246  COST            297.57   TRAN0102            1.
+    SH010246  BAL0102            -1.   BAL0146             1.
+    SH010346  COST            240.89   TRAN0103            1.
+    SH010346  BAL0103            -1.   BAL0146             1.
+    SH010446  COST            487.23   TRAN0104            1.
+    SH010446  BAL0104            -1.   BAL0146             1.
+    SH010546  COST             468.7   TRAN0105            1.
+    SH010546  BAL0105            -1.   BAL0146             1.
+    SH010646  COST            280.13   TRAN0106            1.
+    SH010646  BAL0152            -1.   BAL0146             1.
+    SH010846  COST            488.32   TRAN0108            1.
+    SH010846  BAL0183            -1.   BAL0146             1.
+    SH010147  COST             119.9   TRAN0101            1.
+    SH010147  BAL0101            -1.   BAL0147             1.
+    SH010247  COST            406.57   TRAN0102            1.
+    SH010247  BAL0102            -1.   BAL0147             1.
+    SH010347  COST            173.31   TRAN0103            1.
+    SH010347  BAL0103            -1.   BAL0147             1.
+    SH010447  COST            298.66   TRAN0104            1.
+    SH010447  BAL0104            -1.   BAL0147             1.
+    SH010547  COST            253.97   TRAN0105            1.
+    SH010547  BAL0105            -1.   BAL0147             1.
+    SH010647  COST            158.05   TRAN0106            1.
+    SH010647  BAL0152            -1.   BAL0147             1.
+    SH010847  COST            265.96   TRAN0108            1.
+    SH010847  BAL0183            -1.   BAL0147             1.
+    SH010148  COST            103.55   TRAN0101            1.
+    SH010148  BAL0101            -1.   BAL0148             1.
+    SH010248  COST            369.51   TRAN0102            1.
+    SH010248  BAL0102            -1.   BAL0148             1.
+    SH010348  COST            149.33   TRAN0103            1.
+    SH010348  BAL0103            -1.   BAL0148             1.
+    SH010448  COST             250.7   TRAN0104            1.
+    SH010448  BAL0104            -1.   BAL0148             1.
+    SH010548  COST            269.23   TRAN0105            1.
+    SH010548  BAL0105            -1.   BAL0148             1.
+    SH010648  COST            125.35   TRAN0106            1.
+    SH010648  BAL0152            -1.   BAL0148             1.
+    SH010848  COST            212.55   TRAN0108            1.
+    SH010848  BAL0183            -1.   BAL0148             1.
+    SH010149  COST            358.61   TRAN0101            1.
+    SH010149  BAL0101            -1.   BAL0149             1.
+    SH010249  COST            583.15   TRAN0102            1.
+    SH010249  BAL0102            -1.   BAL0149             1.
+    SH010349  COST            361.88   TRAN0103            1.
+    SH010349  BAL0103            -1.   BAL0149             1.
+    SH010449  COST            415.29   TRAN0104            1.
+    SH010449  BAL0104            -1.   BAL0149             1.
+    SH010549  COST            165.68   TRAN0105            1.
+    SH010549  BAL0105            -1.   BAL0149             1.
+    SH010649  COST            368.42   TRAN0106            1.
+    SH010649  BAL0152            -1.   BAL0149             1.
+    SH010749  COST            146.06   TRAN0107            1.
+    SH010749  BAL0164            -1.   BAL0149             1.
+    SH010849  COST            444.72   TRAN0108            1.
+    SH010849  BAL0183            -1.   BAL0149             1.
+    SH010150  COST            262.69   TRAN0101            1.
+    SH010150  BAL0101            -1.   BAL0150             1.
+    SH010250  COST            667.08   TRAN0102            1.
+    SH010250  BAL0102            -1.   BAL0150             1.
+    SH010350  COST            268.14   TRAN0103            1.
+    SH010350  BAL0103            -1.   BAL0150             1.
+    SH010450  COST            397.85   TRAN0104            1.
+    SH010450  BAL0104            -1.   BAL0150             1.
+    SH010550  COST            256.15   TRAN0105            1.
+    SH010550  BAL0105            -1.   BAL0150             1.
+    SH010750  COST            149.33   TRAN0107            1.
+    SH010750  BAL0164            -1.   BAL0150             1.
+    SH010850  COST            442.54   TRAN0108            1.
+    SH010850  BAL0183            -1.   BAL0150             1.
+    SH010151  COST            361.88   TRAN0101            1.
+    SH010151  BAL0101            -1.   BAL0151             1.
+    SH010251  COST             599.5   TRAN0102            1.
+    SH010251  BAL0102            -1.   BAL0151             1.
+    SH010351  COST            371.69   TRAN0103            1.
+    SH010351  BAL0103            -1.   BAL0151             1.
+    SH010451  COST            368.42   TRAN0104            1.
+    SH010451  BAL0104            -1.   BAL0151             1.
+    SH010551  COST            134.07   TRAN0105            1.
+    SH010551  BAL0105            -1.   BAL0151             1.
+    SH010751  COST            107.91   TRAN0107            1.
+    SH010751  BAL0164            -1.   BAL0151             1.
+    SH010851  COST            466.52   TRAN0108            1.
+    SH010851  BAL0183            -1.   BAL0151             1.
+    SH010152  COST            122.08   TRAN0101            1.
+    SH010152  BAL0101            -1.   BAL0152             1.
+    SH010252  COST              327.   TRAN0102            1.
+    SH010252  BAL0102            -1.   BAL0152             1.
+    SH010352  COST             89.38   TRAN0103            1.
+    SH010352  BAL0103            -1.   BAL0152             1.
+    SH010452  COST            350.98   TRAN0104            1.
+    SH010452  BAL0104            -1.   BAL0152             1.
+    SH010552  COST            321.55   TRAN0105            1.
+    SH010552  BAL0105            -1.   BAL0152             1.
+    SH010852  COST            275.77   TRAN0108            1.
+    SH010852  BAL0183            -1.   BAL0152             1.
+    SH010153  COST            391.31   TRAN0101            1.
+    SH010153  BAL0101            -1.   BAL0153             1.
+    SH010253  COST            693.24   TRAN0102            1.
+    SH010253  BAL0102            -1.   BAL0153             1.
+    SH010353  COST            354.25   TRAN0103            1.
+    SH010353  BAL0103            -1.   BAL0153             1.
+    SH010453  COST            449.08   TRAN0104            1.
+    SH010453  BAL0104            -1.   BAL0153             1.
+    SH010553  COST            200.56   TRAN0105            1.
+    SH010553  BAL0105            -1.   BAL0153             1.
+    SH010653  COST            391.31   TRAN0106            1.
+    SH010653  BAL0152            -1.   BAL0153             1.
+    SH010753  COST            159.14   TRAN0107            1.
+    SH010753  BAL0164            -1.   BAL0153             1.
+    SH010853  COST            439.27   TRAN0108            1.
+    SH010853  BAL0183            -1.   BAL0153             1.
+    SH010154  COST            201.65   TRAN0101            1.
+    SH010154  BAL0101            -1.   BAL0154             1.
+    SH010254  COST            485.05   TRAN0102            1.
+    SH010254  BAL0102            -1.   BAL0154             1.
+    SH010354  COST            236.53   TRAN0103            1.
+    SH010354  BAL0103            -1.   BAL0154             1.
+    SH010454  COST            373.87   TRAN0104            1.
+    SH010454  BAL0104            -1.   BAL0154             1.
+    SH010554  COST            232.17   TRAN0105            1.
+    SH010554  BAL0105            -1.   BAL0154             1.
+    SH010654  COST            221.27   TRAN0106            1.
+    SH010654  BAL0152            -1.   BAL0154             1.
+    SH010854  COST            438.18   TRAN0108            1.
+    SH010854  BAL0183            -1.   BAL0154             1.
+    SH010155  COST            303.02   TRAN0101            1.
+    SH010155  BAL0101            -1.   BAL0155             1.
+    SH010255  COST            522.11   TRAN0102            1.
+    SH010255  BAL0102            -1.   BAL0155             1.
+    SH010355  COST            306.29   TRAN0103            1.
+    SH010355  BAL0103            -1.   BAL0155             1.
+    SH010455  COST            320.46   TRAN0104            1.
+    SH010455  BAL0104            -1.   BAL0155             1.
+    SH010555  COST            167.86   TRAN0105            1.
+    SH010555  BAL0105            -1.   BAL0155             1.
+    SH010655  COST             316.1   TRAN0106            1.
+    SH010655  BAL0152            -1.   BAL0155             1.
+    SH010755  COST            116.63   TRAN0107            1.
+    SH010755  BAL0164            -1.   BAL0155             1.
+    SH010855  COST            320.46   TRAN0108            1.
+    SH010855  BAL0183            -1.   BAL0155             1.
+    SH010156  COST             425.1   TRAN0101            1.
+    SH010156  BAL0101            -1.   BAL0156             1.
+    SH010256  COST            631.11   TRAN0102            1.
+    SH010256  BAL0102            -1.   BAL0156             1.
+    SH010356  COST            332.45   TRAN0103            1.
+    SH010356  BAL0103            -1.   BAL0156             1.
+    SH010456  COST            397.85   TRAN0104            1.
+    SH010456  BAL0104            -1.   BAL0156             1.
+    SH010556  COST            148.24   TRAN0105            1.
+    SH010556  BAL0105            -1.   BAL0156             1.
+    SH010656  COST            369.51   TRAN0106            1.
+    SH010656  BAL0152            -1.   BAL0156             1.
+    SH010756  COST            132.98   TRAN0107            1.
+    SH010756  BAL0164            -1.   BAL0156             1.
+    SH010856  COST            389.13   TRAN0108            1.
+    SH010856  BAL0183            -1.   BAL0156             1.
+    SH010157  COST            284.49   TRAN0101            1.
+    SH010157  BAL0101            -1.   BAL0157             1.
+    SH010257  COST             566.8   TRAN0102            1.
+    SH010257  BAL0102            -1.   BAL0157             1.
+    SH010357  COST             316.1   TRAN0103            1.
+    SH010357  BAL0103            -1.   BAL0157             1.
+    SH010457  COST            255.06   TRAN0104            1.
+    SH010457  BAL0104            -1.   BAL0157             1.
+    SH010557  COST            183.12   TRAN0105            1.
+    SH010557  BAL0105            -1.   BAL0157             1.
+    SH010657  COST            347.71   TRAN0106            1.
+    SH010657  BAL0152            -1.   BAL0157             1.
+    SH010757  COST            161.32   TRAN0107            1.
+    SH010757  BAL0164            -1.   BAL0157             1.
+    SH010857  COST            251.79   TRAN0108            1.
+    SH010857  BAL0183            -1.   BAL0157             1.
+    SH010158  COST            320.46   TRAN0101            1.
+    SH010158  BAL0101            -1.   BAL0158             1.
+    SH010258  COST            567.89   TRAN0102            1.
+    SH010258  BAL0102            -1.   BAL0158             1.
+    SH010358  COST            303.02   TRAN0103            1.
+    SH010358  BAL0103            -1.   BAL0158             1.
+    SH010458  COST            373.87   TRAN0104            1.
+    SH010458  BAL0104            -1.   BAL0158             1.
+    SH010558  COST             22.89   TRAN0105            1.
+    SH010558  BAL0105            -1.   BAL0158             1.
+    SH010658  COST            355.34   TRAN0106            1.
+    SH010658  BAL0152            -1.   BAL0158             1.
+    SH010758  COST             74.12   TRAN0107            1.
+    SH010758  BAL0164            -1.   BAL0158             1.
+    SH010858  COST            276.86   TRAN0108            1.
+    SH010858  BAL0183            -1.   BAL0158             1.
+    SH010159  COST            224.54   TRAN0101            1.
+    SH010159  BAL0101            -1.   BAL0159             1.
+    SH010259  COST            542.82   TRAN0102            1.
+    SH010259  BAL0102            -1.   BAL0159             1.
+    SH010359  COST            259.42   TRAN0103            1.
+    SH010359  BAL0103            -1.   BAL0159             1.
+    SH010459  COST            265.96   TRAN0104            1.
+    SH010459  BAL0104            -1.   BAL0159             1.
+    SH010559  COST            173.31   TRAN0105            1.
+    SH010559  BAL0105            -1.   BAL0159             1.
+    SH010659  COST            323.73   TRAN0106            1.
+    SH010659  BAL0152            -1.   BAL0159             1.
+    SH010759  COST            114.45   TRAN0107            1.
+    SH010759  BAL0164            -1.   BAL0159             1.
+    SH010859  COST            277.95   TRAN0108            1.
+    SH010859  BAL0183            -1.   BAL0159             1.
+    SH010160  COST            284.49   TRAN0101            1.
+    SH010160  BAL0101            -1.   BAL0160             1.
+    SH010260  COST             599.5   TRAN0102            1.
+    SH010260  BAL0102            -1.   BAL0160             1.
+    SH010360  COST            308.47   TRAN0103            1.
+    SH010360  BAL0103            -1.   BAL0160             1.
+    SH010460  COST            340.08   TRAN0104            1.
+    SH010460  BAL0104            -1.   BAL0160             1.
+    SH010560  COST            147.15   TRAN0105            1.
+    SH010560  BAL0105            -1.   BAL0160             1.
+    SH010660  COST            352.07   TRAN0106            1.
+    SH010660  BAL0152            -1.   BAL0160             1.
+    SH010760  COST             95.92   TRAN0107            1.
+    SH010760  BAL0164            -1.   BAL0160             1.
+    SH010860  COST            325.91   TRAN0108            1.
+    SH010860  BAL0183            -1.   BAL0160             1.
+    SH010163  COST            289.94   TRAN0101            1.
+    SH010163  BAL0101            -1.   BAL0163             1.
+    SH010263  COST            538.46   TRAN0102            1.
+    SH010263  BAL0102            -1.   BAL0163             1.
+    SH010363  COST            312.83   TRAN0103            1.
+    SH010363  BAL0103            -1.   BAL0163             1.
+    SH010463  COST            402.21   TRAN0104            1.
+    SH010463  BAL0104            -1.   BAL0163             1.
+    SH010563  COST            165.68   TRAN0105            1.
+    SH010563  BAL0105            -1.   BAL0163             1.
+    SH010663  COST            343.35   TRAN0106            1.
+    SH010663  BAL0152            -1.   BAL0163             1.
+    SH010763  COST            135.16   TRAN0107            1.
+    SH010763  BAL0164            -1.   BAL0163             1.
+    SH010863  COST              436.   TRAN0108            1.
+    SH010863  BAL0183            -1.   BAL0163             1.
+    SH010164  COST            216.91   TRAN0101            1.
+    SH010164  BAL0101            -1.   BAL0164             1.
+    SH010264  COST            573.34   TRAN0102            1.
+    SH010264  BAL0102            -1.   BAL0164             1.
+    SH010364  COST            243.07   TRAN0103            1.
+    SH010364  BAL0103            -1.   BAL0164             1.
+    SH010464  COST            366.24   TRAN0104            1.
+    SH010464  BAL0104            -1.   BAL0164             1.
+    SH010564  COST             63.22   TRAN0105            1.
+    SH010564  BAL0105            -1.   BAL0164             1.
+    SH010664  COST            345.53   TRAN0106            1.
+    SH010664  BAL0152            -1.   BAL0164             1.
+    SH010864  COST             272.5   TRAN0108            1.
+    SH010864  BAL0183            -1.   BAL0164             1.
+    SH010165  COST            470.88   TRAN0101            1.
+    SH010165  BAL0101            -1.   BAL0165             1.
+    SH010265  COST            334.63   TRAN0102            1.
+    SH010265  BAL0102            -1.   BAL0165             1.
+    SH010365  COST            550.45   TRAN0103            1.
+    SH010365  BAL0103            -1.   BAL0165             1.
+    SH010465  COST            422.92   TRAN0104            1.
+    SH010465  BAL0104            -1.   BAL0165             1.
+    SH010565  COST            658.36   TRAN0105            1.
+    SH010565  BAL0105            -1.   BAL0165             1.
+    SH010865  COST            452.35   TRAN0108            1.
+    SH010865  BAL0183            -1.   BAL0165             1.
+    SH010166  COST             610.4   TRAN0101            1.
+    SH010166  BAL0101            -1.   BAL0166             1.
+    SH010266  COST            282.31   TRAN0102            1.
+    SH010266  BAL0102            -1.   BAL0166             1.
+    SH010366  COST            630.02   TRAN0103            1.
+    SH010366  BAL0103            -1.   BAL0166             1.
+    SH010466  COST            606.04   TRAN0104            1.
+    SH010466  BAL0104            -1.   BAL0166             1.
+    SH010566  COST             773.9   TRAN0105            1.
+    SH010566  BAL0105            -1.   BAL0166             1.
+    SH010866  COST             610.4   TRAN0108            1.
+    SH010866  BAL0183            -1.   BAL0166             1.
+    SH010167  COST            463.25   TRAN0101            1.
+    SH010167  BAL0101            -1.   BAL0167             1.
+    SH010267  COST            252.88   TRAN0102            1.
+    SH010267  BAL0102            -1.   BAL0167             1.
+    SH010367  COST            537.37   TRAN0103            1.
+    SH010367  BAL0103            -1.   BAL0167             1.
+    SH010467  COST            498.13   TRAN0104            1.
+    SH010467  BAL0104            -1.   BAL0167             1.
+    SH010567  COST            658.36   TRAN0105            1.
+    SH010567  BAL0105            -1.   BAL0167             1.
+    SH010867  COST            499.22   TRAN0108            1.
+    SH010867  BAL0183            -1.   BAL0167             1.
+    SH010168  COST            647.46   TRAN0101            1.
+    SH010168  BAL0101            -1.   BAL0168             1.
+    SH010268  COST              436.   TRAN0102            1.
+    SH010268  BAL0102            -1.   BAL0168             1.
+    SH010368  COST             610.4   TRAN0103            1.
+    SH010368  BAL0103            -1.   BAL0168             1.
+    SH010468  COST            765.18   TRAN0104            1.
+    SH010468  BAL0104            -1.   BAL0168             1.
+    SH010568  COST           1031.14   TRAN0105            1.
+    SH010568  BAL0105            -1.   BAL0168             1.
+    SH010868  COST            818.59   TRAN0108            1.
+    SH010868  BAL0183            -1.   BAL0168             1.
+    SH010169  COST            587.51   TRAN0101            1.
+    SH010169  BAL0101            -1.   BAL0169             1.
+    SH010269  COST            240.89   TRAN0102            1.
+    SH010269  BAL0102            -1.   BAL0169             1.
+    SH010369  COST             555.9   TRAN0103            1.
+    SH010369  BAL0103            -1.   BAL0169             1.
+    SH010469  COST            677.98   TRAN0104            1.
+    SH010469  BAL0104            -1.   BAL0169             1.
+    SH010569  COST            704.14   TRAN0105            1.
+    SH010569  BAL0105            -1.   BAL0169             1.
+    SH010869  COST            717.22   TRAN0108            1.
+    SH010869  BAL0183            -1.   BAL0169             1.
+    SH010171  COST             479.6   TRAN0101            1.
+    SH010171  BAL0101            -1.   BAL0171             1.
+    SH010371  COST            571.16   TRAN0103            1.
+    SH010371  BAL0103            -1.   BAL0171             1.
+    SH010471  COST            567.89   TRAN0104            1.
+    SH010471  BAL0104            -1.   BAL0171             1.
+    SH010571  COST            633.29   TRAN0105            1.
+    SH010571  BAL0105            -1.   BAL0171             1.
+    SH010671  COST            426.19   TRAN0106            1.
+    SH010671  BAL0152            -1.   BAL0171             1.
+    SH010771  COST            767.36   TRAN0107            1.
+    SH010771  BAL0164            -1.   BAL0171             1.
+    SH010871  COST            580.97   TRAN0108            1.
+    SH010871  BAL0183            -1.   BAL0171             1.
+    SH010172  COST            639.83   TRAN0101            1.
+    SH010172  BAL0101            -1.   BAL0172             1.
+    SH010272  COST            591.87   TRAN0102            1.
+    SH010272  BAL0102            -1.   BAL0172             1.
+    SH010372  COST            672.53   TRAN0103            1.
+    SH010372  BAL0103            -1.   BAL0172             1.
+    SH010472  COST             621.3   TRAN0104            1.
+    SH010472  BAL0104            -1.   BAL0172             1.
+    SH010572  COST            831.67   TRAN0105            1.
+    SH010572  BAL0105            -1.   BAL0172             1.
+    SH010872  COST             621.3   TRAN0108            1.
+    SH010872  BAL0183            -1.   BAL0172             1.
+    SH010173  COST             425.1   TRAN0101            1.
+    SH010173  BAL0101            -1.   BAL0173             1.
+    SH010273  COST            397.85   TRAN0102            1.
+    SH010273  BAL0102            -1.   BAL0173             1.
+    SH010373  COST            368.42   TRAN0103            1.
+    SH010373  BAL0103            -1.   BAL0173             1.
+    SH010473  COST            498.13   TRAN0104            1.
+    SH010473  BAL0104            -1.   BAL0173             1.
+    SH010573  COST            614.76   TRAN0105            1.
+    SH010573  BAL0105            -1.   BAL0173             1.
+    SH010673  COST            332.45   TRAN0106            1.
+    SH010673  BAL0152            -1.   BAL0173             1.
+    SH010873  COST            549.36   TRAN0108            1.
+    SH010873  BAL0183            -1.   BAL0173             1.
+    SH010174  COST            597.32   TRAN0101            1.
+    SH010174  BAL0101            -1.   BAL0174             1.
+    SH010274  COST             228.9   TRAN0102            1.
+    SH010274  BAL0102            -1.   BAL0174             1.
+    SH010374  COST             621.3   TRAN0103            1.
+    SH010374  BAL0103            -1.   BAL0174             1.
+    SH010474  COST            694.33   TRAN0104            1.
+    SH010474  BAL0104            -1.   BAL0174             1.
+    SH010574  COST            798.97   TRAN0105            1.
+    SH010574  BAL0105            -1.   BAL0174             1.
+    SH010874  COST            674.71   TRAN0108            1.
+    SH010874  BAL0183            -1.   BAL0174             1.
+    SH010275  COST            603.86   TRAN0102            1.
+    SH010275  BAL0102            -1.   BAL0175             1.
+    SH010176  COST            503.58   TRAN0101            1.
+    SH010176  BAL0101            -1.   BAL0176             1.
+    SH010276  COST            437.09   TRAN0102            1.
+    SH010276  BAL0102            -1.   BAL0176             1.
+    SH010376  COST            439.27   TRAN0103            1.
+    SH010376  BAL0103            -1.   BAL0176             1.
+    SH010476  COST             686.7   TRAN0104            1.
+    SH010476  BAL0104            -1.   BAL0176             1.
+    SH010576  COST             686.7   TRAN0105            1.
+    SH010576  BAL0105            -1.   BAL0176             1.
+    SH010676  COST            415.29   TRAN0106            1.
+    SH010676  BAL0152            -1.   BAL0176             1.
+    SH010876  COST            846.93   TRAN0108            1.
+    SH010876  BAL0183            -1.   BAL0176             1.
+    SH010177  COST            474.15   TRAN0101            1.
+    SH010177  BAL0101            -1.   BAL0177             1.
+    SH010277  COST            296.48   TRAN0102            1.
+    SH010277  BAL0102            -1.   BAL0177             1.
+    SH010377  COST            502.49   TRAN0103            1.
+    SH010377  BAL0103            -1.   BAL0177             1.
+    SH010477  COST            437.09   TRAN0104            1.
+    SH010477  BAL0104            -1.   BAL0177             1.
+    SH010577  COST             610.4   TRAN0105            1.
+    SH010577  BAL0105            -1.   BAL0177             1.
+    SH010877  COST             348.8   TRAN0108            1.
+    SH010877  BAL0183            -1.   BAL0177             1.
+    SH010178  COST            829.49   TRAN0101            1.
+    SH010178  BAL0101            -1.   BAL0178             1.
+    SH010278  COST            481.78   TRAN0102            1.
+    SH010278  BAL0102            -1.   BAL0178             1.
+    SH010378  COST            853.47   TRAN0103            1.
+    SH010378  BAL0103            -1.   BAL0178             1.
+    SH010478  COST            746.65   TRAN0104            1.
+    SH010478  BAL0104            -1.   BAL0178             1.
+    SH010578  COST            958.11   TRAN0105            1.
+    SH010578  BAL0105            -1.   BAL0178             1.
+    SH010878  COST            834.94   TRAN0108            1.
+    SH010878  BAL0183            -1.   BAL0178             1.
+    SH010179  COST            779.35   TRAN0101            1.
+    SH010179  BAL0101            -1.   BAL0179             1.
+    SH010279  COST            293.21   TRAN0102            1.
+    SH010279  BAL0102            -1.   BAL0179             1.
+    SH010379  COST            753.19   TRAN0103            1.
+    SH010379  BAL0103            -1.   BAL0179             1.
+    SH010479  COST             784.8   TRAN0104            1.
+    SH010479  BAL0104            -1.   BAL0179             1.
+    SH010879  COST            769.54   TRAN0108            1.
+    SH010879  BAL0183            -1.   BAL0179             1.
+    SH010180  COST            345.53   TRAN0101            1.
+    SH010180  BAL0101            -1.   BAL0180             1.
+    SH010280  COST            430.55   TRAN0102            1.
+    SH010280  BAL0102            -1.   BAL0180             1.
+    SH010380  COST            476.33   TRAN0103            1.
+    SH010380  BAL0103            -1.   BAL0180             1.
+    SH010480  COST            407.66   TRAN0104            1.
+    SH010480  BAL0104            -1.   BAL0180             1.
+    SH010580  COST            550.45   TRAN0105            1.
+    SH010580  BAL0105            -1.   BAL0180             1.
+    SH010880  COST             261.6   TRAN0108            1.
+    SH010880  BAL0183            -1.   BAL0180             1.
+    SH010182  COST            634.38   TRAN0101            1.
+    SH010182  BAL0101            -1.   BAL0182             1.
+    SH010282  COST            358.61   TRAN0102            1.
+    SH010282  BAL0102            -1.   BAL0182             1.
+    SH010382  COST            713.95   TRAN0103            1.
+    SH010382  BAL0103            -1.   BAL0182             1.
+    SH010482  COST            769.54   TRAN0104            1.
+    SH010482  BAL0104            -1.   BAL0182             1.
+    SH010582  COST           1250.23   TRAN0105            1.
+    SH010582  BAL0105            -1.   BAL0182             1.
+    SH010882  COST            853.47   TRAN0108            1.
+    SH010882  BAL0183            -1.   BAL0182             1.
+    SH010183  COST            192.93   TRAN0101            1.
+    SH010183  BAL0101            -1.   BAL0183             1.
+    SH010283  COST             566.8   TRAN0102            1.
+    SH010283  BAL0102            -1.   BAL0183             1.
+    SH010383  COST            296.48   TRAN0103            1.
+    SH010383  BAL0103            -1.   BAL0183             1.
+    SH010483  COST             64.31   TRAN0104            1.
+    SH010483  BAL0104            -1.   BAL0183             1.
+    SH010583  COST            378.23   TRAN0105            1.
+    SH010583  BAL0105            -1.   BAL0183             1.
+    SH010683  COST            270.32   TRAN0106            1.
+    SH010683  BAL0152            -1.   BAL0183             1.
+    SH010184  COST            331.36   TRAN0101            1.
+    SH010184  BAL0101            -1.   BAL0184             1.
+    SH010284  COST            209.28   TRAN0102            1.
+    SH010284  BAL0102            -1.   BAL0184             1.
+    SH010384  COST            396.76   TRAN0103            1.
+    SH010384  BAL0103            -1.   BAL0184             1.
+    SH010484  COST             403.3   TRAN0104            1.
+    SH010484  BAL0104            -1.   BAL0184             1.
+    SH010584  COST             534.1   TRAN0105            1.
+    SH010584  BAL0105            -1.   BAL0184             1.
+    SH010684  COST            332.45   TRAN0106            1.
+    SH010684  BAL0152            -1.   BAL0184             1.
+    SH010884  COST            422.92   TRAN0108            1.
+    SH010884  BAL0183            -1.   BAL0184             1.
+    SH020201  COST            368.28   TRAN0202            1.
+    SH020201  BAL0202            -1.   BAL0201             1.
+    SH020301  COST            141.36   TRAN0203            1.
+    SH020301  BAL0203            -1.   BAL0201             1.
+    SH020401  COST            257.92   TRAN0204            1.
+    SH020401  BAL0204            -1.   BAL0201             1.
+    SH020501  COST            293.88   TRAN0205            1.
+    SH020501  BAL0205            -1.   BAL0201             1.
+    SH020601  COST            156.24   TRAN0206            1.
+    SH020601  BAL0252            -1.   BAL0201             1.
+    SH020801  COST            177.32   TRAN0208            1.
+    SH020801  BAL0283            -1.   BAL0201             1.
+    SH020102  COST            587.76   TRAN0201            1.
+    SH020102  BAL0201            -1.   BAL0202             1.
+    SH020302  COST            517.08   TRAN0203            1.
+    SH020302  BAL0203            -1.   BAL0202             1.
+    SH020402  COST            758.88   TRAN0204            1.
+    SH020402  BAL0204            -1.   BAL0202             1.
+    SH020502  COST            918.84   TRAN0205            1.
+    SH020502  BAL0205            -1.   BAL0202             1.
+    SH020602  COST            468.72   TRAN0206            1.
+    SH020602  BAL0252            -1.   BAL0202             1.
+    SH020802  COST            646.04   TRAN0208            1.
+    SH020802  BAL0283            -1.   BAL0202             1.
+    SH020103  COST             303.8   TRAN0201            1.
+    SH020103  BAL0201            -1.   BAL0203             1.
+    SH020203  COST            587.76   TRAN0202            1.
+    SH020203  BAL0202            -1.   BAL0203             1.
+    SH020403  COST            455.08   TRAN0204            1.
+    SH020403  BAL0204            -1.   BAL0203             1.
+    SH020503  COST            352.16   TRAN0205            1.
+    SH020503  BAL0205            -1.   BAL0203             1.
+    SH020603  COST             111.6   TRAN0206            1.
+    SH020603  BAL0252            -1.   BAL0203             1.
+    SH020803  COST             316.2   TRAN0208            1.
+    SH020803  BAL0283            -1.   BAL0203             1.
+    SH020104  COST            215.76   TRAN0201            1.
+    SH020104  BAL0201            -1.   BAL0204             1.
+    SH020204  COST            623.72   TRAN0202            1.
+    SH020204  BAL0202            -1.   BAL0204             1.
+    SH020304  COST            301.32   TRAN0203            1.
+    SH020304  BAL0203            -1.   BAL0204             1.
+    SH020504  COST            395.56   TRAN0205            1.
+    SH020504  BAL0205            -1.   BAL0204             1.
+    SH020604  COST             303.8   TRAN0206            1.
+    SH020604  BAL0252            -1.   BAL0204             1.
+    SH020704  COST            333.56   TRAN0207            1.
+    SH020704  BAL0264            -1.   BAL0204             1.
+    SH020804  COST             71.92   TRAN0208            1.
+    SH020804  BAL0283            -1.   BAL0204             1.
+    SH020105  COST             334.8   TRAN0201            1.
+    SH020105  BAL0201            -1.   BAL0205             1.
+    SH020205  COST            639.84   TRAN0202            1.
+    SH020205  BAL0202            -1.   BAL0205             1.
+    SH020305  COST            352.16   TRAN0203            1.
+    SH020305  BAL0203            -1.   BAL0205             1.
+    SH020405  COST             353.4   TRAN0204            1.
+    SH020405  BAL0204            -1.   BAL0205             1.
+    SH020605  COST            404.24   TRAN0206            1.
+    SH020605  BAL0252            -1.   BAL0205             1.
+    SH020705  COST            414.16   TRAN0207            1.
+    SH020705  BAL0264            -1.   BAL0205             1.
+    SH020805  COST            336.04   TRAN0208            1.
+    SH020805  BAL0283            -1.   BAL0205             1.
+    SH020106  COST            246.76   TRAN0201            1.
+    SH020106  BAL0201            -1.   BAL0206             1.
+    SH020206  COST            517.08   TRAN0202            1.
+    SH020206  BAL0202            -1.   BAL0206             1.
+    SH020306  COST            264.12   TRAN0203            1.
+    SH020306  BAL0203            -1.   BAL0206             1.
+    SH020406  COST            271.56   TRAN0204            1.
+    SH020406  BAL0204            -1.   BAL0206             1.
+    SH020506  COST            312.48   TRAN0205            1.
+    SH020506  BAL0205            -1.   BAL0206             1.
+    SH020606  COST            255.44   TRAN0206            1.
+    SH020606  BAL0252            -1.   BAL0206             1.
+    SH020706  COST              248.   TRAN0207            1.
+    SH020706  BAL0264            -1.   BAL0206             1.
+    SH020806  COST            187.24   TRAN0208            1.
+    SH020806  BAL0283            -1.   BAL0206             1.
+    SH020107  COST             26.04   TRAN0201            1.
+    SH020107  BAL0201            -1.   BAL0207             1.
+    SH020207  COST            362.08   TRAN0202            1.
+    SH020207  BAL0202            -1.   BAL0207             1.
+    SH020307  COST            153.76   TRAN0203            1.
+    SH020307  BAL0203            -1.   BAL0207             1.
+    SH020407  COST            256.68   TRAN0204            1.
+    SH020407  BAL0204            -1.   BAL0207             1.
+    SH020507  COST            283.96   TRAN0205            1.
+    SH020507  BAL0205            -1.   BAL0207             1.
+    SH020607  COST              155.   TRAN0206            1.
+    SH020607  BAL0252            -1.   BAL0207             1.
+    SH020707  COST            287.68   TRAN0207            1.
+    SH020707  BAL0264            -1.   BAL0207             1.
+    SH020807  COST             192.2   TRAN0208            1.
+    SH020807  BAL0283            -1.   BAL0207             1.
+    SH020108  COST             81.84   TRAN0201            1.
+    SH020108  BAL0201            -1.   BAL0208             1.
+    SH020208  COST            466.24   TRAN0202            1.
+    SH020208  BAL0202            -1.   BAL0208             1.
+    SH020308  COST            174.84   TRAN0203            1.
+    SH020308  BAL0203            -1.   BAL0208             1.
+    SH020408  COST            306.28   TRAN0204            1.
+    SH020408  BAL0204            -1.   BAL0208             1.
+    SH020508  COST            225.68   TRAN0205            1.
+    SH020508  BAL0205            -1.   BAL0208             1.
+    SH020608  COST            205.84   TRAN0206            1.
+    SH020608  BAL0252            -1.   BAL0208             1.
+    SH020808  COST            231.88   TRAN0208            1.
+    SH020808  BAL0283            -1.   BAL0208             1.
+    SH020109  COST            171.12   TRAN0201            1.
+    SH020109  BAL0201            -1.   BAL0209             1.
+    SH020209  COST            474.92   TRAN0202            1.
+    SH020209  BAL0202            -1.   BAL0209             1.
+    SH020309  COST            208.32   TRAN0203            1.
+    SH020309  BAL0203            -1.   BAL0209             1.
+    SH020409  COST            313.72   TRAN0204            1.
+    SH020409  BAL0204            -1.   BAL0209             1.
+    SH020509  COST            296.36   TRAN0205            1.
+    SH020509  BAL0205            -1.   BAL0209             1.
+    SH020709  COST            243.04   TRAN0207            1.
+    SH020709  BAL0264            -1.   BAL0209             1.
+    SH020809  COST            240.56   TRAN0208            1.
+    SH020809  BAL0283            -1.   BAL0209             1.
+    SH020110  COST            306.28   TRAN0201            1.
+    SH020110  BAL0201            -1.   BAL0210             1.
+    SH020210  COST            195.92   TRAN0202            1.
+    SH020210  BAL0202            -1.   BAL0210             1.
+    SH020310  COST             297.6   TRAN0203            1.
+    SH020310  BAL0203            -1.   BAL0210             1.
+    SH020410  COST            445.16   TRAN0204            1.
+    SH020410  BAL0204            -1.   BAL0210             1.
+    SH020510  COST             477.4   TRAN0205            1.
+    SH020510  BAL0205            -1.   BAL0210             1.
+    SH020610  COST              279.   TRAN0206            1.
+    SH020610  BAL0252            -1.   BAL0210             1.
+    SH020810  COST             378.2   TRAN0208            1.
+    SH020810  BAL0283            -1.   BAL0210             1.
+    SH020111  COST            131.44   TRAN0201            1.
+    SH020111  BAL0201            -1.   BAL0211             1.
+    SH020211  COST             613.8   TRAN0202            1.
+    SH020211  BAL0202            -1.   BAL0211             1.
+    SH020311  COST            307.52   TRAN0203            1.
+    SH020311  BAL0203            -1.   BAL0211             1.
+    SH020411  COST            172.36   TRAN0204            1.
+    SH020411  BAL0204            -1.   BAL0211             1.
+    SH020511  COST            422.84   TRAN0205            1.
+    SH020511  BAL0205            -1.   BAL0211             1.
+    SH020611  COST            243.04   TRAN0206            1.
+    SH020611  BAL0252            -1.   BAL0211             1.
+    SH020811  COST            126.48   TRAN0208            1.
+    SH020811  BAL0283            -1.   BAL0211             1.
+    SH020112  COST            109.12   TRAN0201            1.
+    SH020112  BAL0201            -1.   BAL0212             1.
+    SH020212  COST            420.36   TRAN0202            1.
+    SH020212  BAL0202            -1.   BAL0212             1.
+    SH020312  COST            181.04   TRAN0203            1.
+    SH020312  BAL0203            -1.   BAL0212             1.
+    SH020412  COST              248.   TRAN0204            1.
+    SH020412  BAL0204            -1.   BAL0212             1.
+    SH020512  COST            331.08   TRAN0205            1.
+    SH020512  BAL0205            -1.   BAL0212             1.
+    SH020612  COST             179.8   TRAN0206            1.
+    SH020612  BAL0252            -1.   BAL0212             1.
+    SH020812  COST            181.04   TRAN0208            1.
+    SH020812  BAL0283            -1.   BAL0212             1.
+    SH020114  COST            176.08   TRAN0201            1.
+    SH020114  BAL0201            -1.   BAL0214             1.
+    SH020214  COST            510.88   TRAN0202            1.
+    SH020214  BAL0202            -1.   BAL0214             1.
+    SH020314  COST            243.04   TRAN0203            1.
+    SH020314  BAL0203            -1.   BAL0214             1.
+    SH020414  COST            246.76   TRAN0204            1.
+    SH020414  BAL0204            -1.   BAL0214             1.
+    SH020514  COST            436.48   TRAN0205            1.
+    SH020514  BAL0205            -1.   BAL0214             1.
+    SH020614  COST            233.12   TRAN0206            1.
+    SH020614  BAL0252            -1.   BAL0214             1.
+    SH020814  COST            156.24   TRAN0208            1.
+    SH020814  BAL0283            -1.   BAL0214             1.
+    SH020115  COST            375.72   TRAN0201            1.
+    SH020115  BAL0201            -1.   BAL0215             1.
+    SH020215  COST            197.16   TRAN0202            1.
+    SH020215  BAL0202            -1.   BAL0215             1.
+    SH020315  COST            290.16   TRAN0203            1.
+    SH020315  BAL0203            -1.   BAL0215             1.
+    SH020415  COST            590.24   TRAN0204            1.
+    SH020415  BAL0204            -1.   BAL0215             1.
+    SH020515  COST            493.52   TRAN0205            1.
+    SH020515  BAL0205            -1.   BAL0215             1.
+    SH020615  COST            233.12   TRAN0206            1.
+    SH020615  BAL0252            -1.   BAL0215             1.
+    SH020815  COST            462.52   TRAN0208            1.
+    SH020815  BAL0283            -1.   BAL0215             1.
+    SH020116  COST            195.92   TRAN0201            1.
+    SH020116  BAL0201            -1.   BAL0216             1.
+    SH020216  COST             347.2   TRAN0202            1.
+    SH020216  BAL0202            -1.   BAL0216             1.
+    SH020316  COST            281.48   TRAN0203            1.
+    SH020316  BAL0203            -1.   BAL0216             1.
+    SH020416  COST            355.88   TRAN0204            1.
+    SH020416  BAL0204            -1.   BAL0216             1.
+    SH020516  COST            395.56   TRAN0205            1.
+    SH020516  BAL0205            -1.   BAL0216             1.
+    SH020616  COST            162.44   TRAN0206            1.
+    SH020616  BAL0252            -1.   BAL0216             1.
+    SH020816  COST             254.2   TRAN0208            1.
+    SH020816  BAL0283            -1.   BAL0216             1.
+    SH020117  COST            187.24   TRAN0201            1.
+    SH020117  BAL0201            -1.   BAL0217             1.
+    SH020217  COST             626.2   TRAN0202            1.
+    SH020217  BAL0202            -1.   BAL0217             1.
+    SH020317  COST            339.76   TRAN0203            1.
+    SH020317  BAL0203            -1.   BAL0217             1.
+    SH020417  COST             70.68   TRAN0204            1.
+    SH020417  BAL0204            -1.   BAL0217             1.
+    SH020517  COST            369.52   TRAN0205            1.
+    SH020517  BAL0205            -1.   BAL0217             1.
+    SH020717  COST             365.8   TRAN0207            1.
+    SH020717  BAL0264            -1.   BAL0217             1.
+    SH020817  COST             33.48   TRAN0208            1.
+    SH020817  BAL0283            -1.   BAL0217             1.
+    SH020118  COST              217.   TRAN0201            1.
+    SH020118  BAL0201            -1.   BAL0218             1.
+    SH020218  COST            447.64   TRAN0202            1.
+    SH020218  BAL0202            -1.   BAL0218             1.
+    SH020318  COST             334.8   TRAN0203            1.
+    SH020318  BAL0203            -1.   BAL0218             1.
+    SH020418  COST            190.96   TRAN0204            1.
+    SH020418  BAL0204            -1.   BAL0218             1.
+    SH020518  COST            504.68   TRAN0205            1.
+    SH020518  BAL0205            -1.   BAL0218             1.
+    SH020618  COST            436.48   TRAN0206            1.
+    SH020618  BAL0252            -1.   BAL0218             1.
+    SH020818  COST            127.72   TRAN0208            1.
+    SH020818  BAL0283            -1.   BAL0218             1.
+    SH020119  COST            307.52   TRAN0201            1.
+    SH020119  BAL0201            -1.   BAL0219             1.
+    SH020219  COST            851.88   TRAN0202            1.
+    SH020219  BAL0202            -1.   BAL0219             1.
+    SH020319  COST            393.08   TRAN0203            1.
+    SH020319  BAL0203            -1.   BAL0219             1.
+    SH020419  COST            197.16   TRAN0204            1.
+    SH020419  BAL0204            -1.   BAL0219             1.
+    SH020519  COST            257.92   TRAN0205            1.
+    SH020519  BAL0205            -1.   BAL0219             1.
+    SH020619  COST             427.8   TRAN0206            1.
+    SH020619  BAL0252            -1.   BAL0219             1.
+    SH020819  COST            122.76   TRAN0208            1.
+    SH020819  BAL0283            -1.   BAL0219             1.
+    SH020120  COST             254.2   TRAN0201            1.
+    SH020120  BAL0201            -1.   BAL0220             1.
+    SH020220  COST            846.92   TRAN0202            1.
+    SH020220  BAL0202            -1.   BAL0220             1.
+    SH020320  COST            368.28   TRAN0203            1.
+    SH020320  BAL0203            -1.   BAL0220             1.
+    SH020420  COST            140.12   TRAN0204            1.
+    SH020420  BAL0204            -1.   BAL0220             1.
+    SH020520  COST            360.84   TRAN0205            1.
+    SH020520  BAL0205            -1.   BAL0220             1.
+    SH020820  COST            156.24   TRAN0208            1.
+    SH020820  BAL0283            -1.   BAL0220             1.
+    SH020121  COST            499.72   TRAN0201            1.
+    SH020121  BAL0201            -1.   BAL0221             1.
+    SH020221  COST            456.32   TRAN0202            1.
+    SH020221  BAL0202            -1.   BAL0221             1.
+    SH020321  COST            553.04   TRAN0203            1.
+    SH020321  BAL0203            -1.   BAL0221             1.
+    SH020421  COST             396.8   TRAN0204            1.
+    SH020421  BAL0204            -1.   BAL0221             1.
+    SH020521  COST              682.   TRAN0205            1.
+    SH020521  BAL0205            -1.   BAL0221             1.
+    SH020821  COST             396.8   TRAN0208            1.
+    SH020821  BAL0283            -1.   BAL0221             1.
+    SH020122  COST            307.52   TRAN0201            1.
+    SH020122  BAL0201            -1.   BAL0222             1.
+    SH020222  COST            716.72   TRAN0202            1.
+    SH020222  BAL0202            -1.   BAL0222             1.
+    SH020322  COST            370.76   TRAN0203            1.
+    SH020322  BAL0203            -1.   BAL0222             1.
+    SH020422  COST            277.76   TRAN0204            1.
+    SH020422  BAL0204            -1.   BAL0222             1.
+    SH020522  COST            221.96   TRAN0205            1.
+    SH020522  BAL0205            -1.   BAL0222             1.
+    SH020622  COST             384.4   TRAN0206            1.
+    SH020622  BAL0252            -1.   BAL0222             1.
+    SH020822  COST            172.36   TRAN0208            1.
+    SH020822  BAL0283            -1.   BAL0222             1.
+    SH020123  COST            290.16   TRAN0201            1.
+    SH020123  BAL0201            -1.   BAL0223             1.
+    SH020223  COST            670.84   TRAN0202            1.
+    SH020223  BAL0202            -1.   BAL0223             1.
+    SH020323  COST            355.88   TRAN0203            1.
+    SH020323  BAL0203            -1.   BAL0223             1.
+    SH020423  COST            207.08   TRAN0204            1.
+    SH020423  BAL0204            -1.   BAL0223             1.
+    SH020523  COST            205.84   TRAN0205            1.
+    SH020523  BAL0205            -1.   BAL0223             1.
+    SH020823  COST            172.36   TRAN0208            1.
+    SH020823  BAL0283            -1.   BAL0223             1.
+    SH020124  COST           1780.64   TRAN0201            1.
+    SH020124  BAL0201            -1.   BAL0224             1.
+    SH020125  COST            479.88   TRAN0201            1.
+    SH020125  BAL0201            -1.   BAL0225             1.
+    SH020225  COST            529.48   TRAN0202            1.
+    SH020225  BAL0202            -1.   BAL0225             1.
+    SH020325  COST            633.64   TRAN0203            1.
+    SH020325  BAL0203            -1.   BAL0225             1.
+    SH020425  COST            431.52   TRAN0204            1.
+    SH020425  BAL0204            -1.   BAL0225             1.
+    SH020525  COST            701.84   TRAN0205            1.
+    SH020525  BAL0205            -1.   BAL0225             1.
+    SH020625  COST            499.72   TRAN0206            1.
+    SH020625  BAL0252            -1.   BAL0225             1.
+    SH020825  COST             378.2   TRAN0208            1.
+    SH020825  BAL0283            -1.   BAL0225             1.
+    SH020426  COST             334.8   TRAN0204            1.
+    SH020426  BAL0204            -1.   BAL0226             1.
+    SH020127  COST            290.16   TRAN0201            1.
+    SH020127  BAL0201            -1.   BAL0227             1.
+    SH020227  COST            352.16   TRAN0202            1.
+    SH020227  BAL0202            -1.   BAL0227             1.
+    SH020327  COST            358.36   TRAN0203            1.
+    SH020327  BAL0203            -1.   BAL0227             1.
+    SH020427  COST             415.4   TRAN0204            1.
+    SH020427  BAL0204            -1.   BAL0227             1.
+    SH020527  COST            468.72   TRAN0205            1.
+    SH020527  BAL0205            -1.   BAL0227             1.
+    SH020627  COST            332.32   TRAN0206            1.
+    SH020627  BAL0252            -1.   BAL0227             1.
+    SH020827  COST            312.48   TRAN0208            1.
+    SH020827  BAL0283            -1.   BAL0227             1.
+    SH020128  COST            301.32   TRAN0201            1.
+    SH020128  BAL0201            -1.   BAL0228             1.
+    SH020228  COST            705.56   TRAN0202            1.
+    SH020228  BAL0202            -1.   BAL0228             1.
+    SH020328  COST            367.04   TRAN0203            1.
+    SH020328  BAL0203            -1.   BAL0228             1.
+    SH020428  COST             365.8   TRAN0204            1.
+    SH020428  BAL0204            -1.   BAL0228             1.
+    SH020528  COST            126.48   TRAN0205            1.
+    SH020528  BAL0205            -1.   BAL0228             1.
+    SH020628  COST            323.64   TRAN0206            1.
+    SH020628  BAL0252            -1.   BAL0228             1.
+    SH020728  COST            132.68   TRAN0207            1.
+    SH020728  BAL0264            -1.   BAL0228             1.
+    SH020828  COST            314.96   TRAN0208            1.
+    SH020828  BAL0283            -1.   BAL0228             1.
+    SH020129  COST            276.52   TRAN0201            1.
+    SH020129  BAL0201            -1.   BAL0229             1.
+    SH020229  COST            575.36   TRAN0202            1.
+    SH020229  BAL0202            -1.   BAL0229             1.
+    SH020329  COST            298.84   TRAN0203            1.
+    SH020329  BAL0203            -1.   BAL0229             1.
+    SH020429  COST            246.76   TRAN0204            1.
+    SH020429  BAL0204            -1.   BAL0229             1.
+    SH020529  COST             533.2   TRAN0205            1.
+    SH020529  BAL0205            -1.   BAL0229             1.
+    SH020629  COST            323.64   TRAN0206            1.
+    SH020629  BAL0252            -1.   BAL0229             1.
+    SH020829  COST            178.56   TRAN0208            1.
+    SH020829  BAL0283            -1.   BAL0229             1.
+    SH020130  COST            577.84   TRAN0201            1.
+    SH020130  BAL0201            -1.   BAL0230             1.
+    SH020230  COST            540.64   TRAN0202            1.
+    SH020230  BAL0202            -1.   BAL0230             1.
+    SH020330  COST            648.52   TRAN0203            1.
+    SH020330  BAL0203            -1.   BAL0230             1.
+    SH020430  COST            376.96   TRAN0204            1.
+    SH020430  BAL0204            -1.   BAL0230             1.
+    SH020530  COST            553.04   TRAN0205            1.
+    SH020530  BAL0205            -1.   BAL0230             1.
+    SH020830  COST            473.68   TRAN0208            1.
+    SH020830  BAL0283            -1.   BAL0230             1.
+    SH020131  COST            137.64   TRAN0201            1.
+    SH020131  BAL0201            -1.   BAL0231             1.
+    SH020231  COST            435.24   TRAN0202            1.
+    SH020231  BAL0202            -1.   BAL0231             1.
+    SH020331  COST             136.4   TRAN0203            1.
+    SH020331  BAL0203            -1.   BAL0231             1.
+    SH020431  COST            313.72   TRAN0204            1.
+    SH020431  BAL0204            -1.   BAL0231             1.
+    SH020531  COST            380.68   TRAN0205            1.
+    SH020531  BAL0205            -1.   BAL0231             1.
+    SH020631  COST            138.88   TRAN0206            1.
+    SH020631  BAL0252            -1.   BAL0231             1.
+    SH020831  COST            276.52   TRAN0208            1.
+    SH020831  BAL0283            -1.   BAL0231             1.
+    SH020132  COST            370.76   TRAN0201            1.
+    SH020132  BAL0201            -1.   BAL0232             1.
+    SH020232  COST            592.72   TRAN0202            1.
+    SH020232  BAL0202            -1.   BAL0232             1.
+    SH020332  COST            524.52   TRAN0203            1.
+    SH020332  BAL0203            -1.   BAL0232             1.
+    SH020432  COST            194.68   TRAN0204            1.
+    SH020432  BAL0204            -1.   BAL0232             1.
+    SH020532  COST            486.08   TRAN0205            1.
+    SH020532  BAL0205            -1.   BAL0232             1.
+    SH020832  COST             223.2   TRAN0208            1.
+    SH020832  BAL0283            -1.   BAL0232             1.
+    SH020133  COST            611.32   TRAN0201            1.
+    SH020133  BAL0201            -1.   BAL0233             1.
+    SH020233  COST              496.   TRAN0202            1.
+    SH020233  BAL0202            -1.   BAL0233             1.
+    SH020333  COST            673.32   TRAN0203            1.
+    SH020333  BAL0203            -1.   BAL0233             1.
+    SH020433  COST             551.8   TRAN0204            1.
+    SH020433  BAL0204            -1.   BAL0233             1.
+    SH020533  COST            782.44   TRAN0205            1.
+    SH020533  BAL0205            -1.   BAL0233             1.
+    SH020833  COST            472.44   TRAN0208            1.
+    SH020833  BAL0283            -1.   BAL0233             1.
+    SH020134  COST            478.64   TRAN0201            1.
+    SH020134  BAL0201            -1.   BAL0234             1.
+    SH020234  COST             812.2   TRAN0202            1.
+    SH020234  BAL0202            -1.   BAL0234             1.
+    SH020334  COST            623.72   TRAN0203            1.
+    SH020334  BAL0203            -1.   BAL0234             1.
+    SH020434  COST            261.64   TRAN0204            1.
+    SH020434  BAL0204            -1.   BAL0234             1.
+    SH020534  COST            546.84   TRAN0205            1.
+    SH020534  BAL0205            -1.   BAL0234             1.
+    SH020834  COST            326.12   TRAN0208            1.
+    SH020834  BAL0283            -1.   BAL0234             1.
+    SH020135  COST            571.64   TRAN0201            1.
+    SH020135  BAL0201            -1.   BAL0235             1.
+    SH020235  COST             551.8   TRAN0202            1.
+    SH020235  BAL0202            -1.   BAL0235             1.
+    SH020335  COST            467.48   TRAN0203            1.
+    SH020335  BAL0203            -1.   BAL0235             1.
+    SH020435  COST            151.28   TRAN0204            1.
+    SH020435  BAL0204            -1.   BAL0235             1.
+    SH020535  COST            534.44   TRAN0205            1.
+    SH020535  BAL0205            -1.   BAL0235             1.
+    SH020835  COST             291.4   TRAN0208            1.
+    SH020835  BAL0283            -1.   BAL0235             1.
+    SH020136  COST             254.2   TRAN0201            1.
+    SH020136  BAL0201            -1.   BAL0236             1.
+    SH020236  COST            555.52   TRAN0202            1.
+    SH020236  BAL0202            -1.   BAL0236             1.
+    SH020336  COST            131.44   TRAN0203            1.
+    SH020336  BAL0203            -1.   BAL0236             1.
+    SH020436  COST             458.8   TRAN0204            1.
+    SH020436  BAL0204            -1.   BAL0236             1.
+    SH020536  COST            429.04   TRAN0205            1.
+    SH020536  BAL0205            -1.   BAL0236             1.
+    SH020636  COST             136.4   TRAN0206            1.
+    SH020636  BAL0252            -1.   BAL0236             1.
+    SH020836  COST            398.04   TRAN0208            1.
+    SH020836  BAL0283            -1.   BAL0236             1.
+    SH020137  COST            114.08   TRAN0201            1.
+    SH020137  BAL0201            -1.   BAL0237             1.
+    SH020237  COST            424.08   TRAN0202            1.
+    SH020237  BAL0202            -1.   BAL0237             1.
+    SH020337  COST            195.92   TRAN0203            1.
+    SH020337  BAL0203            -1.   BAL0237             1.
+    SH020437  COST            376.96   TRAN0204            1.
+    SH020437  BAL0204            -1.   BAL0237             1.
+    SH020537  COST            225.68   TRAN0205            1.
+    SH020537  BAL0205            -1.   BAL0237             1.
+    SH020637  COST            240.56   TRAN0206            1.
+    SH020637  BAL0252            -1.   BAL0237             1.
+    SH020837  COST            312.48   TRAN0208            1.
+    SH020837  BAL0283            -1.   BAL0237             1.
+    SH020138  COST            168.64   TRAN0201            1.
+    SH020138  BAL0201            -1.   BAL0238             1.
+    SH020238  COST            302.56   TRAN0202            1.
+    SH020238  BAL0202            -1.   BAL0238             1.
+    SH020338  COST             117.8   TRAN0203            1.
+    SH020338  BAL0203            -1.   BAL0238             1.
+    SH020438  COST            381.92   TRAN0204            1.
+    SH020438  BAL0204            -1.   BAL0238             1.
+    SH020538  COST            344.72   TRAN0205            1.
+    SH020538  BAL0205            -1.   BAL0238             1.
+    SH020638  COST             48.36   TRAN0206            1.
+    SH020638  BAL0252            -1.   BAL0238             1.
+    SH020738  COST            267.84   TRAN0207            1.
+    SH020738  BAL0264            -1.   BAL0238             1.
+    SH020838  COST            293.88   TRAN0208            1.
+    SH020838  BAL0283            -1.   BAL0238             1.
+    SH020139  COST             161.2   TRAN0201            1.
+    SH020139  BAL0201            -1.   BAL0239             1.
+    SH020239  COST            420.36   TRAN0202            1.
+    SH020239  BAL0202            -1.   BAL0239             1.
+    SH020339  COST             198.4   TRAN0203            1.
+    SH020339  BAL0203            -1.   BAL0239             1.
+    SH020439  COST            308.76   TRAN0204            1.
+    SH020439  BAL0204            -1.   BAL0239             1.
+    SH020539  COST            531.96   TRAN0205            1.
+    SH020539  BAL0205            -1.   BAL0239             1.
+    SH020639  COST            252.96   TRAN0206            1.
+    SH020639  BAL0252            -1.   BAL0239             1.
+    SH020839  COST            208.32   TRAN0208            1.
+    SH020839  BAL0283            -1.   BAL0239             1.
+    SH020140  COST             204.6   TRAN0201            1.
+    SH020140  BAL0201            -1.   BAL0240             1.
+    SH020240  COST            468.72   TRAN0202            1.
+    SH020240  BAL0202            -1.   BAL0240             1.
+    SH020340  COST            127.72   TRAN0203            1.
+    SH020340  BAL0203            -1.   BAL0240             1.
+    SH020440  COST            368.28   TRAN0204            1.
+    SH020440  BAL0204            -1.   BAL0240             1.
+    SH020540  COST            274.04   TRAN0205            1.
+    SH020540  BAL0205            -1.   BAL0240             1.
+    SH020640  COST            162.44   TRAN0206            1.
+    SH020640  BAL0252            -1.   BAL0240             1.
+    SH020840  COST            339.76   TRAN0208            1.
+    SH020840  BAL0283            -1.   BAL0240             1.
+    SH020141  COST            243.04   TRAN0201            1.
+    SH020141  BAL0201            -1.   BAL0241             1.
+    SH020241  COST              372.   TRAN0202            1.
+    SH020241  BAL0202            -1.   BAL0241             1.
+    SH020341  COST              186.   TRAN0203            1.
+    SH020341  BAL0203            -1.   BAL0241             1.
+    SH020441  COST            401.76   TRAN0204            1.
+    SH020441  BAL0204            -1.   BAL0241             1.
+    SH020541  COST            456.32   TRAN0205            1.
+    SH020541  BAL0205            -1.   BAL0241             1.
+    SH020641  COST              124.   TRAN0206            1.
+    SH020641  BAL0252            -1.   BAL0241             1.
+    SH020841  COST            370.76   TRAN0208            1.
+    SH020841  BAL0283            -1.   BAL0241             1.
+    SH020142  COST             111.6   TRAN0201            1.
+    SH020142  BAL0201            -1.   BAL0242             1.
+    SH020242  COST            513.36   TRAN0202            1.
+    SH020242  BAL0202            -1.   BAL0242             1.
+    SH020342  COST             198.4   TRAN0203            1.
+    SH020342  BAL0203            -1.   BAL0242             1.
+    SH020442  COST             241.8   TRAN0204            1.
+    SH020442  BAL0204            -1.   BAL0242             1.
+    SH020542  COST            447.64   TRAN0205            1.
+    SH020542  BAL0205            -1.   BAL0242             1.
+    SH020642  COST            199.64   TRAN0206            1.
+    SH020642  BAL0252            -1.   BAL0242             1.
+    SH020842  COST            188.48   TRAN0208            1.
+    SH020842  BAL0283            -1.   BAL0242             1.
+    SH020143  COST            197.16   TRAN0201            1.
+    SH020143  BAL0201            -1.   BAL0243             1.
+    SH020243  COST             489.8   TRAN0202            1.
+    SH020243  BAL0202            -1.   BAL0243             1.
+    SH020343  COST               31.   TRAN0203            1.
+    SH020343  BAL0203            -1.   BAL0243             1.
+    SH020443  COST            367.04   TRAN0204            1.
+    SH020443  BAL0204            -1.   BAL0243             1.
+    SH020543  COST            319.92   TRAN0205            1.
+    SH020543  BAL0205            -1.   BAL0243             1.
+    SH020643  COST              124.   TRAN0206            1.
+    SH020643  BAL0252            -1.   BAL0243             1.
+    SH020743  COST            298.84   TRAN0207            1.
+    SH020743  BAL0264            -1.   BAL0243             1.
+    SH020843  COST            336.04   TRAN0208            1.
+    SH020843  BAL0283            -1.   BAL0243             1.
+    SH020144  COST            197.16   TRAN0201            1.
+    SH020144  BAL0201            -1.   BAL0244             1.
+    SH020244  COST            469.96   TRAN0202            1.
+    SH020244  BAL0202            -1.   BAL0244             1.
+    SH020344  COST            158.72   TRAN0203            1.
+    SH020344  BAL0203            -1.   BAL0244             1.
+    SH020444  COST            386.88   TRAN0204            1.
+    SH020444  BAL0204            -1.   BAL0244             1.
+    SH020544  COST             384.4   TRAN0205            1.
+    SH020544  BAL0205            -1.   BAL0244             1.
+    SH020644  COST            110.36   TRAN0206            1.
+    SH020644  BAL0252            -1.   BAL0244             1.
+    SH020844  COST            369.52   TRAN0208            1.
+    SH020844  BAL0283            -1.   BAL0244             1.
+    SH020145  COST            213.28   TRAN0201            1.
+    SH020145  BAL0201            -1.   BAL0245             1.
+    SH020245  COST            540.64   TRAN0202            1.
+    SH020245  BAL0202            -1.   BAL0245             1.
+    SH020345  COST            199.64   TRAN0203            1.
+    SH020345  BAL0203            -1.   BAL0245             1.
+    SH020445  COST            362.08   TRAN0204            1.
+    SH020445  BAL0204            -1.   BAL0245             1.
+    SH020545  COST            290.16   TRAN0205            1.
+    SH020545  BAL0205            -1.   BAL0245             1.
+    SH020645  COST            236.84   TRAN0206            1.
+    SH020645  BAL0252            -1.   BAL0245             1.
+    SH020745  COST            244.28   TRAN0207            1.
+    SH020745  BAL0264            -1.   BAL0245             1.
+    SH020845  COST             378.2   TRAN0208            1.
+    SH020845  BAL0283            -1.   BAL0245             1.
+    SH020146  COST             303.8   TRAN0201            1.
+    SH020146  BAL0201            -1.   BAL0246             1.
+    SH020246  COST            338.52   TRAN0202            1.
+    SH020246  BAL0202            -1.   BAL0246             1.
+    SH020346  COST            274.04   TRAN0203            1.
+    SH020346  BAL0203            -1.   BAL0246             1.
+    SH020446  COST            554.28   TRAN0204            1.
+    SH020446  BAL0204            -1.   BAL0246             1.
+    SH020546  COST             533.2   TRAN0205            1.
+    SH020546  BAL0205            -1.   BAL0246             1.
+    SH020646  COST            318.68   TRAN0206            1.
+    SH020646  BAL0252            -1.   BAL0246             1.
+    SH020846  COST            555.52   TRAN0208            1.
+    SH020846  BAL0283            -1.   BAL0246             1.
+    SH020147  COST             136.4   TRAN0201            1.
+    SH020147  BAL0201            -1.   BAL0247             1.
+    SH020247  COST            462.52   TRAN0202            1.
+    SH020247  BAL0202            -1.   BAL0247             1.
+    SH020347  COST            197.16   TRAN0203            1.
+    SH020347  BAL0203            -1.   BAL0247             1.
+    SH020447  COST            339.76   TRAN0204            1.
+    SH020447  BAL0204            -1.   BAL0247             1.
+    SH020547  COST            288.92   TRAN0205            1.
+    SH020547  BAL0205            -1.   BAL0247             1.
+    SH020647  COST             179.8   TRAN0206            1.
+    SH020647  BAL0252            -1.   BAL0247             1.
+    SH020847  COST            302.56   TRAN0208            1.
+    SH020847  BAL0283            -1.   BAL0247             1.
+    SH020148  COST             117.8   TRAN0201            1.
+    SH020148  BAL0201            -1.   BAL0248             1.
+    SH020248  COST            420.36   TRAN0202            1.
+    SH020248  BAL0202            -1.   BAL0248             1.
+    SH020348  COST            169.88   TRAN0203            1.
+    SH020348  BAL0203            -1.   BAL0248             1.
+    SH020448  COST             285.2   TRAN0204            1.
+    SH020448  BAL0204            -1.   BAL0248             1.
+    SH020548  COST            306.28   TRAN0205            1.
+    SH020548  BAL0205            -1.   BAL0248             1.
+    SH020648  COST             142.6   TRAN0206            1.
+    SH020648  BAL0252            -1.   BAL0248             1.
+    SH020848  COST             241.8   TRAN0208            1.
+    SH020848  BAL0283            -1.   BAL0248             1.
+    SH020149  COST            407.96   TRAN0201            1.
+    SH020149  BAL0201            -1.   BAL0249             1.
+    SH020249  COST             663.4   TRAN0202            1.
+    SH020249  BAL0202            -1.   BAL0249             1.
+    SH020349  COST            411.68   TRAN0203            1.
+    SH020349  BAL0203            -1.   BAL0249             1.
+    SH020449  COST            472.44   TRAN0204            1.
+    SH020449  BAL0204            -1.   BAL0249             1.
+    SH020549  COST            188.48   TRAN0205            1.
+    SH020549  BAL0205            -1.   BAL0249             1.
+    SH020649  COST            419.12   TRAN0206            1.
+    SH020649  BAL0252            -1.   BAL0249             1.
+    SH020749  COST            166.16   TRAN0207            1.
+    SH020749  BAL0264            -1.   BAL0249             1.
+    SH020849  COST            505.92   TRAN0208            1.
+    SH020849  BAL0283            -1.   BAL0249             1.
+    SH020150  COST            298.84   TRAN0201            1.
+    SH020150  BAL0201            -1.   BAL0250             1.
+    SH020250  COST            758.88   TRAN0202            1.
+    SH020250  BAL0202            -1.   BAL0250             1.
+    SH020350  COST            305.04   TRAN0203            1.
+    SH020350  BAL0203            -1.   BAL0250             1.
+    SH020450  COST             452.6   TRAN0204            1.
+    SH020450  BAL0204            -1.   BAL0250             1.
+    SH020550  COST             291.4   TRAN0205            1.
+    SH020550  BAL0205            -1.   BAL0250             1.
+    SH020750  COST            169.88   TRAN0207            1.
+    SH020750  BAL0264            -1.   BAL0250             1.
+    SH020850  COST            503.44   TRAN0208            1.
+    SH020850  BAL0283            -1.   BAL0250             1.
+    SH020151  COST            411.68   TRAN0201            1.
+    SH020151  BAL0201            -1.   BAL0251             1.
+    SH020251  COST              682.   TRAN0202            1.
+    SH020251  BAL0202            -1.   BAL0251             1.
+    SH020351  COST            422.84   TRAN0203            1.
+    SH020351  BAL0203            -1.   BAL0251             1.
+    SH020451  COST            419.12   TRAN0204            1.
+    SH020451  BAL0204            -1.   BAL0251             1.
+    SH020551  COST            152.52   TRAN0205            1.
+    SH020551  BAL0205            -1.   BAL0251             1.
+    SH020751  COST            122.76   TRAN0207            1.
+    SH020751  BAL0264            -1.   BAL0251             1.
+    SH020851  COST            530.72   TRAN0208            1.
+    SH020851  BAL0283            -1.   BAL0251             1.
+    SH020152  COST            138.88   TRAN0201            1.
+    SH020152  BAL0201            -1.   BAL0252             1.
+    SH020252  COST              372.   TRAN0202            1.
+    SH020252  BAL0202            -1.   BAL0252             1.
+    SH020352  COST            101.68   TRAN0203            1.
+    SH020352  BAL0203            -1.   BAL0252             1.
+    SH020452  COST            399.28   TRAN0204            1.
+    SH020452  BAL0204            -1.   BAL0252             1.
+    SH020552  COST             365.8   TRAN0205            1.
+    SH020552  BAL0205            -1.   BAL0252             1.
+    SH020852  COST            313.72   TRAN0208            1.
+    SH020852  BAL0283            -1.   BAL0252             1.
+    SH020153  COST            445.16   TRAN0201            1.
+    SH020153  BAL0201            -1.   BAL0253             1.
+    SH020253  COST            788.64   TRAN0202            1.
+    SH020253  BAL0202            -1.   BAL0253             1.
+    SH020353  COST              403.   TRAN0203            1.
+    SH020353  BAL0203            -1.   BAL0253             1.
+    SH020453  COST            510.88   TRAN0204            1.
+    SH020453  BAL0204            -1.   BAL0253             1.
+    SH020553  COST            228.16   TRAN0205            1.
+    SH020553  BAL0205            -1.   BAL0253             1.
+    SH020653  COST            445.16   TRAN0206            1.
+    SH020653  BAL0252            -1.   BAL0253             1.
+    SH020753  COST            181.04   TRAN0207            1.
+    SH020753  BAL0264            -1.   BAL0253             1.
+    SH020853  COST            499.72   TRAN0208            1.
+    SH020853  BAL0283            -1.   BAL0253             1.
+    SH020154  COST             229.4   TRAN0201            1.
+    SH020154  BAL0201            -1.   BAL0254             1.
+    SH020254  COST             551.8   TRAN0202            1.
+    SH020254  BAL0202            -1.   BAL0254             1.
+    SH020354  COST            269.08   TRAN0203            1.
+    SH020354  BAL0203            -1.   BAL0254             1.
+    SH020454  COST            425.32   TRAN0204            1.
+    SH020454  BAL0204            -1.   BAL0254             1.
+    SH020554  COST            264.12   TRAN0205            1.
+    SH020554  BAL0205            -1.   BAL0254             1.
+    SH020654  COST            251.72   TRAN0206            1.
+    SH020654  BAL0252            -1.   BAL0254             1.
+    SH020854  COST            498.48   TRAN0208            1.
+    SH020854  BAL0283            -1.   BAL0254             1.
+    SH020155  COST            344.72   TRAN0201            1.
+    SH020155  BAL0201            -1.   BAL0255             1.
+    SH020255  COST            593.96   TRAN0202            1.
+    SH020255  BAL0202            -1.   BAL0255             1.
+    SH020355  COST            348.44   TRAN0203            1.
+    SH020355  BAL0203            -1.   BAL0255             1.
+    SH020455  COST            364.56   TRAN0204            1.
+    SH020455  BAL0204            -1.   BAL0255             1.
+    SH020555  COST            190.96   TRAN0205            1.
+    SH020555  BAL0205            -1.   BAL0255             1.
+    SH020655  COST             359.6   TRAN0206            1.
+    SH020655  BAL0252            -1.   BAL0255             1.
+    SH020755  COST            132.68   TRAN0207            1.
+    SH020755  BAL0264            -1.   BAL0255             1.
+    SH020855  COST            364.56   TRAN0208            1.
+    SH020855  BAL0283            -1.   BAL0255             1.
+    SH020156  COST             483.6   TRAN0201            1.
+    SH020156  BAL0201            -1.   BAL0256             1.
+    SH020256  COST            717.96   TRAN0202            1.
+    SH020256  BAL0202            -1.   BAL0256             1.
+    SH020356  COST             378.2   TRAN0203            1.
+    SH020356  BAL0203            -1.   BAL0256             1.
+    SH020456  COST             452.6   TRAN0204            1.
+    SH020456  BAL0204            -1.   BAL0256             1.
+    SH020556  COST            168.64   TRAN0205            1.
+    SH020556  BAL0205            -1.   BAL0256             1.
+    SH020656  COST            420.36   TRAN0206            1.
+    SH020656  BAL0252            -1.   BAL0256             1.
+    SH020756  COST            151.28   TRAN0207            1.
+    SH020756  BAL0264            -1.   BAL0256             1.
+    SH020856  COST            442.68   TRAN0208            1.
+    SH020856  BAL0283            -1.   BAL0256             1.
+    SH020157  COST            323.64   TRAN0201            1.
+    SH020157  BAL0201            -1.   BAL0257             1.
+    SH020257  COST             644.8   TRAN0202            1.
+    SH020257  BAL0202            -1.   BAL0257             1.
+    SH020357  COST             359.6   TRAN0203            1.
+    SH020357  BAL0203            -1.   BAL0257             1.
+    SH020457  COST            290.16   TRAN0204            1.
+    SH020457  BAL0204            -1.   BAL0257             1.
+    SH020557  COST            208.32   TRAN0205            1.
+    SH020557  BAL0205            -1.   BAL0257             1.
+    SH020657  COST            395.56   TRAN0206            1.
+    SH020657  BAL0252            -1.   BAL0257             1.
+    SH020757  COST            183.52   TRAN0207            1.
+    SH020757  BAL0264            -1.   BAL0257             1.
+    SH020857  COST            286.44   TRAN0208            1.
+    SH020857  BAL0283            -1.   BAL0257             1.
+    SH020158  COST            364.56   TRAN0201            1.
+    SH020158  BAL0201            -1.   BAL0258             1.
+    SH020258  COST            646.04   TRAN0202            1.
+    SH020258  BAL0202            -1.   BAL0258             1.
+    SH020358  COST            344.72   TRAN0203            1.
+    SH020358  BAL0203            -1.   BAL0258             1.
+    SH020458  COST            425.32   TRAN0204            1.
+    SH020458  BAL0204            -1.   BAL0258             1.
+    SH020558  COST             26.04   TRAN0205            1.
+    SH020558  BAL0205            -1.   BAL0258             1.
+    SH020658  COST            404.24   TRAN0206            1.
+    SH020658  BAL0252            -1.   BAL0258             1.
+    SH020758  COST             84.32   TRAN0207            1.
+    SH020758  BAL0264            -1.   BAL0258             1.
+    SH020858  COST            314.96   TRAN0208            1.
+    SH020858  BAL0283            -1.   BAL0258             1.
+    SH020159  COST            255.44   TRAN0201            1.
+    SH020159  BAL0201            -1.   BAL0259             1.
+    SH020259  COST            617.52   TRAN0202            1.
+    SH020259  BAL0202            -1.   BAL0259             1.
+    SH020359  COST            295.12   TRAN0203            1.
+    SH020359  BAL0203            -1.   BAL0259             1.
+    SH020459  COST            302.56   TRAN0204            1.
+    SH020459  BAL0204            -1.   BAL0259             1.
+    SH020559  COST            197.16   TRAN0205            1.
+    SH020559  BAL0205            -1.   BAL0259             1.
+    SH020659  COST            368.28   TRAN0206            1.
+    SH020659  BAL0252            -1.   BAL0259             1.
+    SH020759  COST             130.2   TRAN0207            1.
+    SH020759  BAL0264            -1.   BAL0259             1.
+    SH020859  COST             316.2   TRAN0208            1.
+    SH020859  BAL0283            -1.   BAL0259             1.
+    SH020160  COST            323.64   TRAN0201            1.
+    SH020160  BAL0201            -1.   BAL0260             1.
+    SH020260  COST              682.   TRAN0202            1.
+    SH020260  BAL0202            -1.   BAL0260             1.
+    SH020360  COST            350.92   TRAN0203            1.
+    SH020360  BAL0203            -1.   BAL0260             1.
+    SH020460  COST            386.88   TRAN0204            1.
+    SH020460  BAL0204            -1.   BAL0260             1.
+    SH020560  COST             167.4   TRAN0205            1.
+    SH020560  BAL0205            -1.   BAL0260             1.
+    SH020660  COST            400.52   TRAN0206            1.
+    SH020660  BAL0252            -1.   BAL0260             1.
+    SH020760  COST            109.12   TRAN0207            1.
+    SH020760  BAL0264            -1.   BAL0260             1.
+    SH020860  COST            370.76   TRAN0208            1.
+    SH020860  BAL0283            -1.   BAL0260             1.
+    SH020163  COST            329.84   TRAN0201            1.
+    SH020163  BAL0201            -1.   BAL0263             1.
+    SH020263  COST            612.56   TRAN0202            1.
+    SH020263  BAL0202            -1.   BAL0263             1.
+    SH020363  COST            355.88   TRAN0203            1.
+    SH020363  BAL0203            -1.   BAL0263             1.
+    SH020463  COST            457.56   TRAN0204            1.
+    SH020463  BAL0204            -1.   BAL0263             1.
+    SH020563  COST            188.48   TRAN0205            1.
+    SH020563  BAL0205            -1.   BAL0263             1.
+    SH020663  COST             390.6   TRAN0206            1.
+    SH020663  BAL0252            -1.   BAL0263             1.
+    SH020763  COST            153.76   TRAN0207            1.
+    SH020763  BAL0264            -1.   BAL0263             1.
+    SH020863  COST              496.   TRAN0208            1.
+    SH020863  BAL0283            -1.   BAL0263             1.
+    SH020164  COST            246.76   TRAN0201            1.
+    SH020164  BAL0201            -1.   BAL0264             1.
+    SH020264  COST            652.24   TRAN0202            1.
+    SH020264  BAL0202            -1.   BAL0264             1.
+    SH020364  COST            276.52   TRAN0203            1.
+    SH020364  BAL0203            -1.   BAL0264             1.
+    SH020464  COST            416.64   TRAN0204            1.
+    SH020464  BAL0204            -1.   BAL0264             1.
+    SH020564  COST             71.92   TRAN0205            1.
+    SH020564  BAL0205            -1.   BAL0264             1.
+    SH020664  COST            393.08   TRAN0206            1.
+    SH020664  BAL0252            -1.   BAL0264             1.
+    SH020864  COST              310.   TRAN0208            1.
+    SH020864  BAL0283            -1.   BAL0264             1.
+    SH020165  COST            535.68   TRAN0201            1.
+    SH020165  BAL0201            -1.   BAL0265             1.
+    SH020265  COST            380.68   TRAN0202            1.
+    SH020265  BAL0202            -1.   BAL0265             1.
+    SH020365  COST             626.2   TRAN0203            1.
+    SH020365  BAL0203            -1.   BAL0265             1.
+    SH020465  COST            481.12   TRAN0204            1.
+    SH020465  BAL0204            -1.   BAL0265             1.
+    SH020565  COST            748.96   TRAN0205            1.
+    SH020565  BAL0205            -1.   BAL0265             1.
+    SH020865  COST             514.6   TRAN0208            1.
+    SH020865  BAL0283            -1.   BAL0265             1.
+    SH020166  COST             694.4   TRAN0201            1.
+    SH020166  BAL0201            -1.   BAL0266             1.
+    SH020266  COST            321.16   TRAN0202            1.
+    SH020266  BAL0202            -1.   BAL0266             1.
+    SH020366  COST            716.72   TRAN0203            1.
+    SH020366  BAL0203            -1.   BAL0266             1.
+    SH020466  COST            689.44   TRAN0204            1.
+    SH020466  BAL0204            -1.   BAL0266             1.
+    SH020566  COST             880.4   TRAN0205            1.
+    SH020566  BAL0205            -1.   BAL0266             1.
+    SH020866  COST             694.4   TRAN0208            1.
+    SH020866  BAL0283            -1.   BAL0266             1.
+    SH020167  COST              527.   TRAN0201            1.
+    SH020167  BAL0201            -1.   BAL0267             1.
+    SH020267  COST            287.68   TRAN0202            1.
+    SH020267  BAL0202            -1.   BAL0267             1.
+    SH020367  COST            611.32   TRAN0203            1.
+    SH020367  BAL0203            -1.   BAL0267             1.
+    SH020467  COST            566.68   TRAN0204            1.
+    SH020467  BAL0204            -1.   BAL0267             1.
+    SH020567  COST            748.96   TRAN0205            1.
+    SH020567  BAL0205            -1.   BAL0267             1.
+    SH020867  COST            567.92   TRAN0208            1.
+    SH020867  BAL0283            -1.   BAL0267             1.
+    SH020168  COST            736.56   TRAN0201            1.
+    SH020168  BAL0201            -1.   BAL0268             1.
+    SH020268  COST              496.   TRAN0202            1.
+    SH020268  BAL0202            -1.   BAL0268             1.
+    SH020368  COST             694.4   TRAN0203            1.
+    SH020368  BAL0203            -1.   BAL0268             1.
+    SH020468  COST            870.48   TRAN0204            1.
+    SH020468  BAL0204            -1.   BAL0268             1.
+    SH020568  COST           1173.04   TRAN0205            1.
+    SH020568  BAL0205            -1.   BAL0268             1.
+    SH020868  COST            931.24   TRAN0208            1.
+    SH020868  BAL0283            -1.   BAL0268             1.
+    SH020169  COST            668.36   TRAN0201            1.
+    SH020169  BAL0201            -1.   BAL0269             1.
+    SH020269  COST            274.04   TRAN0202            1.
+    SH020269  BAL0202            -1.   BAL0269             1.
+    SH020369  COST             632.4   TRAN0203            1.
+    SH020369  BAL0203            -1.   BAL0269             1.
+    SH020469  COST            771.28   TRAN0204            1.
+    SH020469  BAL0204            -1.   BAL0269             1.
+    SH020569  COST            801.04   TRAN0205            1.
+    SH020569  BAL0205            -1.   BAL0269             1.
+    SH020869  COST            815.92   TRAN0208            1.
+    SH020869  BAL0283            -1.   BAL0269             1.
+    SH020171  COST             545.6   TRAN0201            1.
+    SH020171  BAL0201            -1.   BAL0271             1.
+    SH020371  COST            649.76   TRAN0203            1.
+    SH020371  BAL0203            -1.   BAL0271             1.
+    SH020471  COST            646.04   TRAN0204            1.
+    SH020471  BAL0204            -1.   BAL0271             1.
+    SH020571  COST            720.44   TRAN0205            1.
+    SH020571  BAL0205            -1.   BAL0271             1.
+    SH020671  COST            484.84   TRAN0206            1.
+    SH020671  BAL0252            -1.   BAL0271             1.
+    SH020771  COST            872.96   TRAN0207            1.
+    SH020771  BAL0264            -1.   BAL0271             1.
+    SH020871  COST            660.92   TRAN0208            1.
+    SH020871  BAL0283            -1.   BAL0271             1.
+    SH020172  COST            727.88   TRAN0201            1.
+    SH020172  BAL0201            -1.   BAL0272             1.
+    SH020272  COST            673.32   TRAN0202            1.
+    SH020272  BAL0202            -1.   BAL0272             1.
+    SH020372  COST            765.08   TRAN0203            1.
+    SH020372  BAL0203            -1.   BAL0272             1.
+    SH020472  COST             706.8   TRAN0204            1.
+    SH020472  BAL0204            -1.   BAL0272             1.
+    SH020572  COST            946.12   TRAN0205            1.
+    SH020572  BAL0205            -1.   BAL0272             1.
+    SH020872  COST             706.8   TRAN0208            1.
+    SH020872  BAL0283            -1.   BAL0272             1.
+    SH020173  COST             483.6   TRAN0201            1.
+    SH020173  BAL0201            -1.   BAL0273             1.
+    SH020273  COST             452.6   TRAN0202            1.
+    SH020273  BAL0202            -1.   BAL0273             1.
+    SH020373  COST            419.12   TRAN0203            1.
+    SH020373  BAL0203            -1.   BAL0273             1.
+    SH020473  COST            566.68   TRAN0204            1.
+    SH020473  BAL0204            -1.   BAL0273             1.
+    SH020573  COST            699.36   TRAN0205            1.
+    SH020573  BAL0205            -1.   BAL0273             1.
+    SH020673  COST             378.2   TRAN0206            1.
+    SH020673  BAL0252            -1.   BAL0273             1.
+    SH020873  COST            624.96   TRAN0208            1.
+    SH020873  BAL0283            -1.   BAL0273             1.
+    SH020174  COST            679.52   TRAN0201            1.
+    SH020174  BAL0201            -1.   BAL0274             1.
+    SH020274  COST             260.4   TRAN0202            1.
+    SH020274  BAL0202            -1.   BAL0274             1.
+    SH020374  COST             706.8   TRAN0203            1.
+    SH020374  BAL0203            -1.   BAL0274             1.
+    SH020474  COST            789.88   TRAN0204            1.
+    SH020474  BAL0204            -1.   BAL0274             1.
+    SH020574  COST            908.92   TRAN0205            1.
+    SH020574  BAL0205            -1.   BAL0274             1.
+    SH020874  COST            767.56   TRAN0208            1.
+    SH020874  BAL0283            -1.   BAL0274             1.
+    SH020275  COST            686.96   TRAN0202            1.
+    SH020275  BAL0202            -1.   BAL0275             1.
+    SH020176  COST            572.88   TRAN0201            1.
+    SH020176  BAL0201            -1.   BAL0276             1.
+    SH020276  COST            497.24   TRAN0202            1.
+    SH020276  BAL0202            -1.   BAL0276             1.
+    SH020376  COST            499.72   TRAN0203            1.
+    SH020376  BAL0203            -1.   BAL0276             1.
+    SH020476  COST             781.2   TRAN0204            1.
+    SH020476  BAL0204            -1.   BAL0276             1.
+    SH020576  COST             781.2   TRAN0205            1.
+    SH020576  BAL0205            -1.   BAL0276             1.
+    SH020676  COST            472.44   TRAN0206            1.
+    SH020676  BAL0252            -1.   BAL0276             1.
+    SH020876  COST            963.48   TRAN0208            1.
+    SH020876  BAL0283            -1.   BAL0276             1.
+    SH020177  COST             539.4   TRAN0201            1.
+    SH020177  BAL0201            -1.   BAL0277             1.
+    SH020277  COST            337.28   TRAN0202            1.
+    SH020277  BAL0202            -1.   BAL0277             1.
+    SH020377  COST            571.64   TRAN0203            1.
+    SH020377  BAL0203            -1.   BAL0277             1.
+    SH020477  COST            497.24   TRAN0204            1.
+    SH020477  BAL0204            -1.   BAL0277             1.
+    SH020577  COST             694.4   TRAN0205            1.
+    SH020577  BAL0205            -1.   BAL0277             1.
+    SH020877  COST             396.8   TRAN0208            1.
+    SH020877  BAL0283            -1.   BAL0277             1.
+    SH020178  COST            943.64   TRAN0201            1.
+    SH020178  BAL0201            -1.   BAL0278             1.
+    SH020278  COST            548.08   TRAN0202            1.
+    SH020278  BAL0202            -1.   BAL0278             1.
+    SH020378  COST            970.92   TRAN0203            1.
+    SH020378  BAL0203            -1.   BAL0278             1.
+    SH020478  COST             849.4   TRAN0204            1.
+    SH020478  BAL0204            -1.   BAL0278             1.
+    SH020578  COST           1089.96   TRAN0205            1.
+    SH020578  BAL0205            -1.   BAL0278             1.
+    SH020878  COST            949.84   TRAN0208            1.
+    SH020878  BAL0283            -1.   BAL0278             1.
+    SH020179  COST             886.6   TRAN0201            1.
+    SH020179  BAL0201            -1.   BAL0279             1.
+    SH020279  COST            333.56   TRAN0202            1.
+    SH020279  BAL0202            -1.   BAL0279             1.
+    SH020379  COST            856.84   TRAN0203            1.
+    SH020379  BAL0203            -1.   BAL0279             1.
+    SH020479  COST             892.8   TRAN0204            1.
+    SH020479  BAL0204            -1.   BAL0279             1.
+    SH020879  COST            875.44   TRAN0208            1.
+    SH020879  BAL0283            -1.   BAL0279             1.
+    SH020180  COST            393.08   TRAN0201            1.
+    SH020180  BAL0201            -1.   BAL0280             1.
+    SH020280  COST             489.8   TRAN0202            1.
+    SH020280  BAL0202            -1.   BAL0280             1.
+    SH020380  COST            541.88   TRAN0203            1.
+    SH020380  BAL0203            -1.   BAL0280             1.
+    SH020480  COST            463.76   TRAN0204            1.
+    SH020480  BAL0204            -1.   BAL0280             1.
+    SH020580  COST             626.2   TRAN0205            1.
+    SH020580  BAL0205            -1.   BAL0280             1.
+    SH020880  COST             297.6   TRAN0208            1.
+    SH020880  BAL0283            -1.   BAL0280             1.
+    SH020182  COST            721.68   TRAN0201            1.
+    SH020182  BAL0201            -1.   BAL0282             1.
+    SH020282  COST            407.96   TRAN0202            1.
+    SH020282  BAL0202            -1.   BAL0282             1.
+    SH020382  COST             812.2   TRAN0203            1.
+    SH020382  BAL0203            -1.   BAL0282             1.
+    SH020482  COST            875.44   TRAN0204            1.
+    SH020482  BAL0204            -1.   BAL0282             1.
+    SH020582  COST           1422.28   TRAN0205            1.
+    SH020582  BAL0205            -1.   BAL0282             1.
+    SH020882  COST            970.92   TRAN0208            1.
+    SH020882  BAL0283            -1.   BAL0282             1.
+    SH020183  COST            219.48   TRAN0201            1.
+    SH020183  BAL0201            -1.   BAL0283             1.
+    SH020283  COST             644.8   TRAN0202            1.
+    SH020283  BAL0202            -1.   BAL0283             1.
+    SH020383  COST            337.28   TRAN0203            1.
+    SH020383  BAL0203            -1.   BAL0283             1.
+    SH020483  COST             73.16   TRAN0204            1.
+    SH020483  BAL0204            -1.   BAL0283             1.
+    SH020583  COST            430.28   TRAN0205            1.
+    SH020583  BAL0205            -1.   BAL0283             1.
+    SH020683  COST            307.52   TRAN0206            1.
+    SH020683  BAL0252            -1.   BAL0283             1.
+    SH020184  COST            376.96   TRAN0201            1.
+    SH020184  BAL0201            -1.   BAL0284             1.
+    SH020284  COST            238.08   TRAN0202            1.
+    SH020284  BAL0202            -1.   BAL0284             1.
+    SH020384  COST            451.36   TRAN0203            1.
+    SH020384  BAL0203            -1.   BAL0284             1.
+    SH020484  COST             458.8   TRAN0204            1.
+    SH020484  BAL0204            -1.   BAL0284             1.
+    SH020584  COST             607.6   TRAN0205            1.
+    SH020584  BAL0205            -1.   BAL0284             1.
+    SH020684  COST             378.2   TRAN0206            1.
+    SH020684  BAL0252            -1.   BAL0284             1.
+    SH020884  COST            481.12   TRAN0208            1.
+    SH020884  BAL0283            -1.   BAL0284             1.
+    SH030201  COST            368.28   TRAN0302            1.
+    SH030201  BAL0302            -1.   BAL0301             1.
+    SH030301  COST            141.36   TRAN0303            1.
+    SH030301  BAL0303            -1.   BAL0301             1.
+    SH030401  COST            257.92   TRAN0304            1.
+    SH030401  BAL0304            -1.   BAL0301             1.
+    SH030501  COST            293.88   TRAN0305            1.
+    SH030501  BAL0305            -1.   BAL0301             1.
+    SH030601  COST            156.24   TRAN0306            1.
+    SH030601  BAL0352            -1.   BAL0301             1.
+    SH030801  COST            177.32   TRAN0308            1.
+    SH030801  BAL0383            -1.   BAL0301             1.
+    SH030102  COST            587.76   TRAN0301            1.
+    SH030102  BAL0301            -1.   BAL0302             1.
+    SH030302  COST            517.08   TRAN0303            1.
+    SH030302  BAL0303            -1.   BAL0302             1.
+    SH030402  COST            758.88   TRAN0304            1.
+    SH030402  BAL0304            -1.   BAL0302             1.
+    SH030502  COST            918.84   TRAN0305            1.
+    SH030502  BAL0305            -1.   BAL0302             1.
+    SH030602  COST            468.72   TRAN0306            1.
+    SH030602  BAL0352            -1.   BAL0302             1.
+    SH030802  COST            646.04   TRAN0308            1.
+    SH030802  BAL0383            -1.   BAL0302             1.
+    SH030103  COST             303.8   TRAN0301            1.
+    SH030103  BAL0301            -1.   BAL0303             1.
+    SH030203  COST            587.76   TRAN0302            1.
+    SH030203  BAL0302            -1.   BAL0303             1.
+    SH030403  COST            455.08   TRAN0304            1.
+    SH030403  BAL0304            -1.   BAL0303             1.
+    SH030503  COST            352.16   TRAN0305            1.
+    SH030503  BAL0305            -1.   BAL0303             1.
+    SH030603  COST             111.6   TRAN0306            1.
+    SH030603  BAL0352            -1.   BAL0303             1.
+    SH030803  COST             316.2   TRAN0308            1.
+    SH030803  BAL0383            -1.   BAL0303             1.
+    SH030104  COST            215.76   TRAN0301            1.
+    SH030104  BAL0301            -1.   BAL0304             1.
+    SH030204  COST            623.72   TRAN0302            1.
+    SH030204  BAL0302            -1.   BAL0304             1.
+    SH030304  COST            301.32   TRAN0303            1.
+    SH030304  BAL0303            -1.   BAL0304             1.
+    SH030504  COST            395.56   TRAN0305            1.
+    SH030504  BAL0305            -1.   BAL0304             1.
+    SH030604  COST             303.8   TRAN0306            1.
+    SH030604  BAL0352            -1.   BAL0304             1.
+    SH030704  COST            333.56   TRAN0307            1.
+    SH030704  BAL0364            -1.   BAL0304             1.
+    SH030804  COST             71.92   TRAN0308            1.
+    SH030804  BAL0383            -1.   BAL0304             1.
+    SH030105  COST             334.8   TRAN0301            1.
+    SH030105  BAL0301            -1.   BAL0305             1.
+    SH030205  COST            639.84   TRAN0302            1.
+    SH030205  BAL0302            -1.   BAL0305             1.
+    SH030305  COST            352.16   TRAN0303            1.
+    SH030305  BAL0303            -1.   BAL0305             1.
+    SH030405  COST             353.4   TRAN0304            1.
+    SH030405  BAL0304            -1.   BAL0305             1.
+    SH030605  COST            404.24   TRAN0306            1.
+    SH030605  BAL0352            -1.   BAL0305             1.
+    SH030705  COST            414.16   TRAN0307            1.
+    SH030705  BAL0364            -1.   BAL0305             1.
+    SH030805  COST            336.04   TRAN0308            1.
+    SH030805  BAL0383            -1.   BAL0305             1.
+    SH030106  COST            246.76   TRAN0301            1.
+    SH030106  BAL0301            -1.   BAL0306             1.
+    SH030206  COST            517.08   TRAN0302            1.
+    SH030206  BAL0302            -1.   BAL0306             1.
+    SH030306  COST            264.12   TRAN0303            1.
+    SH030306  BAL0303            -1.   BAL0306             1.
+    SH030406  COST            271.56   TRAN0304            1.
+    SH030406  BAL0304            -1.   BAL0306             1.
+    SH030506  COST            312.48   TRAN0305            1.
+    SH030506  BAL0305            -1.   BAL0306             1.
+    SH030606  COST            255.44   TRAN0306            1.
+    SH030606  BAL0352            -1.   BAL0306             1.
+    SH030706  COST              248.   TRAN0307            1.
+    SH030706  BAL0364            -1.   BAL0306             1.
+    SH030806  COST            187.24   TRAN0308            1.
+    SH030806  BAL0383            -1.   BAL0306             1.
+    SH030107  COST             26.04   TRAN0301            1.
+    SH030107  BAL0301            -1.   BAL0307             1.
+    SH030207  COST            362.08   TRAN0302            1.
+    SH030207  BAL0302            -1.   BAL0307             1.
+    SH030307  COST            153.76   TRAN0303            1.
+    SH030307  BAL0303            -1.   BAL0307             1.
+    SH030407  COST            256.68   TRAN0304            1.
+    SH030407  BAL0304            -1.   BAL0307             1.
+    SH030507  COST            283.96   TRAN0305            1.
+    SH030507  BAL0305            -1.   BAL0307             1.
+    SH030607  COST              155.   TRAN0306            1.
+    SH030607  BAL0352            -1.   BAL0307             1.
+    SH030707  COST            287.68   TRAN0307            1.
+    SH030707  BAL0364            -1.   BAL0307             1.
+    SH030807  COST             192.2   TRAN0308            1.
+    SH030807  BAL0383            -1.   BAL0307             1.
+    SH030108  COST             81.84   TRAN0301            1.
+    SH030108  BAL0301            -1.   BAL0308             1.
+    SH030208  COST            466.24   TRAN0302            1.
+    SH030208  BAL0302            -1.   BAL0308             1.
+    SH030308  COST            174.84   TRAN0303            1.
+    SH030308  BAL0303            -1.   BAL0308             1.
+    SH030408  COST            306.28   TRAN0304            1.
+    SH030408  BAL0304            -1.   BAL0308             1.
+    SH030508  COST            225.68   TRAN0305            1.
+    SH030508  BAL0305            -1.   BAL0308             1.
+    SH030608  COST            205.84   TRAN0306            1.
+    SH030608  BAL0352            -1.   BAL0308             1.
+    SH030808  COST            231.88   TRAN0308            1.
+    SH030808  BAL0383            -1.   BAL0308             1.
+    SH030109  COST            171.12   TRAN0301            1.
+    SH030109  BAL0301            -1.   BAL0309             1.
+    SH030209  COST            474.92   TRAN0302            1.
+    SH030209  BAL0302            -1.   BAL0309             1.
+    SH030309  COST            208.32   TRAN0303            1.
+    SH030309  BAL0303            -1.   BAL0309             1.
+    SH030409  COST            313.72   TRAN0304            1.
+    SH030409  BAL0304            -1.   BAL0309             1.
+    SH030509  COST            296.36   TRAN0305            1.
+    SH030509  BAL0305            -1.   BAL0309             1.
+    SH030709  COST            243.04   TRAN0307            1.
+    SH030709  BAL0364            -1.   BAL0309             1.
+    SH030809  COST            240.56   TRAN0308            1.
+    SH030809  BAL0383            -1.   BAL0309             1.
+    SH030110  COST            306.28   TRAN0301            1.
+    SH030110  BAL0301            -1.   BAL0310             1.
+    SH030210  COST            195.92   TRAN0302            1.
+    SH030210  BAL0302            -1.   BAL0310             1.
+    SH030310  COST             297.6   TRAN0303            1.
+    SH030310  BAL0303            -1.   BAL0310             1.
+    SH030410  COST            445.16   TRAN0304            1.
+    SH030410  BAL0304            -1.   BAL0310             1.
+    SH030510  COST             477.4   TRAN0305            1.
+    SH030510  BAL0305            -1.   BAL0310             1.
+    SH030610  COST              279.   TRAN0306            1.
+    SH030610  BAL0352            -1.   BAL0310             1.
+    SH030810  COST             378.2   TRAN0308            1.
+    SH030810  BAL0383            -1.   BAL0310             1.
+    SH030111  COST            131.44   TRAN0301            1.
+    SH030111  BAL0301            -1.   BAL0311             1.
+    SH030211  COST             613.8   TRAN0302            1.
+    SH030211  BAL0302            -1.   BAL0311             1.
+    SH030311  COST            307.52   TRAN0303            1.
+    SH030311  BAL0303            -1.   BAL0311             1.
+    SH030411  COST            172.36   TRAN0304            1.
+    SH030411  BAL0304            -1.   BAL0311             1.
+    SH030511  COST            422.84   TRAN0305            1.
+    SH030511  BAL0305            -1.   BAL0311             1.
+    SH030611  COST            243.04   TRAN0306            1.
+    SH030611  BAL0352            -1.   BAL0311             1.
+    SH030811  COST            126.48   TRAN0308            1.
+    SH030811  BAL0383            -1.   BAL0311             1.
+    SH030112  COST            109.12   TRAN0301            1.
+    SH030112  BAL0301            -1.   BAL0312             1.
+    SH030212  COST            420.36   TRAN0302            1.
+    SH030212  BAL0302            -1.   BAL0312             1.
+    SH030312  COST            181.04   TRAN0303            1.
+    SH030312  BAL0303            -1.   BAL0312             1.
+    SH030412  COST              248.   TRAN0304            1.
+    SH030412  BAL0304            -1.   BAL0312             1.
+    SH030512  COST            331.08   TRAN0305            1.
+    SH030512  BAL0305            -1.   BAL0312             1.
+    SH030612  COST             179.8   TRAN0306            1.
+    SH030612  BAL0352            -1.   BAL0312             1.
+    SH030812  COST            181.04   TRAN0308            1.
+    SH030812  BAL0383            -1.   BAL0312             1.
+    SH030114  COST            176.08   TRAN0301            1.
+    SH030114  BAL0301            -1.   BAL0314             1.
+    SH030214  COST            510.88   TRAN0302            1.
+    SH030214  BAL0302            -1.   BAL0314             1.
+    SH030314  COST            243.04   TRAN0303            1.
+    SH030314  BAL0303            -1.   BAL0314             1.
+    SH030414  COST            246.76   TRAN0304            1.
+    SH030414  BAL0304            -1.   BAL0314             1.
+    SH030514  COST            436.48   TRAN0305            1.
+    SH030514  BAL0305            -1.   BAL0314             1.
+    SH030614  COST            233.12   TRAN0306            1.
+    SH030614  BAL0352            -1.   BAL0314             1.
+    SH030814  COST            156.24   TRAN0308            1.
+    SH030814  BAL0383            -1.   BAL0314             1.
+    SH030115  COST            375.72   TRAN0301            1.
+    SH030115  BAL0301            -1.   BAL0315             1.
+    SH030215  COST            197.16   TRAN0302            1.
+    SH030215  BAL0302            -1.   BAL0315             1.
+    SH030315  COST            290.16   TRAN0303            1.
+    SH030315  BAL0303            -1.   BAL0315             1.
+    SH030415  COST            590.24   TRAN0304            1.
+    SH030415  BAL0304            -1.   BAL0315             1.
+    SH030515  COST            493.52   TRAN0305            1.
+    SH030515  BAL0305            -1.   BAL0315             1.
+    SH030615  COST            233.12   TRAN0306            1.
+    SH030615  BAL0352            -1.   BAL0315             1.
+    SH030815  COST            462.52   TRAN0308            1.
+    SH030815  BAL0383            -1.   BAL0315             1.
+    SH030116  COST            195.92   TRAN0301            1.
+    SH030116  BAL0301            -1.   BAL0316             1.
+    SH030216  COST             347.2   TRAN0302            1.
+    SH030216  BAL0302            -1.   BAL0316             1.
+    SH030316  COST            281.48   TRAN0303            1.
+    SH030316  BAL0303            -1.   BAL0316             1.
+    SH030416  COST            355.88   TRAN0304            1.
+    SH030416  BAL0304            -1.   BAL0316             1.
+    SH030516  COST            395.56   TRAN0305            1.
+    SH030516  BAL0305            -1.   BAL0316             1.
+    SH030616  COST            162.44   TRAN0306            1.
+    SH030616  BAL0352            -1.   BAL0316             1.
+    SH030816  COST             254.2   TRAN0308            1.
+    SH030816  BAL0383            -1.   BAL0316             1.
+    SH030117  COST            187.24   TRAN0301            1.
+    SH030117  BAL0301            -1.   BAL0317             1.
+    SH030217  COST             626.2   TRAN0302            1.
+    SH030217  BAL0302            -1.   BAL0317             1.
+    SH030317  COST            339.76   TRAN0303            1.
+    SH030317  BAL0303            -1.   BAL0317             1.
+    SH030417  COST             70.68   TRAN0304            1.
+    SH030417  BAL0304            -1.   BAL0317             1.
+    SH030517  COST            369.52   TRAN0305            1.
+    SH030517  BAL0305            -1.   BAL0317             1.
+    SH030717  COST             365.8   TRAN0307            1.
+    SH030717  BAL0364            -1.   BAL0317             1.
+    SH030817  COST             33.48   TRAN0308            1.
+    SH030817  BAL0383            -1.   BAL0317             1.
+    SH030118  COST              217.   TRAN0301            1.
+    SH030118  BAL0301            -1.   BAL0318             1.
+    SH030218  COST            447.64   TRAN0302            1.
+    SH030218  BAL0302            -1.   BAL0318             1.
+    SH030318  COST             334.8   TRAN0303            1.
+    SH030318  BAL0303            -1.   BAL0318             1.
+    SH030418  COST            190.96   TRAN0304            1.
+    SH030418  BAL0304            -1.   BAL0318             1.
+    SH030518  COST            504.68   TRAN0305            1.
+    SH030518  BAL0305            -1.   BAL0318             1.
+    SH030618  COST            436.48   TRAN0306            1.
+    SH030618  BAL0352            -1.   BAL0318             1.
+    SH030818  COST            127.72   TRAN0308            1.
+    SH030818  BAL0383            -1.   BAL0318             1.
+    SH030119  COST            307.52   TRAN0301            1.
+    SH030119  BAL0301            -1.   BAL0319             1.
+    SH030219  COST            851.88   TRAN0302            1.
+    SH030219  BAL0302            -1.   BAL0319             1.
+    SH030319  COST            393.08   TRAN0303            1.
+    SH030319  BAL0303            -1.   BAL0319             1.
+    SH030419  COST            197.16   TRAN0304            1.
+    SH030419  BAL0304            -1.   BAL0319             1.
+    SH030519  COST            257.92   TRAN0305            1.
+    SH030519  BAL0305            -1.   BAL0319             1.
+    SH030619  COST             427.8   TRAN0306            1.
+    SH030619  BAL0352            -1.   BAL0319             1.
+    SH030819  COST            122.76   TRAN0308            1.
+    SH030819  BAL0383            -1.   BAL0319             1.
+    SH030120  COST             254.2   TRAN0301            1.
+    SH030120  BAL0301            -1.   BAL0320             1.
+    SH030220  COST            846.92   TRAN0302            1.
+    SH030220  BAL0302            -1.   BAL0320             1.
+    SH030320  COST            368.28   TRAN0303            1.
+    SH030320  BAL0303            -1.   BAL0320             1.
+    SH030420  COST            140.12   TRAN0304            1.
+    SH030420  BAL0304            -1.   BAL0320             1.
+    SH030520  COST            360.84   TRAN0305            1.
+    SH030520  BAL0305            -1.   BAL0320             1.
+    SH030820  COST            156.24   TRAN0308            1.
+    SH030820  BAL0383            -1.   BAL0320             1.
+    SH030121  COST            499.72   TRAN0301            1.
+    SH030121  BAL0301            -1.   BAL0321             1.
+    SH030221  COST            456.32   TRAN0302            1.
+    SH030221  BAL0302            -1.   BAL0321             1.
+    SH030321  COST            553.04   TRAN0303            1.
+    SH030321  BAL0303            -1.   BAL0321             1.
+    SH030421  COST             396.8   TRAN0304            1.
+    SH030421  BAL0304            -1.   BAL0321             1.
+    SH030521  COST              682.   TRAN0305            1.
+    SH030521  BAL0305            -1.   BAL0321             1.
+    SH030821  COST             396.8   TRAN0308            1.
+    SH030821  BAL0383            -1.   BAL0321             1.
+    SH030122  COST            307.52   TRAN0301            1.
+    SH030122  BAL0301            -1.   BAL0322             1.
+    SH030222  COST            716.72   TRAN0302            1.
+    SH030222  BAL0302            -1.   BAL0322             1.
+    SH030322  COST            370.76   TRAN0303            1.
+    SH030322  BAL0303            -1.   BAL0322             1.
+    SH030422  COST            277.76   TRAN0304            1.
+    SH030422  BAL0304            -1.   BAL0322             1.
+    SH030522  COST            221.96   TRAN0305            1.
+    SH030522  BAL0305            -1.   BAL0322             1.
+    SH030622  COST             384.4   TRAN0306            1.
+    SH030622  BAL0352            -1.   BAL0322             1.
+    SH030822  COST            172.36   TRAN0308            1.
+    SH030822  BAL0383            -1.   BAL0322             1.
+    SH030123  COST            290.16   TRAN0301            1.
+    SH030123  BAL0301            -1.   BAL0323             1.
+    SH030223  COST            670.84   TRAN0302            1.
+    SH030223  BAL0302            -1.   BAL0323             1.
+    SH030323  COST            355.88   TRAN0303            1.
+    SH030323  BAL0303            -1.   BAL0323             1.
+    SH030423  COST            207.08   TRAN0304            1.
+    SH030423  BAL0304            -1.   BAL0323             1.
+    SH030523  COST            205.84   TRAN0305            1.
+    SH030523  BAL0305            -1.   BAL0323             1.
+    SH030823  COST            172.36   TRAN0308            1.
+    SH030823  BAL0383            -1.   BAL0323             1.
+    SH030124  COST           1780.64   TRAN0301            1.
+    SH030124  BAL0301            -1.   BAL0324             1.
+    SH030125  COST            479.88   TRAN0301            1.
+    SH030125  BAL0301            -1.   BAL0325             1.
+    SH030225  COST            529.48   TRAN0302            1.
+    SH030225  BAL0302            -1.   BAL0325             1.
+    SH030325  COST            633.64   TRAN0303            1.
+    SH030325  BAL0303            -1.   BAL0325             1.
+    SH030425  COST            431.52   TRAN0304            1.
+    SH030425  BAL0304            -1.   BAL0325             1.
+    SH030525  COST            701.84   TRAN0305            1.
+    SH030525  BAL0305            -1.   BAL0325             1.
+    SH030625  COST            499.72   TRAN0306            1.
+    SH030625  BAL0352            -1.   BAL0325             1.
+    SH030825  COST             378.2   TRAN0308            1.
+    SH030825  BAL0383            -1.   BAL0325             1.
+    SH030426  COST             334.8   TRAN0304            1.
+    SH030426  BAL0304            -1.   BAL0326             1.
+    SH030127  COST            290.16   TRAN0301            1.
+    SH030127  BAL0301            -1.   BAL0327             1.
+    SH030227  COST            352.16   TRAN0302            1.
+    SH030227  BAL0302            -1.   BAL0327             1.
+    SH030327  COST            358.36   TRAN0303            1.
+    SH030327  BAL0303            -1.   BAL0327             1.
+    SH030427  COST             415.4   TRAN0304            1.
+    SH030427  BAL0304            -1.   BAL0327             1.
+    SH030527  COST            468.72   TRAN0305            1.
+    SH030527  BAL0305            -1.   BAL0327             1.
+    SH030627  COST            332.32   TRAN0306            1.
+    SH030627  BAL0352            -1.   BAL0327             1.
+    SH030827  COST            312.48   TRAN0308            1.
+    SH030827  BAL0383            -1.   BAL0327             1.
+    SH030128  COST            301.32   TRAN0301            1.
+    SH030128  BAL0301            -1.   BAL0328             1.
+    SH030228  COST            705.56   TRAN0302            1.
+    SH030228  BAL0302            -1.   BAL0328             1.
+    SH030328  COST            367.04   TRAN0303            1.
+    SH030328  BAL0303            -1.   BAL0328             1.
+    SH030428  COST             365.8   TRAN0304            1.
+    SH030428  BAL0304            -1.   BAL0328             1.
+    SH030528  COST            126.48   TRAN0305            1.
+    SH030528  BAL0305            -1.   BAL0328             1.
+    SH030628  COST            323.64   TRAN0306            1.
+    SH030628  BAL0352            -1.   BAL0328             1.
+    SH030728  COST            132.68   TRAN0307            1.
+    SH030728  BAL0364            -1.   BAL0328             1.
+    SH030828  COST            314.96   TRAN0308            1.
+    SH030828  BAL0383            -1.   BAL0328             1.
+    SH030129  COST            276.52   TRAN0301            1.
+    SH030129  BAL0301            -1.   BAL0329             1.
+    SH030229  COST            575.36   TRAN0302            1.
+    SH030229  BAL0302            -1.   BAL0329             1.
+    SH030329  COST            298.84   TRAN0303            1.
+    SH030329  BAL0303            -1.   BAL0329             1.
+    SH030429  COST            246.76   TRAN0304            1.
+    SH030429  BAL0304            -1.   BAL0329             1.
+    SH030529  COST             533.2   TRAN0305            1.
+    SH030529  BAL0305            -1.   BAL0329             1.
+    SH030629  COST            323.64   TRAN0306            1.
+    SH030629  BAL0352            -1.   BAL0329             1.
+    SH030829  COST            178.56   TRAN0308            1.
+    SH030829  BAL0383            -1.   BAL0329             1.
+    SH030130  COST            577.84   TRAN0301            1.
+    SH030130  BAL0301            -1.   BAL0330             1.
+    SH030230  COST            540.64   TRAN0302            1.
+    SH030230  BAL0302            -1.   BAL0330             1.
+    SH030330  COST            648.52   TRAN0303            1.
+    SH030330  BAL0303            -1.   BAL0330             1.
+    SH030430  COST            376.96   TRAN0304            1.
+    SH030430  BAL0304            -1.   BAL0330             1.
+    SH030530  COST            553.04   TRAN0305            1.
+    SH030530  BAL0305            -1.   BAL0330             1.
+    SH030830  COST            473.68   TRAN0308            1.
+    SH030830  BAL0383            -1.   BAL0330             1.
+    SH030131  COST            137.64   TRAN0301            1.
+    SH030131  BAL0301            -1.   BAL0331             1.
+    SH030231  COST            435.24   TRAN0302            1.
+    SH030231  BAL0302            -1.   BAL0331             1.
+    SH030331  COST             136.4   TRAN0303            1.
+    SH030331  BAL0303            -1.   BAL0331             1.
+    SH030431  COST            313.72   TRAN0304            1.
+    SH030431  BAL0304            -1.   BAL0331             1.
+    SH030531  COST            380.68   TRAN0305            1.
+    SH030531  BAL0305            -1.   BAL0331             1.
+    SH030631  COST            138.88   TRAN0306            1.
+    SH030631  BAL0352            -1.   BAL0331             1.
+    SH030831  COST            276.52   TRAN0308            1.
+    SH030831  BAL0383            -1.   BAL0331             1.
+    SH030132  COST            370.76   TRAN0301            1.
+    SH030132  BAL0301            -1.   BAL0332             1.
+    SH030232  COST            592.72   TRAN0302            1.
+    SH030232  BAL0302            -1.   BAL0332             1.
+    SH030332  COST            524.52   TRAN0303            1.
+    SH030332  BAL0303            -1.   BAL0332             1.
+    SH030432  COST            194.68   TRAN0304            1.
+    SH030432  BAL0304            -1.   BAL0332             1.
+    SH030532  COST            486.08   TRAN0305            1.
+    SH030532  BAL0305            -1.   BAL0332             1.
+    SH030832  COST             223.2   TRAN0308            1.
+    SH030832  BAL0383            -1.   BAL0332             1.
+    SH030133  COST            611.32   TRAN0301            1.
+    SH030133  BAL0301            -1.   BAL0333             1.
+    SH030233  COST              496.   TRAN0302            1.
+    SH030233  BAL0302            -1.   BAL0333             1.
+    SH030333  COST            673.32   TRAN0303            1.
+    SH030333  BAL0303            -1.   BAL0333             1.
+    SH030433  COST             551.8   TRAN0304            1.
+    SH030433  BAL0304            -1.   BAL0333             1.
+    SH030533  COST            782.44   TRAN0305            1.
+    SH030533  BAL0305            -1.   BAL0333             1.
+    SH030833  COST            472.44   TRAN0308            1.
+    SH030833  BAL0383            -1.   BAL0333             1.
+    SH030134  COST            478.64   TRAN0301            1.
+    SH030134  BAL0301            -1.   BAL0334             1.
+    SH030234  COST             812.2   TRAN0302            1.
+    SH030234  BAL0302            -1.   BAL0334             1.
+    SH030334  COST            623.72   TRAN0303            1.
+    SH030334  BAL0303            -1.   BAL0334             1.
+    SH030434  COST            261.64   TRAN0304            1.
+    SH030434  BAL0304            -1.   BAL0334             1.
+    SH030534  COST            546.84   TRAN0305            1.
+    SH030534  BAL0305            -1.   BAL0334             1.
+    SH030834  COST            326.12   TRAN0308            1.
+    SH030834  BAL0383            -1.   BAL0334             1.
+    SH030135  COST            571.64   TRAN0301            1.
+    SH030135  BAL0301            -1.   BAL0335             1.
+    SH030235  COST             551.8   TRAN0302            1.
+    SH030235  BAL0302            -1.   BAL0335             1.
+    SH030335  COST            467.48   TRAN0303            1.
+    SH030335  BAL0303            -1.   BAL0335             1.
+    SH030435  COST            151.28   TRAN0304            1.
+    SH030435  BAL0304            -1.   BAL0335             1.
+    SH030535  COST            534.44   TRAN0305            1.
+    SH030535  BAL0305            -1.   BAL0335             1.
+    SH030835  COST             291.4   TRAN0308            1.
+    SH030835  BAL0383            -1.   BAL0335             1.
+    SH030136  COST             254.2   TRAN0301            1.
+    SH030136  BAL0301            -1.   BAL0336             1.
+    SH030236  COST            555.52   TRAN0302            1.
+    SH030236  BAL0302            -1.   BAL0336             1.
+    SH030336  COST            131.44   TRAN0303            1.
+    SH030336  BAL0303            -1.   BAL0336             1.
+    SH030436  COST             458.8   TRAN0304            1.
+    SH030436  BAL0304            -1.   BAL0336             1.
+    SH030536  COST            429.04   TRAN0305            1.
+    SH030536  BAL0305            -1.   BAL0336             1.
+    SH030636  COST             136.4   TRAN0306            1.
+    SH030636  BAL0352            -1.   BAL0336             1.
+    SH030836  COST            398.04   TRAN0308            1.
+    SH030836  BAL0383            -1.   BAL0336             1.
+    SH030137  COST            114.08   TRAN0301            1.
+    SH030137  BAL0301            -1.   BAL0337             1.
+    SH030237  COST            424.08   TRAN0302            1.
+    SH030237  BAL0302            -1.   BAL0337             1.
+    SH030337  COST            195.92   TRAN0303            1.
+    SH030337  BAL0303            -1.   BAL0337             1.
+    SH030437  COST            376.96   TRAN0304            1.
+    SH030437  BAL0304            -1.   BAL0337             1.
+    SH030537  COST            225.68   TRAN0305            1.
+    SH030537  BAL0305            -1.   BAL0337             1.
+    SH030637  COST            240.56   TRAN0306            1.
+    SH030637  BAL0352            -1.   BAL0337             1.
+    SH030837  COST            312.48   TRAN0308            1.
+    SH030837  BAL0383            -1.   BAL0337             1.
+    SH030138  COST            168.64   TRAN0301            1.
+    SH030138  BAL0301            -1.   BAL0338             1.
+    SH030238  COST            302.56   TRAN0302            1.
+    SH030238  BAL0302            -1.   BAL0338             1.
+    SH030338  COST             117.8   TRAN0303            1.
+    SH030338  BAL0303            -1.   BAL0338             1.
+    SH030438  COST            381.92   TRAN0304            1.
+    SH030438  BAL0304            -1.   BAL0338             1.
+    SH030538  COST            344.72   TRAN0305            1.
+    SH030538  BAL0305            -1.   BAL0338             1.
+    SH030638  COST             48.36   TRAN0306            1.
+    SH030638  BAL0352            -1.   BAL0338             1.
+    SH030738  COST            267.84   TRAN0307            1.
+    SH030738  BAL0364            -1.   BAL0338             1.
+    SH030838  COST            293.88   TRAN0308            1.
+    SH030838  BAL0383            -1.   BAL0338             1.
+    SH030139  COST             161.2   TRAN0301            1.
+    SH030139  BAL0301            -1.   BAL0339             1.
+    SH030239  COST            420.36   TRAN0302            1.
+    SH030239  BAL0302            -1.   BAL0339             1.
+    SH030339  COST             198.4   TRAN0303            1.
+    SH030339  BAL0303            -1.   BAL0339             1.
+    SH030439  COST            308.76   TRAN0304            1.
+    SH030439  BAL0304            -1.   BAL0339             1.
+    SH030539  COST            531.96   TRAN0305            1.
+    SH030539  BAL0305            -1.   BAL0339             1.
+    SH030639  COST            252.96   TRAN0306            1.
+    SH030639  BAL0352            -1.   BAL0339             1.
+    SH030839  COST            208.32   TRAN0308            1.
+    SH030839  BAL0383            -1.   BAL0339             1.
+    SH030140  COST             204.6   TRAN0301            1.
+    SH030140  BAL0301            -1.   BAL0340             1.
+    SH030240  COST            468.72   TRAN0302            1.
+    SH030240  BAL0302            -1.   BAL0340             1.
+    SH030340  COST            127.72   TRAN0303            1.
+    SH030340  BAL0303            -1.   BAL0340             1.
+    SH030440  COST            368.28   TRAN0304            1.
+    SH030440  BAL0304            -1.   BAL0340             1.
+    SH030540  COST            274.04   TRAN0305            1.
+    SH030540  BAL0305            -1.   BAL0340             1.
+    SH030640  COST            162.44   TRAN0306            1.
+    SH030640  BAL0352            -1.   BAL0340             1.
+    SH030840  COST            339.76   TRAN0308            1.
+    SH030840  BAL0383            -1.   BAL0340             1.
+    SH030141  COST            243.04   TRAN0301            1.
+    SH030141  BAL0301            -1.   BAL0341             1.
+    SH030241  COST              372.   TRAN0302            1.
+    SH030241  BAL0302            -1.   BAL0341             1.
+    SH030341  COST              186.   TRAN0303            1.
+    SH030341  BAL0303            -1.   BAL0341             1.
+    SH030441  COST            401.76   TRAN0304            1.
+    SH030441  BAL0304            -1.   BAL0341             1.
+    SH030541  COST            456.32   TRAN0305            1.
+    SH030541  BAL0305            -1.   BAL0341             1.
+    SH030641  COST              124.   TRAN0306            1.
+    SH030641  BAL0352            -1.   BAL0341             1.
+    SH030841  COST            370.76   TRAN0308            1.
+    SH030841  BAL0383            -1.   BAL0341             1.
+    SH030142  COST             111.6   TRAN0301            1.
+    SH030142  BAL0301            -1.   BAL0342             1.
+    SH030242  COST            513.36   TRAN0302            1.
+    SH030242  BAL0302            -1.   BAL0342             1.
+    SH030342  COST             198.4   TRAN0303            1.
+    SH030342  BAL0303            -1.   BAL0342             1.
+    SH030442  COST             241.8   TRAN0304            1.
+    SH030442  BAL0304            -1.   BAL0342             1.
+    SH030542  COST            447.64   TRAN0305            1.
+    SH030542  BAL0305            -1.   BAL0342             1.
+    SH030642  COST            199.64   TRAN0306            1.
+    SH030642  BAL0352            -1.   BAL0342             1.
+    SH030842  COST            188.48   TRAN0308            1.
+    SH030842  BAL0383            -1.   BAL0342             1.
+    SH030143  COST            197.16   TRAN0301            1.
+    SH030143  BAL0301            -1.   BAL0343             1.
+    SH030243  COST             489.8   TRAN0302            1.
+    SH030243  BAL0302            -1.   BAL0343             1.
+    SH030343  COST               31.   TRAN0303            1.
+    SH030343  BAL0303            -1.   BAL0343             1.
+    SH030443  COST            367.04   TRAN0304            1.
+    SH030443  BAL0304            -1.   BAL0343             1.
+    SH030543  COST            319.92   TRAN0305            1.
+    SH030543  BAL0305            -1.   BAL0343             1.
+    SH030643  COST              124.   TRAN0306            1.
+    SH030643  BAL0352            -1.   BAL0343             1.
+    SH030743  COST            298.84   TRAN0307            1.
+    SH030743  BAL0364            -1.   BAL0343             1.
+    SH030843  COST            336.04   TRAN0308            1.
+    SH030843  BAL0383            -1.   BAL0343             1.
+    SH030144  COST            197.16   TRAN0301            1.
+    SH030144  BAL0301            -1.   BAL0344             1.
+    SH030244  COST            469.96   TRAN0302            1.
+    SH030244  BAL0302            -1.   BAL0344             1.
+    SH030344  COST            158.72   TRAN0303            1.
+    SH030344  BAL0303            -1.   BAL0344             1.
+    SH030444  COST            386.88   TRAN0304            1.
+    SH030444  BAL0304            -1.   BAL0344             1.
+    SH030544  COST             384.4   TRAN0305            1.
+    SH030544  BAL0305            -1.   BAL0344             1.
+    SH030644  COST            110.36   TRAN0306            1.
+    SH030644  BAL0352            -1.   BAL0344             1.
+    SH030844  COST            369.52   TRAN0308            1.
+    SH030844  BAL0383            -1.   BAL0344             1.
+    SH030145  COST            213.28   TRAN0301            1.
+    SH030145  BAL0301            -1.   BAL0345             1.
+    SH030245  COST            540.64   TRAN0302            1.
+    SH030245  BAL0302            -1.   BAL0345             1.
+    SH030345  COST            199.64   TRAN0303            1.
+    SH030345  BAL0303            -1.   BAL0345             1.
+    SH030445  COST            362.08   TRAN0304            1.
+    SH030445  BAL0304            -1.   BAL0345             1.
+    SH030545  COST            290.16   TRAN0305            1.
+    SH030545  BAL0305            -1.   BAL0345             1.
+    SH030645  COST            236.84   TRAN0306            1.
+    SH030645  BAL0352            -1.   BAL0345             1.
+    SH030745  COST            244.28   TRAN0307            1.
+    SH030745  BAL0364            -1.   BAL0345             1.
+    SH030845  COST             378.2   TRAN0308            1.
+    SH030845  BAL0383            -1.   BAL0345             1.
+    SH030146  COST             303.8   TRAN0301            1.
+    SH030146  BAL0301            -1.   BAL0346             1.
+    SH030246  COST            338.52   TRAN0302            1.
+    SH030246  BAL0302            -1.   BAL0346             1.
+    SH030346  COST            274.04   TRAN0303            1.
+    SH030346  BAL0303            -1.   BAL0346             1.
+    SH030446  COST            554.28   TRAN0304            1.
+    SH030446  BAL0304            -1.   BAL0346             1.
+    SH030546  COST             533.2   TRAN0305            1.
+    SH030546  BAL0305            -1.   BAL0346             1.
+    SH030646  COST            318.68   TRAN0306            1.
+    SH030646  BAL0352            -1.   BAL0346             1.
+    SH030846  COST            555.52   TRAN0308            1.
+    SH030846  BAL0383            -1.   BAL0346             1.
+    SH030147  COST             136.4   TRAN0301            1.
+    SH030147  BAL0301            -1.   BAL0347             1.
+    SH030247  COST            462.52   TRAN0302            1.
+    SH030247  BAL0302            -1.   BAL0347             1.
+    SH030347  COST            197.16   TRAN0303            1.
+    SH030347  BAL0303            -1.   BAL0347             1.
+    SH030447  COST            339.76   TRAN0304            1.
+    SH030447  BAL0304            -1.   BAL0347             1.
+    SH030547  COST            288.92   TRAN0305            1.
+    SH030547  BAL0305            -1.   BAL0347             1.
+    SH030647  COST             179.8   TRAN0306            1.
+    SH030647  BAL0352            -1.   BAL0347             1.
+    SH030847  COST            302.56   TRAN0308            1.
+    SH030847  BAL0383            -1.   BAL0347             1.
+    SH030148  COST             117.8   TRAN0301            1.
+    SH030148  BAL0301            -1.   BAL0348             1.
+    SH030248  COST            420.36   TRAN0302            1.
+    SH030248  BAL0302            -1.   BAL0348             1.
+    SH030348  COST            169.88   TRAN0303            1.
+    SH030348  BAL0303            -1.   BAL0348             1.
+    SH030448  COST             285.2   TRAN0304            1.
+    SH030448  BAL0304            -1.   BAL0348             1.
+    SH030548  COST            306.28   TRAN0305            1.
+    SH030548  BAL0305            -1.   BAL0348             1.
+    SH030648  COST             142.6   TRAN0306            1.
+    SH030648  BAL0352            -1.   BAL0348             1.
+    SH030848  COST             241.8   TRAN0308            1.
+    SH030848  BAL0383            -1.   BAL0348             1.
+    SH030149  COST            407.96   TRAN0301            1.
+    SH030149  BAL0301            -1.   BAL0349             1.
+    SH030249  COST             663.4   TRAN0302            1.
+    SH030249  BAL0302            -1.   BAL0349             1.
+    SH030349  COST            411.68   TRAN0303            1.
+    SH030349  BAL0303            -1.   BAL0349             1.
+    SH030449  COST            472.44   TRAN0304            1.
+    SH030449  BAL0304            -1.   BAL0349             1.
+    SH030549  COST            188.48   TRAN0305            1.
+    SH030549  BAL0305            -1.   BAL0349             1.
+    SH030649  COST            419.12   TRAN0306            1.
+    SH030649  BAL0352            -1.   BAL0349             1.
+    SH030749  COST            166.16   TRAN0307            1.
+    SH030749  BAL0364            -1.   BAL0349             1.
+    SH030849  COST            505.92   TRAN0308            1.
+    SH030849  BAL0383            -1.   BAL0349             1.
+    SH030150  COST            298.84   TRAN0301            1.
+    SH030150  BAL0301            -1.   BAL0350             1.
+    SH030250  COST            758.88   TRAN0302            1.
+    SH030250  BAL0302            -1.   BAL0350             1.
+    SH030350  COST            305.04   TRAN0303            1.
+    SH030350  BAL0303            -1.   BAL0350             1.
+    SH030450  COST             452.6   TRAN0304            1.
+    SH030450  BAL0304            -1.   BAL0350             1.
+    SH030550  COST             291.4   TRAN0305            1.
+    SH030550  BAL0305            -1.   BAL0350             1.
+    SH030750  COST            169.88   TRAN0307            1.
+    SH030750  BAL0364            -1.   BAL0350             1.
+    SH030850  COST            503.44   TRAN0308            1.
+    SH030850  BAL0383            -1.   BAL0350             1.
+    SH030151  COST            411.68   TRAN0301            1.
+    SH030151  BAL0301            -1.   BAL0351             1.
+    SH030251  COST              682.   TRAN0302            1.
+    SH030251  BAL0302            -1.   BAL0351             1.
+    SH030351  COST            422.84   TRAN0303            1.
+    SH030351  BAL0303            -1.   BAL0351             1.
+    SH030451  COST            419.12   TRAN0304            1.
+    SH030451  BAL0304            -1.   BAL0351             1.
+    SH030551  COST            152.52   TRAN0305            1.
+    SH030551  BAL0305            -1.   BAL0351             1.
+    SH030751  COST            122.76   TRAN0307            1.
+    SH030751  BAL0364            -1.   BAL0351             1.
+    SH030851  COST            530.72   TRAN0308            1.
+    SH030851  BAL0383            -1.   BAL0351             1.
+    SH030152  COST            138.88   TRAN0301            1.
+    SH030152  BAL0301            -1.   BAL0352             1.
+    SH030252  COST              372.   TRAN0302            1.
+    SH030252  BAL0302            -1.   BAL0352             1.
+    SH030352  COST            101.68   TRAN0303            1.
+    SH030352  BAL0303            -1.   BAL0352             1.
+    SH030452  COST            399.28   TRAN0304            1.
+    SH030452  BAL0304            -1.   BAL0352             1.
+    SH030552  COST             365.8   TRAN0305            1.
+    SH030552  BAL0305            -1.   BAL0352             1.
+    SH030852  COST            313.72   TRAN0308            1.
+    SH030852  BAL0383            -1.   BAL0352             1.
+    SH030153  COST            445.16   TRAN0301            1.
+    SH030153  BAL0301            -1.   BAL0353             1.
+    SH030253  COST            788.64   TRAN0302            1.
+    SH030253  BAL0302            -1.   BAL0353             1.
+    SH030353  COST              403.   TRAN0303            1.
+    SH030353  BAL0303            -1.   BAL0353             1.
+    SH030453  COST            510.88   TRAN0304            1.
+    SH030453  BAL0304            -1.   BAL0353             1.
+    SH030553  COST            228.16   TRAN0305            1.
+    SH030553  BAL0305            -1.   BAL0353             1.
+    SH030653  COST            445.16   TRAN0306            1.
+    SH030653  BAL0352            -1.   BAL0353             1.
+    SH030753  COST            181.04   TRAN0307            1.
+    SH030753  BAL0364            -1.   BAL0353             1.
+    SH030853  COST            499.72   TRAN0308            1.
+    SH030853  BAL0383            -1.   BAL0353             1.
+    SH030154  COST             229.4   TRAN0301            1.
+    SH030154  BAL0301            -1.   BAL0354             1.
+    SH030254  COST             551.8   TRAN0302            1.
+    SH030254  BAL0302            -1.   BAL0354             1.
+    SH030354  COST            269.08   TRAN0303            1.
+    SH030354  BAL0303            -1.   BAL0354             1.
+    SH030454  COST            425.32   TRAN0304            1.
+    SH030454  BAL0304            -1.   BAL0354             1.
+    SH030554  COST            264.12   TRAN0305            1.
+    SH030554  BAL0305            -1.   BAL0354             1.
+    SH030654  COST            251.72   TRAN0306            1.
+    SH030654  BAL0352            -1.   BAL0354             1.
+    SH030854  COST            498.48   TRAN0308            1.
+    SH030854  BAL0383            -1.   BAL0354             1.
+    SH030155  COST            344.72   TRAN0301            1.
+    SH030155  BAL0301            -1.   BAL0355             1.
+    SH030255  COST            593.96   TRAN0302            1.
+    SH030255  BAL0302            -1.   BAL0355             1.
+    SH030355  COST            348.44   TRAN0303            1.
+    SH030355  BAL0303            -1.   BAL0355             1.
+    SH030455  COST            364.56   TRAN0304            1.
+    SH030455  BAL0304            -1.   BAL0355             1.
+    SH030555  COST            190.96   TRAN0305            1.
+    SH030555  BAL0305            -1.   BAL0355             1.
+    SH030655  COST             359.6   TRAN0306            1.
+    SH030655  BAL0352            -1.   BAL0355             1.
+    SH030755  COST            132.68   TRAN0307            1.
+    SH030755  BAL0364            -1.   BAL0355             1.
+    SH030855  COST            364.56   TRAN0308            1.
+    SH030855  BAL0383            -1.   BAL0355             1.
+    SH030156  COST             483.6   TRAN0301            1.
+    SH030156  BAL0301            -1.   BAL0356             1.
+    SH030256  COST            717.96   TRAN0302            1.
+    SH030256  BAL0302            -1.   BAL0356             1.
+    SH030356  COST             378.2   TRAN0303            1.
+    SH030356  BAL0303            -1.   BAL0356             1.
+    SH030456  COST             452.6   TRAN0304            1.
+    SH030456  BAL0304            -1.   BAL0356             1.
+    SH030556  COST            168.64   TRAN0305            1.
+    SH030556  BAL0305            -1.   BAL0356             1.
+    SH030656  COST            420.36   TRAN0306            1.
+    SH030656  BAL0352            -1.   BAL0356             1.
+    SH030756  COST            151.28   TRAN0307            1.
+    SH030756  BAL0364            -1.   BAL0356             1.
+    SH030856  COST            442.68   TRAN0308            1.
+    SH030856  BAL0383            -1.   BAL0356             1.
+    SH030157  COST            323.64   TRAN0301            1.
+    SH030157  BAL0301            -1.   BAL0357             1.
+    SH030257  COST             644.8   TRAN0302            1.
+    SH030257  BAL0302            -1.   BAL0357             1.
+    SH030357  COST             359.6   TRAN0303            1.
+    SH030357  BAL0303            -1.   BAL0357             1.
+    SH030457  COST            290.16   TRAN0304            1.
+    SH030457  BAL0304            -1.   BAL0357             1.
+    SH030557  COST            208.32   TRAN0305            1.
+    SH030557  BAL0305            -1.   BAL0357             1.
+    SH030657  COST            395.56   TRAN0306            1.
+    SH030657  BAL0352            -1.   BAL0357             1.
+    SH030757  COST            183.52   TRAN0307            1.
+    SH030757  BAL0364            -1.   BAL0357             1.
+    SH030857  COST            286.44   TRAN0308            1.
+    SH030857  BAL0383            -1.   BAL0357             1.
+    SH030158  COST            364.56   TRAN0301            1.
+    SH030158  BAL0301            -1.   BAL0358             1.
+    SH030258  COST            646.04   TRAN0302            1.
+    SH030258  BAL0302            -1.   BAL0358             1.
+    SH030358  COST            344.72   TRAN0303            1.
+    SH030358  BAL0303            -1.   BAL0358             1.
+    SH030458  COST            425.32   TRAN0304            1.
+    SH030458  BAL0304            -1.   BAL0358             1.
+    SH030558  COST             26.04   TRAN0305            1.
+    SH030558  BAL0305            -1.   BAL0358             1.
+    SH030658  COST            404.24   TRAN0306            1.
+    SH030658  BAL0352            -1.   BAL0358             1.
+    SH030758  COST             84.32   TRAN0307            1.
+    SH030758  BAL0364            -1.   BAL0358             1.
+    SH030858  COST            314.96   TRAN0308            1.
+    SH030858  BAL0383            -1.   BAL0358             1.
+    SH030159  COST            255.44   TRAN0301            1.
+    SH030159  BAL0301            -1.   BAL0359             1.
+    SH030259  COST            617.52   TRAN0302            1.
+    SH030259  BAL0302            -1.   BAL0359             1.
+    SH030359  COST            295.12   TRAN0303            1.
+    SH030359  BAL0303            -1.   BAL0359             1.
+    SH030459  COST            302.56   TRAN0304            1.
+    SH030459  BAL0304            -1.   BAL0359             1.
+    SH030559  COST            197.16   TRAN0305            1.
+    SH030559  BAL0305            -1.   BAL0359             1.
+    SH030659  COST            368.28   TRAN0306            1.
+    SH030659  BAL0352            -1.   BAL0359             1.
+    SH030759  COST             130.2   TRAN0307            1.
+    SH030759  BAL0364            -1.   BAL0359             1.
+    SH030859  COST             316.2   TRAN0308            1.
+    SH030859  BAL0383            -1.   BAL0359             1.
+    SH030160  COST            323.64   TRAN0301            1.
+    SH030160  BAL0301            -1.   BAL0360             1.
+    SH030260  COST              682.   TRAN0302            1.
+    SH030260  BAL0302            -1.   BAL0360             1.
+    SH030360  COST            350.92   TRAN0303            1.
+    SH030360  BAL0303            -1.   BAL0360             1.
+    SH030460  COST            386.88   TRAN0304            1.
+    SH030460  BAL0304            -1.   BAL0360             1.
+    SH030560  COST             167.4   TRAN0305            1.
+    SH030560  BAL0305            -1.   BAL0360             1.
+    SH030660  COST            400.52   TRAN0306            1.
+    SH030660  BAL0352            -1.   BAL0360             1.
+    SH030760  COST            109.12   TRAN0307            1.
+    SH030760  BAL0364            -1.   BAL0360             1.
+    SH030860  COST            370.76   TRAN0308            1.
+    SH030860  BAL0383            -1.   BAL0360             1.
+    SH030163  COST            329.84   TRAN0301            1.
+    SH030163  BAL0301            -1.   BAL0363             1.
+    SH030263  COST            612.56   TRAN0302            1.
+    SH030263  BAL0302            -1.   BAL0363             1.
+    SH030363  COST            355.88   TRAN0303            1.
+    SH030363  BAL0303            -1.   BAL0363             1.
+    SH030463  COST            457.56   TRAN0304            1.
+    SH030463  BAL0304            -1.   BAL0363             1.
+    SH030563  COST            188.48   TRAN0305            1.
+    SH030563  BAL0305            -1.   BAL0363             1.
+    SH030663  COST             390.6   TRAN0306            1.
+    SH030663  BAL0352            -1.   BAL0363             1.
+    SH030763  COST            153.76   TRAN0307            1.
+    SH030763  BAL0364            -1.   BAL0363             1.
+    SH030863  COST              496.   TRAN0308            1.
+    SH030863  BAL0383            -1.   BAL0363             1.
+    SH030164  COST            246.76   TRAN0301            1.
+    SH030164  BAL0301            -1.   BAL0364             1.
+    SH030264  COST            652.24   TRAN0302            1.
+    SH030264  BAL0302            -1.   BAL0364             1.
+    SH030364  COST            276.52   TRAN0303            1.
+    SH030364  BAL0303            -1.   BAL0364             1.
+    SH030464  COST            416.64   TRAN0304            1.
+    SH030464  BAL0304            -1.   BAL0364             1.
+    SH030564  COST             71.92   TRAN0305            1.
+    SH030564  BAL0305            -1.   BAL0364             1.
+    SH030664  COST            393.08   TRAN0306            1.
+    SH030664  BAL0352            -1.   BAL0364             1.
+    SH030864  COST              310.   TRAN0308            1.
+    SH030864  BAL0383            -1.   BAL0364             1.
+    SH030165  COST            535.68   TRAN0301            1.
+    SH030165  BAL0301            -1.   BAL0365             1.
+    SH030265  COST            380.68   TRAN0302            1.
+    SH030265  BAL0302            -1.   BAL0365             1.
+    SH030365  COST             626.2   TRAN0303            1.
+    SH030365  BAL0303            -1.   BAL0365             1.
+    SH030465  COST            481.12   TRAN0304            1.
+    SH030465  BAL0304            -1.   BAL0365             1.
+    SH030565  COST            748.96   TRAN0305            1.
+    SH030565  BAL0305            -1.   BAL0365             1.
+    SH030865  COST             514.6   TRAN0308            1.
+    SH030865  BAL0383            -1.   BAL0365             1.
+    SH030166  COST             694.4   TRAN0301            1.
+    SH030166  BAL0301            -1.   BAL0366             1.
+    SH030266  COST            321.16   TRAN0302            1.
+    SH030266  BAL0302            -1.   BAL0366             1.
+    SH030366  COST            716.72   TRAN0303            1.
+    SH030366  BAL0303            -1.   BAL0366             1.
+    SH030466  COST            689.44   TRAN0304            1.
+    SH030466  BAL0304            -1.   BAL0366             1.
+    SH030566  COST             880.4   TRAN0305            1.
+    SH030566  BAL0305            -1.   BAL0366             1.
+    SH030866  COST             694.4   TRAN0308            1.
+    SH030866  BAL0383            -1.   BAL0366             1.
+    SH030167  COST              527.   TRAN0301            1.
+    SH030167  BAL0301            -1.   BAL0367             1.
+    SH030267  COST            287.68   TRAN0302            1.
+    SH030267  BAL0302            -1.   BAL0367             1.
+    SH030367  COST            611.32   TRAN0303            1.
+    SH030367  BAL0303            -1.   BAL0367             1.
+    SH030467  COST            566.68   TRAN0304            1.
+    SH030467  BAL0304            -1.   BAL0367             1.
+    SH030567  COST            748.96   TRAN0305            1.
+    SH030567  BAL0305            -1.   BAL0367             1.
+    SH030867  COST            567.92   TRAN0308            1.
+    SH030867  BAL0383            -1.   BAL0367             1.
+    SH030168  COST            736.56   TRAN0301            1.
+    SH030168  BAL0301            -1.   BAL0368             1.
+    SH030268  COST              496.   TRAN0302            1.
+    SH030268  BAL0302            -1.   BAL0368             1.
+    SH030368  COST             694.4   TRAN0303            1.
+    SH030368  BAL0303            -1.   BAL0368             1.
+    SH030468  COST            870.48   TRAN0304            1.
+    SH030468  BAL0304            -1.   BAL0368             1.
+    SH030568  COST           1173.04   TRAN0305            1.
+    SH030568  BAL0305            -1.   BAL0368             1.
+    SH030868  COST            931.24   TRAN0308            1.
+    SH030868  BAL0383            -1.   BAL0368             1.
+    SH030169  COST            668.36   TRAN0301            1.
+    SH030169  BAL0301            -1.   BAL0369             1.
+    SH030269  COST            274.04   TRAN0302            1.
+    SH030269  BAL0302            -1.   BAL0369             1.
+    SH030369  COST             632.4   TRAN0303            1.
+    SH030369  BAL0303            -1.   BAL0369             1.
+    SH030469  COST            771.28   TRAN0304            1.
+    SH030469  BAL0304            -1.   BAL0369             1.
+    SH030569  COST            801.04   TRAN0305            1.
+    SH030569  BAL0305            -1.   BAL0369             1.
+    SH030869  COST            815.92   TRAN0308            1.
+    SH030869  BAL0383            -1.   BAL0369             1.
+    SH030171  COST             545.6   TRAN0301            1.
+    SH030171  BAL0301            -1.   BAL0371             1.
+    SH030371  COST            649.76   TRAN0303            1.
+    SH030371  BAL0303            -1.   BAL0371             1.
+    SH030471  COST            646.04   TRAN0304            1.
+    SH030471  BAL0304            -1.   BAL0371             1.
+    SH030571  COST            720.44   TRAN0305            1.
+    SH030571  BAL0305            -1.   BAL0371             1.
+    SH030671  COST            484.84   TRAN0306            1.
+    SH030671  BAL0352            -1.   BAL0371             1.
+    SH030771  COST            872.96   TRAN0307            1.
+    SH030771  BAL0364            -1.   BAL0371             1.
+    SH030871  COST            660.92   TRAN0308            1.
+    SH030871  BAL0383            -1.   BAL0371             1.
+    SH030172  COST            727.88   TRAN0301            1.
+    SH030172  BAL0301            -1.   BAL0372             1.
+    SH030272  COST            673.32   TRAN0302            1.
+    SH030272  BAL0302            -1.   BAL0372             1.
+    SH030372  COST            765.08   TRAN0303            1.
+    SH030372  BAL0303            -1.   BAL0372             1.
+    SH030472  COST             706.8   TRAN0304            1.
+    SH030472  BAL0304            -1.   BAL0372             1.
+    SH030572  COST            946.12   TRAN0305            1.
+    SH030572  BAL0305            -1.   BAL0372             1.
+    SH030872  COST             706.8   TRAN0308            1.
+    SH030872  BAL0383            -1.   BAL0372             1.
+    SH030173  COST             483.6   TRAN0301            1.
+    SH030173  BAL0301            -1.   BAL0373             1.
+    SH030273  COST             452.6   TRAN0302            1.
+    SH030273  BAL0302            -1.   BAL0373             1.
+    SH030373  COST            419.12   TRAN0303            1.
+    SH030373  BAL0303            -1.   BAL0373             1.
+    SH030473  COST            566.68   TRAN0304            1.
+    SH030473  BAL0304            -1.   BAL0373             1.
+    SH030573  COST            699.36   TRAN0305            1.
+    SH030573  BAL0305            -1.   BAL0373             1.
+    SH030673  COST             378.2   TRAN0306            1.
+    SH030673  BAL0352            -1.   BAL0373             1.
+    SH030873  COST            624.96   TRAN0308            1.
+    SH030873  BAL0383            -1.   BAL0373             1.
+    SH030174  COST            679.52   TRAN0301            1.
+    SH030174  BAL0301            -1.   BAL0374             1.
+    SH030274  COST             260.4   TRAN0302            1.
+    SH030274  BAL0302            -1.   BAL0374             1.
+    SH030374  COST             706.8   TRAN0303            1.
+    SH030374  BAL0303            -1.   BAL0374             1.
+    SH030474  COST            789.88   TRAN0304            1.
+    SH030474  BAL0304            -1.   BAL0374             1.
+    SH030574  COST            908.92   TRAN0305            1.
+    SH030574  BAL0305            -1.   BAL0374             1.
+    SH030874  COST            767.56   TRAN0308            1.
+    SH030874  BAL0383            -1.   BAL0374             1.
+    SH030275  COST            686.96   TRAN0302            1.
+    SH030275  BAL0302            -1.   BAL0375             1.
+    SH030176  COST            572.88   TRAN0301            1.
+    SH030176  BAL0301            -1.   BAL0376             1.
+    SH030276  COST            497.24   TRAN0302            1.
+    SH030276  BAL0302            -1.   BAL0376             1.
+    SH030376  COST            499.72   TRAN0303            1.
+    SH030376  BAL0303            -1.   BAL0376             1.
+    SH030476  COST             781.2   TRAN0304            1.
+    SH030476  BAL0304            -1.   BAL0376             1.
+    SH030576  COST             781.2   TRAN0305            1.
+    SH030576  BAL0305            -1.   BAL0376             1.
+    SH030676  COST            472.44   TRAN0306            1.
+    SH030676  BAL0352            -1.   BAL0376             1.
+    SH030876  COST            963.48   TRAN0308            1.
+    SH030876  BAL0383            -1.   BAL0376             1.
+    SH030177  COST             539.4   TRAN0301            1.
+    SH030177  BAL0301            -1.   BAL0377             1.
+    SH030277  COST            337.28   TRAN0302            1.
+    SH030277  BAL0302            -1.   BAL0377             1.
+    SH030377  COST            571.64   TRAN0303            1.
+    SH030377  BAL0303            -1.   BAL0377             1.
+    SH030477  COST            497.24   TRAN0304            1.
+    SH030477  BAL0304            -1.   BAL0377             1.
+    SH030577  COST             694.4   TRAN0305            1.
+    SH030577  BAL0305            -1.   BAL0377             1.
+    SH030877  COST             396.8   TRAN0308            1.
+    SH030877  BAL0383            -1.   BAL0377             1.
+    SH030178  COST            943.64   TRAN0301            1.
+    SH030178  BAL0301            -1.   BAL0378             1.
+    SH030278  COST            548.08   TRAN0302            1.
+    SH030278  BAL0302            -1.   BAL0378             1.
+    SH030378  COST            970.92   TRAN0303            1.
+    SH030378  BAL0303            -1.   BAL0378             1.
+    SH030478  COST             849.4   TRAN0304            1.
+    SH030478  BAL0304            -1.   BAL0378             1.
+    SH030578  COST           1089.96   TRAN0305            1.
+    SH030578  BAL0305            -1.   BAL0378             1.
+    SH030878  COST            949.84   TRAN0308            1.
+    SH030878  BAL0383            -1.   BAL0378             1.
+    SH030179  COST             886.6   TRAN0301            1.
+    SH030179  BAL0301            -1.   BAL0379             1.
+    SH030279  COST            333.56   TRAN0302            1.
+    SH030279  BAL0302            -1.   BAL0379             1.
+    SH030379  COST            856.84   TRAN0303            1.
+    SH030379  BAL0303            -1.   BAL0379             1.
+    SH030479  COST             892.8   TRAN0304            1.
+    SH030479  BAL0304            -1.   BAL0379             1.
+    SH030879  COST            875.44   TRAN0308            1.
+    SH030879  BAL0383            -1.   BAL0379             1.
+    SH030180  COST            393.08   TRAN0301            1.
+    SH030180  BAL0301            -1.   BAL0380             1.
+    SH030280  COST             489.8   TRAN0302            1.
+    SH030280  BAL0302            -1.   BAL0380             1.
+    SH030380  COST            541.88   TRAN0303            1.
+    SH030380  BAL0303            -1.   BAL0380             1.
+    SH030480  COST            463.76   TRAN0304            1.
+    SH030480  BAL0304            -1.   BAL0380             1.
+    SH030580  COST             626.2   TRAN0305            1.
+    SH030580  BAL0305            -1.   BAL0380             1.
+    SH030880  COST             297.6   TRAN0308            1.
+    SH030880  BAL0383            -1.   BAL0380             1.
+    SH030182  COST            721.68   TRAN0301            1.
+    SH030182  BAL0301            -1.   BAL0382             1.
+    SH030282  COST            407.96   TRAN0302            1.
+    SH030282  BAL0302            -1.   BAL0382             1.
+    SH030382  COST             812.2   TRAN0303            1.
+    SH030382  BAL0303            -1.   BAL0382             1.
+    SH030482  COST            875.44   TRAN0304            1.
+    SH030482  BAL0304            -1.   BAL0382             1.
+    SH030582  COST           1422.28   TRAN0305            1.
+    SH030582  BAL0305            -1.   BAL0382             1.
+    SH030882  COST            970.92   TRAN0308            1.
+    SH030882  BAL0383            -1.   BAL0382             1.
+    SH030183  COST            219.48   TRAN0301            1.
+    SH030183  BAL0301            -1.   BAL0383             1.
+    SH030283  COST             644.8   TRAN0302            1.
+    SH030283  BAL0302            -1.   BAL0383             1.
+    SH030383  COST            337.28   TRAN0303            1.
+    SH030383  BAL0303            -1.   BAL0383             1.
+    SH030483  COST             73.16   TRAN0304            1.
+    SH030483  BAL0304            -1.   BAL0383             1.
+    SH030583  COST            430.28   TRAN0305            1.
+    SH030583  BAL0305            -1.   BAL0383             1.
+    SH030683  COST            307.52   TRAN0306            1.
+    SH030683  BAL0352            -1.   BAL0383             1.
+    SH030184  COST            376.96   TRAN0301            1.
+    SH030184  BAL0301            -1.   BAL0384             1.
+    SH030284  COST            238.08   TRAN0302            1.
+    SH030284  BAL0302            -1.   BAL0384             1.
+    SH030384  COST            451.36   TRAN0303            1.
+    SH030384  BAL0303            -1.   BAL0384             1.
+    SH030484  COST             458.8   TRAN0304            1.
+    SH030484  BAL0304            -1.   BAL0384             1.
+    SH030584  COST             607.6   TRAN0305            1.
+    SH030584  BAL0305            -1.   BAL0384             1.
+    SH030684  COST             378.2   TRAN0306            1.
+    SH030684  BAL0352            -1.   BAL0384             1.
+    SH030884  COST            481.12   TRAN0308            1.
+    SH030884  BAL0383            -1.   BAL0384             1.
+    SH040201  COST            299.97   TRAN0402            1.
+    SH040201  BAL0402            -1.   BAL0401             1.
+    SH040301  COST            115.14   TRAN0403            1.
+    SH040301  BAL0403            -1.   BAL0401             1.
+    SH040401  COST            210.08   TRAN0404            1.
+    SH040401  BAL0404            -1.   BAL0401             1.
+    SH040501  COST            239.37   TRAN0405            1.
+    SH040501  BAL0405            -1.   BAL0401             1.
+    SH040601  COST            127.26   TRAN0406            1.
+    SH040601  BAL0452            -1.   BAL0401             1.
+    SH040801  COST            144.43   TRAN0408            1.
+    SH040801  BAL0483            -1.   BAL0401             1.
+    SH040102  COST            478.74   TRAN0401            1.
+    SH040102  BAL0401            -1.   BAL0402             1.
+    SH040302  COST            421.17   TRAN0403            1.
+    SH040302  BAL0403            -1.   BAL0402             1.
+    SH040402  COST            618.12   TRAN0404            1.
+    SH040402  BAL0404            -1.   BAL0402             1.
+    SH040502  COST            748.41   TRAN0405            1.
+    SH040502  BAL0405            -1.   BAL0402             1.
+    SH040602  COST            381.78   TRAN0406            1.
+    SH040602  BAL0452            -1.   BAL0402             1.
+    SH040802  COST            526.21   TRAN0408            1.
+    SH040802  BAL0483            -1.   BAL0402             1.
+    SH040103  COST            247.45   TRAN0401            1.
+    SH040103  BAL0401            -1.   BAL0403             1.
+    SH040203  COST            478.74   TRAN0402            1.
+    SH040203  BAL0402            -1.   BAL0403             1.
+    SH040403  COST            370.67   TRAN0404            1.
+    SH040403  BAL0404            -1.   BAL0403             1.
+    SH040503  COST            286.84   TRAN0405            1.
+    SH040503  BAL0405            -1.   BAL0403             1.
+    SH040603  COST              90.9   TRAN0406            1.
+    SH040603  BAL0452            -1.   BAL0403             1.
+    SH040803  COST            257.55   TRAN0408            1.
+    SH040803  BAL0483            -1.   BAL0403             1.
+    SH040104  COST            175.74   TRAN0401            1.
+    SH040104  BAL0401            -1.   BAL0404             1.
+    SH040204  COST            508.03   TRAN0402            1.
+    SH040204  BAL0402            -1.   BAL0404             1.
+    SH040304  COST            245.43   TRAN0403            1.
+    SH040304  BAL0403            -1.   BAL0404             1.
+    SH040504  COST            322.19   TRAN0405            1.
+    SH040504  BAL0405            -1.   BAL0404             1.
+    SH040604  COST            247.45   TRAN0406            1.
+    SH040604  BAL0452            -1.   BAL0404             1.
+    SH040704  COST            271.69   TRAN0407            1.
+    SH040704  BAL0464            -1.   BAL0404             1.
+    SH040804  COST             58.58   TRAN0408            1.
+    SH040804  BAL0483            -1.   BAL0404             1.
+    SH040105  COST             272.7   TRAN0401            1.
+    SH040105  BAL0401            -1.   BAL0405             1.
+    SH040205  COST            521.16   TRAN0402            1.
+    SH040205  BAL0402            -1.   BAL0405             1.
+    SH040305  COST            286.84   TRAN0403            1.
+    SH040305  BAL0403            -1.   BAL0405             1.
+    SH040405  COST            287.85   TRAN0404            1.
+    SH040405  BAL0404            -1.   BAL0405             1.
+    SH040605  COST            329.26   TRAN0406            1.
+    SH040605  BAL0452            -1.   BAL0405             1.
+    SH040705  COST            337.34   TRAN0407            1.
+    SH040705  BAL0464            -1.   BAL0405             1.
+    SH040805  COST            273.71   TRAN0408            1.
+    SH040805  BAL0483            -1.   BAL0405             1.
+    SH040106  COST            200.99   TRAN0401            1.
+    SH040106  BAL0401            -1.   BAL0406             1.
+    SH040206  COST            421.17   TRAN0402            1.
+    SH040206  BAL0402            -1.   BAL0406             1.
+    SH040306  COST            215.13   TRAN0403            1.
+    SH040306  BAL0403            -1.   BAL0406             1.
+    SH040406  COST            221.19   TRAN0404            1.
+    SH040406  BAL0404            -1.   BAL0406             1.
+    SH040506  COST            254.52   TRAN0405            1.
+    SH040506  BAL0405            -1.   BAL0406             1.
+    SH040606  COST            208.06   TRAN0406            1.
+    SH040606  BAL0452            -1.   BAL0406             1.
+    SH040706  COST              202.   TRAN0407            1.
+    SH040706  BAL0464            -1.   BAL0406             1.
+    SH040806  COST            152.51   TRAN0408            1.
+    SH040806  BAL0483            -1.   BAL0406             1.
+    SH040107  COST             21.21   TRAN0401            1.
+    SH040107  BAL0401            -1.   BAL0407             1.
+    SH040207  COST            294.92   TRAN0402            1.
+    SH040207  BAL0402            -1.   BAL0407             1.
+    SH040307  COST            125.24   TRAN0403            1.
+    SH040307  BAL0403            -1.   BAL0407             1.
+    SH040407  COST            209.07   TRAN0404            1.
+    SH040407  BAL0404            -1.   BAL0407             1.
+    SH040507  COST            231.29   TRAN0405            1.
+    SH040507  BAL0405            -1.   BAL0407             1.
+    SH040607  COST            126.25   TRAN0406            1.
+    SH040607  BAL0452            -1.   BAL0407             1.
+    SH040707  COST            234.32   TRAN0407            1.
+    SH040707  BAL0464            -1.   BAL0407             1.
+    SH040807  COST            156.55   TRAN0408            1.
+    SH040807  BAL0483            -1.   BAL0407             1.
+    SH040108  COST             66.66   TRAN0401            1.
+    SH040108  BAL0401            -1.   BAL0408             1.
+    SH040208  COST            379.76   TRAN0402            1.
+    SH040208  BAL0402            -1.   BAL0408             1.
+    SH040308  COST            142.41   TRAN0403            1.
+    SH040308  BAL0403            -1.   BAL0408             1.
+    SH040408  COST            249.47   TRAN0404            1.
+    SH040408  BAL0404            -1.   BAL0408             1.
+    SH040508  COST            183.82   TRAN0405            1.
+    SH040508  BAL0405            -1.   BAL0408             1.
+    SH040608  COST            167.66   TRAN0406            1.
+    SH040608  BAL0452            -1.   BAL0408             1.
+    SH040808  COST            188.87   TRAN0408            1.
+    SH040808  BAL0483            -1.   BAL0408             1.
+    SH040109  COST            139.38   TRAN0401            1.
+    SH040109  BAL0401            -1.   BAL0409             1.
+    SH040209  COST            386.83   TRAN0402            1.
+    SH040209  BAL0402            -1.   BAL0409             1.
+    SH040309  COST            169.68   TRAN0403            1.
+    SH040309  BAL0403            -1.   BAL0409             1.
+    SH040409  COST            255.53   TRAN0404            1.
+    SH040409  BAL0404            -1.   BAL0409             1.
+    SH040509  COST            241.39   TRAN0405            1.
+    SH040509  BAL0405            -1.   BAL0409             1.
+    SH040709  COST            197.96   TRAN0407            1.
+    SH040709  BAL0464            -1.   BAL0409             1.
+    SH040809  COST            195.94   TRAN0408            1.
+    SH040809  BAL0483            -1.   BAL0409             1.
+    SH040110  COST            249.47   TRAN0401            1.
+    SH040110  BAL0401            -1.   BAL0410             1.
+    SH040210  COST            159.58   TRAN0402            1.
+    SH040210  BAL0402            -1.   BAL0410             1.
+    SH040310  COST             242.4   TRAN0403            1.
+    SH040310  BAL0403            -1.   BAL0410             1.
+    SH040410  COST            362.59   TRAN0404            1.
+    SH040410  BAL0404            -1.   BAL0410             1.
+    SH040510  COST            388.85   TRAN0405            1.
+    SH040510  BAL0405            -1.   BAL0410             1.
+    SH040610  COST            227.25   TRAN0406            1.
+    SH040610  BAL0452            -1.   BAL0410             1.
+    SH040810  COST            308.05   TRAN0408            1.
+    SH040810  BAL0483            -1.   BAL0410             1.
+    SH040111  COST            107.06   TRAN0401            1.
+    SH040111  BAL0401            -1.   BAL0411             1.
+    SH040211  COST            499.95   TRAN0402            1.
+    SH040211  BAL0402            -1.   BAL0411             1.
+    SH040311  COST            250.48   TRAN0403            1.
+    SH040311  BAL0403            -1.   BAL0411             1.
+    SH040411  COST            140.39   TRAN0404            1.
+    SH040411  BAL0404            -1.   BAL0411             1.
+    SH040511  COST            344.41   TRAN0405            1.
+    SH040511  BAL0405            -1.   BAL0411             1.
+    SH040611  COST            197.96   TRAN0406            1.
+    SH040611  BAL0452            -1.   BAL0411             1.
+    SH040811  COST            103.02   TRAN0408            1.
+    SH040811  BAL0483            -1.   BAL0411             1.
+    SH040112  COST             88.88   TRAN0401            1.
+    SH040112  BAL0401            -1.   BAL0412             1.
+    SH040212  COST            342.39   TRAN0402            1.
+    SH040212  BAL0402            -1.   BAL0412             1.
+    SH040312  COST            147.46   TRAN0403            1.
+    SH040312  BAL0403            -1.   BAL0412             1.
+    SH040412  COST              202.   TRAN0404            1.
+    SH040412  BAL0404            -1.   BAL0412             1.
+    SH040512  COST            269.67   TRAN0405            1.
+    SH040512  BAL0405            -1.   BAL0412             1.
+    SH040612  COST            146.45   TRAN0406            1.
+    SH040612  BAL0452            -1.   BAL0412             1.
+    SH040812  COST            147.46   TRAN0408            1.
+    SH040812  BAL0483            -1.   BAL0412             1.
+    SH040114  COST            143.42   TRAN0401            1.
+    SH040114  BAL0401            -1.   BAL0414             1.
+    SH040214  COST            416.12   TRAN0402            1.
+    SH040214  BAL0402            -1.   BAL0414             1.
+    SH040314  COST            197.96   TRAN0403            1.
+    SH040314  BAL0403            -1.   BAL0414             1.
+    SH040414  COST            200.99   TRAN0404            1.
+    SH040414  BAL0404            -1.   BAL0414             1.
+    SH040514  COST            355.52   TRAN0405            1.
+    SH040514  BAL0405            -1.   BAL0414             1.
+    SH040614  COST            189.88   TRAN0406            1.
+    SH040614  BAL0452            -1.   BAL0414             1.
+    SH040814  COST            127.26   TRAN0408            1.
+    SH040814  BAL0483            -1.   BAL0414             1.
+    SH040115  COST            306.03   TRAN0401            1.
+    SH040115  BAL0401            -1.   BAL0415             1.
+    SH040215  COST            160.59   TRAN0402            1.
+    SH040215  BAL0402            -1.   BAL0415             1.
+    SH040315  COST            236.34   TRAN0403            1.
+    SH040315  BAL0403            -1.   BAL0415             1.
+    SH040415  COST            480.76   TRAN0404            1.
+    SH040415  BAL0404            -1.   BAL0415             1.
+    SH040515  COST            401.98   TRAN0405            1.
+    SH040515  BAL0405            -1.   BAL0415             1.
+    SH040615  COST            189.88   TRAN0406            1.
+    SH040615  BAL0452            -1.   BAL0415             1.
+    SH040815  COST            376.73   TRAN0408            1.
+    SH040815  BAL0483            -1.   BAL0415             1.
+    SH040116  COST            159.58   TRAN0401            1.
+    SH040116  BAL0401            -1.   BAL0416             1.
+    SH040216  COST             282.8   TRAN0402            1.
+    SH040216  BAL0402            -1.   BAL0416             1.
+    SH040316  COST            229.27   TRAN0403            1.
+    SH040316  BAL0403            -1.   BAL0416             1.
+    SH040416  COST            289.87   TRAN0404            1.
+    SH040416  BAL0404            -1.   BAL0416             1.
+    SH040516  COST            322.19   TRAN0405            1.
+    SH040516  BAL0405            -1.   BAL0416             1.
+    SH040616  COST            132.31   TRAN0406            1.
+    SH040616  BAL0452            -1.   BAL0416             1.
+    SH040816  COST            207.05   TRAN0408            1.
+    SH040816  BAL0483            -1.   BAL0416             1.
+    SH040117  COST            152.51   TRAN0401            1.
+    SH040117  BAL0401            -1.   BAL0417             1.
+    SH040217  COST            510.05   TRAN0402            1.
+    SH040217  BAL0402            -1.   BAL0417             1.
+    SH040317  COST            276.74   TRAN0403            1.
+    SH040317  BAL0403            -1.   BAL0417             1.
+    SH040417  COST             57.57   TRAN0404            1.
+    SH040417  BAL0404            -1.   BAL0417             1.
+    SH040517  COST            300.98   TRAN0405            1.
+    SH040517  BAL0405            -1.   BAL0417             1.
+    SH040717  COST            297.95   TRAN0407            1.
+    SH040717  BAL0464            -1.   BAL0417             1.
+    SH040817  COST             27.27   TRAN0408            1.
+    SH040817  BAL0483            -1.   BAL0417             1.
+    SH040118  COST            176.75   TRAN0401            1.
+    SH040118  BAL0401            -1.   BAL0418             1.
+    SH040218  COST            364.61   TRAN0402            1.
+    SH040218  BAL0402            -1.   BAL0418             1.
+    SH040318  COST             272.7   TRAN0403            1.
+    SH040318  BAL0403            -1.   BAL0418             1.
+    SH040418  COST            155.54   TRAN0404            1.
+    SH040418  BAL0404            -1.   BAL0418             1.
+    SH040518  COST            411.07   TRAN0405            1.
+    SH040518  BAL0405            -1.   BAL0418             1.
+    SH040618  COST            355.52   TRAN0406            1.
+    SH040618  BAL0452            -1.   BAL0418             1.
+    SH040818  COST            104.03   TRAN0408            1.
+    SH040818  BAL0483            -1.   BAL0418             1.
+    SH040119  COST            250.48   TRAN0401            1.
+    SH040119  BAL0401            -1.   BAL0419             1.
+    SH040219  COST            693.87   TRAN0402            1.
+    SH040219  BAL0402            -1.   BAL0419             1.
+    SH040319  COST            320.17   TRAN0403            1.
+    SH040319  BAL0403            -1.   BAL0419             1.
+    SH040419  COST            160.59   TRAN0404            1.
+    SH040419  BAL0404            -1.   BAL0419             1.
+    SH040519  COST            210.08   TRAN0405            1.
+    SH040519  BAL0405            -1.   BAL0419             1.
+    SH040619  COST            348.45   TRAN0406            1.
+    SH040619  BAL0452            -1.   BAL0419             1.
+    SH040819  COST             99.99   TRAN0408            1.
+    SH040819  BAL0483            -1.   BAL0419             1.
+    SH040120  COST            207.05   TRAN0401            1.
+    SH040120  BAL0401            -1.   BAL0420             1.
+    SH040220  COST            689.83   TRAN0402            1.
+    SH040220  BAL0402            -1.   BAL0420             1.
+    SH040320  COST            299.97   TRAN0403            1.
+    SH040320  BAL0403            -1.   BAL0420             1.
+    SH040420  COST            114.13   TRAN0404            1.
+    SH040420  BAL0404            -1.   BAL0420             1.
+    SH040520  COST            293.91   TRAN0405            1.
+    SH040520  BAL0405            -1.   BAL0420             1.
+    SH040820  COST            127.26   TRAN0408            1.
+    SH040820  BAL0483            -1.   BAL0420             1.
+    SH040121  COST            407.03   TRAN0401            1.
+    SH040121  BAL0401            -1.   BAL0421             1.
+    SH040221  COST            371.68   TRAN0402            1.
+    SH040221  BAL0402            -1.   BAL0421             1.
+    SH040321  COST            450.46   TRAN0403            1.
+    SH040321  BAL0403            -1.   BAL0421             1.
+    SH040421  COST             323.2   TRAN0404            1.
+    SH040421  BAL0404            -1.   BAL0421             1.
+    SH040521  COST             555.5   TRAN0405            1.
+    SH040521  BAL0405            -1.   BAL0421             1.
+    SH040821  COST             323.2   TRAN0408            1.
+    SH040821  BAL0483            -1.   BAL0421             1.
+    SH040122  COST            250.48   TRAN0401            1.
+    SH040122  BAL0401            -1.   BAL0422             1.
+    SH040222  COST            583.78   TRAN0402            1.
+    SH040222  BAL0402            -1.   BAL0422             1.
+    SH040322  COST            301.99   TRAN0403            1.
+    SH040322  BAL0403            -1.   BAL0422             1.
+    SH040422  COST            226.24   TRAN0404            1.
+    SH040422  BAL0404            -1.   BAL0422             1.
+    SH040522  COST            180.79   TRAN0405            1.
+    SH040522  BAL0405            -1.   BAL0422             1.
+    SH040622  COST             313.1   TRAN0406            1.
+    SH040622  BAL0452            -1.   BAL0422             1.
+    SH040822  COST            140.39   TRAN0408            1.
+    SH040822  BAL0483            -1.   BAL0422             1.
+    SH040123  COST            236.34   TRAN0401            1.
+    SH040123  BAL0401            -1.   BAL0423             1.
+    SH040223  COST            546.41   TRAN0402            1.
+    SH040223  BAL0402            -1.   BAL0423             1.
+    SH040323  COST            289.87   TRAN0403            1.
+    SH040323  BAL0403            -1.   BAL0423             1.
+    SH040423  COST            168.67   TRAN0404            1.
+    SH040423  BAL0404            -1.   BAL0423             1.
+    SH040523  COST            167.66   TRAN0405            1.
+    SH040523  BAL0405            -1.   BAL0423             1.
+    SH040823  COST            140.39   TRAN0408            1.
+    SH040823  BAL0483            -1.   BAL0423             1.
+    SH040124  COST           1450.36   TRAN0401            1.
+    SH040124  BAL0401            -1.   BAL0424             1.
+    SH040125  COST            390.87   TRAN0401            1.
+    SH040125  BAL0401            -1.   BAL0425             1.
+    SH040225  COST            431.27   TRAN0402            1.
+    SH040225  BAL0402            -1.   BAL0425             1.
+    SH040325  COST            516.11   TRAN0403            1.
+    SH040325  BAL0403            -1.   BAL0425             1.
+    SH040425  COST            351.48   TRAN0404            1.
+    SH040425  BAL0404            -1.   BAL0425             1.
+    SH040525  COST            571.66   TRAN0405            1.
+    SH040525  BAL0405            -1.   BAL0425             1.
+    SH040625  COST            407.03   TRAN0406            1.
+    SH040625  BAL0452            -1.   BAL0425             1.
+    SH040825  COST            308.05   TRAN0408            1.
+    SH040825  BAL0483            -1.   BAL0425             1.
+    SH040426  COST             272.7   TRAN0404            1.
+    SH040426  BAL0404            -1.   BAL0426             1.
+    SH040127  COST            236.34   TRAN0401            1.
+    SH040127  BAL0401            -1.   BAL0427             1.
+    SH040227  COST            286.84   TRAN0402            1.
+    SH040227  BAL0402            -1.   BAL0427             1.
+    SH040327  COST            291.89   TRAN0403            1.
+    SH040327  BAL0403            -1.   BAL0427             1.
+    SH040427  COST            338.35   TRAN0404            1.
+    SH040427  BAL0404            -1.   BAL0427             1.
+    SH040527  COST            381.78   TRAN0405            1.
+    SH040527  BAL0405            -1.   BAL0427             1.
+    SH040627  COST            270.68   TRAN0406            1.
+    SH040627  BAL0452            -1.   BAL0427             1.
+    SH040827  COST            254.52   TRAN0408            1.
+    SH040827  BAL0483            -1.   BAL0427             1.
+    SH040128  COST            245.43   TRAN0401            1.
+    SH040128  BAL0401            -1.   BAL0428             1.
+    SH040228  COST            574.69   TRAN0402            1.
+    SH040228  BAL0402            -1.   BAL0428             1.
+    SH040328  COST            298.96   TRAN0403            1.
+    SH040328  BAL0403            -1.   BAL0428             1.
+    SH040428  COST            297.95   TRAN0404            1.
+    SH040428  BAL0404            -1.   BAL0428             1.
+    SH040528  COST            103.02   TRAN0405            1.
+    SH040528  BAL0405            -1.   BAL0428             1.
+    SH040628  COST            263.61   TRAN0406            1.
+    SH040628  BAL0452            -1.   BAL0428             1.
+    SH040728  COST            108.07   TRAN0407            1.
+    SH040728  BAL0464            -1.   BAL0428             1.
+    SH040828  COST            256.54   TRAN0408            1.
+    SH040828  BAL0483            -1.   BAL0428             1.
+    SH040129  COST            225.23   TRAN0401            1.
+    SH040129  BAL0401            -1.   BAL0429             1.
+    SH040229  COST            468.64   TRAN0402            1.
+    SH040229  BAL0402            -1.   BAL0429             1.
+    SH040329  COST            243.41   TRAN0403            1.
+    SH040329  BAL0403            -1.   BAL0429             1.
+    SH040429  COST            200.99   TRAN0404            1.
+    SH040429  BAL0404            -1.   BAL0429             1.
+    SH040529  COST             434.3   TRAN0405            1.
+    SH040529  BAL0405            -1.   BAL0429             1.
+    SH040629  COST            263.61   TRAN0406            1.
+    SH040629  BAL0452            -1.   BAL0429             1.
+    SH040829  COST            145.44   TRAN0408            1.
+    SH040829  BAL0483            -1.   BAL0429             1.
+    SH040130  COST            470.66   TRAN0401            1.
+    SH040130  BAL0401            -1.   BAL0430             1.
+    SH040230  COST            440.36   TRAN0402            1.
+    SH040230  BAL0402            -1.   BAL0430             1.
+    SH040330  COST            528.23   TRAN0403            1.
+    SH040330  BAL0403            -1.   BAL0430             1.
+    SH040430  COST            307.04   TRAN0404            1.
+    SH040430  BAL0404            -1.   BAL0430             1.
+    SH040530  COST            450.46   TRAN0405            1.
+    SH040530  BAL0405            -1.   BAL0430             1.
+    SH040830  COST            385.82   TRAN0408            1.
+    SH040830  BAL0483            -1.   BAL0430             1.
+    SH040131  COST            112.11   TRAN0401            1.
+    SH040131  BAL0401            -1.   BAL0431             1.
+    SH040231  COST            354.51   TRAN0402            1.
+    SH040231  BAL0402            -1.   BAL0431             1.
+    SH040331  COST             111.1   TRAN0403            1.
+    SH040331  BAL0403            -1.   BAL0431             1.
+    SH040431  COST            255.53   TRAN0404            1.
+    SH040431  BAL0404            -1.   BAL0431             1.
+    SH040531  COST            310.07   TRAN0405            1.
+    SH040531  BAL0405            -1.   BAL0431             1.
+    SH040631  COST            113.12   TRAN0406            1.
+    SH040631  BAL0452            -1.   BAL0431             1.
+    SH040831  COST            225.23   TRAN0408            1.
+    SH040831  BAL0483            -1.   BAL0431             1.
+    SH040132  COST            301.99   TRAN0401            1.
+    SH040132  BAL0401            -1.   BAL0432             1.
+    SH040232  COST            482.78   TRAN0402            1.
+    SH040232  BAL0402            -1.   BAL0432             1.
+    SH040332  COST            427.23   TRAN0403            1.
+    SH040332  BAL0403            -1.   BAL0432             1.
+    SH040432  COST            158.57   TRAN0404            1.
+    SH040432  BAL0404            -1.   BAL0432             1.
+    SH040532  COST            395.92   TRAN0405            1.
+    SH040532  BAL0405            -1.   BAL0432             1.
+    SH040832  COST             181.8   TRAN0408            1.
+    SH040832  BAL0483            -1.   BAL0432             1.
+    SH040133  COST            497.93   TRAN0401            1.
+    SH040133  BAL0401            -1.   BAL0433             1.
+    SH040233  COST              404.   TRAN0402            1.
+    SH040233  BAL0402            -1.   BAL0433             1.
+    SH040333  COST            548.43   TRAN0403            1.
+    SH040333  BAL0403            -1.   BAL0433             1.
+    SH040433  COST            449.45   TRAN0404            1.
+    SH040433  BAL0404            -1.   BAL0433             1.
+    SH040533  COST            637.31   TRAN0405            1.
+    SH040533  BAL0405            -1.   BAL0433             1.
+    SH040833  COST            384.81   TRAN0408            1.
+    SH040833  BAL0483            -1.   BAL0433             1.
+    SH040134  COST            389.86   TRAN0401            1.
+    SH040134  BAL0401            -1.   BAL0434             1.
+    SH040234  COST            661.55   TRAN0402            1.
+    SH040234  BAL0402            -1.   BAL0434             1.
+    SH040334  COST            508.03   TRAN0403            1.
+    SH040334  BAL0403            -1.   BAL0434             1.
+    SH040434  COST            213.11   TRAN0404            1.
+    SH040434  BAL0404            -1.   BAL0434             1.
+    SH040534  COST            445.41   TRAN0405            1.
+    SH040534  BAL0405            -1.   BAL0434             1.
+    SH040834  COST            265.63   TRAN0408            1.
+    SH040834  BAL0483            -1.   BAL0434             1.
+    SH040135  COST            465.61   TRAN0401            1.
+    SH040135  BAL0401            -1.   BAL0435             1.
+    SH040235  COST            449.45   TRAN0402            1.
+    SH040235  BAL0402            -1.   BAL0435             1.
+    SH040335  COST            380.77   TRAN0403            1.
+    SH040335  BAL0403            -1.   BAL0435             1.
+    SH040435  COST            123.22   TRAN0404            1.
+    SH040435  BAL0404            -1.   BAL0435             1.
+    SH040535  COST            435.31   TRAN0405            1.
+    SH040535  BAL0405            -1.   BAL0435             1.
+    SH040835  COST            237.35   TRAN0408            1.
+    SH040835  BAL0483            -1.   BAL0435             1.
+    SH040136  COST            207.05   TRAN0401            1.
+    SH040136  BAL0401            -1.   BAL0436             1.
+    SH040236  COST            452.48   TRAN0402            1.
+    SH040236  BAL0402            -1.   BAL0436             1.
+    SH040336  COST            107.06   TRAN0403            1.
+    SH040336  BAL0403            -1.   BAL0436             1.
+    SH040436  COST             373.7   TRAN0404            1.
+    SH040436  BAL0404            -1.   BAL0436             1.
+    SH040536  COST            349.46   TRAN0405            1.
+    SH040536  BAL0405            -1.   BAL0436             1.
+    SH040636  COST             111.1   TRAN0406            1.
+    SH040636  BAL0452            -1.   BAL0436             1.
+    SH040836  COST            324.21   TRAN0408            1.
+    SH040836  BAL0483            -1.   BAL0436             1.
+    SH040137  COST             92.92   TRAN0401            1.
+    SH040137  BAL0401            -1.   BAL0437             1.
+    SH040237  COST            345.42   TRAN0402            1.
+    SH040237  BAL0402            -1.   BAL0437             1.
+    SH040337  COST            159.58   TRAN0403            1.
+    SH040337  BAL0403            -1.   BAL0437             1.
+    SH040437  COST            307.04   TRAN0404            1.
+    SH040437  BAL0404            -1.   BAL0437             1.
+    SH040537  COST            183.82   TRAN0405            1.
+    SH040537  BAL0405            -1.   BAL0437             1.
+    SH040637  COST            195.94   TRAN0406            1.
+    SH040637  BAL0452            -1.   BAL0437             1.
+    SH040837  COST            254.52   TRAN0408            1.
+    SH040837  BAL0483            -1.   BAL0437             1.
+    SH040138  COST            137.36   TRAN0401            1.
+    SH040138  BAL0401            -1.   BAL0438             1.
+    SH040238  COST            246.44   TRAN0402            1.
+    SH040238  BAL0402            -1.   BAL0438             1.
+    SH040338  COST             95.95   TRAN0403            1.
+    SH040338  BAL0403            -1.   BAL0438             1.
+    SH040438  COST            311.08   TRAN0404            1.
+    SH040438  BAL0404            -1.   BAL0438             1.
+    SH040538  COST            280.78   TRAN0405            1.
+    SH040538  BAL0405            -1.   BAL0438             1.
+    SH040638  COST             39.39   TRAN0406            1.
+    SH040638  BAL0452            -1.   BAL0438             1.
+    SH040738  COST            218.16   TRAN0407            1.
+    SH040738  BAL0464            -1.   BAL0438             1.
+    SH040838  COST            239.37   TRAN0408            1.
+    SH040838  BAL0483            -1.   BAL0438             1.
+    SH040139  COST             131.3   TRAN0401            1.
+    SH040139  BAL0401            -1.   BAL0439             1.
+    SH040239  COST            342.39   TRAN0402            1.
+    SH040239  BAL0402            -1.   BAL0439             1.
+    SH040339  COST             161.6   TRAN0403            1.
+    SH040339  BAL0403            -1.   BAL0439             1.
+    SH040439  COST            251.49   TRAN0404            1.
+    SH040439  BAL0404            -1.   BAL0439             1.
+    SH040539  COST            433.29   TRAN0405            1.
+    SH040539  BAL0405            -1.   BAL0439             1.
+    SH040639  COST            206.04   TRAN0406            1.
+    SH040639  BAL0452            -1.   BAL0439             1.
+    SH040839  COST            169.68   TRAN0408            1.
+    SH040839  BAL0483            -1.   BAL0439             1.
+    SH040140  COST            166.65   TRAN0401            1.
+    SH040140  BAL0401            -1.   BAL0440             1.
+    SH040240  COST            381.78   TRAN0402            1.
+    SH040240  BAL0402            -1.   BAL0440             1.
+    SH040340  COST            104.03   TRAN0403            1.
+    SH040340  BAL0403            -1.   BAL0440             1.
+    SH040440  COST            299.97   TRAN0404            1.
+    SH040440  BAL0404            -1.   BAL0440             1.
+    SH040540  COST            223.21   TRAN0405            1.
+    SH040540  BAL0405            -1.   BAL0440             1.
+    SH040640  COST            132.31   TRAN0406            1.
+    SH040640  BAL0452            -1.   BAL0440             1.
+    SH040840  COST            276.74   TRAN0408            1.
+    SH040840  BAL0483            -1.   BAL0440             1.
+    SH040141  COST            197.96   TRAN0401            1.
+    SH040141  BAL0401            -1.   BAL0441             1.
+    SH040241  COST              303.   TRAN0402            1.
+    SH040241  BAL0402            -1.   BAL0441             1.
+    SH040341  COST             151.5   TRAN0403            1.
+    SH040341  BAL0403            -1.   BAL0441             1.
+    SH040441  COST            327.24   TRAN0404            1.
+    SH040441  BAL0404            -1.   BAL0441             1.
+    SH040541  COST            371.68   TRAN0405            1.
+    SH040541  BAL0405            -1.   BAL0441             1.
+    SH040641  COST              101.   TRAN0406            1.
+    SH040641  BAL0452            -1.   BAL0441             1.
+    SH040841  COST            301.99   TRAN0408            1.
+    SH040841  BAL0483            -1.   BAL0441             1.
+    SH040142  COST              90.9   TRAN0401            1.
+    SH040142  BAL0401            -1.   BAL0442             1.
+    SH040242  COST            418.14   TRAN0402            1.
+    SH040242  BAL0402            -1.   BAL0442             1.
+    SH040342  COST             161.6   TRAN0403            1.
+    SH040342  BAL0403            -1.   BAL0442             1.
+    SH040442  COST            196.95   TRAN0404            1.
+    SH040442  BAL0404            -1.   BAL0442             1.
+    SH040542  COST            364.61   TRAN0405            1.
+    SH040542  BAL0405            -1.   BAL0442             1.
+    SH040642  COST            162.61   TRAN0406            1.
+    SH040642  BAL0452            -1.   BAL0442             1.
+    SH040842  COST            153.52   TRAN0408            1.
+    SH040842  BAL0483            -1.   BAL0442             1.
+    SH040143  COST            160.59   TRAN0401            1.
+    SH040143  BAL0401            -1.   BAL0443             1.
+    SH040243  COST            398.95   TRAN0402            1.
+    SH040243  BAL0402            -1.   BAL0443             1.
+    SH040343  COST             25.25   TRAN0403            1.
+    SH040343  BAL0403            -1.   BAL0443             1.
+    SH040443  COST            298.96   TRAN0404            1.
+    SH040443  BAL0404            -1.   BAL0443             1.
+    SH040543  COST            260.58   TRAN0405            1.
+    SH040543  BAL0405            -1.   BAL0443             1.
+    SH040643  COST              101.   TRAN0406            1.
+    SH040643  BAL0452            -1.   BAL0443             1.
+    SH040743  COST            243.41   TRAN0407            1.
+    SH040743  BAL0464            -1.   BAL0443             1.
+    SH040843  COST            273.71   TRAN0408            1.
+    SH040843  BAL0483            -1.   BAL0443             1.
+    SH040144  COST            160.59   TRAN0401            1.
+    SH040144  BAL0401            -1.   BAL0444             1.
+    SH040244  COST            382.79   TRAN0402            1.
+    SH040244  BAL0402            -1.   BAL0444             1.
+    SH040344  COST            129.28   TRAN0403            1.
+    SH040344  BAL0403            -1.   BAL0444             1.
+    SH040444  COST            315.12   TRAN0404            1.
+    SH040444  BAL0404            -1.   BAL0444             1.
+    SH040544  COST             313.1   TRAN0405            1.
+    SH040544  BAL0405            -1.   BAL0444             1.
+    SH040644  COST             89.89   TRAN0406            1.
+    SH040644  BAL0452            -1.   BAL0444             1.
+    SH040844  COST            300.98   TRAN0408            1.
+    SH040844  BAL0483            -1.   BAL0444             1.
+    SH040145  COST            173.72   TRAN0401            1.
+    SH040145  BAL0401            -1.   BAL0445             1.
+    SH040245  COST            440.36   TRAN0402            1.
+    SH040245  BAL0402            -1.   BAL0445             1.
+    SH040345  COST            162.61   TRAN0403            1.
+    SH040345  BAL0403            -1.   BAL0445             1.
+    SH040445  COST            294.92   TRAN0404            1.
+    SH040445  BAL0404            -1.   BAL0445             1.
+    SH040545  COST            236.34   TRAN0405            1.
+    SH040545  BAL0405            -1.   BAL0445             1.
+    SH040645  COST            192.91   TRAN0406            1.
+    SH040645  BAL0452            -1.   BAL0445             1.
+    SH040745  COST            198.97   TRAN0407            1.
+    SH040745  BAL0464            -1.   BAL0445             1.
+    SH040845  COST            308.05   TRAN0408            1.
+    SH040845  BAL0483            -1.   BAL0445             1.
+    SH040146  COST            247.45   TRAN0401            1.
+    SH040146  BAL0401            -1.   BAL0446             1.
+    SH040246  COST            275.73   TRAN0402            1.
+    SH040246  BAL0402            -1.   BAL0446             1.
+    SH040346  COST            223.21   TRAN0403            1.
+    SH040346  BAL0403            -1.   BAL0446             1.
+    SH040446  COST            451.47   TRAN0404            1.
+    SH040446  BAL0404            -1.   BAL0446             1.
+    SH040546  COST             434.3   TRAN0405            1.
+    SH040546  BAL0405            -1.   BAL0446             1.
+    SH040646  COST            259.57   TRAN0406            1.
+    SH040646  BAL0452            -1.   BAL0446             1.
+    SH040846  COST            452.48   TRAN0408            1.
+    SH040846  BAL0483            -1.   BAL0446             1.
+    SH040147  COST             111.1   TRAN0401            1.
+    SH040147  BAL0401            -1.   BAL0447             1.
+    SH040247  COST            376.73   TRAN0402            1.
+    SH040247  BAL0402            -1.   BAL0447             1.
+    SH040347  COST            160.59   TRAN0403            1.
+    SH040347  BAL0403            -1.   BAL0447             1.
+    SH040447  COST            276.74   TRAN0404            1.
+    SH040447  BAL0404            -1.   BAL0447             1.
+    SH040547  COST            235.33   TRAN0405            1.
+    SH040547  BAL0405            -1.   BAL0447             1.
+    SH040647  COST            146.45   TRAN0406            1.
+    SH040647  BAL0452            -1.   BAL0447             1.
+    SH040847  COST            246.44   TRAN0408            1.
+    SH040847  BAL0483            -1.   BAL0447             1.
+    SH040148  COST             95.95   TRAN0401            1.
+    SH040148  BAL0401            -1.   BAL0448             1.
+    SH040248  COST            342.39   TRAN0402            1.
+    SH040248  BAL0402            -1.   BAL0448             1.
+    SH040348  COST            138.37   TRAN0403            1.
+    SH040348  BAL0403            -1.   BAL0448             1.
+    SH040448  COST             232.3   TRAN0404            1.
+    SH040448  BAL0404            -1.   BAL0448             1.
+    SH040548  COST            249.47   TRAN0405            1.
+    SH040548  BAL0405            -1.   BAL0448             1.
+    SH040648  COST            116.15   TRAN0406            1.
+    SH040648  BAL0452            -1.   BAL0448             1.
+    SH040848  COST            196.95   TRAN0408            1.
+    SH040848  BAL0483            -1.   BAL0448             1.
+    SH040149  COST            332.29   TRAN0401            1.
+    SH040149  BAL0401            -1.   BAL0449             1.
+    SH040249  COST            540.35   TRAN0402            1.
+    SH040249  BAL0402            -1.   BAL0449             1.
+    SH040349  COST            335.32   TRAN0403            1.
+    SH040349  BAL0403            -1.   BAL0449             1.
+    SH040449  COST            384.81   TRAN0404            1.
+    SH040449  BAL0404            -1.   BAL0449             1.
+    SH040549  COST            153.52   TRAN0405            1.
+    SH040549  BAL0405            -1.   BAL0449             1.
+    SH040649  COST            341.38   TRAN0406            1.
+    SH040649  BAL0452            -1.   BAL0449             1.
+    SH040749  COST            135.34   TRAN0407            1.
+    SH040749  BAL0464            -1.   BAL0449             1.
+    SH040849  COST            412.08   TRAN0408            1.
+    SH040849  BAL0483            -1.   BAL0449             1.
+    SH040150  COST            243.41   TRAN0401            1.
+    SH040150  BAL0401            -1.   BAL0450             1.
+    SH040250  COST            618.12   TRAN0402            1.
+    SH040250  BAL0402            -1.   BAL0450             1.
+    SH040350  COST            248.46   TRAN0403            1.
+    SH040350  BAL0403            -1.   BAL0450             1.
+    SH040450  COST            368.65   TRAN0404            1.
+    SH040450  BAL0404            -1.   BAL0450             1.
+    SH040550  COST            237.35   TRAN0405            1.
+    SH040550  BAL0405            -1.   BAL0450             1.
+    SH040750  COST            138.37   TRAN0407            1.
+    SH040750  BAL0464            -1.   BAL0450             1.
+    SH040850  COST            410.06   TRAN0408            1.
+    SH040850  BAL0483            -1.   BAL0450             1.
+    SH040151  COST            335.32   TRAN0401            1.
+    SH040151  BAL0401            -1.   BAL0451             1.
+    SH040251  COST             555.5   TRAN0402            1.
+    SH040251  BAL0402            -1.   BAL0451             1.
+    SH040351  COST            344.41   TRAN0403            1.
+    SH040351  BAL0403            -1.   BAL0451             1.
+    SH040451  COST            341.38   TRAN0404            1.
+    SH040451  BAL0404            -1.   BAL0451             1.
+    SH040551  COST            124.23   TRAN0405            1.
+    SH040551  BAL0405            -1.   BAL0451             1.
+    SH040751  COST             99.99   TRAN0407            1.
+    SH040751  BAL0464            -1.   BAL0451             1.
+    SH040851  COST            432.28   TRAN0408            1.
+    SH040851  BAL0483            -1.   BAL0451             1.
+    SH040152  COST            113.12   TRAN0401            1.
+    SH040152  BAL0401            -1.   BAL0452             1.
+    SH040252  COST              303.   TRAN0402            1.
+    SH040252  BAL0402            -1.   BAL0452             1.
+    SH040352  COST             82.82   TRAN0403            1.
+    SH040352  BAL0403            -1.   BAL0452             1.
+    SH040452  COST            325.22   TRAN0404            1.
+    SH040452  BAL0404            -1.   BAL0452             1.
+    SH040552  COST            297.95   TRAN0405            1.
+    SH040552  BAL0405            -1.   BAL0452             1.
+    SH040852  COST            255.53   TRAN0408            1.
+    SH040852  BAL0483            -1.   BAL0452             1.
+    SH040153  COST            362.59   TRAN0401            1.
+    SH040153  BAL0401            -1.   BAL0453             1.
+    SH040253  COST            642.36   TRAN0402            1.
+    SH040253  BAL0402            -1.   BAL0453             1.
+    SH040353  COST            328.25   TRAN0403            1.
+    SH040353  BAL0403            -1.   BAL0453             1.
+    SH040453  COST            416.12   TRAN0404            1.
+    SH040453  BAL0404            -1.   BAL0453             1.
+    SH040553  COST            185.84   TRAN0405            1.
+    SH040553  BAL0405            -1.   BAL0453             1.
+    SH040653  COST            362.59   TRAN0406            1.
+    SH040653  BAL0452            -1.   BAL0453             1.
+    SH040753  COST            147.46   TRAN0407            1.
+    SH040753  BAL0464            -1.   BAL0453             1.
+    SH040853  COST            407.03   TRAN0408            1.
+    SH040853  BAL0483            -1.   BAL0453             1.
+    SH040154  COST            186.85   TRAN0401            1.
+    SH040154  BAL0401            -1.   BAL0454             1.
+    SH040254  COST            449.45   TRAN0402            1.
+    SH040254  BAL0402            -1.   BAL0454             1.
+    SH040354  COST            219.17   TRAN0403            1.
+    SH040354  BAL0403            -1.   BAL0454             1.
+    SH040454  COST            346.43   TRAN0404            1.
+    SH040454  BAL0404            -1.   BAL0454             1.
+    SH040554  COST            215.13   TRAN0405            1.
+    SH040554  BAL0405            -1.   BAL0454             1.
+    SH040654  COST            205.03   TRAN0406            1.
+    SH040654  BAL0452            -1.   BAL0454             1.
+    SH040854  COST            406.02   TRAN0408            1.
+    SH040854  BAL0483            -1.   BAL0454             1.
+    SH040155  COST            280.78   TRAN0401            1.
+    SH040155  BAL0401            -1.   BAL0455             1.
+    SH040255  COST            483.79   TRAN0402            1.
+    SH040255  BAL0402            -1.   BAL0455             1.
+    SH040355  COST            283.81   TRAN0403            1.
+    SH040355  BAL0403            -1.   BAL0455             1.
+    SH040455  COST            296.94   TRAN0404            1.
+    SH040455  BAL0404            -1.   BAL0455             1.
+    SH040555  COST            155.54   TRAN0405            1.
+    SH040555  BAL0405            -1.   BAL0455             1.
+    SH040655  COST             292.9   TRAN0406            1.
+    SH040655  BAL0452            -1.   BAL0455             1.
+    SH040755  COST            108.07   TRAN0407            1.
+    SH040755  BAL0464            -1.   BAL0455             1.
+    SH040855  COST            296.94   TRAN0408            1.
+    SH040855  BAL0483            -1.   BAL0455             1.
+    SH040156  COST             393.9   TRAN0401            1.
+    SH040156  BAL0401            -1.   BAL0456             1.
+    SH040256  COST            584.79   TRAN0402            1.
+    SH040256  BAL0402            -1.   BAL0456             1.
+    SH040356  COST            308.05   TRAN0403            1.
+    SH040356  BAL0403            -1.   BAL0456             1.
+    SH040456  COST            368.65   TRAN0404            1.
+    SH040456  BAL0404            -1.   BAL0456             1.
+    SH040556  COST            137.36   TRAN0405            1.
+    SH040556  BAL0405            -1.   BAL0456             1.
+    SH040656  COST            342.39   TRAN0406            1.
+    SH040656  BAL0452            -1.   BAL0456             1.
+    SH040756  COST            123.22   TRAN0407            1.
+    SH040756  BAL0464            -1.   BAL0456             1.
+    SH040856  COST            360.57   TRAN0408            1.
+    SH040856  BAL0483            -1.   BAL0456             1.
+    SH040157  COST            263.61   TRAN0401            1.
+    SH040157  BAL0401            -1.   BAL0457             1.
+    SH040257  COST             525.2   TRAN0402            1.
+    SH040257  BAL0402            -1.   BAL0457             1.
+    SH040357  COST             292.9   TRAN0403            1.
+    SH040357  BAL0403            -1.   BAL0457             1.
+    SH040457  COST            236.34   TRAN0404            1.
+    SH040457  BAL0404            -1.   BAL0457             1.
+    SH040557  COST            169.68   TRAN0405            1.
+    SH040557  BAL0405            -1.   BAL0457             1.
+    SH040657  COST            322.19   TRAN0406            1.
+    SH040657  BAL0452            -1.   BAL0457             1.
+    SH040757  COST            149.48   TRAN0407            1.
+    SH040757  BAL0464            -1.   BAL0457             1.
+    SH040857  COST            233.31   TRAN0408            1.
+    SH040857  BAL0483            -1.   BAL0457             1.
+    SH040158  COST            296.94   TRAN0401            1.
+    SH040158  BAL0401            -1.   BAL0458             1.
+    SH040258  COST            526.21   TRAN0402            1.
+    SH040258  BAL0402            -1.   BAL0458             1.
+    SH040358  COST            280.78   TRAN0403            1.
+    SH040358  BAL0403            -1.   BAL0458             1.
+    SH040458  COST            346.43   TRAN0404            1.
+    SH040458  BAL0404            -1.   BAL0458             1.
+    SH040558  COST             21.21   TRAN0405            1.
+    SH040558  BAL0405            -1.   BAL0458             1.
+    SH040658  COST            329.26   TRAN0406            1.
+    SH040658  BAL0452            -1.   BAL0458             1.
+    SH040758  COST             68.68   TRAN0407            1.
+    SH040758  BAL0464            -1.   BAL0458             1.
+    SH040858  COST            256.54   TRAN0408            1.
+    SH040858  BAL0483            -1.   BAL0458             1.
+    SH040159  COST            208.06   TRAN0401            1.
+    SH040159  BAL0401            -1.   BAL0459             1.
+    SH040259  COST            502.98   TRAN0402            1.
+    SH040259  BAL0402            -1.   BAL0459             1.
+    SH040359  COST            240.38   TRAN0403            1.
+    SH040359  BAL0403            -1.   BAL0459             1.
+    SH040459  COST            246.44   TRAN0404            1.
+    SH040459  BAL0404            -1.   BAL0459             1.
+    SH040559  COST            160.59   TRAN0405            1.
+    SH040559  BAL0405            -1.   BAL0459             1.
+    SH040659  COST            299.97   TRAN0406            1.
+    SH040659  BAL0452            -1.   BAL0459             1.
+    SH040759  COST            106.05   TRAN0407            1.
+    SH040759  BAL0464            -1.   BAL0459             1.
+    SH040859  COST            257.55   TRAN0408            1.
+    SH040859  BAL0483            -1.   BAL0459             1.
+    SH040160  COST            263.61   TRAN0401            1.
+    SH040160  BAL0401            -1.   BAL0460             1.
+    SH040260  COST             555.5   TRAN0402            1.
+    SH040260  BAL0402            -1.   BAL0460             1.
+    SH040360  COST            285.83   TRAN0403            1.
+    SH040360  BAL0403            -1.   BAL0460             1.
+    SH040460  COST            315.12   TRAN0404            1.
+    SH040460  BAL0404            -1.   BAL0460             1.
+    SH040560  COST            136.35   TRAN0405            1.
+    SH040560  BAL0405            -1.   BAL0460             1.
+    SH040660  COST            326.23   TRAN0406            1.
+    SH040660  BAL0452            -1.   BAL0460             1.
+    SH040760  COST             88.88   TRAN0407            1.
+    SH040760  BAL0464            -1.   BAL0460             1.
+    SH040860  COST            301.99   TRAN0408            1.
+    SH040860  BAL0483            -1.   BAL0460             1.
+    SH040163  COST            268.66   TRAN0401            1.
+    SH040163  BAL0401            -1.   BAL0463             1.
+    SH040263  COST            498.94   TRAN0402            1.
+    SH040263  BAL0402            -1.   BAL0463             1.
+    SH040363  COST            289.87   TRAN0403            1.
+    SH040363  BAL0403            -1.   BAL0463             1.
+    SH040463  COST            372.69   TRAN0404            1.
+    SH040463  BAL0404            -1.   BAL0463             1.
+    SH040563  COST            153.52   TRAN0405            1.
+    SH040563  BAL0405            -1.   BAL0463             1.
+    SH040663  COST            318.15   TRAN0406            1.
+    SH040663  BAL0452            -1.   BAL0463             1.
+    SH040763  COST            125.24   TRAN0407            1.
+    SH040763  BAL0464            -1.   BAL0463             1.
+    SH040863  COST              404.   TRAN0408            1.
+    SH040863  BAL0483            -1.   BAL0463             1.
+    SH040164  COST            200.99   TRAN0401            1.
+    SH040164  BAL0401            -1.   BAL0464             1.
+    SH040264  COST            531.26   TRAN0402            1.
+    SH040264  BAL0402            -1.   BAL0464             1.
+    SH040364  COST            225.23   TRAN0403            1.
+    SH040364  BAL0403            -1.   BAL0464             1.
+    SH040464  COST            339.36   TRAN0404            1.
+    SH040464  BAL0404            -1.   BAL0464             1.
+    SH040564  COST             58.58   TRAN0405            1.
+    SH040564  BAL0405            -1.   BAL0464             1.
+    SH040664  COST            320.17   TRAN0406            1.
+    SH040664  BAL0452            -1.   BAL0464             1.
+    SH040864  COST             252.5   TRAN0408            1.
+    SH040864  BAL0483            -1.   BAL0464             1.
+    SH040165  COST            436.32   TRAN0401            1.
+    SH040165  BAL0401            -1.   BAL0465             1.
+    SH040265  COST            310.07   TRAN0402            1.
+    SH040265  BAL0402            -1.   BAL0465             1.
+    SH040365  COST            510.05   TRAN0403            1.
+    SH040365  BAL0403            -1.   BAL0465             1.
+    SH040465  COST            391.88   TRAN0404            1.
+    SH040465  BAL0404            -1.   BAL0465             1.
+    SH040565  COST            610.04   TRAN0405            1.
+    SH040565  BAL0405            -1.   BAL0465             1.
+    SH040865  COST            419.15   TRAN0408            1.
+    SH040865  BAL0483            -1.   BAL0465             1.
+    SH040166  COST             565.6   TRAN0401            1.
+    SH040166  BAL0401            -1.   BAL0466             1.
+    SH040266  COST            261.59   TRAN0402            1.
+    SH040266  BAL0402            -1.   BAL0466             1.
+    SH040366  COST            583.78   TRAN0403            1.
+    SH040366  BAL0403            -1.   BAL0466             1.
+    SH040466  COST            561.56   TRAN0404            1.
+    SH040466  BAL0404            -1.   BAL0466             1.
+    SH040566  COST             717.1   TRAN0405            1.
+    SH040566  BAL0405            -1.   BAL0466             1.
+    SH040866  COST             565.6   TRAN0408            1.
+    SH040866  BAL0483            -1.   BAL0466             1.
+    SH040167  COST            429.25   TRAN0401            1.
+    SH040167  BAL0401            -1.   BAL0467             1.
+    SH040267  COST            234.32   TRAN0402            1.
+    SH040267  BAL0402            -1.   BAL0467             1.
+    SH040367  COST            497.93   TRAN0403            1.
+    SH040367  BAL0403            -1.   BAL0467             1.
+    SH040467  COST            461.57   TRAN0404            1.
+    SH040467  BAL0404            -1.   BAL0467             1.
+    SH040567  COST            610.04   TRAN0405            1.
+    SH040567  BAL0405            -1.   BAL0467             1.
+    SH040867  COST            462.58   TRAN0408            1.
+    SH040867  BAL0483            -1.   BAL0467             1.
+    SH040168  COST            599.94   TRAN0401            1.
+    SH040168  BAL0401            -1.   BAL0468             1.
+    SH040268  COST              404.   TRAN0402            1.
+    SH040268  BAL0402            -1.   BAL0468             1.
+    SH040368  COST             565.6   TRAN0403            1.
+    SH040368  BAL0403            -1.   BAL0468             1.
+    SH040468  COST            709.02   TRAN0404            1.
+    SH040468  BAL0404            -1.   BAL0468             1.
+    SH040568  COST            955.46   TRAN0405            1.
+    SH040568  BAL0405            -1.   BAL0468             1.
+    SH040868  COST            758.51   TRAN0408            1.
+    SH040868  BAL0483            -1.   BAL0468             1.
+    SH040169  COST            544.39   TRAN0401            1.
+    SH040169  BAL0401            -1.   BAL0469             1.
+    SH040269  COST            223.21   TRAN0402            1.
+    SH040269  BAL0402            -1.   BAL0469             1.
+    SH040369  COST             515.1   TRAN0403            1.
+    SH040369  BAL0403            -1.   BAL0469             1.
+    SH040469  COST            628.22   TRAN0404            1.
+    SH040469  BAL0404            -1.   BAL0469             1.
+    SH040569  COST            652.46   TRAN0405            1.
+    SH040569  BAL0405            -1.   BAL0469             1.
+    SH040869  COST            664.58   TRAN0408            1.
+    SH040869  BAL0483            -1.   BAL0469             1.
+    SH040171  COST             444.4   TRAN0401            1.
+    SH040171  BAL0401            -1.   BAL0471             1.
+    SH040371  COST            529.24   TRAN0403            1.
+    SH040371  BAL0403            -1.   BAL0471             1.
+    SH040471  COST            526.21   TRAN0404            1.
+    SH040471  BAL0404            -1.   BAL0471             1.
+    SH040571  COST            586.81   TRAN0405            1.
+    SH040571  BAL0405            -1.   BAL0471             1.
+    SH040671  COST            394.91   TRAN0406            1.
+    SH040671  BAL0452            -1.   BAL0471             1.
+    SH040771  COST            711.04   TRAN0407            1.
+    SH040771  BAL0464            -1.   BAL0471             1.
+    SH040871  COST            538.33   TRAN0408            1.
+    SH040871  BAL0483            -1.   BAL0471             1.
+    SH040172  COST            592.87   TRAN0401            1.
+    SH040172  BAL0401            -1.   BAL0472             1.
+    SH040272  COST            548.43   TRAN0402            1.
+    SH040272  BAL0402            -1.   BAL0472             1.
+    SH040372  COST            623.17   TRAN0403            1.
+    SH040372  BAL0403            -1.   BAL0472             1.
+    SH040472  COST             575.7   TRAN0404            1.
+    SH040472  BAL0404            -1.   BAL0472             1.
+    SH040572  COST            770.63   TRAN0405            1.
+    SH040572  BAL0405            -1.   BAL0472             1.
+    SH040872  COST             575.7   TRAN0408            1.
+    SH040872  BAL0483            -1.   BAL0472             1.
+    SH040173  COST             393.9   TRAN0401            1.
+    SH040173  BAL0401            -1.   BAL0473             1.
+    SH040273  COST            368.65   TRAN0402            1.
+    SH040273  BAL0402            -1.   BAL0473             1.
+    SH040373  COST            341.38   TRAN0403            1.
+    SH040373  BAL0403            -1.   BAL0473             1.
+    SH040473  COST            461.57   TRAN0404            1.
+    SH040473  BAL0404            -1.   BAL0473             1.
+    SH040573  COST            569.64   TRAN0405            1.
+    SH040573  BAL0405            -1.   BAL0473             1.
+    SH040673  COST            308.05   TRAN0406            1.
+    SH040673  BAL0452            -1.   BAL0473             1.
+    SH040873  COST            509.04   TRAN0408            1.
+    SH040873  BAL0483            -1.   BAL0473             1.
+    SH040174  COST            553.48   TRAN0401            1.
+    SH040174  BAL0401            -1.   BAL0474             1.
+    SH040274  COST             212.1   TRAN0402            1.
+    SH040274  BAL0402            -1.   BAL0474             1.
+    SH040374  COST             575.7   TRAN0403            1.
+    SH040374  BAL0403            -1.   BAL0474             1.
+    SH040474  COST            643.37   TRAN0404            1.
+    SH040474  BAL0404            -1.   BAL0474             1.
+    SH040574  COST            740.33   TRAN0405            1.
+    SH040574  BAL0405            -1.   BAL0474             1.
+    SH040874  COST            625.19   TRAN0408            1.
+    SH040874  BAL0483            -1.   BAL0474             1.
+    SH040275  COST            559.54   TRAN0402            1.
+    SH040275  BAL0402            -1.   BAL0475             1.
+    SH040176  COST            466.62   TRAN0401            1.
+    SH040176  BAL0401            -1.   BAL0476             1.
+    SH040276  COST            405.01   TRAN0402            1.
+    SH040276  BAL0402            -1.   BAL0476             1.
+    SH040376  COST            407.03   TRAN0403            1.
+    SH040376  BAL0403            -1.   BAL0476             1.
+    SH040476  COST             636.3   TRAN0404            1.
+    SH040476  BAL0404            -1.   BAL0476             1.
+    SH040576  COST             636.3   TRAN0405            1.
+    SH040576  BAL0405            -1.   BAL0476             1.
+    SH040676  COST            384.81   TRAN0406            1.
+    SH040676  BAL0452            -1.   BAL0476             1.
+    SH040876  COST            784.77   TRAN0408            1.
+    SH040876  BAL0483            -1.   BAL0476             1.
+    SH040177  COST            439.35   TRAN0401            1.
+    SH040177  BAL0401            -1.   BAL0477             1.
+    SH040277  COST            274.72   TRAN0402            1.
+    SH040277  BAL0402            -1.   BAL0477             1.
+    SH040377  COST            465.61   TRAN0403            1.
+    SH040377  BAL0403            -1.   BAL0477             1.
+    SH040477  COST            405.01   TRAN0404            1.
+    SH040477  BAL0404            -1.   BAL0477             1.
+    SH040577  COST             565.6   TRAN0405            1.
+    SH040577  BAL0405            -1.   BAL0477             1.
+    SH040877  COST             323.2   TRAN0408            1.
+    SH040877  BAL0483            -1.   BAL0477             1.
+    SH040178  COST            768.61   TRAN0401            1.
+    SH040178  BAL0401            -1.   BAL0478             1.
+    SH040278  COST            446.42   TRAN0402            1.
+    SH040278  BAL0402            -1.   BAL0478             1.
+    SH040378  COST            790.83   TRAN0403            1.
+    SH040378  BAL0403            -1.   BAL0478             1.
+    SH040478  COST            691.85   TRAN0404            1.
+    SH040478  BAL0404            -1.   BAL0478             1.
+    SH040578  COST            887.79   TRAN0405            1.
+    SH040578  BAL0405            -1.   BAL0478             1.
+    SH040878  COST            773.66   TRAN0408            1.
+    SH040878  BAL0483            -1.   BAL0478             1.
+    SH040179  COST            722.15   TRAN0401            1.
+    SH040179  BAL0401            -1.   BAL0479             1.
+    SH040279  COST            271.69   TRAN0402            1.
+    SH040279  BAL0402            -1.   BAL0479             1.
+    SH040379  COST            697.91   TRAN0403            1.
+    SH040379  BAL0403            -1.   BAL0479             1.
+    SH040479  COST             727.2   TRAN0404            1.
+    SH040479  BAL0404            -1.   BAL0479             1.
+    SH040879  COST            713.06   TRAN0408            1.
+    SH040879  BAL0483            -1.   BAL0479             1.
+    SH040180  COST            320.17   TRAN0401            1.
+    SH040180  BAL0401            -1.   BAL0480             1.
+    SH040280  COST            398.95   TRAN0402            1.
+    SH040280  BAL0402            -1.   BAL0480             1.
+    SH040380  COST            441.37   TRAN0403            1.
+    SH040380  BAL0403            -1.   BAL0480             1.
+    SH040480  COST            377.74   TRAN0404            1.
+    SH040480  BAL0404            -1.   BAL0480             1.
+    SH040580  COST            510.05   TRAN0405            1.
+    SH040580  BAL0405            -1.   BAL0480             1.
+    SH040880  COST             242.4   TRAN0408            1.
+    SH040880  BAL0483            -1.   BAL0480             1.
+    SH040182  COST            587.82   TRAN0401            1.
+    SH040182  BAL0401            -1.   BAL0482             1.
+    SH040282  COST            332.29   TRAN0402            1.
+    SH040282  BAL0402            -1.   BAL0482             1.
+    SH040382  COST            661.55   TRAN0403            1.
+    SH040382  BAL0403            -1.   BAL0482             1.
+    SH040482  COST            713.06   TRAN0404            1.
+    SH040482  BAL0404            -1.   BAL0482             1.
+    SH040582  COST           1158.47   TRAN0405            1.
+    SH040582  BAL0405            -1.   BAL0482             1.
+    SH040882  COST            790.83   TRAN0408            1.
+    SH040882  BAL0483            -1.   BAL0482             1.
+    SH040183  COST            178.77   TRAN0401            1.
+    SH040183  BAL0401            -1.   BAL0483             1.
+    SH040283  COST             525.2   TRAN0402            1.
+    SH040283  BAL0402            -1.   BAL0483             1.
+    SH040383  COST            274.72   TRAN0403            1.
+    SH040383  BAL0403            -1.   BAL0483             1.
+    SH040483  COST             59.59   TRAN0404            1.
+    SH040483  BAL0404            -1.   BAL0483             1.
+    SH040583  COST            350.47   TRAN0405            1.
+    SH040583  BAL0405            -1.   BAL0483             1.
+    SH040683  COST            250.48   TRAN0406            1.
+    SH040683  BAL0452            -1.   BAL0483             1.
+    SH040184  COST            307.04   TRAN0401            1.
+    SH040184  BAL0401            -1.   BAL0484             1.
+    SH040284  COST            193.92   TRAN0402            1.
+    SH040284  BAL0402            -1.   BAL0484             1.
+    SH040384  COST            367.64   TRAN0403            1.
+    SH040384  BAL0403            -1.   BAL0484             1.
+    SH040484  COST             373.7   TRAN0404            1.
+    SH040484  BAL0404            -1.   BAL0484             1.
+    SH040584  COST             494.9   TRAN0405            1.
+    SH040584  BAL0405            -1.   BAL0484             1.
+    SH040684  COST            308.05   TRAN0406            1.
+    SH040684  BAL0452            -1.   BAL0484             1.
+    SH040884  COST            391.88   TRAN0408            1.
+    SH040884  BAL0483            -1.   BAL0484             1.
+    SH050201  COST            490.05   TRAN0502            1.
+    SH050201  BAL0502            -1.   BAL0501             1.
+    SH050301  COST             188.1   TRAN0503            1.
+    SH050301  BAL0503            -1.   BAL0501             1.
+    SH050401  COST             343.2   TRAN0504            1.
+    SH050401  BAL0504            -1.   BAL0501             1.
+    SH050501  COST            391.05   TRAN0505            1.
+    SH050501  BAL0505            -1.   BAL0501             1.
+    SH050601  COST             207.9   TRAN0506            1.
+    SH050601  BAL0552            -1.   BAL0501             1.
+    SH050801  COST            235.95   TRAN0508            1.
+    SH050801  BAL0583            -1.   BAL0501             1.
+    SH050102  COST             782.1   TRAN0501            1.
+    SH050102  BAL0501            -1.   BAL0502             1.
+    SH050302  COST            688.05   TRAN0503            1.
+    SH050302  BAL0503            -1.   BAL0502             1.
+    SH050402  COST            1009.8   TRAN0504            1.
+    SH050402  BAL0504            -1.   BAL0502             1.
+    SH050502  COST           1222.65   TRAN0505            1.
+    SH050502  BAL0505            -1.   BAL0502             1.
+    SH050602  COST             623.7   TRAN0506            1.
+    SH050602  BAL0552            -1.   BAL0502             1.
+    SH050802  COST            859.65   TRAN0508            1.
+    SH050802  BAL0583            -1.   BAL0502             1.
+    SH050103  COST            404.25   TRAN0501            1.
+    SH050103  BAL0501            -1.   BAL0503             1.
+    SH050203  COST             782.1   TRAN0502            1.
+    SH050203  BAL0502            -1.   BAL0503             1.
+    SH050403  COST            605.55   TRAN0504            1.
+    SH050403  BAL0504            -1.   BAL0503             1.
+    SH050503  COST             468.6   TRAN0505            1.
+    SH050503  BAL0505            -1.   BAL0503             1.
+    SH050603  COST             148.5   TRAN0506            1.
+    SH050603  BAL0552            -1.   BAL0503             1.
+    SH050803  COST            420.75   TRAN0508            1.
+    SH050803  BAL0583            -1.   BAL0503             1.
+    SH050104  COST             287.1   TRAN0501            1.
+    SH050104  BAL0501            -1.   BAL0504             1.
+    SH050204  COST            829.95   TRAN0502            1.
+    SH050204  BAL0502            -1.   BAL0504             1.
+    SH050304  COST            400.95   TRAN0503            1.
+    SH050304  BAL0503            -1.   BAL0504             1.
+    SH050504  COST            526.35   TRAN0505            1.
+    SH050504  BAL0505            -1.   BAL0504             1.
+    SH050604  COST            404.25   TRAN0506            1.
+    SH050604  BAL0552            -1.   BAL0504             1.
+    SH050704  COST            443.85   TRAN0507            1.
+    SH050704  BAL0564            -1.   BAL0504             1.
+    SH050804  COST              95.7   TRAN0508            1.
+    SH050804  BAL0583            -1.   BAL0504             1.
+    SH050105  COST             445.5   TRAN0501            1.
+    SH050105  BAL0501            -1.   BAL0505             1.
+    SH050205  COST             851.4   TRAN0502            1.
+    SH050205  BAL0502            -1.   BAL0505             1.
+    SH050305  COST             468.6   TRAN0503            1.
+    SH050305  BAL0503            -1.   BAL0505             1.
+    SH050405  COST            470.25   TRAN0504            1.
+    SH050405  BAL0504            -1.   BAL0505             1.
+    SH050605  COST             537.9   TRAN0506            1.
+    SH050605  BAL0552            -1.   BAL0505             1.
+    SH050705  COST             551.1   TRAN0507            1.
+    SH050705  BAL0564            -1.   BAL0505             1.
+    SH050805  COST            447.15   TRAN0508            1.
+    SH050805  BAL0583            -1.   BAL0505             1.
+    SH050106  COST            328.35   TRAN0501            1.
+    SH050106  BAL0501            -1.   BAL0506             1.
+    SH050206  COST            688.05   TRAN0502            1.
+    SH050206  BAL0502            -1.   BAL0506             1.
+    SH050306  COST            351.45   TRAN0503            1.
+    SH050306  BAL0503            -1.   BAL0506             1.
+    SH050406  COST            361.35   TRAN0504            1.
+    SH050406  BAL0504            -1.   BAL0506             1.
+    SH050506  COST             415.8   TRAN0505            1.
+    SH050506  BAL0505            -1.   BAL0506             1.
+    SH050606  COST             339.9   TRAN0506            1.
+    SH050606  BAL0552            -1.   BAL0506             1.
+    SH050706  COST              330.   TRAN0507            1.
+    SH050706  BAL0564            -1.   BAL0506             1.
+    SH050806  COST            249.15   TRAN0508            1.
+    SH050806  BAL0583            -1.   BAL0506             1.
+    SH050107  COST             34.65   TRAN0501            1.
+    SH050107  BAL0501            -1.   BAL0507             1.
+    SH050207  COST             481.8   TRAN0502            1.
+    SH050207  BAL0502            -1.   BAL0507             1.
+    SH050307  COST             204.6   TRAN0503            1.
+    SH050307  BAL0503            -1.   BAL0507             1.
+    SH050407  COST            341.55   TRAN0504            1.
+    SH050407  BAL0504            -1.   BAL0507             1.
+    SH050507  COST            377.85   TRAN0505            1.
+    SH050507  BAL0505            -1.   BAL0507             1.
+    SH050607  COST            206.25   TRAN0506            1.
+    SH050607  BAL0552            -1.   BAL0507             1.
+    SH050707  COST             382.8   TRAN0507            1.
+    SH050707  BAL0564            -1.   BAL0507             1.
+    SH050807  COST            255.75   TRAN0508            1.
+    SH050807  BAL0583            -1.   BAL0507             1.
+    SH050108  COST             108.9   TRAN0501            1.
+    SH050108  BAL0501            -1.   BAL0508             1.
+    SH050208  COST             620.4   TRAN0502            1.
+    SH050208  BAL0502            -1.   BAL0508             1.
+    SH050308  COST            232.65   TRAN0503            1.
+    SH050308  BAL0503            -1.   BAL0508             1.
+    SH050408  COST            407.55   TRAN0504            1.
+    SH050408  BAL0504            -1.   BAL0508             1.
+    SH050508  COST             300.3   TRAN0505            1.
+    SH050508  BAL0505            -1.   BAL0508             1.
+    SH050608  COST             273.9   TRAN0506            1.
+    SH050608  BAL0552            -1.   BAL0508             1.
+    SH050808  COST            308.55   TRAN0508            1.
+    SH050808  BAL0583            -1.   BAL0508             1.
+    SH050109  COST             227.7   TRAN0501            1.
+    SH050109  BAL0501            -1.   BAL0509             1.
+    SH050209  COST            631.95   TRAN0502            1.
+    SH050209  BAL0502            -1.   BAL0509             1.
+    SH050309  COST             277.2   TRAN0503            1.
+    SH050309  BAL0503            -1.   BAL0509             1.
+    SH050409  COST            417.45   TRAN0504            1.
+    SH050409  BAL0504            -1.   BAL0509             1.
+    SH050509  COST            394.35   TRAN0505            1.
+    SH050509  BAL0505            -1.   BAL0509             1.
+    SH050709  COST             323.4   TRAN0507            1.
+    SH050709  BAL0564            -1.   BAL0509             1.
+    SH050809  COST             320.1   TRAN0508            1.
+    SH050809  BAL0583            -1.   BAL0509             1.
+    SH050110  COST            407.55   TRAN0501            1.
+    SH050110  BAL0501            -1.   BAL0510             1.
+    SH050210  COST             260.7   TRAN0502            1.
+    SH050210  BAL0502            -1.   BAL0510             1.
+    SH050310  COST              396.   TRAN0503            1.
+    SH050310  BAL0503            -1.   BAL0510             1.
+    SH050410  COST            592.35   TRAN0504            1.
+    SH050410  BAL0504            -1.   BAL0510             1.
+    SH050510  COST            635.25   TRAN0505            1.
+    SH050510  BAL0505            -1.   BAL0510             1.
+    SH050610  COST            371.25   TRAN0506            1.
+    SH050610  BAL0552            -1.   BAL0510             1.
+    SH050810  COST            503.25   TRAN0508            1.
+    SH050810  BAL0583            -1.   BAL0510             1.
+    SH050111  COST             174.9   TRAN0501            1.
+    SH050111  BAL0501            -1.   BAL0511             1.
+    SH050211  COST            816.75   TRAN0502            1.
+    SH050211  BAL0502            -1.   BAL0511             1.
+    SH050311  COST             409.2   TRAN0503            1.
+    SH050311  BAL0503            -1.   BAL0511             1.
+    SH050411  COST            229.35   TRAN0504            1.
+    SH050411  BAL0504            -1.   BAL0511             1.
+    SH050511  COST            562.65   TRAN0505            1.
+    SH050511  BAL0505            -1.   BAL0511             1.
+    SH050611  COST             323.4   TRAN0506            1.
+    SH050611  BAL0552            -1.   BAL0511             1.
+    SH050811  COST             168.3   TRAN0508            1.
+    SH050811  BAL0583            -1.   BAL0511             1.
+    SH050112  COST             145.2   TRAN0501            1.
+    SH050112  BAL0501            -1.   BAL0512             1.
+    SH050212  COST            559.35   TRAN0502            1.
+    SH050212  BAL0502            -1.   BAL0512             1.
+    SH050312  COST             240.9   TRAN0503            1.
+    SH050312  BAL0503            -1.   BAL0512             1.
+    SH050412  COST              330.   TRAN0504            1.
+    SH050412  BAL0504            -1.   BAL0512             1.
+    SH050512  COST            440.55   TRAN0505            1.
+    SH050512  BAL0505            -1.   BAL0512             1.
+    SH050612  COST            239.25   TRAN0506            1.
+    SH050612  BAL0552            -1.   BAL0512             1.
+    SH050812  COST             240.9   TRAN0508            1.
+    SH050812  BAL0583            -1.   BAL0512             1.
+    SH050114  COST             234.3   TRAN0501            1.
+    SH050114  BAL0501            -1.   BAL0514             1.
+    SH050214  COST             679.8   TRAN0502            1.
+    SH050214  BAL0502            -1.   BAL0514             1.
+    SH050314  COST             323.4   TRAN0503            1.
+    SH050314  BAL0503            -1.   BAL0514             1.
+    SH050414  COST            328.35   TRAN0504            1.
+    SH050414  BAL0504            -1.   BAL0514             1.
+    SH050514  COST             580.8   TRAN0505            1.
+    SH050514  BAL0505            -1.   BAL0514             1.
+    SH050614  COST             310.2   TRAN0506            1.
+    SH050614  BAL0552            -1.   BAL0514             1.
+    SH050814  COST             207.9   TRAN0508            1.
+    SH050814  BAL0583            -1.   BAL0514             1.
+    SH050115  COST            499.95   TRAN0501            1.
+    SH050115  BAL0501            -1.   BAL0515             1.
+    SH050215  COST            262.35   TRAN0502            1.
+    SH050215  BAL0502            -1.   BAL0515             1.
+    SH050315  COST             386.1   TRAN0503            1.
+    SH050315  BAL0503            -1.   BAL0515             1.
+    SH050415  COST             785.4   TRAN0504            1.
+    SH050415  BAL0504            -1.   BAL0515             1.
+    SH050515  COST             656.7   TRAN0505            1.
+    SH050515  BAL0505            -1.   BAL0515             1.
+    SH050615  COST             310.2   TRAN0506            1.
+    SH050615  BAL0552            -1.   BAL0515             1.
+    SH050815  COST            615.45   TRAN0508            1.
+    SH050815  BAL0583            -1.   BAL0515             1.
+    SH050116  COST             260.7   TRAN0501            1.
+    SH050116  BAL0501            -1.   BAL0516             1.
+    SH050216  COST              462.   TRAN0502            1.
+    SH050216  BAL0502            -1.   BAL0516             1.
+    SH050316  COST            374.55   TRAN0503            1.
+    SH050316  BAL0503            -1.   BAL0516             1.
+    SH050416  COST            473.55   TRAN0504            1.
+    SH050416  BAL0504            -1.   BAL0516             1.
+    SH050516  COST            526.35   TRAN0505            1.
+    SH050516  BAL0505            -1.   BAL0516             1.
+    SH050616  COST            216.15   TRAN0506            1.
+    SH050616  BAL0552            -1.   BAL0516             1.
+    SH050816  COST            338.25   TRAN0508            1.
+    SH050816  BAL0583            -1.   BAL0516             1.
+    SH050117  COST            249.15   TRAN0501            1.
+    SH050117  BAL0501            -1.   BAL0517             1.
+    SH050217  COST            833.25   TRAN0502            1.
+    SH050217  BAL0502            -1.   BAL0517             1.
+    SH050317  COST             452.1   TRAN0503            1.
+    SH050317  BAL0503            -1.   BAL0517             1.
+    SH050417  COST             94.05   TRAN0504            1.
+    SH050417  BAL0504            -1.   BAL0517             1.
+    SH050517  COST             491.7   TRAN0505            1.
+    SH050517  BAL0505            -1.   BAL0517             1.
+    SH050717  COST            486.75   TRAN0507            1.
+    SH050717  BAL0564            -1.   BAL0517             1.
+    SH050817  COST             44.55   TRAN0508            1.
+    SH050817  BAL0583            -1.   BAL0517             1.
+    SH050118  COST            288.75   TRAN0501            1.
+    SH050118  BAL0501            -1.   BAL0518             1.
+    SH050218  COST            595.65   TRAN0502            1.
+    SH050218  BAL0502            -1.   BAL0518             1.
+    SH050318  COST             445.5   TRAN0503            1.
+    SH050318  BAL0503            -1.   BAL0518             1.
+    SH050418  COST             254.1   TRAN0504            1.
+    SH050418  BAL0504            -1.   BAL0518             1.
+    SH050518  COST            671.55   TRAN0505            1.
+    SH050518  BAL0505            -1.   BAL0518             1.
+    SH050618  COST             580.8   TRAN0506            1.
+    SH050618  BAL0552            -1.   BAL0518             1.
+    SH050818  COST            169.95   TRAN0508            1.
+    SH050818  BAL0583            -1.   BAL0518             1.
+    SH050119  COST             409.2   TRAN0501            1.
+    SH050119  BAL0501            -1.   BAL0519             1.
+    SH050219  COST           1133.55   TRAN0502            1.
+    SH050219  BAL0502            -1.   BAL0519             1.
+    SH050319  COST            523.05   TRAN0503            1.
+    SH050319  BAL0503            -1.   BAL0519             1.
+    SH050419  COST            262.35   TRAN0504            1.
+    SH050419  BAL0504            -1.   BAL0519             1.
+    SH050519  COST             343.2   TRAN0505            1.
+    SH050519  BAL0505            -1.   BAL0519             1.
+    SH050619  COST            569.25   TRAN0506            1.
+    SH050619  BAL0552            -1.   BAL0519             1.
+    SH050819  COST            163.35   TRAN0508            1.
+    SH050819  BAL0583            -1.   BAL0519             1.
+    SH050120  COST            338.25   TRAN0501            1.
+    SH050120  BAL0501            -1.   BAL0520             1.
+    SH050220  COST           1126.95   TRAN0502            1.
+    SH050220  BAL0502            -1.   BAL0520             1.
+    SH050320  COST            490.05   TRAN0503            1.
+    SH050320  BAL0503            -1.   BAL0520             1.
+    SH050420  COST            186.45   TRAN0504            1.
+    SH050420  BAL0504            -1.   BAL0520             1.
+    SH050520  COST            480.15   TRAN0505            1.
+    SH050520  BAL0505            -1.   BAL0520             1.
+    SH050820  COST             207.9   TRAN0508            1.
+    SH050820  BAL0583            -1.   BAL0520             1.
+    SH050121  COST            664.95   TRAN0501            1.
+    SH050121  BAL0501            -1.   BAL0521             1.
+    SH050221  COST             607.2   TRAN0502            1.
+    SH050221  BAL0502            -1.   BAL0521             1.
+    SH050321  COST             735.9   TRAN0503            1.
+    SH050321  BAL0503            -1.   BAL0521             1.
+    SH050421  COST              528.   TRAN0504            1.
+    SH050421  BAL0504            -1.   BAL0521             1.
+    SH050521  COST             907.5   TRAN0505            1.
+    SH050521  BAL0505            -1.   BAL0521             1.
+    SH050821  COST              528.   TRAN0508            1.
+    SH050821  BAL0583            -1.   BAL0521             1.
+    SH050122  COST             409.2   TRAN0501            1.
+    SH050122  BAL0501            -1.   BAL0522             1.
+    SH050222  COST             953.7   TRAN0502            1.
+    SH050222  BAL0502            -1.   BAL0522             1.
+    SH050322  COST            493.35   TRAN0503            1.
+    SH050322  BAL0503            -1.   BAL0522             1.
+    SH050422  COST             369.6   TRAN0504            1.
+    SH050422  BAL0504            -1.   BAL0522             1.
+    SH050522  COST            295.35   TRAN0505            1.
+    SH050522  BAL0505            -1.   BAL0522             1.
+    SH050622  COST             511.5   TRAN0506            1.
+    SH050622  BAL0552            -1.   BAL0522             1.
+    SH050822  COST            229.35   TRAN0508            1.
+    SH050822  BAL0583            -1.   BAL0522             1.
+    SH050123  COST             386.1   TRAN0501            1.
+    SH050123  BAL0501            -1.   BAL0523             1.
+    SH050223  COST            892.65   TRAN0502            1.
+    SH050223  BAL0502            -1.   BAL0523             1.
+    SH050323  COST            473.55   TRAN0503            1.
+    SH050323  BAL0503            -1.   BAL0523             1.
+    SH050423  COST            275.55   TRAN0504            1.
+    SH050423  BAL0504            -1.   BAL0523             1.
+    SH050523  COST             273.9   TRAN0505            1.
+    SH050523  BAL0505            -1.   BAL0523             1.
+    SH050823  COST            229.35   TRAN0508            1.
+    SH050823  BAL0583            -1.   BAL0523             1.
+    SH050124  COST            2369.4   TRAN0501            1.
+    SH050124  BAL0501            -1.   BAL0524             1.
+    SH050125  COST            638.55   TRAN0501            1.
+    SH050125  BAL0501            -1.   BAL0525             1.
+    SH050225  COST            704.55   TRAN0502            1.
+    SH050225  BAL0502            -1.   BAL0525             1.
+    SH050325  COST            843.15   TRAN0503            1.
+    SH050325  BAL0503            -1.   BAL0525             1.
+    SH050425  COST             574.2   TRAN0504            1.
+    SH050425  BAL0504            -1.   BAL0525             1.
+    SH050525  COST             933.9   TRAN0505            1.
+    SH050525  BAL0505            -1.   BAL0525             1.
+    SH050625  COST            664.95   TRAN0506            1.
+    SH050625  BAL0552            -1.   BAL0525             1.
+    SH050825  COST            503.25   TRAN0508            1.
+    SH050825  BAL0583            -1.   BAL0525             1.
+    SH050426  COST             445.5   TRAN0504            1.
+    SH050426  BAL0504            -1.   BAL0526             1.
+    SH050127  COST             386.1   TRAN0501            1.
+    SH050127  BAL0501            -1.   BAL0527             1.
+    SH050227  COST             468.6   TRAN0502            1.
+    SH050227  BAL0502            -1.   BAL0527             1.
+    SH050327  COST            476.85   TRAN0503            1.
+    SH050327  BAL0503            -1.   BAL0527             1.
+    SH050427  COST            552.75   TRAN0504            1.
+    SH050427  BAL0504            -1.   BAL0527             1.
+    SH050527  COST             623.7   TRAN0505            1.
+    SH050527  BAL0505            -1.   BAL0527             1.
+    SH050627  COST             442.2   TRAN0506            1.
+    SH050627  BAL0552            -1.   BAL0527             1.
+    SH050827  COST             415.8   TRAN0508            1.
+    SH050827  BAL0583            -1.   BAL0527             1.
+    SH050128  COST            400.95   TRAN0501            1.
+    SH050128  BAL0501            -1.   BAL0528             1.
+    SH050228  COST            938.85   TRAN0502            1.
+    SH050228  BAL0502            -1.   BAL0528             1.
+    SH050328  COST             488.4   TRAN0503            1.
+    SH050328  BAL0503            -1.   BAL0528             1.
+    SH050428  COST            486.75   TRAN0504            1.
+    SH050428  BAL0504            -1.   BAL0528             1.
+    SH050528  COST             168.3   TRAN0505            1.
+    SH050528  BAL0505            -1.   BAL0528             1.
+    SH050628  COST            430.65   TRAN0506            1.
+    SH050628  BAL0552            -1.   BAL0528             1.
+    SH050728  COST            176.55   TRAN0507            1.
+    SH050728  BAL0564            -1.   BAL0528             1.
+    SH050828  COST             419.1   TRAN0508            1.
+    SH050828  BAL0583            -1.   BAL0528             1.
+    SH050129  COST            367.95   TRAN0501            1.
+    SH050129  BAL0501            -1.   BAL0529             1.
+    SH050229  COST             765.6   TRAN0502            1.
+    SH050229  BAL0502            -1.   BAL0529             1.
+    SH050329  COST            397.65   TRAN0503            1.
+    SH050329  BAL0503            -1.   BAL0529             1.
+    SH050429  COST            328.35   TRAN0504            1.
+    SH050429  BAL0504            -1.   BAL0529             1.
+    SH050529  COST             709.5   TRAN0505            1.
+    SH050529  BAL0505            -1.   BAL0529             1.
+    SH050629  COST            430.65   TRAN0506            1.
+    SH050629  BAL0552            -1.   BAL0529             1.
+    SH050829  COST             237.6   TRAN0508            1.
+    SH050829  BAL0583            -1.   BAL0529             1.
+    SH050130  COST             768.9   TRAN0501            1.
+    SH050130  BAL0501            -1.   BAL0530             1.
+    SH050230  COST             719.4   TRAN0502            1.
+    SH050230  BAL0502            -1.   BAL0530             1.
+    SH050330  COST            862.95   TRAN0503            1.
+    SH050330  BAL0503            -1.   BAL0530             1.
+    SH050430  COST             501.6   TRAN0504            1.
+    SH050430  BAL0504            -1.   BAL0530             1.
+    SH050530  COST             735.9   TRAN0505            1.
+    SH050530  BAL0505            -1.   BAL0530             1.
+    SH050830  COST             630.3   TRAN0508            1.
+    SH050830  BAL0583            -1.   BAL0530             1.
+    SH050131  COST            183.15   TRAN0501            1.
+    SH050131  BAL0501            -1.   BAL0531             1.
+    SH050231  COST            579.15   TRAN0502            1.
+    SH050231  BAL0502            -1.   BAL0531             1.
+    SH050331  COST             181.5   TRAN0503            1.
+    SH050331  BAL0503            -1.   BAL0531             1.
+    SH050431  COST            417.45   TRAN0504            1.
+    SH050431  BAL0504            -1.   BAL0531             1.
+    SH050531  COST            506.55   TRAN0505            1.
+    SH050531  BAL0505            -1.   BAL0531             1.
+    SH050631  COST             184.8   TRAN0506            1.
+    SH050631  BAL0552            -1.   BAL0531             1.
+    SH050831  COST            367.95   TRAN0508            1.
+    SH050831  BAL0583            -1.   BAL0531             1.
+    SH050132  COST            493.35   TRAN0501            1.
+    SH050132  BAL0501            -1.   BAL0532             1.
+    SH050232  COST             788.7   TRAN0502            1.
+    SH050232  BAL0502            -1.   BAL0532             1.
+    SH050332  COST            697.95   TRAN0503            1.
+    SH050332  BAL0503            -1.   BAL0532             1.
+    SH050432  COST            259.05   TRAN0504            1.
+    SH050432  BAL0504            -1.   BAL0532             1.
+    SH050532  COST             646.8   TRAN0505            1.
+    SH050532  BAL0505            -1.   BAL0532             1.
+    SH050832  COST              297.   TRAN0508            1.
+    SH050832  BAL0583            -1.   BAL0532             1.
+    SH050133  COST            813.45   TRAN0501            1.
+    SH050133  BAL0501            -1.   BAL0533             1.
+    SH050233  COST              660.   TRAN0502            1.
+    SH050233  BAL0502            -1.   BAL0533             1.
+    SH050333  COST            895.95   TRAN0503            1.
+    SH050333  BAL0503            -1.   BAL0533             1.
+    SH050433  COST            734.25   TRAN0504            1.
+    SH050433  BAL0504            -1.   BAL0533             1.
+    SH050533  COST           1041.15   TRAN0505            1.
+    SH050533  BAL0505            -1.   BAL0533             1.
+    SH050833  COST            628.65   TRAN0508            1.
+    SH050833  BAL0583            -1.   BAL0533             1.
+    SH050134  COST             636.9   TRAN0501            1.
+    SH050134  BAL0501            -1.   BAL0534             1.
+    SH050234  COST           1080.75   TRAN0502            1.
+    SH050234  BAL0502            -1.   BAL0534             1.
+    SH050334  COST            829.95   TRAN0503            1.
+    SH050334  BAL0503            -1.   BAL0534             1.
+    SH050434  COST            348.15   TRAN0504            1.
+    SH050434  BAL0504            -1.   BAL0534             1.
+    SH050534  COST            727.65   TRAN0505            1.
+    SH050534  BAL0505            -1.   BAL0534             1.
+    SH050834  COST            433.95   TRAN0508            1.
+    SH050834  BAL0583            -1.   BAL0534             1.
+    SH050135  COST            760.65   TRAN0501            1.
+    SH050135  BAL0501            -1.   BAL0535             1.
+    SH050235  COST            734.25   TRAN0502            1.
+    SH050235  BAL0502            -1.   BAL0535             1.
+    SH050335  COST            622.05   TRAN0503            1.
+    SH050335  BAL0503            -1.   BAL0535             1.
+    SH050435  COST             201.3   TRAN0504            1.
+    SH050435  BAL0504            -1.   BAL0535             1.
+    SH050535  COST            711.15   TRAN0505            1.
+    SH050535  BAL0505            -1.   BAL0535             1.
+    SH050835  COST            387.75   TRAN0508            1.
+    SH050835  BAL0583            -1.   BAL0535             1.
+    SH050136  COST            338.25   TRAN0501            1.
+    SH050136  BAL0501            -1.   BAL0536             1.
+    SH050236  COST             739.2   TRAN0502            1.
+    SH050236  BAL0502            -1.   BAL0536             1.
+    SH050336  COST             174.9   TRAN0503            1.
+    SH050336  BAL0503            -1.   BAL0536             1.
+    SH050436  COST             610.5   TRAN0504            1.
+    SH050436  BAL0504            -1.   BAL0536             1.
+    SH050536  COST             570.9   TRAN0505            1.
+    SH050536  BAL0505            -1.   BAL0536             1.
+    SH050636  COST             181.5   TRAN0506            1.
+    SH050636  BAL0552            -1.   BAL0536             1.
+    SH050836  COST            529.65   TRAN0508            1.
+    SH050836  BAL0583            -1.   BAL0536             1.
+    SH050137  COST             151.8   TRAN0501            1.
+    SH050137  BAL0501            -1.   BAL0537             1.
+    SH050237  COST             564.3   TRAN0502            1.
+    SH050237  BAL0502            -1.   BAL0537             1.
+    SH050337  COST             260.7   TRAN0503            1.
+    SH050337  BAL0503            -1.   BAL0537             1.
+    SH050437  COST             501.6   TRAN0504            1.
+    SH050437  BAL0504            -1.   BAL0537             1.
+    SH050537  COST             300.3   TRAN0505            1.
+    SH050537  BAL0505            -1.   BAL0537             1.
+    SH050637  COST             320.1   TRAN0506            1.
+    SH050637  BAL0552            -1.   BAL0537             1.
+    SH050837  COST             415.8   TRAN0508            1.
+    SH050837  BAL0583            -1.   BAL0537             1.
+    SH050138  COST             224.4   TRAN0501            1.
+    SH050138  BAL0501            -1.   BAL0538             1.
+    SH050238  COST             402.6   TRAN0502            1.
+    SH050238  BAL0502            -1.   BAL0538             1.
+    SH050338  COST            156.75   TRAN0503            1.
+    SH050338  BAL0503            -1.   BAL0538             1.
+    SH050438  COST             508.2   TRAN0504            1.
+    SH050438  BAL0504            -1.   BAL0538             1.
+    SH050538  COST             458.7   TRAN0505            1.
+    SH050538  BAL0505            -1.   BAL0538             1.
+    SH050638  COST             64.35   TRAN0506            1.
+    SH050638  BAL0552            -1.   BAL0538             1.
+    SH050738  COST             356.4   TRAN0507            1.
+    SH050738  BAL0564            -1.   BAL0538             1.
+    SH050838  COST            391.05   TRAN0508            1.
+    SH050838  BAL0583            -1.   BAL0538             1.
+    SH050139  COST             214.5   TRAN0501            1.
+    SH050139  BAL0501            -1.   BAL0539             1.
+    SH050239  COST            559.35   TRAN0502            1.
+    SH050239  BAL0502            -1.   BAL0539             1.
+    SH050339  COST              264.   TRAN0503            1.
+    SH050339  BAL0503            -1.   BAL0539             1.
+    SH050439  COST            410.85   TRAN0504            1.
+    SH050439  BAL0504            -1.   BAL0539             1.
+    SH050539  COST            707.85   TRAN0505            1.
+    SH050539  BAL0505            -1.   BAL0539             1.
+    SH050639  COST             336.6   TRAN0506            1.
+    SH050639  BAL0552            -1.   BAL0539             1.
+    SH050839  COST             277.2   TRAN0508            1.
+    SH050839  BAL0583            -1.   BAL0539             1.
+    SH050140  COST            272.25   TRAN0501            1.
+    SH050140  BAL0501            -1.   BAL0540             1.
+    SH050240  COST             623.7   TRAN0502            1.
+    SH050240  BAL0502            -1.   BAL0540             1.
+    SH050340  COST            169.95   TRAN0503            1.
+    SH050340  BAL0503            -1.   BAL0540             1.
+    SH050440  COST            490.05   TRAN0504            1.
+    SH050440  BAL0504            -1.   BAL0540             1.
+    SH050540  COST            364.65   TRAN0505            1.
+    SH050540  BAL0505            -1.   BAL0540             1.
+    SH050640  COST            216.15   TRAN0506            1.
+    SH050640  BAL0552            -1.   BAL0540             1.
+    SH050840  COST             452.1   TRAN0508            1.
+    SH050840  BAL0583            -1.   BAL0540             1.
+    SH050141  COST             323.4   TRAN0501            1.
+    SH050141  BAL0501            -1.   BAL0541             1.
+    SH050241  COST              495.   TRAN0502            1.
+    SH050241  BAL0502            -1.   BAL0541             1.
+    SH050341  COST             247.5   TRAN0503            1.
+    SH050341  BAL0503            -1.   BAL0541             1.
+    SH050441  COST             534.6   TRAN0504            1.
+    SH050441  BAL0504            -1.   BAL0541             1.
+    SH050541  COST             607.2   TRAN0505            1.
+    SH050541  BAL0505            -1.   BAL0541             1.
+    SH050641  COST              165.   TRAN0506            1.
+    SH050641  BAL0552            -1.   BAL0541             1.
+    SH050841  COST            493.35   TRAN0508            1.
+    SH050841  BAL0583            -1.   BAL0541             1.
+    SH050142  COST             148.5   TRAN0501            1.
+    SH050142  BAL0501            -1.   BAL0542             1.
+    SH050242  COST             683.1   TRAN0502            1.
+    SH050242  BAL0502            -1.   BAL0542             1.
+    SH050342  COST              264.   TRAN0503            1.
+    SH050342  BAL0503            -1.   BAL0542             1.
+    SH050442  COST            321.75   TRAN0504            1.
+    SH050442  BAL0504            -1.   BAL0542             1.
+    SH050542  COST            595.65   TRAN0505            1.
+    SH050542  BAL0505            -1.   BAL0542             1.
+    SH050642  COST            265.65   TRAN0506            1.
+    SH050642  BAL0552            -1.   BAL0542             1.
+    SH050842  COST             250.8   TRAN0508            1.
+    SH050842  BAL0583            -1.   BAL0542             1.
+    SH050143  COST            262.35   TRAN0501            1.
+    SH050143  BAL0501            -1.   BAL0543             1.
+    SH050243  COST            651.75   TRAN0502            1.
+    SH050243  BAL0502            -1.   BAL0543             1.
+    SH050343  COST             41.25   TRAN0503            1.
+    SH050343  BAL0503            -1.   BAL0543             1.
+    SH050443  COST             488.4   TRAN0504            1.
+    SH050443  BAL0504            -1.   BAL0543             1.
+    SH050543  COST             425.7   TRAN0505            1.
+    SH050543  BAL0505            -1.   BAL0543             1.
+    SH050643  COST              165.   TRAN0506            1.
+    SH050643  BAL0552            -1.   BAL0543             1.
+    SH050743  COST            397.65   TRAN0507            1.
+    SH050743  BAL0564            -1.   BAL0543             1.
+    SH050843  COST            447.15   TRAN0508            1.
+    SH050843  BAL0583            -1.   BAL0543             1.
+    SH050144  COST            262.35   TRAN0501            1.
+    SH050144  BAL0501            -1.   BAL0544             1.
+    SH050244  COST            625.35   TRAN0502            1.
+    SH050244  BAL0502            -1.   BAL0544             1.
+    SH050344  COST             211.2   TRAN0503            1.
+    SH050344  BAL0503            -1.   BAL0544             1.
+    SH050444  COST             514.8   TRAN0504            1.
+    SH050444  BAL0504            -1.   BAL0544             1.
+    SH050544  COST             511.5   TRAN0505            1.
+    SH050544  BAL0505            -1.   BAL0544             1.
+    SH050644  COST            146.85   TRAN0506            1.
+    SH050644  BAL0552            -1.   BAL0544             1.
+    SH050844  COST             491.7   TRAN0508            1.
+    SH050844  BAL0583            -1.   BAL0544             1.
+    SH050145  COST             283.8   TRAN0501            1.
+    SH050145  BAL0501            -1.   BAL0545             1.
+    SH050245  COST             719.4   TRAN0502            1.
+    SH050245  BAL0502            -1.   BAL0545             1.
+    SH050345  COST            265.65   TRAN0503            1.
+    SH050345  BAL0503            -1.   BAL0545             1.
+    SH050445  COST             481.8   TRAN0504            1.
+    SH050445  BAL0504            -1.   BAL0545             1.
+    SH050545  COST             386.1   TRAN0505            1.
+    SH050545  BAL0505            -1.   BAL0545             1.
+    SH050645  COST            315.15   TRAN0506            1.
+    SH050645  BAL0552            -1.   BAL0545             1.
+    SH050745  COST            325.05   TRAN0507            1.
+    SH050745  BAL0564            -1.   BAL0545             1.
+    SH050845  COST            503.25   TRAN0508            1.
+    SH050845  BAL0583            -1.   BAL0545             1.
+    SH050146  COST            404.25   TRAN0501            1.
+    SH050146  BAL0501            -1.   BAL0546             1.
+    SH050246  COST            450.45   TRAN0502            1.
+    SH050246  BAL0502            -1.   BAL0546             1.
+    SH050346  COST            364.65   TRAN0503            1.
+    SH050346  BAL0503            -1.   BAL0546             1.
+    SH050446  COST            737.55   TRAN0504            1.
+    SH050446  BAL0504            -1.   BAL0546             1.
+    SH050546  COST             709.5   TRAN0505            1.
+    SH050546  BAL0505            -1.   BAL0546             1.
+    SH050646  COST            424.05   TRAN0506            1.
+    SH050646  BAL0552            -1.   BAL0546             1.
+    SH050846  COST             739.2   TRAN0508            1.
+    SH050846  BAL0583            -1.   BAL0546             1.
+    SH050147  COST             181.5   TRAN0501            1.
+    SH050147  BAL0501            -1.   BAL0547             1.
+    SH050247  COST            615.45   TRAN0502            1.
+    SH050247  BAL0502            -1.   BAL0547             1.
+    SH050347  COST            262.35   TRAN0503            1.
+    SH050347  BAL0503            -1.   BAL0547             1.
+    SH050447  COST             452.1   TRAN0504            1.
+    SH050447  BAL0504            -1.   BAL0547             1.
+    SH050547  COST            384.45   TRAN0505            1.
+    SH050547  BAL0505            -1.   BAL0547             1.
+    SH050647  COST            239.25   TRAN0506            1.
+    SH050647  BAL0552            -1.   BAL0547             1.
+    SH050847  COST             402.6   TRAN0508            1.
+    SH050847  BAL0583            -1.   BAL0547             1.
+    SH050148  COST            156.75   TRAN0501            1.
+    SH050148  BAL0501            -1.   BAL0548             1.
+    SH050248  COST            559.35   TRAN0502            1.
+    SH050248  BAL0502            -1.   BAL0548             1.
+    SH050348  COST            226.05   TRAN0503            1.
+    SH050348  BAL0503            -1.   BAL0548             1.
+    SH050448  COST             379.5   TRAN0504            1.
+    SH050448  BAL0504            -1.   BAL0548             1.
+    SH050548  COST            407.55   TRAN0505            1.
+    SH050548  BAL0505            -1.   BAL0548             1.
+    SH050648  COST            189.75   TRAN0506            1.
+    SH050648  BAL0552            -1.   BAL0548             1.
+    SH050848  COST            321.75   TRAN0508            1.
+    SH050848  BAL0583            -1.   BAL0548             1.
+    SH050149  COST            542.85   TRAN0501            1.
+    SH050149  BAL0501            -1.   BAL0549             1.
+    SH050249  COST            882.75   TRAN0502            1.
+    SH050249  BAL0502            -1.   BAL0549             1.
+    SH050349  COST             547.8   TRAN0503            1.
+    SH050349  BAL0503            -1.   BAL0549             1.
+    SH050449  COST            628.65   TRAN0504            1.
+    SH050449  BAL0504            -1.   BAL0549             1.
+    SH050549  COST             250.8   TRAN0505            1.
+    SH050549  BAL0505            -1.   BAL0549             1.
+    SH050649  COST             557.7   TRAN0506            1.
+    SH050649  BAL0552            -1.   BAL0549             1.
+    SH050749  COST             221.1   TRAN0507            1.
+    SH050749  BAL0564            -1.   BAL0549             1.
+    SH050849  COST             673.2   TRAN0508            1.
+    SH050849  BAL0583            -1.   BAL0549             1.
+    SH050150  COST            397.65   TRAN0501            1.
+    SH050150  BAL0501            -1.   BAL0550             1.
+    SH050250  COST            1009.8   TRAN0502            1.
+    SH050250  BAL0502            -1.   BAL0550             1.
+    SH050350  COST             405.9   TRAN0503            1.
+    SH050350  BAL0503            -1.   BAL0550             1.
+    SH050450  COST            602.25   TRAN0504            1.
+    SH050450  BAL0504            -1.   BAL0550             1.
+    SH050550  COST            387.75   TRAN0505            1.
+    SH050550  BAL0505            -1.   BAL0550             1.
+    SH050750  COST            226.05   TRAN0507            1.
+    SH050750  BAL0564            -1.   BAL0550             1.
+    SH050850  COST             669.9   TRAN0508            1.
+    SH050850  BAL0583            -1.   BAL0550             1.
+    SH050151  COST             547.8   TRAN0501            1.
+    SH050151  BAL0501            -1.   BAL0551             1.
+    SH050251  COST             907.5   TRAN0502            1.
+    SH050251  BAL0502            -1.   BAL0551             1.
+    SH050351  COST            562.65   TRAN0503            1.
+    SH050351  BAL0503            -1.   BAL0551             1.
+    SH050451  COST             557.7   TRAN0504            1.
+    SH050451  BAL0504            -1.   BAL0551             1.
+    SH050551  COST            202.95   TRAN0505            1.
+    SH050551  BAL0505            -1.   BAL0551             1.
+    SH050751  COST            163.35   TRAN0507            1.
+    SH050751  BAL0564            -1.   BAL0551             1.
+    SH050851  COST             706.2   TRAN0508            1.
+    SH050851  BAL0583            -1.   BAL0551             1.
+    SH050152  COST             184.8   TRAN0501            1.
+    SH050152  BAL0501            -1.   BAL0552             1.
+    SH050252  COST              495.   TRAN0502            1.
+    SH050252  BAL0502            -1.   BAL0552             1.
+    SH050352  COST             135.3   TRAN0503            1.
+    SH050352  BAL0503            -1.   BAL0552             1.
+    SH050452  COST             531.3   TRAN0504            1.
+    SH050452  BAL0504            -1.   BAL0552             1.
+    SH050552  COST            486.75   TRAN0505            1.
+    SH050552  BAL0505            -1.   BAL0552             1.
+    SH050852  COST            417.45   TRAN0508            1.
+    SH050852  BAL0583            -1.   BAL0552             1.
+    SH050153  COST            592.35   TRAN0501            1.
+    SH050153  BAL0501            -1.   BAL0553             1.
+    SH050253  COST            1049.4   TRAN0502            1.
+    SH050253  BAL0502            -1.   BAL0553             1.
+    SH050353  COST            536.25   TRAN0503            1.
+    SH050353  BAL0503            -1.   BAL0553             1.
+    SH050453  COST             679.8   TRAN0504            1.
+    SH050453  BAL0504            -1.   BAL0553             1.
+    SH050553  COST             303.6   TRAN0505            1.
+    SH050553  BAL0505            -1.   BAL0553             1.
+    SH050653  COST            592.35   TRAN0506            1.
+    SH050653  BAL0552            -1.   BAL0553             1.
+    SH050753  COST             240.9   TRAN0507            1.
+    SH050753  BAL0564            -1.   BAL0553             1.
+    SH050853  COST            664.95   TRAN0508            1.
+    SH050853  BAL0583            -1.   BAL0553             1.
+    SH050154  COST            305.25   TRAN0501            1.
+    SH050154  BAL0501            -1.   BAL0554             1.
+    SH050254  COST            734.25   TRAN0502            1.
+    SH050254  BAL0502            -1.   BAL0554             1.
+    SH050354  COST            358.05   TRAN0503            1.
+    SH050354  BAL0503            -1.   BAL0554             1.
+    SH050454  COST            565.95   TRAN0504            1.
+    SH050454  BAL0504            -1.   BAL0554             1.
+    SH050554  COST            351.45   TRAN0505            1.
+    SH050554  BAL0505            -1.   BAL0554             1.
+    SH050654  COST            334.95   TRAN0506            1.
+    SH050654  BAL0552            -1.   BAL0554             1.
+    SH050854  COST             663.3   TRAN0508            1.
+    SH050854  BAL0583            -1.   BAL0554             1.
+    SH050155  COST             458.7   TRAN0501            1.
+    SH050155  BAL0501            -1.   BAL0555             1.
+    SH050255  COST            790.35   TRAN0502            1.
+    SH050255  BAL0502            -1.   BAL0555             1.
+    SH050355  COST            463.65   TRAN0503            1.
+    SH050355  BAL0503            -1.   BAL0555             1.
+    SH050455  COST             485.1   TRAN0504            1.
+    SH050455  BAL0504            -1.   BAL0555             1.
+    SH050555  COST             254.1   TRAN0505            1.
+    SH050555  BAL0505            -1.   BAL0555             1.
+    SH050655  COST             478.5   TRAN0506            1.
+    SH050655  BAL0552            -1.   BAL0555             1.
+    SH050755  COST            176.55   TRAN0507            1.
+    SH050755  BAL0564            -1.   BAL0555             1.
+    SH050855  COST             485.1   TRAN0508            1.
+    SH050855  BAL0583            -1.   BAL0555             1.
+    SH050156  COST             643.5   TRAN0501            1.
+    SH050156  BAL0501            -1.   BAL0556             1.
+    SH050256  COST            955.35   TRAN0502            1.
+    SH050256  BAL0502            -1.   BAL0556             1.
+    SH050356  COST            503.25   TRAN0503            1.
+    SH050356  BAL0503            -1.   BAL0556             1.
+    SH050456  COST            602.25   TRAN0504            1.
+    SH050456  BAL0504            -1.   BAL0556             1.
+    SH050556  COST             224.4   TRAN0505            1.
+    SH050556  BAL0505            -1.   BAL0556             1.
+    SH050656  COST            559.35   TRAN0506            1.
+    SH050656  BAL0552            -1.   BAL0556             1.
+    SH050756  COST             201.3   TRAN0507            1.
+    SH050756  BAL0564            -1.   BAL0556             1.
+    SH050856  COST            589.05   TRAN0508            1.
+    SH050856  BAL0583            -1.   BAL0556             1.
+    SH050157  COST            430.65   TRAN0501            1.
+    SH050157  BAL0501            -1.   BAL0557             1.
+    SH050257  COST              858.   TRAN0502            1.
+    SH050257  BAL0502            -1.   BAL0557             1.
+    SH050357  COST             478.5   TRAN0503            1.
+    SH050357  BAL0503            -1.   BAL0557             1.
+    SH050457  COST             386.1   TRAN0504            1.
+    SH050457  BAL0504            -1.   BAL0557             1.
+    SH050557  COST             277.2   TRAN0505            1.
+    SH050557  BAL0505            -1.   BAL0557             1.
+    SH050657  COST            526.35   TRAN0506            1.
+    SH050657  BAL0552            -1.   BAL0557             1.
+    SH050757  COST             244.2   TRAN0507            1.
+    SH050757  BAL0564            -1.   BAL0557             1.
+    SH050857  COST            381.15   TRAN0508            1.
+    SH050857  BAL0583            -1.   BAL0557             1.
+    SH050158  COST             485.1   TRAN0501            1.
+    SH050158  BAL0501            -1.   BAL0558             1.
+    SH050258  COST            859.65   TRAN0502            1.
+    SH050258  BAL0502            -1.   BAL0558             1.
+    SH050358  COST             458.7   TRAN0503            1.
+    SH050358  BAL0503            -1.   BAL0558             1.
+    SH050458  COST            565.95   TRAN0504            1.
+    SH050458  BAL0504            -1.   BAL0558             1.
+    SH050558  COST             34.65   TRAN0505            1.
+    SH050558  BAL0505            -1.   BAL0558             1.
+    SH050658  COST             537.9   TRAN0506            1.
+    SH050658  BAL0552            -1.   BAL0558             1.
+    SH050758  COST             112.2   TRAN0507            1.
+    SH050758  BAL0564            -1.   BAL0558             1.
+    SH050858  COST             419.1   TRAN0508            1.
+    SH050858  BAL0583            -1.   BAL0558             1.
+    SH050159  COST             339.9   TRAN0501            1.
+    SH050159  BAL0501            -1.   BAL0559             1.
+    SH050259  COST             821.7   TRAN0502            1.
+    SH050259  BAL0502            -1.   BAL0559             1.
+    SH050359  COST             392.7   TRAN0503            1.
+    SH050359  BAL0503            -1.   BAL0559             1.
+    SH050459  COST             402.6   TRAN0504            1.
+    SH050459  BAL0504            -1.   BAL0559             1.
+    SH050559  COST            262.35   TRAN0505            1.
+    SH050559  BAL0505            -1.   BAL0559             1.
+    SH050659  COST            490.05   TRAN0506            1.
+    SH050659  BAL0552            -1.   BAL0559             1.
+    SH050759  COST            173.25   TRAN0507            1.
+    SH050759  BAL0564            -1.   BAL0559             1.
+    SH050859  COST            420.75   TRAN0508            1.
+    SH050859  BAL0583            -1.   BAL0559             1.
+    SH050160  COST            430.65   TRAN0501            1.
+    SH050160  BAL0501            -1.   BAL0560             1.
+    SH050260  COST             907.5   TRAN0502            1.
+    SH050260  BAL0502            -1.   BAL0560             1.
+    SH050360  COST            466.95   TRAN0503            1.
+    SH050360  BAL0503            -1.   BAL0560             1.
+    SH050460  COST             514.8   TRAN0504            1.
+    SH050460  BAL0504            -1.   BAL0560             1.
+    SH050560  COST            222.75   TRAN0505            1.
+    SH050560  BAL0505            -1.   BAL0560             1.
+    SH050660  COST            532.95   TRAN0506            1.
+    SH050660  BAL0552            -1.   BAL0560             1.
+    SH050760  COST             145.2   TRAN0507            1.
+    SH050760  BAL0564            -1.   BAL0560             1.
+    SH050860  COST            493.35   TRAN0508            1.
+    SH050860  BAL0583            -1.   BAL0560             1.
+    SH050163  COST             438.9   TRAN0501            1.
+    SH050163  BAL0501            -1.   BAL0563             1.
+    SH050263  COST             815.1   TRAN0502            1.
+    SH050263  BAL0502            -1.   BAL0563             1.
+    SH050363  COST            473.55   TRAN0503            1.
+    SH050363  BAL0503            -1.   BAL0563             1.
+    SH050463  COST            608.85   TRAN0504            1.
+    SH050463  BAL0504            -1.   BAL0563             1.
+    SH050563  COST             250.8   TRAN0505            1.
+    SH050563  BAL0505            -1.   BAL0563             1.
+    SH050663  COST            519.75   TRAN0506            1.
+    SH050663  BAL0552            -1.   BAL0563             1.
+    SH050763  COST             204.6   TRAN0507            1.
+    SH050763  BAL0564            -1.   BAL0563             1.
+    SH050863  COST              660.   TRAN0508            1.
+    SH050863  BAL0583            -1.   BAL0563             1.
+    SH050164  COST            328.35   TRAN0501            1.
+    SH050164  BAL0501            -1.   BAL0564             1.
+    SH050264  COST             867.9   TRAN0502            1.
+    SH050264  BAL0502            -1.   BAL0564             1.
+    SH050364  COST            367.95   TRAN0503            1.
+    SH050364  BAL0503            -1.   BAL0564             1.
+    SH050464  COST             554.4   TRAN0504            1.
+    SH050464  BAL0504            -1.   BAL0564             1.
+    SH050564  COST              95.7   TRAN0505            1.
+    SH050564  BAL0505            -1.   BAL0564             1.
+    SH050664  COST            523.05   TRAN0506            1.
+    SH050664  BAL0552            -1.   BAL0564             1.
+    SH050864  COST             412.5   TRAN0508            1.
+    SH050864  BAL0583            -1.   BAL0564             1.
+    SH050165  COST             712.8   TRAN0501            1.
+    SH050165  BAL0501            -1.   BAL0565             1.
+    SH050265  COST            506.55   TRAN0502            1.
+    SH050265  BAL0502            -1.   BAL0565             1.
+    SH050365  COST            833.25   TRAN0503            1.
+    SH050365  BAL0503            -1.   BAL0565             1.
+    SH050465  COST             640.2   TRAN0504            1.
+    SH050465  BAL0504            -1.   BAL0565             1.
+    SH050565  COST             996.6   TRAN0505            1.
+    SH050565  BAL0505            -1.   BAL0565             1.
+    SH050865  COST            684.75   TRAN0508            1.
+    SH050865  BAL0583            -1.   BAL0565             1.
+    SH050166  COST              924.   TRAN0501            1.
+    SH050166  BAL0501            -1.   BAL0566             1.
+    SH050266  COST            427.35   TRAN0502            1.
+    SH050266  BAL0502            -1.   BAL0566             1.
+    SH050366  COST             953.7   TRAN0503            1.
+    SH050366  BAL0503            -1.   BAL0566             1.
+    SH050466  COST             917.4   TRAN0504            1.
+    SH050466  BAL0504            -1.   BAL0566             1.
+    SH050566  COST            1171.5   TRAN0505            1.
+    SH050566  BAL0505            -1.   BAL0566             1.
+    SH050866  COST              924.   TRAN0508            1.
+    SH050866  BAL0583            -1.   BAL0566             1.
+    SH050167  COST            701.25   TRAN0501            1.
+    SH050167  BAL0501            -1.   BAL0567             1.
+    SH050267  COST             382.8   TRAN0502            1.
+    SH050267  BAL0502            -1.   BAL0567             1.
+    SH050367  COST            813.45   TRAN0503            1.
+    SH050367  BAL0503            -1.   BAL0567             1.
+    SH050467  COST            754.05   TRAN0504            1.
+    SH050467  BAL0504            -1.   BAL0567             1.
+    SH050567  COST             996.6   TRAN0505            1.
+    SH050567  BAL0505            -1.   BAL0567             1.
+    SH050867  COST             755.7   TRAN0508            1.
+    SH050867  BAL0583            -1.   BAL0567             1.
+    SH050168  COST             980.1   TRAN0501            1.
+    SH050168  BAL0501            -1.   BAL0568             1.
+    SH050268  COST              660.   TRAN0502            1.
+    SH050268  BAL0502            -1.   BAL0568             1.
+    SH050368  COST              924.   TRAN0503            1.
+    SH050368  BAL0503            -1.   BAL0568             1.
+    SH050468  COST            1158.3   TRAN0504            1.
+    SH050468  BAL0504            -1.   BAL0568             1.
+    SH050568  COST            1560.9   TRAN0505            1.
+    SH050568  BAL0505            -1.   BAL0568             1.
+    SH050868  COST           1239.15   TRAN0508            1.
+    SH050868  BAL0583            -1.   BAL0568             1.
+    SH050169  COST            889.35   TRAN0501            1.
+    SH050169  BAL0501            -1.   BAL0569             1.
+    SH050269  COST            364.65   TRAN0502            1.
+    SH050269  BAL0502            -1.   BAL0569             1.
+    SH050369  COST             841.5   TRAN0503            1.
+    SH050369  BAL0503            -1.   BAL0569             1.
+    SH050469  COST            1026.3   TRAN0504            1.
+    SH050469  BAL0504            -1.   BAL0569             1.
+    SH050569  COST            1065.9   TRAN0505            1.
+    SH050569  BAL0505            -1.   BAL0569             1.
+    SH050869  COST            1085.7   TRAN0508            1.
+    SH050869  BAL0583            -1.   BAL0569             1.
+    SH050171  COST              726.   TRAN0501            1.
+    SH050171  BAL0501            -1.   BAL0571             1.
+    SH050371  COST             864.6   TRAN0503            1.
+    SH050371  BAL0503            -1.   BAL0571             1.
+    SH050471  COST            859.65   TRAN0504            1.
+    SH050471  BAL0504            -1.   BAL0571             1.
+    SH050571  COST            958.65   TRAN0505            1.
+    SH050571  BAL0505            -1.   BAL0571             1.
+    SH050671  COST            645.15   TRAN0506            1.
+    SH050671  BAL0552            -1.   BAL0571             1.
+    SH050771  COST            1161.6   TRAN0507            1.
+    SH050771  BAL0564            -1.   BAL0571             1.
+    SH050871  COST            879.45   TRAN0508            1.
+    SH050871  BAL0583            -1.   BAL0571             1.
+    SH050172  COST            968.55   TRAN0501            1.
+    SH050172  BAL0501            -1.   BAL0572             1.
+    SH050272  COST            895.95   TRAN0502            1.
+    SH050272  BAL0502            -1.   BAL0572             1.
+    SH050372  COST           1018.05   TRAN0503            1.
+    SH050372  BAL0503            -1.   BAL0572             1.
+    SH050472  COST             940.5   TRAN0504            1.
+    SH050472  BAL0504            -1.   BAL0572             1.
+    SH050572  COST           1258.95   TRAN0505            1.
+    SH050572  BAL0505            -1.   BAL0572             1.
+    SH050872  COST             940.5   TRAN0508            1.
+    SH050872  BAL0583            -1.   BAL0572             1.
+    SH050173  COST             643.5   TRAN0501            1.
+    SH050173  BAL0501            -1.   BAL0573             1.
+    SH050273  COST            602.25   TRAN0502            1.
+    SH050273  BAL0502            -1.   BAL0573             1.
+    SH050373  COST             557.7   TRAN0503            1.
+    SH050373  BAL0503            -1.   BAL0573             1.
+    SH050473  COST            754.05   TRAN0504            1.
+    SH050473  BAL0504            -1.   BAL0573             1.
+    SH050573  COST             930.6   TRAN0505            1.
+    SH050573  BAL0505            -1.   BAL0573             1.
+    SH050673  COST            503.25   TRAN0506            1.
+    SH050673  BAL0552            -1.   BAL0573             1.
+    SH050873  COST             831.6   TRAN0508            1.
+    SH050873  BAL0583            -1.   BAL0573             1.
+    SH050174  COST             904.2   TRAN0501            1.
+    SH050174  BAL0501            -1.   BAL0574             1.
+    SH050274  COST             346.5   TRAN0502            1.
+    SH050274  BAL0502            -1.   BAL0574             1.
+    SH050374  COST             940.5   TRAN0503            1.
+    SH050374  BAL0503            -1.   BAL0574             1.
+    SH050474  COST           1051.05   TRAN0504            1.
+    SH050474  BAL0504            -1.   BAL0574             1.
+    SH050574  COST           1209.45   TRAN0505            1.
+    SH050574  BAL0505            -1.   BAL0574             1.
+    SH050874  COST           1021.35   TRAN0508            1.
+    SH050874  BAL0583            -1.   BAL0574             1.
+    SH050275  COST             914.1   TRAN0502            1.
+    SH050275  BAL0502            -1.   BAL0575             1.
+    SH050176  COST             762.3   TRAN0501            1.
+    SH050176  BAL0501            -1.   BAL0576             1.
+    SH050276  COST            661.65   TRAN0502            1.
+    SH050276  BAL0502            -1.   BAL0576             1.
+    SH050376  COST            664.95   TRAN0503            1.
+    SH050376  BAL0503            -1.   BAL0576             1.
+    SH050476  COST            1039.5   TRAN0504            1.
+    SH050476  BAL0504            -1.   BAL0576             1.
+    SH050576  COST            1039.5   TRAN0505            1.
+    SH050576  BAL0505            -1.   BAL0576             1.
+    SH050676  COST            628.65   TRAN0506            1.
+    SH050676  BAL0552            -1.   BAL0576             1.
+    SH050876  COST           1282.05   TRAN0508            1.
+    SH050876  BAL0583            -1.   BAL0576             1.
+    SH050177  COST            717.75   TRAN0501            1.
+    SH050177  BAL0501            -1.   BAL0577             1.
+    SH050277  COST             448.8   TRAN0502            1.
+    SH050277  BAL0502            -1.   BAL0577             1.
+    SH050377  COST            760.65   TRAN0503            1.
+    SH050377  BAL0503            -1.   BAL0577             1.
+    SH050477  COST            661.65   TRAN0504            1.
+    SH050477  BAL0504            -1.   BAL0577             1.
+    SH050577  COST              924.   TRAN0505            1.
+    SH050577  BAL0505            -1.   BAL0577             1.
+    SH050877  COST              528.   TRAN0508            1.
+    SH050877  BAL0583            -1.   BAL0577             1.
+    SH050178  COST           1255.65   TRAN0501            1.
+    SH050178  BAL0501            -1.   BAL0578             1.
+    SH050278  COST             729.3   TRAN0502            1.
+    SH050278  BAL0502            -1.   BAL0578             1.
+    SH050378  COST           1291.95   TRAN0503            1.
+    SH050378  BAL0503            -1.   BAL0578             1.
+    SH050478  COST           1130.25   TRAN0504            1.
+    SH050478  BAL0504            -1.   BAL0578             1.
+    SH050578  COST           1450.35   TRAN0505            1.
+    SH050578  BAL0505            -1.   BAL0578             1.
+    SH050878  COST            1263.9   TRAN0508            1.
+    SH050878  BAL0583            -1.   BAL0578             1.
+    SH050179  COST           1179.75   TRAN0501            1.
+    SH050179  BAL0501            -1.   BAL0579             1.
+    SH050279  COST            443.85   TRAN0502            1.
+    SH050279  BAL0502            -1.   BAL0579             1.
+    SH050379  COST           1140.15   TRAN0503            1.
+    SH050379  BAL0503            -1.   BAL0579             1.
+    SH050479  COST             1188.   TRAN0504            1.
+    SH050479  BAL0504            -1.   BAL0579             1.
+    SH050879  COST            1164.9   TRAN0508            1.
+    SH050879  BAL0583            -1.   BAL0579             1.
+    SH050180  COST            523.05   TRAN0501            1.
+    SH050180  BAL0501            -1.   BAL0580             1.
+    SH050280  COST            651.75   TRAN0502            1.
+    SH050280  BAL0502            -1.   BAL0580             1.
+    SH050380  COST            721.05   TRAN0503            1.
+    SH050380  BAL0503            -1.   BAL0580             1.
+    SH050480  COST             617.1   TRAN0504            1.
+    SH050480  BAL0504            -1.   BAL0580             1.
+    SH050580  COST            833.25   TRAN0505            1.
+    SH050580  BAL0505            -1.   BAL0580             1.
+    SH050880  COST              396.   TRAN0508            1.
+    SH050880  BAL0583            -1.   BAL0580             1.
+    SH050182  COST             960.3   TRAN0501            1.
+    SH050182  BAL0501            -1.   BAL0582             1.
+    SH050282  COST            542.85   TRAN0502            1.
+    SH050282  BAL0502            -1.   BAL0582             1.
+    SH050382  COST           1080.75   TRAN0503            1.
+    SH050382  BAL0503            -1.   BAL0582             1.
+    SH050482  COST            1164.9   TRAN0504            1.
+    SH050482  BAL0504            -1.   BAL0582             1.
+    SH050582  COST           1892.55   TRAN0505            1.
+    SH050582  BAL0505            -1.   BAL0582             1.
+    SH050882  COST           1291.95   TRAN0508            1.
+    SH050882  BAL0583            -1.   BAL0582             1.
+    SH050183  COST            292.05   TRAN0501            1.
+    SH050183  BAL0501            -1.   BAL0583             1.
+    SH050283  COST              858.   TRAN0502            1.
+    SH050283  BAL0502            -1.   BAL0583             1.
+    SH050383  COST             448.8   TRAN0503            1.
+    SH050383  BAL0503            -1.   BAL0583             1.
+    SH050483  COST             97.35   TRAN0504            1.
+    SH050483  BAL0504            -1.   BAL0583             1.
+    SH050583  COST            572.55   TRAN0505            1.
+    SH050583  BAL0505            -1.   BAL0583             1.
+    SH050683  COST             409.2   TRAN0506            1.
+    SH050683  BAL0552            -1.   BAL0583             1.
+    SH050184  COST             501.6   TRAN0501            1.
+    SH050184  BAL0501            -1.   BAL0584             1.
+    SH050284  COST             316.8   TRAN0502            1.
+    SH050284  BAL0502            -1.   BAL0584             1.
+    SH050384  COST             600.6   TRAN0503            1.
+    SH050384  BAL0503            -1.   BAL0584             1.
+    SH050484  COST             610.5   TRAN0504            1.
+    SH050484  BAL0504            -1.   BAL0584             1.
+    SH050584  COST             808.5   TRAN0505            1.
+    SH050584  BAL0505            -1.   BAL0584             1.
+    SH050684  COST            503.25   TRAN0506            1.
+    SH050684  BAL0552            -1.   BAL0584             1.
+    SH050884  COST             640.2   TRAN0508            1.
+    SH050884  BAL0583            -1.   BAL0584             1.
+    SH060201  COST            365.31   TRAN0602            1.
+    SH060201  BAL0602            -1.   BAL0601             1.
+    SH060301  COST            140.22   TRAN0603            1.
+    SH060301  BAL0603            -1.   BAL0601             1.
+    SH060401  COST            255.84   TRAN0604            1.
+    SH060401  BAL0604            -1.   BAL0601             1.
+    SH060501  COST            291.51   TRAN0605            1.
+    SH060501  BAL0605            -1.   BAL0601             1.
+    SH060601  COST            154.98   TRAN0606            1.
+    SH060601  BAL0652            -1.   BAL0601             1.
+    SH060801  COST            175.89   TRAN0608            1.
+    SH060801  BAL0683            -1.   BAL0601             1.
+    SH060102  COST            583.02   TRAN0601            1.
+    SH060102  BAL0601            -1.   BAL0602             1.
+    SH060302  COST            512.91   TRAN0603            1.
+    SH060302  BAL0603            -1.   BAL0602             1.
+    SH060402  COST            752.76   TRAN0604            1.
+    SH060402  BAL0604            -1.   BAL0602             1.
+    SH060502  COST            911.43   TRAN0605            1.
+    SH060502  BAL0605            -1.   BAL0602             1.
+    SH060602  COST            464.94   TRAN0606            1.
+    SH060602  BAL0652            -1.   BAL0602             1.
+    SH060802  COST            640.83   TRAN0608            1.
+    SH060802  BAL0683            -1.   BAL0602             1.
+    SH060103  COST            301.35   TRAN0601            1.
+    SH060103  BAL0601            -1.   BAL0603             1.
+    SH060203  COST            583.02   TRAN0602            1.
+    SH060203  BAL0602            -1.   BAL0603             1.
+    SH060403  COST            451.41   TRAN0604            1.
+    SH060403  BAL0604            -1.   BAL0603             1.
+    SH060503  COST            349.32   TRAN0605            1.
+    SH060503  BAL0605            -1.   BAL0603             1.
+    SH060603  COST             110.7   TRAN0606            1.
+    SH060603  BAL0652            -1.   BAL0603             1.
+    SH060803  COST            313.65   TRAN0608            1.
+    SH060803  BAL0683            -1.   BAL0603             1.
+    SH060104  COST            214.02   TRAN0601            1.
+    SH060104  BAL0601            -1.   BAL0604             1.
+    SH060204  COST            618.69   TRAN0602            1.
+    SH060204  BAL0602            -1.   BAL0604             1.
+    SH060304  COST            298.89   TRAN0603            1.
+    SH060304  BAL0603            -1.   BAL0604             1.
+    SH060504  COST            392.37   TRAN0605            1.
+    SH060504  BAL0605            -1.   BAL0604             1.
+    SH060604  COST            301.35   TRAN0606            1.
+    SH060604  BAL0652            -1.   BAL0604             1.
+    SH060704  COST            330.87   TRAN0607            1.
+    SH060704  BAL0664            -1.   BAL0604             1.
+    SH060804  COST             71.34   TRAN0608            1.
+    SH060804  BAL0683            -1.   BAL0604             1.
+    SH060105  COST             332.1   TRAN0601            1.
+    SH060105  BAL0601            -1.   BAL0605             1.
+    SH060205  COST            634.68   TRAN0602            1.
+    SH060205  BAL0602            -1.   BAL0605             1.
+    SH060305  COST            349.32   TRAN0603            1.
+    SH060305  BAL0603            -1.   BAL0605             1.
+    SH060405  COST            350.55   TRAN0604            1.
+    SH060405  BAL0604            -1.   BAL0605             1.
+    SH060605  COST            400.98   TRAN0606            1.
+    SH060605  BAL0652            -1.   BAL0605             1.
+    SH060705  COST            410.82   TRAN0607            1.
+    SH060705  BAL0664            -1.   BAL0605             1.
+    SH060805  COST            333.33   TRAN0608            1.
+    SH060805  BAL0683            -1.   BAL0605             1.
+    SH060106  COST            244.77   TRAN0601            1.
+    SH060106  BAL0601            -1.   BAL0606             1.
+    SH060206  COST            512.91   TRAN0602            1.
+    SH060206  BAL0602            -1.   BAL0606             1.
+    SH060306  COST            261.99   TRAN0603            1.
+    SH060306  BAL0603            -1.   BAL0606             1.
+    SH060406  COST            269.37   TRAN0604            1.
+    SH060406  BAL0604            -1.   BAL0606             1.
+    SH060506  COST            309.96   TRAN0605            1.
+    SH060506  BAL0605            -1.   BAL0606             1.
+    SH060606  COST            253.38   TRAN0606            1.
+    SH060606  BAL0652            -1.   BAL0606             1.
+    SH060706  COST              246.   TRAN0607            1.
+    SH060706  BAL0664            -1.   BAL0606             1.
+    SH060806  COST            185.73   TRAN0608            1.
+    SH060806  BAL0683            -1.   BAL0606             1.
+    SH060107  COST             25.83   TRAN0601            1.
+    SH060107  BAL0601            -1.   BAL0607             1.
+    SH060207  COST            359.16   TRAN0602            1.
+    SH060207  BAL0602            -1.   BAL0607             1.
+    SH060307  COST            152.52   TRAN0603            1.
+    SH060307  BAL0603            -1.   BAL0607             1.
+    SH060407  COST            254.61   TRAN0604            1.
+    SH060407  BAL0604            -1.   BAL0607             1.
+    SH060507  COST            281.67   TRAN0605            1.
+    SH060507  BAL0605            -1.   BAL0607             1.
+    SH060607  COST            153.75   TRAN0606            1.
+    SH060607  BAL0652            -1.   BAL0607             1.
+    SH060707  COST            285.36   TRAN0607            1.
+    SH060707  BAL0664            -1.   BAL0607             1.
+    SH060807  COST            190.65   TRAN0608            1.
+    SH060807  BAL0683            -1.   BAL0607             1.
+    SH060108  COST             81.18   TRAN0601            1.
+    SH060108  BAL0601            -1.   BAL0608             1.
+    SH060208  COST            462.48   TRAN0602            1.
+    SH060208  BAL0602            -1.   BAL0608             1.
+    SH060308  COST            173.43   TRAN0603            1.
+    SH060308  BAL0603            -1.   BAL0608             1.
+    SH060408  COST            303.81   TRAN0604            1.
+    SH060408  BAL0604            -1.   BAL0608             1.
+    SH060508  COST            223.86   TRAN0605            1.
+    SH060508  BAL0605            -1.   BAL0608             1.
+    SH060608  COST            204.18   TRAN0606            1.
+    SH060608  BAL0652            -1.   BAL0608             1.
+    SH060808  COST            230.01   TRAN0608            1.
+    SH060808  BAL0683            -1.   BAL0608             1.
+    SH060109  COST            169.74   TRAN0601            1.
+    SH060109  BAL0601            -1.   BAL0609             1.
+    SH060209  COST            471.09   TRAN0602            1.
+    SH060209  BAL0602            -1.   BAL0609             1.
+    SH060309  COST            206.64   TRAN0603            1.
+    SH060309  BAL0603            -1.   BAL0609             1.
+    SH060409  COST            311.19   TRAN0604            1.
+    SH060409  BAL0604            -1.   BAL0609             1.
+    SH060509  COST            293.97   TRAN0605            1.
+    SH060509  BAL0605            -1.   BAL0609             1.
+    SH060709  COST            241.08   TRAN0607            1.
+    SH060709  BAL0664            -1.   BAL0609             1.
+    SH060809  COST            238.62   TRAN0608            1.
+    SH060809  BAL0683            -1.   BAL0609             1.
+    SH060110  COST            303.81   TRAN0601            1.
+    SH060110  BAL0601            -1.   BAL0610             1.
+    SH060210  COST            194.34   TRAN0602            1.
+    SH060210  BAL0602            -1.   BAL0610             1.
+    SH060310  COST             295.2   TRAN0603            1.
+    SH060310  BAL0603            -1.   BAL0610             1.
+    SH060410  COST            441.57   TRAN0604            1.
+    SH060410  BAL0604            -1.   BAL0610             1.
+    SH060510  COST            473.55   TRAN0605            1.
+    SH060510  BAL0605            -1.   BAL0610             1.
+    SH060610  COST            276.75   TRAN0606            1.
+    SH060610  BAL0652            -1.   BAL0610             1.
+    SH060810  COST            375.15   TRAN0608            1.
+    SH060810  BAL0683            -1.   BAL0610             1.
+    SH060111  COST            130.38   TRAN0601            1.
+    SH060111  BAL0601            -1.   BAL0611             1.
+    SH060211  COST            608.85   TRAN0602            1.
+    SH060211  BAL0602            -1.   BAL0611             1.
+    SH060311  COST            305.04   TRAN0603            1.
+    SH060311  BAL0603            -1.   BAL0611             1.
+    SH060411  COST            170.97   TRAN0604            1.
+    SH060411  BAL0604            -1.   BAL0611             1.
+    SH060511  COST            419.43   TRAN0605            1.
+    SH060511  BAL0605            -1.   BAL0611             1.
+    SH060611  COST            241.08   TRAN0606            1.
+    SH060611  BAL0652            -1.   BAL0611             1.
+    SH060811  COST            125.46   TRAN0608            1.
+    SH060811  BAL0683            -1.   BAL0611             1.
+    SH060112  COST            108.24   TRAN0601            1.
+    SH060112  BAL0601            -1.   BAL0612             1.
+    SH060212  COST            416.97   TRAN0602            1.
+    SH060212  BAL0602            -1.   BAL0612             1.
+    SH060312  COST            179.58   TRAN0603            1.
+    SH060312  BAL0603            -1.   BAL0612             1.
+    SH060412  COST              246.   TRAN0604            1.
+    SH060412  BAL0604            -1.   BAL0612             1.
+    SH060512  COST            328.41   TRAN0605            1.
+    SH060512  BAL0605            -1.   BAL0612             1.
+    SH060612  COST            178.35   TRAN0606            1.
+    SH060612  BAL0652            -1.   BAL0612             1.
+    SH060812  COST            179.58   TRAN0608            1.
+    SH060812  BAL0683            -1.   BAL0612             1.
+    SH060114  COST            174.66   TRAN0601            1.
+    SH060114  BAL0601            -1.   BAL0614             1.
+    SH060214  COST            506.76   TRAN0602            1.
+    SH060214  BAL0602            -1.   BAL0614             1.
+    SH060314  COST            241.08   TRAN0603            1.
+    SH060314  BAL0603            -1.   BAL0614             1.
+    SH060414  COST            244.77   TRAN0604            1.
+    SH060414  BAL0604            -1.   BAL0614             1.
+    SH060514  COST            432.96   TRAN0605            1.
+    SH060514  BAL0605            -1.   BAL0614             1.
+    SH060614  COST            231.24   TRAN0606            1.
+    SH060614  BAL0652            -1.   BAL0614             1.
+    SH060814  COST            154.98   TRAN0608            1.
+    SH060814  BAL0683            -1.   BAL0614             1.
+    SH060115  COST            372.69   TRAN0601            1.
+    SH060115  BAL0601            -1.   BAL0615             1.
+    SH060215  COST            195.57   TRAN0602            1.
+    SH060215  BAL0602            -1.   BAL0615             1.
+    SH060315  COST            287.82   TRAN0603            1.
+    SH060315  BAL0603            -1.   BAL0615             1.
+    SH060415  COST            585.48   TRAN0604            1.
+    SH060415  BAL0604            -1.   BAL0615             1.
+    SH060515  COST            489.54   TRAN0605            1.
+    SH060515  BAL0605            -1.   BAL0615             1.
+    SH060615  COST            231.24   TRAN0606            1.
+    SH060615  BAL0652            -1.   BAL0615             1.
+    SH060815  COST            458.79   TRAN0608            1.
+    SH060815  BAL0683            -1.   BAL0615             1.
+    SH060116  COST            194.34   TRAN0601            1.
+    SH060116  BAL0601            -1.   BAL0616             1.
+    SH060216  COST             344.4   TRAN0602            1.
+    SH060216  BAL0602            -1.   BAL0616             1.
+    SH060316  COST            279.21   TRAN0603            1.
+    SH060316  BAL0603            -1.   BAL0616             1.
+    SH060416  COST            353.01   TRAN0604            1.
+    SH060416  BAL0604            -1.   BAL0616             1.
+    SH060516  COST            392.37   TRAN0605            1.
+    SH060516  BAL0605            -1.   BAL0616             1.
+    SH060616  COST            161.13   TRAN0606            1.
+    SH060616  BAL0652            -1.   BAL0616             1.
+    SH060816  COST            252.15   TRAN0608            1.
+    SH060816  BAL0683            -1.   BAL0616             1.
+    SH060117  COST            185.73   TRAN0601            1.
+    SH060117  BAL0601            -1.   BAL0617             1.
+    SH060217  COST            621.15   TRAN0602            1.
+    SH060217  BAL0602            -1.   BAL0617             1.
+    SH060317  COST            337.02   TRAN0603            1.
+    SH060317  BAL0603            -1.   BAL0617             1.
+    SH060417  COST             70.11   TRAN0604            1.
+    SH060417  BAL0604            -1.   BAL0617             1.
+    SH060517  COST            366.54   TRAN0605            1.
+    SH060517  BAL0605            -1.   BAL0617             1.
+    SH060717  COST            362.85   TRAN0607            1.
+    SH060717  BAL0664            -1.   BAL0617             1.
+    SH060817  COST             33.21   TRAN0608            1.
+    SH060817  BAL0683            -1.   BAL0617             1.
+    SH060118  COST            215.25   TRAN0601            1.
+    SH060118  BAL0601            -1.   BAL0618             1.
+    SH060218  COST            444.03   TRAN0602            1.
+    SH060218  BAL0602            -1.   BAL0618             1.
+    SH060318  COST             332.1   TRAN0603            1.
+    SH060318  BAL0603            -1.   BAL0618             1.
+    SH060418  COST            189.42   TRAN0604            1.
+    SH060418  BAL0604            -1.   BAL0618             1.
+    SH060518  COST            500.61   TRAN0605            1.
+    SH060518  BAL0605            -1.   BAL0618             1.
+    SH060618  COST            432.96   TRAN0606            1.
+    SH060618  BAL0652            -1.   BAL0618             1.
+    SH060818  COST            126.69   TRAN0608            1.
+    SH060818  BAL0683            -1.   BAL0618             1.
+    SH060119  COST            305.04   TRAN0601            1.
+    SH060119  BAL0601            -1.   BAL0619             1.
+    SH060219  COST            845.01   TRAN0602            1.
+    SH060219  BAL0602            -1.   BAL0619             1.
+    SH060319  COST            389.91   TRAN0603            1.
+    SH060319  BAL0603            -1.   BAL0619             1.
+    SH060419  COST            195.57   TRAN0604            1.
+    SH060419  BAL0604            -1.   BAL0619             1.
+    SH060519  COST            255.84   TRAN0605            1.
+    SH060519  BAL0605            -1.   BAL0619             1.
+    SH060619  COST            424.35   TRAN0606            1.
+    SH060619  BAL0652            -1.   BAL0619             1.
+    SH060819  COST            121.77   TRAN0608            1.
+    SH060819  BAL0683            -1.   BAL0619             1.
+    SH060120  COST            252.15   TRAN0601            1.
+    SH060120  BAL0601            -1.   BAL0620             1.
+    SH060220  COST            840.09   TRAN0602            1.
+    SH060220  BAL0602            -1.   BAL0620             1.
+    SH060320  COST            365.31   TRAN0603            1.
+    SH060320  BAL0603            -1.   BAL0620             1.
+    SH060420  COST            138.99   TRAN0604            1.
+    SH060420  BAL0604            -1.   BAL0620             1.
+    SH060520  COST            357.93   TRAN0605            1.
+    SH060520  BAL0605            -1.   BAL0620             1.
+    SH060820  COST            154.98   TRAN0608            1.
+    SH060820  BAL0683            -1.   BAL0620             1.
+    SH060121  COST            495.69   TRAN0601            1.
+    SH060121  BAL0601            -1.   BAL0621             1.
+    SH060221  COST            452.64   TRAN0602            1.
+    SH060221  BAL0602            -1.   BAL0621             1.
+    SH060321  COST            548.58   TRAN0603            1.
+    SH060321  BAL0603            -1.   BAL0621             1.
+    SH060421  COST             393.6   TRAN0604            1.
+    SH060421  BAL0604            -1.   BAL0621             1.
+    SH060521  COST             676.5   TRAN0605            1.
+    SH060521  BAL0605            -1.   BAL0621             1.
+    SH060821  COST             393.6   TRAN0608            1.
+    SH060821  BAL0683            -1.   BAL0621             1.
+    SH060122  COST            305.04   TRAN0601            1.
+    SH060122  BAL0601            -1.   BAL0622             1.
+    SH060222  COST            710.94   TRAN0602            1.
+    SH060222  BAL0602            -1.   BAL0622             1.
+    SH060322  COST            367.77   TRAN0603            1.
+    SH060322  BAL0603            -1.   BAL0622             1.
+    SH060422  COST            275.52   TRAN0604            1.
+    SH060422  BAL0604            -1.   BAL0622             1.
+    SH060522  COST            220.17   TRAN0605            1.
+    SH060522  BAL0605            -1.   BAL0622             1.
+    SH060622  COST             381.3   TRAN0606            1.
+    SH060622  BAL0652            -1.   BAL0622             1.
+    SH060822  COST            170.97   TRAN0608            1.
+    SH060822  BAL0683            -1.   BAL0622             1.
+    SH060123  COST            287.82   TRAN0601            1.
+    SH060123  BAL0601            -1.   BAL0623             1.
+    SH060223  COST            665.43   TRAN0602            1.
+    SH060223  BAL0602            -1.   BAL0623             1.
+    SH060323  COST            353.01   TRAN0603            1.
+    SH060323  BAL0603            -1.   BAL0623             1.
+    SH060423  COST            205.41   TRAN0604            1.
+    SH060423  BAL0604            -1.   BAL0623             1.
+    SH060523  COST            204.18   TRAN0605            1.
+    SH060523  BAL0605            -1.   BAL0623             1.
+    SH060823  COST            170.97   TRAN0608            1.
+    SH060823  BAL0683            -1.   BAL0623             1.
+    SH060124  COST           1766.28   TRAN0601            1.
+    SH060124  BAL0601            -1.   BAL0624             1.
+    SH060125  COST            476.01   TRAN0601            1.
+    SH060125  BAL0601            -1.   BAL0625             1.
+    SH060225  COST            525.21   TRAN0602            1.
+    SH060225  BAL0602            -1.   BAL0625             1.
+    SH060325  COST            628.53   TRAN0603            1.
+    SH060325  BAL0603            -1.   BAL0625             1.
+    SH060425  COST            428.04   TRAN0604            1.
+    SH060425  BAL0604            -1.   BAL0625             1.
+    SH060525  COST            696.18   TRAN0605            1.
+    SH060525  BAL0605            -1.   BAL0625             1.
+    SH060625  COST            495.69   TRAN0606            1.
+    SH060625  BAL0652            -1.   BAL0625             1.
+    SH060825  COST            375.15   TRAN0608            1.
+    SH060825  BAL0683            -1.   BAL0625             1.
+    SH060426  COST             332.1   TRAN0604            1.
+    SH060426  BAL0604            -1.   BAL0626             1.
+    SH060127  COST            287.82   TRAN0601            1.
+    SH060127  BAL0601            -1.   BAL0627             1.
+    SH060227  COST            349.32   TRAN0602            1.
+    SH060227  BAL0602            -1.   BAL0627             1.
+    SH060327  COST            355.47   TRAN0603            1.
+    SH060327  BAL0603            -1.   BAL0627             1.
+    SH060427  COST            412.05   TRAN0604            1.
+    SH060427  BAL0604            -1.   BAL0627             1.
+    SH060527  COST            464.94   TRAN0605            1.
+    SH060527  BAL0605            -1.   BAL0627             1.
+    SH060627  COST            329.64   TRAN0606            1.
+    SH060627  BAL0652            -1.   BAL0627             1.
+    SH060827  COST            309.96   TRAN0608            1.
+    SH060827  BAL0683            -1.   BAL0627             1.
+    SH060128  COST            298.89   TRAN0601            1.
+    SH060128  BAL0601            -1.   BAL0628             1.
+    SH060228  COST            699.87   TRAN0602            1.
+    SH060228  BAL0602            -1.   BAL0628             1.
+    SH060328  COST            364.08   TRAN0603            1.
+    SH060328  BAL0603            -1.   BAL0628             1.
+    SH060428  COST            362.85   TRAN0604            1.
+    SH060428  BAL0604            -1.   BAL0628             1.
+    SH060528  COST            125.46   TRAN0605            1.
+    SH060528  BAL0605            -1.   BAL0628             1.
+    SH060628  COST            321.03   TRAN0606            1.
+    SH060628  BAL0652            -1.   BAL0628             1.
+    SH060728  COST            131.61   TRAN0607            1.
+    SH060728  BAL0664            -1.   BAL0628             1.
+    SH060828  COST            312.42   TRAN0608            1.
+    SH060828  BAL0683            -1.   BAL0628             1.
+    SH060129  COST            274.29   TRAN0601            1.
+    SH060129  BAL0601            -1.   BAL0629             1.
+    SH060229  COST            570.72   TRAN0602            1.
+    SH060229  BAL0602            -1.   BAL0629             1.
+    SH060329  COST            296.43   TRAN0603            1.
+    SH060329  BAL0603            -1.   BAL0629             1.
+    SH060429  COST            244.77   TRAN0604            1.
+    SH060429  BAL0604            -1.   BAL0629             1.
+    SH060529  COST             528.9   TRAN0605            1.
+    SH060529  BAL0605            -1.   BAL0629             1.
+    SH060629  COST            321.03   TRAN0606            1.
+    SH060629  BAL0652            -1.   BAL0629             1.
+    SH060829  COST            177.12   TRAN0608            1.
+    SH060829  BAL0683            -1.   BAL0629             1.
+    SH060130  COST            573.18   TRAN0601            1.
+    SH060130  BAL0601            -1.   BAL0630             1.
+    SH060230  COST            536.28   TRAN0602            1.
+    SH060230  BAL0602            -1.   BAL0630             1.
+    SH060330  COST            643.29   TRAN0603            1.
+    SH060330  BAL0603            -1.   BAL0630             1.
+    SH060430  COST            373.92   TRAN0604            1.
+    SH060430  BAL0604            -1.   BAL0630             1.
+    SH060530  COST            548.58   TRAN0605            1.
+    SH060530  BAL0605            -1.   BAL0630             1.
+    SH060830  COST            469.86   TRAN0608            1.
+    SH060830  BAL0683            -1.   BAL0630             1.
+    SH060131  COST            136.53   TRAN0601            1.
+    SH060131  BAL0601            -1.   BAL0631             1.
+    SH060231  COST            431.73   TRAN0602            1.
+    SH060231  BAL0602            -1.   BAL0631             1.
+    SH060331  COST             135.3   TRAN0603            1.
+    SH060331  BAL0603            -1.   BAL0631             1.
+    SH060431  COST            311.19   TRAN0604            1.
+    SH060431  BAL0604            -1.   BAL0631             1.
+    SH060531  COST            377.61   TRAN0605            1.
+    SH060531  BAL0605            -1.   BAL0631             1.
+    SH060631  COST            137.76   TRAN0606            1.
+    SH060631  BAL0652            -1.   BAL0631             1.
+    SH060831  COST            274.29   TRAN0608            1.
+    SH060831  BAL0683            -1.   BAL0631             1.
+    SH060132  COST            367.77   TRAN0601            1.
+    SH060132  BAL0601            -1.   BAL0632             1.
+    SH060232  COST            587.94   TRAN0602            1.
+    SH060232  BAL0602            -1.   BAL0632             1.
+    SH060332  COST            520.29   TRAN0603            1.
+    SH060332  BAL0603            -1.   BAL0632             1.
+    SH060432  COST            193.11   TRAN0604            1.
+    SH060432  BAL0604            -1.   BAL0632             1.
+    SH060532  COST            482.16   TRAN0605            1.
+    SH060532  BAL0605            -1.   BAL0632             1.
+    SH060832  COST             221.4   TRAN0608            1.
+    SH060832  BAL0683            -1.   BAL0632             1.
+    SH060133  COST            606.39   TRAN0601            1.
+    SH060133  BAL0601            -1.   BAL0633             1.
+    SH060233  COST              492.   TRAN0602            1.
+    SH060233  BAL0602            -1.   BAL0633             1.
+    SH060333  COST            667.89   TRAN0603            1.
+    SH060333  BAL0603            -1.   BAL0633             1.
+    SH060433  COST            547.35   TRAN0604            1.
+    SH060433  BAL0604            -1.   BAL0633             1.
+    SH060533  COST            776.13   TRAN0605            1.
+    SH060533  BAL0605            -1.   BAL0633             1.
+    SH060833  COST            468.63   TRAN0608            1.
+    SH060833  BAL0683            -1.   BAL0633             1.
+    SH060134  COST            474.78   TRAN0601            1.
+    SH060134  BAL0601            -1.   BAL0634             1.
+    SH060234  COST            805.65   TRAN0602            1.
+    SH060234  BAL0602            -1.   BAL0634             1.
+    SH060334  COST            618.69   TRAN0603            1.
+    SH060334  BAL0603            -1.   BAL0634             1.
+    SH060434  COST            259.53   TRAN0604            1.
+    SH060434  BAL0604            -1.   BAL0634             1.
+    SH060534  COST            542.43   TRAN0605            1.
+    SH060534  BAL0605            -1.   BAL0634             1.
+    SH060834  COST            323.49   TRAN0608            1.
+    SH060834  BAL0683            -1.   BAL0634             1.
+    SH060135  COST            567.03   TRAN0601            1.
+    SH060135  BAL0601            -1.   BAL0635             1.
+    SH060235  COST            547.35   TRAN0602            1.
+    SH060235  BAL0602            -1.   BAL0635             1.
+    SH060335  COST            463.71   TRAN0603            1.
+    SH060335  BAL0603            -1.   BAL0635             1.
+    SH060435  COST            150.06   TRAN0604            1.
+    SH060435  BAL0604            -1.   BAL0635             1.
+    SH060535  COST            530.13   TRAN0605            1.
+    SH060535  BAL0605            -1.   BAL0635             1.
+    SH060835  COST            289.05   TRAN0608            1.
+    SH060835  BAL0683            -1.   BAL0635             1.
+    SH060136  COST            252.15   TRAN0601            1.
+    SH060136  BAL0601            -1.   BAL0636             1.
+    SH060236  COST            551.04   TRAN0602            1.
+    SH060236  BAL0602            -1.   BAL0636             1.
+    SH060336  COST            130.38   TRAN0603            1.
+    SH060336  BAL0603            -1.   BAL0636             1.
+    SH060436  COST             455.1   TRAN0604            1.
+    SH060436  BAL0604            -1.   BAL0636             1.
+    SH060536  COST            425.58   TRAN0605            1.
+    SH060536  BAL0605            -1.   BAL0636             1.
+    SH060636  COST             135.3   TRAN0606            1.
+    SH060636  BAL0652            -1.   BAL0636             1.
+    SH060836  COST            394.83   TRAN0608            1.
+    SH060836  BAL0683            -1.   BAL0636             1.
+    SH060137  COST            113.16   TRAN0601            1.
+    SH060137  BAL0601            -1.   BAL0637             1.
+    SH060237  COST            420.66   TRAN0602            1.
+    SH060237  BAL0602            -1.   BAL0637             1.
+    SH060337  COST            194.34   TRAN0603            1.
+    SH060337  BAL0603            -1.   BAL0637             1.
+    SH060437  COST            373.92   TRAN0604            1.
+    SH060437  BAL0604            -1.   BAL0637             1.
+    SH060537  COST            223.86   TRAN0605            1.
+    SH060537  BAL0605            -1.   BAL0637             1.
+    SH060637  COST            238.62   TRAN0606            1.
+    SH060637  BAL0652            -1.   BAL0637             1.
+    SH060837  COST            309.96   TRAN0608            1.
+    SH060837  BAL0683            -1.   BAL0637             1.
+    SH060138  COST            167.28   TRAN0601            1.
+    SH060138  BAL0601            -1.   BAL0638             1.
+    SH060238  COST            300.12   TRAN0602            1.
+    SH060238  BAL0602            -1.   BAL0638             1.
+    SH060338  COST            116.85   TRAN0603            1.
+    SH060338  BAL0603            -1.   BAL0638             1.
+    SH060438  COST            378.84   TRAN0604            1.
+    SH060438  BAL0604            -1.   BAL0638             1.
+    SH060538  COST            341.94   TRAN0605            1.
+    SH060538  BAL0605            -1.   BAL0638             1.
+    SH060638  COST             47.97   TRAN0606            1.
+    SH060638  BAL0652            -1.   BAL0638             1.
+    SH060738  COST            265.68   TRAN0607            1.
+    SH060738  BAL0664            -1.   BAL0638             1.
+    SH060838  COST            291.51   TRAN0608            1.
+    SH060838  BAL0683            -1.   BAL0638             1.
+    SH060139  COST             159.9   TRAN0601            1.
+    SH060139  BAL0601            -1.   BAL0639             1.
+    SH060239  COST            416.97   TRAN0602            1.
+    SH060239  BAL0602            -1.   BAL0639             1.
+    SH060339  COST             196.8   TRAN0603            1.
+    SH060339  BAL0603            -1.   BAL0639             1.
+    SH060439  COST            306.27   TRAN0604            1.
+    SH060439  BAL0604            -1.   BAL0639             1.
+    SH060539  COST            527.67   TRAN0605            1.
+    SH060539  BAL0605            -1.   BAL0639             1.
+    SH060639  COST            250.92   TRAN0606            1.
+    SH060639  BAL0652            -1.   BAL0639             1.
+    SH060839  COST            206.64   TRAN0608            1.
+    SH060839  BAL0683            -1.   BAL0639             1.
+    SH060140  COST            202.95   TRAN0601            1.
+    SH060140  BAL0601            -1.   BAL0640             1.
+    SH060240  COST            464.94   TRAN0602            1.
+    SH060240  BAL0602            -1.   BAL0640             1.
+    SH060340  COST            126.69   TRAN0603            1.
+    SH060340  BAL0603            -1.   BAL0640             1.
+    SH060440  COST            365.31   TRAN0604            1.
+    SH060440  BAL0604            -1.   BAL0640             1.
+    SH060540  COST            271.83   TRAN0605            1.
+    SH060540  BAL0605            -1.   BAL0640             1.
+    SH060640  COST            161.13   TRAN0606            1.
+    SH060640  BAL0652            -1.   BAL0640             1.
+    SH060840  COST            337.02   TRAN0608            1.
+    SH060840  BAL0683            -1.   BAL0640             1.
+    SH060141  COST            241.08   TRAN0601            1.
+    SH060141  BAL0601            -1.   BAL0641             1.
+    SH060241  COST              369.   TRAN0602            1.
+    SH060241  BAL0602            -1.   BAL0641             1.
+    SH060341  COST             184.5   TRAN0603            1.
+    SH060341  BAL0603            -1.   BAL0641             1.
+    SH060441  COST            398.52   TRAN0604            1.
+    SH060441  BAL0604            -1.   BAL0641             1.
+    SH060541  COST            452.64   TRAN0605            1.
+    SH060541  BAL0605            -1.   BAL0641             1.
+    SH060641  COST              123.   TRAN0606            1.
+    SH060641  BAL0652            -1.   BAL0641             1.
+    SH060841  COST            367.77   TRAN0608            1.
+    SH060841  BAL0683            -1.   BAL0641             1.
+    SH060142  COST             110.7   TRAN0601            1.
+    SH060142  BAL0601            -1.   BAL0642             1.
+    SH060242  COST            509.22   TRAN0602            1.
+    SH060242  BAL0602            -1.   BAL0642             1.
+    SH060342  COST             196.8   TRAN0603            1.
+    SH060342  BAL0603            -1.   BAL0642             1.
+    SH060442  COST            239.85   TRAN0604            1.
+    SH060442  BAL0604            -1.   BAL0642             1.
+    SH060542  COST            444.03   TRAN0605            1.
+    SH060542  BAL0605            -1.   BAL0642             1.
+    SH060642  COST            198.03   TRAN0606            1.
+    SH060642  BAL0652            -1.   BAL0642             1.
+    SH060842  COST            186.96   TRAN0608            1.
+    SH060842  BAL0683            -1.   BAL0642             1.
+    SH060143  COST            195.57   TRAN0601            1.
+    SH060143  BAL0601            -1.   BAL0643             1.
+    SH060243  COST            485.85   TRAN0602            1.
+    SH060243  BAL0602            -1.   BAL0643             1.
+    SH060343  COST             30.75   TRAN0603            1.
+    SH060343  BAL0603            -1.   BAL0643             1.
+    SH060443  COST            364.08   TRAN0604            1.
+    SH060443  BAL0604            -1.   BAL0643             1.
+    SH060543  COST            317.34   TRAN0605            1.
+    SH060543  BAL0605            -1.   BAL0643             1.
+    SH060643  COST              123.   TRAN0606            1.
+    SH060643  BAL0652            -1.   BAL0643             1.
+    SH060743  COST            296.43   TRAN0607            1.
+    SH060743  BAL0664            -1.   BAL0643             1.
+    SH060843  COST            333.33   TRAN0608            1.
+    SH060843  BAL0683            -1.   BAL0643             1.
+    SH060144  COST            195.57   TRAN0601            1.
+    SH060144  BAL0601            -1.   BAL0644             1.
+    SH060244  COST            466.17   TRAN0602            1.
+    SH060244  BAL0602            -1.   BAL0644             1.
+    SH060344  COST            157.44   TRAN0603            1.
+    SH060344  BAL0603            -1.   BAL0644             1.
+    SH060444  COST            383.76   TRAN0604            1.
+    SH060444  BAL0604            -1.   BAL0644             1.
+    SH060544  COST             381.3   TRAN0605            1.
+    SH060544  BAL0605            -1.   BAL0644             1.
+    SH060644  COST            109.47   TRAN0606            1.
+    SH060644  BAL0652            -1.   BAL0644             1.
+    SH060844  COST            366.54   TRAN0608            1.
+    SH060844  BAL0683            -1.   BAL0644             1.
+    SH060145  COST            211.56   TRAN0601            1.
+    SH060145  BAL0601            -1.   BAL0645             1.
+    SH060245  COST            536.28   TRAN0602            1.
+    SH060245  BAL0602            -1.   BAL0645             1.
+    SH060345  COST            198.03   TRAN0603            1.
+    SH060345  BAL0603            -1.   BAL0645             1.
+    SH060445  COST            359.16   TRAN0604            1.
+    SH060445  BAL0604            -1.   BAL0645             1.
+    SH060545  COST            287.82   TRAN0605            1.
+    SH060545  BAL0605            -1.   BAL0645             1.
+    SH060645  COST            234.93   TRAN0606            1.
+    SH060645  BAL0652            -1.   BAL0645             1.
+    SH060745  COST            242.31   TRAN0607            1.
+    SH060745  BAL0664            -1.   BAL0645             1.
+    SH060845  COST            375.15   TRAN0608            1.
+    SH060845  BAL0683            -1.   BAL0645             1.
+    SH060146  COST            301.35   TRAN0601            1.
+    SH060146  BAL0601            -1.   BAL0646             1.
+    SH060246  COST            335.79   TRAN0602            1.
+    SH060246  BAL0602            -1.   BAL0646             1.
+    SH060346  COST            271.83   TRAN0603            1.
+    SH060346  BAL0603            -1.   BAL0646             1.
+    SH060446  COST            549.81   TRAN0604            1.
+    SH060446  BAL0604            -1.   BAL0646             1.
+    SH060546  COST             528.9   TRAN0605            1.
+    SH060546  BAL0605            -1.   BAL0646             1.
+    SH060646  COST            316.11   TRAN0606            1.
+    SH060646  BAL0652            -1.   BAL0646             1.
+    SH060846  COST            551.04   TRAN0608            1.
+    SH060846  BAL0683            -1.   BAL0646             1.
+    SH060147  COST             135.3   TRAN0601            1.
+    SH060147  BAL0601            -1.   BAL0647             1.
+    SH060247  COST            458.79   TRAN0602            1.
+    SH060247  BAL0602            -1.   BAL0647             1.
+    SH060347  COST            195.57   TRAN0603            1.
+    SH060347  BAL0603            -1.   BAL0647             1.
+    SH060447  COST            337.02   TRAN0604            1.
+    SH060447  BAL0604            -1.   BAL0647             1.
+    SH060547  COST            286.59   TRAN0605            1.
+    SH060547  BAL0605            -1.   BAL0647             1.
+    SH060647  COST            178.35   TRAN0606            1.
+    SH060647  BAL0652            -1.   BAL0647             1.
+    SH060847  COST            300.12   TRAN0608            1.
+    SH060847  BAL0683            -1.   BAL0647             1.
+    SH060148  COST            116.85   TRAN0601            1.
+    SH060148  BAL0601            -1.   BAL0648             1.
+    SH060248  COST            416.97   TRAN0602            1.
+    SH060248  BAL0602            -1.   BAL0648             1.
+    SH060348  COST            168.51   TRAN0603            1.
+    SH060348  BAL0603            -1.   BAL0648             1.
+    SH060448  COST             282.9   TRAN0604            1.
+    SH060448  BAL0604            -1.   BAL0648             1.
+    SH060548  COST            303.81   TRAN0605            1.
+    SH060548  BAL0605            -1.   BAL0648             1.
+    SH060648  COST            141.45   TRAN0606            1.
+    SH060648  BAL0652            -1.   BAL0648             1.
+    SH060848  COST            239.85   TRAN0608            1.
+    SH060848  BAL0683            -1.   BAL0648             1.
+    SH060149  COST            404.67   TRAN0601            1.
+    SH060149  BAL0601            -1.   BAL0649             1.
+    SH060249  COST            658.05   TRAN0602            1.
+    SH060249  BAL0602            -1.   BAL0649             1.
+    SH060349  COST            408.36   TRAN0603            1.
+    SH060349  BAL0603            -1.   BAL0649             1.
+    SH060449  COST            468.63   TRAN0604            1.
+    SH060449  BAL0604            -1.   BAL0649             1.
+    SH060549  COST            186.96   TRAN0605            1.
+    SH060549  BAL0605            -1.   BAL0649             1.
+    SH060649  COST            415.74   TRAN0606            1.
+    SH060649  BAL0652            -1.   BAL0649             1.
+    SH060749  COST            164.82   TRAN0607            1.
+    SH060749  BAL0664            -1.   BAL0649             1.
+    SH060849  COST            501.84   TRAN0608            1.
+    SH060849  BAL0683            -1.   BAL0649             1.
+    SH060150  COST            296.43   TRAN0601            1.
+    SH060150  BAL0601            -1.   BAL0650             1.
+    SH060250  COST            752.76   TRAN0602            1.
+    SH060250  BAL0602            -1.   BAL0650             1.
+    SH060350  COST            302.58   TRAN0603            1.
+    SH060350  BAL0603            -1.   BAL0650             1.
+    SH060450  COST            448.95   TRAN0604            1.
+    SH060450  BAL0604            -1.   BAL0650             1.
+    SH060550  COST            289.05   TRAN0605            1.
+    SH060550  BAL0605            -1.   BAL0650             1.
+    SH060750  COST            168.51   TRAN0607            1.
+    SH060750  BAL0664            -1.   BAL0650             1.
+    SH060850  COST            499.38   TRAN0608            1.
+    SH060850  BAL0683            -1.   BAL0650             1.
+    SH060151  COST            408.36   TRAN0601            1.
+    SH060151  BAL0601            -1.   BAL0651             1.
+    SH060251  COST             676.5   TRAN0602            1.
+    SH060251  BAL0602            -1.   BAL0651             1.
+    SH060351  COST            419.43   TRAN0603            1.
+    SH060351  BAL0603            -1.   BAL0651             1.
+    SH060451  COST            415.74   TRAN0604            1.
+    SH060451  BAL0604            -1.   BAL0651             1.
+    SH060551  COST            151.29   TRAN0605            1.
+    SH060551  BAL0605            -1.   BAL0651             1.
+    SH060751  COST            121.77   TRAN0607            1.
+    SH060751  BAL0664            -1.   BAL0651             1.
+    SH060851  COST            526.44   TRAN0608            1.
+    SH060851  BAL0683            -1.   BAL0651             1.
+    SH060152  COST            137.76   TRAN0601            1.
+    SH060152  BAL0601            -1.   BAL0652             1.
+    SH060252  COST              369.   TRAN0602            1.
+    SH060252  BAL0602            -1.   BAL0652             1.
+    SH060352  COST            100.86   TRAN0603            1.
+    SH060352  BAL0603            -1.   BAL0652             1.
+    SH060452  COST            396.06   TRAN0604            1.
+    SH060452  BAL0604            -1.   BAL0652             1.
+    SH060552  COST            362.85   TRAN0605            1.
+    SH060552  BAL0605            -1.   BAL0652             1.
+    SH060852  COST            311.19   TRAN0608            1.
+    SH060852  BAL0683            -1.   BAL0652             1.
+    SH060153  COST            441.57   TRAN0601            1.
+    SH060153  BAL0601            -1.   BAL0653             1.
+    SH060253  COST            782.28   TRAN0602            1.
+    SH060253  BAL0602            -1.   BAL0653             1.
+    SH060353  COST            399.75   TRAN0603            1.
+    SH060353  BAL0603            -1.   BAL0653             1.
+    SH060453  COST            506.76   TRAN0604            1.
+    SH060453  BAL0604            -1.   BAL0653             1.
+    SH060553  COST            226.32   TRAN0605            1.
+    SH060553  BAL0605            -1.   BAL0653             1.
+    SH060653  COST            441.57   TRAN0606            1.
+    SH060653  BAL0652            -1.   BAL0653             1.
+    SH060753  COST            179.58   TRAN0607            1.
+    SH060753  BAL0664            -1.   BAL0653             1.
+    SH060853  COST            495.69   TRAN0608            1.
+    SH060853  BAL0683            -1.   BAL0653             1.
+    SH060154  COST            227.55   TRAN0601            1.
+    SH060154  BAL0601            -1.   BAL0654             1.
+    SH060254  COST            547.35   TRAN0602            1.
+    SH060254  BAL0602            -1.   BAL0654             1.
+    SH060354  COST            266.91   TRAN0603            1.
+    SH060354  BAL0603            -1.   BAL0654             1.
+    SH060454  COST            421.89   TRAN0604            1.
+    SH060454  BAL0604            -1.   BAL0654             1.
+    SH060554  COST            261.99   TRAN0605            1.
+    SH060554  BAL0605            -1.   BAL0654             1.
+    SH060654  COST            249.69   TRAN0606            1.
+    SH060654  BAL0652            -1.   BAL0654             1.
+    SH060854  COST            494.46   TRAN0608            1.
+    SH060854  BAL0683            -1.   BAL0654             1.
+    SH060155  COST            341.94   TRAN0601            1.
+    SH060155  BAL0601            -1.   BAL0655             1.
+    SH060255  COST            589.17   TRAN0602            1.
+    SH060255  BAL0602            -1.   BAL0655             1.
+    SH060355  COST            345.63   TRAN0603            1.
+    SH060355  BAL0603            -1.   BAL0655             1.
+    SH060455  COST            361.62   TRAN0604            1.
+    SH060455  BAL0604            -1.   BAL0655             1.
+    SH060555  COST            189.42   TRAN0605            1.
+    SH060555  BAL0605            -1.   BAL0655             1.
+    SH060655  COST             356.7   TRAN0606            1.
+    SH060655  BAL0652            -1.   BAL0655             1.
+    SH060755  COST            131.61   TRAN0607            1.
+    SH060755  BAL0664            -1.   BAL0655             1.
+    SH060855  COST            361.62   TRAN0608            1.
+    SH060855  BAL0683            -1.   BAL0655             1.
+    SH060156  COST             479.7   TRAN0601            1.
+    SH060156  BAL0601            -1.   BAL0656             1.
+    SH060256  COST            712.17   TRAN0602            1.
+    SH060256  BAL0602            -1.   BAL0656             1.
+    SH060356  COST            375.15   TRAN0603            1.
+    SH060356  BAL0603            -1.   BAL0656             1.
+    SH060456  COST            448.95   TRAN0604            1.
+    SH060456  BAL0604            -1.   BAL0656             1.
+    SH060556  COST            167.28   TRAN0605            1.
+    SH060556  BAL0605            -1.   BAL0656             1.
+    SH060656  COST            416.97   TRAN0606            1.
+    SH060656  BAL0652            -1.   BAL0656             1.
+    SH060756  COST            150.06   TRAN0607            1.
+    SH060756  BAL0664            -1.   BAL0656             1.
+    SH060856  COST            439.11   TRAN0608            1.
+    SH060856  BAL0683            -1.   BAL0656             1.
+    SH060157  COST            321.03   TRAN0601            1.
+    SH060157  BAL0601            -1.   BAL0657             1.
+    SH060257  COST             639.6   TRAN0602            1.
+    SH060257  BAL0602            -1.   BAL0657             1.
+    SH060357  COST             356.7   TRAN0603            1.
+    SH060357  BAL0603            -1.   BAL0657             1.
+    SH060457  COST            287.82   TRAN0604            1.
+    SH060457  BAL0604            -1.   BAL0657             1.
+    SH060557  COST            206.64   TRAN0605            1.
+    SH060557  BAL0605            -1.   BAL0657             1.
+    SH060657  COST            392.37   TRAN0606            1.
+    SH060657  BAL0652            -1.   BAL0657             1.
+    SH060757  COST            182.04   TRAN0607            1.
+    SH060757  BAL0664            -1.   BAL0657             1.
+    SH060857  COST            284.13   TRAN0608            1.
+    SH060857  BAL0683            -1.   BAL0657             1.
+    SH060158  COST            361.62   TRAN0601            1.
+    SH060158  BAL0601            -1.   BAL0658             1.
+    SH060258  COST            640.83   TRAN0602            1.
+    SH060258  BAL0602            -1.   BAL0658             1.
+    SH060358  COST            341.94   TRAN0603            1.
+    SH060358  BAL0603            -1.   BAL0658             1.
+    SH060458  COST            421.89   TRAN0604            1.
+    SH060458  BAL0604            -1.   BAL0658             1.
+    SH060558  COST             25.83   TRAN0605            1.
+    SH060558  BAL0605            -1.   BAL0658             1.
+    SH060658  COST            400.98   TRAN0606            1.
+    SH060658  BAL0652            -1.   BAL0658             1.
+    SH060758  COST             83.64   TRAN0607            1.
+    SH060758  BAL0664            -1.   BAL0658             1.
+    SH060858  COST            312.42   TRAN0608            1.
+    SH060858  BAL0683            -1.   BAL0658             1.
+    SH060159  COST            253.38   TRAN0601            1.
+    SH060159  BAL0601            -1.   BAL0659             1.
+    SH060259  COST            612.54   TRAN0602            1.
+    SH060259  BAL0602            -1.   BAL0659             1.
+    SH060359  COST            292.74   TRAN0603            1.
+    SH060359  BAL0603            -1.   BAL0659             1.
+    SH060459  COST            300.12   TRAN0604            1.
+    SH060459  BAL0604            -1.   BAL0659             1.
+    SH060559  COST            195.57   TRAN0605            1.
+    SH060559  BAL0605            -1.   BAL0659             1.
+    SH060659  COST            365.31   TRAN0606            1.
+    SH060659  BAL0652            -1.   BAL0659             1.
+    SH060759  COST            129.15   TRAN0607            1.
+    SH060759  BAL0664            -1.   BAL0659             1.
+    SH060859  COST            313.65   TRAN0608            1.
+    SH060859  BAL0683            -1.   BAL0659             1.
+    SH060160  COST            321.03   TRAN0601            1.
+    SH060160  BAL0601            -1.   BAL0660             1.
+    SH060260  COST             676.5   TRAN0602            1.
+    SH060260  BAL0602            -1.   BAL0660             1.
+    SH060360  COST            348.09   TRAN0603            1.
+    SH060360  BAL0603            -1.   BAL0660             1.
+    SH060460  COST            383.76   TRAN0604            1.
+    SH060460  BAL0604            -1.   BAL0660             1.
+    SH060560  COST            166.05   TRAN0605            1.
+    SH060560  BAL0605            -1.   BAL0660             1.
+    SH060660  COST            397.29   TRAN0606            1.
+    SH060660  BAL0652            -1.   BAL0660             1.
+    SH060760  COST            108.24   TRAN0607            1.
+    SH060760  BAL0664            -1.   BAL0660             1.
+    SH060860  COST            367.77   TRAN0608            1.
+    SH060860  BAL0683            -1.   BAL0660             1.
+    SH060163  COST            327.18   TRAN0601            1.
+    SH060163  BAL0601            -1.   BAL0663             1.
+    SH060263  COST            607.62   TRAN0602            1.
+    SH060263  BAL0602            -1.   BAL0663             1.
+    SH060363  COST            353.01   TRAN0603            1.
+    SH060363  BAL0603            -1.   BAL0663             1.
+    SH060463  COST            453.87   TRAN0604            1.
+    SH060463  BAL0604            -1.   BAL0663             1.
+    SH060563  COST            186.96   TRAN0605            1.
+    SH060563  BAL0605            -1.   BAL0663             1.
+    SH060663  COST            387.45   TRAN0606            1.
+    SH060663  BAL0652            -1.   BAL0663             1.
+    SH060763  COST            152.52   TRAN0607            1.
+    SH060763  BAL0664            -1.   BAL0663             1.
+    SH060863  COST              492.   TRAN0608            1.
+    SH060863  BAL0683            -1.   BAL0663             1.
+    SH060164  COST            244.77   TRAN0601            1.
+    SH060164  BAL0601            -1.   BAL0664             1.
+    SH060264  COST            646.98   TRAN0602            1.
+    SH060264  BAL0602            -1.   BAL0664             1.
+    SH060364  COST            274.29   TRAN0603            1.
+    SH060364  BAL0603            -1.   BAL0664             1.
+    SH060464  COST            413.28   TRAN0604            1.
+    SH060464  BAL0604            -1.   BAL0664             1.
+    SH060564  COST             71.34   TRAN0605            1.
+    SH060564  BAL0605            -1.   BAL0664             1.
+    SH060664  COST            389.91   TRAN0606            1.
+    SH060664  BAL0652            -1.   BAL0664             1.
+    SH060864  COST             307.5   TRAN0608            1.
+    SH060864  BAL0683            -1.   BAL0664             1.
+    SH060165  COST            531.36   TRAN0601            1.
+    SH060165  BAL0601            -1.   BAL0665             1.
+    SH060265  COST            377.61   TRAN0602            1.
+    SH060265  BAL0602            -1.   BAL0665             1.
+    SH060365  COST            621.15   TRAN0603            1.
+    SH060365  BAL0603            -1.   BAL0665             1.
+    SH060465  COST            477.24   TRAN0604            1.
+    SH060465  BAL0604            -1.   BAL0665             1.
+    SH060565  COST            742.92   TRAN0605            1.
+    SH060565  BAL0605            -1.   BAL0665             1.
+    SH060865  COST            510.45   TRAN0608            1.
+    SH060865  BAL0683            -1.   BAL0665             1.
+    SH060166  COST             688.8   TRAN0601            1.
+    SH060166  BAL0601            -1.   BAL0666             1.
+    SH060266  COST            318.57   TRAN0602            1.
+    SH060266  BAL0602            -1.   BAL0666             1.
+    SH060366  COST            710.94   TRAN0603            1.
+    SH060366  BAL0603            -1.   BAL0666             1.
+    SH060466  COST            683.88   TRAN0604            1.
+    SH060466  BAL0604            -1.   BAL0666             1.
+    SH060566  COST             873.3   TRAN0605            1.
+    SH060566  BAL0605            -1.   BAL0666             1.
+    SH060866  COST             688.8   TRAN0608            1.
+    SH060866  BAL0683            -1.   BAL0666             1.
+    SH060167  COST            522.75   TRAN0601            1.
+    SH060167  BAL0601            -1.   BAL0667             1.
+    SH060267  COST            285.36   TRAN0602            1.
+    SH060267  BAL0602            -1.   BAL0667             1.
+    SH060367  COST            606.39   TRAN0603            1.
+    SH060367  BAL0603            -1.   BAL0667             1.
+    SH060467  COST            562.11   TRAN0604            1.
+    SH060467  BAL0604            -1.   BAL0667             1.
+    SH060567  COST            742.92   TRAN0605            1.
+    SH060567  BAL0605            -1.   BAL0667             1.
+    SH060867  COST            563.34   TRAN0608            1.
+    SH060867  BAL0683            -1.   BAL0667             1.
+    SH060168  COST            730.62   TRAN0601            1.
+    SH060168  BAL0601            -1.   BAL0668             1.
+    SH060268  COST              492.   TRAN0602            1.
+    SH060268  BAL0602            -1.   BAL0668             1.
+    SH060368  COST             688.8   TRAN0603            1.
+    SH060368  BAL0603            -1.   BAL0668             1.
+    SH060468  COST            863.46   TRAN0604            1.
+    SH060468  BAL0604            -1.   BAL0668             1.
+    SH060568  COST           1163.58   TRAN0605            1.
+    SH060568  BAL0605            -1.   BAL0668             1.
+    SH060868  COST            923.73   TRAN0608            1.
+    SH060868  BAL0683            -1.   BAL0668             1.
+    SH060169  COST            662.97   TRAN0601            1.
+    SH060169  BAL0601            -1.   BAL0669             1.
+    SH060269  COST            271.83   TRAN0602            1.
+    SH060269  BAL0602            -1.   BAL0669             1.
+    SH060369  COST             627.3   TRAN0603            1.
+    SH060369  BAL0603            -1.   BAL0669             1.
+    SH060469  COST            765.06   TRAN0604            1.
+    SH060469  BAL0604            -1.   BAL0669             1.
+    SH060569  COST            794.58   TRAN0605            1.
+    SH060569  BAL0605            -1.   BAL0669             1.
+    SH060869  COST            809.34   TRAN0608            1.
+    SH060869  BAL0683            -1.   BAL0669             1.
+    SH060171  COST             541.2   TRAN0601            1.
+    SH060171  BAL0601            -1.   BAL0671             1.
+    SH060371  COST            644.52   TRAN0603            1.
+    SH060371  BAL0603            -1.   BAL0671             1.
+    SH060471  COST            640.83   TRAN0604            1.
+    SH060471  BAL0604            -1.   BAL0671             1.
+    SH060571  COST            714.63   TRAN0605            1.
+    SH060571  BAL0605            -1.   BAL0671             1.
+    SH060671  COST            480.93   TRAN0606            1.
+    SH060671  BAL0652            -1.   BAL0671             1.
+    SH060771  COST            865.92   TRAN0607            1.
+    SH060771  BAL0664            -1.   BAL0671             1.
+    SH060871  COST            655.59   TRAN0608            1.
+    SH060871  BAL0683            -1.   BAL0671             1.
+    SH060172  COST            722.01   TRAN0601            1.
+    SH060172  BAL0601            -1.   BAL0672             1.
+    SH060272  COST            667.89   TRAN0602            1.
+    SH060272  BAL0602            -1.   BAL0672             1.
+    SH060372  COST            758.91   TRAN0603            1.
+    SH060372  BAL0603            -1.   BAL0672             1.
+    SH060472  COST             701.1   TRAN0604            1.
+    SH060472  BAL0604            -1.   BAL0672             1.
+    SH060572  COST            938.49   TRAN0605            1.
+    SH060572  BAL0605            -1.   BAL0672             1.
+    SH060872  COST             701.1   TRAN0608            1.
+    SH060872  BAL0683            -1.   BAL0672             1.
+    SH060173  COST             479.7   TRAN0601            1.
+    SH060173  BAL0601            -1.   BAL0673             1.
+    SH060273  COST            448.95   TRAN0602            1.
+    SH060273  BAL0602            -1.   BAL0673             1.
+    SH060373  COST            415.74   TRAN0603            1.
+    SH060373  BAL0603            -1.   BAL0673             1.
+    SH060473  COST            562.11   TRAN0604            1.
+    SH060473  BAL0604            -1.   BAL0673             1.
+    SH060573  COST            693.72   TRAN0605            1.
+    SH060573  BAL0605            -1.   BAL0673             1.
+    SH060673  COST            375.15   TRAN0606            1.
+    SH060673  BAL0652            -1.   BAL0673             1.
+    SH060873  COST            619.92   TRAN0608            1.
+    SH060873  BAL0683            -1.   BAL0673             1.
+    SH060174  COST            674.04   TRAN0601            1.
+    SH060174  BAL0601            -1.   BAL0674             1.
+    SH060274  COST             258.3   TRAN0602            1.
+    SH060274  BAL0602            -1.   BAL0674             1.
+    SH060374  COST             701.1   TRAN0603            1.
+    SH060374  BAL0603            -1.   BAL0674             1.
+    SH060474  COST            783.51   TRAN0604            1.
+    SH060474  BAL0604            -1.   BAL0674             1.
+    SH060574  COST            901.59   TRAN0605            1.
+    SH060574  BAL0605            -1.   BAL0674             1.
+    SH060874  COST            761.37   TRAN0608            1.
+    SH060874  BAL0683            -1.   BAL0674             1.
+    SH060275  COST            681.42   TRAN0602            1.
+    SH060275  BAL0602            -1.   BAL0675             1.
+    SH060176  COST            568.26   TRAN0601            1.
+    SH060176  BAL0601            -1.   BAL0676             1.
+    SH060276  COST            493.23   TRAN0602            1.
+    SH060276  BAL0602            -1.   BAL0676             1.
+    SH060376  COST            495.69   TRAN0603            1.
+    SH060376  BAL0603            -1.   BAL0676             1.
+    SH060476  COST             774.9   TRAN0604            1.
+    SH060476  BAL0604            -1.   BAL0676             1.
+    SH060576  COST             774.9   TRAN0605            1.
+    SH060576  BAL0605            -1.   BAL0676             1.
+    SH060676  COST            468.63   TRAN0606            1.
+    SH060676  BAL0652            -1.   BAL0676             1.
+    SH060876  COST            955.71   TRAN0608            1.
+    SH060876  BAL0683            -1.   BAL0676             1.
+    SH060177  COST            535.05   TRAN0601            1.
+    SH060177  BAL0601            -1.   BAL0677             1.
+    SH060277  COST            334.56   TRAN0602            1.
+    SH060277  BAL0602            -1.   BAL0677             1.
+    SH060377  COST            567.03   TRAN0603            1.
+    SH060377  BAL0603            -1.   BAL0677             1.
+    SH060477  COST            493.23   TRAN0604            1.
+    SH060477  BAL0604            -1.   BAL0677             1.
+    SH060577  COST             688.8   TRAN0605            1.
+    SH060577  BAL0605            -1.   BAL0677             1.
+    SH060877  COST             393.6   TRAN0608            1.
+    SH060877  BAL0683            -1.   BAL0677             1.
+    SH060178  COST            936.03   TRAN0601            1.
+    SH060178  BAL0601            -1.   BAL0678             1.
+    SH060278  COST            543.66   TRAN0602            1.
+    SH060278  BAL0602            -1.   BAL0678             1.
+    SH060378  COST            963.09   TRAN0603            1.
+    SH060378  BAL0603            -1.   BAL0678             1.
+    SH060478  COST            842.55   TRAN0604            1.
+    SH060478  BAL0604            -1.   BAL0678             1.
+    SH060578  COST           1081.17   TRAN0605            1.
+    SH060578  BAL0605            -1.   BAL0678             1.
+    SH060878  COST            942.18   TRAN0608            1.
+    SH060878  BAL0683            -1.   BAL0678             1.
+    SH060179  COST            879.45   TRAN0601            1.
+    SH060179  BAL0601            -1.   BAL0679             1.
+    SH060279  COST            330.87   TRAN0602            1.
+    SH060279  BAL0602            -1.   BAL0679             1.
+    SH060379  COST            849.93   TRAN0603            1.
+    SH060379  BAL0603            -1.   BAL0679             1.
+    SH060479  COST             885.6   TRAN0604            1.
+    SH060479  BAL0604            -1.   BAL0679             1.
+    SH060879  COST            868.38   TRAN0608            1.
+    SH060879  BAL0683            -1.   BAL0679             1.
+    SH060180  COST            389.91   TRAN0601            1.
+    SH060180  BAL0601            -1.   BAL0680             1.
+    SH060280  COST            485.85   TRAN0602            1.
+    SH060280  BAL0602            -1.   BAL0680             1.
+    SH060380  COST            537.51   TRAN0603            1.
+    SH060380  BAL0603            -1.   BAL0680             1.
+    SH060480  COST            460.02   TRAN0604            1.
+    SH060480  BAL0604            -1.   BAL0680             1.
+    SH060580  COST            621.15   TRAN0605            1.
+    SH060580  BAL0605            -1.   BAL0680             1.
+    SH060880  COST             295.2   TRAN0608            1.
+    SH060880  BAL0683            -1.   BAL0680             1.
+    SH060182  COST            715.86   TRAN0601            1.
+    SH060182  BAL0601            -1.   BAL0682             1.
+    SH060282  COST            404.67   TRAN0602            1.
+    SH060282  BAL0602            -1.   BAL0682             1.
+    SH060382  COST            805.65   TRAN0603            1.
+    SH060382  BAL0603            -1.   BAL0682             1.
+    SH060482  COST            868.38   TRAN0604            1.
+    SH060482  BAL0604            -1.   BAL0682             1.
+    SH060582  COST           1410.81   TRAN0605            1.
+    SH060582  BAL0605            -1.   BAL0682             1.
+    SH060882  COST            963.09   TRAN0608            1.
+    SH060882  BAL0683            -1.   BAL0682             1.
+    SH060183  COST            217.71   TRAN0601            1.
+    SH060183  BAL0601            -1.   BAL0683             1.
+    SH060283  COST             639.6   TRAN0602            1.
+    SH060283  BAL0602            -1.   BAL0683             1.
+    SH060383  COST            334.56   TRAN0603            1.
+    SH060383  BAL0603            -1.   BAL0683             1.
+    SH060483  COST             72.57   TRAN0604            1.
+    SH060483  BAL0604            -1.   BAL0683             1.
+    SH060583  COST            426.81   TRAN0605            1.
+    SH060583  BAL0605            -1.   BAL0683             1.
+    SH060683  COST            305.04   TRAN0606            1.
+    SH060683  BAL0652            -1.   BAL0683             1.
+    SH060184  COST            373.92   TRAN0601            1.
+    SH060184  BAL0601            -1.   BAL0684             1.
+    SH060284  COST            236.16   TRAN0602            1.
+    SH060284  BAL0602            -1.   BAL0684             1.
+    SH060384  COST            447.72   TRAN0603            1.
+    SH060384  BAL0603            -1.   BAL0684             1.
+    SH060484  COST             455.1   TRAN0604            1.
+    SH060484  BAL0604            -1.   BAL0684             1.
+    SH060584  COST             602.7   TRAN0605            1.
+    SH060584  BAL0605            -1.   BAL0684             1.
+    SH060684  COST            375.15   TRAN0606            1.
+    SH060684  BAL0652            -1.   BAL0684             1.
+    SH060884  COST            477.24   TRAN0608            1.
+    SH060884  BAL0683            -1.   BAL0684             1.
+    SH070201  COST            323.73   TRAN0702            1.
+    SH070201  BAL0702            -1.   BAL0701             1.
+    SH070301  COST            124.26   TRAN0703            1.
+    SH070301  BAL0703            -1.   BAL0701             1.
+    SH070401  COST            226.72   TRAN0704            1.
+    SH070401  BAL0704            -1.   BAL0701             1.
+    SH070501  COST            258.33   TRAN0705            1.
+    SH070501  BAL0705            -1.   BAL0701             1.
+    SH070601  COST            137.34   TRAN0706            1.
+    SH070601  BAL0752            -1.   BAL0701             1.
+    SH070801  COST            155.87   TRAN0708            1.
+    SH070801  BAL0783            -1.   BAL0701             1.
+    SH070102  COST            516.66   TRAN0701            1.
+    SH070102  BAL0701            -1.   BAL0702             1.
+    SH070302  COST            454.53   TRAN0703            1.
+    SH070302  BAL0703            -1.   BAL0702             1.
+    SH070402  COST            667.08   TRAN0704            1.
+    SH070402  BAL0704            -1.   BAL0702             1.
+    SH070502  COST            807.69   TRAN0705            1.
+    SH070502  BAL0705            -1.   BAL0702             1.
+    SH070602  COST            412.02   TRAN0706            1.
+    SH070602  BAL0752            -1.   BAL0702             1.
+    SH070802  COST            567.89   TRAN0708            1.
+    SH070802  BAL0783            -1.   BAL0702             1.
+    SH070103  COST            267.05   TRAN0701            1.
+    SH070103  BAL0701            -1.   BAL0703             1.
+    SH070203  COST            516.66   TRAN0702            1.
+    SH070203  BAL0702            -1.   BAL0703             1.
+    SH070403  COST            400.03   TRAN0704            1.
+    SH070403  BAL0704            -1.   BAL0703             1.
+    SH070503  COST            309.56   TRAN0705            1.
+    SH070503  BAL0705            -1.   BAL0703             1.
+    SH070603  COST              98.1   TRAN0706            1.
+    SH070603  BAL0752            -1.   BAL0703             1.
+    SH070803  COST            277.95   TRAN0708            1.
+    SH070803  BAL0783            -1.   BAL0703             1.
+    SH070104  COST            189.66   TRAN0701            1.
+    SH070104  BAL0701            -1.   BAL0704             1.
+    SH070204  COST            548.27   TRAN0702            1.
+    SH070204  BAL0702            -1.   BAL0704             1.
+    SH070304  COST            264.87   TRAN0703            1.
+    SH070304  BAL0703            -1.   BAL0704             1.
+    SH070504  COST            347.71   TRAN0705            1.
+    SH070504  BAL0705            -1.   BAL0704             1.
+    SH070604  COST            267.05   TRAN0706            1.
+    SH070604  BAL0752            -1.   BAL0704             1.
+    SH070704  COST            293.21   TRAN0707            1.
+    SH070704  BAL0764            -1.   BAL0704             1.
+    SH070804  COST             63.22   TRAN0708            1.
+    SH070804  BAL0783            -1.   BAL0704             1.
+    SH070105  COST             294.3   TRAN0701            1.
+    SH070105  BAL0701            -1.   BAL0705             1.
+    SH070205  COST            562.44   TRAN0702            1.
+    SH070205  BAL0702            -1.   BAL0705             1.
+    SH070305  COST            309.56   TRAN0703            1.
+    SH070305  BAL0703            -1.   BAL0705             1.
+    SH070405  COST            310.65   TRAN0704            1.
+    SH070405  BAL0704            -1.   BAL0705             1.
+    SH070605  COST            355.34   TRAN0706            1.
+    SH070605  BAL0752            -1.   BAL0705             1.
+    SH070705  COST            364.06   TRAN0707            1.
+    SH070705  BAL0764            -1.   BAL0705             1.
+    SH070805  COST            295.39   TRAN0708            1.
+    SH070805  BAL0783            -1.   BAL0705             1.
+    SH070106  COST            216.91   TRAN0701            1.
+    SH070106  BAL0701            -1.   BAL0706             1.
+    SH070206  COST            454.53   TRAN0702            1.
+    SH070206  BAL0702            -1.   BAL0706             1.
+    SH070306  COST            232.17   TRAN0703            1.
+    SH070306  BAL0703            -1.   BAL0706             1.
+    SH070406  COST            238.71   TRAN0704            1.
+    SH070406  BAL0704            -1.   BAL0706             1.
+    SH070506  COST            274.68   TRAN0705            1.
+    SH070506  BAL0705            -1.   BAL0706             1.
+    SH070606  COST            224.54   TRAN0706            1.
+    SH070606  BAL0752            -1.   BAL0706             1.
+    SH070706  COST              218.   TRAN0707            1.
+    SH070706  BAL0764            -1.   BAL0706             1.
+    SH070806  COST            164.59   TRAN0708            1.
+    SH070806  BAL0783            -1.   BAL0706             1.
+    SH070107  COST             22.89   TRAN0701            1.
+    SH070107  BAL0701            -1.   BAL0707             1.
+    SH070207  COST            318.28   TRAN0702            1.
+    SH070207  BAL0702            -1.   BAL0707             1.
+    SH070307  COST            135.16   TRAN0703            1.
+    SH070307  BAL0703            -1.   BAL0707             1.
+    SH070407  COST            225.63   TRAN0704            1.
+    SH070407  BAL0704            -1.   BAL0707             1.
+    SH070507  COST            249.61   TRAN0705            1.
+    SH070507  BAL0705            -1.   BAL0707             1.
+    SH070607  COST            136.25   TRAN0706            1.
+    SH070607  BAL0752            -1.   BAL0707             1.
+    SH070707  COST            252.88   TRAN0707            1.
+    SH070707  BAL0764            -1.   BAL0707             1.
+    SH070807  COST            168.95   TRAN0708            1.
+    SH070807  BAL0783            -1.   BAL0707             1.
+    SH070108  COST             71.94   TRAN0701            1.
+    SH070108  BAL0701            -1.   BAL0708             1.
+    SH070208  COST            409.84   TRAN0702            1.
+    SH070208  BAL0702            -1.   BAL0708             1.
+    SH070308  COST            153.69   TRAN0703            1.
+    SH070308  BAL0703            -1.   BAL0708             1.
+    SH070408  COST            269.23   TRAN0704            1.
+    SH070408  BAL0704            -1.   BAL0708             1.
+    SH070508  COST            198.38   TRAN0705            1.
+    SH070508  BAL0705            -1.   BAL0708             1.
+    SH070608  COST            180.94   TRAN0706            1.
+    SH070608  BAL0752            -1.   BAL0708             1.
+    SH070808  COST            203.83   TRAN0708            1.
+    SH070808  BAL0783            -1.   BAL0708             1.
+    SH070109  COST            150.42   TRAN0701            1.
+    SH070109  BAL0701            -1.   BAL0709             1.
+    SH070209  COST            417.47   TRAN0702            1.
+    SH070209  BAL0702            -1.   BAL0709             1.
+    SH070309  COST            183.12   TRAN0703            1.
+    SH070309  BAL0703            -1.   BAL0709             1.
+    SH070409  COST            275.77   TRAN0704            1.
+    SH070409  BAL0704            -1.   BAL0709             1.
+    SH070509  COST            260.51   TRAN0705            1.
+    SH070509  BAL0705            -1.   BAL0709             1.
+    SH070709  COST            213.64   TRAN0707            1.
+    SH070709  BAL0764            -1.   BAL0709             1.
+    SH070809  COST            211.46   TRAN0708            1.
+    SH070809  BAL0783            -1.   BAL0709             1.
+    SH070110  COST            269.23   TRAN0701            1.
+    SH070110  BAL0701            -1.   BAL0710             1.
+    SH070210  COST            172.22   TRAN0702            1.
+    SH070210  BAL0702            -1.   BAL0710             1.
+    SH070310  COST             261.6   TRAN0703            1.
+    SH070310  BAL0703            -1.   BAL0710             1.
+    SH070410  COST            391.31   TRAN0704            1.
+    SH070410  BAL0704            -1.   BAL0710             1.
+    SH070510  COST            419.65   TRAN0705            1.
+    SH070510  BAL0705            -1.   BAL0710             1.
+    SH070610  COST            245.25   TRAN0706            1.
+    SH070610  BAL0752            -1.   BAL0710             1.
+    SH070810  COST            332.45   TRAN0708            1.
+    SH070810  BAL0783            -1.   BAL0710             1.
+    SH070111  COST            115.54   TRAN0701            1.
+    SH070111  BAL0701            -1.   BAL0711             1.
+    SH070211  COST            539.55   TRAN0702            1.
+    SH070211  BAL0702            -1.   BAL0711             1.
+    SH070311  COST            270.32   TRAN0703            1.
+    SH070311  BAL0703            -1.   BAL0711             1.
+    SH070411  COST            151.51   TRAN0704            1.
+    SH070411  BAL0704            -1.   BAL0711             1.
+    SH070511  COST            371.69   TRAN0705            1.
+    SH070511  BAL0705            -1.   BAL0711             1.
+    SH070611  COST            213.64   TRAN0706            1.
+    SH070611  BAL0752            -1.   BAL0711             1.
+    SH070811  COST            111.18   TRAN0708            1.
+    SH070811  BAL0783            -1.   BAL0711             1.
+    SH070112  COST             95.92   TRAN0701            1.
+    SH070112  BAL0701            -1.   BAL0712             1.
+    SH070212  COST            369.51   TRAN0702            1.
+    SH070212  BAL0702            -1.   BAL0712             1.
+    SH070312  COST            159.14   TRAN0703            1.
+    SH070312  BAL0703            -1.   BAL0712             1.
+    SH070412  COST              218.   TRAN0704            1.
+    SH070412  BAL0704            -1.   BAL0712             1.
+    SH070512  COST            291.03   TRAN0705            1.
+    SH070512  BAL0705            -1.   BAL0712             1.
+    SH070612  COST            158.05   TRAN0706            1.
+    SH070612  BAL0752            -1.   BAL0712             1.
+    SH070812  COST            159.14   TRAN0708            1.
+    SH070812  BAL0783            -1.   BAL0712             1.
+    SH070114  COST            154.78   TRAN0701            1.
+    SH070114  BAL0701            -1.   BAL0714             1.
+    SH070214  COST            449.08   TRAN0702            1.
+    SH070214  BAL0702            -1.   BAL0714             1.
+    SH070314  COST            213.64   TRAN0703            1.
+    SH070314  BAL0703            -1.   BAL0714             1.
+    SH070414  COST            216.91   TRAN0704            1.
+    SH070414  BAL0704            -1.   BAL0714             1.
+    SH070514  COST            383.68   TRAN0705            1.
+    SH070514  BAL0705            -1.   BAL0714             1.
+    SH070614  COST            204.92   TRAN0706            1.
+    SH070614  BAL0752            -1.   BAL0714             1.
+    SH070814  COST            137.34   TRAN0708            1.
+    SH070814  BAL0783            -1.   BAL0714             1.
+    SH070115  COST            330.27   TRAN0701            1.
+    SH070115  BAL0701            -1.   BAL0715             1.
+    SH070215  COST            173.31   TRAN0702            1.
+    SH070215  BAL0702            -1.   BAL0715             1.
+    SH070315  COST            255.06   TRAN0703            1.
+    SH070315  BAL0703            -1.   BAL0715             1.
+    SH070415  COST            518.84   TRAN0704            1.
+    SH070415  BAL0704            -1.   BAL0715             1.
+    SH070515  COST            433.82   TRAN0705            1.
+    SH070515  BAL0705            -1.   BAL0715             1.
+    SH070615  COST            204.92   TRAN0706            1.
+    SH070615  BAL0752            -1.   BAL0715             1.
+    SH070815  COST            406.57   TRAN0708            1.
+    SH070815  BAL0783            -1.   BAL0715             1.
+    SH070116  COST            172.22   TRAN0701            1.
+    SH070116  BAL0701            -1.   BAL0716             1.
+    SH070216  COST             305.2   TRAN0702            1.
+    SH070216  BAL0702            -1.   BAL0716             1.
+    SH070316  COST            247.43   TRAN0703            1.
+    SH070316  BAL0703            -1.   BAL0716             1.
+    SH070416  COST            312.83   TRAN0704            1.
+    SH070416  BAL0704            -1.   BAL0716             1.
+    SH070516  COST            347.71   TRAN0705            1.
+    SH070516  BAL0705            -1.   BAL0716             1.
+    SH070616  COST            142.79   TRAN0706            1.
+    SH070616  BAL0752            -1.   BAL0716             1.
+    SH070816  COST            223.45   TRAN0708            1.
+    SH070816  BAL0783            -1.   BAL0716             1.
+    SH070117  COST            164.59   TRAN0701            1.
+    SH070117  BAL0701            -1.   BAL0717             1.
+    SH070217  COST            550.45   TRAN0702            1.
+    SH070217  BAL0702            -1.   BAL0717             1.
+    SH070317  COST            298.66   TRAN0703            1.
+    SH070317  BAL0703            -1.   BAL0717             1.
+    SH070417  COST             62.13   TRAN0704            1.
+    SH070417  BAL0704            -1.   BAL0717             1.
+    SH070517  COST            324.82   TRAN0705            1.
+    SH070517  BAL0705            -1.   BAL0717             1.
+    SH070717  COST            321.55   TRAN0707            1.
+    SH070717  BAL0764            -1.   BAL0717             1.
+    SH070817  COST             29.43   TRAN0708            1.
+    SH070817  BAL0783            -1.   BAL0717             1.
+    SH070118  COST            190.75   TRAN0701            1.
+    SH070118  BAL0701            -1.   BAL0718             1.
+    SH070218  COST            393.49   TRAN0702            1.
+    SH070218  BAL0702            -1.   BAL0718             1.
+    SH070318  COST             294.3   TRAN0703            1.
+    SH070318  BAL0703            -1.   BAL0718             1.
+    SH070418  COST            167.86   TRAN0704            1.
+    SH070418  BAL0704            -1.   BAL0718             1.
+    SH070518  COST            443.63   TRAN0705            1.
+    SH070518  BAL0705            -1.   BAL0718             1.
+    SH070618  COST            383.68   TRAN0706            1.
+    SH070618  BAL0752            -1.   BAL0718             1.
+    SH070818  COST            112.27   TRAN0708            1.
+    SH070818  BAL0783            -1.   BAL0718             1.
+    SH070119  COST            270.32   TRAN0701            1.
+    SH070119  BAL0701            -1.   BAL0719             1.
+    SH070219  COST            748.83   TRAN0702            1.
+    SH070219  BAL0702            -1.   BAL0719             1.
+    SH070319  COST            345.53   TRAN0703            1.
+    SH070319  BAL0703            -1.   BAL0719             1.
+    SH070419  COST            173.31   TRAN0704            1.
+    SH070419  BAL0704            -1.   BAL0719             1.
+    SH070519  COST            226.72   TRAN0705            1.
+    SH070519  BAL0705            -1.   BAL0719             1.
+    SH070619  COST            376.05   TRAN0706            1.
+    SH070619  BAL0752            -1.   BAL0719             1.
+    SH070819  COST            107.91   TRAN0708            1.
+    SH070819  BAL0783            -1.   BAL0719             1.
+    SH070120  COST            223.45   TRAN0701            1.
+    SH070120  BAL0701            -1.   BAL0720             1.
+    SH070220  COST            744.47   TRAN0702            1.
+    SH070220  BAL0702            -1.   BAL0720             1.
+    SH070320  COST            323.73   TRAN0703            1.
+    SH070320  BAL0703            -1.   BAL0720             1.
+    SH070420  COST            123.17   TRAN0704            1.
+    SH070420  BAL0704            -1.   BAL0720             1.
+    SH070520  COST            317.19   TRAN0705            1.
+    SH070520  BAL0705            -1.   BAL0720             1.
+    SH070820  COST            137.34   TRAN0708            1.
+    SH070820  BAL0783            -1.   BAL0720             1.
+    SH070121  COST            439.27   TRAN0701            1.
+    SH070121  BAL0701            -1.   BAL0721             1.
+    SH070221  COST            401.12   TRAN0702            1.
+    SH070221  BAL0702            -1.   BAL0721             1.
+    SH070321  COST            486.14   TRAN0703            1.
+    SH070321  BAL0703            -1.   BAL0721             1.
+    SH070421  COST             348.8   TRAN0704            1.
+    SH070421  BAL0704            -1.   BAL0721             1.
+    SH070521  COST             599.5   TRAN0705            1.
+    SH070521  BAL0705            -1.   BAL0721             1.
+    SH070821  COST             348.8   TRAN0708            1.
+    SH070821  BAL0783            -1.   BAL0721             1.
+    SH070122  COST            270.32   TRAN0701            1.
+    SH070122  BAL0701            -1.   BAL0722             1.
+    SH070222  COST            630.02   TRAN0702            1.
+    SH070222  BAL0702            -1.   BAL0722             1.
+    SH070322  COST            325.91   TRAN0703            1.
+    SH070322  BAL0703            -1.   BAL0722             1.
+    SH070422  COST            244.16   TRAN0704            1.
+    SH070422  BAL0704            -1.   BAL0722             1.
+    SH070522  COST            195.11   TRAN0705            1.
+    SH070522  BAL0705            -1.   BAL0722             1.
+    SH070622  COST             337.9   TRAN0706            1.
+    SH070622  BAL0752            -1.   BAL0722             1.
+    SH070822  COST            151.51   TRAN0708            1.
+    SH070822  BAL0783            -1.   BAL0722             1.
+    SH070123  COST            255.06   TRAN0701            1.
+    SH070123  BAL0701            -1.   BAL0723             1.
+    SH070223  COST            589.69   TRAN0702            1.
+    SH070223  BAL0702            -1.   BAL0723             1.
+    SH070323  COST            312.83   TRAN0703            1.
+    SH070323  BAL0703            -1.   BAL0723             1.
+    SH070423  COST            182.03   TRAN0704            1.
+    SH070423  BAL0704            -1.   BAL0723             1.
+    SH070523  COST            180.94   TRAN0705            1.
+    SH070523  BAL0705            -1.   BAL0723             1.
+    SH070823  COST            151.51   TRAN0708            1.
+    SH070823  BAL0783            -1.   BAL0723             1.
+    SH070124  COST           1565.24   TRAN0701            1.
+    SH070124  BAL0701            -1.   BAL0724             1.
+    SH070125  COST            421.83   TRAN0701            1.
+    SH070125  BAL0701            -1.   BAL0725             1.
+    SH070225  COST            465.43   TRAN0702            1.
+    SH070225  BAL0702            -1.   BAL0725             1.
+    SH070325  COST            556.99   TRAN0703            1.
+    SH070325  BAL0703            -1.   BAL0725             1.
+    SH070425  COST            379.32   TRAN0704            1.
+    SH070425  BAL0704            -1.   BAL0725             1.
+    SH070525  COST            616.94   TRAN0705            1.
+    SH070525  BAL0705            -1.   BAL0725             1.
+    SH070625  COST            439.27   TRAN0706            1.
+    SH070625  BAL0752            -1.   BAL0725             1.
+    SH070825  COST            332.45   TRAN0708            1.
+    SH070825  BAL0783            -1.   BAL0725             1.
+    SH070426  COST             294.3   TRAN0704            1.
+    SH070426  BAL0704            -1.   BAL0726             1.
+    SH070127  COST            255.06   TRAN0701            1.
+    SH070127  BAL0701            -1.   BAL0727             1.
+    SH070227  COST            309.56   TRAN0702            1.
+    SH070227  BAL0702            -1.   BAL0727             1.
+    SH070327  COST            315.01   TRAN0703            1.
+    SH070327  BAL0703            -1.   BAL0727             1.
+    SH070427  COST            365.15   TRAN0704            1.
+    SH070427  BAL0704            -1.   BAL0727             1.
+    SH070527  COST            412.02   TRAN0705            1.
+    SH070527  BAL0705            -1.   BAL0727             1.
+    SH070627  COST            292.12   TRAN0706            1.
+    SH070627  BAL0752            -1.   BAL0727             1.
+    SH070827  COST            274.68   TRAN0708            1.
+    SH070827  BAL0783            -1.   BAL0727             1.
+    SH070128  COST            264.87   TRAN0701            1.
+    SH070128  BAL0701            -1.   BAL0728             1.
+    SH070228  COST            620.21   TRAN0702            1.
+    SH070228  BAL0702            -1.   BAL0728             1.
+    SH070328  COST            322.64   TRAN0703            1.
+    SH070328  BAL0703            -1.   BAL0728             1.
+    SH070428  COST            321.55   TRAN0704            1.
+    SH070428  BAL0704            -1.   BAL0728             1.
+    SH070528  COST            111.18   TRAN0705            1.
+    SH070528  BAL0705            -1.   BAL0728             1.
+    SH070628  COST            284.49   TRAN0706            1.
+    SH070628  BAL0752            -1.   BAL0728             1.
+    SH070728  COST            116.63   TRAN0707            1.
+    SH070728  BAL0764            -1.   BAL0728             1.
+    SH070828  COST            276.86   TRAN0708            1.
+    SH070828  BAL0783            -1.   BAL0728             1.
+    SH070129  COST            243.07   TRAN0701            1.
+    SH070129  BAL0701            -1.   BAL0729             1.
+    SH070229  COST            505.76   TRAN0702            1.
+    SH070229  BAL0702            -1.   BAL0729             1.
+    SH070329  COST            262.69   TRAN0703            1.
+    SH070329  BAL0703            -1.   BAL0729             1.
+    SH070429  COST            216.91   TRAN0704            1.
+    SH070429  BAL0704            -1.   BAL0729             1.
+    SH070529  COST             468.7   TRAN0705            1.
+    SH070529  BAL0705            -1.   BAL0729             1.
+    SH070629  COST            284.49   TRAN0706            1.
+    SH070629  BAL0752            -1.   BAL0729             1.
+    SH070829  COST            156.96   TRAN0708            1.
+    SH070829  BAL0783            -1.   BAL0729             1.
+    SH070130  COST            507.94   TRAN0701            1.
+    SH070130  BAL0701            -1.   BAL0730             1.
+    SH070230  COST            475.24   TRAN0702            1.
+    SH070230  BAL0702            -1.   BAL0730             1.
+    SH070330  COST            570.07   TRAN0703            1.
+    SH070330  BAL0703            -1.   BAL0730             1.
+    SH070430  COST            331.36   TRAN0704            1.
+    SH070430  BAL0704            -1.   BAL0730             1.
+    SH070530  COST            486.14   TRAN0705            1.
+    SH070530  BAL0705            -1.   BAL0730             1.
+    SH070830  COST            416.38   TRAN0708            1.
+    SH070830  BAL0783            -1.   BAL0730             1.
+    SH070131  COST            120.99   TRAN0701            1.
+    SH070131  BAL0701            -1.   BAL0731             1.
+    SH070231  COST            382.59   TRAN0702            1.
+    SH070231  BAL0702            -1.   BAL0731             1.
+    SH070331  COST             119.9   TRAN0703            1.
+    SH070331  BAL0703            -1.   BAL0731             1.
+    SH070431  COST            275.77   TRAN0704            1.
+    SH070431  BAL0704            -1.   BAL0731             1.
+    SH070531  COST            334.63   TRAN0705            1.
+    SH070531  BAL0705            -1.   BAL0731             1.
+    SH070631  COST            122.08   TRAN0706            1.
+    SH070631  BAL0752            -1.   BAL0731             1.
+    SH070831  COST            243.07   TRAN0708            1.
+    SH070831  BAL0783            -1.   BAL0731             1.
+    SH070132  COST            325.91   TRAN0701            1.
+    SH070132  BAL0701            -1.   BAL0732             1.
+    SH070232  COST            521.02   TRAN0702            1.
+    SH070232  BAL0702            -1.   BAL0732             1.
+    SH070332  COST            461.07   TRAN0703            1.
+    SH070332  BAL0703            -1.   BAL0732             1.
+    SH070432  COST            171.13   TRAN0704            1.
+    SH070432  BAL0704            -1.   BAL0732             1.
+    SH070532  COST            427.28   TRAN0705            1.
+    SH070532  BAL0705            -1.   BAL0732             1.
+    SH070832  COST             196.2   TRAN0708            1.
+    SH070832  BAL0783            -1.   BAL0732             1.
+    SH070133  COST            537.37   TRAN0701            1.
+    SH070133  BAL0701            -1.   BAL0733             1.
+    SH070233  COST              436.   TRAN0702            1.
+    SH070233  BAL0702            -1.   BAL0733             1.
+    SH070333  COST            591.87   TRAN0703            1.
+    SH070333  BAL0703            -1.   BAL0733             1.
+    SH070433  COST            485.05   TRAN0704            1.
+    SH070433  BAL0704            -1.   BAL0733             1.
+    SH070533  COST            687.79   TRAN0705            1.
+    SH070533  BAL0705            -1.   BAL0733             1.
+    SH070833  COST            415.29   TRAN0708            1.
+    SH070833  BAL0783            -1.   BAL0733             1.
+    SH070134  COST            420.74   TRAN0701            1.
+    SH070134  BAL0701            -1.   BAL0734             1.
+    SH070234  COST            713.95   TRAN0702            1.
+    SH070234  BAL0702            -1.   BAL0734             1.
+    SH070334  COST            548.27   TRAN0703            1.
+    SH070334  BAL0703            -1.   BAL0734             1.
+    SH070434  COST            229.99   TRAN0704            1.
+    SH070434  BAL0704            -1.   BAL0734             1.
+    SH070534  COST            480.69   TRAN0705            1.
+    SH070534  BAL0705            -1.   BAL0734             1.
+    SH070834  COST            286.67   TRAN0708            1.
+    SH070834  BAL0783            -1.   BAL0734             1.
+    SH070135  COST            502.49   TRAN0701            1.
+    SH070135  BAL0701            -1.   BAL0735             1.
+    SH070235  COST            485.05   TRAN0702            1.
+    SH070235  BAL0702            -1.   BAL0735             1.
+    SH070335  COST            410.93   TRAN0703            1.
+    SH070335  BAL0703            -1.   BAL0735             1.
+    SH070435  COST            132.98   TRAN0704            1.
+    SH070435  BAL0704            -1.   BAL0735             1.
+    SH070535  COST            469.79   TRAN0705            1.
+    SH070535  BAL0705            -1.   BAL0735             1.
+    SH070835  COST            256.15   TRAN0708            1.
+    SH070835  BAL0783            -1.   BAL0735             1.
+    SH070136  COST            223.45   TRAN0701            1.
+    SH070136  BAL0701            -1.   BAL0736             1.
+    SH070236  COST            488.32   TRAN0702            1.
+    SH070236  BAL0702            -1.   BAL0736             1.
+    SH070336  COST            115.54   TRAN0703            1.
+    SH070336  BAL0703            -1.   BAL0736             1.
+    SH070436  COST             403.3   TRAN0704            1.
+    SH070436  BAL0704            -1.   BAL0736             1.
+    SH070536  COST            377.14   TRAN0705            1.
+    SH070536  BAL0705            -1.   BAL0736             1.
+    SH070636  COST             119.9   TRAN0706            1.
+    SH070636  BAL0752            -1.   BAL0736             1.
+    SH070836  COST            349.89   TRAN0708            1.
+    SH070836  BAL0783            -1.   BAL0736             1.
+    SH070137  COST            100.28   TRAN0701            1.
+    SH070137  BAL0701            -1.   BAL0737             1.
+    SH070237  COST            372.78   TRAN0702            1.
+    SH070237  BAL0702            -1.   BAL0737             1.
+    SH070337  COST            172.22   TRAN0703            1.
+    SH070337  BAL0703            -1.   BAL0737             1.
+    SH070437  COST            331.36   TRAN0704            1.
+    SH070437  BAL0704            -1.   BAL0737             1.
+    SH070537  COST            198.38   TRAN0705            1.
+    SH070537  BAL0705            -1.   BAL0737             1.
+    SH070637  COST            211.46   TRAN0706            1.
+    SH070637  BAL0752            -1.   BAL0737             1.
+    SH070837  COST            274.68   TRAN0708            1.
+    SH070837  BAL0783            -1.   BAL0737             1.
+    SH070138  COST            148.24   TRAN0701            1.
+    SH070138  BAL0701            -1.   BAL0738             1.
+    SH070238  COST            265.96   TRAN0702            1.
+    SH070238  BAL0702            -1.   BAL0738             1.
+    SH070338  COST            103.55   TRAN0703            1.
+    SH070338  BAL0703            -1.   BAL0738             1.
+    SH070438  COST            335.72   TRAN0704            1.
+    SH070438  BAL0704            -1.   BAL0738             1.
+    SH070538  COST            303.02   TRAN0705            1.
+    SH070538  BAL0705            -1.   BAL0738             1.
+    SH070638  COST             42.51   TRAN0706            1.
+    SH070638  BAL0752            -1.   BAL0738             1.
+    SH070738  COST            235.44   TRAN0707            1.
+    SH070738  BAL0764            -1.   BAL0738             1.
+    SH070838  COST            258.33   TRAN0708            1.
+    SH070838  BAL0783            -1.   BAL0738             1.
+    SH070139  COST             141.7   TRAN0701            1.
+    SH070139  BAL0701            -1.   BAL0739             1.
+    SH070239  COST            369.51   TRAN0702            1.
+    SH070239  BAL0702            -1.   BAL0739             1.
+    SH070339  COST             174.4   TRAN0703            1.
+    SH070339  BAL0703            -1.   BAL0739             1.
+    SH070439  COST            271.41   TRAN0704            1.
+    SH070439  BAL0704            -1.   BAL0739             1.
+    SH070539  COST            467.61   TRAN0705            1.
+    SH070539  BAL0705            -1.   BAL0739             1.
+    SH070639  COST            222.36   TRAN0706            1.
+    SH070639  BAL0752            -1.   BAL0739             1.
+    SH070839  COST            183.12   TRAN0708            1.
+    SH070839  BAL0783            -1.   BAL0739             1.
+    SH070140  COST            179.85   TRAN0701            1.
+    SH070140  BAL0701            -1.   BAL0740             1.
+    SH070240  COST            412.02   TRAN0702            1.
+    SH070240  BAL0702            -1.   BAL0740             1.
+    SH070340  COST            112.27   TRAN0703            1.
+    SH070340  BAL0703            -1.   BAL0740             1.
+    SH070440  COST            323.73   TRAN0704            1.
+    SH070440  BAL0704            -1.   BAL0740             1.
+    SH070540  COST            240.89   TRAN0705            1.
+    SH070540  BAL0705            -1.   BAL0740             1.
+    SH070640  COST            142.79   TRAN0706            1.
+    SH070640  BAL0752            -1.   BAL0740             1.
+    SH070840  COST            298.66   TRAN0708            1.
+    SH070840  BAL0783            -1.   BAL0740             1.
+    SH070141  COST            213.64   TRAN0701            1.
+    SH070141  BAL0701            -1.   BAL0741             1.
+    SH070241  COST              327.   TRAN0702            1.
+    SH070241  BAL0702            -1.   BAL0741             1.
+    SH070341  COST             163.5   TRAN0703            1.
+    SH070341  BAL0703            -1.   BAL0741             1.
+    SH070441  COST            353.16   TRAN0704            1.
+    SH070441  BAL0704            -1.   BAL0741             1.
+    SH070541  COST            401.12   TRAN0705            1.
+    SH070541  BAL0705            -1.   BAL0741             1.
+    SH070641  COST              109.   TRAN0706            1.
+    SH070641  BAL0752            -1.   BAL0741             1.
+    SH070841  COST            325.91   TRAN0708            1.
+    SH070841  BAL0783            -1.   BAL0741             1.
+    SH070142  COST              98.1   TRAN0701            1.
+    SH070142  BAL0701            -1.   BAL0742             1.
+    SH070242  COST            451.26   TRAN0702            1.
+    SH070242  BAL0702            -1.   BAL0742             1.
+    SH070342  COST             174.4   TRAN0703            1.
+    SH070342  BAL0703            -1.   BAL0742             1.
+    SH070442  COST            212.55   TRAN0704            1.
+    SH070442  BAL0704            -1.   BAL0742             1.
+    SH070542  COST            393.49   TRAN0705            1.
+    SH070542  BAL0705            -1.   BAL0742             1.
+    SH070642  COST            175.49   TRAN0706            1.
+    SH070642  BAL0752            -1.   BAL0742             1.
+    SH070842  COST            165.68   TRAN0708            1.
+    SH070842  BAL0783            -1.   BAL0742             1.
+    SH070143  COST            173.31   TRAN0701            1.
+    SH070143  BAL0701            -1.   BAL0743             1.
+    SH070243  COST            430.55   TRAN0702            1.
+    SH070243  BAL0702            -1.   BAL0743             1.
+    SH070343  COST             27.25   TRAN0703            1.
+    SH070343  BAL0703            -1.   BAL0743             1.
+    SH070443  COST            322.64   TRAN0704            1.
+    SH070443  BAL0704            -1.   BAL0743             1.
+    SH070543  COST            281.22   TRAN0705            1.
+    SH070543  BAL0705            -1.   BAL0743             1.
+    SH070643  COST              109.   TRAN0706            1.
+    SH070643  BAL0752            -1.   BAL0743             1.
+    SH070743  COST            262.69   TRAN0707            1.
+    SH070743  BAL0764            -1.   BAL0743             1.
+    SH070843  COST            295.39   TRAN0708            1.
+    SH070843  BAL0783            -1.   BAL0743             1.
+    SH070144  COST            173.31   TRAN0701            1.
+    SH070144  BAL0701            -1.   BAL0744             1.
+    SH070244  COST            413.11   TRAN0702            1.
+    SH070244  BAL0702            -1.   BAL0744             1.
+    SH070344  COST            139.52   TRAN0703            1.
+    SH070344  BAL0703            -1.   BAL0744             1.
+    SH070444  COST            340.08   TRAN0704            1.
+    SH070444  BAL0704            -1.   BAL0744             1.
+    SH070544  COST             337.9   TRAN0705            1.
+    SH070544  BAL0705            -1.   BAL0744             1.
+    SH070644  COST             97.01   TRAN0706            1.
+    SH070644  BAL0752            -1.   BAL0744             1.
+    SH070844  COST            324.82   TRAN0708            1.
+    SH070844  BAL0783            -1.   BAL0744             1.
+    SH070145  COST            187.48   TRAN0701            1.
+    SH070145  BAL0701            -1.   BAL0745             1.
+    SH070245  COST            475.24   TRAN0702            1.
+    SH070245  BAL0702            -1.   BAL0745             1.
+    SH070345  COST            175.49   TRAN0703            1.
+    SH070345  BAL0703            -1.   BAL0745             1.
+    SH070445  COST            318.28   TRAN0704            1.
+    SH070445  BAL0704            -1.   BAL0745             1.
+    SH070545  COST            255.06   TRAN0705            1.
+    SH070545  BAL0705            -1.   BAL0745             1.
+    SH070645  COST            208.19   TRAN0706            1.
+    SH070645  BAL0752            -1.   BAL0745             1.
+    SH070745  COST            214.73   TRAN0707            1.
+    SH070745  BAL0764            -1.   BAL0745             1.
+    SH070845  COST            332.45   TRAN0708            1.
+    SH070845  BAL0783            -1.   BAL0745             1.
+    SH070146  COST            267.05   TRAN0701            1.
+    SH070146  BAL0701            -1.   BAL0746             1.
+    SH070246  COST            297.57   TRAN0702            1.
+    SH070246  BAL0702            -1.   BAL0746             1.
+    SH070346  COST            240.89   TRAN0703            1.
+    SH070346  BAL0703            -1.   BAL0746             1.
+    SH070446  COST            487.23   TRAN0704            1.
+    SH070446  BAL0704            -1.   BAL0746             1.
+    SH070546  COST             468.7   TRAN0705            1.
+    SH070546  BAL0705            -1.   BAL0746             1.
+    SH070646  COST            280.13   TRAN0706            1.
+    SH070646  BAL0752            -1.   BAL0746             1.
+    SH070846  COST            488.32   TRAN0708            1.
+    SH070846  BAL0783            -1.   BAL0746             1.
+    SH070147  COST             119.9   TRAN0701            1.
+    SH070147  BAL0701            -1.   BAL0747             1.
+    SH070247  COST            406.57   TRAN0702            1.
+    SH070247  BAL0702            -1.   BAL0747             1.
+    SH070347  COST            173.31   TRAN0703            1.
+    SH070347  BAL0703            -1.   BAL0747             1.
+    SH070447  COST            298.66   TRAN0704            1.
+    SH070447  BAL0704            -1.   BAL0747             1.
+    SH070547  COST            253.97   TRAN0705            1.
+    SH070547  BAL0705            -1.   BAL0747             1.
+    SH070647  COST            158.05   TRAN0706            1.
+    SH070647  BAL0752            -1.   BAL0747             1.
+    SH070847  COST            265.96   TRAN0708            1.
+    SH070847  BAL0783            -1.   BAL0747             1.
+    SH070148  COST            103.55   TRAN0701            1.
+    SH070148  BAL0701            -1.   BAL0748             1.
+    SH070248  COST            369.51   TRAN0702            1.
+    SH070248  BAL0702            -1.   BAL0748             1.
+    SH070348  COST            149.33   TRAN0703            1.
+    SH070348  BAL0703            -1.   BAL0748             1.
+    SH070448  COST             250.7   TRAN0704            1.
+    SH070448  BAL0704            -1.   BAL0748             1.
+    SH070548  COST            269.23   TRAN0705            1.
+    SH070548  BAL0705            -1.   BAL0748             1.
+    SH070648  COST            125.35   TRAN0706            1.
+    SH070648  BAL0752            -1.   BAL0748             1.
+    SH070848  COST            212.55   TRAN0708            1.
+    SH070848  BAL0783            -1.   BAL0748             1.
+    SH070149  COST            358.61   TRAN0701            1.
+    SH070149  BAL0701            -1.   BAL0749             1.
+    SH070249  COST            583.15   TRAN0702            1.
+    SH070249  BAL0702            -1.   BAL0749             1.
+    SH070349  COST            361.88   TRAN0703            1.
+    SH070349  BAL0703            -1.   BAL0749             1.
+    SH070449  COST            415.29   TRAN0704            1.
+    SH070449  BAL0704            -1.   BAL0749             1.
+    SH070549  COST            165.68   TRAN0705            1.
+    SH070549  BAL0705            -1.   BAL0749             1.
+    SH070649  COST            368.42   TRAN0706            1.
+    SH070649  BAL0752            -1.   BAL0749             1.
+    SH070749  COST            146.06   TRAN0707            1.
+    SH070749  BAL0764            -1.   BAL0749             1.
+    SH070849  COST            444.72   TRAN0708            1.
+    SH070849  BAL0783            -1.   BAL0749             1.
+    SH070150  COST            262.69   TRAN0701            1.
+    SH070150  BAL0701            -1.   BAL0750             1.
+    SH070250  COST            667.08   TRAN0702            1.
+    SH070250  BAL0702            -1.   BAL0750             1.
+    SH070350  COST            268.14   TRAN0703            1.
+    SH070350  BAL0703            -1.   BAL0750             1.
+    SH070450  COST            397.85   TRAN0704            1.
+    SH070450  BAL0704            -1.   BAL0750             1.
+    SH070550  COST            256.15   TRAN0705            1.
+    SH070550  BAL0705            -1.   BAL0750             1.
+    SH070750  COST            149.33   TRAN0707            1.
+    SH070750  BAL0764            -1.   BAL0750             1.
+    SH070850  COST            442.54   TRAN0708            1.
+    SH070850  BAL0783            -1.   BAL0750             1.
+    SH070151  COST            361.88   TRAN0701            1.
+    SH070151  BAL0701            -1.   BAL0751             1.
+    SH070251  COST             599.5   TRAN0702            1.
+    SH070251  BAL0702            -1.   BAL0751             1.
+    SH070351  COST            371.69   TRAN0703            1.
+    SH070351  BAL0703            -1.   BAL0751             1.
+    SH070451  COST            368.42   TRAN0704            1.
+    SH070451  BAL0704            -1.   BAL0751             1.
+    SH070551  COST            134.07   TRAN0705            1.
+    SH070551  BAL0705            -1.   BAL0751             1.
+    SH070751  COST            107.91   TRAN0707            1.
+    SH070751  BAL0764            -1.   BAL0751             1.
+    SH070851  COST            466.52   TRAN0708            1.
+    SH070851  BAL0783            -1.   BAL0751             1.
+    SH070152  COST            122.08   TRAN0701            1.
+    SH070152  BAL0701            -1.   BAL0752             1.
+    SH070252  COST              327.   TRAN0702            1.
+    SH070252  BAL0702            -1.   BAL0752             1.
+    SH070352  COST             89.38   TRAN0703            1.
+    SH070352  BAL0703            -1.   BAL0752             1.
+    SH070452  COST            350.98   TRAN0704            1.
+    SH070452  BAL0704            -1.   BAL0752             1.
+    SH070552  COST            321.55   TRAN0705            1.
+    SH070552  BAL0705            -1.   BAL0752             1.
+    SH070852  COST            275.77   TRAN0708            1.
+    SH070852  BAL0783            -1.   BAL0752             1.
+    SH070153  COST            391.31   TRAN0701            1.
+    SH070153  BAL0701            -1.   BAL0753             1.
+    SH070253  COST            693.24   TRAN0702            1.
+    SH070253  BAL0702            -1.   BAL0753             1.
+    SH070353  COST            354.25   TRAN0703            1.
+    SH070353  BAL0703            -1.   BAL0753             1.
+    SH070453  COST            449.08   TRAN0704            1.
+    SH070453  BAL0704            -1.   BAL0753             1.
+    SH070553  COST            200.56   TRAN0705            1.
+    SH070553  BAL0705            -1.   BAL0753             1.
+    SH070653  COST            391.31   TRAN0706            1.
+    SH070653  BAL0752            -1.   BAL0753             1.
+    SH070753  COST            159.14   TRAN0707            1.
+    SH070753  BAL0764            -1.   BAL0753             1.
+    SH070853  COST            439.27   TRAN0708            1.
+    SH070853  BAL0783            -1.   BAL0753             1.
+    SH070154  COST            201.65   TRAN0701            1.
+    SH070154  BAL0701            -1.   BAL0754             1.
+    SH070254  COST            485.05   TRAN0702            1.
+    SH070254  BAL0702            -1.   BAL0754             1.
+    SH070354  COST            236.53   TRAN0703            1.
+    SH070354  BAL0703            -1.   BAL0754             1.
+    SH070454  COST            373.87   TRAN0704            1.
+    SH070454  BAL0704            -1.   BAL0754             1.
+    SH070554  COST            232.17   TRAN0705            1.
+    SH070554  BAL0705            -1.   BAL0754             1.
+    SH070654  COST            221.27   TRAN0706            1.
+    SH070654  BAL0752            -1.   BAL0754             1.
+    SH070854  COST            438.18   TRAN0708            1.
+    SH070854  BAL0783            -1.   BAL0754             1.
+    SH070155  COST            303.02   TRAN0701            1.
+    SH070155  BAL0701            -1.   BAL0755             1.
+    SH070255  COST            522.11   TRAN0702            1.
+    SH070255  BAL0702            -1.   BAL0755             1.
+    SH070355  COST            306.29   TRAN0703            1.
+    SH070355  BAL0703            -1.   BAL0755             1.
+    SH070455  COST            320.46   TRAN0704            1.
+    SH070455  BAL0704            -1.   BAL0755             1.
+    SH070555  COST            167.86   TRAN0705            1.
+    SH070555  BAL0705            -1.   BAL0755             1.
+    SH070655  COST             316.1   TRAN0706            1.
+    SH070655  BAL0752            -1.   BAL0755             1.
+    SH070755  COST            116.63   TRAN0707            1.
+    SH070755  BAL0764            -1.   BAL0755             1.
+    SH070855  COST            320.46   TRAN0708            1.
+    SH070855  BAL0783            -1.   BAL0755             1.
+    SH070156  COST             425.1   TRAN0701            1.
+    SH070156  BAL0701            -1.   BAL0756             1.
+    SH070256  COST            631.11   TRAN0702            1.
+    SH070256  BAL0702            -1.   BAL0756             1.
+    SH070356  COST            332.45   TRAN0703            1.
+    SH070356  BAL0703            -1.   BAL0756             1.
+    SH070456  COST            397.85   TRAN0704            1.
+    SH070456  BAL0704            -1.   BAL0756             1.
+    SH070556  COST            148.24   TRAN0705            1.
+    SH070556  BAL0705            -1.   BAL0756             1.
+    SH070656  COST            369.51   TRAN0706            1.
+    SH070656  BAL0752            -1.   BAL0756             1.
+    SH070756  COST            132.98   TRAN0707            1.
+    SH070756  BAL0764            -1.   BAL0756             1.
+    SH070856  COST            389.13   TRAN0708            1.
+    SH070856  BAL0783            -1.   BAL0756             1.
+    SH070157  COST            284.49   TRAN0701            1.
+    SH070157  BAL0701            -1.   BAL0757             1.
+    SH070257  COST             566.8   TRAN0702            1.
+    SH070257  BAL0702            -1.   BAL0757             1.
+    SH070357  COST             316.1   TRAN0703            1.
+    SH070357  BAL0703            -1.   BAL0757             1.
+    SH070457  COST            255.06   TRAN0704            1.
+    SH070457  BAL0704            -1.   BAL0757             1.
+    SH070557  COST            183.12   TRAN0705            1.
+    SH070557  BAL0705            -1.   BAL0757             1.
+    SH070657  COST            347.71   TRAN0706            1.
+    SH070657  BAL0752            -1.   BAL0757             1.
+    SH070757  COST            161.32   TRAN0707            1.
+    SH070757  BAL0764            -1.   BAL0757             1.
+    SH070857  COST            251.79   TRAN0708            1.
+    SH070857  BAL0783            -1.   BAL0757             1.
+    SH070158  COST            320.46   TRAN0701            1.
+    SH070158  BAL0701            -1.   BAL0758             1.
+    SH070258  COST            567.89   TRAN0702            1.
+    SH070258  BAL0702            -1.   BAL0758             1.
+    SH070358  COST            303.02   TRAN0703            1.
+    SH070358  BAL0703            -1.   BAL0758             1.
+    SH070458  COST            373.87   TRAN0704            1.
+    SH070458  BAL0704            -1.   BAL0758             1.
+    SH070558  COST             22.89   TRAN0705            1.
+    SH070558  BAL0705            -1.   BAL0758             1.
+    SH070658  COST            355.34   TRAN0706            1.
+    SH070658  BAL0752            -1.   BAL0758             1.
+    SH070758  COST             74.12   TRAN0707            1.
+    SH070758  BAL0764            -1.   BAL0758             1.
+    SH070858  COST            276.86   TRAN0708            1.
+    SH070858  BAL0783            -1.   BAL0758             1.
+    SH070159  COST            224.54   TRAN0701            1.
+    SH070159  BAL0701            -1.   BAL0759             1.
+    SH070259  COST            542.82   TRAN0702            1.
+    SH070259  BAL0702            -1.   BAL0759             1.
+    SH070359  COST            259.42   TRAN0703            1.
+    SH070359  BAL0703            -1.   BAL0759             1.
+    SH070459  COST            265.96   TRAN0704            1.
+    SH070459  BAL0704            -1.   BAL0759             1.
+    SH070559  COST            173.31   TRAN0705            1.
+    SH070559  BAL0705            -1.   BAL0759             1.
+    SH070659  COST            323.73   TRAN0706            1.
+    SH070659  BAL0752            -1.   BAL0759             1.
+    SH070759  COST            114.45   TRAN0707            1.
+    SH070759  BAL0764            -1.   BAL0759             1.
+    SH070859  COST            277.95   TRAN0708            1.
+    SH070859  BAL0783            -1.   BAL0759             1.
+    SH070160  COST            284.49   TRAN0701            1.
+    SH070160  BAL0701            -1.   BAL0760             1.
+    SH070260  COST             599.5   TRAN0702            1.
+    SH070260  BAL0702            -1.   BAL0760             1.
+    SH070360  COST            308.47   TRAN0703            1.
+    SH070360  BAL0703            -1.   BAL0760             1.
+    SH070460  COST            340.08   TRAN0704            1.
+    SH070460  BAL0704            -1.   BAL0760             1.
+    SH070560  COST            147.15   TRAN0705            1.
+    SH070560  BAL0705            -1.   BAL0760             1.
+    SH070660  COST            352.07   TRAN0706            1.
+    SH070660  BAL0752            -1.   BAL0760             1.
+    SH070760  COST             95.92   TRAN0707            1.
+    SH070760  BAL0764            -1.   BAL0760             1.
+    SH070860  COST            325.91   TRAN0708            1.
+    SH070860  BAL0783            -1.   BAL0760             1.
+    SH070163  COST            289.94   TRAN0701            1.
+    SH070163  BAL0701            -1.   BAL0763             1.
+    SH070263  COST            538.46   TRAN0702            1.
+    SH070263  BAL0702            -1.   BAL0763             1.
+    SH070363  COST            312.83   TRAN0703            1.
+    SH070363  BAL0703            -1.   BAL0763             1.
+    SH070463  COST            402.21   TRAN0704            1.
+    SH070463  BAL0704            -1.   BAL0763             1.
+    SH070563  COST            165.68   TRAN0705            1.
+    SH070563  BAL0705            -1.   BAL0763             1.
+    SH070663  COST            343.35   TRAN0706            1.
+    SH070663  BAL0752            -1.   BAL0763             1.
+    SH070763  COST            135.16   TRAN0707            1.
+    SH070763  BAL0764            -1.   BAL0763             1.
+    SH070863  COST              436.   TRAN0708            1.
+    SH070863  BAL0783            -1.   BAL0763             1.
+    SH070164  COST            216.91   TRAN0701            1.
+    SH070164  BAL0701            -1.   BAL0764             1.
+    SH070264  COST            573.34   TRAN0702            1.
+    SH070264  BAL0702            -1.   BAL0764             1.
+    SH070364  COST            243.07   TRAN0703            1.
+    SH070364  BAL0703            -1.   BAL0764             1.
+    SH070464  COST            366.24   TRAN0704            1.
+    SH070464  BAL0704            -1.   BAL0764             1.
+    SH070564  COST             63.22   TRAN0705            1.
+    SH070564  BAL0705            -1.   BAL0764             1.
+    SH070664  COST            345.53   TRAN0706            1.
+    SH070664  BAL0752            -1.   BAL0764             1.
+    SH070864  COST             272.5   TRAN0708            1.
+    SH070864  BAL0783            -1.   BAL0764             1.
+    SH070165  COST            470.88   TRAN0701            1.
+    SH070165  BAL0701            -1.   BAL0765             1.
+    SH070265  COST            334.63   TRAN0702            1.
+    SH070265  BAL0702            -1.   BAL0765             1.
+    SH070365  COST            550.45   TRAN0703            1.
+    SH070365  BAL0703            -1.   BAL0765             1.
+    SH070465  COST            422.92   TRAN0704            1.
+    SH070465  BAL0704            -1.   BAL0765             1.
+    SH070565  COST            658.36   TRAN0705            1.
+    SH070565  BAL0705            -1.   BAL0765             1.
+    SH070865  COST            452.35   TRAN0708            1.
+    SH070865  BAL0783            -1.   BAL0765             1.
+    SH070166  COST             610.4   TRAN0701            1.
+    SH070166  BAL0701            -1.   BAL0766             1.
+    SH070266  COST            282.31   TRAN0702            1.
+    SH070266  BAL0702            -1.   BAL0766             1.
+    SH070366  COST            630.02   TRAN0703            1.
+    SH070366  BAL0703            -1.   BAL0766             1.
+    SH070466  COST            606.04   TRAN0704            1.
+    SH070466  BAL0704            -1.   BAL0766             1.
+    SH070566  COST             773.9   TRAN0705            1.
+    SH070566  BAL0705            -1.   BAL0766             1.
+    SH070866  COST             610.4   TRAN0708            1.
+    SH070866  BAL0783            -1.   BAL0766             1.
+    SH070167  COST            463.25   TRAN0701            1.
+    SH070167  BAL0701            -1.   BAL0767             1.
+    SH070267  COST            252.88   TRAN0702            1.
+    SH070267  BAL0702            -1.   BAL0767             1.
+    SH070367  COST            537.37   TRAN0703            1.
+    SH070367  BAL0703            -1.   BAL0767             1.
+    SH070467  COST            498.13   TRAN0704            1.
+    SH070467  BAL0704            -1.   BAL0767             1.
+    SH070567  COST            658.36   TRAN0705            1.
+    SH070567  BAL0705            -1.   BAL0767             1.
+    SH070867  COST            499.22   TRAN0708            1.
+    SH070867  BAL0783            -1.   BAL0767             1.
+    SH070168  COST            647.46   TRAN0701            1.
+    SH070168  BAL0701            -1.   BAL0768             1.
+    SH070268  COST              436.   TRAN0702            1.
+    SH070268  BAL0702            -1.   BAL0768             1.
+    SH070368  COST             610.4   TRAN0703            1.
+    SH070368  BAL0703            -1.   BAL0768             1.
+    SH070468  COST            765.18   TRAN0704            1.
+    SH070468  BAL0704            -1.   BAL0768             1.
+    SH070568  COST           1031.14   TRAN0705            1.
+    SH070568  BAL0705            -1.   BAL0768             1.
+    SH070868  COST            818.59   TRAN0708            1.
+    SH070868  BAL0783            -1.   BAL0768             1.
+    SH070169  COST            587.51   TRAN0701            1.
+    SH070169  BAL0701            -1.   BAL0769             1.
+    SH070269  COST            240.89   TRAN0702            1.
+    SH070269  BAL0702            -1.   BAL0769             1.
+    SH070369  COST             555.9   TRAN0703            1.
+    SH070369  BAL0703            -1.   BAL0769             1.
+    SH070469  COST            677.98   TRAN0704            1.
+    SH070469  BAL0704            -1.   BAL0769             1.
+    SH070569  COST            704.14   TRAN0705            1.
+    SH070569  BAL0705            -1.   BAL0769             1.
+    SH070869  COST            717.22   TRAN0708            1.
+    SH070869  BAL0783            -1.   BAL0769             1.
+    SH070171  COST             479.6   TRAN0701            1.
+    SH070171  BAL0701            -1.   BAL0771             1.
+    SH070371  COST            571.16   TRAN0703            1.
+    SH070371  BAL0703            -1.   BAL0771             1.
+    SH070471  COST            567.89   TRAN0704            1.
+    SH070471  BAL0704            -1.   BAL0771             1.
+    SH070571  COST            633.29   TRAN0705            1.
+    SH070571  BAL0705            -1.   BAL0771             1.
+    SH070671  COST            426.19   TRAN0706            1.
+    SH070671  BAL0752            -1.   BAL0771             1.
+    SH070771  COST            767.36   TRAN0707            1.
+    SH070771  BAL0764            -1.   BAL0771             1.
+    SH070871  COST            580.97   TRAN0708            1.
+    SH070871  BAL0783            -1.   BAL0771             1.
+    SH070172  COST            639.83   TRAN0701            1.
+    SH070172  BAL0701            -1.   BAL0772             1.
+    SH070272  COST            591.87   TRAN0702            1.
+    SH070272  BAL0702            -1.   BAL0772             1.
+    SH070372  COST            672.53   TRAN0703            1.
+    SH070372  BAL0703            -1.   BAL0772             1.
+    SH070472  COST             621.3   TRAN0704            1.
+    SH070472  BAL0704            -1.   BAL0772             1.
+    SH070572  COST            831.67   TRAN0705            1.
+    SH070572  BAL0705            -1.   BAL0772             1.
+    SH070872  COST             621.3   TRAN0708            1.
+    SH070872  BAL0783            -1.   BAL0772             1.
+    SH070173  COST             425.1   TRAN0701            1.
+    SH070173  BAL0701            -1.   BAL0773             1.
+    SH070273  COST            397.85   TRAN0702            1.
+    SH070273  BAL0702            -1.   BAL0773             1.
+    SH070373  COST            368.42   TRAN0703            1.
+    SH070373  BAL0703            -1.   BAL0773             1.
+    SH070473  COST            498.13   TRAN0704            1.
+    SH070473  BAL0704            -1.   BAL0773             1.
+    SH070573  COST            614.76   TRAN0705            1.
+    SH070573  BAL0705            -1.   BAL0773             1.
+    SH070673  COST            332.45   TRAN0706            1.
+    SH070673  BAL0752            -1.   BAL0773             1.
+    SH070873  COST            549.36   TRAN0708            1.
+    SH070873  BAL0783            -1.   BAL0773             1.
+    SH070174  COST            597.32   TRAN0701            1.
+    SH070174  BAL0701            -1.   BAL0774             1.
+    SH070274  COST             228.9   TRAN0702            1.
+    SH070274  BAL0702            -1.   BAL0774             1.
+    SH070374  COST             621.3   TRAN0703            1.
+    SH070374  BAL0703            -1.   BAL0774             1.
+    SH070474  COST            694.33   TRAN0704            1.
+    SH070474  BAL0704            -1.   BAL0774             1.
+    SH070574  COST            798.97   TRAN0705            1.
+    SH070574  BAL0705            -1.   BAL0774             1.
+    SH070874  COST            674.71   TRAN0708            1.
+    SH070874  BAL0783            -1.   BAL0774             1.
+    SH070275  COST            603.86   TRAN0702            1.
+    SH070275  BAL0702            -1.   BAL0775             1.
+    SH070176  COST            503.58   TRAN0701            1.
+    SH070176  BAL0701            -1.   BAL0776             1.
+    SH070276  COST            437.09   TRAN0702            1.
+    SH070276  BAL0702            -1.   BAL0776             1.
+    SH070376  COST            439.27   TRAN0703            1.
+    SH070376  BAL0703            -1.   BAL0776             1.
+    SH070476  COST             686.7   TRAN0704            1.
+    SH070476  BAL0704            -1.   BAL0776             1.
+    SH070576  COST             686.7   TRAN0705            1.
+    SH070576  BAL0705            -1.   BAL0776             1.
+    SH070676  COST            415.29   TRAN0706            1.
+    SH070676  BAL0752            -1.   BAL0776             1.
+    SH070876  COST            846.93   TRAN0708            1.
+    SH070876  BAL0783            -1.   BAL0776             1.
+    SH070177  COST            474.15   TRAN0701            1.
+    SH070177  BAL0701            -1.   BAL0777             1.
+    SH070277  COST            296.48   TRAN0702            1.
+    SH070277  BAL0702            -1.   BAL0777             1.
+    SH070377  COST            502.49   TRAN0703            1.
+    SH070377  BAL0703            -1.   BAL0777             1.
+    SH070477  COST            437.09   TRAN0704            1.
+    SH070477  BAL0704            -1.   BAL0777             1.
+    SH070577  COST             610.4   TRAN0705            1.
+    SH070577  BAL0705            -1.   BAL0777             1.
+    SH070877  COST             348.8   TRAN0708            1.
+    SH070877  BAL0783            -1.   BAL0777             1.
+    SH070178  COST            829.49   TRAN0701            1.
+    SH070178  BAL0701            -1.   BAL0778             1.
+    SH070278  COST            481.78   TRAN0702            1.
+    SH070278  BAL0702            -1.   BAL0778             1.
+    SH070378  COST            853.47   TRAN0703            1.
+    SH070378  BAL0703            -1.   BAL0778             1.
+    SH070478  COST            746.65   TRAN0704            1.
+    SH070478  BAL0704            -1.   BAL0778             1.
+    SH070578  COST            958.11   TRAN0705            1.
+    SH070578  BAL0705            -1.   BAL0778             1.
+    SH070878  COST            834.94   TRAN0708            1.
+    SH070878  BAL0783            -1.   BAL0778             1.
+    SH070179  COST            779.35   TRAN0701            1.
+    SH070179  BAL0701            -1.   BAL0779             1.
+    SH070279  COST            293.21   TRAN0702            1.
+    SH070279  BAL0702            -1.   BAL0779             1.
+    SH070379  COST            753.19   TRAN0703            1.
+    SH070379  BAL0703            -1.   BAL0779             1.
+    SH070479  COST             784.8   TRAN0704            1.
+    SH070479  BAL0704            -1.   BAL0779             1.
+    SH070879  COST            769.54   TRAN0708            1.
+    SH070879  BAL0783            -1.   BAL0779             1.
+    SH070180  COST            345.53   TRAN0701            1.
+    SH070180  BAL0701            -1.   BAL0780             1.
+    SH070280  COST            430.55   TRAN0702            1.
+    SH070280  BAL0702            -1.   BAL0780             1.
+    SH070380  COST            476.33   TRAN0703            1.
+    SH070380  BAL0703            -1.   BAL0780             1.
+    SH070480  COST            407.66   TRAN0704            1.
+    SH070480  BAL0704            -1.   BAL0780             1.
+    SH070580  COST            550.45   TRAN0705            1.
+    SH070580  BAL0705            -1.   BAL0780             1.
+    SH070880  COST             261.6   TRAN0708            1.
+    SH070880  BAL0783            -1.   BAL0780             1.
+    SH070182  COST            634.38   TRAN0701            1.
+    SH070182  BAL0701            -1.   BAL0782             1.
+    SH070282  COST            358.61   TRAN0702            1.
+    SH070282  BAL0702            -1.   BAL0782             1.
+    SH070382  COST            713.95   TRAN0703            1.
+    SH070382  BAL0703            -1.   BAL0782             1.
+    SH070482  COST            769.54   TRAN0704            1.
+    SH070482  BAL0704            -1.   BAL0782             1.
+    SH070582  COST           1250.23   TRAN0705            1.
+    SH070582  BAL0705            -1.   BAL0782             1.
+    SH070882  COST            853.47   TRAN0708            1.
+    SH070882  BAL0783            -1.   BAL0782             1.
+    SH070183  COST            192.93   TRAN0701            1.
+    SH070183  BAL0701            -1.   BAL0783             1.
+    SH070283  COST             566.8   TRAN0702            1.
+    SH070283  BAL0702            -1.   BAL0783             1.
+    SH070383  COST            296.48   TRAN0703            1.
+    SH070383  BAL0703            -1.   BAL0783             1.
+    SH070483  COST             64.31   TRAN0704            1.
+    SH070483  BAL0704            -1.   BAL0783             1.
+    SH070583  COST            378.23   TRAN0705            1.
+    SH070583  BAL0705            -1.   BAL0783             1.
+    SH070683  COST            270.32   TRAN0706            1.
+    SH070683  BAL0752            -1.   BAL0783             1.
+    SH070184  COST            331.36   TRAN0701            1.
+    SH070184  BAL0701            -1.   BAL0784             1.
+    SH070284  COST            209.28   TRAN0702            1.
+    SH070284  BAL0702            -1.   BAL0784             1.
+    SH070384  COST            396.76   TRAN0703            1.
+    SH070384  BAL0703            -1.   BAL0784             1.
+    SH070484  COST             403.3   TRAN0704            1.
+    SH070484  BAL0704            -1.   BAL0784             1.
+    SH070584  COST             534.1   TRAN0705            1.
+    SH070584  BAL0705            -1.   BAL0784             1.
+    SH070684  COST            332.45   TRAN0706            1.
+    SH070684  BAL0752            -1.   BAL0784             1.
+    SH070884  COST            422.92   TRAN0708            1.
+    SH070884  BAL0783            -1.   BAL0784             1.
+    SH080201  COST            513.81   TRAN0802            1.
+    SH080201  BAL0802            -1.   BAL0801             1.
+    SH080301  COST            197.22   TRAN0803            1.
+    SH080301  BAL0803            -1.   BAL0801             1.
+    SH080401  COST            359.84   TRAN0804            1.
+    SH080401  BAL0804            -1.   BAL0801             1.
+    SH080501  COST            410.01   TRAN0805            1.
+    SH080501  BAL0805            -1.   BAL0801             1.
+    SH080601  COST            217.98   TRAN0806            1.
+    SH080601  BAL0852            -1.   BAL0801             1.
+    SH080801  COST            247.39   TRAN0808            1.
+    SH080801  BAL0883            -1.   BAL0801             1.
+    SH080102  COST            820.02   TRAN0801            1.
+    SH080102  BAL0801            -1.   BAL0802             1.
+    SH080302  COST            721.41   TRAN0803            1.
+    SH080302  BAL0803            -1.   BAL0802             1.
+    SH080402  COST           1058.76   TRAN0804            1.
+    SH080402  BAL0804            -1.   BAL0802             1.
+    SH080502  COST           1281.93   TRAN0805            1.
+    SH080502  BAL0805            -1.   BAL0802             1.
+    SH080602  COST            653.94   TRAN0806            1.
+    SH080602  BAL0852            -1.   BAL0802             1.
+    SH080802  COST            901.33   TRAN0808            1.
+    SH080802  BAL0883            -1.   BAL0802             1.
+    SH080103  COST            423.85   TRAN0801            1.
+    SH080103  BAL0801            -1.   BAL0803             1.
+    SH080203  COST            820.02   TRAN0802            1.
+    SH080203  BAL0802            -1.   BAL0803             1.
+    SH080403  COST            634.91   TRAN0804            1.
+    SH080403  BAL0804            -1.   BAL0803             1.
+    SH080503  COST            491.32   TRAN0805            1.
+    SH080503  BAL0805            -1.   BAL0803             1.
+    SH080603  COST             155.7   TRAN0806            1.
+    SH080603  BAL0852            -1.   BAL0803             1.
+    SH080803  COST            441.15   TRAN0808            1.
+    SH080803  BAL0883            -1.   BAL0803             1.
+    SH080104  COST            301.02   TRAN0801            1.
+    SH080104  BAL0801            -1.   BAL0804             1.
+    SH080204  COST            870.19   TRAN0802            1.
+    SH080204  BAL0802            -1.   BAL0804             1.
+    SH080304  COST            420.39   TRAN0803            1.
+    SH080304  BAL0803            -1.   BAL0804             1.
+    SH080504  COST            551.87   TRAN0805            1.
+    SH080504  BAL0805            -1.   BAL0804             1.
+    SH080604  COST            423.85   TRAN0806            1.
+    SH080604  BAL0852            -1.   BAL0804             1.
+    SH080704  COST            465.37   TRAN0807            1.
+    SH080704  BAL0864            -1.   BAL0804             1.
+    SH080804  COST            100.34   TRAN0808            1.
+    SH080804  BAL0883            -1.   BAL0804             1.
+    SH080105  COST             467.1   TRAN0801            1.
+    SH080105  BAL0801            -1.   BAL0805             1.
+    SH080205  COST            892.68   TRAN0802            1.
+    SH080205  BAL0802            -1.   BAL0805             1.
+    SH080305  COST            491.32   TRAN0803            1.
+    SH080305  BAL0803            -1.   BAL0805             1.
+    SH080405  COST            493.05   TRAN0804            1.
+    SH080405  BAL0804            -1.   BAL0805             1.
+    SH080605  COST            563.98   TRAN0806            1.
+    SH080605  BAL0852            -1.   BAL0805             1.
+    SH080705  COST            577.82   TRAN0807            1.
+    SH080705  BAL0864            -1.   BAL0805             1.
+    SH080805  COST            468.83   TRAN0808            1.
+    SH080805  BAL0883            -1.   BAL0805             1.
+    SH080106  COST            344.27   TRAN0801            1.
+    SH080106  BAL0801            -1.   BAL0806             1.
+    SH080206  COST            721.41   TRAN0802            1.
+    SH080206  BAL0802            -1.   BAL0806             1.
+    SH080306  COST            368.49   TRAN0803            1.
+    SH080306  BAL0803            -1.   BAL0806             1.
+    SH080406  COST            378.87   TRAN0804            1.
+    SH080406  BAL0804            -1.   BAL0806             1.
+    SH080506  COST            435.96   TRAN0805            1.
+    SH080506  BAL0805            -1.   BAL0806             1.
+    SH080606  COST            356.38   TRAN0806            1.
+    SH080606  BAL0852            -1.   BAL0806             1.
+    SH080706  COST              346.   TRAN0807            1.
+    SH080706  BAL0864            -1.   BAL0806             1.
+    SH080806  COST            261.23   TRAN0808            1.
+    SH080806  BAL0883            -1.   BAL0806             1.
+    SH080107  COST             36.33   TRAN0801            1.
+    SH080107  BAL0801            -1.   BAL0807             1.
+    SH080207  COST            505.16   TRAN0802            1.
+    SH080207  BAL0802            -1.   BAL0807             1.
+    SH080307  COST            214.52   TRAN0803            1.
+    SH080307  BAL0803            -1.   BAL0807             1.
+    SH080407  COST            358.11   TRAN0804            1.
+    SH080407  BAL0804            -1.   BAL0807             1.
+    SH080507  COST            396.17   TRAN0805            1.
+    SH080507  BAL0805            -1.   BAL0807             1.
+    SH080607  COST            216.25   TRAN0806            1.
+    SH080607  BAL0852            -1.   BAL0807             1.
+    SH080707  COST            401.36   TRAN0807            1.
+    SH080707  BAL0864            -1.   BAL0807             1.
+    SH080807  COST            268.15   TRAN0808            1.
+    SH080807  BAL0883            -1.   BAL0807             1.
+    SH080108  COST            114.18   TRAN0801            1.
+    SH080108  BAL0801            -1.   BAL0808             1.
+    SH080208  COST            650.48   TRAN0802            1.
+    SH080208  BAL0802            -1.   BAL0808             1.
+    SH080308  COST            243.93   TRAN0803            1.
+    SH080308  BAL0803            -1.   BAL0808             1.
+    SH080408  COST            427.31   TRAN0804            1.
+    SH080408  BAL0804            -1.   BAL0808             1.
+    SH080508  COST            314.86   TRAN0805            1.
+    SH080508  BAL0805            -1.   BAL0808             1.
+    SH080608  COST            287.18   TRAN0806            1.
+    SH080608  BAL0852            -1.   BAL0808             1.
+    SH080808  COST            323.51   TRAN0808            1.
+    SH080808  BAL0883            -1.   BAL0808             1.
+    SH080109  COST            238.74   TRAN0801            1.
+    SH080109  BAL0801            -1.   BAL0809             1.
+    SH080209  COST            662.59   TRAN0802            1.
+    SH080209  BAL0802            -1.   BAL0809             1.
+    SH080309  COST            290.64   TRAN0803            1.
+    SH080309  BAL0803            -1.   BAL0809             1.
+    SH080409  COST            437.69   TRAN0804            1.
+    SH080409  BAL0804            -1.   BAL0809             1.
+    SH080509  COST            413.47   TRAN0805            1.
+    SH080509  BAL0805            -1.   BAL0809             1.
+    SH080709  COST            339.08   TRAN0807            1.
+    SH080709  BAL0864            -1.   BAL0809             1.
+    SH080809  COST            335.62   TRAN0808            1.
+    SH080809  BAL0883            -1.   BAL0809             1.
+    SH080110  COST            427.31   TRAN0801            1.
+    SH080110  BAL0801            -1.   BAL0810             1.
+    SH080210  COST            273.34   TRAN0802            1.
+    SH080210  BAL0802            -1.   BAL0810             1.
+    SH080310  COST             415.2   TRAN0803            1.
+    SH080310  BAL0803            -1.   BAL0810             1.
+    SH080410  COST            621.07   TRAN0804            1.
+    SH080410  BAL0804            -1.   BAL0810             1.
+    SH080510  COST            666.05   TRAN0805            1.
+    SH080510  BAL0805            -1.   BAL0810             1.
+    SH080610  COST            389.25   TRAN0806            1.
+    SH080610  BAL0852            -1.   BAL0810             1.
+    SH080810  COST            527.65   TRAN0808            1.
+    SH080810  BAL0883            -1.   BAL0810             1.
+    SH080111  COST            183.38   TRAN0801            1.
+    SH080111  BAL0801            -1.   BAL0811             1.
+    SH080211  COST            856.35   TRAN0802            1.
+    SH080211  BAL0802            -1.   BAL0811             1.
+    SH080311  COST            429.04   TRAN0803            1.
+    SH080311  BAL0803            -1.   BAL0811             1.
+    SH080411  COST            240.47   TRAN0804            1.
+    SH080411  BAL0804            -1.   BAL0811             1.
+    SH080511  COST            589.93   TRAN0805            1.
+    SH080511  BAL0805            -1.   BAL0811             1.
+    SH080611  COST            339.08   TRAN0806            1.
+    SH080611  BAL0852            -1.   BAL0811             1.
+    SH080811  COST            176.46   TRAN0808            1.
+    SH080811  BAL0883            -1.   BAL0811             1.
+    SH080112  COST            152.24   TRAN0801            1.
+    SH080112  BAL0801            -1.   BAL0812             1.
+    SH080212  COST            586.47   TRAN0802            1.
+    SH080212  BAL0802            -1.   BAL0812             1.
+    SH080312  COST            252.58   TRAN0803            1.
+    SH080312  BAL0803            -1.   BAL0812             1.
+    SH080412  COST              346.   TRAN0804            1.
+    SH080412  BAL0804            -1.   BAL0812             1.
+    SH080512  COST            461.91   TRAN0805            1.
+    SH080512  BAL0805            -1.   BAL0812             1.
+    SH080612  COST            250.85   TRAN0806            1.
+    SH080612  BAL0852            -1.   BAL0812             1.
+    SH080812  COST            252.58   TRAN0808            1.
+    SH080812  BAL0883            -1.   BAL0812             1.
+    SH080114  COST            245.66   TRAN0801            1.
+    SH080114  BAL0801            -1.   BAL0814             1.
+    SH080214  COST            712.76   TRAN0802            1.
+    SH080214  BAL0802            -1.   BAL0814             1.
+    SH080314  COST            339.08   TRAN0803            1.
+    SH080314  BAL0803            -1.   BAL0814             1.
+    SH080414  COST            344.27   TRAN0804            1.
+    SH080414  BAL0804            -1.   BAL0814             1.
+    SH080514  COST            608.96   TRAN0805            1.
+    SH080514  BAL0805            -1.   BAL0814             1.
+    SH080614  COST            325.24   TRAN0806            1.
+    SH080614  BAL0852            -1.   BAL0814             1.
+    SH080814  COST            217.98   TRAN0808            1.
+    SH080814  BAL0883            -1.   BAL0814             1.
+    SH080115  COST            524.19   TRAN0801            1.
+    SH080115  BAL0801            -1.   BAL0815             1.
+    SH080215  COST            275.07   TRAN0802            1.
+    SH080215  BAL0802            -1.   BAL0815             1.
+    SH080315  COST            404.82   TRAN0803            1.
+    SH080315  BAL0803            -1.   BAL0815             1.
+    SH080415  COST            823.48   TRAN0804            1.
+    SH080415  BAL0804            -1.   BAL0815             1.
+    SH080515  COST            688.54   TRAN0805            1.
+    SH080515  BAL0805            -1.   BAL0815             1.
+    SH080615  COST            325.24   TRAN0806            1.
+    SH080615  BAL0852            -1.   BAL0815             1.
+    SH080815  COST            645.29   TRAN0808            1.
+    SH080815  BAL0883            -1.   BAL0815             1.
+    SH080116  COST            273.34   TRAN0801            1.
+    SH080116  BAL0801            -1.   BAL0816             1.
+    SH080216  COST             484.4   TRAN0802            1.
+    SH080216  BAL0802            -1.   BAL0816             1.
+    SH080316  COST            392.71   TRAN0803            1.
+    SH080316  BAL0803            -1.   BAL0816             1.
+    SH080416  COST            496.51   TRAN0804            1.
+    SH080416  BAL0804            -1.   BAL0816             1.
+    SH080516  COST            551.87   TRAN0805            1.
+    SH080516  BAL0805            -1.   BAL0816             1.
+    SH080616  COST            226.63   TRAN0806            1.
+    SH080616  BAL0852            -1.   BAL0816             1.
+    SH080816  COST            354.65   TRAN0808            1.
+    SH080816  BAL0883            -1.   BAL0816             1.
+    SH080117  COST            261.23   TRAN0801            1.
+    SH080117  BAL0801            -1.   BAL0817             1.
+    SH080217  COST            873.65   TRAN0802            1.
+    SH080217  BAL0802            -1.   BAL0817             1.
+    SH080317  COST            474.02   TRAN0803            1.
+    SH080317  BAL0803            -1.   BAL0817             1.
+    SH080417  COST             98.61   TRAN0804            1.
+    SH080417  BAL0804            -1.   BAL0817             1.
+    SH080517  COST            515.54   TRAN0805            1.
+    SH080517  BAL0805            -1.   BAL0817             1.
+    SH080717  COST            510.35   TRAN0807            1.
+    SH080717  BAL0864            -1.   BAL0817             1.
+    SH080817  COST             46.71   TRAN0808            1.
+    SH080817  BAL0883            -1.   BAL0817             1.
+    SH080118  COST            302.75   TRAN0801            1.
+    SH080118  BAL0801            -1.   BAL0818             1.
+    SH080218  COST            624.53   TRAN0802            1.
+    SH080218  BAL0802            -1.   BAL0818             1.
+    SH080318  COST             467.1   TRAN0803            1.
+    SH080318  BAL0803            -1.   BAL0818             1.
+    SH080418  COST            266.42   TRAN0804            1.
+    SH080418  BAL0804            -1.   BAL0818             1.
+    SH080518  COST            704.11   TRAN0805            1.
+    SH080518  BAL0805            -1.   BAL0818             1.
+    SH080618  COST            608.96   TRAN0806            1.
+    SH080618  BAL0852            -1.   BAL0818             1.
+    SH080818  COST            178.19   TRAN0808            1.
+    SH080818  BAL0883            -1.   BAL0818             1.
+    SH080119  COST            429.04   TRAN0801            1.
+    SH080119  BAL0801            -1.   BAL0819             1.
+    SH080219  COST           1188.51   TRAN0802            1.
+    SH080219  BAL0802            -1.   BAL0819             1.
+    SH080319  COST            548.41   TRAN0803            1.
+    SH080319  BAL0803            -1.   BAL0819             1.
+    SH080419  COST            275.07   TRAN0804            1.
+    SH080419  BAL0804            -1.   BAL0819             1.
+    SH080519  COST            359.84   TRAN0805            1.
+    SH080519  BAL0805            -1.   BAL0819             1.
+    SH080619  COST            596.85   TRAN0806            1.
+    SH080619  BAL0852            -1.   BAL0819             1.
+    SH080819  COST            171.27   TRAN0808            1.
+    SH080819  BAL0883            -1.   BAL0819             1.
+    SH080120  COST            354.65   TRAN0801            1.
+    SH080120  BAL0801            -1.   BAL0820             1.
+    SH080220  COST           1181.59   TRAN0802            1.
+    SH080220  BAL0802            -1.   BAL0820             1.
+    SH080320  COST            513.81   TRAN0803            1.
+    SH080320  BAL0803            -1.   BAL0820             1.
+    SH080420  COST            195.49   TRAN0804            1.
+    SH080420  BAL0804            -1.   BAL0820             1.
+    SH080520  COST            503.43   TRAN0805            1.
+    SH080520  BAL0805            -1.   BAL0820             1.
+    SH080820  COST            217.98   TRAN0808            1.
+    SH080820  BAL0883            -1.   BAL0820             1.
+    SH080121  COST            697.19   TRAN0801            1.
+    SH080121  BAL0801            -1.   BAL0821             1.
+    SH080221  COST            636.64   TRAN0802            1.
+    SH080221  BAL0802            -1.   BAL0821             1.
+    SH080321  COST            771.58   TRAN0803            1.
+    SH080321  BAL0803            -1.   BAL0821             1.
+    SH080421  COST             553.6   TRAN0804            1.
+    SH080421  BAL0804            -1.   BAL0821             1.
+    SH080521  COST             951.5   TRAN0805            1.
+    SH080521  BAL0805            -1.   BAL0821             1.
+    SH080821  COST             553.6   TRAN0808            1.
+    SH080821  BAL0883            -1.   BAL0821             1.
+    SH080122  COST            429.04   TRAN0801            1.
+    SH080122  BAL0801            -1.   BAL0822             1.
+    SH080222  COST            999.94   TRAN0802            1.
+    SH080222  BAL0802            -1.   BAL0822             1.
+    SH080322  COST            517.27   TRAN0803            1.
+    SH080322  BAL0803            -1.   BAL0822             1.
+    SH080422  COST            387.52   TRAN0804            1.
+    SH080422  BAL0804            -1.   BAL0822             1.
+    SH080522  COST            309.67   TRAN0805            1.
+    SH080522  BAL0805            -1.   BAL0822             1.
+    SH080622  COST             536.3   TRAN0806            1.
+    SH080622  BAL0852            -1.   BAL0822             1.
+    SH080822  COST            240.47   TRAN0808            1.
+    SH080822  BAL0883            -1.   BAL0822             1.
+    SH080123  COST            404.82   TRAN0801            1.
+    SH080123  BAL0801            -1.   BAL0823             1.
+    SH080223  COST            935.93   TRAN0802            1.
+    SH080223  BAL0802            -1.   BAL0823             1.
+    SH080323  COST            496.51   TRAN0803            1.
+    SH080323  BAL0803            -1.   BAL0823             1.
+    SH080423  COST            288.91   TRAN0804            1.
+    SH080423  BAL0804            -1.   BAL0823             1.
+    SH080523  COST            287.18   TRAN0805            1.
+    SH080523  BAL0805            -1.   BAL0823             1.
+    SH080823  COST            240.47   TRAN0808            1.
+    SH080823  BAL0883            -1.   BAL0823             1.
+    SH080124  COST           2484.28   TRAN0801            1.
+    SH080124  BAL0801            -1.   BAL0824             1.
+    SH080125  COST            669.51   TRAN0801            1.
+    SH080125  BAL0801            -1.   BAL0825             1.
+    SH080225  COST            738.71   TRAN0802            1.
+    SH080225  BAL0802            -1.   BAL0825             1.
+    SH080325  COST            884.03   TRAN0803            1.
+    SH080325  BAL0803            -1.   BAL0825             1.
+    SH080425  COST            602.04   TRAN0804            1.
+    SH080425  BAL0804            -1.   BAL0825             1.
+    SH080525  COST            979.18   TRAN0805            1.
+    SH080525  BAL0805            -1.   BAL0825             1.
+    SH080625  COST            697.19   TRAN0806            1.
+    SH080625  BAL0852            -1.   BAL0825             1.
+    SH080825  COST            527.65   TRAN0808            1.
+    SH080825  BAL0883            -1.   BAL0825             1.
+    SH080426  COST             467.1   TRAN0804            1.
+    SH080426  BAL0804            -1.   BAL0826             1.
+    SH080127  COST            404.82   TRAN0801            1.
+    SH080127  BAL0801            -1.   BAL0827             1.
+    SH080227  COST            491.32   TRAN0802            1.
+    SH080227  BAL0802            -1.   BAL0827             1.
+    SH080327  COST            499.97   TRAN0803            1.
+    SH080327  BAL0803            -1.   BAL0827             1.
+    SH080427  COST            579.55   TRAN0804            1.
+    SH080427  BAL0804            -1.   BAL0827             1.
+    SH080527  COST            653.94   TRAN0805            1.
+    SH080527  BAL0805            -1.   BAL0827             1.
+    SH080627  COST            463.64   TRAN0806            1.
+    SH080627  BAL0852            -1.   BAL0827             1.
+    SH080827  COST            435.96   TRAN0808            1.
+    SH080827  BAL0883            -1.   BAL0827             1.
+    SH080128  COST            420.39   TRAN0801            1.
+    SH080128  BAL0801            -1.   BAL0828             1.
+    SH080228  COST            984.37   TRAN0802            1.
+    SH080228  BAL0802            -1.   BAL0828             1.
+    SH080328  COST            512.08   TRAN0803            1.
+    SH080328  BAL0803            -1.   BAL0828             1.
+    SH080428  COST            510.35   TRAN0804            1.
+    SH080428  BAL0804            -1.   BAL0828             1.
+    SH080528  COST            176.46   TRAN0805            1.
+    SH080528  BAL0805            -1.   BAL0828             1.
+    SH080628  COST            451.53   TRAN0806            1.
+    SH080628  BAL0852            -1.   BAL0828             1.
+    SH080728  COST            185.11   TRAN0807            1.
+    SH080728  BAL0864            -1.   BAL0828             1.
+    SH080828  COST            439.42   TRAN0808            1.
+    SH080828  BAL0883            -1.   BAL0828             1.
+    SH080129  COST            385.79   TRAN0801            1.
+    SH080129  BAL0801            -1.   BAL0829             1.
+    SH080229  COST            802.72   TRAN0802            1.
+    SH080229  BAL0802            -1.   BAL0829             1.
+    SH080329  COST            416.93   TRAN0803            1.
+    SH080329  BAL0803            -1.   BAL0829             1.
+    SH080429  COST            344.27   TRAN0804            1.
+    SH080429  BAL0804            -1.   BAL0829             1.
+    SH080529  COST             743.9   TRAN0805            1.
+    SH080529  BAL0805            -1.   BAL0829             1.
+    SH080629  COST            451.53   TRAN0806            1.
+    SH080629  BAL0852            -1.   BAL0829             1.
+    SH080829  COST            249.12   TRAN0808            1.
+    SH080829  BAL0883            -1.   BAL0829             1.
+    SH080130  COST            806.18   TRAN0801            1.
+    SH080130  BAL0801            -1.   BAL0830             1.
+    SH080230  COST            754.28   TRAN0802            1.
+    SH080230  BAL0802            -1.   BAL0830             1.
+    SH080330  COST            904.79   TRAN0803            1.
+    SH080330  BAL0803            -1.   BAL0830             1.
+    SH080430  COST            525.92   TRAN0804            1.
+    SH080430  BAL0804            -1.   BAL0830             1.
+    SH080530  COST            771.58   TRAN0805            1.
+    SH080530  BAL0805            -1.   BAL0830             1.
+    SH080830  COST            660.86   TRAN0808            1.
+    SH080830  BAL0883            -1.   BAL0830             1.
+    SH080131  COST            192.03   TRAN0801            1.
+    SH080131  BAL0801            -1.   BAL0831             1.
+    SH080231  COST            607.23   TRAN0802            1.
+    SH080231  BAL0802            -1.   BAL0831             1.
+    SH080331  COST             190.3   TRAN0803            1.
+    SH080331  BAL0803            -1.   BAL0831             1.
+    SH080431  COST            437.69   TRAN0804            1.
+    SH080431  BAL0804            -1.   BAL0831             1.
+    SH080531  COST            531.11   TRAN0805            1.
+    SH080531  BAL0805            -1.   BAL0831             1.
+    SH080631  COST            193.76   TRAN0806            1.
+    SH080631  BAL0852            -1.   BAL0831             1.
+    SH080831  COST            385.79   TRAN0808            1.
+    SH080831  BAL0883            -1.   BAL0831             1.
+    SH080132  COST            517.27   TRAN0801            1.
+    SH080132  BAL0801            -1.   BAL0832             1.
+    SH080232  COST            826.94   TRAN0802            1.
+    SH080232  BAL0802            -1.   BAL0832             1.
+    SH080332  COST            731.79   TRAN0803            1.
+    SH080332  BAL0803            -1.   BAL0832             1.
+    SH080432  COST            271.61   TRAN0804            1.
+    SH080432  BAL0804            -1.   BAL0832             1.
+    SH080532  COST            678.16   TRAN0805            1.
+    SH080532  BAL0805            -1.   BAL0832             1.
+    SH080832  COST             311.4   TRAN0808            1.
+    SH080832  BAL0883            -1.   BAL0832             1.
+    SH080133  COST            852.89   TRAN0801            1.
+    SH080133  BAL0801            -1.   BAL0833             1.
+    SH080233  COST              692.   TRAN0802            1.
+    SH080233  BAL0802            -1.   BAL0833             1.
+    SH080333  COST            939.39   TRAN0803            1.
+    SH080333  BAL0803            -1.   BAL0833             1.
+    SH080433  COST            769.85   TRAN0804            1.
+    SH080433  BAL0804            -1.   BAL0833             1.
+    SH080533  COST           1091.63   TRAN0805            1.
+    SH080533  BAL0805            -1.   BAL0833             1.
+    SH080833  COST            659.13   TRAN0808            1.
+    SH080833  BAL0883            -1.   BAL0833             1.
+    SH080134  COST            667.78   TRAN0801            1.
+    SH080134  BAL0801            -1.   BAL0834             1.
+    SH080234  COST           1133.15   TRAN0802            1.
+    SH080234  BAL0802            -1.   BAL0834             1.
+    SH080334  COST            870.19   TRAN0803            1.
+    SH080334  BAL0803            -1.   BAL0834             1.
+    SH080434  COST            365.03   TRAN0804            1.
+    SH080434  BAL0804            -1.   BAL0834             1.
+    SH080534  COST            762.93   TRAN0805            1.
+    SH080534  BAL0805            -1.   BAL0834             1.
+    SH080834  COST            454.99   TRAN0808            1.
+    SH080834  BAL0883            -1.   BAL0834             1.
+    SH080135  COST            797.53   TRAN0801            1.
+    SH080135  BAL0801            -1.   BAL0835             1.
+    SH080235  COST            769.85   TRAN0802            1.
+    SH080235  BAL0802            -1.   BAL0835             1.
+    SH080335  COST            652.21   TRAN0803            1.
+    SH080335  BAL0803            -1.   BAL0835             1.
+    SH080435  COST            211.06   TRAN0804            1.
+    SH080435  BAL0804            -1.   BAL0835             1.
+    SH080535  COST            745.63   TRAN0805            1.
+    SH080535  BAL0805            -1.   BAL0835             1.
+    SH080835  COST            406.55   TRAN0808            1.
+    SH080835  BAL0883            -1.   BAL0835             1.
+    SH080136  COST            354.65   TRAN0801            1.
+    SH080136  BAL0801            -1.   BAL0836             1.
+    SH080236  COST            775.04   TRAN0802            1.
+    SH080236  BAL0802            -1.   BAL0836             1.
+    SH080336  COST            183.38   TRAN0803            1.
+    SH080336  BAL0803            -1.   BAL0836             1.
+    SH080436  COST             640.1   TRAN0804            1.
+    SH080436  BAL0804            -1.   BAL0836             1.
+    SH080536  COST            598.58   TRAN0805            1.
+    SH080536  BAL0805            -1.   BAL0836             1.
+    SH080636  COST             190.3   TRAN0806            1.
+    SH080636  BAL0852            -1.   BAL0836             1.
+    SH080836  COST            555.33   TRAN0808            1.
+    SH080836  BAL0883            -1.   BAL0836             1.
+    SH080137  COST            159.16   TRAN0801            1.
+    SH080137  BAL0801            -1.   BAL0837             1.
+    SH080237  COST            591.66   TRAN0802            1.
+    SH080237  BAL0802            -1.   BAL0837             1.
+    SH080337  COST            273.34   TRAN0803            1.
+    SH080337  BAL0803            -1.   BAL0837             1.
+    SH080437  COST            525.92   TRAN0804            1.
+    SH080437  BAL0804            -1.   BAL0837             1.
+    SH080537  COST            314.86   TRAN0805            1.
+    SH080537  BAL0805            -1.   BAL0837             1.
+    SH080637  COST            335.62   TRAN0806            1.
+    SH080637  BAL0852            -1.   BAL0837             1.
+    SH080837  COST            435.96   TRAN0808            1.
+    SH080837  BAL0883            -1.   BAL0837             1.
+    SH080138  COST            235.28   TRAN0801            1.
+    SH080138  BAL0801            -1.   BAL0838             1.
+    SH080238  COST            422.12   TRAN0802            1.
+    SH080238  BAL0802            -1.   BAL0838             1.
+    SH080338  COST            164.35   TRAN0803            1.
+    SH080338  BAL0803            -1.   BAL0838             1.
+    SH080438  COST            532.84   TRAN0804            1.
+    SH080438  BAL0804            -1.   BAL0838             1.
+    SH080538  COST            480.94   TRAN0805            1.
+    SH080538  BAL0805            -1.   BAL0838             1.
+    SH080638  COST             67.47   TRAN0806            1.
+    SH080638  BAL0852            -1.   BAL0838             1.
+    SH080738  COST            373.68   TRAN0807            1.
+    SH080738  BAL0864            -1.   BAL0838             1.
+    SH080838  COST            410.01   TRAN0808            1.
+    SH080838  BAL0883            -1.   BAL0838             1.
+    SH080139  COST             224.9   TRAN0801            1.
+    SH080139  BAL0801            -1.   BAL0839             1.
+    SH080239  COST            586.47   TRAN0802            1.
+    SH080239  BAL0802            -1.   BAL0839             1.
+    SH080339  COST             276.8   TRAN0803            1.
+    SH080339  BAL0803            -1.   BAL0839             1.
+    SH080439  COST            430.77   TRAN0804            1.
+    SH080439  BAL0804            -1.   BAL0839             1.
+    SH080539  COST            742.17   TRAN0805            1.
+    SH080539  BAL0805            -1.   BAL0839             1.
+    SH080639  COST            352.92   TRAN0806            1.
+    SH080639  BAL0852            -1.   BAL0839             1.
+    SH080839  COST            290.64   TRAN0808            1.
+    SH080839  BAL0883            -1.   BAL0839             1.
+    SH080140  COST            285.45   TRAN0801            1.
+    SH080140  BAL0801            -1.   BAL0840             1.
+    SH080240  COST            653.94   TRAN0802            1.
+    SH080240  BAL0802            -1.   BAL0840             1.
+    SH080340  COST            178.19   TRAN0803            1.
+    SH080340  BAL0803            -1.   BAL0840             1.
+    SH080440  COST            513.81   TRAN0804            1.
+    SH080440  BAL0804            -1.   BAL0840             1.
+    SH080540  COST            382.33   TRAN0805            1.
+    SH080540  BAL0805            -1.   BAL0840             1.
+    SH080640  COST            226.63   TRAN0806            1.
+    SH080640  BAL0852            -1.   BAL0840             1.
+    SH080840  COST            474.02   TRAN0808            1.
+    SH080840  BAL0883            -1.   BAL0840             1.
+    SH080141  COST            339.08   TRAN0801            1.
+    SH080141  BAL0801            -1.   BAL0841             1.
+    SH080241  COST              519.   TRAN0802            1.
+    SH080241  BAL0802            -1.   BAL0841             1.
+    SH080341  COST             259.5   TRAN0803            1.
+    SH080341  BAL0803            -1.   BAL0841             1.
+    SH080441  COST            560.52   TRAN0804            1.
+    SH080441  BAL0804            -1.   BAL0841             1.
+    SH080541  COST            636.64   TRAN0805            1.
+    SH080541  BAL0805            -1.   BAL0841             1.
+    SH080641  COST              173.   TRAN0806            1.
+    SH080641  BAL0852            -1.   BAL0841             1.
+    SH080841  COST            517.27   TRAN0808            1.
+    SH080841  BAL0883            -1.   BAL0841             1.
+    SH080142  COST             155.7   TRAN0801            1.
+    SH080142  BAL0801            -1.   BAL0842             1.
+    SH080242  COST            716.22   TRAN0802            1.
+    SH080242  BAL0802            -1.   BAL0842             1.
+    SH080342  COST             276.8   TRAN0803            1.
+    SH080342  BAL0803            -1.   BAL0842             1.
+    SH080442  COST            337.35   TRAN0804            1.
+    SH080442  BAL0804            -1.   BAL0842             1.
+    SH080542  COST            624.53   TRAN0805            1.
+    SH080542  BAL0805            -1.   BAL0842             1.
+    SH080642  COST            278.53   TRAN0806            1.
+    SH080642  BAL0852            -1.   BAL0842             1.
+    SH080842  COST            262.96   TRAN0808            1.
+    SH080842  BAL0883            -1.   BAL0842             1.
+    SH080143  COST            275.07   TRAN0801            1.
+    SH080143  BAL0801            -1.   BAL0843             1.
+    SH080243  COST            683.35   TRAN0802            1.
+    SH080243  BAL0802            -1.   BAL0843             1.
+    SH080343  COST             43.25   TRAN0803            1.
+    SH080343  BAL0803            -1.   BAL0843             1.
+    SH080443  COST            512.08   TRAN0804            1.
+    SH080443  BAL0804            -1.   BAL0843             1.
+    SH080543  COST            446.34   TRAN0805            1.
+    SH080543  BAL0805            -1.   BAL0843             1.
+    SH080643  COST              173.   TRAN0806            1.
+    SH080643  BAL0852            -1.   BAL0843             1.
+    SH080743  COST            416.93   TRAN0807            1.
+    SH080743  BAL0864            -1.   BAL0843             1.
+    SH080843  COST            468.83   TRAN0808            1.
+    SH080843  BAL0883            -1.   BAL0843             1.
+    SH080144  COST            275.07   TRAN0801            1.
+    SH080144  BAL0801            -1.   BAL0844             1.
+    SH080244  COST            655.67   TRAN0802            1.
+    SH080244  BAL0802            -1.   BAL0844             1.
+    SH080344  COST            221.44   TRAN0803            1.
+    SH080344  BAL0803            -1.   BAL0844             1.
+    SH080444  COST            539.76   TRAN0804            1.
+    SH080444  BAL0804            -1.   BAL0844             1.
+    SH080544  COST             536.3   TRAN0805            1.
+    SH080544  BAL0805            -1.   BAL0844             1.
+    SH080644  COST            153.97   TRAN0806            1.
+    SH080644  BAL0852            -1.   BAL0844             1.
+    SH080844  COST            515.54   TRAN0808            1.
+    SH080844  BAL0883            -1.   BAL0844             1.
+    SH080145  COST            297.56   TRAN0801            1.
+    SH080145  BAL0801            -1.   BAL0845             1.
+    SH080245  COST            754.28   TRAN0802            1.
+    SH080245  BAL0802            -1.   BAL0845             1.
+    SH080345  COST            278.53   TRAN0803            1.
+    SH080345  BAL0803            -1.   BAL0845             1.
+    SH080445  COST            505.16   TRAN0804            1.
+    SH080445  BAL0804            -1.   BAL0845             1.
+    SH080545  COST            404.82   TRAN0805            1.
+    SH080545  BAL0805            -1.   BAL0845             1.
+    SH080645  COST            330.43   TRAN0806            1.
+    SH080645  BAL0852            -1.   BAL0845             1.
+    SH080745  COST            340.81   TRAN0807            1.
+    SH080745  BAL0864            -1.   BAL0845             1.
+    SH080845  COST            527.65   TRAN0808            1.
+    SH080845  BAL0883            -1.   BAL0845             1.
+    SH080146  COST            423.85   TRAN0801            1.
+    SH080146  BAL0801            -1.   BAL0846             1.
+    SH080246  COST            472.29   TRAN0802            1.
+    SH080246  BAL0802            -1.   BAL0846             1.
+    SH080346  COST            382.33   TRAN0803            1.
+    SH080346  BAL0803            -1.   BAL0846             1.
+    SH080446  COST            773.31   TRAN0804            1.
+    SH080446  BAL0804            -1.   BAL0846             1.
+    SH080546  COST             743.9   TRAN0805            1.
+    SH080546  BAL0805            -1.   BAL0846             1.
+    SH080646  COST            444.61   TRAN0806            1.
+    SH080646  BAL0852            -1.   BAL0846             1.
+    SH080846  COST            775.04   TRAN0808            1.
+    SH080846  BAL0883            -1.   BAL0846             1.
+    SH080147  COST             190.3   TRAN0801            1.
+    SH080147  BAL0801            -1.   BAL0847             1.
+    SH080247  COST            645.29   TRAN0802            1.
+    SH080247  BAL0802            -1.   BAL0847             1.
+    SH080347  COST            275.07   TRAN0803            1.
+    SH080347  BAL0803            -1.   BAL0847             1.
+    SH080447  COST            474.02   TRAN0804            1.
+    SH080447  BAL0804            -1.   BAL0847             1.
+    SH080547  COST            403.09   TRAN0805            1.
+    SH080547  BAL0805            -1.   BAL0847             1.
+    SH080647  COST            250.85   TRAN0806            1.
+    SH080647  BAL0852            -1.   BAL0847             1.
+    SH080847  COST            422.12   TRAN0808            1.
+    SH080847  BAL0883            -1.   BAL0847             1.
+    SH080148  COST            164.35   TRAN0801            1.
+    SH080148  BAL0801            -1.   BAL0848             1.
+    SH080248  COST            586.47   TRAN0802            1.
+    SH080248  BAL0802            -1.   BAL0848             1.
+    SH080348  COST            237.01   TRAN0803            1.
+    SH080348  BAL0803            -1.   BAL0848             1.
+    SH080448  COST             397.9   TRAN0804            1.
+    SH080448  BAL0804            -1.   BAL0848             1.
+    SH080548  COST            427.31   TRAN0805            1.
+    SH080548  BAL0805            -1.   BAL0848             1.
+    SH080648  COST            198.95   TRAN0806            1.
+    SH080648  BAL0852            -1.   BAL0848             1.
+    SH080848  COST            337.35   TRAN0808            1.
+    SH080848  BAL0883            -1.   BAL0848             1.
+    SH080149  COST            569.17   TRAN0801            1.
+    SH080149  BAL0801            -1.   BAL0849             1.
+    SH080249  COST            925.55   TRAN0802            1.
+    SH080249  BAL0802            -1.   BAL0849             1.
+    SH080349  COST            574.36   TRAN0803            1.
+    SH080349  BAL0803            -1.   BAL0849             1.
+    SH080449  COST            659.13   TRAN0804            1.
+    SH080449  BAL0804            -1.   BAL0849             1.
+    SH080549  COST            262.96   TRAN0805            1.
+    SH080549  BAL0805            -1.   BAL0849             1.
+    SH080649  COST            584.74   TRAN0806            1.
+    SH080649  BAL0852            -1.   BAL0849             1.
+    SH080749  COST            231.82   TRAN0807            1.
+    SH080749  BAL0864            -1.   BAL0849             1.
+    SH080849  COST            705.84   TRAN0808            1.
+    SH080849  BAL0883            -1.   BAL0849             1.
+    SH080150  COST            416.93   TRAN0801            1.
+    SH080150  BAL0801            -1.   BAL0850             1.
+    SH080250  COST           1058.76   TRAN0802            1.
+    SH080250  BAL0802            -1.   BAL0850             1.
+    SH080350  COST            425.58   TRAN0803            1.
+    SH080350  BAL0803            -1.   BAL0850             1.
+    SH080450  COST            631.45   TRAN0804            1.
+    SH080450  BAL0804            -1.   BAL0850             1.
+    SH080550  COST            406.55   TRAN0805            1.
+    SH080550  BAL0805            -1.   BAL0850             1.
+    SH080750  COST            237.01   TRAN0807            1.
+    SH080750  BAL0864            -1.   BAL0850             1.
+    SH080850  COST            702.38   TRAN0808            1.
+    SH080850  BAL0883            -1.   BAL0850             1.
+    SH080151  COST            574.36   TRAN0801            1.
+    SH080151  BAL0801            -1.   BAL0851             1.
+    SH080251  COST             951.5   TRAN0802            1.
+    SH080251  BAL0802            -1.   BAL0851             1.
+    SH080351  COST            589.93   TRAN0803            1.
+    SH080351  BAL0803            -1.   BAL0851             1.
+    SH080451  COST            584.74   TRAN0804            1.
+    SH080451  BAL0804            -1.   BAL0851             1.
+    SH080551  COST            212.79   TRAN0805            1.
+    SH080551  BAL0805            -1.   BAL0851             1.
+    SH080751  COST            171.27   TRAN0807            1.
+    SH080751  BAL0864            -1.   BAL0851             1.
+    SH080851  COST            740.44   TRAN0808            1.
+    SH080851  BAL0883            -1.   BAL0851             1.
+    SH080152  COST            193.76   TRAN0801            1.
+    SH080152  BAL0801            -1.   BAL0852             1.
+    SH080252  COST              519.   TRAN0802            1.
+    SH080252  BAL0802            -1.   BAL0852             1.
+    SH080352  COST            141.86   TRAN0803            1.
+    SH080352  BAL0803            -1.   BAL0852             1.
+    SH080452  COST            557.06   TRAN0804            1.
+    SH080452  BAL0804            -1.   BAL0852             1.
+    SH080552  COST            510.35   TRAN0805            1.
+    SH080552  BAL0805            -1.   BAL0852             1.
+    SH080852  COST            437.69   TRAN0808            1.
+    SH080852  BAL0883            -1.   BAL0852             1.
+    SH080153  COST            621.07   TRAN0801            1.
+    SH080153  BAL0801            -1.   BAL0853             1.
+    SH080253  COST           1100.28   TRAN0802            1.
+    SH080253  BAL0802            -1.   BAL0853             1.
+    SH080353  COST            562.25   TRAN0803            1.
+    SH080353  BAL0803            -1.   BAL0853             1.
+    SH080453  COST            712.76   TRAN0804            1.
+    SH080453  BAL0804            -1.   BAL0853             1.
+    SH080553  COST            318.32   TRAN0805            1.
+    SH080553  BAL0805            -1.   BAL0853             1.
+    SH080653  COST            621.07   TRAN0806            1.
+    SH080653  BAL0852            -1.   BAL0853             1.
+    SH080753  COST            252.58   TRAN0807            1.
+    SH080753  BAL0864            -1.   BAL0853             1.
+    SH080853  COST            697.19   TRAN0808            1.
+    SH080853  BAL0883            -1.   BAL0853             1.
+    SH080154  COST            320.05   TRAN0801            1.
+    SH080154  BAL0801            -1.   BAL0854             1.
+    SH080254  COST            769.85   TRAN0802            1.
+    SH080254  BAL0802            -1.   BAL0854             1.
+    SH080354  COST            375.41   TRAN0803            1.
+    SH080354  BAL0803            -1.   BAL0854             1.
+    SH080454  COST            593.39   TRAN0804            1.
+    SH080454  BAL0804            -1.   BAL0854             1.
+    SH080554  COST            368.49   TRAN0805            1.
+    SH080554  BAL0805            -1.   BAL0854             1.
+    SH080654  COST            351.19   TRAN0806            1.
+    SH080654  BAL0852            -1.   BAL0854             1.
+    SH080854  COST            695.46   TRAN0808            1.
+    SH080854  BAL0883            -1.   BAL0854             1.
+    SH080155  COST            480.94   TRAN0801            1.
+    SH080155  BAL0801            -1.   BAL0855             1.
+    SH080255  COST            828.67   TRAN0802            1.
+    SH080255  BAL0802            -1.   BAL0855             1.
+    SH080355  COST            486.13   TRAN0803            1.
+    SH080355  BAL0803            -1.   BAL0855             1.
+    SH080455  COST            508.62   TRAN0804            1.
+    SH080455  BAL0804            -1.   BAL0855             1.
+    SH080555  COST            266.42   TRAN0805            1.
+    SH080555  BAL0805            -1.   BAL0855             1.
+    SH080655  COST             501.7   TRAN0806            1.
+    SH080655  BAL0852            -1.   BAL0855             1.
+    SH080755  COST            185.11   TRAN0807            1.
+    SH080755  BAL0864            -1.   BAL0855             1.
+    SH080855  COST            508.62   TRAN0808            1.
+    SH080855  BAL0883            -1.   BAL0855             1.
+    SH080156  COST             674.7   TRAN0801            1.
+    SH080156  BAL0801            -1.   BAL0856             1.
+    SH080256  COST           1001.67   TRAN0802            1.
+    SH080256  BAL0802            -1.   BAL0856             1.
+    SH080356  COST            527.65   TRAN0803            1.
+    SH080356  BAL0803            -1.   BAL0856             1.
+    SH080456  COST            631.45   TRAN0804            1.
+    SH080456  BAL0804            -1.   BAL0856             1.
+    SH080556  COST            235.28   TRAN0805            1.
+    SH080556  BAL0805            -1.   BAL0856             1.
+    SH080656  COST            586.47   TRAN0806            1.
+    SH080656  BAL0852            -1.   BAL0856             1.
+    SH080756  COST            211.06   TRAN0807            1.
+    SH080756  BAL0864            -1.   BAL0856             1.
+    SH080856  COST            617.61   TRAN0808            1.
+    SH080856  BAL0883            -1.   BAL0856             1.
+    SH080157  COST            451.53   TRAN0801            1.
+    SH080157  BAL0801            -1.   BAL0857             1.
+    SH080257  COST             899.6   TRAN0802            1.
+    SH080257  BAL0802            -1.   BAL0857             1.
+    SH080357  COST             501.7   TRAN0803            1.
+    SH080357  BAL0803            -1.   BAL0857             1.
+    SH080457  COST            404.82   TRAN0804            1.
+    SH080457  BAL0804            -1.   BAL0857             1.
+    SH080557  COST            290.64   TRAN0805            1.
+    SH080557  BAL0805            -1.   BAL0857             1.
+    SH080657  COST            551.87   TRAN0806            1.
+    SH080657  BAL0852            -1.   BAL0857             1.
+    SH080757  COST            256.04   TRAN0807            1.
+    SH080757  BAL0864            -1.   BAL0857             1.
+    SH080857  COST            399.63   TRAN0808            1.
+    SH080857  BAL0883            -1.   BAL0857             1.
+    SH080158  COST            508.62   TRAN0801            1.
+    SH080158  BAL0801            -1.   BAL0858             1.
+    SH080258  COST            901.33   TRAN0802            1.
+    SH080258  BAL0802            -1.   BAL0858             1.
+    SH080358  COST            480.94   TRAN0803            1.
+    SH080358  BAL0803            -1.   BAL0858             1.
+    SH080458  COST            593.39   TRAN0804            1.
+    SH080458  BAL0804            -1.   BAL0858             1.
+    SH080558  COST             36.33   TRAN0805            1.
+    SH080558  BAL0805            -1.   BAL0858             1.
+    SH080658  COST            563.98   TRAN0806            1.
+    SH080658  BAL0852            -1.   BAL0858             1.
+    SH080758  COST            117.64   TRAN0807            1.
+    SH080758  BAL0864            -1.   BAL0858             1.
+    SH080858  COST            439.42   TRAN0808            1.
+    SH080858  BAL0883            -1.   BAL0858             1.
+    SH080159  COST            356.38   TRAN0801            1.
+    SH080159  BAL0801            -1.   BAL0859             1.
+    SH080259  COST            861.54   TRAN0802            1.
+    SH080259  BAL0802            -1.   BAL0859             1.
+    SH080359  COST            411.74   TRAN0803            1.
+    SH080359  BAL0803            -1.   BAL0859             1.
+    SH080459  COST            422.12   TRAN0804            1.
+    SH080459  BAL0804            -1.   BAL0859             1.
+    SH080559  COST            275.07   TRAN0805            1.
+    SH080559  BAL0805            -1.   BAL0859             1.
+    SH080659  COST            513.81   TRAN0806            1.
+    SH080659  BAL0852            -1.   BAL0859             1.
+    SH080759  COST            181.65   TRAN0807            1.
+    SH080759  BAL0864            -1.   BAL0859             1.
+    SH080859  COST            441.15   TRAN0808            1.
+    SH080859  BAL0883            -1.   BAL0859             1.
+    SH080160  COST            451.53   TRAN0801            1.
+    SH080160  BAL0801            -1.   BAL0860             1.
+    SH080260  COST             951.5   TRAN0802            1.
+    SH080260  BAL0802            -1.   BAL0860             1.
+    SH080360  COST            489.59   TRAN0803            1.
+    SH080360  BAL0803            -1.   BAL0860             1.
+    SH080460  COST            539.76   TRAN0804            1.
+    SH080460  BAL0804            -1.   BAL0860             1.
+    SH080560  COST            233.55   TRAN0805            1.
+    SH080560  BAL0805            -1.   BAL0860             1.
+    SH080660  COST            558.79   TRAN0806            1.
+    SH080660  BAL0852            -1.   BAL0860             1.
+    SH080760  COST            152.24   TRAN0807            1.
+    SH080760  BAL0864            -1.   BAL0860             1.
+    SH080860  COST            517.27   TRAN0808            1.
+    SH080860  BAL0883            -1.   BAL0860             1.
+    SH080163  COST            460.18   TRAN0801            1.
+    SH080163  BAL0801            -1.   BAL0863             1.
+    SH080263  COST            854.62   TRAN0802            1.
+    SH080263  BAL0802            -1.   BAL0863             1.
+    SH080363  COST            496.51   TRAN0803            1.
+    SH080363  BAL0803            -1.   BAL0863             1.
+    SH080463  COST            638.37   TRAN0804            1.
+    SH080463  BAL0804            -1.   BAL0863             1.
+    SH080563  COST            262.96   TRAN0805            1.
+    SH080563  BAL0805            -1.   BAL0863             1.
+    SH080663  COST            544.95   TRAN0806            1.
+    SH080663  BAL0852            -1.   BAL0863             1.
+    SH080763  COST            214.52   TRAN0807            1.
+    SH080763  BAL0864            -1.   BAL0863             1.
+    SH080863  COST              692.   TRAN0808            1.
+    SH080863  BAL0883            -1.   BAL0863             1.
+    SH080164  COST            344.27   TRAN0801            1.
+    SH080164  BAL0801            -1.   BAL0864             1.
+    SH080264  COST            909.98   TRAN0802            1.
+    SH080264  BAL0802            -1.   BAL0864             1.
+    SH080364  COST            385.79   TRAN0803            1.
+    SH080364  BAL0803            -1.   BAL0864             1.
+    SH080464  COST            581.28   TRAN0804            1.
+    SH080464  BAL0804            -1.   BAL0864             1.
+    SH080564  COST            100.34   TRAN0805            1.
+    SH080564  BAL0805            -1.   BAL0864             1.
+    SH080664  COST            548.41   TRAN0806            1.
+    SH080664  BAL0852            -1.   BAL0864             1.
+    SH080864  COST             432.5   TRAN0808            1.
+    SH080864  BAL0883            -1.   BAL0864             1.
+    SH080165  COST            747.36   TRAN0801            1.
+    SH080165  BAL0801            -1.   BAL0865             1.
+    SH080265  COST            531.11   TRAN0802            1.
+    SH080265  BAL0802            -1.   BAL0865             1.
+    SH080365  COST            873.65   TRAN0803            1.
+    SH080365  BAL0803            -1.   BAL0865             1.
+    SH080465  COST            671.24   TRAN0804            1.
+    SH080465  BAL0804            -1.   BAL0865             1.
+    SH080565  COST           1044.92   TRAN0805            1.
+    SH080565  BAL0805            -1.   BAL0865             1.
+    SH080865  COST            717.95   TRAN0808            1.
+    SH080865  BAL0883            -1.   BAL0865             1.
+    SH080166  COST             968.8   TRAN0801            1.
+    SH080166  BAL0801            -1.   BAL0866             1.
+    SH080266  COST            448.07   TRAN0802            1.
+    SH080266  BAL0802            -1.   BAL0866             1.
+    SH080366  COST            999.94   TRAN0803            1.
+    SH080366  BAL0803            -1.   BAL0866             1.
+    SH080466  COST            961.88   TRAN0804            1.
+    SH080466  BAL0804            -1.   BAL0866             1.
+    SH080566  COST            1228.3   TRAN0805            1.
+    SH080566  BAL0805            -1.   BAL0866             1.
+    SH080866  COST             968.8   TRAN0808            1.
+    SH080866  BAL0883            -1.   BAL0866             1.
+    SH080167  COST            735.25   TRAN0801            1.
+    SH080167  BAL0801            -1.   BAL0867             1.
+    SH080267  COST            401.36   TRAN0802            1.
+    SH080267  BAL0802            -1.   BAL0867             1.
+    SH080367  COST            852.89   TRAN0803            1.
+    SH080367  BAL0803            -1.   BAL0867             1.
+    SH080467  COST            790.61   TRAN0804            1.
+    SH080467  BAL0804            -1.   BAL0867             1.
+    SH080567  COST           1044.92   TRAN0805            1.
+    SH080567  BAL0805            -1.   BAL0867             1.
+    SH080867  COST            792.34   TRAN0808            1.
+    SH080867  BAL0883            -1.   BAL0867             1.
+    SH080168  COST           1027.62   TRAN0801            1.
+    SH080168  BAL0801            -1.   BAL0868             1.
+    SH080268  COST              692.   TRAN0802            1.
+    SH080268  BAL0802            -1.   BAL0868             1.
+    SH080368  COST             968.8   TRAN0803            1.
+    SH080368  BAL0803            -1.   BAL0868             1.
+    SH080468  COST           1214.46   TRAN0804            1.
+    SH080468  BAL0804            -1.   BAL0868             1.
+    SH080568  COST           1636.58   TRAN0805            1.
+    SH080568  BAL0805            -1.   BAL0868             1.
+    SH080868  COST           1299.23   TRAN0808            1.
+    SH080868  BAL0883            -1.   BAL0868             1.
+    SH080169  COST            932.47   TRAN0801            1.
+    SH080169  BAL0801            -1.   BAL0869             1.
+    SH080269  COST            382.33   TRAN0802            1.
+    SH080269  BAL0802            -1.   BAL0869             1.
+    SH080369  COST             882.3   TRAN0803            1.
+    SH080369  BAL0803            -1.   BAL0869             1.
+    SH080469  COST           1076.06   TRAN0804            1.
+    SH080469  BAL0804            -1.   BAL0869             1.
+    SH080569  COST           1117.58   TRAN0805            1.
+    SH080569  BAL0805            -1.   BAL0869             1.
+    SH080869  COST           1138.34   TRAN0808            1.
+    SH080869  BAL0883            -1.   BAL0869             1.
+    SH080171  COST             761.2   TRAN0801            1.
+    SH080171  BAL0801            -1.   BAL0871             1.
+    SH080371  COST            906.52   TRAN0803            1.
+    SH080371  BAL0803            -1.   BAL0871             1.
+    SH080471  COST            901.33   TRAN0804            1.
+    SH080471  BAL0804            -1.   BAL0871             1.
+    SH080571  COST           1005.13   TRAN0805            1.
+    SH080571  BAL0805            -1.   BAL0871             1.
+    SH080671  COST            676.43   TRAN0806            1.
+    SH080671  BAL0852            -1.   BAL0871             1.
+    SH080771  COST           1217.92   TRAN0807            1.
+    SH080771  BAL0864            -1.   BAL0871             1.
+    SH080871  COST            922.09   TRAN0808            1.
+    SH080871  BAL0883            -1.   BAL0871             1.
+    SH080172  COST           1015.51   TRAN0801            1.
+    SH080172  BAL0801            -1.   BAL0872             1.
+    SH080272  COST            939.39   TRAN0802            1.
+    SH080272  BAL0802            -1.   BAL0872             1.
+    SH080372  COST           1067.41   TRAN0803            1.
+    SH080372  BAL0803            -1.   BAL0872             1.
+    SH080472  COST             986.1   TRAN0804            1.
+    SH080472  BAL0804            -1.   BAL0872             1.
+    SH080572  COST           1319.99   TRAN0805            1.
+    SH080572  BAL0805            -1.   BAL0872             1.
+    SH080872  COST             986.1   TRAN0808            1.
+    SH080872  BAL0883            -1.   BAL0872             1.
+    SH080173  COST             674.7   TRAN0801            1.
+    SH080173  BAL0801            -1.   BAL0873             1.
+    SH080273  COST            631.45   TRAN0802            1.
+    SH080273  BAL0802            -1.   BAL0873             1.
+    SH080373  COST            584.74   TRAN0803            1.
+    SH080373  BAL0803            -1.   BAL0873             1.
+    SH080473  COST            790.61   TRAN0804            1.
+    SH080473  BAL0804            -1.   BAL0873             1.
+    SH080573  COST            975.72   TRAN0805            1.
+    SH080573  BAL0805            -1.   BAL0873             1.
+    SH080673  COST            527.65   TRAN0806            1.
+    SH080673  BAL0852            -1.   BAL0873             1.
+    SH080873  COST            871.92   TRAN0808            1.
+    SH080873  BAL0883            -1.   BAL0873             1.
+    SH080174  COST            948.04   TRAN0801            1.
+    SH080174  BAL0801            -1.   BAL0874             1.
+    SH080274  COST             363.3   TRAN0802            1.
+    SH080274  BAL0802            -1.   BAL0874             1.
+    SH080374  COST             986.1   TRAN0803            1.
+    SH080374  BAL0803            -1.   BAL0874             1.
+    SH080474  COST           1102.01   TRAN0804            1.
+    SH080474  BAL0804            -1.   BAL0874             1.
+    SH080574  COST           1268.09   TRAN0805            1.
+    SH080574  BAL0805            -1.   BAL0874             1.
+    SH080874  COST           1070.87   TRAN0808            1.
+    SH080874  BAL0883            -1.   BAL0874             1.
+    SH080275  COST            958.42   TRAN0802            1.
+    SH080275  BAL0802            -1.   BAL0875             1.
+    SH080176  COST            799.26   TRAN0801            1.
+    SH080176  BAL0801            -1.   BAL0876             1.
+    SH080276  COST            693.73   TRAN0802            1.
+    SH080276  BAL0802            -1.   BAL0876             1.
+    SH080376  COST            697.19   TRAN0803            1.
+    SH080376  BAL0803            -1.   BAL0876             1.
+    SH080476  COST            1089.9   TRAN0804            1.
+    SH080476  BAL0804            -1.   BAL0876             1.
+    SH080576  COST            1089.9   TRAN0805            1.
+    SH080576  BAL0805            -1.   BAL0876             1.
+    SH080676  COST            659.13   TRAN0806            1.
+    SH080676  BAL0852            -1.   BAL0876             1.
+    SH080876  COST           1344.21   TRAN0808            1.
+    SH080876  BAL0883            -1.   BAL0876             1.
+    SH080177  COST            752.55   TRAN0801            1.
+    SH080177  BAL0801            -1.   BAL0877             1.
+    SH080277  COST            470.56   TRAN0802            1.
+    SH080277  BAL0802            -1.   BAL0877             1.
+    SH080377  COST            797.53   TRAN0803            1.
+    SH080377  BAL0803            -1.   BAL0877             1.
+    SH080477  COST            693.73   TRAN0804            1.
+    SH080477  BAL0804            -1.   BAL0877             1.
+    SH080577  COST             968.8   TRAN0805            1.
+    SH080577  BAL0805            -1.   BAL0877             1.
+    SH080877  COST             553.6   TRAN0808            1.
+    SH080877  BAL0883            -1.   BAL0877             1.
+    SH080178  COST           1316.53   TRAN0801            1.
+    SH080178  BAL0801            -1.   BAL0878             1.
+    SH080278  COST            764.66   TRAN0802            1.
+    SH080278  BAL0802            -1.   BAL0878             1.
+    SH080378  COST           1354.59   TRAN0803            1.
+    SH080378  BAL0803            -1.   BAL0878             1.
+    SH080478  COST           1185.05   TRAN0804            1.
+    SH080478  BAL0804            -1.   BAL0878             1.
+    SH080578  COST           1520.67   TRAN0805            1.
+    SH080578  BAL0805            -1.   BAL0878             1.
+    SH080878  COST           1325.18   TRAN0808            1.
+    SH080878  BAL0883            -1.   BAL0878             1.
+    SH080179  COST           1236.95   TRAN0801            1.
+    SH080179  BAL0801            -1.   BAL0879             1.
+    SH080279  COST            465.37   TRAN0802            1.
+    SH080279  BAL0802            -1.   BAL0879             1.
+    SH080379  COST           1195.43   TRAN0803            1.
+    SH080379  BAL0803            -1.   BAL0879             1.
+    SH080479  COST            1245.6   TRAN0804            1.
+    SH080479  BAL0804            -1.   BAL0879             1.
+    SH080879  COST           1221.38   TRAN0808            1.
+    SH080879  BAL0883            -1.   BAL0879             1.
+    SH080180  COST            548.41   TRAN0801            1.
+    SH080180  BAL0801            -1.   BAL0880             1.
+    SH080280  COST            683.35   TRAN0802            1.
+    SH080280  BAL0802            -1.   BAL0880             1.
+    SH080380  COST            756.01   TRAN0803            1.
+    SH080380  BAL0803            -1.   BAL0880             1.
+    SH080480  COST            647.02   TRAN0804            1.
+    SH080480  BAL0804            -1.   BAL0880             1.
+    SH080580  COST            873.65   TRAN0805            1.
+    SH080580  BAL0805            -1.   BAL0880             1.
+    SH080880  COST             415.2   TRAN0808            1.
+    SH080880  BAL0883            -1.   BAL0880             1.
+    SH080182  COST           1006.86   TRAN0801            1.
+    SH080182  BAL0801            -1.   BAL0882             1.
+    SH080282  COST            569.17   TRAN0802            1.
+    SH080282  BAL0802            -1.   BAL0882             1.
+    SH080382  COST           1133.15   TRAN0803            1.
+    SH080382  BAL0803            -1.   BAL0882             1.
+    SH080482  COST           1221.38   TRAN0804            1.
+    SH080482  BAL0804            -1.   BAL0882             1.
+    SH080582  COST           1984.31   TRAN0805            1.
+    SH080582  BAL0805            -1.   BAL0882             1.
+    SH080882  COST           1354.59   TRAN0808            1.
+    SH080882  BAL0883            -1.   BAL0882             1.
+    SH080183  COST            306.21   TRAN0801            1.
+    SH080183  BAL0801            -1.   BAL0883             1.
+    SH080283  COST             899.6   TRAN0802            1.
+    SH080283  BAL0802            -1.   BAL0883             1.
+    SH080383  COST            470.56   TRAN0803            1.
+    SH080383  BAL0803            -1.   BAL0883             1.
+    SH080483  COST            102.07   TRAN0804            1.
+    SH080483  BAL0804            -1.   BAL0883             1.
+    SH080583  COST            600.31   TRAN0805            1.
+    SH080583  BAL0805            -1.   BAL0883             1.
+    SH080683  COST            429.04   TRAN0806            1.
+    SH080683  BAL0852            -1.   BAL0883             1.
+    SH080184  COST            525.92   TRAN0801            1.
+    SH080184  BAL0801            -1.   BAL0884             1.
+    SH080284  COST            332.16   TRAN0802            1.
+    SH080284  BAL0802            -1.   BAL0884             1.
+    SH080384  COST            629.72   TRAN0803            1.
+    SH080384  BAL0803            -1.   BAL0884             1.
+    SH080484  COST             640.1   TRAN0804            1.
+    SH080484  BAL0804            -1.   BAL0884             1.
+    SH080584  COST             847.7   TRAN0805            1.
+    SH080584  BAL0805            -1.   BAL0884             1.
+    SH080684  COST            527.65   TRAN0806            1.
+    SH080684  BAL0852            -1.   BAL0884             1.
+    SH080884  COST            671.24   TRAN0808            1.
+    SH080884  BAL0883            -1.   BAL0884             1.
+    TRSH0101  COST               78.   TRAN0101           -1.
+    TRSH0102  COST               78.   TRAN0201           -1.
+    TRSH0103  COST               78.   TRAN0301           -1.
+    TRSH0104  COST             101.5   TRAN0401           -1.
+    TRSH0105  COST               78.   TRAN0501           -1.
+    TRSH0106  COST               78.   TRAN0601           -1.
+    TRSH0107  COST               78.   TRAN0701           -1.
+    TRSH0108  COST             101.5   TRAN0801           -1.
+    TRSH0201  COST               78.   TRAN0102           -1.
+    TRSH0202  COST               78.   TRAN0202           -1.
+    TRSH0203  COST               78.   TRAN0302           -1.
+    TRSH0204  COST             101.5   TRAN0402           -1.
+    TRSH0205  COST               78.   TRAN0502           -1.
+    TRSH0206  COST               78.   TRAN0602           -1.
+    TRSH0207  COST               78.   TRAN0702           -1.
+    TRSH0208  COST             101.5   TRAN0802           -1.
+    TRSH0301  COST               78.   TRAN0103           -1.
+    TRSH0302  COST               78.   TRAN0203           -1.
+    TRSH0303  COST               78.   TRAN0303           -1.
+    TRSH0304  COST             101.5   TRAN0403           -1.
+    TRSH0305  COST               78.   TRAN0503           -1.
+    TRSH0306  COST               78.   TRAN0603           -1.
+    TRSH0307  COST               78.   TRAN0703           -1.
+    TRSH0308  COST             101.5   TRAN0803           -1.
+    TRSH0401  COST               78.   TRAN0104           -1.
+    TRSH0402  COST               78.   TRAN0204           -1.
+    TRSH0403  COST               78.   TRAN0304           -1.
+    TRSH0404  COST             101.5   TRAN0404           -1.
+    TRSH0405  COST               78.   TRAN0504           -1.
+    TRSH0406  COST               78.   TRAN0604           -1.
+    TRSH0407  COST               78.   TRAN0704           -1.
+    TRSH0408  COST             101.5   TRAN0804           -1.
+    TRSH0501  COST               78.   TRAN0105           -1.
+    TRSH0502  COST               78.   TRAN0205           -1.
+    TRSH0503  COST               78.   TRAN0305           -1.
+    TRSH0504  COST             101.5   TRAN0405           -1.
+    TRSH0505  COST               78.   TRAN0505           -1.
+    TRSH0506  COST               78.   TRAN0605           -1.
+    TRSH0507  COST               78.   TRAN0705           -1.
+    TRSH0508  COST             101.5   TRAN0805           -1.
+    TRSH0601  COST               78.   TRAN0106           -1.
+    TRSH0602  COST               78.   TRAN0206           -1.
+    TRSH0603  COST               78.   TRAN0306           -1.
+    TRSH0604  COST             101.5   TRAN0406           -1.
+    TRSH0605  COST               78.   TRAN0506           -1.
+    TRSH0606  COST               78.   TRAN0606           -1.
+    TRSH0607  COST               78.   TRAN0706           -1.
+    TRSH0608  COST             101.5   TRAN0806           -1.
+    TRSH0701  COST               78.   TRAN0107           -1.
+    TRSH0702  COST               78.   TRAN0207           -1.
+    TRSH0703  COST               78.   TRAN0307           -1.
+    TRSH0704  COST             101.5   TRAN0407           -1.
+    TRSH0705  COST               78.   TRAN0507           -1.
+    TRSH0706  COST               78.   TRAN0607           -1.
+    TRSH0707  COST               78.   TRAN0707           -1.
+    TRSH0708  COST             101.5   TRAN0807           -1.
+    TRSH0801  COST               78.   TRAN0108           -1.
+    TRSH0802  COST               78.   TRAN0208           -1.
+    TRSH0803  COST               78.   TRAN0308           -1.
+    TRSH0804  COST             101.5   TRAN0408           -1.
+    TRSH0805  COST               78.   TRAN0508           -1.
+    TRSH0806  COST               78.   TRAN0608           -1.
+    TRSH0807  COST               78.   TRAN0708           -1.
+    TRSH0808  COST             101.5   TRAN0808           -1.
+RHS
+    RHS       REGMAX              7.   OVRMAX            126.
+    RHS       REGMAX01            3.   REGMAX02            3.
+    RHS       REGMAX04            3.   OVRMAX01           48.
+    RHS       OVRMAX02           48.   OVRMAX04           30.
+    RHS       BAL0102        .105342   BAL0104        .316026
+    RHS       BAL0106        .263355   BAL0107        1.15876
+    RHS       BAL0108        .948077   BAL0109        .421368
+    RHS       BAL0110         .57938   BAL0111        .632051
+    RHS       BAL0112        .526709   BAL0114        .421368
+    RHS       BAL0115        1.21143   BAL0116        .948077
+    RHS       BAL0117        1.05342   BAL0118        .421368
+    RHS       BAL0119        .684722   BAL0120        1.15876
+    RHS       BAL0121        1.10609   BAL0122        .684722
+    RHS       BAL0123         .57938   BAL0124       .0526709
+    RHS       BAL0125        .684722   BAL0126        .210684
+    RHS       BAL0127        .316026   BAL0128        .895406
+    RHS       BAL0129        .474038   BAL0130        .842735
+    RHS       BAL0131         .57938   BAL0132        1.00075
+    RHS       BAL0133        1.15876   BAL0134        1.05342
+    RHS       BAL0135        .632051   BAL0136        .368697
+    RHS       BAL0137        1.94882   BAL0138        1.79081
+    RHS       BAL0139        .368697   BAL0140        1.10609
+    RHS       BAL0141        .737393   BAL0142        .263355
+    RHS       BAL0143        1.52746   BAL0144        .895406
+    RHS       BAL0145        1.36944   BAL0146        .895406
+    RHS       BAL0147        .632051   BAL0148        .526709
+    RHS       BAL0149        .368697   BAL0150        .526709
+    RHS       BAL0151        .421368   BAL0153        1.00075
+    RHS       BAL0154        .421368   BAL0155        1.10609
+    RHS       BAL0156        .790064   BAL0157        .684722
+    RHS       BAL0158         2.0015   BAL0159        1.21143
+    RHS       BAL0160        1.21143   BAL0163        .526709
+    RHS       BAL0165        .210684   BAL0166        .263355
+    RHS       BAL0167        .210684   BAL0168        .105342
+    RHS       BAL0169        .158013   BAL0171        .948077
+    RHS       BAL0172        .210684   BAL0173        .158013
+    RHS       BAL0174        .105342   BAL0175        .210684
+    RHS       BAL0176       .0526709   BAL0177        1.00075
+    RHS       BAL0178        .842735   BAL0179        .105342
+    RHS       BAL0180        .263355   BAL0182        .316026
+    RHS       BAL0184        .316026   BAL0201        .130917
+    RHS       BAL0202        .261834   BAL0204        .785501
+    RHS       BAL0206        1.17825   BAL0207        3.79659
+    RHS       BAL0208        2.74925   BAL0209          1.571
+    RHS       BAL0210        2.09467   BAL0211        1.96375
+    RHS       BAL0212        1.83284   BAL0214        1.70192
+    RHS       BAL0215        6.15309   BAL0216        2.09467
+    RHS       BAL0217        2.09467   BAL0218          1.571
+    RHS       BAL0219        3.01109   BAL0220        3.01109
+    RHS       BAL0221          3.142   BAL0222        2.22559
+    RHS       BAL0223        2.22559   BAL0224        .130917
+    RHS       BAL0225        1.30917   BAL0226        .523667
+    RHS       BAL0227        1.17825   BAL0228          1.571
+    RHS       BAL0229        1.30917   BAL0230          1.571
+    RHS       BAL0231          1.571   BAL0232        1.96375
+    RHS       BAL0233        2.74925   BAL0234        2.09467
+    RHS       BAL0235        1.30917   BAL0236        .654584
+    RHS       BAL0237        3.66567   BAL0238          3.142
+    RHS       BAL0239          1.571   BAL0240        1.70192
+    RHS       BAL0241        1.17825   BAL0242        1.30917
+    RHS       BAL0243        4.18934   BAL0244        1.17825
+    RHS       BAL0245        2.22559   BAL0246        2.09467
+    RHS       BAL0247        1.44009   BAL0248        1.04733
+    RHS       BAL0249        .654584   BAL0250        .785501
+    RHS       BAL0251        .523667   BAL0253        2.22559
+    RHS       BAL0254        .654584   BAL0255        1.83284
+    RHS       BAL0256          1.571   BAL0257        1.30917
+    RHS       BAL0258        3.27292   BAL0259         2.3565
+    RHS       BAL0260        1.83284   BAL0263        .785501
+    RHS       BAL0265        .916418   BAL0266        .916418
+    RHS       BAL0267        .785501   BAL0268        .261834
+    RHS       BAL0269        .654584   BAL0271        3.27292
+    RHS       BAL0272        .392751   BAL0273        1.04733
+    RHS       BAL0274        .523667   BAL0275        .523667
+    RHS       BAL0276        .392751   BAL0277        3.53475
+    RHS       BAL0278        2.09467   BAL0279        .392751
+    RHS       BAL0280        .654584   BAL0282        1.04733
+    RHS       BAL0284        1.30917   BAL0302        .067364
+    RHS       BAL0307        .471548   BAL0308        .404184
+    RHS       BAL0309        .134728   BAL0310        1.48201
+    RHS       BAL0311        .067364   BAL0312        .067364
+    RHS       BAL0315        7.94895   BAL0316        .202092
+    RHS       BAL0321        .134728   BAL0327        .875732
+    RHS       BAL0329        .134728   BAL0331        .269456
+    RHS       BAL0333        .269456   BAL0336        .875732
+    RHS       BAL0337        .875732   BAL0338        .134728
+    RHS       BAL0339        .134728   BAL0340         .33682
+    RHS       BAL0341        .538912   BAL0342        .067364
+    RHS       BAL0343        3.70502   BAL0344        1.54937
+    RHS       BAL0345        .404184   BAL0346        3.03138
+    RHS       BAL0347        .404184   BAL0348        .067364
+    RHS       BAL0354        .067364   BAL0355        .134728
+    RHS       BAL0358        .067364   BAL0365        .134728
+    RHS       BAL0366        1.34728   BAL0367        .404184
+    RHS       BAL0368        1.75146   BAL0369        1.88619
+    RHS       BAL0371        5.72594   BAL0372         .67364
+    RHS       BAL0373        3.70502   BAL0374        1.95356
+    RHS       BAL0375        .269456   BAL0376        1.61674
+    RHS       BAL0377        1.41464   BAL0378        2.22301
+    RHS       BAL0379        3.16611   BAL0382        11.8561
+    RHS       BAL0384        1.34728   BAL0502        .135821
+    RHS       BAL0504        .543284   BAL0506        .543284
+    RHS       BAL0507         2.5806   BAL0508        2.03731
+    RHS       BAL0509        .814925   BAL0510        2.85224
+    RHS       BAL0511        1.08657   BAL0512        1.22239
+    RHS       BAL0514        1.35821   BAL0515        5.70448
+    RHS       BAL0516        3.12388   BAL0517        1.49403
+    RHS       BAL0518        1.35821   BAL0519        1.22239
+    RHS       BAL0520        1.35821   BAL0521        6.24776
+    RHS       BAL0522        .950746   BAL0523        1.08657
+    RHS       BAL0525        2.71642   BAL0526        .407463
+    RHS       BAL0527        1.90149   BAL0528        2.17313
+    RHS       BAL0529        1.76567   BAL0530        1.22239
+    RHS       BAL0531        1.49403   BAL0532        1.62985
+    RHS       BAL0533        3.39552   BAL0534        2.03731
+    RHS       BAL0535        .814925   BAL0536        .407463
+    RHS       BAL0537        3.39552   BAL0538         2.5806
+    RHS       BAL0539        1.08657   BAL0540        2.98806
+    RHS       BAL0541        1.49403   BAL0542        .679104
+    RHS       BAL0543        4.07463   BAL0544        .814925
+    RHS       BAL0545         3.2597   BAL0546        4.34627
+    RHS       BAL0547        2.03731   BAL0548        1.90149
+    RHS       BAL0549        .543284   BAL0550        1.90149
+    RHS       BAL0551        .407463   BAL0552        .135821
+    RHS       BAL0553        1.22239   BAL0554        .950746
+    RHS       BAL0555         3.2597   BAL0556        .950746
+    RHS       BAL0557        1.49403   BAL0558        3.66716
+    RHS       BAL0559         2.5806   BAL0560        2.17313
+    RHS       BAL0563        1.62985   BAL0565        1.35821
+    RHS       BAL0566        .679104   BAL0567        1.35821
+    RHS       BAL0568        .407463   BAL0569        .679104
+    RHS       BAL0571        4.21045   BAL0572        .679104
+    RHS       BAL0573        .950746   BAL0574        .679104
+    RHS       BAL0575        .271642   BAL0576        .407463
+    RHS       BAL0577        4.61791   BAL0578        2.03731
+    RHS       BAL0579        .407463   BAL0580        .543284
+    RHS       BAL0582        1.22239   BAL0584        1.62985
+    RHS       BAL0604       .0460795   BAL0606        .153598
+    RHS       BAL0607        .122879   BAL0608        .291837
+    RHS       BAL0609        .184318   BAL0610        .307197
+    RHS       BAL0611        .291837   BAL0612       .0614393
+    RHS       BAL0614        .445435   BAL0615        .368636
+    RHS       BAL0616       .0614393   BAL0617        .138238
+    RHS       BAL0618        .122879   BAL0619        .307197
+    RHS       BAL0620        .215038   BAL0621        .522234
+    RHS       BAL0622        .153598   BAL0623        .383996
+    RHS       BAL0625        .383996   BAL0626       .0460795
+    RHS       BAL0627       .0614393   BAL0628        .368636
+    RHS       BAL0629        .122879   BAL0630       .0614393
+    RHS       BAL0631       .0767991   BAL0632        .153598
+    RHS       BAL0633        .353276   BAL0634        .245757
+    RHS       BAL0635       .0460795   BAL0636       .0307197
+    RHS       BAL0637        .583673   BAL0638        .368636
+    RHS       BAL0639       .0767991   BAL0640        .122879
+    RHS       BAL0641       .0767991   BAL0642       .0767991
+    RHS       BAL0643        .215038   BAL0644       .0460795
+    RHS       BAL0645        .491514   BAL0646        .261117
+    RHS       BAL0647        .184318   BAL0648        .184318
+    RHS       BAL0649        .138238   BAL0650        .107519
+    RHS       BAL0651        .184318   BAL0653        .568314
+    RHS       BAL0654       .0614393   BAL0655        .552954
+    RHS       BAL0656        .276477   BAL0657        .153598
+    RHS       BAL0658        .552954   BAL0659        .460795
+    RHS       BAL0660        .460795   BAL0663        .138238
+    RHS       BAL0665        .107519   BAL0666       .0767991
+    RHS       BAL0667       .0614393   BAL0668       .0614393
+    RHS       BAL0669       .0614393   BAL0671        .414715
+    RHS       BAL0672        .107519   BAL0673       .0767991
+    RHS       BAL0674       .0307197   BAL0676       .0767991
+    RHS       BAL0677        .138238   BAL0678        .291837
+    RHS       BAL0679       .0460795   BAL0680       .0460795
+    RHS       BAL0682       .0614393   BAL0684        .168958
+    RHS       BAL0706        .125786   BAL0707        .330189
+    RHS       BAL0708        .188679   BAL0709        .125786
+    RHS       BAL0710        .235849   BAL0711        .235849
+    RHS       BAL0712        .141509   BAL0714        .204403
+    RHS       BAL0715        .471698   BAL0716        .172956
+    RHS       BAL0717        .204403   BAL0718        .235849
+    RHS       BAL0719        .393082   BAL0720        .408805
+    RHS       BAL0721        .361635   BAL0722        .188679
+    RHS       BAL0723        .220126   BAL0725       .0786164
+    RHS       BAL0726       .0786164   BAL0727       .0943396
+    RHS       BAL0728        .267296   BAL0729        .157233
+    RHS       BAL0730        .393082   BAL0731        .220126
+    RHS       BAL0732        .188679   BAL0733        .204403
+    RHS       BAL0734        .172956   BAL0735        .157233
+    RHS       BAL0736       .0943396   BAL0737        .408805
+    RHS       BAL0738        .707547   BAL0739        .141509
+    RHS       BAL0740        .110063   BAL0741        .157233
+    RHS       BAL0742        .125786   BAL0743        .283019
+    RHS       BAL0744        .235849   BAL0745        .471698
+    RHS       BAL0746        .220126   BAL0747        .125786
+    RHS       BAL0748        .141509   BAL0749        .188679
+    RHS       BAL0750        .235849   BAL0751        .251572
+    RHS       BAL0753        .707547   BAL0754        .172956
+    RHS       BAL0755        .314465   BAL0756        .424528
+    RHS       BAL0757        .204403   BAL0758        .896226
+    RHS       BAL0759        .220126   BAL0760        .550314
+    RHS       BAL0763        .220126   BAL0765       .0786164
+    RHS       BAL0766       .0628931   BAL0767       .0628931
+    RHS       BAL0768       .0471698   BAL0769       .0314465
+    RHS       BAL0771       .0943396   BAL0772       .0628931
+    RHS       BAL0773       .0943396   BAL0774       .0157233
+    RHS       BAL0776       .0471698   BAL0777       .0786164
+    RHS       BAL0778        .141509   BAL0779       .0314465
+    RHS       BAL0780       .0471698   BAL0782       .0786164
+    RHS       BAL0784        .157233
+ENDATA
diff --git a/demos/ppl_lpsol/examples/unboundedmin.mps b/demos/ppl_lpsol/examples/unboundedmin.mps
new file mode 100644
index 0000000..9f3549d
--- /dev/null
+++ b/demos/ppl_lpsol/examples/unboundedmin.mps
@@ -0,0 +1,21 @@
+NAME          from_lp_file
+ROWS
+ N  r_000000
+ L  C1
+ L  r_000002
+COLUMNS
+    MARK0000  'MARKER'                 'INTORG'
+    x1        r_000000  1
+    x1        C1        2
+    x1        r_000002  -4
+    x2        r_000000  -2
+    x2        C1        -1
+    x2        r_000002  -4
+    MARK0001  'MARKER'                 'INTEND'
+RHS
+    RHS       C1        0
+    RHS       r_000002  0
+BOUNDS
+ PL FOO       x1
+ PL FOO       x2
+ENDATA
diff --git a/demos/ppl_lpsol/expected_int16 b/demos/ppl_lpsol/expected_int16
new file mode 100644
index 0000000..1d892f2
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16
@@ -0,0 +1,977 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int16_a b/demos/ppl_lpsol/expected_int16_a
new file mode 100644
index 0000000..2bfba03
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16_a
@@ -0,0 +1,183 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int32 b/demos/ppl_lpsol/expected_int32
new file mode 100644
index 0000000..c87cc4d
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32
@@ -0,0 +1,997 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int32_a b/demos/ppl_lpsol/expected_int32_a
new file mode 100644
index 0000000..3db8071
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32_a
@@ -0,0 +1,165 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  p0033.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int64 b/demos/ppl_lpsol/expected_int64
new file mode 100644
index 0000000..7123aa8
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64
@@ -0,0 +1,1046 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  rout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int64_a b/demos/ppl_lpsol/expected_int64_a
new file mode 100644
index 0000000..61f3bf8
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64_a
@@ -0,0 +1,207 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int8 b/demos/ppl_lpsol/expected_int8
new file mode 100644
index 0000000..cee5931
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8
@@ -0,0 +1,181 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  opt1217.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_int8_a b/demos/ppl_lpsol/expected_int8_a
new file mode 100644
index 0000000..f00b5d1
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8_a
@@ -0,0 +1,161 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n  egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+PPL error code -6: Negative overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+PPL error code -6: Positive overflow.
+*** ppl_lpsol -e -r  -oobtained sample.mps
+PPL error code -6: Negative overflow.
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+PPL error code -6: Positive overflow.
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+PPL error code -6: Positive overflow.
diff --git a/demos/ppl_lpsol/expected_mpz b/demos/ppl_lpsol/expected_mpz
new file mode 100644
index 0000000..2bb4f16
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz
@@ -0,0 +1,6171 @@
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  egout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  lseu.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  markshare2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mas76.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  noswot.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  opt1217.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  p0033.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  pk1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  rout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -c -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -c -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -m p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -M p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m adlittle.mps
+Optimum value: 225494.9632
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M adlittle.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 58.1560164
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 39.94173069
+X16 = 61.64537738
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 366.4378962
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 17.50496094
+X38 = 157.5682954
+X39 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m blend.mps
+Optimum value: -30.81214985
+Optimum location:
+1 = 20.94480195
+2 = 10.17092161
+3 = 11.24735865
+4 = 2.981097124
+5 = 0.6597035933
+6 = 0.4759263446
+7 = 0
+8 = 10.10117614
+9 = 0
+10 = 1.679178924
+11 = 0
+12 = 10.10117614
+13 = 0
+14 = 11.78035507
+15 = 0
+16 = 0.4067430357
+17 = 0
+18 = 2.173256964
+19 = 2.018559906
+20 = 4.843256964
+21 = 0
+22 = 3.13818313
+23 = 1.149909949
+24 = 1.396291081
+25 = 0
+26 = 0
+27 = 0
+28 = 0
+29 = 0.3835003722
+30 = 0
+31 = 4.424431137
+32 = 0
+33 = 1.149909949
+34 = 1.396291081
+35 = 0.7485700927
+36 = 21.63838697
+37 = 8.102702633
+38 = 0.7107761404
+39 = 0.4817893472
+40 = 0
+41 = 4.892936372
+42 = 0
+43 = 0.4416752608
+44 = 14.28573702
+45 = 6.527177121
+46 = 2.005816841
+47 = 0
+48 = 0
+49 = 0.7713285688
+50 = 4.87625743
+51 = 0.2242247192
+52 = 1.811155615
+53 = 7.877627559
+54 = 0.3201545422
+55 = 0.9892470535
+56 = 0.4439079385
+57 = 1.433154992
+58 = 0
+59 = 0
+60 = 0
+61 = 3.079217438
+62 = 0.795583754
+63 = 3.874801192
+64 = 0.7749576722
+65 = 1.83076589
+66 = 0
+67 = 0
+68 = 0.06587344195
+69 = 0.7889117798
+70 = 3.460508784
+71 = 2.750888679
+72 = 0
+73 = 0
+74 = 0
+75 = 0
+76 = 0
+77 = 0.1693961964
+78 = 0
+79 = 1.154801147
+80 = 0
+81 = 0.8033012352
+82 = 26.03036862
+83 = 87.09497412
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M blend.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m egout.mps
+Optimum value: 149.5887662
+Optimum location:
+I.001... = 0.02093301435
+I.001003 = 0
+I.002003 = 0
+I.002... = 0.00521189337
+I.003005 = 0
+I.004005 = 0
+I.004... = 0.06758373206
+I.005007 = 0
+I.006007 = 0.03879015721
+I.007008 = 0.04853041695
+I.008... = 0.04853041695
+I.008009 = 0
+I.010012 = 0.009654818865
+I.011012 = 0.1833561176
+I.012... = 0.1930109364
+I.012013 = 0
+I.013016 = 0.03964456596
+I.014015 = 0.002648667122
+I.015016 = 0.01324333561
+I.016... = 0.05288790157
+I.016017 = 0
+I.017018 = 0.0005980861244
+I.009018 = 0.002392344498
+I.018019 = 0.002990430622
+I.019024 = 0.02358168148
+I.024... = 0.0241797676
+I.023024 = 0.0005980861244
+I.022023 = 0
+I.020022 = 0.003332194122
+I.021022 = 0.06331168831
+I.022... = 0.06664388243
+I.024026 = 0
+I.025026 = 0
+I.025... = 0.1642173616
+I.026027 = 0.08962747779
+I.027... = 0.08962747779
+I.027032 = 0
+I.030031 = 0.002392344498
+I.031032 = 0.0534859877
+I.029031 = 0.0487012987
+I.028029 = 0
+I.028... = 0.007518796992
+I.032033 = 0.0534859877
+I.033037 = 0.05510936432
+I.036037 = 0.008885850991
+I.034036 = 0.001623376623
+I.035036 = 0.002392344498
+I.037038 = 0.06399521531
+I.038040 = 0.109278879
+I.039040 = 0.04545454545
+I.040... = 0.161226931
+I.041... = 0.04340396446
+I.040041 = 0
+I.041042 = 0
+I.042... = 0.05502392344
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 2.45
+F.001003 = 0
+F.002003 = 0
+F.002... = 0.61
+F.003005 = 0
+F.004005 = 0
+F.004... = 7.91
+F.005007 = 0
+F.006007 = 4.54
+F.007008 = 5.68
+F.008... = 5.68
+F.008009 = 0
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 22.59
+F.012013 = 0
+F.013016 = 4.64
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 6.19
+F.016017 = 0
+F.017018 = 0.07
+F.009018 = 0.28
+F.018019 = 0.35
+F.019024 = 2.76
+F.024... = 2.83
+F.023024 = 0.07
+F.022023 = 0
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 7.8
+F.024026 = 0
+F.025026 = 0
+F.025... = 19.22
+F.026027 = 10.49
+F.027... = 10.49
+F.027032 = 0
+F.030031 = 0.28
+F.031032 = 6.26
+F.029031 = 5.7
+F.028029 = 0
+F.028... = 0.88
+F.032033 = 6.26
+F.033037 = 6.45
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 7.49
+F.038040 = 12.79
+F.039040 = 5.32
+F.040... = 18.87
+F.041... = 5.08
+F.040041 = 0
+F.041042 = 0
+F.042... = 6.44
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M egout.mps
+Optimum value: 964.30053
+Optimum location:
+I.001... = 1
+I.001003 = 1
+I.002003 = 1
+I.002... = 1
+I.003005 = 1
+I.004005 = 1
+I.004... = 1
+I.005007 = 1
+I.006007 = 1
+I.007008 = 1
+I.008... = 1
+I.008009 = 1
+I.010012 = 1
+I.011012 = 1
+I.012... = 1
+I.012013 = 1
+I.013016 = 1
+I.014015 = 1
+I.015016 = 1
+I.016... = 1
+I.016017 = 1
+I.017018 = 1
+I.009018 = 1
+I.018019 = 1
+I.019024 = 1
+I.024... = 1
+I.023024 = 1
+I.022023 = 1
+I.020022 = 1
+I.021022 = 1
+I.022... = 1
+I.024026 = 1
+I.025026 = 1
+I.025... = 1
+I.026027 = 1
+I.027... = 1
+I.027032 = 1
+I.030031 = 1
+I.031032 = 1
+I.029031 = 1
+I.028029 = 1
+I.028... = 1
+I.032033 = 1
+I.033037 = 1
+I.036037 = 1
+I.034036 = 1
+I.035036 = 1
+I.037038 = 1
+I.038040 = 1
+I.039040 = 1
+I.040... = 1
+I.041... = 1
+I.040041 = 1
+I.041042 = 1
+I.042... = 1
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 0
+F.001003 = 2.45
+F.002003 = 0.61
+F.002... = 0
+F.003005 = 3.06
+F.004005 = 7.91
+F.004... = 0
+F.005007 = 10.97
+F.006007 = 4.54
+F.007008 = 16.65
+F.008... = 0
+F.008009 = 16.65
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 0
+F.012013 = 22.59
+F.013016 = 27.23
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 0
+F.016017 = 28.78
+F.017018 = 28.85
+F.009018 = 16.93
+F.018019 = 45.78
+F.019024 = 48.19
+F.024... = 0
+F.023024 = 7.87
+F.022023 = 7.8
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 0
+F.024026 = 56.06
+F.025026 = 19.22
+F.025... = 0
+F.026027 = 85.77
+F.027... = 0
+F.027032 = 85.77
+F.030031 = 0.28
+F.031032 = 7.14
+F.029031 = 6.58
+F.028029 = 0.88
+F.028... = 0
+F.032033 = 92.91
+F.033037 = 93.1
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 94.14
+F.038040 = 99.44
+F.039040 = 5.32
+F.040... = 0
+F.041... = 0
+F.040041 = 105.52
+F.041042 = 110.6
+F.042... = 117.04
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m kb2.mps
+Optimum value: -1749.90013
+Optimum location:
+BAL.3EBW = 0.811823571
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 4.672552268
+BP8.3EBW = 25.06112416
+BTO.3EBW = 5
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 9.550968062
+BLV.3PBW = 0
+BN4.3PBW = 2.506552313
+BP8.3PBW = 8.779496866
+BTO.3PBW = 0
+BAL.3RBW = 9.188176429
+BHC.3RBW = 20
+BLC.3RBW = 15.44903194
+BLV.3RBW = 12
+BN4.3RBW = 8.391585075
+BP8.3RBW = 1.159378972
+BTO.3RBW = 0
+D3T...BW = 122.5706897
+EAL...BW = 10
+EHC...BW = 20
+ELC...BW = 25
+ELV...BW = 12
+EN4...BW = 15.57068966
+EP8...BW = 35
+ETO...BW = 5
+M3..3TBW = 122.5706897
+QPB73EBW = 15.05088815
+QVO73EBW = 35.5455
+QVO73PBW = 20.83701724
+QPB73RBW = 49.6741723
+QVO73RBW = 66.18817241
+WMO73EBW = 3214.889184
+WRO73EBW = 3597.519648
+WMO73PBW = 1770.361014
+WRO73PBW = 2009.742955
+WMO73RBW = 5651.99315
+WRO73RBW = 6262.646875
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M kb2.mps
+Optimum value: 0
+Optimum location:
+BAL.3EBW = 0
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 0
+BP8.3EBW = 0
+BTO.3EBW = 0
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 0
+BLV.3PBW = 0
+BN4.3PBW = 0
+BP8.3PBW = 0
+BTO.3PBW = 0
+BAL.3RBW = 0
+BHC.3RBW = 0
+BLC.3RBW = 0
+BLV.3RBW = 0
+BN4.3RBW = 0
+BP8.3RBW = 0
+BTO.3RBW = 0
+D3T...BW = 0
+EAL...BW = 0
+EHC...BW = 0
+ELC...BW = 0
+ELV...BW = 0
+EN4...BW = 0
+EP8...BW = 0
+ETO...BW = 0
+M3..3TBW = 0
+QPB73EBW = 0
+QVO73EBW = 0
+QVO73PBW = 0
+QPB73RBW = 0
+QVO73RBW = 0
+WMO73EBW = 0
+WRO73EBW = 0
+WMO73PBW = 0
+WRO73PBW = 0
+WMO73RBW = 0
+WRO73RBW = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m lseu.mps
+Optimum value: 834.6823529
+Optimum location:
+C101 = 1
+C102 = 1
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 1
+C108 = 0
+C109 = 0
+C110 = 0
+C111 = 0.4367816092
+C112 = 0.3367816092
+C113 = 0
+C114 = 0.2264367816
+C115 = 0
+C116 = 0
+C117 = 0
+C118 = 0
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 0
+C123 = 0
+C124 = 0
+C125 = 0
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0.6117647059
+C130 = 0.155
+C131 = 0
+C132 = 0
+C133 = 0
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 1
+C140 = 0
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 0.38
+C145 = 0
+C146 = 0
+C147 = 0.62
+C148 = 0
+C149 = 0
+C150 = 0.1
+C151 = 0.9
+C152 = 0
+C153 = 0
+C154 = 0
+C155 = 0
+C156 = 1
+C157 = 0
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 0
+C164 = 0.9043285239
+C165 = 0.09567147614
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 0
+C177 = 0
+C178 = 0
+C179 = 0
+C180 = 0
+C181 = 0
+C182 = 0
+C183 = 0
+C184 = 0
+C185 = 0
+C186 = 0
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0
+C132 = 0
+C133 = 1
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0.4643273602
+x14 = 0
+x15 = 1
+x16 = 0.9623071054
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0
+x22 = 1
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 1
+x29 = 1
+x30 = 1
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 1
+x37 = 0.839896525
+x38 = 0
+x39 = 0
+x40 = 1
+x41 = 1
+x42 = 0
+x43 = 1
+x44 = 0.09199314836
+x45 = 1
+x46 = 1
+x47 = 1
+x48 = 1
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 1
+x54 = 1
+x55 = 0
+x56 = 0.3536953199
+x57 = 1
+x58 = 0
+x59 = 0
+x60 = 1
+x61 = 0
+x62 = 0.2898890259
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare1.mps
+Optimum value: 7286
+Optimum location:
+x1 = 1116
+x2 = 0
+x3 = 1325
+x4 = 0
+x5 = 1353
+x6 = 0
+x7 = 1169
+x8 = 0
+x9 = 1160
+x10 = 0
+x11 = 1163
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m markshare2.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0.3717008822
+x22 = 0.1692962317
+x23 = 1
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 1
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 1
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 1
+x47 = 0
+x48 = 0
+x49 = 0.01751673708
+x50 = 0.1466102207
+x51 = 0.3205265241
+x52 = 1
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 1
+x62 = 1
+x63 = 1
+x64 = 1
+x65 = 0.4427598921
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 1
+x73 = 0.6098932051
+x74 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M markshare2.mps
+Optimum value: 10512
+Optimum location:
+x1 = 1324
+x2 = 0
+x3 = 1554
+x4 = 0
+x5 = 1429
+x6 = 0
+x7 = 1686
+x8 = 0
+x9 = 1482
+x10 = 0
+x11 = 1613
+x12 = 0
+x13 = 1424
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas76.mps
+Optimum value: 38893.90364
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 1
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 1
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0.6025695431
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0.6033373468
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 1
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0.09549689808
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0.9782647972
+x85 = 0
+x86 = 0.1119635576
+x87 = 0
+x88 = 1
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0.3920130219
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 0.1417811414
+x123 = 0
+x124 = 0.5090665566
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6649413383
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0.8642716976
+x149 = 0
+x150 = 0.03629410141
+x151 = 38893.90349
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mas76.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 0
+x15 = 1
+x16 = 1
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 1
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 1
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 1
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 1
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 1
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m noswot.mps
+Optimum value: -43
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463423
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0.9583331684
+x52 = 9.1999988
+x53 = 1
+x54 = 9.6000004
+x55 = 1
+x56 = 9.6000004
+x57 = 1
+x58 = 9.6000004
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M noswot.mps
+Optimum value: -5
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463423
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m opt1217.mps
+Optimum value: -20.02139037
+Optimum location:
+x1 = 20.02139037
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0.003565062389
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 1
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 1
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0.005347593583
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 1
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 1
+x124 = 1
+x125 = 0.3368983957
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0.6631016043
+x162 = 0
+x163 = 0
+x164 = 0.6737967914
+x165 = 1
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 1
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 1
+x194 = 1
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.3368983957
+x210 = 1
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 0
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 0
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0
+x250 = 0
+x251 = 0
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 0.3368983957
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 1
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 1
+x304 = 0.3262032086
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0.3565062389
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0.6541889483
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 1
+x344 = 1
+x345 = 0.5026737968
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0.3368983957
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 1
+x403 = 1
+x404 = 1
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 0
+x430 = 0
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 0
+x455 = 0
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 1
+x464 = 0
+x465 = 0
+x466 = 1
+x467 = 0
+x468 = 0.5026737968
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0.6631016043
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 0
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 0
+x505 = 0
+x506 = 0
+x507 = 1
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0.7896613191
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0.6631016043
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 1
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 0
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 1
+x554 = 0.5026737968
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0.4973262032
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0.4973262032
+x584 = 1
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 0
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 0
+x595 = 0
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0.4973262032
+x603 = 0
+x604 = 0
+x605 = 0.3458110517
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 1
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 1
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0.5026737968
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 0
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 0
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0.5026737968
+x670 = 0
+x671 = 1
+x672 = 0
+x673 = 1
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 0
+x697 = 0
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 0
+x706 = 0
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0.6631016043
+x742 = 0.1408199643
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0.991087344
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 0
+x751 = 0
+x752 = 0
+x753 = 0.4973262032
+x754 = 0
+x755 = 0.2103386809
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 0
+x761 = 0
+x762 = 0
+x763 = 0
+x764 = 0
+x765 = 0
+x766 = 0
+x767 = 0
+x768 = 0
+x769 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M opt1217.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 1
+x119 = 1
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0
+x204 = 0
+x205 = 0
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0
+x210 = 0
+x211 = 0
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0
+x216 = 0
+x217 = 0
+x218 = 0
+x219 = 0
+x220 = 0
+x221 = 1
+x222 = 0
+x223 = 0
+x224 = 0
+x225 = 0
+x226 = 1
+x227 = 0
+x228 = 1
+x229 = 1
+x230 = 0
+x231 = 0
+x232 = 0
+x233 = 0
+x234 = 0
+x235 = 0
+x236 = 1
+x237 = 0
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 1
+x244 = 0
+x245 = 0
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 0
+x253 = 0
+x254 = 0
+x255 = 0
+x256 = 0
+x257 = 0
+x258 = 0
+x259 = 0
+x260 = 0
+x261 = 0
+x262 = 0
+x263 = 0
+x264 = 0
+x265 = 0
+x266 = 0
+x267 = 0
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0
+x284 = 0
+x285 = 0
+x286 = 0
+x287 = 0
+x288 = 0
+x289 = 1
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 1
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 1
+x378 = 1
+x379 = 1
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+x423 = 0
+x424 = 0
+x425 = 0
+x426 = 0
+x427 = 0
+x428 = 0
+x429 = 1
+x430 = 1
+x431 = 0
+x432 = 0
+x433 = 0
+x434 = 0
+x435 = 0
+x436 = 0
+x437 = 0
+x438 = 0
+x439 = 0
+x440 = 0
+x441 = 0
+x442 = 0
+x443 = 0
+x444 = 0
+x445 = 0
+x446 = 0
+x447 = 0
+x448 = 0
+x449 = 0
+x450 = 0
+x451 = 0
+x452 = 0
+x453 = 0
+x454 = 1
+x455 = 1
+x456 = 0
+x457 = 0
+x458 = 0
+x459 = 0
+x460 = 0
+x461 = 0
+x462 = 0
+x463 = 0
+x464 = 0
+x465 = 0
+x466 = 0
+x467 = 0
+x468 = 0
+x469 = 0
+x470 = 0
+x471 = 0
+x472 = 0
+x473 = 0
+x474 = 0
+x475 = 0
+x476 = 0
+x477 = 0
+x478 = 0
+x479 = 0
+x480 = 0
+x481 = 0
+x482 = 0
+x483 = 0
+x484 = 0
+x485 = 0
+x486 = 0
+x487 = 0
+x488 = 0
+x489 = 0
+x490 = 0
+x491 = 0
+x492 = 0
+x493 = 0
+x494 = 1
+x495 = 0
+x496 = 0
+x497 = 0
+x498 = 0
+x499 = 0
+x500 = 0
+x501 = 0
+x502 = 0
+x503 = 0
+x504 = 1
+x505 = 1
+x506 = 0
+x507 = 0
+x508 = 0
+x509 = 0
+x510 = 0
+x511 = 0
+x512 = 0
+x513 = 0
+x514 = 0
+x515 = 0
+x516 = 0
+x517 = 0
+x518 = 0
+x519 = 0
+x520 = 0
+x521 = 0
+x522 = 0
+x523 = 0
+x524 = 0
+x525 = 0
+x526 = 0
+x527 = 0
+x528 = 0
+x529 = 0
+x530 = 0
+x531 = 0
+x532 = 0
+x533 = 0
+x534 = 0
+x535 = 0
+x536 = 0
+x537 = 0
+x538 = 0
+x539 = 0
+x540 = 1
+x541 = 0
+x542 = 0
+x543 = 0
+x544 = 0
+x545 = 0
+x546 = 0
+x547 = 0
+x548 = 0
+x549 = 0
+x550 = 0
+x551 = 0
+x552 = 0
+x553 = 0
+x554 = 0
+x555 = 0
+x556 = 0
+x557 = 0
+x558 = 0
+x559 = 0
+x560 = 0
+x561 = 0
+x562 = 0
+x563 = 0
+x564 = 0
+x565 = 0
+x566 = 0
+x567 = 0
+x568 = 0
+x569 = 0
+x570 = 0
+x571 = 0
+x572 = 0
+x573 = 0
+x574 = 0
+x575 = 0
+x576 = 0
+x577 = 0
+x578 = 0
+x579 = 0
+x580 = 0
+x581 = 0
+x582 = 0
+x583 = 0
+x584 = 0
+x585 = 0
+x586 = 0
+x587 = 0
+x588 = 0
+x589 = 1
+x590 = 0
+x591 = 0
+x592 = 0
+x593 = 0
+x594 = 1
+x595 = 1
+x596 = 0
+x597 = 0
+x598 = 0
+x599 = 0
+x600 = 0
+x601 = 0
+x602 = 0
+x603 = 0
+x604 = 0
+x605 = 0
+x606 = 0
+x607 = 0
+x608 = 0
+x609 = 0
+x610 = 0
+x611 = 0
+x612 = 0
+x613 = 0
+x614 = 0
+x615 = 0
+x616 = 0
+x617 = 0
+x618 = 0
+x619 = 0
+x620 = 0
+x621 = 0
+x622 = 0
+x623 = 0
+x624 = 0
+x625 = 0
+x626 = 0
+x627 = 0
+x628 = 0
+x629 = 0
+x630 = 0
+x631 = 0
+x632 = 0
+x633 = 0
+x634 = 0
+x635 = 0
+x636 = 0
+x637 = 0
+x638 = 0
+x639 = 0
+x640 = 0
+x641 = 0
+x642 = 0
+x643 = 0
+x644 = 0
+x645 = 0
+x646 = 0
+x647 = 0
+x648 = 0
+x649 = 0
+x650 = 0
+x651 = 0
+x652 = 1
+x653 = 0
+x654 = 0
+x655 = 0
+x656 = 1
+x657 = 0
+x658 = 0
+x659 = 0
+x660 = 0
+x661 = 0
+x662 = 0
+x663 = 0
+x664 = 0
+x665 = 0
+x666 = 0
+x667 = 0
+x668 = 0
+x669 = 0
+x670 = 0
+x671 = 0
+x672 = 0
+x673 = 0
+x674 = 0
+x675 = 0
+x676 = 0
+x677 = 0
+x678 = 0
+x679 = 0
+x680 = 0
+x681 = 0
+x682 = 0
+x683 = 0
+x684 = 0
+x685 = 0
+x686 = 0
+x687 = 0
+x688 = 0
+x689 = 0
+x690 = 0
+x691 = 0
+x692 = 0
+x693 = 0
+x694 = 0
+x695 = 0
+x696 = 1
+x697 = 1
+x698 = 0
+x699 = 0
+x700 = 0
+x701 = 0
+x702 = 0
+x703 = 0
+x704 = 0
+x705 = 1
+x706 = 1
+x707 = 0
+x708 = 0
+x709 = 0
+x710 = 0
+x711 = 0
+x712 = 0
+x713 = 0
+x714 = 0
+x715 = 0
+x716 = 0
+x717 = 0
+x718 = 0
+x719 = 0
+x720 = 0
+x721 = 0
+x722 = 0
+x723 = 0
+x724 = 0
+x725 = 0
+x726 = 0
+x727 = 0
+x728 = 0
+x729 = 0
+x730 = 0
+x731 = 0
+x732 = 0
+x733 = 0
+x734 = 0
+x735 = 0
+x736 = 0
+x737 = 0
+x738 = 0
+x739 = 0
+x740 = 0
+x741 = 0
+x742 = 0
+x743 = 0
+x744 = 0
+x745 = 0
+x746 = 0
+x747 = 0
+x748 = 0
+x749 = 0
+x750 = 1
+x751 = 0
+x752 = 0
+x753 = 0
+x754 = 0
+x755 = 0
+x756 = 0
+x757 = 0
+x758 = 0
+x759 = 0
+x760 = 1
+x761 = 1
+x762 = 1
+x763 = 1
+x764 = 1
+x765 = 1
+x766 = 0
+x767 = 1
+x768 = 1
+x769 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m pk1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0.853048009
+x3 = 0
+x4 = 0
+x5 = 0.9902413468
+x6 = 0.6585148486
+x7 = 0.2829608277
+x8 = 0
+x9 = 0
+x10 = 1
+x11 = 0
+x12 = 1
+x13 = 0.331125321
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 1
+x18 = 1
+x19 = 0
+x20 = 0.1009956211
+x21 = 0.6785106979
+x22 = 0
+x23 = 1
+x24 = 0.8947436612
+x25 = 1
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0.1242007274
+x34 = 0.557112246
+x35 = 0.429812324
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0.3510036592
+x43 = 0
+x44 = 1
+x45 = 1
+x46 = 0
+x47 = 0
+x48 = 0.5414381495
+x49 = 1
+x50 = 0.2173113881
+x51 = 0
+x52 = 1
+x53 = 1
+x54 = 0
+x55 = 1
+x56 = 0.9323580046
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M pk1.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m rout.mps
+Optimum value: 981.8642857
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M rout.mps
+Optimum value: 2430.87
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc105.mps
+Optimum value: -52.20206121
+Optimum location:
+COL00001 = 0
+COL00002 = 10.84845409
+COL00003 = 52.20206121
+COL00004 = 52.20206121
+COL00005 = 52.20206121
+COL00006 = 0
+COL00007 = 10.84845409
+COL00008 = 52.20206121
+COL00009 = 0
+COL00010 = 10.84845409
+COL00011 = 52.20206121
+COL00012 = 0
+COL00013 = 12.35752655
+COL00014 = 57.42226733
+COL00015 = 57.42226733
+COL00016 = 109.6243285
+COL00017 = 0
+COL00018 = 23.20598064
+COL00019 = 109.6243285
+COL00020 = 0
+COL00021 = 23.20598064
+COL00022 = 109.6243285
+COL00023 = 0
+COL00024 = 14.22961977
+COL00025 = 63.16449407
+COL00026 = 63.16449407
+COL00027 = 172.7888226
+COL00028 = 0
+COL00029 = 37.43560041
+COL00030 = 172.7888226
+COL00031 = 0
+COL00032 = 37.43560041
+COL00033 = 172.7888226
+COL00034 = 0
+COL00035 = 16.6070926
+COL00036 = 69.48094347
+COL00037 = 69.48094347
+COL00038 = 242.2697661
+COL00039 = 0
+COL00040 = 54.042693
+COL00041 = 242.2697661
+COL00042 = 0
+COL00043 = 54.042693
+COL00044 = 242.2697661
+COL00045 = 0
+COL00046 = 19.69956814
+COL00047 = 76.42903782
+COL00048 = 76.42903782
+COL00049 = 318.6988039
+COL00050 = 0
+COL00051 = 73.74226114
+COL00052 = 318.6988039
+COL00053 = 0
+COL00054 = 73.74226114
+COL00055 = 318.6988039
+COL00056 = 0
+COL00057 = 23.81717437
+COL00058 = 84.0719416
+COL00059 = 84.0719416
+COL00060 = 402.7707455
+COL00061 = 0
+COL00062 = 97.55943551
+COL00063 = 402.7707455
+COL00064 = 0
+COL00065 = 97.55943551
+COL00066 = 402.7707455
+COL00067 = 17.9865343
+COL00068 = 20.42709879
+COL00069 = 92.47913576
+COL00070 = 92.47913576
+COL00071 = 495.2498813
+COL00072 = 17.9865343
+COL00073 = 117.9865343
+COL00074 = 495.2498813
+COL00075 = 17.9865343
+COL00076 = 117.9865343
+COL00077 = 495.2498813
+COL00078 = 21.79865343
+COL00079 = 21.79865343
+COL00080 = 101.7270493
+COL00081 = 101.7270493
+COL00082 = 596.9769306
+COL00083 = 39.78518773
+COL00084 = 139.7851877
+COL00085 = 596.9769306
+COL00086 = 39.78518773
+COL00087 = 139.7851877
+COL00088 = 596.9769306
+COL00089 = 23.97851877
+COL00090 = 23.97851877
+COL00091 = 111.8997543
+COL00092 = 111.8997543
+COL00093 = 708.8766849
+COL00094 = 63.7637065
+COL00095 = 163.7637065
+COL00096 = 708.8766849
+COL00097 = 63.7637065
+COL00098 = 163.7637065
+COL00099 = 708.8766849
+COL00100 = 26.37637065
+COL00101 = 26.37637065
+COL00102 = 123.0897297
+COL00103 = 123.0897297
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 0
+COL00051 = 0
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 0
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 0
+COL00062 = 0
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 0
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 0
+COL00073 = 0
+COL00074 = 0
+COL00075 = 0
+COL00076 = 0
+COL00077 = 0
+COL00078 = 0
+COL00079 = 0
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 0
+COL00084 = 0
+COL00085 = 0
+COL00086 = 0
+COL00087 = 0
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 0
+COL00092 = 0
+COL00093 = 0
+COL00094 = 0
+COL00095 = 0
+COL00096 = 0
+COL00097 = 0
+COL00098 = 0
+COL00099 = 0
+COL00100 = 0
+COL00101 = 0
+COL00102 = 0
+COL00103 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50a.mps
+Optimum value: -64.57507706
+Optimum location:
+COL00001 = 0
+COL00002 = 16.56869221
+COL00003 = 64.57507706
+COL00004 = 64.57507706
+COL00005 = 64.57507706
+COL00006 = 0
+COL00007 = 16.56869221
+COL00008 = 64.57507706
+COL00009 = 0
+COL00010 = 16.56869221
+COL00011 = 64.57507706
+COL00012 = 0
+COL00013 = 20.00990753
+COL00014 = 71.03258476
+COL00015 = 71.03258476
+COL00016 = 135.6076618
+COL00017 = 0
+COL00018 = 36.57859974
+COL00019 = 135.6076618
+COL00020 = 0
+COL00021 = 36.57859974
+COL00022 = 135.6076618
+COL00023 = 14.17734478
+COL00024 = 17.59874505
+COL00025 = 78.13584324
+COL00026 = 78.13584324
+COL00027 = 213.7435051
+COL00028 = 14.17734478
+COL00029 = 54.17734478
+COL00030 = 213.7435051
+COL00031 = 14.17734478
+COL00032 = 54.17734478
+COL00033 = 213.7435051
+COL00034 = 18.41773448
+COL00035 = 18.41773448
+COL00036 = 85.94942756
+COL00037 = 85.94942756
+COL00038 = 299.6929326
+COL00039 = 32.59507926
+COL00040 = 72.59507926
+COL00041 = 299.6929326
+COL00042 = 32.59507926
+COL00043 = 72.59507926
+COL00044 = 299.6929326
+COL00045 = 20.25950793
+COL00046 = 20.25950793
+COL00047 = 94.54437032
+COL00048 = 94.54437032
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m sc50b.mps
+Optimum value: -70
+Optimum location:
+COL00001 = 30
+COL00002 = 28
+COL00003 = 42
+COL00004 = 70
+COL00005 = 70
+COL00006 = 30
+COL00007 = 28
+COL00008 = 42
+COL00009 = 30
+COL00010 = 28
+COL00011 = 42
+COL00012 = 33
+COL00013 = 30.8
+COL00014 = 46.2
+COL00015 = 77
+COL00016 = 147
+COL00017 = 63
+COL00018 = 58.8
+COL00019 = 88.2
+COL00020 = 63
+COL00021 = 58.8
+COL00022 = 88.2
+COL00023 = 36.3
+COL00024 = 33.88
+COL00025 = 50.82
+COL00026 = 84.7
+COL00027 = 231.7
+COL00028 = 99.3
+COL00029 = 92.68
+COL00030 = 139.02
+COL00031 = 99.3
+COL00032 = 92.68
+COL00033 = 139.02
+COL00034 = 39.93
+COL00035 = 37.268
+COL00036 = 55.902
+COL00037 = 93.17
+COL00038 = 324.87
+COL00039 = 139.23
+COL00040 = 129.948
+COL00041 = 194.922
+COL00042 = 139.23
+COL00043 = 129.948
+COL00044 = 194.922
+COL00045 = 43.923
+COL00046 = 40.9948
+COL00047 = 61.4922
+COL00048 = 102.487
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M sc50b.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+Optimum value: -335.2135675
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 12
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 14
+PBOSLAX1 = 0
+PBOSLAX7 = 0
+PBOSSEA0 = 0
+PBOSSEA1 = 0
+PBOSSEA2 = 49
+PBOSSFO0 = 60
+PBOSSFO1 = 73
+PBOSTPE1 = 1
+PBOSTPE2 = 0
+PBOSTYO1 = 3
+PBOSTYO2 = 0
+PBOSYUL0 = 28.13380282
+PBOSYUL1 = 347.7678621
+PBOSYUL2 = 0.325
+PBOSYUL3 = 336.7733351
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 0
+PBOSYVR2 = 26
+PBOSYWG0 = 0
+PBOSYWG1 = 0
+PBOSYWG7 = 37
+PBOSYYZ0 = 19.03169014
+PBOSYYZ1 = 195.9683099
+PBUROAK0 = 11
+PBUROAK1 = 16
+PBURSEA0 = 83
+PBURSEA1 = 0
+PBURSFO0 = 278
+PHNLLAX0 = 104.0482353
+PHNLLAX1 = 33.04
+PHNLLAX2 = 68.20588235
+PHNLLAX3 = 98
+PHNLLON0 = 0
+PHNLLON6 = 5
+PHNLPAR0 = 0
+PHNLPAR6 = 1
+PHNLSEA0 = 0
+PHNLSEA1 = 157.7943925
+PHNLSEA2 = 0
+PHNLSFO0 = 35
+PHNLSFO1 = 0
+PHNLSFO7 = 0
+PHNLYVR0 = 94.20560748
+PHNLYVR1 = 0
+PHNLYVR7 = 39.79439252
+PLASSEA0 = 70.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 0
+PLASYVR6 = 37
+PLAXOAK0 = 32
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 0
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 546.0147059
+PLAXSEA4 = 3.720588235
+PLAXSEA5 = 139
+PLAXSEA6 = 66.26744186
+PLAXSEA7 = 0
+PLAXSEA8 = 57
+PLAXSEA9 = 5.415868673
+PLAXSFO0 = 33.04
+PLAXSFO1 = 260.8488372
+PLAXSFO2 = 839.9632721
+PLAXSFO3 = 87.90697674
+PLAXSFO4 = 168
+PLAXSFO5 = 98
+PLAXSFO6 = 1464.240914
+PLAXTPE0 = 8.581395349
+PLAXTPE1 = 0
+PLAXTPE2 = 18
+PLAXTPE8 = 4.418604651
+PLAXTYO0 = 41
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 0
+PLAXYVR0 = 0
+PLAXYVR1 = 153.755814
+PLAXYVR2 = 39.24418605
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 2
+PLONSEA0 = 0
+PLONSEA1 = 151
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 51
+POAKONT0 = 0
+POAKONT1 = 13
+POAKSEA0 = 37.89108456
+POAKSEA1 = 77.15303309
+POAKSEA2 = 6.955882353
+PONTSFO0 = 177
+PONTSEA0 = 23.10431985
+PONTSEA1 = 24.89568015
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 68
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 24
+PRNOSEA0 = 0
+PRNOSEA1 = 291
+PRNOYVR0 = 67
+PSEASFO0 = 0
+PSEASFO1 = 839.9632721
+PSEASFO2 = 146.6809139
+PSEASFO3 = 236.6
+PSEASFO4 = 0
+PSEASFO5 = 50.75581395
+PSEASFO6 = 168
+PSEATPE0 = 15.81395349
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 49.60465116
+PSEATYO0 = 59.98837209
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 95.01162791
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 70.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 6
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 17
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 111
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 0
+PTPEYVR0 = 57
+PTYOYVR0 = 91
+PYULYVR0 = 36.4084507
+PYULYVR1 = 134.1343917
+PYULYVR2 = 139.6904909
+PYULYVR3 = 4.766666667
+PYULYWG0 = 0
+PYULYWG1 = 271.3172923
+PYULYWG2 = 0
+PYULYWG3 = 178.6827077
+PYULYYZ0 = 0
+PYULYYZ1 = 266.6818464
+PYULYYZ2 = 0
+PYULYYZ3 = 431.9057717
+PYULYYZ4 = 1913.412382
+PYVRYWG0 = 14.67957746
+PYVRYWG1 = 271.3172923
+PYVRYWG2 = 138.0031303
+PYVRYYZ0 = 4.352112676
+PYVRYYZ1 = 241.2835753
+PYVRYYZ2 = 126.3643121
+PYWGYYZ0 = 14.67957746
+PYWGYYZ1 = 138.0031303
+PYWGYYZ2 = 0
+PYWGYYZ3 = 125.3172923
+PBOSOAK0 = 11
+PBOSOAK6 = 0
+PBOSBUR1 = 7
+PBOSBUR2 = 0
+PBOSONT1 = 4
+PBOSONT2 = 0
+PBURYVR1 = 26
+PBURTYO1 = 2
+PBURTPE1 = 1
+PBURHNL0 = 11
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 24
+PHNLOAK2 = 0
+PHNLOAK8 = 0
+PHNLONT0 = 9.705882353
+PHNLONT6 = 6.294117647
+PHNLYWG1 = 3
+PHNLYYZ1 = 24
+PHNLYUL1 = 40
+PLASTYO1 = 5
+PLASTPE1 = 1
+PLAXLON0 = 13
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 8
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 1
+PBURPAR1 = 1
+PLONONT1 = 1
+PLONOAK1 = 1
+POAKPAR1 = 2
+POAKTYO1 = 7
+POAKTPE1 = 2
+PONTPAR1 = 2
+PONTTYO1 = 2
+PONTTPE1 = 1
+PPARSFO1 = 2
+PRNOTYO1 = 5
+PRNOTPE1 = 2
+PTPEYWG1 = 21
+PTPEYYZ1 = 13
+PTPEYUL1 = 6
+PTYOYUL1 = 7
+PTYOYYZ1 = 17
+PTYOYWG1 = 25
+PLAXONT0 = 6.294117647
+GRDTIMO1 = 0
+GRDTIMN1 = -49.01286158
+GRDTIMO2 = 0
+GRDTIMN2 = 0
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = 0
+GRDTIMO5 = 0
+GRDTIMN5 = -47.24353963
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 0
+N1002AC3 = 2.355140187
+N1003AC1 = 0
+N1003AC2 = 0.1603208556
+N1003AC3 = 0.7214438503
+N1004AC1 = 0.28
+N1004AC2 = 0
+N1004AC3 = 0
+N1005AC3 = 0.0859375
+N1105AC3 = 0.8382352941
+N1006AC3 = 0.07582720588
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 0
+N1008AC2 = 0
+N1008AC3 = 0
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 4.65801495
+N1009AC1 = 0
+N1009AC2 = 0.07488107822
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 1.921947674
+N1010AC1 = 0
+N1010AC2 = 0
+N1010AC3 = 0
+N1010AC4 = 0
+N1010AC5 = 0
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 3.085065996
+N1011AC3 = 0.6951730236
+N1011AC4 = 0
+N1011AC5 = 3.897217244
+N1011AC6 = 0
+N1012AC1 = 1.510832058
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 2.417331293
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 0.9241727941
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 1.691245404
+N1014AC6 = 0.2228170956
+N1015AC3 = 0
+N1015AC4 = 0.7048194147
+N1015AC5 = 0.1595430366
+N1015AC6 = 2.135637549
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0.7
+N1016AC6 = 3.3
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.1617647059
+N1018AC1 = 0
+N1018AC2 = 0
+N1018AC3 = 0
+N1018AC4 = 0
+N1018AC5 = 0
+N1018AC6 = 1.196428571
+N1019AC1 = 0
+N1019AC2 = 0
+N1019AC3 = 0
+N1019AC4 = 0.2345133807
+N1019AC5 = 0.7654866193
+N1020AC1 = 0.2228332753
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 3.200696136
+N1020AC6 = 0
+N1021AC1 = 0.664202377
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 2.453858782
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0.476744186
+N1028AC1 = 0
+N1029AC1 = 0.523255814
+N1030AC1 = 1
+N1032AC1 = 0
+N1032AC2 = 0
+N1032AC3 = 0
+N1032AC4 = 0.8274647887
+N1032AC5 = 0
+N1033AC1 = 0.4860357964
+N1033AC2 = 0.5004769224
+N1033AC3 = 0
+N1033AC4 = 0
+N1033AC5 = 2.061996183
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 3.174783885
+N1035AC1 = 0.6827679474
+N1035AC2 = 0
+N1035AC3 = 0
+N1035AC4 = 0.7269371829
+N1035AC5 = 0.2529831862
+N1036AC1 = 0.1083333333
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 0
+N1038AC4 = 0.2383968781
+N1038AC5 = 1.271450017
+N1039AC4 = 0
+N1039AC5 = 2.077705904
+N1040AC4 = 0
+N1040AC5 = 0
+N1040AC6 = 9.513243659
+N1041AC4 = 8.856901224
+N1041AC5 = 0
+N1041AC6 = 20
+N1042AC4 = 0
+N1042AC5 = 0
+N1042AC6 = 0
+N1043AC1 = 0.1725352113
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 0
+N1044AC3 = 1
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 0
+N1047AC3 = 1
+N1050AC3 = 0
+N1050AC4 = 0
+N1050AC5 = 0.0731874145
+N1051AC1 = 0
+N1051AC2 = 0
+N1051AC3 = 0
+N1051AC4 = 0
+N1051AC5 = 4.651904242
+N1051AC6 = 20
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+Optimum value: 286.9746573
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 10
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 0
+PBOSLAX1 = 0
+PBOSLAX7 = 12
+PBOSSEA0 = 0
+PBOSSEA1 = 40
+PBOSSEA2 = 0
+PBOSSFO0 = 48
+PBOSSFO1 = 73
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 372
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 11.94690265
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 193
+PBOSYYZ1 = 0
+PBUROAK0 = 9
+PBUROAK1 = 15
+PBURSEA0 = 69
+PBURSEA1 = 0
+PBURSFO0 = 243
+PHNLLAX0 = 0
+PHNLLAX1 = 126.296875
+PHNLLAX2 = 100.03125
+PHNLLAX3 = 104.4375
+PHNLLON0 = 0
+PHNLLON6 = 0
+PHNLPAR0 = 0
+PHNLPAR6 = 0
+PHNLSEA0 = 0
+PHNLSEA1 = 135.2523364
+PHNLSEA2 = 0
+PHNLSFO0 = 0
+PHNLSFO1 = 0
+PHNLSFO7 = 31
+PHNLYVR0 = 80.74766355
+PHNLYVR1 = 0
+PHNLYVR7 = 35.25233645
+PLASSEA0 = 365
+PLASSEA1 = 0
+PLASYVR0 = 0
+PLASYVR6 = 33
+PLAXOAK0 = 42.765625
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 543.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 0
+PLAXSEA8 = 66
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 842
+PLAXSFO2 = 0
+PLAXSFO3 = 168
+PLAXSFO4 = 168
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 36
+PLAXYVR0 = 116
+PLAXYVR1 = 0
+PLAXYVR2 = 57
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 0
+PLONSEA0 = 0
+PLONSEA1 = 127
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 45
+POAKONT0 = 0
+POAKONT1 = 11
+POAKSEA0 = 41
+POAKSEA1 = 57
+POAKSEA2 = 0
+PONTSFO0 = 155
+PONTSEA0 = 25
+PONTSEA1 = 12
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 53
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 21
+PRNOSEA0 = 255
+PRNOSEA1 = 0
+PRNOYVR0 = 60
+PSEASFO0 = 574
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 168
+PSEASFO6 = 168
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 126
+PSEATYO3 = 27
+PSEAYVR0 = 104.2523364
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 0
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 545
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 15
+PSFOYVR0 = 268
+PSFOYVR1 = 0
+PTPETYO0 = 0
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 99
+PTPEYVR0 = 44
+PTYOYVR0 = 74
+PYULYVR0 = 182
+PYULYVR1 = 88
+PYULYVR2 = 0
+PYULYVR3 = 0
+PYULYWG0 = 161.3018868
+PYULYWG1 = 178
+PYULYWG2 = 31.69811321
+PYULYWG3 = 0
+PYULYYZ0 = 0
+PYULYYZ1 = 0
+PYULYYZ2 = 245.3018868
+PYULYYZ3 = 2104.698113
+PYULYYZ4 = 0
+PYVRYWG0 = 194.3018868
+PYVRYWG1 = 178
+PYVRYWG2 = 4.698113208
+PYVRYYZ0 = 328.6981132
+PYVRYYZ1 = 0
+PYVRYYZ2 = 4.301886792
+PYWGYYZ0 = 0
+PYWGYYZ1 = 4.698113208
+PYWGYYZ2 = 245.3018868
+PYWGYYZ3 = 0
+PBOSOAK0 = 9
+PBOSOAK6 = 0
+PBOSBUR1 = 0
+PBOSBUR2 = 0
+PBOSONT1 = 0
+PBOSONT2 = 0
+PBURYVR1 = 23
+PBURTYO1 = 0
+PBURTPE1 = 0
+PBURHNL0 = 9
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 2.234375
+PHNLOAK2 = 0
+PHNLOAK8 = 18.765625
+PHNLONT0 = 0
+PHNLONT6 = 14
+PHNLYWG1 = 0
+PHNLYYZ1 = 21
+PHNLYUL1 = 35
+PLASTYO1 = 0
+PLASTPE1 = 0
+PLAXLON0 = 11
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 0
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 0
+PBURPAR1 = 0
+PLONONT1 = 0
+PLONOAK1 = 0
+POAKPAR1 = 0
+POAKTYO1 = 0
+POAKTPE1 = 0
+PONTPAR1 = 0
+PONTTYO1 = 0
+PONTTPE1 = 0
+PPARSFO1 = 0
+PRNOTYO1 = 0
+PRNOTPE1 = 0
+PTPEYWG1 = 18
+PTPEYYZ1 = 11
+PTPEYUL1 = 0
+PTYOYUL1 = 0
+PTYOYYZ1 = 15
+PTYOYWG1 = 22
+PLAXONT0 = 14
+GRDTIMO1 = 0
+GRDTIMN1 = -105
+GRDTIMO2 = 0
+GRDTIMN2 = -91
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = -43.5
+GRDTIMO5 = 0
+GRDTIMN5 = -87
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 2.018691589
+N1002AC3 = 0
+N1003AC1 = 0
+N1003AC2 = 0
+N1003AC3 = 0
+N1004AC1 = 0
+N1004AC2 = 1.0703125
+N1004AC3 = 0
+N1005AC3 = 0.0703125
+N1105AC3 = 0.9296875
+N1006AC3 = 0
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 5.28156777
+N1008AC2 = 0
+N1008AC3 = 1.986798016
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 0
+N1009AC1 = 0
+N1009AC2 = 0
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 0
+N1010AC1 = 7
+N1010AC2 = 7
+N1010AC3 = 7
+N1010AC4 = 7
+N1010AC5 = 7
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 0
+N1011AC4 = 0
+N1011AC5 = 0
+N1011AC6 = 0
+N1012AC1 = 0
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 0
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 1
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 0
+N1014AC6 = 1.909090909
+N1015AC3 = 0
+N1015AC4 = 0
+N1015AC5 = 0
+N1015AC6 = 3
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0
+N1016AC6 = 4
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.09090909091
+N1018AC1 = 3.782713663
+N1018AC2 = 6.749720385
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001305
+N1018AC6 = 0
+N1019AC1 = 0
+N1019AC2 = 1.412371134
+N1019AC3 = 0
+N1019AC4 = 2.587628866
+N1019AC5 = 0
+N1020AC1 = 0
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 0
+N1020AC6 = 0
+N1021AC1 = 0
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 0
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0
+N1028AC1 = 0
+N1029AC1 = 1
+N1030AC1 = 1
+N1032AC1 = 1
+N1032AC2 = 1
+N1032AC3 = 1
+N1032AC4 = 1
+N1032AC5 = 1
+N1033AC1 = 0
+N1033AC2 = 1.371681416
+N1033AC3 = 0
+N1033AC4 = 0.6283185841
+N1033AC5 = 0
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 0
+N1035AC1 = 0
+N1035AC2 = 0.04608448823
+N1035AC3 = 0
+N1035AC4 = 0.01051928536
+N1035AC5 = 0
+N1036AC1 = 0
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 3.220930233
+N1038AC4 = 0
+N1038AC5 = 0
+N1039AC4 = 0
+N1039AC5 = 0
+N1040AC4 = 10
+N1040AC5 = 10
+N1040AC6 = 10
+N1041AC4 = 5.79377625
+N1041AC5 = 20
+N1041AC6 = 20
+N1042AC4 = 20
+N1042AC5 = 20
+N1042AC6 = 20
+N1043AC1 = 0
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 1
+N1044AC3 = 0
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 1
+N1047AC3 = 0
+N1050AC3 = 0.109375
+N1050AC4 = 0
+N1050AC5 = 0
+N1051AC1 = 20
+N1051AC2 = 20
+N1051AC3 = 20
+N1051AC4 = 0
+N1051AC5 = 20
+N1051AC6 = 11.52971853
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+Optimum value: -315.018728
+Optimum location:
+PBOSORD0 = 302
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 712
+PBOSLGA1 = 268
+PBOSLGA2 = 0
+PBOSLGA3 = 1372
+PBOSCLE0 = 4.108024927
+PBOSCLE1 = 137.8919751
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 34
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 268
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 470.294686
+PORDCLE1 = 148.705314
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 1162
+PLGABOS1 = 0
+PLGABOS2 = 458
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1123
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 0
+PCLELGA1 = 0
+PCLELGA2 = 409
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 0
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 1.5
+CORDBOS1 = 22.5
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 13
+CORDLGA1 = 0
+CORDLGA2 = 0
+CORDLGA3 = 0
+CLGAORD0 = 22.5
+CLGAORD1 = 22.5
+CLGAORD2 = 0
+CLGAORD3 = 0
+CLGACLE0 = 16
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 5
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 0
+GRDTIMN1 = 0
+GRDTIMO2 = 0
+GRDTIMN2 = -76.79770851
+GRDTIMN3 = -10.27177739
+GRDTIMN4 = -21.60844089
+N1003AC1 = 0
+N1003AC2 = 6.724489796
+N1003AC3 = 0.4
+N1003AC4 = 0
+N1005AC1 = 0.01346893419
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0.5855648822
+N1011AC2 = 0
+N1011AC3 = 0.2937198068
+N1011AC4 = 0
+N1013AC2 = 7.265306122
+N1013AC4 = 2
+N1015AC2 = 0
+N1015AC4 = 1.422222222
+N1017AC2 = 0
+N1017AC4 = 2
+N1019AC2 = 2.540816327
+N1019AC4 = 0
+N1021AC1 = 0.01346893419
+N1021AC2 = 0.1254559795
+N1021AC3 = 0
+N1021AC4 = 0
+N1002AC1 = 0
+N1002AC2 = 4.798925367
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 0
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 11.85714286
+N1008AC4 = 2
+N1010AC2 = 0
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 4.673469388
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 11.45918367
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+Optimum value: -73.3689691
+Optimum location:
+PBOSORD0 = 28
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 249
+PBOSLGA0 = 258.2518986
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810145
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 0
+PBOSCLE2 = 0
+PBOSCLE3 = 142
+PORDBOS0 = 302
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 0
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 0
+PORDLGA2 = 515
+PORDLGA3 = 0
+PORDCLE0 = 0
+PORDCLE1 = 619
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 0
+PLGABOS1 = 712
+PLGABOS2 = 0
+PLGABOS3 = 686
+PLGABOS4 = 426.7481014
+PLGABOS5 = 918.2518986
+PLGAORD0 = 258.2518986
+PLGAORD1 = 0
+PLGAORD2 = 453.7481014
+PLGAORD3 = 0
+PLGACLE0 = 517
+PLGACLE1 = 0
+PLGACLE2 = 0
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 0
+PCLEORD1 = 0
+PCLEORD2 = 712
+PCLEORD3 = 0
+PCLEORD4 = 0
+PCLELGA0 = 197
+PCLELGA1 = 70
+PCLELGA2 = 0
+PCLELGA3 = 142
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0
+BBOSCLE1 = 0
+BORDBOS0 = 0
+CBOSORD0 = 0
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 0
+CBOSCLE2 = 12.8
+CBOSCLE3 = 0
+CORDBOS0 = 19.2
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 10.4
+CLGAORD3 = 25.6
+CLGACLE0 = 12.8
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 0
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 73.01076
+GRDTIMN1 = -100
+GRDTIMO2 = 0
+GRDTIMN2 = -90
+GRDTIMN3 = -45
+GRDTIMN4 = -45
+N1003AC1 = 7
+N1003AC2 = 0
+N1003AC3 = 0.6856076556
+N1003AC4 = 0
+N1005AC1 = 0
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 1.314392344
+N1011AC4 = 0
+N1013AC2 = 2.635223455
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 2
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082668
+N1019AC4 = 0.9244444444
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 2
+N1002AC1 = 7
+N1002AC2 = 0
+N1002AC3 = 2
+N1002AC4 = 2
+N1004AC2 = 0
+N1004AC4 = 0
+N1006AC1 = 7
+N1006AC2 = 0
+N1006AC3 = 2
+N1006AC4 = 0
+N1008AC2 = 0
+N1008AC4 = 0
+N1010AC2 = 7.265306122
+N1010AC4 = 0.9244444444
+N1012AC2 = 5.275510204
+N1012AC4 = 2
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572464
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 9.369917332
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -n boeing2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -c -oobtained -r -m mas74.mps
+Optimum value: 10482.79528
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 1
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0.534748935
+x15 = 1
+x16 = 0
+x17 = 0.2426314982
+x18 = 0
+x19 = 0.6876932388
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0.2651304012
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0.5013849053
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 1
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0.03253329909
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 0
+x66 = 0
+x67 = 1
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 1
+x89 = 1
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0.8925534483
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0.01146190385
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0.681178426
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6580158126
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0.9733691137
+x150 = 0.5192990181
+x151 = 10482.79508
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 1
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 1
+x25 = 0
+x26 = 1
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 1
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 1
+x114 = 1
+x115 = 0
+x116 = 0
+x117 = 1
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 1
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 1
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 1
+x149 = 0
+x150 = 1
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -c -oobtained -n mas74.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+Optimum value: 20430947.62
+Optimum location:
+x1 = 0
+x2 = 23929.0382
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1.833067347
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 86.19157484
+x16 = 0
+x17 = 0
+x18 = 636.0743694
+x19 = 0
+x20 = 0
+x21 = 605.2785996
+x22 = 2113.676289
+x23 = 0
+x24 = 0
+x25 = 1009.494466
+x26 = 5449.255398
+x27 = 0
+x28 = 0
+x29 = 7316.944573
+x30 = 0
+x31 = 7529.08308
+x32 = 3525.611302
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 2780.728439
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 889.0673525
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 205.0591339
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 6351.319455
+x50 = 1183.360764
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 2530.715783
+x55 = 1726.033672
+x56 = 0
+x57 = 0
+x58 = 1176.727362
+x59 = 887.6859319
+x60 = 0
+x61 = 0
+x62 = 838.4627167
+x63 = 0
+x64 = 126.3594424
+x65 = 0
+x66 = 204.7049902
+x67 = 0
+x68 = 142.8570486
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 41.54952653
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 569.7173314
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 212.2691988
+x81 = 0
+x82 = 481.1190763
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 11372.68698
+x101 = 8880.920376
+x102 = 621.3300236
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0.000105591437
+x204 = 0
+x205 = 0.004964952468
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.05815060286
+x210 = 0
+x211 = 0.03486627878
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0.03664022865
+x216 = 0
+x217 = 0.1217555466
+x218 = 0
+x219 = 0.3138972004
+x220 = 0
+x221 = 0.4214829823
+x222 = 0
+x223 = 0.4337029424
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0.2030882087
+x232 = 0
+x233 = 0.1601802096
+x234 = 0
+x235 = 0.05121355717
+x236 = 0
+x237 = 0.6551086973
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0.01181216209
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0.03579089997
+x250 = 0
+x251 = 0.5115737543
+x252 = 0
+x253 = 0.0681659426
+x254 = 0
+x255 = 0.3658594156
+x256 = 0
+x257 = 0.09942590274
+x258 = 0
+x259 = 0.1457785589
+x260 = 0
+x261 = 0.05113398225
+x262 = 0
+x263 = 0.06778383419
+x264 = 0
+x265 = 0.04829854359
+x266 = 0
+x267 = 0.02771423251
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0.01222748841
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0.03281781863
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0.002393405906
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0.008229092659
+x284 = 0
+x285 = 0.01179176211
+x286 = 0
+x287 = 0.007278769726
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 1.5
+x300 = 69
+x301 = 520.5
+x302 = 495.299805
+x303 = 754.0998539
+x304 = 1198.5
+x305 = 2188.799805
+x306 = 594.4
+x307 = 51.4
+x308 = 75.6
+x309 = 563.0998539
+x310 = 1533.099854
+x311 = 556.299805
+x312 = 167.8
+x313 = 975.799805
+x314 = 1642.9
+x315 = 347.099854
+x316 = 262.799805
+x317 = 62
+x318 = 395.9
+x319 = 691.7
+x320 = 936.7
+x321 = 791.099854
+x322 = 106.7
+x323 = 393.7
+x324 = 173.7
+x325 = 466.2
+x326 = 34
+x327 = 116.9
+x328 = 103.4
+x329 = 552.099854
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+Optimum value: 742543789.3
+Optimum location:
+x1 = 0
+x2 = 57866.66667
+x3 = 0
+x4 = 52080
+x5 = 16665.6
+x6 = 17360
+x7 = 17360
+x8 = 15985.088
+x9 = 17360
+x10 = 16665.6
+x11 = 17360
+x12 = 17360
+x13 = 15971.2
+x14 = 17360
+x15 = 17360
+x16 = 17360
+x17 = 13609.96224
+x18 = 17360
+x19 = 15637.888
+x20 = 17360
+x21 = 17360
+x22 = 17360
+x23 = 14283.53024
+x24 = 17360
+x25 = 17360
+x26 = 17360
+x27 = 9281.22263
+x28 = 17360
+x29 = 17360
+x30 = 8748.398178
+x31 = 17360
+x32 = 17360
+x33 = 3236.582794
+x34 = 17360
+x35 = 12622.80876
+x36 = 17360
+x37 = 17360
+x38 = 17360
+x39 = 13943.27424
+x40 = 17360
+x41 = 17360
+x42 = 17360
+x43 = 15290.688
+x44 = 17360
+x45 = 17360
+x46 = 16665.6
+x47 = 17360
+x48 = 17360
+x49 = 17360
+x50 = 17360
+x51 = 1887.314667
+x52 = 17360
+x53 = 5398.256436
+x54 = 17360
+x55 = 17360
+x56 = 17360
+x57 = 8980.850078
+x58 = 17360
+x59 = 17360
+x60 = 17360
+x61 = 12636.55788
+x62 = 17360
+x63 = 15985.088
+x64 = 17360
+x65 = 13603.01824
+x66 = 17360
+x67 = 17360
+x68 = 17360
+x69 = 14950.432
+x70 = 17360
+x71 = 17360
+x72 = 17360
+x73 = 14950.432
+x74 = 17360
+x75 = 17360
+x76 = 17360
+x77 = 14950.432
+x78 = 17360
+x79 = 17360
+x80 = 17360
+x81 = 17360
+x82 = 17360
+x83 = 15637.888
+x84 = 16665.6
+x85 = 17360
+x86 = 16318.4
+x87 = 17360
+x88 = 17360
+x89 = 16318.4
+x90 = 17360
+x91 = 17360
+x92 = 16318.4
+x93 = 17360
+x94 = 17360
+x95 = 16318.4
+x96 = 17360
+x97 = 17360
+x98 = 16665.6
+x99 = 17360
+x100 = 17360
+x101 = 17360
+x102 = 17360
+x103 = 16665.6
+x104 = 17360
+x105 = 17360
+x106 = 15985.088
+x107 = 17360
+x108 = 16665.6
+x109 = 17360
+x110 = 17360
+x111 = 15971.2
+x112 = 17360
+x113 = 17360
+x114 = 17360
+x115 = 13609.96224
+x116 = 17360
+x117 = 15637.888
+x118 = 17360
+x119 = 17360
+x120 = 17360
+x121 = 14283.53024
+x122 = 17360
+x123 = 17360
+x124 = 17360
+x125 = 9281.22263
+x126 = 17360
+x127 = 17360
+x128 = 8748.398178
+x129 = 17360
+x130 = 17360
+x131 = 3236.582794
+x132 = 17360
+x133 = 12622.80876
+x134 = 17360
+x135 = 17360
+x136 = 17360
+x137 = 13943.27424
+x138 = 17360
+x139 = 17360
+x140 = 17360
+x141 = 15290.688
+x142 = 17360
+x143 = 17360
+x144 = 16665.6
+x145 = 17360
+x146 = 17360
+x147 = 17360
+x148 = 17360
+x149 = 1887.314667
+x150 = 17360
+x151 = 5398.256436
+x152 = 17360
+x153 = 17360
+x154 = 17360
+x155 = 8980.850078
+x156 = 17360
+x157 = 17360
+x158 = 17360
+x159 = 12636.55788
+x160 = 17360
+x161 = 15985.088
+x162 = 17360
+x163 = 13603.01824
+x164 = 17360
+x165 = 17360
+x166 = 17360
+x167 = 14950.432
+x168 = 17360
+x169 = 17360
+x170 = 17360
+x171 = 14950.432
+x172 = 17360
+x173 = 17360
+x174 = 17360
+x175 = 14950.432
+x176 = 17360
+x177 = 17360
+x178 = 17360
+x179 = 17360
+x180 = 17360
+x181 = 15637.888
+x182 = 16665.6
+x183 = 17360
+x184 = 16318.4
+x185 = 17360
+x186 = 17360
+x187 = 16318.4
+x188 = 17360
+x189 = 17360
+x190 = 16318.4
+x191 = 17360
+x192 = 17360
+x193 = 16318.4
+x194 = 17360
+x195 = 17360
+x196 = 16665.6
+x197 = 17360
+x198 = 17360
+x199 = 17360
+x200 = 17360
+x201 = 1
+x202 = 1
+x203 = 1
+x204 = 1
+x205 = 1
+x206 = 1
+x207 = 1
+x208 = 1
+x209 = 1
+x210 = 1
+x211 = 1
+x212 = 1
+x213 = 1
+x214 = 1
+x215 = 1
+x216 = 1
+x217 = 1
+x218 = 1
+x219 = 1
+x220 = 1
+x221 = 1
+x222 = 1
+x223 = 1
+x224 = 1
+x225 = 1
+x226 = 1
+x227 = 1
+x228 = 1
+x229 = 1
+x230 = 1
+x231 = 1
+x232 = 1
+x233 = 1
+x234 = 1
+x235 = 1
+x236 = 1
+x237 = 1
+x238 = 1
+x239 = 1
+x240 = 1
+x241 = 1
+x242 = 1
+x243 = 1
+x244 = 1
+x245 = 1
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 1
+x253 = 1
+x254 = 1
+x255 = 1
+x256 = 1
+x257 = 1
+x258 = 1
+x259 = 1
+x260 = 1
+x261 = 1
+x262 = 1
+x263 = 1
+x264 = 1
+x265 = 1
+x266 = 1
+x267 = 1
+x268 = 1
+x269 = 1
+x270 = 1
+x271 = 1
+x272 = 1
+x273 = 1
+x274 = 1
+x275 = 1
+x276 = 1
+x277 = 1
+x278 = 1
+x279 = 1
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 1
+x284 = 1
+x285 = 1
+x286 = 1
+x287 = 1
+x288 = 1
+x289 = 1
+x290 = 1
+x291 = 1
+x292 = 1
+x293 = 1
+x294 = 1
+x295 = 1
+x296 = 1
+x297 = 1
+x298 = 1
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 1.5
+x362 = 69
+x363 = 520.5
+x364 = 495.299805
+x365 = 754.0998539
+x366 = 1198.5
+x367 = 2188.799805
+x368 = 594.4
+x369 = 51.4
+x370 = 75.6
+x371 = 563.0998539
+x372 = 1533.099854
+x373 = 556.299805
+x374 = 167.8
+x375 = 975.799805
+x376 = 1642.9
+x377 = 347.099854
+x378 = 262.799805
+x379 = 62
+x380 = 395.9
+x381 = 691.7
+x382 = 936.7
+x383 = 791.099854
+x384 = 106.7
+x385 = 393.7
+x386 = 173.7
+x387 = 466.2
+x388 = 34
+x389 = 116.9
+x390 = 103.4
+x391 = 552.099854
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -c -oobtained -n modglob.mps
+Feasible problem.
diff --git a/demos/ppl_lpsol/expected_mpz_a b/demos/ppl_lpsol/expected_mpz_a
new file mode 100644
index 0000000..394fc13
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz_a
@@ -0,0 +1,4578 @@
+*** ./ppl_lpsol -s -p1 -oobtained -n  egout.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  ex1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  lseu.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  markshare2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  mip.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  p0033.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -n  unboundedmin.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -m ex1.mps
+Optimum value: -3
+Optimum location:
+x1 = 1
+x2 = 2
+*** ./ppl_lpsol -s -p1 -oobtained -M ex1.mps
+Optimum value: 2
+Optimum location:
+x1 = 2
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -m mip.mps
+Optimum value: 24.33333333
+Optimum location:
+X1 = 2.666666667
+X2 = 2
+X3 = 1
+X4 = 3.333333333
+*** ./ppl_lpsol -s -p1 -oobtained -M mip.mps
+Optimum value: 43
+Optimum location:
+X1 = 4
+X2 = 4
+X3 = 0
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -m p0033.mps
+Optimum value: 3089
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 1
+C165 = 0
+C166 = 1
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 1
+C175 = 0
+C176 = 0
+C177 = 1
+C178 = 0
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -M p0033.mps
+Optimum value: 5201
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 1
+C166 = 0
+C167 = 1
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 0
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 0
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 1
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m adlittle.mps
+Optimum value: 225494.9632
+*** ./ppl_lpsol -s -p1 -oobtained -r -M adlittle.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 58.1560164
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 39.94173069
+X16 = 61.64537738
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 366.4378962
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 17.50496094
+X38 = 157.5682954
+X39 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M afiro.mps
+Optimum value: 3438.2921
+Optimum location:
+X01 = 54.5
+X02 = 0
+X03 = 54.5
+X04 = 57.77
+X06 = 0
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 0
+X15 = 0
+X16 = 0
+X22 = 500
+X23 = 483.5955
+X24 = 16.4045
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 345.4253571
+X37 = 0
+X38 = 0
+X39 = 389.4253571
+*** ./ppl_lpsol -s -p1 -oobtained -r -m bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M bgprtr.mps
+Unfeasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m blend.mps
+Optimum value: -30.81214985
+Optimum location:
+1 = 20.94480195
+2 = 10.17092161
+3 = 11.24735865
+4 = 2.981097124
+5 = 0.6597035933
+6 = 0.4759263446
+7 = 0
+8 = 10.10117614
+9 = 0
+10 = 1.679178924
+11 = 0
+12 = 10.10117614
+13 = 0
+14 = 11.78035507
+15 = 0
+16 = 0.4067430357
+17 = 0
+18 = 2.173256964
+19 = 2.018559906
+20 = 4.843256964
+21 = 3.079217438
+22 = 0.05896569207
+23 = 1.149909949
+24 = 1.396291081
+25 = 0
+26 = 0
+27 = 0
+28 = 0
+29 = 0.3835003722
+30 = 0
+31 = 4.424431137
+32 = 0
+33 = 1.149909949
+34 = 1.396291081
+35 = 0.7485700927
+36 = 21.63838697
+37 = 8.102702633
+38 = 0.7107761404
+39 = 0.4817893472
+40 = 0
+41 = 4.892936372
+42 = 0
+43 = 0.4416752608
+44 = 14.28573702
+45 = 6.527177121
+46 = 2.005816841
+47 = 0
+48 = 0
+49 = 0.7713285688
+50 = 4.87625743
+51 = 0.2242247192
+52 = 1.811155615
+53 = 7.877627559
+54 = 0.3201545422
+55 = 0.9892470535
+56 = 0.4439079385
+57 = 1.433154992
+58 = 0
+59 = 0
+60 = 0
+61 = 0
+62 = 3.874801192
+63 = 3.874801192
+64 = 0.7749576722
+65 = 1.83076589
+66 = 0
+67 = 0
+68 = 0.06587344195
+69 = 0.7889117798
+70 = 3.460508784
+71 = 2.750888679
+72 = 0
+73 = 0
+74 = 0
+75 = 0
+76 = 0
+77 = 0.1693961964
+78 = 0
+79 = 1.154801147
+80 = 0
+81 = 0.8033012352
+82 = 26.03036862
+83 = 87.09497412
+*** ./ppl_lpsol -s -p1 -oobtained -r -M blend.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m egout.mps
+Optimum value: 149.5887662
+Optimum location:
+I.001... = 0.02093301435
+I.001003 = 0
+I.002003 = 0
+I.002... = 0.00521189337
+I.003005 = 0
+I.004005 = 0
+I.004... = 0.06758373206
+I.005007 = 0
+I.006007 = 0.03879015721
+I.007008 = 0.04853041695
+I.008... = 0.04853041695
+I.008009 = 0
+I.010012 = 0.009654818865
+I.011012 = 0.1833561176
+I.012... = 0.1930109364
+I.012013 = 0
+I.013016 = 0.03964456596
+I.014015 = 0.002648667122
+I.015016 = 0.01324333561
+I.016... = 0.05288790157
+I.016017 = 0
+I.017018 = 0.0005980861244
+I.009018 = 0.002392344498
+I.018019 = 0.002990430622
+I.019024 = 0.02358168148
+I.024... = 0.0241797676
+I.023024 = 0.0005980861244
+I.022023 = 0
+I.020022 = 0.003332194122
+I.021022 = 0.06331168831
+I.022... = 0.06664388243
+I.024026 = 0
+I.025026 = 0
+I.025... = 0.1642173616
+I.026027 = 0.08962747779
+I.027... = 0.08962747779
+I.027032 = 0
+I.030031 = 0.002392344498
+I.031032 = 0.0534859877
+I.029031 = 0.0487012987
+I.028029 = 0
+I.028... = 0.007518796992
+I.032033 = 0.0534859877
+I.033037 = 0.05510936432
+I.036037 = 0.008885850991
+I.034036 = 0.001623376623
+I.035036 = 0.002392344498
+I.037038 = 0.06399521531
+I.038040 = 0.109278879
+I.039040 = 0.04545454545
+I.040... = 0.161226931
+I.041... = 0.04340396446
+I.040041 = 0
+I.041042 = 0
+I.042... = 0.05502392344
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 2.45
+F.001003 = 0
+F.002003 = 0
+F.002... = 0.61
+F.003005 = 0
+F.004005 = 0
+F.004... = 7.91
+F.005007 = 0
+F.006007 = 4.54
+F.007008 = 5.68
+F.008... = 5.68
+F.008009 = 0
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 22.59
+F.012013 = 0
+F.013016 = 4.64
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 6.19
+F.016017 = 0
+F.017018 = 0.07
+F.009018 = 0.28
+F.018019 = 0.35
+F.019024 = 2.76
+F.024... = 2.83
+F.023024 = 0.07
+F.022023 = 0
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 7.8
+F.024026 = 0
+F.025026 = 0
+F.025... = 19.22
+F.026027 = 10.49
+F.027... = 10.49
+F.027032 = 0
+F.030031 = 0.28
+F.031032 = 6.26
+F.029031 = 5.7
+F.028029 = 0
+F.028... = 0.88
+F.032033 = 6.26
+F.033037 = 6.45
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 7.49
+F.038040 = 12.79
+F.039040 = 5.32
+F.040... = 18.87
+F.041... = 5.08
+F.040041 = 0
+F.041042 = 0
+F.042... = 6.44
+*** ./ppl_lpsol -s -p1 -oobtained -r -M egout.mps
+Optimum value: 964.30053
+Optimum location:
+I.001... = 1
+I.001003 = 1
+I.002003 = 1
+I.002... = 1
+I.003005 = 1
+I.004005 = 1
+I.004... = 1
+I.005007 = 1
+I.006007 = 1
+I.007008 = 1
+I.008... = 1
+I.008009 = 1
+I.010012 = 1
+I.011012 = 1
+I.012... = 1
+I.012013 = 1
+I.013016 = 1
+I.014015 = 1
+I.015016 = 1
+I.016... = 1
+I.016017 = 1
+I.017018 = 1
+I.009018 = 1
+I.018019 = 1
+I.019024 = 1
+I.024... = 1
+I.023024 = 1
+I.022023 = 1
+I.020022 = 1
+I.021022 = 1
+I.022... = 1
+I.024026 = 1
+I.025026 = 1
+I.025... = 1
+I.026027 = 1
+I.027... = 1
+I.027032 = 1
+I.030031 = 1
+I.031032 = 1
+I.029031 = 1
+I.028029 = 1
+I.028... = 1
+I.032033 = 1
+I.033037 = 1
+I.036037 = 1
+I.034036 = 1
+I.035036 = 1
+I.037038 = 1
+I.038040 = 1
+I.039040 = 1
+I.040... = 1
+I.041... = 1
+I.040041 = 1
+I.041042 = 1
+I.042... = 1
+F....001 = 2.45
+F....002 = 0.61
+F....004 = 7.91
+F....006 = 4.54
+F....007 = 1.14
+F....009 = 0.28
+F....010 = 1.13
+F....011 = 21.46
+F....013 = 4.64
+F....014 = 0.31
+F....015 = 1.24
+F....017 = 0.07
+F....019 = 2.41
+F....020 = 0.39
+F....021 = 7.41
+F....023 = 0.07
+F....025 = 19.22
+F....026 = 10.49
+F....028 = 0.88
+F....029 = 5.7
+F....030 = 0.28
+F....031 = 0.28
+F....033 = 0.19
+F....034 = 0.19
+F....035 = 0.28
+F....036 = 0.57
+F....038 = 5.3
+F....039 = 5.32
+F....040 = 0.76
+F....041 = 5.08
+F....042 = 6.44
+F.001... = 0
+F.001003 = 2.45
+F.002003 = 0.61
+F.002... = 0
+F.003005 = 3.06
+F.004005 = 7.91
+F.004... = 0
+F.005007 = 10.97
+F.006007 = 4.54
+F.007008 = 16.65
+F.008... = 0
+F.008009 = 16.65
+F.010012 = 1.13
+F.011012 = 21.46
+F.012... = 0
+F.012013 = 22.59
+F.013016 = 27.23
+F.014015 = 0.31
+F.015016 = 1.55
+F.016... = 0
+F.016017 = 28.78
+F.017018 = 28.85
+F.009018 = 16.93
+F.018019 = 45.78
+F.019024 = 48.19
+F.024... = 0
+F.023024 = 7.87
+F.022023 = 7.8
+F.020022 = 0.39
+F.021022 = 7.41
+F.022... = 0
+F.024026 = 56.06
+F.025026 = 19.22
+F.025... = 0
+F.026027 = 85.77
+F.027... = 0
+F.027032 = 85.77
+F.030031 = 0.28
+F.031032 = 7.14
+F.029031 = 6.58
+F.028029 = 0.88
+F.028... = 0
+F.032033 = 92.91
+F.033037 = 93.1
+F.036037 = 1.04
+F.034036 = 0.19
+F.035036 = 0.28
+F.037038 = 94.14
+F.038040 = 99.44
+F.039040 = 5.32
+F.040... = 0
+F.041... = 0
+F.040041 = 105.52
+F.041042 = 110.6
+F.042... = 117.04
+*** ./ppl_lpsol -s -p1 -oobtained -r -m ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ./ppl_lpsol -s -p1 -oobtained -r -M ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m kb2.mps
+Optimum value: -1749.90013
+Optimum location:
+BAL.3EBW = 0.8118235251
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 4.672552268
+BP8.3EBW = 25.06112421
+BTO.3EBW = 5
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 9.550968074
+BLV.3PBW = 0
+BN4.3PBW = 2.506552313
+BP8.3PBW = 8.779496855
+BTO.3PBW = 0
+BAL.3RBW = 9.188176475
+BHC.3RBW = 20
+BLC.3RBW = 15.44903193
+BLV.3RBW = 12
+BN4.3RBW = 8.391585075
+BP8.3RBW = 1.159378938
+BTO.3RBW = 0
+D3T...BW = 122.5706897
+EAL...BW = 10
+EHC...BW = 20
+ELC...BW = 25
+ELV...BW = 12
+EN4...BW = 15.57068966
+EP8...BW = 35
+ETO...BW = 5
+M3..3TBW = 122.5706897
+QPB73EBW = 15.05088823
+QVO73EBW = 35.5455
+QVO73PBW = 20.83701724
+QPB73RBW = 49.6741722
+QVO73RBW = 66.18817241
+WMO73EBW = 3214.889184
+WRO73EBW = 3597.519648
+WMO73PBW = 1770.361014
+WRO73PBW = 2009.742955
+WMO73RBW = 5651.99315
+WRO73RBW = 6262.646874
+*** ./ppl_lpsol -s -p1 -oobtained -r -M kb2.mps
+Optimum value: 0
+Optimum location:
+BAL.3EBW = 0
+BHC.3EBW = 0
+BLC.3EBW = 0
+BLV.3EBW = 0
+BN4.3EBW = 0
+BP8.3EBW = 0
+BTO.3EBW = 0
+BAL.3PBW = 0
+BHC.3PBW = 0
+BLC.3PBW = 0
+BLV.3PBW = 0
+BN4.3PBW = 0
+BP8.3PBW = 0
+BTO.3PBW = 0
+BAL.3RBW = 0
+BHC.3RBW = 0
+BLC.3RBW = 0
+BLV.3RBW = 0
+BN4.3RBW = 0
+BP8.3RBW = 0
+BTO.3RBW = 0
+D3T...BW = 0
+EAL...BW = 0
+EHC...BW = 0
+ELC...BW = 0
+ELV...BW = 0
+EN4...BW = 0
+EP8...BW = 0
+ETO...BW = 0
+M3..3TBW = 0
+QPB73EBW = 0
+QVO73EBW = 0
+QVO73PBW = 0
+QPB73RBW = 0
+QVO73RBW = 0
+WMO73EBW = 0
+WRO73EBW = 0
+WMO73PBW = 0
+WRO73PBW = 0
+WMO73RBW = 0
+WRO73RBW = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m lseu.mps
+Optimum value: 834.6823529
+Optimum location:
+C101 = 1
+C102 = 1
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 1
+C108 = 0
+C109 = 0
+C110 = 0
+C111 = 0.4367816092
+C112 = 0.3367816092
+C113 = 0
+C114 = 0.2264367816
+C115 = 0
+C116 = 0
+C117 = 0
+C118 = 0
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 0
+C123 = 0
+C124 = 0
+C125 = 0
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0.6117647059
+C130 = 0.155
+C131 = 0
+C132 = 0
+C133 = 0
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 1
+C140 = 0
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 0.38
+C145 = 0
+C146 = 0
+C147 = 0.62
+C148 = 0
+C149 = 0
+C150 = 0.1
+C151 = 0.9
+C152 = 0
+C153 = 0
+C154 = 0
+C155 = 0
+C156 = 1
+C157 = 0
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 0
+C164 = 0.9043285239
+C165 = 0.09567147614
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 0
+C177 = 0
+C178 = 0
+C179 = 0
+C180 = 0
+C181 = 0
+C182 = 0
+C183 = 0
+C184 = 0
+C185 = 0
+C186 = 0
+C187 = 0
+C188 = 0
+C189 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M lseu.mps
+Optimum value: 7167.482759
+Optimum location:
+C101 = 0
+C102 = 0
+C103 = 0
+C104 = 0
+C105 = 0
+C106 = 0
+C107 = 0
+C108 = 1
+C109 = 0
+C110 = 0
+C111 = 1
+C112 = 0
+C113 = 0
+C114 = 0
+C115 = 1
+C116 = 0
+C117 = 0
+C118 = 0.6896551724
+C119 = 0
+C120 = 0
+C121 = 0
+C122 = 1
+C123 = 0
+C124 = 0
+C125 = 1
+C126 = 0
+C127 = 0
+C128 = 0
+C129 = 0
+C130 = 0
+C131 = 0
+C132 = 0
+C133 = 1
+C134 = 0
+C135 = 1
+C136 = 0
+C137 = 0
+C138 = 0
+C139 = 0
+C140 = 1
+C141 = 0
+C142 = 0
+C143 = 0
+C144 = 1
+C145 = 0
+C146 = 0
+C147 = 0
+C148 = 0
+C149 = 0
+C150 = 0
+C151 = 1
+C152 = 0
+C153 = 1
+C154 = 0
+C155 = 0
+C156 = 0
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0.4643273602
+x14 = 0
+x15 = 1
+x16 = 0.9623071054
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0
+x22 = 1
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 1
+x29 = 1
+x30 = 1
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 1
+x35 = 0
+x36 = 1
+x37 = 0.839896525
+x38 = 0
+x39 = 0
+x40 = 1
+x41 = 1
+x42 = 0
+x43 = 1
+x44 = 0.09199314836
+x45 = 1
+x46 = 1
+x47 = 1
+x48 = 1
+x49 = 0
+x50 = 1
+x51 = 1
+x52 = 0
+x53 = 1
+x54 = 1
+x55 = 0
+x56 = 0.3536953199
+x57 = 1
+x58 = 0
+x59 = 0
+x60 = 1
+x61 = 0
+x62 = 0.2898890259
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare1.mps
+Optimum value: 7286
+Optimum location:
+x1 = 1116
+x2 = 0
+x3 = 1325
+x4 = 0
+x5 = 1353
+x6 = 0
+x7 = 1169
+x8 = 0
+x9 = 1160
+x10 = 0
+x11 = 1163
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m markshare2.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 0
+x18 = 1
+x19 = 1
+x20 = 1
+x21 = 0.3717008822
+x22 = 0.1692962317
+x23 = 1
+x24 = 0
+x25 = 0
+x26 = 1
+x27 = 1
+x28 = 0
+x29 = 0
+x30 = 1
+x31 = 1
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 1
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 1
+x40 = 0
+x41 = 0
+x42 = 1
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 1
+x47 = 0
+x48 = 0
+x49 = 0.01751673708
+x50 = 0.1466102207
+x51 = 0.3205265241
+x52 = 1
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 1
+x60 = 1
+x61 = 1
+x62 = 1
+x63 = 1
+x64 = 1
+x65 = 0.4427598921
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 1
+x73 = 0.6098932051
+x74 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -r -M markshare2.mps
+Optimum value: 10512
+Optimum location:
+x1 = 1324
+x2 = 0
+x3 = 1554
+x4 = 0
+x5 = 1429
+x6 = 0
+x7 = 1686
+x8 = 0
+x9 = 1482
+x10 = 0
+x11 = 1613
+x12 = 0
+x13 = 1424
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas76.mps
+Optimum value: 38893.90364
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 1
+x13 = 0
+x14 = 1
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 1
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0.6025695449
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0.603337348
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 1
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0.0954968974
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0.9782647951
+x85 = 0
+x86 = 0.1119635585
+x87 = 0
+x88 = 1
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0.3920130232
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 0
+x122 = 0.1417811418
+x123 = 0
+x124 = 0.5090665575
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6649413368
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0.8642716954
+x149 = 0
+x150 = 0.03629410147
+x151 = 38893.90349
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mas76.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1
+x8 = 1
+x9 = 0
+x10 = 0
+x11 = 1
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 1
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 1
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 1
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 1
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 0
+x84 = 0
+x85 = 1
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 1
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 1
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 1
+x131 = 0
+x132 = 1
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 1
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 1
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -M mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ./ppl_lpsol -s -p1 -oobtained -r -m noswot.mps
+Optimum value: -43
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0.9583331684
+x52 = 9.1999988
+x53 = 1
+x54 = 9.6000004
+x55 = 1
+x56 = 9.6000004
+x57 = 1
+x58 = 9.6000004
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M noswot.mps
+Optimum value: -5
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 0.7381463424
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 0
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0.9300625312
+x70 = 5
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m p0033.mps
+Optimum value: 2520.571739
+Optimum location:
+C157 = 0
+C158 = 1
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 1
+C163 = 0
+C164 = 0
+C165 = 1
+C166 = 0.02173913043
+C167 = 0.3565217391
+C168 = 0
+C169 = 0
+C170 = 1
+C171 = 0
+C172 = 0
+C173 = 0
+C174 = 0
+C175 = 0
+C176 = 1
+C177 = 0
+C178 = 1
+C179 = 0.36
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 0.29
+C184 = 1
+C185 = 1
+C186 = 0.5
+C187 = 0
+C188 = 1
+C189 = 0.175
+*** ./ppl_lpsol -s -p1 -oobtained -r -M p0033.mps
+Optimum value: 5299.698868
+Optimum location:
+C157 = 1
+C158 = 0
+C159 = 0
+C160 = 0
+C161 = 0
+C162 = 0
+C163 = 1
+C164 = 0
+C165 = 0.5886792453
+C166 = 0
+C167 = 0
+C168 = 0
+C169 = 0
+C170 = 0
+C171 = 1
+C172 = 1
+C173 = 1
+C174 = 1
+C175 = 1
+C176 = 1
+C177 = 1
+C178 = 1
+C179 = 1
+C180 = 1
+C181 = 1
+C182 = 1
+C183 = 1
+C184 = 1
+C185 = 1
+C186 = 0.72
+C187 = 0
+C188 = 1
+C189 = 1
+*** ./ppl_lpsol -s -p1 -oobtained -r -m pk1.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0.853048009
+x3 = 0
+x4 = 0
+x5 = 0.9902413468
+x6 = 0.6585148486
+x7 = 0.2829608277
+x8 = 0
+x9 = 0
+x10 = 1
+x11 = 0
+x12 = 1
+x13 = 0.331125321
+x14 = 0
+x15 = 0
+x16 = 1
+x17 = 1
+x18 = 1
+x19 = 0
+x20 = 0.1009956211
+x21 = 0.6785106979
+x22 = 0
+x23 = 1
+x24 = 0.8947436612
+x25 = 1
+x26 = 0
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0.1242007274
+x34 = 0.557112246
+x35 = 0.429812324
+x36 = 1
+x37 = 1
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0.3510036592
+x43 = 0
+x44 = 1
+x45 = 1
+x46 = 0
+x47 = 0
+x48 = 0.5414381495
+x49 = 1
+x50 = 0.2173113881
+x51 = 0
+x52 = 1
+x53 = 1
+x54 = 0
+x55 = 1
+x56 = 0.9323580046
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M pk1.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc105.mps
+Optimum value: -52.20206121
+Optimum location:
+COL00001 = 0
+COL00002 = 10.84845409
+COL00003 = 52.20206121
+COL00004 = 52.20206121
+COL00005 = 52.20206121
+COL00006 = 0
+COL00007 = 10.84845409
+COL00008 = 52.20206121
+COL00009 = 0
+COL00010 = 10.84845409
+COL00011 = 52.20206121
+COL00012 = 0
+COL00013 = 12.35752655
+COL00014 = 57.42226733
+COL00015 = 57.42226733
+COL00016 = 109.6243285
+COL00017 = 0
+COL00018 = 23.20598064
+COL00019 = 109.6243285
+COL00020 = 0
+COL00021 = 23.20598064
+COL00022 = 109.6243285
+COL00023 = 0
+COL00024 = 14.22961977
+COL00025 = 63.16449407
+COL00026 = 63.16449407
+COL00027 = 172.7888226
+COL00028 = 0
+COL00029 = 37.43560041
+COL00030 = 172.7888226
+COL00031 = 0
+COL00032 = 37.43560041
+COL00033 = 172.7888226
+COL00034 = 0
+COL00035 = 16.6070926
+COL00036 = 69.48094347
+COL00037 = 69.48094347
+COL00038 = 242.2697661
+COL00039 = 0
+COL00040 = 54.042693
+COL00041 = 242.2697661
+COL00042 = 0
+COL00043 = 54.042693
+COL00044 = 242.2697661
+COL00045 = 0
+COL00046 = 19.69956814
+COL00047 = 76.42903782
+COL00048 = 76.42903782
+COL00049 = 318.6988039
+COL00050 = 0
+COL00051 = 73.74226114
+COL00052 = 318.6988039
+COL00053 = 0
+COL00054 = 73.74226114
+COL00055 = 318.6988039
+COL00056 = 0
+COL00057 = 23.81717437
+COL00058 = 84.0719416
+COL00059 = 84.0719416
+COL00060 = 402.7707455
+COL00061 = 0
+COL00062 = 97.55943551
+COL00063 = 402.7707455
+COL00064 = 0
+COL00065 = 97.55943551
+COL00066 = 402.7707455
+COL00067 = 17.9865343
+COL00068 = 20.42709879
+COL00069 = 92.47913576
+COL00070 = 92.47913576
+COL00071 = 495.2498813
+COL00072 = 17.9865343
+COL00073 = 117.9865343
+COL00074 = 495.2498813
+COL00075 = 17.9865343
+COL00076 = 117.9865343
+COL00077 = 495.2498813
+COL00078 = 21.79865343
+COL00079 = 21.79865343
+COL00080 = 101.7270493
+COL00081 = 101.7270493
+COL00082 = 596.9769306
+COL00083 = 39.78518773
+COL00084 = 139.7851877
+COL00085 = 596.9769306
+COL00086 = 39.78518773
+COL00087 = 139.7851877
+COL00088 = 596.9769306
+COL00089 = 23.97851877
+COL00090 = 23.97851877
+COL00091 = 111.8997543
+COL00092 = 111.8997543
+COL00093 = 708.8766849
+COL00094 = 63.7637065
+COL00095 = 163.7637065
+COL00096 = 708.8766849
+COL00097 = 63.7637065
+COL00098 = 163.7637065
+COL00099 = 708.8766849
+COL00100 = 26.37637065
+COL00101 = 26.37637065
+COL00102 = 123.0897297
+COL00103 = 123.0897297
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 0
+COL00051 = 0
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 0
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 0
+COL00062 = 0
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 0
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 0
+COL00073 = 0
+COL00074 = 0
+COL00075 = 0
+COL00076 = 0
+COL00077 = 0
+COL00078 = 0
+COL00079 = 0
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 0
+COL00084 = 0
+COL00085 = 0
+COL00086 = 0
+COL00087 = 0
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 0
+COL00092 = 0
+COL00093 = 0
+COL00094 = 0
+COL00095 = 0
+COL00096 = 0
+COL00097 = 0
+COL00098 = 0
+COL00099 = 0
+COL00100 = 0
+COL00101 = 0
+COL00102 = 0
+COL00103 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50a.mps
+Optimum value: -64.57507706
+Optimum location:
+COL00001 = 0
+COL00002 = 16.56869221
+COL00003 = 64.57507706
+COL00004 = 64.57507706
+COL00005 = 64.57507706
+COL00006 = 0
+COL00007 = 16.56869221
+COL00008 = 64.57507706
+COL00009 = 0
+COL00010 = 16.56869221
+COL00011 = 64.57507706
+COL00012 = 0
+COL00013 = 20.00990753
+COL00014 = 71.03258476
+COL00015 = 71.03258476
+COL00016 = 135.6076618
+COL00017 = 0
+COL00018 = 36.57859974
+COL00019 = 135.6076618
+COL00020 = 0
+COL00021 = 36.57859974
+COL00022 = 135.6076618
+COL00023 = 14.17734478
+COL00024 = 17.59874505
+COL00025 = 78.13584324
+COL00026 = 78.13584324
+COL00027 = 213.7435051
+COL00028 = 14.17734478
+COL00029 = 54.17734478
+COL00030 = 213.7435051
+COL00031 = 14.17734478
+COL00032 = 54.17734478
+COL00033 = 213.7435051
+COL00034 = 18.41773448
+COL00035 = 18.41773448
+COL00036 = 85.94942756
+COL00037 = 85.94942756
+COL00038 = 299.6929326
+COL00039 = 32.59507926
+COL00040 = 72.59507926
+COL00041 = 299.6929326
+COL00042 = 32.59507926
+COL00043 = 72.59507926
+COL00044 = 299.6929326
+COL00045 = 20.25950793
+COL00046 = 20.25950793
+COL00047 = 94.54437032
+COL00048 = 94.54437032
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m sc50b.mps
+Optimum value: -70
+Optimum location:
+COL00001 = 30
+COL00002 = 28
+COL00003 = 42
+COL00004 = 70
+COL00005 = 70
+COL00006 = 30
+COL00007 = 28
+COL00008 = 42
+COL00009 = 30
+COL00010 = 28
+COL00011 = 42
+COL00012 = 33
+COL00013 = 30.8
+COL00014 = 46.2
+COL00015 = 77
+COL00016 = 147
+COL00017 = 63
+COL00018 = 58.8
+COL00019 = 88.2
+COL00020 = 63
+COL00021 = 58.8
+COL00022 = 88.2
+COL00023 = 36.3
+COL00024 = 33.88
+COL00025 = 50.82
+COL00026 = 84.7
+COL00027 = 231.7
+COL00028 = 99.3
+COL00029 = 92.68
+COL00030 = 139.02
+COL00031 = 99.3
+COL00032 = 92.68
+COL00033 = 139.02
+COL00034 = 39.93
+COL00035 = 37.268
+COL00036 = 55.902
+COL00037 = 93.17
+COL00038 = 324.87
+COL00039 = 139.23
+COL00040 = 129.948
+COL00041 = 194.922
+COL00042 = 139.23
+COL00043 = 129.948
+COL00044 = 194.922
+COL00045 = 43.923
+COL00046 = 40.9948
+COL00047 = 61.4922
+COL00048 = 102.487
+*** ./ppl_lpsol -s -p1 -oobtained -r -M sc50b.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 0
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 0
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 0
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 0
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 0
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 0
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 0
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m unboundedmin.mps
+Unbounded problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -M unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -r  -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -r  -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -e -r  -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -r  -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000518 boeing1.mps
+Optimum value: -335.2135675
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 12
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 14
+PBOSLAX1 = 0
+PBOSLAX7 = 0
+PBOSSEA0 = 0
+PBOSSEA1 = 0
+PBOSSEA2 = 49
+PBOSSFO0 = 60
+PBOSSFO1 = 73
+PBOSTPE1 = 1
+PBOSTPE2 = 0
+PBOSTYO1 = 3
+PBOSTYO2 = 0
+PBOSYUL0 = 28.13380282
+PBOSYUL1 = 347.7678621
+PBOSYUL2 = 0.325
+PBOSYUL3 = 336.7733351
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 0
+PBOSYVR2 = 26
+PBOSYWG0 = 0
+PBOSYWG1 = 0
+PBOSYWG7 = 37
+PBOSYYZ0 = 19.03169014
+PBOSYYZ1 = 195.9683099
+PBUROAK0 = 11
+PBUROAK1 = 16
+PBURSEA0 = 83
+PBURSEA1 = 0
+PBURSFO0 = 278
+PHNLLAX0 = 104.0482353
+PHNLLAX1 = 33.04
+PHNLLAX2 = 68.20588235
+PHNLLAX3 = 98
+PHNLLON0 = 0
+PHNLLON6 = 5
+PHNLPAR0 = 0
+PHNLPAR6 = 1
+PHNLSEA0 = 0
+PHNLSEA1 = 157.7943925
+PHNLSEA2 = 0
+PHNLSFO0 = 35
+PHNLSFO1 = 0
+PHNLSFO7 = 0
+PHNLYVR0 = 94.20560748
+PHNLYVR1 = 0
+PHNLYVR7 = 39.79439252
+PLASSEA0 = 70.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 0
+PLASYVR6 = 37
+PLAXOAK0 = 32
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 0
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 546.0147059
+PLAXSEA4 = 3.720588235
+PLAXSEA5 = 139
+PLAXSEA6 = 66.26744186
+PLAXSEA7 = 0
+PLAXSEA8 = 57
+PLAXSEA9 = 5.415868673
+PLAXSFO0 = 33.04
+PLAXSFO1 = 260.8488372
+PLAXSFO2 = 839.9632721
+PLAXSFO3 = 87.90697674
+PLAXSFO4 = 168
+PLAXSFO5 = 98
+PLAXSFO6 = 1464.240914
+PLAXTPE0 = 8.581395349
+PLAXTPE1 = 0
+PLAXTPE2 = 18
+PLAXTPE8 = 4.418604651
+PLAXTYO0 = 41
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 0
+PLAXYVR0 = 0
+PLAXYVR1 = 153.755814
+PLAXYVR2 = 39.24418605
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 2
+PLONSEA0 = 0
+PLONSEA1 = 151
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 51
+POAKONT0 = 0
+POAKONT1 = 13
+POAKSEA0 = 37.89108456
+POAKSEA1 = 77.15303309
+POAKSEA2 = 6.955882353
+PONTSFO0 = 177
+PONTSEA0 = 23.10431985
+PONTSEA1 = 24.89568015
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 68
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 24
+PRNOSEA0 = 0
+PRNOSEA1 = 291
+PRNOYVR0 = 67
+PSEASFO0 = 0
+PSEASFO1 = 839.9632721
+PSEASFO2 = 146.6809139
+PSEASFO3 = 236.6
+PSEASFO4 = 0
+PSEASFO5 = 50.75581395
+PSEASFO6 = 168
+PSEATPE0 = 15.81395349
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 49.60465116
+PSEATYO0 = 59.98837209
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 95.01162791
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 70.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 6
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 17
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 111
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 0
+PTPEYVR0 = 57
+PTYOYVR0 = 91
+PYULYVR0 = 36.4084507
+PYULYVR1 = 134.1343917
+PYULYVR2 = 139.6904909
+PYULYVR3 = 4.766666667
+PYULYWG0 = 0
+PYULYWG1 = 271.3172923
+PYULYWG2 = 0
+PYULYWG3 = 178.6827077
+PYULYYZ0 = 0
+PYULYYZ1 = 266.6818464
+PYULYYZ2 = 0
+PYULYYZ3 = 431.9057717
+PYULYYZ4 = 1913.412382
+PYVRYWG0 = 14.67957746
+PYVRYWG1 = 271.3172923
+PYVRYWG2 = 138.0031303
+PYVRYYZ0 = 4.352112676
+PYVRYYZ1 = 241.2835753
+PYVRYYZ2 = 126.3643121
+PYWGYYZ0 = 14.67957746
+PYWGYYZ1 = 138.0031303
+PYWGYYZ2 = 0
+PYWGYYZ3 = 125.3172923
+PBOSOAK0 = 11
+PBOSOAK6 = 0
+PBOSBUR1 = 7
+PBOSBUR2 = 0
+PBOSONT1 = 4
+PBOSONT2 = 0
+PBURYVR1 = 26
+PBURTYO1 = 2
+PBURTPE1 = 1
+PBURHNL0 = 11
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 24
+PHNLOAK2 = 0
+PHNLOAK8 = 0
+PHNLONT0 = 9.705882353
+PHNLONT6 = 6.294117647
+PHNLYWG1 = 3
+PHNLYYZ1 = 24
+PHNLYUL1 = 40
+PLASTYO1 = 5
+PLASTPE1 = 1
+PLAXLON0 = 13
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 8
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 1
+PBURPAR1 = 1
+PLONONT1 = 1
+PLONOAK1 = 1
+POAKPAR1 = 2
+POAKTYO1 = 7
+POAKTPE1 = 2
+PONTPAR1 = 2
+PONTTYO1 = 2
+PONTTPE1 = 1
+PPARSFO1 = 2
+PRNOTYO1 = 5
+PRNOTPE1 = 2
+PTPEYWG1 = 21
+PTPEYYZ1 = 13
+PTPEYUL1 = 6
+PTYOYUL1 = 7
+PTYOYYZ1 = 17
+PTYOYWG1 = 25
+PLAXONT0 = 6.294117647
+GRDTIMO1 = 0
+GRDTIMN1 = -49.01286158
+GRDTIMO2 = 0
+GRDTIMN2 = 0
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = 0
+GRDTIMO5 = 0
+GRDTIMN5 = -47.24353963
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 0
+N1002AC3 = 2.355140187
+N1003AC1 = 0
+N1003AC2 = 0.1603208556
+N1003AC3 = 0.7214438503
+N1004AC1 = 0.28
+N1004AC2 = 0
+N1004AC3 = 0
+N1005AC3 = 0.0859375
+N1105AC3 = 0.8382352941
+N1006AC3 = 0.07582720588
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 0
+N1008AC2 = 0
+N1008AC3 = 0
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 4.65801495
+N1009AC1 = 0
+N1009AC2 = 0.07488107822
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 1.921947674
+N1010AC1 = 0
+N1010AC2 = 0
+N1010AC3 = 0
+N1010AC4 = 0
+N1010AC5 = 0
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 3.085065996
+N1011AC3 = 0.6951730236
+N1011AC4 = 0
+N1011AC5 = 3.897217244
+N1011AC6 = 0
+N1012AC1 = 1.510832058
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 2.417331293
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 0.9241727941
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 1.691245404
+N1014AC6 = 0.2228170956
+N1015AC3 = 0
+N1015AC4 = 0.7048194147
+N1015AC5 = 0.1595430366
+N1015AC6 = 2.135637549
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0.7
+N1016AC6 = 3.3
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.1617647059
+N1018AC1 = 0
+N1018AC2 = 0
+N1018AC3 = 0
+N1018AC4 = 0
+N1018AC5 = 0
+N1018AC6 = 1.196428571
+N1019AC1 = 0
+N1019AC2 = 0
+N1019AC3 = 0
+N1019AC4 = 0.2345133807
+N1019AC5 = 0.7654866193
+N1020AC1 = 0.2228332753
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 3.200696136
+N1020AC6 = 0
+N1021AC1 = 0.664202377
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 2.453858782
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0.476744186
+N1028AC1 = 0
+N1029AC1 = 0.523255814
+N1030AC1 = 1
+N1032AC1 = 0
+N1032AC2 = 0
+N1032AC3 = 0
+N1032AC4 = 0.8274647887
+N1032AC5 = 0
+N1033AC1 = 0.4860357964
+N1033AC2 = 0.5004769224
+N1033AC3 = 0
+N1033AC4 = 0
+N1033AC5 = 2.061996183
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 3.174783885
+N1035AC1 = 0.6827679474
+N1035AC2 = 0
+N1035AC3 = 0
+N1035AC4 = 0.7269371829
+N1035AC5 = 0.2529831862
+N1036AC1 = 0.1083333333
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 0
+N1038AC4 = 0.2383968781
+N1038AC5 = 1.271450017
+N1039AC4 = 0
+N1039AC5 = 2.077705904
+N1040AC4 = 0
+N1040AC5 = 0
+N1040AC6 = 9.513243659
+N1041AC4 = 8.856901224
+N1041AC5 = 0
+N1041AC6 = 20
+N1042AC4 = 0
+N1042AC5 = 0
+N1042AC6 = 0
+N1043AC1 = 0.1725352113
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 0
+N1044AC3 = 1
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 0
+N1047AC3 = 1
+N1050AC3 = 0
+N1050AC4 = 0
+N1050AC5 = 0.0731874145
+N1051AC1 = 0
+N1051AC2 = 0
+N1051AC3 = 0
+N1051AC4 = 0
+N1051AC5 = 4.651904242
+N1051AC6 = 20
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0000000105 boeing1.mps
+Optimum value: 286.9746573
+Optimum location:
+PBOSHNL0 = 0
+PBOSHNL1 = 10
+PBOSHNL7 = 0
+PBOSHNL8 = 0
+PBOSLAX0 = 0
+PBOSLAX1 = 0
+PBOSLAX7 = 12
+PBOSSEA0 = 0
+PBOSSEA1 = 40
+PBOSSEA2 = 0
+PBOSSFO0 = 48
+PBOSSFO1 = 73
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 372
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 11.94690265
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 193
+PBOSYYZ1 = 0
+PBUROAK0 = 9
+PBUROAK1 = 15
+PBURSEA0 = 69
+PBURSEA1 = 0
+PBURSFO0 = 243
+PHNLLAX0 = 0
+PHNLLAX1 = 126.296875
+PHNLLAX2 = 100.03125
+PHNLLAX3 = 104.4375
+PHNLLON0 = 0
+PHNLLON6 = 0
+PHNLPAR0 = 0
+PHNLPAR6 = 0
+PHNLSEA0 = 0
+PHNLSEA1 = 135.2523364
+PHNLSEA2 = 0
+PHNLSFO0 = 0
+PHNLSFO1 = 0
+PHNLSFO7 = 31
+PHNLYVR0 = 80.74766355
+PHNLYVR1 = 0
+PHNLYVR7 = 35.25233645
+PLASSEA0 = 365
+PLASSEA1 = 0
+PLASYVR0 = 0
+PLASYVR6 = 33
+PLAXOAK0 = 42.765625
+PLAXOAK1 = 0
+PLAXOAK2 = 46
+PLAXSEA0 = 543.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 0
+PLAXSEA8 = 66
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 842
+PLAXSFO2 = 0
+PLAXSFO3 = 168
+PLAXSFO4 = 168
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 0
+PLAXTYO2 = 0
+PLAXTYO8 = 36
+PLAXYVR0 = 116
+PLAXYVR1 = 0
+PLAXYVR2 = 57
+PLONPAR0 = 0
+PLONPAR1 = 0
+PLONPAR2 = 0
+PLONSEA0 = 0
+PLONSEA1 = 127
+PLONYVR0 = 0
+PLONYVR1 = 0
+PLONYVR7 = 45
+POAKONT0 = 0
+POAKONT1 = 11
+POAKSEA0 = 41
+POAKSEA1 = 57
+POAKSEA2 = 0
+PONTSFO0 = 155
+PONTSEA0 = 25
+PONTSEA1 = 12
+PONTSEA2 = 0
+PPARSEA0 = 0
+PPARSEA1 = 53
+PPARYVR0 = 0
+PPARYVR1 = 0
+PPARYVR7 = 21
+PRNOSEA0 = 255
+PRNOSEA1 = 0
+PRNOYVR0 = 60
+PSEASFO0 = 574
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 168
+PSEASFO6 = 168
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 126
+PSEATYO3 = 27
+PSEAYVR0 = 104.2523364
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 0
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 545
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 0
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 0
+PSFOTYO8 = 15
+PSFOYVR0 = 268
+PSFOYVR1 = 0
+PTPETYO0 = 0
+PTPETYO1 = 0
+PTPETYO2 = 0
+PTPETYO3 = 99
+PTPEYVR0 = 44
+PTYOYVR0 = 74
+PYULYVR0 = 182
+PYULYVR1 = 88
+PYULYVR2 = 0
+PYULYVR3 = 0
+PYULYWG0 = 161.3018868
+PYULYWG1 = 178
+PYULYWG2 = 31.69811321
+PYULYWG3 = 0
+PYULYYZ0 = 0
+PYULYYZ1 = 0
+PYULYYZ2 = 245.3018868
+PYULYYZ3 = 2104.698113
+PYULYYZ4 = 0
+PYVRYWG0 = 194.3018868
+PYVRYWG1 = 178
+PYVRYWG2 = 4.698113208
+PYVRYYZ0 = 328.6981132
+PYVRYYZ1 = 0
+PYVRYYZ2 = 4.301886792
+PYWGYYZ0 = 0
+PYWGYYZ1 = 4.698113208
+PYWGYYZ2 = 245.3018868
+PYWGYYZ3 = 0
+PBOSOAK0 = 9
+PBOSOAK6 = 0
+PBOSBUR1 = 0
+PBOSBUR2 = 0
+PBOSONT1 = 0
+PBOSONT2 = 0
+PBURYVR1 = 23
+PBURTYO1 = 0
+PBURTPE1 = 0
+PBURHNL0 = 9
+PBURHNL6 = 0
+PHNLOAK0 = 0
+PHNLOAK1 = 2.234375
+PHNLOAK2 = 0
+PHNLOAK8 = 18.765625
+PHNLONT0 = 0
+PHNLONT6 = 14
+PHNLYWG1 = 0
+PHNLYYZ1 = 21
+PHNLYUL1 = 35
+PLASTYO1 = 0
+PLASTPE1 = 0
+PLAXLON0 = 11
+PLAXLON6 = 0
+PLAXLON7 = 0
+PLAXPAR0 = 0
+PLAXPAR6 = 0
+PLAXPAR7 = 0
+PBURLON1 = 0
+PBURPAR1 = 0
+PLONONT1 = 0
+PLONOAK1 = 0
+POAKPAR1 = 0
+POAKTYO1 = 0
+POAKTPE1 = 0
+PONTPAR1 = 0
+PONTTYO1 = 0
+PONTTPE1 = 0
+PPARSFO1 = 0
+PRNOTYO1 = 0
+PRNOTPE1 = 0
+PTPEYWG1 = 18
+PTPEYYZ1 = 11
+PTPEYUL1 = 0
+PTYOYUL1 = 0
+PTYOYYZ1 = 15
+PTYOYWG1 = 22
+PLAXONT0 = 14
+GRDTIMO1 = 0
+GRDTIMN1 = -105
+GRDTIMO2 = 0
+GRDTIMN2 = -91
+GRDTIMO3 = 0
+GRDTIMN3 = -47
+GRDTIMO4 = 0
+GRDTIMN4 = -43.5
+GRDTIMO5 = 0
+GRDTIMN5 = -87
+GRDTIMO6 = 0
+GRDTIMN6 = -81
+N1001AC1 = 0
+N1001AC2 = 0
+N1001AC3 = 0
+N1002AC1 = 0
+N1002AC2 = 2.018691589
+N1002AC3 = 0
+N1003AC1 = 0
+N1003AC2 = 0
+N1003AC3 = 0
+N1004AC1 = 0
+N1004AC2 = 1.0703125
+N1004AC3 = 0
+N1005AC3 = 0.0703125
+N1105AC3 = 0.9296875
+N1006AC3 = 0
+N1007AC1 = 0
+N1007AC2 = 0
+N1007AC3 = 0
+N1008AC1 = 5.28156777
+N1008AC2 = 0
+N1008AC3 = 1.986798016
+N1008AC4 = 0
+N1008AC5 = 0
+N1008AC6 = 0
+N1009AC1 = 0
+N1009AC2 = 0
+N1009AC3 = 0
+N1009AC4 = 0
+N1009AC5 = 0
+N1010AC1 = 7
+N1010AC2 = 7
+N1010AC3 = 7
+N1010AC4 = 7
+N1010AC5 = 7
+N1010AC6 = 7
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 0
+N1011AC4 = 0
+N1011AC5 = 0
+N1011AC6 = 0
+N1012AC1 = 0
+N1012AC2 = 0
+N1012AC3 = 0
+N1012AC4 = 0
+N1012AC5 = 0
+N1013AC3 = 0
+N1013AC4 = 0
+N1013AC5 = 0
+N1013AC6 = 1
+N1014AC3 = 0
+N1014AC4 = 0
+N1014AC5 = 0
+N1014AC6 = 1.909090909
+N1015AC3 = 0
+N1015AC4 = 0
+N1015AC5 = 0
+N1015AC6 = 3
+N1016AC3 = 0
+N1016AC4 = 0
+N1016AC5 = 0
+N1016AC6 = 4
+N1017AC3 = 0
+N1017AC4 = 0
+N1017AC5 = 0
+N1017AC6 = 0.09090909091
+N1018AC1 = 3.782713663
+N1018AC2 = 6.749720385
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001305
+N1018AC6 = 0
+N1019AC1 = 0
+N1019AC2 = 1.412371134
+N1019AC3 = 0
+N1019AC4 = 2.587628866
+N1019AC5 = 0
+N1020AC1 = 0
+N1020AC2 = 0
+N1020AC3 = 0
+N1020AC4 = 0
+N1020AC5 = 0
+N1020AC6 = 0
+N1021AC1 = 0
+N1021AC2 = 0
+N1021AC3 = 0
+N1021AC4 = 0
+N1021AC5 = 0
+N1022AC1 = 0
+N1023AC1 = 0
+N1026AC1 = 1
+N1027AC1 = 0
+N1028AC1 = 0
+N1029AC1 = 1
+N1030AC1 = 1
+N1032AC1 = 1
+N1032AC2 = 1
+N1032AC3 = 1
+N1032AC4 = 1
+N1032AC5 = 1
+N1033AC1 = 0
+N1033AC2 = 1.371681416
+N1033AC3 = 0
+N1033AC4 = 0.6283185841
+N1033AC5 = 0
+N1034AC1 = 0
+N1034AC2 = 0
+N1034AC3 = 0
+N1035AC1 = 0
+N1035AC2 = 0.04608448823
+N1035AC3 = 0
+N1035AC4 = 0.01051928536
+N1035AC5 = 0
+N1036AC1 = 0
+N1036AC2 = 0
+N1036AC3 = 0
+N1037AC4 = 0
+N1037AC5 = 3.220930233
+N1038AC4 = 0
+N1038AC5 = 0
+N1039AC4 = 0
+N1039AC5 = 0
+N1040AC4 = 10
+N1040AC5 = 10
+N1040AC6 = 10
+N1041AC4 = 5.79377625
+N1041AC5 = 20
+N1041AC6 = 20
+N1042AC4 = 20
+N1042AC5 = 20
+N1042AC6 = 20
+N1043AC1 = 0
+N1043AC2 = 0
+N1043AC3 = 0
+N1044AC1 = 0
+N1044AC2 = 1
+N1044AC3 = 0
+N1046AC3 = 1
+N1047AC1 = 0
+N1047AC2 = 1
+N1047AC3 = 0
+N1050AC3 = 0.109375
+N1050AC4 = 0
+N1050AC5 = 0
+N1051AC1 = 20
+N1051AC2 = 20
+N1051AC3 = 20
+N1051AC4 = 0
+N1051AC5 = 20
+N1051AC6 = 11.52971853
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing1.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.00000000863 boeing2.mps
+Optimum value: -315.018728
+Optimum location:
+PBOSORD0 = 302
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 712
+PBOSLGA1 = 268
+PBOSLGA2 = 0
+PBOSLGA3 = 1372
+PBOSCLE0 = 4.108024927
+PBOSCLE1 = 137.8919751
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 34
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 268
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 470.294686
+PORDCLE1 = 148.705314
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 1162
+PLGABOS1 = 0
+PLGABOS2 = 458
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1123
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 0
+PCLELGA1 = 0
+PCLELGA2 = 409
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 0
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 1.5
+CORDBOS1 = 22.5
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 13
+CORDLGA1 = 0
+CORDLGA2 = 0
+CORDLGA3 = 0
+CLGAORD0 = 22.5
+CLGAORD1 = 22.5
+CLGAORD2 = 0
+CLGAORD3 = 0
+CLGACLE0 = 16
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 5
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 0
+GRDTIMN1 = 0
+GRDTIMO2 = 0
+GRDTIMN2 = -76.79770851
+GRDTIMN3 = -10.27177739
+GRDTIMN4 = -21.60844089
+N1003AC1 = 0
+N1003AC2 = 6.724489796
+N1003AC3 = 0.4
+N1003AC4 = 0
+N1005AC1 = 0.01346893419
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0.5855648822
+N1011AC2 = 0
+N1011AC3 = 0.2937198068
+N1011AC4 = 0
+N1013AC2 = 7.265306122
+N1013AC4 = 2
+N1015AC2 = 0
+N1015AC4 = 1.422222222
+N1017AC2 = 0
+N1017AC4 = 2
+N1019AC2 = 2.540816327
+N1019AC4 = 0
+N1021AC1 = 0.01346893419
+N1021AC2 = 0.1254559795
+N1021AC3 = 0
+N1021AC4 = 0
+N1002AC1 = 0
+N1002AC2 = 4.798925367
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 0
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 11.85714286
+N1008AC4 = 2
+N1010AC2 = 0
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 4.673469388
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 11.45918367
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.00000000213 boeing2.mps
+Optimum value: -73.3689691
+Optimum location:
+PBOSORD0 = 28
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 249
+PBOSLGA0 = 258.2518986
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810145
+PBOSLGA3 = 1372
+PBOSCLE0 = 0
+PBOSCLE1 = 0
+PBOSCLE2 = 0
+PBOSCLE3 = 142
+PORDBOS0 = 302
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 0
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 0
+PORDLGA2 = 515
+PORDLGA3 = 0
+PORDCLE0 = 0
+PORDCLE1 = 619
+PORDCLE2 = 0
+PORDCLE3 = 0
+PLGABOS0 = 0
+PLGABOS1 = 712
+PLGABOS2 = 0
+PLGABOS3 = 686
+PLGABOS4 = 426.7481014
+PLGABOS5 = 918.2518986
+PLGAORD0 = 258.2518986
+PLGAORD1 = 0
+PLGAORD2 = 453.7481014
+PLGAORD3 = 0
+PLGACLE0 = 517
+PLGACLE1 = 0
+PLGACLE2 = 0
+PCLEBOS0 = 131
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 0
+PCLEBOS4 = 0
+PCLEORD0 = 0
+PCLEORD1 = 0
+PCLEORD2 = 712
+PCLEORD3 = 0
+PCLEORD4 = 0
+PCLELGA0 = 197
+PCLELGA1 = 70
+PCLELGA2 = 0
+PCLELGA3 = 142
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0
+BBOSCLE1 = 0
+BORDBOS0 = 0
+CBOSORD0 = 0
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 0
+CBOSCLE2 = 12.8
+CBOSCLE3 = 0
+CORDBOS0 = 19.2
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 0
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 10.4
+CLGAORD3 = 25.6
+CLGACLE0 = 12.8
+CLGACLE1 = 0
+CLGACLE2 = 0
+CCLELGA0 = 0
+CCLELGA1 = 0
+CCLELGA2 = 0
+CCLELGA3 = 0
+GRDTIMO1 = 73.01076
+GRDTIMN1 = -100
+GRDTIMO2 = 0
+GRDTIMN2 = -90
+GRDTIMN3 = -45
+GRDTIMN4 = -45
+N1003AC1 = 7
+N1003AC2 = 0
+N1003AC3 = 0.6856076556
+N1003AC4 = 0
+N1005AC1 = 0
+N1005AC2 = 0
+N1005AC3 = 0
+N1005AC4 = 0
+N1011AC1 = 0
+N1011AC2 = 0
+N1011AC3 = 1.314392344
+N1011AC4 = 0
+N1013AC2 = 2.635223455
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 2
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082668
+N1019AC4 = 0.9244444444
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 2
+N1002AC1 = 7
+N1002AC2 = 0
+N1002AC3 = 2
+N1002AC4 = 2
+N1004AC2 = 0
+N1004AC4 = 0
+N1006AC1 = 7
+N1006AC2 = 0
+N1006AC3 = 2
+N1006AC4 = 0
+N1008AC2 = 0
+N1008AC4 = 0
+N1010AC2 = 7.265306122
+N1010AC4 = 0.9244444444
+N1012AC2 = 5.275510204
+N1012AC4 = 2
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572464
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 9.369917332
+N1201AC4 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -n boeing2.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m mas74.mps
+Optimum value: 10482.79528
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 1
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0.5347489362
+x15 = 1
+x16 = 0
+x17 = 0.2426314989
+x18 = 0
+x19 = 0.6876932386
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 0
+x25 = 0
+x26 = 0
+x27 = 0
+x28 = 0.2651304012
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 0
+x34 = 0.5013849046
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 1
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 1
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 1
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0.0325333004
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 1
+x65 = 0
+x66 = 0
+x67 = 1
+x68 = 0
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 0
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 1
+x89 = 1
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 1
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0.892553448
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0.01146190333
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 1
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0.6811784275
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0.6580158108
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 0
+x149 = 0.973369113
+x150 = 0.5192990175
+x151 = 10482.79508
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.000123 mas74.mps
+Optimum value: 1e+12
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+x4 = 0
+x5 = 1
+x6 = 0
+x7 = 0
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 1
+x16 = 0
+x17 = 0
+x18 = 0
+x19 = 0
+x20 = 0
+x21 = 0
+x22 = 0
+x23 = 0
+x24 = 1
+x25 = 0
+x26 = 1
+x27 = 0
+x28 = 0
+x29 = 0
+x30 = 0
+x31 = 0
+x32 = 0
+x33 = 1
+x34 = 0
+x35 = 0
+x36 = 0
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 0
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 0
+x45 = 0
+x46 = 0
+x47 = 1
+x48 = 0
+x49 = 0
+x50 = 0
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 0
+x55 = 0
+x56 = 0
+x57 = 0
+x58 = 0
+x59 = 0
+x60 = 0
+x61 = 0
+x62 = 0
+x63 = 0
+x64 = 0
+x65 = 0
+x66 = 0
+x67 = 0
+x68 = 0
+x69 = 1
+x70 = 0
+x71 = 0
+x72 = 0
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 0
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 0
+x81 = 0
+x82 = 1
+x83 = 1
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 1
+x98 = 0
+x99 = 0
+x100 = 0
+x101 = 0
+x102 = 0
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 1
+x114 = 1
+x115 = 0
+x116 = 0
+x117 = 1
+x118 = 0
+x119 = 0
+x120 = 1
+x121 = 1
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 1
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 1
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 1
+x148 = 1
+x149 = 0
+x150 = 1
+x151 = 1e+12
+*** ./ppl_lpsol -s -p1 -oobtained -n mas74.mps
+Feasible problem.
+*** ./ppl_lpsol -s -p1 -oobtained -r -m -c0.0000273 modglob.mps
+Optimum value: 20430947.62
+Optimum location:
+x1 = 0
+x2 = 23929.0382
+x3 = 0
+x4 = 0
+x5 = 0
+x6 = 0
+x7 = 1.833067347
+x8 = 0
+x9 = 0
+x10 = 0
+x11 = 0
+x12 = 0
+x13 = 0
+x14 = 0
+x15 = 86.19157484
+x16 = 0
+x17 = 0
+x18 = 636.0743694
+x19 = 0
+x20 = 0
+x21 = 605.2785996
+x22 = 2113.676289
+x23 = 0
+x24 = 0
+x25 = 1009.494466
+x26 = 5449.255398
+x27 = 0
+x28 = 0
+x29 = 7316.944573
+x30 = 0
+x31 = 7529.08308
+x32 = 3525.611302
+x33 = 0
+x34 = 0
+x35 = 0
+x36 = 2780.728439
+x37 = 0
+x38 = 0
+x39 = 0
+x40 = 889.0673525
+x41 = 0
+x42 = 0
+x43 = 0
+x44 = 205.0591339
+x45 = 0
+x46 = 0
+x47 = 0
+x48 = 0
+x49 = 6351.319455
+x50 = 1183.360764
+x51 = 0
+x52 = 0
+x53 = 0
+x54 = 2530.715783
+x55 = 1726.033672
+x56 = 0
+x57 = 0
+x58 = 1176.727362
+x59 = 887.6859319
+x60 = 0
+x61 = 0
+x62 = 838.4627167
+x63 = 0
+x64 = 126.3594424
+x65 = 0
+x66 = 204.7049902
+x67 = 0
+x68 = 142.8570486
+x69 = 0
+x70 = 0
+x71 = 0
+x72 = 41.54952653
+x73 = 0
+x74 = 0
+x75 = 0
+x76 = 569.7173314
+x77 = 0
+x78 = 0
+x79 = 0
+x80 = 212.2691988
+x81 = 0
+x82 = 481.1190763
+x83 = 0
+x84 = 0
+x85 = 0
+x86 = 0
+x87 = 0
+x88 = 0
+x89 = 0
+x90 = 0
+x91 = 0
+x92 = 0
+x93 = 0
+x94 = 0
+x95 = 0
+x96 = 0
+x97 = 0
+x98 = 0
+x99 = 0
+x100 = 11372.68698
+x101 = 8880.920376
+x102 = 621.3300236
+x103 = 0
+x104 = 0
+x105 = 0
+x106 = 0
+x107 = 0
+x108 = 0
+x109 = 0
+x110 = 0
+x111 = 0
+x112 = 0
+x113 = 0
+x114 = 0
+x115 = 0
+x116 = 0
+x117 = 0
+x118 = 0
+x119 = 0
+x120 = 0
+x121 = 0
+x122 = 0
+x123 = 0
+x124 = 0
+x125 = 0
+x126 = 0
+x127 = 0
+x128 = 0
+x129 = 0
+x130 = 0
+x131 = 0
+x132 = 0
+x133 = 0
+x134 = 0
+x135 = 0
+x136 = 0
+x137 = 0
+x138 = 0
+x139 = 0
+x140 = 0
+x141 = 0
+x142 = 0
+x143 = 0
+x144 = 0
+x145 = 0
+x146 = 0
+x147 = 0
+x148 = 0
+x149 = 0
+x150 = 0
+x151 = 0
+x152 = 0
+x153 = 0
+x154 = 0
+x155 = 0
+x156 = 0
+x157 = 0
+x158 = 0
+x159 = 0
+x160 = 0
+x161 = 0
+x162 = 0
+x163 = 0
+x164 = 0
+x165 = 0
+x166 = 0
+x167 = 0
+x168 = 0
+x169 = 0
+x170 = 0
+x171 = 0
+x172 = 0
+x173 = 0
+x174 = 0
+x175 = 0
+x176 = 0
+x177 = 0
+x178 = 0
+x179 = 0
+x180 = 0
+x181 = 0
+x182 = 0
+x183 = 0
+x184 = 0
+x185 = 0
+x186 = 0
+x187 = 0
+x188 = 0
+x189 = 0
+x190 = 0
+x191 = 0
+x192 = 0
+x193 = 0
+x194 = 0
+x195 = 0
+x196 = 0
+x197 = 0
+x198 = 0
+x199 = 0
+x200 = 0
+x201 = 0
+x202 = 0
+x203 = 0.000105591437
+x204 = 0
+x205 = 0.004964952468
+x206 = 0
+x207 = 0
+x208 = 0
+x209 = 0.05815060286
+x210 = 0
+x211 = 0.03486627878
+x212 = 0
+x213 = 0
+x214 = 0
+x215 = 0.03664022865
+x216 = 0
+x217 = 0.1217555466
+x218 = 0
+x219 = 0.3138972004
+x220 = 0
+x221 = 0.4214829823
+x222 = 0
+x223 = 0.4337029424
+x224 = 0
+x225 = 0
+x226 = 0
+x227 = 0
+x228 = 0
+x229 = 0
+x230 = 0
+x231 = 0.2030882087
+x232 = 0
+x233 = 0.1601802096
+x234 = 0
+x235 = 0.05121355717
+x236 = 0
+x237 = 0.6551086973
+x238 = 0
+x239 = 0
+x240 = 0
+x241 = 0
+x242 = 0
+x243 = 0
+x244 = 0
+x245 = 0.01181216209
+x246 = 0
+x247 = 0
+x248 = 0
+x249 = 0.03579089997
+x250 = 0
+x251 = 0.5115737543
+x252 = 0
+x253 = 0.0681659426
+x254 = 0
+x255 = 0.3658594156
+x256 = 0
+x257 = 0.09942590274
+x258 = 0
+x259 = 0.1457785589
+x260 = 0
+x261 = 0.05113398225
+x262 = 0
+x263 = 0.06778383419
+x264 = 0
+x265 = 0.04829854359
+x266 = 0
+x267 = 0.02771423251
+x268 = 0
+x269 = 0
+x270 = 0
+x271 = 0.01222748841
+x272 = 0
+x273 = 0
+x274 = 0
+x275 = 0.03281781863
+x276 = 0
+x277 = 0
+x278 = 0
+x279 = 0.002393405906
+x280 = 0
+x281 = 0
+x282 = 0
+x283 = 0.008229092659
+x284 = 0
+x285 = 0.01179176211
+x286 = 0
+x287 = 0.007278769726
+x288 = 0
+x289 = 0
+x290 = 0
+x291 = 0
+x292 = 0
+x293 = 0
+x294 = 0
+x295 = 0
+x296 = 0
+x297 = 0
+x298 = 0
+x299 = 1.5
+x300 = 69
+x301 = 520.5
+x302 = 495.299805
+x303 = 754.0998539
+x304 = 1198.5
+x305 = 2188.799805
+x306 = 594.4
+x307 = 51.4
+x308 = 75.6
+x309 = 563.0998539
+x310 = 1533.099854
+x311 = 556.299805
+x312 = 167.8
+x313 = 975.799805
+x314 = 1642.9
+x315 = 347.099854
+x316 = 262.799805
+x317 = 62
+x318 = 395.9
+x319 = 691.7
+x320 = 936.7
+x321 = 791.099854
+x322 = 106.7
+x323 = 393.7
+x324 = 173.7
+x325 = 466.2
+x326 = 34
+x327 = 116.9
+x328 = 103.4
+x329 = 552.099854
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 0
+x362 = 0
+x363 = 0
+x364 = 0
+x365 = 0
+x366 = 0
+x367 = 0
+x368 = 0
+x369 = 0
+x370 = 0
+x371 = 0
+x372 = 0
+x373 = 0
+x374 = 0
+x375 = 0
+x376 = 0
+x377 = 0
+x378 = 0
+x379 = 0
+x380 = 0
+x381 = 0
+x382 = 0
+x383 = 0
+x384 = 0
+x385 = 0
+x386 = 0
+x387 = 0
+x388 = 0
+x389 = 0
+x390 = 0
+x391 = 0
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -r -M -c0.0290 modglob.mps
+Optimum value: 742543789.3
+Optimum location:
+x1 = 0
+x2 = 57866.66667
+x3 = 0
+x4 = 52080
+x5 = 16665.6
+x6 = 17360
+x7 = 17360
+x8 = 15985.088
+x9 = 17360
+x10 = 16665.6
+x11 = 17360
+x12 = 17360
+x13 = 15971.2
+x14 = 17360
+x15 = 17360
+x16 = 17360
+x17 = 13609.96224
+x18 = 17360
+x19 = 15637.888
+x20 = 17360
+x21 = 17360
+x22 = 17360
+x23 = 14283.53024
+x24 = 17360
+x25 = 17360
+x26 = 17360
+x27 = 9281.22263
+x28 = 17360
+x29 = 17360
+x30 = 8748.398178
+x31 = 17360
+x32 = 17360
+x33 = 3236.582794
+x34 = 17360
+x35 = 12622.80876
+x36 = 17360
+x37 = 17360
+x38 = 17360
+x39 = 13943.27424
+x40 = 17360
+x41 = 17360
+x42 = 17360
+x43 = 15290.688
+x44 = 17360
+x45 = 17360
+x46 = 16665.6
+x47 = 17360
+x48 = 17360
+x49 = 17360
+x50 = 17360
+x51 = 1887.314667
+x52 = 17360
+x53 = 5398.256436
+x54 = 17360
+x55 = 17360
+x56 = 17360
+x57 = 8980.850078
+x58 = 17360
+x59 = 17360
+x60 = 17360
+x61 = 12636.55788
+x62 = 17360
+x63 = 15985.088
+x64 = 17360
+x65 = 13603.01824
+x66 = 17360
+x67 = 17360
+x68 = 17360
+x69 = 14950.432
+x70 = 17360
+x71 = 17360
+x72 = 17360
+x73 = 14950.432
+x74 = 17360
+x75 = 17360
+x76 = 17360
+x77 = 14950.432
+x78 = 17360
+x79 = 17360
+x80 = 17360
+x81 = 17360
+x82 = 17360
+x83 = 15637.888
+x84 = 16665.6
+x85 = 17360
+x86 = 16318.4
+x87 = 17360
+x88 = 17360
+x89 = 16318.4
+x90 = 17360
+x91 = 17360
+x92 = 16318.4
+x93 = 17360
+x94 = 17360
+x95 = 16318.4
+x96 = 17360
+x97 = 17360
+x98 = 16665.6
+x99 = 17360
+x100 = 17360
+x101 = 17360
+x102 = 17360
+x103 = 16665.6
+x104 = 17360
+x105 = 17360
+x106 = 15985.088
+x107 = 17360
+x108 = 16665.6
+x109 = 17360
+x110 = 17360
+x111 = 15971.2
+x112 = 17360
+x113 = 17360
+x114 = 17360
+x115 = 13609.96224
+x116 = 17360
+x117 = 15637.888
+x118 = 17360
+x119 = 17360
+x120 = 17360
+x121 = 14283.53024
+x122 = 17360
+x123 = 17360
+x124 = 17360
+x125 = 9281.22263
+x126 = 17360
+x127 = 17360
+x128 = 8748.398178
+x129 = 17360
+x130 = 17360
+x131 = 3236.582794
+x132 = 17360
+x133 = 12622.80876
+x134 = 17360
+x135 = 17360
+x136 = 17360
+x137 = 13943.27424
+x138 = 17360
+x139 = 17360
+x140 = 17360
+x141 = 15290.688
+x142 = 17360
+x143 = 17360
+x144 = 16665.6
+x145 = 17360
+x146 = 17360
+x147 = 17360
+x148 = 17360
+x149 = 1887.314667
+x150 = 17360
+x151 = 5398.256436
+x152 = 17360
+x153 = 17360
+x154 = 17360
+x155 = 8980.850078
+x156 = 17360
+x157 = 17360
+x158 = 17360
+x159 = 12636.55788
+x160 = 17360
+x161 = 15985.088
+x162 = 17360
+x163 = 13603.01824
+x164 = 17360
+x165 = 17360
+x166 = 17360
+x167 = 14950.432
+x168 = 17360
+x169 = 17360
+x170 = 17360
+x171 = 14950.432
+x172 = 17360
+x173 = 17360
+x174 = 17360
+x175 = 14950.432
+x176 = 17360
+x177 = 17360
+x178 = 17360
+x179 = 17360
+x180 = 17360
+x181 = 15637.888
+x182 = 16665.6
+x183 = 17360
+x184 = 16318.4
+x185 = 17360
+x186 = 17360
+x187 = 16318.4
+x188 = 17360
+x189 = 17360
+x190 = 16318.4
+x191 = 17360
+x192 = 17360
+x193 = 16318.4
+x194 = 17360
+x195 = 17360
+x196 = 16665.6
+x197 = 17360
+x198 = 17360
+x199 = 17360
+x200 = 17360
+x201 = 1
+x202 = 1
+x203 = 1
+x204 = 1
+x205 = 1
+x206 = 1
+x207 = 1
+x208 = 1
+x209 = 1
+x210 = 1
+x211 = 1
+x212 = 1
+x213 = 1
+x214 = 1
+x215 = 1
+x216 = 1
+x217 = 1
+x218 = 1
+x219 = 1
+x220 = 1
+x221 = 1
+x222 = 1
+x223 = 1
+x224 = 1
+x225 = 1
+x226 = 1
+x227 = 1
+x228 = 1
+x229 = 1
+x230 = 1
+x231 = 1
+x232 = 1
+x233 = 1
+x234 = 1
+x235 = 1
+x236 = 1
+x237 = 1
+x238 = 1
+x239 = 1
+x240 = 1
+x241 = 1
+x242 = 1
+x243 = 1
+x244 = 1
+x245 = 1
+x246 = 1
+x247 = 1
+x248 = 1
+x249 = 1
+x250 = 1
+x251 = 1
+x252 = 1
+x253 = 1
+x254 = 1
+x255 = 1
+x256 = 1
+x257 = 1
+x258 = 1
+x259 = 1
+x260 = 1
+x261 = 1
+x262 = 1
+x263 = 1
+x264 = 1
+x265 = 1
+x266 = 1
+x267 = 1
+x268 = 1
+x269 = 1
+x270 = 1
+x271 = 1
+x272 = 1
+x273 = 1
+x274 = 1
+x275 = 1
+x276 = 1
+x277 = 1
+x278 = 1
+x279 = 1
+x280 = 1
+x281 = 1
+x282 = 1
+x283 = 1
+x284 = 1
+x285 = 1
+x286 = 1
+x287 = 1
+x288 = 1
+x289 = 1
+x290 = 1
+x291 = 1
+x292 = 1
+x293 = 1
+x294 = 1
+x295 = 1
+x296 = 1
+x297 = 1
+x298 = 1
+x299 = 0
+x300 = 0
+x301 = 0
+x302 = 0
+x303 = 0
+x304 = 0
+x305 = 0
+x306 = 0
+x307 = 0
+x308 = 0
+x309 = 0
+x310 = 0
+x311 = 0
+x312 = 0
+x313 = 0
+x314 = 0
+x315 = 0
+x316 = 0
+x317 = 0
+x318 = 0
+x319 = 0
+x320 = 0
+x321 = 0
+x322 = 0
+x323 = 0
+x324 = 0
+x325 = 0
+x326 = 0
+x327 = 0
+x328 = 0
+x329 = 0
+x330 = 0
+x331 = 0
+x332 = 0
+x333 = 0
+x334 = 0
+x335 = 0
+x336 = 0
+x337 = 0
+x338 = 0
+x339 = 0
+x340 = 0
+x341 = 0
+x342 = 0
+x343 = 0
+x344 = 0
+x345 = 0
+x346 = 0
+x347 = 0
+x348 = 0
+x349 = 0
+x350 = 0
+x351 = 0
+x352 = 0
+x353 = 0
+x354 = 0
+x355 = 0
+x356 = 0
+x357 = 0
+x358 = 0
+x359 = 0
+x360 = 0
+x361 = 1.5
+x362 = 69
+x363 = 520.5
+x364 = 495.299805
+x365 = 754.0998539
+x366 = 1198.5
+x367 = 2188.799805
+x368 = 594.4
+x369 = 51.4
+x370 = 75.6
+x371 = 563.0998539
+x372 = 1533.099854
+x373 = 556.299805
+x374 = 167.8
+x375 = 975.799805
+x376 = 1642.9
+x377 = 347.099854
+x378 = 262.799805
+x379 = 62
+x380 = 395.9
+x381 = 691.7
+x382 = 936.7
+x383 = 791.099854
+x384 = 106.7
+x385 = 393.7
+x386 = 173.7
+x387 = 466.2
+x388 = 34
+x389 = 116.9
+x390 = 103.4
+x391 = 552.099854
+x392 = 0
+x393 = 0
+x394 = 0
+x395 = 0
+x396 = 0
+x397 = 0
+x398 = 0
+x399 = 0
+x400 = 0
+x401 = 0
+x402 = 0
+x403 = 0
+x404 = 0
+x405 = 0
+x406 = 0
+x407 = 0
+x408 = 0
+x409 = 0
+x410 = 0
+x411 = 0
+x412 = 0
+x413 = 0
+x414 = 0
+x415 = 0
+x416 = 0
+x417 = 0
+x418 = 0
+x419 = 0
+x420 = 0
+x421 = 0
+x422 = 0
+*** ./ppl_lpsol -s -p1 -oobtained -n modglob.mps
+Feasible problem.
diff --git a/demos/ppl_lpsol/glpk_set_d_eps.c b/demos/ppl_lpsol/glpk_set_d_eps.c
new file mode 100644
index 0000000..397b48d
--- /dev/null
+++ b/demos/ppl_lpsol/glpk_set_d_eps.c
@@ -0,0 +1,263 @@
+/* Utilities extracted from GLPK's 4.44 (see below for copyright and
+   licensing information).
+
+   The code that comes from GLPK's 4.44 is delimited by "Begin GLPK code"
+   and "End GLPK code" marks. */
+
+#include <gmp.h>
+#include <assert.h>
+#include <math.h>
+#include <float.h>
+#include <stdlib.h>
+
+static int fp2rat(double x, double eps, double *p, double *q);
+
+#define static
+#define xassert assert
+
+/* Begin GLPK code */
+/* Extracted from GLPK's 4.44 glpapi07.c (exact simplex solver). */
+/***********************************************************************
+*  This code is part of GLPK (GNU Linear Programming Kit).
+*
+*  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+*  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
+*  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
+*  E-mail: <mao at gnu.org>.
+*
+*  GLPK is free software: you can redistribute it and/or modify it
+*  under the terms of the GNU General Public License as published by
+*  the Free Software Foundation, either version 3 of the License, or
+*  (at your option) any later version.
+*
+*  GLPK is distributed in the hope that it will be useful, but WITHOUT
+*  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+*  License for more details.
+*
+*  You should have received a copy of the GNU General Public License
+*  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+static void set_d_eps(mpq_t x, double val)
+{     /* convert double val to rational x obtaining a more adequate
+         fraction than provided by mpq_set_d due to allowing a small
+         approximation error specified by a given relative tolerance;
+         for example, mpq_set_d would give the following
+         1/3 ~= 0.333333333333333314829616256247391... ->
+             -> 6004799503160661/18014398509481984
+         while this routine gives exactly 1/3 */
+      int s, n, j;
+      double f, p, q, eps = 1e-9;
+      mpq_t temp;
+      xassert(-DBL_MAX <= val && val <= +DBL_MAX);
+#if 1 /* 30/VII-2008 */
+      if (val == floor(val))
+      {  /* if val is integral, do not approximate */
+         mpq_set_d(x, val);
+         goto done;
+      }
+#endif
+      if (val > 0.0)
+         s = +1;
+      else if (val < 0.0)
+         s = -1;
+      else
+      {  mpq_set_si(x, 0, 1);
+         goto done;
+      }
+      f = frexp(fabs(val), &n);
+      /* |val| = f * 2^n, where 0.5 <= f < 1.0 */
+      fp2rat(f, 0.1 * eps, &p, &q);
+      /* f ~= p / q, where p and q are integers */
+      mpq_init(temp);
+      mpq_set_d(x, p);
+      mpq_set_d(temp, q);
+      mpq_div(x, x, temp);
+      mpq_set_si(temp, 1, 1);
+      for (j = 1; j <= abs(n); j++)
+         mpq_add(temp, temp, temp);
+      if (n > 0)
+         mpq_mul(x, x, temp);
+      else if (n < 0)
+         mpq_div(x, x, temp);
+      mpq_clear(temp);
+      if (s < 0) mpq_neg(x, x);
+      /* check that the desired tolerance has been attained */
+      xassert(fabs(val - mpq_get_d(x)) <= eps * (1.0 + fabs(val)));
+done: return;
+}
+/* End GLPK code */
+
+#undef static
+#undef xassert
+
+void
+fatal(const char* format, ...);
+
+#define xassert assert
+#define xerror fatal
+static
+
+/* Begin GLPK code */
+/* Extracted from GLPK's 4.44 glplib03.c (miscellaneous library routines). */
+
+/***********************************************************************
+*  This code is part of GLPK (GNU Linear Programming Kit).
+*
+*  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+*  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
+*  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
+*  E-mail: <mao at gnu.org>.
+*
+*  GLPK is free software: you can redistribute it and/or modify it
+*  under the terms of the GNU General Public License as published by
+*  the Free Software Foundation, either version 3 of the License, or
+*  (at your option) any later version.
+*
+*  GLPK is distributed in the hope that it will be useful, but WITHOUT
+*  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+*  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+*  License for more details.
+*
+*  You should have received a copy of the GNU General Public License
+*  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
+***********************************************************************/
+
+/***********************************************************************
+*  NAME
+*
+*  fp2rat - convert floating-point number to rational number
+*
+*  SYNOPSIS
+*
+*  #include "glplib.h"
+*  int fp2rat(double x, double eps, double *p, double *q);
+*
+*  DESCRIPTION
+*
+*  Given a floating-point number 0 <= x < 1 the routine fp2rat finds
+*  its "best" rational approximation p / q, where p >= 0 and q > 0 are
+*  integer numbers, such that |x - p / q| <= eps.
+*
+*  RETURNS
+*
+*  The routine fp2rat returns the number of iterations used to achieve
+*  the specified precision eps.
+*
+*  EXAMPLES
+*
+*  For x = sqrt(2) - 1 = 0.414213562373095 and eps = 1e-6 the routine
+*  gives p = 408 and q = 985, where 408 / 985 = 0.414213197969543.
+*
+*  BACKGROUND
+*
+*  It is well known that every positive real number x can be expressed
+*  as the following continued fraction:
+*
+*     x = b[0] + a[1]
+*                ------------------------
+*                b[1] + a[2]
+*                       -----------------
+*                       b[2] + a[3]
+*                              ----------
+*                              b[3] + ...
+*
+*  where:
+*
+*     a[k] = 1,                  k = 0, 1, 2, ...
+*
+*     b[k] = floor(x[k]),        k = 0, 1, 2, ...
+*
+*     x[0] = x,
+*
+*     x[k] = 1 / frac(x[k-1]),   k = 1, 2, 3, ...
+*
+*  To find the "best" rational approximation of x the routine computes
+*  partial fractions f[k] by dropping after k terms as follows:
+*
+*     f[k] = A[k] / B[k],
+*
+*  where:
+*
+*     A[-1] = 1,   A[0] = b[0],   B[-1] = 0,   B[0] = 1,
+*
+*     A[k] = b[k] * A[k-1] + a[k] * A[k-2],
+*
+*     B[k] = b[k] * B[k-1] + a[k] * B[k-2].
+*
+*  Once the condition
+*
+*     |x - f[k]| <= eps
+*
+*  has been satisfied, the routine reports p = A[k] and q = B[k] as the
+*  final answer.
+*
+*  In the table below here is some statistics obtained for one million
+*  random numbers uniformly distributed in the range [0, 1).
+*
+*      eps      max p   mean p      max q    mean q  max k   mean k
+*     -------------------------------------------------------------
+*     1e-1          8      1.6          9       3.2    3      1.4
+*     1e-2         98      6.2         99      12.4    5      2.4
+*     1e-3        997     20.7        998      41.5    8      3.4
+*     1e-4       9959     66.6       9960     133.5   10      4.4
+*     1e-5      97403    211.7      97404     424.2   13      5.3
+*     1e-6     479669    669.9     479670    1342.9   15      6.3
+*     1e-7    1579030   2127.3    3962146    4257.8   16      7.3
+*     1e-8   26188823   6749.4   26188824   13503.4   19      8.2
+*
+*  REFERENCES
+*
+*  W. B. Jones and W. J. Thron, "Continued Fractions: Analytic Theory
+*  and Applications," Encyclopedia on Mathematics and Its Applications,
+*  Addison-Wesley, 1980. */
+
+int fp2rat(double x, double eps, double *p, double *q)
+{     int k;
+      double xk, Akm1, Ak, Bkm1, Bk, ak, bk, fk, temp;
+      if (!(0.0 <= x && x < 1.0))
+         xerror("fp2rat: x = %g; number out of range\n", x);
+      for (k = 0; ; k++)
+      {  xassert(k <= 100);
+         if (k == 0)
+         {  /* x[0] = x */
+            xk = x;
+            /* A[-1] = 1 */
+            Akm1 = 1.0;
+            /* A[0] = b[0] = floor(x[0]) = 0 */
+            Ak = 0.0;
+            /* B[-1] = 0 */
+            Bkm1 = 0.0;
+            /* B[0] = 1 */
+            Bk = 1.0;
+         }
+         else
+         {  /* x[k] = 1 / frac(x[k-1]) */
+            temp = xk - floor(xk);
+            xassert(temp != 0.0);
+            xk = 1.0 / temp;
+            /* a[k] = 1 */
+            ak = 1.0;
+            /* b[k] = floor(x[k]) */
+            bk = floor(xk);
+            /* A[k] = b[k] * A[k-1] + a[k] * A[k-2] */
+            temp = bk * Ak + ak * Akm1;
+            Akm1 = Ak, Ak = temp;
+            /* B[k] = b[k] * B[k-1] + a[k] * B[k-2] */
+            temp = bk * Bk + ak * Bkm1;
+            Bkm1 = Bk, Bk = temp;
+         }
+         /* f[k] = A[k] / B[k] */
+         fk = Ak / Bk;
+#if 0
+         print("%.*g / %.*g = %.*g", DBL_DIG, Ak, DBL_DIG, Bk, DBL_DIG,
+            fk);
+#endif
+         if (fabs(x - fk) <= eps) break;
+      }
+      *p = Ak;
+      *q = Bk;
+      return k;
+}
+/* End GLPK code */
diff --git a/demos/ppl_lpsol/ppl_lpsol.1 b/demos/ppl_lpsol/ppl_lpsol.1
new file mode 100644
index 0000000..039821d
--- /dev/null
+++ b/demos/ppl_lpsol/ppl_lpsol.1
@@ -0,0 +1,99 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.11.
+.TH PPL_LPSOL "1" "October 2013" "ppl_lpsol 1.1" "User Commands"
+.SH NAME
+ppl_lpsol \- a PPL-based mixed integer programming problem solver
+.SH SYNOPSIS
+.B ppl_lpsol
+[\fIOPTION\fR]... [\fIFILE\fR]
+.SH DESCRIPTION
+Reads a file in MPS format and attempts solution using the optimization
+algorithms provided by the PPL.
+.PP
+See the
+.IR "GNU Linear Programming Kit: Reference Manual (Version 4.31)"
+for information on the MPS format.
+.SH OPTIONS
+.TP
+\fB\-c\fR, \fB\-\-check\fR[=\fITHRESHOLD\fR] checks the obtained results using GLPK;
+optima are checked with a tolerance of
+THRESHOLD (default 1e\-09);  input data
+are also perturbed the same way as GLPK does
+.TP
+\fB\-i\fR, \fB\-\-incremental\fR
+solves the problem incrementally
+.TP
+\fB\-m\fR, \fB\-\-min\fR
+minimizes the objective function
+.TP
+\fB\-M\fR, \fB\-\-max\fR
+maximizes the objective function (default)
+.TP
+\fB\-n\fR, \fB\-\-no\-optimization\fR
+checks for satisfiability only
+.TP
+\fB\-r\fR, \fB\-\-no\-mip\fR
+consider integer variables as real variables
+.TP
+\fB\-CSECS\fR, \fB\-\-max\-cpu\fR=\fISECS\fR
+limits CPU usage to SECS seconds
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-e\fR, \fB\-\-enumerate\fR
+use the (expensive!) enumeration method
+.TP
+\fB\-pM\fR, \fB\-\-pricing\fR=\fIM\fR
+use pricing method M for simplex (assumes \fB\-s\fR);
+M is an int from 0 to 2, default 0:
+0 \fB\-\-\fR> steepest\-edge using floating point
+1 \fB\-\-\fR> steepest\-edge using exact arithmetic
+2 \fB\-\-\fR> textbook
+.TP
+\fB\-s\fR, \fB\-\-simplex\fR
+use the simplex method
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbosity\fR=\fILEVEL\fR
+sets verbosity level (from 0 to 4, default 3):
+0 \fB\-\-\fR> quiet: no output except for errors and
+.IP
+explicitly required notifications
+.IP
+1 \fB\-\-\fR> solver state only
+2 \fB\-\-\fR> state + optimal value
+3 \fB\-\-\fR> state + optimal value + optimum location
+4 \fB\-\-\fR> lots of output
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+.SH NOTES
+The options \fB\-CSECS\fR (\fB\-\-max\-cpu\fR=\fISECS\fR) and
+\fB\-t\fR (\fB\-\-timings\fR) are not available on some platforms.
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH COPYRIGHT
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Andrew Makhorin.
+.IR "GNU Linear Programming Kit: Reference Manual (Version 4.31)".
diff --git a/demos/ppl_lpsol/ppl_lpsol.c b/demos/ppl_lpsol/ppl_lpsol.c
new file mode 100644
index 0000000..f9ad766
--- /dev/null
+++ b/demos/ppl_lpsol/ppl_lpsol.c
@@ -0,0 +1,1435 @@
+/* Solve linear programming problems by either vertex/point enumeration
+   or the primal simplex algorithm.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <ppl-config.h>
+#include "ppl_c.h"
+#include <gmp.h>
+#include <stdio.h>
+#include <assert.h>
+#include <limits.h>
+#include <time.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <math.h>
+
+#if defined(PPL_HAVE_GLPK_GLPK_H)
+#include <glpk/glpk.h>
+#elif defined(PPL_HAVE_GLPK_H)
+#include <glpk.h>
+#endif
+
+#ifdef PPL_HAVE_GETOPT_H
+# include <getopt.h>
+
+/* Try to accommodate non-GNU implementations of `getopt()'. */
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif /* defined(PPL_HAVE_GETOPT_H) */
+
+#ifdef PPL_HAVE_UNISTD_H
+/* Include this for `getopt()': especially important if we do not have
+   <getopt.h>. */
+# include <unistd.h>
+#endif
+
+#ifdef PPL_HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+/* This should be included after <time.h> and <sys/time.h> so as to make
+   sure we have the definitions for, e.g., `ru_utime'. */
+# include <sys/resource.h>
+#endif
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 10
+# error "PPL version 0.10 or following is required"
+#endif
+
+static const char* ppl_source_version = PPL_VERSION;
+
+#ifdef __GNUC__
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#else
+# define ATTRIBUTE_UNUSED
+#endif
+
+#if PPL_HAVE_DECL_GETRUSAGE
+# define PPL_LPSOL_SUPPORTS_TIMINGS
+#endif
+
+#if defined(PPL_HAVE_SYS_RESOURCE_H) \
+  && PPL_CXX_SUPPORTS_LIMITING_MEMORY \
+  && (defined(SA_ONESHOT) || defined(SA_RESETHAND))
+# define PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+#endif
+
+#ifdef PPL_HAVE_GETOPT_H
+static struct option long_options[] = {
+  {"check",           optional_argument, 0, 'c'},
+  {"help",            no_argument,       0, 'h'},
+  {"incremental",     no_argument,       0, 'i'},
+  {"min",             no_argument,       0, 'm'},
+  {"max",             no_argument,       0, 'M'},
+  {"no-optimization", no_argument,       0, 'n'},
+  {"no-mip",          no_argument,       0, 'r'},
+  {"max-cpu",         required_argument, 0, 'C'},
+  {"max-memory",      required_argument, 0, 'R'},
+  {"output",          required_argument, 0, 'o'},
+  {"pricing",         required_argument, 0, 'p'},
+  {"enumerate",       no_argument,       0, 'e'},
+  {"simplex",         no_argument,       0, 's'},
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+  {"timings",         no_argument,       0, 't'},
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+  {"verbosity",       required_argument, 0, 'v'},
+  {"version",         no_argument,       0, 'V'},
+  {0, 0, 0, 0}
+};
+#endif
+
+#define USAGE_STRING0                                                   \
+  "Usage: %s [OPTION]... [FILE]\n"                                      \
+  "Reads a file in MPS format and attempts solution using the optimization\n" \
+  "algorithms provided by the PPL.\n\n"                                 \
+  "Options:\n"                                                          \
+  "  -c, --check[=THRESHOLD] checks the obtained results using GLPK;\n" \
+  "                          optima are checked with a tolerance of\n"  \
+  "                          THRESHOLD (default %.10g);  input data\n"  \
+  "                          are also perturbed the same way as GLPK does\n" \
+  "  -i, --incremental       solves the problem incrementally\n"
+#define USAGE_STRING1                                                   \
+  "  -m, --min               minimizes the objective function\n"        \
+  "  -M, --max               maximizes the objective function (default)\n" \
+  "  -n, --no-optimization   checks for satisfiability only\n"          \
+  "  -r, --no-mip            consider integer variables as real variables\n" \
+  "  -CSECS, --max-cpu=SECS  limits CPU usage to SECS seconds\n"        \
+  "  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"     \
+  "  -h, --help              prints this help text to stdout\n"         \
+  "  -oPATH, --output=PATH   appends output to PATH\n"
+#define USAGE_STRING2                                                   \
+  "  -e, --enumerate         use the (expensive!) enumeration method\n" \
+  "  -pM, --pricing=M        use pricing method M for simplex (assumes -s);\n" \
+  "                          M is an int from 0 to 2, default 0:\n"     \
+  "                          0 --> steepest-edge using floating point\n" \
+  "                          1 --> steepest-edge using exact arithmetic\n" \
+  "                          2 --> textbook\n"                          \
+  "  -s, --simplex           use the simplex method\n"
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+#define USAGE_STRING3                                                   \
+  "  -t, --timings           prints timings to stderr\n"
+#else /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+#define USAGE_STRING3                                                   \
+  ""
+#endif /* !defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+#define USAGE_STRING4                                                   \
+  "  -v, --verbosity=LEVEL   sets verbosity level (from 0 to 4, default 3):\n" \
+  "                          0 --> quiet: no output except for errors and\n" \
+  "                                explicitly required notifications\n" \
+  "                          1 --> solver state only\n"                 \
+  "                          2 --> state + optimal value\n"             \
+  "                          3 --> state + optimal value + optimum location\n" \
+  "                          4 --> lots of output\n"                    \
+  "  -V, --version           prints version information to stdout\n"
+#ifndef PPL_HAVE_GETOPT_H
+#define USAGE_STRING5                                                   \
+  "\n"                                                                  \
+  "NOTE: this version does not support long options.\n"
+#else /* defined(PPL_HAVE_GETOPT_H) */
+#define USAGE_STRING5                                                   \
+  ""
+#endif /* !defined(PPL_HAVE_GETOPT_H) */
+#define USAGE_STRING6                                                   \
+  "\n"                                                                  \
+  "Report bugs to <ppl-devel at cs.unipr.it>.\n"
+
+
+#define OPTION_LETTERS "bc::eimnMC:R:ho:p:rstVv:"
+
+static const char* program_name = 0;
+static unsigned long max_bytes_of_virtual_memory = 0;
+static const char* output_argument = 0;
+FILE* output_file = NULL;
+static int check_results = 0;
+static int use_simplex = 0;
+static int pricing_method = 0;
+static int verbosity = 3;
+static int maximize = 1;
+static int incremental = 0;
+static int no_optimization = 0;
+static int no_mip = 0;
+static int check_results_failed = 0;
+static double check_threshold = 0.0;
+static const double default_check_threshold = 0.000000001;
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+static unsigned long max_seconds_of_cpu_time = 0;
+#endif /* defined (PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+static int print_timings = 0;
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+static void
+my_exit(int status) {
+  (void) ppl_finalize();
+  exit(status);
+}
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+  my_exit(1);
+}
+
+#if 0
+static void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: warning: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+#endif
+
+static void
+error(const char* format, ...) {
+  va_list ap;
+  fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+  if (output_argument) {
+    va_start(ap, format);
+    vfprintf(output_file, format, ap);
+    va_end(ap);
+    fprintf(output_file, "\n");
+  }
+}
+
+static const char*
+get_ppl_version() {
+  const char* p;
+  (void) ppl_version(&p);
+  return p;
+}
+
+static const char*
+get_ppl_banner() {
+  const char* p;
+  (void) ppl_banner(&p);
+  return p;
+}
+
+static void
+process_options(int argc, char* argv[]) {
+#ifdef PPL_HAVE_GETOPT_H
+  int option_index;
+#endif
+  int enumerate_required = 0;
+  int simplex_required = 0;
+  int incremental_required = 0;
+  int no_optimization_required = 0;
+  int no_mip_required = 0;
+  int c;
+  char* endptr;
+  long l;
+  double d;
+
+  while (1) {
+#ifdef PPL_HAVE_GETOPT_H
+    option_index = 0;
+    c = getopt_long(argc, argv, OPTION_LETTERS, long_options, &option_index);
+#else
+    c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+    if (c == EOF)
+      break;
+
+    switch (c) {
+    case 0:
+      break;
+
+    case 'c':
+      check_results = 1;
+      if (optarg) {
+        d = strtod(optarg, &endptr);
+        if (*endptr || errno == ERANGE || d < 0.0)
+          fatal("only a non-negative floating point number can `-c'");
+        else
+          check_threshold = d;
+      }
+      else
+        check_threshold = default_check_threshold;
+      break;
+
+    case 'm':
+      maximize = 0;
+      break;
+
+    case 'M':
+      maximize = 1;
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, USAGE_STRING0, argv[0], default_check_threshold);
+      fputs(USAGE_STRING1, stdout);
+      fputs(USAGE_STRING2, stdout);
+      fputs(USAGE_STRING3, stdout);
+      fputs(USAGE_STRING4, stdout);
+      my_exit(0);
+      break;
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+    case 'C':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+        fatal("a non-negative integer must follow `-C'");
+      else
+        max_seconds_of_cpu_time = l;
+      break;
+
+#endif /* defined (PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+    case 'R':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0)
+        fatal("a non-negative integer must follow `-R'");
+      else if (((unsigned long) l) > ULONG_MAX/(1024*1024))
+        max_bytes_of_virtual_memory = ULONG_MAX;
+      else
+        max_bytes_of_virtual_memory = l*1024*1024;
+      break;
+
+    case 'o':
+      output_argument = optarg;
+      break;
+
+    case 'p':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0 || l > 2)
+        fatal("0 or 1 or 2 must follow `-p'");
+      else
+        pricing_method = l;
+      break;
+
+    case 'e':
+      enumerate_required = 1;
+      break;
+
+    case 's':
+      simplex_required = 1;
+      break;
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+    case 't':
+      print_timings = 1;
+      break;
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+    case 'v':
+      l = strtol(optarg, &endptr, 10);
+      if (*endptr || l < 0 || l > 4)
+        fatal("verbosity must be an integer between 0 and 4");
+      else
+        verbosity = l;
+      break;
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      my_exit(0);
+      break;
+
+    case 'i':
+      incremental_required = 1;
+      break;
+
+    case 'n':
+      no_optimization_required = 1;
+      break;
+
+    case 'r':
+      no_mip_required = 1;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (enumerate_required
+      && (simplex_required
+          || incremental_required))
+      fatal("-e option is incompatible with -i and -s");
+
+  if (enumerate_required)
+    use_simplex = 0;
+  else if (simplex_required)
+    use_simplex = 1;
+
+  if (incremental_required)
+    incremental = 1;
+
+  if (no_optimization_required)
+    no_optimization = 1;
+
+  if (no_mip_required)
+    no_mip = 1;
+
+  if (optind >= argc) {
+    if (verbosity >= 4)
+      fprintf(stderr,
+              "Parma Polyhedra Library version:\n%s\n\n"
+              "Parma Polyhedra Library banner:\n%s\n",
+              get_ppl_version(),
+              get_ppl_banner());
+    else
+      fatal("no input files");
+  }
+
+  if (argc - optind > 1)
+    /* We have multiple input files. */
+    fatal("only one input file is accepted");
+
+  if (output_argument) {
+    output_file = fopen(output_argument, "a");
+    if (output_file == NULL)
+      fatal("cannot open output file `%s'", output_argument);
+  }
+  else
+    output_file = stdout;
+}
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+/* To save the time when start_clock is called. */
+static struct timeval saved_ru_utime;
+
+static void
+start_clock() {
+  struct rusage rsg;
+  if (getrusage(RUSAGE_SELF, &rsg) != 0)
+    fatal("getrusage failed: %s", strerror(errno));
+  else
+    saved_ru_utime = rsg.ru_utime;
+}
+
+static void
+print_clock(FILE* f) {
+  struct rusage rsg;
+  if (getrusage(RUSAGE_SELF, &rsg) != 0)
+    fatal("getrusage failed: %s", strerror(errno));
+  else {
+    time_t current_secs = rsg.ru_utime.tv_sec;
+    time_t current_usecs = rsg.ru_utime.tv_usec;
+    time_t saved_secs = saved_ru_utime.tv_sec;
+    time_t saved_usecs = saved_ru_utime.tv_usec;
+    int secs;
+    int csecs;
+    if (current_usecs < saved_usecs) {
+      csecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+      secs = (current_secs - saved_secs) -1;
+    }
+    else {
+      csecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+      secs = current_secs - saved_secs;
+    }
+    assert(csecs >= 0 && csecs < 100 && secs >= 0);
+    fprintf(f, "%d.%.2d", secs, csecs);
+  }
+}
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+void
+set_alarm_on_cpu_time(unsigned seconds, void (*handler)(int)) {
+  sigset_t mask;
+  struct sigaction s;
+  struct rlimit t;
+
+  sigemptyset(&mask);
+
+  s.sa_handler = handler;
+  s.sa_mask = mask;
+#if defined(SA_ONESHOT)
+  s.sa_flags = SA_ONESHOT;
+#elif defined(SA_RESETHAND)
+  s.sa_flags = SA_RESETHAND;
+#else
+# error "Either SA_ONESHOT or SA_RESETHAND must be defined."
+#endif
+
+  if (sigaction(SIGXCPU, &s, 0) != 0)
+    fatal("sigaction failed: %s", strerror(errno));
+
+  if (getrlimit(RLIMIT_CPU, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (seconds < t.rlim_cur) {
+    t.rlim_cur = seconds;
+    if (setrlimit(RLIMIT_CPU, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+#if PPL_CXX_SUPPORTS_LIMITING_MEMORY && PPL_HAVE_DECL_RLIMIT_AS
+
+void
+limit_virtual_memory(unsigned long bytes) {
+  struct rlimit t;
+
+  if (getrlimit(RLIMIT_AS, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (bytes < t.rlim_cur) {
+    t.rlim_cur = bytes;
+    if (setrlimit(RLIMIT_AS, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#else
+
+void
+limit_virtual_memory(unsigned long bytes ATTRIBUTE_UNUSED) {
+}
+
+#endif /* !PPL_HAVE_DECL_RLIMIT_AS */
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+static void
+my_timeout(int dummy ATTRIBUTE_UNUSED) {
+  fprintf(stderr, "TIMEOUT\n");
+  if (output_argument)
+    fprintf(output_file, "TIMEOUT\n");
+  my_exit(0);
+}
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+static mpz_t tmp_z;
+static mpq_t tmp1_q;
+static mpq_t tmp2_q;
+static ppl_Coefficient_t ppl_coeff;
+static glp_prob* glpk_lp;
+static int glpk_lp_num_int;
+static ppl_dimension_type* integer_variables;
+
+static void
+maybe_check_results(const int ppl_status, const double ppl_optimum_value) {
+  const char* ppl_status_string;
+  const char* glpk_status_string;
+  int glpk_status;
+  int treat_as_lp = 0;
+  glp_smcp glpk_smcp;
+
+  if (!check_results)
+    return;
+
+  if (no_mip || glpk_lp_num_int == 0)
+    treat_as_lp = 1;
+
+  glp_set_obj_dir(glpk_lp, (maximize ? GLP_MAX : GLP_MIN));
+
+  glp_init_smcp(&glpk_smcp);
+  /* Disable GLPK output. */
+  glpk_smcp.msg_lev = GLP_MSG_OFF;
+
+  if (treat_as_lp) {
+    /* Set the problem class to LP: MIP problems are thus treated as
+       LP ones. */
+    glp_exact(glpk_lp, &glpk_smcp);
+    glpk_status = glp_get_status(glpk_lp);
+  }
+  else {
+    /* MIP case. */
+    glp_simplex(glpk_lp, &glpk_smcp);
+    glpk_status = glp_get_status(glpk_lp);
+    if (glpk_status != GLP_NOFEAS && glpk_status != GLP_UNBND) {
+      glp_iocp glpk_iocp;
+      glp_init_iocp(&glpk_iocp);
+      /* Disable GLPK output. */
+      glpk_iocp.msg_lev = GLP_MSG_OFF;
+      glp_intopt(glpk_lp, &glpk_iocp);
+      glpk_status = glp_mip_status(glpk_lp);
+    }
+  }
+  /* If no_optimization is enabled, the second case is not possibile. */
+  if (!((ppl_status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE
+         && glpk_status == GLP_NOFEAS)
+        || (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED
+            && glpk_status == GLP_UNBND)
+        || (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED
+            && (glpk_status == GLP_OPT
+                /* If no_optimization is enabled, check if the problem is
+                   unbounded for GLPK.  */
+                || (no_optimization && (glpk_status == GLP_UNBND
+                                        || glpk_status == GLP_UNDEF))))))  {
+
+    if (ppl_status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE)
+      ppl_status_string = "unfeasible";
+    else if (ppl_status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED)
+      ppl_status_string = "unbounded";
+    else if (ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED)
+      ppl_status_string = "optimizable";
+    else
+      ppl_status_string = "<?>";
+
+    switch (glpk_status) {
+    case GLP_NOFEAS:
+      glpk_status_string = "unfeasible";
+      break;
+    case GLP_UNBND:
+      glpk_status_string = "unbounded";
+      break;
+    case GLP_OPT:
+      glpk_status_string = "optimizable";
+      break;
+    case GLP_UNDEF:
+      glpk_status_string = "undefined";
+      break;
+    default:
+      glpk_status_string = "<?>";
+      break;
+    }
+
+    error("check failed: for GLPK the problem is %s, not %s",
+          glpk_status_string, ppl_status_string);
+
+    check_results_failed = 1;
+  }
+  else if (!no_optimization
+           && ppl_status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED) {
+
+    double glpk_optimum_value
+      = (treat_as_lp ? glp_get_obj_val(glpk_lp) : glp_mip_obj_val(glpk_lp));
+
+    if (fabs(ppl_optimum_value - glpk_optimum_value) > check_threshold) {
+      error("check failed: for GLPK the problem's optimum is %.20g,"
+            " not %.20g", glpk_optimum_value, ppl_optimum_value);
+      check_results_failed = 1;
+    }
+  }
+  return;
+}
+
+
+static const char*
+variable_output_function(ppl_dimension_type var) {
+  const char* name = glp_get_col_name(glpk_lp, var+1);
+  if (name != NULL)
+    return name;
+  else
+    return 0;
+}
+
+static void
+add_constraints(ppl_Linear_Expression_t ppl_le,
+                int type, mpq_t rational_lb, mpq_t rational_ub, mpz_t den_lcm,
+                ppl_Constraint_System_t ppl_cs) {
+  ppl_Constraint_t ppl_c;
+  ppl_Linear_Expression_t ppl_le2;
+  switch (type) {
+  case GLP_FR:
+    break;
+
+  case GLP_LO:
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+    if (verbosity >= 4) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  case GLP_UP:
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le,
+                       PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
+    if (verbosity >= 4) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  case GLP_DB:
+    ppl_new_Linear_Expression_from_Linear_Expression(&ppl_le2, ppl_le);
+
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+    if (verbosity >= 4) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le2, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le2, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
+    ppl_delete_Linear_Expression(ppl_le2);
+    if (verbosity >= 4) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  case GLP_FX:
+    mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb));
+    mpz_neg(tmp_z, tmp_z);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff);
+    ppl_new_Constraint(&ppl_c, ppl_le,
+                       PPL_CONSTRAINT_TYPE_EQUAL);
+    if (verbosity >= 4) {
+      ppl_io_fprint_Constraint(output_file, ppl_c);
+      fprintf(output_file, "\n");
+    }
+    ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c);
+    ppl_delete_Constraint(ppl_c);
+    break;
+
+  default:
+    fatal("internal error");
+    break;
+  }
+}
+
+static int
+solve_with_generators(ppl_Constraint_System_t ppl_cs,
+                      ppl_const_Linear_Expression_t ppl_objective_le,
+                      ppl_Coefficient_t optimum_n,
+                      ppl_Coefficient_t optimum_d,
+                      ppl_Generator_t point) {
+  ppl_Polyhedron_t ppl_ph;
+  int optimum_found = 0;
+  int empty;
+  int unbounded;
+  int included;
+
+  /* Create the polyhedron (recycling the data structures of ppl_cs). */
+  ppl_new_C_Polyhedron_recycle_Constraint_System(&ppl_ph, ppl_cs);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings) {
+    fprintf(stderr, "Time to create a PPL polyhedron: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  empty = ppl_Polyhedron_is_empty(ppl_ph);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings) {
+    fprintf(stderr, "Time to check for emptiness: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  if (empty) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Unfeasible problem.\n");
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_UNFEASIBLE, 0.0);
+    goto exit;
+  }
+
+  if (!empty && no_optimization) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Feasible problem.\n");
+    /* Kludge: let's pass PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+       to let work `maybe_check_results'. */
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, 0.0);
+    goto exit;
+  }
+
+  /* Check whether the problem is unbounded. */
+  unbounded = maximize
+    ? !ppl_Polyhedron_bounds_from_above(ppl_ph, ppl_objective_le)
+    : !ppl_Polyhedron_bounds_from_below(ppl_ph, ppl_objective_le);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings) {
+    fprintf(stderr, "Time to check for unboundedness: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  if (unbounded) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Unbounded problem.\n");
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_UNBOUNDED, 0.0);
+    goto exit;
+  }
+
+  optimum_found = maximize
+    ? ppl_Polyhedron_maximize_with_point(ppl_ph, ppl_objective_le,
+                                         optimum_n, optimum_d, &included,
+                                         point)
+    : ppl_Polyhedron_minimize_with_point(ppl_ph, ppl_objective_le,
+                                         optimum_n, optimum_d, &included,
+                                         point);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings) {
+    fprintf(stderr, "Time to find the optimum: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  if (!optimum_found)
+    fatal("internal error");
+
+  if (!included)
+    fatal("internal error");
+
+ exit:
+  ppl_delete_Polyhedron(ppl_ph);
+  return optimum_found;
+}
+
+static int
+solve_with_simplex(ppl_const_Constraint_System_t cs,
+                   ppl_const_Linear_Expression_t objective,
+                   ppl_Coefficient_t optimum_n,
+                   ppl_Coefficient_t optimum_d,
+                   ppl_Generator_t point) {
+  ppl_MIP_Problem_t ppl_mip;
+  int optimum_found = 0;
+  int pricing = 0;
+  int status = 0;
+  int satisfiable = 0;
+  ppl_dimension_type space_dim;
+  ppl_const_Constraint_t c;
+  ppl_const_Generator_t g;
+  ppl_Constraint_System_const_iterator_t i;
+  ppl_Constraint_System_const_iterator_t iend;
+  int counter;
+  int mode = maximize
+    ? PPL_OPTIMIZATION_MODE_MAXIMIZATION
+    : PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+  ppl_Constraint_System_space_dimension(cs, &space_dim);
+  ppl_new_MIP_Problem_from_space_dimension(&ppl_mip, space_dim);
+  switch (pricing_method) {
+  case 0:
+    pricing = PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+    break;
+  case 1:
+    pricing = PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+    break;
+  case 2:
+    pricing = PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+    break;
+  default:
+    fatal("ppl_lpsol internal error");
+  }
+  ppl_MIP_Problem_set_control_parameter(ppl_mip, pricing);
+  ppl_MIP_Problem_set_objective_function(ppl_mip, objective);
+  ppl_MIP_Problem_set_optimization_mode(ppl_mip, mode);
+  if (!no_mip)
+    ppl_MIP_Problem_add_to_integer_space_dimensions(ppl_mip, integer_variables,
+                                                    glpk_lp_num_int);
+  if (incremental) {
+    /* Add the constraints of `cs' one at a time. */
+    ppl_new_Constraint_System_const_iterator(&i);
+    ppl_new_Constraint_System_const_iterator(&iend);
+    ppl_Constraint_System_begin(cs, i);
+    ppl_Constraint_System_end(cs, iend);
+
+    counter = 0;
+    while (!ppl_Constraint_System_const_iterator_equal_test(i, iend)) {
+      ++counter;
+      if (verbosity >= 4)
+        fprintf(output_file, "\nSolving constraint %d\n", counter);
+      ppl_Constraint_System_const_iterator_dereference(i, &c);
+      ppl_MIP_Problem_add_constraint(ppl_mip, c);
+
+      if (no_optimization) {
+        satisfiable = ppl_MIP_Problem_is_satisfiable(ppl_mip);
+        if (!satisfiable)
+          break;
+      }
+      else
+        status = ppl_MIP_Problem_solve(ppl_mip);
+      ppl_Constraint_System_const_iterator_increment(i);
+    }
+    ppl_delete_Constraint_System_const_iterator(i);
+    ppl_delete_Constraint_System_const_iterator(iend);
+  }
+
+  else {
+    ppl_MIP_Problem_add_constraints(ppl_mip, cs);
+    if (no_optimization)
+      satisfiable = ppl_MIP_Problem_is_satisfiable(ppl_mip);
+    else
+      status = ppl_MIP_Problem_solve(ppl_mip);
+  }
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings) {
+    fprintf(stderr, "Time to solve the problem: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  if ((no_optimization && !satisfiable)
+      || (!no_optimization && status == PPL_MIP_PROBLEM_STATUS_UNFEASIBLE)) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Unfeasible problem.\n");
+    maybe_check_results(status, 0.0);
+    goto exit;
+  }
+  else if (no_optimization && satisfiable) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Feasible problem.\n");
+    /* Kludge: let's pass PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+       to let work `maybe_check_results'. */
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED, 0.0);
+    goto exit;
+  }
+  else if (status == PPL_MIP_PROBLEM_STATUS_UNBOUNDED) {
+    if (verbosity >= 1)
+      fprintf(output_file, "Unbounded problem.\n");
+    maybe_check_results(status, 0.0);
+    goto exit;
+  }
+  else if (status == PPL_MIP_PROBLEM_STATUS_OPTIMIZED) {
+    ppl_MIP_Problem_optimal_value(ppl_mip, optimum_n, optimum_d);
+    ppl_MIP_Problem_optimizing_point(ppl_mip, &g);
+    ppl_assign_Generator_from_Generator(point, g);
+    optimum_found = 1;
+    goto exit;
+  }
+  else
+    fatal("internal error");
+
+ exit:
+  ppl_delete_MIP_Problem(ppl_mip);
+  return optimum_found;
+}
+
+extern void set_d_eps(mpq_t x, double val);
+
+static void
+set_mpq_t_from_double(mpq_t q, double d) {
+  if (check_results)
+    set_d_eps(q, d);
+  else
+    mpq_set_d(q, d);
+}
+
+static void
+solve(char* file_name) {
+  ppl_Constraint_System_t ppl_cs;
+#ifndef NDEBUG
+  ppl_Constraint_System_t ppl_cs_copy;
+#endif
+  ppl_Generator_t optimum_location;
+  ppl_Linear_Expression_t ppl_le;
+  int dimension, row, num_rows, column, nz, i, j, type;
+  int* coefficient_index;
+  double lb, ub;
+  double* coefficient_value;
+  mpq_t rational_lb, rational_ub;
+  mpq_t* rational_coefficient;
+  mpq_t* objective;
+  ppl_Linear_Expression_t ppl_objective_le;
+  ppl_Coefficient_t optimum_n;
+  ppl_Coefficient_t optimum_d;
+  mpq_t optimum;
+  mpz_t den_lcm;
+  int optimum_found;
+  glp_mpscp glpk_mpscp;
+
+  glpk_lp = glp_create_prob();
+  glp_init_mpscp(&glpk_mpscp);
+
+  if (verbosity == 0) {
+    /* FIXME: find a way to suppress output from glp_read_mps. */
+  }
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings)
+    start_clock();
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  if (glp_read_mps(glpk_lp, GLP_MPS_FILE, &glpk_mpscp, file_name) != 0)
+    fatal("cannot read MPS file `%s'", file_name);
+
+#ifdef PPL_LPSOL_SUPPORTS_TIMINGS
+
+  if (print_timings) {
+    fprintf(stderr, "Time to read the input file: ");
+    print_clock(stderr);
+    fprintf(stderr, " s\n");
+    start_clock();
+  }
+
+#endif /* defined(PPL_LPSOL_SUPPORTS_TIMINGS) */
+
+  glpk_lp_num_int = glp_get_num_int(glpk_lp);
+
+  if (glpk_lp_num_int > 0 && !no_mip && !use_simplex)
+     fatal("the enumeration solving method can not handle MIP problems");
+
+  dimension = glp_get_num_cols(glpk_lp);
+
+  /* Read variables constrained to be integer. */
+  if (glpk_lp_num_int > 0 && !no_mip && use_simplex) {
+    if (verbosity >= 4)
+      fprintf(output_file, "Integer variables:\n");
+    integer_variables = (ppl_dimension_type*)
+      malloc((glpk_lp_num_int + 1)*sizeof(ppl_dimension_type));
+    for (i = 0, j = 0; i < dimension; ++i) {
+      int col_kind = glp_get_col_kind(glpk_lp, i+1);
+      if (col_kind == GLP_IV || col_kind == GLP_BV) {
+        integer_variables[j] = i;
+        if (verbosity >= 4) {
+          ppl_io_fprint_variable(output_file, i);
+          fprintf(output_file, " ");
+        }
+        ++j;
+      }
+    }
+  }
+  coefficient_index = (int*) malloc((dimension+1)*sizeof(int));
+  coefficient_value = (double*) malloc((dimension+1)*sizeof(double));
+  rational_coefficient = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
+
+
+  ppl_new_Constraint_System(&ppl_cs);
+
+  mpq_init(rational_lb);
+  mpq_init(rational_ub);
+  for (i = 1; i <= dimension; ++i)
+    mpq_init(rational_coefficient[i]);
+
+  mpz_init(den_lcm);
+
+  if (verbosity >= 4)
+    fprintf(output_file, "\nConstraints:\n");
+
+  /* Set up the row (ordinary) constraints. */
+  num_rows = glp_get_num_rows(glpk_lp);
+  for (row = 1; row <= num_rows; ++row) {
+    /* Initialize the least common multiple computation. */
+    mpz_set_si(den_lcm, 1);
+    /* Set `nz' to the number of non-zero coefficients. */
+    nz = glp_get_mat_row(glpk_lp, row, coefficient_index, coefficient_value);
+    for (i = 1; i <= nz; ++i) {
+      set_mpq_t_from_double(rational_coefficient[i], coefficient_value[i]);
+      /* Update den_lcm. */
+      mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i]));
+    }
+
+    lb = glp_get_row_lb(glpk_lp, row);
+    ub = glp_get_row_ub(glpk_lp, row);
+
+    set_mpq_t_from_double(rational_lb, lb);
+    set_mpq_t_from_double(rational_ub, ub);
+
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub));
+
+    ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension);
+
+    for (i = 1; i <= nz; ++i) {
+      mpz_mul(tmp_z, den_lcm, mpq_numref(rational_coefficient[i]));
+      mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_coefficient[i]));
+      ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+      ppl_Linear_Expression_add_to_coefficient(ppl_le, coefficient_index[i]-1,
+                                               ppl_coeff);
+    }
+
+    type = glp_get_row_type(glpk_lp, row);
+    add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs);
+
+    ppl_delete_Linear_Expression(ppl_le);
+  }
+
+  free(coefficient_value);
+  for (i = 1; i <= dimension; ++i)
+    mpq_clear(rational_coefficient[i]);
+  free(rational_coefficient);
+  free(coefficient_index);
+
+#ifndef NDEBUG
+  ppl_new_Constraint_System_from_Constraint_System(&ppl_cs_copy, ppl_cs);
+#endif
+
+  /*
+    FIXME: here we could build the polyhedron and minimize it before
+    adding the variable bounds.
+  */
+
+  /* Set up the columns constraints, i.e., variable bounds. */
+  for (column = 1; column <= dimension; ++column) {
+
+    lb = glp_get_col_lb(glpk_lp, column);
+    ub = glp_get_col_ub(glpk_lp, column);
+
+    set_mpq_t_from_double(rational_lb, lb);
+    set_mpq_t_from_double(rational_ub, ub);
+
+    /* Initialize the least common multiple computation. */
+    mpz_set_si(den_lcm, 1);
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_ub));
+
+    ppl_new_Linear_Expression_with_dimension(&ppl_le, dimension);
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, den_lcm);
+    ppl_Linear_Expression_add_to_coefficient(ppl_le, column-1, ppl_coeff);
+
+    type = glp_get_col_type(glpk_lp, column);
+    add_constraints(ppl_le, type, rational_lb, rational_ub, den_lcm, ppl_cs);
+
+    ppl_delete_Linear_Expression(ppl_le);
+  }
+
+  mpq_clear(rational_ub);
+  mpq_clear(rational_lb);
+
+  /* Deal with the objective function. */
+  objective = (mpq_t*) malloc((dimension+1)*sizeof(mpq_t));
+
+  /* Initialize the least common multiple computation. */
+  mpz_set_si(den_lcm, 1);
+
+  mpq_init(objective[0]);
+  set_mpq_t_from_double(objective[0], glp_get_obj_coef(glpk_lp, 0));
+  for (i = 1; i <= dimension; ++i) {
+    mpq_init(objective[i]);
+    set_mpq_t_from_double(objective[i], glp_get_obj_coef(glpk_lp, i));
+    /* Update den_lcm. */
+    mpz_lcm(den_lcm, den_lcm, mpq_denref(objective[i]));
+  }
+
+  /* Set the ppl_objective_le to be the objective function. */
+  ppl_new_Linear_Expression_with_dimension(&ppl_objective_le, dimension);
+  /* Set value for objective function's inhomogeneous term. */
+  mpz_mul(tmp_z, den_lcm, mpq_numref(objective[0]));
+  mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[0]));
+  ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+  ppl_Linear_Expression_add_to_inhomogeneous(ppl_objective_le, ppl_coeff);
+  /* Set values for objective function's variable coefficients. */
+  for (i = 1; i <= dimension; ++i) {
+    mpz_mul(tmp_z, den_lcm, mpq_numref(objective[i]));
+    mpz_divexact(tmp_z, tmp_z, mpq_denref(objective[i]));
+    ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z);
+    ppl_Linear_Expression_add_to_coefficient(ppl_objective_le, i-1, ppl_coeff);
+  }
+
+  if (verbosity >= 4) {
+    fprintf(output_file, "Objective function:\n");
+    if (mpz_cmp_si(den_lcm, 1) != 0)
+      fprintf(output_file, "(");
+    ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le);
+  }
+
+  for (i = 0; i <= dimension; ++i)
+    mpq_clear(objective[i]);
+  free(objective);
+
+  if (verbosity >= 4) {
+    if (mpz_cmp_si(den_lcm, 1) != 0) {
+      fprintf(output_file, ")/");
+      mpz_out_str(output_file, 10, den_lcm);
+    }
+    fprintf(output_file, "\n%s\n",
+            (maximize ? "Maximizing." : "Minimizing."));
+  }
+
+  ppl_new_Coefficient(&optimum_n);
+  ppl_new_Coefficient(&optimum_d);
+  ppl_new_Generator_zero_dim_point(&optimum_location);
+
+  optimum_found = use_simplex
+    ? solve_with_simplex(ppl_cs,
+                         ppl_objective_le,
+                         optimum_n,
+                         optimum_d,
+                         optimum_location)
+    : solve_with_generators(ppl_cs,
+                            ppl_objective_le,
+                            optimum_n,
+                            optimum_d,
+                            optimum_location);
+
+  ppl_delete_Linear_Expression(ppl_objective_le);
+
+  if (glpk_lp_num_int > 0)
+      free(integer_variables);
+
+  if (optimum_found) {
+    mpq_init(optimum);
+    ppl_Coefficient_to_mpz_t(optimum_n, tmp_z);
+    mpq_set_num(optimum, tmp_z);
+    ppl_Coefficient_to_mpz_t(optimum_d, tmp_z);
+    mpz_mul(tmp_z, tmp_z, den_lcm);
+    mpq_set_den(optimum, tmp_z);
+    if (verbosity == 1)
+      fprintf(output_file, "Optimized problem.\n");
+    if (verbosity >= 2)
+      fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum));
+    if (verbosity >= 3) {
+      fprintf(output_file, "Optimum location:\n");
+      ppl_Generator_divisor(optimum_location, ppl_coeff);
+      ppl_Coefficient_to_mpz_t(ppl_coeff, tmp_z);
+      for (i = 0; i < dimension; ++i) {
+        mpz_set(mpq_denref(tmp1_q), tmp_z);
+        ppl_Generator_coefficient(optimum_location, i, ppl_coeff);
+        ppl_Coefficient_to_mpz_t(ppl_coeff, mpq_numref(tmp1_q));
+        ppl_io_fprint_variable(output_file, i);
+        fprintf(output_file, " = %.10g\n", mpq_get_d(tmp1_q));
+      }
+    }
+#ifndef NDEBUG
+    {
+      ppl_Polyhedron_t ph;
+      unsigned int relation;
+      ppl_new_C_Polyhedron_recycle_Constraint_System(&ph, ppl_cs_copy);
+      ppl_delete_Constraint_System(ppl_cs_copy);
+      relation = ppl_Polyhedron_relation_with_Generator(ph, optimum_location);
+      ppl_delete_Polyhedron(ph);
+      assert(relation == PPL_POLY_GEN_RELATION_SUBSUMES);
+    }
+#endif
+    maybe_check_results(PPL_MIP_PROBLEM_STATUS_OPTIMIZED,
+                        mpq_get_d(optimum));
+    mpq_clear(optimum);
+  }
+
+  ppl_delete_Constraint_System(ppl_cs);
+  ppl_delete_Coefficient(optimum_d);
+  ppl_delete_Coefficient(optimum_n);
+  ppl_delete_Generator(optimum_location);
+
+  glp_delete_prob(glpk_lp);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+              const char* description) {
+  if (output_argument)
+    fprintf(output_file, "PPL error code %d: %s\n", code, description);
+  fatal("PPL error code %d: %s", code, description);
+}
+
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#if defined(NDEBUG)
+
+#if !(defined(PPL_GLPK_HAS_GLP_TERM_OUT) && defined(GLP_OFF))
+
+#if defined(PPL_GLPK_HAS_GLP_TERM_HOOK) \
+  || defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+
+static int
+glpk_message_interceptor(void* info, const char* msg) {
+  (void) info;
+  (void) msg;
+  return 1;
+}
+
+#elif defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK)
+
+static int
+glpk_message_interceptor(void* info, char* msg) {
+  (void) info;
+  (void) msg;
+  return 1;
+}
+
+#endif /* !(defined(PPL_GLPK_HAS_GLP_TERM_HOOK)
+            || defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK))
+          && defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK) */
+
+#endif /* !(defined(PPL_GLPK_HAS_GLP_TERM_OUT) && defined(GLP_OFF)) */
+
+#endif /* defined(NDEBUG) */
+
+int
+main(int argc, char* argv[]) {
+#if defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+  extern void _glp_lib_print_hook(int (*func)(void *info, const char *buf),
+                                  void *info);
+#endif
+  program_name = argv[0];
+  if (ppl_initialize() < 0)
+    fatal("cannot initialize the Parma Polyhedra Library");
+
+  /* The PPL solver does not use floating point numbers, except
+     perhaps for the steepest edge heuristics.  In contrast, GLPK does
+     use them, so it is best to restore the rounding mode as it was
+     prior to the PPL initialization.  */
+  if (ppl_restore_pre_PPL_rounding() < 0)
+    fatal("cannot restore the rounding mode");
+
+  if (ppl_set_error_handler(error_handler) < 0)
+    fatal("cannot install the custom error handler");
+
+  if (strcmp(ppl_source_version, get_ppl_version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+          ppl_source_version, get_ppl_version());
+
+  if (ppl_io_set_variable_output_function(variable_output_function) < 0)
+    fatal("cannot install the custom variable output function");
+
+#if defined(NDEBUG)
+#if defined(PPL_GLPK_HAS_GLP_TERM_OUT) && defined(GLP_OFF)
+  glp_term_out(GLP_OFF);
+#elif defined(PPL_GLPK_HAS_GLP_TERM_HOOK)
+  glp_term_hook(glpk_message_interceptor, 0);
+#elif defined(PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK)
+  _glp_lib_print_hook(glpk_message_interceptor, 0);
+#elif defined(PPL_GLPK_HAS_LIB_SET_PRINT_HOOK)
+  lib_set_print_hook(0, glpk_message_interceptor);
+#endif
+#endif
+
+  /* Process command line options. */
+  process_options(argc, argv);
+
+  /* Initialize globals. */
+  mpz_init(tmp_z);
+  mpq_init(tmp1_q);
+  mpq_init(tmp2_q);
+  ppl_new_Coefficient(&ppl_coeff);
+
+#ifdef PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME
+
+  if (max_seconds_of_cpu_time > 0)
+    set_alarm_on_cpu_time(max_seconds_of_cpu_time, my_timeout);
+
+#endif /* defined (PPL_LPSOL_SUPPORTS_LIMIT_ON_CPU_TIME) */
+
+  if (max_bytes_of_virtual_memory > 0)
+    limit_virtual_memory(max_bytes_of_virtual_memory);
+
+  while (optind < argc) {
+    if (check_results)
+      check_results_failed = 0;
+
+    solve(argv[optind++]);
+
+    if (check_results && check_results_failed)
+      break;
+  }
+
+  /* Finalize globals. */
+  ppl_delete_Coefficient(ppl_coeff);
+  mpq_clear(tmp2_q);
+  mpq_clear(tmp1_q);
+  mpz_clear(tmp_z);
+
+  /* Close output file, if any. */
+  if (output_argument)
+    fclose(output_file);
+
+  my_exit((check_results && check_results_failed) ? 1 : 0);
+
+  /* This is just to avoid a compiler warning. */
+  return 0;
+}
diff --git a/demos/ppl_pips/Makefile.am b/demos/ppl_pips/Makefile.am
new file mode 100644
index 0000000..81d0b5b
--- /dev/null
+++ b/demos/ppl_pips/Makefile.am
@@ -0,0 +1,127 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = examples
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_pips
+ppl_pips_SOURCES = ppl_pips.cc
+ppl_pips_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_pips.1
+
+piplib_pips.o: $(srcdir)/ppl_pips.cc $(top_builddir)/utils/libppl_utils.a
+	$(CXXCOMPILE) -c -o $@ -DUSE_PIPLIB $(srcdir)/ppl_pips.cc
+
+piplib_pips: piplib_pips.o
+	$(CXXLINK) piplib_pips.o\
+	    -lpip -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+if HAVE_MD5SUM
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED =
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES = \
+$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+check-local: ppl_pips$(EXEEXT)
+	echo $(TOUGH_EXAMPLES) >tough_examples
+	echo $(ECHO_N) "$(ECHO_C)" >obtained
+	export LC_ALL=C; \
+	for path in $(srcdir)/examples/*.dat; \
+	do \
+	  file=`basename $$path`; \
+	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+	  echo ppl_pips$(EXEEXT) -p $$path; \
+	  $(CHECKER) ./ppl_pips$(EXEEXT) -p $$path \
+            | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+	done
+	for path in $(srcdir)/examples/*.pip; \
+	do \
+	  file=`basename $$path`; \
+	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+	  echo ppl_pips$(EXEEXT) -P $$path; \
+	   $(CHECKER) ./ppl_pips$(EXEEXT) -P $$path \
+             | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+	done
+	diff obtained $(srcdir)/$(EXPECTED)
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained
+
+endif HAVE_MD5SUM
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/demos/ppl_pips/Makefile.in b/demos/ppl_pips/Makefile.in
new file mode 100644
index 0000000..bda0117
--- /dev/null
+++ b/demos/ppl_pips/Makefile.in
@@ -0,0 +1,1012 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_pips$(EXEEXT)
+subdir = demos/ppl_pips
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_pips_OBJECTS = ppl_pips.$(OBJEXT)
+ppl_pips_OBJECTS = $(am_ppl_pips_OBJECTS)
+ppl_pips_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+	$(top_builddir)/utils/libppl_utils.a
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(ppl_pips_SOURCES)
+DIST_SOURCES = $(ppl_pips_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = examples
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+ at extra_includes@
+
+ppl_pips_SOURCES = ppl_pips.cc
+ppl_pips_LDADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/utils/libppl_utils.a \
+ at extra_libraries@
+
+dist_man_MANS = \
+ppl_pips.1
+
+EXTRA_DIST = \
+expected_mpz \
+expected_mpz_a \
+expected_int8 \
+expected_int8_a \
+expected_int16 \
+expected_int16_a \
+expected_int32 \
+expected_int32_a \
+expected_int64 \
+expected_int64_a
+
+ at HAVE_MD5SUM_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED = 
+ at ASSERTIONS_ENABLED_FALSE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@HAVE_MD5SUM_TRUE at EXPECTED = expected_$(COEFFICIENT_MNEMONIC)_a
+ at HAVE_MD5SUM_TRUE@TOUGH_EXAMPLES = \
+ at HAVE_MD5SUM_TRUE@$(TOUGH_EXAMPLES_IF_ASSERTIONS_ENABLED)
+
+ at HAVE_MD5SUM_TRUE@MOSTLYCLEANFILES = \
+ at HAVE_MD5SUM_TRUE@tough_examples \
+ at HAVE_MD5SUM_TRUE@obtained
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_pips/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/ppl_pips/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+ppl_pips$(EXEEXT): $(ppl_pips_OBJECTS) $(ppl_pips_DEPENDENCIES) $(EXTRA_ppl_pips_DEPENDENCIES) 
+	@rm -f ppl_pips$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ppl_pips_OBJECTS) $(ppl_pips_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_pips.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+ at HAVE_MD5SUM_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(MANS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man1
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-man
+
+uninstall-man: uninstall-man1
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am check-local clean clean-binPROGRAMS clean-generic \
+	clean-libtool cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-man1 install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-man uninstall-man1
+
+
+piplib_pips.o: $(srcdir)/ppl_pips.cc $(top_builddir)/utils/libppl_utils.a
+	$(CXXCOMPILE) -c -o $@ -DUSE_PIPLIB $(srcdir)/ppl_pips.cc
+
+piplib_pips: piplib_pips.o
+	$(CXXLINK) piplib_pips.o\
+	    -lpip -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+ at HAVE_MD5SUM_TRUE@check-local: ppl_pips$(EXEEXT)
+ at HAVE_MD5SUM_TRUE@	echo $(TOUGH_EXAMPLES) >tough_examples
+ at HAVE_MD5SUM_TRUE@	echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at HAVE_MD5SUM_TRUE@	export LC_ALL=C; \
+ at HAVE_MD5SUM_TRUE@	for path in $(srcdir)/examples/*.dat; \
+ at HAVE_MD5SUM_TRUE@	do \
+ at HAVE_MD5SUM_TRUE@	  file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@	  echo ppl_pips$(EXEEXT) -p $$path; \
+ at HAVE_MD5SUM_TRUE@	  $(CHECKER) ./ppl_pips$(EXEEXT) -p $$path \
+ at HAVE_MD5SUM_TRUE@            | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+ at HAVE_MD5SUM_TRUE@	done
+ at HAVE_MD5SUM_TRUE@	for path in $(srcdir)/examples/*.pip; \
+ at HAVE_MD5SUM_TRUE@	do \
+ at HAVE_MD5SUM_TRUE@	  file=`basename $$path`; \
+ at HAVE_MD5SUM_TRUE@	  $(FGREP) $$file tough_examples >/dev/null 2>&1 && continue; \
+ at HAVE_MD5SUM_TRUE@	  echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ at HAVE_MD5SUM_TRUE@	  echo ppl_pips$(EXEEXT) -P $$path; \
+ at HAVE_MD5SUM_TRUE@	   $(CHECKER) ./ppl_pips$(EXEEXT) -P $$path \
+ at HAVE_MD5SUM_TRUE@             | tr -d '\015' | $(TEXT_MD5SUM) >>obtained; \
+ at HAVE_MD5SUM_TRUE@	done
+ at HAVE_MD5SUM_TRUE@	diff obtained $(srcdir)/$(EXPECTED)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_pips/examples/Makefile.am b/demos/ppl_pips/examples/Makefile.am
new file mode 100644
index 0000000..ed5525d
--- /dev/null
+++ b/demos/ppl_pips/examples/Makefile.am
@@ -0,0 +1,48 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+DAT_FILES = \
+invert.dat \
+linear.dat \
+lineri.dat \
+loz.dat \
+max.dat \
+maxb.dat \
+pairi.dat \
+petit.dat \
+rairoi.dat \
+test02.dat \
+test12i.dat
+
+PIP_FILES = \
+big.pip \
+brisebarre.pip \
+cg1.pip \
+esced.pip \
+ex2.pip \
+fimmel.pip \
+max.pip \
+sor1d.pip \
+square.pip
+
+dist_noinst_DATA = $(DAT_FILES) $(PIP_FILES)
diff --git a/demos/ppl_pips/examples/Makefile.in b/demos/ppl_pips/examples/Makefile.in
new file mode 100644
index 0000000..d5667af
--- /dev/null
+++ b/demos/ppl_pips/examples/Makefile.in
@@ -0,0 +1,571 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = demos/ppl_pips/examples
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_noinst_DATA) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(dist_noinst_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+DAT_FILES = \
+invert.dat \
+linear.dat \
+lineri.dat \
+loz.dat \
+max.dat \
+maxb.dat \
+pairi.dat \
+petit.dat \
+rairoi.dat \
+test02.dat \
+test12i.dat
+
+PIP_FILES = \
+big.pip \
+brisebarre.pip \
+cg1.pip \
+esced.pip \
+ex2.pip \
+fimmel.pip \
+max.pip \
+sor1d.pip \
+square.pip
+
+dist_noinst_DATA = $(DAT_FILES) $(PIP_FILES)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_pips/examples/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign demos/ppl_pips/examples/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/demos/ppl_pips/examples/README b/demos/ppl_pips/examples/README
new file mode 100644
index 0000000..6b46816
--- /dev/null
+++ b/demos/ppl_pips/examples/README
@@ -0,0 +1,8 @@
+The examples in this directory have been taken from PipLib 1.4.0 [1],
+which is released under the GNU Lesser General Public License, version 2.1
+or later [2].
+
+--------
+
+[1] http://www.piplib.org/
+[2] http://www.gnu.org/licenses/lgpl-2.1.html
diff --git a/demos/ppl_pips/examples/big.pip b/demos/ppl_pips/examples/big.pip
new file mode 100644
index 0000000..c93c08f
--- /dev/null
+++ b/demos/ppl_pips/examples/big.pip
@@ -0,0 +1,9 @@
+0 3
+
+1
+
+4 5
+1 -1  0  1  0
+1  0 -1  1  0
+1 -1  3 -2 12
+1  2 -1 -1  3
diff --git a/demos/ppl_pips/examples/brisebarre.pip b/demos/ppl_pips/examples/brisebarre.pip
new file mode 100644
index 0000000..f5a8397
--- /dev/null
+++ b/demos/ppl_pips/examples/brisebarre.pip
@@ -0,0 +1,33 @@
+# ---------------------- CONTEXT ----------------------
+0 2
+
+-1
+
+# ----------------------- DOMAIN ----------------------
+26 6
+1    3    0    0     0    -98300
+1   -3    0    0     0     98308
+1  432   36    6     1 -14757611
+1 -432  -36   -6    -1  14758510
+1   54    9    3     1  -1923190
+1  -54   -9   -3    -1   1923303
+1   48   12    6     3  -1782238
+1  -48  -12   -6    -3   1782339
+1   27    9    6     4  -1045164
+1  -27   -9   -6    -4   1045221
+1  432  180  150   125 -17434139
+1 -432 -180 -150  -125  17435038
+1    6    3    3     3   -252443
+1   -6   -3   -3    -3    252456
+1  432  252  294   343 -18949275
+1 -432 -252 -294  -343  18950174
+1   27   18   24    32  -1234720
+1  -27  -18  -24   -32   1234777
+1   48   36   54    81  -2288453
+1  -48  -36  -54   -81   2288554
+1   54   45   75   125  -2684050
+1  -54  -45  -75  -125   2684163
+1  432  396  726  1331 -22386005
+1 -432 -396 -726 -1331  22386904
+1    3    3    6    12   -162072
+1   -3   -3   -6   -12    162080
diff --git a/demos/ppl_pips/examples/cg1.pip b/demos/ppl_pips/examples/cg1.pip
new file mode 100644
index 0000000..78e31f1
--- /dev/null
+++ b/demos/ppl_pips/examples/cg1.pip
@@ -0,0 +1,15 @@
+2 4
+  1  1  0 -1
+  1 -1  1  0
+
+-1
+
+8 7
+  1  0  1  0 -1  0  0
+  1  0 -1  0  1  0  0
+  1  1  0  0  0 -1  0
+  1 -1  0  0  0  1  0
+  1  0  1  0  0  0 -1
+  1  0 -1  0  0  1  0
+  1  0 -1  1  0  0 -1
+  1  0  0 -1  0  1  0
diff --git a/demos/ppl_pips/examples/esced.pip b/demos/ppl_pips/examples/esced.pip
new file mode 100644
index 0000000..891c281
--- /dev/null
+++ b/demos/ppl_pips/examples/esced.pip
@@ -0,0 +1,21 @@
+0 2
+
+-1
+
+16 18
+1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 0 0 0
+0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 0
+0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0
+0 0 0 0 0 0 -1 0 0 0 0 0 1 -1 0 -1 0 0
+0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
+0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0
+1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
+1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
diff --git a/demos/ppl_pips/examples/ex2.pip b/demos/ppl_pips/examples/ex2.pip
new file mode 100644
index 0000000..bb59848
--- /dev/null
+++ b/demos/ppl_pips/examples/ex2.pip
@@ -0,0 +1,9 @@
+1 5
+1 -1 1 1 0
+
+-1
+
+3 7
+1 0 -1 0 1 0 0
+1 -1 0 0 0 1 0
+1 1 1 -1 0 0 0
diff --git a/demos/ppl_pips/examples/fimmel.pip b/demos/ppl_pips/examples/fimmel.pip
new file mode 100644
index 0000000..a6dee41
--- /dev/null
+++ b/demos/ppl_pips/examples/fimmel.pip
@@ -0,0 +1,12 @@
+0 4
+
+-1
+
+7 6
+1 2  6 0 0 -9
+1 5 -3 0 0 0
+1 2 -10 0 0 15
+1 -2 6 0 0 -3
+1 -2 -6 0 0 17
+1 0 1 -1 0 0
+1 1 0 0 -1 0
diff --git a/demos/ppl_pips/examples/invert.dat b/demos/ppl_pips/examples/invert.dat
new file mode 100644
index 0000000..8f472fc
--- /dev/null
+++ b/demos/ppl_pips/examples/invert.dat
@@ -0,0 +1,10 @@
+( (Lower bound on j after loop inversion
+      (unknowns j i)
+      (parameters k m n))
+  2 3 3 1 -1 1
+  ( #[0 -1 0 0 1 0]
+    #[-1 0 0 0 0 1]
+    #[1 1 0 -1 0 0]
+  )
+  ( #[-1 1 1 0])
+)
diff --git a/demos/ppl_pips/examples/linear.dat b/demos/ppl_pips/examples/linear.dat
new file mode 100644
index 0000000..65d5a51
--- /dev/null
+++ b/demos/ppl_pips/examples/linear.dat
@@ -0,0 +1,10 @@
+((linearisation d'un tableau 100 100)
+ 2 1 4 1 -1 1
+ (#[100 1 0 -1]
+  #[-100 -1 0 1]
+  #[-1 0 99 0]
+  #[0 -1 99 0]
+ )
+ (#[-1 9999]
+ )
+)
diff --git a/demos/ppl_pips/examples/lineri.dat b/demos/ppl_pips/examples/lineri.dat
new file mode 100644
index 0000000..4c13e66
--- /dev/null
+++ b/demos/ppl_pips/examples/lineri.dat
@@ -0,0 +1,9 @@
+((linearisation d'un tableau 100 100)
+ 1 1 3 1 -1 1
+ (#[-1 99 0]
+  #[-100 0 1]
+  #[100 99 -1]
+ )
+ (#[-1 9999]
+ )
+)
diff --git a/demos/ppl_pips/examples/loz.dat b/demos/ppl_pips/examples/loz.dat
new file mode 100644
index 0000000..234dd9c
--- /dev/null
+++ b/demos/ppl_pips/examples/loz.dat
@@ -0,0 +1,15 @@
+( 
+ ( Solving MIN(i-2.j) under the following constraints:
+   Unknowns may be negative.
+   Order:
+   f' i' j' constant G P n'
+  )
+ 3 3 5 0 4 1
+ ( 
+  #[ 0 1 1 20 -2 -4 4 ]
+  #[ 1 -1 2 0 -2 0 0 ]
+  #[ 0 -1 -1 0 2 0 0 ]
+  #[ 0 1 -1 10 0 -2 2 ]
+  #[ 0 -1 1 10 0 -2 2 ]
+   )
+ ( ))
diff --git a/demos/ppl_pips/examples/max.dat b/demos/ppl_pips/examples/max.dat
new file mode 100644
index 0000000..fdb71c5
--- /dev/null
+++ b/demos/ppl_pips/examples/max.dat
@@ -0,0 +1,9 @@
+((a maximization problem)
+ 2 1 4 0 -1 1
+ (#[-1 0 0 1]
+  #[0 -1 0 1]
+  #[-1 3 12 -2]
+  #[2 -1 3 -1]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/max.pip b/demos/ppl_pips/examples/max.pip
new file mode 100644
index 0000000..e8af57b
--- /dev/null
+++ b/demos/ppl_pips/examples/max.pip
@@ -0,0 +1,9 @@
+0 3
+
+-1
+
+4 5
+1 -1  0  1  0
+1  0 -1  1  0
+1 -1  3 -2 12
+1  2 -1 -1  3
diff --git a/demos/ppl_pips/examples/maxb.dat b/demos/ppl_pips/examples/maxb.dat
new file mode 100644
index 0000000..02db81a
--- /dev/null
+++ b/demos/ppl_pips/examples/maxb.dat
@@ -0,0 +1,9 @@
+((a maximization problem)
+ 2 1 4 0 3 1
+ (#[-1 0 0 1]
+  #[0 -1 0 1]
+  #[-1 3 12 -2]
+  #[2 -1 3 -1]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/pairi.dat b/demos/ppl_pips/examples/pairi.dat
new file mode 100644
index 0000000..9f604cd
--- /dev/null
+++ b/demos/ppl_pips/examples/pairi.dat
@@ -0,0 +1,7 @@
+((les nombres pairs)
+ 1 1 2 0 -1 1
+ (#[2 0 -1]
+  #[-6 1 3]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/petit.dat b/demos/ppl_pips/examples/petit.dat
new file mode 100644
index 0000000..5d23e19
--- /dev/null
+++ b/demos/ppl_pips/examples/petit.dat
@@ -0,0 +1,9 @@
+((( a b c d e f g h i j k l m n o p q r s t u v w x y z 1)())
+ 3 0 3 0 -1 1
+ (#[1 0 0 -2]
+  #[1 2 0 -3]
+  #[1 2 3 -7]
+   )
+ ()
+ )
+
diff --git a/demos/ppl_pips/examples/rairoi.dat b/demos/ppl_pips/examples/rairoi.dat
new file mode 100644
index 0000000..09f6d0b
--- /dev/null
+++ b/demos/ppl_pips/examples/rairoi.dat
@@ -0,0 +1,9 @@
+((test du papier RAIRO)
+ 2 3 4 0 -1 1
+ (#[-1 0 0 0 1 0]
+  #[0 -1 0 0 0 1]
+  #[-2 -1 0 -1 2 1]
+  #[2 1 0 1 -2 -1]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/examples/sor1d.pip b/demos/ppl_pips/examples/sor1d.pip
new file mode 100644
index 0000000..3b3dc61
--- /dev/null
+++ b/demos/ppl_pips/examples/sor1d.pip
@@ -0,0 +1,28 @@
+2 4
+ 1	1	0	0
+ 1	0	1	0
+
+-1
+
+20 8
+
+ 0	-1	0	0	0	0	0	2
+ 0	0	-1	0	0	0	0	1
+ 0	0	0	-1	0	0	0	2
+ 0	0	0	0	-1	0	0	4
+ 1	0	0	0	1	0	0	-2
+ 1	-2	0	2	1	0	0	-4
+ 1	0	0	0	-1	0	1	-1
+ 1	2	0	-2	-1	0	0	5
+ 1	0	0	1	0	0	0	-1
+ 1	0	-2	1	0	0	0	0
+ 1	-2	0	2	0	0	1	-5
+ 1	0	0	-1	0	1	0	0
+ 1	0	2	-1	0	0	0	1
+ 1	2	0	-2	0	0	0	3
+ 1	0	1	0	0	0	0	0
+ 1	-2	4	0	0	0	1	-3
+ 1	0	-2	0	0	1	0	0
+ 1	2	-4	0	0	0	0	3
+ 1	2	0	0	0	0	0	1
+ 1	-2	0	0	0	2	1	-5
diff --git a/demos/ppl_pips/examples/square.pip b/demos/ppl_pips/examples/square.pip
new file mode 100644
index 0000000..7bb3f0c
--- /dev/null
+++ b/demos/ppl_pips/examples/square.pip
@@ -0,0 +1,9 @@
+0 3
+
+-1
+
+4 5
+1  1  0  0  0
+1 -1  0  1  0
+1  0  1  0  0
+1  0 -1  1  0
diff --git a/demos/ppl_pips/examples/test02.dat b/demos/ppl_pips/examples/test02.dat
new file mode 100644
index 0000000..f0f8e18
--- /dev/null
+++ b/demos/ppl_pips/examples/test02.dat
@@ -0,0 +1,20 @@
+( ( Four parts in the file:
+    - comments (here !),
+    - Information line: here "2 2 5 0 -1 1" meaning 2 unknown,
+      2 parameters, 5 inequalities for domain, 1 ineq. for context,
+      no big parameter (-1) and integer solution requested (1).
+    - List of domain inequalities: #[ 2 3 -8 0 0] meaning
+      (2)*i + (3)*j + (-8)*1 + (0)*m + (0)*n >= 0.
+    - List of context inequalities: #[ 0 1 -3] meaning
+      (0)*m + (1)*n + (-3)*1 >= 0.
+  )
+  2 2 5 1 -1 1
+  ( #[ 2 3 -8 0 0]
+    #[ 4 -1 -4 0 0]
+    #[-1 0 0 0 1]
+    #[ 0 1 0 0 0]
+    #[ 0 -1 0 1 0]
+  )
+  ( #[ 0 1 -3]
+  )
+)
diff --git a/demos/ppl_pips/examples/test12i.dat b/demos/ppl_pips/examples/test12i.dat
new file mode 100644
index 0000000..5881897
--- /dev/null
+++ b/demos/ppl_pips/examples/test12i.dat
@@ -0,0 +1,17 @@
+((variables : a b c d ...., pas de parametres)
+ 12 0 12 0 -1 1
+ (#[1 0 0 0 0 0 0 0 0 0 0 0 -2]
+  #[1 2 0 0 0 0 0 0 0 0 0 0 -3]
+  #[1 2 3 0 0 0 0 0 0 0 0 0 -7]
+  #[1 2 3 4 0 0 0 0 0 0 0 0 -25]
+  #[1 2 3 4 5 0 0 0 0 0 0 0 -121]
+  #[1 2 3 4 5 6 0 0 0 0 0 0 -721]
+  #[1 2 3 4 5 6 7 0 0 0 0 0 -5041]
+  #[1 2 3 4 5 6 7 8 0 0 0 0 -40321]
+  #[1 2 3 4 5 6 7 8 9 0 0 0 -362881]
+  #[1 2 3 4 5 6 7 8 9 10 0 0 -3628801]
+  #[1 2 3 4 5 6 7 8 9 10 11 0 -39916801]
+  #[1 2 3 4 5 6 7 8 9 10 11 12 -479001601]
+ )
+ ()
+)
diff --git a/demos/ppl_pips/expected_int16 b/demos/ppl_pips/expected_int16
new file mode 100644
index 0000000..b471d6b
--- /dev/null
+++ b/demos/ppl_pips/expected_int16
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  d41d8cd98f00b204e9800998ecf8427e  -
+lineri.dat  d41d8cd98f00b204e9800998ecf8427e  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  d41d8cd98f00b204e9800998ecf8427e  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  d41d8cd98f00b204e9800998ecf8427e  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  d41d8cd98f00b204e9800998ecf8427e  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int16_a b/demos/ppl_pips/expected_int16_a
new file mode 100644
index 0000000..b471d6b
--- /dev/null
+++ b/demos/ppl_pips/expected_int16_a
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  d41d8cd98f00b204e9800998ecf8427e  -
+lineri.dat  d41d8cd98f00b204e9800998ecf8427e  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  d41d8cd98f00b204e9800998ecf8427e  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  d41d8cd98f00b204e9800998ecf8427e  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  d41d8cd98f00b204e9800998ecf8427e  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int32 b/demos/ppl_pips/expected_int32
new file mode 100644
index 0000000..cb13f0d
--- /dev/null
+++ b/demos/ppl_pips/expected_int32
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  1f73e09130d92979eb4388cbbab7f389  -
+lineri.dat  7b21035f6f07e68b8c0e2893a649f0ef  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  d41d8cd98f00b204e9800998ecf8427e  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  d41d8cd98f00b204e9800998ecf8427e  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  2dd9b24df50572c15981dd3faf8c74a4  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int32_a b/demos/ppl_pips/expected_int32_a
new file mode 100644
index 0000000..cb13f0d
--- /dev/null
+++ b/demos/ppl_pips/expected_int32_a
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  1f73e09130d92979eb4388cbbab7f389  -
+lineri.dat  7b21035f6f07e68b8c0e2893a649f0ef  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  d41d8cd98f00b204e9800998ecf8427e  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  d41d8cd98f00b204e9800998ecf8427e  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  2dd9b24df50572c15981dd3faf8c74a4  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int64 b/demos/ppl_pips/expected_int64
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_int64
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  1f73e09130d92979eb4388cbbab7f389  -
+lineri.dat  7b21035f6f07e68b8c0e2893a649f0ef  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  9c4f4bd2f5327b9ba442e4e294078282  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  3051dbe7ea7bf04e8890ddd41013a9dc  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  2dd9b24df50572c15981dd3faf8c74a4  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int64_a b/demos/ppl_pips/expected_int64_a
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_int64_a
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  1f73e09130d92979eb4388cbbab7f389  -
+lineri.dat  7b21035f6f07e68b8c0e2893a649f0ef  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  9c4f4bd2f5327b9ba442e4e294078282  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  3051dbe7ea7bf04e8890ddd41013a9dc  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  2dd9b24df50572c15981dd3faf8c74a4  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int8 b/demos/ppl_pips/expected_int8
new file mode 100644
index 0000000..3d0d199
--- /dev/null
+++ b/demos/ppl_pips/expected_int8
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  d41d8cd98f00b204e9800998ecf8427e  -
+lineri.dat  d41d8cd98f00b204e9800998ecf8427e  -
+loz.dat  d41d8cd98f00b204e9800998ecf8427e  -
+max.dat  d41d8cd98f00b204e9800998ecf8427e  -
+maxb.dat  d41d8cd98f00b204e9800998ecf8427e  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  d41d8cd98f00b204e9800998ecf8427e  -
+test12i.dat  d41d8cd98f00b204e9800998ecf8427e  -
+big.pip  d41d8cd98f00b204e9800998ecf8427e  -
+brisebarre.pip  d41d8cd98f00b204e9800998ecf8427e  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  d41d8cd98f00b204e9800998ecf8427e  -
+max.pip  d41d8cd98f00b204e9800998ecf8427e  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_int8_a b/demos/ppl_pips/expected_int8_a
new file mode 100644
index 0000000..3d0d199
--- /dev/null
+++ b/demos/ppl_pips/expected_int8_a
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  d41d8cd98f00b204e9800998ecf8427e  -
+lineri.dat  d41d8cd98f00b204e9800998ecf8427e  -
+loz.dat  d41d8cd98f00b204e9800998ecf8427e  -
+max.dat  d41d8cd98f00b204e9800998ecf8427e  -
+maxb.dat  d41d8cd98f00b204e9800998ecf8427e  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  d41d8cd98f00b204e9800998ecf8427e  -
+test12i.dat  d41d8cd98f00b204e9800998ecf8427e  -
+big.pip  d41d8cd98f00b204e9800998ecf8427e  -
+brisebarre.pip  d41d8cd98f00b204e9800998ecf8427e  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  d41d8cd98f00b204e9800998ecf8427e  -
+max.pip  d41d8cd98f00b204e9800998ecf8427e  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_mpz b/demos/ppl_pips/expected_mpz
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_mpz
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  1f73e09130d92979eb4388cbbab7f389  -
+lineri.dat  7b21035f6f07e68b8c0e2893a649f0ef  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  9c4f4bd2f5327b9ba442e4e294078282  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  3051dbe7ea7bf04e8890ddd41013a9dc  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  2dd9b24df50572c15981dd3faf8c74a4  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/expected_mpz_a b/demos/ppl_pips/expected_mpz_a
new file mode 100644
index 0000000..c04a9d5
--- /dev/null
+++ b/demos/ppl_pips/expected_mpz_a
@@ -0,0 +1,20 @@
+invert.dat  89eb267478eb8675de9602be9bb92f9e  -
+linear.dat  1f73e09130d92979eb4388cbbab7f389  -
+lineri.dat  7b21035f6f07e68b8c0e2893a649f0ef  -
+loz.dat  558273607bb0eec59c713980a8722ac8  -
+max.dat  2c3f32340ed2ea04d070dd311e9ca188  -
+maxb.dat  bc9d718f581cd7da4bbd7f0293749315  -
+pairi.dat  205989eb31ec0705adce45b63d5bebfe  -
+petit.dat  dd796c3d2afd2b7fb25a661c4137973f  -
+rairoi.dat  6aa01aa8b58429c4dfe33fad609306d5  -
+test02.dat  be9c80fb6dda6212d060a2295771f8cb  -
+test12i.dat  9c4f4bd2f5327b9ba442e4e294078282  -
+big.pip  bc9d718f581cd7da4bbd7f0293749315  -
+brisebarre.pip  3051dbe7ea7bf04e8890ddd41013a9dc  -
+cg1.pip  2571d40371dd1f1661348b08945e8a98  -
+esced.pip  7f4b69aed82cc0f498e7931ac1dbf92f  -
+ex2.pip  89eb267478eb8675de9602be9bb92f9e  -
+fimmel.pip  2dd9b24df50572c15981dd3faf8c74a4  -
+max.pip  2c3f32340ed2ea04d070dd311e9ca188  -
+sor1d.pip  80f93132ed5d70b6371d5bf5fa627376  -
+square.pip  65a57d1e7ccb8196f81fa6e701164b69  -
diff --git a/demos/ppl_pips/ppl_pips.1 b/demos/ppl_pips/ppl_pips.1
new file mode 100644
index 0000000..c15f2d2
--- /dev/null
+++ b/demos/ppl_pips/ppl_pips.1
@@ -0,0 +1,137 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.11.
+.TH PPL_PIPS "1" "October 2013" "ppl_pips 1.1" "User Commands"
+.SH NAME
+ppl_pips \- a PPL-based parametric integer programming problem solver
+.SH SYNOPSIS
+.B ppl_pips
+[\fIOPTION\fR]... [\fIFILE\fR]
+.SH DESCRIPTION
+Reads the definition of a Parametric Integer Programming problem
+and displays the lexicographic minimum in terms of the values of the
+parameters.
+.SH OPTIONS
+.TP
+\fB\-RMB\fR, \fB\-\-max\-memory\fR=\fIMB\fR
+limits memory usage to MB megabytes
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-oPATH\fR, \fB\-\-output\fR=\fIPATH\fR
+appends output to PATH
+.TP
+\fB\-P\fR, \fB\-\-polylib\fR
+reads problem in PolyLib format (default)
+.TP
+\fB\-p\fR, \fB\-\-piplib\fR
+reads problem in PipLib format
+.TP
+\fB\-t\fR, \fB\-\-timings\fR
+prints timings to stderr
+.TP
+\fB\-v\fR, \fB\-\-verbose\fR
+produces lots of output
+.TP
+\fB\-i\fR, \fB\-\-iterations\fR=\fIN\fR
+executes the resolution N times (default=1)
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information to stdout
+.TP
+\fB\-cPATH\fR, \fB\-\-check\fR=\fIPATH\fR
+checks if the result is equal to what is in PATH
+.SS "Cut generation options:"
+.TP
+\fB\-f\fR, \fB\-\-cut\-first\fR
+uses the first non\-integer row (default)
+.TP
+\fB\-d\fR, \fB\-\-cut\-deepest\fR
+tries to generate the deepest cut
+.TP
+\fB\-a\fR, \fB\-\-cut\-all\fR
+always generates all possible cuts
+.SS "Pivot row strategy options:"
+.TP
+\fB\-F\fR, \fB\-\-row\-first\fR
+uses the first row with negative parameter (default)
+.TP
+\fB\-M\fR, \fB\-\-row\-max\fR
+chooses row generating the lexico\-maximal pivot column
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+.SH NOTES
+The options \fB\-CSECS\fR (\fB\-\-max\-cpu\fR=\fISECS\fR) and
+\fB\-t\fR (\fB\-\-timings\fR) are not available on some platforms.
+.sp
+The PolyLib format is as follows:
+.TP
+-
+The first row describes the context matrix (i.e., constraints on the
+parameters).  The first value is the number of rows (which can be zero)
+and the second value is the number of columns. The number of parameters
+is the number of columns minus 2.
+.TP
+-
+Starting from the second row, there are the rows of the context matrix,
+if any.  Each row, which represents a constraint of the form
+.B "c1*p1 + ... + cn*pn + c0 =/>= 0",
+contains:
+the value 0 if the constraint is an equality, 1 if it is an inequality;
+the coefficients of the parameters
+.B "c1, ..., cn";
+the constant term
+.B "c0".
+For example, the inequality constraint on two parameters
+.B "p1 + 2*p2 - 1 >= 0"
+is encoded by the row
+.B "1 1 2 -1".
+.TP
+-
+The following row contains the parameter number for the so-called
+.IR "big parameter".
+If no big parameter is used, the value is -1.
+.TP
+-
+The following rows encode the problem inequality matrix.
+As for the context matrix, the first two values are the dimensions of the
+matrix. The number of variables is the number of columns in the matrix
+minus the number of parameters minus 2.
+Each row, which represents a constraint of the form
+.B "d1*v1 + ... + dm*vm + c1*p1 + ... + cn*pn + c0 =/>= 0",
+contains:
+the value 0 if the constraint is an equality, 1 if it is an inequality;
+the coefficients of the variables
+.B "d1, ..., dm";
+the coefficients of the parameters
+.B "c1, ..., cn";
+the constant term
+.B "c0".
+.sp
+The PipLib format is described in Section 2.2 of
+.IR "PIP/PipLib: A Solver for Parametric Integer Programming Problems"
+(see below).
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH COPYRIGHT
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Paul Feautrier.
+.IR "Parametric Integer Programming".
+RAIRO Recherche Operationnelle, 22(3):243-268, 1988.
+.sp
+Paul Feautrier, Jean-Francois Collard, and Cedric Bastoul.
+.IR "PIP/PipLib: A Solver for Parametric Integer Programming Problems",
+5.0 edition, July 2007.
+Distributed with PIP/PipLib 1.4.0.
diff --git a/demos/ppl_pips/ppl_pips.cc b/demos/ppl_pips/ppl_pips.cc
new file mode 100644
index 0000000..3538cef
--- /dev/null
+++ b/demos/ppl_pips/ppl_pips.cc
@@ -0,0 +1,827 @@
+/* A sort of clone of the cddlib test program `lcdd'.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+//#define USE_PIPLIB 1
+
+#if (!defined(USE_PPL) && !defined(USE_PIPLIB))
+#define USE_PPL 1
+#elif (defined(USE_PPL) && defined(USE_PIPLIB))
+#error "Exactly one among USE_PPL and USE_PIPLIB must be defined"
+#endif
+
+#if defined(USE_PPL)
+
+#include "ppl.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11
+#error "PPL version 0.11 or following is required"
+#endif
+
+typedef PPL::C_Polyhedron POLYHEDRON_TYPE;
+
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#elif defined(USE_PIPLIB)
+
+#error "PipLib not supported yet"
+
+#endif
+
+#include "timings.hh"
+#include <gmpxx.h>
+#include <vector>
+#include <set>
+#include <climits>
+#include <cassert>
+#include <cstdarg>
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+#include <memory>
+
+#ifdef PPL_HAVE_GETOPT_H
+#include <getopt.h>
+
+// Try to accommodate non-GNU implementations of `getopt()'.
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif // defined(PPL_HAVE_GETOPT_H)
+
+#ifdef PPL_HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+# include <unistd.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+namespace {
+
+PPL::PIP_Problem::Control_Parameter_Value cutting_strategy
+  = PPL::PIP_Problem::CUTTING_STRATEGY_FIRST;
+
+PPL::PIP_Problem::Control_Parameter_Value pivot_row_strategy
+    = PPL::PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+
+long loop_iterations = 1;
+
+void
+pip_display_sol(std::ostream& out,
+                const Parma_Polyhedra_Library::PIP_Tree pip,
+                const Parma_Polyhedra_Library::Variables_Set& parameters,
+                const Parma_Polyhedra_Library::Variables_Set& vars,
+                Parma_Polyhedra_Library::dimension_type space_dimension,
+                int indent = 0) {
+  using namespace std;
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (!pip) {
+    out << setw(indent*2) << "" << "_|_" << endl;
+  }
+  else {
+    for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+           i = pip->art_parameter_begin(),
+           i_end = pip->art_parameter_end();
+         i != i_end;
+         ++i) {
+      out << setw(indent*2) << "" << "Parameter "
+          << Linear_Expression(Variable(space_dimension++))
+          << " = " << *i << endl;
+    }
+    const Constraint_System &constraints = pip->constraints();
+    const bool constraints_empty = constraints.empty();
+    if (!constraints_empty) {
+      out << setw(indent*2) << "" << "if ";
+      for (Constraint_System::const_iterator
+             cs_begin = constraints.begin(),
+             cs_end = constraints.end(),
+             i = cs_begin; i != cs_end; ++i)
+        out << ((i == cs_begin) ? "" : " and ") << *i;
+      out << " then" << endl;
+    }
+    const PIP_Decision_Node* const decision_node_p = pip->as_decision();
+    if (decision_node_p) {
+      pip_display_sol(out, decision_node_p->child_node(true),
+                      parameters, vars, space_dimension, indent+1);
+      out << setw(indent*2) << "" << "else" << endl;
+      pip_display_sol(out, decision_node_p->child_node(false),
+                      parameters, vars, space_dimension, indent+1);
+    }
+    else {
+      const PIP_Solution_Node* const solution_node_p = pip->as_solution();
+      out << setw(indent*2 + (constraints_empty ? 0 : 2)) << "" << "{";
+      for (Variables_Set::const_iterator
+             v_begin = vars.begin(),
+             v_end = vars.end(),
+             i = v_begin; i != v_end; ++i)
+        out << ((i == v_begin) ? "" : " ; ")
+            << solution_node_p->parametric_values(Variable(*i));
+      out << "}" << endl;
+      if (!constraints_empty) {
+        out << setw(indent*2) << "" << "else" << endl;
+        out << setw(indent*2 + 2) << "" << "_|_" << endl;
+      }
+    }
+  }
+}
+
+class PIP_Parser {
+public:
+  PIP_Parser() : pip() {
+    pip.set_control_parameter(cutting_strategy);
+    pip.set_control_parameter(pivot_row_strategy);
+  }
+
+  virtual ~PIP_Parser() {
+  }
+
+  const PPL::PIP_Problem& problem() const {
+    return pip;
+  }
+
+  virtual bool read(std::istream& in) = 0;
+
+  //! Output the solution in "if-then-else" format.
+  void output_solution_tree(std::ostream& out) {
+    const PPL::Variables_Set& params = pip.parameter_space_dimensions();
+    PPL::Variables_Set vars;
+    for (PPL::dimension_type i = 0; i < pip.space_dimension(); ++i) {
+      if (params.count(i) == 0)
+        vars.insert(i);
+    }
+    const PPL::PIP_Tree solution = pip.solution();
+    pip_display_sol(out, solution, params, vars, pip.space_dimension());
+  }
+
+  typedef std::vector<PPL::Coefficient> Coeff_Vector;
+  typedef std::vector<int> Int_Vector;
+
+  bool update_pip(PPL::dimension_type num_vars,
+                  PPL::dimension_type num_params,
+                  PPL::dimension_type num_constraints,
+                  PPL::dimension_type num_ctx_rows,
+                  const Coeff_Vector& constraints,
+                  const Coeff_Vector& context,
+                  const Int_Vector& constraint_type,
+                  const Int_Vector& ctx_type,
+                  PPL::dimension_type bignum_column) {
+    pip.add_space_dimensions_and_embed(num_vars, num_params);
+    for (PPL::dimension_type k = 0, i = 0; i < num_constraints; ++i) {
+      PPL::Linear_Expression expr;
+      for (PPL::dimension_type j = 0; j < num_vars + num_params; ++j)
+        add_mul_assign(expr, constraints[k++], PPL::Variable(j));
+      expr += constraints[k++];
+      if (constraint_type[i])
+        pip.add_constraint(PPL::Constraint(expr >= 0));
+      else
+        pip.add_constraint(PPL::Constraint(expr == 0));
+    }
+    if (num_params > 0) {
+      for (PPL::dimension_type k = 0, i = 0; i < num_ctx_rows; ++i) {
+        PPL::Linear_Expression expr;
+        for (PPL::dimension_type j = 0; j < num_params; ++j)
+          add_mul_assign(expr, context[k++], PPL::Variable(num_vars+j));
+        expr += context[k++];
+        if (ctx_type[i])
+          pip.add_constraint(PPL::Constraint(expr >= 0));
+        else
+          pip.add_constraint(PPL::Constraint(expr == 0));
+      }
+    }
+    if (bignum_column != PPL::not_a_dimension())
+      pip.set_big_parameter_dimension(bignum_column);
+    return true;
+  }
+
+protected:
+  //! The problem object.
+  PPL::PIP_Problem pip;
+}; // class PIP_Parser
+
+class PIP_PolyLib_Parser : public PIP_Parser {
+public:
+  PIP_PolyLib_Parser(): PIP_Parser() {
+  }
+
+  bool read(std::istream& in) {
+    std::string line;
+
+    PPL::dimension_type num_ctx_rows;
+    PPL::dimension_type num_params;
+    getline_no_comment(in, line);
+    {
+      std::istringstream iss(line);
+      iss >> num_ctx_rows >> num_params;
+    }
+    PPL_ASSERT(num_params >= 2);
+    num_params -= 2;
+
+    Coeff_Vector context(num_ctx_rows * (1+num_params));
+    Int_Vector ctx_type(num_ctx_rows);
+    for (PPL::dimension_type i = 0; i < num_ctx_rows; ++i) {
+      getline_no_comment(in, line);
+      std::istringstream iss(line);
+      iss >> ctx_type[i];
+      for (PPL::dimension_type j = 0; j <= num_params; ++j) {
+        iss >> context[i*num_ctx_rows + j];
+      }
+    }
+
+    int bignum_column_coding;
+    getline_no_comment(in, line);
+    {
+      std::istringstream iss(line);
+      iss >> bignum_column_coding;
+    }
+    PPL_ASSERT(bignum_column_coding >= -1);
+
+    PPL::dimension_type num_constraints;
+    PPL::dimension_type constraint_width;
+    PPL::dimension_type num_vars;
+    getline_no_comment(in, line);
+    {
+      std::istringstream iss(line);
+      iss >> num_constraints >> constraint_width;
+    }
+    constraint_width -= 1;
+    num_vars = constraint_width - num_params - 1;
+
+    Coeff_Vector constraints(num_constraints * constraint_width);
+    Int_Vector constraint_type(num_constraints);
+    for (PPL::dimension_type i = 0; i < num_constraints; ++i) {
+      getline_no_comment(in, line);
+      std::istringstream iss(line);
+      iss >> constraint_type[i];
+      for (PPL::dimension_type j = 0; j < constraint_width; ++j) {
+        iss >> constraints[i*constraint_width + j];
+      }
+    }
+
+    const PPL::dimension_type bignum_column
+      = (bignum_column_coding == -1)
+      ? PPL::not_a_dimension()
+      : (num_vars + PPL::dimension_type(bignum_column_coding - 1));
+
+    const bool result = update_pip(num_vars, num_params,
+                                   num_constraints, num_ctx_rows,
+                                   constraints, context,
+                                   constraint_type, ctx_type,
+                                   bignum_column);
+    return result;
+  }
+
+protected:
+  static void getline_no_comment(std::istream& in, std::string& s) {
+    do {
+      getline(in, s);
+    } while (s.size() == 0 || s[0] == '\r' || s[0] == '#');
+  }
+}; // class PIP_PolyLib_Parser
+
+class PIP_PipLib_Parser : public PIP_Parser {
+public:
+  PIP_PipLib_Parser()
+    : PIP_Parser(), comment() {
+  }
+
+  bool read(std::istream& in) {
+    if (!expect(in, '('))
+      return false;
+    if (!expect(in, '('))
+      return false;
+    if (!read_comment(in))
+      return false;
+
+    PPL::dimension_type num_vars;
+    PPL::dimension_type num_params;
+    in >> num_vars >> num_params;
+
+    PPL::dimension_type num_constraints;
+    PPL::dimension_type num_ctx_rows;
+    in >> num_constraints >> num_ctx_rows;
+
+    int bignum_column_coding;
+    in >> bignum_column_coding;
+    PPL_ASSERT(bignum_column_coding >= -1);
+    const PPL::dimension_type bignum_column
+      = (bignum_column_coding == -1)
+      ? PPL::not_a_dimension()
+      : PPL::dimension_type(bignum_column_coding - 1);
+
+    int solve_integer;
+    in >> solve_integer;
+    if (solve_integer != 1) {
+      std::cerr << "Can only solve integer problems." << std::endl;
+      return false;
+    }
+
+    if (!expect(in, '('))
+      return false;
+    const PPL::dimension_type constraint_width = num_vars+num_params+1;
+    Coeff_Vector constraints(num_constraints * constraint_width);
+    Int_Vector constraint_type(num_constraints);
+    for (PPL::dimension_type i = 0; i < num_constraints; ++i)
+      constraint_type[i] = 1;
+    for (PPL::dimension_type i = 0; i < num_constraints; ++i)
+      if (!read_vector(in, i, constraint_width, num_vars, constraints))
+        return false;
+
+    Coeff_Vector context(num_ctx_rows * (1+num_params));
+    Int_Vector ctx_type(num_ctx_rows);
+    for (PPL::dimension_type i = 0; i < num_ctx_rows; ++i)
+      ctx_type[i] = 1;
+    for (PPL::dimension_type i = 0; i < num_ctx_rows; ++i)
+      if (!read_vector(in, i, num_params+1, num_params, context))
+        return false;
+
+    const bool result = update_pip(num_vars, num_params,
+                                   num_constraints, num_ctx_rows,
+                                   constraints, context,
+                                   constraint_type, ctx_type,
+                                   bignum_column);
+    return result;
+  }
+
+protected:
+  bool read_comment(std::istream& in) {
+    comment = "";
+    int count = 1;
+    do {
+      char c;
+      if (!in.get(c))
+        return false;
+      if (c == '(')
+        ++count;
+      else if (c == ')')
+        --count;
+      if (count > 0)
+        comment += c;
+    } while (count > 0);
+    return true;
+  }
+
+  static bool expect(std::istream& in, char c) {
+    char a;
+    do {
+      in >> a;
+    } while (a != c && in.good());
+    return a == c;
+  }
+
+  static bool read_vector(std::istream& in,
+                          PPL::dimension_type row_index,
+                          PPL::dimension_type row_size,
+                          PPL::dimension_type cst_col,
+                          Coeff_Vector& tab) {
+    if (!expect(in, '#'))
+      return false;
+    if (!expect(in, '['))
+      return false;
+    std::string s;
+    getline(in, s, ']');
+    if (in.fail())
+      return false;
+    std::istringstream iss(s);
+    const PPL::dimension_type start_index = row_index * row_size;
+    PPL::dimension_type k = start_index;
+    for (PPL::dimension_type i = 0; i < cst_col; ++i, ++k) {
+      iss >> tab[k];
+      if (iss.fail())
+        return false;
+    }
+    iss >> tab[start_index + row_size - 1];
+    if (iss.fail())
+      return false;
+    for (PPL::dimension_type i = cst_col + 1; i < row_size; ++i, ++k) {
+      iss >> tab[k];
+      if (iss.fail())
+        return false;
+    }
+    return true;
+  }
+
+  // The comment string in the source file
+  std::string comment;
+}; // class PIP_PipLib_Parser
+
+#ifdef PPL_HAVE_GETOPT_H
+struct option long_options[] = {
+  {"max-cpu",        required_argument, 0, 'C'},
+  {"max-memory",     required_argument, 0, 'R'},
+  {"help",           no_argument,       0, 'h'},
+  {"output",         required_argument, 0, 'o'},
+  {"polylib",        no_argument,       0, 'P'},
+  {"piplib",         no_argument,       0, 'p'},
+  {"timings",        no_argument,       0, 't'},
+  {"verbose",        no_argument,       0, 'v'},
+  {"iterations",     required_argument, 0, 'i'},
+#if defined(USE_PPL)
+  {"version",        no_argument,       0, 'V'},
+  {"check",          required_argument, 0, 'c'},
+#endif
+  {"cut-first",      no_argument,       0, 'f'},
+  {"cut-deepest",    no_argument,       0, 'd'},
+  {"cut-all",        no_argument,       0, 'a'},
+  {"row-first",      no_argument,       0, 'F'},
+  {"row-max",        no_argument,       0, 'M'},
+  {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]\n"
+"Reads the definition of a Parametric Integer Programming problem\n"
+"and displays the lexicographic minimum in terms of the values of the\n"
+"parameters.\n\n"
+"Options:\n"
+"  -RMB, --max-memory=MB   limits memory usage to MB megabytes\n"
+"  -h, --help              prints this help text to stdout\n"
+"  -oPATH, --output=PATH   appends output to PATH\n"
+"  -P, --polylib           reads problem in PolyLib format (default)\n"
+"  -p, --piplib            reads problem in PipLib format\n"
+"  -t, --timings           prints timings to stderr\n"
+"  -v, --verbose           produces lots of output\n"
+"  -i, --iterations=N      executes the resolution N times (default=1)\n"
+#if defined(USE_PPL)
+"  -V, --version           prints version information to stdout\n"
+"  -cPATH, --check=PATH    checks if the result is equal to what is in PATH\n"
+#endif
+"\nCut generation options:\n"
+"  -f, --cut-first         uses the first non-integer row (default)\n"
+"  -d, --cut-deepest       tries to generate the deepest cut\n"
+"  -a, --cut-all           always generates all possible cuts\n"
+"\nPivot row strategy options:\n"
+"  -F, --row-first         uses the first row with negative parameter (default)\n"
+"  -M, --row-max           chooses row generating the lexico-maximal pivot column\n"
+#ifndef PPL_HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+#if defined(USE_PPL)
+#define OPTION_LETTERS "R:ho:Pptvi:Vc:fdaFM"
+#else
+#define OPTION_LETTERS "R:ho:Pptvi:fdaFM"
+#endif
+
+const char* program_name = 0;
+
+unsigned long max_bytes_of_virtual_memory = 0;
+bool print_timings = false;
+bool verbose = false;
+const char* check_file_name = 0;
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+const char* input_file_name = 0;
+std::istream* input_stream_p = 0;
+
+void
+set_input(const char* file_name) {
+  if (input_stream_p && *input_stream_p != std::cin)
+    delete input_stream_p;
+
+  if (file_name) {
+    input_stream_p = new std::ifstream(file_name, std::ios_base::in);
+    if (!*input_stream_p)
+      fatal("cannot open input file `%s'", file_name);
+    input_file_name = file_name;
+  }
+  else {
+    input_stream_p = &std::cin;
+    input_file_name = "<cin>";
+  }
+}
+
+const char* output_file_name = 0;
+std::ostream* output_stream_p = 0;
+
+void
+set_output(const char* file_name) {
+  if (output_stream_p && *output_stream_p != std::cout)
+    delete output_stream_p;
+
+  if (file_name) {
+    output_stream_p = new std::ofstream(file_name,
+                                        std::ios_base::out
+                                        | std::ios_base::app);
+    if (!*output_stream_p)
+      fatal("cannot open output file `%s'", file_name);
+    output_file_name = file_name;
+  }
+  else {
+    output_stream_p = &std::cout;
+    output_file_name = "<cout>";
+  }
+}
+
+bool piplib_format = false;
+
+} // namespace
+
+void
+error(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: in `%s': ", program_name, input_file_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void
+warning(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: Warning: in `%s': ", program_name, input_file_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+}
+
+#if PPL_CXX_SUPPORTS_LIMITING_MEMORY && PPL_HAVE_DECL_RLIMIT_AS
+
+void
+limit_virtual_memory(const unsigned long bytes) {
+  struct rlimit t;
+
+  if (getrlimit(RLIMIT_AS, &t) != 0)
+    fatal("getrlimit failed: %s", strerror(errno));
+
+  if (bytes < t.rlim_cur) {
+    t.rlim_cur = bytes;
+    if (setrlimit(RLIMIT_AS, &t) != 0)
+      fatal("setrlimit failed: %s", strerror(errno));
+  }
+}
+
+#else
+
+void
+limit_virtual_memory(unsigned long) {
+}
+
+#endif // !PPL_HAVE_DECL_RLIMIT_AS
+
+void
+process_options(int argc, char* argv[]) {
+  while (true) {
+#ifdef PPL_HAVE_GETOPT_H
+    int option_index = 0;
+    const int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+                        &option_index);
+#else
+    const int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+    if (c == EOF)
+      break;
+
+    char* endptr;
+    switch (c) {
+    case 0:
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      exit(0);
+      break;
+
+    case 'R':
+      {
+        const unsigned long MEGA = 1024U*1024U;
+        const long l = strtol(optarg, &endptr, 10);
+        if (*endptr || l < 0)
+          fatal("a non-negative integer must follow `-R'");
+        else if (static_cast<unsigned long>(l) > ULONG_MAX/MEGA)
+          max_bytes_of_virtual_memory = ULONG_MAX;
+        else
+          max_bytes_of_virtual_memory = static_cast<unsigned long>(l)*MEGA;
+      }
+      break;
+
+    case 'o':
+      output_file_name = optarg;
+      break;
+
+    case 'P':
+      piplib_format = false;
+      break;
+
+    case 'p':
+      piplib_format = true;
+      break;
+
+    case 't':
+      print_timings = true;
+      break;
+
+    case 'v':
+      verbose = true;
+      break;
+
+    case 'i':
+      loop_iterations = strtol(optarg, &endptr, 10);
+      if (*endptr || loop_iterations < 1)
+        fatal("a positive integer must follow `-i'");
+      break;
+
+#if defined(USE_PPL)
+
+    case 'V':
+      fprintf(stdout, "%s\n", PPL_VERSION);
+      exit(0);
+      break;
+
+    case 'c':
+      check_file_name = optarg;
+      break;
+
+#endif
+
+    case 'f':
+      cutting_strategy = PPL::PIP_Problem::CUTTING_STRATEGY_FIRST;
+      break;
+
+    case 'd':
+      cutting_strategy = PPL::PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+      break;
+
+    case 'a':
+      cutting_strategy = PPL::PIP_Problem::CUTTING_STRATEGY_ALL;
+      break;
+
+    case 'F':
+      pivot_row_strategy = PPL::PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+      break;
+
+    case 'M':
+      pivot_row_strategy = PPL::PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (argc - optind > 1)
+    // We have multiple input files.
+    fatal("at most one input file is accepted");
+
+  // We have one input files.
+  if (optind < argc)
+    input_file_name = argv[optind];
+  else
+    // If no input files have been specified: we will read from standard input.
+    assert(input_file_name == 0);
+}
+
+void
+maybe_start_clock() {
+  if (print_timings)
+    start_clock();
+}
+
+void
+maybe_print_clock() {
+  if (print_timings) {
+    std::cerr << input_file_name << " ";
+    print_clock(std::cerr);
+    std::cerr << std::endl;
+  }
+}
+
+int
+main(int argc, char* argv[]) try {
+  program_name = argv[0];
+
+#if defined(USE_PPL)
+  if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+          PPL_VERSION, PPL::version());
+
+  if (verbose)
+    std::cerr << "Parma Polyhedra Library version:\n" << PPL::version()
+              << "\n\nParma Polyhedra Library banner:\n" << PPL::banner()
+              << std::endl;
+#endif
+
+  // Process command line options.
+  process_options(argc, argv);
+
+  if (max_bytes_of_virtual_memory > 0)
+    limit_virtual_memory(max_bytes_of_virtual_memory);
+
+  // Set up the input and output streams.
+  set_input(input_file_name);
+  set_output(output_file_name);
+
+//  POLYHEDRON_TYPE ph;
+//  Representation rep = read_polyhedron(input(), ph);
+  std::auto_ptr<PIP_Parser> parser;
+  if (piplib_format)
+    parser.reset(new PIP_PipLib_Parser);
+  else
+    parser.reset(new PIP_PolyLib_Parser);
+  if (!parser->read(*input_stream_p))
+    return 1;
+
+  maybe_start_clock();
+
+  const PPL::PIP_Problem& pip = parser->problem();
+
+  if (loop_iterations == 1) {
+    // Compute the dual simplex on the problem.
+    pip.solve();
+    // Write the solution.
+    parser->output_solution_tree(*output_stream_p);
+  }
+  else {
+    std::auto_ptr<PPL::PIP_Problem> pip_p;
+    // Perform a time benchmark loop executing the resolution several times.
+    for (long i = 0; i < loop_iterations; ++i) {
+      pip_p.reset(new PPL::PIP_Problem(pip));
+      pip_p->solve();
+    }
+  }
+
+#if defined(USE_PPL) || defined(USE_PIPLIB)
+  maybe_print_clock();
+#endif
+
+  return 0;
+}
+catch (const std::bad_alloc&) {
+  fatal("out of memory");
+  exit(1);
+}
+catch (const std::overflow_error& e) {
+  fatal("arithmetic overflow (%s)", e.what());
+  exit(1);
+}
+catch (...) {
+  fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+  exit(1);
+}
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..4ebd5b3
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2013-05-30.07; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..8d5ce89
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,1736 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# All the documentation in docdir.
+docdir = @docdir@
+htmldir = $(docdir)
+pdfdir = $(docdir)
+psdir = $(docdir)
+txtdir = $(docdir)
+
+DOXYGEN = doxygen
+
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+BIBLIOGRAPHIES = \
+ppl.bib \
+ppl_citations.bib
+
+##### Library Core Manuals (C++ Interface) #####
+
+USER_CORE_HTML_MANUAL = ppl-user- at VERSION@-html.tar.gz
+DEVREF_CORE_HTML_MANUAL = ppl-devref- at VERSION@-html.tar.gz
+
+USER_CORE_PDF_MANUAL = ppl-user- at VERSION@.pdf
+DEVREF_CORE_PDF_MANUAL = ppl-devref- at VERSION@.pdf
+
+USER_CORE_PS_MANUAL = ppl-user- at VERSION@.ps.gz
+DEVREF_CORE_PS_MANUAL = ppl-devref- at VERSION@.ps.gz
+
+USER_CORE_HTML_DIR = ppl-user- at VERSION@-html
+DEVREF_CORE_HTML_DIR = ppl-devref- at VERSION@-html
+
+# NOTE: this variable is used to record Makefile dependencies.
+# The file path is that of the source directory.
+DOX_LICENSE_FILES = \
+gpl.dox \
+fdl.dox
+
+# NOTE: this variable is used to populate Doxygen configuration tag INPUT.
+# The file path is that of the build directory, hence we cannot use
+# variable DOX_LICENSE_FILES defined above.
+DOX_LICENSE_INPUT = \
+$(srcdir)/gpl.dox \
+$(srcdir)/fdl.dox
+
+DOX_FILES = \
+$(DOX_LICENSE_FILES) \
+definitions.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+../src/ppl_header.hh ../src/ppl_include_files.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+
+if BUILD_C_INTERFACE
+
+# C Language Interface Manuals
+
+USER_C_INTERFACE_HTML_MANUAL = \
+ppl-user-c-interface- at VERSION@-html.tar.gz
+DEVREF_C_INTERFACE_HTML_MANUAL = \
+ppl-devref-c-interface- at VERSION@-html.tar.gz
+
+USER_C_INTERFACE_PDF_MANUAL = \
+ppl-user-c-interface- at VERSION@.pdf
+DEVREF_C_INTERFACE_PDF_MANUAL = \
+ppl-devref-c-interface- at VERSION@.pdf
+
+USER_C_INTERFACE_PS_MANUAL = \
+ppl-user-c-interface- at VERSION@.ps.gz
+DEVREF_C_INTERFACE_PS_MANUAL = \
+ppl-devref-c-interface- at VERSION@.ps.gz
+
+USER_C_INTERFACE_HTML_DIR = \
+ppl-user-c-interface- at VERSION@-html
+DEVREF_C_INTERFACE_HTML_DIR = \
+ppl-devref-c-interface- at VERSION@-html
+
+COMMON_C_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+ppl.sty \
+../configure.ac \
+../interfaces/C/ppl_c_version.h.in \
+../interfaces/C/ppl_c_header.h \
+../interfaces/C/C_interface.dox
+
+USER_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+user-language-interface.tex
+
+DEVREF_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+devref-language-interface.tex \
+../interfaces/C/ppl_c_implementation_common_defs.hh \
+../interfaces/C/ppl_c_implementation_common_inlines.hh \
+../interfaces/C/ppl_c_implementation_common.cc
+
+
+# Configuration Dependent C Language Interface Manuals.
+
+USER_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-c-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-c-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-c-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-c-interface- at VERSION@.pdf
+
+USER_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ppl-user-configured-c-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-c-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ppl-user-configured-c-interface- at VERSION@-html
+DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ppl-devref-configured-c-interface- at VERSION@-html
+
+USER_CONFIGURED_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/C/ppl_c.h
+
+DEVREF_CONFIGURED_C_INTERFACE_STUFF = \
+$(COMMON_C_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/C/ppl_c.h \
+../interfaces/C/ppl_c_implementation_common_defs.hh \
+../interfaces/C/ppl_c_implementation_common_inlines.hh \
+../interfaces/C/ppl_c_implementation_common.cc
+
+endif BUILD_C_INTERFACE
+
+
+if BUILD_SOME_PROLOG_INTERFACES
+
+# Prolog Language Interface Manuals
+
+USER_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-user-prolog-interface- at VERSION@-html.tar.gz
+DEVREF_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-devref-prolog-interface- at VERSION@-html.tar.gz
+
+USER_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-user-prolog-interface- at VERSION@.pdf
+DEVREF_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-devref-prolog-interface- at VERSION@.pdf
+
+USER_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-user-prolog-interface- at VERSION@.ps.gz
+DEVREF_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-devref-prolog-interface- at VERSION@.ps.gz
+
+USER_PROLOG_INTERFACE_HTML_DIR = \
+ppl-user-prolog-interface- at VERSION@-html
+DEVREF_PROLOG_INTERFACE_HTML_DIR = \
+ppl-devref-prolog-interface- at VERSION@-html
+
+
+PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES = \
+../interfaces/Prolog/Prolog_interface_sysindep.dox \
+../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+../interfaces/Prolog/Prolog_interface_compilation.dox \
+../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+USER_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+DEVREF_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+../interfaces/Prolog/ppl_prolog_common_defs.hh \
+../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# Configuration Dependent Prolog Language Interface Manuals
+
+USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-prolog-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-prolog-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-prolog-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-prolog-interface- at VERSION@.pdf
+
+USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-user-configured-prolog-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-prolog-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ppl-user-configured-prolog-interface- at VERSION@-html
+DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ppl-devref-configured-prolog-interface- at VERSION@-html
+
+USER_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_configured_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+../interfaces/Prolog/Prolog_configured_interface.dox \
+$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+../interfaces/Prolog/ppl_prolog_common_defs.hh \
+../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+../interfaces/Prolog/ppl_prolog_common.cc \
+$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \
+$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc.stamp
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+
+if BUILD_OCAML_INTERFACE
+
+# OCaml Language Interface Manuals
+
+USER_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-user-ocaml-interface- at VERSION@-html.tar.gz
+DEVREF_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-devref-ocaml-interface- at VERSION@-html.tar.gz
+
+USER_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-user-ocaml-interface- at VERSION@.pdf
+DEVREF_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-devref-ocaml-interface- at VERSION@.pdf
+
+USER_OCAML_INTERFACE_PS_MANUAL = \
+ppl-user-ocaml-interface- at VERSION@.ps.gz
+DEVREF_OCAML_INTERFACE_PS_MANUAL = \
+ppl-devref-ocaml-interface- at VERSION@.ps.gz
+
+USER_OCAML_INTERFACE_HTML_DIR = \
+ppl-user-ocaml-interface- at VERSION@-html
+DEVREF_OCAML_INTERFACE_HTML_DIR = \
+ppl-devref-ocaml-interface- at VERSION@-html
+
+USER_OCAML_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+../interfaces/OCaml/OCaml_interface.dox \
+../interfaces/OCaml/ppl_ocaml_globals.mli
+
+DEVREF_OCAML_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+../interfaces/OCaml/OCaml_interface.dox \
+../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+../interfaces/OCaml/ppl_ocaml_common_inlines.hh \
+../interfaces/OCaml/ppl_ocaml_common.cc \
+../interfaces/OCaml/ppl_ocaml_globals.mli
+
+
+# Configuration Dependent OCaml Language Interface Manuals.
+
+USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-ocaml-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-ocaml-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-ocaml-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-ocaml-interface- at VERSION@.pdf
+
+USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ppl-user-configured-ocaml-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-ocaml-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ppl-user-configured-ocaml-interface- at VERSION@-html
+DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ppl-devref-configured-ocaml-interface- at VERSION@-html
+
+USER_CONFIGURED_OCAML_INTERFACE_STUFF = \
+$(USER_OCAML_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF = \
+$(DEVREF_OCAML_INTERFACE_STUFF) \
+$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+endif BUILD_OCAML_INTERFACE
+
+if BUILD_JAVA_INTERFACE
+
+# Java Language Interface Manuals
+
+USER_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-user-java-interface- at VERSION@-html.tar.gz
+DEVREF_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-devref-java-interface- at VERSION@-html.tar.gz
+
+USER_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-user-java-interface- at VERSION@.pdf
+DEVREF_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-devref-java-interface- at VERSION@.pdf
+
+USER_JAVA_INTERFACE_PS_MANUAL = \
+ppl-user-java-interface- at VERSION@.ps.gz
+DEVREF_JAVA_INTERFACE_PS_MANUAL = \
+ppl-devref-java-interface- at VERSION@.ps.gz
+
+USER_JAVA_INTERFACE_HTML_DIR = \
+ppl-user-java-interface- at VERSION@-html
+DEVREF_JAVA_INTERFACE_HTML_DIR = \
+ppl-devref-java-interface- at VERSION@-html
+
+JAVA_INTERFACE_JAVA_FILES = \
+../interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java \
+../interfaces/Java/parma_polyhedra_library/By_Reference.java \
+../interfaces/Java/parma_polyhedra_library/Coefficient.java \
+../interfaces/Java/parma_polyhedra_library/Complexity_Class.java \
+../interfaces/Java/parma_polyhedra_library/Congruence.java \
+../interfaces/Java/parma_polyhedra_library/Congruence_System.java \
+../interfaces/Java/parma_polyhedra_library/Constraint.java \
+../interfaces/Java/parma_polyhedra_library/Constraint_System.java \
+../interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java \
+../interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java \
+../interfaces/Java/parma_polyhedra_library/Degenerate_Element.java \
+../interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Generator.java \
+../interfaces/Java/parma_polyhedra_library/Generator_System.java \
+../interfaces/Java/parma_polyhedra_library/Generator_Type.java \
+../interfaces/Java/parma_polyhedra_library/Grid_Generator.java \
+../interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java \
+../interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java \
+../interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java \
+../interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java \
+../interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/MIP_Problem.java \
+../interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java \
+../interfaces/Java/parma_polyhedra_library/Optimization_Mode.java \
+../interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java \
+../interfaces/Java/parma_polyhedra_library/Pair.java \
+../interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java \
+../interfaces/Java/parma_polyhedra_library/Partial_Function.java \
+../interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java \
+../interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java \
+../interfaces/Java/parma_polyhedra_library/PPL_Object.java \
+../interfaces/Java/parma_polyhedra_library/Relation_Symbol.java \
+../interfaces/Java/parma_polyhedra_library/Variable.java \
+../interfaces/Java/parma_polyhedra_library/Variables_Set.java
+
+USER_JAVA_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+user-language-interface.tex \
+ppl.sty \
+$(JAVA_INTERFACE_JAVA_FILES)
+
+DEVREF_JAVA_INTERFACE_STUFF = \
+$(DOX_LICENSE_FILES) \
+devref-language-interface.tex \
+ppl.sty \
+$(JAVA_INTERFACE_JAVA_FILES) \
+../interfaces/Java/jni/ppl_java_common.cc \
+../interfaces/Java/jni/ppl_java_common_defs.hh \
+../interfaces/Java/jni/ppl_java_common_inlines.hh \
+../interfaces/Java/jni/ppl_java_globals.cc
+
+
+# Configuration Dependent Java Language Interface Manuals.
+
+USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-user-configured-java-interface- at VERSION@-html.tar.gz
+DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ppl-devref-configured-java-interface- at VERSION@-html.tar.gz
+
+USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-user-configured-java-interface- at VERSION@.pdf
+DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ppl-devref-configured-java-interface- at VERSION@.pdf
+
+USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ppl-user-configured-java-interface- at VERSION@.ps.gz
+DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ppl-devref-configured-java-interface- at VERSION@.ps.gz
+
+USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ppl-user-configured-java-interface- at VERSION@-html
+DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ppl-devref-configured-java-interface- at VERSION@-html
+
+USER_CONFIGURED_JAVA_INTERFACE_STUFF = \
+$(USER_JAVA_INTERFACE_STUFF)
+
+DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF = \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+
+endif BUILD_JAVA_INTERFACE
+
+###################################################################
+
+# Grouping of dirs and manuals.
+
+USER_HTML_DIRS = \
+$(USER_CORE_HTML_DIR) \
+$(USER_C_INTERFACE_HTML_DIR) \
+$(USER_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_OCAML_INTERFACE_HTML_DIR) \
+$(USER_JAVA_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+DEVREF_HTML_DIRS = \
+$(DEVREF_CORE_HTML_DIR) \
+$(DEVREF_C_INTERFACE_HTML_DIR) \
+$(DEVREF_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_JAVA_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+HTML_DIRS = $(USER_HTML_DIRS) $(DEVREF_HTML_DIRS)
+
+##### Distributed documentation #####
+
+DIST_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+NONDIST_MANUALS = \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+dist_man_MANS = \
+libppl.3 \
+libppl_c.3 \
+ppl-config.1
+
+##### Build Targets #####
+
+# Do nothing by default.
+all:
+
+user-html: \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+user-pdf: \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+user-ps: \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+user: user-html user-pdf user-ps
+
+devref-html: \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-pdf: \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-ps: \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL)
+
+devref: devref-html devref-pdf devref-ps
+
+user-configured-html: \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+user-configured-pdf: \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+user-configured-ps: \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+user-configured: \
+user-configured-html \
+user-configured-pdf \
+user-configured-ps
+
+devref-configured-html: \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-configured-pdf: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-configured-ps: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+devref-configured: \
+devref-configured-html \
+devref-configured-pdf \
+devref-configured-ps
+
+user-all: user user-configured
+devref-all: devref devref-configured
+
+world: user-all devref-all
+
+# Installation: all the distributed *core* docs, as well as
+# the distributed docs for all the *enabled* language interfaces.
+
+if BUILD_C_INTERFACE
+
+INSTALL_C_INTERFACE_HTML_DOCS = $(USER_C_INTERFACE_HTML_MANUAL)
+INSTALL_C_INTERFACE_PDF_DOCS = $(USER_C_INTERFACE_PDF_MANUAL)
+INSTALL_C_INTERFACE_PS_DOCS = $(USER_C_INTERFACE_PS_MANUAL)
+
+endif BUILD_C_INTERFACE
+
+if BUILD_JAVA_INTERFACE
+
+INSTALL_JAVA_INTERFACE_HTML_DOCS = $(USER_JAVA_INTERFACE_HTML_MANUAL)
+INSTALL_JAVA_INTERFACE_PDF_DOCS = $(USER_JAVA_INTERFACE_PDF_MANUAL)
+INSTALL_JAVA_INTERFACE_PS_DOCS = $(USER_JAVA_INTERFACE_PS_MANUAL)
+
+endif BUILD_JAVA_INTERFACE
+
+if BUILD_OCAML_INTERFACE
+
+INSTALL_OCAML_INTERFACE_HTML_DOCS = $(USER_OCAML_INTERFACE_HTML_MANUAL)
+INSTALL_OCAML_INTERFACE_PDF_DOCS = $(USER_OCAML_INTERFACE_PDF_MANUAL)
+INSTALL_OCAML_INTERFACE_PS_DOCS = $(USER_OCAML_INTERFACE_PS_MANUAL)
+
+endif BUILD_OCAML_INTERFACE
+
+if BUILD_SOME_PROLOG_INTERFACES
+
+INSTALL_PROLOG_INTERFACE_HTML_DOCS = $(USER_PROLOG_INTERFACE_HTML_MANUAL)
+INSTALL_PROLOG_INTERFACE_PDF_DOCS = $(USER_PROLOG_INTERFACE_PDF_MANUAL)
+INSTALL_PROLOG_INTERFACE_PS_DOCS = $(USER_PROLOG_INTERFACE_PS_MANUAL)
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+
+INSTALL_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(INSTALL_C_INTERFACE_HTML_DOCS) \
+$(INSTALL_JAVA_INTERFACE_HTML_DOCS) \
+$(INSTALL_OCAML_INTERFACE_HTML_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_HTML_DOCS)
+
+INSTALL_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(INSTALL_C_INTERFACE_PDF_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PDF_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PDF_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PDF_DOCS)
+
+INSTALL_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(INSTALL_C_INTERFACE_PS_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PS_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PS_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PS_DOCS)
+
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+
+if BUILD_DOCUMENTATION
+
+CONTINUE_IF_NO_DOC = true
+
+else !BUILD_DOCUMENTATION
+
+CONTINUE_IF_NO_DOC = continue
+
+endif !BUILD_DOCUMENTATION
+
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+	for ball in $(INSTALL_HTML_DOCS); do \
+	  test -f $$ball || test -f $(srcdir)/$$ball \
+	    || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$ball; \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	  gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+	  if test -d $$dir/ocamldoc; then \
+	    $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir/ocamldoc; \
+	    for file in $$dir/ocamldoc/*; do \
+	      $(INSTALL_DATA) $$file \
+	        $(DESTDIR)$(htmldir)/$$dir/ocamldoc/`basename $$file`; \
+	    done; \
+	  fi; \
+	  for file in $$dir/*; do \
+	    $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+	  done; \
+	done
+
+installdirs-html:
+	for ball in $(INSTALL_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+uninstall-html:
+	for ball in $(INSTALL_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+	for file in $(INSTALL_PDF_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file \
+	    || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+installdirs-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+	for file in $(INSTALL_PDF_DOCS); do \
+	  rm -f $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+# Installation and uninstallation of PostScript documentation.
+# The PostScript documentation is obtained from the PDF one;
+# the dependency is needed so as to make sure the PDF documentation
+# is fully built before the conversion is performed.
+install-ps: install-pdf
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+	for file in $(INSTALL_PS_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file \
+	    || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+	done
+
+installdirs-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+	for file in $(INSTALL_PS_DOCS); do \
+	  rm -f $(DESTDIR)$(psdir)/$$file; \
+	done
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+	done
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+installdirs-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+	  rm -f $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir \
+user-ocaml-interface.latex-dir \
+devref-ocaml-interface.latex-dir \
+user-java-interface.latex-dir \
+devref-java-interface.latex-dir \
+user-configured-c-interface.latex-dir \
+devref-configured-c-interface.latex-dir \
+user-configured-prolog-interface.latex-dir \
+devref-configured-prolog-interface.latex-dir \
+user-configured-ocaml-interface.latex-dir \
+devref-configured-ocaml-interface.latex-dir \
+user-configured-java-interface.latex-dir \
+devref-configured-java-interface.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) user.doxyconf-latex
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) devref.doxyconf-latex
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+	$(TEX_ENV) make -C user.latex-dir refman.pdf \
+	    && mv -f user.latex-dir/refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+	$(TEX_ENV) make -C devref.latex-dir refman.pdf \
+	    && mv -f devref.latex-dir/refman.pdf $@
+
+$(USER_CORE_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) user.doxyconf-html
+
+$(DEVREF_CORE_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) devref.doxyconf-html
+
+############################################################################
+
+##### Configuration Independent Language Interface Targets #####
+
+SED_HTML_OPTION = -f $(srcdir)/interfaces-html.sed
+SED_LATEX_OPTION = -f $(srcdir)/interfaces-latex.sed
+
+SED_USER_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html|'
+
+SED_DEVREF_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html|'
+
+SED_USER_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+SED_DEVREF_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+# C Language Interface Targets
+
+SED_C_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/C/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/c-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_C_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox
+
+SED_C_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+
+user-c-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-c-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-latex
+
+devref-c-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-c-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-latex
+
+ppl-user-c-interface- at VERSION@.pdf: user-c-interface.latex-dir
+	$(TEX_ENV) make -C user-c-interface.latex-dir refman.pdf \
+	    && mv -f user-c-interface.latex-dir/refman.pdf $@
+
+ppl-devref-c-interface- at VERSION@.pdf: devref-c-interface.latex-dir
+	$(TEX_ENV) make -C devref-c-interface.latex-dir refman.pdf \
+	    && mv -f devref-c-interface.latex-dir/refman.pdf $@
+
+ppl-user-c-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-c-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-html
+
+ppl-devref-c-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-c-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-html
+
+# (System Independent) Prolog Language Interface Targets
+
+SED_PROLOG_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Prolog/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/prolog-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_PROLOG_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+SED_PROLOG_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+
+user-prolog-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-prolog-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-latex
+
+devref-prolog-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-prolog-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-latex
+
+ppl-user-prolog-interface- at VERSION@.pdf: user-prolog-interface.latex-dir
+	$(TEX_ENV) make -C user-prolog-interface.latex-dir refman.pdf \
+	    && mv -f user-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-devref-prolog-interface- at VERSION@.pdf: devref-prolog-interface.latex-dir
+	$(TEX_ENV) make -C devref-prolog-interface.latex-dir refman.pdf \
+	    && mv -f devref-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-user-prolog-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-prolog-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-html
+
+ppl-devref-prolog-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf > \
+	    Doxyfile.devref-prolog-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-html
+
+# OCaml Language Interface Targets
+
+SED_OCAML_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/OCaml/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/ocaml-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+SED_OCAML_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+SED_OCAML_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+OCAMLDOC_HTML_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml -html
+
+OCAMLDOC_LATEX_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml \
+-latex -noheader -notrailer -notoc
+
+user-ocaml-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf > \
+	    Doxyfile.user-ocaml-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-latex
+	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+devref-ocaml-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-ocaml-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-latex
+	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-user-ocaml-interface- at VERSION@.pdf: user-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C user-ocaml-interface.latex-dir refman.pdf \
+	    && mv -f user-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-devref-ocaml-interface- at VERSION@.pdf: devref-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C devref-ocaml-interface.latex-dir refman.pdf \
+	    && mv -f devref-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-user-ocaml-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-ocaml-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-html
+	mkdir $@/ocamldoc
+	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-devref-ocaml-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-ocaml-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-html
+	mkdir $@/ocamldoc
+	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+# Java Language Interface Targets
+
+SED_JAVA_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Java/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/java-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_JAVA_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library
+
+SED_JAVA_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common.cc \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_defs.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_inlines.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_globals.cc
+
+user-java-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-java-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-latex
+
+devref-java-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-java-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-latex
+
+ppl-user-java-interface- at VERSION@.pdf: user-java-interface.latex-dir
+	$(TEX_ENV) make -C user-java-interface.latex-dir refman.pdf \
+	    && mv -f user-java-interface.latex-dir/refman.pdf $@
+
+ppl-devref-java-interface- at VERSION@.pdf: devref-java-interface.latex-dir
+	$(TEX_ENV) make -C devref-java-interface.latex-dir refman.pdf \
+	    && mv -f devref-java-interface.latex-dir/refman.pdf $@
+
+ppl-user-java-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-java-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-html
+
+ppl-devref-java-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-java-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-html
+
+############################################################################
+
+##### Configuration Dependent Language Interface Targets #####
+
+# Configuration-Dependent C Language Interface Targets
+if BUILD_C_INTERFACE
+
+SED_CONFIGURED_C_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured C/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/configured-c-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_CONFIGURED_C_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/C/C_interface.dox \
+../interfaces/C/ppl_c.h
+
+SED_CONFIGURED_C_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/C/C_interface.dox \
+../interfaces/C/ppl_c.h \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+# FIXME add generated files
+
+user-configured-c-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_C_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-c-interface.tex
+	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-c-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-latex
+
+devref-configured-c-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_C_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-c-interface.tex
+	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-c-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-latex
+
+ppl-user-configured-c-interface- at VERSION@.pdf: \
+user-configured-c-interface.latex-dir
+	$(TEX_ENV) make -C user-configured-c-interface.latex-dir refman.pdf \
+	  && mv -f user-configured-c-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-c-interface- at VERSION@.pdf: \
+devref-configured-c-interface.latex-dir
+	$(TEX_ENV) make -C devref-configured-c-interface.latex-dir refman.pdf \
+	    && mv -f devref-configured-c-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-c-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_C_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-c-interface.tex
+	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-c-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-html
+
+ppl-devref-configured-c-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_C_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-c-interface.tex
+	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-c-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-html
+
+endif BUILD_C_INTERFACE
+
+# Configuration-Dependent Prolog Language Interface Targets
+if BUILD_SOME_PROLOG_INTERFACES
+
+SED_CONFIGURED_PROLOG_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Prolog/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/configured-prolog-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_CONFIGURED_PROLOG_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+../interfaces/Prolog/Prolog_configured_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+SED_CONFIGURED_PROLOG_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+../interfaces/Prolog/Prolog_configured_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+# FIXME: add appropriate generated files.
+
+user-configured-prolog-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-prolog-interface.tex
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-prolog-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-latex
+
+devref-configured-prolog-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-prolog-interface.tex
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-prolog-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-latex
+
+ppl-user-configured-prolog-interface- at VERSION@.pdf: \
+user-configured-prolog-interface.latex-dir
+	$(TEX_ENV) make -C user-configured-prolog-interface.latex-dir \
+	    refman.pdf \
+	    && mv -f user-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-prolog-interface- at VERSION@.pdf: \
+devref-configured-prolog-interface.latex-dir
+	$(TEX_ENV) make -C devref-configured-prolog-interface.latex-dir \
+	    refman.pdf \
+	    && mv -f devref-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-prolog-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-prolog-interface.tex
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-prolog-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-html
+
+ppl-devref-configured-prolog-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-prolog-interface.tex
+	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-prolog-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-html
+
+endif BUILD_SOME_PROLOG_INTERFACES
+
+# Configuration-Dependent OCaml Language Interface Targets
+if BUILD_OCAML_INTERFACE
+
+SED_CONFIGURED_OCAML_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured OCaml/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/configured-ocaml-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+SED_CONFIGURED_OCAML_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+SED_CONFIGURED_OCAML_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+user-configured-ocaml-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-ocaml-interface.tex
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-ocaml-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-latex
+	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+		../interfaces/OCaml/ppl_ocaml.mli
+
+devref-configured-ocaml-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-ocaml-interface.tex
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-ocaml-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-latex
+	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+		../interfaces/OCaml/ppl_ocaml.mli
+
+ppl-user-configured-ocaml-interface- at VERSION@.pdf: \
+user-configured-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C user-configured-ocaml-interface.latex-dir \
+	    refman.pdf \
+	    && mv -f user-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-ocaml-interface- at VERSION@.pdf: \
+devref-configured-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C devref-configured-ocaml-interface.latex-dir \
+	    refman.pdf \
+	    && mv -f devref-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-ocaml-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-ocaml-interface.tex
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-ocaml-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-html
+	mkdir $@/ocamldoc
+	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+		../interfaces/OCaml/ppl_ocaml.mli
+
+ppl-devref-configured-ocaml-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-ocaml-interface.tex
+	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-ocaml-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-html
+	mkdir $@/ocamldoc
+	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+		../interfaces/OCaml/ppl_ocaml.mli
+
+endif BUILD_OCAML_INTERFACE
+
+# Configuration-Dependent Java Language Interface Targets
+if BUILD_JAVA_INTERFACE
+
+SED_CONFIGURED_JAVA_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Java/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/configured-java-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_CONFIGURED_JAVA_INPUT_USER = \
+$(SED_JAVA_INPUT_USER) \
+../interfaces/Java/parma_polyhedra_library
+
+SED_CONFIGURED_JAVA_INPUT_DEVREF = \
+$(SED_JAVA_INPUT_DEVREF) \
+../interfaces/Java/parma_polyhedra_library
+# FIXME add generated files
+
+# NOTE: as an exception to the common policy,
+# for the user-configured-java case we override the setting
+# for Doxygen configuration variables HIDE_UNDOC_MEMBERS (set to NO)
+# and EXCLUDE (set to Fake_Class_for_Doxygen.java)
+
+user-configured-java-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-java-interface.tex
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-java-interface-latex
+	echo "HIDE_UNDOC_MEMBERS = NO" \
+	    >> Doxyfile.user-configured-java-interface-latex
+	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+	    >> Doxyfile.user-configured-java-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-latex
+
+devref-configured-java-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-java-interface.tex
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-java-interface-latex
+	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+	    >> Doxyfile.devref-configured-java-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-latex
+
+ppl-user-configured-java-interface- at VERSION@.pdf: \
+user-configured-java-interface.latex-dir
+	$(TEX_ENV) make -C user-configured-java-interface.latex-dir \
+	    refman.pdf \
+	    && mv -f user-configured-java-interface.latex-dir/refman.pdf $@
+
+ppl-devref-configured-java-interface- at VERSION@.pdf: \
+devref-configured-java-interface.latex-dir
+	$(TEX_ENV) make -C devref-configured-java-interface.latex-dir \
+	    refman.pdf \
+	    && mv -f devref-configured-java-interface.latex-dir/refman.pdf $@
+
+ppl-user-configured-java-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_CONFIGURED_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-configured-java-interface.tex
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-configured-java-interface-html
+	echo "HIDE_UNDOC_MEMBERS = NO" \
+	    >> Doxyfile.user-configured-java-interface-html
+	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+	    >> Doxyfile.user-configured-java-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-html
+
+ppl-devref-configured-java-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-configured-java-interface.tex
+	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-configured-java-interface-html
+	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+	    >> Doxyfile.devref-configured-java-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-html
+
+endif BUILD_JAVA_INTERFACE
+
+############################################################################
+
+# Ad-hoc rules for distributed HTML manuals.
+# These follow the guidelines of Section 27.5 of the Automake manual
+# (distributed files should never depend upon non-distributed built files).
+
+$(USER_CORE_HTML_MANUAL): user.doxyconf-html $(USER_CORE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_CORE_HTML_DIR)
+	tar c $(USER_CORE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_C_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_C_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_C_INTERFACE_HTML_DIR)
+	tar c $(USER_C_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_PROLOG_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_PROLOG_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_PROLOG_INTERFACE_HTML_DIR)
+	tar c $(USER_PROLOG_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_OCAML_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_OCAML_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_OCAML_INTERFACE_HTML_DIR)
+	tar c $(USER_OCAML_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_JAVA_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_JAVA_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_JAVA_INTERFACE_HTML_DIR)
+	tar c $(USER_JAVA_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+############################################################################
+
+%.tar: %
+	tar cf $@ $<
+
+%.gz: %
+	gzip --best --force $<
+
+%.pdf: %.tex
+	$(TEX_ENV) pdflatex $<
+
+%.ps:	%.pdf
+	pdftops $< $@
+
+EXTRA_DIST= \
+$(BIBLIOGRAPHIES) \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+README.doc \
+bugseng_logo.pdf \
+devref-language-interface.tex \
+devref.tex \
+fdl.tex \
+gpl.tex \
+interfaces-html.sed \
+interfaces-latex.sed \
+ppl.sty \
+ppl_logo.pdf \
+ppl_logo_no_ppl.pdf \
+user-language-interface.tex \
+user.tex
+
+GENERATED_LATEX_HEADER_FILES = \
+devref-configured-c-interface.tex \
+devref-configured-java-interface.tex \
+devref-configured-ocaml-interface.tex \
+devref-configured-prolog-interface.tex \
+devref-c-interface.tex \
+devref-java-interface.tex \
+devref-ocaml-interface.tex \
+devref-prolog-interface.tex \
+user-configured-c-interface.tex \
+user-configured-java-interface.tex \
+user-configured-ocaml-interface.tex \
+user-configured-prolog-interface.tex \
+user-c-interface.tex \
+user-java-interface.tex \
+user-ocaml-interface.tex \
+user-prolog-interface.tex
+
+mostlyclean-local:
+	rm -rf $(HTML_DIRS) $(LATEX_DIRS) $(NONDIST_MANUALS) *.aux *.log
+	rm -rf $(GENERATED_LATEX_HEADER_FILES) Doxyfile.*
+
+CLEANFILES = \
+$(USER_CORE_HTML_DIR).tag \
+$(DEVREF_CORE_HTML_DIR).tag
+
+../src/ppl_include_files.hh:
+	$(MAKE) $(AM_MAKEFLAGS) -C ../src ppl_include_files.hh
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..ac9d8d0
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,2354 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(srcdir)/user.doxyconf-latex.in \
+	$(srcdir)/devref.doxyconf-latex.in \
+	$(srcdir)/user.doxyconf-html.in \
+	$(srcdir)/devref.doxyconf-html.in \
+	$(srcdir)/user-language-interface.doxyconf.in \
+	$(srcdir)/devref-language-interface.doxyconf.in \
+	$(dist_man_MANS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = user.doxyconf-latex devref.doxyconf-latex \
+	user.doxyconf-html devref.doxyconf-html \
+	user-language-interface.doxyconf \
+	devref-language-interface.doxyconf
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(dist_man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+
+# All the documentation in docdir.
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = $(docdir)
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = $(docdir)
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = $(docdir)
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+txtdir = $(docdir)
+DOXYGEN = doxygen
+PDF_LICENSES = \
+gpl.pdf \
+fdl.pdf
+
+PS_LICENSES = \
+gpl.ps.gz \
+fdl.ps.gz
+
+TXT_LICENSES = \
+gpl.txt \
+fdl.txt
+
+LICENSES = \
+$(PDF_LICENSES) \
+$(TXT_LICENSES) \
+$(PS_LICENSES)
+
+BIBLIOGRAPHIES = \
+ppl.bib \
+ppl_citations.bib
+
+
+##### Library Core Manuals (C++ Interface) #####
+USER_CORE_HTML_MANUAL = ppl-user- at VERSION@-html.tar.gz
+DEVREF_CORE_HTML_MANUAL = ppl-devref- at VERSION@-html.tar.gz
+USER_CORE_PDF_MANUAL = ppl-user- at VERSION@.pdf
+DEVREF_CORE_PDF_MANUAL = ppl-devref- at VERSION@.pdf
+USER_CORE_PS_MANUAL = ppl-user- at VERSION@.ps.gz
+DEVREF_CORE_PS_MANUAL = ppl-devref- at VERSION@.ps.gz
+USER_CORE_HTML_DIR = ppl-user- at VERSION@-html
+DEVREF_CORE_HTML_DIR = ppl-devref- at VERSION@-html
+
+# NOTE: this variable is used to record Makefile dependencies.
+# The file path is that of the source directory.
+DOX_LICENSE_FILES = \
+gpl.dox \
+fdl.dox
+
+
+# NOTE: this variable is used to populate Doxygen configuration tag INPUT.
+# The file path is that of the build directory, hence we cannot use
+# variable DOX_LICENSE_FILES defined above.
+DOX_LICENSE_INPUT = \
+$(srcdir)/gpl.dox \
+$(srcdir)/fdl.dox
+
+DOX_FILES = \
+$(DOX_LICENSE_FILES) \
+definitions.dox
+
+USER_CORE_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+../src/ppl_header.hh ../src/ppl_include_files.hh
+
+DEVREF_CORE_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+
+# C Language Interface Manuals
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@COMMON_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_C_INTERFACE_TRUE@ppl.sty \
+ at BUILD_C_INTERFACE_TRUE@../configure.ac \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_version.h.in \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_header.h \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/C_interface.dox
+
+ at BUILD_C_INTERFACE_TRUE@USER_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@user-language-interface.tex
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@devref-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_defs.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_inlines.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.cc
+
+
+# Configuration Dependent C Language Interface Manuals.
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@-html.tar.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@.pdf
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@.ps.gz
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR = \
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@-html
+
+ at BUILD_C_INTERFACE_TRUE@USER_CONFIGURED_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h
+
+ at BUILD_C_INTERFACE_TRUE@DEVREF_CONFIGURED_C_INTERFACE_STUFF = \
+ at BUILD_C_INTERFACE_TRUE@$(COMMON_C_INTERFACE_STUFF) \
+ at BUILD_C_INTERFACE_TRUE@$(top_builddir)/interfaces/C/ppl_c.h \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_defs.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common_inlines.hh \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c_implementation_common.cc
+
+
+# Prolog Language Interface Manuals
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_sysindep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_compilation.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# Configuration Dependent Prolog Language Interface Manuals
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@-html.tar.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@.pdf
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@.ps.gz
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@USER_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES)
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl.sty \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(PROLOG_INTERFACE_ADDITIONAL_DOX_PAGES) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/ppl_prolog_common.cc \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(top_builddir)/interfaces/Prolog/ppl_prolog_domains.cc.stamp
+
+
+# OCaml Language Interface Manuals
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_OCAML_INTERFACE_TRUE@user-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl.sty \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl.sty \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_common_inlines.hh \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_common.cc \
+ at BUILD_OCAML_INTERFACE_TRUE@../interfaces/OCaml/ppl_ocaml_globals.mli
+
+
+# Configuration Dependent OCaml Language Interface Manuals.
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@-html.tar.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@.pdf
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@.ps.gz
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR = \
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@USER_CONFIGURED_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_OCAML_INTERFACE_STUFF) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_OCAML_INTERFACE_STUFF) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(top_builddir)/interfaces/OCaml/ppl_ocaml.mli
+
+
+# Java Language Interface Manuals
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@JAVA_INTERFACE_JAVA_FILES = \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/By_Reference.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Coefficient.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Complexity_Class.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Congruence.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Congruence_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Constraint.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Constraint_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Degenerate_Element.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Generator.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Generator_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Generator_Type.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Grid_Generator.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/MIP_Problem.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Optimization_Mode.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Pair.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Partial_Function.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/PPL_Object.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Relation_Symbol.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Variable.java \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library/Variables_Set.java
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@user-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl.sty \
+ at BUILD_JAVA_INTERFACE_TRUE@$(JAVA_INTERFACE_JAVA_FILES)
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DOX_LICENSE_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl.sty \
+ at BUILD_JAVA_INTERFACE_TRUE@$(JAVA_INTERFACE_JAVA_FILES) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common.cc \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common_defs.hh \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_common_inlines.hh \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/jni/ppl_java_globals.cc
+
+
+# Configuration Dependent Java Language Interface Manuals.
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@-html.tar.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@.pdf
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@.ps.gz
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR = \
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@USER_CONFIGURED_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_JAVA_INTERFACE_STUFF)
+
+ at BUILD_JAVA_INTERFACE_TRUE@DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_JAVA_INTERFACE_STUFF)
+
+
+###################################################################
+
+# Grouping of dirs and manuals.
+USER_HTML_DIRS = \
+$(USER_CORE_HTML_DIR) \
+$(USER_C_INTERFACE_HTML_DIR) \
+$(USER_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_OCAML_INTERFACE_HTML_DIR) \
+$(USER_JAVA_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+DEVREF_HTML_DIRS = \
+$(DEVREF_CORE_HTML_DIR) \
+$(DEVREF_C_INTERFACE_HTML_DIR) \
+$(DEVREF_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_JAVA_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_DIR) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_DIR)
+
+HTML_DIRS = $(USER_HTML_DIRS) $(DEVREF_HTML_DIRS)
+
+##### Distributed documentation #####
+DIST_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+NONDIST_MANUALS = \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+dist_man_MANS = \
+libppl.3 \
+libppl_c.3 \
+ppl-config.1
+
+
+# Installation: all the distributed *core* docs, as well as
+# the distributed docs for all the *enabled* language interfaces.
+ at BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_HTML_DOCS = $(USER_C_INTERFACE_HTML_MANUAL)
+ at BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_PDF_DOCS = $(USER_C_INTERFACE_PDF_MANUAL)
+ at BUILD_C_INTERFACE_TRUE@INSTALL_C_INTERFACE_PS_DOCS = $(USER_C_INTERFACE_PS_MANUAL)
+ at BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_HTML_DOCS = $(USER_JAVA_INTERFACE_HTML_MANUAL)
+ at BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_PDF_DOCS = $(USER_JAVA_INTERFACE_PDF_MANUAL)
+ at BUILD_JAVA_INTERFACE_TRUE@INSTALL_JAVA_INTERFACE_PS_DOCS = $(USER_JAVA_INTERFACE_PS_MANUAL)
+ at BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_HTML_DOCS = $(USER_OCAML_INTERFACE_HTML_MANUAL)
+ at BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_PDF_DOCS = $(USER_OCAML_INTERFACE_PDF_MANUAL)
+ at BUILD_OCAML_INTERFACE_TRUE@INSTALL_OCAML_INTERFACE_PS_DOCS = $(USER_OCAML_INTERFACE_PS_MANUAL)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_HTML_DOCS = $(USER_PROLOG_INTERFACE_HTML_MANUAL)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_PDF_DOCS = $(USER_PROLOG_INTERFACE_PDF_MANUAL)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@INSTALL_PROLOG_INTERFACE_PS_DOCS = $(USER_PROLOG_INTERFACE_PS_MANUAL)
+INSTALL_HTML_DOCS = \
+$(USER_CORE_HTML_MANUAL) \
+$(INSTALL_C_INTERFACE_HTML_DOCS) \
+$(INSTALL_JAVA_INTERFACE_HTML_DOCS) \
+$(INSTALL_OCAML_INTERFACE_HTML_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_HTML_DOCS)
+
+INSTALL_PDF_DOCS = \
+$(PDF_LICENSES) \
+$(USER_CORE_PDF_MANUAL) \
+$(INSTALL_C_INTERFACE_PDF_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PDF_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PDF_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PDF_DOCS)
+
+INSTALL_PS_DOCS = \
+$(PS_LICENSES) \
+$(USER_CORE_PS_MANUAL) \
+$(INSTALL_C_INTERFACE_PS_DOCS) \
+$(INSTALL_JAVA_INTERFACE_PS_DOCS) \
+$(INSTALL_OCAML_INTERFACE_PS_DOCS) \
+$(INSTALL_PROLOG_INTERFACE_PS_DOCS)
+
+ at BUILD_DOCUMENTATION_FALSE@CONTINUE_IF_NO_DOC = continue
+ at BUILD_DOCUMENTATION_TRUE@CONTINUE_IF_NO_DOC = true
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir \
+user-c-interface.latex-dir \
+devref-c-interface.latex-dir \
+user-prolog-interface.latex-dir \
+devref-prolog-interface.latex-dir \
+user-ocaml-interface.latex-dir \
+devref-ocaml-interface.latex-dir \
+user-java-interface.latex-dir \
+devref-java-interface.latex-dir \
+user-configured-c-interface.latex-dir \
+devref-configured-c-interface.latex-dir \
+user-configured-prolog-interface.latex-dir \
+devref-configured-prolog-interface.latex-dir \
+user-configured-ocaml-interface.latex-dir \
+devref-configured-ocaml-interface.latex-dir \
+user-configured-java-interface.latex-dir \
+devref-configured-java-interface.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+############################################################################
+
+##### Configuration Independent Language Interface Targets #####
+SED_HTML_OPTION = -f $(srcdir)/interfaces-html.sed
+SED_LATEX_OPTION = -f $(srcdir)/interfaces-latex.sed
+SED_USER_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-user- at VERSION@-html.tag=../ppl-user- at VERSION@-html|'
+
+SED_DEVREF_HTML_OPTION = $(SED_HTML_OPTION) \
+-e 's|<PPL_SED_TAGFILES>|ppl-devref- at VERSION@-html.tag=../ppl-devref- at VERSION@-html|'
+
+SED_USER_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+SED_DEVREF_LATEX_OPTION = \
+$(SED_LATEX_OPTION) \
+-e 's/<PPL_SED_TAGFILES>//'
+
+
+# C Language Interface Targets
+SED_C_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/C/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/c-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_C_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox
+
+SED_C_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+../interfaces/C/ppl_c_version.h \
+$(srcdir)/../interfaces/C/ppl_c_header.h \
+$(srcdir)/../interfaces/C/C_interface.dox \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+
+
+# (System Independent) Prolog Language Interface Targets
+SED_PROLOG_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Prolog/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/prolog-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_PROLOG_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+SED_PROLOG_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Prolog/Prolog_interface.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep_domains.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# OCaml Language Interface Targets
+SED_OCAML_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/OCaml/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/ocaml-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+SED_OCAML_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+SED_OCAML_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+OCAMLDOC_HTML_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml -html
+
+OCAMLDOC_LATEX_OPTIONS = \
+-I @mlgmp_dir@ -I $(top_builddir)/interfaces/OCaml \
+-latex -noheader -notrailer -notoc
+
+
+# Java Language Interface Targets
+SED_JAVA_OPTION = \
+  -e 's/<PPL_SED_CONFIGURED_MANUAL>//' \
+  -e 's/<PPL_SED_LANGUAGE_NAME>/Java/' \
+  -e 's/<PPL_SED_INTERFACE_NAME>/java-interface/' \
+  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+SED_JAVA_INPUT_USER = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library
+
+SED_JAVA_INPUT_DEVREF = \
+$(DOX_LICENSE_INPUT) \
+$(srcdir)/../interfaces/Java/parma_polyhedra_library \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common.cc \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_defs.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_common_inlines.hh \
+$(srcdir)/../interfaces/Java/jni/ppl_java_globals.cc
+
+
+############################################################################
+
+##### Configuration Dependent Language Interface Targets #####
+
+# Configuration-Dependent C Language Interface Targets
+ at BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_OPTION = \
+ at BUILD_C_INTERFACE_TRUE@  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_C_INTERFACE_TRUE@  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured C/' \
+ at BUILD_C_INTERFACE_TRUE@  -e 's/<PPL_SED_INTERFACE_NAME>/configured-c-interface/' \
+ at BUILD_C_INTERFACE_TRUE@  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+ at BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_INPUT_USER = \
+ at BUILD_C_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/C_interface.dox \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c.h
+
+ at BUILD_C_INTERFACE_TRUE@SED_CONFIGURED_C_INPUT_DEVREF = \
+ at BUILD_C_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/C_interface.dox \
+ at BUILD_C_INTERFACE_TRUE@../interfaces/C/ppl_c.h \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common.cc \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common_defs.hh \
+ at BUILD_C_INTERFACE_TRUE@$(srcdir)/../interfaces/C/ppl_c_implementation_common_inlines.hh
+
+
+# Configuration-Dependent Prolog Language Interface Targets
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_OPTION = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Prolog/' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@  -e 's/<PPL_SED_INTERFACE_NAME>/configured-prolog-interface/' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_INPUT_USER = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_domains.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@SED_CONFIGURED_PROLOG_INPUT_DEVREF = \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_configured_interface.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysindep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@../interfaces/Prolog/Prolog_configured_domains.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_compilation.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/Prolog_interface_sysdep.dox \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common_defs.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common_inlines.hh \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(srcdir)/../interfaces/Prolog/ppl_prolog_common.cc
+
+
+# Configuration-Dependent OCaml Language Interface Targets
+ at BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_OPTION = \
+ at BUILD_OCAML_INTERFACE_TRUE@  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_OCAML_INTERFACE_TRUE@  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured OCaml/' \
+ at BUILD_OCAML_INTERFACE_TRUE@  -e 's/<PPL_SED_INTERFACE_NAME>/configured-ocaml-interface/' \
+ at BUILD_OCAML_INTERFACE_TRUE@  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>/\\usepackage{ocamldoc}/'
+
+ at BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_INPUT_USER = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/OCaml_interface.dox
+
+ at BUILD_OCAML_INTERFACE_TRUE@SED_CONFIGURED_OCAML_INPUT_DEVREF = \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DOX_LICENSE_INPUT) \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/OCaml_interface.dox \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common.cc \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_defs.hh \
+ at BUILD_OCAML_INTERFACE_TRUE@$(srcdir)/../interfaces/OCaml/ppl_ocaml_common_inlines.hh
+
+
+# Configuration-Dependent Java Language Interface Targets
+ at BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_OPTION = \
+ at BUILD_JAVA_INTERFACE_TRUE@  -e 's/<PPL_SED_CONFIGURED_MANUAL>/PPL_DOXYGEN_CONFIGURED_MANUAL/' \
+ at BUILD_JAVA_INTERFACE_TRUE@  -e 's/<PPL_SED_LANGUAGE_NAME>/Configured Java/' \
+ at BUILD_JAVA_INTERFACE_TRUE@  -e 's/<PPL_SED_INTERFACE_NAME>/configured-java-interface/' \
+ at BUILD_JAVA_INTERFACE_TRUE@  -e 's/<PPL_SED_USEPACKAGE_OCAMLDOC>//'
+
+ at BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_INPUT_USER = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(SED_JAVA_INPUT_USER) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library
+
+ at BUILD_JAVA_INTERFACE_TRUE@SED_CONFIGURED_JAVA_INPUT_DEVREF = \
+ at BUILD_JAVA_INTERFACE_TRUE@$(SED_JAVA_INPUT_DEVREF) \
+ at BUILD_JAVA_INTERFACE_TRUE@../interfaces/Java/parma_polyhedra_library
+
+EXTRA_DIST = \
+$(BIBLIOGRAPHIES) \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+README.doc \
+bugseng_logo.pdf \
+devref-language-interface.tex \
+devref.tex \
+fdl.tex \
+gpl.tex \
+interfaces-html.sed \
+interfaces-latex.sed \
+ppl.sty \
+ppl_logo.pdf \
+ppl_logo_no_ppl.pdf \
+user-language-interface.tex \
+user.tex
+
+GENERATED_LATEX_HEADER_FILES = \
+devref-configured-c-interface.tex \
+devref-configured-java-interface.tex \
+devref-configured-ocaml-interface.tex \
+devref-configured-prolog-interface.tex \
+devref-c-interface.tex \
+devref-java-interface.tex \
+devref-ocaml-interface.tex \
+devref-prolog-interface.tex \
+user-configured-c-interface.tex \
+user-configured-java-interface.tex \
+user-configured-ocaml-interface.tex \
+user-configured-prolog-interface.tex \
+user-c-interface.tex \
+user-java-interface.tex \
+user-ocaml-interface.tex \
+user-prolog-interface.tex
+
+CLEANFILES = \
+$(USER_CORE_HTML_DIR).tag \
+$(DEVREF_CORE_HTML_DIR).tag
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+user.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/user.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-latex: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-latex.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user.doxyconf-html: $(top_builddir)/config.status $(srcdir)/user.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref.doxyconf-html: $(top_builddir)/config.status $(srcdir)/devref.doxyconf-html.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+user-language-interface.doxyconf: $(top_builddir)/config.status $(srcdir)/user-language-interface.doxyconf.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+devref-language-interface.doxyconf: $(top_builddir)/config.status $(srcdir)/devref-language-interface.doxyconf.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-man1: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+install-man3: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man3dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.3[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(MANS)
+installdirs: installdirs-local
+	for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man: install-man1 install-man3
+
+install-pdf-am:
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-man
+
+uninstall-man: uninstall-man1 uninstall-man3
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am \
+	install-data-local install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-man1 install-man3 \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-local maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool \
+	mostlyclean-local pdf pdf-am ps ps-am tags-am uninstall \
+	uninstall-am uninstall-local uninstall-man uninstall-man1 \
+	uninstall-man3
+
+
+##### Build Targets #####
+
+# Do nothing by default.
+all:
+
+user-html: \
+$(USER_CORE_HTML_MANUAL) \
+$(USER_C_INTERFACE_HTML_MANUAL) \
+$(USER_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_JAVA_INTERFACE_HTML_MANUAL)
+
+user-pdf: \
+$(USER_CORE_PDF_MANUAL) \
+$(USER_C_INTERFACE_PDF_MANUAL) \
+$(USER_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_JAVA_INTERFACE_PDF_MANUAL)
+
+user-ps: \
+$(USER_CORE_PS_MANUAL) \
+$(USER_C_INTERFACE_PS_MANUAL) \
+$(USER_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_JAVA_INTERFACE_PS_MANUAL)
+
+user: user-html user-pdf user-ps
+
+devref-html: \
+$(DEVREF_CORE_HTML_MANUAL) \
+$(DEVREF_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-pdf: \
+$(DEVREF_CORE_PDF_MANUAL) \
+$(DEVREF_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-ps: \
+$(DEVREF_CORE_PS_MANUAL) \
+$(DEVREF_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_JAVA_INTERFACE_PS_MANUAL)
+
+devref: devref-html devref-pdf devref-ps
+
+user-configured-html: \
+$(USER_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+user-configured-pdf: \
+$(USER_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+user-configured-ps: \
+$(USER_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(USER_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+user-configured: \
+user-configured-html \
+user-configured-pdf \
+user-configured-ps
+
+devref-configured-html: \
+$(DEVREF_CONFIGURED_C_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_HTML_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_HTML_MANUAL)
+
+devref-configured-pdf: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PDF_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PDF_MANUAL)
+
+devref-configured-ps: \
+$(DEVREF_CONFIGURED_C_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_PROLOG_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_OCAML_INTERFACE_PS_MANUAL) \
+$(DEVREF_CONFIGURED_JAVA_INTERFACE_PS_MANUAL)
+
+devref-configured: \
+devref-configured-html \
+devref-configured-pdf \
+devref-configured-ps
+
+user-all: user user-configured
+devref-all: devref devref-configured
+
+world: user-all devref-all
+
+install-data-local: \
+install-html \
+install-pdf \
+install-ps \
+install-txt
+
+installdirs-local: \
+installdirs-html \
+installdirs-pdf \
+installdirs-ps \
+installdirs-txt
+
+uninstall-local: \
+uninstall-html \
+uninstall-pdf \
+uninstall-ps \
+uninstall-txt
+
+# Installation and uninstallation of HTML documentation.
+install-html:
+	for ball in $(INSTALL_HTML_DOCS); do \
+	  test -f $$ball || test -f $(srcdir)/$$ball \
+	    || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$ball; \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	  gunzip -c `if test -f $$ball; then echo .; else echo $(srcdir); fi`/$$ball | tar xf - ; \
+	  if test -d $$dir/ocamldoc; then \
+	    $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir/ocamldoc; \
+	    for file in $$dir/ocamldoc/*; do \
+	      $(INSTALL_DATA) $$file \
+	        $(DESTDIR)$(htmldir)/$$dir/ocamldoc/`basename $$file`; \
+	    done; \
+	  fi; \
+	  for file in $$dir/*; do \
+	    $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+	  done; \
+	done
+
+installdirs-html:
+	for ball in $(INSTALL_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+uninstall-html:
+	for ball in $(INSTALL_HTML_DOCS); do \
+	  dir=`basename $$ball .tar.gz`; \
+	  rm -rf $(DESTDIR)$(htmldir)/$$dir; \
+	done
+
+# Installation and uninstallation of PDF documentation.
+install-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+	for file in $(INSTALL_PDF_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file \
+	    || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+installdirs-pdf:
+	$(mkinstalldirs) $(DESTDIR)$(pdfdir)
+
+uninstall-pdf:
+	for file in $(INSTALL_PDF_DOCS); do \
+	  rm -f $(DESTDIR)$(pdfdir)/$$file; \
+	done
+
+# Installation and uninstallation of PostScript documentation.
+# The PostScript documentation is obtained from the PDF one;
+# the dependency is needed so as to make sure the PDF documentation
+# is fully built before the conversion is performed.
+install-ps: install-pdf
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+	for file in $(INSTALL_PS_DOCS); do \
+	  test -f $$file || test -f $(srcdir)/$$file \
+	    || $(CONTINUE_IF_NO_DOC) || $(MAKE) $$file; \
+	  $(INSTALL_DATA) `if test -f $$file; then echo .; else echo $(srcdir); fi`/$$file $(DESTDIR)$(psdir)/$$file; \
+	done
+
+installdirs-ps:
+	$(mkinstalldirs) $(DESTDIR)$(psdir)
+
+uninstall-ps:
+	for file in $(INSTALL_PS_DOCS); do \
+	  rm -f $(DESTDIR)$(psdir)/$$file; \
+	done
+
+# Installation and uninstallation of pure text documentation.
+install-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+	for file in $(srcdir)/*.txt $(srcdir)/README.doc; do \
+	  $(INSTALL_DATA) $$file $(DESTDIR)$(txtdir)/`basename $$file`; \
+	done
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+	  $(INSTALL_DATA) $(srcdir)/../$$file $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+installdirs-txt:
+	$(mkinstalldirs) $(DESTDIR)$(txtdir)
+
+uninstall-txt:
+	rm -f $(DESTDIR)$(txtdir)/*.txt $(DESTDIR)$(txtdir)/README.doc
+	for file in BUGS COPYING CREDITS ChangeLog NEWS README README.configure TODO ; do \
+	  rm -f $(DESTDIR)$(txtdir)/$$file; \
+	done
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) user.doxyconf-latex
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) devref.doxyconf-latex
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+	$(TEX_ENV) make -C user.latex-dir refman.pdf \
+	    && mv -f user.latex-dir/refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+	$(TEX_ENV) make -C devref.latex-dir refman.pdf \
+	    && mv -f devref.latex-dir/refman.pdf $@
+
+$(USER_CORE_HTML_DIR): user.doxyconf-html $(USER_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) user.doxyconf-html
+
+$(DEVREF_CORE_HTML_DIR): devref.doxyconf-html $(DEVREF_CORE_STUFF)
+	rm -rf $@
+	$(TEX_ENV) $(DOXYGEN) devref.doxyconf-html
+
+user-c-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-c-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-latex
+
+devref-c-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-c-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-latex
+
+ppl-user-c-interface- at VERSION@.pdf: user-c-interface.latex-dir
+	$(TEX_ENV) make -C user-c-interface.latex-dir refman.pdf \
+	    && mv -f user-c-interface.latex-dir/refman.pdf $@
+
+ppl-devref-c-interface- at VERSION@.pdf: devref-c-interface.latex-dir
+	$(TEX_ENV) make -C devref-c-interface.latex-dir refman.pdf \
+	    && mv -f devref-c-interface.latex-dir/refman.pdf $@
+
+ppl-user-c-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-c-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-c-interface-html
+
+ppl-devref-c-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_C_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-c-interface.tex
+	$(SED) $(SED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_C_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-c-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-c-interface-html
+
+user-prolog-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-prolog-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-latex
+
+devref-prolog-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-prolog-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-latex
+
+ppl-user-prolog-interface- at VERSION@.pdf: user-prolog-interface.latex-dir
+	$(TEX_ENV) make -C user-prolog-interface.latex-dir refman.pdf \
+	    && mv -f user-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-devref-prolog-interface- at VERSION@.pdf: devref-prolog-interface.latex-dir
+	$(TEX_ENV) make -C devref-prolog-interface.latex-dir refman.pdf \
+	    && mv -f devref-prolog-interface.latex-dir/refman.pdf $@
+
+ppl-user-prolog-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-prolog-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-prolog-interface-html
+
+ppl-devref-prolog-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_PROLOG_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-prolog-interface.tex
+	$(SED) $(SED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_PROLOG_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf > \
+	    Doxyfile.devref-prolog-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-prolog-interface-html
+
+user-ocaml-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf > \
+	    Doxyfile.user-ocaml-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-latex
+	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+devref-ocaml-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-ocaml-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-latex
+	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-user-ocaml-interface- at VERSION@.pdf: user-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C user-ocaml-interface.latex-dir refman.pdf \
+	    && mv -f user-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-devref-ocaml-interface- at VERSION@.pdf: devref-ocaml-interface.latex-dir
+	$(TEX_ENV) make -C devref-ocaml-interface.latex-dir refman.pdf \
+	    && mv -f devref-ocaml-interface.latex-dir/refman.pdf $@
+
+ppl-user-ocaml-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-ocaml-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-ocaml-interface-html
+	mkdir $@/ocamldoc
+	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+ppl-devref-ocaml-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_OCAML_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-ocaml-interface.tex
+	$(SED) $(SED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_OCAML_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-ocaml-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-ocaml-interface-html
+	mkdir $@/ocamldoc
+	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+		$(srcdir)/../interfaces/OCaml/ppl_ocaml_globals.mli
+
+user-java-interface.latex-dir: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-java-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-latex
+
+devref-java-interface.latex-dir: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-java-interface-latex
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-latex
+
+ppl-user-java-interface- at VERSION@.pdf: user-java-interface.latex-dir
+	$(TEX_ENV) make -C user-java-interface.latex-dir refman.pdf \
+	    && mv -f user-java-interface.latex-dir/refman.pdf $@
+
+ppl-devref-java-interface- at VERSION@.pdf: devref-java-interface.latex-dir
+	$(TEX_ENV) make -C devref-java-interface.latex-dir refman.pdf \
+	    && mv -f devref-java-interface.latex-dir/refman.pdf $@
+
+ppl-user-java-interface- at VERSION@-html: \
+user-language-interface.doxyconf \
+$(USER_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/user-language-interface.tex \
+	    > user-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_USER)"'|' \
+	    user-language-interface.doxyconf \
+	    > Doxyfile.user-java-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-java-interface-html
+
+ppl-devref-java-interface- at VERSION@-html: \
+devref-language-interface.doxyconf \
+$(DEVREF_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+	rm -rf $@
+	$(SED) $(SED_JAVA_OPTION) \
+	    $(srcdir)/devref-language-interface.tex \
+	    > devref-java-interface.tex
+	$(SED) $(SED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+	    -e 's|<PPL_SED_INPUT>|'"$(SED_JAVA_INPUT_DEVREF)"'|' \
+	    devref-language-interface.doxyconf \
+	    > Doxyfile.devref-java-interface-html
+	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-java-interface-html
+# FIXME add generated files
+
+ at BUILD_C_INTERFACE_TRUE@user-configured-c-interface.latex-dir: \
+ at BUILD_C_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(USER_CONFIGURED_C_INTERFACE_STUFF)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@	    > user-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+ at BUILD_C_INTERFACE_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@	    > Doxyfile.user-configured-c-interface-latex
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-latex
+
+ at BUILD_C_INTERFACE_TRUE@devref-configured-c-interface.latex-dir: \
+ at BUILD_C_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(DEVREF_CONFIGURED_C_INTERFACE_STUFF)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@	    > devref-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+ at BUILD_C_INTERFACE_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@	    > Doxyfile.devref-configured-c-interface-latex
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-latex
+
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@.pdf: \
+ at BUILD_C_INTERFACE_TRUE@user-configured-c-interface.latex-dir
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) make -C user-configured-c-interface.latex-dir refman.pdf \
+ at BUILD_C_INTERFACE_TRUE@	  && mv -f user-configured-c-interface.latex-dir/refman.pdf $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@.pdf: \
+ at BUILD_C_INTERFACE_TRUE@devref-configured-c-interface.latex-dir
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) make -C devref-configured-c-interface.latex-dir refman.pdf \
+ at BUILD_C_INTERFACE_TRUE@	    && mv -f devref-configured-c-interface.latex-dir/refman.pdf $@
+
+ at BUILD_C_INTERFACE_TRUE@ppl-user-configured-c-interface- at VERSION@-html: \
+ at BUILD_C_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(USER_CONFIGURED_C_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@	    > user-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_USER)"'|' \
+ at BUILD_C_INTERFACE_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@	    > Doxyfile.user-configured-c-interface-html
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-c-interface-html
+
+ at BUILD_C_INTERFACE_TRUE@ppl-devref-configured-c-interface- at VERSION@-html: \
+ at BUILD_C_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@$(DEVREF_CONFIGURED_C_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_C_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_C_INTERFACE_TRUE@	    > devref-configured-c-interface.tex
+ at BUILD_C_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_C_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_C_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_C_INPUT_DEVREF)"'|' \
+ at BUILD_C_INTERFACE_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_C_INTERFACE_TRUE@	    > Doxyfile.devref-configured-c-interface-html
+ at BUILD_C_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-c-interface-html
+# FIXME: add appropriate generated files.
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-configured-prolog-interface.latex-dir: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > user-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > Doxyfile.user-configured-prolog-interface-latex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-latex
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-configured-prolog-interface.latex-dir: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > devref-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > Doxyfile.devref-configured-prolog-interface-latex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-latex
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@.pdf: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-configured-prolog-interface.latex-dir
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) make -C user-configured-prolog-interface.latex-dir \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    refman.pdf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    && mv -f user-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@.pdf: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-configured-prolog-interface.latex-dir
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) make -C devref-configured-prolog-interface.latex-dir \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    refman.pdf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    && mv -f devref-configured-prolog-interface.latex-dir/refman.pdf $@
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-user-configured-prolog-interface- at VERSION@-html: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(USER_CONFIGURED_PROLOG_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > user-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_USER)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > Doxyfile.user-configured-prolog-interface-html
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-prolog-interface-html
+
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@ppl-devref-configured-prolog-interface- at VERSION@-html: \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@$(DEVREF_CONFIGURED_PROLOG_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	rm -rf $@
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > devref-configured-prolog-interface.tex
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(SED) $(SED_CONFIGURED_PROLOG_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_PROLOG_INPUT_DEVREF)"'|' \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	    > Doxyfile.devref-configured-prolog-interface-html
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-prolog-interface-html
+
+ at BUILD_OCAML_INTERFACE_TRUE@user-configured-ocaml-interface.latex-dir: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_CONFIGURED_OCAML_INTERFACE_STUFF)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > user-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > Doxyfile.user-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@		../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@devref-configured-ocaml-interface.latex-dir: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > devref-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > Doxyfile.devref-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-latex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(OCAMLDOC) $(OCAMLDOC_LATEX_OPTIONS) -o $@/ocamldoc.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@		../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@.pdf: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-configured-ocaml-interface.latex-dir
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) make -C user-configured-ocaml-interface.latex-dir \
+ at BUILD_OCAML_INTERFACE_TRUE@	    refman.pdf \
+ at BUILD_OCAML_INTERFACE_TRUE@	    && mv -f user-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@.pdf: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-configured-ocaml-interface.latex-dir
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) make -C devref-configured-ocaml-interface.latex-dir \
+ at BUILD_OCAML_INTERFACE_TRUE@	    refman.pdf \
+ at BUILD_OCAML_INTERFACE_TRUE@	    && mv -f devref-configured-ocaml-interface.latex-dir/refman.pdf $@
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-user-configured-ocaml-interface- at VERSION@-html: \
+ at BUILD_OCAML_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(USER_CONFIGURED_OCAML_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > user-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_USER)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > Doxyfile.user-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@	mkdir $@/ocamldoc
+ at BUILD_OCAML_INTERFACE_TRUE@	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ at BUILD_OCAML_INTERFACE_TRUE@		../interfaces/OCaml/ppl_ocaml.mli
+
+ at BUILD_OCAML_INTERFACE_TRUE@ppl-devref-configured-ocaml-interface- at VERSION@-html: \
+ at BUILD_OCAML_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@$(DEVREF_CONFIGURED_OCAML_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_OCAML_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > devref-configured-ocaml-interface.tex
+ at BUILD_OCAML_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_OCAML_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_OCAML_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_OCAML_INPUT_DEVREF)"'|' \
+ at BUILD_OCAML_INTERFACE_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_OCAML_INTERFACE_TRUE@	    > Doxyfile.devref-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-ocaml-interface-html
+ at BUILD_OCAML_INTERFACE_TRUE@	mkdir $@/ocamldoc
+ at BUILD_OCAML_INTERFACE_TRUE@	$(OCAMLDOC) $(OCAMLDOC_HTML_OPTIONS) -d $@/ocamldoc \
+ at BUILD_OCAML_INTERFACE_TRUE@		../interfaces/OCaml/ppl_ocaml.mli
+# FIXME add generated files
+
+# NOTE: as an exception to the common policy,
+# for the user-configured-java case we override the setting
+# for Doxygen configuration variables HIDE_UNDOC_MEMBERS (set to NO)
+# and EXCLUDE (set to Fake_Class_for_Doxygen.java)
+
+ at BUILD_JAVA_INTERFACE_TRUE@user-configured-java-interface.latex-dir: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_CONFIGURED_JAVA_INTERFACE_STUFF)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > user-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_LATEX_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > Doxyfile.user-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@	echo "HIDE_UNDOC_MEMBERS = NO" \
+ at BUILD_JAVA_INTERFACE_TRUE@	    >> Doxyfile.user-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@	    >> Doxyfile.user-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-latex
+
+ at BUILD_JAVA_INTERFACE_TRUE@devref-configured-java-interface.latex-dir: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > devref-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_LATEX_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > Doxyfile.devref-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@	    >> Doxyfile.devref-configured-java-interface-latex
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-latex
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@.pdf: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-configured-java-interface.latex-dir
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) make -C user-configured-java-interface.latex-dir \
+ at BUILD_JAVA_INTERFACE_TRUE@	    refman.pdf \
+ at BUILD_JAVA_INTERFACE_TRUE@	    && mv -f user-configured-java-interface.latex-dir/refman.pdf $@
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@.pdf: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-configured-java-interface.latex-dir
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) make -C devref-configured-java-interface.latex-dir \
+ at BUILD_JAVA_INTERFACE_TRUE@	    refman.pdf \
+ at BUILD_JAVA_INTERFACE_TRUE@	    && mv -f devref-configured-java-interface.latex-dir/refman.pdf $@
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-user-configured-java-interface- at VERSION@-html: \
+ at BUILD_JAVA_INTERFACE_TRUE@user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(USER_CONFIGURED_JAVA_INTERFACE_STUFF) $(USER_CORE_HTML_DIR)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    $(srcdir)/user-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > user-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_USER_HTML_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_USER)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@	    user-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > Doxyfile.user-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@	echo "HIDE_UNDOC_MEMBERS = NO" \
+ at BUILD_JAVA_INTERFACE_TRUE@	    >> Doxyfile.user-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@	    >> Doxyfile.user-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.user-configured-java-interface-html
+
+ at BUILD_JAVA_INTERFACE_TRUE@ppl-devref-configured-java-interface- at VERSION@-html: \
+ at BUILD_JAVA_INTERFACE_TRUE@devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@$(DEVREF_CONFIGURED_JAVA_INTERFACE_STUFF) $(DEVREF_CORE_HTML_DIR)
+ at BUILD_JAVA_INTERFACE_TRUE@	rm -rf $@
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    $(srcdir)/devref-language-interface.tex \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > devref-configured-java-interface.tex
+ at BUILD_JAVA_INTERFACE_TRUE@	$(SED) $(SED_CONFIGURED_JAVA_OPTION) $(SED_DEVREF_HTML_OPTION) \
+ at BUILD_JAVA_INTERFACE_TRUE@	    -e 's|<PPL_SED_INPUT>|'"$(SED_CONFIGURED_JAVA_INPUT_DEVREF)"'|' \
+ at BUILD_JAVA_INTERFACE_TRUE@	    devref-language-interface.doxyconf \
+ at BUILD_JAVA_INTERFACE_TRUE@	    > Doxyfile.devref-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@	echo "EXCLUDE_PATTERNS = */Fake_Class_for_Doxygen*" \
+ at BUILD_JAVA_INTERFACE_TRUE@	    >> Doxyfile.devref-configured-java-interface-html
+ at BUILD_JAVA_INTERFACE_TRUE@	$(TEX_ENV) $(DOXYGEN) Doxyfile.devref-configured-java-interface-html
+
+############################################################################
+
+# Ad-hoc rules for distributed HTML manuals.
+# These follow the guidelines of Section 27.5 of the Automake manual
+# (distributed files should never depend upon non-distributed built files).
+
+$(USER_CORE_HTML_MANUAL): user.doxyconf-html $(USER_CORE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_CORE_HTML_DIR)
+	tar c $(USER_CORE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_C_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_C_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_C_INTERFACE_HTML_DIR)
+	tar c $(USER_C_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_PROLOG_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_PROLOG_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_PROLOG_INTERFACE_HTML_DIR)
+	tar c $(USER_PROLOG_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_OCAML_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_OCAML_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_OCAML_INTERFACE_HTML_DIR)
+	tar c $(USER_OCAML_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+$(USER_JAVA_INTERFACE_HTML_MANUAL): $(USER_CORE_HTML_MANUAL) \
+user-language-interface.doxyconf $(USER_JAVA_INTERFACE_STUFF)
+	$(MAKE) $(AM_MAKEFLAGS) $(USER_JAVA_INTERFACE_HTML_DIR)
+	tar c $(USER_JAVA_INTERFACE_HTML_DIR) | gzip --best --force > $@
+
+############################################################################
+
+%.tar: %
+	tar cf $@ $<
+
+%.gz: %
+	gzip --best --force $<
+
+%.pdf: %.tex
+	$(TEX_ENV) pdflatex $<
+
+%.ps:	%.pdf
+	pdftops $< $@
+
+mostlyclean-local:
+	rm -rf $(HTML_DIRS) $(LATEX_DIRS) $(NONDIST_MANUALS) *.aux *.log
+	rm -rf $(GENERATED_LATEX_HEADER_FILES) Doxyfile.*
+
+../src/ppl_include_files.hh:
+	$(MAKE) $(AM_MAKEFLAGS) -C ../src ppl_include_files.hh
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/README.doc b/doc/README.doc
new file mode 100644
index 0000000..1c86a95
--- /dev/null
+++ b/doc/README.doc
@@ -0,0 +1,167 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+
+How To Get (More) PPL Documentation
+===================================
+
+Do you have all the documentation you need? If you don't or if you are
+unsure, the following is for you.
+
+There are two versions of the Parma Polyhedra Library's documentation:
+
+  + a `user' manual, containing all and only the information needed by
+    people wishing to use the library;
+  + a `devref' (developer reference) manual, also containing details
+    about the library implementation.
+
+Each of these versions can be obtained in several formats:
+
+  + a PDF file suitable for browsing on the screen;
+  + a (gzipped) PostScript file suitable for printing;
+  + a (tarred and gzipped) collection of HTML pages suitable for browsing.
+
+
+The Documentation You May Already Have
+======================================
+
+First of all, you may already have some documentation and all you need
+to do is to find it.
+
+If you have downloaded a source (tar or zip) archive for PPL version
+X.Y.Z, you will find in the doc subdirectory the following set of user
+manuals:
+
+  ppl-user-X.Y.Z.pdf
+  ppl-user-X.Y.Z.ps.gz
+
+If you have installed a binary RPM package, then you have the same set
+of manuals. You can find them with the command `rpm -ql ppl' which
+will print, among other things, something like
+
+  /usr/share/doc/ppl-X.Y.Z
+  /usr/share/doc/ppl-X.Y.Z/README
+  /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.pdf
+  /usr/share/doc/ppl-X.Y.Z/ppl-user-X.Y.Z.ps.gz
+
+
+The Documentation You May Download
+==================================
+
+If you are using the latest released version of the library, you will
+find all the documentation in all formats at
+http://bugseng.com/products/ppl/Documentation/ .
+
+
+The Documentation You May Build Yourself
+========================================
+
+When all else fails (which is the case, for example, when you are
+using a Git version [1]) then you may build the documentation by
+yourself. In order to do that, you should have a recent version of
+Doxygen [2] and, if you want to build the HTML documentation, a recent
+version of Graphviz [3].  When you have all the tools installed and
+running, you should follow the following procedure.
+
+First, you should determine which version of the library you are
+working with. The safest way is to go to the top source directory of
+the library and to locate the unique line in the file configure.ac
+containing the string "AC_INIT". This will look like
+
+  AC_INIT([the Parma Polyhedra Library], 0.6.3pre4, ppl-devel at cs.unipr.it, ppl)
+
+from which you determine that the version is 0.6.3pre4 (a.k.a. the 4th
+beta version before release 0.6.3).
+
+Then, if you have not yet done it, build the library itself (see the
+building instructions in the file INSTALL [4] in the top source
+directory.  The default build process, while essential in order to
+produce the documentation, will not generate it directly. For this
+reason you should go to the doc subdirectory of your build directory
+(i.e., the one where you compiled the library) and build all the
+documents you want by executing a command of the form
+
+  make doc1 doc2 ...
+
+Here, doc1, doc2 and so forth are the names of the documents to be built.
+Document names may be obtained from the following list by replacing
+X.Y.Z with the version number you have already determined, and by
+replacing KIND with either `user' or `devref':
+
+  ppl-KIND-X.Y.Z.pdf
+  ppl-KIND-X.Y.Z.ps.gz
+  ppl-KIND-X.Y.Z-html.tar.gz
+
+For example, the command
+
+  make ppl-user-0.6.3pre4.pdf ppl-devref-0.6.3pre4.pdf
+
+will build both kinds of manuals in a PDF format.  Alternatively, the
+command `make world' will build all the available documentation in all
+of the above formats.
+
+It is possible that, while compiling some PostScript or PDF
+documentation, TeX dies with a "TeX capacity exceeded" error
+message.  The error should contain the indication of the TeX buffer
+whose capacity has been exceeded, e.g.:
+
+  ! TeX capacity exceeded, sorry [save size=5000].
+
+You then need to edit the TeX configuration file that defines the
+buffer sizes so as to increase the value of the relevant buffer.
+Note: the actual name and location of the configuration file will vary
+depending on the available TeX distribution: possible names include
+texmf.cnf, texmf.cfg and 20sizes.cnf.  Continuing our example, we can
+double save_size by editing the configuration file so that the
+relevant line becomes
+
+  save_size = 10000        % for saving values outside current group
+
+Any change to such configuration files should be followed by running
+a command like
+
+  texconfig init
+
+for the change to become effective (on some systems the `texconfig-sys'
+command should be used to configure TeX system-wide).
+
+--------
+
+[1] http://bugseng.com/products/ppl/Download/Git
+[2] http://www.doxygen.org/
+[3] http://www.research.att.com/sw/tools/graphviz/
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/doc/bugseng_logo.pdf b/doc/bugseng_logo.pdf
new file mode 100644
index 0000000..f6aaf87
Binary files /dev/null and b/doc/bugseng_logo.pdf differ
diff --git a/doc/definitions.dox b/doc/definitions.dox
new file mode 100644
index 0000000..6565e52
--- /dev/null
+++ b/doc/definitions.dox
@@ -0,0 +1,5028 @@
+// Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+// Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+//
+// This document describes the Parma Polyhedra Library (PPL).
+//
+// Permission is granted to copy, distribute and/or modify this document
+// under the terms of the GNU Free Documentation License, Version 1.2
+// or any later version published by the Free Software Foundation;
+// with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+// The license is included, in various formats, in the `doc' subdirectory
+// of each distribution of the PPL in files named `fdl.*'.
+//
+// The PPL is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3 of the License, or (at your
+// option) any later version.  The license is included, in various
+// formats, in the `doc' subdirectory of each distribution of the PPL in
+// files named `gpl.*'.
+//
+// The PPL is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// If you have not received a copy of one or both the above mentioned
+// licenses along with the PPL, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+//
+// For the most up-to-date information see the Parma Polyhedra Library
+// site: http://bugseng.com/products/ppl/ .
+
+
+/*!
+  \defgroup PPL_CXX_interface C++ Language Interface
+  \brief
+  The core implementation of the Parma Polyhedra Library
+  is written in C++.
+
+  See Namespace, Hierarchical and Compound indexes
+  for additional information about each single data type.
+*/
+
+/*! \mainpage General Information on the PPL
+\section preamble The Main Features
+
+The Parma Polyhedra Library (PPL) is a modern C++ library for the
+manipulation of numerical information that can be represented by
+points in some \f$n\f$-dimensional vector space. For instance, one of
+the key domains the PPL supports is that of rational convex polyhedra
+(Section \ref convex_polys). Such domains
+are employed in several systems for the analysis and verification of
+hardware and software components, with applications spanning
+imperative, functional and logic programming languages, synchronous
+languages and synchronization protocols, real-time and hybrid systems.
+Even though the PPL library is not meant to target a particular
+problem, the design of its interface has been largely influenced by
+the needs of the above class of applications.  That is the reason why
+the library implements a few operators that are more or less specific
+to static analysis applications, while lacking some other operators
+that might be useful when working, e.g., in the field of computational
+geometry.
+
+The main features of the library are the following:
+- it is user friendly:
+  you write <CODE>x + 2*y + 5*z \<= 7</CODE> when you mean it;
+- it is fully dynamic:
+  available virtual memory is the only limitation to the
+  dimension of anything;
+- it provides full support for the manipulation of convex polyhedra
+  that are not topologically closed;
+- it is written in standard C++: meant to be portable;
+- it is exception-safe: never leaks resources or leaves invalid object
+  fragments around;
+- it is rather efficient: and we hope to make it even more so;
+- it is thoroughly documented:
+  perhaps not literate programming but close enough;
+- it has interfaces to other programming languages: including C, Java, OCaml
+  and a number of Prolog systems;
+- it is free software: distributed under the terms of the
+  GNU General Public License.
+
+In the following section we describe all the domains available to the PPL user.
+More detailed descriptions of these domains and the operations provided
+will be found in subsequent sections.
+
+In the final section of this chapter (Section \ref use_of_library),
+we provide some additional advice on the use of the library.
+
+\subsection Semantic_Geometric_Descriptors Semantic Geometric Descriptors
+
+A <EM>semantic geometric descriptor</EM> is a subset of \f$ \Rset^n \f$.
+The PPL provides several classes of semantic GDs.  These are
+identified by their C++ class name, together with the class template
+parameters, if any. These classes include the <EM>simple classes</EM>:
+  - \link Parma_Polyhedra_Library::C_Polyhedron \c C_Polyhedron \endlink,
+  - \link Parma_Polyhedra_Library::NNC_Polyhedron \c NNC_Polyhedron \endlink,
+  - \link Parma_Polyhedra_Library::BD_Shape \c BD_Shape\<T\> \endlink,
+  - \link Parma_Polyhedra_Library::Octagonal_Shape \c Octagonal_Shape\<T\> \endlink,
+  - \link Parma_Polyhedra_Library::Box \c Box\<ITV\> \endlink, and
+  - \link Parma_Polyhedra_Library::Grid \c Grid \endlink,
+
+where:
+  - \c T is a numeric type chosen among
+    \c mpz_class, \c mpq_class,
+    <CODE>signed char</CODE>, \c short, \c int, \c long, \c long long
+    (or any of the C99 exact width integer equivalents \c int8_t, int16_t,
+    and so forth); and
+  - \c ITV is an instance of the
+    \link Parma_Polyhedra_Library::Interval \c Interval \endlink
+    template class.
+
+Other semantic GDs, the <EM>compound classes</EM>, can be constructed
+(also recursively) from all the GDs classes.
+These include:
+  - \link Parma_Polyhedra_Library::Pointset_Powerset \c Pointset_Powerset\<PSET\> \endlink,
+  - \link Parma_Polyhedra_Library::Partially_Reduced_Product <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> \endlink,
+  .
+where \c PSET, \c D1 and \c D2 can be any semantic GD classes and \c R is the
+reduction operation to be applied to the component domains of the
+product class.
+
+A uniform set of operations is provided for creating, testing and
+maintaining each of the semantic GDs.  However, as many of these
+depend on one or more syntactic GDs, we first describe the syntactic GDs.
+
+
+\subsection Syntactic_Geometric_Descriptors Syntactic Geometric Descriptors
+
+A <EM>syntactic geometric descriptor</EM> is for defining, modifying
+and inspecting a semantic GD.  There are three kinds of
+<EM>syntactic GDs</EM>: <EM>basic GDs</EM>, <EM>constraint GDs</EM> and
+<EM>generator GDs</EM>.
+Some of these are <EM>generic</EM> and some <EM>specific</EM>.
+A generic syntactic GD can be used (in the appropriate context)
+with any semantic GD; clearly, different semantic GDs will usually
+provide different levels of support for the different subclasses
+of generic GDs. In contrast, the use of a specific GD may be
+restricted to apply to a given subset of the semantic GDs
+(i.e., some semantic GDs provide no support at all for them).
+
+
+\subsubsection Basic_Geometric_Descriptors Basic Geometric Descriptors
+
+The following basic GDs currently supported by the PPL are:
+  - space dimension;
+  - variable and variable set;
+  - coefficient;
+  - linear expression;
+  - relation symbol;
+  - vector point.
+
+These classes, which are all generic syntactic GDs, are used
+to build the constraint and generator GDs as
+well as support many generic operations on the semantic GDs.
+
+
+\subsubsection Constraint_Geometric_Descriptors Constraint Geometric Descriptors
+
+The PPL currently supports the following classes of \e generic constraint GDs:
+  - linear constraint;
+  - linear congruence.
+
+Each linear constraint can be further classified to belong to one or more
+of the following syntactic subclasses:
+  - inconsistent constraints (e.g., \f$0 \geq 2\f$);
+  - tautological constraints (e.g., \f$0 \leq 2\f$);
+  - interval constraints (e.g., \f$x \leq 2\f$);
+  - bounded-difference constraints (e.g., \f$x - y \leq 2\f$);
+  - octagonal constraints (e.g., \f$x + y \leq 2\f$);
+  - linear equality constraints (e.g., \f$x = 2\f$);
+  - non-strict linear inequality constraints (e.g., \f$x - 3y \leq 2\f$);
+  - strict linear inequality constraints (e.g., \f$x - 3y < 2\f$).
+
+Note that the subclasses are not disjoint.
+
+Similarly, each linear congruence can be classified to belong
+to one or more of the following syntactic subclasses:
+  - inconsistent congruences (e.g., \f$0 \equiv_2 1\f$);
+  - tautological congruences (e.g., \f$0 \equiv_2 2\f$);
+  - linear equality, i.e., non-proper congruences
+    (e.g., \f$x + 3y \equiv_0 0\f$);
+  - proper congruences (e.g., \f$x + 3y \equiv_5 0\f$).
+
+The library also supports systems, i.e., finite collections, of either
+linear constraints or linear congruences (but see the note below).
+
+Each semantic GD provides \e optimal support for some of the subclasses
+of generic syntactic GDs listed above: here, the word "optimal" means that
+the considered semantic GD computes the <em>best upward approximation</em>
+of the exact meaning of the linear constraint or congruence.
+When a semantic GD operation is applied to a syntactic GD that is not
+optimally supported, it will either indicate its unsuitability
+(e.g., by throwing an exception) or it will apply an upward approximation
+semantics (possibly not the best one).
+
+For instance, the semantic GD of topologically closed convex polyhedra
+provides optimal support for non-strict linear inequality and equality
+constraints, but it does not provide optimal support for strict inequalities.
+Some of its operations (e.g., \c add_constraint and \c add_congruence)
+will throw an exception if supplied with a non-trivial strict inequality
+constraint or a proper congruence; some other operations
+(e.g., \c refine_with_constraint or \c refine_with_congruence)
+will compute an over-approximation.
+
+Similarly, the semantic GD of rational boxes (i.e., multi-dimensional
+intervals) having integral values as interval boundaries provides optimal
+support for all interval constraints: even though the interval constraint
+\f$2x \leq 5\f$ cannot be represented exactly, it will be optimally
+approximated by the constraint \f$x \leq 3\f$.
+
+\note
+When providing an upward approximation for a constraint or congruence,
+we consider it in isolation: in particular, the approximation of each
+element of a system of GDs is independent from the other elements;
+also, the approximation is independent from the current value of
+the semantic GD.
+
+
+\subsubsection Generator_Geometric_Descriptors Generator Geometric Descriptors
+
+The PPL currently supports two classes of generator GDs:
+  - polyhedra generator: these are polyhedra points, rays and lines;
+  - grid generator: these are grid points, parameters and lines.
+
+Rays, lines and parameters are specific of the mentioned semantic GDs
+and, therefore, they cannot be used by other semantic GDs.
+In contrast, as already mentioned above, points are basic geometric
+descriptors since they are also used in <EM>generic</EM> PPL operations.
+
+
+\subsection Generic_Operations_on_Semantic_Geometric_Descriptors Generic Operations on Semantic Geometric Descriptors
+
+<OL>
+<LI>
+  Constructors of a universe or empty semantic GD with the given
+  space dimension.
+</LI>
+<LI>
+  Operations on a semantic GD that do not depend on the syntactic GDs.
+  <UL>
+  <LI>
+    <CODE>is_empty()</CODE>, <CODE>is_universe()</CODE>,
+    <CODE>is_topologically_closed()</CODE>, <CODE>is_discrete()</CODE>,
+    <CODE>is_bounded()</CODE>, <CODE>contains_integer_point()</CODE>
+
+    test for the named properties of the semantic GD.
+  </LI>
+  <LI>
+    <CODE>%total_memory_in_bytes()</CODE>,
+    <CODE>%external_memory_in_bytes()</CODE>
+
+    return the total and external memory size in bytes.
+  </LI>
+  <LI>
+    <CODE>OK()</CODE>
+
+    checks that the semantic GD has a valid internal representation.
+    (Some GDs provide this method with an optional Boolean argument
+    that, when true, requires to also check for non-emptiness.)
+  </LI>
+  <LI>
+    <CODE>space_dimension()</CODE>, <CODE>affine_dimension()</CODE>
+
+    return, respectively, the space and affine dimensions of the GD.
+  </LI>
+  <LI>
+    <CODE>add_space_dimensions_and_embed()</CODE>,
+    <CODE>add_space_dimensions_and_project()</CODE>,
+    <CODE>expand_space_dimension()</CODE>,
+    <CODE>remove_space_dimensions()</CODE>,
+    <CODE>fold_space_dimensions()</CODE>, <CODE>map_space_dimensions()</CODE>
+
+    modify the space dimensions of the semantic GD; where, depending on the
+    operation, the arguments can include the number of space dimensions
+    to be added or removed a variable or set of variables denoting the
+    actual dimensions to be used and a partial function defining a mapping
+    between the dimensions.
+  </LI>
+  <LI>
+    <CODE>contains()</CODE>, <CODE>strictly_contains()</CODE>,
+    <CODE>is_disjoint_from()</CODE>
+
+    compare the semantic GD with an argument semantic GD of the same class.
+  </LI>
+  <LI>
+    <CODE>topological_closure_assign()</CODE>,
+    <CODE>intersection_assign()</CODE>,
+    <CODE>upper_bound_assign()</CODE>, <CODE>difference_assign()</CODE>,
+    <CODE>time_elapse_assign()</CODE>, <CODE>widening_assign()</CODE>,
+    <CODE>concatenate_assign()</CODE>, <CODE>m_swap()</CODE>
+
+    modify the semantic GD, possibly with an argument semantic GD of
+    the same class.
+  </LI>
+  <LI>
+    <CODE>constrains()</CODE>, <CODE>bounds_from_above()</CODE>,
+    <CODE>bounds_from_below()</CODE>, <CODE>maximize()</CODE>,
+    <CODE>minimize()</CODE>.
+
+    These find information about the bounds of the semantic GD where
+    the argument variable or linear expression define the direction
+    of the bound.
+  </LI>
+  <LI>
+    <CODE>affine_image()</CODE>, <CODE>affine_preimage()</CODE>,
+    <CODE>generalized_affine_image()</CODE>,
+    <CODE>generalized_affine_preimage()</CODE>,
+    <CODE>bounded_affine_image()</CODE>,
+    <CODE>bounded_affine_preimage()</CODE>.
+
+    These perform several variations of the affine image and preimage
+    operations where, depending on the operation, the arguments can
+    include a variable representing the space dimension to which the
+    transformation will be applied and linear expressions
+    with possibly a relation symbol and denominator value
+    that define the exact form of the transformation.
+  </LI>
+  <LI>
+    <CODE>ascii_load()</CODE>, <CODE>ascii_dump()</CODE>
+
+    are the ascii input and output operations.
+  </UL>
+</LI>
+<LI>
+  Constructors of a semantic GD of one class from a semantic GD of any
+  other class.
+  These constructors obey an <EM>upward approximation semantics</EM>,
+  meaning that the constructed semantic GD is guaranteed to contain
+  all the points of the source semantic GD, but possibly more.
+  Some of these constructors provide a complexity parameter with which
+  the application can control the complexity/precision trade-off
+  for the construction operation: by using the complexity parameter,
+  it is possible to keep the construction operation in the polynomial
+  or the simplex worst-case complexity class, possibly incurring into
+  a further upward approximation if the precise constructor is based
+  on an algorithm having exponential complexity.
+</LI>
+<LI>
+  Constructors of a semantic GD from a constraint GD;
+  either a linear constraint system or a linear congruence system.
+  These constructors assume that the given semantic GD provides optimal
+  support for the argument syntactic GD: if that is not the case,
+  an invalid argument exception is thrown.
+</LI>
+<LI>
+  Other interaction between the semantic GDs and constraint GDs.
+  <UL>
+  <LI>
+    <CODE>add_constraint()</CODE>, <CODE>add_constraints()</CODE>,
+    <CODE>add_recycled_constraints()</CODE>,
+    <CODE>add_congruence()</CODE>, <CODE>add_congruences()</CODE>,
+    <CODE>add_recycled_congruences()</CODE>.
+
+    These methods assume that the given semantic GD provides optimal
+    support for the argument syntactic GD: if that is not the case,
+    an invalid argument exception is thrown.
+
+    For <CODE>add_recycled_constraints()</CODE> and
+    <CODE>add_recycled_congruences()</CODE>,
+    the only assumption that can be made on the constraint GD
+    after return (successful or exceptional) is that
+    it can be safely destroyed.
+  </LI>
+  <LI>
+    <CODE>refine_with_constraint()</CODE>,
+    <CODE>refine_with_constraints()</CODE>,
+    <CODE>refine_with_congruence()</CODE>,
+    <CODE>refine_with_congruences()</CODE>.
+
+    If the argument constraint GD is optimally supported by the
+    semantic GD, the methods behave the same as the corresponding
+    \c add_* methods listed above.  Otherwise the constraint GD
+    is used only to a limited extent to refine the semantic GD;
+    possibly not at all.  Notice that, while repeating an add operation
+    is pointless, this is not true for the refine operations.
+    For example, in those cases where
+\code
+      Semantic_GD.add_constraint(c)
+\endcode
+    raises an exception, a fragment of the form
+\code
+      Semantic_GD.refine_with_constraint(c)
+      // Other add_constraint(s) or refine_with_constraint(s) operations
+      // on Semantic_GD.
+      Semantic_GD.refine_with_constraint(c)
+\endcode
+    may give more precise results than a single
+\code
+      Semantic_GD.refine_with_constraint(c).
+      // Other add_constraint(s) or refine_with_constraint(s) operations
+      // on Semantic_GD.
+\endcode
+  </LI>
+  <LI>
+    <CODE>constraints()</CODE>, <CODE>minimized_constraints()</CODE>,
+    <CODE>congruences()</CODE>, <CODE>minimized_congruences()</CODE>.
+
+    Returns the indicated system of constraint GDs satisfied by
+    the semantic GD.
+  </LI>
+  <LI>
+    <CODE>can_recycle_constraint_systems()</CODE>,
+    <CODE>can_recycle_congruence_systems()</CODE>.
+
+    Return true if and only if the semantic GD can recycle the
+    indicated constraint GD.
+  </LI>
+  <LI>
+    <CODE>relation_with()</CODE>.
+
+    This takes a constraint GD as an argument and returns the relations holding
+    between the semantic GD and the constraint GD.
+    The possible relations are:
+    <CODE>IS_INCLUDED()</CODE>, <CODE>SATURATES()</CODE>,
+    <CODE>STRICTLY_INTERSECTS()</CODE>, <CODE>IS_DISJOINT()</CODE>
+    and <CODE>NOTHING()</CODE>.
+    This operator also can take a polyhedron generator GD as an argument
+    and returns the relation <CODE>SUBSUMES()</CODE> or <CODE>NOTHING()</CODE>
+    that holds between the generator GD and the semantic GD.
+  </LI>
+  </UL>
+</LI>
+</OL>
+
+
+\section Upward_Approximation Upward Approximation
+
+The Parma Polyhedra Library, for those cases where an exact result
+cannot be computed within the specified complexity limits, computes an
+<EM>upward approximation</EM> of the exact result.  For semantic GDs this
+means that the computed result is a possibly strict superset of the set of
+points of \f$ \Rset^n \f$ that constitutes the exact result.  Notice
+that the PPL does not provide direct support to compute <EM>downward
+approximations</EM> (i.e., possibly strict subsets of the exact
+results).  While downward approximations can often be computed from
+upward ones, the required algorithms and the conditions upon which
+they are correct are outside the current scope of the PPL.
+Beware, in particular, of the following possible pitfall:
+the library provides methods to compute upward approximations
+of set-theoretic difference, which is antitone in its second
+argument.  Applying a difference method to a second argument
+that is not an exact representation or a downward approximation of
+reality, would yield a result that, of course, is not an upward
+approximation of reality.  It is the responsibility of the
+library user to provide the PPL's method with approximations of reality
+that are consistent with respect to the desired results.
+
+
+\section Approximating_Integers Approximating Integers
+
+The Parma Polyhedra Library provides support for approximating
+integer computations using the geometric descriptors it provides.
+In this section we briefly explain these facilities.
+
+
+\subsection Dropping_Non_Integer_Points Dropping Non-Integer Points
+
+When a geometric descriptor is used to approximate integer quantities,
+all the points with non-integral coordinates represent an imprecision
+of the description.  Of course, removing all these points may be
+impossible (because of convexity) or too expensive.  The PPL provides
+the operator <CODE>drop_some_non_integer_points</CODE> to possibly
+tighten a descriptor by dropping some points with non-integer
+coordinates, using algorithms whose complexity is bounded by
+a parameter.  The set of dimensions that represent integer quantities
+can be optionally specified.  It is worth to stress the role of
+<EM>some</EM> in the operator name: in general no optimality guarantee
+is provided.
+
+
+\subsection Approximating_Bounded_Integers Approximating Bounded Integers
+
+The Parma Polyhedra Library provides services that allow to compute
+correct approximations of bounded arithmetic as available in widespread
+programming languages.  Supported bit-widths are 8, 16, 32 and 64 bits,
+with some limited support for 128 bits.
+Supported representations are binary unsigned and two's complement signed.
+Supported overflow behaviors are:
+<DL>
+  <DT>Wrapping:</DT>
+  <DD>
+    this means that, for a \f$w\textrm{-bit}\f$ bounded integer, the
+    computation
+    happens modulo \f$2^w\f$.  In turn, this signifies that the computation
+    happens <EM>as if</EM> the unbounded arithmetic result was computed
+    and then wrapped.  For unsigned integers, the wrapping function is
+    simply \f$x \bmod 2^w\f$, most conveniently defined as
+    \f[
+      \mathrm{wrap}^\mathrm{u}_w(x)
+        \defeq
+          x - 2^w \lfloor x/2^w \rfloor.
+    \f]
+    For signed integers the wrapping function is, instead,
+    \f[
+      \mathrm{wrap}^\mathrm{s}_w(x)
+        \defeq
+          \begin{cases}
+            \mathrm{wrap}^\mathrm{u}_w(x),
+              &\text{if $\mathrm{wrap}^\mathrm{u}_w(x) < 2^{w-1}$;} \\
+            \mathrm{wrap}^\mathrm{u}_w(x) - 2^w,
+              &\text{otherwise.}
+          \end{cases}
+    \f]
+  </DD>
+  <DT>Undefined:</DT>
+  <DD>
+    this means that the result of the operation resulting in an
+    overflow can take any value.  This is useful to partially
+    model systems where overflow has unspecified effects on
+    the computed result.
+    Even though something more serious can happen in the system
+    being analyzed ---due to, e.g., C's undefined behavior---, here we
+    are only concerned with the results of arithmetic operations.
+    It is the responsibility of the analyzer to ensure that other
+    manifestations of undefined behavior are conservatively approximated.
+  </DD>
+  <DT>Impossible:</DT>
+  <DD>
+    this is for the analysis of languages where overflow is trapped
+    before it affects the state, for which, thus, any indication that
+    an overflow may have affected the state is necessarily due to
+    the imprecision of the analysis.
+  </DD>
+</DL>
+
+
+\subsubsection Wrapping_Operator Wrapping Operator
+
+One possibility for precisely approximating the semantics of programs that
+operate on bounded integer variables is to follow the approach described
+in \ref SK07 "[SK07]".  The idea is to associate space dimensions to the
+<EM>unwrapped values</EM> of bounded variables.  Suppose <CODE>j</CODE>
+is a \f$w\textrm{-bit}\f$, unsigned program variable associated to a space
+dimension
+labeled by the variable \f$x\f$.  If \f$x\f$ is constrained by some
+numerical abstraction to take values in a set \f$S \sseq \Rset\f$, then
+the program variable <CODE>j</CODE> can only take values in
+\f$\bigl\{\, \mathrm{wrap}^\mathrm{u}_w(z) \bigm| z \in S \,\bigr\}\f$.
+There are two reasons why this is interesting: firstly, this allows for
+the retention of relational information by using a single numerical abstraction
+tracking multiple program variables.  Secondly, the integers modulo
+\f$2^w\f$ form a ring of equivalence classes on which addition
+and multiplication are well defined.  This means, e.g., that assignments
+with affine right-hand sides and involving only variables with the same
+bit-width and representation can be safely modeled by affine images.
+While upper bounds and widening can be used without any precaution,
+anything that can be reconducted to intersection requires a preliminary
+<EM>wrapping</EM> phase, where the dimensions corresponding to bounded
+integer types are brought back to their natural domain.
+This necessity arises naturally for the analysis of conditionals
+and conversion operators, as well as in the realization of domain
+combinations.
+
+The PPL provides a general wrapping operator that is parametric with
+respect to the set of space dimensions (variables) to be wrapped,
+the width, representation and overflow behavior of all these variables.
+An optional constraint system can, when given, improve the
+precision.  This constraint system, which must only depend on variables
+with respect to which wrapping is performed, is assumed to represent
+the conditional or looping construct guard with respect to which
+wrapping is performed.  Since wrapping requires the computation of
+upper bounds and due to non-distributivity of constraint refinement
+over upper bounds, passing a constraint system in this way can be more
+precise than refining the result of the wrapping operation afterwards.
+The general wrapping operator offered by the PPL also allows control of
+the complexity/precision ratio by means of two additional parameters:
+an unsigned integer encoding a complexity threshold, with higher values
+resulting in possibly improved precision; and a Boolean controlling
+whether space dimensions should be wrapped individually, something that
+results in much greater efficiency to the detriment of precision,
+or collectively.
+
+Note that the PPL assumes that any space dimension subject to wrapping
+is being used to capture the value of bounded integer values.  As a
+consequence the library is free to drop, from the involved numerical
+abstraction, any point having a non-integer coordinate that corresponds
+to a space dimension subject to wrapping.  It must be stressed that
+freedom to drop such points does not constitute an obligation to remove
+all of them (especially because this would be extraordinarily expensive
+on some numerical abstractions).
+The PPL provides operators for the more systematic
+\ref Dropping_Non_Integer_Points
+"removal of points with non-integral coordinates".
+
+The wrapping operator will only remove some of these points
+as a by-product of its main task and only when this comes at a negligible
+extra cost.
+
+
+\section convex_polys Convex Polyhedra
+
+In this section we introduce convex polyhedra,
+as considered by the library, in more detail.
+For more information about the definitions and results stated here see
+\ref BRZH02b "[BRZH02b]",
+\ref Fuk98 "[Fuk98]",
+\ref NW88 "[NW88]", and
+\ref Wil93 "[Wil93]".
+
+\subsection Vectors_Matrices_and_Scalar_Products Vectors, Matrices and Scalar Products
+
+We denote by \f$\Rset^n\f$ the \f$n\textrm{-dimensional}\f$ vector space on the field
+of real numbers \f$\Rset\f$, endowed with the standard topology.
+The set of all non-negative reals is denoted by \f$\nonnegRset\f$.
+For each \f$i \in \{0, \ldots, n-1\}\f$, \f$v_i\f$ denotes
+the \f$i\textrm{-th}\f$ component of the (column) vector
+\f$\vect{v} = (v_0, \ldots, v_{n-1})^\transpose \in \Rset^n\f$.
+We denote by \f$\vect{0}\f$ the vector of \f$\Rset^n\f$,
+called <EM>the origin</EM>, having all components equal to zero.
+A vector \f$\vect{v} \in \Rset^n\f$ can be also interpreted
+as a matrix in \f$\Rset^{n \times 1}\f$ and manipulated accordingly
+using the usual definitions for addition, multiplication
+(both by a scalar and by another matrix), and transposition,
+denoted by \f$\vect{v}^\transpose\f$.
+
+The <EM>scalar product</EM> of \f$\vect{v},\vect{w} \in \Rset^n\f$,
+denoted \f$\langle \vect{v}, \vect{w} \rangle\f$,
+is the real number
+\f[
+  \vect{v}^\transpose \vect{w} = \sum_{i=0}^{n-1} v_i w_i.
+\f]
+
+For any \f$S_1, S_2 \sseq \Rset^n\f$, the <EM>Minkowski's sum</EM> of
+\f$S_1\f$ and \f$S_2\f$ is:
+\f$S_1 + S_2 = \{\, \vect{v}_1 + \vect{v}_2 \mid
+                \vect{v}_1 \in S_1, \vect{v}_2 \in S_2 \,\}.\f$
+
+
+\subsection Affine_Hyperplanes_and_Half_spaces Affine Hyperplanes and Half-spaces
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+where \f$\vect{a} \neq \vect{0}\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+defines:
+- an affine hyperplane if it is an equality constraint,
+  i.e., if \f$\mathord{\relsym} \in \{ = \}\f$;
+- a topologically closed affine half-space if it is
+  a non-strict inequality constraint,
+  i.e., if \f$\mathord{\relsym} \in \{ \geq \}\f$;
+- a topologically open affine half-space if it is
+  a strict inequality constraint,
+  i.e., if \f$\mathord{\relsym} \in \{ > \}\f$.
+
+Note that each hyperplane \f$\langle \vect{a}, \vect{x} \rangle = b\f$
+can be defined as the intersection of the two closed affine half-spaces
+\f$\langle \vect{a}, \vect{x} \rangle \geq b\f$ and
+\f$\langle -\vect{a}, \vect{x} \rangle \geq -b\f$.
+Also note that, when \f$\vect{a} = \vect{0}\f$,
+the constraint \f$\langle \vect{0}, \vect{x} \rangle \relsym b\f$
+is either a tautology (i.e., always true)
+or inconsistent (i.e., always false), so that it defines
+either the whole vector space \f$\Rset^n\f$ or the empty set \f$\emptyset\f$.
+
+
+\subsection Convex_Polyhedra Convex Polyhedra
+
+The set \f$\cP \sseq \Rset^n\f$ is a
+<EM>not necessarily closed convex polyhedron</EM>
+(<EM>NNC polyhedron</EM>, for short) if and only if either
+\f$\cP\f$ can be expressed as the intersection of a finite number
+of (open or closed) affine half-spaces of \f$\Rset^n\f$
+or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+The set of all NNC polyhedra on the vector space \f$\Rset^n\f$
+is denoted \f$\Pset_n\f$.
+
+The set \f$\cP \in \Pset_n\f$ is a <EM>closed convex polyhedron</EM>
+(<EM>closed polyhedron</EM>, for short) if and only if either
+\f$\cP\f$ can be expressed as the intersection of a finite number
+of closed affine half-spaces of \f$\Rset^n\f$
+or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+The set of all closed polyhedra on the vector space \f$\Rset^n\f$
+is denoted \f$\CPset_n\f$.
+
+When ordering NNC polyhedra by the set inclusion relation,
+the empty set \f$\emptyset\f$ and the vector space \f$\Rset^n\f$
+are, respectively, the smallest and the biggest elements of both
+\f$\Pset_n\f$ and \f$\CPset_n\f$.
+The vector space \f$\Rset^n\f$ is also called the <EM>universe</EM> polyhedron.
+
+In theoretical terms,
+\f$\Pset_n\f$ is a <EM>lattice</EM> under set inclusion and
+\f$\CPset_n\f$ is a <EM>sub-lattice</EM> of \f$\Pset_n\f$.
+
+\note
+In the following, we will usually specify operators on the domain
+\f$\Pset_n\f$ of NNC polyhedra. Unless an explicit distinction is
+made, these operators are provided with the same specification when
+applied to the domain \f$\CPset_n\f$ of topologically closed
+polyhedra.  The implementation maintains a clearer separation between
+the two domains of polyhedra
+(see \ref Topologies_and_Topological_compatibility "Topologies and Topological-compatibility"):
+while computing polyhedra in \f$\Pset_n\f$ may provide more precise
+results, polyhedra in \f$\CPset_n\f$ can be represented and
+manipulated more efficiently.  As a rule of thumb, if your application
+will only manipulate polyhedra that are topologically closed, then it
+should use the simpler domain \f$\CPset_n\f$. Using NNC polyhedra is
+only recommended if you are going to actually benefit from the
+increased accuracy.
+
+
+\subsection Bounded_Polyhedra Bounded Polyhedra
+
+An NNC polyhedron \f$\cP \in \Pset_n\f$ is <EM>bounded</EM>
+if there exists a \f$\lambda \in \nonnegRset\f$ such that:
+\f[
+  \cP
+    \sseq
+      \bigl\{\,
+        \vect{x} \in \Rset^n
+      \bigm|
+        - \lambda \leq x_j \leq \lambda \text{ for } j = 0, \ldots, n-1
+      \,\bigr\}.
+\f]
+A bounded polyhedron is also called a <EM>polytope</EM>.
+
+
+\section representation Representations of Convex Polyhedra
+
+NNC polyhedra can be specified by using two possible representations,
+the constraints (or implicit) representation and
+the generators (or parametric) representation.
+
+
+\subsection Constraints_Representation Constraints Representation
+
+In the sequel, we will simply write ``equality'' and ``inequality''
+to mean ``linear equality'' and ``linear inequality'', respectively;
+also, we will refer to either an equality or an inequality
+as a <EM>constraint</EM>.
+
+By definition, each polyhedron \f$\cP \in \Pset_n\f$ is the set of solutions
+to a <EM>constraint system</EM>, i.e., a finite number of constraints.
+By using matrix notation, we have
+\f[
+  \cP
+    \defeq
+      \{\,
+        \vect{x} \in \Rset^n
+      \mid
+        A_1 \vect{x} =    \vect{b}_1,
+        A_2 \vect{x} \geq \vect{b}_2,
+        A_3 \vect{x} >    \vect{b}_3
+      \,\},
+\f]
+where, for all \f$i \in \{1, 2, 3\}\f$,
+\f$A_i \in \Rset^{m_i} \times \Rset^n\f$ and \f$\vect{b}_i \in \Rset^{m_i}\f$,
+and \f$m_1, m_2, m_3 \in \Nset\f$ are
+the number of equalities,
+the number of non-strict inequalities, and
+the number of strict inequalities,
+respectively.
+
+
+\subsection Combinations_and_Hulls Combinations and Hulls
+
+Let \f$S = \{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+be a finite set of vectors.
+For all scalars \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the vector \f$\vect{v} = \sum_{j=1}^k \lambda_j \vect{x}_j\f$
+is said to be a <EM>linear</EM> combination of the vectors in \f$S\f$.
+Such a combination is said to be
+- a <EM>positive</EM> (or <EM>conic</EM>) combination,
+  if \f$\forall j \in \{ 1, \ldots, k \} \itc \lambda_j \in \nonnegRset\f$;
+- an <EM>affine</EM> combination, if \f$\sum_{j = 1}^k \lambda_j = 1\f$;
+- a <EM>convex</EM> combination, if it is both positive and affine.
+
+We denote by \f$\linearhull(S)\f$
+(resp., \f$\conichull(S)\f$, \f$\affinehull(S)\f$, \f$\convexhull(S)\f$)
+the set of all the linear (resp., positive, affine, convex)
+combinations of the vectors in \f$S\f$.
+
+Let \f$P, C \sseq \Rset^n\f$, where \f$P \union C = S\f$.
+We denote by  \f$\NNChull(P, C)\f$ the set of all convex combinations
+of the vectors in \f$S\f$
+such that \f$\lambda_j > 0\f$ for some \f$\vect{x}_j \in P\f$
+(informally, we say that there exists a vector of \f$P\f$ that
+plays an active role in the convex combination).
+Note that \f$\NNChull(P, C) = \NNChull(P, P \union C)\f$
+so that, if \f$C \sseq P\f$,
+\f[
+   \convexhull(P)
+     = \NNChull(P, \emptyset)
+     = \NNChull(P, P)
+     = \NNChull(P, C).
+\f]
+It can be observed that
+\f$\linearhull(S)\f$ is an affine space,
+\f$\conichull(S)\f$ is a topologically closed convex cone,
+\f$\convexhull(S)\f$ is a topologically closed polytope, and
+\f$\NNChull(P, C)\f$ is an NNC polytope.
+
+
+\subsection Points_Closure_Points_Rays_and_Lines Points, Closure Points, Rays and Lines
+
+Let \f$\cP \in \Pset_n\f$ be an NNC polyhedron. Then
+- a vector \f$\vect{p} \in \cP\f$ is called a <EM>point</EM> of \f$\cP\f$;
+- a vector \f$\vect{c} \in \Rset^n\f$ is called a
+  <EM>closure point</EM> of \f$\cP\f$ if it is a point
+  of the topological closure of \f$\cP\f$;
+- a vector \f$\vect{r} \in \Rset^n\f$, where \f$\vect{r} \neq \vect{0}\f$,
+  is called a <EM>ray</EM> (or direction of infinity) of \f$\cP\f$
+  if \f$\cP \neq \emptyset\f$ and \f$\vect{p} + \lambda \vect{r} \in \cP\f$,
+  for all points \f$\vect{p} \in \cP\f$ and all \f$\lambda \in \nonnegRset\f$;
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>line</EM> of \f$\cP\f$
+  if both \f$\vect{l}\f$ and \f$-\vect{l}\f$ are rays of \f$\cP\f$.
+
+A point of an NNC polyhedron \f$\cP \in \Pset_n\f$ is a
+<EM>vertex</EM> if and only if
+it cannot be expressed as a convex combination of any other pair of
+distinct points in \f$\cP\f$.
+A ray \f$\vect{r}\f$ of a polyhedron \f$\cP\f$ is an <EM>extreme ray</EM>
+if and only if it cannot be expressed as
+a positive combination of any other pair
+\f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ of rays of \f$\cP\f$,
+where
+\f$\vect{r} \neq \lambda \vect{r}_1\f$,
+\f$\vect{r} \neq \lambda \vect{r}_2\f$ and
+\f$\vect{r}_1 \neq \lambda \vect{r}_2\f$
+for all \f$\lambda \in \nonnegRset\f$
+(i.e., rays differing by a positive scalar factor are considered
+to be the same ray).
+
+
+\subsection Generators_Representation Generators Representation
+
+Each NNC polyhedron \f$\cP \in \Pset_n\f$ can be represented by
+finite sets of lines \f$L\f$, rays \f$R\f$,
+points \f$P\f$ and closure points \f$C\f$ of \f$\cP\f$.
+The 4-tuple \f$\cG = (L, R, P, C)\f$ is said to be
+a <EM>generator system</EM> for \f$\cP\f$,
+in the sense that
+\f[
+  \cP = \linearhull(L) + \conichull(R) + \NNChull(P, C),
+\f]
+where the symbol '\f$+\f$' denotes the Minkowski's sum.
+
+When \f$\cP \in \CPset_n\f$ is a closed polyhedron,
+then it can be represented by
+finite sets of lines \f$L\f$, rays \f$R\f$ and
+points \f$P\f$ of \f$\cP\f$.
+In this case, the 3-tuple \f$\cG = (L, R, P)\f$ is said to be
+a <EM>generator system</EM> for \f$\cP\f$ since we have
+\f[
+  \cP = \linearhull(L) + \conichull(R) + \convexhull(P).
+\f]
+Thus, in this case,
+every closure point of \f$\cP\f$ is a point of \f$\cP\f$.
+
+For any \f$\cP \in \Pset_n\f$ and generator system \f$\cG = (L, R, P, C)\f$
+for \f$\cP\f$, we have
+ \f$\cP = \emptyset\f$ if and only if \f$P = \emptyset\f$.
+Also \f$P\f$ must contain all the vertices of \f$\cP\f$
+although \f$\cP\f$ can be non-empty and have no vertices.
+In this case, as \f$P\f$ is necessarily non-empty, it must
+contain points of \f$\cP\f$ that are <EM>not</EM> vertices.
+For instance, the half-space of \f$\Rset^2\f$ corresponding to the single
+constraint \f$y \geq 0\f$ can be represented by the generator system
+\f$\cG = (L, R, P, C)\f$ such that
+\f$L = \bigl\{ (1, 0)^\transpose \bigr\}\f$,
+\f$R = \bigl\{ (0, 1)^\transpose \bigr\}\f$,
+\f$P = \bigl\{ (0, 0)^\transpose \bigr\}\f$, and
+\f$C = \emptyset\f$.
+It is also worth noting that the only ray in \f$R\f$
+is <EM>not</EM> an extreme ray of \f$\cP\f$.
+
+\subsection Minimized_Representations Minimized Representations
+
+A constraints system \f$\cC\f$ for an NNC polyhedron \f$\cP \in \Pset_n\f$
+is said to be <EM>minimized</EM> if no proper subset of \f$\cC\f$ is
+a constraint system for \f$\cP\f$.
+
+Similarly, a generator system \f$\cG = (L, R, P, C)\f$
+for an NNC polyhedron \f$\cP \in \Pset_n\f$ is said to be <EM>minimized</EM>
+if there does not exist a generator system
+\f$\cG' = (L', R', P', C') \neq \cG\f$ for \f$\cP\f$
+such that \f$L' \sseq L\f$, \f$R' \sseq R\f$, \f$P' \sseq P\f$ and
+\f$C' \sseq C\f$.
+
+
+\subsection Double_Description Double Description
+
+Any NNC polyhedron \f$\cP\f$ can be described by using
+a constraint system \f$\cC\f$, a generator system \f$\cG\f$, or
+both by means of the <EM>double description pair (DD pair)</EM>
+\f$(\cC, \cG)\f$.
+The <EM>double description method</EM> is a collection
+of well-known as well as novel theoretical results showing that,
+given one kind of representation, there are algorithms
+for computing a representation of the other kind
+and for minimizing both representations by removing
+redundant constraints/generators.
+
+Such changes of representation form a key step
+in the implementation of many operators on NNC polyhedra:
+this is because some operators, such as intersections and poly-hulls,
+are provided with a natural and efficient implementation
+when using one of the representations in a DD pair,
+while being rather cumbersome when using the other.
+
+
+\subsection Topologies_and_Topological_compatibility Topologies and Topological-compatibility
+
+As indicated above, when an NNC polyhedron \f$\cP\f$ is necessarily closed,
+we can ignore the closure points contained in its generator system
+\f$\cG = (L, R, P, C)\f$ (as every closure point is also a point)
+and represent \f$\cP\f$ by the triple \f$(L, R, P)\f$.
+Similarly, \f$\cP\f$ can be represented by a constraint system
+that has no strict inequalities.
+Thus a necessarily closed polyhedron can have a smaller representation
+than one that is not necessarily closed.
+Moreover, operators restricted to work on closed polyhedra only
+can be implemented more efficiently.
+For this reason the library provides two alternative
+``topological kinds'' for a polyhedron, <EM>NNC</EM> and <EM>C</EM>.
+We shall abuse terminology by referring to the topological kind of
+a polyhedron as its <EM>topology</EM>.
+
+In the library, the topology of each polyhedron object is fixed
+once for all at the time of its creation and must be respected
+when performing operations on the polyhedron.
+
+Unless it is otherwise stated,
+all the polyhedra, constraints and/or generators in any library operation
+must obey the following <EM>topological-compatibility</EM> rules:
+- polyhedra are topologically-compatible if and only if they have
+  the same topology;
+- all constraints except for strict inequality constraints
+  and all generators except for closure points are
+  topologically-compatible with both C and NNC polyhedra;
+- strict inequality constraints and closure points are
+  topologically-compatible with a polyhedron if and only if it is NNC.
+
+Wherever possible,
+the library provides methods that, starting from a polyhedron of
+a given topology, build the corresponding polyhedron having
+the other topology.
+
+
+\subsection Space_Dimensions_and_Dimension_Compatibility Space Dimensions and Dimension Compatibility
+
+The <EM>space dimension</EM> of an NNC polyhedron \f$\cP \in \Pset_n\f$
+(resp., a C polyhedron \f$\cP \in \CPset_n\f$) is the dimension
+\f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
+The space dimension of constraints, generators and other objects
+of the library is defined similarly.
+
+Unless it is otherwise stated,
+all the polyhedra, constraints and/or generators in any library operation
+must obey the following (space) <EM>dimension-compatibility</EM> rules:
+- polyhedra are dimension-compatible if and only if they have
+  the same space dimension;
+- the constraint
+  \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+  where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+  and \f$\vect{a}, \vect{x} \in \Rset^m\f$, is dimension-compatible
+  with a polyhedron having space dimension \f$n\f$
+  if and only if \f$m \leq n\f$;
+- the generator \f$\vect{x} \in \Rset^m\f$ is dimension-compatible
+  with a polyhedron having space dimension \f$n\f$
+  if and only if \f$m \leq n\f$;
+- a system of constraints (resp., generators) is dimension-compatible with
+  a polyhedron if and only if all the constraints (resp., generators)
+  in the system are dimension-compatible with the polyhedron.
+
+While the space dimension of a constraint, a generator or a system thereof
+is automatically adjusted when needed, the space dimension of a polyhedron
+can only be changed by explicit calls to operators provided for that
+purpose.
+
+\subsection Affine_Independence_and_Affine_Dimension Affine Independence and Affine Dimension
+
+A finite set of points
+\f$\{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$ is
+<EM>affinely independent</EM> if,
+for all \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the system of equations
+\f[
+  \sum_{i = 1}^k \lambda_i \vect{x}_i = \vect{0},
+    \quad
+  \sum_{i = 1}^k \lambda_i = 0
+\f]
+implies that, for each \f$i = 1, \ldots, k\f$, \f$\lambda_i = 0\f$.
+
+The maximum number of affinely independent points in \f$\Rset^n\f$
+is \f$n + 1\f$.
+
+A <EM>non-empty</EM> NNC polyhedron \f$\cP \in \Pset_n\f$ has
+<EM>affine dimension</EM> \f$k \in \Nset\f$, denoted by \f$\pdim(\cP) = k\f$,
+if the maximum number of affinely independent points in \f$\cP\f$ is
+\f$k + 1\f$.
+
+We remark that the above definition only applies to polyhedra
+that are not empty, so that \f$0 \leq \pdim(\cP) \leq n\f$.
+By convention, the affine dimension of an empty polyhedron is 0
+(even though the ``natural'' generalization of the definition above
+would imply that the affine dimension of an empty polyhedron is \f$-1\f$).
+
+\note
+The affine dimension \f$k \leq n\f$ of an NNC polyhedron \f$\cP \in \Pset_n\f$
+must not be confused with the space dimension \f$n\f$ of \f$\cP\f$,
+which is the dimension of the enclosing vector space \f$\Rset^n\f$.
+In particular, we can have \f$\pdim(\cP) \neq \pdim(\cQ)\f$ even though
+\f$\cP\f$ and \f$\cQ\f$ are dimension-compatible;
+and vice versa, \f$\cP\f$ and \f$\cQ\f$ may be dimension-incompatible
+polyhedra even though \f$\pdim(\cP) = \pdim(\cQ)\f$.
+
+
+\subsection Rational_Polyhedra Rational Polyhedra
+
+An NNC polyhedron is called <EM>rational</EM>
+if it can be represented by a constraint system where
+all the constraints have rational coefficients.
+It has been shown that an NNC polyhedron is rational
+if and only if it can be represented by a generator system where
+all the generators have rational coefficients.
+
+The library only supports rational polyhedra.
+The restriction to rational numbers applies not only to polyhedra,
+but also to the other numeric arguments that may be required
+by the operators considered, such as the coefficients defining
+(rational) affine transformations.
+
+
+\section Operations_on_Convex_Polyhedra Operations on Convex Polyhedra
+
+In this section we briefly describe operations on NNC polyhedra
+that are provided by the library.
+
+\subsection Intersection_and_Convex_Polyhedral_Hull Intersection and Convex Polyhedral Hull
+
+For any pair of NNC polyhedra \f$\cP_1, \cP_2 \in \Pset_n\f$,
+the <EM>intersection</EM> of \f$\cP_1\f$ and \f$\cP_2\f$,
+defined as the set intersection \f$\cP_1 \inters \cP_2\f$,
+is the biggest NNC polyhedron included in both \f$\cP_1\f$ and \f$\cP_2\f$;
+similarly, the <EM>convex polyhedral hull</EM> (or <EM>poly-hull</EM>)
+of \f$\cP_1\f$ and \f$\cP_2\f$, denoted by \f$\cP_1 \uplus \cP_2\f$,
+is the smallest NNC polyhedron that includes both
+\f$\cP_1\f$ and \f$\cP_2\f$.
+The intersection and poly-hull of any pair of closed polyhedra
+in \f$\CPset_n\f$ is also closed.
+
+In theoretical terms,
+the intersection and poly-hull operators defined above
+are the binary <EM>meet</EM> and the binary <EM>join</EM>
+operators on the lattices \f$\Pset_n\f$ and \f$\CPset_n\f$.
+
+\subsection Convex_Polyhedral_Difference Convex Polyhedral Difference
+
+For any pair of NNC polyhedra \f$\cP_1, \cP_2 \in \Pset_n\f$,
+the <EM>convex polyhedral difference</EM> (or <EM>poly-difference</EM>)
+of \f$\cP_1\f$ and \f$\cP_2\f$ is defined as the smallest
+convex polyhedron containing the set-theoretic difference
+of \f$\cP_1\f$ and \f$\cP_2\f$.
+
+In general, even though \f$\cP_1, \cP_2 \in \CPset_n\f$
+are topologically closed polyhedra, their poly-difference may be
+a convex polyhedron that is not topologically closed.
+For this reason, when computing the poly-difference of two
+C polyhedra, the library will enforce the topological closure
+of the result.
+
+\subsection Concatenating_Polyhedra Concatenating Polyhedra
+
+Viewing a polyhedron as a set of tuples (its points), it is sometimes
+useful to consider the set of tuples obtained by concatenating
+an ordered pair of polyhedra.
+Formally, the <EM>concatenation</EM> of the polyhedra
+\f$\cP \in \Pset_n\f$ and \f$\cQ \in \Pset_m\f$ (taken in this order)
+is the polyhedron \f$\cR \in \Pset_{n+m}\f$ such that
+\f[
+  \cR
+    \defeq
+      \Bigl\{\,
+        (x_0, \ldots, x_{n-1}, y_0, \ldots, y_{m-1})^\transpose
+          \in \Rset^{n+m}
+      \Bigm|
+        (x_0, \ldots, x_{n-1})^\transpose \in \cP,
+        (y_0, \ldots, y_{m-1})^\transpose \in \cQ
+      \,\Bigl\}.
+\f]
+Another way of seeing it is as follows: first embed polyhedron \f$\cP\f$
+into a vector space of dimension \f$n+m\f$ and then add a suitably
+renamed-apart version of the constraints defining \f$\cQ\f$.
+
+\subsection Adding_New_Dimensions_to_the_Vector_Space Adding New Dimensions to the Vector Space
+
+The library provides two operators for adding a number \f$i\f$ of
+space dimensions to an NNC polyhedron \f$\cP \in \Pset_n\f$,
+therefore transforming it into a new NNC polyhedron
+\f$\cQ \in \Pset_{n+i}\f$.
+In both cases, the added dimensions of the vector space
+are those having the highest indices.
+
+The operator <CODE>add_space_dimensions_and_embed</CODE>
+\e embeds the polyhedron \f$\cP\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the polyhedron \f$\cQ\f$
+defined by all and only the constraints defining \f$\cP\f$
+(the variables corresponding to the added dimensions are unconstrained).
+For instance, when starting from a polyhedron \f$\cP \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the polyhedron
+\f[
+ \cQ = \bigl\{\,
+         (x_0, x_1, x_2)^\transpose \in \Rset^3
+       \bigm|
+         (x_0, x_1)^\transpose \in \cP
+       \,\bigr\}.
+\f]
+
+In contrast, the operator  <CODE>add_space_dimensions_and_project</CODE>
+\e projects the polyhedron \f$\cP\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the polyhedron \f$\cQ\f$
+whose constraint system, besides the constraints defining \f$\cP\f$,
+will include additional constraints on the added dimensions.
+Namely, the corresponding variables are all constrained to be equal to 0.
+For instance, when starting from a polyhedron \f$\cP \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the polyhedron
+\f[
+  \cQ = \bigl\{\,
+          (x_0, x_1, 0)^\transpose \in \Rset^3
+        \bigm|
+          (x_0, x_1)^\transpose \in \cP
+        \,\bigr\}.
+\f]
+
+\subsection Removing_Dimensions_from_the_Vector_Space Removing Dimensions from the Vector Space
+
+The library provides two operators for removing
+space dimensions from an NNC polyhedron \f$\cP \in \Pset_n\f$,
+therefore transforming it into a new NNC polyhedron
+\f$\cQ \in \Pset_m\f$ where \f$m \leq n\f$.
+
+Given a set of variables, the operator <CODE>remove_space_dimensions</CODE>
+removes all the space dimensions specified by the variables in the set.
+For instance, letting \f$\cP \in \Pset_4\f$ be the singleton set
+\f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$,
+then after invoking this operator with the set of variables
+\f$\{x_1, x_2\}\f$ the resulting polyhedron is
+\f[
+  \cQ = \bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2.
+\f]
+
+Given a space dimension \f$m\f$ less than or equal to that of the polyhedron,
+the operator <CODE>remove_higher_space_dimensions</CODE> removes
+the space dimensions having indices greater than or equal to \f$m\f$.
+For instance, letting \f$\cP \in \Pset_4\f$ defined as before,
+by invoking this operator with \f$m = 2\f$ the resulting polyhedron
+will be
+\f[
+  \cQ = \bigl\{ (3, 1)^\transpose \bigr\} \sseq \Rset^2.
+\f]
+
+\subsection Mapping_the_Dimensions_of_the_Vector_Space Mapping the Dimensions of the Vector Space
+
+The operator <CODE>map_space_dimensions</CODE> provided by the library
+maps the dimensions of the vector space \f$\Rset^n\f$ according
+to a partial injective function \f$\pard{\rho}{\{0, \ldots, n-1\}}{\Nset}\f$
+such that \f$\rho\bigl(\{0, \ldots, n-1\}\bigr) = \{0, \ldots, m-1\}\f$
+with \f$m \leq n\f$.
+Dimensions corresponding to indices that are not mapped
+by \f$\rho\f$ are removed.
+
+If \f$m = 0\f$, i.e., if the function \f$\rho\f$ is undefined everywhere,
+then the operator projects the argument polyhedron \f$\cP \in \Pset_n\f$
+onto the zero-dimension space \f$\Rset^0\f$;
+otherwise the result is \f$\cQ \in \Pset_m\f$ given by
+\f[
+  \cQ
+    \defeq
+      \Bigl\{\,
+        \bigl(v_{\rho^{-1}(0)}, \ldots, v_{\rho^{-1}(m-1)}\bigr)^\transpose
+      \Bigm|
+        (v_0, \ldots, v_{n-1})^\transpose \in \cP
+      \,\Bigr\}.
+\f]
+
+\anchor expand_space_dimension
+\subsection Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions Expanding One Dimension of the Vector Space to Multiple Dimensions
+
+The operator <CODE>expand_space_dimension</CODE> provided by the library
+adds \f$m\f$ new space dimensions to a polyhedron \f$\cP \in \Pset_n\f$,
+with \f$n > 0\f$, so that dimensions
+\f$n\f$, \f$n+1\f$, \f$\ldots\f$, \f$n+m-1\f$
+of the result \f$\cQ\f$ are exact copies of the \f$i\f$-th space dimension
+of \f$\cP\f$.  More formally,
+\f[
+  \cQ
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n+m}
+      }{
+        \exists \vect{v}, \vect{w} \in \cP
+          \st u_i = v_i \\
+          \qquad \mathord{} \land \forall j = n, n+1, \ldots, n+m-1
+                                     \itc u_j = w_i \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_k = v_k = w_k
+      }.
+\f]
+This operation has been proposed in \ref GDDetal04 "[GDDetal04]".
+
+
+\anchor fold_space_dimensions
+\subsection Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension Folding Multiple Dimensions of the Vector Space into One Dimension
+
+The operator <CODE>fold_space_dimensions</CODE> provided by the library,
+given a polyhedron \f$\cP \in \Pset_n\f$, with \f$n > 0\f$,
+folds a set of space dimensions \f$J = \{ j_0, \ldots, j_{m-1} \}\f$,
+with \f$m < n\f$ and \f$j < n\f$ for each \f$j \in J\f$,
+into space dimension \f$i < n\f$, where \f$i \notin J\f$.
+The result is given by
+\f[
+  \cQ \defeq \biguplus_{d = 0}^m \cQ_d
+\f]
+where
+\f[
+  \cQ_m
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n-m}
+      }{
+        \exists \vect{v} \in \cP
+          \st u_{i'} = v_i \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_{k'} = v_k
+      }
+\f]
+and, for \f$ d = 0 \f$, \f$ \ldots \f$, \f$ m-1 \f$,
+\f[
+  \cQ_d
+    \defeq
+      \sset{
+        \vect{u} \in \Rset^{n-m}
+      }{
+        \exists \vect{v} \in \cP
+          \st u_{i'} = v_{j_d} \\
+          \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+                                     \itc k \neq i \implies u_{k'} = v_k
+      },
+\f]
+and, finally, for \f$ k = 0 \f$, \f$ \ldots \f$, \f$ n-1 \f$,
+\f[
+  k'
+    \defeq
+      k - \card \{\, j \in J \mid k > j \,\},
+\f]
+(\f$\card S\f$ denotes the cardinality of the finite set \f$S\f$).
+
+This operation has been proposed in \ref GDDetal04 "[GDDetal04]".
+
+
+\anchor affine_relation
+\subsection Images_and_Preimages_of_Affine_Transfer_Relations Images and Preimages of Affine Transfer Relations
+
+For each relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$,
+we denote by \f$\phi(S) \sseq \Rset^m\f$ the <EM>image</EM>
+under \f$\phi\f$ of the set \f$S \sseq \Rset^n\f$; formally,
+\f[
+  \phi(S)
+    \defeq
+      \bigl\{\,
+        \vect{w} \in \Rset^m
+      \bigm|
+        \exists \vect{v} \in S \st
+          (\vect{v}, \vect{w}) \in \phi
+      \,\bigr\}.
+\f]
+Similarly, we denote by \f$\phi^{-1}(S') \sseq \Rset^n\f$
+the <EM>preimage</EM> under \f$\phi\f$ of \f$S' \sseq \Rset^m\f$,
+that is
+\f[
+  \phi^{-1}(S')
+    \defeq
+      \bigl\{\,
+        \vect{v} \in \Rset^n
+      \bigm|
+        \exists \vect{w} \in S' \st
+          (\vect{v}, \vect{w}) \in \phi
+      \,\bigr\}.
+\f]
+If \f$n = m\f$, then the relation \f$\phi\f$ is said to be
+<EM>space dimension preserving</EM>.
+
+The relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$
+is said to be an <EM>affine relation</EM>
+if there exists \f$\ell \in \Nset\f$ such that
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^m
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigland_{i=1}^{\ell}
+            \bigl(
+              \langle \vect{c}_i, \vect{w} \rangle
+                \relsym_i
+                  \langle \vect{a}_i, \vect{v} \rangle + b_i
+            \bigr),
+\f]
+where
+\f$\vect{a}_i \in \Rset^n\f$,
+\f$\vect{c}_i \in \Rset^m\f$,
+\f$b_i \in \Rset\f$ and
+\f$\mathord{\relsym}_i \in \{ <, \leq, =, \geq, > \}\f$,
+for each \f$i = 1, \ldots, \ell\f$.
+
+As a special case, the relation \f$\reld{\phi}{\Rset^n}{\Rset^m}\f$
+is an <EM>affine function</EM> if and only if there exist
+a matrix \f$A \in \Rset^m \times \Rset^n\f$ and
+a vector \f$\vect{b} \in \Rset^m\f$ such that,
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^m
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \vect{w} = A\vect{v} + \vect{b}.
+\f]
+
+The set \f$\Pset_n\f$ of NNC polyhedra is closed under the application
+of images and preimages of any space dimension preserving affine relation.
+The same property holds for the set \f$\CPset_n\f$ of closed polyhedra,
+provided the affine relation makes no use of the strict relation symbols
+\f$<\f$ and \f$>\f$.
+Images and preimages of affine relations can be used to model
+several kinds of transition relations, including
+deterministic assignments of affine expressions,
+(affinely constrained) nondeterministic assignments and
+affine conditional guards.
+
+A space dimension preserving relation
+\f$\reld{\phi}{\Rset^n}{\Rset^n}\f$
+can be specified by means of a shorthand notation:
+ - the vector \f$\vect{x} = (x_0, \ldots, x_{n-1})^\transpose\f$
+   of <EM>unprimed</EM> variables is used to represent the
+   space dimensions of the domain of \f$\phi\f$;
+ - the vector \f$\vect{x}' = (x'_0, \ldots, x'_{n-1})^\transpose\f$
+   of <EM>primed</EM> variables is used to represent the
+   space dimensions of the range of \f$\phi\f$;
+ - any primed variable that ``does not occur'' in the shorthand
+   specification is meant to be <EM>unaffected</EM> by the relation;
+   namely, for each index \f$i \in \{0, \ldots, n-1\}\f$,
+   if in the syntactic specification of the relation
+   the primed variable \f$x'_i\f$ only occurs (if ever) with
+   coefficient 0, then it is assumed that the specification also
+   contains the constraint \f$x'_i = x_i\f$.
+
+As an example, assuming \f$\reld{\phi}{\Rset^3}{\Rset^3}\f$,
+the notation \f$x'_0 - x'_2 \geq 2 x_0 - x_1\f$, where the primed
+variable \f$x'_1\f$ does not occur, is meant to specify
+the affine relation defined by
+\f[
+  \forall \vect{v} \in \Rset^3, \vect{w} \in \Rset^3
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          (w_0 - w_2 \geq 2 v_0 - v_1) \land (w_1 = v_1).
+\f]
+The same relation is specified by
+\f$x'_0 + 0 \cdot x'_1 - x'_2 \geq 2 x_0 - x_1\f$,
+since \f$x'_1\f$ occurs with coefficient 0.
+
+The library allows for the computation of images and preimages
+of polyhedra under restricted subclasses of space dimension preserving
+affine relations, as described in the following.
+
+\subsection Single_Update_Affine_Functions Single-Update Affine Functions.
+Given a primed variable \f$x'_k\f$ and an unprimed affine expression
+\f$\langle \vect{a}, \vect{x} \rangle + b\f$,
+the <EM>affine function</EM>
+\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)}
+        {\Rset^n}{\Rset^n}\f$
+is defined by
+\f[
+  \forall \vect{v} \in \Rset^n \itc
+    \phi(\vect{v}) = A\vect{v} + \vect{b},
+\f]
+where
+\f[
+ A =
+   \begin{pmatrix}
+      1      &        &    0    &   0    & \cdots  & \cdots &    0    \\
+             & \ddots &         & \vdots &         &        & \vdots  \\
+      0      &        &    1    &   0    & \cdots  & \cdots &    0    \\
+     a_0     & \cdots & a_{k-1} &  a_k   & a_{k+1} & \cdots & a_{n-1} \\
+      0      & \cdots & \cdots  &   0    &   1     &        &    0    \\
+    \vdots   &        &         & \vdots &         & \ddots &         \\
+      0      & \cdots & \cdots  &   0    &   0     &        &    1
+   \end{pmatrix}, \qquad
+ \vect{b} =
+   \begin{pmatrix}
+     0      \\
+     \vdots \\
+     0      \\
+     b      \\
+     0      \\
+     \vdots \\
+     0
+   \end{pmatrix}
+\f]
+and the \f$a_i\f$ (resp., \f$b\f$) occur in the \f$(k+1)\f$st row
+in \f$A\f$ (resp., position in \f$\vect{b}\f$).
+Thus function \f$\phi\f$ maps any vector
+\f$(v_0, \ldots, v_{n-1})^\transpose\f$
+to
+\f[
+   \Bigl(v_0, \ldots,
+           \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr),
+             \ldots, v_{n-1}\Bigr)^\transpose.
+\f]
+
+The <EM>affine image</EM> operator computes the affine image
+of a polyhedron \f$\cP\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance, suppose the polyhedron \f$\cP\f$
+to be transformed is the square in \f$\Rset^2\f$
+generated by the set of points
+\f$\bigl\{
+     (0, 0)^\transpose,
+     (0, 3)^\transpose,
+     (3, 0)^\transpose,
+     (3, 3)^\transpose
+   \bigr\}\f$.
+Then, if the primed variable is \f$x_0\f$ and
+the affine expression is \f$x_0 + 2 x_1 + 4\f$
+(so that \f$k = 0\f$, \f$a_0 = 1, a_1 = 2, b = 4\f$),
+the affine image operator will translate \f$\cP\f$
+to the parallelogram \f$\cP_1\f$ generated by the set of points
+\f$\bigl\{
+     (4, 0)^\transpose,
+     (10, 3)^\transpose,
+     (7, 0)^\transpose,
+     (13, 3)^\transpose
+   \bigr\}\f$
+with height equal to the side of the square
+and oblique sides parallel to the line \f$x_0 - 2 x_1\f$.
+If the primed variable is as before (i.e., \f$k = 0\f$)
+but the affine expression is \f$x_1\f$
+(so that \f$a_0 = 0, a_1 = 1, b = 0\f$),
+then the resulting polyhedron \f$\cP_2\f$
+is the positive diagonal of the square.
+
+The <EM>affine preimage</EM> operator computes the affine preimage
+of a polyhedron \f$\cP\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance,
+suppose now that we apply the affine
+preimage operator as given in the first example
+using primed variable \f$x_0\f$
+and affine expression \f$x_0 + 2 x_1 + 4\f$
+to the parallelogram \f$\cP_1\f$;
+then we get the original square \f$\cP\f$ back.
+If, on the other hand, we apply the affine
+preimage operator as given in the second example
+using primed variable \f$x_0\f$ and affine expression \f$x_1\f$
+to \f$\cP_2\f$, then the resulting polyhedron is the stripe obtained
+by adding the line \f$(1, 0)^\transpose\f$ to polyhedron \f$\cP_2\f$.
+
+Observe that provided the coefficient \f$a_k\f$ of the considered variable
+in the affine expression is non-zero, the affine function is invertible.
+
+\subsection Single_Update_Bounded_Affine_Relations Single-Update Bounded Affine Relations.
+Given a primed variable \f$x'_k\f$ and
+two unprimed affine expressions
+\f$\mathrm{lb} = \langle \vect{a}, \vect{x} \rangle + b\f$ and
+\f$\mathrm{ub} = \langle \vect{c}, \vect{x} \rangle + d\f$,
+the <EM>bounded affine relation</EM>
+\f$\phi = (\mathrm{lb} \leq x'_k \leq \mathrm{ub})\f$
+is defined as
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigl(
+            \langle \vect{a}, \vect{v} \rangle + b
+              \leq w_k
+                \leq \langle \vect{c}, \vect{v} \rangle + d
+          \bigr)
+            \land
+          \Bigl(
+            \bigland_{0 \leq i < n, i \neq k}
+              w_i = v_i
+          \Bigr).
+\f]
+
+\subsection affine_form_relation Affine Form Relations.
+Let \f$\mathbb{F}_{\mathrm{f}}\f$ be the set of floating point numbers
+representables in a certain
+format \f$\mathrm{f}\f$ and let \f$\mathbb{I}_\mathrm{f}\f$ be the set of
+real intervals with bounds in \f$\mathbb{F}_{\mathrm{f}}\f$.
+We can define a <EM>floating-point interval linear form</EM>
+\f$\langle\vect{\alpha}, \vect{x}\rangle
+ + \beta\f$
+as:
+        \f[\left<\vect{\alpha}, \vect{x}\right> + \beta =
+        \alpha_0x_0 + \ldots +
+        \alpha_{n-1}x_{n-1} + \beta,\f]
+
+where \f$\beta\f$, \f$\vect{\alpha}_k \in \mathbb{I}_{\mathrm{f}}\f$
+for each \f$k = 0, \ldots, n - 1\f$.
+
+Given a such linear form \f$\mathrm{lf}\f$ and a primed variable \f$x'_k\f$ the
+<EM>affine form image</EM> operator computes the bounded affine image of a
+polyhedron \f$\cP\f$ under \f$\mathrm{lb} \leq x'_k \leq \mathrm{ub}\f$, where
+\f$\mathrm{lb}\f$ and \f$\mathrm{ub}\f$ are the upper and lower bound
+of \f$\mathrm{lf}\f$ respectively.
+
+\subsection Generalized_Affine_Relations Generalized Affine Relations.
+Similarly, the <EM>generalized affine relation</EM>
+\f$\phi = (\mathrm{lhs}' \relsym \mathrm{rhs})\f$, where
+\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and
+\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$
+are affine expressions and
+\f$\mathord{\relsym} \in \{ <, \leq, =, \geq, > \}\f$
+is a relation symbol, is defined as
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigl(
+            \langle \vect{c}, \vect{w} \rangle + d
+              \relsym \langle \vect{a}, \vect{v} \rangle + b
+          \bigr)
+            \land
+          \Bigl(
+            \bigland_{0 \leq i < n, c_i = 0}
+              w_i = v_i
+          \Bigr).
+\f]
+When \f$\mathrm{lhs} = x_k\f$ and \f$\mathord{\relsym} \in \{ = \}\f$,
+then the above affine relation becomes equivalent to the
+single-update affine function \f$x'_k = \mathrm{rhs}\f$
+(hence the name given to this operator).
+It is worth stressing that the notation is not symmetric, because
+the variables occurring in expression \f$\mathrm{lhs}\f$ are interpreted
+as primed variables, whereas those occurring in \f$\mathrm{rhs}\f$
+are unprimed; for instance, the transfer relations
+\f$\mathrm{lhs}' \leq \mathrm{rhs}\f$ and
+\f$\mathrm{rhs}' \geq \mathrm{lhs}\f$
+are not equivalent in general.
+
+\subsection Cylindrification Cylindrification Operator
+
+The operator <CODE>unconstrain</CODE> computes
+the <EM>cylindrification</EM> \ref HMT71 "[HMT71]"
+of a polyhedron with respect to one of its variables.
+Formally, the cylindrification \f$\cQ \in \Pset_n\f$
+of an NNC polyhedron \f$\cP \in \Pset_n\f$ with respect to
+variable index \f$i \in \{ 0, \ldots, n-1 \}\f$ is defined as follows:
+\f[
+  \cQ
+    = \bigl\{\,
+        \vect{w} \in \Rset^n
+      \bigm|
+        \exists \vect{v} \in \cP \st
+          \forall j \in \{0, \ldots, n-1\} \itc
+            j \neq i \implies w_j = v_j
+      \,\bigr\}.
+\f]
+Cylindrification is an idempotent operation; in particular, note that
+the computed result has the same space dimension of the original polyhedron.
+A variant of the operator above allows for the cylindrification of
+a polyhedron with respect to a finite set of variables.
+
+\subsection Time_Elapse_Operator Time-Elapse Operator
+
+The <EM>time-elapse</EM> operator has been defined in
+\ref HPR97 "[HPR97]".
+Actually, the time-elapse operator provided by the library
+is a slight generalization of that one,
+since it also works on NNC polyhedra.
+For any two NNC polyhedra \f$\cP, \cQ \in \Pset_n\f$,
+the time-elapse between \f$\cP\f$ and \f$\cQ\f$,
+denoted \f$ \cP \nearrow \cQ\f$,
+is the smallest NNC polyhedron containing the set
+\f[
+  \bigl\{\,
+    \vect{p} + \lambda \vect{q} \in \Rset^n
+  \bigm|
+    \vect{p} \in \cP, \vect{q} \in \cQ, \lambda \in \nonnegRset
+  \,\bigr\}.
+\f]
+Note that the above set might not be an NNC polyhedron.
+
+
+\subsection Positive_Time_Elapse_Operator Positive Time-Elapse Operator
+
+The <EM>positive time-elapse</EM> operator has been defined in
+\ref BFM11 "[BFM11,BFM13]".
+The operator provided by the library works on NNC
+polyhedra.  For any two NNC polyhedra \f$\cP, \cQ \in \Pset_n\f$, the
+positive time-elapse between \f$\cP\f$ and \f$\cQ\f$, denoted \f$ \cP
+\nearrow_{>0} \cQ\f$, is the NNC polyhedron containing exactly the set
+\f[
+  \bigl\{\,
+    \vect{p} + \lambda \vect{q} \in \Rset^n
+  \bigm|
+    \vect{p} \in \cP, \vect{q} \in \cQ, \lambda \in \Rset^{>0}
+  \,\bigr\},
+\f]
+where \f$\Rset^{>0}\f$ denotes the set of strictly positive
+reals. Notice that, differently from the case of the time-elapse
+operator, the set \f$ \cP \nearrow_{>0} \cQ\f$ is always an NNC
+polyhedron, if \f$\cP\f$ and \f$\cQ\f$ are.
+
+The exact version of the time-elapse operator \f$\cP \nearrow \cQ\f$
+defined in Section \ref Time_Elapse_Operator,
+which may not be an NNC polyhedron, can be computed as
+the union of two NNC polyhedra, according to the following equation:
+\f$\cP \nearrow \cQ = \cP \cup \left(\cP \nearrow_{>0} \cQ\right)\f$.
+
+
+\subsection Meet_Preserving_Simplification Meet-Preserving Enlargement and Simplification
+
+Let \f$\cP, \cQ, \cR \in \Pset_n\f$ be NNC polyhedra. Then:
+
+ - \f$\cR\f$ is <EM>meet-preserving</EM> with respect to \f$\cP\f$
+   using context \f$\cQ\f$ if \f$\cR \inters \cQ = \cP \inters \cQ\f$;
+
+ - \f$\cR\f$ is an <EM>enlargement</EM> of \f$\cP\f$ if \f$\cR \Sseq \cP\f$.
+
+ - \f$\cR\f$ is a <EM>simplification</EM> with respect to \f$\cP\f$
+   if \f$r \leq p\f$, where \f$r\f$ and \f$p\f$ are the cardinalities
+   of minimized constraint representations for \f$\cR\f$ and \f$\cP\f$,
+   respectively.
+
+Notice that an enlargement need not be a simplification, and vice versa;
+moreover, the identity function is (trivially)
+a meet-preserving enlargement and simplification.
+
+The library provides a binary operator (<CODE>simplify_using_context</CODE>)
+for the domain of NNC polyhedra that returns a polyhedron which is a
+meet-preserving enlargement simplification of its first argument
+using the second argument as context.
+
+The concept of meet-preserving enlargement and simplification also
+applies to the other basic domains (boxes, grids, BD and octagonal shapes).
+See below for a definition of the concept of
+\ref Powerset_Meet_Preserving_Simplification "meet-preserving simplification for powerset domains".
+
+\anchor relation_with
+\subsection Relation_With_Operators Relation-With Operators
+
+The library provides operators for checking the relation holding
+between an NNC polyhedron  and
+either a constraint or a generator.
+
+Suppose \f$\cP\f$ is an NNC polyhedron
+and \f$\cC\f$ an arbitrary constraint system representing \f$\cP\f$.
+Suppose also that
+\f$
+  c = \bigl(
+        \langle \vect{a}, \vect{x} \rangle \relsym b
+      \bigr)
+\f$
+is a constraint
+with \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+and \f$\cQ\f$ the set of points
+that satisfy \f$c\f$.
+The possible relations between \f$\cP\f$ and \f$c\f$ are as follows.
+- \f$\cP\f$ <EM>is disjoint</EM> from \f$c\f$ if
+  \f$\cP \inters \cQ = \emptyset\f$; that is, adding \f$c\f$
+  to \f$\cC\f$ gives us the empty polyhedron.
+- \f$\cP\f$ <EM>strictly intersects</EM> \f$c\f$ if
+  \f$\cP \inters \cQ \neq \emptyset\f$ and \f$\cP \inters \cQ \subset \cP\f$;
+  that is, adding \f$c\f$ to \f$\cC\f$
+  gives us a non-empty polyhedron strictly smaller than \f$\cP\f$.
+- \f$\cP\f$ <EM>is included</EM> in \f$c\f$ if \f$\cP \sseq \cQ\f$;
+  that is, adding \f$c\f$ to \f$\cC\f$
+  leaves \f$\cP\f$ unchanged.
+- \f$\cP\f$ <EM>saturates</EM> \f$c\f$ if \f$\cP \sseq \cH\f$,
+  where \f$\cH\f$ is the hyperplane induced by constraint \f$c\f$,
+  i.e., the set of points satisfying the equality constraint
+  \f$\langle \vect{a}, \vect{x} \rangle = b\f$;
+  that is, adding the constraint \f$\langle \vect{a}, \vect{x} \rangle = b\f$
+  to \f$\cC\f$ leaves \f$\cP\f$ unchanged.
+
+The polyhedron \f$\cP\f$ <EM>subsumes</EM> the generator \f$g\f$ if
+adding \f$g\f$ to any generator system representing \f$\cP\f$
+does not change \f$\cP\f$.
+
+\subsection Widening_Operators Widening Operators
+
+The library provides two widening operators for the domain of polyhedra.
+\anchor H79_widening
+The first one, that we call <EM>H79-widening</EM>, mainly
+follows the specification provided in the PhD thesis of N. Halbwachs
+\ref Hal79 "[Hal79]", also described in \ref HPR97 "[HPR97]".
+Note that in the computation of the H79-widening \f$\cP \widen \cQ\f$
+of two polyhedra \f$\cP, \cQ \in \CPset_n\f$ it is required as a
+precondition that \f$\cP \sseq \cQ\f$ (the same assumption was implicitly
+present in the cited papers).
+
+\anchor BHRZ03_widening
+The second widening operator, that we call <EM>BHRZ03-widening</EM>,
+is an instance of the specification provided in \ref BHRZ03a "[BHRZ03a]".
+This operator also requires as a precondition that \f$\cP \sseq \cQ\f$
+and it is guaranteed to provide a result which is at least as precise as
+the H79-widening.
+
+Both widening operators can be applied to NNC polyhedra.
+The user is warned that, in such a case, the results may not closely
+match the geometric intuition which is at the base of the
+specification of the two widenings. The reason is that, in the current
+implementation, the widenings are not directly applied to the NNC
+polyhedra, but rather to their internal representations.
+Implementation work is in progress and future versions of the library
+may provide an even better integration of the two widenings with the
+domain of NNC polyhedra.
+
+\note
+As is the case for the other operators on polyhedra, the
+implementation overwrites one of the two polyhedra arguments with the
+result of the widening application. To avoid trivial
+misunderstandings, it is worth stressing that if polyhedra \f$\cP\f$
+and \f$\cQ\f$ (where \f$\cP \sseq \cQ\f$) are identified by program
+variables <CODE>p</CODE> and <CODE>q</CODE>, respectively, then the
+call <CODE>q.H79_widening_assign(p)</CODE> will assign the polyhedron
+\f$\cP \widen \cQ\f$ to variable <CODE>q</CODE>.  Namely, it is the
+bigger polyhedron \f$\cQ\f$ which is overwritten by the result of the
+widening. The smaller polyhedron is not modified, so as to lead to an
+easier coding of the usual convergence test
+(\f$\cP \Sseq \cP \widen \cQ\f$ can be coded as <CODE>p.contains(q)</CODE>).
+Note that, in the above context, a call such as
+<CODE>p.H79_widening_assign(q)</CODE> is likely to result in undefined
+behavior, since the precondition \f$\cQ \sseq \cP\f$ will be missed
+(unless it happens that \f$\cP = \cQ\f$).
+The same observation holds for all flavors of widenings and extrapolation
+operators that are implemented in the library and for all the language
+interfaces.
+
+
+\subsection Widening_with_Tokens Widening with Tokens
+
+When approximating a fixpoint computation using widening operators,
+a common tactic to improve the precision of the final result is to delay
+the application of widening operators. The usual approach is to fix
+a parameter \f$k\f$ and only apply widenings starting from the
+\f$k\f$-th iteration.
+
+The library also supports an improved widening delay strategy,
+that we call <EM>widening with tokens</EM> \ref BHRZ03a "[BHRZ03a]".
+A token is a sort of wild card allowing for the replacement of the widening
+application by the exact upper bound computation: the token is used
+(and thus consumed) only when the widening would have resulted in an
+actual precision loss (as opposed to the <EM>potential</EM> precision loss
+of the classical delay strategy).
+Thus, all widening operators can be supplied with an optional argument,
+recording the number of available tokens, which is decremented when
+tokens are used. The approximated fixpoint computation will start with
+a fixed number \f$k\f$ of tokens, which will be used if and when needed.
+When there are no tokens left, the widening is always applied.
+
+\subsection Extrapolation_Operators Extrapolation Operators
+
+Besides the two widening operators, the library also implements several
+<EM>extrapolation</EM> operators, which differ from widenings in that
+their use along an upper iteration sequence does not ensure convergence
+in a finite number of steps.
+
+\anchor limited_extrapolation
+In particular, for each of the two widenings there is a corresponding
+<EM>limited</EM> extrapolation operator, which can be used to implement
+the <EM>widening ``up to''</EM> technique as described in
+\ref HPR97 "[HPR97]".
+Each limited extrapolation operator takes a constraint system as an
+additional parameter and uses it to improve the approximation yielded
+by the corresponding widening operator. Note that a convergence guarantee
+can only be obtained by suitably restricting the set of constraints that
+can occur in this additional parameter. For instance, in \ref HPR97 "[HPR97]"
+this set is fixed once and for all before starting the computation of
+the upward iteration sequence.
+
+\anchor bounded_extrapolation
+The <EM>bounded</EM> extrapolation operators further enhance each one
+of the limited extrapolation operators described above by
+intersecting the result of the limited extrapolation operation
+with the box obtained as a result of applying the
+\ref CC76_interval_widening "CC76-widening"
+to the smallest \ref Intervals_and_Boxes "boxes"
+enclosing the two argument polyhedra.
+
+\section Intervals_and_Boxes Intervals and Boxes
+
+The PPL provides support for computations on non-relational domains,
+called boxes, and also the interval domains used for their representation.
+
+\anchor intervals
+An <EM>interval</EM> in \f$\Rset\f$ is a pair of <EM>bounds</EM>,
+called <EM>lower</EM> and <EM>upper</EM>.
+Each bound can be either (1) <EM>closed and bounded</EM>,
+(2) <EM>open and bounded</EM>, or
+(3) <EM>open and unbounded</EM>.
+If the bound is <EM>bounded</EM>, then it has a value in \f$\Rset\f$.
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq, >\}\f$,
+the constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be a <EM>interval constraint</EM> if there exist an index
+\f$i \in \{ 0, \ldots, n-1 \}\f$ such that, for all
+\f$k \in \{ 0, \ldots, i-1, i+1, \ldots, n-1 \}\f$, \f$a_k = 0\f$.
+Thus each interval constraint that is not a tautology or
+inconsistent has the form
+\f$x = r\f$, \f$x \leq r\f$, \f$x \geq r\f$,
+\f$x < r\f$ or \f$x > r\f$, with \f$r \in \Rset\f$.
+
+Letting  \f$\cB\f$ be a sequence of
+\f$n\f$ intervals and \f$\vect{e}_i = (0, \ldots, 1, \ldots, 0)^\transpose\f$
+be the vector in \f$\Rset^n\f$ with 1 in the \f$i\f$'th position
+and zeroes in every other position;
+if the lower bound of the \f$i\f$'th interval in \f$\cB\f$
+is bounded, the corresponding interval constraint is defined as
+\f$\langle \vect{e}_i, \vect{x} \rangle \relsym b\f$,
+where \f$b\f$ is the value of the bound and
+\f$\mathord{\relsym}\f$ is \f$\mathord{\geq}\f$ if it is a closed bound and
+\f$\mathord{>}\f$ if it is an open bound.
+Similarly,
+if the upper bound of the \f$i\f$'th interval in \f$\cB\f$ is bounded,
+the corresponding interval constraint is defined as
+\f$\langle\vect{e}_i,\vect{x}\rangle \relsym b\f$,
+where \f$b\f$ is the value of the bound and
+\f$\mathord{\relsym}\f$ is \f$\mathord{\leq}\f$ if it is a closed bound and
+\f$\mathord{<}\f$ if it is an open bound.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be a
+<EM>box</EM> if and only if
+either \f$\cP\f$ is the set of solutions to a finite set
+of interval constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+Therefore any \f$n\f$-dimensional <EM>box</EM> \f$\cP\f$ in \f$\Rset^n\f$
+where \f$n > 0\f$ can be represented by a sequence of \f$n\f$ intervals
+\f$\cB\f$ in \f$\Rset\f$ and  \f$\cP\f$ is a closed polyhedron
+if every bound in the intervals in \f$\cB\f$
+is either closed and bounded or open and unbounded.
+
+\anchor CC76_interval_widening
+\subsection Widening_and_Extrapolation_Operators_on_Boxes Widening and Extrapolation Operators on Boxes
+
+The library provides a widening operator for boxes.
+Given two sequences of intervals defining two \f$n\f$-dimensional boxes, the
+<EM>CC76-widening</EM> applies, for each corresponding interval and bound, the
+interval constraint widening defined in \ref CC76 "[CC76]".
+For extra precision, this incorporates the widening with thresholds
+as defined in \ref BCCetal02 "[BCCetal02]" with
+\f$\{-2, -1, 0, 1, 2\}\f$ as the set of default threshold values.
+
+\section Weakly_Relational_Shapes Weakly-Relational Shapes
+
+The PPL provides support for computations on numerical domains that,
+in selected contexts, can achieve a better precision/efficiency ratio
+with respect to the corresponding computations on a ``fully
+relational'' domain of convex polyhedra.  This is achieved by
+restricting the syntactic form of the constraints that can be used to
+describe the domain elements.
+
+\subsection Bounded_Difference_Shapes Bounded Difference Shapes
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be a <EM>bounded difference</EM> if there exist two indices
+\f$i, j \in \{ 0, \ldots, n-1 \}\f$ such that:
+  - \f$a_i, a_j \in \{ -1, 0, 1 \}\f$ and \f$a_i \neq a_j\f$;
+  - \f$a_k = 0\f$, for all \f$k \notin \{ i, j \}\f$.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be a
+<EM>bounded difference shape</EM> (BDS, for short) if and only if
+either \f$\cP\f$ can be expressed as the intersection of a finite number
+of bounded difference constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+
+\subsection Octagonal_Shapes Octagonal Shapes
+
+For each vector \f$\vect{a} \in \Rset^n\f$ and scalar \f$b \in \Rset\f$,
+and for each relation symbol \f$\mathord{\relsym} \in \{ =, \geq\}\f$,
+the linear constraint \f$\langle \vect{a}, \vect{x} \rangle \relsym b\f$
+is said to be an <EM>octagonal</EM> if there exist two indices
+\f$i, j \in \{ 0, \ldots, n-1 \}\f$ such that:
+  - \f$a_i, a_j \in \{ -1, 0, 1 \}\f$;
+  - \f$a_k = 0\f$, for all \f$k \notin \{ i, j \}\f$.
+
+A convex polyhedron \f$\cP \in \CPset_n\f$ is said to be an
+<EM>octagonal shape</EM> (OS, for short) if and only if
+either \f$\cP\f$ can be expressed as the intersection of a finite number
+of octagonal constraints or \f$n = 0\f$ and \f$\cP = \emptyset\f$.
+
+Note that, since any bounded difference is also an octagonal constraint,
+any BDS is also an OS. The name ``octagonal'' comes from the fact that,
+in a vector space of dimension 2, a bounded OS can have eight sides
+at most.
+
+\subsection Weakly_Relational_Shape_Interface Weakly-Relational Shapes Interface
+By construction, any BDS or OS is always topologically closed.
+Under the usual set inclusion ordering, the set of all BDSs (resp., OSs)
+on the vector space \f$\Rset^n\f$ is a lattice having the empty set
+\f$\emptyset\f$ and the universe \f$\Rset^n\f$ as the smallest and
+the biggest elements, respectively.
+In theoretical terms, it is a meet sub-lattice of \f$\CPset_n\f$;
+moreover, the lattice of BDSs is a meet sublattice of the lattice of OSs.
+The least upper bound of a finite set of BDSs (resp., OSs) is said to be
+their <EM>bds-hull</EM> (resp., <EM>oct-hull</EM>).
+
+As far as the representation of the rational inhomogeneous term of
+each bounded difference or octagonal constraint is concerned, several
+<EM>rounding-aware</EM> implementation choices are available, including:
+  - bounded precision integer types;
+  - bounded precision floating point types;
+  - unbounded precision integer and rational types, as provided by GMP.
+
+The user interface for BDSs and OSs is meant to be as similar as
+possible to the one developed for the domain of closed polyhedra: in
+particular, all operators on polyhedra are also available for the
+domains of BDSs and OSs, even though they are typically characterized
+by a lower degree of precision.
+For instance, the <EM>bds-difference</EM> and <EM>oct-difference</EM>
+operators return (the smallest) over-approximations of the set-theoretical
+difference operator on the corresponding domains.
+In the case of (generalized) images and preimages of affine relations,
+suitable (possibly not-optimal) over-approximations are computed when
+the considered relations cannot be precisely modeled by only using
+bounded differences or octagonal constraints.
+
+\subsection Widening_and_Extrapolation_Operators_on_WR_Shapes Widening and Extrapolation Operators on Weakly-Relational Shapes
+
+\anchor BHMZ05_widening
+For the domains of BDSs and OSs, the library provides a variant of
+the widening operator for convex polyhedra defined in \ref CH78 "[CH78]".
+The implementation follows the specification
+in \ref BHMZ05a "[BHMZ05a,BHMZ05b]",
+resulting in an operator which is well-defined on the corresponding domain
+(i.e., it does not depend on the internal representation of BDSs or OSs),
+while still ensuring convergence in a finite number of steps.
+
+\anchor CC76_extrapolation
+The library also implements an extension of the widening operator for
+intervals as defined in \ref CC76 "[CC76]". The reader is warned that
+such an extension, even though being well-defined on the domain of BDSs
+and OSs, is not provided with a convergence guarantee and is therefore an
+extrapolation operator.
+
+
+\section sect_rational_grids Rational Grids
+
+In this section we introduce rational grids
+as provided by the library.
+See also \ref BDHetal05 "[BDHetal05]" for a detailed description of this domain.
+
+The library supports two representations for the grids domain;
+<EM>congruence systems</EM> and <EM>grid generator systems</EM>.
+We first describe <EM>linear congruence relations</EM> which form the elements
+of a congruence system.
+
+\subsection Congruence_Relations Congruences and Congruence Relations
+
+For any \f$a, b, f \in \Rset\f$,
+\f$a \equiv_f b\f$ denotes the <EM>congruence</EM>
+\f$\exists \mu \in \Zset \st a - b = \mu f\f$.
+
+Let \f$\Sset \in \{ \Qset, \Rset \}\f$.
+For each vector
+\f$\vect{a} \in \Sset^n \setdiff \{\vect{0}\}\f$ and scalars
+\f$b, f \in \Sset\f$,
+the notation \f$\langle \vect{a}, \vect{x} \rangle \equiv_f b\f$
+stands for the <EM>linear congruence relation in \f$\Sset^n\f$</EM>
+defined by the set of vectors
+\f[
+  \bigl\{\,
+    \vect{v} \in \Rset^n
+  \bigm|
+    \exists \mu \in \Zset \st
+      \langle \vect{a}, \vect{v} \rangle = b + \mu f
+  \,\bigr\};
+\f]
+when \f$f \neq 0\f$, the relation is said to be
+<EM>proper</EM>;
+\f$\langle \vect{a}, \vect{x} \rangle \equiv_0 b\f$ (i.e., when \f$f = 0\f$)
+denotes the equality \f$\langle \vect{a}, \vect{x} \rangle = b\f$.
+\f$f\f$ is called the <EM>frequency</EM> or <EM>modulus</EM> and
+\f$b\f$ the <EM>base value</EM> of the relation.
+Thus, provided \f$\vect{a} \neq \vect{0}\f$,
+the relation \f$\langle \vect{a}, \vect{x} \rangle \equiv_f b\f$
+defines the set of affine hyperplanes
+\f[
+  \big\{\,
+    \bigl(\langle \vect{a}, \vect{x} \rangle = b + \mu f\bigr)
+  \bigm|
+    \mu \in \Zset
+  \,\bigr\};
+\f]
+if \f$b \equiv_f 0\f$, \f$\langle \vect{0}, \vect{x} \rangle \equiv_f b\f$
+defines the universe \f$\Rset^n\f$ and the empty set, otherwise.
+
+\subsection Rational_Grids Rational Grids
+
+The set \f$\cL  \sseq \Rset^n\f$ is a <EM>rational grid</EM>
+if and only if either \f$\cL\f$ is the set of vectors in
+\f$\Rset^n\f$ that satisfy
+a finite system \f$\cC\f$ of congruence relations in \f$\Qset^n\f$
+or \f$n = 0\f$ and \f$\cL = \emptyset\f$.
+
+We also say that  <EM>\f$\cL\f$ is described by \f$\cC\f$</EM>
+and that <EM>\f$\cC\f$ is a congruence system for \f$\cL\f$</EM>.
+
+The <EM>grid domain</EM> \f$\Gset_{n}\f$ is the set of all rational grids
+described by finite sets of congruence relations in \f$\Qset^n\f$.
+
+If the congruence system \f$\cC\f$ describes the \f$\emptyset\f$,
+the <EM>empty</EM> grid,
+then we say that \f$\cC\f$ is <EM>inconsistent</EM>.
+For example, the congruence systems
+\f$\bigl\{\langle\vect{0}, \vect{x}\rangle \equiv_0 1\bigr\}\f$
+meaning that \f$0 = 1\f$ and
+\f$\bigl\{\langle\vect{a}, \vect{x}\rangle \equiv_2 0,
+     \langle\vect{a}, \vect{x}\rangle \equiv_2 1\bigr\}\f$,
+for any \f$\vect{a} \in \Rset^n\f$,
+meaning that the value of an expression must be both even and odd
+are both inconsistent since both describe the empty grid.
+
+When ordering grids by the set inclusion relation,
+the empty set \f$\emptyset\f$ and the vector space \f$\Rset^n\f$
+(which is described by the empty set of congruence relations)
+are, respectively, the smallest and the biggest elements of
+\f$\Gset_n\f$.
+The vector space \f$\Rset^n\f$ is also called the <EM>universe</EM> grid.
+
+In set theoretical terms,
+\f$\Gset_n\f$ is a <EM>lattice</EM> under set inclusion.
+
+\subsection Integer_Combinations Integer Combinations
+
+Let \f$S = \{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+be a finite set of vectors.
+For all scalars \f$\mu_1, \ldots, \mu_k \in \Zset\f$,
+the vector \f$\vect{v} = \sum_{j=1}^k \mu_j \vect{x}_j\f$
+is said to be a <EM>integer</EM> combination of the vectors in \f$S\f$.
+
+We denote by \f$\inthull(S)\f$
+(resp., \f$\intaffinehull(S)\f$)
+the set of all the integer (resp., integer and affine)
+combinations of the vectors in \f$S\f$.
+
+\subsection Points_Parameters_Lines Points, Parameters and Lines
+
+Let \f$\cL\f$ be a grid.
+Then
+- a vector \f$\vect{p} \in \cL\f$ is called a <EM>grid point</EM> of \f$\cL\f$;
+- a vector \f$\vect{q} \in \Rset^n\f$, where \f$\vect{q} \neq \vect{0}\f$,
+  is called a <EM>parameter</EM> of \f$\cL\f$
+  if \f$\cL \neq \emptyset\f$ and \f$\vect{p} + \mu \vect{q} \in \cL\f$,
+  for all points \f$\vect{p} \in \cL\f$ and all \f$\mu \in \Zset\f$;
+- a vector \f$\vect{l} \in \Rset^n\f$ is called a <EM>grid line</EM> of
+  \f$\cL\f$ if \f$\cL \neq \emptyset\f$ and
+  \f$\vect{p} + \lambda \vect{l} \in \cL\f$,
+  for all points \f$\vect{p} \in \cL\f$ and all \f$\lambda \in \Rset\f$.
+
+
+\subsection Grid_Generator_Representation The Grid Generator Representation
+
+We can generate any rational grid in \f$\Gset_n\f$
+from a finite subset of its points, parameters and lines;
+each point in a grid is obtained by adding a linear combination of
+its generating lines to an integral combination of its parameters
+and an integral affine combination of its generating points.
+
+If \f$L, Q, P\f$ are each finite subsets of \f$\Qset^n\f$ and
+\f[
+  \cL = \linearhull(L) + \inthull(Q) + \intaffinehull(P)
+\f]
+where the symbol '\f$+\f$' denotes the Minkowski's sum,
+then \f$\cL \in \Gset_n\f$ is a rational grid
+(see Section 4.4 in \ref Sch99 "[Sch99]" and
+also Proposition 8 in \ref BDHetal05 "[BDHetal05]").
+The 3-tuple \f$(L, Q, P)\f$
+is said to be a <EM>grid generator system</EM> for \f$\cL\f$
+and we write \f$\cL = \ggen(L, Q, P)\f$.
+
+Note that the grid \f$\cL = \ggen(L, Q, P) = \emptyset\f$
+if and only if the set of grid points \f$P = \emptyset\f$.
+If \f$P \neq \emptyset\f$, then
+\f$\cL = \ggen(L, \emptyset, Q_{\vect{p}} \union P)\f$
+where, for some \f$\vect{p} \in P\f$,
+\f$Q_{\vect{p}} = \{\, \vect{p} + \vect{q} \mid \vect{q} \in Q \,\}\f$.
+
+\subsection Grid_Minimized_Representations Minimized Grid Representations
+
+A <EM>minimized</EM> congruence system \f$\cC\f$ for \f$\cL\f$
+is such that, if \f$\cC'\f$ is another congruence system for \f$\cL\f$,
+then \f$\card \cC \leq \card \cC'\f$.
+Note that a minimized congruence system for a non-empty grid
+has at most \f$n\f$ congruence relations.
+
+Similarly, a <EM>minimized</EM> grid generator system
+\f$\cG = (L, Q, P)\f$ for \f$\cL\f$
+is such that, if \f$\cG' = (L', Q', P')\f$ is
+another grid generator system for \f$\cL\f$,
+then \f$\card L \leq \card L'\f$ and
+\f$\card Q + \card P \leq \card Q' + \card P'\f$.
+Note that a minimized grid generator system for a grid
+has no more than a total of \f$n+1\f$ grid lines, parameters and points.
+
+\subsection Grids_Double_Description_Grids Double Description for Grids
+
+As for convex polyhedra, any grid \f$\cL\f$ can be described by using
+a congruence system \f$\cC\f$ for \f$\cL\f$,
+a grid generator system \f$\cG\f$ for \f$\cL\f$, or
+both by means of the <EM>double description pair (DD pair)</EM>
+\f$(\cC, \cG)\f$.
+The <EM>double description method</EM> for grids is a collection of
+theoretical results very similar to those for convex polyhedra showing that,
+given one kind of representation, there are algorithms
+for computing a representation of the other kind
+and for minimizing both representations.
+
+As for convex polyhedra, such changes of representation form a key step
+in the implementation of many operators on grids such as, for example,
+intersection and grid join.
+
+\subsection Grid_Space_Dimensions Space Dimensions and Dimension-compatibility for Grids
+
+The <EM>space dimension</EM> of a grid \f$\cL \in \Gset_n\f$
+is the dimension
+\f$n \in \Nset\f$ of the corresponding vector space \f$\Rset^n\f$.
+The space dimension of congruence relations, grid generators and other objects
+of the library is defined similarly.
+
+\subsection Grid_Affine_Dimension Affine Independence and Affine Dimension for Grids
+
+A <EM>non-empty</EM> grid \f$\cL \in \Gset_n\f$ has
+<EM>affine dimension</EM> \f$k \in \Nset\f$, denoted by \f$\pdim(\cG) = k\f$,
+if the maximum number of affinely independent points in \f$\cG\f$ is
+\f$k + 1\f$.
+The affine dimension of an empty grid is defined to be 0.
+Thus we have \f$0 \leq \pdim(\cG) \leq n\f$.
+
+\section rational_grid_operations Operations on Rational Grids
+
+In general, the operations on rational grids are the same as those for the other
+PPL domains and the definitions of these can be found in
+Section \ref Operations_on_Convex_Polyhedra.
+Below we just describe those operations that have features or behavior
+that is in some way special to the grid domain.
+
+\subsection Grid_Affine_Transformation Affine Images and Preimages
+
+As for convex polyhedra (see \ref Single_Update_Affine_Functions
+"Single-Update Affine Functions"),
+the library provides affine image and preimage operators for grids:
+given a variable \f$x_k\f$ and
+linear expression \f$\mathrm{expr} = \langle \vect{a}, \vect{x} \rangle + b\f$,
+these determine the affine transformation
+\f$\fund{\phi = \bigl(x'_k = \langle \vect{a}, \vect{x} \rangle + b\bigr)}
+        {\Rset^n}{\Rset^n}\f$
+that transforms any point
+\f$(v_0, \ldots, v_{n-1})^\transpose\f$
+in a grid \f$\cL\f$ to
+\f[
+   \Bigl(v_0, \ldots, \bigl(\textstyle{\sum_{i=0}^{n-1}} a_i v_i + b\bigr),
+                   \ldots, v_{n-1}\Bigr)^\transpose.
+\f]
+
+The <EM>affine image</EM> operator computes the affine image
+of a grid \f$\cL\f$ under
+\f$x'_k = \langle \vect{a}, \vect{x} \rangle + b\f$.
+For instance,
+suppose the grid \f$\cL\f$
+to be transformed is the non-relational grid in \f$\Rset^2\f$
+generated by the set of grid points
+\f$\bigl\{
+     (0, 0)^\transpose,
+     (0, 3)^\transpose,
+     (3, 0)^\transpose
+   \bigr\}\f$.
+Then, if the considered variable is \f$x_0\f$ and
+the linear expression is \f$3x_0 + 2 x_1 + 1\f$
+(so that \f$k = 0\f$, \f$a_0 = 3, a_1 = 2, b = 1\f$),
+the affine image operator will translate \f$\cL\f$
+to the grid \f$\cL_1\f$ generated by the set of grid points
+\f$\bigl\{
+     (1, 0)^\transpose,
+     (7, 3)^\transpose,
+     (10, 0)^\transpose
+   \bigr\}\f$
+which is the grid generated by the grid point \f$(1, 0)\f$
+and parameters \f$(3, -3), (0, 9)\f$; or, alternatively defined by the
+congruence system \f$\{x \equiv_3 1, x + y \equiv_9 1\}\f$.
+If the considered variable is as before (i.e., \f$k = 0\f$)
+but the linear expression is  \f$x_1\f$
+(so that \f$a_0 = 0, a_1 = 1, b = 0\f$),
+then the resulting grid \f$\cL_2\f$
+is the grid containing all the points
+whose coordinates are integral multiples of 3 and lie on
+line \f$x = y\f$.
+
+The affine preimage operator computes the affine preimage
+of a grid \f$\cL\f$ under \f$\phi\f$.
+For instance,
+suppose now that we apply the affine
+preimage operator as given in the first example
+using variable \f$x_0\f$
+and linear expression \f$3x_0 + 2 x_1 + 1\f$
+to the grid \f$\cL_1\f$;
+then we get the original grid \f$\cL\f$ back.
+If, on the other hand, we apply the affine
+preimage operator as given in the second example
+using variable \f$x_0\f$ and linear expression \f$x_1\f$ to \f$\cL_2\f$,
+then the resulting grid will consist of
+all the points in \f$\Rset^2\f$ where the \f$y\f$
+coordinate is an integral multiple of 3.
+
+Observe that provided the coefficient \f$a_k\f$ of the considered variable
+in the linear expression is non-zero, the affine transformation is invertible.
+
+\subsection Grid_Generalized_Image Generalized Affine Images
+
+Similarly to convex polyhedra (see \ref Generalized_Affine_Relations
+"Generalized Affine Relations"), the library provides two other grid operators
+that are generalizations of the single update affine image and
+preimage operators for grids.
+The <EM>generalized affine image</EM> operator
+\f$\fund{\phi = (\mathrm{lhs}', \mathrm{rhs}, f)}{\Rset^n}{\Rset^n}\f$, where
+\f$\mathrm{lhs} = \langle \vect{c}, \vect{x} \rangle + d\f$ and
+\f$\mathrm{rhs} = \langle \vect{a}, \vect{x} \rangle + b\f$
+are affine expressions and \f$f \in \Qset\f$, is defined as
+\f[
+  \forall \vect{v} \in \Rset^n, \vect{w} \in \Rset^n
+    \itc
+      (\vect{v}, \vect{w}) \in \phi
+        \iff
+          \bigl(
+            \langle \vect{c}, \vect{w} \rangle + d
+              \equiv_f \langle \vect{a}, \vect{v} \rangle + b
+          \bigr)
+            \land
+          \Bigl(
+            \bigland_{0 \leq i < n, c_i = 0}
+              w_i = v_i
+          \Bigr).
+\f]
+Note that, when \f$\mathrm{lhs} = x_k\f$ and \f$f = 0\f$,
+so that the transfer function is an equality,
+then the above operator
+is equivalent to the application of the standard affine image
+of \f$\cL\f$ with respect to the variable \f$x_k\f$ and the
+affine expression \f$\mathrm{rhs}\f$.
+
+\subsection Grid_Frequency Frequency Operator
+
+Let \f$\cL \in \Gset_n\f$ be any non-empty grid and
+\f$\mathrm{expr} = \bigl(\langle \vect{a}, \vect{x} \rangle + b\bigr)\f$
+be a linear expression. Then if, for
+some \f$c, f \in \Rset\f$, all the points in \f$\cL\f$ satisfy the
+congruence \f$\cg = ( \mathrm{expr} \equiv_f c )\f$, then the maximum
+\f$f\f$ such that this holds is called the <EM>frequency</EM> of
+\f$\cL\f$ with respect to \f$\mathrm{expr}\f$.
+
+The frequency operator provided by the library returns both
+the frequency \f$f\f$ and a value
+\f$\mathrm{val} = \langle \vect{a}, \vect{w} \rangle + b\f$
+where \f$\vect{w} \in \cL\f$ and
+\f[
+  \lvert\mathrm{val}\rvert
+     = \min\Bigl\{\,
+             \bigl\lvert\langle \vect{a}, \vect{v} \rangle + b \bigr\rvert
+           \Bigm|
+             \vect{v} \in \cL
+           \,\Bigr\}.
+\f]
+
+Observe that the above definition is also applied to other simple objects in
+the library like polyhedra, octagonal shapes, bd-shapes and boxes
+and in such cases the definition of frequency can be simplified.
+For instance, the frequency for an object \f$\cP \in \Pset_n\f$ is
+defined if and only if there is a unique value \f$c\f$ such that
+\f$\cP\f$ saturates the equality \f$( \mathrm{expr} = c )\f$;
+in this case the frequency is \f$0\f$ and the value returned is \f$c\f$.
+
+\subsection Grid_Time_Elapse Time-Elapse Operator
+
+For any two grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>time-elapse</EM> between \f$\cL_1\f$ and \f$\cL_2\f$,
+denoted \f$ \cL_1 \nearrow \cL_2\f$,
+is the grid
+\f[
+  \bigl\{\,
+    \vect{p} + \mu \vect{q} \in \Rset^n
+  \bigm|
+    \vect{p} \in \cL_1, \vect{q} \in \cL_2, \mu \in \Zset
+  \,\bigr\}.
+\f]
+
+\subsection Grid_Relation_With Relation-with Operators
+
+The library provides operators for checking the relation holding
+between a grid  and
+a congruence, a grid generator, a constraint or a (polyhedron) generator.
+
+Suppose \f$\cL\f$ is a grid
+and \f$\cC\f$ an arbitrary congruence system representing \f$\cL\f$.
+Suppose also that
+\f$
+  \cg = \bigl(
+          \langle \vect{a}, \vect{x} \rangle \equiv_f b
+        \bigr)
+\f$
+is a congruence relation
+with \f$\cL_{\cg} = \gcon\bigl(\{\cg\}\bigr)\f$.
+The possible relations between \f$\cL\f$ and \f$\cg\f$ are as follows.
+- \f$\cL\f$ <EM>is disjoint</EM> from \f$\cg\f$ if
+  \f$\cL \inters \cL_{\cg} = \emptyset\f$; that is, adding \f$\cg\f$
+  to \f$\cC\f$ gives us the empty grid.
+- \f$\cL\f$ <EM>strictly intersects</EM> \f$\cg\f$ if
+  \f$\cL \inters \cL_{\cg} \neq \emptyset\f$ and
+  \f$\cL \inters \cL_{\cg} \subset \cL\f$;
+  that is, adding \f$\cg\f$ to \f$\cC\f$
+  gives us a non-empty grid strictly smaller than \f$\cL\f$.
+- \f$\cL\f$ <EM>is included</EM> in \f$\cg\f$ if \f$\cL \sseq \cL_{\cg}\f$;
+  that is, adding \f$\cg\f$ to \f$\cC\f$ leaves \f$\cL\f$ unchanged.
+- \f$\cL\f$ <EM>saturates</EM> \f$\cg\f$ if \f$\cL\f$ <EM>is included</EM>
+  in \f$\cg\f$ and \f$f = 0\f$, i.e., \f$\cg\f$ is an equality congruence.
+
+For the relation between \f$\cL\f$ and a constraint, suppose that
+\f$
+  c = \bigl(
+        \langle \vect{a}, \vect{x} \rangle \relsym b
+      \bigr)
+\f$
+is a constraint
+with \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$
+and \f$\cQ\f$ the set of points that satisfy \f$c\f$.
+The possible relations between \f$\cL\f$ and \f$c\f$ are as follows.
+- \f$\cL\f$ <EM>is disjoint</EM> from \f$c\f$ if
+  \f$\cL \inters \cQ = \emptyset\f$.
+- \f$\cL\f$ <EM>strictly intersects</EM> \f$c\f$ if
+  \f$\cL \inters \cQ \neq \emptyset\f$ and \f$\cL \inters \cQ \subset \cL\f$.
+- \f$\cL\f$ <EM>is included</EM> in \f$c\f$ if \f$\cL \sseq \cQ\f$.
+- \f$\cL\f$ <EM>saturates</EM> \f$c\f$ if \f$\cL\f$ <EM>is included</EM>
+  in \f$c\f$ and \f$\mathord{\relsym}\f$ is \f$=\f$.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a grid generator \f$g\f$
+if adding \f$g\f$ to any grid generator system representing \f$\cL\f$
+does not change \f$\cL\f$.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a (polyhedron) point or closure point
+\f$g\f$ if adding the corresponding grid point to any grid generator system
+representing \f$\cL\f$ does not change \f$\cL\f$.
+A grid \f$\cL\f$ <EM>subsumes</EM> a (polyhedron) ray or line
+\f$g\f$ if adding the corresponding grid line to any grid generator system
+representing \f$\cL\f$ does not change \f$\cL\f$.
+
+\subsection Grid_Wrapping_Operator Wrapping Operator
+
+The operator <CODE>wrap_assign</CODE> provided by the library, allows
+for the \ref Wrapping_Operator "wrapping" of a subset of the set of
+space dimensions so as to fit the given bounded integer type and have
+the specified overflow behavior.  In order to maximize the precision
+of this operator for grids, the exact behavior differs in some
+respects from the other simple classes of geometric descriptors.
+
+Suppose \f$\cL \in \Gset_n\f$ is a grid and \f$J\f$ a subset of the
+set of space dimensions \f$\{0, \ldots, n-1\}\f$.
+Suppose also that the width of the bounded integer type is \f$w\f$ so that
+the range of values \f$R = \{r \in \Rset \mid 0 \leq r < 2^w\}\f$
+if the type is unsigned
+and \f$R = \{r \in \Rset \mid -2^{w-1} \leq r < 2^{w-1}\}\f$ otherwise.
+Consider a space dimension \f$j \in J\f$ and a variable \f$v_j\f$
+for dimension \f$j\f$.
+
+If the value in \f$\cL\f$ for the variable \f$v_j\f$ is a constant in
+the range \f$R\f$, then it is unchanged.  Otherwise the result
+\f$\cL'\f$ of the operation on \f$\cL\f$ will depend on the specified
+overflow behavior.
+
+- Overflow impossible. In this case, it is known that no wrapping can
+  occur. If the grid \f$\cL\f$ has no value for the variable \f$v_j\f$ in the
+  range \f$R\f$, then \f$\cL\f$ is set empty. If \f$v_j\f$ has exactly
+  one value \f$a \in R\f$ in \f$\cL\f$, then \f$v_j\f$ is set
+  equal to \f$a\f$. Otherwise, \f$\cL' = \cL\f$.
+
+- Overflow undefined. In this case, for each value \f$a\f$ for
+  \f$v_j\f$ in the grid \f$\cL\f$, the wrapped value can be any value
+  \f$a + z \in R\f$ where \f$z \in \Zset\f$.
+  Therefore \f$\cL'\f$ is obtained by adding the parameter
+  \f$(0, \ldots, 0, v_j, 0, \ldots, 0)\f$,
+  where \f$v_j = 1\f$, to the generator system for \f$\cL\f$.
+
+- Overflow wraps. In this case, if \f$\cL\f$ already satisfies the
+  congruence \f$v_j = a \mod 2^w\f$, for some \f$a \in \Rset\f$, then
+  \f$v_j\f$ is set equal to \f$a'\f$ where \f$a' = a \mod 2^w\f$ and
+  \f$a'\in R\f$.  Otherwise, \f$\cL'\f$ is obtained by adding the
+  parameter \f$(0, \ldots, 0, v_j, 0, \ldots, 0)\f$, where
+  \f$v_j = 2^w\f$, to the generator system for \f$\cL\f$.
+
+\subsection Grid_Widening Widening Operators
+
+The library provides <EM>grid widening</EM> operators for the domain of grids.
+The congruence widening and generator widening
+follow the specifications provided in \ref BDHetal05 "[BDHetal05]".
+The third widening uses either
+the congruence or the generator widening, the exact rule governing this choice
+at the time of the call is left to the implementation.
+Note that, as for the widenings provided for convex polyhedra,
+all the operations provided by the library
+for computing a widening \f$\cL_1 \widen \cL_2\f$ of
+grids \f$\cL_1, \cL_2 \in \Gset_n\f$ require as a precondition that
+\f$\cL_1 \sseq \cL_2\f$.
+
+\note
+As is the case for the other operators on grids, the
+implementation overwrites one of the two grid arguments with the
+result of the widening application.
+It is worth stressing that, in any widening operation that computes the
+widening \f$\cL_1 \widen \cL_2\f$, the resulting grid will be assigned
+to overwrite the store containing the bigger grid \f$\cL_2\f$.
+The smaller grid \f$\cL_1\f$ is not modified.
+The same observation holds for all flavors of widenings and extrapolation
+operators that are implemented in the library and for all the language
+interfaces.
+
+\subsection Grid_Widening_with_Tokens Widening with Tokens
+
+This is as for \ref Widening_with_Tokens "widening with tokens"
+for convex polyhedra.
+
+\subsection Grid_Extrapolation Extrapolation Operators
+
+Besides the widening operators, the library also implements several
+<EM>extrapolation</EM> operators, which differ from widenings in that
+their use along an upper iteration sequence does not ensure convergence
+in a finite number of steps.
+
+In particular, for each grid widening that is provided,
+there is a corresponding
+<EM>limited</EM> extrapolation operator, which can be used to implement
+the <EM>widening ``up to''</EM> technique as described in
+\ref HPR97 "[HPR97]".
+Each limited extrapolation operator takes a congruence system as an
+additional parameter and uses it to improve the approximation yielded
+by the corresponding widening operator. Note that,
+as in the case for convex polyhedra, a convergence guarantee
+can only be obtained by suitably restricting the set of
+congruence relations that can occur in this additional parameter.
+
+\section powerset The Powerset Construction
+
+The PPL provides the finite powerset construction; this takes a
+pre-existing domain and upgrades it to one that can represent
+disjunctive information (by using a <EM>finite</EM> number of
+disjuncts).  The construction follows the approach described in
+\ref Bag98 "[Bag98]", also summarized in \ref BHZ04 "[BHZ04]" where there
+is an account of generic widenings for the powerset domain (some of
+which are supported in the pointset powerset domain instantiation
+of this construction described in Section \ref pointset_powerset).
+
+\anchor powerset_domain
+\subsection The_Powerset_Domain The Powerset Domain
+
+The domain is built from a pre-existing base-level domain
+\f$D\f$ which must include an entailment relation `\f$\mathord{\entails}\f$',
+meet operation `\f$\mathord{\meet}\f$', a top element `\f$\true\f$' and
+bottom element `\f$\false\f$'.
+
+A set \f$\cS \in \wp(D)\f$ is called <EM>non-redundant</EM>
+with respect to `\f$\mathord{\entails}\f$' if and only if
+\f$\false \notin \cS\f$
+and \f$\forall d_1, d_2 \in \cS \itc d_1 \entails d_2 \implies d_1 = d_2\f$.
+The set of finite non-redundant subsets of \f$D\f$
+(with respect to `\f$\mathord{\entails}\f$')
+is denoted by \f$\wpfn{D}{\entails}\f$.
+The function
+\f$\fund{\nonredmap}{\wpf(D)}{\wpfn{D}{\entails}}\f$,
+called <EM>Omega-reduction</EM>,
+maps a finite set into its non-redundant counterpart;
+it is defined, for each \f$\cS \in \wpf(D)\f$, by
+\f[
+  \nonredmap(\cS)
+    \defeq
+      \cS \setdiff \{\,
+                   d \in \cS
+                 \mid
+                   d = \false \text{ or } \exists d' \in \cS \st d \sentails d'
+                 \,\}.
+\f]
+where \f$d \sentails d'\f$ denotes \f$d \entails d' \land d \ne d'\f$.
+
+As the intended semantics of a powerset domain element \f$\cS \in \wpf(D)\f$
+is that of disjunction of the semantics of \f$D\f$,
+the finite set \f$\cS\f$ is semantically equivalent
+to the non-redundant set \f$\nonredmap(\cS)\f$;
+and elements of \f$\cS\f$ will be called <EM>disjuncts</EM>.
+The restriction to the finite subsets reflects the fact that here
+disjunctions are implemented by explicit collections of disjuncts.
+As a consequence of this restriction, for any \f$\cS \in \wpf(D)\f$
+such that \f$\cS \neq \{ \false \}\f$, \f$\nonredmap(\cS)\f$ is the (finite)
+set of the maximal elements of \f$\cS\f$.
+
+The <EM>finite powerset domain</EM> over a domain \f$D\f$ is the set
+of all finite non-redundant sets of \f$D\f$ and denoted by \f$D_{\smallP}\f$.
+The domain includes an approximation ordering
+`\f$\mathord{\entailsP}\f$' defined so that,
+for any \f$\cS_1\f$ and \f$\cS_2 \in D_{\smallP}\f$,
+\f$\cS_1 \entailsP \cS_2\f$ if and only if
+\f[
+  \forall d_1 \in \cS_1 \itc
+    \exists d_2 \in \cS_2 \st
+      d_1 \entails d_2.
+\f]
+Therefore the top element is \f$\{\true\}\f$ and the bottom element is the
+emptyset.
+
+\note
+As far as Omega-reduction is concerned, the library adopts a
+<EM>lazy</EM> approach: an element of the powerset domain is
+represented by a potentially redundant sequence of disjuncts.
+Redundancies can be eliminated by explicitly invoking the operator
+<CODE>omega_reduce()</CODE>, e.g., before performing the output of a
+powerset element. Note that all the documented operators automatically
+perform Omega-reductions on their arguments, when needed or appropriate.
+
+\section ps_operations Operations on the Powerset Construction
+
+In this section we briefly describe the generic operations on Powerset Domains
+that are provided by the library for any given base-level domain \f$D\f$.
+
+\anchor ps_meet_upper_bound
+\subsection Meet_and_Upper_Bound Meet and Upper Bound
+
+Given the sets \f$\cS_1\f$ and \f$\cS_2 \in D_{\smallP}\f$, the
+<EM>meet</EM> and <EM>upper bound</EM> operators provided by the
+library returns the set
+\f$
+  \nonredmap
+    \bigl(
+      \{\,
+        d_1 \meet d_2
+      \mid
+        d_1 \in \cS_1, d_2 \in \cS_2
+      \,\}
+    \bigr)
+\f$
+and Omega-reduced set union \f$\nonredmap(\cS_1 \union \cS_2)\f$ respectively.
+
+\anchor ps_add_disjunct
+\subsection Adding_a_Disjunct Adding a Disjunct
+
+Given the powerset element \f$\cS \in D_{\smallP}\f$ and the base-level
+element \f$d \in D\f$, the <EM>add disjunct</EM> operator provided by
+the library returns the powerset element
+\f$\nonredmap\bigl(\cS \union \{d\}\bigr)\f$.
+
+\anchor ps_collapse
+\subsection Collapsing_a_Powerset_Element Collapsing a Powerset Element
+
+If the given powerset element is not empty, then the
+<EM>collapse</EM> operator returns the
+singleton powerset consisting of an upper-bound of all the disjuncts.
+
+\section pointset_powerset The Pointset Powerset Domain
+
+The pointset powerset domain provided by the PPL is the finite
+powerset domain (defined in Section \ref powerset) whose base-level domain
+\f$D\f$ is one of the classes of semantic geometric descriptors listed in
+Section \ref Semantic_Geometric_Descriptors.
+
+In addition to the operations described for the generic powerset
+domain in Section \ref ps_operations, the PPL provides
+all the generic operations
+listed in \ref Generic_Operations_on_Semantic_Geometric_Descriptors.
+Here we just describe those operations that
+are particular to the pointset powerset domain.
+
+\subsection Powerset_Meet_Preserving_Simplification Meet-Preserving Simplification
+
+Let \f$\cS_1 = \{ d_1, \ldots, d_m \}\f$,
+\f$\cS_2 = \{ c_1, \ldots, c_n \}\f$ and
+\f$\cS = \{ s_1, \ldots, s_q \}\f$
+be Omega-reduced elements of a pointset powerset domain
+over the same base-level domain.
+Then:
+
+ - \f$\cS\f$ is <EM>powerset meet-preserving</EM>
+   with respect to \f$\cS_1\f$ using context \f$\cS_2\f$ if
+   the meet of \f$\cS\f$ and \f$\cS_2\f$
+   is equal to
+   the meet of \f$\cS_1\f$ and \f$\cS_2\f$;
+
+ - \f$\cS\f$ is a <EM>powerset simplification</EM> with respect to
+   \f$\cS_1\f$ if \f$q \leq m\f$.
+
+ - \f$\cS\f$ is a <EM>disjunct meet-preserving simplification</EM>
+    with respect to \f$\cS_1\f$
+    if, for each \f$s_k \in \cS\f$,
+    there exists \f$d_i \in \cS_1\f$ such that, for each \f$c_j \in \cS_2\f$,
+    \f$s_k\f$ is a meet-preserving enlargement and simplification
+    of \f$d_i\f$ using context \f$c_j\f$.
+
+The library provides a binary operator (<CODE>simplify_using_context</CODE>)
+for the pointset powerset domain that returns a powerset which is a
+powerset meet-preserving, powerset simplification and
+disjunct meet-preserving simplification
+of its first argument using the second argument as context.
+
+Notice that, due to the powerset simplification property, in general
+a meet-preserving powerset simplification is <em>not</em> an enlargement
+with respect to the ordering defined on the powerset lattice.
+Because of this, the operator provided by the library
+is only well-defined when the base-level domain
+is not itself a powerset domain.
+
+
+\anchor pps_geometric
+\subsection Geometric_Comparisons Geometric Comparisons
+
+Given the pointset powersets \f$\cS_1, \cS_2\f$ over the same base-level domain
+and with the same space dimension, then
+we say that \f$\cS_1\f$ <EM>geometrically covers</EM> \f$\cS_2\f$
+if every point (in some disjunct) of \f$\cS_2\f$ is also
+a point in a disjunct of \f$\cS_1\f$.
+If \f$\cS_1\f$ geometrically covers \f$\cS_2\f$
+and \f$\cS_2\f$ geometrically covers \f$\cS_1\f$,
+then we say that they are <EM>geometrically equal</EM>.
+
+
+\anchor pps_pairwise_merge
+\subsection Pairwise_Merge Pairwise Merge
+
+Given the pointset powerset \f$\cS\f$ over a base-level semantic GD domain
+\f$D\f$, then the
+<EM>pairwise merge</EM> operator takes pairs of distinct elements in
+\f$\cS\f$ whose upper bound (denoted here by \f$\uplus\f$) in \f$D\f$
+(using the PPL operator <CODE>upper_bound_assign()</CODE> for \f$D\f$)
+is the same as their set-theoretical union
+and replaces them by their union.  This replacement is done
+recursively so that, for each pair \f$c, d\f$ of distinct
+disjuncts in the result set, we have
+\f$c \uplus d \neq c \union d\f$.
+
+\anchor pps_bgp99_extrapolation
+\subsection Powerset_Extrapolation_Operators Powerset Extrapolation Operators
+
+The library implements a generalization of the extrapolation operator
+for powerset domains proposed in \ref BGP99 "[BGP99]".
+The operator <CODE>BGP99_extrapolation_assign</CODE> is made parametric
+by allowing for the specification of any PPL extrapolation operator
+for the base-level domain.
+Note that, even when the extrapolation operator for the
+base-level domain \f$D\f$ is known to be a widening on \f$D\f$,
+the <CODE>BGP99_extrapolation_assign</CODE> operator cannot guarantee the
+convergence of the iteration sequence in a finite number of steps
+(for a counter-example, see \ref BHZ04 "[BHZ04]").
+
+\anchor pps_certificate_widening
+\subsection Certificate_Based_Widenings Certificate-Based Widenings
+
+The PPL library provides support for the specification of proper widening
+operators on the pointset powerset domain. In particular,
+this version of the library implements an instance of the
+<EM>certificate-based widening framework</EM> proposed in
+\ref BHZ03b "[BHZ03b]".
+
+A <EM>finite convergence certificate</EM> for an extrapolation operator
+is a formal way of ensuring that such an operator is indeed a widening
+on the considered domain. Given a widening operator on the base-level
+domain \f$D\f$, together with the corresponding convergence certificate,
+the BHZ03 framework is able to lift this widening on \f$D\f$
+to a widening on the pointset powerset domain; ensuring
+convergence in a finite number of iterations.
+
+Being highly parametric, the BHZ03 widening framework can be
+instantiated in many ways. The current implementation provides
+the templatic operator
+<CODE>BHZ03_widening_assign\<Certificate, Widening\></CODE>
+which only exploits a fraction of this generality, by allowing the
+user to specify the base-level widening function and the corresponding
+certificate. The widening strategy is fixed and uses two extrapolation
+heuristics: first, the upper bound operator for the base-level domain
+is tried; second,
+the \ref pps_bgp99_extrapolation "BGP99 extrapolation operator" is tried,
+possibly applying \ref pps_pairwise_merge "pairwise merging".
+If both heuristics fail to converge according to the convergence
+certificate, then an attempt is made to apply the base-level widening
+to the upper bound of the two arguments, possibly improving the result
+obtained by means of the difference operator for the base-level domain.
+For more details and a justification of the overall approach,
+see \ref BHZ03b "[BHZ03b]" and \ref BHZ04 "[BHZ04]".
+
+The library provides several convergence certificates.
+Note that, for the domain of Polyhedra, while
+\ref Parma_Polyhedra_Library::BHRZ03_Certificate the "BHRZ03_Certificate"
+is compatible with both the BHRZ03 and the H79 widenings,
+\ref Parma_Polyhedra_Library::H79_Certificate "H79_Certificate"
+is only compatible with the latter.
+Note that using different certificates will change the results obtained,
+even when using the same base-level widening operator.
+It is also worth stressing that it is up to the user
+to see that the widening operator is actually compatible with
+a given convergence certificate. If such a requirement is not met,
+then an extrapolation operator will be obtained.
+
+\section floating_point Analysis of floating point computations
+
+This section describes the PPL abstract domains that are used for
+approximating floating point computations in software analysis. We follow
+the approch described in \ref Min04 "[Min04]" and more detailedly in
+\ref Min05 "[Min05]". We will denote by \f$\cV\f$ the set of all floating
+point variables in the analyzed program. We will also denote by
+\f$\mathbb{F}_a\f$ the set of floating point numbers in the format used by the
+analyzer (that is, the machine running the PPL) and by \f$\mathbb{F}_t\f$
+the set of floating point numbers in the format used by the machine that is
+expected to run the analyzed program. Recall that floating point numbers
+include the infinities \f$-\infty\f$ and \f$+\infty\f$.
+
+\subsection interval_linear_forms Linear forms with interval coefficients
+
+Generic concrete <EM>floating point expressions</EM> on
+\f$\mathbb{F}_t\f$ are represented by the
+\link Parma_Polyhedra_Library::Floating_Point_Expression \c Floating_Point_Expression \endlink
+abstract class. Its concrete derivate classes are:
+  - \link Parma_Polyhedra_Library::Cast_Floating_Point_Expression \c Cast_Floating_Point_Expression \endlink,
+  - \link Parma_Polyhedra_Library::Constant_Floating_Point_Expression \c Constant_Floating_Point_Expression \endlink,
+  - \link Parma_Polyhedra_Library::Variable_Floating_Point_Expression \c Variable_Floating_Point_Expression \endlink,
+  - \link Parma_Polyhedra_Library::Opposite_Floating_Point_Expression \c Opposite_Floating_Point_Expression \endlink,
+    that is the negation (unary minus) of a floating point expression,
+  - \link Parma_Polyhedra_Library::Sum_Floating_Point_Expression \c Sum_Floating_Point_Expression \endlink,
+    that is the sum of two floating point expressions,
+  - \link Parma_Polyhedra_Library::Difference_Floating_Point_Expression \c Difference_Floating_Point_Expression \endlink,
+    that is the difference of two floating point expressions,
+  - \link Parma_Polyhedra_Library::Multiplication_Floating_Point_Expression \c Multiplication_Floating_Point_Expression \endlink,
+    that is the product of two floating point expressions, and
+  - \link Parma_Polyhedra_Library::Division_Floating_Point_Expression \c Division_Floating_Point_Expression \endlink,
+    that is the division of two floating point expressions.
+
+The set of all the possible values in \f$\mathbb{F}_t\f$ of a floating point
+expression at a given program point in a given abstract store can be
+overapproximated by a <EM>linear form</EM> with interval coefficients, that is
+a linear expression of this kind:
+
+\f[
+  i + \sum_{v \in \cV}i_{v}v,
+\f]
+
+where all \f$v\f$ are free floating point variables and \f$i\f$ and all
+\f$i_{v}\f$ are elements of \f$\mathbb{I}_a\f$, defined as the set of all
+intervals with boundaries in \f$\mathbb{F}_a\f$. This operation is called
+<EM>linearization</EM> and is performed by the method linearize of floating
+point expression classes.
+
+Even though the intervals may be open, we will always use closed intervals
+in the documentation for the sake of simplicity, with the exception of unbounded
+intervals that have \f$\infty\f$ boundaries. We denote the set of all linear
+forms on \f$\mathbb{F}_a\f$ by \f$\mathbb{L}_a\f$.
+
+The \link Parma_Polyhedra_Library::Linear_Form \c Linear_Form \endlink class
+provides common algebraic operations on linear forms: you can add or
+subtract two linear forms, and multiply or divide a linear form by a scalar.
+We are writing only about interval linear forms in this section, so our
+scalars will always be intervals with floating point boundaries.
+The operations on interval linear forms are intuitively defined as follows:
+
+\f[
+
+  \left(i + \sum_{v \in V}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in V}i'_{v}v\right)
+  \defeq
+  \left(i \asifp i'\right) +
+  \sum_{v \in V}\left(i_{v} \asifp i'_{v}\right)v,
+
+\f]
+
+\f[
+
+  \left(i + \sum_{v \in V}i_{v}v\right)
+  \adlf
+  \left(i' + \sum_{v \in V}i'_{v}v\right)
+  \defeq
+  \left(i \adifp i'\right) +
+  \sum_{v \in V}\left(i_{v} \adifp i'_{v}\right)v,
+
+\f]
+
+\f[
+
+  i
+  \amlf
+  \left(i' + \sum_{v \in V}i'_{v}v\right)
+  \defeq
+  \left(i \amifp i'\right) +
+  \sum_{v \in V}\left(i \amifp i'_{v}\right)v,
+
+\f]
+
+\f[
+
+  \left(i + \sum_{v \in V}i_{v}v\right)
+  \adivlf
+  i'
+  \defeq
+  \left(i \adivifp i'\right) +
+  \sum_{v \in V}\left(i_{v} \adivifp i'\right)v.
+
+\f]
+
+Where \f$\asifp, \adifp, \amifp,\f$ and \f$\adivifp\f$ are the corresponding
+operations on intervals. Note that these operations always round the
+interval's lower bound towards \f$-\infty\f$ and the upper bound towards
+\f$+\infty\f$ in order to obtain a correct overapproximation.
+
+A <EM>(composite) floating point abstract store</EM> is used to associate each
+floating point variable with its currently known approximation. The store is
+composed by two parts:
+  - an <EM>interval abstract store</EM>
+    \f$\fund{\rho^{\#}}{\cV}{\mathbb{I}_a}\f$
+    associating each variable with its current approximating interval, and
+  - a <EM>linear form abstract store</EM>
+    \f$\fund{\rho^{\#}_l}{\cV}{\mathbb{L}_a}\f$
+    associating each variable with its current approximating linear form.
+
+An interval abstract store is represented by a
+\link Parma_Polyhedra_Library::Box \c Box \endlink with floating point
+boundaries, while a linear form abstract store is a map
+of the Standard Template Library. The <CODE>linearize</CODE> method requires
+both stores as its arguments. Please see the documentation of floating point
+expression classes for more information.
+
+The linearization of a floating point expression \f$e\f$ in the composite
+abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right \rrbracket\f$ will
+be denoted by \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$. There are two ways a linearization attempt can fail:
+  - whenever an interval boundary overflows to \f$+\infty\f$ or \f$-\infty\f$,
+    and
+  - when we try to divide by an interval that contains \f$0\f$.
+
+\subsection fp_abstract_domains Use of other abstract domains for floating point analysis
+
+Three of the other abstract domains of the PPL (
+\link Parma_Polyhedra_Library::BD_Shape \c BD_Shape \endlink,
+\link Parma_Polyhedra_Library::Octagonal_Shape \c Octagonal_Shape \endlink,
+and \link Parma_Polyhedra_Library::Polyhedron \c Polyhedron \endlink)
+provide a few optimized methods to be used in the analysis of floating point
+computations. They are recognized by the fact that they take interval
+linear forms and/or an interval abstract stores as their parameters.
+
+Please see the methods' documentation for more information.
+
+\section use_of_library Using the Library
+
+\subsection A_Note_on_the_Implementation_of_the_Operators A Note on the Implementation of the Operators
+
+When adopting the double description method for the representation of
+convex polyhedra, the implementation of most of the operators may
+require an explicit conversion from one of the two representations
+into the other one, leading to algorithms having a worst-case
+exponential complexity.  However, thanks to the adoption of lazy and
+incremental computation techniques, the library turns out to be rather
+efficient in many practical cases.
+
+In earlier versions of the library, a number of operators were introduced
+in two flavors: a <EM>lazy</EM> version and an <EM>eager</EM> version,
+the latter having the operator name ending with <CODE>_and_minimize</CODE>.
+In principle, only the lazy versions should be used.
+The eager versions were added to help a knowledgeable user obtain better
+performance in particular cases. Basically, by invoking the eager version
+of an operator, the user is trading laziness to better exploit the
+incrementality of the inner library computations.
+Starting from version 0.5, the lazy and incremental computation techniques
+have been refined to achieve a better integration: as a consequence,
+the lazy versions of the operators are now almost always more efficient
+than the eager versions.
+
+One of the cases when an eager computation might still make sense
+is when the well-known <EM>fail-first</EM> principle comes into play.
+For instance, if you have to compute the intersection of several
+polyhedra and you strongly suspect that the result will become empty
+after a few of these intersections, then you may obtain a better
+performance by calling the eager version of the intersection operator,
+since the minimization process also enforces an emptiness check.
+Note anyway that the same effect can be obtained by interleaving
+the calls of the lazy operator with explicit emptiness checks.
+
+\warning
+For the reasons mentioned above, starting from version 0.10 of the
+library, the usage of the eager versions (i.e., the ones having a
+name ending with <CODE>_and_minimize</CODE>) of these operators is
+\em deprecated; this is in preparation of their complete removal,
+which will occur starting from version 0.11.
+
+\subsection On_Pointset_Powerset_and_Partially_Reduced_Product_Domains_A_Warning On Pointset_Powerset and Partially_Reduced_Product Domains: A Warning
+
+  For future versions of the PPL library all practical instantiations
+for the disjuncts for a pointset_powerset and component domains for
+the partially_reduced_product domains will be fully
+supported. However, for version 0.10, these compound domains should
+not themselves occur as one of their argument domains.  Therefore their
+use comes with the following warning.
+
+\warning
+The <CODE>Pointset_Powerset<PSET></CODE> and
+<CODE>Partially_Reduced_Product<D1, D2, R></CODE>
+should only be used with the following instantiations
+for the disjunct domain template \p PSET and component domain
+templates \p D1 and \p D2:
+<CODE>C_Polyhedron</CODE>,
+<CODE>NNC_Polyhedron</CODE>,
+<CODE>Grid</CODE>,
+<CODE>Octagonal_Shape<T></CODE>,
+<CODE>BD_Shape<T></CODE>,
+<CODE>Box<T></CODE>.
+
+\subsection On_Object_Orientation_and_Polymorphism_A_Disclaimer On Object-Orientation and Polymorphism: A Disclaimer
+
+The PPL library is mainly a collection of so-called ``concrete data
+types'': while providing the user with a clean and friendly interface,
+these types are not meant to --- i.e., they should not --- be used
+polymorphically (since, e.g., most of the destructors are not declared
+<CODE>virtual</CODE>). In practice, this restriction means that the
+library types should not be used as <EM>public base classes</EM> to be
+derived from. A user willing to extend the library types, adding new
+functionalities, often can do so by using <EM>containment</EM> instead
+of inheritance; even when there is the need to override a
+<CODE>protected</CODE> method, non-public inheritance should suffice.
+
+\subsection On_Const_Correctness_A_Warning_about_the_Use_of_References_and_Iterators On Const-Correctness: A Warning about the Use of References and Iterators
+
+Most operators of the library depend on one or more parameters
+that are declared ``const'', meaning that they will not be changed
+by the application of the considered operator.
+Due to the adoption of lazy computation techniques, in many cases
+such a const-correctness guarantee only holds at the semantic level,
+whereas it does not necessarily hold at the implementation level.
+For a typical example, consider the extraction from a polyhedron
+of its constraint system representation.
+While this operation is not going to change the polyhedron,
+it might actually invoke the internal conversion algorithm
+and modify the generators representation of the polyhedron object,
+e.g., by reordering the generators and removing those that are
+detected as redundant. Thus, any previously computed reference
+to the generators of the polyhedron (be it a direct reference object
+or an indirect one, such as an iterator) will no longer be valid.
+For this reason, code fragments such as the following should be
+avoided, as they may result in undefined behavior:
+\code
+// Find a reference to the first point of the non-empty polyhedron `ph'.
+const Generator_System& gs = ph.generators();
+Generator_System::const_iterator i = gs.begin();
+for (Generator_System::const_iterator gs_end = gs.end(); i != gs_end; ++i)
+  if (i->is_point())
+    break;
+const Generator& p = *i;
+// Get the constraints of `ph'.
+const Constraint_System& cs = ph.constraints();
+// Both the const iterator `i' and the reference `p'
+// are no longer valid at this point.
+cout << p.divisor() << endl;  // Undefined behavior!
+++i;                          // Undefined behavior!
+\endcode
+As a rule of thumb, if a polyhedron plays any role in a computation
+(even as a const parameter), then any previously computed reference
+to parts of the polyhedron may have been invalidated.
+Note that, in the example above, the computation of the constraint system
+could have been placed after the uses of the iterator <CODE>i</CODE>
+and the reference <CODE>p</CODE>.
+Anyway, if really needed, it is always possible to take a copy of,
+instead of a reference to, the parts of interest of the polyhedron;
+in the case above, one may have taken a copy of the generator system
+by replacing the second line of code with the following:
+\code
+Generator_System gs = ph.generators();
+\endcode
+The same observations, modulo syntactic sugar, apply to the operators
+defined in the C interface of the library.
+
+\section bibliography Bibliography
+
+<DL>
+
+<DT>[Anc91]</DT>
+<DD>
+\anchor Anc91
+C. Ancourt.
+ <em>Génération automatique de codes de transfert pour
+  multiprocesseurs à mémoires locales</em>.
+ PhD thesis, Université de Paris VI, Paris, France, March 1991.
+
+</DD>
+
+
+<DT>[BA05]</DT>
+<DD>
+\anchor BA05
+J. M. Bjorndalen and O. Anshus.
+ Lessons learned in benchmarking - Floating point benchmarks: Can
+  you trust them?
+ In <em>Proceedings of the <em>Norsk informatikkonferanse 2005</em>
+  (NIK 2005)</em>, pages 89-100, Bergen, Norway, 2005. Tapir Akademisk Forlag.
+
+
+</DD>
+
+
+<DT>[Bag97]</DT>
+<DD>
+\anchor Bag97
+R. Bagnara.
+ <em>Data-Flow Analysis for Constraint Logic-Based Languages</em>.
+ PhD thesis, Dipartimento di Informatica, Università di Pisa, Pisa,
+  Italy, March 1997.
+ Printed as Report TD-1/97.
+
+</DD>
+
+
+<DT>[Bag98]</DT>
+<DD>
+\anchor Bag98
+R. Bagnara.
+ A hierarchy of constraint systems for data-flow analysis of
+  constraint logic-based languages.
+ <em>Science of Computer Programming</em>, 30(1-2):119-155, 1998.
+
+
+</DD>
+
+
+<DT>[BCC<sup>+</sup>02]</DT>
+<DD>
+\anchor BCCetal02
+B. Blanchet, P. Cousot, R. Cousot, J. Feret, L. Mauborgne, A. Miné,
+  D. Monniaux, and X. Rival.
+ Design and implementation of a special-purpose static program
+  analyzer for safety-critical real-time embedded software.
+ In T. Æ. Mogensen, D. A. Schmidt, and I. Hal Sudborough,
+  editors, <em>The Essence of Computation, Complexity, Analysis,
+  Transformation. Essays Dedicated to Neil D. Jones [on occasion of his 60th
+  birthday]</em>, volume 2566 of <em>Lecture Notes in Computer Science</em>, pages
+  85-108. Springer-Verlag, Berlin, 2002.
+
+</DD>
+
+
+<DT>[BDH<sup>+</sup>05]</DT>
+<DD>
+\anchor BDHetal05
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ A linear domain for analyzing the distribution of numerical values.
+ Report 2005.06, School of Computing, University of Leeds, UK, 2005.
+
+
+</DD>
+
+
+<DT>[BDH<sup>+</sup>06]</DT>
+<DD>
+\anchor BDHetal06
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ A practical tool for analyzing the distribution of numerical values,
+  2006.
+ Available at
+  <a href="http://www.comp.leeds.ac.uk/hill/Papers/papers.html">http://www.comp.leeds.ac.uk/hill/Papers/papers.html</a>.
+
+</DD>
+
+
+<DT>[BDH<sup>+</sup>07]</DT>
+<DD>
+\anchor BDHetal07
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ Grids: A domain for analyzing the distribution of numerical values.
+ In G. Puebla, editor, <em>Logic-based Program Synthesis and
+  Transformation, 16th International Symposium</em>, volume 4407 of <em>Lecture
+  Notes in Computer Science</em>, pages 219-235, Venice, Italy, 2007.
+  Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[BFM11]</DT>
+<DD>
+\anchor BFM11
+M. Benerecetti, M. Faella, and S. Minopoli.
+ Towards efficient exact synthesis for linear hybrid systems.
+ In <em>Proceedings of 2nd International Symposium on Games,
+  Automata, Logics and Formal Verification (GandALF 2011)</em>, volume 54 of <em>
+  Electronic Proceedings in Theoretical Computer Science</em>, pages 263-277,
+  Minori, Amalfi Coast, Italy, 2011.
+
+</DD>
+
+
+<DT>[BFM13]</DT>
+<DD>
+\anchor BFM13
+M. Benerecetti, M. Faella, and S. Minopoli.
+ Automatic synthesis of switching controllers for linear hybrid
+  systems: Safety control.
+ <em>Theoretical Computer Science</em>, 493:116-138, 2013.
+
+</DD>
+
+
+<DT>[BFT00]</DT>
+<DD>
+\anchor BFT00
+A. Bemporad, K. Fukuda, and F. D. Torrisi.
+ Convexity recognition of the union of polyhedra.
+ Report AUT00-13, Automatic Control Laboratory, ETHZ, Zurich,
+  Switzerland, 2000.
+
+
+</DD>
+
+
+<DT>[BFT01]</DT>
+<DD>
+\anchor BFT01
+A. Bemporad, K. Fukuda, and F. D. Torrisi.
+ Convexity recognition of the union of polyhedra.
+ <em>Computational Geometry: Theory and Applications</em>,
+  18(3):141-154, 2001.
+
+</DD>
+
+
+<DT>[BGP99]</DT>
+<DD>
+\anchor BGP99
+T. Bultan, R. Gerber, and W. Pugh.
+ Model-checking concurrent systems with unbounded integer variables:
+  Symbolic representations, approximations, and experimental results.
+ <em>ACM Transactions on Programming Languages and Systems</em>,
+  21(4):747-789, 1999.
+
+
+</DD>
+
+
+<DT>[BHMZ04]</DT>
+<DD>
+\anchor BHMZ04
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening operators for weakly-relational numeric abstractions.
+ Report <tt>arXiv:cs.PL/0412043</tt>, 2004.
+ Extended abstract. Contribution to the <em>International workshop
+  on “Numerical & Symbolic Abstract Domains”</em> (NSAD'05, Paris, January 21,
+  2005). Available at <a href="http://arxiv.org/">http://arxiv.org/</a> and
+  <a href="http://bugseng.com/products/ppl/">http://bugseng.com/products/ppl/</a>.
+
+
+</DD>
+
+
+<DT>[BHMZ05a]</DT>
+<DD>
+\anchor BHMZ05a
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening operators for weakly-relational numeric abstractions.
+ Quaderno 399, Dipartimento di Matematica, Università di Parma,
+  Italy, 2005.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+
+</DD>
+
+
+<DT>[BHMZ05b]</DT>
+<DD>
+\anchor BHMZ05b
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening operators for weakly-relational numeric abstractions.
+ In C. Hankin and I. Siveroni, editors, <em>Static Analysis:
+  Proceedings of the 12th International Symposium</em>, volume 3672 of <em>Lecture
+  Notes in Computer Science</em>, pages 3-18, London, UK, 2005. Springer-Verlag,
+  Berlin.
+
+</DD>
+
+
+<DT>[BHRZ03a]</DT>
+<DD>
+\anchor BHRZ03a
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+ Precise widening operators for convex polyhedra.
+ In R. Cousot, editor, <em>Static Analysis: Proceedings of the 10th
+  International Symposium</em>, volume 2694 of <em>Lecture Notes in Computer
+  Science</em>, pages 337-354, San Diego, California, USA, 2003. Springer-Verlag,
+  Berlin.
+
+
+</DD>
+
+
+<DT>[BHRZ03b]</DT>
+<DD>
+\anchor BHRZ03b
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+ Precise widening operators for convex polyhedra.
+ Quaderno 312, Dipartimento di Matematica, Università di Parma,
+  Italy, 2003.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BHRZ05]</DT>
+<DD>
+\anchor BHRZ05
+R. Bagnara, P. M. Hill, E. Ricci, and E. Zaffanella.
+ Precise widening operators for convex polyhedra.
+ <em>Science of Computer Programming</em>, 58(1-2):28-56, 2005.
+
+
+</DD>
+
+
+<DT>[BHZ02a]</DT>
+<DD>
+\anchor BHZ02a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ A new encoding and implementation of not necessarily closed convex
+  polyhedra.
+ Quaderno 305, Dipartimento di Matematica, Università di Parma,
+  Italy, 2002.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BHZ02b]</DT>
+<DD>
+\anchor BHZ02b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ A new encoding of not necessarily closed convex polyhedra.
+ In M. Carro, C. Vacheret, and K.-K. Lau, editors, <em>Proceedings of
+  the 1st CoLogNet Workshop on Component-based Software Development and
+  Implementation Technology for Computational Logic Systems</em>, pages 147-153,
+  Madrid, Spain, 2002.
+ Published as TR Number CLIP4/02.0, Universidad Politécnica de
+  Madrid, Facultad de Informática.
+
+
+</DD>
+
+
+<DT>[BHZ03a]</DT>
+<DD>
+\anchor BHZ03a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ A new encoding and implementation of not necessarily closed convex
+  polyhedra.
+ In M. Leuschel, S. Gruner, and S. Lo Presti, editors, <em>
+  Proceedings of the 3rd Workshop on Automated Verification of Critical
+  Systems</em>, pages 161-176, Southampton, UK, 2003.
+ Published as TR Number DSSE-TR-2003-2, University of Southampton.
+
+
+</DD>
+
+
+<DT>[BHZ03b]</DT>
+<DD>
+\anchor BHZ03b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ In B. Steffen and G. Levi, editors, <em>Verification, Model Checking
+  and Abstract Interpretation: Proceedings of the 5th International Conference
+  (VMCAI 2004)</em>, volume 2937 of <em>Lecture Notes in Computer Science</em>, pages
+  135-148, Venice, Italy, 2003. Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[BHZ04]</DT>
+<DD>
+\anchor BHZ04
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ Quaderno 349, Dipartimento di Matematica, Università di Parma,
+  Italy, 2004.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BHZ05]</DT>
+<DD>
+\anchor BHZ05
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Not necessarily closed convex polyhedra and the double description
+  method.
+ <em>Formal Aspects of Computing</em>, 17(2):222-257, 2005.
+
+</DD>
+
+
+<DT>[BHZ06a]</DT>
+<DD>
+\anchor BHZ06a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ The Parma Polyhedra Library: Toward a complete set of numerical
+  abstractions for the analysis and verification of hardware and software
+  systems.
+ Quaderno 457, Dipartimento di Matematica, Università di Parma,
+  Italy, 2006.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. Also
+  published as <tt>arXiv:cs.MS/0612085</tt>, available from
+  <a href="http://arxiv.org/">http://arxiv.org/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ06b]</DT>
+<DD>
+\anchor BHZ06b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ <em>Software Tools for Technology Transfer</em>, 8(4/5):449-466, 2006.
+ In the printed version of this article, all the figures have been
+  improperly printed (rendering them useless). See
+  \ref BHZ07c "[BHZ07c]".
+
+
+</DD>
+
+
+<DT>[BHZ07a]</DT>
+<DD>
+\anchor BHZ07a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Applications of polyhedral computations to the analysis and
+  verification of hardware and software systems.
+ Quaderno 458, Dipartimento di Matematica, Università di Parma,
+  Italy, 2007.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. Also
+  published as <tt>arXiv:cs.CG/0701122</tt>, available from
+  <a href="http://arxiv.org/">http://arxiv.org/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ07b]</DT>
+<DD>
+\anchor BHZ07b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ An improved tight closure algorithm for integer octagonal
+  constraints.
+ Quaderno 467, Dipartimento di Matematica, Università di Parma,
+  Italy, 2007.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. Also
+  published as <tt>arXiv:0705.4618v2 [cs.DS]</tt>, available from
+  <a href="http://arxiv.org/">http://arxiv.org/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ07c]</DT>
+<DD>
+\anchor BHZ07c
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Widening operators for powerset domains.
+ <em>Software Tools for Technology Transfer</em>, 9(3/4):413-414, 2007.
+ Erratum to \ref BHZ06b "[BHZ06b]" containing all the figures properly
+  printed.
+
+</DD>
+
+
+<DT>[BHZ08a]</DT>
+<DD>
+\anchor BHZ08a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ An improved tight closure algorithm for integer octagonal
+  constraints.
+ In F. Logozzo, D. Peled, and L. Zuck, editors, <em>Verification,
+  Model Checking and Abstract Interpretation: Proceedings of the 9th
+  International Conference (VMCAI 2008)</em>, volume 4905 of <em>Lecture Notes in
+  Computer Science</em>, pages 8-21, San Francisco, USA, 2008. Springer-Verlag,
+  Berlin.
+
+
+</DD>
+
+
+<DT>[BHZ08b]</DT>
+<DD>
+\anchor BHZ08b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ The Parma Polyhedra Library: Toward a complete set of numerical
+  abstractions for the analysis and verification of hardware and software
+  systems.
+ <em>Science of Computer Programming</em>, 72(1-2):3-21, 2008.
+
+
+</DD>
+
+
+<DT>[BHZ09a]</DT>
+<DD>
+\anchor BHZ09a
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Applications of polyhedral computations to the analysis and
+  verification of hardware and software systems.
+ <em>Theoretical Computer Science</em>, 410(46):4672-4691, 2009.
+
+
+</DD>
+
+
+<DT>[BHZ09b]</DT>
+<DD>
+\anchor BHZ09b
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Exact join detection for convex polyhedra and other numerical
+  abstractions.
+ Quaderno 492, Dipartimento di Matematica, Università di Parma,
+  Italy, 2009.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>. A corrected
+  and improved version (corrected an error in the statement of condition (3) of
+  Theorem 3.6, typos corrected in statement and proof of Theorem 6.8) has been
+  published in \ref BHZ09c "[BHZ09c]".
+
+
+</DD>
+
+
+<DT>[BHZ09c]</DT>
+<DD>
+\anchor BHZ09c
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Exact join detection for convex polyhedra and other numerical
+  abstractions.
+ Report <tt>arXiv:cs.CG/0904.1783</tt>, 2009.
+ Available at <a href="http://arxiv.org/">http://arxiv.org/</a> and
+  <a href="http://bugseng.com/products/ppl/">http://bugseng.com/products/ppl/</a>.
+
+
+</DD>
+
+
+<DT>[BHZ09d]</DT>
+<DD>
+\anchor BHZ09d
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Weakly-relational shapes for numeric abstractions: Improved
+  algorithms and proofs of correctness.
+ <em>Formal Methods in System Design</em>, 35(3):279-323, 2009.
+
+
+</DD>
+
+
+<DT>[BHZ10]</DT>
+<DD>
+\anchor BHZ10
+R. Bagnara, P. M. Hill, and E. Zaffanella.
+ Exact join detection for convex polyhedra and other numerical
+  abstractions.
+ <em>Computational Geometry: Theory and Applications</em>,
+  43(5):453-473, 2010.
+
+
+</DD>
+
+
+<DT>[BJT99]</DT>
+<DD>
+\anchor BJT99
+F. Besson, T. P. Jensen, and J.-P. Talpin.
+ Polyhedral analysis for synchronous languages.
+ In A. Cortesi and G. Filé, editors, <em>Static Analysis:
+  Proceedings of the 6th International Symposium</em>, volume 1694 of <em>Lecture
+  Notes in Computer Science</em>, pages 51-68, Venice, Italy, 1999.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[BK89]</DT>
+<DD>
+\anchor BK89
+V. Balasundaram and K. Kennedy.
+ A technique for summarizing data access and its use in parallelism
+  enhancing transformations.
+ In B. Knobe, editor, <em>Proceedings of the ACM SIGPLAN'89
+  Conference on Programming Language Design and Implementation (PLDI)</em>, volume
+  24(7) of <em>ACM SIGPLAN Notices</em>, pages 41-53, Portland, Oregon, USA,
+  1989. ACM Press.
+
+</DD>
+
+
+<DT>[BMPZ10]</DT>
+<DD>
+\anchor BMPZ10
+R. Bagnara, F. Mesnard, A. Pescetti, and E. Zaffanella.
+ The automatic synthesis of linear ranking functions: The complete
+  unabridged version.
+ Quaderno 498, Dipartimento di Matematica, Università di Parma,
+  Italy, 2010.
+ Superseded by \ref BMPZ12a "[BMPZ12a]".
+
+</DD>
+
+
+<DT>[BMPZ12a]</DT>
+<DD>
+\anchor BMPZ12a
+R. Bagnara, F. Mesnard, A. Pescetti, and E. Zaffanella.
+ The automatic synthesis of linear ranking functions: The complete
+  unabridged version.
+ Report <tt>arXiv:cs.PL/1004.0944v2</tt>, 2012.
+ Available at <a href="http://arxiv.org/">http://arxiv.org/</a> and
+  <a href="http://bugseng.com/products/ppl/">http://bugseng.com/products/ppl/</a>. Improved version of
+  \ref BMPZ10 "[BMPZ10]".
+
+</DD>
+
+
+<DT>[BMPZ12b]</DT>
+<DD>
+\anchor BMPZ12b
+R. Bagnara, F. Mesnard, A. Pescetti, and E. Zaffanella.
+ A new look at the automatic synthesis of linear ranking functions.
+ <em>Information and Computation</em>, 215:47-67, 2012.
+
+</DD>
+
+
+<DT>[BRZH02a]</DT>
+<DD>
+\anchor BRZH02a
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+ Possibly not closed convex polyhedra and the Parma Polyhedra
+  Library.
+ In M. V. Hermenegildo and G. Puebla, editors, <em>Static Analysis:
+  Proceedings of the 9th International Symposium</em>, volume 2477 of <em>Lecture
+  Notes in Computer Science</em>, pages 213-229, Madrid, Spain, 2002.
+  Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[BRZH02b]</DT>
+<DD>
+\anchor BRZH02b
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+ Possibly not closed convex polyhedra and the Parma Polyhedra
+  Library.
+ Quaderno 286, Dipartimento di Matematica, Università di Parma,
+  Italy, 2002.
+ See also \ref BRZH02c "[BRZH02c]". Available at
+  <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>.
+
+</DD>
+
+
+<DT>[BRZH02c]</DT>
+<DD>
+\anchor BRZH02c
+R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill.
+ Errata for technical report “Quaderno 286”.
+ Available at <a href="http://www.cs.unipr.it/Publications/">http://www.cs.unipr.it/Publications/</a>,
+  2002.
+ See \ref BRZH02b "[BRZH02b]".
+
+</DD>
+
+
+<DT>[CC76]</DT>
+<DD>
+\anchor CC76
+P. Cousot and R. Cousot.
+ Static determination of dynamic properties of programs.
+ In B. Robinet, editor, <em>Proceedings of the Second International
+  Symposium on Programming</em>, pages 106-130, Paris, France, 1976. Dunod, Paris,
+  France.
+
+
+</DD>
+
+
+<DT>[CC79]</DT>
+<DD>
+\anchor CC79
+P. Cousot and R. Cousot.
+ Systematic design of program analysis frameworks.
+ In <em>Proceedings of the Sixth Annual ACM Symposium on Principles
+  of Programming Languages</em>, pages 269-282, San Antonio, TX, USA, 1979. ACM
+  Press.
+
+
+</DD>
+
+
+<DT>[CC92]</DT>
+<DD>
+\anchor CC92
+P. Cousot and R. Cousot.
+ Comparing the Galois connection and widening/narrowing approaches
+  to abstract interpretation.
+ In M. Bruynooghe and M. Wirsing, editors, <em>Proceedings of the 4th
+  International Symposium on Programming Language Implementation and Logic
+  Programming</em>, volume 631 of <em>Lecture Notes in Computer Science</em>, pages
+  269-295, Leuven, Belgium, 1992. Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[CH78]</DT>
+<DD>
+\anchor CH78
+P. Cousot and N. Halbwachs.
+ Automatic discovery of linear restraints among variables of a
+  program.
+ In <em>Conference Record of the Fifth Annual ACM Symposium on
+  Principles of Programming Languages</em>, pages 84-96, Tucson, Arizona, 1978.
+  ACM Press.
+
+
+</DD>
+
+
+<DT>[Che64]</DT>
+<DD>
+\anchor Che64
+N. V. Chernikova.
+ Algorithm for finding a general formula for the non-negative
+  solutions of system of linear equations.
+ <em>U.S.S.R. Computational Mathematics and Mathematical Physics</em>,
+  4(4):151-158, 1964.
+
+</DD>
+
+
+<DT>[Che65]</DT>
+<DD>
+\anchor Che65
+N. V. Chernikova.
+ Algorithm for finding a general formula for the non-negative
+  solutions of system of linear inequalities.
+ <em>U.S.S.R. Computational Mathematics and Mathematical Physics</em>,
+  5(2):228-233, 1965.
+
+</DD>
+
+
+<DT>[Che68]</DT>
+<DD>
+\anchor Che68
+N. V. Chernikova.
+ Algorithm for discovering the set of all solutions of a linear
+  programming problem.
+ <em>U.S.S.R. Computational Mathematics and Mathematical Physics</em>,
+  8(6):282-293, 1968.
+
+</DD>
+
+
+<DT>[Dan63]</DT>
+<DD>
+\anchor Dan63
+G. B. Dantzig.
+ <em>Linear Programming and Extensions</em>.
+ Princeton University Press, Princeton, NJ, 1963.
+
+</DD>
+
+
+<DT>[FCB07]</DT>
+<DD>
+\anchor FCB07
+P. Feautrier, J.-F. Collard, and C. Bastoul.
+ <em>PIP/PipLib: A Solver for Parametric Integer Programming
+  Problems</em>, 5.0 edition, July 2007.
+ Distributed with PIP/PipLib 1.4.0.
+
+</DD>
+
+
+<DT>[Fea88]</DT>
+<DD>
+\anchor Fea88
+P. Feautrier.
+ Parametric integer programming.
+ <em>RAIRO Recherche Opérationnelle</em>, 22(3):243-268, 1988.
+
+</DD>
+
+
+<DT>[FP96]</DT>
+<DD>
+\anchor FP96
+K. Fukuda and A. Prodon.
+ Double description method revisited.
+ In M. Deza, R. Euler, and Y. Manoussakis, editors, <em>Combinatorics
+  and Computer Science, 8th Franco-Japanese and 4th Franco-Chinese Conference,
+  Brest, France, July 3-5, 1995, Selected Papers</em>, volume 1120 of <em>Lecture
+  Notes in Computer Science</em>, pages 91-111. Springer-Verlag, Berlin, 1996.
+
+
+</DD>
+
+
+<DT>[Fuk98]</DT>
+<DD>
+\anchor Fuk98
+K. Fukuda.
+ Polyhedral computation FAQ.
+ Swiss Federal Institute of Technology, Lausanne and Zurich,
+  Switzerland, available at
+  <a href="http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html">http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html</a>, 1998.
+
+</DD>
+
+
+<DT>[GDD<sup>+</sup>04]</DT>
+<DD>
+\anchor GDDetal04
+D. Gopan, F. DiMaio, N. Dor, T. W. Reps, and M. Sagiv.
+ Numeric domains with summarized dimensions.
+ In K. Jensen and A. Podelski, editors, <em>Tools and Algorithms for
+  the Construction and Analysis of Systems, 10th International Conference,
+  TACAS 2004</em>, volume 2988 of <em>Lecture Notes in Computer Science</em>, pages
+  512-529, Barcelona, Spain, 2004. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[GJ00]</DT>
+<DD>
+\anchor GJ00
+E. Gawrilow and M. Joswig.
+ <tt>polymake</tt>: A framework for analyzing convex polytopes.
+ In G. Kalai and G. M. Ziegler, editors, <em>Polytopes -
+  Combinatorics and Computation</em>, pages 43-74. Birkhäuser, 2000.
+
+</DD>
+
+
+<DT>[GJ01]</DT>
+<DD>
+\anchor GJ01
+E. Gawrilow and M. Joswig.
+ <tt>polymake</tt>: An approach to modular software design in
+  computational geometry.
+ In <em>Proceedings of the 17th Annual Symposium on Computational
+  Geometry</em>, pages 222-231, Medford, MA, USA, 2001. ACM.
+
+</DD>
+
+
+<DT>[GR77]</DT>
+<DD>
+\anchor GR77
+D. Goldfarb and J. K. Reid.
+ A practical steepest-edge simplex algorithm.
+ <em>Mathematical Proramming</em>, 12(1):361-371, 1977.
+
+</DD>
+
+
+<DT>[Gra91]</DT>
+<DD>
+\anchor Gra91
+P. Granger.
+ Static analysis of linear congruence equalities among variables of a
+  program.
+ In S. Abramsky and T. S. E. Maibaum, editors, <em>TAPSOFT'91:
+  Proceedings of the International Joint Conference on Theory and Practice of
+  Software Development, Volume 1: Colloquium on Trees in Algebra and
+  Programming (CAAP'91)</em>, volume 493 of <em>Lecture Notes in Computer
+  Science</em>, pages 169-192, Brighton, UK, 1991. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Gra97]</DT>
+<DD>
+\anchor Gra97
+P. Granger.
+ Static analyses of congruence properties on rational numbers
+  (extended abstract).
+ In P. Van Hentenryck, editor, <em>Static Analysis: Proceedings of
+  the 4th International Symposium</em>, volume 1302 of <em>Lecture Notes in
+  Computer Science</em>, pages 278-292, Paris, France, 1997. Springer-Verlag,
+  Berlin.
+
+</DD>
+
+
+<DT>[Hal79]</DT>
+<DD>
+\anchor Hal79
+N. Halbwachs.
+ <em>Détermination Automatique de Relations Linéaires
+  Vérifiées par les Variables d'un Programme</em>.
+ Thèse de 3ème cycle d'informatique,
+  Université scientifique et médicale de Grenoble, Grenoble, France, March
+  1979.
+
+</DD>
+
+
+<DT>[Hal93]</DT>
+<DD>
+\anchor Hal93
+N. Halbwachs.
+ Delay analysis in synchronous programs.
+ In C. Courcoubetis, editor, <em>Computer Aided Verification:
+  Proceedings of the 5th International Conference (CAV'93)</em>, volume 697 of <em>
+  Lecture Notes in Computer Science</em>, pages 333-346, Elounda, Greece, 1993.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[HH95]</DT>
+<DD>
+\anchor HH95
+T. A. Henzinger and P.-H. Ho.
+ A note on abstract interpretation strategies for hybrid automata.
+ In P. J. Antsaklis, W. Kohn, A. Nerode, and S. Sastry, editors, <em>
+  Hybrid Systems II</em>, volume 999 of <em>Lecture Notes in Computer Science</em>,
+  pages 252-264. Springer-Verlag, Berlin, 1995.
+
+
+</DD>
+
+
+<DT>[HHL90]</DT>
+<DD>
+\anchor HHL90
+L. Huelsbergen, D. Hahn, and J. Larus.
+ Exact dependence analysis using data access descriptors.
+ Technical Report 945, Department of Computer Science, University of
+  Wisconsin, Madison, 1990.
+
+</DD>
+
+
+<DT>[HKP95]</DT>
+<DD>
+\anchor HKP95
+N. Halbwachs, A. Kerbrat, and Y.-E. Proy.
+ <em>POLyhedra INtegrated Environment</em>.
+ Verimag, France, version 1.0 of POLINE edition, September 1995.
+ Documentation taken from source code.
+
+</DD>
+
+
+<DT>[HLW94]</DT>
+<DD>
+\anchor HLW94
+V. Van Dongen H. Le Verge and D. K. Wilde.
+ Loop nest synthesis using the polyhedral library.
+ <em>Publication interne</em> 830, IRISA, Campus de Beaulieu, Rennes,
+  France, 1994.
+
+</DD>
+
+
+<DT>[HMT71]</DT>
+<DD>
+\anchor HMT71
+L. Henkin, J. D. Monk, and A. Tarski.
+ <em>Cylindric Algebras: Part I</em>.
+ North-Holland, Amsterdam, 1971.
+
+</DD>
+
+
+<DT>[HPR94]</DT>
+<DD>
+\anchor HPR94
+N. Halbwachs, Y.-E. Proy, and P. Raymond.
+ Verification of linear hybrid systems by means of convex
+  approximations.
+ In B. Le Charlier, editor, <em>Static Analysis: Proceedings of the
+  1st International Symposium</em>, volume 864 of <em>Lecture Notes in Computer
+  Science</em>, pages 223-237, Namur, Belgium, 1994. Springer-Verlag, Berlin.
+
+
+</DD>
+
+
+<DT>[HPR97]</DT>
+<DD>
+\anchor HPR97
+N. Halbwachs, Y.-E. Proy, and P. Roumanoff.
+ Verification of real-time systems using linear relation analysis.
+ <em>Formal Methods in System Design</em>, 11(2):157-185, 1997.
+
+</DD>
+
+
+<DT>[HPWT01]</DT>
+<DD>
+\anchor HPWT01
+T. A. Henzinger, J. Preussig, and H. Wong-Toi.
+ Some lessons from the hytech experience.
+ In <em>Proceedings of the 40th Annual Conference on Decision and
+  Control</em>, pages 2887-2892. IEEE Computer Society Press, 2001.
+
+
+</DD>
+
+
+<DT>[Jea02]</DT>
+<DD>
+\anchor Jea02
+B. Jeannet.
+ <em>Convex Polyhedra Library</em>, release 1.1.3c edition, March 2002.
+ Documentation of the “New Polka” library.
+
+</DD>
+
+
+<DT>[JMSY94]</DT>
+<DD>
+\anchor JMSY94
+J. Jaffar, M. J. Maher, P. J. Stuckey, and R. H. C. Yap.
+ Beyond finite domains.
+ In A. Borning, editor, <em>Principles and Practice of Constraint
+  Programming: Proceedings of the Second International Workshop</em>, volume 874 of
+  <em>Lecture Notes in Computer Science</em>, pages 86-94, Rosario, Orcas Island,
+  Washington, USA, 1994. Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[KBB<sup>+</sup>06]</DT>
+<DD>
+\anchor KBBetal06
+L. Khachiyan, E. Boros, K. Borys, K. Elbassioni, and V. Gurvich.
+ Generating all vertices of a polyhedron is hard.
+ <em>Discrete and Computational Geometry</em>, 2006.
+ Invited contribution.
+
+</DD>
+
+
+<DT>[Kuh56]</DT>
+<DD>
+\anchor Kuh56
+H. W. Kuhn.
+ Solvability and consistency for linear equations and inequalities.
+ <em>American Mathematical Monthly</em>, 63:217-232, 1956.
+
+</DD>
+
+
+<DT>[Le 92]</DT>
+<DD>
+\anchor Le 92
+H. Le Verge.
+ A note on Chernikova's algorithm.
+ <em>Publication interne</em> 635, IRISA, Campus de Beaulieu, Rennes,
+  France, 1992.
+
+
+</DD>
+
+
+<DT>[Loe99]</DT>
+<DD>
+\anchor Loe99
+V. Loechner.
+ <i>PolyLib</i>: A library for manipulating parameterized polyhedra.
+ Available at <a href="http://icps.u-strasbg.fr/~loechner/polylib/">http://icps.u-strasbg.fr/~loechner/polylib/</a>, March
+  1999.
+ Declares itself to be a continuation of \ref Wil93 "[Wil93]".
+
+</DD>
+
+
+<DT>[LW97]</DT>
+<DD>
+\anchor LW97
+V. Loechner and D. K. Wilde.
+ Parameterized polyhedra and their vertices.
+ <em>International Journal of Parallel Programming</em>, 25(6):525-549,
+  1997.
+
+</DD>
+
+
+<DT>[Mas92]</DT>
+<DD>
+\anchor Mas92
+F. Masdupuy.
+ Array operations abstraction using semantic analysis of trapezoid
+  congruences.
+ In <em>Proceedings of the 6th ACM International Conference on
+  Supercomputing</em>, pages 226-235, Washington, DC, USA, 1992. ACM Press.
+
+</DD>
+
+
+<DT>[Mas93]</DT>
+<DD>
+\anchor Mas93
+F. Masdupuy.
+ <em>Array Indices Relational Semantic Analysis Using Rational Cosets
+  and Trapezoids</em>.
+ Thèse d'informatique, École Polytechnique, Palaiseau, France,
+  December 1993.
+
+</DD>
+
+
+<DT>[Min01a]</DT>
+<DD>
+\anchor Min01a
+A. Miné.
+ A new numerical abstract domain based on difference-bound matrices.
+ In O. Danvy and A. Filinski, editors, <em>Proceedings of the 2nd
+  Symposium on Programs as Data Objects (PADO 2001)</em>, volume 2053 of <em>
+  Lecture Notes in Computer Science</em>, pages 155-172, Aarhus, Denmark, 2001.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Min01b]</DT>
+<DD>
+\anchor Min01b
+A. Miné.
+ The octagon abstract domain.
+ In <em>Proceedings of the Eighth Working Conference on Reverse
+  Engineering (WCRE'01)</em>, pages 310-319, Stuttgart, Germany, 2001. IEEE
+  Computer Society Press.
+
+</DD>
+
+
+<DT>[Min02]</DT>
+<DD>
+\anchor Min02
+A. Miné.
+ A few graph-based relational numerical abstract domains.
+ In M. V. Hermenegildo and G. Puebla, editors, <em>Static Analysis:
+  Proceedings of the 9th International Symposium</em>, volume 2477 of <em>Lecture
+  Notes in Computer Science</em>, pages 117-132, Madrid, Spain, 2002.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Min04]</DT>
+<DD>
+\anchor Min04
+A. Miné.
+ Relational abstract domains for the detection of floating-point
+  run-time errors.
+ In D. Schmidt, editor, <em>Programming Languages and Systems:
+  Proceedings of the 13th European Symposium on Programming</em>, volume 2986 of
+  <em>Lecture Notes in Computer Science</em>, pages 3-17, Barcelona, Spain, 2004.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Min05]</DT>
+<DD>
+\anchor Min05
+A. Miné.
+ <em>Weakly Relational Numerical Abstract Domains</em>.
+ PhD thesis, École Polytechnique, Paris, France, March 2005.
+
+</DD>
+
+
+<DT>[MRTT53]</DT>
+<DD>
+\anchor MRTT53
+T. S. Motzkin, H. Raiffa, G. L. Thompson, and R. M. Thrall.
+ The double description method.
+ In H. W. Kuhn and A. W. Tucker, editors, <em>Contributions to the
+  Theory of Games - Volume II</em>, number 28 in Annals of Mathematics Studies,
+  pages 51-73. Princeton University Press, Princeton, New Jersey, 1953.
+
+</DD>
+
+
+<DT>[NF01]</DT>
+<DD>
+\anchor NF01
+T. Nakanishi and A. Fukuda.
+ Modulo interval arithmetic and its application to program analysis.
+ <em>Transactions of Information Processing Society of Japan</em>,
+  42(4):829-837, 2001.
+
+</DD>
+
+
+<DT>[NJPF99]</DT>
+<DD>
+\anchor NJPF99
+T. Nakanishi, K. Joe, C. D. Polychronopoulos, and A. Fukuda.
+ The modulo interval: A simple and practical representation for
+  program analysis.
+ In <em>Proceedings of the 1999 International Conference on Parallel
+  Architectures and Compilation Techniques</em>, pages 91-96, Newport Beach,
+  California, USA, 1999. IEEE Computer Society.
+
+</DD>
+
+
+<DT>[NO77]</DT>
+<DD>
+\anchor NO77
+G. Nelson and D. C. Oppen.
+ Fast decision algorithms based on Union and Find.
+ In <em>Proceedings of the 18th Annual Symposium on Foundations of
+  Computer Science (FOCS'77)</em>, pages 114-119, Providence, RI, USA, 1977. IEEE
+  Computer Society Press.
+ The journal version of this paper is \ref NO80 "[NO80]".
+
+</DD>
+
+
+<DT>[NO80]</DT>
+<DD>
+\anchor NO80
+G. Nelson and D. C. Oppen.
+ Fast decision procedures based on congruence closure.
+ <em>Journal of the ACM</em>, 27(2):356-364, 1980.
+ An earlier version of this paper is \ref NO77 "[NO77]".
+
+</DD>
+
+
+<DT>[NR00]</DT>
+<DD>
+\anchor NR00
+S. P. K. Nookala and T. Risset.
+ A library for Z-polyhedral operations.
+ <em>Publication interne</em> 1330, IRISA, Campus de Beaulieu, Rennes,
+  France, 2000.
+
+</DD>
+
+
+<DT>[NW88]</DT>
+<DD>
+\anchor NW88
+G. L. Nemhauser and L. A. Wolsey.
+ <em>Integer and Combinatorial Optimization</em>.
+ Wiley Interscience Series in Discrete Mathematics and Optimization.
+  John Wiley & Sons, 1988.
+
+</DD>
+
+
+<DT>[Pra77]</DT>
+<DD>
+\anchor Pra77
+V. R. Pratt.
+ Two easy theories whose combination is hard.
+ Memo sent to Nelson and Oppen concerning a preprint of their paper
+  \ref NO77 "[NO77]", September 1977.
+
+</DD>
+
+
+<DT>[PS98]</DT>
+<DD>
+\anchor PS98
+C. H. Papadimitriou and K. Steiglitz.
+ <em>Combinatorial Optimization: Algorithms and Complexity</em>.
+ Dover Publications, second edition, 1998.
+
+</DD>
+
+
+<DT>[QRR96]</DT>
+<DD>
+\anchor QRR96
+P. Quinton, S. Rajopadhye, and T. Risset.
+ On manipulating Z-polyhedra.
+ Technical Report 1016, IRISA, Campus Universitaire de Bealieu,
+  Rennes, France, July 1996.
+
+</DD>
+
+
+<DT>[QRR97]</DT>
+<DD>
+\anchor QRR97
+P. Quinton, S. Rajopadhye, and T. Risset.
+ On manipulating Z-polyhedra using a canonic representation.
+ <em>Parallel Processing Letters</em>, 7(2):181-194, 1997.
+
+</DD>
+
+
+<DT>[QRW00]</DT>
+<DD>
+\anchor QRW00
+F. Quilleré, S. V. Rajopadhye, and D. Wilde.
+ Generation of efficient nested loops from polyhedra.
+ <em>International Journal of Parallel Programming</em>, 28(5):469-498,
+  2000.
+
+</DD>
+
+
+<DT>[RBL06]</DT>
+<DD>
+\anchor RBL06
+T. W. Reps, G. Balakrishnan, and J. Lim.
+ Intermediate-representation recovery from low-level code.
+ In J. Hatcliff and F. Tip, editors, <em>Proceedings of the 2006 ACM
+  SIGPLAN Workshop on Partial Evaluation and Semantics-based Program
+  Manipulation</em>, pages 100-111, Charleston, South Carolina, USA, 2006. ACM
+  Press.
+
+</DD>
+
+
+<DT>[Ric02]</DT>
+<DD>
+\anchor Ric02
+E. Ricci.
+ Rappresentazione e manipolazione di poliedri convessi per l'analisi e
+  la verifica di programmi.
+ Laurea dissertation, University of Parma, Parma, Italy, July 2002.
+ In Italian.
+
+
+</DD>
+
+
+<DT>[Sch99]</DT>
+<DD>
+\anchor Sch99
+A. Schrijver.
+ <em>Theory of Linear and Integer Programming</em>.
+ Wiley Interscience Series in Discrete Mathematics and Optimization.
+  John Wiley & Sons, 1999.
+
+</DD>
+
+
+<DT>[Sho81]</DT>
+<DD>
+\anchor Sho81
+R. E. Shostak.
+ Deciding linear inequalities by computing loop residues.
+ <em>Journal of the ACM</em>, 28(4):769-779, 1981.
+
+</DD>
+
+
+<DT>[SK07]</DT>
+<DD>
+\anchor SK07
+A. Simon and A. King.
+ Taming the wrapping of integer arithmetic.
+ In H. Riis Nielson and G. Filé, editors, <em>Static Analysis:
+  Proceedings of the 14th International Symposium</em>, volume 4634 of <em>Lecture
+  Notes in Computer Science</em>, pages 121-136, Kongens Lyngby, Denmark, 2007.
+  Springer-Verlag, Berlin.
+
+</DD>
+
+
+<DT>[Sri93]</DT>
+<DD>
+\anchor Sri93
+D. Srivastava.
+ Subsumption and indexing in constraint query languages with linear
+  arithmetic constraints.
+ <em>Annals of Mathematics and Artificial Intelligence</em>,
+  8(3-4):315-343, 1993.
+
+
+</DD>
+
+
+<DT>[SS07a]</DT>
+<DD>
+\anchor SS07a
+R. Sen and Y. N. Srikant.
+ Executable analysis using abstract interpretation with circular
+  linear progressions.
+ In <em>Proceedings of the 5th IEEE/ACM International Conference on
+  Formal Methods and Models for Co-Design (MEMOCODE 2007)</em>, pages 39-48, Nice,
+  France, 2007. IEEE Computer Society Press.
+
+</DD>
+
+
+<DT>[SS07b]</DT>
+<DD>
+\anchor SS07b
+R. Sen and Y. N. Srikant.
+ Executable analysis with circular linear progressions.
+ Technical Report IISc-CSA-TR-2007-3, Department of Computer Science
+  and Automation, Indian Institute of Science, Bangalore, India, 2007.
+
+</DD>
+
+
+<DT>[SW70]</DT>
+<DD>
+\anchor SW70
+J. Stoer and C. Witzgall.
+ <em>Convexity and Optimization in Finite Dimensions I</em>.
+ Springer-Verlag, Berlin, 1970.
+
+</DD>
+
+
+<DT>[War03]</DT>
+<DD>
+\anchor War03
+H. S. Warren, Jr.
+ <em>Hacker's Delight</em>.
+ Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 2003.
+
+</DD>
+
+
+<DT>[Wey35]</DT>
+<DD>
+\anchor Wey35
+H. Weyl.
+ Elementare theorie der konvexen polyeder.
+ <em>Commentarii Mathematici Helvetici</em>, 7:290-306, 1935.
+ English translation in \ref Wey50 "[Wey50]".
+
+</DD>
+
+
+<DT>[Wey50]</DT>
+<DD>
+\anchor Wey50
+H. Weyl.
+ The elementary theory of convex polyhedra.
+ In H. W. Kuhn, editor, <em>Contributions to the Theory of Games -
+  Volume I</em>, number 24 in Annals of Mathematics Studies, pages 3-18. Princeton
+  University Press, Princeton, New Jersey, 1950.
+ Translated from \ref Wey35 "[Wey35]" by H. W. Kuhn.
+
+</DD>
+
+
+<DT>[Wil93]</DT>
+<DD>
+\anchor Wil93
+D. K. Wilde.
+ A library for doing polyhedral operations.
+ Master's thesis, Oregon State University, Corvallis, Oregon,
+  December 1993.
+ Also published as IRISA <em>Publication interne</em> 785, Rennes,
+  France, 1993.
+
+
+</DD>
+</DL>
+
+
+\if Include_Implementation_Details
+
+\section prelims Further Notation and Terminology
+
+\subsection Linear_Independence Linear Independence
+
+A finite set of points
+\f$\{ \vect{x}_1, \ldots, \vect{x}_k \} \sseq \Rset^n\f$
+is <EM>linearly independent</EM> if,
+for all \f$\lambda_1, \ldots, \lambda_k \in \Rset\f$,
+the set of equations
+\f[
+  \sum_{i = 1}^k \lambda_i \vect{x}_i = \vect{0}
+\f]
+implies that, for each \f$i = 1\f$, \f$\ldots\f$, \f$k\f$,
+\f$\lambda_i = 0\f$.
+
+The maximum number of linearly independent points in \f$\Rset^n\f$ is \f$n\f$.
+Note that linear independence implies affine independence,
+but the converse is not true.
+
+<B><EM>Proposition</EM></B>
+
+If \f$A\f$ is an \f$m \times n\f$ matrix, the maximum number of
+linearly independent rows of \f$A\f$, viewed as vectors of \f$\Rset^n\f$,
+equals the maximum number of linearly independent columns of \f$A\f$,
+viewed as vectors of \f$\Rset^m\f$.
+
+\subsection Rank Rank
+
+The maximum number of linearly independent rows (columns) of a
+matrix \f$A\f$ is the <EM>rank</EM> of \f$A\f$ and is denoted by
+\f$\prank(A)\f$.
+
+<B><EM>Proposition</EM></B>
+
+A polyhedron is a convex set.
+
+\subsection Minkowskis_Theorem Minkowski's Theorem
+
+Let
+\f$\cP = \{\, \vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{b} \,\}\f$
+be a non-empty polyhedron where \f$\prank(A) = n\f$.
+Let \f$V\f$ be the set of vertices and
+\f$R\f$ the set of extreme rays of \f$\cP\f$.
+Let also \f$\mathcal{V}\f$ be the set of convex combinations of \f$V\f$
+and \f$\mathcal{R}\f$ the set of positive combinations of \f$R\f$.
+Then
+\f[
+  \cP = \mathcal{V} + \mathcal{R}.
+\f]
+
+Informally, this theorem states that,
+whenever a polyhedron \f$\cP\f$ has a vertex,
+there exists a decomposition such that
+- \f$V\f$ is the set of all <EM>vertices</EM> of \f$\cP\f$;
+- \f$R\f$ is the set of all <EM>extreme</EM> rays of \f$\cP\f$; and
+- \f$L = \emptyset\f$.
+
+The conditions that \f$\cP\f$ is not empty and \f$\prank(A) = n\f$
+are equivalent to the condition that \f$\cP\f$ has a vertex.
+(See also Nemhauser and Wolsey - Integer and Combinatorial Optimization -
+propositions 4.1 and 4.2 on pages 92 and 93).
+
+<B><EM>Proposition</EM></B>
+
+Under the same hypotheses of Minkowski's theorem,
+if \f$\cP\f$ is a rational polyhedron then
+all the vertices in \f$V\f$ have rational coefficients and
+we can consider a set \f$R\f$ of extreme rays having
+rational coefficients only.
+
+The second theorem, called Weyl's theorem, states that any system of
+generators having rational coefficients defines a rational polyhedron:
+
+\subsection Weyls_Theorem Weyl's Theorem
+
+If \f$A\f$ is a rational \f$m \times n\f$ matrix,
+\f$B\f$ is a rational \f$m' \times n\f$ matrix and
+\f[
+  \cQ = \sset{
+          \vect{x} \in \Rset^n
+        }{
+          \vect{x}^\transpose = \vect{y}^\transpose A
+                                  + \vect{z}^\transpose B, \\
+          \vect{y} = (y_0, \ldots, y_{m-1})^\transpose \in \nonnegRset^{m},
+          \sum_{k=0}^{m-1} y_k = 1, \\
+          \vect{z} \in \nonnegRset^{m'}
+        },
+\f]
+then \f$\cQ\f$ is a rational polyhedron.
+
+In fact, since \f$\cQ\f$ consists of the sum of convex combinations of
+the rows of \f$A\f$ with positive combinations of the rows of \f$B\f$,
+we can think of \f$A\f$ as the matrix of vertices and \f$B\f$ as
+the matrix of rays.
+
+\subsection Cone Cone
+
+A set \f$C \sseq \Rset^n\f$ is a <EM>cone</EM> if
+\f[
+  \vect{x} \in C \Rightarrow \lambda \vect{x} \in C
+  \text{ for all } \lambda \in \nonnegRset.
+\f]
+
+\subsection Polyhedral_Cone Polyhedral Cone
+
+The polyhedron
+\f$\cP = \{\,\vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{0}\,\}\f$
+is a convex cone and is called <EM>polyhedral cone</EM>.
+
+A polyhedral cone is either <EM>pointed</EM>,
+having the origin as its only vertex, or has no vertices at all.
+
+\subsection Lineality_Space Lineality Space
+
+Given a polyhedron
+\f$\cP = \{\,\vect{x} \in \Rset^n \mid A\vect{x} \geq \vect{b}\,\}\f$,
+the <EM>lineality space</EM> of \f$\cP\f$ is the set
+\f[
+  \{\, \vect{x} \in \cP \mid A\vect{x} = \vect{0} \,\}
+\f]
+and it is denoted by \f$\linspace(\cP)\f$.
+
+
+\section homogeneous Homogeneous Systems
+
+To simplify the operations on polyhedra,
+each polyhedron is first transformed to a homogeneous cone
+in which the original polyhedron is embedded.
+
+\subsection Corresponding_Polyhedral_Cone Corresponding Polyhedral Cone
+
+The transformation changes the inhomogeneous system of constraints
+in \f$n\f$ variables, representing a polyhedron \f$\cP \in \Rset^n\f$,
+into a homogeneous system in \f$n + 1\f$ variables, representing a
+polyhedral cone \f$C \in \Rset^{n + 1}\f$,
+so that each point \f$\vect{x} \in \cP\f$
+corresponds to a point
+\f$\vect{x}' = (\xi \vect{x}^\transpose, \xi)^\transpose \in C\f$
+where \f$\xi \geq 0\f$. That is,
+\f[
+  \cP = \{\,\vect{x} \mid A\vect{x} \geq \vect{b}\,\}
+      = \{\,\vect{x} \mid A\vect{x} - \vect{b} \geq \vect{0}\,\}
+\f]
+\f[
+  C = \{\,
+           (\xi \vect{x}^\transpose, \xi)^\transpose
+      \mid
+           \xi A\vect{x} - \xi \vect{b}
+           \geq \vect{0}, \xi \geq 0
+      \,\}
+    = \{\,\vect{x}' \mid A'\vect{x}' \geq \vect{0}\,\}
+\f]
+where:
+\f$\vect{x}' = (\xi \vect{x}^\transpose, \xi)^\transpose \in \Rset^{n + 1}\f$;
+\f$A'\f$ is the \f$(m+1) \times (n+1)\f$ matrix having, for
+its first \f$m\f$ rows, the submatrix
+\f$(A, -\vect{b}) \in \Rset^m \times \Rset^{n + 1}\f$;
+and, for the (\f$m + 1\f$)'st row,
+\f$(\vect{0}^\transpose, 1)\f$ where \f$\vect{0} \in \Rset^n\f$.
+We call  \f$C\f$ the
+<EM>corresponding polyhedral cone for \f$\cP\f$</EM>.
+
+The (\f$m+1\f$)'st row
+\f$(\vect{0}^\transpose, 1)\f$
+represents the <EM>positivity constraint</EM> \f$1 \geq 0\f$.
+
+Note that \f$\cP\f$ is contained in \f$C\f$
+since the intersection of \f$C\f$ with
+the hyperplane defined by the equality \f$\xi = 1\f$ is \f$\cP\f$.
+Therefore, it is always possible to
+transform  a polyhedron \f$\cP\f$ to its corresponding polyhedral cone
+\f$C\f$ and then recover \f$\cP\f$ by means of this intersection.
+
+As  \f$C\f$ always includes the origin and, hence, is non-empty,
+by Minkowski's theorem,
+it can also be represented by a system of generators.
+
+The systems of generators for \f$\cP\f$ and \f$C\f$ are such that:
+- Each vertex \f$\vect{v}\f$ in \f$\cP\f$
+  corresponds to a ray \f$(\vect{v}^\transpose, d)^\transpose\f$
+  with \f$d \neq 0\f$, in \f$C\f$.
+- Each ray \f$\vect{r}\f$ in \f$\cP\f$
+  corresponds to the ray \f$(\vect{r}^\transpose, 0)^\transpose\f$
+  in \f$C\f$.
+- Every ray in \f$C\f$ corresponds to a vertex or ray in \f$\cP\f$.
+- The origin in \f$\Rset^{n+1}\f$ is a point in \f$C\f$.
+
+Thus, in the cone \f$C\f$, a ray derived from a vertex
+in \f$\cP\f$ differs from a ray derived from a ray in \f$\cP\f$
+only in that, for a vertex,
+the (\f$n+1\f$)'st term is different from zero and,
+for a ray, it is zero.
+
+\subsection Devref_Double_Description Double Description
+
+Let \f$\cP \in \Rset^n \f$ be a polyhedron and  \f$C \in \Rset^{n+1} \f$
+the corresponding polyhedral cone.
+Then the dual representations, the systems of constraints
+and generators representing \f$C\f$, form the
+<EM>double description</EM> for \f$\cP\f$.
+
+Note that, in a double description for a non-empty polyhedron,
+the system of constraints subsumes the positivity constraint \f$1 \geq 0\f$
+while the system of generators (which has only rays and lines
+corresponding to the vertices, rays and lines for \f$\cP\f$)
+implicitly assumes the origin in \f$\Rset^{n+1}\f$
+as a point so that the cone \f$C\f$ represented by the generators is non-empty.
+
+\subsection PPL_Polyhedron_Representation PPL Polyhedron Representation
+
+In the PPL,
+a polyhedron is represented by one or both of the representations in
+its double description.
+Thus, in the sequel, by <EM>PPL representation of a polyhedra</EM>,
+we are referring to the corresponding representation of
+its corresponding polyhedral cone.
+
+\subsection Valid_Linear_Inequalities Valid Linear Inequalities
+
+Let \f$\cP\f$ be a convex polyhedron (or polytope) in
+\f$\Rset^n\f$. For a real \f$n\f$-vector \f$\vect{c}\f$ and a real number
+\f$b\f$, a linear inequality \f$\langle \vect{c}, \vect{x} \rangle \geq b\f$
+(briefly denoted by \f$(\vect{c},b)\f$) is called <EM>valid</EM>
+for \f$\cP\f$ if it is satisfied by all points \f$\vect{x} \in \cP\f$.
+
+\subsection Redundancy Redundancy
+
+-# In a system of equalities, if an equality is a linear combination
+   of the others, it is said to be <EM>dependent</EM> upon them;
+   the dependent equality is called <EM>redundant</EM>.
+   A system containing no redundant equality is called <EM>independent</EM>.
+-# In a system of inequalities, an inequality is said to be <EM>redundant</EM>
+   if it can be eliminated from the system obtaining a system
+   equivalent to the previous one, i.e., having the same solutions.
+
+Given a polyhedron \f$\cP\f$ generated by \f$V\f$ vertices,
+\f$R\f$ rays and \f$L\f$ lines, we say that:
+
+-# \f$L\f$ is <EM>irredundant</EM> if
+  \f$L\f$ is a set of linearly independent lines; and
+-# a ray \f$\vect{r}_1\in R\f$ is <EM>redundant</EM>
+  if there exists another ray \f$\vect{r}_2 \in R\f$ and
+  there exists \f$\lambda \in \Rset, \lambda > 0\f$
+  such that \f$\vect{r}_1 = \lambda \vect{r}_2\f$.
+
+Note that, in the PPL representation of a polyhedron \f$\cP\f$,
+vertices are represented as rays so that
+this concept of a redundant ray also applies to the vertices of \f$\cP\f$.
+
+
+\subsection Face Face
+
+If \f$(\vect{c},b)\f$ is a valid inequality for \f$\cP\f$, and
+\f$F = \{\,\vect{x} \in \cP \mid \langle \vect{c}, \vect{x} \rangle = b\,\}\f$,
+\f$F\f$ is called a <EM>face</EM> of \f$\cP\f$ and we say that the inequality
+represents \f$F\f$.
+A face \f$F\f$ is said to be <EM>proper</EM> if \f$F \neq \emptyset\f$ and
+\f$F \neq \cP\f$.
+
+When \f$F\f$ is non-empty, we say that \f$(\vect{c},b)\f$ <EM>supports</EM>
+\f$\cP\f$.
+
+The empty polyhedron and the universe polyhedron both have no proper faces,
+because the only face of an empty polyhedron is itself, while the faces of
+the universe polyhedron are itself and the emptyset.
+
+Let \f$\cP\f$ be a non-empty polyhedron. The set
+\f[
+  F = \{ \vect{p} \} + \linspace(\cP),
+\f]
+where \f$\vect{p}\f$ is a point of \f$\cP\f$ and the symbol
+'\f$+\f$' denotes the Minkowski's sum, is a <EM>minimal proper face</EM> of
+the polyhedron if \f$F\f$ is a proper face of \f$\cP\f$.
+
+\subsection Facet Facet
+
+A proper face \f$F\f$ of \f$\cP\f$ is a <EM>facet</EM> (or <EM>maximal proper
+face</EM>) of \f$\cP\f$ if it is not strictly included into any other proper
+face of \f$\cP\f$.
+The affine dimension of a facet is equal to \f$\pdim(\cP) - 1\f$.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$\cP\f$ a polyhedron in \f$\Rset^n\f$. The set of all faces is a lattice
+under inclusion: the minimal face is the emptyset, while the maximal face
+is the polyhedron.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$\cP \neq \emptyset\f$ be a polyhedron in \f$\Rset^n\f$ and
+\f$C\f$ be the polyhedral cone in \f$\Rset^{n+1}\f$ obtained from \f$\cP\f$
+by homogenization, then:
+-# the only <EM>minimal proper face</EM> of \f$C\f$ is
+   \f$\linspace(C)\f$;
+-# let \f$\vect{y} \in C\f$ be different from \f$\vect{0}\f$ and
+   \f$\cone\{\vect{y}\}\f$ be defined as
+   \f$\{\, \lambda \vect{y} \mid \lambda \geq 0 \,\}\f$. If the set
+   \f$F = \cone\{\vect{y}\} + \linspace(C)\f$ is
+   a proper face of \f$C\f$, then \f$\vect{y}\f$ is an <EM>extremal ray</EM>
+   of \f$C\f$.
+
+\subsection Ray_Space Ray Space
+
+Given the decomposition \f$\mathcal{V} + \mathcal{R} + \mathcal{L}\f$
+of a polyhedron \f$\cP\f$ the set \f$\mathcal{V} + \mathcal{R}\f$
+is called the <EM>ray space</EM> of \f$\cP\f$
+and denoted by \f$\mathop{\mathrm{ray space}}(\cP)\f$.
+
+Thus a polyhedron \f$\cP\f$ can be always decomposed in its
+\f$\linspace\f$ and its \f$\mathop{\mathrm{ray space}}\f$.
+
+Note that, since \f$\linspace(\cP)\f$ and
+\f$\mathop{\mathrm{ray space}}(\cP)\f$ are polyhedra, their
+affine dimensions can be computed using the definition of affine
+dimension given for polyhedra.
+
+The spaces defined are connected by some consistency rules shown below.
+
+\subsection Dimensionality_Rules Dimensionality Rules
+
+In \f$\Rset^n\f$
+
+- The dimension of the \f$\linspace\f$
+  is the rank of any set of lines that span the space.
+- The dimension of the polyhedron is the dimension of the
+  \f$\mathop{\mathrm{ray space}}\f$ plus the dimension of the
+  \f$\linspace\f$.
+- The dimension of the \f$\mathop{\mathrm{ray space}}\f$
+  is \f$n\f$ minus the number of irredundant
+  lines minus the number of irredundant equalities.
+
+The proofs of these properties can be obtained considering the definitions of
+affine dimension and the decomposition of a polyhedron.
+
+\subsection Saturation Saturation
+
+Let us consider a ray \f$\vect{r} \in \Rset^n\f$ and an inequality
+\f$(\vect{a}, 0)\f$ where \f$\vect{a} \in \Rset^n\f$.
+Then we say that:
+- \f$r\f$ <EM>saturates</EM> the inequality
+  if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$;
+- \f$r\f$ <EM>verifies</EM>  the inequality
+  if \f$\langle \vect{a}, \vect{r} \rangle > 0\f$;
+- \f$r\f$ <EM>violates</EM>  the inequality
+  if \f$\langle \vect{a}, \vect{r} \rangle < 0\f$.
+
+Similarly, considering an equality
+\f$\langle \vect{a}, \vect{x} \rangle = 0\f$:
+- \f$\vect{r}\f$ <EM>saturates</EM> the equality
+if \f$\langle \vect{a}, \vect{r} \rangle = 0\f$;
+- \f$\vect{r}\f$ <EM>does not verify</EM> the equality
+if \f$\langle \vect{a}, \vect{r} \rangle \neq 0\f$.
+
+A constraint (i.e., an equality or an inequality) is
+<EM>satisfied</EM> by a ray if the ray saturates or verifies the constraint.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$C \sseq \Rset^n\f$ be a polyhedral cone and
+\f$\vect{y}_1, \vect{y}_2 \in C\f$. If the sets
+\f$F_i = \cone\{\vect{y}_i\} + \linspace(C)\f$ with
+\f$i = 1, 2\f$ are proper faces of \f$C\f$, \f$F_1\f$ is equal to \f$F_2\f$
+if and only if the set of constraints that are saturated by \f$\vect{y}_1\f$
+is equal to the set of constraints that are saturated by \f$\vect{y}_2\f$.
+
+
+\subsection Saturation_Matrix Saturation Matrix
+
+A <EM>saturation matrix</EM> is a bit matrix that represents
+the connection between constraints and generators of a polyhedron.
+There are two kinds of saturation matrices, one having rows indexed
+by constraints and columns indexed by generators (<EM>sat_g</EM>),
+and one (that is the transposed version of the previous one) having
+rows indexed by generators and columns indexed by constraints (<EM>sat_c</EM>).
+
+For instance, in the saturation matrix sat_g, the elements are defined
+as follows:
+\f[
+s_{ij} =
+\begin{cases}
+0, \text{if the constraint indexed by } i \text{ is saturated by
+   the generator indexed by } j;\\
+1, \text{if the constraint indexed by } i \text{ is only
+  verified by the generator indexed by } j.
+\end{cases}
+\f]
+For efficiency reasons, the PPL uses both the sat_g and sat_c matrices.
+
+\subsection Saturation_Rule Saturation Rule
+
+In an \f$n\f$-dimensional \f$\mathop{\mathrm{ray space}}\f$,
+-# Every inequality must be saturated by at least \f$n\f$ vertices/rays.
+-# Every vertex must saturate at least \f$n\f$ inequalities and a ray
+   must saturate at least \f$n - 1\f$ inequalities plus the
+   positivity constraint.
+-# Every equality must be saturated by all lines and vertices/rays.
+-# Every line must saturate all equalities and inequalities.
+
+These rules are a consequence of the saturation concept.
+
+<B><EM>Proposition</EM></B>
+
+Let \f$C = \{\vect{x} \mid A\vect{x} \geq \vect{0}\}\f$ be a polyhedral cone.
+Then the minimal proper face of \f$C\f$ in an \f$n\f$-dimensional space can
+also be represented as
+\f$
+  F = \{\,\vect{x} \mid A\vect{x} = \vect{0}\,\}.
+\f$
+
+To see this, note that the minimal proper face of a polyhedral cone is equal
+to its lineality space. This for definition is composed by all \f$\vect{y}\f$
+of \f$C\f$ that satisfies \f$A \vect{x} = \vect{0}.\f$
+
+\subsection Adjacent_Rays Adjacent Rays
+
+Let \f$A\f$ be representing matrix of constraints of a cone \f$C\f$
+and \f$Q\f$ the set of rays that generate \f$C\f$. Then two rays
+\f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are <EM>adjacent rays</EM> if
+-# there exists at least a row of \f$A\f$ (i.e., a constraint) that
+   is saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+-# and none of the rays of \f$Q\f$, except \f$\vect{r}_1\f$ and
+   \f$\vect{r}_2\f$, saturates all the constraints saturated by both
+   \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+
+\subsection Independence_Rule Independence Rule
+
+-# No inequality is a positive combination of any other two inequalities
+   or equalities.
+-# No ray is a linear combination of any other two rays or lines.
+-# The set of equalities must be linearly independent.
+-# The set of lines must be linearly independent.
+
+To remove redundant constraints/generators we will use the following
+characterization:
+
+\subsection Redundancy_Rules Redundancy Rules
+
+- An inequality is not redundant if it
+  satisfies both point (1) of the saturation rule and point (1)
+  of the independence rule.
+- A vertex/ray is irredundant if it satisfies
+  both point (2) of the saturation rule and point (2) of the independence rule.
+
+It is useful to note that:
+- All rays saturate the positivity constraint and no vertex saturates
+  the positivity constraint; in fact in the homogeneous form
+  the positivity constraint is represented by the vector
+  \f$\vect{a}^\transpose = (0, \ldots, 0, 1)\f$, rays are of the form
+  \f$\vect{r} = (r_0, \ldots, r_{n-1}, 0)^\transpose\f$ and vertices
+  \f$\vect{v} = (v_0, \ldots, v_{n-1}, d)^\transpose\f$ with \f$d \neq 0\f$,
+  thus \f$\langle \vect{a}, \vect{r} \rangle = 0\f$ for each ray
+  \f$\vect{r}\f$ and \f$\langle \vect{a}, \vect{v} \rangle \neq 0\f$
+  for each vertex \f$\vect{v}\f$.
+- The positivity constraint will be irredundant if and only if
+  the size of the set
+  of rays is \f$\geq n\f$, where \f$n\f$ is the dimension of the ray space,
+  and the rank of the ray set is \f$n\f$; in fact a constraint is
+  irredundant if it is saturated by at least \f$n\f$ vertices/rays (see
+  above), but since only rays saturate the positivity constraint, then in
+  a system with \f$n\f$ vertices/rays the positivity constraint
+  is irredundant.
+
+\section integer_floats Integers Represented by Floating Point Numbers
+
+Floating point numbers can be used to represent finite families
+of integer numbers.  In this section we collect some closure properties
+of these families that are exploited in the PPL.
+
+In order not to depend on the particular family of floating point
+numbers considered, we consider an abstraction that is parametric
+in the number \f$b\f$ of bits in the mantissa and gives no limit
+to the magnitude of the exponent \f$e\f$.
+For \f$b \in \Nset \setminus \{ 0 \}\f$ let
+\f[
+\begin{aligned}
+  F_b^+
+    &=
+      \bigl\{\,
+        x \in \Nset
+      \bigm|
+        x = (1 + m / 2^b) \cdot 2^e,
+        e \in \Nset,
+        m \in \Nset \cap [0, 2^b - 1]
+      \,\bigr\}, \\
+  F_b
+    &=
+      F_b^+ \cup \{ 0 \} \cup \{\, -x \mid x \in F_b^+ \,\}.
+\end{aligned}
+\f]
+
+Let \f$\phi \colon \Rset \to \Zset\f$ denote the function defined by
+\f[
+  \phi(t)
+    =
+      \begin{cases}
+        \lfloor t \rfloor, & \text{if $t \ge 0$;} \\
+        \lceil  t \rceil,  & \text{if $t  <  0$.}
+      \end{cases}
+\f]
+Notice that \f$\phi\f$ is an <EM>odd</EM> function, that is, it satisfies
+\f$\phi(-t) = -\phi(t)\f$ for all \f$t \in \Rset\f$.
+For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we also write
+\f[
+\begin{aligned}
+  x \bdiv y &= \phi(x / y), \\
+  x \brem y &= x - (x \bdiv y) y.
+\end{aligned}
+\f]
+These are the integer division and remainder function as defined by
+the C99 standard
+[ISO/IEC 9899:1999(E), Programming Languages - C (ISO and ANSI C99 Standard)].
+
+<B><EM>Proposition A</EM></B>
+If \f$x\f$, \f$y \in F_b\f$ and \f$y \ne 0\f$, then \f$x \brem y \in F_b\f$.
+
+The proof is given in the next three lemmas.
+
+<B><EM>Lemma 1</EM></B>
+Let \f$G_b = \{\, n \in F_b^+ \mid \text{$n$ is odd} \,\}\f$.
+Then \f$G_b = \{ 1, 3, 5, \ldots, 2^{b + 1} - 1 \}\f$.
+Furthermore, if \f$x \in F_b^+\f$ then there exist \f$n \in G_b\f$ and
+\f$f \in \Nset\f$ such that \f$x = n \cdot 2^f\f$.
+
+<B><EM>Proof</EM></B>
+Let \f$n \in \{ 1, 3, 5, \ldots, 2^{b + 1} - 1 \}\f$.
+There is a non negative integer \f$\beta \le b\f$ such that
+\f$2^\beta \le n < 2^{\beta + 1}\f$.
+Then \f$n = (1 + m / 2^b) \cdot 2^e\f$ with
+\f$m = (n - 2^\beta) \cdot 2^{b - \beta}\f$ and \f$e = \beta\f$.
+Here \f$m < (2^{\beta + 1} - 2^\beta) \cdot 2^{b - \beta} = 2^b\f$
+so that \f$n \in G_b\f$.
+The same argument shows that odd integers larger than \f$2^{b+1}\f$ do not
+in fact belong to \f$G_b\f$, since the corresponding value of \f$m\f$ would
+exceed the bound \f$2^b - 1\f$ in the definition.
+
+For the second part, let \f$x = (1 + m / 2^b) \cdot 2^e \in F_b^+\f$.
+Let \f$m = 2^d \cdot m_1\f$ with \f$m_1\f$ odd and \f$d < b\f$.
+Then \f$n = 2^{b - d} + m_1\f$ is an odd integer that belongs to \f$G_b\f$
+since \f$2^{b - d} + m_1 \le 2^{b - d} + (2^b - 1) / 2^d < 2^{b - d + 1}
+\le 2^{b + 1}\f$, using the first part.
+Hence we may take \f$f = e + d - b\f$ which is non negative since
+otherwise \f$m \cdot 2^{e - b} = m_1 \cdot 2^{e + d - b}\f$ would not be
+an integer as assumed.
+
+<B><EM>Lemma 2</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$ and \f$y\f$ does not divide \f$x\f$, then
+\f$x \bmod y \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+By Lemma 1 above we may assume that \f$x = n \cdot 2^e\f$ and
+\f$y = m \cdot 2^f\f$ with \f$n\f$, \f$m \in G_b\f$ odd integers, and \f$e\f$,
+\f$f \in \Nset\f$.
+Let \f$k = \lfloor x / y \rfloor\f$.
+The goal is to prove that \f$x - k y \in F_b^+\f$: we may assume that
+\f$k > 0\f$, that is, that \f$x > y\f$ for otherwise \f$x \bmod y = x\f$
+and there is nothing to prove.
+- If \f$e < f\f$ then \f$x - k y = 2^e (n - k m \cdot 2^{f - e})\f$.
+  The integer \f$n - k m \cdot 2^{f - e}\f$ is positive, odd and smaller
+  than \f$n\f$, and therefore belongs to \f$G_b\f$.
+- If \f$e = f\f$ then \f$x - k y = 2^e (n - k m)\f$.
+  The integer \f$n - k m\f$ is positive and smaller than \f$n\f$, and therefore
+  belongs to \f$F_b^+\f$.
+- If \f$e > f\f$ then \f$x - k y = 2^f (n \cdot 2^{e - f} - k m)\f$.
+  The integer \f$n \cdot 2^{e - f} - k m\f$ is positive and smaller
+  than \f$m\f$, and therefore belongs to \f$F_b^+\f$: in fact
+  \f[
+    n \cdot 2^{e - f} - k m
+    =
+    n \cdot 2^{e - f} - \Bigl\lfloor \frac xy \Bigr\rfloor m
+    =
+    n \cdot 2^{e - f} - \Bigl\lfloor \frac{n \cdot 2^{e - f}}m \Bigr\rfloor m.
+  \f]
+  In other words, this integer is \f$n \cdot 2^{e - f} \bmod m\f$ and
+  therefore it is smaller than \f$m\f$.
+
+In all cases, we wrote \f$x - k y\f$ as the product of a power of 2 and an
+element of \f$F_b^+\f$, and this product is another element of \f$F_b^+\f$.
+
+
+<B><EM>Lemma 3</EM></B>
+For \f$x\f$, \f$y \in \Zset\f$ with \f$y \ne 0\f$, we have
+\f[
+  x \brem y
+  =
+  \begin{cases}
+       x  \brem \abs{y},  & \text{if $x \ge 0$;} \\
+    -(\abs{x} \brem \abs{y}), & \text{if $x  <  0$.}
+  \end{cases}
+\f]
+
+<B><EM>Proof</EM></B>
+Throughout the proof we write \f$x_0 = \abs{x}\f$ and \f$y_0 = \abs{y}\f$.
+First, assume that \f$x \ge 0\f$ and that \f$y < 0\f$.
+Let \f$k = \phi(x / y_0) = - \phi(x / y)\f$, by the property above.
+We have
+\f[
+  x \brem y
+  =
+  x - (x \bdiv y) y
+  =
+  x - (-k) y
+  =
+  x - k (-y)
+  =
+  x - k y_0.
+\f]
+Next, assume that \f$x < 0\f$ and that \f$y < 0\f$.
+Let \f$k = \phi(x_0 / y_0) = \phi(x / y)\f$.
+We have
+\f[
+  x \brem y
+  =
+  x - (x \bdiv y) y
+  =
+  x - k y
+  =
+  -( -x - k (-y))
+  =
+  -(x_0 - k y_0).
+\f]
+Finally, assume that \f$x < 0\f$ and that \f$y > 0\f$.
+Let \f$k = \phi(x_0 / y) = -\phi(x / y)\f$, again by the property above.
+We have
+\f[
+  x \brem y
+  =
+  x - (x \bdiv y) y
+  =
+  x - (-k) y
+  =
+  -( -x - k y)
+  =
+  -(x_0 - k y).
+\f]
+This completes the proof.
+
+<B><EM>Lemma 4</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$ then \f$\gcd(x, y) \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+Let \f$x = n \cdot 2^e\f$ and \f$y = m \cdot 2^f\f$ with \f$n\f$, \f$m \in G_b\f$
+odd integers, and \f$e\f$, \f$f \in \Nset\f$.
+Then \f$\gcd(x, y) = \gcd(n, m) \cdot 2^{\min(e, f)}\f$, and therefore it
+belongs to \f$F_b^+\f$, since \f$\gcd(n, m) \le \min(n, m)\f$ so that it belongs
+to \f$G_b\f$.
+
+<B><EM>Lemma 5</EM></B>
+If \f$x\f$, \f$y \in F_b^+\f$, then \f$x / \gcd(x, y) \in F_b^+\f$.
+
+<B><EM>Proof</EM></B>
+With the same notation as in the previous Lemma, both \f$n\f$ and
+\f$\gcd(n, m) \in G_b\f$: but all positive odd integers up to and
+including \f$n\f$ belong to \f$G_b\f$, so that \f$n / \gcd(n, m)\f$
+does as well.
+By Lemma 1
+\f$x / \gcd(x, y) = n \cdot 2^e / (\gcd(n, m) \cdot 2^{\min(e, f)})
+                = (n / \gcd(n, m)) \cdot 2^{e - \min(e, f)} \in F_b^+\f$.
+
+\endif
+
+*/ /* \mainpage */
diff --git a/doc/devref-language-interface.doxyconf.in b/doc/devref-language-interface.doxyconf.in
new file mode 100644
index 0000000..a2467d9
--- /dev/null
+++ b/doc/devref-language-interface.doxyconf.in
@@ -0,0 +1,308 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL <PPL_SED_LANGUAGE_NAME> Language Interface"
+PROJECT_NUMBER         = @VERSION@
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = <PPL_SED_ALIASES>
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = NO
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = <PPL_SED_INPUT>
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          =
+RECURSIVE              = NO
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = <PPL_SED_GENERATE_HTML>
+HTML_OUTPUT            = ppl-devref-<PPL_SED_INTERFACE_NAME>- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = YES
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = <PPL_SED_GENERATE_LATEX>
+LATEX_OUTPUT           = devref-<PPL_SED_INTERFACE_NAME>.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = devref-<PPL_SED_INTERFACE_NAME>.tex
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = <PPL_SED_CONFIGURED_MANUAL> \
+                         PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = DECLARE_CONVERSIONS \
+                         CATCH_ALL \
+                         PPL_USE_SPARSE_MATRIX
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               = <PPL_SED_TAGFILES>
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/devref-language-interface.tex b/doc/devref-language-interface.tex
new file mode 100644
index 0000000..fb734e6
--- /dev/null
+++ b/doc/devref-language-interface.tex
@@ -0,0 +1,175 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+<PPL_SED_USEPACKAGE_OCAMLDOC>
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\scriptsize The PPL <PPL_SED_LANGUAGE_NAME> Language Interface Developer's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+<PPL_SED_LANGUAGE_NAME> Language Interface \\
+Developer's Manual\thanks{This work is based on previous work also by
+Elisa Ricci, Sara Bonini, Andrea Pescetti, Angela Stazzone, Tatiana Zolo.
+This work has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications'';
+  EPSRC project
+    ``Numerical Domains for Software Analysis'';
+  EPSRC project
+    ``Geometric Abstractions for Scalable Program Analyzers''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+  BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+  BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/doc/devref.doxyconf-html.in b/doc/devref.doxyconf-html.in
new file mode 100644
index 0000000..fd8dc87
--- /dev/null
+++ b/doc/devref.doxyconf-html.in
@@ -0,0 +1,333 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PPL
+PROJECT_NUMBER         = @VERSION@
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                =
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = NO
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/definitions.dox \
+                         ../src/version.hh \
+                         @srcdir@/../src/ \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *_types.hh \
+                         *_defs.hh \
+                         *_inlines.hh \
+                         *_templates.hh \
+                         *.cc \
+                         C_Integer.hh \
+                         Coefficient_traits_template.hh \
+                         Has_Assign_Or_Swap.hh \
+                         Integer_Interval.hh \
+                         Rational_Box.hh \
+                         Rational_Interval.hh \
+                         Slow_Copy.hh \
+                         algorithms.hh \
+                         assert.hh \
+                         assign_or_swap.hh \
+                         checked_numeric_limits.hh \
+                         compiler.hh \
+                         initializer.hh \
+                         linearize.hh \
+                         max_space_dimension.hh \
+                         meta_programming.hh \
+                         namespaces.hh \
+                         wrap_assign.hh \
+                         wrap_string.hh
+RECURSIVE              = YES
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = *.am \
+                         *.in
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-devref- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = YES
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = devref.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref.tex
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS \
+                         PPL_USE_SPARSE_MATRIX
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       = ppl-devref- at VERSION@-html.tag
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/devref.doxyconf-latex.in b/doc/devref.doxyconf-latex.in
new file mode 100644
index 0000000..96bf8d8
--- /dev/null
+++ b/doc/devref.doxyconf-latex.in
@@ -0,0 +1,332 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PPL
+PROJECT_NUMBER         = @VERSION@
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                =
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = NO
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = Include_Implementation_Details
+MAX_INITIALIZER_LINES  = 5
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/definitions.dox \
+                         ../src/version.hh \
+                         @srcdir@/../src/ \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *_types.hh \
+                         *_defs.hh \
+                         *_inlines.hh \
+                         *_templates.hh \
+                         *.cc \
+                         C_Integer.hh \
+                         Coefficient_traits_template.hh \
+                         Has_Assign_Or_Swap.hh \
+                         Integer_Interval.hh \
+                         Rational_Box.hh \
+                         Rational_Interval.hh \
+                         Slow_Copy.hh \
+                         algorithms.hh \
+                         assert.hh \
+                         assign_or_swap.hh \
+                         checked_numeric_limits.hh \
+                         compiler.hh \
+                         initializer.hh \
+                         linearize.hh \
+                         max_space_dimension.hh \
+                         meta_programming.hh \
+                         namespaces.hh \
+                         wrap_assign.hh \
+                         wrap_string.hh
+RECURSIVE              = YES
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-devref- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = YES
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = devref.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/devref.tex
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS \
+                         PPL_USE_SPARSE_MATRIX
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/devref.tex b/doc/devref.tex
new file mode 100644
index 0000000..e0d2e14
--- /dev/null
+++ b/doc/devref.tex
@@ -0,0 +1,173 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\small The PPL Developer's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+Developer's Manual\thanks{This work is based on previous work also by
+Elisa Ricci, Sara Bonini, Andrea Pescetti, Angela Stazzone, Tatiana Zolo.
+This work has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications'';
+  EPSRC project
+    ``Numerical Domains for Software Analysis'';
+  EPSRC project
+    ``Geometric Abstractions for Scalable Program Analyzers''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+  BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+  BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/doc/fdl.dox b/doc/fdl.dox
new file mode 100644
index 0000000..b3bc174
--- /dev/null
+++ b/doc/fdl.dox
@@ -0,0 +1,412 @@
+/*!
+\if PPL_HTML_Tag_Documentation_of_Interfaces
+\page GFDL_different_HTML_tag GNU Free Documentation License
+\else
+\page GFDL GNU Free Documentation License
+\endif
+
+\anchor GFDL
+
+Version 1.2, November 2002
+
+<PRE>
+Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA.
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+<P>
+<STRONG>0. PREAMBLE</STRONG>
+<P>
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+<P>
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+<P>
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+<P>
+
+<STRONG>1. APPLICABILITY AND DEFINITIONS</STRONG>
+<P>
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+<P>
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+<P>
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+<P>
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+<P>
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+<P>
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+<P>
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+<P>
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+<p>
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+<p>
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+<P>
+<STRONG>2. VERBATIM COPYING</STRONG>
+<P>
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+<P>
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+<P>
+
+<STRONG>3. COPYING IN QUANTITY</STRONG>
+<P>
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+<P>
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+<P>
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+<P>
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+<P>
+
+<STRONG>4. MODIFICATIONS</STRONG>
+<P>
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+<P>
+<UL>
+<LI><STRONG>A.</STRONG> Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+<LI><STRONG>B.</STRONG> List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+<LI><STRONG>C.</STRONG> State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+<LI><STRONG>D.</STRONG> Preserve all the copyright notices of the Document.
+<LI><STRONG>E.</STRONG> Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+<LI><STRONG>F.</STRONG> Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+<LI><STRONG>G.</STRONG> Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+<LI><STRONG>H.</STRONG> Include an unaltered copy of this License.
+<LI><STRONG>I.</STRONG> Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+<LI><STRONG>J.</STRONG> Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+<LI><STRONG>K.</STRONG> For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+<LI><STRONG>L.</STRONG> Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+<LI><STRONG>M.</STRONG> Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+<LI><STRONG>N.</STRONG> Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+<LI><STRONG>O.</STRONG> Preserve any Warranty Disclaimers.
+</UL>
+<P>
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+<P>
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+<P>
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+<P>
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+<P>
+
+<STRONG>5. COMBINING DOCUMENTS</STRONG>
+<P>
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+<P>
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+<P>
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements."
+<P>
+
+<STRONG>6. COLLECTIONS OF DOCUMENTS</STRONG>
+<P>
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+<P>
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+<P>
+
+
+<STRONG>7. AGGREGATION WITH INDEPENDENT WORKS</STRONG>
+<P>
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+<P>
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+<P>
+
+<STRONG>8. TRANSLATION</STRONG>
+<P>
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+<p>
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+<P>
+
+<STRONG>9. TERMINATION</STRONG>
+<P>
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+<P>
+
+<STRONG>10. FUTURE REVISIONS OF THIS LICENSE</STRONG>
+<P>
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+<P>
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+<P>
+
+<H2>How to use this License for your documents</H2>
+<P>
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+<P>
+<PRE>
+      Copyright (c)  YEAR  YOUR NAME.
+      Permission is granted to copy, distribute and/or modify this document
+      under the terms of the GNU Free Documentation License, Version 1.2
+      or any later version published by the Free Software Foundation;
+      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+      Texts.  A copy of the license is included in the section entitled
+      "GNU Free Documentation License".
+</PRE>
+<P>
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+<p>
+<pre>
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+</pre>
+<p>
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+<p>
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+*/
diff --git a/doc/fdl.pdf b/doc/fdl.pdf
new file mode 100644
index 0000000..b4757ae
Binary files /dev/null and b/doc/fdl.pdf differ
diff --git a/doc/fdl.ps.gz b/doc/fdl.ps.gz
new file mode 100644
index 0000000..950c040
Binary files /dev/null and b/doc/fdl.ps.gz differ
diff --git a/doc/fdl.tex b/doc/fdl.tex
new file mode 100644
index 0000000..fa38f28
--- /dev/null
+++ b/doc/fdl.tex
@@ -0,0 +1,454 @@
+\documentclass[a4paper,12pt]{article}
+
+\usepackage[english]{babel}
+
+\begin{document}
+
+
+\title{GNU Free Documentation License}
+\date{}
+\author{}
+\maketitle
+
+ \begin{center}
+
+       Version 1.2, November 2002
+
+
+ Copyright \copyright 2000,2001,2002  Free Software Foundation, Inc.
+
+ \bigskip
+
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301,  USA
+
+ \bigskip
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+\end{center}
+
+
+\section*{Preamble}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\section{Applicability and Definitions}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The \textbf{"Document"}, below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as \textbf{"you"}.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A \textbf{"Modified Version"} of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A \textbf{"Secondary Section"} is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The \textbf{"Cover Texts"} are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A \textbf{"Transparent"} copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called \textbf{"Opaque"}.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The \textbf{"Title Page"} means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as \textbf{"Acknowledgements"},
+\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.)
+To \textbf{"Preserve the Title"}
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\section{Verbatim Copying}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\section{Copying in Quantity}
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\section{Modifications}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+\begin{itemize}
+\item[A.]
+   Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+
+\item[B.]
+   List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+
+\item[C.]
+   State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+
+\item[D.]
+   Preserve all the copyright notices of the Document.
+
+\item[E.]
+   Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+
+\item[F.]
+   Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+
+\item[G.]
+   Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+
+\item[H.]
+   Include an unaltered copy of this License.
+
+\item[I.]
+   Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+
+\item[J.]
+   Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+
+\item[K.]
+   For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+
+\item[L.]
+   Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+
+\item[M.]
+   Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+
+\item[N.]
+   Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+
+\item[O.]
+   Preserve any Warranty Disclaimers.
+\end{itemize}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\section{Combining Documents}
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+\section{Collections of Documents}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\section{Aggregation with Independent Works}
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\section{Translation}
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+\section{Termination}
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+\section{Future Revisions of this License}
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\section*{Addendum: How To Use this License for Your Documents}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\begin{quote}
+    Copyright \copyright  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+\end{quote}
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+\begin{quote}
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+\end{quote}
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+\end{document}
diff --git a/doc/fdl.txt b/doc/fdl.txt
new file mode 100644
index 0000000..a988da5
--- /dev/null
+++ b/doc/fdl.txt
@@ -0,0 +1,397 @@
+                GNU Free Documentation License
+                  Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled "History" in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the "History" section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements".  Such a section
+   may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+   or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+    Copyright (c)  YEAR  YOUR NAME.
+    Permission is granted to copy, distribute and/or modify this document
+    under the terms of the GNU Free Documentation License, Version 1.2
+    or any later version published by the Free Software Foundation;
+    with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+    A copy of the license is included in the section entitled "GNU
+    Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+    with the Invariant Sections being LIST THEIR TITLES, with the
+    Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/doc/gpl.dox b/doc/gpl.dox
new file mode 100644
index 0000000..0d155d9
--- /dev/null
+++ b/doc/gpl.dox
@@ -0,0 +1,691 @@
+/*!
+\if PPL_HTML_Tag_Documentation_of_Interfaces
+\page GPL_different_HTML_tag GNU General Public License
+\else
+\page GPL GNU General Public License
+\endif
+
+\anchor GPL
+
+Version 3, 29 June 2007
+
+<p>Copyright (C) 2007 Free Software Foundation, Inc. <a href="http://fsf.org/">http://fsf.org/</a></p><p>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.</p>
+
+<h1>Preamble</h1>
+
+<p>The GNU General Public License is a free, copyleft license for
+software and other kinds of works.</p>
+
+<p>The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.</p>
+
+<p>When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.</p>
+
+<p>To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.</p>
+
+<p>For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.</p>
+
+<p>Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.</p>
+
+<p>For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.</p>
+
+<p>Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.</p>
+
+<p>Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.</p>
+
+<p>The precise terms and conditions for copying, distribution and
+modification follow.</p>
+
+<h1>TERMS AND CONDITIONS</h1>
+
+<h2>0. Definitions.</h2>
+
+<p>“This License” refers to version 3 of the GNU General Public License.</p>
+
+<p>“Copyright” also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.</p>
+
+<p>“The Program” refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as “you”.  “Licensees” and
+“recipients” may be individuals or organizations.</p>
+
+<p>To “modify” a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a “modified version” of the
+earlier work or a work “based on” the earlier work.</p>
+
+<p>A “covered work” means either the unmodified Program or a work based
+on the Program.</p>
+
+<p>To “propagate” a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.</p>
+
+<p>To “convey” a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.</p>
+
+<p>An interactive user interface displays “Appropriate Legal Notices”
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.</p>
+
+<h2>1. Source Code.</h2>
+
+<p>The “source code” for a work means the preferred form of the work
+for making modifications to it.  “Object code” means any non-source
+form of a work.</p>
+
+<p>A “Standard Interface” means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.</p>
+
+<p>The “System Libraries” of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+“Major Component”, in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.</p>
+
+<p>The “Corresponding Source” for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.</p>
+
+<p>The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.</p>
+
+<p>The Corresponding Source for a work in source code form is that
+same work.</p>
+
+<h2>2. Basic Permissions.</h2>
+
+<p>All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.</p>
+
+<p>You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.</p>
+
+<p>Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.</p>
+
+<h2>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h2>
+
+<p>No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.</p>
+
+<p>When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.</p>
+
+<h2>4. Conveying Verbatim Copies.</h2>
+
+<p>You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.</p>
+
+<p>You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.</p>
+
+<h2>5. Conveying Modified Source Versions.</h2>
+
+<p>You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:</p>
+
+<ul>
+<li>a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.</li>
+
+<li>b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    “keep intact all notices”.</li>
+
+<li>c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.</li>
+
+<li>d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.</li>
+</ul>
+
+<p>A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+“aggregate” if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.</p>
+
+<h2>6. Conveying Non-Source Forms.</h2>
+
+<p>You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:</p>
+
+<ul>
+<li>a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.</li>
+
+<li>b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.</li>
+
+<li>c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.</li>
+
+<li>d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.</li>
+
+<li>e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.</li>
+</ul>
+
+<p>A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.</p>
+
+<p>A “User Product” is either (1) a “consumer product”, which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, “normally used” refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.</p>
+
+<p>“Installation Information” for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.</p>
+
+<p>If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).</p>
+
+<p>The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.</p>
+
+<p>Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.</p>
+
+<h2>7. Additional Terms.</h2>
+
+<p>“Additional permissions” are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.</p>
+
+<p>When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.</p>
+
+<p>Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:</p>
+
+<ul>
+<li>a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or</li>
+
+<li>b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or</li>
+
+<li>c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or</li>
+
+<li>d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or</li>
+
+<li>e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or</li>
+
+<li>f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.</li>
+</ul>
+
+<p>All other non-permissive additional terms are considered “further
+restrictions” within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.</p>
+
+<p>If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.</p>
+
+<p>Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.</p>
+
+<h2>8. Termination.</h2>
+
+<p>You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).</p>
+
+<p>However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.</p>
+
+<p>Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.</p>
+
+<p>Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.</p>
+
+<h2>9. Acceptance Not Required for Having Copies.</h2>
+
+<p>You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.</p>
+
+<h2>10. Automatic Licensing of Downstream Recipients.</h2>
+
+<p>Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.</p>
+
+<p>An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.</p>
+
+<p>You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.</p>
+
+<h2>11. Patents.</h2>
+
+<p>A “contributor” is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's “contributor version”.</p>
+
+<p>A contributor's “essential patent claims” are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.</p>
+
+<p>Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.</p>
+
+<p>In the following three paragraphs, a “patent license” is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To “grant” such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.</p>
+
+<p>If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.</p>
+
+<p>If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.</p>
+
+<p>A patent license is “discriminatory” if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.</p>
+
+<p>Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.</p>
+
+<h2>12. No Surrender of Others' Freedom.</h2>
+
+<p>If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.</p>
+
+<h2>13. Use with the GNU Affero General Public License.</h2>
+
+<p>Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.</p>
+
+<h2>14. Revised Versions of this License.</h2>
+
+<p>The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.</p>
+
+<p>Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License “or any later version” applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.</p>
+
+<p>If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.</p>
+
+<p>Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.</p>
+
+<h2>15. Disclaimer of Warranty.</h2>
+
+<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>
+
+<h2>16. Limitation of Liability.</h2>
+
+<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.</p>
+
+<h2>17. Interpretation of Sections 15 and 16.</h2>
+
+<p>If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.</p>
+
+<p>END OF TERMS AND CONDITIONS</p>
+
+<h1>How to Apply These Terms to Your New Programs</h1>
+
+<p>If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.</p>
+
+<p>To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the “copyright” line and a pointer to where the full notice is found.</p>
+
+<pre>    <var>one line to give the program's name and a brief idea of what it does.</var>
+    Copyright (C) <var>year</var>  <var>name of author</var>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.
+</pre>
+
+<p>Also add information on how to contact you by electronic and paper mail.</p>
+
+<p>If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:</p>
+
+<pre>    <var>program</var>  Copyright (C) <var>year</var>  <var>name of author</var>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+</pre>
+
+<p>The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an “about box”.</p>
+
+<p>You should also get your employer (if you work as a programmer) or school,
+if any, to sign a “copyright disclaimer” for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
+
+<p>The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>.</p>
+*/
diff --git a/doc/gpl.pdf b/doc/gpl.pdf
new file mode 100644
index 0000000..b8f0b6a
Binary files /dev/null and b/doc/gpl.pdf differ
diff --git a/doc/gpl.ps.gz b/doc/gpl.ps.gz
new file mode 100644
index 0000000..cee9e53
Binary files /dev/null and b/doc/gpl.ps.gz differ
diff --git a/doc/gpl.tex b/doc/gpl.tex
new file mode 100644
index 0000000..1e867c3
--- /dev/null
+++ b/doc/gpl.tex
@@ -0,0 +1,728 @@
+\documentclass[a4paper,12pt]{article}
+\usepackage{a4wide}
+\usepackage{times}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+
+\title{GNU GENERAL PUBLIC LICENSE}
+\date{Version 3, 29 June 2007}
+
+\begin{document}
+\maketitle
+
+\begin{center}
+{\parindent 0in
+
+Copyright \copyright\  2007 Free Software Foundation, Inc. http://fsf.org/
+
+\bigskip
+Everyone is permitted to copy and distribute verbatim copies of this
+
+license document, but changing it is not allowed.}
+
+\end{center}
+
+\renewcommand{\abstractname}{Preamble}
+\begin{abstract}
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+\end{abstract}
+
+\begin{center}
+{\Large \sc Terms and Conditions}
+\end{center}
+
+
+\begin{enumerate}
+
+\addtocounter{enumi}{-1}
+
+\item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a ``modified version'' of the
+earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices''
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+\item Source Code.
+
+The ``source code'' for a work means the preferred form of the work
+for making modifications to it.  ``Object code'' means any non-source
+form of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+The Corresponding Source for a work in source code form is that
+same work.
+
+\item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+\item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+\item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+\item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+  \begin{enumerate}
+  \item The work must carry prominent notices stating that you modified
+  it, and giving a relevant date.
+
+  \item The work must carry prominent notices stating that it is
+  released under this License and any conditions added under section
+  7.  This requirement modifies the requirement in section 4 to
+  ``keep intact all notices''.
+
+  \item You must license the entire work, as a whole, under this
+  License to anyone who comes into possession of a copy.  This
+  License will therefore apply, along with any applicable section 7
+  additional terms, to the whole of the work, and all its parts,
+  regardless of how they are packaged.  This License gives no
+  permission to license the work in any other way, but it does not
+  invalidate such permission if you have separately received it.
+
+  \item If the work has interactive user interfaces, each must display
+  Appropriate Legal Notices; however, if the Program has interactive
+  interfaces that do not display Appropriate Legal Notices, your
+  work need not make them do so.
+\end{enumerate}
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+\item Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+  \begin{enumerate}
+  \item Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by the
+  Corresponding Source fixed on a durable physical medium
+  customarily used for software interchange.
+
+  \item Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by a
+  written offer, valid for at least three years and valid for as
+  long as you offer spare parts or customer support for that product
+  model, to give anyone who possesses the object code either (1) a
+  copy of the Corresponding Source for all the software in the
+  product that is covered by this License, on a durable physical
+  medium customarily used for software interchange, for a price no
+  more than your reasonable cost of physically performing this
+  conveying of source, or (2) access to copy the
+  Corresponding Source from a network server at no charge.
+
+  \item Convey individual copies of the object code with a copy of the
+  written offer to provide the Corresponding Source.  This
+  alternative is allowed only occasionally and noncommercially, and
+  only if you received the object code with such an offer, in accord
+  with subsection 6b.
+
+  \item Convey the object code by offering access from a designated
+  place (gratis or for a charge), and offer equivalent access to the
+  Corresponding Source in the same way through the same place at no
+  further charge.  You need not require recipients to copy the
+  Corresponding Source along with the object code.  If the place to
+  copy the object code is a network server, the Corresponding Source
+  may be on a different server (operated by you or a third party)
+  that supports equivalent copying facilities, provided you maintain
+  clear directions next to the object code saying where to find the
+  Corresponding Source.  Regardless of what server hosts the
+  Corresponding Source, you remain obligated to ensure that it is
+  available for as long as needed to satisfy these requirements.
+
+  \item Convey the object code using peer-to-peer transmission, provided
+  you inform other peers where the object code and Corresponding
+  Source of the work are being offered to the general public at no
+  charge under subsection 6d.
+  \end{enumerate}
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, ``normally used'' refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+\item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+  \begin{enumerate}
+  \item Disclaiming warranty or limiting liability differently from the
+  terms of sections 15 and 16 of this License; or
+
+  \item Requiring preservation of specified reasonable legal notices or
+  author attributions in that material or in the Appropriate Legal
+  Notices displayed by works containing it; or
+
+  \item Prohibiting misrepresentation of the origin of that material, or
+  requiring that modified versions of such material be marked in
+  reasonable ways as different from the original version; or
+
+  \item Limiting the use for publicity purposes of names of licensors or
+  authors of the material; or
+
+  \item Declining to grant rights under trademark law for use of some
+  trade names, trademarks, or service marks; or
+
+  \item Requiring indemnification of licensors and authors of that
+  material by anyone who conveys the material (or modified versions of
+  it) with contractual assumptions of liability to the recipient, for
+  any liability that these contractual assumptions directly impose on
+  those licensors and authors.
+  \end{enumerate}
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+\item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+\item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+\item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+\item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+\item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+\item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+\item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License ``or any later version'' applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+\item Disclaimer of Warranty.
+
+\begin{sloppypar}
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+ APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+ COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS''
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE
+ RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+ SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+ NECESSARY SERVICING, REPAIR OR CORRECTION.
+\end{sloppypar}
+
+\item Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
+ AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+ DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+ DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
+ (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+ INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
+ OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+ HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES.
+
+\item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+\begin{center}
+{\Large\sc End of Terms and Conditions}
+
+How to Apply These Terms to Your New Programs
+
+\end{center}
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+\begin{quote}
+  <one line to give the program's name and a brief idea of what it does.>
+
+  Copyright (C) <year>  <name of author>
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see
+  http://www.gnu.org/licenses/.
+
+\end{quote}
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+\begin{quote}
+  <program>  Copyright (C) <year>  <name of author>
+
+  This program comes with ABSOLUTELY NO WARRANTY; for details type
+{\tt show w}.
+  This is free software, and you are welcome to redistribute it
+  under certain conditions; type {\tt show c} for details.
+\end{quote}
+
+The hypothetical commands {\tt show w} and {\tt show c} should show
+the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary.  For more information on this, and how to apply and follow
+the GNU GPL, see http://www.gnu.org/licenses/.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.
+
+\end{enumerate}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
+
diff --git a/doc/gpl.txt b/doc/gpl.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/doc/gpl.txt
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/doc/interfaces-html.sed b/doc/interfaces-html.sed
new file mode 100644
index 0000000..57da416
--- /dev/null
+++ b/doc/interfaces-html.sed
@@ -0,0 +1,4 @@
+s/<PPL_SED_ALIASES>/"extref{2}=\\ref \\1 \\"\\2\\""/
+s/<PPL_SED_ENABLED_SECTIONS>/PPL_HTML_Tag_Documentation_of_Interfaces/
+s/<PPL_SED_GENERATE_HTML>/YES/
+s/<PPL_SED_GENERATE_LATEX>/NO/
diff --git a/doc/interfaces-latex.sed b/doc/interfaces-latex.sed
new file mode 100644
index 0000000..bea34f5
--- /dev/null
+++ b/doc/interfaces-latex.sed
@@ -0,0 +1,4 @@
+s/<PPL_SED_ALIASES>/"extref{2}=<EM>\\2<\/EM>"/
+s/<PPL_SED_ENABLED_SECTIONS>//
+s/<PPL_SED_GENERATE_HTML>/NO/
+s/<PPL_SED_GENERATE_LATEX>/YES/
diff --git a/doc/libppl.3 b/doc/libppl.3
new file mode 100644
index 0000000..03c9c55
--- /dev/null
+++ b/doc/libppl.3
@@ -0,0 +1,226 @@
+.TH libppl "3" "June 2012" "PPL 1.0" "libppl overview"
+
+.SH NAME
+libppl \- the C++ interface of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B #include <ppl.hh>
+.sp
+c++ file.cc
+.B -lppl
+
+.SH DESCRIPTION
+This is a short overview on how to use the Parma Polyhedra Library (PPL)
+in your C++ programs on Unix-like operating systems.
+Note that the PPL has interfaces also for C, Java, OCaml and a number
+of Prolog systems: look elsewhere for documentation on those.
+Note also that the present document does not describe the library
+functionality, its classes or its methods and functions: see
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)"
+for this kind of information.
+
+.SH "INCLUDING THE HEADER FILE"
+The C++ interface of the PPL has only one header file, named
+\fIppl.hh\fP.  So your program should contain a directive of the form
+.sp
+.B #include <ppl.hh>
+.sp
+Of course, you must make sure you installed the PPL in a place where
+the compiler can find it, either by itself or with the help of a suitable
+.B -Idir
+command line option (see the file \fIINSTALL\fP for information
+on how to configure the library so that it is installed in the
+place of your choice).
+
+.SH "INITIALIZING AND FINALIZING THE LIBRARY"
+The mere inclusion of \fIppl.hh\fP in at least one file of your
+project will cause the automatic initialization and finalization
+of the library.
+However, there are situations in which automatic initialization
+and finalization is not desirable (e.g., if the application fiddles
+with the GMP's memory allocation functions).  In those cases,
+.B every
+inclusion of \fIppl.hh\fP must take the form
+.sp
+.nf
+.B #define PPL_NO_AUTOMATIC_INITIALIZATION
+.B #include <ppl.hh>
+.fi
+.sp
+When automatic initialization and finalization is disabled you must
+.B absolutely
+call the function
+.sp
+.B void Parma_Polyhedra_Library::initialize()
+.sp
+before using the library.
+It is also a good norm to call the function
+.sp
+.B void Parma_Polyhedra_Library::finalize()
+.sp
+when you are done with the library.
+
+.SH "USING THE LIBRARY"
+Keeping in mind that there is no substitute for a careful reading of
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+you can find many examples of use in the directories
+.B tests
+(see the
+.B README
+file in that directory)
+and
+.B demos/ppl_lcdd
+of the source distribution.
+
+.SH "LINKING WITH THE LIBRARY"
+Linking with the C++ interface of the Parma Polyhedra Library is best done
+using the C++ compiler itself: usually, specifying the
+.B -lppl
+command line option is enough.  In fact, if you use a shared version
+of the library, this automatically records the dependency from the GMP
+library, something that the linker ought to deal with gracefully.
+Otherwise you will have to add
+.B -lgmpxx -lgmp
+to the command line.
+Things are more complex if you installed the PPL into some nonstandard
+place.  In this case you will have to use the
+.B -Ldir
+option and, if you use a shared version of the library,
+possible take further steps: see the documentation of your system
+for more information on this subject
+(the
+.IR "Program Library HOWTO"
+is especially valuable for GNU/Linux users).
+
+.SH "IMPLEMENTING MEMORY-GUARDED COMPUTATIONS"
+One of the interesting features of the Parma Polyhedra Library is the
+possibility to implement memory-guarded computations.  The idea is that
+you can limit the amount of virtual memory available to the process,
+launch a PPL computation, and be ready to catch an
+.B std::bad_alloc
+exception.  Since the library is exception-safe, you can take the
+appropriate corrective measures (e.g., simplify the polyhedra and/or select
+less precise though less complex algorithms), and restart the computation.
+In order to do that, you should define alternative memory allocation functions
+for GMP that throw
+.B std::bad_alloc
+upon memory exhaustion.
+For instance:
+.sp
+.nf
+#include <new>
+#include <cstdlib>
+
+extern "C" void*
+cxx_malloc(size_t size) {
+  void* p = malloc(size);
+  if (p != 0 || size == 0)
+    return p;
+
+  throw std::bad_alloc();
+}
+
+extern "C" void*
+cxx_realloc(void* q, size_t, size_t new_size) {
+  void* p = realloc(q, new_size);
+  if (p != 0 || new_size == 0)
+    return p;
+
+  throw std::bad_alloc();
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+  free(p);
+}
+.fi
+.sp
+Then you must install these functions and this can be done in two different
+ways:
+.IP (1)
+If your C++ compiler supports
+.B __attribute__ ((weak))
+and you do not have any other special needs, then you can simply link
+to your application a C function
+.B ppl_set_GMP_memory_allocation_functions(void)
+such as
+.sp
+.nf
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+}
+.fi
+.sp
+This is all that you have to do, whether or not you use the automatic
+initialization feature of the library (see above): in any case
+the initialization procedure will automatically call
+.B ppl_set_GMP_memory_allocation_functions(void).
+.IP (2)
+If your C++ compiler does not support
+.B __attribute__ ((weak))
+then you cannot use the automatic initialization feature of the library
+(see above) and should write a main program of the form
+.sp
+.nf
+int main() {
+  // The ordering of the following function calls is important.
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+  Parma_Polyhedra_Library::initialize();
+  ...
+.fi
+.sp
+
+.SH "USING NATIVE FLOATING POINT NUMBERS"
+At initialization time, the Parma Polyhedra Library sets the FPU rounding
+mode in a way that allows its floating-point-based computations to be
+conservative (i.e., possibly approximated but correct) and reasonably
+efficient.  In case your application itself uses native floating point
+numbers and relies on a particular rounding mode (if you are in doubt,
+assume that it does rely on round-to-nearest to be in effect), you should
+use the function
+.sp
+.B void Parma_Polyhedra_Library::restore_pre_PPL_rounding()
+.sp
+after the PPL initialization and before using native floating point numbers
+in the application.
+If your application does not use any floating-point-based PPL abstraction,
+no further measure should be taken.
+Otherwise, it is imperative to call the function
+.sp
+.B void Parma_Polyhedra_Library::set_rounding_for_PPL()
+.sp
+before invoking any PPL interface related to such abstractions.
+
+
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+David A. Wheeler.
+.IR "Program Library HOWTO",
+available (in several formats) at
+\fBhttp://www.dwheeler.com/program-library/\fR .
+
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+
+.SH "COPYRIGHT AND NO WARRANTY"
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/libppl_c.3 b/doc/libppl_c.3
new file mode 100644
index 0000000..3db0351
--- /dev/null
+++ b/doc/libppl_c.3
@@ -0,0 +1,162 @@
+.TH libppl_c "3" "June 2012" "PPL 1.0" "libppl_c overview"
+
+.SH NAME
+libppl_c \- the C interface of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B #include <ppl_c.h>
+.sp
+cc file.c
+.B -lppl
+
+.SH DESCRIPTION
+This is a short overview on how to use the Parma Polyhedra Library (PPL)
+in your C programs on Unix-like operating systems.
+Note that the PPL has interfaces also for C++, Java, OCaml and a number
+of Prolog systems: look elsewhere for documentation on those.
+Note also that the present document does not describe the library
+functionality, its classes or its methods and functions: see
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)"
+and
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)"
+for this kind of information.
+
+.SH "INCLUDING THE HEADER FILE"
+The C interface of the PPL has only one header file, named
+\fIppl_c.h\fP.  So your program should contain a directive of the form
+.sp
+.B #include <ppl_c.h>
+.sp
+Of course, you must make sure you installed the PPL in a place where
+the compiler can find it, either by itself or with the help of a suitable
+.B -Idir
+command line option (see the file \fIINSTALL\fP for information
+on how to configure the library so that it is installed in the
+place of your choice).
+
+.SH "INITIALIZING AND FINALIZING THE LIBRARY"
+In order to initialize the Parma Polyhedra Library you must
+call the function
+.sp
+.B int ppl_initialize(void)
+.sp
+before using any of its functionalities.
+It is also a good norm to call the function
+.sp
+.B int ppl_finalize(void)
+.sp
+when you are done with the library.
+
+.SH "USING THE LIBRARY"
+Keeping in mind that there is no substitute for a careful reading of
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)"
+and
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)"
+you can find examples of use in the directories
+.B interfaces/C/tests
+and
+.B demos/ppl_lpsol
+of the source distribution.
+
+.SH "LINKING WITH THE LIBRARY"
+Linking with the C interface of the Parma Polyhedra Library is best done
+using the C compiler itself: usually, specifying the
+.B -lppl_c
+command line option is enough.  In fact, if you use a shared version
+of the library, this automatically records the dependency from the
+PPL core and the GMP libraries, something that the linker ought to deal
+with gracefully.
+Otherwise you will have to add
+.B -lppl -lgmpxx -lgmp
+to the command line.
+Things are more complex if you installed the PPL into some nonstandard
+place.  In this case you will have to use the
+.B -Ldir
+option and, if you use a shared version of the library,
+possible take further steps: see the documentation of your system
+for more information on this subject
+(the
+.IR "Program Library HOWTO"
+is especially valuable for GNU/Linux users).
+
+.SH "RETURN VALUES"
+All the PPL C interface functions return an int: a negative value means
+that an error occurred.  See
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)"
+for the error codes.
+
+.SH "IMPLEMENTING MEMORY-GUARDED COMPUTATIONS"
+One of the interesting features of the Parma Polyhedra Library is the
+possibility to implement memory-guarded computations.  The idea is that
+you can limit the amount of virtual memory available to the process,
+launch a PPL computation, and be ready to be returned a
+.B PPL_ERROR_OUT_OF_MEMORY
+error code.  You can then take the
+appropriate corrective measures (e.g., simplify the polyhedra and/or select
+less precise though less complex algorithms), and restart the computation.
+In order to do that, you should define alternative memory allocation functions
+for GMP that throw
+.B std::bad_alloc
+upon memory exhaustion.
+See \fB\f(BIlibppl\fB\|(3)\fR for instructions on how to do that.
+
+.SH "USING NATIVE FLOATING POINT NUMBERS"
+At initialization time, the Parma Polyhedra Library sets the FPU rounding
+mode in a way that allows its floating-point-based computations to be
+conservative (i.e., possibly approximated but correct) and reasonably
+efficient.  In case your application itself uses native floating point
+numbers and relies on a particular rounding mode (if you are in doubt,
+assume that it does rely on round-to-nearest to be in effect), you should
+use the function
+.sp
+.B int ppl_restore_pre_PPL_rounding()
+.sp
+after the PPL initialization and before using native floating point numbers
+in the application.
+If your application does not use any floating-point-based PPL abstraction,
+no further measure should be taken.
+Otherwise, it is imperative to call the function
+.sp
+.B int ppl_set_rounding_for_PPL()
+.sp
+before invoking any PPL interface related to such abstractions.
+
+
+.SH "SEE ALSO"
+.BR ppl-config(1)
+.sp
+.BR libppl(3)
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+David A. Wheeler.
+.IR "Program Library HOWTO",
+available (in several formats) at
+\fBhttp://www.dwheeler.com/program-library/\fR .
+
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR .
+
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+
+.SH "COPYRIGHT AND NO WARRANTY"
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/doc/ppl-config.1 b/doc/ppl-config.1
new file mode 100644
index 0000000..92d7d49
--- /dev/null
+++ b/doc/ppl-config.1
@@ -0,0 +1,142 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.40.11.
+.TH PPL-CONFIG "1" "October 2013" "ppl-config 1.1" "User Commands"
+.SH NAME
+ppl-config \- obtain information about an installation of the Parma Polyhedra Library
+.SH SYNOPSIS
+.B ppl-config
+[\fIOPTION\fR]...
+.SH DESCRIPTION
+Displays information, in various formats, about an installation
+of the Parma Polyhedra Library.
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+prints this help text to stdout
+.TP
+\fB\-FFMT\fR, \fB\-\-format\fR=\fIFMT\fR
+sets the output format to FMT
+(one of `plain', `makefile', `sh' or `csh')
+.TP
+\fB\-IINT\fR, \fB\-\-interface\fR=\fIINT\fR
+selects a library interface (one of `C++', `C',
+`Ciao\-Prolog', `GNU\-Prolog', `SICStus\-Prolog',
+`SWI\-Prolog', `XSB\-Prolog', `YAP\-Prolog',
+`OCaml' or `Java')
+.TP
+\fB\-A\fR, \fB\-\-application\fR
+selects output for building an application
+.TP
+\fB\-L\fR, \fB\-\-library\fR
+selects output for building a library
+.TP
+\fB\-p[PFX]\fR, \fB\-\-prefix\fR[=\fIPFX\fR]
+prints or sets library prefix information
+.TP
+\fB\-e[PFX]\fR, \fB\-\-exec\-prefix\fR[=\fIPFX\fR]
+prints or sets library exec\-prefix information
+.TP
+\fB\-O\fR, \fB\-\-configure\-options\fR
+prints configuration options
+.TP
+\fB\-V\fR, \fB\-\-version\fR
+prints version information
+.TP
+\fB\-M\fR, \fB\-\-version\-major\fR
+prints version major number
+.TP
+\fB\-N\fR, \fB\-\-version\-minor\fR
+prints version minor number
+.TP
+\fB\-R\fR, \fB\-\-version\-revision\fR
+prints version revision number
+.TP
+\fB\-B\fR, \fB\-\-version\-beta\fR
+prints version beta number
+.TP
+\fB\-E\fR, \fB\-\-banner\fR
+prints library banner
+.TP
+\fB\-n\fR, \fB\-\-coefficients\fR
+prints type of library coefficients
+.TP
+\fB\-i\fR, \fB\-\-includedir\fR
+prints include files directory
+.TP
+\fB\-b\fR, \fB\-\-bindir\fR
+prints binary executables directory
+.TP
+\fB\-l\fR, \fB\-\-libdir\fR
+prints library files directory
+.TP
+\fB\-P\fR, \fB\-\-cppflags\fR
+prints preprocessor flags
+.TP
+\fB\-C\fR, \fB\-\-cflags\fR
+prints C compiler flags
+.TP
+\fB\-X\fR, \fB\-\-cxxflags\fR
+prints C++ compiler flags
+.TP
+\fB\-D\fR, \fB\-\-ldflags\fR
+prints linker flags
+.TP
+\fB\-g\fR, \fB\-\-license\fR
+prints synthetic licensing information
+.TP
+\fB\-c\fR, \fB\-\-copying\fR
+prints detailed licensing information
+.TP
+\fB\-u\fR, \fB\-\-bugs\fR
+prints bug reporting information
+.TP
+\fB\-r\fR, \fB\-\-credits\fR
+prints credits
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at \fBhttp://bugseng.com/products/ppl/\fR.
+
+.SH AUTHOR
+See the file \fBCREDITS\fR in the source distribution or use the command
+\fBppl\-config \-\-credits\fR for a list of contributors.
+
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH "COPYRIGHT AND NO WARRANTY"
+Copyright (C) 2001\-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010\-2013 BUGSENG srl (http://bugseng.com)
+.br
+This is free software; see the file \fBCOPYING\fR in the source
+distribution or use the command \fBppl\-config \-\-copying\fR to
+obtain the copying conditions.  There is NO warranty; not even for
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+.SH "REPORTING BUGS"
+Report bugs to <ppl\-devel at cs.unipr.it>.
+.SH "SEE ALSO"
+.BR libppl(3)
+.sp
+.BR libppl_c(3)
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library C Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library Java Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library OCaml Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
+.sp
+Roberto Bagnara, Patricia M. Hill, and Enea Zaffanella.
+.IR "The Parma Polyhedra Library Prolog Language Interface User's Manual (version 1.0)",
+available (in several formats) at
+\fBhttp://bugseng.com/products/ppl/\fR .
diff --git a/doc/ppl-user-1.1-html.tar.gz b/doc/ppl-user-1.1-html.tar.gz
new file mode 100644
index 0000000..42c11a8
Binary files /dev/null and b/doc/ppl-user-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-1.1.pdf b/doc/ppl-user-1.1.pdf
new file mode 100644
index 0000000..d6d22f8
Binary files /dev/null and b/doc/ppl-user-1.1.pdf differ
diff --git a/doc/ppl-user-1.1.ps.gz b/doc/ppl-user-1.1.ps.gz
new file mode 100644
index 0000000..5f3f5ca
Binary files /dev/null and b/doc/ppl-user-1.1.ps.gz differ
diff --git a/doc/ppl-user-c-interface-1.1-html.tar.gz b/doc/ppl-user-c-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..285759c
Binary files /dev/null and b/doc/ppl-user-c-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-c-interface-1.1.pdf b/doc/ppl-user-c-interface-1.1.pdf
new file mode 100644
index 0000000..954d442
Binary files /dev/null and b/doc/ppl-user-c-interface-1.1.pdf differ
diff --git a/doc/ppl-user-c-interface-1.1.ps.gz b/doc/ppl-user-c-interface-1.1.ps.gz
new file mode 100644
index 0000000..2e790e4
Binary files /dev/null and b/doc/ppl-user-c-interface-1.1.ps.gz differ
diff --git a/doc/ppl-user-java-interface-1.1-html.tar.gz b/doc/ppl-user-java-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..eaf5bab
Binary files /dev/null and b/doc/ppl-user-java-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-java-interface-1.1.pdf b/doc/ppl-user-java-interface-1.1.pdf
new file mode 100644
index 0000000..add9354
Binary files /dev/null and b/doc/ppl-user-java-interface-1.1.pdf differ
diff --git a/doc/ppl-user-java-interface-1.1.ps.gz b/doc/ppl-user-java-interface-1.1.ps.gz
new file mode 100644
index 0000000..c9d009f
Binary files /dev/null and b/doc/ppl-user-java-interface-1.1.ps.gz differ
diff --git a/doc/ppl-user-ocaml-interface-1.1-html.tar.gz b/doc/ppl-user-ocaml-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..0bb2d34
Binary files /dev/null and b/doc/ppl-user-ocaml-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-ocaml-interface-1.1.pdf b/doc/ppl-user-ocaml-interface-1.1.pdf
new file mode 100644
index 0000000..2597e1c
Binary files /dev/null and b/doc/ppl-user-ocaml-interface-1.1.pdf differ
diff --git a/doc/ppl-user-ocaml-interface-1.1.ps.gz b/doc/ppl-user-ocaml-interface-1.1.ps.gz
new file mode 100644
index 0000000..b5e07e5
Binary files /dev/null and b/doc/ppl-user-ocaml-interface-1.1.ps.gz differ
diff --git a/doc/ppl-user-prolog-interface-1.1-html.tar.gz b/doc/ppl-user-prolog-interface-1.1-html.tar.gz
new file mode 100644
index 0000000..e8b647b
Binary files /dev/null and b/doc/ppl-user-prolog-interface-1.1-html.tar.gz differ
diff --git a/doc/ppl-user-prolog-interface-1.1.pdf b/doc/ppl-user-prolog-interface-1.1.pdf
new file mode 100644
index 0000000..83062b5
Binary files /dev/null and b/doc/ppl-user-prolog-interface-1.1.pdf differ
diff --git a/doc/ppl-user-prolog-interface-1.1.ps.gz b/doc/ppl-user-prolog-interface-1.1.ps.gz
new file mode 100644
index 0000000..0693032
Binary files /dev/null and b/doc/ppl-user-prolog-interface-1.1.ps.gz differ
diff --git a/doc/ppl.bib b/doc/ppl.bib
new file mode 100644
index 0000000..cbb16bb
--- /dev/null
+++ b/doc/ppl.bib
@@ -0,0 +1,3246 @@
+A bibliography of papers that were consulted and/or written
+for the design and implementation of the Parma Polyhedra Library.
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara AT cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This BibTeX database is made available under the Open Data Commons
+Attribution License (ODC-By) v1.0, which is reproduced below for your
+convenience and available at http://opendatacommons.org/licenses/by/1.0/
+Summarizing:
+
+- You are free: to copy, distribute and use the database;  to produce
+  works from the database;  to modify, transform and build upon the database.
+
+- You must attribute any public use of the database, or works produced
+  from the database, in the manner specified in the license.  For any
+  use or redistribution of the database, or works produced from it,
+  you must make clear to others the license of the database and keep
+  intact any notices on the original database.
+
+
+ at PREAMBLE{ "\newcommand{\noopsort}[1]{}" }
+
+ at PhdThesis{Ancourt91th,
+  Author = "C. Ancourt",
+  Title = "G\'en\'eration automatique de codes de transfert
+           pour multiprocesseurs \`a m\'emoires locales",
+  School = "Universit\'e de Paris VI",
+  Address = "Paris, France",
+  Month = mar,
+  Year = 1991,
+  Abstract = "Parallel tasks generated by automatic parallelizers do
+              not take advantage of supercomputer memory
+              hierarchies. This thesis presents algorithms to
+              transform a parallel task into an equivalent one that
+              uses data with fast access memory. Algorithms to
+              automatically generate code to move data between two
+              different memory levels of (super)computer are
+              presented. These copy codes should move back and forth
+              array elements that are accessed when an elementary
+              processor execute an array reference located in a set of
+              loops. This set of array elements is characterized by a
+              set of integer points in $\mathcal{Z}^p$ that is not
+              necessarily a convex polyhedron.
+              In the case of data transfers from global memory to
+              local memory, it is possible to copy a superset of
+              accessed elements, for instance its convex hull. A
+              trade-off has to be made between local memory space,
+              transfer volume and loop bound complexity.
+              To copy data back from local memory to global memory is
+              more difficult because global memory consistency must be
+              preserved. Each processor (or processus) should only
+              copy its own results to avoid errors and, secondarily,
+              to decrease global memory traffic.
+              The input of our main algorithm is an integer convex
+              polyhedron defining the computation space and an affine
+              function representing the index expressions. Its output
+              is set of nested loops containing a new array reference
+              whose execution copies exactly accessed elements. Each
+              element is copied only once. Loop bound expressions use
+              integer divisions to generate non-convex sets.
+              For most practical programs this algorithm provides
+              optimal code in number of data movements and control
+              overhead. Associated with a dependence analysis phase,
+              it can be used to generate data movements in distributed
+              memory multiprocessors. When data partitionning in local
+              memories is specified, it eliminates most of execution
+              guards used to compute only local values on each
+              processor."
+}
+
+ at PhdThesis{Bagnara97th,
+  Author = "R. Bagnara",
+  Title  = "Data-Flow Analysis for Constraint Logic-Based Languages",
+  School = "Dipartimento di Informatica, Universit\`a di Pisa",
+  Address = "Pisa, Italy",
+  Month = mar,
+  Year   = 1997,
+  Note = "Printed as Report TD-1/97",
+  Abstract = "We aim at the the development of precise, practical, and
+             theoretically well-founded data-flow analyzers for
+             constraint logic-based languages. The design and
+             development of such an analyzer fostered a number of
+             research problems that we had to address. A hierarchy of
+             constraint systems is introduced that is suitable for
+             designing and combining abstract domains. The rational
+             construction of a generic domain for the structural
+             analysis of CLP programs is presented. We also address
+             the problem of the ``missing \emph{occur-check}'' in many
+             implemented languages.  We introduce a new family of
+             domains, based on constraint propagation techniques, for
+             the abstraction of the numerical leaves that occur in the
+             terms of CLP languages. Despite the fact that groundness
+             analysis for logic-based languages is a widely studied
+             subject, a novel domain for groundness analysis is
+             presented that outperforms the existing domains from
+             several points of view. Finally, we present a bottom-up
+             analysis technique for CLP languages that allows for the
+             precise derivation of both call- and success-patterns
+             preserving the connection between them."
+}
+
+ at Article{Bagnara98SCP,
+  Author = "R. Bagnara",
+  Title = "A Hierarchy of Constraint Systems for Data-Flow Analysis
+           of Constraint Logic-Based Languages",
+  Journal = "Science of Computer Programming",
+  Volume = 30,
+  Number = "1--2",
+  Publisher = "Elsevier",
+  Year = 1998,
+  Pages = "119--155",
+  Abstract = "Many interesting analyses for constraint logic-based
+              languages are aimed at the detection of \emph{monotonic}
+              properties, that is to say, properties that are
+              preserved as the computation progresses.  Our basic
+              claim is that most, if not all, of these analyses can be
+              described within a unified notion of constraint domains.
+              We present a class of constraint systems that allows for
+              a smooth integration within an appropriate framework for
+              the definition of non-standard semantics of constraint
+              logic-based languages.  Such a framework is also
+              presented and motivated.  We then show how such domains
+              can be built, as well as construction techniques that
+              induce a hierarchy of domains with interesting
+              properties.  In particular, we propose a general
+              methodology for domain combination with asynchronous
+              interaction (i.e., the interaction is not necessarily
+              synchronized with the domains' operations).  By
+              following this methodology, interesting combinations of
+              domains can be expressed with all the the semantic
+              elegance of concurrent constraint programming
+              languages.",
+  URL = "http://bugseng.com/products/ppl/documentation/Bagnara98SCP.pdf"
+}
+
+ at Techreport{BagnaraDHMZ05TR,
+  Author = "R. Bagnara and K. Dobson and P. M. Hill and M. Mundell
+            and E. Zaffanella",
+  Title = "A Linear Domain for Analyzing the Distribution of Numerical Values",
+  Number = "2005.06",
+  Type = "Report",
+  Institution = "School of Computing, University of Leeds, UK",
+  Year = 2005,
+  Abstract = "This paper explores the abstract domain of \emph{grids},
+              a domain that is able to represent sets of equally
+              spaced points and hyperplanes over an $n$-dimensional
+              vector space.  Such a domain is useful for the static
+              analysis of the patterns of distribution of the values
+              program variables can take.  Besides the bare abstract
+              domain, we present a complete set of operations on grids
+              that includes all that is necessary to define the
+              abstract semantics and the widening operators required
+              to compute it in a finite number of steps.  The
+              definition of the domain and its operations exploit
+              well-known techniques from linear algebra as well as a
+              dual representation that allows, among other things, for
+              a concise and efficient implementation.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraDHMZ05TR.pdf",
+}
+
+ at InProceedings{BagnaraDHMZ07,
+  Author = "R. Bagnara and K. Dobson and P. M. Hill and M. Mundell
+            and E. Zaffanella",
+  Title = "Grids: A Domain for Analyzing the Distribution of Numerical Values",
+  Booktitle = "Logic-based Program Synthesis and Transformation,
+               16th International Symposium",
+  Address = "Venice, Italy",
+  Editor = "G. Puebla",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4407,
+  ISBN = "3-540-71409-X",
+  Year = 2007,
+  Pages = "219--235",
+  Abstract = "This paper explores the abstract domain of \emph{grids},
+              a domain that is able to represent sets of equally
+              spaced points and hyperplanes over an $n$-dimensional
+              vector space.  Such a domain is useful for the static
+              analysis of the patterns of distribution of the values
+              program variables can take.  We present the domain, its
+              representation and the basic operations on grids
+              necessary to define the abstract semantics.  We show how
+              the definition of the domain and its operations exploit
+              well-known techniques from linear algebra as well as a
+              dual representation that allows, among other things, for
+              a concise and efficient implementation.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraDHMZ07.pdf"
+}
+
+ at Misc{BagnaraDHMZ06b,
+  Author = "R. Bagnara and K. Dobson and P. M. Hill and M. Mundell
+            and E. Zaffanella",
+  Title = "A Practical Tool for Analyzing the Distribution
+           of Numerical Values",
+  Year = 2006,
+  Note = "Available at
+         \url{http://www.comp.leeds.ac.uk/hill/Papers/papers.html}.",
+  Abstract = "The abstract domain of grids (or lattices) is a domain
+         that is able to represent sets of equally spaced points and
+         hyperplanes over an n-dimensional vector space.  Such a
+         domain is useful for the static analysis of the patterns of
+         distribution of the values that program variables can take.
+         This paper explores how this domain may be used in program
+         analysis, describing grid operations such as affine image,
+         affine preimage and widenings needed by such an application.
+         The paper also shows how any grid may be approximated by a
+         less precise non-relational grid and describes how such an
+         approximation can be computed.  Illustrative examples show
+         how the domain may be used in the analysis of programs
+         containing simple assignment statements, while loops and
+         recursive procedures."
+}
+
+ at Misc{BagnaraHMZ04EA,
+  Author = "R. Bagnara and P. M. Hill and E. Mazzi and E. Zaffanella",
+  Title = "Widening Operators for Weakly-Relational Numeric Abstractions",
+  Howpublished = "Report {\tt arXiv:cs.PL/0412043}",
+  Year = 2004,
+  Note = "Extended abstract.
+          Contribution to the \emph{International workshop on
+          ``Numerical \& Symbolic Abstract Domains''}
+          (NSAD'05, Paris, January 21, 2005).
+          Available at \url{http://arxiv.org/}
+          and \url{http://bugseng.com/products/ppl/}",
+  Abstract = "We discuss the divergence problems recently identified
+              in some extrapolation operators for weakly-relational
+              numeric domains. We identify the cause of the
+              divergences and point out that resorting to more
+              concrete, syntactic domains can be avoided by
+              researching suitable algorithms for the elimination of
+              redundant constraints in the chosen representation.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHMZ04EA.pdf"
+}
+
+ at InProceedings{BagnaraHZ02a,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "A New Encoding of Not Necessarily Closed Convex Polyhedra",
+  Booktitle = "Proceedings of the 1st CoLogNet Workshop on Component-based
+               Software Development and Implementation Technology
+               for Computational Logic Systems",
+  Address = "Madrid, Spain",
+  Editor = "M. Carro and C. Vacheret and K.-K. Lau",
+  Year = 2002,
+  Pages = "147--153",
+  Note = "Published as TR Number CLIP4/02.0, Universidad Polit\'ecnica
+          de Madrid, Facultad de Inform\'atica",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ02a.pdf"
+}
+
+ at TechReport{BagnaraHZ02TR,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "A New Encoding and Implementation
+           of Not Necessarily Closed Convex Polyhedra",
+  Number = 305,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2002,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+  Abstract = "Convex polyhedra, commonly employed for the analysis and
+              verification of both hardware and software, may be
+              defined either by a finite set of linear inequality
+              constraints or by finite sets of generating points and
+              rays of the polyhedron.  Although most implementations
+              of the polyhedral operations assume that the polyhedra
+              are topologically closed (i.e., all the constraints
+              defining them are non-strict), several analyzers and
+              verifiers need to compute on a domain of convex
+              polyhedra that are not necessarily closed (NNC).  The
+              usual approach to implementing NNC polyhedra is to embed
+              them into closed polyhedra in a vector space having one
+              extra dimension and reuse the tools and techniques
+              already available for closed polyhedra.  Previously,
+              this embedding has been designed so that a constant
+              number of constraints and a linear number of generators
+              have to be added to the original NNC specification of
+              the polyhedron.  In this paper we explore an alternative
+              approach: while still using an extra dimension to
+              represent the NNC polyhedron by a closed polyhedron, the
+              new embedding adds a linear number of constraints and a
+              constant number of generators.  We discuss the relative
+              benefits of these two implementations and how the choice
+              of representation can affect the efficiency of the
+              polyhedral operations.  As far as the issue of providing
+              a non-redundant description of the NNC polyhedron is
+              concerned, we generalize the results established in a
+              previous paper so that they apply to both encodings."
+}
+
+ at Article{BagnaraHRZ05SCP,
+  Author = "R. Bagnara and P. M. Hill and E. Ricci and E. Zaffanella",
+  Title = "Precise Widening Operators for Convex Polyhedra",
+  Journal = "Science of Computer Programming",
+  Volume = 58,
+  Number = "1--2",
+  Publisher = "Elsevier",
+  Year = 2005,
+  Pages = "28--56",
+  Abstract = "In the context of static analysis via abstract
+              interpretation, convex polyhedra constitute the most
+              used abstract domain among those capturing numerical
+              relational information.  Since the domain of convex
+              polyhedra admits infinite ascending chains, it has to be
+              used in conjunction with appropriate mechanisms for
+              enforcing and accelerating the convergence of fixpoint
+              computations.  Widening operators provide a simple and
+              general characterization for such mechanisms.  For the
+              domain of convex polyhedra, the original widening
+              operator proposed by Cousot and Halbwachs amply deserves
+              the name of \emph{standard widening} since most analysis
+              and verification tools that employ convex polyhedra also
+              employ that operator.  Nonetheless, there is an
+              unfulfilled demand for more precise widening operators.
+              In this paper, after a formal introduction to the
+              standard widening where we clarify some aspects that are
+              often overlooked, we embark on the challenging task of
+              improving on it.  We present a framework for the
+              systematic definition of new widening operators that are
+              never less precise than a given widening.  The framework
+              is then instantiated on the domain of convex polyhedra
+              so as to obtain a new widening operator that improves on
+              the standard widening by combining several heuristics.
+              A preliminary experimental evaluation has yielded
+              promising results.  We also suggest an improvement to
+              the well-known widening delay technique that allows to
+              gain precision while preserving its overall
+              simplicity.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHRZ05SCP.pdf"
+}
+
+ at TechReport{BagnaraHMZ05TR,
+  Author = "R. Bagnara and P. M. Hill and E. Mazzi and E. Zaffanella",
+  Title = "Widening Operators for Weakly-Relational Numeric Abstractions",
+  Number = 399,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2005,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+  Abstract = "We discuss the construction of proper widening operators
+              on several weakly-relational numeric abstractions. Our
+              proposal differs from previous ones in that we actually
+              consider the semantic abstract domains, whose elements
+              are \emph{geometric shapes}, instead of the (more
+              concrete) syntactic abstract domains of constraint
+              networks and matrices.  Since the closure by entailment
+              operator preserves geometric shapes, but not their
+              syntactic expressions, our widenings are immune from the
+              divergence issues that could be faced by the previous
+              approaches when interleaving the applications of
+              widening and closure.  The new widenings, which are
+              variations of the \emph{standard widening} for convex
+              polyhedra defined by Cousot and Halbwachs, can be made
+              as precise as the previous proposals working on the
+              syntactic domains.  The implementation of each new
+              widening relies on the availability of an effective
+              reduction procedure for the considered constraint
+              description: we provide such an algorithm for the domain
+              of \emph{octagonal shapes}.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHMZ05TR.pdf"
+}
+
+ at InProceedings{BagnaraHMZ05,
+  Author = "R. Bagnara and P. M. Hill and E. Mazzi and E. Zaffanella",
+  Title = "Widening Operators for Weakly-Relational Numeric Abstractions",
+  Booktitle = "Static Analysis:
+               Proceedings of the 12th International Symposium",
+  Address = "London, UK",
+  Editor = "C. Hankin and I. Siveroni",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3672,
+  ISBN = "3-540-28584-9",
+  Year = 2005,
+  Pages = "3--18",
+  Abstract = "We discuss the construction of proper widening operators
+              on several weakly-relational numeric abstractions. Our
+              proposal differs from previous ones in that we actually
+              consider the semantic abstract domains, whose elements are
+              \emph{geometric shapes}, instead of the (more concrete)
+              syntactic abstract domains of constraint networks and
+              matrices. Since the closure by entailment operator preserves
+              geometric shapes, but not their syntactic expressions, our
+              widenings are immune from the divergence issues that could
+              be faced by the previous approaches when interleaving the
+              applications of widening and closure. The new widenings,
+              which are variations of the \emph{standard widening} for
+              convex polyhedra defined by Cousot and Halbwachs, can be
+              made as precise as the previous proposals working on the
+              syntactic domains. The implementation of each new widening
+              relies on the availability of an effective reduction procedure
+              for the considered constraint description: we provide such an
+              algorithm for the domain of \emph{octagonal shapes}.",
+}
+
+ at Techreport{BagnaraMPZ10TR,
+  Author = "R. Bagnara and F. Mesnard and A. Pescetti and E. Zaffanella",
+  Title = "The Automatic Synthesis of Linear Ranking Functions:
+           The Complete Unabridged Version",
+  Number = 498,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2010,
+  Note = "Superseded by \cite{BagnaraMPZ12TR}.",
+  Abstract = "The classical technique for proving termination of a
+              generic sequential computer program involves the
+              synthesis of a \emph{ranking function} for each loop of
+              the program.  \emph{Linear} ranking functions are
+              particularly interesting because many terminating loops
+              admit one and algorithms exist to automatically
+              synthesize it.  In this paper we present two such
+              algorithms: one based on work dated 1991 by Sohn and
+              Van~Gelder; the other, due to Podelski and Rybalchenko,
+              dated 2004.  Remarkably, while the two algorithms will
+              synthesize a linear ranking function under exactly the
+              same set of conditions, the former is mostly unknown to
+              the community of termination analysis and its general
+              applicability has never been put forward before the
+              present paper.  In this paper we thoroughly justify both
+              algorithms, we prove their correctness, we compare their
+              worst-case complexity and experimentally evaluate their
+              efficiency, and we present an open-source implementation
+              of them that will make it very easy to include
+              termination-analysis capabilities in automatic program
+              verifiers."
+}
+
+ at Misc{BagnaraMPZ12TR,
+  Author = "R. Bagnara and F. Mesnard and A. Pescetti and E. Zaffanella",
+  Title = "The Automatic Synthesis of Linear Ranking Functions:
+           The Complete Unabridged Version",
+  Howpublished = "Report {\tt arXiv:cs.PL/1004.0944v2}",
+  Year = 2012,
+  Note = "Available at \url{http://arxiv.org/}
+          and \url{http://bugseng.com/products/ppl/}.
+          Improved version of \cite{BagnaraMPZ10TR}.",
+  Abstract = "The classical technique for proving termination of a
+              generic sequential computer program involves the
+              synthesis of a \emph{ranking function} for each loop of
+              the program.  \emph{Linear} ranking functions are
+              particularly interesting because many terminating loops
+              admit one and algorithms exist to automatically
+              synthesize it.  In this paper we present two such
+              algorithms: one based on work dated 1991 by Sohn and
+              Van~Gelder; the other, due to Podelski and Rybalchenko,
+              dated 2004.  Remarkably, while the two algorithms will
+              synthesize a linear ranking function under exactly the
+              same set of conditions, the former is mostly unknown to
+              the community of termination analysis and its general
+              applicability has never been put forward before the
+              present paper.  In this paper we thoroughly justify both
+              algorithms, we prove their correctness, we compare their
+              worst-case complexity and experimentally evaluate their
+              efficiency, and we present an open-source implementation
+              of them that will make it very easy to include
+              termination-analysis capabilities in automatic program
+              verifiers."
+}
+
+ at Article{BagnaraMPZ12IC,
+  Author = "R. Bagnara and F. Mesnard and A. Pescetti and E. Zaffanella",
+  Title = "A New Look at the Automatic Synthesis of Linear Ranking Functions",
+  Journal = "Information and Computation",
+  Publisher = "Elsevier Science B.V.",
+  Year = 2012,
+  Volume = 215,
+  Pages = "47--67",
+  Abstract = "The classical technique for proving termination of a
+              generic sequential computer program involves the
+              synthesis of a \emph{ranking function} for each loop of
+              the program.  \emph{Linear} ranking functions are
+              particularly interesting because many terminating loops
+              admit one and algorithms exist to automatically
+              synthesize it.  In this paper we present two such
+              algorithms: one based on work dated 1991 by Sohn and
+              Van~Gelder; the other, due to Podelski and Rybalchenko,
+              dated 2004.  Remarkably, while the two algorithms will
+              synthesize a linear ranking function under exactly the
+              same set of conditions, the former is mostly unknown to
+              the community of termination analysis and its general
+              applicability has never been put forward before the
+              present paper.  In this paper we thoroughly justify both
+              algorithms, we prove their correctness, we compare their
+              worst-case complexity and experimentally evaluate their
+              efficiency, and we present an open-source implementation
+              of them that will make it very easy to include
+              termination-analysis capabilities in automatic program
+              verifiers."
+}
+
+ at InProceedings{BagnaraRZH02,
+  Author = "R. Bagnara and E. Ricci and E. Zaffanella and P. M. Hill",
+  Title = "Possibly Not Closed Convex Polyhedra
+           and the {Parma Polyhedra Library}",
+  Booktitle = "Static Analysis:
+               Proceedings of the 9th International Symposium",
+  Address = "Madrid, Spain",
+  Editor = "M. V. Hermenegildo and G. Puebla",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2477,
+  ISBN = "3-540-44235-9",
+  Pages = "213--229",
+  Year = 2002,
+  Abstract = "The domain of convex polyhedra is employed in several
+              systems for the analysis and verification of hardware
+              and software components.  Current applications span
+              imperative, functional and logic languages, synchronous
+              languages and synchronization protocols, real-time and
+              hybrid systems.  Since the seminal work of P.~Cousot and
+              N.~Halbwachs, convex polyhedra have thus played an
+              important role in the formal methods community and
+              several critical tasks rely on their software
+              implementations.  Despite this, existing libraries for
+              the manipulation of convex polyhedra are still research
+              prototypes and suffer from limitations that make their
+              usage problematic, especially in critical applications.
+              Furthermore, there is inadequate support for polyhedra
+              that are not necessarily closed (NNC), i.e., polyhedra
+              that are described by systems of constraints where strict
+              inequalities are allowed to occur.  This paper presents
+              the Parma Polyhedra Library, a new, robust and complete
+              implementation of NNC convex polyhedra, concentrating on
+              the distinctive features of the library and on the novel
+              theoretical underpinnings.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraRZH02.pdf"
+}
+
+ at TechReport{BagnaraRZH02TR,
+  Author = "R. Bagnara and E. Ricci and E. Zaffanella and P. M. Hill",
+  Title = "Possibly Not Closed Convex Polyhedra
+           and the {Parma Polyhedra Library}",
+  Number = 286,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = "{\noopsort{a}}2002",
+  Note = "See also \cite{BagnaraRZH02TRerrata}.
+          Available at \url{http://www.cs.unipr.it/Publications/}",
+  Abstract = "The domain of convex polyhedra is employed in several
+              systems for the analysis and verification of hardware
+              and software components. Current applications span imperative,
+              functional and logic languages, synchronous languages and
+              synchronization protocols, real-time and hybrid systems.
+              Since the seminal work of P.~Cousot and N.~Halbwachs,
+              convex polyhedra have thus played an important role
+              in the formal methods community and several critical tasks
+              rely on their software implementations. Despite this,
+              existing libraries for the manipulation of convex polyhedra
+              are still research prototypes and suffer from limitations
+              that make their usage problematic, especially in critical
+              applications. These limitations concern inaccuracies in
+              the documentation of the underlying theory, code and
+              interfaces; numeric overflow and underflow; use of not
+              fully dynamic data-structures and poor mechanisms
+              for error handling and recovery. In addition, there is
+              inadequate support for polyhedra that are not necessarily
+              closed (NNC), i.e., polyhedra that are described by systems
+              of constraints where strict inequalities are allowed to
+              occur. This paper presents the Parma Polyhedra Library,
+              a new, robust and complete implementation of NNC convex
+              polyhedra, concentrating on the distinctive features
+              of the library and on the novel theoretical underpinnings."
+}
+
+ at Misc{BagnaraRZH02TRerrata,
+  Author = "R. Bagnara and E. Ricci and E. Zaffanella and P. M. Hill",
+  Title = "Errata for Technical Report {``Quaderno 286''}",
+  Howpublished = "Available at \url{http://www.cs.unipr.it/Publications/}",
+  Year = "{\noopsort{b}}2002",
+  Note = "See \cite{BagnaraRZH02TR}"
+}
+
+ at InProceedings{BagnaraHRZ03,
+  Author = "R. Bagnara and P. M. Hill and E. Ricci and E. Zaffanella",
+  Title = "Precise Widening Operators for Convex Polyhedra",
+  Booktitle = "Static Analysis:
+               Proceedings of the 10th International Symposium",
+  Address = "San Diego, California, USA",
+  Editor = "R. Cousot",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2694,
+  Year = 2003,
+  Pages = "337--354",
+  Abstract = "Convex polyhedra constitute the most used abstract
+              domain among those capturing numerical relational
+              information.  Since the domain of convex polyhedra
+              admits infinite ascending chains, it has to be used in
+              conjunction with appropriate mechanisms for enforcing
+              and accelerating convergence of the fixpoint
+              computation.  Widening operators provide a simple and
+              general characterization for such mechanisms.  For the
+              domain of convex polyhedra, the original widening
+              operator proposed by Cousot and Halbwachs amply deserves
+              the name of \emph{standard widening} since most analysis
+              and verification tools that employ convex polyhedra also
+              employ that operator.  Nonetheless, there is an
+              unfulfilled demand for more precise widening operators.
+              In this paper, after a formal introduction to the
+              standard widening where we clarify some aspects that are
+              often overlooked, we embark on the challenging task of
+              improving on it.  We present a framework for the
+              systematic definition of new and precise widening
+              operators for convex polyhedra.  The framework is then
+              instantiated so as to obtain a new widening operator
+              that combines several heuristics and uses the standard
+              widening as a last resort so that it is never less
+              precise.  A preliminary experimental evaluation has
+              yielded promising results.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHRZ03.pdf"
+}
+
+ at TechReport{BagnaraHRZ03TR,
+  Author = "R. Bagnara and P. M. Hill and E. Ricci and E. Zaffanella",
+  Title = "Precise Widening Operators for Convex Polyhedra",
+  Number = 312,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2003,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+  Abstract = "Convex polyhedra constitute the most used abstract
+              domain among those capturing numerical relational
+              information.  Since the domain of convex polyhedra
+              admits infinite ascending chains, it has to be used in
+              conjunction with appropriate mechanisms for enforcing
+              and accelerating convergence of the fixpoint
+              computation.  Widening operators provide a simple and
+              general characterization for such mechanisms.  For the
+              domain of convex polyhedra, the original widening
+              operator proposed by Cousot and Halbwachs amply deserves
+              the name of \emph{standard widening} since most analysis
+              and verification tools that employ convex polyhedra also
+              employ that operator.  Nonetheless, there is demand for
+              more precise widening operators that still has not been
+              fulfilled.  In this paper, after a formal introduction
+              to the standard widening where we clarify some aspects
+              that are often overlooked, we embark on the challenging
+              task of improving on it.  We present a framework for the
+              systematic definition of new and precise widening
+              operators for convex polyhedra.  The framework is then
+              instantiated so as to obtain a new widening operator
+              that combines several heuristics and uses the standard
+              widening as a last resort so that it is never less
+              precise.  A preliminary experimental evaluation has
+              yielded promising results.  We also suggest an
+              improvement to the well-known widening delay technique
+              that allows to gain precision while preserving its
+              overall simplicity."
+}
+
+ at InProceedings{BagnaraHZ03a,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "A New Encoding and Implementation
+           of Not Necessarily Closed Convex Polyhedra",
+  Booktitle = "Proceedings of the 3rd Workshop on Automated Verification
+               of Critical Systems",
+  Address = "Southampton, UK",
+  Editor = "M. Leuschel and S. Gruner and S. {Lo Presti}",
+  Year = 2003,
+  Pages = "161--176",
+  Note = "Published as TR Number DSSE-TR-2003-2, University of Southampton",
+  Abstract = "Convex polyhedra, commonly employed for the analysis and
+              verification of both hardware and software, may be
+              defined either by a finite set of linear inequality
+              constraints or by finite sets of generating points and
+              rays of the polyhedron.  Although most implementations
+              of the polyhedral operations assume that the polyhedra
+              are topologically closed (i.e., all the constraints
+              defining them are non-strict), several analyzers and
+              verifiers need to compute on a domain of convex
+              polyhedra that are not necessarily closed (NNC).  The
+              usual approach to implementing NNC polyhedra is to embed
+              them into closed polyhedra in a vector space having one
+              extra dimension and reuse the tools and techniques
+              already available for closed polyhedra.  Previously,
+              this embedding has been designed so that a constant
+              number of constraints and a linear number of generators
+              have to be added to the original NNC specification of
+              the polyhedron.  In this paper we explore an alternative
+              approach: while still using an extra dimension to
+              represent the NNC polyhedron by a closed polyhedron, the
+              new embedding adds a linear number of constraints and a
+              constant number of generators.  We discuss the relative
+              benefits of these two implementations and how the choice
+              of representation can affect the efficiency of the
+              polyhedral operations.  As far as the issue of providing
+              a non-redundant description of the NNC polyhedron is
+              concerned, we generalize the results established in a
+              previous paper so that they apply to both encodings.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ03a.pdf"
+}
+
+ at InProceedings{BagnaraHZ03b,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Widening Operators for Powerset Domains",
+  Booktitle = "Verification, Model Checking and Abstract Interpretation:
+               Proceedings of the 5th International Conference (VMCAI 2004)",
+  Address = "Venice, Italy",
+  Editor = "B. Steffen and G. Levi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2937,
+  ISBN = "3-540-20803-8",
+  Year = 2003,
+  Pages = "135--148",
+  Abstract = "The \emph{finite powerset construction} upgrades an
+              abstract domain by allowing for the representation of
+              finite disjunctions of its elements.  In this paper we
+              define two generic widening operators for the finite
+              powerset abstract domain.  Both widenings are obtained
+              by lifting any widening operator defined on the
+              base-level abstract domain and are parametric with
+              respect to the specification of a few additional
+              operators.  We illustrate the proposed techniques by
+              instantiating our widenings on powersets of convex
+              polyhedra, a domain for which no non-trivial widening
+              operator was previously known.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ03b.pdf"
+}
+
+ at TechReport{BagnaraHZ04TR,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Widening Operators for Powerset Domains",
+  Number = 349,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2004,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}",
+  Abstract = "The \emph{finite powerset construction} upgrades an
+              abstract domain by allowing for the representation of
+              finite disjunctions of its elements.  In this paper we
+              define two generic widening operators for the finite
+              powerset abstract domain.  Both widenings are obtained
+              by lifting any widening operator defined on the
+              base-level abstract domain and are parametric with
+              respect to the specification of a few additional
+              operators.  We illustrate the proposed techniques by
+              instantiating our widenings on powersets of convex
+              polyhedra, a domain for which no non-trivial widening
+              operator was previously known.",
+}
+
+ at Article{BagnaraHZ05FAC,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Not Necessarily Closed Convex Polyhedra
+           and the Double Description Method",
+  Journal = "Formal Aspects of Computing",
+  Publisher = "Springer-Verlag, London",
+  Volume = "17",
+  Number = "2",
+  Pages = "222--257",
+  Year = 2005,
+  ISSN = "0934-5043",
+  Abstract = "Since the seminal work of Cousot and Halbwachs, the domain
+              of convex polyhedra has been employed in several systems
+              for the analysis and verification of hardware and software
+              components. Although most implementations of the polyhedral
+              operations assume that the polyhedra are topologically
+              closed (i.e., all the constraints defining them are
+              non-strict), several analyzers and verifiers need to
+              compute on a domain of convex polyhedra that are not
+              necessarily closed (NNC). The usual approach to
+              implementing NNC polyhedra is to embed them into closed
+              polyhedra in a higher dimensional vector space and reuse
+              the tools and techniques already available for closed
+              polyhedra. In this work we highlight and discuss the issues
+              underlying such an embedding for those implementations that
+              are based on the \emph{double description} method, where a
+              polyhedron may be described by a system of linear
+              constraints or by a system of generating rays and points.
+              Two major achievements are the definition of a
+              theoretically clean, high-level user interface and the
+              specification of an efficient procedure for removing
+              redundancies from the descriptions of NNC polyhedra.",
+}
+
+ at Article{BagnaraHZ06STTT,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Widening Operators for Powerset Domains",
+  Journal = "Software Tools for Technology Transfer",
+  Publisher = "Springer-Verlag, Berlin",
+  Volume = 8,
+  Number = "4/5",
+  Pages = "449--466",
+  Year = 2006,
+  Note = "In the printed version of this article, all the figures
+          have been improperly printed (rendering them useless).
+          See \cite{BagnaraHZ06STTTerratum}.",
+  Abstract = "The \emph{finite powerset construction} upgrades an
+              abstract domain by allowing for the representation of
+              finite disjunctions of its elements.  While most of the
+              operations on the finite powerset abstract domain are
+              easily obtained by ``lifting'' the corresponding
+              operations on the base-level domain, the problem of
+              endowing finite powersets with a provably correct
+              widening operator is still open.  In this paper we
+              define three generic widening methodologies for the
+              finite powerset abstract domain.  The widenings are
+              obtained by lifting any widening operator defined on the
+              base-level abstract domain and are parametric with
+              respect to the specification of a few additional
+              operators that allow all the flexibility required to
+              tune the complexity/precision trade-off.  As far as we
+              know, this is the first time that the problem of
+              deriving non-trivial, provably correct widening
+              operators in a domain refinement is tackled
+              successfully.  We illustrate the proposed techniques by
+              instantiating our widening methodologies on powersets of
+              convex polyhedra, a domain for which no non-trivial
+              widening operator was previously known.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ06STTT.pdf"
+}
+
+ at Article{BagnaraHZ06STTTerratum,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Widening Operators for Powerset Domains",
+  Journal = "Software Tools for Technology Transfer",
+  Publisher = "Springer-Verlag, Berlin",
+  Volume = 9,
+  Number = "3/4",
+  Pages = "413--414",
+  Year = 2007,
+  Note = "Erratum to \cite{BagnaraHZ06STTT} containing all the figures
+          properly printed."
+}
+
+ at TechReport{BagnaraHZ06TR,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "The {Parma Polyhedra Library}: Toward a Complete Set of Numerical
+           Abstractions for the Analysis and Verification
+           of Hardware and Software Systems",
+  Number = 457,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2006,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}.
+          Also published as {\tt arXiv:cs.MS/0612085},
+          available from \url{http://arxiv.org/}.",
+  Abstract = "Since its inception as a student project in 2001,
+              initially just for the handling (as the name implies) of
+              convex polyhedra, the \emph{Parma Polyhedra Library} has
+              been continuously improved and extended by joining
+              scrupulous research on the theoretical foundations of
+              (possibly non-convex) numerical abstractions to a total
+              adherence to the best available practices in software
+              development.  Even though it is still not fully mature
+              and functionally complete, the Parma Polyhedra Library
+              already offers a combination of functionality,
+              reliability, usability and performance that is not
+              matched by similar, freely available libraries.  In this
+              paper, we present the main features of the current
+              version of the library, emphasizing those that
+              distinguish it from other similar libraries and those
+              that are important for applications in the field of
+              analysis and verification of hardware and software
+              systems.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ06TR.pdf"
+}
+
+ at TechReport{BagnaraHZ07TRa,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Applications of Polyhedral Computations to the Analysis
+           and Verification of Hardware and Software Systems",
+  Number = 458,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2007,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}.
+          Also published as {\tt arXiv:cs.CG/0701122},
+          available from \url{http://arxiv.org/}.",
+  Abstract = "Convex polyhedra are the basis for several abstractions
+              used in static analysis and computer-aided verification
+              of complex and sometimes mission critical systems. For
+              such applications, the identification of an appropriate
+              complexity-precision trade-off is a particularly acute
+              problem, so that the availability of a wide spectrum of
+              alternative solutions is mandatory.  We survey the range
+              of applications of polyhedral computations in this area;
+              give an overview of the different classes of polyhedra
+              that may be adopted; outline the main polyhedral
+              operations required by automatic analyzers and
+              verifiers; and look at some possible combinations of
+              polyhedra with other numerical abstractions that have
+              the potential to improve the precision of the analysis.
+              Areas where further theoretical investigations can
+              result in important contributions are highlighted.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ07TRa.pdf"
+}
+
+ at TechReport{BagnaraHZ07TRb,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "An Improved Tight Closure Algorithm
+           for Integer Octagonal Constraints",
+  Number = 467,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2007,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}.
+          Also published as {\tt arXiv:0705.4618v2 [cs.DS]},
+          available from \url{http://arxiv.org/}.",
+  Abstract = "Integer octagonal constraints (a.k.a.\ \emph{Unit Two
+              Variables Per Inequality} or \emph{UTVPI integer
+              constraints}) constitute an interesting class of
+              constraints for the representation and solution of
+              integer problems in the fields of constraint programming
+              and formal analysis and verification of software and
+              hardware systems, since they couple algorithms having
+              polynomial complexity with a relatively good expressive
+              power.  The main algorithms required for the
+              manipulation of such constraints are the satisfiability
+              check and the computation of the inferential closure of
+              a set of constraints.  The latter is called \emph{tight}
+              closure to mark the difference with the (incomplete)
+              closure algorithm that does not exploit the integrality
+              of the variables.  In this paper we present and fully
+              justify an $O(n^3)$ algorithm to compute the tight
+              closure of a set of UTVPI integer constraints.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ07TRb.pdf"
+}
+
+ at Inproceedings{BagnaraHZ08,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "An Improved Tight Closure Algorithm
+           for Integer Octagonal Constraints",
+  Booktitle = "Verification, Model Checking and Abstract Interpretation:
+               Proceedings of the 9th International Conference (VMCAI 2008)",
+  Address = "San Francisco, USA",
+  Editor = "F. Logozzo and D. Peled and L. Zuck",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4905,
+  ISBN = "3-540-78162-2",
+  Year = 2008,
+  Pages = "8--21",
+  Abstract = "Integer octagonal constraints(a.k.a.\ \emph{Unit Two
+              Variables Per Inequality} or \emph{UTVPI integer
+              constraints}) constitute an interesting class of
+              constraints for the representation and solution of
+              integer problems in the fields of constraint programming
+              and formal analysis and verification of software and
+              hardware systems, since they couple algorithms having
+              polynomial complexity with a relatively good expressive
+              power.  The main algorithms required for the
+              manipulation of such constraints are the satisfiability
+              check and the computation of the inferential closure of
+              a set of constraints.  The latter is called \emph{tight}
+              closure to mark the difference with the (incomplete)
+              closure algorithm that does not exploit the integrality
+              of the variables.  In this paper we present and fully
+              justify an $O(n^3)$ algorithm to compute the tight
+              closure of a set of UTVPI integer constraints.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ08.pdf"
+}
+
+ at Article{BagnaraHZ08SCP,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "The {Parma Polyhedra Library}: Toward a Complete Set of Numerical
+           Abstractions for the Analysis and Verification
+           of Hardware and Software Systems",
+  Journal = "Science of Computer Programming",
+  Volume = 72,
+  Number = "1--2",
+  Pages = "3--21",
+  Publisher = "Elsevier",
+  Year = 2008,
+  Abstract = "Since its inception as a student project in 2001,
+              initially just for the handling (as the name implies) of
+              convex polyhedra, the \emph{Parma Polyhedra Library} has
+              been continuously improved and extended by joining
+              scrupulous research on the theoretical foundations
+              of (possibly non-convex) numerical abstractions to a
+              total adherence to the best available practices in
+              software development.  Even though it is still not
+              fully mature and functionally complete, the Parma
+              Polyhedra Library already offers a combination of
+              functionality, reliability, usability and performance
+              that is not matched by similar, freely available
+              libraries.  In this paper, we present the main features
+              of the current version of the library, emphasizing those
+              that distinguish it from other similar libraries and
+              those that are important for applications in the field
+              of analysis and verification of hardware and software
+              systems.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ08SCP.pdf"
+}
+
+ at Article{BagnaraHZ10CGTA,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Exact Join Detection for Convex Polyhedra
+           and Other Numerical Abstractions",
+  Journal = "Computational Geometry: Theory and Applications",
+  Volume = 43,
+  Number = 5,
+  Pages = "453--473",
+  Publisher = "Elsevier",
+  Year = 2010,
+  Abstract = "Deciding whether the union of two convex polyhedra is
+              itself a convex polyhedron is a basic problem in
+              polyhedral computations; having important applications
+              in the field of constrained control and in the
+              synthesis, analysis, verification and optimization of
+              hardware and software systems.  In such application
+              fields though, general convex polyhedra are just one
+              among many, so-called, \emph{numerical abstractions},
+              which range from restricted families of (not necessarily
+              closed) convex polyhedra to non-convex geometrical
+              objects.  We thus tackle the problem from an abstract
+              point of view: for a wide range of numerical
+              abstractions that can be modeled as bounded
+              join-semilattices ---that is, partial orders where any
+              finite set of elements has a least upper bound---, we
+              show necessary and sufficient conditions for the
+              equivalence between the lattice-theoretic join and the
+              set-theoretic union.  For the case of closed convex
+              polyhedra ---which, as far as we know, is the only one
+              already studied in the literature--- we improve upon the
+              state-of-the-art by providing a new algorithm with a
+              better worst-case complexity.  The results and
+              algorithms presented for the other numerical
+              abstractions are new to this paper.  All the algorithms
+              have been implemented, experimentally validated, and
+              made available in the Parma Polyhedra Library.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ10CGTA.pdf"
+}
+
+ at Article{BagnaraHZ09TCS,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Applications of Polyhedral Computations to the Analysis
+           and Verification of Hardware and Software Systems",
+  Journal = "Theoretical Computer Science",
+  Volume = 410,
+  Number = 46,
+  Pages = "4672--4691",
+  Publisher = "Elsevier",
+  Year = 2009,
+  Abstract = "Convex polyhedra are the basis for several abstractions
+              used in static analysis and computer-aided verification
+              of complex and sometimes mission critical systems. For
+              such applications, the identification of an appropriate
+              complexity-precision trade-off is a particularly acute
+              problem, so that the availability of a wide spectrum of
+              alternative solutions is mandatory.  We survey the range
+              of applications of polyhedral computations in this area;
+              give an overview of the different classes of polyhedra
+              that may be adopted; outline the main polyhedral
+              operations required by automatic analyzers and
+              verifiers; and look at some possible combinations of
+              polyhedra with other numerical abstractions that have
+              the potential to improve the precision of the analysis.
+              Areas where further theoretical investigations can
+              result in important contributions are highlighted.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09TCS.pdf"
+}
+
+ at Article{BagnaraHZ09FMSD,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Weakly-Relational Shapes for Numeric Abstractions: Improved
+           Algorithms and Proofs of Correctness",
+  Journal = "Formal Methods in System Design",
+  Volume = 35,
+  Number = 3,
+  Publisher = "Springer-Verlag, Berlin",
+  Year = 2009,
+  Pages = "279--323",
+  Abstract = "Weakly-relational numeric constraints provide a
+              compromise between complexity and expressivity that is
+              adequate for several applications in the field of formal
+              analysis and verification of software and hardware systems.
+              We address the problems to be solved for the construction
+              of full-fledged, efficient and provably correct abstract
+              domains based on such constraints. We first propose to work
+              with \emph{semantic} abstract domains, whose elements are
+              \emph{geometric shapes}, instead of the (more concrete)
+              syntactic abstract domains of constraint networks and
+              matrices on which the previous proposals are based.
+              This allows to solve, once and for all, the problem whereby
+              \emph{closure by entailment}, a crucial operation for the
+              realization of such domains, seemed to impede the
+              realization of proper widening operators. In our approach,
+              the implementation of widenings relies on the availability
+              of an effective reduction procedure for the considered
+              constraint description: one for the domain of \emph{bounded
+              difference shapes} already exists in the literature; we
+              provide algorithms for the significantly more complex cases
+              of rational and integer \emph{octagonal shapes}.
+              We also improve upon the state-of-the-art by presenting,
+              along with their proof of correctness, closure by entailment
+              algorithms of reduced complexity for domains based on
+              rational and integer octagonal constraints.
+              The consequences of implementing weakly-relational numerical
+              domains with floating point numbers are also discussed.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09FMSD.pdf"
+}
+
+ at Techreport{BagnaraHZ09TRa,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Exact Join Detection for Convex Polyhedra
+           and Other Numerical Abstractions",
+  Number = 492,
+  Type = "Quaderno",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Year = 2009,
+  Note = "Available at \url{http://www.cs.unipr.it/Publications/}.  A
+          corrected and improved version (corrected an error in the
+          statement of condition (3) of Theorem~3.6, typos corrected
+          in statement and proof of Theorem~6.8) has been published
+          in \cite{BagnaraHZ09TRb}.",
+  Abstract = "Deciding whether the union of two convex polyhedra is a
+              convex polyhedron is a basic problem in polyhedral
+              computation having important applications in the field
+              of constrained control and in the synthesis, analysis,
+              verification and optimization of hardware and software
+              systems.  In these application fields, though, general
+              convex polyhedra are only one among many so-called
+              \emph{numerical abstractions}: these range from
+              restricted families of (not necessarily closed) convex
+              polyhedra to non-convex geometrical objects.  We thus
+              tackle the problem from an abstract point of view: for a
+              wide range of numerical abstractions that can be modeled
+              as bounded join-semilattices ---that is, partial orders
+              where any finite set of elements has a least upper
+              bound---, we show necessary and sufficient conditions
+              for the equivalence between the lattice-theoretic join
+              and the set-theoretic union.  For the case of closed
+              convex polyhedra ---which, as far as we know, is the
+              only one already studied in the literature--- we improve
+              upon the state-of-the-art by providing a new algorithm
+              with a better worst-case complexity.  The results and
+              algorithms presented for the other numerical
+              abstractions are new to this paper.  All the algorithms
+              have been implemented, experimentally validated, and
+              made available in the Parma Polyhedra Library.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09TRa.pdf"
+}
+
+ at Misc{BagnaraHZ09TRb,
+  Author = "R. Bagnara and P. M. Hill and E. Zaffanella",
+  Title = "Exact Join Detection for Convex Polyhedra
+           and Other Numerical Abstractions",
+  Howpublished = "Report {\tt arXiv:cs.CG/0904.1783}",
+  Year = 2009,
+  Note = "Available at \url{http://arxiv.org/}
+          and \url{http://bugseng.com/products/ppl/}",
+  Abstract = "Deciding whether the union of two convex polyhedra is
+              itself a convex polyhedron is a basic problem in
+              polyhedral computations; having important applications
+              in the field of constrained control and in the
+              synthesis, analysis, verification and optimization of
+              hardware and software systems.  In such application
+              fields though, general convex polyhedra are just one
+              among many, so-called, \emph{numerical abstractions},
+              which range from restricted families of (not necessarily
+              closed) convex polyhedra to non-convex geometrical
+              objects.  We thus tackle the problem from an abstract
+              point of view: for a wide range of numerical
+              abstractions that can be modeled as bounded
+              join-semilattices ---that is, partial orders where any
+              finite set of elements has a least upper bound---, we
+              show necessary and sufficient conditions for the
+              equivalence between the lattice-theoretic join and the
+              set-theoretic union.  For the case of closed convex
+              polyhedra ---which, as far as we know, is the only one
+              already studied in the literature--- we improve upon the
+              state-of-the-art by providing a new algorithm with a
+              better worst-case complexity.  The results and
+              algorithms presented for the other numerical
+              abstractions are new to this paper.  All the algorithms
+              have been implemented, experimentally validated, and
+              made available in the Parma Polyhedra Library.",
+  URL = "http://bugseng.com/products/ppl/documentation/BagnaraHZ09TRb.pdf"
+}
+
+ at InProceedings{BalasundaramK89,
+  Author = "V. Balasundaram and K. Kennedy",
+  Title = "A Technique for Summarizing Data Access
+           and Its Use in Parallelism Enhancing Transformations",
+  Booktitle = "Proceedings of the ACM SIGPLAN'89 Conference
+               on Programming Language Design and Implementation (PLDI)",
+  Address = "Portland, Oregon, USA",
+  Editor = "B. Knobe",
+  Series = "ACM SIGPLAN Notices",
+  Volume = "24(7)",
+  Publisher = "ACM Press",
+  Year = 1989,
+  Pages = "41--53",
+}
+
+ at Techreport{BemporadFT00TR,
+  Author = "A. Bemporad and K. Fukuda and F. D. Torrisi",
+  Title = "Convexity Recognition of the Union of Polyhedra",
+  Number = "AUT00-13",
+  Type = "Report",
+  Institution = "Automatic Control Laboratory, ETHZ",
+  Address = "Zurich, Switzerland",
+  Year = 2000,
+  Abstract = "In this paper we consider the following basic problem in
+              polyhedral computation: Given two polyhedra in $R^d$,
+              $P$ and $Q$, decide whether their union is convex, and,
+              if so, compute it. We consider the three natural
+              specializations of the problem: (1) when the polyhedra are
+              given by half-spaces (H-polyhedra) (2) when they are given
+              by vertices and extreme rays (V-polyhedra) (3) when both
+              H- and V-polyhedral representations are available. Both the
+              bounded (polytopes) and the unbounded case are considered.
+              We show that the first two problems are polynomially solvable,
+              and that the third problem is strongly-polynomially solvable.",
+  URL = "http://control.ee.ethz.ch/index.cgi?page=publications;action=details;id=62"
+}
+
+ at Article{BemporadFT01,
+  Author = "A. Bemporad and K. Fukuda and F. D. Torrisi",
+  Title = "Convexity Recognition of the Union of Polyhedra",
+  Journal = "Computational Geometry: Theory and Applications",
+  Volume = 18,
+  Number = 3,
+  Publisher = "Elsevier",
+  Year = 2001,
+  ISSN = "0925-7721",
+  Pages = "141--154",
+  Abstract = "In this paper we consider the following basic problem in
+              polyhedral computation: Given two polyhedra in $R^d$,
+              $P$ and $Q$, decide whether their union is convex, and,
+              if so, compute it. We consider the three natural
+              specializations of the problem: (1) when the polyhedra are
+              given by halfspaces (H-polyhedra), (2) when they are given
+              by vertices and extreme rays (V-polyhedra), and (3) when both
+              H- and V-polyhedral representations are available. Both the
+              bounded (polytopes) and the unbounded case are considered.
+              We show that the first two problems are polynomially solvable,
+              and that the third problem is strongly-polynomially solvable.",
+}
+
+ at Inproceedings{BenerecettiFM11,
+  Author = "M. Benerecetti and M. Faella and S. Minopoli",
+  Title = "Towards Efficient Exact Synthesis for Linear Hybrid Systems",
+  Booktitle = "Proceedings of 2nd International Symposium on Games,
+               Automata, Logics and Formal Verification (GandALF 2011)",
+  Address = "Minori, Amalfi Coast, Italy",
+  Series = "Electronic Proceedings in Theoretical Computer Science",
+  Volume = 54,
+  Pages = "263--277",
+  Year = 2011,
+  Abstract = "We study the problem of automatically computing the
+              controllable region of a Linear Hybrid Automaton, with
+              respect to a safety objective. We describe the
+              techniques that are needed to effectively and
+              efficiently implement a recently-proposed solution
+              procedure, based on polyhedral abstractions of the state
+              space. Supporting experimental results are presented,
+              based on an implementation of the proposed techniques on
+              top of the tool PHAVer."
+}
+
+ at Article{BenerecettiFM13,
+  Author = "M. Benerecetti and M. Faella and S. Minopoli",
+  Title = "Automatic Synthesis of Switching Controllers for Linear Hybrid Systems: Safety Control",
+  Journal = "Theoretical Computer Science",
+  Volume = 493,
+  Pages = "116--138",
+  Publisher = "Elsevier",
+  Year = 2013,
+  Abstract = "In this paper we study the problem of automatically
+              generating switching controllers for the class of Linear
+              Hybrid Automata, with respect to safety
+              objectives. While the same problem has been already
+              considered in the literature, no sound and complete
+              solution has been provided so far. We identify and solve
+              inaccuracies contained in previous characterizations of
+              the problem, providing a sound and complete symbolic
+              fixpoint procedure to compute the set of states from
+              which a controller can keep the system in a given set of
+              desired states. While the overall procedure may not
+              terminate, we prove the termination of each iteration,
+              thus paving the way to an effective implementation.  The
+              techniques needed to effectively and efficiently
+              implement the proposed solution procedure, based on
+              polyhedral abstractions of the state space, are
+              thoroughly illustrated and discussed. Finally, some
+              supporting and promising experimental results, based on
+              the implementation of the proposed techniques on top of
+              the tool PHAVer, are presented."
+}
+
+ at InProceedings{BessonJT99,
+  Author = "F. Besson and T. P. Jensen and J.-P. Talpin",
+  Title = "Polyhedral Analysis for Synchronous Languages",
+  Booktitle = "Static Analysis:
+               Proceedings of the 6th International Symposium",
+  Address = "Venice, Italy",
+  Editor = "A. Cortesi and G. Fil\'e",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 1694,
+  ISBN = "3-540-66459-9",
+  Year = 1999,
+  Pages = "51--68",
+  Abstract = "We define an operational semantics for the \textsc{Signal}
+              language and design an analysis which allows to verify
+              properties pertaining to the relation between values of
+              the numeric and boolean variables of a reactive
+              system. A distinguished feature of the analysis is that
+              it is expressed and proved correct with respect to the
+              source program rather than on an intermediate
+              representation of the program. The analysis calculates a
+              safe approximation to the set of reachable states by a
+              symbolic fixed point computation in the domain of convex
+              polyhedra using a novel widening operator based on the
+              convex hull representation of polyhedra."
+}
+
+ at InProceedings{BjorndalenA05,
+  Author = "J. M. Bj{\o}rndalen and O. Anshus",
+  Title = "Lessons Learned in Benchmarking
+           --- {Floating} Point Benchmarks: Can You Trust Them?",
+  Booktitle = "Proceedings of the \emph{Norsk informatikkonferanse 2005}
+              (NIK 2005)",
+  Address = "Bergen, Norway",
+  Publisher = "Tapir Akademisk Forlag",
+  ISBN = "82-519-2081-7",
+  Year = 2005,
+  Pages = "89--100",
+  Abstract = "Benchmarks are important tools for understanding the
+              implication of design choices for systems, and for
+              studying increasingly complex hardware architectures and
+              software systems.  One of the assumptions for
+              benchmarking within systems research seems to be that
+              the execution time of floating point operations do not
+              change much with different input values. We report on a
+              problem where a textbook benchmark showed significant
+              variation in execution time depending on the input
+              values, and how a small fraction of \emph{denormalized}
+              floating point values (a representation automatically
+              used by the CPU to represent values close to zero) in
+              the benchmark could lead to the wrong conclusions about
+              the relative efficiency of PowerPC and Intel P4
+              machines. Furthermore, a parallel version of the same
+              benchmark is demonstrated to incorrectly indicate
+              scalability problems in the application or communication
+              subsystem.  There is significant overhead in handling
+              these exceptions on-chip on modern Intel hardware, even
+              if the program can continue uninterrupted. We have
+              observed that the execution time of benchmarks can
+              increase by up to two orders of magnitude. In one
+              benchmark, 3.88\% denormalized numbers in a matrix
+              slowed down the benchmark by a factor 3.83.  We suggest
+              some remedies and guidelines for avoiding the problem.",
+  URL = "http://www.cs.uit.no/~johnm/publications/pdf/bjorndalen2005lessons.pdf"
+}
+
+ at InCollection{BlanchetCCFMMMR02,
+  Author = "B. Blanchet and P. Cousot and R. Cousot and J. Feret
+            and L. Mauborgne and A. Min\'e and D. Monniaux
+            and X. Rival",
+  Title = "Design and Implementation of a Special-Purpose Static Program
+           Analyzer for Safety-Critical Real-Time Embedded Software",
+  Booktitle = "The Essence of Computation, Complexity, Analysis,
+               Transformation.  Essays Dedicated to Neil D. Jones
+               [on occasion of his 60th birthday]",
+  Editor = "T. {\AE.} Mogensen and D. A. Schmidt and I. {Hal Sudborough}",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2566,
+  ISBN = "3-540-00326-6",
+  Year = 2002,
+  Pages = "85--108",
+  Abstract = "We report on a successful preliminary experience in the design
+              and implementation of a special-purpose Abstract Interpretation
+              based static program analyzer for the verification of safety
+              critical embedded real-time software.
+              The analyzer is both precise (zero false alarm in the considered
+              experiment) and efficient (less than one minute of analysis for
+              10,000 lines of code).
+              Even if it is based on a simple interval analysis, many
+              features have been added to obtain the desired precision:
+              expansion of small arrays, widening with several thresholds,
+              loop unrolling, trace partitioning, relations between loop
+              counters and other variables. The efficiency of the tool mainly
+              comes from a clever representation of abstract environments
+              based on balanced binary search trees."
+}
+
+ at Article{BultanGP99,
+  Author = "T. Bultan and R. Gerber and W. Pugh",
+  Title = "Model-Checking Concurrent Systems with Unbounded Integer
+           Variables: Symbolic Representations, Approximations, and
+           Experimental Results",
+  Journal = "ACM Transactions on Programming Languages and Systems",
+  Volume = 21,
+  Number = 4,
+  Publisher = "ACM Press",
+  Year = 1999,
+  ISSN = "0164-0925",
+  Pages = "747--789",
+  Abstract = "Model checking is a powerful technique for analyzing
+              large, finite-state systems. In an infinite state
+              system, however, many basic properties are
+              undecidable. In this article, we present a new symbolic
+              model checker which conservatively evaluates safety and
+              liveness properties on programs with unbounded integer
+              variables. We use Presburger formulas to symbolically
+              encode a program's transition system, as well as its
+              model-checking computations. All fixpoint calculations
+              are executed symbolically, and their convergence is
+              guaranteed by using approximation techniques. We
+              demonstrate the promise of this technology on some
+              well-known infinite-state concurrency problems.",
+  URL = "http://www.cs.ucsb.edu/~bultan/publications/toplas.ps"
+}
+
+ at Article{Chernikova64,
+  Author = "N. V. Chernikova",
+  Title = "Algorithm for Finding a General Formula for the Non-Negative
+           Solutions of System of Linear Equations",
+  Journal = "U.S.S.R. Computational Mathematics and Mathematical Physics",
+  Publisher = "MAIK NAUKA/Interperiodica Publishing, Moscow",
+  Volume = 4,
+  Number = 4,
+  Pages = "151--158",
+  Year = 1964
+}
+
+ at Article{Chernikova65,
+  Author = "N. V. Chernikova",
+  Title = "Algorithm for Finding a General Formula for the Non-Negative
+           Solutions of System of Linear Inequalities",
+  Journal = "U.S.S.R. Computational Mathematics and Mathematical Physics",
+  Publisher = "MAIK NAUKA/Interperiodica Publishing, Moscow",
+  Volume = 5,
+  Number = 2,
+  Pages = "228--233",
+  Year = 1965,
+  Abstract = "The present note proposes a computational scheme
+              for finding a general formula for the non-negative
+              solutions of a system of linear inequalities
+              analogous to the scheme described in \cite{Chernikova64}
+              for finding a general formula for the non-negative
+              solutions of a system of linear equations."
+}
+
+ at Article{Chernikova68,
+  Author = "N. V. Chernikova",
+  Title = "Algorithm for Discovering the Set of all Solutions
+           of a Linear Programming Problem",
+  Journal = "U.S.S.R. Computational Mathematics and Mathematical Physics",
+  Publisher = "MAIK NAUKA/Interperiodica Publishing, Moscow",
+  Volume = 8,
+  Number = 6,
+  Pages = "282--293",
+  Year = 1968,
+  Abstract = "In this paper two versions of a canonical algorithm for
+              discovering all the optimal solutions of a linear
+              programming problem with the condition of non-negativeness
+              of the variables are presented: the first for the case
+              of canonical notation, the second for the standard notation."
+}
+
+ at InProceedings{CousotC76,
+  Author = "P. Cousot and R. Cousot",
+  Title = "Static Determination of Dynamic Properties of Programs",
+  Booktitle = "Proceedings of the Second International
+               Symposium on Programming",
+  Editor = "B. Robinet",
+  Address = "Paris, France",
+  Publisher = "Dunod, Paris, France",
+  Pages = "106--130",
+  Year = 1976,
+  Abstract = "In high level languages, compile time type verifications are
+              usually incomplete, and dynamic coherence checks must be
+              inserted in object code. For example, in PASCAL one must
+              dynamically verify that the values assigned to subrange type
+              variables, or index expressions lie between two bounds, or
+              that pointers are not \texttt{nil}, ...
+              We present here a general algorithm allowing most of these
+              certifications to be done at compile time.",
+  URL = "http://www.di.ens.fr/~cousot/publications.www/CousotCousot-ISOP-76-Dunod-p106--130-1976.pdf"
+}
+
+ at InProceedings{CousotC79,
+  Author = "P. Cousot and R. Cousot",
+  Title = "Systematic Design of Program Analysis Frameworks",
+  Booktitle = "Proceedings of the Sixth Annual ACM
+               Symposium on Principles of Programming Languages",
+  Publisher = "ACM Press",
+  Address = "San Antonio, TX, USA",
+  Pages = "269--282",
+  Year = 1979,
+  Abstract = "Semantic analysis of programs is essential in optimizing
+              compilers and program verification systems. It encompasses
+              data flow analysis, data type determination, generation of
+              approximate invariant assertions, etc.
+              Several recent papers (among others Cousot \& Cousot[77a],
+              Graham & Wegman[76], Kam & Ullmann[76], Killdall[73],
+              Rosen[78], Tarjan[76], Wegbreit[75]) have introduced abstract
+              approaches to program analysis which are tantamount to the
+              use of a \emph{program analysis framework} $(A, t, \gamma)$
+              where $A$ is a lattice of (approximate) assertions,
+              $t$ is an (approximate) predicate transformer and
+              $\gamma$ is an often implicit function specifying the
+              meaning of the elements of $A$. This paper is devoted to
+              the systematic and correct design of program analysis
+              frameworks with respect to a formal semantics.",
+  URL = "http://www.di.ens.fr/~cousot/publications.www/CousotCousot-POPL-79-ACM-p269--282-1979.pdf"
+}
+
+ at InProceedings{CousotC92-PLILP,
+  Author = "P. Cousot and R. Cousot",
+  Title =  "Comparing the {Galois} Connection and Widening/Narrowing
+            Approaches to Abstract Interpretation",
+  Booktitle = "Proceedings of the 4th International Symposium
+               on Programming Language Implementation and Logic Programming",
+  Address = "Leuven, Belgium",
+  Editor = "M. Bruynooghe and M. Wirsing",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 631,
+  ISBN = "3-540-55844-6",
+  Pages = "269--295",
+  Year = 1992,
+  Abstract = "The use of infinite abstract domains with widening and
+              narrowing for accelerating the convergence of abstract
+              interpretations is shown to be more powerful than the Galois
+              connection approach restricted to finite lattices (or lattices
+              satisfying the chain condition).",
+  URL = "http://www.di.ens.fr/~cousot/publications.www/CousotCousot-PLILP-92-LNCS-n631-p269--295-1992.pdf"
+}
+
+ at InProceedings{CousotH78,
+  Author = "P. Cousot and N. Halbwachs",
+  Title = "Automatic Discovery of Linear Restraints Among
+           Variables of a Program",
+  Booktitle = "Conference Record of the Fifth Annual ACM
+              Symposium on Principles of Programming Languages",
+  Address = "Tucson, Arizona",
+  Publisher = "ACM Press",
+  Pages = "84--96",
+  Year = 1978,
+  Abstract = "The model of abstract interpretation of programs developed
+              by Cousot & Cousot [1976] and Cousot & Cousot [1977]
+              is applied to the static determination of linear equality
+              or inequality relations among variables of programs.",
+  URL = "http://www.di.ens.fr/~cousot/publications.www/CousotHalbwachs-POPL-78-ACM-p84--97-1978.pdf"
+}
+
+ at Book{Dantzig63,
+  Author = "G. B. Dantzig",
+  Title = "Linear Programming and Extensions",
+  Publisher = "Princeton University Press",
+  Address = "Princeton, NJ",
+  Year = 1963
+}
+
+ at Article{Feautrier88,
+  Author = "P. Feautrier",
+  Title = "Parametric Integer Programming",
+  Journal = "RAIRO Recherche Op\'erationnelle",
+  Year = 1988,
+  Volume = 22,
+  Number = 3,
+  Pages = "243--268",
+  Abstract = "When analysing computer programs (especially numerical
+              programs in which arrays are used extensively), one is
+              often confronted with integer programming problems.
+              These problems have three peculiarities:
+              feasible points are ranked according to lexicographic
+              order rather than the usual linear economic function;
+              the feasible set depends on integer parameters;
+              one is interested only in exact solutions.
+              The difficulty is somewhat alleviated by the fact that
+              problems sizes are usually quite small. In this paper we
+              show that: the classical simplex algorithm has no
+              difficulty in handling lexicographic ordering; the
+              algorithm may be executed in symbolic mode, thus giving
+              the solution of continuous parametric problems; the
+              method may be extended to problems in integers. We prove
+              that the resulting algorithm always terminate and give
+              an estimate of its complexity."
+}
+
+ at Manual{FeautrierCB07,
+  Author = "P. Feautrier and J.-F. Collard and C. Bastoul",
+  Title = "{PIP/PipLib}: A Solver for Parametric Integer Programming Problems",
+  Edition = "5.0",
+  Note = "Distributed with {PIP/PipLib} 1.4.0",
+  Month = jul,
+  Year = 2007,
+  Abstract = "This manual is for PIP and PipLib version 1.4.0, a
+              software which solves Parametric Integer Programming
+              problems. That is, PIP finds the lexicographic minimum
+              of the set of integer points which lie inside a convex
+              polyhedron, when that polyhedron depends linearly on one
+              or more integral parameters."
+}
+
+ at Misc{Fukuda98,
+  Author = "K. Fukuda",
+  Title = "Polyhedral Computation {FAQ}",
+  Howpublished = "Swiss Federal Institute of Technology,
+                 Lausanne and Zurich, Switzerland,
+                 available at
+                 \url{http://www.ifor.math.ethz.ch/~fukuda/polyfaq/polyfaq.html}",
+  Year = 1998,
+  Abstract = "This is an FAQ to answer some basic questions arising
+              from certain geometric computation in general dimensional
+              (mostly Euclidean) space. The main areas to be covered are
+              the convex hull computation of a finite point set, the
+              vertex enumeration for a convex polytope, the computation
+              of Voronoi diagram and Delaunay triangulation, in $R^d$.
+              We illustrate typical solution processes with small examples
+              and publicly available codes such as cdd+ and lrs.",
+}
+
+ at InProceedings{FukudaP96,
+  Author = "K. Fukuda and A. Prodon",
+  Title = "Double Description Method Revisited",
+  Booktitle = "Combinatorics and Computer Science,
+               8th Franco-Japanese and 4th Franco-Chinese Conference,
+               Brest, France, July 3-5, 1995, Selected Papers",
+  Editor = "M. Deza and R. Euler and Y. Manoussakis",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 1120,
+  Pages = "91--111",
+  Year = 1996,
+  ISBN = "3-540-61576-8",
+  Abstract = "The double description method is a simple and useful
+              algorithm for enumerating all extreme rays of a general
+              polyhedral cone in $R^d$, despite the fact that
+              we can hardly state any interesting theorems on its time
+              and space complexities.  In this paper, we reinvestigate
+              this method, introduce some new ideas for efficient
+              implementations, and show some empirical results indicating
+              its practicality in solving highly degenerate problems.",
+  URL = "ftp://ftp.ifor.math.ethz.ch/pub/fukuda/reports/ddrev960315.ps.gz"
+}
+
+ at InCollection{GawrilowJ00,
+  Author = "E. Gawrilow and M. Joswig",
+  Title =  "{\tt polymake}: A Framework for Analyzing Convex Polytopes",
+  Booktitle = "Polytopes - Combinatorics and Computation",
+  Editor = "G. Kalai and G. M. Ziegler",
+  Publisher = "Birkh{\"a}user",
+  Pages =  "43--74",
+  Year = 2000,
+  Abstract = "{\tt polymake} is a software tool designed for the algorithmic
+              treatment of polytopes and polyhedra. We give an overview of the
+              functionally as well as for the structure. This paper can be seen
+              as a first approximation to a {\tt polymake} handbook.
+              The tutorial starts with the very basic and ends with a few
+              {\tt polymake} applications to research problems. Then we
+              present the main features of the system including the interfaces
+              to other software products."
+}
+
+ at InProceedings{GawrilowJ01,
+  Author = "E. Gawrilow and M. Joswig",
+  Title = "{\tt polymake}: An Approach to Modular Software Design in
+           Computational Geometry",
+  Booktitle = "Proceedings of the 17th Annual Symposium on Computational
+               Geometry",
+  Organization = "ACM",
+  Address = "Medford, MA, USA",
+  Pages = "222--231",
+  Year = 2001,
+  Abstract = "{\tt polymake} is a software package designed for the study of
+              the combinatorics and the geometry of convex polytopes and
+              polyhedra. It offers access to a wide variety of algorithms and
+              tools within a common framework. As a key design feature it
+              allows to incorporate the functionality of a great variety of
+              other software packages in a modular way."
+}
+
+ at InProceedings{GopanDMDRS04,
+  Author = "D. Gopan and  F. DiMaio and N. Dor and T. W. Reps and M. Sagiv",
+  Title = "Numeric Domains with Summarized Dimensions",
+  Booktitle = "Tools and Algorithms for the Construction and Analysis
+               of Systems, 10th International Conference, TACAS 2004",
+  Address = "Barcelona, Spain",
+  Editor = "K. Jensen and A. Podelski",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2988,
+  Pages = "512--529",
+  Year = 2004,
+  ISBN = "3-540-21299-X",
+  Abstract = "We introduce a systematic approach to designing
+              summarizing abstract numeric domains from existing
+              numeric domains. Summarizing domains use summary
+              dimensions to represent potentially unbounded
+              collections of numeric objects. Such domains are of
+              benefit to analyses that verify properties of systems
+              with an unbounded number of numeric objects, such as
+              shape analysis, or systems in which the number of
+              numeric objects is bounded, but large."
+}
+
+ at InProceedings{Granger91,
+  Author = "P. Granger",
+  Title = "Static Analysis of Linear Congruence Equalities
+           among Variables of a Program",
+  Booktitle = "TAPSOFT'91: Proceedings of the International Joint Conference
+               on Theory and Practice of Software Development,
+               Volume 1: Colloquium on Trees in Algebra and Programming
+               (CAAP'91)",
+  Address = "Brighton, UK",
+  Year = 1991,
+  Editor = "S. Abramsky and T. S. E. Maibaum",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 493,
+  ISBN = "3-540-53982-4",
+  Pages = "169--192",
+  Abstract = "In this paper, a new kind of static (or semantic)
+             analysis is defined: congruence analysis, which is
+             conceived to discover the properties of the following
+             type: ``the integer valued variable $X$ is congruent to
+             $c$ modulo $m$'', where $c$ and $m$ are automatically
+             determined integers. This analysis is then related to an
+             algebraic framework and wholly characterized. Moreover,
+             we show an example how it can be useful for automatic
+             vectorization. Finally, we present some extensions of it,
+             namely its combination with the analysis of bounds, and
+             also some analysis defined when the modulus of
+             congruences is given \emph{a priori}.",
+}
+
+ at InProceedings{Granger97,
+  Author = "P. Granger",
+  Title = "Static Analyses of Congruence Properties on Rational Numbers
+           (Extended Abstract)",
+  Booktitle = "Static Analysis: Proceedings of the 4th International
+               Symposium",
+  Address = "Paris, France",
+  Year = 1997,
+  Editor = "P. {Van Hentenryck}",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 1302,
+  ISBN = "3-540-63468-1",
+  Pages = "278--292",
+  Abstract = "We present several new static analysis frameworks
+             applying to rational numbers, and more precisely,
+             designed for discovering congruence properties satisfied
+             by rational (or real) variables of programs. Two of them
+             deal with additive congruence properties and generalize
+             linear equation analysis [M. Karr, \emph{Affine
+             Relationships among Variables of a Program}, Acta
+             Informatica, 6:133--151, 1976] and congruence analysis on
+             integer numbers [P. Granger, \emph{Static Analysis of
+             Arithmetical Congruences}, International Journal of
+             Computer Mathematics, 30:165--190, 1989], [P. Granger,
+             \emph{Static Analysis of Linear Congruence Equalities
+             among Variables of a Program}, TAPSOFT'91: Proceedings of
+             the International Joint Conference on Theory and Practice
+             of Software Development, Volume 1: Colloquium on Trees in
+             Algebra and Programming (CAAP'91), Lecture Notes in
+             Computer Science, 493, pp. 169--192].  The others are
+             based on multiplicative congruence properties in the set
+             of positive rational numbers. Among other potential
+             applications, we exemplify the interest of all these
+             analyses for optimizing the representation of rational or
+             real valued variables."
+}
+
+ at Article{GoldfarbR77,
+  Author = "D. Goldfarb and J. K. Reid",
+  Title = "A Practical Steepest-Edge Simplex Algorithm",
+  Journal = "Mathematical Proramming",
+  Volume = 12,
+  Number = 1,
+  Pages = "361--371",
+  Year = 1977,
+  Abstract = "It is shown that suitable recurrences may be used in
+              order to implement in practice the steepest-edge simplex
+              linear programming algorithm. In this algorithm each
+              iteration is along an edge of the polytope of feasible
+              solutions on which the objective function decreases most
+              rapidly with respect to distance in the space of all the
+              variables. Results of computer comparisons on
+              medium-scale problems indicate that the resulting
+              algorithm requires less iterations but about the same
+              overall time as the algorithm of Harris [8], which may
+              be regarded as approximating the steepest-edge
+              algorithm. Both show a worthwhile advantage over the
+              standard algorithm."
+}
+
+ at PhdThesis{Halbwachs79th,
+  Author = "N. Halbwachs",
+  Title = "D\'etermination Automatique de Relations Lin\'eaires
+           V\'erifi\'ees par les Variables d'un Programme",
+  Type = "{Th\`ese de 3\textsuperscript{\`eme} cycle d'informatique}",
+  School = "Universit\'e scientifique et m\'edicale de Grenoble",
+  Address = "Grenoble, France",
+  Month = mar,
+  Year = 1979
+}
+
+ at InProceedings{Halbwachs93,
+  Author = "N. Halbwachs",
+  Title = "Delay Analysis in Synchronous Programs",
+  Pages = "333--346",
+  Booktitle = "Computer Aided Verification:
+               Proceedings of the 5th International Conference (CAV'93)",
+  Address = "Elounda, Greece",
+  Editor = "C. Courcoubetis",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 697,
+  Year = 1993,
+  ISBN = "3-540-56922-7",
+  Abstract = "Linear relation analysis [CH78, Hal79] has been proposed
+              a long time ago as an abstract interpretation which
+              permits to discover linear relations invariantly
+              satisfied by the variables of a program. Here, we
+              propose to apply this general method to variables used
+              to count delays in synchronous programs. The ``regular''
+              behavior of these counters makes the results of the
+              analysis especially precise. These results can be
+              applied to code optimization and to the verification of
+              real-time properties of programs.",
+}
+
+ at InProceedings{HalbwachsPR94,
+  Author = "N. Halbwachs and Y.-E. Proy and P. Raymond",
+  Title = "Verification of Linear Hybrid Systems
+           by Means of Convex Approximations",
+  Booktitle = "Static Analysis:
+               Proceedings of the 1st International Symposium",
+  Address = "Namur, Belgium",
+  Editor = "B. {Le Charlier}",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 864,
+  ISBN = "3-540-58485-4",
+  Pages = "223--237",
+  Year = 1994,
+  Abstract = "We present a new application of the abstract interpretation
+              by means of convex polyhedra, to a class of hybrid systems,
+              i.e., systems involving both discrete and continuous variables.
+              The result is an efficient automatic tool for approximate,
+              but conservative, verification of reachability properties
+              of these systems.",
+  URL = "http://www-verimag.imag.fr/~halbwach/hybrid.html"
+}
+
+ at Manual{HalbwachsKP95,
+  Author = "N. Halbwachs and A. Kerbrat and Y.-E. Proy",
+  Title = "{POLyhedra INtegrated Environment}",
+  Organization = "Verimag",
+  Address = "France",
+  Edition = "version 1.0 of {POLINE}",
+  Month = sep,
+  Year = 1995,
+  Note = "Documentation taken from source code.",
+}
+
+ at Article{HalbwachsPR97,
+  Author = "N. Halbwachs and Y.-E. Proy and P. Roumanoff",
+  Title = "Verification of Real-Time Systems using
+           Linear Relation Analysis",
+  Journal = "Formal Methods in System Design",
+  Publisher = "Kluwer Academic Publishers",
+  Volume = 11,
+  Number = 2,
+  Pages = "157--185",
+  Year = 1997,
+  Abstract = "Linear Relation Analysis [11] is an abstract interpretation
+              devoted to the automatic discovery of invariant linear
+              inequalities among numerical variables of a program. In this
+              paper, we apply such an analysis to the verification of
+              quantitative time properties of two kinds of systems:
+              synchronous programs and linear hybrid systems.",
+}
+
+ at Book{HenkinMT71,
+  Author = "L. Henkin and J. D. Monk and A. Tarski",
+  Title = "Cylindric Algebras: Part I",
+  Publisher = "North-Holland",
+  Address = "Amsterdam",
+  ISBN = "978-0-7204-2043-2",
+  Year = 1971,
+}
+
+ at InProceedings{HenzingerH95,
+  Author = "T. A. Henzinger and P.-H. Ho",
+  Title = "A Note on Abstract Interpretation Strategies for Hybrid Automata",
+  Booktitle = "Hybrid Systems II",
+  Editor = "P. J. Antsaklis and W. Kohn and A. Nerode and S. Sastry",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 999,
+  Pages = "252--264",
+  Year = 1995,
+  Abstract = "We report on several abstract interpretation strategies
+              that are designed to improve the performance of {\sc
+              HyTech}, a symbolic model checker for linear hybrid
+              systems. We (1) simultaneously compute the target region
+              from different directions, (2) conservatively
+              approximate the target region by dropping constraints,
+              and (3) iteratively refine the approximation until
+              sufficient precision is obtained. We consider the
+              standard abstract convex-hull operator and a novel
+              abstract extrapolation operator.",
+  URL = "http://pub.ist.ac.at/~tah/Publications/abstract-interpretation_strategies_for_hybrid_automata.html"
+}
+
+ at InProceedings{HenzingerPW01,
+  Author = "T. A. Henzinger and J. Preussig and H. Wong-Toi",
+  Title = "Some Lessons from the {\sc HyTech} Experience",
+  Booktitle = "Proceedings of the 40th Annual Conference
+               on Decision and Control",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "2887--2892",
+  Year = 2001,
+  Abstract = "We provide an overview of the current status of the tool
+              {\sc HyTech}, and reflect on some of the lessons learned
+              from our experiences with the tool. HyTech is a symbolic
+              model checker for mixed discrete-continuous systems that
+              are modeled as automata with piecewise-constant
+              polyhedral differential inclusions. The use of a formal
+              input language and automated procedures for state-space
+              traversal lay the foundation for formally verifying
+              properties of hybrid dynamical systems. We describe some
+              recent experiences analyzing three hybrid systems. We
+              point out the successes and limitations of the tool. The
+              analysis procedure has been extended in a number of ways
+              to address some of the tool's shortcomings. We evaluate
+              these extensions, and conclude with some desiderata for
+              verification tools for hybrid systems.",
+  URL = "http://pub.ist.ac.at/~tah/Publications/some_lessons_from_the_hytech_experience.html"
+}
+
+ at TechReport{HuelsbergenHL90,
+  Author = "L. Huelsbergen and D. Hahn and J. Larus",
+  Title = "Exact Dependence Analysis Using Data Access Descriptors",
+  Number = 945,
+  Institution = "Department of Computer Science, University of Wisconsin",
+  Address = "Madison",
+  Year = 1990,
+  Abstract = "\emph{Data Access Descriptors} provide a method for
+              summarizing and representing the portion of an array
+              accessed by a program statement. A Data Access
+              Descriptor does not, however, indicate if its
+              characterization is exact or conservative, nor does it
+              record the temporal order of accesses. Exactness is
+              necessary to expose maximal parallelism. Temporal
+              information is necessary to calculate \emph{direction
+              vectors} for inter-loop dependences.
+              This paper presents an extension to basic Data Access
+              Descriptors that identies exact representations. We
+              illustrate the value of extended Data Access Descriptors
+              by showing how to calculate information typically
+              provided by direction vectors and by refining potential
+              conflicts between statements with \emph{array kill}
+              information."
+}
+
+ at InProceedings{JaffarMSY94,
+  Author = "J. Jaffar and M. J. Maher and P. J. Stuckey and R. H. C. Yap",
+  Title = "Beyond Finite Domains",
+  Booktitle = "Principles and Practice of Constraint Programming:
+               Proceedings of the Second International Workshop",
+  Publisher = "Springer-Verlag, Berlin",
+  Editor = "A. Borning",
+  Address = "Rosario, Orcas Island, Washington, USA",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 874,
+  Pages = "86--94",
+  Year = 1994,
+}
+
+ at Article{KhachiyanBBEG06,
+  Author = "L. Khachiyan and E. Boros and K. Borys
+            and K. Elbassioni and V. Gurvich",
+  Title = "Generating All Vertices of a Polyhedron Is Hard",
+  Journal = "Discrete and Computational Geometry",
+  Publisher = "Springer",
+  Address = "New York",
+  Year = 2006,
+  Note = "Invited contribution.",
+  Abstract = "We show that generating all negative cycles of a
+              weighted graph is a hard enumeration problem, in both
+              the directed and undirected cases. More precisely, given
+              a family of such cycles, it is NP-complete problem to
+              decide whether this family can be extended or there is
+              no other negative directed cycles in the graph, implying
+              that directed negative cycles cannot be generated in
+              polynomial output time, unless P=NP. As a corollary, we
+              solve in the negative two well-known generating problems
+              from linear programming: (i) Given an (infeasible)
+              system of linear inequalities, generating all minimal
+              infeasible subsystems is hard. Yet, for generating
+              maximal feasible subsystems the complexity remains
+              open. (ii) Given a (feasible) system of linear
+              inequalities, generating all vertices of the
+              corresponding polyhedron is hard. Yet, in case of
+              bounded polyhedra the complexity remains open."
+}
+
+ at Inproceedings{NakanishiJPF99,
+  Author = "T. Nakanishi and K. Joe and C. D. Polychronopoulos and A. Fukuda",
+  Title = "The Modulo Interval: A Simple and Practical Representation
+           for Program Analysis",
+  Booktitle = "Proceedings of the 1999 International Conference on
+               Parallel Architectures and Compilation Techniques",
+  Address = "Newport Beach, California, USA",
+  Publisher = "IEEE Computer Society",
+  Year = 1999,
+  Pages = "91--96",
+  Abstract = "In this paper, the modulo interval, an extension of the
+              traditional interval on real numbers, and its useful
+              mathematical properties are presented as a
+              representation for program analysis Only with two
+              additional parameters to the interval on real numbers,
+              namely the modulus and the residue, the modulo interval
+              can represent information on program having cyclicity
+              such as loop indices, array subscripts etc. at
+              reasonable complexity and more accuracy. Well-defined
+              arithmetic and set operations on the modulo interval
+              make implementation of compilers simple and
+              reliable. Moreover, application of the modulo interval
+              to program analysis for parallelizing compilers is
+              discussed in this paper."
+}
+
+ at Article{NakanishiF01,
+  Author = "T. Nakanishi and A. Fukuda",
+  Title = "Modulo Interval Arithmetic and Its Application to Program Analysis",
+  Journal = "Transactions of Information Processing Society of Japan",
+  Volume = 42,
+  Number = 4,
+  Pages = "829--837",
+  Year = 2001,
+}
+
+ at Manual{NEW-POLKA-1-1-3c,
+  Author = "B. Jeannet",
+  Title = "Convex Polyhedra Library",
+  Edition = "release 1.1.3c",
+  Month = mar,
+  Year = 2002,
+  Note = "Documentation of the ``New Polka'' library.",
+}
+
+ at Article{Kuhn56,
+  Author = "H. W. Kuhn",
+  Title = "Solvability and Consistency for Linear Equations and Inequalities",
+  Journal = "American Mathematical Monthly",
+  Volume = 63,
+  Pages = "217--232",
+  Year = 1956,
+}
+
+ at TechReport{LeVerge92,
+  Author = "H. {Le Verge}",
+  Title = "A note on {Chernikova's} Algorithm",
+  Type = "\emph{Publication interne}",
+  Number = 635,
+  Institution = "IRISA",
+  Address = "Campus de Beaulieu, Rennes, France",
+  Year = 1992,
+  Abstract = "This paper describes an implementation of Chernikova's
+              algorithm for finding an irredundant set of vertices for a
+              given polyhedron defined by a set of linear inequalities and
+              equations. This algorithm can also be used for the dual
+              problem: given a set of extremal rays and vertices, find the
+              associated irredundant set of facet supporting hyperplanes.
+              The method is an extension of initial Chernikova's
+              algorithm (non negative domain), and is mainly based on the
+              polyhedral cone duality principle. A new enhancement for
+              extremal ray detection together with its effects on a class
+              of polyhedra.",
+  Source = "chernikova.c"
+}
+
+ at TechReport{LeVergeVDW94,
+  Author = "H. {Le Verge}, V. {Van Dongen} and D. K. Wilde",
+  Title = "Loop Nest Synthesis Using the Polyhedral Library",
+  Type = "\emph{Publication interne}",
+  Number = 830,
+  Institution = "IRISA",
+  Address = "Campus de Beaulieu, Rennes, France",
+  Year = 1994,
+  Abstract = "A new method to synthesis loop nests given a polyhedral
+              domain, the context domain, and the loop nesting order is
+              described.  The method is based on functions in the IRISA
+              polyhedral library."
+}
+
+ at Article{LoechnerW97,
+  Author = "V. Loechner and D. K. Wilde",
+  Title = "Parameterized Polyhedra and Their Vertices",
+  Journal = "International Journal of Parallel Programming",
+  Volume = 25,
+  Number = 6,
+  Pages = "525--549",
+  Year = 1997,
+  Abstract = "Algorithms specified for parametrically sized problems are more
+              general purpose and more reusable than algorithms for fixed sized
+              problems. For this reason, there is a need for representing and
+              symbolically analyzing linearly parameterized algorithms.
+              An important class of parallel algorithms can be described as
+              systems of parameterized affine recurrence equations (PARE).
+              In this representation, linearly parameterized polyhedra are
+              used to described the domains of variables. This paper describes
+              an algorithm which computes the set of parameterized vertices of
+              a polyhedron, given its representation as a system of
+              parameterized inequalities. This provides an important tool for
+              the symbolic analysis of the parameterized domains used to define
+              variables and computation domains in PARE's.
+              A library of operations on parameterized polyhedra based on the
+              Polyhedral Library has been written in C and is freely
+              distributed."
+}
+
+ at Misc{Loechner99,
+  Author = "V. Loechner",
+  Title = "{\it PolyLib\/}:
+           A Library for Manipulating Parameterized Polyhedra",
+  Howpublished = "Available at
+                  \url{http://icps.u-strasbg.fr/~loechner/polylib/}",
+  Year = 1999,
+  Month = mar,
+  Note = "Declares itself to be a continuation of \cite{Wilde93th}"
+}
+
+ at InProceedings{Masdupuy92,
+  Author = "F. Masdupuy",
+  Title = "Array Operations Abstraction Using Semantic Analysis
+           of Trapezoid Congruences",
+  Booktitle = "Proceedings of the 6th ACM International Conference
+               on Supercomputing",
+  Address = "Washington, DC, USA",
+  Publisher = "ACM Press",
+  Pages = "226--235",
+  Year = 1992,
+  Abstract = "With the growing use of vector supercomputers, efficient
+              and accurate data structure analyses are needed. What we
+              propose in this paper is to use the quite general
+              framework of Cousot's abstract interpretation for the
+              particular analysis of multi-dimensional array
+              indexes. While such indexes are integer tuples, a
+              relational integer analysis is first required. This
+              analysis results of a combination of existing ones that
+              are interval and congruence based. Two orthogonal
+              problems are directly concerned with the results of such
+              an analysis, that are the parallelization/vectorization
+              with the dependence analysis and the data locality
+              problem used for array storage management. After
+              introducing the analysis algorithm, this paper describes
+              on a complete example how to use it in order to optimize
+              array storage."
+}
+
+ at PhdThesis{Masdupuy93th,
+  Author = "F. Masdupuy",
+  Title = "Array Indices Relational Semantic Analysis
+           Using Rational Cosets and Trapezoids",
+  Type = "{Th\`ese d'informatique}",
+  School = "\'Ecole Polytechnique",
+  Address = "Palaiseau, France",
+  Month = dec,
+  Year = 1993,
+  Abstract = "Semantic analysis of program numerical variables
+              consists in statically and automatically discovering
+              properties verified at execution time. Different sets of
+              properties (equality, inequality and congruence
+              relations) have already been studied. This thesis
+              proposes a generalization of some of the below
+              patterns. More specifically, the abstract interpretation
+              is used to design on the one hand a set of properties
+              generalizing intervals and cosets on $\mathbbb{Z}$ and
+              on the other hand, a generalization of trapezoids and
+              linear congruence equation systems on $\mathbbb{Z}^n$.
+              A rational abstraction of these properties is defined to
+              get safe approximations, with a polynomial complexity in
+              the number of the considered variables, of the integer
+              properties operators. Those analyses, more precise than
+              the combination of the analysis they come from in
+              general, allow to dynamically choose the kind of
+              properties (inequality or congruence relations) leading
+              to relevant information for the considered program. The
+              described relationnal analysis corresponds to numerous
+              patterns encountered in the field of scientific
+              computation.  It is very well adapted to the analysis of
+              array indices variables and also to the abstract
+              description of integer arrays."
+}
+
+ at InProceedings{Mine01a,
+  Author = "A. Min\'e",
+  Title = "A New Numerical Abstract Domain Based on Difference-Bound Matrices",
+  Booktitle = "Proceedings of the 2nd Symposium on Programs as Data Objects
+               (PADO 2001)",
+  Address = "Aarhus, Denmark",
+  Editor = "O. Danvy and A. Filinski",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2053,
+  Pages = "155--172",
+  Year = 2001,
+  Abstract = "This paper presents a new numerical domain for static
+              analysis by abstract interpretation. This domain allows
+              us to represent invariants of the form and , where and
+              are variables values and is an integer or real
+              constant. Abstract elements are represented by
+              Difference-Bound Matrices, widely used by
+              model-checkers, but we had to design new operators to
+              meet the needs of abstract interpretation. The result is
+              a complete lattice of infinite height featuring
+              widening, narrowing and common transfer functions. We
+              focus on giving an efficient representation and
+              graph-based algorithms---where is the number of
+              variables---and claim that this domain always performs
+              more precisely than the well-known interval domain. To
+              illustrate the precision/cost tradeoff of this domain,
+              we have implemented simple abstract interpreters for toy
+              imperative and parallel languages which allowed us to
+              prove some non-trivial algorithms correct."
+}
+
+ at InProceedings{Mine01b,
+  Author = "A. Min\'e",
+  Title  = "The Octagon Abstract Domain",
+  Booktitle = "Proceedings of the Eighth Working Conference
+               on Reverse Engineering (WCRE'01)",
+  Address = "Stuttgart, Germany",
+  Year = 2001,
+  Publisher = "IEEE Computer Society Press",
+  Pages = "310--319",
+  Abstract = "This article presents a new numerical abstract domain
+              for static analysis by abstract interpretation. It
+              extends our previously proposed DBM-based numerical
+              abstract domain and allows us to represent invariants of
+              the form ($\pm x \pm y \leq c$), where $x$ and $y$ are
+              program variables and $c$ is a real constant. We focus
+              on giving an efficient representation based on
+              Difference-Bound Matrices---$\mathcal{O}(n^2)$ memory
+              cost, where $n$ is the number of variables---and
+              graph-based algorithms for all common abstract
+              operators---$\mathcal{O}(n^3)$ time cost. This includes
+              a normal form algorithm to test equivalence of
+              representation and a widening operator to compute least
+              fixpoint approximations."
+}
+
+ at InProceedings{Mine02,
+  Author = "A. Min\'e",
+  Title = "A Few Graph-Based Relational Numerical Abstract Domains",
+  Booktitle = "Static Analysis:
+               Proceedings of the 9th International Symposium",
+  Address = "Madrid, Spain",
+  Editor = "M. V. Hermenegildo and G. Puebla",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2477,
+  ISBN = "3-540-44235-9",
+  Pages = "117--132",
+  Year = 2002,
+  Abstract = "This article presents the systematic design of a class
+              of relational numerical abstract domains from
+              non-relational ones. Constructed domains represent sets
+              of invariants of the form $(v_j-v_i\in C)$, where vj and
+              vi are two variables, and $C$ lives in an abstraction of
+              $\mathcal{P}(\mathbb {Z})$, $\mathcal{P}(\mathbb {Q})$,
+              or $\mathcal{P}(\mathbb {R})$. We will call this family
+              of domains weakly relational domains. The underlying
+              concept allowing this construction is an extension of
+              potential graphs and shortest-path closure algorithms in
+              exotic-like algebras.  Example constructions are given
+              in order to retrieve well-known domains as well as new
+              ones. Such domains can then be used in the Abstract
+              Interpretation framework in order to design various
+              static analyses. A major benefit of this construction is
+              its modularity, allowing to quickly implement new
+              abstract domains from existing ones."
+}
+
+ at InProceedings{Mine04,
+  Author = "A. Min\'e",
+  Title = "Relational Abstract Domains for the Detection
+           of Floating-Point Run-Time Errors",
+  Booktitle = "Programming Languages and Systems: Proceedings of the 13th
+               European Symposium on Programming",
+  Address = "Barcelona, Spain",
+  Editor = "D. Schmidt",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2986,
+  ISBN = "3-540-213213-9",
+  Year = 2004,
+  Pages = "3--17",
+  Abstract = "We present a new idea to adapt relational abstract
+              domains to the analysis of IEEE 754-compliant
+              floating-point numbers in order to statically detect,
+              through Abstract Interpretation-based static analyses,
+              potential floating-point run-time exceptions such as
+              overflows or invalid operations. In order to take the
+              non-linearity of rounding into account, expressions are
+              modeled as linear forms with interval coefficients. We
+              show how to extend already existing numerical abstract
+              domains, such as the octagon abstract domain, to
+              efficiently abstract transfer functions based on
+              interval linear forms. We discuss specific fixpoint
+              stabilization techniques and give some experimental
+              results."
+}
+
+ at PhdThesis{Mine05th,
+  Author = "A. Min\'e",
+  Title  = "Weakly Relational Numerical Abstract Domains",
+  School = "\'Ecole Polytechnique",
+  Address = "Paris, France",
+  Month = mar,
+  Year   = 2005,
+  Abstract = "The goal of this thesis is to design techniques related
+              to the automatic analysis of computer programs. One major
+              application is the creation of tools to discover bugs
+              before they actually happen, an important goal in a time
+              when critical yet complex tasks are performed by computers.
+              We will work in the Abstract Interpretation framework, a
+              theory of sound approximations of program semantics. We
+              will focus, in particular, on numerical abstract domains
+              that specialise in the automatic discovery of properties
+              of the numerical variables of programs. In this thesis,
+              we introduce new numerical abstract domains: the zone
+              abstract domain (that can discover invariants of the form
+              $X - Y \leq c$), the zone congruence domain
+              ($X \equiv Y + a [b]$), and the octagon domain
+              ($\pm X \pm Y \leq c$), among others. These domains rely
+              on the classical notions of potential graphs, difference
+              bound matrices, and algorithms for the shortest-path
+              closure computation. They are in-between, in terms of
+              cost and precision, between nonrelational domains (such
+              as the interval domain), that are very imprecise, and
+              classical relational domains (such as the polyhedron
+              domain), that are very costly. We will call them ``weakly
+              relational''. We also introduce some methods to apply
+              relational domains to the analysis of floating-point
+              numbers, which was previously only possible using
+              imprecise, non-relational, domains. Finally, we introduce
+              the so-called linearisation and symbolic constant
+              propagation generic symbolic methods to enhance the
+              precision of any numerical domain, for only a slight
+              increase in cost. The techniques presented in this thesis
+              have been integrated within Astr\'ee, an analyser for
+              critical embedded avionic software, and were instrumental
+              in proving the absence of run-time errors in fly-by-wire
+              softwares used in Airbus A340 and A380 planes. Experimental
+              results show the usability of our methods of real-life
+              applications.",
+}
+
+ at InCollection{MotzkinRTT53,
+  Author = "T. S. Motzkin and H. Raiffa and G. L. Thompson and R. M. Thrall",
+  Title = "The Double Description Method",
+  Booktitle = "Contributions to the Theory of Games -- Volume II",
+  Editor = "H. W. Kuhn and A. W. Tucker",
+  Series = "Annals of Mathematics Studies",
+  Number = 28,
+  Publisher = "Princeton University Press",
+  Address = "Princeton, New Jersey",
+  Year = 1953,
+  Pages = "51--73",
+  Abstract = "The purpose of this paper is to present a computational
+              method for the determination of the value and of all
+              solutions of a two-person zero-sum game with a finite
+              number of pure strategies, and for the solution of
+              general finite systems of linear inequalities and
+              corresponding maximization problems."
+}
+
+ at InProceedings{NelsonO77,
+  Author = "G. Nelson and D. C. Oppen",
+  Title = "Fast Decision Algorithms based on {Union} and {Find}",
+  Booktitle = "Proceedings of the 18th Annual Symposium on Foundations
+               of Computer Science (FOCS'77)",
+  Address = "Providence, RI, USA",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "114--119",
+  Year = 1977,
+  Note = "The journal version of this paper is \cite{NelsonO80}"
+}
+
+ at Article{NelsonO80,
+  Author = "G. Nelson and D. C. Oppen",
+  Title = "Fast Decision Procedures Based on Congruence Closure",
+  Journal = "Journal of the ACM",
+  Publisher = "ACM Press",
+  Volume = 27,
+  Number = 2,
+  Pages = "356--364",
+  Year = 1980,
+  Note = "An earlier version of this paper is \cite{NelsonO77}",
+  Abstract = "The notion of the congruence closure of a relation on a
+              graph is defined and several algorithms for computing
+              it are surveyed. A simple proof is given that the
+              congruence closure algorithm provides a decision
+              procedure for the quantifier-free theory of equality. A
+              decision procedure is then given for the
+              quantifier-free theory of LISP list structure based on
+              the congruence closure algorithm. Both decision
+              procedures determine the satisfiability of a
+              conjunction of literals of length n in average time
+              $O(n \log n)$ using the fastest known congruence closure
+              algorithm. It is also shown that if the axiomatization
+              of the theory of list structure is changed slightly,
+              the problem of determining the satisfiability of a
+              conjunction of literals becomes NP-complete. The
+              decision procedures have been implemented in the
+              authors' simplifier for the Stanford Pascal Verifier."
+}
+
+ at Book{NemhauserW88,
+  Author = "G. L. Nemhauser and L. A. Wolsey",
+  Title = "Integer and Combinatorial Optimization",
+  Publisher = "John Wiley \& Sons",
+  Series = "Wiley Interscience Series
+            in Discrete Mathematics and Optimization",
+  Year = 1988
+}
+
+ at TechReport{NookalaR00,
+  Author = "S. P. K. Nookala and T. Risset",
+  Title = "A Library for {Z}-Polyhedral Operations",
+  Type = "\emph{Publication interne}",
+  Number = 1330,
+  Institution = "IRISA",
+  Address = "Campus de Beaulieu, Rennes, France",
+  Year = 2000,
+  Abstract = "Polyhedra are commonly used for representing iteration
+              domains of loop nests with unit stride: the iteration
+              domain of a loop is associated with the set of integer
+              points contained in a polyhedron.  ${\cal Z}$-polyhedra
+              are natural extension of polyhedra, in the sense that
+              they represent iteration domains of loop nests with
+              non-unit stride (they are polyhedra intersected with
+              integral lattices). The polyhedral library (Polylib) has
+              been developed for computing on polyhedra, it is now
+              widely used in the automatic parallelization research
+              community. This report describes the implementation of
+              the extension of Polylib to ${\cal Z}$-polyhedra. We
+              describe algorithms used for computing on lattices and
+              ${\cal Z}$-polyhedra, and we provide technical
+              documentation for the ${\cal Z}$-polyhedral library
+              (data structures, functions available)."
+}
+
+ at Book{PapadimitriouS98,
+  Author = "C. H. Papadimitriou and K. Steiglitz",
+  Title = "Combinatorial Optimization: Algorithms and Complexity",
+  Edition = "Second",
+  Publisher = "Dover Publications",
+  ISBN = "0-486-40258-4",
+  Year = 1998,
+}
+
+ at Unpublished{Pratt77,
+  Author = "V. R. Pratt",
+  Title="Two Easy Theories whose Combination is Hard",
+  Note = "Memo sent to Nelson and Oppen
+          concerning a preprint of their paper \cite{NelsonO77}",
+  Month = sep,
+  Year = 1977,
+  Abstract = "We restrict attention to the validity problem for
+              unquantified disjunctions of literals (possibly negated
+              atomic formulae) over the domain of integers, or what is
+              just as good, the satisfiability problem for
+              unquantified conjunctions. When $=$ is the only
+              predicate symbol and all function symbols are left
+              uninterpreted, or when $\geq$ is the only predicate
+              symbol (taking its standard interpretation on the
+              integers) and the only terms are variables and integers,
+              then satisfiability is decidable in polynomial
+              time. However when $\geq$ and uninterpreted function
+              symbols are allowed to appear together, satisfiability
+              becomes an NP-complete problem. This combination of the
+              two theories can arise for example when reasoning about
+              arrays (the uninterpreted function symbols) and
+              subscript manipulation (where $\geq$ arises in
+              considering subscript bounds). These results are
+              unaffected by the presence of successor, which also
+              arises commonly in reasoning about subscript
+              manipulation."
+}
+
+ at Article{QuillereRW00,
+  Author = "F. Quiller{\'e} and S. V. Rajopadhye and D. Wilde",
+  Title = "Generation of Efficient Nested Loops from Polyhedra",
+  Journal = "International Journal of Parallel Programming",
+  Volume = 28,
+  Number = 5,
+  Year = 2000,
+  Pages = "469--498",
+  Abstract = "Automatic parallelization in the polyhedral model is based
+              on affine transformations from an original computation
+              domain (iteration space) to a target space-time domain,
+              often with a different transformation for each
+              variable. Code generation is an often ignored step in
+              this process that has a significant impact on the
+              quality of the final code. It involves making a
+              trade-off between code size and control code
+              simplification/optimization. Previous methods of doing
+              code generation are based on loop splitting, however
+              they have nonoptimal behavior when working on
+              parameterized programs. We present a general
+              parameterized method for code generation based on dual
+              representation of polyhedra. Our algorithm uses a simple
+              recursion on the dimensions of the domains, and enables
+              fine control over the tradeoff between code size and
+              control overhead."
+}
+
+ at TechReport{QuintonRR96,
+  Author = "P. Quinton and S. Rajopadhye and T. Risset",
+  Title = "On Manipulating {Z}-Polyhedra",
+  Year = 1996,
+  Month = jul,
+  Institution = "IRISA, Campus Universitaire de Bealieu, Rennes, France",
+  Number = 1016,
+  Abstract = "We address the problem of computation upon Z-Polyhedra
+             which are intersections of polyhedra and integral
+             lattices. We introduce a canonic representation for
+             Z-polyhedra which allow to perform comparisons and
+             transformations of Z-polyhedra with the help of a
+             computational kernal on polyhedra. This contribution is a
+             step towards the manipulation of images of polyhedra by
+             affine functions, and has application in the domain of
+             automatic parallelization and parallel VLSI synthesis.",
+}
+
+ at Article{QuintonRR97,
+  Author = "P. Quinton and S. Rajopadhye and T. Risset",
+  Title = "On Manipulating {Z}-Polyhedra Using a Canonic Representation",
+  Journal = "Parallel Processing Letters",
+  Publisher = "World Scientific Publishing Company",
+  Volume = 7,
+  Number = 2,
+  Pages = "181--194",
+  Year = 1997,
+  Abstract = "Z-Polyhedra are intersections of polyhedra and integral
+             lattices. They arise in the domain of automatic
+             parallelization and VLSI array synthesis. In this paper,
+             we address the problem of computation on Z-polyhedra.
+             We introduce a canonical representation for Z-polyhedra
+             which allows one to perform comparisons and transformations
+             of Z-polyhedra with the help of a computational kernal on
+             polyhedra.",
+}
+
+ at Inproceedings{RepsBL06,
+  Author = "T. W. Reps and G. Balakrishnan and J. Lim",
+  Title = "Intermediate-representation Recovery from Low-level Code",
+  Booktitle = "Proceedings of the 2006 ACM SIGPLAN Workshop on Partial
+               Evaluation and Semantics-based Program Manipulation",
+  Address = "Charleston, South Carolina, USA",
+  Editor = "J. Hatcliff and F. Tip",
+  Publisher = "ACM Press",
+  ISBN = "1-59593-196-1",
+  Year = 2006,
+  Pages = "100--111",
+  Abstract = "The goal of our work is to create tools that an analyst
+              can use to understand the workings of COTS
+              components, plugins, mobile code, and DLLs, as well
+              as memory snapshots of worms and virus-infected
+              code. This paper describes how static analysis
+              provides techniques that can be used to recover
+              intermediate representations that are similar to
+              those that can be created for a program written in a
+              high-level language."
+}
+
+ at MastersThesis{Ricci02th,
+  Author = "E. Ricci",
+  Title = "Rappresentazione e manipolazione di poliedri convessi
+           per l'analisi e la verifica di programmi",
+  Type = "Laurea dissertation",
+  School = "University of Parma",
+  Address = "Parma, Italy",
+  Month = jul,
+  Year = 2002,
+  Note = "In Italian",
+  URL = "http://bugseng.com/products/ppl/documentation/Ricci02th.pdf"
+}
+
+ at Inproceedings{SenS07,
+  Author = "R. Sen and Y. N. Srikant",
+  Title = "Executable Analysis using Abstract Interpretation with Circular
+           Linear Progressions",
+  Booktitle = "Proceedings of the 5th IEEE/ACM International Conference
+              on Formal Methods and Models for Co-Design (MEMOCODE 2007)",
+  Address = "Nice, France",
+  Publisher = "IEEE Computer Society Press",
+  Year = 2007,
+  Pages = "39--48",
+  Abstract = "We propose a new abstract domain for static analysis of
+              executable code. Concrete states are abstracted
+              using Circular Linear Progressions (CLPs). CLPs
+              model computations using a finite word length as is
+              seen in any real life processor. The finite
+              abstraction allows handling over-flow scenarios in a
+              natural and straight-forward manner. Abstract
+              transfer functions have been defined for a wide
+              range of operations which makes this domain easily
+              applicable for analyzing code for a wide range of
+              ISAs. CLPs combine the scalability of interval
+              domains with the discreteness of linear congruence
+              domains. We also present a novel, lightweight method
+              to track linear equality relations between static
+              objects that is used by the analysis to improve
+              precision. The analysis is efficient, the total
+              space and time overhead being quadratic in the
+              number of static objects being tracked."
+}
+
+ at Techreport{SenS07TR,
+  Author = "R. Sen and Y. N. Srikant",
+  Title = "Executable Analysis with Circular Linear Progressions",
+  Number = "IISc-CSA-TR-2007-3",
+  Institution = "Department of Computer Science and Automation,
+                 Indian Institute of Science",
+  Address = "Bangalore, India",
+  Year = 2007,
+  Abstract = "We propose a new abstract domain for static analysis of
+              executable code. Concrete state is abstracted using
+              Circular Linear Progressions (CLPs). CLPs model
+              computations using a finite word length as is seen in
+              any real life processor. The finite abstraction allows
+              handling overflow scenarios in a natural and
+              straight-forward manner. Abstract transfer functions
+              have been defined for a wide range of operations which
+              makes this domain easily applicable for analysing code
+              for a wide range of ISAs. CLPs combine the scalability
+              of interval domains with the discreteness of linear
+              congruence domains. We also present a novel, lightweight
+              method to track linear equality relations between static
+              objects that is used by the analysis to improve
+              precision. The analysis is efficient, the total space
+              and time overhead being quadratic in the number of
+              static objects being tracked."
+}
+
+ at Article{Shostak81,
+  Author = "R. E. Shostak",
+  Title = "Deciding Linear Inequalities by Computing Loop Residues",
+  Journal = "Journal of the ACM",
+  Publisher = "ACM Press",
+  Volume = 28,
+  Number = 4,
+  Pages = "769--779",
+  Year = 1981,
+  Abstract = "V.~R.~Pratt has shown that the real and integer
+              feasibility of sets of linear inequalities of the form
+              $x \leq y + c$ can be decided quickly by examining the
+              loops in certain graphs.  Pratt's method is generalized,
+              first to real feasibility of inequalities in two
+              variables and arbitrary coefficients, and ultimately to
+              real feasibility of arbitrary sets of linear
+              inequalities.  The method is well suited to applications
+              in program verification."
+}
+
+ at Book{Schrijver99,
+  Author = "A. Schrijver",
+  Title = "Theory of Linear and Integer Programming",
+  Publisher = "John Wiley \& Sons",
+  Series = "Wiley Interscience Series
+            in Discrete Mathematics and Optimization",
+  ISBN = "0-471-98232-6",
+  Year = 1999
+}
+
+ at InProceedings{SimonK07,
+  Author = "A. Simon and A. King",
+  Title = "Taming the Wrapping of Integer Arithmetic",
+  Booktitle = "Static Analysis:
+               Proceedings of the 14th International Symposium",
+  Address = "Kongens Lyngby, Denmark",
+  Editor = "H. {Riis Nielson} and G. Fil{\'e}",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4634,
+  ISBN = "978-3-540-74060-5",
+  Year = 2007,
+  Pages = "121--136",
+  Abstract = "Variables in programs are usually confined to a fixed
+              number of bits and results that require more bits
+              are truncated. Due to the use of 32-bit and 64-bit
+              variables, inadvertent overflows are rare. However,
+              a sound static analysis must reason about
+              overflowing calculations and conversions between
+              unsigned and signed integers; the latter remaining a
+              common source of subtle programming errors. Rather
+              than polluting an analysis with the low-level
+              details of modelling two's complement wrapping
+              behaviour, this paper presents a computationally
+              light-weight solution based on polyhedral analysis
+              which eliminates the need to check for wrapping when
+              evaluating most (particularly linear) assignments."
+}
+
+ at Article{Srivastava93,
+  Author = "D. Srivastava",
+  Title = "Subsumption and Indexing in Constraint Query Languages
+           with Linear Arithmetic Constraints",
+  Journal = "Annals of Mathematics and Artificial Intelligence",
+  Volume = 8,
+  Number = "3--4",
+  Pages = "315--343",
+  Year = 1993,
+  Abstract = "Bottom-up evaluation of a program-query pair in a
+              constraint query language (CQL) starts with the facts in
+              the database and repeatedly applies the rules of the
+              program, in iterations, to compute new facts, until we
+              have reached a fixpoint.  Checking if a fixpoint has
+              been reached amounts to checking if any ``new'' facts
+              were computed in an iteration.  Such a check also
+              enhances efficiency in that subsumed facts can be
+              discarded, and not be used to make any further
+              derivations in subsequent iterations, if we use
+              Semi-naive evaluation.
+              We show that the problem of subsumption in CQLs with
+              linear arithmetic constraints is co-NP complete, and
+              present a deterministic algorithm, based on the divide
+              and conquer strategy, for this problem.  We also
+              identify polynomial-time sufficient conditions for
+              subsumption and non-subsumption in CQLs with linear
+              arithmetic constraints.  We adapt indexing strategies
+              from spatial databases for efficiently indexing facts in
+              such a CQL: such indexing is crucial for performance in
+              the presence of large databases.  Based on a recent
+              algorithm by Lassez and Lassez [LL] for quantifier
+              elimination, we present an incremental version of the
+              algorithm to check for subsumption in CQLs with linear
+              arithmetic constraints.",
+  URL = "http://www.research.att.com/~divesh/papers/s93-cqlsubsum-journal.ps"
+}
+
+ at Book{StoerW70,
+  Author = "J. Stoer and C. Witzgall",
+  Title = "Convexity and Optimization in Finite Dimensions {I}",
+  Publisher = "Springer-Verlag, Berlin",
+  Year = 1970
+}
+
+ at Book{Warren03,
+ Author = "Warren, Jr., H. S.",
+ Title = "Hacker's Delight",
+ Publisher = "Addison-Wesley Longman Publishing Co., Inc.",
+ Address = "Boston, MA, USA",
+ Year = 2003,
+ ISBN = "0-201-91465-4",
+ }
+
+ at MastersThesis{Wilde93th,
+  Author = "D. K. Wilde",
+  Title = "A Library for Doing Polyhedral Operations",
+  Type = "{Master's thesis}",
+  School = "Oregon State University",
+  Address = "Corvallis, Oregon",
+  Month = dec,
+  Year = 1993,
+  Note = "Also published as IRISA \emph{Publication interne} 785,
+          Rennes, France, 1993",
+  Abstract = "Polyhedra are geometric representations of linear
+              systems of equations and inequalities.  Since polyhedra
+              are used to represent the iteration domains of nested
+              loop programs, procedures for operating on polyhedra are
+              useful for doing loop transformations and other program
+              restructuring transformations which are needed in
+              parallelizing compilers.  Thus a need for a library of
+              polyhedral operations has recently been recognized in
+              the parallelizing compiler community.  Polyhedra are
+              also used in the definition of domains of variables in
+              systems of affine recurrence equations (SARE). {\sc
+              Alpha} is a language which is based on the SARE
+              formalism in which all variables are declared over
+              finite unions of polyhedra.  This report describes a
+              library of polyhedral functions which was developed to
+              support the {\sc Alpha} language environment, and which
+              is general enough to satisfy the needs of researchers
+              doing parallelizing compilers.  This report describes
+              the data structures used to represent domains, gives
+              motivations for the major design decisions, and presents
+              the algorithms used for doing polyhedral operations.
+              This library has been written and tested, and has been
+              in use since the beginning of 1993 by research
+              facilities in Europe and Canada.  The library is freely
+              distributed by ftp.",
+  URL = "http://www.irisa.fr/polylib/document/Polylib.ps"
+}
+
+ at Article{Weyl35,
+  Author = "H. Weyl",
+  Title = "Elementare Theorie der konvexen Polyeder",
+  Journal = "Commentarii Mathematici Helvetici",
+  Publisher = "{Birkh\"auser} Publishing Ltd., Basel, Switzerland",
+  Volume = 7,
+  Pages = "290--306",
+  Year = 1935,
+  Note = "English translation in \cite{Weyl50}"
+}
+
+ at InCollection{Weyl50,
+  Author = "H. Weyl",
+  Title = "The Elementary Theory of Convex Polyhedra",
+  Booktitle = "Contributions to the Theory of Games -- Volume I",
+  Editor = "H. W. Kuhn",
+  Series = "Annals of Mathematics Studies",
+  Number = 24,
+  Publisher = "Princeton University Press",
+  Address = "Princeton, New Jersey",
+  Year = 1950,
+  Pages = "3--18",
+  Note = "Translated from \cite{Weyl35} by H. W. Kuhn"
+}
+
+
+==============================================================================
+
+<h2>ODC Attribution License (ODC-By)</h2>
+
+### Preamble
+
+The Open Data Commons Attribution License is a license agreement
+intended to allow users to freely share, modify, and use this Database
+subject only to the attribution requirements set out in Section 4.
+
+Databases can contain a wide variety of types of content (images,
+audiovisual material, and sounds all in the same database, for example),
+and so this license only governs the rights over the Database, and not
+the contents of the Database individually. Licensors may therefore wish
+to use this license together with another license for the contents.
+
+Sometimes the contents of a database, or the database itself, can be
+covered by other rights not addressed here (such as private contracts,
+trademark over the name, or privacy rights / data protection rights
+over information in the contents), and so you are advised that you may
+have to consult other documents or clear other rights before doing
+activities not covered by this License.
+
+------
+
+The Licensor (as defined below)
+
+and
+
+You (as defined below)
+
+agree as follows:
+
+### 1.0 Definitions of Capitalised Words
+
+"Collective Database" - Means this Database in unmodified form as part
+of a collection of independent databases in themselves that together are
+assembled into a collective whole. A work that constitutes a Collective
+Database will not be considered a Derivative Database.
+
+"Convey" - As a verb, means Using the Database, a Derivative Database,
+or the Database as part of a Collective Database in any way that enables
+a Person to make or receive copies of the Database or a Derivative
+Database.  Conveying does not include interaction with a user through a
+computer network, or creating and Using a Produced Work, where no
+transfer of a copy of the Database or a Derivative Database occurs.
+
+"Contents" - The contents of this Database, which includes the
+information, independent works, or other material collected into the
+Database. For example, the contents of the Database could be factual
+data or works such as images, audiovisual material, text, or sounds.
+
+"Database" - A collection of material (the Contents) arranged in a
+systematic or methodical way and individually accessible by electronic
+or other means offered under the terms of this License.
+
+"Database Directive" - Means Directive 96/9/EC of the European
+Parliament and of the Council of 11 March 1996 on the legal protection
+of databases, as amended or succeeded.
+
+"Database Right" - Means rights resulting from the Chapter III ("sui
+generis") rights in the Database Directive (as amended and as transposed
+by member states), which includes the Extraction and Re-utilisation of
+the whole or a Substantial part of the Contents, as well as any similar
+rights available in the relevant jurisdiction under Section 10.4.
+
+"Derivative Database" - Means a database based upon the Database, and
+includes any translation, adaptation, arrangement, modification, or any
+other alteration of the Database or of a Substantial part of the
+Contents. This includes, but is not limited to, Extracting or
+Re-utilising the whole or a Substantial part of the Contents in a new
+Database.
+
+"Extraction" - Means the permanent or temporary transfer of all or a
+Substantial part of the Contents to another medium by any means or in
+any form.
+
+"License" - Means this license agreement and is both a license of rights
+such as copyright and Database Rights and an agreement in contract.
+
+"Licensor" - Means the Person that offers the Database under the terms
+of this License.
+
+"Person" - Means a natural or legal person or a body of persons
+corporate or incorporate.
+
+"Produced Work" -  a work (such as an image, audiovisual material, text,
+or sounds) resulting from using the whole or a Substantial part of the
+Contents (via a search or other query) from this Database, a Derivative
+Database, or this Database as part of a Collective Database.
+
+"Publicly" - means to Persons other than You or under Your control by
+either more than 50% ownership or by the power to direct their
+activities (such as contracting with an independent consultant).
+
+"Re-utilisation" - means any form of making available to the public all
+or a Substantial part of the Contents by the distribution of copies, by
+renting, by online or other forms of transmission.
+
+"Substantial" - Means substantial in terms of quantity or quality or a
+combination of both. The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may amount to the
+Extraction or Re-utilisation of a Substantial part of the Contents.
+
+"Use" - As a verb, means doing any act that is restricted by copyright
+or Database Rights whether in the original medium or any other; and
+includes without limitation distributing, copying, publicly performing,
+publicly displaying, and preparing derivative works of the Database, as
+well as modifying the Database as may be technically necessary to use it
+in a different mode or format.
+
+"You" - Means a Person exercising rights under this License who has not
+previously violated the terms of this License with respect to the
+Database, or who has received express permission from the Licensor to
+exercise rights under this License despite a previous violation.
+
+Words in the singular include the plural and vice versa.
+
+### 2.0 What this License covers
+
+2.1. Legal effect of this document. This License is:
+
+  a. A license of applicable copyright and neighbouring rights;
+
+  b. A license of the Database Right; and
+
+  c. An agreement in contract between You and the Licensor.
+
+2.2 Legal rights covered. This License covers the legal rights in the
+Database, including:
+
+  a. Copyright. Any copyright or neighbouring rights in the Database.
+  The copyright licensed includes any individual elements of the
+  Database, but does not cover the copyright over the Contents
+  independent of this Database. See Section 2.4 for details. Copyright
+  law varies between jurisdictions, but is likely to cover: the Database
+  model or schema, which is the structure, arrangement, and organisation
+  of the Database, and can also include the Database tables and table
+  indexes; the data entry and output sheets; and the Field names of
+  Contents stored in the Database;
+
+  b. Database Rights. Database Rights only extend to the Extraction and
+  Re-utilisation of the whole or a Substantial part of the Contents.
+  Database Rights can apply even when there is no copyright over the
+  Database. Database Rights can also apply when the Contents are removed
+  from the Database and are selected and arranged in a way that would
+  not infringe any applicable copyright; and
+
+  c. Contract. This is an agreement between You and the Licensor for
+  access to the Database. In return you agree to certain conditions of
+  use on this access as outlined in this License.
+
+2.3 Rights not covered.
+
+  a. This License does not apply to computer programs used in the making
+  or operation of the Database;
+
+  b. This License does not cover any patents over the Contents or the
+  Database; and
+
+  c. This License does not cover any trademarks associated with the
+  Database.
+
+2.4 Relationship to Contents in the Database. The individual items of
+the Contents contained in this Database may be covered by other rights,
+including copyright, patent, data protection, privacy, or personality
+rights, and this License does not cover any rights (other than Database
+Rights or in contract) in individual Contents contained in the Database.
+For example, if used on a Database of images (the Contents), this
+License would not apply to copyright over individual images, which could
+have their own separate licenses, or one single license covering all of
+the rights over the images.
+
+### 3.0 Rights granted
+
+3.1 Subject to the terms and conditions of this License, the Licensor
+grants to You a worldwide, royalty-free, non-exclusive, terminable (but
+only under Section 9) license to Use the Database for the duration of
+any applicable copyright and Database Rights. These rights explicitly
+include commercial use, and do not exclude any field of endeavour. To
+the extent possible in the relevant jurisdiction, these rights may be
+exercised in all media and formats whether now known or created in the
+future.
+
+The rights granted cover, for example:
+
+  a. Extraction and Re-utilisation of the whole or a Substantial part of
+  the Contents;
+
+  b. Creation of Derivative Databases;
+
+  c. Creation of Collective Databases;
+
+  d. Creation of temporary or permanent reproductions by any means and
+  in any form, in whole or in part, including of any Derivative
+  Databases or as a part of Collective Databases; and
+
+  e. Distribution, communication, display, lending, making available, or
+  performance to the public by any means and in any form, in whole or in
+  part, including of any Derivative Database or as a part of Collective
+  Databases.
+
+3.2 Compulsory license schemes. For the avoidance of doubt:
+
+  a. Non-waivable compulsory license schemes. In those jurisdictions in
+  which the right to collect royalties through any statutory or
+  compulsory licensing scheme cannot be waived, the Licensor reserves
+  the exclusive right to collect such royalties for any exercise by You
+  of the rights granted under this License;
+
+  b. Waivable compulsory license schemes. In those jurisdictions in
+  which the right to collect royalties through any statutory or
+  compulsory licensing scheme can be waived, the Licensor waives the
+  exclusive right to collect such royalties for any exercise by You of
+  the rights granted under this License; and,
+
+  c. Voluntary license schemes. The Licensor waives the right to collect
+  royalties, whether individually or, in the event that the Licensor is
+  a member of a collecting society that administers voluntary licensing
+  schemes, via that society, from any exercise by You of the rights
+  granted under this License.
+
+3.3 The right to release the Database under different terms, or to stop
+distributing or making available the Database, is reserved. Note that
+this Database may be multiple-licensed, and so You may have the choice
+of using alternative licenses for this Database. Subject to Section
+10.4, all other rights not expressly granted by Licensor are reserved.
+
+### 4.0 Conditions of Use
+
+4.1 The rights granted in Section 3 above are expressly made subject to
+Your complying with the following conditions of use. These are important
+conditions of this License, and if You fail to follow them, You will be
+in material breach of its terms.
+
+4.2 Notices. If You Publicly Convey this Database, any Derivative
+Database, or the Database as part of a Collective Database, then You
+must:
+
+  a. Do so only under the terms of this License;
+
+  b. Include a copy of this License or its Uniform Resource Identifier (URI)
+  with the Database or Derivative Database, including both in the
+  Database or Derivative Database and in any relevant documentation;
+
+  c. Keep intact any copyright or Database Right notices and notices
+  that refer to this License; and
+
+  d. If it is not possible to put the required notices in a particular
+  file due to its structure, then You must include the notices in a
+  location (such as a relevant directory) where users would be likely to
+  look for it.
+
+4.3 Notice for using output (Contents). Creating and Using a Produced
+Work does not require the notice in Section 4.2. However, if you
+Publicly Use a Produced Work, You must include a notice associated with
+the Produced Work reasonably calculated to make any Person that uses,
+views, accesses, interacts with, or is otherwise exposed to the Produced
+Work aware that Content was obtained from the Database, Derivative
+Database, or the Database as part of a Collective Database, and that it
+is available under this License.
+
+  a. Example notice. The following text will satisfy notice under
+  Section 4.3:
+
+        Contains information from DATABASE NAME which is made available
+        under the ODC Attribution License.
+
+DATABASE NAME should be replaced with the name of the Database and a
+hyperlink to the location of the Database. "ODC Attribution License"
+should contain a hyperlink to the URI of the text of this License. If
+hyperlinks are not possible, You should include the plain text of the
+required URI's with the above notice.
+
+4.4 Licensing of others. You may not sublicense the Database. Each time
+You communicate the Database, the whole or Substantial part of the
+Contents, or any Derivative Database to anyone else in any way, the
+Licensor offers to the recipient a license to the Database on the same
+terms and conditions as this License. You are not responsible for
+enforcing compliance by third parties with this License, but You may
+enforce any rights that You have over a Derivative Database. You are
+solely responsible for any modifications of a Derivative Database made
+by You or another Person at Your direction. You may not impose any
+further restrictions on the exercise of the rights granted or affirmed
+under this License.
+
+### 5.0 Moral rights
+
+5.1 Moral rights. This section covers moral rights, including any rights
+to be identified as the author of the Database or to object to treatment
+that would otherwise prejudice the author's honour and reputation, or
+any other derogatory treatment:
+
+  a. For jurisdictions allowing waiver of moral rights, Licensor waives
+  all moral rights that Licensor may have in the Database to the fullest
+  extent possible by the law of the relevant jurisdiction under Section
+  10.4;
+
+  b. If waiver of moral rights under Section 5.1 a in the relevant
+  jurisdiction is not possible, Licensor agrees not to assert any moral
+  rights over the Database and waives all claims in moral rights to the
+  fullest extent possible by the law of the relevant jurisdiction under
+  Section 10.4; and
+
+  c. For jurisdictions not allowing waiver or an agreement not to assert
+  moral rights under Section 5.1 a and b, the author may retain their
+  moral rights over certain aspects of the Database.
+
+Please note that some jurisdictions do not allow for the waiver of moral
+rights, and so moral rights may still subsist over the Database in some
+jurisdictions.
+
+### 6.0 Fair dealing, Database exceptions, and other rights not affected
+
+6.1 This License does not affect any rights that You or anyone else may
+independently have under any applicable law to make any use of this
+Database, including without limitation:
+
+  a. Exceptions to the Database Right including: Extraction of Contents
+  from non-electronic Databases for private purposes, Extraction for
+  purposes of illustration for teaching or scientific research, and
+  Extraction or Re-utilisation for public security or an administrative
+  or judicial procedure.
+
+  b. Fair dealing, fair use, or any other legally recognised limitation
+  or exception to infringement of copyright or other applicable laws.
+
+6.2 This License does not affect any rights of lawful users to Extract
+and Re-utilise insubstantial parts of the Contents, evaluated
+quantitatively or qualitatively, for any purposes whatsoever, including
+creating a Derivative Database (subject to other rights over the
+Contents, see Section 2.4). The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may however amount
+to the Extraction or Re-utilisation of a Substantial part of the
+Contents.
+
+### 7.0 Warranties and Disclaimer
+
+7.1 The Database is licensed by the Licensor "as is" and without any
+warranty of any kind, either express, implied, or arising by statute,
+custom, course of dealing, or trade usage. Licensor specifically
+disclaims any and all implied warranties or conditions of title,
+non-infringement, accuracy or completeness, the presence or absence of
+errors, fitness for a particular purpose, merchantability, or otherwise.
+Some jurisdictions do not allow the exclusion of implied warranties, so
+this exclusion may not apply to You.
+
+### 8.0 Limitation of liability
+
+8.1 Subject to any liability that may not be excluded or limited by law,
+the Licensor is not liable for, and expressly excludes, all liability
+for loss or damage however and whenever caused to anyone by any use
+under this License, whether by You or by anyone else, and whether caused
+by any fault on the part of the Licensor or not. This exclusion of
+liability includes, but is not limited to, any special, incidental,
+consequential, punitive, or exemplary damages such as loss of revenue,
+data, anticipated profits, and lost business. This exclusion applies
+even if the Licensor has been advised of the possibility of such
+damages.
+
+8.2 If liability may not be excluded by law, it is limited to actual and
+direct financial loss to the extent it is caused by proved negligence on
+the part of the Licensor.
+
+### 9.0 Termination of Your rights under this License
+
+9.1 Any breach by You of the terms and conditions of this License
+automatically terminates this License with immediate effect and without
+notice to You. For the avoidance of doubt, Persons who have received the
+Database, the whole or a Substantial part of the Contents, Derivative
+Databases, or the Database as part of a Collective Database from You
+under this License will not have their licenses terminated provided
+their use is in full compliance with this License or a license granted
+under Section 4.8 of this License.  Sections 1, 2, 7, 8, 9 and 10 will
+survive any termination of this License.
+
+9.2 If You are not in breach of the terms of this License, the Licensor
+will not terminate Your rights under it.
+
+9.3 Unless terminated under Section 9.1, this License is granted to You
+for the duration of applicable rights in the Database.
+
+9.4 Reinstatement of rights. If you cease any breach of the terms and
+conditions of this License, then your full rights under this License
+will be reinstated:
+
+  a. Provisionally and subject to permanent termination until the 60th
+  day after cessation of breach;
+
+  b. Permanently on the 60th day after cessation of breach unless
+  otherwise reasonably notified by the Licensor; or
+
+  c.  Permanently if reasonably notified by the Licensor of the
+  violation, this is the first time You have received notice of
+  violation of this License from  the Licensor, and You cure the
+  violation prior to 30 days after your receipt of the notice.
+
+9.5 Notwithstanding the above, Licensor reserves the right to release
+the Database under different license terms or to stop distributing or
+making available the Database. Releasing the Database under different
+license terms or stopping the distribution of the Database will not
+withdraw this License (or any other license that has been, or is
+required to be, granted under the terms of this License), and this
+License will continue in full force and effect unless terminated as
+stated above.
+
+### 10.0 General
+
+10.1 If any provision of this License is held to be invalid or
+unenforceable, that must not affect the validity or enforceability of
+the remainder of the terms and conditions of this License and each
+remaining provision of this License shall be valid and enforced to the
+fullest extent permitted by law.
+
+10.2 This License is the entire agreement between the parties with
+respect to the rights granted here over the Database. It replaces any
+earlier understandings, agreements or representations with respect to
+the Database.
+
+10.3 If You are in breach of the terms of this License, You will not be
+entitled to rely on the terms of this License or to complain of any
+breach by the Licensor.
+
+10.4 Choice of law. This License takes effect in and will be governed by
+the laws of the relevant jurisdiction in which the License terms are
+sought to be enforced. If the standard suite of rights granted under
+applicable copyright law and Database Rights in the relevant
+jurisdiction includes additional rights not granted under this License,
+these additional rights are granted in this License in order to meet the
+terms of this License.
diff --git a/doc/ppl.sty b/doc/ppl.sty
new file mode 100644
index 0000000..369a0bc
--- /dev/null
+++ b/doc/ppl.sty
@@ -0,0 +1,200 @@
+%% LaTeX package providing macros for typesetting the PPL manuals.
+%% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+%% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%%
+%% This file is part of the Parma Polyhedra Library (PPL).
+%%
+%% The PPL is free software; you can redistribute it and/or modify it
+%% under the terms of the GNU General Public License as published by the
+%% Free Software Foundation; either version 3 of the License, or (at your
+%% option) any later version.
+%%
+%% The PPL is distributed in the hope that it will be useful, but WITHOUT
+%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+%% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software Foundation,
+%% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%%
+%% For the most up-to-date information see the Parma Polyhedra Library
+%% site: http://bugseng.com/products/ppl/ .
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ppl}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+\RequirePackage{stmaryrd}
+
+%% Calligraphic alphabet
+\newcommand*{\cA}{\ensuremath{\mathcal{A}}}
+\newcommand*{\cB}{\ensuremath{\mathcal{B}}}
+\newcommand*{\cC}{\ensuremath{\mathcal{C}}}
+\newcommand*{\cD}{\ensuremath{\mathcal{D}}}
+\newcommand*{\cE}{\ensuremath{\mathcal{E}}}
+\newcommand*{\cF}{\ensuremath{\mathcal{F}}}
+\newcommand*{\cG}{\ensuremath{\mathcal{G}}}
+\newcommand*{\cH}{\ensuremath{\mathcal{H}}}
+\newcommand*{\cI}{\ensuremath{\mathcal{I}}}
+\newcommand*{\cJ}{\ensuremath{\mathcal{J}}}
+\newcommand*{\cK}{\ensuremath{\mathcal{K}}}
+\newcommand*{\cL}{\ensuremath{\mathcal{L}}}
+\newcommand*{\cM}{\ensuremath{\mathcal{M}}}
+\newcommand*{\cN}{\ensuremath{\mathcal{N}}}
+\newcommand*{\cO}{\ensuremath{\mathcal{O}}}
+\newcommand*{\cP}{\ensuremath{\mathcal{P}}}
+\newcommand*{\cQ}{\ensuremath{\mathcal{Q}}}
+\newcommand*{\cR}{\ensuremath{\mathcal{R}}}
+\newcommand*{\cS}{\ensuremath{\mathcal{S}}}
+\newcommand*{\cT}{\ensuremath{\mathcal{T}}}
+\newcommand*{\cU}{\ensuremath{\mathcal{U}}}
+\newcommand*{\cV}{\ensuremath{\mathcal{V}}}
+\newcommand*{\cW}{\ensuremath{\mathcal{W}}}
+\newcommand*{\cX}{\ensuremath{\mathcal{X}}}
+\newcommand*{\cY}{\ensuremath{\mathcal{Y}}}
+\newcommand*{\cZ}{\ensuremath{\mathcal{Z}}}
+
+%% Special letters denoting sets and algebras.
+\providecommand*{\Nset}{\mathbb{N}}            % Naturals
+\newcommand*{\extNset}{\mathbb{N}_\infty}      % Extended naturals
+\providecommand*{\Oset}{\mathbb{O}}            % Ordinals
+\providecommand*{\Qset}{\mathbb{Q}}            % Rationals
+\providecommand*{\Rset}{\mathbb{R}}            % Reals
+\providecommand*{\nonnegRset}{\mathbb{R}_{\scriptscriptstyle{+}}}
+                                               % Non-negative reals
+\newcommand*{\extRset}{\Rset_\infty}           % Extended reals
+\providecommand*{\Zset}{\mathbb{Z}}            % Integers
+\providecommand*{\CPset}{\mathbb{CP}}          % Closed polyhedra
+\providecommand*{\Pset}{\mathbb{P}}            % (NNC) polyhedra
+\providecommand*{\Sset}{\mathbb{S}}            % Reals or rationals
+
+%% Grid notation
+\providecommand*{\Gset}{\mathbb{G}}            % Grid
+\providecommand*{\cg}{\mathord{\mathrm{cg}}}   % Congruence
+\newcommand*{\gcon}{\mathop{\mathrm{gcon}}\nolimits}
+                                               % Grid from congruence system
+\newcommand*{\ggen}{\mathop{\mathrm{ggen}}\nolimits}
+                                               % Grid from generator system
+
+%% Function notation
+\newcommand*{\fund}[3]{\mathord{#1}\colon#2\rightarrow#3}
+\newcommand*{\pard}[3]{\mathord{#1}\colon#2\rightarrowtail#3}
+
+%% Relation notation
+\newcommand*{\reld}[3]{\mathord{#1}\subseteq#2\times#3}
+
+%% Set theory.
+\renewcommand*{\emptyset}{\mathord{\varnothing}}
+\newcommand*{\sseq}{\subseteq}
+\newcommand*{\sseqf}{\mathrel{\subseteq_\mathrm{f}}}
+\newcommand*{\sslt}{\subset}
+\newcommand*{\Sseq}{\supseteq}
+\newcommand*{\Ssgt}{\supset}
+\newcommand*{\inters}{\cap}
+\newcommand*{\setdiff}{\setminus}
+\newcommand*{\union}{\cup}
+\newcommand*{\card}{\mathop{\#}\nolimits}
+\newcommand*{\sset}[2]{{\renewcommand*{\arraystretch}{1.2}
+                      \left\{\,#1 \,\left|\,
+                               \begin{array}{@{}l@{}}#2\end{array}
+                      \right.   \,\right\}}}
+\newcommand*{\meet}{\mathbin{\otimes}}
+\newcommand*{\join}{\mathbin{\oplus}}
+
+%% Logic notation.
+\newcommand*{\entails}{\mathrel{\vdash}}
+\newcommand*{\sentails}{\mathrel{\Vdash}}
+\newcommand*{\Nentails}{\mathrel{\nvdash}}
+\newcommand*{\Nsentails}{\mathrel{\nVdash}}
+\newcommand*{\entailss}[1]{\mathrel{\vdash_{#1}}}
+\newcommand*{\Entailss}[1]{\mathrel{\dashv_{#1}}}
+\newcommand*{\sentailss}[1]{\mathrel{\Vdash_{#1}}}
+\newcommand*{\Nentailss}[1]{\mathrel{\nvdash_{#1}}}
+\newcommand*{\bigland}{\mathop{\bigwedge}\limits}
+\newcommand*{\biglor}{\mathop{\bigvee}\limits}
+\newcommand*{\piff}{\mathrel{\leftrightarrow}}
+\newcommand*{\pimplies}{\mathrel{\rightarrow}}
+\newcommand*{\pimplied}{\mathrel{\leftarrow}}
+\newcommand*{\st}{\mathrel{.}}
+\newcommand*{\itc}{\mathrel{:}}
+
+%% Integer division and reminder binary operators.
+\newcommand*{\bdiv}{\mathbin{\mathrm{div}}}
+\newcommand*{\brem}{\mathbin{\mathrm{rem}}}
+
+
+%% True and false
+\newcommand*{\false}{\mathord{\textbf{\textup{0}}}}
+\newcommand*{\true}{\mathord{\textbf{\textup{1}}}}
+
+%% Things that hold by definition.
+\newcommand*{\defrel}[1]{\mathrel{\buildrel \mathrm{def} \over {#1}}}
+\newcommand*{\defeq}{\defrel{=}}
+\newcommand*{\defiff}{\defrel{\Longleftrightarrow}}
+
+% Arbitrary relation symbol.
+\newcommand*{\relsym}{\mathrel{\bowtie}}
+\newcommand*{\relsyms}[1]{\mathrel{\bowtie_{#1}}}
+
+% Absolute value.
+\newcommand*{\abs}[1]{\lvert #1 \rvert}
+
+% Vectors.
+\renewcommand*{\vec}[1]{\mathchoice{\mbox{\boldmath$\displaystyle#1$}}
+{\mbox{\boldmath$\textstyle#1$}}
+{\mbox{\boldmath$\scriptstyle#1$}}
+{\mbox{\boldmath$\scriptscriptstyle#1$}}}
+
+\newcommand*{\vect}[1]{\vec{#1}}
+
+% Matrix functions.
+\newcommand*{\transpose}{\mathrm{T}}
+
+% Hulls.
+\newcommand*{\linearhull}{\mathop{\mathrm{linear.hull}}}
+\newcommand*{\conichull}{\mathop{\mathrm{conic.hull}}}
+\newcommand*{\affinehull}{\mathop{\mathrm{affine.hull}}}
+\newcommand*{\convexhull}{\mathop{\mathrm{convex.hull}}}
+\newcommand*{\NNChull}{\mathop{\mathrm{nnc.hull}}}
+\newcommand*{\inthull}{\mathop{\mathrm{int.hull}}}
+\newcommand*{\intaffinehull}{\mathop{\mathrm{int.affine.hull}}}
+
+% Polyhedron functions.
+\newcommand*{\prank}{\mathop{\mathrm{rank}}}
+\newcommand*{\pdim}{\mathop{\mathrm{dim}}}
+\newcommand*{\linspace}{\mathop{\mathrm{lin.space}}}
+\newcommand*{\cone}{\mathop{\mathrm{cone}}}
+
+% Widening
+\newcommand*{\widen}{\mathrel{\nabla}}
+
+% Powerset notation
+\newcommand*{\pnonredmap}{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_n}}}\nolimits}
+\newcommand*{\pnonredmapi}[1]{\mathop{\Omega^{\scriptscriptstyle\sseq}_{\scriptscriptstyle {\CPset_{#1}}}}\nolimits}
+\newcommand*{\nonredmap}{\mathop{\Omega^{\scriptscriptstyle\entails}_{\scriptscriptstyle D}}\nolimits}
+
+\newcommand*{\wpf}{\mathop{\wp_\mathrm{f}}\nolimits}
+\newcommand*{\wpfn}[2]{\mathord{\wp_\mathrm{fn}^{\scriptscriptstyle #2}}(#1)}
+
+\newcommand*{\smallP}{{\scriptscriptstyle\mathrm{P}}}
+\newcommand*{\entailsP}{\entailss{\smallP}}
+\newcommand*{\NentailsP}{\Nentailss{\smallP}}
+\newcommand*{\sentailsP}{\sentailss{\smallP}}
+
+
+% Interval floating point arithmetics
+
+\newcommand*{\asifp}{\oplus^{\#}}
+\newcommand*{\adifp}{\ominus^{\#}}
+\newcommand*{\adivifp}{\oslash^{\#}}
+\newcommand*{\amifp}{\otimes^{\#}}
+
+% Linear form arithmetics
+
+\newcommand*{\aslf}{\boxplus^{\#}}
+\newcommand*{\adlf}{\boxminus^{\#}}
+\newcommand*{\adivlf}{\boxslash^{\#}}
+\newcommand*{\amlf}{\boxtimes^{\#}}
+\newcommand*{\linexpr}[1]{\llparenthesis #1 \rrparenthesis}
+\newcommand*{\linexprenv}[3]{\llparenthesis #1 \rrparenthesis \left \llbracket #2, #3 \right \rrbracket}
diff --git a/doc/ppl_citations.bib b/doc/ppl_citations.bib
new file mode 100644
index 0000000..9b11cbe
--- /dev/null
+++ b/doc/ppl_citations.bib
@@ -0,0 +1,4272 @@
+A bibliography of papers that cite the Parma Polyhedra Library
+and/or the works that defined the theory upon which it is based.
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara AT cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This BibTeX database is made available under the Open Data Commons
+Attribution License (ODC-By) v1.0, which is reproduced below for your
+convenience and available at http://opendatacommons.org/licenses/by/1.0/
+Summarizing:
+
+- You are free: to copy, distribute and use the database;  to produce
+  works from the database;  to modify, transform and build upon the database.
+
+- You must attribute any public use of the database, or works produced
+  from the database, in the manner specified in the license.  For any
+  use or redistribution of the database, or works produced from it,
+  you must make clear to others the license of the database and keep
+  intact any notices on the original database.
+
+
+ at Inproceedings{AlbertACGPZ08,
+  Author = "E. Albert and P. Arenas and M. Codish and S. Genaim
+            and G. Puebla and D. Zanardini",
+  Title = "Termination Analysis of {Java} Bytecode",
+  Booktitle = "Proceedings of the 10th IFIP WG 6.1 International Conference
+               on Formal Methods for Open Object-Based Distributed Systems
+               (FMOODS 2008)",
+  Address = "Oslo, Norway",
+  Editor = "G. Barthe and F. S. de Boer",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5051,
+  Year = 2008,
+  Pages = "2--18",
+  ISBN = "978-3-540-68862-4",
+  Abstract = "Termination analysis has received considerable
+              attention, traditionally in the context of declarative
+              programming, and recently also for imperative
+              languages. In existing approaches, termination is
+              performed on source programs. However, there are many
+              situations, including mobile code, where only the
+              compiled code is available. In this work we present an
+              automatic termination analysis for sequential Java
+              Bytecode programs. Such analysis presents all of the
+              challenges of analyzing a low-level language as well as
+              those introduced by object-oriented languages.
+              Interestingly, given a bytecode program, we produce a
+              \emph{constraint logic program}, CLP, whose termination
+              entails termination of the bytecode program. This allows
+              applying the large body of work in termination of CLP
+              programs to termination of Java bytecode. A prototype
+              analyzer is described and initial experimentation is
+              reported."
+}
+
+ at Article{AlbertACGPZ12,
+  Author = "E. Albert and P. Arenas and S. Genaim and G. Puebla
+            and D. Zanardini",
+  Title = "Cost Analysis of Object-Oriented Bytecode Programs",
+  Journal = "Theoretical Computer Science",
+  Volume = 413,
+  Number = 1,
+  Pages =  "142--159",
+  Year = 2012,
+  Note = "Quantitative Aspects of Programming Languages (QAPL 2010)",
+  ISSN = "0304-3975",
+  URL = "http://www.sciencedirect.com/science/article/pii/S0304397511006190",
+  Abstract = "Cost analysis statically approximates the cost of
+              programs in terms of their input data size. This paper
+              presents, to the best of our knowledge, the first
+              approach to the automatic cost analysis of
+              object-oriented bytecode programs. In languages such as
+              Java and C#, analyzing bytecode has a much wider
+              application area than analyzing source code since the
+              latter is often not available. Cost analysis in this
+              context has to consider, among others, dynamic dispatch,
+              jumps, the operand stack, and the heap. Our method takes
+              a bytecode program and a cost model specifying the
+              resource of interest, and generates cost relations which
+              approximate the execution cost of the program with
+              respect to such resource. We report on COSTA, an
+              implementation for Java bytecode which can obtain upper
+              bounds on cost for a large class of programs and
+              complexity classes. Our basic techniques can be directly
+              applied to infer cost relations for other
+              object-oriented imperative languages, not necessarily in
+              bytecode form."
+}
+
+ at Inproceedings{AlbertAGP08,
+  Author = "E. Albert and P. Arenas and S. Genaim and G. Puebla",
+  Title = "Automatic Inference of Upper Bounds for Recurrence Relations
+           in Cost Analysis",
+  Booktitle = "Static Analysis:
+               Proceedings of the 15th International Symposium",
+  Address   = "Valencia, Spain",
+  Editor = "M. Alpuente and G. Vidal",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5079,
+  Year = 2008,
+  Pages = "221--237",
+  ISBN = "978-3-540-69163-1",
+  Abstract = "The classical approach to automatic cost analysis
+              consists of two phases. Given a program and some measure
+              of cost, we first produce \emph{recurrence relations}
+              (RRs) which capture the cost of our program in terms of
+              the size of its input data. Second, we convert such RRs
+              into \emph{closed form} (i.e., without
+              recurrences). Whereas the first phase has received
+              considerable attention, with a number of cost analyses
+              available for a variety of programming languages, the
+              second phase has received comparatively little
+              attention. In this paper we first study the features of
+              RRs generated by automatic cost analysis and discuss why
+              existing computer algebra systems are not appropriate
+              for automatically obtaining closed form solutions nor
+              upper bounds of them. Then we present, to our knowledge,
+              the first practical framework for the fully automatic
+              generation of reasonably accurate upper bounds of RRs
+              originating from cost analysis of a wide range of
+              programs. It is based on the inference of \emph{ranking
+              functions} and \emph{loop invariants} and on
+              \emph{partial evaluation}."
+}
+
+ at Incollection{AlbertAGPZ08,
+  Author = "E. Albert and P. Arenas and S. Genaim
+            and G. Puebla and D. Zanardini",
+  Title = "{COSTA}: Design and Implementation of a Cost and Termination
+           Analyzer for {Java} Bytecode",
+  Booktitle = "Formal Methods for Components and Objects",
+  Editor = "Frank S. {de Boer} and M. M. Bonsangue
+            and S. Graf and W. P. {de Roever}",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Year = 2008,
+  Volume = 5382,
+  Pages = "113--132",
+  ISBN = "978-3-540-92187-5",
+  Note = "Revised papers presented at the 6th International Symposium on
+          Formal Methods for Components and Objects (FMCO 2007),
+          Amsterdam, The Netherlands, October 24--26, 2007",
+  Abstract = "This paper describes the architecture of COSTA, an
+              abstract interpretation based COST and termination
+              Analyzer for Java bytecode.  The system receives as
+              input a bytecode program, (a choice of) a
+              \emph{resource} of interest and tries to obtain an upper
+              bound of the resource consumption of the program. COSTA
+              provides several non-trivial notions of cost, as the
+              consumption of the heap, the number of bytecode
+              instructions executed and the number of calls to a
+              specific method. Additionally, COSTA tries to prove
+              \emph{termination} of the bytecode program which implies
+              the boundedness of any resource consumption. Having cost
+              and termination together is interesting, as both
+              analyses share most of the machinery to, respectively,
+              infer cost \emph{upper bounds} and to prove that the
+              execution length is always \emph{finite} (i.e., the
+              program terminates). We report on experimental results
+              which show that COSTA can deal with programs of
+              realistic size and complexity, including programs which
+              use Java libraries.  To the best of our knowledge, this
+              system provides for the first time evidence that
+              resource usage analysis can be applied to a realistic
+              object-oriented, bytecode programming language."
+}
+
+ at Inproceedings{AlonsoAG11,
+  Author = "D. Alonso and P. Arenas and S. Genaim",
+  Title = "Handling Non-linear Operations in the Value Analysis of {COSTA}",
+  Booktitle = "Proceedings of the 6th Workshop on Bytecode Semantics,
+               Verification, Analysis and Transformation (Bytecode 2011)",
+  Address = "Saarbrucken, Germany",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 279,
+  Number = 1,
+  Pages = "3--17",
+  Year = 2011,
+  ISSN = "1571-0661",
+  Abstract = "Inferring precise relations between (the values of)
+              program variables at different program points is
+              essential for termination and resource usage
+              analysis. In both cases, this information is used to
+              synthesize ranking functions that imply the program's
+              termination and bound the number of iterations of its
+              loops. For efficiency, it is common to base value
+              analysis on non-disjunctive abstract domains such as
+              Polyhedra, Octagon, etc. While these domains are
+              efficient and able to infer complex relations for a wide
+              class of programs, they are often not sufficient for
+              modeling the effect of non-linear and bit arithmetic
+              operations. Modeling such operations precisely can be
+              done by using more sophisticated abstract domains, at
+              the price of performance overhead. In this paper we
+              report on the value analysis of COSTA that is based on
+              the idea of encoding the disjunctive nature of
+              non-linear operations into the (abstract) program
+              itself, instead of using more sophisticated abstract
+              domains. Our experiments demonstrate that COSTA is able
+              to prove termination and infer bounds on resource
+              consumption for programs that could not be handled
+              before."
+}
+
+ at Inproceedings{Alur11,
+  Author = "R. Alur",
+  Title = "Formal Verification of Hybrid Systems",
+  Booktitle = "Proceedings of the 11th International Conference
+               on Embedded Software (EMSOFT 2011)",
+  Address =  "Taipei, Taiwan",
+  Editor = "S. Chakraborty and A. Jerraya and S. K. Baruah
+            and S. Fischmeister",
+  Publisher = "ACM Press",
+  Year = 2011,
+  Pages = "273--278",
+  ISBN = "978-1-4503-0714-7",
+  Abstract = "In formal verification, a designer first constructs a
+              model, with mathematically precise semantics, of the
+              system under design, and performs extensive analysis
+              with respect to correctness requirements. The
+              appropriate mathematical model for embedded control
+              systems is hybrid systems that combines the traditional
+              state-machine based models for discrete control with
+              classical differential-equations based models for
+              continuously evolving physical activities. In this
+              article, we briefly review selected existing approaches
+              to formal verification of hybrid systems, along with
+              directions for future research."
+}
+
+ at Inproceedings{AlurKRS08,
+  Author = "R. Alur and A. Kanade and S. Ramesh and K. Shashidhar",
+  Title = "Symbolic Analysis for Improving Simulation Coverage
+           of Simulink/Stateflow Models",
+  Booktitle = "Proceedings of the 8th ACM {\&} IEEE International Conference
+               on Embedded Software (EMSOFT 2008)",
+  Address = "Atlanta, Georgia, USA",
+  Editor = "L. {de Alfaro} and J. Palsberg",
+  Publisher = "ACM Press",
+  Pages = "89--98",
+  Year = 2008,
+  ISBN = "978-1-60558-468-3",
+  Abstract = "Aimed at verifying safety properties and improving
+              simulation coverage for hybrid systems models of
+              embedded controlsoftware, we propose a technique that
+              combines numerical simulation and symbolic methods for
+              computing state-sets.  We consider systems with linear
+              dynamics described in the commercial modeling tool
+              Simulink/Stateflow.  Given an initial state $x$,
+              and a discrete-time simulation trajectory, our
+              method computes a set of initial states that are
+              guaranteed to be equivalent to $x$, where two initial
+              states are considered to be equivalent if the resulting
+              simulation trajectories contain the same discrete
+              components at each step of the simulation.  We illustrate
+              the benefits of our method on two case studies.
+              One case study is a benchmark proposed in the literature
+              for hybrid systems verification and another is a Simulink
+              demo model from Mathworks."
+}
+
+ at Inproceedings {AmatoPS10,
+  Author = "G. Amato and M. Parton and F. Scozzari",
+  Title = "A Tool Which Mines Partial Execution Traces to Improve
+           Static Analysis",
+  Booktitle = "Proceedings of the 1st International Conference on
+               Runtime Verification (RV 2010)",
+  Address = "Balluta Bay, St Julians, Malta",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "H. Barringer and Y. Falcone and B. Finkbeiner and K. Havelund
+            and I. Lee and G. Pace and G. Rosu and O. Sokolsky and
+            N. Tillmann",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-16611-2",
+  Pages =  "475--479",
+  Volume = 6418,
+  Year = 2010,
+  Abstract = "We present a tool which performs abstract interpretation
+              based static analysis of numerical variables. The
+              novelty is that the analysis is parametric, and
+              parameters are chosen by applying a variant of principal
+              component analysis to partial execution traces of
+              programs."
+}
+
+ at Article{AmatoPS12,
+  Author = "G. Amato and M. Parton and F. Scozzari",
+  Title = "Discovering Invariants via Simple Component Analysis",
+  Journal = "Journal of Symbolic Computation",
+  Volume = 47,
+  Number = 12,
+  Year = 2012,
+  Pages = "1533--1560",
+  Abstract = "We propose a new technique combining dynamic and static
+              analysis of programs to find linear invariants. We use a
+              statistical tool, called simple component analysis, to
+              analyze partial execution traces of a given program. We
+              get a new coordinate system in the vector space of
+              program variables, which is used to specialize numerical
+              abstract domains. As an application, we instantiate our
+              technique to interval analysis of simple imperative
+              programs and show some experimental evaluations."
+}
+
+ at Inproceedings{AmatoS12,
+  Author = "G. Amato and F. Scozzari",
+  Title = "Random: R-Based Analyzer for Numerical Domains",
+  Booktitle = "Proceedings of the 18th International Conference
+               on Logic for Programming, Artificial Intelligence,
+               and Reasoning (LPAR 2012)",
+  Address = "M\'erida, Venezuela",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "N. Bj{\o}rner and A. Voronkov",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-28716-9",
+  Pages =  "375--382",
+  Volume = 7180,
+  Year = 2012,
+  Abstract = "We present the tool Random (R-based Analyzer for
+              Numerical DOMains) for static analysis of imperative
+              programs. The tool is based on the theory of abstract
+              interpretation and implements several abstract
+              domains for detecting numerical properties, in
+              particular integer loop invariants.  The tool
+              combines a statistical dynamic analysis with a static
+              analysis on the new domain of parallelotopes.  The
+              tool has a graphical interface for tuning the
+              parameters of the analysis and visualizing partial
+              traces."
+}
+
+ at Inproceedings{Andre10,
+  Author = "{\'E}. Andr{\'e}",
+  Title = "{IMITATOR~II}:
+           A Tool for Solving the Good Parameters Problem in Timed Automata",
+  Booktitle = "Proceedings of the 12th International Workshop
+               on Verification of Infinite State Systems (INFINITY'10)",
+  Editor = "Y.-F. Chen and A. Rezine",
+  Address = "Singapore",
+  Pages = "91--99",
+  Series = "Electronic Proceedings in Theoretical Computer Science",
+  Volume = 39,
+  Year = 2010,
+  Abstract = "We present here \textsc{Imitator}~II, a new version of
+             \textsc{Imitator}, a tool implementing the ``inverse
+             method'' for parametric timed automata: given a reference
+             valuation of the parameters, it synthesizes a constraint
+             such that, for any valuation satisfying this constraint,
+             the system behaves the same as under the reference
+             valuation in terms of traces, i.e., alternating sequences
+             of locations and actions. \textsc{Imitator}~II also
+             implements the ``behavioral cartography algorithm'',
+             allowing us to solve the following good parameters
+             problem: find a set of valuations within a given bounded
+             parametric domain for which the system behaves well. We
+             present new features and optimizations of the tool, and
+             give results of applications to various examples of
+             asynchronous circuits and communication protocols."
+}
+
+ at Techreport{AndreFS11TR,
+  Author = "{\'E}. Andr{\'e} and L. Fribourg and R. Soulat",
+  Title = "Enhancing the Inverse Method with State Merging",
+  Type = "Research report",
+  Number = "LSV-11-26",
+  Year = 2011,
+  Month = dec,
+  Institution = "Laboratoire Sp\'ecification \& V\'erification",
+  Address = "\'Ecole Normale Sup\'erieure de Cachan, Paris, France",
+  Abstract = "Keeping the state space small is essential when
+              verifying realtime systems using Timed Automata (TA). In
+              the model-checker Uppaal, the merging operation has been
+              used extensively in order to reduce the number of
+              states. Actually, Uppaal's merging technique applies
+              within the more general setting of Parametric Timed
+              Automata (PTA). The Inverse Method (IM) for a PTA A is a
+              procedure that synthesizes a zone around a given point
+              0 (parameter valuation) over which A is guaranteed to
+              behave similarly. We show that the integration of
+              merging into IM leads to the synthesis of larger zones
+              around 0. It also often improves the performance of
+              IM, both in terms of computational space and time, as
+              shown by our experimental results."
+}
+
+ at Inproceedings{ArmandoBM07,
+  Author = "A. Armando and M. Benerecetti and J. Mantovani",
+  Title = "Abstraction Refinement of Linear Programs with Arrays",
+  Booktitle = "Proceedings of the 13th International Conference on
+               Tools and Algorithms for the Construction and Analysis
+               of Systems (TACAS 2007)",
+  Address = "Braga, Portugal",
+  Editor = "O. Grumberg and M. Huth",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4424,
+  Pages = "373--388",
+  Year = 2007,
+  ISBN = "3-540-71208-4",
+  Abstract = "In previous work we presented a model checking procedure
+              for linear programs, i.e. programs in which variables
+              range over a numeric domain and expressions involve
+              linear combinations of the variables. In this paper we
+              lift our model checking procedure for linear programs to
+              deal with arrays via iterative abstraction
+              refinement. While most approaches are based on predicate
+              abstraction and therefore the abstraction is relative to
+              sets of predicates, in our approach the abstraction is
+              relative to sets of variables and array indexes, and the
+              abstract program can express complex correlations
+              between program variables and array elements. Thus,
+              while arrays are problematic for most of the approaches
+              based on predicate abstraction, our approach treats them
+              in a precise way. This is an important feature as arrays
+              are ubiquitous in programming.  We provide a detailed
+              account of both the abstraction and the refinement
+              processes, discuss their implementation in the eureka
+              tool, and present experimental results that confirm the
+              effectiveness of our approach on a number of programs of
+              interest."
+}
+
+ at Inproceedings{AsarinDFGLGM06,
+  Author = "E. Asarin and T. Dang and G. Frehse and A. Girard
+            and C. {Le Guernic} and O. Maler",
+  Title = "Recent Progress in Continuous and Hybrid Reachability Analysis",
+  Booktitle = "Proceedings of the IEEE International Symposium
+               on Computer-Aided Control Systems Design",
+  Address = "Technische Universit{\"a}t M{\"u}nchen, Munich, Germany",
+  Year = 2006,
+  Abstract = "Set-based reachability analysis computes all possible
+              states a system may attain, and in this sense provides
+              knowledge about the system with a completeness, or
+              coverage, that a finite number of simulation runs can
+              not deliver. Due to its inherent complexity, the
+              application of reachability analysis has been limited so
+              far to simple systems, both in the continuous and the
+              hybrid domain. In this paper we present recent advances
+              that, in combination, significantly improve this
+              applicability, and allow us to find better balance
+              between computational cost and accuracy. The
+              presentation covers, in a unified manner, a variety of
+              methods handling increasingly complex types of
+              continuous dynamics (constant derivative, linear,
+              nonlinear). The improvements include new geometrical
+              objects for representing sets, new approximation
+              schemes, and more flexible combinations of graph-search
+              algorithm and partition refinement. We report briefly
+              some preliminary experiments that have enabled the
+              analysis of systems previously beyond reach."
+}
+
+ at Inproceedings{Avery06,
+  Author = "J. Avery",
+  Title = "Size-Change Termination and Bound Analysis",
+  Booktitle = "Proceedings of the 8th International Symposium
+               on Functional and Logic Programming (FLOPS 2006)",
+  Address = "Fuji-Susono, Japan",
+  Editor = "M. Hagiya and P. Wadler",
+  Pages = "192--207",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3945,
+  Year = 2006,
+  ISBN = "3-540-33438-6",
+  Abstract = "Despite its simplicity, the size-change termination
+              principle, presented by Lee, Jones and Ben-Amram in
+              [LJB01], is surprisingly strong and is able to show
+              termination for a large class of programs. A significant
+              limitation for its use, however, is the fact that the
+              SCT requires data types to be well-founded, and that all
+              mechanisms used to determine termination must involve
+              decreases in these global, well-founded partial orders.
+              Following is an extension of the size-change principle
+              that allows for non-well founded data types, and a
+              realization of this principle for integer data
+              types. The extended size-change principle is realized
+              through combining abstract interpretation over the
+              domain of convex polyhedra with the use of size-change
+              graphs. In the cases when data types \emph{are} well
+              founded, the method handles every case that is handled
+              by LJB size-change termination.  The method has been
+              implemented in a subject language independent shared
+              library, \texttt{libesct} (available at [Ave05a]), as
+              well as for the ANSI C specializer
+              $\texttt{C-Mix}_\texttt{II}$, handling a
+              subset of its internal language \texttt{Core-C}."
+}
+
+ at Inproceedings{BagnaraR-CZ05,
+  Author = "R. Bagnara and E. Rodr{\'\i}guez-Carbonell and E. Zaffanella",
+  Title = "Generation of Basic Semi-algebraic Invariants
+           Using Convex Polyhedra",
+  Booktitle = "Static Analysis:
+               Proceedings of the 12th International Symposium",
+  Address = "London, UK",
+  Editor = "C. Hankin and I. Siveroni",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3672,
+  ISBN = "3-540-28584-9",
+  Year = 2005,
+  Pages = "19--34",
+  Abstract = "A technique for generating invariant polynomial
+              \emph{inequalities} of bounded degree is presented using
+              the abstract interpretation framework.  It is based on
+              overapproximating basic semi-algebraic sets, i.e., sets
+              defined by conjunctions of polynomial inequalities, by
+              means of convex polyhedra.  While improving on the
+              existing methods for generating invariant polynomial
+              \emph{equalities}, since polynomial inequalities are
+              allowed in the guards of the transition system, the
+              approach does not suffer from the prohibitive complexity
+              of the methods based on quantifier-elimination.  The
+              application of our implementation to benchmark programs
+              shows that the method produces non-trivial invariants in
+              reasonable time.  In some cases the generated invariants
+              are essential to verify safety properties that cannot be
+              proved with classical linear invariants."
+}
+
+ at Techreport{BagnaraR-CZ05TR,
+  Author = "R. Bagnara and E. Rodr{\'\i}guez-Carbonell and E. Zaffanella",
+  Title = "Generation of Basic Semi-algebraic Invariants
+           Using Convex Polyhedra",
+  Number = "LSI-05-14-R",
+  Type = "Report de recerca",
+  Institution = "Departament de Llenguatges i Sistemes Inform{\`a}tics,
+                 Universitat Polit{\`e}cnica de Catalunya, Barcelona, Spain",
+  Year = 2005,
+  Note = "Available at \url{http://www.lsi.upc.edu/dept/techreps/techreps.html}"
+}
+
+ at Incollection{BandaG09,
+  Author = "G. Banda and J. P. Gallagher",
+  Title = "Analysis of Linear Hybrid Systems in {CLP}",
+  Booktitle = "Logic-Based Program Synthesis and Transformation",
+  Editor = "M. Hanus",
+  Pages = "55--70",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5438,
+  Year = 2009,
+  ISBN = "978-3-642-00514-5",
+  Note = "Revised selected papers presented at the 18th International
+          Symposium on Logic-Based Program Synthesis and Transformation
+          (LOPSTR 2008), Valencia, Spain, July 17--18, 2008",
+  Abstract = "In this paper we present a procedure for representing
+              the semantics of linear hybrid automata (LHAs) as
+              constraint logic programs (CLP); flexible and accurate
+              analysis and verification of LHAs can then be performed
+              using generic CLP analysis and transformation
+              tools. LHAs provide an expressive notation for
+              specifying real-time systems. The main contributions are
+              (i) a technique for capturing the reachable states of
+              the continuously changing state variables of the LHA as
+              CLP constraints; (ii) a way of representing events in
+              the LHA as constraints in CLP, along with a product
+              construction on the CLP representation including
+              synchronisation on shared events; (iii) a framework in
+              which various kinds of reasoning about an LHA can be
+              flexibly performed by combining standard CLP
+              transformation and analysis techniques.  We give
+              experimental results to support the usefulness of the
+              approach and argue that we contribute to the general
+              field of using static analysis tools for verification."
+}
+
+ at Inproceedings{BerendsenJV10,
+  Author = "J. Berendsen and D. N. Jansen and F. W. Vaandrager",
+  Title = "Fortuna: Model Checking Priced Probabilistic Timed Automata",
+  Booktitle = "Proceedings of the 7th International Conference on the
+               Quantitative Evaluation of Systems (QEST 2010)",
+  Address = "Williamsburg, Virginia, USA",
+  Publisher = "IEEE Computer Society",
+  Year = 2010,
+  Pages = "273--281",
+  ISBN = "978-0-7695-4188-4",
+  Abstract = "Fortuna is the first tool for model checking priced
+              probabilistic timed automata (PPTAs). PPTAs are an
+              important model that can handle the combination of
+              real-time, probabilistic and cost features. Only model
+              checkers that incorporate all these features can
+              address the key design trade-offs that arise in many
+              practical applications such as: the Zeroconf,
+              Bluetooth, IEEE802.11 and Firewire protocols, protocols
+              for sensor networks, and scheduling problems with
+              failures. PPTAs are an extension of probabilistic timed
+              automata (PTAs), by having cost-rates and discrete cost
+              increments on states. Fortuna is able to compute the
+              maximal probability by which a class of states can be
+              reached under a certain cost-bound (and time bound.)
+              Although the problem is undecidable in general, there
+              exists a semi-algorithm that produces a non-decreasing
+              sequence of maximal probabilities. This paper enhances
+              that algorithm. We compared the performance of Fortuna
+              with existing approaches for PTAs. Surprisingly,
+              although PPTAs are more general, our techniques exhibit
+              superior performance.",
+}
+
+ at TechReport{BeyL11TR,
+  Author = "A. Bey S. Leue",
+  Title = "Modeling and Analyzing Spike Timing Dependent Plasticity
+           with Linear Hybrid Automata",
+  Number = "soft-11-03",
+  Institution = "University of Konstanz, Germany",
+  Year = 2011,
+  Month = may,
+  Abstract = "We propose a model for synaptic plasticity according to
+              the Spike Timing Dependent Plasticity (STDP) theory
+              using Linear Hybrid Au- tomata (LHA). We first present a
+              compositional LHA model in which each component
+              corresponds to some process in STDP. We then ab- stract
+              this model into a monolithic LHA model in order to
+              enable formal analysis using hybrid model checking. We
+              discuss how the avail- ability of an LHA model as well
+              as its formal analysis using the tool PHAVer can support
+              a better understanding of the dynamics of STDP."
+}
+
+ at Inproceedings{BeyerG11,
+  Author = "M. Beyer and S. Glesner",
+  Title = "Static Run-Time Mode Extraction by State Partitioning
+           in Synchronous Process Networks",
+  Booktitle = "Proceedings of the 14th International Workshop on
+               Software and Compilers for Embedded Systems (SCOPES 2011)",
+  Year = 2011,
+  ISBN = "978-1-4503-0763-5",
+  Pages = "28--37",
+  URL = "http://doi.acm.org/10.1145/1988932.1988938",
+  Publisher = "ACM Press",
+  Address = "New York, NY, USA",
+  Abstract = "Process Networks (PNs) are used for modeling
+              streaming-oriented applications with changing behavior,
+              which must be mapped on a concurrent architecture to
+              meet the performance and energy constraints of embedded
+              devices. Finding an optimal mapping of Process Networks
+              to the constrained architecture presumes that the
+              behavior of the PN is statically known. In this paper we
+              present a static analysis for synchronous PNs that
+              partitions the state space according to extract run-time
+              modes based on a Data Augmented Control Flow Automaton
+              (DACFA). The result is a mode automaton whose nodes
+              describe identified program modes and whose edges
+              represent transitions among them. Optimizing back-ends
+              mapping from PNs to concurrent architectures can be
+              guided by these analysis results."
+}
+
+ at Inproceedings{BeyerG12,
+  Author = "M. Beyer and S. Glesner",
+  Title = "Static Analysis of Run-Time Modes in Synchronous Process Network",
+  Booktitle = "Perspectives of Systems Informatics: Proceedings of the
+               8th International Andrei Ershov Memorial Conference",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "E. Clarke and I. Virbitskaite and A. Voronkov",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-29708-3",
+  Pages =  "55--67",
+  Volume = 7162,
+  Year = 2012,
+  Abstract = "For modeling modern streaming-oriented applications,
+              Process Networks (PNs) are used to describe systems with
+              changing behavior, which must be mapped on a concurrent
+              architecture to meet the performance and energy
+              constraints of embedded devices. Finding an optimal
+              mapping of Process Networks to the constrained
+              architecture presumes that the behavior of the Process
+              Network is statically known. In this paper we present a
+              static analysis for synchronous PNs that extracts
+              different run-time modes by using polyhedral
+              abstraction. The result is a Mealy machine whose states
+              describe different run-time modes and the edges among
+              them represent transitions. This machine can be used to
+              guide optimizing backend mappings from PNs to concurrent
+              architectures."
+}
+
+ at Inproceedings{BouchyFL08,
+  Author = "F. Bouchy and A. Finkel and J. Leroux",
+  Title = "Decomposition of Decidable First-Order Logics
+           over Integers and Reals",
+  Booktitle = "Proceedings of the 15th International Symposium on
+               Temporal Representation and Reasoning (TIME '08)",
+  Address = "Montreal, Canada",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "147--155",
+  Year = 2008,
+  Abstract = "We tackle the issue of representing infinite sets of
+              real-valued vectors. This paper introduces an
+              operator for combining integer and real sets. Using
+              this operator, we decompose three well-known logics
+              extending Presburger with reals. Our decomposition
+              splits a logic into two parts : one integer, and one
+              decimal (i.e. on the interval $[0, 1[$). We also give
+              a basis for an implementation of our representation."
+}
+
+ at Inproceedings{BozgaGI09,
+  Author = "M. Bozga and C. G\^{\i}rlea and R. Iosif",
+  Title = "Iterating Octagons",
+  Booktitle = "Proceedings of the 15th International Conference on
+               Tools and Algorithms for the Construction and Analysis
+               of Systems (TACAS 2009)",
+  Address = "York, UK",
+  Editor = "S. Kowalewski and A. Philippou",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5505,
+  Pages = "337-351",
+  Year = 2009,
+  ISBN = "978-3-642-00767-5",
+  Abstract = "In this paper we prove that the transitive closure of a
+              nondeterministic octagonal relation using integer
+              counters can be expressed in Presburger arithmetic. The
+              direct consequence of this fact is that the reachability
+              problem is decidable for flat counter automata with
+              octagonal transition relations. This result improves the
+              previous results of Comon and Jurski [Hubert Comon and
+              Yan Jurski. Multiple counters automata, safety analysis
+              and presburger arithmetic. In \emph{CAV}, LNCS 1427, pages
+              268-279, 1998] and Bozga, Iosif and Lakhnech [Marius Bozga,
+              Radu Iosif, and Yassine Lakhnech. Flat parametric counter
+              automata. In \emph{ICALP}, LNCS 4052, pages 577-588.
+              Springer-Verlag, 2006] concerning the computation of
+              transitive closures for difference bound relations.
+              The importance of this result is justified by the wide
+              use of octagons to computing sound abstractions of
+              real-life systems [A. Min\'e. The octagon abstract domain.
+              \emph{Higher-Order and Symbolic Computation}, 19(1):31-100,
+              2006]. We have implemented the octagonal transitive closure
+              algorithm in a prototype system for the analysis of counter
+              automata, called FLATA, and we have experimented with a
+              number of test cases."
+}
+
+ at Inproceedings{BramanM08,
+  Title = "Safety Verification of Fault Tolerant Goal-based Control Programs
+           with Estimation Uncertainty",
+  Author = "J. M. B. Braman and R. M. Murray",
+  Booktitle = "Proceedings of the 2008 American Control Conference",
+  Address = "Seattle, Washington, USA",
+  Publisher = "IEEE Press",
+  Year = 2008,
+  Pages = "27--32",
+  ISSN = "0743-1619",
+  ISBN = "978-1-4244-2078-0",
+  Abstract = "Fault tolerance and safety verification of control
+              systems that have state variable estimation uncertainty
+              are essential for the success of autonomous robotic
+              systems. A software control architecture called mission
+              data system, developed at the Jet Propulsion Laboratory,
+              uses goal networks as the control program for autonomous
+              systems. Certain types of goal networks can be converted
+              into linear hybrid systems and verified for safety using
+              existing symbolic model checking software. A process for
+              calculating the probability of failure of certain
+              classes of verifiable goal networks due to state
+              estimation uncertainty is presented. A verifiable
+              example task is presented and the failure probability of
+              the control program based on estimation uncertainty is
+              found."
+}
+
+ at Techreport{Braun12TR,
+  Author = "V. Braun",
+  Title = "Counting Points and {Hilbert} Series in String Theory",
+  Institution = "University of Pennsylvania in Philadelphia, USA",
+  Number = "arXiv:1206.2236v1 [hep-th]",
+  Note = "Available from \url{http://arxiv.org/}",
+  Year = 2012,
+  Month = jun,
+  URL = "http://arxiv.org/abs/1206.2236v1",
+  Abstract = "The problem of counting points is revisited from the
+              perspective of reflexive 4-dimensional polytopes. As an
+              application, the Hilbert series of the 473,800,776
+              reflexive polytopes (equivalently, their Calabi-Yau
+              hypersurfaces) are computed."
+}
+
+
+ at Techreport{CacheraM-A05,
+  Author = "D. Cachera and K. Morin-Allory",
+  Title = "Proving Parameterized Systems: The Use of a Widening Operator
+          and Pseudo-Pipelines in Polyhedral Logic",
+  Type = "Research Report",
+  Number = "ISRN TIMA--RR-05/04-01--FR",
+  Institution = "TIMA Laboratory",
+  Address = "Grenoble, France",
+  Year = 2005,
+  Abstract = "We propose proof techniques and tools for the formal
+              verification of regular parameterized systems. These
+              systems are expressed in the polyhedral model, which
+              combines affine recurrence equations with index sets of
+              polyhedral shape. We extend a previously defined proof
+              system based on a polyhedral logic with the detection of
+              pseudo-pipelines, that are particular patterns in the
+              variable definitions generalizing the notion of
+              pipeline. The combination of pseudo-pipeline detection
+              with the use of a simple widening operator greatly
+              improves the effectiveness of our proof techniques."
+}
+
+ at Article{CarloniPPS-V06,
+  Author = "L. P. Carloni and R. Passerone and A. Pinto
+            and A. L. Sangiovanni-Vincentelli",
+  Title = "Languages and Tools for Hybrid Systems Design",
+  Journal = "Foundations and Trends. in Electronic Design Automation",
+  Volume = 1,
+  Number = "1/2",
+  Pages = "1--193",
+  Year = 2006,
+  Abstract = "The explosive growth of embedded electronics is bringing
+              information and control systems of increasing complexity
+              to every aspects of our lives. The most challenging
+              designs are safety-critical systems, such as
+              transportation systems (e.g., airplanes, cars, and
+              trains), industrial plants and health care
+              monitoring. The difficulties reside in accommodating
+              constraints both on functionality and
+              implementation. The correct behavior must be guaranteed
+              under diverse states of the environment and potential
+              failures; implementation has to meet cost, size, and
+              power consumption requirements. The design is therefore
+              subject to extensive mathematical analysis and
+              simulation. However, traditional models of information
+              systems do not interface well to the continuous evolving
+              nature of the environment in which these devices
+              operate.  Thus, in practice, different mathematical
+              representations have to be mixed to analyze the overall
+              behavior of the system. \emph{Hybrid systems} are a
+              particular class of mixed models that focus on the
+              combination of discrete and continuous subsystems. There
+              is a wealth of tools and languages that have been
+              proposed over the years to handle hybrid
+              systems. However, each tool makes different assumptions
+              on the environment, resulting in somewhat different
+              notions of hybrid system. This makes it difficult to
+              share information among tools. Thus, the community
+              cannot maximally leverage the substantial amount of work
+              that has been directed to this important topic. In this
+              paper, we review and compare hybrid system tools by
+              highlighting their differences in terms of their
+              underlying semantics, expressive power and mathematical
+              mechanisms.  We conclude our review with a comparative
+              summary, which suggests the need for a unifying approach
+              to hybrid systems design. As a step in this direction,
+              we make the case for a \emph{semantic-aware interchange
+              format}, which would enable the use of joint techniques,
+              make a formal comparison between different approaches
+              possible, and facilitate exporting and importing design
+              representations."
+}
+
+ at Article{ChakrabortyMS06,
+  Title = "Reasoning about Synchronization in {GALS} Systems",
+  Author = "S. Chakraborty and J. Mekie and D. K. Sharma",
+  Journal = "Formal Methods in System Design",
+  Publisher = "Springer Netherlands",
+  Volume = 28,
+  Number = 2,
+  Pages = "153--169",
+  Year = 2006,
+  Abstract = "Correct design of interface circuits is crucial for the
+              development of System-on-Chips (SoC) using off-the-shelf
+              IP cores. For correct operation, an interface circuit
+              must meet strict synchronization timing constraints, and
+              also respect sequencing constraints between events
+              dictated by interfacing protocols and rational clock
+              relations. In this paper, we propose a technique for
+              automatically analyzing the interaction between
+              independently specified synchronization constraints and
+              sequencing constraints between events. We show how this
+              analysis can be used to derive delay constraints for
+              correct operation of interface circuits in a GALS
+              system. Our methodology allows an SoC designer to mix
+              and match different interfacing protocols, rational
+              clock relations and synchronization constraints for
+              communication between a pair of modules, and
+              automatically explore their implications on correct
+              interface circuit design."
+}
+
+ at Inproceedings{ChenMC08,
+  Author = "L. Chen and A. Min{\'e} and P. Cousot",
+  Title = "A Sound Floating-Point Polyhedra Abstract Domain",
+  Booktitle = "Proceedings of the 6th Asian Symposium on
+               Programming Languages and Systems (APLAS 2008)",
+  Address = "Bangalore, India",
+  Editor = "G. Ramalingam",
+  Year = 2008,
+  Pages = "3--18",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5356,
+  ISBN = "978-3-540-89329-5",
+  Abstract = "The polyhedra abstract domain is one of the most
+              powerful and commonly used numerical abstract domains in
+              the field of static program analysis based on abstract
+              interpretation. In this paper, we present an
+              implementation of the polyhedra domain using
+              floating-point arithmetic without sacrificing soundness.
+              Floating-point arithmetic allows a compact memory
+              representation and an efficient implementation on
+              current hardware, at the cost of some loss of precision
+              due to rounding. Our domain is based on a
+              constraint-only representation and employs sound
+              floating-point variants of Fourier-Motzkin elimination
+              and linear programming. The preliminary experimental
+              results of our prototype are encouraging. To our
+              knowledge, this is the first time that the polyhedra
+              domain is adapted to floating-point arithmetic in a
+              sound way."
+}
+
+
+ at Inproceedings{ColonS11,
+  Author = "M. Col{\'o}n and S. Sankaranarayanan",
+  Title = "Generalizing the Template Polyhedral Domain",
+  Booktitle = "Proceedings of the 20th European Symposium on Programming
+              (ESOP 2011)",
+  Address = "Saarbr{\"u}cken, Germany",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "G. Barthe",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-19717-8",
+  Pages =  "176--195",
+  Volume = 6602,
+  Year = 2011,
+  Abstract = "Template polyhedra generalize weakly relational domains
+              by specifying arbitrary fixed linear expressions on the
+              left-hand sides of inequalities and undetermined
+              constants on the right. The domain operations required
+              for analysis over template polyhedra can be computed in
+              polynomial time using linear programming. In this paper,
+              we introduce the generalized template polyhedral domain
+              that extends template polyhedra using fixed left-hand
+              side expressions with bilinear forms involving program
+              variables and unknown parameters to the right. We prove
+              that the domain operations over generalized templates
+              can be defined as the ``best possible abstractions'' of
+              the corresponding polyhedral domain operations. The
+              resulting analysis can straddle the entire space of
+              linear relation analysis starting from the template
+              domain to the full polyhedral domain. We show that
+              analysis in the generalized template domain can be
+              performed by dualizing the join, post-condition and
+              widening operations. We also investigate the special
+              case of template polyhedra wherein each bilinear form
+              has at most two parameters. For this domain, we use the
+              special properties of two dimensional polyhedra and
+              techniques from fractional linear programming to derive
+              domain operations that can be implemented in polynomial
+              time over the number of variables in the program and the
+              size of the polyhedra. We present applications of
+              generalized template polyhedra to strengthen previously
+              obtained invariants by converting them into
+              templates. We describe an experimental evaluation of an
+              implementation over several benchmark systems."
+}
+
+ at Inproceedings{CovaFBV06,
+  Author = "M. Cova and V. Felmetsger and G. Banks and G. Vigna",
+  Title = "Static Detection of Vulnerabilities in x86 Executables",
+  Booktitle = "Proceedings of the 22nd Annual Computer Security Applications
+               Conference (ACSAC 22)",
+  Address = "Miami, Florida, USA",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "269--278",
+  Year = 2006,
+  Abstract = "In the last few years, several approaches have been
+              proposed to perform vulnerability analysis of
+              applications written in high-level languages. However,
+              little has been done to automatically identify
+              security-relevant flaws in binary code.
+
+              In this paper, we present a novel approach to the
+              identification of vulnerabilities in x86 executables in
+              ELF binary format. Our approach is based on static
+              analysis and symbolic execution techniques. We
+              implemented our approach in a proof-of-concept tool and
+              used it to detect taint-style vulnerabilities in binary
+              code.  The results of our evaluation show that our
+              approach is both practical and effective."
+}
+
+ at Inproceedings{DenmatGD07,
+  Author = "T. Denmat and A. Gotlieb and M. Ducass{\'e}",
+  Title = "An Abstract Interpretation Based Combinator for Modelling
+           While Loops in Constraint Programming",
+  Booktitle = "Proceedings of the 13th International Conference on
+               Principles and Practice of Constraint Programming (CP 2007)",
+  Address = "Providence, Rhode Island, USA",
+  Editor = "C. Bessiere",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4741,
+  Year = 2007,
+  Pages = "241--255",
+  ISBN = "978-3-540-74969-1",
+  Abstract = "We present the $w$ constraint combinator that models
+              while loops in Constraint Programming. Embedded in a
+              finite domain constraint solver, it allows programmers
+              to develop non-trivial arithmetical relations using
+              loops, exactly as in an imperative language style. The
+              deduction capabilities of this combinator come from
+              abstract interpretation over the polyhedra abstract
+              domain. This combinator has already demonstrated its
+              utility in constraint-based verification and we argue
+              that it also facilitates the rapid prototyping of
+              arithmetic constraints (e.g. power, gcd or sum)."
+}
+
+ at Inproceedings{DooseM05,
+  Author = "D. Doose and Z. Mammeri",
+  Title = "Polyhedra-Based Approach for Incremental Validation
+           of Real-Time Systems",
+  Booktitle = "Proceedings of the International Conference on
+               Embedded and Ubiquitous Computing (EUC 2005)",
+  Address = "Nagasaki, Japan",
+  Editor = "L. T. Yang and M. Amamiya and Z. Liu and M. Guo and F. J. Rammig",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3824,
+  Year = 2005,
+  Pages = "184--193",
+  ISBN = "3-540-30807-5",
+  Abstract = "Real-time embedded systems can be used in hightly
+              important or even vital tasks (avionic and medical
+              systems, etc.), thus having strict temporal constraints
+              that need to be validated. Existing solutions use
+              temporal logic, automata or scheduling
+              techniques. However, scheduling techniques are often
+              pessimistic and require an almost complete knowledge of
+              the system, and formal methods can be ill-fitted to
+              manipulate some of the concepts involved in real-time
+              systems.  In this article, we propose a method that
+              gives to the designer the advantages of formal methods
+              and some simplicity in manipulating real-time systems
+              notions. This method is able to model and validate all
+              the classical features of real-time systems, without any
+              pessimism, while guaranteeing the terminaison of the
+              validation process. Moreover, its formalism enables to
+              study systems of which we have only a partial knowledge,
+              and thus to validate or invalidate a system still under
+              design. This latest point is very important, since it
+              greatly decreases the cost of design backtracks."
+}
+
+ at Inproceedings{DoyenHR05,
+  Author = "L. Doyen and T. A. Henzinger and J.-F. Raskin",
+  Title = "Automatic Rectangular Refinement of Affine Hybrid Systems",
+  Booktitle = "Proceedings of the 3rd International Conference
+              on Formal Modeling and Analysis of Timed Systems (FORMATS 2005)",
+  Address = "Uppsala, Sweden",
+  Editor = "P. Pettersson and W. Yi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3829,
+  Pages = "144--161",
+  Year = 2005,
+  ISBN = "3-540-30946-2",
+  Abstract = "We show how to automatically construct and refine
+              rectangular abstractions of systems of linear
+              differential equations. From a hybrid automaton whose
+              dynamics are given by a system of linear differential
+              equations, our method computes automatically a sequence
+              of rectangular hybrid automata that are increasingly
+              precise overapproximations of the original hybrid
+              automaton. We prove an optimality criterion for
+              successive refinements. We also show that this method
+              can take into account a safety property to be verified,
+              refining only relevant parts of the state space. The
+              practicability of the method is illustrated on a
+              benchmark case study."
+}
+
+ at Techreport{DoyenHR05TR,
+  Author = "L. Doyen and T. A. Henzinger and J.-F. Raskin",
+  Title = "Automatic Rectangular Refinement of Affine Hybrid Systems",
+  Number = "2005.47",
+  Institution = "Centre F\'ed\'er\'e en V\'erification,
+                 Universit\'e Libre de Bruxelles, Belgium",
+  Year = 2005,
+  Abstract = "We show how to automatically construct and refine
+              rectangular abstractions of systems of linear
+              differential equations. From a hybrid automaton whose
+              dynamics are given by a system of linear differential
+              equations, our method computes automatically a sequence
+              of rectangular hybrid automata that are increasingly
+              precise overapproximations of the original hybrid
+              automaton. We prove an optimality criterion for
+              successive refinements. We also show that this method
+              can take into account a safety property to be verified,
+              refining only relevant parts of the state space. The
+              practicability of the method is illustrated on a
+              benchmark case study."
+}
+
+ at PhdThesis{Doyen06th,
+  Author = "L. Doyen",
+  Title = "Algorithmic Analysis of Complex Semantics
+           for Timed and Hybrid Automata",
+  School = "Universit\'e Libre de Bruxelles",
+  Address = "Bruxelles, Belgium",
+  Month = jun,
+  Year = 2006,
+  Abstract = "In the field of formal verification of real-time
+              systems, major developments have been recorded in the
+              last fifteen years. It is about logics, automata,
+              process algebra, programming languages, etc. From the
+              beginning, a formalism has played an important role:
+              \emph{timed automata} and their natural extension,
+              \emph{hybrid automata}. Those models allow the
+              definition of real-time constraints using real-valued
+              \emph{clocks}, or more generally \emph{analog variables}
+              whose evolution is governed by differential
+              equations. They generalize finite automata in that their
+              semantics defines \emph{timed words} where each symbol
+              is associated with an occurrence timestamp.
+
+              The \emph{decidability} and \emph{algorithmic analysis}
+              of timed and hybrid automata have been intensively
+              studied in the literature. The central result for timed
+              automata is that they are positively decidable. This is
+              not the case for hybrid automata, but semi-algorithmic
+              methods are known when the dynamics is relatively
+              simple, namely a linear relation between the derivatives
+              of the variables.  With the increasing complexity of
+              nowadays systems, those models are however limited in
+              their classical semantics, for modelling realistic
+              implementations or dynamical systems.
+
+              In this thesis, we study the algorithmics of
+              \emph{complex semantics} for timed and hybrid automata.
+              On the one hand, we propose implementable semantics for
+              timed automata and we study their computational
+              properties: by contrast with other works, we identify a
+              semantics that is implementable and that has decidable
+              properties.  On the other hand, we give new algorithmic
+              approaches to the analysis of hybrid automata whose
+              dynamics is given by an affine function of its
+              variables."
+}
+
+ at MastersThesis{Ellenbogen04th,
+  Author = "R. Ellenbogen",
+  Title = "Fully Automatic Verification of Absence of Errors
+           via Interprocedural Integer Analysis",
+  School = "School of  Computer Science, Tel-Aviv University",
+  Address = "Tel-Aviv, Israel",
+  Month = dec,
+  Year = 2004,
+  Abstract = "We present a interprocedural C String Static Verifier
+              (iCSSV), a whole program analysis algorithm for
+              verifying the safety of string operations in C
+              programs. The algorithm automatically proves linear
+              relationships among pointer expressions. The algorithm
+              is conservative, i.e., it infers only valid
+              relationships although it may fail to detect some of
+              them. The algorithm is targeted to programs with
+              ``shallow'' pointers and complex integer
+              relationships. Therefore, the algorithm combines
+              context-sensitive flow-insensitive pointer analysis of
+              pointer updates with contextsensitive and flow-sensitive
+              integer analysis of properties of allocation
+              sites. Context-sensitivity is achieved by specializing
+              pointer aliases to the context and functional integer
+              analysis. The algorithm is powerful enough to verify the
+              absence of string manipulation errors such as accesses
+              beyond buffer length and null terminating
+              character. Here the interprocedural analysis guarantees
+              that our algorithm is fully automatic, i.e., does not
+              require user annotations or any other intervention. A
+              prototype of the algorithm was implemented. Several
+              novel techniques are employed to make the
+              interprocedural analysis of realistic programs
+              feasible."
+}
+
+ at Inproceedings{FagesR09,
+  Author = "F. Fages and A. Rizk",
+  Title = "From Model-Checking to Temporal Logic Constraint Solving",
+  Booktitle = "Proceedings of the 15th International Conference
+               on Principles and Practice of Constraint Programming (CP 2009)",
+  Address = "Lisbon, Portugal",
+  Editor = "I. P. Gent",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5732,
+  Year = 2009,
+  Pages = "319--334",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-04243-0",
+  Abstract = "In this paper, we show how model-checking can be
+              generalized to temporal logic constraint solving, by
+              considering temporal logic formulae with free variables
+              over some domain ${\mathcal D}$, and by computing a
+              validity domain for the variables rather than a truth
+              value for the formula. This allows us to define a
+              continuous degree of satisfaction for a temporal logic
+              formula in a given structure, opening up the field of
+              model-checking to optimization. We illustrate this
+              approach with reverse-engineering problems coming from
+              systems biology, and provide some performance figures on
+              parameter optimization problems with respect to temporal
+              logic specifications."
+}
+
+ at Inproceedings{FenacciM11,
+  Author = "D. Fenacci and K. MacKenzie",
+  Title = "Static Resource Analysis for {Java} Bytecode Using Amortisation
+           and Separation Logic",
+  Booktitle = "Proceedings of the 6th Workshop on Bytecode Semantics,
+               Verification, Analysis and Transformation (Bytecode 2011)",
+  Address = "Saarbrucken, Germany",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 279,
+  Number = 1,
+  Pages =  "19--32",
+  Year = 2011,
+  ISSN = "1571-0661",
+  Abstract = "In this paper we describe a static analyser for Java
+              bytecode which uses a combination of amortised analysis
+              and Separation Logic due to Robert Atkey. With the help
+              of Java annotations we are able to give precise resource
+              utilisation constraints for Java methods which
+              manipulate various heap-based data structures."
+}
+
+ at MastersThesis{Flexeder05th,
+  Author = "A. Flexeder",
+  Title = "{Interprozedurale Analyse linearer Ungleichungen}",
+  Type = "Diploma thesis",
+  School = "Technische {Universit\"at} {M\"unchen}",
+  Address = "{M\"unchen}, Germany",
+  Month = jul,
+  Year = 2005,
+  Note = "In German",
+  Abstract = "{Diese Arbeit beschreibt eine intra- und auch
+              interprozedurale Datenflussanalyse, welche an jedem
+              Programmpunkt statisch die Beziehungen, die zwischen den
+              Programmvariablen gelten, bestimmen k\"onnen. Die
+              intraprozeduralen Analyse, beruhend auf einem Modell von
+              Cousot [P.~Cousot and N.~Halbwachs. Automatic discovery
+              of linear restraints among variables of a program.
+              Conference Record of the 5th Annunal ACM Symposium on
+              Principles of Programming Languages, pages 84--96, 1978]
+              interpretiert lineare Zuweisungen und Bedingungen und
+              betrachtet die nicht linearen Konstrukte mit Hilfe von
+              nicht linearen Zuweisungen. Mit dieser Abstraktion
+              versucht man lineare Gleichheits- und
+              Ungleichheitsbeziehungen zwischen den Programmvariablen
+              in Form von Polyedern rauszufinden. Da man nicht nur
+              eine Funktion, sondern ganze Programme als Zusammenspiel
+              mehrerer Funktionen, analysieren m\"ochte, ist eine
+              interprozedurale Analyse n\"otig [M.~Mueller-Olm and
+              H.~Seidl.  Precise Interprocedural Analysis through
+              Linear Algebra. POPL, 2004]. Diese soll mit den Mitteln
+              der linearen Algebra die affinen Beziehungen, welche
+              zwischen den Programmvariablen an einem bestimmten
+              Programmpunkt gelten, erkennen. Die Behandlung von
+              Prozeduraufrufen steht dabei im Vordergrund.}"
+}
+
+ at MastersThesis{FrankM02th,
+  Author = "S. Frank and P. R. Mai",
+  Title = "Strategies for Cooperating Constraint Solvers",
+  Type = "Diploma thesis",
+  School = "Technische {Universit\"at} Berlin",
+  Address = "Berlin, Germany",
+  Month = jul,
+  Year = 2002,
+  Abstract = "Cooperative constraint solving has been investigated by
+              several different research groups and individuals as it
+              provides a comfortable mechanism to attack multi-domain
+              constraint problems. The theoretical framework of
+              Hofstedt [P.~Hofstedt. Cooperation and Coordination of
+              Constraint Solvers. PhD thesis, Technische
+              {Universit\"at} Dresden, March 2001. Shaker Verlag,
+              Aachen] provided the basis for the prototypical
+              implementation described in [E.~Godehardt and
+              D.~Seifert.  Kooperation und Koordination von Constraint
+              Solvern --- Implementierung eines Prototyps. Master's
+              thesis, Technische Universit{\"a}t Berlin, January
+              2001]. Taking aboard the lessons learned in the
+              prototype, we introduce a revised implementation of the
+              framework, to serve as a flexible basis for the
+              conception and evaluation of advanced strategies for
+              solver cooperation. Several additional enhancements and
+              optimisations over the preceding implementation or the
+              underlying theoretical framework are described, proving
+              the correctness of those changes where necessary. Using
+              the newly implemented framework, we propose and
+              benchmark a set of new cooperation strategies,
+              iteratively refining them to the point where we can
+              offer a set of generally useful (i.e. non-problem
+              specific) strategies. Finally we introduce a strategy
+              language, that allows the user to define
+              problem-specific strategies, either from scratch or
+              derived from other strategies, and demonstrate the
+              effectiveness of the language on a well-known example
+              problem."
+}
+
+ at Inproceedings{Frehse04,
+  Author = "G. Frehse",
+  Title = "Compositional Verification of Hybrid Systems
+           with Discrete Interaction Using Simulation Relations",
+  Booktitle = "Proceedings of the IEEE Conference on Computer Aided
+               Control Systems Design (CACSD 2004)",
+  Address = "Taipei, Taiwan",
+  Year = 2004,
+  Abstract = "Simulation relations can be used to verify refinement
+              between a system and its specification, or between
+              models of different complexity. It is known that for the
+              verification of safety properties, simulation between
+              hybrid systems can be defined based on their labeled
+              transition system semantics. We show that for hybrid
+              systems without shared variables, which therefore only
+              interact at discrete events, this simulation preorder is
+              compositional, and present assume-guarantee rules that
+              help to counter the state explosion problem. Some
+              experimental results for simulation checking of linear
+              hybrid automata are provided using a prototype tool with
+              exact arithmetic and unlimited digits."
+}
+
+ at Inproceedings{FrehseHK04,
+  Author = "G. Frehse and Z. Han and B. Krogh",
+  Title = "Assume-Guarantee Reasoning for Hybrid {I/O}-Automata
+           by Over-Approximation of Continuous Interaction",
+  Booktitle = "Proceedings of the
+               43rd IEEE Conference on Decision and Control (CDC 2004)",
+  Address = "Atlantis, Paradise Island, Bahamas",
+  Year = 2004,
+  Abstract = "This paper extends assume-guarantee reasoning (AGR) to
+              hybrid dynamic systems that interact through continuous
+              state variables. We use simulation relations for timed
+              transition systems to analyze compositions of hybrid I/O
+              automata. This makes it possible to perform
+              compositional reasoning that is conservative in the
+              sense of over approximating the composed behaviors. In
+              contrast to previous approaches that require global
+              receptivity conditions, circularity is broken in our
+              approach by a state-based nonblocking condition that can
+              be checked in the course of computing the AGR simulation
+              relations. The proposed procedures for AGR are
+              implemented in a computational tool for the case of
+              linear hybrid I/O automata, and the approach is
+              illustrated with a simple example."
+}
+
+ at Inproceedings{Frehse05,
+  Author = "G. Frehse",
+  Title = "{PHAVer}: Algorithmic Verification of Hybrid Systems Past {HyTech}",
+  Booktitle = "Hybrid Systems: Computation and Control:
+               Proceedings of the 8th International Workshop (HSCC 2005)",
+  Address = "Z{\"u}rich, Switzerland",
+  Editor = "M. Morari and L. Thiele",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3414,
+  Pages = "258--273",
+  Year = 2005,
+  Abstract = "In 1995, HyTech broke new ground as a potentially
+              powerful tool for verifying hybrid systems --- yet it has
+              remained severely limited in its applicability to more
+              complex systems.  We address the main problems of HyTech
+              with PHAVer, a new tool for the exact verification of
+              safety properties of hybrid systems with piecewise
+              constant bounds on the derivatives.  Affine dynamics are
+              handled by on-the-fly overapproximation and by
+              partitioning the state space based on user-definable
+              constraints and the dynamics of the system.  PHAVer's
+              exact arithmetic is robust due to the use of the Parma
+              Polyhedra Library, which supports arbitrarily large
+              numbers. To manage the complexity of the polyhedral
+              computations, we propose methods to conservatively limit
+              the number of bits and constraints of polyhedra.
+              Experimental results for a navigation benchmark and a
+              tunnel diode circuit show the effectiveness of the
+              approach."
+}
+
+ at PhdThesis{Frehse05th,
+  Author = "G. Frehse",
+  Title = "Compositional Verification of Hybrid Systems
+           using Simulation Relations",
+  School = "Radboud Universiteit Nijmegen",
+  Address = "Nijmegen, The Netherlands",
+  Month = oct,
+  Year = 2005,
+}
+
+ at Article{Frehse08,
+  Author = "G. Frehse",
+  Title = "{PHAVer}: Algorithmic Verification of Hybrid Systems Past {HyTech}",
+  Journal = "Software Tools for Technology Transfer",
+  Publisher = "Springer-Verlag, Berlin",
+  Volume = 10,
+  Number = 3,
+  Year = 2008,
+  Pages = "263--279",
+  Abstract = "In 1995, HyTech broke new ground as a potentially
+              powerful tool for verifying hybrid systems --- yet its
+              appicability remains limited to relatively simple
+              systems. We address the main problems of HyTech with
+              PHAVer, a new tool for the exact verification of safety
+              properties of hybrid systems with piecewise constant
+              bounds on the derivatives. Affine dynamics are handled
+              by on-the-fly overapproximation, partitioning the state
+              space based on user-definable constraints and the
+              dynamics of the system. PHAVer features exact arithmetic
+              in a robust implementation that, based on the Parma
+              Polyhedra Library, supports arbitrarily large
+              numbers. To manage the complexity of the polyhedral
+              computations, we propose methods to conservatively limit
+              the number of bits and constraints of
+              polyhedra. Experimental results for a navigation
+              benchmark and a tunnel diode circuit show the
+              effectiveness of the approach."
+}
+
+ at Inproceedings{FrehseKRM06,
+  Author = "G. Frehse and B. H. Krogh and R. A. Rutenbar and O. Maler",
+  Title = "Time Domain Verification of Oscillator Circuit Properties",
+  Booktitle = "Proceedings of the First Workshop on Formal Verification
+               of Analog Circuits (FAC 2005)",
+  Address = "Edinburgh, Scotland",
+  Pages = "9--22",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 153,
+  Number = 3,
+  Year = 2006,
+  Abstract = "The application of formal methods to analog and mixed
+              signal circuits requires efficient methods for
+              constructing abstractions of circuit behaviors. This
+              paper concerns the verification of properties of
+              oscillator circuits. Generic monitor automata are
+              proposed to facilitate the application of hybrid system
+              reachability computations to characterize time domain
+              features of oscillatory behavior, such as bounds on the
+              signal amplitude and jitter. The approach is illustrated
+              for a nonlinear tunnel-diode circuit model using PHAVer,
+              a hybrid system analysis tool that provides sound
+              verification results based on linear hybrid automata
+              approximations and infinite precision computations."
+}
+
+ at Inproceedings{FrehseKR06,
+  Author = "G. Frehse and B. H. Krogh and R. A. Rutenbar",
+  Title = "Verifying Analog Oscillator Circuits Using Forward/Backward
+           Refinement",
+  Booktitle = "Proceedings of the 9th Conference on Design, Automation
+               and Test in Europe (DATE 06)",
+  Address = "Munich, Germany",
+  Publisher = "ACM SIGDA",
+  Year = 2006,
+  Note = "{CD-ROM} publication",
+  Abstract = "Properties of analog circuits can be verified formally
+              by partitioning the continuous state space and applying
+              hybrid system verification techniques to the resulting
+              abstraction.  To verify properties of oscillator
+              circuits, cyclic invariants need to be computed. Methods
+              based on forward reachability have proven to be
+              inefficient and in some cases inadequate in constructing
+              these invariant sets. In this paper we propose a novel
+              approach combining forward- and backward-reachability
+              while iteratively refining partitions at each step. The
+              technique can yield dramatic memory and runtime
+              reductions. We illustrate the effectiveness by
+              verifying, for the first time, the limit cycle
+              oscillation behavior of a third-order model of a
+              differential VCO circuit."
+}
+
+ at Inproceedings{FribourgK11,
+  author    = "L. Fribourg and U. K{\"u}hne",
+  title     = "Parametric Verification and Test Coverage for Hybrid Automata
+               Using the Inverse Method",
+  Booktitle = "In Proceedings of the 5th International Workshop
+               on Reachability Problems (RP 2011)",
+  Address = "Genova, Italy",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "G. Delzanno and I. Potapov",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-24287-8",
+  Pages =  "191--204",
+  Volume = 6945,
+  Year = 2011,
+  Abstract = "Hybrid systems combine continuous and discrete
+              behavior.  Hybrid Automata are a powerful formalism for
+              the modeling and verification of such systems. A common
+              problem in hybrid system verification is the good
+              parameters problem, which consists in identifying a set
+              of parameter valuations which guarantee a certain
+              behavior of a system. Recently, a method has been
+              presented for attacking this problem for Timed
+              Automata. In this paper, we show the extension of this
+              methodology for hybrid automata with linear and affine
+              dynamics. The method is demonstrated with a hybrid
+              system benchmark from the literature."
+}
+
+ at PhdThesis{Gobert07th,
+  Author = "F. Gobert",
+  Title = "Towards putting abstract interpretation of {Prolog} into practice:
+           design, implementation, and evaluation of a tool to verify
+           and optimise Prolog programs",
+  School = "Universit\'e catholique de Louvain",
+  Address = "Louvain-la-Neuve, Belgium",
+  Month = dec,
+  Year = 2007,
+  Abstract = "Logic programming is an attractive paradigm that allows
+              the programmer to concentrate on the meaning (the logic)
+              of the problem to be solved - the \emph{declarative layer}.
+              An execution model is then used as the problem solver - the
+              \emph{operational layer}. In practice, for efficiency reasons,
+              the semantics of the two layers do not always match. For
+              instance, in Prolog, the computation of solutions is based
+              on an incomplete depth-first search rule, unifications and
+              negations may be unsound, some builtin language primitives
+              are not multidirectional, and there exist extralogical
+              features like the cut or dynamic predicates. A large number
+              of work has been realised to reconcile the declarative and
+              operational features of Prolog. Methodologies have been
+              proposed to construct operationally correct and efficient
+              Prolog code. Researchers have designed methods to automate
+              the verification of specific operational properties on which
+              optimisation of logic programs can be based. A few tools have
+              been implemented but there is a lack of a unified framework.
+              The goal and topic of this thesis is the design, implementation,
+              and evaluation of a static analyser of Prolog programs to
+              integrate `state-of-the-art' techniques into a unified abstract
+              interpretation framework. Abstract interpretation is an
+              adequate methodology to design, justify, and combine complex
+              analyses. The analyser that we present in this thesis is based
+              on a non-implemented original proposal. The original framework
+              defines the notion of \emph{abstract sequence}, which allows
+              one to verify many desirable operational properties of a logic
+              procedure. The properties include verifying type, mode, and
+              sharing of terms, proving termination, sure success or failure,
+              and determinacy of logic procedures, as well as linear
+              relations between the size of input/output terms and the
+              number of solutions to a call. An abstract sequence maintains
+              information about the input and output terms, as well as the
+              non-failure conditions on input terms, and the number of
+              solutions for such inputs. The domains of abstract sequences
+              cooperate together and improve each other. The abstract
+              execution is performed during a single global analysis,
+              and abstract sequences are derived at each program point
+              (the information of the various domains are computed
+              simultaneously). The intended operational properties of a
+              procedure are written in formal specifications.
+              The original framework is an interesting starting point for
+              combining several analyses inside a unified framework.
+              However, it is limited and inaccurate in many ways: it is
+              not implemented, and therefore, it has not been validated
+              by experiments, it accepts only a subset of Prolog (without
+              negation, cut, conditional and disjunctive constructs), and
+              some of the proposed domains are not precise enough.
+              The basic framework is only oriented towards the verification
+              of Prolog programs, but it cannot always prove the desirable
+              properties. In this thesis, we implement and evaluate the
+              basic framework, and, more importantly, we overcome its
+              limitations to make it accurate and usable in practice:
+              the improved framework accepts any Prolog program with modules,
+              new abstract domains and operations are added, and the
+              language of specifications is more expressive. We also
+              design and implement an optimiser that generates specialised
+              code. Optimisation is essential in Prolog, but it is not easy
+              to perform by hand and it is error prone. The optimiser uses
+              the information to safely apply source-to-source
+              transformations. Code transformations include clause and
+              literal reordering, introduction of cuts, and removal
+              of redundant literals. The optimiser follows a precise
+              strategy to choose the most rewarding transformations in best
+              order.
+              This thesis shows the feasibility of a unified framework
+              that integrates many complex analyses in a single global
+              analysis. Practically and theoretically, a single global
+              analysis is more attractive than a combination of a lot of
+              separate analyses and frameworks. Many extensions have been
+              performed to obtain an accurate and usable tool devoted to
+              verification and optimisation of Prolog programs."
+}
+
+ at Inproceedings{GobertLC07,
+  Author = "F. Gobert and B. {Le Charlier}",
+  Title = "A System to Check Operational Properties of Logic Programs",
+  Pages = "245--259",
+  Booktitle = "Approches Formelles dans l'Assistance au D\'eveloppement
+               de Logiciels: Actes de la 8e conf\'erence",
+  Publisher = "Universit\'e de Namur, Belgium",
+  Editor = "M.-L. Potet and P.-Y. Schobbens and H. Toussaint and G. Saval",
+  Year = 2007,
+  ISBN = "978-2-87037-559-4",
+  Abstract = "An implemented static analyser of logic programs is presented.
+              The system is based on a unied abstract interpretation
+              framework, which allows the integration of several analyses
+              devoted to verication and optimisation. The analyser is able
+              to verify many desirable properties of logic programs executed
+              with the search-rule and other specic features of Prolog.
+              Such operational properties include verifying type, mode,
+              sharing, and linearity of terms, proving termination,
+              occur-check freeness, sure success or failure, and determinacy
+              of logic procedures, as well as linear relations between the
+              size of input/output terms and the number of solutions to a
+              call. It is emphasized how each analysis may contribute to
+              each other.",
+}
+
+ at Inproceedings{GonnordH06,
+  Author = "L. Gonnord and N. Halbwachs",
+  Title = "Combining Widening and Acceleration in Linear Relation Analysis",
+  Booktitle = "Static Analysis:
+               Proceedings of the 13th International Symposium",
+  Address = "Seoul, Korea",
+  Editor = "K. Yi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4134,
+  Pages = "144--160",
+  Year = 2006,
+  ISBN = "3-540-37756-5",
+  Abstract = "Linear Relation Analysis [CH78,Hal79] is one of the
+              first, but still one of the most powerful, abstract
+              interpretations working in an infinite lattice. As such,
+              it makes use of a widening operator to enforce the
+              convergence of fixpoint computations. While the
+              approximation due to widening can be arbitrarily refined
+              by delaying the application of widening, the analysis
+              quickly becomes too expensive with the increase of
+              delay. Previous attempts at improving the precision of
+              widening are not completely satisfactory, since none of
+              them is guaranteed to improve the precision of the
+              result, and they can nevertheless increase the cost of
+              the analysis. In this paper, we investigate an
+              improvement of Linear Relation Analysis consisting in
+              computing, when possible, the exact (abstract) effect of
+              a loop. This technique is fully compatible with the use
+              of widening, and whenever it applies, it improves both
+              the precision and the performance of the analysis.",
+}
+
+ at PhdThesis{Gopan07th,
+  Author = "D. Gopan",
+  Title = "Numeric Program Analysis Techniques with Applications
+           to Array Analysis and Library Summarization",
+  School = "University of Wisconsin",
+  Address = "Madison, Wisconsin, USA",
+  Month = aug,
+  Year = 2007,
+  Abstract = "Numeric program analysis is of great importance for the
+              areas of software engineering, software
+              verification, and security: to identify many program
+              errors, such as out-of-bounds array accesses and
+              integer overflows, which constitute the lion's share
+              of security vulnerabilities reported by CERT, an
+              analyzer needs to establish numeric properties of
+              program variables. Many important program analyses,
+              such as low-level code analysis, memory-cleanness
+              analysis, and shape analysis, rely in some ways on
+              numeric-program-analysis techniques. However,
+              existing numeric abstractions are complex (numeric
+              abstract domains are typically non-distributive, and
+              form infinite-height lattices); thus, obtaining
+              precise numeric-analysis results is by no means a
+              trivial undertaking.
+              In this thesis, we develop a suite of techniques with
+              the common goal of improving the precision and applicability
+              of numeric program analysis. The techniques address
+              various aspects of numeric analysis, such as
+              handling dynamically-allocated memory, dealing with
+              programs that manipulate arrays, improving the
+              precision of extrapolation (widening), and
+              performing interprocedural analysis. The techniques
+              use existing numeric abstractions as building
+              blocks. The communication with existing abstractions
+              is done strictly through a generic abstract-domain
+              interface. The abstractions constructed by our
+              techniques also expose that same interface, and
+              thus, are compatible with existing analysis
+              engines. As a result, our techniques are independent
+              from specific abstractions and specific analysis
+              engines, can be easily incorporated into existing
+              program-analysis tools, and should be readily
+              compatible with new abstractions to be introduced in
+              the future.
+              A practical application of numeric analysis that we consider
+              in this thesis is the automatic generation of summaries for
+              library functions from their low-level
+              implementation (that is, from a library's
+              binary). The source code for library functions is
+              typically not available. This poses a stumbling
+              block for many source-level program
+              analyses. Automatic generation of summary functions
+              will both speed up and improve the accuracy of
+              library-modeling, a process that is currently
+              carried out by hand. This thesis addresses the
+              automatic generation of summaries for memory-safety
+              analysis."
+}
+
+ at Inproceedings{GopanR06,
+  Author = "D. Gopan and T. W. Reps",
+  Title = "Lookahead Widening",
+  Booktitle = "Computer Aided Verification:
+               Proceedings of the 18th International Conference (CAV 2006)",
+  Address = "Seattle, Washington, USA",
+  Editor = "T. Ball and R. B. Jones",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4144,
+  Pages = "452--466",
+  Year = 2006,
+  Abstract = "We present \emph{lookahead widening}, a novel technique
+              for using existing widening and narrowing operators to
+              improve the precision of static analysis. This technique
+              is both self-contained and fully-automatic in the sense
+              that it does not rely on separate analyzes or human
+              involvement. We show how to integrate lookahead widening
+              into existing analyzers with minimal
+              effort. Experimental results indicate that the technique
+              is able to achieve sizable precision improvements at
+              reasonable costs.",
+}
+
+ at Inproceedings{GopanR07a,
+  Author = "D. Gopan and T. W. Reps",
+  Title = "Low-Level Library Analysis and Summarization",
+  Booktitle = "Computer Aided Verification:
+               Proceedings of the 19th International Conference (CAV 2007)",
+  Address = "Berlin, Germany",
+  Editor = "W. Damm and H. Holger",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4590,
+  Pages = "68--81",
+  Year = 2007,
+  ISBN = "3-540-73367-6",
+  Abstract = "Programs typically make extensive use of libraries,
+              including dynamically linked libraries, which are often
+              not available in source-code form, and hence not
+              analyzable by tools that work at source level (i.e.,
+              that analyze intermediate representations created from
+              source code). A common approach is to write
+              \emph{library models} by hand. A library model is a
+              collection of function stubs and variable declarations
+              that capture some aspect of the library code's
+              behavior. Because these are hand-crafted, they are
+              likely to contain errors, which may cause an analysis to
+              return incorrect results.
+
+              This paper presents a method to construct summary
+              information for a library function automatically by
+              analyzing its low-level implementation (i.e., the
+              library's binary).",
+}
+
+ at Inproceedings{GopanR07b,
+  Author = "D. Gopan and T. W. Reps",
+  Title = "Guided Static Analysis",
+  Booktitle = "Static Analysis:
+               Proceedings of the 14th International Symposium",
+  Address = "Kongens Lyngby, Denmark",
+  Editor = "G. Fil\'e and H. R. Nielson",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4634,
+  ISBN = "978-3-540-74060-5",
+  Pages = "349--365",
+  Year = 2007,
+  Abstract = "In static analysis, the semantics of the program is
+              expressed as a set of equations. The equations are
+              solved iteratively over some abstract domain. If the
+              abstract domain is distributive and satisfies the
+              ascending-chain condition, an iterative technique yields
+              the most precise solution for the equations. However, if
+              the above properties are not satisfied, the solution
+              obtained is typically imprecise. Moreover, due to
+              the properties of widening operators, the precision loss
+              is sensitive to the order in which the state-space is
+              explored.
+
+              In this paper, we introduce \emph{guided static analysis},
+              a framework for controlling the exploration of the
+              state-space of a program. The framework guides the
+              state-space exploration by applying standard
+              static-analysis techniques to a sequence of modified
+              versions of the analyzed program. As such, the framework
+              does not require any modifications to existing analysis
+              techniques, and thus can be easily integrated into
+              existing static-analysis tools.
+
+              We present two instantiations of the framework, which
+              improve the precision of widening in (i) loops with
+              multiple phases and (ii) loops in which the transformation
+              performed on each iteration is chosen non-deterministically.",
+}
+
+ at Inproceedings{GopanRS05,
+  Author = "D. Gopan and T. W. Reps and M. Sagiv",
+  Title = "A Framework for Numeric Analysis of Array Operations",
+  Booktitle = "Proceedings of the 32nd ACM SIGPLAN-SIGACT Symposium
+               on Principles of Programming Languages",
+  Address = "Long Beach, California, USA",
+  Pages = "338--350",
+  Year = 2005,
+  Abstract = "Automatic discovery of relationships among values of
+              array elements is a challenging problem due to the
+              unbounded nature of arrays. We present a framework for
+              analyzing array operations that is capable of capturing
+              numeric properties of array elements. In particular, the
+              analysis is able to establish that all array elements
+              are initialized by an array-initialization loop, as well
+              as to discover numeric constraints on the values of
+              initialized elements.  The analysis is based on the
+              combination of canonical abstraction and summarizing
+              numeric domains. We describe a prototype implementation
+              of the analysis and discuss our experience with applying
+              the prototype to several examples, including the
+              verification of correctness of an insertion-sort
+              procedure."
+}
+
+ at Inproceedings{BandaG10a,
+  Author = "G. Banda and J. P. Gallagher",
+  Title = "Constraint-Based Abstraction of a Model Checker
+           for Infinite State Systems",
+  Booktitle = "Proceedings of the 23rd Workshop on (Constraint)
+               Logic Programming (WLP 2009)",
+  Editor = "U. Geske and A. Wolf",
+  Address = "Potsdam, Germany",
+  Publisher = "Potsdam Universit{\"a}tsverlag",
+  Year = 2010,
+  Pages = "109--124",
+  Abstract = "Abstract interpretation-based model checking provides an
+              approach to verifying properties of infinite-state
+              systems. In practice, most previous work on abstract
+              model checking is either restricted to verifying
+              universal properties, or develops special techniques for
+              temporal logics such as modal transition systems or
+              other dual transition systems. By contrast we apply
+              completely standard techniques for constructing abstract
+              interpretations to the abstraction of a CTL semantic
+              function, without restricting the kind of properties
+              that can be verified.  Furthermore we show that this
+              leads directly to implementation of abstract model
+              checking algorithms for abstract domains based on
+              constraints, making use of an SMT solver."
+}
+
+ at Inproceedings{BandaG10b,
+  Author = "G. Banda and J. P. Gallagher",
+   Title = "Constraint-Based Abstract Semantics for Temporal Logic:
+            A Direct Approach to Design and Implementation",
+   Booktitle = "Proceedings of the 17th International Conference
+                on Logic for Programming,
+                Artificial Intelligence, and Reasoning (LPAR 2010)",
+   Address = "Yogyakarta, Indonesia",
+   Series = "Lecture Notes in Computer Science",
+   Editor = "E. Clarke and A. Voronkov",
+   Publisher = "Springer-Verlag, Berlin",
+   ISBN = "978-3-642-17510-7",
+   Year = 2010,
+   Pages =  "27--45",
+   Volume = 6355,
+   Abstract = "Abstract interpretation provides a practical approach
+               to verifying properties of infinite-state systems. We
+               apply the framework of abstract interpretation to
+               derive an abstract semantic function for the modal ?
+               -calculus, which is the basis for abstract model
+               checking. The abstract semantic function is constructed
+               directly from the standard concrete semantics together
+               with a Galois connection between the concrete
+               state-space and an abstract domain. There is no need
+               for mixed or modal transition systems to abstract
+               arbitrary temporal properties, as in previous work in
+               the area of abstract model checking. Using the modal ?
+               -calculus to implement CTL, the abstract semantics
+               gives an over-approximation of the set of states in
+               which an arbitrary CTL formula holds. Then we show that
+               this leads directly to an effective implementation of
+               an abstract model checking algorithm for CTL using
+               abstract domains based on linear constraints. The
+               implementation of the abstract semantic function makes
+               use of an SMT solver. We describe an implemented system
+               for proving properties of linear hybrid automata and
+               give some experimental results."
+}
+
+ at Inproceedings{Grosser09,
+  Author = "T. Grosser",
+  Title = "Optimization opportunities based on the polyhedral model in
+           {GRAPHITE}. How much impact has {GRAPHITE} already?",
+  Booktitle = "Proceedings of the {GCC} Developers' Summit",
+  Address = "Montreal, Quebec, Canada",
+  Year = 2009,
+  Month = jun,
+  Pages = "33--46",
+  URL = "http://www.gccsummit.org/2009/gcc09-proceedings.pdf",
+  Abstract = "The polytope model is used since many years to describe
+              standard loop optimizations like blocking, interchange
+              or fusion, but also advanced memory access optimizations
+              and automatic parallelization. Its exact mathematical
+              description of memory accesses and loop iterations
+              allows to concentrate on the optimization problem and to
+              take advantage of professional problem solving tools
+              developed for operational research.  Up to today the
+              polytope model was limited to research compilers or
+              source to source transformations. Graphite generates a
+              polytope description of all programs compiled by the
+              gcc. Therefore polytope optimization techniques are not
+              limited anymore to hand selected code pieces, but can
+              actually be applied in large scale on real world
+              programs. By showing the impact of GRAPHITE on important
+              benchmarks --- ``How much runtime is actually spent in
+              code, that can be optimized by polytope optimization
+              techniques?'' --- we invite people to base their current
+              polytope research on GRAPHITE to make these
+              optimizations available to the large set of gcc compiled
+              applications."
+}
+
+ at Inproceedings{GulavaniR06,
+  Author = "B. S. Gulavani and S. K. Rajamani",
+  Title = "Counterexample Driven Refinement for Abstract Interpretation",
+  Booktitle = "Proceedings of the 12th International Conference on
+               Tools and Algorithms for the Construction and Analysis
+               of Systems (TACAS 2006)",
+  Address = "Vienna, Austria",
+  Editor = "H. Hermanns and J. Palsberg",
+  Pages = "474--488",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3920,
+  Year = 2006,
+  ISBN = "3-540-33056-9",
+  Abstract = "Abstract interpretation techniques prove properties of
+              programs by computing abstract fixpoints. All such
+              analyses suffer from the possibility of false errors. We
+              present a new counterexample driven refinement technique
+              to reduce false errors in abstract interpretations.  Our
+              technique keeps track of the precision losses during
+              forward fixpoint computation, and does a precise
+              backward propagation from the error to either confirm
+              the error as a true error, or identify a refinement so
+              as to avoid the false error.  Our technique is quite
+              simple, and is independent of the specific abstract
+              domain used. An implementation of our technique for
+              affine transition systems is able to prove invariants
+              generated by the StInG tool [19] without doing any
+              specialized analysis for linear relations. Thus, we hope
+              that the technique can work for other abstract domains
+              as well.We sketch how our technique can be used to
+              perform shape analysis by simply defining an appropriate
+              widening operator over shape graphs."
+}
+
+ at Inproceedings{GulwaniL-AS09,
+  Author = "S. Gulwani and T. Lev-Ami and S. Sagiv",
+  Title = "A Combination Framework for Tracking Partition Sizes",
+  Booktitle = "Proceedings of the 36th ACM SIGPLAN-SIGACT Symposium on
+               Principles of Programming Languages (POPL 2009)",
+  Address = "Savannah, Georgia, USA",
+  Editor = "Z. Shao and B. C. Pierce",
+  Publisher = "ACM Press",
+  Pages = "239--251",
+  Year = 2009,
+  ISBN = "978-1-60558-379-2",
+  Abstract = "We describe an abstract interpretation based framework
+              for proving relationships between sizes of memory
+              partitions. Instances of this framework can prove
+              traditional properties such as memory safety and program
+              termination but can also establish upper bounds on usage
+              of dynamically allocated memory. Our framework also
+              stands out in its ability to prove properties of
+              programs manipulating both heap and arrays which is
+              considered a difficult task.  Technically, we define an
+              abstract domain that is parameterized by an abstract
+              domain for tracking memory partitions (sets of memory
+              locations) and by a numerical abstract domain for
+              tracking relationships between cardinalities of the
+              partitions. We describe algorithms to construct the
+              transfer functions for the abstract domain in terms of
+              the corresponding transfer functions of the
+              parameterized abstract domains.  A prototype of the
+              framework was implemented and used to prove interesting
+              properties of realistic programs, including programs
+              that could not have been automatically analyzed before."
+}
+
+ at Article{HalbwachsMG06,
+  Author = "N. Halbwachs and D. Merchat and L. Gonnord",
+  Title = "Some Ways To Reduce the Space Dimension in Polyhedra Computations",
+  Journal = "Formal Methods in System Design",
+  Publisher = "Springer Netherlands",
+  Volume = 29,
+  Number = 1,
+  Pages = "79--95",
+  Year = 2006,
+  Abstract = "Convex polyhedra are often used to approximate sets of
+              states of programs involving numerical variables. The
+              manipulation of convex polyhedra relies on the so-called
+              \emph{double description}, consisting of viewing a
+              polyhedron both as the set of solutions of a system of
+              linear inequalities, and as the convex hull of a
+              \emph{system of generators}, i.e., a set of vertices and
+              rays. The cost of these manipulations is highly
+              dependent on the number of numerical variables, since
+              the size of each representation can be exponential in
+              the dimension of the space. In this paper, we
+              investigate some ways for reducing the dimension: On one
+              hand, when a polyhedron satisfies \emph{affine
+              equations}, these equations can obviously be used to
+              eliminate some variables. On the other hand, when groups
+              of variables are unrelated with each other, this means
+              that the polyhedron is in fact a \emph{Cartesian
+              product} of polyhedra of lower dimensions. Detecting
+              such Cartesian factoring is not very difficult, but we
+              adapt also the operations to work on Cartesian
+              products. Finally, we extend the applicability of
+              Cartesian factoring by applying suitable \emph{variable
+              change}, in order to maximize the factoring."
+}
+
+ at Inproceedings{HalbwachsMP-V03,
+  Author = "N. Halbwachs and D. Merchat and C. Parent-Vigouroux",
+  Title = "Cartesian Factoring of Polyhedra in Linear Relation Analysis",
+  Booktitle = "Static Analysis:
+               Proceedings of the 10th International Symposium",
+  Address = "San Diego, California, USA",
+  Editor = "R. Cousot",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2694,
+  Year = 2003,
+  Pages = "355--365",
+  Abstract = "Linear Relation Analysis [CH78] suffers from the cost of
+              operations on convex polyhedra, which can be exponential
+              with the number of involved variables. In order to
+              reduce this cost, we propose to detect when a polyhedron
+              is a Cartesian product of polyhedra of lower dimensions,
+              i.e., when groups of variables are unrelated with each
+              other. Classical operations are adapted to work on such
+              factored polyhedra. Our implementation shows encouraging
+              experimental results."
+}
+
+ at Inproceedings{HenriksenG06,
+  Author = "K. S. Henriksen and J. P. Gallagher",
+  Title = "Abstract Interpretation of {PIC} Programs
+           through Logic Programming",
+  Booktitle = "Proceedings of the 6th IEEE International Workshop
+               on Source Code Analysis and Manipulation",
+  Address = "Sheraton Society Hill, Philadelphia, PA, USA",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "184--196",
+  Year = 2006,
+  Abstract = "A logic based general approach to abstract
+              interpretation of low-level machine programs is
+              reported. It is based on modelling the behavior of the
+              machine as a logic program.  General purpose program
+              analysis and transformation of logic programs, such as
+              partial evaluation and convex hull analysis, are applied
+              to the logic based model of the machine.
+
+              A small PIC microcontroller is used as a case study. An
+              emulator for this microcontroller is written in Prolog,
+              and standard programming transformations and analysis
+              techniques are used to specialise this emulator with
+              respect to a given PIC program. The specialised emulator
+              can now be further analysed to gain insight into the
+              given program for the PIC microcontroller.
+
+              The method describes a general framework for applying
+              abstractions, illustrated here by linear constraints and
+              convex hull analysis, to logic programs. Using these
+              techniques on the specialised PIC emulator, it is
+              possible to obtain constraints on and linear relations
+              between data registers, enabling detection of for
+              instance overflows, branch conditions and so on."
+}
+
+ at PhdThesis{Henriksen07th,
+  Author = "K. S. Henriksen",
+  Title = "A Logic Programming Based Approach to Applying
+           Abstract Interpretation to Embedded Software",
+  School = "Computer Science, Roskilde University",
+  Month = oct,
+  Address = "Roskilde, Denmark",
+  Year = 2007,
+  Note = "Published as Computer Science Research Report \#117",
+  Abstract = "Abstract interpretation is a general framework for
+              static program analysis. In recent years this framework
+              has been used outside academia for verification of
+              embedded and real-time systems. Airbus and the European
+              Space Agency are examples of organisations that have
+              successfully adapted this analysis framework
+              for verification of critical components.
+              Logic programming is a programming paradigm with a sound
+              mathematical foundation. One of its characteristics is
+              the separation of logic (the meaning of a program) and
+              control (how it is executed); hence logic programming,
+              and in particular its extension with constraints, is a
+              language comparatively well suited for program analysis.
+              In this thesis logic programming is used to analyse
+              software developed for embedded systems. The particular
+              embedded system is modeled as an emulator written as a
+              constraint logic program. The emulator is specialised
+              with respect to some object program in order to obtain
+              a constraint logic program isomorphic to this object
+              program. Applying abstract interpretation based
+              analysers to the specialised emulator will provide
+              analysis results that can directly be related back
+              to the object program due to the isomorphism maintained
+              between the object program and the specialised emulator.
+              Two abstract interpretation based analysers for logic
+              programs have been developed.  The first is a convex
+              polyhedron analyser for constraint logic programs
+              implementing a set of widening techniques for improved
+              precision of the analysis.  The second analyser is a type
+              analysis tool for logic programs that automatically
+              derives a pre-interpretation from a regular type definition.
+              Additionallly, a framework for using a restricted form of
+              logic programming, namely Datalog, to express and check
+              program properties is described.  At the end of the thesis
+              it is shown how instrumenting the semantics of the emulator
+              can be used to obtain, for instance, a fully automatic
+              Worst Case Execution Time analysis by applying the convex
+              polyhedron analyser to the instrumented and specialised
+              emulator.  The tools developed in this thesis have all
+              been made available online for demonstration."
+}
+
+ at Inproceedings{HymansU04,
+  Author = "C. Hymans and E. Upton",
+  Title = "Static Analysis of Gated Data Dependence Graphs",
+  Booktitle = "Static Analysis:
+               Proceedings of the 11th International Symposium",
+  Address = "Verona, Italy",
+  Editor = "R. Giacobazzi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3148,
+  Year = 2004,
+  Pages = "197--211",
+  Abstract = "Several authors have advocated the use of the gated data
+              dependence graph as a compiler intermediate
+              representation. If this representation is to gain
+              acceptance, it is important to show that we may
+              construct static analyses which operate directly on
+              it. In this paper we present the first example of such
+              an analysis, developed using the methodology of abstract
+              interpretation.  The analysis is shown to be sound with
+              respect to a concrete semantics for the representation.
+              Experimental results are presented which indicate that
+              the analysis performs well in comparison to conventional
+              techniques."
+}
+
+ at Article{JhalaM09,
+  Author = "R. Jhala and R. Majumdar",
+  Title = "Software Model Checking",
+  Journal = "ACM Computing Surveys",
+  Volume = 41,
+  Number = 4,
+  Year = 2009,
+  Pages = "1--54",
+  Publisher = "ACM Press",
+  Address = "New York, NY, USA",
+  Abstract = "We survey recent progress in software model checking."
+}
+
+ at Inproceedings{Jeannet10,
+  Author = "B. Jeannet",
+  Title = "Some Experience on the Software Engineering of
+           Abstract Interpretation Tools",
+  Booktitle = "Proceedings of Tools for Automatic Program AnalysiS
+               (TAPAS 2010)",
+  Address = "Perpignan, France",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 267,
+  Number = 2,
+  Pages =  "29--42",
+  Year = 2010,
+  ISSN = "1571-0661",
+  Abstract = "The ``right'' way of writing and structuring compilers is
+              well-known. The situation is a bit less clear for static
+              analysis tools. It seems to us that a static analysis
+              tool is ideally decomposed into three building blocks:
+              (1) a front-end, which parses programs, generates
+              semantic equations, and supervises the analysis process;
+              (2) a fixpoint equation solver, which takes equations
+              and solves them; (3) and an abstract domain, on which
+              equations are interpreted. The expected advantages of
+              such a modular structure is the ability of sharing
+              development efforts between analyzers for different
+              languages, using common solvers and abstract
+              domains. However putting in practice such ideal concepts
+              is not so easy, and some static analyzers merge for
+              instance the blocks (1) and (2).
+
+              We show how we instantiated these principles with three
+              different static analyzers (addressing resp. imperative
+              sequential programs, imperative concurrent programs, and
+              synchronous dataflow programs), a generic fixpoint
+              solver (Fixpoint), and two different abstract
+              domains. We discussed our experience on the advantages
+              and the limits of this approach compared to related
+              work."
+}
+
+ at Inproceedings{JeannetM09,
+  Author = "B. Jeannet and A. Min{\'e}",
+  Title = "Apron: A Library of Numerical Abstract Domains for Static
+           Analysis",
+  Booktitle = "Computer Aided Verification,
+               Proceedings of the 21st International Conference (CAV 2009)",
+  Address = "Grenoble, France",
+  Editor = "A. Bouajjani and O. Maler",
+  Publisher = "Springer",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5643,
+  Pages = "661--667",
+  Year = 2009,
+  ISBN = "978-3-642-02657-7",
+  Abstract = "This article describes \textsc{Apron}, a freely
+              available library dedicated to the static analysis of
+              the numerical variables of programs by abstract
+              interpretation. Its goal is threefold: provide analysis
+              implementers with ready-to-use numerical abstractions
+              under a unified API, encourage the research in numerical
+              abstract domains by providing a platform for integration
+              and comparison, and provide teaching and demonstration
+              tools to disseminate knowledge on abstract
+              interpretation."
+}
+
+ at Incollection {KhalilGP09,
+  Author = "G. Khalil and E. Goubault and S. Putot",
+  Title = "The Zonotope Abstract Domain {Taylor1+}",
+  Booktitle = "Computer Aided Verification",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "A. Bouajjani and O. Maler",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-02657-7",
+  Pages = "627--633",
+  Volume = 5643,
+  Year = 2009,
+  Abstract = "Static analysis by abstract interpretation [1] aims it
+              automatically inferring properties on the behaviour of
+              programs. We focus here on a specific kind of numerical
+              invariants: the set of values taken by numerical
+              variables, with a real numbers semantics, at each
+              control point of a program."
+}
+ at Incollection{KimGR07,
+  Author = "D. Kim and G. Gupta and S. V. Rajopadhye",
+  Title = "On Control Signals for Multi-Dimensional Time",
+  Booktitle = "Languages and Compilers for Parallel Computing",
+  Editor = "G. Alm{\'a}si and C. Ca\c{s}caval and P. Wu",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Year = 2007,
+  Volume = 4382,
+  Pages = "141--155",
+  ISBN = "978-3-540-72520-6",
+  Note = "Revised papers presented at the 19th International Workshop
+          on Languages and Compilers for Parallel Computing (LCPC 2006),
+          New Orleans, Louisiana, USA, November 2--4, 2006",
+  Abstract = "Affine control loops (ACLs) comprise an important class
+              of compute- and data-intensive computations. The
+              theoretical framework for the automatic parallelization
+              of ACLs is well established. However, the hardware
+              compilation of arbitrary ACLs is still in its
+              infancy. An important component for an efficient
+              hardware implementation is a control mechanism that
+              informs each processing element (PE) which computation
+              needs to be performed and when.  We formulate this
+              \emph{control signal problem} in the context of
+              compiling arbitrary ACLs parallelized with a
+              multi-dimensional schedule into hardware.  We
+              characterize the logical time instants when PEs need a
+              control signal indicating which particular computations
+              need to be performed.  Finally, we present an algorithm
+              to compute the minimal set of logical time instants for
+              these control signals."
+}
+
+ at Inproceedings{KruegelKMRV05,
+  Author = "C. Kruegel and E. Kirda and D. Mutz and W. Robertson and G. Vigna",
+  Title = "Automating Mimicry Attacks Using Static Binary Analysis",
+  Booktitle = "Proceedings of Security~'05,
+               the 14th USENIX Security Symposium",
+  Address = "Baltimore, MD, USA",
+  Year = 2005,
+  Pages = "161--176",
+  Abstract = "Intrusion detection systems that monitor sequences of
+              system calls have recently become more sophisticated in
+              defining legitimate application behavior. In particular,
+              additional information, such as the value of the program
+              counter and the configuration of the program's call
+              stack at each system call, has been used to achieve
+              better characterization of program behavior. While there
+              is common agreement that this additional information
+              complicates the task for the attacker, it is less clear
+              to which extent an intruder is constrained.
+              In this paper, we present a novel technique to evade the
+              extended detection features of state-of-the-art
+              intrusion detection systems and reduce the task of the
+              intruder to a traditional mimicry attack. Given a
+              legitimate sequence of system calls, our technique
+              allows the attacker to execute each system call in the
+              correct execution context by obtaining and relinquishing
+              the control of the application's execution flow through
+              manipulation of code pointers.
+              We have developed a static analysis tool for Intel x86
+              binaries that uses symbolic execution to automatically
+              identify instructions that can be used to redirect
+              control flow and to compute the necessary modifications
+              to the environment of the process. We used our tool to
+              successfully exploit three vulnerable programs and evade
+              detection by existing state-of-the-art system call
+              monitors. In addition, we analyzed three real-world
+              applications to verify the general applicability of our
+              techniques."
+}
+
+ at Inproceedings{LagoonMS03,
+  Author = "V. Lagoon and F. Mesnard and P. J. Stuckey",
+  Title = "Termination Analysis with Types Is More Accurate",
+  Booktitle = "Logic Programming: Proceedings of the
+               19th International Conference (ICLP 2003)",
+  Address = "Mumbai, India",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 2916,
+  Year = 2003,
+  Pages = "254--268",
+  Abstract = "In this paper we show how we can use size and groundness
+              analyses lifted to regular and (polymorphic)
+              Hindley/Milner typed programs to determine more accurate
+              termination of (type correct) programs. Type information
+              for programs may be either inferred automatically or
+              declared by the programmer. The analysis of the typed
+              logic programs is able to completely reuse a framework
+              for termination analysis of untyped logic programs by
+              using abstract compilation of the type abstraction. We
+              show that our typed termination analysis is uniformly
+              more accurate than untyped termination analysis for
+              regularly typed programs, and demonstrate how it is able
+              to prove termination of programs which the untyped
+              analysis can not."
+}
+
+ at Inproceedings{LavironL09,
+  Author = "V. Laviron and F. Logozzo",
+  Title = "SubPolyhedra: A (More) Scalable Approach to Infer Linear
+           Inequalities",
+  Booktitle = "Verification, Model Checking, and Abstract Interpretation:
+               Proceedings of the 10th International Conference (VMCAI 2009)",
+  Address = "Savannah, Georgia, USA",
+  Editor = "N. D. Jones and M. M{\"u}ller-Olm",
+  Pages = "229--244",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5403,
+  Year = 2009,
+  ISBN = "978-3-540-93899-6",
+  Abstract = "We introduce Subpolyhedra (\textsf{SubPoly}) a new
+              numerical abstract domain to infer and propagate linear
+              inequalities. \textsf{SubPoly} is as expressive as
+              Polyhedra, but it drops some of the deductive power to
+              achieve scalability. \textsf{SubPoly} is based on the
+              insight that the reduced product of linear equalities
+              and intervals produces powerful yet scalable analyses.
+              Precision can be recovered using hints. Hints can be
+              automatically generated or provided by the user in the
+              form of annotations.  We implemented \textsf{SubPoly} on
+              the top of \texttt{Clousot}, a generic abstract
+              interpreter for \texttt{.Net}. \texttt{Clousot} with
+              \textsf{SubPoly} analyzes very large and complex code
+              bases in few minutes. \textsf{SubPoly} can efficiently
+              capture linear inequalities among hundreds of variables,
+              a result well-beyond state-of-the-art implementations of
+              Polyhedra."
+}
+
+ at Inproceedings{LeconteB06,
+  Author = "M. Leconte and B. Berstel",
+  Title = "Extending a {CP} Solver with Congruences
+           as Domains for Program Verification",
+  Booktitle = "Proceedings of the 1st workshop on Constraints
+               in Software Testing, Verification and Analysis (CSTVA '06)",
+  Address = "Nantes, France",
+  Editor = "B. Blanc and A. Gotlieb and C. Michel",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "22--33",
+  Year = 2006,
+  Abstract = "Constraints generated for Program Verification tasks
+              very often involve integer variables ranging on all the
+              machine-representable integer values. Thus, if the
+              propagation takes a time that is linear in the size of
+              the domains, it will not reach a fix point in practical
+              time.  Indeed, the propagation time needed to reduce the
+              interval domains for as simple equations as $x = 2y + 1$
+              and $x = 2z$ is proportional to the size of the initial
+              domains of the variables. To avoid this \emph{slow
+              convergence} phenomenon, we propose to enrich a
+              Constraint Programming Solver (CP Solver) with
+              \emph{congruence domains}. This idea has been introduced
+              by [Granger, P.: Static analysis of arithmetic congruences.
+              International Journal of Computer Math (1989) 165--199]
+              in the abstract interpretation community and we show how
+              a CP Solver can benefit from it, for example in
+              discovering immediately that $12x + |y| = 3$ and
+              $4z + 7y = 0$ have no integer solution.",
+  Note = "Available at
+          \url{http://www.irisa.fr/manifestations/2006/CSTVA06/}."
+}
+
+ at Inproceedings{LimeRST09,
+  Author = "D. Lime and O. H. Roux and C. Seidner and L.-M. Traonouez",
+  Title = "Romeo: A Parametric Model-Checker for {Petri} Nets
+           with Stopwatches",
+  Booktitle = "Proceedings of the 15th International Conference
+               Tools and Algorithms for the Construction and Analysis
+               of Systems (TACAS 2009)",
+  Address = "York, UK",
+  Editor = "S. Kowalewski and A. Philippou",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5505,
+  Pages = "54--57",
+  Year = 2009,
+  ISBN = "978-3-642-00767-5",
+  Abstract = "Last time we reported on Romeo, analyses with this tool
+              were mostly based on translations to other tools. This
+              new version provides an integrated TCTL model-checker
+              and has gained in expressivity with the addition of
+              parameters. Although there exists other tools to compute
+              the state-space of stopwatch models, Romeo is the first
+              one that performs TCTL model-checking on stopwatch
+              models. Moreover, it is the first tool that performs
+              TCTL model-checking on timed parametric models. Indeed,
+              Romeo now features an efficient model-checking of time
+              Petri nets using the Uppaal DBM Library, the
+              model-checking of stopwatch Petri nets and parametric
+              stopwatch Petri nets using the Parma Polyhedra Library
+              and a graphical editor and simulator of these
+              models. Furthermore, its audience has increased leading
+              to several industrial contracts. This paper reports on
+              these recent developments of Romeo."
+}
+
+ at Inproceedings{LogozzoF08,
+  Author = "F. Logozzo and M. F{\"a}hndrich",
+  Title = "Pentagons: A Weakly Relational Abstract Domain for the
+           Efficient Validation of Array Accesses",
+  Booktitle = "Proceedings of the 2008 ACM Symposium on Applied Computing
+               (SAC 2008)",
+  Address = "Fortaleza, Cear\'a, Brazil",
+  Aditor = "R. L. Wainwright and H. Haddad",
+  Year = 2008,
+  Pages = "184--188",
+  Publisher = "ACM Press",
+  ISBN = "978-1-59593-753-7",
+  Abstract = "We introduce Pentagons (\textsf{Pntg}), a weakly
+              relational numerical abstract domain useful for the
+              validation of array accesses in byte-code and
+              intermediate languages (IL). This abstract domain
+              captures properties of the form of
+              $x \in [a. b] \wedge x < y$. It is more precise than the
+              well known Interval domain, but it is less precise than
+              the Octagon domain.  The goal of \textsf{Pntg} is to be
+              a lightweight numerical domain useful for adaptive
+              static analysis, where \textsf{Pntg} is used to quickly
+              prove the safety of most array accesses, restricting the
+              use of more precise (but also more expensive) domains to
+              only a small fraction of the code.  We implemented the
+              \textsf{Pntg} abstract domain in \texttt{Clousot}, a
+              generic abstract interpreter for .NET assemblies. Using
+              it, we were able to validate 83\% of array accesses in
+              the core runtime library \texttt{mscorlib.dll} in less
+              than 8 minutes."
+}
+
+ at Inproceedings{MakhloufK06,
+  Author = "I. B. Makhlouf and S. Kowalewski",
+  Title = "An Evaluation of Two Recent Reachability Analysis Tools
+           for Hybrid Systems",
+  Booktitle = "Proceedings of the 2nd IFAC Conference on Analysis
+               and Design of Hybrid Systems",
+  Address = "Alghero, Italy",
+  Editor = "C. Cassandras and A. Giua and C. Seatzu and J. Zaytoon",
+  Publisher = "Elsevier Science B.V.",
+  Year = 2006,
+  Abstract = "The hybrid systems community is still struggling to
+              provide practically applicable verification
+              tools. Recently, two new tools, PHAVer and Hsolver, were
+              introduced which promise to be a further step in this
+              direction. We evaluate and compare both tools with the
+              help of several benchmark examples. The results show
+              that both have their strengths and weaknesses, and that
+              there still is no all-purpose reachability analysis tool
+              for hybrid systems."
+}
+
+ at Inproceedings{ManevichSRF04,
+  Author = "R. Manevich and M. Sagiv and G. Ramalingam and J. Field",
+  Title = "Partially Disjunctive Heap Abstraction",
+  Booktitle = "Static Analysis:
+               Proceedings of the 11th International Symposium",
+  Address = "Verona, Italy",
+  Editor = "R. Giacobazzi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3148,
+  Year = 2004,
+  Pages = "265--279",
+  Abstract = "One of the continuing challenges in abstract
+              interpretation is the creation of abstractions that
+              yield analyses that are both tractable and precise
+              enough to prove interesting properties about real-world
+              programs. One source of difficulty is the need to handle
+              programs with different behaviors along different
+              execution paths. Disjunctive (powerset) abstractions
+              capture such distinctions in a natural way. However, in
+              general, powerset abstractions increase the space and
+              time by an exponential factor. Thus, powerset
+              abstractions are generally perceived as being very
+              costly. In this paper we partially address this
+              challenge by presenting and empirically evaluating a new
+              heap abstraction. The new heap abstraction works by
+              merging shape descriptors according to a partial
+              isomorphism similarity criteria, resulting in a
+              partially disjunctive abstraction. We implemented this
+              abstraction in TVLA --- a generic system for
+              implementing program analyses. We conducted an empirical
+              evaluation of the new abstraction and compared it with
+              the powerset heap abstraction. The experiments show that
+              analyses based on the partially disjunctive abstraction
+              are as precise as the ones based on the fully
+              disjunctive abstraction. In terms of performance,
+              analyses based on the partially disjunctive abstraction
+              are often superior to analyses based on the fully
+              disjunctive heap abstraction. The empirical results show
+              considerable speedups, up to 2 orders of magnitude,
+              enabling previously non-terminating analyses, such as
+              verification of the Deutsch-Schorr-Waite marking
+              algorithm, to terminate with no negative effect on the
+              overall precision. Indeed, experience indicates that the
+              partially disjunctive shape abstraction improves
+              performance across all TVLA analyses uniformly, and in
+              many cases is essential for making precise shape
+              analysis feasible."
+}
+
+ at Techreport{McCloskeyS09TR,
+  Author = "B. McCloskey and M. Sagiv",
+  Title = "Combining Quantified Domains",
+  Number = "EECS-2009-106",
+  Year = 2009,
+  Month = jul,
+  Institution = "EECS Department University of California",
+  Address = "Berkeley USA",
+  URL = "http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-106.pdf",
+  Abstract = "We develop general algorithms for reasoning about
+              numerical properties of programs manipulating the heap
+              via pointers. We automatically infer quantified
+              invariants regarding unbounded sets of memory locations
+              and unbounded numeric values. As an example, we can
+              infer that for every node in a data structure, the
+              node's length field is less than its capacity field. We
+              can also infer per-node statements about cardinality,
+              such as that each node's count field is equal to the
+              number of elements reachable from it. This additional
+              power allows us to prove properties about reference
+              counted data structures and B-trees that were previously
+              unattainable. Besides the ability to verify more
+              programs, we believe that our work sheds new light on
+              the interaction between heap and numerical reasoning.
+
+              Our algorithms are parametric in the heap and the
+              numeric abstractions. They permit heap and numerical
+              abstractions to be combined into a single abstraction
+              while maintaining correlations between these
+              abstractions. In certain combinations not involving
+              cardinality, we prove that our combination technique is
+              complete, which is surprising in the presence of
+              quantification."
+}
+
+ at PhdThesis{Meijer10th,
+  Author = "S. Meijer",
+  Title = "Transformations for Polyhedral Process Networks",
+  School = "Leiden Institute of Advanced Computer Science (LIACS),
+            Faculty of Science, Leiden University",
+  Address = "Leiden, The Netherlands",
+  Year = 2010,
+  ISBN = "978-90-9025792-1",
+  Abstract = "We use the polyhedral process network (PPN) model of
+              computation to program and map streaming applications
+              onto embedded Multi-Processor Systems on Chip (MPSoCs)
+              platforms. The PPNs, which can be automatically derived
+              from sequential program applications, do not necessarily
+              meet the performance/resource constraints. A designer
+              can therefore apply the process splitting
+              transformations to increase program performance, and the
+              process merging transformation to reduce the number of
+              processes in a PPN. These transformations were defined,
+              but a designer had many possibilities to apply a
+              particular transformation, and these transformations can
+              also be ordered in many different ways. In this
+              dissertation, we define compile-time solution approaches
+              that assist the designer in evaluating and applying
+              process splitting and merging transformations in the
+              most effective way."
+}
+
+ at Article{MesnardB05TPLP,
+  Author = "F. Mesnard and R. Bagnara",
+  Title = "{cTI}: A Constraint-Based Termination Inference Tool
+           for {ISO-Prolog}",
+  Journal = "Theory and Practice of Logic Programming",
+  Publisher = "Cambridge University Press",
+  Address = "New York",
+  Volume = 5,
+  Number = "1{\&}2",
+  Pages = "243--257",
+  Year = 2005,
+  Abstract = "We present cTI, the first system for universal
+              left-termination inference of logic programs.
+              Termination inference generalizes termination analysis
+              and checking.  Traditionally, a termination analyzer
+              tries to prove that a given class of queries terminates.
+              This class must be provided to the system, for instance
+              by means of user annotations.  Moreover, the analysis
+              must be redone every time the class of queries of
+              interest is updated.  Termination inference, in
+              contrast, requires neither user annotations nor
+              recomputation.  In this approach, terminating classes
+              for all predicates are inferred at once.  We describe
+              the architecture of cTI and report an extensive
+              experimental evaluation of the system covering many
+              classical examples from the logic programming
+              termination literature and several Prolog programs of
+              respectable size and complexity."
+}
+
+ at Inproceedings{MonniauxG11,
+  Author = "D. Monniaux and J. {Le Guen}",
+  Title = "Stratified Static Analysis Based on Variable Dependencies",
+  Booktitle = "Proceedings of the Third International Workshop on
+               Numerical and Symbolic Abstract Domains (NSAD 2011)",
+  Address = "Venice, Italy",
+  Year = 2011,
+  URL = "http://arxiv.org/abs/1109.2405",
+  Abstract = "In static analysis by abstract interpretation, one often
+              uses \emph{widening operators} in order to enforce
+              convergence within finite time to an inductive
+              invariant. Certain widening operators, including the
+              classical one over finite polyhedra, exhibit an
+              unintuitive behavior: analyzing the program over a
+              subset of its variables may lead a more precise result
+              than analyzing the original program! In this article, we
+              present simple workarounds for such behavior."
+
+}
+
+ at Inproceedings{MoserKK07,
+  Author = "A. Moser and C. Kr{\"u}gel and E. Kirda",
+  Title = "Exploring Multiple Execution Paths for Malware Analysis",
+  Booktitle = "Proceedings of the 2007 IEEE Symposium on Security and Privacy
+               (S{\&}P 2007)",
+  Address = "Oakland, California, USA",
+  Publisher = "IEEE Computer Society Press",
+  Pages = "231--245",
+  Year = 2007,
+  Abstract = "Malicious code (or malware) is defined as software that
+              fulfills the deliberately harmful intent of an
+              attacker. Malware analysis is the process of determining
+              the behavior and purpose of a given malware sample (such
+              as a virus, worm, or Trojan horse). This process is a
+              necessary step to be able to develop effective detection
+              techniques and removal tools. Currently, malware
+              analysis is mostly a manual process that is tedious and
+              time-intensive. To mitigate this problem, a number of
+              analysis tools have been proposed that automatically
+              extract the behavior of an unknown program by executing
+              it in a restricted environment and recording the
+              operating system calls that are invoked.  The problem of
+              dynamic analysis tools is that only a single program
+              execution is observed. Unfortunately, however, it is
+              possible that certain malicious actions are only
+              triggered under specific circumstances (e.g., on a
+              particular day, when a certain file is present, or when
+              a certain command is received). In this paper, we
+              propose a system that allows us to explore multiple
+              execution paths and identify malicious actions that are
+              executed only when certain conditions are met. This
+              enables us to automatically extract a more complete view
+              of the program under analysis and identify under which
+              circumstances suspicious actions are carried out. Our
+              experimental results demonstrate that many malware
+              samples show different behavior depending on input read
+              from the environment. Thus, by exploring multiple
+              execution paths, we can obtain a more complete picture
+              of their actions."
+}
+
+ at Inproceedings{NavasMH09,
+  Author = "J. Navas and M. M{\'e}ndez-Lojo and M. V. Hermenegildo",
+  Title = "User-Definable Resource Usage Bounds Analysis for {Java} Bytecode",
+  Booktitle = "Proceedings of the 4th Workshop on Bytecode Semantics,
+               Verification, Analysis and Transformation (Bytecode 2009)",
+  Address = "York, UK",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 253,
+  Number = 5,
+  Pages =  "65--82",
+  Year = 2009,
+  ISSN = "1571-0661",
+  Abstract = "Automatic cost analysis of programs has been
+              traditionally concentrated on a reduced number of
+              resources such as execution steps, time, or
+              memory. However, the increasing relevance of analysis
+              applications such as static debugging and/or
+              certification of user-level properties (including for
+              mobile code) makes it interesting to develop analyses
+              for resource notions that are actually
+              application-dependent. This may include, for example,
+              bytes sent or received by an application, number of
+              files left open, number of SMSs sent or received, number
+              of accesses to a database, money spent, energy
+              consumption, etc. We present a fully automated analysis
+              for inferring upper bounds on the usage that a Java
+              bytecode program makes of a set of application
+              programmer-definable resources. In our context, a
+              resource is defined by programmer-provided annotations
+              which state the basic consumption that certain program
+              elements make of that resource. From these definitions
+              our analysis derives functions which return an upper
+              bound on the usage that the whole program (and
+              individual blocks) make of that resource for any given
+              set of input data sizes. The analysis proposed is
+              independent of the particular resource. We also present
+              some experimental results from a prototype
+              implementation of the approach covering a significant
+              set of interesting resources."
+}
+
+ at Inproceedings{CuervoParrinoNVM12,
+  Author = "B. {Cuervo Parrino} and J. Narboux and E. Violard and N. Magaud",
+  Title = "Dealing with Arithmetic Overflows in the Polyhedral Model",
+  Booktitle = "Proceedings of the 2nd International Workshop
+               on Polyhedral Compilation Techniques (IMPACT 2012)",
+  Address = "Paris, France",
+  Editor = "U. Bondhugula and V. Loechner ",
+  Year = 2012,
+  URL = "http://hal.inria.fr/hal-00655485",
+  Abstract = "The polyhedral model provides techniques to optimize
+              Static Control Programs (SCoP) using some complex
+              transforma- tions which improve data-locality and which
+              can exhibit parallelism. These advanced
+              transformations are now available in both GCC and
+              LLVM. In this paper, we focus on the cor- rectness of
+              these transformations and in particular on the problem
+              of integer overflows. Indeed, the strength of the
+              polyhedral model is to produce an abstract mathematical
+              representation of a loop nest which allows high-level
+              trans- formations. But this abstract representation is
+              valid only when we ignore the fact that our integers are
+              only machine integers. In this paper, we present a
+              method to deal with this problem of mismatch between the
+              mathematical and concrete representations of loop
+              nests. We assume the exis- tence of polyhedral
+              optimization transformations which are proved to be
+              correct in a world without overflows and we provide a
+              self-verifying compilation function. Rather than
+              verifying the correctness of this function, we use an
+              approach based on a validator, which is a tool that is
+              run by the com- piler after the transformation itself
+              and which confirms that the code produced is equivalent
+              to the original code. As we aim at the formal proof of
+              the validator we implement this validator using the Coq
+              proof assistant as a programming language [4]."
+
+}
+
+ at Inproceedings{PayetS07,
+  Author = "E. Payet and F. Spoto",
+  Title = " Magic-Sets Transformation for the Analysis of {Java} Bytecode",
+  Booktitle = "Static Analysis:
+               Proceedings of the 14th International Symposium",
+  Address = "Kongens Lyngby, Denmark",
+  Editor = "G. Fil\'e and H. R. Nielson",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4634,
+  ISBN = "978-3-540-74060-5",
+  Pages = "452--467",
+  Year = 2007,
+  Abstract = "Denotational static analysis of Java bytecode has a nice
+              and clean compositional definition and an efficient
+              implementation with binary decision diagrams. But it
+              models only the \emph{functional} i.e., input/output
+              behaviour of a program $P$, not enough if one needs $P$'s
+              \emph{internal} behaviours i.e., from the input to some
+              internal program points. We overcome this limitation
+              with a technique used up to now for logic programs
+              only. It adds new \emph{magic} blocks of code to P, whose
+              functional behaviours are the internal behaviours of
+              $P$. We prove this transformation correct with an
+              operational semantics. We define an equivalent
+              denotational semantics, whose denotations for the
+              magic blocks are hence the internal behaviours of
+              $P$. We implement our transformation and instantiate
+              it with abstract domains modelling \emph{sharing} of two
+              variables and \emph{non-cyclicity} of variables. We get a
+              static analyser for full Java bytecode that is
+              faster and scales better than another operational
+              pair-sharing analyser and a constraint-based pointer
+              analyser."
+}
+
+ at Inproceedings{PerezRS09,
+  Author = "J. A. {Navarro P{\'e}rez} and A. Rybalchenko and A. Singh",
+  Title = "Cardinality Abstraction for Declarative Networking Applications",
+  Booktitle = "Computer Aided Verification,
+               Proceedings of the 21st International Conference (CAV 2009)",
+  Address = "Grenoble, France",
+  Editor = "A. Bouajjani and O. Maler",
+  Publisher = "Springer",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5643,
+  Pages = "584--598",
+  Year = 2009,
+  ISBN = "978-3-642-02657-7",
+  Abstract = "Declarative Networking is a recent, viable approach to
+              make distributed programming easier, which is becoming
+              increasingly popular in systems and networking
+              community. It offers the programmer a declarative,
+              rule-based language, called P2, for writing distributed
+              applications in an abstract, yet expressive way. This
+              approach, however, imposes new challenges on analysis
+              and verification methods when they are applied to P2
+              programs. Reasoning about P2 computations is beyond the
+              scope of existing tools since it requires handling of
+              program states defined in terms of collections of
+              relations, which store the application data, together
+              with multisets of tuples, which represent communication
+              events in-flight. In this paper, we propose a
+              cardinality abstraction technique that can be used to
+              analyze and verify P2 programs. It keeps track of the
+              size of relations (together with projections thereof)
+              and multisets defining P2 states, and provides an
+              appropriate treatment of declarative operations, e.g.,
+              indexing, unification, variable binding, and
+              negation. Our cardinality abstraction-based verifier
+              successfully proves critical safety properties of a P2
+              implementation of the Byzantine fault tolerance protocol
+              Zyzzyva, which is a representative and complex
+              declarative networking application."
+}
+
+ at Inproceedings{PhamTTC11,
+  Author = "T.-H. Pham and M.-T. Trinh and A.-H. Truong and W.-N. Chin",
+  Title = "{FixBag:} A Fixpoint Calculator for Quantified Bag Constraints",
+  Booktitle = "Proceedings of the 23rd International Conference on
+               Computer Aided Verification (CAV 2011)",
+  Address = "Snowbird, UT, USA",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "G. Gopalakrishnan and S. Qadeer",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-22109-5",
+  Pages =  "656--662",
+  Volume = 6806,
+  Year = 2011,
+  Abstract = "Abstract interpretation techniques have played a major
+              role in advancing the state-of-the-art in program
+              analysis. Traditionally, stand-alone tools for these
+              techniques have been developed for the numerical domains
+              which may be sufficient for lower levels of program
+              correctness. To analyze a wider range of programs, we
+              have developed a tool to compute symbolic fixpoints for
+              quantified bag domain . This domain is useful for
+              programs that deal with collections of values. Our tool
+              is able to derive both loop invariants and method
+              pre/post conditions via fixpoint analysis of recursive
+              bag constraints. To support better precision, we have
+              allowed disjunctive formulae to be inferred, where
+              appropriate. As a stand-alone tool, we have tested it on
+              a range of small but challenging examples with
+              acceptable precision and performance."
+}
+
+ at Techreport{Pop06,
+  Author = "S. Pop and G.-A. Silber and A. Cohen and C. Bastoul
+            and S. Girbal and N. Vasilache",
+  Title = "{GRAPHITE}: Polyhedral Analyses and Optimizations for {GCC}",
+  Number = "A/378/CRI",
+  Institution = "Centre de Recherche en Informatique,
+                 \'Ecole des Mines de Paris",
+  Address = "Fontainebleau, France",
+  Year = 2006,
+  Note = "Contribution to the GNU Compilers Collection Developers Summit 2006
+          (GCC Summit 06), Ottawa, Canada, June 28--30, 2006",
+  Abstract = "We present a plan to add loop nest optimizations in GCC
+              based on polyhedral representations of loop nests. We
+              advocate a static analysis approach based on a hierarchy
+              of interchangeable abstractions with solvers that range
+              from the exact solvers such as OMEGA, to faster but less
+              precise solvers based on more coarse abstractions. The
+              intermediate representation GRAPHITE (GIMPLE Represented
+              as Polyhedra with Interchangeable Envelopes), built on
+              GIMPLE and the natural loops, hosts the high level loop
+              transformations. We base this presentation on the
+              WRaP-IT project developed in the Alchemy group at INRIA
+              Futurs and Paris-Sud University, on the PIPS compiler
+              developed at \'Ecole des mines de Paris, and on a joint
+              work with several members of the static analysis and
+              polyhedral compilation community in France.
+
+              The main goal of this project is to bring more high
+              level loop optimizations to GCC: loop fusion, tiling,
+              strip mining, etc. Thanks to the WRaP-IT experience, we
+              know that the polyhedral analyzes and transformations
+              are affordable in a production compiler. A second goal
+              of this project is to experiment with compile time
+              reduction versus attainable precision when replacing
+              operations on polyhedra with faster operations on more
+              abstract domains. However, the use of a too coarse
+              representation for computing might also result in an
+              over approximated solution that cannot be used in
+              subsequent computations. There exists a trade off
+              between speed of the computation and the attainable
+              precision that has not yet been analyzed for real world
+              programs."
+}
+
+ at Incollection{PopeeaC08,
+  Author = "C. Popeea and W.-N. Chin",
+  Title = "Inferring Disjunctive Postconditions",
+  Booktitle = "Advances in Computer Science --- ASIAN 2006. Secure Software
+               and Related Issues",
+  Editor = "M. Okada and I. Satoh",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Year = 2008,
+  Volume = 4435,
+  Pages = "331--345",
+  ISBN = "978-3-540-77504-1",
+  Note = "Revised selected papers presented at the 11th Asian Computing
+          Science Conference, Tokyo, Japan, December 6--8, 2006",
+  Abstract = "Polyhedral analysis [9] is an abstract interpretation
+              used for automatic discovery of invariant linear
+              inequalities among numerical variables of a
+              program. Convexity of this abstract domain allows
+              efficient analysis but also loses precision via
+              convex-hull and widening operators. To selectively
+              recover the loss of precision, sets of polyhedra
+              (disjunctive elements) may be used to capture more
+              precise invariants. However a balance must be struck
+              between precision and cost.
+              We introduce the notion of affinity to characterize how
+              closely related is a pair of polyhedra. Finding related
+              elements in the polyhedron (base) domain allows the
+              formulation of precise hull and widening operators
+              lifted to the disjunctive (powerset extension of the)
+              polyhedron domain. We have implemented a modular static
+              analyzer based on the disjunctive polyhedral analysis
+              where the relational domain and the proposed operators
+              can progressively enhance precision at a reasonable
+              cost."
+}
+
+ at Article{RizkBFS09,
+  Author = "A. Rizk and G. Batt and F. Fages and S. Soliman",
+  Title = "A General Computational Method for Robustness Analysis
+           with Applications to Synthetic Gene Networks",
+  Journal = "Bioinformatics",
+  Publisher = "Oxford University Press",
+  Volume = 25,
+  Number = "12",
+  Pages = "i169--i178",
+  Year = 2009,
+  Note = "Paper accepted for presentation at the 2009 ISMB/ECCB Conference,
+          Stockholm, Sweden, June 27--July 2, 2009.
+          Available at
+          \url{http://bioinformatics.oxfordjournals.org/cgi/content/abstract/25/12/i169}",
+  Abstract = "\textbf{Motivation:} Robustness is the capacity of a
+             system to maintain a function in the face of
+             perturbations. It is essential for the correct
+             functioning of natural and engineered biological
+             systems. Robustness is generally defined in an \emph{ad hoc},
+             problem-dependent manner, thus hampering the fruitful
+             development of a theory of biological robustness,
+             recently advocated by Kitano.
+
+             \textbf{Results:} In this article, we propose a general
+             definition of robustness that applies to any biological
+             function expressible in temporal logic LTL (linear
+             temporal logic), and to broad model classes and
+             perturbation types. Moreover, we propose a computational
+             approach and an implementation in BIOCHAM 2.8 for the
+             automated estimation of the robustness of a given
+             behavior with respect to a given set of
+             perturbations. The applicability and biological relevance
+             of our approach is demonstrated by testing and improving
+             the robustness of the timed behavior of a synthetic
+             transcriptional cascade that could be used as a
+             biological timer for synthetic biology applications.
+
+             \textbf{Availability:} Version 2.8 of BIOCHAM and the
+             transcriptional cascade model are available at
+             \url{http://contraintes.inria.fr/BIOCHAM/}"
+}
+
+ at Article{RizkBFS11,
+  Author = "A. Rizk and G. Batt and F. Fages and S. Soliman",
+  Title = "Continuous Valuations of Temporal Logic Specifications with
+           Applications to Parameter Optimization and Robustness
+           Measures",
+  Journal = "Theoretical Computer Science",
+  Publisher = "Elsevier",
+  Volume = 412,
+  Number = 26,
+  Pages =  "2827--2839",
+  Year = 2011,
+  ISSN = "0304-3975",
+  Abstract = "Finding mathematical models satisfying a specification
+              built from the formalization of biological experiments,
+              is a common task of the modeler that techniques like
+              model-checking help solving, in the qualitative but also
+              in the quantitative case. In this article we define a
+              continuous degree of satisfaction of temporal logic
+              formulae with constraints. We show how such a
+              satisfaction measure can be used as a fitness function
+              with state-of-the-art evolutionary optimization methods
+              in order to find biochemical kinetic parameter values
+              satisfying a set of biological properties formalized in
+              temporal logic. We also show how it can be used to
+              define a measure of robustness of a biological model
+              with respect to some temporal specification. These
+              methods are evaluated on models of the cell cycle and of
+              the MAPK signaling cascade."
+}
+
+ at Inproceedings{SankaranarayananIG07,
+  Author = "S. Sankaranarayanan and F. Ivancic and A. Gupta",
+  Title = "Program Analysis Using Symbolic Ranges",
+  Booktitle = "Static Analysis:
+               Proceedings of the 14th International Symposium",
+  Address = "Kongens Lyngby, Denmark",
+  Editor = "G. Fil\'e and H. R. Nielson",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4634,
+  ISBN = "978-3-540-74060-5",
+  Pages = "366--383",
+  Year = 2007,
+  Abstract = "Interval analysis seeks static lower and upper bounds on
+              the values of program variables. These bounds are
+              useful, especially for inferring invariants to prove buffer
+              overflow checks. In practice, however, intervals by
+              themselves are often inadequate as invariants due to the
+              lack of relational information among program variables.
+              In this paper, we present a technique for deriving symbolic
+              bounds on variable values. We study a restricted class of
+              polyhedra whose constraints are stratified with respect to
+              some variable ordering provided by the user, or chosen
+              heuristically. We define a notion of normalization for
+              such constraints and demonstrate polynomial time domain
+              operations on the resulting domain of symbolic range
+              constraints. The abstract domain is intended to complement
+              widely used domains such as intervals and octagons
+              for use in buffer overflow analysis. Finally, we study
+              the impact of our analysis on commercial software using
+              an overflow analyzer for the C language."
+}
+
+ at Inproceedings{SankaranarayananSM04,
+  Author = "S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+  Title = "Constraint-Based Linear-Relations Analysis",
+  Booktitle = "Static Analysis:
+               Proceedings of the 11th International Symposium",
+  Address = "Verona, Italy",
+  Editor = "R. Giacobazzi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3148,
+  Year = 2004,
+  Pages = "53--68",
+  Abstract = "Linear-relations analysis of transition systems
+              discovers linear invariant relationships among the
+              variables of the system. These relationships help
+              establish important safety and liveness
+              properties. Efficient techniques for the analysis of
+              systems using polyhedra have been explored, leading to
+              the development of successful tools like
+              HyTech. However, existing techniques rely on the use of
+              approximations such as widening and extrapolation in
+              order to ensure termination. In an earlier paper, we
+              demonstrated the use of Farkas' Lemma to provide a
+              translation from the linear-relations analysis problem
+              into a system of constraints on the unknown coefficients
+              of a candidate invariant. However, since the constraints
+              in question are non-linear, a naive application of the
+              method does not scale. In this paper, we show that by
+              some efficient simplifications and approximations to the
+              quantifier elimination, not only does the method scale
+              to higher dimensions, but also enjoys performance
+              advantages for some larger examples."
+}
+
+ at Inproceedings{SankaranarayananSM05,
+  Author = "S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+  Title = "Scalable Analysis of Linear Systems using Mathematical Programming",
+  Booktitle = "Verification, Model Checking and Abstract Interpretation:
+               Proceedings of the 6th International Conference (VMCAI 2005)",
+  Address = "Paris, France",
+  Editor = "R. Cousot",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3385,
+  Year = 2005,
+  Pages = "25--41",
+  Abstract = "We present a method for generating linear invariants for
+              large systems. The method performs forward propagation
+              in an abstract domain consisting of arbitrary polyhedra
+              of a predefined fixed shape. The basic operations on the
+              domain like abstraction, intersection, join and
+              inclusion tests are all posed as linear optimization
+              queries, which can be solved efficiently by existing LP
+              solvers. The number and dimensionality of the LP queries
+              are polynomial in the program dimensionality, size and
+              the number of target invariants. The method generalizes
+              similar analyses in the interval, octagon, and octahedra
+              domains, without resorting to polyhedral
+              manipulations. We demonstrate the performance of our
+              method on some benchmark programs."
+}
+
+ at Inproceedings{SankaranarayananCSM06,
+  Author = "S. Sankaranarayanan and M. Col{\'o}n
+            and H. B. Sipma and Z. Manna",
+  Title = "Efficient Strongly Relational Polyhedral Analysis",
+  Booktitle = "Verification, Model Checking and Abstract Interpretation:
+               Proceedings of the 7th International Conference (VMCAI 2006)",
+  Address = "Charleston, SC, USA",
+  Editor = "E. A. Emerson and K. S. Namjoshi",
+  Pages = "111--125",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3855,
+  Year = 2006,
+  ISBN = "3-540-31139-4",
+  Abstract = "Polyhedral analysis infers invariant linear equalities
+              and inequalities of imperative programs. However, the
+              exponential complexity of polyhedral operations such as
+              image computation and convex hull limits the
+              applicability of polyhedral analysis. Weakly relational
+              domains such as intervals and octagons address the
+              scalability issue by considering polyhedra whose
+              constraints are drawn from a restricted, user-specified
+              class. On the other hand, these domains rely solely on
+              candidate expressions provided by the user. Therefore,
+              they often fail to produce strong invariants.  We
+              propose a polynomial time approach to strongly
+              relational analysis. We provide efficient
+              implementations of join and post condition operations,
+              achieving a trade off between performance and
+              accuracy. We have implemented a strongly relational
+              polyhedral analyzer for a subset of the C
+              language. Initial experimental results on benchmark
+              examples are encouraging."
+}
+
+ at Inproceedings{SankaranarayananSM06,
+  Author = "S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+  Title = "Fixed Point Iteration for Computing the Time Elapse Operator",
+  Booktitle = "Hybrid Systems: Computation and Control:
+               Proceedings of the 9th International Workshop (HSCC 2006)",
+  Address = "Santa Barbara, CA, USA",
+  Editor = "J. Hespanha and A. Tiwari",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 3927,
+  Pages = "537--551",
+  Year = 2006,
+  ISBN = "3-540-33170-0",
+  Abstract = "We investigate techniques for automatically generating
+              symbolic approximations to the time solution of a system
+              of differential equations. This is an important
+              primitive operation for the safety analysis of
+              continuous and hybrid systems. In this paper we design a
+              \emph{time elapse} operator that computes a symbolic
+              over-approximation of time solutions to a continuous
+              system starting from a given initial region. Our
+              approach is iterative over the cone of functions (drawn
+              from a suitable universe) that are non negative over the
+              initial region. At each stage, we iteratively remove
+              functions from the cone whose Lie derivatives do not lie
+              inside the current iterate. If the iteration converges,
+              the set of states defined by the final iterate is shown
+              to contain all the time successors of the initial
+              region. The convergence of the iteration can be forced
+              using abstract interpretation operations such as
+              widening and narrowing.  We instantiate our technique to
+              linear hybrid systems with piecewise-affine dynamics to
+              compute polyhedral approximations to the time
+              successors. Using our prototype implementation TimePass,
+              we demonstrate the performance of our technique on
+              benchmark examples."
+}
+
+ at Inproceedings{SankaranarayananISG06,
+  Author = "S. Sankaranarayanan and F. Ivan\v{c}i\'{c}
+            and I. Shlyakhter and A. Gupta",
+  Title = "Static Analysis in Disjunctive Numerical Domains",
+  Booktitle = "Static Analysis:
+               Proceedings of the 13th International Symposium",
+  Address = "Seoul, Korea",
+  Editor = "K. Yi",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4134,
+  Pages = "3--17",
+  Year = 2006,
+  ISBN = "3-540-37756-5",
+  Abstract = "The convexity of numerical domains such as polyhedra,
+              octagons, intervals and linear equalities enables
+              tractable analysis of software for buffer overflows,
+              null pointer dereferences and floating point
+              errors. However, convexity also causes the analysis to
+              fail in many common cases. Powerset extensions can
+              remedy this shortcoming by considering disjunctions of
+              predicates. Unfortunately, analysis using powerset
+              domains can be exponentially more expensive as compared
+              to analysis on the base domain. In this paper, we prove
+              structural properties of fixed points computed in
+              commonly used powerset extensions. We show that a fixed
+              point computed on a powerset extension is also a fixed
+              point in the base domain computed on an ``elaboration''
+              of the program's CFG structure. Using this insight, we
+              build analysis algorithms that approach path sensitive
+              static analysis algorithms by performing the fixed point
+              computation on the base domain while discovering an
+              ``elaboration'' on the fly. Using restrictions on the
+              nature of the elaborations, we design algorithms that
+              scale polynomially in terms of the number of
+              disjuncts. We have implemented a light-weight static
+              analyzer for C programs with encouraging initial
+              results."
+}
+
+ at Inproceedings{Simon10a,
+  Author = "A. Simon",
+  Title = "A Note on the Inversion Join for Polyhedral Analysis",
+  Booktitle = "Proceedings of the 2nd International Workshop on
+               Numerical and Symbolic Abstract Domains (NSAD 2010)",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 267,
+  Pages =  "115--126",
+  Year = 2010,
+  ISSN = "1571-0661",
+  Abstract = "Linear invariants are essential in many optimization and
+              verification tasks. The domain of convex polyhedra (sets
+              of linear inequalities) has the potential to infer all
+              linear relationships. Yet, it is rarely applied to
+              larger problems due to the join operation whose most
+              precise result is given by the convex hull of two
+              polyhedra which, in turn, may be of exponential
+              size. Recently, Sankaranarayanan et al. proposed an
+              operation called inversion join to efficiently
+              approximate the convex hull. While their proposal has an
+              ad-hoc flavour, we show that it is quite principled and,
+              indeed, complete for planar polyhedra and, for general
+              polyhedra, complete on over 70% of our benchmarks."
+}
+
+ at Inproceedings{Simon10b,
+  Author = "A. Simon",
+  Title = "Speeding up Polyhedral Analysis by Identifying Common Constraints",
+  Booktitle = "Proceedings of the 2nd International Workshop on
+               Numerical and Symbolic Abstract Domains (NSAD 2010)",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 267,
+  Pages =  "127--138",
+  Year = 2010,
+  ISSN = "1571-0661",
+  Abstract = "Sets of linear inequalities are an expressive reasoning
+              tool for approximating the reachable states of a
+              program. However, the most precise way to join two
+              states is to calculate the convex hull of the two
+              polyhedra that are represented by the inequality sets,
+              an operation that is exponential in the dimension of the
+              polyhedra. We investigate how similarities in the two
+              input polyhedra can be exploited to improve the
+              performance of this costly operation. In particular, we
+              discuss how common equalities and certain inequalities
+              can be omitted from the calculation without affecting
+              the result. We expose a maximum of common equalities and
+              inequalities by converting the polyhedra into a normal
+              form and give experimental evidence of the merit of our
+              method."
+}
+
+ at Inproceedings{SimonL10,
+  Author = "A. Simon and L. Chen",
+  Title = "Simple and Precise Widenings for {H-Polyhedra}",
+  Booktitle = "Proceedings of the 8th Asian Symposium
+               on the Programming Languages and Systems (APLAS 2010)",
+  Address = "Shanghai, China",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "K. Ueda",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-17163-5",
+  Pages =  "139--155",
+  Volume = 6461,
+  Year = 2010,
+  Abstract = "While the definition of the revised widening for
+              polyhedra is defined in terms of inequalities, most
+              implementations use the double description method as a
+              means to an efficient implementation. We show how
+              standard widening can be implemented in a simple and
+              efficient way using a normalized H -representation
+              (constraint-only) which has become popular in recent
+              approximations to polyhedral analysis. We then detail a
+              novel heuristic for this representation that is tuned
+              to capture linear transformations of the state space
+              while ensuring quick convergence for non-linear
+              transformations for which no precise linear invariants
+              exist."
+}
+
+ at Techreport{SlaninaSSM07TR,
+  Author = "M. Slanina and S. Sankaranarayanan and H. B. Sipma and Z. Manna",
+  Title = "Controller Synthesis of Discrete Linear Plants Using Polyhedra",
+  Number = "REACT-TR-2007-01",
+  Institution = "Computer Science Department, Stanford University",
+  Address = "Stanford, California, USA",
+  Year = 2007,
+  Abstract = "We study techniques for synthesizing synchronous
+              controllers for affine plants with disturbances, based
+              on safety specifications. Our plants are modeled in
+              terms of discrete linear systems whose variables are
+              partitioned into system, control, and disturbance
+              variables. We synthesize non-blocking controllers that
+              satisfy a user-provided safety specification by means of
+              a fixed point iteration over the control precondition
+              state transformer. Using convex polyhedra to represent
+              sets of states, we present both precise and approximate
+              algorithms for computing control preconditions and
+              discuss strategies for forcing convergence of the
+              iteration. We present technique for automatically
+              deriving controllers from the result of the analysis,
+              and demonstrate our approach on examples."
+}
+
+ at TechReport{Soffia08TR,
+  Author = "S. Soffia",
+  Title = "Definition and Implementation of a Points-To Analysis
+           for C-like Languages",
+  Institution = "Dipartimento di Matematica, Universit\`a di Parma, Italy",
+  Number = "arXiv:cs.PL/0810.0753",
+  Year = 2008,
+  Note = "Available from \url{http://arxiv.org/}",
+  Abstract = "The points-to problem is the problem of determining the
+              possible run-time targets of pointer variables and is
+              usually considered part of the more general aliasing
+              problem, which consists in establishing whether and when
+              different expressions can refer to the same memory address.
+              Aliasing information is essential to every tool that needs
+              to reason about the semantics of programs.  However, due to
+              well-known undecidability results, for all interesting
+              languages that admit aliasing, the exact solution of
+              nontrivial aliasing problems is not generally computable.
+              This work focuses on approximated solutions to this problem
+              by presenting a store-based, flow-sensitive points-to
+              analysis, for applications in the field of automated software
+              verification.  In contrast to software testing procedures,
+              which heuristically check the program against a finite set
+              of executions, the methods considered in this work are static
+              analyses, where the computed results are valid for all the
+              possible executions of the analyzed program.  We present a
+              simplified programming language and its execution model;
+              then an approximated execution model is developed using the
+              ideas of abstract interpretation theory.  Finally, the
+              soundness of the approximation is formally proved.  The aim
+              of developing a realistic points-to analysis is pursued by
+              presenting some extensions to the initial simplified model
+              and discussing the correctness of their formulation.
+              This work contains original contributions to the issue of
+              points-to analysis, as it provides a formulation of a filter
+              operation on the points-to abstract domain and a formal proof
+              of the soundness of the defined abstract operations:
+              these, as far as we now, are lacking from the previous
+              literature."
+}
+
+ at Inproceedings{Starynkevitch07,
+  Author = "B. Starynkevitch",
+  Title = "Multi-Stage Construction of a Global Static Analyzer",
+  Booktitle = "Proceedings of the 2007 {GCC} Developers' Summit",
+  Address = "Ottawa, Canada",
+  Pages = "143--151",
+  Year = 2007,
+  Abstract = "We describe ongoing work about global static analysis
+              for GCC4 within the GlobalGCC European project,
+              funded thru the ITEA Programme.  The aim of this
+              work is to provide global (whole program) static
+              analysis, notably based upon abstract interpretation
+              and knowledge based techniques, within the GCC
+              compiler, targeted for analysis of medium sized C,
+              Fortran or C++ programs. This will facilitate the
+              adoption of GCC in the area of safetycritical
+              software development, by providing features found in
+              a few expensive commercial tools (PolySpace, AbsInt)
+              or research prototypes (Astree). In this
+              perspective, the emphasis is on the quality of
+              analysis, at the expense of much bigger compilation
+              times, without sacrificing scalability. Such
+              analysis can be used for several purposes:
+              statically compute some interesting properties of
+              the program at most control points (possibly
+              reporting them the user); provide clever,
+              contextual, warnings about possible hazards in the
+              user program (null pointer dereferences, zero
+              divide, conversion loss, out of bound array access,
+              \dots) while avoiding too much false alarms; enable
+              additional optimisations, like conditional
+              contextual constant folding, C++ method call
+              devirtualization, an other contextual optimizations.
+              The compiler's rich program manipulation
+              infrastructure facilitates the development of these
+              advanced analysis capabilities.  To facilitate the
+              development high-level semantical analyses, a domain
+              specific language has been developped, and is
+              translated (thru C) into dynamically loaded code. It
+              uses the Parma Polyhedra Library (also used in the
+              GRAPHITE project) for relational analysis on scalars
+              and gives more expressivity to develop analaysis
+              algorithms. It permits multi-staged generation of
+              the specific analysis tailored to the analyzed
+              source code. Presenting this work at the 2007 GCC
+              summit will allow us to stress the importance of all
+              outputs of the compiler, not only object-code, and
+              to expose the complementary contribution of static
+              analyses and dynamic/instrumentation approaches like
+              mudflap."
+}
+
+ at Inproceedings{SongCR06,
+  Author = "H. Song and K. J. Compton and W. C. Rounds",
+  Title = "{SPHIN:} A Model Checker for Reconfigurable Hybrid Systems
+           Based on {SPIN}",
+  Booktitle = "Proceedings of the 5th International Workshop on
+               Automated Verification of Critical Systems",
+  Address = "University of Warwick, UK",
+  Editor = "R. Lazic and R. Nagarajan",
+  Series = "Electronic Notes in Theoretical Computer Science",
+  Publisher = "Elsevier Science B.V.",
+  Volume = 145,
+  Pages = "167--183",
+  Year = 2006,
+  Abstract = "We present SPHIN, a model checker for reconfigurable
+              hybrid systems based on the model checker SPIN. We
+              observe that physical (analog) mobility can be modeled
+              in the same way as logical (discrete) mobility is
+              modeled in the $\pi$-calculus by means of channel name
+              passing. We chose SPIN because it supports channel name
+              passing and can model reconfigurations. We extend the
+              syntax of PROMELA and the verification algorithms based
+              on the expected semantics. We demonstrate the tool's
+              capabilities by modeling and verifying a reconfigurable
+              hybrid system."
+}
+
+ at Inproceedings{TraonouezLR08,
+  Author = "L.-M. Traonouez and D. Lime and O. H. Roux",
+  Title = "Parametric Model-Checking of Time {Petri} Nets with Stopwatches
+           Using the State-Class Graph",
+  Booktitle = "Proceedings of the 6th International Conference on
+               Formal Modeling and Analysis of Timed Systems (FORMATS 2008)",
+  Editor = "F. Cassez and C. Jard",
+  Address = "Saint Malo, France",
+  Pages = "280--294",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 5215,
+  Year = 2008,
+  ISBN = "978-3-540-85777-8",
+  Abstract = "In this paper, we propose a new framework for the
+              parametric verification of time Petri nets with
+              stopwatches controlled by inhibitor arcs. We first
+              introduce an extension of time Petri nets with inhibitor
+              arcs (ITPNs) with temporal parameters. Then, we define a
+              symbolic representation of the parametric state space
+              based on the classical state class graph method. The
+              parameters of the model are embedded into the firing
+              domains of the classes, that are represented by convex
+              polyhedra. Finally, we propose semi-algorithms for the
+              parametric model-checking of a subset of parametric TCTL
+              formulae on ITPNs. We can thus generate the set of the
+              parameter valuations that satisfy the formulae."
+}
+
+ at Article{TraonouezLR09,
+  Author = "L.-M. Traonouez and D. Lime and O. H. Roux",
+  Title = "Parametric Model-Checking of Stopwatch Petri Nets",
+  Journal = "Journal of Universal Computer Science",
+  Year = 2009,
+  Volume = 15,
+  Number = 17,
+  Pages = "3273--3304",
+  Abstract = "At the border between control and verification,
+              parametric verification can be used to synthesize
+              constraints on the parameters to ensure that a system
+              verifies given specifications. In this paper we propose
+              a new framework for the parametric verification of time
+              Petri nets with stopwatches. We first introduce a
+              parametric extension of time Petri nets with inhibitor
+              arcs (ITPNs) with temporal parameters and we define a
+              symbolic representation of the parametric state-space
+              based on the classical state-class graph method. Then,
+              we propose semi-algorithms for the parametric
+              modelchecking of a subset of parametric TCTL formulae on
+              ITPNs. These results have been implemented in the tool
+              Romeo and we illustrate them in a case-study based on a
+              scheduling problem.", } Abstract: At the border between
+              control and verification, parametric verification can be
+              used to synthesize constraints on the parameters to
+              ensure that a system verifies given specifications. In
+              this paper we propose a new framework for the parametric
+              verification of time Petri nets with stopwatches. We
+              first introduce a parametric extension of time Petri
+              nets with inhibitor arcs (ITPNs) with temporal
+              parameters and we define a symbolic representation of
+              the parametric state-space based on the classical
+              state-class graph method. Then, we propose
+              semi-algorithms for the parametric modelchecking of a
+              subset of parametric TCTL formulae on ITPNs. These
+              results have been implemented in the tool Romeo and we
+              illustrate them in a case-study based on a scheduling
+              problem."
+}
+
+ at Inproceedings{TrifunovicCEFG+10,
+  Author = "K. Trifunovic and A. Cohen and D. Edelsohn and L. Feng
+           and T. Grosser and H. Jagasia and R. Ladelsky and S. Pop
+           and J. Sj{\"o}din and R. Upadrasta",
+  Title = "{GRAPHITE} Two Years After:
+           First Lessons Learned From Real-World Polyhedral Compilation",
+  Booktitle = "Proceedings of the 2nd International Workshop on
+               GCC Research Opportunities (GROW'10)",
+  Address = "Pisa, Italy",
+  Year = 2010,
+  Pages = "4--19",
+  Abstract = "Modern compilers are responsible for adapting the
+              semantics of source programs into a form that makes
+              efficient use of a highly complex, heterogeneous
+              machine. This adaptation amounts to solve an
+              optimization problem in a huge and unstructured search
+              space, while predicting the performance outcome of
+              complex sequences of program transformations. The
+              polyhedral model of compilation is aimed at these
+              challenges. Its geometrical, non-inductive semantics
+              enables the construction of better-structured
+              optimization problems and precise analytical
+              models. Recent work demonstrated the scalability of the
+              main polyhedral algorithms to real-world programs. Its
+              integration into production compilers is under way,
+              pioneered by the graphite branch of the GNU Compiler
+              Collection (GCC). Two years after the effective
+              beginning of the project, this paper reports on original
+              questions and innovative solutions that arose during the
+              design and implementation of \textsc{graphite}."
+}
+
+ at Techreport{UchoaFLPPdAA06TR,
+  Author = "E. Uchoa and R. Fukasawa and J. Lysgaard and A. Pessoa
+            and M. {Poggi de Arag\~ao} and D. Andrade",
+  Title = "Robust Branch-Cut-and-Price for the Capacitated
+           Minimum Spanning Tree Problem over a Large Extended Formulation",
+  Number = "RPEP, Vol.~6, No.~9",
+  Institution = "Universidade Federal Fluminense, Engenharia de Produ\c{c}ao",
+  Address = "Niteroi, Brazil",
+  Year = 2006,
+  Abstract = "This paper presents a robust branch-cut-and-price
+              algorithm for the Capacitated Minimum Spanning Tree
+              Problem (CMST). The variables are associated to
+              $q$-arbs, a structure that arises from a relaxation of
+              the capacitated prize-collecting arborescence probem in
+              order to make it solvable in pseudo-polynomial
+              time. Traditional inequalities over the arc formulation,
+              like Capacity Cuts, are also used. Moreover, a novel
+              feature is introduced in such kind of
+              algorithms. Powerful new cuts expressed over a very
+              large set of variables could be added, without
+              increasing the complexity of the pricing subproblem or
+              the size of the LPs that are actually
+              solved. Computational results on benchmark instances
+              from the OR-Library show very significant improvements
+              over previous algorithms. Several open instances could
+              be solved to optimality."
+}
+
+ at Inproceedings{vanHeeOSV06,
+  Author = "K. {van Hee} and O. Oanea and N. Sidorova and M. Voorhoeve",
+  Title = "Verifying Generalized Soundness for Workflow Nets",
+  Booktitle = "Perspectives of System Informatics: Proceedings of the
+               6th International Andrei Ershov Memorial Conference",
+  Address = "Akademgorodok, Novosibirsk, Russia",
+  Editor = "I. Virbitskaite and A. Voronkov",
+  Publisher = "Springer-Verlag, Berlin",
+  Series = "Lecture Notes in Computer Science",
+  Volume = 4378,
+  Pages = "231--244",
+  Year = 2006,
+  Abstract = "We improve the decision procedure from [K. van Hee,
+              N. Sidorova, and M. Voorhoeve. Generalized soundness of
+              workflow nets is decidable. In Proc. of ICATPN'2004,
+              volume 3099 of LNCS, pages 197--216, 2004] for the
+              problem of generalized soundness for workflow nets:
+              ``Every marking reachable from an initial marking with
+              $k$ tokens on the initial place terminates properly,
+              i.e. it can reach a marking with $k$ tokens on the final
+              place, for an arbitrary natural number $k$''. Moreover,
+              our new decision procedure returns a counterexample in
+              case the workflow net is not generalized sound. We also
+              report on experimental results obtained with the
+              prototype we made and explain how the procedure can be
+              used for the compositional verification of large
+              workflows."
+}
+
+ at PhdThesis{Vasconcelos08th,
+  Author = "P. B. Vasconcelos",
+  Title = "Space Cost Analysis Using Sized Types",
+  School = "School of Computer Science, University of St Andrews",
+  Address = "St Andrews, UK",
+  Month = aug,
+  Year = 2008,
+  Abstract = "Programming resource-sensitive systems, such as
+              real-time embedded systems, requires guaranteeing both
+              the functional correctness of computations and also that
+              time and space usage fit within constraints imposed
+              by hardware limits or the environment.  Functional
+              programming languages have proved very good at
+              meeting the former logical kind of guarantees but
+              not the latter resource guarantees.
+
+              This thesis contributes to demonstrate the applicability
+              of functional programming in resource-sensitive
+              systems with an automatic program analysis for
+              obtaining guaranteed upper bounds on dynamic space
+              usage of functional programs.
+
+              Our analysis is developed for a core subset of
+              \emph{Hume}, a domain-specific functional language
+              targeting resource-sensitive systems (Hammond et
+              al. 2007), and presented as a type and effeect
+              system that builds on previous sized type systems
+              (Hughes et al. 1996, Chin and Khoo 2001) and effeect
+              systems for costs (Dornic et al. 1992, Reistad and
+              Gifford 1994, Hughes and Pareto 1999). It extends
+              previous approaches by using abstract interpretation
+              techniques to \emph{automatically} infer linear
+              approximations of the sizes of recursive data types
+              and the stack and heap costs of recursive functions.
+
+              The correctness of the analysis is formally proved with
+              respect to an operational semantics for the language
+              and an inferrence algorithm that automatically
+              reconstructs size and cost bounds is presented.
+
+              A prototype implementation of the analysis and
+              operational semantics has been constructed and used
+              to experimentally assess the quality of the cost
+              bounds with some examples, including implementations
+              of textbook functional programming algorithms and
+              simplified embedded systems."
+}
+
+ at Inproceedings{Verdoolaege10,
+  Author = "S. Verdoolaege",
+  Title = "An Integer Set Library for the Polyhedral Model",
+  Booktitle = "Proceedings of the 3rd International Congress
+               on Mathematical Software (ICMS 2010)",
+  Address = "Kobe, Japan",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "K. Fukuda and J. Hoeven and M. Joswig and N. Takayama",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-15581-9",
+  Pages =  "299--302",
+  Volume = 6327,
+  ISBN = "978-3-642-15581-9",
+  Year = 2010,
+  Abstract = "In compiler research, polytopes and related mathematical
+              objects have been successfully used for several decades
+              to represent and manipulate computer programs in an
+              approach that has become known as the polyhedral
+              model. The key insight is that the kernels of many
+              compute-intensive applications are composed of loops
+              with bounds that are affine combinations of symbolic
+              constants and outer loop iterators. The iterations of a
+              loop nest can then be represented as the integer points
+              in a (parametric) polytope and manipulated as a whole,
+              rather than as individual iterations. A similar
+              reasoning holds for the elements of an array and for
+              mappings between loop iterations and array elements."
+}
+
+ at Incollection{Vigna07,
+  Author = "G. Vigna",
+  Editor = "M. Christodorescu and S. Jha and D. Maughan
+            and D. Song and C. Wang",
+  Booktitle = "Malware Detection",
+  Title = "Static Disassembly and Code Analysis",
+  Publisher = "Springer-Verlag, Berlin",
+  Year = 2007,
+  Series = "Advances in Information Security",
+  Volume = 27,
+  ISBN = "0-387-32720-4",
+  Abstract = "The classification of an unknown binary program as
+              malicious or benign requires two steps. In the first
+              step, the stream of bytes that constitutes the program
+              has to be transformed (or disassembled) into the
+              corresponding sequence of machine instructions. In the
+              second step, based on this machine code representation,
+              static or dynamic code analysis techniques can be
+              applied to determine the properties and function of the
+              program.  Both the disassembly and code analysis steps
+              can be foiled by techniques that obfuscate the binary
+              representation of a program. Thus, robust techniques are
+              required that deliver reliable results under such
+              adverse circumstances. In this chapter, we introduce a
+              disassemble technique that can deal with obfuscated
+              binaries. Also, we introduce a static code analysis
+              approach that can identify high-level semantic
+              properties of code that are difficult to conceal."
+}
+
+ at Inproceedings{YangWGI06,
+  Author = "Z. Yang and C. Wang and A. Gupta and F. Ivan\v{c}i\'{c}",
+  Title = "Mixed Symbolic Representations for Model Checking
+           Software Programs",
+  Booktitle = "Proceedings of the 4th ACM {\&} IEEE International Conference
+               on Formal Methods and Models for Co-Design (MEMOCODE 2006)",
+  Address = "Embassy Suites, Napa, California, USA",
+  Pages = "17--26",
+  Publisher = "IEEE Press",
+  Year = 2006,
+  ISBN = "1-4244-0421-5",
+  Abstract = "We present an efficient symbolic search algorithm for
+              software model checking. The algorithm combines multiple
+              symbolic representations to efficiently represent the
+              transition relation and reachable states and uses a
+              combination of decision procedures for Boolean and
+              integer representations. Our main contributions include:
+              (1) mixed symbolic representations to model C programs
+              with rich data types and complex expressions; and (2)
+              new symbolic search strategies and optimization
+              techniques specific to sequential programs that can
+              significantly improve the scalability of model checking
+              algorithms. Our controlled experiments on real-world
+              software programs show that the new symbolic search
+              algorithm can achieve several orders-of-magnitude
+              improvements over existing methods. The proposed
+              techniques are extremely competitive in handling
+              sequential models of non-trivial sizes, and also compare
+              favorably to popular Boolean-level model checking
+              algorithms based on BDDs and SAT.",
+}
+
+ at Article{YangWGI09,
+  Author = "Z. Yang and C. Wang and A. Gupta and F. Ivan\v{c}i\'{c}",
+  Title = "Model Checking Sequential Software Programs
+           Via Mixed Symbolic Analysis",
+  Journal = "ACM Transactions on Design Automation of Electronic Systems",
+  Volume = 14,
+  Number = 1,
+  Pages = "1--26",
+  Year = 2009,
+  ISSN = "1084-4309",
+  Publisher = "ACM Press",
+  Address = "New York, NY, USA",
+  Abstract = "We present an efficient symbolic search algorithm for
+              software model checking. Our algorithms perform
+              word-level reasoning by using a combination of decision
+              procedures in Boolean and integer and real domains, and
+              use novel symbolic search strategies optimized
+              specifically for sequential programs to improve
+              scalability. Experiments on real-world C programs show
+              that the new symbolic search algorithms can achieve
+              several orders-of-magnitude improvements over existing
+              methods based on bit-level (Boolean) reasoning."
+}
+
+ at Incollection{ZanioliC11,
+  Author = "M. Zanioli and A. Cortesi",
+  Title = "Information Leakage Analysis by Abstract Interpretation",
+  Booktitle = "SOFTSEM 2011: Theory and Practice of Computer Science",
+  Series = "Lecture Notes in Computer Science",
+  Editor = "I. Cern{\'a} and T. Gyim{\'o}thy and J. Hromkovic and K. Jefferey
+            and R. Kr{\'a}lovic and M. Vukolic and S. Wolf",
+  Publisher = "Springer-Verlag, Berlin",
+  ISBN = "978-3-642-18380-5",
+  Pages =  "545--557",
+  Volume = 6543,
+  Year = 2011,
+  Abstract = "Protecting the confidentiality of information stored in
+              a computer system or transmitted over a public network
+              is a relevant problem in computer security. The
+              approach of information flow analysis involves
+              performing a static analysis of the program with the
+              aim of proving that there will not be leaks of
+              sensitive information. In this paper we propose a new
+              domain that combines variable dependency analysis,
+              based on propositional formulas, and variables' value
+              analysis, based on polyhedra. The resulting analysis is
+              strictly more accurate than the state of the art
+              abstract interpretation based analyses for information
+              leakage detection. Its modular construction allows to
+              deal with the tradeoff between efficiency and accuracy
+              by tuning the granularity of the abstraction and the
+              complexity of the abstract operators."
+}
+
+==============================================================================
+
+<h2>ODC Attribution License (ODC-By)</h2>
+
+### Preamble
+
+The Open Data Commons Attribution License is a license agreement
+intended to allow users to freely share, modify, and use this Database
+subject only to the attribution requirements set out in Section 4.
+
+Databases can contain a wide variety of types of content (images,
+audiovisual material, and sounds all in the same database, for example),
+and so this license only governs the rights over the Database, and not
+the contents of the Database individually. Licensors may therefore wish
+to use this license together with another license for the contents.
+
+Sometimes the contents of a database, or the database itself, can be
+covered by other rights not addressed here (such as private contracts,
+trademark over the name, or privacy rights / data protection rights
+over information in the contents), and so you are advised that you may
+have to consult other documents or clear other rights before doing
+activities not covered by this License.
+
+------
+
+The Licensor (as defined below)
+
+and
+
+You (as defined below)
+
+agree as follows:
+
+### 1.0 Definitions of Capitalised Words
+
+"Collective Database" - Means this Database in unmodified form as part
+of a collection of independent databases in themselves that together are
+assembled into a collective whole. A work that constitutes a Collective
+Database will not be considered a Derivative Database.
+
+"Convey" - As a verb, means Using the Database, a Derivative Database,
+or the Database as part of a Collective Database in any way that enables
+a Person to make or receive copies of the Database or a Derivative
+Database.  Conveying does not include interaction with a user through a
+computer network, or creating and Using a Produced Work, where no
+transfer of a copy of the Database or a Derivative Database occurs.
+
+"Contents" - The contents of this Database, which includes the
+information, independent works, or other material collected into the
+Database. For example, the contents of the Database could be factual
+data or works such as images, audiovisual material, text, or sounds.
+
+"Database" - A collection of material (the Contents) arranged in a
+systematic or methodical way and individually accessible by electronic
+or other means offered under the terms of this License.
+
+"Database Directive" - Means Directive 96/9/EC of the European
+Parliament and of the Council of 11 March 1996 on the legal protection
+of databases, as amended or succeeded.
+
+"Database Right" - Means rights resulting from the Chapter III ("sui
+generis") rights in the Database Directive (as amended and as transposed
+by member states), which includes the Extraction and Re-utilisation of
+the whole or a Substantial part of the Contents, as well as any similar
+rights available in the relevant jurisdiction under Section 10.4.
+
+"Derivative Database" - Means a database based upon the Database, and
+includes any translation, adaptation, arrangement, modification, or any
+other alteration of the Database or of a Substantial part of the
+Contents. This includes, but is not limited to, Extracting or
+Re-utilising the whole or a Substantial part of the Contents in a new
+Database.
+
+"Extraction" - Means the permanent or temporary transfer of all or a
+Substantial part of the Contents to another medium by any means or in
+any form.
+
+"License" - Means this license agreement and is both a license of rights
+such as copyright and Database Rights and an agreement in contract.
+
+"Licensor" - Means the Person that offers the Database under the terms
+of this License.
+
+"Person" - Means a natural or legal person or a body of persons
+corporate or incorporate.
+
+"Produced Work" -  a work (such as an image, audiovisual material, text,
+or sounds) resulting from using the whole or a Substantial part of the
+Contents (via a search or other query) from this Database, a Derivative
+Database, or this Database as part of a Collective Database.
+
+"Publicly" - means to Persons other than You or under Your control by
+either more than 50% ownership or by the power to direct their
+activities (such as contracting with an independent consultant).
+
+"Re-utilisation" - means any form of making available to the public all
+or a Substantial part of the Contents by the distribution of copies, by
+renting, by online or other forms of transmission.
+
+"Substantial" - Means substantial in terms of quantity or quality or a
+combination of both. The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may amount to the
+Extraction or Re-utilisation of a Substantial part of the Contents.
+
+"Use" - As a verb, means doing any act that is restricted by copyright
+or Database Rights whether in the original medium or any other; and
+includes without limitation distributing, copying, publicly performing,
+publicly displaying, and preparing derivative works of the Database, as
+well as modifying the Database as may be technically necessary to use it
+in a different mode or format.
+
+"You" - Means a Person exercising rights under this License who has not
+previously violated the terms of this License with respect to the
+Database, or who has received express permission from the Licensor to
+exercise rights under this License despite a previous violation.
+
+Words in the singular include the plural and vice versa.
+
+### 2.0 What this License covers
+
+2.1. Legal effect of this document. This License is:
+
+  a. A license of applicable copyright and neighbouring rights;
+
+  b. A license of the Database Right; and
+
+  c. An agreement in contract between You and the Licensor.
+
+2.2 Legal rights covered. This License covers the legal rights in the
+Database, including:
+
+  a. Copyright. Any copyright or neighbouring rights in the Database.
+  The copyright licensed includes any individual elements of the
+  Database, but does not cover the copyright over the Contents
+  independent of this Database. See Section 2.4 for details. Copyright
+  law varies between jurisdictions, but is likely to cover: the Database
+  model or schema, which is the structure, arrangement, and organisation
+  of the Database, and can also include the Database tables and table
+  indexes; the data entry and output sheets; and the Field names of
+  Contents stored in the Database;
+
+  b. Database Rights. Database Rights only extend to the Extraction and
+  Re-utilisation of the whole or a Substantial part of the Contents.
+  Database Rights can apply even when there is no copyright over the
+  Database. Database Rights can also apply when the Contents are removed
+  from the Database and are selected and arranged in a way that would
+  not infringe any applicable copyright; and
+
+  c. Contract. This is an agreement between You and the Licensor for
+  access to the Database. In return you agree to certain conditions of
+  use on this access as outlined in this License.
+
+2.3 Rights not covered.
+
+  a. This License does not apply to computer programs used in the making
+  or operation of the Database;
+
+  b. This License does not cover any patents over the Contents or the
+  Database; and
+
+  c. This License does not cover any trademarks associated with the
+  Database.
+
+2.4 Relationship to Contents in the Database. The individual items of
+the Contents contained in this Database may be covered by other rights,
+including copyright, patent, data protection, privacy, or personality
+rights, and this License does not cover any rights (other than Database
+Rights or in contract) in individual Contents contained in the Database.
+For example, if used on a Database of images (the Contents), this
+License would not apply to copyright over individual images, which could
+have their own separate licenses, or one single license covering all of
+the rights over the images.
+
+### 3.0 Rights granted
+
+3.1 Subject to the terms and conditions of this License, the Licensor
+grants to You a worldwide, royalty-free, non-exclusive, terminable (but
+only under Section 9) license to Use the Database for the duration of
+any applicable copyright and Database Rights. These rights explicitly
+include commercial use, and do not exclude any field of endeavour. To
+the extent possible in the relevant jurisdiction, these rights may be
+exercised in all media and formats whether now known or created in the
+future.
+
+The rights granted cover, for example:
+
+  a. Extraction and Re-utilisation of the whole or a Substantial part of
+  the Contents;
+
+  b. Creation of Derivative Databases;
+
+  c. Creation of Collective Databases;
+
+  d. Creation of temporary or permanent reproductions by any means and
+  in any form, in whole or in part, including of any Derivative
+  Databases or as a part of Collective Databases; and
+
+  e. Distribution, communication, display, lending, making available, or
+  performance to the public by any means and in any form, in whole or in
+  part, including of any Derivative Database or as a part of Collective
+  Databases.
+
+3.2 Compulsory license schemes. For the avoidance of doubt:
+
+  a. Non-waivable compulsory license schemes. In those jurisdictions in
+  which the right to collect royalties through any statutory or
+  compulsory licensing scheme cannot be waived, the Licensor reserves
+  the exclusive right to collect such royalties for any exercise by You
+  of the rights granted under this License;
+
+  b. Waivable compulsory license schemes. In those jurisdictions in
+  which the right to collect royalties through any statutory or
+  compulsory licensing scheme can be waived, the Licensor waives the
+  exclusive right to collect such royalties for any exercise by You of
+  the rights granted under this License; and,
+
+  c. Voluntary license schemes. The Licensor waives the right to collect
+  royalties, whether individually or, in the event that the Licensor is
+  a member of a collecting society that administers voluntary licensing
+  schemes, via that society, from any exercise by You of the rights
+  granted under this License.
+
+3.3 The right to release the Database under different terms, or to stop
+distributing or making available the Database, is reserved. Note that
+this Database may be multiple-licensed, and so You may have the choice
+of using alternative licenses for this Database. Subject to Section
+10.4, all other rights not expressly granted by Licensor are reserved.
+
+### 4.0 Conditions of Use
+
+4.1 The rights granted in Section 3 above are expressly made subject to
+Your complying with the following conditions of use. These are important
+conditions of this License, and if You fail to follow them, You will be
+in material breach of its terms.
+
+4.2 Notices. If You Publicly Convey this Database, any Derivative
+Database, or the Database as part of a Collective Database, then You
+must:
+
+  a. Do so only under the terms of this License;
+
+  b. Include a copy of this License or its Uniform Resource Identifier (URI)
+  with the Database or Derivative Database, including both in the
+  Database or Derivative Database and in any relevant documentation;
+
+  c. Keep intact any copyright or Database Right notices and notices
+  that refer to this License; and
+
+  d. If it is not possible to put the required notices in a particular
+  file due to its structure, then You must include the notices in a
+  location (such as a relevant directory) where users would be likely to
+  look for it.
+
+4.3 Notice for using output (Contents). Creating and Using a Produced
+Work does not require the notice in Section 4.2. However, if you
+Publicly Use a Produced Work, You must include a notice associated with
+the Produced Work reasonably calculated to make any Person that uses,
+views, accesses, interacts with, or is otherwise exposed to the Produced
+Work aware that Content was obtained from the Database, Derivative
+Database, or the Database as part of a Collective Database, and that it
+is available under this License.
+
+  a. Example notice. The following text will satisfy notice under
+  Section 4.3:
+
+        Contains information from DATABASE NAME which is made available
+        under the ODC Attribution License.
+
+DATABASE NAME should be replaced with the name of the Database and a
+hyperlink to the location of the Database. "ODC Attribution License"
+should contain a hyperlink to the URI of the text of this License. If
+hyperlinks are not possible, You should include the plain text of the
+required URI's with the above notice.
+
+4.4 Licensing of others. You may not sublicense the Database. Each time
+You communicate the Database, the whole or Substantial part of the
+Contents, or any Derivative Database to anyone else in any way, the
+Licensor offers to the recipient a license to the Database on the same
+terms and conditions as this License. You are not responsible for
+enforcing compliance by third parties with this License, but You may
+enforce any rights that You have over a Derivative Database. You are
+solely responsible for any modifications of a Derivative Database made
+by You or another Person at Your direction. You may not impose any
+further restrictions on the exercise of the rights granted or affirmed
+under this License.
+
+### 5.0 Moral rights
+
+5.1 Moral rights. This section covers moral rights, including any rights
+to be identified as the author of the Database or to object to treatment
+that would otherwise prejudice the author's honour and reputation, or
+any other derogatory treatment:
+
+  a. For jurisdictions allowing waiver of moral rights, Licensor waives
+  all moral rights that Licensor may have in the Database to the fullest
+  extent possible by the law of the relevant jurisdiction under Section
+  10.4;
+
+  b. If waiver of moral rights under Section 5.1 a in the relevant
+  jurisdiction is not possible, Licensor agrees not to assert any moral
+  rights over the Database and waives all claims in moral rights to the
+  fullest extent possible by the law of the relevant jurisdiction under
+  Section 10.4; and
+
+  c. For jurisdictions not allowing waiver or an agreement not to assert
+  moral rights under Section 5.1 a and b, the author may retain their
+  moral rights over certain aspects of the Database.
+
+Please note that some jurisdictions do not allow for the waiver of moral
+rights, and so moral rights may still subsist over the Database in some
+jurisdictions.
+
+### 6.0 Fair dealing, Database exceptions, and other rights not affected
+
+6.1 This License does not affect any rights that You or anyone else may
+independently have under any applicable law to make any use of this
+Database, including without limitation:
+
+  a. Exceptions to the Database Right including: Extraction of Contents
+  from non-electronic Databases for private purposes, Extraction for
+  purposes of illustration for teaching or scientific research, and
+  Extraction or Re-utilisation for public security or an administrative
+  or judicial procedure.
+
+  b. Fair dealing, fair use, or any other legally recognised limitation
+  or exception to infringement of copyright or other applicable laws.
+
+6.2 This License does not affect any rights of lawful users to Extract
+and Re-utilise insubstantial parts of the Contents, evaluated
+quantitatively or qualitatively, for any purposes whatsoever, including
+creating a Derivative Database (subject to other rights over the
+Contents, see Section 2.4). The repeated and systematic Extraction or
+Re-utilisation of insubstantial parts of the Contents may however amount
+to the Extraction or Re-utilisation of a Substantial part of the
+Contents.
+
+### 7.0 Warranties and Disclaimer
+
+7.1 The Database is licensed by the Licensor "as is" and without any
+warranty of any kind, either express, implied, or arising by statute,
+custom, course of dealing, or trade usage. Licensor specifically
+disclaims any and all implied warranties or conditions of title,
+non-infringement, accuracy or completeness, the presence or absence of
+errors, fitness for a particular purpose, merchantability, or otherwise.
+Some jurisdictions do not allow the exclusion of implied warranties, so
+this exclusion may not apply to You.
+
+### 8.0 Limitation of liability
+
+8.1 Subject to any liability that may not be excluded or limited by law,
+the Licensor is not liable for, and expressly excludes, all liability
+for loss or damage however and whenever caused to anyone by any use
+under this License, whether by You or by anyone else, and whether caused
+by any fault on the part of the Licensor or not. This exclusion of
+liability includes, but is not limited to, any special, incidental,
+consequential, punitive, or exemplary damages such as loss of revenue,
+data, anticipated profits, and lost business. This exclusion applies
+even if the Licensor has been advised of the possibility of such
+damages.
+
+8.2 If liability may not be excluded by law, it is limited to actual and
+direct financial loss to the extent it is caused by proved negligence on
+the part of the Licensor.
+
+### 9.0 Termination of Your rights under this License
+
+9.1 Any breach by You of the terms and conditions of this License
+automatically terminates this License with immediate effect and without
+notice to You. For the avoidance of doubt, Persons who have received the
+Database, the whole or a Substantial part of the Contents, Derivative
+Databases, or the Database as part of a Collective Database from You
+under this License will not have their licenses terminated provided
+their use is in full compliance with this License or a license granted
+under Section 4.8 of this License.  Sections 1, 2, 7, 8, 9 and 10 will
+survive any termination of this License.
+
+9.2 If You are not in breach of the terms of this License, the Licensor
+will not terminate Your rights under it.
+
+9.3 Unless terminated under Section 9.1, this License is granted to You
+for the duration of applicable rights in the Database.
+
+9.4 Reinstatement of rights. If you cease any breach of the terms and
+conditions of this License, then your full rights under this License
+will be reinstated:
+
+  a. Provisionally and subject to permanent termination until the 60th
+  day after cessation of breach;
+
+  b. Permanently on the 60th day after cessation of breach unless
+  otherwise reasonably notified by the Licensor; or
+
+  c.  Permanently if reasonably notified by the Licensor of the
+  violation, this is the first time You have received notice of
+  violation of this License from  the Licensor, and You cure the
+  violation prior to 30 days after your receipt of the notice.
+
+9.5 Notwithstanding the above, Licensor reserves the right to release
+the Database under different license terms or to stop distributing or
+making available the Database. Releasing the Database under different
+license terms or stopping the distribution of the Database will not
+withdraw this License (or any other license that has been, or is
+required to be, granted under the terms of this License), and this
+License will continue in full force and effect unless terminated as
+stated above.
+
+### 10.0 General
+
+10.1 If any provision of this License is held to be invalid or
+unenforceable, that must not affect the validity or enforceability of
+the remainder of the terms and conditions of this License and each
+remaining provision of this License shall be valid and enforced to the
+fullest extent permitted by law.
+
+10.2 This License is the entire agreement between the parties with
+respect to the rights granted here over the Database. It replaces any
+earlier understandings, agreements or representations with respect to
+the Database.
+
+10.3 If You are in breach of the terms of this License, You will not be
+entitled to rely on the terms of this License or to complain of any
+breach by the Licensor.
+
+10.4 Choice of law. This License takes effect in and will be governed by
+the laws of the relevant jurisdiction in which the License terms are
+sought to be enforced. If the standard suite of rights granted under
+applicable copyright law and Database Rights in the relevant
+jurisdiction includes additional rights not granted under this License,
+these additional rights are granted in this License in order to meet the
+terms of this License.
diff --git a/doc/ppl_logo.pdf b/doc/ppl_logo.pdf
new file mode 100644
index 0000000..540fdbf
Binary files /dev/null and b/doc/ppl_logo.pdf differ
diff --git a/doc/ppl_logo_no_ppl.pdf b/doc/ppl_logo_no_ppl.pdf
new file mode 100644
index 0000000..3ff221f
Binary files /dev/null and b/doc/ppl_logo_no_ppl.pdf differ
diff --git a/doc/user-language-interface.doxyconf.in b/doc/user-language-interface.doxyconf.in
new file mode 100644
index 0000000..881087c
--- /dev/null
+++ b/doc/user-language-interface.doxyconf.in
@@ -0,0 +1,311 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "PPL <PPL_SED_LANGUAGE_NAME> Language Interface"
+PROJECT_NUMBER         = @VERSION@
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                = <PPL_SED_ALIASES>
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = NO
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = <PPL_SED_ENABLED_SECTIONS>
+MAX_INITIALIZER_LINES  = 5
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = <PPL_SED_INPUT>
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          =
+RECURSIVE              = NO
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = <PPL_SED_GENERATE_HTML>
+HTML_OUTPUT            = ppl-user-<PPL_SED_INTERFACE_NAME>- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = YES
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = <PPL_SED_GENERATE_LATEX>
+LATEX_OUTPUT           = user-<PPL_SED_INTERFACE_NAME>.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = user-<PPL_SED_INTERFACE_NAME>.tex
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             = <PPL_SED_CONFIGURED_MANUAL> \
+                         PPL_PROTO(protos):=protos
+EXPAND_AS_DEFINED      = PPL_TYPE_DECLARATION \
+                         PPL_DECLARE_PRINT_FUNCTIONS \
+                         PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS \
+                         PPL_DECLARE_IO_FUNCTIONS \
+                         PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS \
+                         PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS \
+                         PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               = <PPL_SED_TAGFILES>
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/user-language-interface.tex b/doc/user-language-interface.tex
new file mode 100644
index 0000000..05b2b3d
--- /dev/null
+++ b/doc/user-language-interface.tex
@@ -0,0 +1,174 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+<PPL_SED_USEPACKAGE_OCAMLDOC>
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\scriptsize The PPL <PPL_SED_LANGUAGE_NAME> Language Interface User's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+<PPL_SED_LANGUAGE_NAME> Language Interface \\
+User's Manual\thanks{This work
+  has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications'';
+  EPSRC project
+    ``Numerical Domains for Software Analysis'';
+  EPSRC project
+    ``Geometric Abstractions for Scalable Program Analyzers''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+  BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+  BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/doc/user.doxyconf-html.in b/doc/user.doxyconf-html.in
new file mode 100644
index 0000000..6a55adf
--- /dev/null
+++ b/doc/user.doxyconf-html.in
@@ -0,0 +1,307 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PPL
+PROJECT_NUMBER         = @VERSION@
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                =
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = NO
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 5
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/definitions.dox \
+                         ../src/ppl.hh \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          =
+RECURSIVE              = NO
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = ppl-user- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = YES
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = user.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user.tex
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             =
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       = ppl-user- at VERSION@-html.tag
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/user.doxyconf-latex.in b/doc/user.doxyconf-latex.in
new file mode 100644
index 0000000..f168217
--- /dev/null
+++ b/doc/user.doxyconf-latex.in
@@ -0,0 +1,307 @@
+# Doxyfile 1.8.4
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = PPL
+PROJECT_NUMBER         = @VERSION@
+PROJECT_BRIEF          =
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       = .
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       =
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = NO
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 8
+ALIASES                =
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = NO
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = NO
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = YES
+HIDE_UNDOC_CLASSES     = YES
+HIDE_FRIEND_COMPOUNDS  = YES
+HIDE_IN_BODY_DOCS      = YES
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 5
+SHOW_USED_FILES        = YES
+SHOW_FILES             = YES
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = YES
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = NO
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text "
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = @srcdir@/definitions.dox \
+                         ../src/ppl.hh \
+                         @srcdir@/gpl.dox \
+                         @srcdir@/fdl.dox
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          =
+RECURSIVE              = NO
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       =
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       =
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = NO
+HTML_OUTPUT            = ppl-user- at VERSION@-html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = YES
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = YES
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = NO
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = user.latex-dir
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = YES
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = ppl
+LATEX_HEADER           = @srcdir@/user.tex
+LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = YES
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = YES
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             =
+XML_DTD                =
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = YES
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             =
+EXPAND_AS_DEFINED      = PPL_OUTPUT_DECLARATIONS
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = @PERL@
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+MSCGEN_PATH            =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = YES
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = FreeSans
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = NO
+DIRECTORY_GRAPH        = NO
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
diff --git a/doc/user.tex b/doc/user.tex
new file mode 100644
index 0000000..52ab7ee
--- /dev/null
+++ b/doc/user.tex
@@ -0,0 +1,173 @@
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This document describes the Parma Polyhedra Library (PPL).
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.2
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% The license is included, in various formats, in the `doc' subdirectory
+% of each distribution of the PPL in files named `fdl.*'.
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.  The license is included, in various
+% formats, in the `doc' subdirectory of each distribution of the PPL in
+% files named `gpl.*'.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% If you have not received a copy of one or both the above mentioned
+% licenses along with the PPL, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+\documentclass[a4paper,twoside]{article}
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{multicol}
+\usepackage{float}
+\usepackage{textcomp}
+\usepackage{alltt}
+\usepackage{times}
+\usepackage{tocloft}
+\usepackage{ifpdf}
+\usepackage[table]{xcolor}
+\ifpdf
+\usepackage[pdftex,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\else
+\usepackage[ps2pdf,
+            pagebackref=true,
+            colorlinks=true,
+            linkcolor=blue,
+            unicode
+           ]{hyperref}
+\usepackage{pspicture}
+\fi
+\usepackage[utf8]{inputenc}
+\usepackage{doxygen}
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{2}
+
+\renewcommand{\footrulewidth}{0.4pt}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\includegraphics[height=0.4cm]{ppl_logo_no_ppl.pdf}}
+\fancyfoot[RE,LO]{\small The PPL User's Manual (version $projectnumber). See \url{http://bugseng.com} for more information.}
+
+\setlength{\headheight}{24pt}
+
+\begin{document}
+\title{
+\includegraphics[height=9cm]{ppl_logo.pdf} \\
+\ \\
+The Parma Polyhedra Library \\
+User's Manual\thanks{This work is based on previous work also by
+Elisa Ricci, Sara Bonini, Andrea Pescetti, Angela Stazzone, Tatiana Zolo.
+This work has been partly supported by:
+  University of Parma's FIL scientific research project (ex 60\%)
+    ``Pure and Applied Mathematics'';
+  MURST project
+    ``Automatic Program Certification by Abstract Interpretation'';
+  MURST project
+    ``Abstract Interpretation, Type Systems and Control-Flow Analysis'';
+  MURST project
+    ``Automatic Aggregate- and Number-Reasoning for Computing: from
+      Decision Algorithms to Constraint Programming with Multisets,
+      Sets, and Maps'';
+  MURST project
+    ``Constraint Based Verification of Reactive Systems'';
+  MURST project
+    ``Abstract Interpretation: Design and Applications'';
+  EPSRC project
+    ``Numerical Domains for Software Analysis'';
+  EPSRC project
+    ``Geometric Abstractions for Scalable Program Analyzers''.
+  } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Patricia M. Hill\thanks{patricia.hill at bugseng.com,
+  BUGSENG srl.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+  Department of Mathematics, University of Parma, Italy,
+  and BUGSENG srl.} \\
+Abramo Bagnara\thanks{abramo.bagnara at bugseng.com,
+  BUGSENG srl.} \\
+}
+{\sffamily\maketitle}
+\thispagestyle{empty}
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\newpage
+Copyright \copyright\ 2001--2010 Roberto Bagnara (bagnara at cs.unipr.it) \\
+Copyright \copyright\ 2010--2013 BUGSENG srl (http://bugseng.com)
+
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the
+\href{http://www.fsf.org}{Free Software Foundation};
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled
+``\hyperlink{GFDL_GFDL}{GNU Free Documentation License}''.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+\href{http://www.fsf.org}{Free Software Foundation}; either version 3
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{GPL_GPL}{GNU GENERAL PUBLIC LICENSE}''.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://bugseng.com/products/ppl/}{\tt http://bugseng.com/products/ppl/}
+\end{center}
+\vfill
+\begin{center}
+\includegraphics[width=5cm]{bugseng_logo.pdf}
+\end{center}
+\vfill
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+% The following command is needed to have the right footer on
+% the first page of the TOC.
+\addtocontents{toc}{\protect\thispagestyle{fancy}}
+
+% Make sure there is enough space in the TOC for long subsection numbers.
+\addtolength{\cftsubsecnumwidth}{1em}
+
+\pagenumbering{roman}
+\tableofcontents
+\clearpage{\pagestyle{empty}\cleardoublepage}
+
+\pagenumbering{arabic}
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..377bb86
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-11-20.07; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	# Protect names problematic for 'test' and other utilities.
+	case $dst_arg in
+	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
+	esac
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	[-=\(\)!]*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test X"$d" = X && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/instchk.hh b/instchk.hh
new file mode 100644
index 0000000..93702b0
--- /dev/null
+++ b/instchk.hh
@@ -0,0 +1,389 @@
+/* Fake declarations to test the validity of the arguments of the
+   --enabled-instantiations option defined in configure.ac.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#include "gmpxx.h"
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+};
+
+class C_Polyhedron {
+public:
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class NNC_Polyhedron {
+public:
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Grid {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Rational_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Z_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+#if PPL_SUPPORTED_FLOAT
+class Float_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+#endif // PPL_SUPPORTED_FLOAT
+
+#if PPL_SUPPORTED_DOUBLE
+class Double_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+#endif // PPL_SUPPORTED_DOUBLE
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+class Long_Double_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+#endif // PPL_SUPPORTED_LONG_DOUBLE
+
+class Int8_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Int16_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Int32_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Int64_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint8_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint16_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint32_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+class Uint64_Box {
+public:
+  static bool valid_instantiation() {
+    return true;
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+template <typename PSET>
+class Pointset_Powerset {
+public:
+  static bool valid_instantiation() {
+    return PSET::valid_Pointset_Powerset_argument();
+  }
+};
+
+template <typename T>
+bool
+valid_BD_Shape_argument(void);
+
+template <>
+bool
+valid_BD_Shape_argument<signed char>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<short>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<int>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<long>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<long long>() {
+  return true;
+}
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+bool
+valid_BD_Shape_argument<float>() {
+  return true;
+}
+#endif // PPL_SUPPORTED_FLOAT
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+bool
+valid_BD_Shape_argument<double>() {
+  return true;
+}
+#endif // PPL_SUPPORTED_DOUBLE
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+bool
+valid_BD_Shape_argument<long double>() {
+  return true;
+}
+#endif // PPL_SUPPORTED_LONG_DOUBLE
+
+template <>
+bool
+valid_BD_Shape_argument<mpz_class>() {
+  return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<mpq_class>() {
+  return true;
+}
+
+template <typename T>
+class BD_Shape {
+public:
+  static bool valid_instantiation() {
+    return valid_BD_Shape_argument<T>();
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+template <typename T>
+class Octagonal_Shape {
+public:
+  static bool valid_instantiation() {
+    return valid_BD_Shape_argument<T>();
+  }
+  static bool valid_Pointset_Powerset_argument() {
+    return true;
+  }
+  static bool valid_Product_argument() {
+    return true;
+  }
+};
+
+template <typename D1, typename D2>
+class Direct_Product {
+public:
+  static bool valid_instantiation() {
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
+  }
+};
+
+template <typename D1, typename D2>
+class Smash_Product {
+public:
+  static bool valid_instantiation() {
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
+  }
+};
+
+template <typename D1, typename D2>
+class Constraints_Product {
+public:
+  static bool valid_instantiation() {
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
+  }
+};
+
+template <typename D1, typename D2>
+class Shape_Preserving_Product {
+public:
+  static bool valid_instantiation() {
+    return D1::valid_Product_argument() && D2::valid_Product_argument();
+  }
+};
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/C/C_interface.dox b/interfaces/C/C_interface.dox
new file mode 100644
index 0000000..5351b21
--- /dev/null
+++ b/interfaces/C/C_interface.dox
@@ -0,0 +1,1754 @@
+/* Doxumentation for the C language interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \interface ppl_Polyhedron_tag
+  \brief
+  Types and functions for the domains of C and NNC convex polyhedra.
+
+  The types and functions for convex polyhedra provide a single interface
+  for accessing both topologically closed (C) and not necessarily closed
+  (NNC) convex polyhedra.
+  The distinction between C and NNC polyhedra need only be explicitly
+  stated when <em>creating</em> or <em>assigning</em> a polyhedron object,
+  by means of one of the functions <code>ppl_new_*</code> and
+  <code>ppl_assign_*</code>.
+
+  Having a single datatype does not mean that C and NNC polyhedra can be
+  freely interchanged: as specified in the main manual, most library
+  functions require their arguments to be topologically and/or
+  space-dimension compatible.
+*/
+
+#if !defined(PPL_DOXYGEN_CONFIGURED_MANUAL)
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Polyhedron_tag* ppl_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Polyhedron_tag const* ppl_const_Polyhedron_t;
+
+#endif /* !defined(PPL_DOXYGEN_CONFIGURED_MANUAL) */
+
+/*! \brief \name Constructors and Assignment for C_Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a C polyhedron of dimension \p d and writes an handle to it
+  at address \p pph. If \p empty is different from zero, the newly created
+  polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_C_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a C polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a C polyhedron that is a copy of \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+
+  \note
+  The complexity argument is ignored.
+*/
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new C polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new C polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new C polyhedron from the system of congruences \p cs
+  and writes a handle for the newly created polyhedron at address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_C_Polyhedron_from_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new C polyhedron recycling the system of congruences
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the congruence system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Congruence_System
+(ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns a copy of the C polyhedron \p src to the C polyhedron \p dst.
+*/
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for C_Polyhedron */
+
+/*! \brief \name Constructors and Assignment for NNC_Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds an NNC polyhedron of dimension \p d and writes an handle to it
+  at address \p pph. If \p empty is different from zero, the newly created
+  polyhedron will be empty; otherwise, it will be a universe polyhedron.
+*/
+int
+ppl_new_NNC_Polyhedron_from_space_dimension
+(ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds an NNC polyhedron that is a copy of \p ph; writes a handle
+  for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds an NNC polyhedron that is a copy of \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+
+  \note
+  The complexity argument is ignored.
+*/
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new NNC polyhedron from the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new NNC polyhedron recycling the system of constraints
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new NNC polyhedron from the system of congruences
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new NNC polyhedron recycling the system of congruences
+  \p cs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p cs.
+
+  \warning
+  This function modifies the congruence system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns a copy of the NNC polyhedron \p src to the NNC
+  polyhedron \p dst.
+*/
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+(ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src);
+
+/*@}*/ /* Constructors and Assignment for NNC Polyhedron */
+
+/*! \name Constructors Behaving as Conversion Operators
+  Besides the conversions listed here below, the library also
+  provides conversion operators that build a semantic geometric
+  description starting from \b any other semantic geometric
+  description (e.g., ppl_new_Grid_from_C_Polyhedron,
+  ppl_new_C_Polyhedron_from_BD_Shape_mpq_class, etc.).
+  Clearly, the conversion operators are only available if both
+  the source and the target semantic geometric descriptions have
+  been enabled when configuring the library.
+  The conversions also taking as argument a complexity class
+  sometimes provide non-trivial precision/efficiency trade-offs.
+*/
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a C polyhedron that is a copy of the topological closure
+  of the NNC polyhedron \p ph; writes a handle for the newly created
+  polyhedron at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+                                         ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a C polyhedron that approximates NNC_Polyhedron \p ph,
+  using an algorithm whose complexity does not exceed \p complexity;
+  writes a handle for the newly created polyhedron at address \p pph.
+
+  \note
+  The complexity argument, which can take values
+  \c PPL_COMPLEXITY_CLASS_POLYNOMIAL, \c PPL_COMPLEXITY_CLASS_SIMPLEX
+  and \c PPL_COMPLEXITY_CLASS_ANY, is ignored since the exact constructor
+  has polynomial complexity.
+*/
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds an NNC polyhedron that is a copy of the C polyhedron \p ph;
+  writes a handle for the newly created polyhedron at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+                                         ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds an NNC polyhedron that approximates C_Polyhedron \p ph,
+  using an algorithm whose complexity does not exceed \p complexity;
+  writes a handle for the newly created polyhedron at address \p pph.
+
+  \note
+  The complexity argument, which can take values
+  \c PPL_COMPLEXITY_CLASS_POLYNOMIAL, \c PPL_COMPLEXITY_CLASS_SIMPLEX
+  and \c PPL_COMPLEXITY_CLASS_ANY, is ignored since the exact constructor
+  has polynomial complexity.
+*/
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity
+(ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity);
+
+/*@}*/ /* Constructors Behaving as Conversion Operators */
+
+/*! \brief \name Destructor for (C or NNC) Polyhedra */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Invalidates the handle \p ph: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph);
+
+/*@}*/ /* Destructor for (C or NNC) Polyhedra */
+
+/*! \brief \name Functions that Do Not Modify the Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes to \p m the affine dimension of \p ph (not to be confused with the
+  dimension of its enclosing vector space) or 0, if \p ph is empty.
+*/
+int
+ppl_Polyhedron_affine_dimension
+(ppl_const_Polyhedron_t ph, ppl_dimension_type* m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Checks the relation between the polyhedron \p ph and the constraint \p c.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (chosen among
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS,
+  PPL_POLY_CON_RELATION_IS_INCLUDED, and
+  PPL_POLY_CON_RELATION_SATURATES) that describe the relation between
+  \p ph and \p c.
+*/
+int
+ppl_Polyhedron_relation_with_Constraint
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Checks the relation between the polyhedron \p ph and the generator \p g.
+
+  If successful, returns a non-negative integer that is
+  obtained as the bitwise or of the bits (only
+  PPL_POLY_GEN_RELATION_SUBSUMES, at present) that describe the
+  relation between \p ph and \p g.
+*/
+int
+ppl_Polyhedron_relation_with_Generator
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_t g);
+
+int
+ppl_Polyhedron_relation_with_Congruence
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes a const handle to the constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes at address \p pcs a const handle to a system of congruences
+  approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes a const handle to the minimized constraint system defining the
+  polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_get_minimized_constraints
+(ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes at address \p pcs a const handle to a system of minimized
+  congruences approximating the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_get_minimized_congruences
+(ppl_const_Polyhedron_t ph, ppl_const_Congruence_System_t* pcs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+  not empty.
+*/
+int
+ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is a universe polyhedron;
+  returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+  unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph contains at least one integer
+  point; returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_contains_integer_point(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is topologically closed;
+  returns 0 if \p ph is not topologically closed.
+*/
+int
+ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is a discrete set;
+  returns 0 if \p ph is not a discrete set.
+*/
+int
+ppl_Polyhedron_is_discrete(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph constrains \p var;
+  returns 0 if \p ph does not constrain \p var.
+*/
+int
+ppl_Polyhedron_constrains
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p le is bounded from above in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_above
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p le is bounded from below in \p ph;
+  returns 0 otherwise.
+*/
+int
+ppl_Polyhedron_bounds_from_below
+(ppl_const_Polyhedron_t ph, ppl_const_Linear_Expression_t le);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is not empty
+  and \p le is bounded from above in \p ph, in which case
+  the supremum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be maximized subject to \p ph;
+
+  \param sup_n
+  Will be assigned the numerator of the supremum value;
+
+  \param sup_d
+  Will be assigned the denominator of the supremum value;
+
+  \param pmaximum
+  Will store 1 in this location if the supremum is also the maximum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from above,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_maximize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum,
+ ppl_Generator_t point);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  The same as ppl_Polyhedron_maximize_with_point, but without the
+  output argument for the location where the supremum value is reached.
+*/
+int
+ppl_Polyhedron_maximize
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* pmaximum);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if  \p ph is not empty
+  and \p le is bounded from below in \p ph, in which case
+  the infimum value and a point where \p le reaches it are computed.
+
+  \param ph
+  The polyhedron constraining \p le;
+
+  \param le
+  The linear expression to be minimized subject to \p ph;
+
+  \param inf_n
+  Will be assigned the numerator of the infimum value;
+
+  \param inf_d
+  Will be assigned the denominator of the infimum value;
+
+  \param pminimum
+  Will store 1 in this location if the infimum is also the minimum,
+  will store 0 otherwise;
+
+  \param point
+  Will be assigned the point or closure point where \p le reaches the
+  extremum value.
+
+  If \p ph is empty or \p le is not bounded from below,
+  0 will be returned and \p sup_n, \p sup_d, \p *pmaximum and \p point
+  will be left untouched.
+*/
+int
+ppl_Polyhedron_minimize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum,
+ ppl_Generator_t point);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  The same as ppl_Polyhedron_minimize_with_point, but without the
+  output argument for the location where the infimum value is reached.
+*/
+int
+ppl_Polyhedron_minimize_with_point
+(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t inf_n,
+ ppl_Coefficient_t inf_d,
+ int* pminimum);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p x contains or is equal to \p y;
+  returns 0 if it does not.
+*/
+int
+ppl_Polyhedron_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p x strictly contains \p y; returns 0
+  if it does not.
+*/
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p x and \p y are disjoint; returns 0
+  if they are not.
+*/
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p x and \p y are the same polyhedron;
+  returns 0 if they are different.
+
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value 0 is returned.
+*/
+int
+ppl_Polyhedron_equals_Polyhedron
+(ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Returns a positive integer if \p ph is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p ph is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes to \p sz a lower bound to the size in bytes of the memory
+  managed by \p ph.
+*/
+int
+ppl_Polyhedron_external_memory_in_bytes
+(ppl_const_Polyhedron_t ph, size_t* sz);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes to \p sz a lower bound to the size in bytes of the memory
+  managed by \p ph.
+*/
+int
+ppl_Polyhedron_total_memory_in_bytes
+(ppl_const_Polyhedron_t ph, size_t* sz);
+
+/*@}*/ /* Functions that Do Not Modify the Polyhedron */
+
+
+/*! \brief \name Space Dimension Preserving Functions that May Modify the Polyhedron */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds a copy of the constraint \p c to the system of constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds a copy of the congruence \p c to polyhedron of \p ph.
+*/
+int
+ppl_Polyhedron_add_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds a copy of the system of constraints \p cs to the system of
+  constraints of \p ph.
+*/
+int
+ppl_Polyhedron_add_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds a copy of the system of congruences \p cs to the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds the system of constraints \p cs to the system of constraints of
+  \p ph.
+
+  \warning
+  This function modifies the constraint system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_constraints
+(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds the system of congruences \p cs to the polyhedron \p ph.
+
+  \warning
+  This function modifies the congruence system referenced by \p cs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_congruences
+(ppl_Polyhedron_t ph, ppl_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Refines \p ph using constraint \p c.
+*/
+int
+ppl_Polyhedron_refine_with_constraint
+(ppl_Polyhedron_t ph, ppl_const_Constraint_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Refines \p ph using congruence \p c.
+*/
+int
+ppl_Polyhedron_refine_with_congruence
+(ppl_Polyhedron_t ph, ppl_const_Congruence_t c);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Refines \p ph using the constraints in \p cs.
+*/
+int
+ppl_Polyhedron_refine_with_constraints
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Refines \p ph using the congruences in \p cs.
+*/
+int
+ppl_Polyhedron_refine_with_congruences
+(ppl_Polyhedron_t ph, ppl_const_Congruence_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p x an upper bound of \p x and \p y.
+
+  For the domain of polyhedra, this is the same as
+  <CODE>ppl_Polyhedron_poly_hull_assign(x, y)</CODE>.
+*/
+int
+ppl_Polyhedron_upper_bound_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Same as ppl_Polyhedron_poly_difference_assign(x, y).
+*/
+int
+ppl_Polyhedron_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p x the
+  \extref{Meet_Preserving_Simplification, meet-preserving simplification}
+  of \p x with respect to context \p y. Returns a positive integer if
+  \p x and \p y have a nonempty intersection; returns \c 0 if they
+  are disjoint.
+*/
+int
+ppl_Polyhedron_simplify_using_context_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p x the \extref{Time_Elapse_Operator, time-elapse} between
+  the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Modifies \p ph by \extref{Cylindrification, unconstraining}
+  the space dimension \p var.
+*/
+int
+ppl_Polyhedron_unconstrain_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type var);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Modifies \p ph by \extref{Cylindrification, unconstraining}
+  the space dimensions that are specified in the first \p n positions
+  of the array \p ds.
+  The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_unconstrain_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Transforms the polyhedron \p ph, assigning an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is assigned;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Transforms the polyhedron \p ph, substituting an affine expression
+  to the specified variable.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable to which the affine expression is substituted;
+
+  \param le
+  The numerator of the affine expression;
+
+  \param d
+  The denominator of the affine expression.
+*/
+int
+ppl_Polyhedron_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\frac{\mathrm{lb}}{\mathrm{d}}
+       \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub}}{\mathrm{d}}\f$.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The variable bounded by the generalized affine transfer relation;
+
+  \param lb
+  The numerator of the lower bounding affine expression;
+
+  \param ub
+  The numerator of the upper bounding affine expression;
+
+  \param d
+  The (common) denominator of the lower and upper bounding affine expressions.
+*/
+int
+ppl_Polyhedron_bounded_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{var}' \relsym \frac{\mathrm{le}}{\mathrm{d}}\f$,
+  where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+  by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param var
+  The left hand side variable of the generalized affine transfer relation;
+
+  \param relsym
+  The relation symbol;
+
+  \param le
+  The numerator of the right hand side affine expression;
+
+  \param d
+  The denominator of the right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the image of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the preimage of \p ph with respect to the
+  \extref{Generalized_Affine_Relations, generalized affine transfer relation}
+  \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+  \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param lhs
+  The left hand side affine expression;
+
+  \param relsym
+  The relation symbol;
+
+  \param rhs
+  The right hand side affine expression.
+*/
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+(ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs);
+
+/*@}*/ /* Space Dimension Preserving Functions that May Modify [...] */
+
+
+/*! \brief \name Functions that May Modify the Dimension of the Vector Space */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Seeing a polyhedron as a set of tuples (its points), assigns
+  to \p x all the tuples that can be obtained by concatenating,
+  in the order given, a tuple of \p x with a tuple of \p y.
+*/
+int
+ppl_Polyhedron_concatenate_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph
+  and to \p ph itself.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Removes from the vector space enclosing \p ph the space dimensions that
+  are specified in first \p n positions of the array \p ds.  The presence
+  of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_Polyhedron_remove_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type ds[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Removes the higher dimensions from the vector space enclosing \p ph
+  so that, upon successful return, the new space dimension is \p d.
+*/
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type d);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Remaps the dimensions of the vector space according to a
+  \extref{Mapping_the_Dimensions_of_the_Vector_Space, partial function}.
+  This function is specified by means of the \p maps array,
+  which has \p n entries.
+
+  The partial function is defined on dimension <CODE>i</CODE>
+  if <CODE>i < n</CODE> and <CODE>maps[i] != ppl_not_a_dimension</CODE>;
+  otherwise it is undefined on dimension <CODE>i</CODE>.
+  If the function is defined on dimension <CODE>i</CODE>, then dimension
+  <CODE>i</CODE> is mapped onto dimension <CODE>maps[i]</CODE>.
+
+  The result is undefined if \p maps does not encode a partial
+  function with the properties described in the
+  \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+          specification of the mapping operator}.
+*/
+int
+ppl_Polyhedron_map_space_dimensions
+(ppl_Polyhedron_t ph, ppl_dimension_type maps[], size_t n);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  \extref{expand_space_dimension, Expands} the \f$d\f$-th dimension of
+  the vector space enclosing \p ph to \p m new space dimensions.
+*/
+int
+ppl_Polyhedron_expand_space_dimension
+(ppl_Polyhedron_t ph, ppl_dimension_type d, ppl_dimension_type m);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Modifies \p ph by \extref{fold_space_dimensions, folding} the
+  space dimensions contained in the first \p n positions of the array \p ds
+  into dimension \p d.  The presence of duplicates in \p ds is a waste
+  but an innocuous one.
+*/
+int
+ppl_Polyhedron_fold_space_dimensions
+(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d);
+
+/*@}*/ /* Functions that May Modify the Dimension of the Vector Space */
+
+/*! \brief \name Input/Output Functions */
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag
+  \brief Prints \p x to \c stdout.
+*/
+int
+ppl_io_print_Polyhedron(ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag
+  \brief Prints \p x to the given output \p stream.
+*/
+int
+ppl_io_fprint_Polyhedron(FILE* stream, ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Prints \p x to a malloc-allocated string, a pointer to which
+  is returned via \p strp.
+*/
+int
+ppl_io_asprint_Polyhedron(char** strp, ppl_const_Polyhedron_t x);
+
+/*! \relates ppl_Polyhedron_tag
+  \brief Dumps an ascii representation of \p x on \p stream.
+*/
+int
+ppl_Polyhedron_ascii_dump(ppl_const_Polyhedron_t x, FILE* stream);
+
+/*! \relates ppl_Polyhedron_tag
+  \brief Loads an ascii representation of \p x from \p stream.
+*/
+int
+ppl_Polyhedron_ascii_load(ppl_Polyhedron_t x, FILE* stream);
+
+/*@}*/ /* Input-Output Functions */
+
+
+/*! \name Ad Hoc Functions for (C or NNC) Polyhedra
+  The functions listed here below, being specific of the polyhedron domains,
+  do not have a correspondence in other semantic geometric descriptions.
+*/
+/*@{*/
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new C polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_C_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new C polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new NNC polyhedron from the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+*/
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Builds a new NNC polyhedron recycling the system of generators
+  \p gs and writes a handle for the newly created polyhedron at
+  address \p pph.
+
+  The new polyhedron will inherit the space dimension of \p gs.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes a const handle to the generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Writes a const handle to the minimized generator system defining the
+  polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_get_minimized_generators
+(ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds a copy of the generator \p g to the system of generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generator
+(ppl_Polyhedron_t ph, ppl_const_Generator_t g);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds a copy of the system of generators \p gs to the system of
+  generators of \p ph.
+*/
+int
+ppl_Polyhedron_add_generators
+(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Adds the system of generators \p gs to the system of generators of
+  \p ph.
+
+  \warning
+  This function modifies the generator system referenced by \p gs:
+  upon return, no assumption can be made on its value.
+*/
+int
+ppl_Polyhedron_add_recycled_generators
+(ppl_Polyhedron_t ph, ppl_Generator_System_t gs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p x the \extref{Convex_Polyhedral_Difference, poly-difference}
+  of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  Assigns to \p ph the polyhedron obtained from \p ph by "wrapping" the vector
+  space defined by the first \p n space dimensions in \p ds[].
+
+  \param ph
+  The polyhedron that is transformed;
+
+  \param ds[]
+  Specifies the space dimensions to be wrapped.
+
+  \param n
+  The first \p n space dimensions in the array \p ds[] will be wrapped.
+
+  \param w
+  The width of the bounded integer type corresponding to
+  all the dimensions to be wrapped.
+
+  \param r
+  The representation of the bounded integer type corresponding to
+  all the dimensions to be wrapped.
+
+  \param o
+  The overflow behavior of the bounded integer type corresponding to
+  all the dimensions to be wrapped.
+
+  \param pcs
+  Possibly null pointer to a constraint system whose space dimensions
+  are the first \p n dimensions in \p ds[]. If <CODE>*pcs</CODE>
+  depends on variables not in \p vars, the behavior is undefined.
+  When non-null, the constraint system is assumed to
+  represent the conditional or looping construct guard with respect
+  to which wrapping is performed.  Since wrapping requires the
+  computation of upper bounds and due to non-distributivity of
+  constraint refinement over upper bounds, passing a constraint
+  system in this way can be more precise than refining the result of
+  the wrapping operation with the constraints in <CODE>cs</CODE>.
+
+  \param complexity_threshold
+  A precision parameter where higher values result in possibly improved
+  precision.
+
+  \param wrap_individually
+  Non-zero if the dimensions should be wrapped individually
+  (something that results in much greater efficiency to the detriment of
+  precision).
+  */
+  int wrap_assign(ppl_Polyhedron_t ph,
+                  ppl_dimension_type ds[],
+                  size_t n,
+                  ppl_enum_Bounded_Integer_Type_Width w,
+                  ppl_enum_Bounded_Integer_Type_Representation r,
+                  ppl_enum_Bounded_Integer_Type_Overflow o,
+                  const ppl_const_Constraint_System_t* pcs,
+                  unsigned complexity_threshold,
+                  int wrap_individually);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y.  If \p tp is not the null pointer, the
+  \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y.  If \p tp is not the null pointer, the
+  \extref{Widening_with_Tokens, widening with tokens} delay technique is
+  applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y, unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign
+(ppl_Polyhedron_t x, ppl_const_Polyhedron_t y);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.  If \p tp is not the null pointer,
+  the \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x. If \p tp is not the null
+  pointer, the \extref{Widening_with_Tokens, widening with tokens} delay
+  technique is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p
+  x. If \p tp is not the null pointer,
+  the \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+  If \p tp is not the null pointer,
+  the \extref{Widening_with_Tokens, widening with tokens} delay technique
+  is applied with <CODE>*tp</CODE> available tokens.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{BHRZ03_widening, BHRZ03-widening} of
+  \p x and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*! \relates ppl_Polyhedron_tag \brief
+  If the polyhedron \p y is contained in (or equal to) the polyhedron
+  \p x, assigns to \p x the \extref{H79_widening, H79-widening} of \p x
+  and \p y intersected with the constraints in \p cs that are
+  satisfied by all the points of \p x, further intersected with all
+  the constraints of the form \f$\pm v \leq r\f$ and \f$\pm v < r\f$,
+  with \f$r \in \Qset\f$, that are satisfied by all the points of \p x.
+*/
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs);
+
+/*@}*/ /* Ad Hoc Functions for (C or NNC) Polyhedra */
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_tag
+  \brief
+  Types and functions for the Pointset_Powerset of C_Polyhedron objects.
+
+  The powerset domains can be instantiated by taking as a base domain
+  any fixed semantic geometric description
+  (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+  An element of the powerset domain represents a disjunctive collection
+  of base objects (its disjuncts), all having the same space dimension.
+
+  Besides the functions that are available in all semantic geometric
+  descriptions (whose documentation is not repeated here),
+  the powerset domain also provides several ad hoc functions.
+  In particular, the iterator types allow for the examination and
+  manipulation of the collection of disjuncts.
+*/
+
+#if !defined(PPL_DOXYGEN_CONFIGURED_MANUAL)
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_tag*
+        ppl_Pointset_Powerset_C_Polyhedron_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_tag const*
+        ppl_const_Pointset_Powerset_C_Polyhedron_t;
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_iterator_tag
+  \brief
+  Types and functions for iterating on the disjuncts of a
+  ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_iterator_tag*
+        ppl_Pointset_Powerset_C_Polyhedron_iterator_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_iterator_tag const*
+        ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t;
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag
+  \brief
+  Types and functions for iterating on the disjuncts of a
+  const ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+/*! \brief Opaque pointer \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag*
+        ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t;
+
+/*! \brief Opaque pointer to const object \ingroup Datatypes */
+typedef struct ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag const*
+        ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t;
+
+#endif /* !defined(PPL_DOXYGEN_CONFIGURED_MANUAL) */
+
+/*! \brief \name Construction, Initialization and Destruction */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Builds a new `iterator' and writes a handle to it
+  at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Builds a copy of \p y and writes a handle to it at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it
+  at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Builds a copy of \p y and writes a handle to it at address \p pit.
+*/
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator_from_const_iterator
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Assigns to \p psit an iterator "pointing" to the beginning of
+  the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_begin
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Assigns to \p psit a const iterator "pointing" to the beginning of
+  the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Assigns to \p psit an iterator "pointing" past the end of
+  the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_end
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Assigns to \p psit a const iterator "pointing" past the end of
+  the sequence of disjuncts of \p ps.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Invalidates the handle \p it: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_iterator
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Invalidates the handle \p it: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*@}*/ /* Construction, Initialization and Destruction */
+
+/*! \brief \name Dereferencing, Increment, Decrement and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Dereferences \p it writing a const handle to the resulting disjunct
+  at address \p d.
+
+  \note
+  Even though \p it is an non-const iterator, dereferencing it results
+  in a handle to a \b const disjunct. This is because mutable iterators
+  are meant to allow for the modification of the sequence of disjuncts
+  (e.g., by dropping elements), while preventing direct modifications
+  of the disjuncts they point to.
+
+  \warning
+  On exit, the disjunct \p d is still owned by the powerset object:
+  any function call on the owning powerset object may invalidate it.
+  Moreover, \p d should \b not be deleted directly: its resources will
+  be released when deleting the owning powerset.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t it,
+ ppl_const_Polyhedron_t* d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Dereferences \p it writing a const handle to the resulting disjunct
+  at address \p d.
+
+  \warning
+  On exit, the disjunct \p d is still owned by the powerset object:
+  any function call on the owning powerset object may invalidate it.
+  Moreover, \p d should \b not be deleted directly: its resources will
+  be released when deleting the owning powerset.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t it,
+ ppl_const_Polyhedron_t* d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Increments \p it so that it "points" to the next disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_increment
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Increments \p it so that it "points" to the next disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Decrements \p it so that it "points" to the previous disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement
+(ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Decrements \p it so that it "points" to the previous disjunct.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_decrement
+(ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test
+(ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test
+(ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y);
+
+/*@}*/ /* Dereferencing, Increment, Decrement and Equality Testing */
+
+
+/*! \brief \name Ad Hoc Functions for Pointset_Powerset domains */
+/*@{*/
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Drops from the sequence of disjuncts in \p ps all the
+  non-maximal elements so that \p ps is non-redundant.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_omega_reduce
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Writes to \p sz the number of disjuncts in \p ps.
+
+  \note
+  If present, Omega-redundant elements will be counted too.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_size
+(ppl_const_Pointset_Powerset_C_Polyhedron_t ps, size_t* sz);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Returns a positive integer if powerset \p x geometrically covers
+  powerset \p y; returns 0 otherwise.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron
+(ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Returns a positive integer if powerset \p x is geometrically
+  equal to powerset \p y; returns 0 otherwise.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron
+(ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+ ppl_const_Pointset_Powerset_C_Polyhedron_t y);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Adds to \p ps a copy of disjunct \p d.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_disjunct
+(ppl_Pointset_Powerset_C_Polyhedron_t ps, ppl_const_Polyhedron_t d);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Drops from \p ps the disjunct pointed to by \p cit,
+  assigning to \p it an iterator to the disjunct following \p cit.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t it);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Drops from \p ps all the disjuncts from \p first to \p last (excluded).
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts
+(ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t last);
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag \brief
+  Modifies \p ps by (recursively) merging together the pairs of
+  disjuncts whose upper-bound is the same as their set-theoretical union.
+*/
+int
+ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce
+(ppl_Pointset_Powerset_C_Polyhedron_t ps);
+
+/*@}*/ /* Ad Hoc Functions for Pointset_Powerset domains */
diff --git a/interfaces/C/Makefile.am b/interfaces/C/Makefile.am
new file mode 100644
index 0000000..407ac02
--- /dev/null
+++ b/interfaces/C/Makefile.am
@@ -0,0 +1,268 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = . tests
+
+interface_generator_files = \
+ppl_interface_generator_c_procedure_generators.m4 \
+ppl_interface_generator_c_h.m4 \
+ppl_interface_generator_c_h_code.m4 \
+ppl_interface_generator_c_cc_files.m4 \
+ppl_interface_generator_c_hh_files.m4 \
+ppl_interface_generator_c_cc_code.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_c_header.h \
+C_interface.dox
+
+# Libtool -version-info for libppl_c.la.
+#
+#  1. Start with version information of `0:0:0' for each Libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    -----
+#	    0.4			    0:0:0
+#	    0.5			    1:0:1
+#	    0.6			    1:0:1
+#	    0.6.1		    1:0:1
+#	    0.7			    1:0:1
+#	    0.8			    1:0:1
+#	    0.9			    1:0:1
+#	    0.10		    2:0:0
+#	    0.10.1		    2:0:0 (was not updated by mistake)
+#	    0.10.2		    3:0:1
+#	    0.11		    4:0:0
+
+LIBPPL_C_LT_CURRENT =  4
+LIBPPL_C_LT_REVISION = 0
+LIBPPL_C_LT_AGE =      0
+
+
+if HAVE_PERL
+
+ppl_c.h: ppl_c_header.h ppl_c_version.h ppl_c_domains.h Makefile $(top_builddir)/utils/build_header
+	$(top_builddir)/utils/build_header \
+		-I $(top_builddir)/interfaces/C -I $(top_srcdir)/src \
+		$(top_srcdir)/interfaces/C/ppl_c_header.h >$@
+
+else !HAVE_PERL
+
+ppl_c.h:	ppl_c.h.dist
+	cp -f ppl_c.h.dist $@
+
+endif !HAVE_PERL
+
+BUILT_SOURCES = \
+ppl_c.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+# ppl_c.h is not distributed.
+# ppl_c.h.dist, which is distributed, is a copy of ppl_c.h.
+dist-hook:
+	mv -f $(distdir)/ppl_c.h $(distdir)/ppl_c.h.dist
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+ppl_c_domains.h: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_h.m4 > $@
+
+ppl_c_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_cc_files.m4 \
+                > ppl_c_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_c_cc_blob
+	rm -f ppl_c_cc_blob
+	echo timestamp >$@
+
+ppl_c_implementation_domains.hh: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_hh_files.m4 \
+                > ppl_c_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_c_hh_blob
+	rm -f ppl_c_hh_blob
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/interfaces/C \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl_c.la
+
+libppl_c_la_SOURCES = \
+ppl_c_implementation_common_defs.hh \
+ppl_c_implementation_common_inlines.hh \
+ppl_c_implementation_common.cc
+
+nodist_libppl_c_la_SOURCES =
+
+nodist_EXTRA_libppl_c_la_SOURCES = \
+ppl_c_Int8_Box.cc \
+ppl_c_Int16_Box.cc \
+ppl_c_Int32_Box.cc \
+ppl_c_Int64_Box.cc \
+ppl_c_Uint8_Box.cc \
+ppl_c_Uint16_Box.cc \
+ppl_c_Uint32_Box.cc \
+ppl_c_Uint64_Box.cc \
+ppl_c_Float_Box.cc \
+ppl_c_Double_Box.cc \
+ppl_c_Long_Double_Box.cc \
+ppl_c_Rational_Box.cc \
+ppl_c_Z_Box.cc \
+ppl_c_BD_Shape_int8_t.cc \
+ppl_c_BD_Shape_int16_t.cc \
+ppl_c_BD_Shape_int32_t.cc \
+ppl_c_BD_Shape_int64_t.cc \
+ppl_c_BD_Shape_float.cc \
+ppl_c_BD_Shape_double.cc \
+ppl_c_BD_Shape_long_double.cc \
+ppl_c_BD_Shape_mpq_class.cc \
+ppl_c_BD_Shape_mpz_class.cc \
+ppl_c_Octagonal_Shape_int8_t.cc \
+ppl_c_Octagonal_Shape_int16_t.cc \
+ppl_c_Octagonal_Shape_int32_t.cc \
+ppl_c_Octagonal_Shape_int64_t.cc \
+ppl_c_Octagonal_Shape_float.cc \
+ppl_c_Octagonal_Shape_double.cc \
+ppl_c_Octagonal_Shape_long_double.cc \
+ppl_c_Octagonal_Shape_mpq_class.cc \
+ppl_c_Octagonal_Shape_mpz_class.cc \
+ppl_c_Polyhedron.cc \
+ppl_c_Grid.cc \
+ppl_c_Pointset_Powerset_Int8_Box.cc \
+ppl_c_Pointset_Powerset_Int16_Box.cc \
+ppl_c_Pointset_Powerset_Int32_Box.cc \
+ppl_c_Pointset_Powerset_Int64_Box.cc \
+ppl_c_Pointset_Powerset_Uint8_Box.cc \
+ppl_c_Pointset_Powerset_Uint16_Box.cc \
+ppl_c_Pointset_Powerset_Uint32_Box.cc \
+ppl_c_Pointset_Powerset_Uint64_Box.cc \
+ppl_c_Pointset_Powerset_Float_Box.cc \
+ppl_c_Pointset_Powerset_Double_Box.cc \
+ppl_c_Pointset_Powerset_Long_Double_Box.cc \
+ppl_c_Pointset_Powerset_Rational_Box.cc \
+ppl_c_Pointset_Powerset_Z_Box.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_float.cc \
+ppl_c_Pointset_Powerset_BD_Shape_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_C_Polyhedron.cc \
+ppl_c_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_c_Pointset_Powerset_Grid.cc \
+ppl_c_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_c_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_c_la_LIBADD = \
+ at required_instantiations_c_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_c_la_DEPENDENCIES = \
+ at required_instantiations_c_cxx_objects@
+
+libppl_c_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+include_HEADERS = ppl_c.h
+
+nodist_noinst_HEADERS = \
+ppl_c_domains.h \
+ppl_c_version.h
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_c_cxx_objects@
+
+CLEANFILES = \
+ at required_instantiations_c_cxx_sources@ \
+ at required_instantiations_c_cxx_headers@ \
+ppl_c.h \
+ppl_c_domains.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+DISTCLEANFILES = \
+ppl_c_version.h
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+$(top_builddir)/utils/build_header:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_c_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_c_la_SOURCES):
diff --git a/interfaces/C/Makefile.in b/interfaces/C/Makefile.in
new file mode 100644
index 0000000..166d346
--- /dev/null
+++ b/interfaces/C/Makefile.in
@@ -0,0 +1,1222 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/C
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(srcdir)/ppl_c_version.h.in \
+	$(top_srcdir)/depcomp $(include_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = ppl_c_version.h
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am_libppl_c_la_OBJECTS = ppl_c_implementation_common.lo
+nodist_libppl_c_la_OBJECTS =
+libppl_c_la_OBJECTS = $(am_libppl_c_la_OBJECTS) \
+	$(nodist_libppl_c_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_c_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_c_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_c_la_SOURCES) $(nodist_libppl_c_la_SOURCES) \
+	$(nodist_EXTRA_libppl_c_la_SOURCES)
+DIST_SOURCES = $(libppl_c_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = . tests
+interface_generator_files = \
+ppl_interface_generator_c_procedure_generators.m4 \
+ppl_interface_generator_c_h.m4 \
+ppl_interface_generator_c_h_code.m4 \
+ppl_interface_generator_c_cc_files.m4 \
+ppl_interface_generator_c_hh_files.m4 \
+ppl_interface_generator_c_cc_code.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_c_header.h \
+C_interface.dox
+
+
+# Libtool -version-info for libppl_c.la.
+#
+#  1. Start with version information of `0:0:0' for each Libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    -----
+#	    0.4			    0:0:0
+#	    0.5			    1:0:1
+#	    0.6			    1:0:1
+#	    0.6.1		    1:0:1
+#	    0.7			    1:0:1
+#	    0.8			    1:0:1
+#	    0.9			    1:0:1
+#	    0.10		    2:0:0
+#	    0.10.1		    2:0:0 (was not updated by mistake)
+#	    0.10.2		    3:0:1
+#	    0.11		    4:0:0
+LIBPPL_C_LT_CURRENT = 4
+LIBPPL_C_LT_REVISION = 0
+LIBPPL_C_LT_AGE = 0
+BUILT_SOURCES = \
+ppl_c.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/interfaces/C \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl_c.la
+libppl_c_la_SOURCES = \
+ppl_c_implementation_common_defs.hh \
+ppl_c_implementation_common_inlines.hh \
+ppl_c_implementation_common.cc
+
+nodist_libppl_c_la_SOURCES = 
+nodist_EXTRA_libppl_c_la_SOURCES = \
+ppl_c_Int8_Box.cc \
+ppl_c_Int16_Box.cc \
+ppl_c_Int32_Box.cc \
+ppl_c_Int64_Box.cc \
+ppl_c_Uint8_Box.cc \
+ppl_c_Uint16_Box.cc \
+ppl_c_Uint32_Box.cc \
+ppl_c_Uint64_Box.cc \
+ppl_c_Float_Box.cc \
+ppl_c_Double_Box.cc \
+ppl_c_Long_Double_Box.cc \
+ppl_c_Rational_Box.cc \
+ppl_c_Z_Box.cc \
+ppl_c_BD_Shape_int8_t.cc \
+ppl_c_BD_Shape_int16_t.cc \
+ppl_c_BD_Shape_int32_t.cc \
+ppl_c_BD_Shape_int64_t.cc \
+ppl_c_BD_Shape_float.cc \
+ppl_c_BD_Shape_double.cc \
+ppl_c_BD_Shape_long_double.cc \
+ppl_c_BD_Shape_mpq_class.cc \
+ppl_c_BD_Shape_mpz_class.cc \
+ppl_c_Octagonal_Shape_int8_t.cc \
+ppl_c_Octagonal_Shape_int16_t.cc \
+ppl_c_Octagonal_Shape_int32_t.cc \
+ppl_c_Octagonal_Shape_int64_t.cc \
+ppl_c_Octagonal_Shape_float.cc \
+ppl_c_Octagonal_Shape_double.cc \
+ppl_c_Octagonal_Shape_long_double.cc \
+ppl_c_Octagonal_Shape_mpq_class.cc \
+ppl_c_Octagonal_Shape_mpz_class.cc \
+ppl_c_Polyhedron.cc \
+ppl_c_Grid.cc \
+ppl_c_Pointset_Powerset_Int8_Box.cc \
+ppl_c_Pointset_Powerset_Int16_Box.cc \
+ppl_c_Pointset_Powerset_Int32_Box.cc \
+ppl_c_Pointset_Powerset_Int64_Box.cc \
+ppl_c_Pointset_Powerset_Uint8_Box.cc \
+ppl_c_Pointset_Powerset_Uint16_Box.cc \
+ppl_c_Pointset_Powerset_Uint32_Box.cc \
+ppl_c_Pointset_Powerset_Uint64_Box.cc \
+ppl_c_Pointset_Powerset_Float_Box.cc \
+ppl_c_Pointset_Powerset_Double_Box.cc \
+ppl_c_Pointset_Powerset_Long_Double_Box.cc \
+ppl_c_Pointset_Powerset_Rational_Box.cc \
+ppl_c_Pointset_Powerset_Z_Box.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_BD_Shape_float.cc \
+ppl_c_Pointset_Powerset_BD_Shape_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_c_Pointset_Powerset_C_Polyhedron.cc \
+ppl_c_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_c_Pointset_Powerset_Grid.cc \
+ppl_c_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_c_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_c_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_c_la_LIBADD = \
+ at required_instantiations_c_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_c_la_DEPENDENCIES = \
+ at required_instantiations_c_cxx_objects@
+
+libppl_c_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+include_HEADERS = ppl_c.h
+nodist_noinst_HEADERS = \
+ppl_c_domains.h \
+ppl_c_version.h
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_c_cxx_objects@
+
+CLEANFILES = \
+ at required_instantiations_c_cxx_sources@ \
+ at required_instantiations_c_cxx_headers@ \
+ppl_c.h \
+ppl_c_domains.h \
+ppl_c_implementation_domains.hh \
+ppl_c_implementation_domains.cc.stamp
+
+DISTCLEANFILES = \
+ppl_c_version.h
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/C/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+ppl_c_version.h: $(top_builddir)/config.status $(srcdir)/ppl_c_version.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_c.la: $(libppl_c_la_OBJECTS) $(libppl_c_la_DEPENDENCIES) $(EXTRA_libppl_c_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_c_la_LINK) -rpath $(libdir) $(libppl_c_la_OBJECTS) $(libppl_c_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_c_implementation_common.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libLTLIBRARIES \
+	clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-includeHEADERS install-info \
+	install-info-am install-libLTLIBRARIES install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+
+ at HAVE_PERL_TRUE@ppl_c.h: ppl_c_header.h ppl_c_version.h ppl_c_domains.h Makefile $(top_builddir)/utils/build_header
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/build_header \
+ at HAVE_PERL_TRUE@		-I $(top_builddir)/interfaces/C -I $(top_srcdir)/src \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/interfaces/C/ppl_c_header.h >$@
+
+ at HAVE_PERL_FALSE@ppl_c.h:	ppl_c.h.dist
+ at HAVE_PERL_FALSE@	cp -f ppl_c.h.dist $@
+
+# ppl_c.h is not distributed.
+# ppl_c.h.dist, which is distributed, is a copy of ppl_c.h.
+dist-hook:
+	mv -f $(distdir)/ppl_c.h $(distdir)/ppl_c.h.dist
+
+ppl_c_domains.h: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_h.m4 > $@
+
+ppl_c_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_cc_files.m4 \
+                > ppl_c_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_c_cc_blob
+	rm -f ppl_c_cc_blob
+	echo timestamp >$@
+
+ppl_c_implementation_domains.hh: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_c_hh_files.m4 \
+                > ppl_c_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_c_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_c_hh_blob
+	rm -f ppl_c_hh_blob
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+$(top_builddir)/utils/build_header:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_c_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_c_la_SOURCES):
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/C/ppl_c.h.dist b/interfaces/C/ppl_c.h.dist
new file mode 100644
index 0000000..a81d612
--- /dev/null
+++ b/interfaces/C/ppl_c.h.dist
@@ -0,0 +1,16187 @@
+/* This is the header file of the C interface of the Parma Polyhedra Library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*!
+  \defgroup PPL_C_interface C Language Interface
+
+  The Parma Polyhedra Library comes equipped with an interface
+  for the C language.
+*/
+
+/*! \mainpage
+
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures.  The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+\note
+All functions taking as input argument an opaque pointer datatype assume
+that such an argument is actually <em>referring to a valid PPL object</em>.
+For instance, a function with an argument having type
+<code>ppl_MIP_Problem_t</code> will expect a valid MIP_Problem object,
+previously initialized by calling, e.g., <code>ppl_new_MIP_Problem</code>.
+If that is not the case (e.g., if a null pointer is passed in),
+the behavior is undefined.
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function.  This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used.  The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version.  This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking.  Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line.  For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects.  Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location.  In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms.  Consult your
+compiler's documentation for details.  Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase.  See Libtool's documentation for details.  Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution.  It contains a <EM>Mixed Integer (Linear)
+Programming</EM> solver written in C.  In order to use this solver
+you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/ /* \mainpage */
+
+/*
+  For some reason, GMP up to and including version 4.1.3 requires
+  <stdio.h> to be included before <gmp.h>.
+*/
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+  PPL_PROTO is a macro used to wrap function prototypes, so that
+  compilers that don't understand ANSI C prototypes still work, and
+  ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__)                              \
+  || defined(__cplusplus)                          \
+  || defined (_AIX)                                \
+  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+  || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \defgroup Init Library Initialization and Finalization
+  Functions for initialization/finalization of the library,
+  as well as setting/resetting of floating-point rounding mode.
+*/
+/*@{*/
+
+/*! \brief
+  Initializes the Parma Polyhedra Library.
+  This function must be called before any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+  Finalizes the Parma Polyhedra Library.
+  This function must be called after any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+int
+ppl_set_rounding_for_PPL PPL_PROTO((void));
+
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
+
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+int
+ppl_restore_pre_PPL_rounding PPL_PROTO((void));
+
+/*! \brief
+  Writes to \p p the precision parameter used for irrational calculations.
+*/
+int
+ppl_irrational_precision PPL_PROTO((unsigned* p));
+
+/*! \brief
+  Sets the precision parameter used for irrational calculations.
+
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for irrational calculations to \p p.
+  Then, in the irrational calculations returning an unbounded rational,
+  (e.g., when computing a square root), the lesser between numerator
+  and denominator will be limited to 2**\p p.
+*/
+int
+ppl_set_irrational_precision PPL_PROTO((unsigned p));
+
+/*@}*/ /* Init */
+
+/*! \defgroup Version Version Checking
+  Symbolic constants and functions related to library version checking.
+*/
+/*@{*/
+
+/* Automatically generated from PPL source file ../../interfaces/C/ppl_c_version.h line 1. */
+/* Header file providing version information for the C interface.  -*- C -*-
+*/
+
+/*! \brief
+  A string containing the PPL version.
+
+  \ingroup Version
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "1.1"
+
+/*! \brief
+  The major number of the PPL version.
+  \ingroup Version
+*/
+#define PPL_VERSION_MAJOR 1
+
+/*! \brief
+  The minor number of the PPL version.
+  \ingroup Version
+*/
+#define PPL_VERSION_MINOR 1
+
+/*! \brief
+  The revision number of the PPL version.
+  \ingroup Version
+*/
+#define PPL_VERSION_REVISION 0
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+  \ingroup Version
+*/
+#define PPL_VERSION_BETA 0
+
+/*! \brief
+  Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+  Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+  Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+  Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the
+  PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the PPL banner.
+
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \defgroup Error Error Handling
+  Symbolic constants and functions related to error reporting/handling.
+*/
+/*@{*/
+
+/*! \brief
+  Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+  /*! \hideinitializer
+    The virtual memory available to the process has been exhausted. */
+  PPL_ERROR_OUT_OF_MEMORY = -2,
+  /*! \hideinitializer
+    A function has been invoked with an invalid argument. */
+  PPL_ERROR_INVALID_ARGUMENT = -3,
+  /*! \hideinitializer
+    A function has been invoked outside its domain of definition. */
+  PPL_ERROR_DOMAIN_ERROR = -4,
+  /*! \hideinitializer
+    The construction of an object that would exceed its maximum
+    permitted size was attempted. */
+  PPL_ERROR_LENGTH_ERROR = -5,
+  /*! \hideinitializer
+    An arithmetic overflow occurred and the computation was consequently
+    interrupted.  This can <EM>only</EM> happen in library's incarnations
+    using bounded integers as coefficients. */
+  PPL_ARITHMETIC_OVERFLOW = -6,
+  /*! \hideinitializer
+    An error occurred during a C input/output operation.  A more
+    precise indication of what went wrong is available via
+    <CODE>errno</CODE>. */
+  PPL_STDIO_ERROR = -7,
+  /*! \hideinitializer
+    An internal error that was diagnosed by the PPL itself.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_INTERNAL_ERROR = -8,
+  /*! \hideinitializer
+    A standard exception has been raised by the C++ run-time environment.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+  /*! \hideinitializer
+    A totally unknown, totally unexpected error happened.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNEXPECTED_ERROR = -10,
+  /*! \hideinitializer
+    An exception has been raised by the PPL as a timeout previously set
+    by the user has expired.
+  */
+  PPL_TIMEOUT_EXCEPTION = -11,
+  /*! \hideinitializer
+    The client program attempted to use the PPL in a way that violates
+    its internal logic.  This happens, for instance, when the client
+    attempts to use the timeout facilities on a system that does not
+    support them. */
+  PPL_ERROR_LOGIC_ERROR = -12
+};
+
+/*! \brief
+  Installs the user-defined error handler pointed at by \p h.
+
+  The error handler takes an error code and a textual description that
+  gives further information about the actual error.  The C string
+  containing the textual description is read-only and its existence is
+  not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+                                           const char* description)));
+
+/*@}*/ /* Error */
+
+/*! \defgroup Timeout Timeout Handling
+  Functions for setting and resetting timeouts.
+*/
+/*@{*/
+
+/*! \brief
+  Sets the timeout for computations whose completion could require
+  an exponential amount of time.
+
+  \param csecs
+  The number of centiseconds sometimes after which a timeout will occur;
+  it must be strictly greater than zero.
+
+  Computations taking exponential time will be interrupted some time
+  after \p csecs centiseconds have elapsed since the call to
+  the timeout setting function. If the computation is interrupted that
+  way, the interrupted function will return error code
+  <code>PPL_TIMEOUT_EXCEPTION</code>.
+  Otherwise, if the computation completes without being interrupted,
+  then the timeout should be reset by calling
+  <code>ppl_reset_timeout()</code>.
+*/
+int
+ppl_set_timeout PPL_PROTO((unsigned csecs));
+
+/*! \brief
+  Resets the timeout time so that the computation is not interrupted.
+*/
+int
+ppl_reset_timeout PPL_PROTO((void));
+
+/*! \brief
+  Sets a threshold for computations whose completion could require
+  an exponential amount of time.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if \p unscaled_weight is zero
+  or if the computed weight threshold exceeds the maximum allowed value.
+
+  \param unscaled_weight
+  The unscaled maximum computational weight; it has to be non-zero.
+
+  \param scale
+  The scaling factor to be applied to \p unscaled_weight.
+
+  If \p unscaled_weight has value \f$u\f$ and \p scale has value \f$s\f$,
+  then the (scaled) weight threshold is computed as \f$w = u \cdot 2^s\f$.
+  Computations taking exponential time will be interrupted some time
+  after reaching the complexity threshold \f$w\f$.
+  If the computation is interrupted that way, the interrupted function
+  will return error code <code>PPL_TIMEOUT_EXCEPTION</code>.
+  Otherwise, if the computation completes without being interrupted,
+  then the deterministic timeout should be reset by calling
+  <code>ppl_reset_deterministic_timeout()</code>.
+
+  \note
+  This "timeout" checking functionality is said to be \e deterministic
+  because it is not based on actual elapsed time. Its behavior will
+  only depend on (some of the) computations performed in the PPL library
+  and it will be otherwise independent from the computation environment
+  (CPU, operating system, compiler, etc.).
+
+  \warning
+  The weight mechanism is under beta testing. In particular,
+  there is still no clear relation between the weight threshold and
+  the actual computational complexity. As a consequence, client
+  applications should be ready to reconsider the tuning of these
+  weight thresholds when upgrading to newer version of the PPL.
+*/
+int
+ppl_set_deterministic_timeout PPL_PROTO((unsigned long unscaled_weight,
+                                         unsigned scale));
+
+/*! \brief
+  Resets the deterministic timeout so that the computation is not interrupted.
+*/
+int
+ppl_reset_deterministic_timeout PPL_PROTO((void));
+
+/*@}*/ /* Timeout */
+
+/*! \defgroup Datatypes Library Datatypes
+  \brief
+  Typedefs for the library datatypes and related symbolic constants.
+
+  The datatypes provided by the library should be manipulated
+  by means of the corresponding opaque pointer types and
+  the functions working on them.
+
+  \note
+  To simplify the detection of common programming mistakes,
+  we provide both pointer-to-const and pointer-to-nonconst
+  opaque pointers, with implicit conversions mapping each
+  pointer-to-nonconst to the corresponding pointer-to-const when needed.
+  The user of the C interface is therefore recommended to adopt
+  the pointer-to-const type whenever read-only access is meant.
+*/
+/*@{*/
+
+/*! \brief
+  An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \brief
+  Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Pretty-prints \p var to <CODE>stdout</CODE>.
+*/
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief
+  Pretty-prints \p var to the given output \p stream.
+*/
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+/*! \brief
+  Pretty-prints \p var to a malloc-allocated string, a pointer to which
+  is returned via \p strp.
+*/
+int
+ppl_io_asprint_variable PPL_PROTO((char** strp, ppl_dimension_type var));
+
+/*! \brief
+  The type of output functions used for printing variables.
+
+  An output function for variables must write a textual representation
+  for \p var to a character buffer, null-terminate it, and return a
+  pointer to the beginning of the buffer.  In case the operation fails,
+  0 should be returned and perhaps <CODE>errno</CODE> should be set
+  in a meaningful way.  The library does nothing with the buffer, besides
+  printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+  Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+  Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+/*! \brief Utility function for the wrapping of lines of text.
+
+  \param src
+  The source string holding the text to wrap.
+
+  \param indent_depth
+  The indentation depth.
+
+  \param preferred_first_line_length
+  The preferred length for the first line of text.
+
+  \param preferred_line_length
+  The preferred length for all the lines but the first one.
+
+  \return
+  The wrapped string in a malloc-allocated buffer.
+*/
+char*
+ppl_io_wrap_string(const char* src,
+                   unsigned indent_depth,
+                   unsigned preferred_first_line_length,
+                   unsigned preferred_line_length);
+
+/*@}*/ /* Datatypes */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type)                                    \
+/*! \brief Opaque pointer \ingroup Datatypes */                       \
+typedef struct ppl_##Type##_tag* ppl_##Type##_t;                      \
+/*! \brief Opaque pointer to const object \ingroup Datatypes */       \
+typedef struct ppl_##Type##_tag const* ppl_const_##Type##_t;
+
+/*! \interface ppl_Coefficient_tag
+  \brief
+  Types and functions for coefficients.
+
+  The types and functions for coefficients provide an interface towards
+  \extref{Parma_Polyhedra_Library::Coefficient, Coefficient}.
+  Depending on configuration, the PPL coefficients may be implemented
+  by the unbounded precision integers provided by GMP (default),
+  or by bounded precision integers (with checks for overflows).
+*/
+PPL_TYPE_DECLARATION(Coefficient)
+
+/*! \interface ppl_Linear_Expression_tag
+  \brief
+  Types and functions for linear expressions.
+
+  The types and functions for linear expression provide an interface towards
+  \extref{Parma_Polyhedra_Library::Linear_Expression, Linear_Expression}.
+*/
+PPL_TYPE_DECLARATION(Linear_Expression)
+
+/*! \interface ppl_Constraint_tag
+  \brief
+  Types and functions for constraints.
+
+  The types and functions for constraints provide an interface towards
+  \extref{Parma_Polyhedra_Library::Constraint, Constraint}.
+*/
+PPL_TYPE_DECLARATION(Constraint)
+
+/*! \interface ppl_Constraint_System_tag
+  \brief
+  Types and functions for constraint systems.
+
+  The types and functions for constraint systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Constraint_System, Constraint_System}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System)
+
+/*! \interface ppl_Constraint_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on constraint systems.
+
+  The types and functions for constraint systems iterators provide
+  read-only access to the elements of a constraint system by interfacing
+  \extref{Parma_Polyhedra_Library::Constraint_System_const_iterator,
+  Constraint_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator)
+
+/*! \interface ppl_Generator_tag
+  \brief
+  Types and functions for generators.
+
+  The types and functions for generators provide an interface
+  towards \extref{Parma_Polyhedra_Library::Generator, Generator}.
+*/
+PPL_TYPE_DECLARATION(Generator)
+
+/*! \interface ppl_Generator_System_tag
+  \brief
+  Types and functions for generator systems.
+
+  The types and functions for generator systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Generator_System, Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Generator_System)
+
+/*! \interface ppl_Generator_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on generator systems.
+
+  The types and functions for generator systems iterators provide
+  read-only access to the elements of a generator system by interfacing
+  \extref{Parma_Polyhedra_Library::Generator_System_const_iterator,
+  Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Generator_System_const_iterator)
+
+/*! \interface ppl_Congruence_tag
+  \brief
+  Types and functions for congruences.
+
+  The types and functions for congruences provide an interface
+  towards \extref{Parma_Polyhedra_Library::Congruence, Congruence}.
+*/
+PPL_TYPE_DECLARATION(Congruence)
+
+/*! \interface ppl_Congruence_System_tag
+  \brief
+  Types and functions for congruence systems.
+
+  The types and functions for congruence systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Congruence_System, Congruence_System}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System)
+
+/*! \interface ppl_Congruence_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on congruence systems.
+
+  The types and functions for congruence systems iterators provide
+  read-only access to the elements of a congruence system by interfacing
+  \extref{Parma_Polyhedra_Library::Congruence_System::const_iterator,
+  Congruence_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System_const_iterator)
+
+/*! \interface ppl_Grid_Generator_tag
+  \brief
+  Types and functions for grid generators.
+
+  The types and functions for grid generators provide an interface
+  towards \extref{Parma_Polyhedra_Library::Grid_Generator, Grid_Generator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator)
+
+/*! \interface ppl_Grid_Generator_System_tag
+  \brief
+  Types and functions for grid generator systems.
+
+  The types and functions for grid generator systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Grid_Generator_System,
+  Grid_Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System)
+
+/*! \interface ppl_Grid_Generator_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on grid generator systems.
+
+  The types and functions for grid generator systems iterators provide
+  read-only access to the elements of a grid generator system by interfacing
+  \extref{Parma_Polyhedra_Library::Grid_Generator_System::const_iterator,
+  Grid_Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System_const_iterator)
+
+/*! \interface ppl_MIP_Problem_tag
+  \brief
+  Types and functions for MIP problems.
+
+  The types and functions for MIP problems provide an interface
+  towards \extref{Parma_Polyhedra_Library::MIP_Problem, MIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(MIP_Problem)
+
+/*! \interface ppl_PIP_Problem_tag
+  \brief
+  Types and functions for PIP problems.
+
+  The types and functions for PIP problems provide an interface
+  towards \extref{Parma_Polyhedra_Library::PIP_Problem, PIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(PIP_Problem)
+
+/*! \interface ppl_PIP_Tree_Node_tag
+  \brief
+  Types and functions for generic PIP tree nodes.
+
+  The types and functions for tree nodes provide an interface
+  towards \extref{Parma_Polyhedra_Library::PIP_Tree_Node, PIP_Tree_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Tree_Node)
+
+/*! \interface ppl_PIP_Decision_Node_tag
+  \brief
+  Types and functions for PIP decision nodes.
+
+  The types and functions for decision nodes provide an interface towards
+  \extref{Parma_Polyhedra_Library::PIP_Decision_Node, PIP_Decision_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Decision_Node)
+
+/*! \interface ppl_PIP_Solution_Node_tag
+  \brief
+  Types and functions for PIP solution nodes.
+
+  The types and functions for solution nodes provide an interface towards
+  \extref{Parma_Polyhedra_Library::PIP_Solution_Node, PIP_Solution_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Solution_Node)
+
+/*! \interface ppl_Artificial_Parameter_tag
+  \brief
+  Types and functions for PIP artificial parameters.
+
+  The types and functions for PIP artificial parameters provide
+  an interface towards
+  \extref{Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter, Artificial_Parameter}.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter)
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence)
+
+/*! \interface ppl_Artificial_Parameter_Sequence_const_iterator_tag
+  \brief
+  Types and functions for iterating on PIP artificial parameters.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence_const_iterator)
+
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type)                               \
+/*! \relates ppl_##Type##_tag */                                        \
+int                                                                     \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x));                \
+/*! \relates ppl_##Type##_tag */                                        \
+int                                                                     \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag */                                        \
+int                                                                     \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+#define PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag */                    \
+int                                                 \
+ppl_##Type##_ascii_dump                             \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream));  \
+/*! \relates ppl_##Type##_tag */                    \
+int                                                 \
+ppl_##Type##_ascii_load                             \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_IO_FUNCTIONS(Type)      \
+PPL_DECLARE_PRINT_FUNCTIONS(Type)           \
+PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type)
+
+#define PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type)                  \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to \c stdout. */       \
+int                                                                     \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x));                \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to the given output \p stream. */ \
+int                                                                     \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to a malloc-allocated string, a pointer to which is returned via \p strp. */ \
+int                                                                     \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+
+#define PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag \brief Dumps an ascii representation of \p x on \p stream. */ \
+int                                                              \
+ppl_##Type##_ascii_dump                                          \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream));               \
+/*! \relates ppl_##Type##_tag \brief Loads an ascii representation of \p x from \p stream. */ \
+int                                                              \
+ppl_##Type##_ascii_load                                          \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Type)      \
+/*! \brief \name Input/Output Functions */               \
+/*@{*/                                                   \
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type)           \
+PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*@}*/ /* Input/Output Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+  Creates a new coefficient with value 0 and writes a handle for the
+  newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Creates a new coefficient with the value given by the GMP integer
+  \p z and writes a handle for the newly created coefficient
+  at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Builds a coefficient that is a copy of \p c; writes a handle
+  for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+                                                ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Read-Only Accessor Functions */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+  Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if coefficients are bounded; returns 0
+  otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/*@}*/ /* Read-Only Accessor Functions */
+
+/* No ascii dump for Coefficient */
+/*! \brief \name I/O Functions */
+/*@{*/
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Coefficient)
+/*@}*/ /* I/O Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  zero-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  <TT>d</TT>-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression that is a copy of \p le; writes a handle
+  for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to constraint \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to congruence \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Congruence
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to grid generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Grid_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Invalidates the handle \p le: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+                                             ppl_dimension_type var,
+                                             ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Returns a positive integer if \p le is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p le is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+    Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+*/
+int
+ppl_Linear_Expression_is_zero PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+*/
+int
+ppl_Linear_Expression_all_homogeneous_terms_are_zero
+PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Functions that Do Not Modify the Linear Expression */
+
+/*! \brief \name Functions that May Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Adds \p n to the coefficient of variable \p var in the linear
+  expression \p le.  The space dimension is set to be the maximum
+  between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+           ppl_dimension_type var,
+           ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Adds \p n to the inhomogeneous term of the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*@}*/ /* Functions that May Modify the Linear Expression */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Linear_Expression)
+
+/*! \brief \ingroup Datatypes
+  Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+  /*! The constraint is of the form \f$e < 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN,
+  /*! The constraint is of the form \f$e \leq 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL,
+  /*! The constraint is of the form \f$e = 0\f$. */
+  PPL_CONSTRAINT_TYPE_EQUAL,
+  /*! The constraint is of the form \f$e \geq 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL,
+  /*! The constraint is of the form \f$e > 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+  Creates the new constraint `\p le \p rel 0' and writes a handle for
+  it at address \p pc.  The space dimension of the new constraint is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+                              ppl_const_Linear_Expression_t le,
+                              enum ppl_enum_Constraint_Type rel));
+
+/*! \relates ppl_Constraint_tag \brief
+  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+  and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+  also known as <EM>positivity constraint</EM>.
+  A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+  Builds a constraint that is a copy of \p c; writes a handle
+  for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+                                              ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+  Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+                                                 ppl_const_Constraint_t src));
+
+/*! \relates ppl_Constraint_tag \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+                                          ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_tag \brief
+  Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+                                      ppl_dimension_type var,
+                                      ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+  Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+                                             ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds an empty system of constraints and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds a zero-dimensional, unsatisfiable constraint system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds the singleton constraint system containing only a copy of
+  constraint \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds a constraint system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Returns a positive integer if \p cs contains no (non-trivial) constraint;
+  returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_empty
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Returns a positive integer if \p cs contains any (non-trivial) strict
+  inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+           ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+           ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint System */
+
+/*! \brief \name Functions that May Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Removes all the constraints from the constraint system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Inserts a copy of the constraint \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+                                                   ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that May Modify the Constraint System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p cit; writes a
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+           ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+           ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Dereference \p cit writing a const handle to the resulting
+  constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+           ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+           ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+  Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+  /*! The generator is a line. */
+  PPL_GENERATOR_TYPE_LINE,
+  /*! The generator is a ray. */
+  PPL_GENERATOR_TYPE_RAY,
+  /*! The generator is a point. */
+  PPL_GENERATOR_TYPE_POINT,
+  /*! The generator is a closure point. */
+  PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+  Creates a new generator of direction \p le and type \p t.  If the
+  generator to be created is a point or a closure point, the divisor
+  \p d is applied to \p le.  For other types of generators \p d is
+  simply disregarded.  A handle for the new generator is written at
+  address \p pg.  The space dimension of the new generator is equal to
+  the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+                             ppl_const_Linear_Expression_t le,
+                             enum ppl_enum_Generator_Type t,
+                             ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Generator_tag \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new generator at address
+  \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+  Creates, as a closure point, the point that is the origin of the
+  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
+  generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+  Builds a generator that is a copy of \p g; writes a handle
+  for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+                                            ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+  Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+                                               ppl_const_Generator_t src));
+
+/*! \relates ppl_Generator_tag \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+                                         ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_tag \brief
+  Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+  Copies into \p n the coefficient of variable \p var in generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+                                     ppl_dimension_type var,
+                                     ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+  If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+                                 ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+  Builds an empty system of generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Builds the singleton generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+                                                   ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Builds a generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Returns a positive integer if \p gs contains no generators;
+  returns 0 otherwise.
+*/
+int
+ppl_Generator_System_empty
+PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+           ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+           ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Generator System */
+
+/*! \brief \name Functions that May Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+  Removes all the generators from the generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Inserts a copy of the generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+                                                 ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p git; writes a
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+           ppl_const_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+           ppl_const_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Dereference \p git writing a const handle to the resulting
+  generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+           ppl_const_Generator_t* pg));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+           ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+  Creates the new congruence \f$le = 0 \pmod{m}\f$ and writes a handle for
+  it at address \p pc.  The space dimension of the new congruence is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+                              ppl_const_Linear_Expression_t le,
+                              ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+  Creates the unsatisfiable (zero-dimension space) congruence
+  \f$0 = 1 \pmod{0}\f$ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_false PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+  Creates the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+  also known as <EM>integrality congruence</EM>.
+  A handle for the newly created congruence is written at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_integrality PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+  Builds a congruence that is a copy of \p c; writes a handle
+  for the newly created congruence at address \p pc.
+*/
+int
+ppl_new_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+                                              ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_tag \brief
+  Assigns a copy of the congruence \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t dst,
+                                                 ppl_const_Congruence_t src));
+
+/*! \relates ppl_Congruence_tag \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Congruence_space_dimension PPL_PROTO((ppl_const_Congruence_t c,
+                                          ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  congruence \p c.
+*/
+int
+ppl_Congruence_coefficient PPL_PROTO((ppl_const_Congruence_t c,
+                                      ppl_dimension_type var,
+                                      ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+  Copies into \p n the inhomogeneous term of congruence \p c.
+*/
+int
+ppl_Congruence_inhomogeneous_term PPL_PROTO((ppl_const_Congruence_t c,
+                                             ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+  Copies into \p m the modulus of congruence \p c.
+*/
+int
+ppl_Congruence_modulus PPL_PROTO((ppl_const_Congruence_t c,
+                                  ppl_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Congruence_OK PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds an empty system of congruences and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Congruence_System PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds a zero-dimensional, unsatisfiable congruence system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_zero_dim_empty
+PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds the singleton congruence system containing only a copy of
+  congruence \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds a congruence system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Assigns a copy of the congruence system \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Congruence_System_space_dimension
+PPL_PROTO((ppl_const_Congruence_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Returns a positive integer if \p cs contains no (non-trivial) congruence;
+  returns 0 otherwise.
+*/
+int
+ppl_Congruence_System_empty
+PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the congruence system \p cs.
+*/
+int
+ppl_Congruence_System_begin
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+           ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  congruence system \p cs.
+*/
+int
+ppl_Congruence_System_end
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+           ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Congruence_System_OK PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence System */
+
+/*! \brief \name Functions that May Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Removes all the congruences from the congruence system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Congruence_System_clear PPL_PROTO((ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Inserts a copy of the congruence \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Congruence_System_insert_Congruence PPL_PROTO((ppl_Congruence_System_t cs,
+                                                   ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that May Modify the Congruence System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p cit; writes a
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit,
+           ppl_const_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t dst,
+           ppl_const_Congruence_System_const_iterator_t src));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System_const_iterator
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Dereference \p cit writing a const handle to the resulting
+  congruence at address \p pc.
+*/
+int
+ppl_Congruence_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit,
+           ppl_const_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Increment \p cit so that it "points" to the next congruence.
+*/
+int
+ppl_Congruence_System_const_iterator_increment
+PPL_PROTO((ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Congruence_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t x,
+           ppl_const_Congruence_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+  Describes the different kinds of grid generators.
+*/
+enum ppl_enum_Grid_Generator_Type {
+  /*! The grid generator is a line. */
+  PPL_GRID_GENERATOR_TYPE_LINE,
+  /*! The grid generator is a parameter. */
+  PPL_GRID_GENERATOR_TYPE_PARAMETER,
+  /*! The grid generator is a point. */
+  PPL_GRID_GENERATOR_TYPE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Creates a new grid generator of direction \p le and type \p t.  If the
+  grid generator to be created is a point or a parameter, the divisor
+  \p d is applied to \p le.  If it is a line, \p d is simply disregarded.
+  A handle for the new grid generator is written at address \p pg.
+  The space dimension of the new grid generator is equal to the space
+  dimension of \p le.
+*/
+int
+ppl_new_Grid_Generator PPL_PROTO((ppl_Grid_Generator_t* pg,
+                                  ppl_const_Linear_Expression_t le,
+                                  enum ppl_enum_Grid_Generator_Type t,
+                                  ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new grid generator at address
+  \p pg.
+*/
+int
+ppl_new_Grid_Generator_zero_dim_point PPL_PROTO((ppl_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Builds a grid generator that is a copy of \p g; writes a handle
+  for the newly created grid generator at address \p pg.
+*/
+int
+ppl_new_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t* pg, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Assigns a copy of the grid generator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t dst,
+           ppl_const_Grid_Generator_t src));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Grid_Generator_space_dimension PPL_PROTO((ppl_const_Grid_Generator_t g,
+                                              ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Returns the type of grid generator \p g.
+*/
+int
+ppl_Grid_Generator_type PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  grid generator \p g.
+*/
+int
+ppl_Grid_Generator_coefficient PPL_PROTO((ppl_const_Grid_Generator_t g,
+                                          ppl_dimension_type var,
+                                          ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  If \p g is a point or a parameter assigns its divisor to \p n.
+*/
+int
+ppl_Grid_Generator_divisor PPL_PROTO((ppl_const_Grid_Generator_t g,
+                                      ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_OK PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Builds an empty system of grid generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of grid generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Builds the singleton grid generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+           ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Builds a grid generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+           ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Assigns a copy of the grid generator system \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t dst,
+           ppl_const_Grid_Generator_System_t src));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Grid_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Returns a positive integer if \p gs contains no generator;
+  returns 0 otherwise.
+*/
+int
+ppl_Grid_Generator_System_empty
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_begin
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+           ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_end
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+           ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_System_OK PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Grid Generator System */
+
+/*! \brief \name Functions that May Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Removes all the generators from the grid generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Grid_Generator_System_clear PPL_PROTO((ppl_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Inserts a copy of the grid generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t gs,
+           ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Grid Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p git; writes a
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit,
+           ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t dst,
+           ppl_const_Grid_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Dereference \p git writing a const handle to the resulting
+  grid generator at address \p pg.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git,
+           ppl_const_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Increment \p git so that it "points" to the next grid generator.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t x,
+           ppl_const_Grid_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+  Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief \ingroup Datatypes
+  Code of the worst-case exponential but typically polynomial
+  complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief \ingroup Datatypes
+  Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron and the set of points
+  satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron intersects the set of
+  points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron is included in the set of
+  points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron is included in the set of
+  points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that adding the generator would not change the
+  polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+
+/*! \brief \ingroup Datatypes
+  Widths of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Width {
+  /*! \hideinitializer 8 bits. */
+  PPL_BITS_8 = 8,
+  /*! \hideinitializer 16 bits. */
+  PPL_BITS_16 = 16,
+  /*! \hideinitializer 32 bits. */
+  PPL_BITS_32 = 32,
+  /*! \hideinitializer 64 bits. */
+  PPL_BITS_64 = 64,
+  /*! \hideinitializer 128 bits. */
+  PPL_BITS_128 = 128
+};
+
+/*! \brief \ingroup Datatypes
+  Representation of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Representation {
+  /*! Unsigned binary. */
+  PPL_UNSIGNED,
+  /*! \brief
+    Signed binary where negative values are represented by the two's
+    complement of the absolute value.
+  */
+  PPL_SIGNED_2_COMPLEMENT
+};
+
+/*! \brief \ingroup Datatypes
+  Overflow behavior of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Overflow {
+  /*! \brief
+    On overflow, wrapping takes place.
+
+    This means that, for a \f$w\f$-bit bounded integer, the computation
+    happens modulo \f$2^w\f$.
+  */
+  PPL_OVERFLOW_WRAPS,
+
+  /*! \brief
+    On overflow, the result is undefined.
+
+    This simply means that the result of the operation resulting in an
+    overflow can take any value.
+
+    \note
+    Even though something more serious can happen in the system
+    being analyzed ---due to, e.g., C's undefined behavior---, here we
+    are only concerned with the results of arithmetic operations.
+    It is the responsibility of the analyzer to ensure that other
+    manifestations of undefined behavior are conservatively approximated.
+  */
+  PPL_OVERFLOW_UNDEFINED,
+
+  /*! \brief
+    Overflow is impossible.
+
+    This is for the analysis of languages where overflow is trapped
+    before it affects the state, for which, thus, any indication that
+    an overflow may have affected the state is necessarily due to
+    the imprecision of the analysis.
+  */
+  PPL_OVERFLOW_IMPOSSIBLE
+};
+
+/*! \brief \name Symbolic Constants */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "maximization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "minimization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "unfeasible MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "unbounded MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "optimized MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code for the MIP problem's "pricing" control parameter name.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of MIP problem's "textbook" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of MIP problem's "exact steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of MIP problem's "float steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+
+
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of the "unfeasible PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of the "optimized PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code for the PIP problem's "cutting strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code for the PIP problem's "pivot row strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "first" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "deepest" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "all" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "first" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "max column" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+/*@}*/ /* Symbolic Constants */
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Builds a trivial MIP problem of dimension \p d and writes a
+  handle to it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_space_dimension PPL_PROTO((ppl_MIP_Problem_t* pmip,
+                                                    ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Builds a MIP problem of space dimension \p d having feasible region \p cs,
+  objective function \p le and optimization mode \p m; writes a handle to
+  it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem PPL_PROTO((ppl_MIP_Problem_t* pmip,
+                               ppl_dimension_type d,
+                               ppl_const_Constraint_System_t cs,
+                               ppl_const_Linear_Expression_t le,
+                               int m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Builds a MIP problem that is a copy of \p mip; writes a handle
+  for the newly created system at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t* pmip, ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Assigns a copy of the MIP problem \p src to \p dst.
+*/
+int
+ppl_assign_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t dst, ppl_const_MIP_Problem_t src));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Invalidates the handle \p mip: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_MIP_Problem PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for MIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p mip.
+*/
+int
+ppl_MIP_Problem_space_dimension
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes to \p m the number of integer space dimensions of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes in the first positions of the array \p ds all the integer space
+  dimensions of problem \p mip. If the array is not big enough to hold
+  all of the integer space dimensions, the behavior is undefined.
+*/
+int
+ppl_MIP_Problem_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes to \p m the number of constraints defining
+  the feasible region of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_constraints PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                                 ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes at address \p pc a const handle to the \p i-th constraint
+  defining the feasible region of the MIP problem \p mip
+*/
+int
+ppl_MIP_Problem_constraint_at_index PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                               ppl_dimension_type i,
+                                               ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes a const handle to the linear expression defining the
+  objective function of the MIP problem \p mip at address \p ple.
+*/
+int
+ppl_MIP_Problem_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Linear_Expression_t* ple));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns the optimization mode of the MIP problem \p mip.
+*/
+int
+ppl_MIP_Problem_optimization_mode PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns a positive integer if \p mip is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p mip is broken.  Useful for debugging purposes.
+*/
+int
+ppl_MIP_Problem_OK PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+/*! \brief \name Functions that May Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Resets the MIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_MIP_Problem_clear PPL_PROTO((ppl_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Adds \p d new dimensions to the space enclosing the MIP problem \p mip
+  and to \p mip itself.
+*/
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets the space dimensions that are specified in first \p n positions
+  of the array \p ds to be integer dimensions of problem \p mip.
+  The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Modifies the feasible region of the MIP problem \p mip by adding a copy
+  of the constraint \p c.
+*/
+int
+ppl_MIP_Problem_add_constraint PPL_PROTO((ppl_MIP_Problem_t mip,
+                                          ppl_const_Constraint_t c));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Modifies the feasible region of the MIP problem \p mip by adding a copy
+  of the constraints in \p cs.
+*/
+int
+ppl_MIP_Problem_add_constraints PPL_PROTO((ppl_MIP_Problem_t mip,
+                                           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets the objective function of the MIP problem \p mip to a copy of \p le.
+*/
+int
+ppl_MIP_Problem_set_objective_function
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets the optimization mode of the MIP problem \p mip to \p mode.
+*/
+int
+ppl_MIP_Problem_set_optimization_mode PPL_PROTO((ppl_MIP_Problem_t mip,
+                                                 int mode));
+
+/*@}*/ /* Functions that May Modify the MIP_Problem */
+
+/*! \brief \name Computing the Solution of the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns a positive integer if \p mip is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_MIP_Problem_is_satisfiable PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Solves the MIP problem \p mip, returning an exit status.
+
+  \return
+  <CODE>PPL_MIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the MIP problem
+  is not satisfiable;
+  <CODE>PPL_MIP_PROBLEM_STATUS_UNBOUNDED</CODE> if the MIP problem
+  is satisfiable but there is no finite bound to the value of
+  the objective function;
+  <CODE>PPL_MIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the MIP problem
+  admits an optimal solution.
+*/
+int
+ppl_MIP_Problem_solve PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Evaluates the objective function of \p mip on point \p g.
+
+  \param mip
+  The MIP problem defining the objective function;
+
+  \param g
+  The generator on which the objective function will be evaluated;
+
+  \param num
+  Will be assigned the numerator of the objective function value;
+
+  \param den
+  Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_MIP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Generator_t g,
+           ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes a const handle to a feasible point for the MIP problem \p mip
+  at address \p pg.
+*/
+int
+ppl_MIP_Problem_feasible_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                          ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes a const handle to an optimizing point for the MIP problem \p mip
+  at address \p pg.
+*/
+int
+ppl_MIP_Problem_optimizing_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                            ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns the optimal value for \p mip.
+
+  \param mip
+  The MIP problem;
+
+  \param num
+  Will be assigned the numerator of the optimal value;
+
+  \param den
+  Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_MIP_Problem_optimal_value
+PPL_PROTO((ppl_const_MIP_Problem_t mip,
+           ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*@}*/ /* Computing the Solution of the MIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns the value of control parameter \p name in problem \p mip.
+*/
+int
+ppl_MIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_MIP_Problem_t mip, int name));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets control parameter \p value in problem \p mip.
+*/
+int
+ppl_MIP_Problem_set_control_parameter
+PPL_PROTO((ppl_MIP_Problem_t mip, int value));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory occupied by \p mip.
+*/
+int
+ppl_MIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory managed by \p mip.
+*/
+int
+ppl_MIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Builds a trivial PIP problem of dimension \p d and writes a
+  handle to it at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_space_dimension PPL_PROTO((ppl_PIP_Problem_t* ppip,
+                                                    ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Builds a PIP problem that is a copy of \p pip; writes a handle
+  for the newly created problem at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t* ppip, ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Assigns a copy of the PIP problem \p src to \p dst.
+*/
+int
+ppl_assign_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t dst, ppl_const_PIP_Problem_t src));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Builds a PIP problem having space dimension \p d from the sequence
+  of constraints in the range \f$[\mathrm{first}, \mathrm{last})\f$;
+  the \p n dimensions whose indices occur in \p ds are interpreted as
+  parameters.
+*/
+int
+ppl_new_PIP_Problem_from_constraints
+PPL_PROTO((ppl_PIP_Problem_t* ppip,
+           ppl_dimension_type d,
+           ppl_Constraint_System_const_iterator_t first,
+           ppl_Constraint_System_const_iterator_t last,
+           size_t n,
+           ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Invalidates the handle \p pip: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_PIP_Problem PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for PIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p pip.
+
+  The vector space dimensions includes both the problem variables
+  and the problem parameters, but they do not include the artificial
+  parameters.
+*/
+int
+ppl_PIP_Problem_space_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p m the number of parameter space dimensions of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes in the first positions of the array \p ds all the parameter space
+  dimensions of problem \p pip. If the array is not big enough to hold
+  all of the parameter space dimensions, the behavior is undefined.
+*/
+int
+ppl_PIP_Problem_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes into \p *pd the big parameter dimension of PIP problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_big_parameter_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* pd));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p m the number of constraints defining
+  the feasible region of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_constraints PPL_PROTO((ppl_const_PIP_Problem_t pip,
+                                                 ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes at address \p pc a const handle to the \p i-th constraint
+  defining the feasible region of the PIP problem \p pip
+*/
+int
+ppl_PIP_Problem_constraint_at_index PPL_PROTO((ppl_const_PIP_Problem_t pip,
+                                               ppl_dimension_type i,
+                                               ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory occupied by \p pip.
+*/
+int
+ppl_PIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory managed by \p pip.
+*/
+int
+ppl_PIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Returns a positive integer if \p pip is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p pip is broken.  Useful for debugging purposes.
+*/
+int
+ppl_PIP_Problem_OK PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Functions that Do Not Modify the PIP_Problem */
+
+/*! \brief \name Functions that May Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Resets the PIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_PIP_Problem_clear PPL_PROTO((ppl_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Adds <CODE>pip_vars + pip_params</CODE> new space dimensions
+  and embeds the PIP problem \p pip in the new vector space.
+
+  \param pip
+  The PIP problem to be embedded in the new vector space.
+
+  \param pip_vars
+  The number of space dimensions to add that are interpreted as
+  PIP problem variables (i.e., non parameters). These are added
+  \e before adding the \p pip_params parameters.
+
+  \param pip_params
+  The number of space dimensions to add that are interpreted as
+  PIP problem parameters. These are added \e after having added the
+  \p pip_vars problem variables.
+
+  The new space dimensions will be those having the highest indexes
+  in the new PIP problem; they are initially unconstrained.
+*/
+int
+ppl_PIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_PIP_Problem_t pip,
+           ppl_dimension_type pip_vars,
+           ppl_dimension_type pip_params));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Sets the space dimensions that are specified in first \p n positions
+  of the array \p ds to be parameter dimensions of problem \p pip.
+  The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_PIP_Problem_add_to_parameter_space_dimensions
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Sets the big parameter dimension of PIP problem \p pip to \p d.
+*/
+int
+ppl_PIP_Problem_set_big_parameter_dimension
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Modifies the feasible region of the PIP problem \p pip by adding a copy
+  of the constraint \p c.
+*/
+int
+ppl_PIP_Problem_add_constraint PPL_PROTO((ppl_PIP_Problem_t pip,
+                                          ppl_const_Constraint_t c));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Modifies the feasible region of the PIP problem \p pip by adding a copy
+  of the constraints in \p cs.
+*/
+int
+ppl_PIP_Problem_add_constraints PPL_PROTO((ppl_PIP_Problem_t pip,
+                                           ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that May Modify the PIP_Problem */
+
+/*! \brief \name Computing and Printing the Solution of the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Returns a positive integer if \p pip is satisfiable and an optimal
+  solution can be found; returns 0 otherwise.
+*/
+int
+ppl_PIP_Problem_is_satisfiable PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Solves the PIP problem \p pip, returning an exit status.
+
+  \return
+  <CODE>PPL_PIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the PIP problem
+  is not satisfiable;
+  <CODE>PPL_PIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the PIP problem
+  admits an optimal solution.
+*/
+int
+ppl_PIP_Problem_solve PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p pip_tree a solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_solution PPL_PROTO((ppl_const_PIP_Problem_t pip,
+                                    ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p pip_tree an optimizing solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_optimizing_solution
+PPL_PROTO((ppl_const_PIP_Problem_t pip,
+           ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*@}*/ /* Computing the Solution of the PIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Returns the value of control parameter \p name in problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_PIP_Problem_t pip, int name));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Sets control parameter \p value in problem \p pip.
+*/
+int
+ppl_PIP_Problem_set_control_parameter
+PPL_PROTO((ppl_PIP_Problem_t pip, int value));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p dpip_tree the solution node if \p spip_tree is
+  a solution node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_solution
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+           ppl_const_PIP_Solution_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p dpip_tree the decision node if \p spip_tree
+  is a decision node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_decision
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+           ppl_const_PIP_Decision_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p pcs the local system of parameter constraints
+  at the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_get_constraints
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Returns a positive integer if \p pip_tree is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p pip_tree is broken.  Useful for debugging purposes.
+*/
+int
+ppl_PIP_Tree_Node_OK PPL_PROTO((ppl_const_PIP_Tree_Node_t pip));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p m the number of elements in the artificial parameter sequence
+  in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_number_of_artificials
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Assigns to \p pit a const iterator "pointing" to the beginning of
+  the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_begin
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Assigns to \p pit a const iterator "pointing" to the end of
+  the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_end
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Solution_Node_tag \brief
+  Writes to \p le a const pointer to the parametric expression of the values
+  of variable \p var in solution node \p pip_sol.
+
+  The linear expression assigned to \p le will only refer to
+  (problem or artificial) parameters.
+
+  \param pip_sol
+  The solution tree node.
+
+  \param var
+  The variable which is queried about.
+
+  \param le
+  The returned expression for variable \p var.
+
+  \return PPL_ERROR_INVALID_ARGUMENT
+  Returned if \p var is dimension-incompatible with \p *this
+  or if \p var is a problem parameter.
+*/
+int
+ppl_PIP_Solution_Node_get_parametric_values
+PPL_PROTO((ppl_const_PIP_Solution_Node_t pip_sol,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t* le));
+
+/*! \relates ppl_PIP_Decision_Node_tag \brief
+  Writes to \p pip_tree a const pointer to either the true branch
+  (if \p b is not zero) or the false branch (if \p b is zero) of \p pip_dec.
+*/
+int
+ppl_PIP_Decision_Node_get_child_node
+PPL_PROTO((ppl_const_PIP_Decision_Node_t pip_dec,
+           int b,
+           ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p le the linear expression in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_Linear_Expression
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_Linear_Expression_t le));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  the artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_coefficient
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_dimension_type var,
+           ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p n the inhomogeneous term of the artificial
+  parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_inhomogeneous_term
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p n the denominator in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_denominator
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_Coefficient_t n));
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p apit; writes a
+  handle for the newly created const iterator at address \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit,
+           ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t dst,
+           ppl_const_Artificial_Parameter_Sequence_const_iterator_t src));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Invalidates the handle \p apit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Dereference \p apit writing a const handle to the resulting
+  artificial parameter at address \p pap.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_dereference
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit,
+           ppl_const_Artificial_Parameter_t* pap));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Increment \p apit so that it "points" to the next artificial parameter.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_increment
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t x,
+           ppl_const_Artificial_Parameter_Sequence_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(MIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Tree_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Solution_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Decision_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Artificial_Parameter)
+
+/* Automatically generated from PPL source file ../../interfaces/C/ppl_c_domains.h line 1. */
+/*C interface code: header file.
+*/
+
+PPL_TYPE_DECLARATION(Polyhedron)
+PPL_TYPE_DECLARATION(Grid)
+PPL_TYPE_DECLARATION(Rational_Box)
+PPL_TYPE_DECLARATION(BD_Shape_mpz_class)
+PPL_TYPE_DECLARATION(BD_Shape_mpq_class)
+PPL_TYPE_DECLARATION(Octagonal_Shape_mpz_class)
+PPL_TYPE_DECLARATION(Octagonal_Shape_mpq_class)
+PPL_TYPE_DECLARATION(Constraints_Product_C_Polyhedron_Grid)
+PPL_TYPE_DECLARATION(Pointset_Powerset_C_Polyhedron)
+PPL_TYPE_DECLARATION(Pointset_Powerset_NNC_Polyhedron)
+PPL_TYPE_DECLARATION(Double_Box)
+PPL_TYPE_DECLARATION(BD_Shape_double)
+PPL_TYPE_DECLARATION(Octagonal_Shape_double)
+
+/*! \interface ppl_Polyhedron_tag
+  \brief Types and functions for ppl_Polyhedron_tag
+*/
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_delete_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Grid
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Grid
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Rational_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Rational_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Double_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Double_Box
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Grid_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Grid_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_space_dimension
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_affine_dimension
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_relation_with_Constraint
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_relation_with_Generator
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_relation_with_Congruence
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_congruences
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_minimized_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_minimized_congruences
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_get_minimized_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_empty
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_universe
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_bounded
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_contains_integer_point
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_topologically_closed
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_discrete
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_topological_closure_assign
+PPL_PROTO((ppl_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounds_from_above
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounds_from_below
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_maximize
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_minimize
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_maximize_with_point
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_minimize_with_point
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_frequency
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_contains_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_strictly_contains_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_equals_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_OK
+PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_constraint
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_congruence
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_generator
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Generator_t c));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_constraints
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_congruences
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_generators
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_constraint
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_congruence
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_constraints
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_refine_with_congruences
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_intersection_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_upper_bound_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_difference_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_concatenate_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_time_elapse_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_poly_hull_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_poly_difference_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_poly_hull_assign_if_exact
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_positive_time_elapse_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_simplify_using_context_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_constrains
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_unconstrain_space_dimension
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_unconstrain_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_remove_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_expand_space_dimension
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_fold_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_map_space_dimensions
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_drop_some_non_integer_points
+PPL_PROTO((ppl_Polyhedron_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_external_memory_in_bytes
+PPL_PROTO((ppl_const_Polyhedron_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_total_memory_in_bytes
+PPL_PROTO((ppl_const_Polyhedron_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_BHRZ03_widening_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_H79_widening_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_widening_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_widening_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+PPL_PROTO((ppl_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_linear_partition
+PPL_PROTO((ppl_const_Polyhedron_t x,
+           ppl_const_Polyhedron_t y,
+           ppl_Polyhedron_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_wrap_assign
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_recycle_Congruence_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_C_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+PPL_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_recycled_constraints
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_recycled_congruences
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_Polyhedron_add_recycled_generators
+PPL_PROTO((ppl_Polyhedron_t ph,
+           ppl_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_C_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_NNC_Polyhedron
+PPL_PROTO((ppl_const_Polyhedron_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_MS_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_termination_test_PR_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before, ppl_const_Polyhedron_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_MS_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_one_affine_ranking_function_PR_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_C_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_MS_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Polyhedron_tag */
+int
+ppl_all_affine_ranking_functions_PR_NNC_Polyhedron_2
+PPL_PROTO((ppl_const_Polyhedron_t pset_before,
+           ppl_const_Polyhedron_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Polyhedron)
+
+/* End of Functions Related to ppl_Polyhedron_tag */
+
+/*! \interface ppl_Grid_tag
+  \brief Types and functions for ppl_Grid_tag
+*/
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_delete_Grid
+PPL_PROTO((ppl_const_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_space_dimension
+PPL_PROTO((ppl_Grid_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_C_Polyhedron
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_NNC_Polyhedron
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Grid
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Rational_Box
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Double_Box
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_double
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Grid_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Constraint_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Congruence_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_const_Grid_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_space_dimension
+PPL_PROTO((ppl_const_Grid_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_affine_dimension
+PPL_PROTO((ppl_const_Grid_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Constraint
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Generator
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Congruence
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Congruence_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_relation_with_Grid_Generator
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Grid_Generator_t c));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_constraints
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_congruences
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_grid_generators
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Grid_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_minimized_constraints
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_minimized_congruences
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_get_minimized_grid_generators
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Grid_Generator_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_empty
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_universe
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_bounded
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_contains_integer_point
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_topologically_closed
+PPL_PROTO((ppl_const_Grid_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_discrete
+PPL_PROTO((ppl_const_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_topological_closure_assign
+PPL_PROTO((ppl_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounds_from_above
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounds_from_below
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_maximize
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_minimize
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_maximize_with_point
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_minimize_with_point
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_frequency
+PPL_PROTO((ppl_const_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_contains_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_strictly_contains_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_is_disjoint_from_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_equals_Grid
+PPL_PROTO((ppl_const_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_OK
+PPL_PROTO((ppl_const_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_constraint
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_congruence
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Congruence_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_grid_generator
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Grid_Generator_t c));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_constraints
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_congruences
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_grid_generators
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Grid_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_constraint
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_constraints
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_refine_with_congruences
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_intersection_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_upper_bound_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_difference_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_concatenate_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_time_elapse_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_simplify_using_context_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_constrains
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_unconstrain_space_dimension
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_unconstrain_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_affine_image
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_affine_preimage
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounded_affine_image
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_bounded_affine_preimage
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d,
+           ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d,
+           ppl_const_Coefficient_t m));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_image_lhs_rhs_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs,
+           ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generalized_affine_preimage_lhs_rhs_with_congruence
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs,
+           ppl_const_Coefficient_t m));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_space_dimensions_and_project
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_remove_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_remove_higher_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_expand_space_dimension
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_fold_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_map_space_dimensions
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_drop_some_non_integer_points
+PPL_PROTO((ppl_Grid_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_external_memory_in_bytes
+PPL_PROTO((ppl_const_Grid_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_total_memory_in_bytes
+PPL_PROTO((ppl_const_Grid_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_congruence_widening_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           unsigned* tp));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generator_widening_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_congruence_widening_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_generator_widening_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_widening_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_widening_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y));
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_congruence_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           ppl_const_Congruence_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_generator_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           ppl_const_Congruence_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_congruence_extrapolation_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_limited_generator_extrapolation_assign
+PPL_PROTO((ppl_Grid_t x,
+           ppl_const_Grid_t y,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_wrap_assign
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_recycle_Constraint_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_recycle_Congruence_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_new_Grid_recycle_Grid_Generator_System
+PPL_PROTO((ppl_Grid_t* pph, ppl_Grid_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_assign_Grid_from_Grid
+PPL_PROTO((ppl_Grid_t dst, ppl_const_Grid_t src));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_recycled_constraints
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_recycled_congruences
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_Grid_add_recycled_grid_generators
+PPL_PROTO((ppl_Grid_t ph,
+           ppl_Grid_Generator_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_MS_Grid
+PPL_PROTO((ppl_const_Grid_t pset));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_PR_Grid
+PPL_PROTO((ppl_const_Grid_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_MS_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_PR_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_MS_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_PR_Grid
+PPL_PROTO((ppl_const_Grid_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_MS_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before, ppl_const_Grid_t pset_after));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_termination_test_PR_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before, ppl_const_Grid_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_MS_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+           ppl_const_Grid_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_one_affine_ranking_function_PR_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+           ppl_const_Grid_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_MS_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+           ppl_const_Grid_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Grid_tag */
+int
+ppl_all_affine_ranking_functions_PR_Grid_2
+PPL_PROTO((ppl_const_Grid_t pset_before,
+           ppl_const_Grid_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Grid)
+
+/* End of Functions Related to ppl_Grid_tag */
+
+/*! \interface ppl_Rational_Box_tag
+  \brief Types and functions for ppl_Rational_Box_tag
+*/
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_delete_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_space_dimension
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_C_Polyhedron
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_NNC_Polyhedron
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Grid
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Rational_Box
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Double_Box
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_double
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Grid_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Constraint_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Congruence_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_from_Generator_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_space_dimension
+PPL_PROTO((ppl_const_Rational_Box_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_affine_dimension
+PPL_PROTO((ppl_const_Rational_Box_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_relation_with_Constraint
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_relation_with_Generator
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_relation_with_Congruence
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_constraints
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_congruences
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_minimized_constraints
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_minimized_congruences
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_empty
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_universe
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_bounded
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_contains_integer_point
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_topologically_closed
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_discrete
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_topological_closure_assign
+PPL_PROTO((ppl_Rational_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounds_from_above
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounds_from_below
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_upper_bound
+PPL_PROTO((ppl_Rational_Box_t ps,
+           ppl_dimension_type var,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* pclosed));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_get_lower_bound
+PPL_PROTO((ppl_Rational_Box_t ps,
+           ppl_dimension_type var,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* pclosed));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_maximize
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_minimize
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_maximize_with_point
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_minimize_with_point
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_frequency
+PPL_PROTO((ppl_const_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_contains_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_strictly_contains_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_is_disjoint_from_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_equals_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_OK
+PPL_PROTO((ppl_const_Rational_Box_t ph));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_constraint
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_congruence
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_constraints
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_congruences
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_constraint
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_congruence
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_constraints
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_refine_with_congruences
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_intersection_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_upper_bound_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_difference_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_concatenate_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_time_elapse_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_simplify_using_context_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_constrains
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_unconstrain_space_dimension
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_unconstrain_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_affine_image
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_affine_preimage
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounded_affine_image
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_bounded_affine_preimage
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_image
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_preimage
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_space_dimensions_and_project
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_remove_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_remove_higher_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_expand_space_dimension
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_fold_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_map_space_dimensions
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_drop_some_non_integer_points
+PPL_PROTO((ppl_Rational_Box_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_external_memory_in_bytes
+PPL_PROTO((ppl_const_Rational_Box_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_total_memory_in_bytes
+PPL_PROTO((ppl_const_Rational_Box_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_CC76_widening_assign_with_tokens
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_CC76_widening_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_widening_assign_with_tokens
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_widening_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_CC76_narrowing_assign
+PPL_PROTO((ppl_Rational_Box_t x,
+           ppl_const_Rational_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_linear_partition
+PPL_PROTO((ppl_const_Rational_Box_t x,
+           ppl_const_Rational_Box_t y,
+           ppl_Rational_Box_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_wrap_assign
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_recycle_Constraint_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_recycle_Congruence_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_new_Rational_Box_recycle_Generator_System
+PPL_PROTO((ppl_Rational_Box_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_assign_Rational_Box_from_Rational_Box
+PPL_PROTO((ppl_Rational_Box_t dst, ppl_const_Rational_Box_t src));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_recycled_constraints
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_Rational_Box_add_recycled_congruences
+PPL_PROTO((ppl_Rational_Box_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_MS_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_PR_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Rational_Box
+PPL_PROTO((ppl_const_Rational_Box_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_MS_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before, ppl_const_Rational_Box_t pset_after));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_termination_test_PR_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before, ppl_const_Rational_Box_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+           ppl_const_Rational_Box_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+           ppl_const_Rational_Box_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+           ppl_const_Rational_Box_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Rational_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Rational_Box_2
+PPL_PROTO((ppl_const_Rational_Box_t pset_before,
+           ppl_const_Rational_Box_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Rational_Box)
+
+/* End of Functions Related to ppl_Rational_Box_tag */
+
+/*! \interface ppl_BD_Shape_mpz_class_tag
+  \brief Types and functions for ppl_BD_Shape_mpz_class_tag
+*/
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_delete_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_C_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Grid
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Rational_Box
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Double_Box
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Grid_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_from_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_space_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_affine_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_relation_with_Constraint
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_relation_with_Generator
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_relation_with_Congruence
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_minimized_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_get_minimized_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_empty
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_universe
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_bounded
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_contains_integer_point
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_topologically_closed
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_discrete
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_topological_closure_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounds_from_above
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounds_from_below
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_maximize
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_minimize
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_maximize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_minimize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_frequency
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_contains_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_strictly_contains_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_is_disjoint_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_equals_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_OK
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_constraint
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_congruence
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_constraints
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_congruences
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_constraint
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_congruence
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_constraints
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_refine_with_congruences
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_intersection_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_upper_bound_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_difference_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_concatenate_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_time_elapse_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_simplify_using_context_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_constrains
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_unconstrain_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_affine_image
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounded_affine_image
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_bounded_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_image
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_remove_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_expand_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_fold_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_map_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_drop_some_non_integer_points
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ps,
+           size_t* sz));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_H79_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_CC76_narrowing_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_linear_partition
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t x,
+           ppl_const_BD_Shape_mpz_class_t y,
+           ppl_BD_Shape_mpz_class_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_wrap_assign
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_recycle_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_recycle_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_new_BD_Shape_mpz_class_recycle_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpz_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_assign_BD_Shape_mpz_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpz_class_t dst, ppl_const_BD_Shape_mpz_class_t src));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_recycled_constraints
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_BD_Shape_mpz_class_add_recycled_congruences
+PPL_PROTO((ppl_BD_Shape_mpz_class_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpz_class
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before, ppl_const_BD_Shape_mpz_class_t pset_after));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before, ppl_const_BD_Shape_mpz_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+           ppl_const_BD_Shape_mpz_class_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+           ppl_const_BD_Shape_mpz_class_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+           ppl_const_BD_Shape_mpz_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpz_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpz_class_t pset_before,
+           ppl_const_BD_Shape_mpz_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(BD_Shape_mpz_class)
+
+/* End of Functions Related to ppl_BD_Shape_mpz_class_tag */
+
+/*! \interface ppl_BD_Shape_mpq_class_tag
+  \brief Types and functions for ppl_BD_Shape_mpq_class_tag
+*/
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_delete_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_C_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Grid
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Rational_Box
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Double_Box
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Grid_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_from_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_space_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_affine_dimension
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_relation_with_Constraint
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_relation_with_Generator
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_relation_with_Congruence
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_minimized_constraints
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_get_minimized_congruences
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_empty
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_universe
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_bounded
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_contains_integer_point
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_topologically_closed
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_discrete
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_topological_closure_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounds_from_above
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounds_from_below
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_maximize
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_minimize
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_maximize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_minimize_with_point
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_frequency
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_contains_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_strictly_contains_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_is_disjoint_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_equals_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_OK
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_constraint
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_congruence
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_constraints
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_congruences
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_constraint
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_congruence
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_constraints
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_refine_with_congruences
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_intersection_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_upper_bound_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_difference_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_concatenate_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_time_elapse_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_simplify_using_context_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_constrains
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_unconstrain_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_affine_image
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounded_affine_image
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_bounded_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_image
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_preimage
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_remove_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_expand_space_dimension
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_fold_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_map_space_dimensions
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_drop_some_non_integer_points
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ps,
+           size_t* sz));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_H79_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_widening_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_CC76_narrowing_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_linear_partition
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t x,
+           ppl_const_BD_Shape_mpq_class_t y,
+           ppl_BD_Shape_mpq_class_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_wrap_assign
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_recycle_Constraint_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_recycle_Congruence_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_new_BD_Shape_mpq_class_recycle_Generator_System
+PPL_PROTO((ppl_BD_Shape_mpq_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_assign_BD_Shape_mpq_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_mpq_class_t dst, ppl_const_BD_Shape_mpq_class_t src));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_recycled_constraints
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_BD_Shape_mpq_class_add_recycled_congruences
+PPL_PROTO((ppl_BD_Shape_mpq_class_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpq_class
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before, ppl_const_BD_Shape_mpq_class_t pset_after));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before, ppl_const_BD_Shape_mpq_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+           ppl_const_BD_Shape_mpq_class_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+           ppl_const_BD_Shape_mpq_class_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+           ppl_const_BD_Shape_mpq_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_mpq_class_2
+PPL_PROTO((ppl_const_BD_Shape_mpq_class_t pset_before,
+           ppl_const_BD_Shape_mpq_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(BD_Shape_mpq_class)
+
+/* End of Functions Related to ppl_BD_Shape_mpq_class_tag */
+
+/*! \interface ppl_Octagonal_Shape_mpz_class_tag
+  \brief Types and functions for ppl_Octagonal_Shape_mpz_class_tag
+*/
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_delete_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_C_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Grid
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Rational_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Double_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Grid_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_from_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_space_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_affine_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_relation_with_Constraint
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_relation_with_Generator
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_relation_with_Congruence
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_minimized_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_get_minimized_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_empty
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_universe
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_bounded
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_contains_integer_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_topologically_closed
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_discrete
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_topological_closure_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounds_from_above
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounds_from_below
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_maximize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_minimize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_maximize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_minimize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_frequency
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_contains_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_strictly_contains_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_is_disjoint_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_equals_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_OK
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_refine_with_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_intersection_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_upper_bound_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_difference_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_concatenate_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_time_elapse_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_simplify_using_context_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_constrains
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_unconstrain_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounded_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_bounded_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_remove_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_expand_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_fold_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_map_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_drop_some_non_integer_points
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_CC76_narrowing_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_linear_partition
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t x,
+           ppl_const_Octagonal_Shape_mpz_class_t y,
+           ppl_Octagonal_Shape_mpz_class_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_wrap_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_recycle_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_recycle_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_new_Octagonal_Shape_mpz_class_recycle_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_assign_Octagonal_Shape_mpz_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t dst, ppl_const_Octagonal_Shape_mpz_class_t src));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_recycled_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_Octagonal_Shape_mpz_class_add_recycled_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpz_class_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before, ppl_const_Octagonal_Shape_mpz_class_t pset_after));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before, ppl_const_Octagonal_Shape_mpz_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpz_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpz_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpz_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpz_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Octagonal_Shape_mpz_class)
+
+/* End of Functions Related to ppl_Octagonal_Shape_mpz_class_tag */
+
+/*! \interface ppl_Octagonal_Shape_mpq_class_tag
+  \brief Types and functions for ppl_Octagonal_Shape_mpq_class_tag
+*/
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_delete_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_C_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_NNC_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Grid
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Rational_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Double_Box
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Grid_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_from_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_space_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_affine_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_relation_with_Constraint
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_relation_with_Generator
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_relation_with_Congruence
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_minimized_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_get_minimized_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_empty
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_universe
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_bounded
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_contains_integer_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_topologically_closed
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_discrete
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_topological_closure_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounds_from_above
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounds_from_below
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_maximize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_minimize
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_maximize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_minimize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_frequency
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_contains_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_strictly_contains_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_is_disjoint_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_equals_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_OK
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_constraint
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_congruence
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_refine_with_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_intersection_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_upper_bound_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_difference_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_concatenate_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_time_elapse_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_simplify_using_context_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_constrains
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_unconstrain_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_unconstrain_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounded_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_bounded_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_space_dimensions_and_project
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_remove_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_remove_higher_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_expand_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_fold_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_map_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_drop_some_non_integer_points
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_external_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_total_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_BHMZ05_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_CC76_narrowing_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_linear_partition
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t x,
+           ppl_const_Octagonal_Shape_mpq_class_t y,
+           ppl_Octagonal_Shape_mpq_class_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_wrap_assign
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_recycle_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_recycle_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_new_Octagonal_Shape_mpq_class_recycle_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_assign_Octagonal_Shape_mpq_class_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t dst, ppl_const_Octagonal_Shape_mpq_class_t src));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_recycled_constraints
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_Octagonal_Shape_mpq_class_add_recycled_congruences
+PPL_PROTO((ppl_Octagonal_Shape_mpq_class_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before, ppl_const_Octagonal_Shape_mpq_class_t pset_after));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before, ppl_const_Octagonal_Shape_mpq_class_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_mpq_class_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_mpq_class_2
+PPL_PROTO((ppl_const_Octagonal_Shape_mpq_class_t pset_before,
+           ppl_const_Octagonal_Shape_mpq_class_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Octagonal_Shape_mpq_class)
+
+/* End of Functions Related to ppl_Octagonal_Shape_mpq_class_tag */
+
+/*! \interface ppl_Constraints_Product_C_Polyhedron_Grid_tag
+  \brief Types and functions for ppl_Constraints_Product_C_Polyhedron_Grid_tag
+*/
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_delete_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_space_dimension
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_C_Polyhedron
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_NNC_Polyhedron
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Grid
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Rational_Box
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Double_Box
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_double
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Grid_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Constraints_Product_C_Polyhedron_Grid_with_complexity
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Constraint_System
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_new_Constraints_Product_C_Polyhedron_Grid_from_Congruence_System
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t* pph, ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_space_dimension
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_affine_dimension
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_relation_with_Constraint
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_relation_with_Generator
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_relation_with_Congruence
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_empty
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_universe
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_bounded
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_topologically_closed
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_discrete
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_topological_closure_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounds_from_above
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounds_from_below
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_maximize
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_minimize
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_maximize_with_point
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_minimize_with_point
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_contains_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_strictly_contains_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_is_disjoint_from_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_equals_Constraints_Product_C_Polyhedron_Grid
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_OK
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ph));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_constraint
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_congruence
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_constraints
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_congruences
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_constraint
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_congruence
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_constraints
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_refine_with_congruences
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_intersection_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_upper_bound_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_difference_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_concatenate_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_time_elapse_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_constrains
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_unconstrain_space_dimension
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_unconstrain_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_affine_image
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_affine_preimage
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounded_affine_image
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_bounded_affine_preimage
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_image
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_preimage
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_add_space_dimensions_and_project
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_remove_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_remove_higher_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_expand_space_dimension
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_fold_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_map_space_dimensions
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_drop_some_non_integer_points
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_external_memory_in_bytes
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_total_memory_in_bytes
+PPL_PROTO((ppl_const_Constraints_Product_C_Polyhedron_Grid_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_widening_assign_with_tokens
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+int
+ppl_Constraints_Product_C_Polyhedron_Grid_widening_assign
+PPL_PROTO((ppl_Constraints_Product_C_Polyhedron_Grid_t x,
+           ppl_const_Constraints_Product_C_Polyhedron_Grid_t y));
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Constraints_Product_C_Polyhedron_Grid)
+
+/* End of Functions Related to ppl_Constraints_Product_C_Polyhedron_Grid_tag */
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_tag
+  \brief Types and functions for ppl_Pointset_Powerset_C_Polyhedron_tag
+*/
+
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_iterator_tag
+  \brief Types and functions for iterating on the disjuncts of a
+  ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+/*! \interface ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag
+  \brief Types and functions for iterating on the disjuncts of a
+  const ppl_Pointset_Powerset_C_Polyhedron_tag.
+*/
+
+PPL_TYPE_DECLARATION(Pointset_Powerset_C_Polyhedron_iterator)
+PPL_TYPE_DECLARATION(Pointset_Powerset_C_Polyhedron_const_iterator)
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t* pit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* pit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Pointset_Powerset_C_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_space_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_affine_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_relation_with_Constraint
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_relation_with_Generator
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_relation_with_Congruence
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_empty
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_universe
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_bounded
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_contains_integer_point
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_topologically_closed
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_discrete
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_topological_closure_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_omega_reduce
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounds_from_above
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounds_from_below
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_maximize
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_minimize
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_maximize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_minimize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_contains_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_strictly_contains_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_is_disjoint_from_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_equals_Pointset_Powerset_C_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_OK
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_constraint
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_congruence
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_constraints
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_congruences
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_constraint
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_congruence
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_constraints
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_refine_with_congruences
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_intersection_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_difference_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_concatenate_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_time_elapse_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_simplify_using_context_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_constrains
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_unconstrain_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_unconstrain_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_remove_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_expand_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_fold_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_map_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_some_non_integer_points
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_external_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_total_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_size
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t* px,
+           ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator_from_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t* px,
+           ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_begin
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+           ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+           ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_end
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+           ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_t ps,
+           ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t ps,
+           ppl_const_Polyhedron_t* d));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t ps,
+           ppl_const_Polyhedron_t* d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_const_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_C_Polyhedron_const_iterator_t psit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_add_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+           ppl_const_Polyhedron_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_C_Polyhedron_iterator_t it));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_C_Polyhedron_iterator_t last));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BHZ03_H79_H79_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BGP99_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y,
+           int disjuncts));
+
+/*! \relates ppl_Pointset_Powerset_C_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_C_Polyhedron_BGP99_H79_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_C_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_C_Polyhedron_t y,
+           int disjuncts));
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Pointset_Powerset_C_Polyhedron)
+
+/* End of Functions Related to ppl_Pointset_Powerset_C_Polyhedron_tag */
+
+/*! \interface ppl_Pointset_Powerset_NNC_Polyhedron_tag
+  \brief Types and functions for ppl_Pointset_Powerset_NNC_Polyhedron_tag
+*/
+
+/*! \interface ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag
+  \brief Types and functions for iterating on the disjuncts of a
+  ppl_Pointset_Powerset_NNC_Polyhedron_tag.
+*/
+/*! \interface ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag
+  \brief Types and functions for iterating on the disjuncts of a
+  const ppl_Pointset_Powerset_NNC_Polyhedron_tag.
+*/
+
+PPL_TYPE_DECLARATION(Pointset_Powerset_NNC_Polyhedron_iterator)
+PPL_TYPE_DECLARATION(Pointset_Powerset_NNC_Polyhedron_const_iterator)
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t* pit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t* pit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_delete_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_NNC_Polyhedron
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Pointset_Powerset_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Constraint_System
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_from_Congruence_System
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t* pph, ppl_const_Congruence_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_space_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_affine_dimension
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_relation_with_Constraint
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_relation_with_Generator
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_relation_with_Congruence
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_empty
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_universe
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_bounded
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_contains_integer_point
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_topologically_closed
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_discrete
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_topological_closure_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_pairwise_reduce
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_omega_reduce
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounds_from_above
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounds_from_below
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_maximize
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_minimize
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_maximize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_minimize_with_point
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_contains_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_strictly_contains_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_is_disjoint_from_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_geometrically_covers_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_geometrically_equals_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_equals_Pointset_Powerset_NNC_Polyhedron
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_OK
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ph));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_constraint
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_congruence
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_constraints
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_congruences
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_constraint
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_congruence
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_constraints
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_refine_with_congruences
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_intersection_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_upper_bound_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_difference_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_concatenate_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_time_elapse_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_simplify_using_context_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_constrains
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_unconstrain_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_unconstrain_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounded_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_bounded_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_image
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_preimage
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_remove_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_remove_higher_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_expand_space_dimension
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_fold_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_map_space_dimensions
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_some_non_integer_points
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_external_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_total_memory_in_bytes
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_size
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_iterator_from_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t* px,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_new_Pointset_Powerset_NNC_Polyhedron_const_iterator_from_const_iterator
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t* px,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_begin
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+           ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_begin
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+           ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_end
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+           ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_end
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_t ps,
+           ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_equal_test
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t y));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_increment
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_decrement
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t ps,
+           ppl_const_Polyhedron_t* d));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_dereference
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t ps,
+           ppl_const_Polyhedron_t* d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_NNC_Polyhedron_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t psit));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_const_iterator_tag */
+int
+ppl_delete_Pointset_Powerset_NNC_Polyhedron_const_iterator
+PPL_PROTO((ppl_const_Pointset_Powerset_NNC_Polyhedron_const_iterator_t psit));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_add_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+           ppl_const_Polyhedron_t d));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_disjunct
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t cit,
+ ppl_Pointset_Powerset_NNC_Polyhedron_iterator_t it));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_drop_disjuncts
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t ps,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t first,
+ ppl_const_Pointset_Powerset_NNC_Polyhedron_iterator_t last));
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BHZ03_H79_H79_widening_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y));
+
+
+
+
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BGP99_BHRZ03_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y,
+           int disjuncts));
+
+/*! \relates ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+int
+ppl_Pointset_Powerset_NNC_Polyhedron_BGP99_H79_extrapolation_assign
+PPL_PROTO((ppl_Pointset_Powerset_NNC_Polyhedron_t x,
+           ppl_const_Pointset_Powerset_NNC_Polyhedron_t y,
+           int disjuncts));
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Pointset_Powerset_NNC_Polyhedron)
+
+/* End of Functions Related to ppl_Pointset_Powerset_NNC_Polyhedron_tag */
+
+/*! \interface ppl_Double_Box_tag
+  \brief Types and functions for ppl_Double_Box_tag
+*/
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_delete_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_space_dimension
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_C_Polyhedron
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_NNC_Polyhedron
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Grid
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Rational_Box
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Double_Box
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_double
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Grid_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Constraint_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Congruence_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_from_Generator_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_space_dimension
+PPL_PROTO((ppl_const_Double_Box_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_affine_dimension
+PPL_PROTO((ppl_const_Double_Box_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_relation_with_Constraint
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_relation_with_Generator
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_relation_with_Congruence
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_constraints
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_congruences
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_minimized_constraints
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_minimized_congruences
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_empty
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_universe
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_bounded
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_contains_integer_point
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_topologically_closed
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_discrete
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_topological_closure_assign
+PPL_PROTO((ppl_Double_Box_t ph));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounds_from_above
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounds_from_below
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_upper_bound
+PPL_PROTO((ppl_Double_Box_t ps,
+           ppl_dimension_type var,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* pclosed));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_get_lower_bound
+PPL_PROTO((ppl_Double_Box_t ps,
+           ppl_dimension_type var,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* pclosed));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_maximize
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_minimize
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_maximize_with_point
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_minimize_with_point
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_frequency
+PPL_PROTO((ppl_const_Double_Box_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_contains_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_strictly_contains_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_is_disjoint_from_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_equals_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_OK
+PPL_PROTO((ppl_const_Double_Box_t ph));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_constraint
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_congruence
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_constraints
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_congruences
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_constraint
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_congruence
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_constraints
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_refine_with_congruences
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_intersection_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_upper_bound_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_difference_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_concatenate_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_time_elapse_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_simplify_using_context_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_constrains
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_unconstrain_space_dimension
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_unconstrain_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_affine_image
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_affine_preimage
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounded_affine_image
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_bounded_affine_preimage
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_image
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_preimage
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_space_dimensions_and_project
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_remove_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_remove_higher_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_expand_space_dimension
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_fold_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_map_space_dimensions
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_drop_some_non_integer_points
+PPL_PROTO((ppl_Double_Box_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_external_memory_in_bytes
+PPL_PROTO((ppl_const_Double_Box_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_total_memory_in_bytes
+PPL_PROTO((ppl_const_Double_Box_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_CC76_widening_assign_with_tokens
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_CC76_widening_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_widening_assign_with_tokens
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_widening_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_CC76_narrowing_assign
+PPL_PROTO((ppl_Double_Box_t x,
+           ppl_const_Double_Box_t y));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_linear_partition
+PPL_PROTO((ppl_const_Double_Box_t x,
+           ppl_const_Double_Box_t y,
+           ppl_Double_Box_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_wrap_assign
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_recycle_Constraint_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_recycle_Congruence_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_new_Double_Box_recycle_Generator_System
+PPL_PROTO((ppl_Double_Box_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_assign_Double_Box_from_Double_Box
+PPL_PROTO((ppl_Double_Box_t dst, ppl_const_Double_Box_t src));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_recycled_constraints
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_Double_Box_add_recycled_congruences
+PPL_PROTO((ppl_Double_Box_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_MS_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_PR_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Double_Box
+PPL_PROTO((ppl_const_Double_Box_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_MS_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before, ppl_const_Double_Box_t pset_after));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_termination_test_PR_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before, ppl_const_Double_Box_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_MS_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+           ppl_const_Double_Box_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_one_affine_ranking_function_PR_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+           ppl_const_Double_Box_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_MS_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+           ppl_const_Double_Box_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Double_Box_tag */
+int
+ppl_all_affine_ranking_functions_PR_Double_Box_2
+PPL_PROTO((ppl_const_Double_Box_t pset_before,
+           ppl_const_Double_Box_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Double_Box)
+
+/* End of Functions Related to ppl_Double_Box_tag */
+
+/*! \interface ppl_BD_Shape_double_tag
+  \brief Types and functions for ppl_BD_Shape_double_tag
+*/
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_delete_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_space_dimension
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_C_Polyhedron
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_NNC_Polyhedron
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Grid
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Rational_Box
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Double_Box
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_double
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Grid_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Double_Box_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Constraint_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Congruence_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_from_Generator_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_space_dimension
+PPL_PROTO((ppl_const_BD_Shape_double_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_affine_dimension
+PPL_PROTO((ppl_const_BD_Shape_double_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_relation_with_Constraint
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_relation_with_Generator
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_relation_with_Congruence
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_constraints
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_congruences
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_minimized_constraints
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_get_minimized_congruences
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_empty
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_universe
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_bounded
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_contains_integer_point
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_topologically_closed
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_discrete
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_topological_closure_assign
+PPL_PROTO((ppl_BD_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounds_from_above
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounds_from_below
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_maximize
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_minimize
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_maximize_with_point
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_minimize_with_point
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_frequency
+PPL_PROTO((ppl_const_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_contains_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_strictly_contains_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_is_disjoint_from_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_equals_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_OK
+PPL_PROTO((ppl_const_BD_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_constraint
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_congruence
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_constraints
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_congruences
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_constraint
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_congruence
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_constraints
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_refine_with_congruences
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_intersection_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_upper_bound_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_difference_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_concatenate_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_time_elapse_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_upper_bound_assign_if_exact
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_simplify_using_context_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_constrains
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_unconstrain_space_dimension
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_unconstrain_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_affine_image
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_affine_preimage
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounded_affine_image
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_bounded_affine_preimage
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_image
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_preimage
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_space_dimensions_and_embed
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_space_dimensions_and_project
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_remove_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_remove_higher_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_expand_space_dimension
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_fold_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_map_space_dimensions
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_drop_some_non_integer_points
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_drop_some_non_integer_points_2
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_external_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_double_t ps,
+           size_t* sz));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_total_memory_in_bytes
+PPL_PROTO((ppl_const_BD_Shape_double_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_H79_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_BHMZ05_widening_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_H79_widening_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_widening_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_widening_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_H79_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_H79_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_CC76_extrapolation_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_CC76_narrowing_assign
+PPL_PROTO((ppl_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_linear_partition
+PPL_PROTO((ppl_const_BD_Shape_double_t x,
+           ppl_const_BD_Shape_double_t y,
+           ppl_BD_Shape_double_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_wrap_assign
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_recycle_Constraint_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_recycle_Congruence_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_new_BD_Shape_double_recycle_Generator_System
+PPL_PROTO((ppl_BD_Shape_double_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_assign_BD_Shape_double_from_BD_Shape_double
+PPL_PROTO((ppl_BD_Shape_double_t dst, ppl_const_BD_Shape_double_t src));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_recycled_constraints
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_BD_Shape_double_add_recycled_congruences
+PPL_PROTO((ppl_BD_Shape_double_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_MS_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_PR_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_double
+PPL_PROTO((ppl_const_BD_Shape_double_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_MS_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before, ppl_const_BD_Shape_double_t pset_after));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_termination_test_PR_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before, ppl_const_BD_Shape_double_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+           ppl_const_BD_Shape_double_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+           ppl_const_BD_Shape_double_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+           ppl_const_BD_Shape_double_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_BD_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_BD_Shape_double_2
+PPL_PROTO((ppl_const_BD_Shape_double_t pset_before,
+           ppl_const_BD_Shape_double_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(BD_Shape_double)
+
+/* End of Functions Related to ppl_BD_Shape_double_tag */
+
+/*! \interface ppl_Octagonal_Shape_double_tag
+  \brief Types and functions for ppl_Octagonal_Shape_double_tag
+*/
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_delete_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_dimension_type d, int empty));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_C_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_NNC_Polyhedron
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Grid
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Grid_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Rational_Box
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Rational_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpz_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpq_class
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Double_Box
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Double_Box_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_C_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_NNC_Polyhedron_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Polyhedron_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Grid_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Grid_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Rational_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Rational_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpz_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpz_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_mpq_class_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_mpq_class_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Double_Box_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Double_Box_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_BD_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_BD_Shape_double_t ph, int complexity));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Octagonal_Shape_double_with_complexity
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Octagonal_Shape_double_t ph, int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_from_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_const_Generator_System_t cs));
+
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_space_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph, ppl_dimension_type* m));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_affine_dimension
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph, ppl_dimension_type* m));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_relation_with_Constraint
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_relation_with_Generator
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Generator_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_relation_with_Congruence
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_minimized_constraints
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_get_minimized_congruences
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_System_t* pcs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_empty
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_universe
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_bounded
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_contains_integer_point
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_topologically_closed
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_discrete
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_topological_closure_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounds_from_above
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounds_from_below
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_maximize
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_minimize
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_maximize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_minimize_with_point
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_frequency
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_contains_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_strictly_contains_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_is_disjoint_from_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_equals_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_OK
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ph));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_constraint
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_congruence
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_constraints
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_congruences
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_constraint
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_t c));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_congruence
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_t c));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_constraints
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_refine_with_congruences
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_intersection_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_upper_bound_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_difference_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_concatenate_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_time_elapse_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_upper_bound_assign_if_exact
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_simplify_using_context_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_constrains
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_unconstrain_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_unconstrain_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounded_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_bounded_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_image
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_preimage
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_image_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_generalized_affine_preimage_lhs_rhs
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_space_dimensions_and_embed
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type d));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_space_dimensions_and_project
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type d));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_remove_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_remove_higher_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_expand_space_dimension
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_fold_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_map_space_dimensions
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_drop_some_non_integer_points
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           int complexity));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_drop_some_non_integer_points_2
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_external_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ps,
+           size_t* sz));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_total_memory_in_bytes
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t ps,
+           size_t* sz));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_BHMZ05_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_BHMZ05_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_widening_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           unsigned* tp));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_widening_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_BHMZ05_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           ppl_const_Constraint_System_t cs,
+           unsigned* tp));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_BHMZ05_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_limited_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           ppl_const_Constraint_System_t cs));
+
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_CC76_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           unsigned* tp));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_CC76_extrapolation_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_CC76_narrowing_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_linear_partition
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t x,
+           ppl_const_Octagonal_Shape_double_t y,
+           ppl_Octagonal_Shape_double_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_wrap_assign
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_recycle_Constraint_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_recycle_Congruence_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_new_Octagonal_Shape_double_recycle_Generator_System
+PPL_PROTO((ppl_Octagonal_Shape_double_t* pph, ppl_Generator_System_t cs));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_assign_Octagonal_Shape_double_from_Octagonal_Shape_double
+PPL_PROTO((ppl_Octagonal_Shape_double_t dst, ppl_const_Octagonal_Shape_double_t src));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_recycled_constraints
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_Octagonal_Shape_double_add_recycled_congruences
+PPL_PROTO((ppl_Octagonal_Shape_double_t ph,
+           ppl_Congruence_System_t cs));
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_double
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_MS_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before, ppl_const_Octagonal_Shape_double_t pset_after));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_termination_test_PR_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before, ppl_const_Octagonal_Shape_double_t pset_after));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_MS_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+           ppl_const_Octagonal_Shape_double_t pset_after,
+           ppl_Generator_t point));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_one_affine_ranking_function_PR_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+           ppl_const_Octagonal_Shape_double_t pset_after,
+           ppl_Generator_t point));
+
+
+
+
+
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_MS_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+           ppl_const_Octagonal_Shape_double_t pset_after,
+           ppl_Polyhedron_t ph));
+
+/*! \relates ppl_Octagonal_Shape_double_tag */
+int
+ppl_all_affine_ranking_functions_PR_Octagonal_Shape_double_2
+PPL_PROTO((ppl_const_Octagonal_Shape_double_t pset_before,
+           ppl_const_Octagonal_Shape_double_t pset_after,
+           ppl_Polyhedron_t ph));
+
+
+
+
+
+
+
+PPL_DECLARE_IO_FUNCTIONS(Octagonal_Shape_double)
+
+/* End of Functions Related to ppl_Octagonal_Shape_double_tag */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_TYPE_DECLARATION
+#undef PPL_PROTO
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c_header.h b/interfaces/C/ppl_c_header.h
new file mode 100644
index 0000000..71ba536
--- /dev/null
+++ b/interfaces/C/ppl_c_header.h
@@ -0,0 +1,3272 @@
+/* This is the header file of the C interface of the Parma Polyhedra Library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*!
+  \defgroup PPL_C_interface C Language Interface
+
+  The Parma Polyhedra Library comes equipped with an interface
+  for the C language.
+*/
+
+/*! \mainpage
+
+All the declarations needed for using the PPL's C interface
+(preprocessor symbols, data types, variables and
+functions) are collected in the header file <CODE>ppl_c.h</CODE>.
+This file, which is designed to work with pre-ANSI and ANSI C compilers
+as well as C99 and C++ compilers, should be included, either directly
+or via some other header file, with the directive
+\code
+#include <ppl_c.h>
+\endcode
+If this directive does not work, then your compiler is unable to find
+the file <CODE>ppl_c.h</CODE>. So check that the library is installed
+(if it is not installed, you may want to <CODE>make install</CODE>,
+perhaps with root privileges) in the right place
+(if not you may want to reconfigure the library using the appropriate
+pathname for the <CODE>--prefix</CODE> option); and that your compiler
+knows where it is installed (if not you should add the path to the
+directory where <CODE>ppl_c.h</CODE> is located to the compiler's
+include file search path; this is usually done with the
+<CODE>-I</CODE> option).
+
+The name space of the PPL's C interface is <CODE>PPL_*</CODE> for
+preprocessor symbols, enumeration values and variables; and
+<CODE>ppl_*</CODE> for data types and function names. The interface
+systematically uses <EM>opaque data types</EM> (generic pointers that
+completely hide the internal representations from the client code) and
+provides all required access functions. By using just the interface,
+the client code can exploit all the functionalities of the library yet
+avoid directly manipulating the library's data structures.  The advantages
+are that (1) applications do not depend on the internals of the library
+(these may change from release to release), and (2) the interface
+invariants can be thoroughly checked (by the access functions).
+
+\note
+All functions taking as input argument an opaque pointer datatype assume
+that such an argument is actually <em>referring to a valid PPL object</em>.
+For instance, a function with an argument having type
+<code>ppl_MIP_Problem_t</code> will expect a valid MIP_Problem object,
+previously initialized by calling, e.g., <code>ppl_new_MIP_Problem</code>.
+If that is not the case (e.g., if a null pointer is passed in),
+the behavior is undefined.
+
+The PPL's C interface is initialized by means of the
+<CODE>ppl_initialize</CODE> function.  This function must
+be called <EM>before using any other interface of the library</EM>.
+The application can release the resources allocated by the library by
+calling the <CODE>ppl_finalize</CODE> function. After this function
+is called <EM>no other interface of the library may be used</EM>
+until the interface is re-initialized using <CODE>ppl_initialize</CODE>.
+
+Any application using the PPL should make sure that only the
+intended version(s) of the library are ever used.  The version used can be
+checked at compile-time thanks to the macros PPL_VERSION_MAJOR,
+PPL_VERSION_MINOR, PPL_VERSION_REVISION and PPL_VERSION_BETA, which
+give, respectively major, minor, revision and beta numbers of the PPL
+version.  This is an example of their use:
+\code
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 6
+# error "PPL version 0.6 or following is required"
+#endif
+\endcode
+Compile-time checking, however, is not normally enough, particularly in
+an environment where there is dynamic linking.  Run-time checking can
+be performed by means of the functions <CODE>ppl_version_major</CODE>,
+<CODE>ppl_version_minor</CODE>, <CODE>ppl_version_revision</CODE>, and
+<CODE>ppl_version_beta</CODE>. The PPL's C interface also provides
+functions <CODE>ppl_version</CODE>, returning character string
+containing the full version number, and <CODE>ppl_banner</CODE>,
+returning a string that, in addition, provides (pointers to) other
+useful information for the library user.
+
+All programs using the PPL's C interface must link with the
+following libraries: <CODE>libppl_c</CODE> (PPL's C interface),
+<CODE>libppl</CODE> (PPL's core), <CODE>libgmpxx</CODE> (GMP's C++
+interface), and <CODE>libgmp</CODE> (GMP's library core).  On most
+Unix-like systems, this is done by adding <CODE>-lppl_c</CODE>,
+<CODE>-lppl</CODE>, <CODE>-lgmpxx</CODE>, and <CODE>-lgmp</CODE> to
+the compiler's or linker's command line.  For example:
+\verbatim
+gcc myprogram.o -lppl_c -lppl -lgmpxx -lgmp
+\endverbatim
+If this does not work, it means that your compiler/linker is not
+finding the libraries where it expects.  Again, this could be because you
+forgot to install the library or you installed it in a non-standard
+location.  In the latter case you will need to use the appropriate
+options (usually <CODE>-L</CODE>) and, if you use shared libraries,
+some sort of run-time path selection mechanisms.  Consult your
+compiler's documentation for details.  Notice that the PPL is built
+using <A HREF="http://www.gnu.org/software/libtool/">Libtool</A> and
+an application can exploit this fact to significantly simplify the
+linking phase.  See Libtool's documentation for details.  Those
+working under Linux can find a lot of useful information on how to use
+program libraries (including static, shared, and dynamically loaded
+libraries) in the
+<A HREF="http://www.dwheeler.com/program-library/">Program Library
+HOWTO</A>.
+
+For examples on how to use the functions provided by the C interface,
+you are referred to the directory <CODE>demos/ppl_lpsol/</CODE> in
+the source distribution.  It contains a <EM>Mixed Integer (Linear)
+Programming</EM> solver written in C.  In order to use this solver
+you will need to install
+<A HREF="http://www.gnu.org/software/glpk/">GLPK</A> (the GNU Linear
+Programming Kit): this is used to read linear programs in MPS format.
+*/ /* \mainpage */
+
+/*
+  For some reason, GMP up to and including version 4.1.3 requires
+  <stdio.h> to be included before <gmp.h>.
+*/
+
+#include <stdio.h>
+#include <gmp.h>
+#include <stddef.h>
+
+/*
+  PPL_PROTO is a macro used to wrap function prototypes, so that
+  compilers that don't understand ANSI C prototypes still work, and
+  ANSI C compilers can issue warnings about type mismatches.
+*/
+#if defined(__STDC__)                              \
+  || defined(__cplusplus)                          \
+  || defined (_AIX)                                \
+  || (defined (__mips) && defined (_SYSTYPE_SVR4)) \
+  || defined(_WIN32)
+# define PPL_PROTO(protos) protos
+#else
+# define PPL_PROTO(protos) ()
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \defgroup Init Library Initialization and Finalization
+  Functions for initialization/finalization of the library,
+  as well as setting/resetting of floating-point rounding mode.
+*/
+/*@{*/
+
+/*! \brief
+  Initializes the Parma Polyhedra Library.
+  This function must be called before any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already initialized.
+*/
+int
+ppl_initialize PPL_PROTO((void));
+
+/*! \brief
+  Finalizes the Parma Polyhedra Library.
+  This function must be called after any other function.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if the library
+  was already finalized.
+*/
+int
+ppl_finalize PPL_PROTO((void));
+
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+int
+ppl_set_rounding_for_PPL PPL_PROTO((void));
+
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
+
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+int
+ppl_restore_pre_PPL_rounding PPL_PROTO((void));
+
+/*! \brief
+  Writes to \p p the precision parameter used for irrational calculations.
+*/
+int
+ppl_irrational_precision PPL_PROTO((unsigned* p));
+
+/*! \brief
+  Sets the precision parameter used for irrational calculations.
+
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for irrational calculations to \p p.
+  Then, in the irrational calculations returning an unbounded rational,
+  (e.g., when computing a square root), the lesser between numerator
+  and denominator will be limited to 2**\p p.
+*/
+int
+ppl_set_irrational_precision PPL_PROTO((unsigned p));
+
+/*@}*/ /* Init */
+
+/*! \defgroup Version Version Checking
+  Symbolic constants and functions related to library version checking.
+*/
+/*@{*/
+
+#include "ppl_c_version.h"
+
+/*! \brief
+  Returns the major number of the PPL version.
+*/
+int
+ppl_version_major PPL_PROTO((void));
+
+/*! \brief
+  Returns the minor number of the PPL version.
+*/
+int
+ppl_version_minor PPL_PROTO((void));
+
+/*! \brief
+  Returns the revision number of the PPL version.
+*/
+int
+ppl_version_revision PPL_PROTO((void));
+
+/*! \brief
+  Returns the beta number of the PPL version.
+*/
+int
+ppl_version_beta PPL_PROTO((void));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the
+  PPL version.
+*/
+int
+ppl_version PPL_PROTO((const char** p));
+
+/*! \brief
+  Writes to \c *p a pointer to a character string containing the PPL banner.
+
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+int
+ppl_banner PPL_PROTO((const char** p));
+
+/*@}*/ /* Version Checking */
+
+/*! \defgroup Error Error Handling
+  Symbolic constants and functions related to error reporting/handling.
+*/
+/*@{*/
+
+/*! \brief
+  Defines the error codes that any function may return.
+*/
+enum ppl_enum_error_code {
+  /*! \hideinitializer
+    The virtual memory available to the process has been exhausted. */
+  PPL_ERROR_OUT_OF_MEMORY = -2,
+  /*! \hideinitializer
+    A function has been invoked with an invalid argument. */
+  PPL_ERROR_INVALID_ARGUMENT = -3,
+  /*! \hideinitializer
+    A function has been invoked outside its domain of definition. */
+  PPL_ERROR_DOMAIN_ERROR = -4,
+  /*! \hideinitializer
+    The construction of an object that would exceed its maximum
+    permitted size was attempted. */
+  PPL_ERROR_LENGTH_ERROR = -5,
+  /*! \hideinitializer
+    An arithmetic overflow occurred and the computation was consequently
+    interrupted.  This can <EM>only</EM> happen in library's incarnations
+    using bounded integers as coefficients. */
+  PPL_ARITHMETIC_OVERFLOW = -6,
+  /*! \hideinitializer
+    An error occurred during a C input/output operation.  A more
+    precise indication of what went wrong is available via
+    <CODE>errno</CODE>. */
+  PPL_STDIO_ERROR = -7,
+  /*! \hideinitializer
+    An internal error that was diagnosed by the PPL itself.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_INTERNAL_ERROR = -8,
+  /*! \hideinitializer
+    A standard exception has been raised by the C++ run-time environment.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION = -9,
+  /*! \hideinitializer
+    A totally unknown, totally unexpected error happened.
+    This indicates a bug in the PPL. */
+  PPL_ERROR_UNEXPECTED_ERROR = -10,
+  /*! \hideinitializer
+    An exception has been raised by the PPL as a timeout previously set
+    by the user has expired.
+  */
+  PPL_TIMEOUT_EXCEPTION = -11,
+  /*! \hideinitializer
+    The client program attempted to use the PPL in a way that violates
+    its internal logic.  This happens, for instance, when the client
+    attempts to use the timeout facilities on a system that does not
+    support them. */
+  PPL_ERROR_LOGIC_ERROR = -12
+};
+
+/*! \brief
+  Installs the user-defined error handler pointed at by \p h.
+
+  The error handler takes an error code and a textual description that
+  gives further information about the actual error.  The C string
+  containing the textual description is read-only and its existence is
+  not guaranteed after the handler has returned.
+*/
+int
+ppl_set_error_handler PPL_PROTO((void (*h)(enum ppl_enum_error_code code,
+                                           const char* description)));
+
+/*@}*/ /* Error */
+
+/*! \defgroup Timeout Timeout Handling
+  Functions for setting and resetting timeouts.
+*/
+/*@{*/
+
+/*! \brief
+  Sets the timeout for computations whose completion could require
+  an exponential amount of time.
+
+  \param csecs
+  The number of centiseconds sometimes after which a timeout will occur;
+  it must be strictly greater than zero.
+
+  Computations taking exponential time will be interrupted some time
+  after \p csecs centiseconds have elapsed since the call to
+  the timeout setting function. If the computation is interrupted that
+  way, the interrupted function will return error code
+  <code>PPL_TIMEOUT_EXCEPTION</code>.
+  Otherwise, if the computation completes without being interrupted,
+  then the timeout should be reset by calling
+  <code>ppl_reset_timeout()</code>.
+*/
+int
+ppl_set_timeout PPL_PROTO((unsigned csecs));
+
+/*! \brief
+  Resets the timeout time so that the computation is not interrupted.
+*/
+int
+ppl_reset_timeout PPL_PROTO((void));
+
+/*! \brief
+  Sets a threshold for computations whose completion could require
+  an exponential amount of time.
+
+  \return
+  <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> if \p unscaled_weight is zero
+  or if the computed weight threshold exceeds the maximum allowed value.
+
+  \param unscaled_weight
+  The unscaled maximum computational weight; it has to be non-zero.
+
+  \param scale
+  The scaling factor to be applied to \p unscaled_weight.
+
+  If \p unscaled_weight has value \f$u\f$ and \p scale has value \f$s\f$,
+  then the (scaled) weight threshold is computed as \f$w = u \cdot 2^s\f$.
+  Computations taking exponential time will be interrupted some time
+  after reaching the complexity threshold \f$w\f$.
+  If the computation is interrupted that way, the interrupted function
+  will return error code <code>PPL_TIMEOUT_EXCEPTION</code>.
+  Otherwise, if the computation completes without being interrupted,
+  then the deterministic timeout should be reset by calling
+  <code>ppl_reset_deterministic_timeout()</code>.
+
+  \note
+  This "timeout" checking functionality is said to be \e deterministic
+  because it is not based on actual elapsed time. Its behavior will
+  only depend on (some of the) computations performed in the PPL library
+  and it will be otherwise independent from the computation environment
+  (CPU, operating system, compiler, etc.).
+
+  \warning
+  The weight mechanism is under beta testing. In particular,
+  there is still no clear relation between the weight threshold and
+  the actual computational complexity. As a consequence, client
+  applications should be ready to reconsider the tuning of these
+  weight thresholds when upgrading to newer version of the PPL.
+*/
+int
+ppl_set_deterministic_timeout PPL_PROTO((unsigned long unscaled_weight,
+                                         unsigned scale));
+
+/*! \brief
+  Resets the deterministic timeout so that the computation is not interrupted.
+*/
+int
+ppl_reset_deterministic_timeout PPL_PROTO((void));
+
+/*@}*/ /* Timeout */
+
+/*! \defgroup Datatypes Library Datatypes
+  \brief
+  Typedefs for the library datatypes and related symbolic constants.
+
+  The datatypes provided by the library should be manipulated
+  by means of the corresponding opaque pointer types and
+  the functions working on them.
+
+  \note
+  To simplify the detection of common programming mistakes,
+  we provide both pointer-to-const and pointer-to-nonconst
+  opaque pointers, with implicit conversions mapping each
+  pointer-to-nonconst to the corresponding pointer-to-const when needed.
+  The user of the C interface is therefore recommended to adopt
+  the pointer-to-const type whenever read-only access is meant.
+*/
+/*@{*/
+
+/*! \brief
+  An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \brief
+  Writes to \p m the maximum space dimension this library can handle.
+*/
+int
+ppl_max_space_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Writes to \p m a value that does not designate a valid dimension.
+*/
+int
+ppl_not_a_dimension PPL_PROTO((ppl_dimension_type* m));
+
+/*! \brief
+  Pretty-prints \p var to <CODE>stdout</CODE>.
+*/
+int
+ppl_io_print_variable PPL_PROTO((ppl_dimension_type var));
+
+/*! \brief
+  Pretty-prints \p var to the given output \p stream.
+*/
+int
+ppl_io_fprint_variable PPL_PROTO((FILE* stream, ppl_dimension_type var));
+
+/*! \brief
+  Pretty-prints \p var to a malloc-allocated string, a pointer to which
+  is returned via \p strp.
+*/
+int
+ppl_io_asprint_variable PPL_PROTO((char** strp, ppl_dimension_type var));
+
+/*! \brief
+  The type of output functions used for printing variables.
+
+  An output function for variables must write a textual representation
+  for \p var to a character buffer, null-terminate it, and return a
+  pointer to the beginning of the buffer.  In case the operation fails,
+  0 should be returned and perhaps <CODE>errno</CODE> should be set
+  in a meaningful way.  The library does nothing with the buffer, besides
+  printing its contents.
+*/
+typedef const char*
+ppl_io_variable_output_function_type(ppl_dimension_type var);
+
+/*! \brief
+  Sets the output function to be used for printing variables to \p p.
+*/
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p);
+
+/*! \brief
+  Writes a pointer to the current variable output function to \p pp.
+*/
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp);
+
+/*! \brief Utility function for the wrapping of lines of text.
+
+  \param src
+  The source string holding the text to wrap.
+
+  \param indent_depth
+  The indentation depth.
+
+  \param preferred_first_line_length
+  The preferred length for the first line of text.
+
+  \param preferred_line_length
+  The preferred length for all the lines but the first one.
+
+  \return
+  The wrapped string in a malloc-allocated buffer.
+*/
+char*
+ppl_io_wrap_string(const char* src,
+                   unsigned indent_depth,
+                   unsigned preferred_first_line_length,
+                   unsigned preferred_line_length);
+
+/*@}*/ /* Datatypes */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type)                                    \
+/*! \brief Opaque pointer \ingroup Datatypes */                       \
+typedef struct ppl_##Type##_tag* ppl_##Type##_t;                      \
+/*! \brief Opaque pointer to const object \ingroup Datatypes */       \
+typedef struct ppl_##Type##_tag const* ppl_const_##Type##_t;
+
+/*! \interface ppl_Coefficient_tag
+  \brief
+  Types and functions for coefficients.
+
+  The types and functions for coefficients provide an interface towards
+  \extref{Parma_Polyhedra_Library::Coefficient, Coefficient}.
+  Depending on configuration, the PPL coefficients may be implemented
+  by the unbounded precision integers provided by GMP (default),
+  or by bounded precision integers (with checks for overflows).
+*/
+PPL_TYPE_DECLARATION(Coefficient)
+
+/*! \interface ppl_Linear_Expression_tag
+  \brief
+  Types and functions for linear expressions.
+
+  The types and functions for linear expression provide an interface towards
+  \extref{Parma_Polyhedra_Library::Linear_Expression, Linear_Expression}.
+*/
+PPL_TYPE_DECLARATION(Linear_Expression)
+
+/*! \interface ppl_Constraint_tag
+  \brief
+  Types and functions for constraints.
+
+  The types and functions for constraints provide an interface towards
+  \extref{Parma_Polyhedra_Library::Constraint, Constraint}.
+*/
+PPL_TYPE_DECLARATION(Constraint)
+
+/*! \interface ppl_Constraint_System_tag
+  \brief
+  Types and functions for constraint systems.
+
+  The types and functions for constraint systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Constraint_System, Constraint_System}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System)
+
+/*! \interface ppl_Constraint_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on constraint systems.
+
+  The types and functions for constraint systems iterators provide
+  read-only access to the elements of a constraint system by interfacing
+  \extref{Parma_Polyhedra_Library::Constraint_System_const_iterator,
+  Constraint_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator)
+
+/*! \interface ppl_Generator_tag
+  \brief
+  Types and functions for generators.
+
+  The types and functions for generators provide an interface
+  towards \extref{Parma_Polyhedra_Library::Generator, Generator}.
+*/
+PPL_TYPE_DECLARATION(Generator)
+
+/*! \interface ppl_Generator_System_tag
+  \brief
+  Types and functions for generator systems.
+
+  The types and functions for generator systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Generator_System, Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Generator_System)
+
+/*! \interface ppl_Generator_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on generator systems.
+
+  The types and functions for generator systems iterators provide
+  read-only access to the elements of a generator system by interfacing
+  \extref{Parma_Polyhedra_Library::Generator_System_const_iterator,
+  Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Generator_System_const_iterator)
+
+/*! \interface ppl_Congruence_tag
+  \brief
+  Types and functions for congruences.
+
+  The types and functions for congruences provide an interface
+  towards \extref{Parma_Polyhedra_Library::Congruence, Congruence}.
+*/
+PPL_TYPE_DECLARATION(Congruence)
+
+/*! \interface ppl_Congruence_System_tag
+  \brief
+  Types and functions for congruence systems.
+
+  The types and functions for congruence systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Congruence_System, Congruence_System}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System)
+
+/*! \interface ppl_Congruence_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on congruence systems.
+
+  The types and functions for congruence systems iterators provide
+  read-only access to the elements of a congruence system by interfacing
+  \extref{Parma_Polyhedra_Library::Congruence_System::const_iterator,
+  Congruence_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Congruence_System_const_iterator)
+
+/*! \interface ppl_Grid_Generator_tag
+  \brief
+  Types and functions for grid generators.
+
+  The types and functions for grid generators provide an interface
+  towards \extref{Parma_Polyhedra_Library::Grid_Generator, Grid_Generator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator)
+
+/*! \interface ppl_Grid_Generator_System_tag
+  \brief
+  Types and functions for grid generator systems.
+
+  The types and functions for grid generator systems provide an interface
+  towards
+  \extref{Parma_Polyhedra_Library::Grid_Generator_System,
+  Grid_Generator_System}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System)
+
+/*! \interface ppl_Grid_Generator_System_const_iterator_tag
+  \brief
+  Types and functions for iterating on grid generator systems.
+
+  The types and functions for grid generator systems iterators provide
+  read-only access to the elements of a grid generator system by interfacing
+  \extref{Parma_Polyhedra_Library::Grid_Generator_System::const_iterator,
+  Grid_Generator_System::const_iterator}.
+*/
+PPL_TYPE_DECLARATION(Grid_Generator_System_const_iterator)
+
+/*! \interface ppl_MIP_Problem_tag
+  \brief
+  Types and functions for MIP problems.
+
+  The types and functions for MIP problems provide an interface
+  towards \extref{Parma_Polyhedra_Library::MIP_Problem, MIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(MIP_Problem)
+
+/*! \interface ppl_PIP_Problem_tag
+  \brief
+  Types and functions for PIP problems.
+
+  The types and functions for PIP problems provide an interface
+  towards \extref{Parma_Polyhedra_Library::PIP_Problem, PIP_Problem}.
+*/
+PPL_TYPE_DECLARATION(PIP_Problem)
+
+/*! \interface ppl_PIP_Tree_Node_tag
+  \brief
+  Types and functions for generic PIP tree nodes.
+
+  The types and functions for tree nodes provide an interface
+  towards \extref{Parma_Polyhedra_Library::PIP_Tree_Node, PIP_Tree_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Tree_Node)
+
+/*! \interface ppl_PIP_Decision_Node_tag
+  \brief
+  Types and functions for PIP decision nodes.
+
+  The types and functions for decision nodes provide an interface towards
+  \extref{Parma_Polyhedra_Library::PIP_Decision_Node, PIP_Decision_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Decision_Node)
+
+/*! \interface ppl_PIP_Solution_Node_tag
+  \brief
+  Types and functions for PIP solution nodes.
+
+  The types and functions for solution nodes provide an interface towards
+  \extref{Parma_Polyhedra_Library::PIP_Solution_Node, PIP_Solution_Node}.
+*/
+PPL_TYPE_DECLARATION(PIP_Solution_Node)
+
+/*! \interface ppl_Artificial_Parameter_tag
+  \brief
+  Types and functions for PIP artificial parameters.
+
+  The types and functions for PIP artificial parameters provide
+  an interface towards
+  \extref{Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter, Artificial_Parameter}.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter)
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence)
+
+/*! \interface ppl_Artificial_Parameter_Sequence_const_iterator_tag
+  \brief
+  Types and functions for iterating on PIP artificial parameters.
+*/
+PPL_TYPE_DECLARATION(Artificial_Parameter_Sequence_const_iterator)
+
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type)                               \
+/*! \relates ppl_##Type##_tag */                                        \
+int                                                                     \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x));                \
+/*! \relates ppl_##Type##_tag */                                        \
+int                                                                     \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag */                                        \
+int                                                                     \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+#define PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag */                    \
+int                                                 \
+ppl_##Type##_ascii_dump                             \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream));  \
+/*! \relates ppl_##Type##_tag */                    \
+int                                                 \
+ppl_##Type##_ascii_load                             \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_IO_FUNCTIONS(Type)      \
+PPL_DECLARE_PRINT_FUNCTIONS(Type)           \
+PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS(Type)
+
+#define PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type)                  \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to \c stdout. */       \
+int                                                                     \
+ppl_io_print_##Type PPL_PROTO((ppl_const_##Type##_t x));                \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to the given output \p stream. */ \
+int                                                                     \
+ppl_io_fprint_##Type PPL_PROTO((FILE* stream, ppl_const_##Type##_t x)); \
+/*! \relates ppl_##Type##_tag \brief Prints \p x to a malloc-allocated string, a pointer to which is returned via \p strp. */ \
+int                                                                     \
+ppl_io_asprint_##Type PPL_PROTO((char** strp, ppl_const_##Type##_t x));
+
+
+#define PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*! \relates ppl_##Type##_tag \brief Dumps an ascii representation of \p x on \p stream. */ \
+int                                                              \
+ppl_##Type##_ascii_dump                                          \
+PPL_PROTO((ppl_const_##Type##_t x, FILE* stream));               \
+/*! \relates ppl_##Type##_tag \brief Loads an ascii representation of \p x from \p stream. */ \
+int                                                              \
+ppl_##Type##_ascii_load                                          \
+PPL_PROTO((ppl_##Type##_t x, FILE* stream));
+
+#define PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Type)      \
+/*! \brief \name Input/Output Functions */               \
+/*@{*/                                                   \
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Type)           \
+PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS(Type) \
+/*@}*/ /* Input/Output Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+  Creates a new coefficient with value 0 and writes a handle for the
+  newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient PPL_PROTO((ppl_Coefficient_t* pc));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Creates a new coefficient with the value given by the GMP integer
+  \p z and writes a handle for the newly created coefficient
+  at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t* pc, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Builds a coefficient that is a copy of \p c; writes a handle
+  for the newly created coefficient at address \p pc.
+*/
+int
+ppl_new_Coefficient_from_Coefficient PPL_PROTO((ppl_Coefficient_t* pc,
+                                                ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Assign to \p dst the value given by the GMP integer \p z.
+*/
+int
+ppl_assign_Coefficient_from_mpz_t PPL_PROTO((ppl_Coefficient_t dst, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Assigns a copy of the coefficient \p src to \p dst.
+*/
+int
+ppl_assign_Coefficient_from_Coefficient
+PPL_PROTO((ppl_Coefficient_t dst, ppl_const_Coefficient_t src));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Coefficient PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Read-Only Accessor Functions */
+/*@{*/
+
+/*! \relates ppl_Coefficient_tag \brief
+  Sets the value of the GMP integer \p z to the value of \p c.
+*/
+int
+ppl_Coefficient_to_mpz_t PPL_PROTO((ppl_const_Coefficient_t c, mpz_t z));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Coefficient_OK PPL_PROTO((ppl_const_Coefficient_t c));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if coefficients are bounded; returns 0
+  otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p min is set to their minimum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_min PPL_PROTO((mpz_t min));
+
+/*! \relates ppl_Coefficient_tag \brief
+  Returns a positive integer if coefficients are bounded, in which case
+  \p max is set to their maximum value; returns 0 otherwise.
+*/
+int
+ppl_Coefficient_max PPL_PROTO((mpz_t max));
+
+/*@}*/ /* Read-Only Accessor Functions */
+
+/* No ascii dump for Coefficient */
+/*! \brief \name I/O Functions */
+/*@{*/
+PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS(Coefficient)
+/*@}*/ /* I/O Functions */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  zero-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression PPL_PROTO((ppl_Linear_Expression_t* ple));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Creates a new linear expression corresponding to the constant 0 in a
+  <TT>d</TT>-dimensional space; writes a handle for the new linear
+  expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_with_dimension
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_dimension_type d));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression that is a copy of \p le; writes a handle
+  for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to constraint \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Constraint
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to congruence \p c;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Congruence
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Builds a linear expression corresponding to grid generator \p g;
+  writes a handle for the newly created linear expression at address \p ple.
+*/
+int
+ppl_new_Linear_Expression_from_Grid_Generator
+PPL_PROTO((ppl_Linear_Expression_t* ple, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Assigns a copy of the linear expression \p src to \p dst.
+*/
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Invalidates the handle \p le: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Linear_Expression PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Writes to \p m the space dimension of \p le.
+*/
+int
+ppl_Linear_Expression_space_dimension
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_dimension_type* m));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_coefficient PPL_PROTO((ppl_const_Linear_Expression_t le,
+                                             ppl_dimension_type var,
+                                             ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Copies into \p n the inhomogeneous term of linear expression \p le.
+*/
+int
+ppl_Linear_Expression_inhomogeneous_term
+PPL_PROTO((ppl_const_Linear_Expression_t le, ppl_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Returns a positive integer if \p le is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p le is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Linear_Expression_OK PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+    Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+*/
+int
+ppl_Linear_Expression_is_zero PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+*/
+int
+ppl_Linear_Expression_all_homogeneous_terms_are_zero
+PPL_PROTO((ppl_const_Linear_Expression_t le));
+
+/*@}*/ /* Functions that Do Not Modify the Linear Expression */
+
+/*! \brief \name Functions that May Modify the Linear Expression */
+/*@{*/
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Adds \p n to the coefficient of variable \p var in the linear
+  expression \p le.  The space dimension is set to be the maximum
+  between \p var + 1 and the old space dimension.
+*/
+int
+ppl_Linear_Expression_add_to_coefficient
+PPL_PROTO((ppl_Linear_Expression_t le,
+           ppl_dimension_type var,
+           ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Adds \p n to the inhomogeneous term of the linear expression \p le.
+*/
+int
+ppl_Linear_Expression_add_to_inhomogeneous
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Adds the linear expression \p src to \p dst.
+*/
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Subtracts the linear expression \p src from \p dst.
+*/
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+PPL_PROTO((ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src));
+
+/*! \relates ppl_Linear_Expression_tag \brief
+  Multiply the linear expression \p dst by \p n.
+*/
+int
+ppl_multiply_Linear_Expression_by_Coefficient
+PPL_PROTO((ppl_Linear_Expression_t le, ppl_const_Coefficient_t n));
+
+/*@}*/ /* Functions that May Modify the Linear Expression */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Linear_Expression)
+
+/*! \brief \ingroup Datatypes
+  Describes the relations represented by a constraint.
+*/
+enum ppl_enum_Constraint_Type {
+  /*! The constraint is of the form \f$e < 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_THAN,
+  /*! The constraint is of the form \f$e \leq 0\f$. */
+  PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL,
+  /*! The constraint is of the form \f$e = 0\f$. */
+  PPL_CONSTRAINT_TYPE_EQUAL,
+  /*! The constraint is of the form \f$e \geq 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL,
+  /*! The constraint is of the form \f$e > 0\f$. */
+  PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+  Creates the new constraint `\p le \p rel 0' and writes a handle for
+  it at address \p pc.  The space dimension of the new constraint is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+                              ppl_const_Linear_Expression_t le,
+                              enum ppl_enum_Constraint_Type rel));
+
+/*! \relates ppl_Constraint_tag \brief
+  Creates the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$
+  and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_false PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+  Creates the true (zero-dimension space) constraint \f$0 \leq 1\f$,
+  also known as <EM>positivity constraint</EM>.
+  A handle for the newly created constraint is written at address \p pc.
+*/
+int
+ppl_new_Constraint_zero_dim_positivity PPL_PROTO((ppl_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_tag \brief
+  Builds a constraint that is a copy of \p c; writes a handle
+  for the newly created constraint at address \p pc.
+*/
+int
+ppl_new_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t* pc,
+                                              ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+  Assigns a copy of the constraint \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_from_Constraint PPL_PROTO((ppl_Constraint_t dst,
+                                                 ppl_const_Constraint_t src));
+
+/*! \relates ppl_Constraint_tag \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint */
+/*@{*/
+
+/*! \relates ppl_Constraint_tag \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Constraint_space_dimension PPL_PROTO((ppl_const_Constraint_t c,
+                                          ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_tag \brief
+  Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  constraint \p c.
+*/
+int
+ppl_Constraint_coefficient PPL_PROTO((ppl_const_Constraint_t c,
+                                      ppl_dimension_type var,
+                                      ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+  Copies into \p n the inhomogeneous term of constraint \p c.
+*/
+int
+ppl_Constraint_inhomogeneous_term PPL_PROTO((ppl_const_Constraint_t c,
+                                             ppl_Coefficient_t n));
+
+/*! \relates ppl_Constraint_tag \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_OK PPL_PROTO((ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds an empty system of constraints and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds a zero-dimensional, unsatisfiable constraint system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_zero_dim_empty
+PPL_PROTO((ppl_Constraint_System_t* pcs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds the singleton constraint system containing only a copy of
+  constraint \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_t c));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Builds a constraint system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Assigns a copy of the constraint system \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_from_Constraint_System
+PPL_PROTO((ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Constraint_System_space_dimension
+PPL_PROTO((ppl_const_Constraint_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Returns a positive integer if \p cs contains no (non-trivial) constraint;
+  returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_empty
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Returns a positive integer if \p cs contains any (non-trivial) strict
+  inequality; returns 0 otherwise.
+*/
+int
+ppl_Constraint_System_has_strict_inequalities
+PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the constraint system \p cs.
+*/
+int
+ppl_Constraint_System_begin
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+           ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  constraint system \p cs.
+*/
+int
+ppl_Constraint_System_end
+PPL_PROTO((ppl_const_Constraint_System_t cs,
+           ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Constraint_System_OK PPL_PROTO((ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Constraint System */
+
+/*! \brief \name Functions that May Modify the Constraint System */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Removes all the constraints from the constraint system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Constraint_System_clear PPL_PROTO((ppl_Constraint_System_t cs));
+
+/*! \relates ppl_Constraint_System_tag \brief
+  Inserts a copy of the constraint \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Constraint_System_insert_Constraint PPL_PROTO((ppl_Constraint_System_t cs,
+                                                   ppl_const_Constraint_t c));
+
+/*@}*/ /* Functions that May Modify the Constraint System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Constraint_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p cit; writes a
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t* pcit,
+           ppl_const_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+PPL_PROTO((ppl_Constraint_System_const_iterator_t dst,
+           ppl_const_Constraint_System_const_iterator_t src));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Constraint_System_const_iterator
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Dereference \p cit writing a const handle to the resulting
+  constraint at address \p pc.
+*/
+int
+ppl_Constraint_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t cit,
+           ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Increment \p cit so that it "points" to the next constraint.
+*/
+int
+ppl_Constraint_System_const_iterator_increment
+PPL_PROTO((ppl_Constraint_System_const_iterator_t cit));
+
+/*! \relates ppl_Constraint_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Constraint_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Constraint_System_const_iterator_t x,
+           ppl_const_Constraint_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+  Describes the different kinds of generators.
+*/
+enum ppl_enum_Generator_Type {
+  /*! The generator is a line. */
+  PPL_GENERATOR_TYPE_LINE,
+  /*! The generator is a ray. */
+  PPL_GENERATOR_TYPE_RAY,
+  /*! The generator is a point. */
+  PPL_GENERATOR_TYPE_POINT,
+  /*! The generator is a closure point. */
+  PPL_GENERATOR_TYPE_CLOSURE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+  Creates a new generator of direction \p le and type \p t.  If the
+  generator to be created is a point or a closure point, the divisor
+  \p d is applied to \p le.  For other types of generators \p d is
+  simply disregarded.  A handle for the new generator is written at
+  address \p pg.  The space dimension of the new generator is equal to
+  the space dimension of \p le.
+*/
+int
+ppl_new_Generator PPL_PROTO((ppl_Generator_t* pg,
+                             ppl_const_Linear_Expression_t le,
+                             enum ppl_enum_Generator_Type t,
+                             ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Generator_tag \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new generator at address
+  \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+  Creates, as a closure point, the point that is the origin of the
+  zero-dimensional space \f$\Rset^0\f$.  Writes a handle for the new
+  generator at address \p pg.
+*/
+int
+ppl_new_Generator_zero_dim_closure_point PPL_PROTO((ppl_Generator_t* pg));
+
+/*! \relates ppl_Generator_tag \brief
+  Builds a generator that is a copy of \p g; writes a handle
+  for the newly created generator at address \p pg.
+*/
+int
+ppl_new_Generator_from_Generator PPL_PROTO((ppl_Generator_t* pg,
+                                            ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+  Assigns a copy of the generator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_from_Generator PPL_PROTO((ppl_Generator_t dst,
+                                               ppl_const_Generator_t src));
+
+/*! \relates ppl_Generator_tag \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator */
+/*@{*/
+
+/*! \relates ppl_Generator_tag \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Generator_space_dimension PPL_PROTO((ppl_const_Generator_t g,
+                                         ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_tag \brief
+  Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_tag \brief
+  Copies into \p n the coefficient of variable \p var in generator \p g.
+*/
+int
+ppl_Generator_coefficient PPL_PROTO((ppl_const_Generator_t g,
+                                     ppl_dimension_type var,
+                                     ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+  If \p g is a point or a closure point assigns its divisor to \p n.
+*/
+int
+ppl_Generator_divisor PPL_PROTO((ppl_const_Generator_t g,
+                                 ppl_Coefficient_t n));
+
+/*! \relates ppl_Generator_tag \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_OK PPL_PROTO((ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+  Builds an empty system of generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Generator_System_t* pgs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Builds the singleton generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator PPL_PROTO((ppl_Generator_System_t* pgs,
+                                                   ppl_const_Generator_t g));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Builds a generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Assigns a copy of the generator system \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_from_Generator_System
+PPL_PROTO((ppl_Generator_System_t dst, ppl_const_Generator_System_t src));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Returns a positive integer if \p gs contains no generators;
+  returns 0 otherwise.
+*/
+int
+ppl_Generator_System_empty
+PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the generator system \p gs.
+*/
+int
+ppl_Generator_System_begin
+PPL_PROTO((ppl_const_Generator_System_t gs,
+           ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  generator system \p gs.
+*/
+int
+ppl_Generator_System_end
+PPL_PROTO((ppl_const_Generator_System_t gs,
+           ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Generator_System_OK PPL_PROTO((ppl_const_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Generator System */
+
+/*! \brief \name Functions that May Modify the Generator System */
+/*@{*/
+
+/*! \relates ppl_Generator_System_tag \brief
+  Removes all the generators from the generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Generator_System_clear PPL_PROTO((ppl_Generator_System_t gs));
+
+/*! \relates ppl_Generator_System_tag \brief
+  Inserts a copy of the generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Generator_System_insert_Generator PPL_PROTO((ppl_Generator_System_t gs,
+                                                 ppl_const_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p git; writes a
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t* pgit,
+           ppl_const_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+PPL_PROTO((ppl_Generator_System_const_iterator_t dst,
+           ppl_const_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Dereference \p git writing a const handle to the resulting
+  generator at address \p pg.
+*/
+int
+ppl_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t git,
+           ppl_const_Generator_t* pg));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Increment \p git so that it "points" to the next generator.
+*/
+int
+ppl_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Generator_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Generator_System_const_iterator_t x,
+           ppl_const_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+  Creates the new congruence \f$le = 0 \pmod{m}\f$ and writes a handle for
+  it at address \p pc.  The space dimension of the new congruence is
+  equal to the space dimension of \p le.
+*/
+int
+ppl_new_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+                              ppl_const_Linear_Expression_t le,
+                              ppl_const_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+  Creates the unsatisfiable (zero-dimension space) congruence
+  \f$0 = 1 \pmod{0}\f$ and writes a handle for it at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_false PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+  Creates the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+  also known as <EM>integrality congruence</EM>.
+  A handle for the newly created congruence is written at address \p pc.
+*/
+int
+ppl_new_Congruence_zero_dim_integrality PPL_PROTO((ppl_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_tag \brief
+  Builds a congruence that is a copy of \p c; writes a handle
+  for the newly created congruence at address \p pc.
+*/
+int
+ppl_new_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t* pc,
+                                              ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_tag \brief
+  Assigns a copy of the congruence \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_from_Congruence PPL_PROTO((ppl_Congruence_t dst,
+                                                 ppl_const_Congruence_t src));
+
+/*! \relates ppl_Congruence_tag \brief
+  Invalidates the handle \p c: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence */
+/*@{*/
+
+/*! \relates ppl_Congruence_tag \brief
+  Writes to \p m the space dimension of \p c.
+*/
+int
+ppl_Congruence_space_dimension PPL_PROTO((ppl_const_Congruence_t c,
+                                          ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  congruence \p c.
+*/
+int
+ppl_Congruence_coefficient PPL_PROTO((ppl_const_Congruence_t c,
+                                      ppl_dimension_type var,
+                                      ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+  Copies into \p n the inhomogeneous term of congruence \p c.
+*/
+int
+ppl_Congruence_inhomogeneous_term PPL_PROTO((ppl_const_Congruence_t c,
+                                             ppl_Coefficient_t n));
+
+/*! \relates ppl_Congruence_tag \brief
+  Copies into \p m the modulus of congruence \p c.
+*/
+int
+ppl_Congruence_modulus PPL_PROTO((ppl_const_Congruence_t c,
+                                  ppl_Coefficient_t m));
+
+/*! \relates ppl_Congruence_tag \brief
+  Returns a positive integer if \p c is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p c is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Congruence_OK PPL_PROTO((ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds an empty system of congruences and writes a handle to it at
+  address \p pcs.
+*/
+int
+ppl_new_Congruence_System PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds a zero-dimensional, unsatisfiable congruence system and
+  writes a handle to it at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_zero_dim_empty
+PPL_PROTO((ppl_Congruence_System_t* pcs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds the singleton congruence system containing only a copy of
+  congruence \p c; writes a handle for the newly created system at
+  address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_t c));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Builds a congruence system that is a copy of \p cs; writes a handle
+  for the newly created system at address \p pcs.
+*/
+int
+ppl_new_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Assigns a copy of the congruence system \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_from_Congruence_System
+PPL_PROTO((ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Invalidates the handle \p cs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p cs.
+*/
+int
+ppl_Congruence_System_space_dimension
+PPL_PROTO((ppl_const_Congruence_System_t cs, ppl_dimension_type* m));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Returns a positive integer if \p cs contains no (non-trivial) congruence;
+  returns 0 otherwise.
+*/
+int
+ppl_Congruence_System_empty
+PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" to the beginning of
+  the congruence system \p cs.
+*/
+int
+ppl_Congruence_System_begin
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+           ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Assigns to \p cit a const iterator "pointing" past the end of the
+  congruence system \p cs.
+*/
+int
+ppl_Congruence_System_end
+PPL_PROTO((ppl_const_Congruence_System_t cs,
+           ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Returns a positive integer if \p cs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p cs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Congruence_System_OK PPL_PROTO((ppl_const_Congruence_System_t cs));
+
+/*@}*/ /* Functions that Do Not Modify the Congruence System */
+
+/*! \brief \name Functions that May Modify the Congruence System */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Removes all the congruences from the congruence system \p cs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Congruence_System_clear PPL_PROTO((ppl_Congruence_System_t cs));
+
+/*! \relates ppl_Congruence_System_tag \brief
+  Inserts a copy of the congruence \p c into \p cs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Congruence_System_insert_Congruence PPL_PROTO((ppl_Congruence_System_t cs,
+                                                   ppl_const_Congruence_t c));
+
+/*@}*/ /* Functions that May Modify the Congruence System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Congruence_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p cit; writes a
+  handle for the newly created const iterator at address \p pcit.
+*/
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t* pcit,
+           ppl_const_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+PPL_PROTO((ppl_Congruence_System_const_iterator_t dst,
+           ppl_const_Congruence_System_const_iterator_t src));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Invalidates the handle \p cit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Congruence_System_const_iterator
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Dereference \p cit writing a const handle to the resulting
+  congruence at address \p pc.
+*/
+int
+ppl_Congruence_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t cit,
+           ppl_const_Congruence_t* pc));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Increment \p cit so that it "points" to the next congruence.
+*/
+int
+ppl_Congruence_System_const_iterator_increment
+PPL_PROTO((ppl_Congruence_System_const_iterator_t cit));
+
+/*! \relates ppl_Congruence_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Congruence_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Congruence_System_const_iterator_t x,
+           ppl_const_Congruence_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+  Describes the different kinds of grid generators.
+*/
+enum ppl_enum_Grid_Generator_Type {
+  /*! The grid generator is a line. */
+  PPL_GRID_GENERATOR_TYPE_LINE,
+  /*! The grid generator is a parameter. */
+  PPL_GRID_GENERATOR_TYPE_PARAMETER,
+  /*! The grid generator is a point. */
+  PPL_GRID_GENERATOR_TYPE_POINT
+};
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Creates a new grid generator of direction \p le and type \p t.  If the
+  grid generator to be created is a point or a parameter, the divisor
+  \p d is applied to \p le.  If it is a line, \p d is simply disregarded.
+  A handle for the new grid generator is written at address \p pg.
+  The space dimension of the new grid generator is equal to the space
+  dimension of \p le.
+*/
+int
+ppl_new_Grid_Generator PPL_PROTO((ppl_Grid_Generator_t* pg,
+                                  ppl_const_Linear_Expression_t le,
+                                  enum ppl_enum_Grid_Generator_Type t,
+                                  ppl_const_Coefficient_t d));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Creates the point that is the origin of the zero-dimensional space
+  \f$\Rset^0\f$.  Writes a handle for the new grid generator at address
+  \p pg.
+*/
+int
+ppl_new_Grid_Generator_zero_dim_point PPL_PROTO((ppl_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Builds a grid generator that is a copy of \p g; writes a handle
+  for the newly created grid generator at address \p pg.
+*/
+int
+ppl_new_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t* pg, ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Assigns a copy of the grid generator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_t dst,
+           ppl_const_Grid_Generator_t src));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Invalidates the handle \p g: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Writes to \p m the space dimension of \p g.
+*/
+int
+ppl_Grid_Generator_space_dimension PPL_PROTO((ppl_const_Grid_Generator_t g,
+                                              ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Returns the type of grid generator \p g.
+*/
+int
+ppl_Grid_Generator_type PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  grid generator \p g.
+*/
+int
+ppl_Grid_Generator_coefficient PPL_PROTO((ppl_const_Grid_Generator_t g,
+                                          ppl_dimension_type var,
+                                          ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  If \p g is a point or a parameter assigns its divisor to \p n.
+*/
+int
+ppl_Grid_Generator_divisor PPL_PROTO((ppl_const_Grid_Generator_t g,
+                                      ppl_Coefficient_t n));
+
+/*! \relates ppl_Grid_Generator_tag \brief
+  Returns a positive integer if \p g is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p g is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_OK PPL_PROTO((ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that Do Not Modify the Generator */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Builds an empty system of grid generators and writes a handle to it at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*
+  Creates the universe zero-dimensional system of grid generators (i.e.,
+  containing the origin only).  Writes a handle to the new system at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Builds the singleton grid generator system containing only a copy of
+  generator \p g; writes a handle for the newly created system at
+  address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+           ppl_const_Grid_Generator_t g));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Builds a grid generator system that is a copy of \p gs; writes a handle
+  for the newly created system at address \p pgs.
+*/
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t* pgs,
+           ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Assigns a copy of the grid generator system \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+PPL_PROTO((ppl_Grid_Generator_System_t dst,
+           ppl_const_Grid_Generator_System_t src));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Invalidates the handle \p gs: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Functions that Do Not Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p gs.
+*/
+int
+ppl_Grid_Generator_System_space_dimension
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs, ppl_dimension_type* m));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Returns a positive integer if \p gs contains no generator;
+  returns 0 otherwise.
+*/
+int
+ppl_Grid_Generator_System_empty
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" to the beginning of
+  the grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_begin
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+           ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Assigns to \p git a const iterator "pointing" past the end of the
+  grid generator system \p gs.
+*/
+int
+ppl_Grid_Generator_System_end
+PPL_PROTO((ppl_const_Grid_Generator_System_t gs,
+           ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Returns a positive integer if \p gs is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p gs is broken.  Useful for debugging purposes.
+*/
+int
+ppl_Grid_Generator_System_OK PPL_PROTO((ppl_const_Grid_Generator_System_t gs));
+
+/*@}*/ /* Functions that Do Not Modify the Grid Generator System */
+
+/*! \brief \name Functions that May Modify the Grid Generator System */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Removes all the generators from the grid generator system \p gs
+  and sets its space dimension to 0.
+*/
+int
+ppl_Grid_Generator_System_clear PPL_PROTO((ppl_Grid_Generator_System_t gs));
+
+/*! \relates ppl_Grid_Generator_System_tag \brief
+  Inserts a copy of the grid generator \p g into \p gs; the space
+  dimension is increased, if necessary.
+*/
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+PPL_PROTO((ppl_Grid_Generator_System_t gs,
+           ppl_const_Grid_Generator_t g));
+
+/*@}*/ /* Functions that May Modify the Grid Generator System */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Grid_Generator_System)
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p git; writes a
+  handle for the newly created const iterator at address \p pgit.
+*/
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t* pgit,
+           ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t dst,
+           ppl_const_Grid_Generator_System_const_iterator_t src));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Invalidates the handle \p git: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Grid_Generator_System_const_iterator
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Dereference \p git writing a const handle to the resulting
+  grid generator at address \p pg.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t git,
+           ppl_const_Grid_Generator_t* pg));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Increment \p git so that it "points" to the next grid generator.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_increment
+PPL_PROTO((ppl_Grid_Generator_System_const_iterator_t git));
+
+/*! \relates ppl_Grid_Generator_System_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+PPL_PROTO((ppl_const_Grid_Generator_System_const_iterator_t x,
+           ppl_const_Grid_Generator_System_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+
+/*! \brief \ingroup Datatypes
+  Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief \ingroup Datatypes
+  Code of the worst-case exponential but typically polynomial
+  complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief \ingroup Datatypes
+  Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron and the set of points
+  satisfying the constraint are disjoint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron intersects the set of
+  points satisfying the constraint, but it is not included in it.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron is included in the set of
+  points satisfying the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that the polyhedron is included in the set of
+  points saturating the constraint.
+*/
+extern unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+/*! \brief \ingroup Datatypes
+  Individual bit saying that adding the generator would not change the
+  polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+
+/*! \brief \ingroup Datatypes
+  Widths of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Width {
+  /*! \hideinitializer 8 bits. */
+  PPL_BITS_8 = 8,
+  /*! \hideinitializer 16 bits. */
+  PPL_BITS_16 = 16,
+  /*! \hideinitializer 32 bits. */
+  PPL_BITS_32 = 32,
+  /*! \hideinitializer 64 bits. */
+  PPL_BITS_64 = 64,
+  /*! \hideinitializer 128 bits. */
+  PPL_BITS_128 = 128
+};
+
+/*! \brief \ingroup Datatypes
+  Representation of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Representation {
+  /*! Unsigned binary. */
+  PPL_UNSIGNED,
+  /*! \brief
+    Signed binary where negative values are represented by the two's
+    complement of the absolute value.
+  */
+  PPL_SIGNED_2_COMPLEMENT
+};
+
+/*! \brief \ingroup Datatypes
+  Overflow behavior of bounded integer types.
+*/
+enum ppl_enum_Bounded_Integer_Type_Overflow {
+  /*! \brief
+    On overflow, wrapping takes place.
+
+    This means that, for a \f$w\f$-bit bounded integer, the computation
+    happens modulo \f$2^w\f$.
+  */
+  PPL_OVERFLOW_WRAPS,
+
+  /*! \brief
+    On overflow, the result is undefined.
+
+    This simply means that the result of the operation resulting in an
+    overflow can take any value.
+
+    \note
+    Even though something more serious can happen in the system
+    being analyzed ---due to, e.g., C's undefined behavior---, here we
+    are only concerned with the results of arithmetic operations.
+    It is the responsibility of the analyzer to ensure that other
+    manifestations of undefined behavior are conservatively approximated.
+  */
+  PPL_OVERFLOW_UNDEFINED,
+
+  /*! \brief
+    Overflow is impossible.
+
+    This is for the analysis of languages where overflow is trapped
+    before it affects the state, for which, thus, any indication that
+    an overflow may have affected the state is necessarily due to
+    the imprecision of the analysis.
+  */
+  PPL_OVERFLOW_IMPOSSIBLE
+};
+
+/*! \brief \name Symbolic Constants */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "maximization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "minimization" optimization mode.
+*/
+extern int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "unfeasible MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "unbounded MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of the "optimized MIP problem" status.
+*/
+extern int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code for the MIP problem's "pricing" control parameter name.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of MIP problem's "textbook" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of MIP problem's "exact steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Code of MIP problem's "float steepest-edge" pricing method.
+*/
+extern int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+
+
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of the "unfeasible PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of the "optimized PIP problem" status.
+*/
+extern int PPL_PIP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code for the PIP problem's "cutting strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code for the PIP problem's "pivot row strategy" control parameter name.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "first" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "deepest" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "all" cutting strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "first" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST;
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Code of PIP problem's "max column" pivot row strategy.
+*/
+extern int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+/*@}*/ /* Symbolic Constants */
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Builds a trivial MIP problem of dimension \p d and writes a
+  handle to it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_space_dimension PPL_PROTO((ppl_MIP_Problem_t* pmip,
+                                                    ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Builds a MIP problem of space dimension \p d having feasible region \p cs,
+  objective function \p le and optimization mode \p m; writes a handle to
+  it at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem PPL_PROTO((ppl_MIP_Problem_t* pmip,
+                               ppl_dimension_type d,
+                               ppl_const_Constraint_System_t cs,
+                               ppl_const_Linear_Expression_t le,
+                               int m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Builds a MIP problem that is a copy of \p mip; writes a handle
+  for the newly created system at address \p pmip.
+*/
+int
+ppl_new_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t* pmip, ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Assigns a copy of the MIP problem \p src to \p dst.
+*/
+int
+ppl_assign_MIP_Problem_from_MIP_Problem
+PPL_PROTO((ppl_MIP_Problem_t dst, ppl_const_MIP_Problem_t src));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Invalidates the handle \p mip: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_MIP_Problem PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for MIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p mip.
+*/
+int
+ppl_MIP_Problem_space_dimension
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes to \p m the number of integer space dimensions of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes in the first positions of the array \p ds all the integer space
+  dimensions of problem \p mip. If the array is not big enough to hold
+  all of the integer space dimensions, the behavior is undefined.
+*/
+int
+ppl_MIP_Problem_integer_space_dimensions
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes to \p m the number of constraints defining
+  the feasible region of \p mip.
+*/
+int
+ppl_MIP_Problem_number_of_constraints PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                                 ppl_dimension_type* m));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes at address \p pc a const handle to the \p i-th constraint
+  defining the feasible region of the MIP problem \p mip
+*/
+int
+ppl_MIP_Problem_constraint_at_index PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                               ppl_dimension_type i,
+                                               ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes a const handle to the linear expression defining the
+  objective function of the MIP problem \p mip at address \p ple.
+*/
+int
+ppl_MIP_Problem_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Linear_Expression_t* ple));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns the optimization mode of the MIP problem \p mip.
+*/
+int
+ppl_MIP_Problem_optimization_mode PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns a positive integer if \p mip is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p mip is broken.  Useful for debugging purposes.
+*/
+int
+ppl_MIP_Problem_OK PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+/*! \brief \name Functions that May Modify the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Resets the MIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_MIP_Problem_clear PPL_PROTO((ppl_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Adds \p d new dimensions to the space enclosing the MIP problem \p mip
+  and to \p mip itself.
+*/
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type d));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets the space dimensions that are specified in first \p n positions
+  of the array \p ds to be integer dimensions of problem \p mip.
+  The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Modifies the feasible region of the MIP problem \p mip by adding a copy
+  of the constraint \p c.
+*/
+int
+ppl_MIP_Problem_add_constraint PPL_PROTO((ppl_MIP_Problem_t mip,
+                                          ppl_const_Constraint_t c));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Modifies the feasible region of the MIP problem \p mip by adding a copy
+  of the constraints in \p cs.
+*/
+int
+ppl_MIP_Problem_add_constraints PPL_PROTO((ppl_MIP_Problem_t mip,
+                                           ppl_const_Constraint_System_t cs));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets the objective function of the MIP problem \p mip to a copy of \p le.
+*/
+int
+ppl_MIP_Problem_set_objective_function
+PPL_PROTO((ppl_MIP_Problem_t mip, ppl_const_Linear_Expression_t le));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets the optimization mode of the MIP problem \p mip to \p mode.
+*/
+int
+ppl_MIP_Problem_set_optimization_mode PPL_PROTO((ppl_MIP_Problem_t mip,
+                                                 int mode));
+
+/*@}*/ /* Functions that May Modify the MIP_Problem */
+
+/*! \brief \name Computing the Solution of the MIP_Problem */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns a positive integer if \p mip is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_MIP_Problem_is_satisfiable PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Solves the MIP problem \p mip, returning an exit status.
+
+  \return
+  <CODE>PPL_MIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the MIP problem
+  is not satisfiable;
+  <CODE>PPL_MIP_PROBLEM_STATUS_UNBOUNDED</CODE> if the MIP problem
+  is satisfiable but there is no finite bound to the value of
+  the objective function;
+  <CODE>PPL_MIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the MIP problem
+  admits an optimal solution.
+*/
+int
+ppl_MIP_Problem_solve PPL_PROTO((ppl_const_MIP_Problem_t mip));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Evaluates the objective function of \p mip on point \p g.
+
+  \param mip
+  The MIP problem defining the objective function;
+
+  \param g
+  The generator on which the objective function will be evaluated;
+
+  \param num
+  Will be assigned the numerator of the objective function value;
+
+  \param den
+  Will be assigned the denominator of the objective function value;
+*/
+int
+ppl_MIP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_MIP_Problem_t mip, ppl_const_Generator_t g,
+           ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes a const handle to a feasible point for the MIP problem \p mip
+  at address \p pg.
+*/
+int
+ppl_MIP_Problem_feasible_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                          ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes a const handle to an optimizing point for the MIP problem \p mip
+  at address \p pg.
+*/
+int
+ppl_MIP_Problem_optimizing_point PPL_PROTO((ppl_const_MIP_Problem_t mip,
+                                            ppl_const_Generator_t* pg));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns the optimal value for \p mip.
+
+  \param mip
+  The MIP problem;
+
+  \param num
+  Will be assigned the numerator of the optimal value;
+
+  \param den
+  Will be assigned the denominator of the optimal value.
+*/
+int
+ppl_MIP_Problem_optimal_value
+PPL_PROTO((ppl_const_MIP_Problem_t mip,
+           ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*@}*/ /* Computing the Solution of the MIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Returns the value of control parameter \p name in problem \p mip.
+*/
+int
+ppl_MIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_MIP_Problem_t mip, int name));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Sets control parameter \p value in problem \p mip.
+*/
+int
+ppl_MIP_Problem_set_control_parameter
+PPL_PROTO((ppl_MIP_Problem_t mip, int value));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory occupied by \p mip.
+*/
+int
+ppl_MIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*! \relates ppl_MIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory managed by \p mip.
+*/
+int
+ppl_MIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_MIP_Problem_t mip, size_t* sz));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Builds a trivial PIP problem of dimension \p d and writes a
+  handle to it at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_space_dimension PPL_PROTO((ppl_PIP_Problem_t* ppip,
+                                                    ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Builds a PIP problem that is a copy of \p pip; writes a handle
+  for the newly created problem at address \p ppip.
+*/
+int
+ppl_new_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t* ppip, ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Assigns a copy of the PIP problem \p src to \p dst.
+*/
+int
+ppl_assign_PIP_Problem_from_PIP_Problem
+PPL_PROTO((ppl_PIP_Problem_t dst, ppl_const_PIP_Problem_t src));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Builds a PIP problem having space dimension \p d from the sequence
+  of constraints in the range \f$[\mathrm{first}, \mathrm{last})\f$;
+  the \p n dimensions whose indices occur in \p ds are interpreted as
+  parameters.
+*/
+int
+ppl_new_PIP_Problem_from_constraints
+PPL_PROTO((ppl_PIP_Problem_t* ppip,
+           ppl_dimension_type d,
+           ppl_Constraint_System_const_iterator_t first,
+           ppl_Constraint_System_const_iterator_t last,
+           size_t n,
+           ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Invalidates the handle \p pip: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_PIP_Problem PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Constructors, Assignment and Destructor for PIP_Problem */
+
+/*! \brief \name Functions that Do Not Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p m the dimension of the vector space enclosing \p pip.
+
+  The vector space dimensions includes both the problem variables
+  and the problem parameters, but they do not include the artificial
+  parameters.
+*/
+int
+ppl_PIP_Problem_space_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p m the number of parameter space dimensions of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes in the first positions of the array \p ds all the parameter space
+  dimensions of problem \p pip. If the array is not big enough to hold
+  all of the parameter space dimensions, the behavior is undefined.
+*/
+int
+ppl_PIP_Problem_parameter_space_dimensions
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type ds[]));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes into \p *pd the big parameter dimension of PIP problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_big_parameter_dimension
+PPL_PROTO((ppl_const_PIP_Problem_t pip, ppl_dimension_type* pd));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p m the number of constraints defining
+  the feasible region of \p pip.
+*/
+int
+ppl_PIP_Problem_number_of_constraints PPL_PROTO((ppl_const_PIP_Problem_t pip,
+                                                 ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes at address \p pc a const handle to the \p i-th constraint
+  defining the feasible region of the PIP problem \p pip
+*/
+int
+ppl_PIP_Problem_constraint_at_index PPL_PROTO((ppl_const_PIP_Problem_t pip,
+                                               ppl_dimension_type i,
+                                               ppl_const_Constraint_t* pc));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory occupied by \p pip.
+*/
+int
+ppl_PIP_Problem_total_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes into \p *sz the size in bytes of the memory managed by \p pip.
+*/
+int
+ppl_PIP_Problem_external_memory_in_bytes
+PPL_PROTO((ppl_const_PIP_Problem_t pip, size_t* sz));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Returns a positive integer if \p pip is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p pip is broken.  Useful for debugging purposes.
+*/
+int
+ppl_PIP_Problem_OK PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*@}*/ /* Functions that Do Not Modify the PIP_Problem */
+
+/*! \brief \name Functions that May Modify the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Resets the PIP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_PIP_Problem_clear PPL_PROTO((ppl_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Adds <CODE>pip_vars + pip_params</CODE> new space dimensions
+  and embeds the PIP problem \p pip in the new vector space.
+
+  \param pip
+  The PIP problem to be embedded in the new vector space.
+
+  \param pip_vars
+  The number of space dimensions to add that are interpreted as
+  PIP problem variables (i.e., non parameters). These are added
+  \e before adding the \p pip_params parameters.
+
+  \param pip_params
+  The number of space dimensions to add that are interpreted as
+  PIP problem parameters. These are added \e after having added the
+  \p pip_vars problem variables.
+
+  The new space dimensions will be those having the highest indexes
+  in the new PIP problem; they are initially unconstrained.
+*/
+int
+ppl_PIP_Problem_add_space_dimensions_and_embed
+PPL_PROTO((ppl_PIP_Problem_t pip,
+           ppl_dimension_type pip_vars,
+           ppl_dimension_type pip_params));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Sets the space dimensions that are specified in first \p n positions
+  of the array \p ds to be parameter dimensions of problem \p pip.
+  The presence of duplicates in \p ds is a waste but an innocuous one.
+*/
+int
+ppl_PIP_Problem_add_to_parameter_space_dimensions
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type ds[], size_t n));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Sets the big parameter dimension of PIP problem \p pip to \p d.
+*/
+int
+ppl_PIP_Problem_set_big_parameter_dimension
+PPL_PROTO((ppl_PIP_Problem_t pip, ppl_dimension_type d));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Modifies the feasible region of the PIP problem \p pip by adding a copy
+  of the constraint \p c.
+*/
+int
+ppl_PIP_Problem_add_constraint PPL_PROTO((ppl_PIP_Problem_t pip,
+                                          ppl_const_Constraint_t c));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Modifies the feasible region of the PIP problem \p pip by adding a copy
+  of the constraints in \p cs.
+*/
+int
+ppl_PIP_Problem_add_constraints PPL_PROTO((ppl_PIP_Problem_t pip,
+                                           ppl_const_Constraint_System_t cs));
+
+/*@}*/ /* Functions that May Modify the PIP_Problem */
+
+/*! \brief \name Computing and Printing the Solution of the PIP_Problem */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Returns a positive integer if \p pip is satisfiable and an optimal
+  solution can be found; returns 0 otherwise.
+*/
+int
+ppl_PIP_Problem_is_satisfiable PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Solves the PIP problem \p pip, returning an exit status.
+
+  \return
+  <CODE>PPL_PIP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the PIP problem
+  is not satisfiable;
+  <CODE>PPL_PIP_PROBLEM_STATUS_OPTIMIZED</CODE> if the PIP problem
+  admits an optimal solution.
+*/
+int
+ppl_PIP_Problem_solve PPL_PROTO((ppl_const_PIP_Problem_t pip));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p pip_tree a solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_solution PPL_PROTO((ppl_const_PIP_Problem_t pip,
+                                    ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Writes to \p pip_tree an optimizing solution for \p pip, if it exists.
+*/
+int
+ppl_PIP_Problem_optimizing_solution
+PPL_PROTO((ppl_const_PIP_Problem_t pip,
+           ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*@}*/ /* Computing the Solution of the PIP_Problem */
+
+/*! \brief \name Querying/Setting Control Parameters */
+/*@{*/
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Returns the value of control parameter \p name in problem \p pip.
+*/
+int
+ppl_PIP_Problem_get_control_parameter
+PPL_PROTO((ppl_const_PIP_Problem_t pip, int name));
+
+/*! \relates ppl_PIP_Problem_tag \brief
+  Sets control parameter \p value in problem \p pip.
+*/
+int
+ppl_PIP_Problem_set_control_parameter
+PPL_PROTO((ppl_PIP_Problem_t pip, int value));
+
+/*@}*/ /* Querying/Setting Control Parameters */
+
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p dpip_tree the solution node if \p spip_tree is
+  a solution node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_solution
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+           ppl_const_PIP_Solution_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p dpip_tree the decision node if \p spip_tree
+  is a decision node, and 0 otherwise.
+*/
+int
+ppl_PIP_Tree_Node_as_decision
+PPL_PROTO((ppl_const_PIP_Tree_Node_t spip_tree,
+           ppl_const_PIP_Decision_Node_t* dpip_tree));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p pcs the local system of parameter constraints
+  at the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_get_constraints
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_const_Constraint_System_t* pcs));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Returns a positive integer if \p pip_tree is well formed, i.e., if it
+  satisfies all its implementation invariants; returns 0 and perhaps
+  makes some noise if \p pip_tree is broken.  Useful for debugging purposes.
+*/
+int
+ppl_PIP_Tree_Node_OK PPL_PROTO((ppl_const_PIP_Tree_Node_t pip));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Writes to \p m the number of elements in the artificial parameter sequence
+  in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_number_of_artificials
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_dimension_type* m));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Assigns to \p pit a const iterator "pointing" to the beginning of
+  the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_begin
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Tree_Node_tag \brief
+  Assigns to \p pit a const iterator "pointing" to the end of
+  the artificial parameter sequence in the pip tree node \p pip_tree.
+*/
+int
+ppl_PIP_Tree_Node_end
+PPL_PROTO((ppl_const_PIP_Tree_Node_t pip_tree,
+           ppl_Artificial_Parameter_Sequence_const_iterator_t pit));
+
+/*! \relates ppl_PIP_Solution_Node_tag \brief
+  Writes to \p le a const pointer to the parametric expression of the values
+  of variable \p var in solution node \p pip_sol.
+
+  The linear expression assigned to \p le will only refer to
+  (problem or artificial) parameters.
+
+  \param pip_sol
+  The solution tree node.
+
+  \param var
+  The variable which is queried about.
+
+  \param le
+  The returned expression for variable \p var.
+
+  \return PPL_ERROR_INVALID_ARGUMENT
+  Returned if \p var is dimension-incompatible with \p *this
+  or if \p var is a problem parameter.
+*/
+int
+ppl_PIP_Solution_Node_get_parametric_values
+PPL_PROTO((ppl_const_PIP_Solution_Node_t pip_sol,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t* le));
+
+/*! \relates ppl_PIP_Decision_Node_tag \brief
+  Writes to \p pip_tree a const pointer to either the true branch
+  (if \p b is not zero) or the false branch (if \p b is zero) of \p pip_dec.
+*/
+int
+ppl_PIP_Decision_Node_get_child_node
+PPL_PROTO((ppl_const_PIP_Decision_Node_t pip_dec,
+           int b,
+           ppl_const_PIP_Tree_Node_t* pip_tree));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p le the linear expression in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_Linear_Expression
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_Linear_Expression_t le));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p n the coefficient of variable \p var in
+  the artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_coefficient
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_dimension_type var,
+           ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p n the inhomogeneous term of the artificial
+  parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_get_inhomogeneous_term
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_Coefficient_t n));
+
+/*! \relates ppl_Artificial_Parameter_tag \brief
+  Copies into \p n the denominator in artificial parameter \p ap.
+*/
+int
+ppl_Artificial_Parameter_denominator
+PPL_PROTO((ppl_const_Artificial_Parameter_t ap,
+           ppl_Coefficient_t n));
+
+/*! \brief \name Constructors, Assignment and Destructor */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Builds a new `const iterator' and writes a handle to it at address
+  \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Builds a const iterator that is a copy of \p apit; writes a
+  handle for the newly created const iterator at address \p papit.
+*/
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t* papit,
+           ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Assigns a copy of the const iterator \p src to \p dst.
+*/
+int
+ppl_assign_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t dst,
+           ppl_const_Artificial_Parameter_Sequence_const_iterator_t src));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Invalidates the handle \p apit: this makes sure the corresponding
+  resources will eventually be released.
+*/
+int
+ppl_delete_Artificial_Parameter_Sequence_const_iterator
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*@}*/ /* Constructors, Assignment and Destructor */
+
+/*! \brief \name Dereferencing, Incrementing and Equality Testing */
+/*@{*/
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Dereference \p apit writing a const handle to the resulting
+  artificial parameter at address \p pap.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_dereference
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit,
+           ppl_const_Artificial_Parameter_t* pap));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Increment \p apit so that it "points" to the next artificial parameter.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_increment
+PPL_PROTO((ppl_Artificial_Parameter_Sequence_const_iterator_t apit));
+
+/*! \relates ppl_Artificial_Parameter_Sequence_const_iterator_tag \brief
+  Returns a positive integer if the iterators corresponding to \p x and
+  \p y are equal; returns 0 if they are different.
+*/
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+PPL_PROTO((ppl_const_Artificial_Parameter_Sequence_const_iterator_t x,
+           ppl_const_Artificial_Parameter_Sequence_const_iterator_t y));
+
+/*@}*/ /* Dereferencing, Incrementing and Equality Testing */
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(MIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Problem)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Tree_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Solution_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(PIP_Decision_Node)
+
+PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS(Artificial_Parameter)
+
+#include "ppl_c_domains.h"
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_TYPE_DECLARATION
+#undef PPL_PROTO
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+#undef PPL_DECLARE_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_IO_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_PRINT_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_ASCII_DUMP_LOAD_FUNCTIONS
+#undef PPL_DECLARE_AND_DOCUMENT_IO_FUNCTIONS
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c_implementation_common.cc b/interfaces/C/ppl_c_implementation_common.cc
new file mode 100644
index 0000000..85b027a
--- /dev/null
+++ b/interfaces/C/ppl_c_implementation_common.cc
@@ -0,0 +1,2642 @@
+/* Implementation of the C interface: variables and non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/* Interface for Coefficient. */
+
+#include "ppl_c_implementation_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+error_handler_type user_error_handler = 0;
+
+extern "C" const char*
+c_variable_default_output_function(ppl_dimension_type var) {
+#if PPL_SIZEOF_SIZE_T == PPL_SIZEOF_INT
+# define FORMAT "%u"
+# define CONVERSION (unsigned)
+#elif PPL_SIZEOF_SIZE_T == PPL_SIZEOF_LONG
+# define FORMAT "%lu"
+# define CONVERSION (unsigned long)
+#elif PPL_SIZEOF_SIZE_T == PPL_SIZEOF_LONG_LONG
+# define FORMAT "%llu"
+# define CONVERSION (unsigned long long)
+#else
+# error "Unsupported definition for `size_t'."
+#endif
+  // On a 64-bits architecture, `var' will not be more than 2^64-1,
+  // (2^64-1)/26 is written with 18 decimal digits, plus one letter,
+  // plus one terminator makes 20.
+#if defined(ULLONG_MAX) && ULLONG_MAX > 18446744073709551615ULL
+# error "Please enlarge the buffer in the following line."
+#endif
+  static char buffer[20];
+  buffer[0] = static_cast<char>('A' + var % 26);
+  if (ppl_dimension_type i = var / 26) {
+    int r = sprintf(buffer+1, FORMAT, CONVERSION i);
+    if (r < 0)
+      return 0;
+    else if (r >= 19) {
+      errno = ERANGE;
+      return 0;
+    }
+  }
+  else
+    buffer[1] = '\0';
+  return buffer;
+}
+
+// Holds a pointer to the C current output function.
+ppl_io_variable_output_function_type* c_variable_output_function;
+
+void
+cxx_Variable_output_function(std::ostream& s, const Variable v) {
+  const char* b = c_variable_output_function(v.id());
+  if (b == 0)
+    // Something went wrong in the client's output function.
+    // Client code will know what to do: we do nothing.
+    return;
+  s << b;
+}
+
+extern "C" typedef const char*
+c_variable_output_function_type(ppl_dimension_type var);
+
+// Holds a pointer to the C++ saved output function.
+Variable::output_function_type* saved_cxx_Variable_output_function;
+
+void
+notify_error(enum ppl_enum_error_code code, const char* description) {
+  if (user_error_handler != 0)
+    user_error_handler(code, description);
+}
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+  if (p_timeout_object != 0) {
+    delete p_timeout_object;
+    p_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+void
+reset_deterministic_timeout() {
+  if (p_deterministic_timeout_object != 0) {
+    delete p_deterministic_timeout_object;
+    p_deterministic_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::C;
+
+unsigned int PPL_POLY_CON_RELATION_IS_DISJOINT;
+unsigned int PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS;
+unsigned int PPL_POLY_CON_RELATION_IS_INCLUDED;
+unsigned int PPL_POLY_CON_RELATION_SATURATES;
+
+unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+int PPL_MIP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_MIP_PROBLEM_STATUS_UNBOUNDED;
+int PPL_MIP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING;
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT;
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT;
+int PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK;
+
+int PPL_PIP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_PIP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST;
+int PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+int PPL_OPTIMIZATION_MODE_MINIMIZATION;
+int PPL_OPTIMIZATION_MODE_MAXIMIZATION;
+
+int
+ppl_set_error_handler(error_handler_type h) {
+  user_error_handler = h;
+  return 0;
+}
+
+int
+ppl_initialize(void) try {
+  initialize();
+
+  PPL_POLY_CON_RELATION_IS_DISJOINT
+    = Poly_Con_Relation::is_disjoint().get_flags();
+  PPL_POLY_CON_RELATION_STRICTLY_INTERSECTS
+    = Poly_Con_Relation::strictly_intersects().get_flags();
+  PPL_POLY_CON_RELATION_IS_INCLUDED
+    = Poly_Con_Relation::is_included().get_flags();
+  PPL_POLY_CON_RELATION_SATURATES
+    = Poly_Con_Relation::saturates().get_flags();
+
+  PPL_POLY_GEN_RELATION_SUBSUMES
+    = Poly_Gen_Relation::subsumes().get_flags();
+
+  PPL_COMPLEXITY_CLASS_POLYNOMIAL = POLYNOMIAL_COMPLEXITY;
+  PPL_COMPLEXITY_CLASS_SIMPLEX = SIMPLEX_COMPLEXITY;
+  PPL_COMPLEXITY_CLASS_ANY = ANY_COMPLEXITY;
+
+  PPL_MIP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_MIP_PROBLEM;
+  PPL_MIP_PROBLEM_STATUS_UNBOUNDED = UNBOUNDED_MIP_PROBLEM;
+  PPL_MIP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_MIP_PROBLEM;
+
+  PPL_MIP_PROBLEM_CONTROL_PARAMETER_NAME_PRICING
+    = MIP_Problem::PRICING;
+  PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_FLOAT
+    = MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT;
+  PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_STEEPEST_EDGE_EXACT
+    = MIP_Problem::PRICING_STEEPEST_EDGE_EXACT;
+  PPL_MIP_PROBLEM_CONTROL_PARAMETER_PRICING_TEXTBOOK
+    = MIP_Problem::PRICING_TEXTBOOK;
+
+  PPL_PIP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_PIP_PROBLEM;
+  PPL_PIP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_PIP_PROBLEM;
+
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_CUTTING_STRATEGY
+    = PIP_Problem::CUTTING_STRATEGY;
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_FIRST
+    = PIP_Problem::CUTTING_STRATEGY_FIRST;
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_DEEPEST
+    = PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_CUTTING_STRATEGY_ALL
+    = PIP_Problem::CUTTING_STRATEGY_ALL;
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_NAME_PIVOT_ROW_STRATEGY
+    = PIP_Problem::PIVOT_ROW_STRATEGY;
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_FIRST
+    = PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+  PPL_PIP_PROBLEM_CONTROL_PARAMETER_PIVOT_ROW_STRATEGY_MAX_COLUMN
+    = PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+
+  PPL_OPTIMIZATION_MODE_MINIMIZATION = MINIMIZATION;
+  PPL_OPTIMIZATION_MODE_MAXIMIZATION = MAXIMIZATION;
+
+  c_variable_output_function = c_variable_default_output_function;
+  saved_cxx_Variable_output_function = Variable::get_output_function();
+  Variable::set_output_function(cxx_Variable_output_function);
+
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_finalize(void) try {
+  Variable::set_output_function(saved_cxx_Variable_output_function);
+
+  finalize();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_timeout(unsigned csecs) try {
+  // In case a timeout was already set.
+  reset_timeout();
+  static timeout_exception e;
+  using Parma_Polyhedra_Library::Watchdog;
+  p_timeout_object = new Watchdog(csecs, abandon_expensive_computations, e);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_reset_timeout(void) try {
+  reset_timeout();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_deterministic_timeout(unsigned long unscaled_weight,
+                              unsigned scale) try {
+  // In case a deterministic timeout was already set.
+  reset_deterministic_timeout();
+  static timeout_exception e;
+  typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+  p_deterministic_timeout_object
+    = new Weightwatch(Traits::compute_delta(unscaled_weight, scale),
+                      abandon_expensive_computations, e);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_reset_deterministic_timeout(void) try {
+  reset_deterministic_timeout();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_rounding_for_PPL(void) try {
+  set_rounding_for_PPL();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_restore_pre_PPL_rounding(void) try {
+  restore_pre_PPL_rounding();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_irrational_precision(unsigned* p) try {
+  *p = irrational_precision();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_set_irrational_precision(unsigned p) try {
+  set_irrational_precision(p);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_version_major(void) try {
+  return static_cast<int>(version_major());
+}
+CATCH_ALL
+
+int
+ppl_version_minor(void) try {
+  return static_cast<int>(version_minor());
+}
+CATCH_ALL
+
+int
+ppl_version_revision(void) try {
+  return static_cast<int>(version_revision());
+}
+CATCH_ALL
+
+int
+ppl_version_beta(void) try {
+  return static_cast<int>(version_beta());
+}
+CATCH_ALL
+
+int
+ppl_version(const char** p) try {
+  // Note: use explicit qualification to avoid clashes on, e.g.,
+  // Solaris 2.9, where `version' is the name of an enum defined in
+  // math.h.
+  *p = Parma_Polyhedra_Library::version();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_banner(const char** p) try {
+  *p = banner();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_max_space_dimension(ppl_dimension_type* m) try {
+  *m = max_space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_not_a_dimension(ppl_dimension_type* m) try {
+  *m = not_a_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient(ppl_Coefficient_t* pc) try {
+  *pc = to_nonconst(new Coefficient(0));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_mpz_t(ppl_Coefficient_t* pc, mpz_t z) try {
+  *pc = to_nonconst(new Coefficient(reinterpret_mpz_class(z)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Coefficient_from_Coefficient(ppl_Coefficient_t* pc,
+                                     ppl_const_Coefficient_t c) try {
+  const Coefficient& cc = *to_const(c);
+  *pc = to_nonconst(new Coefficient(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_to_mpz_t(ppl_const_Coefficient_t c, mpz_t z) try {
+  assign_r(reinterpret_mpz_class(z), *to_const(c), ROUND_NOT_NEEDED);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Coefficient(ppl_const_Coefficient_t c) try {
+  delete to_const(c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_mpz_t(ppl_Coefficient_t dst, mpz_t z) try {
+  Coefficient& ddst = *to_nonconst(dst);
+  ddst = reinterpret_mpz_class(z);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Coefficient_from_Coefficient(ppl_Coefficient_t dst,
+                                        ppl_const_Coefficient_t src) try {
+  const Coefficient& ssrc = *to_const(src);
+  Coefficient& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_OK(ppl_const_Coefficient_t /* c */) try {
+  return 1;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_is_bounded(void) try {
+  return std::numeric_limits<Coefficient>::is_bounded ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_min(mpz_t min) try {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    assign_r(reinterpret_mpz_class(min),
+             std::numeric_limits<Coefficient>::min(),
+             ROUND_NOT_NEEDED);
+    return 1;
+  }
+  else
+    return 0;
+}
+CATCH_ALL
+
+int
+ppl_Coefficient_max(mpz_t max) try {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    assign_r(reinterpret_mpz_class(max),
+             std::numeric_limits<Coefficient>::max(),
+             ROUND_NOT_NEEDED);
+    return 1;
+  }
+  else
+    return 0;
+}
+CATCH_ALL
+
+/* Interface for Linear_Expression. */
+
+int
+ppl_new_Linear_Expression(ppl_Linear_Expression_t* ple) try {
+  *ple = to_nonconst(new Linear_Expression());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_with_dimension(ppl_Linear_Expression_t* ple,
+                                         ppl_dimension_type d) try {
+  *ple = to_nonconst(d == 0
+                     ? new Linear_Expression(0)
+                     : new Linear_Expression(0*Variable(d-1)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t* ple, ppl_const_Linear_Expression_t le) try {
+  const Linear_Expression& lle = *to_const(le);
+  *ple = to_nonconst(new Linear_Expression(lle));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Linear_Expression(ppl_const_Linear_Expression_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  const Linear_Expression& ssrc = *to_const(src);
+  Linear_Expression& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_coefficient(ppl_Linear_Expression_t le,
+                                         ppl_dimension_type var,
+                                         ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  add_mul_assign(lle, nn, Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_add_to_inhomogeneous(ppl_Linear_Expression_t le,
+                                           ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle += nn;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_add_Linear_Expression_to_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  Linear_Expression& ddst = *to_nonconst(dst);
+  const Linear_Expression& ssrc = *to_const(src);
+  ddst += ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_subtract_Linear_Expression_from_Linear_Expression
+(ppl_Linear_Expression_t dst, ppl_const_Linear_Expression_t src) try {
+  Linear_Expression& ddst = *to_nonconst(dst);
+  const Linear_Expression& ssrc = *to_const(src);
+  ddst -= ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_multiply_Linear_Expression_by_Coefficient(ppl_Linear_Expression_t le,
+                                              ppl_const_Coefficient_t n) try {
+  Linear_Expression& lle = *to_nonconst(le);
+  const Coefficient& nn = *to_const(n);
+  lle *= nn;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_space_dimension(ppl_const_Linear_Expression_t le,
+                                      ppl_dimension_type* m) try {
+  *m = to_const(le)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_coefficient(ppl_const_Linear_Expression_t le,
+                                  ppl_dimension_type var,
+                                  ppl_Coefficient_t n) try {
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& nn = *to_nonconst(n);
+  nn = lle.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_inhomogeneous_term(ppl_const_Linear_Expression_t le,
+                                         ppl_Coefficient_t n) try {
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& nn = *to_nonconst(n);
+  nn = lle.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_OK(ppl_const_Linear_Expression_t le) try {
+  return to_const(le)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_is_zero(ppl_const_Linear_Expression_t le) try {
+  return to_const(le)->is_zero() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Linear_Expression_all_homogeneous_terms_are_zero
+  (ppl_const_Linear_Expression_t le) try {
+  return to_const(le)->all_homogeneous_terms_are_zero() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Constraint. */
+
+int
+ppl_new_Constraint(ppl_Constraint_t* pc,
+                   ppl_const_Linear_Expression_t le,
+                   enum ppl_enum_Constraint_Type t) try {
+  Constraint* ppc;
+  const Linear_Expression& lle = *to_const(le);
+  switch (t) {
+  case PPL_CONSTRAINT_TYPE_EQUAL:
+    ppc = new Constraint(lle == 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
+    ppc = new Constraint(lle >= 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+    ppc = new Constraint(lle > 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
+    ppc = new Constraint(lle <= 0);
+    break;
+  case PPL_CONSTRAINT_TYPE_LESS_THAN:
+    ppc = new Constraint(lle < 0);
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Constraint(pc, le, t): "
+                                "t invalid");
+  }
+  *pc = to_nonconst(ppc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_false(ppl_Constraint_t* pc) try {
+  *pc = to_nonconst(new Constraint(Constraint::zero_dim_false()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_zero_dim_positivity(ppl_Constraint_t* pc) try {
+  *pc = to_nonconst(new Constraint(Constraint::zero_dim_positivity()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_from_Constraint(ppl_Constraint_t* pc,
+                                   ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *pc = to_nonconst(new Constraint(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint(ppl_const_Constraint_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_from_Constraint(ppl_Constraint_t dst,
+                                      ppl_const_Constraint_t src) try {
+  const Constraint& ssrc = *to_const(src);
+  Constraint& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_space_dimension(ppl_const_Constraint_t c,
+                               ppl_dimension_type* m) try {
+  *m = to_const(c)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_type(ppl_const_Constraint_t c) try {
+  switch (to_const(c)->type()) {
+  case Constraint::EQUALITY:
+    return PPL_CONSTRAINT_TYPE_EQUAL;
+  case Constraint::NONSTRICT_INEQUALITY:
+    return PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL;
+  case Constraint::STRICT_INEQUALITY:
+    return PPL_CONSTRAINT_TYPE_GREATER_THAN;
+  }
+  PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_coefficient(ppl_const_Constraint_t c,
+                           ppl_dimension_type var,
+                           ppl_Coefficient_t n) try {
+  const Constraint& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_inhomogeneous_term(ppl_const_Constraint_t c,
+                                  ppl_Coefficient_t n) try {
+  const Constraint& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_OK(ppl_const_Constraint_t c) try {
+  return to_const(c)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Constraint(ppl_Linear_Expression_t* ple,
+                                          ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *ple = to_nonconst(new Linear_Expression(cc.expression()));
+  return 0;
+}
+CATCH_ALL
+
+/* Interface for Constraint_System. */
+
+int
+ppl_new_Constraint_System(ppl_Constraint_System_t* pcs) try {
+  *pcs = to_nonconst(new Constraint_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_zero_dim_empty(ppl_Constraint_System_t* pcs) try {
+  *pcs = to_nonconst(new
+                     Constraint_System(Constraint_System::zero_dim_empty()));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Constraint_System_from_Constraint(ppl_Constraint_System_t* pcs,
+                                          ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  *pcs = to_nonconst(new Constraint_System(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t* pcs, ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  *pcs = to_nonconst(new Constraint_System(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System(ppl_const_Constraint_System_t cs) try {
+  delete to_const(cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_from_Constraint_System
+(ppl_Constraint_System_t dst, ppl_const_Constraint_System_t src) try {
+  const Constraint_System& ssrc = *to_const(src);
+  Constraint_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_space_dimension(ppl_const_Constraint_System_t cs,
+                                      ppl_dimension_type* m) try {
+  *m = to_const(cs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_empty
+(ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  return ccs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_has_strict_inequalities
+(ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  return ccs.has_strict_inequalities() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_clear(ppl_Constraint_System_t cs) try {
+  to_nonconst(cs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_insert_Constraint(ppl_Constraint_System_t cs,
+                                        ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  Constraint_System& ccs = *to_nonconst(cs);
+  ccs.insert(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_OK(ppl_const_Constraint_System_t cs) try {
+  return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Constraint_System::const_iterator. */
+
+int
+ppl_new_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit) try {
+  *pcit = to_nonconst(new Constraint_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t* pcit,
+ ppl_const_Constraint_System_const_iterator_t cit)  try {
+  *pcit = to_nonconst(new Constraint_System::const_iterator(*to_const(cit)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Constraint_System_const_iterator
+(ppl_const_Constraint_System_const_iterator_t cit)
+  try {
+  delete to_const(cit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Constraint_System_const_iterator_from_Constraint_System_const_iterator
+(ppl_Constraint_System_const_iterator_t dst,
+ ppl_const_Constraint_System_const_iterator_t src) try {
+  const Constraint_System::const_iterator& ssrc = *to_const(src);
+  Constraint_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_begin(ppl_const_Constraint_System_t cs,
+                            ppl_Constraint_System_const_iterator_t cit) try {
+  const Constraint_System& ccs = *to_const(cs);
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_end(ppl_const_Constraint_System_t cs,
+                          ppl_Constraint_System_const_iterator_t cit) try {
+  const Constraint_System& ccs = *to_const(cs);
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_dereference
+(ppl_const_Constraint_System_const_iterator_t cit,
+ ppl_const_Constraint_t* pc) try {
+  const Constraint_System::const_iterator& ccit = *to_const(cit);
+  const Constraint& c = *ccit;
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_increment
+(ppl_Constraint_System_const_iterator_t cit) try {
+  Constraint_System::const_iterator& ccit = *to_nonconst(cit);
+  ++ccit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Constraint_System_const_iterator_equal_test
+(ppl_const_Constraint_System_const_iterator_t x,
+ ppl_const_Constraint_System_const_iterator_t y) try {
+  const Constraint_System::const_iterator& xx = *to_const(x);
+  const Constraint_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Generator. */
+
+int
+ppl_new_Generator(ppl_Generator_t* pg,
+                  ppl_const_Linear_Expression_t le,
+                  enum ppl_enum_Generator_Type t,
+                  ppl_const_Coefficient_t d) try {
+  Generator* ppg;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  switch (t) {
+  case PPL_GENERATOR_TYPE_POINT:
+    ppg = new Generator(Generator::point(lle, dd));
+    break;
+  case PPL_GENERATOR_TYPE_CLOSURE_POINT:
+    ppg = new Generator(Generator::closure_point(lle, dd));
+    break;
+  case PPL_GENERATOR_TYPE_RAY:
+    ppg = new Generator(Generator::ray(lle));
+    break;
+  case PPL_GENERATOR_TYPE_LINE:
+    ppg = new Generator(Generator::line(lle));
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Generator(pg, le, t, d): t invalid");
+  }
+  *pg = to_nonconst(ppg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_point(ppl_Generator_t* pg) try {
+  *pg = to_nonconst(new Generator(Generator::zero_dim_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_zero_dim_closure_point(ppl_Generator_t* pg) try {
+  *pg = to_nonconst(new Generator(Generator::zero_dim_closure_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_from_Generator(ppl_Generator_t* pg,
+                                 ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *pg = to_nonconst(new Generator(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator(ppl_const_Generator_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_from_Generator(ppl_Generator_t dst,
+                                      ppl_const_Generator_t src) try {
+  const Generator& ssrc = *to_const(src);
+  Generator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_space_dimension(ppl_const_Generator_t g,
+                              ppl_dimension_type* m) try {
+  *m = to_const(g)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_type(ppl_const_Generator_t g) try {
+  switch (to_const(g)->type()) {
+  case Generator::LINE:
+    return PPL_GENERATOR_TYPE_LINE;
+  case Generator::RAY:
+    return PPL_GENERATOR_TYPE_RAY;
+  case Generator::POINT:
+    return PPL_GENERATOR_TYPE_POINT;
+  case Generator::CLOSURE_POINT:
+    return PPL_GENERATOR_TYPE_CLOSURE_POINT;
+  }
+  PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+int
+ppl_Generator_coefficient(ppl_const_Generator_t g,
+                          ppl_dimension_type var,
+                          ppl_Coefficient_t n) try {
+  const Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_divisor(ppl_const_Generator_t g,
+                      ppl_Coefficient_t n) try {
+  const Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.divisor();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_OK(ppl_const_Generator_t g) try {
+  return to_const(g)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Generator(ppl_Linear_Expression_t* ple,
+                                         ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *ple = to_nonconst(new Linear_Expression(gg.expression()));
+  return 0;
+}
+CATCH_ALL
+
+/* Interface for Generator_System. */
+
+int
+ppl_new_Generator_System(ppl_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Generator_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_zero_dim_univ(ppl_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Generator_System(Generator_System::zero_dim_univ()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator(ppl_Generator_System_t* pgs,
+                              ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  *pgs = to_nonconst(new Generator_System(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_from_Generator_System
+(ppl_Generator_System_t* pgs, ppl_const_Generator_System_t gs) try {
+  const Generator_System& ggs = *to_const(gs);
+  *pgs = to_nonconst(new Generator_System(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System(ppl_const_Generator_System_t gs) try {
+  delete to_const(gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_from_Generator_System
+(ppl_Generator_System_t dst, ppl_const_Generator_System_t src) try {
+  const Generator_System& ssrc = *to_const(src);
+  Generator_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_space_dimension(ppl_const_Generator_System_t gs,
+                                     ppl_dimension_type* m) try {
+  *m = to_const(gs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_empty
+(ppl_const_Generator_System_t gs) try {
+  const Generator_System& cgs = *to_const(gs);
+  return cgs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_clear(ppl_Generator_System_t gs) try {
+  to_nonconst(gs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_insert_Generator(ppl_Generator_System_t gs,
+                                      ppl_const_Generator_t g) try {
+  const Generator& gg = *to_const(g);
+  Generator_System& ggs = *to_nonconst(gs);
+  ggs.insert(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_OK(ppl_const_Generator_System_t gs) try {
+  return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Generator_System::const_iterator. */
+
+int
+ppl_new_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit) try {
+  *pgit = to_nonconst(new Generator_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t* pgit,
+ ppl_const_Generator_System_const_iterator_t git)  try {
+  *pgit = to_nonconst(new Generator_System::const_iterator(*to_const(git)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Generator_System_const_iterator
+(ppl_const_Generator_System_const_iterator_t git) try {
+  delete to_const(git);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Generator_System_const_iterator_from_Generator_System_const_iterator
+(ppl_Generator_System_const_iterator_t dst,
+ ppl_const_Generator_System_const_iterator_t src) try {
+  const Generator_System::const_iterator& ssrc = *to_const(src);
+  Generator_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_begin(ppl_const_Generator_System_t gs,
+                           ppl_Generator_System_const_iterator_t git) try {
+  const Generator_System& ggs = *to_const(gs);
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_end(ppl_const_Generator_System_t gs,
+                         ppl_Generator_System_const_iterator_t git) try {
+  const Generator_System& ggs = *to_const(gs);
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_dereference
+(ppl_const_Generator_System_const_iterator_t git,
+ ppl_const_Generator_t* pg) try {
+  const Generator_System::const_iterator& ggit = *to_const(git);
+  const Generator& c = *ggit;
+  *pg = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_increment
+(ppl_Generator_System_const_iterator_t git) try {
+  Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ++ggit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Generator_System_const_iterator_equal_test
+(ppl_const_Generator_System_const_iterator_t x,
+ ppl_const_Generator_System_const_iterator_t y) try {
+  const Generator_System::const_iterator& xx = *to_const(x);
+  const Generator_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Congruence. */
+
+int
+ppl_new_Congruence(ppl_Congruence_t* pc,
+                   ppl_const_Linear_Expression_t le,
+                   ppl_const_Coefficient_t m) try {
+  Congruence* ppc;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& mm = *to_const(m);
+  ppc = new Congruence((lle %= 0) / mm);
+  *pc = to_nonconst(ppc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_zero_dim_false(ppl_Congruence_t* pc) try {
+  *pc = to_nonconst(new Congruence(Congruence::zero_dim_false()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_zero_dim_integrality(ppl_Congruence_t* pc) try {
+  *pc = to_nonconst(new Congruence(Congruence::zero_dim_integrality()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_from_Congruence(ppl_Congruence_t* pc,
+                                   ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  *pc = to_nonconst(new Congruence(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence(ppl_const_Congruence_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_from_Congruence(ppl_Congruence_t dst,
+                                      ppl_const_Congruence_t src) try {
+  const Congruence& ssrc = *to_const(src);
+  Congruence& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_space_dimension(ppl_const_Congruence_t c,
+                               ppl_dimension_type* m) try {
+  *m = to_const(c)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_coefficient(ppl_const_Congruence_t c,
+                           ppl_dimension_type var,
+                           ppl_Coefficient_t n) try {
+  const Congruence& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_inhomogeneous_term(ppl_const_Congruence_t c,
+                                  ppl_Coefficient_t n) try {
+  const Congruence& cc = *to_const(c);
+  Coefficient& nn = *to_nonconst(n);
+  nn = cc.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_modulus(ppl_const_Congruence_t c,
+                       ppl_Coefficient_t m) try {
+  const Congruence& cc = *to_const(c);
+  Coefficient& mm = *to_nonconst(m);
+  mm = cc.modulus();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_OK(ppl_const_Congruence_t c) try {
+  return to_const(c)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Linear_Expression_from_Congruence(ppl_Linear_Expression_t* ple,
+                                          ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  *ple = to_nonconst(new Linear_Expression(cc.expression()));
+  return 0;
+}
+CATCH_ALL
+
+/* Interface for Congruence_System. */
+
+int
+ppl_new_Congruence_System(ppl_Congruence_System_t* pcs) try {
+  *pcs = to_nonconst(new Congruence_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_zero_dim_empty(ppl_Congruence_System_t* pcs) try {
+  *pcs = to_nonconst(new
+                     Congruence_System(Congruence_System::zero_dim_empty()));
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_new_Congruence_System_from_Congruence(ppl_Congruence_System_t* pcs,
+                                          ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  *pcs = to_nonconst(new Congruence_System(cc));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_from_Congruence_System
+(ppl_Congruence_System_t* pcs, ppl_const_Congruence_System_t cs) try {
+  const Congruence_System& ccs = *to_const(cs);
+  *pcs = to_nonconst(new Congruence_System(ccs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence_System(ppl_const_Congruence_System_t cs) try {
+  delete to_const(cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_System_from_Congruence_System
+(ppl_Congruence_System_t dst, ppl_const_Congruence_System_t src) try {
+  const Congruence_System& ssrc = *to_const(src);
+  Congruence_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_space_dimension(ppl_const_Congruence_System_t cs,
+                                      ppl_dimension_type* m) try {
+  *m = to_const(cs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_empty
+(ppl_const_Congruence_System_t cs) try {
+  const Congruence_System& ccs = *to_const(cs);
+  return ccs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_clear(ppl_Congruence_System_t cs) try {
+  to_nonconst(cs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_insert_Congruence(ppl_Congruence_System_t cs,
+                                        ppl_const_Congruence_t c) try {
+  const Congruence& cc = *to_const(c);
+  Congruence_System& ccs = *to_nonconst(cs);
+  ccs.insert(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_OK(ppl_const_Congruence_System_t cs) try {
+  return to_const(cs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Congruence_System::const_iterator. */
+
+int
+ppl_new_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t* pcit) try {
+  *pcit = to_nonconst(new Congruence_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t* pcit,
+ ppl_const_Congruence_System_const_iterator_t cit)  try {
+  *pcit = to_nonconst(new Congruence_System::const_iterator(*to_const(cit)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Congruence_System_const_iterator
+(ppl_const_Congruence_System_const_iterator_t cit)
+  try {
+  delete to_const(cit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Congruence_System_const_iterator_from_Congruence_System_const_iterator
+(ppl_Congruence_System_const_iterator_t dst,
+ ppl_const_Congruence_System_const_iterator_t src) try {
+  const Congruence_System::const_iterator& ssrc = *to_const(src);
+  Congruence_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_begin(ppl_const_Congruence_System_t cs,
+                            ppl_Congruence_System_const_iterator_t cit) try {
+  const Congruence_System& ccs = *to_const(cs);
+  Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_end(ppl_const_Congruence_System_t cs,
+                          ppl_Congruence_System_const_iterator_t cit) try {
+  const Congruence_System& ccs = *to_const(cs);
+  Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+  ccit = ccs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_dereference
+(ppl_const_Congruence_System_const_iterator_t cit,
+ ppl_const_Congruence_t* pc) try {
+  const Congruence_System::const_iterator& ccit = *to_const(cit);
+  const Congruence& c = *ccit;
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_increment
+(ppl_Congruence_System_const_iterator_t cit) try {
+  Congruence_System::const_iterator& ccit = *to_nonconst(cit);
+  ++ccit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Congruence_System_const_iterator_equal_test
+(ppl_const_Congruence_System_const_iterator_t x,
+ ppl_const_Congruence_System_const_iterator_t y) try {
+  const Congruence_System::const_iterator& xx = *to_const(x);
+  const Congruence_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Grid_Generator. */
+
+int
+ppl_new_Grid_Generator(ppl_Grid_Generator_t* pg,
+                       ppl_const_Linear_Expression_t le,
+                       enum ppl_enum_Grid_Generator_Type t,
+                       ppl_const_Coefficient_t d) try {
+  Grid_Generator* ppg;
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  switch (t) {
+  case PPL_GRID_GENERATOR_TYPE_LINE:
+    ppg = new Grid_Generator(Grid_Generator::grid_line(lle));
+    break;
+  case PPL_GRID_GENERATOR_TYPE_PARAMETER:
+    ppg = new Grid_Generator(Grid_Generator::parameter(lle));
+    break;
+  case PPL_GRID_GENERATOR_TYPE_POINT:
+    ppg = new Grid_Generator(Grid_Generator::grid_point(lle, dd));
+    break;
+  default:
+    throw std::invalid_argument("ppl_new_Grid_Generator(pg, le, t, d): "
+                                "t invalid");
+  }
+  *pg = to_nonconst(ppg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_zero_dim_point(ppl_Grid_Generator_t* pg) try {
+  *pg = to_nonconst(new Grid_Generator(Grid_Generator::zero_dim_point()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_from_Grid_Generator(ppl_Grid_Generator_t* pg,
+                                           ppl_const_Grid_Generator_t g) try {
+  const Grid_Generator& gg = *to_const(g);
+  *pg = to_nonconst(new Grid_Generator(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator(ppl_const_Grid_Generator_t le) try {
+  delete to_const(le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_from_Grid_Generator
+(ppl_Grid_Generator_t dst,
+ ppl_const_Grid_Generator_t src) try {
+  const Grid_Generator& ssrc = *to_const(src);
+  Grid_Generator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_space_dimension(ppl_const_Grid_Generator_t g,
+                                   ppl_dimension_type* m) try {
+  *m = to_const(g)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_type(ppl_const_Grid_Generator_t g) try {
+  switch (to_const(g)->type()) {
+  case Grid_Generator::LINE:
+    return PPL_GRID_GENERATOR_TYPE_LINE;
+  case Grid_Generator::PARAMETER:
+    return PPL_GRID_GENERATOR_TYPE_PARAMETER;
+  case Grid_Generator::POINT:
+    return PPL_GRID_GENERATOR_TYPE_POINT;
+  }
+  PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_coefficient(ppl_const_Grid_Generator_t g,
+                               ppl_dimension_type var,
+                               ppl_Coefficient_t n) try {
+  const Grid_Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_divisor(ppl_const_Grid_Generator_t g,
+                           ppl_Coefficient_t n) try {
+  const Grid_Generator& gg = *to_const(g);
+  Coefficient& nn = *to_nonconst(n);
+  nn = gg.divisor();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_OK(ppl_const_Grid_Generator_t g) try {
+  return to_const(g)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+// FIXME: to be restored soon.
+// int
+// ppl_new_Linear_Expression_from_Grid_Generator
+// (ppl_Linear_Expression_t* ple,
+//  ppl_const_Grid_Generator_t g) try {
+//   const Grid_Generator& gg = *to_const(g);
+//   *ple = to_nonconst(new Linear_Expression(gg));
+//   return 0;
+// }
+// CATCH_ALL
+
+/* Interface for Grid_Generator_System. */
+
+int
+ppl_new_Grid_Generator_System(ppl_Grid_Generator_System_t* pgs) try {
+  *pgs = to_nonconst(new Grid_Generator_System());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_zero_dim_univ
+(ppl_Grid_Generator_System_t* pgs) try {
+  *pgs = to_nonconst
+    (new Grid_Generator_System(Grid_Generator_System::zero_dim_univ()));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator
+(ppl_Grid_Generator_System_t* pgs, ppl_const_Grid_Generator_t g) try {
+  const Grid_Generator& gg = *to_const(g);
+  *pgs = to_nonconst(new Grid_Generator_System(gg));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_from_Grid_Generator_System
+(ppl_Grid_Generator_System_t* pgs, ppl_const_Grid_Generator_System_t gs) try {
+  const Grid_Generator_System& ggs = *to_const(gs);
+  *pgs = to_nonconst(new Grid_Generator_System(ggs));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator_System(ppl_const_Grid_Generator_System_t gs) try {
+  delete to_const(gs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_System_from_Grid_Generator_System
+(ppl_Grid_Generator_System_t dst, ppl_const_Grid_Generator_System_t src) try {
+  const Grid_Generator_System& ssrc = *to_const(src);
+  Grid_Generator_System& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_space_dimension(ppl_const_Grid_Generator_System_t gs,
+                                          ppl_dimension_type* m) try {
+  *m = to_const(gs)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_empty
+(ppl_const_Grid_Generator_System_t gs) try {
+  const Grid_Generator_System& cgs = *to_const(gs);
+  return cgs.empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_clear(ppl_Grid_Generator_System_t gs) try {
+  to_nonconst(gs)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_insert_Grid_Generator
+(ppl_Grid_Generator_System_t gs,
+ ppl_const_Grid_Generator_t g) try {
+  const Grid_Generator& gg = *to_const(g);
+  Grid_Generator_System& ggs = *to_nonconst(gs);
+  ggs.insert(gg);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_OK(ppl_const_Grid_Generator_System_t gs) try {
+  return to_const(gs)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+/* Interface for Grid_Generator_System::const_iterator. */
+
+int
+ppl_new_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t* pgit) try {
+  *pgit = to_nonconst(new Grid_Generator_System::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t* pgit,
+ ppl_const_Grid_Generator_System_const_iterator_t git)  try {
+  *pgit = to_nonconst
+    (new Grid_Generator_System::const_iterator(*to_const(git)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Grid_Generator_System_const_iterator
+(ppl_const_Grid_Generator_System_const_iterator_t git) try {
+  delete to_const(git);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Grid_Generator_System_const_iterator_from_Grid_Generator_System_const_iterator
+(ppl_Grid_Generator_System_const_iterator_t dst,
+ ppl_const_Grid_Generator_System_const_iterator_t src) try {
+  const Grid_Generator_System::const_iterator& ssrc = *to_const(src);
+  Grid_Generator_System::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_begin
+(ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git) try {
+  const Grid_Generator_System& ggs = *to_const(gs);
+  Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_end
+(ppl_const_Grid_Generator_System_t gs,
+ ppl_Grid_Generator_System_const_iterator_t git) try {
+  const Grid_Generator_System& ggs = *to_const(gs);
+  Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ggit = ggs.end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_dereference
+(ppl_const_Grid_Generator_System_const_iterator_t git,
+ ppl_const_Grid_Generator_t* pg) try {
+  const Grid_Generator_System::const_iterator& ggit = *to_const(git);
+  const Grid_Generator& g = *ggit;
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_increment
+(ppl_Grid_Generator_System_const_iterator_t git) try {
+  Grid_Generator_System::const_iterator& ggit = *to_nonconst(git);
+  ++ggit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Grid_Generator_System_const_iterator_equal_test
+(ppl_const_Grid_Generator_System_const_iterator_t x,
+ ppl_const_Grid_Generator_System_const_iterator_t y) try {
+  const Grid_Generator_System::const_iterator& xx = *to_const(x);
+  const Grid_Generator_System::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem_from_space_dimension(ppl_MIP_Problem_t* pmip,
+                                         ppl_dimension_type d) try {
+  *pmip = to_nonconst(new MIP_Problem(d));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem(ppl_MIP_Problem_t* pmip,
+                    ppl_dimension_type d,
+                    ppl_const_Constraint_System_t cs,
+                    ppl_const_Linear_Expression_t le, int m) try {
+  const Constraint_System& ccs = *to_const(cs);
+  const Linear_Expression& lle = *to_const(le);
+  Optimization_Mode mm = (m == PPL_OPTIMIZATION_MODE_MINIMIZATION)
+    ? MINIMIZATION : MAXIMIZATION;
+  *pmip = to_nonconst(new MIP_Problem(d, ccs, lle, mm));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_MIP_Problem_from_MIP_Problem(ppl_MIP_Problem_t* pmip,
+                                     ppl_const_MIP_Problem_t mip) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  *pmip = to_nonconst(new MIP_Problem(mmip));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_MIP_Problem(ppl_const_MIP_Problem_t mip) try {
+  delete to_const(mip);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_MIP_Problem_from_MIP_Problem(ppl_MIP_Problem_t dst,
+                                        ppl_const_MIP_Problem_t src) try {
+  const MIP_Problem& ssrc = *to_const(src);
+  MIP_Problem& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_space_dimension(ppl_const_MIP_Problem_t mip,
+                                ppl_dimension_type* m) try {
+  *m = to_const(mip)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_number_of_integer_space_dimensions(ppl_const_MIP_Problem_t mip,
+                                                   ppl_dimension_type* m) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  *m = mmip.integer_space_dimensions().size();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_integer_space_dimensions(ppl_const_MIP_Problem_t mip,
+                                         ppl_dimension_type ds[]) try {
+  const Variables_Set& vars = to_const(mip)->integer_space_dimensions();
+  ppl_dimension_type* ds_i = ds;
+  for (Variables_Set::const_iterator v_iter = vars.begin(),
+         v_end = vars.end(); v_iter != v_end; ++v_iter, ++ds_i)
+    *ds_i = *v_iter;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_number_of_constraints(ppl_const_MIP_Problem_t mip,
+                                      ppl_dimension_type* m) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  *m = static_cast<ppl_dimension_type>(mmip.constraints_end() - mmip.constraints_begin());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_constraint_at_index(ppl_const_MIP_Problem_t mip,
+                                    ppl_dimension_type i,
+                                    ppl_const_Constraint_t* pc) try {
+#ifndef NDEBUG
+  ppl_dimension_type num_constraints;
+  ppl_MIP_Problem_number_of_constraints(mip, &num_constraints);
+  assert(i < num_constraints);
+#endif
+  const MIP_Problem& mmip = *to_const(mip);
+  const Constraint& c = *(mmip.constraints_begin() + i);
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_objective_function(ppl_const_MIP_Problem_t mip,
+                                   ppl_const_Linear_Expression_t* ple) try {
+  const Linear_Expression& le = to_const(mip)->objective_function();
+  *ple = to_const(&le);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimization_mode(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->optimization_mode();
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_clear(ppl_MIP_Problem_t mip) try {
+  to_nonconst(mip)->clear();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_space_dimensions_and_embed(ppl_MIP_Problem_t mip,
+                                               ppl_dimension_type d) try {
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.add_space_dimensions_and_embed(d);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_to_integer_space_dimensions(ppl_MIP_Problem_t mip,
+                                                ppl_dimension_type ds[],
+                                                size_t n) try {
+  MIP_Problem& mmip = *to_nonconst(mip);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  mmip.add_to_integer_space_dimensions(vars);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_constraint(ppl_MIP_Problem_t mip,
+                               ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.add_constraint(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_add_constraints(ppl_MIP_Problem_t mip,
+                                ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.add_constraints(ccs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_objective_function(ppl_MIP_Problem_t mip,
+                                       ppl_const_Linear_Expression_t le) try {
+  const Linear_Expression& lle = *to_const(le);
+  MIP_Problem& mmip = *to_nonconst(mip);
+  mmip.set_objective_function(lle);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_optimization_mode(ppl_MIP_Problem_t mip, int mode) try {
+  MIP_Problem& mmip = *to_nonconst(mip);
+  Optimization_Mode m = (mode == PPL_OPTIMIZATION_MODE_MINIMIZATION)
+    ? MINIMIZATION : MAXIMIZATION;
+  mmip.set_optimization_mode(m);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_is_satisfiable(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_solve(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->solve();
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_evaluate_objective_function(ppl_const_MIP_Problem_t mip,
+                                            ppl_const_Generator_t g,
+                                            ppl_Coefficient_t num,
+                                            ppl_Coefficient_t den) try {
+  const MIP_Problem& mmip = *to_const(mip);
+  const Generator& gg = *to_const(g);
+  Coefficient& nnum = *to_nonconst(num);
+  Coefficient& dden = *to_nonconst(den);
+  mmip.evaluate_objective_function(gg, nnum, dden);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_feasible_point(ppl_const_MIP_Problem_t mip,
+                               ppl_const_Generator_t* pg) try {
+  const Generator& g = to_const(mip)->feasible_point();
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimizing_point(ppl_const_MIP_Problem_t mip,
+                                 ppl_const_Generator_t* pg) try {
+  const Generator& g = to_const(mip)->optimizing_point();
+  *pg = to_const(&g);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_optimal_value(ppl_const_MIP_Problem_t mip,
+                              ppl_Coefficient_t num,
+                              ppl_Coefficient_t den) try {
+  Coefficient& nnum = *to_nonconst(num);
+  Coefficient& dden = *to_nonconst(den);
+  to_const(mip)->optimal_value(nnum, dden);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_get_control_parameter(ppl_const_MIP_Problem_t mip,
+                                      int name) try {
+  MIP_Problem::Control_Parameter_Name n
+    = static_cast<MIP_Problem::Control_Parameter_Name>(name);
+  return to_const(mip)->get_control_parameter(n);
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_set_control_parameter(ppl_MIP_Problem_t mip,
+                                      int value) try {
+  MIP_Problem::Control_Parameter_Value v
+    = static_cast<MIP_Problem::Control_Parameter_Value>(value);
+  to_nonconst(mip)->set_control_parameter(v);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_OK(ppl_const_MIP_Problem_t mip) try {
+  return to_const(mip)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_total_memory_in_bytes(ppl_const_MIP_Problem_t mip,
+                                      size_t* sz) try {
+  *sz = to_const(mip)->total_memory_in_bytes();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_MIP_Problem_external_memory_in_bytes(ppl_const_MIP_Problem_t mip,
+                                         size_t* sz) try {
+  *sz = to_const(mip)->external_memory_in_bytes();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_PIP_Problem_from_space_dimension(ppl_PIP_Problem_t* ppip,
+                                         ppl_dimension_type d) try {
+  *ppip = to_nonconst(new PIP_Problem(d));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_PIP_Problem_from_PIP_Problem(ppl_PIP_Problem_t* dpip,
+                                     ppl_const_PIP_Problem_t pip) try {
+  const PIP_Problem& spip = *to_const(pip);
+  *dpip = to_nonconst(new PIP_Problem(spip));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_PIP_Problem_from_constraints
+(ppl_PIP_Problem_t* ppip,
+ ppl_dimension_type d,
+ ppl_Constraint_System_const_iterator_t first,
+ ppl_Constraint_System_const_iterator_t last,
+ size_t n,
+ ppl_dimension_type ds[]) try {
+  Variables_Set p_vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    p_vars.insert(ds[i]);
+  *ppip = to_nonconst(new PIP_Problem(d, *to_const(first),
+                                      *to_const(last), p_vars));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_PIP_Problem_from_PIP_Problem(ppl_PIP_Problem_t dst,
+                                        ppl_const_PIP_Problem_t src) try {
+  const PIP_Problem& ssrc = *to_const(src);
+  PIP_Problem& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_PIP_Problem(ppl_const_PIP_Problem_t pip) try {
+  delete to_const(pip);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_space_dimension(ppl_const_PIP_Problem_t pip,
+                                ppl_dimension_type* m) try {
+  *m = to_const(pip)->space_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_number_of_parameter_space_dimensions
+(ppl_const_PIP_Problem_t pip, ppl_dimension_type* m) try {
+  const PIP_Problem& ppip = *to_const(pip);
+  *m = ppip.parameter_space_dimensions().size();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_parameter_space_dimensions(ppl_const_PIP_Problem_t pip,
+                                           ppl_dimension_type ds[]) try {
+  const Variables_Set& vars = to_const(pip)->parameter_space_dimensions();
+  ppl_dimension_type* ds_i = ds;
+  for (Variables_Set::const_iterator v_iter = vars.begin(),
+         v_end = vars.end(); v_iter != v_end; ++v_iter, ++ds_i)
+    *ds_i = *v_iter;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_number_of_constraints(ppl_const_PIP_Problem_t pip,
+                                      ppl_dimension_type* m) try {
+  const PIP_Problem& ppip = *to_const(pip);
+  *m = static_cast<ppl_dimension_type>(ppip.constraints_end() - ppip.constraints_begin());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_constraint_at_index(ppl_const_PIP_Problem_t pip,
+                                    ppl_dimension_type i,
+                                    ppl_const_Constraint_t* pc) try {
+#ifndef NDEBUG
+  ppl_dimension_type num_constraints;
+  ppl_PIP_Problem_number_of_constraints(pip, &num_constraints);
+  assert(i < num_constraints);
+#endif
+  const PIP_Problem& ppip = *to_const(pip);
+  const Constraint& c = *(ppip.constraints_begin() + i);
+  *pc = to_const(&c);
+  return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_clear(ppl_PIP_Problem_t pip) try {
+  to_nonconst(pip)->clear();
+  return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_add_space_dimensions_and_embed(ppl_PIP_Problem_t pip,
+                                               ppl_dimension_type pip_vars,
+                                               ppl_dimension_type pip_params)
+  try {
+  PIP_Problem& spip = *to_nonconst(pip);
+  spip.add_space_dimensions_and_embed(pip_vars,pip_params);
+  return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_add_to_parameter_space_dimensions(ppl_PIP_Problem_t pip,
+                                                  ppl_dimension_type ds[],
+                                                  size_t n) try {
+  PIP_Problem& ppip = *to_nonconst(pip);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  ppip.add_to_parameter_space_dimensions(vars);
+  return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_add_constraint(ppl_PIP_Problem_t pip,
+                               ppl_const_Constraint_t c) try {
+  const Constraint& cc = *to_const(c);
+  PIP_Problem& ppip = *to_nonconst(pip);
+  ppip.add_constraint(cc);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_add_constraints(ppl_PIP_Problem_t pip,
+                                ppl_const_Constraint_System_t cs) try {
+  const Constraint_System& ccs = *to_const(cs);
+  PIP_Problem& ppip = *to_nonconst(pip);
+  ppip.add_constraints(ccs);
+  return 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_is_satisfiable(ppl_const_PIP_Problem_t pip) try {
+  return to_const(pip)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+int
+ppl_PIP_Problem_solve(ppl_const_PIP_Problem_t pip) try {
+  return to_const(pip)->solve();
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_solution(ppl_const_PIP_Problem_t pip,
+                         ppl_const_PIP_Tree_Node_t* ppip_tree) try {
+  *ppip_tree = to_const(to_const(pip)->solution());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_optimizing_solution(ppl_const_PIP_Problem_t pip,
+                                    ppl_const_PIP_Tree_Node_t* ppip_tree) try {
+  *ppip_tree = to_const(to_const(pip)->optimizing_solution());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_OK(ppl_const_PIP_Problem_t pip) try {
+  return to_const(pip)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_get_control_parameter(ppl_const_PIP_Problem_t pip,
+                                      int name) try {
+  PIP_Problem::Control_Parameter_Name n
+    = static_cast<PIP_Problem::Control_Parameter_Name>(name);
+  return to_const(pip)->get_control_parameter(n);
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_set_control_parameter(ppl_PIP_Problem_t pip,
+                                      int value) try {
+  PIP_Problem::Control_Parameter_Value v
+    = static_cast<PIP_Problem::Control_Parameter_Value>(value);
+  to_nonconst(pip)->set_control_parameter(v);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_get_big_parameter_dimension(ppl_const_PIP_Problem_t pip,
+                                            ppl_dimension_type* pd) try {
+  *pd = to_const(pip)->get_big_parameter_dimension();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_set_big_parameter_dimension(ppl_PIP_Problem_t pip,
+                                            ppl_dimension_type d) try {
+  to_nonconst(pip)->set_big_parameter_dimension(d);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_total_memory_in_bytes(ppl_const_PIP_Problem_t pip,
+                                      size_t* sz) try {
+  *sz = to_const(pip)->total_memory_in_bytes();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Problem_external_memory_in_bytes(ppl_const_PIP_Problem_t pip,
+                                         size_t* sz) try {
+  *sz = to_const(pip)->external_memory_in_bytes();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_as_solution(ppl_const_PIP_Tree_Node_t spip_tree,
+                              ppl_const_PIP_Solution_Node_t* dpip_tree) try {
+  *dpip_tree = to_const(to_const(spip_tree)->as_solution());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_as_decision(ppl_const_PIP_Tree_Node_t spip_tree,
+                              ppl_const_PIP_Decision_Node_t* dpip_tree) try {
+  *dpip_tree = to_const(to_const(spip_tree)->as_decision());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_get_constraints(ppl_const_PIP_Tree_Node_t pip_tree,
+                                  ppl_const_Constraint_System_t* pcs) try {
+  const PIP_Tree_Node& spip_tree = *to_const(pip_tree);
+  const Constraint_System& cs = spip_tree.constraints();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_OK(ppl_const_PIP_Tree_Node_t pip_tree) try {
+  return to_const(pip_tree)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_number_of_artificials(ppl_const_PIP_Tree_Node_t pip_tree,
+                                        ppl_dimension_type* m) try {
+  const PIP_Tree_Node& node = *to_const(pip_tree);
+  *m = node.art_parameter_count();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_begin
+(ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit) try {
+  PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator& spit
+    = *to_nonconst(pit);
+  spit = to_const(pip_tree)->art_parameter_begin();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Tree_Node_end
+(ppl_const_PIP_Tree_Node_t pip_tree,
+ ppl_Artificial_Parameter_Sequence_const_iterator_t pit) try {
+  PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator& spit
+    = *to_nonconst(pit);
+  spit = to_const(pip_tree)->art_parameter_end();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Solution_Node_get_parametric_values
+  (ppl_const_PIP_Solution_Node_t pip_sol,
+   ppl_dimension_type var,
+   ppl_const_Linear_Expression_t* le) try {
+  const PIP_Solution_Node& spip_sol = *to_const(pip_sol);
+  const Linear_Expression& lle = spip_sol.parametric_values(Variable(var));
+  *le = to_const(&lle);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Solution_Node_OK(ppl_const_PIP_Solution_Node_t pip_sol) try {
+  return to_const(pip_sol)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Decision_Node_OK(ppl_const_PIP_Decision_Node_t pip_dec) try {
+  return to_const(pip_dec)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_PIP_Decision_Node_get_child_node(ppl_const_PIP_Decision_Node_t pip_dec,
+                                     int b,
+                                     ppl_const_PIP_Tree_Node_t* pip_tree) try {
+  *pip_tree = to_const(to_const(pip_dec)->child_node(b != 0));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_get_Linear_Expression
+(ppl_const_Artificial_Parameter_t ap,
+ ppl_Linear_Expression_t le) try {
+  const Artificial_Parameter& sap = *to_const(ap);
+  Linear_Expression& lle = *to_nonconst(le);
+  lle = sap;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_coefficient(ppl_const_Artificial_Parameter_t ap,
+                                     ppl_dimension_type var,
+                                     ppl_Coefficient_t n) try {
+  const Artificial_Parameter& sap = *to_const(ap);
+  Coefficient& nn = *to_nonconst(n);
+  nn = sap.coefficient(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_inhomogeneous_term
+(ppl_const_Artificial_Parameter_t ap, ppl_Coefficient_t n) try {
+  const Artificial_Parameter& sap = *to_const(ap);
+  Coefficient& nn = *to_nonconst(n);
+  nn = sap.inhomogeneous_term();
+  return 0;
+}
+CATCH_ALL
+
+
+int
+ppl_Artificial_Parameter_denominator(ppl_const_Artificial_Parameter_t ap,
+                                     ppl_Coefficient_t n) try {
+  const Artificial_Parameter& sap = *to_const(ap);
+  Coefficient& nn = *to_nonconst(n);
+  nn = sap.denominator();
+  return 0;
+}
+CATCH_ALL
+
+
+/* Interface for Artificial_Parameter_Sequence::const_iterator. */
+
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator
+(ppl_Artificial_Parameter_Sequence_const_iterator_t* papit) try {
+  *papit = to_nonconst(new Artificial_Parameter_Sequence::const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+(ppl_Artificial_Parameter_Sequence_const_iterator_t* papit,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit)  try {
+  *papit = to_nonconst(new Artificial_Parameter_Sequence::const_iterator(*to_const(apit)));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Artificial_Parameter_Sequence_const_iterator
+(ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit)
+  try {
+  delete to_const(apit);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_Artificial_Parameter_Sequence_const_iterator_from_Artificial_Parameter_Sequence_const_iterator
+(ppl_Artificial_Parameter_Sequence_const_iterator_t dst,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t src) try {
+  const Artificial_Parameter_Sequence::const_iterator& ssrc = *to_const(src);
+  Artificial_Parameter_Sequence::const_iterator& ddst = *to_nonconst(dst);
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_dereference
+(ppl_const_Artificial_Parameter_Sequence_const_iterator_t apit,
+ ppl_const_Artificial_Parameter_t* pap) try {
+  const Artificial_Parameter_Sequence::const_iterator& papit = *to_const(apit);
+  const Artificial_Parameter& ap = *papit;
+  *pap = to_const(&ap);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_increment
+(ppl_Artificial_Parameter_Sequence_const_iterator_t apit) try {
+  Artificial_Parameter_Sequence::const_iterator& papit = *to_nonconst(apit);
+  ++papit;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+(ppl_const_Artificial_Parameter_Sequence_const_iterator_t x,
+ ppl_const_Artificial_Parameter_Sequence_const_iterator_t y) try {
+  const Artificial_Parameter_Sequence::const_iterator& xx = *to_const(x);
+  const Artificial_Parameter_Sequence::const_iterator& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_io_print_variable(ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0 || puts(b) < 0)
+    return PPL_STDIO_ERROR;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_fprint_variable(FILE* stream, ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0 || fputs(b, stream) < 0)
+    return PPL_STDIO_ERROR;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_asprint_variable(char** strp, ppl_dimension_type var) try {
+  const char* b = c_variable_output_function(var);
+  if (b == 0)
+    return PPL_STDIO_ERROR;
+  *strp = strdup(b);
+  if (*strp == 0)
+    return PPL_ERROR_OUT_OF_MEMORY;
+  return 0;
+}
+CATCH_ALL
+
+/* No ascii dump for Coefficient. */
+DEFINE_PRINT_FUNCTIONS(Coefficient)
+
+DEFINE_OUTPUT_FUNCTIONS(Linear_Expression)
+
+DEFINE_OUTPUT_FUNCTIONS(Constraint)
+
+DEFINE_OUTPUT_FUNCTIONS(Constraint_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Generator)
+
+DEFINE_OUTPUT_FUNCTIONS(Generator_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Congruence)
+
+DEFINE_OUTPUT_FUNCTIONS(Congruence_System)
+
+DEFINE_OUTPUT_FUNCTIONS(Grid_Generator)
+
+DEFINE_OUTPUT_FUNCTIONS(Grid_Generator_System)
+
+DEFINE_OUTPUT_FUNCTIONS(MIP_Problem)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Problem)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Tree_Node)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Decision_Node)
+
+DEFINE_OUTPUT_FUNCTIONS(PIP_Solution_Node)
+
+DEFINE_OUTPUT_FUNCTIONS(Artificial_Parameter)
+
+char*
+ppl_io_wrap_string(const char* src,
+                   unsigned indent_depth,
+                   unsigned preferred_first_line_length,
+                   unsigned preferred_line_length) {
+  using namespace IO_Operators;
+  return strdup(wrap_string(src, indent_depth,
+                            preferred_first_line_length,
+                            preferred_line_length).c_str());
+}
+
+int
+ppl_io_set_variable_output_function(ppl_io_variable_output_function_type* p)
+try {
+  c_variable_output_function = p;
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_io_get_variable_output_function(ppl_io_variable_output_function_type** pp)
+try {
+  *pp = c_variable_output_function;
+  return 0;
+}
+CATCH_ALL
diff --git a/interfaces/C/ppl_c_implementation_common_defs.hh b/interfaces/C/ppl_c_implementation_common_defs.hh
new file mode 100644
index 0000000..cc4d36e
--- /dev/null
+++ b/interfaces/C/ppl_c_implementation_common_defs.hh
@@ -0,0 +1,259 @@
+/* Implementation of the C interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_implementation_common_defs_hh
+#define PPL_ppl_c_implementation_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+#include "ppl_c.h"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+extern "C" typedef void
+(*error_handler_type)(enum ppl_enum_error_code code, const char* description);
+
+extern error_handler_type user_error_handler;
+
+void notify_error(enum ppl_enum_error_code code, const char* description);
+
+Relation_Symbol relation_symbol(enum ppl_enum_Constraint_Type t);
+
+Bounded_Integer_Type_Width
+bounded_integer_type_width(enum ppl_enum_Bounded_Integer_Type_Width w);
+
+Bounded_Integer_Type_Representation
+bounded_integer_type_representation(enum ppl_enum_Bounded_Integer_Type_Representation r);
+
+/*! \brief
+  A class to wrap an array of fixed length into a partial function interface
+  suitable for the map_space_dimension() methods.
+*/
+class Array_Partial_Function_Wrapper {
+public:
+  /*! \brief
+    Construct a partial function wrapping the first \p n positions of
+    \p v.
+  */
+  Array_Partial_Function_Wrapper(dimension_type* v, size_t n);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+  */
+  bool has_empty_codomain() const;
+
+  /*! \brief
+    Returns the maximum value that belongs to the codomain
+    of the partial function.
+  */
+  dimension_type max_in_codomain() const;
+
+  /*! \brief
+    Assigns to \p j the value associated to \p i by \p *this, if any.
+
+    Let \f$f\f$ be the function represented by \p *this and \f$k\f$ be
+    the value of \p i.  If \f$f\f$ is defined in \f$k\f$, then
+    \f$f(k)\f$ is assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+  */
+  bool maps(dimension_type i, dimension_type& j) const;
+
+private:
+  //! Holds the vector implementing the map.
+  dimension_type* vec;
+
+  //! Holds the size of \p vec.
+  size_t vec_size;
+
+  //! Cache for computing the maximum dimension in the codomain.
+  mutable dimension_type max_in_codomain_;
+
+  //! Cache for computing emptiness:
+  //! -1 if we still don't know, 0 if not empty, 1 if empty.
+  mutable int empty;
+};
+
+class timeout_exception : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+void reset_timeout();
+
+class deterministic_timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+void reset_deterministic_timeout();
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+#define CATCH_STD_EXCEPTION(exception, code) \
+catch (const std::exception& e) {            \
+  notify_error(code, e.what()); \
+  return code; \
+}
+
+#define CATCH_ALL \
+CATCH_STD_EXCEPTION(bad_alloc, PPL_ERROR_OUT_OF_MEMORY) \
+CATCH_STD_EXCEPTION(invalid_argument, PPL_ERROR_INVALID_ARGUMENT) \
+CATCH_STD_EXCEPTION(domain_error, PPL_ERROR_DOMAIN_ERROR) \
+CATCH_STD_EXCEPTION(length_error, PPL_ERROR_LENGTH_ERROR) \
+CATCH_STD_EXCEPTION(logic_error, PPL_ERROR_LOGIC_ERROR) \
+CATCH_STD_EXCEPTION(overflow_error, PPL_ARITHMETIC_OVERFLOW) \
+CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \
+CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \
+catch (timeout_exception&) { \
+  reset_timeout(); \
+  notify_error(PPL_TIMEOUT_EXCEPTION, "PPL timeout expired"); \
+  return PPL_TIMEOUT_EXCEPTION; \
+} \
+catch (deterministic_timeout_exception&) { \
+  reset_deterministic_timeout(); \
+  notify_error(PPL_TIMEOUT_EXCEPTION, "PPL deterministic timeout expired"); \
+  return PPL_TIMEOUT_EXCEPTION; \
+} \
+catch (...) { \
+  notify_error(PPL_ERROR_UNEXPECTED_ERROR, \
+               "completely unexpected error: a bug in the PPL"); \
+  return PPL_ERROR_UNEXPECTED_ERROR; \
+}
+
+#define DECLARE_CONVERSIONS(Type, CPP_Type)             \
+  inline const CPP_Type*                                \
+  to_const(ppl_const_##Type##_t x) {                    \
+    return reinterpret_cast<const CPP_Type*>(x);        \
+  }                                                     \
+                                                        \
+  inline CPP_Type*                                      \
+  to_nonconst(ppl_##Type##_t x) {                       \
+    return reinterpret_cast<CPP_Type*>(x);              \
+  }                                                     \
+                                                        \
+  inline ppl_const_##Type##_t                           \
+  to_const(const CPP_Type* x) {                         \
+    return reinterpret_cast<ppl_const_##Type##_t>(x);   \
+  }                                                     \
+                                                        \
+  inline ppl_##Type##_t                                 \
+  to_nonconst(CPP_Type* x) {                            \
+    return reinterpret_cast<ppl_##Type##_t>(x);         \
+  }
+
+#define DEFINE_PRINT_FUNCTIONS(Type)                                    \
+  int                                                                   \
+  ppl_io_print_##Type(ppl_const_##Type##_t x) try {                     \
+    using namespace IO_Operators;                                       \
+    stdiobuf sb(stdout);                                                \
+    std::ostream os(&sb);                                               \
+    os << *to_const(x);                                                 \
+    if (!os)                                                            \
+      return PPL_STDIO_ERROR;                                           \
+    return 0;                                                           \
+  }                                                                     \
+  CATCH_ALL                                                             \
+                                                                        \
+  int                                                                   \
+  ppl_io_fprint_##Type(FILE* file, ppl_const_##Type##_t x) try {        \
+    using namespace IO_Operators;                                       \
+    stdiobuf sb(file);                                                  \
+    std::ostream os(&sb);                                               \
+    os << *to_const(x);                                                 \
+    if (!os)                                                            \
+      return PPL_STDIO_ERROR;                                           \
+    return 0;                                                           \
+  }                                                                     \
+  CATCH_ALL                                                             \
+                                                                        \
+  int                                                                   \
+  ppl_io_asprint_##Type(char** strp, ppl_const_##Type##_t x) try {      \
+    using namespace IO_Operators;                                       \
+    std::ostringstream os;                                              \
+    os << *to_const(x);                                                 \
+    if (!os)                                                            \
+      return PPL_STDIO_ERROR;                                           \
+    *strp = strdup(os.str().c_str());                                   \
+    if (*strp == 0)                                                     \
+      return PPL_ERROR_OUT_OF_MEMORY;                                   \
+    return 0;                                                           \
+  }                                                                     \
+  CATCH_ALL
+
+#define DEFINE_ASCII_DUMP_FUNCTIONS(Type)                               \
+  int                                                                   \
+  ppl_##Type##_ascii_dump(ppl_const_##Type##_t x, FILE* file) try {     \
+    stdiobuf sb(file);                                                  \
+    std::ostream os(&sb);                                               \
+    to_const(x)->ascii_dump(os);                                        \
+    if (!os)                                                            \
+      return PPL_STDIO_ERROR;                                           \
+    return 0;                                                           \
+  }                                                                     \
+  CATCH_ALL
+
+#define DEFINE_ASCII_LOAD_FUNCTIONS(Type)                               \
+  int                                                                   \
+  ppl_##Type##_ascii_load(ppl_##Type##_t x, FILE* file) try {           \
+    stdiobuf sb(file);                                                  \
+    std::istream is(&sb);                                               \
+    if (!to_nonconst(x)->ascii_load(is))                                \
+      return PPL_STDIO_ERROR;                                           \
+    return 0;                                                           \
+  }                                                                     \
+  CATCH_ALL
+
+#define DEFINE_ASCII_DUMP_LOAD_FUNCTIONS(Type)  \
+  DEFINE_ASCII_DUMP_FUNCTIONS(Type)             \
+  DEFINE_ASCII_LOAD_FUNCTIONS(Type)
+
+#define DEFINE_OUTPUT_FUNCTIONS(Type)           \
+  DEFINE_PRINT_FUNCTIONS(Type)                  \
+  DEFINE_ASCII_DUMP_LOAD_FUNCTIONS(Type)
+
+#include "ppl_c_implementation_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_c_implementation_common_defs_hh)
diff --git a/interfaces/C/ppl_c_implementation_common_inlines.hh b/interfaces/C/ppl_c_implementation_common_inlines.hh
new file mode 100644
index 0000000..35af8d3
--- /dev/null
+++ b/interfaces/C/ppl_c_implementation_common_inlines.hh
@@ -0,0 +1,214 @@
+/* Implementation of the C interface: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_implementation_common_inlines_hh
+#define PPL_ppl_c_implementation_common_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+// FIXME: this same function is used also in the OCaml interface.
+// It should be placed in some common header file in the interfaces
+// directory.
+//! Reinterpret an mpz_t as mpz_class.
+inline mpz_class&
+reinterpret_mpz_class(mpz_t n) {
+  return reinterpret_cast<mpz_class&>(*n);
+}
+
+DECLARE_CONVERSIONS(Coefficient, Coefficient)
+
+DECLARE_CONVERSIONS(Linear_Expression, Linear_Expression)
+
+DECLARE_CONVERSIONS(Constraint, Constraint)
+
+DECLARE_CONVERSIONS(Constraint_System, Constraint_System)
+
+DECLARE_CONVERSIONS(Constraint_System_const_iterator,
+                    Constraint_System_const_iterator)
+
+DECLARE_CONVERSIONS(Generator, Generator)
+
+DECLARE_CONVERSIONS(Generator_System, Generator_System)
+
+DECLARE_CONVERSIONS(Generator_System_const_iterator,
+                    Generator_System_const_iterator)
+
+DECLARE_CONVERSIONS(Congruence, Congruence)
+
+DECLARE_CONVERSIONS(Congruence_System, Congruence_System)
+
+typedef Congruence_System::const_iterator Congruence_System_const_iterator;
+DECLARE_CONVERSIONS(Congruence_System_const_iterator,
+                    Congruence_System_const_iterator)
+
+DECLARE_CONVERSIONS(Grid_Generator, Grid_Generator)
+
+DECLARE_CONVERSIONS(Grid_Generator_System, Grid_Generator_System)
+
+typedef Grid_Generator_System::const_iterator
+Grid_Generator_System_const_iterator;
+DECLARE_CONVERSIONS(Grid_Generator_System_const_iterator,
+                    Grid_Generator_System_const_iterator)
+
+typedef PIP_Tree_Node::Artificial_Parameter
+Artificial_Parameter;
+DECLARE_CONVERSIONS(Artificial_Parameter, Artificial_Parameter)
+
+typedef PIP_Tree_Node::Artificial_Parameter_Sequence
+Artificial_Parameter_Sequence;
+DECLARE_CONVERSIONS(Artificial_Parameter_Sequence,
+                    Artificial_Parameter_Sequence)
+
+typedef PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+Artificial_Parameter_Sequence_const_iterator;
+DECLARE_CONVERSIONS(Artificial_Parameter_Sequence_const_iterator,
+                    Artificial_Parameter_Sequence_const_iterator)
+
+DECLARE_CONVERSIONS(MIP_Problem, MIP_Problem)
+
+DECLARE_CONVERSIONS(PIP_Problem, PIP_Problem)
+
+DECLARE_CONVERSIONS(PIP_Tree_Node, PIP_Tree_Node)
+
+DECLARE_CONVERSIONS(PIP_Decision_Node, PIP_Decision_Node)
+
+DECLARE_CONVERSIONS(PIP_Solution_Node, PIP_Solution_Node)
+
+inline Relation_Symbol
+relation_symbol(enum ppl_enum_Constraint_Type t) {
+  switch (t) {
+  case PPL_CONSTRAINT_TYPE_LESS_THAN:
+    return LESS_THAN;
+  case PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL:
+    return LESS_OR_EQUAL;
+  case PPL_CONSTRAINT_TYPE_EQUAL:
+    return EQUAL;
+  case PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL:
+    return GREATER_OR_EQUAL;
+  case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+    return GREATER_THAN;
+  default:
+    return static_cast<Relation_Symbol>(t);
+  }
+}
+
+inline Bounded_Integer_Type_Width
+bounded_integer_type_width(enum ppl_enum_Bounded_Integer_Type_Width w) {
+  switch (w) {
+  case PPL_BITS_8:
+    return BITS_8;
+  case PPL_BITS_16:
+    return BITS_16;
+  case PPL_BITS_32:
+    return BITS_32;
+  case PPL_BITS_64:
+    return BITS_64;
+  case PPL_BITS_128:
+    return BITS_128;
+  default:
+    return static_cast<Bounded_Integer_Type_Width>(w);
+  }
+}
+
+inline Bounded_Integer_Type_Representation
+bounded_integer_type_representation(enum ppl_enum_Bounded_Integer_Type_Representation r) {
+  switch (r) {
+  case PPL_UNSIGNED:
+    return UNSIGNED;
+  case PPL_SIGNED_2_COMPLEMENT:
+    return SIGNED_2_COMPLEMENT;
+  default:
+    return static_cast<Bounded_Integer_Type_Representation>(r);
+  }
+}
+
+inline Bounded_Integer_Type_Overflow
+bounded_integer_type_overflow(enum ppl_enum_Bounded_Integer_Type_Overflow o) {
+  switch (o) {
+  case PPL_OVERFLOW_WRAPS:
+    return OVERFLOW_WRAPS;
+  case PPL_OVERFLOW_UNDEFINED:
+    return OVERFLOW_UNDEFINED;
+  case PPL_OVERFLOW_IMPOSSIBLE:
+    return OVERFLOW_IMPOSSIBLE;
+  default:
+    return static_cast<Bounded_Integer_Type_Overflow>(o);
+  }
+}
+
+inline
+Array_Partial_Function_Wrapper
+::Array_Partial_Function_Wrapper(dimension_type* v, size_t n)
+  : vec(v), vec_size(n), max_in_codomain_(not_a_dimension()), empty(-1) {
+}
+
+inline bool
+Array_Partial_Function_Wrapper::has_empty_codomain() const {
+  if (empty < 0) {
+    empty = 1;
+    for (size_t i = vec_size; i-- > 0; )
+      if (vec[i] != not_a_dimension()) {
+        empty = 0;
+        break;
+      }
+  }
+  return (empty != 0);
+}
+
+inline dimension_type
+Array_Partial_Function_Wrapper::max_in_codomain() const {
+  if (max_in_codomain_ == not_a_dimension()) {
+    for (size_t i = vec_size; i-- > 0; ) {
+      dimension_type vec_i = vec[i];
+      if (vec_i != not_a_dimension()
+          && (max_in_codomain_ == not_a_dimension()
+              || vec_i > max_in_codomain_))
+        max_in_codomain_ = vec_i;
+    }
+  }
+  return max_in_codomain_;
+}
+
+inline bool
+Array_Partial_Function_Wrapper::maps(dimension_type i,
+                                     dimension_type& j) const {
+  if (i >= vec_size)
+    return false;
+  dimension_type vec_i = vec[i];
+  if (vec_i == not_a_dimension())
+    return false;
+  j = vec_i;
+  return true;
+}
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_c_implementation_common_inlines_hh)
diff --git a/interfaces/C/ppl_c_version.h.in b/interfaces/C/ppl_c_version.h.in
new file mode 100644
index 0000000..f3db745
--- /dev/null
+++ b/interfaces/C/ppl_c_version.h.in
@@ -0,0 +1,63 @@
+/* Header file providing version information for the C interface.  -*- C -*-
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \brief
+  A string containing the PPL version.
+
+  \ingroup Version
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+/*! \brief
+  The major number of the PPL version.
+  \ingroup Version
+*/
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+/*! \brief
+  The minor number of the PPL version.
+  \ingroup Version
+*/
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+/*! \brief
+  The revision number of the PPL version.
+  \ingroup Version
+*/
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+  \ingroup Version
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
diff --git a/interfaces/C/ppl_interface_generator_c_cc_code.m4 b/interfaces/C/ppl_interface_generator_c_cc_code.m4
new file mode 100644
index 0000000..2c45fc1
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc_code.m4
@@ -0,0 +1,1437 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+This m4 file contains the program implementation code for generating the
+files ppl_c_DOMAIN.cc for each interface domain DOMAIN
+in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the C interface.
+
+m4_define(`ppl_ at CLASS@_swap_code', `')
+m4_define(`ppl_ at CLASS@_ascii_dump_code', `')
+
+dnl There is no code at present for these procedures in the C interface.
+dnl Remove the macro if its definition is added.
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension
+(ppl_ at CLASS@_t* pph,
+ ppl_dimension_type d,
+ int empty) try {
+  const Degenerate_Element e = (empty != 0) ? EMPTY : UNIVERSE;
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(d, e));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+(ppl_ at CLASS@_t* pph,
+ ppl_const_ at A_FRIEND@_t ph) try {
+  const @B_FRIEND@& phh
+    = *static_cast<const @B_FRIEND@*>(to_const(ph));
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity
+(ppl_ at CLASS@_t* pph,
+ ppl_const_ at A_FRIEND@_t ph,
+ int complexity) try {
+  const @B_FRIEND@& phh
+    = *static_cast<const @B_FRIEND@*>(to_const(ph));
+  switch (complexity) {
+  case 0:
+    *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh, POLYNOMIAL_COMPLEXITY));
+    break;
+  case 1:
+    *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh, SIMPLEX_COMPLEXITY));
+    break;
+  case 2:
+    *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(phh, ANY_COMPLEXITY));
+    break;
+  }
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@!BUILD_REPRESENT at _System
+(ppl_ at CLASS@_t* pph, ppl_const_@!BUILD_REPRESENT at _System_t cs) try {
+  const @!BUILD_REPRESENT at _System& ccs = *to_const(cs);
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s_code',
+`int
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@!BUILD_REPRESENT at _System
+(ppl_ at CLASS@_t* pph, ppl_@!BUILD_REPRESENT at _System_t cs) try {
+  @!BUILD_REPRESENT at _System& ccs = *to_nonconst(cs);
+  *pph = to_nonconst(new @TOPOLOGY@@CPP_CLASS@(ccs at RECYCLE@));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`int
+ppl_delete_ at CLASS@(ppl_const_ at CLASS@_t ph) try {
+  delete to_const(ph);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS at _code',
+`int
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@
+(ppl_ at CLASS@_t dst,
+ ppl_const_ at CLASS@_t src) try {
+  const @TOPOLOGY@@CPP_CLASS@& ssrc
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(src));
+  @TOPOLOGY@@CPP_CLASS@& ddst
+    = *static_cast<@TOPOLOGY@@CPP_CLASS@*>(to_nonconst(dst));
+  ddst = ssrc;
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`int
+ppl_ at CLASS@_ at DIMENSION@
+(ppl_const_ at CLASS@_t ph,
+ ppl_dimension_type* m) try {
+  *m = to_const(ph)->@DIMENSION@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t* pcs) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const @!CLASS_REPRESENT at _System& cs = pph. at CLASS_REPRESENT@s();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t* pcs) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const @!CLASS_REPRESENT at _System& cs = pph.minimized_ at CLASS_REPRESENT@s();
+  *pcs = to_const(&cs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`int
+ppl_ at CLASS@_relation_with_@!RELATION_REPRESENT@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_@!RELATION_REPRESENT at _t c) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const @!RELATION_REPRESENT@& cc = *to_const(c);
+  return static_cast<int>(pph.relation_with(cc).get_flags());
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`int
+ppl_ at CLASS@_ at HAS_PROPERTY@(ppl_const_ at CLASS@_t ph) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  return pph. at HAS_PROPERTY@() ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`int
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  return pph.bounds_from_ at ABOVEBELOW@(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`int
+ppl_ at CLASS@_ at MAXMIN@
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* poptimum) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& ssup_n = *to_nonconst(sup_n);
+  Coefficient& ssup_d = *to_nonconst(sup_d);
+  bool optimum;
+  const bool ok = pph. at MAXMIN@(lle, ssup_n, ssup_d, optimum);
+  if (ok)
+    *poptimum = optimum ? 1 : 0;
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`int
+ppl_ at CLASS@_ at MAXMIN@_with_point
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t sup_n,
+ ppl_Coefficient_t sup_d,
+ int* poptimum,
+ ppl_Generator_t point) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& ssup_n = *to_nonconst(sup_n);
+  Coefficient& ssup_d = *to_nonconst(sup_d);
+  Generator& ppoint = *to_nonconst(point);
+  bool optimum;
+  const bool ok = pph. at MAXMIN@(lle, ssup_n, ssup_d, optimum, ppoint);
+  if (ok)
+    *poptimum = optimum ? 1 : 0;
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`int
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound
+(ppl_ at CLASS@_t ps,
+ ppl_dimension_type var,
+ ppl_Coefficient_t ext_n,
+ ppl_Coefficient_t ext_d,
+ int* pclosed) try {
+  const @CPP_CLASS@& pps = *to_const(ps);
+  Coefficient& eext_n = *to_nonconst(ext_n);
+  Coefficient& eext_d = *to_nonconst(ext_d);
+  bool closed;
+  const bool bounded
+    = pps.has_ at UPPERLOWER@_bound(Variable(var), eext_n, eext_d, closed);
+  if (bounded)
+    *pclosed = closed ? 1 : 0;
+  return bounded ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`int
+ppl_ at CLASS@_frequency
+(ppl_const_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t le,
+ ppl_Coefficient_t freq_n,
+ ppl_Coefficient_t freq_d,
+ ppl_Coefficient_t val_n,
+ ppl_Coefficient_t val_d) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  const Linear_Expression& lle = *to_const(le);
+  Coefficient& pfreq_n = *to_nonconst(freq_n);
+  Coefficient& pfreq_d = *to_nonconst(freq_d);
+  Coefficient& pval_n = *to_nonconst(val_n);
+  Coefficient& pval_d = *to_nonconst(val_d);
+  return pph.frequency(lle, pfreq_n, pfreq_d, pval_n, pval_d) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`int
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  const @CPP_CLASS@& xx = *to_const(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return xx. at COMPARISON@(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`int
+ppl_ at CLASS@_equals_ at CLASS@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  const @CPP_CLASS@& xx = *to_const(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`int
+ppl_ at CLASS@_OK(ppl_const_ at CLASS@_t ph) try {
+  return to_const(ph)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`int
+ppl_ at CLASS@_ at SIMPLIFY@(ppl_ at CLASS@_t ph) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph. at SIMPLIFY@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimension
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var
+) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.unconstrain(Variable(var));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`int
+ppl_ at CLASS@_unconstrain_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  pph.unconstrain(vars);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`int
+ppl_ at CLASS@_constrains
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var
+) try {
+  const @CPP_CLASS@& pph = *to_const(ph);
+  return pph.constrains(Variable(var)) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`int
+ppl_ at CLASS@_ at BINOP@
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx. at BINOP@(yy);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`int
+ppl_ at CLASS@_positive_time_elapse_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  if (Interfaces::is_necessarily_closed_for_interfaces(*to_const(x))) {
+    C_Polyhedron& xx = static_cast<C_Polyhedron&>(*to_nonconst(x));
+    const C_Polyhedron& yy = static_cast<const C_Polyhedron&>(*to_const(y));
+    xx.positive_time_elapse_assign(yy);
+  }
+  else {
+    NNC_Polyhedron& xx = static_cast<NNC_Polyhedron&>(*to_nonconst(x));
+    const NNC_Polyhedron& yy = static_cast<const NNC_Polyhedron&>(*to_const(y));
+    xx.positive_time_elapse_assign(yy);
+  }
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`int
+ppl_ at CLASS@_ at UB_EXACT@
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+`m4_ifelse(m4_current_interface, `Polyhedron',
+  `m4_ub_exact_for_polyhedron_domains',
+          `m4_ub_exact_for_non_polyhedron_domains')'
+}
+CATCH_ALL
+
+  ')
+
+m4_define(`m4_ub_exact_for_polyhedron_domains',
+` if (Interfaces::is_necessarily_closed_for_interfaces(*to_const(x))) {
+    C_Polyhedron& xx = static_cast<C_Polyhedron&>(*to_nonconst(x));
+    const C_Polyhedron& yy = static_cast<const C_Polyhedron&>(*to_const(y));
+    return xx.upper_bound_assign_if_exact(yy) ? 1 : 0;
+  }
+  else {
+    NNC_Polyhedron& xx = static_cast<NNC_Polyhedron&>(*to_nonconst(x));
+    const NNC_Polyhedron& yy = static_cast<const NNC_Polyhedron&>(*to_const(y));
+    return xx.upper_bound_assign_if_exact(yy) ? 1 : 0;
+  }
+')
+
+m4_define(`m4_ub_exact_for_non_polyhedron_domains',
+`  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return xx. at UB_EXACT@(yy) ? 1 : 0;
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`int
+ppl_ at CLASS@_simplify_using_context_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  return xx.simplify_using_context_assign(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _t c) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @!CLASS_REPRESENT@& cc = *to_const(c);
+  pph.add_ at CLASS_REPRESENT@(cc);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!REFINE_REPRESENT at _t c) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @!REFINE_REPRESENT@& cc = *to_const(c);
+  pph.refine_with_ at REFINE_REPRESENT@(cc);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!CLASS_REPRESENT at _System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @!CLASS_REPRESENT at _System& ccs = *to_const(cs);
+  pph.add_ at CLASS_REPRESENT@s(ccs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_const_@!REFINE_REPRESENT at _System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const @!REFINE_REPRESENT at _System& ccs = *to_const(cs);
+  pph.refine_with_ at REFINE_REPRESENT@s(ccs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s_code',
+`int
+ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s
+(ppl_ at CLASS@_t ph,
+ ppl_@!CLASS_REPRESENT at _System_t cs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  @!CLASS_REPRESENT at _System& ccs = *to_nonconst(cs);
+  pph.add_recycled_ at CLASS_REPRESENT@s(ccs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph. at AFFIMAGE@(Variable(var), lle, dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_bounded_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t lb,
+ ppl_const_Linear_Expression_t ub,
+ ppl_const_Coefficient_t d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& llb = *to_const(lb);
+  const Linear_Expression& uub = *to_const(ub);
+  const Coefficient& dd = *to_const(d);
+  pph.bounded_ at AFFIMAGE@(Variable(var), llb, uub, dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  pph.generalized_ at AFFIMAGE@
+    (Variable(var), relation_symbol(relsym), lle, dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+(ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& llhs = *to_const(lhs);
+  const Linear_Expression& rrhs = *to_const(rhs);
+  pph.generalized_ at AFFIMAGE@(llhs, relation_symbol(relsym), rrhs);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type var,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d,
+ ppl_const_Coefficient_t m) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& lle = *to_const(le);
+  const Coefficient& dd = *to_const(d);
+  const Coefficient& mm = *to_const(m);
+  pph.generalized_ at AFFIMAGE@
+    (Variable(var), relation_symbol(relsym), lle, dd, mm);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+(ppl_ at CLASS@_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs,
+ ppl_const_Coefficient_t m) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Linear_Expression& llhs = *to_const(lhs);
+  const Linear_Expression& rrhs = *to_const(rhs);
+  const Coefficient& mm = *to_const(m);
+  pph.generalized_ at AFFIMAGE@(llhs, relation_symbol(relsym), rrhs, mm);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx. at WIDEN@_widening_assign(yy, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`int
+ppl_ at CLASS@_ at WIDEN@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  return ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_widening_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx.widening_assign(yy, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`int
+ppl_ at CLASS@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  return ppl_ at CLASS@_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_@!CONSTRAINER at _System_t cs,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  const @!CONSTRAINER at _System& ccs = *to_const(cs);
+  xx. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(yy, ccs, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_const_@!CONSTRAINER at _System_t cs) try {
+  return
+    ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+      (x, y, cs, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned* tp) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx. at EXTRAPOLATION@_extrapolation_assign(yy, tp);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  return
+    ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+      (x, y, 0);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`int
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx. at EXTRAPOLATION@_narrowing_assign(yy);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+  m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+int
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y) try {
+  @CPP_CLASS@& xx = *to_nonconst(x);
+  const @CPP_CLASS@& yy = *to_const(y);
+  xx.BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>(yy,
+       widen_fun_ref(
+         &@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`int
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign
+(ppl_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ unsigned disjuncts) try {
+   @CPP_CLASS@& xx = *to_nonconst(x);
+   const @CPP_CLASS@& yy = *to_const(y);
+   xx.BGP99_extrapolation_assign(yy,
+       widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::
+           @DISJUNCT_WIDEN at _widening_assign),
+       disjuncts);
+   return 0;
+}
+CATCH_ALL
+
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`int
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.add_space_dimensions_ at EMBEDPROJECT@(d);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  pph.remove_space_dimensions(vars);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`int
+ppl_ at CLASS@_remove_higher_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.remove_higher_space_dimensions(d);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`int
+ppl_ at CLASS@_map_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type maps[],
+ size_t n) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  const Array_Partial_Function_Wrapper function(maps, n);
+  pph.map_space_dimensions(function);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`int
+ppl_ at CLASS@_expand_space_dimension
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  pph.expand_space_dimension(Variable(d), m);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`int
+ppl_ at CLASS@_fold_space_dimensions
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  pph.fold_space_dimensions(vars, Variable(d));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`int
+ppl_ at CLASS@_drop_some_non_integer_points
+(ppl_ at CLASS@_t ph,
+ int complexity) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  switch (complexity) {
+  case 0:
+    pph.drop_some_non_integer_points(POLYNOMIAL_COMPLEXITY);
+    break;
+  case 1:
+    pph.drop_some_non_integer_points(SIMPLEX_COMPLEXITY);
+    break;
+  case 2:
+    pph.drop_some_non_integer_points(ANY_COMPLEXITY);
+    break;
+  }
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`int
+ppl_ at CLASS@_drop_some_non_integer_points_2
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ int complexity) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  switch (complexity) {
+  case 0:
+    pph.drop_some_non_integer_points(vars, POLYNOMIAL_COMPLEXITY);
+    break;
+  case 1:
+    pph.drop_some_non_integer_points(vars, SIMPLEX_COMPLEXITY);
+    break;
+  case 2:
+    pph.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+    break;
+  }
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`int
+ppl_ at CLASS@_ at MEMBYTES@
+(ppl_const_ at CLASS@_t ps,
+ size_t* sz) try {
+  *sz = to_const(ps)->@MEMBYTES@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_code',
+`dnl
+
+typedef @CPP_CLASS@::iterator
+        @CLASS at _iterator;
+typedef @CPP_CLASS@::const_iterator
+        @CLASS at _const_iterator;
+
+DECLARE_CONVERSIONS(@CLASS at _iterator,
+                    @CLASS at _iterator)
+DECLARE_CONVERSIONS(@CLASS at _const_iterator,
+                    @CLASS at _const_iterator)
+
+int
+ppl_new_ at CLASS@_iterator
+(ppl_ at CLASS@_iterator_t* pit) try {
+  *pit = to_nonconst(new @CLASS at _iterator());
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_ at CLASS@_const_iterator
+(ppl_ at CLASS@_const_iterator_t* pit) try {
+  *pit = to_nonconst(new @CLASS at _const_iterator());
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+
+int
+ppl_new_ at CLASS@_iterator_from_iterator
+(ppl_ at CLASS@_iterator_t* px, ppl_const_ at CLASS@_iterator_t y) try {
+  const @CLASS at _iterator& yy
+    = *static_cast<const @CLASS at _iterator*>(to_const(y));
+  *px = to_nonconst(new @CLASS at _iterator(yy));
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_ at CLASS@_const_iterator_from_const_iterator
+(ppl_ at CLASS@_const_iterator_t* px,
+ ppl_const_ at CLASS@_const_iterator_t y) try {
+  const @CLASS at _const_iterator& yy
+    = *static_cast<const @CLASS at _const_iterator*>(to_const(y));
+  *px = to_nonconst(new @CLASS at _const_iterator(yy));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_equal_test
+(ppl_const_ at CLASS@_iterator_t x,
+ ppl_const_ at CLASS@_iterator_t y) try {
+  return (*to_const(x) == *to_const(y)) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_equal_test
+(ppl_const_ at CLASS@_const_iterator_t x,
+ ppl_const_ at CLASS@_const_iterator_t y) try {
+  return (*to_const(x) == *to_const(y)) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at BEGINEND@
+(ppl_ at CLASS@_t ps,
+ ppl_ at CLASS@_iterator_t psit) try {
+  @CPP_CLASS@::iterator& ppsit = *to_nonconst(psit);
+  ppsit = to_nonconst(ps)->@BEGINEND@();
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_ at BEGINEND@
+(ppl_const_ at CLASS@_t ps,
+ ppl_ at CLASS@_const_iterator_t psit) try {
+  @CPP_CLASS@::const_iterator& ppsit = *to_nonconst(psit);
+  ppsit = to_const(ps)->@BEGINEND@();
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`dnl
+int
+ppl_delete_ at CLASS@_iterator
+(ppl_const_ at CLASS@_iterator_t it)
+  try {
+  delete to_const(it);
+  return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_ at CLASS@_const_iterator
+(ppl_const_ at CLASS@_const_iterator_t it)
+  try {
+  delete to_const(it);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_ at INCDEC@
+(ppl_ at CLASS@_iterator_t it)
+  try {
+    @CPP_CLASS@::iterator& iit = *to_nonconst(it);
+    @B_INCDEC at iit;
+    return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_ at INCDEC@
+(ppl_ at CLASS@_const_iterator_t it)
+  try {
+    @CPP_CLASS@::const_iterator& iit = *to_nonconst(it);
+    @B_INCDEC at iit;
+    return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_drop_disjunct
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t cit,
+ ppl_ at CLASS@_iterator_t it) try {
+  @CPP_CLASS@& pps = *to_nonconst(ps);
+  const @CPP_CLASS@::iterator& ccit = *to_const(cit);
+  @CPP_CLASS@::iterator& iit = *to_nonconst(it);
+  iit = pps.drop_disjunct(ccit);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+int
+ppl_ at CLASS@_drop_disjuncts
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t first,
+ ppl_const_ at CLASS@_iterator_t last) try {
+  @CPP_CLASS@& pps = *to_nonconst(ps);
+  const @CPP_CLASS@::iterator& ffirst = *to_const(first);
+  const @CPP_CLASS@::iterator& llast = *to_const(last);
+  pps.drop_disjuncts(ffirst, llast);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_add_disjunct
+(ppl_ at CLASS@_t ps,
+ ppl_const_ at DISJUNCT@_t d) try {
+  @CPP_CLASS@& pps = *to_nonconst(ps);
+  const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& dd
+     = *static_cast<const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(to_const(d));
+  pps.add_disjunct(dd);
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+int
+ppl_ at CLASS@_iterator_dereference
+(ppl_const_ at CLASS@_iterator_t psit,
+ ppl_const_ at DISJUNCT@_t* cd) try {
+   const @CPP_CLASS@::iterator& cpsit = *to_const(psit);
+   const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& d = cpsit->pointset();
+   *cd = to_const(&d);
+   return 0;
+}
+CATCH_ALL
+
+int
+ppl_ at CLASS@_const_iterator_dereference
+(ppl_const_ at CLASS@_const_iterator_t psit,
+ ppl_const_ at DISJUNCT@_t* cd) try {
+   const @CPP_CLASS@::const_iterator& cpsit = *to_const(psit);
+   const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& d = cpsit->pointset();
+   *cd = to_const(&d);
+   return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+int
+ppl_ at CLASS@_linear_ at PARTITION@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_ at CLASS@_t* p_inters,
+ ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest) try {
+`m4_ifelse(m4_current_interface, `Polyhedron',
+  `m4_linear_partition_for_polyhedron_domains',
+          `m4_linear_partition_for_non_polyhedron_domains')'
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_linear_partition_for_polyhedron_domains',
+`dnl
+ if (Interfaces::is_necessarily_closed_for_interfaces(*to_const(x))) {
+    const C_ at CPP_CLASS@& xx
+      = static_cast<const C_ at CPP_CLASS@&>(*to_const(x));
+    const C_ at CPP_CLASS@& yy
+      = static_cast<const C_ at CPP_CLASS@&>(*to_const(y));
+    std::pair<C_ at CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+      r = linear_partition(xx, yy);
+    *p_inters = to_nonconst(&r.first);
+    *p_rest = to_nonconst(&r.second);
+ }
+ else {
+    const C_ at CPP_CLASS@& xx
+      = static_cast<const C_ at CPP_CLASS@&>(*to_const(x));
+    const C_ at CPP_CLASS@& yy
+      = static_cast<const C_ at CPP_CLASS@&>(*to_const(y));
+    std::pair<C_ at CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+      r = linear_partition(xx, yy);
+    *p_inters = to_nonconst(&r.first);
+    *p_rest = to_nonconst(&r.second);
+}
+  return 0;
+
+')
+
+m4_define(`m4_linear_partition_for_non_polyhedron_domains',
+`dnl
+    const @CPP_CLASS@& xx
+      = static_cast<const @CPP_CLASS@&>(*to_const(x));
+    const @CPP_CLASS@& yy
+      = static_cast<const @CPP_CLASS@&>(*to_const(y));
+    std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+      r = linear_partition(xx, yy);
+    *p_inters = to_nonconst(&r.first);
+    *p_rest = to_nonconst(&r.second);
+  return 0;
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+int
+ppl_ at CLASS@_approximate_ at PARTITION@
+(ppl_const_ at CLASS@_t x,
+ ppl_const_ at CLASS@_t y,
+ ppl_ at CLASS@_t* p_inters,
+ ppl_Pointset_Powerset_Grid_t* p_rest,
+ int* p_finite) try {
+    const @CPP_CLASS@& xx
+      = static_cast<const @CPP_CLASS@&>(*to_const(x));
+    const @CPP_CLASS@& yy
+      = static_cast<const @CPP_CLASS@&>(*to_const(y));
+    bool finite;
+    std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<Grid> >
+      r = approximate_partition(xx, yy, finite);
+    *p_inters = to_nonconst(&r.first);
+    *p_rest = to_nonconst(&r.second);
+    *p_finite = finite ? 1 : 0;
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+  return termination_test_ at TERMINATION_ID@(ppset) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before, ppl_const_ at CLASS@_t pset_after) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+  return termination_test_ at TERMINATION_ID@_2(ppset_before, ppset_after) ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset,
+ ppl_Generator_t point) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+  Generator& ppoint = *to_nonconst(point);
+  const bool ok = one_affine_ranking_function_ at TERMINATION_ID@(ppset, ppoint);
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Generator_t point) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+  Generator& ppoint = *to_nonconst(point);
+  const bool ok = one_affine_ranking_function_ at TERMINATION_ID@_2(ppset_before,
+                                                                 ppset_after,
+                                                                 ppoint);
+  return ok ? 1 : 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset,
+ ppl_Polyhedron_t ph) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+  all_affine_ranking_functions_ at TERMINATION_ID@
+    (ppset, *static_cast<@A_TERMINATION_ID at Polyhedron*> (to_nonconst(ph)));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Polyhedron_t ph) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+  all_affine_ranking_functions_ at TERMINATION_ID@_2
+    (ppset_before, ppset_after,
+     *static_cast<@A_TERMINATION_ID at Polyhedron*>(to_nonconst(ph)));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+(ppl_const_ at CLASS@_t pset,
+ ppl_Polyhedron_t ph_decreasing,
+ ppl_Polyhedron_t ph_bounded) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset));
+  all_affine_quasi_ranking_functions_MS(ppset,
+    *static_cast<C_Polyhedron*>(to_nonconst(ph_decreasing)),
+    *static_cast<C_Polyhedron*>(to_nonconst(ph_bounded)));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+(ppl_const_ at CLASS@_t pset_before,
+ ppl_const_ at CLASS@_t pset_after,
+ ppl_Polyhedron_t ph_decreasing,
+ ppl_Polyhedron_t ph_bounded) try {
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_before));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+    = *static_cast<const @TOPOLOGY@@CPP_CLASS@*>(to_const(pset_after));
+  all_affine_quasi_ranking_functions_MS_2(ppset_before, ppset_after,
+    *static_cast<C_Polyhedron*>(to_nonconst(ph_decreasing)),
+    *static_cast<C_Polyhedron*>(to_nonconst(ph_bounded)));
+  return 0;
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`int
+ppl_ at CLASS@_wrap_assign
+(ppl_ at CLASS@_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ enum ppl_enum_Bounded_Integer_Type_Width w,
+ enum ppl_enum_Bounded_Integer_Type_Representation r,
+ enum ppl_enum_Bounded_Integer_Type_Overflow o,
+ const ppl_const_Constraint_System_t* pcs,
+ unsigned complexity_threshold,
+ int wrap_individually) try {
+  @CPP_CLASS@& pph = *to_nonconst(ph);
+  Variables_Set vars;
+  for (ppl_dimension_type i = n; i-- > 0; )
+    vars.insert(ds[i]);
+  const Constraint_System* const ccs = to_const(*pcs);
+  const bool b = (wrap_individually != 0);
+  pph.wrap_assign(vars,
+                  bounded_integer_type_width(w),
+                  bounded_integer_type_representation(r),
+                  bounded_integer_type_overflow(o),
+                  ccs, complexity_threshold, b);
+  return 0;
+}
+CATCH_ALL
+
+')
diff --git a/interfaces/C/ppl_interface_generator_c_cc_files.m4 b/interfaces/C/ppl_interface_generator_c_cc_files.m4
new file mode 100644
index 0000000..7e5e135
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_cc_files.m4
@@ -0,0 +1,70 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_cc
+dnl using the code in ppl_interface_generator_c_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_cc_code.m4')
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+m4_define(`m4_pattern_extensions', `, A_, B_')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_`'m4_current_interface`'.cc << ___END_OF_FILE___
+/* C m4_current_interface interface code: definitions.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_c_implementation_common_defs.hh"
+`#'include "interfaced_boxes.hh"
+`#'include "ppl_c_implementation_domains.hh"
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::C;
+
+')
+
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+DEFINE_OUTPUT_FUNCTIONS(m4_interface_class`'$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Output the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_h.m4 b/interfaces/C/ppl_interface_generator_c_h.m4
new file mode 100644
index 0000000..98d61c8
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h.m4
@@ -0,0 +1,72 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_domains.h
+dnl using the code in ppl_interface_generator_c_h_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_h_code.m4')
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+
+dnl m4_one_class_code(Class)
+m4_pushdef(`m4_one_class_code', `dnl
+PPL_TYPE_DECLARATION(m4_interface_class$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Output conversion declarations for all the classes.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+/*C interface code: header file.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+dnl m4_pre_all_classes_code
+m4_define(`m4_pre_extra_class_code', `
+/*! \interface ppl_`'m4_interface_class$1`'_tag
+  \brief Types and functions for ppl_`'m4_interface_class$1`'_tag
+*/
+
+')
+
+dnl m4_post_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+PPL_DECLARE_IO_FUNCTIONS(m4_interface_class$1)
+
+/* End of Functions Related to ppl_`'m4_interface_class$1`'_tag */
+')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_h_code.m4 b/interfaces/C/ppl_interface_generator_c_h_code.m4
new file mode 100644
index 0000000..14f8e99
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_h_code.m4
@@ -0,0 +1,872 @@
+dnl  -*- C -*-
+m4_divert(-1)
+
+This m4 file contains the program header code for generating the
+files ppl_c_domains.h.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the C interface.
+dnl
+m4_define(`ppl_ at CLASS@_swap_code', `')
+m4_define(`ppl_ at CLASS@_ascii_dump_code', `')
+
+dnl There is no code at present for these procedures in the C interface.
+dnl Remove the macro if its definition is added.
+dnl
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset));
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before, ppl_const_ at CLASS@_t pset_after));
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset,
+           ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before,
+           ppl_const_ at CLASS@_t pset_after,
+           ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset,
+           ppl_Polyhedron_t ph));
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before,
+           ppl_const_ at CLASS@_t pset_after,
+           ppl_Polyhedron_t ph));
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t pset,
+           ppl_Polyhedron_t ph_decreasing,
+           ppl_Polyhedron_t ph_bounded));
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+PPL_PROTO((ppl_const_ at CLASS@_t pset_before,
+           ppl_const_ at CLASS@_t pset_after,
+           ppl_Polyhedron_t ph_decreasing,
+           ppl_Polyhedron_t ph_bounded));
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_linear_ at PARTITION@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_ at CLASS@_t* p_inters,
+           ppl_Pointset_Powerset_NNC_Polyhedron_t* p_rest));
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_approximate_ at PARTITION@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_ at CLASS@_t* p_inters,
+           ppl_Pointset_Powerset_Grid_t* p_rest,
+           int* p_finite));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_dimension_type d, int empty));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_ at A_FRIEND@_t ph));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_ at A_FRIEND@_t ph, int complexity));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _from_@!BUILD_REPRESENT at _System
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_const_@!BUILD_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@!BUILD_REPRESENT at _System
+PPL_PROTO((ppl_ at CLASS@_t* pph, ppl_@!BUILD_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_delete_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS at _code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@
+PPL_PROTO((ppl_ at CLASS@_t dst, ppl_const_ at CLASS@_t src));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at DIMENSION@
+PPL_PROTO((ppl_const_ at CLASS@_t ph, ppl_dimension_type* m));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_@!CLASS_REPRESENT at _System_t* pcs));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_@!CLASS_REPRESENT at _System_t* pcs));
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_relation_with_@!RELATION_REPRESENT@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_@!RELATION_REPRESENT at _t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at HAS_PROPERTY@
+PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t le));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at MAXMIN@
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at MAXMIN@_with_point
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* poptimum,
+           ppl_Generator_t point));
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_get_ at UPPERLOWER@_bound
+PPL_PROTO((ppl_ at CLASS@_t ps,
+           ppl_dimension_type var,
+           ppl_Coefficient_t ext_n,
+           ppl_Coefficient_t ext_d,
+           int* pclosed));
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_frequency
+PPL_PROTO((ppl_const_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t le,
+           ppl_Coefficient_t ext_fn,
+           ppl_Coefficient_t ext_fd,
+           ppl_Coefficient_t ext_vn,
+           ppl_Coefficient_t ext_vd));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_equals_ at CLASS@
+PPL_PROTO((ppl_const_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_OK
+PPL_PROTO((ppl_const_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at SIMPLIFY@
+PPL_PROTO((ppl_ at CLASS@_t ph));
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_constrains
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var));
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_unconstrain_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var));
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_unconstrain_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at BINOP@
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_positive_time_elapse_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at UB_EXACT@
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_simplify_using_context_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_@!CLASS_REPRESENT at _t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_@!REFINE_REPRESENT at _t c));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_@!CLASS_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_@!REFINE_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_@!CLASS_REPRESENT at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_bounded_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           ppl_const_Linear_Expression_t lb,
+           ppl_const_Linear_Expression_t ub,
+           ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type var,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t le,
+           ppl_const_Coefficient_t d,
+           ppl_const_Coefficient_t m));
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_const_Linear_Expression_t lhs,
+           enum ppl_enum_Constraint_Type relsym,
+           ppl_const_Linear_Expression_t rhs,
+           ppl_const_Coefficient_t m));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at WIDEN@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_widening_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_const_@!CONSTRAINER at _System_t cs,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           ppl_const_@!CONSTRAINER at _System_t cs));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           unsigned* tp));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y,
+           int disjuncts));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+PPL_PROTO((ppl_ at CLASS@_t x,
+           ppl_const_ at CLASS@_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_remove_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_remove_higher_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_map_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type maps[],
+           size_t n));
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_expand_space_dimension
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type d,
+           ppl_dimension_type m));
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_fold_space_dimensions
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           ppl_dimension_type d));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_some_non_integer_points
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           int complexity));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_some_non_integer_points_2
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           int complexity));
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_wrap_assign
+PPL_PROTO((ppl_ at CLASS@_t ph,
+           ppl_dimension_type ds[],
+           size_t n,
+           enum ppl_enum_Bounded_Integer_Type_Width w,
+           enum ppl_enum_Bounded_Integer_Type_Representation r,
+           enum ppl_enum_Bounded_Integer_Type_Overflow o,
+           const ppl_const_Constraint_System_t* pcs,
+           unsigned complexity_threshold,
+           int wrap_individually));
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_ at MEMBYTES@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           size_t* sz));
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_code',
+`dnl
+/*! \interface ppl_ at CLASS@_iterator_tag
+  \brief Types and functions for iterating on the disjuncts of a
+  ppl_ at CLASS@_tag.
+*/
+/*! \interface ppl_ at CLASS@_const_iterator_tag
+  \brief Types and functions for iterating on the disjuncts of a
+  const ppl_ at CLASS@_tag.
+*/
+
+PPL_TYPE_DECLARATION(@CLASS at _iterator)
+PPL_TYPE_DECLARATION(@CLASS at _const_iterator)
+
+/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_new_ at CLASS@_iterator
+PPL_PROTO((ppl_ at CLASS@_iterator_t* pit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_new_ at CLASS@_const_iterator
+PPL_PROTO((ppl_ at CLASS@_const_iterator_t* pit));
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_new_ at CLASS@_iterator_from_iterator
+PPL_PROTO((ppl_ at CLASS@_iterator_t* px,
+           ppl_const_ at CLASS@_iterator_t y));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_new_ at CLASS@_const_iterator_from_const_iterator
+PPL_PROTO((ppl_ at CLASS@_const_iterator_t* px,
+           ppl_const_ at CLASS@_const_iterator_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_equal_test
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t x,
+           ppl_const_ at CLASS@_iterator_t y));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_equal_test
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t x,
+           ppl_const_ at CLASS@_const_iterator_t y));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_ at BEGINEND@
+PPL_PROTO((ppl_ at CLASS@_t ps,
+           ppl_ at CLASS@_iterator_t psit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_ at BEGINEND@
+PPL_PROTO((ppl_const_ at CLASS@_t ps,
+           ppl_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_delete_ at CLASS@_iterator
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t psit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_delete_ at CLASS@_const_iterator
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_ at INCDEC@
+PPL_PROTO((ppl_ at CLASS@_iterator_t psit));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_ at INCDEC@
+PPL_PROTO((ppl_ at CLASS@_const_iterator_t psit));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_disjunct
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t cit,
+ ppl_ at CLASS@_iterator_t it));
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_drop_disjuncts
+PPL_PROTO((ppl_ at CLASS@_t ps,
+ ppl_const_ at CLASS@_iterator_t first,
+ ppl_const_ at CLASS@_iterator_t last));
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`/*! \relates ppl_ at CLASS@_tag */
+int
+ppl_ at CLASS@_add_disjunct
+PPL_PROTO((ppl_ at CLASS@_t ps,
+           ppl_const_ at DISJUNCT@_t d));
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`/*! \relates ppl_ at CLASS@_iterator_tag */
+int
+ppl_ at CLASS@_iterator_dereference
+PPL_PROTO((ppl_const_ at CLASS@_iterator_t ps,
+           ppl_const_ at DISJUNCT@_t* d));
+
+/*! \relates ppl_ at CLASS@_const_iterator_tag */
+int
+ppl_ at CLASS@_const_iterator_dereference
+PPL_PROTO((ppl_const_ at CLASS@_const_iterator_t ps,
+           ppl_const_ at DISJUNCT@_t* d));
+
+')
diff --git a/interfaces/C/ppl_interface_generator_c_hh_files.m4 b/interfaces/C/ppl_interface_generator_c_hh_files.m4
new file mode 100644
index 0000000..36b95bd
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_hh_files.m4
@@ -0,0 +1,85 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_c_h
+dnl using the code in ppl_interface_generator_c_h_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_c_procedure_generators.m4')
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_implementation_domains.hh << ___END_OF_FILE___
+/* C interface code: inclusion of all the domain-dependent declarations.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_divert(-1)
+
+m4_define(`m4_declaration_code', `dnl
+m4_ifelse(m4_class_group$1, product,
+            typedef Domain_Product<`'m4_class_body_1st$1|COMMA|`'m4_class_body_2nd$1 >::`'m4_class_kind$1 m4_interface_class`'$1;
+)
+m4_ifelse(m4_class_group$1, box,
+   DECLARE_CONVERSIONS(m4_interface_class`'$1, m4_interface_class`'$1),
+   m4_class_group$1, product,
+   DECLARE_CONVERSIONS(m4_interface_class`'$1, m4_interface_class`'$1),
+   DECLARE_CONVERSIONS(m4_interface_class`'$1, m4_cplusplus_class`'$1)`'dnl
+)`'dnl
+')
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_implementation_domains.hh << ___END_OF_FILE___
+`#'include "ppl_c_`'m4_current_interface.hh"
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_c_`'m4_current_interface.hh << ___END_OF_FILE___
+/* C m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace C {
+
+m4_declaration_code($1)
+
+} // namespace C
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+dnl Generate the non-fixed part of the file.
+m4_divert`'dnl
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/C/ppl_interface_generator_c_procedure_generators.m4 b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4
new file mode 100644
index 0000000..7b021ad
--- /dev/null
+++ b/interfaces/C/ppl_interface_generator_c_procedure_generators.m4
@@ -0,0 +1,54 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of procedures
+dnl for the C interface; this includes:
+dnl - the list in the imported file and any C specific procedures.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl m4_procedure_list
+dnl This is the main procedure for generating the C code.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_procedure_list',
+  `m4_echo_unquoted(ppl_new_ at CLASS@_iterator +pointset_powerset,
+`m4_common_procedure_list',
+ppl_new_ at TOPOLOGY@@CLASS at _recycle_@BUILD_REPRESENT at s +simple,
+ppl_assign_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@ +simple,
+ppl_ at CLASS@_add_recycled_ at CLASS_REPRESENT@s +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+)
+')
diff --git a/interfaces/C/tests/Makefile.am b/interfaces/C/tests/Makefile.am
new file mode 100644
index 0000000..ac529aa
--- /dev/null
+++ b/interfaces/C/tests/Makefile.am
@@ -0,0 +1,141 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@ \
+ at debug_flag@
+
+if GCC
+
+if HOST_OS_MINGW
+
+# MinGW's <stdlib.h> cannot be compiled in c89 mode.
+AM_CFLAGS = -pedantic -std=gnu89
+
+else !HOST_OS_MINGW
+
+if ICC
+
+AM_CFLAGS = -std=c89
+
+else !ICC
+
+AM_CFLAGS = -pedantic -std=c89
+
+endif !ICC
+
+endif !HOST_OS_MINGW
+
+endif GCC
+
+check_LIBRARIES = libppl_c_tests.a
+
+libppl_c_tests_a_SOURCES = \
+ppl_c_test.cc
+
+# Dummy C++ source to cause C++ linking.
+nodist_EXTRA_libppl_c_tests_a_SOURCES = \
+dummy.cc
+
+libppl_c_tests_a_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@
+
+LDADD = \
+libppl_c_tests.a \
+$(top_builddir)/interfaces/C/libppl_c.la \
+ at extra_libraries@
+
+TESTS = \
+formatted_output \
+pip_test \
+watchdog1 \
+weightwatch1
+
+
+#
+# Sources for the tests
+#
+
+formatted_output_SOURCES = \
+formatted_output.c \
+print_to_buffer.h \
+print_to_buffer.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_formatted_output_SOURCES = \
+dummy.cc
+
+pip_test_SOURCES = \
+pip_test.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_pip_test_SOURCES = \
+dummy.cc
+
+watchdog1_SOURCES = \
+watchdog1.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_watchdog1_SOURCES = \
+dummy.cc
+
+weightwatch1_SOURCES = \
+weightwatch1.c
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_weightwatch1_SOURCES = \
+dummy.cc
+
+
+noinst_HEADERS = \
+ppl_c_test.h
+
+XFAIL_TESTS =
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+BUGS =
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
diff --git a/interfaces/C/tests/Makefile.in b/interfaces/C/tests/Makefile.in
new file mode 100644
index 0000000..fd2601c
--- /dev/null
+++ b/interfaces/C/tests/Makefile.in
@@ -0,0 +1,1304 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = formatted_output$(EXEEXT) pip_test$(EXEEXT) watchdog1$(EXEEXT) \
+	weightwatch1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = interfaces/C/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(noinst_HEADERS) $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libppl_c_tests_a_AR = $(AR) $(ARFLAGS)
+libppl_c_tests_a_LIBADD =
+am_libppl_c_tests_a_OBJECTS = libppl_c_tests_a-ppl_c_test.$(OBJEXT)
+libppl_c_tests_a_OBJECTS = $(am_libppl_c_tests_a_OBJECTS)
+am__EXEEXT_1 = formatted_output$(EXEEXT) pip_test$(EXEEXT) \
+	watchdog1$(EXEEXT) weightwatch1$(EXEEXT)
+am__EXEEXT_2 =
+am_formatted_output_OBJECTS = formatted_output.$(OBJEXT) \
+	print_to_buffer.$(OBJEXT)
+formatted_output_OBJECTS = $(am_formatted_output_OBJECTS)
+formatted_output_LDADD = $(LDADD)
+formatted_output_DEPENDENCIES = libppl_c_tests.a \
+	$(top_builddir)/interfaces/C/libppl_c.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_pip_test_OBJECTS = pip_test.$(OBJEXT)
+pip_test_OBJECTS = $(am_pip_test_OBJECTS)
+pip_test_LDADD = $(LDADD)
+pip_test_DEPENDENCIES = libppl_c_tests.a \
+	$(top_builddir)/interfaces/C/libppl_c.la
+am_watchdog1_OBJECTS = watchdog1.$(OBJEXT)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+watchdog1_LDADD = $(LDADD)
+watchdog1_DEPENDENCIES = libppl_c_tests.a \
+	$(top_builddir)/interfaces/C/libppl_c.la
+am_weightwatch1_OBJECTS = weightwatch1.$(OBJEXT)
+weightwatch1_OBJECTS = $(am_weightwatch1_OBJECTS)
+weightwatch1_LDADD = $(LDADD)
+weightwatch1_DEPENDENCIES = libppl_c_tests.a \
+	$(top_builddir)/interfaces/C/libppl_c.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(libppl_c_tests_a_SOURCES) \
+	$(nodist_EXTRA_libppl_c_tests_a_SOURCES) \
+	$(formatted_output_SOURCES) \
+	$(nodist_EXTRA_formatted_output_SOURCES) $(pip_test_SOURCES) \
+	$(nodist_EXTRA_pip_test_SOURCES) $(watchdog1_SOURCES) \
+	$(nodist_EXTRA_watchdog1_SOURCES) $(weightwatch1_SOURCES) \
+	$(nodist_EXTRA_weightwatch1_SOURCES)
+DIST_SOURCES = $(libppl_c_tests_a_SOURCES) $(formatted_output_SOURCES) \
+	$(pip_test_SOURCES) $(watchdog1_SOURCES) \
+	$(weightwatch1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@ \
+ at debug_flag@
+
+ at GCC_TRUE@@HOST_OS_MINGW_FALSE@@ICC_FALSE at AM_CFLAGS = -pedantic -std=c89
+ at GCC_TRUE@@HOST_OS_MINGW_FALSE@@ICC_TRUE at AM_CFLAGS = -std=c89
+
+# MinGW's <stdlib.h> cannot be compiled in c89 mode.
+ at GCC_TRUE@@HOST_OS_MINGW_TRUE at AM_CFLAGS = -pedantic -std=gnu89
+check_LIBRARIES = libppl_c_tests.a
+libppl_c_tests_a_SOURCES = \
+ppl_c_test.cc
+
+
+# Dummy C++ source to cause C++ linking.
+nodist_EXTRA_libppl_c_tests_a_SOURCES = \
+dummy.cc
+
+libppl_c_tests_a_CPPFLAGS = \
+-I$(top_builddir)/interfaces/C \
+ at extra_includes@
+
+LDADD = \
+libppl_c_tests.a \
+$(top_builddir)/interfaces/C/libppl_c.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+formatted_output_SOURCES = \
+formatted_output.c \
+print_to_buffer.h \
+print_to_buffer.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_formatted_output_SOURCES = \
+dummy.cc
+
+pip_test_SOURCES = \
+pip_test.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_pip_test_SOURCES = \
+dummy.cc
+
+watchdog1_SOURCES = \
+watchdog1.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_watchdog1_SOURCES = \
+dummy.cc
+
+weightwatch1_SOURCES = \
+weightwatch1.c
+
+
+# Dummy C++ source to cause C++ linking.
+# FIXME: why isn't enough to do this for libppl_c_tests.a?
+nodist_EXTRA_weightwatch1_SOURCES = \
+dummy.cc
+
+noinst_HEADERS = \
+ppl_c_test.h
+
+BUGS = 
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/C/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkLIBRARIES:
+	-test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+
+libppl_c_tests.a: $(libppl_c_tests_a_OBJECTS) $(libppl_c_tests_a_DEPENDENCIES) $(EXTRA_libppl_c_tests_a_DEPENDENCIES) 
+	$(AM_V_at)-rm -f libppl_c_tests.a
+	$(AM_V_AR)$(libppl_c_tests_a_AR) libppl_c_tests.a $(libppl_c_tests_a_OBJECTS) $(libppl_c_tests_a_LIBADD)
+	$(AM_V_at)$(RANLIB) libppl_c_tests.a
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+formatted_output$(EXEEXT): $(formatted_output_OBJECTS) $(formatted_output_DEPENDENCIES) $(EXTRA_formatted_output_DEPENDENCIES) 
+	@rm -f formatted_output$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(formatted_output_OBJECTS) $(formatted_output_LDADD) $(LIBS)
+
+pip_test$(EXEEXT): $(pip_test_OBJECTS) $(pip_test_DEPENDENCIES) $(EXTRA_pip_test_DEPENDENCIES) 
+	@rm -f pip_test$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(pip_test_OBJECTS) $(pip_test_LDADD) $(LIBS)
+
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) $(EXTRA_watchdog1_DEPENDENCIES) 
+	@rm -f watchdog1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+
+weightwatch1$(EXEEXT): $(weightwatch1_OBJECTS) $(weightwatch1_DEPENDENCIES) $(EXTRA_weightwatch1_DEPENDENCIES) 
+	@rm -f weightwatch1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(weightwatch1_OBJECTS) $(weightwatch1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/formatted_output.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libppl_c_tests_a-dummy.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pip_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/print_to_buffer.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/weightwatch1.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+libppl_c_tests_a-ppl_c_test.o: ppl_c_test.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-ppl_c_test.o -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo -c -o libppl_c_tests_a-ppl_c_test.o `test -f 'ppl_c_test.cc' || echo '$(srcdir)/'`ppl_c_test.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ppl_c_test.cc' object='libppl_c_tests_a-ppl_c_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-ppl_c_test.o `test -f 'ppl_c_test.cc' || echo '$(srcdir)/'`ppl_c_test.cc
+
+libppl_c_tests_a-ppl_c_test.obj: ppl_c_test.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-ppl_c_test.obj -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo -c -o libppl_c_tests_a-ppl_c_test.obj `if test -f 'ppl_c_test.cc'; then $(CYGPATH_W) 'ppl_c_test.cc'; else $(CYGPATH_W) '$(srcdir)/ppl_c_test.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Tpo $(DEPDIR)/libppl_c_tests_a-ppl_c_test.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ppl_c_test.cc' object='libppl_c_tests_a-ppl_c_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-ppl_c_test.obj `if test -f 'ppl_c_test.cc'; then $(CYGPATH_W) 'ppl_c_test.cc'; else $(CYGPATH_W) '$(srcdir)/ppl_c_test.cc'; fi`
+
+libppl_c_tests_a-dummy.o: dummy.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-dummy.o -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-dummy.Tpo -c -o libppl_c_tests_a-dummy.o `test -f 'dummy.cc' || echo '$(srcdir)/'`dummy.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-dummy.Tpo $(DEPDIR)/libppl_c_tests_a-dummy.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dummy.cc' object='libppl_c_tests_a-dummy.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-dummy.o `test -f 'dummy.cc' || echo '$(srcdir)/'`dummy.cc
+
+libppl_c_tests_a-dummy.obj: dummy.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libppl_c_tests_a-dummy.obj -MD -MP -MF $(DEPDIR)/libppl_c_tests_a-dummy.Tpo -c -o libppl_c_tests_a-dummy.obj `if test -f 'dummy.cc'; then $(CYGPATH_W) 'dummy.cc'; else $(CYGPATH_W) '$(srcdir)/dummy.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libppl_c_tests_a-dummy.Tpo $(DEPDIR)/libppl_c_tests_a-dummy.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dummy.cc' object='libppl_c_tests_a-dummy.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libppl_c_tests_a_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libppl_c_tests_a-dummy.obj `if test -f 'dummy.cc'; then $(CYGPATH_W) 'dummy.cc'; else $(CYGPATH_W) '$(srcdir)/dummy.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_LIBRARIES) $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+formatted_output.log: formatted_output$(EXEEXT)
+	@p='formatted_output$(EXEEXT)'; \
+	b='formatted_output'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pip_test.log: pip_test$(EXEEXT)
+	@p='pip_test$(EXEEXT)'; \
+	b='pip_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+watchdog1.log: watchdog1$(EXEEXT)
+	@p='watchdog1$(EXEEXT)'; \
+	b='watchdog1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+weightwatch1.log: weightwatch1$(EXEEXT)
+	@p='weightwatch1$(EXEEXT)'; \
+	b='weightwatch1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
+	clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkLIBRARIES clean-checkPROGRAMS clean-generic \
+	clean-libtool cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am recheck tags tags-am uninstall \
+	uninstall-am
+
+
+$(top_builddir)/interfaces/C/libppl_c.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces/C libppl_c.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/C/tests/formatted_output.c b/interfaces/C/tests/formatted_output.c
new file mode 100644
index 0000000..34ee030
--- /dev/null
+++ b/interfaces/C/tests/formatted_output.c
@@ -0,0 +1,64 @@
+/* Test the use of C++ output facilities from C code.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+
+#include "print_to_buffer.h"
+#include <stdio.h>
+
+#define DIMENSION 100
+
+int
+main() {
+  int i;
+  mpz_t z;
+  ppl_Coefficient_t coeff;
+  ppl_Linear_Expression_t le;
+  ppl_Constraint_t c;
+  ppl_Constraint_System_t cs;
+  char* p;
+
+  mpz_init_set_si(z, 1);
+  ppl_initialize();
+  ppl_new_Coefficient(&coeff);
+  ppl_assign_Coefficient_from_mpz_t(coeff, z);
+  ppl_new_Constraint_System(&cs);
+  for (i = 0; i < DIMENSION; ++i) {
+    ppl_new_Linear_Expression_with_dimension(&le, DIMENSION);
+    ppl_Linear_Expression_add_to_coefficient(le, i, coeff);
+    ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+    ppl_Constraint_System_insert_Constraint(cs, c);
+    ppl_delete_Constraint(c);
+    ppl_delete_Linear_Expression(le);
+  }
+  p = print_ppl_Constraint_System_to_buffer(cs, 4, 64, 64);
+  if (check_noisy()) {
+    if (p == 0)
+      printf("print_ppl_Constraint_System_to_buffer() returned NULL!\n");
+    else
+      printf("    %s\n", p);
+  }
+  ppl_delete_Constraint_System(cs);
+  ppl_finalize();
+  return 0;
+}
diff --git a/interfaces/C/tests/pip_test.c b/interfaces/C/tests/pip_test.c
new file mode 100644
index 0000000..6d72200
--- /dev/null
+++ b/interfaces/C/tests/pip_test.c
@@ -0,0 +1,272 @@
+/* Test the use of the PPL PIP solver from C code.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+static const char* program_name = 0;
+
+static void
+my_exit(int status) {
+  (void) ppl_finalize();
+  exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+  va_list ap;
+  fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+  my_exit(1);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+              const char* description) {
+  fatal("PPL error code %d: %s", code, description);
+}
+
+static void
+display_solution_i(ppl_const_PIP_Tree_Node_t node,
+                   ppl_dimension_type n_vars,
+                   ppl_dimension_type n_params,
+                   const ppl_dimension_type vars[],
+                   const ppl_dimension_type parameters[],
+                   int indent) {
+  if (!node) {
+    /* A null pointer indicates the polyhedron is empty. */
+    printf("%*s_|_\n", indent*2, "");
+  }
+  else {
+    ppl_dimension_type space_dimension = n_vars + n_params;
+    ppl_dimension_type new_params;
+    ppl_const_Constraint_System_t constraints;
+    ppl_const_PIP_Decision_Node_t dn;
+    int constraints_empty;
+    ppl_PIP_Tree_Node_number_of_artificials(node, &new_params);
+    if (new_params > 0) {
+      /* Display the artificial parameters. */
+      ppl_Artificial_Parameter_Sequence_const_iterator_t i, i_end;
+      ppl_new_Artificial_Parameter_Sequence_const_iterator(&i);
+      ppl_new_Artificial_Parameter_Sequence_const_iterator(&i_end);
+      ppl_PIP_Tree_Node_begin(node, i);
+      ppl_PIP_Tree_Node_end(node, i_end);
+      while (!ppl_Artificial_Parameter_Sequence_const_iterator_equal_test
+              (i,i_end)) {
+        ppl_const_Artificial_Parameter_t ap;
+        ppl_Artificial_Parameter_Sequence_const_iterator_dereference(i, &ap);
+        printf("%*sParameter ", indent*2, "");
+        ppl_io_print_variable(space_dimension++);
+        printf(" = ");
+        ppl_io_print_Artificial_Parameter(ap);
+        printf("\n");
+        ppl_Artificial_Parameter_Sequence_const_iterator_increment(i);
+      }
+      ppl_delete_Artificial_Parameter_Sequence_const_iterator(i_end);
+      ppl_delete_Artificial_Parameter_Sequence_const_iterator(i);
+    }
+
+    ppl_PIP_Tree_Node_get_constraints(node, &constraints);
+    constraints_empty = ppl_Constraint_System_empty(constraints);
+    if (!constraints_empty) {
+      /* Display the constraints on the parameters. */
+      int notfirst = 0;
+      ppl_Constraint_System_const_iterator_t end, i;
+      ppl_new_Constraint_System_const_iterator(&i);
+      ppl_new_Constraint_System_const_iterator(&end);
+      ppl_Constraint_System_begin(constraints, i);
+      ppl_Constraint_System_end(constraints, end);
+      printf("%*sif ", indent*2, "");
+      for (; !ppl_Constraint_System_const_iterator_equal_test(i,end);
+           ppl_Constraint_System_const_iterator_increment(i)) {
+        ppl_const_Constraint_t c;
+        if (notfirst)
+          printf(" and ");
+        ppl_Constraint_System_const_iterator_dereference(i, &c);
+        ppl_io_print_Constraint(c);
+        notfirst = 1;
+      }
+      printf(" then\n");
+    }
+    ppl_PIP_Tree_Node_as_decision(node, &dn);
+    if (dn) {
+      /* The node is a decision Node: display the children nodes. */
+      ppl_const_PIP_Tree_Node_t child;
+      ppl_PIP_Decision_Node_get_child_node(dn, 1, &child);
+      display_solution_i(child, n_vars, n_params, vars, parameters, indent+1);
+      printf("%*selse\n", indent*2, "");
+      ppl_PIP_Decision_Node_get_child_node(dn, 0, &child);
+      display_solution_i(child, n_vars, n_params, vars, parameters, indent+1);
+    }
+    else {
+      /* The node is a solution Node: display the expression of the vars. */
+      int notfirst = 0;
+      ppl_const_PIP_Solution_Node_t sn;
+      ppl_dimension_type i;
+      ppl_const_Linear_Expression_t le;
+      ppl_PIP_Tree_Node_as_solution(node, &sn);
+      printf("%*s{", indent*2+(constraints_empty?0:2), "");
+      for (i=0; i<n_vars; ++i) {
+        if (notfirst)
+          printf(" ; ");
+        ppl_PIP_Solution_Node_get_parametric_values(sn, vars[i], &le);
+        ppl_io_print_Linear_Expression(le);
+        notfirst = 1;
+      }
+      printf("}\n");
+      if (!constraints_empty)
+        printf("%*selse\n%*s_|_\n", indent*2, "", indent*2+2, "");
+    }
+  }
+}
+
+static void
+display_solution(ppl_const_PIP_Tree_Node_t node,
+                 ppl_dimension_type n_vars,
+                 ppl_dimension_type n_params,
+                 const ppl_dimension_type params[]) {
+  ppl_dimension_type* vars;
+  ppl_dimension_type i, j, k, dim;
+  vars = malloc(n_vars*sizeof(ppl_dimension_type));
+  dim = n_vars+n_params;
+
+  /* Construct the array of variable space indices. This requires the
+     params array to be sorted in ascending order. */
+  for (i = 0, j = 0, k = 0; i < dim; ++i) {
+    if (k == n_params || i < params[k])
+      vars[j++] = i;
+    else
+      ++k;
+  }
+  display_solution_i(node, n_vars, n_params, vars, params, 0);
+  free(vars);
+}
+
+#define N_VARS 2
+#define N_PARAMETERS 2
+#define N_CONSTRAINTS 4
+
+int
+main(int argc, char **argv) {
+  ppl_PIP_Problem_t pip;
+  ppl_Constraint_t ct;
+  ppl_Coefficient_t c;
+  ppl_Linear_Expression_t le;
+  ppl_dimension_type i, j;
+  mpz_t mpc;
+  int ok;
+  size_t sz = 0;
+
+  static ppl_dimension_type parameter_dim[N_PARAMETERS];
+
+  static int coef[N_CONSTRAINTS][N_VARS+N_PARAMETERS+1] = {
+    {  2,  3,  0,  0, -8 },
+    {  4, -1,  0,  0, -4 },
+    {  0, -1,  0,  1,  0 },
+    { -1,  0,  1,  0,  0 },
+  };
+
+  program_name = argv[0];
+
+  if (argc != 1) {
+    fprintf(stderr, "usage: %s\n", program_name);
+    exit(1);
+  }
+
+  if (ppl_initialize() < 0)
+    fatal("cannot initialize the Parma Polyhedra Library");
+
+  if (ppl_set_error_handler(error_handler) < 0)
+    fatal("cannot install the custom error handler");
+
+  mpz_init(mpc);
+
+  /* At least 32-bit coefficients are needed. */
+  if (ppl_Coefficient_max(mpc) > 0 && mpz_fits_sshort_p(mpc)) {
+    mpz_clear(mpc);
+    ppl_finalize();
+    return 0;
+  }
+
+  for (i = 0; i < N_PARAMETERS; ++i)
+    parameter_dim[i] = i + N_VARS;
+
+  ppl_new_PIP_Problem_from_space_dimension(&pip, N_VARS+N_PARAMETERS);
+  ppl_PIP_Problem_add_to_parameter_space_dimensions(pip, parameter_dim,
+                                                    N_PARAMETERS);
+  ppl_new_Coefficient(&c);
+  for (i = 0; i < N_CONSTRAINTS; ++i) {
+    ppl_new_Linear_Expression(&le);
+    for (j = 0; j < N_VARS+N_PARAMETERS; ++j) {
+      mpz_set_si(mpc, coef[i][j]);
+      ppl_assign_Coefficient_from_mpz_t(c, mpc);
+      ppl_Linear_Expression_add_to_coefficient(le, j, c);
+    }
+    mpz_set_si(mpc, coef[i][j]);
+    ppl_assign_Coefficient_from_mpz_t(c, mpc);
+    ppl_Linear_Expression_add_to_inhomogeneous(le, c);
+    ppl_new_Constraint(&ct, le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL);
+    ppl_PIP_Problem_add_constraint(pip, ct);
+    ppl_delete_Linear_Expression(le);
+  }
+  ppl_delete_Coefficient(c);
+  mpz_clear(mpc);
+
+  ppl_PIP_Problem_total_memory_in_bytes(pip, &sz);
+  ppl_PIP_Problem_external_memory_in_bytes(pip, &sz);
+
+  ok = (ppl_PIP_Problem_solve(pip) == PPL_PIP_PROBLEM_STATUS_OPTIMIZED);
+  if (ok) {
+    ppl_dimension_type dim;
+    ppl_const_PIP_Tree_Node_t solution;
+    ppl_PIP_Problem_t pip0;
+    ppl_Constraint_System_t constraints;
+    ppl_Constraint_System_const_iterator_t begin, end;
+
+    ppl_PIP_Problem_space_dimension(pip, &dim);
+    ppl_PIP_Problem_solution(pip, &solution);
+    if (check_noisy() || check_very_noisy())
+      display_solution(solution, N_VARS, N_PARAMETERS, parameter_dim);
+    ppl_new_Constraint_System_const_iterator(&begin);
+    ppl_new_Constraint_System_const_iterator(&end);
+    ppl_new_Constraint_System_from_Constraint(&constraints, ct);
+    ppl_Constraint_System_begin(constraints, begin);
+    ppl_Constraint_System_end(constraints, end);
+    ppl_new_PIP_Problem_from_constraints(&pip0, N_VARS+N_PARAMETERS,
+                                         begin, end, N_PARAMETERS,
+                                         parameter_dim);
+    ok = ppl_PIP_Problem_OK(pip0);
+    ppl_delete_Constraint(ct);
+    ppl_delete_Constraint_System(constraints);
+  }
+
+  ppl_delete_PIP_Problem(pip);
+  ppl_finalize();
+  return ok ? 0 : 1;
+}
diff --git a/interfaces/C/tests/ppl_c_test.cc b/interfaces/C/tests/ppl_c_test.cc
new file mode 100644
index 0000000..759208d
--- /dev/null
+++ b/interfaces/C/tests/ppl_c_test.cc
@@ -0,0 +1,71 @@
+/* Implementation of utility functions used in test programs
+   of the C interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+
+// The following inclusion of <cstdio> prior to "ppl_c_test.h" is to
+// work around a bug whereby some versions of <stdio.h> do not obey
+// clause D.5.2 of the C++ standard: "Each C header, whose name has
+// the form name.h, behaves as if each name placed in the Standard
+// library namespace by the corresponding cname header is also placed
+// within the namespace scope of the namespace std and is followed by
+// an explicit using-declaration (7.3.3)."  By including <cstdio>
+// prior to "ppl_c_test.h" we ensure std::FILE is defined at the time
+// when "ppl_c.h" will include <gmp.h>.
+#include <cstdio>
+
+#include "ppl_c_test.h"
+#include <cstdlib>
+
+namespace {
+
+static int
+check_noisy_variable(const char* environment_variable) {
+#if PPL_HAVE_DECL_GETENV
+  return getenv(environment_variable) != 0;
+#else
+#if NOISY
+  if (strcmp(environment_variable, "PPL_NOISY_TESTS") == 0)
+    return 1;
+#endif
+#if VERY_NOISY
+  if (strcmp(environment_variable, "PPL_VERY_NOISY_TESTS") == 0)
+    return 1;
+#endif
+  return 0;
+#endif
+}
+
+} // namespace
+
+int
+check_noisy() {
+  return check_noisy_variable("PPL_NOISY_TESTS");
+}
+
+int
+check_very_noisy() {
+  return check_noisy_variable("PPL_VERY_NOISY_TESTS");
+}
+
diff --git a/interfaces/C/tests/ppl_c_test.h b/interfaces/C/tests/ppl_c_test.h
new file mode 100644
index 0000000..b6bd8af
--- /dev/null
+++ b/interfaces/C/tests/ppl_c_test.h
@@ -0,0 +1,41 @@
+/* Header file for C test programs.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_c_test_h
+#define PPL_ppl_c_test_h 1
+
+#include "ppl_c.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int check_noisy(void);
+
+int check_very_noisy(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !defined(PPL_ppl_c_test_h) */
diff --git a/interfaces/C/tests/print_to_buffer.c b/interfaces/C/tests/print_to_buffer.c
new file mode 100644
index 0000000..88dde25
--- /dev/null
+++ b/interfaces/C/tests/print_to_buffer.c
@@ -0,0 +1,68 @@
+/* Definitions of print_ppl_*_to_buffer() functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c.h"
+#include "print_to_buffer.h"
+#include <stdlib.h>
+#include <string.h>
+
+#define DEFINE_PRINT_TO_BUFFER(Type)                                    \
+char*                                                                   \
+ print_ppl_##Type##_to_buffer(ppl_const_##Type##_t p,                   \
+                              unsigned indent_depth,                    \
+                              unsigned preferred_first_line_length,     \
+                              unsigned preferred_line_length) {         \
+  char *buf, *ret;                                                      \
+  int r = ppl_io_asprint_##Type(&buf, p);                               \
+  if (r != 0)                                                           \
+    return 0;                                                           \
+  ret = ppl_io_wrap_string(buf, indent_depth,                           \
+                           preferred_first_line_length,                 \
+                           preferred_line_length);                      \
+  free(buf);                                                            \
+  return ret;                                                           \
+}
+
+DEFINE_PRINT_TO_BUFFER(Coefficient)
+
+DEFINE_PRINT_TO_BUFFER(Linear_Expression)
+
+DEFINE_PRINT_TO_BUFFER(Constraint)
+
+DEFINE_PRINT_TO_BUFFER(Constraint_System)
+
+DEFINE_PRINT_TO_BUFFER(Generator)
+
+DEFINE_PRINT_TO_BUFFER(Generator_System)
+
+DEFINE_PRINT_TO_BUFFER(Congruence)
+
+DEFINE_PRINT_TO_BUFFER(Congruence_System)
+
+DEFINE_PRINT_TO_BUFFER(Grid_Generator)
+
+DEFINE_PRINT_TO_BUFFER(Grid_Generator_System)
+
+DEFINE_PRINT_TO_BUFFER(MIP_Problem)
+
+DEFINE_PRINT_TO_BUFFER(PIP_Problem)
diff --git a/interfaces/C/tests/print_to_buffer.h b/interfaces/C/tests/print_to_buffer.h
new file mode 100644
index 0000000..15512ad
--- /dev/null
+++ b/interfaces/C/tests/print_to_buffer.h
@@ -0,0 +1,82 @@
+/* Declarations of print_ppl_*_to_buffer() functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_print_to_buffer_h
+#define PPL_print_to_buffer_h 1
+
+#include "ppl_c.h"
+
+/*
+  Returns a buffer allocated with malloc() containing a printable
+  representation of the PPL object referenced by `p', where each
+  newline is followed by `indent_depth' blank spaces and the preferred
+  maximum length of the first and the following lines are given by
+  `preferred_first_line_length' and `preferred_line_length',
+  respectively.
+*/
+#define DECLARE_PRINT_TO_BUFFER(Type)                                   \
+char*                                                                   \
+print_ppl_##Type##_to_buffer(ppl_const_##Type##_t p,                    \
+                             unsigned indent_depth,                     \
+                             unsigned preferred_first_line_length,      \
+                             unsigned preferred_line_length);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DECLARE_PRINT_TO_BUFFER(Coefficient)
+
+DECLARE_PRINT_TO_BUFFER(Linear_Expression)
+
+DECLARE_PRINT_TO_BUFFER(Constraint)
+
+DECLARE_PRINT_TO_BUFFER(Constraint_System)
+
+DECLARE_PRINT_TO_BUFFER(Constraint_System_const_iterator)
+
+DECLARE_PRINT_TO_BUFFER(Generator)
+
+DECLARE_PRINT_TO_BUFFER(Generator_System)
+
+DECLARE_PRINT_TO_BUFFER(Generator_System_const_iterator)
+
+DECLARE_PRINT_TO_BUFFER(Congruence)
+
+DECLARE_PRINT_TO_BUFFER(Congruence_System)
+
+DECLARE_PRINT_TO_BUFFER(Grid_Generator)
+
+DECLARE_PRINT_TO_BUFFER(Grid_Generator_System)
+
+DECLARE_PRINT_TO_BUFFER(MIP_Problem)
+
+DECLARE_PRINT_TO_BUFFER(PIP_Problem)
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef DECLARE_PRINT_TO_BUFFER
+
+#endif /* !defined(PPL_print_to_buffer_h) */
diff --git a/interfaces/C/tests/watchdog1.c b/interfaces/C/tests/watchdog1.c
new file mode 100644
index 0000000..fd429e8
--- /dev/null
+++ b/interfaces/C/tests/watchdog1.c
@@ -0,0 +1,149 @@
+/* Test the timeout facility of the PPL C interface library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+static const char* program_name = 0;
+
+static void
+my_exit(int status) {
+  (void) ppl_finalize();
+  exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+  va_list ap;
+  fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+  my_exit(1);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+              const char* description) {
+  if (check_noisy() || check_very_noisy())
+    fprintf(stderr, "PPL error code %d: %s\n", code, description);
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  /* If Watchdog objects are not supported, a logic error will occur:
+     this is normal. */
+  if (code == PPL_ERROR_LOGIC_ERROR)
+    my_exit(0);
+#endif /* !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED */
+}
+
+void
+open_hypercube(int dimension, ppl_Polyhedron_t ph) {
+  int i;
+  mpz_t z_one;
+  mpz_t z_minus_one;
+  ppl_Coefficient_t coeff_one;
+  ppl_Coefficient_t coeff_minus_one;
+  ppl_Linear_Expression_t le;
+  ppl_Constraint_t c;
+  ppl_Constraint_System_t cs;
+
+  mpz_init_set_si(z_one, 1);
+  mpz_init_set_si(z_minus_one, -1);
+  ppl_new_Coefficient(&coeff_one);
+  ppl_assign_Coefficient_from_mpz_t(coeff_one, z_one);
+  ppl_new_Coefficient(&coeff_minus_one);
+  ppl_assign_Coefficient_from_mpz_t(coeff_minus_one, z_minus_one);
+  ppl_new_Linear_Expression_with_dimension(&le, dimension);
+  ppl_new_Constraint_System(&cs);
+  for (i = 0; i < dimension; ++i) {
+    ppl_Linear_Expression_add_to_coefficient(le, i, coeff_one);
+    /* Variable(i) > 0 */
+    ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_THAN);
+    ppl_Constraint_System_insert_Constraint(cs, c);
+    ppl_delete_Constraint(c);
+    /* Variable(i) < 1 */
+    ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_minus_one);
+    ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_LESS_THAN);
+    ppl_Constraint_System_insert_Constraint(cs, c);
+    ppl_delete_Constraint(c);
+    /* Zero `le' */
+    ppl_Linear_Expression_add_to_coefficient(le, i, coeff_minus_one);
+    ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_one);
+  }
+  ppl_Polyhedron_add_constraints(ph, cs);
+  ppl_delete_Constraint_System(cs);
+  ppl_delete_Linear_Expression(le);
+  ppl_delete_Coefficient(coeff_minus_one);
+  ppl_delete_Coefficient(coeff_one);
+  mpz_clear(z_minus_one);
+  mpz_clear(z_one);
+}
+
+void
+timed_compute_open_hypercube_generators(int csecs, int max_dimension) {
+  int i;
+  int result;
+  ppl_const_Generator_System_t gs;
+  ppl_Polyhedron_t ph;
+
+  for (i = 0; i <= max_dimension; ++i) {
+    ppl_new_NNC_Polyhedron_from_space_dimension(&ph, i, 0);
+    open_hypercube(i, ph);
+    ppl_set_timeout(csecs);
+    result = ppl_Polyhedron_get_generators(ph, &gs);
+    ppl_reset_timeout();
+    ppl_delete_Polyhedron(ph);
+    if (result == PPL_TIMEOUT_EXCEPTION)
+      /* Timeout expired */
+      return;
+    else if (result != 0)
+      /* Unexpected error */
+      exit(1);
+  }
+  /* Should not reach this point */
+  exit(1);
+}
+
+int
+main(int argc, char **argv) {
+  program_name = argv[0];
+
+  if (argc != 1) {
+    fprintf(stderr, "usage: %s\n", program_name);
+    exit(1);
+  }
+
+  if (ppl_initialize() < 0)
+    fatal("cannot initialize the Parma Polyhedra Library");
+
+  if (ppl_set_error_handler(error_handler) < 0)
+    fatal("cannot install the custom error handler");
+
+  timed_compute_open_hypercube_generators(200, 20);
+
+  ppl_finalize();
+  return 0;
+}
+
diff --git a/interfaces/C/tests/weightwatch1.c b/interfaces/C/tests/weightwatch1.c
new file mode 100644
index 0000000..92cfa69
--- /dev/null
+++ b/interfaces/C/tests/weightwatch1.c
@@ -0,0 +1,144 @@
+/* Test the deterministic timeout facility of the PPL C interface library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_c_test.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+static const char* program_name = 0;
+
+static void
+my_exit(int status) {
+  (void) ppl_finalize();
+  exit(status);
+}
+
+static void
+fatal(const char* format, ...) {
+  va_list ap;
+  fprintf(stderr, "%s: ", program_name);
+  va_start(ap, format);
+  vfprintf(stderr, format, ap);
+  va_end(ap);
+  fprintf(stderr, "\n");
+  my_exit(1);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+              const char* description) {
+  if (check_noisy() || check_very_noisy())
+    fprintf(stderr, "PPL error code %d: %s\n", code, description);
+}
+
+void
+open_hypercube(int dimension, ppl_Polyhedron_t ph) {
+  int i;
+  mpz_t z_one;
+  mpz_t z_minus_one;
+  ppl_Coefficient_t coeff_one;
+  ppl_Coefficient_t coeff_minus_one;
+  ppl_Linear_Expression_t le;
+  ppl_Constraint_t c;
+  ppl_Constraint_System_t cs;
+
+  mpz_init_set_si(z_one, 1);
+  mpz_init_set_si(z_minus_one, -1);
+  ppl_new_Coefficient(&coeff_one);
+  ppl_assign_Coefficient_from_mpz_t(coeff_one, z_one);
+  ppl_new_Coefficient(&coeff_minus_one);
+  ppl_assign_Coefficient_from_mpz_t(coeff_minus_one, z_minus_one);
+  ppl_new_Linear_Expression_with_dimension(&le, dimension);
+  ppl_new_Constraint_System(&cs);
+  for (i = 0; i < dimension; ++i) {
+    ppl_Linear_Expression_add_to_coefficient(le, i, coeff_one);
+    /* Variable(i) > 0 */
+    ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_THAN);
+    ppl_Constraint_System_insert_Constraint(cs, c);
+    ppl_delete_Constraint(c);
+    /* Variable(i) < 1 */
+    ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_minus_one);
+    ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_LESS_THAN);
+    ppl_Constraint_System_insert_Constraint(cs, c);
+    ppl_delete_Constraint(c);
+    /* Zero `le' */
+    ppl_Linear_Expression_add_to_coefficient(le, i, coeff_minus_one);
+    ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_one);
+  }
+  ppl_Polyhedron_add_constraints(ph, cs);
+  ppl_delete_Constraint_System(cs);
+  ppl_delete_Linear_Expression(le);
+  ppl_delete_Coefficient(coeff_minus_one);
+  ppl_delete_Coefficient(coeff_one);
+  mpz_clear(z_minus_one);
+  mpz_clear(z_one);
+}
+
+void
+weighted_compute_open_hypercube_generators(unsigned long weight,
+                                           int max_dimension) {
+  int i;
+  int result;
+  ppl_const_Generator_System_t gs;
+  ppl_Polyhedron_t ph;
+
+  for (i = 0; i <= max_dimension; ++i) {
+    ppl_new_NNC_Polyhedron_from_space_dimension(&ph, i, 0);
+    open_hypercube(i, ph);
+    ppl_set_deterministic_timeout(weight, 0);
+    result = ppl_Polyhedron_get_generators(ph, &gs);
+    ppl_reset_deterministic_timeout();
+    ppl_delete_Polyhedron(ph);
+    if (result == PPL_TIMEOUT_EXCEPTION)
+      /* Deterministic timeout expired */
+      return;
+    else if (result != 0)
+      /* Unexpected error */
+      exit(1);
+  }
+  /* Should not reach this point */
+  exit(1);
+}
+
+int
+main(int argc, char **argv) {
+  program_name = argv[0];
+
+  if (argc != 1) {
+    fprintf(stderr, "usage: %s\n", program_name);
+    exit(1);
+  }
+
+  if (ppl_initialize() < 0)
+    fatal("cannot initialize the Parma Polyhedra Library");
+
+  if (ppl_set_error_handler(error_handler) < 0)
+    fatal("cannot install the custom error handler");
+
+  weighted_compute_open_hypercube_generators(1000, 20);
+
+  ppl_finalize();
+  return 0;
+}
+
diff --git a/interfaces/Java/Makefile.am b/interfaces/Java/Makefile.am
new file mode 100644
index 0000000..204bafe
--- /dev/null
+++ b/interfaces/Java/Makefile.am
@@ -0,0 +1,46 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = parma_polyhedra_library jni . tests
+
+EXTRA_DIST = \
+ppl_interface_generator_java_procedure_generators.m4 \
+README.java
+
+interface_generator_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_java_procedure_generators.m4
+
+jardir = $(pkglibdir)
+jar_DATA = ppl_java.jar
+
+ppl_java.jar: parma_polyhedra_library/java_classes.stamp
+	$(JAR) cf ppl_java.jar parma_polyhedra_library/*.class
+
+CLEANFILES = ppl_java.jar
+
+parma_polyhedra_library/java_classes.stamp:
+	$(MAKE) $(AM_MAKEFLAGS) -C parma_polyhedra_library java_classes.stamp
diff --git a/interfaces/Java/Makefile.in b/interfaces/Java/Makefile.in
new file mode 100644
index 0000000..1af349b
--- /dev/null
+++ b/interfaces/Java/Makefile.in
@@ -0,0 +1,801 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(jardir)"
+DATA = $(jar_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = parma_polyhedra_library jni . tests
+EXTRA_DIST = \
+ppl_interface_generator_java_procedure_generators.m4 \
+README.java
+
+interface_generator_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_java_procedure_generators.m4
+
+jardir = $(pkglibdir)
+jar_DATA = ppl_java.jar
+CLEANFILES = ppl_java.jar
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Java/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-jarDATA: $(jar_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(jar_DATA)'; test -n "$(jardir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(jardir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(jardir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(jardir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(jardir)" || exit $$?; \
+	done
+
+uninstall-jarDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(jar_DATA)'; test -n "$(jardir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(jardir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(jardir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-jarDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-jarDATA
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-jarDATA \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-jarDATA
+
+
+ppl_java.jar: parma_polyhedra_library/java_classes.stamp
+	$(JAR) cf ppl_java.jar parma_polyhedra_library/*.class
+
+parma_polyhedra_library/java_classes.stamp:
+	$(MAKE) $(AM_MAKEFLAGS) -C parma_polyhedra_library java_classes.stamp
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/README.java b/interfaces/Java/README.java
new file mode 100644
index 0000000..48a6ee5
--- /dev/null
+++ b/interfaces/Java/README.java
@@ -0,0 +1,58 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The Java interface of the Parma Polyhedra Library has been tested
+with both Sun's JDK 6 (http://java.sun.com/javase/downloads/)
+and the open-source OpenJDK 6 (http://openjdk.java.net/).
+
+The Java interface provides the `parma_polyhedra_library' package:
+after installing the Parma Polyhedra Library in <PPL prefix>,
+the ppl_java.jar JAR file and the JNI shared object will be installed
+in directory <PPL prefix>/<libdir>/ppl.
+
+The Java compilation command for `My_Test.java' should then be
+something like:
+
+$ javac -classpath .:<PPL prefix>/<libdir>/ppl/ppl_java.jar My_Test.java
+
+This will produce class file My_Test.class, which can then be executed
+by issuing a command like:
+
+$ java -classpath .:<PPL prefix>/<libdir>/ppl/ppl_java.jar My_Test
+
+Note that the source code in My_Test.java should take care of:
+
+a) Load the PPL interface library, by calling `System.load' and
+   passing the full path of the dynamic shared object. For instance,
+   on a Linux machine and assuming <PPL prefix>=/usr/local/, the call
+   will be something like:
+
+     System.load("/usr/local/lib/ppl/libppl_java.so");
+
+b) Make sure that only the intended version(s) of the library has been
+   loaded, e.g., by calling static method
+
+     Parma_Polyhedra_Library.version();
+
+c) Starting from PPL version 0.11, before calling any other method from
+   other PPL package classes, initialize the Java interface by calling
+   the static method
+
+     Parma_Polyhedra_Library.initialize_library();
+
+   When done using the library, finalize it by calling the static method
+
+     Parma_Polyhedra_Library.finalize_library();
+
+   After finalization no other method of the library may be used (except
+   for those in class Parma_Polyhedra_Library), unless the library
+   is re-initialized by calling initialize_library().
diff --git a/interfaces/Java/jni/Makefile.am b/interfaces/Java/jni/Makefile.am
new file mode 100644
index 0000000..33a9d0e
--- /dev/null
+++ b/interfaces/Java/jni/Makefile.am
@@ -0,0 +1,205 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+interface_generator_files = \
+ppl_interface_generator_java_classes_cc_files.m4 \
+ppl_interface_generator_java_classes_cc_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+EXTRA_DIST = \
+$(interface_generator_files)
+
+if HOST_OS_MINGW
+
+JNI_DEFINE_OPTIONS = -D_JNI_IMPLEMENTATION_
+
+endif HOST_OS_MINGW
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/src \
+-I../parma_polyhedra_library \
+-I$(top_srcdir)/src \
+ at extra_includes@ @JNIFLAGS@ $(JNI_DEFINE_OPTIONS)
+
+BUILT_SOURCES = \
+ppl_java_implementation_domains.cc.stamp
+
+pkglib_LTLIBRARIES = libppl_java.la
+
+# There is no point in generating the static version.
+AM_LIBTOOLFLAGS = --tag=disable-static
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+if HOST_OS_DARWIN
+
+libppl_java_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-avoid-version \
+-shrext .jnilib
+
+else !HOST_OS_DARWIN
+
+if HOST_OS_MINGW
+
+libppl_java_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version \
+-Wl,--kill-at
+
+else !HOST_OS_MINGW
+
+libppl_java_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+endif !HOST_OS_MINGW
+
+endif !HOST_OS_DARWIN
+
+libppl_java_la_SOURCES = \
+ppl_java_common_defs.hh \
+ppl_java_common_inlines.hh \
+ppl_java_common.cc \
+ppl_java_globals.cc
+
+nodist_EXTRA_libppl_java_la_SOURCES = \
+ppl_java_Termination.cc \
+ppl_java_Int8_Box.cc \
+ppl_java_Int16_Box.cc \
+ppl_java_Int32_Box.cc \
+ppl_java_Int64_Box.cc \
+ppl_java_Uint8_Box.cc \
+ppl_java_Uint16_Box.cc \
+ppl_java_Uint32_Box.cc \
+ppl_java_Uint64_Box.cc \
+ppl_java_Float_Box.cc \
+ppl_java_Double_Box.cc \
+ppl_java_Long_Double_Box.cc \
+ppl_java_Rational_Box.cc \
+ppl_java_Z_Box.cc \
+ppl_java_BD_Shape_int8_t.cc \
+ppl_java_BD_Shape_int16_t.cc \
+ppl_java_BD_Shape_int32_t.cc \
+ppl_java_BD_Shape_int64_t.cc \
+ppl_java_BD_Shape_float.cc \
+ppl_java_BD_Shape_double.cc \
+ppl_java_BD_Shape_long_double.cc \
+ppl_java_BD_Shape_mpq_class.cc \
+ppl_java_BD_Shape_mpz_class.cc \
+ppl_java_Octagonal_Shape_int8_t.cc \
+ppl_java_Octagonal_Shape_int16_t.cc \
+ppl_java_Octagonal_Shape_int32_t.cc \
+ppl_java_Octagonal_Shape_int64_t.cc \
+ppl_java_Octagonal_Shape_float.cc \
+ppl_java_Octagonal_Shape_double.cc \
+ppl_java_Octagonal_Shape_long_double.cc \
+ppl_java_Octagonal_Shape_mpq_class.cc \
+ppl_java_Octagonal_Shape_mpz_class.cc \
+ppl_java_Polyhedron.cc \
+ppl_java_Grid.cc \
+ppl_java_Pointset_Powerset_Int8_Box.cc \
+ppl_java_Pointset_Powerset_Int16_Box.cc \
+ppl_java_Pointset_Powerset_Int32_Box.cc \
+ppl_java_Pointset_Powerset_Int64_Box.cc \
+ppl_java_Pointset_Powerset_Uint8_Box.cc \
+ppl_java_Pointset_Powerset_Uint16_Box.cc \
+ppl_java_Pointset_Powerset_Uint32_Box.cc \
+ppl_java_Pointset_Powerset_Uint64_Box.cc \
+ppl_java_Pointset_Powerset_Float_Box.cc \
+ppl_java_Pointset_Powerset_Double_Box.cc \
+ppl_java_Pointset_Powerset_Long_Double_Box.cc \
+ppl_java_Pointset_Powerset_Rational_Box.cc \
+ppl_java_Pointset_Powerset_Z_Box.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_float.cc \
+ppl_java_Pointset_Powerset_BD_Shape_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_C_Polyhedron.cc \
+ppl_java_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_java_Pointset_Powerset_Grid.cc \
+ppl_java_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_java_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_java_la_LIBADD = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_java_la_DEPENDENCIES = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@
+
+ppl_java_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_classes_cc_files.m4 \
+                > ppl_java_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_java_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_java_cc_blob
+	rm -f ppl_java_cc_blob
+	echo timestamp >$@
+
+CLEANFILES = \
+ppl_java_Termination.cc \
+ at required_instantiations_java_cxx_sources@ \
+ppl_java_implementation_domains.cc.stamp
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_java_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_java_la_SOURCES):
diff --git a/interfaces/Java/jni/Makefile.in b/interfaces/Java/jni/Makefile.in
new file mode 100644
index 0000000..fed5b4c
--- /dev/null
+++ b/interfaces/Java/jni/Makefile.in
@@ -0,0 +1,1006 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/jni
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am_libppl_java_la_OBJECTS = ppl_java_common.lo ppl_java_globals.lo
+libppl_java_la_OBJECTS = $(am_libppl_java_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_java_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_java_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_java_la_SOURCES) \
+	$(nodist_EXTRA_libppl_java_la_SOURCES)
+DIST_SOURCES = $(libppl_java_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+interface_generator_files = \
+ppl_interface_generator_java_classes_cc_files.m4 \
+ppl_interface_generator_java_classes_cc_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+EXTRA_DIST = \
+$(interface_generator_files)
+
+ at HOST_OS_MINGW_TRUE@JNI_DEFINE_OPTIONS = -D_JNI_IMPLEMENTATION_
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_builddir)/src \
+-I../parma_polyhedra_library \
+-I$(top_srcdir)/src \
+ at extra_includes@ @JNIFLAGS@ $(JNI_DEFINE_OPTIONS)
+
+BUILT_SOURCES = \
+ppl_java_implementation_domains.cc.stamp
+
+pkglib_LTLIBRARIES = libppl_java.la
+
+# There is no point in generating the static version.
+AM_LIBTOOLFLAGS = --tag=disable-static
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE at libppl_java_la_LDFLAGS = \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE@$(NO_UNDEFINED_FLAG) \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE at -module \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_FALSE at -avoid-version
+
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at libppl_java_la_LDFLAGS = \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE@$(NO_UNDEFINED_FLAG) \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at -module \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at -avoid-version \
+ at HOST_OS_DARWIN_FALSE@@HOST_OS_MINGW_TRUE at -Wl,--kill-at
+
+ at HOST_OS_DARWIN_TRUE@libppl_java_la_LDFLAGS = \
+ at HOST_OS_DARWIN_TRUE@$(NO_UNDEFINED_FLAG) \
+ at HOST_OS_DARWIN_TRUE@-avoid-version \
+ at HOST_OS_DARWIN_TRUE@-shrext .jnilib
+
+libppl_java_la_SOURCES = \
+ppl_java_common_defs.hh \
+ppl_java_common_inlines.hh \
+ppl_java_common.cc \
+ppl_java_globals.cc
+
+nodist_EXTRA_libppl_java_la_SOURCES = \
+ppl_java_Termination.cc \
+ppl_java_Int8_Box.cc \
+ppl_java_Int16_Box.cc \
+ppl_java_Int32_Box.cc \
+ppl_java_Int64_Box.cc \
+ppl_java_Uint8_Box.cc \
+ppl_java_Uint16_Box.cc \
+ppl_java_Uint32_Box.cc \
+ppl_java_Uint64_Box.cc \
+ppl_java_Float_Box.cc \
+ppl_java_Double_Box.cc \
+ppl_java_Long_Double_Box.cc \
+ppl_java_Rational_Box.cc \
+ppl_java_Z_Box.cc \
+ppl_java_BD_Shape_int8_t.cc \
+ppl_java_BD_Shape_int16_t.cc \
+ppl_java_BD_Shape_int32_t.cc \
+ppl_java_BD_Shape_int64_t.cc \
+ppl_java_BD_Shape_float.cc \
+ppl_java_BD_Shape_double.cc \
+ppl_java_BD_Shape_long_double.cc \
+ppl_java_BD_Shape_mpq_class.cc \
+ppl_java_BD_Shape_mpz_class.cc \
+ppl_java_Octagonal_Shape_int8_t.cc \
+ppl_java_Octagonal_Shape_int16_t.cc \
+ppl_java_Octagonal_Shape_int32_t.cc \
+ppl_java_Octagonal_Shape_int64_t.cc \
+ppl_java_Octagonal_Shape_float.cc \
+ppl_java_Octagonal_Shape_double.cc \
+ppl_java_Octagonal_Shape_long_double.cc \
+ppl_java_Octagonal_Shape_mpq_class.cc \
+ppl_java_Octagonal_Shape_mpz_class.cc \
+ppl_java_Polyhedron.cc \
+ppl_java_Grid.cc \
+ppl_java_Pointset_Powerset_Int8_Box.cc \
+ppl_java_Pointset_Powerset_Int16_Box.cc \
+ppl_java_Pointset_Powerset_Int32_Box.cc \
+ppl_java_Pointset_Powerset_Int64_Box.cc \
+ppl_java_Pointset_Powerset_Uint8_Box.cc \
+ppl_java_Pointset_Powerset_Uint16_Box.cc \
+ppl_java_Pointset_Powerset_Uint32_Box.cc \
+ppl_java_Pointset_Powerset_Uint64_Box.cc \
+ppl_java_Pointset_Powerset_Float_Box.cc \
+ppl_java_Pointset_Powerset_Double_Box.cc \
+ppl_java_Pointset_Powerset_Long_Double_Box.cc \
+ppl_java_Pointset_Powerset_Rational_Box.cc \
+ppl_java_Pointset_Powerset_Z_Box.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_BD_Shape_float.cc \
+ppl_java_Pointset_Powerset_BD_Shape_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_java_Pointset_Powerset_C_Polyhedron.cc \
+ppl_java_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_java_Pointset_Powerset_Grid.cc \
+ppl_java_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_java_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_java_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_java_la_LIBADD = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_java_la_DEPENDENCIES = \
+ppl_java_Termination.lo \
+ at required_instantiations_java_cxx_objects@
+
+CLEANFILES = \
+ppl_java_Termination.cc \
+ at required_instantiations_java_cxx_sources@ \
+ppl_java_implementation_domains.cc.stamp
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/jni/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Java/jni/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+	}
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_java.la: $(libppl_java_la_OBJECTS) $(libppl_java_la_DEPENDENCIES) $(EXTRA_libppl_java_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_java_la_LINK) -rpath $(pkglibdir) $(libppl_java_la_OBJECTS) $(libppl_java_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Termination.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_java_globals.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkglibLTLIBRARIES
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkglibLTLIBRARIES install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-pkglibLTLIBRARIES
+
+
+ppl_java_implementation_domains.cc.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_classes_cc_files.m4 \
+                > ppl_java_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_java_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_java_cc_blob
+	rm -f ppl_java_cc_blob
+	echo timestamp >$@
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_java_implementation_domains.cc.stamp' target.
+$(nodist_EXTRA_libppl_java_la_SOURCES):
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4 b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
new file mode 100644
index 0000000..875936e
--- /dev/null
+++ b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_code.m4
@@ -0,0 +1,1607 @@
+m4_dnl  -*- C++ -*-
+m4_define(`dnl', `m4_dnl')
+m4_divert(-1)
+This m4 file contains the code for generating ppl_java_<CLASS_NAME>.cc
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
+
+FIXME: Find a way to avoid having these dummy macros.
+No code is needed for these procedure schemas in the Java interface
+as the tokens argument for widening and extrapolation is optional.
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+#include "parma_polyhedra_library_ at CLASS@_Iterator.h"
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_build_1cpp_1object
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+  @CPP_CLASS@::iterator* y_ptr
+    = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_y));
+  @CPP_CLASS@::iterator* this_ptr
+    = new @CPP_CLASS@::iterator(*y_ptr);
+  set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_equals
+(JNIEnv* env, jobject j_this, jobject j_y) {
+  try {
+    @CPP_CLASS@::iterator* this_ptr
+      = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+    @CPP_CLASS@::iterator* y_ptr
+      = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_y));
+    return *this_ptr == *y_ptr;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _@BEGINEND at _1iterator
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    jclass j_it_class
+      = env->FindClass("parma_polyhedra_library/@TOPOLOGY@@CLASS at _Iterator");
+    CHECK_RESULT_ASSERT(env, j_it_class);
+    jmethodID j_it_ctr_id = env->GetMethodID(j_it_class, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_it_ctr_id);
+    jobject j_it = env->NewObject(j_it_class, j_it_ctr_id);
+    CHECK_RESULT_RETURN(env, j_it, 0);
+    @TOPOLOGY@@CPP_CLASS@::iterator* ppl_it
+      = new @TOPOLOGY@@CPP_CLASS@::iterator(this_ptr->@BEGINEND@());
+    set_ptr(env, j_it, ppl_it);
+    return j_it;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_free
+(JNIEnv* env, jobject j_this) try {
+  if (!is_java_marked(env, j_this)) {
+    @CPP_CLASS@::iterator* this_ptr
+      = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+    delete this_ptr;
+    void* null_ptr = 0;
+    set_ptr(env, j_this, null_ptr);
+  }
+}
+CATCH_ALL
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_1Iterator_finalize
+(JNIEnv* env, jobject j_this) try {
+  if (!is_java_marked(env, j_this)) {
+    @CPP_CLASS@::iterator* this_ptr
+      = reinterpret_cast<@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+    delete this_ptr;
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _1Iterator_@A_INCDEC@
+(JNIEnv* env, jobject j_this) try {
+  @TOPOLOGY@@CPP_CLASS@::iterator* this_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+  m4_ at INCDEC@_cpp_name()(*this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_increment_cpp_name', `++')
+m4_define(`m4_decrement_cpp_name', `--')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _1Iterator_get_1disjunct
+(JNIEnv* env, jobject j_this) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@::iterator* this_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_this));
+    jclass j_class = env->FindClass("parma_polyhedra_library/@DISJUNCT_TOPOLOGY@@DISJUNCT@");
+    CHECK_RESULT_ASSERT(env, j_class);
+    jmethodID j_ctr_id = env->GetMethodID(j_class, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id);
+    jobject j_obj = env->NewObject(j_class, j_ctr_id);
+    CHECK_RESULT_RETURN(env, j_obj, 0);
+    set_ptr(env, j_obj,  &((*this_ptr)->pointset()), true);
+    return j_obj;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _drop_1disjunct
+(JNIEnv* env, jobject j_this, jobject j_it) try {
+  @TOPOLOGY@@CPP_CLASS@* this_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+  @TOPOLOGY@@CPP_CLASS@::iterator& itr
+    = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_it)));
+  itr = this_ptr->drop_disjunct(itr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _drop_1disjuncts
+(JNIEnv* env, jobject j_this, jobject j_first, jobject j_last) try {
+  @TOPOLOGY@@CPP_CLASS@::iterator* first_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_first));
+  @TOPOLOGY@@CPP_CLASS@::iterator* last_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@::iterator*>(get_ptr(env, j_last));
+  @TOPOLOGY@@CPP_CLASS@* this_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+  this_ptr->drop_disjuncts(*first_ptr, *last_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _add_1disjunct
+(JNIEnv* env, jobject j_this, jobject j_d) try {
+  @TOPOLOGY@@CPP_CLASS@* this_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+  @DISJUNCT_TOPOLOGY@@A_DISJUNCT@* d_ptr
+    = reinterpret_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(get_ptr(env, j_d));
+  this_ptr->add_disjunct(*d_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__JLparma_1polyhedra_1library_Degenerate_1Element_2
+(JNIEnv* env, jobject j_this, jlong j_dim, jobject j_degenerate_element) try {
+  dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+  jint j_degenerate_element_int
+    = env->CallIntMethod(j_degenerate_element,
+                         cached_FMIDs.Degenerate_Element_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  @TOPOLOGY@@CPP_CLASS@* this_ptr;
+  switch (j_degenerate_element_int) {
+  case 0:
+    this_ptr = new @TOPOLOGY@@CPP_CLASS@(ppl_dim, UNIVERSE);
+    break;
+  case 1:
+    this_ptr = new @TOPOLOGY@@CPP_CLASS@(ppl_dim, EMPTY);
+    break;
+  default:
+    PPL_JAVA_UNEXPECTED;
+    break;
+  }
+  set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lparma_1polyhedra_1library_@1FRIEND at _2
+(JNIEnv* env, jobject  j_this, jobject j_y) try {
+  @B_FRIEND@* y_ptr
+    = reinterpret_cast<@B_FRIEND@*>(get_ptr(env, j_y));
+  @TOPOLOGY@@CPP_CLASS@* this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr);
+  set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lparma_1polyhedra_1library_@1FRIEND at _2Lparma_1polyhedra_1library_Complexity_1Class_2
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_complexity) try {
+  @B_FRIEND@* y_ptr
+    = reinterpret_cast<@B_FRIEND@*>(get_ptr(env, j_y));
+  jint j_complexity_int
+    = env->CallIntMethod(j_complexity,
+                         cached_FMIDs.Complexity_Class_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  @TOPOLOGY@@CPP_CLASS@* this_ptr;
+  switch (j_complexity_int) {
+  case 0:
+    this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr, POLYNOMIAL_COMPLEXITY);
+    break;
+  case 1:
+    this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr, SIMPLEX_COMPLEXITY);
+    break;
+  case 2:
+    this_ptr = new @TOPOLOGY@@CPP_CLASS@(*y_ptr, ANY_COMPLEXITY);
+    break;
+  default:
+    PPL_JAVA_UNEXPECTED;
+    break;
+  }
+  set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _build_1cpp_1object__Lparma_1polyhedra_1library_@1!BUILD_REPRESENT at _1System_2
+(JNIEnv* env, jobject j_this, jobject j_iterable) try {
+  @!BUILD_REPRESENT at _System cs
+    = build_cxx_ at BUILD_REPRESENT@_system(env, j_iterable);
+  @TOPOLOGY@@CPP_CLASS@* this_ptr = new @TOPOLOGY@@CPP_CLASS@(cs at RECYCLE@);
+  set_ptr(env, j_this, this_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _@1UB_EXACT@
+(JNIEnv* env, jobject j_this, jobject j_y) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* this_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+    @TOPOLOGY@@CPP_CLASS@* y_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_y));
+    return this_ptr->@UB_EXACT@(*y_ptr);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _finalize
+(JNIEnv* env, jobject j_this) try {
+  if (!is_java_marked(env, j_this)) {
+    @TOPOLOGY@@CPP_CLASS@* this_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+    delete this_ptr;
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _free
+(JNIEnv* env, jobject j_this) try {
+  if (!is_java_marked(env, j_this)) {
+    @TOPOLOGY@@CPP_CLASS@* this_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+    delete this_ptr;
+    void* null_ptr = 0;
+    set_ptr(env, j_this, null_ptr);
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_swap
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  swap(*this_ptr, *y_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1DIMENSION@
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return this_ptr->@DIMENSION@();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1CLASS_REPRESENT@s
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return build_java_ at CLASS_REPRESENT@_system(env, this_ptr->@CLASS_REPRESENT at s());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_minimized_1 at 1CLASS_REPRESENT@s
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return build_java_ at CLASS_REPRESENT@_system(env,
+             this_ptr->minimized_ at CLASS_REPRESENT@s());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_relation_1with__Lparma_1polyhedra_1library_ at 1!RELATION_REPRESENT at _2
+(JNIEnv* env, jobject j_this, jobject j_c) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    @!RELATION_REPRESENT@ c = build_cxx_ at RELATION_REPRESENT@(env, j_c);
+    Poly_@!A_RELATION_REPRESENT at _Relation pcr = this_ptr->relation_with(c);
+    return build_java_poly_ at A_RELATION_REPRESENT@_relation(env, pcr);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1HAS_PROPERTY@
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return this_ptr->@HAS_PROPERTY@();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1SIMPLIFY@
+(JNIEnv* env, jobject j_this) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  this_ptr->@SIMPLIFY@();
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_unconstrain_1space_1dimension
+(JNIEnv* env, jobject j_this, jobject j_var) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_var);
+  this_ptr->unconstrain(v);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_unconstrain_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_v_set) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+  this_ptr->unconstrain(v_set);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_bounds_1from_1 at 1ABOVEBELOW@
+(JNIEnv* env, jobject j_this, jobject j_le) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    Linear_Expression le = build_cxx_linear_expression(env, j_le);
+    return this_ptr->bounds_from_ at ABOVEBELOW@(le);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_has_1 at UPPERLOWER@_1bound
+(JNIEnv* env, jobject j_this, jobject j_var,
+ jobject j_num, jobject j_den, jobject j_ref_boolean) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    Variable var = build_cxx_variable(env, j_var);
+    PPL_DIRTY_TEMP_COEFFICIENT(num);
+    PPL_DIRTY_TEMP_COEFFICIENT(den);
+    num = build_cxx_coeff(env, j_num);
+    den = build_cxx_coeff(env, j_den);
+    bool b_value;
+    if (this_ptr->has_ at UPPERLOWER@_bound(var, num, den, b_value)) {
+      set_coefficient(env, j_num, build_java_coeff(env, num));
+      set_coefficient(env, j_den, build_java_coeff(env, den));
+      jobject j_boolean = bool_to_j_boolean_class(env, b_value);
+      set_by_reference(env, j_ref_boolean, j_boolean);
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1MAXMIN@__Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_By_1Reference_2
+(JNIEnv* env, jobject j_this, jobject j_le,
+ jobject j_num, jobject j_den, jobject j_ref_boolean) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    PPL_DIRTY_TEMP_COEFFICIENT(num);
+    PPL_DIRTY_TEMP_COEFFICIENT(den);
+    num = build_cxx_coeff(env, j_num);
+    den = build_cxx_coeff(env, j_den);
+    Linear_Expression le = build_cxx_linear_expression(env, j_le);
+    bool b_value;
+    if (this_ptr->@MAXMIN@(le, num, den, b_value)) {
+      set_coefficient(env, j_num, build_java_coeff(env, num));
+      set_coefficient(env, j_den, build_java_coeff(env, den));
+      jobject j_boolean = bool_to_j_boolean_class(env, b_value);
+      set_by_reference(env, j_ref_boolean, j_boolean);
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1MAXMIN@__Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_Coefficient_2Lparma_1polyhedra_1library_By_1Reference_2Lparma_1polyhedra_1library_Generator_2
+(JNIEnv* env, jobject j_this, jobject j_le,
+ jobject j_num, jobject j_den, jobject j_ref_boolean, jobject j_g) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    PPL_DIRTY_TEMP_COEFFICIENT(num);
+    PPL_DIRTY_TEMP_COEFFICIENT(den);
+    num = build_cxx_coeff(env, j_num);
+    den = build_cxx_coeff(env, j_den);
+    Linear_Expression le = build_cxx_linear_expression(env, j_le);
+    bool b_value;
+    Generator g = point();
+    if (this_ptr->@MAXMIN@(le, num, den, b_value, g)) {
+      set_coefficient(env, j_num, build_java_coeff(env, num));
+      set_coefficient(env, j_den, build_java_coeff(env, den));
+      jobject j_boolean = bool_to_j_boolean_class(env, b_value);
+      set_by_reference(env, j_ref_boolean, j_boolean);
+      jobject j_g_result = build_java_generator(env, g);
+      set_generator(env, j_g, j_g_result);
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_frequency
+(JNIEnv* env, jobject j_this, jobject j_le,
+ jobject j_freqn, jobject j_freqd, jobject j_valn, jobject j_vald) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    PPL_DIRTY_TEMP_COEFFICIENT(freqn);
+    PPL_DIRTY_TEMP_COEFFICIENT(freqd);
+    PPL_DIRTY_TEMP_COEFFICIENT(valn);
+    PPL_DIRTY_TEMP_COEFFICIENT(vald);
+    freqn = build_cxx_coeff(env, j_freqn);
+    freqd = build_cxx_coeff(env, j_freqd);
+    valn = build_cxx_coeff(env, j_valn);
+    vald = build_cxx_coeff(env, j_vald);
+    Linear_Expression le = build_cxx_linear_expression(env, j_le);
+    if (this_ptr->frequency(le, freqn, freqd, valn, vald)) {
+      set_coefficient(env, j_freqn, build_java_coeff(env, freqn));
+      set_coefficient(env, j_freqd, build_java_coeff(env, freqd));
+      set_coefficient(env, j_valn, build_java_coeff(env, valn));
+      set_coefficient(env, j_vald, build_java_coeff(env, vald));
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1COMPARISON@
+(JNIEnv* env, jobject j_this, jobject j_y) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    @CPP_CLASS@* y_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+    return this_ptr->@COMPARISON@(*y_ptr);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_equals
+(JNIEnv* env, jobject j_this, jobject j_y) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    @CPP_CLASS@* y_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+    return *this_ptr == *y_ptr;
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+`dnl
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_hashCode
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return this_ptr->hash_code();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_OK
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return this_ptr->OK();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_add_1 at 1CLASS_REPRESENT@
+(JNIEnv* env, jobject j_this, jobject j_c) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @!CLASS_REPRESENT@ c = build_cxx_ at CLASS_REPRESENT@(env, j_c);
+  this_ptr->add_ at CLASS_REPRESENT@(c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_refine_1with_1 at 1REFINE_REPRESENT@
+(JNIEnv* env, jobject j_this, jobject j_c) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @!REFINE_REPRESENT@ c = build_cxx_ at REFINE_REPRESENT@(env, j_c);
+  this_ptr->refine_with_ at REFINE_REPRESENT@(c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_add_1 at 1CLASS_REPRESENT@s
+(JNIEnv* env, jobject j_this, jobject j_cs) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @!CLASS_REPRESENT at _System cs = build_cxx_ at CLASS_REPRESENT@_system(env, j_cs);
+  this_ptr->add_ at CLASS_REPRESENT@s(cs);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_refine_1with_1 at 1REFINE_REPRESENT@s
+(JNIEnv* env, jobject j_this, jobject j_cs) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @!REFINE_REPRESENT at _System cs
+    = build_cxx_ at REFINE_REPRESENT@_system(env, j_cs);
+  this_ptr->refine_with_ at REFINE_REPRESENT@s(cs);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1BINOP@
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  this_ptr->@BINOP@(*y_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _positive_1time_1elapse_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+  @TOPOLOGY@@CPP_CLASS@* this_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_this));
+  @TOPOLOGY@@CPP_CLASS@* y_ptr
+    = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_y));
+  this_ptr->positive_time_elapse_assign(*y_ptr);
+}
+CATCH_ALL;
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_simplify_1using_1context_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    @CPP_CLASS@* y_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+    return this_ptr->simplify_using_context_assign(*y_ptr);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1AFFIMAGE@
+(JNIEnv* env, jobject j_this, jobject j_v, jobject j_le, jobject j_c) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_v);
+  Linear_Expression le = build_cxx_linear_expression(env, j_le);
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  c = build_cxx_coeff(env, j_c);
+  this_ptr->@AFFIMAGE@(v, le, c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_generalized_1 at 1AFFIMAGE@__Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Relation_1Symbol_2Lparma_1polyhedra_1library_Linear_1Expression_2
+(JNIEnv* env, jobject j_this,
+ jobject j_lhs, jobject j_relsym, jobject j_rhs) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+  Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+  Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+  this_ptr->generalized_ at AFFIMAGE@(lhs, relsym, rhs);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_generalized_1 at 1AFFIMAGE@__Lparma_1polyhedra_1library_Variable_2Lparma_1polyhedra_1library_Relation_1Symbol_2Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Coefficient_2
+(JNIEnv* env, jobject j_this,
+ jobject j_v, jobject j_relsym, jobject j_le, jobject j_c) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_v);
+  Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+  Linear_Expression le = build_cxx_linear_expression(env, j_le);
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  c = build_cxx_coeff(env, j_c);
+  this_ptr->generalized_ at AFFIMAGE@(v, relsym, le, c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_generalized_1 at 1AFFIMAGE@_1lhs_1rhs_1with_1congruence
+(JNIEnv* env, jobject j_this,
+ jobject j_lhs, jobject j_relsym, jobject j_rhs, jobject j_modulus) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+  Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+  Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+  PPL_DIRTY_TEMP_COEFFICIENT(modulus);
+  modulus = build_cxx_coeff(env, j_modulus);
+  this_ptr->generalized_ at AFFIMAGE@(lhs, relsym, rhs, modulus);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at CLASS@_generalized_1 at 1AFFIMAGE@_1with_1congruence
+(JNIEnv* env, jobject j_this,
+ jobject j_v, jobject j_relsym, jobject j_le, jobject j_c,
+ jobject j_modulus) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_v);
+  Relation_Symbol relsym = build_cxx_relsym(env, j_relsym);
+  Linear_Expression le = build_cxx_linear_expression(env, j_le);
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  PPL_DIRTY_TEMP_COEFFICIENT(modulus);
+  c = build_cxx_coeff(env, j_c);
+  modulus = build_cxx_coeff(env, j_modulus);
+  this_ptr->generalized_ at AFFIMAGE@(v, relsym, le, c, modulus);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_bounded_1 at 1AFFIMAGE@
+(JNIEnv* env, jobject j_this,
+ jobject j_v, jobject j_lhs, jobject j_rhs, jobject j_c) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_v);
+  Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+  Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  c = build_cxx_coeff(env, j_c);
+  this_ptr->bounded_ at AFFIMAGE@(v, lhs, rhs, c);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_wrap_1assign
+(JNIEnv* env, jobject j_this, jobject j_vars,
+ jobject j_w, jobject j_r, jobject j_o, jobject j_cs,
+ jlong j_cx, jboolean j_wrap_individually) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variables_Set vars = build_cxx_variables_set(env, j_vars);
+  Bounded_Integer_Type_Width w = build_cxx_bounded_width(env, j_w);
+  Bounded_Integer_Type_Representation r = build_cxx_bounded_rep(env, j_r);
+  Bounded_Integer_Type_Overflow o = build_cxx_bounded_overflow(env, j_o);
+  Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+  unsigned cx = jtype_to_unsigned<unsigned int>(j_cx);
+  this_ptr->wrap_assign(vars, w, r, o, &cs, cx, j_wrap_individually);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1WIDEN@_1widening_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_by_ref_int) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  if (j_by_ref_int == NULL)
+    this_ptr->@WIDEN at _widening_assign(*y_ptr);
+  else {
+    jobject j_integer = get_by_reference(env, j_by_ref_int);
+    unsigned int tokens =
+      jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+    this_ptr->@WIDEN at _widening_assign(*y_ptr, &tokens);
+    j_integer = j_int_to_j_integer(env, tokens);
+    set_by_reference(env, j_by_ref_int, j_integer);
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_widening_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_by_ref_int) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  if (j_by_ref_int == NULL)
+    this_ptr->widening_assign(*y_ptr);
+  else {
+    jobject j_integer = get_by_reference(env, j_by_ref_int);
+    unsigned int tokens =
+      jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+    this_ptr->widening_assign(*y_ptr, &tokens);
+    j_integer = j_int_to_j_integer(env, tokens);
+    set_by_reference(env, j_by_ref_int, j_integer);
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1EXTRAPOLATION@_1extrapolation_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_by_ref_int) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  if (j_by_ref_int == NULL)
+    this_ptr->@EXTRAPOLATION at _extrapolation_assign(*y_ptr);
+  else {
+    jobject j_integer = get_by_reference(env, j_by_ref_int);
+    unsigned int tokens =
+      jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+    this_ptr->@EXTRAPOLATION at _extrapolation_assign(*y_ptr, &tokens);
+    j_integer = j_int_to_j_integer(env, tokens);
+    set_by_reference(env, j_by_ref_int, j_integer);
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1EXTRAPOLATION@_1narrowing_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  this_ptr->@EXTRAPOLATION at _narrowing_assign(*y_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1LIMITEDBOUNDED@_1 at 1WIDENEXPN@_1extrapolation_1assign
+(JNIEnv* env, jobject j_this, jobject j_y,
+ jobject j_cs, jobject j_by_ref_int) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  @!CONSTRAINER at _System cs = build_cxx_ at CONSTRAINER@_system(env, j_cs);
+  if (j_by_ref_int == NULL)
+    this_ptr->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*y_ptr, cs);
+  else {
+    jobject j_integer = get_by_reference(env, j_by_ref_int);
+    unsigned int tokens =
+      jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_integer));
+    this_ptr->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign
+      (*y_ptr, cs, &tokens);
+    j_integer = j_int_to_j_integer(env, tokens);
+    set_by_reference(env, j_by_ref_int, j_integer);
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_BGP99_1 at 1DISJUNCT_WIDEN@_1extrapolation_1assign
+(JNIEnv* env, jobject j_this, jobject j_y, jobject j_disjuncts) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  unsigned int disjuncts =
+    jtype_to_unsigned<unsigned int>(j_integer_to_j_int(env, j_disjuncts));
+  this_ptr->BGP99_extrapolation_assign
+    (*y_ptr,
+     widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+     disjuncts);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_BHZ03_1 at 1A_DISJUNCT_WIDEN@_1 at 1DISJUNCT_WIDEN@_1widening_1assign
+(JNIEnv* env, jobject j_this, jobject j_y) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  @CPP_CLASS@* y_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_y));
+  this_ptr->BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+    (*y_ptr,
+     widen_fun_ref(
+       &@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_add_1space_1dimensions_1 at 1EMBEDPROJECT@
+(JNIEnv* env, jobject j_this, jlong dim) try {
+  dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  this_ptr->add_space_dimensions_ at EMBEDPROJECT@(ppl_dim);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_remove_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_v_set) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+  this_ptr->remove_space_dimensions(v_set);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_remove_1higher_1space_1dimensions
+(JNIEnv* env, jobject j_this, jlong dim) try {
+  dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  this_ptr->remove_higher_space_dimensions(ppl_dim);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_expand_1space_1dimension
+(JNIEnv* env, jobject j_this, jobject j_variable, jlong dim) try {
+  dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(dim);
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_variable);
+  this_ptr->expand_space_dimension(v, ppl_dim);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_ at 1CLASS@_fold_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_v_set, jobject j_var) try {
+  Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_var);
+  this_ptr->fold_space_dimensions(v_set, v);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_map_1space_1dimensions
+(JNIEnv* env, jobject j_this, jobject j_p_func) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Partial_Function* p_func_ptr
+    = reinterpret_cast<Partial_Function*>(get_ptr(env, j_p_func));
+  this_ptr->map_space_dimensions(*p_func_ptr);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_ at 1CLASS@_drop_1some_1non_1integer_1points__Lparma_1polyhedra_1library_Complexity_1Class_2
+(JNIEnv* env, jobject j_this, jobject j_complexity) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  jint j_complexity_int
+    = env->CallIntMethod(j_complexity,
+                         cached_FMIDs.Complexity_Class_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (j_complexity_int) {
+  case 0:
+    this_ptr->drop_some_non_integer_points(POLYNOMIAL_COMPLEXITY);
+    break;
+  case 1:
+    this_ptr->drop_some_non_integer_points(SIMPLEX_COMPLEXITY);
+    break;
+  case 2:
+    this_ptr->drop_some_non_integer_points(ANY_COMPLEXITY);
+    break;
+  default:
+    PPL_JAVA_UNEXPECTED;
+    break;
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+JNIEXPORT void JNICALL Java_parma_1polyhedra_1library_ at 1CLASS@_drop_1some_1non_1integer_1points__Lparma_1polyhedra_1library_Variables_1Set_2Lparma_1polyhedra_1library_Complexity_1Class_2
+(JNIEnv* env, jobject j_this, jobject j_v_set, jobject j_complexity) try {
+  @CPP_CLASS@* this_ptr
+    = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+  Variables_Set v_set = build_cxx_variables_set(env, j_v_set);
+  jint j_complexity_int
+    = env->CallIntMethod(j_complexity,
+                         cached_FMIDs.Complexity_Class_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (j_complexity_int) {
+  case 0:
+    this_ptr->drop_some_non_integer_points(v_set, POLYNOMIAL_COMPLEXITY);
+    break;
+  case 1:
+    this_ptr->drop_some_non_integer_points(v_set, SIMPLEX_COMPLEXITY);
+    break;
+  case 2:
+    this_ptr->drop_some_non_integer_points(v_set, ANY_COMPLEXITY);
+    break;
+  default:
+    PPL_JAVA_UNEXPECTED;
+    break;
+  }
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+`dnl
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_toString
+(JNIEnv* env, jobject j_this) {
+  try {
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    std::ostringstream s;
+    s << *this_ptr;
+    std::string str = s.str();
+    return env->NewStringUTF(str.c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ at 1MEMBYTES@
+(JNIEnv* env, jobject j_this) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    return this_ptr->@MEMBYTES@();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_constrains
+(JNIEnv* env, jobject j_this, jobject j_var) {
+  try {
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    Variable v = build_cxx_variable(env, j_var);
+    return this_ptr->constrains(v);
+  }
+  CATCH_ALL;
+  return false;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+    @CPP_CLASS@* this_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_this));
+    std::ostringstream s;
+    this_ptr->ascii_dump(s);
+    std::string str = s.str();
+    return env->NewStringUTF(str.c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1TOPOLOGY@@1CLASS at _linear_1@PARTITION@
+(JNIEnv* env, jclass, jobject j_p, jobject j_q) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+    @TOPOLOGY@@CPP_CLASS@* q_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_q));
+    std::pair<@TOPOLOGY@@CPP_CLASS@|COMMA|
+              Pointset_Powerset<NNC_Polyhedron> >
+      r = linear_partition(*p_ptr, *q_ptr);
+
+    @TOPOLOGY@@CPP_CLASS@* r1
+      = new @TOPOLOGY@@CPP_CLASS@(0, EMPTY);
+    Pointset_Powerset<NNC_Polyhedron>* r2
+      = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+    swap(*r1, r.first);
+    swap(*r2, r.second);
+
+    jclass j_pair_class = env->FindClass("parma_polyhedra_library/Pair");
+    CHECK_RESULT_ASSERT(env, j_pair_class);
+    jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_pair);
+    jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair);
+    CHECK_RESULT_RETURN(env, j_pair_obj, 0);
+
+    jclass j_class_r1 = env->FindClass("parma_polyhedra_library/@TOPOLOGY@@CLASS@");
+    CHECK_RESULT_ASSERT(env, j_class_r1);
+    jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_r1);
+    jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1);
+    CHECK_RESULT_RETURN(env, j_obj_r1, 0);
+    set_ptr(env, j_obj_r1, r1);
+
+    jclass j_class_r2 = env->FindClass("parma_polyhedra_library/Pointset_Powerset_NNC_Polyhedron");
+    CHECK_RESULT_ASSERT(env, j_class_r2);
+    jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_r2);
+    jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2);
+    CHECK_RESULT_RETURN(env, j_obj_r2, 0);
+    set_ptr(env, j_obj_r2, r2);
+    set_pair_element(env, j_pair_obj, 0, j_obj_r1);
+    set_pair_element(env, j_pair_obj, 1, j_obj_r2);
+    return j_pair_obj;
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_ at 1CLASS@_approximate_1 at PARTITION@
+(JNIEnv* env, jclass, jobject j_p, jobject j_q, jobject j_ref_finite_bool) {
+  try {
+    @CPP_CLASS@* p_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_p));
+    @CPP_CLASS@* q_ptr
+      = reinterpret_cast<@CPP_CLASS@*>(get_ptr(env, j_q));
+    bool b_finite_val;
+    std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<Grid> >
+      r = approximate_partition(*p_ptr, *q_ptr, b_finite_val);
+
+    @CPP_CLASS@* r1 = new @CPP_CLASS@(0, EMPTY);
+    Pointset_Powerset<Grid>* r2 = new Pointset_Powerset<Grid>(0, EMPTY);
+    swap(*r1, r.first);
+    swap(*r2, r.second);
+
+    jclass j_pair_class = env->FindClass("parma_polyhedra_library/Pair");
+    CHECK_RESULT_ASSERT(env, j_pair_class);
+    jmethodID j_ctr_id_pair = env->GetMethodID(j_pair_class, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_pair);
+    jobject j_pair_obj = env->NewObject(j_pair_class, j_ctr_id_pair);
+    CHECK_RESULT_RETURN(env, j_pair_obj, 0);
+
+    jclass j_class_r1 = env->FindClass("parma_polyhedra_library/@CLASS@");
+    CHECK_RESULT_ASSERT(env, j_class_r1);
+    jmethodID j_ctr_id_r1 = env->GetMethodID(j_class_r1, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_r1);
+    jobject j_obj_r1 = env->NewObject(j_class_r1, j_ctr_id_r1);
+    CHECK_RESULT_RETURN(env, j_obj_r1, 0);
+    set_ptr(env, j_obj_r1, r1);
+
+    jclass j_class_r2
+      = env->FindClass("parma_polyhedra_library/Pointset_Powerset_Grid");
+    CHECK_RESULT_ASSERT(env, j_class_r2);
+    jmethodID j_ctr_id_r2 = env->GetMethodID(j_class_r2, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_r2);
+    jobject j_obj_r2 = env->NewObject(j_class_r2, j_ctr_id_r2);
+    CHECK_RESULT_RETURN(env, j_obj_r2, 0);
+    set_ptr(env, j_obj_r2, r2);
+    set_pair_element(env, j_pair_obj, 0, j_obj_r1);
+    set_pair_element(env, j_pair_obj, 1, j_obj_r2);
+    jobject j_finite_bool = bool_to_j_boolean_class(env, b_finite_val);
+    set_by_reference(env, j_ref_finite_bool, j_finite_bool);
+    return j_pair_obj;
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_termination_1test_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+    return termination_test_ at TERMINATION_ID@(*p_ptr);
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_termination_1test_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+    return termination_test_ at TERMINATION_ID@_2(*p_ptr_before, *p_ptr_after);
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_one_1affine_1ranking_1function_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p, jobject j_g) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+    Generator g(point());
+    if (one_affine_ranking_function_ at TERMINATION_ID@(*p_ptr, g)) {
+      jobject j_g_result = build_java_generator(env, g);;
+      set_generator(env, j_g, j_g_result);
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Termination_one_1affine_1ranking_1function_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after, jobject j_g) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+    Generator g(point());
+    if (one_affine_ranking_function_ at TERMINATION_ID@_2(*p_ptr_before, *p_ptr_after, g)) {
+      jobject j_g_result = build_java_generator(env, g);;
+      set_generator(env, j_g, j_g_result);
+      return true;
+    }
+    return false;
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1ranking_1functions_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p, jobject j_ph) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+    @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+    all_affine_ranking_functions_ at TERMINATION_ID@(*p_ptr, *ph);
+    set_ptr(env, j_ph, ph);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1ranking_1functions_1 at TERMINATION_ID@_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after, jobject j_ph) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+    @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+    all_affine_ranking_functions_ at TERMINATION_ID@_2(*p_ptr_before, *p_ptr_after, *ph);
+    set_ptr(env, j_ph, ph);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1quasi_1ranking_1functions_1MS_1 at TOPOLOGY@1 at CLASS@
+(JNIEnv* env, jclass, jobject j_p,
+ jobject j_ph_decreasing, jobject j_ph_bounded) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p));
+    C_Polyhedron* ph_decreasing = new C_Polyhedron();
+    C_Polyhedron* ph_bounded = new C_Polyhedron();
+    all_affine_quasi_ranking_functions_MS(*p_ptr, *ph_decreasing, *ph_bounded);
+    set_ptr(env, j_ph_decreasing, ph_decreasing);
+    set_ptr(env, j_ph_bounded, ph_bounded);
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Termination_all_1affine_1quasi_1ranking_1functions_1MS_1 at TOPOLOGY@1 at CLASS@_12
+(JNIEnv* env, jclass, jobject j_p_before, jobject j_p_after,
+ jobject j_ph_decreasing, jobject j_ph_bounded) {
+  try {
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_before
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_before));
+    @TOPOLOGY@@CPP_CLASS@* p_ptr_after
+      = reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(get_ptr(env, j_p_after));
+    C_Polyhedron* ph_decreasing = new C_Polyhedron();
+    C_Polyhedron* ph_bounded = new C_Polyhedron();
+    all_affine_quasi_ranking_functions_MS_2(*p_ptr_before, *p_ptr_after,
+                                            *ph_decreasing, *ph_bounded);
+    set_ptr(env, j_ph_decreasing, ph_decreasing);
+    set_ptr(env, j_ph_bounded, ph_bounded);
+  }
+  CATCH_ALL;
+}
+
+')
diff --git a/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4 b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
new file mode 100644
index 0000000..6b1486d
--- /dev/null
+++ b/interfaces/Java/jni/ppl_interface_generator_java_classes_cc_files.m4
@@ -0,0 +1,88 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file parma_polyhedra_library_classes.cc
+dnl using the code in ppl_interface_generator_java_classes_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_java_classes_cc_code.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+
+dnl The macro m4_java_prefix_one_annotation is defined in
+dnl ppl_interfaces_generatos_common.m4 and will expand to the
+dnl extra pattern annotations for "1" and "1!";
+dnl that will insert a "1" after the "_" in the replacements.
+m4_java_prefix_one_annotation
+
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_Termination.cc << ___END_OF_FILE___
+/* Java Termination interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_java_common_defs.hh"
+`#'include "parma_polyhedra_library_Termination.h"
+`#'include "parma_polyhedra_library_C_Polyhedron.h"
+`#'include "parma_polyhedra_library_NNC_Polyhedron.h"
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Java;
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', `m4_interface_class$1')`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_java_`'m4_current_interface`'.cc << ___END_OF_FILE___
+/* Java m4_current_interface interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_java_common_defs.hh"
+`#'include "parma_polyhedra_library_`'m4_current_interface`'.h"
+m4_ifelse(m4_current_interface, Polyhedron,
+`#'include "parma_polyhedra_library_C_Polyhedron.h"
+`#'include "parma_polyhedra_library_NNC_Polyhedron.h"
+)`'dnl
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Java;
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Main call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/Java/jni/ppl_java_common.cc b/interfaces/Java/jni/ppl_java_common.cc
new file mode 100644
index 0000000..c357cd6
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common.cc
@@ -0,0 +1,1249 @@
+/* PPL Java interface common routines implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_java_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Java {
+
+// Define class and field/method ID caches.
+Java_Class_Cache cached_classes;
+Java_FMID_Cache cached_FMIDs;
+
+Java_Class_Cache::Java_Class_Cache() {
+  // Java Virtual Machine pointer.
+  jvm = NULL;
+  // Non-PPL classes.
+  Boolean = NULL;
+  Integer = NULL;
+  Long = NULL;
+  Iterator = NULL;
+  // PPL classes.
+  Artificial_Parameter = NULL;
+  Artificial_Parameter_Sequence = NULL;
+  Bounded_Integer_Type_Overflow = NULL;
+  Bounded_Integer_Type_Representation = NULL;
+  Bounded_Integer_Type_Width = NULL;
+  By_Reference = NULL;
+  Coefficient = NULL;
+  Congruence = NULL;
+  Constraint = NULL;
+  Generator = NULL;
+  Grid_Generator = NULL;
+  Generator_Type = NULL;
+  Grid_Generator_Type = NULL;
+  Constraint_System = NULL;
+  Congruence_System = NULL;
+  Generator_System = NULL;
+  Grid_Generator_System = NULL;
+  Linear_Expression = NULL;
+  Linear_Expression_Coefficient = NULL;
+  Linear_Expression_Difference = NULL;
+  Linear_Expression_Sum = NULL;
+  Linear_Expression_Times = NULL;
+  Linear_Expression_Unary_Minus = NULL;
+  Linear_Expression_Variable = NULL;
+  MIP_Problem_Status = NULL;
+  Optimization_Mode = NULL;
+  Pair = NULL;
+  PIP_Problem_Control_Parameter_Name = NULL;
+  PIP_Problem_Control_Parameter_Value = NULL;
+  PIP_Problem_Status = NULL;
+  Poly_Con_Relation = NULL;
+  Poly_Gen_Relation = NULL;
+  PPL_Object = NULL;
+  Relation_Symbol = NULL;
+  Variable = NULL;
+  Variable_Stringifier = NULL;
+  Variables_Set = NULL;
+}
+
+void
+Java_Class_Cache::init_cache(JNIEnv* env, jclass& field, const char* name) {
+  assert(env != NULL);
+  if (field != NULL) {
+    env->DeleteGlobalRef(field);
+  }
+  jclass jni_class = env->FindClass(name);
+  CHECK_RESULT_ASSERT(env, jni_class);
+  field = (jclass) env->NewGlobalRef(jni_class);
+  CHECK_RESULT_ASSERT(env, field);
+}
+
+void
+Java_Class_Cache::init_cache(JNIEnv* env) {
+  assert(env != NULL);
+  // Java Virtual Machine pointer.
+  env->GetJavaVM(&jvm);
+  // Non-PPL classes.
+  init_cache(env, Boolean, "java/lang/Boolean");
+  init_cache(env, Integer, "java/lang/Integer");
+  init_cache(env, Long, "java/lang/Long");
+  init_cache(env, Iterator, "java/util/Iterator");
+  // PPL classes.
+  init_cache(env, Artificial_Parameter,
+             "parma_polyhedra_library/Artificial_Parameter");
+  init_cache(env, Artificial_Parameter_Sequence,
+             "parma_polyhedra_library/Artificial_Parameter_Sequence");
+  init_cache(env, Bounded_Integer_Type_Overflow, "parma_polyhedra_library/Bounded_Integer_Type_Overflow");
+  init_cache(env, Bounded_Integer_Type_Representation, "parma_polyhedra_library/Bounded_Integer_Type_Representation");
+  init_cache(env, Bounded_Integer_Type_Width, "parma_polyhedra_library/Bounded_Integer_Type_Width");
+  init_cache(env, By_Reference, "parma_polyhedra_library/By_Reference");
+  init_cache(env, Coefficient, "parma_polyhedra_library/Coefficient");
+  init_cache(env, Congruence, "parma_polyhedra_library/Congruence");
+  init_cache(env, Constraint, "parma_polyhedra_library/Constraint");
+  init_cache(env, Generator, "parma_polyhedra_library/Generator");
+  init_cache(env, Grid_Generator, "parma_polyhedra_library/Grid_Generator");
+  init_cache(env, Generator_Type, "parma_polyhedra_library/Generator_Type");
+  init_cache(env, Grid_Generator_Type,
+             "parma_polyhedra_library/Grid_Generator_Type");
+  init_cache(env, Constraint_System,
+             "parma_polyhedra_library/Constraint_System");
+  init_cache(env, Congruence_System,
+             "parma_polyhedra_library/Congruence_System");
+  init_cache(env, Generator_System,
+             "parma_polyhedra_library/Generator_System");
+  init_cache(env, Grid_Generator_System,
+             "parma_polyhedra_library/Grid_Generator_System");
+  init_cache(env, Linear_Expression,
+             "parma_polyhedra_library/Linear_Expression");
+  init_cache(env, Linear_Expression_Coefficient,
+             "parma_polyhedra_library/Linear_Expression_Coefficient");
+  init_cache(env, Linear_Expression_Difference,
+             "parma_polyhedra_library/Linear_Expression_Difference");
+  init_cache(env, Linear_Expression_Sum,
+             "parma_polyhedra_library/Linear_Expression_Sum");
+  init_cache(env, Linear_Expression_Times,
+             "parma_polyhedra_library/Linear_Expression_Times");
+  init_cache(env, Linear_Expression_Unary_Minus,
+             "parma_polyhedra_library/Linear_Expression_Unary_Minus");
+  init_cache(env, Linear_Expression_Variable,
+             "parma_polyhedra_library/Linear_Expression_Variable");
+  init_cache(env, MIP_Problem_Status,
+             "parma_polyhedra_library/MIP_Problem_Status");
+  init_cache(env, Optimization_Mode,
+             "parma_polyhedra_library/Optimization_Mode");
+  init_cache(env, Pair, "parma_polyhedra_library/Pair");
+  init_cache(env, PIP_Problem_Control_Parameter_Name,
+             "parma_polyhedra_library/PIP_Problem_Control_Parameter_Name");
+  init_cache(env, PIP_Problem_Control_Parameter_Value,
+             "parma_polyhedra_library/PIP_Problem_Control_Parameter_Value");
+  init_cache(env, PIP_Problem_Status,
+             "parma_polyhedra_library/PIP_Problem_Status");
+  init_cache(env, Poly_Con_Relation,
+             "parma_polyhedra_library/Poly_Con_Relation");
+  init_cache(env, Poly_Gen_Relation,
+             "parma_polyhedra_library/Poly_Gen_Relation");
+  init_cache(env, PPL_Object, "parma_polyhedra_library/PPL_Object");
+  init_cache(env, Relation_Symbol, "parma_polyhedra_library/Relation_Symbol");
+  init_cache(env, Variable, "parma_polyhedra_library/Variable");
+  // NOTE: initialization of concrete Variable_Stringifier is responsibility
+  // of static (native) method Variable.setStringifier.
+  init_cache(env, Variables_Set, "parma_polyhedra_library/Variables_Set");
+}
+
+void
+Java_Class_Cache::clear_cache(JNIEnv* env, jclass& field) {
+  assert(env != NULL);
+  if (field != NULL) {
+    env->DeleteGlobalRef(field);
+    field = NULL;
+  }
+}
+
+void
+Java_Class_Cache::clear_cache(JNIEnv* env) {
+  assert(env != NULL);
+  // Clearing the JVM pointer.
+  jvm = NULL;
+  // Non-PPL classes.
+  clear_cache(env, Boolean);
+  clear_cache(env, Integer);
+  clear_cache(env, Long);
+  clear_cache(env, Iterator);
+  // PPL classes.
+  clear_cache(env, Artificial_Parameter);
+  clear_cache(env, Artificial_Parameter_Sequence);
+  clear_cache(env, Bounded_Integer_Type_Overflow);
+  clear_cache(env, Bounded_Integer_Type_Representation);
+  clear_cache(env, Bounded_Integer_Type_Width);
+  clear_cache(env, By_Reference);
+  clear_cache(env, Coefficient);
+  clear_cache(env, Congruence);
+  clear_cache(env, Constraint);
+  clear_cache(env, Generator);
+  clear_cache(env, Grid_Generator);
+  clear_cache(env, Generator_Type);
+  clear_cache(env, Grid_Generator_Type);
+  clear_cache(env, Constraint_System);
+  clear_cache(env, Congruence_System);
+  clear_cache(env, Generator_System);
+  clear_cache(env, Grid_Generator_System);
+  clear_cache(env, Linear_Expression);
+  clear_cache(env, Linear_Expression_Coefficient);
+  clear_cache(env, Linear_Expression_Difference);
+  clear_cache(env, Linear_Expression_Sum);
+  clear_cache(env, Linear_Expression_Times);
+  clear_cache(env, Linear_Expression_Unary_Minus);
+  clear_cache(env, Linear_Expression_Variable);
+  clear_cache(env, MIP_Problem_Status);
+  clear_cache(env, Optimization_Mode);
+  clear_cache(env, PIP_Problem_Status);
+  clear_cache(env, Pair);
+  clear_cache(env, Poly_Con_Relation);
+  clear_cache(env, Poly_Gen_Relation);
+  clear_cache(env, PPL_Object);
+  clear_cache(env, Relation_Symbol);
+  clear_cache(env, Variable);
+  clear_cache(env, Variable_Stringifier);
+  clear_cache(env, Variables_Set);
+}
+
+void
+handle_exception(JNIEnv* env, const std::overflow_error& e) {
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Overflow_Error_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, e.what());
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::invalid_argument& e) {
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Invalid_Argument_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, e.what());
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::logic_error& e) {
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Logic_Error_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, e.what());
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::length_error& e) {
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Length_Error_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, e.what());
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::domain_error& e) {
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Domain_Error_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, e.what());
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::bad_alloc&) {
+  jclass newExcCls
+    = env->FindClass("java/lang/RuntimeException");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, "Out of memory");
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const std::exception& e) {
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, e.what());
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+void
+handle_exception(JNIEnv* env, const timeout_exception&) {
+  reset_timeout();
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Timeout_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, "PPL timeout expired");
+  CHECK_RESULT_ABORT(env, (ret == 0));
+}
+
+void
+handle_exception(JNIEnv* env, const deterministic_timeout_exception&) {
+  reset_deterministic_timeout();
+  jclass newExcCls
+    = env->FindClass("parma_polyhedra_library/Timeout_Exception");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, "PPL deterministic timeout expired");
+  CHECK_RESULT_ABORT(env, (ret == 0));
+}
+
+void
+handle_exception(JNIEnv* env) {
+  jclass newExcCls = env->FindClass("java/lang/RuntimeException");
+  CHECK_RESULT_ASSERT(env, newExcCls);
+  jint ret = env->ThrowNew(newExcCls, "PPL bug: unknown exception raised");
+  CHECK_RESULT_ABORT(env, ret == 0);
+}
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+  if (p_timeout_object) {
+    delete p_timeout_object;
+    p_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+void
+reset_deterministic_timeout() {
+  if (p_deterministic_timeout_object) {
+    delete p_deterministic_timeout_object;
+    p_deterministic_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+jobject
+build_java_poly_gen_relation(JNIEnv* env, Poly_Gen_Relation& r) {
+  jint j_value = 0;
+  while (r != Poly_Gen_Relation::nothing()) {
+    if (r.implies(Poly_Gen_Relation::subsumes())) {
+      j_value += 1;
+      r = r - Poly_Gen_Relation::subsumes();
+    }
+  }
+  jobject ret = env->NewObject(cached_classes.Poly_Gen_Relation,
+                               cached_FMIDs.Poly_Gen_Relation_init_ID,
+                               j_value);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+jobject
+build_java_poly_con_relation(JNIEnv* env, Poly_Con_Relation& r) {
+  jint j_value = 0;
+  while (r != Poly_Con_Relation::nothing()) {
+    if (r.implies(Poly_Con_Relation::is_disjoint())) {
+      j_value += 1;
+      r = r - Poly_Con_Relation::is_disjoint();
+    }
+    else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+      j_value += 2;
+      r = r - Poly_Con_Relation::strictly_intersects();
+    }
+    else if (r.implies(Poly_Con_Relation::is_included())) {
+      j_value += 4;
+      r = r - Poly_Con_Relation::is_included();
+    }
+    else if (r.implies(Poly_Con_Relation::saturates())) {
+      j_value += 8;
+      r = r - Poly_Con_Relation::saturates();
+    }
+  }
+  jobject ret = env->NewObject(cached_classes.Poly_Con_Relation,
+                               cached_FMIDs.Poly_Con_Relation_init_ID,
+                               j_value);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+
+Congruence
+build_cxx_congruence(JNIEnv* env, jobject j_congruence) {
+  jobject j_mod
+    = env->GetObjectField(j_congruence, cached_FMIDs.Congruence_mod_ID);
+  jobject j_lhs
+    = env->GetObjectField(j_congruence, cached_FMIDs.Congruence_lhs_ID);
+  jobject j_rhs
+    = env->GetObjectField(j_congruence, cached_FMIDs.Congruence_rhs_ID);
+  PPL_DIRTY_TEMP_COEFFICIENT(ppl_modulus);
+  ppl_modulus = build_cxx_coeff(env, j_mod);
+  Linear_Expression lhs = build_cxx_linear_expression(env, j_lhs);
+  Linear_Expression rhs = build_cxx_linear_expression(env, j_rhs);
+  return (lhs %= rhs) / ppl_modulus;
+}
+
+PIP_Tree_Node::Artificial_Parameter
+build_cxx_artificial_parameter(JNIEnv* env, jobject j_artificial_parameter) {
+  jobject j_le
+    = env->GetObjectField(j_artificial_parameter,
+                          cached_FMIDs.Artificial_Parameter_le_ID);
+  jobject j_den
+    = env->GetObjectField(j_artificial_parameter,
+                          cached_FMIDs.Artificial_Parameter_den_ID);
+  PPL_DIRTY_TEMP_COEFFICIENT(ppl_den);
+  ppl_den = build_cxx_coeff(env, j_den);
+  Linear_Expression le = build_cxx_linear_expression(env, j_le);
+  PIP_Tree_Node::Artificial_Parameter art_param(le, ppl_den);
+  return art_param;
+}
+
+jobject
+bool_to_j_boolean_class(JNIEnv* env, const bool value) {
+  jobject ret = env->CallStaticObjectMethod(cached_classes.Boolean,
+                                            cached_FMIDs.Boolean_valueOf_ID,
+                                            static_cast<jboolean>(value));
+  CHECK_EXCEPTION_ASSERT(env);
+  return ret;
+}
+
+jobject
+j_long_to_j_long_class(JNIEnv* env, jlong jlong_value) {
+  jobject ret = env->CallStaticObjectMethod(cached_classes.Long,
+                                            cached_FMIDs.Long_valueOf_ID,
+                                            jlong_value);
+  CHECK_EXCEPTION_THROW(env);
+  return ret;
+}
+
+jlong
+j_long_class_to_j_long(JNIEnv* env, jobject j_long) {
+  jlong ret = env->CallLongMethod(j_long, cached_FMIDs.Long_longValue_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  return ret;
+}
+
+jobject
+j_int_to_j_integer(JNIEnv* env, jint jint_value) {
+  jobject ret = env->CallStaticObjectMethod(cached_classes.Integer,
+                                            cached_FMIDs.Integer_valueOf_ID,
+                                            jint_value);
+  CHECK_EXCEPTION_THROW(env);
+  return ret;
+}
+
+jint
+j_integer_to_j_int(JNIEnv* env, jobject j_integer) {
+  jint ret = env->CallIntMethod(j_integer, cached_FMIDs.Integer_intValue_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  return ret;
+}
+
+Variables_Set
+build_cxx_variables_set(JNIEnv* env, jobject j_v_set) {
+  // Get the iterator.
+  jobject j_iter
+    = env->CallObjectMethod(j_v_set, cached_FMIDs.Variables_Set_iterator_ID);
+  CHECK_EXCEPTION_THROW(env);
+  // Get method IDs from cache.
+  jmethodID has_next_ID = cached_FMIDs.Variables_Set_Iterator_has_next_ID;
+  jmethodID next_ID = cached_FMIDs.Variables_Set_Iterator_next_ID;
+  // Initialize an empty set of variables.
+  Variables_Set v_set;
+  jobject j_variable;
+  jboolean has_next_value = env->CallBooleanMethod(j_iter, has_next_ID);
+  while (has_next_value) {
+    j_variable = env->CallObjectMethod(j_iter, next_ID);
+    CHECK_EXCEPTION_ASSERT(env);
+    v_set.insert(build_cxx_variable(env, j_variable));
+    has_next_value = env->CallBooleanMethod(j_iter, has_next_ID);
+    CHECK_EXCEPTION_ASSERT(env);
+  }
+  return v_set;
+}
+
+jobject
+build_java_variables_set(JNIEnv* env, const Variables_Set& v_set) {
+  jobject j_vs = env->NewObject(cached_classes.Variables_Set,
+                                cached_FMIDs.Variables_Set_init_ID);
+  CHECK_RESULT_THROW(env, j_vs);
+  for (Variables_Set::const_iterator v_begin = v_set.begin(),
+         v_end = v_set.end(); v_begin != v_end; ++v_begin) {
+    Variable var(*v_begin);
+    jobject j_variable = build_java_variable(env, var);
+    env->CallBooleanMethod(j_vs,
+                           cached_FMIDs.Variables_Set_add_ID,
+                           j_variable);
+    CHECK_EXCEPTION_THROW(env);
+  }
+  return j_vs;
+}
+
+Bounded_Integer_Type_Overflow
+build_cxx_bounded_overflow(JNIEnv* env, jobject j_bounded_overflow) {
+  jint bounded_overflow
+    = env->CallIntMethod(j_bounded_overflow, cached_FMIDs.Bounded_Integer_Type_Overflow_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (bounded_overflow) {
+  case 0:
+    return OVERFLOW_WRAPS;
+  case 1:
+    return OVERFLOW_UNDEFINED;
+  case 2:
+    return OVERFLOW_IMPOSSIBLE;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+Bounded_Integer_Type_Representation
+build_cxx_bounded_rep(JNIEnv* env, jobject j_bounded_rep) {
+  jint bounded_rep
+    = env->CallIntMethod(j_bounded_rep, cached_FMIDs.Bounded_Integer_Type_Representation_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (bounded_rep) {
+  case 0:
+    return UNSIGNED;
+  case 1:
+    return SIGNED_2_COMPLEMENT;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+Bounded_Integer_Type_Width
+build_cxx_bounded_width(JNIEnv* env, jobject j_bounded_width) {
+  jint bounded_width
+    = env->CallIntMethod(j_bounded_width, cached_FMIDs.Bounded_Integer_Type_Width_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (bounded_width) {
+  case 0:
+    return BITS_8;
+  case 1:
+    return BITS_16;
+  case 2:
+    return BITS_32;
+  case 3:
+    return BITS_64;
+  case 4:
+    return BITS_128;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+Relation_Symbol
+build_cxx_relsym(JNIEnv* env, jobject j_relsym) {
+  jint rel_sym
+    = env->CallIntMethod(j_relsym, cached_FMIDs.Relation_Symbol_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (rel_sym) {
+  case 0:
+    return LESS_THAN;
+  case 1:
+    return LESS_OR_EQUAL;
+  case 2:
+    return EQUAL;
+  case 3:
+    return GREATER_OR_EQUAL;
+  case 4:
+    return GREATER_THAN;
+  case 5:
+    return NOT_EQUAL;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+Optimization_Mode
+build_cxx_optimization_mode(JNIEnv* env, jobject j_opt_mode) {
+  jint opt_mode
+    = env->CallIntMethod(j_opt_mode, cached_FMIDs.Optimization_Mode_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (opt_mode) {
+  case 0:
+    return MINIMIZATION;
+  case 1:
+    return MAXIMIZATION;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status) {
+  jfieldID fID;
+  switch (mip_status) {
+  case UNFEASIBLE_MIP_PROBLEM:
+    fID = cached_FMIDs.MIP_Problem_Status_UNFEASIBLE_MIP_PROBLEM_ID;
+    break;
+  case UNBOUNDED_MIP_PROBLEM:
+    fID = cached_FMIDs.MIP_Problem_Status_UNBOUNDED_MIP_PROBLEM_ID;
+    break;
+  case OPTIMIZED_MIP_PROBLEM:
+    fID = cached_FMIDs.MIP_Problem_Status_OPTIMIZED_MIP_PROBLEM_ID;
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+  return env->GetStaticObjectField(cached_classes.MIP_Problem_Status, fID);
+}
+
+jobject
+build_java_pip_status(JNIEnv* env, const PIP_Problem_Status& pip_status) {
+  jfieldID fID;
+  switch (pip_status) {
+  case UNFEASIBLE_PIP_PROBLEM:
+    fID = cached_FMIDs.PIP_Problem_Status_UNFEASIBLE_PIP_PROBLEM_ID;
+    break;
+  case OPTIMIZED_PIP_PROBLEM:
+    fID = cached_FMIDs.PIP_Problem_Status_OPTIMIZED_PIP_PROBLEM_ID;
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+  return env->GetStaticObjectField(cached_classes.PIP_Problem_Status, fID);
+}
+
+jobject
+build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode) {
+  jfieldID fID;
+  switch (opt_mode) {
+  case MINIMIZATION:
+    fID = cached_FMIDs.Optimization_Mode_MINIMIZATION_ID;
+    break;
+  case MAXIMIZATION:
+    fID = cached_FMIDs.Optimization_Mode_MAXIMIZATION_ID;
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+  return env->GetStaticObjectField(cached_classes.Optimization_Mode, fID);
+}
+
+MIP_Problem::Control_Parameter_Name
+build_cxx_control_parameter_name(JNIEnv* env, jobject j_cp_name) {
+  jclass cp_name_class = env->GetObjectClass(j_cp_name);
+  CHECK_RESULT_ASSERT(env, cp_name_class);
+  jmethodID cp_name_ordinal_id
+    = env->GetMethodID(cp_name_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, cp_name_ordinal_id);
+  jint cp_name = env->CallIntMethod(j_cp_name, cp_name_ordinal_id);
+  CHECK_EXCEPTION_ASSERT(env);
+  if (cp_name == 0)
+    return MIP_Problem::PRICING;
+  else
+    PPL_JAVA_UNEXPECTED;
+}
+
+jobject
+build_java_control_parameter_name
+(JNIEnv* env,const MIP_Problem::Control_Parameter_Name& cp_name) {
+  jclass j_cp_name_class
+    = env->FindClass("parma_polyhedra_library/Control_Parameter_Name");
+  CHECK_RESULT_ASSERT(env, j_cp_name_class);
+  jfieldID cp_name_pricing_get_id
+    = env->GetStaticFieldID(j_cp_name_class, "PRICING",
+                            "Lparma_polyhedra_library/Control_Parameter_Name;");
+  CHECK_RESULT_ASSERT(env, cp_name_pricing_get_id);
+  if (cp_name == MIP_Problem::PRICING)
+    return env->GetStaticObjectField(j_cp_name_class,
+                                     cp_name_pricing_get_id);
+  else
+    PPL_UNREACHABLE;
+}
+
+MIP_Problem::Control_Parameter_Value
+build_cxx_control_parameter_value(JNIEnv* env, jobject j_cp_value) {
+  jclass cp_value_class = env->GetObjectClass(j_cp_value);
+  CHECK_RESULT_ASSERT(env, cp_value_class);
+  jmethodID cp_value_ordinal_id
+    = env->GetMethodID(cp_value_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, cp_value_ordinal_id);
+  jint cp_value = env->CallIntMethod(j_cp_value, cp_value_ordinal_id);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (cp_value) {
+  case 0:
+    return MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT;
+  case 1:
+    return MIP_Problem::PRICING_STEEPEST_EDGE_EXACT;
+  case 2:
+    return MIP_Problem::PRICING_TEXTBOOK;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+build_java_control_parameter_value
+(JNIEnv* env, const MIP_Problem::Control_Parameter_Value& cp_value) {
+  jclass j_cp_value_class
+    = env->FindClass("parma_polyhedra_library/Control_Parameter_Value");
+  CHECK_RESULT_ASSERT(env, j_cp_value_class);
+  const char* field_name;
+  switch (cp_value) {
+  case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT:
+    field_name = "PRICING_STEEPEST_EDGE_FLOAT";
+    break;
+  case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT:
+    field_name = "PRICING_STEEPEST_EDGE_EXACT";
+    break;
+  case MIP_Problem::PRICING_TEXTBOOK:
+    field_name = "PRICING_TEXTBOOK";
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+  jfieldID fID = env->GetStaticFieldID(j_cp_value_class, field_name,
+                                       "Lparma_polyhedra_library/Control_Parameter_Value;");
+  CHECK_RESULT_ASSERT(env, fID);
+  return env->GetStaticObjectField(j_cp_value_class, fID);
+}
+
+PIP_Problem::Control_Parameter_Name
+build_cxx_pip_problem_control_parameter_name(JNIEnv* env, jobject j_cp_name) {
+  jclass cp_name_class = env->GetObjectClass(j_cp_name);
+  CHECK_RESULT_ASSERT(env, cp_name_class);
+  jmethodID cp_name_ordinal_id
+    = env->GetMethodID(cp_name_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, cp_name_ordinal_id);
+  jint cp_name = env->CallIntMethod(j_cp_name, cp_name_ordinal_id);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (cp_name) {
+  case 0:
+    return PIP_Problem::CUTTING_STRATEGY;
+  case 1:
+    return PIP_Problem::PIVOT_ROW_STRATEGY;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+build_java_pip_problem_control_parameter_name
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Name& cp_name) {
+  jclass j_cp_name_class
+    = env->FindClass("parma_polyhedra_library/PIP_Problem_Control_Parameter_Name");
+  CHECK_RESULT_ASSERT(env, j_cp_name_class);
+  jfieldID cp_name_cutting_strategy_get_id
+    = env->GetStaticFieldID(j_cp_name_class, "CUTTING_STRATEGY",
+                            "Lparma_polyhedra_library/PIP_Problem_Control_Parameter_Name;");
+  CHECK_RESULT_ASSERT(env, cp_name_cutting_strategy_get_id);
+  jfieldID cp_name_pivot_row_strategy_get_id
+    = env->GetStaticFieldID(j_cp_name_class, "PIVOT_ROW_STRATEGY",
+                            "Lparma_polyhedra_library/PIP_Problem_Control_Parameter_Name;");
+  CHECK_RESULT_ASSERT(env, cp_name_pivot_row_strategy_get_id);
+  switch (cp_name) {
+  case PIP_Problem::CUTTING_STRATEGY:
+    return env->GetStaticObjectField(j_cp_name_class,
+                                     cp_name_cutting_strategy_get_id);
+  case PIP_Problem::PIVOT_ROW_STRATEGY:
+    return env->GetStaticObjectField(j_cp_name_class,
+                                     cp_name_pivot_row_strategy_get_id);
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PIP_Problem::Control_Parameter_Value
+build_cxx_pip_problem_control_parameter_value(JNIEnv* env, jobject j_cp_value) {
+  jclass cp_value_class = env->GetObjectClass(j_cp_value);
+  CHECK_RESULT_ASSERT(env, cp_value_class);
+  jmethodID cp_value_ordinal_id
+    = env->GetMethodID(cp_value_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, cp_value_ordinal_id);
+  jint cp_value = env->CallIntMethod(j_cp_value, cp_value_ordinal_id);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (cp_value) {
+  case 0:
+    return PIP_Problem::CUTTING_STRATEGY_FIRST;
+  case 1:
+    return PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+  case 2:
+    return PIP_Problem::CUTTING_STRATEGY_ALL;
+  case 3:
+    return PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+  case 4:
+    return PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+build_java_pip_problem_control_parameter_value
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Value& cp_value) {
+  jclass j_cp_value_class
+    = env->FindClass("parma_polyhedra_library/PIP_Problem_Control_Parameter_Value");
+  CHECK_RESULT_ASSERT(env, j_cp_value_class);
+  const char* field_name;
+  switch (cp_value) {
+  case PIP_Problem::CUTTING_STRATEGY_FIRST:
+    field_name = "CUTTING_STRATEGY_FIRST";
+    break;
+  case PIP_Problem::CUTTING_STRATEGY_DEEPEST:
+    field_name = "CUTTING_STRATEGY_DEEPEST";
+    break;
+  case PIP_Problem::CUTTING_STRATEGY_ALL:
+    field_name = "CUTTING_STRATEGY_ALL";
+    break;
+  case PIP_Problem::PIVOT_ROW_STRATEGY_FIRST:
+    field_name = "PIVOT_ROW_STRATEGY_FIRST";
+    break;
+  case PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN:
+    field_name = "PIVOT_ROW_STRATEGY_MAX_COLUMN";
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+  jfieldID fID = env->GetStaticFieldID(j_cp_value_class, field_name,
+                                       "Lparma_polyhedra_library/PIP_Problem_Control_Parameter_Value;");
+  CHECK_RESULT_ASSERT(env, fID);
+  return env->GetStaticObjectField(j_cp_value_class, fID);
+}
+
+Constraint
+build_cxx_constraint(JNIEnv* env, jobject j_constraint) {
+  jobject lhs_value
+    = env->GetObjectField(j_constraint, cached_FMIDs.Constraint_lhs_ID);
+  jobject rhs_value
+    = env->GetObjectField(j_constraint, cached_FMIDs.Constraint_rhs_ID);
+  jobject kind
+    = env->GetObjectField(j_constraint, cached_FMIDs.Constraint_kind_ID);
+  Linear_Expression first_le = build_cxx_linear_expression(env, lhs_value);
+  Linear_Expression second_le = build_cxx_linear_expression(env, rhs_value);
+  jint rel_sym
+    = env->CallIntMethod(kind, cached_FMIDs.Relation_Symbol_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (rel_sym) {
+  case 0:
+    return Constraint(first_le < second_le);
+  case 1:
+    return Constraint(first_le <= second_le);
+  case 2:
+    return Constraint(first_le == second_le);
+  case 3:
+    return Constraint(first_le >= second_le);
+  case 4:
+    return Constraint(first_le > second_le);
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+Linear_Expression
+build_cxx_linear_expression(JNIEnv* env, jobject j_le) {
+  jfieldID fID;
+  jclass current_class = env->GetObjectClass(j_le);
+  // LE_Variable
+  if (env->IsAssignableFrom(current_class,
+                            cached_classes.Linear_Expression_Variable)) {
+    jmethodID mID = cached_FMIDs.Linear_Expression_Variable_var_id_ID;
+    jlong var_id = env->CallLongMethod(j_le, mID);
+    return Linear_Expression(Variable(var_id));
+  }
+  // LE_Coefficient
+  if (env->IsAssignableFrom(current_class,
+                            cached_classes.Linear_Expression_Coefficient)) {
+    fID = cached_FMIDs.Linear_Expression_Coefficient_coeff_ID;
+    jobject ppl_coeff = env->GetObjectField(j_le, fID);
+    return Linear_Expression(build_cxx_coeff(env, ppl_coeff));
+  }
+  // LE_Sum
+  if (env->IsAssignableFrom(current_class,
+                            cached_classes.Linear_Expression_Sum)) {
+    fID = cached_FMIDs.Linear_Expression_Sum_lhs_ID;
+    jobject l_value = env->GetObjectField(j_le, fID);
+    fID = cached_FMIDs.Linear_Expression_Sum_rhs_ID;
+    jobject r_value = env->GetObjectField(j_le, fID);
+    return build_cxx_linear_expression(env, l_value)
+      + build_cxx_linear_expression(env, r_value);
+  }
+  // LE_Times
+  if (env->IsAssignableFrom(current_class,
+                            cached_classes.Linear_Expression_Times)) {
+    fID = cached_FMIDs.Linear_Expression_Times_coeff_ID;
+    jobject coeff_value = env->GetObjectField(j_le, fID);
+    fID = cached_FMIDs.Linear_Expression_Times_lin_expr_ID;
+    jobject le_value = env->GetObjectField(j_le, fID);
+    return build_cxx_coeff(env, coeff_value)
+      * build_cxx_linear_expression(env, le_value);
+  }
+  // LE_Difference
+  if (env->IsAssignableFrom(current_class,
+                            cached_classes.Linear_Expression_Difference)) {
+    fID = cached_FMIDs.Linear_Expression_Difference_lhs_ID;
+    jobject l_value = env->GetObjectField(j_le,fID);
+    fID = cached_FMIDs.Linear_Expression_Difference_rhs_ID;
+    jobject r_value = env->GetObjectField(j_le, fID);
+    return build_cxx_linear_expression(env, l_value)
+      - build_cxx_linear_expression(env, r_value);
+  }
+  // LE_Unary_Minus
+  if (env->IsAssignableFrom(current_class,
+                            cached_classes.Linear_Expression_Unary_Minus)) {
+    fID = cached_FMIDs.Linear_Expression_Unary_Minus_arg_ID;
+    jobject le_value = env->GetObjectField(j_le, fID);
+    return -build_cxx_linear_expression(env, le_value);
+  }
+  // All cases dealt with above.
+  PPL_JAVA_UNEXPECTED;
+}
+
+Generator
+build_cxx_generator(JNIEnv* env, jobject j_generator) {
+  jobject j_le
+    = env->GetObjectField(j_generator, cached_FMIDs.Generator_le_ID);
+  jobject generator_type
+    = env->GetObjectField(j_generator, cached_FMIDs.Generator_gt_ID);
+  jint generator_type_ordinal
+    = env->CallIntMethod(generator_type,
+                         cached_FMIDs.Generator_Type_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (generator_type_ordinal) {
+  case 0:
+    return line(build_cxx_linear_expression(env, j_le));
+  case 1:
+    return ray(build_cxx_linear_expression(env, j_le));
+  case 2:
+    {
+      jobject j_div
+        = env->GetObjectField(j_generator, cached_FMIDs.Generator_div_ID);
+      return point(build_cxx_linear_expression(env, j_le),
+                   build_cxx_coeff(env, j_div));
+    }
+  case 3:
+    {
+      jobject j_div
+        = env->GetObjectField(j_generator, cached_FMIDs.Generator_div_ID);
+      return closure_point(build_cxx_linear_expression(env, j_le),
+                           build_cxx_coeff(env, j_div));
+    }
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+Grid_Generator
+build_cxx_grid_generator(JNIEnv* env, jobject j_grid_generator) {
+  jobject j_le
+    = env->GetObjectField(j_grid_generator, cached_FMIDs.Grid_Generator_le_ID);
+  jobject grid_generator_type
+    = env->GetObjectField(j_grid_generator, cached_FMIDs.Grid_Generator_gt_ID);
+  jint grid_generator_type_ordinal
+    = env->CallIntMethod(grid_generator_type,
+                         cached_FMIDs.Grid_Generator_Type_ordinal_ID);
+  CHECK_EXCEPTION_ASSERT(env);
+  switch (grid_generator_type_ordinal) {
+  case 0:
+    return grid_line(build_cxx_linear_expression(env, j_le));
+  case 1:
+    {
+      jobject j_div = env->GetObjectField(j_grid_generator,
+                                          cached_FMIDs.Grid_Generator_div_ID);
+      return parameter(build_cxx_linear_expression(env, j_le),
+                       build_cxx_coeff(env, j_div));
+    }
+  case 2:
+    {
+      jobject j_div = env->GetObjectField(j_grid_generator,
+                                          cached_FMIDs.Grid_Generator_div_ID);
+      return grid_point(build_cxx_linear_expression(env, j_le),
+                        build_cxx_coeff(env, j_div));
+    }
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+build_java_linear_expression_coefficient(JNIEnv* env, const Coefficient& c) {
+  jobject j_coeff = build_java_coeff(env, c);
+  jobject ret
+    = env->NewObject(cached_classes.Linear_Expression_Coefficient,
+                     cached_FMIDs.Linear_Expression_Coefficient_init_ID,
+                     j_coeff);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+void
+set_generator(JNIEnv* env, jobject dst, jobject src) {
+  jobject src_gt = env->GetObjectField(src, cached_FMIDs.Generator_gt_ID);
+  env->SetObjectField(dst, cached_FMIDs.Generator_gt_ID, src_gt);
+  jobject src_le = env->GetObjectField(src, cached_FMIDs.Generator_le_ID);
+  env->SetObjectField(dst, cached_FMIDs.Generator_le_ID, src_le);
+  jobject src_div = env->GetObjectField(src, cached_FMIDs.Generator_div_ID);
+  env->SetObjectField(dst, cached_FMIDs.Generator_div_ID, src_div);
+}
+
+void
+set_pair_element(JNIEnv* env, jobject dst_pair, int arg, jobject src) {
+  switch (arg) {
+  case 0:
+    env->SetObjectField(dst_pair, cached_FMIDs.Pair_first_ID, src);
+    break;
+  case 1:
+    env->SetObjectField(dst_pair, cached_FMIDs.Pair_second_ID, src);
+    break;
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+get_pair_element(JNIEnv* env, int arg, jobject j_pair) {
+  switch (arg) {
+  case 0:
+    return env->GetObjectField(j_pair, cached_FMIDs.Pair_first_ID);
+  case 1:
+    return env->GetObjectField(j_pair, cached_FMIDs.Pair_second_ID);
+  default:
+    PPL_JAVA_UNEXPECTED;
+  }
+}
+
+jobject
+build_java_constraint(JNIEnv* env, const Constraint& c) {
+  jobject lhs = build_linear_expression(env, c);
+  jobject rhs
+    = build_java_linear_expression_coefficient(env, -c.inhomogeneous_term());
+  jfieldID fID;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    fID = cached_FMIDs.Relation_Symbol_EQUAL_ID;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    fID = cached_FMIDs.Relation_Symbol_GREATER_OR_EQUAL_ID;
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    fID = cached_FMIDs.Relation_Symbol_GREATER_THAN_ID;
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+  jobject relation
+    = env->GetStaticObjectField(cached_classes.Relation_Symbol, fID);
+  jobject ret = env->NewObject(cached_classes.Constraint,
+                               cached_FMIDs.Constraint_init_ID,
+                               lhs, relation, rhs);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+jobject
+build_java_congruence(JNIEnv* env, const Congruence& cg) {
+  jobject j_mod = build_java_coeff(env, cg.modulus());
+  jobject j_lhs = build_linear_expression(env, cg);
+  jobject j_rhs
+    = build_java_linear_expression_coefficient(env, -cg.inhomogeneous_term());
+  jobject ret = env->NewObject(cached_classes.Congruence,
+                               cached_FMIDs.Congruence_init_ID,
+                               j_lhs, j_rhs, j_mod);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+jobject
+build_java_generator(JNIEnv* env, const Generator& g) {
+  jobject j_g_le = build_linear_expression(env, g);
+  jobject ret;
+  switch (g.type()) {
+  case Generator::LINE:
+    ret = env->CallStaticObjectMethod(cached_classes.Generator,
+                                      cached_FMIDs.Generator_line_ID,
+                                      j_g_le);
+    break;
+  case Generator::RAY:
+    ret = env->CallStaticObjectMethod(cached_classes.Generator,
+                                      cached_FMIDs.Generator_ray_ID,
+                                      j_g_le);
+    break;
+  case Generator::POINT:
+    {
+      const Coefficient& divisor = g.divisor();
+      jobject j_div = build_java_coeff(env, divisor);
+      ret = env->CallStaticObjectMethod(cached_classes.Generator,
+                                        cached_FMIDs.Generator_point_ID,
+                                        j_g_le, j_div);
+      break;
+    }
+  case Generator::CLOSURE_POINT:
+    {
+      const Coefficient& divisor = g.divisor();
+      jobject j_div = build_java_coeff(env, divisor);
+      ret = env->CallStaticObjectMethod(cached_classes.Generator,
+                                        cached_FMIDs.Generator_closure_point_ID,
+                                        j_g_le, j_div);
+      break;
+    }
+  default:
+    PPL_UNREACHABLE;
+  }
+  CHECK_EXCEPTION_THROW(env);
+  return ret;
+}
+
+jobject
+build_java_grid_generator(JNIEnv* env, const Grid_Generator& g) {
+  jobject j_g_le = build_linear_expression(env, g);
+  jobject ret;
+  switch (g.type()) {
+  case Grid_Generator::LINE:
+    ret = env->CallStaticObjectMethod(cached_classes.Grid_Generator,
+                                      cached_FMIDs.Grid_Generator_grid_line_ID,
+                                      j_g_le);
+    break;
+  case Grid_Generator::PARAMETER:
+    {
+      const Coefficient& divisor = g.divisor();
+      jobject j_div = build_java_coeff(env, divisor);
+      ret = env->CallStaticObjectMethod(cached_classes.Grid_Generator,
+                                        cached_FMIDs.Grid_Generator_parameter_ID,
+                                        j_g_le, j_div);
+      break;
+    }
+  case Grid_Generator::POINT:
+    {
+      const Coefficient& divisor = g.divisor();
+      jobject j_div = build_java_coeff(env, divisor);
+      ret = env->CallStaticObjectMethod(cached_classes.Grid_Generator,
+                                        cached_FMIDs.Grid_Generator_grid_point_ID,
+                                        j_g_le, j_div);
+      break;
+    }
+  default:
+    PPL_UNREACHABLE;
+  }
+  CHECK_EXCEPTION_THROW(env);
+  return ret;
+}
+
+jobject
+build_java_constraint_system(JNIEnv* env, const Constraint_System& cs) {
+  jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+                                cached_FMIDs.Constraint_System_init_ID);
+  CHECK_RESULT_THROW(env, j_cs);
+  for (Constraint_System::const_iterator v_begin = cs.begin(),
+         v_end = cs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_constraint = build_java_constraint(env, *v_begin);
+    env->CallBooleanMethod(j_cs,
+                           cached_FMIDs.Constraint_System_add_ID,
+                           j_constraint);
+    CHECK_EXCEPTION_THROW(env);
+  }
+  return j_cs;
+}
+
+jobject
+build_java_generator_system(JNIEnv* env, const Generator_System& gs) {
+  jobject j_gs = env->NewObject(cached_classes.Generator_System,
+                                cached_FMIDs.Generator_System_init_ID);
+  CHECK_RESULT_THROW(env, j_gs);
+  for (Generator_System::const_iterator v_begin = gs.begin(),
+         v_end = gs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_generator = build_java_generator(env, *v_begin);
+    env->CallBooleanMethod(j_gs,
+                           cached_FMIDs.Generator_System_add_ID,
+                           j_generator);
+    CHECK_EXCEPTION_THROW(env);
+  }
+  return j_gs;
+}
+
+jobject
+build_java_grid_generator_system(JNIEnv* env,
+                                 const Grid_Generator_System& gs) {
+  jobject j_gs = env->NewObject(cached_classes.Grid_Generator_System,
+                                cached_FMIDs.Grid_Generator_System_init_ID);
+  CHECK_RESULT_THROW(env, j_gs);
+  for (Grid_Generator_System::const_iterator v_begin = gs.begin(),
+         v_end = gs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_generator = build_java_grid_generator(env, *v_begin);
+    env->CallBooleanMethod(j_gs,
+                           cached_FMIDs.Grid_Generator_System_add_ID,
+                           j_generator);
+    CHECK_EXCEPTION_THROW(env);
+  }
+  return j_gs;
+}
+
+jobject
+build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs) {
+  jobject j_cgs = env->NewObject(cached_classes.Congruence_System,
+                                 cached_FMIDs.Congruence_System_init_ID);
+  CHECK_RESULT_THROW(env, j_cgs);
+  for (Congruence_System::const_iterator v_begin = cgs.begin(),
+         v_end = cgs.end(); v_begin != v_end; ++v_begin) {
+    jobject j_congruence = build_java_congruence(env,*v_begin);
+    env->CallBooleanMethod(j_cgs,
+                           cached_FMIDs.Congruence_System_add_ID,
+                           j_congruence);
+    CHECK_EXCEPTION_THROW(env);
+  }
+  return j_cgs;
+}
+
+jobject
+build_java_artificial_parameter
+(JNIEnv* env, const PIP_Tree_Node::Artificial_Parameter& art) {
+  jobject j_le = build_linear_expression(env, art);
+  jobject j_den = build_java_coeff(env, art.denominator());
+  jobject ret = env->NewObject(cached_classes.Artificial_Parameter,
+                               cached_FMIDs.Artificial_Parameter_init_ID,
+                               j_le, j_den);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+void
+Java_Variable_output_function(std::ostream& s, Variable v) {
+  // Use cached Java Virtual Machine pointer to retrieve JNI env.
+  JavaVM* jvm = cached_classes.jvm;
+  JNIEnv *env = 0;
+  jvm->AttachCurrentThread((void **)&env, NULL);
+  CHECK_EXCEPTION_ASSERT(env);
+  // Retrieve stringifier object.
+  jclass var_class = cached_classes.Variable;
+  jfieldID fID = cached_FMIDs.Variable_stringifier_ID;
+  jobject stringifier = env->GetStaticObjectField(var_class, fID);
+  CHECK_RESULT_THROW(env, stringifier);
+  // Use it to get the Java string for the variable.
+  jmethodID mID = cached_FMIDs.Variable_Stringifier_stringify_ID;
+#ifndef NDEBUG
+  {
+    // Dynamically retrieve stringifier class and use it to compute
+    // the corresponding method ID, so as to compare it with cached one.
+    jclass dyn_class = env->GetObjectClass(stringifier);
+    jmethodID dyn_mID = env->GetMethodID(dyn_class, "stringify",
+                                         "(J)Ljava/lang/String;");
+    CHECK_RESULT_ASSERT(env, mID == dyn_mID);
+  }
+#endif // #ifndef NDEBUG
+  jlong j_var_id = v.id();
+  jstring bi_string
+    = (jstring) env->CallObjectMethod(stringifier, mID, j_var_id);
+  CHECK_EXCEPTION_THROW(env);
+  // Convert the string and print it on C++ stream.
+  const char* nativeString = env->GetStringUTFChars(bi_string, 0);
+  CHECK_RESULT_THROW(env, nativeString);
+  s << nativeString;
+  env->ReleaseStringUTFChars(bi_string, nativeString);
+}
+
+} // namespace Java
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Java/jni/ppl_java_common_defs.hh b/interfaces/Java/jni/ppl_java_common_defs.hh
new file mode 100644
index 0000000..fb33500
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common_defs.hh
@@ -0,0 +1,899 @@
+/* Domain-independent part of the Java interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_java_common_defs_hh
+#define PPL_ppl_java_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+
+#include <jni.h>
+#include "interfaced_boxes.hh"
+#include "marked_pointers.hh"
+
+#define PPL_JAVA_UNEXPECTED \
+  throw std::runtime_error("PPL Java interface internal error")
+
+#define CATCH_ALL \
+  catch(const Java_ExceptionOccurred& e) { \
+  } \
+  catch(const std::overflow_error& e) { \
+    handle_exception(env, e); \
+  } \
+  catch(const std::length_error& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const std::bad_alloc& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const std::domain_error& e) { \
+    handle_exception(env, e); \
+  } \
+ catch (const std::invalid_argument& e) { \
+    handle_exception(env, e); \
+  } \
+ catch(const std::logic_error& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const std::exception& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const timeout_exception& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (const deterministic_timeout_exception& e) { \
+    handle_exception(env, e); \
+  } \
+  catch (...) { \
+    handle_exception(env); \
+  }
+
+#define CHECK_EXCEPTION_ASSERT(env)      \
+  assert(!env->ExceptionOccurred())
+#define CHECK_EXCEPTION_THROW(env)       \
+  do {                                   \
+    if (env->ExceptionOccurred())        \
+      throw Java_ExceptionOccurred();    \
+  } while (0)
+#define CHECK_EXCEPTION_RETURN(env, val) \
+  do {                                   \
+    if (env->ExceptionOccurred())        \
+      return val;                        \
+  } while (0)
+#define CHECK_EXCEPTION_RETURN_VOID(env) \
+  do {                                   \
+    if (env->ExceptionOccurred())        \
+      return;                            \
+  } while (0)
+#define CHECK_RESULT_ABORT(env, cond)    \
+  do {                                   \
+    if (!(cond))                         \
+      abort();                           \
+  } while (0)
+#define CHECK_RESULT_ASSERT(env, cond)   \
+  assert(cond)
+#define CHECK_RESULT_THROW(env, cond)    \
+  do {                                   \
+    if (!(cond))                         \
+      throw Java_ExceptionOccurred();    \
+  } while (0)
+#define CHECK_RESULT_RETURN(env, cond, val)   \
+  do {                                        \
+    if (!(cond))                              \
+      return val;                             \
+  } while (0)
+#define CHECK_RESULT_RETURN_VOID(env, cond)   \
+  do {                                        \
+    if (!(cond))                              \
+      return;                                 \
+  } while (0)
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Java {
+
+struct Java_ExceptionOccurred : public std::exception {
+};
+
+class timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+class deterministic_timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+extern Parma_Polyhedra_Library::Watchdog* p_timeout_object;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+extern Weightwatch* p_deterministic_timeout_object;
+
+void reset_timeout();
+
+void reset_deterministic_timeout();
+
+void
+handle_exception(JNIEnv* env, const std::logic_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::invalid_argument& e);
+
+void
+handle_exception(JNIEnv* env, const std::domain_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::overflow_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::length_error& e);
+
+void
+handle_exception(JNIEnv* env, const std::bad_alloc&);
+
+void
+handle_exception(JNIEnv* env, const std::exception& e);
+
+void
+handle_exception(JNIEnv* env, const timeout_exception& e);
+
+void
+handle_exception(JNIEnv* env, const deterministic_timeout_exception& e);
+
+void
+handle_exception(JNIEnv* env);
+
+//! A cache for global references to Java classes.
+/*!
+  The cache is loaded by \c Parma_Polyhedra_Library.initialize_library();
+  It is cleared by \c Parma_Polyhedra_Library.finalize_library().
+*/
+class Java_Class_Cache {
+public:
+  // The Java VM pointer (not a class, but sometimes needed).
+  JavaVM* jvm;
+  // Non-PPL types.
+  jclass Boolean;
+  jclass Integer;
+  jclass Long;
+  jclass Iterator;
+  // PPL types.
+  jclass Artificial_Parameter;
+  jclass Artificial_Parameter_Sequence;
+  jclass Bounded_Integer_Type_Overflow;
+  jclass Bounded_Integer_Type_Representation;
+  jclass Bounded_Integer_Type_Width;
+  jclass By_Reference;
+  jclass Coefficient;
+  jclass Congruence;
+  jclass Constraint;
+  jclass Generator;
+  jclass Grid_Generator;
+  jclass Generator_Type;
+  jclass Grid_Generator_Type;
+  jclass Constraint_System;
+  jclass Congruence_System;
+  jclass Generator_System;
+  jclass Grid_Generator_System;
+  jclass Linear_Expression;
+  jclass Linear_Expression_Coefficient;
+  jclass Linear_Expression_Difference;
+  jclass Linear_Expression_Sum;
+  jclass Linear_Expression_Times;
+  jclass Linear_Expression_Unary_Minus;
+  jclass Linear_Expression_Variable;
+  jclass MIP_Problem_Status;
+  jclass Optimization_Mode;
+  jclass Pair;
+  jclass PIP_Problem_Control_Parameter_Name;
+  jclass PIP_Problem_Control_Parameter_Value;
+  jclass PIP_Problem_Status;
+  jclass Poly_Con_Relation;
+  jclass Poly_Gen_Relation;
+  jclass PPL_Object;
+  jclass Relation_Symbol;
+  jclass Variable;
+  jclass Variable_Stringifier;
+  jclass Variables_Set;
+
+  //! Default constructor.
+  Java_Class_Cache();
+
+  //! Initializes all cache fields.
+  void init_cache(JNIEnv* env);
+
+  //! Resets all fields to \c NULL.
+  void clear_cache(JNIEnv* env);
+
+private:
+  //! Sets \p field to a global reference to Java class called \p name.
+  void init_cache(JNIEnv* env, jclass& field, const char* name);
+
+  //! Resets \p field to \c NULL, deleting the global reference (if any).
+  void clear_cache(JNIEnv* env, jclass& field);
+
+  // Private and not implemented: copy construction not allowed.
+  Java_Class_Cache(const Java_Class_Cache&);
+  // Private and not implemented: copy assignment not allowed.
+  Java_Class_Cache& operator=(const Java_Class_Cache&);
+};
+
+//! A cache for field and method IDs of Java classes.
+/*!
+  The IDs for fields and methods of PPL Java classes are automatically
+  by the static initializer of the corresponding Java class.
+  The static initializers of some PPL Java class also stores the IDs
+  for fields and methods of non-PPL classes (e.g., Boolean, Long, etc.).
+*/
+struct Java_FMID_Cache {
+  // Non-PPL type method IDs: stored when loading Coefficient.
+  jmethodID Boolean_valueOf_ID;
+  jmethodID Boolean_boolValue_ID;
+  jmethodID Integer_valueOf_ID;
+  jmethodID Integer_intValue_ID;
+  jmethodID Long_valueOf_ID;
+  jmethodID Long_longValue_ID;
+
+  // PPL type field and method IDs.
+  // Artificial_Parameter.
+  jfieldID Artificial_Parameter_le_ID;
+  jfieldID Artificial_Parameter_den_ID;
+  jmethodID Artificial_Parameter_init_ID;
+  jmethodID Artificial_Parameter_Sequence_init_ID;
+  jmethodID Artificial_Parameter_Sequence_add_ID;
+  // Bounded_Integer_Type_Overflow.
+  jfieldID Bounded_Integer_Type_Overflow_OVERFLOW_WRAPS_ID;
+  jfieldID Bounded_Integer_Type_Overflow_OVERFLOW_UNDEFINED_ID;
+  jfieldID Bounded_Integer_Type_Overflow_OVERFLOW_IMPOSSIBLE_ID;
+  jmethodID Bounded_Integer_Type_Overflow_ordinal_ID;
+  // Bounded_Integer_Type_Representation.
+  jfieldID Bounded_Integer_Type_Representation_UNSIGNED_ID;
+  jfieldID Bounded_Integer_Type_Representation_SIGNED_2_COMPLEMENT_ID;
+  jmethodID Bounded_Integer_Type_Representation_ordinal_ID;
+  // Bounded_Integer_Type_Width.
+  jfieldID Bounded_Integer_Type_Width_BITS_8_ID;
+  jfieldID Bounded_Integer_Type_Width_BITS_16_ID;
+  jfieldID Bounded_Integer_Type_Width_BITS_32_ID;
+  jfieldID Bounded_Integer_Type_Width_BITS_64_ID;
+  jfieldID Bounded_Integer_Type_Width_BITS_128_ID;
+  jmethodID Bounded_Integer_Type_Width_ordinal_ID;
+  // By_Reference.
+  jfieldID By_Reference_obj_ID;
+  jmethodID By_Reference_init_ID;
+  // Coefficient.
+  jfieldID Coefficient_value_ID;
+  jmethodID Coefficient_init_from_String_ID;
+  jmethodID Coefficient_toString_ID;
+  // Complexity_Class.
+  jmethodID Complexity_Class_ordinal_ID;
+  // Congruence.
+  jfieldID Congruence_mod_ID;
+  jfieldID Congruence_lhs_ID;
+  jfieldID Congruence_rhs_ID;
+  jmethodID Congruence_init_ID;
+  // Constraint.
+  jfieldID Constraint_lhs_ID;
+  jfieldID Constraint_rhs_ID;
+  jfieldID Constraint_kind_ID;
+  jmethodID Constraint_init_ID;
+  // Degenerate_Element.
+  jmethodID Degenerate_Element_ordinal_ID;
+  // Generator.
+  jfieldID Generator_gt_ID;
+  jfieldID Generator_le_ID;
+  jfieldID Generator_div_ID;
+  jmethodID Generator_line_ID;
+  jmethodID Generator_ray_ID;
+  jmethodID Generator_point_ID;
+  jmethodID Generator_closure_point_ID;
+  // Grid_Generator.
+  jfieldID Grid_Generator_gt_ID;
+  jfieldID Grid_Generator_le_ID;
+  jfieldID Grid_Generator_div_ID;
+  jmethodID Grid_Generator_grid_line_ID;
+  jmethodID Grid_Generator_parameter_ID;
+  jmethodID Grid_Generator_grid_point_ID;
+  // (Grid_) Generator_Type.
+  jmethodID Generator_Type_ordinal_ID;
+  jmethodID Grid_Generator_Type_ordinal_ID;
+  // Systems of Constraint, Congruence, Generator and Grid_Generator.
+  jmethodID Constraint_System_init_ID;
+  jmethodID Constraint_System_add_ID;
+  jmethodID Congruence_System_init_ID;
+  jmethodID Congruence_System_add_ID;
+  jmethodID Generator_System_init_ID;
+  jmethodID Generator_System_add_ID;
+  jmethodID Grid_Generator_System_init_ID;
+  jmethodID Grid_Generator_System_add_ID;
+  // System_Iterator: stored when loading Constraint_System.
+  jmethodID System_iterator_ID;
+  jmethodID System_Iterator_has_next_ID;
+  jmethodID System_Iterator_next_ID;
+  // Linear_Expression.
+  jmethodID Linear_Expression_sum_ID;
+  jmethodID Linear_Expression_times_ID;
+  // Classes extending Linear_Expression.
+  jfieldID Linear_Expression_Coefficient_coeff_ID;
+  jmethodID Linear_Expression_Coefficient_init_ID;
+  jfieldID Linear_Expression_Difference_lhs_ID;
+  jfieldID Linear_Expression_Difference_rhs_ID;
+  jfieldID Linear_Expression_Sum_lhs_ID;
+  jfieldID Linear_Expression_Sum_rhs_ID;
+  jfieldID Linear_Expression_Times_coeff_ID;
+  jfieldID Linear_Expression_Times_lin_expr_ID;
+  jmethodID Linear_Expression_Times_init_from_coeff_var_ID;
+  jfieldID Linear_Expression_Unary_Minus_arg_ID;
+  jmethodID Linear_Expression_Variable_init_ID;
+  jmethodID Linear_Expression_Variable_var_id_ID;
+  // MIP_Problem_Status.
+  jfieldID MIP_Problem_Status_UNFEASIBLE_MIP_PROBLEM_ID;
+  jfieldID MIP_Problem_Status_UNBOUNDED_MIP_PROBLEM_ID;
+  jfieldID MIP_Problem_Status_OPTIMIZED_MIP_PROBLEM_ID;
+  jmethodID MIP_Problem_Status_ordinal_ID;
+  // Optmization_Mode.
+  jfieldID Optimization_Mode_MAXIMIZATION_ID;
+  jfieldID Optimization_Mode_MINIMIZATION_ID;
+  jmethodID Optimization_Mode_ordinal_ID;
+  // PIP_Problem_Control_Parameter_Name.
+  jfieldID PIP_Problem_Control_Parameter_Name_CUTTING_STRATEGY_ID;
+  jfieldID PIP_Problem_Control_Parameter_Name_PIVOT_ROW_STRATEGY;
+  jmethodID PIP_Problem_Control_Parameter_Name_ordinal_ID;
+  // PIP_Problem_Control_Parameter_Value.
+  jfieldID PIP_Problem_Control_Parameter_Value_CUTTING_STRATEGY_FIRST_ID;
+  jfieldID PIP_Problem_Control_Parameter_Value_CUTTING_STRATEGY_DEEPEST_ID;
+  jfieldID PIP_Problem_Control_Parameter_Value_CUTTING_STRATEGY_ALL_ID;
+  jfieldID PIP_Problem_Control_Parameter_Value_PIVOT_ROW_STRATEGY_FIRST_ID;
+  jfieldID PIP_Problem_Control_Parameter_Value_PIVOT_ROW_STRATEGY_MAX_COLUMN_ID;
+  jmethodID PIP_Problem_Control_Parameter_Value_ordinal_ID;
+  // PIP_Problem_Status.
+  jfieldID PIP_Problem_Status_UNFEASIBLE_PIP_PROBLEM_ID;
+  jfieldID PIP_Problem_Status_OPTIMIZED_PIP_PROBLEM_ID;
+  jmethodID PIP_Problem_Status_ordinal_ID;
+  // Pair.
+  jfieldID Pair_first_ID;
+  jfieldID Pair_second_ID;
+  // Poly_Con_Relation and Poly_Gen_Relation.
+  jmethodID Poly_Con_Relation_init_ID;
+  jmethodID Poly_Gen_Relation_init_ID;
+  // PPL_Object.
+  jfieldID PPL_Object_ptr_ID;
+  // Relation_Symbol.
+  jfieldID Relation_Symbol_EQUAL_ID;
+  jfieldID Relation_Symbol_GREATER_OR_EQUAL_ID;
+  jfieldID Relation_Symbol_GREATER_THAN_ID;
+  jmethodID Relation_Symbol_ordinal_ID;
+  // Variable.
+  jfieldID Variable_varid_ID;
+  jfieldID Variable_stringifier_ID;
+  jmethodID Variable_init_ID;
+  // Variable_Stringifier.
+  jmethodID Variable_Stringifier_stringify_ID;
+  // Variables_Set.
+  jmethodID Variables_Set_init_ID;
+  jmethodID Variables_Set_add_ID;
+  jmethodID Variables_Set_iterator_ID;
+  // Iterators on Variables_Set.
+  jmethodID Variables_Set_Iterator_has_next_ID;
+  jmethodID Variables_Set_Iterator_next_ID;
+};
+
+//! The cached class references.
+extern Java_Class_Cache cached_classes;
+
+//! The field and method ID cache.
+extern Java_FMID_Cache cached_FMIDs;
+
+
+/*! \brief
+  Builds an unsigned C++ number from the Java native number \p value.
+
+  \param value
+  The Java native number of type V to be converted.
+
+  \exception std::invalid_argument
+  Thrown if \p value is negative.
+*/
+template <typename U, typename V>
+U
+jtype_to_unsigned(const V& value);
+
+//! Builds a Java Boolean from C++ bool \p value.
+jobject
+bool_to_j_boolean_class(JNIEnv* env, const bool value);
+
+//! Returns the Java int stored in Java Integer \p j_integer.
+jint
+j_integer_to_j_int(JNIEnv* env, jobject j_integer);
+
+//! Builds a Java Integer from Java int \p value.
+jobject
+j_int_to_j_integer(JNIEnv* env, jint value);
+
+//! Returns the Java long stored in Java Long \p j_long.
+jlong
+j_long_class_to_j_long(JNIEnv* env, jobject j_long);
+
+//! Builds a Java Long from Java long \p value.
+jobject
+j_long_to_j_long_class(JNIEnv* env, jlong value);
+
+/*! \brief
+  Returns \c true if and only if the Java object \p ppl_object
+  refers to a C++ object.
+*/
+bool
+is_java_marked(JNIEnv* env, jobject ppl_object);
+
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Poly_Gen_Relation
+  from C++ Poly_Gen_Relation \p r.
+*/
+jobject
+build_java_poly_gen_relation(JNIEnv* env, Poly_Gen_Relation& r);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Poly_Con_Relation
+  from C++ Poly_Con_Relation \p r.
+*/
+jobject
+build_java_poly_con_relation(JNIEnv* env, Poly_Con_Relation& r);
+
+/*! \brief
+  Builds a C++ Variables_Set
+  from Java parma_polyhedra_library::Variables_Set \p v_set.
+*/
+Variables_Set
+build_cxx_variables_set(JNIEnv* env, jobject v_set);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Variables_Set
+  from C++ Variables_Set \p v_set.
+*/
+jobject
+build_java_variables_set(JNIEnv* env, const Variables_Set& v_set);
+
+/*! \brief
+  Builds a C++ Relation_Symbol
+  from Java parma_polyhedra_library::Relation_Symbol \p j_relsym.
+*/
+Relation_Symbol
+build_cxx_relsym(JNIEnv* env, jobject j_relsym);
+
+/*! \brief
+  Builds a C++ Bounded_Integer_Type_Overflow
+  from Java parma_polyhedra_library::Bounded_Integer_Type_Overflow
+  \p j_bounded_overflow.
+*/
+Bounded_Integer_Type_Overflow
+build_cxx_bounded_overflow(JNIEnv* env, jobject j_bounded_overflow);
+
+/*! \brief
+  Builds a C++ Bounded_Integer_Type_Width
+  from Java parma_polyhedra_library::Bounded_Integer_Type_Width
+  \p j_bounded_width.
+*/
+Bounded_Integer_Type_Width
+build_cxx_bounded_width(JNIEnv* env, jobject j_bounded_width);
+
+/*! \brief
+  Builds a C++ Bounded_Integer_Type_Representation
+  from Java parma_polyhedra_library::Bounded_Integer_Type_Representation
+  \p j_bounded_rep.
+*/
+Bounded_Integer_Type_Representation
+build_cxx_bounded_rep(JNIEnv* env, jobject j_bounded_rep);
+
+/*! \brief
+  Builds a C++ Optimization_Mode
+  from Java parma_polyhedra_library::Optimization_Mode \p j_opt_mode.
+*/
+Optimization_Mode
+build_cxx_optimization_mode(JNIEnv* env, jobject j_opt_mode);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Optimization_Mode
+  from C++ Optimization_Mode \p opt_mode.
+*/
+jobject
+build_java_optimization_mode(JNIEnv* env, const Optimization_Mode& opt_mode);
+
+/*! \brief
+  Builds a C++ MIP_Problem::Control_Parameter_Name
+  from Java parma_polyhedra_library::Control_Parameter_Name \p j_cp_name.
+*/
+MIP_Problem::Control_Parameter_Name
+build_cxx_control_parameter_name(JNIEnv* env, jobject j_cp_name);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Control_Parameter_Name
+  from C++ MIP_Problem::Control_Parameter_Name \p cp_name.
+*/
+jobject
+build_java_control_parameter_name
+(JNIEnv* env, const MIP_Problem::Control_Parameter_Name& cp_name);
+
+/*! \brief
+  Builds a C++ MIP_Problem::Control_Parameter_Value
+  from Java parma_polyhedra_library::Control_Parameter_Value \p j_cp_value.
+*/
+MIP_Problem::Control_Parameter_Value
+build_cxx_control_parameter_value(JNIEnv* env, jobject j_cp_value);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Control_Parameter_Value
+  from C++ MIP_Problem::Control_Parameter_Value \p cp_value.
+*/
+jobject
+build_java_control_parameter_value
+(JNIEnv* env, const MIP_Problem::Control_Parameter_Value& cp_value);
+
+/*! \brief
+  Builds a C++ PIP_Problem::Control_Parameter_Name
+  from Java parma_polyhedra_library::PIP_Problem_Control_Parameter_Name
+  \p j_cp_name.
+*/
+PIP_Problem::Control_Parameter_Name
+build_cxx_pip_problem_control_parameter_name(JNIEnv* env, jobject j_cp_name);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::PIP_Problem_Control_Parameter_Name
+  from C++ PIP_Problem::Control_Parameter_Name \p cp_name.
+*/
+jobject
+build_java_pip_problem_control_parameter_name
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Name& cp_name);
+
+/*! \brief
+  Builds a C++ PIP_Problem::Control_Parameter_Value
+  from Java parma_polyhedra_library::PIP_Problem_Control_Parameter_Value
+  \p j_cp_value.
+*/
+PIP_Problem::Control_Parameter_Value
+build_cxx_pip_problem_control_parameter_value(JNIEnv* env, jobject j_cp_value);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Control_Parameter_Value
+  from C++ PIP_Problem::Control_Parameter_Value \p cp_value.
+*/
+jobject
+build_java_pip_problem_control_parameter_value
+(JNIEnv* env, const PIP_Problem::Control_Parameter_Value& cp_value);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::MIP_Problem_Status
+  from C++ MIP_Problem_Status \p mip_status.
+*/
+jobject
+build_java_mip_status(JNIEnv* env, const MIP_Problem_Status& mip_status);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::PIP_Problem_Status
+  from C++ PIP_Problem_Status \p pip_status.
+*/
+jobject
+build_java_pip_status(JNIEnv* env, const PIP_Problem_Status& pip_status);
+
+/*! \brief
+  Builds a C++ Variable
+  from Java parma_polyhedra_library::Variable \p j_var.
+*/
+Variable
+build_cxx_variable(JNIEnv* env, jobject j_var);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Variable
+  from C++ Variable \p var.
+*/
+jobject
+build_java_variable(JNIEnv* env, const Variable var);
+
+/*! \brief
+  The customizable variable output function for Java interface.
+
+  Customization is obtained by providing an object implementing interface
+  <CODE>Variable_Stringifier</CODE> and attaching it to class
+  <CODE>Variable</CODE> using static method <CODE>setStringifier</CODE>.
+*/
+void
+Java_Variable_output_function(std::ostream& s, Variable v);
+
+/*! \brief
+  Builds a C++ Coefficient
+  from Java parma_polyhedra_library::Coefficient \p j_coeff.
+*/
+Coefficient
+build_cxx_coeff(JNIEnv* env, jobject j_coeff);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Coefficient
+  from C++ Coefficient \p ppl_coeff.
+*/
+jobject
+build_java_coeff(JNIEnv* env, const Coefficient& ppl_coeff);
+
+/*! \brief
+  Builds a C++ Constraint
+  from Java parma_polyhedra_library::Constraint \p j_constraint.
+*/
+Constraint
+build_cxx_constraint(JNIEnv* env, jobject j_constraint);
+
+/*! \brief
+  Builds a C++ Artificial_Parameter
+  from Java parma_polyhedra_library::Artificial_Parameter
+  \p j_artificial_parameter.
+*/
+PIP_Tree_Node::Artificial_Parameter
+build_cxx_artificial_parameter(JNIEnv* env, jobject j_ap);
+
+/*! \brief
+  Builds a C++ Linear_Expression
+  from Java parma_polyhedra_library::Linear_Expression \p j_le.
+*/
+Linear_Expression
+build_cxx_linear_expression(JNIEnv* env, jobject j_le);
+
+/*! \brief
+  Builds a C++ Congruence
+  from Java parma_polyhedra_library::Congruence \p j_cg.
+*/
+Congruence
+build_cxx_congruence(JNIEnv* env, jobject j_cg);
+
+/*! \brief
+  Builds a C++ Generator
+  from Java parma_polyhedra_library::Generator \p j_g.
+*/
+Generator
+build_cxx_generator(JNIEnv* env, jobject j_g);
+
+/*! \brief
+  Builds a C++ Grid_Generator
+  from Java parma_polyhedra_library::Grid_Generator \p j_g.
+*/
+Grid_Generator
+build_cxx_grid_generator(JNIEnv* env, jobject j_g);
+
+/*! \brief
+  Builds a C++ Grid_Generator_System
+  from Java parma_polyhedra_library::Grid_Generator_System \p j_gs.
+*/
+Grid_Generator_System
+build_cxx_grid_generator_system(JNIEnv* env, jobject j_gs);
+
+/*! \brief
+  Builds a C++ Constraint_System
+  from Java parma_polyhedra_library::Constraint_System \p j_cs.
+*/
+Constraint_System
+build_cxx_constraint_system(JNIEnv* env, jobject j_cs);
+
+/*! \brief
+  Builds a C++ Artificial_Parameter
+  from Java parma_polyhedra_library::Artificial_Parameter \p j_art_param.
+*/
+PIP_Tree_Node::Artificial_Parameter
+build_cxx_artificial_parameter(JNIEnv* env, jobject j_art_param);
+
+/*! \brief
+  Builds a C++ Artificial_Parameter_Sequence
+  from Java parma_polyhedra_library::Artificial_Parameter_Sequence \p j_aps.
+*/
+PIP_Tree_Node::Artificial_Parameter_Sequence
+build_cxx_artificial_parameter_sequence(JNIEnv* env, jobject j_aps);
+
+/*! \brief
+  Builds a C++ Generator_System
+  from Java parma_polyhedra_library::Generator_System \p j_gs.
+*/
+Generator_System
+build_cxx_generator_system(JNIEnv* env, jobject j_gs);
+
+/*! \brief
+  Builds a C++ Congruence_System
+  from Java parma_polyhedra_library::Congruence_System \p j_cgs.
+*/
+Congruence_System
+build_cxx_congruence_system(JNIEnv* env, jobject j_cgs);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Constraint
+  from C++ Constraint \p c.
+*/
+jobject
+build_java_constraint(JNIEnv* env, const Constraint& c);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Artificial_Parameter
+  from C++ Artificial_Parameter \p ap.
+*/
+jobject
+build_java_artificial_parameter(JNIEnv* env,
+                                const PIP_Tree_Node::Artificial_Parameter& ap);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Congruence
+  from C++ Congruence \p cg.
+*/
+jobject
+build_java_congruence(JNIEnv* env, const Congruence& cg);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Generator
+  from C++ Generator \p g.
+*/
+jobject
+build_java_generator(JNIEnv* env, const Generator& g);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Grid_Generator
+  from C++ Grid_Generator \p g.
+*/
+jobject
+build_java_grid_generator(JNIEnv* env, const Grid_Generator& g);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Constraint_System
+  from C++ Constraint_System \p cs.
+*/
+jobject
+build_java_constraint_system(JNIEnv* env, const Constraint_System& cs);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Artificial_Parameter_Sequence
+  from C++ Artificial_Parameter_Sequence \p aps.
+*/
+jobject
+build_java_artificial_parameter_sequence
+(JNIEnv* env, const PIP_Tree_Node::Artificial_Parameter_Sequence& aps);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Grid_Generator_System
+  from C++ Grid_Generator_System \p gs.
+*/
+jobject
+build_java_grid_generator_system(JNIEnv* env, const Grid_Generator_System& gs);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Generator_System
+  from C++ Generator_System \p gs.
+*/
+jobject
+build_java_generator_system(JNIEnv* env, const Generator_System& gs);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Congruence_System
+  from C++ Congruence_System \p cgs.
+*/
+jobject
+build_java_congruence_system(JNIEnv* env, const Congruence_System& cgs);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Linear_Expression_Coefficient
+  from C++ Coefficient \p coeff.
+*/
+jobject
+build_java_linear_expression_coefficient(JNIEnv* env, const Coefficient& coeff);
+
+/*! \brief
+  Sets Java parma_polyhedra_library::Generator \p dst
+  to have the same value as \p src.
+*/
+void
+set_generator(JNIEnv* env, jobject dst, jobject src);
+
+/*! \brief
+  Sets Java Coefficient \p dst to have the same value as \p src.
+*/
+void
+set_coefficient(JNIEnv* env, jobject dst, jobject src);
+
+/*! \brief
+  Modifies parma_polyhedra_library::By_Reference object \p by_ref_dst
+  so that it references object \p src.
+*/
+void
+set_by_reference(JNIEnv* env, jobject by_ref_dst, jobject src);
+
+/*! \brief
+  Returns the object referenced by
+  parma_polyhedra_library::By_Reference object \p by_reference.
+*/
+jobject
+get_by_reference(JNIEnv* env, jobject by_reference);
+
+
+/*! \brief
+  Assigns \p src to one of the fields of
+  parma_polyhedra_library::Pair object \p dst_pair.
+
+  If \p arg is 0, the first element of \p dst_pair is overwritten;
+  if \p arg is 1, the second element of \p dst_pair is overwritten.
+
+  \exception std::runtime_error
+  Thrown if \p arg is neither 0 nor 1.
+*/
+void
+set_pair_element(JNIEnv* env, jobject dst_pair, int arg, jobject src);
+
+/*! \brief
+  Returns one of the fields of the
+  parma_polyhedra_library::Pair object \p pair.
+
+  If \p arg is 0, the first element of \p pair is returned;
+  if \p arg is 1, the second element of \p pair is returned.
+
+  \exception std::runtime_error
+  Thrown if \p arg is neither 0 nor 1.
+*/
+jobject
+get_pair_element(JNIEnv* env, int arg, jobject pair);
+
+//! Returns a pointer to the C++ object wrapped by \p ppl_object.
+void*
+get_ptr(JNIEnv* env, jobject ppl_object);
+
+//! Sets the pointer of the underlying C++ object in the Java object.
+template <typename T>
+void
+set_ptr(JNIEnv* env, jobject ppl_object,
+        const T* address, bool to_be_marked = false);
+
+/*! \brief
+  Builds a Java parma_polyhedra_library::Linear_Expression
+  from the C++ constraint/congruence \p r.
+*/
+template <typename R>
+jobject
+build_linear_expression(JNIEnv* env, const R& r);
+
+} // namespace Java
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+#include "ppl_java_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/Java/jni/ppl_java_common_inlines.hh b/interfaces/Java/jni/ppl_java_common_inlines.hh
new file mode 100644
index 0000000..d23cd30
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_common_inlines.hh
@@ -0,0 +1,246 @@
+/* Domain-independent part of the Java interface: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_java_common_inlines_hh
+#define PPL_ppl_java_common_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Java {
+
+template <typename U, typename V>
+U
+jtype_to_unsigned(const V& value) {
+  if (value < 0)
+    throw std::invalid_argument("not an unsigned integer.");
+
+  if (sizeof(U) < sizeof(V)) {
+    if (value > static_cast<V>(std::numeric_limits<U>::max()))
+      throw std::invalid_argument("unsigned integer out of range.");
+  }
+
+  return value;
+}
+
+template <typename T>
+inline void
+set_ptr(JNIEnv* env, jobject ppl_object,
+        const T* address, bool to_be_marked) {
+  const T* ptr = (to_be_marked ? mark(address) : address);
+  jlong pointer_value = reinterpret_cast<jlong>(ptr);
+  assert(reinterpret_cast<const T*>(pointer_value) == ptr);
+  env->SetLongField(ppl_object, cached_FMIDs.PPL_Object_ptr_ID, pointer_value);
+}
+
+inline void*
+get_ptr(JNIEnv* env, jobject ppl_object) {
+  jlong pointer_value
+    = env->GetLongField(ppl_object, cached_FMIDs.PPL_Object_ptr_ID);
+  void* ptr = reinterpret_cast<void*>(pointer_value);
+  assert(reinterpret_cast<jlong>(ptr) == pointer_value);
+  return unmark(ptr);
+}
+
+inline bool
+is_java_marked(JNIEnv* env, jobject ppl_object) {
+  jlong pointer_value
+    = env->GetLongField(ppl_object, cached_FMIDs.PPL_Object_ptr_ID);
+  const void* ptr = reinterpret_cast<const void*>(pointer_value);
+  assert(reinterpret_cast<jlong>(ptr) == pointer_value);
+  return marked(ptr);
+}
+
+inline void
+set_coefficient(JNIEnv* env, jobject dst, jobject src) {
+  jobject src_bi
+    = env->GetObjectField(src, cached_FMIDs.Coefficient_value_ID);
+  env->SetObjectField(dst, cached_FMIDs.Coefficient_value_ID, src_bi);
+}
+
+inline void
+set_by_reference(JNIEnv* env, jobject by_ref_dst, jobject src) {
+  env->SetObjectField(by_ref_dst,
+                      cached_FMIDs.By_Reference_obj_ID,
+                      src);
+}
+
+inline jobject
+get_by_reference(JNIEnv* env, jobject by_reference) {
+  return env->GetObjectField(by_reference, cached_FMIDs.By_Reference_obj_ID);
+}
+
+template <typename R>
+jobject
+build_linear_expression(JNIEnv* env, const R& r) {
+  jobject j_ret;
+  PPL_DIRTY_TEMP_COEFFICIENT(coefficient);
+  dimension_type varid = 0;
+  dimension_type space_dimension = r.space_dimension();
+  while (varid < space_dimension
+         && (coefficient = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    jobject j_coefficient_zero = build_java_coeff(env, Coefficient(0));
+    j_ret = env->NewObject(cached_classes.Linear_Expression_Coefficient,
+                           cached_FMIDs.Linear_Expression_Coefficient_init_ID,
+                           j_coefficient_zero);
+    CHECK_RESULT_THROW(env, j_ret);
+  }
+  else {
+    jmethodID coeff_var_init_ID
+      = cached_FMIDs.Linear_Expression_Times_init_from_coeff_var_ID;
+    jobject j_coefficient = build_java_coeff(env, coefficient);
+    jobject j_variable = build_java_variable(env, Variable(varid));
+    jclass j_le_times_class = cached_classes.Linear_Expression_Times;
+    jobject j_coeff_var = env->NewObject(j_le_times_class,
+                                         coeff_var_init_ID,
+                                         j_coefficient, j_variable);
+    CHECK_EXCEPTION_THROW(env);
+    j_ret = j_coeff_var;
+    while (true) {
+      ++varid;
+      while (varid < space_dimension
+             && (coefficient = r.coefficient(Variable(varid))) == 0)
+        ++varid;
+      if (varid >= space_dimension)
+        break;
+      else {
+        j_coefficient = build_java_coeff(env, coefficient);
+        j_variable = build_java_variable(env, Variable(varid));
+        j_coeff_var = env->NewObject(j_le_times_class,
+                                     coeff_var_init_ID,
+                                     j_coefficient, j_variable);
+        CHECK_EXCEPTION_THROW(env);
+        j_ret = env->CallObjectMethod(j_ret,
+                                      cached_FMIDs.Linear_Expression_sum_ID,
+                                      j_coeff_var);
+        CHECK_EXCEPTION_THROW(env);
+      }
+    }
+  }
+  return j_ret;
+}
+
+inline Variable
+build_cxx_variable(JNIEnv* env, jobject j_var) {
+  return Variable(env->GetIntField(j_var, cached_FMIDs.Variable_varid_ID));
+}
+
+inline jobject
+build_java_variable(JNIEnv* env, const Variable var) {
+  jlong j_var_id = var.id();
+  jobject ret = env->NewObject(cached_classes.Variable,
+                               cached_FMIDs.Variable_init_ID,
+                               j_var_id);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+inline Coefficient
+build_cxx_coeff(JNIEnv* env, jobject j_coeff) {
+  jstring bi_string
+    = (jstring) env->CallObjectMethod(j_coeff,
+                                      cached_FMIDs.Coefficient_toString_ID);
+  CHECK_EXCEPTION_THROW(env);
+  const char *nativeString = env->GetStringUTFChars(bi_string, 0);
+  CHECK_RESULT_THROW(env, nativeString);
+  PPL_DIRTY_TEMP_COEFFICIENT(ppl_coeff);
+  ppl_coeff = Coefficient(nativeString);
+  env->ReleaseStringUTFChars(bi_string, nativeString);
+  return ppl_coeff;
+}
+
+inline jobject
+build_java_coeff(JNIEnv* env, const Coefficient& ppl_coeff) {
+  std::ostringstream s;
+  s << ppl_coeff;
+  std::string str = s.str();
+  jstring coeff_string = env->NewStringUTF(str.c_str());
+  CHECK_RESULT_THROW(env, coeff_string);
+  jobject ret = env->NewObject(cached_classes.Coefficient,
+                               cached_FMIDs.Coefficient_init_from_String_ID,
+                               coeff_string);
+  CHECK_RESULT_THROW(env, ret);
+  return ret;
+}
+
+template <typename System, typename Elem_Builder>
+System
+build_cxx_system(JNIEnv* env, jobject j_iterable, Elem_Builder build_cxx_elem) {
+  // Get the iterator.
+  jobject j_iter
+    = env->CallObjectMethod(j_iterable, cached_FMIDs.System_iterator_ID);
+  CHECK_EXCEPTION_THROW(env);
+  // Get the iterator method IDs.
+  jmethodID has_next_mID = cached_FMIDs.System_Iterator_has_next_ID;
+  jmethodID next_mID = cached_FMIDs.System_Iterator_next_ID;
+  // Initialize an empty system.
+  System cxx_sys;
+  jobject j_element;
+  jboolean has_next_value = env->CallBooleanMethod(j_iter, has_next_mID);
+  CHECK_EXCEPTION_ASSERT(env);
+  while (has_next_value) {
+    j_element = env->CallObjectMethod(j_iter, next_mID);
+    CHECK_EXCEPTION_ASSERT(env);
+    cxx_sys.insert(build_cxx_elem(env, j_element));
+    has_next_value = env->CallBooleanMethod(j_iter, has_next_mID);
+    CHECK_EXCEPTION_ASSERT(env);
+  }
+  return cxx_sys;
+}
+
+inline Congruence_System
+build_cxx_congruence_system(JNIEnv* env, jobject j_iterable) {
+  return
+    build_cxx_system<Congruence_System>(env, j_iterable, build_cxx_congruence);
+}
+
+inline Constraint_System
+build_cxx_constraint_system(JNIEnv* env, jobject j_iterable) {
+  return
+    build_cxx_system<Constraint_System>(env, j_iterable, build_cxx_constraint);
+}
+
+inline Generator_System
+build_cxx_generator_system(JNIEnv* env, jobject j_iterable) {
+  return
+    build_cxx_system<Generator_System>(env, j_iterable, build_cxx_generator);
+}
+
+inline Grid_Generator_System
+build_cxx_grid_generator_system(JNIEnv* env, jobject j_iterable) {
+  return build_cxx_system<Grid_Generator_System> (env, j_iterable,
+                                                  build_cxx_grid_generator);
+}
+
+} // namespace Java
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_java_common_inlines_hh)
diff --git a/interfaces/Java/jni/ppl_java_globals.cc b/interfaces/Java/jni/ppl_java_globals.cc
new file mode 100644
index 0000000..7ee4ce7
--- /dev/null
+++ b/interfaces/Java/jni/ppl_java_globals.cc
@@ -0,0 +1,2228 @@
+/* PPL Java interface: domain-independent functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_java_common_defs.hh"
+#include "parma_polyhedra_library_Artificial_Parameter.h"
+#include "parma_polyhedra_library_Artificial_Parameter_Sequence.h"
+#include "parma_polyhedra_library_Bounded_Integer_Type_Overflow.h"
+#include "parma_polyhedra_library_Bounded_Integer_Type_Representation.h"
+#include "parma_polyhedra_library_Bounded_Integer_Type_Width.h"
+#include "parma_polyhedra_library_By_Reference.h"
+#include "parma_polyhedra_library_Coefficient.h"
+#include "parma_polyhedra_library_Complexity_Class.h"
+#include "parma_polyhedra_library_Congruence.h"
+#include "parma_polyhedra_library_Congruence_System.h"
+#include "parma_polyhedra_library_Constraint.h"
+#include "parma_polyhedra_library_Constraint_System.h"
+#include "parma_polyhedra_library_Degenerate_Element.h"
+#include "parma_polyhedra_library_Generator.h"
+#include "parma_polyhedra_library_Generator_System.h"
+#include "parma_polyhedra_library_Generator_Type.h"
+#include "parma_polyhedra_library_Grid_Generator.h"
+#include "parma_polyhedra_library_Grid_Generator_System.h"
+#include "parma_polyhedra_library_Grid_Generator_Type.h"
+#include "parma_polyhedra_library_IO.h"
+#include "parma_polyhedra_library_Linear_Expression.h"
+#include "parma_polyhedra_library_Linear_Expression_Coefficient.h"
+#include "parma_polyhedra_library_Linear_Expression_Difference.h"
+#include "parma_polyhedra_library_Linear_Expression_Sum.h"
+#include "parma_polyhedra_library_Linear_Expression_Times.h"
+#include "parma_polyhedra_library_Linear_Expression_Unary_Minus.h"
+#include "parma_polyhedra_library_Linear_Expression_Variable.h"
+#include "parma_polyhedra_library_MIP_Problem.h"
+#include "parma_polyhedra_library_MIP_Problem_Status.h"
+#include "parma_polyhedra_library_Optimization_Mode.h"
+#include "parma_polyhedra_library_Pair.h"
+#include "parma_polyhedra_library_Parma_Polyhedra_Library.h"
+#include "parma_polyhedra_library_Partial_Function.h"
+#include "parma_polyhedra_library_PIP_Problem.h"
+#include "parma_polyhedra_library_PIP_Problem_Status.h"
+#include "parma_polyhedra_library_PIP_Decision_Node.h"
+#include "parma_polyhedra_library_PIP_Solution_Node.h"
+#include "parma_polyhedra_library_PIP_Tree_Node.h"
+#include "parma_polyhedra_library_Poly_Con_Relation.h"
+#include "parma_polyhedra_library_Poly_Gen_Relation.h"
+#include "parma_polyhedra_library_PPL_Object.h"
+#include "parma_polyhedra_library_Relation_Symbol.h"
+#include "parma_polyhedra_library_Variable.h"
+#include "parma_polyhedra_library_Variables_Set.h"
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Java;
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_initialize_1library
+(JNIEnv* env, jclass /* ppl_class */) {
+  initialize();
+  cached_classes.init_cache(env);
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_finalize_1library
+(JNIEnv* env, jclass /* ppl_class */) {
+  cached_classes.clear_cache(env);
+  finalize();
+}
+
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_By_1Reference_initIDs
+(JNIEnv* env, jclass j_by_ref_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_by_ref_class, "obj", "Ljava/lang/Object;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.By_Reference_obj_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_by_ref_class, "<init>", "(Ljava/lang/Object;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.By_Reference_init_ID = mID;
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Coefficient_bits(JNIEnv*, jclass) {
+  return PPL_COEFFICIENT_BITS;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Coefficient_initIDs
+(JNIEnv* env, jclass j_coeff_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_coeff_class, "value", "Ljava/math/BigInteger;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Coefficient_value_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_coeff_class, "<init>", "(Ljava/lang/String;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Coefficient_init_from_String_ID = mID;
+  mID = env->GetMethodID(j_coeff_class, "toString", "()Ljava/lang/String;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Coefficient_toString_ID = mID;
+  // Boolean.
+  mID = env->GetStaticMethodID(cached_classes.Boolean, "valueOf",
+                               "(Z)Ljava/lang/Boolean;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Boolean_valueOf_ID = mID;
+  // Integer.
+  mID = env->GetStaticMethodID(cached_classes.Integer, "valueOf",
+                               "(I)Ljava/lang/Integer;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Integer_valueOf_ID = mID;
+  mID = env->GetMethodID(cached_classes.Integer, "intValue", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Integer_intValue_ID = mID;
+  // Long.
+  mID = env->GetStaticMethodID(cached_classes.Long, "valueOf",
+                               "(J)Ljava/lang/Long;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Long_valueOf_ID = mID;
+  mID = env->GetMethodID(cached_classes.Long, "longValue", "()J");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Long_longValue_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Complexity_1Class_initIDs
+(JNIEnv* env, jclass j_complexity_class) {
+  jmethodID mID = env->GetMethodID(j_complexity_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Complexity_Class_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Congruence_initIDs
+(JNIEnv* env, jclass j_congruence_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_congruence_class, "mod",
+                        "Lparma_polyhedra_library/Coefficient;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Congruence_mod_ID = fID;
+  fID = env->GetFieldID(j_congruence_class, "lhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Congruence_lhs_ID = fID;
+  fID = env->GetFieldID(j_congruence_class, "rhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Congruence_rhs_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_congruence_class, "<init>",
+                         "(Lparma_polyhedra_library/Linear_Expression;"
+                         "Lparma_polyhedra_library/Linear_Expression;"
+                         "Lparma_polyhedra_library/Coefficient;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Congruence_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Congruence_1System_initIDs
+(JNIEnv* env, jclass j_con_sys_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_con_sys_class, "<init>", "()V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Congruence_System_init_ID = mID;
+  mID = env->GetMethodID(j_con_sys_class, "add", "(Ljava/lang/Object;)Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Congruence_System_add_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Constraint_initIDs
+(JNIEnv* env, jclass j_constraint_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_constraint_class, "lhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Constraint_lhs_ID = fID;
+  fID = env->GetFieldID(j_constraint_class, "rhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Constraint_rhs_ID = fID;
+  fID = env->GetFieldID(j_constraint_class, "kind",
+                        "Lparma_polyhedra_library/Relation_Symbol;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Constraint_kind_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_constraint_class, "<init>",
+                         "(Lparma_polyhedra_library/Linear_Expression;"
+                         "Lparma_polyhedra_library/Relation_Symbol;"
+                         "Lparma_polyhedra_library/Linear_Expression;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Constraint_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Constraint_1System_initIDs
+(JNIEnv* env, jclass j_con_sys_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_con_sys_class, "<init>", "()V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Constraint_System_init_ID = mID;
+  mID = env->GetMethodID(j_con_sys_class, "add", "(Ljava/lang/Object;)Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Constraint_System_add_ID = mID;
+  // NOTE: initialize the iterator method IDs common to all *_System classes.
+  mID = env->GetMethodID(j_con_sys_class, "iterator",
+                         "()Ljava/util/Iterator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.System_iterator_ID = mID;
+  mID = env->GetMethodID(cached_classes.Iterator, "hasNext", "()Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.System_Iterator_has_next_ID = mID;
+  assert(cached_classes.Iterator != NULL);
+  mID = env->GetMethodID(cached_classes.Iterator, "next",
+                         "()Ljava/lang/Object;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.System_Iterator_next_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Degenerate_1Element_initIDs
+(JNIEnv* env, jclass j_degenerate_class) {
+  jmethodID mID = env->GetMethodID(j_degenerate_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Degenerate_Element_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Generator_initIDs
+(JNIEnv* env, jclass j_generator_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_generator_class, "gt",
+                        "Lparma_polyhedra_library/Generator_Type;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Generator_gt_ID = fID;
+  fID = env->GetFieldID(j_generator_class, "le",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Generator_le_ID = fID;
+  fID = env->GetFieldID(j_generator_class, "div",
+                        "Lparma_polyhedra_library/Coefficient;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Generator_div_ID = fID;
+  jmethodID mID;
+  mID = env->GetStaticMethodID(j_generator_class, "line",
+                               "(Lparma_polyhedra_library/Linear_Expression;)"
+                               "Lparma_polyhedra_library/Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_line_ID = mID;
+  mID = env->GetStaticMethodID(j_generator_class, "ray",
+                               "(Lparma_polyhedra_library/Linear_Expression;)"
+                               "Lparma_polyhedra_library/Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_ray_ID = mID;
+  mID = env->GetStaticMethodID(j_generator_class, "point",
+                               "(Lparma_polyhedra_library/Linear_Expression;"
+                               "Lparma_polyhedra_library/Coefficient;)"
+                               "Lparma_polyhedra_library/Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_point_ID = mID;
+  mID = env->GetStaticMethodID(j_generator_class, "closure_point",
+                               "(Lparma_polyhedra_library/Linear_Expression;"
+                               "Lparma_polyhedra_library/Coefficient;)"
+                               "Lparma_polyhedra_library/Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_closure_point_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Generator_1System_initIDs
+(JNIEnv* env, jclass j_gen_sys_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_gen_sys_class, "<init>", "()V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_System_init_ID = mID;
+  mID = env->GetMethodID(j_gen_sys_class, "add", "(Ljava/lang/Object;)Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_System_add_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Generator_1Type_initIDs
+(JNIEnv* env, jclass j_gen_type_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_gen_type_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Generator_Type_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_initIDs
+(JNIEnv* env, jclass j_grid_generator_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_grid_generator_class, "gt",
+                        "Lparma_polyhedra_library/Grid_Generator_Type;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Grid_Generator_gt_ID = fID;
+  fID = env->GetFieldID(j_grid_generator_class, "le",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Grid_Generator_le_ID = fID;
+  fID = env->GetFieldID(j_grid_generator_class, "div",
+                        "Lparma_polyhedra_library/Coefficient;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Grid_Generator_div_ID = fID;
+  jmethodID mID;
+  mID = env->GetStaticMethodID(j_grid_generator_class, "grid_line",
+                               "(Lparma_polyhedra_library/Linear_Expression;)"
+                               "Lparma_polyhedra_library/Grid_Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Grid_Generator_grid_line_ID = mID;
+  mID = env->GetStaticMethodID(j_grid_generator_class, "parameter",
+                               "(Lparma_polyhedra_library/Linear_Expression;"
+                               "Lparma_polyhedra_library/Coefficient;)"
+                               "Lparma_polyhedra_library/Grid_Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Grid_Generator_parameter_ID = mID;
+  mID = env->GetStaticMethodID(j_grid_generator_class, "grid_point",
+                               "(Lparma_polyhedra_library/Linear_Expression;"
+                               "Lparma_polyhedra_library/Coefficient;)"
+                               "Lparma_polyhedra_library/Grid_Generator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Grid_Generator_grid_point_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1System_initIDs
+(JNIEnv* env, jclass j_gen_sys_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_gen_sys_class, "<init>", "()V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Grid_Generator_System_init_ID = mID;
+  mID = env->GetMethodID(j_gen_sys_class, "add", "(Ljava/lang/Object;)Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Grid_Generator_System_add_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1Type_initIDs
+(JNIEnv* env, jclass j_grid_gen_type_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_grid_gen_type_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Grid_Generator_Type_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_initIDs
+(JNIEnv* env, jclass j_le_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_le_class, "sum",
+                         "(Lparma_polyhedra_library/Linear_Expression;)"
+                         "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Linear_Expression_sum_ID = mID;
+  mID = env->GetMethodID(j_le_class, "times",
+                         "(Lparma_polyhedra_library/Coefficient;)"
+                         "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Linear_Expression_times_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Coefficient_initIDs
+(JNIEnv* env, jclass j_le_coeff_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_le_coeff_class, "coeff",
+                        "Lparma_polyhedra_library/Coefficient;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Coefficient_coeff_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_le_coeff_class, "<init>",
+                         "(Lparma_polyhedra_library/Coefficient;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Linear_Expression_Coefficient_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Difference_initIDs
+(JNIEnv* env, jclass j_le_diff_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_le_diff_class, "lhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Difference_lhs_ID = fID;
+  fID = env->GetFieldID(j_le_diff_class, "rhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Difference_rhs_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Sum_initIDs
+(JNIEnv* env, jclass j_le_sum_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_le_sum_class, "lhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Sum_lhs_ID = fID;
+  fID = env->GetFieldID(j_le_sum_class, "rhs",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Sum_rhs_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Times_initIDs
+(JNIEnv* env, jclass j_le_times_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_le_times_class, "coeff",
+                        "Lparma_polyhedra_library/Coefficient;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Times_coeff_ID = fID;
+  fID = env->GetFieldID(j_le_times_class, "lin_expr",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Times_lin_expr_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_le_times_class, "<init>",
+                         "(Lparma_polyhedra_library/Coefficient;"
+                         "Lparma_polyhedra_library/Variable;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Linear_Expression_Times_init_from_coeff_var_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Unary_1Minus_initIDs
+(JNIEnv* env, jclass j_le_uminus_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_le_uminus_class, "arg",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Linear_Expression_Unary_Minus_arg_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_1Variable_initIDs
+(JNIEnv* env, jclass j_le_var_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_le_var_class, "<init>",
+                         "(Lparma_polyhedra_library/Variable;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Linear_Expression_Variable_init_ID = mID;
+  mID = env->GetMethodID(j_le_var_class, "var_id", "()J");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Linear_Expression_Variable_var_id_ID = mID;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_is_1zero
+(JNIEnv* env, jobject j_this) {
+  try {
+    return build_cxx_linear_expression(env, j_this).is_zero();
+  }
+  CATCH_ALL
+  return false;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_all_1homogeneous_1terms_1are_1zero
+(JNIEnv* env, jobject j_this) {
+  try {
+    return build_cxx_linear_expression(env, j_this).all_homogeneous_terms_are_zero();
+  }
+  CATCH_ALL
+  return false;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_1Status_initIDs
+(JNIEnv* env, jclass j_mip_status_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_mip_status_class, "UNFEASIBLE_MIP_PROBLEM",
+                              "Lparma_polyhedra_library/MIP_Problem_Status;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.MIP_Problem_Status_UNFEASIBLE_MIP_PROBLEM_ID = fID;
+  fID = env->GetStaticFieldID(j_mip_status_class, "UNBOUNDED_MIP_PROBLEM",
+                              "Lparma_polyhedra_library/MIP_Problem_Status;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.MIP_Problem_Status_UNBOUNDED_MIP_PROBLEM_ID = fID;
+  fID = env->GetStaticFieldID(j_mip_status_class, "OPTIMIZED_MIP_PROBLEM",
+                              "Lparma_polyhedra_library/MIP_Problem_Status;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.MIP_Problem_Status_OPTIMIZED_MIP_PROBLEM_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_mip_status_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.MIP_Problem_Status_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_1Status_initIDs
+(JNIEnv* env, jclass j_mip_status_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_mip_status_class, "UNFEASIBLE_PIP_PROBLEM",
+                              "Lparma_polyhedra_library/PIP_Problem_Status;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.PIP_Problem_Status_UNFEASIBLE_PIP_PROBLEM_ID = fID;
+  fID = env->GetStaticFieldID(j_mip_status_class, "OPTIMIZED_PIP_PROBLEM",
+                              "Lparma_polyhedra_library/PIP_Problem_Status;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.PIP_Problem_Status_OPTIMIZED_PIP_PROBLEM_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_mip_status_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.PIP_Problem_Status_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Optimization_1Mode_initIDs
+(JNIEnv* env, jclass j_opt_mode_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_opt_mode_class, "MAXIMIZATION",
+                              "Lparma_polyhedra_library/Optimization_Mode;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Optimization_Mode_MAXIMIZATION_ID = fID;
+  fID = env->GetStaticFieldID(j_opt_mode_class, "MINIMIZATION",
+                              "Lparma_polyhedra_library/Optimization_Mode;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Optimization_Mode_MINIMIZATION_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_opt_mode_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Optimization_Mode_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Pair_initIDs
+(JNIEnv* env, jclass j_pair_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_pair_class, "first", "Ljava/lang/Object;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Pair_first_ID = fID;
+  fID = env->GetFieldID(j_pair_class, "second", "Ljava/lang/Object;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Pair_second_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Poly_1Con_1Relation_initIDs
+(JNIEnv* env, jclass j_poly_con_relation_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_poly_con_relation_class, "<init>", "(I)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Poly_Con_Relation_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Poly_1Gen_1Relation_initIDs
+(JNIEnv* env, jclass j_poly_gen_relation_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_poly_gen_relation_class, "<init>", "(I)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Poly_Gen_Relation_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PPL_1Object_initIDs
+(JNIEnv* env, jclass j_ppl_object_class) {
+  jfieldID fID = env->GetFieldID(j_ppl_object_class, "ptr", "J");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.PPL_Object_ptr_ID = fID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Relation_1Symbol_initIDs
+(JNIEnv* env, jclass j_rel_sym_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_rel_sym_class, "EQUAL",
+                              "Lparma_polyhedra_library/Relation_Symbol;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Relation_Symbol_EQUAL_ID = fID;
+  fID = env->GetStaticFieldID(j_rel_sym_class, "GREATER_THAN",
+                              "Lparma_polyhedra_library/Relation_Symbol;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Relation_Symbol_GREATER_THAN_ID = fID;
+  fID = env->GetStaticFieldID(j_rel_sym_class, "GREATER_OR_EQUAL",
+                              "Lparma_polyhedra_library/Relation_Symbol;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Relation_Symbol_GREATER_OR_EQUAL_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_rel_sym_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Relation_Symbol_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Bounded_1Integer_1Type_1Overflow_initIDs
+(JNIEnv* env, jclass j_bounded_overflow_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_bounded_overflow_class, "OVERFLOW_WRAPS",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Overflow;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Overflow_OVERFLOW_WRAPS_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_overflow_class, "OVERFLOW_UNDEFINED",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Overflow;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Overflow_OVERFLOW_UNDEFINED_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_overflow_class, "OVERFLOW_IMPOSSIBLE",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Overflow;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Overflow_OVERFLOW_IMPOSSIBLE_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_bounded_overflow_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Bounded_Integer_Type_Overflow_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Bounded_1Integer_1Type_1Representation_initIDs
+(JNIEnv* env, jclass j_bounded_rep_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_bounded_rep_class, "UNSIGNED",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Representation;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Representation_UNSIGNED_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_rep_class, "SIGNED_2_COMPLEMENT",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Representation;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Representation_SIGNED_2_COMPLEMENT_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_bounded_rep_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Bounded_Integer_Type_Representation_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Bounded_1Integer_1Type_1Width_initIDs
+(JNIEnv* env, jclass j_bounded_width_class) {
+  jfieldID fID;
+  fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_8",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Width_BITS_8_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_16",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Width_BITS_16_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_32",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Width_BITS_32_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_64",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Width_BITS_64_ID = fID;
+  fID = env->GetStaticFieldID(j_bounded_width_class, "BITS_128",
+                              "Lparma_polyhedra_library/Bounded_Integer_Type_Width;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Bounded_Integer_Type_Width_BITS_128_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_bounded_width_class, "ordinal", "()I");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Bounded_Integer_Type_Width_ordinal_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Variable_initIDs
+(JNIEnv* env, jclass j_variable_class) {
+  jfieldID fID = env->GetFieldID(j_variable_class, "varid", "J");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Variable_varid_ID = fID;
+  fID = env->GetStaticFieldID(j_variable_class, "stringifier",
+                              "Lparma_polyhedra_library/Variable_Stringifier;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Variable_stringifier_ID = fID;
+  jmethodID mID = env->GetMethodID(j_variable_class, "<init>", "(J)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Variable_init_ID = mID;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Variables_1Set_initIDs
+(JNIEnv* env, jclass j_vset_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_vset_class, "<init>", "()V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Variables_Set_init_ID = mID;
+  mID = env->GetMethodID(j_vset_class, "add", "(Ljava/lang/Object;)Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Variables_Set_add_ID = mID;
+  mID = env->GetMethodID(j_vset_class, "iterator", "()Ljava/util/Iterator;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Variables_Set_iterator_ID = mID;
+  // Iterator on Variables_Set.
+  jclass j_vset_iter_class = env->FindClass("java/util/Iterator");
+  CHECK_RESULT_ASSERT(env, j_vset_iter_class);
+  mID = env->GetMethodID(j_vset_iter_class, "hasNext", "()Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Variables_Set_Iterator_has_next_ID = mID;
+  mID = env->GetMethodID(j_vset_iter_class, "next", "()Ljava/lang/Object;");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Variables_Set_Iterator_next_ID = mID;
+}
+
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1major
+(JNIEnv *, jclass) {
+  return version_major();
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1minor
+(JNIEnv *, jclass)  {
+  return version_minor();
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1revision
+(JNIEnv *, jclass) {
+  return version_revision();
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version_1beta
+(JNIEnv *, jclass) {
+  return version_beta();
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_version
+(JNIEnv* env, jclass) {
+#if defined(__sun) || defined(__sun__)
+
+  // Some versions of Solaris declare a version() function that causes
+  // the following function call to be ambiguous.
+  return env->NewStringUTF(Parma_Polyhedra_Library::version());
+
+#else // !(defined(__sun) || defined(__sun__))
+
+  return env->NewStringUTF(version());
+
+#endif // !(defined(__sun) || defined(__sun__))
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_banner
+(JNIEnv* env, jclass) {
+  return env->NewStringUTF(banner());
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1rounding_1for_1PPL
+(JNIEnv* env, jclass) {
+  try {
+    set_rounding_for_PPL();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_restore_1pre_1PPL_1rounding
+(JNIEnv* env, jclass) {
+  try {
+    restore_pre_PPL_rounding();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jint JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_irrational_1precision
+(JNIEnv* env , jclass) {
+  try {
+    return irrational_precision();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1irrational_1precision
+(JNIEnv* env , jclass, jint p) {
+  try {
+    unsigned cxx_p = jtype_to_unsigned<unsigned>(p);
+    set_irrational_precision(cxx_p);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1timeout
+(JNIEnv* env, jclass, jint csecs) {
+  try {
+    // In case a timeout was already set.
+    reset_timeout();
+    assert(csecs > 0);
+    unsigned cxx_csecs = jtype_to_unsigned<unsigned>(csecs);
+    assert(cxx_csecs > 0);
+    static timeout_exception e;
+    using Parma_Polyhedra_Library::Watchdog;
+    p_timeout_object
+      = new Watchdog(cxx_csecs, abandon_expensive_computations, e);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_reset_1timeout
+(JNIEnv* env, jclass) {
+  try {
+    reset_timeout();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_set_1deterministic_1timeout
+(JNIEnv* env, jclass, jint unscaled_weight, jint scale) {
+  try {
+    // In case a timeout was already set.
+    reset_deterministic_timeout();
+    // Note: let `unscaled_weight == 0' result in an exception.
+    assert(unscaled_weight >= 0 && scale >= 0);
+    unsigned long cxx_unscaled_weight
+      = jtype_to_unsigned<unsigned long>(unscaled_weight);
+    unsigned cxx_scale = jtype_to_unsigned<unsigned>(scale);
+    static deterministic_timeout_exception e;
+    typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+    p_deterministic_timeout_object
+      = new Weightwatch(Traits::compute_delta(cxx_unscaled_weight, cxx_scale),
+                        abandon_expensive_computations, e);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Parma_1Polyhedra_1Library_reset_1deterministic_1timeout
+(JNIEnv* env, jclass) {
+  try {
+    reset_deterministic_timeout();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_max_1space_1dimension
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return mip->max_space_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_space_1dimension
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return mip->space_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_integer_1space_1dimensions
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return build_java_variables_set(env, mip->integer_space_dimensions());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_objective_1function
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    PPL_DIRTY_TEMP_COEFFICIENT(inhomogeneous_term);
+    inhomogeneous_term = mip->objective_function().inhomogeneous_term();
+    jobject j_coeff_inhomogeneous_term
+      = build_java_coeff(env, inhomogeneous_term);
+    jobject j_le_coeff
+      = env->NewObject(cached_classes.Linear_Expression_Coefficient,
+                       cached_FMIDs.Linear_Expression_Coefficient_init_ID,
+                       j_coeff_inhomogeneous_term);
+    CHECK_RESULT_RETURN(env, j_le_coeff, 0);
+
+    jobject j_le = build_linear_expression(env, mip->objective_function());
+    return env->CallObjectMethod(j_le,
+                                 cached_FMIDs.Linear_Expression_sum_ID,
+                                 j_le_coeff);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_optimization_1mode
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return build_java_optimization_mode(env, mip->optimization_mode());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_get_1control_1parameter
+(JNIEnv* env , jobject j_this_mip_problem,
+ jobject j_cpn) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    MIP_Problem::Control_Parameter_Name cpn
+      = build_cxx_control_parameter_name(env, j_cpn);
+    return
+      build_java_control_parameter_value(env,
+                                         mip->get_control_parameter(cpn));
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_set_1control_1parameter
+(JNIEnv* env , jobject j_this_mip_problem,
+ jobject j_cpv) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    MIP_Problem::Control_Parameter_Value cpv
+      = build_cxx_control_parameter_value(env, j_cpv);
+    mip->set_control_parameter(cpv);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_constraints
+(JNIEnv* env, jobject j_this_mip_problem) {
+  try {
+    jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+                                  cached_FMIDs.Constraint_System_init_ID);
+    CHECK_RESULT_RETURN(env, j_cs, 0);
+
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    for (MIP_Problem::const_iterator cs_it = mip->constraints_begin(),
+           cs_end = mip->constraints_end(); cs_it != cs_end; ++cs_it) {
+      jobject j_constraint = build_java_constraint(env, *cs_it);
+      env->CallBooleanMethod(j_cs,
+                             cached_FMIDs.Constraint_System_add_ID,
+                             j_constraint);
+      CHECK_EXCEPTION_RETURN(env, 0);
+    }
+    return j_cs;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_clear
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    mip->clear();
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1space_1dimensions_1and_1embed
+(JNIEnv* env , jobject j_this_mip_problem, jlong j_dim) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    mip->add_space_dimensions_and_embed(ppl_dim);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1to_1integer_1space_1dimensions
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_vset) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Variables_Set v_set = build_cxx_variables_set(env, j_vset);
+    mip->add_to_integer_space_dimensions(v_set);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1constraint
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_c) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Constraint c = build_cxx_constraint(env, j_c);
+    mip->add_constraint(c);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_add_1constraints
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_cs) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+    mip->add_constraints(cs);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_set_1objective_1function
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_le) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Linear_Expression le = build_cxx_linear_expression(env, j_le);
+    mip->set_objective_function(le);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_set_1optimization_1mode
+(JNIEnv* env , jobject j_this_mip_problem, jobject j_opt_mode) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Optimization_Mode opt_mode = build_cxx_optimization_mode(env, j_opt_mode);
+    mip->set_optimization_mode(opt_mode);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_is_1satisfiable
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return mip->is_satisfiable();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT jobject JNICALL Java_parma_1polyhedra_1library_MIP_1Problem_solve
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return build_java_mip_status(env, mip->solve());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_evaluate_1objective_1function
+(JNIEnv* env, jobject j_this_mip_problem, jobject j_gen,
+ jobject j_coeff_num, jobject j_coeff_den) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Generator g = build_cxx_generator(env, j_gen);
+    PPL_DIRTY_TEMP_COEFFICIENT(num);
+    PPL_DIRTY_TEMP_COEFFICIENT(den);
+    mip->evaluate_objective_function(g, num, den);
+    set_coefficient(env, j_coeff_num, build_java_coeff(env, num));
+    set_coefficient(env, j_coeff_den, build_java_coeff(env, den));
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_feasible_1point
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Generator g = mip->feasible_point();
+    return build_java_generator(env, g);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_optimizing_1point
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    Generator g = mip->optimizing_point();
+    return build_java_generator(env, g);
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_optimal_1value
+(JNIEnv* env, jobject j_this_mip_problem,
+ jobject j_coeff_num, jobject j_coeff_den) {
+  try {
+    PPL_DIRTY_TEMP_COEFFICIENT(coeff_num);
+    PPL_DIRTY_TEMP_COEFFICIENT(coeff_den);
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    mip->optimal_value(coeff_num, coeff_den);
+    set_coefficient(env, j_coeff_num, build_java_coeff(env, coeff_num));
+    set_coefficient(env, j_coeff_den, build_java_coeff(env, coeff_den));
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_OK
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return mip->OK();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_build_1cpp_1object__J
+(JNIEnv* env, jobject j_this_mip_problem, jlong j_dim) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    MIP_Problem* mip_ptr = new MIP_Problem(ppl_dim);
+    set_ptr(env, j_this_mip_problem,  mip_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_build_1cpp_1object__JLparma_1polyhedra_1library_Constraint_1System_2Lparma_1polyhedra_1library_Linear_1Expression_2Lparma_1polyhedra_1library_Optimization_1Mode_2
+(JNIEnv* env , jobject j_this_mip_problem, jlong j_dim, jobject j_cs,
+ jobject j_le, jobject j_opt_mode) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+    Linear_Expression le = build_cxx_linear_expression(env, j_le);
+    Optimization_Mode opt_mode =  build_cxx_optimization_mode(env, j_opt_mode);
+    MIP_Problem* mip_ptr = new MIP_Problem(ppl_dim, cs, le, opt_mode);
+    set_ptr(env, j_this_mip_problem, mip_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_build_1cpp_1object__Lparma_1polyhedra_1library_MIP_1Problem_2
+(JNIEnv* env, jobject  j_this, jobject j_y)
+{
+  MIP_Problem* y_ptr = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_y));
+  MIP_Problem* this_ptr = new MIP_Problem(*y_ptr);
+  set_ptr(env, j_this, this_ptr);
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_free
+(JNIEnv* env, jobject j_this) {
+  MIP_Problem* mip  = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this)) {
+    delete mip;
+    void* null_ptr = 0;
+    set_ptr(env, j_this, null_ptr);
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_finalize
+(JNIEnv* env, jobject j_this) {
+  MIP_Problem* mip = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this))
+    delete mip;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_total_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_mip_problem) {
+  try {
+    MIP_Problem* mip
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this_mip_problem));
+    return mip->total_memory_in_bytes();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_toString
+(JNIEnv* env, jobject j_this) {
+  MIP_Problem* this_ptr
+    = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  s << *this_ptr;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_MIP_1Problem_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    MIP_Problem* this_ptr
+      = reinterpret_cast<MIP_Problem*>(get_ptr(env, j_this));
+    std::ostringstream s;
+    this_ptr->ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Variable_toString
+(JNIEnv* env, jobject j_this) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  Variable ppl_var = build_cxx_variable(env, j_this);
+  std::ostringstream s;
+  s << ppl_var;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Variable_setStringifier
+(JNIEnv* env, jclass j_variable_class, jobject j_stringifier) {
+  // Store j_stringifier in the corresponding static field.
+  env->SetStaticObjectField(j_variable_class,
+                            cached_FMIDs.Variable_stringifier_ID,
+                            j_stringifier);
+  if (j_stringifier == NULL) {
+    // No stringifier object: reset cache values.
+    cached_classes.Variable_Stringifier = NULL;
+    cached_FMIDs.Variable_Stringifier_stringify_ID = NULL;
+    // Reset default C++ output function.
+    Variable::set_output_function(&Variable::default_output_function);
+  }
+  else {
+    // Update cache with values computed for concrete class.
+    jclass vs_class = env->GetObjectClass(j_stringifier);
+    CHECK_RESULT_ASSERT(env, vs_class);
+    cached_classes.Variable_Stringifier = vs_class;
+    jmethodID mID = env->GetMethodID(vs_class, "stringify",
+                                     "(J)Ljava/lang/String;");
+    CHECK_RESULT_ASSERT(env, mID);
+    cached_FMIDs.Variable_Stringifier_stringify_ID = mID;
+    // Set C++ output function to the Java wrapper.
+    Variable::set_output_function(&Java_Variable_output_function);
+  }
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_toString
+(JNIEnv* env, jobject j_this) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  Linear_Expression ppl_le = build_cxx_linear_expression(env, j_this);
+  std::ostringstream s;
+  s << ppl_le;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Linear_1Expression_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Linear_Expression le = build_cxx_linear_expression(env, j_this);
+    le.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_toString
+(JNIEnv* env, jobject g) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Generator ppl_g = build_cxx_generator(env, g);
+  s << ppl_g;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Generator g = build_cxx_generator(env, j_this);
+    g.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_toString
+(JNIEnv* env, jobject c) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Constraint ppl_c = build_cxx_constraint(env, c);
+  s << ppl_c;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Constraint c = build_cxx_constraint(env, j_this);
+    c.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_toString
+(JNIEnv* env, jobject g) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Grid_Generator ppl_g = build_cxx_grid_generator(env, g);
+  s << ppl_g;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Grid_Generator g = build_cxx_grid_generator(env, j_this);
+    g.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_toString
+(JNIEnv* env, jobject g) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Congruence ppl_g = build_cxx_congruence(env, g);
+  s << ppl_g;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Congruence c = build_cxx_congruence(env, j_this);
+    c.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1System_toString
+(JNIEnv* env, jobject ggs) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Grid_Generator_System ppl_ggs = build_cxx_grid_generator_system(env, ggs);
+  s << ppl_ggs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Grid_1Generator_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Grid_Generator_System gs = build_cxx_grid_generator_system(env, j_this);
+    gs.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_1System_toString
+(JNIEnv* env, jobject gs) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Generator_System ppl_gs = build_cxx_generator_system(env, gs);
+  s << ppl_gs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Generator_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Generator_System gs = build_cxx_generator_system(env, j_this);
+    gs.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_1System_toString
+(JNIEnv* env, jobject cs) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Constraint_System ppl_cs = build_cxx_constraint_system(env, cs);
+  s << ppl_cs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Constraint_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Constraint_System cs = build_cxx_constraint_system(env, j_this);
+    cs.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_1System_toString
+(JNIEnv* env, jobject cgs) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  Congruence_System ppl_cgs = build_cxx_congruence_system(env, cgs);
+  s << ppl_cgs;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Congruence_1System_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    Congruence_System cs = build_cxx_congruence_system(env, j_this);
+    cs.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_IO_wrap_1string
+(JNIEnv* env, jclass, jstring str, jint indent_depth,
+ jint preferred_first_line_length, jint preferred_line_length) {
+  try {
+    unsigned ind = jtype_to_unsigned<unsigned int>(indent_depth);
+    unsigned pfll = jtype_to_unsigned<unsigned int>
+      (preferred_first_line_length);
+    unsigned pll = jtype_to_unsigned<unsigned int>(preferred_line_length);
+    const char* chars = env->GetStringUTFChars(str, 0);
+    CHECK_RESULT_RETURN(env, chars, 0);
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+    std::string s = wrap_string(chars, ind, pfll, pll);
+    env->ReleaseStringUTFChars(str, chars);
+    return env->NewStringUTF(s.c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_build_1cpp_1object__J
+(JNIEnv* env, jobject j_this_pip_problem, jlong j_dim) {
+  try {
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    PIP_Problem* pip_ptr = new PIP_Problem(ppl_dim);
+    set_ptr(env, j_this_pip_problem,  pip_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_build_1cpp_1object__JLparma_1polyhedra_1library_Constraint_1System_2Lparma_1polyhedra_1library_Variables_1Set_2
+(JNIEnv* env , jobject j_this_pip_problem, jlong j_dim,
+ jobject j_cs, jobject j_vars) {
+  try {
+    dimension_type p_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    Constraint_System p_cs = build_cxx_constraint_system(env, j_cs);
+    Variables_Set p_vars = build_cxx_variables_set(env, j_vars);
+    PIP_Problem* pip_ptr = new PIP_Problem(p_dim, p_cs.begin(),
+                                           p_cs.end(), p_vars);
+    set_ptr(env, j_this_pip_problem, pip_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_build_1cpp_1object__Lparma_1polyhedra_1library_PIP_1Problem_2
+(JNIEnv* env, jobject  j_this, jobject j_y)
+{
+  PIP_Problem* y_ptr = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_y));
+  PIP_Problem* this_ptr = new PIP_Problem(*y_ptr);
+  set_ptr(env, j_this, this_ptr);
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_OK
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->OK();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_total_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->total_memory_in_bytes();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_external_1memory_1in_1bytes
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->external_memory_in_bytes();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_toString
+(JNIEnv* env, jobject j_this) {
+  PIP_Problem* this_ptr
+    = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  s << *this_ptr;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    PIP_Problem* this_ptr
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+    std::ostringstream s;
+    this_ptr->ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_free
+(JNIEnv* env, jobject j_this) {
+  PIP_Problem* pip  = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this)) {
+    delete pip;
+    void* null_ptr = 0;
+    set_ptr(env, j_this, null_ptr);
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1_problem_finalize
+(JNIEnv* env, jobject j_this) {
+  PIP_Problem* pip = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this))
+    delete pip;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_max_1space_1dimension
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->max_space_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_space_1dimension
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->space_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_get_1big_1parameter_1dimension
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->get_big_parameter_dimension();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_parameter_1space_1dimensions
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return build_java_variables_set(env, pip->parameter_space_dimensions());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_set_1big_1parameter_1dimension
+(JNIEnv* env , jobject j_this_pip_problem, jlong j_dim) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    dimension_type ppl_dim = jtype_to_unsigned<dimension_type>(j_dim);
+    pip->set_big_parameter_dimension(ppl_dim);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_number_1of_1parameter_1space_1dimensions
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->parameter_space_dimensions().size();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1space_1dimensions_1and_1embed
+(JNIEnv* env , jobject j_this_pip_problem, jlong j_dim_vars, jlong j_dim_pars) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    dimension_type ppl_dim_vars = jtype_to_unsigned<dimension_type>(j_dim_vars);
+    dimension_type ppl_dim_pars = jtype_to_unsigned<dimension_type>(j_dim_pars);
+    pip->add_space_dimensions_and_embed(ppl_dim_vars, ppl_dim_pars);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1to_1parameter_1space_1dimensions
+(JNIEnv* env , jobject j_this_pip_problem, jobject j_vars) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    Variables_Set ppl_vars = build_cxx_variables_set(env, j_vars);
+    pip->add_to_parameter_space_dimensions(ppl_vars);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_number_1of_1constraints
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->constraints_end() - pip->constraints_begin();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1constraint
+(JNIEnv* env , jobject j_this_pip_problem, jobject j_c) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    Constraint c = build_cxx_constraint(env, j_c);
+    pip->add_constraint(c);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_add_1constraints
+(JNIEnv* env , jobject j_this_pip_problem, jobject j_cs) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    Constraint_System cs = build_cxx_constraint_system(env, j_cs);
+    pip->add_constraints(cs);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_is_1satisfiable
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return pip->is_satisfiable();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT jobject JNICALL Java_parma_1polyhedra_1library_PIP_1Problem_solve
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    return build_java_pip_status(env, pip->solve());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL Java_parma_1polyhedra_1library_PIP_1Problem_solution
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    const PIP_Tree_Node* solution = pip->solution();
+
+    jclass j_class_s = env->FindClass("parma_polyhedra_library/PIP_Tree_Node");
+    CHECK_RESULT_ASSERT(env, j_class_s);
+    jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+    jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+    CHECK_RESULT_RETURN(env, j_obj_s, 0);
+    set_ptr(env, j_obj_s, solution);
+    return j_obj_s;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_optimizing_1solution
+(JNIEnv* env , jobject j_this_pip_problem) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    const PIP_Tree_Node* solution = pip->optimizing_solution();
+
+    jclass j_class_s = env->FindClass("parma_polyhedra_library/PIP_Tree_Node");
+    CHECK_RESULT_ASSERT(env, j_class_s);
+    jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+    jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+    CHECK_RESULT_RETURN(env, j_obj_s, 0);
+    set_ptr(env, j_obj_s, solution);
+    return j_obj_s;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_get_1pip_1problem_1control_1parameter
+(JNIEnv* env , jobject j_this_pip_problem,
+ jobject j_cpn) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    PIP_Problem::Control_Parameter_Name ppl_cpn
+      = build_cxx_pip_problem_control_parameter_name(env, j_cpn);
+    return
+      build_java_pip_problem_control_parameter_value
+        (env, pip->get_control_parameter(ppl_cpn));
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_constraint_1at_1index
+(JNIEnv* env, jobject j_this_pip_problem, jlong j_index) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    dimension_type p_index = jtype_to_unsigned<dimension_type>(j_index);
+    return build_java_constraint(env, *(pip->constraints_begin() + p_index));
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_constraints
+(JNIEnv* env, jobject j_this_pip_problem) {
+  try {
+    jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+                                  cached_FMIDs.Constraint_System_init_ID);
+    CHECK_RESULT_RETURN(env, j_cs, 0);
+
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    for (PIP_Problem::const_iterator cs_it = pip->constraints_begin(),
+           cs_end = pip->constraints_end(); cs_it != cs_end; ++cs_it) {
+      jobject j_constraint = build_java_constraint(env, *cs_it);
+      env->CallBooleanMethod(j_cs,
+                             cached_FMIDs.Constraint_System_add_ID,
+                             j_constraint);
+      CHECK_EXCEPTION_RETURN(env, 0);
+    }
+    return j_cs;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Problem_set_1pip_1problem_1control_1parameter
+(JNIEnv* env, jobject j_this_pip_problem, jobject j_cpv) {
+  try {
+    PIP_Problem* pip
+      = reinterpret_cast<PIP_Problem*>(get_ptr(env, j_this_pip_problem));
+    PIP_Problem::Control_Parameter_Value ppl_cpv
+      = build_cxx_pip_problem_control_parameter_value(env, j_cpv);
+    pip->set_control_parameter(ppl_cpv);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_OK
+(JNIEnv* env, jobject j_this_pip_tree) {
+  try {
+    PIP_Tree_Node* pip
+      = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this_pip_tree));
+    return pip->OK();
+  }
+  CATCH_ALL;
+  return false;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_free
+(JNIEnv* env, jobject j_this) {
+  PIP_Tree_Node* pip  = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this)) {
+    delete pip;
+    void* null_ptr = 0;
+    set_ptr(env, j_this, null_ptr);
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_finalize
+(JNIEnv* env, jobject j_this) {
+  PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this))
+    delete pip;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_constraints
+(JNIEnv* env, jobject j_this_pip_node) {
+  try {
+    jobject j_cs = env->NewObject(cached_classes.Constraint_System,
+                                  cached_FMIDs.Constraint_System_init_ID);
+    CHECK_RESULT_RETURN(env, j_cs, 0);
+
+    PIP_Tree_Node* pip
+      = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this_pip_node));
+    return build_java_constraint_system(env, pip->constraints());
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_as_1solution
+(JNIEnv* env, jobject j_this) {
+  try {
+    PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+    const PIP_Solution_Node* solution = pip->as_solution();
+    if (solution == 0) {
+      jobject null = 0;
+      return null;
+    }
+    // Here we have a solution node.
+    jclass j_class_s
+      = env->FindClass("parma_polyhedra_library/PIP_Solution_Node");
+    CHECK_RESULT_ASSERT(env, j_class_s);
+    jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+    jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+    CHECK_RESULT_RETURN(env, j_obj_s, 0);
+    set_ptr(env, j_obj_s, solution);
+    return j_obj_s;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_as_1decision
+(JNIEnv* env, jobject j_this) {
+  try {
+    PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+    const PIP_Decision_Node* decision = pip->as_decision();
+    if (decision == 0) {
+      jobject null = 0;
+      return null;
+    }
+    // Here we have a decision node.
+    jclass j_class_d
+      = env->FindClass("parma_polyhedra_library/PIP_Decision_Node");
+    CHECK_RESULT_ASSERT(env, j_class_d);
+    jmethodID j_ctr_id_d = env->GetMethodID(j_class_d, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_d);
+    jobject j_obj_d = env->NewObject(j_class_d, j_ctr_id_d);
+    CHECK_RESULT_RETURN(env, j_obj_d, 0);
+    set_ptr(env, j_obj_d, decision);
+    return j_obj_d;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_number_1of_1artificials
+(JNIEnv* env , jobject j_this) {
+  try {
+    PIP_Tree_Node* pip = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+    return pip->art_parameter_count();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_artificials
+(JNIEnv* env, jobject j_this_pip_node) {
+  try {
+    jobject j_arts
+      = env->NewObject(cached_classes.Artificial_Parameter_Sequence,
+                       cached_FMIDs.Artificial_Parameter_Sequence_init_ID);
+    CHECK_RESULT_RETURN(env, j_arts, 0);
+
+    const PIP_Tree_Node* pip_node
+      = reinterpret_cast<const PIP_Tree_Node*>(get_ptr(env, j_this_pip_node));
+    for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+           i = pip_node->art_parameter_begin(),
+           i_end = pip_node->art_parameter_end(); i != i_end; ++i) {
+      jobject j_art = build_java_artificial_parameter(env, *i);
+      env->CallBooleanMethod(j_arts,
+                             cached_FMIDs.Artificial_Parameter_Sequence_add_ID,
+                             j_art);
+      CHECK_EXCEPTION_RETURN(env, 0);
+    }
+    return j_arts;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_PIP_1Tree_1Node_toString
+(JNIEnv* env, jobject j_this) {
+  PIP_Tree_Node* this_ptr
+    = reinterpret_cast<PIP_Tree_Node*>(get_ptr(env, j_this));
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  s << *this_ptr;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Decision_1Node_child_1node
+(JNIEnv* env, jobject j_this, jboolean j_branch) {
+  try {
+    PIP_Decision_Node* dec_node
+      = reinterpret_cast<PIP_Decision_Node*>(get_ptr(env, j_this));
+    const PIP_Tree_Node* child = dec_node->child_node(j_branch);
+    if (child == 0) {
+      jobject null = 0;
+      return null;
+    }
+    jclass j_class_s = env->FindClass("parma_polyhedra_library/PIP_Tree_Node");
+    CHECK_RESULT_ASSERT(env, j_class_s);
+    jmethodID j_ctr_id_s = env->GetMethodID(j_class_s, "<init>", "()V");
+    CHECK_RESULT_ASSERT(env, j_ctr_id_s);
+    jobject j_obj_s = env->NewObject(j_class_s, j_ctr_id_s);
+    CHECK_RESULT_RETURN(env, j_obj_s, 0);
+    set_ptr(env, j_obj_s, child);
+    return j_obj_s;
+  }
+  CATCH_ALL;
+  jobject null = 0;
+  return null;
+}
+
+JNIEXPORT jobject JNICALL
+Java_parma_1polyhedra_1library_PIP_1Solution_1Node_parametric_1values
+(JNIEnv* env, jobject j_this, jobject j_var) {
+  PIP_Solution_Node* pip
+    = reinterpret_cast<PIP_Solution_Node*>(get_ptr(env, j_this));
+  Variable v = build_cxx_variable(env, j_var);
+  return build_linear_expression(env, pip->parametric_values(v));
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_initIDs
+(JNIEnv* env, jclass j_artificial_parameter_class) {
+  jfieldID fID;
+  fID = env->GetFieldID(j_artificial_parameter_class, "le",
+                        "Lparma_polyhedra_library/Linear_Expression;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Artificial_Parameter_le_ID = fID;
+  fID = env->GetFieldID(j_artificial_parameter_class, "den",
+                        "Lparma_polyhedra_library/Coefficient;");
+  CHECK_RESULT_ASSERT(env, fID);
+  cached_FMIDs.Artificial_Parameter_den_ID = fID;
+  jmethodID mID;
+  mID = env->GetMethodID(j_artificial_parameter_class, "<init>",
+                         "(Lparma_polyhedra_library/Linear_Expression;"
+                         "Lparma_polyhedra_library/Coefficient;)V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Artificial_Parameter_init_ID = mID;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_ascii_1dump
+(JNIEnv* env, jobject j_this) {
+  try {
+    std::ostringstream s;
+    PIP_Tree_Node::Artificial_Parameter art
+      = build_cxx_artificial_parameter(env, j_this);
+    art.ascii_dump(s);
+    return env->NewStringUTF(s.str().c_str());
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jstring JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_toString
+(JNIEnv* env, jobject j_this) {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  std::ostringstream s;
+  PIP_Tree_Node::Artificial_Parameter ppl_art
+    = build_cxx_artificial_parameter(env, j_this);
+  s << ppl_art;
+  return env->NewStringUTF(s.str().c_str());
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Artificial_1Parameter_1Sequence_initIDs
+(JNIEnv* env, jclass j_aps_class) {
+  jmethodID mID;
+  mID = env->GetMethodID(j_aps_class, "<init>", "()V");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Artificial_Parameter_Sequence_init_ID = mID;
+  mID = env->GetMethodID(j_aps_class, "add", "(Ljava/lang/Object;)Z");
+  CHECK_RESULT_ASSERT(env, mID);
+  cached_FMIDs.Artificial_Parameter_Sequence_add_ID = mID;
+}
+
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_build_1cpp_1object
+(JNIEnv* env, jobject j_this_pfunc) {
+  try {
+    Partial_Function* pfunc_ptr = new Partial_Function;
+    set_ptr(env, j_this_pfunc,  pfunc_ptr);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_has_1empty_1codomain
+(JNIEnv* env , jobject j_this_pfunc) {
+  try {
+    Partial_Function* pfunc
+      = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+    return pfunc->has_empty_codomain();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_max_1in_1codomain
+(JNIEnv* env , jobject j_this_pfunc) {
+  try {
+    Partial_Function* pfunc
+      = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+    return pfunc->max_in_codomain();
+  }
+  CATCH_ALL;
+  return 0;
+}
+
+JNIEXPORT jlong JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_maps
+(JNIEnv* env, jobject j_this_pfunc, jlong j_i) {
+  Partial_Function* pfunc
+    = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+  dimension_type i = jtype_to_unsigned<dimension_type>(j_i);
+  dimension_type j;
+  if (pfunc->maps(i, j))
+    return j;
+  else
+    return -1;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_insert
+(JNIEnv* env , jobject j_this_pfunc, jlong i, jlong j) {
+  try {
+    Partial_Function* pfunc
+      = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this_pfunc));
+    pfunc->insert(i, j);
+  }
+  CATCH_ALL;
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_free
+(JNIEnv* env, jobject j_this) {
+  Partial_Function* pfunc
+    = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this)) {
+    delete pfunc;
+    void* null_ptr = 0;
+    set_ptr(env, j_this, null_ptr);
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_parma_1polyhedra_1library_Partial_1Function_finalize
+(JNIEnv* env, jobject j_this) {
+  Partial_Function* pfunc
+    = reinterpret_cast<Partial_Function*>(get_ptr(env, j_this));
+  if (!is_java_marked(env, j_this))
+    delete pfunc;
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java
new file mode 100644
index 0000000..2fb8b28
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter.java
@@ -0,0 +1,87 @@
+/* Artificial_Parameter Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+/*!
+  An Artificial_Parameter object represents the result
+  of the integer division of a Linear_Expression (on the other
+  parameters, including the previously-defined artificials)
+  by an integer denominator (a Coefficient object).
+  The dimensions of the artificial parameters (if any) in a tree node
+  have consecutive indices starting from <code>dim+1</code>, where the value
+  of \c dim is computed as follows:
+   - for the tree root node, \c dim is the space dimension of the PIP_Problem;
+   - for any other node of the tree, it is recusrively obtained by adding
+     the value of \c dim computed for the parent node to the number of
+     artificial parameters defined in the parent node.
+  \par
+  Since the numbering of dimensions for artificial parameters follows
+  the rule above, the addition of new problem variables and/or new problem
+  parameters to an already solved PIP_Problem object (as done when
+  incrementally solving a problem) will result in the systematic
+  renumbering of all the existing artificial parameters.
+*/
+public class Artificial_Parameter {
+
+    //! The value of the linear expression of \p this.
+    private Linear_Expression le;
+
+    //! The value of the denominatir of \p this.
+    private Coefficient den;
+
+    /*! \brief
+      Builds an artificial parameter from a linear expression
+      and a denominator.
+    */
+    public Artificial_Parameter(Linear_Expression e, Coefficient d) {
+        le = e.clone();
+        den = new Coefficient(d);
+    }
+
+    /*! \brief
+      Returns the linear expression in artificial parameter \p this.
+    */
+    public Linear_Expression linear_expression() {
+        return le;
+    }
+
+    /*! \brief
+      Returns the denominator in artificial parameter \p this.
+    */
+    public Coefficient denominator() {
+        return den;
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequence.java b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequence.java
new file mode 100644
index 0000000..ec8dca6
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Artificial_Parameter_Sequence.java
@@ -0,0 +1,42 @@
+/* Artificial_Parameter_Sequence Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A sequence of artificial parameters.
+/*! \ingroup PPL_Java_interface
+    An object of the class Artificial_Parameter_Sequence is a
+    sequence of artificial parameters.
+*/
+public class Artificial_Parameter_Sequence
+  extends java.util.ArrayList<Artificial_Parameter> {
+
+    //! Default constructor: builds an empty sequence of artificial parameters.
+    public Artificial_Parameter_Sequence() {
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overflow.java b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overflow.java
new file mode 100644
index 0000000..40fd8f1
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Overflow.java
@@ -0,0 +1,40 @@
+/* Bounded_Integer_Type_Overflow enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Overflow behavior of bounded integer types.
+/*! \ingroup PPL_Java_interface */
+public enum Bounded_Integer_Type_Overflow {
+    //! On overflow, wrapping takes place.
+    OVERFLOW_WRAPS,
+    //! On overflow, the result is undefined.
+    OVERFLOW_UNDEFINED,
+    //! Overflow is impossible.
+    OVERFLOW_IMPOSSIBLE;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Representation.java b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Representation.java
new file mode 100644
index 0000000..16a37b8
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Representation.java
@@ -0,0 +1,41 @@
+/* Bounded_Integer_Type_Representation enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Representation of bounded integer types.
+/*! \ingroup PPL_Java_interface */
+public enum Bounded_Integer_Type_Representation {
+    //! Unsigned binary.
+    UNSIGNED,
+    /*! \brief
+      Signed binary where negative values are represented by the two's
+      complement of the absolute value.
+    */
+    SIGNED_2_COMPLEMENT;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.java b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.java
new file mode 100644
index 0000000..3587f3f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Bounded_Integer_Type_Width.java
@@ -0,0 +1,44 @@
+/* Bounded_Integer_Type_Width enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Widths of bounded integer types.
+/*! \ingroup PPL_Java_interface */
+public enum Bounded_Integer_Type_Width {
+    //! Minimization is requested.
+    BITS_8,
+    //! \hideinitializer 16 bits.
+    BITS_16,
+    //! \hideinitializer 32 bits.
+    BITS_32,
+    //! \hideinitializer 64 bits.
+    BITS_64,
+    //! \hideinitializer 128 bits.
+    BITS_128;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/By_Reference.java b/interfaces/Java/parma_polyhedra_library/By_Reference.java
new file mode 100644
index 0000000..0390b6b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/By_Reference.java
@@ -0,0 +1,51 @@
+/* By_Reference Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! An utility class implementing mutable and non-mutable call-by-reference.
+/*! \ingroup PPL_Java_interface */
+public class By_Reference<T> {
+    //! Stores the object.
+    T obj;
+
+    //! Builds an object encapsulating \p object_value.
+    public By_Reference(T object_value) {
+        obj = object_value;
+    }
+
+    //! Set an object to value \p object_value.
+    public void set(T y) {
+        obj = y;
+    }
+
+    //! Returns the value held by \p this.
+    public T get() {
+        return obj;
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Coefficient.java b/interfaces/Java/parma_polyhedra_library/Coefficient.java
new file mode 100644
index 0000000..34a3f4b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Coefficient.java
@@ -0,0 +1,85 @@
+/* Coefficient Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import java.math.BigInteger;
+
+//! A PPL coefficient.
+/*! \ingroup PPL_Java_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators
+  and so on.
+*/
+public class Coefficient {
+
+    //! Holds the value of \p this.
+    private BigInteger value;
+
+    //! Builds a coefficient valued \p i.
+    public Coefficient(int i) {
+        value = BigInteger.valueOf(i);
+    }
+
+    //! Builds a coefficient valued \p l.
+    public Coefficient(long l) {
+        value = BigInteger.valueOf(l);
+    }
+
+    //! Builds a coefficient valued \p bi.
+    public Coefficient(BigInteger bi) {
+        value = bi;
+    }
+
+    //! Builds a coefficient from the decimal representation in \p s.
+    /*!
+      \exception java.lang.NumberFormatException
+      Thrown if \p s does not contain a valid decimal representation.
+    */
+    public Coefficient(String s) {
+        value = new BigInteger(s);
+    }
+
+    //! Builds a copy of \p c.
+    public Coefficient(Coefficient c) {
+        value = c.value;
+    }
+
+    //! Returns a String representation of \p this.
+    public String toString() {
+        return value.toString();
+    }
+
+    //! Returns the value held by \p this.
+    public BigInteger getBigInteger() {
+        return value;
+    }
+
+    //! Returns the number of bits of PPL coefficients; 0 if unbounded.
+    public static native int bits();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Complexity_Class.java b/interfaces/Java/parma_polyhedra_library/Complexity_Class.java
new file mode 100644
index 0000000..406497d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Complexity_Class.java
@@ -0,0 +1,40 @@
+/* Complexity_Class enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible Complexities.
+/*! \ingroup PPL_Java_interface */
+public enum Complexity_Class {
+    //! Worst-case polynomial complexity.
+    POLYNOMIAL_COMPLEXITY,
+    //! Worst-case exponential complexity but typically polynomial behavior.
+    SIMPLEX_COMPLEXITY,
+    //! Any complexity.
+    ANY_COMPLEXITY;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Congruence.java b/interfaces/Java/parma_polyhedra_library/Congruence.java
new file mode 100644
index 0000000..35a29bc
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Congruence.java
@@ -0,0 +1,86 @@
+/* Congruence Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear congruence.
+/*! \ingroup PPL_Java_interface
+  An object of the class Congruence is an object represeting a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+*/
+public class Congruence {
+
+    //! The modulus of the congruence.
+    protected Coefficient mod;
+
+    //! The value of the left hand side of \p this.
+    Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    Linear_Expression rhs;
+
+    /*! \brief
+      Returns the congruence
+      \f$\mathtt{e1} = \mathtt{e2} \pmod{\mathtt{m}}\f$.
+    */
+    public Congruence(Linear_Expression e1, Linear_Expression e2,
+                      Coefficient m) {
+        mod = new Coefficient(m);
+        lhs = e1.clone();
+        rhs = e2.clone();
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+        return lhs;
+    }
+
+    //! Returns the right hand side of \p this.
+    public Linear_Expression right_hand_side() {
+        return rhs;
+    }
+
+    //! Returns the relation symbol of \p this.
+    public Coefficient modulus() {
+        return mod;
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Congruence_System.java b/interfaces/Java/parma_polyhedra_library/Congruence_System.java
new file mode 100644
index 0000000..f7f43be
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Congruence_System.java
@@ -0,0 +1,46 @@
+/* Congruence_System Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A system of congruences.
+/*! \ingroup PPL_Java_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+*/
+public class Congruence_System extends java.util.ArrayList<Congruence> {
+    //! Default constructor: builds an empty system of congruences.
+    public Congruence_System() {
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Constraint.java b/interfaces/Java/parma_polyhedra_library/Constraint.java
new file mode 100644
index 0000000..d1862ee
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Constraint.java
@@ -0,0 +1,80 @@
+/* Constraint Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_Java_interface
+  An object of the class Constraint is either:
+  - a linear equality;
+  - a non-strict linear inequality;
+  - a strict linear inequality.
+*/
+public class Constraint {
+
+    //! The value of the left hand side of \p this.
+    private Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    private Linear_Expression rhs;
+
+    //! The relation symbol of \p this.
+    private Relation_Symbol kind;
+
+    /*! \brief
+      Builds a constraint from two linear expressions with a specified
+      relation symbol.
+    */
+    public Constraint(Linear_Expression le1, Relation_Symbol rel_sym,
+                      Linear_Expression le2) {
+        lhs = le1.clone();
+        rhs = le2.clone();
+        kind = rel_sym;
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+        return lhs;
+    }
+
+    //! Returns the right hand side of \p this.
+    public Linear_Expression right_hand_side() {
+        return rhs;
+    }
+
+    //! Returns the relation symbol of \p this.
+    public Relation_Symbol kind() {
+        return kind;
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Constraint_System.java b/interfaces/Java/parma_polyhedra_library/Constraint_System.java
new file mode 100644
index 0000000..cff9954
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Constraint_System.java
@@ -0,0 +1,47 @@
+/* Constraint_System Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A system of constraints.
+/*! \ingroup PPL_Java_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+*/
+public class Constraint_System extends java.util.ArrayList<Constraint> {
+
+    //! Default constructor: builds an empty system of constraints.
+    public Constraint_System() {
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
new file mode 100644
index 0000000..dcf0aad
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Name.java
@@ -0,0 +1,31 @@
+/* MIP_Problem Control_Parameter_Name enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Names of MIP problems' control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum Control_Parameter_Name {
+    //! The pricing rule.
+    PRICING
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
new file mode 100644
index 0000000..da1ffb3
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Control_Parameter_Value.java
@@ -0,0 +1,35 @@
+/* MIP_Problem's Control_Parameter_Value enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible values for MIP problem's control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum Control_Parameter_Value {
+    //! Steepest edge pricing method, using floating points (default).
+    PRICING_STEEPEST_EDGE_FLOAT,
+    //! Steepest edge pricing method, using Coefficient.
+    PRICING_STEEPEST_EDGE_EXACT,
+    //! Textbook pricing method.
+    PRICING_TEXTBOOK
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java b/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
new file mode 100644
index 0000000..5d0da10
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Degenerate_Element.java
@@ -0,0 +1,38 @@
+/* Degenerate_Element enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_Java_interface */
+public enum Degenerate_Element {
+    //! The universe element, i.e., the whole vector space.
+    UNIVERSE,
+    //! The empty element, i.e., the empty set.
+    EMPTY;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
new file mode 100644
index 0000000..8d07af3
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Domain_Error_Exception.java
@@ -0,0 +1,33 @@
+/* Domain_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by domain errors.
+/*! \ingroup PPL_Java_interface */
+public class Domain_Error_Exception extends RuntimeException {
+    //! Constructor.
+    public Domain_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java b/interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
new file mode 100644
index 0000000..87dd72d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Fake_Class_for_Doxygen.java
@@ -0,0 +1,1291 @@
+/* Doxumentation for the Java interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+// A fake class, just to cheat Doxygen.
+public class Fake_Class_For_Doxygen {}
+
+//! The Java base class for (C and NNC) convex polyhedra.
+/*! \ingroup PPL_Java_interface
+  The base class Polyhedron provides declarations for most of
+  the methods common to classes C_Polyhedron and NNC_Polyhedron.
+  Note that the user should always use the derived classes.
+  Moreover, C and NNC polyhedra can not be freely interchanged:
+  as specified in the main manual, most library functions require
+  their arguments to be topologically compatible.
+*/
+public class Polyhedron extends PPL_Object {
+
+    //! \name Member Functions that Do Not Modify the Polyhedron
+    //@{
+
+    //! Returns the dimension of the vector space enclosing \p this.
+    public native long space_dimension();
+
+    /*! \brief
+      Returns \f$0\f$, if \p this is empty; otherwise, returns the
+      \extref{Affine_Independence_and_Affine_Dimension, affine dimension}
+      of \p this.
+    */
+    public native long affine_dimension();
+
+    //! Returns the system of constraints.
+    public native Constraint_System constraints();
+
+    //! Returns a system of (equality) congruences satisfied by \p this.
+    public native Congruence_System congruences();
+
+    //! Returns the system of constraints, with no redundant constraint.
+    public native Constraint_System minimized_constraints();
+
+    /*! \brief
+      Returns a system of (equality) congruences satisfied by \p this,
+      with no redundant congruences and having the same affine dimension
+      as \p this.
+    */
+    public native Congruence_System minimized_congruences();
+
+    //! Returns \c true if and only if \p this is an empty polyhedron.
+    public native boolean is_empty();
+
+    //! Returns \c true if and only if \p this is a universe polyhedron.
+    public native boolean is_universe();
+
+    /*! \brief
+      Returns \c true if and only if \p this
+      is a bounded polyhedron.
+    */
+    public native boolean is_bounded();
+
+    //! Returns \c true if and only if \p this is discrete.
+    public native boolean is_discrete();
+
+    /*! \brief
+      Returns \c true if and only if \p this
+      is a topologically closed subset of the vector space.
+    */
+    public native boolean is_topologically_closed();
+
+    /*! \brief
+      Returns \c true if and only if \p this
+      contains at least one integer point.
+    */
+    public native boolean contains_integer_point();
+
+    /*! \brief
+      Returns \c true if and only if \p var is constrained in
+      \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p var is not a space dimension of \p this.
+    */
+    public native boolean constrains(Variable var);
+
+    /*! \brief
+      Returns \c true if and only if \p expr is
+      bounded from above in \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p expr and \p this are dimension-incompatible.
+    */
+    public native boolean bounds_from_above(Linear_Expression expr);
+
+    /*! \brief
+      Returns \c true if and only if \p expr is
+      bounded from below in \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p expr and \p this are dimension-incompatible.
+    */
+    public native boolean bounds_from_below(Linear_Expression expr);
+
+    /*! \brief
+      Returns \c true if and only if \p this is not empty
+      and \p expr is bounded from above in \p this, in which case
+      the supremum value is computed.
+
+      \param expr
+      The linear expression to be maximized subject to \p this;
+
+      \param sup_n
+      The numerator of the supremum value;
+
+      \param sup_d
+      The denominator of the supremum value;
+
+      \param maximum
+      \c true if and only if the supremum is also the maximum value.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p expr and \p this are dimension-incompatible.
+
+      If \p this is empty or \p expr is not bounded from above,
+      \c false is returned and \p sup_n, \p sup_d
+      and \p maximum are left untouched.
+    */
+    public native boolean maximize(Linear_Expression expr,
+                                   Coefficient sup_n, Coefficient sup_d,
+                                   By_Reference<Boolean> maximum);
+
+    /*! \brief
+      Returns \c true if and only if \p this is not empty
+      and \p expr is bounded from below in \p this, in which case
+      the infimum value is computed.
+
+      \param expr
+      The linear expression to be minimized subject to \p this;
+
+      \param inf_n
+      The numerator of the infimum value;
+
+      \param inf_d
+      The denominator of the infimum value;
+
+      \param minimum
+      \c true if and only if the infimum is also the minimum value.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p expr and \p this are dimension-incompatible.
+
+      If \p this is empty or \p expr is not bounded from below,
+      \c false is returned and \p inf_n, \p inf_d
+      and \p minimum are left untouched.
+    */
+    public native boolean minimize(Linear_Expression expr,
+                                   Coefficient inf_n, Coefficient inf_d,
+                                   By_Reference<Boolean> minimum);
+
+    /*! \brief
+      Returns \c true if and only if \p this is not empty
+      and \p expr is bounded from above in \p this, in which case
+      the supremum value and a point where \p expr reaches it are computed.
+
+      \param expr
+      The linear expression to be maximized subject to \p this;
+
+      \param sup_n
+      The numerator of the supremum value;
+
+      \param sup_d
+      The denominator of the supremum value;
+
+      \param maximum
+      \c true if and only if the supremum is also the maximum value;
+
+      \param g
+      When maximization succeeds, will be assigned the point or
+      closure point where \p expr reaches its supremum value.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p expr and \p this are dimension-incompatible.
+
+      If \p this is empty or \p expr is not bounded from above,
+      \c false is returned and \p sup_n, \p sup_d, \p maximum
+      and \p g are left untouched.
+    */
+    public native boolean maximize(Linear_Expression expr,
+                                   Coefficient sup_n, Coefficient sup_d,
+                                   By_Reference<Boolean> maximum,
+                                   Generator g);
+
+    /*! \brief
+      Returns \c true if and only if \p this is not empty
+      and \p expr is bounded from below in \p this, in which case
+      the infimum value and a point where \p expr reaches it are computed.
+
+      \param expr
+      The linear expression to be minimized subject to \p this;
+
+      \param inf_n
+      The numerator of the infimum value;
+
+      \param inf_d
+      The denominator of the infimum value;
+
+      \param minimum
+      \c true if and only if the infimum is also the minimum value;
+
+      \param g
+      When minimization succeeds, will be assigned a point or
+      closure point where \p expr reaches its infimum value.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p expr and \p this are dimension-incompatible.
+
+      If \p this is empty or \p expr is not bounded from below,
+      \c false is returned and \p inf_n, \p inf_d, \p minimum
+      and \p g are left untouched.
+    */
+    public native boolean minimize(Linear_Expression expr,
+                                   Coefficient inf_n, Coefficient inf_d,
+                                   By_Reference<Boolean> minimum,
+                                   Generator g);
+
+    /*! \brief
+      Returns the relations holding between the polyhedron \p this
+      and the constraint \p c.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and constraint \p c are dimension-incompatible.
+    */
+    public native Poly_Con_Relation relation_with(Constraint c);
+
+    /*! \brief
+      Returns the relations holding between the polyhedron \p this
+      and the generator \p g.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and generator \p g are dimension-incompatible.
+    */
+    public native Poly_Gen_Relation relation_with(Generator c);
+
+    /*! \brief
+      Returns the relations holding between the polyhedron \p this
+      and the congruence \p c.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and congruence \p c are dimension-incompatible.
+    */
+    public native Poly_Con_Relation relation_with(Congruence c);
+
+    //! Returns \c true if and only if \p this contains \p y.
+    /*!
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native boolean contains(Polyhedron y);
+
+    //! Returns \c true if and only if \p this strictly contains \p y.
+    /*!
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native boolean strictly_contains(Polyhedron y);
+
+    //! Returns \c true if and only if \p this and \p y are disjoint.
+    /*!
+      \exception Invalid_Argument_Exception
+      Thrown if \p x and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native boolean is_disjoint_from(Polyhedron y);
+
+    //! Returns \c true if and only if \p this and \p y are equal.
+    public native boolean equals(Polyhedron y);
+
+    //! Returns \c true if and only if \p this and \p y are equal.
+    public boolean equals(Object y);
+
+    //! Returns a hash code for \p this.
+    /*!
+      If \p x and \p y are such that <CODE>x == y</CODE>,
+      then <CODE>x.hash_code() == y.hash_code()</CODE>.
+    */
+    public native int hashCode();
+
+    //! Returns the size in bytes of the memory managed by \p this.
+    public native long external_memory_in_bytes();
+
+    //! Returns the total size in bytes of the memory occupied by \p this.
+    public native long total_memory_in_bytes();
+
+    //! Returns a string representing \p this.
+    public native String toString();
+
+    /*! \brief
+      Returns a string containing a low-level representation of \p this.
+
+      Useful for debugging purposes.
+    */
+    public native String ascii_dump();
+
+    //! Checks if all the invariants are satisfied.
+    public native boolean OK();
+
+    //@} // Member Functions that Do Not Modify the Polyhedron
+
+    //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+    //@{
+
+    /*! \brief
+      Adds a copy of constraint \p c to the system of constraints
+      of \p this (without minimizing the result).
+
+      \param c
+      The constraint that will be added to the system of
+      constraints of \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and constraint \p c are topology-incompatible
+      or dimension-incompatible.
+    */
+    public native void add_constraint(Constraint c);
+
+    /*! \brief
+      Adds a copy of congruence \p cg to \p this,
+      if \p cg can be exactly represented by a polyhedron.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and congruence \p cg are dimension-incompatible,
+      of if \p cg is a proper congruence which is neither a tautology,
+      nor a contradiction.
+    */
+    public native void add_congruence(Congruence cg);
+
+    /*! \brief
+      Adds a copy of the constraints in \p cs to the system
+      of constraints of \p this (without minimizing the result).
+
+      \param cs
+      Contains the constraints that will be added to the system of
+      constraints of \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p cs are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void add_constraints(Constraint_System cs);
+
+    /*! \brief
+      Adds a copy of the congruences in \p cgs to \p this,
+      if all the congruences can be exactly represented by a polyhedron.
+
+      \param cgs
+      The congruences to be added.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p cgs are dimension-incompatible,
+      of if there exists in \p cgs a proper congruence which is
+      neither a tautology, nor a contradiction.
+    */
+    public native void add_congruences(Congruence_System cgs);
+
+    /*! \brief
+      Uses a copy of constraint \p c to refine \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and constraint \p c are dimension-incompatible.
+    */
+    public native void refine_with_constraint(Constraint c);
+
+    /*! \brief
+      Uses a copy of congruence \p cg to refine \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and congruence \p cg are dimension-incompatible.
+    */
+    public native void refine_with_congruence(Congruence cg);
+
+    /*! \brief
+      Uses a copy of the constraints in \p cs to refine \p this.
+
+      \param cs
+      Contains the constraints used to refine the system of
+      constraints of \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p cs are dimension-incompatible.
+    */
+    public native void refine_with_constraints(Constraint_System cs);
+
+    /*! \brief
+      Uses a copy of the congruences in \p cgs to refine \p this.
+
+      \param cgs
+      Contains the congruences used to refine the system of
+      constraints of \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p cgs are dimension-incompatible.
+    */
+    public native void refine_with_congruences(Congruence_System cgs);
+
+    /*! \brief
+      Assigns to \p this the intersection of \p this and \p y.
+      The result is not guaranteed to be minimized.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void intersection_assign(Polyhedron y);
+
+    /*! \brief
+      Assigns to \p this the upper bound of \p this and \p y.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void upper_bound_assign(Polyhedron y);
+
+    /*! \brief
+      Assigns to \p this
+      the \extref{Convex_Polyhedral_Difference, poly-difference}
+      of \p this and \p y. The result is not guaranteed to be minimized.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void difference_assign(Polyhedron y);
+
+    /*! \brief
+      Assigns to \p this the result of computing the
+      \extref{Time_Elapse_Operator, time-elapse} between \p this and \p y.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void time_elapse_assign(Polyhedron y);
+
+    //! Assigns to \p this its topological closure.
+    public native void topological_closure_assign();
+
+    /*! \brief
+      Assigns to \p this a \extref{Meet_Preserving_Simplification,
+      meet-preserving simplification} of \p this with respect to \p y.
+      If \c false is returned, then the intersection is empty.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native boolean simplify_using_context_assign(Polyhedron y);
+
+    /*! \brief
+      Assigns to \p this the
+      \extref{Single_Update_Affine_Functions, affine image}
+      of \p this under the function mapping variable \p var to the
+      affine expression specified by \p expr and \p denominator.
+
+      \param var
+      The variable to which the affine expression is assigned;
+
+      \param expr
+      The numerator of the affine expression;
+
+      \param denominator
+      The denominator of the affine expression (optional argument with
+      default value 1).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p denominator is zero or if \p expr and \p this are
+      dimension-incompatible or if \p var is not a space dimension of
+      \p this.
+    */
+    public native void affine_image(Variable var, Linear_Expression expr,
+                                    Coefficient denominator);
+
+    /*! \brief
+      Assigns to \p this the
+      \extref{Single_Update_Affine_Functions, affine preimage}
+      of \p this under the function mapping variable \p var to the
+      affine expression specified by \p expr and \p denominator.
+
+      \param var
+      The variable to which the affine expression is substituted;
+
+      \param expr
+      The numerator of the affine expression;
+
+      \param denominator
+      The denominator of the affine expression (optional argument with
+      default value 1).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p denominator is zero or if \p expr and \p this are
+      dimension-incompatible or if \p var is not a space dimension of \p this.
+    */
+    public native void affine_preimage(Variable var, Linear_Expression expr,
+                                       Coefficient denominator);
+
+    /*!
+      \brief
+      Assigns to \p this the image of \p this with respect to the
+      \extref{Single_Update_Bounded_Affine_Relations, bounded affine relation}
+      \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+      \leq \mathrm{var}'
+      \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+      \param var
+      The variable updated by the affine relation;
+
+      \param lb_expr
+      The numerator of the lower bounding affine expression;
+
+      \param ub_expr
+      The numerator of the upper bounding affine expression;
+
+      \param denominator
+      The (common) denominator for the lower and upper bounding
+      affine expressions (optional argument with default value 1).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+      and \p this are dimension-incompatible or if \p var is not a space
+      dimension of \p this.
+    */
+    public native void bounded_affine_image(Variable var,
+                                            Linear_Expression lb_expr,
+                                            Linear_Expression ub_expr,
+                                            Coefficient denominator);
+
+    /*! \brief
+      Assigns to \p this the preimage of \p this with respect to the
+      \extref{Single_Update_Bounded_Affine_Relations, bounded affine relation}
+      \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+      \leq \mathrm{var}'
+      \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+      \param var
+      The variable updated by the affine relation;
+
+      \param lb_expr
+      The numerator of the lower bounding affine expression;
+
+      \param ub_expr
+      The numerator of the upper bounding affine expression;
+
+      \param denominator
+      The (common) denominator for the lower and upper bounding
+      affine expressions (optional argument with default value 1).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+      and \p this are dimension-incompatible or if \p var is not a space
+      dimension of \p this.
+    */
+    public native void bounded_affine_preimage(Variable var,
+                                               Linear_Expression lb_expr,
+                                               Linear_Expression ub_expr,
+                                               Coefficient denominator);
+
+    /*! \brief
+      Assigns to \p this the image of \p this with respect to the
+      \extref{Generalized_Affine_Relations, generalized affine relation}
+      \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+      where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+      by \p relsym.
+
+      \param var
+      The left hand side variable of the generalized affine relation;
+
+      \param relsym
+      The relation symbol;
+
+      \param expr
+      The numerator of the right hand side affine expression;
+
+      \param denominator
+      The denominator of the right hand side affine expression (optional
+      argument with default value 1).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p denominator is zero or if \p expr and \p this are
+      dimension-incompatible or if \p var is not a space dimension of \p this
+      or if \p this is a C_Polyhedron and \p relsym is a strict
+      relation symbol.
+    */
+    public native void generalized_affine_image(Variable var,
+                                                Relation_Symbol relsym,
+                                                Linear_Expression expr,
+                                                Coefficient denominator);
+
+    /*! \brief
+      Assigns to \p this the preimage of \p this with respect to the
+      \extref{Generalized_Affine_Relations, generalized affine relation}
+      \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+      where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+      by \p relsym.
+
+      \param var
+      The left hand side variable of the generalized affine relation;
+
+      \param relsym
+      The relation symbol;
+
+      \param expr
+      The numerator of the right hand side affine expression;
+
+      \param denominator
+      The denominator of the right hand side affine expression (optional
+      argument with default value 1).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p denominator is zero or if \p expr and \p this are
+      dimension-incompatible or if \p var is not a space dimension of \p this
+      or if \p this is a C_Polyhedron and \p relsym is a strict
+      relation symbol.
+    */
+    public native void generalized_affine_preimage(Variable var,
+                                                   Relation_Symbol relsym,
+                                                   Linear_Expression expr,
+                                                   Coefficient denominator);
+
+    /*! \brief
+      Assigns to \p this the image of \p this with respect to the
+      \extref{Generalized_Affine_Relations, generalized affine relation}
+      \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+      \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+      \param lhs
+      The left hand side affine expression;
+
+      \param relsym
+      The relation symbol;
+
+      \param rhs
+      The right hand side affine expression.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this is dimension-incompatible with \p lhs or \p rhs
+      or if \p this is a C_Polyhedron and \p relsym is a strict
+      relation symbol.
+    */
+    public native void generalized_affine_image(Linear_Expression lhs,
+                                                Relation_Symbol relsym,
+                                                Linear_Expression rhs);
+
+    /*! \brief
+      Assigns to \p this the preimage of \p this with respect to the
+      \extref{Generalized_Affine_Relations, generalized affine relation}
+      \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+      \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+      \param lhs
+      The left hand side affine expression;
+
+      \param relsym
+      The relation symbol;
+
+      \param rhs
+      The right hand side affine expression.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this is dimension-incompatible with \p lhs or \p rhs
+      or if \p this is a C_Polyhedron and \p relsym is a strict
+      relation symbol.
+    */
+    public native void generalized_affine_preimage(Linear_Expression lhs,
+                                                   Relation_Symbol relsym,
+                                                   Linear_Expression rhs);
+
+    /*! \brief
+      Computes the \extref{Cylindrification, cylindrification} of \p this
+      with respect to space dimension \p var, assigning the result to \p this.
+
+      \param var
+      The space dimension that will be unconstrained.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p var is not a space dimension of \p this.
+    */
+    public native void unconstrain_space_dimension(Variable var);
+
+    /*! \brief
+      Computes the \extref{Cylindrification, cylindrification} of \p this
+      with respect to the set of space dimensions \p vars,
+      assigning the result to \p this.
+
+      \param vars
+      The set of space dimension that will be unconstrained.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this is dimension-incompatible with one of the
+      Variable objects contained in \p vars.
+    */
+    public native void unconstrain_space_dimensions(Variables_Set vars);
+
+    /*! \brief
+      Assigns to \p this the result of computing the
+      \extref{H79_widening, H79-widening} between \p this and \p y.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void widening_assign(Polyhedron y,
+                                       By_Reference<Integer> tp);
+
+    //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+    //! \name Member Functions that May Modify the Dimension of the Vector Space
+    //@{
+
+    /*! \brief
+      Swaps \p this with polyhedron \p y.
+      (\p this and \p y can be dimension-incompatible.)
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p x and \p y are topology-incompatible.
+    */
+    public native void swap(Polyhedron y);
+
+    /*! \brief
+      Adds \p m new space dimensions and embeds the old polyhedron
+      in the new vector space.
+
+      \param m
+      The number of dimensions to add.
+
+      \exception Length_Error_Exception
+      Thrown if adding \p m new space dimensions would cause the
+      vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+    */
+    public native void add_space_dimensions_and_embed(long m);
+
+    /*! \brief
+      Adds \p m new space dimensions to the polyhedron
+      and does not embed it in the new vector space.
+
+      \param m
+      The number of space dimensions to add.
+
+      \exception Length_Error_Exception
+      Thrown if adding \p m new space dimensions would cause the
+      vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+    */
+    public native void add_space_dimensions_and_project(long m);
+
+    /*! \brief
+      Assigns to \p this the \extref{Concatenating_Polyhedra, concatenation}
+      of \p this and \p y, taken in this order.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible.
+
+      \exception Length_Error_Exception
+      Thrown if the concatenation would cause the vector space
+      to exceed dimension <CODE>max_space_dimension()</CODE>.
+    */
+    public native void concatenate_assign(Polyhedron y);
+
+    //! Removes all the specified dimensions from the vector space.
+    /*!
+      \param vars
+      The set of Variable objects corresponding to the space dimensions
+      to be removed.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this is dimension-incompatible with one of the
+      Variable objects contained in \p vars.
+    */
+    public native void remove_space_dimensions(Variables_Set vars);
+
+    /*! \brief
+      Removes the higher dimensions of the vector space so that
+      the resulting space will have dimension \p new_dimension.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p new_dimensions is greater than the space dimension of
+      \p this.
+    */
+    public native void remove_higher_space_dimensions(long
+                                                      new_dimension);
+
+    //! Creates \p m copies of the space dimension corresponding to \p var.
+    /*!
+      \param var
+      The variable corresponding to the space dimension to be replicated;
+
+      \param m
+      The number of replicas to be created.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p var does not correspond to a dimension of the vector space.
+
+      \exception Length_Error_Exception
+      Thrown if adding \p m new space dimensions would cause the
+      vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+    */
+    public native void expand_space_dimension(Variable var, long m);
+
+    //! Folds the space dimensions in \p vars into \p dest.
+    /*!
+      \param vars
+      The set of Variable objects corresponding to the space dimensions
+      to be folded;
+
+      \param dest
+      The variable corresponding to the space dimension that is the
+      destination of the folding operation.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this is dimension-incompatible with \p dest or with
+      one of the Variable objects contained in \p vars.
+      Also thrown if \p dest is contained in \p vars.
+    */
+    public native void fold_space_dimensions(Variables_Set vars,
+                                             Variable dest);
+
+    /*! \brief
+      Remaps the dimensions of the vector space according to
+      a \extref{Mapping_the_Dimensions_of_the_Vector_Space, partial function}.
+
+      \param pfunc
+      The partial function specifying the destiny of each space dimension.
+    */
+    public native void map_space_dimensions(Partial_Function pfunc);
+
+    //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+    /*! \name Ad Hoc Functions for (C or NNC) Polyhedra
+      The functions listed here below, being specific of the polyhedron
+      domains, do not have a correspondence in other semantic geometric
+      descriptions.
+    */
+    //@{
+
+    //! Returns the system of generators.
+    public native Generator_System generators();
+
+    //! Returns the system of generators, with no redundant generator.
+    public native Generator_System minimized_generators();
+
+    /*! \brief
+      Adds a copy of generator \p g to the system of generators
+      of \p this (without minimizing the result).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and generator \p g are topology-incompatible or
+      dimension-incompatible, or if \p this is an empty polyhedron and
+      \p g is not a point.
+    */
+    public native void add_generator(Generator g);
+
+    /*! \brief
+      Adds a copy of the generators in \p gs to the system
+      of generators of \p this (without minimizing the result).
+
+      \param gs
+      Contains the generators that will be added to the system of
+      generators of \p this.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p gs are topology-incompatible or
+      dimension-incompatible, or if \p this is empty and the system of
+      generators \p gs is not empty, but has no points.
+    */
+    public native void add_generators(Generator_System gs);
+
+    //! Same as upper_bound_assign.
+    public native void poly_hull_assign(Polyhedron y);
+
+    //! Same as difference_assign.
+    public native void poly_difference_assign(Polyhedron y);
+
+    /*! \brief
+      Assigns to \p this the result of computing the
+      \extref{BHRZ03_widening, BHRZ03-widening} between \p this and \p y.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void BHRZ03_widening_assign(Polyhedron y,
+                                              By_Reference<Integer> tp);
+
+    /*! \brief
+      Assigns to \p this the result of computing the
+      \extref{H79_widening, H79-widening} between \p this and \p y.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native void H79_widening_assign(Polyhedron y,
+                                           By_Reference<Integer> tp);
+
+    /*! \brief
+      Improves the result of the \extref{BHRZ03_widening, BHRZ03-widening}
+      computation by also enforcing those constraints in \p cs that are
+      satisfied by all the points of \p this.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param cs
+      The system of constraints used to improve the widened polyhedron;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this, \p y and \p cs are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native
+        void limited_BHRZ03_extrapolation_assign(Polyhedron y,
+                                                 Constraint_System cs,
+                                                 By_Reference<Integer> tp);
+
+    /*! \brief
+      Improves the result of the \extref{H79_widening, H79-widening}
+      computation by also enforcing those constraints in \p cs that are
+      satisfied by all the points of \p this.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param cs
+      The system of constraints used to improve the widened polyhedron;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this, \p y and \p cs are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native
+        void limited_H79_extrapolation_assign(Polyhedron y,
+                                              Constraint_System cs,
+                                              By_Reference<Integer> tp);
+
+    /*! \brief
+      Improves the result of the \extref{BHRZ03_widening, BHRZ03-widening}
+      computation by also enforcing those constraints in \p cs that are
+      satisfied by all the points of \p this, plus all the constraints
+      of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+      \f$r \in \Qset\f$, that are satisfied by all the points of \p this.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param cs
+      The system of constraints used to improve the widened polyhedron;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this, \p y and \p cs are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native
+        void bounded_BHRZ03_extrapolation_assign(Polyhedron y,
+                                                 Constraint_System cs,
+                                                 By_Reference<Integer> tp);
+
+    /*! \brief
+      Improves the result of the \extref{H79_widening, H79-widening}
+      computation by also enforcing those constraints in \p cs that are
+      satisfied by all the points of \p this, plus all the constraints
+      of the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$, with
+      \f$r \in \Qset\f$, that are satisfied by all the points of \p this.
+
+      \param y
+      A polyhedron that <EM>must</EM> be contained in \p this;
+
+      \param cs
+      The system of constraints used to improve the widened polyhedron;
+
+      \param tp
+      A reference to an unsigned variable storing the number of
+      available tokens (to be used when applying the
+      \extref{Widening_with_Tokens, widening with tokens} delay technique).
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this, \p y and \p cs are topology-incompatible or
+      dimension-incompatible.
+    */
+    public native
+        void bounded_H79_extrapolation_assign(Polyhedron y,
+                                              Constraint_System cs,
+                                              By_Reference<Integer> tp);
+
+    //@} // Ad Hoc Functions for (C or NNC) Polyhedra
+
+} // class Polyhedron
+
+
+//! A topologically closed convex polyhedron.
+/*! \ingroup PPL_Java_interface */
+public class C_Polyhedron extends Polyhedron {
+
+    //! \name Standard Constructors and Destructor
+    //@{
+
+    //! Builds a new C polyhedron of dimension \p d.
+    /*!
+      If \p kind is \c EMPTY, the newly created polyhedron will be empty;
+      otherwise, it will be a universe polyhedron.
+    */
+    public C_Polyhedron(long d, Degenerate_Element kind);
+
+    //! Builds a new C polyhedron that is copy of \p y.
+    public C_Polyhedron(C_Polyhedron y);
+
+    //! Builds a new C polyhedron that is a copy of \p ph.
+    /*!
+      The complexity argument is ignored.
+    */
+    public C_Polyhedron(C_Polyhedron y, Complexity_Class complexity);
+
+    //! Builds a new C polyhedron from the system of constraints \p cs.
+    /*!
+      The new polyhedron will inherit the space dimension of \p cs.
+    */
+    public C_Polyhedron(Constraint_System cs);
+
+    //! Builds a new C polyhedron from the system of congruences \p cgs.
+    /*!
+      The new polyhedron will inherit the space dimension of \p cgs.
+    */
+    public C_Polyhedron(Congruence_System cgs);
+
+    /*! \brief
+      Releases all resources managed by \p this,
+      also resetting it to a null reference.
+    */
+    public native void free();
+
+    //@} // Standard Constructors and Destructor
+
+    /*! \name Constructors Behaving as Conversion Operators
+      Besides the conversions listed here below, the library also
+      provides conversion operators that build a semantic geometric
+      description starting from \b any other semantic geometric
+      description (e.g., <code>Grid(C_Polyhedron y)</code>,
+      <code>C_Polyhedron(BD_Shape_mpq_class y)</code>, etc.).
+      Clearly, the conversion operators are only available if both
+      the source and the target semantic geometric descriptions have
+      been enabled when configuring the library.
+      The conversions also taking as argument a complexity class
+      sometimes provide non-trivial precision/efficiency trade-offs.
+    */
+    //@{
+
+    /*! \brief
+      Builds a C polyhedron that is a copy of the topological closure
+      of the NNC polyhedron \p y.
+    */
+    public C_Polyhedron(NNC_Polyhedron y);
+
+    /*! \brief
+      Builds a C polyhedron that is a copy of the topological closure
+      of the NNC polyhedron \p y.
+
+      The complexity argument is ignored, since the exact constructor
+      has polynomial complexity.
+    */
+    public C_Polyhedron(NNC_Polyhedron y, Complexity_Class complexity);
+
+    //! Builds a new C polyhedron from the system of generators \p gs.
+    /*!
+      The new polyhedron will inherit the space dimension of \p gs.
+    */
+    public C_Polyhedron(Generator_System gs);
+
+    //@} // Constructors Behaving as Conversion Operators
+
+    //! \name Other Methods
+    //@{
+
+    /*! \brief
+      If the upper bound of \p this and \p y is exact it is assigned
+      to \p this and \c true is returned; otherwise \c false is returned.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p y are dimension-incompatible.
+    */
+    public native boolean upper_bound_assign_if_exact(C_Polyhedron y);
+
+    //@} // Other Methods.
+
+    //! Partitions \p q with respect to \p p.
+    /*!
+      Let \p p and \p q be two polyhedra.
+      The function returns a pair object \p r such that
+      - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+      - <CODE>r.second</CODE> has the property that all its elements are
+      pairwise disjoint and disjoint from \p p;
+      - the set-theoretical union of <CODE>r.first</CODE> with all the
+      elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+      is the representation of a partition of \p q).
+    */
+    public static native
+        Pair<C_Polyhedron, Pointset_Powerset_NNC_Polyhedron>
+        linear_partition(C_Polyhedron p, C_Polyhedron q);
+
+    //! Releases all resources managed by \p this.
+    protected native void finalize();
+
+} // class C_Polyhedron
+
+
+//! A powerset of C_Polyhedron objects.
+/*! \ingroup PPL_Java_interface
+  The powerset domains can be instantiated by taking as a base domain
+  any fixed semantic geometric description
+  (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+  An element of the powerset domain represents a disjunctive collection
+  of base objects (its disjuncts), all having the same space dimension.
+
+  Besides the methods that are available in all semantic geometric
+  descriptions (whose documentation is not repeated here),
+  the powerset domain also provides several ad hoc methods.
+  In particular, the iterator types allow for the examination and
+  manipulation of the collection of disjuncts.
+*/
+public class Pointset_Powerset_C_Polyhedron extends PPL_Object {
+
+    //! \name Ad Hoc Functions for Pointset_Powerset domains
+    /*@{*/
+
+    /*! \brief
+      Drops from the sequence of disjuncts in \p this all the non-maximal
+      elements, so that a non-redundant powerset if obtained.
+    */
+    public native void omega_reduce();
+
+    //! Returns the number of disjuncts.
+    /*!
+      If present, Omega-redundant elements will be counted too.
+    */
+    public native long size();
+
+    //! Returns \c true if and only if \p this geometrically covers \p y.
+    public native boolean
+        geometrically_covers(Pointset_Powerset_C_Polyhedron y);
+
+    //! Returns \c true if and only if \p this is geometrically equal to \p y.
+    public native boolean
+        geometrically_equals(Pointset_Powerset_C_Polyhedron y);
+
+    /*! \brief
+      Returns an iterator referring to the beginning of the sequence
+      of disjuncts of \p this.
+    */
+    public native Pointset_Powerset_C_Polyhedron_Iterator begin_iterator();
+
+    /*! \brief
+      Returns an iterator referring to past the end of the sequence
+      of disjuncts of \p this.
+    */
+    public native Pointset_Powerset_C_Polyhedron_Iterator end_iterator();
+
+    //! Adds to \p this a copy of disjunct \p d.
+    public native void add_disjunct(C_Polyhedron d);
+
+    // FIXME: this method needs correction, as it returns nothing.
+    /*! \brief
+      Drops from \p this the disjunct referred by \p iter; returns an
+      iterator referring to the disjunct following the dropped one.
+    */
+    public native void
+        drop_disjunct(Pointset_Powerset_C_Polyhedron_Iterator iter);
+
+
+    /*! \brief
+      Drops from \p this all the disjuncts from \p first to \p last
+      (excluded).
+    */
+    public native void
+        drop_disjuncts(Pointset_Powerset_C_Polyhedron_Iterator first,
+                       Pointset_Powerset_C_Polyhedron_Iterator last);
+
+
+    /*! \brief
+      Modifies \p this by (recursively) merging together the pairs of
+      disjuncts whose upper-bound is the same as their set-theoretical union.
+    */
+    public native void pairwise_reduce();
+
+    /*@}*/ /* Ad Hoc Functions for Pointset_Powerset domains */
+
+} // class Pointset_Powerset_C_Polyhedron
+
+
+//! An iterator class for the disjuncts of a Pointset_Powerset_C_Polyhedron.
+/*! \ingroup PPL_Java_interface */
+public class Pointset_Powerset_C_Polyhedron_Iterator extends PPL_Object {
+
+    //! Builds a copy of iterator \p y.
+    public Pointset_Powerset_C_Polyhedron_Iterator
+        (Pointset_Powerset_C_Polyhedron_Iterator y);
+
+    //! Returns \c true if and only if \p this and \p itr are equal.
+    public native boolean equals(Pointset_Powerset_C_Polyhedron_Iterator itr);
+
+    //! Modifies \p this so that it refers to the next disjunct.
+    public native void next();
+
+    //! Modifies \p this so that it refers to the previous disjunct.
+    public native void prev();
+
+    //! Returns the disjunct referenced by \p this.
+    /*!
+      \warning
+      On exit, the C_Polyhedron disjunct is still owned by the powerset
+      object: any function call on the owning powerset object may
+      invalidate it. Moreover, the disjunct is meant to be immutable
+      and should not be modified in any way (its resources will
+      be released when deleting the owning powerset). If really needed,
+      the disjunct may be copied into a new object, which will be under
+      control of the user.
+    */
+    public native C_Polyhedron get_disjunct();
+
+    //! Releases resources and resets \p this to a null reference.
+    public native void free();
+
+    //! Releases the resources managed by \p this.
+    protected native void finalize();
+
+} // class Pointset_Powerset_C_Polyhedron_Iterator
diff --git a/interfaces/Java/parma_polyhedra_library/Generator.java b/interfaces/Java/parma_polyhedra_library/Generator.java
new file mode 100644
index 0000000..6001ad7
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Generator.java
@@ -0,0 +1,145 @@
+/* Generator Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import javax.management.RuntimeErrorException;
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_Java_interface
+  An object of the class Generator is one of the following:
+  - a line;
+  - a ray;
+  - a point;
+  - a closure point.
+*/
+public class Generator {
+    //! The generator type.
+    private Generator_Type gt;
+
+    //! The linear expression.
+    private Linear_Expression le;
+
+    //! The divisor (valid if the generator is a point or a closure point).
+    private Coefficient div;
+
+    /*! \brief
+      Builds a generator of type \p g_type,
+      stealing the coefficients from \p e.
+    */
+    private Generator(Linear_Expression e, Generator_Type g_type) {
+        le = e.clone();
+        gt = g_type;
+    }
+
+    //! Returns the closure point at \p e / \p d.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Generator closure_point(Linear_Expression e, Coefficient d) {
+        if (d.getBigInteger().equals(java.math.BigInteger.ZERO)) {
+            Error cause = new Error("parma_polyhedra_library.Generator::"
+                                    + "Generator(e, d):\n"
+                                    + "the divisor can not be zero.");
+            throw new RuntimeErrorException(cause);
+        }
+        Generator g = new Generator(e, Generator_Type.CLOSURE_POINT);
+        g.div = new Coefficient(d);
+        return g;
+    }
+
+    //! Returns the line of direction \p e.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if the homogeneous part of \p e represents the origin of
+      the vector space.
+    */
+    public static Generator line(Linear_Expression e) {
+        return new Generator(e, Generator_Type.LINE);
+    }
+
+    //! Returns the point at \p e / \p d.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Generator point(Linear_Expression e, Coefficient d) {
+        if (d.getBigInteger().equals(java.math.BigInteger.ZERO)) {
+            Error cause = new Error("parma_polyhedra_library.Generator::"
+                                    + "Generator(e, d):\n"
+                                    + "the divisor can not be zero.");
+            throw new RuntimeErrorException(cause);
+        }
+
+        Generator g = new Generator(e, Generator_Type.POINT);
+        g.div = new Coefficient(d);
+        return g;
+    }
+
+    //! Returns the ray of direction \p e.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if the homogeneous part of \p e represents the origin of
+      the vector space.
+    */
+    public static Generator ray(Linear_Expression e) {
+        return new Generator(e, Generator_Type.RAY);
+    }
+
+    //! Returns the generator type.
+    public Generator_Type type() {
+        return gt;
+    }
+
+    //! Returns the linear expression in \p this.
+    public Linear_Expression linear_expression() {
+        return le;
+    }
+
+    //! If \p this is either a point or a closure point, returns its divisor.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p this is neither a point nor a closure point.
+    */
+    public Coefficient divisor() {
+        if (this.gt == Generator_Type.POINT
+            || this.gt == Generator_Type.CLOSURE_POINT)
+            return div;
+        Error cause = new Error("parma_polyhedra_library.Generator::divisor:\n"
+                                + "this is neither a point"
+                                + " nor a closure point.");
+        throw new RuntimeErrorException(cause);
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Generator_System.java b/interfaces/Java/parma_polyhedra_library/Generator_System.java
new file mode 100644
index 0000000..7175f2d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Generator_System.java
@@ -0,0 +1,48 @@
+/* Generator_System Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A system of generators.
+/*! \ingroup PPL_Java_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+*/
+public class Generator_System extends java.util.ArrayList<Generator> {
+
+    //! Default constructor: builds an empty system of generators.
+    public Generator_System() {
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Generator_Type.java b/interfaces/Java/parma_polyhedra_library/Generator_Type.java
new file mode 100644
index 0000000..7e2342d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Generator_Type.java
@@ -0,0 +1,42 @@
+/* Generator_Type enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The generator type.
+/*! \ingroup PPL_Java_interface */
+public enum Generator_Type {
+    //! The generator is a line.
+    LINE,
+    //! The generator is a ray.
+    RAY,
+    //! The generator is a point.
+    POINT,
+    //! The generator is a closure point.
+    CLOSURE_POINT;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Grid_Generator.java b/interfaces/Java/parma_polyhedra_library/Grid_Generator.java
new file mode 100644
index 0000000..3caad9e
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator.java
@@ -0,0 +1,123 @@
+/* Grid Generator Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import javax.management.RuntimeErrorException;
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_Java_interface
+  An object of the class Grid_Generator is one of the following:
+  - a grid_line;
+  - a parameter;
+  - a grid_point.
+*/
+public class Grid_Generator {
+
+    //! The grid generator type.
+    private Grid_Generator_Type gt;
+
+    //! The linear expression.
+    private Linear_Expression le;
+
+    /*! \brief
+      The coefficient used if the grid generator is a
+      parameter or a grid point a parameter.
+    */
+    private Coefficient div;
+
+    private Grid_Generator(Linear_Expression e, Coefficient d,
+                           Grid_Generator_Type generator_type) {
+        le = e.clone();
+        div = new Coefficient(d);
+        gt = generator_type;
+    }
+
+    //! Returns the line of direction \p e.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if the homogeneous part of \p e represents the origin of
+      the vector space.
+    */
+    public static Grid_Generator grid_line(Linear_Expression e) {
+        return new Grid_Generator(e, new Coefficient(0),
+                                  Grid_Generator_Type.LINE);
+    }
+
+    //! Returns the parameter at \p e / \p d.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Grid_Generator parameter(Linear_Expression e,
+                                           Coefficient d) {
+        return new Grid_Generator(e, d, Grid_Generator_Type.PARAMETER);
+    }
+
+    //! Returns the point at \p e / \p d.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p d is zero.
+    */
+    public static Grid_Generator grid_point(Linear_Expression e,
+                                            Coefficient d) {
+        return new Grid_Generator(e, d, Grid_Generator_Type.POINT);
+    }
+
+    //! Returns the generator type.
+    public Grid_Generator_Type type() {
+        return gt;
+    }
+
+    //! Returns the linear expression in \p this.
+    public Linear_Expression linear_expression() {
+        return le;
+    }
+
+    //! If \p this is either a grid point or a parameter, returns its divisor.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if \p this is a line.
+    */
+    public Coefficient divisor() {
+        if (this.gt != Grid_Generator_Type.LINE)
+            return div;
+        Error cause = new Error("parma_polyhedra_library."
+                                + "Grid_Generator::divisor:\n"
+                                + "this is neither a grid point"
+                                + " nor a parameter.");
+        throw new RuntimeErrorException(cause);
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java b/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
new file mode 100644
index 0000000..d9cb51f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator_System.java
@@ -0,0 +1,49 @@
+/* Grid Generator_System Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A system of grid generators.
+/*! \ingroup PPL_Java_interface
+    An object of the class Grid_Generator_System is a system of grid
+    generators, i.e., a multiset of objects of the class Grid_Generator.
+*/
+public class Grid_Generator_System
+    extends java.util.ArrayList<Grid_Generator> {
+
+    //! Default constructor: builds an empty system of grid generators.
+    public Grid_Generator_System() {
+    }
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java b/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
new file mode 100644
index 0000000..2efdca2
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Grid_Generator_Type.java
@@ -0,0 +1,40 @@
+/* Grid_Generator_Type enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The grid generator type.
+/*! \ingroup PPL_Java_interface */
+public enum Grid_Generator_Type {
+    //! The generator is a line.
+    LINE,
+    //! The generator is a parameter.
+    PARAMETER,
+    //! The generator is a point.
+    POINT;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/IO.java b/interfaces/Java/parma_polyhedra_library/IO.java
new file mode 100644
index 0000000..12b868b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/IO.java
@@ -0,0 +1,48 @@
+/* IO Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A class collecting I/O functions.
+/*! \ingroup PPL_Java_interface */
+public class IO {
+    //! Utility function for the wrapping of lines of text.
+    /*!
+      \param str
+      The source string holding the lines to wrap.
+
+      \param indent_depth
+      The indentation depth.
+
+      \param preferred_first_line_length
+      The preferred length for the first line of text.
+
+      \param preferred_line_length
+      The preferred length for all the lines but the first one.
+
+      \return
+      The wrapped string.
+    */
+    public static native String wrap_string(String str, int indent_depth,
+                                            int preferred_first_line_length, int preferred_line_length);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java b/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
new file mode 100644
index 0000000..abc803a
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Invalid_Argument_Exception.java
@@ -0,0 +1,34 @@
+/* Invalid_Argument_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by invalid arguments.
+/*! \ingroup PPL_Java_interface */
+public class Invalid_Argument_Exception extends RuntimeException {
+    //! Constructor.
+    public Invalid_Argument_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
new file mode 100644
index 0000000..85170da
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Length_Error_Exception.java
@@ -0,0 +1,33 @@
+/* Length_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by too big length/size values.
+/*! \ingroup PPL_Java_interface */
+public class Length_Error_Exception extends RuntimeException {
+    //! Constructor.
+    public Length_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression.java
new file mode 100644
index 0000000..4f224cd
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression.java
@@ -0,0 +1,76 @@
+/* Linear_Expression Java declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear expression.
+/*! \ingroup PPL_Java_interface
+  An object of the class Linear_Expression represents a linear expression
+  that can be built from a Linear_Expression_Variable,
+  Linear_Expression_Coefficient, Linear_Expression_Sum,
+  Linear_Expression_Difference, Linear_Expression_Unary_Minus.
+*/
+public abstract class Linear_Expression implements Cloneable {
+
+    //! Returns the sum of \p this and \p y.
+    public Linear_Expression sum(Linear_Expression y) {
+        return new Linear_Expression_Sum(this, y);
+    }
+
+    //! Returns the difference of \p this and \p y.
+    public Linear_Expression subtract(Linear_Expression y) {
+        return new Linear_Expression_Difference(this, y);
+    }
+
+    //! Returns the product of \p this times \p c.
+    public Linear_Expression times(Coefficient c) {
+        return new Linear_Expression_Times(this, c);
+    }
+
+    //! Returns the negation of \p this.
+    public Linear_Expression unary_minus() {
+        return new Linear_Expression_Unary_Minus(this);
+    }
+
+    //! Returns a copy of the linear expression.
+    public abstract Linear_Expression clone();
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    //! Returns <CODE>true</CODE> if and only if \p this is \f$0\f$.
+    public native boolean is_zero();
+
+    /*! \brief Returns <CODE>true</CODE> if and only if all the homogeneous
+        terms of \p this are \f$0\f$.
+    */
+    public native boolean all_homogeneous_terms_are_zero();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
new file mode 100644
index 0000000..aa0f9f5
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Coefficient.java
@@ -0,0 +1,54 @@
+/* Linear_Expression_Coefficient class definition and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear expression built from a coefficient.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Coefficient
+    extends Linear_Expression {
+
+    //! The coefficient representing the linear expression.
+    protected Coefficient coeff;
+
+    //! Builds the object corresponding to a copy of the coefficient \p c.
+    public Linear_Expression_Coefficient(Coefficient c) {
+        coeff = new Coefficient(c);
+    }
+
+    //! Returns coefficient representing the linear expression.
+    public Coefficient argument() {
+        return coeff;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Coefficient clone() {
+        return new Linear_Expression_Coefficient(coeff);
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
new file mode 100644
index 0000000..614bb02
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Difference.java
@@ -0,0 +1,66 @@
+/* Linear_Expression_Difference class definition and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The difference of two linear expressions.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Difference
+    extends Linear_Expression {
+
+    //! The value of the left hand side of \p this.
+    protected Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    protected Linear_Expression rhs;
+
+    /*! \brief
+      Builds an object that represents the difference of the copy \p x and
+      \p y.
+    */
+    public Linear_Expression_Difference(Linear_Expression x,
+                                        Linear_Expression y) {
+        lhs = x.clone();
+        rhs = y.clone();
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+        return lhs;
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression right_hand_side() {
+        return rhs;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Difference clone() {
+        return new Linear_Expression_Difference(lhs, rhs);
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
new file mode 100644
index 0000000..70f3930
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Sum.java
@@ -0,0 +1,62 @@
+/* Linear_Expression_Sum class definition and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The sum of two linear expressions.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Sum
+    extends Linear_Expression {
+
+    //! The value of the left hand side of \p this.
+    protected Linear_Expression lhs;
+
+    //! The value of the right hand side of \p this.
+    protected Linear_Expression rhs;
+
+    //! Builds an object that represents the sum of the copy of \p x and \p y.
+    public Linear_Expression_Sum(Linear_Expression x, Linear_Expression y) {
+        lhs = x.clone();
+        rhs = y.clone();
+    }
+
+    //! Returns the left hand side of \p this.
+    public Linear_Expression left_hand_side() {
+        return lhs;
+    }
+
+    //! Returns the right hand side of \p this.
+    public Linear_Expression right_hand_side() {
+        return rhs;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Sum clone() {
+        return new Linear_Expression_Sum(lhs, rhs);
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
new file mode 100644
index 0000000..3cc64f6
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Times.java
@@ -0,0 +1,74 @@
+/* Linear_Expression_Times class definition and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The product of a linear expression and a coefficient.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Times
+    extends Linear_Expression {
+
+    //! The value of the coefficient.
+    protected Coefficient coeff;
+
+    //! The value of the inner linear expression.
+    protected Linear_Expression lin_expr;
+
+    //! Builds an object cloning the input arguments.
+    public Linear_Expression_Times(Coefficient c, Variable v) {
+        coeff = new Coefficient(c);
+        lin_expr = new Linear_Expression_Variable(v);
+    }
+
+    //! Builds an object cloning the input arguments.
+    public Linear_Expression_Times(Coefficient c, Linear_Expression l) {
+        coeff = new Coefficient(c);
+        lin_expr = l.clone();
+    }
+
+    //! Builds an object cloning the input arguments.
+    public Linear_Expression_Times(Linear_Expression l, Coefficient c) {
+        coeff = new Coefficient(c);
+        lin_expr = l.clone();
+    }
+
+    //! Returns the coefficient of \p this.
+    public Coefficient coefficient() {
+        return coeff;
+    }
+
+    //! Returns the linear expression subobject of \p this.
+    public Linear_Expression linear_expression() {
+        return lin_expr;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Times clone() {
+        return new Linear_Expression_Times(coeff, lin_expr);
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
new file mode 100644
index 0000000..dae5a35
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Unary_Minus.java
@@ -0,0 +1,54 @@
+/* Linear_Expression_Unary_Minus class definition and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The negation of a linear expression.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Unary_Minus
+    extends Linear_Expression {
+
+    //! The value that \p this negates.
+    protected Linear_Expression arg;
+
+    //! Builds an object that represents the negation of the copy \p x.
+    public Linear_Expression_Unary_Minus(Linear_Expression x) {
+        arg = x.clone();
+    }
+
+    //! Returns the value that \p this negates.
+    public Linear_Expression argument() {
+        return arg;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Unary_Minus clone() {
+        return new Linear_Expression_Unary_Minus(arg);
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
new file mode 100644
index 0000000..b2afb29
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Linear_Expression_Variable.java
@@ -0,0 +1,57 @@
+/* Linear_Expression_Variable class definition and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A linear expression built from a variable.
+/*! \ingroup PPL_Java_interface */
+public class Linear_Expression_Variable
+extends Linear_Expression {
+
+    protected Variable arg;
+
+    //! Builds the object associated to the copy of \p v.
+    public Linear_Expression_Variable(Variable v) {
+        arg = new Variable(v.id());
+    }
+
+    //! Returns the variable representing the linear expression.
+    public Variable argument() {
+        return arg;
+    }
+
+    //! Builds a copy of this.
+    public Linear_Expression_Variable clone() {
+        return new Linear_Expression_Variable(arg);
+    }
+
+    private long var_id() {
+        return arg.id();
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
+
diff --git a/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
new file mode 100644
index 0000000..3fc2cc1
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Logic_Error_Exception.java
@@ -0,0 +1,37 @@
+/* Logic_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions due to errors in low-level routines.
+/*! \ingroup PPL_Java_interface
+  These exceptions may be generated, for instance, by the inability
+  of querying/controlling the FPU behavior with respect to rounding modes.
+*/
+public class Logic_Error_Exception extends RuntimeException {
+
+    //! Constructor.
+    public Logic_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/MIP_Problem.java b/interfaces/Java/parma_polyhedra_library/MIP_Problem.java
new file mode 100644
index 0000000..13c2159
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/MIP_Problem.java
@@ -0,0 +1,322 @@
+/* MIP_Problem Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_Java_interface
+  An object of this class encodes a mixed integer (linear) programming problem.
+  The MIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the feasible region, by means of a finite set of linear equality
+     and non-strict inequality constraints;
+   - the subset of the unknown variables that range over the integers
+     (the other variables implicitly ranging over the reals);
+   - the objective function, described by a Linear_Expression;
+   - the optimization mode (either maximization or minimization).
+
+  The class provides support for the (incremental) solution of the
+  MIP problem based on variations of the revised simplex method and
+  on branch-and-bound techniques. The result of the resolution
+  process is expressed in terms of an enumeration, encoding the
+  feasibility and the unboundedness of the optimization problem.
+  The class supports simple feasibility tests (i.e., no optimization),
+  as well as the extraction of an optimal (resp., feasible) point,
+  provided the MIP_Problem is optimizable (resp., feasible).
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given MIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of constraints,
+  the change of objective function and the change of optimization mode.
+*/
+public class MIP_Problem extends PPL_Object {
+
+    //! \name Constructors and Destructor
+    /*@{*/
+
+    //! Builds a trivial MIP problem.
+    /*!
+      A trivial MIP problem requires to maximize the objective function
+      \f$0\f$ on a vector space under no constraints at all:
+      the origin of the vector space is an optimal solution.
+
+      \param dim
+      The dimension of the vector space enclosing \p this.
+
+      \exception Length_Error_Exception
+      Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+    */
+    public MIP_Problem(long dim) {
+        build_cpp_object(dim);
+    }
+
+    /*! \brief
+      Builds an MIP problem having space dimension \p dim from the constraint
+      system \p cs, the objective function \p obj and optimization mode
+      \p mode.
+
+      \param dim
+      The dimension of the vector space enclosing \p this.
+
+      \param cs
+      The constraint system defining the feasible region.
+
+      \param obj
+      The objective function.
+
+      \param mode
+      The optimization mode.
+
+      \exception Length_Error_Exception
+      Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+      \exception Invalid_Argument_Exception
+      Thrown if the constraint system contains any strict inequality
+      or if the space dimension of the constraint system (resp., the
+      objective function) is strictly greater than \p dim.
+    */
+    public MIP_Problem(long dim, Constraint_System cs, Linear_Expression obj,
+                       Optimization_Mode mode) {
+        build_cpp_object(dim, cs, obj, mode);
+    }
+
+    //! Builds a copy of \p y.
+    public MIP_Problem(MIP_Problem y) {
+        build_cpp_object(y);
+    }
+
+    /*! \brief
+      Releases all resources managed by \p this,
+      also resetting it to a null reference.
+    */
+    public native void free();
+
+    //! Releases all resources managed by \p this.
+    protected native void finalize();
+
+    /*@}*/ /* Constructors and Destructor */
+
+    //! \name Functions that Do Not Modify the MIP_Problem
+    /*@{*/
+
+    //! Returns the maximum space dimension an MIP_Problem can handle.
+    public native long max_space_dimension();
+
+    //! Returns the space dimension of the MIP problem.
+    public native long space_dimension();
+
+    /*! \brief
+      Returns a set containing all the variables' indexes constrained
+      to be integral.
+    */
+    public native Variables_Set integer_space_dimensions();
+
+    //! Returns the constraints .
+    public native Constraint_System constraints();
+
+    //! Returns the objective function.
+    public native Linear_Expression objective_function();
+
+    //! Returns the optimization mode.
+    public native Optimization_Mode optimization_mode();
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    /*! \brief
+      Returns the total size in bytes of the memory occupied by the
+      underlying C++ object.
+    */
+    public native long total_memory_in_bytes();
+
+    //! Checks if all the invariants are satisfied.
+    public native boolean OK();
+
+    /*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+    //! \name Functions that May Modify the MIP_Problem
+    /*@{*/
+
+    //! Resets \p this to be equal to the trivial MIP problem.
+    /*!
+      The space dimension is reset to \f$0\f$.
+    */
+    public native void clear();
+
+    /*! \brief
+      Adds \p m new space dimensions and embeds the old MIP problem
+      in the new vector space.
+
+      \param m
+      The number of dimensions to add.
+
+      \exception Length_Error_Exception
+      Thrown if adding \p m new space dimensions would cause the
+      vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+      The new space dimensions will be those having the highest indexes
+      in the new MIP problem; they are initially unconstrained.
+    */
+    public native void add_space_dimensions_and_embed(long m);
+
+    /*! \brief
+      Sets the variables whose indexes are in set \p i_vars to be
+      integer space dimensions.
+
+      \exception Invalid_Argument_Exception
+      Thrown if some index in \p i_vars does not correspond to
+      a space dimension in \p this.
+    */
+    public native void add_to_integer_space_dimensions(Variables_Set i_vars);
+
+    /*! \brief
+      Adds a copy of constraint \p c to the MIP problem.
+
+      \exception Invalid_Argument_Exception
+      Thrown if the constraint \p c is a strict inequality or if its space
+      dimension is strictly greater than the space dimension of \p this.
+    */
+    public native void add_constraint(Constraint c);
+
+    /*! \brief
+      Adds a copy of the constraints in \p cs to the MIP problem.
+
+      \exception Invalid_Argument_Exception
+      Thrown if the constraint system \p cs contains any strict inequality
+      or if its space dimension is strictly greater than the space dimension
+      of \p this.
+    */
+    public native void add_constraints(Constraint_System cs);
+
+    //! Sets the objective function to \p obj.
+    /*!
+      \exception Invalid_Argument_Exception
+      Thrown if the space dimension of \p obj is strictly greater than
+      the space dimension of \p this.
+    */
+    public native void set_objective_function(Linear_Expression obj);
+
+    //! Sets the optimization mode to \p mode.
+    public native void set_optimization_mode(Optimization_Mode mode);
+
+    /*@}*/ /* Functions that May Modify the MIP_Problem */
+
+    //! \name Computing the Solution of the MIP_Problem
+    /*@{*/
+
+    //! Checks satisfiability of \p this.
+    /*!
+      \return
+      <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+    */
+    public native boolean is_satisfiable();
+
+    //! Optimizes the MIP problem.
+    /*!
+      \return
+      An MIP_Problem_Status flag indicating the outcome of the optimization
+      attempt (unfeasible, unbounded or optimized problem).
+    */
+    public native MIP_Problem_Status solve();
+
+    /*! \brief
+      Sets \p num and \p den so that \f$\frac{num}{den}\f$ is the result
+      of evaluating the objective function on \p evaluating_point.
+
+      \param evaluating_point
+      The point on which the objective function will be evaluated.
+
+      \param num
+      On exit will contain the numerator of the evaluated value.
+
+      \param den
+      On exit will contain the denominator of the evaluated value.
+
+      \exception Invalid_Argument_Exception
+      Thrown if \p this and \p evaluating_point are dimension-incompatible
+      or if the generator \p evaluating_point is not a point.
+    */
+    public native void evaluate_objective_function(Generator evaluating_point,
+                                                   Coefficient num,
+                                                   Coefficient den);
+
+    //! Returns a feasible point for \p this, if it exists.
+    /*!
+      \exception Domain_Error_Exception
+      Thrown if the MIP problem is not satisfiable.
+    */
+    public native Generator feasible_point();
+
+    //! Returns an optimal point for \p this, if it exists.
+    /*!
+      \exception Domain_Error_Exception
+      Thrown if \p this doesn't not have an optimizing point, i.e.,
+      if the MIP problem is unbounded or not satisfiable.
+    */
+    public native Generator optimizing_point();
+
+    /*! \brief
+      Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+      the solution of the optimization problem.
+
+      \exception Domain_Error_Exception
+      Thrown if \p this doesn't not have an optimizing point, i.e.,
+      if the MIP problem is unbounded or not satisfiable.
+    */
+    public native void optimal_value(Coefficient num, Coefficient den);
+
+    /*@}*/ /* Computing the Solution of the MIP_Problem */
+
+    //! \name Querying/Setting Control Parameters
+    /*@{*/
+
+    /*! \brief
+      Returns the value of control parameter \p name.
+    */
+    public native Control_Parameter_Value
+      get_control_parameter(Control_Parameter_Name name);
+
+    /*! \brief
+      Sets control parameter \p value.
+    */
+    public native void set_control_parameter(Control_Parameter_Value value);
+
+    /*@}*/ /* Querying/Setting Control Parameters */
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(long dim);
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(long dim,
+                                         Constraint_System cs,
+                                         Linear_Expression obj,
+                                         Optimization_Mode mode);
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(MIP_Problem y);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java b/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
new file mode 100644
index 0000000..810d8be
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/MIP_Problem_Status.java
@@ -0,0 +1,40 @@
+/* MIP_Problem_Status enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_Java_interface */
+public enum MIP_Problem_Status {
+    //! The problem is unfeasible.
+    UNFEASIBLE_MIP_PROBLEM,
+    //! The problem is unbounded.
+    UNBOUNDED_MIP_PROBLEM,
+    //! The problem has an optimal solution.
+    OPTIMIZED_MIP_PROBLEM;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Makefile.am b/interfaces/Java/parma_polyhedra_library/Makefile.am
new file mode 100644
index 0000000..90a4801
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Makefile.am
@@ -0,0 +1,309 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+JAVAROOT = ../
+
+required_instantiations_java_sources = \
+ at required_instantiations_java_sources@
+
+required_instantiations_java_cxx_headers = \
+ at required_instantiations_java_cxx_headers@
+
+interface_generator_files = \
+ppl_interface_generator_java_classes_java.m4 \
+ppl_interface_generator_java_classes_java_code.m4
+
+fixed_java_cxx_headers = \
+parma_polyhedra_library.Artificial_Parameter \
+parma_polyhedra_library.Artificial_Parameter_Sequence \
+parma_polyhedra_library.Bounded_Integer_Type_Overflow \
+parma_polyhedra_library.Bounded_Integer_Type_Representation \
+parma_polyhedra_library.Bounded_Integer_Type_Width \
+parma_polyhedra_library.By_Reference \
+parma_polyhedra_library.Coefficient \
+parma_polyhedra_library.Complexity_Class \
+parma_polyhedra_library.Congruence \
+parma_polyhedra_library.Congruence_System \
+parma_polyhedra_library.Constraint \
+parma_polyhedra_library.Constraint_System \
+parma_polyhedra_library.Degenerate_Element \
+parma_polyhedra_library.Generator \
+parma_polyhedra_library.Generator_System \
+parma_polyhedra_library.Generator_Type \
+parma_polyhedra_library.Grid_Generator \
+parma_polyhedra_library.Grid_Generator_System \
+parma_polyhedra_library.Grid_Generator_Type \
+parma_polyhedra_library.IO \
+parma_polyhedra_library.Linear_Expression \
+parma_polyhedra_library.Linear_Expression_Coefficient \
+parma_polyhedra_library.Linear_Expression_Difference \
+parma_polyhedra_library.Linear_Expression_Sum \
+parma_polyhedra_library.Linear_Expression_Times \
+parma_polyhedra_library.Linear_Expression_Unary_Minus \
+parma_polyhedra_library.Linear_Expression_Variable \
+parma_polyhedra_library.MIP_Problem \
+parma_polyhedra_library.MIP_Problem_Status \
+parma_polyhedra_library.Optimization_Mode \
+parma_polyhedra_library.Pair \
+parma_polyhedra_library.Parma_Polyhedra_Library \
+parma_polyhedra_library.Partial_Function \
+parma_polyhedra_library.PIP_Problem \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Name \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Value \
+parma_polyhedra_library.PIP_Problem_Status \
+parma_polyhedra_library.PIP_Decision_Node \
+parma_polyhedra_library.PIP_Solution_Node \
+parma_polyhedra_library.PIP_Tree_Node \
+parma_polyhedra_library.Poly_Con_Relation \
+parma_polyhedra_library.Poly_Gen_Relation \
+parma_polyhedra_library.PPL_Object \
+parma_polyhedra_library.Relation_Symbol \
+parma_polyhedra_library.Termination \
+parma_polyhedra_library.Variable \
+parma_polyhedra_library.Variables_Set
+
+fixed_java_cxx_headers_sources = \
+parma_polyhedra_library_Artificial_Parameter.h \
+parma_polyhedra_library_Artificial_Parameter_Sequence.h \
+parma_polyhedra_library_Bounded_Integer_Type_Overflow.h \
+parma_polyhedra_library_Bounded_Integer_Type_Representation.h \
+parma_polyhedra_library_Bounded_Integer_Type_Width.h \
+parma_polyhedra_library_By_Reference.h \
+parma_polyhedra_library_Coefficient.h \
+parma_polyhedra_library_Complexity_Class.h \
+parma_polyhedra_library_Congruence.h \
+parma_polyhedra_library_Congruence_System.h \
+parma_polyhedra_library_Constraint.h \
+parma_polyhedra_library_Constraint_System.h \
+parma_polyhedra_library_Degenerate_Element.h \
+parma_polyhedra_library_Generator.h \
+parma_polyhedra_library_Generator_System.h \
+parma_polyhedra_library_Generator_Type.h \
+parma_polyhedra_library_Grid_Generator.h \
+parma_polyhedra_library_Grid_Generator_System.h \
+parma_polyhedra_library_Grid_Generator_Type.h \
+parma_polyhedra_library_IO.h \
+parma_polyhedra_library_Linear_Expression.h \
+parma_polyhedra_library_Linear_Expression_Coefficient.h \
+parma_polyhedra_library_Linear_Expression_Difference.h \
+parma_polyhedra_library_Linear_Expression_Sum.h \
+parma_polyhedra_library_Linear_Expression_Times.h \
+parma_polyhedra_library_Linear_Expression_Unary_Minus.h \
+parma_polyhedra_library_Linear_Expression_Variable.h \
+parma_polyhedra_library_MIP_Problem.h \
+parma_polyhedra_library_MIP_Problem_Status.h \
+parma_polyhedra_library_Optimization_Mode.h \
+parma_polyhedra_library_Pair.h \
+parma_polyhedra_library_Parma_Polyhedra_Library.h \
+parma_polyhedra_library_Partial_Function.h \
+parma_polyhedra_library_PIP_Problem.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Name.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Value.h \
+parma_polyhedra_library_PIP_Problem_Status.h \
+parma_polyhedra_library_PIP_Decision_Node.h \
+parma_polyhedra_library_PIP_Solution_Node.h \
+parma_polyhedra_library_PIP_Tree_Node.h \
+parma_polyhedra_library_Poly_Con_Relation.h \
+parma_polyhedra_library_Poly_Gen_Relation.h \
+parma_polyhedra_library_PPL_Object.h \
+parma_polyhedra_library_Relation_Symbol.h \
+parma_polyhedra_library_Termination.h \
+parma_polyhedra_library_Variable.h \
+parma_polyhedra_library_Variables_Set.h
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+fixed_java_sources = \
+$(srcdir)/Artificial_Parameter.java \
+$(srcdir)/Artificial_Parameter_Sequence.java \
+$(srcdir)/Bounded_Integer_Type_Overflow.java \
+$(srcdir)/Bounded_Integer_Type_Representation.java \
+$(srcdir)/Bounded_Integer_Type_Width.java \
+$(srcdir)/By_Reference.java \
+$(srcdir)/Coefficient.java \
+$(srcdir)/Complexity_Class.java \
+$(srcdir)/Congruence.java \
+$(srcdir)/Congruence_System.java \
+$(srcdir)/Constraint.java \
+$(srcdir)/Constraint_System.java \
+$(srcdir)/Control_Parameter_Name.java \
+$(srcdir)/Control_Parameter_Value.java \
+$(srcdir)/Degenerate_Element.java \
+$(srcdir)/Domain_Error_Exception.java \
+$(srcdir)/Generator.java \
+$(srcdir)/Generator_System.java \
+$(srcdir)/Generator_Type.java \
+$(srcdir)/Grid_Generator.java \
+$(srcdir)/Grid_Generator_System.java \
+$(srcdir)/Grid_Generator_Type.java \
+$(srcdir)/Invalid_Argument_Exception.java \
+$(srcdir)/IO.java \
+$(srcdir)/Length_Error_Exception.java \
+$(srcdir)/Linear_Expression.java \
+$(srcdir)/Linear_Expression_Coefficient.java \
+$(srcdir)/Linear_Expression_Difference.java \
+$(srcdir)/Linear_Expression_Sum.java \
+$(srcdir)/Linear_Expression_Times.java \
+$(srcdir)/Linear_Expression_Unary_Minus.java \
+$(srcdir)/Linear_Expression_Variable.java \
+$(srcdir)/Logic_Error_Exception.java \
+$(srcdir)/MIP_Problem.java \
+$(srcdir)/MIP_Problem_Status.java \
+$(srcdir)/Optimization_Mode.java \
+$(srcdir)/Overflow_Error_Exception.java \
+$(srcdir)/Pair.java \
+$(srcdir)/Parma_Polyhedra_Library.java \
+$(srcdir)/Partial_Function.java \
+$(srcdir)/PIP_Problem.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Name.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Value.java \
+$(srcdir)/PIP_Problem_Status.java \
+$(srcdir)/PIP_Decision_Node.java \
+$(srcdir)/PIP_Solution_Node.java \
+$(srcdir)/PIP_Tree_Node.java \
+$(srcdir)/Poly_Con_Relation.java \
+$(srcdir)/Poly_Gen_Relation.java \
+$(srcdir)/PPL_Object.java \
+$(srcdir)/Relation_Symbol.java \
+$(srcdir)/Timeout_Exception.java \
+$(srcdir)/Variable.java \
+$(srcdir)/Variable_Stringifier.java \
+$(srcdir)/Variables_Set.java
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+all_java_sources = \
+$(fixed_java_sources) \
+$(required_instantiations_java_sources) \
+Termination.java
+
+# NOTE: Fake_Class_for_Doxygen.java should be added here.
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(fixed_java_sources) \
+$(srcdir)/Fake_Class_for_Doxygen.java
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+BUILT_SOURCES = \
+java_classes.stamp \
+java_cxx_headers.stamp
+
+java_classes.stamp: $(all_java_sources)
+	$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \
+		$(AM_JAVACFLAGS) $(JAVACFLAGS) \
+		$(all_java_sources)
+	echo timestamp >$@
+
+java_cxx_headers.stamp: java_classes.stamp
+	$(JAVAH) -classpath .. \
+                 $(fixed_java_cxx_headers) \
+                 $(required_instantiations_java_cxx_headers)
+	echo timestamp >$@
+
+source_generation.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_classes_java.m4 \
+			> java_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./java_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./java_blob
+	rm -f java_blob
+	echo timestamp >$@
+
+$(required_instantiations_java_sources): source_generation.stamp
+
+Termination.java: source_generation.stamp
+
+CLEANFILES = \
+$(required_instantiations_java_sources) \
+$(required_instantiations_java_classes) \
+$(required_instantiations_java_cxx_headers_sources) \
+$(fixed_java_cxx_headers_sources) \
+java_classes.stamp \
+java_cxx_headers.stamp \
+source_generation.stamp \
+Termination.java \
+Artificial_Parameter.class \
+Artificial_Parameter_Sequence.class \
+Bounded_Integer_Type_Overflow.class \
+Bounded_Integer_Type_Representation.class \
+Bounded_Integer_Type_Width.class \
+By_Reference.class \
+Coefficient.class \
+Complexity_Class.class \
+Congruence.class \
+Congruence_System.class \
+Constraint.class \
+Constraint_System.class \
+Control_Parameter_Name.class \
+Control_Parameter_Value.class \
+Degenerate_Element.class \
+Domain_Error_Exception.class \
+Generator.class \
+Generator_System.class \
+Generator_Type.class \
+Grid_Generator.class \
+Grid_Generator_System.class \
+Grid_Generator_Type.class \
+Invalid_Argument_Exception.class \
+IO.class \
+Length_Error_Exception.class \
+Linear_Expression.class \
+Linear_Expression_Coefficient.class \
+Linear_Expression_Difference.class \
+Linear_Expression_Sum.class \
+Linear_Expression_Times.class \
+Linear_Expression_Unary_Minus.class \
+Linear_Expression_Variable.class \
+Logic_Error_Exception.class \
+MIP_Problem.class \
+MIP_Problem_Status.class \
+Optimization_Mode.class \
+Overflow_Error_Exception.class \
+Pair.class \
+Parma_Polyhedra_Library.class \
+Partial_Function.class \
+PIP_Problem.class \
+PIP_Problem_Control_Parameter_Name.class \
+PIP_Problem_Control_Parameter_Value.class \
+PIP_Problem_Status.class \
+PIP_Decision_Node.class \
+PIP_Solution_Node.class \
+PIP_Tree_Node.class \
+Poly_Con_Relation.class \
+Poly_Gen_Relation.class \
+PPL_Object.class \
+Relation_Symbol.class \
+Termination.class \
+Timeout_Exception.class \
+Variable.class \
+Variables_Set.class
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Java/parma_polyhedra_library/Makefile.in b/interfaces/Java/parma_polyhedra_library/Makefile.in
new file mode 100644
index 0000000..9e4e596
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Makefile.in
@@ -0,0 +1,836 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/parma_polyhedra_library
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = \
+ at required_instantiations_java_cxx_headers@
+
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = \
+ at required_instantiations_java_sources@
+
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+JAVAROOT = ../
+interface_generator_files = \
+ppl_interface_generator_java_classes_java.m4 \
+ppl_interface_generator_java_classes_java_code.m4
+
+fixed_java_cxx_headers = \
+parma_polyhedra_library.Artificial_Parameter \
+parma_polyhedra_library.Artificial_Parameter_Sequence \
+parma_polyhedra_library.Bounded_Integer_Type_Overflow \
+parma_polyhedra_library.Bounded_Integer_Type_Representation \
+parma_polyhedra_library.Bounded_Integer_Type_Width \
+parma_polyhedra_library.By_Reference \
+parma_polyhedra_library.Coefficient \
+parma_polyhedra_library.Complexity_Class \
+parma_polyhedra_library.Congruence \
+parma_polyhedra_library.Congruence_System \
+parma_polyhedra_library.Constraint \
+parma_polyhedra_library.Constraint_System \
+parma_polyhedra_library.Degenerate_Element \
+parma_polyhedra_library.Generator \
+parma_polyhedra_library.Generator_System \
+parma_polyhedra_library.Generator_Type \
+parma_polyhedra_library.Grid_Generator \
+parma_polyhedra_library.Grid_Generator_System \
+parma_polyhedra_library.Grid_Generator_Type \
+parma_polyhedra_library.IO \
+parma_polyhedra_library.Linear_Expression \
+parma_polyhedra_library.Linear_Expression_Coefficient \
+parma_polyhedra_library.Linear_Expression_Difference \
+parma_polyhedra_library.Linear_Expression_Sum \
+parma_polyhedra_library.Linear_Expression_Times \
+parma_polyhedra_library.Linear_Expression_Unary_Minus \
+parma_polyhedra_library.Linear_Expression_Variable \
+parma_polyhedra_library.MIP_Problem \
+parma_polyhedra_library.MIP_Problem_Status \
+parma_polyhedra_library.Optimization_Mode \
+parma_polyhedra_library.Pair \
+parma_polyhedra_library.Parma_Polyhedra_Library \
+parma_polyhedra_library.Partial_Function \
+parma_polyhedra_library.PIP_Problem \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Name \
+parma_polyhedra_library.PIP_Problem_Control_Parameter_Value \
+parma_polyhedra_library.PIP_Problem_Status \
+parma_polyhedra_library.PIP_Decision_Node \
+parma_polyhedra_library.PIP_Solution_Node \
+parma_polyhedra_library.PIP_Tree_Node \
+parma_polyhedra_library.Poly_Con_Relation \
+parma_polyhedra_library.Poly_Gen_Relation \
+parma_polyhedra_library.PPL_Object \
+parma_polyhedra_library.Relation_Symbol \
+parma_polyhedra_library.Termination \
+parma_polyhedra_library.Variable \
+parma_polyhedra_library.Variables_Set
+
+fixed_java_cxx_headers_sources = \
+parma_polyhedra_library_Artificial_Parameter.h \
+parma_polyhedra_library_Artificial_Parameter_Sequence.h \
+parma_polyhedra_library_Bounded_Integer_Type_Overflow.h \
+parma_polyhedra_library_Bounded_Integer_Type_Representation.h \
+parma_polyhedra_library_Bounded_Integer_Type_Width.h \
+parma_polyhedra_library_By_Reference.h \
+parma_polyhedra_library_Coefficient.h \
+parma_polyhedra_library_Complexity_Class.h \
+parma_polyhedra_library_Congruence.h \
+parma_polyhedra_library_Congruence_System.h \
+parma_polyhedra_library_Constraint.h \
+parma_polyhedra_library_Constraint_System.h \
+parma_polyhedra_library_Degenerate_Element.h \
+parma_polyhedra_library_Generator.h \
+parma_polyhedra_library_Generator_System.h \
+parma_polyhedra_library_Generator_Type.h \
+parma_polyhedra_library_Grid_Generator.h \
+parma_polyhedra_library_Grid_Generator_System.h \
+parma_polyhedra_library_Grid_Generator_Type.h \
+parma_polyhedra_library_IO.h \
+parma_polyhedra_library_Linear_Expression.h \
+parma_polyhedra_library_Linear_Expression_Coefficient.h \
+parma_polyhedra_library_Linear_Expression_Difference.h \
+parma_polyhedra_library_Linear_Expression_Sum.h \
+parma_polyhedra_library_Linear_Expression_Times.h \
+parma_polyhedra_library_Linear_Expression_Unary_Minus.h \
+parma_polyhedra_library_Linear_Expression_Variable.h \
+parma_polyhedra_library_MIP_Problem.h \
+parma_polyhedra_library_MIP_Problem_Status.h \
+parma_polyhedra_library_Optimization_Mode.h \
+parma_polyhedra_library_Pair.h \
+parma_polyhedra_library_Parma_Polyhedra_Library.h \
+parma_polyhedra_library_Partial_Function.h \
+parma_polyhedra_library_PIP_Problem.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Name.h \
+parma_polyhedra_library_PIP_Problem_Control_Parameter_Value.h \
+parma_polyhedra_library_PIP_Problem_Status.h \
+parma_polyhedra_library_PIP_Decision_Node.h \
+parma_polyhedra_library_PIP_Solution_Node.h \
+parma_polyhedra_library_PIP_Tree_Node.h \
+parma_polyhedra_library_Poly_Con_Relation.h \
+parma_polyhedra_library_Poly_Gen_Relation.h \
+parma_polyhedra_library_PPL_Object.h \
+parma_polyhedra_library_Relation_Symbol.h \
+parma_polyhedra_library_Termination.h \
+parma_polyhedra_library_Variable.h \
+parma_polyhedra_library_Variables_Set.h
+
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+fixed_java_sources = \
+$(srcdir)/Artificial_Parameter.java \
+$(srcdir)/Artificial_Parameter_Sequence.java \
+$(srcdir)/Bounded_Integer_Type_Overflow.java \
+$(srcdir)/Bounded_Integer_Type_Representation.java \
+$(srcdir)/Bounded_Integer_Type_Width.java \
+$(srcdir)/By_Reference.java \
+$(srcdir)/Coefficient.java \
+$(srcdir)/Complexity_Class.java \
+$(srcdir)/Congruence.java \
+$(srcdir)/Congruence_System.java \
+$(srcdir)/Constraint.java \
+$(srcdir)/Constraint_System.java \
+$(srcdir)/Control_Parameter_Name.java \
+$(srcdir)/Control_Parameter_Value.java \
+$(srcdir)/Degenerate_Element.java \
+$(srcdir)/Domain_Error_Exception.java \
+$(srcdir)/Generator.java \
+$(srcdir)/Generator_System.java \
+$(srcdir)/Generator_Type.java \
+$(srcdir)/Grid_Generator.java \
+$(srcdir)/Grid_Generator_System.java \
+$(srcdir)/Grid_Generator_Type.java \
+$(srcdir)/Invalid_Argument_Exception.java \
+$(srcdir)/IO.java \
+$(srcdir)/Length_Error_Exception.java \
+$(srcdir)/Linear_Expression.java \
+$(srcdir)/Linear_Expression_Coefficient.java \
+$(srcdir)/Linear_Expression_Difference.java \
+$(srcdir)/Linear_Expression_Sum.java \
+$(srcdir)/Linear_Expression_Times.java \
+$(srcdir)/Linear_Expression_Unary_Minus.java \
+$(srcdir)/Linear_Expression_Variable.java \
+$(srcdir)/Logic_Error_Exception.java \
+$(srcdir)/MIP_Problem.java \
+$(srcdir)/MIP_Problem_Status.java \
+$(srcdir)/Optimization_Mode.java \
+$(srcdir)/Overflow_Error_Exception.java \
+$(srcdir)/Pair.java \
+$(srcdir)/Parma_Polyhedra_Library.java \
+$(srcdir)/Partial_Function.java \
+$(srcdir)/PIP_Problem.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Name.java \
+$(srcdir)/PIP_Problem_Control_Parameter_Value.java \
+$(srcdir)/PIP_Problem_Status.java \
+$(srcdir)/PIP_Decision_Node.java \
+$(srcdir)/PIP_Solution_Node.java \
+$(srcdir)/PIP_Tree_Node.java \
+$(srcdir)/Poly_Con_Relation.java \
+$(srcdir)/Poly_Gen_Relation.java \
+$(srcdir)/PPL_Object.java \
+$(srcdir)/Relation_Symbol.java \
+$(srcdir)/Timeout_Exception.java \
+$(srcdir)/Variable.java \
+$(srcdir)/Variable_Stringifier.java \
+$(srcdir)/Variables_Set.java
+
+
+# NOTE: do _NOT_ add Fake_Class_for_Doxygen.java to this list.
+all_java_sources = \
+$(fixed_java_sources) \
+$(required_instantiations_java_sources) \
+Termination.java
+
+
+# NOTE: Fake_Class_for_Doxygen.java should be added here.
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(fixed_java_sources) \
+$(srcdir)/Fake_Class_for_Doxygen.java
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4
+
+BUILT_SOURCES = \
+java_classes.stamp \
+java_cxx_headers.stamp
+
+CLEANFILES = \
+$(required_instantiations_java_sources) \
+$(required_instantiations_java_classes) \
+$(required_instantiations_java_cxx_headers_sources) \
+$(fixed_java_cxx_headers_sources) \
+java_classes.stamp \
+java_cxx_headers.stamp \
+source_generation.stamp \
+Termination.java \
+Artificial_Parameter.class \
+Artificial_Parameter_Sequence.class \
+Bounded_Integer_Type_Overflow.class \
+Bounded_Integer_Type_Representation.class \
+Bounded_Integer_Type_Width.class \
+By_Reference.class \
+Coefficient.class \
+Complexity_Class.class \
+Congruence.class \
+Congruence_System.class \
+Constraint.class \
+Constraint_System.class \
+Control_Parameter_Name.class \
+Control_Parameter_Value.class \
+Degenerate_Element.class \
+Domain_Error_Exception.class \
+Generator.class \
+Generator_System.class \
+Generator_Type.class \
+Grid_Generator.class \
+Grid_Generator_System.class \
+Grid_Generator_Type.class \
+Invalid_Argument_Exception.class \
+IO.class \
+Length_Error_Exception.class \
+Linear_Expression.class \
+Linear_Expression_Coefficient.class \
+Linear_Expression_Difference.class \
+Linear_Expression_Sum.class \
+Linear_Expression_Times.class \
+Linear_Expression_Unary_Minus.class \
+Linear_Expression_Variable.class \
+Logic_Error_Exception.class \
+MIP_Problem.class \
+MIP_Problem_Status.class \
+Optimization_Mode.class \
+Overflow_Error_Exception.class \
+Pair.class \
+Parma_Polyhedra_Library.class \
+Partial_Function.class \
+PIP_Problem.class \
+PIP_Problem_Control_Parameter_Name.class \
+PIP_Problem_Control_Parameter_Value.class \
+PIP_Problem_Status.class \
+PIP_Decision_Node.class \
+PIP_Solution_Node.class \
+PIP_Tree_Node.class \
+Poly_Con_Relation.class \
+Poly_Gen_Relation.class \
+PPL_Object.class \
+Relation_Symbol.class \
+Termination.class \
+Timeout_Exception.class \
+Variable.class \
+Variables_Set.class
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/parma_polyhedra_library/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Java/parma_polyhedra_library/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile
+installdirs:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+
+java_classes.stamp: $(all_java_sources)
+	$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) \
+		$(AM_JAVACFLAGS) $(JAVACFLAGS) \
+		$(all_java_sources)
+	echo timestamp >$@
+
+java_cxx_headers.stamp: java_classes.stamp
+	$(JAVAH) -classpath .. \
+                 $(fixed_java_cxx_headers) \
+                 $(required_instantiations_java_cxx_headers)
+	echo timestamp >$@
+
+source_generation.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_classes_java.m4 \
+			> java_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./java_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./java_blob
+	rm -f java_blob
+	echo timestamp >$@
+
+$(required_instantiations_java_sources): source_generation.stamp
+
+Termination.java: source_generation.stamp
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java b/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
new file mode 100644
index 0000000..a5ef51f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Optimization_Mode.java
@@ -0,0 +1,38 @@
+/* Optimization_Mode enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible optimization modes.
+/*! \ingroup PPL_Java_interface */
+public enum Optimization_Mode {
+    //! Minimization is requested.
+    MINIMIZATION,
+    //! Maximization is requested.
+    MAXIMIZATION;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java b/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
new file mode 100644
index 0000000..b66bf15
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Overflow_Error_Exception.java
@@ -0,0 +1,36 @@
+/* Overflow_Error_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions due to overflow errors.
+/*! \ingroup PPL_Java_interface
+  These exceptions can be obtained when the library has been configured
+  to use integer coefficients having bounded size.
+*/
+public class Overflow_Error_Exception extends RuntimeException {
+    //! Constructor.
+    public Overflow_Error_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java b/interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java
new file mode 100644
index 0000000..ad6f6c9
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Decision_Node.java
@@ -0,0 +1,35 @@
+/* PIP_Decision_Node Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! An internal node of the PIP solution tree.
+public class PIP_Decision_Node extends PIP_Tree_Node {
+
+    /*! \brief
+      Returns the true branch (if \p branch is true)
+      or the false branch (if \p branch is false) of \p this.
+    */
+    public native PIP_Tree_Node child_node(boolean branch);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem.java
new file mode 100644
index 0000000..9a0df31
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem.java
@@ -0,0 +1,323 @@
+/* PIP_Problem Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A Parametric Integer Programming problem.
+/*! \ingroup PPL_Java_interface
+  An object of this class encodes a parametric integer (linear)
+  programming problem. The PIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the subset of those dimensions of the vector space that are
+     interpreted as integer parameters (the other space dimensions
+     are interpreted as non-parameter integer variables);
+   - a finite set of linear equality and (strict or non-strict)
+     inequality constraints involving variables and/or parameters;
+     these constraints are used to define:
+       - the <EM>feasible region</EM>, if they involve one or more
+         problem variable (and maybe some parameters);
+       - the <EM>initial context</EM>, if they only involve the
+         parameters;
+   - optionally, the so-called <EM>big parameter</EM>,
+     i.e., a problem parameter to be considered arbitrarily big.
+
+  Note that all problem variables and problem parameters are assumed
+  to take non-negative integer values, so that there is no need
+  to specify non-negativity constraints.
+
+  The class provides support for the (incremental) solution of the
+  PIP problem based on variations of the revised simplex method and
+  on Gomory cut generation techniques.
+
+  The solution for a PIP problem is the lexicographic minimum of the
+  integer points of the feasible region, expressed in terms of the
+  parameters. As the problem to be solved only involves non-negative
+  variables and parameters, the problem will always be either unfeasible
+  or optimizable.
+
+  As the feasibility and the solution value of a PIP problem depend on the
+  values of the parameters, the solution is a binary decision tree,
+  dividing the context parameter set into subsets.
+  The tree nodes are of two kinds:
+   - \e Decision nodes.
+     These are internal tree nodes encoding one or more linear tests
+     on the parameters; if all the tests are satisfied, then the solution
+     is the node's \e true child; otherwise, the solution is the node's
+     \e false child;
+   - \e Solution nodes.
+     These are leaf nodes in the tree, encoding the solution of the problem
+     in the current context subset, where each variable is defined in terms
+     of a linear expression of the parameters.
+     Solution nodes also optionally embed a set of parameter constraints:
+     if all these constraints are satisfied, the solution is described by
+     the node, otherwise the problem has no solution.
+
+  It may happen that a decision node has no \e false child. This means
+  that there is no solution if at least one of the corresponding
+  constraints is not satisfied. Decision nodes having two or more linear
+  tests on the parameters cannot have a \e false child. Decision nodes
+  always have a \e true child.
+
+  Both kinds of tree nodes may also contain the definition of extra
+  parameters which are artificially introduced by the solver to enforce
+  an integral solution. Such artificial parameters are defined by
+  the integer division of a linear expression on the parameters
+  by an integer coefficient.
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given PIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of parameters
+  and the addition of constraints.
+*/
+public class PIP_Problem extends PPL_Object {
+
+  //! Builds a trivial PIP problem.
+  /*!
+    A trivial PIP problem requires to compute the lexicographic minimum
+    on a vector space under no constraints and with no parameters:
+    due to the implicit non-negativity constraints, the origin of the
+    vector space is an optimal solution.
+
+    \param dim
+    The dimension of the vector space enclosing \p this
+    (optional argument with default value \f$0\f$).
+
+    \exception Length_Error_Exception
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+    public PIP_Problem(long dim) {
+        build_cpp_object(dim);
+    }
+
+  //! Builds a PIP problem from a sequence of constraints.
+  /*!
+    Builds a PIP problem having space dimension \p dim from the
+    constraint system cs; the dimensions \p vars are interpreted as
+    parameters.
+  */
+   public PIP_Problem(long dim, Constraint_System cs, Variables_Set params) {
+        build_cpp_object(dim, cs, params);
+    }
+
+    //! Builds a copy of \p y.
+    public PIP_Problem(PIP_Problem y) {
+        build_cpp_object(y);
+    }
+
+    /*! \brief
+      Releases all resources managed by \p this,
+      also resetting it to a null reference.
+    */
+    public native void free();
+
+    //! Releases all resources managed by \p this.
+    protected native void finalize();
+
+    /*@}*/ /* Constructors and Destructor */
+
+    //! \name Functions that Do Not Modify the PIP_Problem
+    /*@{*/
+
+    //! Returns the maximum space dimension an PIP_Problem can handle.
+    public native long max_space_dimension();
+
+    //! Returns the space dimension of the PIP problem.
+    public native long space_dimension();
+
+    //! Returns the number of parameter space dimensions of the PIP problem.
+    public native long number_of_parameter_space_dimensions();
+
+    /*! \brief
+      Returns all the parameter space dimensions of problem \p pip.
+    */
+    public native Variables_Set parameter_space_dimensions();
+
+    //! Returns the big parameter dimension of PIP problem \p pip.
+    public native long get_big_parameter_dimension();
+
+    /*! \brief
+      Returns the number of constraints defining the feasible
+      region of \p pip.
+    */
+    public native long number_of_constraints();
+
+    /*! \brief
+      Returns the \p i-th constraint defining the feasible region
+      of the PIP problem \p pip.
+    */
+    public native Constraint constraint_at_index(long dim);
+
+    //! Returns the constraints .
+    public native Constraint_System constraints();
+
+    //! Returns an ascii formatted internal representation of \p this.
+    public native String ascii_dump();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+    /*! \brief
+      Returns the size in bytes of the memory occupied by the
+      underlying C++ object.
+    */
+    public native long total_memory_in_bytes();
+
+    /*! \brief
+      Returns the size in bytes of the memory managed by the
+      underlying C++ object.
+    */
+    public native long external_memory_in_bytes();
+
+    /*! \brief
+      Returns true if the pip problem is well formed, i.e., if it
+      satisfies all its implementation invariants; returns 0 and perhaps
+      makes some noise if broken.  Useful for debugging purposes.
+    */
+    public native boolean OK();
+
+    /*@}*/ /* Functions that Do Not Modify the MIP_Problem */
+
+
+    //! \name Functions that May Modify the PIP_Problem
+    /*@{*/
+
+    //! Resets \p this to be equal to the trivial PIP problem.
+    /*!
+      The space dimension is reset to \f$0\f$.
+    */
+    public native void clear();
+
+
+    /*! \brief
+      Adds <CODE>pip_vars + pip_params</CODE> new space dimensions
+      and embeds the PIP problem in the new vector space.
+
+      \param pip_vars
+      The number of space dimensions to add that are interpreted as
+      PIP problem variables (i.e., non parameters). These are added
+      before adding the \p pip_params parameters.
+
+      \param pip_params
+      The number of space dimensions to add that are interpreted as
+      PIP problem parameters. These are added after having added the
+      \p pip_vars problem variables.
+
+      The new space dimensions will be those having the highest indexes
+      in the new PIP problem; they are initially unconstrained.
+    */
+    public native void add_space_dimensions_and_embed(long pip_vars,
+                                                      long pip_params);
+
+    /*! \brief
+      Sets the space dimensions in \p vars to be parameter dimensions of
+      the PIP problem.
+    */
+    public native void add_to_parameter_space_dimensions(Variables_Set vars);
+
+    /*! \brief
+      Sets the big parameter dimension of PIP problem to \p d.
+    */
+    public native void set_big_parameter_dimension(long d);
+
+    /*! \brief
+      Adds a copy of constraint \p c to the PIP problem.
+
+      \exception Invalid_Argument_Exception
+      Thrown if the constraint \p c is a strict inequality or if its space
+      dimension is strictly greater than the space dimension of \p this.
+    */
+    public native void add_constraint(Constraint c);
+
+    /*! \brief
+      Adds a copy of the constraints in \p cs to the PIP problem.
+
+      \exception Invalid_Argument_Exception
+      Thrown if the constraint system \p cs contains any strict inequality
+      or if its space dimension is strictly greater than the space dimension
+      of \p this.
+    */
+    public native void add_constraints(Constraint_System cs);
+
+    /*@}*/ /* Functions that May Modify the PIP_Problem */
+
+    //! \name Computing the Solution of the PIP_Problem
+    /*@{*/
+
+    //! Checks satisfiability of \p this.
+    /*!
+      \return
+      <CODE>true</CODE> if and only if the PIP problem is satisfiable.
+    */
+    public native boolean is_satisfiable();
+
+    //! Optimizes the PIP problem.
+    /*!
+      Solves the PIP problem, returning an exit status.
+
+      \return
+      <CODE>UNFEASIBLE_PIP_PROBLEM</CODE> if the PIP problem
+      is not satisfiable;
+      <CODE>OPTIMIZED_PIP_PROBLEM</CODE> if the PIP problem
+      admits an optimal solution.
+    */
+    public native PIP_Problem_Status solve();
+
+    //! Returns a solution for the PIP problem, if it exists.
+    public native PIP_Tree_Node solution();
+
+    //! Returns an optimizing solution for the PIP problem, if it exists.
+    public native PIP_Tree_Node optimizing_solution();
+
+    /*@}*/ /* Computing the Solution of the PIP_Problem */
+
+    //! \name Querying/Setting Control Parameters
+    /*@{*/
+
+    /*! \brief
+      Returns the value of control parameter \p name.
+    */
+    public native PIP_Problem_Control_Parameter_Value
+      get_pip_problem_control_parameter
+        (PIP_Problem_Control_Parameter_Name name);
+
+    /*! \brief
+      Sets control parameter \p value.
+    */
+    public native void set_pip_problem_control_parameter
+      (PIP_Problem_Control_Parameter_Value value);
+
+    /*@}*/ /* Querying/Setting Control Parameters */
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(long dim);
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(long dim,
+                                         Constraint_System cs,
+                                         Variables_Set vars);
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object(PIP_Problem y);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Name.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Name.java
new file mode 100644
index 0000000..2a2d2df
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Name.java
@@ -0,0 +1,33 @@
+/* PIP_Problem PIP_Problem_Control_Parameter_Name enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Names of PIP problems' control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum PIP_Problem_Control_Parameter_Name {
+    //! The cutting strategy rule.
+    CUTTING_STRATEGY,
+    //! The pivot row strategy rule.
+    PIVOT_ROW_STRATEGY
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Value.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Value.java
new file mode 100644
index 0000000..44fa3f7
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Control_Parameter_Value.java
@@ -0,0 +1,39 @@
+/* PIP_Problem PIP_Problem_Control_Parameter_Value enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible values for PIP problems' control parameters.
+/*! \ingroup PPL_Java_interface */
+public enum PIP_Problem_Control_Parameter_Value {
+    //! Choose the first non-integer row
+    CUTTING_STRATEGY_FIRST,
+    //! Choose row which generates the deepest cut
+    CUTTING_STRATEGY_DEEPEST,
+    //! Always generate all possible cuts
+    CUTTING_STRATEGY_ALL,
+    //! Choose the first row with negative parameter sign
+    PIVOT_ROW_STRATEGY_FIRST,
+    //! Choose the row which generates the lexico-maximal pivot column
+    PIVOT_ROW_STRATEGY_MAX_COLUMN
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java
new file mode 100644
index 0000000..ae2b022
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Problem_Status.java
@@ -0,0 +1,38 @@
+/* PIP_Problem_Status enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Possible outcomes of the PIP_Problem solver.
+/*! \ingroup PPL_Java_interface */
+public enum PIP_Problem_Status {
+    //! The problem is unsatisfiable.
+    UNFEASIBLE_PIP_PROBLEM,
+    //! The problem has an optimal solution.
+    OPTIMIZED_PIP_PROBLEM;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java b/interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java
new file mode 100644
index 0000000..958cfa2
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Solution_Node.java
@@ -0,0 +1,41 @@
+/* PIP_Solution_Node Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A leaf node of the PIP solution tree.
+public class PIP_Solution_Node extends PIP_Tree_Node {
+
+    /*! \brief
+      Returns the parametric expression of the values of variable
+      \p var in solution node \p this.
+
+      The returned parametric expression will only refer to
+      (problem or artificial) parameters.
+
+      \param var
+      The variable being queried.
+    */
+    public native Linear_Expression parametric_values(Variable var);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java b/interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java
new file mode 100644
index 0000000..1addb94
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PIP_Tree_Node.java
@@ -0,0 +1,79 @@
+/* PIP_Tree_Node Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+package parma_polyhedra_library;
+
+//! A node of the PIP solution tree.
+/*!
+  This is the base class for the nodes of the binary trees representing
+  the solutions of PIP problems. From this one, two classes are derived:
+    - PIP_Decision_Node, for the internal nodes of the tree;
+    - PIP_Solution_Node, for the leaves of the tree.
+*/
+public class PIP_Tree_Node extends PPL_Object {
+
+    /*! \brief
+      Returns the solution node if \p this is a solution node,
+      and 0 otherwise.
+    */
+    public native PIP_Solution_Node as_solution();
+
+    /*! \brief
+      Returns the decision node if \p this is a decision node,
+      and 0 otherwise.
+    */
+    public native PIP_Decision_Node as_decision();
+
+    /*! \brief
+      Returns true if the pip tree is well formed, i.e., if it
+      satisfies all its implementation invariants; returns 0 and perhaps
+      makes some noise if broken.  Useful for debugging purposes.
+    */
+    public native boolean OK();
+
+    /*! \brief
+       Returns the number of artificial parameters in the PIP_Tree_Node.
+    */
+    public native long number_of_artificials();
+
+    /*! \brief
+       Returns the sequence of (Java) artificial parameters
+       in the PIP_Tree_Node.
+    */
+    public native Artificial_Parameter_Sequence artificials();
+
+    /*! \brief
+       Returns the system of parameter constraints controlling the
+       PIP_Tree_Node.
+
+       The indices in the constraints are the same as the original
+       variables and parameters. Coefficients in indices corresponding
+       to variables always are zero.
+    */
+    public native Constraint_System constraints();
+
+    //! Returns a string representation of \p this.
+    public native String toString();
+
+}
diff --git a/interfaces/Java/parma_polyhedra_library/PPL_Object.java b/interfaces/Java/parma_polyhedra_library/PPL_Object.java
new file mode 100644
index 0000000..1aa23e4
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/PPL_Object.java
@@ -0,0 +1,46 @@
+/* PPL_Object Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+/*!
+  \cond Include_Implementation_Details
+  \brief Smart pointer to a PPL, C++ object.
+  \ingroup PPL_Java_interface
+  \endcond
+*/
+public class PPL_Object {
+
+    //! Stores the value of the C++ pointer.
+    long ptr;
+
+    //! Builds an object that points to `null'.
+    protected PPL_Object() {
+        ptr = 0;
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Pair.java b/interfaces/Java/parma_polyhedra_library/Pair.java
new file mode 100644
index 0000000..c3f986f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Pair.java
@@ -0,0 +1,52 @@
+/* Pair Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A pair of values of type K and V.
+/*! \ingroup PPL_Java_interface
+  An object of this class holds an ordered pair of values of type K and V.
+*/
+public class Pair<K, V>  {
+
+    //! Stores an object of type K.
+    private K first;
+
+    //! Stores an object of type V.
+    private V second;
+
+    //! Returns the object of type K.
+    public K getFirst() {
+        return first;
+    }
+
+    //! Returns the object of type V.
+    public V getSecond() {
+        return second;
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java b/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
new file mode 100644
index 0000000..b2b34f0
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Parma_Polyhedra_Library.java
@@ -0,0 +1,327 @@
+/* Parma_Polyhedra_Library Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+  \defgroup PPL_Java_interface Java Language Interface
+
+  The Parma Polyhedra Library comes equipped with an interface for the
+  Java language.
+*/
+
+/*! \mainpage
+  The Parma Polyhedra Library comes equipped with an interface for the
+  Java language.
+  The Java interface provides access to the numerical abstractions
+  (convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+  by the PPL library.
+  A general introduction to the numerical abstractions,
+  their representation in the PPL and the operations provided
+  by the PPL is given in the main \extref{preamble, PPL user manual}.
+  Here we just describe those aspects that are specific to the Java interface.
+  In the sequel, <CODE>prefix</CODE> is the path prefix under which
+  the library has been installed (typically <CODE>/usr</CODE> or
+  <CODE>/usr/local</CODE>).
+
+  <H2>Overview</H2>
+
+  Here is a list of notes with general information and advice
+  on the use of the Java interface.
+
+  - When the Parma Polyhedra Library is configured, it will automatically
+    test for the existence of the Java system (unless configuration options
+    are passed to disable the build of the Java interface;
+    see configuration option <CODE>--enable-interfaces</CODE>).
+    If Java is correctly installed in a standard location, things will be
+    arranged so that the Java interface is built and installed
+    (see configuration option <CODE>--with-java</CODE> if you need to
+    specify a non-standard location for the Java system).
+
+  - The Java interface files are all installed in the directory
+    <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+    dynamically loaded libraries, you must make your dynamic
+    linker/loader aware of this fact.  If you use a GNU/Linux system,
+    try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+    for more information.
+
+  - Any application using the PPL should:
+      - Load the PPL interface library by calling <CODE>System.load</CODE>
+        and passing the full path of the dynamic shared object;
+      - Make sure that only the intended version(s) of the library has
+        been loaded, e.g., by calling static method <CODE>version()</CODE>
+        in class <CODE>parma_polyhedra_library.Parma_Polyhedra_Library</CODE>;
+      - Starting from version 0.11, initialize the interface by calling
+        static method <CODE>initialize_library()</CODE>;
+        when all library work is done, finalize the interface by calling
+        <CODE>finalize_library()</CODE>.
+
+  - The numerical abstract domains available to the Java user as
+    Java classes consist of the <EM>simple</EM> domains,
+    <EM>powersets</EM> of a simple domain and <EM>products</EM>
+    of simple domains. Note that the default configuration will
+    only enable a subset of these domains (if you need a different
+    set of domains, see configuration option
+    <CODE>--enable-instantiations</CODE>).
+    - The simple domains are:
+      - convex polyhedra, which consist of C_Polyhedron and
+        NNC_Polyhedron;<BR>
+      - weakly relational, which consist of BD_Shape_N and
+        Octagonal_Shape_N
+        where N is one of the numeric types
+        signed_char, short, int, long, long_long,
+        mpz_class, mpq_class;<BR>
+      - boxes which consist of
+        Int8_Box, Int16_Box, Int32_Box, Int64_Box,
+        Uint8_Box, Uint16_Box, Uint32_Box, Uint64_Box,
+        Float_Box, Double_Box, Long_Double_Box,
+        Z_Box, Rational_Box; and<BR>
+      - the Grid domain.
+    - The powerset domains are Pointset_Powerset_S where S is
+      a simple domain.
+    - The product domains consist of
+      Direct_Product_S_T,
+      Smash_Product_S_T and
+      Constraints_Product_S_T where S
+      and T are simple domains.
+
+  - In the following, any of the above numerical
+    abstract domains  is called a PPL <EM>domain</EM>
+    and any element of a PPL domain is called a PPL <EM>object</EM>.
+
+  - A Java program can create a new object for a PPL domain by
+    using the constructors for the class corresponding to the domain.
+
+  - For a PPL object with space dimension \p k,
+    the identifiers used for the PPL variables
+    must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+    associated Cartesian axes.
+    For example, when using methods that combine PPL polyhedra
+    or add constraints or generators to a representation of
+    a PPL polyhedron,
+    the polyhedra referenced and any constraints or generators in the call
+    should follow all the (space) dimension-compatibility rules stated in
+    Section \extref{representation, Representations of Convex Polyhedra}
+    of the main PPL user manual.
+
+  - As explained above, a polyhedron has a fixed topology C or NNC,
+    that is determined at the time of its initialization.
+    All subsequent operations on the polyhedron must respect all the
+    topological compatibility rules stated in Section
+    \extref{representation, Representations of Convex Polyhedra}
+    of the main PPL user manual.
+
+  - A <EM>system</EM> of constraints (i.e., an instance of class
+    <CODE>parma_polyhedra_library.Constraint_System</CODE>)
+    is implemented by extending class <CODE>java.util.ArrayList</CODE>
+    (note: <CODE>java.util.Vector</CODE> was used up to version 1.0.)
+    As a consequence, it is possible to iterate over the constraints
+    in the system by using corresponding inherited methods. Similarly,
+    it is possible to modify a system of constraints by using methods
+    such as <CODE>add</CODE>; be warned, however, that the constraint
+    system obtained from a PPL object is a <EM>copy</EM> of the (C++)
+    data structure used in the object itself: any modification will not
+    directly affect the original PPL object; clearly, the modified
+    constraint system can be used with appropriate methods to,
+    e.g., build a new PPL object or modify an existing one.
+    The same observations apply to systems of congruences and
+    systems of (grid) generators.
+
+*/ /* \mainpage */
+
+/*! \brief The PPL Java interface package.
+
+  \ingroup PPL_Java_interface
+  All classes, interfaces and enums related to the Parma Polyhedra Library
+  Java interface are included in this package.
+*/
+package parma_polyhedra_library;
+
+//! A class collecting library-level functions.
+/*! \ingroup PPL_Java_interface */
+public class Parma_Polyhedra_Library {
+
+    //! \name Library initialization and finalization
+    //@{
+
+    /*! \brief
+      Initializes the Parma Polyhedra Library.
+
+      This method must be called after loading the library and
+      before calling any other method from any other PPL package class.
+    */
+    public static native void initialize_library();
+
+    /*! \brief
+      Finalizes the Parma Polyhedra Library.
+
+      This method must be called when work with the library is done.
+      After finalization, no other library method can be called
+      (except those in class Parma_Polyhedra_Library), unless the library
+      is re-initialized by calling <CODE>initialize_library()</CODE>.
+    */
+    public static native void finalize_library();
+
+    //@} // Library initialization and finalization
+
+    //! \name Version Checking
+    //@{
+
+    //! Returns the major number of the PPL version.
+    public static native int version_major();
+
+    //! Returns the minor number of the PPL version.
+    public static native int version_minor();
+
+    //! Returns the revision number of the PPL version.
+    public static native int version_revision();
+
+    //! Returns the beta number of the PPL version.
+    public static native int version_beta();
+
+    //! Returns a string containing the PPL version.
+    public static native String version();
+
+    //! Returns a string containing the PPL banner.
+    /*!
+      The banner provides information about the PPL version, the licensing,
+      the lack of any warranty whatsoever, the C++ compiler used to build
+      the library, where to report bugs and where to look for further
+      information.
+    */
+    public static native String banner();
+
+    //@} // Version Checking
+
+    //! \name Floating-point rounding and precision settings.
+    //@{
+
+    /*! \brief
+      Sets the FPU rounding mode so that the PPL abstractions based on
+      floating point numbers work correctly.
+
+      This is performed automatically at initialization-time.  Calling
+      this function is needed only if restore_pre_PPL_rounding() has been
+      previously called.
+    */
+    public static native void set_rounding_for_PPL();
+
+    /*! \brief
+      Sets the FPU rounding mode as it was before initialization of the PPL.
+
+      After calling this function it is absolutely necessary to call
+      set_rounding_for_PPL() before using any PPL abstractions based on
+      floating point numbers.
+      This is performed automatically at finalization-time.
+    */
+    public static native void restore_pre_PPL_rounding();
+
+    //! Returns the precision parameter for irrational calculations.
+    public static native int irrational_precision();
+
+    //! Sets the precision parameter used for irrational calculations.
+    /*!
+      If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+      precision parameter used for irrational calculations to \p p.
+      Then, in the irrational calculations returning an unbounded rational,
+      (e.g., when computing a square root), the lesser between numerator
+      and denominator will be limited to 2**\p p.
+    */
+    public static native void set_irrational_precision(int p);
+
+    //@} // Floating-point rounding and precision settings.
+
+    //! \name Timeout handling
+    //@{
+
+    /*! \brief
+      Sets the timeout for computations whose completion could require
+      an exponential amount of time.
+
+      \param csecs
+      The number of centiseconds sometimes after which a timeout will occur;
+      it must be strictly greater than zero.
+
+      Computations taking exponential time will be interrupted some time
+      after \p csecs centiseconds have elapsed since the call to
+      the timeout setting function, by throwing a
+      <CODE>Timeout_Exception</CODE> object.
+      Otherwise, if the computation completes without being interrupted,
+      then the timeout should be reset by calling
+      <CODE>reset_timeout()</CODE>.
+    */
+    public static native void set_timeout(int csecs);
+
+    /*! \brief
+      Resets the timeout time so that the computation is not interrupted.
+    */
+    public static native void reset_timeout();
+
+    /*! \brief
+      Sets a threshold for computations whose completion could require
+      an exponential amount of time.
+
+      If \p unscaled_weight has value \f$u\f$ and \p scale has value \f$s\f$,
+      then the (scaled) weight threshold is computed as \f$w = u \cdot 2^s\f$.
+      Computations taking exponential time will be interrupted some time
+      after reaching the complexity threshold \f$w\f$, by throwing a
+      <CODE>Timeout_Exception</CODE> object.
+      Otherwise, if the computation completes without being interrupted,
+      then the deterministic timeout should be reset by calling
+      <CODE>reset_deterministic_timeout()</CODE>.
+
+      \param unscaled_weight
+      The unscaled maximum computational weight; it has to be strictly
+      greater than zero.
+
+      \param scale
+      The scaling factor to be applied to \p unscaled_weight; it has
+      to be non-negative.
+
+      \exception Invalid_Argument_Exception
+      Thrown if the computation of the weight threshold exceeds the
+      maximum allowed value.
+
+      \note
+      This "timeout" checking functionality is said to be \e deterministic
+      because it is not based on actual elapsed time. Its behavior will
+      only depend on (some of the) computations performed in the PPL library
+      and it will be otherwise independent from the computation environment
+      (CPU, operating system, compiler, etc.).
+
+      \warning
+      The weight mechanism is under beta testing. In particular,
+      there is still no clear relation between the weight threshold and
+      the actual computational complexity. As a consequence, client
+      applications should be ready to reconsider the tuning of these
+      weight thresholds when upgrading to newer version of the PPL.
+    */
+    public static native void set_deterministic_timeout(int unscaled_weight,
+                                                        int scale);
+
+    /*! \brief
+      Resets the deterministic timeout so that the computation is not
+      interrupted.
+    */
+    public static native void reset_deterministic_timeout();
+
+    //@} // Timeout handling.
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Partial_Function.java b/interfaces/Java/parma_polyhedra_library/Partial_Function.java
new file mode 100644
index 0000000..c8e926d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Partial_Function.java
@@ -0,0 +1,80 @@
+/* Partial_Function Java interface declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A partial function on space dimension indices.
+/*! \ingroup PPL_Java_interface
+  This class is used in order to specify how space dimensions should
+  be mapped by methods named \c map_space_dimensions.
+*/
+public class Partial_Function extends PPL_Object {
+
+    /*! \brief
+      Builds the empty map.
+    */
+    public Partial_Function() {
+        build_cpp_object();
+    }
+
+    /*! \brief
+      Inserts mapping from \p i to \p j.
+    */
+    public native void insert(long i, long j);
+
+    /*! \brief
+      Returns \c true if and only if the partial function has
+      an empty codomain (i.e., it is always undefined).
+
+      This method will always be called before the other methods
+      of the interface. Moreover, if \c true is returned, then
+      none of the other interface methods will be called.
+    */
+    public native boolean has_empty_codomain();
+
+    /*! \brief
+      Returns the maximum value that belongs to the codomain
+      of the partial function.
+    */
+    public native long max_in_codomain();
+
+    /*! \brief
+      If the partial function is defined on index \p i, returns its value.
+
+      The function returns a negative value if the partial function
+      is not defined on domain value \p i.
+    */
+    public native long maps(long i);
+
+    /*! \brief
+      Releases all resources managed by \p this,
+      also resetting it to a null reference.
+    */
+    public native void free();
+
+    //! Releases all resources managed by \p this.
+    protected native void finalize();
+
+    //! Builds the underlying C++ object.
+    private native void build_cpp_object();
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java b/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
new file mode 100644
index 0000000..e1dc9fd
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Poly_Con_Relation.java
@@ -0,0 +1,93 @@
+/* Poly_Con_Relation Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_Java_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+public class Poly_Con_Relation {
+
+    public static final int NOTHING = 0;
+    public static final int IS_DISJOINT = 1;
+    public static final int STRICTLY_INTERSECTS = 2;
+    public static final int IS_INCLUDED = 4;
+    public static final int SATURATES = 8;
+
+    //! Holds the value of the possible relations.
+    private int mask_value;
+
+    //! Constructs from a integer value.
+    public Poly_Con_Relation(int val) {
+        mask_value = val;
+    }
+
+    //! The assertion that says nothing.
+    public static Poly_Con_Relation nothing() {
+        return new Poly_Con_Relation(Poly_Con_Relation.NOTHING);
+    }
+
+    /*! \brief
+      The polyhedron and the set of points satisfying
+      the constraint are disjoint.
+    */
+    public static Poly_Con_Relation is_disjoint() {
+        return new  Poly_Con_Relation(Poly_Con_Relation.IS_DISJOINT);
+    }
+
+    /*! \brief
+      The polyhedron intersects the set of points satisfying
+      the constraint, but it is not included in it.
+    */
+    public static Poly_Con_Relation strictly_intersects() {
+        return new Poly_Con_Relation(Poly_Con_Relation.STRICTLY_INTERSECTS);
+    }
+
+    /*! \brief
+      The polyhedron is included in the set of points satisfying
+      the constraint.
+    */
+    public static Poly_Con_Relation is_included() {
+        return new Poly_Con_Relation(Poly_Con_Relation.IS_INCLUDED);
+    }
+
+    /*! \brief
+      The polyhedron is included in the set of points saturating
+      the constraint.
+    */
+    public static Poly_Con_Relation saturates() {
+        return new Poly_Con_Relation(Poly_Con_Relation.SATURATES);
+    }
+
+    //! True if and only if \p this implies \p y.
+    public boolean implies(Poly_Con_Relation y) {
+        return (this.mask_value & y.mask_value) ==  y.mask_value;
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java b/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
new file mode 100644
index 0000000..1ae906d
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Poly_Gen_Relation.java
@@ -0,0 +1,63 @@
+/* Poly_Gen_Relation Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+public class Poly_Gen_Relation {
+
+    public static final int NOTHING = 0;
+    public static final int SUBSUMES = 1;
+
+    //! Holds the value of the possible relations.
+    private int mask_value;
+
+    //! Constructs from a integer value.
+    public Poly_Gen_Relation(int val) {
+        mask_value = val;
+    }
+
+    //! The assertion that says nothing.
+    public static Poly_Gen_Relation nothing() {
+        return new Poly_Gen_Relation(Poly_Gen_Relation.NOTHING);
+    }
+
+    //! Adding the generator would not change the polyhedron.
+    public static Poly_Gen_Relation subsumes() {
+        return new  Poly_Gen_Relation(Poly_Gen_Relation.SUBSUMES);
+    }
+
+    //! True if and only if \p this implies \p y.
+    public boolean implies(Poly_Gen_Relation y) {
+        return (this.mask_value & y.mask_value) ==  y.mask_value;
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java b/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
new file mode 100644
index 0000000..f696016
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Relation_Symbol.java
@@ -0,0 +1,46 @@
+/* Relation_Symbol enum declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Relation symbols.
+/*! \ingroup PPL_Java_interface */
+public enum Relation_Symbol {
+    //! Less than.
+    LESS_THAN,
+    //! Less than or equal to.
+    LESS_OR_EQUAL,
+    //! Equal to.
+    EQUAL,
+    //! Greater than or equal to.
+    GREATER_OR_EQUAL,
+    //! Greater than.
+    GREATER_THAN,
+    //! Not equal to.
+    NOT_EQUAL;
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Timeout_Exception.java b/interfaces/Java/parma_polyhedra_library/Timeout_Exception.java
new file mode 100644
index 0000000..a5da527
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Timeout_Exception.java
@@ -0,0 +1,33 @@
+/* Timeout_Exception Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! Exceptions caused by timeout expiring.
+/*! \ingroup PPL_Java_interface */
+public class Timeout_Exception extends RuntimeException {
+    //! Constructor.
+    public Timeout_Exception(String s) {
+        super(s);
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Variable.java b/interfaces/Java/parma_polyhedra_library/Variable.java
new file mode 100644
index 0000000..2ebe8ac
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Variable.java
@@ -0,0 +1,95 @@
+/* Variable Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+import javax.management.RuntimeErrorException;
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_Java_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+*/
+public class Variable implements Comparable<Variable> {
+    //! The index of the Cartesian axis.
+    private long varid;
+
+    //! Builds the variable corresponding to the Cartesian axis of index \p i.
+    /*!
+      \exception RuntimeErrorException
+      Thrown if <CODE>i</CODE> is has negative value.
+    */
+    public Variable(long i) {
+        if (i < 0)
+            throw new
+                RuntimeErrorException(new Error("parma_polyhedra_library.Variable::"
+                                                + "Variable:"
+                                                + " an index variable"
+                                                + " cannot be negative."));
+        varid = i;
+    }
+
+    //! Returns the index of the Cartesian axis associated to \p this.
+    public long id() {
+        return varid;
+    }
+
+    /*! \brief
+      Returns a negative number if \p this is smaller than \p v,
+      a zero if \p this equals \p v, a positive number if \p v
+      is greater than \p v.
+    */
+    public int compareTo(Variable v) {
+        if (varid < v.varid)
+            return -1;
+        else if (varid == v.varid)
+            return 0;
+        else
+            return 1;
+    }
+
+    //! Optional customization provider for \c toString.
+    private static Variable_Stringifier stringifier;
+
+    /*! \brief
+      Sets the variable stringifier object.
+
+      A variable stringifier object provides customization for the
+      \c toString method; if no variable stringifier object is set
+      (or if it is set to a null refeerence value), the PPL default
+      variable output function will be used.
+    */
+    public static native void setStringifier(Variable_Stringifier vs);
+
+    public native String toString();
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java b/interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java
new file mode 100644
index 0000000..5349c98
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Variable_Stringifier.java
@@ -0,0 +1,33 @@
+/* Variable_Stringifier Java interface.
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! An interface for objects converting a Variable id to a string.
+/*! \ingroup PPL_Java_interface
+  If customized variable output is required, the user should implement
+  this interface and pass a corresponding instance to Variable's static
+  method \c setStringifier.
+*/
+public interface Variable_Stringifier {
+    public String stringify(long var_id);
+}
diff --git a/interfaces/Java/parma_polyhedra_library/Variables_Set.java b/interfaces/Java/parma_polyhedra_library/Variables_Set.java
new file mode 100644
index 0000000..8140a1e
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/Variables_Set.java
@@ -0,0 +1,37 @@
+/* Variables_Set Java class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+package parma_polyhedra_library;
+
+//! A java.util.TreeSet of variables' indexes.
+public class Variables_Set extends java.util.TreeSet<Variable>{
+
+    //! Builds the empty set of variable indexes.
+    public Variables_Set() {
+    }
+
+    private static native void initIDs();
+    static {
+        initIDs();
+    }
+}
diff --git a/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4 b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
new file mode 100644
index 0000000..3f7424f
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java.m4
@@ -0,0 +1,169 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the files <CLASS_NAME>.java
+dnl using the code in ppl_interface_generator_java_classes_java_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_java_classes_java_code.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+/* PPL Java interface: Termination definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+public class Termination {`'dnl
+
+m4_divert(-1)
+
+dnl m4_pre_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+m4_define(`m4_this_cplusplus_class', `Parma_Polyhedra_Library::`'m4_cplusplus_class$1')`'dnl
+m4_define(`m4_this_class_kind', `m4_class_kind$1')`'dnl
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'.java << ___END_OF_FILE___
+/* PPL Java interface: m4_this_class definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+  Java class interfacing C++ m4_this_cplusplus_class
+  \ingroup PPL_java_interface
+*/
+public class m4_this_class extends PPL_Object {`'dnl
+m4_ifelse(m4_this_class, Polyhedron,
+  `
+___END_OF_FILE___
+___BEGIN_OF_FILE___ C_Polyhedron.java << ___END_OF_FILE___
+/* PPL Java interface: C_Polyhedron definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+  Java class interfacing C++ Parma_Polyhedra_Library::C_Polyhedron
+  \ingroup PPL_java_interface
+*/
+public class C_Polyhedron extends Polyhedron {
+___END_OF_FILE___
+___BEGIN_OF_FILE___ NNC_Polyhedron.java << ___END_OF_FILE___
+/* PPL Java interface: NNC_Polyhedron definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+  Java class interfacing C++ Parma_Polyhedra_Library::NNC_Polyhedron
+  \ingroup PPL_java_interface
+*/
+public class NNC_Polyhedron extends Polyhedron {
+',
+m4_this_class_kind, Pointset_Powerset,
+`
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'_Iterator.java << ___END_OF_FILE___
+/* PPL Java interface: m4_this_class`'_Iterator definition.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+package parma_polyhedra_library;
+
+/*! \brief
+  Java class interfacing C++ m4_this_cplusplus_class`':: iterator
+  \ingroup PPL_java_interface
+*/
+public class m4_this_class`'_Iterator extends PPL_Object {
+
+  private m4_this_class`'_Iterator() {};
+
+  private native void build_ppl_object(m4_this_class obj);
+')`'dnl
+m4_undefine(`m4_this_class')`'dnl
+m4_undefine(`m4_this_cplusplus_class')`'dnl
+m4_undefine(`m4_this_class_kind')
+')
+
+m4_divert(-1)
+
+dnl m4_post_extra_class_code(Class, CPP_Class, Class_Kind)
+dnl Postfix extra code for each class.
+m4_define(`m4_post_extra_class_code', `dnl
+m4_replace_all_patterns($1, m4_class_build_cpp_object1_code)`'dnl
+m4_replace_all_patterns($1, m4_class_build_cpp_object2_code)`'dnl
+m4_replace_all_patterns($1, m4_class_build_cpp_object3_code)`'dnl
+m4_define(`m4_this_class', `m4_interface_class$1')`'dnl
+m4_define(`m4_this_class_kind', `m4_class_kind$1')
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'.java << ___END_OF_FILE___
+}`'dnl
+m4_ifelse(m4_this_class, Polyhedron,
+  `
+___END_OF_FILE___
+___BEGIN_OF_FILE___ C_Polyhedron.java << ___END_OF_FILE___
+}
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ NNC_Polyhedron.java << ___END_OF_FILE___
+}
+',
+m4_this_class_kind, Pointset_Powerset,
+  `
+___END_OF_FILE___
+___BEGIN_OF_FILE___ m4_this_class`'_Iterator.java << ___END_OF_FILE___
+}`'dnl
+')`'dnl
+m4_undefine(`m4_this_class')`'dnl
+m4_undefine(`m4_this_class_kind')
+')
+
+dnl -----------------------------------------------------------------
+dnl Main calls to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+___END_OF_FILE___
+m4_divert(-1)
+m4_divert
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+}
+___END_OF_FILE___
+m4_divert(-1)
+dnl End of file generation.
diff --git a/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4 b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
new file mode 100644
index 0000000..8bdf04b
--- /dev/null
+++ b/interfaces/Java/parma_polyhedra_library/ppl_interface_generator_java_classes_java_code.m4
@@ -0,0 +1,771 @@
+dnl  -*- java -*-
+m4_divert(-1)
+
+This m4 file contains the code for generating files <CLASS_NAME>.java
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
+
+FIXME: Find a way to avoid having these dummy macros.
+No code is needed for these procedure schemas in the Java interface
+as the tokens argument for widening and extrapolation is optional.
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+
+m4_define(`m4_class_build_cpp_object1_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    private native void build_cpp_object(@!BUILD_REPRESENT at _System cs);
+
+')
+
+m4_define(`m4_class_build_cpp_object2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    private native void build_cpp_object(long num_dimensions,
+                                         Degenerate_Element kind);
+
+')
+
+m4_define(`m4_class_build_cpp_object3_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    private native void build_cpp_object(@FRIEND@ y);
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    private native void build_cpp_object(@FRIEND@ y,
+                                         Complexity_Class complexity);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public @TOPOLOGY@@CLASS@(long num_dimensions,
+			Degenerate_Element kind) {
+	build_cpp_object(num_dimensions, kind);
+    }
+
+    private @TOPOLOGY@@CLASS@() {
+    }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public @TOPOLOGY@@CLASS@(@FRIEND@ y) {
+        build_cpp_object(y);
+    }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public @TOPOLOGY@@CLASS@(@FRIEND@ y, Complexity_Class complexity) {
+        build_cpp_object(y, complexity);
+    }
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public @TOPOLOGY@@CLASS@(@!BUILD_REPRESENT at _System cs) {
+	build_cpp_object(cs);
+    }
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    protected native void finalize();
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public native void free();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public native boolean @UB_EXACT@(@TOPOLOGY@@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void swap(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native long @DIMENSION@();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native @!CLASS_REPRESENT at _System @CLASS_REPRESENT at s();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native @!CLASS_REPRESENT at _System minimized_ at CLASS_REPRESENT@s();
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native Poly_@!A_RELATION_REPRESENT at _Relation relation_with(@!RELATION_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean @HAS_PROPERTY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void @SIMPLIFY@();
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void unconstrain_space_dimension(Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void
+      unconstrain_space_dimensions(Variables_Set vars);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean bounds_from_ at ABOVEBELOW@(Linear_Expression expr);
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean has_ at UPPERLOWER@_bound(Variable var,
+				   Coefficient bound_n, Coefficient bound_d,
+				   By_Reference<Boolean> closed);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean @MAXMIN@(Linear_Expression expr,
+				   Coefficient sup_n, Coefficient sup_d,
+				   By_Reference<Boolean> maximum);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean @MAXMIN@(Linear_Expression expr,
+				   Coefficient sup_n, Coefficient sup_d,
+				   By_Reference<Boolean> maximum,
+				   Generator point);
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean frequency(Linear_Expression expr,
+				    Coefficient freq_n, Coefficient freq_d,
+				    Coefficient val_n, Coefficient val_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean @COMPARISON@(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean equals(@CLASS@ p);
+
+    public boolean equals(Object y) {
+   if (this == y)
+     return true;
+   if (y == null || y.getClass() != this.getClass())
+     return false;
+   return this.equals((@CLASS@) y);
+  }
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native int hashCode();
+
+')
+
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean OK();
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void add_ at CLASS_REPRESENT@(@!CLASS_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void refine_with_ at REFINE_REPRESENT@(@!REFINE_REPRESENT@ c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void add_ at CLASS_REPRESENT@s(@!CLASS_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void refine_with_ at REFINE_REPRESENT@s(@!REFINE_REPRESENT at _System c);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void @BINOP@(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+    public native void positive_time_elapse_assign(@TOPOLOGY@@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native boolean simplify_using_context_assign(@CLASS@ p);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void @AFFIMAGE@(Variable var, Linear_Expression expr,
+				    Coefficient denominator);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void bounded_ at AFFIMAGE@(Variable var,
+					    Linear_Expression lb_expr,
+					    Linear_Expression ub_expr,
+					    Coefficient denominator);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void generalized_ at AFFIMAGE@(Variable var,
+				Relation_Symbol relsym,
+				Linear_Expression expr,
+				Coefficient denominator);
+
+')
+
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void generalized_ at AFFIMAGE@(Linear_Expression lhs,
+				Relation_Symbol relsym,
+				Linear_Expression rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void
+    @EXTRAPOLATION at _extrapolation_assign(@TOPOLOGY@@CLASS@ arg,
+                                By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void
+    @EXTRAPOLATION at _narrowing_assign(@TOPOLOGY@@CLASS@ arg);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void generalized_ at AFFIMAGE@_with_congruence(Variable var,
+				Relation_Symbol relsym,
+				Linear_Expression expr,
+				Coefficient denominator,
+				Coefficient modulus);
+
+')
+
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(Linear_Expression lhs,
+				Relation_Symbol relsym,
+				Linear_Expression rhs,
+				Coefficient modulus);
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void wrap_assign(Variables_Set vars,
+				   Bounded_Integer_Type_Width w,
+				   Bounded_Integer_Type_Representation r,
+                                   Bounded_Integer_Type_Overflow o,
+                                   Constraint_System cs,
+                                   long complexity_threshold,
+                                   boolean wrap_individually);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+public native void @WIDEN at _widening_assign(@CLASS@ y,
+                                By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+public native void widening_assign(@CLASS@ y,
+                                By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native
+	void @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(@CLASS@ y,
+						 @!CONSTRAINER at _System cs,
+						 By_Reference<Integer> tp);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native
+	void BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(@CLASS@ y,
+						 Integer d);
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void
+    BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(@CLASS@ y);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void add_space_dimensions_ at EMBEDPROJECT@(long m);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void remove_space_dimensions(Variables_Set vars);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void remove_higher_space_dimensions(long new_dimension);
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void expand_space_dimension(Variable var, long m);
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void fold_space_dimensions(Variables_Set vars,
+					     Variable dest);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void drop_some_non_integer_points
+      (Complexity_Class complexity);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void drop_some_non_integer_points
+      (Variables_Set vars, Complexity_Class complexity);
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native void map_space_dimensions(Partial_Function pfunc);
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native String toString();
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+    public @CLASS at _Iterator(@CLASS at _Iterator y) {
+        build_cpp_object(y);
+    }
+
+    private native void
+        build_cpp_object(@CLASS at _Iterator y);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native @CLASS at _Iterator @BEGINEND at _iterator();
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+    public native void free();
+
+    protected native void finalize();
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+  public native @DISJUNCT_TOPOLOGY@@DISJUNCT@ get_disjunct();
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+  public native void drop_disjunct(@CLASS at _Iterator itr);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+  public native void drop_disjuncts(@CLASS at _Iterator itr1,
+                                    @CLASS at _Iterator itr2);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+  public native void add_disjunct(@DISJUNCT_TOPOLOGY@@DISJUNCT@ j_disj);
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+  public native boolean equals(@CLASS at _Iterator itr);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at _Iterator.java << ___END_OF_FILE___
+  public native void @A_INCDEC@();
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+  public native long @MEMBYTES@();
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+  public native boolean constrains(Variable var);
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+    public native String ascii_dump();
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @TOPOLOGY@@CLASS at .java << ___END_OF_FILE___
+
+  public static native
+    Pair <@TOPOLOGY@@CLASS@|COMMA| Pointset_Powerset_NNC_Polyhedron >
+      linear_ at PARTITION@(@TOPOLOGY@@CLASS@ p, @TOPOLOGY@@CLASS@ q);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ @CLASS at .java << ___END_OF_FILE___
+
+  public static native Pair <@CLASS@|COMMA| Pointset_Powerset_Grid >
+      approximate_ at PARTITION@(@CLASS@ p,
+                            @CLASS@ q,
+                            By_Reference<Boolean> finite);
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native boolean
+      termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(@TOPOLOGY@@CLASS@ p);
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native boolean
+      termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+        (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after);
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native boolean
+      one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+        (@TOPOLOGY@@CLASS@ p, Generator g);
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native boolean
+      one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+        (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after, Generator g);
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native void
+      all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+        (@TOPOLOGY@@CLASS@ p, Polyhedron ph);
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native void
+      all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+        (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after, Polyhedron ph);
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native void
+      all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+        (@TOPOLOGY@@CLASS@ p, Polyhedron ph_decreasing, Polyhedron ph_bounded);
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ Termination.java << ___END_OF_FILE___
+    public static native void
+      all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+        (@TOPOLOGY@@CLASS@ p_before, @TOPOLOGY@@CLASS@ p_after,
+         Polyhedron ph_decreasing, Polyhedron ph_bounded);
+')
diff --git a/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4 b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
new file mode 100644
index 0000000..a05b5ae
--- /dev/null
+++ b/interfaces/Java/ppl_interface_generator_java_procedure_generators.m4
@@ -0,0 +1,55 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of methods
+dnl for the Java interface; this includes:
+dnl - the list in the imported file and any Java specific methods.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl m4_procedure_list
+dnl This class extends the m4_common_procedure_list
+dnl and all procedures common to the all the interfaces should go there.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_procedure_list',
+`m4_echo_unquoted(`m4_common_procedure_list',
+ppl_free_ at CLASS@/1 +all,
+ppl_ at CLASS@_hashcode/2 +all,
+ppl_ at CLASS@_string/1 +all,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/1 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@/3 +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2/4 +simple,)dnl
+')
diff --git a/interfaces/Java/tests/C_Polyhedron_test1.java b/interfaces/Java/tests/C_Polyhedron_test1.java
new file mode 100644
index 0000000..a55840d
--- /dev/null
+++ b/interfaces/Java/tests/C_Polyhedron_test1.java
@@ -0,0 +1,137 @@
+/* Test C_Polyhedron Java test class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class C_Polyhedron_test1 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    // This code tests the method `map_space_dimension(pfunc)'.
+    public static boolean test01() {
+        Partial_Function partial_function = new Partial_Function();
+        partial_function.insert(0, 2);
+        partial_function.insert(2, 0);
+        partial_function.insert(1, 1);
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Variable C = new Variable(2);
+        Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+        Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Linear_Expression_Sum le_a_plus_b
+            = new Linear_Expression_Sum(le_a, le_b);
+        Linear_Expression_Sum le_a_plus_c
+            = new Linear_Expression_Sum(le_a, le_c);
+        Linear_Expression_Sum le_c_plus_b
+            = new Linear_Expression_Sum(le_c, le_b);
+        Linear_Expression_Sum le_c_plus_a
+            = new Linear_Expression_Sum(le_c, le_a);
+        Linear_Expression_Coefficient le_two
+            = new Linear_Expression_Coefficient(new Coefficient(2));
+        Linear_Expression_Times le_2c
+            = new Linear_Expression_Times(le_c, new Coefficient(2));
+        Linear_Expression_Times le_2a
+            = new Linear_Expression_Times(le_a, new Coefficient(2));
+
+        Generator_System gs = new Generator_System();
+        gs.add(Generator.point(le_2c, new Coefficient(1)));
+        gs.add(Generator.line(le_a_plus_b));
+        gs.add(Generator.ray(le_a_plus_c));
+
+        C_Polyhedron poly1 = new C_Polyhedron(gs);
+        poly1.map_space_dimensions(partial_function);
+
+        Generator_System known_gs = new Generator_System();
+        known_gs.add(Generator.point(le_2a, new Coefficient(1)));
+        known_gs.add(Generator.line(le_c_plus_b));
+        known_gs.add(Generator.ray(le_c_plus_a));
+
+        C_Polyhedron known_result = new C_Polyhedron(known_gs);
+        return known_result.equals(poly1);
+    }
+
+
+    public static boolean test02() {
+        // Test if `minimized_constraints' returns an empty Constraint_System
+        // if the Polyhedron is built from universe with a dimension greater
+        // than zero.
+        Variable X = new Variable(0);
+        Variable Y = new Variable(1);
+        Variable Z = new Variable(2);
+        C_Polyhedron ph = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+        Constraint_System cs = ph.minimized_constraints();
+        return cs.isEmpty();
+    }
+
+    public static boolean test03() {
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Generator_System gs = new Generator_System();
+        gs.add(Generator.point(new Linear_Expression_Variable(A),
+                               new Coefficient(2)));
+        gs.add(Generator.point(new Linear_Expression_Variable(B),
+                               new Coefficient(2)));
+        C_Polyhedron ph = new C_Polyhedron(gs);
+        Variables_Set var_set = new Variables_Set();
+        var_set.add(B);
+        ph.drop_some_non_integer_points(var_set,
+                                        Complexity_Class.ANY_COMPLEXITY);
+        Generator_System gs_out = ph.minimized_generators();
+        boolean ok = (gs_out.size() == 1);
+        ph.drop_some_non_integer_points(Complexity_Class.ANY_COMPLEXITY);
+        gs_out = ph.minimized_generators();
+        ok = ok && gs_out.isEmpty();
+        return ok;
+    }
+
+    public static boolean test04() {
+        Coefficient freq_n = new Coefficient(0);
+        Coefficient freq_d = new Coefficient(0);
+        Coefficient val_n = new Coefficient(0);
+        Coefficient val_d = new Coefficient(0);
+        Linear_Expression le
+            = new Linear_Expression_Coefficient(new Coefficient(0));
+        C_Polyhedron ph = new C_Polyhedron(0, Degenerate_Element.UNIVERSE);
+        return ph.frequency(le, freq_n, freq_d, val_n, val_d);
+    }
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(C_Polyhedron_test1.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+}
diff --git a/interfaces/Java/tests/Custom_Variable_Stringifier.java b/interfaces/Java/tests/Custom_Variable_Stringifier.java
new file mode 100644
index 0000000..899107c
--- /dev/null
+++ b/interfaces/Java/tests/Custom_Variable_Stringifier.java
@@ -0,0 +1,29 @@
+/* A class providing customized variable output for Java.
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Custom_Variable_Stringifier implements Variable_Stringifier {
+    public String stringify(long var_id) {
+        return "Var_" + var_id;
+    }
+}
diff --git a/interfaces/Java/tests/MIP_Problem_test1.java b/interfaces/Java/tests/MIP_Problem_test1.java
new file mode 100644
index 0000000..23019be
--- /dev/null
+++ b/interfaces/Java/tests/MIP_Problem_test1.java
@@ -0,0 +1,274 @@
+/* Test MIP_Problem Java test class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class MIP_Problem_test1 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    // This code tests the MIP_Problem methods.
+    public static boolean test01() {
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Variable C = new Variable(2);
+        Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+        Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_3 = new Coefficient(3);
+        Coefficient coeff_5 = new Coefficient(5);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+        Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+
+        // Constraint declarations.
+        Constraint c_a_geq_1
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_a_leq_5
+          = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+        Constraint c_b_geq_3
+          = new Constraint(le_b, Relation_Symbol.GREATER_OR_EQUAL, le_3);
+        Constraint constraint1 = c_a_geq_1;
+        Constraint constraint2 = c_b_geq_3;
+        Constraint_System constraints1 = new Constraint_System();
+        constraints1.add(constraint1);
+        C_Polyhedron ph1 = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+        ph1.add_constraints(constraints1);
+        C_Polyhedron ph2 = new C_Polyhedron(4, Degenerate_Element.UNIVERSE);
+        ph2.add_constraints(constraints1);
+        ph2.add_constraint(constraint2);
+
+        MIP_Problem mip1
+          = new MIP_Problem(3, constraints1, le_a,
+                           Optimization_Mode.MAXIMIZATION);
+        Constraint_System mip1_constraints = mip1.constraints();
+        long mip1_dim = mip1.space_dimension();
+        Linear_Expression mip1_obj = mip1.objective_function();
+        Optimization_Mode mip1_opt = mip1.optimization_mode();
+
+        MIP_Problem mip2 = new MIP_Problem(mip1_dim);
+        mip2.add_constraints(mip1_constraints);
+        mip2.set_objective_function(mip1_obj);
+        mip2.set_optimization_mode(mip1_opt);
+
+        boolean ok = (mip2.space_dimension() == 3)
+           && (mip2.optimization_mode() == Optimization_Mode.MAXIMIZATION);
+        C_Polyhedron mip2_ph = new C_Polyhedron(3,
+                                                Degenerate_Element.UNIVERSE);
+        mip2_ph.add_constraints(mip1_constraints);
+        ok = ok && new Boolean(mip2_ph.equals(ph1));
+        if (!ok)
+          return false;
+
+        MIP_Problem mip3 = new MIP_Problem(3);
+        mip3.add_constraints(constraints1);
+        mip3.add_space_dimensions_and_embed(1);
+        mip3.set_objective_function(le_b);
+        mip3.add_constraint(constraint2);
+        mip3.set_optimization_mode(Optimization_Mode.MINIMIZATION);
+        ok = ok && (mip3.space_dimension() == 4)
+           && (mip3.optimization_mode() == Optimization_Mode.MINIMIZATION);
+        Constraint_System mip3_constraints = mip3.constraints();
+        C_Polyhedron mip3_ph = new C_Polyhedron(4,
+                                                Degenerate_Element.UNIVERSE);
+        mip3_ph.add_constraints(mip3_constraints);
+        ok = ok && mip3_ph.equals(ph2);
+
+        return ok;
+    }
+
+    // This code tests more MIP_Problem methods.
+    public static boolean test02() {
+        Variable A = new Variable(0);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Coefficient coeff_0 = new Coefficient(0);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_5 = new Coefficient(5);
+        Coefficient coeff_8 = new Coefficient(8);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+        Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+
+        // Constraint declarations.
+        Constraint c_a_geq_1
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_a_leq_5
+          = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+        Constraint c_a_eq_8
+          = new Constraint(le_a, Relation_Symbol.EQUAL, le_8);
+        Constraint constraint1 = c_a_geq_1;
+        Constraint_System constraints1 = new Constraint_System();
+        constraints1.add(constraint1);
+
+        Variables_Set var_set_A = new Variables_Set();
+        var_set_A.add(A);
+
+        MIP_Problem mip1
+          = new MIP_Problem(1, constraints1, le_a,
+                           Optimization_Mode.MAXIMIZATION);
+        Constraint_System mip1_constraints = mip1.constraints();
+        long mip1_dim = mip1.space_dimension();
+        Linear_Expression mip1_obj = mip1.objective_function();
+        Optimization_Mode mip1_opt = mip1.optimization_mode();
+
+        Variables_Set var_set = mip1.integer_space_dimensions();
+        boolean ok = var_set.isEmpty();
+        mip1.add_to_integer_space_dimensions(var_set_A);
+        Variables_Set var_set1 = mip1.integer_space_dimensions();
+        ok = ok && (var_set1.contains(A));
+        if (!ok)
+          return false;
+
+        ok = mip1.is_satisfiable();
+        if (!ok)
+          return false;
+
+        MIP_Problem_Status mip1_status;
+        mip1_status = mip1.solve();
+        ok = ok && (mip1_status == MIP_Problem_Status.UNBOUNDED_MIP_PROBLEM);
+
+        MIP_Problem_Status mip2_status;
+        mip1.add_constraint(c_a_leq_5);
+        mip2_status = mip1.solve();
+        ok = ok && (mip2_status == MIP_Problem_Status.OPTIMIZED_MIP_PROBLEM);
+        if (!ok)
+          return false;
+
+        MIP_Problem mip3
+          = new MIP_Problem(1, constraints1, le_a,
+                           Optimization_Mode.MAXIMIZATION);
+        MIP_Problem_Status mip3_status;
+        mip3.add_constraint(c_a_leq_5);
+        mip3.add_constraint(c_a_eq_8);
+
+        Constraint_System cs = mip3.constraints();
+        mip3_status = mip3.solve();
+        ok = !mip3.is_satisfiable();
+        ok = ok && (mip3_status == MIP_Problem_Status.UNFEASIBLE_MIP_PROBLEM);
+        if (!ok)
+          return false;
+
+        Generator g1 = Generator.point(le_a, coeff_1);
+        Coefficient num = coeff_1;
+        Coefficient den = coeff_1;
+        mip1.evaluate_objective_function(g1, num, den);
+        ok = (num == coeff_1 && den == coeff_1);
+        if (!ok)
+          return false;
+
+        Linear_Expression le_5a = le_a.times(coeff_5);
+
+        Generator f_point = mip1.feasible_point();
+        C_Polyhedron f_ph = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+        f_ph.add_generator(f_point);
+        Generator expected_f_point = Generator.point(le_5a, coeff_1);
+        C_Polyhedron expected_f_ph
+          = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+        expected_f_ph.add_generator(expected_f_point);
+        ok = f_ph.equals(expected_f_ph);
+
+        Generator o_point = mip1.optimizing_point();
+        C_Polyhedron o_ph = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+        o_ph.add_generator(o_point);
+        Generator expected_o_point = Generator.point(le_5a, coeff_1);
+        C_Polyhedron expected_o_ph
+          = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+        expected_o_ph.add_generator(expected_o_point);
+        ok = o_ph.equals(expected_o_ph);
+
+        Coefficient ov_num = new Coefficient(0);
+        Coefficient ov_den = new Coefficient(0);
+        mip1.optimal_value(ov_num, ov_den);
+        Linear_Expression le_ov_num
+          = new Linear_Expression_Coefficient(ov_num);
+        Linear_Expression le_ov_den
+          = new Linear_Expression_Coefficient(ov_den);
+        // ok = (le_ov_num == le_5 && le_ov_den == le_1);
+        C_Polyhedron ov_ph
+          = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+        Constraint c_a_leq_ov_num
+          = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_ov_num);
+        Constraint c_a_geq_ov_num
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_ov_den);
+        ov_ph.add_constraint(c_a_leq_ov_num);
+        C_Polyhedron expected_ov_ph
+          = new C_Polyhedron(1, Degenerate_Element.EMPTY);
+        expected_ov_ph.add_constraint(c_a_leq_5);
+        expected_ov_ph.add_constraint(c_a_geq_1);
+        ok = (ov_ph.equals(expected_ov_ph));
+
+        PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+        PPL_Test.println_if_noisy(IO.wrap_string(mip1.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+
+        PPL_Test.print_if_noisy("Testing max_space_dimension(): ");
+        long max_space_dim = mip1.max_space_dimension();
+        PPL_Test.println_if_noisy(max_space_dim);
+
+        Control_Parameter_Value cp_value
+          = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+        mip1.set_control_parameter(
+          Control_Parameter_Value.PRICING_STEEPEST_EDGE_FLOAT);
+        Control_Parameter_Value cp_value1
+          = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+        ok = ok
+          && (cp_value1
+                == Control_Parameter_Value.PRICING_STEEPEST_EDGE_FLOAT);
+        mip1.set_control_parameter(
+          Control_Parameter_Value.PRICING_STEEPEST_EDGE_EXACT);
+        Control_Parameter_Value cp_value2
+          = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+        ok = ok
+          && (cp_value2
+                == Control_Parameter_Value.PRICING_STEEPEST_EDGE_EXACT);
+        mip1.set_control_parameter(
+          Control_Parameter_Value.PRICING_TEXTBOOK);
+        Control_Parameter_Value cp_value3
+          = mip1.get_control_parameter(Control_Parameter_Name.PRICING);
+        ok = ok
+          && (cp_value3
+                == Control_Parameter_Value.PRICING_TEXTBOOK);
+
+        return ok && mip1.OK();
+    }
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(MIP_Problem_test1.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+}
diff --git a/interfaces/Java/tests/Makefile.am b/interfaces/Java/tests/Makefile.am
new file mode 100644
index 0000000..990b0ed
--- /dev/null
+++ b/interfaces/Java/tests/Makefile.am
@@ -0,0 +1,103 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+JAVAROOT = .
+
+interface_generator_files = \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+ppl_java_tests_common
+
+# Even if the Java sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake Java build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+MIP_Problem_test1.java \
+PIP_Problem_test1.java \
+Parma_Polyhedra_Library_test1.java \
+Parma_Polyhedra_Library_test2.java \
+PPL_Test.java \
+ppl_java_tests_common \
+Custom_Variable_Stringifier.java \
+Variable_Output_test1.java
+
+if ENABLE_SHARED
+
+check_JAVA = \
+ppl_java_generated_tests.java \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+MIP_Problem_test1.java \
+PIP_Problem_test1.java \
+Parma_Polyhedra_Library_test1.java \
+Parma_Polyhedra_Library_test2.java \
+Custom_Variable_Stringifier.java \
+Variable_Output_test1.java \
+PPL_Test.java
+
+CLASSPATH = ../ppl_java.jar:.
+JAVACFLAGS = -classpath $(CLASSPATH)
+
+PPL_DLOPEN = -dlopen ../../../src/libppl.la
+
+java_test_environment = \
+$(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(PWL_DLOPEN) \
+	$(JAVA) -classpath .:../ppl_java.jar \
+		-Djava.library.path=../jni/.libs
+
+ppl_java_generated_tests.java: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_java_test_java.m4 \
+			> $@
+
+check-local: ppl_java_generated_tests.java
+	$(java_test_environment) ppl_java_generated_tests
+	$(java_test_environment) C_Polyhedron_test1
+	$(java_test_environment) NNC_Polyhedron_test1
+	$(java_test_environment) MIP_Problem_test1
+	$(java_test_environment) PIP_Problem_test1
+	$(java_test_environment) Parma_Polyhedra_Library_test1
+	$(java_test_environment) Parma_Polyhedra_Library_test2
+	$(java_test_environment) Variable_Output_test1
+
+CLEANFILES = \
+ppl_java_generated_tests.java
+
+endif ENABLE_SHARED
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Java/tests/Makefile.in b/interfaces/Java/tests/Makefile.in
new file mode 100644
index 0000000..2303224
--- /dev/null
+++ b/interfaces/Java/tests/Makefile.in
@@ -0,0 +1,640 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Java/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+CLASSPATH_ENV = CLASSPATH=$(JAVAROOT):$(srcdir)/$(JAVAROOT)$${CLASSPATH:+":$$CLASSPATH"}
+am__java_sources = $(check_JAVA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+JAVAROOT = .
+interface_generator_files = \
+ppl_interface_generator_java_test_java.m4 \
+ppl_interface_generator_java_test_java_code.m4
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_java_procedure_generators.m4 \
+ppl_java_tests_common
+
+
+# Even if the Java sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake Java build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+Test_Executor.java \
+C_Polyhedron_test1.java \
+NNC_Polyhedron_test1.java \
+MIP_Problem_test1.java \
+PIP_Problem_test1.java \
+Parma_Polyhedra_Library_test1.java \
+Parma_Polyhedra_Library_test2.java \
+PPL_Test.java \
+ppl_java_tests_common \
+Custom_Variable_Stringifier.java \
+Variable_Output_test1.java
+
+ at ENABLE_SHARED_TRUE@check_JAVA = \
+ at ENABLE_SHARED_TRUE@ppl_java_generated_tests.java \
+ at ENABLE_SHARED_TRUE@Test_Executor.java \
+ at ENABLE_SHARED_TRUE@C_Polyhedron_test1.java \
+ at ENABLE_SHARED_TRUE@NNC_Polyhedron_test1.java \
+ at ENABLE_SHARED_TRUE@MIP_Problem_test1.java \
+ at ENABLE_SHARED_TRUE@PIP_Problem_test1.java \
+ at ENABLE_SHARED_TRUE@Parma_Polyhedra_Library_test1.java \
+ at ENABLE_SHARED_TRUE@Parma_Polyhedra_Library_test2.java \
+ at ENABLE_SHARED_TRUE@Custom_Variable_Stringifier.java \
+ at ENABLE_SHARED_TRUE@Variable_Output_test1.java \
+ at ENABLE_SHARED_TRUE@PPL_Test.java
+
+ at ENABLE_SHARED_TRUE@CLASSPATH = ../ppl_java.jar:.
+ at ENABLE_SHARED_TRUE@JAVACFLAGS = -classpath $(CLASSPATH)
+ at ENABLE_SHARED_TRUE@PPL_DLOPEN = -dlopen ../../../src/libppl.la
+ at ENABLE_SHARED_TRUE@java_test_environment = \
+ at ENABLE_SHARED_TRUE@$(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(PWL_DLOPEN) \
+ at ENABLE_SHARED_TRUE@	$(JAVA) -classpath .:../ppl_java.jar \
+ at ENABLE_SHARED_TRUE@		-Djava.library.path=../jni/.libs
+
+ at ENABLE_SHARED_TRUE@CLEANFILES = \
+ at ENABLE_SHARED_TRUE@ppl_java_generated_tests.java
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Java/tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Java/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+classcheck.stamp: $(am__java_sources)
+	@list1='$?'; list2=; if test -n "$$list1"; then \
+	  for p in $$list1; do \
+	    if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	    list2="$$list2 $$d$$p"; \
+	  done; \
+	  echo '$(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) '"$$list2"; \
+	  $(CLASSPATH_ENV) $(JAVAC) -d $(JAVAROOT) $(AM_JAVACFLAGS) $(JAVACFLAGS) $$list2; \
+	else :; fi
+	echo timestamp > $@
+
+clean-checkJAVA:
+	-rm -f *.class classcheck.stamp
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_JAVA) classcheck.stamp
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkJAVA clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-am check-local clean clean-checkJAVA \
+	clean-generic clean-libtool cscopelist-am ctags-am distclean \
+	distclean-generic distclean-libtool distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+	uninstall-am
+
+
+ at ENABLE_SHARED_TRUE@ppl_java_generated_tests.java: $(interface_generator_dependencies)
+ at ENABLE_SHARED_TRUE@	$(M4) --prefix-builtin -I../.. \
+ at ENABLE_SHARED_TRUE@		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at ENABLE_SHARED_TRUE@		$(srcdir)/ppl_interface_generator_java_test_java.m4 \
+ at ENABLE_SHARED_TRUE@			> $@
+
+ at ENABLE_SHARED_TRUE@check-local: ppl_java_generated_tests.java
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) ppl_java_generated_tests
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) C_Polyhedron_test1
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) NNC_Polyhedron_test1
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) MIP_Problem_test1
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) PIP_Problem_test1
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) Parma_Polyhedra_Library_test1
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) Parma_Polyhedra_Library_test2
+ at ENABLE_SHARED_TRUE@	$(java_test_environment) Variable_Output_test1
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Java/tests/NNC_Polyhedron_test1.java b/interfaces/Java/tests/NNC_Polyhedron_test1.java
new file mode 100644
index 0000000..d55220e
--- /dev/null
+++ b/interfaces/Java/tests/NNC_Polyhedron_test1.java
@@ -0,0 +1,123 @@
+/* Test NNC_Polyhedron Java test class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class NNC_Polyhedron_test1 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    public static boolean test01() {
+        Variable X = new Variable(0);
+        Variable Y = new Variable(1);
+        Variable Z = new Variable(2);
+        NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+        Linear_Expression le_X = new Linear_Expression_Variable(X);
+        Linear_Expression le_Y = new Linear_Expression_Variable(Y);
+        Linear_Expression le_Z = new Linear_Expression_Variable(Z);
+        Linear_Expression le_2Y = le_Y.times(new Coefficient(2));
+        Linear_Expression le_5Z = le_Z.times(new Coefficient(5));
+        Linear_Expression le_7
+            = new Linear_Expression_Coefficient(new Coefficient(7));
+        Linear_Expression le_5
+            = new Linear_Expression_Coefficient(new Coefficient(5));
+        Linear_Expression lhs1 = le_X.sum(le_2Y.sum(le_5Z));
+        NNC_Polyhedron ph1
+            = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+        ph1.add_constraint(new Constraint(lhs1,
+                                          Relation_Symbol.GREATER_OR_EQUAL,
+                                          le_7));
+        ph1.add_constraint(new Constraint(le_X,
+                                          Relation_Symbol.LESS_THAN,
+                                          le_5Z));
+        PPL_Test.println_if_noisy(ph1.constraints().toString());
+        Constraint c = new Constraint(le_5Z,
+                                      Relation_Symbol.GREATER_THAN,
+                                      le_X);
+        Poly_Con_Relation rel = ph1.relation_with(c);
+        return rel.implies(Poly_Con_Relation.is_included());
+    }
+
+    public static boolean test02() {
+        // Test if `minimized_constraints' returns an empty Constraint_System
+        // if the Polyhedron is built from universe with a dimension greater
+        // than zero.
+        Variable X = new Variable(0);
+        Variable Y = new Variable(1);
+        Variable Z = new Variable(2);
+        NNC_Polyhedron ph = new NNC_Polyhedron(3, Degenerate_Element.UNIVERSE);
+        Constraint_System cs = ph.minimized_constraints();
+        return cs.isEmpty();
+    }
+
+    public static boolean test03() {
+        // Test termination methods.
+        Variable X1 = new Variable(0);
+        Variable X2 = new Variable(1);
+        Variable XP1 = new Variable(2);
+        Variable XP2 = new Variable(3);
+        NNC_Polyhedron ph = new NNC_Polyhedron(4, Degenerate_Element.UNIVERSE);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_0 = new Coefficient(0);
+        Linear_Expression le_X1 = new Linear_Expression_Variable(X1);
+        Linear_Expression le_X2 = new Linear_Expression_Variable(X2);
+        Linear_Expression le_XP1 = new Linear_Expression_Variable(XP1);
+        Linear_Expression le_XP2 = new Linear_Expression_Variable(XP2);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
+        Linear_Expression le_X1_difference_XP1 = le_X1.sum(le_XP1);
+        Constraint c_XP2_eq_1
+          = new Constraint(le_XP2, Relation_Symbol.EQUAL, le_1);
+        Constraint c_X1_geq_1
+          = new Constraint(le_X1, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_X1_minus_XP1_geq_1
+          = new Constraint(le_X1_difference_XP1, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_X2_leq_0
+          = new Constraint(le_X2, Relation_Symbol.LESS_OR_EQUAL, le_0);
+        ph.add_constraint(c_XP2_eq_1);
+        ph.add_constraint(c_X1_geq_1);
+        ph.add_constraint(c_X1_minus_XP1_geq_1);
+        ph.add_constraint(c_X2_leq_0);
+        return Termination.termination_test_MS_NNC_Polyhedron(ph);
+    }
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(NNC_Polyhedron_test1.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+
+}
diff --git a/interfaces/Java/tests/PIP_Problem_test1.java b/interfaces/Java/tests/PIP_Problem_test1.java
new file mode 100644
index 0000000..bde8178
--- /dev/null
+++ b/interfaces/Java/tests/PIP_Problem_test1.java
@@ -0,0 +1,480 @@
+/* Test PIP_Problem Java test class of the Parma Polyhedra Library Java
+   interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class PIP_Problem_test1 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    // This code tests the PIP_Problem methods.
+    public static boolean test01() {
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Variable C = new Variable(2);
+        Variable D = new Variable(3);
+        Variables_Set var_set_D = new Variables_Set();
+        var_set_D.add(D);
+        Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+        Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Linear_Expression_Variable le_d = new Linear_Expression_Variable(D);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_3 = new Coefficient(3);
+        Coefficient coeff_5 = new Coefficient(5);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+        Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+
+        // Constraint declarations.
+        Constraint c_a_geq_1
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_a_leq_5
+          = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+        Constraint c_b_geq_3
+          = new Constraint(le_b, Relation_Symbol.GREATER_OR_EQUAL, le_3);
+        Constraint c_d_leq_1
+          = new Constraint(le_d, Relation_Symbol.LESS_OR_EQUAL, le_1);
+        Constraint constraint1 = c_a_geq_1;
+        Constraint constraint2 = c_b_geq_3;
+        Constraint_System constraints1 = new Constraint_System();
+        constraints1.add(constraint1);
+        C_Polyhedron ph1 = new C_Polyhedron(3, Degenerate_Element.UNIVERSE);
+        ph1.add_constraints(constraints1);
+        C_Polyhedron ph2 = new C_Polyhedron(4, Degenerate_Element.UNIVERSE);
+        ph2.add_constraints(constraints1);
+        ph2.add_constraint(constraint2);
+
+        PIP_Problem pip1 = new PIP_Problem(3);
+        pip1.add_constraints(constraints1);
+        Constraint pip1_c1 = pip1.constraint_at_index(0);
+        long pip1_dim = pip1.space_dimension();
+
+        PIP_Problem pip2 = new PIP_Problem(pip1_dim);
+        pip2.add_constraints(constraints1);
+
+        boolean ok = (pip2.space_dimension() == 3);
+        if (!ok)
+          return false;
+
+        PIP_Problem pip3 = new PIP_Problem(3);
+        pip3.add_constraints(constraints1);
+        pip3.add_space_dimensions_and_embed(0, 1);
+        pip3.add_constraint(constraint2);
+        ok = ok && (pip3.space_dimension() == 4);
+
+        Constraint constraint4 = c_d_leq_1;
+        Constraint_System constraints4 = new Constraint_System();
+        constraints4.add(constraint1);
+        constraints4.add(constraint4);
+        PIP_Problem pip4 = new PIP_Problem(4, constraints4, var_set_D);
+        ok = ok
+             && (pip4.space_dimension() == 4)
+             && (pip4.number_of_parameter_space_dimensions() == 1);
+
+        return ok;
+    }
+
+    // This code tests more PIP_Problem methods.
+    public static boolean test02() {
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Coefficient coeff_0 = new Coefficient(0);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_5 = new Coefficient(5);
+        Coefficient coeff_8 = new Coefficient(8);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+        Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+
+        // Constraint declarations.
+        Constraint c_a_geq_1
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_a_leq_5
+          = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+        Constraint c_a_eq_8
+          = new Constraint(le_a, Relation_Symbol.EQUAL, le_8);
+        Constraint constraint1 = c_a_geq_1;
+        Constraint_System constraints1 = new Constraint_System();
+        constraints1.add(constraint1);
+
+        Variables_Set var_set_B = new Variables_Set();
+        var_set_B.add(B);
+
+        PIP_Problem pip1 = new PIP_Problem(2);
+        pip1.add_constraints(constraints1);
+         long pip1_dim = pip1.space_dimension();
+        pip1.add_to_parameter_space_dimensions(var_set_B);
+        Variables_Set var_set1 = pip1.parameter_space_dimensions();
+        boolean ok = (var_set1.contains(B));
+        if (!ok)
+          return false;
+        ok = pip1.is_satisfiable();
+        if (!ok)
+          return false;
+
+        PIP_Problem_Status pip1_status;
+        pip1_status = pip1.solve();
+        ok = ok && (pip1_status == PIP_Problem_Status.OPTIMIZED_PIP_PROBLEM);
+
+        PIP_Problem_Status pip2_status;
+        pip1.add_constraint(c_a_leq_5);
+        pip2_status = pip1.solve();
+        ok = ok && (pip2_status == PIP_Problem_Status.OPTIMIZED_PIP_PROBLEM);
+        if (!ok)
+          return false;
+
+        PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+        PPL_Test.println_if_noisy(IO.wrap_string(pip1.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+
+        PPL_Test.print_if_noisy("Testing max_space_dimension(): ");
+        long max_space_dim = pip1.max_space_dimension();
+        PPL_Test.println_if_noisy(max_space_dim);
+
+        PIP_Problem_Control_Parameter_Value cp_value1
+          = pip1.get_pip_problem_control_parameter
+              (PIP_Problem_Control_Parameter_Name.CUTTING_STRATEGY);
+        pip1.set_pip_problem_control_parameter(
+          PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_FIRST);
+        PIP_Problem_Control_Parameter_Value cp_value2
+          = pip1.get_pip_problem_control_parameter
+              (PIP_Problem_Control_Parameter_Name.CUTTING_STRATEGY);
+        ok = ok
+          && (cp_value2
+                == PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_FIRST);
+        if (!ok)
+          return false;
+
+        pip1.set_pip_problem_control_parameter(
+          PIP_Problem_Control_Parameter_Value.PIVOT_ROW_STRATEGY_MAX_COLUMN);
+        PIP_Problem_Control_Parameter_Value cp_value3
+          = pip1.get_pip_problem_control_parameter
+              (PIP_Problem_Control_Parameter_Name.PIVOT_ROW_STRATEGY);
+        ok = ok
+          && (cp_value3
+                == PIP_Problem_Control_Parameter_Value
+                    .PIVOT_ROW_STRATEGY_MAX_COLUMN);
+
+        pip1.set_pip_problem_control_parameter(
+          PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_ALL);
+        PIP_Problem_Control_Parameter_Value cp_value4
+          = pip1.get_pip_problem_control_parameter
+              (PIP_Problem_Control_Parameter_Name.CUTTING_STRATEGY);
+        ok = ok
+          && (cp_value4
+                == PIP_Problem_Control_Parameter_Value.CUTTING_STRATEGY_ALL);
+
+        return ok && pip1.OK();
+    }
+
+
+    // This code tests PIP_Tree and its methods.
+    public static boolean test03() {
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Variable C = new Variable(2);
+        Variable D = new Variable(3);
+        Variables_Set var_set_D = new Variables_Set();
+        var_set_D.add(D);
+        Linear_Expression_Variable le_b = new Linear_Expression_Variable(B);
+        Linear_Expression_Variable le_c = new Linear_Expression_Variable(C);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Linear_Expression_Variable le_d = new Linear_Expression_Variable(D);
+        Coefficient coeff_0 = new Coefficient(0);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_3 = new Coefficient(3);
+        Coefficient coeff_5 = new Coefficient(5);
+        Coefficient coeff_8 = new Coefficient(8);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+        Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+        Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+
+        // Constraint declarations.
+        Constraint c_a_geq_1
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        Constraint c_a_leq_5
+          = new Constraint(le_a, Relation_Symbol.LESS_OR_EQUAL, le_5);
+        Constraint c_a_eq_8
+          = new Constraint(le_a, Relation_Symbol.EQUAL, le_8);
+        Constraint c_d_leq_1
+          = new Constraint(le_d, Relation_Symbol.LESS_OR_EQUAL, le_1);
+        Constraint constraint1 = c_a_geq_1;
+        Constraint_System constraints1 = new Constraint_System();
+        constraints1.add(constraint1);
+
+        Variables_Set var_set_B = new Variables_Set();
+        var_set_B.add(B);
+
+        PIP_Problem pip1 = new PIP_Problem(2);
+        pip1.add_constraints(constraints1);
+        long pip1_dim = pip1.space_dimension();
+        pip1.add_to_parameter_space_dimensions(var_set_B);
+        Variables_Set var_set1 = pip1.parameter_space_dimensions();
+        boolean ok = pip1.is_satisfiable();
+        if (!ok)
+          return false;
+        PIP_Tree_Node ptree1 = pip1.solution();
+        long num_of_arts1 = ptree1.number_of_artificials();
+        Artificial_Parameter_Sequence arts1 = ptree1.artificials();
+        ok = ptree1.OK() && num_of_arts1 == 0 && arts1.size() == 0;
+        if (!ok)
+          return false;
+        PIP_Solution_Node psol1 = ptree1.as_solution();
+        PIP_Decision_Node pdec1 = ptree1.as_decision();
+        if (psol1 == null || pdec1 != null)
+            return false;
+        Constraint_System ptree1_constraints = ptree1.constraints();
+        C_Polyhedron pip1_ph = new C_Polyhedron(pip1_dim,
+                                                Degenerate_Element.UNIVERSE);
+        C_Polyhedron ph1 = new C_Polyhedron(pip1_dim,
+                                            Degenerate_Element.UNIVERSE);
+        ph1.add_constraint(constraint1);
+        pip1_ph.add_constraints(ptree1_constraints);
+        ok = ok && !pip1_ph.equals(ph1);
+        if (!ok)
+          return false;
+
+        PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+        PPL_Test.println_if_noisy(IO.wrap_string(ptree1.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+
+        Constraint constraint2 = c_d_leq_1;
+        Constraint_System constraints2 = new Constraint_System();
+        constraints2.add(constraint1);
+        constraints2.add(constraint2);
+        PIP_Problem pip2 = new PIP_Problem(4, constraints2, var_set_D);
+        PIP_Tree_Node ptree2 = pip2.solution();
+        long num_of_arts2 = ptree2.number_of_artificials();
+        ok = (ptree2.OK() && (num_of_arts2 == 0));
+        if (!ok)
+          return false;
+        PIP_Solution_Node psol2 = ptree2.as_solution();
+        PIP_Decision_Node pdec2 = ptree2.as_decision();
+        Artificial_Parameter_Sequence arts2 = ptree2.artificials();
+        if (psol2 == null || pdec2 != null)
+            return false;
+        ok = arts2.isEmpty();
+        if (!ok)
+          return false;
+
+        PPL_Test.println_if_noisy("Testing toString() and wrap_string(): ");
+        PPL_Test.println_if_noisy(IO.wrap_string(ptree2.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+
+        return true;
+   }
+
+   // This code is based on test02 in pipproblem1.cc.
+    public static boolean test04() {
+        Variable I = new Variable(0);
+        Variable J = new Variable(1);
+        Variable N = new Variable(2);
+        Variable M = new Variable(3);
+        Variables_Set params = new Variables_Set();
+        params.add(N);
+        params.add(M);
+        Linear_Expression_Variable le_i = new Linear_Expression_Variable(I);
+        Linear_Expression_Variable le_j = new Linear_Expression_Variable(J);
+        Linear_Expression_Variable le_n = new Linear_Expression_Variable(N);
+        Linear_Expression_Variable le_m = new Linear_Expression_Variable(M);
+        Coefficient coeff_0 = new Coefficient(0);
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_2 = new Coefficient(2);
+        Coefficient coeff_3 = new Coefficient(3);
+        Coefficient coeff_4 = new Coefficient(4);
+        Coefficient coeff_7 = new Coefficient(7);
+        Coefficient coeff_8 = new Coefficient(8);
+        Coefficient coeff_10 = new Coefficient(10);
+        Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Linear_Expression le_2 = new Linear_Expression_Coefficient(coeff_2);
+        Linear_Expression le_3 = new Linear_Expression_Coefficient(coeff_3);
+        Linear_Expression le_4 = new Linear_Expression_Coefficient(coeff_4);
+        Linear_Expression le_7 = new Linear_Expression_Coefficient(coeff_7);
+        Linear_Expression le_8 = new Linear_Expression_Coefficient(coeff_8);
+        Linear_Expression le_10 = new Linear_Expression_Coefficient(coeff_10);
+        Linear_Expression le_2i = le_i.times(coeff_2);
+        Linear_Expression le_3j = le_j.times(coeff_3);
+        Linear_Expression le_2i_plus_3j = le_2i.sum(le_3j);
+        Linear_Expression le_4i = le_i.times(coeff_4);
+        Linear_Expression le_4i_diff_j = le_4i.subtract(le_j);
+        Linear_Expression le_m_diff_j = le_m.subtract(le_j);
+        Linear_Expression le_n_diff_i = le_n.subtract(le_i);
+
+        // Constraint declarations.
+        Constraint c_1
+          = new Constraint(le_2i_plus_3j, Relation_Symbol.GREATER_OR_EQUAL,
+                           le_8);
+        Constraint c_2
+          = new Constraint(le_4i_diff_j, Relation_Symbol.GREATER_OR_EQUAL,
+                           le_4);
+        Constraint c_3
+          = new Constraint(le_m_diff_j, Relation_Symbol.GREATER_OR_EQUAL,
+                           le_0);
+        Constraint c_4
+          = new Constraint(le_n_diff_i, Relation_Symbol.GREATER_OR_EQUAL,
+                           le_0);
+        Constraint_System cs = new Constraint_System();
+        cs.add(c_1);
+        cs.add(c_2);
+        cs.add(c_3);
+        cs.add(c_4);
+
+        PIP_Problem pip = new PIP_Problem(4, cs, params);
+
+        // Known to overflow if PPL uses 8-bits checked integers.
+        try {
+            pip.solve();
+        }
+        catch (Overflow_Error_Exception ex) {
+            if (Coefficient.bits() != 8)
+                throw ex;
+            PPL_Test.println_if_noisy("Expected overflow exception caught:");
+            PPL_Test.println_if_noisy(ex.getMessage());
+            return true;
+        }
+
+        PIP_Problem_Status pip_status = pip.solve();
+        boolean ok = (pip_status == PIP_Problem_Status.OPTIMIZED_PIP_PROBLEM);
+        if (!ok)
+          return false;
+        PIP_Tree_Node solution = pip.solution();
+        ok = solution.OK();
+        if (!ok)
+          return false;
+
+        PPL_Test.println_if_noisy();
+        PPL_Test.println_if_noisy("Testing toString():");
+        PPL_Test.println_if_noisy(solution.toString());
+        PPL_Test.println_if_noisy();
+
+        PIP_Decision_Node root = solution.as_decision();
+        if (root == null || !root.OK())
+          return false;
+        if (root.number_of_artificials() != 0)
+          return false;
+        Constraint_System cs1 = root.constraints();
+        if (cs1.size() != 1)
+          return false;
+        Constraint c = cs.get(0);
+        Linear_Expression le_left = c.left_hand_side();
+        Linear_Expression le_right = c.right_hand_side();
+        Relation_Symbol relsym = c.kind();
+        if (relsym != Relation_Symbol.GREATER_OR_EQUAL
+            || (le_left.is_zero()) || (le_right.is_zero()))
+          return false;
+        PIP_Tree_Node root_true_branch = root.child_node(true);
+        if (root_true_branch == null)
+          return false;
+
+        PPL_Test.println_if_noisy("PIP Tree root node Constraint: ");
+        PPL_Test.println_if_noisy(IO.wrap_string(c.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+
+        PIP_Decision_Node t_child = root_true_branch.as_decision();
+        if (t_child == null || !t_child.OK())
+          return false;
+
+        // Check t_child node context.
+        if (t_child.number_of_artificials() != 0)
+          return false;
+        Constraint_System cs2 = t_child.constraints();
+        if (cs2.size() != 1)
+          return false;
+        Constraint c2 = cs2.get(0);
+        Linear_Expression le_left2 = c2.left_hand_side();
+        Linear_Expression le_right2 = c2.right_hand_side();
+        Relation_Symbol relsym2 = c2.kind();
+        if (relsym2 != Relation_Symbol.GREATER_OR_EQUAL
+          || (le_left2.is_zero()) || (le_right2.is_zero()))
+          return false;
+
+        if (t_child.child_node(true) == null)
+          return false;
+        PIP_Solution_Node t_t_child = t_child.child_node(true).as_solution();
+        if (t_t_child == null || !t_t_child.OK())
+          return false;
+
+        // Check t_t_child node.
+        if (t_t_child.number_of_artificials() != 0)
+          return false;
+        Constraint_System cs3 = t_t_child.constraints();
+        if (cs3.size() != 0)
+          return false;
+        Linear_Expression v_i = t_t_child.parametric_values(I);
+        Linear_Expression v_j = t_t_child.parametric_values(J);
+
+        PIP_Solution_Node t_f_child = t_child.child_node(false).as_solution();
+        if (t_f_child == null || !t_f_child.OK())
+          return false;
+
+        // Check t_f_child node.
+        // Check artificial parameter.
+        if (t_f_child.number_of_artificials() != 1)
+          return false;
+        Artificial_Parameter ap = t_f_child.artificials().get(0);
+        Linear_Expression ap_le = ap.linear_expression();
+        Coefficient ap_den = ap.denominator();
+
+        PPL_Test.println_if_noisy("Artificial_Parameter linear_expression: ");
+        PPL_Test.println_if_noisy(IO.wrap_string(ap_le.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+        PPL_Test.println_if_noisy("Artificial_Parameter denominator: ");
+        PPL_Test.println_if_noisy(IO.wrap_string(ap_den.toString(), 4, 64, 60));
+        PPL_Test.println_if_noisy();
+         // Check context.
+        Constraint_System cs4 = t_f_child.constraints();
+        if (cs4.size() != 1)
+          return false;
+        Constraint c4 = cs4.get(0);
+        if (c4.kind() != Relation_Symbol.GREATER_OR_EQUAL)
+          return false;
+        // Check parametric values.
+        Linear_Expression v_i4 = t_f_child.parametric_values(I);
+        Linear_Expression v_j4 = t_f_child.parametric_values(J);
+
+      return true;
+    }
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(PIP_Problem_test1.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+}
diff --git a/interfaces/Java/tests/PPL_Test.java b/interfaces/Java/tests/PPL_Test.java
new file mode 100644
index 0000000..370ed97
--- /dev/null
+++ b/interfaces/Java/tests/PPL_Test.java
@@ -0,0 +1,90 @@
+/* Test helper class of the Parma Polyhedra Library Java interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+public class PPL_Test {
+
+    static boolean NOISY = false;
+    static boolean VERY_NOISY = false;
+
+    // Common initialization.
+    public static void initialize() {
+        String noisy_value = System.getenv("PPL_NOISY_TESTS");
+        String vnoisy_value = System.getenv("PPL_VERY_NOISY_TESTS");
+        if (vnoisy_value != null) {
+               VERY_NOISY = true;
+               NOISY = true;
+        }
+        if (noisy_value != null)
+               NOISY = true;
+    }
+
+    public static void print_if_noisy(String str) {
+        if (NOISY)
+               System.out.print(str);
+    }
+
+    public static void println_if_noisy(String str) {
+        if (NOISY)
+               System.out.println(str);
+    }
+
+    public static void print_if_noisy(long l) {
+        if (NOISY)
+            System.out.print(l);
+    }
+
+    public static void println_if_noisy(long l) {
+        if (NOISY)
+            System.out.println(l);
+    }
+
+    public static void println_if_noisy() {
+        if (NOISY)
+               System.out.println();
+    }
+
+    public static void print_if_vnoisy(String str) {
+        if (VERY_NOISY)
+               System.out.print(str);
+    }
+
+    public static void println_if_vnoisy(String str) {
+        if (VERY_NOISY)
+               System.out.println(str);
+    }
+
+    public static void print_if_vnoisy(long l) {
+        if (VERY_NOISY)
+            System.out.print(l);
+    }
+
+    public static void println_if_vnoisy(long l) {
+        if (VERY_NOISY)
+            System.out.println(l);
+    }
+
+    public static void println_if_vnoisy() {
+        if (VERY_NOISY)
+               System.out.println();
+    }
+}
diff --git a/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java b/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java
new file mode 100644
index 0000000..a66f757
--- /dev/null
+++ b/interfaces/Java/tests/Parma_Polyhedra_Library_test1.java
@@ -0,0 +1,72 @@
+/* Parma_Polyhedra_Library Java test class of the
+   Parma Polyhedra Library Java interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Parma_Polyhedra_Library_test1 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    // This code tests the Parma_Polyhedra_Library methods.
+    public static boolean test01() {
+
+    PPL_Test.print_if_noisy("Version Major: ");
+    PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_major());
+    PPL_Test.print_if_noisy("Version Minor: ");
+    PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_minor());
+    PPL_Test.print_if_noisy("Version Revision: ");
+    PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_revision());
+    PPL_Test.print_if_noisy("Version Beta: ");
+    PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version_beta());
+    PPL_Test.print_if_noisy("Version: ");
+    PPL_Test.println_if_noisy(Parma_Polyhedra_Library.version());
+    PPL_Test.print_if_vnoisy("Banner: ");
+    PPL_Test.println_if_vnoisy(Parma_Polyhedra_Library.banner());
+    Parma_Polyhedra_Library.set_rounding_for_PPL();
+    Parma_Polyhedra_Library.restore_pre_PPL_rounding();
+    PPL_Test.print_if_noisy("Irrational precision: ");
+    PPL_Test.println_if_noisy(Parma_Polyhedra_Library.irrational_precision());
+
+    return true;
+    }
+
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(Parma_Polyhedra_Library_test1.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+}
diff --git a/interfaces/Java/tests/Parma_Polyhedra_Library_test2.java b/interfaces/Java/tests/Parma_Polyhedra_Library_test2.java
new file mode 100644
index 0000000..0f2af4e
--- /dev/null
+++ b/interfaces/Java/tests/Parma_Polyhedra_Library_test2.java
@@ -0,0 +1,142 @@
+/* Parma_Polyhedra_Library Java test class of the
+   Parma Polyhedra Library Java interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Parma_Polyhedra_Library_test2 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    // This code tests the timeout functions.
+    public static boolean test01() {
+        int csecs = 50;
+        int max_dimension = 20;
+        return timed_compute_open_hypercube_generators(csecs, max_dimension);
+    }
+
+    // This code tests the deterministic timeout functions.
+    public static boolean test02() {
+        int weight = 2000;
+        int max_dimension = 20;
+        return weighted_compute_open_hypercube_generators(weight,
+                                                          max_dimension);
+    }
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(Parma_Polyhedra_Library_test2.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+
+    private static void open_hypercube(int dimension, Polyhedron ph) {
+        Linear_Expression le_zero
+            = new Linear_Expression_Coefficient(new Coefficient("0"));
+        Linear_Expression le_one
+            = new Linear_Expression_Coefficient(new Coefficient("1"));
+
+        Constraint_System cs = new Constraint_System();
+        Linear_Expression le;
+        Constraint c;
+        for (int i = 0; i < dimension; ++i) {
+            // Variable(i) > 0.
+            le = new Linear_Expression_Variable(new Variable(i));
+            c = new Constraint(le, Relation_Symbol.GREATER_THAN, le_zero);
+            cs.add(c);
+            // Variable(i) < 1.
+            c = new Constraint(le, Relation_Symbol.LESS_THAN, le_one);
+            cs.add(c);
+        }
+        ph.add_constraints(cs);
+    }
+
+    private static boolean
+        timed_compute_open_hypercube_generators(int csecs,
+                                                int max_dimension) {
+        for (int i = 0; i <= max_dimension; ++i) {
+            Polyhedron ph = new NNC_Polyhedron(i, Degenerate_Element.UNIVERSE);
+            open_hypercube(i, ph);
+            PPL_Test.println_if_noisy("Hypercube of dimension " + i);
+            try {
+                Parma_Polyhedra_Library.set_timeout(csecs);
+                try {
+                    ph.generators();
+                } finally {
+                    Parma_Polyhedra_Library.reset_timeout();
+                }
+            } catch (Timeout_Exception e) {
+                PPL_Test.println_if_noisy("Expected timeout exception caught:");
+                PPL_Test.println_if_noisy(e.getMessage());
+                return true;
+            } catch (Exception e) {
+                PPL_Test.println_if_noisy("Unexpected exception caught:");
+                PPL_Test.println_if_noisy(e.getMessage());
+                return false;
+            }
+        }
+        // Should not reach this point.
+        PPL_Test.println_if_noisy("Expected timeout exception NOT caught!");
+        return false;
+    }
+
+    private static boolean
+        weighted_compute_open_hypercube_generators(int weight,
+                                                   int max_dimension) {
+        for (int i = 0; i <= max_dimension; ++i) {
+            Polyhedron ph = new NNC_Polyhedron(i, Degenerate_Element.UNIVERSE);
+            open_hypercube(i, ph);
+            PPL_Test.println_if_noisy("Hypercube of dimension " + i);
+            try {
+                Parma_Polyhedra_Library.set_deterministic_timeout(weight, 0);
+                try {
+                    ph.generators();
+                } finally {
+                    Parma_Polyhedra_Library.reset_deterministic_timeout();
+                }
+            } catch (Timeout_Exception e) {
+                PPL_Test.println_if_noisy("Expected timeout exception caught:");
+                PPL_Test.println_if_noisy(e.getMessage());
+                return true;
+            } catch (Exception e) {
+                PPL_Test.println_if_noisy("Unexpected exception caught:");
+                PPL_Test.println_if_noisy(e.getMessage());
+                return false;
+            }
+        }
+        // Should not reach this point.
+        PPL_Test.println_if_noisy("Expected timeout exception NOT caught!");
+        return false;
+    }
+}
diff --git a/interfaces/Java/tests/Test_Executor.java b/interfaces/Java/tests/Test_Executor.java
new file mode 100644
index 0000000..fabb2ef
--- /dev/null
+++ b/interfaces/Java/tests/Test_Executor.java
@@ -0,0 +1,65 @@
+/* Test helper class of the Parma Polyhedra Library Java interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import java.lang.reflect.Method;
+
+public class Test_Executor {
+
+    /*! \brief
+      Executes all the static methods of class \p c whose name starts
+      with "test". It is expected that these methods have no parameters
+      and return a Boolean value.
+
+      \return
+      \c true if and only if all the tests defined in class \p c
+      return \c true.
+
+      \param c
+      The class whose test methods are execute.
+    */
+    public static boolean executeTests(Class c) {
+        PPL_Test.initialize();
+        boolean global_test_result_ok = true;
+        System.out.println("Checking " + c.getName());
+        Method methods[] = c.getDeclaredMethods();
+        Object[] no_args = new Object[0];
+        for (Method currentMethod:methods) {
+            try {
+                if (currentMethod.getName().startsWith("test")) {
+                    System.out.println("Executing " + currentMethod.getName());
+                    boolean ok = (Boolean) currentMethod.invoke(null, no_args);
+                    if (!ok) {
+                        global_test_result_ok = false;
+                        System.out.println(currentMethod.getName() + " failed");
+                    }
+                }
+            }
+            catch (Exception e) {
+                System.out.println("Unexpected exception caught:");
+                System.out.println(e.getMessage());
+                return false;
+            }
+        }
+        return global_test_result_ok;
+    }
+}
diff --git a/interfaces/Java/tests/Variable_Output_test1.java b/interfaces/Java/tests/Variable_Output_test1.java
new file mode 100644
index 0000000..ad26dd8
--- /dev/null
+++ b/interfaces/Java/tests/Variable_Output_test1.java
@@ -0,0 +1,94 @@
+/* Test customization of variable output in Java.
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class Variable_Output_test1 {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    public static boolean test01() {
+        Variable A = new Variable(0);
+        Variable B = new Variable(1);
+        Variable C = new Variable(2);
+        Linear_Expression_Variable le_a = new Linear_Expression_Variable(A);
+        Coefficient coeff_1 = new Coefficient(1);
+        Linear_Expression le_1 = new Linear_Expression_Coefficient(coeff_1);
+        Constraint con
+          = new Constraint(le_a, Relation_Symbol.GREATER_OR_EQUAL, le_1);
+        C_Polyhedron ph = new C_Polyhedron(1, Degenerate_Element.UNIVERSE);
+        ph.add_constraint(con);
+        boolean ok = false;
+
+        // Printing with default output function.
+        ok = (A.toString().equals("A") &&
+              B.toString().equals("B") &&
+              C.toString().equals("C") &&
+              con.toString().equals("A >= 1") &&
+              ph.toString().equals("A >= 1"));
+        if (!ok)
+          return false;
+
+        // Changing output function to custom one.
+        Variable_Stringifier vs = new Custom_Variable_Stringifier();
+        Variable.setStringifier(vs);
+
+        ok = (A.toString().equals("Var_0") &&
+              B.toString().equals("Var_1") &&
+              C.toString().equals("Var_2") &&
+              con.toString().equals("Var_0 >= 1") &&
+              ph.toString().equals("Var_0 >= 1"));
+        if (!ok)
+            return false;
+
+        // Restoring default output function.
+        Variable.setStringifier(null);
+
+        ok = (A.toString().equals("A") &&
+              B.toString().equals("B") &&
+              C.toString().equals("C") &&
+              con.toString().equals("A >= 1") &&
+              ph.toString().equals("A >= 1"));
+        if (!ok)
+          return false;
+
+        return ok;
+    }
+
+    public static void main(String[] args) {
+        Parma_Polyhedra_Library.initialize_library();
+        boolean test_result_ok =
+            Test_Executor.executeTests(Variable_Output_test1.class);
+        Parma_Polyhedra_Library.finalize_library();
+        if (!test_result_ok)
+            System.exit(1);
+        System.exit(0);
+    }
+}
diff --git a/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4 b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
new file mode 100644
index 0000000..b5fbcf2
--- /dev/null
+++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java.m4
@@ -0,0 +1,103 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_java_classes_test.java
+dnl using the code in ppl_interface_generator_java_test_code.m4.
+dnl
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_java_procedure_generators.m4')
+m4_include(`ppl_interface_generator_java_test_java_code.m4')
+
+dnl ==================================================================
+dnl Copyright and Domain independent code is added first
+dnl ==================================================================
+m4_divert
+/* Java code for checking all classes.  -*- C++ -*-
+m4_include(`ppl_interface_generator_copyright') */
+
+m4_include(`ppl_java_tests_common')
+
+    public static void main(String[] args) {
+	Parma_Polyhedra_Library.initialize_library();
+        ppl_java_generated_tests.initialize();
+	boolean test_result_ok =
+	    Test_Executor.executeTests(ppl_java_generated_tests.class);
+        Parma_Polyhedra_Library.finalize_library();
+	if (!test_result_ok)
+	    System.exit(1);
+	System.exit(0);
+    }
+
+dnl ==================================================================
+dnl Add the code for domain dependent tests.
+dnl ==================================================================
+    // Here generated tests are defined.
+m4_divert(2)`'dnl
+}
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Define a test statement for each domain, for m4_divert(1)
+dnl ==================================================================
+m4_pushdef(`m4_one_class_code', `')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_undivert(1)`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl ==================================================================
+dnl Define code for all tests to check all methods, for m4_divert(2)
+dnl ==================================================================
+dnl Prefix extra code for each domain.
+m4_pushdef(`m4_pre_extra_class_code', `
+    public static boolean test_`'m4_interface_class$1`'() {
+        globally_ok = true;
+    try {
+
+')
+dnl Postfix extra code for each domain.
+m4_pushdef(`m4_post_extra_class_code', `dnl
+}
+catch (parma_polyhedra_library.Overflow_Error_Exception e) {
+    System.out.println("Overflow exception caught:");
+    System.out.println(e.getMessage());
+}
+System.gc();
+return globally_ok;
+
+    }
+
+')
+
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_undivert(2)`'dnl
diff --git a/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4 b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
new file mode 100644
index 0000000..784f292
--- /dev/null
+++ b/interfaces/Java/tests/ppl_interface_generator_java_test_java_code.m4
@@ -0,0 +1,955 @@
+dnl  -*- java -*-
+m4_divert(-1)
+
+This m4 file contains the code for generating ppl_java_generated_tests.java
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
+
+FIXME: Find a way to avoid having these dummy macros.
+No code is needed for these procedure schemas in the Java interface
+as the tokens argument for widening and extrapolation is optional.
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code', `')
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code', `')
+FIXME: This is the pattern used for finalize() which is protected.
+m4_define(`ppl_delete_ at CLASS@_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+{
+    PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS at _from_space_dimension: ");
+    @TOPOLOGY@@CLASS@ new_0_universe
+        = new @TOPOLOGY@@CLASS@(0, Degenerate_Element.UNIVERSE);
+    @TOPOLOGY@@CLASS@ new_6_universe
+        = new @TOPOLOGY@@CLASS@(6, Degenerate_Element.UNIVERSE);
+    @TOPOLOGY@@CLASS@ new_0_empty
+        = new @TOPOLOGY@@CLASS@(0, Degenerate_Element.EMPTY);
+    @TOPOLOGY@@CLASS@ new_6_empty
+        = new @TOPOLOGY@@CLASS@(6, Degenerate_Element.EMPTY);
+    report_success_or_failure(new_0_universe.OK() && new_6_universe.OK()
+       && new_0_empty.OK() && new_6_empty.OK());
+    new_0_universe.free();
+    new_6_universe.free();
+    new_0_empty.free();
+    new_6_empty.free();
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+{
+    PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @FRIEND@: ");
+    @FRIEND@ friend_gd = new @FRIEND@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ new_gd = new @TOPOLOGY@@CLASS@(friend_gd);
+    report_success_or_failure(new_gd.OK());
+    friend_gd.free();
+    new_gd.free();
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+    `dnl
+{
+    if (("@FRIEND@" != "@TOPOLOGY@@CLASS@")) {
+        PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @FRIEND@ with complexity: ");
+        @FRIEND@ friend_gd
+            = new @FRIEND@(@CONSTRAINER at s1);
+        @TOPOLOGY@@CLASS@ new_gd_pc
+            = new @TOPOLOGY@@CLASS@(friend_gd, Complexity_Class.POLYNOMIAL_COMPLEXITY);
+        @TOPOLOGY@@CLASS@ new_gd_sc
+            = new @TOPOLOGY@@CLASS@(friend_gd, Complexity_Class.SIMPLEX_COMPLEXITY);
+        @TOPOLOGY@@CLASS@ new_gd_ac
+            = new @TOPOLOGY@@CLASS@(friend_gd, Complexity_Class.ANY_COMPLEXITY);
+        report_success_or_failure(new_gd_ac.OK());
+        friend_gd.free();
+        new_gd_pc.free();
+        new_gd_sc.free();
+        new_gd_ac.free();
+    }
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @TOPOLOGY@@CLASS@ from @BUILD_REPRESENT at s: ");
+    @TOPOLOGY@@CLASS@ new_gd1 = new @TOPOLOGY@@CLASS@(@BUILD_REPRESENT at s1);
+    report_success_or_failure(new_gd1.OK());
+    new_gd1.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing swap: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+    gd1.swap(gd2);
+    report_success_or_failure(gd1.OK() && gd2.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing bounds_from_ at ABOVEBELOW@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean bounds_from_ at ABOVEBELOW@
+        = gd.bounds_from_ at ABOVEBELOW@(le_A);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_hashcode_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing hashcode: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    PPL_Test.print_if_noisy("The hashcode is: " + gd.hashCode());
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @HAS_PROPERTY@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    if (gd. at HAS_PROPERTY@())
+        PPL_Test.println_if_noisy("@HAS_PROPERTY@ is true for gd.");
+    else
+        PPL_Test.println_if_noisy("@HAS_PROPERTY@ is false for gd.");
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @DIMENSION@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    PPL_Test.print_if_noisy("@DIMENSION@ of gd = ");
+    PPL_Test.println_if_noisy(gd. at DIMENSION@());
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @BINOP@: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+    gd1. at BINOP@(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing positive_time_elapse_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+    gd1.positive_time_elapse_assign(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing simplify_using_context_assign: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean gd_simplify_using_context_assign
+        = gd.simplify_using_context_assign(gd);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing get_ at CLASS_REPRESENT@s: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @!CLASS_REPRESENT at _System gd_ at CLASS_REPRESENT@ = gd. at CLASS_REPRESENT@s();
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing get_minimized_ at CLASS_REPRESENT@s: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @!CLASS_REPRESENT at _System gr = gd.minimized_ at CLASS_REPRESENT@s();
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @COMPARISON@: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+    boolean gd1_ at COMPARISON@ = gd2. at COMPARISON@(gd1);
+    report_success_or_failure(gd1.OK() && gd2.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @EXTRAPOLATION at _narrowing_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+    gd1. at EXTRAPOLATION@_narrowing_assign(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing relation_with_ at RELATION_REPRESENT@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    Poly_@!A_RELATION_REPRESENT at _Relation
+        poly_relation = gd.relation_with(@RELATION_REPRESENT at 1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing add_@!CLASS_REPRESENT@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.add_ at CLASS_REPRESENT@(@CLASS_REPRESENT at 1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing refine_with_ at REFINE_REPRESENT@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.refine_with_ at REFINE_REPRESENT@(@REFINE_REPRESENT at 1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing add_ at CLASS_REPRESENT@s: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.add_ at CLASS_REPRESENT@s(@CLASS_REPRESENT at s1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing refine_with_ at REFINE_REPRESENT@s: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.refine_with_ at REFINE_REPRESENT@s(@REFINE_REPRESENT at s1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @UB_EXACT@: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean is_exact = gd1. at UB_EXACT@(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @AFFIMAGE@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd. at AFFIMAGE@(var_C, le_A, coeff_5);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.generalized_ at AFFIMAGE@(var_C, Relation_Symbol.EQUAL, le_A, coeff_5);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@_lhs_rhs: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.generalized_ at AFFIMAGE@(le_A, Relation_Symbol.EQUAL, le_A);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@_with_congruence: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.generalized_ at AFFIMAGE@_with_congruence(var_C, Relation_Symbol.EQUAL,
+                                              le_A, coeff_5, coeff_5);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing generalized_ at AFFIMAGE@_lhs_rhs_with_congruence: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(le_A,
+                                                      Relation_Symbol.EQUAL,
+                                                      le_A, coeff_5);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing equals: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean equals = gd.equals(gd);
+    if (!gd.equals(new Object()))
+        PPL_Test.println_if_noisy("A generic object is not equal to gd");
+    report_success_or_failure(equals && gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing OK: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean ok = gd.OK();
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing bounded_ at AFFIMAGE@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.bounded_ at AFFIMAGE@(var_C, le_A, le_A, coeff_5);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @SIMPLIFY@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd. at SIMPLIFY@();
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing unconstrain_space_dimension: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.unconstrain_space_dimension(var_C);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing unconstrain_space_dimensions: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.unconstrain_space_dimensions(var_set_A);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing constrains: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean constrains = gd.constrains(var_C);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing has_ at UPPERLOWER@_bound: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean has_ at UPPERLOWER@
+        = gd.has_ at UPPERLOWER@_bound(var_C, coeff_0, coeff_5, bool_by_ref1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @MAXMIN@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean @MAXMIN@
+        = gd. at MAXMIN@(le_A, coeff_0, coeff_5, bool_by_ref1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @MAXMIN at _with_point: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean @MAXMIN at _with_point
+        = gd. at MAXMIN@(le_A, coeff_0, coeff_5, bool_by_ref2, generator1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing add_space_dimensions_ at EMBEDPROJECT@: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.add_space_dimensions_ at EMBEDPROJECT@(2);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing remove_higher_space_dimensions: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.remove_higher_space_dimensions(2);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing remove_space_dimensions: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.remove_space_dimensions(var_set_A);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing expand_space_dimension: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.expand_space_dimension(var_C, 1);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing fold_space_dimensions: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.fold_space_dimensions(var_set_A, var_C);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing map_space_dimensions: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd.map_space_dimensions(partial_function);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @WIDEN at _widening_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1. at WIDEN@_widening_assign(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing : ppl_ at CLASS@_ at WIDEN@_widening_assign");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1. at WIDEN@_widening_assign(gd2, int_by_ref1);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing widening_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1.widening_assign(gd2, int_by_ref1);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @EXTRAPOLATION at _extrapolation_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1. at EXTRAPOLATION@_extrapolation_assign(gd2, int_by_ref1);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @EXTRAPOLATION at _narrowing_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1. at EXTRAPOLATION@_narrowing_assign(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(gd2, @CONSTRAINER at s1,
+                                                          zero_by_ref1);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1.BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(gd2, 2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    gd1.BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(gd2);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_string_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing toString(): ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    PPL_Test.println_if_noisy(gd.toString());
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+');
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @MEMBYTES@(): ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    PPL_Test.println_if_noisy("@MEMBYTES@ of gd: ");
+    PPL_Test.println_if_noisy(gd. at MEMBYTES@());
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing ascii_dump(): ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    PPL_Test.println_if_noisy(gd.ascii_dump());
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing linear_ at PARTITION@: ");
+    @TOPOLOGY@@CLASS@ gd1
+        = new @TOPOLOGY@@CLASS@(constraints1);
+    @TOPOLOGY@@CLASS@ gd2
+        = new @TOPOLOGY@@CLASS@(constraints1);
+    Pair p = @TOPOLOGY@@CLASS at .linear_partition(gd1, gd2);
+    report_success_or_failure(gd1.OK());
+    PPL_Test.print_if_noisy("Printing Pair from linear_partition: ");
+    PPL_Test.print_if_noisy((p.getFirst()).toString());
+    PPL_Test.print_if_noisy(", ");
+    PPL_Test.println_if_noisy((p.getSecond()).toString());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_partition_code',
+    `dnl
+ at SUPERPOWER_EXISTS@`'dnl
+{
+    PPL_Test.print_if_noisy("Testing @CLASS at _approximate_partition: ");
+    @CLASS@ gd1
+        = new @CLASS@(constraints1);
+    @CLASS@ gd2
+        = new @CLASS@(constraints1);
+    Pair p
+        = @CLASS at .approximate_partition(gd1, gd2, bool_by_ref1);
+    report_success_or_failure(gd1.OK());
+    PPL_Test.print_if_noisy("Printing Pair from approximate_partition: ");
+    PPL_Test.print_if_noisy((p.getFirst()).toString());
+    PPL_Test.print_if_noisy(", ");
+    PPL_Test.print_if_noisy((p.getSecond()).toString());
+    PPL_Test.print_if_noisy(", ");
+    PPL_Test.println_if_noisy(bool_by_ref1);
+    PPL_Test.println_if_noisy();
+    gd1.free();
+    gd2.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @BEGINEND at _iterator: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS at _Iterator it_gd = gd. at BEGINEND@_iterator();
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing @INCDEC at _iterator: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    if ("@INCDEC@" == "increment") {
+      @TOPOLOGY@@CLASS at _Iterator it_gd = gd.begin_iterator();
+      it_gd. at A_INCDEC@();
+    }
+    else {
+      @TOPOLOGY@@CLASS at _Iterator it_gd = gd.end_iterator();
+      it_gd. at A_INCDEC@();
+    }
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing get_disjunct: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS at _Iterator it_gd = gd.begin_iterator();
+    @TOPOLOGY@@DISJUNCT@ gd_disjunct = it_gd.get_disjunct();
+    report_success_or_failure(gd.OK() && gd_disjunct.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing new_iterator_from_iterator: ");
+    @CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @CLASS at _Iterator it_gd = gd.begin_iterator();
+    @CLASS at _Iterator it_gd_copy = new @CLASS at _Iterator(it_gd);
+    @TOPOLOGY@@DISJUNCT@ gd_disjunct = it_gd_copy.get_disjunct();
+    report_success_or_failure(gd.OK() && gd_disjunct.OK());
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing drop_disjunct: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS at _Iterator it_gd = gd.begin_iterator();
+    gd.drop_disjunct(it_gd);
+    report_success_or_failure(gd.OK());
+    gd.free();
+}
+
+{
+    PPL_Test.print_if_noisy("Testing drop_disjuncts: ");
+    @CLASS@ gd1 = new @CLASS@(@CONSTRAINER at s1);
+    @CLASS@ gd2 = new @CLASS@(@CONSTRAINER at s2);
+    gd1.upper_bound_assign(gd2);
+    @CLASS at _Iterator it_gd1 = gd1.begin_iterator();
+    @CLASS at _Iterator it_gd1_end = gd1.end_iterator();
+    gd1.drop_disjuncts(it_gd1, it_gd1_end);
+    report_success_or_failure(gd1.OK());
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing add_disjunct: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @DISJUNCT_TOPOLOGY@@DISJUNCT@ gd_disjunct
+        = new @DISJUNCT_TOPOLOGY@@DISJUNCT@(@CONSTRAINER at s1);
+    gd.add_disjunct(gd_disjunct);
+    report_success_or_failure(gd.OK());
+    gd.free();
+    gd_disjunct.free();
+}
+
+');
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing iterator_equals_iterator: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS at _Iterator it_gd1 = gd.begin_iterator();
+    @TOPOLOGY@@CLASS at _Iterator it_gd2 = gd.begin_iterator();
+    boolean equals = it_gd1.equals(it_gd2);
+    report_success_or_failure(gd.OK() && equals);
+    gd.free();
+}
+
+')
+
+m4_define(`ppl_free_ at CLASS@_code',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing free: ");
+    @TOPOLOGY@@CLASS@ gd = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(gd);
+    gd1.free();
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(gd);
+    gd2 = null;
+    report_success_or_failure(true);
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _codexxx',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing termination_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    boolean term = Termination.termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(gd1);
+    report_success_or_failure(gd1.OK() && term);
+    gd1.free();
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_codexxx',
+    `dnl
+{
+    PPL_Test.print_if_noisy("Testing termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@: ");
+    @TOPOLOGY@@CLASS@ gd1 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s1);
+    @TOPOLOGY@@CLASS@ gd2 = new @TOPOLOGY@@CLASS@(@CONSTRAINER at s2);
+    boolean term = Termination.termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(gd1, gd2);
+    report_success_or_failure(gd1.OK() && gd2.OK() && term);
+    gd1.free();
+    gd2.free();
+}
+
+')
+
+m4_divert`'dnl
diff --git a/interfaces/Java/tests/ppl_java_tests_common b/interfaces/Java/tests/ppl_java_tests_common
new file mode 100644
index 0000000..5c1c32c
--- /dev/null
+++ b/interfaces/Java/tests/ppl_java_tests_common
@@ -0,0 +1,197 @@
+/* Common code for the PPL Java interface tests.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+import parma_polyhedra_library.*;
+
+public class ppl_java_generated_tests {
+    static {
+        try {
+            System.loadLibrary("ppl_java");
+        }
+        catch (UnsatisfiedLinkError  e) {
+            System.out.println("Unable to load the library");
+            System.out.println(e.getMessage());
+            System.exit(-1);
+        }
+    }
+
+    // Success state.
+    static boolean globally_ok;
+
+    // Common stuff. We can add other objects if we need them later.
+    static Coefficient coeff_0;
+    static Coefficient coeff_5;
+    static Variable var_C;
+    static Variables_Set var_set_A;
+    static Linear_Expression le_A;
+
+    static Constraint constraint1;
+    static Constraint constraint2;
+    static Congruence congruence1;
+    static Generator generator1;
+    static Grid_Generator grid_generator1;
+
+    static Constraint_System constraints1;
+    static Constraint_System constraints2;
+    static Congruence_System congruences1;
+    static Congruence_System congruences2;
+    static Generator_System generators1;
+    static Grid_Generator_System grid_generators1;
+
+    static By_Reference<Boolean> bool_by_ref1;
+    static By_Reference<Boolean> bool_by_ref2;
+    static By_Reference<Integer> int_by_ref1;
+    static By_Reference<Integer> zero_by_ref1;
+
+    static Partial_Function partial_function;
+
+    // Common initialization.
+    public static void initialize() {
+
+        // Initialize output variables.
+        PPL_Test.initialize();
+
+        // Coefficient declaration.
+        coeff_0 = new Coefficient("0");
+        Coefficient coeff_1 = new Coefficient(1);
+        Coefficient coeff_2 = new Coefficient(2);
+        Coefficient coeff_4 = new Coefficient(4);
+        coeff_5 = new Coefficient("5");
+        Coefficient coeff_10 = new Coefficient("10");
+
+        // Variable declarations.
+        Variable A = new Variable(0);
+        Variable C = new Variable(2);
+        var_C = C;
+        var_set_A = new Variables_Set();
+        var_set_A.add(A);
+
+        // Linear_Expression declarations.
+        Linear_Expression le_0 = new Linear_Expression_Coefficient(coeff_0);
+        Linear_Expression le_5 = new Linear_Expression_Coefficient(coeff_5);
+        le_A = new Linear_Expression_Variable(A);
+        Linear_Expression le_2A = le_A.times(coeff_2);
+        Linear_Expression le_C = new Linear_Expression_Variable(C);
+        Linear_Expression le_2A_plus_C = le_2A.sum(le_C);
+        Linear_Expression le_40A_plus_10C = le_2A_plus_C.times(coeff_10);
+
+        PPL_Test.print_if_noisy("Printing a linear expression (2A + C): ");
+        PPL_Test.println_if_noisy(le_2A_plus_C.toString());
+
+        // Constraint declarations.
+        Constraint c_5_geq_0
+          = new Constraint(le_5, Relation_Symbol.GREATER_OR_EQUAL, le_0);
+        constraint1 = c_5_geq_0;
+        Constraint c_C_eq_5
+          = new Constraint(le_C, Relation_Symbol.EQUAL, le_5);
+        Constraint c_2A_eq_5
+          = new Constraint(le_2A, Relation_Symbol.EQUAL, le_5);
+        Constraint c_2A_plus_C_eq_2A
+          = new Constraint(le_2A_plus_C, Relation_Symbol.EQUAL, le_2A);
+        Constraint c_2A_plus_C_geq_5
+          = new Constraint(le_2A_plus_C,
+                           Relation_Symbol.GREATER_OR_EQUAL,
+                           le_5);
+        PPL_Test.print_if_noisy("Printing a constraint (2A + C >= 5): ");
+        PPL_Test.println_if_noisy(c_2A_plus_C_geq_5.toString());
+
+        Congruence cg_2A_eq_5 = new Congruence(le_2A, le_5, coeff_0);
+        Congruence cg_C_eq_5 = new Congruence(le_C, le_5, coeff_0);
+        Congruence cg_C_int = new Congruence(le_C, le_0, coeff_1);
+        congruence1 = cg_2A_eq_5;
+        PPL_Test.print_if_noisy("Printing a congruence (2A == 5): ");
+        PPL_Test.println_if_noisy(cg_2A_eq_5.toString());
+
+        // Constraint_System declarations.
+        constraints1 = new Constraint_System();
+        constraints1.add(c_5_geq_0);
+        constraints1.add(c_C_eq_5);
+        PPL_Test.print_if_noisy("Printing a constraint system (C == 5):");
+        PPL_Test.println_if_noisy(constraints1.toString());
+
+        constraints2 = new Constraint_System();
+        constraints2.add(c_2A_plus_C_eq_2A);
+        constraints2.add(c_2A_eq_5);
+
+        congruences1 = new Congruence_System();
+        congruences1.add(cg_2A_eq_5);
+        congruences1.add(cg_C_eq_5);
+        PPL_Test.print_if_noisy("Printing a congruence system: ");
+        PPL_Test.println_if_noisy(congruences1.toString());
+
+        congruences2 = new Congruence_System();
+        congruences2.add(cg_C_int);
+
+        // Generator declarations.
+        Generator g1 = Generator.point(le_40A_plus_10C, coeff_1);
+        generator1 = g1;
+        Generator g2 = Generator.point(le_40A_plus_10C, coeff_2);
+        Generator g4 = Generator.point(le_A, coeff_4);
+        PPL_Test.print_if_noisy("Printing a generator (p(40A + 10C)):");
+        PPL_Test.println_if_noisy(g1.toString());
+
+        // Generator_System declaration.
+        generators1 = new Generator_System();
+        generators1.add(g1);
+        generators1.add(g2);
+        generators1.add(g4);
+        PPL_Test.print_if_noisy("Printing a generator system: ");
+        PPL_Test.println_if_noisy(generators1.toString());
+
+        // Grid_Generator declarations.
+        Grid_Generator gg1
+          = Grid_Generator.grid_point(le_40A_plus_10C, coeff_1);
+        grid_generator1 = gg1;
+        Grid_Generator gg2
+          = Grid_Generator.grid_point(le_40A_plus_10C, coeff_2);
+        Grid_Generator gg4
+          = Grid_Generator.grid_point(le_A, coeff_4);
+
+        // Grid_Generator_System declaration.
+        grid_generators1 = new Grid_Generator_System();
+        grid_generators1.add(gg1);
+        grid_generators1.add(gg2);
+        grid_generators1.add(gg4);
+
+        bool_by_ref1 = new By_Reference<Boolean>(true);
+        bool_by_ref2 = new By_Reference<Boolean>(true);
+
+        int_by_ref1 = new By_Reference<Integer>(1);
+        zero_by_ref1 = new By_Reference<Integer>(0);
+
+        partial_function = new Partial_Function();
+        partial_function.insert(0, 2);
+        partial_function.insert(2, 0);
+        partial_function.insert(1, 1);
+    }
+
+    // Helper method.
+    static void report_success_or_failure(boolean locally_ok) {
+        if (locally_ok)
+            PPL_Test.println_if_noisy("Success");
+        else {
+            PPL_Test.println_if_noisy("Failure");
+            globally_ok = false;
+        }
+    }
+
diff --git a/interfaces/Makefile.am b/interfaces/Makefile.am
new file mode 100644
index 0000000..c467f3d
--- /dev/null
+++ b/interfaces/Makefile.am
@@ -0,0 +1,65 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if BUILD_C_INTERFACE
+C_SUBDIR = C
+endif BUILD_C_INTERFACE
+
+if BUILD_JAVA_INTERFACE
+JAVA_SUBDIR = Java
+endif BUILD_JAVA_INTERFACE
+
+if BUILD_OCAML_INTERFACE
+OCAML_SUBDIR = OCaml
+endif BUILD_OCAML_INTERFACE
+
+if BUILD_SOME_PROLOG_INTERFACES
+PROLOG_SUBDIR = Prolog
+endif BUILD_SOME_PROLOG_INTERFACES
+
+SUBDIRS = . $(C_SUBDIR) $(JAVA_SUBDIR) $(OCAML_SUBDIR) $(PROLOG_SUBDIR)
+
+REQUIRED_INSTANTIATIONS = \
+ at required_instantiations@
+
+REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \
+ at required_instantiations_canonical_names@
+
+BUILT_SOURCES = ppl_interface_instantiations.m4
+
+ppl_interface_instantiations.m4: Makefile
+	echo "m4_define(\`m4_interface_classes_names', \`$(REQUIRED_INSTANTIATIONS_CANONICAL_NAMES)')" > $@
+	echo "m4_define(\`m4_cplusplus_classes_names', \`$(REQUIRED_INSTANTIATIONS)')" >> $@
+
+noinst_HEADERS = \
+interfaced_boxes.hh \
+marked_pointers.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_common.m4 \
+ppl_interface_generator_common_dat.m4 \
+ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_copyright
+
+CLEANFILES = \
+ppl_interface_instantiations.m4
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
new file mode 100644
index 0000000..ce098a5
--- /dev/null
+++ b/interfaces/Makefile.in
@@ -0,0 +1,761 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(noinst_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = . C Java OCaml Prolog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at BUILD_C_INTERFACE_TRUE@C_SUBDIR = C
+ at BUILD_JAVA_INTERFACE_TRUE@JAVA_SUBDIR = Java
+ at BUILD_OCAML_INTERFACE_TRUE@OCAML_SUBDIR = OCaml
+ at BUILD_SOME_PROLOG_INTERFACES_TRUE@PROLOG_SUBDIR = Prolog
+SUBDIRS = . $(C_SUBDIR) $(JAVA_SUBDIR) $(OCAML_SUBDIR) $(PROLOG_SUBDIR)
+REQUIRED_INSTANTIATIONS = \
+ at required_instantiations@
+
+REQUIRED_INSTANTIATIONS_CANONICAL_NAMES = \
+ at required_instantiations_canonical_names@
+
+BUILT_SOURCES = ppl_interface_instantiations.m4
+noinst_HEADERS = \
+interfaced_boxes.hh \
+marked_pointers.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_common.m4 \
+ppl_interface_generator_common_dat.m4 \
+ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_copyright
+
+CLEANFILES = \
+ppl_interface_instantiations.m4
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+
+ppl_interface_instantiations.m4: Makefile
+	echo "m4_define(\`m4_interface_classes_names', \`$(REQUIRED_INSTANTIATIONS_CANONICAL_NAMES)')" > $@
+	echo "m4_define(\`m4_cplusplus_classes_names', \`$(REQUIRED_INSTANTIATIONS)')" >> $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/Makefile.am b/interfaces/OCaml/Makefile.am
new file mode 100644
index 0000000..b5e05ac
--- /dev/null
+++ b/interfaces/OCaml/Makefile.am
@@ -0,0 +1,292 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = . tests
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_hh_files.m4 \
+ppl_interface_generator_ocaml_cc_files.m4 \
+ppl_interface_generator_ocaml_hh_code.m4 \
+ppl_interface_generator_ocaml_cc_code.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4
+
+ml_source_files = \
+ppl_ocaml_globals.mli \
+ppl_ocaml_globals.ml
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(ml_source_files) \
+OCaml_interface.dox \
+README.ocaml
+
+ocamldir = $(pkglibdir)
+
+if HAVE_OCAMLC
+
+PPL_OCAMLC_LIBRARY = ppl_ocaml.cma
+
+endif HAVE_OCAMLC
+
+if HAVE_OCAMLOPT
+
+PPL_OCAMLOPT_LIBRARY = ppl_ocaml.cmxa ppl_ocaml.a
+
+endif HAVE_OCAMLOPT
+
+ocaml_DATA = \
+ppl_ocaml.cmi \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+$(PPL_OCAMLC_LIBRARY) \
+$(PPL_OCAMLOPT_LIBRARY)
+
+BUILT_SOURCES = \
+ppl_ocaml_domains.hh \
+ppl_ocaml_domains_cc_files.stamp
+
+pkglib_LIBRARIES = libppl_ocaml.a
+
+libppl_ocaml_a_SOURCES = \
+ppl_ocaml_common_defs.hh \
+ppl_ocaml_common_inlines.hh \
+ppl_ocaml_common.cc
+
+nodist_EXTRA_libppl_ocaml_a_SOURCES = \
+ppl_ocaml_Int8_Box.cc \
+ppl_ocaml_Int16_Box.cc \
+ppl_ocaml_Int32_Box.cc \
+ppl_ocaml_Int64_Box.cc \
+ppl_ocaml_Uint8_Box.cc \
+ppl_ocaml_Uint16_Box.cc \
+ppl_ocaml_Uint32_Box.cc \
+ppl_ocaml_Uint64_Box.cc \
+ppl_ocaml_Float_Box.cc \
+ppl_ocaml_Double_Box.cc \
+ppl_ocaml_Long_Double_Box.cc \
+ppl_ocaml_Rational_Box.cc \
+ppl_ocaml_Z_Box.cc \
+ppl_ocaml_BD_Shape_int8_t.cc \
+ppl_ocaml_BD_Shape_int16_t.cc \
+ppl_ocaml_BD_Shape_int32_t.cc \
+ppl_ocaml_BD_Shape_int64_t.cc \
+ppl_ocaml_BD_Shape_float.cc \
+ppl_ocaml_BD_Shape_double.cc \
+ppl_ocaml_BD_Shape_long_double.cc \
+ppl_ocaml_BD_Shape_mpq_class.cc \
+ppl_ocaml_BD_Shape_mpz_class.cc \
+ppl_ocaml_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Octagonal_Shape_float.cc \
+ppl_ocaml_Octagonal_Shape_double.cc \
+ppl_ocaml_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Polyhedron.cc \
+ppl_ocaml_Grid.cc \
+ppl_ocaml_Pointset_Powerset_Int8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Float_Box.cc \
+ppl_ocaml_Pointset_Powerset_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Long_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Rational_Box.cc \
+ppl_ocaml_Pointset_Powerset_Z_Box.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_C_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_Grid.cc \
+ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_ocaml_a_LIBADD = \
+ at required_instantiations_ocaml_cxx_objects@
+
+libppl_ocaml_a_DEPENDENCIES = \
+ at required_instantiations_ocaml_cxx_objects@
+
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+
+AM_CPPFLAGS = \
+-I$(OCAMLLIB) \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright
+
+ppl_ocaml.cma: ppl_ocaml_globals.cmo ppl_ocaml.cmo libppl_ocaml.a
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -a -custom \
+		ppl_ocaml_globals.cmo ppl_ocaml.cmo \
+		$(OCAMLC_COMPILE_FLAGS) -cclib -lppl_ocaml \
+		$(OCAMLC_LINK_FLAGS)
+
+ppl_ocaml.cmxa: \
+	ppl_ocaml_globals.cmx ppl_ocaml_globals.o \
+	ppl_ocaml.cmx ppl_ocaml.o libppl_ocaml.a
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -a \
+		ppl_ocaml_globals.cmx ppl_ocaml.cmx \
+		$(OCAMLOPT_COMPILE_FLAGS) -cclib -lppl_ocaml \
+		$(OCAMLOPT_LINK_FLAGS)
+
+ppl_ocaml.a: ppl_ocaml.cmxa
+	@if test -f $@; then :; else \
+	    rm -f ppl_ocaml.cmxa; \
+	    $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmxa; \
+	fi
+
+ppl_ocaml.cmo: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.ml
+
+ppl_ocaml.cmx: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+		ppl_ocaml.ml
+
+ppl_ocaml.o: ppl_ocaml.cmx
+	@if test -f $@; then :; else \
+	    rm -f ppl_ocaml.cmx; \
+	    $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmx; \
+	fi
+
+ppl_ocaml.cmi: ppl_ocaml.mli
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.mli
+
+ppl_ocaml_globals.cmo: ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+	    $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.cmx: \
+	ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+	    $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.o: ppl_ocaml_globals.cmx
+	@if test -f $@; then :; else \
+	    rm -f ppl_ocaml_globals.cmx; \
+	    $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_globals.cmx; \
+	fi
+
+ppl_ocaml_globals.cmi: ppl_ocaml_globals.mli
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+	    $(srcdir)/ppl_ocaml_globals.mli
+
+ppl_ocaml.ml: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_ml.m4 > $@
+
+ppl_ocaml.mli: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_mli.m4 > $@
+
+ppl_ocaml_domains_cc_files.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_cc_files.m4 \
+		> ppl_ocaml_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_cc_blob
+	rm -f ppl_ocaml_cc_blob
+	echo timestamp >$@
+
+ppl_ocaml_domains.hh: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_hh_files.m4 \
+		> ppl_ocaml_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_hh_blob
+	rm -f ppl_ocaml_hh_blob
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_ocaml_cxx_objects@ \
+ppl_ocaml.cma \
+ppl_ocaml.cmxa \
+ppl_ocaml.a \
+ppl_ocaml.cmi \
+ppl_ocaml.cmo \
+ppl_ocaml.cmx \
+ppl_ocaml.o \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_globals.cmo \
+ppl_ocaml_globals.cmx \
+ppl_ocaml_globals.o
+
+CLEANFILES = \
+ at required_instantiations_ocaml_cxx_sources@ \
+ at required_instantiations_ocaml_cxx_headers@ \
+ppl_ocaml_domains.hh \
+ppl_ocaml.ml \
+ppl_ocaml.mli \
+ppl_ocaml_domains_cc_files.stamp
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_ocaml_domains_cc_files.stamp' target.
+$(nodist_EXTRA_libppl_ocaml_a_SOURCES):
diff --git a/interfaces/OCaml/Makefile.in b/interfaces/OCaml/Makefile.in
new file mode 100644
index 0000000..b16e392
--- /dev/null
+++ b/interfaces/OCaml/Makefile.in
@@ -0,0 +1,1239 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/OCaml
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(ocamldir)"
+LIBRARIES = $(pkglib_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libppl_ocaml_a_AR = $(AR) $(ARFLAGS)
+am_libppl_ocaml_a_OBJECTS = ppl_ocaml_common.$(OBJEXT)
+libppl_ocaml_a_OBJECTS = $(am_libppl_ocaml_a_OBJECTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_ocaml_a_SOURCES) \
+	$(nodist_EXTRA_libppl_ocaml_a_SOURCES)
+DIST_SOURCES = $(libppl_ocaml_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(ocaml_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = . tests
+interface_generator_files = \
+ppl_interface_generator_ocaml_procedure_generators.m4 \
+ppl_interface_generator_ocaml_hh_files.m4 \
+ppl_interface_generator_ocaml_cc_files.m4 \
+ppl_interface_generator_ocaml_hh_code.m4 \
+ppl_interface_generator_ocaml_cc_code.m4 \
+ppl_interface_generator_ocaml_ml.m4 \
+ppl_interface_generator_ocaml_ml_code.m4 \
+ppl_interface_generator_ocaml_mli.m4 \
+ppl_interface_generator_ocaml_mli_code.m4
+
+ml_source_files = \
+ppl_ocaml_globals.mli \
+ppl_ocaml_globals.ml
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+$(ml_source_files) \
+OCaml_interface.dox \
+README.ocaml
+
+ocamldir = $(pkglibdir)
+ at HAVE_OCAMLC_TRUE@PPL_OCAMLC_LIBRARY = ppl_ocaml.cma
+ at HAVE_OCAMLOPT_TRUE@PPL_OCAMLOPT_LIBRARY = ppl_ocaml.cmxa ppl_ocaml.a
+ocaml_DATA = \
+ppl_ocaml.cmi \
+ppl_ocaml.mli \
+ppl_ocaml_globals.cmi \
+$(PPL_OCAMLC_LIBRARY) \
+$(PPL_OCAMLOPT_LIBRARY)
+
+BUILT_SOURCES = \
+ppl_ocaml_domains.hh \
+ppl_ocaml_domains_cc_files.stamp
+
+pkglib_LIBRARIES = libppl_ocaml.a
+libppl_ocaml_a_SOURCES = \
+ppl_ocaml_common_defs.hh \
+ppl_ocaml_common_inlines.hh \
+ppl_ocaml_common.cc
+
+nodist_EXTRA_libppl_ocaml_a_SOURCES = \
+ppl_ocaml_Int8_Box.cc \
+ppl_ocaml_Int16_Box.cc \
+ppl_ocaml_Int32_Box.cc \
+ppl_ocaml_Int64_Box.cc \
+ppl_ocaml_Uint8_Box.cc \
+ppl_ocaml_Uint16_Box.cc \
+ppl_ocaml_Uint32_Box.cc \
+ppl_ocaml_Uint64_Box.cc \
+ppl_ocaml_Float_Box.cc \
+ppl_ocaml_Double_Box.cc \
+ppl_ocaml_Long_Double_Box.cc \
+ppl_ocaml_Rational_Box.cc \
+ppl_ocaml_Z_Box.cc \
+ppl_ocaml_BD_Shape_int8_t.cc \
+ppl_ocaml_BD_Shape_int16_t.cc \
+ppl_ocaml_BD_Shape_int32_t.cc \
+ppl_ocaml_BD_Shape_int64_t.cc \
+ppl_ocaml_BD_Shape_float.cc \
+ppl_ocaml_BD_Shape_double.cc \
+ppl_ocaml_BD_Shape_long_double.cc \
+ppl_ocaml_BD_Shape_mpq_class.cc \
+ppl_ocaml_BD_Shape_mpz_class.cc \
+ppl_ocaml_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Octagonal_Shape_float.cc \
+ppl_ocaml_Octagonal_Shape_double.cc \
+ppl_ocaml_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Polyhedron.cc \
+ppl_ocaml_Grid.cc \
+ppl_ocaml_Pointset_Powerset_Int8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Int64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint8_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint16_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint32_Box.cc \
+ppl_ocaml_Pointset_Powerset_Uint64_Box.cc \
+ppl_ocaml_Pointset_Powerset_Float_Box.cc \
+ppl_ocaml_Pointset_Powerset_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Long_Double_Box.cc \
+ppl_ocaml_Pointset_Powerset_Rational_Box.cc \
+ppl_ocaml_Pointset_Powerset_Z_Box.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ppl_ocaml_Pointset_Powerset_C_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.cc \
+ppl_ocaml_Pointset_Powerset_Grid.cc \
+ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.cc \
+ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+libppl_ocaml_a_LIBADD = \
+ at required_instantiations_ocaml_cxx_objects@
+
+libppl_ocaml_a_DEPENDENCIES = \
+ at required_instantiations_ocaml_cxx_objects@
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+AM_CPPFLAGS = \
+-I$(OCAMLLIB) \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_ocaml_cxx_objects@ \
+ppl_ocaml.cma \
+ppl_ocaml.cmxa \
+ppl_ocaml.a \
+ppl_ocaml.cmi \
+ppl_ocaml.cmo \
+ppl_ocaml.cmx \
+ppl_ocaml.o \
+ppl_ocaml_globals.cmi \
+ppl_ocaml_globals.cmo \
+ppl_ocaml_globals.cmx \
+ppl_ocaml_globals.o
+
+CLEANFILES = \
+ at required_instantiations_ocaml_cxx_sources@ \
+ at required_instantiations_ocaml_cxx_headers@ \
+ppl_ocaml_domains.hh \
+ppl_ocaml.ml \
+ppl_ocaml.mli \
+ppl_ocaml_domains_cc_files.stamp
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/OCaml/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/OCaml/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-pkglibLIBRARIES: $(pkglib_LIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(INSTALL_DATA) $$list2 "$(DESTDIR)$(pkglibdir)" || exit $$?; }
+	@$(POST_INSTALL)
+	@list='$(pkglib_LIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  if test -f $$p; then \
+	    $(am__strip_dir) \
+	    echo " ( cd '$(DESTDIR)$(pkglibdir)' && $(RANLIB) $$f )"; \
+	    ( cd "$(DESTDIR)$(pkglibdir)" && $(RANLIB) $$f ) || exit $$?; \
+	  else :; fi; \
+	done
+
+uninstall-pkglibLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkglibdir)'; $(am__uninstall_files_from_dir)
+
+clean-pkglibLIBRARIES:
+	-test -z "$(pkglib_LIBRARIES)" || rm -f $(pkglib_LIBRARIES)
+
+libppl_ocaml.a: $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_DEPENDENCIES) $(EXTRA_libppl_ocaml_a_DEPENDENCIES) 
+	$(AM_V_at)-rm -f libppl_ocaml.a
+	$(AM_V_AR)$(libppl_ocaml_a_AR) libppl_ocaml.a $(libppl_ocaml_a_OBJECTS) $(libppl_ocaml_a_LIBADD)
+	$(AM_V_at)$(RANLIB) libppl_ocaml.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_BD_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_C_Polyhedron_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_Grid_C_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_Grid_NNC_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Constraints_Product_NNC_Polyhedron_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Float_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Int8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Long_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Octagonal_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_BD_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_C_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Float_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Grid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Int8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Long_Double_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_NNC_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_float.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int16_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int32_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int64_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_int8_t.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_long_double.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpq_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Octagonal_Shape_mpz_class.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Rational_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Uint8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Pointset_Powerset_Z_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Polyhedron.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Rational_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint16_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint32_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint64_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Uint8_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_Z_Box.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_ocaml_common.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-ocamlDATA: $(ocaml_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(ocaml_DATA)'; test -n "$(ocamldir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(ocamldir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(ocamldir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ocamldir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(ocamldir)" || exit $$?; \
+	done
+
+uninstall-ocamlDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(ocaml_DATA)'; test -n "$(ocamldir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(ocamldir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LIBRARIES) $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(ocamldir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool clean-pkglibLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-ocamlDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLIBRARIES
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-ocamlDATA uninstall-pkglibLIBRARIES
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool \
+	clean-pkglibLIBRARIES cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-ocamlDATA install-pdf install-pdf-am \
+	install-pkglibLIBRARIES install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs installdirs-am \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-ocamlDATA uninstall-pkglibLIBRARIES
+
+
+ppl_ocaml.cma: ppl_ocaml_globals.cmo ppl_ocaml.cmo libppl_ocaml.a
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -a -custom \
+		ppl_ocaml_globals.cmo ppl_ocaml.cmo \
+		$(OCAMLC_COMPILE_FLAGS) -cclib -lppl_ocaml \
+		$(OCAMLC_LINK_FLAGS)
+
+ppl_ocaml.cmxa: \
+	ppl_ocaml_globals.cmx ppl_ocaml_globals.o \
+	ppl_ocaml.cmx ppl_ocaml.o libppl_ocaml.a
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -a \
+		ppl_ocaml_globals.cmx ppl_ocaml.cmx \
+		$(OCAMLOPT_COMPILE_FLAGS) -cclib -lppl_ocaml \
+		$(OCAMLOPT_LINK_FLAGS)
+
+ppl_ocaml.a: ppl_ocaml.cmxa
+	@if test -f $@; then :; else \
+	    rm -f ppl_ocaml.cmxa; \
+	    $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmxa; \
+	fi
+
+ppl_ocaml.cmo: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.ml
+
+ppl_ocaml.cmx: ppl_ocaml.ml ppl_ocaml.cmi ppl_ocaml_globals.cmi
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+		ppl_ocaml.ml
+
+ppl_ocaml.o: ppl_ocaml.cmx
+	@if test -f $@; then :; else \
+	    rm -f ppl_ocaml.cmx; \
+	    $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml.cmx; \
+	fi
+
+ppl_ocaml.cmi: ppl_ocaml.mli
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) ppl_ocaml.mli
+
+ppl_ocaml_globals.cmo: ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+	    $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.cmx: \
+	ppl_ocaml_globals.ml ppl_ocaml_globals.cmi
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) \
+	    $(srcdir)/ppl_ocaml_globals.ml
+
+ppl_ocaml_globals.o: ppl_ocaml_globals.cmx
+	@if test -f $@; then :; else \
+	    rm -f ppl_ocaml_globals.cmx; \
+	    $(MAKE) $(AM_MAKEFLAGS) ppl_ocaml_globals.cmx; \
+	fi
+
+ppl_ocaml_globals.cmi: ppl_ocaml_globals.mli
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) \
+	    $(srcdir)/ppl_ocaml_globals.mli
+
+ppl_ocaml.ml: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_ml.m4 > $@
+
+ppl_ocaml.mli: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_mli.m4 > $@
+
+ppl_ocaml_domains_cc_files.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_cc_files.m4 \
+		> ppl_ocaml_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_cc_blob
+	rm -f ppl_ocaml_cc_blob
+	echo timestamp >$@
+
+ppl_ocaml_domains.hh: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+	    $(srcdir)/ppl_interface_generator_ocaml_hh_files.m4 \
+		> ppl_ocaml_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_ocaml_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_ocaml_hh_blob
+	rm -f ppl_ocaml_hh_blob
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_ocaml_domains_cc_files.stamp' target.
+$(nodist_EXTRA_libppl_ocaml_a_SOURCES):
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/OCaml_interface.dox b/interfaces/OCaml/OCaml_interface.dox
new file mode 100644
index 0000000..56ceff4
--- /dev/null
+++ b/interfaces/OCaml/OCaml_interface.dox
@@ -0,0 +1,1269 @@
+/* Documentation for the OCaml interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+  \defgroup PPL_OCaml_interface OCaml Language Interface
+
+  The Parma Polyhedra Library comes equipped with an interface for the
+  OCaml language.
+*/
+
+/*! \mainpage OCaml Language Interface
+
+The Parma Polyhedra Library comes equipped with an interface for the
+OCaml language.
+
+The main features of the library are described in
+Section \ref OCaml_Features "OCaml Interface Features".
+Section \ref OCamldoc_Documentation "OCamldoc Documentation"
+lists all the functions available to the default generated domains
+in the OCaml interface.
+Section \ref OI_Compilation "Compilation and Installation"
+explains how the OCaml interface is compiled and installed.
+
+In the sequel, <CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+
+\anchor OCaml_Features
+<H1>OCaml Interface Features</H1>
+
+The OCaml interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in the main \extref{preamble, PPL user manual}.
+Here we just describe those aspects that are specific to the OCaml interface.
+
+\anchor OCaml_Interface_Overview
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the OCaml interface.
+
+- The numerical abstract domains available to the OCaml user consist
+  of the <EM>simple</EM> domains, <EM>powersets</EM> of a simple domain and
+  <EM>products</EM> of simple domains.
+  - The simple domains are:
+     - convex polyhedra, which consist of C_Polyhedron and
+       NNC_Polyhedron;<BR>
+     - weakly relational, which consist of BD_Shape_N and
+       Octagonal_Shape_N
+       where N is one of the numeric types
+       short, signed_char, int, long, long_long,
+       mpz_class, mpq_class;<BR>
+     - boxes which consist of
+       Int8_Box, Int16_Box,
+       Int32_Box, Int64_Box,
+       Uint8_Box, Uint16_Box,
+       Uint32_Box, Uint64_Box,
+       Double_Box, Long_Double_Box,
+       Z_Box, Rational_Box, Float_Box; and<BR>
+     - the Grid domain.
+  - The powerset domains are Pointset_Powerset_S where S is
+    a simple domain.
+  - The product domains consist of
+    Direct_Product_S_T,
+    Smash_Product_S_T and
+    Constraints_Product_S_T where S
+    and T are simple domains.
+- In the following, any of the above numerical
+  abstract domains  is called a PPL <EM>domain</EM>
+  and any element of a PPL domain is called a <EM>PPL object</EM>.
+- The OCaml interface files are all installed in the directory
+  <CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+  dynamically loaded libraries, you must make your dynamic
+  linker/loader aware of this fact.  If you use a GNU/Linux system,
+  try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+  for more information.
+- A PPL object such as a polyhedron can only be accessed
+  by means of a OCaml term called a <EM>handle</EM>.
+  Note, however, that the data structure of a handle,
+  is implementation-dependent, system-dependent and
+  version-dependent, and, for this reason, deliberately left unspecified.
+  What we do guarantee is that the handle requires very little memory.
+- An OCaml program can obtain a valid handle for a
+  PPL object by using functions such as
+\code
+  ppl_new_C_Polyhedron_from_space_dimension,
+  ppl_new_C_Polyhedron_from_C_Polyhedron,
+  ppl_new_C_Polyhedron_from_constraints,
+  ppl_new_C_Polyhedron_from_generators.
+\endcode
+  These functions will return a new handle for referencing a PPL polyhedron.
+- For a PPL object with space dimension \p k,
+  the identifiers used for the PPL variables
+  must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+  associated Cartesian axes.
+  For example, when using the functions that combine PPL polyhedra
+  or add constraints or generators to a representation of
+  a PPL polyhedron,
+  the polyhedra referenced and any constraints or generators in the call
+  should follow all the (space) dimension-compatibility rules stated in
+  Section \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+- As explained above, a polyhedron has a fixed topology C or NNC,
+  that is determined at the time of its initialization.
+  All subsequent operations on the polyhedron must respect all the
+  topological compatibility rules stated in Section
+  \extref{representation, Representations of Convex Polyhedra}
+  of the main PPL user manual.
+- Any application using the PPL should make sure that only the
+  intended version(s) of the library are ever used.
+  Functions
+\code
+  ppl_version_major,
+  ppl_version_minor,
+  ppl_version_revision,
+  ppl_version_beta,
+  ppl_version,
+  ppl_banner.
+\endcode
+  allow run-time checking of information about the version being used.
+
+\anchor OCaml_function_descriptions
+<H2> Function Descriptions </H2>
+
+Below is a short description of many of the interface functions.
+For full definitions of terminology used here, see the main PPL user manual.
+
+\anchor di_functions
+<H1> Domain Independent Functions </H1>
+
+First we describe some domain independent functions
+included with all instantiations of the OCaml interfaces.
+
+<H2><CODE> ppl_version_major </CODE></H2>
+  Returns the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor </CODE></H2>
+  Returns the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision </CODE></H2>
+  Returns the revision number of the PPL version.
+
+<H2><CODE> ppl_version_beta </CODE></H2>
+  Returns the beta number of the PPL version.
+
+<H2><CODE> ppl_version </CODE></H2>
+  Returns the PPL version.
+
+<H2><CODE> ppl_banner </CODE></H2>
+  Returns information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.
+
+<H2><CODE> ppl_max_space_dimension </CODE></H2>
+  Returns the maximum space dimension the C++ interface can handle.
+
+<H2><CODE> ppl_Coefficient_bits </CODE></H2>
+  Returns the number of bits used in the C++ interface for PPL coefficients;
+  0 if unbounded.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+  Returns true if and only if the coefficients in the C++ interface
+  are bounded.
+
+<H2><CODE> ppl_Coefficient_max </CODE></H2>
+  If the coefficients are bounded, returns the maximum coefficient
+  the C++ interface can handle.
+
+<H2><CODE> ppl_Coefficient_min </CODE></H2>
+  If the coefficients are bounded, returns the minimum coefficient
+  the C++ interface can handle.
+
+<H2><CODE> ppl_io_wrap_string source_string indent_depth
+             preferred_first_line_length preferred_line_length </CODE></H2>
+  Utility function for the wrapping of lines of text.
+  The function wraps the lines of text stored in its first string argument
+  according to the next three integer arguments, which are interpreted as
+  the indentation depth, the preferred length for the first line and the
+  preferred length for all the other lines, respecively; it returns a
+  string containing the wrapped text.
+
+<H2><CODE> ppl_set_timeout csecs </CODE></H2>
+   Computations taking exponential time will be interrupted some time
+   after <CODE>csecs</CODE> centiseconds after that call.
+   If the computation is interrupted that way, a timeout exception
+   will be thrown.
+   An exception is immediately thrown if <CODE>csecs</CODE> is not strictly
+   greater than zero, or if the PPL Watchdog library is not enabled.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+   Resets the timeout time so that the computation is not interrupted.
+   An exception is thrown if the PPL Watchdog library is not enabled.
+
+<H2><CODE> ppl_set_deterministic_timeout unscaled_weight scale</CODE></H2>
+   Computations taking exponential time will be interrupted some time
+   after reaching the complexity threshold
+   \f$\mathrm{weight} = \mathrm{unscaled\_weight} \cdot 2^\mathrm{scale}\f$.
+   If the computation is interrupted that way, a timeout exception will
+   be thrown. <CODE>unscaled_weight</CODE> must be strictly greater than
+   zero; <CODE>scale</CODE> must be non-negative; an exception is thrown
+   if the computed weight threshold exceeds the maximum allowed value.
+   <EM>NOTE:</EM> This "timeout" checking functionality is said to be
+   <EM>deterministic</EM> because it is not based on actual elapsed time.
+   Its behavior will only depend on (some of the) computations performed
+   in the PPL library and it will be otherwise independent from the
+   computation environment (CPU, operating system, compiler, etc.).
+   The weight mechanism is under beta testing: client applications
+   should be ready to reconsider the tuning of these weight thresholds
+   when upgrading to newer version of the PPL.
+
+<H2><CODE> ppl_reset_deterministic_timeout </CODE></H2>
+   Resets the timeout time so that the computation is not interrupted.
+   An exception is thrown if the PPL Watchdog library is not enabled.
+
+<H2><CODE> ppl_set_rounding_for_PPL </CODE></H2>
+   Sets the FPU rounding mode so that the PPL abstractions based on
+   floating point numbers work correctly.
+   This is performed automatically at initialization-time.  Calling
+   this function is needed only if <CODE>restore_pre_PPL_rounding</CODE>
+   has previously been called.
+
+<H2><CODE> ppl_restore_pre_PPL_rounding </CODE></H2>
+   Sets the FPU rounding mode as it was before initialization of the PPL.
+   After calling this function it is absolutely necessary to call
+   <CODE>set_rounding_for_PPL</CODE> before using any PPL abstractions
+   based on floating point numbers.
+   This is performed automatically at finalization-time.
+
+<H2><CODE> ppl_irrational_precision </CODE></H2>
+   Returns the precision parameter for irrational calculations.
+
+<H2><CODE> ppl_set_irrational_precision </CODE></H2>
+   Sets the precision parameter <CODE>p</CODE> for irrational calculations.
+   In the following irrational calculations returning an unbounded
+   rational (e.g., when computing a square root), the lesser between
+   numerator and denominator will be limited to <CODE>2**p</CODE>.
+
+<BR>
+
+\anchor OCaml_mip_functions
+<H1> MIP Functions </H1>
+Here we describe some functions available for PPL objects
+defining mixed integer (linear) programming problems.
+
+<H2><CODE>
+  ppl_new_MIP_Problem_from_space_dimension dimension
+</CODE></H2>
+   Return a handle to an MIP Problem \f$\mathrm{MIP}\f$ with the
+   feasible region the vector space of dimension <CODE>dimension</CODE>,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+
+<H2><CODE>
+  ppl_new_MIP_Problem dimension constraint_system lin_expr optimization_mode
+</CODE></H2>
+   Return a handle to an MIP Problem \f$\mathrm{MIP}\f$ having space
+   dimension <CODE>dimension</CODE>, a feasible region represented by
+   <CODE>constraint_system</CODE>, objective function <CODE>lin_expr</CODE>
+   and optimization mode <CODE>optimization_mode</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_get_control_parameter handle param_name
+</CODE></H2>
+   Returns the value of the control parameter named <CODE>param_name</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_control_parameter handle param_value
+</CODE></H2>
+   Sets control parameter value <CODE>param_value</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_swap handle_1 handle_2
+</CODE></H2>
+   Swaps the MIP Problem referenced by <CODE>handle_1</CODE>
+   with the one referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_space_dimension handle
+</CODE></H2>
+   Returns the dimension of the vector space in which the
+   MIP Problem referenced by <CODE>handle</CODE> is embedded.
+
+<H2><CODE>
+  ppl_MIP_Problem_integer_space_dimensions handle
+</CODE></H2>
+   Returns a list of variables representing
+   representing the integer space dimensions of the MIP Problem
+   referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_constraints handle
+</CODE></H2>
+   Returns a list of the constraints in the constraints system
+   representing the feasible region for the MIP Problem
+   referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_objective_function handle
+</CODE></H2>
+   Returns the objective function for the MIP Problem referenced
+   by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimization_mode handle
+</CODE></H2>
+   Returns the optimization mode
+   for the MIP Problem referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_clear handle
+</CODE></H2>
+  Resets the MIP problem referenced by <CODE>handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>Maximization</CODE>.
+
+<H2><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed
+             handle dimension
+ </CODE></H2>
+   Embeds the MIP problem referenced by <CODE>handle</CODE>
+   in a space that is enlarged by <CODE>dimension</CODE> dimensions,
+
+<H2><CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions handle vars_list
+</CODE></H2>
+   Updates the MIP Problem referenced by <CODE>handle</CODE>
+   so that the variables in <CODE>vars_list</CODE> are added to
+   the set of integer space dimensions.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraint handle constraint
+</CODE></H2>
+   Updates the MIP Problem referenced by <CODE>handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>constraint</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_add_constraints handle constraint_system
+</CODE></H2>
+   Updates the MIP Problem referenced by <CODE>handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>constraint_system</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_objective_function handle lin_expr
+</CODE></H2>
+   Updates the MIP Problem referenced by <CODE>handle</CODE>
+   so that the objective function is changed to <CODE>lin_expr</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_set_optimization_mode handle optimization_mode
+</CODE></H2>
+   Updates the MIP Problem referenced by <CODE>handle</CODE>
+   so that the optimization mode is changed to <CODE>optimization_mode</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_is_satisfiable handle
+</CODE></H2>
+  Returns true if the MIP Problem referenced by
+  <CODE>handle</CODE> is satisfiable and false otherwise.
+
+<H2><CODE>
+  ppl_MIP_Problem_solve handle
+</CODE></H2>
+  Solves the MIP problem  referenced by
+  <CODE>handle</CODE> and returns 0, if the MIP problem is not satisfiable;
+  1, if the MIP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  2, if the MIP problem admits an optimal solution.
+
+<H2><CODE>
+  ppl_MIP_Problem_feasible_point handle
+</CODE></H2>
+  Returns a feasible point for the MIP problem
+  referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimizing_point handle
+</CODE></H2>
+  Returns an optimizing point for the MIP problem
+  referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_optimal_value handle
+</CODE></H2>
+  Returns a pair of numbers, the first being the numerator and
+  the second the denominator, for the optimal value
+  for the MIP problem  referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_evaluate_objective_function handle generator
+</CODE></H2>
+  Evaluates the objective function of the MIP problem  referenced by
+  <CODE>handle</CODE> at point <CODE>generator</CODE>.
+  Returns a pair of numbers, the first being the numerator and
+  the second the denominator, for the objective function value
+  for the MIP problem  referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_MIP_Problem_OK handle
+</CODE></H2>
+   Returns true if the MIP Problem referenced by
+   <CODE>handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants and false,
+   otherwise.  Useful for debugging purposes.
+
+<H2><CODE>
+  ppl_MIP_Problem_ascii_dump handle
+</CODE></H2>
+   Returns a string containing an ASCII dump of the internal representation
+   of the MIP_Problem referenced by <CODE>handle</CODE>. Useful for
+   debugging purposes.
+
+<BR>
+
+\anchor OCaml_pip_functions
+<H1> PIP Functions </H1>
+Here we describe some functions available for PPL objects
+defining parametric integer programming problems.
+
+<H2><CODE>
+  ppl_new_PIP_Problem_from_space_dimension dimension
+</CODE></H2>
+   Return a handle to a PIP Problem \f$\mathrm{PIP}\f$ with the
+   feasible region the vector space of dimension <CODE>dimension</CODE>,
+   empty constraint_system and empty set of parametric variables.
+
+<H2><CODE>
+  ppl_new_PIP_Problem dimension constraint_system vars_list
+</CODE></H2>
+   Return a handle to a PIP Problem \f$\mathrm{PIP}\f$ having space
+   dimension <CODE>dimension</CODE>, a feasible region represented by
+   <CODE>constraint_system</CODE> and parametric variables represented
+   by <CODE>vars_list</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_get_control_parameter handle param_name
+</CODE></H2>
+   Returns the value of the control parameter named <CODE>param_name</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_set_control_parameter handle param_value
+</CODE></H2>
+   Sets control parameter value <CODE>param_value</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_swap handle_1 handle_2
+</CODE></H2>
+   Swaps the PIP Problem referenced by <CODE>handle_1</CODE>
+   with the one referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_space_dimension handle
+</CODE></H2>
+   Returns the dimension of the vector space in which the
+   PIP Problem referenced by <CODE>handle</CODE> is embedded.
+
+<H2><CODE>
+  ppl_PIP_Problem_parameter_space_dimensions handle
+</CODE></H2>
+   Returns a list of variables representing
+   representing the parameter space dimensions of the PIP Problem
+   referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_constraints handle
+</CODE></H2>
+   Returns a list of the constraints in the constraints system
+   representing the feasible region for the PIP Problem
+   referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_clear handle
+</CODE></H2>
+  Resets the PIP problem referenced by <CODE>handle</CODE>
+  to be the trivial problem with space dimension \f$0\f$.
+
+<H2><CODE> ppl_PIP_Problem_add_space_dimensions_and_embed
+             handle dimension_0 dimension_1
+ </CODE></H2>
+   Embeds the PIP problem referenced by <CODE>handle</CODE>
+   in a space that is enlarged by <CODE>dimension_0</CODE>
+   non-parameter dimensions and <CODE>dimension_1</CODE> parameter dimensions,
+
+<H2><CODE>
+  ppl_PIP_Problem_add_to_parameter_space_dimensions handle vars_list
+</CODE></H2>
+   Sets the space dimensions whose indexes are in \p vars_list
+   to be parameter space dimensions.
+
+<H2><CODE>
+  ppl_PIP_Problem_add_constraint handle constraint
+</CODE></H2>
+   Updates the PIP Problem referenced by <CODE>handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>constraint</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_add_constraints handle constraint_system
+</CODE></H2>
+   Updates the PIP Problem referenced by <CODE>handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in <CODE>constraint_system</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Problem_set_big_parameter_dimension handle dimension
+</CODE></H2>
+   Sets the dimension for the big parameter to \p dimension.
+
+<H2><CODE>
+  ppl_PIP_Problem_get_big_parameter_dimension handle
+</CODE></H2>
+   Returns the dimension for the big parameter.
+   Exception is thrown if no big parameter dimension has been set.
+
+<H2><CODE>
+  ppl_PIP_Problem_has_big_parameter_dimension handle
+</CODE></H2>
+   Returns true if and only if the dimension for the big parameter has been set.
+
+<H2><CODE>
+  ppl_PIP_Problem_is_satisfiable handle
+</CODE></H2>
+  Returns true if the PIP Problem referenced by
+  <CODE>handle</CODE> is satisfiable and false otherwise.
+
+<H2><CODE>
+  ppl_PIP_Problem_solve handle
+</CODE></H2>
+  Solves the PIP problem  referenced by
+  <CODE>handle</CODE> and returns
+    a status flag indicating the outcome of the optimization attempt:
+  \p Optimized_Pip_Problem if the optimization attempt succeeds;
+  \p Unfeasible_Pip_Problem otherwise.
+
+<H2><CODE>
+  ppl_PIP_Problem_solution handle
+</CODE></H2>
+  Solves the PIP problem referenced by <CODE>handle</CODE> and
+  returns a handle to a PIP_Tree representing a feasible solution,
+  if it exists and bottom otherwise.
+
+<H2><CODE>
+  ppl_PIP_Problem_optimizing_solution handle
+</CODE></H2>
+  Solves the PIP problem referenced by <CODE>handle</CODE> and
+  returns a handle to a PIP_Tree representing an optimizing_solution,
+  if it exists and bottom otherwise.
+
+<H2><CODE>
+  ppl_PIP_Problem_OK handle
+</CODE></H2>
+   Returns true if the PIP Problem referenced by
+   <CODE>handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants and false,
+   otherwise.  Useful for debugging purposes.
+
+<H2><CODE>
+  ppl_PIP_Problem_ascii_dump handle
+</CODE></H2>
+   Returns a string containing an ASCII dump of the internal representation
+   of the PIP_Problem referenced by <CODE>handle</CODE>. Useful for
+   debugging purposes.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_swap handle_1 handle_2
+</CODE></H2>
+   Swaps the PIP tree node referenced by <CODE>handle_1</CODE>
+   with the one referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_OK handle
+</CODE></H2>
+   Returns true if the PIP tree node referenced by
+   <CODE>handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants and false,
+   otherwise.  Useful for debugging purposes.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_ascii_dump handle
+</CODE></H2>
+   Returns a string containing an ASCII dump of the internal representation
+   of the Pip tree node referenced by <CODE>handle</CODE>. Useful for
+   debugging purposes.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_constraints handle
+</CODE></H2>
+   Returns a list of the parameter constraints in the PIP tree node
+   referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_artificials handle
+</CODE></H2>
+   Returns a list of the artificial parameters in the PIP
+   tree node referenced by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_is_bottom handle
+</CODE></H2>
+   Returns true if and only if <CODE>handle</CODE> represents bottom.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_is_decision handle
+</CODE></H2>
+   Returns true if and only if <CODE>handle</CODE> represents a decision node.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_is_solution handle
+</CODE></H2>
+   Returns true if and only if <CODE>handle</CODE> represents a solution node.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_parametric_values handle var
+</CODE></H2>
+   Returns a linear expression representing the values of problem variable
+   \p var in the solution node represented by <CODE>handle</CODE>.
+   The returned linear expression may involve problem parameters
+   as well as artificial parameters.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_true_child handle var
+</CODE></H2>
+   Returns a handle to the child on the true branch of the
+   PIP tree node represented by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_PIP_Tree_Node_false_child handle var
+</CODE></H2>
+   Returns a handle to the child on the false branch of the
+   PIP tree node represented by <CODE>handle</CODE>.
+
+<BR>
+
+\anchor main_OCaml_C_polyhedron_functions
+<H1> C_Polyhedron Functions </H1>
+Here we describe the main functions available for PPL objects
+defining convex and closed polyhedra.
+
+<H2><CODE>
+  ppl_new_C_Polyhedron_from_space_dimension space_dimension universe_or_empty
+</CODE>
+</H2>
+   Returns a handle to a C polyhedron \f$\cP\f$
+   with <CODE>space_dimension</CODE> dimensions; it is empty
+   or the universe polyhedron depending on whether
+   <CODE>universe_or_empty</CODE>
+   is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron handle
+ </CODE></H2>
+   If <CODE>handle</CODE> refers to a C polyhedron \f$\cP_1\f$,
+   then the expression will returns a handle to a
+   copy \f$\cP_2\f$ of \f$\cP_1\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron handle
+ </CODE></H2>
+   If <CODE>handle</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+   then the expression returns a handle to a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+
+   When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+   care must be taken that the source polyhedron referenced by
+   <CODE>handle</CODE> is topologically closed.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_constraints constraint_system
+ </CODE></H2>
+   Returns a handle to a C polyhedron \f$\cP\f$ represented by
+   <CODE>constraint_system</CODE>.
+
+<H2><CODE>
+   ppl_new_C_Polyhedron_from_generators generator_system
+ </CODE></H2>
+   Returns a handle to a C polyhedron \f$\cP\f$ represented by
+   <CODE>generator_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_swap handle_1 handle_2 </CODE></H2>
+   Swaps the polyhedron \f$\cP\f$ referenced by <CODE>handle_1</CODE>
+   with the polyhedron \f$\cQ\f$ referenced by <CODE>handle_2</CODE>.
+   The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_Polyhedron_space_dimension handle </CODE></H2>
+   Returns the dimension of the vector space in which the
+   polyhedron referenced by
+   <CODE>handle</CODE> is embedded.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension handle
+</CODE></H2>
+   Returns the actual dimension of the polyhedron referenced by
+   <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints handle
+ </CODE></H2>
+   Return a list of the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_constraints handle
+ </CODE></H2>
+   Returns a minimized list of the constraints in the constraints system
+   representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_generators handle
+ </CODE></H2>
+   Returns a list of the generators in the generators system
+   representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_minimized_generators handle
+ </CODE></H2>
+   Returns a minimized list of the generators in the generators system
+   representing the polyhedron referenced by <CODE>handle</CODE>.
+
+<H2><CODE> ppl_Polyhedron_relation_with_constraint handle constraint
+</CODE></H2>
+   Returns the list of relations the polyhedron referenced by
+   <CODE>handle</CODE> has with <CODE>constraint</CODE>.
+   The possible relations and their meaning is given in Section
+   \extref{relation_with, Relation-With Operators}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator handle generator
+</CODE></H2>
+  Returns the list of relations the polyhedron referenced by
+   <CODE>handle</CODE> has with <CODE>generator</CODE>.
+   The possible relations and their meaning is given in Section
+   \extref{relation_with, Relation-With Operators}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_is_empty handle </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE> is empty and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_is_universe handle </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE> is the universe and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_is_bounded handle </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE> is bounded and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_contains_integer_point handle </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE> contains at least one integer point and false,
+   otherwise.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above handle lin_expr </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE>  is bounded from above by <CODE>lin_expr</CODE>
+   and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below handle lin_expr </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE>  is bounded from below by <CODE>lin_expr</CODE>
+   and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_maximize handle lin_expr </CODE></H2>
+  Returns a record
+  <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2</CODE> where:
+  <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+  <CODE>handle</CODE> is not empty
+  and <CODE>lin_expr</CODE> is bounded from above in \f$P\f$ and
+  false, otherwise.
+  <CODE>coefficient_1</CODE> is the numerator of
+  the supremum value and <CODE>coefficient_2</CODE> the denominator
+  of the supremum value.
+  If the supremum is also the maximum, <CODE>bool_2</CODE> is true
+  and false, otherwise.
+
+<H2><CODE>
+  ppl_Polyhedron_maximize_with_point handle lin_expr
+ </CODE></H2>
+  Returns a record
+  <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2 * Point</CODE>
+  <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+  <CODE>handle</CODE> is not empty
+  and <CODE>lin_expr</CODE> is bounded from above in \f$P\f$ and
+  false, otherwise.
+  <CODE>coefficient_1</CODE> is the numerator of
+  the supremum value and <CODE>coefficient_2</CODE> the denominator
+  of the supremum value.
+  If the supremum is also the maximum, <CODE>bool_2</CODE> is true
+  and false, otherwise.
+  <CODE>Point</CODE> is the point or closure point where
+  <CODE>lin_expr</CODE> reaches the supremum.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize handle lin_expr
+</CODE></H2>
+  Returns a record
+  <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2</CODE>
+  <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+  <CODE>handle</CODE> is not empty
+  and <CODE>lin_expr</CODE> is bounded from below in \f$P\f$ and
+  false, otherwise.
+  <CODE>coefficient_1</CODE> is the numerator of
+  the infinum value and <CODE>coefficient_2</CODE> the denominator
+  of the infinum value.
+  If the infinum is also the minimum, <CODE>bool_2</CODE> is true
+  and false, otherwise.
+
+<H2><CODE>
+  ppl_Polyhedron_minimize_with_point handle lin_expr
+</CODE></H2>
+  Returns a record
+  <CODE>bool_1 * coefficient_1 * coefficient_2 * bool_2</CODE>
+  <CODE>bool_1</CODE> is true if the polyhedron \f$P\f$ referenced by
+  <CODE>handle</CODE> is not empty
+  and <CODE>lin_expr</CODE> is bounded from below in \f$P\f$ and
+  false, otherwise.
+  <CODE>coefficient_1</CODE> is the numerator of
+  the infinum value and <CODE>coefficient_2</CODE> the denominator
+  of the infinum value.
+  If the infinum is also the minimum, <CODE>bool_2</CODE> is true
+  and false, otherwise.
+  <CODE>Point</CODE> is the point or closure point where
+  <CODE>lin_expr</CODE> reaches the infinum.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed handle </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE> is topologically closed and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron handle_1 handle_2
+</CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle_2</CODE>  is included in or
+   equal to the polyhedron referenced by <CODE>handle_1</CODE>
+   and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron handle_1 handle_2
+</CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle_2</CODE>  is included in but not
+   equal to the polyhedron referenced by <CODE>handle_1</CODE>
+   and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron handle_1 handle_2
+     </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle_1</CODE>  is disjoint from the polyhedron referenced by
+   <CODE>handle_2</CODE> and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron handle_1 handle_2 </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle_1</CODE>  is equal to the polyhedron referenced by
+   <CODE>handle_2</CODE> and false, otherwise.
+
+<H2><CODE> ppl_Polyhedron_OK handle </CODE></H2>
+   Returns true if the polyhedron referenced by
+   <CODE>handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants and false, otherwise.
+   Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint handle constraint </CODE></H2>
+   Updates the polyhedron referenced by <CODE>handle</CODE> to
+   one obtained by adding
+   <CODE>constraint</CODE> to its constraint system.
+
+<H2><CODE> ppl_Polyhedron_add_generator handle generator </CODE></H2>
+   Updates the polyhedron referenced by <CODE>handle</CODE> to
+   one obtained by adding
+   <CODE>generator</CODE> to its generator system.
+
+<H2><CODE> ppl_Polyhedron_add_constraints handle constraint_system
+ </CODE></H2>
+   Updates the polyhedron referenced by <CODE>handle</CODE> to
+   one obtained by adding to its constraint system the constraints in
+   <CODE>constraint_system</CODE>.
+
+<H2><CODE> ppl_C_Polyhedron_add_generators handle generator_system
+ </CODE></H2>
+   Updates the polyhedron referenced by <CODE>handle</CODE> to
+   one obtained by adding to its generator system the generators in
+   <CODE>generator_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_intersection_assign handle_1 handle_2
+</CODE></H2>
+   Assigns to the polyhedron referenced by <CODE>handle_1</CODE>
+   its intersection with the polyhedron referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_hull_assign handle_1 handle_2 </CODE></H2>
+   Assigns to the polyhedron referenced by <CODE>handle_1</CODE>
+   its poly-hull with the polyhedron referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_poly_difference_assign handle_1 handle_2
+</CODE></H2>
+   Assigns to the polyhedron referenced by <CODE>handle_1</CODE>
+   its poly-difference with the polyhedron referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_image handle var
+                                       lin_expr coefficient
+</CODE></H2>
+   Transforms the polyhedron referenced by <CODE>handle</CODE>
+   assigning the affine expression
+   <CODE>lin_expr</CODE>/<CODE>coefficient</CODE> to <CODE>var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage handle var
+                                          lin_expr coefficient
+</CODE></H2>
+This is the inverse transformation to that for <CODE>ppl_affine_image</CODE>.
+
+<H2><CODE> ppl_Polyhedron_bounded_affine_image handle
+                                               var
+                                               lin_expr_1
+                                               lin_expr_2
+                                               coefficient
+</CODE></H2>
+   Transforms the polyhedron referenced by <CODE>handle</CODE>
+   assigning the image with respect to the transfer relation
+   <CODE>lin_expr_1/coefficient <= var <= lin_expr_2/coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image handle
+                                                   var
+                                                   Relation_Symbol
+                                                   lin_expr
+                                                   coefficient
+</CODE></H2>
+   Transforms the polyhedron referenced by <CODE>handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>var</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>lin_expr</CODE>/<CODE>coefficient</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image_lhs_rhs handle
+                                                           lin_expr_1
+                                                           Relation_Symbol
+                                                           lin_expr_2
+</CODE></H2>
+   Transforms the polyhedron referenced by <CODE>handle</CODE>
+   assigning the generalized
+   affine image with respect to the transfer function
+   <CODE>lin_expr_1</CODE> <CODE>Relation_Symbol</CODE>
+   <CODE>lin_expr_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_time_elapse_assign handle_1 handle_2 </CODE></H2>
+   Assigns to the polyhedron \f$\cP\f$ referenced by <CODE>handle_1</CODE>
+   the time-elapse \f$ (\cP \nearrow \cQ)\f$
+   with the polyhedron \f$\cQ\f$ referenced by <CODE>handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign handle_1 handle_2
+</CODE></H2>
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   then <CODE>handle_1</CODE> will refer to
+   the BHRZ03-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_BHRZ03_widening_assign_with_tokens handle_1
+                                                             handle_2
+                                                             c_unsigned_1
+</CODE></H2>
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+   is the number of tokens available,
+   Then this function will return the number of tokens remaining at the
+   end of the operation.
+
+<H2><CODE>
+   ppl_Polyhedron_limited_BHRZ03_extrapolation_assign handle_1
+                                                      handle_2
+                                                      constraint_system
+</CODE></H2>
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   then <CODE>handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>constraint_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+               handle_1
+               handle_2
+               constraint_system
+               c_unsigned_1 </CODE></H2>
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>constraint_system</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+   is the number of tokens available,
+   then this function will return the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+               handle_1
+               handle_2
+               constraint_system
+</CODE></H2>
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   then <CODE>handle_1</CODE> will refer to
+   the BHRZ03-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>constraint_system</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+               handle_1
+               handle_2
+               constraint_system
+               c_unsigned_1
+</CODE></H2>
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>handle_2</CODE>;
+   let \f$\cP\f$ denote the BHRZ03-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$ improved by enforcing those constraints in
+   <CODE>constraint_system</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+   is the number of tokens available,
+   this function will return the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign handle_1 handle_2
+</CODE></H2>
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   then <CODE>handle_1</CODE> will refer to
+   the H79-widening of \f$\cP_1\f$ with \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_H79_widening_assign_with_tokens handle_1
+                                                          handle_2
+                                                          c_unsigned_1
+</CODE></H2>
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-widening of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+   is the number of tokens available,
+   Then this function will return the number of tokens remaining at the
+   end of the operation.
+
+<H2><CODE>
+   ppl_Polyhedron_limited_H79_extrapolation_assign handle_1
+                                                      handle_2
+                                                      constraint_system
+</CODE></H2>
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   then <CODE>handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>constraint_system</CODE>.
+
+<H2><CODE> ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+               handle_1
+               handle_2
+               constraint_system
+               c_unsigned_1 </CODE></H2>
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of
+   \f$\cP_1\f$ with \f$\cP_2\f$,
+   improved by enforcing those constraints in <CODE>constraint_system</CODE>.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+   is the number of tokens available,
+   then this function will return the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign
+               handle_1
+               handle_2
+               constraint_system
+</CODE></H2>
+   If the polyhedron \f$\cP_1\f$ referenced by <CODE>handle_1</CODE>
+   contains the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   then <CODE>handle_1</CODE> will refer to
+   the H79-extrapolation of \f$\cP_1\f$ with \f$\cP_2\f$
+   improved by enforcing the constraints in
+   <CODE>constraint_system</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+
+<H2><CODE> ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+               handle_1
+               handle_2
+               constraint_system
+               c_unsigned_1
+</CODE></H2>
+   It is assumed that the polyhedron \f$\cP_1\f$ referenced by
+   <CODE>handle_1</CODE> contains the polyhedron \f$\cP_2\f$
+   referenced by <CODE>handle_2</CODE>;
+   let \f$\cP\f$ denote the H79-extrapolation of \f$\cP_1\f$ with
+   \f$\cP_2\f$, improved by enforcing those constraints in
+   <CODE>constraint_system</CODE> together with all constraints of
+   the form \f$\pm x \leq r\f$ and \f$\pm x < r\f$ that are satisfied
+   by every point in \f$\cP_1\f$.
+   <BR>
+   Assuming that the quantity \f$t_1\f$ given by <CODE>c_unsigned_1</CODE>
+   is the number of tokens available,
+   this function will return the number of tokens
+   \f$t_2\f$ remaining at the end of the operation.
+
+<H2><CODE> ppl_Polyhedron_topological_closure_assign handle </CODE></H2>
+   Assigns to the polyhedron referenced by <CODE>handle</CODE>
+   its topological closure.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_embed handle
+                                                         space_dimension
+ </CODE></H2>
+   Embeds the polyhedron  referenced by <CODE>handle</CODE>
+   in a space that is enlarged by <CODE>space_dimension</CODE> dimensions,
+
+<H2><CODE> ppl_Polyhedron_concatenate_assign handle_1 handle_2 </CODE></H2>
+   Updates the polyhedron \f$\cP_1\f$ referenced  by <CODE>handle_1</CODE>
+   by first embedding \f$\cP_1\f$ in a new space enlarged by
+   the space dimensions
+   of the polyhedron \f$\cP_2\f$ referenced by <CODE>handle_2</CODE>,
+   and then adds to its system of constraints
+   a renamed-apart version of the constraints of  \f$\cP_2\f$.
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project handle
+                                                           space_dimension
+ </CODE></H2>
+
+   Projects the polyhedron  referenced by <CODE>handle</CODE>
+   onto a space that is enlarged by <CODE>space_dimension</CODE> dimensions,
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions handle
+                                                  Int_List
+</CODE></H2>
+   Removes the space dimensions given by the identifiers of the
+   PPL variables in list <CODE>Int_List</CODE>
+   from the polyhedron  referenced by <CODE>handle</CODE>.
+   The identifiers for the remaining PPL variables are renumbered so that
+   they are consecutive and the maximum index is less than the number
+   of dimensions.
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions handle
+                                                         space_dimension
+</CODE></H2>
+   Projects the polyhedron  referenced to by <CODE>handle</CODE>
+   onto  the first <CODE>space_dimension</CODE> dimensions.
+
+<H2><CODE>
+  ppl_Polyhedron_expand_space_dimension handle var space_dimension
+</CODE></H2>
+   <CODE>space_dimension</CODE> copies of the space dimension referenced by
+   variable <CODE>var</CODE> are added to the polyhedron
+   referenced to by <CODE>handle</CODE>.
+
+<H2><CODE>
+  ppl_Polyhedron_fold_space_dimensions handle list_of_vars var
+</CODE></H2>
+   The space dimensions referenced by the PPL variables in list
+   <CODE>list_of_vars</CODE> are folded into the dimension referenced
+   by <CODE>var</CODE> and removed.
+   The result is undefined if <CODE>list_of_vars</CODE>
+   does not have the properties described in Section
+   \extref{fold_space_dimensions,
+   Folding Multiple Dimensions of the Vector Space into One Dimension}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_map_space_dimensions handle p_func </CODE></H2>
+   Maps the space dimensions of the polyhedron referenced by
+   <CODE>handle</CODE>
+   using the partial function defined by a list of pairs of integers
+   <CODE>p_func</CODE>.
+   The result is undefined if \p p_func does not encode a partial
+   function with the properties described in
+   Section \extref{Mapping_the_Dimensions_of_the_Vector_Space,
+   Mapping the Dimensions of the Vector Space}
+   of the main PPL user manual.
+
+<H2><CODE> ppl_Polyhedron_wrap_assign handle
+                                      list_of_vars
+                                      width
+                                      representation
+                                      overflow
+                                      constraint_system
+                                      complexity_threshold
+                                      wrap_indicator
+</CODE></H2>
+
+    Transforms the polyhedron referenced by <CODE>handle</CODE> by
+    wrapping the dimensions given by <CODE>list_of_vars</CODE> while
+    respecting the specified <CODE>width</CODE>,
+    <CODE>representation</CODE> and <CODE>overflow</CODE> behavior of
+    all these variables. The parameter <CODE>constraint_system</CODE>
+    represents the conditional or looping construct guard with respect
+    to which wrapping is performed.  The non-negative integer
+    <CODE>complexity_threshold</CODE> and Boolean
+    <CODE>wrap_indicator</CODE> allow control of the
+    complexity/precision ratio; higher values for
+    <CODE>complexity_threshold</CODE> will lead to possibly greater
+    precision while a true value for <CODE>wrap_indicator</CODE>
+    indicates that the space dimensions should be wrapped
+    individually.  See Section \extref{Wrapping_Operator, Wrapping
+    Operator} for a more detailed description of this operator.
+
+<H2><CODE>
+  ppl_Polyhedron_ascii_dump handle
+</CODE></H2>
+   Returns a string containing an ASCII dump of the internal representation
+   of the polyhedron referenced by <CODE>handle</CODE>. Useful for
+   debugging purposes.
+
+
+\anchor OCamldoc_Documentation
+<H1>OCamldoc Documentation</H1>
+
+\htmlonly
+For a list of the PPL functions available to the generated domains
+for the OCaml interface, see the
+<A HREF="ocamldoc/index.html">OCamldoc-generated documentation</a>.
+<P>
+\endhtmlonly
+
+<strong>NOTE:</strong>
+the complete documentation for module <code>Ppl_ocaml</code>, including
+all the types and functions that were enabled at configuration time, is
+only available in the <em>configuration dependent</em> OCamldoc
+documentation.
+The configuration independent OCamldoc documentation only contains
+those types and functions that are always enabled, which are grouped
+into module <code>Ppl_ocaml_globals</code>.
+Also note that module <code>Ppl_ocaml</code> automatically includes
+module <code>Ppl_ocaml_globals</code>.
+
+\latexonly
+\input ocamldoc.tex
+\endlatexonly
+
+\anchor OI_Compilation
+<H1>Compilation and Installation</H1>
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of the OCaml system.  If OCaml is correctly installed in a standard location,
+things are arranged so that the OCaml interface is built and installed.
+
+*/ /* \mainpage */
diff --git a/interfaces/OCaml/README.ocaml b/interfaces/OCaml/README.ocaml
new file mode 100644
index 0000000..b88415d
--- /dev/null
+++ b/interfaces/OCaml/README.ocaml
@@ -0,0 +1,55 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The Objective Caml interface of the Parma Polyhedra Library requires
+OCaml version 3.09 or higher and the MLGMP wrapper to the GMP library
+(http://caml.inria.fr/cgi-bin/hump.en.cgi?contrib=278).  Note that
+MLGMP, by default, requires the MPFR library (http://www.mpfr.org/) in
+addition to GMP.
+
+In order to install MLGMP you should make sure that GMP_INCLUDES and
+GMP_LIBDIR are correctly set (these variables are defined at the
+beginning of Makefile in the MLGMP's root directory).  A `make'
+followed by `make install' (using GNU Make) should now be enough.
+
+The Objective Caml interface provides the module Ppl_ocaml.
+The implementation of the module relies on a library of interface
+functions (libppl_ocaml.a): see the Makefile.am file in directory
+`tests' for an example of how to compile and link an OCaml program
+accessing the Parma Polyhedra Library via this interface.
+
+After installing the Parma Polyhedra Library in <PPL prefix>,
+the OCaml interface files will be installed in <PPL-OCaml libdir>,
+where either <PPL-OCaml libdir> = <PPL prefix>/lib/ppl or
+<PPL-OCaml libdir> = <PPL prefix>/lib64/ppl, depending on the
+architecture and on the system/distribution conventions.
+The OCaml compilation command for `my_program.ml' should then be
+something like:
+
+$ ocamlc -o my_program.cmo -c -I +gmp -I <PPL-OCaml libdir> my_program.ml
+
+A possible link command is the following (we refer the reader to the
+Objective Caml documentation for a reference to the many available
+linking options):
+
+$ ocamlc -o my_program -custom -cc g++ -I +gmp -I <PPL-OCaml libdir> \
+    -cclib -lppl -cclib -lm -cclib -lgmpxx -cclib -lgmp \
+    ppl_ocaml.cma gmp.cma my_program.cmo
+
+If native compilation of OCaml code is supported by the build platform,
+then `my_program.ml' can also be compiled/linked to native code as follows:
+
+$ ocamlopt -o my_program.cmx \
+    -c -I +gmp -I <PPL-OCaml libdir> my_program.ml
+$ ocamlopt -o my_program.opt -cc g++ -I +gmp -I <PPL-OCaml libdir> \
+    -cclib -lppl -cclib -lm -cclib -lgmpxx -cclib -lgmp \
+    ppl_ocaml.cmxa gmp.cmxa my_program.cmx
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
new file mode 100644
index 0000000..89a3b2a
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_code.m4
@@ -0,0 +1,1544 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+This m4 file contains the program implementation code for generating the
+files ppl_ocaml_DOMAIN.cc for each interface domain DOMAIN
+in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the OCaml interface.
+dnl
+m4_define(`ppl_delete_ at CLASS@_code', `')
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+dnl There is no code at present for these procedures in the OCaml interface.
+dnl Remove the macro if its definition is added.
+
+m4_define(`m4_custom_operations_class_code',
+`dnl
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+struct custom_operations m4_current_interface`'_custom_operations = {
+  "com.bugseng.ppl" "." PPL_VERSION "." "m4_current_interface"|COMMA|
+  custom_`'m4_current_interface`'_finalize|COMMA|
+  custom_compare_default|COMMA|
+  custom_hash_default|COMMA|
+  custom_serialize_default|COMMA|
+  custom_deserialize_default|COMMA|
+  custom_compare_ext_default
+};
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(value d, value caml_de) try {
+  CAMLparam2(d, caml_de);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  const Degenerate_Element ppl_de = build_ppl_Degenerate_Element(caml_de);
+  @TOPOLOGY@@CPP_CLASS@& ppl_value = *new @TOPOLOGY@@CPP_CLASS@(dd, ppl_de);
+  CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(value cl) try {
+  CAMLparam1(cl);
+  @!BUILD_REPRESENT at _System cs = build_ppl_@!BUILD_REPRESENT at _System(cl);
+  @TOPOLOGY@@CPP_CLASS@& ppl_value = *new @TOPOLOGY@@CPP_CLASS@(cs);
+  CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(value ph, value c) try {
+  CAMLparam2(ph, c);
+  const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  @!RELATION_REPRESENT@ ppl_c = build_ppl_@!RELATION_REPRESENT@(c);
+  Poly_@!A_RELATION_REPRESENT at _Relation r = pph.relation_with(ppl_c);
+  CAMLreturn(build_ocaml_poly_ at A_RELATION_REPRESENT@_relation(r));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at DIMENSION@(value ph) try {
+  CAMLparam1(ph);
+  const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  dimension_type d = pph. at DIMENSION@();
+  CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at HAS_PROPERTY@(value ph) try {
+  CAMLparam1(ph);
+  const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  CAMLreturn(Val_bool(pph. at HAS_PROPERTY@()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at SIMPLIFY@(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph. at SIMPLIFY@();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(value ph, value le) try {
+  CAMLparam2(ph, le);
+  const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  Linear_Expression ple = build_ppl_Linear_Expression(le);
+  CAMLreturn(Val_bool(pph.bounds_from_ at ABOVEBELOW@(ple)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@(value ph, value c) try {
+  CAMLparam2(ph, c);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  @!CLASS_REPRESENT@ pc = build_ppl_@!CLASS_REPRESENT@(c);
+  pph.add_ at CLASS_REPRESENT@(pc);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(value ph, value cs) try {
+  CAMLparam2(ph, cs);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  @!CLASS_REPRESENT at _System pcs = build_ppl_@!CLASS_REPRESENT at _System(cs);
+  pph.add_ at CLASS_REPRESENT@s(pcs);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(value ph, value c) try {
+  CAMLparam2(ph, c);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  @!REFINE_REPRESENT@ pc = build_ppl_@!REFINE_REPRESENT@(c);
+  pph.refine_with_ at REFINE_REPRESENT@(pc);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(value ph, value cs) try {
+  CAMLparam2(ph, cs);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  @!REFINE_REPRESENT at _System pcs = build_ppl_@!REFINE_REPRESENT at _System(cs);
+  pph.refine_with_ at REFINE_REPRESENT@s(pcs);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  const @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  CAMLreturn(Val_bool(pph1. at COMPARISON@(pph2)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_equals_ at CLASS@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  const @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  CAMLreturn(Val_bool(pph1 == pph2));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at BINOP@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  pph1. at BINOP@(pph2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_positive_time_elapse_assign(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  if (Interfaces::is_necessarily_closed_for_interfaces
+        (*p_Polyhedron_val(ph1))) {
+    C_Polyhedron& xx
+      = static_cast<C_Polyhedron&>(*p_Polyhedron_val(ph1));
+    const C_Polyhedron& yy
+      = static_cast<const C_Polyhedron&>(*p_Polyhedron_val(ph2));
+    xx.positive_time_elapse_assign(yy);
+  }
+  else {
+    NNC_Polyhedron& xx
+      = static_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph1));
+    const NNC_Polyhedron& yy
+      = static_cast<const NNC_Polyhedron&>(*p_Polyhedron_val(ph2));
+    xx.positive_time_elapse_assign(yy);
+  }
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_simplify_using_context_assign(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  CAMLreturn(Val_bool(pph1.simplify_using_context_assign(pph2)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+(value ph, value d) try {
+  CAMLparam2(ph, d);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.add_space_dimensions_and_embed(dd);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_remove_space_dimensions(value ph, value caml_vset) try {
+  CAMLparam2(ph, caml_vset);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.remove_space_dimensions(build_ppl_Variables_Set(caml_vset));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_remove_higher_space_dimensions(value ph, value d) try {
+  CAMLparam2(ph, d);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.remove_higher_space_dimensions(dd);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_fold_space_dimensions
+(value ph, value caml_vset, value caml_dim) try {
+  CAMLparam1(ph);
+  const dimension_type ppl_dim = Int_val(caml_dim);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  Variables_Set ppl_vset;
+  if (Int_val(caml_vset) == 0)
+    CAMLreturn(Val_unit);
+  while (true) {
+    ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+    if (Int_val(Field(caml_vset, 1)) == 0)
+      break;
+    caml_vset = Field(caml_vset, 1);
+  }
+  pph.fold_space_dimensions(ppl_vset, Variable(ppl_dim));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_map_space_dimensions(value ph, value caml_mapped_dims) try {
+  CAMLparam2(ph, caml_mapped_dims);
+  CAMLlocal1(head);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  Partial_Function pfunc;
+  while (caml_mapped_dims != Val_emptylist) {
+    head = Field(caml_mapped_dims, 0);
+    const dimension_type domain_dim = value_to_ppl_dimension(Field(head, 0));
+    const dimension_type codomain_dim = value_to_ppl_dimension(Field(head, 1));
+    pfunc.insert(domain_dim, codomain_dim);
+    caml_mapped_dims = Field(caml_mapped_dims, 1);
+  }
+  pph.map_space_dimensions(pfunc);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_expand_space_dimension
+(value ph, value var_index, value m) try {
+  CAMLparam3(ph, var_index, m);
+  const Variable var = build_ppl_Variable(var_index);
+  const dimension_type c_m = value_to_ppl_dimension(m);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.expand_space_dimension(var, c_m);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_some_non_integer_points
+(value ph, value caml_cc) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  const Complexity_Class ppl_cc = build_ppl_Complexity_Class(caml_cc);
+  pph.drop_some_non_integer_points(ppl_cc);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_some_non_integer_points_2
+(value ph, value caml_vset, value caml_cc) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  Variables_Set ppl_vset;
+  if (Int_val(caml_vset) == 0)
+    CAMLreturn(Val_unit);
+  while (true) {
+    ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+    if (Int_val(Field(caml_vset, 1)) == 0)
+      break;
+    caml_vset = Field(caml_vset, 1);
+  }
+  const Complexity_Class ppl_cc = build_ppl_Complexity_Class(caml_cc);
+  pph.drop_some_non_integer_points(ppl_vset, ppl_cc);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  CAMLreturn(build_ocaml_ at CLASS_REPRESENT@_system(pph. at CLASS_REPRESENT@s()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  CAMLreturn(build_ocaml_ at CLASS_REPRESENT@_system(pph.minimized_ at CLASS_REPRESENT@s()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_constrains(value ph, value var) try {
+  CAMLparam2(ph, var);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  CAMLreturn(Val_bool(pph.constrains(build_ppl_Variable(var))));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_unconstrain_space_dimension(value ph, value var) try {
+  CAMLparam2(ph, var);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.unconstrain(build_ppl_Variable(var));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_unconstrain_space_dimensions(value ph, value caml_vset) try {
+  CAMLparam2(ph, caml_vset);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.unconstrain(build_ppl_Variables_Set(caml_vset));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_bounded_ at AFFIMAGE@(value ph, value var, value lb_expr,
+				    value ub_expr, value coeff) try {
+  CAMLparam5(ph, var, lb_expr, ub_expr, coeff);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.bounded_ at AFFIMAGE@(build_ppl_Variable(var),
+			   build_ppl_Linear_Expression(lb_expr),
+ 			   build_ppl_Linear_Expression(ub_expr),
+ 			   build_ppl_Coefficient(coeff));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at AFFIMAGE@
+(value ph, value var, value expr, value coeff) try {
+  CAMLparam4(ph, var, expr, coeff);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  build_ppl_Linear_Expression(expr);
+  pph. at AFFIMAGE@(build_ppl_Variable(var),
+		   build_ppl_Linear_Expression(expr),
+		   build_ppl_Coefficient(coeff));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1
+(value ph, value le1, value rel_sym, value le2) try {
+  CAMLparam4(ph, le1, rel_sym, le2);
+  build_ppl_relsym(rel_sym);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Linear_Expression(le1),
+			       build_ppl_relsym(rel_sym),
+			       build_ppl_Linear_Expression(le2));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@2
+(value ph, value int_val, value rel_sym, value le, value caml_coeff) try {
+  CAMLparam5(ph, int_val, rel_sym, le, caml_coeff);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Variable(int_val),
+			       build_ppl_relsym(rel_sym),
+			       build_ppl_Linear_Expression(le),
+			       build_ppl_Coefficient(caml_coeff));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence
+(value ph, value int_val, value rel_sym, value le,
+ value caml_coeff, value caml_modulus) try {
+  CAMLparam5(ph, int_val, rel_sym, le, caml_coeff);
+  CAMLxparam1(caml_modulus);
+  build_ppl_relsym(rel_sym);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Variable(int_val),
+			       build_ppl_relsym(rel_sym),
+			       build_ppl_Linear_Expression(le),
+			       build_ppl_Coefficient(caml_coeff),
+			       build_ppl_Coefficient(caml_modulus));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence_bytecode
+(value* argv, int /*argn*/) try {
+  return ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence
+    (argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_generalized_ at AFFIMAGE@1_lhs_rhs_with_congruence
+(value ph, value le1, value rel_sym, value le2, value caml_modulus) try {
+  CAMLparam5(ph, le1, rel_sym, le2, caml_modulus);
+  build_ppl_relsym(rel_sym);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  pph.generalized_ at AFFIMAGE@(build_ppl_Linear_Expression(le1),
+			     build_ppl_relsym(rel_sym),
+			     build_ppl_Linear_Expression(le2),
+			     build_ppl_Coefficient(caml_modulus));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at WIDEN@_widening_assign(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  pph1. at WIDEN@_widening_assign(pph2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+(value ph1, value ph2, value tokens) try {
+  CAMLparam3(ph1, ph2, tokens);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+  pph1. at WIDEN@_widening_assign(pph2, &u_tokens);
+  CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_widening_assign(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  pph1.widening_assign(pph2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_widening_assign_with_tokens
+(value ph1, value ph2, value tokens) try {
+  CAMLparam3(ph1, ph2, tokens);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+  pph1.widening_assign(pph2, &u_tokens);
+  CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+(value ph1, value ph2, value caml_cs, value tokens) try {
+  CAMLparam4(ph1, ph2, caml_cs, tokens);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  const @!CONSTRAINER at _System ppl_cs = build_ppl_@!CONSTRAINER at _System(caml_cs);
+  unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+  pph1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(pph2, ppl_cs,
+							 &u_tokens);
+  CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(value ph1,
+						   value ph2,
+						   value caml_cs) try {
+  CAMLparam3(ph1, ph2, caml_cs);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  const @!CONSTRAINER at _System ppl_cs = build_ppl_@!CONSTRAINER at _System(caml_cs);
+  pph1. at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(pph2, ppl_cs);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound(value ph, value var) try {
+  CAMLparam2(ph, var);
+  CAMLlocal1(caml_return_value);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  Variable vv = build_ppl_Variable(var);
+  PPL_DIRTY_TEMP_COEFFICIENT(num);
+  PPL_DIRTY_TEMP_COEFFICIENT(den);
+  bool is_closed = false;
+  bool ppl_return_value = pph.has_ at UPPERLOWER@_bound(vv, num, den, is_closed);
+  caml_return_value = caml_alloc(4, 0);
+  Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+  Store_field(caml_return_value, 1, build_ocaml_coefficient(num));
+  Store_field(caml_return_value, 2, build_ocaml_coefficient(den));
+  Store_field(caml_return_value, 3, Val_bool(is_closed));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at MAXMIN@(value ph, value caml_le) try {
+  CAMLparam2(ph, caml_le);
+  CAMLlocal1(caml_return_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(num);
+  PPL_DIRTY_TEMP_COEFFICIENT(den);
+  bool is_supremum = false;
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  bool ppl_return_value = pph. at MAXMIN@(build_ppl_Linear_Expression(caml_le),
+				      num, den, is_supremum);
+  caml_return_value = caml_alloc(4, 0);
+  Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+  Store_field(caml_return_value, 1, build_ocaml_coefficient(num));
+  Store_field(caml_return_value, 2, build_ocaml_coefficient(den));
+  Store_field(caml_return_value, 3, Val_bool(is_supremum));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at MAXMIN@_with_point(value ph, value caml_le) try {
+  CAMLparam2(ph, caml_le);
+  CAMLlocal1(caml_return_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(num);
+  PPL_DIRTY_TEMP_COEFFICIENT(den);
+  bool is_supremum = false;
+  Generator g = point();
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  bool ppl_return_value = pph. at MAXMIN@(build_ppl_Linear_Expression(caml_le),
+				      num, den, is_supremum, g);
+  caml_return_value = caml_alloc(5, 0);
+  Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+  Store_field(caml_return_value, 1, build_ocaml_coefficient(num));
+  Store_field(caml_return_value, 2, build_ocaml_coefficient(den));
+  Store_field(caml_return_value, 3, Val_bool(is_supremum));
+  Store_field(caml_return_value, 4, build_ocaml_generator(g));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_frequency(value ph, value caml_le) try {
+  CAMLparam2(ph, caml_le);
+  CAMLlocal1(caml_return_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(f_num);
+  PPL_DIRTY_TEMP_COEFFICIENT(f_den);
+  PPL_DIRTY_TEMP_COEFFICIENT(v_num);
+  PPL_DIRTY_TEMP_COEFFICIENT(v_den);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  bool ppl_return_value = pph.frequency(build_ppl_Linear_Expression(caml_le),
+				        f_num, f_den, v_num, v_den);
+  caml_return_value = caml_alloc(5, 0);
+  Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+  Store_field(caml_return_value, 1, build_ocaml_coefficient(f_num));
+  Store_field(caml_return_value, 2, build_ocaml_coefficient(f_den));
+  Store_field(caml_return_value, 3, build_ocaml_coefficient(v_num));
+  Store_field(caml_return_value, 4, build_ocaml_coefficient(v_den));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_OK(value ph) try {
+  CAMLparam1(ph);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  CAMLreturn(Val_bool(pph.OK()));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at MEMBYTES@(value ph) try {
+  CAMLparam1(ph);
+  const @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  CAMLreturn(Val_long(pph. at MEMBYTES@()));
+}
+CATCH_ALL
+
+ ')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_swap(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  swap(pph1, pph2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(value ph) try {
+  CAMLparam1(ph);
+  @B_FRIEND@& pph = *(reinterpret_cast<@B_FRIEND@*>(p_ at A_FRIEND@_val(ph)));
+  const @CPP_CLASS@& ppl_value
+    = *(reinterpret_cast<@CPP_CLASS@*>(new @TOPOLOGY@@CPP_CLASS@(pph)));
+  CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(value ph, value caml_cc) try {
+  CAMLparam1(ph);
+  @B_FRIEND@& pph = *(reinterpret_cast<@B_FRIEND@*>( p_ at A_FRIEND@_val(ph)));
+  const Complexity_Class ppl_cc = build_ppl_Complexity_Class(caml_cc);
+  @CPP_CLASS@& ppl_value
+    = *(reinterpret_cast<@CPP_CLASS@*>(new @TOPOLOGY@@CPP_CLASS@(pph, ppl_cc)));
+  CAMLreturn(unregistered_value_p_ at CLASS@(ppl_value));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at UB_EXACT@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+`m4_ifelse(m4_current_interface, `Polyhedron',
+          `m4_ub_exact_for_polyhedron_domains',
+          `m4_ub_exact_for_non_polyhedron_domains')'dnl
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_ub_exact_for_polyhedron_domains',
+`dnl
+  if (Interfaces::is_necessarily_closed_for_interfaces
+        (*p_Polyhedron_val(ph1))) {
+    C_Polyhedron& xx
+      = static_cast<C_Polyhedron&>(*p_Polyhedron_val(ph1));
+    const C_Polyhedron& yy
+      = static_cast<const C_Polyhedron&>(*p_Polyhedron_val(ph2));
+    CAMLreturn(Val_bool(xx.upper_bound_assign_if_exact(yy)));
+  }
+  else {
+    NNC_Polyhedron& xx
+      = static_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph1));
+    const NNC_Polyhedron& yy
+      = static_cast<const NNC_Polyhedron&>(*p_Polyhedron_val(ph2));
+    CAMLreturn(Val_bool(xx.upper_bound_assign_if_exact(yy)));
+  }
+')
+
+m4_define(`m4_ub_exact_for_non_polyhedron_domains',
+`dnl
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+
+  CAMLreturn(Val_bool(pph1. at UB_EXACT@(pph2)));
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  pph1. at EXTRAPOLATION@_extrapolation_assign(pph2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+(value ph1, value ph2, value tokens) try {
+  CAMLparam3(ph1, ph2, tokens);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  unsigned u_tokens = value_to_unsigned<unsigned>(tokens);
+  pph1. at EXTRAPOLATION@_extrapolation_assign(pph2, &u_tokens);
+  CAMLreturn(Val_long(u_tokens));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(value ph1,
+                                                       value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  const @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  pph1. at EXTRAPOLATION@_narrowing_assign(pph2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at BEGINEND@_iterator(value t_pps) try {
+  CAMLparam1(t_pps);
+  @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+  @CPP_CLASS@::iterator& ppl_value
+    = *new @CPP_CLASS@::iterator(pps. at BEGINEND@());
+  CAMLreturn(unregistered_value_p_ at CLASS@_iterator(ppl_value));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_get_disjunct(value caml_it) try {
+  CAMLparam1(caml_it);
+  CAMLlocal1(caml_return_value);
+  @CPP_CLASS@::iterator& cpp_it  = *p_ at CLASS@_iterator_val(caml_it);
+  const @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& disjunct = cpp_it->pointset();
+  caml_return_value = unregistered_value_p_ at DISJUNCT@(disjunct);
+  actual_p_ at DISJUNCT@_val(caml_return_value)
+    = const_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(mark(&disjunct));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_add_disjunct(value t_pps, value caml_item_to_add) try {
+  CAMLparam2(t_pps, caml_item_to_add);
+  @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+  @DISJUNCT_TOPOLOGY@@A_DISJUNCT@& item
+    = *(reinterpret_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>
+          (p_ at DISJUNCT@_val(caml_item_to_add)));
+  pps.add_disjunct(item);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_disjunct(value t_pps, value caml_item_to_drop) try {
+  CAMLparam2(t_pps, caml_item_to_drop);
+  @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+  @CPP_CLASS@::iterator& itr = *p_ at CLASS@_iterator_val(caml_item_to_drop);
+  itr = pps.drop_disjunct(itr);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_drop_disjuncts
+(value t_pps, value caml_item1_to_drop, value caml_item2_to_drop) try {
+  CAMLparam3(t_pps, caml_item1_to_drop, caml_item2_to_drop);
+  @CPP_CLASS@& pps = *p_ at CLASS@_val(t_pps);
+  @CPP_CLASS@::iterator& itr1 = *p_ at CLASS@_iterator_val(caml_item1_to_drop);
+  @CPP_CLASS@::iterator& itr2 = *p_ at CLASS@_iterator_val(caml_item2_to_drop);
+  pps.drop_disjuncts(itr1, itr2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@::iterator*&
+p_ at CLASS@_iterator_val(value v) {
+  return *reinterpret_cast<@CPP_CLASS@::iterator**>(Data_custom_val(v));
+}
+
+void
+custom_ at CLASS@_iterator_finalize(value v) {
+  delete p_ at CLASS@_iterator_val(v);
+}
+
+struct custom_operations @CLASS at _iterator_custom_operations = {
+  "com.bugseng.ppl" "." PPL_VERSION "." "@CLASS at _iterator"|COMMA|
+  custom_ at CLASS@_iterator_finalize|COMMA|
+  custom_compare_default|COMMA|
+  custom_hash_default|COMMA|
+  custom_serialize_default|COMMA|
+  custom_deserialize_default|COMMA|
+  custom_compare_ext_default
+};
+
+inline value
+unregistered_value_p_ at CLASS@_iterator(const @CPP_CLASS@::iterator& ph) {
+  value v = caml_alloc_custom(&@CLASS at _iterator_custom_operations,
+                              sizeof(@CPP_CLASS@::iterator*), 0, 1);
+  p_ at CLASS@_iterator_val(v) = const_cast<@CPP_CLASS@::iterator*>(&ph);
+  return v;
+}
+
+extern "C"
+CAMLprim value
+ppl_new_ at CLASS@_iterator_from_iterator(value y) try {
+  CAMLparam1(y);
+  @CPP_CLASS@::iterator& yy
+    = *(reinterpret_cast<@CPP_CLASS@::iterator*>( p_ at CLASS@_iterator_val(y)));
+  @CPP_CLASS@::iterator& ppl_value
+    = *(reinterpret_cast<@CPP_CLASS@::iterator*>(new @CPP_CLASS@::iterator(yy)));
+  CAMLreturn(unregistered_value_p_ at CLASS@_iterator(ppl_value));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ at INCDEC@_iterator(value caml_itr) try {
+  CAMLparam1(caml_itr);
+  @CPP_CLASS@::iterator& itr = *p_ at CLASS@_iterator_val(caml_itr);
+  m4_ at INCDEC@_cpp_name()itr;
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_increment_cpp_name', `++')
+m4_define(`m4_decrement_cpp_name', `--')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_iterator_equals_iterator(value caml_itr1, value caml_itr2) try {
+  CAMLparam2(caml_itr1, caml_itr2);
+  @CPP_CLASS@::iterator& itr1 = *p_ at CLASS@_iterator_val(caml_itr1);
+  @CPP_CLASS@::iterator& itr2 = *p_ at CLASS@_iterator_val(caml_itr2);
+  if (itr1 == itr2)
+    CAMLreturn(Val_bool(true));
+  else
+    CAMLreturn(Val_bool(false));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign
+(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  pph1.BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+    (pph2,
+     widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));;
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign
+(value ph1, value ph2, value max_disj) try {
+  CAMLparam2(ph1, ph2);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  @CPP_CLASS@& pph2 = *p_ at CLASS@_val(ph2);
+  unsigned cpp_max_disj
+    = value_to_unsigned<unsigned>(max_disj);
+  pph1.BGP99_extrapolation_assign
+    (pph2,
+     widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+     cpp_max_disj);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_ascii_dump(value ph1) try {
+  CAMLparam1(ph1);
+  @CPP_CLASS@& pph1 = *p_ at CLASS@_val(ph1);
+  std::ostringstream s;
+  pph1.ascii_dump(s);
+  CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+')
+
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code', `
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_linear_ at PARTITION@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  CAMLlocal1(caml_return_value);
+  @CPP_CLASS@* rfh;
+  Pointset_Powerset<NNC_Polyhedron>* rsh;
+`m4_ifelse(m4_current_interface, `Polyhedron',
+           `m4_linear_partition_for_polyhedron_domains',
+           `m4_linear_partition_for_non_polyhedron_domains')'dnl
+  caml_return_value = caml_alloc(2, 0);
+  Store_field(caml_return_value, 0,
+              unregistered_value_p_ at CLASS@(*rfh));
+  Store_field(caml_return_value, 1,
+              unregistered_value_p_Pointset_Powerset_NNC_Polyhedron(*rsh));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`m4_linear_partition_for_polyhedron_domains',
+`dnl
+  if (Interfaces::is_necessarily_closed_for_interfaces
+       (*p_Polyhedron_val(ph1))) {
+    C_Polyhedron& pph1
+      = reinterpret_cast<C_Polyhedron&>(*p_Polyhedron_val(ph1));
+    C_Polyhedron& pph2
+      = reinterpret_cast<C_Polyhedron&>(*p_Polyhedron_val(ph2));
+    std::pair<C_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+      r = linear_partition(pph1, pph2);
+    rfh = new C_Polyhedron(0, EMPTY);
+    rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+    swap(*rfh, r.first);
+    swap(*rsh, r.second);
+  }
+  else {
+    NNC_Polyhedron& pph1
+      = reinterpret_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph1));
+    NNC_Polyhedron& pph2
+      = reinterpret_cast<NNC_Polyhedron&>(*p_Polyhedron_val(ph2));
+    std::pair<NNC_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+      r = linear_partition(pph1, pph2);
+    rfh = new NNC_Polyhedron(0, EMPTY);
+    rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+    swap(*rfh, r.first);
+    swap(*rsh, r.second);
+  }
+')
+
+m4_define(`m4_linear_partition_for_non_polyhedron_domains',
+`dnl
+  @CPP_CLASS@& pph1
+    = reinterpret_cast<@CPP_CLASS@&>(*p_ at CLASS@_val(ph1));
+  @CPP_CLASS@& pph2
+    = reinterpret_cast<@CPP_CLASS@&>(*p_ at CLASS@_val(ph2));
+  std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+    r = linear_partition(pph1, pph2);
+  rfh = new @CPP_CLASS@(0, EMPTY);
+  rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+  swap(*rfh, r.first);
+  swap(*rsh, r.second);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code', `
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_approximate_ at PARTITION@(value ph1, value ph2) try {
+  CAMLparam2(ph1, ph2);
+  CAMLlocal1(caml_return_value);
+  @CPP_CLASS@& pph1
+    = reinterpret_cast<@CPP_CLASS@&>(*p_ at CPP_CLASS@_val(ph1));
+  @CPP_CLASS@& pph2
+    = reinterpret_cast<@CPP_CLASS@&>(*p_ at CPP_CLASS@_val(ph2));
+  bool is_finite = false;
+  std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<Grid> >
+    r = approximate_partition(pph1, pph2, is_finite);
+  @CPP_CLASS@* rfh = new @CPP_CLASS@(0, EMPTY);
+  Pointset_Powerset<Grid>* rsh = new Pointset_Powerset<Grid>(0, EMPTY);
+  swap(*rfh, r.first);
+  swap(*rsh, r.second);
+  caml_return_value = caml_alloc(3, 0);
+  Store_field(caml_return_value, 0,
+              unregistered_value_p_ at CLASS@(*rfh));
+  Store_field(caml_return_value, 1,
+              unregistered_value_p_Pointset_Powerset_Grid(*rsh));
+  Store_field(caml_return_value, 2, Val_bool(is_finite));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(value pset) try {
+  CAMLparam1(pset);
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+  CAMLreturn(Val_bool(termination_test_ at TERMINATION_ID@(ppset)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(value pset_before,
+                                                            value pset_after)
+  try {
+    CAMLparam2(pset_before, pset_after);
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+  CAMLreturn(Val_bool(termination_test_ at TERMINATION_ID@_2(ppset_before,
+                                                          ppset_after)));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+    (value pset)
+  try {
+    CAMLparam1(pset);
+    CAMLlocal1(caml_return_value);
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+  Generator g(point());
+  bool ppl_return_value = one_affine_ranking_function_ at TERMINATION_ID@
+    (ppset, g);
+  caml_return_value = caml_alloc(2, 0);
+  Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+  Store_field(caml_return_value, 1, build_ocaml_generator(g));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+  (value pset_before, value pset_after)
+  try {
+    CAMLparam2(pset_before, pset_after);
+    CAMLlocal1(caml_return_value);
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+  Generator g(point());
+  bool ppl_return_value = one_affine_ranking_function_ at TERMINATION_ID@_2
+    (ppset_before, ppset_after, g);
+  caml_return_value = caml_alloc(2, 0);
+  Store_field(caml_return_value, 0, Val_bool(ppl_return_value));
+  Store_field(caml_return_value, 1, build_ocaml_generator(g));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+  (value pset)
+  try {
+    CAMLparam1(pset);
+    CAMLlocal1(caml_return_value);
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+  @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+  all_affine_ranking_functions_ at TERMINATION_ID@(ppset, *ph);
+  CAMLreturn(unregistered_value_p_Polyhedron(*ph));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+  (value pset_before, value pset_after)
+  try {
+    CAMLparam2(pset_before, pset_after);
+    CAMLlocal1(caml_return_value);
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+  @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+  all_affine_ranking_functions_ at TERMINATION_ID@_2(ppset_before, ppset_after, *ph);
+  CAMLreturn(unregistered_value_p_Polyhedron(*ph));
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+  (value pset)
+  try {
+    CAMLparam1(pset);
+    CAMLlocal1(caml_return_value);
+  const @TOPOLOGY@@CPP_CLASS@& ppset
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset)));
+  C_Polyhedron* ph_decreasing = new C_Polyhedron();
+  C_Polyhedron* ph_bounded = new C_Polyhedron();
+  all_affine_quasi_ranking_functions_MS(ppset, *ph_decreasing, *ph_bounded);
+  caml_return_value = caml_alloc(2, 0);
+  Store_field(caml_return_value, 0,
+              unregistered_value_p_Polyhedron(*ph_decreasing));
+  Store_field(caml_return_value, 1,
+              unregistered_value_p_Polyhedron(*ph_bounded));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+extern "C"
+CAMLprim value
+  ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+  (value pset_before, value pset_after)
+  try {
+    CAMLparam2(pset_before, pset_after);
+    CAMLlocal1(caml_return_value);
+  const @TOPOLOGY@@CPP_CLASS@& ppset_before
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_before)));
+  const @TOPOLOGY@@CPP_CLASS@& ppset_after
+     = *(reinterpret_cast<@TOPOLOGY@@CPP_CLASS@*>(p_ at CLASS@_val(pset_after)));
+  C_Polyhedron* ph_decreasing = new C_Polyhedron();
+  C_Polyhedron* ph_bounded = new C_Polyhedron();
+  all_affine_quasi_ranking_functions_MS_2(ppset_before, ppset_after,
+                                          *ph_decreasing, *ph_bounded);
+  caml_return_value = caml_alloc(2, 0);
+  Store_field(caml_return_value, 0,
+              unregistered_value_p_Polyhedron(*ph_decreasing));
+  Store_field(caml_return_value, 1,
+              unregistered_value_p_Polyhedron(*ph_bounded));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_wrap_assign_native
+  (value ph, value caml_vset, value width, value rep, value oflow,
+   value cs, value complexity, value wrap_ind) try {
+  CAMLparam5(ph, caml_vset, width, rep, oflow);
+  CAMLxparam3(cs, complexity, wrap_ind);
+  @CPP_CLASS@& pph = *p_ at CLASS@_val(ph);
+  Variables_Set ppl_vset;
+  if (Int_val(caml_vset) == 0)
+    CAMLreturn(Val_unit);
+  while (true) {
+    ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+    if (Int_val(Field(caml_vset, 1)) == 0)
+      break;
+    caml_vset = Field(caml_vset, 1);
+  }
+  build_ppl_bounded_integer_type_representation(rep);
+  build_ppl_bounded_integer_type_overflow(oflow);
+  const Constraint_System ppl_cs = build_ppl_Constraint_System(cs);
+  const unsigned ppl_complexity = value_to_unsigned<unsigned>(complexity);
+  const bool ppl_wrap_ind = Bool_val(wrap_ind);
+  pph.wrap_assign(ppl_vset,
+                  build_ppl_bounded_integer_type_width(width),
+                  build_ppl_bounded_integer_type_representation(rep),
+                  build_ppl_bounded_integer_type_overflow(oflow),
+                  &ppl_cs, ppl_complexity, ppl_wrap_ind);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_ at CLASS@_wrap_assign_bytecode(value * argv, int)
+{
+  return ppl_ at CLASS@_wrap_assign_native(argv[0], argv[1], argv[2], argv[3],
+                                        argv[4], argv[5], argv[6], argv[7]);
+}
+
+')
+
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4
new file mode 100644
index 0000000..a8d2204
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_cc_files.m4
@@ -0,0 +1,66 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)dnl
+
+dnl This m4 file generates the file ppl_ocaml.cc
+dnl using the code in ppl_interface_generator_ocaml_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_cc_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+dnl -----------------------------------------------------------------
+dnl Macros needed for the class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+m4_define(`m4_current_cplusplus', m4_cplusplus_class`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_`'m4_current_interface`'.cc << ___END_OF_FILE___
+/* OCaml m4_current_interface interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_ocaml_domains.hh"
+
+m4_custom_operations_class_code
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::OCaml;
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4
new file mode 100644
index 0000000..cc6a57c
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_code.m4
@@ -0,0 +1,66 @@
+dnl Used by ppl_interfaces_generator_ocaml_hh_files.m4
+dnl for generating the access code for the OCaml interface.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`m4_access_class_code',
+`dnl
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@*
+p_ at CLASS@_val(value v) {
+  return unmark(*reinterpret_cast<@CPP_CLASS@**>(Data_custom_val(v)));
+}
+
+//! Give access to the embedded @CLASS@* in \p v.
+inline @CPP_CLASS@*&
+actual_p_ at CLASS@_val(value v) {
+  return *reinterpret_cast<@CPP_CLASS@**>(Data_custom_val(v));
+}
+
+inline void
+custom_ at CLASS@_finalize(value v) {
+   if (!marked(actual_p_ at CLASS@_val(v)))
+      delete actual_p_ at CLASS@_val(v);
+}
+
+inline value
+unregistered_value_p_ at CLASS@(const @CPP_CLASS@& ph) {
+  extern struct custom_operations @CLASS at _custom_operations;
+  value v = caml_alloc_custom(&@CLASS at _custom_operations,
+			      sizeof(@CPP_CLASS@*), 0, 1);
+  actual_p_ at CLASS@_val(v) = const_cast<@CPP_CLASS@*>(&ph);
+  return v;
+}
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4
new file mode 100644
index 0000000..c39ae9f
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_hh_files.m4
@@ -0,0 +1,65 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)dnl
+
+dnl This m4 file is used to generate ppl_ocaml_domains.hh
+dnl and files ppl_ocaml_DOMAIN.hh, for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4 using the code in
+dnl ppl_interface_generator_ocaml_hh_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_hh_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_domains.hh << ___END_OF_FILE___
+`#'include "ppl_ocaml_`'m4_current_interface.hh"
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_`'m4_current_interface.hh << ___END_OF_FILE___
+/* OCaml m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+m4_replace_all_patterns($1, m4_access_class_code)`'dnl
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_ocaml_domains.hh << ___END_OF_FILE___
+/* OCaml interface code: inclusion of all the domain-dependent declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+`#'include "ppl_ocaml_common_defs.hh"
+m4_all_code
+___END_OF_FILE___
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4
new file mode 100644
index 0000000..7546b40
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml.m4
@@ -0,0 +1,62 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ocaml.ml
+dnl using the code in ppl_interface_generator_ocaml_ml_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_ml_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+(* OCaml interface code.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*)
+
+open Gmp
+include Ppl_ocaml_globals
+
+m4_divert(-1)
+m4_pushdef(`m4_one_class_code', `type m4_downcase(m4_interface_class$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+m4_divert`'dnl
+m4_all_code
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
new file mode 100644
index 0000000..18de75e
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_ml_code.m4
@@ -0,0 +1,668 @@
+dnl  -*- Tuareg -*-
+sm4_divert(-1)
+
+This m4 file contains the program code for generating ppl_ocaml.ml
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the OCaml interface.
+dnl
+m4_define(`ppl_delete_ at CLASS@_code', `')
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+dnl There is no code at present for these procedures in the OCaml interface.
+dnl Remove the macro if its definition is added.
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension:
+  int -> degenerate_element -> @!CLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s:
+  @BUILD_REPRESENT at _system -> @!CLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s"
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+external ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@:
+  @!CLASS@ -> linear_ at RELATION_REPRESENT@
+  -> poly_ at A_RELATION_REPRESENT@_relation list
+  = "ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+external ppl_ at CLASS@_ at DIMENSION@:
+	    @!CLASS@ -> int = "ppl_ at CLASS@_ at DIMENSION@"
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+external ppl_ at CLASS@_ at HAS_PROPERTY@:
+  @!CLASS@ -> bool = "ppl_ at CLASS@_ at HAS_PROPERTY@"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+external ppl_ at CLASS@_ at SIMPLIFY@:
+  @!CLASS@ -> unit = "ppl_ at CLASS@_ at SIMPLIFY@"
+
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+external ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@:
+  @!CLASS@ -> linear_expression -> bool
+  = "ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+external ppl_ at CLASS@_add_ at CLASS_REPRESENT@:
+  @!CLASS@ -> linear_ at CLASS_REPRESENT@ -> unit
+  = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_add_ at CLASS_REPRESENT@s:
+  @!CLASS@ -> @CLASS_REPRESENT at _system -> unit
+  = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+external ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@:
+  @!CLASS@ -> linear_ at REFINE_REPRESENT@ -> unit
+  = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s:
+  @!CLASS@ -> @REFINE_REPRESENT at _system -> unit
+  = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+external ppl_ at CLASS@_ at COMPARISON@_ at CLASS@:
+  @!CLASS@ -> @!CLASS@ -> bool
+  = "ppl_ at CLASS@_ at COMPARISON@_ at CLASS@"
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+external ppl_ at CLASS@_equals_ at CLASS@:
+  @!CLASS@ -> @!CLASS@ -> bool
+  = "ppl_ at CLASS@_equals_ at CLASS@"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+external ppl_ at CLASS@_ at BINOP@:
+  @!CLASS@ -> @!CLASS@ -> unit
+  = "ppl_ at CLASS@_ at BINOP@"
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+external ppl_ at CLASS@_positive_time_elapse_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+  = "ppl_ at CLASS@_positive_time_elapse_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+external ppl_ at CLASS@_simplify_using_context_assign:
+  @!CLASS@ -> @!CLASS@ -> bool
+  = "ppl_ at CLASS@_simplify_using_context_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+external ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@:
+  @!CLASS@ -> int -> unit
+  = "ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@"
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_remove_space_dimensions:
+  @!CLASS@ -> int list -> unit
+  = "ppl_ at CLASS@_remove_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_remove_higher_space_dimensions:
+  @!CLASS@ -> int -> unit
+  = "ppl_ at CLASS@_remove_higher_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_fold_space_dimensions:
+  @!CLASS@ -> int list -> int -> unit
+  = "ppl_ at CLASS@_fold_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_map_space_dimensions:
+  @!CLASS@ -> (int*int) list -> unit
+  = "ppl_ at CLASS@_map_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+external ppl_ at CLASS@_expand_space_dimension:
+  @!CLASS@ -> int -> int -> unit
+  = "ppl_ at CLASS@_expand_space_dimension"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+external ppl_ at CLASS@_drop_some_non_integer_points:
+  @!CLASS@ -> complexity_class -> unit
+  = "ppl_ at CLASS@_drop_some_non_integer_points"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+external ppl_ at CLASS@_drop_some_non_integer_points_2:
+  @!CLASS@ -> int list -> complexity_class -> unit
+  = "ppl_ at CLASS@_drop_some_non_integer_points_2"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_get_ at CLASS_REPRESENT@s:
+  @!CLASS@ -> @CLASS_REPRESENT at _system
+  = "ppl_ at CLASS@_get_ at CLASS_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+external ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s:
+  @!CLASS@ -> @CLASS_REPRESENT at _system
+  = "ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s"
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+external ppl_ at CLASS@_constrains:
+  @!CLASS@ -> int -> bool
+  = "ppl_ at CLASS@_constrains"
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+external ppl_ at CLASS@_unconstrain_space_dimension:
+  @!CLASS@ -> int -> unit
+  = "ppl_ at CLASS@_unconstrain_space_dimension"
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+external ppl_ at CLASS@_unconstrain_space_dimensions:
+  @!CLASS@ -> int list -> unit
+  = "ppl_ at CLASS@_unconstrain_space_dimensions"
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at CLASS@_bounded_ at AFFIMAGE@:
+  @!CLASS@ -> int -> linear_expression
+  -> linear_expression -> Z.t -> unit
+  = "ppl_ at CLASS@_bounded_ at AFFIMAGE@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at CLASS@_ at AFFIMAGE@:
+  @!CLASS@ -> int -> linear_expression -> Z.t -> unit
+  = "ppl_ at CLASS@_ at AFFIMAGE@"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs:
+  @!CLASS@ -> linear_expression
+  -> relation_symbol -> linear_expression -> unit
+  = "ppl_ at CLASS@_generalized_ at AFFIMAGE@1"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@:
+  @!CLASS@ -> int -> relation_symbol
+  -> linear_expression -> Z.t -> unit
+  = "ppl_ at CLASS@_generalized_ at AFFIMAGE@2"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence:
+  @!CLASS@ -> int -> relation_symbol
+  -> linear_expression -> Z.t -> Z.t -> unit
+  = "ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence_bytecode" "ppl_ at CLASS@_generalized_ at AFFIMAGE@1_with_congruence"
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+external ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence:
+  @!CLASS@ -> linear_expression -> relation_symbol
+  -> linear_expression -> Z.t -> unit
+  = "ppl_ at CLASS@_generalized_ at AFFIMAGE@1_lhs_rhs_with_congruence"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+external ppl_ at CLASS@_ at WIDEN@_widening_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+  = "ppl_ at CLASS@_ at WIDEN@_widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+external ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens:
+  @!CLASS@ -> @!CLASS@ -> int -> int
+  = "ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens"
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+external ppl_ at CLASS@_widening_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+  = "ppl_ at CLASS@_widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+external ppl_ at CLASS@_widening_assign_with_tokens:
+  @!CLASS@ -> @!CLASS@ -> int -> int
+  = "ppl_ at CLASS@_widening_assign_with_tokens"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+external ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign:
+  @!CLASS@ -> @!CLASS@ -> @CONSTRAINER at _system -> unit
+  = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+external ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens:
+  @!CLASS@ -> @!CLASS@ -> @CONSTRAINER at _system -> int -> int
+  = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+external ppl_ at CLASS@_has_ at UPPERLOWER@_bound:
+  @!CLASS@ -> int
+  -> bool * Z.t * Z.t * bool
+  = "ppl_ at CLASS@_has_ at UPPERLOWER@_bound"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+external ppl_ at CLASS@_ at MAXMIN@:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool
+  = "ppl_ at CLASS@_ at MAXMIN@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+external ppl_ at CLASS@_ at MAXMIN@_with_point:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool * linear_generator
+  = "ppl_ at CLASS@_ at MAXMIN@_with_point"
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+external ppl_ at CLASS@_frequency:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * Z.t * Z.t
+  = "ppl_ at CLASS@_frequency"
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+external ppl_ at CLASS@_OK:
+  @!CLASS@ -> bool = "ppl_ at CLASS@_OK"
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+ `
+external ppl_ at CLASS@_ at MEMBYTES@:
+  @!CLASS@  -> int = "ppl_ at CLASS@_ at MEMBYTES@"
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+external ppl_ at CLASS@_swap:
+  @!CLASS@ -> @!CLASS@ -> unit
+  = "ppl_ at CLASS@_swap"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@:
+  @!A_FRIEND@ -> @!CLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@"
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+external ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity:
+  @!A_FRIEND@ -> complexity_class -> @!CLASS@
+  = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+ `dnl
+ external ppl_ at CLASS@_ at UB_EXACT@:
+   @!CLASS@ -> @!CLASS@ -> bool
+   = "ppl_ at CLASS@_ at UB_EXACT@"
+
+ ')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens:
+   @!CLASS@ -> @!CLASS@ -> int -> int
+   = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens"
+
+ ')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign:
+   @!CLASS@ -> @!CLASS@ -> unit
+   = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign"
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+ `dnl
+ external ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign:
+   @!CLASS@  -> @!CLASS@ -> unit
+   = "ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign"
+
+ ')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+ `
+external ppl_ at CLASS@_ at BEGINEND@_iterator:
+  @!CLASS@  -> @!CLASS at _iterator
+  = "ppl_ at CLASS@_ at BEGINEND@_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+ `
+external ppl_ at CLASS@_get_disjunct:
+   @!CLASS at _iterator  -> @!DISJUNCT@
+   = "ppl_ at CLASS@_get_disjunct"
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+ `
+external ppl_ at CLASS@_add_disjunct:
+   @!CLASS@  -> @!DISJUNCT@ -> unit
+   = "ppl_ at CLASS@_add_disjunct"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+ `
+ external ppl_ at CLASS@_drop_disjunct:
+   @!CLASS@  ->  @!CLASS at _iterator -> unit
+   = "ppl_ at CLASS@_drop_disjunct"
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+ `
+ external ppl_ at CLASS@_drop_disjuncts:
+   @!CLASS@  ->  @!CLASS at _iterator -> @!CLASS at _iterator -> unit
+   = "ppl_ at CLASS@_drop_disjuncts"
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`
+type @!CLASS at _iterator
+
+external ppl_new_ at CLASS@_iterator_from_iterator:
+  @!CLASS at _iterator -> @!CLASS at _iterator
+  = "ppl_new_ at CLASS@_iterator_from_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+ `
+ external ppl_ at CLASS@_ at INCDEC@_iterator:
+   @!CLASS at _iterator -> unit
+   = "ppl_ at CLASS@_ at INCDEC@_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+ `
+external ppl_ at CLASS@_iterator_equals_iterator:
+  @!CLASS at _iterator ->  @!CLASS at _iterator -> bool
+  = "ppl_ at CLASS@_iterator_equals_iterator"
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+external ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+  = "ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+external ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign:
+  @!CLASS@ -> @!CLASS@ -> int -> unit
+  = "ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign"
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+external ppl_ at CLASS@_ascii_dump:
+  @!CLASS@ -> string = "ppl_ at CLASS@_ascii_dump"
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+external ppl_ at CLASS@_linear_ at PARTITION@:
+ @!CLASS@ -> @!CLASS@ -> @!CLASS@ * pointset_powerset_nnc_polyhedron
+ = "ppl_ at CLASS@_linear_partition"
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+external ppl_ at CLASS@_approximate_ at PARTITION@:
+ @!CLASS@ -> @!CLASS@ ->
+   @!CLASS@ * pointset_powerset_grid * bool
+ = "ppl_ at CLASS@_approximate_partition"
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+external ppl_ at CLASS@_ at MAXMIN@:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool
+  = "ppl_ at CLASS@_ at MAXMIN@"
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> bool = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> bool
+  = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> bool * linear_generator
+  = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> bool * linear_generator
+  = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> polyhedron
+  = "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> polyhedron
+  = "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+external ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> polyhedron * polyhedron
+  = "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@"
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+external ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> polyhedron * polyhedron
+  = "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2"
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+external ppl_ at CLASS@_wrap_assign: @!CLASS@
+                                  -> int list
+                                  -> bounded_integer_type_width
+                                  -> bounded_integer_type_representation
+                                  -> bounded_integer_type_overflow
+                                  -> constraint_system
+                                  -> int -> int -> unit
+                        = "ppl_ at CLASS@_wrap_assign_bytecode"
+                          "ppl_ at CLASS@_wrap_assign_native"
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
new file mode 100644
index 0000000..9208bde
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli.m4
@@ -0,0 +1,60 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ocaml.mli
+dnl using the code in ppl_interface_generator_ocaml_mli_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_ocaml_mli_code.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+
+m4_divert`'dnl
+m4_include(ppl_ocaml_globals.mli)
+m4_divert(-1)
+m4_pushdef(`m4_one_class_code', `type m4_downcase(m4_interface_class$1)
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate type declarations for all the classes.
+dnl -----------------------------------------------------------------
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_default_code', `m4_dumpdef($1`'_code)')
+m4_divert
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_one_class_code')
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate the main class-dependent code.
+dnl -----------------------------------------------------------------
+dnl m4_pre_all_classes_code
+dnl
+m4_divert
+m4_define(`m4_pre_all_classes_code', `')
+m4_all_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
new file mode 100644
index 0000000..cad3390
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_mli_code.m4
@@ -0,0 +1,588 @@
+dnl  -*- Tuareg -*-
+m4_divert(-1)
+
+This m4 file contains the program code for generating ppl_ocaml.mli
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl No code is needed for these procedure schemas in the OCaml interface.
+dnl
+m4_define(`ppl_delete_ at CLASS@_code', `')
+m4_define(`ppl_delete_ at CLASS@_iterator_code', `')
+
+Define here as empty any known schematic method macros for which
+the definition is not yet implemented.
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension:
+  int -> degenerate_element -> @!CLASS@
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s:
+  @BUILD_REPRESENT at _system -> @!CLASS@
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`dnl
+val ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@:
+  @!CLASS@ -> linear_ at RELATION_REPRESENT@
+  -> poly_ at A_RELATION_REPRESENT@_relation list
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`dnl
+val ppl_ at CLASS@_ at DIMENSION@:
+  @!CLASS@ -> int
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`dnl
+val ppl_ at CLASS@_ at HAS_PROPERTY@:
+  @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`dnl
+val ppl_ at CLASS@_ at SIMPLIFY@:
+  @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`dnl
+val ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@:
+  @!CLASS@ -> linear_expression -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`dnl
+val ppl_ at CLASS@_add_ at CLASS_REPRESENT@:
+  @!CLASS@ -> linear_ at CLASS_REPRESENT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_add_ at CLASS_REPRESENT@s:
+  @!CLASS@ -> @CLASS_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`dnl
+val ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@:
+  @!CLASS@ -> linear_ at REFINE_REPRESENT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s:
+  @!CLASS@ -> @REFINE_REPRESENT at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`dnl
+val ppl_ at CLASS@_ at COMPARISON@_ at CLASS@:
+  @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`dnl
+val ppl_ at CLASS@_equals_ at CLASS@:
+  @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`dnl
+val ppl_ at CLASS@_ at BINOP@:
+   @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+`dnl
+val ppl_ at CLASS@_positive_time_elapse_assign:
+   @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`dnl
+val ppl_ at CLASS@_simplify_using_context_assign:
+  @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`dnl
+val ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@:
+  @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_remove_space_dimensions:
+  @!CLASS@ -> int list -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_remove_higher_space_dimensions:
+  @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_fold_space_dimensions:
+  @!CLASS@ -> int list -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_map_space_dimensions:
+  @!CLASS@ -> (int*int) list -> unit
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`dnl
+val ppl_ at CLASS@_expand_space_dimension:
+  @!CLASS@ -> int -> int -> unit
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`dnl
+val ppl_ at CLASS@_drop_some_non_integer_points:
+  @!CLASS@ -> complexity_class -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`dnl
+val ppl_ at CLASS@_drop_some_non_integer_points_2:
+  @!CLASS@ -> int list -> complexity_class -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_get_ at CLASS_REPRESENT@s:
+  @!CLASS@ -> @CLASS_REPRESENT at _system
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`dnl
+val ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s:
+  @!CLASS@ -> @CLASS_REPRESENT at _system
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`dnl
+val ppl_ at CLASS@_constrains:
+  @!CLASS@ -> int -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`dnl
+val ppl_ at CLASS@_unconstrain_space_dimension:
+  @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`dnl
+val ppl_ at CLASS@_unconstrain_space_dimensions:
+  @!CLASS@ -> int list -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at CLASS@_bounded_ at AFFIMAGE@:
+  @!CLASS@ -> int
+  -> linear_expression -> linear_expression
+  -> Z.t -> unit
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at CLASS@_ at AFFIMAGE@:
+  @!CLASS@ -> int -> linear_expression -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs:
+  @!CLASS@ -> linear_expression
+  -> relation_symbol -> linear_expression
+  -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@:
+  @!CLASS@ -> int -> relation_symbol -> linear_expression
+  -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence:
+  @!CLASS@ -> int -> relation_symbol -> linear_expression
+  -> Z.t -> Z.t -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`dnl
+val ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence:
+  @!CLASS@ -> linear_expression
+  -> relation_symbol -> linear_expression -> Z.t
+  -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_ at WIDEN@_widening_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens:
+  @!CLASS@ -> @!CLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_widening_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_widening_assign_with_tokens:
+  @!CLASS@ -> @!CLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens:
+  @!CLASS@ -> @!CLASS@
+  -> @CONSTRAINER at _system -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign:
+  @!CLASS@ -> @!CLASS@
+  -> @CONSTRAINER at _system -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`dnl
+val ppl_ at CLASS@_has_ at UPPERLOWER@_bound:
+  @!CLASS@ -> int
+  -> bool * Z.t * Z.t * bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`dnl
+val ppl_ at CLASS@_ at MAXMIN@:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`dnl
+val ppl_ at CLASS@_ at MAXMIN@_with_point:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * bool * linear_generator
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+`dnl
+val ppl_ at CLASS@_frequency:
+  @!CLASS@ -> linear_expression
+  -> bool * Z.t * Z.t * Z.t * Z.t
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`dnl
+val ppl_ at CLASS@_OK:
+  @!CLASS@ -> bool
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`dnl
+val ppl_ at CLASS@_ at MEMBYTES@:
+  @!CLASS@  -> int
+
+')
+
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`dnl
+val ppl_ at CLASS@_swap:
+  @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@:
+  @!A_FRIEND@ -> @!CLASS@
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`dnl
+val ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity:
+  @!A_FRIEND@ -> complexity_class -> @!CLASS@
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`dnl
+val ppl_ at CLASS@_ at UB_EXACT@:
+  @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign:
+  @!CLASS@  -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens:
+  @!CLASS@  -> @!CLASS@ -> int -> int
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`dnl
+val ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign:
+  @!CLASS@  -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`dnl
+val ppl_ at CLASS@_ at BEGINEND@_iterator:
+  @!CLASS@  -> @!CLASS at _iterator
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`dnl
+val ppl_ at CLASS@_get_disjunct:
+  @!CLASS at _iterator  ->  @!DISJUNCT@
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`dnl
+val ppl_ at CLASS@_add_disjunct:
+  @!CLASS@  ->  @!DISJUNCT@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`dnl
+val ppl_ at CLASS@_drop_disjunct:
+  @!CLASS@  ->  @!CLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`dnl
+val ppl_ at CLASS@_drop_disjuncts:
+  @!CLASS@  ->  @!CLASS at _iterator -> @!CLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`dnl
+type @!CLASS at _iterator
+
+val ppl_new_ at CLASS@_iterator_from_iterator:
+  @!CLASS at _iterator ->  @!CLASS at _iterator
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`dnl
+
+val ppl_ at CLASS@_iterator_equals_iterator:
+  @!CLASS at _iterator ->  @!CLASS at _iterator -> bool
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`dnl
+val ppl_ at CLASS@_ at INCDEC@_iterator:
+  @!CLASS at _iterator -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`dnl
+val ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign:
+  @!CLASS@ -> @!CLASS@ -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`dnl
+val ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign:
+  @!CLASS@ -> @!CLASS@ -> int -> unit
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`dnl
+
+val ppl_ at CLASS@_ascii_dump:
+  @!CLASS@ -> string
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+val ppl_ at CLASS@_linear_ at PARTITION@:
+  @!CLASS@ -> @!CLASS@ -> @!CLASS@ * pointset_powerset_nnc_polyhedron
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+val ppl_ at CLASS@_approximate_ at PARTITION@:
+  @!CLASS@ -> @!CLASS@ ->
+    @!CLASS@ * pointset_powerset_grid * bool
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> bool
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> bool * linear_generator
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> bool * linear_generator
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> polyhedron
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> polyhedron
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`dnl
+val ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@:
+  @!CLASS@ -> polyhedron * polyhedron
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`dnl
+val ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2:
+  @!CLASS@ -> @!CLASS@ -> polyhedron * polyhedron
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`dnl
+val ppl_ at CLASS@_wrap_assign: @!CLASS@
+                             -> int list
+                             -> bounded_integer_type_width
+                             -> bounded_integer_type_representation
+                             -> bounded_integer_type_overflow
+                             -> constraint_system
+                             -> int -> int -> unit
+
+')
diff --git a/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4 b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
new file mode 100644
index 0000000..47dfada
--- /dev/null
+++ b/interfaces/OCaml/ppl_interface_generator_ocaml_procedure_generators.m4
@@ -0,0 +1,57 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of procedures
+dnl for the OCaml interface; this includes:
+dnl - the list in the imported file and any OCaml specific procedures.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(`ppl_interface_generator_common_procedure_generators.m4')
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+
+dnl
+dnl m4_procedure_list
+dnl This class extends the m4_common_procedure_list
+dnl and all procedures common to the all the interfaces should go there.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+dnl
+
+m4_define(`m4_procedure_list',
+  `m4_echo_unquoted(ppl_new_ at CLASS@_iterator +pointset_powerset,
+`m4_common_procedure_list',
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@ +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2 +simple,
+)
+')
+
diff --git a/interfaces/OCaml/ppl_ocaml_common.cc b/interfaces/OCaml/ppl_ocaml_common.cc
new file mode 100644
index 0000000..6ddc47c
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_common.cc
@@ -0,0 +1,1814 @@
+/* Domain-independent part of the OCaml interface: non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_ocaml_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+  if (p_timeout_object) {
+    delete p_timeout_object;
+    p_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+void
+reset_deterministic_timeout() {
+  if (p_deterministic_timeout_object) {
+    delete p_deterministic_timeout_object;
+    p_deterministic_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+namespace {
+
+inline mpz_ptr
+mpz_ptr_val(value val) {
+  return static_cast<mpz_ptr>(Data_custom_val(val));
+}
+
+inline mpz_class&
+mpz_class_val(value val) {
+  return reinterpret_cast<mpz_class&>(*mpz_ptr_val(val));
+}
+
+// Function for the management of mpz_t integers.
+extern "C" struct custom_operations _mlgmp_custom_z;
+
+inline value
+unregistered_value_p_zero_mpz(void) {
+  value zero_mpz = caml_alloc_custom(&_mlgmp_custom_z, sizeof(mpz_t), 0, 1);
+  mpz_init(mpz_ptr_val(zero_mpz));
+  return zero_mpz;
+}
+
+} // anonymous namespace
+
+value
+build_ocaml_coefficient(const Coefficient& ppl_coeff) {
+  CAMLparam0();
+  CAMLlocal1(ml_coeff);
+  ml_coeff = unregistered_value_p_zero_mpz();
+  assign_r(mpz_class_val(ml_coeff), ppl_coeff, ROUND_NOT_NEEDED);
+  CAMLreturn(ml_coeff);
+}
+
+Coefficient
+build_ppl_Coefficient(value coeff) {
+  mpz_class z(mpz_ptr_val(coeff));
+  return Coefficient(z);
+}
+
+Linear_Expression
+build_ppl_Linear_Expression(value e) {
+  switch (Tag_val(e)) {
+  case 0:
+    // Variable
+    return build_ppl_Variable(Field(e, 0));
+  case 1: {
+    // Coefficient
+    mpz_class z(mpz_ptr_val(Field(e, 0)));
+    return Linear_Expression(Coefficient(z));
+  }
+  case 2:
+    // Unary_Plus
+    return build_ppl_Linear_Expression(Field(e, 0));
+  case 3:
+    // Unary_Minus
+    return -build_ppl_Linear_Expression(Field(e, 0));
+  case 4:
+    // Plus
+    return build_ppl_Linear_Expression(Field(e, 0))
+      + build_ppl_Linear_Expression(Field(e, 1));
+  case 5:
+    // Minus
+    return build_ppl_Linear_Expression(Field(e, 0))
+      - build_ppl_Linear_Expression(Field(e, 1));
+  case 6: {
+    // Times
+    mpz_class z(mpz_ptr_val(Field(e, 0)));
+    return Coefficient(z) * build_ppl_Linear_Expression(Field(e, 1));
+  }
+  default:
+    throw std::invalid_argument("PPL OCaml interface invalid_argument\n:"
+                                "error building PPL::Linear_Expression");
+  }
+}
+
+Relation_Symbol
+build_ppl_relsym(value caml_relsym) {
+  assert(Is_long(caml_relsym));
+  switch (Int_val(caml_relsym)) {
+  case 0:
+    return LESS_THAN;
+  case 1:
+    return LESS_OR_EQUAL;
+  case 2:
+    return EQUAL;
+  case 3:
+    return GREATER_OR_EQUAL;
+  case 4:
+    return GREATER_THAN;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_relsym(rel)");
+  }
+}
+
+Bounded_Integer_Type_Width
+build_ppl_bounded_integer_type_width(value caml_width) {
+  assert(Is_long(caml_width));
+  switch (Int_val(caml_width)) {
+  case 0:
+    return BITS_8;
+  case 1:
+    return BITS_16;
+  case 2:
+    return BITS_32;
+  case 3:
+    return BITS_64;
+  case 4:
+    return BITS_128;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_bounded_integer_type_"
+                             "width(width)");
+  }
+}
+
+Bounded_Integer_Type_Representation
+build_ppl_bounded_integer_type_representation(value caml_rep) {
+  assert(Is_long(caml_rep));
+  switch (Int_val(caml_rep)) {
+  case 0:
+    return UNSIGNED;
+  case 1:
+    return SIGNED_2_COMPLEMENT;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_bounded_integer_type_"
+                             "representation(rep)");
+  }
+}
+
+Bounded_Integer_Type_Overflow
+build_ppl_bounded_integer_type_overflow(value caml_oflow) {
+  assert(Is_long(caml_oflow));
+  switch (Int_val(caml_oflow)) {
+  case 0:
+    return OVERFLOW_WRAPS;
+  case 1:
+    return OVERFLOW_UNDEFINED;
+  case 2:
+    return OVERFLOW_IMPOSSIBLE;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_bounded_integer_type_"
+                             "overflow(oflow)");
+  }
+}
+
+Optimization_Mode
+build_ppl_opt_mode(value caml_opt_mode) {
+  assert(Is_long(caml_opt_mode));
+  switch (Int_val(caml_opt_mode)) {
+  case 0:
+    return MINIMIZATION;
+  case 1:
+    return MAXIMIZATION;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_opt_mode(opt)");
+  }
+}
+
+Degenerate_Element
+build_ppl_Degenerate_Element(value de) {
+  assert(Is_long(de));
+  switch (Int_val(de)) {
+  case 0:
+    return UNIVERSE;
+  case 1:
+    return EMPTY;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_Degenerate_Element(de)");
+  }
+}
+
+Complexity_Class
+build_ppl_Complexity_Class(value cc) {
+  assert(Is_long(cc));
+  switch (Int_val(cc)) {
+  case 0:
+    return POLYNOMIAL_COMPLEXITY;
+  case 1:
+    return SIMPLEX_COMPLEXITY;
+  case 2:
+    return ANY_COMPLEXITY;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_Complexity_Class(cc)");
+  }
+}
+
+MIP_Problem::Control_Parameter_Name
+build_ppl_mip_problem_control_parameter_name(value caml_cp_name) {
+  assert(Is_long(caml_cp_name));
+  if (Int_val(caml_cp_name) == 0)
+    return MIP_Problem::PRICING;
+  else
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_mip_problem_"
+                             "control_parameter_name(cpn)");
+}
+
+MIP_Problem::Control_Parameter_Value
+build_ppl_control_parameter_value(value caml_cp_value) {
+  assert(Is_long(caml_cp_value));
+  switch (Int_val(caml_cp_value)) {
+  case 0:
+    return MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT;
+  case 1:
+    return MIP_Problem::PRICING_STEEPEST_EDGE_EXACT;
+  case 2:
+    return MIP_Problem::PRICING_TEXTBOOK;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_control_parameter_value(cpv)");
+  }
+}
+
+PIP_Problem::Control_Parameter_Name
+build_ppl_pip_problem_control_parameter_name(value caml_cp_name) {
+  assert(Is_long(caml_cp_name));
+  switch (Int_val(caml_cp_name)) {
+  case 0:
+    return PIP_Problem::CUTTING_STRATEGY;
+  case 1:
+    return PIP_Problem::PIVOT_ROW_STRATEGY;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_pip_problem_"
+                             "control_parameter_name(cpn)");
+  }
+}
+
+PIP_Problem::Control_Parameter_Value
+build_ppl_pip_problem_control_parameter_value(value caml_cp_value) {
+  assert(Is_long(caml_cp_value));
+  switch (Int_val(caml_cp_value)) {
+  case 0:
+    return PIP_Problem::CUTTING_STRATEGY_FIRST;
+  case 1:
+    return PIP_Problem::CUTTING_STRATEGY_DEEPEST;
+  case 2:
+    return PIP_Problem::CUTTING_STRATEGY_ALL;
+  case 3:
+    return PIP_Problem::PIVOT_ROW_STRATEGY_FIRST;
+  case 4:
+    return PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN;
+  default:
+    PPL_OCAML_UNEXPECTED_MSG("build_ppl_pip_problem_"
+                             "control_parameter_value(cpv)");
+  }
+}
+
+Variables_Set
+build_ppl_Variables_Set(value caml_vset) {
+  Variables_Set ppl_vset;
+  while (caml_vset != Val_emptylist) {
+    ppl_vset.insert(value_to_ppl_dimension(Field(caml_vset, 0)));
+    caml_vset = Field(caml_vset, 1);
+  }
+  return ppl_vset;
+}
+
+Constraint
+build_ppl_Constraint(value c) {
+  value e1 = Field(c, 0);
+  value e2 = Field(c, 1);
+  switch (Tag_val(c)) {
+  case 0:
+    // Less_Than
+    return build_ppl_Linear_Expression(e1) < build_ppl_Linear_Expression(e2);
+  case 1:
+    // Less_Or_Equal
+    return build_ppl_Linear_Expression(e1) <= build_ppl_Linear_Expression(e2);
+  case 2:
+    // Equal
+    return build_ppl_Linear_Expression(e1) == build_ppl_Linear_Expression(e2);
+  case 3:
+    // Greater_Than
+    return build_ppl_Linear_Expression(e1) > build_ppl_Linear_Expression(e2);
+  case 4:
+    // Greater_Or_Equal
+    return build_ppl_Linear_Expression(e1) >= build_ppl_Linear_Expression(e2);
+  default:
+    throw std::invalid_argument("PPL OCaml interface invalid argument:\n"
+                                "error building PPL::Constraint");
+  }
+}
+
+
+template <typename R>
+CAMLprim value
+get_inhomogeneous_term(const R& r) {
+  CAMLparam0();
+  CAMLlocal1(coeff_term);
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  neg_assign(coeff, r.inhomogeneous_term());
+  coeff_term = caml_alloc(1,1);
+  Store_field(coeff_term, 0, build_ocaml_coefficient(coeff));
+  CAMLreturn(coeff_term);
+}
+
+// Takes from constraints, generators... the embedded linear
+// expression.
+template <typename R>
+CAMLprim value
+get_linear_expression(const R& r) {
+  CAMLparam0();
+  CAMLlocal2(zero_term, zero_mpz);
+  CAMLlocal5(sum, term1, ml_le_var1, term2, ml_le_var2);
+  dimension_type space_dimension = r.space_dimension();
+  dimension_type varid = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  while (varid < space_dimension
+         && (coeff = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    zero_mpz = unregistered_value_p_zero_mpz();
+    zero_term = caml_alloc(1,1);
+    Store_field(zero_term, 0, zero_mpz);
+    CAMLreturn(zero_term);
+  }
+  else {
+    ml_le_var1 = caml_alloc(1,0);
+    Store_field(ml_le_var1, 0, ppl_dimension_to_value(varid));
+    term1 = caml_alloc(2,6);
+    PPL_DIRTY_TEMP_COEFFICIENT(ppl_coeff);
+    ppl_coeff = r.coefficient(Variable(varid));
+    Store_field(term1, 0, build_ocaml_coefficient(ppl_coeff));
+    Store_field(term1, 1, ml_le_var1);
+    while (true) {
+      ++varid;
+      while (varid < space_dimension
+             && (coeff = r.coefficient(Variable(varid))) == 0)
+        ++varid;
+      if (varid >= space_dimension)
+        CAMLreturn(term1);
+      else {
+        ml_le_var2 = caml_alloc(1,0);
+        Store_field(ml_le_var2, 0, ppl_dimension_to_value(varid));
+        term2 = caml_alloc(2,6);
+        ppl_coeff = r.coefficient(Variable(varid));
+        Store_field(term2, 0, build_ocaml_coefficient(ppl_coeff));
+        Store_field(term2, 1, ml_le_var2);
+        sum = caml_alloc(2,4);
+        Store_field(sum, 0, term1);
+        Store_field(sum, 1, term2);
+        term1 = sum;
+      }
+    }
+  }
+}
+
+value
+build_ocaml_generator(const Generator& ppl_generator) {
+  CAMLparam0();
+  CAMLlocal1(caml_generator);
+  switch (ppl_generator.type()) {
+  case Generator::LINE: {
+    // Store the linear expression. (1,0) stands for
+    // allocate one block (the linear expression) with Tag 0 (a line here).
+    caml_generator = caml_alloc(1,0);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+    CAMLreturn(caml_generator);
+  }
+  case Generator::RAY: {
+    caml_generator = caml_alloc(1,1);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+    CAMLreturn(caml_generator);
+  }
+  case Generator::POINT: {
+    // Allocates two blocks (the linear expression and the divisor)
+    // of tag 2 (Point).
+    caml_generator = caml_alloc(2,2);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+    const Coefficient& divisor = ppl_generator.divisor();
+    Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+    CAMLreturn(caml_generator);
+  }
+  case Generator::CLOSURE_POINT:  {
+    caml_generator = caml_alloc(2,3);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_generator));
+    const Coefficient& divisor = ppl_generator.divisor();
+    Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+    CAMLreturn(caml_generator);
+  }
+  } // switch (ppl_generator.type())
+  PPL_UNREACHABLE;
+}
+
+value
+build_ocaml_grid_generator(const Grid_Generator& ppl_grid_generator) {
+  CAMLparam0();
+  CAMLlocal1(caml_generator);
+  switch (ppl_grid_generator.type()) {
+  case Grid_Generator::LINE: {
+    // Store the linear expression. (1,0) stands for
+    // allocate one block (the linear expression) with Tag 0 (a line here).
+    caml_generator = caml_alloc(1,0);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_grid_generator));
+    CAMLreturn(caml_generator);
+  }
+  case Grid_Generator::PARAMETER: {
+    caml_generator = caml_alloc(2,1);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_grid_generator));
+    const Coefficient& divisor = ppl_grid_generator.divisor();
+    Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+    CAMLreturn(caml_generator);
+  }
+  case Grid_Generator::POINT: {
+    // Allocates two blocks (the linear expression and the divisor)
+    // of tag 2 (Point).
+    caml_generator = caml_alloc(2,2);
+    Store_field(caml_generator, 0, get_linear_expression(ppl_grid_generator));
+    const Coefficient& divisor = ppl_grid_generator.divisor();
+    Store_field(caml_generator, 1, build_ocaml_coefficient(divisor));
+    CAMLreturn(caml_generator);
+  }
+  } // switch (ppl_grid_generator.type())
+  PPL_UNREACHABLE;
+}
+
+value
+build_ocaml_constraint(const Constraint& ppl_constraint) {
+  CAMLparam0();
+  CAMLlocal1(caml_constraint);
+  switch (ppl_constraint.type()) {
+  case Constraint::EQUALITY: {
+    caml_constraint = caml_alloc(2,2);
+    Store_field(caml_constraint, 0, get_linear_expression(ppl_constraint));
+    Store_field(caml_constraint, 1, get_inhomogeneous_term(ppl_constraint));
+    CAMLreturn(caml_constraint);
+  }
+  case Constraint::STRICT_INEQUALITY: {
+    caml_constraint = caml_alloc(2,3);
+    Store_field(caml_constraint, 0, get_linear_expression(ppl_constraint));
+    Store_field(caml_constraint, 1, get_inhomogeneous_term(ppl_constraint));
+    CAMLreturn(caml_constraint);
+  }
+  case Constraint::NONSTRICT_INEQUALITY: {
+    caml_constraint = caml_alloc(2,4);
+    Store_field(caml_constraint, 0, get_linear_expression(ppl_constraint));
+    Store_field(caml_constraint, 1, get_inhomogeneous_term(ppl_constraint));
+    CAMLreturn(caml_constraint);
+  }
+  } // switch (ppl_constraint.type())
+  PPL_UNREACHABLE;
+}
+
+value
+build_ocaml_congruence(const Congruence& ppl_congruence) {
+  CAMLparam0();
+  CAMLlocal1(caml_congruence);
+  caml_congruence = caml_alloc(3,0);
+  Store_field(caml_congruence, 0, get_linear_expression(ppl_congruence));
+  Store_field(caml_congruence, 1, get_inhomogeneous_term(ppl_congruence));
+  const Coefficient& modulus = ppl_congruence.modulus();
+  Store_field(caml_congruence, 2, build_ocaml_coefficient(modulus));
+  CAMLreturn(caml_congruence);
+}
+
+value
+build_ocaml_congruence_system(const Congruence_System& ppl_cgs) {
+  CAMLparam0();
+  CAMLlocal2(result, new_tail);
+  result = Val_emptylist;
+  for (Congruence_System::const_iterator v_begin = ppl_cgs.begin(),
+         v_end = ppl_cgs.end(); v_begin != v_end; ++v_begin) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, build_ocaml_congruence(*v_begin));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+
+value
+build_ocaml_constraint_system(const Constraint_System& ppl_cs) {
+  CAMLparam0();
+  CAMLlocal2(result, new_tail);
+  result = Val_emptylist;
+  for (Constraint_System::const_iterator v_begin = ppl_cs.begin(),
+         v_end = ppl_cs.end(); v_begin != v_end; ++v_begin) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, build_ocaml_constraint(*v_begin));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+
+value
+build_ocaml_generator_system(const Generator_System& ppl_gs) {
+  CAMLparam0();
+  CAMLlocal2(result, new_tail);
+  result = Val_emptylist;
+  for (Generator_System::const_iterator v_begin = ppl_gs.begin(),
+         v_end = ppl_gs.end(); v_begin != v_end; ++v_begin) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, build_ocaml_generator(*v_begin));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+
+value
+build_ocaml_grid_generator_system(const Grid_Generator_System& ppl_ggs) {
+  CAMLparam0();
+  CAMLlocal2(result, new_tail);
+  result = Val_emptylist;
+  for (Grid_Generator_System::const_iterator v_begin = ppl_ggs.begin(),
+         v_end = ppl_ggs.end(); v_begin != v_end; ++v_begin) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, build_ocaml_grid_generator(*v_begin));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+
+value
+build_ocaml_poly_con_relation(Poly_Con_Relation& r) {
+  CAMLparam0();
+  CAMLlocal2(result, cons);
+  result = Val_emptylist;
+  while (r != Poly_Con_Relation::nothing()) {
+    if (r.implies(Poly_Con_Relation::is_disjoint())) {
+      cons = caml_alloc_tuple(2);
+      Store_field(cons, 0, Val_int(0));
+      Store_field(cons, 1, result);
+      result = cons;
+      r = r - Poly_Con_Relation::is_disjoint();
+    }
+    else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+      cons = caml_alloc_tuple(2);
+      Store_field(cons, 0, Val_int(1));
+      Store_field(cons, 1, result);
+      result = cons;
+      r = r - Poly_Con_Relation::strictly_intersects();
+    }
+    else if (r.implies(Poly_Con_Relation::is_included())) {
+      cons = caml_alloc_tuple(2);
+      Store_field(cons, 0, Val_int(2));
+      Store_field(cons, 1, result);
+      result = cons;
+      r = r - Poly_Con_Relation::is_included();
+    }
+    else if (r.implies(Poly_Con_Relation::saturates())) {
+      cons = caml_alloc_tuple(2);
+      Store_field(cons, 0, Val_int(3));
+      Store_field(cons, 1, result);
+      result = cons;
+      r = r - Poly_Con_Relation::saturates();
+    }
+  }
+  CAMLreturn(result);
+}
+
+value
+build_ocaml_poly_gen_relation(Poly_Gen_Relation& r) {
+  CAMLparam0();
+  CAMLlocal2(result, cons);
+  result = Val_emptylist;
+  while (r != Poly_Gen_Relation::nothing()) {
+    if (r.implies(Poly_Gen_Relation::subsumes())) {
+      cons = caml_alloc_tuple(2);
+      Store_field(cons, 0, Val_int(0));
+      Store_field(cons, 1, result);
+      result = cons;
+      r = r - Poly_Gen_Relation::subsumes();
+    }
+  }
+  CAMLreturn(result);
+}
+
+Congruence
+build_ppl_Congruence(value c) {
+  value e1 = Field(c, 0);
+  value e2 = Field(c, 1);
+  mpz_class z(mpz_ptr_val(Field(c, 2)));
+  Linear_Expression lhs = build_ppl_Linear_Expression(e1);
+  Linear_Expression rhs = build_ppl_Linear_Expression(e2);
+  return (lhs %= rhs) / z;
+}
+
+Generator
+build_ppl_Generator(value g) {
+  switch (Tag_val(g)) {
+  case 0:
+    // Line
+    return Generator::line(build_ppl_Linear_Expression(Field(g, 0)));
+  case 1:
+    // Ray
+    return Generator::ray(build_ppl_Linear_Expression(Field(g, 0)));
+  case 2: {
+    // Point
+    mpz_class z(mpz_ptr_val(Field(g, 1)));
+    return Generator::point(build_ppl_Linear_Expression(Field(g, 0)),
+                            Coefficient(z));
+  }
+  case 3: {
+    // Closure_point
+    mpz_class z(mpz_ptr_val(Field(g, 1)));
+    return Generator::closure_point(build_ppl_Linear_Expression(Field(g, 0)),
+                                    Coefficient(z));
+  }
+  default:
+    throw std::invalid_argument("PPL OCaml interface invalid argument:\n"
+                                "error building PPL::Generator");
+  }
+}
+
+Grid_Generator
+build_ppl_Grid_Generator(value gg) {
+  switch (Tag_val(gg)) {
+   case 0:
+     // Line
+     return grid_line(build_ppl_Linear_Expression(Field(gg, 0)));
+   case 1: {
+     // Parameter
+     mpz_class z(mpz_ptr_val(Field(gg, 1)));
+     return parameter(build_ppl_Linear_Expression(Field(gg, 0)),
+                      Coefficient(z));
+   }
+   case 2: {
+     // Point
+     mpz_class z(mpz_ptr_val(Field(gg, 1)));
+     return grid_point(build_ppl_Linear_Expression(Field(gg, 0)),
+                       Coefficient(z));
+   }
+  default:
+    // We should not be here!
+    throw std::invalid_argument("PPL OCaml interface invalid argument:\n"
+                                "error building PPL::Grid_Generator");
+  }
+}
+
+Constraint_System
+build_ppl_Constraint_System(value cl) {
+  Constraint_System cs;
+  while (cl != Val_emptylist) {
+    cs.insert(build_ppl_Constraint(Field(cl, 0)));
+    cl = Field(cl, 1);
+  }
+  return cs;
+}
+
+Generator_System
+build_ppl_Generator_System(value gl) {
+  Generator_System gs;
+  while (gl != Val_emptylist) {
+    gs.insert(build_ppl_Generator(Field(gl, 0)));
+    gl = Field(gl, 1);
+  }
+  return gs;
+}
+
+Congruence_System
+build_ppl_Congruence_System(value cgl) {
+  Congruence_System cgs;
+  while (cgl != Val_emptylist) {
+    cgs.insert(build_ppl_Congruence(Field(cgl, 0)));
+    cgl = Field(cgl, 1);
+  }
+  return cgs;
+}
+
+Grid_Generator_System
+build_ppl_Grid_Generator_System(value caml_ggs) {
+  Grid_Generator_System ggs;
+  while (caml_ggs != Val_emptylist) {
+    ggs.insert(build_ppl_Grid_Generator(Field(caml_ggs, 0)));
+    caml_ggs = Field(caml_ggs, 1);
+  }
+  return ggs;
+}
+
+//! Give access to the embedded MIP_Problem* in \p v.
+inline MIP_Problem*&
+p_MIP_Problem_val(value v) {
+  return *reinterpret_cast<MIP_Problem**>(Data_custom_val(v));
+}
+
+void
+custom_MIP_Problem_finalize(value v) {
+  delete p_MIP_Problem_val(v);
+}
+
+static struct custom_operations MIP_Problem_custom_operations = {
+  "com.bugseng.ppl" "." PPL_VERSION "." "MIP_Problem",
+  custom_MIP_Problem_finalize,
+  custom_compare_default,
+  custom_hash_default,
+  custom_serialize_default,
+  custom_deserialize_default,
+  custom_compare_ext_default
+};
+
+inline value
+unregistered_value_p_MIP_Problem(const MIP_Problem& ph) {
+  value v = caml_alloc_custom(&MIP_Problem_custom_operations,
+                              sizeof(MIP_Problem*), 0, 1);
+  p_MIP_Problem_val(v) = const_cast<MIP_Problem*>(&ph);
+  return v;
+}
+
+//! Give access to the embedded PIP_Problem* in \p v.
+inline PIP_Problem*&
+p_PIP_Problem_val(value v) {
+  return *reinterpret_cast<PIP_Problem**>(Data_custom_val(v));
+}
+
+void
+custom_PIP_Problem_finalize(value v) {
+  delete p_PIP_Problem_val(v);
+}
+
+static struct custom_operations PIP_Problem_custom_operations = {
+  "com.bugseng.ppl" "." PPL_VERSION "." "PIP_Problem",
+  custom_PIP_Problem_finalize,
+  custom_compare_default,
+  custom_hash_default,
+  custom_serialize_default,
+  custom_deserialize_default,
+  custom_compare_ext_default
+};
+
+inline value
+unregistered_value_p_PIP_Problem(const PIP_Problem& ph) {
+  value v = caml_alloc_custom(&PIP_Problem_custom_operations,
+                              sizeof(PIP_Problem*), 0, 1);
+  p_PIP_Problem_val(v) = const_cast<PIP_Problem*>(&ph);
+  return v;
+}
+
+// NOTE: the finalization of each PIP_Tree_Node object is delegated
+// to the owning PIP_Problem object, hence we should not provide a custom
+// finalization function (the default one is fine).
+// In principle, we could directly store a PIP_Tree_Node* in a Caml 'value':
+// the use of a Custom_tag block is anyway recommended by Caml manual.
+static struct custom_operations PIP_Tree_Node_custom_operations = {
+  "com.bugseng.ppl" "." PPL_VERSION "." "PIP_Tree_Node",
+  custom_finalize_default,
+  custom_compare_default,
+  custom_hash_default,
+  custom_serialize_default,
+  custom_deserialize_default,
+  custom_compare_ext_default
+};
+
+//! Give access to the embedded const PIP_Tree_Node* in \p v.
+inline const PIP_Tree_Node*&
+p_PIP_Tree_Node_val(value v) {
+  return *reinterpret_cast<const PIP_Tree_Node**>(Data_custom_val(v));
+}
+
+inline value
+unregistered_value_p_PIP_Tree_Node(const PIP_Tree_Node* pip_tree) {
+  value v = caml_alloc_custom(&PIP_Tree_Node_custom_operations,
+                              sizeof(PIP_Tree_Node*), 0, 1);
+  p_PIP_Tree_Node_val(v) = pip_tree;
+  return v;
+}
+
+inline const PIP_Tree_Node*
+ppl_PIP_Tree_Node_get_child(const PIP_Tree_Node* parent, bool branch) {
+  if (parent == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_get_child(node):\n"
+                                "node is bottom.");
+  if (const PIP_Decision_Node* ppl_dec = parent->as_decision())
+    return ppl_dec->child_node(branch);
+  else
+    throw std::invalid_argument("ppl_PIP_Tree_Node_get_child(node):\n"
+                                "node is not a decision node (solution).");
+}
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::OCaml;
+
+extern "C"
+CAMLprim value
+ppl_new_MIP_Problem_from_space_dimension(value d) try {
+  CAMLparam1(d);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  MIP_Problem& ppl_mip = *new MIP_Problem(dd);
+  CAMLreturn(unregistered_value_p_MIP_Problem(ppl_mip));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_new_MIP_Problem(value d, value caml_cs, value caml_cost,
+                    value caml_opt_mode) try {
+  CAMLparam4(d, caml_cs, caml_cost, caml_opt_mode);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  const Constraint_System ppl_cs = build_ppl_Constraint_System(caml_cs);
+  const Linear_Expression ppl_cost = build_ppl_Linear_Expression(caml_cost);
+  const Optimization_Mode ppl_opt_mode = build_ppl_opt_mode(caml_opt_mode);
+  MIP_Problem& ppl_mip = *new MIP_Problem(dd, ppl_cs, ppl_cost, ppl_opt_mode);
+  CAMLreturn(unregistered_value_p_MIP_Problem(ppl_mip));
+}
+CATCH_ALL
+
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_space_dimension(value ph) try {
+  CAMLparam1(ph);
+  const MIP_Problem& pph = *p_MIP_Problem_val(ph);
+  dimension_type d = pph.space_dimension();
+  CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_integer_space_dimensions(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  CAMLlocal2(result, new_tail);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  const Variables_Set& ppl_ivars = ppl_mip.integer_space_dimensions();
+  result = Val_emptylist;
+  for (Variables_Set::const_reverse_iterator i = ppl_ivars.rbegin(),
+         i_end = ppl_ivars.rend(); i != i_end; ++i) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, ppl_dimension_to_value(*i));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_constraints(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  const MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  Constraint_System cs;
+  for (MIP_Problem::const_iterator cs_it = ppl_mip.constraints_begin(),
+         cs_end = ppl_mip.constraints_end(); cs_it != cs_end; ++cs_it) {
+    cs.insert(*cs_it);
+  }
+  CAMLreturn(build_ocaml_constraint_system(cs));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_space_dimensions_and_embed(value caml_mip, value dim) try {
+  CAMLparam2(caml_mip, dim);
+  const dimension_type ppl_dim = value_to_ppl_dimension(dim);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_space_dimensions_and_embed(ppl_dim);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_to_integer_space_dimensions(value caml_mip,
+                                                value caml_ivars) try {
+  CAMLparam2(caml_mip, caml_ivars);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_to_integer_space_dimensions(build_ppl_Variables_Set(caml_ivars));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_constraint(value caml_mip,
+                               value caml_constraint) try {
+  CAMLparam2(caml_mip, caml_constraint);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_constraint(build_ppl_Constraint(caml_constraint));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_add_constraints(value caml_mip,
+                                value caml_constraints) try {
+  CAMLparam2(caml_mip, caml_constraints);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.add_constraints(build_ppl_Constraint_System(caml_constraints));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_set_objective_function(value caml_mip,
+                                       value caml_cost) try {
+  CAMLparam2(caml_mip, caml_cost);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.set_objective_function(build_ppl_Linear_Expression(caml_cost));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_is_satisfiable(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(ppl_mip.is_satisfiable());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_solve(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  MIP_Problem_Status mip_status = ppl_mip.solve();
+  switch (mip_status) {
+  case UNFEASIBLE_MIP_PROBLEM:
+    CAMLreturn(Val_int(0));
+  case UNBOUNDED_MIP_PROBLEM:
+    CAMLreturn(Val_int(1));
+  case OPTIMIZED_MIP_PROBLEM:
+    CAMLreturn(Val_int(2));
+  }
+  PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimization_mode(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  Optimization_Mode opt_mode = ppl_mip.optimization_mode();
+  switch (opt_mode) {
+  case MINIMIZATION:
+    CAMLreturn(Val_int(0));
+  case MAXIMIZATION:
+    CAMLreturn(Val_int(1));
+  }
+  PPL_UNREACHABLE;
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_set_control_parameter(value caml_mip,
+                                      value caml_cp_value) try {
+  CAMLparam2(caml_mip, caml_cp_value);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  MIP_Problem::Control_Parameter_Value ppl_cp_value
+    = build_ppl_control_parameter_value(caml_cp_value);
+  ppl_mip.set_control_parameter(ppl_cp_value);
+  CAMLreturn(Val_unit);
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_get_control_parameter(value caml_mip,
+                                      value caml_cp_name) try {
+  CAMLparam2(caml_mip, caml_cp_name);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  MIP_Problem::Control_Parameter_Name ppl_cp_name
+    = build_ppl_mip_problem_control_parameter_name(caml_cp_name);
+  MIP_Problem::Control_Parameter_Value ppl_cp_value
+    = ppl_mip.get_control_parameter(ppl_cp_name);
+  switch (ppl_cp_value) {
+  case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT:
+    CAMLreturn(Val_int(0));
+  case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT:
+    CAMLreturn(Val_int(1));
+  case MIP_Problem::PRICING_TEXTBOOK:
+    CAMLreturn(Val_int(2));
+  }
+  PPL_UNREACHABLE;
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_feasible_point(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(build_ocaml_generator(ppl_mip.feasible_point()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimizing_point(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(build_ocaml_generator(ppl_mip.optimizing_point()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_optimal_value(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  CAMLlocal1(caml_return_value);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  PPL_DIRTY_TEMP_COEFFICIENT(num);
+  PPL_DIRTY_TEMP_COEFFICIENT(den);
+  ppl_mip.optimal_value(num, den);
+  caml_return_value = caml_alloc(2,0);
+  Store_field(caml_return_value, 0, build_ocaml_coefficient(num));
+  Store_field(caml_return_value, 1, build_ocaml_coefficient(den));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_evaluate_objective_function(value caml_mip,
+                                            value caml_generator) try {
+  CAMLparam2(caml_mip, caml_generator);
+  CAMLlocal1(caml_return_value);
+  Generator g = build_ppl_Generator(caml_generator);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  PPL_DIRTY_TEMP_COEFFICIENT(num);
+  PPL_DIRTY_TEMP_COEFFICIENT(den);
+  ppl_mip.evaluate_objective_function(g, num, den);
+  caml_return_value = caml_alloc(2,0);
+  Store_field(caml_return_value, 0, build_ocaml_coefficient(num));
+  Store_field(caml_return_value, 1, build_ocaml_coefficient(den));
+  CAMLreturn(caml_return_value);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_OK(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  CAMLreturn(ppl_mip.OK());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_objective_function(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  CAMLlocal4(homogeneous_term, inhomogeneous_term, sum, coeff);
+  const MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  const Linear_Expression& ppl_obj_func = ppl_mip.objective_function();
+  homogeneous_term = get_linear_expression(ppl_obj_func);
+  inhomogeneous_term
+    = build_ocaml_coefficient(ppl_obj_func.inhomogeneous_term());
+  coeff = caml_alloc(1,1);
+  Store_field(coeff, 0, inhomogeneous_term);
+  sum = caml_alloc(2,4);
+  Store_field(sum, 0, homogeneous_term);
+  Store_field(sum, 1, coeff);
+  CAMLreturn(sum);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_clear(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.clear();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_set_optimization_mode(value caml_mip, value caml_opt_mode) try{
+  CAMLparam2(caml_mip, caml_opt_mode);
+  Optimization_Mode ppl_opt_mode= build_ppl_opt_mode(caml_opt_mode);
+  MIP_Problem& ppl_mip = *p_MIP_Problem_val(caml_mip);
+  ppl_mip.set_optimization_mode(ppl_opt_mode);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_swap(value caml_mip1, value caml_mip2) try{
+  CAMLparam2(caml_mip1, caml_mip2);
+  MIP_Problem& ppl_mip1 = *p_MIP_Problem_val(caml_mip1);
+  MIP_Problem& ppl_mip2 = *p_MIP_Problem_val(caml_mip2);
+  swap(ppl_mip1, ppl_mip2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_MIP_Problem_ascii_dump(value caml_mip) try {
+  CAMLparam1(caml_mip);
+  MIP_Problem& mip = *p_MIP_Problem_val(caml_mip);
+  std::ostringstream s;
+  mip.ascii_dump(s);
+  CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_new_PIP_Problem_from_space_dimension(value d) try {
+  CAMLparam1(d);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  PIP_Problem& ppl_pip = *new PIP_Problem(dd);
+  CAMLreturn(unregistered_value_p_PIP_Problem(ppl_pip));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_new_PIP_Problem(value d, value caml_cs, value caml_vset) try {
+  CAMLparam3(d, caml_cs, caml_vset);
+  const dimension_type dd = value_to_ppl_dimension(d);
+  const Constraint_System ppl_cs = build_ppl_Constraint_System(caml_cs);
+  Variables_Set ppl_vset;
+  if (Int_val(caml_vset) == 0)
+    CAMLreturn(Val_unit);
+  while (true) {
+    ppl_vset.insert(Int_val(Field(caml_vset, 0)));
+    if (Int_val(Field(caml_vset, 1)) == 0)
+      break;
+    caml_vset = Field(caml_vset, 1);
+  }
+  PIP_Problem& ppl_pip = *new PIP_Problem(dd, ppl_cs.begin(), ppl_cs.end(),
+                                          ppl_vset);
+  CAMLreturn(unregistered_value_p_PIP_Problem(ppl_pip));
+}
+CATCH_ALL
+
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_space_dimension(value pip) try {
+  CAMLparam1(pip);
+  const PIP_Problem& ppip = *p_PIP_Problem_val(pip);
+  const dimension_type d = ppip.space_dimension();
+  CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_parameter_space_dimensions(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  CAMLlocal2(result, new_tail);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  const Variables_Set& ppl_ivars = ppl_pip.parameter_space_dimensions();
+  result = Val_emptylist;
+  for (Variables_Set::const_reverse_iterator i = ppl_ivars.rbegin(),
+         i_end = ppl_ivars.rend(); i != i_end; ++i) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, ppl_dimension_to_value(*i));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_constraints(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  const PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  Constraint_System cs;
+  for (PIP_Problem::const_iterator cs_it = ppl_pip.constraints_begin(),
+         cs_end = ppl_pip.constraints_end(); cs_it != cs_end; ++cs_it) {
+    cs.insert(*cs_it);
+  }
+  CAMLreturn(build_ocaml_constraint_system(cs));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_space_dimensions_and_embed(value caml_pip,
+                                               value vdim, value pdim) try {
+  CAMLparam3(caml_pip, vdim, pdim);
+  dimension_type ppl_vdim = value_to_ppl_dimension(vdim);
+  dimension_type ppl_pdim = value_to_ppl_dimension(pdim);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  ppl_pip.add_space_dimensions_and_embed(ppl_vdim, ppl_pdim);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_to_parameter_space_dimensions(value caml_pip,
+                                                  value caml_ivars) try {
+  CAMLparam2(caml_pip, caml_ivars);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  ppl_pip.add_to_parameter_space_dimensions
+    (build_ppl_Variables_Set(caml_ivars));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_constraint(value caml_pip,
+                               value caml_constraint) try {
+  CAMLparam2(caml_pip, caml_constraint);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  ppl_pip.add_constraint(build_ppl_Constraint(caml_constraint));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_add_constraints(value caml_pip,
+                                value caml_constraints) try {
+  CAMLparam2(caml_pip, caml_constraints);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  ppl_pip.add_constraints(build_ppl_Constraint_System(caml_constraints));
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_set_big_parameter_dimension(value caml_pip,
+                                            value caml_dim) try {
+  CAMLparam2(caml_pip, caml_dim);
+  const dimension_type ppl_dim = value_to_ppl_dimension(caml_dim);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  ppl_pip.set_big_parameter_dimension(ppl_dim);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_get_big_parameter_dimension(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  dimension_type d = ppl_pip.get_big_parameter_dimension();
+  if (d == not_a_dimension())
+    throw std::invalid_argument("ppl_PIP_Problem_get_big_parameter_dimension"
+                                "(pip):\n"
+                                "big parameter dimension has not been set.");
+  CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_has_big_parameter_dimension(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  dimension_type d = ppl_pip.get_big_parameter_dimension();
+  CAMLreturn(Val_bool(d != not_a_dimension()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_is_satisfiable(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  CAMLreturn(ppl_pip.is_satisfiable());
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_solve(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  PIP_Problem_Status pip_status = ppl_pip.solve();
+  switch (pip_status) {
+  case UNFEASIBLE_PIP_PROBLEM:
+    CAMLreturn(Val_int(0));
+  case OPTIMIZED_PIP_PROBLEM:
+    CAMLreturn(Val_int(1));
+  }
+  PPL_UNREACHABLE;
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_set_control_parameter(value caml_pip,
+                                      value caml_cp_value) try {
+  CAMLparam2(caml_pip, caml_cp_value);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  PIP_Problem::Control_Parameter_Value ppl_cp_value
+    = build_ppl_pip_problem_control_parameter_value(caml_cp_value);
+  ppl_pip.set_control_parameter(ppl_cp_value);
+  CAMLreturn(Val_unit);
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_get_control_parameter(value caml_pip,
+                                      value caml_cp_name) try {
+  CAMLparam2(caml_pip, caml_cp_name);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  PIP_Problem::Control_Parameter_Name ppl_cp_name
+    = build_ppl_pip_problem_control_parameter_name(caml_cp_name);
+  PIP_Problem::Control_Parameter_Value ppl_cp_value
+    = ppl_pip.get_control_parameter(ppl_cp_name);
+  switch (ppl_cp_value) {
+  case PIP_Problem::CUTTING_STRATEGY_FIRST:
+    CAMLreturn(Val_int(0));
+  case PIP_Problem::CUTTING_STRATEGY_DEEPEST:
+    CAMLreturn(Val_int(1));
+  case PIP_Problem::CUTTING_STRATEGY_ALL:
+    CAMLreturn(Val_int(2));
+  case PIP_Problem::PIVOT_ROW_STRATEGY_FIRST:
+    CAMLreturn(Val_int(3));
+  case PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN:
+    CAMLreturn(Val_int(4));
+  default:
+    PPL_UNREACHABLE;
+    CAMLreturn(Val_int(5));
+  }
+ }
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_solution(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  const PIP_Tree_Node* ppl_node = ppl_pip.solution();
+  CAMLreturn(unregistered_value_p_PIP_Tree_Node(ppl_node));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_optimizing_solution(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  const PIP_Tree_Node* ppl_node = ppl_pip.optimizing_solution();
+  CAMLreturn(unregistered_value_p_PIP_Tree_Node(ppl_node));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_OK(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  CAMLreturn(Val_bool(ppl_pip.OK()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_clear(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& ppl_pip = *p_PIP_Problem_val(caml_pip);
+  ppl_pip.clear();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_swap(value caml_pip1, value caml_pip2) try{
+  CAMLparam2(caml_pip1, caml_pip2);
+  PIP_Problem& ppl_pip1 = *p_PIP_Problem_val(caml_pip1);
+  PIP_Problem& ppl_pip2 = *p_PIP_Problem_val(caml_pip2);
+  swap(ppl_pip1, ppl_pip2);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Problem_ascii_dump(value caml_pip) try {
+  CAMLparam1(caml_pip);
+  PIP_Problem& pip = *p_PIP_Problem_val(caml_pip);
+  std::ostringstream s;
+  pip.ascii_dump(s);
+  CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+value
+build_ocaml_artificial_parameter(const PIP_Tree_Node::Artificial_Parameter&
+                                 ppl_artificial_parameter) {
+  CAMLparam0();
+  CAMLlocal1(caml_artificial_parameter);
+  caml_artificial_parameter = caml_alloc(2,0);
+  Store_field(caml_artificial_parameter, 0,
+              get_linear_expression(ppl_artificial_parameter));
+  const Coefficient& denominator = ppl_artificial_parameter.denominator();
+  Store_field(caml_artificial_parameter, 1,
+              build_ocaml_coefficient(denominator));
+  CAMLreturn(caml_artificial_parameter);
+}
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_constraints(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  if (ppl_node == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_constraints(node):\n"
+                                "node is bottom.");
+  const Constraint_System& ppl_cs = ppl_node->constraints();
+  CAMLreturn(build_ocaml_constraint_system(ppl_cs));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_is_bottom(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  CAMLreturn(Val_bool(ppl_node == 0));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_is_solution(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  CAMLreturn(Val_bool(ppl_node != 0
+                      && ppl_node->as_solution() != 0));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_is_decision(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  CAMLreturn(Val_bool(ppl_node != 0
+                      && ppl_node->as_decision() != 0));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_artificials(value caml_node) try {
+  CAMLparam1(caml_node);
+  CAMLlocal2(result, new_tail);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  if (ppl_node == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_artificials(node):\n"
+                                "node is bottom.");
+  for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+         v_begin = ppl_node->art_parameter_begin(),
+         v_end = ppl_node->art_parameter_end(); v_begin != v_end; ++v_begin) {
+    new_tail = caml_alloc_tuple(2);
+    Store_field(new_tail, 0, build_ocaml_artificial_parameter(*v_begin));
+    Store_field(new_tail, 1, result);
+    result = new_tail;
+  }
+  CAMLreturn(result);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_OK(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  if (ppl_node == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_OK(node):\n"
+                                "node is bottom.");
+  CAMLreturn(Val_bool(ppl_node->OK()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_ascii_dump(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  if (ppl_node == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_ascii_dump(node):\n"
+                                "node is bottom.");
+  std::ostringstream s;
+  ppl_node->ascii_dump(s);
+  CAMLreturn(caml_copy_string(s.str().c_str()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_parametric_values(value caml_node,
+                                        value caml_dim) try {
+  CAMLparam2(caml_node, caml_dim);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  if (ppl_node == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_get_parametric_values"
+                                "(node, dim):\n"
+                                "node is not a solution node (bottom).");
+  const PIP_Solution_Node* ppl_sol = ppl_node->as_solution();
+  if (ppl_sol == 0)
+    throw std::invalid_argument("ppl_PIP_Tree_Node_get_parametric_values"
+                                "(node, dim):\n"
+                                "node is not a solution node (decision).");
+  Variable var(Int_val(caml_dim));
+  const Linear_Expression& ppl_le = ppl_sol->parametric_values(var);
+  CAMLreturn(get_linear_expression(ppl_le));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_true_child(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  const PIP_Tree_Node* child = ppl_PIP_Tree_Node_get_child(ppl_node, true);
+  CAMLreturn(unregistered_value_p_PIP_Tree_Node(child));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_PIP_Tree_Node_false_child(value caml_node) try {
+  CAMLparam1(caml_node);
+  const PIP_Tree_Node* ppl_node = p_PIP_Tree_Node_val(caml_node);
+  const PIP_Tree_Node* child = ppl_PIP_Tree_Node_get_child(ppl_node, false);
+  CAMLreturn(unregistered_value_p_PIP_Tree_Node(child));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_major(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(Val_long(version_major()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_minor(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(Val_long(version_minor()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_revision(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(Val_long(version_revision()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version_beta(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(Val_long(version_beta()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_version(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(caml_copy_string(version()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_banner(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(caml_copy_string(banner()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_io_wrap_string(value src,
+                   value indent_depth,
+                   value preferred_first_line_length,
+                   value preferred_line_length) try {
+  CAMLparam4(src, indent_depth, preferred_first_line_length,
+             preferred_line_length);
+  unsigned cpp_indent_depth
+    = value_to_unsigned<unsigned>(indent_depth);
+  unsigned cpp_preferred_first_line_length
+    = value_to_unsigned<unsigned>(preferred_first_line_length);
+  unsigned cpp_preferred_line_length
+    = value_to_unsigned<unsigned>(preferred_line_length);
+  using IO_Operators::wrap_string;
+  CAMLreturn(caml_copy_string(wrap_string(String_val(src),
+                                          cpp_indent_depth,
+                                          cpp_preferred_first_line_length,
+                                          cpp_preferred_line_length
+                                          ).c_str()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_bits(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(Val_long(PPL_COEFFICIENT_BITS));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_is_bounded(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(std::numeric_limits<Coefficient>::is_bounded
+             ? Val_true : Val_false);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_min(value unit) try {
+  CAMLparam1(unit);
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    const Coefficient& min = std::numeric_limits<Coefficient>::min();
+    CAMLreturn(build_ocaml_coefficient(min));
+  }
+  else
+    CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Coefficient_max(value unit) try {
+  CAMLparam1(unit);
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    const Coefficient& max = std::numeric_limits<Coefficient>::max();
+    CAMLreturn(build_ocaml_coefficient(max));
+  }
+  else
+    CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_max_space_dimension(value unit) try {
+  CAMLparam1(unit);
+  dimension_type d = max_space_dimension();
+  CAMLreturn(ppl_dimension_to_value(d));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Linear_Expression_is_zero(value ocaml_le) try {
+  CAMLparam1(ocaml_le);
+  CAMLreturn(build_ppl_Linear_Expression(ocaml_le).is_zero()
+             ? Val_true : Val_false);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_Linear_Expression_all_homogeneous_terms_are_zero(value ocaml_le) try {
+  CAMLparam1(ocaml_le);
+  CAMLreturn(build_ppl_Linear_Expression(ocaml_le).
+    all_homogeneous_terms_are_zero()
+             ? Val_true : Val_false);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_rounding_for_PPL(value unit) try {
+  CAMLparam1(unit);
+  set_rounding_for_PPL();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_restore_pre_PPL_rounding(value unit) try {
+  CAMLparam1(unit);
+  restore_pre_PPL_rounding();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_irrational_precision(value unit) try {
+  CAMLparam1(unit);
+  CAMLreturn(Val_long(irrational_precision()));
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_irrational_precision(value p) try {
+  CAMLparam1(p);
+  unsigned cxx_p = value_to_unsigned<unsigned>(p);
+  set_irrational_precision(cxx_p);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_timeout(value time) try {
+  CAMLparam1(time);
+  // In case a timeout was already set.
+  reset_timeout();
+  unsigned cpp_time = value_to_unsigned<unsigned>(time);
+  static timeout_exception e;
+  using Parma_Polyhedra_Library::Watchdog;
+  p_timeout_object = new Watchdog(cpp_time, abandon_expensive_computations, e);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_reset_timeout(value unit) try {
+  CAMLparam1(unit);
+  reset_timeout();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_set_deterministic_timeout(value unscaled_weight, value scale) try {
+  CAMLparam2(unscaled_weight, scale);
+  // In case a timeout was already set.
+  reset_deterministic_timeout();
+  unsigned long cpp_unscaled_weight
+    = value_to_unsigned<unsigned long>(unscaled_weight);
+  unsigned cpp_scale = value_to_unsigned<unsigned>(scale);
+  static deterministic_timeout_exception e;
+  typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+  p_deterministic_timeout_object
+    = new Weightwatch(Traits::compute_delta(cpp_unscaled_weight, cpp_scale),
+                      abandon_expensive_computations, e);
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
+
+extern "C"
+CAMLprim value
+ppl_reset_deterministic_timeout(value unit) try {
+  CAMLparam1(unit);
+  reset_deterministic_timeout();
+  CAMLreturn(Val_unit);
+}
+CATCH_ALL
diff --git a/interfaces/OCaml/ppl_ocaml_common_defs.hh b/interfaces/OCaml/ppl_ocaml_common_defs.hh
new file mode 100644
index 0000000..c6cde29
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_common_defs.hh
@@ -0,0 +1,234 @@
+/* Domain-independent part of the OCaml interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_ocaml_common_defs_hh
+#define PPL_ppl_ocaml_common_defs_hh 1
+
+#include "ppl.hh"
+#include "interfaced_boxes.hh"
+#include "marked_pointers.hh"
+
+// Note: throw exception if the error is at the OCaml interface level.
+#define PPL_OCAML_UNEXPECTED \
+  throw std::runtime_error("PPL OCaml interface internal error")
+#define PPL_OCAML_UNEXPECTED_MSG(msg) \
+  throw std::runtime_error("PPL OCaml interface internal error:\n" msg)
+
+
+// OCaml include files.
+extern "C" {
+
+#define CAML_NAME_SPACE
+#include "caml/mlvalues.h"
+#include "caml/memory.h"
+#include "caml/custom.h"
+#include "caml/fail.h"
+#include "caml/callback.h"
+#include "caml/alloc.h"
+#undef CAML_NAME_SPACE
+
+} // extern "C"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+template <typename U_Int>
+U_Int value_to_unsigned(value v);
+
+value
+ppl_dimension_to_value(dimension_type dim);
+
+dimension_type
+value_to_ppl_dimension(value dim);
+
+Variable
+build_ppl_Variable(value var);
+
+Degenerate_Element
+build_ppl_Degenerate_Element(value de);
+
+Complexity_Class
+build_ppl_Complexity_Class(value cc);
+
+Relation_Symbol
+build_ppl_relsym(value caml_relsym);
+
+Bounded_Integer_Type_Overflow
+build_ppl_bounded_integer_type_overflow(value caml_oflow);
+
+Bounded_Integer_Type_Representation
+build_ppl_bounded_integer_type_representation(value caml_rep);
+
+Bounded_Integer_Type_Width
+build_ppl_bounded_integer_type_width(value caml_width);
+
+Coefficient
+build_ppl_Coefficient(value coeff);
+
+Variable
+build_ppl_Variable(value caml_var);
+
+Variables_Set
+build_ppl_Variables_Set(value caml_vset);
+
+Linear_Expression
+build_ppl_Linear_Expression(value e);
+
+Constraint
+build_ppl_Constraint(value c);
+
+Congruence
+build_ppl_Congruence(value c);
+
+Generator
+build_ppl_Generator(value g);
+
+Grid_Generator
+build_ppl_Grid_Generator(value gg);
+
+Constraint_System
+build_ppl_Constraint_System(value cl);
+
+Congruence_System
+build_ppl_Congruence_System(value cgl);
+
+Generator_System
+build_ppl_Generator_System(value gl);
+
+Grid_Generator_System
+build_ppl_Grid_Generator_System(value ggs);
+
+value
+build_ocaml_poly_con_relation(Poly_Con_Relation& r);
+
+value
+build_ocaml_poly_gen_relation(Poly_Gen_Relation& r);
+
+value
+build_ocaml_coefficient(const Coefficient& c);
+
+value
+build_ocaml_constraint(const Constraint& c);
+
+value
+build_ocaml_congruence(const Congruence& cg);
+
+value
+build_ocaml_generator(const Generator& g);
+
+value
+build_ocaml_constraint_system(const Constraint_System& cs);
+
+value
+build_ocaml_congruence_system(const Congruence_System& cgs);
+
+value
+build_ocaml_grid_generator(const Grid_Generator& gg);
+
+value
+build_ocaml_generator_system(const Generator_System& gs);
+
+value
+build_ocaml_grid_generator_system(const Grid_Generator_System& ggs);
+
+class timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+class deterministic_timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+void reset_timeout();
+
+void reset_deterministic_timeout();
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#define CATCH_ALL                                                       \
+catch(std::bad_alloc&) {                                                \
+  caml_raise_out_of_memory();                                           \
+}                                                                       \
+catch(std::invalid_argument& e) {                                       \
+  caml_invalid_argument(const_cast<char*>(e.what()));                   \
+}                                                                       \
+catch(std::overflow_error& e) {                                         \
+  caml_raise_with_string(*caml_named_value("PPL_arithmetic_overflow"),  \
+                         (const_cast<char*>(e.what())));                \
+}                                                                       \
+catch(std::domain_error& e) {                                   \
+  caml_raise_with_string(*caml_named_value("PPL_domain_error"),  \
+                         (const_cast<char*>(e.what())));                \
+}                                                                       \
+catch(std::length_error& e) {                                   \
+  caml_raise_with_string(*caml_named_value("PPL_length_error"),  \
+                         (const_cast<char*>(e.what())));                \
+}                                                                       \
+catch(std::logic_error& e) {                                            \
+  caml_raise_with_string(*caml_named_value("PPL_logic_error"),          \
+                         (const_cast<char*>(e.what())));                \
+}                                                                       \
+catch(std::runtime_error& e) {                                          \
+  caml_raise_with_string(*caml_named_value("PPL_internal_error"),       \
+                         (const_cast<char*>(e.what())));                \
+}                                                                       \
+catch(std::exception& e) {                                              \
+  caml_raise_with_string(*caml_named_value("PPL_unknown_standard_exception"), \
+                         (const_cast<char*>(e.what())));                \
+}                                                                       \
+catch(timeout_exception&) {                                             \
+  reset_timeout();                                                      \
+  caml_raise_constant(*caml_named_value("PPL_timeout_exception"));      \
+}                                                                       \
+catch(deterministic_timeout_exception&) {                               \
+  reset_deterministic_timeout();                                        \
+  caml_raise_constant(*caml_named_value("PPL_timeout_exception"));      \
+}                                                                       \
+catch(...) {                                                            \
+  caml_raise_constant(*caml_named_value("PPL_unexpected_error"));       \
+}
+
+#include "ppl_ocaml_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/OCaml/ppl_ocaml_common_inlines.hh b/interfaces/OCaml/ppl_ocaml_common_inlines.hh
new file mode 100644
index 0000000..ddfd0b5
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_common_inlines.hh
@@ -0,0 +1,82 @@
+/* Domain-independent part of the OCaml interface: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_ocaml_common_inlines_hh
+#define PPL_ppl_ocaml_common_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace OCaml {
+
+template <typename U_Int>
+U_Int
+value_to_unsigned(value v) {
+  // FIXME: check the following at compile time.
+  assert(std::numeric_limits<U_Int>::is_integer
+         && !std::numeric_limits<U_Int>::is_signed);
+  if (!Is_long(v)) {
+    const char* what = "PPL OCaml interface invalid argument error:\n"
+      "argument is not an integer (expecting a non-negative integer).";
+    throw std::invalid_argument(what);
+  }
+  intnat vv = Long_val(v);
+  if (vv < 0) {
+    const char* what = "PPL OCaml interface invalid argument error:\n"
+      "argument is negative (expecting a non-negative integer).";
+    throw std::invalid_argument(what);
+  }
+  const uintnat u_max = std::numeric_limits<U_Int>::max();
+  if (static_cast<uintnat>(vv) > u_max) {
+    const char* what = "PPL OCaml interface invalid argument:\n"
+      "argument value is too big (expecting a smaller non-negative integer).";
+    throw std::invalid_argument(what);
+  }
+  return static_cast<U_Int>(vv);
+}
+
+inline dimension_type
+value_to_ppl_dimension(value v) {
+  return value_to_unsigned<dimension_type>(v);
+}
+
+inline value
+ppl_dimension_to_value(dimension_type dim) {
+  // FIXME: what if this assertion fails?
+  assert(static_cast<uintnat>(dim) <= static_cast<uintnat>(Max_long));
+  return Val_long(dim);
+}
+
+inline Variable
+build_ppl_Variable(value caml_var) {
+  return Variable(value_to_ppl_dimension(caml_var));
+}
+
+} // namespace OCaml
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_ocaml_common_inlines_hh)
diff --git a/interfaces/OCaml/ppl_ocaml_globals.ml b/interfaces/OCaml/ppl_ocaml_globals.ml
new file mode 100644
index 0000000..1dd95b5
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_globals.ml
@@ -0,0 +1,438 @@
+(* OCaml interface: domain-independent functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Gmp
+
+exception PPL_arithmetic_overflow of string
+let _ = Callback.register_exception "PPL_arithmetic_overflow"
+          (PPL_arithmetic_overflow "any string")
+
+exception PPL_timeout_exception
+let _ = Callback.register_exception "PPL_timeout_exception"
+          (PPL_timeout_exception)
+
+exception PPL_internal_error of string
+let _ = Callback.register_exception "PPL_internal_error"
+          (PPL_internal_error "any string")
+
+exception PPL_unknown_standard_exception of string
+let _ = Callback.register_exception "PPL_unknown_standard_exception"
+          (PPL_unknown_standard_exception "any string")
+
+exception PPL_unexpected_error of string
+let _ = Callback.register_exception "PPL_unexpected_error"
+          (PPL_unexpected_error "any string")
+
+type degenerate_element =
+    Universe
+  | Empty
+
+type linear_expression =
+    Variable of int
+  | Coefficient of Z.t
+  | Unary_Plus of linear_expression
+  | Unary_Minus of linear_expression
+  | Plus of linear_expression * linear_expression
+  | Minus of linear_expression * linear_expression
+  | Times of Z.t * linear_expression
+
+type linear_constraint =
+    Less_Than of linear_expression * linear_expression
+  | Less_Or_Equal of linear_expression * linear_expression
+  | Equal of linear_expression * linear_expression
+  | Greater_Than of linear_expression * linear_expression
+  | Greater_Or_Equal of linear_expression * linear_expression
+
+type linear_generator =
+    Line of linear_expression
+  | Ray of linear_expression
+  | Point of linear_expression * Z.t
+  | Closure_Point of linear_expression * Z.t
+
+type linear_grid_generator =
+    Grid_Line of linear_expression
+  | Grid_Parameter of linear_expression * Z.t
+  | Grid_Point of linear_expression * Z.t
+
+type poly_gen_relation =
+    Subsumes
+
+type poly_con_relation =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+  | Saturates
+
+type relation_with_congruence =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+
+type linear_congruence = linear_expression * linear_expression * Z.t
+
+type constraint_system = linear_constraint list
+
+type generator_system = linear_generator list
+
+type grid_generator_system = linear_grid_generator list
+
+type congruence_system = linear_congruence list
+
+(* Note: the "_RS" suffix is to avoid name clashes with the declaration
+   of linear_constraint. *)
+type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS
+                       | Greater_Than_RS | Greater_Or_Equal_RS
+
+type bounded_integer_type_overflow = Overflow_Wraps
+                                     | Overflow_Undefined
+                                     | Overflow_Impossible
+
+type bounded_integer_type_representation = Unsigned
+                                           | Signed_2_Complement
+
+type bounded_integer_type_width = Bits_8
+                                  | Bits_16
+                                  | Bits_32
+                                  | Bits_64
+                                  | Bits_128
+
+type complexity_class = Polynomial_Complexity
+                        | Simplex_Complexity
+                        | Any_Complexity
+
+type optimization_mode = Minimization | Maximization
+
+type mip_problem_status = Unfeasible_Mip_Problem | Unbounded_Mip_Problem
+                        | Optimized_Mip_Problem
+
+type control_parameter_name = Pricing
+
+type control_parameter_value = Pricing_Steepest_Edge_Float
+                             | Pricing_Steepest_Edge_Exact
+                             | Pricing_Textbook
+
+type mip_problem
+
+external ppl_version_major:
+unit -> int = "ppl_version_major"
+
+external ppl_version_minor:
+unit -> int = "ppl_version_minor"
+
+external ppl_version_revision:
+unit -> int = "ppl_version_revision"
+
+external ppl_version_beta:
+unit -> int = "ppl_version_beta"
+
+external ppl_version:
+unit -> string = "ppl_version"
+
+external ppl_banner:
+unit -> string = "ppl_banner"
+
+external ppl_io_wrap_string:
+string -> int -> int -> int -> string = "ppl_io_wrap_string"
+
+external ppl_max_space_dimension:
+unit -> int = "ppl_max_space_dimension"
+
+external ppl_Coefficient_bits:
+unit -> int = "ppl_Coefficient_bits"
+
+external ppl_Coefficient_is_bounded:
+unit -> bool = "ppl_Coefficient_is_bounded"
+
+external ppl_Coefficient_max:
+unit -> Z.t = "ppl_Coefficient_max"
+
+external ppl_Coefficient_min:
+unit -> Z.t = "ppl_Coefficient_min"
+
+external ppl_Linear_Expression_is_zero:
+linear_expression -> bool = "ppl_Linear_Expression_is_zero"
+
+external ppl_Linear_Expression_all_homogeneous_terms_are_zero:
+linear_expression -> bool
+      = "ppl_Linear_Expression_all_homogeneous_terms_are_zero"
+
+external ppl_set_rounding_for_PPL:
+unit -> unit = "ppl_set_rounding_for_PPL"
+
+external ppl_restore_pre_PPL_rounding:
+unit -> unit = "ppl_restore_pre_PPL_rounding"
+
+external ppl_irrational_precision:
+unit -> int = "ppl_irrational_precision"
+
+external ppl_set_irrational_precision:
+int -> unit = "ppl_set_irrational_precision"
+
+external ppl_set_timeout:
+int -> unit = "ppl_set_timeout"
+
+external ppl_reset_timeout:
+unit -> unit = "ppl_reset_timeout"
+
+external ppl_set_deterministic_timeout:
+int -> int -> unit = "ppl_set_deterministic_timeout"
+
+external ppl_reset_deterministic_timeout:
+unit -> unit = "ppl_reset_deterministic_timeout"
+
+external ppl_new_MIP_Problem_from_space_dimension:
+  int -> mip_problem = "ppl_new_MIP_Problem_from_space_dimension"
+
+external ppl_new_MIP_Problem:
+  int -> constraint_system -> linear_expression
+    -> optimization_mode -> mip_problem
+      = "ppl_new_MIP_Problem"
+
+external ppl_MIP_Problem_space_dimension:
+  mip_problem -> int = "ppl_MIP_Problem_space_dimension"
+
+external ppl_MIP_Problem_integer_space_dimensions:
+  mip_problem -> int list = "ppl_MIP_Problem_integer_space_dimensions"
+
+external ppl_MIP_Problem_constraints:
+  mip_problem -> constraint_system = "ppl_MIP_Problem_constraints"
+
+external ppl_MIP_Problem_add_space_dimensions_and_embed:
+  mip_problem -> int -> unit
+      = "ppl_MIP_Problem_add_space_dimensions_and_embed"
+
+external ppl_MIP_Problem_add_to_integer_space_dimensions:
+  mip_problem -> int list -> unit
+      = "ppl_MIP_Problem_add_to_integer_space_dimensions"
+
+external ppl_MIP_Problem_add_constraint:
+  mip_problem -> linear_constraint -> unit
+      = "ppl_MIP_Problem_add_constraint"
+
+external ppl_MIP_Problem_add_constraints:
+  mip_problem -> constraint_system -> unit
+      = "ppl_MIP_Problem_add_constraints"
+
+external ppl_MIP_Problem_set_objective_function:
+  mip_problem -> linear_expression -> unit
+      = "ppl_MIP_Problem_set_objective_function"
+
+external ppl_MIP_Problem_is_satisfiable:
+  mip_problem -> bool
+      = "ppl_MIP_Problem_is_satisfiable"
+
+external ppl_MIP_Problem_solve:
+  mip_problem -> mip_problem_status
+      = "ppl_MIP_Problem_solve"
+
+external ppl_MIP_Problem_optimization_mode:
+  mip_problem -> optimization_mode
+      = "ppl_MIP_Problem_optimization_mode"
+
+external ppl_MIP_Problem_feasible_point:
+  mip_problem -> linear_generator
+      = "ppl_MIP_Problem_feasible_point"
+
+external ppl_MIP_Problem_optimizing_point:
+  mip_problem -> linear_generator
+      = "ppl_MIP_Problem_optimizing_point"
+
+external ppl_MIP_Problem_objective_function:
+  mip_problem -> linear_expression
+      = "ppl_MIP_Problem_objective_function"
+
+external ppl_MIP_Problem_optimal_value:
+  mip_problem -> Z.t * Z.t
+      = "ppl_MIP_Problem_optimal_value"
+
+external ppl_MIP_Problem_evaluate_objective_function:
+  mip_problem -> linear_generator  -> Z.t * Z.t
+      = "ppl_MIP_Problem_evaluate_objective_function"
+
+external ppl_MIP_Problem_OK:
+  mip_problem -> bool
+      = "ppl_MIP_Problem_OK"
+
+external ppl_MIP_Problem_clear:
+  mip_problem -> unit
+      = "ppl_MIP_Problem_clear"
+
+external ppl_MIP_Problem_set_optimization_mode:
+  mip_problem -> optimization_mode -> unit
+      = "ppl_MIP_Problem_set_optimization_mode"
+
+external ppl_MIP_Problem_set_control_parameter:
+  mip_problem -> control_parameter_value -> unit
+      = "ppl_MIP_Problem_set_control_parameter"
+
+external ppl_MIP_Problem_get_control_parameter:
+  mip_problem -> control_parameter_name -> control_parameter_value
+      = "ppl_MIP_Problem_get_control_parameter"
+
+external ppl_MIP_Problem_swap:
+  mip_problem -> mip_problem -> unit
+      = "ppl_MIP_Problem_swap"
+
+external ppl_MIP_Problem_ascii_dump:
+  mip_problem -> string
+      = "ppl_MIP_Problem_ascii_dump"
+
+
+type pip_problem_status = Unfeasible_Pip_Problem
+                        | Optimized_Pip_Problem
+
+type pip_problem_control_parameter_name = Cutting_Strategy | Pivot_Row_Strategy
+
+type pip_problem_control_parameter_value = Cutting_Strategy_First
+                                         | Cutting_Strategy_Deepest
+                                         | Cutting_Strategy_All
+                                         | Pivot_Row_Strategy_First
+                                         | Pivot_Row_Strategy_Max_Column
+
+type artificial_parameter = linear_expression * Z.t
+
+type pip_tree_node
+
+type pip_problem
+
+external ppl_new_PIP_Problem_from_space_dimension:
+  int -> pip_problem = "ppl_new_PIP_Problem_from_space_dimension"
+
+external ppl_new_PIP_Problem:
+  int -> constraint_system -> int list -> pip_problem
+    = "ppl_new_PIP_Problem"
+
+external ppl_PIP_Problem_space_dimension:
+  pip_problem -> int = "ppl_PIP_Problem_space_dimension"
+
+external ppl_PIP_Problem_parameter_space_dimensions:
+  pip_problem -> int list = "ppl_PIP_Problem_parameter_space_dimensions"
+
+external ppl_PIP_Problem_constraints:
+  pip_problem -> constraint_system = "ppl_PIP_Problem_constraints"
+
+external ppl_PIP_Problem_add_space_dimensions_and_embed:
+  pip_problem -> int -> int -> unit
+      = "ppl_PIP_Problem_add_space_dimensions_and_embed"
+
+external ppl_PIP_Problem_add_to_parameter_space_dimensions:
+  pip_problem -> int list -> unit
+      = "ppl_PIP_Problem_add_to_parameter_space_dimensions"
+
+external ppl_PIP_Problem_add_constraint:
+  pip_problem -> linear_constraint -> unit
+      = "ppl_PIP_Problem_add_constraint"
+
+external ppl_PIP_Problem_add_constraints:
+  pip_problem -> constraint_system -> unit
+      = "ppl_PIP_Problem_add_constraints"
+
+external ppl_PIP_Problem_is_satisfiable:
+  pip_problem -> bool
+      = "ppl_PIP_Problem_is_satisfiable"
+
+external ppl_PIP_Problem_solve:
+  pip_problem -> pip_problem_status
+      = "ppl_PIP_Problem_solve"
+
+external ppl_PIP_Problem_solution:
+  pip_problem -> pip_tree_node
+      = "ppl_PIP_Problem_solution"
+
+external ppl_PIP_Problem_optimizing_solution:
+  pip_problem -> pip_tree_node
+      = "ppl_PIP_Problem_optimizing_solution"
+
+external ppl_PIP_Problem_get_big_parameter_dimension:
+  pip_problem -> int = "ppl_PIP_Problem_get_big_parameter_dimension"
+
+external ppl_PIP_Problem_has_big_parameter_dimension:
+  pip_problem -> bool = "ppl_PIP_Problem_has_big_parameter_dimension"
+
+external ppl_PIP_Problem_set_big_parameter_dimension:
+  pip_problem -> int -> unit = "ppl_PIP_Problem_set_big_parameter_dimension"
+
+external ppl_PIP_Problem_OK:
+  pip_problem -> bool
+      = "ppl_PIP_Problem_OK"
+
+external ppl_PIP_Problem_clear:
+  pip_problem -> unit
+      = "ppl_PIP_Problem_clear"
+
+external ppl_PIP_Problem_set_control_parameter:
+  pip_problem -> pip_problem_control_parameter_value -> unit
+      = "ppl_PIP_Problem_set_control_parameter"
+
+external ppl_PIP_Problem_get_control_parameter:
+  pip_problem -> pip_problem_control_parameter_name
+              -> pip_problem_control_parameter_value
+      = "ppl_PIP_Problem_get_control_parameter"
+
+external ppl_PIP_Problem_swap:
+  pip_problem -> pip_problem -> unit
+      = "ppl_PIP_Problem_swap"
+
+external ppl_PIP_Problem_ascii_dump:
+  pip_problem -> string
+      = "ppl_PIP_Problem_ascii_dump"
+
+external ppl_PIP_Tree_Node_constraints:
+  pip_tree_node -> constraint_system
+      = "ppl_PIP_Tree_Node_constraints"
+
+external ppl_PIP_Tree_Node_artificials:
+  pip_tree_node -> artificial_parameter list
+      = "ppl_PIP_Tree_Node_artificials"
+
+external ppl_PIP_Tree_Node_OK:
+  pip_tree_node -> bool
+      = "ppl_PIP_Tree_Node_OK"
+
+external ppl_PIP_Tree_Node_ascii_dump:
+  pip_tree_node -> string
+      = "ppl_PIP_Tree_Node_ascii_dump"
+
+external ppl_PIP_Tree_Node_is_bottom:
+  pip_tree_node -> bool
+      = "ppl_PIP_Tree_Node_is_bottom"
+
+external ppl_PIP_Tree_Node_is_solution:
+  pip_tree_node -> bool
+      = "ppl_PIP_Tree_Node_is_solution"
+
+external ppl_PIP_Tree_Node_parametric_values:
+  pip_tree_node -> int -> linear_expression
+      = "ppl_PIP_Tree_Node_parametric_values"
+
+external ppl_PIP_Tree_Node_is_decision:
+  pip_tree_node -> bool
+      = "ppl_PIP_Tree_Node_is_decision"
+
+external ppl_PIP_Tree_Node_true_child:
+  pip_tree_node -> pip_tree_node
+      = "ppl_PIP_Tree_Node_true_child"
+
+external ppl_PIP_Tree_Node_false_child:
+  pip_tree_node -> pip_tree_node
+      = "ppl_PIP_Tree_Node_false_child"
diff --git a/interfaces/OCaml/ppl_ocaml_globals.mli b/interfaces/OCaml/ppl_ocaml_globals.mli
new file mode 100644
index 0000000..f387e41
--- /dev/null
+++ b/interfaces/OCaml/ppl_ocaml_globals.mli
@@ -0,0 +1,376 @@
+(* OCaml interface: module inteface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Gmp
+
+exception PPL_arithmetic_overflow of string
+exception PPL_timeout_exception
+exception PPL_internal_error of string
+exception PPL_unknown_standard_exception of string
+exception PPL_unexpected_error of string
+
+type degenerate_element =
+    Universe
+  | Empty
+
+type linear_expression =
+    Variable of int
+  | Coefficient of Z.t
+  | Unary_Plus of linear_expression
+  | Unary_Minus of linear_expression
+  | Plus of linear_expression * linear_expression
+  | Minus of linear_expression * linear_expression
+  | Times of Z.t * linear_expression
+
+type linear_constraint =
+    Less_Than of linear_expression * linear_expression
+  | Less_Or_Equal of linear_expression * linear_expression
+  | Equal of linear_expression * linear_expression
+  | Greater_Than of linear_expression * linear_expression
+  | Greater_Or_Equal of linear_expression * linear_expression
+
+type linear_generator =
+    Line of linear_expression
+  | Ray of linear_expression
+  | Point of linear_expression * Z.t
+  | Closure_Point of linear_expression * Z.t
+
+type linear_grid_generator =
+    Grid_Line of linear_expression
+  | Grid_Parameter of linear_expression * Z.t
+  | Grid_Point of linear_expression * Z.t
+
+type poly_gen_relation =
+    Subsumes
+
+type poly_con_relation =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+  | Saturates
+
+type relation_with_congruence =
+    Is_Disjoint
+  | Strictly_Intersects
+  | Is_Included
+
+type linear_congruence = linear_expression * linear_expression * Z.t
+
+type constraint_system = linear_constraint list
+
+type generator_system = linear_generator list
+
+type grid_generator_system = linear_grid_generator list
+
+type congruence_system = linear_congruence list
+
+(* Note: the "_RS" suffix is to avoid name clashes with the declaration
+   of linear_constraint. *)
+type relation_symbol = Less_Than_RS | Less_Or_Equal_RS | Equal_RS
+                       | Greater_Than_RS | Greater_Or_Equal_RS
+
+type bounded_integer_type_overflow = Overflow_Wraps
+                                     | Overflow_Undefined
+                                     | Overflow_Impossible
+
+type bounded_integer_type_representation = Unsigned
+                                           | Signed_2_Complement
+
+type bounded_integer_type_width = Bits_8
+                                  | Bits_16
+                                  | Bits_32
+                                  | Bits_64
+                                  | Bits_128
+
+type complexity_class = Polynomial_Complexity
+                        | Simplex_Complexity
+                        | Any_Complexity
+
+type optimization_mode = Minimization | Maximization
+
+type mip_problem_status = Unfeasible_Mip_Problem | Unbounded_Mip_Problem
+                        | Optimized_Mip_Problem
+
+type control_parameter_name = Pricing
+
+type control_parameter_value = Pricing_Steepest_Edge_Float
+                               | Pricing_Steepest_Edge_Exact
+                               | Pricing_Textbook
+
+type pip_problem_status = Unfeasible_Pip_Problem
+                        | Optimized_Pip_Problem
+
+type pip_problem_control_parameter_name = Cutting_Strategy | Pivot_Row_Strategy
+
+type pip_problem_control_parameter_value = Cutting_Strategy_First
+                                         | Cutting_Strategy_Deepest
+                                         | Cutting_Strategy_All
+                                         | Pivot_Row_Strategy_First
+                                         | Pivot_Row_Strategy_Max_Column
+
+val ppl_version_major:
+  unit -> int
+
+val ppl_version_minor:
+  unit -> int
+
+val ppl_version_revision:
+  unit -> int
+
+val ppl_version_beta:
+  unit -> int
+
+val ppl_version:
+  unit -> string
+
+val ppl_banner:
+  unit -> string
+
+val ppl_io_wrap_string:
+  string -> int -> int -> int -> string
+
+val ppl_max_space_dimension:
+  unit -> int
+
+val ppl_Coefficient_bits:
+  unit -> int
+
+val ppl_Coefficient_is_bounded:
+  unit -> bool
+
+val ppl_Coefficient_max:
+  unit -> Z.t
+
+val ppl_Coefficient_min:
+  unit -> Z.t
+
+val ppl_Linear_Expression_is_zero:
+  linear_expression -> bool
+
+val ppl_Linear_Expression_all_homogeneous_terms_are_zero:
+  linear_expression -> bool
+
+val ppl_set_rounding_for_PPL:
+  unit -> unit
+
+val ppl_restore_pre_PPL_rounding:
+  unit -> unit
+
+val ppl_irrational_precision:
+  unit -> int
+
+val ppl_set_irrational_precision:
+  int -> unit
+
+val ppl_set_timeout:
+  int -> unit
+
+val ppl_reset_timeout:
+  unit -> unit
+
+val ppl_set_deterministic_timeout:
+  int -> int -> unit
+
+val ppl_reset_deterministic_timeout:
+  unit -> unit
+
+type mip_problem
+
+val ppl_new_MIP_Problem_from_space_dimension:
+  int -> mip_problem
+
+val ppl_new_MIP_Problem:
+  int -> constraint_system -> linear_expression
+    -> optimization_mode -> mip_problem
+
+val ppl_MIP_Problem_space_dimension:
+  mip_problem -> int
+
+val ppl_MIP_Problem_integer_space_dimensions:
+  mip_problem -> int list
+
+val ppl_MIP_Problem_constraints:
+  mip_problem -> constraint_system
+
+val ppl_MIP_Problem_add_space_dimensions_and_embed:
+  mip_problem -> int -> unit
+
+val ppl_MIP_Problem_add_to_integer_space_dimensions:
+  mip_problem -> int list -> unit
+
+val ppl_MIP_Problem_add_constraint:
+  mip_problem -> linear_constraint -> unit
+
+val ppl_MIP_Problem_add_constraints:
+  mip_problem -> constraint_system -> unit
+
+val ppl_MIP_Problem_set_objective_function:
+  mip_problem -> linear_expression -> unit
+
+val ppl_MIP_Problem_is_satisfiable:
+  mip_problem -> bool
+
+val ppl_MIP_Problem_solve:
+  mip_problem -> mip_problem_status
+
+val ppl_MIP_Problem_optimization_mode:
+  mip_problem -> optimization_mode
+
+val ppl_MIP_Problem_feasible_point:
+  mip_problem -> linear_generator
+
+val ppl_MIP_Problem_optimizing_point:
+  mip_problem -> linear_generator
+
+val ppl_MIP_Problem_objective_function:
+  mip_problem -> linear_expression
+
+val ppl_MIP_Problem_optimal_value:
+  mip_problem -> Z.t * Z.t
+
+val ppl_MIP_Problem_evaluate_objective_function:
+  mip_problem -> linear_generator  -> Z.t * Z.t
+
+val ppl_MIP_Problem_OK:
+  mip_problem -> bool
+
+val ppl_MIP_Problem_clear:
+  mip_problem -> unit
+
+val ppl_MIP_Problem_set_optimization_mode:
+  mip_problem -> optimization_mode -> unit
+
+val ppl_MIP_Problem_set_control_parameter:
+  mip_problem -> control_parameter_value -> unit
+
+val ppl_MIP_Problem_get_control_parameter:
+  mip_problem -> control_parameter_name -> control_parameter_value
+
+val ppl_MIP_Problem_swap:
+  mip_problem -> mip_problem -> unit
+
+val ppl_MIP_Problem_ascii_dump:
+  mip_problem -> string
+
+type pip_problem
+
+type pip_tree_node
+
+type artificial_parameter = linear_expression * Z.t
+
+val ppl_new_PIP_Problem_from_space_dimension:
+  int -> pip_problem
+
+val ppl_new_PIP_Problem:
+  int -> constraint_system -> int list -> pip_problem
+
+val ppl_PIP_Problem_space_dimension:
+  pip_problem -> int
+
+val ppl_PIP_Problem_parameter_space_dimensions:
+  pip_problem -> int list
+
+val ppl_PIP_Problem_constraints:
+  pip_problem -> constraint_system
+
+val ppl_PIP_Problem_add_space_dimensions_and_embed:
+  pip_problem -> int -> int -> unit
+
+val ppl_PIP_Problem_add_to_parameter_space_dimensions:
+  pip_problem -> int list -> unit
+
+val ppl_PIP_Problem_add_constraint:
+  pip_problem -> linear_constraint -> unit
+
+val ppl_PIP_Problem_add_constraints:
+  pip_problem -> constraint_system -> unit
+
+val ppl_PIP_Problem_is_satisfiable:
+  pip_problem -> bool
+
+val ppl_PIP_Problem_solve:
+  pip_problem -> pip_problem_status
+
+val ppl_PIP_Problem_solution:
+  pip_problem -> pip_tree_node
+
+val ppl_PIP_Problem_optimizing_solution:
+  pip_problem -> pip_tree_node
+
+val ppl_PIP_Problem_get_big_parameter_dimension:
+  pip_problem -> int
+
+val ppl_PIP_Problem_set_big_parameter_dimension:
+  pip_problem -> int -> unit
+
+val ppl_PIP_Problem_has_big_parameter_dimension:
+  pip_problem -> bool
+
+val ppl_PIP_Problem_OK:
+  pip_problem -> bool
+
+val ppl_PIP_Problem_clear:
+  pip_problem -> unit
+
+val ppl_PIP_Problem_set_control_parameter:
+  pip_problem -> pip_problem_control_parameter_value -> unit
+
+val ppl_PIP_Problem_get_control_parameter:
+  pip_problem -> pip_problem_control_parameter_name
+              -> pip_problem_control_parameter_value
+
+val ppl_PIP_Problem_swap:
+  pip_problem -> pip_problem -> unit
+
+val ppl_PIP_Problem_ascii_dump:
+  pip_problem -> string
+
+val ppl_PIP_Tree_Node_constraints:
+  pip_tree_node -> constraint_system
+
+val ppl_PIP_Tree_Node_artificials:
+  pip_tree_node -> artificial_parameter list
+
+val ppl_PIP_Tree_Node_ascii_dump:
+  pip_tree_node -> string
+
+val ppl_PIP_Tree_Node_OK:
+  pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_is_bottom:
+  pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_is_solution:
+  pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_parametric_values:
+  pip_tree_node -> int -> linear_expression
+
+val ppl_PIP_Tree_Node_is_decision:
+  pip_tree_node -> bool
+
+val ppl_PIP_Tree_Node_true_child:
+  pip_tree_node -> pip_tree_node
+
+val ppl_PIP_Tree_Node_false_child:
+  pip_tree_node -> pip_tree_node
diff --git a/interfaces/OCaml/tests/Makefile.am b/interfaces/OCaml/tests/Makefile.am
new file mode 100644
index 0000000..20e0034
--- /dev/null
+++ b/interfaces/OCaml/tests/Makefile.am
@@ -0,0 +1,176 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(srcdir)/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = \
+	$(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(CHECKER)
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_ocaml_procedure_generators.m4 \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+# Even if the OCaml sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake OCaml build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+-cclib -lmlgmp -cclib -lmpfr \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+
+if ENABLE_SHARED
+
+BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl$(SHREXT)
+
+else !ENABLE_SHARED
+
+BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl.$(LIBEXT)
+
+endif !ENABLE_SHARED
+
+PPL_DLOPEN = -dlopen ../../../src/libppl.la
+
+.ml.cmo:
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) $<
+
+.ml.cmx:
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) $<
+
+if HAVE_OCAMLC
+
+OCAMLC_TESTS = \
+test1 \
+ppl_ocaml_generated_test
+
+endif HAVE_OCAMLC
+
+if HAVE_OCAMLOPT
+
+OCAMLOPT_TESTS = \
+test1_opt \
+ppl_ocaml_generated_test_opt
+
+endif HAVE_OCAMLOPT
+
+TESTS = $(OCAMLC_TESTS) $(OCAMLOPT_TESTS)
+
+check_PROGRAMS = $(TESTS)
+
+test1_SOURCES = test1.ml
+
+test1$(EXEEXT): test1.cmo ../ppl_ocaml.cma
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ \
+		-cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+		ppl_ocaml.cma test1.cmo
+
+test1_opt_SOURCES = test1.ml
+
+test1_opt$(EXEEXT): test1.cmx ../ppl_ocaml.cmxa
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+		-cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+		ppl_ocaml.cmxa test1.cmx
+
+
+nodist_ppl_ocaml_generated_test_SOURCES = ppl_ocaml_generated_test.ml
+
+nodist_ppl_ocaml_generated_test_opt_SOURCES = ppl_ocaml_generated_test.ml
+
+ppl_ocaml_generated_test.ml: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_ocaml_test_ml.m4 \
+			> $@
+
+ppl_ocaml_generated_test$(EXEEXT): \
+ppl_ocaml_generated_test.cmo ../ppl_ocaml.cma
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ \
+		-cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+		ppl_ocaml.cma ppl_ocaml_generated_test.cmo
+
+ppl_ocaml_generated_test_opt$(EXEEXT): \
+ppl_ocaml_generated_test.cmx ../ppl_ocaml.cmxa
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+		-cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+		ppl_ocaml.cmxa ppl_ocaml_generated_test.cmx
+
+MOSTLYCLEANFILES = \
+test1.cmi \
+test1.cmo \
+test1.cmx \
+test1.o \
+test1 \
+test1_opt \
+ppl_ocaml_generated_test.cmi \
+ppl_ocaml_generated_test.cmo \
+ppl_ocaml_generated_test.cmx \
+ppl_ocaml_generated_test.o \
+ppl_ocaml_generated_test \
+ppl_ocaml_generated_test_opt
+
+CLEANFILES = ppl_ocaml_generated_test.ml
+
+../ppl_ocaml.cma:
+	$(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cma
+
+../ppl_ocaml.cmxa:
+	$(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cmxa
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
diff --git a/interfaces/OCaml/tests/Makefile.in b/interfaces/OCaml/tests/Makefile.in
new file mode 100644
index 0000000..f67cc01
--- /dev/null
+++ b/interfaces/OCaml/tests/Makefile.in
@@ -0,0 +1,1188 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+check_PROGRAMS = $(am__EXEEXT_3)
+subdir = interfaces/OCaml/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ at HAVE_OCAMLC_TRUE@am__EXEEXT_1 = test1$(EXEEXT) \
+ at HAVE_OCAMLC_TRUE@	ppl_ocaml_generated_test$(EXEEXT)
+ at HAVE_OCAMLOPT_TRUE@am__EXEEXT_2 = test1_opt$(EXEEXT) \
+ at HAVE_OCAMLOPT_TRUE@	ppl_ocaml_generated_test_opt$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+nodist_ppl_ocaml_generated_test_OBJECTS =
+ppl_ocaml_generated_test_OBJECTS =  \
+	$(nodist_ppl_ocaml_generated_test_OBJECTS)
+ppl_ocaml_generated_test_LDADD = $(LDADD)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+nodist_ppl_ocaml_generated_test_opt_OBJECTS =
+ppl_ocaml_generated_test_opt_OBJECTS =  \
+	$(nodist_ppl_ocaml_generated_test_opt_OBJECTS)
+ppl_ocaml_generated_test_opt_LDADD = $(LDADD)
+am_test1_OBJECTS =
+test1_OBJECTS = $(am_test1_OBJECTS)
+test1_LDADD = $(LDADD)
+am_test1_opt_OBJECTS =
+test1_opt_OBJECTS = $(am_test1_opt_OBJECTS)
+test1_opt_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(nodist_ppl_ocaml_generated_test_SOURCES) \
+	$(nodist_ppl_ocaml_generated_test_opt_SOURCES) \
+	$(test1_SOURCES) $(test1_opt_SOURCES)
+DIST_SOURCES = $(test1_SOURCES) $(test1_opt_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(srcdir)/valgrind_suppressions
+
+TESTS_ENVIRONMENT = \
+	$(LIBTOOL) --mode=execute $(PPL_DLOPEN) $(CHECKER)
+
+interface_generator_files = \
+ppl_interface_generator_ocaml_test_ml.m4 \
+ppl_interface_generator_ocaml_test_ml_code.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_ocaml_procedure_generators.m4 \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+
+# Even if the OCaml sources are not really needed, they are built by m4,
+# we need to include them to invoke the Automake OCaml build system.
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_ocaml_tests_common
+
+OCAMLC_ENV = OCAMLRUNPARAM='l=1M'
+OCAMLC_COMPILE_FLAGS = \
+-I @mlgmp_dir@ -I .. -ccopt -g -ccopt -Wno-write-strings
+
+OCAMLC_LINK_FLAGS = \
+-cclib -lmlgmp -cclib -lmpfr \
+`echo " $(extra_libraries) " | $(SED) -e "s/ -R[^ ]*//g" -e "s/ -/ -cclib -/g"`
+
+OCAMLOPT_ENV = $(OCAMLC_ENV)
+OCAMLOPT_COMPILE_FLAGS = $(OCAMLC_COMPILE_FLAGS)
+OCAMLOPT_LINK_FLAGS = $(OCAMLC_LINK_FLAGS)
+ at ENABLE_SHARED_FALSE@BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl.$(LIBEXT)
+ at ENABLE_SHARED_TRUE@BUILT_PPL_FLAGS = -cclib $(top_builddir)/src/.libs/libppl$(SHREXT)
+PPL_DLOPEN = -dlopen ../../../src/libppl.la
+ at HAVE_OCAMLC_TRUE@OCAMLC_TESTS = \
+ at HAVE_OCAMLC_TRUE@test1 \
+ at HAVE_OCAMLC_TRUE@ppl_ocaml_generated_test
+
+ at HAVE_OCAMLOPT_TRUE@OCAMLOPT_TESTS = \
+ at HAVE_OCAMLOPT_TRUE@test1_opt \
+ at HAVE_OCAMLOPT_TRUE@ppl_ocaml_generated_test_opt
+
+test1_SOURCES = test1.ml
+test1_opt_SOURCES = test1.ml
+nodist_ppl_ocaml_generated_test_SOURCES = ppl_ocaml_generated_test.ml
+nodist_ppl_ocaml_generated_test_opt_SOURCES = ppl_ocaml_generated_test.ml
+MOSTLYCLEANFILES = \
+test1.cmi \
+test1.cmo \
+test1.cmx \
+test1.o \
+test1 \
+test1_opt \
+ppl_ocaml_generated_test.cmi \
+ppl_ocaml_generated_test.cmo \
+ppl_ocaml_generated_test.cmx \
+ppl_ocaml_generated_test.o \
+ppl_ocaml_generated_test \
+ppl_ocaml_generated_test_opt
+
+CLEANFILES = ppl_ocaml_generated_test.ml
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cmo .cmx .log .ml .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/OCaml/tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/OCaml/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+test1.log: test1$(EXEEXT)
+	@p='test1$(EXEEXT)'; \
+	b='test1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ppl_ocaml_generated_test.log: ppl_ocaml_generated_test$(EXEEXT)
+	@p='ppl_ocaml_generated_test$(EXEEXT)'; \
+	b='ppl_ocaml_generated_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test1_opt.log: test1_opt$(EXEEXT)
+	@p='test1_opt$(EXEEXT)'; \
+	b='test1_opt'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ppl_ocaml_generated_test_opt.log: ppl_ocaml_generated_test_opt$(EXEEXT)
+	@p='ppl_ocaml_generated_test_opt$(EXEEXT)'; \
+	b='ppl_ocaml_generated_test_opt'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+.ml.cmo:
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ -c $(OCAMLC_COMPILE_FLAGS) $<
+
+.ml.cmx:
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ -c $(OCAMLOPT_COMPILE_FLAGS) $<
+
+test1$(EXEEXT): test1.cmo ../ppl_ocaml.cma
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ \
+		-cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+		ppl_ocaml.cma test1.cmo
+
+test1_opt$(EXEEXT): test1.cmx ../ppl_ocaml.cmxa
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+		-cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+		ppl_ocaml.cmxa test1.cmx
+
+ppl_ocaml_generated_test.ml: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_ocaml_test_ml.m4 \
+			> $@
+
+ppl_ocaml_generated_test$(EXEEXT): \
+ppl_ocaml_generated_test.cmo ../ppl_ocaml.cma
+	$(OCAMLC_ENV) $(OCAMLC) -o $@ \
+		-cc "$(CXX)" $(OCAMLC_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLC_LINK_FLAGS) \
+		ppl_ocaml.cma ppl_ocaml_generated_test.cmo
+
+ppl_ocaml_generated_test_opt$(EXEEXT): \
+ppl_ocaml_generated_test.cmx ../ppl_ocaml.cmxa
+	$(OCAMLOPT_ENV) $(OCAMLOPT) -o $@ \
+		-cc "$(CXX)" $(OCAMLOPT_COMPILE_FLAGS) \
+		$(BUILT_PPL_FLAGS) $(OCAMLOPT_LINK_FLAGS) \
+		ppl_ocaml.cmxa ppl_ocaml_generated_test.cmx
+
+../ppl_ocaml.cma:
+	$(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cma
+
+../ppl_ocaml.cmxa:
+	$(MAKE) $(AM_MAKEFLAGS) -C .. ppl_ocaml.cmxa
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4 b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
new file mode 100644
index 0000000..74cf925
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml.m4
@@ -0,0 +1,61 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+dnl
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_ocaml_procedure_generators.m4')
+m4_include(`ppl_interface_generator_ocaml_test_ml_code.m4')
+dnl
+dnl This file generates ppl_ocaml_test.ml.
+
+dnl ==================================================================
+dnl Print name of domain being tested
+dnl ==================================================================
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+print_string_if_noisy "\n";;
+print_string_if_noisy "\n";;
+print_string_if_noisy "m4_current_interface";;
+print_string_if_noisy "\n";;
+m4_undefine(`m4_current_interface')`'dnl
+m4_replace_all_patterns($1, m4_add_init_class_code($1))`'dnl
+')
+
+dnl ==================================================================
+dnl Test all methods
+dnl ==================================================================
+
+m4_divert`'dnl
+m4_include(`ppl_ocaml_tests_common')
+m4_all_code`'dnl
+
+print_string_if_noisy "\n";;
+at_exit Gc.full_major;;
+print_string_if_noisy "Bye!\n"
diff --git a/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4 b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
new file mode 100644
index 0000000..56b4280
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_interface_generator_ocaml_test_ml_code.m4
@@ -0,0 +1,967 @@
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+m4_divert(-1)
+
+dnl Code for generating the domain elements to be used in the tests.
+dnl Note that if a test may change these at all, then a copy should be used.
+m4_define(`m4_add_init_class_code', `dnl
+let @!TOPOLOGY@@!CLASS at 01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at CLASS@_refine_with_ at CONSTRAINER@s
+  @!TOPOLOGY@@!CLASS at 01 @CONSTRAINER at s01;;
+let @!TOPOLOGY@@!CLASS at 02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at CLASS@_refine_with_ at CONSTRAINER@s
+  @!TOPOLOGY@@!CLASS at 02 @CONSTRAINER at s02;;
+let @!TOPOLOGY@@!CLASS at 03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 3 Universe;;
+ppl_ at CLASS@_refine_with_ at CONSTRAINER@s
+  @!TOPOLOGY@@!CLASS at 03 @CONSTRAINER at s03;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`
+print_string_if_noisy "testing ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension" ;;
+print_string_if_noisy "\n";;
+print_string_if_noisy ("space_dimension: ");;
+for i = 6 downto 0 do
+  (let @!TOPOLOGY@@!CLASS@
+    = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension i Empty
+    in let dimension
+       =  ppl_ at CLASS@_space_dimension(@!TOPOLOGY@@!CLASS@)
+       in (print_int_if_noisy dimension;
+     print_string_if_noisy "@COMMA@ "))
+done;;
+print_string_if_noisy "\n";;
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`
+print_string_if_noisy "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@: " ;;
+let ps
+  = ppl_new_ at FRIEND@_from_space_dimension 3 Universe;;
+let ps1
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(ps);;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps1)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`
+print_string_if_noisy
+  "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity: " ;;
+print_string_if_noisy "\n";;
+let ps
+  = ppl_new_ at FRIEND@_from_space_dimension 3 Universe;;
+let ps_pc
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps Polynomial_Complexity ;;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps_pc)
+  then "with Polynomial_Complexity - success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+let ps_sc
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps Simplex_Complexity ;;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps_sc)
+  then "with Simplex_Complexity - success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+let ps_ac
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity ps Any_Complexity ;;
+let out = if (ppl_ at A_FRIEND@_OK ps & ppl_ at CLASS@_OK ps_ac)
+  then "with Any_Complexity - success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`
+print_string_if_noisy "testing ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s: " ;;
+let @!TOPOLOGY@@!CLASS@
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(@BUILD_REPRESENT at s1);;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS@)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at UB_EXACT@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let _result
+  =  ppl_ at CLASS@_ at UB_EXACT@ copy01 copy02;;
+let out
+  = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_swap: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_swap copy01 copy02;;
+let out
+  = if (u = () & ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at DIMENSION@: " ;;
+let dim
+  =  ppl_ at CLASS@_ at DIMENSION@ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "@DIMENSION@: ";;
+print_int_if_noisy dim ;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@: " ;;
+let _result
+  = ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@
+    @!TOPOLOGY@@!CLASS at 01 @RELATION_REPRESENT at 1;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_get_ at CLASS_REPRESENT@s: ";;
+let @CLASS_REPRESENT at s = ppl_ at CLASS@_get_ at CLASS_REPRESENT@s
+  @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+List.iter print_ at CLASS_REPRESENT@ @CLASS_REPRESENT at s;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at HAS_PROPERTY@: ";;
+let result = ppl_ at CLASS@_ at HAS_PROPERTY@ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "@HAS_PROPERTY@: ";;
+print_bool_if_noisy result;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at SIMPLIFY@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_ at SIMPLIFY@ copy01;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@: " ;;
+let _result
+  =  ppl_ at CLASS@_bounds_from_above @!TOPOLOGY@@!CLASS at 01 e2;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at MAXMIN@: ";;
+let (is_bounded, num, den, is_supremum)
+  = ppl_ at CLASS@_ at MAXMIN@ @!TOPOLOGY@@!CLASS at 01 e3;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_int_if_noisy(Z.to_int num);;
+print_string_if_noisy "/";;
+print_int_if_noisy(Z.to_int den);;
+print_string_if_noisy (", bound: ");;
+print_string_if_noisy (string_of_bool is_bounded);;
+print_string_if_noisy (", sup: ");;
+print_string_if_noisy (string_of_bool is_supremum);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at MAXMIN@_with_point: ";;
+let (is_bounded, num, den, is_supremum, pt)
+  = ppl_ at CLASS@_ at MAXMIN@_with_point @!TOPOLOGY@@!CLASS at 01 e3;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_int_if_noisy(Z.to_int num);;
+print_string_if_noisy "/";;
+print_int_if_noisy(Z.to_int den);;
+print_string_if_noisy (", bound: ");;
+print_string_if_noisy (string_of_bool is_bounded);;
+print_string_if_noisy (", sup: ");;
+print_string_if_noisy (string_of_bool is_supremum);;
+print_string_if_noisy (", ");;
+print_generator(pt);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at COMPARISON@_ at CLASS@: " ;;
+let b = ppl_ at CLASS@_ at COMPARISON@_ at CLASS@
+  @!TOPOLOGY@@!CLASS at 01 @!TOPOLOGY@@!CLASS at 02;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01
+               & ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_equals_ at CLASS@: " ;;
+let b = ppl_ at CLASS@_equals_ at CLASS@
+  @!TOPOLOGY@@!CLASS at 01 @!TOPOLOGY@@!CLASS at 02;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01
+               & ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_OK: ";;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01
+               & ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_add_ at CLASS_REPRESENT@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_add_ at CLASS_REPRESENT@ copy01 @CLASS_REPRESENT at 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_add_ at CLASS_REPRESENT@s: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_add_ at CLASS_REPRESENT@s copy01 @CLASS_REPRESENT at s1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+`
+print_string_if_noisy
+  "testing ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@
+  copy01 @REFINE_REPRESENT at 01;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+`
+print_string_if_noisy
+  "testing ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s
+  copy01 @REFINE_REPRESENT at s01;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at BINOP@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_ at BINOP@ copy01 copy02;;
+let out
+  = if (u = () & ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_simplify_using_context_assign: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let b = ppl_ at CLASS@_simplify_using_context_assign copy01 copy02;;
+let out
+  = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at AFFIMAGE@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_ at AFFIMAGE@ copy01 1 ((Z.of_int 2) */ v2) (Z.from_int 2);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_bounded_ at AFFIMAGE@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_bounded_ at AFFIMAGE@ copy01 1
+  ((Z.of_int 2) */ v2) v2 (Z.from_int 10);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@
+  copy01 1 Equal_RS v1 (Z.from_int 10);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+  copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+  copy01 1 Equal_RS v1 (Z.from_int 1) (Z.from_int 10);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+  copy01 ((Z.of_int 1) */ v0) Equal_RS (linear_expression_of_int 7) (Z.from_int 1);;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@ copy01 2;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_remove_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_remove = [2;0];;
+let u = ppl_ at CLASS@_remove_space_dimensions copy01 dimensions_to_remove;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_remove_higher_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_remove_higher_space_dimensions copy01 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_expand_space_dimension: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_expand_space_dimension copy01 1 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_fold_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_fold = [1];;
+let u = ppl_ at CLASS@_fold_space_dimensions copy01 dimensions_to_fold 0;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_map_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+let u = ppl_ at CLASS@_map_space_dimensions copy01 dimensions_to_map;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_constrains: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+ppl_ at CLASS@_constrains copy01 1;;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+ppl_ at CLASS@_map_space_dimensions copy01 dimensions_to_map;;
+let out = if (ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_unconstrain_space_dimension: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_unconstrain_space_dimension copy01 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_unconstrain_space_dimensions: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_to_unconstrain = [1];;
+let u = ppl_ at CLASS@_unconstrain_space_dimensions
+  copy01 dimensions_to_unconstrain;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at MEMBYTES@: " ;;
+let mb
+  =  ppl_ at CLASS@_ at MEMBYTES@ @!TOPOLOGY@@!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK @!TOPOLOGY@@!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "@MEMBYTES@: ";;
+print_int_if_noisy mb;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at WIDEN@_widening_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at WIDEN@_widening_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+  = ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens copy01 copy03 5;;
+let out = if (ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after widening = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_widening_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_widening_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_widening_assign_with_tokens_code: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+  = ppl_ at CLASS@_widening_assign_with_tokens copy01 copy03 5;;
+let out = if (ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after widening = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`
+print_string_if_noisy
+  "testing ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+  copy01 copy03 @CONSTRAINER at s04;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`
+print_string_if_noisy
+  "testing ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+  = ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+  copy01 copy03 @CONSTRAINER at s04 10;;
+let out = if (ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after widening = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let tokens
+  = ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+    copy01 copy03 5;;
+let out = if (ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens after extrapolation = ";;
+print_int_if_noisy tokens;;
+print_string_if_noisy "\n";;
+')
+
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 03);;
+let u = ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign copy03 copy01 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign: ";;
+let copy01
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy03
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 03);;
+let u = ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign copy01 copy03 ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign: ";;
+let copy01
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let copy03
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 03);;
+let u = ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign copy01 copy03 2;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`
+print_string_if_noisy "testing ppl_ at BEGINEND@_iterator: " ;;
+let it = ppl_ at CLASS@_ at BEGINEND@_iterator @!CLASS at 01;;
+let out = if (ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_iterator_equals_iterator: " ;;
+let it = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let it_begin = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let b = ppl_ at CLASS@_iterator_equals_iterator it it_begin;;
+let out = if (ppl_ at CLASS@_OK @!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`
+print_string_if_noisy "testing ppl_new_ at CLASS@_iterator_from_iterator: " ;;
+let it_begin = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let it_copy = ppl_new_ at CLASS@_iterator_from_iterator it_begin;;
+let b = ppl_ at CLASS@_iterator_equals_iterator it_copy it_begin;;
+let out = if (ppl_ at CLASS@_OK @!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ at INCDEC@_iterator: " ;;
+let itb = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let it_begin = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let ite = ppl_ at CLASS@_end_iterator @!CLASS at 01;;
+let it_end = ppl_ at CLASS@_end_iterator @!CLASS at 01;;
+let size = ppl_ at CLASS@_size @!CLASS at 01 in
+if (size > 0)
+  then (
+    ppl_ at CLASS@_increment_iterator itb;
+    ppl_ at CLASS@_decrement_iterator itb;
+    ppl_ at CLASS@_decrement_iterator ite;
+    ppl_ at CLASS@_increment_iterator ite;
+  );;
+let out = if ((ppl_ at CLASS@_OK @!CLASS at 01)
+               & (ppl_ at CLASS@_iterator_equals_iterator itb it_begin)
+               & (ppl_ at CLASS@_iterator_equals_iterator ite it_end))
+   then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_get_disjunct: " ;;
+let it = ppl_ at CLASS@_begin_iterator @!CLASS at 01;;
+let d = ppl_ at CLASS@_get_disjunct it;;
+let out = if (ppl_ at CLASS@_OK @!CLASS at 01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_disjunct: " ;;
+let copy01
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let it = ppl_ at CLASS@_begin_iterator copy01;;
+let u = ppl_ at CLASS@_drop_disjunct copy01 it;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_disjuncts: " ;;
+let copy01
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let it1 = ppl_ at CLASS@_begin_iterator copy01;;
+let it2 = ppl_ at CLASS@_begin_iterator copy01;;
+let u = ppl_ at CLASS@_drop_disjuncts copy01 it1 it2;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_ascii_dump: " ;;
+print_string_if_noisy (ppl_ at CLASS@_ascii_dump @!TOPOLOGY@@!CLASS at 01);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_linear_ at PARTITION@: " ;;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let (intsn, ptt)
+  =  ppl_ at CLASS@_linear_partition copy01 copy02;;
+let out
+  = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_linear_ at PARTITION@: " ;;
+let copy01
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let copy02
+  = ppl_new_ at CLASS@_from_ at CLASS@(@!CLASS at 01);;
+let (intsn, ptt, is_finite)
+  =  ppl_ at CLASS@_approximate_partition copy01 copy02;;
+let out
+  = if (ppl_ at CLASS@_OK copy01 & ppl_ at CLASS@_OK copy02)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_some_non_integer_points: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let u = ppl_ at CLASS@_drop_some_non_integer_points copy01 Any_Complexity ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_drop_some_non_integer_points: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_integer = [1];;
+let u = ppl_ at CLASS@_drop_some_non_integer_points_2 copy01 dimensions_integer Any_Complexity ;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`
+print_string_if_noisy "testing ppl_ at CLASS@_wrap_assign: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let dimensions_integer = [1];;
+let u = ppl_ at CLASS@_wrap_assign copy01 [] Bits_8 Unsigned Overflow_Wraps
+                                [] 0 1;;
+let out = if (u = () & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+print_string_if_noisy
+  "testing ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let univ
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 2 Universe;;
+let u = ppl_ at CLASS@_concatenate_assign copy01 @!TOPOLOGY@@!CLASS at 01;;
+let result1 = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ univ;;
+let result2
+  = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@ copy01;;
+let out = if (not result1 & not result2 & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+print_string_if_noisy
+  "testing ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2: ";;
+let copy01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 01);;
+let copy02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(@!TOPOLOGY@@!CLASS at 02);;
+let u = ppl_ at CLASS@_concatenate_assign copy02 @!TOPOLOGY@@!CLASS at 02;;
+let result1
+  = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 copy01 copy02;;
+let univ01
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 2 Universe;;
+let univ02
+  = ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension 4 Universe;;
+let result2
+  = ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2 univ01 univ02;;
+let out = if (not result1 & not result2 & ppl_ at CLASS@_OK copy01)
+  then "success" else "failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+')
diff --git a/interfaces/OCaml/tests/ppl_ocaml_tests_common b/interfaces/OCaml/tests/ppl_ocaml_tests_common
new file mode 100644
index 0000000..01efb26
--- /dev/null
+++ b/interfaces/OCaml/tests/ppl_ocaml_tests_common
@@ -0,0 +1,293 @@
+(* Common part of the OCaml generated tests.  -*- Tuareg -*-
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Ppl_ocaml
+open Printf
+open Gmp
+
+let print_string_if_very_noisy = function str ->
+  let less_noisy = "LESS_NOISY"
+  in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+    with Not_found -> less_noisy
+  in
+    if (very_noisy != less_noisy)
+    then print_string str;
+;;
+
+let print_string_if_noisy = function str ->
+  let quiet = "QUIET"
+  in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+    with Not_found -> quiet
+  in
+    if (noisy != quiet)
+    then print_string str
+    else print_string_if_very_noisy str;
+;;
+
+let print_int_if_very_noisy = function num ->
+  let less_noisy = "LESS_NOISY"
+  in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+    with Not_found -> less_noisy
+  in
+    if (very_noisy != less_noisy)
+    then print_int num;
+;;
+
+let print_int_if_noisy = function num ->
+  let quiet = "QUIET"
+  in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+    with Not_found -> quiet
+  in
+    if (noisy != quiet)
+    then print_int num
+    else print_int_if_very_noisy num;
+;;
+
+let print_bool_if_very_noisy = function b ->
+  let less_noisy = "LESS_NOISY"
+  in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+    with Not_found -> less_noisy
+  in
+    if (very_noisy != less_noisy)
+    then printf "%b" b;
+;;
+
+let print_bool_if_noisy = function b ->
+  let quiet = "QUIET"
+  in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+    with Not_found -> quiet
+  in
+    if (noisy != quiet)
+    then printf "%b" b
+    else print_bool_if_very_noisy b;
+;;
+
+let rec print_linear_expression = function
+    Variable v ->
+      print_string_if_noisy "V(";
+      print_int_if_noisy v;
+      print_string_if_noisy ")";
+  | Coefficient c ->
+      print_int_if_noisy(Z.to_int c)
+  | Unary_Minus e ->
+      print_string_if_noisy "-(";
+      print_linear_expression e;
+      print_string_if_noisy ")";
+  | Unary_Plus e ->
+      print_linear_expression e
+  | Plus (e1, e2) ->
+      print_string_if_noisy "(";
+      print_linear_expression e1;
+      print_string_if_noisy " + ";
+      print_linear_expression e2;
+      print_string_if_noisy ")";
+  | Minus (e1, e2) ->
+      print_string_if_noisy "(";
+      print_linear_expression e1;
+      print_string_if_noisy " - ";
+      print_linear_expression e2;
+      print_string_if_noisy ")";
+  | Times (c, e) ->
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy "*(";
+      print_linear_expression e;
+      print_string_if_noisy ")";
+;;
+
+let print_constraint = function
+    Less_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " < ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Less_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " <= ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " == ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Greater_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " > ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Greater_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " >= ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+;;
+
+let print_generator = function
+    Ray (le1) ->
+      print_string_if_noisy "Ray: ";
+      print_linear_expression le1;
+      print_string_if_noisy ", ";
+  |  Line (le1) ->
+       print_string_if_noisy "Line: ";
+       print_linear_expression le1;
+       print_string_if_noisy ", ";
+  | Point (le1, c) ->
+      print_string_if_noisy "Point: ";
+      print_linear_expression le1;
+      print_string_if_noisy " den: ";
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy ", ";
+  | Closure_Point (le1, c) ->
+      print_string_if_noisy "Closure_Point: ";
+      print_linear_expression le1;
+      print_string_if_noisy " den: ";
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy ", ";;
+
+let print_congruence = function x,y,z ->
+  print_linear_expression x;
+  print_string_if_noisy " %= ";
+  print_linear_expression y;
+  print_string_if_noisy " mod ";
+  print_int_if_noisy(Z.to_int z);
+  print_string_if_noisy ", ";;
+
+
+let print_grid_generator = function
+  |  Grid_Line (le1) ->
+      print_string_if_noisy "Line: ";
+      print_linear_expression le1;
+      print_string_if_noisy ", ";
+  | Grid_Point (le1, c) ->
+      print_string_if_noisy "Point: ";
+      print_linear_expression le1;
+      print_string_if_noisy " den: ";
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy ", ";
+  | Grid_Parameter (le1, c) ->
+      print_string_if_noisy "Parameter: ";
+      print_linear_expression le1;
+      print_string_if_noisy " den: ";
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy ", ";;
+
+(* Build linear expressions the hard way. *)
+
+print_string_if_noisy "Build linear expressions manually:\n" ;;
+
+let rec v0 = Variable 0
+and v1 = Variable 1
+and v2 = Variable 2
+and n = Coefficient (Z.from_int 3)
+and e1 = Plus (v2, v2)
+and e2 = Times ((Z.from_int 7), v0)
+and e3 = Plus (n, v2)
+;;
+
+print_linear_expression v0; print_string_if_noisy "\n" ;;
+print_linear_expression v1; print_string_if_noisy "\n" ;;
+print_linear_expression v2; print_string_if_noisy "\n" ;;
+print_linear_expression n; print_string_if_noisy "\n" ;;
+print_linear_expression e1; print_string_if_noisy "\n" ;;
+print_linear_expression e2; print_string_if_noisy "\n" ;;
+
+(* See whether operators can make life better. *)
+
+print_string_if_noisy "Build linear expressions with operators:\n" ;;
+
+let linear_expression_of_int n = Coefficient (Z.of_int n) ;;
+let linear_expression_plus e1 e2 = Plus (e1, e2) ;;
+let linear_expression_minus e1 e2 = Minus (e1, e2) ;;
+let linear_expression_times v2 e = Times (v2, e) ;;
+let linear_constraint_eq e1 e2 = Equal (e1, e2) ;;
+let linear_constraint_lt e1 e2 = Less_Than (e1, e2) ;;
+let linear_constraint_gt e1 e2 = Greater_Than (e1, e2) ;;
+let linear_constraint_le e1 e2 = Less_Or_Equal (e1, e2) ;;
+let linear_constraint_ge e1 e2 = Greater_Or_Equal (e1, e2) ;;
+
+let ( +/ ) = linear_expression_plus
+let ( -/ ) = linear_expression_minus
+let ( */ ) = linear_expression_times
+let ( =/ ) = linear_constraint_eq
+let ( </ ) = linear_constraint_lt
+let ( >/ ) = linear_constraint_gt
+let ( <=/ ) = linear_constraint_le
+let ( >=/ ) = linear_constraint_ge
+
+let e3 =
+  (Z.of_int 3) */ v0
+  +/
+  (Z.of_int 4) */ v1
+  -/
+  (linear_expression_of_int 7)
+;;
+
+print_linear_expression e3; print_string_if_noisy "\n" ;;
+
+(* Probably the most convenient thing for the user will be to use the
+   the Camlp4 preprocessor: see
+   http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#htoc10 *)
+
+(* Build some PPL::C_Polyhedron. *)
+
+let constraint1 = (e2 >=/ e2);;
+let constraints1 = [e1 =/ n; e1 <=/ e1; e1 >=/ e1 -/ n] ;;
+let generator1 = Point (e3, (Z.from_int 1));;
+let generators1 = [Point (e2, (Z.from_int 1)); Point (e1, (Z.from_int 2))] ;;
+let congruence1 = (e2, e2 , (Z.from_int 1));;
+let congruences1 = [e1, (linear_expression_of_int 5), (Z.from_int 0)];;
+let grid_generator1 = Grid_Point (e3, (Z.from_int 1));;
+let grid_generators1 = [Grid_Point (e3, (Z.from_int 1))];;
+
+let mip1 =  ppl_new_MIP_Problem 10 constraints1 e3 Maximization;;
+let objective_func = ppl_MIP_Problem_objective_function mip1;;
+print_string_if_noisy "\n";;
+print_linear_expression objective_func;;
+let i = ppl_MIP_Problem_space_dimension mip1;;
+print_string_if_noisy "\n";;
+print_int_if_noisy i;;
+let i = ppl_MIP_Problem_constraints mip1;;
+print_string_if_noisy "\n";;
+List.iter print_constraint i;;
+
+let constraint01 = (v0 >=/ (linear_expression_of_int 1));;
+let constraints01 = [(v0 >=/ (linear_expression_of_int 1));
+                     (v1 >=/ (linear_expression_of_int 1));
+                     (v2 >=/ (linear_expression_of_int 1))];;
+let constraints02 = [(v0 <=/ (linear_expression_of_int 1));
+                     (v1 >=/ (linear_expression_of_int 1))];;
+let constraints03 = [(v0 >=/ (linear_expression_of_int 2));
+                     (v1 >=/ (linear_expression_of_int 1));
+                     (v2 >=/ (linear_expression_of_int 1))];;
+let constraints04 = [(v0 >=/ (linear_expression_of_int 2))];;
+let congruence01 = (v0, (linear_expression_of_int 0), (Z.from_int 2));;
+let congruences01 = [(v0, (linear_expression_of_int 0), (Z.from_int 2));
+                    (v1, (linear_expression_of_int 0), (Z.from_int 1));
+                    (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences02 = [(v0, (linear_expression_of_int 1), (Z.from_int 3));
+                    (v1, (linear_expression_of_int 0), (Z.from_int 1));
+                    (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences03 = [(v0, (linear_expression_of_int 0), (Z.from_int 4));
+                    (v1, (linear_expression_of_int 0), (Z.from_int 1));
+                    (v2, (linear_expression_of_int 0), (Z.from_int 1))];;
+let congruences04 = [(v0, (linear_expression_of_int 0), (Z.from_int 4))];;
diff --git a/interfaces/OCaml/tests/test1.ml b/interfaces/OCaml/tests/test1.ml
new file mode 100644
index 0000000..184b4f1
--- /dev/null
+++ b/interfaces/OCaml/tests/test1.ml
@@ -0,0 +1,690 @@
+(* Simple program testing the PPL OCaml interface on a few random things.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . *)
+
+open Ppl_ocaml
+open Printf
+open Gmp
+
+let print_string_if_very_noisy = function str ->
+  let less_noisy = "LESS_NOISY"
+  in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+    with Not_found -> less_noisy
+  in
+    if (very_noisy != less_noisy)
+    then print_string str;
+;;
+
+let print_string_if_noisy = function str ->
+  let quiet = "QUIET"
+  in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+    with Not_found -> quiet
+  in
+    if (noisy != quiet)
+    then print_string str
+    else print_string_if_very_noisy str;
+;;
+
+let print_int_if_very_noisy = function num ->
+  let less_noisy = "LESS_NOISY"
+  in let very_noisy = try Sys.getenv "PPL_VERY_NOISY_TESTS"
+    with Not_found -> less_noisy
+  in
+    if (very_noisy != less_noisy)
+    then print_int num;
+;;
+
+let print_int_if_noisy = function num ->
+  let quiet = "QUIET"
+  in let noisy = try Sys.getenv "PPL_NOISY_TESTS"
+    with Not_found -> quiet
+  in
+    if (noisy != quiet)
+    then print_int num
+    else print_int_if_very_noisy num;
+;;
+
+let rec print_linear_expression = function
+    Variable v ->
+      print_string_if_noisy "V(";
+      print_int_if_noisy v;
+      print_string_if_noisy ")";
+  | Coefficient c ->
+      print_int_if_noisy(Z.to_int c)
+  | Unary_Minus e ->
+      print_string_if_noisy "-(";
+      print_linear_expression e;
+      print_string_if_noisy ")";
+  | Unary_Plus e ->
+      print_linear_expression e
+  | Plus (e1, e2) ->
+      print_string_if_noisy "(";
+      print_linear_expression e1;
+      print_string_if_noisy " + ";
+      print_linear_expression e2;
+      print_string_if_noisy ")";
+  | Minus (e1, e2) ->
+      print_string_if_noisy "(";
+      print_linear_expression e1;
+      print_string_if_noisy " - ";
+      print_linear_expression e2;
+      print_string_if_noisy ")";
+  | Times (c, e) ->
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy "*(";
+      print_linear_expression e;
+      print_string_if_noisy ")";
+;;
+
+let rec print_constraint = function
+    Less_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " < ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Less_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " <= ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " == ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Greater_Than (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " > ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+  | Greater_Or_Equal (le1, le2) ->
+      print_linear_expression le1;
+      print_string_if_noisy " >= ";
+      print_linear_expression le2;
+      print_string_if_noisy ", ";
+;;
+
+let rec print_generator = function
+    Ray (le1) ->
+      print_string_if_noisy "Ray: ";
+      print_linear_expression le1;
+      print_string_if_noisy ", ";
+  |  Line (le1) ->
+      print_string_if_noisy "Line: ";
+      print_linear_expression le1;
+      print_string_if_noisy ", ";
+  | Point (le1, c) ->
+      print_string_if_noisy "Point: ";
+      print_linear_expression le1;
+      print_string_if_noisy " den: ";
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy ", ";
+| Closure_Point (le1, c) ->
+      print_string_if_noisy "Closure_Point: ";
+      print_linear_expression le1;
+      print_string_if_noisy " den: ";
+      print_int_if_noisy(Z.to_int c);
+      print_string_if_noisy ", ";;
+
+let print_congruence = function x,y,z ->
+  print_linear_expression x;
+  print_string_if_noisy " %= ";
+  print_linear_expression y;
+  print_string_if_noisy " mod ";
+  print_int_if_noisy(Z.to_int z);
+  print_string_if_noisy ", ";;
+
+let print_artificial_parameter = function x,y ->
+  print_linear_expression x;
+  print_string_if_noisy " / ";
+  print_int_if_noisy(Z.to_int y);
+  print_string_if_noisy ", ";;
+
+(* Build linear expressions the hard way. *)
+
+print_string_if_noisy "Build linear expressions manually:\n" ;;
+
+let rec a = Variable 0
+and b = Variable 1
+and c = Variable 2
+and n = Coefficient (Z.from_int 3)
+and e1 = Plus (c, c)
+and e2 = Times ((Z.from_int 7), a)
+and e3 = Plus (n, c)
+;;
+
+print_linear_expression a; print_string_if_noisy "\n" ;;
+print_linear_expression b; print_string_if_noisy "\n" ;;
+print_linear_expression c; print_string_if_noisy "\n" ;;
+print_linear_expression n; print_string_if_noisy "\n" ;;
+print_linear_expression e1; print_string_if_noisy "\n" ;;
+print_linear_expression e2; print_string_if_noisy "\n" ;;
+
+(* See whether operators can make life better. *)
+
+print_string_if_noisy "Build linear expressions with operators:\n" ;;
+
+let linear_expression_of_int n = Coefficient (Z.of_int n) ;;
+let linear_expression_plus e1 e2 = Plus (e1, e2) ;;
+let linear_expression_minus e1 e2 = Minus (e1, e2) ;;
+let linear_expression_times c e = Times (c, e) ;;
+let linear_constraint_eq e1 e2 = Equal (e1, e2) ;;
+let linear_constraint_lt e1 e2 = Less_Than (e1, e2) ;;
+let linear_constraint_gt e1 e2 = Greater_Than (e1, e2) ;;
+let linear_constraint_le e1 e2 = Less_Or_Equal (e1, e2) ;;
+let linear_constraint_ge e1 e2 = Greater_Or_Equal (e1, e2) ;;
+
+let ( +/ ) = linear_expression_plus
+let ( -/ ) = linear_expression_minus
+let ( */ ) = linear_expression_times
+let ( =/ ) = linear_constraint_eq
+let ( </ ) = linear_constraint_lt
+let ( >/ ) = linear_constraint_gt
+let ( <=/ ) = linear_constraint_le
+let ( >=/ ) = linear_constraint_ge
+
+let e3 =
+  (Z.of_int 3) */ a
+  +/
+  (Z.of_int 4) */ b
+  -/
+  (linear_expression_of_int 7)
+;;
+print_linear_expression e3; print_string_if_noisy "\n" ;;
+
+(* Probably the most convenient thing for the user will be to use the
+   the Camlp4 preprocessor: see
+   http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#htoc10 *)
+
+(* Build some PPL::C_Polyhedron. *)
+
+let constraint1 = (e2 >=/ e2);;
+let constraints1 = [e3 >=/ e1; e1 >=/ e2; e1 <=/ e2 -/ n] ;;
+let generator1 = Point (e3, (Z.from_int 1));;
+let generators1 = [Point (e2, (Z.from_int 1)); Point (e1, (Z.from_int 2))] ;;
+let congruence1 = (e2, e2 , (Z.from_int 1));;
+let congruences1 = [e3, e2 , (Z.from_int 20)];;
+let grid_generator1 = Grid_Point (e3, (Z.from_int 1));;
+
+let mip1 = ppl_new_MIP_Problem 10 constraints1 e3 Maximization;;
+let objective_func = ppl_MIP_Problem_objective_function mip1;;
+print_string_if_noisy "\n";;
+print_linear_expression objective_func;;
+let i = ppl_MIP_Problem_space_dimension mip1;;
+print_string_if_noisy "\n";;
+let i = ppl_MIP_Problem_constraints mip1;;
+print_string_if_noisy "\n";;
+List.iter print_constraint i;;
+let i = ppl_MIP_Problem_get_control_parameter mip1 Pricing;;
+print_string_if_noisy "\n";;
+ppl_MIP_Problem_set_control_parameter mip1 Pricing_Textbook;;
+let i = ppl_MIP_Problem_get_control_parameter mip1 Pricing;;
+let out = if (i == Pricing_Textbook)
+  then "Control Parameter test succeeded"
+  else "Control Parameter test failed"
+    in (print_string_if_noisy out);;
+
+print_string_if_noisy "\n";;
+print_string_if_noisy ("space dimensions: ");;
+for i = 6 downto 0 do
+  let polyhedron1 = ppl_new_C_Polyhedron_from_space_dimension i Empty
+  in let dimension =  ppl_Polyhedron_space_dimension(polyhedron1)
+  in (print_int_if_noisy dimension;
+     print_string_if_noisy ", ")
+done;;
+print_string_if_noisy "\n";;
+
+let c1 = (a  >=/ linear_expression_of_int 0);;
+let c2 = (a  <=/ linear_expression_of_int 2);;
+let c2a = (a  <=/ linear_expression_of_int 3);;
+let c3 = (b  >=/ linear_expression_of_int 0);;
+let c4 = (b  <=/ linear_expression_of_int 2);;
+let cs1 = [c1; c2; c3; c4];;
+let cs2 = [c1; c2a; c3; c4];;
+let poly1 = ppl_new_C_Polyhedron_from_constraints(cs1);;
+let poly2 = ppl_new_C_Polyhedron_from_constraints(cs2);;
+
+let polyhedron1 = ppl_new_C_Polyhedron_from_constraints(constraints1);;
+let polyhedron2 = ppl_new_C_Polyhedron_from_generators(generators1);;
+let result =  ppl_Polyhedron_bounds_from_above polyhedron1 e2;;
+let p = Ppl_ocaml.ppl_new_C_Polyhedron_from_constraints [];;
+let u = Ppl_ocaml.ppl_Polyhedron_add_constraints p [];;
+let out = if (u == ())
+  then "ppl_Polyhedron_add_constraints returns unit"
+  else "ppl_Polyhedron_add_constraints does not return unit"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+
+ppl_Polyhedron_add_constraint polyhedron1 constraint1;;
+ppl_Polyhedron_add_generator polyhedron1 generator1;;
+let b = ppl_Polyhedron_is_disjoint_from_Polyhedron
+  polyhedron1 polyhedron2;;
+ppl_Polyhedron_concatenate_assign polyhedron1 polyhedron2;;
+let congruences = ppl_Polyhedron_get_congruences polyhedron1 in
+List.iter print_congruence congruences;;
+print_string_if_noisy "\n";;
+
+print_string_if_noisy "\nTesting affine transformations \n";;
+ppl_Polyhedron_bounded_affine_preimage polyhedron1 1 e1 e2 (Z.from_int 10);;
+ppl_Polyhedron_bounded_affine_preimage polyhedron1 1 e1 e2 (Z.from_int 10);;
+ppl_Polyhedron_affine_image polyhedron1 1 e1 (Z.from_int 10);;
+
+print_string_if_noisy "\nTesting widenings and extrapolations \n";;
+let tokens_l_BHRZ03 =
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+  polyhedron1 polyhedron1 constraints1 10;;
+let tokens_b_BHRZ03 =
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+  polyhedron1 polyhedron1 constraints1 10;;
+let tokens_b_H79 = ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+  polyhedron1 polyhedron1 constraints1 10;;
+let tokens_H79 = ppl_Polyhedron_H79_widening_assign_with_tokens poly2 poly1 2;;
+ppl_Polyhedron_H79_widening_assign polyhedron1 polyhedron1 ;;
+print_string_if_noisy "tokens b_H79 = ";;
+print_int_if_noisy tokens_b_H79;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens b_BHRZ03 = ";;
+print_int_if_noisy tokens_b_BHRZ03;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "tokens H79 = ";;
+print_int_if_noisy tokens_H79;;
+print_string_if_noisy "\n";;
+
+let b = ppl_Polyhedron_OK polyhedron1;;
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+  polyhedron1 e1 Equal_RS e1;;
+ppl_Polyhedron_generalized_affine_image
+  polyhedron1 1 Equal_RS e2 (Z.from_int 10);;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Testing minimization";;
+let is_bounded, num, den, is_supremum, gen
+  = ppl_Polyhedron_minimize_with_point polyhedron1 e3;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Value: ";;
+print_int_if_noisy(Z.to_int num);;
+print_string_if_noisy "/";;
+print_int_if_noisy(Z.to_int den);;
+print_string_if_noisy ", is_bounded: ";;
+print_string_if_noisy (string_of_bool is_bounded);;
+print_string_if_noisy ", is_supremum: ";;
+print_string_if_noisy (string_of_bool is_supremum);;
+print_string_if_noisy ", generator: ";;
+print_generator(gen);;
+print_string_if_noisy "\n";;
+let dimensions_to_remove = [3;0];;
+ppl_Polyhedron_remove_space_dimensions polyhedron1 dimensions_to_remove;;
+let dimensions_to_fold = [1];;
+ppl_Polyhedron_fold_space_dimensions polyhedron1 dimensions_to_fold 0;;
+let dimensions_to_map = [(0,1);(1,2);(2,0);];;
+let i = ppl_Polyhedron_space_dimension polyhedron1;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Space dimension is: ";
+print_int_if_noisy i;;
+print_string_if_noisy "\n";;
+ppl_Polyhedron_map_space_dimensions polyhedron1 dimensions_to_map;;
+ppl_Polyhedron_constrains polyhedron1 1;;
+ppl_Polyhedron_unconstrain_space_dimension polyhedron1 1;;
+let dimensions_to_unconstrain = [1];;
+ppl_Polyhedron_unconstrain_space_dimensions
+  polyhedron1 dimensions_to_unconstrain;;
+print_string_if_noisy "\n";;
+ppl_Polyhedron_swap polyhedron1 polyhedron2;;
+let result = ppl_Polyhedron_simplify_using_context_assign
+  polyhedron1 polyhedron2;;
+let c_polyhedron1 = ppl_new_C_Polyhedron_from_space_dimension 10 Universe;;
+let constraints = ppl_Polyhedron_get_minimized_constraints c_polyhedron1;;
+let cs_size =  List.length constraints;;
+print_string_if_noisy "\nSize of minimized constraints get from a C_Polyhedron built from Universe : ";;
+print_int_if_noisy(cs_size);;
+let nnc_polyhedron1 = ppl_new_NNC_Polyhedron_from_space_dimension 10 Universe;;
+let constraints = ppl_Polyhedron_get_minimized_constraints nnc_polyhedron1;;
+let cs_size =  List.length constraints;;
+print_string_if_noisy "\nSize of minimized constraints get from a NNC_Polyhedron built from Universe : ";;
+print_int_if_noisy(cs_size);;
+ppl_set_rounding_for_PPL ();;
+ppl_restore_pre_PPL_rounding ();;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Major version is: ";
+print_int_if_noisy(ppl_version_major ());;
+print_string_if_noisy ", minor version is: ";
+print_int_if_noisy(ppl_version_minor ());;
+print_string_if_noisy ", revision is: ";
+print_int_if_noisy(ppl_version_revision ());;
+print_string_if_noisy ", beta is: ";
+print_int_if_noisy(ppl_version_beta ());;
+print_string_if_noisy "\n";;
+let v = ppl_version ();;
+print_string_if_noisy "Version is: ";
+print_string_if_noisy(v);;
+let b = ppl_banner ();;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Banner is: ";
+print_string_if_noisy(b);;
+print_string_if_noisy "\n\n";;
+print_string_if_noisy "PPL Coefficient integer datatype is " ;;
+if (ppl_Coefficient_is_bounded())
+then print_string_if_noisy "bounded\n"
+else print_string_if_noisy "unbounded\n" ;;
+print_string_if_noisy "Maximum space dimension is: ";
+let i = ppl_max_space_dimension()
+in print_int_if_noisy i;;
+print_string_if_noisy "\n";;
+print_string_if_noisy "Irrational precision is: ";
+let p = ppl_irrational_precision()
+in print_int_if_noisy(p);;
+print_string_if_noisy "\n";;
+
+(* Testing exceptions *)
+try
+  let _ = ppl_new_MIP_Problem_from_space_dimension (-10)
+  in print_string_if_noisy "Exception test failed"
+with Invalid_argument what ->
+  print_string_if_noisy "Exception test succeeded; caught exception is:\n";
+  print_string_if_noisy what;
+  print_string_if_noisy "\n";;
+
+(* Testing timeouts *)
+let lower = Coefficient(Gmp.Z.of_int 0)
+and upper = Coefficient(Gmp.Z.of_int 1)
+in let rec hypercube_cs dim =
+  if dim < 0
+  then []
+  else Greater_Or_Equal(Variable dim, lower)
+         :: Less_Or_Equal(Variable dim, upper)
+           :: hypercube_cs (dim-1)
+and hypercube_ph dim =
+  ppl_new_C_Polyhedron_from_constraints (hypercube_cs dim)
+and compute_timeout_hypercube dim_in dim_out =
+  if dim_in < dim_out then (
+    let _ = ppl_Polyhedron_get_minimized_constraints (hypercube_ph dim_in)
+    in (
+        print_string_if_noisy "Built hypercube of dimension ";
+        print_int_if_noisy dim_in;
+        print_string_if_noisy "\n"
+    );
+    compute_timeout_hypercube (dim_in + 1) dim_out
+  )
+in (
+  begin
+    (* FIXME: in the following try/with, the timeouts should be reset
+       unconditionally. Is there a way to implement try/finally? *)
+    try
+      print_string_if_noisy "\nStarting ppl_reset_timeout test:\n";
+      ppl_set_timeout 100;
+      compute_timeout_hypercube 0 2;
+      ppl_reset_timeout ();
+      print_string_if_noisy "ppl_reset_timeout test succeeded.\n"
+    with
+    | PPL_timeout_exception ->
+      ppl_reset_timeout ();
+      print_string_if_noisy "ppl_reset_timeout test seems to be failed:\n";
+      print_string_if_noisy "Unexpected PPL timeout exception caught.\n"
+    | _ ->
+      ppl_reset_timeout ();
+      print_string_if_noisy "ppl_reset_timeout test seems to be failed.";
+      (* FIXME: print the contents of the exception. *)
+      print_string_if_noisy "\n"
+  end;
+  begin
+    try
+      print_string_if_noisy "\nStarting ppl_set_timeout test:\n";
+      ppl_set_timeout 100;
+      compute_timeout_hypercube 0 100;
+      ppl_reset_timeout ();
+      print_string_if_noisy "ppl_set_timeout test seems to be failed!\n"
+    with
+    | PPL_timeout_exception ->
+      ppl_reset_timeout ();
+      print_string_if_noisy "ppl_set_timeout test succeded\n";
+      print_string_if_noisy "Expected PPL timeout exception caught.\n"
+    | _ ->
+      ppl_reset_timeout ();
+      print_string_if_noisy "ppl_set_timeout test failed:\n";
+      print_string_if_noisy "generic exception caught.\n"
+  end;
+  begin
+    try
+      print_string_if_noisy "\nStarting ppl_reset_deterministic_timeout test:\n";
+      ppl_set_deterministic_timeout 2000 0;
+      compute_timeout_hypercube 0 2;
+      ppl_reset_deterministic_timeout ();
+      print_string_if_noisy "ppl_reset_deterministic_timeout test succeeded.\n"
+    with
+    | PPL_timeout_exception ->
+      ppl_reset_deterministic_timeout ();
+      print_string_if_noisy "ppl_reset_deterministic_timeout test seems to be failed:\n";
+      print_string_if_noisy "Unexpected PPL timeout exception caught.\n"
+    | _ ->
+      ppl_reset_deterministic_timeout ();
+      print_string_if_noisy "ppl_reset_deterministic_timeout test seems to be failed.";
+      (* FIXME: print the contents of the exception. *)
+      print_string_if_noisy "\n"
+  end;
+  begin
+    try
+      print_string_if_noisy "\nStarting ppl_set_deterministic_timeout test:\n";
+      ppl_set_deterministic_timeout 2000 0;
+      compute_timeout_hypercube 0 100;
+      ppl_reset_deterministic_timeout ();
+      print_string_if_noisy "ppl_set_deterministic_timeout test seems to be failed!\n"
+    with
+    | PPL_timeout_exception ->
+      ppl_reset_deterministic_timeout ();
+      print_string_if_noisy "ppl_set_deterministic_timeout test succeded\n";
+      print_string_if_noisy "Expected PPL timeout exception caught.\n"
+    | _ ->
+      ppl_reset_deterministic_timeout ();
+      print_string_if_noisy "ppl_set_deterministic_timeout test failed:\n";
+      print_string_if_noisy "generic exception caught.\n"
+  end
+);;
+
+
+print_string_if_noisy "\nStarting PIP_Problem \n";;
+
+print_string_if_noisy "PIP_Problem 1 \n";;
+print_string_if_noisy "testing PIP_Problem_solution, ";;
+print_string_if_noisy "PIP_Problem_OK ";;
+print_string_if_noisy "and PIP_Tree_Node_is_bottom \n";;
+let pip = ppl_new_PIP_Problem 3
+             [e1 >=/ e2; e1 <=/ e2 -/ (linear_expression_of_int 7)] [2];;
+
+begin
+try
+  let ptree = ppl_PIP_Problem_solution pip
+  in let out = if (ppl_PIP_Problem_OK pip & ppl_PIP_Tree_Node_is_bottom ptree)
+                 then "success" else "failed"
+     in (print_string_if_noisy out)
+with PPL_arithmetic_overflow what ->
+  let unexpected = (ppl_Coefficient_bits() != 8)
+  in if (unexpected)
+       then raise (PPL_arithmetic_overflow(what));
+  print_string_if_noisy "Expected overflow exception caught: ";
+  print_string_if_noisy what;
+  print_string_if_noisy "\n"
+end;;
+print_string_if_noisy "\n";;
+
+print_string_if_noisy "PIP_Problem 2 \n";;
+let params = [7];;
+let pip2 = ppl_new_PIP_Problem 10 constraints1 params;;
+let i = ppl_PIP_Problem_space_dimension pip2;;
+let i = ppl_PIP_Problem_constraints pip2;;
+print_string_if_noisy "PIP_Problem constraints are \n";;
+List.iter print_constraint i;;
+print_string_if_noisy "\n";;
+ppl_PIP_Problem_add_constraint pip2 constraint1;;
+ppl_PIP_Problem_add_constraints pip2 constraints1;;
+let i = ppl_PIP_Problem_parameter_space_dimensions pip2;;
+let i = ppl_PIP_Problem_get_control_parameter pip2 Cutting_Strategy;;
+ppl_PIP_Problem_set_control_parameter pip2 Cutting_Strategy_First;;
+let i = ppl_PIP_Problem_get_control_parameter pip2 Cutting_Strategy;;
+let out = if (i == Cutting_Strategy_First)
+  then "PIP Problem Control Parameter test succeeded"
+  else "PIP Problem Control Parameter test failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+let b0 = ppl_PIP_Problem_has_big_parameter_dimension pip2;;
+ppl_PIP_Problem_set_big_parameter_dimension pip2 7;;
+let big_par = ppl_PIP_Problem_get_big_parameter_dimension pip2;;
+let b1 = ppl_PIP_Problem_has_big_parameter_dimension pip2;;
+let out = if (not b0 & b1 & (big_par = 7))
+  then "ppl_PIP_Problem big parameter dimension tests succeeded"
+  else "ppl_PIP_Problem big parameter dimension tests failed"
+    in (print_string_if_noisy out);;
+print_string_if_noisy "\n";;
+
+begin
+try
+  let out = if (ppl_PIP_Problem_is_satisfiable pip2)
+    then "ppl_PIP_Problem_is_satisfiable test succeeded"
+    else "ppl_PIP_Problem_is_satisfiable test failed"
+      in (print_string_if_noisy out);
+  print_string_if_noisy "\n";
+  print_string_if_noisy "testing ppl_PIP_Problem_ascii_dump: ";
+  print_string_if_noisy (ppl_PIP_Problem_ascii_dump pip2);
+  print_string_if_noisy "\n";
+  let ptree2 = ppl_PIP_Problem_solution pip2
+  in let out2 = if (ppl_PIP_Tree_Node_is_bottom ptree2)
+    then "ppl_PIP_Tree_Node_is_bottom test succeeded"
+    else "ppl_PIP_Tree_Node_is_bottom test failed"
+      in (print_string_if_noisy out2);
+  print_string_if_noisy "\n"
+with PPL_arithmetic_overflow what ->
+  let unexpected = (ppl_Coefficient_bits() != 8)
+  in if (unexpected)
+       then raise (PPL_arithmetic_overflow(what));
+  print_string_if_noisy "Expected overflow exception caught: ";
+  print_string_if_noisy what;
+  print_string_if_noisy "\n"
+end;;
+
+print_string_if_noisy "\nPIP_Problem 3 \n";;
+let i = Variable 0
+and j = Variable 1
+and n = Variable 2
+and m = Variable 3
+and v2 = Z.from_int 2
+and v3 = Z.from_int 3
+and v4 = Z.from_int 4
+and v8 = Z.from_int 8
+and inhomogeneous n = linear_expression_of_int n
+;;
+
+let pip_c1 = v3 */ j +/ v2 */ i >=/ (inhomogeneous 8);;
+print_constraint pip_c1; print_string_if_noisy "\n" ;;
+let pip_c2 = v4 */ i -/ j >=/ (inhomogeneous 4);;
+print_constraint pip_c2; print_string_if_noisy "\n" ;;
+let pip_c3 = m >=/ j;;
+print_constraint pip_c3; print_string_if_noisy "\n" ;;
+let pip_c4 = n >=/ i;;
+print_constraint pip_c4; print_string_if_noisy "\n" ;;
+let pip_cs = [pip_c1; pip_c2; pip_c3; pip_c4] ;;
+
+let ps = [2; 3];;
+let pip3 = ppl_new_PIP_Problem 4 pip_cs ps;;
+
+begin
+try
+  let result = ppl_PIP_Problem_solve pip3 in
+  let out = if (result == Optimized_Pip_Problem)
+    then "PIP Problem_solve pip3 test succeeded"
+    else "PIP Problem_solve pip3 test failed"
+      in (print_string_if_noisy out);
+  print_string_if_noisy "\n";
+  let node = ppl_PIP_Problem_solution pip3 in
+  begin
+  let out = if (ppl_PIP_Tree_Node_OK node)
+    then "ppl_PIP_Tree_Node_OK node test succeeded"
+    else "ppl_PIP_Tree_Node_OK node test failed"
+      in (print_string_if_noisy out);
+  print_string_if_noisy "\n";
+  let out = if (ppl_PIP_Tree_Node_is_decision node)
+    then "ppl_PIP_Tree_Node_is_decision node test succeeded"
+    else "ppl_PIP_Tree_Node_is_decision node test failed"
+      in (print_string_if_noisy out);
+  print_string_if_noisy "\n";
+  let out = if (ppl_PIP_Tree_Node_artificials node = [])
+    then "ppl_PIP_Tree_Node_artificials node test succeeded"
+    else "ppl_PIP_Tree_Node_artificials node test failed"
+      in (print_string_if_noisy out);
+  print_string_if_noisy "\n";
+  let _node_cs = ppl_PIP_Tree_Node_constraints node in ();
+  let
+    _fchild = ppl_PIP_Tree_Node_false_child node
+  and
+    tchild = (ppl_PIP_Tree_Node_true_child node)
+  in (
+    let out = if (ppl_PIP_Tree_Node_is_decision tchild)
+      then "ppl_PIP_Tree_Node_is_decision tchild test succeeded"
+      else "ppl_PIP_Tree_Node_is_decision tchild test failed"
+        in (print_string_if_noisy out);
+    print_string_if_noisy "\n";
+    let
+      ttchild = (ppl_PIP_Tree_Node_true_child tchild)
+    and
+      ftchild = (ppl_PIP_Tree_Node_false_child tchild)
+    in (
+      let out = if (ppl_PIP_Tree_Node_is_solution ttchild)
+        then "ppl_PIP_Tree_Node_is_decision ttchild test succeeded"
+        else "ppl_PIP_Tree_Node_is_decision ttchild test failed"
+          in (print_string_if_noisy out);
+      print_string_if_noisy "\n";
+      let _par_vals = ppl_PIP_Tree_Node_parametric_values ttchild 0 in ();
+      let _ftchild_arts = ppl_PIP_Tree_Node_artificials ftchild in ()
+    )
+  );
+  print_string_if_noisy "\n"
+  end
+with PPL_arithmetic_overflow what ->
+  let unexpected = (ppl_Coefficient_bits() != 8)
+  in if (unexpected)
+       then raise (PPL_arithmetic_overflow(what));
+  print_string_if_noisy "Expected overflow exception caught: ";
+  print_string_if_noisy what;
+  print_string_if_noisy "\n"
+end;;
+
+(* Pointset_Powerset_Grid is not enabled by default, the following code is *)
+(* commented *)
+(* let pps = ppl_new_Pointset_Powerset_Grid_from_space_dimension 3;; *)
+(* let space_dim = ppl_Pointset_Powerset_Grid_space_dimension pps;; *)
+(* ppl_Pointset_Powerset_Grid_add_constraints  pps constraints1;; *)
+(* let caml_grid_it = ppl_Pointset_Powerset_Grid_begin_iterator pps;; *)
+(* let grid1 =  ppl_Pointset_Powerset_Grid_iterator_get_disjunct caml_grid_it;; *)
+(* let space_dim = ppl_Grid_space_dimension grid1;; *)
+(* let grid2 = ppl_new_Grid_from_space_dimension 3;; *)
+(* ppl_Pointset_Powerset_Grid_add_disjunct pps grid2;; *)
+(* let space_dim = ppl_Pointset_Powerset_Grid_space_dimension pps;; *)
+(* let caml_grid_it1 = ppl_Pointset_Powerset_Grid_end_iterator pps;; *)
+(* let caml_grid_it2 = ppl_Pointset_Powerset_Grid_end_iterator pps;; *)
+(* ppl_Pointset_Powerset_Grid_iterator_decrement caml_grid_it1;; *)
+(* ppl_Pointset_Powerset_Grid_drop_disjunct pps caml_grid_it1;; *)
+(* ppl_Pointset_Powerset_Grid_iterator_equals_iterator caml_grid_it1 caml_grid_it1;; *)
+(* print_int_if_noisy space_dim;; *)
+(* print_string_if_noisy "\n";; *)
+(* print_string_if_noisy "PPS size : ";; *)
+(* let size = ppl_Pointset_Powerset_Grid_size pps;; *)
+(* print_int_if_noisy size;; *)
+
+at_exit Gc.full_major;;
+print_string_if_noisy "\nBye!\n"
diff --git a/interfaces/Prolog/Ciao/Makefile.am b/interfaces/Prolog/Ciao/Makefile.am
new file mode 100644
index 0000000..53ffe88
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.am
@@ -0,0 +1,317 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+CIAO_CFLI_FILES = ciao_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_ciao_pl.m4 \
+$(CIAO_CFLI_FILES) \
+ciao_clpq.pl \
+ciao_clpq2.pl \
+ciao_pl_check.pl \
+ppl_interface_generator_ciao_prolog_generated_test_pl.m4 \
+README.ciao
+
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(CIAO_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_ciao_pl.m4 \
+ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+
+pkglib_LTLIBRARIES = libppl_ciao.la
+
+libppl_ciao_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+ciao_efli.hh \
+ciao_efli.cc
+
+nodist_libppl_ciao_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_ciao_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_ciao_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_ciao_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_ciao_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_ciao.po
+
+ppl_ciao.pl: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@
+
+ciao_prolog_generated_test.pl: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 > $@
+
+ppl_ciao.po: ppl_ciao.pl
+	ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq',
+# `ciao_clpq2' and 'ciao_prolog_generated_test' will try to build
+# identical glue files (e.g., `ppl_ciao_LINUXi86.so').
+# On parallel builds, this may cause errors.
+# This is why we make `ciao_clpq' and `ciao_clpq2' depend on `ciao_pl_check':
+# building the latter will build the glue files once and for all;  after
+# that, `ciao_clpq' and `ciao_clpq2' can be built in parallel.
+ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ciao_pl_check.pl .; \
+	fi
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	ciaoc -o $@ ciao_pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ciao_pl_check.pl; \
+	fi
+	rm -f pl_check.pl
+
+ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ciao_clpq.pl .; \
+	fi
+	cp -f $(srcdir)/../tests/clpq.pl .
+	ciaoc -o $@ ciao_clpq.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ciao_clpq.pl; \
+	fi
+	rm -f clpq.pl
+
+ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/ciao_clpq2.pl .; \
+	fi
+	cp -f $(srcdir)/../tests/clpq2.pl .
+	ciaoc -o $@ ciao_clpq2.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f ciao_clpq2.pl; \
+	fi
+	rm -f clpq2.pl
+
+
+ciao_prolog_generated_test: .libs/libppl_ciao.so ppl_ciao.po ciao_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl | ciao_pl_check
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	ciaoc -o $@ ciao_prolog_generated_test.pl
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: ppl_prolog_generated_test
+
+pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_pl_check \
+			 >obtained_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+	GLOBALSTKSIZE=1000000 \
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_clpq \
+			<$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+	GLOBALSTKSIZE=100000 \
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_clpq2 \
+			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: ciao_prolog_generated_test$(EXEEXT) .libs/libppl_ciao.so ../tests/expected_pgt
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_ciao.la \
+		./ciao_prolog_generated_test \
+			 >obtained_pgt
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+endif ENABLE_SHARED
+
+CLEANFILES = \
+ppl_ciao.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check ciao_prolog_generated_test \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_ciao_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: the dependencies from .libs/libppl_ciao.so in this Makefile.am
+# are probably all wrong.
+.libs/libppl_ciao.so: libppl_ciao.la
diff --git a/interfaces/Prolog/Ciao/Makefile.in b/interfaces/Prolog/Ciao/Makefile.in
new file mode 100644
index 0000000..3e393f7
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.in
@@ -0,0 +1,1681 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/Ciao
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__libppl_ciao_la_SOURCES_DIST = ppl_prolog_sysdep.hh ciao_efli.hh \
+	ciao_efli.cc
+ at ENABLE_SHARED_TRUE@am_libppl_ciao_la_OBJECTS = ciao_efli.lo
+ at ENABLE_SHARED_TRUE@nodist_libppl_ciao_la_OBJECTS =  \
+ at ENABLE_SHARED_TRUE@	ppl_prolog_common.lo
+libppl_ciao_la_OBJECTS = $(am_libppl_ciao_la_OBJECTS) \
+	$(nodist_libppl_ciao_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_ciao_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_ciao_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+ at ENABLE_SHARED_TRUE@am_libppl_ciao_la_rpath = -rpath $(pkglibdir)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_ciao_la_SOURCES) $(nodist_libppl_ciao_la_SOURCES) \
+	$(nodist_EXTRA_libppl_ciao_la_SOURCES)
+DIST_SOURCES = $(am__libppl_ciao_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+CIAO_CFLI_FILES = ciao_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_ciao_pl.m4 \
+$(CIAO_CFLI_FILES) \
+ciao_clpq.pl \
+ciao_clpq2.pl \
+ciao_pl_check.pl \
+ppl_interface_generator_ciao_prolog_generated_test_pl.m4 \
+README.ciao
+
+ at ENABLE_SHARED_TRUE@AM_CPPFLAGS = \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_buildir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_builddir)/src \
+ at ENABLE_SHARED_TRUE@$(CIAO_PROLOG_INCLUDE_OPTIONS) \
+ at ENABLE_SHARED_TRUE@@extra_includes@
+
+ at ENABLE_SHARED_TRUE@interface_generator_dependencies = \
+ at ENABLE_SHARED_TRUE@$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_common.m4 \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_common_dat.m4 \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_copyright \
+ at ENABLE_SHARED_TRUE@../../ppl_interface_generator_common_procedure_generators.m4 \
+ at ENABLE_SHARED_TRUE@../ppl_interface_generator_prolog_procedure_generators.m4 \
+ at ENABLE_SHARED_TRUE@../ppl_interface_generator_prolog_systems.m4 \
+ at ENABLE_SHARED_TRUE@ppl_interface_generator_ciao_pl.m4 \
+ at ENABLE_SHARED_TRUE@ppl_interface_generator_ciao_prolog_generated_test_pl.m4
+
+ at ENABLE_SHARED_TRUE@pkglib_LTLIBRARIES = libppl_ciao.la
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@ppl_prolog_sysdep.hh \
+ at ENABLE_SHARED_TRUE@ciao_efli.hh \
+ at ENABLE_SHARED_TRUE@ciao_efli.cc
+
+ at ENABLE_SHARED_TRUE@nodist_libppl_ciao_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_common.cc
+
+ at ENABLE_SHARED_TRUE@nodist_EXTRA_libppl_ciao_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_LIBADD = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \
+ at ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_DEPENDENCIES = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at ENABLE_SHARED_TRUE@libppl_ciao_la_LDFLAGS = \
+ at ENABLE_SHARED_TRUE@$(NO_UNDEFINED_FLAG) \
+ at ENABLE_SHARED_TRUE@-module \
+ at ENABLE_SHARED_TRUE@-avoid-version
+
+ at ENABLE_SHARED_TRUE@pkgdata_DATA = ppl_ciao.po
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at ENABLE_SHARED_TRUE@ack.clpq \
+ at ENABLE_SHARED_TRUE@ackn.clpq \
+ at ENABLE_SHARED_TRUE@fib.clpq \
+ at ENABLE_SHARED_TRUE@mc91.clpq \
+ at ENABLE_SHARED_TRUE@smm.clpq \
+ at ENABLE_SHARED_TRUE@sumto.clpq \
+ at ENABLE_SHARED_TRUE@tak.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_STRICT = \
+ at ENABLE_SHARED_TRUE@schedule.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at ENABLE_SHARED_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_ciao.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check ciao_prolog_generated_test \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+	}
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_ciao.la: $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_DEPENDENCIES) $(EXTRA_libppl_ciao_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_ciao_la_LINK) $(am_libppl_ciao_la_rpath) $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ciao_efli.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+	done
+
+uninstall-pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgdataDATA uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+	clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-pkgdataDATA install-pkglibLTLIBRARIES \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-pkgdataDATA \
+	uninstall-pkglibLTLIBRARIES
+
+
+ at ENABLE_SHARED_TRUE@ppl_ciao.pl: $(interface_generator_dependencies)
+ at ENABLE_SHARED_TRUE@	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at ENABLE_SHARED_TRUE@           $(srcdir)/ppl_interface_generator_ciao_pl.m4 > $@
+
+ at ENABLE_SHARED_TRUE@ciao_prolog_generated_test.pl: $(interface_generator_dependencies)
+ at ENABLE_SHARED_TRUE@	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+ at ENABLE_SHARED_TRUE@           $(srcdir)/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 > $@
+
+ at ENABLE_SHARED_TRUE@ppl_ciao.po: ppl_ciao.pl
+ at ENABLE_SHARED_TRUE@	ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq',
+# `ciao_clpq2' and 'ciao_prolog_generated_test' will try to build
+# identical glue files (e.g., `ppl_ciao_LINUXi86.so').
+# On parallel builds, this may cause errors.
+# This is why we make `ciao_clpq' and `ciao_clpq2' depend on `ciao_pl_check':
+# building the latter will build the glue files once and for all;  after
+# that, `ciao_clpq' and `ciao_clpq2' can be built in parallel.
+ at ENABLE_SHARED_TRUE@ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ciao_pl_check.pl .; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/pl_check.pl .
+ at ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_pl_check.pl
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  rm -f ciao_pl_check.pl; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	rm -f pl_check.pl
+
+ at ENABLE_SHARED_TRUE@ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ciao_clpq.pl .; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/clpq.pl .
+ at ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_clpq.pl
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  rm -f ciao_clpq.pl; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	rm -f clpq.pl
+
+ at ENABLE_SHARED_TRUE@ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  cp -f $(srcdir)/ciao_clpq2.pl .; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/clpq2.pl .
+ at ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_clpq2.pl
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  rm -f ciao_clpq2.pl; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	rm -f clpq2.pl
+
+ at ENABLE_SHARED_TRUE@ciao_prolog_generated_test: .libs/libppl_ciao.so ppl_ciao.po ciao_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl | ciao_pl_check
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ at ENABLE_SHARED_TRUE@	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+ at ENABLE_SHARED_TRUE@	ciaoc -o $@ ciao_prolog_generated_test.pl
+ at ENABLE_SHARED_TRUE@	rm -f ppl_prolog_generated_test_common.pl
+ at ENABLE_SHARED_TRUE@	rm -f ppl_prolog_generated_test_main.pl
+
+ at ENABLE_SHARED_TRUE@check-local: ppl_prolog_generated_test
+
+ at ENABLE_SHARED_TRUE@pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@		./ciao_pl_check \
+ at ENABLE_SHARED_TRUE@			 >obtained_pchk
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at ENABLE_SHARED_TRUE@$(CLPQ_TESTS):
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/$@ .
+
+ at ENABLE_SHARED_TRUE@clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@	GLOBALSTKSIZE=1000000 \
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@		./ciao_clpq \
+ at ENABLE_SHARED_TRUE@			<$(srcdir)/../tests/script_clpq >obtained_clpq
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at ENABLE_SHARED_TRUE@clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@	GLOBALSTKSIZE=100000 \
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@		./ciao_clpq2 \
+ at ENABLE_SHARED_TRUE@			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at ENABLE_SHARED_TRUE@ppl_prolog_generated_test: ciao_prolog_generated_test$(EXEEXT) .libs/libppl_ciao.so ../tests/expected_pgt
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen libppl_ciao.la \
+ at ENABLE_SHARED_TRUE@		./ciao_prolog_generated_test \
+ at ENABLE_SHARED_TRUE@			 >obtained_pgt
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_ciao_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: the dependencies from .libs/libppl_ciao.so in this Makefile.am
+# are probably all wrong.
+.libs/libppl_ciao.so: libppl_ciao.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Ciao/README.ciao b/interfaces/Prolog/Ciao/README.ciao
new file mode 100644
index 0000000..5814d90
--- /dev/null
+++ b/interfaces/Prolog/Ciao/README.ciao
@@ -0,0 +1,16 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The Ciao Prolog interface to the PPL only supports versions of Ciao
+Prolog dated later than Octber 15th, 2008 (corresponding to SVN
+revision 9859).  If in doubt, please check with the Ciao developers
+(ciao at clip.dia.fi.upm.es) how to obtain such a version.
diff --git a/interfaces/Prolog/Ciao/ciao_cfli.hh b/interfaces/Prolog/Ciao/ciao_cfli.hh
new file mode 100644
index 0000000..d9b48cb
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_cfli.hh
@@ -0,0 +1,341 @@
+/* Ciao Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_ciao_cfli_hh
+#define PCFLI_ciao_cfli_hh 1
+
+#include <ciao_prolog.h>
+#include <cassert>
+#include <sstream>
+
+typedef ciao_term Prolog_term_ref;
+typedef const char* Prolog_atom;
+typedef ciao_bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = 1;
+const Prolog_foreign_return_type PROLOG_FAILURE = 0;
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  t = ciao_integer(l);
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul < INT_MAX)
+    t = ciao_integer(ul);
+  else {
+    std::ostringstream s;
+    s << ul;
+    std::string str = s.str();
+    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+    t = ciao_put_number_chars(const_cast<char*>(str.c_str()));
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = ciao_atom(s);
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = ciao_atom(a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  t = ciao_pointer_to_address(ciao_implicit_state, p);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return ciao_atom_name(ciao_atom(s));
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1) {
+  Prolog_term_ref args[1];
+  args[0] = a1;
+  t = ciao_structure_a(f, 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2) {
+  Prolog_term_ref args[2];
+  args[0] = a1;
+  args[1] = a2;
+  t = ciao_structure_a(f, 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3) {
+  Prolog_term_ref args[3];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = ciao_structure_a(f, 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4) {
+  Prolog_term_ref args[4];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = ciao_structure_a(f, 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+                      Prolog_term_ref h, Prolog_term_ref t) {
+  c = ciao_list(h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  ciao_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return ciao_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return ciao_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return ciao_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return ciao_is_address(ciao_implicit_state, t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return ciao_is_structure(t);
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return ciao_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(ciao_is_integer(t));
+  if (ciao_fits_in_int(t)) {
+    *lp = ciao_to_integer(t);
+    return 1;
+  }
+  else {
+    char* s = ciao_get_number_chars(t);
+    mpz_class n(s);
+    ciao_free(s);
+    if (!n.fits_slong_p())
+      return 0;
+    else {
+      *lp = n.get_si();
+      return 1;
+    }
+  }
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = ciao_address_to_pointer(ciao_implicit_state, t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = ciao_atom_name(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  *ap = ciao_structure_name(t);
+  *ip = ciao_structure_arity(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = ciao_structure_arg(t, i);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = ciao_list_head(c);
+  t = ciao_list_tail(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return ciao_unify(t, u);
+}
+
+#endif // !defined(PCFLI_ciao_cfli_hh)
diff --git a/interfaces/Prolog/Ciao/ciao_clpq.pl b/interfaces/Prolog/Ciao/ciao_clpq.pl
new file mode 100644
index 0000000..3b4f15f
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq.pl
@@ -0,0 +1,56 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao,
+              [
+               ppl_initialize/0,
+               ppl_finalize/0,
+               ppl_new_C_Polyhedron_from_space_dimension/3,
+               ppl_new_NNC_Polyhedron_from_space_dimension/3,
+               ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+               ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+               ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+               ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+               ppl_delete_Polyhedron/1,
+               ppl_Polyhedron_space_dimension/2,
+               ppl_Polyhedron_get_constraints/2,
+               ppl_Polyhedron_add_space_dimensions_and_embed/2,
+               ppl_Polyhedron_remove_higher_space_dimensions/2
+              ]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+eat_eol.
+
+:- include('clpq.pl').
+
+main :-
+    ppl_initialize,
+    common_main.
diff --git a/interfaces/Prolog/Ciao/ciao_clpq2.pl b/interfaces/Prolog/Ciao/ciao_clpq2.pl
new file mode 100644
index 0000000..a3cae5a
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq2.pl
@@ -0,0 +1,56 @@
+/* Prolog main program for the 2nd toy PPL/CIAO-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(iso_misc)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(sort)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_new_C_Polyhedron_from_space_dimension/3,
+        ppl_new_NNC_Polyhedron_from_space_dimension/3,
+        ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+eat_eol.
+
+:- include('clpq2.pl').
+
+main :-
+    ppl_initialize,
+    common_main.
diff --git a/interfaces/Prolog/Ciao/ciao_efli.cc b/interfaces/Prolog/Ciao/ciao_efli.cc
new file mode 100644
index 0000000..437edf0
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_efli.cc
@@ -0,0 +1,100 @@
+/* Ciao Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ciao_efli.hh"
+#include "ppl_prolog_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace Ciao {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  if (ciao_fits_in_int(t))
+    n = ciao_to_integer(t);
+  else {
+    const char* s = ciao_get_number_chars(t);
+    n = Coefficient(s);
+    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+    ciao_free(const_cast<char*>(s));
+  }
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  int i;
+  Result r = assign_r(i, n, ROUND_IGNORE);
+  if (!result_overflow(r))
+    t = ciao_integer(i);
+  else {
+    std::ostringstream s;
+    s << n;
+    std::string str = s.str();
+    // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+    t = ciao_put_number_chars(const_cast<char*>(str.c_str()));
+  }
+  return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  Prolog_put_Coefficient(u, n);
+  return ciao_unify(t, u);
+}
+
+} // namespace Ciao
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+extern "C" void
+init() {
+  ppl_initialize();
+}
diff --git a/interfaces/Prolog/Ciao/ciao_efli.hh b/interfaces/Prolog/Ciao/ciao_efli.hh
new file mode 100644
index 0000000..267796e
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_efli.hh
@@ -0,0 +1,92 @@
+/* Ciao Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ciao_efli_hh
+#define PPL_ciao_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "ciao_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace Ciao {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace Ciao
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ciao_efli_hh)
diff --git a/interfaces/Prolog/Ciao/ciao_pl_check.pl b/interfaces/Prolog/Ciao/ciao_pl_check.pl
new file mode 100644
index 0000000..5590465
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_pl_check.pl
@@ -0,0 +1,170 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao, [
+        ppl_version_major/1,
+        ppl_version_minor/1,
+        ppl_version_revision/1,
+        ppl_version_beta/1,
+        ppl_version/1,
+        ppl_banner/1,
+        ppl_max_space_dimension/1,
+        ppl_Coefficient_is_bounded/0,
+        ppl_Coefficient_max/1,
+        ppl_Coefficient_min/1,
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_set_timeout_exception_atom/1,
+        ppl_timeout_exception_atom/1,
+        ppl_set_timeout/1,
+        ppl_reset_timeout/0,
+        ppl_set_rounding_for_PPL/0,
+        ppl_restore_pre_PPL_rounding/0,
+        ppl_new_C_Polyhedron_from_space_dimension/3,
+        ppl_new_NNC_Polyhedron_from_space_dimension/3,
+        ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity/3,
+        ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity/3,
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity/3,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity/3,
+        ppl_new_C_Polyhedron_from_constraints/2,
+        ppl_new_NNC_Polyhedron_from_constraints/2,
+        ppl_new_C_Polyhedron_from_generators/2,
+        ppl_new_NNC_Polyhedron_from_generators/2,
+        ppl_Polyhedron_swap/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_affine_dimension/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_get_minimized_constraints/2,
+        ppl_Polyhedron_get_generators/2,
+        ppl_Polyhedron_get_minimized_generators/2,
+        ppl_Polyhedron_relation_with_constraint/3,
+        ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_is_universe/1,
+        ppl_Polyhedron_is_bounded/1,
+        ppl_Polyhedron_contains_integer_point/1,
+        ppl_Polyhedron_bounds_from_above/2,
+        ppl_Polyhedron_bounds_from_below/2,
+        ppl_Polyhedron_maximize/5,
+        ppl_Polyhedron_maximize_with_point/6,
+        ppl_Polyhedron_minimize/5,
+        ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+        ppl_Polyhedron_contains_Polyhedron/2,
+        ppl_Polyhedron_strictly_contains_Polyhedron/2,
+        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+        ppl_Polyhedron_OK/1,
+        ppl_Polyhedron_add_constraint/2,
+        ppl_Polyhedron_add_generator/2,
+        ppl_Polyhedron_add_constraints/2,
+        ppl_Polyhedron_add_generators/2,
+        ppl_Polyhedron_intersection_assign/2,
+        ppl_Polyhedron_poly_hull_assign/2,
+        ppl_Polyhedron_poly_difference_assign/2,
+        ppl_Polyhedron_affine_image/4,
+        ppl_Polyhedron_affine_preimage/4,
+        ppl_Polyhedron_bounded_affine_image/5,
+        ppl_Polyhedron_bounded_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image/5,
+        ppl_Polyhedron_generalized_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+        ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+        ppl_Polyhedron_constrains/2,
+        ppl_Polyhedron_unconstrain_space_dimension/2,
+        ppl_Polyhedron_unconstrain_space_dimensions/2,
+        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+        ppl_Polyhedron_BHRZ03_widening_assign/2,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+        ppl_Polyhedron_H79_widening_assign/2,
+        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+        ppl_Polyhedron_add_space_dimensions_and_project/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_concatenate_assign/2,
+        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2,
+        ppl_Polyhedron_expand_space_dimension/3,
+        ppl_Polyhedron_fold_space_dimensions/3,
+        ppl_Polyhedron_map_space_dimensions/2,
+        ppl_new_MIP_Problem_from_space_dimension/2,
+        ppl_new_MIP_Problem/5,
+        ppl_new_MIP_Problem_from_MIP_Problem/2,
+        ppl_MIP_Problem_swap/2,
+        ppl_delete_MIP_Problem/1,
+        ppl_MIP_Problem_space_dimension/2,
+        ppl_MIP_Problem_integer_space_dimensions/2,
+        ppl_MIP_Problem_constraints/2,
+        ppl_MIP_Problem_objective_function/2,
+        ppl_MIP_Problem_optimization_mode/2,
+        ppl_MIP_Problem_clear/1,
+        ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+        ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+        ppl_MIP_Problem_add_constraint/2,
+        ppl_MIP_Problem_add_constraints/2,
+        ppl_MIP_Problem_set_objective_function/2,
+        ppl_MIP_Problem_set_optimization_mode/2,
+        ppl_MIP_Problem_is_satisfiable/1,
+        ppl_MIP_Problem_solve/2,
+        ppl_MIP_Problem_feasible_point/2,
+        ppl_MIP_Problem_optimizing_point/2,
+        ppl_MIP_Problem_optimal_value/3,
+        ppl_MIP_Problem_evaluate_objective_function/4,
+        ppl_MIP_Problem_OK/1,
+        ppl_MIP_Problem_get_control_parameter/3,
+        ppl_MIP_Problem_set_control_parameter/2
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+:- include('pl_check.pl').
+
+prolog_system('Ciao').
+
+main:-
+   (check_all ->
+        write('OK')
+   ;
+        write('FAILURE')
+   ),
+   nl.
diff --git a/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4 b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
new file mode 100644
index 0000000..33368bc
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_pl.m4
@@ -0,0 +1,88 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_ciao.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* Ciao Prolog interface: Ciao Prolog part.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+:- module(ppl_ciao,
+[
+m4_divert(1)
+],
+[
+        assertions,
+        basicmodes,
+        regtypes,
+        foreign_interface
+]).
+
+m4_divert(2)dnl
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+m4_divert(3)
+]).
+
+:- comment(version_maintenance,off).
+
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, , `COMMA
+')	  $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)`'dnl
+m4_divert`'dnl
+m4_define(`check_fail', `m4_ifelse(m4_index($1, nofail), -1, failok, nofail)')
+m4_define(`term', `Term$1')dnl
+m4_define(`anyterm', `any_term')dnl
+m4_define(`interm', `in(Term$1)')dnl
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse(check_fail($3), nofail,
+  `:- true pred $1`'m4_ifelse(`$2', 0, ,(`'m4_term_sequence($2, `interm'))
+          :: `'m4_term_sequence($2, `anyterm', ` *')) +  foreign.
+
+',
+  `:- true pred $1_2(`'m4_term_sequence($2, `interm')`'m4_ifelse(`$2', 0, `go(Success)', `, go(Success)'))
+          :: `'m4_term_sequence($2, `anyterm', ` *')`'m4_ifelse(`$2', 0, ` int', ` * int')
+  + (returns(Success), foreign($1)).
+
+$1`'m4_ifelse(`$2', 0, ,`(m4_term_sequence($2, `term'))') :-
+   $1_2(`'m4_term_sequence($2, `term')`'m4_ifelse(`$2', 0, `1', `, 1')).
+
+')')dnl
+ppl_prolog_sys_code`'dnl
+m4_undivert(2)dnl
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema',
+  `m4_ifelse(check_fail($3), nofail, ,m4_ifelse($4, 0, , `COMMA
+')	`'$1_2/m4_incr($2))')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4 b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
new file mode 100644
index 0000000..ce52953
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_interface_generator_ciao_prolog_generated_test_pl.m4
@@ -0,0 +1,65 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Ciao dependent code for ciao_prolog_generated_test.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, , `COMMA
+')  $1/$2')
+
+m4_divert`'dnl
+/* Ciao Prolog interface: Ciao Prolog part for checking all predicates.
+m4_include(`../../../../ppl/interfaces/ppl_interface_generator_copyright')
+*/
+
+:- module(_, [main/0], []).
+:- use_module(library(debugger)).
+:- use_module(library(dynamic)).
+:- use_module(library(lists)).
+:- use_module(library(prolog_sys)).
+:- use_module(library(read)).
+:- use_module(library(write)).
+:- use_module(ppl_ciao,
+[
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+]).
+
+:- set_prolog_flag(multi_arity_warnings, off).
+
+:-  `include'('ppl_prolog_generated_test_main.pl').
+
+prolog_system('Ciao').
+
+main:-
+   (check_all ->
+        write('OK')
+   ;
+        write('FAILURE')
+   ),
+   nl.
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh b/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..a6b53a2
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for Ciao Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ciao_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::Ciao;
diff --git a/interfaces/Prolog/GNU/Makefile.am b/interfaces/Prolog/GNU/Makefile.am
new file mode 100644
index 0000000..94286b0
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.am
@@ -0,0 +1,309 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+GPROLOG_CFLI_FILES = gprolog_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_gprolog_pl.m4 \
+$(GPROLOG_CFLI_FILES) \
+gp_clpq.pl \
+gnu_pl_check.pl \
+gnu_prolog_generated_test.pl \
+README.gprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_gprolog_pl.m4
+
+pkglib_LTLIBRARIES = libppl_gprolog.la
+
+libppl_gprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+gprolog_efli.hh \
+gprolog_efli.cc
+
+nodist_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_gprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_gprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_gprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+ppl_gprolog.pl: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_gprolog_pl.m4 > $@
+
+pkgdata_DATA = ppl_gprolog.pl
+
+bin_PROGRAMS = ppl_gprolog
+
+ppl_gprolog_SOURCES =
+
+
+# Note: since `libppl_gprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'.  Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+if ENABLE_STATIC
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+
+else !ENABLE_STATIC
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+
+endif !ENABLE_STATIC
+
+ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		$(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		$(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+SCRIPT_CLPQ= $(srcdir)/../tests/script_clpq
+
+if USE_INT8
+
+SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+
+else !USE_INT8
+
+SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+
+endif !USE_INT8
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+		>script_pchk
+	echo "main." >>script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./ppl_gprolog <script_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: gnu_prolog_generated_test.pl  ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	if [ $(abs_srcdir) != `pwd` ]; then \
+          cp -f $(srcdir)/gnu_prolog_generated_test.pl . ; \
+	fi
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	echo "['ppl_prolog_generated_test_main.pl', 'gnu_prolog_generated_test.pl']." \
+		>script_pgt
+	echo "main." >>script_pgt
+	GLOBALSZ=131072 $(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./ppl_gprolog <script_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f gnu_prolog_generated_test.pl; \
+        fi
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+CLEANFILES = \
+ppl_gprolog.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_gprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/GNU/Makefile.in b/interfaces/Prolog/GNU/Makefile.in
new file mode 100644
index 0000000..008db9b
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.in
@@ -0,0 +1,1713 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_gprolog$(EXEEXT)
+subdir = interfaces/Prolog/GNU
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am_libppl_gprolog_la_OBJECTS = gprolog_efli.lo
+nodist_libppl_gprolog_la_OBJECTS = ppl_prolog_common.lo
+libppl_gprolog_la_OBJECTS = $(am_libppl_gprolog_la_OBJECTS) \
+	$(nodist_libppl_gprolog_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_gprolog_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_gprolog_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_gprolog_OBJECTS =
+ppl_gprolog_OBJECTS = $(am_ppl_gprolog_OBJECTS)
+ppl_gprolog_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_gprolog_la_SOURCES) \
+	$(nodist_libppl_gprolog_la_SOURCES) \
+	$(nodist_EXTRA_libppl_gprolog_la_SOURCES) \
+	$(ppl_gprolog_SOURCES)
+DIST_SOURCES = $(libppl_gprolog_la_SOURCES) $(ppl_gprolog_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+GPROLOG_CFLI_FILES = gprolog_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_gprolog_pl.m4 \
+$(GPROLOG_CFLI_FILES) \
+gp_clpq.pl \
+gnu_pl_check.pl \
+gnu_prolog_generated_test.pl \
+README.gprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_gprolog_pl.m4
+
+pkglib_LTLIBRARIES = libppl_gprolog.la
+libppl_gprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+gprolog_efli.hh \
+gprolog_efli.cc
+
+nodist_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_gprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_gprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_gprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_gprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_gprolog.pl
+ppl_gprolog_SOURCES = 
+ at ENABLE_STATIC_FALSE@LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+
+# Note: since `libppl_gprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'.  Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+ at ENABLE_STATIC_TRUE@LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+SCRIPT_CLPQ = $(srcdir)/../tests/script_clpq
+ at USE_INT8_FALSE@SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+ at USE_INT8_TRUE@SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_gprolog.pl
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+	}
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_gprolog.la: $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_DEPENDENCIES) $(EXTRA_libppl_gprolog_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_gprolog_la_LINK) -rpath $(pkglibdir) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gprolog_efli.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+	done
+
+uninstall-pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+	clean-pkglibLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+	clean-binPROGRAMS clean-generic clean-libtool \
+	clean-pkglibLTLIBRARIES cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-pkgdataDATA install-pkglibLTLIBRARIES install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-pkgdataDATA \
+	uninstall-pkglibLTLIBRARIES
+
+
+ppl_gprolog.pl: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_gprolog_pl.m4 > $@
+
+ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		$(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+	gplc --c-compiler $(CXX) -o $@ \
+		ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+		$(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+		-L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -lgmpxx -lgmp'
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+		>script_pchk
+	echo "main." >>script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./ppl_gprolog <script_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: gnu_prolog_generated_test.pl  ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	if [ $(abs_srcdir) != `pwd` ]; then \
+          cp -f $(srcdir)/gnu_prolog_generated_test.pl . ; \
+	fi
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	echo "['ppl_prolog_generated_test_main.pl', 'gnu_prolog_generated_test.pl']." \
+		>script_pgt
+	echo "main." >>script_pgt
+	GLOBALSZ=131072 $(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_gprolog.la \
+		./ppl_gprolog <script_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f gnu_prolog_generated_test.pl; \
+        fi
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_gprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/GNU/README.gprolog b/interfaces/Prolog/GNU/README.gprolog
new file mode 100644
index 0000000..96e9ff4
--- /dev/null
+++ b/interfaces/Prolog/GNU/README.gprolog
@@ -0,0 +1,59 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The GNU Prolog interface to the Parma Polyhedra Library (PPL)
+is available both as a PPL-enhanced GNU Prolog interpreter and as a
+library that can be linked to GNU Prolog programs.  Only GNU Prolog
+version 1.3.2(20100322) and later versions are supported.
+
+So that it can be used with the GNU Prolog PPL interface (and, for
+that matter, with any foreign code), the GNU Prolog installation must
+be configured with the `--disable-regs' option.
+
+
+Configuring the PPL for Building the GNU Prolog Interface
+---------------------------------------------------------
+
+To build and install the GNU Prolog interface, you will need to set
+the environment variable CPPFLAGS with the path to the GNU Prolog
+include directory: this is the directory containing the file
+`gprolog.h'.  Thus you need to configure the PPL with a command like
+
+  CPPFLAGS=-I/path/to/gprolog/include /path/to/ppl-x.y/configure \
+     --interfaces = "gnu-prolog ..." ...
+
+
+The `ppl_gprolog' Executable
+----------------------------
+
+The `ppl_gprolog' executable is simply the GNU Prolog interpreter with
+the PPL statically linked.  The only thing you should do to use the
+library is to call `ppl_initialize/0' before any other PPL predicate
+and to call `ppl_finalize/0' when you are done with the library.
+
+
+Linking the Library To GNU Prolog Programs
+------------------------------------------
+
+In order to allow linking GNU Prolog programs to the PPL, the
+following files are installed in the directory `<prefix>/lib/ppl',
+where <prefix> is the root of your installation (`/usr' or
+`/usr/local' in most cases): `ppl_gprolog.pl' contains the required
+foreign declarations; `libppl_gprolog.*' contain the executable code
+for the GNU Prolog interface in various formats (static library,
+shared library, libtool library).  If your GNU Prolog program is
+constituted by, say, `source1.pl' and `source2.pl' and you want to
+create the executable `myprog', your compilation command may look like
+
+    gplc -o myprog <prefix>/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+      -L '-Wl,-rpath=<prefix>/lib/ppl -L<prefix>/lib/ppl -lppl_gprolog \
+          -L<prefix>/lib -lppl -lgmpxx -lgmp -lstdc++'
diff --git a/interfaces/Prolog/GNU/gnu_pl_check.pl b/interfaces/Prolog/GNU/gnu_pl_check.pl
new file mode 100644
index 0000000..f38db5e
--- /dev/null
+++ b/interfaces/Prolog/GNU/gnu_pl_check.pl
@@ -0,0 +1,37 @@
+/* Prolog main program for the PPL/GNU-Prolog predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('GNU').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pchk, write, Stream),
+    set_output(Stream),
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl b/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl
new file mode 100644
index 0000000..b4504c7
--- /dev/null
+++ b/interfaces/Prolog/GNU/gnu_prolog_generated_test.pl
@@ -0,0 +1,37 @@
+/* Prolog main program for the PPL/GNU-Prolog predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('GNU').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pgt, write, Stream),
+    set_output(Stream),
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/GNU/gp_clpq.pl b/interfaces/Prolog/GNU/gp_clpq.pl
new file mode 100644
index 0000000..bd863aa
--- /dev/null
+++ b/interfaces/Prolog/GNU/gp_clpq.pl
@@ -0,0 +1,32 @@
+/* Main program for the toy PPL/GNU-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- initialization(main).
+
+eat_eol.
+
+main :-
+    ppl_initialize,
+    common_main,
+    ppl_finalize,
+    halt.
diff --git a/interfaces/Prolog/GNU/gprolog_cfli.hh b/interfaces/Prolog/GNU/gprolog_cfli.hh
new file mode 100644
index 0000000..451d201
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_cfli.hh
@@ -0,0 +1,461 @@
+/* GNU Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_gprolog_cfli_hh
+#define PCFLI_gprolog_cfli_hh 1
+
+#if SIZEOF_FP == SIZEOF_INTP
+// Horrible kludge working around an horrible bug in <gprolog.h> (see
+// http://www.cs.unipr.it/pipermail/ppl-devel/2008-August/012277.html).
+#define byte_code byte_code(void)
+#define last_read_line last_read_line(void)
+#define last_read_col last_read_col(void)
+#include <gprolog.h>
+#undef byte_code
+#undef last_read_line
+#undef last_read_col
+#else
+#include <gprolog.h>
+#endif
+
+#if defined(__GPROLOG_VERSION__) && __GPROLOG_VERSION__ >= 10301
+#define PPL_GPROLOG_H_IS_CLEAN
+#endif
+
+#ifndef PPL_GPROLOG_H_IS_CLEAN
+// <gprolog.h> pollutes the namespace: try to clean up
+// (see http://www.cs.unipr.it/pipermail/ppl-devel/2004-April/004270.html).
+#ifdef B
+#undef B
+#endif
+#ifdef H
+#undef H
+#endif
+#ifdef CP
+#undef CP
+#endif
+#ifdef E
+#undef E
+#endif
+#ifdef CS
+#undef CS
+#endif
+#ifdef S
+#undef S
+#endif
+#ifdef STAMP
+#undef STAMP
+#endif
+#endif
+
+#include <cassert>
+#include <cstdlib>
+
+typedef PlTerm Prolog_term_ref;
+typedef int Prolog_atom;
+#ifndef PPL_GPROLOG_H_IS_CLEAN
+typedef Bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+#else
+typedef PlBool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = PL_TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = PL_FALSE;
+#endif
+
+namespace {
+
+inline Prolog_atom
+a_dollar_address() {
+  // We use the `name' variable, instead of directly using the string
+  // literal, in order to avoid a compiler warning.
+  static char name[] = "$address";
+  static Prolog_atom atom = Create_Allocate_Atom(name);
+  return atom;
+}
+
+inline Prolog_atom
+a_throw() {
+  // We use the `name' variable, instead of directly using the string
+  // literal, in order to avoid a compiler warning.
+  static char name[] = "throw";
+  static Prolog_atom a = Find_Atom(name);
+  return a;
+}
+
+} // namespace
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  if (l < INT_LOWEST_VALUE || l > INT_GREATEST_VALUE)
+    return 0;
+  else {
+    t = Mk_Integer(l);
+    return 1;
+  }
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul > static_cast<unsigned long>(INT_GREATEST_VALUE))
+    return 0;
+  else {
+    t = Mk_Integer(ul);
+    return 1;
+  }
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = Mk_Atom(Create_Allocate_Atom(const_cast<char*>(s)));
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = Mk_Atom(a);
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return Create_Allocate_Atom(const_cast<char*>(s));
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1) {
+  Prolog_term_ref args[1];
+  args[0] = a1;
+  t = Mk_Compound(f, 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2) {
+  Prolog_term_ref args[2];
+  args[0] = a1;
+  args[1] = a2;
+  t = Mk_Compound(f, 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3) {
+  Prolog_term_ref args[3];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = Mk_Compound(f, 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4) {
+  Prolog_term_ref args[4];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = Mk_Compound(f, 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+                      Prolog_term_ref h, Prolog_term_ref t) {
+  Prolog_term_ref args[2];
+  args[0] = h;
+  args[1] = t;
+  c = Mk_List(args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  union {
+    void* l;
+    unsigned short s[sizeof(void*)/sizeof(unsigned short)];
+  } u;
+  u.l = reinterpret_cast<void*>(p);
+  if (sizeof(unsigned short)*2 == sizeof(void*))
+    return Prolog_construct_compound(t, a_dollar_address(),
+                                     Mk_Positive(u.s[0]),
+                                     Mk_Positive(u.s[1]));
+  else if (sizeof(unsigned short)*4 == sizeof(void*))
+    return Prolog_construct_compound(t, a_dollar_address(),
+                                     Mk_Positive(u.s[0]),
+                                     Mk_Positive(u.s[1]),
+                                     Mk_Positive(u.s[2]),
+                                     Mk_Positive(u.s[3]));
+  else
+    abort();
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  Pl_Exec_Continuation(a_throw(), 1, &t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return Blt_Var(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return Blt_Atom(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return Blt_Integer(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return Blt_Compound(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  if (Blt_Compound(t) == FALSE)
+    return 0;
+  Prolog_atom name;
+  int arity;
+  Rd_Compound(t, &name, &arity);
+  return name == ATOM_CHAR('.') && arity == 2;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  *lp = Rd_Integer_Check(t);
+  return 1;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  if (!Prolog_is_compound(t))
+    return 0;
+  Prolog_atom name;
+  int arity;
+  Prolog_term_ref* a = Rd_Compound_Check(t, &name, &arity);
+  if (name != a_dollar_address()
+      || sizeof(unsigned short)*arity != sizeof(void*))
+    return 0;
+  for (unsigned i = 0; i < sizeof(void*)/sizeof(unsigned short); ++i) {
+    if (!Prolog_is_integer(a[i]))
+      return 0;
+    long l;
+    if (!Prolog_get_long(a[i], &l))
+      return 0;
+    if (l < 0 || l > USHRT_MAX)
+      return 0;
+  }
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  static Prolog_atom dummy_name;
+  static int dummy_arity;
+  Prolog_term_ref* a = Rd_Compound_Check(t, &dummy_name, &dummy_arity);
+  union {
+    void* l;
+    unsigned short s[sizeof(void*)/sizeof(unsigned short)];
+  } u;
+  assert(dummy_arity >= 2);
+  u.s[0] = Rd_Integer_Check(a[0]);
+  u.s[1] = Rd_Integer_Check(a[1]);
+  if (sizeof(unsigned short)*4 == sizeof(void*)) {
+    assert(dummy_arity == 4);
+    u.s[2] = Rd_Integer_Check(a[2]);
+    u.s[3] = Rd_Integer_Check(a[3]);
+  }
+  *vpp = reinterpret_cast<void*>(u.l);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = Rd_Atom_Check(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  Rd_Compound_Check(t, ap, ip);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  static Prolog_atom dummy_name;
+  static int dummy_arity;
+  a = Rd_Compound_Check(t, &dummy_name, &dummy_arity)[i-1];
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  Prolog_term_ref* ht = Rd_List_Check(c);
+  h = ht[0];
+  t = ht[1];
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+#ifndef PPL_GPROLOG_H_IS_CLEAN
+  return Unify(t, u) != FALSE;
+#else
+  return Pl_Unif(t, u) != PL_FALSE;
+#endif
+}
+
+#endif // !defined(PCFLI_gprolog_cfli_hh)
diff --git a/interfaces/Prolog/GNU/gprolog_efli.cc b/interfaces/Prolog/GNU/gprolog_efli.cc
new file mode 100644
index 0000000..8e19593
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_efli.cc
@@ -0,0 +1,83 @@
+/* GNU Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "gprolog_efli.hh"
+#include "ppl_prolog_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace GNU {
+
+bool Prolog_has_unbounded_integers;
+
+PlLong Prolog_min_integer;
+
+PlLong Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = false;
+  Prolog_min_integer = INT_LOWEST_VALUE;
+  Prolog_max_integer = INT_GREATEST_VALUE;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  PlLong v = Pl_Rd_Integer_Check(t);
+  n = v;
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  PlLong l = 0;
+  Result r = assign_r(l, n, ROUND_IGNORE);
+  if (result_overflow(r) || l < INT_LOWEST_VALUE || l > INT_GREATEST_VALUE)
+    throw PPL_integer_out_of_range(n);
+  t = Pl_Mk_Integer(l);
+  return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  Prolog_put_Coefficient(u, n);
+  return Prolog_unify(t, u);
+}
+
+} // namespace GNU
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/GNU/gprolog_efli.hh b/interfaces/Prolog/GNU/gprolog_efli.hh
new file mode 100644
index 0000000..88f8d3c
--- /dev/null
+++ b/interfaces/Prolog/GNU/gprolog_efli.hh
@@ -0,0 +1,89 @@
+/* GNU Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_gprolog_efli_hh
+#define PPL_gprolog_efli_hh 1
+
+#include "ppl.hh"
+#include "gprolog_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace GNU {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-initialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace GNU
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_gprolog_efli_hh)
diff --git a/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4 b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
new file mode 100644
index 0000000..34a11bb
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_interface_generator_gprolog_pl.m4
@@ -0,0 +1,47 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_gprolog.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* GNU Prolog interface: GNU Prolog part.
+m4_include(`ppl_interface_generator_copyright')
+*/
+m4_divert(-1)
+
+m4_define(`tm', ``+term'')
+
+m4_define(`start', 0)
+
+m4_define(`m4_expanded_procedure_schema',
+  `:- foreign($1`'m4_ifelse(`$2', 0, ,`(m4_term_sequence($2, `tm'))')).
+')
+
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..b0e1fe9
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for GNU Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "gprolog_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::GNU;
diff --git a/interfaces/Prolog/Makefile.am b/interfaces/Prolog/Makefile.am
new file mode 100644
index 0000000..9548c15
--- /dev/null
+++ b/interfaces/Prolog/Makefile.am
@@ -0,0 +1,139 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if BUILD_CIAO_PROLOG_INTERFACE
+CIAO_PROLOG_SUBDIR = Ciao
+endif BUILD_CIAO_PROLOG_INTERFACE
+
+if BUILD_GNU_PROLOG_INTERFACE
+GNU_PROLOG_SUBDIR = GNU
+endif BUILD_GNU_PROLOG_INTERFACE
+
+if BUILD_SICSTUS_PROLOG_INTERFACE
+SICSTUS_PROLOG_SUBDIR = SICStus
+endif BUILD_SICSTUS_PROLOG_INTERFACE
+
+if BUILD_SWI_PROLOG_INTERFACE
+SWI_PROLOG_SUBDIR = SWI
+endif BUILD_SWI_PROLOG_INTERFACE
+
+if BUILD_XSB_PROLOG_INTERFACE
+XSB_PROLOG_SUBDIR = XSB
+endif BUILD_XSB_PROLOG_INTERFACE
+
+if BUILD_YAP_PROLOG_INTERFACE
+YAP_PROLOG_SUBDIR = YAP
+endif BUILD_YAP_PROLOG_INTERFACE
+
+SUBDIRS = \
+. tests \
+$(CIAO_PROLOG_SUBDIR) \
+$(GNU_PROLOG_SUBDIR) \
+$(SICSTUS_PROLOG_SUBDIR) \
+$(SWI_PROLOG_SUBDIR) \
+$(XSB_PROLOG_SUBDIR) \
+$(YAP_PROLOG_SUBDIR)
+
+interface_generator_files = \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4 \
+ppl_interface_generator_prolog_systems.m4
+
+interface_generator_dox_files = \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_prolog_common_defs.hh \
+ppl_prolog_common_inlines.hh \
+ppl_prolog_common.cc \
+Prolog_configured_interface.dox \
+$(interface_generator_dox_files) \
+Prolog_interface.dox \
+Prolog_interface_sysindep.dox \
+Prolog_interface_sysindep_domains.dox \
+Prolog_interface_compilation.dox \
+Prolog_interface_sysdep.dox
+
+
+interface_generator_dox_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+Prolog_configured_domains.dox: \
+$(interface_generator_dox_dependencies) Makefile
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_dox.m4 \
+                > Prolog_configured_domains.dox
+
+BUILT_SOURCES = \
+ppl_prolog_domains.hh \
+ppl_prolog_domains.cc.stamp
+
+nodist_noinst_DATA = Prolog_configured_domains.dox
+
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+
+ppl_prolog_domains.hh: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_hh_files.m4 \
+                > ppl_prolog_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_hh_blob
+	rm -f ppl_prolog_hh_blob
+
+ppl_prolog_domains.cc.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_cc_files.m4 \
+                > ppl_prolog_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_cc_blob
+	rm -f ppl_prolog_cc_blob
+	echo timestamp >$@
+
+CLEANFILES = \
+ at required_instantiations_prolog_cxx_headers@ \
+ at required_instantiations_prolog_cxx_sources@ \
+ppl_prolog_domains.cc.stamp \
+ppl_prolog_domains.hh \
+Prolog_configured_domains.dox
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Prolog/Makefile.in b/interfaces/Prolog/Makefile.in
new file mode 100644
index 0000000..c31d7a0
--- /dev/null
+++ b/interfaces/Prolog/Makefile.in
@@ -0,0 +1,827 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(nodist_noinst_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = . tests Ciao GNU SICStus SWI XSB YAP
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@CIAO_PROLOG_SUBDIR = Ciao
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@GNU_PROLOG_SUBDIR = GNU
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@SICSTUS_PROLOG_SUBDIR = SICStus
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@SWI_PROLOG_SUBDIR = SWI
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@XSB_PROLOG_SUBDIR = XSB
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@YAP_PROLOG_SUBDIR = YAP
+SUBDIRS = \
+. tests \
+$(CIAO_PROLOG_SUBDIR) \
+$(GNU_PROLOG_SUBDIR) \
+$(SICSTUS_PROLOG_SUBDIR) \
+$(SWI_PROLOG_SUBDIR) \
+$(XSB_PROLOG_SUBDIR) \
+$(YAP_PROLOG_SUBDIR)
+
+interface_generator_files = \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_hh_files.m4 \
+ppl_interface_generator_prolog_hh_code.m4 \
+ppl_interface_generator_prolog_cc_files.m4 \
+ppl_interface_generator_prolog_cc_code.m4 \
+ppl_interface_generator_prolog_systems.m4
+
+interface_generator_dox_files = \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+EXTRA_DIST = \
+$(interface_generator_files) \
+ppl_prolog_common_defs.hh \
+ppl_prolog_common_inlines.hh \
+ppl_prolog_common.cc \
+Prolog_configured_interface.dox \
+$(interface_generator_dox_files) \
+Prolog_interface.dox \
+Prolog_interface_sysindep.dox \
+Prolog_interface_sysindep_domains.dox \
+Prolog_interface_compilation.dox \
+Prolog_interface_sysdep.dox
+
+interface_generator_dox_dependencies = \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4 \
+ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_dox.m4 \
+ppl_interface_generator_prolog_dox_code.m4
+
+BUILT_SOURCES = \
+ppl_prolog_domains.hh \
+ppl_prolog_domains.cc.stamp
+
+nodist_noinst_DATA = Prolog_configured_domains.dox
+interface_generator_dependencies = \
+$(interface_generator_files) \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../ppl_interface_generator_common.m4 \
+../ppl_interface_generator_common_dat.m4 \
+../ppl_interface_generator_copyright \
+../ppl_interface_generator_common_procedure_generators.m4
+
+CLEANFILES = \
+ at required_instantiations_prolog_cxx_headers@ \
+ at required_instantiations_prolog_cxx_sources@ \
+ppl_prolog_domains.cc.stamp \
+ppl_prolog_domains.hh \
+Prolog_configured_domains.dox
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-generic clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+
+Prolog_configured_domains.dox: \
+$(interface_generator_dox_dependencies) Makefile
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_dox.m4 \
+                > Prolog_configured_domains.dox
+
+ppl_prolog_domains.hh: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_hh_files.m4 \
+                > ppl_prolog_hh_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_hh_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_hh_blob
+	rm -f ppl_prolog_hh_blob
+
+ppl_prolog_domains.cc.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I.. -I$(srcdir) -I$(srcdir)/.. \
+           $(srcdir)/ppl_interface_generator_prolog_cc_files.m4 \
+                > ppl_prolog_cc_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_cc_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_cc_blob
+	rm -f ppl_prolog_cc_blob
+	echo timestamp >$@
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/Prolog_configured_interface.dox b/interfaces/Prolog/Prolog_configured_interface.dox
new file mode 100644
index 0000000..87df134
--- /dev/null
+++ b/interfaces/Prolog/Prolog_configured_interface.dox
@@ -0,0 +1,63 @@
+/* Configuration Dependent Documentation for Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+  \defgroup PPL_Prolog_interface Prolog Language Interface
+
+  The Parma Polyhedra Library comes equipped with an interface
+  for the Prolog language.
+*/
+
+/*! \mainpage Prolog Language Interface
+
+The Parma Polyhedra Library comes equipped with a Prolog interface.
+Despite the lack of standardization of Prolog's foreign language interfaces,
+the PPL Prolog interface supports several Prolog systems and, to the
+extent this is possible, provides a uniform view of the library from
+each such system.
+
+The structure of the Prolog interface manual is as follows:
+- System-Independent Features
+    - \ref prolog_interface_overview "Overview"
+    - \ref predicate_specifications "Predicate Specifications"
+    - \ref di_predicates "Domain Independent Predicates"
+    - \ref mip_predicates "Predicates for MIP_Problem"
+    - \ref pip_predicates "Predicates for PIP_Problem"
+    - \ref configured_domains_predicates "Predicates for Configured Domains"
+- \ref PI_Compilation "Compilation and Installation"
+- \ref PI_SD_Features "System-Dependent Features"
+    - \ref GNU_Prolog "GNU Prolog"
+    - \ref CIAO_Prolog "CIAO Prolog"
+    - \ref SICStus_Prolog "SICStus Prolog"
+    - \ref SWI_Prolog "SWI Prolog"
+    - \ref XSB_Prolog "XSB"
+    - \ref YAP_Prolog "YAP"
+
+In all the Prolog interface documentation pages,
+<CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+*/ /* \mainpage */
+
+
diff --git a/interfaces/Prolog/Prolog_interface.dox b/interfaces/Prolog/Prolog_interface.dox
new file mode 100644
index 0000000..e2830d2
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface.dox
@@ -0,0 +1,64 @@
+/* Configuration Independent Documentation for Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*!
+  \defgroup PPL_Prolog_interface Prolog Language Interface
+
+  The Parma Polyhedra Library comes equipped with an interface
+  for the Prolog language.
+*/
+
+/*! \mainpage Prolog Language Interface
+
+The Parma Polyhedra Library comes equipped with a Prolog interface.
+Despite the lack of standardization of Prolog's foreign language interfaces,
+the PPL Prolog interface supports several Prolog systems and, to the
+extent this is possible, provides a uniform view of the library from
+each such system.
+
+The structure of the Prolog interface manual is as follows:
+- System-Independent Features
+    - \ref prolog_interface_overview "Overview"
+    - \ref predicate_specifications "Predicate Specifications"
+    - \ref di_predicates "Domain Independent Predicates"
+    - \ref mip_predicates "Predicates for MIP_Problem"
+    - \ref pip_predicates "Predicates for PIP_Problem"
+    - \ref c_polyhedron_predicates "Predicates for C Polyhedra"
+    - \ref other_domains_predicates "Ad hoc Predicates for Other Domains"
+- \ref PI_Compilation "Compilation and Installation"
+- \ref PI_SD_Features "System-Dependent Features"
+    - \ref GNU_Prolog "GNU Prolog"
+    - \ref CIAO_Prolog "CIAO Prolog"
+    - \ref SICStus_Prolog "SICStus Prolog"
+    - \ref SWI_Prolog "SWI Prolog"
+    - \ref XSB_Prolog "XSB"
+    - \ref YAP_Prolog "YAP"
+
+In all the Prolog interface documentation pages,
+<CODE>prefix</CODE> is the prefix under which
+you have installed the library (typically <CODE>/usr</CODE>
+or <CODE>/usr/local</CODE>).
+
+*/ /* \mainpage */
+
+
diff --git a/interfaces/Prolog/Prolog_interface_compilation.dox b/interfaces/Prolog/Prolog_interface_compilation.dox
new file mode 100644
index 0000000..ce3509c
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_compilation.dox
@@ -0,0 +1,59 @@
+// Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+// Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+//
+// This document describes the Parma Polyhedra Library (PPL).
+//
+// Permission is granted to copy, distribute and/or modify this document
+// under the terms of the GNU Free Documentation License, Version 1.2
+// or any later version published by the Free Software Foundation;
+// with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+// The license is included, in various formats, in the `doc' subdirectory
+// of each distribution of the PPL in files named `fdl.*'.
+//
+// The PPL is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3 of the License, or (at your
+// option) any later version.  The license is included, in various
+// formats, in the `doc' subdirectory of each distribution of the PPL in
+// files named `gpl.*'.
+//
+// The PPL is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// If you have not received a copy of one or both the above mentioned
+// licenses along with the PPL, write to the Free Software Foundation,
+// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+//
+// For the most up-to-date information see the Parma Polyhedra Library
+// site: http://bugseng.com/products/ppl/ .
+
+
+/*! \page PI_Compilation Compilation and Installation
+
+When the Parma Polyhedra Library is configured, it tests for the existence
+of each supported Prolog system.  If a supported Prolog system is
+correctly installed in a standard location, things are arranged
+so that the corresponding interface is built and installed.
+
+The Prolog interface files are all installed in the directory
+<CODE>prefix/lib/ppl</CODE>.  Since this includes shared and
+dynamically loaded libraries, you must make your dynamic
+linker/loader aware of this fact.  If you use a GNU/Linux system,
+try the commands <CODE>man ld.so</CODE> and <CODE>man ldconfig</CODE>
+for more information.
+
+As an option, the Prolog interface can track the creation and disposal
+of polyhedra.  In fact, differently from native Prolog data, PPL polyhedra
+must be explicitly disposed and forgetting to do so is a very common mistake.
+To enable this option, configure the library adding
+<CODE>-DPROLOG_TRACK_ALLOCATION</CODE> to the options passed to the
+C++ compiler.
+Your configure command would then look like
+\code
+  path/to/configure --with-cxxflags="-DPROLOG_TRACK_ALLOCATION" ...
+\endcode
+
+*/ /* \page PROLOG_INTERFACE_COMPILATION */
+
diff --git a/interfaces/Prolog/Prolog_interface_sysdep.dox b/interfaces/Prolog/Prolog_interface_sysdep.dox
new file mode 100644
index 0000000..a565ba7
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_sysdep.dox
@@ -0,0 +1,235 @@
+/* System-Dependent Documentation for Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \page PI_SD_Features Prolog Interface System-Dependent Features
+
+\anchor CIAO_Prolog
+<H2>CIAO Prolog</H2>
+
+The Ciao Prolog interface to the PPL is available
+both as ``PPL enhanced'' Ciao Prolog interpreter
+and as a library that can be linked to Ciao Prolog programs.
+Only Ciao Prolog versions 1.10 `#5 and later are supported.'
+
+So that it can be used with the Ciao Prolog PPL interface, the
+Ciao Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_ciao</CODE> Executable</H3>
+
+If an appropriate version of Ciao Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_ciao</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_ciao</CODE> executable is simply the Ciao Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To Ciao Prolog Programs</H3>
+
+In order to allow linking Ciao Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_ciao.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_ciao.*</CODE> contain the executable code for the
+Ciao Prolog interface in various formats (static library, shared library,
+libtool library).
+If your Ciao Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+ciaoc -o myprog prefix/lib/ppl/ppl_ciao.pl ciao_pl_check.pl \
+  -L '-Lprefix/lib/ppl -lppl_ciao -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+\anchor GNU_Prolog
+<H2>GNU Prolog</H2>
+
+The GNU Prolog interface to the PPL is available both as a
+``PPL enhanced'' GNU Prolog interpreter and as a library that can be
+linked to GNU Prolog programs.
+The only GNU Prolog version that is known to work is a patched
+version of the ``unstable version'' tagged
+<A HREF="ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz">20040608</A>
+(which unpacks to a directory called <CODE>gprolog-1.2.18</CODE>).
+The patch is contained in the
+<CODE>interfaces/Prolog/GNU/README</CODE> file of the PPL's distribution.
+
+So that it can be used with the GNU Prolog PPL interface
+(and, for that matter, with any foreign code),
+the GNU Prolog installation must be configured with the
+<CODE>--disable-regs</CODE> option.
+
+<H3>The <CODE>ppl_gprolog</CODE> Executable</H3>
+
+If an appropriate version of GNU Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_gprolog</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_gprolog</CODE> executable is simply the GNU Prolog
+interpreter with the Parma Polyhedra Library linked in.
+The only thing you should do to use the library is to
+call <CODE>ppl_initialize/0</CODE> before any other PPL predicate
+and to call <CODE>ppl_finalize/0</CODE> when you are done with the
+library.
+
+<H3>Linking the Library To GNU Prolog Programs</H3>
+
+In order to allow linking GNU Prolog programs to the PPL,
+the following files are installed in the directory
+<CODE>prefix/lib/ppl</CODE>:
+<CODE>ppl_gprolog.pl</CODE> contains the required foreign declarations;
+<CODE>libppl_gprolog.*</CODE> contain the executable code for the
+GNU Prolog interface in various formats (static library, shared library,
+libtool library).
+If your GNU Prolog program is constituted by, say, <CODE>source1.pl</CODE>
+and <CODE>source2.pl</CODE> and you want to create the executable
+<CODE>myprog</CODE>, your compilation command may look like
+\code
+gplc -o myprog prefix/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+  -L '-Lprefix/lib/ppl -lppl_gprolog -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+
+GNU Prolog uses several stacks to execute a Prolog program each with a
+pre-defined default size.  If the size of a stack is too small for the
+application an overflow will occur.  To change the default size of a
+stack, the user has to set the value of the relevant environment
+variable; in particular, to execute some of the tests, we found it
+necessary to increase the size of GLOBALSZ.
+Thus, for the above example, the compilation command would be
+\code
+GLOBALSZ=32768 gplc -o myprog prefix/lib/ppl/ppl_gprolog.pl source1.pl source2.pl \
+  -L '-Lprefix/lib/ppl -lppl_gprolog -Lprefix/lib -lppl -lgmpxx -lgmp -lstdc++'
+\endcode
+More information on
+adjusting the size of the stacks can be found in Section 3.3 in the
+<A HREF="http://www.gprolog.org/manual/gprolog.html">GNU Prolog
+Manual</A>
+
+\anchor SICStus_Prolog
+<H2>SICStus Prolog</H2>
+
+The SICStus Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SICStus Prolog versions 3.9.0 and later are supported.
+
+<H3>The Statically Linked <CODE>ppl_sicstus</CODE> Executable</H3>
+
+If an appropriate version of SICStus Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_sicstus</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_sicstus</CODE> executable is simply the SICStus Prolog
+system with the Parma Polyhedra Library statically linked.
+The only thing you should do to use the library is to
+load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+
+<H3>Loading the SICStus Interface Dynamically</H3>
+
+In order to dynamically load the library from SICStus Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_sicstus.pl</CODE>.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+\anchor SWI_Prolog
+<H2>SWI-Prolog</H2>
+
+The SWI-Prolog interface to the PPL is available
+both as a statically linked module or as a dynamically linked one.
+Only SWI-Prolog version 5.6.0 and later versions are supported.
+
+<H3>The <CODE>ppl_pl</CODE> Executable</H3>
+
+If an appropriate version of SWI-Prolog is installed on the machine
+on which you compiled the library, the command <CODE>make install</CODE>
+will install the executable <CODE>ppl_pl</CODE> in the directory
+<CODE>prefix/bin</CODE>.
+The <CODE>ppl_pl</CODE> executable is simply the SWI-Prolog
+shell with the Parma Polyhedra Library statically linked:
+from within <CODE>ppl_pl</CODE> all the services of the library
+are available without further action.
+
+<H3>Loading the SWI-Prolog Interface Dynamically</H3>
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load <CODE>prefix/lib/ppl/ppl_swiprolog.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> and
+<CODE>ppl_finalize/0</CODE> automatically.
+Alternatively, you can load the library directly with
+\code
+:- load_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+This will call <CODE>ppl_initialize/0</CODE> automatically.
+Analogously,
+\code
+:- unload_foreign_library('prefix/lib/ppl/libppl_swiprolog').
+\endcode
+will, as part of the unload process, invoke <CODE>ppl_finalize/0</CODE>.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+
+\anchor XSB_Prolog
+<H2>XSB</H2>
+
+The XSB Prolog interface to the PPL is available
+as a dynamically linked module.
+Only some CVS versions of XSB starting from 2 July 2005 are known to work.
+CVS versions starting from 11 November 2005 are known not to work.
+
+In order to dynamically load the library from XSB you should
+load the <CODE>ppl_xsb</CODE> module and import the predicates
+you need.
+For things to work, you may have to copy the files
+<CODE>prefix/lib/ppl/ppl_xsb.xwam</CODE>
+and
+<CODE>prefix/lib/ppl/ppl_xsb.so</CODE>
+in your current directory or in one of the XSB library directories.
+
+
+\anchor YAP_Prolog
+<H2>YAP</H2>
+
+The YAP Prolog interface to the PPL is available
+as a dynamically linked module.
+Only YAP versions following 5.1.0 and CVS HEAD versions starting from
+4 January 2006 are supported.  Notice that support for unbounded
+integers in YAP is young and may have errors that could affect
+programs using the PPL (see, e.g.,
+<A HREF="http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html">http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007780.html</A>).
+
+In order to dynamically load the library from YAP you should
+simply load <CODE>prefix/lib/ppl/ppl_yap.pl</CODE>.
+This will invoke <CODE>ppl_initialize/0</CODE> automatically;
+it is the programmer's responsibility to call <CODE>ppl_finalize/0</CODE>
+when the PPL library is no longer needed.
+Notice that, for dynamic linking to work, you should have configured
+the library with the <CODE>--enable-shared</CODE> option.
+
+*/ /* \page PI_SD_Features */
+
diff --git a/interfaces/Prolog/Prolog_interface_sysindep.dox b/interfaces/Prolog/Prolog_interface_sysindep.dox
new file mode 100644
index 0000000..0edc71d
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_sysindep.dox
@@ -0,0 +1,949 @@
+/* Configuration Independent Documentation for Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \page PI_SI_Features System-Independent Features
+
+\anchor pi_si_features
+<H1>System-Independent Features</H1>
+
+The Prolog interface provides access to the numerical abstractions
+(convex polyhedra, BD shapes, octagonal shapes, etc.) implemented
+by the PPL library.
+A general introduction to the numerical abstractions,
+their representation in the PPL and the operations provided
+by the PPL is given in the main \extref{preamble, PPL user manual}.
+Here we just describe those aspects that are specific to the Prolog interface.
+
+\anchor prolog_interface_overview
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- The numerical abstract domains available to the Prolog user consist
+  of the <EM>simple</EM> domains, <EM>powersets</EM> of a simple domain and
+  <EM>products</EM> of simple domains.
+  - The simple domains are:
+     - convex polyhedra, which consist of C_Polyhedron and
+       NNC_Polyhedron;<BR>
+     - weakly relational, which consist of BD_Shape_N and
+       Octagonal_Shape_N
+       where N is one of the numeric types
+       int8, int16, int32, int64, mpz_class, mpq_class,
+       float, double, long_double;<BR>
+     - boxes which consist of
+       Int8_Box, Int16_Box,
+       Int32_Box, Int64_Box,
+       Uint8_Box, Uint16_Box,
+       Uint32_Box, Uint64_Box,
+       Double_Box, Long_Double_Box,
+       Z_Box, Rational_Box, Float_Box; and<BR>
+     - the Grid domain.
+  - The powerset domains are Pointset_Powerset_S where S is
+    a simple domain.
+  - The product domains consist of
+    Direct_Product_S_T,
+    Smash_Product_S_T,
+    Constraints_Product_S_T and
+    Shape_Preserving_Product_S_T where S
+    and T are simple domains.
+- In the following, any of the above numerical
+  abstract domains  is called a PPL <EM>domain</EM>
+  and any element of a PPL domain is called a <EM>PPL object</EM>.
+- The Prolog interface to the PPL is initialized and finalized by the
+  predicates <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>.
+  Thus the only interface predicates callable after
+  <CODE>ppl_finalize/0</CODE> are <CODE>ppl_finalize/0</CODE> itself
+  (this further call has no effect) and <CODE>ppl_initialize/0</CODE>,
+  after which the interface's services are usable again.
+  Some Prolog systems allow the specification of initialization
+  and deinitialization functions in their foreign language interfaces.
+  The corresponding incarnations of the Prolog interface
+  have been written so that <CODE>ppl_initialize/0</CODE> and/or
+  <CODE>ppl_finalize/0</CODE> are called automatically.
+  Section \ref PI_SD_Features "System-Dependent Features" will detail
+  in which cases initialization and finalization is automatically
+  performed or is left to the Prolog programmer's responsibility.
+  However, for portable applications, it is best
+  to invoke <CODE>ppl_initialize/0</CODE> and <CODE>ppl_finalize/0</CODE>
+  explicitly: since they can be called multiple times without problems,
+  this will result in enhanced portability at a cost that is, by all means,
+  negligible.
+- A PPL object such as a polyhedron can only be accessed
+  by means of a Prolog term called a <EM>handle</EM>.
+  Note, however, that the data structure of a handle,
+  is implementation-dependent, system-dependent and
+  version-dependent, and, for this reason, deliberately left unspecified.
+  What we do guarantee is that the handle requires very little memory.
+- A Prolog term can be bound to a valid handle for a PPL object by using
+  predicates such as
+\code
+  ppl_new_C_Polyhedron_from_space_dimension/3,
+  ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+  ppl_new_C_Polyhedron_from_constraints/2,
+  ppl_new_C_Polyhedron_from_generators/2,
+\endcode
+  These predicates will create or copy a PPL polyhedron
+  and construct a valid handle for referencing it.
+  The last argument is a Prolog term that is
+  unified with a new valid handle for accessing this polyhedron.
+
+- As soon as a PPL object is no longer required,
+  the memory occupied by it should be released
+  using the PPL predicate such as <CODE>ppl_delete_Polyhedron/1</CODE>.
+  To understand why this is important,
+  consider a Prolog program and a variable that is bound to
+  a Herbrand term.
+  When the variable dies (goes out of scope) or is uninstantiated
+  (on backtracking), the term it is bound to is amenable to garbage collection.
+  But this only applies for the standard domain of the language:
+  Herbrand terms.
+  In Prolog+PPL, when, for example,
+  a variable bound to a handle for a Polyhedron dies
+  or is uninstantiated,
+  the handle can be garbage-collected, but the polyhedron to which
+  the handle refers will not be released.
+  Once a handle has been used as an argument in
+  <CODE>ppl_delete_Polyhedron/1</CODE>,
+  it becomes invalid.
+- For a PPL object with space dimension \p k,
+  the identifiers used for the PPL variables
+  must lie between 0 and \f$k-1\f$ and correspond to the indices of the
+  associated Cartesian axes.
+  For example, when using the predicates that combine PPL polyhedra
+  or add constraints or generators to a representation of
+  a PPL polyhedron,
+  the polyhedra referenced and any constraints or generators in the call
+  should follow all the (space) dimension-compatibility rules stated in
+  Section \extref{representation, Representations of Convex Polyhedra}
+  of the main \extref{preamble, PPL user manual}.
+- As explained above, a polyhedron has a fixed topology C or NNC,
+  that is determined at the time of its initialization.
+  All subsequent operations on the polyhedron must respect all the
+  topological compatibility rules stated in Section
+  \extref{representation, Representations of Convex Polyhedra}
+  of the main \extref{preamble, PPL user manual}.
+- Any application using the PPL should make sure that only the
+  intended version(s) of the library are ever used.
+  Predicates
+\code
+  ppl_version_major/1,
+  ppl_version_minor/1,
+  ppl_version_revision/1,
+  ppl_version_beta/1,
+  ppl_version/1,
+  ppl_banner.
+\endcode
+  allow run-time checking of information about the version being used.
+
+\anchor predicate_specifications
+<H2>Predicate Specifications</H2>
+
+The PPL predicates provided by the Prolog interface are specified below.
+The specification uses the following grammar rules:
+\code
+
+ Number      --> unsigned integer       ranging from 0 to an upper bound
+                                        depending on the actual Prolog system.
+
+ C_int       --> Number | - Number      C integer
+
+ C_unsigned  --> Number                 C unsigned integer
+
+ Coeff       --> Number                 used in linear expressions;
+                                        the upper bound will depend on how
+                                        the PPL has been configured
+
+ Dimension_Type
+             --> Number                 used for the number of affine and
+                                        space dimensions and the names of
+                                        the dimensions;
+                                        the upper bound will depend on
+                                        the maximum number of dimensions
+                                        allowed by the PPL
+                                        (see ppl_max_space_dimensions/1)
+
+ Boolean     --> true | false
+
+ Handle      --> Prolog term            used to identify a Polyhedron
+
+ Topology    --> c | nnc                Polyhedral kind;
+                                        c is closed and nnc is NNC
+
+ VarId       --> Dimension_Type         variable identifier
+
+ PPL_Var     --> '$VAR'(VarId)          PPL variable
+
+ Lin_Expr    --> PPL_Var                PPL variable
+            | Coeff
+            | Lin_Expr                  unary plus
+            | - Lin_Expr                unary minus
+            | Lin_Expr + Lin_Expr       addition
+            | Lin_Expr - Lin_Expr       subtraction
+            | Coeff * Lin_Expr          multiplication
+            | Lin_Expr * Coeff          multiplication
+
+ Relation_Symbol --> =                  equals
+            | =<                        less than or equal
+            | >=                        greater than or equal
+            | <                         strictly less than
+            | >                         strictly greater than
+
+ Constraint  --> Lin_Expr Relation_Symbol Lin_Expr
+                                        constraint
+
+ Constraint_System                      list of constraints
+             --> []
+            | [Constraint | Constraint_System]
+
+ Modulus     --> Coeff | - Coeff
+
+ Congruence  --> Lin_Expr =:= Lin_Expr  congruence with modulo 1
+            | (Lin_Expr =:= Lin_Expr) / Modulus
+                                        congruence with modulo Modulus
+
+ Congruence_System                      list of congruences
+             --> []
+            | [Congruence | Congruence_System]
+
+ Generator_Denominator --> Coeff        must be non-zero
+            | - Coeff
+
+ Generator   --> point(Lin_Expr)        point
+            | point(Lin_Expr, Generator_Denominator)
+                                        point
+            | closure_point(Lin_Expr)   closure point
+            | closure_point(Lin_Expr, Generator_Denominator)
+                                        closure point
+            | ray(Lin_Expr)             ray
+            | line(Lin_Expr)            line
+
+ Generator_System                       list of generators
+             --> []
+            | [Generator | Generator_System]
+
+ Grid_Generator
+             --> grid_point(Lin_Expr)   grid point
+            | grid_point(Lin_Expr, Generator_Denominator)
+                                        grid point
+            | parameter(Lin_Expr)       parameter
+            | parameter(Lin_Expr, Generator_Denominator)
+                                        parameter
+            | grid_line(Lin_Expr)       grid line
+
+ Grid_Generator_System                  list of grid generators
+             --> []
+            | [Grid_Generator | Grid_Generator_System]
+
+ Artificial_Parameter  --> Lin_Expr / Coeff
+
+ Artificial_Parameter_List --> []
+            | [Artificial_Parameter | Artificial_Parameter_List]
+
+ Atom        --> Prolog atom
+
+ Universe_or_Empty                      PPL object
+             --> universe | empty
+
+ Poly_Relation --> is_disjoint          with a constraint or congruence
+            | strictly_intersects       with a constraint or congruence
+            | is_included               with a constraint or congruence
+            | saturates                 with a constraint or congruence
+            | subsumes                  with a (grid) generator
+
+ Relation_List --> []
+            | [Poly_Relation | Relation_List]
+
+ Complexity  --> polynomial | simplex | any
+
+ Vars_Pair   --> PPL_Var - PPL_Var      map relation
+
+ P_Func      --> []                     list of map relations
+            | [Vars_Pair | P_Func].
+
+ Width  --> bits_8 | bits_16 | bits_32 | bits_64 | bits_128
+
+ Representation  --> unsigned | signed_2_complement
+
+ Overflow  --> overflow_wraps | overflow_undefined | overflow_impossible
+
+ Optimization_Mode --> max | min
+
+ Problem_Status --> unfeasible
+            | unbounded
+            | optimized
+
+ Control_Parameter_Name --> pricing            for MIP problems
+                        | control_strategy     for PIP problems
+                        | pivot_row_strategy   for PIP problems
+
+ Control_Parameter_Value
+             --> pricing_steepest_edge_float
+            | pricing_steepest_edge_exact
+            | pricing_textbook
+            | control_strategy_first
+            | control_strategy_deepest
+            | control_strategy_all
+            | pivot_row_strategy_first
+            | pivot_row_strategy_max_column
+
+ Vars_List   --> []                     list of PPL variables
+            | [PPL_Var | Vars_List].
+\endcode
+
+\anchor predicate_descriptions
+<H2> Predicate Descriptions </H2>
+
+Below is a short description of many of the interface predicates.
+For full definitions of terminology used here,
+see the main \extref{preamble, PPL user manual}.
+
+\anchor di_predicates
+<H3> Domain Independent Predicates </H3>
+
+First we describe the domain independent predicates
+that are included with all instantiations of the Prolog interfaces.
+
+<P><CODE> ppl_version_major(?C_int) </CODE><BR>
+  <EM>Unifies <CODE>C_int</CODE> with the major number of the PPL version.</EM>
+
+<P><CODE> ppl_version_minor(?C_int) </CODE><BR>
+  <EM>Unifies <CODE>C_int</CODE> with the minor number of the PPL version.</EM>
+
+<P><CODE> ppl_version_revision(?C_int) </CODE><BR>
+  <EM>Unifies <CODE>C_int</CODE> with the revision number
+  of the PPL version.</EM>
+
+<P><CODE> ppl_version_beta(?C_int) </CODE><BR>
+  <EM>Unifies <CODE>C_int</CODE> with the beta number of the PPL version.</EM>
+
+<P><CODE> ppl_version(?Atom) </CODE><BR>
+  <EM>Unifies <CODE>Atom</CODE> with the PPL version.</EM>
+
+<P><CODE> ppl_banner(?Atom) </CODE><BR>
+  <EM>Unifies <CODE>Atom</CODE> with
+  information about the PPL version, the licensing, the lack of any
+  warranty whatsoever, the C++ compiler used to build the library,
+  where to report bugs and where to look for further information.</EM>
+
+<P><CODE> ppl_Coefficient_bits(?Bits) </CODE><BR>
+
+  <EM>Unifies <CODE>Bits</CODE> with the number of bits used to encode a
+  Coefficient in the C++ interface; 0 if unbounded.</EM>
+
+<P><CODE> ppl_Coefficient_is_bounded </CODE><BR>
+
+  <EM>Succeeds if and only if the Coefficients in the C++ interface are bounded.</EM>
+
+<P><CODE> ppl_Coefficient_max(Max) </CODE><BR>
+
+  <EM>If the Coefficients in the C++ interface are bounded,
+  then the maximum coefficient the C++ interface can handle is
+  unified with <CODE>Max</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.</EM>
+
+<P><CODE> ppl_Coefficient_min(Min) </CODE><BR>
+
+  <EM>If the Coefficients in the C++ interface are bounded,
+  then the minimum coefficient the C++ interface can handle is
+  unified with <CODE>Min</Code>.
+  If the Prolog system cannot handle this coefficient, then
+  an exception is thrown.
+  It fails if the Coefficients in the C++ interface are unbounded.</EM>
+
+<P><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE><BR>
+
+  <EM>Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+  this library can handle.</EM>
+
+<P><CODE>
+  ppl_initialize
+ </CODE><BR>
+
+  <EM>Initializes the PPL interface.
+  Multiple calls to <CODE>ppl_initialize</CODE> does no harm.</EM>
+
+<P><CODE>
+  ppl_finalize
+ </CODE><BR>
+
+  <EM>Finalizes the PPL interface.
+  Once this is executed, the next call to an interface predicate must
+  either be to <CODE>ppl_initialize</CODE> or to <CODE>ppl_finalize</CODE>.
+  Multiple calls to <CODE>ppl_finalize</CODE> does no harm.</EM>
+
+<P><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE><BR>
+
+   <EM>Sets the atom to be thrown by timeout exceptions
+   to <CODE>Atom</CODE>.
+   The default value is <CODE>time_out</CODE>.</EM>
+
+<P><CODE> ppl_timeout_exception_atom(?Atom) </CODE><BR>
+
+   <EM>The atom to be thrown by timeout exceptions
+   is unified with <CODE>Atom</CODE>.</EM>
+
+<P><CODE> ppl_set_timeout(+Csecs) </CODE><BR>
+
+   <EM>Computations taking exponential time will be interrupted
+   some time after <CODE>Csecs</CODE> centiseconds after that call.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>Csecs</CODE> must be strictly greater than zero.</EM>
+
+<P><CODE> ppl_reset_timeout </CODE><BR>
+
+   <EM>Resets the timeout time so that the computation is not interrupted.</EM>
+
+<P><CODE> ppl_set_deterministic_timeout(+Unscaled_Weight, +Scale) </CODE><BR>
+
+   <EM>Computations taking exponential time will be interrupted
+   some time after reaching the complexity threshold
+   \f$\mathrm{Weight} = \mathrm{Unscaled\_Weight} \cdot 2^\mathrm{Scale}\f$.
+   If the computation is interrupted that way, the current timeout
+   exception atom will be thrown.
+   <CODE>Unscaled_Weight</CODE> must be strictly greater than zero;
+   <CODE>Scale</CODE> must be non-negative;
+   an exception is thrown if the computed weight threshold exceeds
+   the maximum allowed value.</EM>
+   <P>
+   <EM>NOTE:</EM> This "timeout" checking functionality is said to be
+   <EM>deterministic</EM> because it is not based on actual elapsed time.
+   Its behavior will only depend on (some of the) computations performed
+   in the PPL library and it will be otherwise independent from the
+   computation environment (CPU, operating system, compiler, etc.).
+   The weight mechanism is under beta testing: client applications
+   should be ready to reconsider the tuning of these weight thresholds
+   when upgrading to newer version of the PPL.
+
+<P><CODE> ppl_reset_deterministic_timeout </CODE><BR>
+
+   <EM>Resets the deterministic timeout so that the computation is not
+   interrupted.</EM>
+
+<P><CODE> ppl_set_rounding_for_PPL </CODE><BR>
+
+  <EM>Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has
+  previously been called.</EM>
+
+
+<P><CODE> ppl_restore_pre_PPL_rounding </CODE><BR>
+
+  <EM>Sets the FPU rounding mode as it was before initialization of the PPL.
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.</EM>
+
+<P><CODE> ppl_irrational_precision(?Precision) </CODE><BR>
+
+  <EM>Unifies <CODE>Precision</CODE> with the precision parameter for
+  irrational calculations.</EM>
+
+<P><CODE> ppl_set_irrational_precision(+Precision) </CODE><BR>
+
+  <EM>Sets the precision parameter for irrational calculations to
+  <CODE>Precision</CODE>. In the following irrational calculations
+  returning an unbounded rational (e.g., when computing a square root),
+  the lesser between numerator and denominator will be limited to
+  <CODE>2**Precision</CODE>.</EM>
+
+
+\anchor mip_predicates
+<H3> Predicates for MIP_Problem </H3>
+Here we describe the predicates available for PPL objects
+defining mixed integer (linear) programming problems.
+
+<P><CODE>
+  ppl_new_MIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE><BR>
+
+   <EM>Creates an MIP Problem \f$\mathrm{MIP}\f$ with the feasible region
+   the vector space of dimension <CODE>Dimension_Type</CODE>,
+   objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.</EM>
+
+<P><CODE>
+  ppl_new_MIP_Problem(+Dimension_Type, +Constraint_System, +Lin_Expr,
+                      +Optimization_Mode, -Handle)
+</CODE><BR>
+
+   <EM>Creates an MIP Problem \f$\mathrm{MIP}\f$ with
+   the feasible region the vector space of dimension
+   <CODE>Dimension_Type</CODE>, represented by <CODE>Constraint_System</CODE>,
+   objective function <CODE>Lin_Expr</CODE> and optimization mode
+   <CODE>Optimization_Mode</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{MIP}\f$.</EM>
+
+<P><CODE>
+  ppl_new_MIP_Problem_from_MIP_Problem(+Handle_1, -Handle_2)
+</CODE><BR>
+
+   <EM>Creates an MIP Problem \f$\mathrm{MIP}\f$ from the MIP Problem
+   referenced by \c Handle_1.
+   \c Handle_2 is unified with the handle for \f$\mathrm{MIP}\f$.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE><BR>
+
+   <EM>Swaps the MIP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.</EM>
+
+<P><CODE>
+  ppl_delete_MIP_Problem(+Handle)
+</CODE><BR>
+
+   <EM>Deletes the MIP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL MIP Problem.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE><BR>
+
+   <EM>Unifies the dimension of the vector space in which the
+   MIP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_integer_space_dimensions(+Handle, ?Vars_List)
+</CODE><BR>
+
+   <EM>Unifies <CODE>Vars_List</CODE> with a list of variables representing
+   the integer space dimensions of the MIP Problem
+   referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_constraints(+Handle, -Constraint_System)
+</CODE><BR>
+
+   <EM>Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the MIP Problem
+   referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_objective_function(+Handle, ?Lin_Expr)
+</CODE><BR>
+
+   <EM>Unifies <CODE>Lin_Expr</CODE> with the objective function
+   for the MIP Problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE><BR>
+
+   <EM>Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+   for the MIP Problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_clear(+Handle)
+</CODE><BR>
+
+  <EM>Resets the MIP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe,
+  objective function \f$0\f$ and optimization mode <CODE>max</CODE>.</EM>
+
+<P><CODE> ppl_MIP_Problem_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type)
+ </CODE><BR>
+
+   <EM>Embeds the MIP problem referenced by <CODE>Handle</CODE>
+   in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_add_to_integer_space_dimensions(+Handle, +Vars_List)
+</CODE><BR>
+
+   <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the variables in <CODE>Vars_List</CODE> are added to
+   the set of integer space dimensions.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE><BR>
+
+   <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE><BR>
+
+   <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in
+   <CODE>Constraint_System</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE><BR>
+
+   <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the objective function is changed to <CODE>Lin_Expr</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_set_control_parameter(+Handle, +Control_Parameter_Value)
+</CODE><BR>
+
+   <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the value for the relevant control parameter name is
+   changed to <CODE>Control_Parameter_Value</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_get_control_parameter(+Handle, +Control_Parameter_Name,
+                                        ?Control_Parameter_Value)
+</CODE><BR>
+
+   <EM>Unifies \c Control_Parameter_Value with the value of the
+   control parameter \c Control_Parameter_Name.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE><BR>
+
+   <EM>Updates the MIP Problem referenced by <CODE>Handle</CODE>
+   so that the optimization mode is changed to
+   <CODE>Optimization_Mode</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_is_satisfiable(+Handle)
+</CODE><BR>
+
+  <EM>Succeeds if and only if the MIP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_solve(+Handle, ?MIP_Problem_Status)
+</CODE><BR>
+
+  <EM>Solves the MIP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>MIP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the MIP problem is not satisfiable;
+  <CODE>unbounded</CODE>, if the MIP problem is satisfiable but
+  there is no finite bound to the value of the objective function;
+  <CODE>optimized</CODE>, if the MIP problem admits an optimal solution.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_feasible_point(+Handle, ?Generator)
+</CODE><BR>
+
+  <EM>Unifies  <CODE>Generator</CODE> with a feasible point
+  for the MIP problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE><BR>
+
+  <EM>Unifies  <CODE>Generator</CODE> with an optimizing point for
+  the MIP problem referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_optimal_value(+Handle, ?Coeff_1, ?Coeff_2)
+</CODE><BR>
+
+  <EM>Unifies <CODE>Coeff_1</CODE> and <CODE>Coeff_2</CODE>
+  with the numerator and denominator, respectively, for the optimal value
+  for the MIP problem  referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_evaluate_objective_function(+Handle, +Generator,
+                                             ?Coeff_1, ?Coeff_2)
+</CODE><BR>
+  <EM>Evaluates the objective function of the MIP problem  referenced by
+  <CODE>Handle</CODE> at point <CODE>Generator</CODE>.
+  <CODE>Coefficient_1</CODE> is unified with the numerator and
+  <CODE>Coefficient_2</CODE> is unified with the denominator of the
+  objective function value at <CODE>Generator</CODE>.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_OK(+Handle)
+</CODE><BR>
+
+   <EM>Succeeds only if the MIP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.
+   Useful for debugging purposes.</EM>
+
+<P><CODE>
+  ppl_MIP_Problem_ascii_dump(+Handle)
+</CODE><BR>
+
+   <EM>Dumps an ascii representation of the PPL internal state for
+   the MIP problem referenced by <CODE>Handle</CODE> on
+   the standard output.</EM>
+
+<BR>
+
+\anchor pip_predicates
+<H3> Predicates for PIP_Problem </H3>
+Here we describe some functions available for PPL objects
+defining parametric integer programming problems.
+
+<P><CODE>
+  ppl_new_PIP_Problem_from_space_dimension(+Dimension_Type, -Handle)
+</CODE><BR>
+
+   <EM>Creates a PIP Problem \f$\mathrm{PIP}\f$ with the
+   feasible region the vector space of dimension <CODE>dimension</CODE>,
+   empty constraint_system and empty set of parametric variables.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{PIP}\f$.</EM>
+
+<P><CODE>
+  ppl_new_PIP_Problem_from_PIP_Problem(+Handle_1, -Handle_2)
+</CODE><BR>
+   <EM>Creates a PIP Problem \f$\mathrm{PIP}\f$ from the PIP Problem
+   referenced by \c Handle_1.
+   \c Handle_2 is unified with the handle for \f$\mathrm{PIP}\f$.</EM>
+
+<P><CODE>
+  ppl_new_PIP_Problem(+Dimension_Type, +Constraint_System, +Vars_List,
+                      -Handle)
+</CODE><BR>
+
+   <EM>Creates a PIP Problem \f$\mathrm{PIP}\f$ having space
+   dimension <CODE>dimension</CODE>, a feasible region represented by
+   <CODE>constraint_system</CODE> and parametric variables represented
+   by <CODE>Vars_List</CODE>.
+   <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{PIP}\f$.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_swap(+Handle_1, +Handle_2)
+</CODE><BR>
+   <EM>Swaps the PIP Problem referenced by <CODE>Handle_1</CODE>
+   with the one referenced by <CODE>Handle_2</CODE>.</EM>
+
+<P><CODE>
+  ppl_delete_PIP_Problem(+Handle)
+</CODE><BR>
+   <EM>Deletes the PIP Problem referenced by <CODE>Handle</CODE>.
+   After execution,
+   <CODE>Handle</CODE> is no longer a valid handle for a PPL PIP Problem.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE><BR>
+   <EM>Unifies the dimension of the vector space in which the
+   PIP Problem referenced by <CODE>Handle</CODE> is embedded
+   with <CODE>Dimension_Type</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_parameter_space_dimensions(+Handle, ?Vars_List)
+</CODE><BR>
+   <EM>Unifies <CODE>Vars_List</CODE> with a list of variables representing
+   the parameter space dimensions of the PIP Problem
+   referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_constraints(+Handle, ?Constraint_System)
+</CODE><BR>
+   <EM>Unifies <CODE>Constraint_System</CODE> with a list of
+   the constraints in the constraints system
+   representing the feasible region for the PIP Problem
+   referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_get_control_parameter(+Handle, +Control_Parameter_Name,
+                                        ?Control_Parameter_Value)
+</CODE><BR>
+
+   <EM>Unifies \c Control_Parameter_Value with the value of the
+   control parameter \c Control_Parameter_Name.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_clear(+Handle)
+</CODE><BR>
+  <EM>Resets the PIP problem referenced by <CODE>Handle</CODE>
+  to be the trivial problem with
+  the feasible region the \f$0\f$-dimensional universe.</EM>
+
+<P><CODE> ppl_PIP_Problem_add_space_dimensions_and_embed(
+             +Handle, +Dimension_Type1, +Dimension_Type2)
+ </CODE><BR>
+   <EM>Embeds the PIP problem referenced by <CODE>handle</CODE>
+   in a space that is enlarged by <CODE>dimension1</CODE> non-parameter
+   dimensions and <CODE>dimension2</CODE> parameter dimensions.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_add_to_parameter_space_dimensions(+Handle, +Vars_List)
+</CODE><BR>
+   <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+   so that the variables in <CODE>Vars_List</CODE> are added to
+   the set of parameter space dimensions.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_add_constraint(+Handle, +Constraint)
+</CODE><BR>
+   <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with the constraint <CODE>Constraint</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE><BR>
+   <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+   so that the feasible region is represented by the original constraint
+   system together with all the constraints in
+   <CODE>Constraint_System</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_set_control_parameter(+Handle, +Control_Parameter_Value)
+</CODE><BR>
+
+   <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+   so that the value for the relevant control parameter name is
+   changed to <CODE>Control_Parameter_Value</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_is_satisfiable(+Handle)
+</CODE><BR>
+  <EM>Succeeds if and only if the PIP Problem referenced by
+  <CODE>Handle</CODE> is satisfiable.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_solve(+Handle, ?PIP_Problem_Status)
+</CODE><BR>
+  <EM>Solves the PIP problem  referenced by
+  <CODE>Handle</CODE> and unifies <CODE>PIP_Problem_Status</CODE>
+  with:
+  <CODE>unfeasible</CODE>, if the PIP problem is not satisfiable;
+  <CODE>optimized</CODE>, if the PIP problem admits an optimal solution.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_solution(+Handle1, ?Handle2)
+</CODE><BR>
+  <EM>Solves the PIP problem referenced by <CODE>Handle1</CODE> and
+  creates a PIP tree node \f$\mathrm{Node}\f$ representing this a solution
+  if it exists and bottom otherwise
+  \c Handle_2 is unified with the handle for \f$\mathrm{Sol}\f$.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_optimizing_solution(+Handle, ?PIP_Tree_Node)
+</CODE><BR>
+  <EM>Solves the PIP problem referenced by <CODE>Handle1</CODE> and
+  creates a PIP tree node \f$\mathrm{Node}\f$ representing this an optimizing
+  solution if a solution exists and bottom otherwise
+  \c Handle_2 is unified with the handle for \f$\mathrm{Sol}\f$.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_has_big_parameter_dimension(+Handle, +Dimension_Type)
+</CODE><BR>
+   <EM>Succeeds if and only if the PIP Problem referenced by
+       <CODE>Handle</CODE> has a dimension \p dim for the big parameter
+       and \p Dimension_Type unifies with \p dim.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_set_big_parameter_dimension(+Handle, +Dimension_Type)
+</CODE><BR>
+
+   <EM>Updates the PIP Problem referenced by <CODE>Handle</CODE>
+       so that the dimension for the big parameter is \p Dimension_Type.</EM>
+
+<P><CODE>
+  ppl_PIP_Problem_OK(+Handle)
+</CODE><BR>
+   <EM>Succeeds only if the PIP Problem referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.
+   Useful for debugging purposes.</EM>
+
+<P><CODE>ppl_PIP_Problem_ascii_dump(+Handle)</CODE><BR>
+  <EM>Dumps an ascii representation of the PPL internal state for
+  the PIP problem referenced by \c Handle on the standard output.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_constraints(+Handle, ?Constraint_System)
+</CODE><BR>
+   <EM>Unifies <CODE>Constraint_System</CODE> with a list of
+   the parameter constraints in the PIP tree node
+   referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_is_solution(+Handle)
+</CODE><BR>
+   <EM>Succeeds if and only if <CODE>handle</CODE> represents
+   a solution node.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_is_decision(+Handle)
+</CODE><BR>
+   <EM>Succeeds if and only if <CODE>handle</CODE> represents
+   a decision node.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_is_bottom(+Handle)
+</CODE><BR>
+   <EM>Succeeds if and only if <CODE>handle</CODE> represents bottom.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_artificials(+Handle, ?Artificial_Parameter_List)
+</CODE><BR>
+   <EM>Unifies <CODE>Artificial_Parameter_List</CODE> with a list of
+   the artificial parameters in the PIP tree node
+   referenced by <CODE>Handle</CODE>.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_OK(+Handle)
+</CODE><BR>
+   <EM>Succeeds only if the PIP tree node referenced by
+   <CODE>Handle</CODE> is well formed, i.e., if it
+   satisfies all its implementation invariants.
+   Useful for debugging purposes.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_parametric_values(+Handle, +Var, ?Lin_Expr)
+</CODE><BR>
+   <EM>Unifies \p Lin_Expr with a linear expression representing
+   the values of problem variable \p Var in the solution node
+   represented by <CODE>Handle</CODE>.
+   The  linear expression may involve problem parameters
+   as well as artificial parameters.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_true_child(+Handle1, ?Handle2)
+</CODE><BR>
+  <EM>If the PIP_Tree_Node represented by \p Handle1 is a decision node
+   unifies the PIP tree node referenced by <CODE>Handle2</CODE>
+   with the child on the true branch of the
+   PIP tree node represented by <CODE>Handle1</CODE>.
+   An exception is thrown if this is not a decision node.</EM>
+
+<P><CODE>
+  ppl_PIP_Tree_Node_false_child(+Handle1, ?Handle2)
+</CODE><BR>
+  <EM>If the PIP_Tree_Node represented by \p Handle1 is a decision node
+   unifies the PIP tree node referenced by <CODE>Handle2</CODE>
+   with the child on the false branch of the
+   PIP tree node represented by <CODE>Handle1</CODE>.
+   An exception is thrown if this is not a decision node.</EM>
+
+*/ /* \page PI_SI_Features */
diff --git a/interfaces/Prolog/Prolog_interface_sysindep_domains.dox b/interfaces/Prolog/Prolog_interface_sysindep_domains.dox
new file mode 100644
index 0000000..a6b488f
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface_sysindep_domains.dox
@@ -0,0 +1,914 @@
+/* Configuration Independent Documentation for Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+/*! \page domains_predicates Domains Predicates
+
+The structure of this section is as follows:
+  - \ref c_polyhedron_predicates "Predicates for C Polyhedra"
+  - \ref other_domains_predicates "Ad hoc Predicates for Other Domains"
+
+<BR>
+
+\anchor c_polyhedron_predicates
+<H1>Predicates for the C Polyhedron Domain</H1>
+  Here we provide a short description for each of the predicates
+  available for the domain of C polyhedra.
+Note that predicates for other domains will follow a similar pattern.
+
+<H2>Constructor, copy, conversion and destructor predicates</H2>
+<H3>Constructor predicates for C polyhedra</H3>
+The constructor predicates build a
+C polyhedron from a specification
+and binds the given variable to a handle for future referencing.
+The specification can be:
+- the number of space dimensions and an atom indicating if it
+  is to be the universe or empty element.
+- a representation for the particular class of semantic geometric
+  descriptors to which the element being built belongs.
+For example,
+  a C Polyhedron can be built from a list of
+  non-strict inequality or equality constraints or a list of equality
+  congruences or a list of generators that contains no closure points.
+
+<P><CODE>ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+   <EM>Builds a new C polyhedron \f$\cP\f$
+   with \c Dimension_Type dimensions; it is empty
+   or the universe depending on whether \c Atom
+   is \c empty or \c universe, respectively.
+   \c Handle is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X).
+\endcode
+   creates the C polyhedron defining the
+   3-dimensional vector space
+   \f$\Rset^3\f$ with \c X bound to a valid handle for accessing it.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P from
+  \c Constraint_System.
+  \c Handle is unified with the handle for \p P.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_congruences(+Congruence_System, -Handle)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P from
+  \c Congruence_System.
+  \c Handle is unified with the handle for \p P.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P from
+  \c Generator_System.
+  \c Handle is unified with the handle for \p P.</EM>
+
+
+<H3>Predicates that build new C polyhedra
+  by copying or converting from
+  other semantic geometric descriptions</H3>
+  Besides the constructors listed above, the library also
+  provides:
+- copy constructors that will copy an element belonging
+  to the same class of semantic geometric descriptions
+- conversion operators that build a new semantic geometric
+  description starting from a \b friend;
+  that is, a semantic geometric description in different class
+  (e.g., ppl_new_Grid_from_C_Polyhedron,
+  ppl_new_C_Polyhedron_from_BD_Shape_mpq_class, etc.).<BR>
+
+  The copy and conversion predicates have two versions,
+  one with arity 2 for the source and target handles and one
+  with an extra argument denoting the maximum complexity to be used
+  in the conversion;
+  this complexity argument is ignored when the
+  the friend and the element being built are in the same class.
+
+<P><CODE>ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P_1 from
+   the c polyhedron referenced by handle \c Handle_1.
+  \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P_1 from
+   the nnc polyhedron referenced by handle \c Handle_1.
+  \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity(+Handle, +Complexity, -Handle)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P_1 from
+   the c polyhedron referenced by handle \c Handle_1
+  using an algorithm whose complexity does not exceed \c Complexity;
+  \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+<P><CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity(+Handle, +Complexity, -Handle)</CODE><BR>
+  <EM>Builds a new C polyhedron \p P_1 from
+   the nnc polyhedron referenced by handle \c Handle_1
+  using an algorithm whose complexity does not exceed \c Complexity;
+  \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+
+<H3>Destructor predicate</H3>
+Below is the destructor predicate for the Polyhedron domain.
+
+<P><CODE>ppl_delete_Polyhedron(+Handle)</CODE><BR>
+  <EM>Invalidates the handle  referenced by \c Handle:
+  this makes sure the corresponding resources will eventually be released.</EM>
+
+
+<H2>Predicates that do not change the polyhedron</H2>
+<H3>Test Predicates</H3>
+These predicates test the polyhedron for different properties
+and succeed or fail depending on the outcome.
+
+<P><CODE>ppl_Polyhedron_is_empty(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle is empty.</EM>
+
+<P><CODE>ppl_Polyhedron_is_universe(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle is the universe.</EM>
+
+<P><CODE>ppl_Polyhedron_is_bounded(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle is bounded.</EM>
+
+<P><CODE>ppl_Polyhedron_contains_integer_point(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle contains an integer point.</EM>
+
+<P><CODE>ppl_Polyhedron_is_topologically_closed(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle is topologically closed.</EM>
+
+<P><CODE>ppl_Polyhedron_is_discrete(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle is discrete.</EM>
+
+<P><CODE>ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)</CODE><BR>
+   <EM>Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above
+   in the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)</CODE><BR>
+   <EM>Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below
+   in the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in or equal to
+   the polyhedron referenced by <CODE>Handle_1</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is included in but not equal to
+   the polyhedron referenced by <CODE>Handle_1</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_2</CODE> is disjoint from
+   the polyhedron referenced by <CODE>Handle_1</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the polyhedron referenced by
+   <CODE>Handle_1</CODE> is
+   equal to the polyhedron referenced by <CODE>Handle_2</CODE>.</EM>
+
+<P><CODE>ppl_Polyhedron_OK(+Handle)</CODE><BR>
+   <EM>Succeeds only if the polyhedron referenced by
+   \c Handle is well formed, i.e., if it
+   satisfies all its implementation invariants.
+   Useful for debugging purposes.</EM>
+
+<P><CODE>ppl_Polyhedron_constrains(+Handle, +PPL_Var)</CODE><BR>
+  <EM>Succeeds if and only if the polyhedron referenced by
+   \c Handle constrains the dimension \c PPL_Var.</EM>
+
+
+<H3>Predicates that return information about the polyhedron</H3>
+These predicates will obtain more detailed information about the
+polyhedron
+unifying some of their arguments with the results.
+
+<P><CODE>ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+   <EM>Unifies \c Dimension_Type with the dimension of the vector space enclosing
+   the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)</CODE><BR>
+   <EM>Unifies \c Dimension_Type with the affine dimension of
+   the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, ?Relation_List)</CODE><BR>
+  <EM>Unifies \c Relation_List with the list of relations the
+  polyhedron referenced by \c Handle has with \c Constraint.
+  The possible relations are listed in the
+  grammar rules above.</EM>
+
+<P><CODE>ppl_Polyhedron_relation_with_generator(+Handle, +Generator, ?Relation_List)</CODE><BR>
+  <EM>Unifies \c Relation_List with the list of relations the
+  polyhedron referenced by \c Handle has with \c Generator.
+  The possible relations are listed in the
+  grammar rules above.</EM>
+
+<P><CODE>ppl_Polyhedron_relation_with_congruence(+Handle, +Congruence, ?Relation_List)</CODE><BR>
+  <EM>Unifies \c Relation_List with the list of relations the
+  polyhedron referenced by \c Handle has with \c Congruence.
+  The possible relations are listed in the
+  grammar rules above.</EM>
+
+<P><CODE>ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)</CODE><BR>
+   <EM>Unifies \c Constraint_System with
+   the constraints (in the form of a list) in the constraint system
+   satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_congruences(+Handle, ?Congruence_System)</CODE><BR>
+   <EM>Unifies \c Congruence_System with
+   the congruences (in the form of a list) in the congruence system
+   satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_generators(+Handle, ?Generator_System)</CODE><BR>
+   <EM>Unifies \c Generator_System with
+   the generators (in the form of a list) in the generator system
+   for the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_minimized_constraints(+Handle, ?Constraint_System)</CODE><BR>
+   <EM>Unifies \c Constraint_System with
+   the constraints (in the form of a list)
+   in the minimized constraint system
+   satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_minimized_congruences(+Handle, ?Congruence_System)</CODE><BR>
+   <EM>Unifies \c Congruence_System with
+   the congruences (in the form of a list)
+   in the minimized congruence system
+   for the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_get_minimized_generators(+Handle, ?Generator_System)</CODE><BR>
+   <EM>Unifies \c Generator_System with
+   the generators (in the form of a list)
+   in the minimized generator system
+   satisfied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+  <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+  is not empty and \c Lin_Expr is bounded from above in \p P.
+
+  \c Coeff_1 is unified with the numerator of the supremum value
+  and \c Coeff_2 with the denominator of the supremum value.
+  If the supremum is also the maximum, \c Boolean is unified
+  with the atom \c true and, otherwise, unified with
+  the atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+  <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+  is not empty and \c Lin_Expr is bounded from below in \p P.
+
+  \c Coeff_1 is unified with the numerator of the infinum value
+  and \c Coeff_2 with the denominator of the infinum value.
+  If the infinum is also the minimum, \c Boolean is unified
+  with the atom \c true and, otherwise, unified with
+  the atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)</CODE><BR>
+  <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+  is not empty and \c Lin_Expr is bounded from above in \p P.
+
+  \c Coeff_1 is unified with the numerator of the supremum value
+  and \c Coeff_2 with the denominator of the supremum value
+  and \c Point with a point or closure point where \c Lin_Expr reaches
+  this value.
+  If the supremum is also the maximum, \c Boolean is unified
+  with the atom \c true and, otherwise, unified with the
+  atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)</CODE><BR>
+  <EM>Succeeds if and only if polyhedron \p P referenced by \c Handle
+  is not empty and \c Lin_Expr is bounded from below in \p P.
+
+  \c Coeff_1 is unified with the numerator of the infinum value
+  and \c Coeff_2 with the denominator of the infinum value
+  and \c Point with a point or closure point where \c Lin_Expr reaches
+  this value.
+  If the infinum is also the minimum, \c Boolean is unified
+  with the atom \c true and, otherwise, unified with the
+  atom \c false.</EM>
+
+<P><CODE>ppl_Polyhedron_external_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<EM>Unifies \c Number with the size of the total memory in
+bytes occupied by the polyhedron referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Polyhedron_total_memory_in_bytes(+Handle, ?Number)</CODE><BR>
+<EM>Unifies \c Number with the size of the external memory in
+bytes occupied by the polyhedron referenced by \c Handle.</EM>
+
+
+<H3>Ascii dump predicate</H3>
+This output predicate is useful for debugging.
+
+<P><CODE>ppl_Polyhedron_ascii_dump(+Handle)</CODE><BR>
+  <EM>Dumps an ascii representation of the PPL internal state for
+  the polyhedron referenced by \c Handle on the standard output.</EM>
+
+
+<H2>Space-dimension preserving predicates that may change
+    the polyhedron</H2>
+These predicates may modify the polyhedron referred to
+by the handle in first argument;
+the (dimension of the) vector space in which it is embedded is unchanged.
+<H3>Predicates that may change the polyhedron by adding
+to its constraint or generator descriptions</H3>
+Note that there are two forms of these predicates
+differentiated in the names by the
+words "add" or "refine with";
+see Section \extref{Generic_Operations_on_Semantic_Geometric_Descriptors, Generic Operations on Semantic Geometric Descriptors} in the
+main \extref{preamble, PPL User Manual}
+for the differences in the semantics and therefore, the expected behavior,
+between these forms.
+
+<P><CODE>ppl_Polyhedron_add_constraint(+Handle, +Constraint)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by adding
+   \c Constraint to its constraint system.
+   For a C polyhedron, \c Constraint must be
+   an equality or a non-strict inequality.</EM>
+
+<P><CODE>ppl_Polyhedron_add_congruence(+Handle, +Congruence)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by adding
+   \c Congruence to its congruence system.
+   For a C polyhedron, \c Congruence must be
+   an equality.</EM>
+
+<P><CODE>ppl_Polyhedron_add_generator(+Handle, +Generator)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by adding
+   \c Generator to its generator system.
+   For a C polyhedron, \c Generator must be
+   a line, ray or point.</EM>
+
+<P><CODE>ppl_Polyhedron_add_constraints(
+                  +Handle,
+                  +Constraint_System)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by adding to its constraint system the constraints in
+   \c Constraint_System.
+   For a C polyhedron, \c Constraints must be a list of
+   equalities and non-strict inequalities.</EM>
+
+<P><CODE>ppl_Polyhedron_add_congruences(
+                  +Handle,
+                  +Congruence_System)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by adding to its congruence system the congruences in
+   \c Congruence_System.
+   For a C polyhedron, \c Congruences must be a list of
+   equalities.</EM>
+
+<P><CODE>ppl_Polyhedron_add_generators(
+                  +Handle,
+                  +Generator_System)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by adding to its generator system the generators in
+   \c Generator_System.
+   For a C polyhedron, \c Generators must be a list of
+   lines, rays and points.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_constraint(
+                  +Handle,
+                  +Constraint)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by refining its constraint system with
+   \c Constraint.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_congruence(
+                  +Handle,
+                  +Congruence)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by refining its congruence system with
+   \c Congruence.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_constraints(
+                  +Handle,
+                  +Constraint_System)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by refining its constraint system with
+   the constraints in \c Constraint_System.</EM>
+
+<P><CODE>ppl_Polyhedron_refine_with_congruences(
+                  +Handle,
+                  +Congruence_System)</CODE><BR>
+   <EM>Updates the polyhedron referenced by \c Handle to
+   one obtained by refining its congruence system with
+   the congruences in \c Congruence_System.</EM>
+
+
+<H3>Predicates that transform the polyhedron</H3>
+These predicates enable transformations
+such as taking the topological closure (which for the domain of
+C polyhedron is the identity transformation),
+unconstraining a specified dimension
+as explained in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Cylindrification, Cylindrification Operator}
+and several different image and preimage affine transfer relations;
+for details of the latter see Sections
+\extref{Images_and_Preimages_of_Affine_Transfer_Relations, Images and Preimages of Affine Transfer Relations}
+and
+\extref{Generalized_Affine_Relations, Generalized Affine Relations}
+<P><CODE>ppl_Polyhedron_topological_closure_assign(+Handle)</CODE><BR>
+  <EM>Assigns to the polyhedron referenced by \c Handle
+  its topological closure.</EM>
+
+<P><CODE>ppl_Polyhedron_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+  <EM>Modifies the polyhedron \p P referenced by \c Handle by unconstraining
+  the space dimension \c PPL_Var.</EM>
+
+<P><CODE>ppl_Polyhedron_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+  <EM>Modifies the polyhedron \p P referenced by \c Handle by unconstraining
+  the space dimensions that are specified in \c List_of_PPL_Var.
+  The presence of duplicates in \c List_of_PPL_Var is a waste
+  but an innocuous one.</EM>
+
+<P><CODE>ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coeff)</CODE><BR>
+   <EM>Transforms the polyhedron referenced by \c Handle
+   assigning the affine expression for \c Lin_Expr/\c Coeff to \c PPL_Var.</EM>
+
+<P><CODE>ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coeff)</CODE><BR>
+   <EM>Transforms the polyhedron referenced by \c Handle
+   substituting the affine expression for \c Lin_Expr/\c Coeff to \c PPL_Var.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_affine_image(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)</CODE><BR>
+  <EM>Assigns to polyhedron \p P referenced by \c Handle
+  the generalized image with respect to the
+  generalized affine transfer relation
+  \c Lin_Expr_1/Coeff
+    \f$\leq\f$ \c PPL_Var
+      \f$\leq\f$ \c Lin_Expr_2/Coeff.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_affine_preimage(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)</CODE><BR>
+  <EM>Assigns to polyhedron \p P referenced by \c Handle
+  the generalized preimage with respect to the
+  generalized affine transfer relation
+  \c Lin_Expr_1/Coeff
+    \f$\leq\f$ \c PPL_Var
+      \f$\leq\f$ \c Lin_Expr_2/Coeff.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_image(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)</CODE><BR>
+  <EM>Assigns to polyhedron \p P referenced by \c Handle
+  the generalized image with respect to the
+  generalized affine transfer relation
+   \c PPL_Var \f$\bowtie\f$ \c Lin_Expr/\c Coeff,
+   where \f$\bowtie\f$ is the symbol
+   represented by \c Relation_Symbol.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_preimage(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)</CODE><BR>
+  <EM>Assigns to polyhedron \p P referenced by \c Handle
+  the generalized preimage with respect to the
+  generalized affine transfer relation
+   \c PPL_Var \f$\bowtie\f$ \c Lin_Expr/\c Coeff,
+   where \f$\bowtie\f$ is the symbol
+   represented by \c Relation_Symbol.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+  <EM>Assigns to polyhedron \p P referenced by \c Handle
+  the generalized image with respect to the
+  generalized affine transfer relation
+   \c Lin_Expr_1 \f$\bowtie\f$ \c Lin_Expr_2,
+   where \f$\bowtie\f$ is the symbol
+   represented by \c Relation_Symbol.</EM>
+
+<P><CODE>ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+  <EM>Assigns to polyhedron \p P referenced by \c Handle
+  the generalized preimage with respect to the
+  generalized affine transfer relation
+   \c Lin_Expr_1 \f$\bowtie\f$ \c Lin_Expr_2,
+   where \f$\bowtie\f$ is the symbol
+   represented by \c Relation_Symbol.</EM>
+
+
+<H3>Predicates whose results depend on more than one polyhedron</H3>
+These predicates include the binary operators which will assign to the
+polyhedron referred to by the first argument
+its combination with the polyhedron referred to by the second argument
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Intersection_and_Convex_Polyhedral_Hull, Intersection and Convex Polyhedral Hull}
+and
+\extref{Convex_Polyhedral_Difference, Convex Polyhedral Difference};
+and a linear partitioning operator described below.
+
+<P><CODE>ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the intersection of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_upper_bound_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the upper bound of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_difference_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the difference of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the time elapse of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_poly_hull(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the poly-hull of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_poly_difference(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the poly-difference of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_upper_bound_assign_if_exact(+Handle_1, +Handle_2)</CODE><BR>
+    <EM>Succeeds if the least upper bound of the
+    polyhedron \p P_1 referenced by \c Handle_1
+    with the polyhedron referenced by \c Handle_2 is exact;
+    in which case the least upper bound is assigned
+    to \p P_1;
+    fails otherwise.</EM>
+
+<P><CODE>ppl_Polyhedron_poly_hull_assign_if_exact(+Handle_1, +Handle_2)</CODE><BR>
+    <EM>Succeeds if the least upper bound of the
+    polyhedron \p P_1 referenced by \c Handle_1
+    with the polyhedron referenced by \c Handle_2 is exact;
+    in which case the least upper bound is assigned
+    to \p P_1;
+    fails otherwise.</EM>
+
+<P><CODE>ppl_Polyhedron_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+    <EM>Succeeds if and only if the intersection of polyhedron \p P_1
+    referenced by \c Handle_1 and the polyhedron \p P_2 referenced by \c Handle_2
+    is non-empty.
+    Assigns to \p P_1 its meet-preserving simplification with
+    respect to \p P_2.</EM>
+
+<P><CODE>ppl_Polyhedron_linear_partition(+Handle_1, +Handle_2, -Handle_3,
+                                        -Handle_4)</CODE><BR>
+  <EM>\c Handle_1 and \c Handle_2 are handles for elements \p P_1 and \p P_2
+  in the Polyhedron domain. The predicate unifies handle
+  \c Handle_3 to a reference to the intersection of
+  \p P_1 and \p P_2 and \c Handle_4 to a reference to
+  a pointset powerset of nnc polyhedra \p P_4;
+  where \p P_4 is the linear partition of \p P_1 with respect to \p P_2.
+  This predicate is only provided if the
+  class \c Pointset_Powerset_NNC_Polyhedron
+  has been enabled when configuring the library.</EM>
+
+
+<H3>Predicates for widening and extrapolation</H3>
+In addition to the above binary operators, there are also a number
+of widening, extrapolation and narrowing operators
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Widening_Operators, Widening Operators},
+\extref{Widening_with_Tokens, Widening with Tokens} and
+\extref{Extrapolation_Operators, Extrapolation Operators}.
+Note that for all these widening and extrapolation predicates
+to behave as specified
+the polyhedron referred to by the second argument has to be
+contained in (or equal to) the polyhedron referred to by the first argument.
+
+<P><CODE>ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the BHRZ03-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the H79-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the BHRZ03-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the H79-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2.</EM>
+
+<P><CODE>ppl_Polyhedron_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<EM>Same as predicate <CODE>ppl_Polyhedron_H79_widening_assign_with_tokens</CODE>/4</EM>
+
+<P><CODE>ppl_Polyhedron_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<EM>Same as predicate <CODE>ppl_Polyhedron_H79_widening_assign</CODE>/2</EM>
+
+<P><CODE>ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the BHRZ03-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the BHRZ03-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the H79-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the H79-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+<P><CODE>ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the BHRZ03-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the BHRZ03-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.</EM>
+
+<P><CODE>ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the H79-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1.</EM>
+
+<P><CODE>ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P_1 referenced by \c Handle_1
+   the H79-widening of \p P_1 with the polyhedron
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1, further intersected with the smallest box containing \p P_1.</EM>
+
+
+<H2>Predicates that may modify the vector space</H2>
+These predicates enable the modification of the vector space
+of the polyhedron referred to in the first argument.
+<H3>Predicate for concatenation</H3>
+For more information on this operation, see Section
+\extref{Concatenating_Polyhedra, Concatenating Polyhedra},
+of the main \extref{preamble, PPL User Manual}.
+
+<P><CODE>ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the polyhedron \p P referenced by \c Handle_1
+   the concatenation of \p P and the polyhedron referenced by \c Handle_2.</EM>
+
+
+<H3>Predicates for mapping dimensions or changing the vector space</H3>
+These predicates enable the modification of the vector space
+of the polyhedron referred to in the first argument.
+These predicates enable the modification of the vector space
+of the polyhedron referred to in the first argument.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Adding_New_Dimensions_to_the_Vector_Space, Adding New Dimensions to the Vector Space},
+\extref{Removing_Dimensions_from_the_Vector_Space, Removing Dimensions from the Vector Space},
+\extref{Mapping_the_Dimensions_of_the_Vector_Space, Mapping the Dimensions of the Vector Space},
+\extref{expand_space_dimension, Expanding One Dimension of the Vector Space to Multiple Dimensions}
+and
+\extref{Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension, Folding Multiple Dimensions of the Vector Space into One Dimension}.
+
+<P><CODE>ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)</CODE><BR>
+  <EM>Adds \c Dimension_Type new dimensions to the space enclosing
+  the polyhedron \p P referenced by \c Handle
+  and and_embeds \p P in this space.</EM>
+
+<P><CODE>ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)</CODE><BR>
+  <EM>Adds \c Dimension_Type new dimensions to the space enclosing
+  the polyhedron \p P referenced by \c Handle
+  and and_projects \p P in this space.</EM>
+
+<P><CODE>ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+  <EM>Removes from the vector space enclosing
+  the polyhedron \p P referenced by \c Handle the space dimensions that
+  are specified in \c List_of_PPL_Var.  The presence
+  of duplicates in  \c List_of_PPL_Var is a waste but an innocuous one.</EM>
+
+<P><CODE>ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+  <EM>Removes the higher dimensions from the vector space enclosing
+  the polyhedron \p P referenced by \c Handle
+  so that, upon successful return, the new space dimension is
+  \c Dimension_Type.</EM>
+
+<P><CODE>ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+  <EM>Expands the \c  PPL_Var-th
+  dimension of the vector space enclosing
+  the polyhedron referenced by \c Handle to
+  \c Dimension_Type new space dimensions.</EM>
+
+<P><CODE>ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+  <EM>Modifies the polyhedron referenced by \c Handle
+  by folding the
+  space dimensions contained in \c List_of_PPL_Vars
+  into dimension \c PPL_Var.
+  The presence of duplicates in \c List_of_PPL_Vars is a waste
+  but an innocuous one.</EM>
+
+<P><CODE>ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+  <EM>Remaps the dimensions of the vector space according to a
+  partial function.
+  This function is specified by means of the \c P_Func,
+  which has \p n entries.
+  The result is undefined if \c P_Func does not encode a partial
+  function.</EM>
+
+
+\anchor other_domains_predicates
+<H1>Ad hoc Predicates for Other Domains</H1>
+<H2>Extra Predicates Specifically for the Pointset Powerset Domains</H2>
+  The powerset domains can be instantiated by taking as a base domain
+  any fixed semantic geometric description
+  (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+  An element of the powerset domain represents a disjunctive collection
+  of base objects (its disjuncts), all having the same space dimension.
+  For more information on this construct,
+  see Section \extref{The_Powerset_Domain, The Powerset Domain}
+  in the main \extref{preamble, PPL User Manual}.
+
+  Besides the predicates that are available in all semantic geometric
+  descriptions (whose documentation is not repeated here),
+  the powerset domain also provides several ad hoc predicates.
+  These are specified below, instantiated for the
+  PPL domain Pointset_Powerset_C_Polyhedron.
+  Note that predicates for other pointset powerset domains
+  will follow similar patterns.
+
+  <H3>Predicates for pointset powerset iterators and disjuncts.</H3>
+Iterators allow the user to examine and change individual elements
+(called here disjuncts) of a pointset powerset.
+Detailed descriptions for adding and removing disjuncts can be found in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Adding_a_Disjunct, Adding a Disjunct}.
+The following predicates support useful operations
+on these iterators and disjuncts via the usual handles.
+
+<P><CODE>ppl_new_Pointset_Powerset_C_Polyhedron_iterator_from_iterator(+Iterator_1, -Iterator_2)</CODE><BR>
+  <EM>Builds a new iterator \p it from the iterator referenced by
+  \c Iterator_1. <CODE>Iterator_2</CODE> is unified with the handle
+  for \p it.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_begin_iterator(+Handle, -Iterator)</CODE><BR>
+  <EM>Unifies \c Iterator with a handle to an iterator "pointing"
+  to the beginning of
+  the sequence of disjuncts of the powerset referred to by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_end_iterator(+Handle, -Iterator)</CODE><BR>
+  <EM>Unifies \c Iterator with a handle to an iterator "pointing"
+  to the end of
+  the sequence of disjuncts of the powerset referred to by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_equals_iterator(+Iterator_1, +Iterator_2)</CODE><BR>
+   <EM>Succeeds if and only if the iterator referenced by
+   \c Iterator_1 is equal to the iterator referenced by
+   \c Iterator_2.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_increment(+Iterator)</CODE><BR>
+  <EM>Increments the iterator referenced by \c Iterator
+  so that it "points" to the next disjunct.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_decrement(+Iterator)</CODE><BR>
+  <EM>Decrements the iterator referenced by \c Iterator
+  so that it "points" to the previous disjunct.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_iterator_get_disjunct(+Iterator, -Handle)</CODE><BR>
+  <EM>Unifies with \c Handle a reference to the disjunct referred
+  to by \c Iterator_1.</EM>
+
+<P><CODE>ppl_delete_Pointset_Powerset_C_Polyhedron_iterator(+Iterator)</CODE><BR>
+  <EM>Invalidates the handle referenced by <CODE>Iterator</CODE>:
+  this makes sure the corresponding resources
+  will eventually be released.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(+Handle_1, +Handle_2)</CODE><BR>
+  <EM>Adds to the pointset powerset referenced by \c Handle_1 a disjunct
+  referred to by \c Handle_2.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_drop_disjunct(+Handle, +Iterator)</CODE><BR>
+  <EM>If \p it is the iterator referred to by \c Iterator,
+  drops from the pointset powerset referenced by \c Handle
+  the disjunct pointed to by \p it and
+  assigns to \p it an iterator to the next disjunct.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_drop_disjuncts(+Handle, +Iterator_1, +Iterator_2)</CODE><BR>
+  <EM>If \p it_1 and \p it_2 are the iterators referred to by \c Iterator_1
+  and \c Iterator_2, respectively,
+  drops from the pointset powerset referenced by \c Handle
+   all the disjuncts from \p it_1 to \p it_2 (excluded).</EM>
+
+  <H3>Other Ad Hoc Predicates for the pointset powerset domains.</H3>
+Collected here are some other predicates that are specific to
+pointset powersets of C polyhedra;
+these provide operations for
+simplifying the powerset,
+geometric comparisons
+and widening and extrapolation.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Geometric_Comparisons, Geometric Comparisons},
+\extref{Certificate_Based_Widenings, Certificate-Based Widenings},
+\extref{Powerset_Extrapolation_Operators, Powerset Extrapolation Operators}.
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_pairwise_reduce(+Handle)</CODE><BR>
+   <EM>Assigns the result of pairwise reduction on
+   the pointset powerset referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_omega_reduce(+Handle)</CODE><BR>
+   <EM>Assigns the result of omega reduction on
+   the pointset powerset referenced by \c Handle.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_geometrically_covers_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the pointset powerset referenced by
+   \c Handle_2 geometrically covers
+   the pointset powerset referenced by \c Handle_1;
+   see Section \extref{Geometric_Comparisons, Geometric Comparisons}
+  in the main \extref{preamble, PPL User Manual}.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_geometrically_equals_Pointset_Powerset_C_Polyhedron(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the pointset powerset referenced by
+   \c Handle_2 geometrically equals
+   the pointset powerset referenced by \c Handle_1;
+   see Section \extref{Geometric_Comparisons, Geometric Comparisons}
+  in the main \extref{preamble, PPL User Manual}.</EM>
+
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BHZ03_BHRZ03_BHRZ03_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the pointset powerset \p P_1 referenced by
+   \c Handle_1 the \extref{pps_certificate_widening, BHZ03-widening}
+    between \p P_1 and the pointset powerset referenced by
+   \c Handle_2, using the BHRZ03-widening
+    certified by the convergence certificate for BHRZ03.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BHZ03_H79_H79_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the pointset powerset \p P_1 referenced by
+   \c Handle_1 the \extref{pps_certificate_widening, BHZ03-widening}
+    between \p P_1 and the pointset powerset referenced by
+   \c Handle_2, using the H79-widening
+    certified by the convergence certificate for H79.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BGP99_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)</CODE><BR>
+    <EM>Assigns to the pointset powerset \p P_1 referenced by
+   \c Handle_1 the result of applying the
+    \extref{pps_bgp99_extrapolation, BGP99 extrapolation operator}
+    between \p P_1 and the pointset powerset referenced by
+   \c Handle_2, using the BHRZ03-widening
+    and the cardinality threshold \c C_unsigned.</EM>
+
+<P><CODE>ppl_Pointset_Powerset_C_Polyhedron_BGP99_H79_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)</CODE><BR>
+    <EM>Assigns to the pointset powerset \p P_1 referenced by
+   \c Handle_1 the result of applying the
+    \extref{pps_bgp99_extrapolation, BGP99 extrapolation operator}
+    between \p P_1 and the pointset powerset referenced by
+   \c Handle_2, using the H79-widening
+    and the cardinality threshold \c C_unsigned.</EM>
+
+*/ /* \page domains_predicates */
diff --git a/interfaces/Prolog/SICStus/Makefile.am b/interfaces/Prolog/SICStus/Makefile.am
new file mode 100644
index 0000000..b70d47d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.am
@@ -0,0 +1,320 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+
+EXTRA_DIST = \
+ppl_interface_generator_sicstus_sd_cc.m4 \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl \
+sp_prolog_generated_test.pl
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_sicstus_sd_cc.m4
+
+ppl_sicstus_sd.cc: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@
+
+bin_PROGRAMS = ppl_sicstus
+ppl_sicstus_SOURCES =
+
+
+if ENABLE_SHARED
+
+pkgdata_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+
+ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la libppl_sicstus.la
+	$(LIBTOOL) --mode=link --tag=CXX \
+		splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+			$(srcdir)/ppl_sicstus.pl \
+			libppl_sicstus.la \
+			@extra_libraries@
+
+#			@required_instantiations_prolog_cxx_objects@
+
+install-data-local: ppl_sicstus.so
+	$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+	    ppl_sicstus.so $(DESTDIR)$(pkglibdir)/ppl_sicstus.so
+
+else !ENABLE_SHARED
+
+pkgdata_DATA = ppl_sicstus.pl
+
+endif !ENABLE_SHARED
+
+noinst_LTLIBRARIES = libppl_sicstus.la
+
+libppl_sicstus_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+sicstus_efli.hh \
+sicstus_efli.cc
+
+nodist_libppl_sicstus_la_SOURCES = \
+ppl_sicstus_sd.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_sicstus_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_sicstus_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_sicstus_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_sicstus_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la
+	$(LIBTOOL) --mode=link --tag=CXX \
+		spld --main=prolog \
+			--cflag=`echo '$(AM_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+			--resources=ppl_sicstus.s.o -o $@ \
+			$(top_builddir)/src/libppl.la \
+			@extra_libraries@
+
+if ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+	splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \
+		$(srcdir)/ppl_sicstus.pl \
+		ppl_sicstus_sd.o \
+		sicstus_efli.o \
+		ppl_prolog_common.o \
+		`echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\.lo/.o/g"`
+
+else !ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+	splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+		$(srcdir)/ppl_sicstus.pl \
+		.libs/ppl_sicstus_sd.o \
+		.libs/sicstus_efli.o \
+		.libs/ppl_prolog_common.o \
+		`echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\([^. ]*\)\.lo/.libs\/\1.o/g"`
+
+endif !ENABLE_STATIC
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+        --goal "main."  \
+			>obtained_pchk
+	rm -f pl_check.pl
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS) | pl_check_test
+	$(LIBTOOL) --mode=execute \
+	  -dlopen ../../../src/libppl.la \
+	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+	      <$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS) | clpq_test
+	$(LIBTOOL) --mode=execute \
+          -dlopen ../../../src/libppl.la \
+	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+	      <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: ppl_sicstus ppl_sicstus.pl sp_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		./ppl_sicstus -l $(srcdir)/sp_prolog_generated_test.pl \
+        --goal "main."  \
+			>obtained_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+CLEANFILES = \
+ppl_sicstus_sd.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_sicstus_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: check whether the dependencies from `libppl.la' in this Makefile.am
+# are actually required.
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/interfaces/Prolog/SICStus/Makefile.in b/interfaces/Prolog/SICStus/Makefile.in
new file mode 100644
index 0000000..18dce55
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.in
@@ -0,0 +1,1704 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl_sicstus$(EXEEXT)
+subdir = interfaces/Prolog/SICStus
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am_libppl_sicstus_la_OBJECTS = sicstus_efli.lo
+nodist_libppl_sicstus_la_OBJECTS = ppl_sicstus_sd.lo \
+	ppl_prolog_common.lo
+libppl_sicstus_la_OBJECTS = $(am_libppl_sicstus_la_OBJECTS) \
+	$(nodist_libppl_sicstus_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_sicstus_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_sicstus_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_sicstus_OBJECTS =
+ppl_sicstus_OBJECTS = $(am_ppl_sicstus_OBJECTS)
+ppl_sicstus_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_sicstus_la_SOURCES) \
+	$(nodist_libppl_sicstus_la_SOURCES) \
+	$(nodist_EXTRA_libppl_sicstus_la_SOURCES) \
+	$(ppl_sicstus_SOURCES)
+DIST_SOURCES = $(libppl_sicstus_la_SOURCES) $(ppl_sicstus_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+EXTRA_DIST = \
+ppl_interface_generator_sicstus_sd_cc.m4 \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl \
+sp_prolog_generated_test.pl
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_sicstus_sd_cc.m4
+
+ppl_sicstus_SOURCES = 
+ at ENABLE_SHARED_FALSE@pkgdata_DATA = ppl_sicstus.pl
+ at ENABLE_SHARED_TRUE@pkgdata_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+noinst_LTLIBRARIES = libppl_sicstus.la
+libppl_sicstus_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+sicstus_efli.hh \
+sicstus_efli.cc
+
+nodist_libppl_sicstus_la_SOURCES = \
+ppl_sicstus_sd.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_sicstus_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_sicstus_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_sicstus_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_sicstus_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_sicstus_sd.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_sicstus.la: $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_DEPENDENCIES) $(EXTRA_libppl_sicstus_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_sicstus_la_LINK)  $(libppl_sicstus_la_OBJECTS) $(libppl_sicstus_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_sicstus_sd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sicstus_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+	done
+
+uninstall-pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+ at ENABLE_SHARED_FALSE@install-data-local:
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+	clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-data-local install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-pkgdataDATA install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS uninstall-pkgdataDATA
+
+
+ppl_sicstus_sd.cc: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_sicstus_sd_cc.m4 > $@
+
+ at ENABLE_SHARED_TRUE@ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la libppl_sicstus.la
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=link --tag=CXX \
+ at ENABLE_SHARED_TRUE@		splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at ENABLE_SHARED_TRUE@			$(srcdir)/ppl_sicstus.pl \
+ at ENABLE_SHARED_TRUE@			libppl_sicstus.la \
+ at ENABLE_SHARED_TRUE@			@extra_libraries@
+
+#			@required_instantiations_prolog_cxx_objects@
+
+ at ENABLE_SHARED_TRUE@install-data-local: ppl_sicstus.so
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+ at ENABLE_SHARED_TRUE@	    ppl_sicstus.so $(DESTDIR)$(pkglibdir)/ppl_sicstus.so
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la
+	$(LIBTOOL) --mode=link --tag=CXX \
+		spld --main=prolog \
+			--cflag=`echo '$(AM_CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+			--resources=ppl_sicstus.s.o -o $@ \
+			$(top_builddir)/src/libppl.la \
+			@extra_libraries@
+
+ at ENABLE_STATIC_TRUE@ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ at ENABLE_STATIC_TRUE@	splfr --static --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at ENABLE_STATIC_TRUE@		$(srcdir)/ppl_sicstus.pl \
+ at ENABLE_STATIC_TRUE@		ppl_sicstus_sd.o \
+ at ENABLE_STATIC_TRUE@		sicstus_efli.o \
+ at ENABLE_STATIC_TRUE@		ppl_prolog_common.o \
+ at ENABLE_STATIC_TRUE@		`echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\.lo/.o/g"`
+
+ at ENABLE_STATIC_FALSE@ppl_sicstus.s.o: ppl_sicstus.pl libppl_sicstus.la
+ at ENABLE_STATIC_FALSE@	splfr --cflag="$(AM_CPPFLAGS)" -o $@ \
+ at ENABLE_STATIC_FALSE@		$(srcdir)/ppl_sicstus.pl \
+ at ENABLE_STATIC_FALSE@		.libs/ppl_sicstus_sd.o \
+ at ENABLE_STATIC_FALSE@		.libs/sicstus_efli.o \
+ at ENABLE_STATIC_FALSE@		.libs/ppl_prolog_common.o \
+ at ENABLE_STATIC_FALSE@		`echo @required_instantiations_prolog_cxx_objects@ | $(SED) -e "s/\([^. ]*\)\.lo/.libs\/\1.o/g"`
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+        --goal "main."  \
+			>obtained_pchk
+	rm -f pl_check.pl
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS) | pl_check_test
+	$(LIBTOOL) --mode=execute \
+	  -dlopen ../../../src/libppl.la \
+	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+	      <$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+# FIXME: the last prerequisite is to get around a bug of `spld': see
+# http://www.cs.unipr.it/pipermail/ppl-devel/2006-January/007610.html
+clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS) | clpq_test
+	$(LIBTOOL) --mode=execute \
+          -dlopen ../../../src/libppl.la \
+	  ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+	    --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+	      <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: ppl_sicstus ppl_sicstus.pl sp_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		./ppl_sicstus -l $(srcdir)/sp_prolog_generated_test.pl \
+        --goal "main."  \
+			>obtained_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_sicstus_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# FIXME: check whether the dependencies from `libppl.la' in this Makefile.am
+# are actually required.
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4 b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
new file mode 100644
index 0000000..fe06db1
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_interface_generator_sicstus_sd_cc.m4
@@ -0,0 +1,250 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_sicstus_sd.cc.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include common macros for generating system dependent code.
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+
+m4_divert`'dnl
+/* SICStus Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define SP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref /* goal */, void*) { \
+  return name(); \
+}
+
+#define SP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  return name(arg1); \
+}
+
+#define SP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2); \
+}
+
+#define SP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3); \
+}
+
+#define SP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4); \
+}
+
+#define SP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define SP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(6, goal, arg6)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+#define SP_STUB_7(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(6, goal, arg6)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg7 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(7, goal, arg7)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
+}
+
+#define SP_STUB_8(name) \
+extern "C" Prolog_foreign_return_type \
+sp_stub_##name(Prolog_term_ref goal, void*) { \
+  Prolog_term_ref arg1 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(1, goal, arg1)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg2 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(2, goal, arg2)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg3 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(3, goal, arg3)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg4 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(4, goal, arg4)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg5 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(5, goal, arg5)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg6 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(6, goal, arg6)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg7 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(7, goal, arg7)) \
+    return PROLOG_FAILURE; \
+  Prolog_term_ref arg8 = Prolog_new_term_ref(); \
+  if (!Prolog_get_arg(8, goal, arg8)) \
+    return PROLOG_FAILURE; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
+}
+
+m4_divert(1)
+#define SP_DEFINE_C_PREDICATE(name, arity) \
+  SP_define_c_predicate(#name, arity, "user", sp_stub_##name, NULL)
+
+extern "C" void
+ppl_sicstus_init(int /* when */) {
+  ppl_initialize();
+  for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i) {
+    if (SP_register_atom(*prolog_interface_atoms[i].p_atom) == 0) {
+      Prolog_term_ref et = Prolog_new_term_ref();
+      Prolog_put_atom_chars(et, "Cannot initialize the PPL interface");
+      Prolog_raise_exception(et);
+      return;
+    }
+  }
+m4_divert(2)dnl
+}
+
+extern "C" void
+ppl_sicstus_deinit(int /* when */) {
+  for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i)
+    // SP_unregister_atom can fail.
+    // We ignore such failures: what else can we do?
+    (void) SP_unregister_atom(*prolog_interface_atoms[i].p_atom);
+  ppl_finalize();
+}
+dnl
+m4_divert`'dnl
+dnl
+dnl Redefine m4_expanded_procedure_schema to generate SICStus stubs.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+SP_STUB_$2($1)
+')dnl
+dnl Generate stubs.
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)`'dnl
+m4_divert(-1)
+
+dnl Redefine m4_extension to generate SICStus user predicates.
+dnl m4_extension(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+  SP_DEFINE_C_PREDICATE($1, $2);
+')
+
+dnl Generate user predicates.
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..996977e
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for SICStus Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "sicstus_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::SICStus;
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus.pl b/interfaces/Prolog/SICStus/ppl_sicstus.pl
new file mode 100644
index 0000000..0f43913
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_sicstus.pl
@@ -0,0 +1,30 @@
+/* Loader for the SICStus Prolog interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+foreign_resource(ppl_sicstus,
+[
+        init(ppl_sicstus_init),
+        deinit(ppl_sicstus_deinit)
+]).
+
+:- load_foreign_resource(ppl_sicstus).
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.cc b/interfaces/Prolog/SICStus/sicstus_cfli.cc
new file mode 100644
index 0000000..0ad4b28
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.cc
@@ -0,0 +1,28 @@
+/* SICStus Prolog Common Foreign Language Interface: implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "sicstus_cfli.h"
+
+#ifndef PCFLI_EXTERN_INLINE
+#include "sicstus_cfli.ic"
+#endif
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.h b/interfaces/Prolog/SICStus/sicstus_cfli.h
new file mode 100644
index 0000000..0ec2027
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.h
@@ -0,0 +1,156 @@
+/* SICStus Prolog Common Foreign Language Interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_sicstus_cfli_h
+#define PCFLI_sicstus_cfli_h 1
+
+#include <sicstus/sicstus.h>
+
+#ifdef __GNUC__
+# define PCFLI_EXTERN_INLINE extern __inline__
+# define PCFLI_INLINE_PROTOTYPES 1
+#endif
+
+#if defined(__cplusplus) && !defined(PCFLI_EXTERN_INLINE)
+# define PCFLI_EXTERN_INLINE inline
+#endif
+
+#ifdef PCFLI_EXTERN_INLINE
+# ifndef PCFLI_INLINE_PROTOTYPES
+#  define PCFLI_INLINE_PROTOTYPES 0
+# endif
+#else
+# define PCFLI_INLINE_PROTOTYPES 1
+#endif
+
+/* Temporary. */
+#define PCFLI_DECLSPEC
+
+#ifdef __cplusplus
+//extern "C" {
+#endif
+
+typedef SP_term_ref Prolog_term_ref;
+typedef SP_atom Prolog_atom;
+typedef int Prolog_foreign_return_type;
+
+static const Prolog_foreign_return_type PROLOG_SUCCESS = SP_SUCCESS;
+static const Prolog_foreign_return_type PROLOG_FAILURE = SP_FAILURE;
+
+#if PCFLI_INLINE_PROTOTYPES
+
+PCFLI_DECLSPEC Prolog_term_ref
+Prolog_new_term_ref();
+
+PCFLI_DECLSPEC int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u);
+
+PCFLI_DECLSPEC int
+Prolog_put_long(Prolog_term_ref t, long i);
+
+PCFLI_DECLSPEC int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s);
+
+PCFLI_DECLSPEC int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a);
+
+PCFLI_DECLSPEC int
+Prolog_put_address(Prolog_term_ref t, void* p);
+
+Prolog_atom
+Prolog_atom_from_string(const char* s);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3);
+
+PCFLI_DECLSPEC int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4);
+
+PCFLI_DECLSPEC int
+Prolog_construct_cons(Prolog_term_ref c,
+                      Prolog_term_ref h, Prolog_term_ref t);
+
+PCFLI_DECLSPEC void
+Prolog_raise_exception(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_variable(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_atom(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_integer(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_address(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_compound(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_is_cons(Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_get_long(Prolog_term_ref t, long& v);
+
+PCFLI_DECLSPEC int
+Prolog_get_address(Prolog_term_ref t, void*& p);
+
+PCFLI_DECLSPEC int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom& name);
+
+PCFLI_DECLSPEC int
+Prolog_get_compound_name_arity(Prolog_term_ref t,
+                               Prolog_atom& name, int& arity);
+
+PCFLI_DECLSPEC int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a);
+
+PCFLI_DECLSPEC int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t);
+
+PCFLI_DECLSPEC int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u);
+
+#endif /* !PCFLI_INLINE_PROTOTYPES */
+
+#include "sicstus_cfli.ic"
+
+#ifdef __cplusplus
+//} /* extern "C" */
+#endif
+
+#endif // !defined(PCFLI_sicstus_cfli_h)
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.ic b/interfaces/Prolog/SICStus/sicstus_cfli.ic
new file mode 100644
index 0000000..56101c9
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.ic
@@ -0,0 +1,300 @@
+/* SICStus Common Foreign Language Interface: definitions. -*- C -*-
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <assert.h>
+#include <limits.h>
+
+/*!
+  Return a new term reference.
+*/
+PCFLI_EXTERN_INLINE Prolog_term_ref
+Prolog_new_term_ref() {
+  return SP_new_term_ref();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+  return SP_put_term(t, u);
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_long(Prolog_term_ref t, long l) {
+  return SP_put_integer(t, l);
+}
+
+static int
+Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
+  static unsigned char uc_buffer[sizeof(unsigned long) + 1];
+  static unsigned n;
+#if PPL_SIZEOF_LONG_LONG > PPL_SIZEOF_LONG
+  static long long ll_buffer;
+#endif
+
+#if PPL_SIZEOF_LONG_LONG > PPL_SIZEOF_LONG
+  ll_buffer = ul;
+  if (SP_put_integer_bytes(t, &ll_buffer, sizeof(ll_buffer), 1))
+    return 1;
+#endif
+  n = 0;
+  do {
+    uc_buffer[n++] = ul & 0xff;
+    ul >>= 8;
+  } while (ul);
+  if (uc_buffer[n-1] & 0x80)
+    uc_buffer[n++] = 0;
+  return SP_put_integer_bytes(t, &uc_buffer, n, 0);
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+  return
+    (ul <= LONG_MAX)
+    ? SP_put_integer(t, (long) ul)
+    : Prolog_put_big_ulong(t, ul);
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+  return SP_put_string(t, s);
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+  return SP_put_atom(t, a);
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+  return SP_put_address(t, p);
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+PCFLI_EXTERN_INLINE Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return SP_atom_from_string(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1) {
+  return SP_cons_functor(t, f, 1, a1);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2) {
+  return SP_cons_functor(t, f, 2, a1, a2);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3) {
+  return SP_cons_functor(t, f, 3, a1, a2, a3);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4) {
+  return SP_cons_functor(t, f, 4, a1, a2, a3, a4);
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_construct_cons(Prolog_term_ref c,
+                      Prolog_term_ref h, Prolog_term_ref t) {
+  return SP_cons_list(c, h, t);
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+PCFLI_EXTERN_INLINE void
+Prolog_raise_exception(Prolog_term_ref t) {
+  SP_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_variable(Prolog_term_ref t) {
+  return SP_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_atom(Prolog_term_ref t) {
+  return SP_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_integer(Prolog_term_ref t) {
+  return SP_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_address(Prolog_term_ref t) {
+  return SP_is_integer(t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_compound(Prolog_term_ref t) {
+  return SP_is_compound(t);
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_is_cons(Prolog_term_ref t) {
+  return SP_is_list(t);
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  return SP_get_integer(t, lp);
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into to \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  return SP_get_address(t, vpp);
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  return SP_get_atom(t, ap);
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  return SP_get_functor(t, ap, ip);
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+  assert(Prolog_is_compound(t));
+  return SP_get_arg(i, t, a);
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+  assert(Prolog_is_cons(c));
+  return SP_get_list(c, h, t);
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+PCFLI_EXTERN_INLINE int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return SP_unify(t, u);
+}
diff --git a/interfaces/Prolog/SICStus/sicstus_efli.cc b/interfaces/Prolog/SICStus/sicstus_efli.cc
new file mode 100644
index 0000000..39d6827
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_efli.cc
@@ -0,0 +1,108 @@
+/* SICStus Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "sicstus_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SICStus {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(SP_is_integer(t));
+  long v;
+  if (SP_get_integer(t, &v) == SP_SUCCESS)
+    n = v;
+  else {
+#if SICSTUS_MAJOR_VERSION == 3
+    char* s;
+    if (SP_get_number_chars(t, &s) == SP_SUCCESS)
+      n = Coefficient(s);
+    else
+      return SP_FAILURE;
+#else
+    const char* s;
+    if (SP_get_number_codes(t, &s) == SP_SUCCESS)
+      n = Coefficient(s);
+    else
+      return SP_FAILURE;
+#endif
+  }
+  return SP_SUCCESS;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  long l = 0;
+  Result r = assign_r(l, n, ROUND_IGNORE);
+  if (!result_overflow(r))
+    return SP_put_integer(t, l);
+  else {
+    std::ostringstream s;
+    s << n;
+    std::string str = s.str();
+#if SICSTUS_MAJOR_VERSION == 3
+    return SP_put_number_chars(t, str.c_str());
+#else
+    return SP_put_number_codes(t, str.c_str());
+#endif
+  }
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  if (Prolog_put_Coefficient(u, n) == SP_SUCCESS)
+    return SP_unify(t, u);
+  else
+    return SP_FAILURE;
+}
+
+} // namespace SICStus
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/SICStus/sicstus_efli.hh b/interfaces/Prolog/SICStus/sicstus_efli.hh
new file mode 100644
index 0000000..df4bc32
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_efli.hh
@@ -0,0 +1,92 @@
+/* SICStus Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_sicstus_efli_hh
+#define PPL_sicstus_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "sicstus_cfli.h"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SICStus {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace SICStus
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_sicstus_efli_hh)
diff --git a/interfaces/Prolog/SICStus/sp_clpq.pl b/interfaces/Prolog/SICStus/sp_clpq.pl
new file mode 100644
index 0000000..abfcfa0
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_clpq.pl
@@ -0,0 +1,44 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+        prolog_flag(version, V),
+        atom_codes(V, VList),
+        VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+        (N is "4" ->
+            true
+        ;
+            set_prolog_flag(language, iso),
+            use_module(library(lists), [append/3, member/2])
+        ).
+
+eat_eol :-
+        get_code(user_input, _EOL).
+
+main(CLPQ) :-
+        version_dependent_declarations,
+        ensure_loaded(CLPQ),
+        set_prolog_flag(fileerrors, off),
+        common_main.
diff --git a/interfaces/Prolog/SICStus/sp_pl_check.pl b/interfaces/Prolog/SICStus/sp_pl_check.pl
new file mode 100644
index 0000000..73f6ff3
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_pl_check.pl
@@ -0,0 +1,49 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+        prolog_flag(version, V),
+        atom_codes(V, VList),
+        VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+        (N is "4" ->
+            true
+        ;
+            set_prolog_flag(language, iso),
+            use_module(library(lists), [append/3, member/2])
+        ).
+
+main :-
+        version_dependent_declarations,
+        ensure_loaded('pl_check.pl'),
+        set_prolog_flag(fileerrors, off),
+        (check_all ->
+            write('OK')
+        ;
+            write('FAILURE')
+        ),
+        nl,
+        halt.
diff --git a/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl b/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl
new file mode 100644
index 0000000..56171e8
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_prolog_generated_test.pl
@@ -0,0 +1,49 @@
+/* Main program for the PPL/SICStus-Prolog generated tests.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+
+version_dependent_declarations :-
+        prolog_flag(version, V),
+        atom_codes(V, VList),
+        VList = [_S, _I, _C, _S, _t, _u, _s, _, N|_],
+        (N is "4" ->
+            true
+        ;
+            set_prolog_flag(language, iso),
+            use_module(library(lists), [append/3, member/2])
+        ).
+
+main :-
+        version_dependent_declarations,
+        ensure_loaded('ppl_prolog_generated_test_main.pl'),
+        set_prolog_flag(fileerrors, off),
+        (check_all ->
+            write('OK')
+        ;
+            write('FAILURE')
+        ),
+        nl,
+        halt.
diff --git a/interfaces/Prolog/SWI/Makefile.am b/interfaces/Prolog/SWI/Makefile.am
new file mode 100644
index 0000000..e522422
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.am
@@ -0,0 +1,332 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+SWI_CFLI_FILES = swi_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_swiprolog_cc.m4 \
+$(SWI_CFLI_FILES) \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl \
+swi_prolog_generated_test.pl \
+README.swiprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_swiprolog_cc.m4
+
+ppl_swiprolog.cc: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_swiprolog_cc.m4 > $@
+
+pkglib_LTLIBRARIES = libppl_swiprolog.la
+
+libppl_swiprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+swi_efli.hh \
+swi_efli.cc
+
+nodist_libppl_swiprolog_la_SOURCES = \
+ppl_swiprolog.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_swiprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_swiprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@ \
+$(SWI_PROLOG_LD_OPTIONS)
+
+libppl_swiprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_swiprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_swiprolog.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+check_PROGRAMS = ppl_pl pl_clpq pl_clpq2
+pl_clpq_SOURCES = pl_clpq.cc
+pl_clpq2_SOURCES = pl_clpq.cc
+
+if HOST_OS_CYGWIN
+
+# Under Cygwin, $(SWI_PROLOG_LD) gets the link options wrong:
+# -lpl (PLLIB) comes before -lppl_swiprolog, with the result that all
+# the symbols of the SWI-Prolog foreign interface are undefined.
+# Repeating the link options works around this problem.
+EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS)
+
+endif HOST_OS_CYGWIN
+
+# Note: since `libppl_swiprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'.  Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+if ENABLE_STATIC
+
+LIBPPL_SWIPROLOG_LINK_OPTIONS = .libs/libppl_swiprolog.a
+
+else !ENABLE_STATIC
+
+LIBPPL_SWIPROLOG_LINK_OPTIONS = -L.libs -lppl_swiprolog
+
+endif !ENABLE_STATIC
+
+# Apart from the internal testing purposes, `ppl_pl' only makes
+# sense when shared libraries are disabled.
+if !ENABLE_SHARED
+bin_PROGRAMS = ppl_pl
+endif !ENABLE_SHARED
+
+ppl_pl_SOURCES = ppl_pl.cc
+
+
+ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o
+	$(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc "$(CC)" -c++ "$(CXX)" -ld "$(CXX)" \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) ppl_pl.o \
+		-L$(top_builddir)/src/.libs \
+		-lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl
+	$(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq.pl \
+		-L$(top_builddir)/src/.libs \
+		-lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+
+pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl
+	$(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq2.pl \
+		-L$(top_builddir)/src/.libs \
+		-lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+                $(CHECKER) ./ppl_pl < script_pchk
+	rm -f pl_check.pl
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+		$(CHECKER) ./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+		$(CHECKER) ./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: swi_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/ppl_prolog_generated_test_common.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	echo "ensure_loaded('$(srcdir)/swi_prolog_generated_test'). main." > script_pgt
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+                $(CHECKER) ./ppl_pl <script_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+CLEANFILES = \
+ppl_swiprolog.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_swiprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/SWI/Makefile.in b/interfaces/Prolog/SWI/Makefile.in
new file mode 100644
index 0000000..c2961ae
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.in
@@ -0,0 +1,1750 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = ppl_pl$(EXEEXT) pl_clpq$(EXEEXT) pl_clpq2$(EXEEXT)
+ at ENABLE_SHARED_FALSE@bin_PROGRAMS = ppl_pl$(EXEEXT)
+subdir = interfaces/Prolog/SWI
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libppl_swiprolog_la_OBJECTS = swi_efli.lo
+nodist_libppl_swiprolog_la_OBJECTS = ppl_swiprolog.lo \
+	ppl_prolog_common.lo
+libppl_swiprolog_la_OBJECTS = $(am_libppl_swiprolog_la_OBJECTS) \
+	$(nodist_libppl_swiprolog_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_swiprolog_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_swiprolog_la_LDFLAGS) \
+	$(LDFLAGS) -o $@
+PROGRAMS = $(bin_PROGRAMS)
+am_pl_clpq_OBJECTS = pl_clpq.$(OBJEXT)
+pl_clpq_OBJECTS = $(am_pl_clpq_OBJECTS)
+pl_clpq_LDADD = $(LDADD)
+am_pl_clpq2_OBJECTS = pl_clpq.$(OBJEXT)
+pl_clpq2_OBJECTS = $(am_pl_clpq2_OBJECTS)
+pl_clpq2_LDADD = $(LDADD)
+am_ppl_pl_OBJECTS = ppl_pl.$(OBJEXT)
+ppl_pl_OBJECTS = $(am_ppl_pl_OBJECTS)
+ppl_pl_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_swiprolog_la_SOURCES) \
+	$(nodist_libppl_swiprolog_la_SOURCES) \
+	$(nodist_EXTRA_libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+	$(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
+DIST_SOURCES = $(libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+	$(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+SWI_CFLI_FILES = swi_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_swiprolog_cc.m4 \
+$(SWI_CFLI_FILES) \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl \
+swi_prolog_generated_test.pl \
+README.swiprolog
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_swiprolog_cc.m4
+
+pkglib_LTLIBRARIES = libppl_swiprolog.la
+libppl_swiprolog_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+swi_efli.hh \
+swi_efli.cc
+
+nodist_libppl_swiprolog_la_SOURCES = \
+ppl_swiprolog.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_libppl_swiprolog_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_swiprolog_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@ \
+$(SWI_PROLOG_LD_OPTIONS)
+
+libppl_swiprolog_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_swiprolog_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_swiprolog.pl
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+pl_clpq_SOURCES = pl_clpq.cc
+pl_clpq2_SOURCES = pl_clpq.cc
+
+# Under Cygwin, $(SWI_PROLOG_LD) gets the link options wrong:
+# -lpl (PLLIB) comes before -lppl_swiprolog, with the result that all
+# the symbols of the SWI-Prolog foreign interface are undefined.
+# Repeating the link options works around this problem.
+ at HOST_OS_CYGWIN_TRUE@EXTRA_LINK_OPTIONS = $(SWI_PROLOG_LD_OPTIONS)
+ at ENABLE_STATIC_FALSE@LIBPPL_SWIPROLOG_LINK_OPTIONS = -L.libs -lppl_swiprolog
+
+# Note: since `libppl_swiprolog' is a pkglib, we prefer statically
+# linking it into `ppl_pl'.  Otherwise `ppl_pl' would not work unless
+# the user instructs the dynamic linker to look into the pkglib
+# directory.
+ at ENABLE_STATIC_TRUE@LIBPPL_SWIPROLOG_LINK_OPTIONS = .libs/libppl_swiprolog.a
+ppl_pl_SOURCES = ppl_pl.cc
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_swiprolog.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS) \
+script_pchk script_pgt
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+	}
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_swiprolog.la: $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_DEPENDENCIES) $(EXTRA_libppl_swiprolog_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_swiprolog_la_LINK) -rpath $(pkglibdir) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pl_clpq.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_pl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_swiprolog.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swi_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+	done
+
+uninstall-pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool clean-pkglibLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA \
+	uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+	clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool clean-pkglibLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-pkgdataDATA install-pkglibLTLIBRARIES \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-pkgdataDATA uninstall-pkglibLTLIBRARIES
+
+
+ppl_swiprolog.cc: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_swiprolog_cc.m4 > $@
+
+ppl_pl$(EXEEXT): libppl_swiprolog.la ppl_pl.o
+	$(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc "$(CC)" -c++ "$(CXX)" -ld "$(CXX)" \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) ppl_pl.o \
+		-L$(top_builddir)/src/.libs \
+		-lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+pl_clpq$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq.pl
+	$(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq.pl \
+		-L$(top_builddir)/src/.libs \
+		-lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+pl_clpq2$(EXEEXT): libppl_swiprolog.la pl_clpq.o pl_clpq.pl ../tests/clpq2.pl
+	$(SWI_PROLOG_LD) -pl $(SWI_PROLOG) -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+		-ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " "/"` \
+		-o $@ $(LIBPPL_SWIPROLOG_LINK_OPTIONS) pl_clpq.o \
+                $(srcdir)/pl_clpq.pl $(srcdir)/../tests/clpq2.pl \
+		-L$(top_builddir)/src/.libs \
+		-lppl @extra_libraries@ $(EXTRA_LINK_OPTIONS)
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+                $(CHECKER) ./ppl_pl < script_pchk
+	rm -f pl_check.pl
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+		$(CHECKER) ./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+		$(CHECKER) ./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: swi_prolog_generated_test.pl ../tests/ppl_prolog_generated_test_main.pl ../tests/ppl_prolog_generated_test_common.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	echo "ensure_loaded('$(srcdir)/swi_prolog_generated_test'). main." > script_pgt
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen libppl_swiprolog.la \
+                $(CHECKER) ./ppl_pl <script_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_swiprolog_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/SWI/README.swiprolog b/interfaces/Prolog/SWI/README.swiprolog
new file mode 100644
index 0000000..d3c5a7c
--- /dev/null
+++ b/interfaces/Prolog/SWI/README.swiprolog
@@ -0,0 +1,50 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The SWI-Prolog interface to the Parma Polyhedra Library (PPL) is
+available both as a statically linked module or as a dynamically
+linked one.  Only SWI-Prolog version 5.6.0 and later versions are
+supported.
+
+
+The `ppl_pl' Executable
+-----------------------
+
+The `ppl_pl' executable is simply the SWI-Prolog shell with the PPL
+statically linked: from within `ppl_pl' all the services of the
+library are available without further action.
+Notice that, in case the PPL was configured with the
+`--disable-static' option, in order to use `ppl_pl' you must make sure
+your linker looks into the `<prefix>/lib/ppl' directory, where
+<prefix> is the root of your installation (`/usr' or `/usr/local' in
+most cases).
+
+
+Loading the SWI-Prolog Interface Dynamically
+--------------------------------------------
+
+In order to dynamically load the library from SWI-Prolog you should
+simply load `<prefix>/lib/ppl/ppl_swiprolog.pl'.
+This will invoke `ppl_initialize/0' and `ppl_finalize/0'
+automatically.  Alternatively, you can load the library directly with
+
+    :- load_foreign_library('<prefix>/lib/ppl/libppl_swiprolog.so').
+
+This will call `ppl_initialize/0' automatically.  Analogously,
+
+    :- unload_foreign_library('<prefix>/lib/ppl/libppl_swiprolog.so').
+
+will, as part of the unload process, invoke `ppl_finalize/0'.
+
+Notice that, for dynamic linking to work, you should have configured
+the library with the `--enable-shared' option (on most platforms this
+is the default).
diff --git a/interfaces/Prolog/SWI/pl_clpq.cc b/interfaces/Prolog/SWI/pl_clpq.cc
new file mode 100644
index 0000000..04fd85c
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.cc
@@ -0,0 +1,48 @@
+/* C++ main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int, char** argv) {
+#if PLVERSION > 50643
+  // Tell SWI-Prolog not to fiddle with GMP allocation functions.
+  PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE);
+#endif
+
+  char* pl_args[2];
+  pl_args[0] = argv[0];
+  pl_args[1] = 0;
+  if (!PL_initialise(1, pl_args))
+    PL_halt(1);
+
+  install();
+  predicate_t pred = PL_predicate("main", 0, "user");
+  term_t h0 = PL_new_term_refs(0);
+  int ret_val = PL_call_predicate(0, PL_Q_NORMAL, pred, h0);
+  uninstall();
+  PL_halt(ret_val ? 0 : 1);
+}
diff --git a/interfaces/Prolog/SWI/pl_clpq.pl b/interfaces/Prolog/SWI/pl_clpq.pl
new file mode 100644
index 0000000..246ddfe
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.pl
@@ -0,0 +1,33 @@
+/* Prolog main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+eat_eol.
+
+main :-
+  % FIXME: clearing the prompt as it is done here is a temporary workaround.
+  % In SWI-Prolog versions up to and including 5.4.1, the prompt is written
+  % to the output stream even if it is not connected to an actual terminal.
+  % See http://www.cs.unipr.it/pipermail/ppl-devel/2004-October/005078.html.
+  prompt(Old_Prompt, ''),
+  common_main,
+  prompt(_, Old_Prompt).
diff --git a/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
new file mode 100644
index 0000000..fa71c76
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
@@ -0,0 +1,72 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_swiprolog.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* SWI-Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
+
+namespace {
+
+PL_extension predicates[] = {
+m4_divert(1)dnl
+  { NULL, 0, NULL, 0 }
+};
+
+} // namespace
+
+extern "C" install_t
+install() {
+  ppl_initialize();
+  PL_register_extensions(predicates);
+}
+
+extern "C" install_t
+uninstall() {
+  ppl_finalize();
+}
+m4_divert(-1)
+dnl Include common macros for generating system dependent code.
+dnl
+dnl Redefine m4_expanded_procedure_schema as useful for SWI-Prolog.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+dnl Note: SPACES is just a marker to generated the two spaces of
+dnl indentation following it.
+m4_define(`m4_expanded_procedure_schema', `dnl
+SPACES  PL_EXTENSION_ENTRY($1, $2)
+')
+
+dnl Now remove the marker SPACES.
+m4_divert`'dnl
+m4_patsubst(ppl_prolog_sys_code, SPACES, `')dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/SWI/ppl_pl.cc b/interfaces/Prolog/SWI/ppl_pl.cc
new file mode 100644
index 0000000..a2d279a
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_pl.cc
@@ -0,0 +1,44 @@
+/* Main program for SWI-Prolog with the PPL statically linked.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int argc, char **argv) {
+#if PLVERSION > 50643
+  // Tell SWI-Prolog not to fiddle with GMP allocation functions.
+  PL_action(PL_GMP_SET_ALLOC_FUNCTIONS, FALSE);
+#endif
+
+  if (!PL_initialise(argc, argv))
+    PL_halt(1);
+  PL_install_readline();
+
+  install();
+  int ret_val = PL_toplevel();
+  uninstall();
+  PL_halt(ret_val ? 0 : 1);
+}
diff --git a/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..0830c7d
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for SWI Prolog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "swi_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::SWI;
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.pl b/interfaces/Prolog/SWI/ppl_swiprolog.pl
new file mode 100644
index 0000000..4c19beb
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.pl
@@ -0,0 +1,24 @@
+/* Loader for the SWI-Prolog interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- load_foreign_library('libppl_swiprolog').
diff --git a/interfaces/Prolog/SWI/swi_cfli.hh b/interfaces/Prolog/SWI/swi_cfli.hh
new file mode 100644
index 0000000..4fe3071
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_cfli.hh
@@ -0,0 +1,376 @@
+/* SWI-Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_swi_cfli_hh
+#define PCFLI_swi_cfli_hh 1
+
+/* Include gmp.h before SWI-Prolog.h.  This is required in order to
+   get access to interface functions dealing with GMP numbers and
+   SWI-Prolog terms.  */
+#include <gmp.h>
+#include <SWI-Prolog.h>
+#include <cassert>
+#include <climits>
+
+typedef term_t Prolog_term_ref;
+typedef atom_t Prolog_atom;
+typedef foreign_t Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return PL_new_term_ref();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref t, Prolog_term_ref u) {
+#if PLVERSION >= 50800
+  return PL_put_term(t, u);
+#else
+  PL_put_term(t, u);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref t, long l) {
+#if PLVERSION >= 50800
+  return PL_put_integer(t, l);
+#else
+  PL_put_integer(t, l);
+  return 1;
+#endif
+}
+
+static int tmp_mpz_t_initialized = 0;
+static mpz_t tmp_mpz_t;
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+static int
+Prolog_put_big_ulong(Prolog_term_ref t, unsigned long ul) {
+  assert(ul > LONG_MAX && ul > (uint64_t) INT64_MAX);
+  if (!tmp_mpz_t_initialized) {
+    mpz_init_set_ui(tmp_mpz_t, ul);
+    tmp_mpz_t_initialized = 1;
+  }
+  else
+    mpz_set_ui(tmp_mpz_t, ul);
+  return PL_unify_mpz(t, tmp_mpz_t);
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref t, unsigned long ul) {
+  if (ul <= LONG_MAX) {
+#if PLVERSION >= 50800
+    return PL_put_integer(t, ul);
+#else
+    PL_put_integer(t, ul);
+    return 1;
+#endif
+  }
+  else if (ul <= (uint64_t) INT64_MAX) {
+#if PLVERSION >= 50800
+    return PL_put_int64(t, (int64_t) ul);
+#else
+    PL_put_int64(t, (int64_t) ul);
+    return 1;
+#endif
+  }
+  else
+    return Prolog_put_big_ulong(t, ul);
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref t, const char* s) {
+#if PLVERSION >= 50800
+  return PL_put_atom_chars(t, s);
+#else
+  PL_put_atom_chars(t, s);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+#if PLVERSION >= 50800
+  return PL_put_atom(t, a);
+#else
+  PL_put_atom(t, a);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref t, void* p) {
+#if PLVERSION >= 50800
+  return PL_put_pointer(t, p);
+#else
+  PL_put_pointer(t, p);
+  return 1;
+#endif
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return PL_new_atom(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1) {
+#if PLVERSION >= 50800
+  return PL_cons_functor(t, PL_new_functor(f, 1), a1);
+#else
+  PL_cons_functor(t, PL_new_functor(f, 1), a1);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2) {
+#if PLVERSION >= 50800
+  return PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+#else
+  PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3) {
+#if PLVERSION >= 50800
+  return PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+#else
+  PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4) {
+#if PLVERSION >= 50800
+  return PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+#else
+  PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+  return 1;
+#endif
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref c,
+                      Prolog_term_ref h, Prolog_term_ref t) {
+#if PLVERSION >= 50800
+  return PL_cons_list(c, h, t);
+#else
+  PL_cons_list(c, h, t);
+  return 1;
+#endif
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  (void) PL_raise_exception(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return PL_is_variable(t);
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return PL_is_atom(t);
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return PL_is_integer(t);
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return PL_is_integer(t);
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return PL_is_compound(t);
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return (!PL_is_atom(t) && PL_is_list(t)) ? 1 : 0;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  return PL_get_long(t, lp);
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into to \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  return PL_get_pointer(t, vpp);
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  return PL_get_atom(t, ap);
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  return PL_get_name_arity(t, ap, ip);
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref a) {
+  assert(Prolog_is_compound(t));
+  return PL_get_arg(i, t, a);
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref h, Prolog_term_ref t) {
+  assert(Prolog_is_cons(c));
+  return PL_get_list(c, h, t);
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return PL_unify(t, u);
+}
+
+#endif // !defined(PCFLI_swi_cfli_hh)
diff --git a/interfaces/Prolog/SWI/swi_efli.cc b/interfaces/Prolog/SWI/swi_efli.cc
new file mode 100644
index 0000000..9ba49ca
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_efli.cc
@@ -0,0 +1,86 @@
+/* SWI-Prolog extended foreign language interface: definitions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "swi_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SWI {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  // FIXME: avoid the temporary when Coefficient is mpz_class.
+  PPL_DIRTY_TEMP(mpz_class, tmp);
+  int r;
+#if PLVERSION >= 50800
+  r = PL_get_mpz(t, tmp.get_mpz_t());
+#else
+  PL_get_mpz(t, tmp.get_mpz_t());
+  r = 1;
+#endif
+  n = tmp;
+  return r;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  PPL_DIRTY_TEMP(mpz_class, tmp);
+  assign_r(tmp, n, ROUND_NOT_NEEDED);
+  return PL_unify_mpz(t, tmp.get_mpz_t());
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  PL_put_variable(t);
+  return Prolog_unify_Coefficient(t, n);
+}
+
+} // namespace SWI
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/SWI/swi_efli.hh b/interfaces/Prolog/SWI/swi_efli.hh
new file mode 100644
index 0000000..037f3ac
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_efli.hh
@@ -0,0 +1,92 @@
+/* SWI-Prolog extended foreign language interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_swi_efli_hh
+#define PPL_swi_efli_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+// By including "ppl.hh" first, we ensure the limit macros provided by
+// <stdint.h> and/or <inttypes.h> are already defined.
+#include "swi_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace SWI {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+} // namespace SWI
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_swi_efli_hh)
diff --git a/interfaces/Prolog/SWI/swi_pl_check.pl b/interfaces/Prolog/SWI/swi_pl_check.pl
new file mode 100644
index 0000000..c64957a
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_pl_check.pl
@@ -0,0 +1,39 @@
+/* Main program for the PPL/SWI-Prolog checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:-  ensure_loaded('pl_check.pl').
+
+prolog_system('SWI').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pchk, write, Stream),
+    set_output(Stream),
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/SWI/swi_prolog_generated_test.pl b/interfaces/Prolog/SWI/swi_prolog_generated_test.pl
new file mode 100644
index 0000000..79484ad
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_prolog_generated_test.pl
@@ -0,0 +1,47 @@
+/* Main program for the PPL/SWI-Prolog generated tests.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+member(X, [X|_]).
+member(X, [_|T]) :-
+    member(X, T).
+
+append([], L, L).
+append([H|T], L, [H|R]) :-
+    append(T, L, R).
+
+:-  ensure_loaded('ppl_prolog_generated_test_main.pl').
+
+prolog_system('SWI').
+
+main :-
+    current_output(Old_Stream),
+    open(obtained_pgt, write, Stream),
+    set_output(Stream),
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl,
+    close(Stream),
+    set_output(Old_Stream).
diff --git a/interfaces/Prolog/XSB/Makefile.am b/interfaces/Prolog/XSB/Makefile.am
new file mode 100644
index 0000000..42d464a
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.am
@@ -0,0 +1,308 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+XSB_CFLI_FILES = xsb_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_xsb_cc.m4 \
+ppl_interface_generator_xsb_hh.m4 \
+ppl_interface_generator_xsb_H.m4 \
+$(XSB_CFLI_FILES) \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+ppl_xsb.H: $(interface_generator_dependencies) ppl_interface_generator_xsb_H.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_H.m4 > $@
+
+ppl_xsb.hh: $(interface_generator_dependencies) ppl_interface_generator_xsb_hh.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_hh.m4 > $@
+
+ppl_xsb.cc: $(interface_generator_dependencies) ppl_interface_generator_xsb_cc.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_cc.m4 > $@
+
+xsb_prolog_generated_test.P: $(interface_generator_dependencies) ppl_interface_generator_xsb_prolog_generated_test_P.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_prolog_generated_test_P.m4 > $@
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+noinst_LTLIBRARIES = libppl_xsb.la
+
+libppl_xsb_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+xsb_efli.hh \
+xsb_efli.cc
+
+nodist_libppl_xsb_la_SOURCES = \
+ppl_xsb.hh \
+../ppl_prolog_common.cc
+
+BUILT_SOURCES = \
+ppl_xsb.hh
+
+nodist_EXTRA_libppl_xsb_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_xsb_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_xsb_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_xsb_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_xsb.xwam
+
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc libppl_xsb.la
+	cp -f ppl_xsb.cc ppl_xsb.c
+	echo "consult(ppl_xsb," \
+	  "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -fPIC " \
+	    "-L.libs -lppl_xsb" \
+	    "-L../../../src/.libs')])." \
+		| $(LIBTOOL) --mode=execute \
+			-dlopen ../../../src/libppl.la \
+			xsb
+	rm -f ppl_xsb.c
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+check-local: libppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test ppl_prolog_generated_test $(CLPQ_TESTS)
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_clpq.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/clpq.pl .
+	rm -f xsb_clpq.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_clpq \
+			<$(srcdir)/../tests/script_clpq >obtained_clpq
+	rm -f clpq.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_clpq.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_clpq2.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/clpq2.pl .
+	rm -f xsb_clpq2.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_clpq2 \
+			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	rm -f clpq2.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_clpq2.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+pl_check_test: libppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_pl_check.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	rm -f xsb_pl_check.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_pl_check \
+			>obtained_pchk
+	rm -f pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_pl_check.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ppl_prolog_generated_test: libppl_xsb.la ppl_xsb.xwam xsb_prolog_generated_test.P ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	rm -f xsb_prolog_generated_test.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_prolog_generated_test \
+			>obtained_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+
+CLEANFILES = \
+ppl_xsb.H \
+ppl_xsb.hh \
+ppl_xsb.cc \
+xsb_prolog_generated_test.P
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_efli.lo xsb_efli.o \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam xsb_prolog_generated_test.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_xsb_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/XSB/Makefile.in b/interfaces/Prolog/XSB/Makefile.in
new file mode 100644
index 0000000..44dcf06
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.in
@@ -0,0 +1,1650 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/XSB
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am_libppl_xsb_la_OBJECTS = xsb_efli.lo
+nodist_libppl_xsb_la_OBJECTS = ppl_prolog_common.lo
+libppl_xsb_la_OBJECTS = $(am_libppl_xsb_la_OBJECTS) \
+	$(nodist_libppl_xsb_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_xsb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(AM_CXXFLAGS) $(CXXFLAGS) $(libppl_xsb_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_xsb_la_SOURCES) $(nodist_libppl_xsb_la_SOURCES) \
+	$(nodist_EXTRA_libppl_xsb_la_SOURCES)
+DIST_SOURCES = $(libppl_xsb_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgdatadir)"
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+XSB_CFLI_FILES = xsb_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_xsb_cc.m4 \
+ppl_interface_generator_xsb_hh.m4 \
+ppl_interface_generator_xsb_H.m4 \
+$(XSB_CFLI_FILES) \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_xsb_prolog_generated_test_P.m4
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+noinst_LTLIBRARIES = libppl_xsb.la
+libppl_xsb_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+xsb_efli.hh \
+xsb_efli.cc
+
+nodist_libppl_xsb_la_SOURCES = \
+ppl_xsb.hh \
+../ppl_prolog_common.cc
+
+BUILT_SOURCES = \
+ppl_xsb.hh
+
+nodist_EXTRA_libppl_xsb_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_xsb_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+libppl_xsb_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+libppl_xsb_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_xsb.xwam
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_xsb.H \
+ppl_xsb.hh \
+ppl_xsb.cc \
+xsb_prolog_generated_test.P
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_efli.lo xsb_efli.o \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam xsb_prolog_generated_test.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt
+
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl_xsb.la: $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_DEPENDENCIES) $(EXTRA_libppl_xsb_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_xsb_la_LINK)  $(libppl_xsb_la_OBJECTS) $(libppl_xsb_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/xsb_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+	done
+
+uninstall-pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkgdatadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgdataDATA
+
+.MAKE: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+	clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-pkgdataDATA install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-pkgdataDATA
+
+
+ppl_xsb.H: $(interface_generator_dependencies) ppl_interface_generator_xsb_H.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_H.m4 > $@
+
+ppl_xsb.hh: $(interface_generator_dependencies) ppl_interface_generator_xsb_hh.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_hh.m4 > $@
+
+ppl_xsb.cc: $(interface_generator_dependencies) ppl_interface_generator_xsb_cc.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_cc.m4 > $@
+
+xsb_prolog_generated_test.P: $(interface_generator_dependencies) ppl_interface_generator_xsb_prolog_generated_test_P.m4
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_xsb_prolog_generated_test_P.m4 > $@
+
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc libppl_xsb.la
+	cp -f ppl_xsb.cc ppl_xsb.c
+	echo "consult(ppl_xsb," \
+	  "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+	    "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -fPIC " \
+	    "-L.libs -lppl_xsb" \
+	    "-L../../../src/.libs')])." \
+		| $(LIBTOOL) --mode=execute \
+			-dlopen ../../../src/libppl.la \
+			xsb
+	rm -f ppl_xsb.c
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+check-local: libppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test ppl_prolog_generated_test $(CLPQ_TESTS)
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_clpq.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/clpq.pl .
+	rm -f xsb_clpq.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_clpq \
+			<$(srcdir)/../tests/script_clpq >obtained_clpq
+	rm -f clpq.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_clpq.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_clpq2.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/clpq2.pl .
+	rm -f xsb_clpq2.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_clpq2 \
+			<$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+	rm -f clpq2.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_clpq2.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+pl_check_test: libppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  cp -f $(srcdir)/xsb_pl_check.P . ; \
+	fi
+	cp -f $(srcdir)/../tests/pl_check.pl .
+	rm -f xsb_pl_check.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_pl_check \
+			>obtained_pchk
+	rm -f pl_check.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f xsb_pl_check.P; \
+	fi
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ppl_prolog_generated_test: libppl_xsb.la ppl_xsb.xwam xsb_prolog_generated_test.P ../tests/ppl_prolog_generated_test_main.pl ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	cp -f ../tests/ppl_prolog_generated_test_main.pl .
+	rm -f xsb_prolog_generated_test.xwam
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		xsb xsb_prolog_generated_test \
+			>obtained_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_libppl_xsb_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
new file mode 100644
index 0000000..b346f41
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_H.m4
@@ -0,0 +1,47 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.H.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface: declarations.  -*- Prolog -*-
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+:- export
+m4_divert(1)
+
+:- ldoption('-L../../../src/.libs -lppl -L../../../Watchdog/.libs -lpwl -lgmp -lgmpxx').
+
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, `  $1/$2', `COMMA
+  $1/$2')')
+m4_divert(-1)
+
+m4_divert`'dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`.'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
new file mode 100644
index 0000000..e97d8cb
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_cc.m4
@@ -0,0 +1,146 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+m4_divert(1)dnl
+
+#define XSB_ENTRY_0(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  return xsb_stub_##name(); \
+}
+
+#define XSB_ENTRY_1(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  return xsb_stub_##name(arg1); \
+}
+
+#define XSB_ENTRY_2(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  return xsb_stub_##name(arg1, arg2); \
+}
+
+#define XSB_ENTRY_3(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  return xsb_stub_##name(arg1, arg2, arg3); \
+}
+
+#define XSB_ENTRY_4(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4); \
+}
+
+#define XSB_ENTRY_5(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define XSB_ENTRY_6(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  Prolog_term_ref arg6 = reg_term(6); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+#define XSB_ENTRY_7(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  Prolog_term_ref arg6 = reg_term(6); \
+  Prolog_term_ref arg7 = reg_term(7); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
+}
+
+#define XSB_ENTRY_8(name) \
+extern "C" Prolog_foreign_return_type \
+name() { \
+  Prolog_term_ref arg1 = reg_term(1); \
+  Prolog_term_ref arg2 = reg_term(2); \
+  Prolog_term_ref arg3 = reg_term(3); \
+  Prolog_term_ref arg4 = reg_term(4); \
+  Prolog_term_ref arg5 = reg_term(5); \
+  Prolog_term_ref arg6 = reg_term(6); \
+  Prolog_term_ref arg7 = reg_term(7); \
+  Prolog_term_ref arg8 = reg_term(8); \
+  return xsb_stub_##name(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
+}
+
+m4_divert(2)dnl
+
+extern "C" void
+init() {
+   ppl_initialize();
+}
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `#undef $1
+')dnl
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)
+
+m4_define(`m4_expanded_procedure_schema', `XSB_ENTRY_$2($1)
+')
+
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
new file mode 100644
index 0000000..2465c68
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_hh.m4
@@ -0,0 +1,39 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_xsb.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `#define $1 xsb_stub_$1
+')dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4 b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
new file mode 100644
index 0000000..1e4dedd
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_interface_generator_xsb_prolog_generated_test_P.m4
@@ -0,0 +1,86 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the XSB dependent code for xsb_prolog_generated_test.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_common_dat.m4')
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* XSB Prolog interface: XSB Prolog part for checking all predicates.
+m4_include(`ppl_interface_generator_copyright')
+*/
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+#include "ppl_prolog_generated_test_main.pl"
+#include "ppl_prolog_generated_test_common.pl"
+m4_divert(-1)
+
+m4_pushdef(`m4_one_class_code', `dnl
+m4_replace_all_patterns($1,
+  `#includeSPACE"../tests/ppl_prolog_generated_test_'`'m4_interface_class$1`'`.pl"
+')`'dnl
+')`'dnl
+dnl
+dnl -----------------------------------------------------------------
+dnl Generate #include declarations for all the classes.
+dnl -----------------------------------------------------------------
+dnl
+m4_divert
+m4_patsubst(m4_patsubst(m4_all_code, ` ', `'), SPACE, ` ')`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+m4_divert(1)
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+prolog_system('XSB').
+
+discontiguous(_).
+include(_).
+
+main :-
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl.
+
+:- main.
+m4_divert`'dnl
+m4_define(`m4_expanded_procedure_schema', `m4_ifelse($4, 0, , `COMMA
+')	  $1/$2')dnl
+m4_patsubst(ppl_prolog_sys_code, COMMA, `,')`'dnl
+m4_undivert(1)
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..83eede1
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_prolog_sysdep.hh
@@ -0,0 +1,27 @@
+/* System-dependent part of the Prolog interfaces: stub for XSB.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "xsb_efli.hh"
+#include "ppl_xsb.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::XSB;
diff --git a/interfaces/Prolog/XSB/xsb_cfli.hh b/interfaces/Prolog/XSB/xsb_cfli.hh
new file mode 100644
index 0000000..fa6c8f0
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_cfli.hh
@@ -0,0 +1,351 @@
+/* XSB Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_xsb_cfli_hh
+#define PCFLI_xsb_cfli_hh 1
+
+#include <cinterf.h>
+
+// In XSB versions up to and including 2.7.1, <error_xsb.h> does not
+// come with the extern "C" wrapper.
+extern "C" {
+#include <error_xsb.h>
+}
+
+#include <cassert>
+
+typedef prolog_term Prolog_term_ref;
+typedef char* Prolog_atom;
+typedef xsbBool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+// XSB people claim XSB supports 32-bit integers.  However, experiments
+// suggest this is not the case.
+// See http://sourceforge.net/tracker/index.php?func=detail&aid=1400271&group_id=1176&atid=101176
+#if 0
+#define XSB_min_integer (-2147483647-1)
+#define XSB_max_integer  2147483647
+#else
+#define XSB_min_integer -268435456
+#define XSB_max_integer  268435455
+#endif
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return p2p_new();
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  assert(is_var(t) == TRUE);
+  if (l < XSB_min_integer || l > XSB_max_integer)
+    return 0;
+  return c2p_int(l, t) != FALSE;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  assert(is_var(t) == TRUE);
+  if (ul > static_cast<unsigned long>(XSB_max_integer))
+    return 0;
+  return c2p_int(ul, t) != FALSE;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  assert(is_var(t) == TRUE);
+  return c2p_string(string_find(const_cast<char*>(s), 1), t) != FALSE;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  assert(is_var(t) == TRUE);
+  return c2p_string(a, t) != FALSE;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  assert(is_var(t) == TRUE);
+  return c2p_int(reinterpret_cast<long>(p), t) != FALSE;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return string_find(const_cast<char*>(s), 1);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 1, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 2, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 3, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  p2p_unify(p2p_arg(new_compound, 3), a3);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4) {
+  prolog_term new_compound = p2p_new();
+  c2p_functor(f, 4, new_compound);
+  p2p_unify(p2p_arg(new_compound, 1), a1);
+  p2p_unify(p2p_arg(new_compound, 2), a2);
+  p2p_unify(p2p_arg(new_compound, 3), a3);
+  p2p_unify(p2p_arg(new_compound, 4), a4);
+  t = new_compound;
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+                      Prolog_term_ref h, Prolog_term_ref t) {
+  prolog_term new_cons = p2p_new();
+  c2p_list(new_cons);
+  p2p_unify(p2p_car(new_cons), h);
+  p2p_unify(p2p_cdr(new_cons), t);
+  c = new_cons;
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  xsb_throw(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return is_var(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return is_string(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return is_int(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return is_int(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return is_functor(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return is_list(t) != FALSE;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  *lp = p2c_int(t);
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = reinterpret_cast<void*>(p2c_int(t));
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = p2c_string(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  *ap = p2c_functor(t);
+  *ip = p2c_arity(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = p2p_arg(t, i);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = p2p_car(c);
+  t = p2p_cdr(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return p2p_unify(t, u) != FALSE;
+}
+
+
+
+#endif // !defined(PCFLI_xsb_cfli_hh)
diff --git a/interfaces/Prolog/XSB/xsb_clpq.P b/interfaces/Prolog/XSB/xsb_clpq.P
new file mode 100644
index 0000000..dd0e452
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq.P
@@ -0,0 +1,54 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_new_C_Polyhedron_from_space_dimension/3,
+        ppl_new_NNC_Polyhedron_from_space_dimension/3,
+        ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_add_constraints/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "clpq.pl"
+
+eat_eol.
+
+main :-
+    common_main.
+
+:- ppl_initialize, main, ppl_finalize.
diff --git a/interfaces/Prolog/XSB/xsb_clpq2.P b/interfaces/Prolog/XSB/xsb_clpq2.P
new file mode 100644
index 0000000..4218630
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq2.P
@@ -0,0 +1,55 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_new_C_Polyhedron_from_space_dimension/3,
+        ppl_new_NNC_Polyhedron_from_space_dimension/3,
+        ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_add_constraints/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "clpq2.pl"
+
+eat_eol.
+
+main :-
+    common_main.
+
+:- ppl_initialize, main, ppl_finalize.
diff --git a/interfaces/Prolog/XSB/xsb_efli.cc b/interfaces/Prolog/XSB/xsb_efli.cc
new file mode 100644
index 0000000..689eb90
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_efli.cc
@@ -0,0 +1,82 @@
+/* XSB extended foreign language interface: definitions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "xsb_efli.hh"
+#include "ppl_prolog_common_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace XSB {
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = false;
+  Prolog_min_integer = XSB_min_integer;
+  Prolog_max_integer = XSB_max_integer;
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  // XSB supports only 32-bit integers.
+  long l;
+  Prolog_get_long(t, &l);
+  n = l;
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  long l = 0;
+  Result r = assign_r(l, n, ROUND_IGNORE);
+  if (result_overflow(r))
+    throw PPL_integer_out_of_range(n);
+  return Prolog_put_long(t, l);
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  return Prolog_put_Coefficient(u, n) && Prolog_unify(t, u);
+}
+
+} // namespace XSB
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/XSB/xsb_efli.hh b/interfaces/Prolog/XSB/xsb_efli.hh
new file mode 100644
index 0000000..5dc4336
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_efli.hh
@@ -0,0 +1,89 @@
+/* XSB extended foreign language interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_xsb_efli_hh
+#define PPL_xsb_efli_hh 1
+
+#include "ppl.hh"
+#include "xsb_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace XSB {
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace XSB
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_xsb_efli_hh)
diff --git a/interfaces/Prolog/XSB/xsb_pl_check.P b/interfaces/Prolog/XSB/xsb_pl_check.P
new file mode 100644
index 0000000..76b13e9
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_pl_check.P
@@ -0,0 +1,205 @@
+/* Prolog main program for the PPL/XSB-Prolog predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- compiler_options([xpp_on]).
+:- import xpp_include_dir/1 from parse.
+:- assert(xpp_include_dir('.')).
+
+:- import append/3, length/2, member/2 from basics.
+:- import
+        ppl_version_major/1,
+        ppl_version_minor/1,
+        ppl_version_revision/1,
+        ppl_version_beta/1,
+        ppl_version/1,
+        ppl_banner/1,
+        ppl_max_space_dimension/1,
+        ppl_Coefficient_bits/1,
+        ppl_Coefficient_is_bounded/0,
+        ppl_Coefficient_max/1,
+        ppl_Coefficient_min/1,
+        ppl_initialize/0,
+        ppl_finalize/0,
+        ppl_set_irrational_precision/1,
+        ppl_irrational_precision/1,
+        ppl_set_timeout_exception_atom/1,
+        ppl_timeout_exception_atom/1,
+        ppl_set_timeout/1,
+        ppl_reset_timeout/0,
+        ppl_set_rounding_for_PPL/0,
+        ppl_restore_pre_PPL_rounding/0,
+        ppl_new_C_Polyhedron_from_space_dimension/3,
+        ppl_new_NNC_Polyhedron_from_space_dimension/3,
+        ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron/2,
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+        ppl_new_C_Polyhedron_from_constraints/2,
+        ppl_new_NNC_Polyhedron_from_constraints/2,
+        ppl_new_C_Polyhedron_from_generators/2,
+        ppl_new_NNC_Polyhedron_from_generators/2,
+        ppl_C_Polyhedron_upper_bound_assign_if_exact/2,
+        ppl_NNC_Polyhedron_upper_bound_assign_if_exact/2,
+        ppl_Polyhedron_swap/2,
+        ppl_delete_Polyhedron/1,
+        ppl_Polyhedron_space_dimension/2,
+        ppl_Polyhedron_affine_dimension/2,
+        ppl_Polyhedron_get_constraints/2,
+        ppl_Polyhedron_get_minimized_constraints/2,
+        ppl_Polyhedron_get_generators/2,
+        ppl_Polyhedron_get_minimized_generators/2,
+        ppl_Polyhedron_relation_with_constraint/3,
+        ppl_Polyhedron_relation_with_generator/3,
+        ppl_Polyhedron_is_empty/1,
+        ppl_Polyhedron_is_universe/1,
+        ppl_Polyhedron_is_bounded/1,
+        ppl_Polyhedron_contains_integer_point/1,
+        ppl_Polyhedron_bounds_from_above/2,
+        ppl_Polyhedron_bounds_from_below/2,
+        ppl_Polyhedron_maximize/5,
+        ppl_Polyhedron_maximize_with_point/6,
+        ppl_Polyhedron_minimize/5,
+        ppl_Polyhedron_minimize_with_point/6,
+        ppl_Polyhedron_is_topologically_closed/1,
+        ppl_Polyhedron_contains_Polyhedron/2,
+        ppl_Polyhedron_strictly_contains_Polyhedron/2,
+        ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+        ppl_Polyhedron_equals_Polyhedron/2,
+        ppl_Polyhedron_OK/1,
+        ppl_Polyhedron_add_constraint/2,
+        ppl_Polyhedron_add_generator/2,
+        ppl_Polyhedron_add_constraints/2,
+        ppl_Polyhedron_add_generators/2,
+        ppl_Polyhedron_intersection_assign/2,
+        ppl_Polyhedron_poly_hull_assign/2,
+        ppl_Polyhedron_poly_difference_assign/2,
+        ppl_Polyhedron_affine_image/4,
+        ppl_Polyhedron_affine_preimage/4,
+        ppl_Polyhedron_bounded_affine_image/5,
+        ppl_Polyhedron_bounded_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image/5,
+        ppl_Polyhedron_generalized_affine_preimage/5,
+        ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+        ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4,
+        ppl_Polyhedron_time_elapse_assign/2,
+        ppl_Polyhedron_topological_closure_assign/1,
+        ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4,
+        ppl_Polyhedron_BHRZ03_widening_assign/2,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+        ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+        ppl_Polyhedron_H79_widening_assign/2,
+        ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+        ppl_Polyhedron_bounded_H79_extrapolation_assign/3,
+        ppl_Polyhedron_add_space_dimensions_and_project/2,
+        ppl_Polyhedron_add_space_dimensions_and_embed/2,
+        ppl_Polyhedron_concatenate_assign/2,
+        ppl_Polyhedron_remove_space_dimensions/2,
+        ppl_Polyhedron_remove_higher_space_dimensions/2,
+        ppl_Polyhedron_expand_space_dimension/3,
+        ppl_Polyhedron_fold_space_dimensions/3,
+        ppl_Polyhedron_map_space_dimensions/2,
+        ppl_Polyhedron_constrains/2,
+        ppl_Polyhedron_unconstrain_space_dimension/2,
+        ppl_Polyhedron_unconstrain_space_dimensions/2,
+        ppl_termination_test_C_Polyhedron_MS/1,
+        ppl_termination_test_C_Polyhedron_PR/1,
+        ppl_new_MIP_Problem_from_space_dimension/2,
+        ppl_new_MIP_Problem/5,
+        ppl_new_MIP_Problem_from_MIP_Problem/2,
+        ppl_MIP_Problem_swap/2,
+        ppl_delete_MIP_Problem/1,
+        ppl_MIP_Problem_space_dimension/2,
+        ppl_MIP_Problem_integer_space_dimensions/2,
+        ppl_MIP_Problem_constraints/2,
+        ppl_MIP_Problem_objective_function/2,
+        ppl_MIP_Problem_optimization_mode/2,
+        ppl_MIP_Problem_clear/1,
+        ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+        ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+        ppl_MIP_Problem_add_constraint/2,
+        ppl_MIP_Problem_add_constraints/2,
+        ppl_MIP_Problem_set_objective_function/2,
+        ppl_MIP_Problem_set_optimization_mode/2,
+        ppl_MIP_Problem_is_satisfiable/1,
+        ppl_MIP_Problem_solve/2,
+        ppl_MIP_Problem_feasible_point/2,
+        ppl_MIP_Problem_optimizing_point/2,
+        ppl_MIP_Problem_optimal_value/3,
+        ppl_MIP_Problem_evaluate_objective_function/4,
+        ppl_MIP_Problem_OK/1,
+        ppl_MIP_Problem_get_control_parameter/3,
+        ppl_MIP_Problem_set_control_parameter/2,
+        ppl_new_PIP_Problem_from_space_dimension/2,
+        ppl_new_PIP_Problem/4,
+        ppl_new_PIP_Problem_from_PIP_Problem/2,
+        ppl_PIP_Problem_swap/2,
+        ppl_delete_PIP_Problem/1,
+        ppl_PIP_Problem_space_dimension/2,
+        ppl_PIP_Problem_parameter_space_dimensions/2,
+        ppl_PIP_Problem_constraints/2,
+        ppl_PIP_Problem_clear/1,
+        ppl_PIP_Problem_add_space_dimensions_and_embed/3,
+        ppl_PIP_Problem_add_to_parameter_space_dimensions/2,
+        ppl_PIP_Problem_add_constraint/2,
+        ppl_PIP_Problem_add_constraints/2,
+        ppl_PIP_Problem_set_control_parameter/2,
+        ppl_PIP_Problem_get_control_parameter/3,
+        ppl_PIP_Problem_has_big_parameter_dimension/2,
+        ppl_PIP_Problem_set_big_parameter_dimension/2,
+        ppl_PIP_Problem_is_satisfiable/1,
+        ppl_PIP_Problem_solve/2,
+        ppl_PIP_Problem_solution/2,
+        ppl_PIP_Problem_optimizing_solution/2,
+        ppl_PIP_Problem_OK/1,
+        ppl_PIP_Problem_ascii_dump/1,
+        ppl_PIP_Tree_Node_constraints/2,
+        ppl_PIP_Tree_Node_is_solution/1,
+        ppl_PIP_Tree_Node_is_decision/1,
+        ppl_PIP_Tree_Node_is_bottom/1,
+        ppl_PIP_Tree_Node_artificials/2,
+        ppl_PIP_Tree_Node_OK/1,
+        ppl_PIP_Tree_Node_parametric_values/3,
+        ppl_PIP_Tree_Node_true_child/2,
+        ppl_PIP_Tree_Node_false_child/2
+   from ppl_xsb.
+
+:- [ppl_xsb].
+
+#include "pl_check.pl"
+
+prolog_system('XSB').
+
+main :-
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl.
+
+:- main.
diff --git a/interfaces/Prolog/YAP/Makefile.am b/interfaces/Prolog/YAP/Makefile.am
new file mode 100644
index 0000000..419ce60
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.am
@@ -0,0 +1,278 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = -Wno-unsupported
+
+YAP_CFLI_FILES = yap_cfli.hh
+
+EXTRA_DIST = \
+ppl_interface_generator_yap_cc.m4 \
+$(YAP_CFLI_FILES) \
+ppl_yap.pl \
+yap_clpq.pl \
+yap_clpq2.pl \
+yap_pl_check.pl \
+yap_prolog_generated_test.pl \
+README.yap
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_yap_cc.m4
+
+ppl_yap.cc: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@
+
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/interfaces \
+-I$(top_srcdir)/interfaces/Prolog \
+-I$(top_buildir)/interfaces/Prolog \
+-I$(top_builddir)/src \
+$(YAP_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+pkglib_LTLIBRARIES = ppl_yap.la
+
+# There is no point in generating the static version.
+AM_LIBTOOLFLAGS = --tag=disable-static
+
+ppl_yap_la_SOURCES = \
+ppl_prolog_sysdep.hh \
+yap_efli.hh \
+yap_efli.cc
+
+nodist_ppl_yap_la_SOURCES = \
+ppl_yap.cc \
+../ppl_prolog_common.cc
+
+nodist_EXTRA_ppl_yap_la_SOURCES = \
+../ppl_prolog_Int8_Box.cc \
+../ppl_prolog_Int16_Box.cc \
+../ppl_prolog_Int32_Box.cc \
+../ppl_prolog_Int64_Box.cc \
+../ppl_prolog_Uint8_Box.cc \
+../ppl_prolog_Uint16_Box.cc \
+../ppl_prolog_Uint32_Box.cc \
+../ppl_prolog_Uint64_Box.cc \
+../ppl_prolog_Float_Box.cc \
+../ppl_prolog_Double_Box.cc \
+../ppl_prolog_Long_Double_Box.cc \
+../ppl_prolog_Rational_Box.cc \
+../ppl_prolog_Z_Box.cc \
+../ppl_prolog_BD_Shape_int8_t.cc \
+../ppl_prolog_BD_Shape_int16_t.cc \
+../ppl_prolog_BD_Shape_int32_t.cc \
+../ppl_prolog_BD_Shape_int64_t.cc \
+../ppl_prolog_BD_Shape_float.cc \
+../ppl_prolog_BD_Shape_double.cc \
+../ppl_prolog_BD_Shape_long_double.cc \
+../ppl_prolog_BD_Shape_mpq_class.cc \
+../ppl_prolog_BD_Shape_mpz_class.cc \
+../ppl_prolog_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Octagonal_Shape_float.cc \
+../ppl_prolog_Octagonal_Shape_double.cc \
+../ppl_prolog_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Polyhedron.cc \
+../ppl_prolog_Grid.cc \
+../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+../ppl_prolog_Pointset_Powerset_Grid.cc \
+../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ppl_yap_la_LIBADD = \
+ at required_instantiations_prolog_cxx_objects@ \
+$(YAP_PROLOG_LD_OPTIONS) \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ppl_yap_la_DEPENDENCIES = \
+ at required_instantiations_prolog_cxx_objects@
+
+ppl_yap_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-module \
+-avoid-version
+
+pkgdata_DATA = ppl_yap.pl
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+	echo "main." >script_pchk
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ppl_yap.la \
+		$(YAP_PROLOG) -l $(srcdir)/yap_pl_check.pl \
+			<script_pchk >obtained_pchk
+	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+$(CLPQ_TESTS):
+	cp -f $(srcdir)/../tests/$@ .
+
+clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+	echo "main." >script_clpq
+	cat $(srcdir)/../tests/script_clpq >>script_clpq
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ppl_yap.la \
+		$(YAP_PROLOG) -l $(srcdir)/yap_clpq.pl \
+			<script_clpq >obtained_clpq
+	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+	echo "main." >script_clpq2
+	cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ppl_yap.la \
+		$(YAP_PROLOG) -l $(srcdir)/yap_clpq2.pl \
+			<script_clpq2 >obtained_clpq2
+	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ppl_prolog_generated_test: yap_prolog_generated_test.pl ppl_yap.pl  ../tests/expected_pgt
+	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+	if [ $(abs_srcdir) != `pwd` ]; then \
+          cp -f $(srcdir)/yap_prolog_generated_test.pl . ; \
+          cp -f $(srcdir)/ppl_yap.pl . ; \
+	fi
+	cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \
+	echo "main." >script_pgt
+	$(LIBTOOL) --mode=execute \
+		-dlopen ../../../src/libppl.la \
+		-dlopen ppl_yap.la \
+		$(YAP_PROLOG) -l yap_prolog_generated_test.pl \
+			<script_pgt >obtained_pgt
+	rm -f ppl_prolog_generated_test_common.pl
+	if [ $(abs_srcdir) != `pwd` ]; then \
+	  rm -f yap_prolog_generated_test.pl; \
+	  rm -f ppl_yap.pl; \
+        fi
+	rm -f ppl_prolog_generated_test_main.pl
+	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+endif ENABLE_SHARED
+
+CLEANFILES = \
+ppl_yap.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+script_clpq script_clpq2 script_pchk script_pgt \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_ppl_yap_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
diff --git a/interfaces/Prolog/YAP/Makefile.in b/interfaces/Prolog/YAP/Makefile.in
new file mode 100644
index 0000000..5375b9f
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.in
@@ -0,0 +1,1644 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/YAP
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am__ppl_yap_la_SOURCES_DIST = ppl_prolog_sysdep.hh yap_efli.hh \
+	yap_efli.cc
+ at ENABLE_SHARED_TRUE@am_ppl_yap_la_OBJECTS = yap_efli.lo
+ at ENABLE_SHARED_TRUE@nodist_ppl_yap_la_OBJECTS = ppl_yap.lo \
+ at ENABLE_SHARED_TRUE@	ppl_prolog_common.lo
+ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS) \
+	$(nodist_ppl_yap_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+ppl_yap_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(ppl_yap_la_LDFLAGS) $(LDFLAGS) -o $@
+ at ENABLE_SHARED_TRUE@am_ppl_yap_la_rpath = -rpath $(pkglibdir)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(ppl_yap_la_SOURCES) $(nodist_ppl_yap_la_SOURCES) \
+	$(nodist_EXTRA_ppl_yap_la_SOURCES)
+DIST_SOURCES = $(am__ppl_yap_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(pkgdata_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = -Wno-unsupported
+YAP_CFLI_FILES = yap_cfli.hh
+EXTRA_DIST = \
+ppl_interface_generator_yap_cc.m4 \
+$(YAP_CFLI_FILES) \
+ppl_yap.pl \
+yap_clpq.pl \
+yap_clpq2.pl \
+yap_pl_check.pl \
+yap_prolog_generated_test.pl \
+README.yap
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+ppl_interface_generator_yap_cc.m4
+
+ at ENABLE_SHARED_TRUE@AM_CPPFLAGS = \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces \
+ at ENABLE_SHARED_TRUE@-I$(top_srcdir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_buildir)/interfaces/Prolog \
+ at ENABLE_SHARED_TRUE@-I$(top_builddir)/src \
+ at ENABLE_SHARED_TRUE@$(YAP_PROLOG_INCLUDE_OPTIONS) \
+ at ENABLE_SHARED_TRUE@@extra_includes@
+
+ at ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at ENABLE_SHARED_TRUE@pkglib_LTLIBRARIES = ppl_yap.la
+
+# There is no point in generating the static version.
+ at ENABLE_SHARED_TRUE@AM_LIBTOOLFLAGS = --tag=disable-static
+ at ENABLE_SHARED_TRUE@ppl_yap_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@ppl_prolog_sysdep.hh \
+ at ENABLE_SHARED_TRUE@yap_efli.hh \
+ at ENABLE_SHARED_TRUE@yap_efli.cc
+
+ at ENABLE_SHARED_TRUE@nodist_ppl_yap_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@ppl_yap.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_common.cc
+
+ at ENABLE_SHARED_TRUE@nodist_EXTRA_ppl_yap_la_SOURCES = \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Int64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint8_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint16_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint32_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Uint64_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Float_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Rational_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Z_Box.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Pointset_Powerset_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc \
+ at ENABLE_SHARED_TRUE@../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+ at ENABLE_SHARED_TRUE@ppl_yap_la_LIBADD = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@ \
+ at ENABLE_SHARED_TRUE@$(YAP_PROLOG_LD_OPTIONS) \
+ at ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at ENABLE_SHARED_TRUE@ppl_yap_la_DEPENDENCIES = \
+ at ENABLE_SHARED_TRUE@@required_instantiations_prolog_cxx_objects@
+
+ at ENABLE_SHARED_TRUE@ppl_yap_la_LDFLAGS = \
+ at ENABLE_SHARED_TRUE@$(NO_UNDEFINED_FLAG) \
+ at ENABLE_SHARED_TRUE@-module \
+ at ENABLE_SHARED_TRUE@-avoid-version
+
+ at ENABLE_SHARED_TRUE@pkgdata_DATA = ppl_yap.pl
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at ENABLE_SHARED_TRUE@ack.clpq \
+ at ENABLE_SHARED_TRUE@ackn.clpq \
+ at ENABLE_SHARED_TRUE@fib.clpq \
+ at ENABLE_SHARED_TRUE@mc91.clpq \
+ at ENABLE_SHARED_TRUE@smm.clpq \
+ at ENABLE_SHARED_TRUE@sumto.clpq \
+ at ENABLE_SHARED_TRUE@tak.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS_STRICT = \
+ at ENABLE_SHARED_TRUE@schedule.clpq
+
+ at ENABLE_SHARED_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at ENABLE_SHARED_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+CLEANFILES = \
+ppl_yap.cc
+
+MOSTLYCLEANFILES = \
+ at required_instantiations_prolog_cxx_objects@ \
+script_clpq script_clpq2 script_pchk script_pgt \
+obtained_clpq obtained_clpq2 obtained_pchk obtained_pgt \
+$(CLPQ_TESTS)
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
+	}
+
+uninstall-pkglibLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+	done
+
+clean-pkglibLTLIBRARIES:
+	-test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+	@list='$(pkglib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+ppl_yap.la: $(ppl_yap_la_OBJECTS) $(ppl_yap_la_DEPENDENCIES) $(EXTRA_ppl_yap_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(ppl_yap_la_LINK) $(am_ppl_yap_la_rpath) $(ppl_yap_la_OBJECTS) $(ppl_yap_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Rational_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint16_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint32_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint64_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Uint8_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_Z_Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_prolog_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_yap.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/yap_efli.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+ppl_prolog_common.lo: ../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_common.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_common.Tpo -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_common.Tpo $(DEPDIR)/ppl_prolog_common.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_common.cc' object='ppl_prolog_common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_common.lo `test -f '../ppl_prolog_common.cc' || echo '$(srcdir)/'`../ppl_prolog_common.cc
+
+ppl_prolog_Int8_Box.lo: ../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int8_Box.Tpo -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int8_Box.cc' object='ppl_prolog_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int8_Box.lo `test -f '../ppl_prolog_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int8_Box.cc
+
+ppl_prolog_Int16_Box.lo: ../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int16_Box.Tpo -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int16_Box.cc' object='ppl_prolog_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int16_Box.lo `test -f '../ppl_prolog_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int16_Box.cc
+
+ppl_prolog_Int32_Box.lo: ../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int32_Box.Tpo -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int32_Box.cc' object='ppl_prolog_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int32_Box.lo `test -f '../ppl_prolog_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int32_Box.cc
+
+ppl_prolog_Int64_Box.lo: ../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Int64_Box.Tpo -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Int64_Box.cc' object='ppl_prolog_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Int64_Box.lo `test -f '../ppl_prolog_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Int64_Box.cc
+
+ppl_prolog_Uint8_Box.lo: ../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint8_Box.cc' object='ppl_prolog_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint8_Box.lo `test -f '../ppl_prolog_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint8_Box.cc
+
+ppl_prolog_Uint16_Box.lo: ../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint16_Box.cc' object='ppl_prolog_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint16_Box.lo `test -f '../ppl_prolog_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint16_Box.cc
+
+ppl_prolog_Uint32_Box.lo: ../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint32_Box.cc' object='ppl_prolog_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint32_Box.lo `test -f '../ppl_prolog_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint32_Box.cc
+
+ppl_prolog_Uint64_Box.lo: ../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Uint64_Box.cc' object='ppl_prolog_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Uint64_Box.lo `test -f '../ppl_prolog_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Uint64_Box.cc
+
+ppl_prolog_Float_Box.lo: ../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Float_Box.Tpo -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Float_Box.cc' object='ppl_prolog_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Float_Box.lo `test -f '../ppl_prolog_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Float_Box.cc
+
+ppl_prolog_Double_Box.lo: ../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Double_Box.Tpo -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Double_Box.cc' object='ppl_prolog_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Double_Box.lo `test -f '../ppl_prolog_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Double_Box.cc
+
+ppl_prolog_Long_Double_Box.lo: ../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Long_Double_Box.cc' object='ppl_prolog_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Long_Double_Box.lo `test -f '../ppl_prolog_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Long_Double_Box.cc
+
+ppl_prolog_Rational_Box.lo: ../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Rational_Box.Tpo -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Rational_Box.cc' object='ppl_prolog_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Rational_Box.lo `test -f '../ppl_prolog_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Rational_Box.cc
+
+ppl_prolog_Z_Box.lo: ../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Z_Box.Tpo -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Z_Box.cc' object='ppl_prolog_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Z_Box.lo `test -f '../ppl_prolog_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Z_Box.cc
+
+ppl_prolog_BD_Shape_int8_t.lo: ../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int8_t.cc' object='ppl_prolog_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int8_t.lo `test -f '../ppl_prolog_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int8_t.cc
+
+ppl_prolog_BD_Shape_int16_t.lo: ../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int16_t.cc' object='ppl_prolog_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int16_t.lo `test -f '../ppl_prolog_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int16_t.cc
+
+ppl_prolog_BD_Shape_int32_t.lo: ../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int32_t.cc' object='ppl_prolog_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int32_t.lo `test -f '../ppl_prolog_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int32_t.cc
+
+ppl_prolog_BD_Shape_int64_t.lo: ../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_int64_t.cc' object='ppl_prolog_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_int64_t.lo `test -f '../ppl_prolog_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_int64_t.cc
+
+ppl_prolog_BD_Shape_float.lo: ../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_float.cc' object='ppl_prolog_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_float.lo `test -f '../ppl_prolog_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_float.cc
+
+ppl_prolog_BD_Shape_double.lo: ../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_double.cc' object='ppl_prolog_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_double.lo `test -f '../ppl_prolog_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_double.cc
+
+ppl_prolog_BD_Shape_long_double.lo: ../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_long_double.cc' object='ppl_prolog_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_long_double.lo `test -f '../ppl_prolog_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_long_double.cc
+
+ppl_prolog_BD_Shape_mpq_class.lo: ../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpq_class.cc' object='ppl_prolog_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpq_class.cc
+
+ppl_prolog_BD_Shape_mpz_class.lo: ../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_BD_Shape_mpz_class.cc' object='ppl_prolog_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_BD_Shape_mpz_class.cc
+
+ppl_prolog_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Octagonal_Shape_float.lo: ../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_float.cc' object='ppl_prolog_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_float.cc
+
+ppl_prolog_Octagonal_Shape_double.lo: ../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_double.cc' object='ppl_prolog_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_double.cc
+
+ppl_prolog_Octagonal_Shape_long_double.lo: ../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_long_double.cc' object='ppl_prolog_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Polyhedron.lo: ../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Polyhedron.Tpo -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Polyhedron.cc' object='ppl_prolog_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Polyhedron.lo `test -f '../ppl_prolog_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Polyhedron.cc
+
+ppl_prolog_Grid.lo: ../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Grid.Tpo -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Grid.Tpo $(DEPDIR)/ppl_prolog_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Grid.cc' object='ppl_prolog_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Grid.lo `test -f '../ppl_prolog_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Grid.cc
+
+ppl_prolog_Pointset_Powerset_Int8_Box.lo: ../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int8_Box.cc' object='ppl_prolog_Pointset_Powerset_Int8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int16_Box.lo: ../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int16_Box.cc' object='ppl_prolog_Pointset_Powerset_Int16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int32_Box.lo: ../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int32_Box.cc' object='ppl_prolog_Pointset_Powerset_Int32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Int64_Box.lo: ../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Int64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Int64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Int64_Box.cc' object='ppl_prolog_Pointset_Powerset_Int64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Int64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Int64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Int64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint8_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint8_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint8_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint8_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint8_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint8_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint8_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint16_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint16_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint16_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint16_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint16_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint16_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint16_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint32_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint32_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint32_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint32_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint32_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint32_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint32_Box.cc
+
+ppl_prolog_Pointset_Powerset_Uint64_Box.lo: ../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Uint64_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Uint64_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' object='ppl_prolog_Pointset_Powerset_Uint64_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Uint64_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Uint64_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Uint64_Box.cc
+
+ppl_prolog_Pointset_Powerset_Float_Box.lo: ../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Float_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Float_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Float_Box.cc' object='ppl_prolog_Pointset_Powerset_Float_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Float_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Float_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Float_Box.cc
+
+ppl_prolog_Pointset_Powerset_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Doub [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Long_Double_Box.lo: ../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Long_Double_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Long_Double_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' object='ppl_prolog_Pointset_Powerset_Long_Double_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Long_Double_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Long_Double_Box.cc
+
+ppl_prolog_Pointset_Powerset_Rational_Box.lo: ../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Rational_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Rational_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Rational_Box.cc' object='ppl_prolog_Pointset_Powerset_Rational_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Rational_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Rational_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Rational_Box.cc
+
+ppl_prolog_Pointset_Powerset_Z_Box.lo: ../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Z_Box.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Z_Box.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Z_Box.cc' object='ppl_prolog_Pointset_Powerset_Z_Box.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Z_Box.lo `test -f '../ppl_prolog_Pointset_Powerset_Z_Box.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Z_Box.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolo [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Po [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../p [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_BD_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int8_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int16_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int32_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || ec [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_int64_t.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_float.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo ' [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_ [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_long_double.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpq_class.cc
+
+ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo: ../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.c [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' object='ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.lo `test -f '../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Octagonal_Shape_mpz_class.cc
+
+ppl_prolog_Pointset_Powerset_C_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Power [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_C_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_C_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo: ../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Points [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' object='ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_NNC_Polyhedron.lo `test -f '../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_NNC_Polyhedron.cc
+
+ppl_prolog_Pointset_Powerset_Grid.lo: ../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Pointset_Powerset_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Tpo $(DEPDIR)/ppl_prolog_Pointset_Powerset_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Pointset_Powerset_Grid.cc' object='ppl_prolog_Pointset_Powerset_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Pointset_Powerset_Grid.lo `test -f '../ppl_prolog_Pointset_Powerset_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Pointset_Powerset_Grid.cc
+
+ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'` [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(sr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Constraints_Product_Grid_NNC_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_C_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo: ../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Gr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' object='ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.lo `test -f '../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_NNC_Polyhedron_Grid.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' | [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_C_Polyhedron.cc
+
+ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo: ../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo -MD -MP -MF $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedr [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Tpo $(DEPDIR)/ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' object='ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.lo `test -f '../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc' || echo '$(srcdir)/'`../ppl_prolog_Shape_Preserving_Product_Grid_NNC_Polyhedron.cc
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pkgdataDATA: $(pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+	done
+
+uninstall-pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+ at ENABLE_SHARED_FALSE@check-local:
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkgdatadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pkgdataDATA uninstall-pkglibLTLIBRARIES
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \
+	clean-generic clean-libtool clean-pkglibLTLIBRARIES \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-pkgdataDATA install-pkglibLTLIBRARIES \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-pkgdataDATA \
+	uninstall-pkglibLTLIBRARIES
+
+
+ppl_yap.cc: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. -I$(srcdir)/.. -I$(srcdir)/../.. \
+           $(srcdir)/ppl_interface_generator_yap_cc.m4 > $@
+
+ at ENABLE_SHARED_TRUE@check-local: pl_check_test clpq_test clpq2_test ppl_prolog_generated_test
+
+ at ENABLE_SHARED_TRUE@pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at ENABLE_SHARED_TRUE@	echo "main." >script_pchk
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@		$(YAP_PROLOG) -l $(srcdir)/yap_pl_check.pl \
+ at ENABLE_SHARED_TRUE@			<script_pchk >obtained_pchk
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at ENABLE_SHARED_TRUE@$(CLPQ_TESTS):
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/$@ .
+
+ at ENABLE_SHARED_TRUE@clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@	echo "main." >script_clpq
+ at ENABLE_SHARED_TRUE@	cat $(srcdir)/../tests/script_clpq >>script_clpq
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@		$(YAP_PROLOG) -l $(srcdir)/yap_clpq.pl \
+ at ENABLE_SHARED_TRUE@			<script_clpq >obtained_clpq
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at ENABLE_SHARED_TRUE@clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) $(CLPQ_TESTS)
+ at ENABLE_SHARED_TRUE@	echo "main." >script_clpq2
+ at ENABLE_SHARED_TRUE@	cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@		$(YAP_PROLOG) -l $(srcdir)/yap_clpq2.pl \
+ at ENABLE_SHARED_TRUE@			<script_clpq2 >obtained_clpq2
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at ENABLE_SHARED_TRUE@ppl_prolog_generated_test: yap_prolog_generated_test.pl ppl_yap.pl  ../tests/expected_pgt
+ at ENABLE_SHARED_TRUE@	cp -f $(srcdir)/../tests/ppl_prolog_generated_test_common.pl .
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@          cp -f $(srcdir)/yap_prolog_generated_test.pl . ; \
+ at ENABLE_SHARED_TRUE@          cp -f $(srcdir)/ppl_yap.pl . ; \
+ at ENABLE_SHARED_TRUE@	fi
+ at ENABLE_SHARED_TRUE@	cp -f ../tests/ppl_prolog_generated_test_main.pl . ; \
+ at ENABLE_SHARED_TRUE@	echo "main." >script_pgt
+ at ENABLE_SHARED_TRUE@	$(LIBTOOL) --mode=execute \
+ at ENABLE_SHARED_TRUE@		-dlopen ../../../src/libppl.la \
+ at ENABLE_SHARED_TRUE@		-dlopen ppl_yap.la \
+ at ENABLE_SHARED_TRUE@		$(YAP_PROLOG) -l yap_prolog_generated_test.pl \
+ at ENABLE_SHARED_TRUE@			<script_pgt >obtained_pgt
+ at ENABLE_SHARED_TRUE@	rm -f ppl_prolog_generated_test_common.pl
+ at ENABLE_SHARED_TRUE@	if [ $(abs_srcdir) != `pwd` ]; then \
+ at ENABLE_SHARED_TRUE@	  rm -f yap_prolog_generated_test.pl; \
+ at ENABLE_SHARED_TRUE@	  rm -f ppl_yap.pl; \
+ at ENABLE_SHARED_TRUE@        fi
+ at ENABLE_SHARED_TRUE@	rm -f ppl_prolog_generated_test_main.pl
+ at ENABLE_SHARED_TRUE@	diff -u --ignore-all-space $(srcdir)/../tests/expected_pgt obtained_pgt
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# A selection of these files, which depends on the configure options,
+# is built by the `ppl_prolog_domains.cc.stamp' in parent's directory
+# makefile.
+$(nodist_EXTRA_ppl_yap_la_SOURCES):
+../tests/ppl_prolog_generated_test_main.pl:
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/YAP/README.yap b/interfaces/Prolog/YAP/README.yap
new file mode 100644
index 0000000..01c9fda
--- /dev/null
+++ b/interfaces/Prolog/YAP/README.yap
@@ -0,0 +1,23 @@
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+The YAP Prolog interface to the PPL is available as a dynamically
+linked module.  Only YAP version 5.1.1 and following are supported.
+
+In order to dynamically load the library from YAP you should simply
+load `<prefix>/lib/ppl/ppl_yap.pl', where <prefix> is the root of your
+installation (`/usr' or `/usr/local' in most cases).  This will invoke
+`ppl_initialize/0' automatically; it is the programmer's
+responsibility to call `ppl_finalize/0' when the PPL library is no
+longer needed.  Notice that, for dynamic linking to work, you should
+have configured the library with the `--enable-shared' option (on most
+platforms this is the default).
diff --git a/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4 b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
new file mode 100644
index 0000000..3141f40
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_interface_generator_yap_cc.m4
@@ -0,0 +1,165 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file ppl_yap.cc.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_prolog_systems.m4')
+
+m4_divert`'dnl
+/* YAP Prolog interface.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "../ppl_prolog_domains.hh"
+
+#define YAP_STUB_0(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  return name(); \
+}
+
+#define YAP_STUB_1(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  return name(arg1); \
+}
+
+#define YAP_STUB_2(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  return name(arg1, arg2); \
+}
+
+#define YAP_STUB_3(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  return name(arg1, arg2, arg3); \
+}
+
+#define YAP_STUB_4(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  return name(arg1, arg2, arg3, arg4); \
+}
+
+#define YAP_STUB_5(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  return name(arg1, arg2, arg3, arg4, arg5); \
+}
+
+#define YAP_STUB_6(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  Prolog_term_ref arg6 = YAP_ARG6; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6); \
+}
+
+#define YAP_STUB_7(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  Prolog_term_ref arg6 = YAP_ARG6; \
+  Prolog_term_ref arg7 = YAP_ARG7; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
+}
+
+#define YAP_STUB_8(name) \
+extern "C" Prolog_foreign_return_type \
+yap_stub_##name() { \
+  Prolog_term_ref arg1 = YAP_ARG1; \
+  Prolog_term_ref arg2 = YAP_ARG2; \
+  Prolog_term_ref arg3 = YAP_ARG3; \
+  Prolog_term_ref arg4 = YAP_ARG4; \
+  Prolog_term_ref arg5 = YAP_ARG5; \
+  Prolog_term_ref arg6 = YAP_ARG6; \
+  Prolog_term_ref arg7 = YAP_ARG7; \
+  Prolog_term_ref arg8 = YAP_ARG8; \
+  return name(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
+}
+
+dnl
+dnl Place here YAP_STUB macros.
+dnl
+m4_divert(1)dnl
+
+#define YAP_USER_C_PREDICATE(name, arity) \
+ YAP_UserCPredicate(#name, reinterpret_cast<int(*)()>(yap_stub_##name), arity)
+
+extern "C" void
+init() {
+  ppl_initialize();
+
+dnl
+dnl Place here YAP_USER_C_PREDICATE macros.
+dnl
+m4_divert(2)dnl
+}
+dnl
+m4_divert`'dnl
+dnl
+dnl Redefine m4_expanded_procedure_schema to generate YAP stubs.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+YAP_STUB_$2($1)
+')`'dnl
+dnl Generate stubs.
+ppl_prolog_sys_code`'dnl
+m4_undivert(1)
+
+dnl Redefine m4_expanded_procedure_schema to generate YAP user predicates.
+dnl m4_expanded_procedure_schema(Predicate_Name, Arity)
+m4_define(`m4_expanded_procedure_schema', `dnl
+  YAP_USER_C_PREDICATE($1, $2);
+')
+
+dnl Generate user predicates.
+m4_divert`'dnl
+ppl_prolog_sys_code`'dnl
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
new file mode 100644
index 0000000..82b0ffb
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_prolog_sysdep.hh
@@ -0,0 +1,26 @@
+/* System-dependent part of the Prolog interfaces: stub for YAP.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "yap_efli.hh"
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog::YAP;
diff --git a/interfaces/Prolog/YAP/ppl_yap.pl b/interfaces/Prolog/YAP/ppl_yap.pl
new file mode 100644
index 0000000..9cfdcad
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_yap.pl
@@ -0,0 +1,24 @@
+/* Loader for the YAP Prolog interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- load_foreign_files(['ppl_yap'],[],init).
diff --git a/interfaces/Prolog/YAP/yap_cfli.hh b/interfaces/Prolog/YAP/yap_cfli.hh
new file mode 100644
index 0000000..d0dbbc2
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_cfli.hh
@@ -0,0 +1,349 @@
+/* YAP Prolog Common Foreign Language Interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PCFLI_yap_cfli_hh
+#define PCFLI_yap_cfli_hh 1
+
+#include <Yap/YapInterface.h>
+#include <cassert>
+#include <climits>
+#include <gmp.h>
+
+typedef YAP_Term Prolog_term_ref;
+typedef YAP_Atom Prolog_atom;
+typedef YAP_Bool Prolog_foreign_return_type;
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+/*!
+  Return a new term reference.
+*/
+inline Prolog_term_ref
+Prolog_new_term_ref() {
+  return 0;
+}
+
+/*!
+  Make \p t be a reference to the same term referenced by \p u,
+  i.e., assign \p u to \p t.
+*/
+inline int
+Prolog_put_term(Prolog_term_ref& t, Prolog_term_ref u) {
+  t = u;
+  return 1;
+}
+
+/*!
+  Assign to \p t a Prolog integer with value \p l.
+*/
+inline int
+Prolog_put_long(Prolog_term_ref& t, long l) {
+  t = YAP_MkIntTerm(l);
+  return 1;
+}
+
+static int tmp_mpz_t_initialized = 0;
+static mpz_t tmp_mpz_t;
+
+/*!
+  Assign to \p t a Prolog integer with value \p ul.
+*/
+inline int
+Prolog_put_ulong(Prolog_term_ref& t, unsigned long ul) {
+  if (ul <= LONG_MAX)
+    t = YAP_MkIntTerm(ul);
+  else {
+    if (!tmp_mpz_t_initialized) {
+      mpz_init_set_ui(tmp_mpz_t, ul);
+      tmp_mpz_t_initialized = 1;
+    }
+    else
+      mpz_set_ui(tmp_mpz_t, ul);
+    t = YAP_MkBigNumTerm(tmp_mpz_t);
+  }
+  return 1;
+}
+
+/*!
+  Assign to \p t an atom whose name is given
+  by the null-terminated string \p s.
+*/
+inline int
+Prolog_put_atom_chars(Prolog_term_ref& t, const char* s) {
+  t = YAP_MkAtomTerm(YAP_FullLookupAtom(s));
+  return 1;
+}
+
+/*!
+  Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref& t, Prolog_atom a) {
+  t = YAP_MkAtomTerm(a);
+  return 1;
+}
+
+/*!
+  Assign to \p t a term representing the address contained in \p p.
+*/
+inline int
+Prolog_put_address(Prolog_term_ref& t, void* p) {
+  assert(sizeof(long) >= sizeof(void*));
+  t = YAP_MkIntTerm(reinterpret_cast<long>(p));
+  return 1;
+}
+
+/*!
+  Return an atom whose name is given by the null-terminated string \p s.
+*/
+inline Prolog_atom
+Prolog_atom_from_string(const char* s) {
+  return YAP_FullLookupAtom(s);
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 1 with argument \p a1.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1) {
+  YAP_Term args[1];
+  args[0] = a1;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 1), 1, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 2 with arguments \p a1 and \p a2.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2) {
+  YAP_Term args[2];
+  args[0] = a1;
+  args[1] = a2;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 2), 2, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 3 with arguments \p a1, \p a2 and \p a3.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3) {
+  YAP_Term args[3];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 3), 3, args);
+  return 1;
+}
+
+/*!
+  Assign to \p t a compound term whose principal functor is \p f
+  of arity 4 with arguments \p a1, \p a2, \p a3 and \p a4.
+*/
+inline int
+Prolog_construct_compound(Prolog_term_ref& t, Prolog_atom f,
+                          Prolog_term_ref a1, Prolog_term_ref a2,
+                          Prolog_term_ref a3, Prolog_term_ref a4) {
+  YAP_Term args[4];
+  args[0] = a1;
+  args[1] = a2;
+  args[2] = a3;
+  args[3] = a4;
+  t = YAP_MkApplTerm(YAP_MkFunctor(f, 4), 4, args);
+  return 1;
+}
+
+/*!
+  Assign to \p c a Prolog list whose head is \p h and tail is \p t.
+*/
+inline int
+Prolog_construct_cons(Prolog_term_ref& c,
+                      Prolog_term_ref h, Prolog_term_ref t) {
+  c = YAP_MkPairTerm(h, t);
+  return 1;
+}
+
+/*!
+  Raise a Prolog exception with \p t as the exception term.
+*/
+inline void
+Prolog_raise_exception(Prolog_term_ref t) {
+  YAP_Throw(t);
+}
+
+/*!
+  Return true if \p t is a Prolog variable, false otherwise.
+*/
+inline int
+Prolog_is_variable(Prolog_term_ref t) {
+  return YAP_IsVarTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog atom, false otherwise.
+*/
+inline int
+Prolog_is_atom(Prolog_term_ref t) {
+  return YAP_IsAtomTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog integer, false otherwise.
+*/
+inline int
+Prolog_is_integer(Prolog_term_ref t) {
+  return YAP_IsIntTerm(t) != FALSE || YAP_IsBigNumTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is the representation of an address, false otherwise.
+*/
+inline int
+Prolog_is_address(Prolog_term_ref t) {
+  return YAP_IsIntTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog compound term, false otherwise.
+*/
+inline int
+Prolog_is_compound(Prolog_term_ref t) {
+  return YAP_IsApplTerm(t) != FALSE;
+}
+
+/*!
+  Return true if \p t is a Prolog cons (list constructor), false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+  return YAP_IsPairTerm(t) != FALSE;
+}
+
+/*!
+  Assuming \p t is a Prolog integer, return true if its value fits
+  in a long, in which case the value is assigned to \p v,
+  return false otherwise.  The behavior is undefined if \p t is
+  not a Prolog integer.
+*/
+inline int
+Prolog_get_long(Prolog_term_ref t, long* lp) {
+  assert(Prolog_is_integer(t));
+  if (YAP_IsBigNumTerm(t) != FALSE) {
+    if (!tmp_mpz_t_initialized) {
+      mpz_init(tmp_mpz_t);
+      tmp_mpz_t_initialized = 1;
+    }
+    YAP_BigNumOfTerm(t, tmp_mpz_t);
+    if (mpz_cmp_si(tmp_mpz_t, LONG_MIN) >= 0
+        && mpz_cmp_si(tmp_mpz_t, LONG_MAX) <= 0)
+      *lp = mpz_get_si(tmp_mpz_t);
+    else
+      return 0;
+  }
+  else
+    *lp = YAP_IntOfTerm(t);
+  return 1;
+}
+
+/*!
+  If \p t is the Prolog representation for a memory address, return
+  true and store that address into to \p v; return false otherwise.
+  The behavior is undefined if \p t is not an address.
+*/
+inline int
+Prolog_get_address(Prolog_term_ref t, void** vpp) {
+  assert(Prolog_is_address(t));
+  *vpp = reinterpret_cast<void*>(YAP_IntOfTerm(t));
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog atom, return true and store its name into \p name.
+  The behavior is undefined if \p t is not a Prolog atom.
+*/
+inline int
+Prolog_get_atom_name(Prolog_term_ref t, Prolog_atom* ap) {
+  assert(Prolog_is_atom(t));
+  *ap = YAP_AtomOfTerm(t);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term, return true and store its name
+  and arity into \p name and \p arity, respectively.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_compound_name_arity(Prolog_term_ref t, Prolog_atom* ap, int* ip) {
+  assert(Prolog_is_compound(t));
+  YAP_Functor f = YAP_FunctorOfTerm(t);
+  *ap = YAP_NameOfFunctor(f);
+  *ip = YAP_ArityOfFunctor(f);
+  return 1;
+}
+
+/*!
+  If \p t is a Prolog compound term and \p i is a positive integer
+  less than or equal to its arity, return true and assign to \p a the
+  i-th (principal) argument of \p t.
+  The behavior is undefined if \p t is not a Prolog compound term.
+*/
+inline int
+Prolog_get_arg(int i, Prolog_term_ref t, Prolog_term_ref& a) {
+  assert(Prolog_is_compound(t));
+  a = YAP_ArgOfTerm(i, t);
+  return 1;
+}
+
+/*!
+  If \p c is a Prolog cons (list constructor), assign its head and
+  tail to \p h and \p t, respectively.
+  The behavior is undefined if \p c is not a Prolog cons.
+*/
+inline int
+Prolog_get_cons(Prolog_term_ref c, Prolog_term_ref& h, Prolog_term_ref& t) {
+  assert(Prolog_is_cons(c));
+  h = YAP_HeadOfTerm(c);
+  t = YAP_TailOfTerm(c);
+  return 1;
+}
+
+/*!
+  Unify the terms referenced by \p t and \p u and return true
+  if the unification is successful; return false otherwise.
+*/
+inline int
+Prolog_unify(Prolog_term_ref t, Prolog_term_ref u) {
+  return YAP_Unify(t, u) != FALSE;
+}
+
+#endif // !defined(PCFLI_yap_cfli_hh)
diff --git a/interfaces/Prolog/YAP/yap_clpq.pl b/interfaces/Prolog/YAP/yap_clpq.pl
new file mode 100644
index 0000000..c72793c
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq.pl
@@ -0,0 +1,31 @@
+/* Prolog main program for the toy PPL/YAP-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/clpq.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol.
+
+main :-
+    common_main.
diff --git a/interfaces/Prolog/YAP/yap_clpq2.pl b/interfaces/Prolog/YAP/yap_clpq2.pl
new file mode 100644
index 0000000..e582fe3
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq2.pl
@@ -0,0 +1,31 @@
+/* Prolog main program for the 2nd toy PPL/YAP-Prolog CLP(Q) interpreter.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/clpq2.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol.
+
+main :-
+    common_main.
diff --git a/interfaces/Prolog/YAP/yap_efli.cc b/interfaces/Prolog/YAP/yap_efli.cc
new file mode 100644
index 0000000..196f815
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_efli.cc
@@ -0,0 +1,95 @@
+/* YAP extended foreign language interface: definitions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "yap_efli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace YAP {
+
+Prolog_atom a_throw;
+
+bool Prolog_has_unbounded_integers;
+
+long Prolog_min_integer;
+
+long Prolog_max_integer;
+
+mpz_class tmp_mpz_class;
+
+void
+ppl_Prolog_sysdep_init() {
+  Prolog_has_unbounded_integers = true;
+  Prolog_min_integer = 0;
+  Prolog_max_integer = 0;
+
+  a_throw = YAP_LookupAtom("throw");
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n) {
+  assert(Prolog_is_integer(t));
+  if (YAP_IsBigNumTerm(t) != FALSE) {
+    YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+    n = tmp_mpz_class;
+  }
+  else
+    n = YAP_IntOfTerm(t);
+  return 1;
+}
+
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n) {
+  if (n >= LONG_MIN && n <= LONG_MAX) {
+    long l = 0;
+    assign_r(l, n, ROUND_NOT_NEEDED);
+    t = YAP_MkIntTerm(l);
+  }
+  else {
+    assign_r(tmp_mpz_class, n, ROUND_NOT_NEEDED);
+    t = YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
+  }
+  return 1;
+}
+
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n) {
+  Prolog_term_ref u = Prolog_new_term_ref();
+  return Prolog_put_Coefficient(u, n) && YAP_Unify(t, u);
+}
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/Prolog/YAP/yap_efli.hh b/interfaces/Prolog/YAP/yap_efli.hh
new file mode 100644
index 0000000..98fb20d
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_efli.hh
@@ -0,0 +1,91 @@
+/* YAP extended foreign language interface: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_yap_efli_hh
+#define PPL_yap_efli_hh 1
+
+#include "ppl.hh"
+#include "yap_cfli.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+namespace YAP {
+
+//extern Prolog_atom a_throw;
+
+/*!
+  True if and only if the Prolog engine supports unbounded integers.
+*/
+extern bool Prolog_has_unbounded_integers;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the minimum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_min_integer;
+
+/*!
+  If \p Prolog_has_unbounded_integers is false, holds the maximum
+  integer value representable by a Prolog integer.
+  Holds zero otherwise.
+*/
+extern long Prolog_max_integer;
+
+/*!
+  Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init();
+
+/*!
+  Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit();
+
+// FIXME: write the documentation.
+int
+Prolog_get_Coefficient(Prolog_term_ref t, Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_unify_Coefficient(Prolog_term_ref t, const Coefficient& n);
+
+// FIXME: write the documentation.
+int
+Prolog_put_Coefficient(Prolog_term_ref& t, const Coefficient& n);
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_yap_efli_hh)
diff --git a/interfaces/Prolog/YAP/yap_pl_check.pl b/interfaces/Prolog/YAP/yap_pl_check.pl
new file mode 100644
index 0000000..40adbb8
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_pl_check.pl
@@ -0,0 +1,35 @@
+/* Prolog main program for the PPL/YAP-Prolog predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('../tests/pl_check.pl').
+
+prolog_system('YAP').
+
+main :-
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl.
diff --git a/interfaces/Prolog/YAP/yap_prolog_generated_test.pl b/interfaces/Prolog/YAP/yap_prolog_generated_test.pl
new file mode 100644
index 0000000..af68b4b
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_prolog_generated_test.pl
@@ -0,0 +1,36 @@
+/* Prolog main program for the PPL/YAP-Prolog predicate checker.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+:- ensure_loaded('ppl_yap.pl').
+:- ensure_loaded('ppl_prolog_generated_test_main.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+prolog_system('YAP').
+
+main :-
+    (check_all ->
+        write('OK')
+    ;
+        write('FAILURE')
+    ),
+    nl.
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
new file mode 100644
index 0000000..3038173
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_code.m4
@@ -0,0 +1,2156 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+This m4 file contains the program code for generating the
+files ppl_prolog_DOMAIN.cc for each interface domain DOMAIN
+in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Prolog_term_ref t_nd,
+                                               Prolog_term_ref t_uoe,
+                                               Prolog_term_ref t_ph) {
+  static const char* where = "ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension/3";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    Prolog_atom uoe = term_to_universe_or_empty(t_uoe, where);
+
+    if (uoe == a_empty)
+      ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned<dimension_type>(t_nd,
+                                                                      where),
+                                     EMPTY);
+    else
+      ph = new @TOPOLOGY@@CPP_CLASS@(term_to_unsigned<dimension_type>(t_nd,
+                                                                      where),
+                                     UNIVERSE);
+
+      Prolog_term_ref tmp = Prolog_new_term_ref();
+      Prolog_put_address(tmp, ph);
+      if (Prolog_unify(t_ph, tmp)) {
+        PPL_REGISTER(ph);
+        return PROLOG_SUCCESS;
+      }
+      else
+        delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@
+(Prolog_term_ref t_ph_source, Prolog_term_ref t_ph)
+{
+  static const char* where
+    = "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@/2";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    const @B_FRIEND@* const ph_source
+      = static_cast<const @B_FRIEND@*>
+        (term_to_handle<@B_FRIEND@ >(t_ph_source, where));
+    PPL_CHECK(ph_source);
+    ph = new @TOPOLOGY@@CPP_CLASS@(*ph_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(
+                     Prolog_term_ref t_ph_source,
+                     Prolog_term_ref t_ph,
+                     Prolog_term_ref t_cc)
+{
+  static const char* where =
+                   "ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity/3";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    const @B_FRIEND@* ph_source
+        = static_cast<const @B_FRIEND@*>
+        (term_to_handle<@B_FRIEND@ >(t_ph_source, where));
+
+    Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+    Complexity_Class cc;
+    if (p_cc == a_polynomial)
+      cc = POLYNOMIAL_COMPLEXITY;
+    else if (p_cc == a_simplex)
+      cc = SIMPLEX_COMPLEXITY;
+    else
+      cc = ANY_COMPLEXITY;
+
+    PPL_CHECK(ph_source);
+    ph = new @TOPOLOGY@@CPP_CLASS@(*ph_source, cc);
+
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(Prolog_term_ref t_clist,
+                                                    Prolog_term_ref t_ph)
+{
+  static const char* where =
+    "ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s/2";
+  try {
+    @!BUILD_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at BUILD_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    @TOPOLOGY@@CPP_CLASS@* ph;
+    ph = new @TOPOLOGY@@CPP_CLASS@(cs at RECYCLE@);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+  m4_define(`ppl_ at CLASS@_swap_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_swap/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    swap(*lhs, *rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_delete_ at CLASS@(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_delete_ at CLASS@/1";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_UNREGISTER(ph);
+    delete ph;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+  static const char* where = "ppl_ at CLASS@_ at DIMENSION@/2";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (unify_ulong(t_sd, ph->@DIMENSION@()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+                                   Prolog_term_ref t_glist) {
+  static const char* where = "ppl_ at CLASS@_get_ at CLASS_REPRESENT@s/2";
+  try {
+    const @CPP_CLASS@* const ph
+      = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const @!CLASS_REPRESENT at _System& gs = ph->@CLASS_REPRESENT at s();
+    for (@!CLASS_REPRESENT at _System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i)
+      Prolog_construct_cons(tail, @CLASS_REPRESENT at _term(*i), tail);
+
+    if (Prolog_unify(t_glist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+                                             Prolog_term_ref t_glist) {
+  static const char* where = "ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s/2";
+  try {
+    const @CPP_CLASS@* const ph
+      = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const @!CLASS_REPRESENT at _System& gs = ph->minimized_ at CLASS_REPRESENT@s();
+    for (@!CLASS_REPRESENT at _System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i)
+      Prolog_construct_cons(tail, @CLASS_REPRESENT at _term(*i), tail);
+
+    if (Prolog_unify(t_glist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BEGINEND@_iterator(Prolog_term_ref t_pps,
+                                  Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_ at BEGINEND@_iterator/2";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    @CPP_CLASS@::iterator* i = new @CPP_CLASS@::iterator(pps->@BEGINEND@());
+    Prolog_term_ref t_i = Prolog_new_term_ref();
+    Prolog_put_address(t_i, i);
+
+    if (Prolog_unify(t_it, t_i)) {
+      PPL_REGISTER(i);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete i;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at CLASS@_iterator_from_iterator(Prolog_term_ref t_source,
+                                       Prolog_term_ref t_it) {
+  static const char* where = "ppl_new_ at CLASS@_iterator_from_iterator/2";
+  try {
+    const @CPP_CLASS@::iterator* source
+      = term_to_handle<const @CPP_CLASS@::iterator>(t_source, where);
+    PPL_CHECK(source);
+
+    @CPP_CLASS@::iterator* it = new @CPP_CLASS@::iterator(*source);
+    Prolog_term_ref t_i = Prolog_new_term_ref();
+    Prolog_put_address(t_i, it);
+
+    if (Prolog_unify(t_it, t_i)) {
+      PPL_REGISTER(it);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete it;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_delete_ at CLASS@_iterator(Prolog_term_ref t_it) {
+  static const char* where = "ppl_delete_ at CLASS@_iterator/1";
+  try {
+    const @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_UNREGISTER(it);
+    delete it;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at INCDEC@_iterator(Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_ at INCDEC@_iterator/2";
+  try {
+    @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_CHECK(it);
+    @B_INCDEC@(*it);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1,
+                                       Prolog_term_ref t_it2) {
+  static const char* where = "ppl_ at CLASS@_iterator_equals_iterator/2";
+  try {
+    @CPP_CLASS@::iterator* it1
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it1, where);
+    PPL_CHECK(it1);
+    @CPP_CLASS@::iterator* it2
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it2, where);
+    PPL_CHECK(it2);
+    if (*it1 == *it2)
+      return PROLOG_SUCCESS;
+    else
+      return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_disjunct(Prolog_term_ref t_it,
+                           Prolog_term_ref t_disj) {
+  static const char* where = "ppl_ at CLASS@_get_disjunct/2";
+  try {
+    const @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_CHECK(it);
+
+    @DISJUNCT_TOPOLOGY@@A_DISJUNCT@* disj
+      = const_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>(&((*it)->pointset()));
+    Prolog_term_ref t_d = Prolog_new_term_ref();
+    Prolog_put_address(t_d, disj);
+
+    if (Prolog_unify(t_disj, t_d)) {
+      PPL_WEAK_REGISTER(disj);
+      return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_disjunct(Prolog_term_ref t_pps,
+                            Prolog_term_ref t_it) {
+  static const char* where = "ppl_ at CLASS@_drop_disjuncts/2";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    @CPP_CLASS@::iterator* it
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it, where);
+    PPL_CHECK(it);
+
+    @CPP_CLASS@::iterator& i = *it;
+    i = pps->drop_disjunct(i);
+
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_disjuncts(Prolog_term_ref t_pps,
+                             Prolog_term_ref t_it1,
+                             Prolog_term_ref t_it2) {
+  static const char* where = "ppl_ at CLASS@_drop_disjuncts/3";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    @CPP_CLASS@::iterator* it1
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it1, where);
+    PPL_CHECK(it1);
+    @CPP_CLASS@::iterator* it2
+      = term_to_handle<@CPP_CLASS@::iterator >(t_it2, where);
+    PPL_CHECK(it2);
+
+    @CPP_CLASS@::iterator& i1 = *it1;
+    @CPP_CLASS@::iterator& i2 = *it2;
+    pps->drop_disjuncts(i1, i2);
+
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_add_disjunct/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @DISJUNCT_TOPOLOGY@@A_DISJUNCT@* d =
+      static_cast<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@*>
+      (term_to_handle<@DISJUNCT_TOPOLOGY@@A_DISJUNCT@ >(t_d, where));
+    PPL_CHECK(d);
+    ph->add_disjunct(*d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+extern "C" Prolog_foreign_return_type
+ppl_ at CLASS@_linear_ at PARTITION@(Prolog_term_ref t_ph,
+                             Prolog_term_ref t_qh,
+                             Prolog_term_ref t_inters,
+                             Prolog_term_ref t_pset) {
+  try {
+    static const char* where = "ppl_ at CLASS@_linear_partition/4";
+    @CPP_CLASS@* rfh;
+    Pointset_Powerset<NNC_Polyhedron>* rsh;
+`m4_ifelse(m4_current_interface, `Polyhedron',
+  `m4_linear_partition_for_polyhedron_domains',
+           `m4_linear_partition_for_non_polyhedron_domains')'
+    Prolog_term_ref t_r_first = Prolog_new_term_ref();
+    Prolog_term_ref t_r_second = Prolog_new_term_ref();
+    Prolog_put_address(t_r_first, rfh);
+    Prolog_put_address(t_r_second, rsh);
+    if (Prolog_unify(t_inters, t_r_first)
+        && Prolog_unify(t_pset, t_r_second)) {
+      PPL_REGISTER(rfh);
+      PPL_REGISTER(rsh);
+      return PROLOG_SUCCESS;
+    }
+    else {
+      delete rfh;
+      delete rsh;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`m4_linear_partition_for_polyhedron_domains',
+`    const Polyhedron* xph = term_to_handle<Polyhedron>(t_ph, where);
+    if (Interfaces::is_necessarily_closed_for_interfaces(*xph)) {
+      const C_Polyhedron* ph = term_to_handle<C_Polyhedron>(t_ph, where);
+      const C_Polyhedron* qh = term_to_handle<C_Polyhedron>(t_qh, where);
+      PPL_CHECK(ph);
+      PPL_CHECK(qh);
+      std::pair<C_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+        r = linear_partition(*ph, *qh);
+      rfh = new C_Polyhedron(0, EMPTY);
+      rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+      swap(*rfh, r.first);
+      swap(*rsh, r.second);
+    }
+    else {
+      const NNC_Polyhedron* ph = term_to_handle<NNC_Polyhedron>(t_ph, where);
+      const NNC_Polyhedron* qh = term_to_handle<NNC_Polyhedron>(t_qh, where);
+      PPL_CHECK(ph);
+      PPL_CHECK(qh);
+      std::pair<NNC_Polyhedron|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+        r = linear_partition(*ph, *qh);
+      rfh = new NNC_Polyhedron(0, EMPTY);
+      rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+      swap(*rfh, r.first);
+      swap(*rsh, r.second);
+    }
+')
+
+m4_define(`m4_linear_partition_for_non_polyhedron_domains',
+`  const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+  const @CPP_CLASS@* qh = term_to_handle<@CPP_CLASS@ >(t_qh, where);
+  PPL_CHECK(ph);
+  PPL_CHECK(qh);
+  std::pair<@CPP_CLASS@|COMMA| Pointset_Powerset<NNC_Polyhedron> >
+    r = linear_partition(*ph, *qh);
+  rfh = new @CPP_CLASS@(0, EMPTY);
+  rsh = new Pointset_Powerset<NNC_Polyhedron>(0, EMPTY);
+  swap(*rfh, r.first);
+  swap(*rsh, r.second);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+  `dnl
+  extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_approximate_ at PARTITION@(Prolog_term_ref t_ph,
+                                    Prolog_term_ref t_qh,
+                                    Prolog_term_ref t_finite,
+                                    Prolog_term_ref t_inters,
+                                    Prolog_term_ref t_pset) {
+  static const char* where = "ppl_ at CLASS@_approximate_partition/5";
+  try {
+    const @CLASS@* ph =
+      term_to_handle<@CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const @CLASS@* qh =
+      term_to_handle<@CLASS@ >(t_qh, where);
+    PPL_CHECK(qh);
+    bool finite;
+
+    std::pair<@CLASS@|COMMA| Pointset_Powerset<Grid> > r =
+      approximate_partition(*ph, *qh, finite);
+
+    @CLASS@* rfh = new @CLASS@(EMPTY);
+    swap(*rfh, r.first);
+
+    Pointset_Powerset<Grid>* rsh =
+      new Pointset_Powerset<Grid>(EMPTY);
+    swap(*rsh, r.second);
+
+    Prolog_term_ref t_b = Prolog_new_term_ref();
+    Prolog_term_ref t_r_first = Prolog_new_term_ref();
+    Prolog_term_ref t_r_second = Prolog_new_term_ref();
+    Prolog_atom a = (finite ? a_true : a_false);
+    Prolog_put_atom(t_b, a);
+
+    Prolog_put_address(t_r_first, rfh);
+    Prolog_put_address(t_r_second, rsh);
+
+    if (Prolog_unify(t_inters, t_r_first)
+        && Prolog_unify(t_pset, t_r_second
+                        && Prolog_unify(t_finite, t_b)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(Prolog_term_ref t_ph,
+                                                 Prolog_term_ref t_c,
+                                                 Prolog_term_ref t_r) {
+  static const char* where =
+    "ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+relation_with_ at RELATION_REPRESENT@_code
+      if (Prolog_unify(t_r, tail))
+        return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`relation_with_constraint_code', `
+  Poly_Con_Relation r = ph->relation_with(build_constraint(t_c, where));
+
+  Prolog_term_ref tail = Prolog_new_term_ref();
+  Prolog_put_atom(tail, a_nil);
+  while (r != Poly_Con_Relation::nothing()) {
+    if (r.implies(Poly_Con_Relation::is_disjoint())) {
+      Prolog_term_ref t_dis = Prolog_new_term_ref();
+      Prolog_put_atom(t_dis, a_is_disjoint);
+      Prolog_construct_cons(tail, t_dis, tail);
+      r = r - Poly_Con_Relation::is_disjoint();
+    }
+    else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+      Prolog_term_ref t_sin = Prolog_new_term_ref();
+      Prolog_put_atom(t_sin, a_strictly_intersects);
+      Prolog_construct_cons(tail, t_sin, tail);
+      r = r - Poly_Con_Relation::strictly_intersects();
+    }
+    else if (r.implies(Poly_Con_Relation::is_included())) {
+      Prolog_term_ref t_inc = Prolog_new_term_ref();
+      Prolog_put_atom(t_inc, a_is_included);
+      Prolog_construct_cons(tail, t_inc, tail);
+      r = r - Poly_Con_Relation::is_included();
+    }
+    else if (r.implies(Poly_Con_Relation::saturates())) {
+      Prolog_term_ref t_sat = Prolog_new_term_ref();
+      Prolog_put_atom(t_sat, a_saturates);
+      Prolog_construct_cons(tail, t_sat, tail);
+      r = r - Poly_Con_Relation::saturates();
+    }
+   }
+')
+
+m4_define(`relation_with_congruence_code', `
+  Poly_Con_Relation r = ph->relation_with(build_congruence(t_c, where));
+
+  Prolog_term_ref tail = Prolog_new_term_ref();
+  Prolog_put_atom(tail, a_nil);
+  while (r != Poly_Con_Relation::nothing()) {
+    if (r.implies(Poly_Con_Relation::is_disjoint())) {
+      Prolog_term_ref t_dis = Prolog_new_term_ref();
+      Prolog_put_atom(t_dis, a_is_disjoint);
+      Prolog_construct_cons(tail, t_dis, tail);
+      r = r - Poly_Con_Relation::is_disjoint();
+    }
+    else if (r.implies(Poly_Con_Relation::strictly_intersects())) {
+      Prolog_term_ref t_sin = Prolog_new_term_ref();
+      Prolog_put_atom(t_sin, a_strictly_intersects);
+      Prolog_construct_cons(tail, t_sin, tail);
+      r = r - Poly_Con_Relation::strictly_intersects();
+    }
+    else if (r.implies(Poly_Con_Relation::is_included())) {
+      Prolog_term_ref t_inc = Prolog_new_term_ref();
+      Prolog_put_atom(t_inc, a_is_included);
+      Prolog_construct_cons(tail, t_inc, tail);
+      r = r - Poly_Con_Relation::is_included();
+    }
+    else if (r.implies(Poly_Con_Relation::saturates())) {
+      Prolog_term_ref t_sat = Prolog_new_term_ref();
+      Prolog_put_atom(t_sat, a_saturates);
+      Prolog_construct_cons(tail, t_sat, tail);
+      r = r - Poly_Con_Relation::saturates();
+    }
+    else
+      break;
+   }
+')
+
+m4_define(`relation_with_generator_code', `
+  Poly_Gen_Relation r = ph->relation_with(build_generator(t_c, where));
+
+  Prolog_term_ref tail = Prolog_new_term_ref();
+Prolog_put_atom(tail, a_nil);
+while (r != Poly_Gen_Relation::nothing()) {
+  if (r.implies(Poly_Gen_Relation::subsumes())) {
+    Prolog_term_ref t_sub = Prolog_new_term_ref();
+    Prolog_put_atom(t_sub, a_subsumes);
+    Prolog_construct_cons(tail, t_sub, tail);
+    r = r - Poly_Gen_Relation::subsumes();
+  }
+ }
+')
+
+m4_define(`relation_with_grid_generator_code', `
+  Poly_Gen_Relation r = ph->relation_with(build_grid_generator(t_c, where));
+
+  Prolog_term_ref tail = Prolog_new_term_ref();
+  Prolog_put_atom(tail, a_nil);
+  while (r != Poly_Gen_Relation::nothing()) {
+    if (r.implies(Poly_Gen_Relation::subsumes())) {
+      Prolog_term_ref t_sub = Prolog_new_term_ref();
+      Prolog_put_atom(t_sub, a_subsumes);
+      Prolog_construct_cons(tail, t_sub, tail);
+      r = r - Poly_Gen_Relation::subsumes();
+    }
+   }
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at HAS_PROPERTY@(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_ at HAS_PROPERTY@/1";
+  try {
+    const @CPP_CLASS@* const ph
+      = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->@HAS_PROPERTY@())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at SIMPLIFY@(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_ at SIMPLIFY@/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->@SIMPLIFY@();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_v) {
+  static const char* where = "ppl_ at CLASS@__unconstrain/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->unconstrain(term_to_Variable(t_v, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_ at CLASS@__unconstrain/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set unconstrain_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      unconstrain_variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+    ph->unconstrain(unconstrain_variables);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_constrains(Prolog_term_ref t_ph,
+                          Prolog_term_ref t_v) {
+  static const char* where = "ppl_ at CLASS@__constrains/1";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->constrains(term_to_Variable(t_v, where)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(Prolog_term_ref t_ph,
+                                       Prolog_term_ref t_expr) {
+  static const char* where = "ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Linear_Expression l = build_linear_expression(t_expr, where);
+    if (ph->bounds_from_ at ABOVEBELOW@(l))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_has_ at UPPERLOWER@_bound(Prolog_term_ref t_ph,
+                       Prolog_term_ref t_v,
+                       Prolog_term_ref t_n, Prolog_term_ref t_d,
+                       Prolog_term_ref t_closed) {
+  static const char* where = "ppl_ at CLASS@_has_ at UPPERLOWER@_bound/5";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Variable v = term_to_Variable(t_v, where);
+    PPL_DIRTY_TEMP_COEFFICIENT(n);
+    PPL_DIRTY_TEMP_COEFFICIENT(d);
+    bool closed;
+    if (ph->has_ at UPPERLOWER@_bound(v, n, d, closed)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      Prolog_atom a = (closed ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify_Coefficient(t_n, n)
+          && Prolog_unify_Coefficient(t_d, d)
+          && Prolog_unify(t_closed, t))
+        return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+                       Prolog_term_ref t_n,  Prolog_term_ref t_d,
+                       Prolog_term_ref t_maxmin) {
+  static const char* where = "ppl_ at CLASS@_ at MAXMIN@/5";
+  try {
+    const @CPP_CLASS@* const ph
+      = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    PPL_DIRTY_TEMP_COEFFICIENT(n);
+    PPL_DIRTY_TEMP_COEFFICIENT(d);
+    bool maxmin;
+    if (ph->@MAXMIN@(le, n, d, maxmin)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      const Prolog_atom a = (maxmin ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify_Coefficient(t_n, n)
+          && Prolog_unify_Coefficient(t_d, d)
+          && Prolog_unify(t_maxmin, t))
+        return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+`extern "C" Prolog_foreign_return_type
+ppl_ at CLASS@_ at MAXMIN@_with_point
+(Prolog_term_ref t_ph,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_n, Prolog_term_ref t_d,
+ Prolog_term_ref t_maxmin, Prolog_term_ref t_g) {
+  static const char* where = "ppl_ at CLASS@_ at MAXMIN@_with_point/6";
+  try {
+    const @CPP_CLASS@* const ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    PPL_DIRTY_TEMP_COEFFICIENT(n);
+    PPL_DIRTY_TEMP_COEFFICIENT(d);
+    bool maxmin;
+    Generator g(point());
+    if (ph->@MAXMIN@(le, n, d, maxmin, g)) {
+      Prolog_term_ref t = Prolog_new_term_ref();
+      const Prolog_atom a = (maxmin ? a_true : a_false);
+      Prolog_put_atom(t, a);
+      if (Prolog_unify_Coefficient(t_n, n)
+          && Prolog_unify_Coefficient(t_d, d)
+          && Prolog_unify(t_maxmin, t)
+          && Prolog_unify(t_g, generator_term(g)))
+        return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(Prolog_term_ref t_lhs,
+                                   Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at COMPARISON@_ at CLASS@/2";
+  try {
+    const @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    if (lhs->@COMPARISON@(*rhs))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_equals_ at CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_equals_ at CLASS@/2";
+  try {
+    const @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    if (*lhs == *rhs)
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_OK(Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_OK/1";
+  try {
+    const @CPP_CLASS@* const ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    if (ph->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at CLASS_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
+  static const char* where = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->add_ at CLASS_REPRESENT@(build_ at CLASS_REPRESENT@(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(Prolog_term_ref t_ph,
+                                             Prolog_term_ref t_c) {
+  static const char* where = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->refine_with_ at REFINE_REPRESENT@(build_ at REFINE_REPRESENT@(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+                                   Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_add_ at CLASS_REPRESENT@s/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @!CLASS_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at CLASS_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    ph->add_ at CLASS_REPRESENT@s(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(Prolog_term_ref t_ph,
+                                   Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    @!REFINE_REPRESENT at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at REFINE_REPRESENT@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    ph->refine_with_ at REFINE_REPRESENT@s(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`bop_assign_code',
+`namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+Prolog_foreign_return_type
+bop_assign(Prolog_term_ref t_lhs,
+           Prolog_term_ref t_rhs,
+           void (@CPP_CLASS@::* bop_assign)(const @CPP_CLASS@&),
+           const char* where) {
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    (lhs->*bop_assign)(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BINOP@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at BINOP@";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->@BINOP@(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_positive_time_elapse_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_positive_time_elapse_assign";
+  try {
+    const Polyhedron* xlhs = term_to_handle<Polyhedron >(t_lhs, where);
+    if (Interfaces::is_necessarily_closed_for_interfaces(*xlhs)) {
+      C_Polyhedron* lhs = term_to_handle<C_Polyhedron >(t_lhs, where);
+      const C_Polyhedron* rhs = term_to_handle<C_Polyhedron >(t_rhs, where);
+      PPL_CHECK(lhs);
+      PPL_CHECK(rhs);
+      lhs->positive_time_elapse_assign(*rhs);
+    }
+    else {
+      NNC_Polyhedron* lhs = term_to_handle<NNC_Polyhedron >(t_lhs, where);
+      const NNC_Polyhedron* rhs = term_to_handle<NNC_Polyhedron >(t_rhs, where);
+      PPL_CHECK(lhs);
+      PPL_CHECK(rhs);
+      lhs->positive_time_elapse_assign(*rhs);
+    }
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_simplify_using_context_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b) {
+  static const char* where = "ppl_ at CLASS@_simplify_using_context_assign";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    Prolog_term_ref t_is_intersect = Prolog_new_term_ref();
+    Prolog_atom is_intersect
+      = (lhs->simplify_using_context_assign(*rhs) ? a_true : a_false);
+    Prolog_put_atom(t_is_intersect, is_intersect);
+    if (Prolog_unify(t_b, t_is_intersect))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at UB_EXACT@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at UB_EXACT@";
+  try {
+`m4_ifelse(m4_current_interface, `Polyhedron',
+  `m4_ub_exact_for_polyhedron_domains',
+           `m4_ub_exact_for_non_polyhedron_domains')'
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`m4_ub_exact_for_polyhedron_domains',
+`   const Polyhedron* xlhs = term_to_handle<Polyhedron >(t_lhs, where);
+ if (Interfaces::is_necessarily_closed_for_interfaces(*xlhs)) {
+     C_Polyhedron* lhs = term_to_handle<C_Polyhedron >(t_lhs, where);
+     const C_Polyhedron* rhs = term_to_handle<C_Polyhedron >(t_rhs, where);
+     PPL_CHECK(lhs);
+     PPL_CHECK(rhs);
+     return lhs->@UB_EXACT@(*rhs) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+   }
+   else {
+     NNC_Polyhedron* lhs = term_to_handle<NNC_Polyhedron >(t_lhs, where);
+     const NNC_Polyhedron* rhs = term_to_handle<NNC_Polyhedron >(t_rhs, where);
+     PPL_CHECK(lhs);
+     PPL_CHECK(rhs);
+     return lhs->@UB_EXACT@(*rhs) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+   }
+')
+
+m4_define(`m4_ub_exact_for_non_polyhedron_domains',
+`   @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    return lhs->@UB_EXACT@(*rhs) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d) {
+  const char* where = "ppl_ at CLASS@_ at AFFIMAGE@/4";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->@AFFIMAGE@(term_to_Variable(t_v, where),
+                   build_linear_expression(t_le, where),
+                   term_to_Coefficient(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d, Prolog_term_ref t_m) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@/6";
+  try {
+    @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where);
+    PPL_CHECK(ph);
+    ph->generalized_ at AFFIMAGE@(term_to_Variable(t_v, where),
+                               term_to_relation_symbol(t_r, where),
+                               build_linear_expression(t_le, where),
+                               term_to_Coefficient(t_d, where),
+                               term_to_Coefficient(t_m, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@/5";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->generalized_ at AFFIMAGE@(term_to_Variable(t_v, where),
+                               term_to_relation_symbol(t_r, where),
+                               build_linear_expression(t_le, where),
+                               term_to_Coefficient(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_m) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/5";
+  try {
+    @CLASS@* ph = term_to_handle<@CLASS@>(t_ph, where);
+    PPL_CHECK(ph);
+    ph->generalized_ at AFFIMAGE@(build_linear_expression(t_lhs, where),
+                               term_to_relation_symbol(t_r, where),
+                               build_linear_expression(t_rhs, where),
+                               term_to_Coefficient(t_m, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/4";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Relation_Symbol r = term_to_relation_symbol(t_r, where);
+    ph->generalized_ at AFFIMAGE@(build_linear_expression(t_lhs, where),
+                               r,
+                               build_linear_expression(t_rhs, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounded_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_lb_le, Prolog_term_ref t_ub_le,
+   Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_bounded_ at AFFIMAGE@/5";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->bounded_ at AFFIMAGE@(term_to_Variable(t_v, where),
+                           build_linear_expression(t_lb_le, where),
+                           build_linear_expression(t_ub_le, where),
+                           term_to_Coefficient(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+  (Prolog_term_ref t_pset) {
+  static const char* where = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/1";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+    PPL_CHECK(pset);
+    if (Parma_Polyhedra_Library::termination_test_ at TERMINATION_ID@(*pset))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+  (Prolog_term_ref t_pset_before, Prolog_term_ref t_pset_after) {
+  static const char* where
+      = "ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/2";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset_before
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+    @TOPOLOGY@@CPP_CLASS@* pset_after
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+    PPL_CHECK(pset_before);
+    PPL_CHECK(pset_after);
+    if (Parma_Polyhedra_Library
+        ::termination_test_ at TERMINATION_ID@_2(*pset_before, *pset_after))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+  (Prolog_term_ref t_pset,
+   Prolog_term_ref t_g) {
+  static const char* where
+     = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+    Generator gg(point());
+    PPL_CHECK(pset);
+    if (Parma_Polyhedra_Library
+        ::one_affine_ranking_function_ at TERMINATION_ID@(*pset, gg)
+        && Prolog_unify(t_g, generator_term(gg)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+  (Prolog_term_ref t_pset_before,
+   Prolog_term_ref t_pset_after,
+   Prolog_term_ref t_g) {
+  static const char* where
+     = "ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset_before
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+    @TOPOLOGY@@CPP_CLASS@* pset_after
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+    Generator gg(point());
+    PPL_CHECK(pset_before);
+    PPL_CHECK(pset_after);
+    if (Parma_Polyhedra_Library
+        ::one_affine_ranking_function_ at TERMINATION_ID@_2(*pset_before,
+                                                         *pset_after,
+                                                         gg)
+        && Prolog_unify(t_g, generator_term(gg)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+  (Prolog_term_ref t_pset,
+   Prolog_term_ref t_ph) {
+  static const char* where =
+      "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+    PPL_CHECK(pset);
+    @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+    Parma_Polyhedra_Library
+      ::all_affine_ranking_functions_ at TERMINATION_ID@(*pset, *ph);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+  (Prolog_term_ref t_pset_before,
+   Prolog_term_ref t_pset_after,
+   Prolog_term_ref t_ph) {
+  static const char* where =
+      "ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset_before
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+    @TOPOLOGY@@CPP_CLASS@* pset_after
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+    PPL_CHECK(pset_before);
+    PPL_CHECK(pset_after);
+    @A_TERMINATION_ID at Polyhedron* ph = new @A_TERMINATION_ID at Polyhedron();
+    Parma_Polyhedra_Library
+      ::all_affine_ranking_functions_ at TERMINATION_ID@_2(*pset_before,
+                                                        *pset_after,
+                                                        *ph);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, ph);
+    if (Prolog_unify(t_ph, tmp)) {
+      PPL_REGISTER(ph);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete ph;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+  (Prolog_term_ref t_pset,
+   Prolog_term_ref t_ph_decreasing,
+   Prolog_term_ref t_ph_bounded) {
+  static const char* where =
+      "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@/3";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset, where);
+    PPL_CHECK(pset);
+    C_Polyhedron* ph_decreasing = new C_Polyhedron();
+    C_Polyhedron* ph_bounded = new C_Polyhedron();
+    Parma_Polyhedra_Library
+      ::all_affine_quasi_ranking_functions_MS(*pset,
+                                              *ph_decreasing, *ph_bounded);
+    Prolog_term_ref tmp_decreasing = Prolog_new_term_ref();
+    Prolog_put_address(tmp_decreasing, ph_decreasing);
+    Prolog_term_ref tmp_bounded = Prolog_new_term_ref();
+    Prolog_put_address(tmp_bounded, ph_bounded);
+    if (Prolog_unify(t_ph_decreasing, tmp_decreasing)
+        && Prolog_unify(t_ph_bounded, tmp_bounded)) {
+      PPL_REGISTER(ph_decreasing);
+      PPL_REGISTER(ph_bounded);
+      return PROLOG_SUCCESS;
+    }
+    else {
+      delete ph_decreasing;
+      delete ph_bounded;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+  (Prolog_term_ref t_pset_before,
+   Prolog_term_ref t_pset_after,
+   Prolog_term_ref t_ph_decreasing,
+   Prolog_term_ref t_ph_bounded) {
+  static const char* where =
+      "ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2/4";
+  try {
+    @TOPOLOGY@@CPP_CLASS@* pset_before
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_before, where);
+    @TOPOLOGY@@CPP_CLASS@* pset_after
+       = term_to_handle<@TOPOLOGY@@CPP_CLASS@ >(t_pset_after, where);
+    PPL_CHECK(pset_before);
+    PPL_CHECK(pset_after);
+    C_Polyhedron* ph_decreasing = new C_Polyhedron();
+    C_Polyhedron* ph_bounded = new C_Polyhedron();
+    Parma_Polyhedra_Library
+      ::all_affine_quasi_ranking_functions_MS_2(*pset_before, *pset_after,
+                                                *ph_decreasing, *ph_bounded);
+    Prolog_term_ref tmp_decreasing = Prolog_new_term_ref();
+    Prolog_put_address(tmp_decreasing, ph_decreasing);
+    Prolog_term_ref tmp_bounded = Prolog_new_term_ref();
+    Prolog_put_address(tmp_bounded, ph_bounded);
+    if (Prolog_unify(t_ph_decreasing, tmp_decreasing)
+        && Prolog_unify(t_ph_bounded, tmp_bounded)) {
+      PPL_REGISTER(ph_decreasing);
+      PPL_REGISTER(ph_bounded);
+      return PROLOG_SUCCESS;
+    }
+    else {
+      delete ph_decreasing;
+      delete ph_bounded;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->@WIDEN at _widening_assign(*rhs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at WIDEN@_widening_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->@WIDEN at _widening_assign(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_widening_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->widening_assign(*rhs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_widening_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->widening_assign(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->@EXTRAPOLATION at _extrapolation_assign(*rhs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+
+    lhs->@EXTRAPOLATION at _extrapolation_assign(*rhs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    lhs->@EXTRAPOLATION at _narrowing_assign(*rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+
+dnl FIXME: This code is redundant as there is no options for tokens
+dnl        in the current C++ code.
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens(
+                                                                                      Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+                                                                                      Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens/4";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+      (*rhs,
+       widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+       &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+                                                                          Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    lhs->BHZ03_widening_assign<@A_DISJUNCT_WIDEN at _Certificate>
+      (*rhs,
+       widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+                                                          Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+                                                          Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    lhs->BGP99_extrapolation_assign
+      (*rhs,
+       widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_WIDEN at _widening_assign),
+       term_to_unsigned<unsigned>(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+                                                                  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+                                                                  Prolog_term_ref t_d) {
+  static const char* where = "ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    PPL_CHECK(lhs);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(rhs);
+
+    lhs->BGP99_extrapolation_assign
+      (*rhs,
+       widen_fun_ref(&@DISJUNCT_TOPOLOGY@@A_DISJUNCT@::@DISJUNCT_EXTRAPOLATION at _extrapolation_assign),
+       term_to_unsigned<unsigned>(t_d, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to) {
+  static const char* where = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens/5";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    @!CONSTRAINER at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at CONSTRAINER@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    unsigned t = term_to_unsigned<unsigned>(t_ti, where);
+    lhs->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*rhs, cs, &t);
+    if (unify_long(t_to, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist) {
+  static const char* where = "ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign/3";
+  try {
+    @CPP_CLASS@* lhs = term_to_handle<@CPP_CLASS@ >(t_lhs, where);
+    const @CPP_CLASS@* rhs = term_to_handle<@CPP_CLASS@ >(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    @!CONSTRAINER at _System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_ at CONSTRAINER@(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    lhs->@LIMITEDBOUNDED at _@WIDENEXPN at _extrapolation_assign(*rhs, cs, 0);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nnd) {
+  static const char* where = "ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    dimension_type d = term_to_unsigned<dimension_type>(t_nnd, where);
+    ph->add_space_dimensions_ at EMBEDPROJECT@(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_ at CLASS@_remove_space_dimensions/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set dead_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      dead_variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    ph->remove_space_dimensions(dead_variables);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_higher_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nd) {
+  static const char* where = "ppl_ at CLASS@_remove_higher_space_dimensions/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->remove_higher_space_dimensions(term_to_unsigned<dimension_type>(t_nd,
+                                                                        where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_expand_space_dimension
+  (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd) {
+  static const char* where = "ppl_ at CLASS@_expand_space_dimension/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->expand_space_dimension(term_to_Variable(t_v, where),
+                               term_to_unsigned<dimension_type>(t_nd, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_fold_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v) {
+  static const char* where = "ppl_ at CLASS@_fold_space_dimensions/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set fold_variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      fold_variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    ph->fold_space_dimensions(fold_variables, term_to_Variable(t_v, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_map_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc) {
+  static const char* where = "ppl_ at CLASS@_map_space_dimensions/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    dimension_type space_dim = ph->space_dimension();
+    PPL_CHECK(ph);
+    Partial_Function pfunc;
+    Prolog_term_ref t_pair = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_pfunc)) {
+      Prolog_get_cons(t_pfunc, t_pair, t_pfunc);
+      Prolog_atom functor;
+      int arity;
+      Prolog_get_compound_name_arity(t_pair, &functor, &arity);
+      if (arity != 2 || functor != a_minus)
+        return PROLOG_FAILURE;
+      Prolog_term_ref t_i = Prolog_new_term_ref();
+      Prolog_term_ref t_j = Prolog_new_term_ref();
+      Prolog_get_arg(1, t_pair, t_i);
+      Prolog_get_arg(2, t_pair, t_j);
+      dimension_type i = term_to_Variable(t_i, where).id();
+      dimension_type j = term_to_Variable(t_j, where).id();
+      if (i >= space_dim)
+        return PROLOG_FAILURE;
+      pfunc.insert(i, j);
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_pfunc, where);
+
+    ph->map_space_dimensions(pfunc);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_some_non_integer_points
+  (Prolog_term_ref t_ph, Prolog_term_ref t_cc) {
+  static const char* where = "ppl_ at CLASS@_drop_some_non_integer_points/2";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+    Complexity_Class cc;
+    if (p_cc == a_polynomial)
+      cc = POLYNOMIAL_COMPLEXITY;
+    else if (p_cc == a_simplex)
+      cc = SIMPLEX_COMPLEXITY;
+    else
+      cc = ANY_COMPLEXITY;
+
+    ph->drop_some_non_integer_points(cc);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_some_non_integer_points_2
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_cc) {
+  static const char* where = "ppl_ at CLASS@_drop_some_non_integer_points_2/3";
+  try {
+    @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    Variables_Set variables;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      variables.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    Prolog_atom p_cc = term_to_complexity_class(t_cc, where);
+    Complexity_Class cc;
+    if (p_cc == a_polynomial)
+      cc = POLYNOMIAL_COMPLEXITY;
+    else if (p_cc == a_simplex)
+      cc = SIMPLEX_COMPLEXITY;
+    else
+      cc = ANY_COMPLEXITY;
+
+    ph->drop_some_non_integer_points(variables, cc);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ascii_dump
+  (Prolog_term_ref t_ph) {
+  static const char* where = "ppl_ at CLASS@_ascii_dump/1";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    ph->ascii_dump(std::cout);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MEMBYTES@(Prolog_term_ref t_pps,
+                         Prolog_term_ref t_m) {
+  static const char* where = "ppl_ at CLASS@_ at MEMBYTES@/2";
+  try {
+    @CPP_CLASS@* pps = term_to_handle<@CPP_CLASS@ >(t_pps, where);
+    PPL_CHECK(pps);
+
+    if (unify_ulong(t_m, pps->@MEMBYTES@()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_wrap_assign
+     (Prolog_term_ref t_ph,
+      Prolog_term_ref t_vars,
+      Prolog_term_ref t_w,
+      Prolog_term_ref t_r,
+      Prolog_term_ref t_o,
+      Prolog_term_ref t_cs,
+      Prolog_term_ref t_complexity,
+      Prolog_term_ref t_ind) {
+  static const char* where = "ppl_ at CLASS@_wrap_assign/8";
+  try {
+    @CPP_CLASS@* pph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+
+    Variables_Set vars;
+    Prolog_term_ref v = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_vars)) {
+      Prolog_get_cons(t_vars, v, t_vars);
+      vars.insert(term_to_Variable(v, where).id());
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vars, where);
+
+    Prolog_atom p_w = term_to_bounded_integer_type_width(t_w, where);
+    Bounded_Integer_Type_Width w;
+    if (p_w == a_bits_8)
+      w = BITS_8;
+    else if (p_w == a_bits_16)
+      w = BITS_16;
+    else if (p_w == a_bits_32)
+      w = BITS_32;
+    else if (p_w == a_bits_64)
+      w = BITS_64;
+    else
+      w = BITS_128;
+
+    Prolog_atom p_r = term_to_bounded_integer_type_representation(t_r, where);
+    Bounded_Integer_Type_Representation r;
+    if (p_r == a_unsigned)
+      r = UNSIGNED;
+    else
+      r = SIGNED_2_COMPLEMENT;
+    Prolog_atom p_o = term_to_bounded_integer_type_overflow(t_o, where);
+    Bounded_Integer_Type_Overflow o;
+    if (p_o == a_overflow_wraps)
+      o = OVERFLOW_WRAPS;
+    else if (p_o == a_overflow_undefined)
+      o = OVERFLOW_UNDEFINED;
+    else
+      o = OVERFLOW_IMPOSSIBLE;
+
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_cs)) {
+      Prolog_get_cons(t_cs, c, t_cs);
+      cs.insert(build_constraint(c, where));
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_cs, where);
+
+    unsigned complexity = term_to_unsigned<unsigned>(t_complexity, where);
+
+    Prolog_atom p_ind = term_to_boolean(t_ind, where);
+    bool ind = (p_ind == a_true) ? true : false;
+
+    pph->wrap_assign(vars, w, r, o, &cs, complexity, ind);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+ }
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_frequency(Prolog_term_ref t_ph,
+                        Prolog_term_ref t_le_expr,
+                        Prolog_term_ref t_freqn, Prolog_term_ref t_freqd,
+                        Prolog_term_ref t_valn, Prolog_term_ref t_vald) {
+  static const char* where = "ppl_ at CLASS@_frequency/6";
+  try {
+    const @CPP_CLASS@* ph = term_to_handle<@CPP_CLASS@ >(t_ph, where);
+    PPL_CHECK(ph);
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    PPL_DIRTY_TEMP_COEFFICIENT(freqn);
+    PPL_DIRTY_TEMP_COEFFICIENT(freqd);
+    PPL_DIRTY_TEMP_COEFFICIENT(valn);
+    PPL_DIRTY_TEMP_COEFFICIENT(vald);
+    if (ph->frequency(le, freqn, freqd, valn, vald)) {
+      if (Prolog_unify_Coefficient(t_freqn, freqn)
+          && Prolog_unify_Coefficient(t_freqd, freqd)
+          && Prolog_unify_Coefficient(t_valn, valn)
+          && Prolog_unify_Coefficient(t_vald, vald))
+        return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
new file mode 100644
index 0000000..8068595
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_cc_files.m4
@@ -0,0 +1,61 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file is used to generate ppl_prlog_domains.cc
+dnl and files ppl_prolog_DOMAIN.cc, for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4 using the code in
+dnl ppl_interface_generator_prolog_cc_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(`ppl_interface_generator_prolog_cc_code.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_procedure_schema_debug', `m4_dumpdef($1`'_code)')
+
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_`'m4_current_interface.cc << ___END_OF_FILE___
+/* Prolog m4_current_interface interface code: definitions.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+#include "ppl_prolog_sysdep.hh"
+#include "ppl_prolog_common_defs.hh"
+
+')
+
+m4_divert`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
new file mode 100644
index 0000000..2d1523c
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox.m4
@@ -0,0 +1,295 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the file Prolog_configured_domains.dox
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl FIXME: This should be in the main m4 generator file.
+
+dnl -----------------------------------------------------------------
+dnl Include the needed m4 files.
+dnl -----------------------------------------------------------------
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+m4_include(`ppl_interface_generator_prolog_dox_code.m4')
+
+dnl =================================================================
+dnl Description of file and copyright notice
+dnl =================================================================
+m4_divert`'dnl
+/* Configuration Dependent Documentation for Prolog.
+m4_include(`ppl_interface_generator_copyright')*/
+
+/*! \page configured_domains_predicates Predicates for Configured Domains
+
+The structure of this section is as follows:
+m4_pushdef(`m4_one_class_code',`dnl
+  - \ref m4_interface_class$1`'_predicates "Predicates for the m4_interface_class$1 Domain"
+')`'dnl
+m4_all_code`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+m4_divert(-1)
+
+dnl =================================================================
+dnl DOMAIN DEPENDENT DOCUMENTATION.
+dnl =================================================================
+
+dnl -----------------------------------------------------------------
+dnl Initialize the class definitions
+dnl as we do not use m4_all_code to generate the documentation,
+dnl this must be done here.
+dnl -----------------------------------------------------------------
+m4_initialize_all
+
+dnl -----------------------------------------------------------------
+dnl For the documentation, the predicates for a single class are
+dnl divinided into categories and then into subcategories.
+dnl Each category and subcategory can have its own introduction.
+dnl -----------------------------------------------------------------
+
+dnl -----------------------------------------------------------------
+dnl Define documentation for one subcategory.
+dnl This requires that m4_ext is defined.
+dnl -----------------------------------------------------------------
+m4_define(`m4_one_subcategory', `dnl
+m4_define(`m4_procedure_schema_extension', m4_ext`'_doc)`'dnl
+m4_echo_unquoted(m4_subcategory_`'m4_ext)
+m4_ifdef(m4_interface_class`'$1,
+`m4_patsubst(m4_one_class_code($1), |COMMA|, `,')`'dnl
+')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Define the documentation for all categories for simple domains;
+dnl -----------------------------------------------------------------
+m4_define(`m4_all_simple_categories', `dnl
+m4_category_constr_destr`'dnl
+m4_define(`m4_ext', build)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', convert)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', destruct)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_constr_destr`'dnl
+m4_category_const`'dnl
+m4_define(`m4_ext', testpoly)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', constpoly)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', dump)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_const`'dnl
+m4_category_nonconst`'dnl
+m4_define(`m4_ext', addto)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', trans)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', binop)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', widen)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_nonconst`'dnl
+m4_category_varspace`'dnl
+m4_define(`m4_ext', concat)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_define(`m4_ext', spacemod)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_finalize_category_varspace`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Define the documentation for an extra category for powerset domains;
+dnl -----------------------------------------------------------------
+m4_define(`m4_iter_pps_categories', `dnl
+m4_define(`m4_ext', pps_iter)`'dnl
+m4_one_subcategory($1)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for one simple class.
+dnl -----------------------------------------------------------------
+m4_define(`m4_one_simple_class_code', `dnl
+\anchor m4_this_interface_class`'_predicates
+<H1>Predicates for the m4_this_topology m4_this_interface_class Domain</H1>
+  Here we provide a short description for each of the predicates
+  available for the domain of m4_this_topology m4_this_ppl_objects.
+m4_ifdef(`m4_prolog_ci_documentation',
+  `Note that predicates for other domains will follow a similar pattern.')
+
+m4_all_simple_categories($1)`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl FIXME: Some experimental macros for text processing to try
+dnl and make the documentation a bit more grammatically correct!
+dnl -----------------------------------------------------------------
+
+dnl m4_underscore_to_space(String)
+dnl
+dnl Changes an underscore to space.
+dnl Example: m4_underscore_to_space(`xyz_abc') ==> xyz abc
+m4_define(`m4_underscore_to_space', `m4_translit(`$1', `_', ` ')')
+
+dnl Changes an underscore to space and upper to lower case
+dnl It also tries to change a powerset name into English!
+m4_define(`m4_PPL_domain2text', `dnl
+  m4_patsubst(m4_patsubst(m4_downcase(m4_underscore_to_space($1)),
+                           ` c polyhedron', ` of C polyhedra'),
+              ` nnc polyhedron', ` of NNC polyhedra')')
+
+dnl m4_plural(String)
+dnl
+dnl Very simple macro for making domains (lowercase) plural.
+m4_define(`m4_plural', `dnl
+m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst(m4_patsubst($1,
+  polyhedron, polyhedra),
+  grid, grids),
+  shape, shapes),
+  box, boxes),
+  powerset, powersets),
+  product, products)`'dnl
+')
+
+dnl =================================================================
+dnl Now the generation of the documentation.
+dnl =================================================================
+
+dnl -----------------------------------------------------------------
+dnl CONFIGURATION INDEPENDENT
+dnl -----------------------------------------------------------------
+
+dnl -----------------------------------------------------------------
+dnl Additional ad hoc predicates for the configure independent manual.
+dnl
+dnl Note that currently this only describes predicates for the
+dnl pointset powerset domains but allows for other ad hoc predicates
+dnl for other domains to be added later.
+dnl -----------------------------------------------------------------
+m4_define(`m4_ci_pps_class_code', `dnl
+\anchor other_domains
+<H1>Ad hoc Predicates for Other Domains</H1>
+dnl The pointset powerset domains.
+m4_category_pps
+dnl The predicates for iterators and disjuncts for the powerset domain.
+m4_iter_pps_categories($1)`'dnl
+dnl Other adhoc predicates for the powerset domain.
+m4_define(`m4_ext', pps_other)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_pushdef(`m4_subcategory_widen', `')`'dnl
+m4_define(`m4_ext', widen)`'dnl
+m4_one_subcategory($1)`'dnl
+m4_popdef(`m4_subcategory_widen')`'dnl
+m4_finalize_category_pps`'dnl
+')
+
+m4_divert`'dnl
+m4_ifdef(`m4_prolog_ci_documentation', `dnl
+m4_define(`m4_this_interface_class', Polyhedron)`'dnl
+m4_pushdef(`m4_a_class_replacements', `polyhedron')`'dnl
+m4_pushdef(`m4_Polyhedron_topology_replacements', `C_')`'dnl
+m4_pushdef(`m4_Polyhedron_a_topology_replacements', `C ')`'dnl
+m4_pushdef(`m4_this_ppl_one_object', `polyhedron')`'dnl
+m4_pushdef(`m4_this_ppl_objects', `polyhedra')`'dnl
+m4_pushdef(`m4_this_ppl_group', `polyhedra')`'dnl
+m4_pushdef(`m4_this_topology', `C')`'dnl
+m4_pushdef(`m4_Polyhedron_friend_replacements',
+  `C_Polyhedron, NNC_Polyhedron')`'dnl
+m4_pushdef(`m4_Polyhedron_a_friend_replacements',
+   `C polyhedron, NNC polyhedron')`'dnl
+m4_patsubst(`m4_one_simple_class_code(1)', |COMMA|, `,')`'dnl
+m4_popdef(`m4_Polyhedron_topology_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_a_topology_replacements')`'dnl
+m4_popdef(`m4_this_ppl_objects')`'dnl
+m4_popdef(`m4_this_topology')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_comparison_replacements',
+         `geometrically_covers, geometrically_equals')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_a_comparison_replacements',
+         `geometrically covers, geometrically equals')`'dnl
+m4_patsubst(`m4_ci_pps_class_code(2)', |COMMA|, `,')`'dnl
+')`'dnl
+m4_divert(-1)
+
+dnl -----------------------------------------------------------------
+dnl CONFIGURATION DEPENDENT
+dnl -----------------------------------------------------------------
+
+dnl m4_all_classes_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class.
+dnl This iterates through the classes to define the documentation.
+dnl Note that at the end of this stage, commas are still to be substituted.
+m4_define(`m4_all_classes_doc', `dnl
+dnl
+dnl Check for class counter in range. If so, generate the documentation
+dnl for the current class. If not finish.
+m4_ifdef(m4_interface_class`'$1, `dnl
+dnl
+dnl First some temporary definitions.
+m4_define(`m4_this_interface_class', m4_interface_class`'$1)`'dnl
+m4_pushdef(`m4_a_class_replacement', `dnl
+m4_PPL_domain2text(m4_this_interface_class)')
+m4_pushdef(`m4_this_topology', `')`'dnl
+m4_pushdef(`m4_this_ppl_group', m4_class_group`'$1)`'dnl
+m4_pushdef(`m4_this_ppl_kind', m4_class_kind`'$1)`'dnl
+m4_pushdef(`m4_this_ppl_disjunct_kind', m4_class_body_kind`'$1)`'dnl
+m4_define(`m4_disjunct_topology', `dnl
+m4_upcase(m4_get_class_topology(m4_cplusplus_class_body$1))')`'dnl
+m4_pushdef(`m4_this_ppl_one_object', `dnl
+m4_PPL_domain2text(m4_this_ppl_kind)')
+m4_pushdef(`m4_this_ppl_objects', `dnl
+m4_ifelse(m4_this_ppl_group, box,
+   m4_plural(m4_PPL_domain2text(m4_this_interface_class)),
+          m4_this_ppl_group, pointset_powerset,
+   pointset powersets of m4_plural(m4_PPL_domain2text(m4_disjunct_topology m4_this_ppl_disjunct_kind)),
+  m4_plural(m4_PPL_domain2text(m4_this_ppl_kind)))')`'dnl
+dnl
+dnl Generate documentation for current class.
+m4_one_simple_class_code($1)`'dnl
+m4_ifelse(m4_this_ppl_group,
+  pointset_powerset, `m4_iter_pps_categories($1)')`'dnl
+dnl
+dnl Remove temporary definition.
+m4_popdef(`m4_this_ppl_objects')`'dnl
+m4_popdef(`m4_this_topology')`'dnl
+m4_popdef(`m4_this_ppl_group')`'dnl
+m4_popdef(`m4_this_ppl_kind')`'dnl
+m4_popdef(`m4_this_ppl_disjunct_kind')`'dnl
+m4_popdef(`m4_disjunct_topology')`'dnl
+dnl
+dnl Increment class counter and repeat.
+m4_all_classes_doc(m4_incr($1))')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Generate all documentation for all the classes
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_ifdef(`m4_prolog_ci_documentation', `',
+  `m4_patsubst(`m4_all_classes_doc(1)', |COMMA|, `,')`'dnl
+')`'dnl
+m4_divert(-1)
+
+m4_divert`'dnl
+*/ /* \page configured_domains_predicates */
+dnl
+dnl End of file generation.
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
new file mode 100644
index 0000000..fdc7c4b
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_dox_code.m4
@@ -0,0 +1,1191 @@
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating Prolog_interface.dox
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl category and subcategory headers and descriptions
+
+dnl -----------------------------------------------------------------
+dnl *** The constructor, copy, convert and destructor predicates. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_constr_destr', `dnl
+<H2>Constructor, copy, conversion and destructor predicates</H2>
+m4_pushdef(`m4_topology_a_replacements', `')`'dnl
+m4_pushdef(`m4_Polyhedron_a_topology_replacements', `C , NNC ')`'dnl
+')
+
+m4_define(`m4_finalize_category_constr_destr', `dnl
+m4_popdef(`m4_a_topology_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_a_topology_replacements')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl The constructor predicates.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_build', `dnl
+<H3>Constructor predicates for m4_this_topology m4_this_ppl_objects</H3>
+The constructor predicates build a
+m4_this_topology m4_this_ppl_one_object from a specification
+and binds the given variable to a handle for future referencing.
+The specification can be:
+- the number of space dimensions and an atom indicating if it
+  is to be the universe or empty element.
+- a representation for the particular class of semantic geometric
+  descriptors to which the element being built belongs.
+m4_ifelse(m4_this_interface_class, Polyhedron,
+  `For example`,'
+  a C Polyhedron can be built from a list of
+  non-strict inequality or equality constraints or a list of equality
+  congruences or a list of generators that contains no closure points.')
+')
+
+dnl -----------------------------------------------------------------
+dnl The copy and conversion constructor predicates.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_convert', `dnl
+<H3>Predicates that build new m4_this_topology m4_this_ppl_objects
+  by copying or converting from
+  other semantic geometric descriptions</H3>
+  Besides the constructors listed above, the library also
+  provides:
+- copy constructors that will copy an element belonging
+  to the same class of semantic geometric descriptions
+- conversion operators that build a new semantic geometric
+  description starting from a \b friend;
+  that is`,' a semantic geometric description in different class
+m4_ifelse(m4_this_interface_class, Polyhedron, `dnl
+  (e.g.`,' ppl_new_Grid_from_C_Polyhedron`,'
+  ppl_new_C_Polyhedron_from_BD_Shape_mpq_class`,' etc.)').<BR>
+
+  The copy and conversion predicates have two versions,
+  one with arity 2 for the source and target handles and one
+  with an extra argument denoting the maximum complexity to be used
+  in the conversion;
+  this complexity argument is ignored when the
+  the friend and the element being built are in the same class.
+')
+
+dnl -----------------------------------------------------------------
+dnl The destructor predicate
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_destruct', `dnl
+<H3>Destructor predicate</H3>
+Below is the destructor predicate for the m4_this_interface_class domain.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Predicates that do not modify the polyhedron. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_const', `dnl
+<H2>Predicates that do not change the m4_this_ppl_one_object</H2>
+m4_pushdef(`m4_a_has_property_replacements', `dnl
+  is empty, is the universe, is bounded, contains an integer point,
+  is topologically closed, is discrete')`'dnl
+m4_pushdef(`m4_product_a_has_property_replacements', `dnl
+  is empty, is the universe, is bounded,
+  is topologically closed, is discrete')`'dnl
+m4_pushdef(`m4_a_comparison_replacements', `dnl
+  is included in or equal to,  is included in but not equal to,
+  is disjoint from')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_a_comparison_replacements', `dnl
+  m4_a_comparison_replacements,
+  geometrically covers, geometrically equals')`'dnl
+m4_pushdef(`m4_maxmin_replacements', `max, min')`'dnl
+m4_pushdef(`m4_a_maxmin_replacements', `above, below')`'dnl
+m4_pushdef(`m4_b_maxmin_replacements', `supremum, infinum')`'dnl
+m4_pushdef(`m4_maxmin_replacements', `max, min')`'dnl
+m4_pushdef(`m4_a_maxmin_replacements', `above, below')`'dnl
+m4_pushdef(`m4_b_maxmin_replacements', `supremum, infinum')`'dnl
+m4_pushdef(`m4_a_dimension_replacements', `dnl
+  dimension of the vector space enclosing, affine dimension of')`'dnl
+')
+
+m4_define(`m4_finalize_category_const', `dnl
+m4_popdef(`m4_has_a_property_replacements')`'dnl
+m4_popdef(`m4_product_a_has_property_replacements')`'dnl
+m4_popdef(`m4_a_comparison_replacements')`'dnl
+m4_popdef(`m4_Pointset_Powerset_a_comparison_replacements')`'dnl
+m4_popdef(`m4_maxmin_replacements')`'dnl
+m4_popdef(`m4_a_maxmin_replacements')`'dnl
+m4_popdef(`m4_b_maxmin_replacements')`'dnl
+m4_popdef(`m4_maxmin_replacements')`'dnl
+m4_popdef(`m4_a_maxmin_replacements')`'dnl
+m4_popdef(`m4_b_maxmin_replacements')`'dnl
+m4_popdef(`m4_a_dimension_replacements')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that test a property
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_testpoly', `dnl
+<H3>Test Predicates</H3>
+These predicates test the m4_this_ppl_one_object for different properties
+and succeed or fail depending on the outcome.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that get information about the polyhedron.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_constpoly', `dnl
+<H3>Predicates that return information about the m4_this_ppl_one_object</H3>
+These predicates will obtain more detailed information about the
+m4_this_ppl_one_object
+unifying some of their arguments with the results.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicate that dumps.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_dump', `dnl
+<H3>Ascii dump predicate</H3>
+This output predicate is useful for debugging.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Space dimension preserving predicates that may modify the ***
+dnl *** polyhedron.                                               ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_nonconst', `dnl
+<H2>Space-dimension preserving predicates that may change
+    the m4_this_ppl_one_object</H2>
+These predicates may modify the m4_this_ppl_one_object referred to
+by the handle in first argument;
+the (dimension of the) vector space in which it is embedded is unchanged.
+m4_pushdef(`m4_binop_replacements', `dnl
+  intersection_assign, upper_bound_assign, difference_assign,
+  time_elapse_assign')`'dnl
+m4_pushdef(`m4_Polyhedron_binop_replacements', `dnl
+  m4_binop_replacements, poly_hull, poly_difference')`'dnl
+m4_pushdef(`m4_a_binop_replacements', `dnl
+  intersection, upper bound, difference, time elapse')`'dnl
+m4_pushdef(`m4_Polyhedron_a_binop_replacements', `dnl
+  m4_a_binop_replacements, poly-hull, poly-difference')`'dnl
+m4_pushdef(`m4_a_simplify_replacements', `topological closure')`'dnl
+m4_pushdef(`m4_Pointset_Powerset_a_simplify_replacements', `dnl
+  topological closure, pairwise reduction, omega reduction')`'dnl
+')
+
+m4_define(`m4_finalize_category_nonconst', `dnl
+m4_popdef(`m4_binop_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_binop_replacements')`'dnl
+m4_popdef(`m4_a_binop_replacements')`'dnl
+m4_popdef(`m4_Polyhedron_a_binop_replacements')`'dnl
+m4_popdef(`m4_a_simplify_replacements')`'dnl
+m4_popdef(`m4_Pointset_Powerset_a_simplify_replacements')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that may change the polyhedron by adding
+dnl to the polyhedron's constraint or generator descriptions.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_addto', `dnl
+<H3>Predicates that may change the m4_this_ppl_one_object by adding
+to its constraint or generator descriptions</H3>
+Note that there are two forms of these predicates
+differentiated in the names by the
+words "add" or "refine with";
+see Section \extref{Generic_Operations_on_Semantic_Geometric_Descriptors, Generic Operations on Semantic Geometric Descriptors} in the
+main \extref{preamble, PPL User Manual}
+for the differences in the semantics and therefore, the expected behavior,
+between these forms.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that transform a polyhedron.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_trans', `dnl
+<H3>Predicates that transform the m4_this_ppl_one_object</H3>
+These predicates enable transformations
+such as taking the topological closure (which for the domain of
+m4_this_topology m4_this_ppl_one_object is the identity transformation),
+unconstraining a specified dimension
+as explained in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Cylindrification, Cylindrification Operator}
+and several different image and preimage affine transfer relations;
+for details of the latter see Sections
+\extref{Images_and_Preimages_of_Affine_Transfer_Relations, Images and Preimages of Affine Transfer Relations}
+and
+\extref{Generalized_Affine_Relations, Generalized Affine Relations}')
+
+dnl -----------------------------------------------------------------
+dnl Predicates that act as binary operators.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_binop', `dnl
+<H3>Predicates whose results depend on more than one m4_this_ppl_one_object</H3>
+These predicates include the binary operators which will assign to the
+m4_this_ppl_one_object referred to by the first argument
+its combination with the m4_this_ppl_one_object referred to by the second argument
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Intersection_and_Convex_Polyhedral_Hull, Intersection and Convex Polyhedral Hull}
+and
+\extref{Convex_Polyhedral_Difference, Convex Polyhedral Difference};
+and a linear partitioning operator described below.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates for widening and extrapolation.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_widen', `dnl
+<H3>Predicates for widening and extrapolation</H3>
+In addition to the above binary operators, there are also a number
+of widening, extrapolation and narrowing operators
+as described in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Widening_Operators, Widening Operators},
+\extref{Widening_with_Tokens, Widening with Tokens} and
+\extref{Extrapolation_Operators, Extrapolation Operators}.
+Note that for all these widening and extrapolation predicates
+to behave as specified
+the m4_this_ppl_one_object referred to by the second argument has to be
+contained in (or equal to) the m4_this_ppl_one_object referred to by the first argument.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Predicates that may modify the dimension of the vector space. ***
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_varspace', `dnl
+<H2>Predicates that may modify the vector space</H2>
+These predicates enable the modification of the vector space
+of the m4_this_ppl_one_object referred to in the first argument.
+')
+
+m4_define(`m4_finalize_category_varspace', `dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Concatenate predicate
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_concat', `dnl
+<H3>Predicate for concatenation</H3>
+For more information on this operation, see Section
+\extref{Concatenating_Polyhedra, Concatenating Polyhedra},
+of the main \extref{preamble, PPL User Manual}.
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates for mapping or changing the space dimensions
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_spacemod', `dnl
+<H3>Predicates for mapping dimensions or changing the vector space</H3>
+These predicates enable the modification of the vector space
+of the m4_this_ppl_one_object referred to in the first argument.
+These predicates enable the modification of the vector space
+of the m4_this_ppl_one_object referred to in the first argument.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Adding_New_Dimensions_to_the_Vector_Space, Adding New Dimensions to the Vector Space},
+\extref{Removing_Dimensions_from_the_Vector_Space, Removing Dimensions from the Vector Space},
+\extref{Mapping_the_Dimensions_of_the_Vector_Space, Mapping the Dimensions of the Vector Space},
+\extref{expand_space_dimension, Expanding One Dimension of the Vector Space to Multiple Dimensions}
+and
+\extref{Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension, Folding Multiple Dimensions of the Vector Space into One Dimension}.
+')
+
+dnl -----------------------------------------------------------------
+dnl *** Pointset powerset domains.                               ***
+dnl Note that this is only used for the configure independent manual.
+dnl -----------------------------------------------------------------
+m4_define(`m4_category_pps', `dnl
+<H2>Extra Predicates Specifically for the Pointset Powerset Domains</H2>
+  The powerset domains can be instantiated by taking as a base domain
+  any fixed semantic geometric description
+  (C and NNC polyhedra, BD and octagonal shapes, boxes and grids).
+  An element of the powerset domain represents a disjunctive collection
+  of base objects (its disjuncts), all having the same space dimension.
+  For more information on this construct,
+  see Section \extref{The_Powerset_Domain, The Powerset Domain}
+  in the main \extref{preamble, PPL User Manual}.
+
+  Besides the predicates that are available in all semantic geometric
+  descriptions (whose documentation is not repeated here),
+  the powerset domain also provides several ad hoc predicates.
+  These are specified below, instantiated for the
+  PPL domain Pointset_Powerset_C_Polyhedron.
+  Note that predicates for other pointset powerset domains
+  will follow similar patterns.
+')
+
+m4_define(`m4_finalize_category_pps', `dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Predicates for pointset powerset iterators and disjuncts.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_pps_iter', `dnl
+  <H3>Predicates for pointset powerset iterators and disjuncts.</H3>
+Iterators allow the user to examine and change individual elements
+(called here disjuncts) of a pointset powerset.
+Detailed descriptions for adding and removing disjuncts can be found in the
+main \extref{preamble, PPL User Manual} in Section
+\extref{Adding_a_Disjunct, Adding a Disjunct}.
+The following predicates support useful operations
+on these iterators and disjuncts via the usual handles.
+m4_pushdef(`m4_Pointset_Powerset_a_beginend_replacements',
+  `beginning, end')`'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Other ad hoc predicates for the pointset_powerset domains.
+dnl Note that these are only used for the configure independent manual.
+dnl -----------------------------------------------------------------
+m4_define(`m4_subcategory_pps_other', `dnl
+  <H3>Other Ad Hoc Predicates for the pointset powerset domains.</H3>
+Collected here are some other predicates that are specific to
+pointset powersets of C polyhedra;
+these provide operations for
+simplifying the powerset,
+geometric comparisons
+and widening and extrapolation.
+Detailed descriptions of these can be found in the
+main \extref{preamble, PPL User Manual} in Sections
+\extref{Geometric_Comparisons, Geometric Comparisons},
+\extref{Certificate_Based_Widenings, Certificate-Based Widenings},
+\extref{Powerset_Extrapolation_Operators, Powerset Extrapolation Operators}.
+')
+
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the build predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_build_doc', `dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(+Dimension_Type, +Universe_or_Empty, -Handle)</CODE><BR>
+   <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \f$\cP\f$
+   with \c Dimension_Type dimensions; it is empty
+   or the universe depending on whether \c Atom
+   is \c empty or \c universe|COMMA| respectively.
+   \c Handle is unified with the handle for \f$\cP\f$.
+   Thus the query
+\code
+   ?- ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3|COMMA| universe|COMMA| X).
+\endcode
+   creates the @A_TOPOLOGY@`'m4_this_ppl_one_object defining the
+   3-dimensional vector space
+   \f$\Rset^3\f$ with \c X bound to a valid handle for accessing it.</EM>
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_build_doc',
+`dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(+@!BUILD_REPRESENT at _System, -Handle)</CODE><BR>
+  <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P from
+  \c @!BUILD_REPRESENT at _System.
+  \c Handle is unified with the handle for \p P.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the convert predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _convert_doc', `dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(+Handle_1, -Handle_2)</CODE><BR>
+  <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P_1 from
+   the @!A_FRIEND@ referenced by handle \c Handle_1.
+  \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_convert_doc', `dnl
+<P><CODE>ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(+Handle, +Complexity, -Handle)</CODE><BR>
+  <EM>Builds a new @A_TOPOLOGY@`'m4_this_ppl_one_object \p P_1 from
+   the @!A_FRIEND@ referenced by handle \c Handle_1
+  using an algorithm whose complexity does not exceed \c Complexity;
+  \c Handle_2 is unified with the handle for \p P_1.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for the desctructor;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_delete_ at CLASS@_destruct_doc',
+`dnl
+<P><CODE>ppl_delete_ at CLASS@(+Handle)</CODE><BR>
+  <EM>Invalidates the handle  referenced by \c Handle:
+  this makes sure the corresponding resources will eventually be released.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the simple test predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at HAS_PROPERTY@(+Handle)</CODE><BR>
+   <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+   \c Handle @A_HAS_PROPERTY at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(+Handle, +Lin_Expr)</CODE><BR>
+   <EM>Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from @ABOVEBELOW@
+   in the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+   <CODE>Handle_2</CODE> @A_COMPARISON@
+   the m4_this_ppl_one_object referenced by <CODE>Handle_1</CODE>.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_equals_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+   <CODE>Handle_1</CODE> is
+   equal to the m4_this_ppl_one_object referenced by <CODE>Handle_2</CODE>.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_constrains(+Handle, +PPL_Var)</CODE><BR>
+  <EM>Succeeds if and only if the m4_this_ppl_one_object referenced by
+   \c Handle constrains the dimension \c PPL_Var.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_testpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_OK(+Handle)</CODE><BR>
+   <EM>Succeeds only if the m4_this_ppl_one_object referenced by
+   \c Handle is well formed|COMMA| i.e.|COMMA| if it
+   satisfies all its implementation invariants.
+   Useful for debugging purposes.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the "get information" predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_has_ at UPPERLOWER@_bound(+Handle, +Var, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+  <EM>Succeeds if and only if \c Var is @UPPERLOWER@ bounded in
+  m4_this_ppl_one_object \p P referenced by \c Handle. It is assumed
+  that \p P is not empty and its space dimension is greater than or equal
+  to that of \c Var|COMMA| otherwise the behavior is undefined.
+
+  \c Coeff_1 is unified with the numerator of the @UPPERLOWER@ bound
+  and \c Coeff_2 with the denominator of the @UPPERLOWER@ bound.
+  If the @UPPERLOWER@ is included in \p P|COMMA| then \c Boolean is unified
+  with the atom \c true and|COMMA| otherwise|COMMA| unified with
+  the atom \c false.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at MAXMIN@imize(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean)</CODE><BR>
+  <EM>Succeeds if and only if m4_this_ppl_one_object \p P referenced by \c Handle
+  is not empty and \c Lin_Expr is bounded from @A_MAXMIN@ in \p P.
+
+  \c Coeff_1 is unified with the numerator of the @B_MAXMIN@ value
+  and \c Coeff_2 with the denominator of the @B_MAXMIN@ value.
+  If the @B_MAXMIN@ is also the @MAXMIN at imum|COMMA| \c Boolean is unified
+  with the atom \c true and|COMMA| otherwise|COMMA| unified with
+  the atom \c false.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at MAXMIN@imize_with_point(+Handle, +Lin_Expr, ?Coeff_1, ?Coeff_2, ?Boolean, ?Point)</CODE><BR>
+  <EM>Succeeds if and only if m4_this_ppl_one_object \p P referenced by \c Handle
+  is not empty and \c Lin_Expr is bounded from @A_MAXMIN@ in \p P.
+
+  \c Coeff_1 is unified with the numerator of the @B_MAXMIN@ value
+  and \c Coeff_2 with the denominator of the @B_MAXMIN@ value
+  and \c Point with a point or closure point where \c Lin_Expr reaches
+  this value.
+  If the @B_MAXMIN@ is also the @MAXMIN at imum|COMMA| \c Boolean is unified
+  with the atom \c true and|COMMA| otherwise|COMMA| unified with the
+  atom \c false.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at DIMENSION@(+Handle, ?Dimension_Type)</CODE><BR>
+   <EM>Unifies \c Dimension_Type with the @A_DIMENSION@
+   the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_constpoly_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(+Handle, +@!RELATION_REPRESENT@, ?Relation_List)</CODE><BR>
+  <EM>Unifies \c Relation_List with the list of relations the
+  m4_this_ppl_one_object referenced by \c Handle has with \c @!RELATION_REPRESENT at .
+  The possible relations are listed in the
+  grammar rules above.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_constpoly_doc',
+`dnl
+m4_pushdef(`m4_b_class_represent_replacements', `satisfied by, satisfied by')
+m4_pushdef(`m4_Polyhedron_b_class_represent_replacements',
+         `satisfied by, satisfied by, for')
+m4_pushdef(`m4_Grid_b_class_represent_replacements',
+         `satisfied by, satisfied by, for')
+<P><CODE>ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(+Handle, ?@!CLASS_REPRESENT at _System)</CODE><BR>
+   <EM>Unifies \c @!CLASS_REPRESENT at _System with
+   the @CLASS_REPRESENT at s (in the form of a list) in the @CLASS_REPRESENT@ system
+   @B_CLASS_REPRESENT@ the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_constpoly_doc',
+`dnl
+m4_pushdef(`m4_Polyhedron_b_class_represent_replacements',
+         `satisfied by, for, satisfied by')
+<P><CODE>ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(+Handle, ?@!CLASS_REPRESENT at _System)</CODE><BR>
+   <EM>Unifies \c @!CLASS_REPRESENT at _System with
+   the @CLASS_REPRESENT at s (in the form of a list)
+   in the minimized @CLASS_REPRESENT@ system
+   @B_CLASS_REPRESENT@ the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_constpoly_doc',
+ `dnl
+m4_pushdef(`m4_a_membytes_replacements', `total, external')
+<P><CODE>ppl_ at CLASS@_ at MEMBYTES@(+Handle, ?Number)</CODE><BR>
+<EM>Unifies \c Number with the size of the @A_MEMBYTES@ memory in
+bytes occupied by the m4_this_ppl_one_object referenced by \c Handle.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for the ascii dump;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ascii_dump_dump_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_ascii_dump(+Handle)</CODE><BR>
+  <EM>Dumps an ascii representation of the PPL internal state for
+  the m4_this_ppl_one_object referenced by \c Handle on the standard output.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the "add to" predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_addto_doc',
+`dnl
+m4_popdef(`m4_a_class_represent_replacements')`'dnl
+m4_pushdef(`m4_a_class_represent_replacements',
+           `an equality or a non-strict inequality,
+            an equality, a line|COMMA| ray or point')`'dnl
+<P><CODE>ppl_ at CLASS@_add_ at CLASS_REPRESENT@(+Handle, +@!CLASS_REPRESENT@)</CODE><BR>
+   <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+   one obtained by adding
+   \c @!CLASS_REPRESENT@ to its @CLASS_REPRESENT@ system.
+   For a C polyhedron|COMMA| \c @!CLASS_REPRESENT@ must be
+   @A_CLASS_REPRESENT at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_addto_doc',
+`dnl
+m4_popdef(`m4_a_class_represent_replacements')`'dnl
+m4_pushdef(`m4_a_class_represent_replacements',
+           `equalities and non-strict inequalities,
+            equalities, lines|COMMA| rays and points')`'dnl
+<P><CODE>ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(
+                  +Handle,
+                  +@!CLASS_REPRESENT at _System)</CODE><BR>
+   <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+   one obtained by adding to its @CLASS_REPRESENT@ system the @CLASS_REPRESENT at s in
+   \c @!CLASS_REPRESENT at _System.
+   For a C polyhedron|COMMA| \c @!CLASS_REPRESENT at s must be a list of
+   @A_CLASS_REPRESENT at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_addto_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(
+                  +Handle,
+                  +@!REFINE_REPRESENT@)</CODE><BR>
+   <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+   one obtained by refining its @REFINE_REPRESENT@ system with
+   \c @!REFINE_REPRESENT at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_addto_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(
+                  +Handle,
+                  +@!REFINE_REPRESENT at _System)</CODE><BR>
+   <EM>Updates the m4_this_ppl_one_object referenced by \c Handle to
+   one obtained by refining its @REFINE_REPRESENT@ system with
+   the @REFINE_REPRESENT at s in \c @!REFINE_REPRESENT at _System.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the binary operator predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_binop_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at BINOP@(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P referenced by \c Handle_1
+   the @A_BINOP@ of \p P and the m4_this_ppl_one_object referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_binop_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at UB_EXACT@(+Handle_1, +Handle_2)</CODE><BR>
+    <EM>Succeeds if the least upper bound of the
+    m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+    with the m4_this_ppl_one_object referenced by \c Handle_2 is exact;
+    in which case the least upper bound is assigned
+    to \p P_1;
+    fails otherwise.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_binop_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_linear_ at PARTITION@(+Handle_1, +Handle_2, -Handle_3,
+                                        -Handle_4)</CODE><BR>
+  <EM>\c Handle_1 and \c Handle_2 are handles for elements \p P_1 and \p P_2
+  in the @CLASS@ domain. The predicate unifies handle
+  \c Handle_3 to a reference to the intersection of
+  \p P_1 and \p P_2 and \c Handle_4 to a reference to
+  a pointset powerset of nnc polyhedra \p P_4;
+  where \p P_4 is the linear partition of \p P_1 with respect to \p P_2.
+  This predicate is only provided if the
+  class \c Pointset_Powerset_NNC_Polyhedron
+  has been enabled when configuring the library.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_binop_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_approximate_ at PARTITION@(+Handle_1, +Handle_2, ?Boolean,
+                                             -Handle_3, -Handle_4)</CODE><BR>
+  <EM>\c Handle_1 and \c Handle_2 are handles for elements \p P_1 and \p P_2
+  in the @CLASS@ domain. The predicate unifies handle
+  \c Handle_3 to a reference to the intersection of
+  \p P_1 and \p P_2 and \c Handle_4 to a reference to
+  a pointset powerset of grids \p P_4 where:<BR>
+  if there is a finite linear partition of \p P_1 wrt \p P_2
+   \c Boolean is unified with the atom \c true and
+   \p P_4 is the linear partition;<BR>
+  otherwise \c Boolean is unified with the atom \c false
+    and \p P_4 is set to the singleton set that contains \p P_2.<BR>
+  This predicate is only provided if the
+  class \c Pointset_Powerset_Grid
+  has been enabled when configuring the library.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_binop_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_simplify_using_context_assign(+Handle_1, +Handle_2, ?Boolean)</CODE><BR>
+    <EM>Succeeds if and only if the intersection of m4_this_ppl_one_object \p P_1
+    referenced by \c Handle_1 and the m4_this_ppl_one_object \p P_2 referenced by \c Handle_2
+    is non-empty.
+    Assigns to \p P_1 its meet-preserving simplification with
+    respect to \p P_2.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the widen and extrapolation predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+<EM>Same as predicate `'dnl
+m4_ifelse(
+  m4_this_interface_class, Polyhedron,
+    <CODE>ppl_ at CLASS@_H79_widening_assign_with_tokens</CODE>/4,
+  m4_this_interface_class, Grid,
+    <CODE>ppl_ at CLASS@_congruence_widening_assign_with_tokens</CODE>/4,
+  m4_this_ppl_group, box,
+    <CODE>ppl_ at CLASS@_CC76_widening_assign_with_tokens</CODE>/4,
+  m4_this_ppl_group, wr_shape,
+    <CODE>ppl_ at CLASS@_H79_widening_assign_with_tokens</CODE>/4)</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+<EM>Same as predicate `'dnl
+m4_ifelse(
+  m4_this_interface_class, Polyhedron,
+    <CODE>ppl_ at CLASS@_H79_widening_assign</CODE>/2,
+  m4_this_interface_class, Grid,
+    <CODE>ppl_ at CLASS@_congruence_widening_assign</CODE>/2,
+  m4_this_ppl_group, box,
+    <CODE>ppl_ at CLASS@_CC76_widening_assign</CODE>/2,
+  m4_this_ppl_group, wr_shape,
+    <CODE>ppl_ at CLASS@_H79_widening_assign</CODE>/2)</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(+Handle_1, +Handle_2, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+   the @WIDEN at -widening of \p P_1 with the m4_this_ppl_one_object
+   referenced by \c Handle_2.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_widen_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at WIDEN@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+   the @WIDEN at -widening of \p P_1 with the m4_this_ppl_one_object
+   referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_widen_doc',
+`dnl
+m4_pushdef(`m4_a_limitedbounded_replacements', `,
+  |COMMA| further intersected with the smallest box containing \\p P_1')
+<P><CODE>ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(+Handle_1, +Handle_2, +Constraint_System, +C_unsigned_1, ?C_unsigned_2)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+   the @WIDENEXPN at -widening of \p P_1 with the m4_this_ppl_one_object
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1 at A_LIMITEDBOUNDED@.
+   The widening with tokens delay
+   technique is applied with \c C_unsigned_1 tokens;
+   \c C_unsigned_2 is unified with the number of tokens
+   remaining at the end of the operation.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_widen_doc',
+`dnl
+m4_pushdef(`m4_a_limitedbounded_replacements', `,
+  |COMMA| further intersected with the smallest box containing \\p P_1')
+<P><CODE>ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(+Handle_1, +Handle_2, +Constraint_System)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+   the @WIDENEXPN at -widening of \p P_1 with the m4_this_ppl_one_object
+   referenced by \c Handle_2 intersected with the constraints in
+   \c Constraint_System that are
+   satisfied by all the points of \p P_1 at A_LIMITEDBOUNDED@.</EM>
+
+')
+
+ m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_widen_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P_1 referenced by \c Handle_1
+   the @EXTRAPOLATION at -narrowing of \p P_1 and the m4_this_ppl_one_object
+   referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_widen_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the pointset powerset \p P_1 referenced by
+   \c Handle_1 the \extref{pps_certificate_widening|COMMA| BHZ03-widening}
+    between \p P_1 and the pointset powerset referenced by
+   \c Handle_2|COMMA| using the @DISJUNCT_WIDEN at -widening
+    certified by the convergence certificate for @A_DISJUNCT_WIDEN at .</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_widen_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(+Handle_1, +Handle_2, C_unsigned)</CODE><BR>
+    <EM>Assigns to the pointset powerset \p P_1 referenced by
+   \c Handle_1 the result of applying the
+    \extref{pps_bgp99_extrapolation|COMMA| BGP99 extrapolation operator}
+    between \p P_1 and the pointset powerset referenced by
+   \c Handle_2|COMMA| using the @DISJUNCT_WIDEN at -widening
+    and the cardinality threshold \c C_unsigned.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the transform predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_swap_build_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_swap(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Swaps the m4_this_ppl_one_object referenced by \c Handle_1
+   with the m4_this_ppl_one_object referenced by \c Handle_2.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_ at SIMPLIFY@(+Handle)</CODE><BR>
+  <EM>Assigns to the m4_this_ppl_one_object referenced by \c Handle
+  its @A_SIMPLIFY at .</EM>
+
+')
+
+m4_define(`m4_a_affimage_replacements',
+  `image, preimage')
+m4_define(`m4_b_affimage_replacements',
+  `assigning the affine, substituting the affine')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_trans_doc',
+`dnl
+m4_define(`m4_a_affimage_replacements',
+  `image, preimage')`'dnl
+m4_define(`m4_b_affimage_replacements',
+  `assigning the affine, substituting the affine')`'dnl
+<P><CODE>ppl_ at CLASS@_ at AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr, +Coeff)</CODE><BR>
+   <EM>Transforms the m4_this_ppl_one_object referenced by \c Handle
+   @B_AFFIMAGE@ expression for \c Lin_Expr/\c Coeff to \c PPL_Var.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_bounded_ at AFFIMAGE@(+Handle, +PPL_Var, +Lin_Expr_1, +Lin_Expr_2, +Coeff)</CODE><BR>
+  <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+  the generalized @A_AFFIMAGE@ with respect to the
+  generalized affine transfer relation
+  \c Lin_Expr_1/Coeff
+    \f$\leq\f$ \c PPL_Var
+      \f$\leq\f$ \c Lin_Expr_2/Coeff.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff)</CODE><BR>
+  <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+  the generalized @A_AFFIMAGE@ with respect to the
+  generalized affine transfer relation
+   \c PPL_Var \f$\bowtie\f$ \c Lin_Expr/\c Coeff|COMMA|
+   where \f$\bowtie\f$ is the symbol
+   represented by \c Relation_Symbol.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2)</CODE><BR>
+  <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+  the generalized @A_AFFIMAGE@ with respect to the
+  generalized affine transfer relation
+   \c Lin_Expr_1 \f$\bowtie\f$ \c Lin_Expr_2|COMMA|
+   where \f$\bowtie\f$ is the symbol
+   represented by \c Relation_Symbol.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_trans_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(+Handle, +PPL_Var, +Relation_Symbol, +Lin_Expr, +Coeff_1, +Coeff_2)</CODE><BR>
+  <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+  the generalized @A_AFFIMAGE@ with respect to the
+  generalized affine transfer relation
+   \c Lin_Expr_1 \f$\equiv_f\f$ \c Lin_Expr_2/\c Coeff_1|COMMA|
+   where \c Coeff_2 is bound to the modulus \p f.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(+Handle, +Lin_Expr_1, +Relation_Symbol, +Lin_Expr_2, +Coeff)</CODE><BR>
+  <EM>Assigns to m4_this_ppl_one_object \p P referenced by \c Handle
+  the generalized @A_AFFIMAGE@ with respect to the
+  generalized affine transfer relation
+   \c Lin_Expr_1  \f$\equiv_f\f$ \c Lin_Expr_2.
+   where \c Coeff is bound to the modulus \p f.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_unconstrain_space_dimension(+Handle, +PPL_Var)</CODE><BR>
+  <EM>Modifies the m4_this_ppl_one_object \p P referenced by \c Handle by unconstraining
+  the space dimension \c PPL_Var.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_unconstrain_space_dimensions(+Handle, +List_of_PPL_Var)</CODE><BR>
+  <EM>Modifies the m4_this_ppl_one_object \p P referenced by \c Handle by unconstraining
+  the space dimensions that are specified in \c List_of_PPL_Var.
+  The presence of duplicates in \c List_of_PPL_Var is a waste
+  but an innocuous one.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_trans_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_wrap_assign(+Handle, +List_of_PPL_Var, +Width, +Representation, +Overflow, +Constraint_System, +C_unsigned, +Boolean)</CODE><BR>
+  <EM>Transforms the m4_this_ppl_one_object \p P referenced by
+    <CODE>Handle</CODE> by wrapping the dimensions given by
+    <CODE>List_of_PPL_Vars</CODE> while respecting the specified
+    <CODE>Width</CODE>|COMMA| <CODE>Representation</CODE> and
+    <CODE>Overflow</CODE> behavior of all these variables. The
+    <CODE>Constraint_System</CODE> represents the conditional or
+    looping construct guard with respect to which wrapping is
+    performed.  The non-negative integer <CODE>C_unsigned</CODE> and
+    <CODE>Boolean</CODE> allow control of the complexity/precision
+    ratio; higher values for <CODE>C_unsigned</CODE> will lead to
+    possibly greater precision while a true value for
+    <CODE>Boolean</CODE> indicates that the space dimensions should be
+    wrapped individually.  See Section \extref{Wrapping_Operator|COMMA|
+    Wrapping Operator} for a more detailed description of this
+    operator.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for the concatenation predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_concat_doc',
+`dnl
+m4_popdef(`m4_binop_replacements')
+m4_popdef(`m4_Polyhedron_binop_replacements')
+m4_popdef(`m4_a_binop_replacements')
+m4_popdef(`m4_Polyhedron_a_binop_replacements')
+m4_pushdef(`m4_binop_replacements', `concatenate_assign')
+m4_pushdef(`m4_Polyhedron_binop_replacements', `concatenate_assign')
+m4_pushdef(`m4_a_binop_replacements', `concatenation')
+m4_pushdef(`m4_Polyhedron_a_binop_replacements', `concatenation')
+ <P><CODE>ppl_ at CLASS@_ at BINOP@(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Assigns to the m4_this_ppl_one_object \p P referenced by \c Handle_1
+   the @A_BINOP@ of \p P and the m4_this_ppl_one_object referenced by \c Handle_2.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the space changing predicates;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@(+Handle, +Dimension_Type)</CODE><BR>
+  <EM>Adds \c Dimension_Type new dimensions to the space enclosing
+  the m4_this_ppl_one_object \p P referenced by \c Handle
+  and @EMBEDPROJECT at s \p P in this space.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_remove_space_dimensions(+Handle, +List_of_PPL_Vars)</CODE><BR>
+  <EM>Removes from the vector space enclosing
+  the m4_this_ppl_one_object \p P referenced by \c Handle the space dimensions that
+  are specified in \c List_of_PPL_Var.  The presence
+  of duplicates in  \c List_of_PPL_Var is a waste but an innocuous one.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_remove_higher_space_dimensions(+Handle, +Dimension_Type)</CODE><BR>
+  <EM>Removes the higher dimensions from the vector space enclosing
+  the m4_this_ppl_one_object \p P referenced by \c Handle
+  so that|COMMA| upon successful return|COMMA| the new space dimension is
+  \c Dimension_Type.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type)</CODE><BR>
+  <EM>Expands the \c  PPL_Var-th
+  dimension of the vector space enclosing
+  the m4_this_ppl_one_object referenced by \c Handle to
+  \c Dimension_Type new space dimensions.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var)</CODE><BR>
+  <EM>Modifies the m4_this_ppl_one_object referenced by \c Handle
+  by folding the
+  space dimensions contained in \c List_of_PPL_Vars
+  into dimension \c PPL_Var.
+  The presence of duplicates in \c List_of_PPL_Vars is a waste
+  but an innocuous one.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_spacemod_doc',
+`dnl
+<P><CODE>ppl_ at CLASS@_map_space_dimensions(+Handle, +P_Func)</CODE><BR>
+  <EM>Remaps the dimensions of the vector space according to a
+  partial function.
+  This function is specified by means of the \c P_Func|COMMA|
+  which has \p n entries.
+  The result is undefined if \c P_Func does not encode a partial
+  function.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for each of the powerset predicates involving
+dnl iterators and disjuncts;
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_pps_iter_doc',
+`dnl
+<P><CODE>ppl_new_ at CLASS@_iterator_from_iterator(+Iterator_1, -Iterator_2)</CODE><BR>
+  <EM>Builds a new iterator \p it from the iterator referenced by
+  \c Iterator_1. <CODE>Iterator_2</CODE> is unified with the handle
+  for \p it.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_pps_other_doc',
+`dnl
+m4_pushdef(`m4_Pointset_Powerset_simplify_replacements',
+  `pairwise_reduce, omega_reduce')
+m4_pushdef(`m4_Pointset_Powerset_a_simplify_replacements',
+  `pairwise reduction, omega reduction')
+<P><CODE>ppl_ at CLASS@_ at SIMPLIFY@(+Handle)</CODE><BR>
+   <EM>Assigns the result of @A_SIMPLIFY@ on
+   the pointset powerset referenced by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_iterator_equals_iterator(+Iterator_1, +Iterator_2)</CODE><BR>
+   <EM>Succeeds if and only if the iterator referenced by
+   \c Iterator_1 is equal to the iterator referenced by
+   \c Iterator_2.</EM>
+
+')
+
+ m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_ at BEGINEND@_iterator(+Handle, -Iterator)</CODE><BR>
+  <EM>Unifies \c Iterator with a handle to an iterator "pointing"
+  to the @A_BEGINEND@ of
+  the sequence of disjuncts of the powerset referred to by \c Handle.</EM>
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_delete_ at CLASS@_iterator(+Iterator)</CODE><BR>
+  <EM>Invalidates the handle referenced by <CODE>Iterator</CODE>:
+  this makes sure the corresponding resources
+  will eventually be released.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_pps_iter_doc',
+ `dnl
+m4_pushdef(`m4_Pointset_Powerset_a_incdec_replacements',
+  `next, previous')
+<P><CODE>ppl_ at CLASS@_iterator_ at INCDEC@(+Iterator)</CODE><BR>
+  <EM>@!INCDEC at s the iterator referenced by \c Iterator
+  so that it "points" to the @A_INCDEC@ disjunct.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_iterator_get_disjunct(+Iterator, -Handle)</CODE><BR>
+  <EM>Unifies with \c Handle a reference to the disjunct referred
+  to by \c Iterator_1.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_drop_disjunct(+Handle, +Iterator)</CODE><BR>
+  <EM>If \p it is the iterator referred to by \c Iterator|COMMA|
+  drops from the pointset powerset referenced by \c Handle
+  the disjunct pointed to by \p it and
+  assigns to \p it an iterator to the next disjunct.</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_drop_disjuncts(+Handle, +Iterator_1, +Iterator_2)</CODE><BR>
+  <EM>If \p it_1 and \p it_2 are the iterators referred to by \c Iterator_1
+  and \c Iterator_2|COMMA| respectively|COMMA|
+  drops from the pointset powerset referenced by \c Handle
+   all the disjuncts from \p it_1 to \p it_2 (excluded).</EM>
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_pps_iter_doc',
+ `dnl
+<P><CODE>ppl_ at CLASS@_add_disjunct(+Handle_1, +Handle_2)</CODE><BR>
+  <EM>Adds to the pointset powerset referenced by \c Handle_1 a disjunct
+  referred to by \c Handle_2.</EM>
+
+')
+
+dnl -----------------------------------------------------------------
+dnl Documentation for _other_ ad hoc powerset predicates;
+dnl Note: this is only needed for the configure independent manual.
+dnl -----------------------------------------------------------------
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_pps_other_doc',
+`dnl
+m4_pushdef(`m4_Pointset_Powerset_comparison_replacements',
+         `geometrically_covers, geometrically_equals')
+m4_pushdef(`m4_Pointset_Powerset_a_comparison_replacements',
+         `geometrically covers, geometrically equals')
+<P><CODE>ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(+Handle_1, +Handle_2)</CODE><BR>
+   <EM>Succeeds if and only if the pointset powerset referenced by
+   \c Handle_2 @A_COMPARISON@
+   the pointset powerset referenced by \c Handle_1;
+   see Section \extref{Geometric_Comparisons|COMMA| Geometric Comparisons}
+  in the main \extref{preamble|COMMA| PPL User Manual}.</EM>
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
new file mode 100644
index 0000000..054ac33
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_code.m4
@@ -0,0 +1,631 @@
+dnl  -*- C++ -*-
+m4_divert(-1)
+
+dnl This m4 file contains the program code for generating the
+dnl files ppl_prolog_DOMAIN.hh for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+extern "C" Prolog_foreign_return_type
+ppl_ at CLASS@_linear_ at PARTITION@(Prolog_term_ref t_ph,
+			     Prolog_term_ref t_qh,
+			     Prolog_term_ref t_inters,
+			     Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Prolog_term_ref t_nd,
+                                               Prolog_term_ref t_uoe,
+                                               Prolog_term_ref t_ph);
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(
+                     Prolog_term_ref t_ph_source, Prolog_term_ref t_ph);
+
+')
+
+  m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity(
+                     Prolog_term_ref t_ph_source,
+                     Prolog_term_ref t_ph,
+                     Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(Prolog_term_ref t_clist,
+						    Prolog_term_ref t_ph);
+')
+
+  m4_define(`ppl_ at CLASS@_swap_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_delete_ at CLASS@(Prolog_term_ref t_ph);
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at DIMENSION@(Prolog_term_ref t_ph, Prolog_term_ref t_sd);
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_glist);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+					     Prolog_term_ref t_glist);
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`extern "C" Prolog_foreign_return_type
+ppl_new_ at CLASS@_iterator_from_iterator(Prolog_term_ref t_source,
+				       Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BEGINEND@_iterator(Prolog_term_ref t_pps,
+				  Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_delete_ at CLASS@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_delete_ at CLASS@_iterator(Prolog_term_ref t_it);
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at INCDEC@_iterator(Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_iterator_equals_iterator(Prolog_term_ref t_it1,
+				       Prolog_term_ref t_it2);
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_get_disjunct(Prolog_term_ref t_it,
+			   Prolog_term_ref t_disj);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_disjunct(Prolog_term_ref t_pps,
+			    Prolog_term_ref t_it);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_disjuncts(Prolog_term_ref t_pps,
+			     Prolog_term_ref t_it1,
+			     Prolog_term_ref t_it2);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_disjunct(Prolog_term_ref t_ph, Prolog_term_ref t_d);
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+  `dnl
+  extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_approximate_ at PARTITION@(Prolog_term_ref t_ph,
+				    Prolog_term_ref t_qh,
+				    Prolog_term_ref t_finite,
+				    Prolog_term_ref t_inters,
+				    Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(Prolog_term_ref t_ph,
+						 Prolog_term_ref t_c,
+						 Prolog_term_ref t_r);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at HAS_PROPERTY@(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at SIMPLIFY@(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimension(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_unconstrain_space_dimensions(Prolog_term_ref t_ph,
+                           Prolog_term_ref t_vlist);
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_constrains(Prolog_term_ref t_ph,
+                          Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(Prolog_term_ref t_ph,
+				       Prolog_term_ref t_expr);
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_has_ at UPPERLOWER@_bound(Prolog_term_ref t_ph, Prolog_term_ref t_v,
+		       Prolog_term_ref t_n, Prolog_term_ref t_d,
+		       Prolog_term_ref t_closed);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+		       Prolog_term_ref t_n,  Prolog_term_ref t_d,
+		       Prolog_term_ref t_maxmin);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MAXMIN@_with_point(Prolog_term_ref t_ph,
+				  Prolog_term_ref t_le_expr,
+				  Prolog_term_ref t_n,
+                                  Prolog_term_ref t_d,
+				  Prolog_term_ref t_maxmin,
+                                  Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(Prolog_term_ref t_lhs,
+				   Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_equals_ at CLASS@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_equals_ at CLASS@(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_OK_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_OK(Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at CLASS_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@(Prolog_term_ref t_ph, Prolog_term_ref t_c);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s(Prolog_term_ref t_ph,
+				   Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at BINOP@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_positive_time_elapse_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_positive_time_elapse_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_simplify_using_context_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_b);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at UB_EXACT@
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_le, Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d, Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_r, Prolog_term_ref t_le,
+   Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_lhs, Prolog_term_ref t_r, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_bounded_ at AFFIMAGE@
+  (Prolog_term_ref t_ph,
+   Prolog_term_ref t_v, Prolog_term_ref t_lb_le, Prolog_term_ref t_ub_le,
+   Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at WIDEN@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_widening_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+
+dnl FIXME: This code is redundant as there is no options for tokens
+dnl        in the current C++ code.
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_with_tokens(
+										      Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+										      Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+									  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+							  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+							  Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+
+  ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+								  Prolog_term_ref t_lhs, Prolog_term_ref t_rhs,
+								  Prolog_term_ref t_d);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist,
+   Prolog_term_ref t_ti, Prolog_term_ref t_to);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign
+  (Prolog_term_ref t_lhs, Prolog_term_ref t_rhs, Prolog_term_ref t_clist);
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nnd);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist);
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_remove_higher_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_nd);
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_expand_space_dimension
+  (Prolog_term_ref t_ph, Prolog_term_ref t_v, Prolog_term_ref t_nd);
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_fold_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_v);
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_map_space_dimensions
+  (Prolog_term_ref t_ph, Prolog_term_ref t_pfunc);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_some_non_integer_points
+  (Prolog_term_ref t_ph, Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_drop_some_non_integer_points_2
+  (Prolog_term_ref t_ph, Prolog_term_ref t_vlist, Prolog_term_ref t_cc);
+
+')
+
+m4_define(`ppl_ at CLASS@_ascii_dump_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ascii_dump
+  (Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_ at MEMBYTES@(Prolog_term_ref t_pps,
+			 Prolog_term_ref t_m);
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(Prolog_term_ref t_pset);
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+     (Prolog_term_ref t_pset_before,
+      Prolog_term_ref t_pset_after);
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+     (Prolog_term_ref t_pset,
+      Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+     (Prolog_term_ref t_pset_before,
+      Prolog_term_ref t_pset_after,
+      Prolog_term_ref t_g);
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@
+     (Prolog_term_ref t_pset,
+      Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2
+     (Prolog_term_ref t_pset_before,
+      Prolog_term_ref t_pset_after,
+      Prolog_term_ref t_ph);
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@
+     (Prolog_term_ref t_pset,
+      Prolog_term_ref t_ph_decreasing,
+      Prolog_term_ref t_ph_bounded);
+
+')
+
+m4_define(`ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2
+     (Prolog_term_ref t_pset_before,
+      Prolog_term_ref t_pset_after,
+      Prolog_term_ref t_ph_decreasing,
+      Prolog_term_ref t_ph_bounded);
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_wrap_assign
+     (Prolog_term_ref t_ph,
+      Prolog_term_ref t_vars,
+      Prolog_term_ref t_w,
+      Prolog_term_ref t_r,
+      Prolog_term_ref t_o,
+      Prolog_term_ref t_cs,
+      Prolog_term_ref t_complexity,
+      Prolog_term_ref t_ind);
+
+')
+
+m4_define(`ppl_ at CLASS@_frequency_code',
+  `extern "C" Prolog_foreign_return_type
+  ppl_ at CLASS@_frequency(Prolog_term_ref t_ph, Prolog_term_ref t_le_expr,
+		       Prolog_term_ref t_freqn,  Prolog_term_ref t_freqd,
+		       Prolog_term_ref t_valn,  Prolog_term_ref t_vald);
+
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
new file mode 100644
index 0000000..2212ad8
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_hh_files.m4
@@ -0,0 +1,71 @@
+m4_divert(-1)
+m4_define(`dnl', `m4_dnl')
+
+dnl This m4 file is used to generate ppl_prolog_domains.hh
+dnl and files ppl_prolog_DOMAIN.hh, for each interface domain DOMAIN
+dnl in ppl_interface instantiations.m4 using the code in
+dnl ppl_interface_generator_prolog_hh_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include files defining macros that generate the non-fixed part.
+m4_include(ppl_interface_generator_prolog_hh_code.m4)
+m4_include(ppl_interface_generator_prolog_procedure_generators.m4)
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_domains.hh << ___END_OF_FILE___
+/* Prolog interface code: inclusion of all domain declarations.
+m4_include(`ppl_interface_generator_copyright')dnl
+*/
+m4_divert(-1)
+
+dnl Ensure any schematic procedure macro that is not defined
+dnl in the code file outputs a warning message.
+m4_define(`m4_procedure_schema_debug', `m4_dumpdef($1`'_code)')
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl Prefix extra code for each class.
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_domains.hh << ___END_OF_FILE___
+`#'include "ppl_prolog_`'m4_current_interface.hh"
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_`'m4_current_interface.hh << ___END_OF_FILE___
+/* Prolog m4_current_interface interface code: declarations.
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+
+m4_undefine(`m4_current_interface')`'dnl
+')
+
+m4_divert`'dnl
+
+`#'include "ppl_prolog_common_defs.hh"`'dnl
+dnl
+dnl Generate the non-fixed part of the file.
+m4_all_code`'dnl
+___END_OF_FILE___
+dnl
+dnl End of file generation.
+
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
new file mode 100644
index 0000000..ed54e60
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_procedure_generators.m4
@@ -0,0 +1,133 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of predicates
+dnl for the Prolog interfaces; this includes:
+dnl - the list in the imported file and any Prolog specific predicates;
+dnl   ppl_interface_generator_common_procedure_generators.m4;
+dnl - the list of library predicates needed for the system dependent files.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Include the language independent macros.
+m4_include(ppl_interface_generator_common.m4)
+m4_include(ppl_interface_generator_common_dat.m4)
+m4_include(ppl_interface_generator_common_procedure_generators.m4)
+
+dnl Library predicate list.
+m4_define(`m4_library_predicate_list', `dnl
+ppl_version_major/1,
+ppl_version_minor/1,
+ppl_version_revision/1,
+ppl_version_beta/1,
+ppl_version/1,
+ppl_banner/1,
+ppl_max_space_dimension/1,
+ppl_Coefficient_bits/1,
+ppl_Coefficient_is_bounded/0,
+ppl_Coefficient_max/1,
+ppl_Coefficient_min/1,
+ppl_initialize/0 *nofail,
+ppl_finalize/0 *nofail,
+ppl_set_rounding_for_PPL/0 *nofail,
+ppl_restore_pre_PPL_rounding/0 *nofail,
+ppl_irrational_precision/1,
+ppl_set_irrational_precision/1,
+ppl_set_timeout_exception_atom/1 *nofail,
+ppl_timeout_exception_atom/1,
+ppl_set_timeout/1 *nofail,
+ppl_reset_timeout/0 *nofail,
+ppl_set_deterministic_timeout/2 *nofail,
+ppl_reset_deterministic_timeout/0 *nofail,
+ppl_new_MIP_Problem_from_space_dimension/2,
+ppl_new_MIP_Problem/5,
+ppl_new_MIP_Problem_from_MIP_Problem/2,
+ppl_MIP_Problem_swap/2 *nofail,
+ppl_delete_MIP_Problem/1 *nofail,
+ppl_MIP_Problem_space_dimension/2,
+ppl_MIP_Problem_integer_space_dimensions/2,
+ppl_MIP_Problem_constraints/2,
+ppl_MIP_Problem_objective_function/2,
+ppl_MIP_Problem_optimization_mode/2,
+ppl_MIP_Problem_clear/1,
+ppl_MIP_Problem_add_space_dimensions_and_embed/2,
+ppl_MIP_Problem_add_to_integer_space_dimensions/2,
+ppl_MIP_Problem_add_constraint/2,
+ppl_MIP_Problem_add_constraints/2,
+ppl_MIP_Problem_set_objective_function/2,
+ppl_MIP_Problem_set_optimization_mode/2,
+ppl_MIP_Problem_set_control_parameter/2 *nofail,
+ppl_MIP_Problem_get_control_parameter/3,
+ppl_MIP_Problem_is_satisfiable/1,
+ppl_MIP_Problem_solve/2,
+ppl_MIP_Problem_feasible_point/2,
+ppl_MIP_Problem_optimizing_point/2,
+ppl_MIP_Problem_optimal_value/3,
+ppl_MIP_Problem_evaluate_objective_function/4,
+ppl_MIP_Problem_OK/1
+ppl_MIP_Problem_ascii_dump/1,
+ppl_new_PIP_Problem_from_space_dimension/2,
+ppl_new_PIP_Problem/4,
+ppl_new_PIP_Problem_from_PIP_Problem/2,
+ppl_PIP_Problem_swap/2 *nofail,
+ppl_delete_PIP_Problem/1 *nofail,
+ppl_PIP_Problem_space_dimension/2,
+ppl_PIP_Problem_parameter_space_dimensions/2,
+ppl_PIP_Problem_constraints/2,
+ppl_PIP_Problem_clear/1,
+ppl_PIP_Problem_add_space_dimensions_and_embed/3,
+ppl_PIP_Problem_add_to_parameter_space_dimensions/2,
+ppl_PIP_Problem_add_constraint/2,
+ppl_PIP_Problem_add_constraints/2,
+ppl_PIP_Problem_set_control_parameter/2 *nofail,
+ppl_PIP_Problem_get_control_parameter/3,
+ppl_PIP_Problem_has_big_parameter_dimension/2,
+ppl_PIP_Problem_set_big_parameter_dimension/2,
+ppl_PIP_Problem_is_satisfiable/1,
+ppl_PIP_Problem_solve/2,
+ppl_PIP_Problem_solution/2,
+ppl_PIP_Problem_optimizing_solution/2,
+ppl_PIP_Problem_OK/1,
+ppl_PIP_Problem_ascii_dump/1,
+ppl_PIP_Tree_Node_constraints/2,
+ppl_PIP_Tree_Node_is_solution/1,
+ppl_PIP_Tree_Node_is_decision/1,
+ppl_PIP_Tree_Node_is_bottom/1,
+ppl_PIP_Tree_Node_artificials/2,
+ppl_PIP_Tree_Node_OK/1,
+ppl_PIP_Tree_Node_parametric_values/3,
+ppl_PIP_Tree_Node_true_child/2,
+ppl_PIP_Tree_Node_false_child/2`'dnl
+')
+
+m4_define(`m4_procedure_list',
+  `m4_echo_unquoted(`m4_common_procedure_list',
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/1 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@/2 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@/3 +simple,
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/2 +simple,
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2/3 +simple,
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2/4 +simple,
+)
+')
diff --git a/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4 b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
new file mode 100644
index 0000000..eb7476c
--- /dev/null
+++ b/interfaces/Prolog/ppl_interface_generator_prolog_systems.m4
@@ -0,0 +1,79 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file defines macros needed for generating
+dnl the Prolog system-dependent code files.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_include(`ppl_interface_generator_common.m4')
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+
+dnl m4_separator(String)
+dnl
+dnl String is returned unless if it is empty, then use `,'
+m4_define(`m4_separator', `m4_ifelse($1, `', `,', `$1')')`'dnl
+dnl
+dnl m4_pattern_delimiter(String)
+dnl
+dnl For the system files we use the macro names
+dnl where the patterns have no delimiters
+dnl FIXME The `@' is temporary.
+dnl This needs to be replaced by the empty string `'
+dnl when the dat.m4 and code.m4 files are changed.
+m4_define(`m4_pattern_delimiter', `@')`'dnl
+dnl
+dnl m4_term_sequence(Number of Iterations, String to be Repeated)
+dnl
+dnl generates a sequence of strings with the option of
+dnl identifying each string uniquely and the option of
+dnl changing the separator from the default `,'.
+m4_define(`m4_term_sequence',
+  `m4_ifelse(`$1', 0, ,
+     `$2(1)`'m4_ifelse(`$1', 1, ,
+       `m4_forloop(`i', 2, `$1', `m4_separator(`$3') $2(i)')')')')
+
+dnl m4_library_names_to_code(Class_Kind,
+dnl                            Procedure_Name1, Procedure_Name2, ...)
+dnl
+dnl Each name from the second argument onwards is replaced
+dnl with the code and then the schema patterns in the code
+dnl are replaced by the various instances.
+m4_define(`m4_library_names_to_code', `dnl
+m4_ifelse($#, 0, ,$#, 1, ,$#, 2, m4_get_schematic_code($2, $1),
+       `dnl
+m4_get_schematic_code($2, $1)`'dnl
+m4_library_names_to_code(m4_incr($1), m4_shift(m4_shift($@)))`'dnl
+')`'dnl
+')
+
+dnl ppl_prolog_sys_code
+dnl
+dnl For each recognised class in the "classes" list,
+dnl takes main predicate input list and sends one line at a time to
+dnl a macro that adds extensions for the result of
+dnl a macro that sets the class and the schema(s).
+m4_define(`ppl_prolog_sys_code', `dnl
+m4_library_names_to_code(0, m4_library_predicate_list)`'dnl
+m4_all_code`'dnl
+')
diff --git a/interfaces/Prolog/ppl_prolog_common.cc b/interfaces/Prolog/ppl_prolog_common.cc
new file mode 100644
index 0000000..d0dc23f
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common.cc
@@ -0,0 +1,3115 @@
+/* Common part of the Prolog interfaces: variables and non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_prolog_common_defs.hh"
+#include <exception>
+#include <stdexcept>
+#include <sstream>
+#include <climits>
+#include <typeinfo>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+Allocation_Tracker::Allocation_Tracker() {
+}
+
+Allocation_Tracker::~Allocation_Tracker() {
+  Set::size_type n = s.size();
+  if (n > 0)
+    std::cerr
+      << "Interfaces::Prolog::Allocation_Tracker: "
+      << n << " object(s) leaked!"
+      << std::endl;
+}
+
+Allocation_Tracker allocation_tracker;
+
+#endif // PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+
+
+// For the out-of-memory exception.
+Prolog_atom out_of_memory_exception_atom;
+
+// For Prolog lists.
+Prolog_atom a_nil;
+
+// For variables.
+Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+Prolog_atom a_plus;
+Prolog_atom a_minus;
+Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+Prolog_atom a_slash;
+
+// For constraints.
+Prolog_atom a_less_than;
+Prolog_atom a_equal_less_than;
+Prolog_atom a_equal;
+Prolog_atom a_greater_than_equal;
+Prolog_atom a_greater_than;
+
+// For congruences.
+Prolog_atom a_is_congruent_to;
+Prolog_atom a_modulo;
+
+// For generators.
+Prolog_atom a_line;
+Prolog_atom a_ray;
+Prolog_atom a_point;
+Prolog_atom a_closure_point;
+
+// For grid_generators.
+Prolog_atom a_grid_line;
+Prolog_atom a_parameter;
+Prolog_atom a_grid_point;
+
+// For artificial_parameters.
+Prolog_atom a_divided_by;
+
+// For the relation between a polyhedron and a constraint.
+Prolog_atom a_is_disjoint;
+Prolog_atom a_strictly_intersects;
+Prolog_atom a_is_included;
+Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+Prolog_atom a_empty;
+
+// Denotes the universe polyhedron.
+Prolog_atom a_universe;
+
+// Denotes the maximization mode for optimization problems.
+Prolog_atom a_max;
+
+// Denotes the minimization mode for optimization problems.
+Prolog_atom a_min;
+
+// Denote possible widths of bounded integer types.
+Prolog_atom a_bits_8;
+Prolog_atom a_bits_16;
+Prolog_atom a_bits_32;
+Prolog_atom a_bits_64;
+Prolog_atom a_bits_128;
+
+// Denote possible representations of bounded integer types.
+Prolog_atom a_unsigned;
+Prolog_atom a_signed_2_complement;
+
+// Denote possible overflow behavior of bounded integer types.
+Prolog_atom a_overflow_wraps;
+Prolog_atom a_overflow_undefined;
+Prolog_atom a_overflow_impossible;
+
+// Denote possible outcomes of MIP and PIP problems solution attempts.
+Prolog_atom a_unfeasible;
+Prolog_atom a_unbounded;
+Prolog_atom a_optimized;
+
+// Denotes an open interval boundary.
+Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+Prolog_atom a_minf;
+Prolog_atom a_pinf;
+
+// Denote complexity classes.
+Prolog_atom a_polynomial;
+Prolog_atom a_simplex;
+Prolog_atom a_any;
+
+// Denote control_parameters.
+Prolog_atom a_pricing;
+Prolog_atom a_pricing_steepest_edge_float;
+Prolog_atom a_pricing_steepest_edge_exact;
+Prolog_atom a_pricing_textbook;
+
+Prolog_atom a_cutting_strategy;
+Prolog_atom a_cutting_strategy_first;
+Prolog_atom a_cutting_strategy_deepest;
+Prolog_atom a_cutting_strategy_all;
+
+Prolog_atom a_pivot_row_strategy;
+Prolog_atom a_pivot_row_strategy_first;
+Prolog_atom a_pivot_row_strategy_max_column;
+
+// Default timeout exception atom.
+Prolog_atom a_time_out;
+
+// "Out of memory" exception atom.
+Prolog_atom a_out_of_memory;
+
+// Boolean constants.
+Prolog_atom a_true;
+Prolog_atom a_false;
+
+// To build exception terms.
+Prolog_atom a_ppl_overflow_error;
+Prolog_atom a_ppl_domain_error;
+Prolog_atom a_ppl_length_error;
+Prolog_atom a_ppl_invalid_argument;
+Prolog_atom a_ppl_logic_error;
+Prolog_atom a_ppl_representation_error;
+Prolog_atom a_expected;
+Prolog_atom a_found;
+Prolog_atom a_where;
+
+const Prolog_Interface_Atom prolog_interface_atoms[] = {
+  { &a_nil,                      "[]" },
+
+  { &a_dollar_VAR,               "$VAR" },
+
+  { &a_plus,                     "+" },
+  { &a_minus,                    "-" },
+  { &a_asterisk,                 "*" },
+
+  { &a_slash,                    "/" },
+
+  { &a_equal,                    "=" },
+  { &a_greater_than_equal,       ">=" },
+  { &a_equal_less_than,          "=<" },
+  { &a_greater_than,             ">" },
+  { &a_less_than,                "<" },
+
+  { &a_is_congruent_to,          "=:=" },
+  { &a_modulo,                   "/" },
+
+  { &a_divided_by,               "/" },
+
+  { &a_line,                     "line" },
+  { &a_ray,                      "ray" },
+  { &a_point,                    "point" },
+  { &a_closure_point,            "closure_point" },
+
+  { &a_grid_line,                "grid_line" },
+  { &a_parameter,                "parameter" },
+  { &a_grid_point,               "grid_point" },
+
+  { &a_is_disjoint,              "is_disjoint" },
+  { &a_strictly_intersects,      "strictly_intersects" },
+  { &a_is_included,              "is_included" },
+  { &a_saturates,                "saturates" },
+
+  { &a_subsumes,                 "subsumes" },
+
+  { &a_c,                        "c" },
+
+  { &a_empty,                    "empty" },
+  { &a_universe,                 "universe" },
+
+  { &a_max,                      "max" },
+  { &a_min,                      "min" },
+
+  { &a_bits_8,                   "bits_8" },
+  { &a_bits_16,                  "bits_16" },
+  { &a_bits_32,                  "bits_32" },
+  { &a_bits_64,                  "bits_64" },
+  { &a_bits_128,                 "bits_128" },
+
+  { &a_unsigned,                 "unsigned" },
+  { &a_signed_2_complement,      "signed_2_complement" },
+
+  { &a_overflow_wraps,           "overflow_wraps" },
+  { &a_overflow_undefined,       "overflow_undefined" },
+  { &a_overflow_impossible,      "overflow_impossible" },
+
+  { &a_unfeasible,               "unfeasible" },
+  { &a_unbounded,                "unbounded" },
+  { &a_optimized,                "optimized" },
+
+  { &a_o,                        "o" },
+  { &a_i,                        "i" },
+
+  { &a_minf,                     "minf" },
+  { &a_pinf,                     "pinf" },
+
+  { &a_polynomial,               "polynomial" },
+  { &a_simplex,                  "simplex" },
+  { &a_any,                      "any" },
+
+  { &a_pricing,                  "pricing" },
+  { &a_pricing_steepest_edge_float,
+                                 "pricing_steepest_edge_float" },
+  { &a_pricing_steepest_edge_exact,
+                                 "pricing_steepest_edge_exact" },
+  { &a_pricing_textbook,         "pricing_textbook" },
+
+  { &a_cutting_strategy,         "cutting_strategy" },
+  { &a_cutting_strategy_first,   "cutting_strategy_first" },
+  { &a_cutting_strategy_deepest, "cutting_strategy_deepest" },
+  { &a_cutting_strategy_all,     "cutting_strategy_all" },
+
+  { &a_pivot_row_strategy,       "pivot_row_strategy" },
+  { &a_pivot_row_strategy_first, "pivot_row_strategy_first" },
+  { &a_pivot_row_strategy_max_column,
+                                 "pivot_row_strategy_max_column" },
+
+  { &a_time_out,                 "time_out" },
+  { &a_out_of_memory,            "out_of_memory" },
+
+  { &a_true,                     "true" },
+  { &a_false,                    "false" },
+
+  { &a_ppl_invalid_argument,     "ppl_invalid_argument" },
+  { &a_ppl_overflow_error,       "ppl_overflow_error" },
+  { &a_ppl_domain_error,         "ppl_domain_error" },
+  { &a_ppl_length_error,         "ppl_length_error" },
+  { &a_ppl_invalid_argument,     "ppl_invalid_argument" },
+  { &a_ppl_logic_error,          "ppl_logic_error" },
+  { &a_ppl_representation_error, "ppl_representation_error" },
+  { &a_expected,                 "expected" },
+  { &a_found,                    "found" },
+  { &a_where,                    "where" },
+  { 0,                           0 }
+};
+
+Prolog_term_ref
+Prolog_atom_term_from_string(const char* s) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_put_atom(t, Prolog_atom_from_string(s));
+  return t;
+}
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref max = Prolog_new_term_ref();
+  Prolog_put_ulong(max, e.max());
+  Prolog_construct_compound(max,
+                            Prolog_atom_from_string("unsigned_integer"
+                                                    "_less_or_equal"),
+                            max);
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected, max);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_unsigned_integer& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+                            Prolog_atom_term_from_string("unsigned_integer"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const non_linear& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+                            Prolog_atom_term_from_string
+                            ("linear_expression_or_constraint"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_variable& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found,
+                            e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+                            Prolog_atom_term_from_string
+                            ("$VAR(unsigned_integer)"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_integer& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+                            Prolog_atom_term_from_string("integer"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const ppl_handle_mismatch& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_construct_compound(expected, a_expected,
+                            Prolog_atom_term_from_string("handle"));
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_an_optimization_mode& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("max"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("min"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_complexity_class& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("polynomial"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("simplex"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("any"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+  handle_exception(const not_a_control_parameter_name& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pricing"), expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+  handle_exception(const not_a_control_parameter_value& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pricing_steepest_edge_float"),
+                        expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pricing_steepest_edge_exact"),
+                        expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pricing_textbook"),
+                        expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+  handle_exception(const not_a_pip_problem_control_parameter_name& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("cutting_strategy"),
+                        expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pivot_row_strategy"),
+                        expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+  handle_exception(const not_a_pip_problem_control_parameter_value& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("cutting_strategy_first"),
+                        expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("cutting_strategy_deepest"),
+                        expected);
+   Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("cutting_strategy_all"),
+                        expected);
+   Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pivot_row_strategy_first"),
+                        expected);
+    Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("pivot_row_strategy_max_column"),
+                        expected);
+ Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_universe_or_empty& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("universe"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("empty"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_boolean& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("true"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("false"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_bounded_integer_type_width& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("bits_8"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("bits_16"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("bits_32"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("bits_64"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("bits_128"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_bounded_integer_type_representation& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("unsigned"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("signed_2_complement"),
+                        expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_bounded_integer_type_overflow& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("overflow_wraps"),
+                        expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("overflow_undefined"),
+                        expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("overflow_impossible"),
+                        expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_relation& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("="), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string(">="), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("=<"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string(">"), expected);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string("<"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const not_a_nil_terminated_list& e) {
+  Prolog_term_ref found = Prolog_new_term_ref();
+  Prolog_construct_compound(found, a_found, e.term());
+
+  Prolog_term_ref expected = Prolog_new_term_ref();
+  Prolog_put_atom(expected, a_nil);
+  Prolog_construct_cons(expected,
+                        Prolog_atom_term_from_string
+                        ("Prolog_list"), expected);
+  Prolog_construct_compound(expected, a_expected, expected);
+
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string(e.where()));
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                            found, expected, where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const PPL_integer_out_of_range& e) {
+  Prolog_term_ref where = Prolog_new_term_ref();
+  Prolog_construct_compound(where, a_where,
+                            Prolog_atom_term_from_string("Coefficient_to_integer_term"));
+
+  Prolog_term_ref exception_term = Prolog_new_term_ref();
+  std::ostringstream s;
+  s << e.value();
+  std::string str = s.str();
+  Prolog_construct_compound(exception_term, a_ppl_representation_error,
+                            Prolog_atom_term_from_string(str.c_str()),
+                            where);
+  Prolog_raise_exception(exception_term);
+}
+
+void
+handle_exception(const unknown_interface_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, e.where());
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::overflow_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_overflow_error,
+                            Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::domain_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_domain_error,
+                            Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::length_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_length_error,
+                            Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::invalid_argument& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_invalid_argument,
+                            Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::logic_error& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_construct_compound(et, a_ppl_logic_error,
+                            Prolog_atom_term_from_string(e.what()));
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::bad_alloc&) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, out_of_memory_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const std::exception& e) {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, e.what());
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception() {
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom_chars(et, "PPL bug: unknown exception raised");
+  Prolog_raise_exception(et);
+}
+
+Parma_Polyhedra_Library::Watchdog* p_timeout_object = 0;
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher
+<Parma_Polyhedra_Library::Weightwatch_Traits> Weightwatch;
+
+Weightwatch* p_deterministic_timeout_object = 0;
+
+void
+reset_timeout() {
+  if (p_timeout_object) {
+    delete p_timeout_object;
+    p_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+void
+reset_deterministic_timeout() {
+  if (p_deterministic_timeout_object) {
+    delete p_deterministic_timeout_object;
+    p_deterministic_timeout_object = 0;
+    abandon_expensive_computations = 0;
+  }
+}
+
+Prolog_atom timeout_exception_atom;
+
+void
+handle_exception(const timeout_exception&) {
+  assert(p_timeout_object);
+  reset_timeout();
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, timeout_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+void
+handle_exception(const deterministic_timeout_exception&) {
+  assert(p_deterministic_timeout_object);
+  reset_deterministic_timeout();
+  Prolog_term_ref et = Prolog_new_term_ref();
+  Prolog_put_atom(et, timeout_exception_atom);
+  Prolog_raise_exception(et);
+}
+
+Prolog_term_ref
+variable_term(dimension_type varid) {
+  Prolog_term_ref v = Prolog_new_term_ref();
+  Prolog_put_ulong(v, varid);
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound(t, a_dollar_VAR, v);
+  return t;
+}
+
+Prolog_atom
+term_to_boolean(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_true || name == a_false))
+      return name;
+  }
+  throw not_a_boolean(t, where);
+}
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_universe || name == a_empty))
+      return name;
+  }
+  throw not_universe_or_empty(t, where);
+}
+
+Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+  PPL_DIRTY_TEMP_COEFFICIENT(n);
+  assert(Prolog_is_integer(t));
+  if (!Prolog_get_Coefficient(t, n))
+    abort();
+  return n;
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const Coefficient& n) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  if (!Prolog_put_Coefficient(t, n))
+    abort();
+  return t;
+}
+
+bool
+unify_long(Prolog_term_ref t, long l) {
+  Prolog_term_ref t_l = Prolog_new_term_ref();
+  return Prolog_put_long(t_l, l) && Prolog_unify(t, t_l);
+}
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l) {
+  Prolog_term_ref t_l = Prolog_new_term_ref();
+  return Prolog_put_ulong(t_l, l) && Prolog_unify(t, t_l);
+}
+
+Linear_Expression
+build_linear_expression(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_integer(t))
+    return Linear_Expression(integer_term_to_Coefficient(t));
+  else if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    switch (arity) {
+    case 1:
+      {
+        Prolog_term_ref arg = Prolog_new_term_ref();
+        Prolog_get_arg(1, t, arg);
+        if (functor == a_minus)
+          // Unary minus.
+          return -build_linear_expression(arg, where);
+        else if (functor == a_dollar_VAR)
+          // Variable.
+          return Variable(term_to_unsigned<dimension_type>(arg, where));
+      }
+      break;
+    case 2:
+      {
+        Prolog_term_ref arg1 = Prolog_new_term_ref();
+        Prolog_term_ref arg2 = Prolog_new_term_ref();
+        Prolog_get_arg(1, t, arg1);
+        Prolog_get_arg(2, t, arg2);
+        if (functor == a_plus)
+          // Plus.
+          if (Prolog_is_integer(arg1))
+            return integer_term_to_Coefficient(arg1)
+              + build_linear_expression(arg2, where);
+          else if (Prolog_is_integer(arg2))
+            return build_linear_expression(arg1, where)
+              + integer_term_to_Coefficient(arg2);
+          else
+            return build_linear_expression(arg1, where)
+              + build_linear_expression(arg2, where);
+        else if (functor == a_minus)
+          // Minus.
+          if (Prolog_is_integer(arg1))
+            return integer_term_to_Coefficient(arg1)
+              - build_linear_expression(arg2, where);
+          else if (Prolog_is_integer(arg2))
+            return build_linear_expression(arg1, where)
+              - integer_term_to_Coefficient(arg2);
+          else
+            return build_linear_expression(arg1, where)
+              - build_linear_expression(arg2, where);
+        else if (functor == a_asterisk) {
+          // Times.
+          if (Prolog_is_integer(arg1))
+            return integer_term_to_Coefficient(arg1)
+              * build_linear_expression(arg2, where);
+          else if (Prolog_is_integer(arg2))
+            return build_linear_expression(arg1, where)
+              * integer_term_to_Coefficient(arg2);
+        }
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Constraint
+build_constraint(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (functor == a_equal)
+        // =
+        if (Prolog_is_integer(arg1))
+          return integer_term_to_Coefficient(arg1)
+            == build_linear_expression(arg2, where);
+        else if (Prolog_is_integer(arg2))
+          return build_linear_expression(arg1, where)
+            == integer_term_to_Coefficient(arg2);
+        else
+          return build_linear_expression(arg1, where)
+            == build_linear_expression(arg2, where);
+      else if (functor == a_equal_less_than)
+        // =<
+        if (Prolog_is_integer(arg1))
+          return integer_term_to_Coefficient(arg1)
+            <= build_linear_expression(arg2, where);
+        else if (Prolog_is_integer(arg2))
+          return build_linear_expression(arg1, where)
+            <= integer_term_to_Coefficient(arg2);
+        else
+          return build_linear_expression(arg1, where)
+            <= build_linear_expression(arg2, where);
+      else if (functor == a_greater_than_equal)
+        // >=
+        if (Prolog_is_integer(arg1))
+          return integer_term_to_Coefficient(arg1)
+            >= build_linear_expression(arg2, where);
+        else if (Prolog_is_integer(arg2))
+          return build_linear_expression(arg1, where)
+            >= integer_term_to_Coefficient(arg2);
+        else
+          return build_linear_expression(arg1, where)
+            >= build_linear_expression(arg2, where);
+      else if (functor == a_less_than)
+        // <
+        if (Prolog_is_integer(arg1))
+          return integer_term_to_Coefficient(arg1)
+            < build_linear_expression(arg2, where);
+        else if (Prolog_is_integer(arg2))
+          return build_linear_expression(arg1, where)
+            < integer_term_to_Coefficient(arg2);
+        else
+          return build_linear_expression(arg1, where)
+            < build_linear_expression(arg2, where);
+      else if (functor == a_greater_than) {
+        // >
+        if (Prolog_is_integer(arg1))
+          return integer_term_to_Coefficient(arg1)
+            > build_linear_expression(arg2, where);
+        else if (Prolog_is_integer(arg2))
+          return build_linear_expression(arg1, where)
+            > integer_term_to_Coefficient(arg2);
+        else
+          return build_linear_expression(arg1, where)
+            > build_linear_expression(arg2, where);
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Congruence
+build_congruence(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (functor == a_modulo) {
+        // /
+        if (Prolog_is_integer(arg2)) {
+          Prolog_atom functor1;
+          int arity1;
+          Prolog_get_compound_name_arity(arg1, &functor1, &arity1);
+          if (arity1 == 2) {
+            if (functor1 == a_is_congruent_to) {
+              // =:=
+              Prolog_term_ref arg11 = Prolog_new_term_ref();
+              Prolog_term_ref arg12 = Prolog_new_term_ref();
+              Prolog_get_arg(1, arg1, arg11);
+              Prolog_get_arg(2, arg1, arg12);
+              if (Prolog_is_integer(arg12))
+                return (build_linear_expression(arg11, where)
+                        %= integer_term_to_Coefficient(arg12))
+                  / integer_term_to_Coefficient(arg2);
+              else
+                return (build_linear_expression(arg11, where)
+                        %= build_linear_expression(arg12, where))
+                  / integer_term_to_Coefficient(arg2);
+            }
+          }
+        }
+      }
+      else
+        if (functor == a_is_congruent_to)
+          // =:=
+          if (Prolog_is_integer(arg2))
+            return build_linear_expression(arg1, where)
+              %= integer_term_to_Coefficient(arg2);
+          else
+            return build_linear_expression(arg1, where)
+              %= build_linear_expression(arg2, where);
+        else
+          if (functor == a_equal) {
+            // =
+            if (Prolog_is_integer(arg1))
+              return (build_linear_expression(arg2, where)
+                      %= integer_term_to_Coefficient(arg1)) / 0;
+            else if (Prolog_is_integer(arg2))
+              return (build_linear_expression(arg1, where)
+                      %= integer_term_to_Coefficient(arg2)) / 0;
+            else
+              return (build_linear_expression(arg1, where)
+                      %= build_linear_expression(arg2, where)) / 0;
+          }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Generator
+build_generator(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      if (functor == a_line)
+        return Generator::line(build_linear_expression(arg, where));
+      else if (functor == a_ray)
+        return Generator::ray(build_linear_expression(arg, where));
+      else if (functor == a_point)
+        return Generator::point(build_linear_expression(arg, where));
+      else if (functor == a_closure_point)
+        return Generator::closure_point(build_linear_expression(arg, where));
+    }
+    else if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (Prolog_is_integer(arg2)) {
+        if (functor == a_point)
+          return Generator::point(build_linear_expression(arg1, where),
+                                  integer_term_to_Coefficient(arg2));
+        else if (functor == a_closure_point)
+          return Generator::closure_point(build_linear_expression(arg1, where),
+                                          integer_term_to_Coefficient(arg2));
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+Grid_Generator
+build_grid_generator(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      if (functor == a_grid_line)
+        return Grid_Generator::grid_line(build_linear_expression(arg, where));
+      else if (functor == a_parameter)
+        return Grid_Generator::parameter(build_linear_expression(arg, where));
+      else if (functor == a_grid_point)
+        return Grid_Generator::grid_point(build_linear_expression(arg, where));
+    }
+    else if (arity == 2) {
+      Prolog_term_ref arg1 = Prolog_new_term_ref();
+      Prolog_term_ref arg2 = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg1);
+      Prolog_get_arg(2, t, arg2);
+      if (Prolog_is_integer(arg2)) {
+        if (functor == a_grid_point)
+          return Grid_Generator::grid_point(build_linear_expression(arg1,
+                                                                    where),
+                                            integer_term_to_Coefficient(arg2));
+        else if (functor == a_parameter)
+          return Grid_Generator::parameter(build_linear_expression(arg1,
+                                                                   where),
+                                          integer_term_to_Coefficient(arg2));
+      }
+    }
+  }
+  // Invalid.
+  throw non_linear(t, where);
+}
+
+template <typename R>
+Prolog_term_ref
+get_homogeneous_expression(const R& r) {
+  Prolog_term_ref so_far = Prolog_new_term_ref();
+  PPL_DIRTY_TEMP_COEFFICIENT(coefficient);
+  dimension_type varid = 0;
+  dimension_type space_dimension = r.space_dimension();
+  while (varid < space_dimension
+         && (coefficient = r.coefficient(Variable(varid))) == 0)
+    ++varid;
+  if (varid >= space_dimension) {
+    Prolog_put_long(so_far, 0);
+  }
+  else {
+    Prolog_construct_compound(so_far, a_asterisk,
+                              Coefficient_to_integer_term(coefficient),
+                              variable_term(varid));
+    while (true) {
+      ++varid;
+      while (varid < space_dimension
+             && (coefficient = r.coefficient(Variable(varid))) == 0)
+        ++varid;
+      if (varid >= space_dimension)
+        break;
+      else {
+        Prolog_term_ref addendum = Prolog_new_term_ref();
+        Prolog_construct_compound(addendum, a_asterisk,
+                                  Coefficient_to_integer_term(coefficient),
+                                  variable_term(varid));
+        Prolog_term_ref new_so_far = Prolog_new_term_ref();
+        Prolog_construct_compound(new_so_far, a_plus,
+                                  so_far, addendum);
+        so_far = new_so_far;
+      }
+    }
+  }
+  return so_far;
+}
+
+Prolog_term_ref
+get_linear_expression(const Linear_Expression& le) {
+  Prolog_term_ref t_homo = get_homogeneous_expression(le);
+  if (le.inhomogeneous_term() == 0)
+    return t_homo;
+  else {
+    Prolog_term_ref t_in
+      = Coefficient_to_integer_term(le.inhomogeneous_term());
+    if (unify_long(t_homo, 0))
+      return t_in;
+    else {
+      Prolog_term_ref t_le = Prolog_new_term_ref();
+      Prolog_construct_compound(t_le, a_plus, t_homo, t_in);
+      return t_le;
+    }
+  }
+}
+
+Prolog_term_ref
+constraint_term(const Constraint& c) {
+  Prolog_atom relation = 0;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    relation = a_equal;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    relation = a_greater_than_equal;
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    relation = a_greater_than;
+    break;
+  default:
+    throw unknown_interface_error("generator_term()");
+  }
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound
+    (t,
+     relation,
+     get_homogeneous_expression(c),
+     Coefficient_to_integer_term(-c.inhomogeneous_term()));
+  return t;
+}
+
+Prolog_term_ref
+congruence_term(const Congruence& cg) {
+  Prolog_atom relation1 = a_is_congruent_to;
+  Prolog_atom relation2 = a_modulo;
+  Prolog_term_ref t_tmp = Prolog_new_term_ref();
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound
+    (t_tmp,
+     relation1,
+     get_homogeneous_expression(cg),
+     Coefficient_to_integer_term(-cg.inhomogeneous_term()));
+  Prolog_construct_compound
+    (t,
+     relation2,
+     t_tmp,
+     Coefficient_to_integer_term(cg.modulus()));
+  return t;
+}
+
+Prolog_term_ref
+generator_term(const Generator& g) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_atom constructor = 0;
+  switch (g.type()) {
+  case Generator::LINE:
+    constructor = a_line;
+    break;
+  case Generator::RAY:
+    constructor = a_ray;
+    break;
+  case Generator::POINT:
+    {
+      constructor = a_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+        break;
+      else {
+        Prolog_construct_compound(t, constructor,
+                                  get_homogeneous_expression(g),
+                                  Coefficient_to_integer_term(divisor));
+        return t;
+      }
+    }
+  case Generator::CLOSURE_POINT:
+    {
+      constructor = a_closure_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+        break;
+      else {
+        Prolog_construct_compound(t, constructor,
+                                  get_homogeneous_expression(g),
+                                  Coefficient_to_integer_term(divisor));
+        return t;
+      }
+    }
+  default:
+    throw unknown_interface_error("generator_term()");
+  }
+  Prolog_construct_compound(t, constructor, get_homogeneous_expression(g));
+  return t;
+}
+
+Prolog_term_ref
+grid_generator_term(const Grid_Generator& g) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_atom constructor = 0;
+  switch (g.type()) {
+  case Grid_Generator::LINE:
+    constructor = a_grid_line;
+    break;
+  case Grid_Generator::PARAMETER:
+    {
+      constructor = a_parameter;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+        break;
+      else {
+        Prolog_construct_compound(t, constructor,
+                                  get_homogeneous_expression(g),
+                                  Coefficient_to_integer_term(divisor));
+        return t;
+      }
+    }
+  case Grid_Generator::POINT:
+    {
+      constructor = a_grid_point;
+      const Coefficient& divisor = g.divisor();
+      if (divisor == 1)
+        break;
+      else {
+        Prolog_construct_compound(t, constructor,
+                                  get_homogeneous_expression(g),
+                                  Coefficient_to_integer_term(divisor));
+        return t;
+      }
+    }
+  default:
+    throw unknown_interface_error("grid_generator_term()");
+  }
+  Prolog_construct_compound(t, constructor, get_homogeneous_expression(g));
+  return t;
+}
+
+Prolog_term_ref
+artificial_parameter_term(const PIP_Tree_Node::Artificial_Parameter& art) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  Prolog_construct_compound(t, a_divided_by,
+                            get_linear_expression(art),
+                            Coefficient_to_integer_term(art.denominator()));
+  return t;
+}
+
+Variable
+term_to_Variable(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_compound(t)) {
+    Prolog_atom functor;
+    int arity;
+    Prolog_get_compound_name_arity(t, &functor, &arity);
+    if (functor == a_dollar_VAR && arity == 1) {
+      Prolog_term_ref arg = Prolog_new_term_ref();
+      Prolog_get_arg(1, t, arg);
+      return
+        Variable(term_to_unsigned<dimension_type>(arg, "term_to_Variable"));
+    }
+  }
+  throw not_a_variable(t, where);
+}
+
+Coefficient
+term_to_Coefficient(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_integer(t))
+    return integer_term_to_Coefficient(t);
+  else
+    throw not_an_integer(t, where);
+}
+
+Prolog_atom
+term_to_bounded_integer_type_width(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_bits_8 || name == a_bits_16
+            || name == a_bits_32 || name == a_bits_64
+            || name == a_bits_128))
+      return name;
+  }
+  throw not_a_bounded_integer_type_width(t, where);
+}
+
+Prolog_atom
+term_to_bounded_integer_type_representation(Prolog_term_ref t,
+                                            const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_unsigned || name == a_signed_2_complement))
+      return name;
+  }
+  throw not_a_bounded_integer_type_representation(t, where);
+}
+
+Prolog_atom
+term_to_bounded_integer_type_overflow(Prolog_term_ref t,
+                                      const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_overflow_wraps
+            || name == a_overflow_undefined
+            || name == a_overflow_impossible))
+      return name;
+  }
+  throw not_a_bounded_integer_type_overflow(t, where);
+}
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_max || name == a_min))
+      return name;
+  }
+  throw not_an_optimization_mode(t, where);
+}
+
+Prolog_atom
+term_to_control_parameter_name(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_pricing || name == a_cutting_strategy))
+      return name;
+  }
+  throw not_a_control_parameter_name(t, where);
+}
+
+Prolog_atom
+term_to_pip_problem_control_parameter_name(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_cutting_strategy || name == a_pivot_row_strategy))
+      return name;
+  }
+  throw not_a_pip_problem_control_parameter_name(t, where);
+}
+
+Prolog_atom
+term_to_control_parameter_value(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_pricing_steepest_edge_float
+            || name == a_pricing_steepest_edge_exact
+            || name == a_pricing_textbook
+            || name == a_cutting_strategy_first
+            || name == a_cutting_strategy_deepest))
+      return name;
+  }
+  throw not_a_control_parameter_value(t, where);
+}
+
+Prolog_atom
+term_to_pip_problem_control_parameter_value(Prolog_term_ref t,
+                                            const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_cutting_strategy_first
+            || name == a_cutting_strategy_deepest
+            || name == a_cutting_strategy_all
+            || name == a_pivot_row_strategy_first
+            || name == a_pivot_row_strategy_max_column))
+      return name;
+  }
+  throw not_a_pip_problem_control_parameter_value(t, where);
+}
+
+bool Prolog_interface_initialized = false;
+
+void
+check_nil_terminating(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom a;
+    Prolog_get_atom_name(t, &a);
+    if (a == a_nil)
+      return;
+  }
+  throw not_a_nil_terminated_list(t, where);
+}
+
+inline dimension_type
+max_representable_dimension(dimension_type d) {
+  return
+    Prolog_has_unbounded_integers
+    ? d
+    : std::min(d, static_cast<dimension_type>(Prolog_max_integer));
+}
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+                 bool& finite, bool& closed,
+                 Coefficient& n, Coefficient& d) {
+  if (!Prolog_is_compound(t_b))
+    return false;
+
+  Prolog_atom functor;
+  int arity;
+
+  Prolog_get_compound_name_arity(t_b, &functor, &arity);
+  // A boundary term is either of the form c(Limit) or o(Limit).
+  if (arity != 1 || (functor != a_c && functor != a_o))
+    return false;
+
+  Prolog_atom open_closed_atom = functor;
+
+  Prolog_term_ref t_limit = Prolog_new_term_ref();
+  Prolog_get_arg(1, t_b, t_limit);
+  if (Prolog_is_integer(t_limit)) {
+    // A finite, integral limit.
+    finite = true;
+    closed = (open_closed_atom == a_c);
+    n = integer_term_to_Coefficient(t_limit);
+    d = 1;
+  }
+  else if (Prolog_is_atom(t_limit)) {
+    Prolog_atom a;
+    Prolog_get_atom_name(t_limit, &a);
+    Prolog_atom allowed_infinity = (kind == LOWER_BOUNDARY ? a_minf : a_pinf);
+    // Only open bounds may be unbounded.
+    if (a != allowed_infinity || open_closed_atom != a_o)
+      return false;
+
+    finite = false;
+  }
+  else if (Prolog_is_compound(t_limit)) {
+    Prolog_get_compound_name_arity(t_limit, &functor, &arity);
+    if (arity != 2 || functor != a_slash)
+      return false;
+
+    Prolog_term_ref t_n = Prolog_new_term_ref();
+    Prolog_term_ref t_d = Prolog_new_term_ref();
+    Prolog_get_arg(1, t_limit, t_n);
+    Prolog_get_arg(2, t_limit, t_d);
+
+    if (!Prolog_is_integer(t_n) || !Prolog_is_integer(t_d))
+      return false;
+    else {
+      finite = true;
+      closed = (open_closed_atom == a_c);
+      n = integer_term_to_Coefficient(t_n);
+      d = integer_term_to_Coefficient(t_d);
+      // Catch negative denominators and divisions by zero here.
+      if (d <= 0)
+        return false;
+    }
+  }
+  return true;
+}
+
+Prolog_atom
+term_to_relation(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_equal
+            || name == a_greater_than_equal
+            || name == a_equal_less_than
+            || name == a_greater_than
+            || name == a_less_than))
+      return name;
+  }
+  throw not_a_relation(t, where);
+}
+
+Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r, const char* where) {
+  Prolog_atom ra = term_to_relation(t_r, where);
+  Relation_Symbol r;
+  if (ra == a_less_than)
+    r = LESS_THAN;
+  else if (ra == a_equal_less_than)
+    r = LESS_OR_EQUAL;
+  else if (ra == a_equal)
+    r = EQUAL;
+  else if (ra == a_greater_than_equal)
+    r = GREATER_OR_EQUAL;
+  else {
+    assert(ra == a_greater_than);
+    r = GREATER_THAN;
+  }
+  return r;
+}
+
+Prolog_term_ref
+rational_term(const Rational_Box::interval_type::boundary_type& q) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+  PPL_DIRTY_TEMP_COEFFICIENT(denominator);
+  numerator = q.get_num();
+  denominator = q.get_den();
+  if (denominator == 1)
+    Prolog_put_Coefficient(t, numerator);
+  else
+    Prolog_construct_compound(t, a_slash,
+                              Coefficient_to_integer_term(numerator),
+                              Coefficient_to_integer_term(denominator));
+  return t;
+}
+
+Prolog_term_ref
+interval_term(const Rational_Box::interval_type& i) {
+  Prolog_term_ref t = Prolog_new_term_ref();
+  if (i.is_empty())
+    Prolog_put_atom(t, a_empty);
+  else {
+    // Lower bound.
+    const Prolog_atom& l_oc = i.lower_is_open() ? a_o : a_c;
+    Prolog_term_ref l_b = Prolog_new_term_ref();
+    if (i.lower_is_boundary_infinity())
+      Prolog_put_atom(l_b, a_minf);
+    else
+      Prolog_put_term(l_b, rational_term(i.lower()));
+    Prolog_term_ref l_t = Prolog_new_term_ref();
+    Prolog_construct_compound(l_t, l_oc, l_b);
+
+    // Upper bound.
+    const Prolog_atom& u_oc = i.upper_is_open() ? a_o : a_c;
+    Prolog_term_ref u_b = Prolog_new_term_ref();
+    if (i.upper_is_boundary_infinity())
+      Prolog_put_atom(u_b, a_pinf);
+    else
+      Prolog_put_term(u_b, rational_term(i.upper()));
+    Prolog_term_ref u_t = Prolog_new_term_ref();
+    Prolog_construct_compound(u_t, u_oc, u_b);
+
+    Prolog_construct_compound(t, a_i, l_t, u_t);
+  }
+  return t;
+}
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_atom(t)) {
+    Prolog_atom name;
+    if (Prolog_get_atom_name(t, &name)
+        && (name == a_polynomial || name == a_simplex || name == a_any))
+      return name;
+  }
+  throw not_a_complexity_class(t, where);
+}
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_major()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_minor()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_revision()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v) {
+  try {
+    if (unify_ulong(t_v, version_beta()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v) {
+  try {
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_atom_chars(tmp, version());
+    if (Prolog_unify(t_v, tmp))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b) {
+  try {
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_atom_chars(tmp, banner());
+    if (Prolog_unify(t_b, tmp))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd) {
+  try {
+    if (unify_ulong(t_msd, max_representable_dimension(max_space_dimension())))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize() {
+  try {
+    if (Prolog_interface_initialized)
+      return PROLOG_SUCCESS;
+    // Initialize the core library.
+    initialize();
+    for (size_t i = 0; prolog_interface_atoms[i].p_atom != 0; ++i) {
+      Prolog_atom a = Prolog_atom_from_string(prolog_interface_atoms[i].name);
+      *prolog_interface_atoms[i].p_atom = a;
+    }
+    timeout_exception_atom = a_time_out;
+    out_of_memory_exception_atom = a_out_of_memory;
+    ppl_Prolog_sysdep_init();
+    Prolog_interface_initialized = true;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize() {
+  try {
+    if (!Prolog_interface_initialized)
+      return PROLOG_SUCCESS;
+
+    Prolog_interface_initialized = false;
+    // Finalize the core library.
+    finalize();
+    // Release the pending timeout object, if any.
+    reset_timeout();
+    ppl_Prolog_sysdep_deinit();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_rounding_for_PPL() {
+  try {
+    set_rounding_for_PPL();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_restore_pre_PPL_rounding() {
+  try {
+    restore_pre_PPL_rounding();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_irrational_precision(Prolog_term_ref t_p) {
+  try {
+    if (unify_ulong(t_p, irrational_precision()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_irrational_precision(Prolog_term_ref t_p) {
+  try {
+    unsigned p
+      = term_to_unsigned<unsigned>(t_p, "ppl_set_irrational_precision/1");
+    set_irrational_precision(p);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea) {
+  try {
+    if (Prolog_is_atom(t_tea)) {
+      Prolog_atom tea;
+      if (Prolog_get_atom_name(t_tea, &tea)) {
+        timeout_exception_atom = tea;
+        return PROLOG_SUCCESS;
+      }
+    }
+    Prolog_term_ref found = Prolog_new_term_ref();
+    Prolog_construct_compound(found, a_found, t_tea);
+
+    Prolog_term_ref expected = Prolog_new_term_ref();
+    Prolog_construct_compound(expected, a_expected,
+                              Prolog_atom_term_from_string("atom"));
+
+    Prolog_term_ref where = Prolog_new_term_ref();
+    Prolog_construct_compound(where, a_where,
+                              Prolog_atom_term_from_string
+                              ("ppl_set_timeout_exception_atom"));
+
+    Prolog_term_ref exception_term = Prolog_new_term_ref();
+    Prolog_construct_compound(exception_term, a_ppl_invalid_argument,
+                              found, expected, where);
+    Prolog_raise_exception(exception_term);
+    return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t) {
+  try {
+    Prolog_term_ref t_tea = Prolog_new_term_ref();
+    Prolog_put_atom(t_tea, timeout_exception_atom);
+    return Prolog_unify(t_tea, t) ? PROLOG_SUCCESS : PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_csecs) {
+  try {
+    // In case a timeout was already set.
+    reset_timeout();
+    static timeout_exception e;
+    unsigned csecs = term_to_unsigned<unsigned>(t_csecs, "ppl_set_timeout/1");
+    p_timeout_object =
+      new Parma_Polyhedra_Library::Watchdog(csecs,
+                                            abandon_expensive_computations,
+                                            e);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout() {
+  try {
+    reset_timeout();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_set_deterministic_timeout(Prolog_term_ref t_unscaled_weight,
+                              Prolog_term_ref t_scale) {
+  try {
+    // In case a deterministic timeout was already set.
+    reset_deterministic_timeout();
+    static deterministic_timeout_exception e;
+    unsigned long unscaled_weight
+      = term_to_unsigned<unsigned long>(t_unscaled_weight,
+                                        "ppl_set_deterministic_timeout/2");
+    unsigned scale
+      = term_to_unsigned<unsigned>(t_scale, "ppl_set_deterministic_timeout/2");
+    typedef Parma_Polyhedra_Library::Weightwatch_Traits Traits;
+    p_deterministic_timeout_object
+      = new Weightwatch(Traits::compute_delta(unscaled_weight, scale),
+                        abandon_expensive_computations, e);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_deterministic_timeout() {
+  try {
+    reset_deterministic_timeout();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_bits(Prolog_term_ref t_bits) {
+  try {
+    if (unify_ulong(t_bits, PPL_COEFFICIENT_BITS))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded() {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded)
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min) {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded) {
+      PPL_DIRTY_TEMP_COEFFICIENT(min);
+      min = std::numeric_limits<Coefficient>::min();
+      if (Prolog_has_unbounded_integers
+          || (min >= Prolog_min_integer && min <= Prolog_min_integer))
+        return Prolog_unify_Coefficient(t_min, min)
+          ? PROLOG_SUCCESS : PROLOG_FAILURE;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max) {
+  try {
+    if (std::numeric_limits<Coefficient>::is_bounded) {
+      PPL_DIRTY_TEMP_COEFFICIENT(max);
+      max = std::numeric_limits<Coefficient>::max();
+      if (Prolog_has_unbounded_integers
+          || (max >= Prolog_min_integer && max <= Prolog_min_integer))
+        return Prolog_unify_Coefficient(t_max, max)
+          ? PROLOG_SUCCESS : PROLOG_FAILURE;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_from_space_dimension/2";
+  try {
+    dimension_type d = term_to_unsigned<dimension_type>(t_nd, where);
+    MIP_Problem* mip = new MIP_Problem(d);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, mip);
+    if (Prolog_unify(t_mip, tmp)) {
+      PPL_REGISTER(mip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete mip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem(Prolog_term_ref t_nd,
+                    Prolog_term_ref t_clist,
+                    Prolog_term_ref t_le_expr,
+                    Prolog_term_ref t_opt,
+                    Prolog_term_ref t_mip) {
+  static const char* where = "ppl_new_MIP_Problem/5";
+  try {
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c, where));
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    const Linear_Expression le = build_linear_expression(t_le_expr, where);
+    Prolog_atom opt = term_to_optimization_mode(t_opt, where);
+    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+
+    MIP_Problem* mip
+      = new MIP_Problem(term_to_unsigned<dimension_type>(t_nd, where),
+                        cs, le, mode);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, mip);
+    if (Prolog_unify(t_mip, tmp)) {
+      PPL_REGISTER(mip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete mip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_MIP_Problem(Prolog_term_ref t_mip_source,
+                                     Prolog_term_ref t_mip) {
+  static const char* where = "ppl_new_MIP_Problem_from_MIP_Problem/2";
+  try {
+    const MIP_Problem* mip_source
+      = static_cast<const MIP_Problem*>
+      (term_to_handle<MIP_Problem>(t_mip_source, where));
+    PPL_CHECK(mip_source);
+    MIP_Problem* mip = new MIP_Problem(*mip_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, mip);
+    if (Prolog_unify(t_mip, tmp)) {
+      PPL_REGISTER(mip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete mip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_MIP_Problem_swap/2";
+  try {
+    MIP_Problem* lhs = term_to_handle<MIP_Problem>(t_lhs, where);
+    MIP_Problem* rhs = term_to_handle<MIP_Problem>(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    swap(*lhs, *rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_MIP_Problem(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_delete_MIP_Problem/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_UNREGISTER(mip);
+    delete mip;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_space_dimension(Prolog_term_ref t_mip, Prolog_term_ref t_sd) {
+  static const char* where = "ppl_MIP_Problem_space_dimension/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    if (unify_ulong(t_sd, mip->space_dimension()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_integer_space_dimensions(Prolog_term_ref t_mip,
+                                         Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_MIP_Problem_integer_space_dimensions/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Variables_Set& i_vars = mip->integer_space_dimensions();
+
+    for (Variables_Set::const_iterator i = i_vars.begin(),
+           i_end = i_vars.end(); i != i_end; ++i)
+      Prolog_construct_cons(tail, variable_term(*i), tail);
+
+    if (Prolog_unify(t_vlist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_constraints(Prolog_term_ref t_mip,
+                            Prolog_term_ref t_clist) {
+  static const char* where = "ppl_MIP_Problem_constraints/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    for (MIP_Problem::const_iterator i = mip->constraints_begin(),
+           i_end = mip->constraints_end(); i != i_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_clist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_objective_function(Prolog_term_ref t_mip,
+                                   Prolog_term_ref t_le_expr) {
+  static const char* where = "ppl_MIP_Problem_objective_function/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    const Linear_Expression& le = mip->objective_function();
+    Prolog_term_ref t = get_linear_expression(le);
+
+    if (Prolog_unify(t_le_expr, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimization_mode(Prolog_term_ref t_mip,
+                                  Prolog_term_ref t_opt) {
+  static const char* where = "ppl_MIP_Problem_optimization_mode/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Optimization_Mode mode = mip->optimization_mode();
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_atom a = (mode == MAXIMIZATION) ? a_max : a_min;
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_opt, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_clear(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_clear/1";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->clear();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_mip, Prolog_term_ref t_nnd) {
+  static const char* where
+    = "ppl_MIP_Problem_add_space_dimensions_and_embed/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    dimension_type d = term_to_unsigned<dimension_type>(t_nnd, where);
+    mip->add_space_dimensions_and_embed(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_to_integer_space_dimensions(Prolog_term_ref t_mip,
+                                                Prolog_term_ref t_vlist) {
+  static const char* where
+    = "ppl_MIP_Problem_add_to_integer_space_dimensions/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    Variables_Set i_vars;
+    Prolog_term_ref v = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      i_vars.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    mip->add_to_integer_space_dimensions(i_vars);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraint(Prolog_term_ref t_mip, Prolog_term_ref t_c) {
+  static const char* where = "ppl_MIP_Problem_add_constraint/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->add_constraint(build_constraint(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraints(Prolog_term_ref t_mip,
+                                Prolog_term_ref t_clist) {
+  static const char* where = "ppl_MIP_Problem_add_constraints/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    mip->add_constraints(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_objective_function(Prolog_term_ref t_mip,
+                                       Prolog_term_ref t_le_expr) {
+  static const char* where = "ppl_MIP_Problem_set_objective_function/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->set_objective_function(build_linear_expression(t_le_expr, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_optimization_mode(Prolog_term_ref t_mip,
+                                      Prolog_term_ref t_opt) {
+  static const char* where = "ppl_MIP_Problem_set_optimization_mode/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_atom opt = term_to_optimization_mode(t_opt, where);
+    Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+    mip->set_optimization_mode(mode);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_control_parameter(Prolog_term_ref t_mip,
+                                      Prolog_term_ref t_cp_value) {
+  static const char* where = "ppl_MIP_Problem_set_control_parameter/2";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_atom cp_value = term_to_control_parameter_value(t_cp_value, where);
+    if (cp_value == a_pricing_steepest_edge_float)
+      mip->set_control_parameter(MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT);
+    else if (cp_value == a_pricing_steepest_edge_exact)
+      mip->set_control_parameter(MIP_Problem::PRICING_STEEPEST_EDGE_EXACT);
+    else if (cp_value == a_pricing_textbook)
+      mip->set_control_parameter(MIP_Problem::PRICING_TEXTBOOK);
+    else
+      throw unknown_interface_error("ppl_MIP_Problem_get_control_parameter()");
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_get_control_parameter(Prolog_term_ref t_mip,
+                                      Prolog_term_ref t_cp_name,
+                                      Prolog_term_ref t_cp_value) {
+  static const char* where = "ppl_MIP_Problem_get_control_parameter/3";
+  try {
+    MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    Prolog_atom cp_name = term_to_control_parameter_name(t_cp_name, where);
+    MIP_Problem::Control_Parameter_Value ppl_cp_value;
+    if (cp_name == a_pricing)
+      ppl_cp_value = mip->get_control_parameter(MIP_Problem::PRICING);
+    else
+      throw unknown_interface_error("ppl_MIP_Problem_get_control_parameter()");
+
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_atom a;
+    switch (ppl_cp_value) {
+    case MIP_Problem::PRICING_STEEPEST_EDGE_FLOAT:
+      a = a_pricing_steepest_edge_float;
+      break;
+    case MIP_Problem::PRICING_STEEPEST_EDGE_EXACT:
+      a = a_pricing_steepest_edge_exact;
+      break;
+    case MIP_Problem::PRICING_TEXTBOOK:
+      a = a_pricing_textbook;
+      break;
+    default:
+      throw unknown_interface_error("ppl_MIP_Problem_get_control_parameter()");
+    }
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_cp_value, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_is_satisfiable(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_is_satisfiable/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    if (mip->is_satisfiable())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_solve(Prolog_term_ref t_mip, Prolog_term_ref t_status) {
+  static const char* where = "ppl_MIP_Problem_solve/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+
+    Prolog_atom a;
+    switch (mip->solve()) {
+    case UNFEASIBLE_MIP_PROBLEM:
+      a = a_unfeasible;
+      break;
+    case UNBOUNDED_MIP_PROBLEM:
+      a = a_unbounded;
+      break;
+    case OPTIMIZED_MIP_PROBLEM:
+      a = a_optimized;
+      break;
+    default:
+      throw unknown_interface_error("ppl_MIP_Problem_solve()");
+    }
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_status, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_feasible_point(Prolog_term_ref t_mip,
+                               Prolog_term_ref t_g) {
+  static const char* where = "ppl_MIP_Problem_feasible_point/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    const Generator& g = mip->feasible_point();
+    if (Prolog_unify(t_g, generator_term(g)))
+      return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimizing_point(Prolog_term_ref t_mip,
+                                 Prolog_term_ref t_g) {
+  static const char* where = "ppl_MIP_Problem_optimizing_point/2";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    const Generator& g = mip->optimizing_point();
+    if (Prolog_unify(t_g, generator_term(g)))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimal_value(Prolog_term_ref t_mip,
+                              Prolog_term_ref t_n,
+                              Prolog_term_ref t_d) {
+  static const char* where = "ppl_MIP_Problem_optimal_value/3";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    PPL_DIRTY_TEMP_COEFFICIENT(n);
+    PPL_DIRTY_TEMP_COEFFICIENT(d);
+    mip->optimal_value(n, d);
+    if (Prolog_unify_Coefficient(t_n, n)
+        && Prolog_unify_Coefficient(t_d, d))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_evaluate_objective_function(Prolog_term_ref t_mip,
+                                            Prolog_term_ref t_g,
+                                            Prolog_term_ref t_n,
+                                            Prolog_term_ref t_d) {
+  static const char* where = "ppl_MIP_Problem_evaluate_objective_function/4";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    PPL_DIRTY_TEMP_COEFFICIENT(n);
+    PPL_DIRTY_TEMP_COEFFICIENT(d);
+    mip->evaluate_objective_function(build_generator(t_g, where), n, d);
+    if (Prolog_unify_Coefficient(t_n, n)
+        && Prolog_unify_Coefficient(t_d, d))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_OK(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_OK/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    if (mip->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_ascii_dump(Prolog_term_ref t_mip) {
+  static const char* where = "ppl_MIP_Problem_ascii_dump/1";
+  try {
+    const MIP_Problem* mip = term_to_handle<MIP_Problem>(t_mip, where);
+    PPL_CHECK(mip);
+    mip->ascii_dump(std::cout);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Problem_from_space_dimension/2";
+  try {
+    dimension_type d = term_to_unsigned<dimension_type>(t_nd, where);
+    PIP_Problem* pip = new PIP_Problem(d);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, pip);
+    if (Prolog_unify(t_pip, tmp)) {
+      PPL_REGISTER(pip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete pip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem(Prolog_term_ref t_dim,
+                    Prolog_term_ref t_cs,
+                    Prolog_term_ref t_params,
+                    Prolog_term_ref t_pip) {
+  static const char* where = "ppl_new_PIP_Problem/4";
+  try {
+    dimension_type dim = term_to_unsigned<dimension_type>(t_dim, where);
+    Constraint_System cs;
+    Prolog_term_ref t_c = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_cs)) {
+      Prolog_get_cons(t_cs, t_c, t_cs);
+      cs.insert(build_constraint(t_c, where));
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_cs, where);
+
+    Variables_Set params;
+    Prolog_term_ref t_par = Prolog_new_term_ref();
+    while (Prolog_is_cons(t_params)) {
+      Prolog_get_cons(t_params, t_par, t_params);
+      params.insert(term_to_Variable(t_par, where).id());
+    }
+    // Check the list is properly terminated.
+    check_nil_terminating(t_params, where);
+
+    PIP_Problem* pip = new PIP_Problem(dim, cs.begin(), cs.end(), params);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, pip);
+    if (Prolog_unify(t_pip, tmp)) {
+      PPL_REGISTER(pip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete pip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_PIP_Problem(Prolog_term_ref t_pip_source,
+                                     Prolog_term_ref t_pip) {
+  static const char* where = "ppl_new_PIP_Problem_from_PIP_Problem/2";
+  try {
+    const PIP_Problem* pip_source
+      = static_cast<const PIP_Problem*>
+      (term_to_handle<PIP_Problem>(t_pip_source, where));
+    PPL_CHECK(pip_source);
+    PIP_Problem* pip = new PIP_Problem(*pip_source);
+    Prolog_term_ref tmp = Prolog_new_term_ref();
+    Prolog_put_address(tmp, pip);
+    if (Prolog_unify(t_pip, tmp)) {
+      PPL_REGISTER(pip);
+      return PROLOG_SUCCESS;
+    }
+    else
+      delete pip;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+  static const char* where = "ppl_PIP_Problem_swap/2";
+  try {
+    PIP_Problem* lhs = term_to_handle<PIP_Problem>(t_lhs, where);
+    PIP_Problem* rhs = term_to_handle<PIP_Problem>(t_rhs, where);
+    PPL_CHECK(lhs);
+    PPL_CHECK(rhs);
+    swap(*lhs, *rhs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_PIP_Problem(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_delete_PIP_Problem/1";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_UNREGISTER(pip);
+    delete pip;
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_space_dimension(Prolog_term_ref t_pip, Prolog_term_ref t_sd) {
+  static const char* where = "ppl_PIP_Problem_space_dimension/2";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    if (unify_ulong(t_sd, pip->space_dimension()))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_parameter_space_dimensions(Prolog_term_ref t_pip,
+                                           Prolog_term_ref t_vlist) {
+  static const char* where = "ppl_PIP_Problem_parameter_space_dimensions/2";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Variables_Set& params = pip->parameter_space_dimensions();
+
+    for (Variables_Set::const_iterator i = params.begin(),
+           i_end = params.end(); i != i_end; ++i)
+      Prolog_construct_cons(tail, variable_term(*i), tail);
+
+    if (Prolog_unify(t_vlist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_constraints(Prolog_term_ref t_pip,
+                            Prolog_term_ref t_clist) {
+  static const char* where = "ppl_PIP_Problem_constraints/2";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    for (PIP_Problem::const_iterator i = pip->constraints_begin(),
+           i_end = pip->constraints_end(); i != i_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_clist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_clear(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Problem_clear/1";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    pip->clear();
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_pip,
+ Prolog_term_ref t_num_vars,
+ Prolog_term_ref t_num_params) {
+  static const char* where
+    = "ppl_PIP_Problem_add_space_dimensions_and_embed/3";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    dimension_type nv = term_to_unsigned<dimension_type>(t_num_vars, where);
+    dimension_type np = term_to_unsigned<dimension_type>(t_num_params, where);
+    pip->add_space_dimensions_and_embed(nv, np);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_to_parameter_space_dimensions(Prolog_term_ref t_pip,
+                                                  Prolog_term_ref t_vlist) {
+  static const char* where
+    = "ppl_PIP_Problem_add_to_parameter_space_dimensions/2";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    Variables_Set params;
+    Prolog_term_ref v = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_vlist)) {
+      Prolog_get_cons(t_vlist, v, t_vlist);
+      params.insert(term_to_Variable(v, where).id());
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_vlist, where);
+
+    pip->add_to_parameter_space_dimensions(params);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraint(Prolog_term_ref t_pip, Prolog_term_ref t_c) {
+  static const char* where = "ppl_PIP_Problem_add_constraint/2";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    pip->add_constraint(build_constraint(t_c, where));
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraints(Prolog_term_ref t_pip,
+                                Prolog_term_ref t_clist) {
+  static const char* where = "ppl_PIP_Problem_add_constraints/2";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    Constraint_System cs;
+    Prolog_term_ref c = Prolog_new_term_ref();
+
+    while (Prolog_is_cons(t_clist)) {
+      Prolog_get_cons(t_clist, c, t_clist);
+      cs.insert(build_constraint(c, where));
+    }
+
+    // Check the list is properly terminated.
+    check_nil_terminating(t_clist, where);
+
+    pip->add_constraints(cs);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_get_control_parameter(Prolog_term_ref t_pip,
+                                      Prolog_term_ref t_cp_name,
+                                      Prolog_term_ref t_cp_value) {
+  static const char* where = "ppl_PIP_Problem_get_control_parameter/3";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    Prolog_atom cp_name = term_to_pip_problem_control_parameter_name(t_cp_name, where);
+    PIP_Problem::Control_Parameter_Value ppl_cp_value;
+    Prolog_atom a;
+    if (cp_name == a_cutting_strategy) {
+      ppl_cp_value
+        = pip->get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+      switch (ppl_cp_value) {
+      case PIP_Problem::CUTTING_STRATEGY_FIRST:
+        a = a_cutting_strategy_first;
+        break;
+      case PIP_Problem::CUTTING_STRATEGY_DEEPEST:
+        a = a_cutting_strategy_deepest;
+        break;
+      case PIP_Problem::CUTTING_STRATEGY_ALL:
+        a = a_cutting_strategy_all;
+        break;
+      default:
+        throw unknown_interface_error(
+          "ppl_PIP_Problem_get_control_parameter()");
+      }
+    }
+    else if (cp_name == a_pivot_row_strategy) {
+      ppl_cp_value
+        = pip->get_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY);
+      switch (ppl_cp_value) {
+      case PIP_Problem::PIVOT_ROW_STRATEGY_FIRST:
+        a = a_pivot_row_strategy_first;
+        break;
+      case PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN:
+        a = a_pivot_row_strategy_max_column;
+        break;
+      default:
+        throw unknown_interface_error(
+          "ppl_PIP_Problem_get_control_parameter()");
+      }
+    }
+    else
+      throw unknown_interface_error("ppl_PIP_Problem_get_control_parameter()");
+
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_cp_value, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_control_parameter(Prolog_term_ref t_pip,
+                                      Prolog_term_ref t_cp_value) {
+  static const char* where = "ppl_PIP_Problem_set_control_parameter/2";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+
+    Prolog_atom cp_value = term_to_pip_problem_control_parameter_value(t_cp_value, where);
+    if (cp_value == a_cutting_strategy_first)
+      pip->set_control_parameter(PIP_Problem::CUTTING_STRATEGY_FIRST);
+    else if (cp_value == a_cutting_strategy_deepest)
+      pip->set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+    else if (cp_value == a_cutting_strategy_all)
+      pip->set_control_parameter(PIP_Problem::CUTTING_STRATEGY_ALL);
+    else if (cp_value == a_pivot_row_strategy_first)
+      pip->set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_FIRST);
+    else if (cp_value == a_pivot_row_strategy_max_column)
+      pip->set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN);
+    else
+      throw unknown_interface_error("ppl_PIP_Problem_set_control_parameter()");
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_has_big_parameter_dimension(Prolog_term_ref t_pip,
+                                            Prolog_term_ref t_d) {
+  static const char* where = "ppl_PIP_Problem_get_big_parameter_dimension/2";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    dimension_type dim = pip->get_big_parameter_dimension();
+    if (dim == not_a_dimension())
+      return PROLOG_FAILURE;
+    if (unify_ulong(t_d, dim))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_big_parameter_dimension(Prolog_term_ref t_pip,
+                                            Prolog_term_ref t_d) {
+  static const char* where = "ppl_MIP_Problem_set_big_parameter_dimension/2";
+  try {
+    PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    dimension_type d = term_to_unsigned<dimension_type>(t_d, where);
+    pip->set_big_parameter_dimension(d);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_is_satisfiable(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Problem_is_satisfiable/1";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    if (pip->is_satisfiable())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solve(Prolog_term_ref t_pip, Prolog_term_ref t_status) {
+  static const char* where = "ppl_PIP_Problem_solve/2";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+
+    Prolog_atom a;
+    switch (pip->solve()) {
+    case UNFEASIBLE_PIP_PROBLEM:
+      a = a_unfeasible;
+      break;
+    case OPTIMIZED_PIP_PROBLEM:
+      a = a_optimized;
+      break;
+    default:
+      throw unknown_interface_error("ppl_PIP_Problem_solve()");
+    }
+    Prolog_term_ref t = Prolog_new_term_ref();
+    Prolog_put_atom(t, a);
+    if (Prolog_unify(t_status, t))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solution(Prolog_term_ref t_pip,
+                         Prolog_term_ref t_pip_tree) {
+  static const char* where = "ppl_PIP_Problem_solution/2";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    PIP_Tree_Node* sol = const_cast<PIP_Tree_Node*>(pip->solution());
+    Prolog_term_ref t_sol = Prolog_new_term_ref();
+    Prolog_put_address(t_sol, sol);
+    if (Prolog_unify(t_pip_tree, t_sol)) {
+      PPL_WEAK_REGISTER(sol);
+      return PROLOG_SUCCESS;
+    }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_optimizing_solution(Prolog_term_ref t_pip,
+                                    Prolog_term_ref t_pip_tree) {
+  static const char* where = "ppl_PIP_Problem_optimizing_solution/2";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    PIP_Tree_Node* sol = const_cast<PIP_Tree_Node*>(pip->optimizing_solution());
+    Prolog_term_ref t_sol = Prolog_new_term_ref();
+    Prolog_put_address(t_sol, sol);
+    if (Prolog_unify(t_pip_tree, t_sol)) {
+      PPL_WEAK_REGISTER(sol);
+      return PROLOG_SUCCESS;
+    }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_OK(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Problem_OK/1";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    if (pip->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_ascii_dump(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Problem_ascii_dump/1";
+  try {
+    const PIP_Problem* pip = term_to_handle<PIP_Problem>(t_pip, where);
+    PPL_CHECK(pip);
+    pip->ascii_dump(std::cout);
+    return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_constraints(Prolog_term_ref t_pip,
+                              Prolog_term_ref t_cs) {
+  static const char* where = "ppl_PIP_Tree_Node_constraints/2";
+  try {
+    const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+    PPL_CHECK(pip);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    const Constraint_System& ppl_cs = pip->constraints();
+    for (Constraint_System::const_iterator i = ppl_cs.begin(),
+           ppl_cs_end = ppl_cs.end(); i != ppl_cs_end; ++i)
+      Prolog_construct_cons(tail, constraint_term(*i), tail);
+
+    if (Prolog_unify(t_cs, tail)) {
+      return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_solution(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Tree_Node_as_solution/2";
+  try {
+    const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+    PPL_CHECK(pip);
+
+    if (pip != 0 && pip->as_solution() != 0)
+      return PROLOG_SUCCESS;
+    return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_decision(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Tree_Node_as_decision/2";
+  try {
+    const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+    PPL_CHECK(pip);
+
+    if (pip != 0 && pip->as_decision() != 0)
+      return PROLOG_SUCCESS;
+    return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_bottom(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Tree_Node_as_decision/2";
+  try {
+    const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+    PPL_CHECK(pip);
+
+    if (pip == 0)
+      return PROLOG_SUCCESS;
+    return PROLOG_FAILURE;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_artificials(Prolog_term_ref t_tree_node,
+                              Prolog_term_ref t_artlist) {
+  static const char* where = "ppl_PIP_Tree_Node_artificials/2";
+  try {
+    const PIP_Tree_Node* node
+      = term_to_handle<PIP_Tree_Node>(t_tree_node, where);
+    PPL_CHECK(node);
+
+    Prolog_term_ref tail = Prolog_new_term_ref();
+    Prolog_put_atom(tail, a_nil);
+    for (PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+           i = node->art_parameter_begin(),
+           arts_end = node->art_parameter_end(); i != arts_end; ++i)
+      Prolog_construct_cons(tail, artificial_parameter_term(*i), tail);
+
+    if (Prolog_unify(t_artlist, tail))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_parametric_values(Prolog_term_ref t_pip,
+                                            Prolog_term_ref t_var,
+                                            Prolog_term_ref t_le) {
+  static const char* where = "ppl_PIP_Solution_Node_get_parametric_values/3";
+  try {
+    const PIP_Solution_Node* pip
+      = term_to_handle<PIP_Solution_Node>(t_pip, where);
+    PPL_CHECK(pip);
+    Variable var = term_to_Variable(t_var, where);
+    if (Prolog_unify(t_le, get_linear_expression(pip->parametric_values(var))))
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_true_child(Prolog_term_ref t_pip,
+                                     Prolog_term_ref t_ptree) {
+  static const char* where = "ppl_PIP_Decision_Node_get_true_child/2";
+  try {
+    const PIP_Decision_Node* pip
+      = term_to_handle<PIP_Decision_Node>(t_pip, where);
+    PPL_CHECK(pip);
+    bool b = true;
+    PIP_Tree_Node* ppl_ptree = const_cast<PIP_Tree_Node*>(pip->child_node(b));
+    Prolog_term_ref t_ppl_ptree = Prolog_new_term_ref();
+    Prolog_put_address(t_ppl_ptree, ppl_ptree);
+    if (Prolog_unify(t_ptree, t_ppl_ptree)) {
+      PPL_WEAK_REGISTER(ppl_ptree);
+      return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_false_child(Prolog_term_ref t_pip,
+                                      Prolog_term_ref t_ptree) {
+  static const char* where = "ppl_PIP_Decision_Node_get_false_child/2";
+  try {
+    const PIP_Decision_Node* pip
+      = term_to_handle<PIP_Decision_Node>(t_pip, where);
+    PPL_CHECK(pip);
+    bool b = false;
+    PIP_Tree_Node* ppl_ptree = const_cast<PIP_Tree_Node*>(pip->child_node(b));
+    Prolog_term_ref t_ppl_ptree = Prolog_new_term_ref();
+    Prolog_put_address(t_ppl_ptree, ppl_ptree);
+    if (Prolog_unify(t_ptree, t_ppl_ptree)) {
+      PPL_WEAK_REGISTER(ppl_ptree);
+      return PROLOG_SUCCESS;
+    }
+  }
+  CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_OK(Prolog_term_ref t_pip) {
+  static const char* where = "ppl_PIP_Tree_Node_OK/1";
+  try {
+    const PIP_Tree_Node* pip = term_to_handle<PIP_Tree_Node>(t_pip, where);
+    PPL_CHECK(pip);
+    if (pip->OK())
+      return PROLOG_SUCCESS;
+  }
+  CATCH_ALL;
+}
diff --git a/interfaces/Prolog/ppl_prolog_common_defs.hh b/interfaces/Prolog/ppl_prolog_common_defs.hh
new file mode 100644
index 0000000..3f85ef2
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common_defs.hh
@@ -0,0 +1,1084 @@
+/* Common part of the Prolog interfaces: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_prolog_common_defs_hh
+#define PPL_ppl_prolog_common_defs_hh 1
+
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl.hh"
+#include "ppl_prolog_sysdep.hh"
+#include "interfaced_boxes.hh"
+#include <set>
+#include <vector>
+#include <exception>
+#include <stdexcept>
+#include <iostream>
+
+#ifndef PROLOG_TRACK_ALLOCATION
+#define PROLOG_TRACK_ALLOCATION 0
+#endif
+#ifndef NOISY_PROLOG_TRACK_ALLOCATION
+#define NOISY_PROLOG_TRACK_ALLOCATION 0
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interfaces {
+
+namespace Prolog {
+
+#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+class Allocation_Tracker {
+public:
+  //! Construct an allocation tracker with no registered objects.
+  Allocation_Tracker();
+
+  /*! \brief
+    Register an object whose deletion is under the Prolog programmer
+    responsibility.
+  */
+  template <typename T>
+  void insert(const T* p);
+
+  /*! \brief
+    Register an object whose deletion is under the PPL library
+    responsibility.
+  */
+  template <typename T>
+  void weak_insert(const T* p);
+
+  //! Check whether the object was correctly registered.
+  template <typename T>
+  void check(const T* p) const;
+
+  /*! \brief
+    Unregister an object whose deletion is under the Prolog programmer
+    responsibility.
+  */
+  template <typename T>
+  void remove(const T* p);
+
+  /*! \brief
+    Destroy the allocation tracker: an error message will be output
+    if there still are registered objects whose deletion was under
+    the Prolog programmer responsibility.
+  */
+  ~Allocation_Tracker();
+
+private:
+  //! The type for recording a set of pointers to PPL library objects.
+  typedef std::set<const void*, std::less<const void*> > Set;
+
+  /*! \brief
+    A set of pointers to objects whose deallocation is under the
+    rensponsibility of the Prolog programmer: they should be deallocated
+    before the termination of the program.
+  */
+  Set s;
+
+  /*! \brief
+    A set of pointers to objects whose deallocation is under the
+    rensponsibility of the PPL library: they should not be deallocated
+    by the Prolog programmer.
+  */
+  Set weak_s;
+};
+
+extern Allocation_Tracker allocation_tracker;
+
+#define PPL_REGISTER(x)                       \
+  Parma_Polyhedra_Library::Interfaces::Prolog \
+  ::allocation_tracker.insert(x)
+#define PPL_WEAK_REGISTER(x)                    \
+  Parma_Polyhedra_Library::Interfaces::Prolog   \
+  ::allocation_tracker.weak_insert(x)
+#define PPL_UNREGISTER(x)                       \
+  Parma_Polyhedra_Library::Interfaces::Prolog   \
+  ::allocation_tracker.remove(x)
+#define PPL_CHECK(x)                            \
+  Parma_Polyhedra_Library::Interfaces::Prolog   \
+  ::allocation_tracker.check(x)
+
+#else // !PROLOG_TRACK_ALLOCATION && !NOISY_PROLOG_TRACK_ALLOCATION
+
+#define PPL_REGISTER(x)
+#define PPL_WEAK_REGISTER(x)
+#define PPL_UNREGISTER(x)
+#define PPL_CHECK(x)
+
+#endif // !PROLOG_TRACK_ALLOCATION && !NOISY_PROLOG_TRACK_ALLOCATION
+
+class internal_exception {
+private:
+  Prolog_term_ref t;
+  const char* w;
+
+public:
+  internal_exception(Prolog_term_ref term, const char* where)
+    : t(term),
+      w(where) {
+  }
+
+  virtual ~internal_exception() {
+  }
+
+  virtual Prolog_term_ref term() const {
+    return t;
+  }
+
+  virtual const char* where() const {
+    return w;
+  }
+};
+
+class Prolog_unsigned_out_of_range : public internal_exception {
+private:
+  unsigned long m;
+
+public:
+  Prolog_unsigned_out_of_range(Prolog_term_ref term,
+                               const char* where,
+                               unsigned long max)
+    : internal_exception(term, where),
+      m(max) {
+  }
+
+  unsigned long max() const {
+    return m;
+  }
+};
+
+class non_linear : public internal_exception {
+public:
+  non_linear(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_an_integer : public internal_exception {
+public:
+  not_an_integer(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_unsigned_integer : public internal_exception {
+public:
+  not_unsigned_integer(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_boolean : public internal_exception {
+public:
+  not_a_boolean(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_variable : public internal_exception {
+public:
+  not_a_variable(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_an_optimization_mode : public internal_exception {
+public:
+  not_an_optimization_mode(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_bounded_integer_type_width : public internal_exception {
+public:
+  not_a_bounded_integer_type_width(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_bounded_integer_type_representation : public internal_exception {
+public:
+  not_a_bounded_integer_type_representation(Prolog_term_ref term,
+                                            const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_bounded_integer_type_overflow : public internal_exception {
+public:
+  not_a_bounded_integer_type_overflow(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_complexity_class : public internal_exception {
+public:
+  not_a_complexity_class(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_control_parameter_name : public internal_exception {
+public:
+  not_a_control_parameter_name(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_control_parameter_value : public internal_exception {
+public:
+  not_a_control_parameter_value(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_pip_problem_control_parameter_name : public internal_exception {
+public:
+  not_a_pip_problem_control_parameter_name(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_pip_problem_control_parameter_value : public internal_exception {
+public:
+  not_a_pip_problem_control_parameter_value(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_universe_or_empty : public internal_exception {
+public:
+  not_universe_or_empty(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_relation : public internal_exception {
+public:
+  not_a_relation(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class not_a_nil_terminated_list : public internal_exception {
+public:
+  not_a_nil_terminated_list(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class PPL_integer_out_of_range {
+private:
+  Parma_Polyhedra_Library::Coefficient n;
+
+public:
+  PPL_integer_out_of_range(const Parma_Polyhedra_Library::Coefficient& value)
+    : n(value) {
+  }
+
+  const Parma_Polyhedra_Library::Coefficient value() const {
+    return n;
+  }
+};
+
+class ppl_handle_mismatch : public internal_exception {
+public:
+  ppl_handle_mismatch(Prolog_term_ref term, const char* where)
+    : internal_exception(term, where) {
+  }
+};
+
+class unknown_interface_error {
+private:
+  const char* w;
+
+public:
+  unknown_interface_error(const char* s)
+    : w(s) {
+  }
+
+  const char* where() const {
+    return w;
+  }
+};
+
+// For Prolog lists.
+extern Prolog_atom a_nil;
+
+// For variables.
+extern Prolog_atom a_dollar_VAR;
+
+// For linear expressions.
+extern Prolog_atom a_plus;
+extern Prolog_atom a_minus;
+extern Prolog_atom a_asterisk;
+
+// To represent rational numbers as fractions.
+extern Prolog_atom a_slash;
+
+// For constraints.
+extern Prolog_atom a_less_than;
+extern Prolog_atom a_equal_less_than;
+extern Prolog_atom a_equal;
+extern Prolog_atom a_greater_than_equal;
+extern Prolog_atom a_greater_than;
+
+// For congruences.
+extern Prolog_atom a_is_congruent_to;
+extern Prolog_atom a_modulo;
+
+// For generators.
+extern Prolog_atom a_line;
+extern Prolog_atom a_ray;
+extern Prolog_atom a_point;
+extern Prolog_atom a_closure_point;
+
+// For grid_generators.
+extern Prolog_atom a_grid_line;
+extern Prolog_atom a_parameter;
+extern Prolog_atom a_grid_point;
+
+// For the relation between a polyhedron and a constraint.
+extern Prolog_atom a_is_disjoint;
+extern Prolog_atom a_strictly_intersects;
+extern Prolog_atom a_is_included;
+extern Prolog_atom a_saturates;
+
+// For the relation between a polyhedron and a generator.
+extern Prolog_atom a_subsumes;
+
+// Denotes a closed interval boundary.
+extern Prolog_atom a_c;
+
+// Denotes the empty set such as the empty interval or polyhedron.
+extern Prolog_atom a_empty;
+
+// Denotes an open interval boundary.
+extern Prolog_atom a_o;
+
+// Denotes the constructor that turns two boundaries into a proper interval.
+extern Prolog_atom a_i;
+
+// Denote the -infinity and +infinity interval boundaries.
+extern Prolog_atom a_minf;
+extern Prolog_atom a_pinf;
+
+// Denote complexity classes.
+extern Prolog_atom a_polynomial;
+extern Prolog_atom a_simplex;
+extern Prolog_atom a_any;
+
+// Denote possible widths of bounded integer types.
+extern Prolog_atom a_bits_8;
+extern Prolog_atom a_bits_16;
+extern Prolog_atom a_bits_32;
+extern Prolog_atom a_bits_64;
+extern Prolog_atom a_bits_128;
+
+// Denote possible representations of bounded integer types.
+extern Prolog_atom a_unsigned;
+extern Prolog_atom a_signed_2_complement;
+
+// Denote possible overflow behavior of bounded integer types.
+extern Prolog_atom a_overflow_wraps;
+extern Prolog_atom a_overflow_undefined;
+extern Prolog_atom a_overflow_impossible;
+
+// Boolean constants.
+extern Prolog_atom a_true;
+extern Prolog_atom a_false;
+
+
+struct Prolog_Interface_Atom {
+  Prolog_atom* p_atom;
+  const char* name;
+};
+
+extern const Prolog_Interface_Atom prolog_interface_atoms[];
+
+void
+handle_exception(const Prolog_unsigned_out_of_range& e);
+
+void
+handle_exception(const not_unsigned_integer& e);
+
+void
+handle_exception(const not_a_boolean& e);
+
+void
+handle_exception(const non_linear& e);
+
+void
+handle_exception(const not_a_variable& e);
+
+void
+handle_exception(const not_an_integer& e);
+
+void
+handle_exception(const ppl_handle_mismatch& e);
+
+void
+handle_exception(const not_an_optimization_mode& e);
+
+void
+handle_exception(const not_a_complexity_class& e);
+
+void
+handle_exception(const not_a_bounded_integer_type_width& e);
+
+void
+handle_exception(const not_a_bounded_integer_type_representation& e);
+
+void
+handle_exception(const not_a_bounded_integer_type_overflow& e);
+
+void
+handle_exception(const not_a_control_parameter_name& e);
+
+void
+handle_exception(const not_a_control_parameter_value& e);
+
+void
+handle_exception(const not_a_pip_problem_control_parameter_name& e);
+
+void
+handle_exception(const not_a_pip_problem_control_parameter_value& e);
+
+void
+handle_exception(const not_universe_or_empty& e);
+
+void
+handle_exception(const not_a_relation& e);
+
+void
+handle_exception(const not_a_nil_terminated_list& e);
+
+void
+handle_exception(const PPL_integer_out_of_range& e);
+
+void
+handle_exception(const unknown_interface_error& e);
+
+void
+handle_exception(const std::overflow_error& e);
+
+void
+handle_exception(const std::domain_error& e);
+
+void
+handle_exception(const std::length_error& e);
+
+void
+handle_exception(const std::invalid_argument& e);
+
+void
+handle_exception(const std::logic_error& e);
+
+void
+handle_exception(const std::bad_alloc&);
+
+void
+handle_exception(const std::exception& e);
+
+void
+handle_exception();
+
+class timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+void
+handle_exception(const timeout_exception&);
+
+class deterministic_timeout_exception
+  : public Parma_Polyhedra_Library::Throwable {
+public:
+  void throw_me() const {
+    throw *this;
+  }
+  int priority() const {
+    return 0;
+  }
+};
+
+void
+handle_exception(const deterministic_timeout_exception&);
+
+#define CATCH_ALL \
+  catch (const Prolog_unsigned_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_unsigned_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const non_linear& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_variable& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_integer& e) { \
+    handle_exception(e); \
+  } \
+  catch (const ppl_handle_mismatch& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_an_optimization_mode& e) {   \
+    handle_exception(e); \
+  } \
+  catch (const not_a_complexity_class& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_bounded_integer_type_width& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_bounded_integer_type_representation& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_bounded_integer_type_overflow& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_control_parameter_name& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_control_parameter_value& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_pip_problem_control_parameter_name& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_pip_problem_control_parameter_value& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_universe_or_empty& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_relation& e) { \
+    handle_exception(e); \
+  } \
+  catch (const not_a_nil_terminated_list& e) { \
+    handle_exception(e); \
+  } \
+  catch (const PPL_integer_out_of_range& e) { \
+    handle_exception(e); \
+  } \
+  catch (const unknown_interface_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const timeout_exception& e) { \
+    handle_exception(e); \
+  } \
+  catch (const deterministic_timeout_exception& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::overflow_error& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::domain_error& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::length_error& e) { \
+    handle_exception(e); \
+  } \
+  catch(const std::invalid_argument& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::logic_error& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::bad_alloc& e) { \
+    handle_exception(e); \
+  } \
+  catch (const std::exception& e) { \
+    handle_exception(e); \
+  } \
+  catch (...) { \
+    handle_exception(); \
+  } \
+  return PROLOG_FAILURE
+
+
+Prolog_term_ref
+variable_term(dimension_type varid);
+
+template <typename U>
+U
+term_to_unsigned(Prolog_term_ref t, const char* where) {
+  using namespace Parma_Polyhedra_Library;
+  using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+  if (!Prolog_is_integer(t))
+    throw not_unsigned_integer(t, where);
+
+  U d = 0;
+  long l;
+  if (Prolog_get_long(t, &l))
+    if (l < 0)
+      throw not_unsigned_integer(t, where);
+    else if (static_cast<unsigned long>(l) > std::numeric_limits<U>::max())
+      throw Prolog_unsigned_out_of_range(t, where,
+                                         std::numeric_limits<U>::max());
+    else
+      d = l;
+  else {
+    PPL_DIRTY_TEMP_COEFFICIENT(v);
+    Prolog_get_Coefficient(t, v);
+    if (v < 0)
+      throw not_unsigned_integer(t, where);
+    Result r = assign_r(d, raw_value(v), ROUND_IGNORE);
+    if (result_overflow(r))
+      throw Prolog_unsigned_out_of_range(t, where,
+                                         std::numeric_limits<U>::max());
+  }
+  return d;
+}
+
+Prolog_atom
+term_to_boolean(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t, const char* where);
+
+Prolog_term_ref
+interval_term(const Parma_Polyhedra_Library::Rational_Box::interval_type& i);
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_bounded_integer_type_width(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_bounded_integer_type_representation(Prolog_term_ref t,
+                                            const char* where);
+
+Prolog_atom
+term_to_bounded_integer_type_overflow(Prolog_term_ref t, const char* where);
+
+template <typename T>
+T*
+term_to_handle(Prolog_term_ref t, const char* where) {
+  if (Prolog_is_address(t)) {
+    void* p;
+    if (Prolog_get_address(t, &p))
+      return static_cast<T*>(p);
+  }
+  throw ppl_handle_mismatch(t, where);
+}
+
+enum Boundary_Kind {
+  LOWER_BOUNDARY,
+  UPPER_BOUNDARY
+};
+
+bool
+term_to_boundary(Prolog_term_ref t_b, Boundary_Kind kind,
+                 bool& finite, bool& closed,
+                 Parma_Polyhedra_Library::Coefficient& n, Parma_Polyhedra_Library::Coefficient& d);
+
+Parma_Polyhedra_Library::Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r, const char* where);
+
+Parma_Polyhedra_Library::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t);
+
+Prolog_term_ref
+Coefficient_to_integer_term(const Parma_Polyhedra_Library::Coefficient& n);
+
+bool
+unify_long(Prolog_term_ref t, long l);
+
+bool
+unify_ulong(Prolog_term_ref t, unsigned long l);
+
+Parma_Polyhedra_Library::Linear_Expression
+build_linear_expression(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Constraint
+build_constraint(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Congruence
+build_congruence(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Generator
+build_generator(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Grid_Generator
+build_grid_generator(Prolog_term_ref t, const char* where);
+
+Prolog_term_ref
+get_linear_expression(const Parma_Polyhedra_Library::Linear_Expression& le);
+
+Prolog_term_ref
+constraint_term(const Parma_Polyhedra_Library::Constraint& c);
+
+Prolog_term_ref
+congruence_term(const Parma_Polyhedra_Library::Congruence& cg);
+
+Prolog_term_ref
+generator_term(const Parma_Polyhedra_Library::Generator& g);
+
+Prolog_term_ref
+grid_generator_term(const Parma_Polyhedra_Library::Grid_Generator& g);
+
+Parma_Polyhedra_Library::Variable
+term_to_Variable(Prolog_term_ref t, const char* where);
+
+Parma_Polyhedra_Library::Coefficient
+term_to_Coefficient(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_control_parameter_name(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_control_parameter_value(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_pip_problem_control_parameter_name(Prolog_term_ref t, const char* where);
+
+Prolog_atom
+term_to_pip_problem_control_parameter_value(Prolog_term_ref t, const char* where);
+
+void
+check_nil_terminating(Prolog_term_ref t, const char* where);
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+extern "C" Prolog_foreign_return_type
+ppl_version_major(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_minor(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_revision(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version_beta(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_version(Prolog_term_ref t_v);
+
+extern "C" Prolog_foreign_return_type
+ppl_banner(Prolog_term_ref t_b);
+
+extern "C" Prolog_foreign_return_type
+ppl_max_space_dimension(Prolog_term_ref t_msd);
+
+extern "C" Prolog_foreign_return_type
+ppl_initialize();
+
+extern "C" Prolog_foreign_return_type
+ppl_finalize();
+
+extern "C" Prolog_foreign_return_type
+ppl_set_rounding_for_PPL();
+
+extern "C" Prolog_foreign_return_type
+ppl_restore_pre_PPL_rounding();
+
+extern "C" Prolog_foreign_return_type
+ppl_irrational_precision(Prolog_term_ref t_p);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_irrational_precision(Prolog_term_ref t_p);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout_exception_atom(Prolog_term_ref t_tea);
+
+extern "C" Prolog_foreign_return_type
+ppl_timeout_exception_atom(Prolog_term_ref t);
+
+extern "C" Prolog_foreign_return_type
+ppl_set_timeout(Prolog_term_ref t_csecs);
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_timeout();
+
+extern "C" Prolog_foreign_return_type
+ppl_set_deterministic_timeout(Prolog_term_ref t_unscaled_weight,
+                              Prolog_term_ref t_scale);
+
+extern "C" Prolog_foreign_return_type
+ppl_reset_deterministic_timeout();
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_bits(Prolog_term_ref t_bits);
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_is_bounded();
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_min(Prolog_term_ref t_min);
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_space_dimension
+(Prolog_term_ref t_nd, Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem(Prolog_term_ref t_nd,
+                    Prolog_term_ref t_clist,
+                    Prolog_term_ref t_le_expr,
+                    Prolog_term_ref t_opt,
+                    Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_MIP_Problem_from_MIP_Problem(Prolog_term_ref t_mip_source,
+                                     Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_MIP_Problem(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_space_dimension(Prolog_term_ref t_mip, Prolog_term_ref t_sd);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_integer_space_dimensions(Prolog_term_ref t_mip,
+                                         Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_constraints(Prolog_term_ref t_mip,
+                            Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_objective_function(Prolog_term_ref t_mip,
+                                   Prolog_term_ref t_le_expr);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimization_mode(Prolog_term_ref t_mip,
+                                  Prolog_term_ref t_opt);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_get_control_parameter(Prolog_term_ref t_mip,
+                                      Prolog_term_ref t_cp_name,
+                                      Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_clear(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_mip, Prolog_term_ref t_nnd);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_to_integer_space_dimensions(Prolog_term_ref t_mip,
+                                                Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraint(Prolog_term_ref t_mip, Prolog_term_ref t_c);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_add_constraints(Prolog_term_ref t_mip,
+                                Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_objective_function(Prolog_term_ref t_mip,
+                                       Prolog_term_ref t_le_expr);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_optimization_mode(Prolog_term_ref t_mip,
+                                      Prolog_term_ref t_opt);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_set_control_parameter(Prolog_term_ref t_mip,
+                                      Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_is_satisfiable(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_solve(Prolog_term_ref t_mip, Prolog_term_ref t_status);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_feasible_point(Prolog_term_ref t_mip,
+                               Prolog_term_ref t_g);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimizing_point(Prolog_term_ref t_mip,
+                                 Prolog_term_ref t_g);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_optimal_value(Prolog_term_ref t_mip,
+                              Prolog_term_ref t_n,
+                              Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_evaluate_objective_function(Prolog_term_ref t_mip,
+                                            Prolog_term_ref t_g,
+                                            Prolog_term_ref t_n,
+                                            Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_OK(Prolog_term_ref t_mip);
+
+extern "C" Prolog_foreign_return_type
+ppl_MIP_Problem_ascii_dump(Prolog_term_ref t_mip);
+
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_space_dimension(Prolog_term_ref t_nd,
+                                         Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem_from_PIP_Problem(Prolog_term_ref t_pip_source,
+                                     Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_new_PIP_Problem(Prolog_term_ref t_dim,
+                    Prolog_term_ref t_cs,
+                    Prolog_term_ref t_params,
+                    Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs);
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_PIP_Problem(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_space_dimension(Prolog_term_ref t_pip, Prolog_term_ref t_sd);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_parameter_space_dimensions(Prolog_term_ref t_pip,
+                                           Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_constraints(Prolog_term_ref t_pip, Prolog_term_ref t_cs);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_get_control_parameter(Prolog_term_ref t_pip,
+                                      Prolog_term_ref t_cp_name,
+                                      Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_clear(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_space_dimensions_and_embed
+(Prolog_term_ref t_pip,
+ Prolog_term_ref t_num_vars,
+ Prolog_term_ref t_num_params);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_to_parameter_space_dimensions(Prolog_term_ref t_pip,
+                                                  Prolog_term_ref t_vlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraint(Prolog_term_ref t_pip, Prolog_term_ref t_c);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_add_constraints(Prolog_term_ref t_pip,
+                                Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_control_parameter(Prolog_term_ref t_pip,
+                                      Prolog_term_ref t_cp_value);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_is_satisfiable(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solve(Prolog_term_ref t_pip, Prolog_term_ref t_status);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_solution(Prolog_term_ref t_pip,
+                         Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_optimizing_solution(Prolog_term_ref t_pip,
+                                    Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_has_big_parameter_dimension(Prolog_term_ref t_pip,
+                                            Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_set_big_parameter_dimension(Prolog_term_ref t_pip,
+                                            Prolog_term_ref t_d);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_OK(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Problem_ascii_dump(Prolog_term_ref t_pip);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_constraints(Prolog_term_ref t_tree_node,
+                              Prolog_term_ref t_clist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_solution(Prolog_term_ref t_tree_node);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_decision(Prolog_term_ref t_tree_node);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_is_bottom(Prolog_term_ref t_tree_node);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_artificials(Prolog_term_ref t_tree_node,
+                              Prolog_term_ref t_artlist);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_OK(Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_parametric_values(Prolog_term_ref t_pip_sol,
+                                    Prolog_term_ref t_var,
+                                    Prolog_term_ref t_pvalue_list);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_true_child(Prolog_term_ref t_pip_dec,
+                             Prolog_term_ref t_pip_tree);
+
+extern "C" Prolog_foreign_return_type
+ppl_PIP_Tree_Node_false_child(Prolog_term_ref t_pip_dec,
+                              Prolog_term_ref t_pip_tree);
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Interfaces::Prolog;
+
+#include "ppl_prolog_common_inlines.hh"
+
+#endif // !defined(PPL_ppl_prolog_common_defs_hh)
diff --git a/interfaces/Prolog/ppl_prolog_common_inlines.hh b/interfaces/Prolog/ppl_prolog_common_inlines.hh
new file mode 100644
index 0000000..e759bb4
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog_common_inlines.hh
@@ -0,0 +1,88 @@
+/* Common part of the Prolog interfaces: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_prolog_common_inlines_hh
+#define PPL_ppl_prolog_common_inlines_hh 1
+
+#if PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+#include <typeinfo>
+#include <iomanip>
+
+template <typename T>
+void
+Allocation_Tracker::insert(const T* p) {
+#if NOISY_PROLOG_TRACK_ALLOCATION
+  std::cerr << "inserting " << typeid(*p).name()
+            << " at " << std::hex << (void*) p << std::endl;
+#endif
+  std::pair<Set::iterator, bool> stat = s.insert(p);
+  if (!stat.second) {
+    std::cerr << "Interfaces::Prolog::Allocation_Tracker:"
+                 " two objects at the same address at the same time?!"
+              << std::endl;
+    abort();
+  }
+}
+
+template <typename T>
+void
+Allocation_Tracker::weak_insert(const T* p) {
+#if NOISY_PROLOG_TRACK_ALLOCATION
+  std::cerr << "inserting weak " << typeid(*p).name()
+            << " at " << std::hex << (void*) p << std::endl;
+#endif
+  weak_s.insert(p);
+}
+
+template <typename T>
+void
+Allocation_Tracker::remove(const T* p) {
+#if NOISY_PROLOG_TRACK_ALLOCATION
+  std::cerr << "removing " << typeid(*p).name()
+            << " at " << std::hex << (void*) p << std::endl;
+#endif
+  if (s.erase(p) != 1) {
+    std::cerr << "Interfaces::Prolog::Allocation_Tracker:"
+                 " attempt to deallocate a nonexistent polyhedron."
+              << std::endl;
+    abort();
+  }
+}
+
+template <typename T>
+void
+Allocation_Tracker::check(const T* p) const {
+  if (s.find(p) == s.end()
+      && weak_s.find(p) == weak_s.end()) {
+    std::cerr << "Interfaces::Prolog::Allocation_Tracker:"
+                  " attempt to access a nonexistent "
+              << typeid(*p).name()
+              << " at " << std::hex << (void*) p << std::endl;
+    abort();
+  }
+}
+
+#endif // PROLOG_TRACK_ALLOCATION || NOISY_PROLOG_TRACK_ALLOCATION
+
+#endif // !defined(PPL_ppl_prolog_common_inlines_hh)
diff --git a/interfaces/Prolog/tests/Makefile.am b/interfaces/Prolog/tests/Makefile.am
new file mode 100644
index 0000000..dc574e6
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.am
@@ -0,0 +1,87 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+EXTRA_DIST = \
+clpq.pl script_clpq \
+clpq2.pl script_clpq2 script_clpq2_int8 \
+$(CLPQ_TESTS) \
+pl_check.pl \
+ppl_prolog_generated_test_common.pl \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4 \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a \
+expected_pgt
+
+check-local: ppl_prolog_generated_test.stamp
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4
+
+ppl_prolog_generated_test.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_prolog_generated_test_pl.m4 \
+			> ppl_prolog_generated_test_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_generated_test_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_generated_test_blob
+	rm -f ppl_prolog_generated_test_blob
+	echo timestamp >$@
+
+CLEANFILES = \
+ at required_instantiations_prolog_generated_test_sources@ \
+ppl_prolog_generated_test.stamp \
+ppl_prolog_generated_test_main.pl
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
diff --git a/interfaces/Prolog/tests/Makefile.in b/interfaces/Prolog/tests/Makefile.in
new file mode 100644
index 0000000..121bcae
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.in
@@ -0,0 +1,611 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/Prolog/tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+CLPQ_TESTS_NONSTRICT = \
+ack.clpq \
+ackn.clpq \
+fib.clpq \
+mc91.clpq \
+smm.clpq \
+sumto.clpq \
+tak.clpq
+
+CLPQ_TESTS_STRICT = \
+schedule.clpq
+
+CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+EXTRA_DIST = \
+clpq.pl script_clpq \
+clpq2.pl script_clpq2 script_clpq2_int8 \
+$(CLPQ_TESTS) \
+pl_check.pl \
+ppl_prolog_generated_test_common.pl \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4 \
+expected_clpq_mpz expected_clpq2_mpz expected_pchk_mpz \
+expected_clpq_int8 expected_clpq2_int8 expected_pchk_int8 \
+expected_clpq_int16 expected_clpq2_int16 expected_pchk_int16 \
+expected_clpq_int32 expected_clpq2_int32 expected_pchk_int32 \
+expected_clpq_int64 expected_clpq2_int64 expected_pchk_int64 \
+expected_clpq_mpz_a expected_clpq2_mpz_a expected_pchk_mpz_a \
+expected_clpq_int8_a expected_clpq2_int8_a expected_pchk_int8_a \
+expected_clpq_int16_a expected_clpq2_int16_a expected_pchk_int16_a \
+expected_clpq_int32_a expected_clpq2_int32_a expected_pchk_int32_a \
+expected_clpq_int64_a expected_clpq2_int64_a expected_pchk_int64_a \
+expected_pgt
+
+interface_generator_dependencies = \
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4 \
+../../ppl_interface_generator_common.m4 \
+../../ppl_interface_generator_common_dat.m4 \
+../../ppl_interface_generator_copyright \
+../../ppl_interface_generator_common_procedure_generators.m4 \
+../ppl_interface_generator_prolog_systems.m4 \
+../ppl_interface_generator_prolog_procedure_generators.m4 \
+ppl_interface_generator_prolog_generated_test_pl.m4 \
+ppl_interface_generator_prolog_generated_test_pl_code.m4
+
+CLEANFILES = \
+ at required_instantiations_prolog_generated_test_sources@ \
+ppl_prolog_generated_test.stamp \
+ppl_prolog_generated_test_main.pl
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-am check-local clean clean-generic \
+	clean-libtool cscopelist-am ctags-am distclean \
+	distclean-generic distclean-libtool distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+	uninstall-am
+
+
+check-local: ppl_prolog_generated_test.stamp
+
+ppl_prolog_generated_test.stamp: $(interface_generator_dependencies)
+	$(M4) --prefix-builtin -I../.. \
+		-I$(srcdir) -I$(srcdir)/.. -I$(srcdir)/../.. \
+		$(srcdir)/ppl_interface_generator_prolog_generated_test_pl.m4 \
+			> ppl_prolog_generated_test_blob
+	$(top_srcdir)/utils/cm_cleaner.sh ./ppl_prolog_generated_test_blob
+	$(top_srcdir)/utils/cm_splitter.sh ./ppl_prolog_generated_test_blob
+	rm -f ppl_prolog_generated_test_blob
+	echo timestamp >$@
+
+$(top_builddir)/interfaces/ppl_interface_instantiations.m4:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/interfaces ppl_interface_instantiations.m4
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Prolog/tests/ack.clpq b/interfaces/Prolog/tests/ack.clpq
new file mode 100644
index 0000000..9e3c4e3
--- /dev/null
+++ b/interfaces/Prolog/tests/ack.clpq
@@ -0,0 +1,5 @@
+ack(0, N, N+1).
+ack(M, 0, R) :-
+   { M >= 1 }, ack(M-1, 1, R).
+ack(M, N, R) :-
+   { M >= 1, N >= 1 }, ack(M, N-1, T), ack(M-1, T, R).
diff --git a/interfaces/Prolog/tests/ackn.clpq b/interfaces/Prolog/tests/ackn.clpq
new file mode 100644
index 0000000..3f25deb
--- /dev/null
+++ b/interfaces/Prolog/tests/ackn.clpq
@@ -0,0 +1,6 @@
+ack(M, N, R) :-
+   { M = 0, R = N+1 }.
+ack(M, N, R) :-
+   { M >= 1, N = 0, M = M1+1 }, ack(M1, 1, R).
+ack(M, N, R) :-
+   { M >= 1, N >= 1, M = M1+1, N = N1+1 }, ack(M, N1, T), ack(M1, T, R).
diff --git a/interfaces/Prolog/tests/clpq.pl b/interfaces/Prolog/tests/clpq.pl
new file mode 100644
index 0000000..776dba3
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq.pl
@@ -0,0 +1,805 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+% Object-level clauses are stored as user_clause(Head, Body) facts.
+:- dynamic(user_clause/2).
+
+% Used to store the names of variables occurring in the original goal
+% as a list of the form [ Name1 = Variable1, ... ]
+:- dynamic(original_goal_variables/1).
+
+
+% solve(+Goals, +Variable_Names)
+%
+% Tries to solve the query `Goals' and to present the results
+% to the user by referring to the original variable names
+% contained in `Variable_Names'.
+
+solve(Goals, Variable_Names) :-
+    numvars(Goals, 0, Dims),
+    assertz(original_goal_variables(Variable_Names)),
+    % The initial polyhedron is initialised with
+    % `Dims' dimensions, the number of variables in `Goals'.
+    ppl_new_C_Polyhedron_from_space_dimension(Dims, universe, Polyhedron),
+    % Try to reduce `Goals' to the empty continuation.
+    (solve(Goals, true, Polyhedron) ->
+        Failed = no
+    ;
+        Failed = yes
+    ),
+    % On failure, cleanup must occur anyway.
+    % The one who creates the polyhedron must delete it.
+    ppl_delete_Polyhedron(Polyhedron),
+    % Further cleaning.
+    retract(original_goal_variables(_)),
+    Failed == no.
+
+
+solve(true, true, Polyhedron) :-
+    !,
+    % It is time to print the result and see if the user
+    % wants to look for more solutions.
+    ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Q),
+    original_goal_variables(Variable_Names),
+    length(Variable_Names, Dims),
+    ppl_Polyhedron_remove_higher_space_dimensions(Q, Dims),
+    ppl_Polyhedron_get_constraints(Q, CS),
+    write_constraints(CS, Variable_Names),
+    ppl_delete_Polyhedron(Q),
+    % More?
+    % If query_next_solution succeeds,
+    % then no more solutions are required.
+    query_next_solution.
+
+solve(true, (G, Goals), Polyhedron) :-
+    !,
+    solve(G, Goals, Polyhedron).
+
+solve((A, B), Goals, Polyhedron) :-
+    !,
+    solve(A, (B, Goals), Polyhedron).
+
+solve({}, Goals, Polyhedron) :-
+    !,
+    % The empty set of constraints is equivalent to true.
+    solve(true, Goals, Polyhedron).
+
+solve({ Constraints }, Goals, Polyhedron) :-
+    !,
+    % Solve the constraints using the constraint solver.
+    solve_constraints(Constraints, Polyhedron),
+    solve(true, Goals, Polyhedron).
+
+% Built-ins may be added here.
+
+solve(Atom, Goals, Polyhedron) :-
+    % Here is a choicepoint: possibly different clauses
+    % will be selected on backtracking.
+    % NOTE: we may fail to find (another) clause,
+    %       but we have allocated nothing yet.
+    select_clause(Atom, Head, Body),
+
+    % Copy the current polyhedron and work on the copy.
+    % NOTE: the copy is under our responsibility, i.e.,
+    %       it is our job to delete it, sooner or later.
+    ppl_new_C_Polyhedron_from_C_Polyhedron(Polyhedron, Poly_Copy),
+
+    % Rename the selected clause apart and extend the polyhedron.
+    ppl_Polyhedron_space_dimension(Poly_Copy, Dims),
+    numvars((Head, Body), Dims, New_Dims),
+    Added_Dims is New_Dims - Dims,
+    ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims),
+    % Parameter passing.
+    parameter_passing(Atom, Head, PP_Constraints),
+
+    % Try to solve the body augmented with the parameter passing equations.
+    (solve(PP_Constraints, (Body, Goals), Poly_Copy) ->
+        Failed = no
+    ;
+        Failed = yes
+    ),
+    % Our copy must be thrown anyway.
+    ppl_delete_Polyhedron(Poly_Copy),
+    Failed == no.
+
+
+parameter_passing(Atom, Head, PP_Constraints) :-
+    Atom =.. [_|Actuals],
+    Head =.. [_|Formals],
+    (Actuals == [] ->
+        PP_Constraints = true
+    ;
+        build_pp_constraints(Actuals, Formals, Equations),
+        PP_Constraints = ({ Equations })
+    ).
+
+build_pp_constraints([A|Actuals], [F|Formals], Equations) :-
+    (Actuals == [] ->
+        Equations = (A = F)
+    ;
+        Equations = ((A = F), More_Equations),
+        build_pp_constraints(Actuals, Formals, More_Equations)
+    ).
+
+select_clause(Atom, Head, Body) :-
+    functor(Atom, F, N),
+    functor(Head, F, N),
+    user_clause(Head, Body).
+
+% The constraints are solved by adding them into the polyhedron.
+solve_constraints(Constraints, Polyhedron) :-
+    listize_constraints(Constraints, Constraints_List),
+    ppl_Polyhedron_add_constraints(Polyhedron, Constraints_List),
+    % Fail if `Polyhedron' became empty.
+    \+ ppl_Polyhedron_is_empty(Polyhedron).
+
+
+listize_constraints(C, LC) :-
+    listize_constraints(C, [], LC).
+
+listize_constraints((A, B), Rest, LC) :-
+    !,
+    listize_constraints(B, Rest, BRest),
+    listize_constraints(A, BRest, LC).
+listize_constraints(C, Rest, [C|Rest]).
+
+
+%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%%
+
+query_next_solution :-
+  write(' more? '),
+  repeat,
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 59,
+    % Get rid of the EOL character.
+    get_code(user_input, _EOL)
+  ;
+    C == 10
+  ;
+    write('Action (";" for more choices, otherwise <return>): '),
+    eat_to_eol,
+    fail
+  ),
+  !,
+  C = 10.
+
+eat_to_eol :-
+  get_code(user_input, C),
+  (C == 10 ->
+    true
+  ;
+    eat_to_eol
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+open_file_for_reading(File, Stream) :-
+  catch(open(File, read, Stream), _, fail).
+
+read_programs([]).
+read_programs([P|Ps]) :-
+  read_program(P),
+  read_programs(Ps).
+
+read_program(Program) :-
+  (atom(Program) ->
+    true
+  ;
+    write_error(['read_program/1 - arg 1: expected file name, found ',
+                 Program]),
+    fail
+  ),
+  (open_file_for_reading(Program, Stream) ->
+    File_Name = Program
+  ;
+    atom_concat(Program, '.clpq', File_Name),
+    (open_file_for_reading(File_Name, Stream) ->
+      true
+    ;
+      write_error(['read_program/1 - arg 1: file ',
+                   Program, ' does not exist']),
+      fail
+    )
+  ),
+  (read_clauses(Stream) ->
+    close(Stream)
+  ;
+    write_error(['read_program/1 - arg 1: syntax error reading ', Program]),
+    close(Stream),
+    fail
+  ).
+
+read_clauses(Stream) :-
+  read(Stream, Clause),
+  (Clause \== end_of_file ->
+    (Clause = (Head :- Body) ->
+      assertz(user_clause(Head, Body))
+    ;
+      assertz(user_clause(Clause, true))
+    ),
+    read_clauses(Stream)
+  ;
+    true
+  ).
+
+%%%%%%%%%%%%%%%%%%%%% The User's Interaction Loop %%%%%%%%%%%%%%%%%%%%%%
+
+write_error(Message) :-
+  write('clpq error: '),
+  write_error_aux(Message).
+
+write_error_aux([]) :-
+  nl.
+write_error_aux([H|T]) :-
+  write(H),
+  write_error_aux(T).
+
+main_loop :-
+  write('PPL clpq ?- '),
+  read_term(Command, [variable_names(VN)]),
+  % The above read leaves an EOL character in the input buffer:
+  % get rid of it.
+  eat_eol,
+  catch(do_command(Command, VN),
+        Exception,
+        (print_exception_term(Exception), main_loop_no)).
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  nl,
+  writeq(Exception),
+  nl.
+
+clear_program :-
+  retract(user_clause(_, _)),
+  fail.
+clear_program.
+
+list_program :-
+  user_clause(Head, Body),
+  pp(Head, Body),
+  fail.
+list_program.
+
+pp(Head, Body) :-
+  % write(Head),
+  (Body == true ->
+    % write('.')
+    portray_clause(Head)
+  ;
+    % write(' :- '),
+    % write(Body)
+    portray_clause((Head :- Body))
+  ),
+  nl.
+
+do_command(end_of_file, _VN) :-
+  !.
+do_command(halt, _VN) :-
+  !.
+do_command(warranty, _VN) :-
+  !,
+  show_warranty,
+  main_loop_yes.
+do_command(copying, _VN) :-
+  !,
+  show_copying,
+  main_loop_yes.
+do_command(trace, _VN) :-
+  !,
+  trace,
+  main_loop_yes.
+do_command(notrace, _VN) :-
+  !,
+  notrace,
+  main_loop_yes.
+do_command(debug, _VN) :-
+  !,
+  debug,
+  main_loop_yes.
+do_command(nodebug, _VN) :-
+  !,
+  nodebug,
+  main_loop_yes.
+do_command(spy(Spec), _VN) :-
+  !,
+  spy(Spec),
+  main_loop_yes.
+do_command(nospy(Spec), _VN) :-
+  !,
+  nospy(Spec),
+  main_loop_yes.
+do_command(nospyall, _VN) :-
+  !,
+  nospyall,
+  main_loop_yes.
+do_command([], _VN) :-
+  !,
+  (read_programs([]) ; true),
+  main_loop_yes.
+do_command([H|T], _VN) :-
+  !,
+  (read_programs([H|T]) ; true),
+  main_loop_yes.
+do_command(consult(Program), _VN) :-
+  !,
+  (read_program(Program) ; true),
+  main_loop_yes.
+do_command(reconsult(Program), VN) :-
+  !,
+  clear_program,
+  do_command(consult(Program), VN).
+do_command(listing, _VN) :-
+  !,
+  list_program,
+  main_loop_yes.
+do_command(statistics, _VN) :-
+  !,
+  statistics,
+  main_loop_yes.
+do_command(Query, VN) :-
+  solve(Query, VN),
+  main_loop_yes.
+do_command(_, _VN) :-
+  main_loop_no.
+
+main_loop_no :-
+  write(no),
+  nl,
+  main_loop.
+
+main_loop_yes :-
+  write(yes),
+  nl,
+  main_loop.
+
+%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%%
+
+write_var(Var, Variable_Names) :-
+  member(Name=Var, Variable_Names),
+  !,
+  write(Name).
+
+negate_expr(Num*Var, Neg_Expr) :-
+  (Num < 0 ->
+    Neg_Num is -Num,
+    Neg_Expr = Neg_Num*Var
+  ;
+    Neg_Expr = Num*Var
+  ).
+negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :-
+  negate_expr(Expr1, Neg_Expr1),
+  negate_expr(Expr2, Neg_Expr2).
+
+write_expr(Num*Var, Variable_Names) :-
+  (Num =:= 1 ->
+    true
+  ;
+    (Num =:= -1 ->
+      write('-')
+    ;
+      write(Num),
+      write('*')
+    )
+  ),
+  write_var(Var, Variable_Names).
+write_expr(E + Num*Var, Variable_Names) :-
+  write_expr(E, Variable_Names),
+  (Num < 0 ->
+    write(' - '),
+    Neg_Num is -Num,
+    write_expr(Neg_Num*Var, Variable_Names)
+  ;
+    write(' + '),
+    write_expr(Num*Var, Variable_Names)
+  ).
+
+write_constraint(Expr = Num, Variable_Names) :-
+  write_expr(Expr, Variable_Names),
+  write(' = '),
+  write(Num).
+write_constraint(Expr >= Num, Variable_Names) :-
+  (Num < 0 ->
+    negate_expr(Expr, Neg_Expr),
+    write_expr(Neg_Expr, Variable_Names),
+    write(' =< '),
+    Neg_Num is -Num,
+    write(Neg_Num)
+  ;
+    write_expr(Expr, Variable_Names),
+    write(' >= '),
+    write(Num)
+  ).
+
+write_constraints([], _Variable_Names).
+write_constraints([C|CS], Variable_Names) :-
+  write_constraint(C, Variable_Names),
+  nl,
+  write_constraints(CS, Variable_Names).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% Utility Predicates %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% numvars(?Term, +In_N, ?Out_N)
+%
+% Unifies each of the variables in Term with the special terms
+% '$VAR'(k), where k ranges from In_N to Out_N-1.
+
+numvars('$VAR'(In_N), In_N, Out_N) :-
+  !,
+  Out_N is In_N + 1.
+numvars(Term, In_N, Out_N) :-
+  Term =.. [_|Args],
+  numvars_list(Args, In_N, Out_N).
+
+numvars_list([], In_N, In_N).
+numvars_list([Arg|Args], In_N, Out_N) :-
+  numvars(Arg, In_N, Tmp_N),
+  numvars_list(Args, Tmp_N, Out_N).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+next_or_quit :-
+  write('---Type <return> to continue, or q <return> to quit---'),
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 10
+  ;
+    eat_eol
+  ),
+  !,
+  C \== 113.
+
+show_copying :-
+  eat_eol,
+  write('\
+                    GNU GENERAL PUBLIC LICENSE\n\
+                       Version 2, June 1991\n\
+\n\
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\
+ Everyone is permitted to copy and distribute verbatim copies\n\
+ of this license document, but changing it is not allowed.\n\
+\n\
+                            Preamble\n\
+\n\
+  The licenses for most software are designed to take away your\n\
+freedom to share and change it.  By contrast, the GNU General Public\n\
+License is intended to guarantee your freedom to share and change free\n\
+software--to make sure the software is free for all its users.  This\n\
+General Public License applies to most of the Free Software\n\
+Foundation''s software and to any other program whose authors commit to\n\
+using it.  (Some other Free Software Foundation software is covered by\n\
+the GNU Library General Public License instead.)  You can apply it to\n\
+your programs, too.\n\
+\n\
+  When we speak of free software, we are referring to freedom, not\n\
+price.  Our General Public Licenses are designed to make sure that you\n\
+have the freedom to distribute copies of free software (and charge for\n'),
+  next_or_quit,
+  write('\
+this service if you wish), that you receive source code or can get it\n\
+if you want it, that you can change the software or use pieces of it\n\
+in new free programs; and that you know you can do these things.\n\
+\n\
+  To protect your rights, we need to make restrictions that forbid\n\
+anyone to deny you these rights or to ask you to surrender the rights.\n\
+These restrictions translate to certain responsibilities for you if you\n\
+distribute copies of the software, or if you modify it.\n\
+\n\
+  For example, if you distribute copies of such a program, whether\n\
+gratis or for a fee, you must give the recipients all the rights that\n\
+you have.  You must make sure that they, too, receive or can get the\n\
+source code.  And you must show them these terms so they know their\n\
+rights.\n\
+\n\
+  We protect your rights with two steps: (1) copyright the software, and\n\
+(2) offer you this license which gives you legal permission to copy,\n\
+distribute and/or modify the software.\n\
+\n\
+  Also, for each author''s protection and ours, we want to make certain\n\
+that everyone understands that there is no warranty for this free\n\
+software.  If the software is modified by someone else and passed on, we\n\
+want its recipients to know that what they have is not the original, so\n'),
+  next_or_quit,
+  write('\
+that any problems introduced by others will not reflect on the original\n\
+authors'' reputations.\n\
+\n\
+  Finally, any free program is threatened constantly by software\n\
+patents.  We wish to avoid the danger that redistributors of a free\n\
+program will individually obtain patent licenses, in effect making the\n\
+program proprietary.  To prevent this, we have made it clear that any\n\
+patent must be licensed for everyone''s free use or not licensed at all.\n\
+\n\
+  The precise terms and conditions for copying, distribution and\n\
+modification follow.\n\
+\n\
+                    GNU GENERAL PUBLIC LICENSE\n\
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\
+\n\
+  0. This License applies to any program or other work which contains\n\
+a notice placed by the copyright holder saying it may be distributed\n\
+under the terms of this General Public License.  The "Program", below,\n\
+refers to any such program or work, and a "work based on the Program"\n\
+means either the Program or any derivative work under copyright law:\n\
+that is to say, a work containing the Program or a portion of it,\n\
+either verbatim or with modifications and/or translated into another\n\
+language.  (Hereinafter, translation is included without limitation in\n'),
+  next_or_quit,
+  write('\
+the term "modification".)  Each licensee is addressed as "you".\n\
+\n\
+Activities other than copying, distribution and modification are not\n\
+covered by this License; they are outside its scope.  The act of\n\
+running the Program is not restricted, and the output from the Program\n\
+is covered only if its contents constitute a work based on the\n\
+Program (independent of having been made by running the Program).\n\
+Whether that is true depends on what the Program does.\n\
+\n\
+  1. You may copy and distribute verbatim copies of the Program''s\n\
+source code as you receive it, in any medium, provided that you\n\
+conspicuously and appropriately publish on each copy an appropriate\n\
+copyright notice and disclaimer of warranty; keep intact all the\n\
+notices that refer to this License and to the absence of any warranty;\n\
+and give any other recipients of the Program a copy of this License\n\
+along with the Program.\n\
+\n\
+You may charge a fee for the physical act of transferring a copy, and\n\
+you may at your option offer warranty protection in exchange for a fee.\n\
+\n\
+  2. You may modify your copy or copies of the Program or any portion\n\
+of it, thus forming a work based on the Program, and copy and\n\
+distribute such modifications or work under the terms of Section 1\n'),
+  next_or_quit,
+  write('\
+above, provided that you also meet all of these conditions:\n\
+\n\
+    a) You must cause the modified files to carry prominent notices\n\
+    stating that you changed the files and the date of any change.\n\
+\n\
+    b) You must cause any work that you distribute or publish, that in\n\
+    whole or in part contains or is derived from the Program or any\n\
+    part thereof, to be licensed as a whole at no charge to all third\n\
+    parties under the terms of this License.\n\
+\n\
+    c) If the modified program normally reads commands interactively\n\
+    when run, you must cause it, when started running for such\n\
+    interactive use in the most ordinary way, to print or display an\n\
+    announcement including an appropriate copyright notice and a\n\
+    notice that there is no warranty (or else, saying that you provide\n\
+    a warranty) and that users may redistribute the program under\n\
+    these conditions, and telling the user how to view a copy of this\n\
+    License.  (Exception: if the Program itself is interactive but\n\
+    does not normally print such an announcement, your work based on\n\
+    the Program is not required to print an announcement.)\n\
+\n\
+These requirements apply to the modified work as a whole.  If\n\
+identifiable sections of that work are not derived from the Program,\n'),
+  next_or_quit,
+  write('\
+and can be reasonably considered independent and separate works in\n\
+themselves, then this License, and its terms, do not apply to those\n\
+sections when you distribute them as separate works.  But when you\n\
+distribute the same sections as part of a whole which is a work based\n\
+on the Program, the distribution of the whole must be on the terms of\n\
+this License, whose permissions for other licensees extend to the\n\
+entire whole, and thus to each and every part regardless of who wrote it.\n\
+\n\
+Thus, it is not the intent of this section to claim rights or contest\n\
+your rights to work written entirely by you; rather, the intent is to\n\
+exercise the right to control the distribution of derivative or\n\
+collective works based on the Program.\n\
+\n\
+In addition, mere aggregation of another work not based on the Program\n\
+with the Program (or with a work based on the Program) on a volume of\n\
+a storage or distribution medium does not bring the other work under\n\
+the scope of this License.\n\
+\n\
+  3. You may copy and distribute the Program (or a work based on it,\n\
+under Section 2) in object code or executable form under the terms of\n\
+Sections 1 and 2 above provided that you also do one of the following:\n\
+\n\
+    a) Accompany it with the complete corresponding machine-readable\n'),
+  next_or_quit,
+  write('\
+    source code, which must be distributed under the terms of Sections\n\
+    1 and 2 above on a medium customarily used for software interchange; or,\n\
+\n\
+    b) Accompany it with a written offer, valid for at least three\n\
+    years, to give any third party, for a charge no more than your\n\
+    cost of physically performing source distribution, a complete\n\
+    machine-readable copy of the corresponding source code, to be\n\
+    distributed under the terms of Sections 1 and 2 above on a medium\n\
+    customarily used for software interchange; or,\n\
+\n\
+    c) Accompany it with the information you received as to the offer\n\
+    to distribute corresponding source code.  (This alternative is\n\
+    allowed only for noncommercial distribution and only if you\n\
+    received the program in object code or executable form with such\n\
+    an offer, in accord with Subsection b above.)\n\
+\n\
+The source code for a work means the preferred form of the work for\n\
+making modifications to it.  For an executable work, complete source\n\
+code means all the source code for all modules it contains, plus any\n\
+associated interface definition files, plus the scripts used to\n\
+control compilation and installation of the executable.  However, as a\n\
+special exception, the source code distributed need not include\n\
+anything that is normally distributed (in either source or binary\n'),
+  next_or_quit,
+  write('\
+form) with the major components (compiler, kernel, and so on) of the\n\
+operating system on which the executable runs, unless that component\n\
+itself accompanies the executable.\n\
+\n\
+If distribution of executable or object code is made by offering\n\
+access to copy from a designated place, then offering equivalent\n\
+access to copy the source code from the same place counts as\n\
+distribution of the source code, even though third parties are not\n\
+compelled to copy the source along with the object code.\n\
+\n\
+  4. You may not copy, modify, sublicense, or distribute the Program\n\
+except as expressly provided under this License.  Any attempt\n\
+otherwise to copy, modify, sublicense or distribute the Program is\n\
+void, and will automatically terminate your rights under this License.\n\
+However, parties who have received copies, or rights, from you under\n\
+this License will not have their licenses terminated so long as such\n\
+parties remain in full compliance.\n\
+\n\
+  5. You are not required to accept this License, since you have not\n\
+signed it.  However, nothing else grants you permission to modify or\n\
+distribute the Program or its derivative works.  These actions are\n\
+prohibited by law if you do not accept this License.  Therefore, by\n\
+modifying or distributing the Program (or any work based on the\n'),
+  next_or_quit,
+  write('\
+Program), you indicate your acceptance of this License to do so, and\n\
+all its terms and conditions for copying, distributing or modifying\n\
+the Program or works based on it.\n\
+\n\
+  6. Each time you redistribute the Program (or any work based on the\n\
+Program), the recipient automatically receives a license from the\n\
+original licensor to copy, distribute or modify the Program subject to\n\
+these terms and conditions.  You may not impose any further\n\
+restrictions on the recipients'' exercise of the rights granted herein.\n\
+You are not responsible for enforcing compliance by third parties to\n\
+this License.\n\
+\n\
+  7. If, as a consequence of a court judgment or allegation of patent\n\
+infringement or for any other reason (not limited to patent issues),\n\
+conditions are imposed on you (whether by court order, agreement or\n\
+otherwise) that contradict the conditions of this License, they do not\n\
+excuse you from the conditions of this License.  If you cannot\n\
+distribute so as to satisfy simultaneously your obligations under this\n\
+License and any other pertinent obligations, then as a consequence you\n\
+may not distribute the Program at all.  For example, if a patent\n\
+license would not permit royalty-free redistribution of the Program by\n\
+all those who receive copies directly or indirectly through you, then\n\
+the only way you could satisfy both it and this License would be to\n'),
+  next_or_quit,
+  write('\
+refrain entirely from distribution of the Program.\n\
+\n\
+If any portion of this section is held invalid or unenforceable under\n\
+any particular circumstance, the balance of the section is intended to\n\
+apply and the section as a whole is intended to apply in other\n\
+circumstances.\n\
+\n\
+It is not the purpose of this section to induce you to infringe any\n\
+patents or other property right claims or to contest validity of any\n\
+such claims; this section has the sole purpose of protecting the\n\
+integrity of the free software distribution system, which is\n\
+implemented by public license practices.  Many people have made\n\
+generous contributions to the wide range of software distributed\n\
+through that system in reliance on consistent application of that\n\
+system; it is up to the author/donor to decide if he or she is willing\n\
+to distribute software through any other system and a licensee cannot\n\
+impose that choice.\n\
+\n\
+This section is intended to make thoroughly clear what is believed to\n\
+be a consequence of the rest of this License.\n\
+\n\
+  8. If the distribution and/or use of the Program is restricted in\n\
+certain countries either by patents or by copyrighted interfaces, the\n'),
+  next_or_quit,
+  write('\
+original copyright holder who places the Program under this License\n\
+may add an explicit geographical distribution limitation excluding\n\
+those countries, so that distribution is permitted only in or among\n\
+countries not thus excluded.  In such case, this License incorporates\n\
+the limitation as if written in the body of this License.\n\
+\n\
+  9. The Free Software Foundation may publish revised and/or new versions\n\
+of the General Public License from time to time.  Such new versions will\n\
+be similar in spirit to the present version, but may differ in detail to\n\
+address new problems or concerns.\n\
+\n\
+Each version is given a distinguishing version number.  If the Program\n\
+specifies a version number of this License which applies to it and "any\n\
+later version", you have the option of following the terms and conditions\n\
+either of that version or of any later version published by the Free\n\
+Software Foundation.  If the Program does not specify a version number of\n\
+this License, you may choose any version ever published by the Free Software\n\
+Foundation.\n\
+\n\
+  10. If you wish to incorporate parts of the Program into other free\n\
+programs whose distribution conditions are different, write to the author\n\
+to ask for permission.  For software which is copyrighted by the Free\n\
+Software Foundation, write to the Free Software Foundation; we sometimes\n'),
+  next_or_quit,
+  write('\
+make exceptions for this.  Our decision will be guided by the two goals\n\
+of preserving the free status of all derivatives of our free software and\n\
+of promoting the sharing and reuse of software generally.\n'),
+    !.
+show_copying.
+
+show_warranty :-
+  write('\
+                            NO WARRANTY\n\
+\n\
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\n\
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\n\
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\n\
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\
+REPAIR OR CORRECTION.\n\
+\n\
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\
+POSSIBILITY OF SUCH DAMAGES.\n').
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+common_main :-
+  write('\
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\n'),
+  main_loop.
diff --git a/interfaces/Prolog/tests/clpq2.pl b/interfaces/Prolog/tests/clpq2.pl
new file mode 100644
index 0000000..be5b062
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq2.pl
@@ -0,0 +1,1122 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+% Object-level clauses are stored as user_clause(Head, Body) facts.
+:- dynamic(user_clause/2).
+
+% solve_query(+Goals, +Variable_Name_Table, -Polyhedra)
+%
+% Tries to solve the query 'Goals'.
+% 'Variable_Name_Table' is a list of input variable names and
+% the corresponding variable.
+% 'Polyhedra' are the live polyhedra; the head of the list
+% represents the result of the computation.
+
+solve_query(Goals, VN, Polys_Out) :-
+  % The initial polyhedron is initialised with 0 dimensions
+  % We use the NNC topology so that we can handle strict constraints.
+  Topology = nnc,
+  ppl_new_NNC_Polyhedron_from_space_dimension(0, universe, Poly),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Poly),
+
+  % Try to reduce `Goals'.
+  solve(Topology, Goals, [Poly], Polys_Out2),
+
+  % Use the last polyhedron `Poly_Out' that has been added to the list
+  % for generating the resulting set of constraints.
+  Polys_Out2 = [Poly_Out|_],
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly_Out, Q),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Q),
+
+  % Now find and sort all the PPL dimensions for variables
+  % that occur in bindings to external variables.
+  terms_to_wanted_dims(VN, [], Num_List),
+  sort(Num_List, Sorted_Num_List),
+
+  % We want to remove (project away) all other dimensions.
+  ppl_Polyhedron_space_dimension(Q, Dims),
+  get_unwanted_dims(Sorted_Num_List, Dims, Unwanted_PPL_Vars),
+  ppl_Polyhedron_remove_space_dimensions(Q, Unwanted_PPL_Vars),
+
+  % Get the constraints.
+  ppl_Polyhedron_get_constraints(Q, CS),
+
+  % Print the result.
+  write_bindings(VN, Sorted_Num_List),
+  write_constraints(CS, Sorted_Num_List, VN),
+  Polys_Out = [Q|Polys_Out2].
+
+solve(_, true, Polys, Polys) :-
+  % If the goal is true, we can return the input list of
+  % non-empty polyhedron as output.
+  % The head of the list will contain the solution to the query.
+  !.
+
+solve(T, (A, B), Polys_In, Polys_Out) :-
+  !,
+  % Conjunction is solved using the output list of non-empty
+  % polyhedra from the first component for input to the second.
+  solve(T, A, Polys_In, Polys_Tmp),
+  solve(T, B, Polys_Tmp, Polys_Out).
+
+solve(T, (A; B), Polys_In, Polys_Out) :-
+  !,
+  % Disjunction is dealt with by making a copy of the polyhedron
+  % before starting each branch.
+  Polys_In = [Poly|_],
+  (
+    (
+      ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q),
+      % On backtracking, clean up the unwanted polyhedron
+      cleanup(Q),
+      solve(T, A, [Q|Polys_In], Polys_Out)
+    )
+  ;
+    (
+      ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Q),
+      % On backtracking, we clean up the unwanted polyhedron
+      cleanup(Q),
+      solve(T, B, [Q|Polys_In], Polys_Out)
+    )
+  ).
+
+solve(_, {}, Polys, Polys) :-
+  % If the goal is an empty set of constraints, then this is
+  % the same as for `true' and we can return the input list of
+  % non-empty polyhedron as output.
+  !.
+
+solve(_, { Constraints }, [Poly|Polys], [Poly|Polys]) :-
+  !,
+  % Solve the constraints using the constraint solver.
+  % Rename the selected clause apart and extend the polyhedron.
+  ppl_Polyhedron_space_dimension(Poly, Dims),
+
+  % Change any free variables into PPL variables.
+  term_to_PPL_term(Constraints, Dims, New_Dims),
+  Added_Dims is New_Dims - Dims,
+  ppl_Polyhedron_add_space_dimensions_and_embed(Poly, Added_Dims),
+
+  % Make the sequence of constraints into a list
+  % and check we do have constraints.
+  constraints_to_list(Constraints, Constraints_List),
+
+  ppl_Polyhedron_add_constraints(Poly, Constraints_List),
+
+  % Fail if `Poly' became empty.
+  \+ ppl_Polyhedron_is_empty(Poly).
+
+% Built-ins may be added here.
+
+% read/1
+solve(_, read(N), Polys, Polys) :-
+  !,
+  read(N),
+  get_code(user_input, _C).
+
+% write/1
+solve(_, write(Message), Polys, Polys) :-
+  !,
+  write(Message).
+
+% nl/0
+solve(_, nl, Polys, Polys) :-
+  !,
+  nl.
+
+solve(Topology, Atom, [Poly|Polys], Polys_Out) :-
+  % Here is a choicepoint: possibly different clauses
+  % will be selected on backtracking.
+  % NOTE: we may fail to find (another) clause,
+  %       but we have allocated nothing yet.
+  select_clause(Atom, Head, Body),
+  ppl_Polyhedron_space_dimension(Poly, Dims),
+
+  % Copy the current polyhedron and work on the copy.
+  ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Poly, Poly_Copy),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Poly_Copy),
+
+  % Parameter passing.
+  parameter_passing(Atom, Head, Binding_Constraints),
+
+  % Change any free variables into PPL variables.
+  terms_to_PPL_terms(Binding_Constraints, Dims, New_Dims),
+  Added_Dims is New_Dims - Dims,
+  ppl_Polyhedron_add_space_dimensions_and_embed(Poly_Copy, Added_Dims),
+
+  % First solve the parameter passing equations.
+  ppl_Polyhedron_add_constraints(Poly_Copy, Binding_Constraints),
+  \+ ppl_Polyhedron_is_empty(Poly_Copy),
+  % Then solve the body.
+  solve(Topology, Body, [Poly_Copy, Poly|Polys], Polys_Soln_Out),
+
+  % Now remove any dimensions that are higher than
+  % previously and higher than any PPL variables in the atom.
+  term_to_wanted_dims(Atom, [], Num_List),
+  Max_Wanted1 is Dims - 1,
+  max(Num_List, Max_Wanted1, Max_Wanted),
+  Un_Wanted is Max_Wanted + 1,
+
+  % Copy the current polyhedron and work on the copy.
+  Polys_Soln_Out = [Poly_Soln|_],
+  ppl_new_C_Polyhedron_from_C_Polyhedron(Poly_Soln, Poly_Soln_Copy),
+  % On backtracking, clean up the unwanted polyhedron
+  cleanup(Poly_Soln_Copy),
+
+  % We want to remove (project away) all other dimensions.
+  ppl_Polyhedron_remove_higher_space_dimensions(Poly_Soln_Copy, Un_Wanted),
+
+  % The list of live polyhedra must be returned.
+  Polys_Out = [Poly_Soln_Copy|Polys_Soln_Out].
+
+parameter_passing(Atom, Head, Bindings) :-
+  Atom =.. [_|Actuals],
+  Head =.. [_|Formals],
+  parameter_passing_terms(Actuals, Formals, Bindings).
+
+% When the direct binding exists, we use unification.
+% Otherwise, we add the constraint.
+% By only adding new variables when needed, the computation
+% is much more efficient.
+parameter_passing_terms([], [], []).
+parameter_passing_terms([A|Actuals], [F|Formals], New_Bindings) :-
+  parameter_passing_terms(Actuals, Formals, Bindings),
+  (int_expr(F) ->
+    F1 is F
+  ;
+    F1 = F
+  ),
+  (A = F1 ->
+    New_Bindings = Bindings
+  ;
+    parameter_passing_term(A, F1, Bindings, New_Bindings)
+  ).
+
+parameter_passing_term(A, F, Bindings, New_Bindings) :-
+  ((int_expr(A) ; int_expr(F) ; A = '$VAR'(_) ; F = '$VAR'(_)) ->
+    New_Bindings = [(A = F)|Bindings]
+  ;
+    A =.. [AFunct|Aargs],
+    F =.. [FFunct|Fargs],
+    (AFunct == FFunct ->
+      % Functors agree so we process the arguments.
+      parameter_passing_terms(Aargs, Fargs, Bindings1),
+      append(Bindings1, Bindings, New_Bindings)
+    ;
+      % Unification fails so we force the constraints to fail.
+      New_Bindings = [0 = 1]
+    )
+  ).
+
+select_clause(Atom, Head, Body) :-
+  functor(Atom, F, N),
+  functor(Head, F, N),
+  user_clause(Head, Body).
+
+delete_all_polyhedra([]).
+delete_all_polyhedra([Polyhedron|Polyhedra]):-
+  ppl_delete_Polyhedron(Polyhedron),
+  delete_all_polyhedra(Polyhedra).
+
+% To prevent leaks:
+% First succeed and then, on backtracking,
+% remove the unwanted polyhedron before failing.
+cleanup(_Polyhedron).
+cleanup(Polyhedron) :-
+  ppl_delete_Polyhedron(Polyhedron),
+  fail.
+
+%%%%%%%%%%%%%%%%%% Query the User for More Solutions %%%%%%%%%%%%%%%%%%%
+
+query_next_solution :-
+  write(' more? '),
+  repeat,
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 59,
+    % Get rid of the EOL character.
+    get_code(user_input, _EOL)
+  ;
+    C == 10
+  ;
+    write('Action (";" for more choices, otherwise <return>): '),
+    eat_to_eol,
+    fail
+  ),
+  !,
+  C = 10.
+
+eat_to_eol :-
+  get_code(user_input, C),
+  (C == 10 ->
+    true
+  ;
+    eat_to_eol
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%% Reading Programs %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+open_file_for_reading(File, Stream) :-
+  catch(open(File, read, Stream), _, fail).
+
+read_programs([]).
+read_programs([P|Ps]) :-
+  read_program(P),
+  read_programs(Ps).
+
+read_program(Program) :-
+  (atom(Program) ->
+    true
+  ;
+    write_error(['read_program/1 - arg 1: expected file name, found ',
+                 Program]),
+    fail
+  ),
+  (open_file_for_reading(Program, Stream) ->
+    File_Name = Program
+  ;
+    atom_concat(Program, '.clpq', File_Name),
+    (open_file_for_reading(File_Name, Stream) ->
+      true
+    ;
+      write_error(['read_program/1 - arg 1: file ',
+                   Program, ' does not exist']),
+      fail
+    )
+  ),
+  (read_clauses(Stream) ->
+    close(Stream)
+  ;
+    write_error(['read_program/1 - arg 1: syntax error reading ', Program]),
+    close(Stream),
+    fail
+  ).
+
+read_clauses(Stream) :-
+  read(Stream, Clause),
+  (Clause \== end_of_file ->
+    (Clause = (Head :- Body) ->
+      assertz(user_clause(Head, Body))
+    ;
+      assertz(user_clause(Clause, true))
+    ),
+    read_clauses(Stream)
+  ;
+    true
+  ).
+
+%%%%%%%%%%%%%%%%%%%%% The Interaction Loop %%%%%%%%%%%%%%%%%%%%%%
+
+write_error(Message) :-
+  write('clpq error: '),
+  write_error_aux(Message).
+
+write_error_aux([]) :-
+  nl.
+write_error_aux([H|T]) :-
+  write(H),
+  write_error_aux(T).
+
+main_loop :-
+  write('PPL clpq ?- '),
+  read_term(Command, [variable_names(VN)]),
+  eat_eol,
+  catch(do_command(Command, VN),
+        Exception,
+        (print_exception_term(Exception), main_loop_no)).
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  nl,
+  writeq(Exception),
+  nl.
+
+clear_program :-
+  retract(user_clause(_, _)),
+  fail.
+clear_program.
+
+list_program :-
+  user_clause(Head, Body),
+  pp(Head, Body),
+  fail.
+list_program.
+
+pp(Head, Body) :-
+  (Body == true ->
+    portray_clause(Head)
+  ;
+    portray_clause((Head :- Body))
+  ),
+  nl.
+
+do_command(end_of_file, _VN) :-
+  !.
+do_command(halt, _VN) :-
+  !,
+  clear_program.
+do_command(warranty, _VN) :-
+  !,
+  show_warranty,
+  main_loop_yes.
+do_command(copying, _VN) :-
+  !,
+  show_copying,
+  main_loop_yes.
+do_command(trace, _VN) :-
+  !,
+  trace,
+  main_loop_yes.
+do_command(notrace, _VN) :-
+  !,
+  notrace,
+  main_loop_yes.
+do_command(debug, _VN) :-
+  !,
+  debug,
+  main_loop_yes.
+do_command(nodebug, _VN) :-
+  !,
+  nodebug,
+  main_loop_yes.
+do_command(spy(Spec), _VN) :-
+  !,
+  spy(Spec),
+  main_loop_yes.
+do_command(nospy(Spec), _VN) :-
+  !,
+  nospy(Spec),
+  main_loop_yes.
+do_command(nospyall, _VN) :-
+  !,
+  nospyall,
+  main_loop_yes.
+do_command([], _VN) :-
+  !,
+  (read_programs([]) ; true),
+  main_loop_yes.
+do_command([H|T], _VN) :-
+  !,
+  (read_programs([H|T]); true),
+  main_loop_yes.
+do_command(consult(Program), _VN) :-
+  !,
+  (read_program(Program) ; true),
+  main_loop_yes.
+do_command(reconsult(Program), VN) :-
+  !,
+  clear_program,
+  do_command(consult(Program), VN).
+do_command(listing, _VN) :-
+  !,
+  list_program,
+  main_loop_yes.
+do_command(statistics, _VN) :-
+  !,
+  statistics,
+  main_loop_yes.
+
+do_command(Query, VN) :-
+  solve_query(Query, VN, Polys_Out),
+  % See if the user wants to look for more solutions.
+  query_next_solution,
+  % When finished, remove remaining polyhedra.
+  delete_all_polyhedra(Polys_Out),
+  main_loop_yes.
+
+do_command(_, _VN) :-
+  main_loop_no.
+
+main_loop_no :-
+  write(no),
+  nl,
+  main_loop.
+
+main_loop_yes :-
+  write(yes),
+  nl,
+  main_loop.
+
+%%%%%%%%%%%%%%%%% Writing Computed Answer Constraints %%%%%%%%%%%%%%%%%%
+
+write_var('$VAR'(N), _Name_List) :-
+  write('_'),
+  write('$VAR'(N)).
+
+negate_expr(Num*Var, Neg_Expr) :-
+  (Num < 0 ->
+    Neg_Num is -Num,
+    Neg_Expr = Neg_Num*Var
+  ;
+    Neg_Expr = Num*Var
+  ).
+negate_expr(Expr1 + Expr2, Neg_Expr1 + Neg_Expr2) :-
+  negate_expr(Expr1, Neg_Expr1),
+  negate_expr(Expr2, Neg_Expr2).
+
+write_expr('$VAR'(N), Var_List, VN) :-
+  !,
+  position2element(N, Var_List, M),
+  (member((A = '$VAR'(M)), VN) ->
+    write(A)
+  ;
+    write('_'),
+    write('$VAR'(N))
+  ).
+write_expr(Num*Var, Variable_Names, VN) :-
+  (Num =:= 1 ->
+    true
+  ;
+    (Num =:= -1 ->
+      write('-')
+    ;
+      write(Num),
+      write('*')
+    )
+  ),
+  write_expr(Var, Variable_Names, VN).
+write_expr(E + Num*Var, Variable_Names, VN) :-
+  write_expr(E, Variable_Names, VN),
+  (Num < 0 ->
+    write(' - '),
+    Neg_Num is -Num,
+    write_expr(Neg_Num*Var, Variable_Names, VN)
+  ;
+    write(' + '),
+    write_expr(Num*Var, Variable_Names, VN)
+  ).
+
+write_constraint(Expr = Num, Variable_Names, VN) :-
+  (var(Num) ->
+    fail
+  ;
+    write_expr(Expr, Variable_Names, VN),
+    write(' = '),
+    (integer(Num) ->
+      write(Num)
+    ;
+      Num = rat(Int, 1),
+      write(Int)
+    )
+  ).
+write_constraint(Expr >= Num, Variable_Names, VN) :-
+  (Num < 0 ->
+    negate_expr(Expr, Neg_Expr),
+    write_expr(Neg_Expr, Variable_Names, VN),
+    write(' =< '),
+      Neg_Num is -Num,
+    write(Neg_Num)
+  ;
+    write_expr(Expr, Variable_Names, VN),
+    write(' >= '),
+    write(Num)
+  ).
+write_constraint(Expr > Num, Variable_Names, VN) :-
+  (Num < 0 ->
+    negate_expr(Expr, Neg_Expr),
+    write_expr(Neg_Expr, Variable_Names, VN),
+    write(' < '),
+    Neg_Num is -Num,
+    write(Neg_Num)
+  ;
+    write_expr(Expr, Variable_Names, VN),
+    write(' > '),
+    write(Num)
+  ).
+
+write_constraints([], _Variable_Names, _VN).
+write_constraints([C|CS], Variable_Names, VN) :-
+  (write_constraint(C, Variable_Names, VN) ->
+    nl
+  ;
+    true
+  ),
+  write_constraints(CS, Variable_Names, VN).
+
+write_bindings([], _Var_List).
+write_bindings([(A = Term)|VN], Var_List) :-
+  (var(Term) ->
+    (write(A), write(' = '), write(Term),
+    nl)
+  ;
+    (Term = '$VAR'(_) ->
+      true
+    ;
+      (write(A),
+      write(' = '),
+      write_termexpr(Term, Var_List),
+      nl)
+    )
+  ),
+  write_bindings(VN, Var_List).
+
+write_termexpr('$VAR'(N), Var_List) :-
+  !,
+  element2position(N, Var_List, M),
+  write('_'),
+  write('$VAR'(M)).
+write_termexpr(Term, _Var_List) :-
+  int_expr(Term),
+  !,
+  % FIXME: restore the original `N is Term' as soon as XSB is fixed.
+  % See http://www.cs.unipr.it/pipermail/ppl-devel/2007-September/011126.html
+  call(N is Term),
+  write(N).
+write_termexpr(Term, Var_List) :-
+  Term = [_|_],
+  !,
+  write('['),
+  write_listexprs(Term, Var_List),
+  write(']').
+write_termexpr(Term, Var_List) :-
+  Term =.. [F|Args],
+  (Args = [] ->
+    write(F)
+  ;
+    write(F),
+    write('('),
+    write_termexprs(Args, Var_List),
+    write(')')
+  ).
+write_termexprs([], _Var_List).
+write_termexprs([Term|Terms], Var_List) :-
+  write_termexpr(Term, Var_List),
+  (Terms \= [] ->
+    write(',')
+  ;
+    true
+  ),
+  write_termexprs(Terms, Var_List).
+
+write_listexprs(Terms, _Var_List) :-
+  var(Terms),
+  !,
+  write('|'),
+  write(Terms).
+write_listexprs([], _Var_List) :-
+  !.
+write_listexprs([Term|Terms], Var_List) :-
+  write_termexpr(Term, Var_List),
+  ((Terms == []; var(Terms)) ->
+    true
+  ;
+    write(',')
+  ),
+  write_listexprs(Terms, Var_List).
+
+int_expr(I) :-
+  nonvar(I),
+  int_expr_aux(I).
+int_expr_aux(I) :-
+  integer(I),
+  !.
+int_expr_aux(I+J) :-
+  !,
+  int_expr(I),
+  int_expr(J).
+int_expr_aux(I-J) :-
+  !,
+  int_expr(I),
+  int_expr(J).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% Utility Predicates %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% term_to_wanted_dims(?Term, -List_of_Integers)
+%
+% Takes a term and returns list of numbers in the PPL variables
+% of the form '$VAR'(k).
+
+term_to_wanted_dims(V, Ns, Ns) :-
+  var(V),
+  !.
+term_to_wanted_dims('$VAR'(N), Ns, [N|Ns]) :-
+  !.
+term_to_wanted_dims(Term, Ns_In, Ns_Out) :-
+  Term =.. [_F|Args],
+  terms_to_wanted_dims(Args, Ns_In, Ns_Out).
+
+terms_to_wanted_dims([], Ns, Ns).
+terms_to_wanted_dims([Arg|Args], Ns_In, Ns_Out) :-
+  term_to_wanted_dims(Arg, Ns_In, Ns1),
+  terms_to_wanted_dims(Args, Ns1, Ns_Out).
+
+constraints_to_list(C, LC) :-
+  constraints_to_list(C, [], LC).
+
+constraints_to_list((A, B), Rest, LC) :-
+  !,
+  constraints_to_list(B, Rest, BRest),
+  constraints_to_list(A, BRest, LC).
+constraints_to_list(C, Rest, Rest1) :-
+  (check_constraint(C) ->
+    Rest1 = [C|Rest]
+  ;
+    Rest1 = [0 = 1]
+  ).
+
+
+% term_to_PPL_term(?Term, +In_N, ?Out_N)
+%
+% Unifies each of the variables in Term with the special terms
+% '$VAR'(k), where k ranges from In_N to Out_N-1.
+
+term_to_PPL_term('$VAR'(In_N), In_N, Out_N) :-
+  !,
+  Out_N is In_N + 1.
+term_to_PPL_term(Term, In_N, Out_N) :-
+  Term =.. [_|Args],
+  terms_to_PPL_terms(Args, In_N, Out_N).
+
+terms_to_PPL_terms([], In_N, In_N).
+terms_to_PPL_terms([Arg|Args], In_N, Out_N) :-
+  term_to_PPL_term(Arg, In_N, Tmp_N),
+  terms_to_PPL_terms(Args, Tmp_N, Out_N).
+
+build_equality_constraints([], []).
+build_equality_constraints([Var = Num|Eqs], All_Eq_Constrs) :-
+  build_equality_constraints(Eqs, Eq_Constrs),
+  (nonvar(Num) ->
+    Num = rat(Int, 1),
+    All_Eq_Constrs = [Var = Int|Eq_Constrs]
+  ;
+    All_Eq_Constrs = Eq_Constrs
+  ).
+
+check_expr('$VAR'(_)).
+check_expr(Num) :-
+  integer(Num).
+check_expr(Num*Var) :-
+  integer(Num),
+  check_expr(Var).
+check_expr(Var*Num) :-
+  integer(Num),
+  check_expr(Var).
+check_expr(E + F) :-
+  check_expr(E),
+  check_expr(F).
+check_expr(E - F) :-
+  check_expr(E),
+  check_expr(F).
+
+check_constraint(Expr = Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr >= Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr > Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr =< Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+check_constraint(Expr < Expr1) :-
+  check_expr(Expr),
+  check_expr(Expr1).
+
+get_unwanted_dims(Wanted, D, Unwanted) :-
+  get_unwanted_dims(Wanted, 0, D, Unwanted).
+
+get_unwanted_dims(_, S, D, []) :-
+  S >= D,
+  !.
+get_unwanted_dims(Wanted, S, D, Unwanted) :-
+  S1 is S + 1,
+  get_unwanted_dims(Wanted, S1, D, Unwanted1),
+  (member(S, Wanted) ->
+    Unwanted = Unwanted1
+  ;
+    Unwanted = ['$VAR'(S)|Unwanted1]
+  ).
+
+element2position(N, Ns, I) :-
+  element2position(N, Ns, 0, I).
+element2position(N, [N|_], I, I) :-
+  !.
+element2position(N, [_M|Ns], Iin, Iout) :-
+  I1 is Iin + 1,
+  element2position(N, Ns, I1, Iout).
+
+position2element(0, [N|_], N) :-
+  !.
+position2element(I, [_M|Ns], N) :-
+  I1 is I - 1,
+  position2element(I1, Ns, N).
+
+max([], M, M) :- !.
+max([L|Ls], M, Max) :-
+  L =< M,
+  !,
+  max(Ls, M, Max).
+max([L|Ls], M, Max) :-
+  L > M,
+  max(Ls, L, Max).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Legalese %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+next_or_quit :-
+  write('---Type <return> to continue, or q <return> to quit---'),
+  flush_output(user_output),
+  get_code(user_input, C),
+  (
+    C == 10
+  ;
+    eat_eol
+  ),
+  !,
+  C \== 113.
+
+show_copying :-
+  eat_eol,
+  write('\
+                    GNU GENERAL PUBLIC LICENSE\n\
+                       Version 2, June 1991\n\
+\n\
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n\
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n\
+ Everyone is permitted to copy and distribute verbatim copies\n\
+ of this license document, but changing it is not allowed.\n\
+\n\
+                            Preamble\n\
+\n\
+  The licenses for most software are designed to take away your\n\
+freedom to share and change it.  By contrast, the GNU General Public\n\
+License is intended to guarantee your freedom to share and change free\n\
+software--to make sure the software is free for all its users.  This\n\
+General Public License applies to most of the Free Software\n\
+Foundation''s software and to any other program whose authors commit to\n\
+using it.  (Some other Free Software Foundation software is covered by\n\
+the GNU Library General Public License instead.)  You can apply it to\n\
+your programs, too.\n\
+\n\
+  When we speak of free software, we are referring to freedom, not\n\
+price.  Our General Public Licenses are designed to make sure that you\n\
+have the freedom to distribute copies of free software (and charge for\n'),
+  next_or_quit,
+  write('\
+this service if you wish), that you receive source code or can get it\n\
+if you want it, that you can change the software or use pieces of it\n\
+in new free programs; and that you know you can do these things.\n\
+\n\
+  To protect your rights, we need to make restrictions that forbid\n\
+anyone to deny you these rights or to ask you to surrender the rights.\n\
+These restrictions translate to certain responsibilities for you if you\n\
+distribute copies of the software, or if you modify it.\n\
+\n\
+  For example, if you distribute copies of such a program, whether\n\
+gratis or for a fee, you must give the recipients all the rights that\n\
+you have.  You must make sure that they, too, receive or can get the\n\
+source code.  And you must show them these terms so they know their\n\
+rights.\n\
+\n\
+  We protect your rights with two steps: (1) copyright the software, and\n\
+(2) offer you this license which gives you legal permission to copy,\n\
+distribute and/or modify the software.\n\
+\n\
+  Also, for each author''s protection and ours, we want to make certain\n\
+that everyone understands that there is no warranty for this free\n\
+software.  If the software is modified by someone else and passed on, we\n\
+want its recipients to know that what they have is not the original, so\n'),
+  next_or_quit,
+  write('\
+that any problems introduced by others will not reflect on the original\n\
+authors'' reputations.\n\
+\n\
+  Finally, any free program is threatened constantly by software\n\
+patents.  We wish to avoid the danger that redistributors of a free\n\
+program will individually obtain patent licenses, in effect making the\n\
+program proprietary.  To prevent this, we have made it clear that any\n\
+patent must be licensed for everyone''s free use or not licensed at all.\n\
+\n\
+  The precise terms and conditions for copying, distribution and\n\
+modification follow.\n\
+\n\
+                    GNU GENERAL PUBLIC LICENSE\n\
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\
+\n\
+  0. This License applies to any program or other work which contains\n\
+a notice placed by the copyright holder saying it may be distributed\n\
+under the terms of this General Public License.  The "Program", below,\n\
+refers to any such program or work, and a "work based on the Program"\n\
+means either the Program or any derivative work under copyright law:\n\
+that is to say, a work containing the Program or a portion of it,\n\
+either verbatim or with modifications and/or translated into another\n\
+language.  (Hereinafter, translation is included without limitation in\n'),
+  next_or_quit,
+  write('\
+the term "modification".)  Each licensee is addressed as "you".\n\
+\n\
+Activities other than copying, distribution and modification are not\n\
+covered by this License; they are outside its scope.  The act of\n\
+running the Program is not restricted, and the output from the Program\n\
+is covered only if its contents constitute a work based on the\n\
+Program (independent of having been made by running the Program).\n\
+Whether that is true depends on what the Program does.\n\
+\n\
+  1. You may copy and distribute verbatim copies of the Program''s\n\
+source code as you receive it, in any medium, provided that you\n\
+conspicuously and appropriately publish on each copy an appropriate\n\
+copyright notice and disclaimer of warranty; keep intact all the\n\
+notices that refer to this License and to the absence of any warranty;\n\
+and give any other recipients of the Program a copy of this License\n\
+along with the Program.\n\
+\n\
+You may charge a fee for the physical act of transferring a copy, and\n\
+you may at your option offer warranty protection in exchange for a fee.\n\
+\n\
+  2. You may modify your copy or copies of the Program or any portion\n\
+of it, thus forming a work based on the Program, and copy and\n\
+distribute such modifications or work under the terms of Section 1\n'),
+  next_or_quit,
+  write('\
+above, provided that you also meet all of these conditions:\n\
+\n\
+    a) You must cause the modified files to carry prominent notices\n\
+    stating that you changed the files and the date of any change.\n\
+\n\
+    b) You must cause any work that you distribute or publish, that in\n\
+    whole or in part contains or is derived from the Program or any\n\
+    part thereof, to be licensed as a whole at no charge to all third\n\
+    parties under the terms of this License.\n\
+\n\
+    c) If the modified program normally reads commands interactively\n\
+    when run, you must cause it, when started running for such\n\
+    interactive use in the most ordinary way, to print or display an\n\
+    announcement including an appropriate copyright notice and a\n\
+    notice that there is no warranty (or else, saying that you provide\n\
+    a warranty) and that users may redistribute the program under\n\
+    these conditions, and telling the user how to view a copy of this\n\
+    License.  (Exception: if the Program itself is interactive but\n\
+    does not normally print such an announcement, your work based on\n\
+    the Program is not required to print an announcement.)\n\
+\n\
+These requirements apply to the modified work as a whole.  If\n\
+identifiable sections of that work are not derived from the Program,\n'),
+  next_or_quit,
+  write('\
+and can be reasonably considered independent and separate works in\n\
+themselves, then this License, and its terms, do not apply to those\n\
+sections when you distribute them as separate works.  But when you\n\
+distribute the same sections as part of a whole which is a work based\n\
+on the Program, the distribution of the whole must be on the terms of\n\
+this License, whose permissions for other licensees extend to the\n\
+entire whole, and thus to each and every part regardless of who wrote it.\n\
+\n\
+Thus, it is not the intent of this section to claim rights or contest\n\
+your rights to work written entirely by you; rather, the intent is to\n\
+exercise the right to control the distribution of derivative or\n\
+collective works based on the Program.\n\
+\n\
+In addition, mere aggregation of another work not based on the Program\n\
+with the Program (or with a work based on the Program) on a volume of\n\
+a storage or distribution medium does not bring the other work under\n\
+the scope of this License.\n\
+\n\
+  3. You may copy and distribute the Program (or a work based on it,\n\
+under Section 2) in object code or executable form under the terms of\n\
+Sections 1 and 2 above provided that you also do one of the following:\n\
+\n\
+    a) Accompany it with the complete corresponding machine-readable\n'),
+  next_or_quit,
+  write('\
+    source code, which must be distributed under the terms of Sections\n\
+    1 and 2 above on a medium customarily used for software interchange; or,\n\
+\n\
+    b) Accompany it with a written offer, valid for at least three\n\
+    years, to give any third party, for a charge no more than your\n\
+    cost of physically performing source distribution, a complete\n\
+    machine-readable copy of the corresponding source code, to be\n\
+    distributed under the terms of Sections 1 and 2 above on a medium\n\
+    customarily used for software interchange; or,\n\
+\n\
+    c) Accompany it with the information you received as to the offer\n\
+    to distribute corresponding source code.  (This alternative is\n\
+    allowed only for noncommercial distribution and only if you\n\
+    received the program in object code or executable form with such\n\
+    an offer, in accord with Subsection b above.)\n\
+\n\
+The source code for a work means the preferred form of the work for\n\
+making modifications to it.  For an executable work, complete source\n\
+code means all the source code for all modules it contains, plus any\n\
+associated interface definition files, plus the scripts used to\n\
+control compilation and installation of the executable.  However, as a\n\
+special exception, the source code distributed need not include\n\
+anything that is normally distributed (in either source or binary\n'),
+  next_or_quit,
+  write('\
+form) with the major components (compiler, kernel, and so on) of the\n\
+operating system on which the executable runs, unless that component\n\
+itself accompanies the executable.\n\
+\n\
+If distribution of executable or object code is made by offering\n\
+access to copy from a designated place, then offering equivalent\n\
+access to copy the source code from the same place counts as\n\
+distribution of the source code, even though third parties are not\n\
+compelled to copy the source along with the object code.\n\
+\n\
+  4. You may not copy, modify, sublicense, or distribute the Program\n\
+except as expressly provided under this License.  Any attempt\n\
+otherwise to copy, modify, sublicense or distribute the Program is\n\
+void, and will automatically terminate your rights under this License.\n\
+However, parties who have received copies, or rights, from you under\n\
+this License will not have their licenses terminated so long as such\n\
+parties remain in full compliance.\n\
+\n\
+  5. You are not required to accept this License, since you have not\n\
+signed it.  However, nothing else grants you permission to modify or\n\
+distribute the Program or its derivative works.  These actions are\n\
+prohibited by law if you do not accept this License.  Therefore, by\n\
+modifying or distributing the Program (or any work based on the\n'),
+  next_or_quit,
+  write('\
+Program), you indicate your acceptance of this License to do so, and\n\
+all its terms and conditions for copying, distributing or modifying\n\
+the Program or works based on it.\n\
+\n\
+  6. Each time you redistribute the Program (or any work based on the\n\
+Program), the recipient automatically receives a license from the\n\
+original licensor to copy, distribute or modify the Program subject to\n\
+these terms and conditions.  You may not impose any further\n\
+restrictions on the recipients'' exercise of the rights granted herein.\n\
+You are not responsible for enforcing compliance by third parties to\n\
+this License.\n\
+\n\
+  7. If, as a consequence of a court judgment or allegation of patent\n\
+infringement or for any other reason (not limited to patent issues),\n\
+conditions are imposed on you (whether by court order, agreement or\n\
+otherwise) that contradict the conditions of this License, they do not\n\
+excuse you from the conditions of this License.  If you cannot\n\
+distribute so as to satisfy simultaneously your obligations under this\n\
+License and any other pertinent obligations, then as a consequence you\n\
+may not distribute the Program at all.  For example, if a patent\n\
+license would not permit royalty-free redistribution of the Program by\n\
+all those who receive copies directly or indirectly through you, then\n\
+the only way you could satisfy both it and this License would be to\n'),
+  next_or_quit,
+  write('\
+refrain entirely from distribution of the Program.\n\
+\n\
+If any portion of this section is held invalid or unenforceable under\n\
+any particular circumstance, the balance of the section is intended to\n\
+apply and the section as a whole is intended to apply in other\n\
+circumstances.\n\
+\n\
+It is not the purpose of this section to induce you to infringe any\n\
+patents or other property right claims or to contest validity of any\n\
+such claims; this section has the sole purpose of protecting the\n\
+integrity of the free software distribution system, which is\n\
+implemented by public license practices.  Many people have made\n\
+generous contributions to the wide range of software distributed\n\
+through that system in reliance on consistent application of that\n\
+system; it is up to the author/donor to decide if he or she is willing\n\
+to distribute software through any other system and a licensee cannot\n\
+impose that choice.\n\
+\n\
+This section is intended to make thoroughly clear what is believed to\n\
+be a consequence of the rest of this License.\n\
+\n\
+  8. If the distribution and/or use of the Program is restricted in\n\
+certain countries either by patents or by copyrighted interfaces, the\n'),
+  next_or_quit,
+  write('\
+original copyright holder who places the Program under this License\n\
+may add an explicit geographical distribution limitation excluding\n\
+those countries, so that distribution is permitted only in or among\n\
+countries not thus excluded.  In such case, this License incorporates\n\
+the limitation as if written in the body of this License.\n\
+\n\
+  9. The Free Software Foundation may publish revised and/or new versions\n\
+of the General Public License from time to time.  Such new versions will\n\
+be similar in spirit to the present version, but may differ in detail to\n\
+address new problems or concerns.\n\
+\n\
+Each version is given a distinguishing version number.  If the Program\n\
+specifies a version number of this License which applies to it and "any\n\
+later version", you have the option of following the terms and conditions\n\
+either of that version or of any later version published by the Free\n\
+Software Foundation.  If the Program does not specify a version number of\n\
+this License, you may choose any version ever published by the Free Software\n\
+Foundation.\n\
+\n\
+  10. If you wish to incorporate parts of the Program into other free\n\
+programs whose distribution conditions are different, write to the author\n\
+to ask for permission.  For software which is copyrighted by the Free\n\
+Software Foundation, write to the Free Software Foundation; we sometimes\n'),
+  next_or_quit,
+  write('\
+make exceptions for this.  Our decision will be guided by the two goals\n\
+of preserving the free status of all derivatives of our free software and\n\
+of promoting the sharing and reuse of software generally.\n'),
+    !.
+show_copying.
+
+show_warranty :-
+  write('\
+                            NO WARRANTY\n\
+\n\
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n\
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\n\
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n\
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n\
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\n\
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\n\
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n\
+REPAIR OR CORRECTION.\n\
+\n\
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n\
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n\
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n\
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n\
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n\
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n\
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n\
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n\
+POSSIBILITY OF SUCH DAMAGES.\n').
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+common_main :-
+  write('\
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>\n\
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)\n\
+this program is free software, covered by the GNU General Public License,\n\
+and you are welcome to change it and/or distribute copies of it\n\
+under certain conditions.\n\
+Type "copying" to see the conditions.\n\
+There is ABSOLUTELY NO WARRANTY for this program.\n\
+Type "warranty" for details.\n'),
+  main_loop.
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16 b/interfaces/Prolog/tests/expected_clpq2_int16
new file mode 100644
index 0000000..e9a54c1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16
@@ -0,0 +1,103 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
diff --git a/interfaces/Prolog/tests/expected_clpq2_int16_a b/interfaces/Prolog/tests/expected_clpq2_int16_a
new file mode 100644
index 0000000..f6ffe89
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16_a
@@ -0,0 +1,104 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32 b/interfaces/Prolog/tests/expected_clpq2_int32
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32_a b/interfaces/Prolog/tests/expected_clpq2_int32_a
new file mode 100644
index 0000000..8342abe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32_a
@@ -0,0 +1,103 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64 b/interfaces/Prolog/tests/expected_clpq2_int64
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int64_a b/interfaces/Prolog/tests/expected_clpq2_int64_a
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64_a
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8 b/interfaces/Prolog/tests/expected_clpq2_int8
new file mode 100644
index 0000000..58a46aa
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8_a b/interfaces/Prolog/tests/expected_clpq2_int8_a
new file mode 100644
index 0000000..58a46aa
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8_a
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz b/interfaces/Prolog/tests/expected_clpq2_mpz
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz_a b/interfaces/Prolog/tests/expected_clpq2_mpz_a
new file mode 100644
index 0000000..fe5dbcc
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz_a
@@ -0,0 +1,110 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 13
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Z - Y = 1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- E >= 0
+Y =< 9
+-E + Y >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X =< 5
+X > 4
+ more? X < 2
+X > 1
+ more? no
+PPL clpq ?- X =< 205
+X > 110
+ more? X < 35
+X > 28
+ more? no
+PPL clpq ?- -D2 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S + S2 >= 0
+S + D - S2 - D3 >= 0
+-S + S1 >= 0
+ more? -D3 > 0
+-S1 - D1 + S2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S + S2 >= 0
+S + D - S2 - D2 >= 0
+-S + S1 >= 0
+ more? S + D - S2 - D2 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+-D2 > 0
+ more? -D3 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D3 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D3 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+ more? -D2 > 0
+-S + S2 >= 0
+-S + S1 >= 0
+S1 - S2 - D2 > 0
+S - S1 - D1 + D >= 0
+S + D - S2 - D2 >= 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D3 >= 0
+ more? S + D - S2 - D3 >= 0
+-S + S1 >= 0
+S - S1 - D1 + D >= 0
+-S + S2 >= 0
+S1 - S2 - D2 > 0
+-S1 - D1 + S2 > 0
+S + D - S2 - D2 >= 0
+-D3 > 0
+ more? S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D2 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S - S1 - D1 + D >= 0
+ more? S1 - S2 - D3 > 0
+S + D - S2 - D3 >= 0
+S + D - S2 - D2 >= 0
+S1 - S2 - D2 > 0
+-D3 > 0
+-S + S1 >= 0
+-S + S2 >= 0
+S - S1 - D1 + D >= 0
+ more? no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int16 b/interfaces/Prolog/tests/expected_clpq_int16
new file mode 100644
index 0000000..1c4f9a1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int16_a b/interfaces/Prolog/tests/expected_clpq_int16_a
new file mode 100644
index 0000000..1c4f9a1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Negative overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- R = 45
+O = 9
+M = 45
+D = 9
+N = 55
+E = 10
+S = 10
+Y = 8
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int32 b/interfaces/Prolog/tests/expected_clpq_int32
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int32_a b/interfaces/Prolog/tests/expected_clpq_int32_a
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int64 b/interfaces/Prolog/tests/expected_clpq_int64
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int64_a b/interfaces/Prolog/tests/expected_clpq_int64_a
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int8 b/interfaces/Prolog/tests/expected_clpq_int8
new file mode 100644
index 0000000..d3a38b7
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8
@@ -0,0 +1,30 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_int8_a b/interfaces/Prolog/tests/expected_clpq_int8_a
new file mode 100644
index 0000000..d3a38b7
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8_a
@@ -0,0 +1,30 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- yes
+PPL clpq ?- 
+Error: an overflow has been detected by the PPL: Positive overflow.
+no
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz b/interfaces/Prolog/tests/expected_clpq_mpz
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq_mpz_a b/interfaces/Prolog/tests/expected_clpq_mpz_a
new file mode 100644
index 0000000..4f4a21c
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz_a
@@ -0,0 +1,36 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+this program is free software, covered by the GNU General Public License,
+and you are welcome to change it and/or distribute copies of it
+under certain conditions.
+Type "copying" to see the conditions.
+There is ABSOLUTELY NO WARRANTY for this program.
+Type "warranty" for details.
+PPL clpq ?- yes
+PPL clpq ?- Z = 5
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 0
+Y - Z = -1
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 102
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y = 8
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- Y =< 9
+-E + Y >= 0
+E >= 0
+M = 1
+E + D - Y = 0
+E - N = 0
+O = 0
+S = 9
+R = 0
+ more? yes
+PPL clpq ?- yes
+PPL clpq ?- X = 10
+ more? yes
+PPL clpq ?- 
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_pchk_int16 b/interfaces/Prolog/tests/expected_pchk_int16
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int16_a b/interfaces/Prolog/tests/expected_pchk_int16_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32 b/interfaces/Prolog/tests/expected_pchk_int32
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32_a b/interfaces/Prolog/tests/expected_pchk_int32_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int64 b/interfaces/Prolog/tests/expected_pchk_int64
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int64_a b/interfaces/Prolog/tests/expected_pchk_int64_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8 b/interfaces/Prolog/tests/expected_pchk_int8
new file mode 100644
index 0000000..c1a4555
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8
@@ -0,0 +1,7 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8_a b/interfaces/Prolog/tests/expected_pchk_int8_a
new file mode 100644
index 0000000..c1a4555
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8_a
@@ -0,0 +1,7 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_mpz b/interfaces/Prolog/tests/expected_pchk_mpz
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_mpz
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_mpz_a b/interfaces/Prolog/tests/expected_pchk_mpz_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_mpz_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/expected_pgt b/interfaces/Prolog/tests/expected_pgt
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pgt
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/tests/fib.clpq b/interfaces/Prolog/tests/fib.clpq
new file mode 100644
index 0000000..8858d5f
--- /dev/null
+++ b/interfaces/Prolog/tests/fib.clpq
@@ -0,0 +1,6 @@
+fib(X, Y) :-
+  { X >= 0, X =< 1, Y = 1 }.
+fib(X, Y) :-
+  { X >= 2, Xm1 = X-1, Xm2 = X-2, Y = Y1+Y2 },
+  fib(Xm1, Y1),
+  fib(Xm2, Y2).
diff --git a/interfaces/Prolog/tests/mc91.clpq b/interfaces/Prolog/tests/mc91.clpq
new file mode 100644
index 0000000..6827c58
--- /dev/null
+++ b/interfaces/Prolog/tests/mc91.clpq
@@ -0,0 +1,6 @@
+mc(N, M) :-
+    { N >= 101, M = N-10 }.
+mc(N, M) :-
+    { N =< 100, T = N+11 },
+    mc(T, U),
+    mc(U, M).
diff --git a/interfaces/Prolog/tests/pl_check.pl b/interfaces/Prolog/tests/pl_check.pl
new file mode 100644
index 0000000..6f1cd84
--- /dev/null
+++ b/interfaces/Prolog/tests/pl_check.pl
@@ -0,0 +1,3610 @@
+/* Various tests on the Prolog interface.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+% noisy(F)
+% When F = 1, a message is displayed if a time out occurs
+% when running the `timeout'` predicate.
+% Also, the values of the PPL versions and banner are displayed.
+% When F = 0, no 'time out' message or versions are displayed.
+% When F = 2, if a test fails and the backtracking returns to a polyhedron
+% constructor, the caught error will cause the constraint and generator systems
+% for the polyhedron to be displayed.
+% noisy/1 can be reset by calling make_noisy/0 or make_quiet/0.
+
+:- dynamic(noisy/1).
+
+% check_all/0
+% This executes all the test predicates which, together, check all
+% the ppl interface predicates.
+
+check_all :-
+   (noisy(_) -> true ; make_quiet),
+   list_groups(Groups),
+   catch(run_all(Groups), Exception,
+         (print_exception_term(Exception), fail)).
+
+% check_quiet/0
+% This also executes all the test predicates with no output.
+
+check_quiet :-
+   make_quiet,
+   check_all.
+
+% check_noisy/0
+% check_extra_noisy/0
+%
+% These also execute all the test predicates but also outputs
+% information including the banner, version numbers and expected
+% output from the exception tests.
+
+check_noisy :-
+   make_noisy,
+   check_all.
+
+check_extra_noisy :-
+   make_extra_noisy,
+   check_all.
+
+% run_all/1
+% This executes all the given list of tests, catching any exceptions.
+% If any test fails then an error message is output and then it fails.
+
+run_all([Group|Groups]):-
+   ppl_initialize,
+   (catch(run_one(Group), Exception, run_exception(Group, Exception)) ->
+       ppl_finalize,
+       run_all(Groups)
+   ;
+       run_fail(Group)
+   ).
+run_all([]).
+
+% run_fail/1
+% This is used when a test in run_all/1 fails.
+% A message is output saying which group of tests has failed;
+% then it finalizes the ppl and fails.
+
+run_fail(Group) :-
+   group_predicates(Group, Predicates),
+   prolog_system(System),
+   error_message(['Error occurred while performing test', Group,
+                  'which checks predicates:', Predicates]),
+   error_message(['Prolog interface checks failed on', System,
+                  'Prolog.']),
+   ppl_finalize,
+   fail.
+
+% run_exception/2
+% This is used when a test in run_all/1 causes an exception to be thrown.
+% A message is output saying which group of tests was being run when
+% the exception was thrown and then it fails.
+
+run_exception(Group, Exception) :-
+        group_predicates(Group, Predicates),
+        (Exception = ppl_overflow_error(_) ->
+            Kind = 'Overflow exception'
+        ;
+            Kind = 'Exception'
+        ),
+        prolog_system(System),
+        display_message([Kind, 'occurred while performing test ', Group,
+                        'which checks predicates ', nl, Predicates]),
+        display_message(['Prolog interface checks failed on', System,
+                  'Prolog.']),
+        print_exception_term(Exception),
+        % Do fail for all but overflow exceptions.
+        Exception = ppl_overflow_error(_).
+
+% run_one/1
+% Runs the named group of tests.
+
+% Tests predicates that return PPL version information and the PPL banner.
+% If noisy(0) holds, there is no output but if not,
+% all the versions are printed and the banner is pretty printed.
+run_one(all_versions_and_banner) :-
+  \+ ppl_version_major(-1),
+  ppl_version_major(Vmajor),
+  ppl_version_minor(Vminor),
+  ppl_version_revision(Vrevision),
+  ppl_version_beta(Vbeta),
+  ppl_version(V),
+  ppl_banner(B),
+  (noisy(0) -> true ;
+     (
+      nl,
+      write('Version major is '), write(Vmajor), nl,
+      write('Version minor is '), write(Vminor), nl,
+      write('Version revision is '), write(Vrevision), nl,
+      write('Version beta is '), write(Vbeta), nl,
+      write('Version is '), write(V), nl,
+      banner_pp(B), nl
+     )
+  ).
+
+% Tests predicates that return the maximum allowed dimension and coefficients.
+% If noisy(0) holds, there is no output but if not, the maximums/minimums
+% are printed.
+run_one(numeric_bounds) :-
+  max_dimension,
+  coefficient_bounds,
+  set_restore_rounding,
+  set_restore_irrational_precision.
+
+run_one(new_polyhedron_from_dimension) :-
+  new_polyhedron_from_dim.
+
+run_one(new_polyhedron_from_polyhedron) :-
+  new_polyhedron_from_polyhedron.
+
+run_one(new_polyhedron_from_representations) :-
+  new_polyhedron_from_cons,
+  new_polyhedron_from_gens.
+
+run_one(swap_polyhedra) :-
+  swap.
+
+run_one(polyhedron_dimension) :-
+   space,
+   affine_dim,
+   constrains,
+   unconstrain_space_dimension,
+   unconstrain_space_dimensions.
+
+run_one(basic_operators) :-
+   inters_assign,
+   polyhull_assign,
+   polydiff_assign,
+   time_elapse,
+   top_close_assign.
+
+run_one(add_to_system) :-
+   add_con,
+   add_gen,
+   add_cons,
+   add_gens.
+
+run_one(revise_dimensions) :-
+   project,
+   embed,
+   conc_assign,
+   remove_dim,
+   remove_high_dim,
+   expand_dim,
+   map_dim,
+   fold_dims.
+
+run_one(transform_polyhedron) :-
+   affine_image,
+   affine_preimage,
+   bounded_affine_image,
+   bounded_affine_preimage,
+   affine_image_gen,
+   affine_preimage_gen,
+   affine_image_genlr,
+   affine_preimage_genlr.
+
+run_one(extrapolation_operators) :-
+   widen_BHRZ03,
+   widen_BHRZ03_with_tokens,
+   lim_extrapolate_BHRZ03,
+   lim_extrapolate_BHRZ03_with_tokens,
+   bound_extrapolate_BHRZ03,
+   bound_extrapolate_BHRZ03_with_tokens,
+   widen_H79,
+   widen_H79_with_tokens,
+   lim_extrapolate_H79,
+   lim_extrapolate_H79_with_tokens,
+   bound_extrapolate_H79,
+   bound_extrapolate_H79_with_tokens.
+
+run_one(get_system) :-
+   get_cons,
+   get_min_cons,
+   get_gens,
+   get_min_gens.
+
+run_one(check_polyhedron) :-
+   rel_cons,
+   rel_gens,
+   checks,
+   bounds_from_above,
+   bounds_from_below.
+
+run_one(minmax_polyhedron) :-
+   maximize,
+   minimize,
+   maximize_with_point,
+   minimize_with_point.
+
+run_one(compare_polyhedra) :-
+   contains,
+   strict_contains,
+   disjoint_from,
+   equals,
+   ok.
+
+run_one(catch_time) :-
+   time_out.
+
+run_one(mip_problem) :-
+   mip_problem.
+
+run_one(pip_problem) :-
+   pip_problem.
+
+% Checks how the PPL Prolog system performs with large integers
+% XSB has problems with large numbers - hence tests for XSB disallowed.
+% We catch the exception if it is caused by integer overflow in C++
+% and suppress output as this is expected when C++ uses checked_integers.
+run_one(large_integers) :-
+   prolog_system(Prolog_System),
+   (Prolog_System \== 'XSB' ->
+     catch(large_integers, ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause)))
+   ;
+     true
+   ).
+
+% Checks the handling of exceptions.
+run_one(handle_exceptions) :-
+   exceptions.
+
+%%%%%%%%%%%%%%%%% numeric bounds %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+max_dimension :-
+  ppl_max_space_dimension(M),
+  (noisy(0) -> true ;
+     display_message(['Maximum possible dimension is', M, nl])
+  ).
+
+% coefficient_bounds/0
+% This is mainly to check ppl_Coefficient_is_bounded/0,
+% ppl_Coefficient_max/1, ppl_Coefficient_min/1.
+% But it has to catch the case when the numeric bounds in the
+% prolog system are smaller than any finite bounds in C++
+% As the test does not know the configuration, all that can be tested
+% here is that the results are consistent and the bounds are
+% in a list of possible bounds.
+
+coefficient_bounds :-
+    (pl_check_prolog_flag(bounded, true) ->
+     (pl_check_prolog_flag(max_integer, PLMax),
+      pl_check_prolog_flag(min_integer, PLMin))
+   ;
+     PLMax = 0, PLMin = 0
+  ),
+  (ppl_Coefficient_is_bounded ->
+     (cpp_bounded_values(Max, Min) -> true
+      ;
+       (Max = PLMax, Min = PLMin)
+     )
+  ;
+     (cpp_unbounded_check, Max = PLMax, Min = PLMin)
+  ),
+  (noisy(0) -> true ;
+     display_message(['Maximum possible coefficient is', Max, nl]),
+     display_message(['Minimum possible coefficient is', Min, nl])
+  ).
+
+cpp_unbounded_check :-
+  \+ ppl_Coefficient_max(_),
+  \+ ppl_Coefficient_min(_).
+
+cpp_bounded_values(Max, Min) :-
+  ppl_Coefficient_max(Max),
+  ppl_Coefficient_min(Min).
+
+set_restore_rounding :-
+  ppl_set_rounding_for_PPL,
+  ppl_restore_pre_PPL_rounding.
+
+set_restore_irrational_precision :-
+  ppl_irrational_precision(Default),
+  Default == 128,
+  Non_Default = 100,
+  ppl_set_irrational_precision(Non_Default),
+  ppl_irrational_precision(Changed),
+  Changed == Non_Default,
+  ppl_set_irrational_precision(Default),
+  ppl_irrational_precision(Restored),
+  Restored == Default.
+
+%%%%%%%%%%%%%%%%% New Polyhedron %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Note that throughout the tests, all "new_Polyhedron_from_...(...,P)" calls
+% are made in such a way that, if the test fails, P is deleted.
+% This is done by using special "clean_new_Polyhedron_from_...(...,P)"
+% forms of the predicates that are defined later.
+%
+% As we also delete P on success of the test, to prevent trying to
+% delete P again when a later test fails, we always have a cut before these
+% in-line calls to ppl_Polyhedron_delete(P).
+
+% Tests new_C_Polyhedron_from_space_dimension/3,
+%       new_NNC_Polyhedron_from_space_dimension/3 and
+%       ppl_delete_Polyhedron/1.
+new_polyhedron_from_dim :-
+  new_polyhedron_from_dim(c, universe),
+  new_polyhedron_from_dim(nnc, universe),
+  new_polyhedron_from_dim(c, empty),
+  new_polyhedron_from_dim(nnc, empty).
+
+% This also uses ppl_Polyhedron_is_universe/1
+% and ppl_Polyhedron_is_empty.
+new_polyhedron_from_dim(T, Universe_Or_Empty) :-
+  \+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, Universe_Or_Empty, 0),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, Universe_Or_Empty, P),
+  (Universe_Or_Empty = universe ->
+      (ppl_Polyhedron_is_universe(P),
+      \+ ppl_Polyhedron_is_empty(P))
+   ;
+      (ppl_Polyhedron_is_empty(P),
+      \+ ppl_Polyhedron_is_universe(P))
+  ),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_new_C_Polyhedron_from_C_Polyhedron/2,
+%       ppl_new_C_Polyhedron_from_NNC_Polyhedron/2,
+%       ppl_new_NNC_Polyhedron_from_C_Polyhedron/2, and
+%       ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/2,
+new_polyhedron_from_polyhedron :-
+  new_polyhedron_from_polyhedron(c, c),
+  new_polyhedron_from_polyhedron(nnc, nnc),
+  new_polyhedron_from_polyhedron(c, nnc),
+  new_polyhedron_from_polyhedron(nnc, c).
+
+% This also uses ppl_new_Polyhedron_from_constraints/3 and
+% ppl_Polyhedron_equals_Polyhedron/2.
+new_polyhedron_from_polyhedron(T1, T2) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T1, 3, universe, P1),
+  \+ clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1, T2, 0),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1, T2, P2),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T2, P2, T1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P1a, T2, P2a),
+  ppl_Polyhedron_equals_Polyhedron(P2, P2a),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P2a),
+  make_vars(3, [A, B, C]),
+  (T1 = c
+          -> CS = [3 >= A, 4 >= A, 4*A + B - 2*C >= 5]
+          ;  CS = [3 >= A, 4 >  A, 4*A + B - 2*C >= 5]
+  ),
+  clean_ppl_new_Polyhedron_from_constraints(T1, CS, P3),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P3, T2, P4),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T2, P4, T1, P3a),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T1, P3a, T2, P4a),
+  ppl_Polyhedron_equals_Polyhedron(P3, P3a),
+  ppl_Polyhedron_equals_Polyhedron(P4, P4a),
+  !,
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P4),
+  ppl_delete_Polyhedron(P3a),
+  ppl_delete_Polyhedron(P4a).
+
+% Tests ppl_new_Polyhedron_from_constraints/2
+%       ppl_new_Polyhedron_from_constraints/2.
+new_polyhedron_from_cons :-
+  new_polyhedron_from_cons(c, [3 >= '$VAR'(1)]),
+  make_vars(4, [A, B, C, D]),
+  new_polyhedron_from_cons(c, [3 >= A, 4*A + B - 2*C >= 5, D = 1]),
+  new_polyhedron_from_cons(c, [B >= A, 4*A + B - 2*C >= 5, D = 1]),
+  new_polyhedron_from_cons(nnc, [3 > A, 4*A + B - 2*C >= 5, D = 1]),
+  new_polyhedron_from_cons(nnc, [B > A, 4*A + B - 2*C >= 5, D = 1]).
+
+new_polyhedron_from_cons(T, CS) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, [], P),
+  \+ clean_ppl_new_Polyhedron_from_constraints(T, [], 0),
+  ppl_Polyhedron_is_universe(P),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, Pa),
+  \+ ppl_Polyhedron_is_universe(Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+% Tests ppl_new_Polyhedron_from_generators/2 and
+%       ppl_new_Polyhedron_from_generators/2.
+new_polyhedron_from_gens :-
+  make_vars(3, [A, B, C]),
+  new_polyhedron_from_gens(c,[point(A + B + C, 1), point(A + B + C)] ),
+  new_polyhedron_from_gens(nnc,  [point(A + B + C), closure_point(A + B + C)]).
+
+new_polyhedron_from_gens(T, GS) :-
+  \+ clean_ppl_new_Polyhedron_from_generators(T, [], 0),
+  clean_ppl_new_Polyhedron_from_generators(T, [], P),
+  ppl_Polyhedron_is_empty(P),
+  clean_ppl_new_Polyhedron_from_generators(T, GS, Pa),
+  \+ ppl_Polyhedron_is_empty(Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+
+%%%%%%%%%%%%%%%%% Swap Polyhedra %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_swap/2.
+swap :-
+  swap(c), swap(nnc).
+
+swap(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Q),
+  ppl_Polyhedron_swap(P, Q),
+  ppl_Polyhedron_is_empty(P),
+  ppl_Polyhedron_is_universe(Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+%%%%%%%%%%%%%%%%%% Poly Dimension %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_space_dimension/2.
+space :-
+ space(c), space(nnc).
+
+space(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_space_dimension(P, N),
+  N = 3,
+  \+ ppl_Polyhedron_space_dimension(P, 4),
+  clean_ppl_new_Polyhedron_from_generators(T, [], Q),
+  ppl_Polyhedron_space_dimension(Q, M),
+  M == 0,
+  clean_ppl_new_Polyhedron_from_constraints(T, [], Q1),
+  ppl_Polyhedron_space_dimension(Q1, M1),
+  M1 == 0,
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  ppl_delete_Polyhedron(Q1).
+
+
+% Tests ppl_Polyhedron_affine_dimension/2.
+affine_dim :-
+ affine_dim(c), affine_dim(nnc).
+
+affine_dim(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_affine_dimension(P, N),
+  N == 3,
+  \+ ppl_Polyhedron_affine_dimension(P, 2),
+  clean_ppl_new_Polyhedron_from_generators(T, [], Q),
+  ppl_Polyhedron_affine_dimension(Q, M),
+  M == 0,
+  clean_ppl_new_Polyhedron_from_constraints(T, [], Q1),
+  ppl_Polyhedron_affine_dimension(Q1, M1),
+  M1 == 0,
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  ppl_delete_Polyhedron(Q1),
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A), ray(B)],
+                                     P1),
+  ppl_Polyhedron_space_dimension(P1, 2),
+  ppl_Polyhedron_affine_dimension(P1, 1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B, 2)],
+                                     P2),
+  ppl_Polyhedron_space_dimension(P2, 2),
+  ppl_Polyhedron_affine_dimension(P2, 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 0,
+                                       A + B =< 1, B =< 0],
+                                      P3),
+  ppl_Polyhedron_space_dimension(P3, 2),
+  ppl_Polyhedron_affine_dimension(P3, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 1,
+                                       A + B =< 1],
+                                      P4),
+  (T = c ->
+            ppl_Polyhedron_add_constraint(P4, B =< 0)
+         ;
+            ppl_Polyhedron_add_constraint(P4, B < 1)
+  ),
+  ppl_Polyhedron_space_dimension(P4, 2),
+  ppl_Polyhedron_affine_dimension(P4, 0),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P4).
+
+% Tests ppl_Polyhedron_constrains/2.
+constrains :-
+  constrains(c), constrains(nnc).
+
+constrains(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+  ppl_Polyhedron_constrains(P, B),
+  \+ppl_Polyhedron_constrains(P, A),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_unconstrain_space_dimension/2.
+unconstrain_space_dimension :-
+  unconstrain_space_dimension(c), unconstrain_space_dimension(nnc).
+
+unconstrain_space_dimension(T) :-
+  make_vars(3, [_A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+  ppl_Polyhedron_unconstrain_space_dimension(P, B),
+  \+ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_unconstrain_space_dimensions/2.
+unconstrain_space_dimensions :-
+  unconstrain_space_dimensions(c), unconstrain_space_dimensions(nnc).
+
+unconstrain_space_dimensions(T) :-
+  make_vars(3, [_A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [B >= 0, B - C >= 2]),
+  ppl_Polyhedron_unconstrain_space_dimensions(P, []),
+  ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_unconstrain_space_dimensions(P, [B]),
+  \+ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_unconstrain_space_dimensions(P, [B]),
+  \+ppl_Polyhedron_constrains(P, B),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%% Basic Operators %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_intersection_assign/2.
+inters_assign :-
+  inters_assign(c), inters_assign(nnc).
+
+inters_assign(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(B),
+                                      point(A), point(A, 2)],
+                                     P1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(A),
+                                      point(A + B), point(A, 2)],
+                                     P2),
+  ppl_Polyhedron_intersection_assign(P1, P2),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B, 2),
+                                      point(A), point(0)],
+                                     P1a),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 0, B >= 0,
+                                       A + B =< 1],
+                                      P1b),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+  clean_ppl_new_Polyhedron_from_constraints(T, [A =< -1, B =< -1], P3),
+  ppl_Polyhedron_intersection_assign(P1, P3),
+  ppl_Polyhedron_is_empty(P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_concatenate_assign/2.
+conc_assign :-
+  conc_assign(c), conc_assign(nnc).
+
+conc_assign(T) :-
+  make_vars(5, [A, B, C, D, E]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  clean_ppl_new_Polyhedron_from_constraints(T, [A >= 1, B >= 0, C >= 0], Q),
+  ppl_Polyhedron_concatenate_assign(P, Q),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [C >= 1, D >= 0, E >= 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_poly_hull_assign/2.
+polyhull_assign :-
+  polyhull_assign(c), polyhull_assign(nnc).
+
+polyhull_assign(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(B),
+                                      point(A), point(A,2)],
+                                     P1),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(0), point(A),
+                                      point(A + B), point(A, 2)],
+                                     P2),
+  ppl_Polyhedron_poly_hull_assign(P1, P2),
+  clean_ppl_new_Polyhedron_from_generators(T,
+      [point(1*A+1*B), point(1*A, 2), point(1*A), point(1*B), point(0)], P1a),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+      [1*A>=0, 1*B>=0, -1*B>= -1, -1*A>= -1], P1b),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1a),
+  ppl_Polyhedron_equals_Polyhedron(P1, P1b),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P1a),
+  ppl_delete_Polyhedron(P1b).
+
+% Tests ppl_Polyhedron_poly_difference_assign/2.
+polydiff_assign :-
+  make_vars(2, [A, B]),
+  GS0 = [point(2*A)],
+  GS1 = [point(0), point(2*A)],
+  GS2 = [point(0), point(A)],
+  GS3 = [point(A), point(2*A)],
+  GS4 = [closure_point(A), point(2*A)],
+  GS4a = [closure_point(A), point(3*A, 2), closure_point(2*A)],
+  polydiff_assign(c, GS1, GS2, GS3),
+  polydiff_assign(c, GS1, GS3, GS2),
+  polydiff_assign(c, GS3, GS0, GS3),
+  polydiff_assign(nnc, GS1, GS2, GS4),
+  polydiff_assign(nnc, GS1, GS4, GS2),
+  polydiff_assign(nnc, GS4, GS0, GS4a),
+  GS5 = [point(0), point(B), point(A)],
+  GS6 = [point(0), point(A), point(A + B)],
+  GS6a = [point(0), point(A), point(A + B, 2)],
+  GS7 = [point(A + B, 2), point(B), point(0)],
+  GS8 = [closure_point(A + B, 2), point(B), closure_point(0)],
+  polydiff_assign(c, GS5, GS6, GS7),
+  polydiff_assign(c, GS5, GS7, GS6a),
+  polydiff_assign(nnc, GS5, GS6, GS8),
+  polydiff_assign(nnc, GS5, GS8, GS6a),
+  GS_empty = [],
+  polydiff_assign(c, GS0, GS0, GS_empty),
+  polydiff_assign(nnc, GS4, GS4, GS_empty),
+  polydiff_assign(nnc, GS4, GS3, GS_empty).
+
+polydiff_assign(T, GS1, GS2, GS3) :-
+  clean_ppl_new_Polyhedron_from_generators(T, GS1, P1),
+  ppl_Polyhedron_space_dimension(P1, Dim),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P2),
+  ppl_Polyhedron_add_generators(P2, GS2),
+  ppl_Polyhedron_poly_difference_assign(P1, P2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, empty, P3),
+  ppl_Polyhedron_add_generators(P3, GS3),
+  ppl_Polyhedron_equals_Polyhedron(P1, P3),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_time_elapse_assign/2.
+time_elapse :-
+  time_elapse(c), time_elapse(nnc).
+
+% Tests ppl_Polyhedron_time_elapse for C Polyhedra.
+time_elapse(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P,
+                          [A >= 1, A =< 3, B >= 1, B =< 3]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Q),
+  ppl_Polyhedron_add_constraints(Q, [B = 5]),
+  ppl_Polyhedron_time_elapse_assign(P, Q),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Pa),
+  ppl_Polyhedron_add_constraints(Pa, [B >= 1]),
+  clean_ppl_new_Polyhedron_from_constraints(T, [B = 5], Qa),
+  ppl_Polyhedron_equals_Polyhedron(Q, Qa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  ppl_delete_Polyhedron(Pa),
+  ppl_delete_Polyhedron(Qa).
+
+% Tests ppl_Polyhedron_topological_closure_assign/1.
+top_close_assign :-
+  make_vars(3, [A, B, C]),
+  GS_close = [point(A + B), point(0), ray(A), ray(B)],
+  GS_not_close = [point(A + B), closure_point(0), ray(A), ray(B)],
+  CS_close = [4*A + B + -2*C >= 5, A =< 3],
+  CS_not_close = [4*A + B - 2*C >= 5, A < 3],
+  top_close_assign(c, gensys, GS_close, GS_close),
+  top_close_assign(nnc, gensys, GS_not_close, GS_close),
+  top_close_assign(c, consys, CS_close, CS_close),
+  top_close_assign(nnc, consys, CS_not_close, CS_close).
+
+top_close_assign(T, gensys, GS, GS_close) :-
+  clean_ppl_new_Polyhedron_from_generators(T, GS, P),
+  ppl_Polyhedron_topological_closure_assign(P),
+  clean_ppl_new_Polyhedron_from_generators(T, GS_close, Pa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+top_close_assign(T, consys, CS, CS_close) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_topological_closure_assign(P),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS_close, Pa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa).
+
+
+%%%%%%%%%%%%%%%%%% Add Constraints or Generators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_add_constraint/2.
+add_con :-
+  add_con(c), add_con(nnc).
+
+add_con(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B >= 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B >= 1],
+                                      Pa),
+  ppl_Polyhedron_equals_Polyhedron(P, Pa),
+  ppl_Polyhedron_add_constraint(P, A = 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A = 0, B =< -1],
+                                      Pb),
+  ppl_Polyhedron_equals_Polyhedron(P, Pb),
+  ppl_Polyhedron_add_constraint(P, A = 1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Pc),
+  ppl_Polyhedron_equals_Polyhedron(P, Pc),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Pa),
+  ppl_delete_Polyhedron(Pb),
+  ppl_delete_Polyhedron(Pc).
+
+% Tests ppl_Polyhedron_add_generator/2.
+add_gen :-
+  add_gen(c), add_gen(nnc).
+
+add_gen(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_generator(P, point(A + B)),
+  clean_ppl_new_Polyhedron_from_generators(T,
+                                     [point(A + B), point(0),
+                                      line(A), line(B)], P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_constraints/2.
+add_cons :-
+  make_vars(3, [A, B, C]),
+  add_cons(c, [A >= 1, B >= 0, 4*A + B - 2*C >= 5], [A =< 0]),
+  add_cons(nnc, [A > 1, B >= 0, 4*A + B - 2*C > 5], [A < 0]).
+
+add_cons(T, CS, CS1) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_add_constraints(P, CS1),
+  ppl_Polyhedron_is_empty(P),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_add_generators/2.
+add_gens :-
+  make_vars(3, [A, B, C]),
+  add_gens(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1),
+               point(100*A + 5*B, -8)]),
+  add_gens(nnc, [point(A + B + C), ray(A), ray(2*A), point(A + B + C, 1),
+                 closure_point(100*A + 5*B, -8)]).
+
+add_gens(T, GS) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+  ppl_Polyhedron_add_generators(P, GS),
+  clean_ppl_new_Polyhedron_from_generators(T, GS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%%% Change Dimensions %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_add_space_dimensions_and_project/2.
+project :-
+  project(c), project(nnc).
+
+project(T) :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]),
+  ppl_Polyhedron_add_space_dimensions_and_project(P, 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0],
+                                      P0),
+  ppl_Polyhedron_equals_Polyhedron(P, P0),
+  ppl_delete_Polyhedron(P0),
+  ppl_Polyhedron_add_space_dimensions_and_project(P, 2),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C = 0, D = 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_add_space_dimensions_and_embed/2.
+embed :-
+  embed(c), embed(nnc).
+
+embed(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0]),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P, 0),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0],
+                                      P0),
+  ppl_Polyhedron_equals_Polyhedron(P, P0),
+  ppl_delete_Polyhedron(P0),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P, 2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_remove_space_dimensions/2.
+remove_dim :-
+  remove_dim(c), remove_dim(nnc).
+
+remove_dim(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]),
+  ppl_Polyhedron_remove_space_dimensions(P, []),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C >= 2],
+                                      P0),
+  ppl_Polyhedron_equals_Polyhedron(P, P0),
+  ppl_delete_Polyhedron(P0),
+  ppl_Polyhedron_remove_space_dimensions(P,[B]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 2],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_delete_Polyhedron(P1),
+  % Note: now 'B' refers to the old 'C' variable.
+  ppl_Polyhedron_remove_space_dimensions(P,[A, B]),
+  ppl_Polyhedron_space_dimension(P, 0),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_remove_higher_space_dimensions/2.
+remove_high_dim :-
+  remove_high_dim(c), remove_high_dim(nnc).
+
+remove_high_dim(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 0]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C >= 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 1),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 0),
+  ppl_Polyhedron_space_dimension(P, 0),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_expand_space_dimension/3.
+expand_dim :-
+  expand_dim(c), expand_dim(nnc).
+
+expand_dim(T) :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2]),
+  ppl_Polyhedron_expand_space_dimension(P, B, 1),
+  ppl_Polyhedron_space_dimension(P, 4),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A >= 1, B >= 0, C >= 2, D >= 0],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_delete_Polyhedron(P1),
+  ppl_Polyhedron_remove_higher_space_dimensions(P, 2),
+  ppl_Polyhedron_expand_space_dimension(P, A, 2),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [D >= 1, C >= 1, A >= 1, B >= 0],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_delete_Polyhedron(P2),
+  ppl_Polyhedron_space_dimension(P, 4),
+  !,
+  ppl_delete_Polyhedron(P),
+% Example taken from [GopanDMDRS04], page 519.
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, Ptacas),
+  ppl_Polyhedron_add_generators(Ptacas,
+       [point(A + 2*B), point(A + 3*B), point(A + 4*B)]),
+  ppl_Polyhedron_expand_space_dimension(Ptacas, B, 1),
+  ppl_Polyhedron_space_dimension(Ptacas, 3),
+  clean_ppl_new_Polyhedron_from_generators(T,
+       [point(A + 2*B + 2*C), point(A + 2*B + 3*C), point(A + 2*B + 4*C),
+        point(A + 3*B + 2*C), point(A + 3*B + 3*C), point(A + 3*B + 4*C),
+        point(A + 4*B + 2*C), point(A + 4*B + 3*C), point(A + 4*B + 4*C)],
+                                      Ptacas1),
+  ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1),
+  !,
+  ppl_delete_Polyhedron(Ptacas1),
+  ppl_delete_Polyhedron(Ptacas).
+
+% Tests ppl_Polyhedron_fold_space_dimension/3.
+fold_dims :-
+  fold_dims(c), fold_dims(nnc).
+
+fold_dims(T) :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B >= 0, C >= 2, D >= 0]),
+  ppl_Polyhedron_fold_space_dimensions(P, [D], B),
+  ppl_Polyhedron_space_dimension(P, 3),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 1, B >= 0, C >= 2]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_Polyhedron_fold_space_dimensions(P, [A, C], B),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, P2),
+  ppl_Polyhedron_add_constraints(P2, [A >= 0]),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  ppl_delete_Polyhedron(P2),
+  ppl_Polyhedron_space_dimension(P, 1),
+  !,
+  ppl_delete_Polyhedron(P),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, Ptacas),
+  ppl_Polyhedron_add_constraints(Ptacas, [A >= 1, A =< 3, B >= 7, B =< 12]),
+  ppl_Polyhedron_fold_space_dimensions(Ptacas, [A], B),
+  ppl_Polyhedron_space_dimension(Ptacas, 1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 1, universe, Ptacas1),
+  ppl_Polyhedron_add_constraints(Ptacas1, [A >= 1, A =< 12]),
+  ppl_Polyhedron_equals_Polyhedron(Ptacas, Ptacas1),
+  !,
+  ppl_delete_Polyhedron(Ptacas1),
+  ppl_delete_Polyhedron(Ptacas).
+
+% Tests ppl_Polyhedron_map_space_dimensions/2.
+map_dim:-
+  map_dim(c), map_dim(nnc).
+
+map_dim(T) :-
+  make_vars(7, [A, B, C, D, E, F, G]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 2, B >= 1, C >= 0]),
+  ppl_Polyhedron_map_space_dimensions(P, [A-B, B-C, C-A]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, Q),
+  ppl_Polyhedron_add_constraints(Q, [A >= 0, B >= 2, C >= 1]),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P0),
+  ppl_Polyhedron_add_generators(P0, [point(2*C), line(A+B), ray(A+C)]),
+  ppl_delete_Polyhedron(P0),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 4, empty, P1),
+  ppl_Polyhedron_add_generators(P1, [point(2*C), line(A+B), ray(A+C)]),
+  ppl_Polyhedron_map_space_dimensions(P1, [A-C, C-A, B-B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, Q1),
+  ppl_Polyhedron_add_generators(Q1, [point(2*A), ray(A+C), line(B+C)]),
+  ppl_Polyhedron_equals_Polyhedron(P1, Q1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(Q1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 5, universe, P2),
+  ppl_Polyhedron_add_constraints(P2, [B = 2, E = 8]),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P2, 2),
+  ppl_Polyhedron_map_space_dimensions(P2, [A-A, B-B, C-E, D-F, E-G, F-C, G-D]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 7, universe, Q2),
+  ppl_Polyhedron_add_constraints(Q2, [B = 2, G = 8]),
+  ppl_Polyhedron_equals_Polyhedron(P2, Q2),
+  !,
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(Q2).
+
+
+%%%%%%%%%%%%%%%%%% Affine Transformations %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_affine_image/4.
+affine_image :-
+  affine_image(c), affine_image(nnc).
+
+affine_image(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B = 1],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_affine_image(P, A, A + 1, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B = 2],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_affine_preimage/4.
+affine_preimage :-
+  affine_preimage(c), affine_preimage(nnc).
+
+affine_preimage(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A + B >= 10),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A + B >= 10],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  ppl_Polyhedron_affine_preimage(P, A, A + 1, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A + B >= 9],
+                                      P2),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounded_affine_image/5
+bounded_affine_image :-
+  bounded_affine_image(c), bounded_affine_image(nnc).
+
+bounded_affine_image(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  ppl_Polyhedron_bounded_affine_image(P, B, A - 1, A + 1, 2),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - 2*B =< 1, 2*B - A =< 1],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounded_affine_preimage/5
+bounded_affine_preimage :-
+  bounded_affine_preimage(c), bounded_affine_preimage(nnc).
+
+bounded_affine_preimage(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+            [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2],
+            P),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T, P, T, P1),
+  ppl_Polyhedron_add_space_dimensions_and_embed(P1, 1),
+  ppl_Polyhedron_bounded_affine_preimage(P, B, 7 - A, A + 3, 1),
+  ppl_Polyhedron_add_constraint(P1, 7 - A =< B),
+  ppl_Polyhedron_add_constraint(P1, B =< A + 3),
+  ppl_Polyhedron_remove_space_dimensions(P1, [B]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+            [A >= 0, A =< 4, B >= 0, B =< 4, A - B =< 2, A - B >= -2],
+            Q),
+  clean_ppl_new_Polyhedron_from_Polyhedron(T, Q, T, Q1),
+  ppl_Polyhedron_add_space_dimensions_and_embed(Q1, 1),
+  ppl_Polyhedron_bounded_affine_preimage(Q, B, 7 - 3*A + 2*B, B + 5*A - 3, 1),
+  ppl_Polyhedron_add_constraint(Q1, 7 - 3*A + 2*C =< B),
+  ppl_Polyhedron_add_constraint(Q1, B =< C + 5*A - 3),
+  ppl_Polyhedron_remove_space_dimensions(Q1, [B]),
+  ppl_Polyhedron_equals_Polyhedron(Q, Q1),
+  !,
+  ppl_delete_Polyhedron(Q1),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_generalized_affine_image/5.
+affine_image_gen :-
+  affine_image_gen(c), affine_image_gen(nnc).
+
+affine_image_gen(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  ppl_Polyhedron_generalized_affine_image(P, A, =<, A + 1, 1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [A - B =< 2],
+                                      P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_generalized_affine_preimage/5.
+affine_preimage_gen :-
+  affine_preimage_gen(c), affine_preimage_gen(nnc).
+
+affine_preimage_gen(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A >= 0, A =< 4, B =< 5, A =< B]),
+  ppl_Polyhedron_generalized_affine_preimage(P, B, >=, A+2, 1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 3]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_generalized_affine_image_lhs_rhs/4.
+affine_image_genlr :-
+  make_vars(2, [A, B]),
+  affine_image_genlr(c, =<, [B - A =< 2], [A,B]),
+  affine_image_genlr(c, =, [B - A = 2], [A,B]),
+  affine_image_genlr(nnc, <, [B - A < 2], [A,B]),
+  affine_image_genlr(nnc, =<, [B - A =< 2], [A,B]).
+
+affine_image_genlr(T, R, CS, [A,B]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraint(P, A - B = 1),
+  ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, R, A + 1),
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+% % Tests ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4.
+affine_preimage_genlr :-
+  make_vars(2, [A, B]),
+  affine_preimage_genlr(c, B - 1, =<,  A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+  affine_preimage_genlr(c, B + 1, =, A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+  affine_preimage_genlr(nnc, B - 1, <, A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]),
+  affine_preimage_genlr(nnc, B - 1, =<, A + 1,
+      [A >= 0, A =< 4, B >= 0, B =< A], [A,B]).
+
+affine_preimage_genlr(T, LHS, R, RHS, CS, [A,_B]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(P, LHS, R, RHS),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, [A >= 0, A =< 4]),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%% Widen and Extrapolation Operators %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_BHRZ03_widening_assign/2.
+widen_BHRZ03 :-
+  make_vars(2, [A, B]),
+  widen_BHRZ03(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+                  [A >= 1],         [A >= 1, B >= 1]
+              ),
+  widen_BHRZ03(nnc, [A > 1, B > 0], [A > 1, B > 1],
+                    [A > 1],        [A > 1, B > 1]
+              ).
+
+widen_BHRZ03(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_BHRZ03_widening_assign(P, Q),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology).
+
+% Tests ppl_Polyhedron_BHRZ03_widening_assign_with_tokens/4.
+widen_BHRZ03_with_tokens :-
+  make_vars(2, [A, B]),
+  widen_BHRZ03_with_tokens(c, [A >= 1], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 1
+                         ),
+  widen_BHRZ03_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 0
+                         ),
+  widen_BHRZ03_with_tokens(nnc, [A > 1], [A > 1, B > 1],
+                               [A > 1], [A > 1, B > 1], 2, 2
+                         ),
+  widen_BHRZ03_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1],
+                               [A > 1, B >= 0], [A > 1, B >= 1], 3, 1
+                         ).
+
+widen_BHRZ03_with_tokens(Topology,
+                      CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q,
+                                            Token_i, 4),
+  \+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q,
+                                            Token_i, not_a_number),
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, Token_i, X),
+  ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(P, Q, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology), !.
+
+% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3.
+lim_extrapolate_BHRZ03 :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                            [A >= 1, B >= 0], [A >= 1, B >= 0]
+                        ),
+  lim_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                            [A >= 2],         []
+                        ),
+  lim_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                              [A > 1, B > 0], [A > 1, B > 0]
+                        ),
+  lim_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                              [A >= 2],        []
+                        ).
+
+lim_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5.
+lim_extrapolate_BHRZ03_with_tokens :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_BHRZ03_with_tokens(c,
+                  [A >= 1, B >= 0], [A >= 1, B >= 1],
+                  [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                   ),
+  lim_extrapolate_BHRZ03_with_tokens(nnc,
+                    [A > 1, B > 0], [A > 1, B > 1],
+                    [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                   ).
+
+lim_extrapolate_BHRZ03_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, not_a_number),
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, X),
+  ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3.
+bound_extrapolate_BHRZ03 :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                              [A >= 1, B >= 0], [A >= 1, B >= 0]
+                          ),
+  bound_extrapolate_BHRZ03(c, [A >= 1, B >= 0], [A >= 2, B >= 1],
+                              [A >= 2],         [A >= 1, B >= 0]
+                          ),
+  bound_extrapolate_BHRZ03(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                                [A > 1, B > 0], [A > 1, B > 0]
+                          ),
+  bound_extrapolate_BHRZ03(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                                [A >= 2],        [A > 1, B >= 0]
+                          ).
+
+bound_extrapolate_BHRZ03(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5.
+bound_extrapolate_BHRZ03_with_tokens :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_BHRZ03_with_tokens(c,
+                            [A >= 1, B >= 0], [A >= 1, B >= 1],
+                            [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                     ),
+  bound_extrapolate_BHRZ03_with_tokens(nnc,
+                            [A > 1, B > 0], [A > 1, B > 1],
+                            [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                     ).
+
+bound_extrapolate_BHRZ03_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, not-a_number),
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, X),
+  ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_H79_widening_assign/2.
+widen_H79 :-
+  make_vars(2, [A, B]),
+  widen_H79(c,   [A >= 1, B >= 0], [A >= 1, B >= 1],
+                 [A >= 1],         [A >= 1, B >= 1]
+           ),
+  widen_H79(nnc, [A > 1, B > 0], [A > 1, B > 1],
+                 [A > 1], [A > 1, B > 1]
+           ),
+  widen_H79(c,   [A >= 0, A =< 1], [A = 0],
+                 [A >= 0],         [A = 0]
+           ),
+  widen_H79(nnc, [A >= 0, A =< 1], [A = 0],
+                 [A >= 0],         [A = 0]
+           ).
+
+widen_H79(Topology, CS_P, CS_Q, CS_Pa, CS_Qa) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_H79_widening_assign(P, Q),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology).
+
+% Tests ppl_Polyhedron_H79_widening_assign_with_tokens/4.
+widen_H79_with_tokens :-
+  make_vars(2, [A, B]),
+  widen_H79_with_tokens(c, [A >= 1], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 1
+                         ),
+  widen_H79_with_tokens(c, [A >= 1, B >= 0], [A >= 1, B >= 1],
+                             [A >= 1], [A >= 1, B >= 1], 1, 0
+                         ),
+  widen_H79_with_tokens(nnc, [A > 1], [A > 1, B > 1],
+                               [A > 1], [A > 1, B > 1], 2, 2
+                         ),
+  widen_H79_with_tokens(nnc, [A > 1, B >= 0], [A > 1, B >= 1],
+                               [A > 1, B >= 0], [A > 1, B >= 1], 3, 1
+                         ).
+
+widen_H79_with_tokens(Topology,
+                      CS_P, CS_Q, CS_Pa, CS_Qa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q,
+                                            Token_i, 4),
+  \+ ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q,
+                                            Token_i, not_a_number),
+  ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, Token_i, X),
+  ppl_Polyhedron_H79_widening_assign_with_tokens(P, Q, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  widen_extrapolation_final(Q, CS_Qa, Topology), !.
+
+% Tests ppl_Polyhedron_limited_H79_extrapolation_assign/3.
+lim_extrapolate_H79 :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                           [A >= 1, B >= 0], [A >= 1, B >= 0]
+                     ),
+  lim_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                           [A >= 2],         []
+                     ),
+  lim_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                           [A > 1, B > 0], [A > 1, B > 0]
+                     ),
+  lim_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                           [A >= 2],        []
+                     ),
+  lim_extrapolate_H79(c,   [A >= 0, A =< 1], [A = 0],
+                           [A >= 0], [A >= 0]
+                     ),
+  lim_extrapolate_H79(nnc, [A >= 0, A =< 1], [A = 0],
+                           [A >= 0], [A >= 0]
+                    ).
+
+lim_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_limited_H79_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5.
+lim_extrapolate_H79_with_tokens :-
+  make_vars(2, [A, B]),
+  lim_extrapolate_H79_with_tokens(c,
+                  [A >= 1, B >= 0], [A >= 1, B >= 1],
+                  [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                   ),
+  lim_extrapolate_H79_with_tokens(nnc,
+                    [A > 1, B > 0], [A > 1, B > 1],
+                    [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                   ).
+
+lim_extrapolate_H79_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, not_a_number),
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, Token_i, X),
+  ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(P, Q,
+                                            CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign/3.
+bound_extrapolate_H79 :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                             [A >= 1, B >= 0], [A >= 1, B >= 0]
+                       ),
+  bound_extrapolate_H79(c,   [A >= 1, B >= 0], [A >= 2, B >= 1],
+                             [A >= 2],         [A >= 1, B >= 0]
+                       ),
+  bound_extrapolate_H79(nnc, [A > 1, B > 0], [A > 2, B > 1],
+                             [A > 1, B > 0], [A > 1, B > 0]
+                       ),
+  bound_extrapolate_H79(nnc, [A > 1, B >= 0], [A > 2, B >= 1],
+                             [A >= 2],        [A > 1, B >= 0]
+                       ).
+
+bound_extrapolate_H79(Topology, CS_P, CS_Q, CS_lim, CS_Pa)  :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  ppl_Polyhedron_bounded_H79_extrapolation_assign(P, Q, CS_lim),
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+
+% Tests ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5.
+bound_extrapolate_H79_with_tokens :-
+  make_vars(2, [A, B]),
+  bound_extrapolate_H79_with_tokens(c,
+                            [A >= 1, B >= 0], [A >= 1, B >= 1],
+                            [A >= 1, B >= 0], [A >= 1, B >= 0], 1, 0
+                                     ),
+  bound_extrapolate_H79_with_tokens(nnc,
+                            [A > 1, B > 0], [A > 1, B > 1],
+                            [A > 1, B > 0], [A > 1, B > 0], 1, 0
+                                     ).
+
+bound_extrapolate_H79_with_tokens(Topology,
+                 CS_P, CS_Q, CS_lim, CS_Pa, Token_i, Token_o) :-
+  widen_extrapolation_init(P, CS_P, Topology),
+  widen_extrapolation_init(Q, CS_Q, Topology),
+  Wrong_Token is Token_i + 1,
+  \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, Wrong_Token),
+  \+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, not_a_number),
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, Token_i, X),
+  ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(P, Q,
+                                         CS_lim, X, Y),
+  Y == Token_o,
+  widen_extrapolation_final(P, CS_Pa, Topology),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+% widen_extrapolation_init/3 and widen_extrapolation_final/3
+% are used in the tests for widening and extrapolation predicates.
+widen_extrapolation_init(P, CS, Topology):-
+  clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS).
+
+widen_extrapolation_final(P,CS, Topology):-
+  clean_ppl_new_Polyhedron_from_space_dimension(Topology, 2, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, CS),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%%% Get Constraint or Generator System %%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_get_constraints/2.
+get_cons :-
+  get_cons(c), get_cons(nnc).
+
+get_cons(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_get_constraints(P, []),
+  ppl_Polyhedron_add_constraint(P, A - B >= 1),
+  \+  ppl_Polyhedron_get_constraints(P, []),
+  ppl_Polyhedron_get_constraints(P, [C]),
+  clean_ppl_new_Polyhedron_from_constraints(T, [C], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_minimized_constraints/2.
+get_min_cons :-
+  get_min_cons(c), get_min_cons(nnc).
+
+get_min_cons(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+  ppl_Polyhedron_get_minimized_constraints(P, []),
+  ppl_Polyhedron_add_constraints(P, [A - B >= 1, A - B >= 0]),
+  ppl_Polyhedron_get_minimized_constraints(P, [C]),
+  clean_ppl_new_Polyhedron_from_constraints(T, [C], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  ppl_Polyhedron_add_constraints(P, [A - B =< 0]),
+  \+ppl_Polyhedron_get_minimized_constraints(P, [C]),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_generators/2.
+get_gens :-
+  get_gens(c), get_gens(nnc).
+
+get_gens(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+  ppl_Polyhedron_get_generators(P, []),
+  \+ ppl_Polyhedron_get_generators(P, [_]),
+  ppl_Polyhedron_add_generator(P, point(A+B)),
+  ppl_Polyhedron_get_generators(P, [G]),
+  clean_ppl_new_Polyhedron_from_generators(T, [G], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  ppl_Polyhedron_add_generator(P, point(A+B, 2)),
+  ppl_Polyhedron_get_generators(P, GS1),
+  ppl_Polyhedron_add_generators(Q, GS1),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  ppl_Polyhedron_add_generator(P, line(A)),
+  ppl_Polyhedron_get_generators(P, GS2),
+  ppl_Polyhedron_add_generators(Q, GS2),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+% Tests ppl_Polyhedron_get_minimized_generators/2.
+get_min_gens :-
+  get_min_gens(c), get_min_gens(nnc).
+
+get_min_gens(T) :-
+  make_vars(2, [A, B]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+  ppl_Polyhedron_add_generators(P, [point(2*A), point(A+B), point(2*B)]),
+  \+ ppl_Polyhedron_get_minimized_generators(P, [_]),
+  ppl_Polyhedron_get_minimized_generators(P, [G1, G2]),
+  clean_ppl_new_Polyhedron_from_generators(T, [G1, G2], Q),
+  ppl_Polyhedron_equals_Polyhedron(P, Q),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+
+%%%%%%%%%%%%%%%%%% Polyhedral Relations %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_relation_with_constraint/3.
+rel_cons :-
+  make_vars(3, [A, B, C]),
+  rel_cons(c, [A >= 1, B >= 0, C = 0], [A, B, C]),
+  rel_cons(nnc, [A > 1, B >= 0, C = 0], [A, B, C]).
+
+rel_cons(T, CS, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  ppl_Polyhedron_add_constraints(P, CS),
+  \+ ppl_Polyhedron_relation_with_constraint(P, A = 0, x),
+  ppl_Polyhedron_relation_with_constraint(P, A = 0, R),
+  R = [is_disjoint],
+  ppl_Polyhedron_relation_with_constraint(P, B = 0, R1),
+  R1 = [strictly_intersects],
+  ppl_Polyhedron_relation_with_constraint(P, A >= 0, R2),
+  R2 = [is_included],
+  ppl_Polyhedron_relation_with_constraint(P, C >= 0, R3),
+  (R3 = [is_included, saturates] ; R3 = [saturates, is_included]),
+  ppl_Polyhedron_relation_with_constraint(P, A = B, R4),
+  R4 = [strictly_intersects],
+  ppl_Polyhedron_add_constraint(P, A = B),
+  ppl_Polyhedron_relation_with_constraint(P, A = B, R5),
+  (R5 = [is_included, saturates] ; R5 = [saturates, is_included]),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_relation_with_generator/3.
+rel_gens :-
+  make_vars(3, [A, B, C]),
+  rel_gens(c, [point(A + B + C), ray(A)], [A, B, C]),
+  rel_gens(nnc, [point(A + B + C), ray(A)], [A, B, C]).
+
+rel_gens(T, GS, [A, _, _]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+  ppl_Polyhedron_add_generators(P, GS),
+  \+ppl_Polyhedron_relation_with_generator(P, point(A), x),
+  ppl_Polyhedron_relation_with_generator(P, point(A), R),
+  R = [],
+  ppl_Polyhedron_relation_with_generator(P, ray(A), R1),
+  R1 = [subsumes],
+  !,
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%% Check Properties %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%  tests ppl_Polyhedron_is_universe/1,
+%        ppl_Polyhedron_is_empty/1,
+%        ppl_Polyhedron_is_bounded/1,
+%        ppl_Polyhedron_is_topologically_closed/1,
+%        ppl_Polyhedron_contains_integer_point/2.
+checks :-
+  checks(c), checks(nnc).
+
+checks(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P1),
+  ppl_Polyhedron_is_universe(P),
+  ppl_Polyhedron_is_empty(P1),
+  \+ppl_Polyhedron_is_universe(P1),
+  \+ppl_Polyhedron_is_empty(P),
+  \+ppl_Polyhedron_contains_integer_point(P1),
+  ppl_Polyhedron_contains_integer_point(P),
+  ppl_Polyhedron_add_generators(P1, [point(A + B + C, 2)]),
+  \+ppl_Polyhedron_contains_integer_point(P1),
+  ppl_Polyhedron_add_generators(P1, [point(A + B + C)]),
+  ppl_Polyhedron_is_bounded(P1),
+  ppl_Polyhedron_contains_integer_point(P1),
+  ppl_Polyhedron_add_generators(P1, [ray(A + B + C)]),
+  \+ ppl_Polyhedron_is_bounded(P1),
+  ppl_Polyhedron_add_constraints(P, [A >= 1, B =< 3, A =< 2]),
+  ppl_Polyhedron_contains_integer_point(P),
+  ppl_Polyhedron_is_topologically_closed(P),
+   (T = nnc ->
+     (ppl_Polyhedron_add_constraints(P, [A > 1, B =< 3, A =< 2]),
+      \+ ppl_Polyhedron_is_topologically_closed(P),
+      ppl_Polyhedron_contains_integer_point(P),
+      ppl_Polyhedron_add_constraints(P, [A > 2]),
+      ppl_Polyhedron_is_topologically_closed(P))
+   ; true
+   ),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1).
+
+% Tests ppl_Polyhedron_contains_Polyhedron/2.
+contains :-
+  contains(c), contains(nnc).
+
+contains(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P2),
+  ppl_Polyhedron_contains_Polyhedron(P1, P2),
+  \+ppl_Polyhedron_contains_Polyhedron(P2, P1),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_strictly_contains_Polyhedron for C/2.
+strict_contains :-
+  strict_contains(c), strict_contains(nnc).
+
+strict_contains(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P2),
+  ppl_Polyhedron_strictly_contains_Polyhedron(P1, P2),
+  \+ppl_Polyhedron_strictly_contains_Polyhedron(P1, P1),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_is_disjoint_from_Polyhedron/2.
+disjoint_from :-
+  disjoint_from(c), disjoint_from(nnc).
+
+disjoint_from(T) :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [3 >= A, 4*A + B - 2*C >= 5],
+                                      P1),
+  clean_ppl_new_Polyhedron_from_constraints(T,
+                                      [4 =< A, 4*A + B - 2*C >= 5],
+                                      P2),
+  ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P2),
+  \+ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P1),
+  (T = nnc ->
+     (clean_ppl_new_Polyhedron_from_constraints(nnc,
+                                      [3 < A, 4*A + B - 2*C >= 5],
+                                      P2a),
+    ppl_Polyhedron_is_disjoint_from_Polyhedron(P1, P2a),
+    ppl_delete_Polyhedron(P2a))
+  ; true
+  ),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+% Tests ppl_Polyhedron_equals_Polyhedron/2.
+equals :-
+  equals(c), equals(nnc).
+
+equals(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P3),
+  ppl_Polyhedron_equals_Polyhedron(P1, P2),
+  \+ ppl_Polyhedron_equals_Polyhedron(P1, P3),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3).
+
+% Tests ppl_Polyhedron_OK/1.
+ok :-
+  ok(c), ok(nnc).
+
+ok(T) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 0, universe, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, universe, P2),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 0, empty, P3),
+  clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P4),
+  ppl_Polyhedron_OK(P1),
+  ppl_Polyhedron_OK(P2),
+  ppl_Polyhedron_OK(P3),
+  ppl_Polyhedron_OK(P4),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2),
+  ppl_delete_Polyhedron(P3),
+  ppl_delete_Polyhedron(P4).
+
+% Tests ppl_termination_test_C_Polyhedron_MS/2,
+%       ppl_termination_test_C_Polyhedron_PR/2.
+%       ppl_termination_test_NNC_Polyhedron_MS/2,
+%       ppl_termination_test_NNC_Polyhedron_PR/2.
+termination_test :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+                                            [A - C >= 0,
+                                             -A + C >= 0,
+                                             -B + D >= 1,
+                                             B >= 0,
+                                             A >= 1], P1),
+  ppl_termination_test_C_Polyhedron_MS(P1),
+  ppl_termination_test_C_Polyhedron_PR(P1),
+  clean_ppl_new_Polyhedron_from_constraints(nnc,
+                                            [A - C >= 0,
+                                             -A + C >= 0,
+                                             -B + D >= 1,
+                                             B >= 0],
+                                            P2),
+  ppl_termination_test_NNC_Polyhedron_MS(P2),
+  ppl_termination_test_NNC_Polyhedron_PR(P2),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Polyhedron Bounding Values %%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_bounds_from_above/2.
+bounds_from_above :-
+  make_vars(2, [A, B]),
+  bounds_from_above(c, [A >= 1, B >= 0], [B =< 2], B),
+  bounds_from_above(nnc, [A > 1, B > 0, B < 1], [A < 2], A).
+
+bounds_from_above(T, CS1, CS2, Var) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS1, P),
+  \+ ppl_Polyhedron_bounds_from_above(P, Var),
+  ppl_Polyhedron_add_constraints(P, CS2),
+  ppl_Polyhedron_bounds_from_above(P, Var),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_bounds_from_below/2.
+bounds_from_below :-
+  make_vars(2, [A, B]),
+  bounds_from_below(c, [B >= 0, B =< 1], [A >= 1], A),
+  bounds_from_below(nnc, [B > 0, B < 1], [A > 2], A).
+
+bounds_from_below(T, CS1, CS2, Var) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS1, P),
+  \+ ppl_Polyhedron_bounds_from_below(P, Var),
+  ppl_Polyhedron_add_constraints(P, CS2),
+  ppl_Polyhedron_bounds_from_below(P, Var),
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Maximize and Minimize %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_maximize/5.
+maximize :-
+  make_vars(2, [A, B]),
+  maximize(c, [A >= -1, A =< 1, B >= -1, B =< 1], A + B, 2, 1, true),
+  maximize(c, [B >= -1, B =< 1], B, 1, 1, true),
+  maximize(nnc, [A > -1, A < 1, B > -1, B < 1], A + B -1, 1, 1, false),
+  maximize(nnc, [B > -1, B < 1], B, 1, 1, false).
+
+maximize(T, CS, LE, N, D, Max) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_maximize(P, LE, N, D, Max),
+  ppl_Polyhedron_add_generator(P, ray(LE)),
+  \+ ppl_Polyhedron_maximize(P, LE, _, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_maximize_with_point/5.
+maximize_with_point :-
+  make_vars(2, [A, B]),
+  maximize_with_point(c, [A >= -1, A =< 1, B >= -1, B =< 1],
+                                        A + B, 2, 1, true, point(A+B)),
+  maximize_with_point(c, [A =< 0],
+                                        A, 0, 1, true, point(0)),
+  maximize_with_point(nnc, [A > -1, A < 1, B > -1, B < 1],
+                                        A + B -1, 1, 1, false, point(A+B)).
+
+maximize_with_point(T, CS, LE, N, D, Max, Point) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_maximize_with_point(P, LE, N, D, Max, Point_Max),
+  (Point_Max = closure_point(E) ; Point_Max = point(E)),
+  clean_ppl_new_Polyhedron_from_generators(T, [point(E)], Pm),
+  clean_ppl_new_Polyhedron_from_generators(T, [Point], Qm),
+  ppl_Polyhedron_equals_Polyhedron(Pm, Qm),
+  !,
+  ppl_delete_Polyhedron(Pm),
+  ppl_delete_Polyhedron(Qm),
+  \+ ppl_Polyhedron_maximize_with_point(P, LE, _N, 0, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+
+% Tests ppl_Polyhedron_minimize/5.
+minimize :-
+  make_vars(2, [A, B]),
+  minimize(c, [A >= -1, A =< 1, B >= -1, B =< 1], A + B, -2, 1, true),
+  minimize(c, [B >= -1, B =< 1], B, -1, 1, true),
+  minimize(nnc, [A > -2, A =< 2, B > -2, B =< 2], A + B + 1, -3, 1, false),
+  minimize(nnc, [B > -1, B < 1], B, -1, 1, false).
+
+minimize(T, CS, LE, N, D, Min) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_minimize(P, LE, N, D, Min),
+  ppl_Polyhedron_add_generator(P, ray(-LE)),
+  \+ ppl_Polyhedron_minimize(P, LE, _, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% Tests ppl_Polyhedron_minimize_with_point/5.
+minimize_with_point :-
+  make_vars(2, [A, B]),
+  minimize_with_point(c, [A >= -1, A =< 1, B >= -1, B =< 1],
+                                        A + B, -2, 1, true, point(-A-B)),
+  minimize_with_point(c, [A >= 0],
+                                        A, 0, 1, true, point(0)),
+  minimize_with_point(nnc, [A > -2, A =< 2, B > -2, B =< 2],
+                                        A + B, -4, 1, false, point(-2*A-2*B)).
+
+minimize_with_point(T, CS, LE, N, D, Min, Point) :-
+  clean_ppl_new_Polyhedron_from_constraints(T, CS, P),
+  ppl_Polyhedron_minimize_with_point(P, LE, N, D, Min, Point_Min),
+  (Point_Min = closure_point(E) ; Point_Min = point(E)),
+  clean_ppl_new_Polyhedron_from_generators(T, [point(E)], Pm),
+  clean_ppl_new_Polyhedron_from_generators(T, [Point], Qm),
+  ppl_Polyhedron_equals_Polyhedron(Pm, Qm),
+  !,
+  ppl_delete_Polyhedron(Pm),
+  ppl_delete_Polyhedron(Qm),
+   \+ ppl_Polyhedron_minimize_with_point(P, LE, _N, 0, _, _),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%%%%%%%%%%%%%%%%% Watchdog tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests Watchdog predicates
+% ppl_set_timeout/1
+% ppl_set_timeout_exception_atom/1
+% ppl_timeout_exception_atom/1
+% ppl_reset_timeout/0
+%
+
+time_out :-
+  %% FIXME!
+  %% Ciao does not throw a timeout exception.
+  prolog_system('Ciao'), !.
+time_out :-
+  time_out(c), time_out(nnc).
+
+add_constraints_and_get_minimized_constraints(P, CS) :-
+    ppl_Polyhedron_add_constraints(P, CS),
+    ppl_Polyhedron_get_minimized_constraints(P, _).
+
+% Find the constraints for a hypercube for a given dimension.
+build_hypercube_constraints(0, [], []).
+build_hypercube_constraints(Dim, [V|Vars], [V >= 0, V =< 1|CS]) :-
+    Dim1 is Dim - 1,
+    build_hypercube_constraints(Dim1, Vars, CS).
+
+% Find the dimension and constraints for
+% a hypercube that causes a timeout exception.
+compute_timeout_hypercube(Csecs, T, Dim_in, Dim_out, CS_out) :-
+    Dim_in =< 100,
+    clean_ppl_new_Polyhedron_from_space_dimension(T, Dim_in, universe, P),
+    make_vars(Dim_in, Vars),
+    build_hypercube_constraints(Dim_in, Vars, CS),
+    ppl_timeout_exception_atom(Time_Out_Atom),
+    catch((ppl_set_timeout(Csecs),
+           add_constraints_and_get_minimized_constraints(P, CS)),
+          Time_Out_Atom, Catch_Exception = ok),
+    ppl_reset_timeout,
+    (Catch_Exception == ok ->
+        Dim_out = Dim_in,
+        ppl_delete_Polyhedron(P),
+        CS_out = CS
+    ;
+        Dim1 is Dim_in+1,
+        ppl_delete_Polyhedron(P),
+        compute_timeout_hypercube(Csecs, T, Dim1, Dim_out, CS_out)
+    ).
+
+time_out(T) :-
+  ppl_set_timeout_exception_atom(pl_time_out),
+  \+  ppl_timeout_exception_atom(pl_x),
+  ppl_timeout_exception_atom(pl_time_out),
+  compute_timeout_hypercube(10, T, 1, Dim, CS),
+  !,
+  N1 is 1,
+  clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, universe, P),
+  catch((ppl_set_timeout(N1),
+         add_constraints_and_get_minimized_constraints(P, CS)),
+        pl_time_out, Catch_Exception = ok),
+  ppl_reset_timeout,
+  (Catch_Exception == ok ->
+      display_message(['while testing time_out, polyhedron with topology',
+                 T, 'timeout after', N1, ms])
+  ;
+      display_message(['while testing time_out, polyhedron with topology',
+                 T, 'no timeout after', N1, ms]),
+      fail
+  ),
+  ppl_Polyhedron_OK(P),
+  !,
+  ppl_delete_Polyhedron(P),
+  N2 is 40,
+  clean_ppl_new_Polyhedron_from_space_dimension(T, Dim, universe, Q),
+  catch((ppl_set_timeout(N2),
+         ppl_Polyhedron_is_universe(Q)),
+        pl_time_out, Catch_Exception = not_ok),
+  ppl_reset_timeout,
+  (Catch_Exception == not_ok ->
+      display_message(['while testing time_out, polyhedron with topology',
+                 T, 'timeout after', N2, ms]),
+      fail
+  ;
+      display_message(['while testing time_out, polyhedron with topology',
+                 T, 'no timeout after', N2, ms])
+  ),
+  ppl_Polyhedron_OK(Q),
+  !,
+  ppl_delete_Polyhedron(Q).
+
+%%%%%%%%%%%%%%%%% MIP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+mip_problem :-
+  mip_from_cons,
+  mip_from_mip,
+  mip_swap,
+  mip_get,
+  mip_control_parameters,
+  mip_clear,
+  mip_satisfiable,
+  mip_add,
+  mip_set,
+  mip_solve,
+  mip_eval.
+
+mip_from_cons :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+  ppl_MIP_Problem_space_dimension(MIP, 3),
+  ppl_MIP_Problem_constraints(MIP, CS),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
+  compare_lin_expressions(Obj, C),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_MIP_Problem(MIP).
+
+mip_from_mip :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP1),
+  clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
+  compare_lin_expressions(Obj, C),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  ppl_MIP_Problem_constraints(MIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_MIP_Problem_constraints(MIP1, Expect_CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_MIP_Problem(MIP1),
+  ppl_delete_MIP_Problem(MIP).
+
+mip_swap :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(0, [], 0, max, MIP),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP1),
+  ppl_MIP_Problem_swap(MIP, MIP1),
+  ppl_MIP_Problem_constraints(MIP, CS),
+  ppl_MIP_Problem_constraints(MIP1, CS1),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS1, PH1),
+  ppl_Polyhedron_is_universe(PH1),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(PH1),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_MIP_Problem(MIP1),
+  ppl_delete_MIP_Problem(MIP).
+
+mip_get :-
+  make_vars(3, [A, B, C]),
+
+  ppl_new_MIP_Problem(3, [], A + 3, min, MIP0),
+  ppl_MIP_Problem_objective_function(MIP0, Obj0),
+  compare_lin_expressions(Obj0, A + 3),
+
+  ppl_new_MIP_Problem(3, [], 3, min, MIP1),
+  ppl_MIP_Problem_objective_function(MIP1, Obj1),
+  compare_lin_expressions(Obj1, 3),
+
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+  ppl_MIP_Problem_constraints(MIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
+  compare_lin_expressions(Obj, C),
+  ppl_MIP_Problem_optimization_mode(MIP, Opt),
+  Opt = max,
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_MIP_Problem(MIP0),
+  ppl_delete_MIP_Problem(MIP1),
+  ppl_delete_MIP_Problem(MIP).
+
+mip_control_parameters :-
+  make_vars(1, [A]),
+
+  ppl_new_MIP_Problem(3, [], A + 3, min, MIP0),
+  clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP0, MIP1),
+  ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value0),
+  ppl_MIP_Problem_set_control_parameter(MIP1, Cp_value0),
+  ppl_MIP_Problem_get_control_parameter(MIP1, pricing, Cp_value1),
+  Cp_value0 == Cp_value1,
+  ppl_MIP_Problem_set_control_parameter(MIP0, pricing_steepest_edge_float),
+  ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value2),
+  Cp_value2 == pricing_steepest_edge_float,
+  ppl_MIP_Problem_set_control_parameter(MIP0, pricing_steepest_edge_exact),
+  ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value3),
+  Cp_value3 == pricing_steepest_edge_exact,
+  ppl_MIP_Problem_set_control_parameter(MIP0, pricing_textbook),
+  ppl_MIP_Problem_get_control_parameter(MIP0, pricing, Cp_value4),
+  Cp_value4 == pricing_textbook,
+  !,
+  ppl_delete_MIP_Problem(MIP0),
+  ppl_delete_MIP_Problem(MIP1).
+
+mip_clear :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, min, MIP),
+  ppl_MIP_Problem_clear(MIP),
+  ppl_MIP_Problem_space_dimension(MIP, D),
+  D == 0,
+  ppl_MIP_Problem_constraints(MIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_Polyhedron_is_universe(PH),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
+  compare_lin_expressions(Obj, 0),
+  ppl_MIP_Problem_optimization_mode(MIP, Opt),
+  Opt == max,
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_MIP_Problem(MIP).
+
+mip_satisfiable :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], C, max, MIP),
+  ppl_MIP_Problem_is_satisfiable(MIP),
+  ppl_MIP_Problem_add_constraint(MIP, A + B =< 0),
+  \+ ppl_MIP_Problem_is_satisfiable(MIP),
+  !,
+  ppl_delete_MIP_Problem(MIP).
+
+mip_add :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem_from_space_dimension(0, MIP),
+  ppl_MIP_Problem_add_space_dimensions_and_embed(MIP, 1),
+  ppl_MIP_Problem_add_constraint(MIP, A >= 0),
+  ppl_MIP_Problem_add_space_dimensions_and_embed(MIP, 2),
+  ppl_MIP_Problem_add_constraints(
+    MIP,[A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 2*B-C, max, MIP1),
+  ppl_MIP_Problem_solve(MIP, Status),
+  Status == optimized,
+  ppl_MIP_Problem_solve(MIP1, Status1),
+  Status1 == unbounded,
+  ppl_MIP_Problem_optimal_value(MIP, N, D),
+  N == 0,
+  D == 1,
+  ppl_MIP_Problem_constraints(MIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_MIP_Problem_constraints(MIP1, Expect_CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_MIP_Problem(MIP),
+  ppl_delete_MIP_Problem(MIP1).
+
+mip_set :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, MIP),
+  ppl_MIP_Problem_objective_function(MIP, 0),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  ppl_MIP_Problem_set_objective_function(MIP, 2*B-C),
+  ppl_MIP_Problem_set_optimization_mode(MIP, min),
+  ppl_MIP_Problem_objective_function(MIP, Obj),
+  compare_lin_expressions(Obj, 2*B-C),
+  ppl_MIP_Problem_optimization_mode(MIP, min),
+  ppl_MIP_Problem_solve(MIP, optimized),
+  !,
+  ppl_delete_MIP_Problem(MIP).
+
+mip_solve :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, MIP),
+  ppl_MIP_Problem_objective_function(MIP, 0),
+  ppl_MIP_Problem_optimization_mode(MIP, max),
+  ppl_MIP_Problem_set_objective_function(MIP, 2*B-C),
+  ppl_MIP_Problem_set_optimization_mode(MIP, min),
+  ppl_MIP_Problem_solve(MIP, optimized),
+  ppl_MIP_Problem_set_objective_function(MIP, C),
+  ppl_MIP_Problem_solve(MIP, unbounded),
+  ppl_MIP_Problem_add_constraint(MIP, B = 0),
+  ppl_MIP_Problem_solve(MIP, unfeasible),
+  \+ppl_MIP_Problem_solve(MIP, invalid_status),
+  !,
+  ppl_delete_MIP_Problem(MIP).
+
+mip_eval :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_MIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 2*B-C, min, MIP),
+  \+ ppl_MIP_Problem_optimizing_point(MIP, closure_point(_X)),
+  ppl_MIP_Problem_optimizing_point(MIP, Point),
+  ppl_MIP_Problem_feasible_point(MIP, Point),
+  \+ ppl_MIP_Problem_feasible_point(MIP, point(B)),
+  clean_ppl_new_Polyhedron_from_generators(c, [Point], PH),
+  clean_ppl_new_Polyhedron_from_generators(c, [point(5*B+5*C)], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  \+ ppl_MIP_Problem_optimal_value(MIP, 2, 1),
+  ppl_MIP_Problem_optimal_value(MIP, N, D),
+  \+ ppl_MIP_Problem_evaluate_objective_function(MIP, Point, 2, 1),
+  ppl_MIP_Problem_evaluate_objective_function(MIP, Point, N1, D1),
+  N == N1,
+  D == D1,
+  ppl_MIP_Problem_OK(MIP),
+  !,
+  ppl_delete_MIP_Problem(MIP),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_Polyhedron(PH).
+
+%%%%%%%%%%%%%%%%% PIP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+pip_problem :-
+  pip_from_cons,
+  pip_from_pip,
+  pip_swap,
+  pip_control_parameters,
+  pip_clear,
+  pip_satisfiable,
+  pip_add,
+  pip_set,
+  pip_solve,
+  pip_solution.
+
+pip_from_cons :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem_from_space_dimension(3, PIP1),
+  ppl_PIP_Problem_space_dimension(PIP1, 3),
+  ppl_PIP_Problem_OK(PIP1),
+  clean_ppl_new_PIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP),
+  ppl_PIP_Problem_space_dimension(PIP, 3),
+  ppl_PIP_Problem_parameter_space_dimensions(PIP, [C]),
+  ppl_PIP_Problem_constraints(PIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_PIP_Problem(PIP1),
+  ppl_delete_PIP_Problem(PIP).
+
+pip_from_pip :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem(
+    3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP1),
+  clean_ppl_new_PIP_Problem_from_PIP_Problem(PIP1, PIP),
+  ppl_PIP_Problem_constraints(PIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_PIP_Problem_constraints(PIP1, Expect_CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_PIP_Problem(PIP1),
+  ppl_delete_PIP_Problem(PIP).
+
+pip_swap :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem_from_space_dimension(0, PIP),
+  clean_ppl_new_PIP_Problem(
+    3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP1),
+  ppl_PIP_Problem_swap(PIP, PIP1),
+  ppl_PIP_Problem_constraints(PIP, CS),
+  ppl_PIP_Problem_constraints(PIP1, CS1),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS1, PH1),
+  ppl_Polyhedron_is_universe(PH1),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  clean_ppl_new_Polyhedron_from_constraints(c,
+       [A >= -1, B >= 5, C >= 0, C =< 3], Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(PH1),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_PIP_Problem(PIP1),
+  ppl_delete_PIP_Problem(PIP).
+
+pip_control_parameters :-
+  make_vars(1, [A]),
+
+  ppl_new_PIP_Problem(3, [], [A], PIP0),
+  clean_ppl_new_PIP_Problem_from_PIP_Problem(PIP0, PIP1),
+  ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value0),
+  ppl_PIP_Problem_set_control_parameter(PIP1, Cp_value0),
+  ppl_PIP_Problem_get_control_parameter(PIP1, cutting_strategy, Cp_value1),
+  Cp_value0 == Cp_value1,
+  ppl_PIP_Problem_set_control_parameter(PIP0, cutting_strategy_first),
+  ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value2),
+  Cp_value2 == cutting_strategy_first,
+  ppl_PIP_Problem_set_control_parameter(PIP0, cutting_strategy_deepest),
+  ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value3),
+  Cp_value3 == cutting_strategy_deepest,
+  ppl_PIP_Problem_set_control_parameter(PIP0, cutting_strategy_all),
+  ppl_PIP_Problem_get_control_parameter(PIP0, cutting_strategy, Cp_value4),
+  Cp_value4 == cutting_strategy_all,
+
+  ppl_PIP_Problem_get_control_parameter(PIP0, pivot_row_strategy, Cp_value5),
+  ppl_PIP_Problem_set_control_parameter(PIP1, Cp_value5),
+  ppl_PIP_Problem_get_control_parameter(PIP1, pivot_row_strategy, Cp_value6),
+  Cp_value5 == Cp_value6,
+  ppl_PIP_Problem_set_control_parameter(PIP0, pivot_row_strategy_first),
+  ppl_PIP_Problem_get_control_parameter(PIP0, pivot_row_strategy, Cp_value7),
+  Cp_value7 == pivot_row_strategy_first,
+  ppl_PIP_Problem_set_control_parameter(PIP0, pivot_row_strategy_max_column),
+  ppl_PIP_Problem_get_control_parameter(PIP0, pivot_row_strategy, Cp_value8),
+  Cp_value8 == pivot_row_strategy_max_column,
+ !,
+  ppl_delete_PIP_Problem(PIP0),
+  ppl_delete_PIP_Problem(PIP1).
+
+pip_clear :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP),
+  ppl_PIP_Problem_clear(PIP),
+  ppl_PIP_Problem_space_dimension(PIP, D),
+  D == 0,
+  ppl_PIP_Problem_constraints(PIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_Polyhedron_is_universe(PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_PIP_Problem(PIP).
+
+pip_satisfiable :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem(3, [A >= -1, B >= 5, C >= 0, C =< 3], [C], PIP),
+  ppl_PIP_Problem_is_satisfiable(PIP),
+  ppl_PIP_Problem_add_constraint(PIP, A + B =< 0),
+  \+ ppl_PIP_Problem_is_satisfiable(PIP),
+  !,
+  ppl_delete_PIP_Problem(PIP).
+
+pip_add :-
+  make_vars(4, [A, B, C, D]),
+  clean_ppl_new_PIP_Problem_from_space_dimension(0, PIP),
+  ppl_PIP_Problem_add_space_dimensions_and_embed(PIP, 1, 0),
+  ppl_PIP_Problem_add_constraint(PIP, A >= 0),
+  ppl_PIP_Problem_add_space_dimensions_and_embed(PIP, 2, 1),
+  ppl_PIP_Problem_add_constraints(
+    PIP, [A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+  clean_ppl_new_PIP_Problem(
+    4, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [D], PIP1),
+  ppl_PIP_Problem_constraints(PIP, CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+  ppl_PIP_Problem_constraints(PIP1, Expect_CS),
+  clean_ppl_new_Polyhedron_from_constraints(c, Expect_CS, Expect_PH),
+  ppl_Polyhedron_equals_Polyhedron(PH, Expect_PH),
+  !,
+  ppl_delete_Polyhedron(PH),
+  ppl_delete_Polyhedron(Expect_PH),
+  ppl_delete_PIP_Problem(PIP),
+  ppl_delete_PIP_Problem(PIP1).
+
+pip_set :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [B], PIP),
+  \+ ppl_PIP_Problem_has_big_parameter_dimension(PIP, _X),
+  ppl_PIP_Problem_solve(PIP, optimized),
+  !,
+  ppl_delete_PIP_Problem(PIP),
+
+  make_vars(4, [X, Y, P, M]),
+  clean_ppl_new_PIP_Problem(
+    4, [Y - M >= -2*X + 2*M - 4, 2*Y - 2*M =< X - M + 2*P], [P, M], PIP1),
+  ppl_PIP_Problem_set_big_parameter_dimension(PIP1, 3),
+  ppl_PIP_Problem_has_big_parameter_dimension(PIP1, 3),
+  ppl_PIP_Problem_solve(PIP1, optimized),
+  !,
+  ppl_delete_PIP_Problem(PIP1).
+
+pip_solve :-
+  make_vars(3, [A, B, C]),
+  clean_ppl_new_PIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [B], PIP),
+  ppl_PIP_Problem_solve(PIP, Status),
+  Status == optimized,
+  clean_ppl_new_PIP_Problem(
+    3, [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], [B,C], PIP1),
+  ppl_PIP_Problem_add_constraint(PIP1, C >= 6),
+  ppl_PIP_Problem_solve(PIP1, Status1),
+  Status1 == unfeasible,
+  ppl_PIP_Problem_add_constraint(PIP, B = 0),
+  ppl_PIP_Problem_solve(PIP, unfeasible),
+  \+ppl_PIP_Problem_solve(PIP, invalid_status),
+  !,
+  ppl_delete_PIP_Problem(PIP),
+  ppl_delete_PIP_Problem(PIP1).
+
+pip_solution :-
+  make_vars(4, [I, J, M, N]),
+  clean_ppl_new_PIP_Problem(
+    4, [3*J >= -2*I + 8, J =< 4*I - 4, J =< M, I =< N], [M,N], PIP),
+  ppl_PIP_Problem_solution(PIP, Node),
+  ppl_PIP_Tree_Node_artificials(Node, Artificials),
+  Artificials = [],
+  \+ ppl_PIP_Tree_Node_is_solution(Node),
+  ppl_PIP_Tree_Node_constraints(Node, _CS),
+  ppl_PIP_Tree_Node_is_decision(Node),
+  ppl_PIP_Tree_Node_constraints(Node, _CS1),
+  ppl_PIP_Tree_Node_true_child(Node, TChild),
+  ppl_PIP_Tree_Node_false_child(Node, _FChild),
+  ppl_PIP_Tree_Node_is_decision(TChild),
+  ppl_PIP_Tree_Node_true_child(TChild, TTChild),
+  \+ ppl_PIP_Tree_Node_is_decision(TTChild),
+  ppl_PIP_Tree_Node_is_solution(TTChild),
+  ppl_PIP_Tree_Node_parametric_values(TTChild, I, _TPV),
+  ppl_PIP_Tree_Node_false_child(TChild, FTChild),
+  ppl_PIP_Tree_Node_artificials(FTChild, FTChild_Artificials),
+  FTChild_Artificials = [Art_LinExpr/Art_Den],
+  compare_lin_expressions(Art_LinExpr, M),
+  Art_Den = 2,
+  ppl_PIP_Tree_Node_is_solution(FTChild),
+  ppl_PIP_Tree_Node_parametric_values(FTChild, I, _FPV),
+  ppl_PIP_Problem_OK(PIP),
+  ppl_PIP_Tree_Node_OK(Node),
+  !,
+  ppl_delete_PIP_Problem(PIP).
+
+%%%%%%%%%%%%%%%% Tool to compare linear expressions %%%%%%%%%%%%%%%%%%%%%%%
+
+% compare_lin_expressions/2 checks if 2 linear expressions
+% are semantically the same.
+%
+% If we need to compare 2 linear expressions, then this is better
+% than a syntactic check- since we want 1*C equal to C.
+
+compare_lin_expressions(LE1, LE2) :-
+  clean_ppl_new_Polyhedron_from_constraints(c, [LE1 = 0], PH1),
+  clean_ppl_new_Polyhedron_from_constraints(c, [LE2 = 0], PH2),
+  ppl_Polyhedron_equals_Polyhedron(PH1, PH2),
+  !,
+  ppl_delete_Polyhedron(PH1),
+  ppl_delete_Polyhedron(PH2).
+
+%%%%%%%%%%%%%%%% Check C++ <--> Prolog numbers %%%%%%%%%%%%%%%%%%%%%%%
+
+/*
+ This test checks the transfer of large numbers between Prolog and C++.
+ We test all numbers (BigNum) which are +/- (2^E +/- A) where E is one of
+ the numbers in the list defined by large_integers_exponents/1 and
+ A is one of the numbers in the list defined by large_integers_additions/1.
+
+ Thus we pass a BigNum from the Prolog to C++ and construct a polyhedron
+ P (space dimension = 1) consisting of a single point A = BigNum.
+ We also get the constraint defining P and then construct a second
+ polyhedron P1 from this constraint; P is then compared with P1.
+ To ensure that errors from Prolog to C++ and C++ to Prolog do not cancel
+ each other out, we also construct a polyhedron P2 consisting of just
+ the point A = 1 and use affine transformations (on polyhedra) to change P2
+ to a polyhedron with the point A = BigNum; then P2 is compared with P.
+
+ To see exactly which numbers are tested, first make the test "extra noisy"
+ using make_extra_noisy/0; i.e., type:
+ make_extra_noisy, large_integers.
+*/
+
+large_integers_exponents([0, 7, 8, 15, 16, 27, 28, 29, 30, 31, 32, 63, 64]).
+
+large_integers_additions([-3, -2, -1, 0, 1, 2, 3]).
+
+large_integers :-
+  large_integers_exponents(Exps),
+  large_integers_additions(Adds),
+  out(large_int, init),
+  pl_check_prolog_flag(bounded, Y),
+  (Y == true ->
+     large_integers_prolog_cpp_bounded(Exps, Adds, 0),
+     out(sys_large_int, init),
+     large_integers_sys_prolog_cpp(Adds)
+   ;
+     large_integers_prolog_cpp_unbounded(Exps, Adds)
+  ).
+
+large_integers_prolog_cpp_bounded([], _, _).
+large_integers_prolog_cpp_bounded([Exp|Exps], Adds, Prev_value) :-
+  /* If the test value is too large, it may be wrap.
+     So we compare it with the previous value that was ok
+     as well as checking it against the maximum value. */
+  Test_value is 1 << Exp + 3,
+  ( ( Test_value =< Prev_value ;
+      (pl_check_prolog_flag(max_integer, Max_int),
+         Max_int >> 1 =< Test_value)
+    ) ->
+     true
+   ;
+     large_integers_prolog_cpp1(Adds, Exp),
+     large_integers_prolog_cpp_bounded(Exps, Adds, Test_value)
+  ).
+
+large_integers_prolog_cpp_unbounded([], _).
+large_integers_prolog_cpp_unbounded([Exp|Exps], Adds) :-
+   large_integers_prolog_cpp1(Adds, Exp),
+   large_integers_prolog_cpp_unbounded(Exps, Adds).
+
+large_integers_prolog_cpp1([], _).
+large_integers_prolog_cpp1([Add|Adds], Exp) :-
+  large_integers_prolog_cpp2(Exp, Add, 1),
+  large_integers_prolog_cpp2(Exp, Add, -1),
+  large_integers_prolog_cpp1(Adds, Exp).
+
+large_integers_prolog_cpp2(Exp, Add, Sign) :-
+  Inhomo is Sign * ((1 << Exp) + Add),
+  out(large_int, Inhomo, Sign, Add, Exp),
+  make_vars(1, [A]),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A = Inhomo]),
+  ppl_Polyhedron_get_constraints(P, CS),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, CS),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P2),
+  ppl_Polyhedron_add_constraint(P2, A = 1),
+  large_integers_affine_transform_loop(Exp, P2, A),
+  ppl_Polyhedron_affine_image(P2, A, Sign * (A + Add), 1),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+large_integers_sys_prolog_cpp([]).
+large_integers_sys_prolog_cpp([Add|Adds]) :-
+  pl_check_prolog_flag(max_integer, Max_int),
+  pl_check_prolog_flag(min_integer, Min_int),
+  Max is Max_int-3,
+  Min is Min_int+3,
+  large_integers_sys_prolog_cpp2(Max, Add, 1),
+  large_integers_sys_prolog_cpp2(Min, Add, -1),
+  large_integers_sys_prolog_cpp(Adds).
+
+large_integers_sys_prolog_cpp2(MaxMin, Add, Sign) :-
+  make_vars(1, [A]),
+  Inhomo is MaxMin + Sign* Add,
+  out(sys_large_int, Inhomo),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P),
+  ppl_Polyhedron_add_constraints(P, [A = Inhomo]),
+  ppl_Polyhedron_get_constraints(P, CS),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P1),
+  ppl_Polyhedron_add_constraints(P1, CS),
+  ppl_Polyhedron_equals_Polyhedron(P, P1),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 1, universe, P2),
+  InhomoDiv2 is Inhomo // 2,
+  InhomoMod2 is Inhomo mod 2,
+  ppl_Polyhedron_add_constraint(P2, A = InhomoDiv2),
+  ppl_Polyhedron_affine_image(P2, A, 2*A + Sign* InhomoMod2, 1),
+  ppl_Polyhedron_equals_Polyhedron(P, P2),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+large_integers_affine_transform_loop(0, _P, _).
+large_integers_affine_transform_loop(Exp, P, A) :-
+  Exp >= 1,
+  ppl_Polyhedron_affine_image(P, A, 2*A, 1),
+  Exp1 is Exp - 1,
+  large_integers_affine_transform_loop(Exp1, P, A).
+
+%%%%%%%%%%%%%%%%% Exceptions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% exceptions/0 tests both Prolog and C++ exceptions using:
+%
+% exception_prolog(+N, +V)
+% exception_sys_prolog(+N, +V)
+% exception_cplusplus(+N, +V)
+%
+% N is the number of the test while V is a list of 3 PPL variables
+%
+% In exceptions/0, the calls to these predicates should fail
+% so that all the tests are tried on backtracking.
+% When all the tests have been tried,
+% (and, for the Prolog interface, providing the correct
+% exception message),
+% the call to exceptions/0 succeeds.
+% If one of the tests succeeds or a Prolog interface exception
+% has a wrong exception message, then exceptions/0 will fail.
+
+exceptions :-
+   pl_check_prolog_flag(bounded, Y),
+   make_vars(3, V),
+   exception_prolog(V),
+   ((Y == true,\+prolog_system('XSB'))  -> exception_sys_prolog(V) ; true),
+   exception_cplusplus(V),
+   !.
+exceptions :-
+   prolog_system('XSB').
+
+%% TEST: Prolog_unsigned_out_of_range
+exception_yap :-
+     I = 21474836470, J = 3, K = 0,
+     ppl_new_C_Polyhedron_from_generators(
+        [point('$VAR'(I)),point('$VAR'(J))], P),
+     ppl_Polyhedron_get_generators(P, GS),
+     nl, write(GS), nl,
+     ppl_new_C_Polyhedron_from_generators(
+        [point('$VAR'(I)),point('$VAR'(K))], P1),
+     ppl_Polyhedron_get_generators(P1, GS1),
+     nl, write(GS1), nl,
+     ppl_delete_Polyhedron(P),
+     ppl_delete_Polyhedron(P1).
+
+% exception_prolog(+N, +V) checks exceptions thrown by the Prolog interface.
+% It does not check those that are dependent on a specific Prolog system.
+
+exception_prolog(V) :-
+   exception_prolog1(14, V).
+
+exception_prolog1(0, _) :- !.
+exception_prolog1(N, V) :-
+   exception_prolog(N, V),
+   N1 is N - 1,
+   exception_prolog1(N1, V).
+
+%% TEST: Prolog_unsigned_out_of_range.
+%% This test accepts any one of three exceptions:
+%% ppl_invalid_argument: with a 32 bit system, the number 1 << 59 is expected
+%%                       to throw this Prolog exception;
+%% out_of_memory:        with a 64 bit system, the number 1 << 59 does not
+%%                       throw an exception on the Prolog side, but the
+%%                       large number of dimensions will cause a bad_alloc
+%%                       exception in C++.
+%%
+exception_prolog(1, _) :-
+    pl_check_prolog_flag(bounded, Y),
+   (Y == true ->
+     true
+    ;
+     (I is 1 << 59,
+        must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(I))], _),
+                   prolog_exception_error)
+      )
+   ).
+
+%% TEST: not_unsigned_integer
+exception_prolog(2, _) :-
+  must_catch(ppl_new_C_Polyhedron_from_space_dimension(n, universe, _),
+             ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_space_dimension(-1, universe,  _),
+             ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(n))], _),
+             ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(-1))], _),
+             ppl_invalid_argument).
+
+%% TEST: not_unsigned_integer
+exception_prolog(3, _) :-
+    must_catch(ppl_set_timeout(-1), ppl_invalid_argument).
+
+%% TEST: not_unsigned_integer
+exception_prolog(4, _) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, Q),
+  must_catch(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
+             Q, P, -1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_H79_widening_assign_with_tokens(
+             Q, P, -1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+             Q, P, [], -1, _), ppl_invalid_argument),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+%% TEST: non_linear
+exception_prolog(5, [A,B,C]) :-
+  must_catch(ppl_new_C_Polyhedron_from_generators([point(B + A*C)], _),
+             ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+                     [point(C), ray(B + C, 1)], _), ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+                     [point], _), ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+                     [point(_D)], _), ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+                     [_E >= 3], _), ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+                     [A*B = 0], _), ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+                     [A], _), ppl_invalid_argument).
+
+%% TEST: not_a_variable
+exception_prolog(6, [A,_,_]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, universe, P),
+  must_catch(ppl_Polyhedron_remove_space_dimensions(P, [A,1]),
+             ppl_invalid_argument),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%% TEST: not_an_integer
+exception_prolog(7, [A,B,_]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A + B), ray(A), ray(B)], P),
+  must_catch(ppl_Polyhedron_affine_image(P, A, A + B + 1, i),
+             ppl_invalid_argument),
+  !,
+  ppl_delete_Polyhedron(P).
+
+%% TEST: not_a_polyhedron_handle
+exception_prolog(8, _) :-
+  must_catch(ppl_Polyhedron_space_dimension(_, _N), ppl_invalid_argument).
+
+%% TEST: not_a_complexity_class
+exception_prolog(9, [A, _, _]) :-
+   clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A)], P),
+   must_catch(
+     clean_ppl_new_Polyhedron_from_Polyhedron_with_complexity(a, c, P,
+                                                              c, _P_copy),
+              ppl_invalid_argument),
+   !,
+   ppl_delete_Polyhedron(P).
+
+%% TEST: not_universe_or_empty
+exception_prolog(10, _) :-
+  must_catch(ppl_new_C_Polyhedron_from_space_dimension(3, xxx, _),
+             ppl_invalid_argument).
+
+%% TEST: not_relation
+exception_prolog(11, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A)], P),
+  must_catch(ppl_Polyhedron_generalized_affine_image(P, A, x, A + 1, 1),
+             ppl_invalid_argument),
+  must_catch(
+     ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x, A + 1),
+             ppl_invalid_argument),
+  must_catch(
+     ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1),
+             ppl_invalid_argument),
+   !,
+   ppl_delete_Polyhedron(P).
+
+%% TEST: not_a_nil_terminated_list
+exception_prolog(12, [A, B, C]) :-
+  must_catch(ppl_new_C_Polyhedron_from_generators(
+     [point(A + B + C, 1) | not_a_list], _), ppl_invalid_argument),
+  must_catch(ppl_new_C_Polyhedron_from_constraints(
+     [A = 0, B >= C | not_a_list], _), ppl_invalid_argument),
+  clean_ppl_new_Polyhedron_from_space_dimension(nnc, 3, universe, P),
+  must_catch(ppl_Polyhedron_add_constraints(P, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_add_constraints(P, not_a_list),
+             ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_add_generators(P, not_a_list),
+             ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_add_generators(P, _), ppl_invalid_argument),
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 3, empty, Q),
+  must_catch(ppl_Polyhedron_map_space_dimensions(Q, not_a_list),
+             ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_fold_space_dimensions(Q, not_a_list, B),
+             ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_remove_space_dimensions(Q, not_a_list),
+             ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign(
+             Q, P, not_a_list), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign(
+             Q, P, not_a_list), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(
+             Q, P, not_a_list), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(
+             Q, P, not_a_list), ppl_invalid_argument),
+  must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+             Q, P, not_a_list, 1, _), ppl_invalid_argument),
+  !,
+  ppl_delete_Polyhedron(P),
+  ppl_delete_Polyhedron(Q).
+
+%% TEST: not_an_mip_problem_handle
+exception_prolog(13, _) :-
+  must_catch(ppl_MIP_Problem_space_dimension(_, _N), ppl_invalid_argument),
+  must_catch(ppl_MIP_Problem_constraints(p, []), ppl_invalid_argument).
+
+%% TEST: not_an_pip_problem_handle
+exception_prolog(14, _) :-
+  must_catch(ppl_PIP_Problem_space_dimension(_, _N), ppl_invalid_argument),
+  must_catch(ppl_PIP_Problem_constraints(p, []), ppl_invalid_argument).
+
+% exception_sys_prolog(+N, +V) checks exceptions thrown by Prolog interfaces
+% that are dependent on a specific Prolog system.
+% These are only checked if current_prolog_flag(bounded, true) holds.
+
+exception_sys_prolog(V) :-
+   exception_sys_prolog1(4, V).
+
+exception_sys_prolog1(0, _) :- !.
+exception_sys_prolog1(N, V) :-
+   exception_sys_prolog(N, V),
+   N1 is N - 1,
+   exception_sys_prolog1(N1, V).
+
+exception_sys_prolog(1, [A,B,_]) :-
+  pl_check_prolog_flag(max_integer, Max_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_constraints(c,
+               [Max_Int * A - B =< 0, 3 >= A], P),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS),
+                ppl_sys_prolog_error),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+ exception_sys_prolog(2, [A,B,_]) :-
+  pl_check_prolog_flag(min_integer, Min_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_constraints(c,
+               [Min_Int * A - B =< 0, 2 >= A], P),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS),
+                ppl_sys_prolog_error),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+exception_sys_prolog(3, [A,B,_]) :-
+  pl_check_prolog_flag(max_integer, Max_Int),
+  catch((
+          clean_ppl_new_Polyhedron_from_generators(c,
+               [point(Max_Int * A + B)], P),
+          ppl_Polyhedron_affine_image(P, A, A + 1, 1),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS),
+                ppl_sys_prolog_error),
+          !,
+          ppl_delete_Polyhedron(P)
+        ),
+        ppl_overflow_error(Cause),
+        check_exception_term(ppl_overflow_error(Cause))
+       ).
+
+exception_sys_prolog(4, [A,_,_]) :-
+   pl_check_prolog_flag(min_integer, Min_Int),
+   catch((
+          clean_ppl_new_Polyhedron_from_generators(c,
+                                                   [point(Min_Int*A)], P),
+          ppl_Polyhedron_affine_image(P, A, A - 1, 1),
+          must_catch(ppl_Polyhedron_get_generators(P, _GS),
+                     ppl_sys_prolog_error),
+          !,
+          ppl_delete_Polyhedron(P)
+         ),
+         ppl_overflow_error(Cause),
+         check_exception_term(ppl_overflow_error(Cause))
+        ).
+
+% exception_cplusplus(+N, +V) checks exceptions thrown by the C++
+% interface for the PPL.
+
+exception_cplusplus(V) :-
+   exception_cplusplus1(10, V).
+
+exception_cplusplus1(0, _) :- !.
+exception_cplusplus1(N, V) :-
+   exception_cplusplus(N, V),
+   N1 is N - 1,
+   exception_cplusplus1(N1, V).
+
+exception_cplusplus(1, [A, B, C]) :-
+  must_catch(ppl_new_C_Polyhedron_from_generators([point(A + B + C, 0)], _),
+             cpp_error).
+
+exception_cplusplus(2, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A + B), ray(A), ray(B)], P),
+  must_catch(ppl_Polyhedron_affine_image(P, A, A + B + 1, 0),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(3, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_space_dimension(c, 0, universe, P1),
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(A + B)], P2),
+  must_catch(ppl_Polyhedron_poly_hull_assign(P1, P2),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P1),
+  ppl_delete_Polyhedron(P2).
+
+exception_cplusplus(4, [A, B, C]) :-
+   must_catch(ppl_new_C_Polyhedron_from_generators([line(A + B + C)], _),
+             cpp_error).
+
+exception_cplusplus(5, [A,B,C]) :-
+  clean_ppl_new_Polyhedron_from_generators(c, [point(B + 2*C)], P),
+  ppl_Polyhedron_remove_space_dimensions(P, [C]),
+  must_catch(ppl_Polyhedron_remove_space_dimensions(P, [A, C]),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(6, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_constraints(c,
+               [A >= 1], P),
+  must_catch(ppl_Polyhedron_affine_image(P, B, A + 1, 1),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(7, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_constraints(c,
+               [A >= 1, B>= 1], P),
+  must_catch(ppl_Polyhedron_affine_image(P, B, A + C + 1, 1),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(8, [A, B, _]) :-
+  clean_ppl_new_Polyhedron_from_constraints(c,
+               [A >= B], P),
+  must_catch(ppl_Polyhedron_affine_preimage(P, A, A + B + 1, 0),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+exception_cplusplus(9, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(0), ray(A + B), ray(A)], P),
+  must_catch(ppl_Polyhedron_affine_preimage(P, C, A + 1, 1),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+
+exception_cplusplus(10, [A, B, C]) :-
+  clean_ppl_new_Polyhedron_from_generators(c,
+               [point(0), point(A), line(A + B)], P),
+  must_catch(ppl_Polyhedron_affine_preimage(P, B, A + C, 1),
+             cpp_error),
+  !,
+  ppl_delete_Polyhedron(P).
+
+% must_catch(+Call) calls Call using catch and checks exception.
+% If expected exception is caught, it succeeds and fails if not.
+
+must_catch(Call, prolog_exception_error) :-
+    !,
+    catch( Call, Message, format_exception_message( Message ) ),
+    ( \+var(Message) ->
+        ((
+          Message =.. [ppl_invalid_argument|_]
+         ;
+          Message =.. [ppl_length_error|_]
+         ;
+          Message = out_of_memory
+         ) ->
+            true
+        ;
+            check_exception_term(Message)
+        )
+    ;
+        fail
+    ).
+must_catch(Call, cpp_error) :-
+    !,
+    catch( Call, Message, format_exception_message( cpp_error(Message) ) ),
+    ( ( \+ var(Message),
+          functor(Message, ppl_invalid_argument, _) ) ->
+        true
+    ;
+        fail
+    ).
+must_catch(Call, ppl_sys_prolog_error) :-
+    !,
+    catch( Call, Message, format_exception_message(Message) ),
+    ( ( \+ var(Message),
+          (Message =.. [ppl_representation_error|_] )) ->
+        true
+    ;
+        fail
+    ).
+must_catch(Call, Expected) :-
+    catch(Call, Message, format_exception_message(Message) ),
+    (\+ var(Message), Message = ppl_overflow_error(_) ->
+        true
+    ;
+        ( \+ var(Message), Message =.. [Expected|_] ->
+            true
+        ;
+            fail
+        )
+    ).
+
+%%%%%%%%%%%% predicate for making list of ppl variables %%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I =< Dimension.
+
+make_vars(Dim, Var_List):-
+  make_var_list(0, Dim, Var_List).
+make_var_list(Dim,Dim,[]):- !.
+make_var_list(I,Dim,['$VAR'(I)|Var_List]):-
+  I1 is I + 1,
+  make_var_list(I1,Dim,Var_List).
+
+%%%%%%%%%%%% predicate for safely deleting polyhedra on failure %
+
+cleanup_ppl_Polyhedron(_).
+cleanup_ppl_Polyhedron(P) :-
+  out(cs, P),
+  out(gs, P),
+  ppl_delete_Polyhedron(P), fail.
+
+cleanup_ppl_Polyhedra([]).
+cleanup_ppl_Polyhedra([_|_]).
+cleanup_ppl_Polyhedra([P|Ps]) :-
+  delete_all_ppl_Polyhedra([P|Ps]).
+
+delete_all_ppl_Polyhedra([]).
+delete_all_ppl_Polyhedra([P|Ps]) :-
+  ppl_delete_Polyhedron(P),
+  delete_all_ppl_Polyhedra(Ps).
+
+cleanup_ppl_MIP_Problem(_).
+cleanup_ppl_MIP_Problem(MIP) :-
+  out(mip, MIP),
+  ppl_delete_MIP_Problem(MIP), fail.
+
+cleanup_ppl_PIP_Problem(_).
+cleanup_ppl_PIP_Problem(PIP) :-
+  out(pip, PIP),
+  ppl_delete_PIP_Problem(PIP), fail.
+
+out(cs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Polyhedron_get_constraints(P, CS),
+    nl, write(CS), nl
+  ).
+
+out(gs, P):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_Polyhedron_get_generators(P, GS),
+    nl, write(GS), nl
+  ).
+
+out(mip, MIP):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_MIP_Problem_constraints(MIP, CS),
+    ppl_MIP_Problem_objective_function(MIP, Obj),
+    ppl_MIP_Problem_optimization_mode(MIP, Opt),
+    ppl_MIP_Problem_get_control_parameter(MIP, pricing, Cp_value),
+    nl,
+    write(' constraint system is: '), write(CS), nl,
+    write(' objective function is: '), write(Obj), nl,
+    write(' optimization mode is: '), write(Opt),
+    write(' control_parameter_value is: '), write(Cp_value),
+    nl
+  ).
+
+out(pip, PIP):-
+  ((noisy(N), N < 2) -> true ;
+    ppl_PIP_Problem_constraints(PIP, CS),
+    ppl_PIP_Problem_parameter_space_dimensions(PIP, Dims),
+    ppl_PIP_Problem_get_control_parameter(PIP, cutting_strategy, Cp_value),
+    nl,
+    write(' constraint system is: '), write(CS), nl,
+    write(' parameter space dimensions are: '), write(Dims), nl,
+    write(' control_parameter_value is: '), write(Cp_value),
+    nl
+  ).
+
+out(sys_large_int, init):-
+  !,
+  prolog_system(System),
+  ((noisy(N), N < 2) -> true ;
+    nl, write_all([' At the Prolog/C++ interface, for', System, 'Prolog', nl,
+       ' the extra numbers tested are: ']),
+    nl
+  ).
+
+out(sys_large_int, Num):-
+  ((noisy(N), N < 2) -> true ;
+      write_all([Num, ',  '])
+  ).
+
+out(large_int, init):-
+  !,
+  ((noisy(N), N < 2) -> true ;
+    nl, write(' At the Prolog/C++ interface, the numbers tested are: '),
+    nl
+  ).
+
+out(large_int, Num, Sign, Add, Exp):-
+  ((noisy(N), N < 2) -> true ;
+    write_all([Num, ' = ', Sign, ' * ', '((1 << ', Exp, ') + ', Add, '),  '])
+  ).
+
+%%% predicates for ensuring new polyhedra are always deleted on failure %
+
+clean_ppl_new_Polyhedron_from_space_dimension(T, D, Universe_or_Empty, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_space_dimension(D, Universe_or_Empty, P)
+  ;
+    ppl_new_NNC_Polyhedron_from_space_dimension(D, Universe_or_Empty, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_constraints(T, CS, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_constraints(CS, P)
+   ;
+    ppl_new_NNC_Polyhedron_from_constraints(CS, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_generators(T, GS, P) :-
+  (T = c ->
+    ppl_new_C_Polyhedron_from_generators(GS, P)
+   ;
+    ppl_new_NNC_Polyhedron_from_generators(GS, P)
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_Polyhedron(TQ, Q, TP, P) :-
+  ((TP == c, TQ == c) ->
+    ppl_new_C_Polyhedron_from_C_Polyhedron(Q, P)
+   ;
+    ((TP == c, TQ == nnc) ->
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron(Q, P)
+    ;
+      ((TP == nnc, TQ == c) ->
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron(Q, P)
+      ;
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Q, P)
+      )
+    )
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_Polyhedron_from_Polyhedron_with_complexity(C, TQ, Q, TP, P) :-
+  ((TP == c, TQ == c) ->
+    ppl_new_C_Polyhedron_from_C_Polyhedron_with_complexity(C, Q, P)
+   ;
+    ((TP == c, TQ == nnc) ->
+      ppl_new_C_Polyhedron_from_NNC_Polyhedron_with_complexity(C, Q, P)
+    ;
+      ((TP == nnc, TQ == c) ->
+        ppl_new_NNC_Polyhedron_from_C_Polyhedron_with_complexity(C, Q, P)
+      ;
+        ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_with_complexity(C, Q, P)
+      )
+    )
+  ),
+  cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_MIP_Problem_from_space_dimension(Dim, MIP) :-
+  ppl_new_MIP_Problem_from_space_dimension(Dim, MIP),
+  cleanup_ppl_MIP_Problem(MIP).
+
+clean_ppl_new_MIP_Problem(Dim, CS, Obj, Opt, MIP) :-
+  ppl_new_MIP_Problem(Dim, CS, Obj, Opt, MIP),
+  cleanup_ppl_MIP_Problem(MIP).
+
+clean_ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP) :-
+  ppl_new_MIP_Problem_from_MIP_Problem(MIP1, MIP),
+  cleanup_ppl_MIP_Problem(MIP).
+
+clean_ppl_new_PIP_Problem_from_space_dimension(Dim, PIP) :-
+  ppl_new_PIP_Problem_from_space_dimension(Dim, PIP),
+  cleanup_ppl_PIP_Problem(PIP).
+
+clean_ppl_new_PIP_Problem(Dim, CS, Vars, PIP) :-
+  ppl_new_PIP_Problem(Dim, CS, Vars, PIP),
+  cleanup_ppl_PIP_Problem(PIP).
+
+clean_ppl_new_PIP_Problem_from_PIP_Problem(PIP1, PIP) :-
+  ppl_new_PIP_Problem_from_PIP_Problem(PIP1, PIP),
+  cleanup_ppl_PIP_Problem(PIP).
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+  (retract(noisy(_)) ->
+      make_extra_noisy
+  ;
+      assertz(noisy(2))
+  ).
+
+make_noisy :-
+  (retract(noisy(_)) ->
+      make_noisy
+  ;
+      assertz(noisy(1))
+  ).
+
+make_quiet :-
+  (retract(noisy(_)) ->
+      make_quiet
+   ; assertz(noisy(0))
+  ).
+
+%%%%%%%%%%%% predicates for pretty printing the PPL banner %%%%%%%%%%
+%
+% The banner is read as an atom with"/n" denoting where there should
+% new lines. Here we print the banner as intended with new lines instead
+% of "/n".
+%
+
+banner_pp(B) :-
+  name(B,Bcodes),
+  nl,
+  !,
+  format_banner(Bcodes).
+
+format_banner([]) :- nl.
+format_banner([C]) :- put_code(C), nl.
+format_banner([C,C1|Chars]):-
+  ([C,C1] == "/n" ->
+     (nl,
+     format_banner(Chars))
+   ;
+     (put_code(C),
+     format_banner([C1|Chars]))
+  ).
+
+%%%%%%%%%%%% predicate for handling an unintended exception %%%%
+
+check_exception_term(ppl_overflow_error(Cause)) :-
+  ((Cause == 'Negative overflow.'; Cause == 'Positive overflow.') ->
+    true
+  ;
+    print_exception_term(ppl_overflow_error(Cause))
+  ),
+  !.
+
+print_exception_term(ppl_overflow_error(Cause)) :-
+  nl,
+  write('Error: an overflow has been detected by the PPL: '),
+  write(Cause),
+  nl,
+  !.
+
+print_exception_term(Exception) :-
+  write('exception'), nl,
+  nl,
+  writeq(Exception),
+  nl.
+
+%%%%%%%%%%%% predicate for printing exception messages %%%%%%%%%%
+
+format_exception_message(
+             ppl_invalid_argument( found(F), expected(E), where(W))
+                        ) :-
+  !,
+  display_message(['PPL Prolog Interface Exception:', nl, '   ',
+                   F, 'is an invalid argument for', W, nl, '   ',
+                  F, 'should be', E, '.']).
+
+format_exception_message(ppl_length_error(Error)) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   'ppl_length_error', Error]).
+
+format_exception_message(
+             ppl_representation_error(I, where(W))
+                        ) :-
+  !,
+  display_message(['PPL Prolog Interface Exception:', nl, '   ',
+                   'This Prolog system has bounded integers', nl, '   ',
+                   I, 'is not in the allowed range of integers', nl, '   ',
+                   'in call to', W, '.']).
+
+format_exception_message(out_of_memory) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   'out of memory']).
+
+format_exception_message(ppl_overflow_error(Type)) :-
+  !,
+  display_message(['PPL Prolog Interface Exception: ', nl, '   ',
+                   'ppl_overflow_error: ', Type]).
+
+format_exception_message(cpp_error(Error)) :-
+  !,
+  display_message(['PPL C++ Interface Exception:', nl, '   ', Error]).
+
+format_exception_message(Error) :-
+  display_message(['Unknown exception: ', Error]), fail.
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+   write_all(Message).
+
+display_message(Message):-
+    noisy(_),
+    (noisy(0) -> true ;
+     (nl, write_all(Message))
+    ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+   (Phrase == nl ->
+      nl
+   ;
+      write(Phrase),
+      write(' ')
+   ),
+   write_all(Phrases).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% list_groups(G)
+% The interface predicates are partitioned into related sets called
+% groups and here is a list of the groups.
+
+list_groups( [
+   large_integers,
+   all_versions_and_banner,
+   numeric_bounds,
+   new_polyhedron_from_dimension,
+   new_polyhedron_from_polyhedron,
+   new_polyhedron_from_representations,
+   swap_polyhedra,
+   polyhedron_dimension,
+   basic_operators,
+%   transform_polyhedron,
+   extrapolation_operators,
+   get_system,
+%   add_to_system,
+   revise_dimensions,
+   check_polyhedron,
+   minmax_polyhedron,
+   compare_polyhedra,
+   mip_problem,
+   pip_problem,
+   transform_polyhedron,
+   add_to_system,
+   catch_time,
+   handle_exceptions
+             ] ).
+
+% group_predicates(G, P)
+% P is a list of the interface predicates checked by test for group G.
+% This is used to generate more informative error and exception messages.
+
+group_predicates(all_versions_and_banner,
+  [ppl_version_major/1,
+   ppl_version_minor/1,
+   ppl_version_revision/1,
+   ppl_version_beta/1,
+   ppl_version/1,
+   ppl_banner/1
+  ]).
+
+group_predicates(numeric_bounds,
+  [ppl_max_space_dimension/1,
+   ppl_Coefficient_is_bounded/0,
+   ppl_Coefficient_max/1,
+   ppl_Coefficient_min/1,
+   ppl_set_rounding_for_PPL/0,
+   ppl_restore_pre_PPL_rounding/0
+  ]).
+
+group_predicates(new_polyhedron_from_dimension,
+  [ppl_new_C_Polyhedron_from_space_dimension/4,
+   ppl_new_NNC_Polyhedron_from_space_dimension/4,
+   ppl_Polyhedron_is_universe/1,
+   ppl_Polyhedron_is_empty/1,
+   ppl_delete_polyhedron/1
+  ]).
+
+group_predicates(new_polyhedron_from_polyhedron,
+  [ppl_new_C_Polyhedron_from_C_Polyhedron/3,
+   ppl_new_C_Polyhedron_from_NNC_Polyhedron/3,
+   ppl_new_NNC_Polyhedron_from_C_Polyhedron/3,
+   ppl_new_NNC_Polyhedron_from_NNC_Polyhedron/3,
+   ppl_new_C_Polyhedron_from_constraints/2,
+   ppl_new_NNC_Polyhedron_from_constraints/2,
+   ppl_Polyhedron_equals_Polyhedron/2
+  ]).
+
+group_predicates(new_polyhedron_from_representations,
+  [ppl_new_C_Polyhedron_from_constraints/2,
+   ppl_new_NNC_Polyhedron_from_constraints/2,
+   ppl_new_C_Polyhedron_from_generators/2,
+   ppl_new_NNC_Polyhedron_from_generators/2
+  ]).
+
+group_predicates(swap_polyhedra,
+  [ppl_Polyhedron_swap/2
+  ]).
+
+group_predicates(polyhedron_dimension,
+  [ppl_Polyhedron_affine_dimension/2,
+   ppl_Polyhedron_space_dimension/2,
+   ppl_Polyhedron_constrains/2,
+   ppl_Polyhedron_unconstrain_space_dimension/2,
+   ppl_Polyhedron_unconstrain_space_dimensions/2]).
+
+group_predicates(basic_operators,
+  [ppl_Polyhedron_intersection_assign/2,
+   ppl_Polyhedron_poly_hull_assign/2,
+   ppl_Polyhedron_poly_difference_assign/2,
+   ppl_Polyhedron_time_elapse_assign/2,
+   ppl_Polyhedron_topological_closure_assign/1
+  ]).
+
+group_predicates(add_to_system,
+  [ppl_Polyhedron_add_constraint/2,
+   ppl_Polyhedron_add_generator/2,
+   ppl_Polyhedron_add_constraints/2,
+   ppl_Polyhedron_add_generators/2
+  ]).
+
+group_predicates(revise_dimensions,
+  [ppl_Polyhedron_remove_space_dimensions/2,
+   ppl_Polyhedron_remove_higher_space_dimensions/2,
+   ppl_Polyhedron_expand_space_dimension/3,
+   ppl_Polyhedron_fold_space_dimensions/3,
+   ppl_Polyhedron_map_space_dimensions/2,
+   ppl_Polyhedron_concatenate_assign/2
+  ]).
+
+group_predicates(transform_polyhedron,
+  [ppl_Polyhedron_affine_image/4,
+   ppl_Polyhedron_affine_preimage/4,
+   ppl_Polyhedron_bounded_affine_image/5,
+   ppl_Polyhedron_bounded_affine_preimage/5,
+   ppl_Polyhedron_generalized_affine_image/5,
+   ppl_Polyhedron_generalized_affine_preimage/5,
+   ppl_Polyhedron_generalized_affine_image_lhs_rhs/4,
+   ppl_Polyhedron_generalized_affine_preimage_lhs_rhs/4
+  ]).
+
+group_predicates(extrapolation_operators,
+  [ppl_Polyhedron_BHRZ03_widening_assign_with_token/3,
+   ppl_Polyhedron_BHRZ03_widening_assign/2,
+   ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+   ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+   ppl_Polyhedron_H79_widening_assign_with_token/3,
+   ppl_Polyhedron_H79_widening_assign/2,
+   ppl_Polyhedron_limited_H79_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+   ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token/4,
+   ppl_Polyhedron_bounded_H79_extrapolation_assign/3
+  ]).
+
+group_predicates(get_system,
+  [ppl_Polyhedron_get_constraints/2,
+   ppl_Polyhedron_get_minimized_constraints/2,
+   ppl_Polyhedron_get_generators/2,
+   ppl_Polyhedron_get_minimized_generators/2
+  ]).
+
+group_predicates(check_polyhedron,
+  [ppl_Polyhedron_relation_with_constraint/3,
+   ppl_Polyhedron_relation_with_generator/3,
+   ppl_Polyhedron_is_topologically_closed/1,
+   ppl_Polyhedron_is_universe,
+   ppl_Polyhedron_is_empty,
+   ppl_Polyhedron_is_bounded,
+   ppl_Polyhedron_contains_integer_point,
+   ppl_Polyhedron_contains_Polyhedron/2,
+   ppl_Polyhedron_strictly_contains_Polyhedron/2,
+   ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+   ppl_Polyhedron_equals_Polyhedron/2,
+   ppl_Polyhedron_termination_test_MS/2,
+   ppl_Polyhedron_termination_test_PR/2,
+   ppl_Polyhedron_OK/1
+  ]).
+
+group_predicates(minmax_polyhedron,
+  [ppl_Polyhedron_maximize/5,
+   ppl_Polyhedron_maximize_with_point/6,
+   ppl_Polyhedron_minimize/5,
+   ppl_Polyhedron_minimize_with_point/6
+  ]).
+
+group_predicates(compare_polyhedra,
+  [ppl_Polyhedron_contains_Polyhedron/2,
+   ppl_Polyhedron_strictly_contains_Polyhedron/2,
+   ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+   ppl_Polyhedron_equals_Polyhedron/2
+  ]).
+
+group_predicates(catch_time,
+  [ppl_set_timeout_exception_atom/1,
+   ppl_timeout_exception_atom/1,
+   ppl_set_timeout/1,
+   ppl_reset_timeout/0
+  ]).
+
+group_predicates(mip_problem,
+  ['all MIP_Prolog predicates'
+  ]).
+
+group_predicates(pip_problem,
+  ['all PIP_Prolog predicates'
+  ]).
+
+group_predicates(large_integers,
+  ['large integer tests '
+  ]).
+
+group_predicates(handle_exceptions,
+  'all predicates'' exception handling.'
+  ).
+
+%%%%%%%%%%%%%%%%%%%%%%% System flags %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% pl_check_prolog_flag/2
+% returns true or false (if the 1st argument is 'bounded')
+% or (if the 1st argument is 'max_integer' or  'min_integer')
+% the maximum or minimum integer for Prolog
+% systems that have bounded integers.
+% Note that 268435456 is 2^28.
+
+pl_check_prolog_flag(bounded, TF) :-
+  current_prolog_flag(bounded, TF).
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(max_integer, Max_Int).
+
+pl_check_prolog_flag(max_integer, Max_Int) :-
+  prolog_system('XSB'), Max_Int is 268435455.
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+  \+ prolog_system('XSB'),
+  current_prolog_flag(min_integer, Min_Int).
+
+pl_check_prolog_flag(min_integer, Min_Int) :-
+  prolog_system('XSB'), Min_Int is -268435456.
diff --git a/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4 b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
new file mode 100644
index 0000000..4dd1b2d
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl.m4
@@ -0,0 +1,372 @@
+m4_define(`dnl', `m4_dnl')`'dnl
+m4_divert(-1)
+
+dnl This m4 file generates the test files
+dnl ppl_prolog_generated_test_<CLASS_NAME>.pl using the code in
+dnl ppl_interface_generator_prolog_generated_test_pl_code.m4.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_main.pl << ___END_OF_FILE___
+/* Prolog code for checking all predicates.  -*- C++ -*-
+m4_include(`ppl_interface_generator_copyright')`'dnl
+*/
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Common files are included here
+dnl ==================================================================
+
+m4_include(`ppl_interface_generator_prolog_procedure_generators.m4')
+m4_include(`ppl_interface_generator_prolog_generated_test_pl_code.m4')
+
+dnl  The build represent needs alternative replacements.
+dnl
+dnl  The different kinds of alternative objects that can build
+dnl  the same class so that we can check one build against another.
+m4_define(`m4_a_build_represent_replacements',
+          `generator, congruence, constraint')
+m4_define(`m4_Grid_a_build_represent_replacements',
+         `constraint, grid_generator, congruence')
+m4_define(`m4_Pointset_Powerset_a_build_represent_replacements',
+         `constraint, congruence')
+m4_define(`m4_product_a_build_represent_replacements',
+         `constraint, congruence')
+
+dnl ==================================================================
+dnl Useful macros needed to generate the test code.
+dnl ==================================================================
+
+dnl m4_filter_code(Schema_Code, Procedure_Spec1, Procedure_Spec1...)
+dnl
+m4_define(`m4_filter_code', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+  `m4_ifelse(`$2', `', keep,
+    `m4_ifelse(m4_index($1, `m4_regexp($2, `ppl_[^ /]+', `\&')'), -1,
+      keep, throw)')',
+  `m4_ifelse(m4_index($1, m4_regexp($2, `ppl_[^ /]+', `\&')), -1,
+    `m4_filter_code($1, m4_shift(m4_shift($@)))', throw)')')`'dnl
+
+dnl m4_check_test_usability(Procedure_name,
+dnl                         Procedure_Spec1, Procedure_Spec1...)
+dnl
+m4_define(`m4_check_test_usability', `dnl
+m4_filter_code(m4_indir($1_code),
+  m4_filter_all_procedures($2, 0, m4_procedure_list))`'dnl
+')
+dnl
+dnl
+dnl ==================================================================
+dnl Now generate the test code.
+dnl ==================================================================
+dnl
+dnl
+dnl ==================================================================
+dnl Generate code for the include statements.
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions needed
+dnl -----------------------------------------------------------------
+dnl
+m4_pushdef(`m4_one_class_code',
+`m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+:- include(QUOTE../tests/ppl_prolog_generated_test_`'m4_current_interface`'.plQUOTE).
+m4_undefine(`m4_current_interface')`'dnl
+')
+dnl
+dnl -----------------------------------------------------------------
+dnl Main call to generate code for the include statements.
+dnl -----------------------------------------------------------------
+dnl
+m4_divert`'dnl
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_main.pl << ___END_OF_FILE___
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%       Include the common code and all class dependent files       %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+:- include('ppl_prolog_generated_test_common.pl').
+:- dynamic(all_class_dependent_predicates/1).
+:- discontiguous(all_class_dependent_predicates/1).
+m4_patsubst(m4_all_code`'m4_changequote(`[*[', `]*]')[*[]*],
+                                        QUOTE, [*[']*])[*[]*]dnl
+m4_changequote`'dnl
+m4_popdef(`m4_one_class_code')`'dnl
+dnl
+dnl ==================================================================
+dnl Generate code for the top-level call
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+dnl
+m4_pushdef(`m4_one_class_code', `
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+test_`'m4_current_interface`'COMMA`'dnl
+m4_undefine(`m4_current_interface')`'dnl
+')
+dnl
+dnl -----------------------------------------------------------------
+dnl Main call to generate code
+dnl -----------------------------------------------------------------
+m4_define(`m4_gen_code', m4_all_code)
+m4_divert`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%                       Main call for tests                         %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+check_all :-
+  (noisy(_) -> true; make_quiet),
+  ppl_initialize, `'dnl
+m4_patsubst(m4_gen_code, COMMA, `,')
+  ppl_finalize.
+m4_popdef(`m4_one_class_code')`'dnl
+dnl ==================================================================
+dnl Generate code for defining test_<class_name>.
+dnl ==================================================================
+dnl
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+m4_divert(-1)`'dnl
+m4_include(`ppl_interface_generator_prolog_systems.m4')dnl
+m4_define(`m4_start1', 0)`'dnl
+m4_pushdef(`m4_check_test_usability', keep)`'dnl
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifdef(`$1_code',
+         `m4_ifelse(m4_check_test_usability($1, $5), keep,
+                    `m4_ifelse(m4_start1, 0,
+                      `m4_undefine(`m4_start1')  ', `
+')'  ``  '($1_$2_test
+      -> (!COMMA write_error($1))
+      ;  write_success($1))COMMA
+`  '')')`'dnl
+')`'dnl
+dnl
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%                       Main call for tests                         %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+test_`'m4_current_interface :-
+m4_undefine(`m4_current_interface')`'dnl
+')
+m4_pushdef(`m4_post_extra_class_code', `
+  true.
+')
+
+dnl -----------------------------------------------------------------
+dnl Call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_patsubst(m4_all_code, COMMA, `,')`'dnl
+m4_popdef(`m4_expanded_procedure_schema')`'dnl
+m4_popdef(`m4_pre_extra_class_code')`'dnl
+m4_popdef(`m4_post_extra_class_code')`'dnl
+m4_divert(-1)
+
+dnl ==================================================================
+dnl Generate code for the declarations
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra definitions
+dnl -----------------------------------------------------------------
+
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifdef(`$1_code',
+         `m4_ifelse(m4_check_test_usability($1, $5), keep,
+:- dynamic($1_$2_test/0).
+:- discontiguous($1_$2_test/0).)')
+')`'dnl
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+m4_undefine(`m4_current_interface')`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%                   discontiguous declarations                      %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+')
+
+dnl -----------------------------------------------------------------
+dnl Main call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl ==================================================================
+dnl Generate code for the class dependent predicate tests
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra definitions
+dnl -----------------------------------------------------------------
+m4_include(`ppl_interface_generator_prolog_generated_test_pl_code.m4')
+
+m4_define(`m4_arg_sequence',
+  `m4_ifelse(`$1', 0, ,
+     `Arg1`'m4_ifelse(`$1', 1, ,
+       `m4_forloop(`i', 2, `$1', `m4_separator Arg`'i')')')')
+
+m4_define(`m4_find_name',
+  `m4_regexp($1, `\(ppl_[^ /]+\)', `\1')`'dnl
+')
+
+m4_define(`m4_find_arity',
+  `m4_regexp($1, `ppl_[^ /]+\(.*\)', `m4_get_arity(\1)')`'dnl
+')
+
+
+m4_define(`m4_pre_extra_class_code', `dnl
+m4_pushdef(`m4_current_interface', m4_interface_class`'$1)`'dnl
+m4_pushdef(`m4_current_group', m4_class_group`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+m4_popdef(`m4_current_interface')`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%               class dependent predicate tests                     %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+m4_replace_all_patterns($1, m4_add_build_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_comparison_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_wdn_exn_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_cleanup_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_out_class_code($1))`'dnl
+m4_replace_all_patterns($1, m4_add_out_extra_class_code($1))`'dnl
+')
+
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifdef(`$1_code',
+`m4_ifelse(m4_check_test_usability($1, $5), keep, `
+m4_indir(`$1_code')`'dnl
+')', `')
+')
+
+dnl -----------------------------------------------------------------
+dnl Call to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_all_code`'dnl
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+
+dnl ==================================================================
+dnl Generate code,
+dnl defining the argument of "all_class_dependent_predicates/1",
+dnl a list of all the class dependent predicates that are implemented.
+dnl ==================================================================
+
+dnl -----------------------------------------------------------------
+dnl Extra files and definitions
+dnl -----------------------------------------------------------------
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_define(`m4_current_interface', m4_interface_class`'$1)
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+m4_undefine(`m4_current_interface')`'dnl
+m4_define(`m4_start1', 0)`'dnl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%               class dependent predicate tests                     %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all_class_dependent_predicates(
+  [
+  ')
+
+m4_pushdef(`m4_post_extra_class_code', `
+  ]
+).
+')
+m4_define(`m4_start1', 0)
+
+m4_pushdef(`m4_expanded_procedure_schema', `dnl
+m4_ifelse(m4_start1, 0,
+  `m4_undefine(`m4_start1')', `COMMA
+')  `$1'dnl
+')
+
+dnl -----------------------------------------------------------------
+dnl Main calls to macro m4_all_code to generate code
+dnl -----------------------------------------------------------------
+m4_divert`'dnl
+m4_patsubst(m4_all_code, COMMA, `,')`'dnl
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+m4_popdef(`m4_post_extra_class_code')
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                   %
+%               build using cleanup code                            %
+%                                                                   %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+m4_pushdef(`m4_pre_extra_class_code', `dnl
+m4_pushdef(`m4_current_interface', m4_interface_class`'$1)`'dnl
+
+___END_OF_FILE___
+___BEGIN_OF_FILE___ ppl_prolog_generated_test_`'m4_current_interface.pl << ___END_OF_FILE___
+')
+m4_pushdef(`m4_post_extra_class_code', `')
+m4_pushdef(`m4_expanded_procedure_schema', `
+m4_ifelse(m4_index($1, new), `-1', ,
+   clean_$1`'m4_ifelse($2, 0, , `(`'m4_arg_sequence($2))') :-
+   ($1`'m4_ifelse($2, 0, , `(`'m4_arg_sequence($2))'),
+   ppl_cleanup_`'m4_current_interface`'(Arg`'$2)).
+
+)`'dnl
+')
+
+m4_divert`'dnl
+m4_all_code
+___END_OF_FILE___
+m4_divert(-1)
+m4_popdef(`m4_expanded_procedure_schema')
+m4_popdef(`m4_pre_extra_class_code')
+dnl End of file generation.
diff --git a/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4 b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
new file mode 100644
index 0000000..60b940c
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_interface_generator_prolog_generated_test_pl_code.m4
@@ -0,0 +1,1974 @@
+m4_divert(-1)
+
+dnl This m4 file contains the code for generating the test files
+dnl ppl_prolog_generated_test_<CLASS_NAME>.pl, which test
+dnl the generated Prolog interface predicates
+dnl and the main file ppl_prolog_generated_test_main.pl.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+m4_define(`m4_add_build_class_code', `dnl
+ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim) :-
+  (clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Dim, universe, PS),
+  ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER at s, RS),
+  ppl_ at CLASS@_refine_with_ at CONSTRAINER@s(PS, RS)).
+
+')
+
+m4_define(`m4_add_comparison_class_code', `dnl
+ppl_ at CLASS@_comparison_check(is_disjoint_from, PS1, PS2, Result) :-
+  (
+   ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+   ppl_ at CLASS@_intersection_assign(PS1_Copy, PS2),
+   (ppl_ at CLASS@_is_empty(PS1_Copy)
+   ->
+    Result = true
+   ;
+    Result = false
+   ),
+   ppl_delete_ at CLASS@(PS1_Copy)
+  ).
+
+ppl_ at CLASS@_comparison_check(contains, PS1, PS2, Result) :-
+  (
+   ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+   ppl_ at CLASS@_intersection_assign(PS1_Copy, PS2),
+   (ppl_ at CLASS@_equals_ at CLASS@(PS1_Copy, PS2)
+   ->
+    Result = true
+   ;
+    Result = false
+   ),
+  ppl_delete_ at CLASS@(PS1_Copy)
+  ).
+
+ppl_ at CLASS@_comparison_check(strictly_contains, PS1, PS2, Result) :-
+  (
+   (ppl_ at CLASS@_equals_ at CLASS@(PS1, PS2)
+   ->
+     Result = false
+   ;
+     ppl_ at CLASS@_comparison_check(contains, PS1, PS2, Result)
+   )
+  ).
+
+ppl_ at CLASS@_comparison_check(geometrically_covers, _PS1, _PS2, _).
+
+ppl_ at CLASS@_comparison_check(geometrically_equals, _PS1, _PS2, _).
+
+')
+
+m4_define(`m4_add_wdn_exn_class_code', `dnl
+ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy) :-
+  (
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+     ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2_Copy)
+  ).
+
+ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy, PS2, PS2_Copy,
+                                           T, T1) :-
+  (
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1a, PS1_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1a, PS1),
+     ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2_Copy),
+     (T == 1
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1a)
+     ;
+       T == 0,
+       ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_Copy)
+     ),
+     T1 == 0,
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1a),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1a),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2_Copy)
+  ).
+
+')
+
+m4_define(`m4_add_cleanup_class_code', `dnl
+ppl_cleanup_ at CLASS@(_).
+ppl_cleanup_ at CLASS@(P) :-
+  (out_ at CLASS@(P), fail).
+
+ppl_cleanup_all_ at CLASS@([]).
+ppl_cleanup_all_ at CLASS@([_|_]).
+ppl_cleanup_all_ at CLASS@([P|Ps]) :-
+  ppl_delete_all_ at CLASS@([P|Ps]).
+
+ppl_delete_all_ at CLASS@([]).
+ppl_delete_all_ at CLASS@([P|Ps]) :-
+  (ppl_delete_ at CLASS@(P),
+  ppl_delete_all_ at CLASS@(Ps)).
+
+')
+
+m4_define(`m4_add_out_class_code', `dnl
+out_ at CLASS@(P):-
+  ((noisy(N), N < 2) -> true ;
+    m4_ifelse(m4_current_group, pointset_powerset,
+      `display_message([nl, @!CLASS@, P, representation,
+                       cannot ,be, displayed, nl]),',
+              m4_current_group, product,
+      `display_message([nl, @!CLASS@, P, representation,
+                       cannot ,be, displayed, nl]),',
+`     ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(P, RS),
+      display_message([nl, @CLASS_REPRESENT at s, are, nl, RS, nl]),')
+    fail
+  ).
+
+')
+
+m4_define(`m4_add_out_extra_class_code', `dnl
+out_ at CLASS@(P) :-
+  ppl_delete_ at CLASS@(P).
+
+')
+
+dnl Note that to avoid m4 treating commas as m4 argument separators,
+dnl all tests must be between `(' and `)'.
+m4_divert(-1)
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension_3_test :-
+  (
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(0, empty, PS),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, empty, PS1),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(0, universe, PS2),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, universe, PS3),
+   ppl_delete_ at CLASS@(PS),
+   ppl_delete_ at CLASS@(PS1),
+   ppl_delete_ at CLASS@(PS2),
+   ppl_delete_ at CLASS@(PS3)
+  ->
+   fail ; true).
+
+')
+
+m4_define(`ppl_C_Polyhedron_OK', ppl_Polyhedron_OK`'$1)
+m4_define(`ppl_NNC_Polyhedron_OK', ppl_Polyhedron_OK`'$1)
+
+m4_define(`ppl_delete_C_Polyhedron', ppl_delete_Polyhedron`'$1)
+m4_define(`ppl_delete_NNC_Polyhedron', ppl_delete_Polyhedron`'$1)
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _2_test :-
+  (
+   clean_ppl_new_ at FRIEND@_from_space_dimension(0, universe, PS),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(PS, PS1),
+   ppl_ at FRIEND@_OK(`(PS)'),
+   ppl_ at CLASS@_OK(PS1),
+   ppl_delete_ at FRIEND@(`(PS)'),
+   ppl_delete_ at CLASS@(PS1)
+  ->
+   fail ; true).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity_2_test :-
+  (
+   clean_ppl_new_ at FRIEND@_from_space_dimension(0, universe, PS),
+   clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@(PS, PS1),
+   ppl_ at FRIEND@_OK(`(PS)'),
+   ppl_ at CLASS@_OK(PS1),
+   ppl_delete_ at FRIEND@(`(PS)'),
+   ppl_delete_ at CLASS@(PS1)
+  ->
+   fail ; true).
+
+')
+
+m4_define(`ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_code',
+`
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s_2_test :-
+  (
+   member(TEST_DATA, [test00, test02, test03, test04, test05]),
+   (
+    ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@,
+                        @BUILD_REPRESENT at s, RS1),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s(RS1, PS1),
+    ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@,
+                        @A_BUILD_REPRESENT at s, RS1a),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@A_BUILD_REPRESENT at s(RS1a, PS1a),
+%%    ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1a),
+    ppl_delete_ at CLASS@(PS1),
+    ppl_delete_ at CLASS@(PS1a)
+    ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at UB_EXACT@_code',
+`
+ppl_ at CLASS@_ at UB_EXACT@_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     (ppl_ at CLASS@_ at UB_EXACT@(PS1_Copy, PS2) ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS2, PS2a),
+m4_ifelse(m4_current_group, pointset_powerset, `dnl
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1_Copy, PS1),
+       ppl_ at CLASS@_upper_bound_assign(PS2a, PS1),
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS2a, PS1_Copy)',
+`       true')
+     ;
+       ppl_ at CLASS@_equals_ at CLASS@(PS1_Copy, PS1),
+       ppl_ at CLASS@_equals_ at CLASS@(PS2a, PS2)
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2a)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_swap_code',
+`
+ppl_ at CLASS@_swap_2_test :-
+  (
+   (
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3, universe, PS),
+    clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(3, empty, PS1),
+    ppl_ at CLASS@_swap(PS, PS1),
+    (predicate_exists(ppl_ at CLASS@_is_empty)
+    ->
+      ppl_ at CLASS@_is_empty(PS),
+      ppl_ at CLASS@_is_universe(PS1)
+    ;
+      true
+    ),
+    ppl_ at CLASS@_OK(PS),
+    ppl_ at CLASS@_OK(PS1),
+    ppl_delete_ at CLASS@(PS),
+    ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at DIMENSION@_code',
+`
+ppl_ at CLASS@_ at DIMENSION@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim), TEST_DATA \= test07,
+    (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     \+ppl_ at CLASS@_ at DIMENSION@(PS, 3),
+     ppl_ at CLASS@_ at DIMENSION@(PS, Dim),
+     ppl_dimension_test_data(TEST_DATA, @DIMENSION@, Dim1),
+     ((TEST_DATA == test05, @DIMENSION@ == affine_dimension)
+     ->
+       true
+     ;
+       Dim == Dim1
+     ),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_code',
+`
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     ppl_ at CLASS@_get_ at CLASS_REPRESENT@s(PS, RS),
+     (predicate_exists(ppl_ at CLASS@_add_ at CLASS_REPRESENT@s)
+     ->
+         ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS)
+     ;
+         true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_code',
+`
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+      ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+      ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+      ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s(PS, RS),
+      ( predicate_exists(ppl_ at CLASS@_add_ at CLASS_REPRESENT@s)
+      ->
+        ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS)
+      ;
+        true
+      ),
+      ppl_ at CLASS@_OK(PS),
+      ppl_ at CLASS@_OK(PS1),
+      ppl_delete_ at CLASS@(PS),
+      ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at MEMBYTES@_code',
+`
+ppl_ at CLASS@_ at MEMBYTES@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PH, Space_Dim),
+     ppl_ at CLASS@_ at MEMBYTES@(PH, S),
+     ((noisy(N), N < 2) -> true ;
+       display_message([nl, for, TEST_DATA, the, @MEMBYTES@, is, S, nl])
+     ),
+     ppl_delete_ at CLASS@(PH)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BEGINEND@_iterator_code',
+`
+ppl_ at CLASS@_ at BEGINEND@_iterator_2_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+     ppl_ at CLASS@_ at BEGINEND@_iterator(PPS, It_x),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(It_x),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_iterator_equals_iterator_code',
+`
+ppl_ at CLASS@_iterator_equals_iterator_2_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+     ppl_ at CLASS@_begin_iterator(PPS, It),
+     ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+     ppl_ at CLASS@_iterator_equals_iterator(It, It_begin),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(It),
+     ppl_delete_ at CLASS@_iterator(It_begin),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at INCDEC@_iterator_code',
+`
+ppl_ at CLASS@_ at INCDEC@_iterator_1_test :-
+  (
+   choose_test(TEST_DATA, _Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   (
+     clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+     ppl_ at CLASS@_begin_iterator(PPS, Itb),
+     ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+     ppl_ at CLASS@_size(PPS, S),
+     (S > 0
+     ->
+       ppl_ at CLASS@_increment_iterator(Itb),
+       ppl_ at CLASS@_decrement_iterator(Itb)
+     ),
+     ppl_ at CLASS@_iterator_equals_iterator(Itb, It_begin),
+     ppl_ at CLASS@_end_iterator(PPS, Ite),
+     ppl_ at CLASS@_end_iterator(PPS, It_end),
+     (S > 0
+     ->
+       ppl_ at CLASS@_decrement_iterator(Ite),
+       ppl_ at CLASS@_increment_iterator(Ite)
+     ),
+     ppl_ at CLASS@_iterator_equals_iterator(Ite, It_end),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(Itb),
+     ppl_delete_ at CLASS@_iterator(It_begin),
+     ppl_delete_ at CLASS@_iterator(Ite),
+     ppl_delete_ at CLASS@_iterator(It_end),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_new_ at CLASS@_iterator_from_iterator_code',
+`
+ppl_new_ at CLASS@_iterator_from_iterator_2_test :-
+  (
+   TEST_DATA = test06, TEST_DATA1 = test07,
+   ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   ppl_build_test_data(TEST_DATA1, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS1),
+   (
+     clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+     clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+     ppl_ at CLASS@_add_disjunct(PPS, PS),
+     ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+     ppl_new_ at CLASS@_iterator_from_iterator(It_begin, It1),
+     ppl_ at CLASS@_increment_iterator(It1),
+     \+ppl_ at CLASS@_iterator_equals_iterator(It1, It_begin),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(It_begin),
+     ppl_delete_ at CLASS@_iterator(It1),
+     ppl_delete_ at CLASS@(PPS),
+     ppl_delete_ at DISJUNCT@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjunct_code',
+`
+ppl_ at CLASS@_drop_disjunct_2_test :-
+  (
+   TEST_DATA = test06, TEST_DATA1 = test07,
+   ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   ppl_build_test_data(TEST_DATA1, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS1),
+   (
+     clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+     clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+     ppl_ at CLASS@_add_disjunct(PPS, PS),
+     ppl_ at CLASS@_size(PPS, S),
+     S > 1,
+     ppl_ at CLASS@_begin_iterator(PPS, It),
+     ppl_ at CLASS@_increment_iterator(It),
+     ppl_ at CLASS@_drop_disjunct(PPS, It),
+     S1 is S - 1,
+     ppl_ at CLASS@_size(PPS, S1),
+     ppl_ at CLASS@_decrement_iterator(It),
+     ppl_ at CLASS@_drop_disjunct(PPS, It),
+     S2 is S1 - 1,
+     ppl_ at CLASS@_size(PPS, S2),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(It),
+     ppl_delete_ at CLASS@(PPS),
+     ppl_delete_ at DISJUNCT@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_disjuncts_code',
+`
+ppl_ at CLASS@_drop_disjuncts_3_test :-
+  (
+   TEST_DATA = test06, TEST_DATA1 = test07,
+   ppl_build_test_data(TEST_DATA, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   ppl_build_test_data(TEST_DATA1, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS1),
+   (
+     clean_ppl_new_ at CLASS@_from_ at CONSTRAINER@s(RS, PPS),
+     clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS1, PS),
+     ppl_ at CLASS@_add_disjunct(PPS, PS),
+     ppl_ at CLASS@_size(PPS, S),
+     ppl_ at CLASS@_begin_iterator(PPS, It_begin),
+     ppl_new_ at CLASS@_iterator_from_iterator(It_begin, It1),
+     (S > 1
+     ->
+         ppl_ at CLASS@_increment_iterator(It1),
+         S1 is S - 1
+     ;
+         S1 = S
+     ),
+     ppl_ at CLASS@_drop_disjuncts(PPS, It_begin, It1),
+     S1 is S - 1,
+     ppl_ at CLASS@_size(PPS, S1),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(It_begin),
+     ppl_delete_ at CLASS@_iterator(It1),
+     ppl_delete_ at CLASS@(PPS),
+     ppl_delete_ at DISJUNCT@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_get_disjunct_code',
+`
+ppl_ at CLASS@_get_disjunct_2_test :-
+  (
+   all_tests(Space_Dim, Tests),
+   (
+     clean_ppl_new_ at CLASS@_from_space_dimension(Space_Dim, empty, PPS),
+     ppl_ at CLASS@_get_disjunct_2_test1(PPS, Tests),
+     ppl_ at CLASS@_begin_iterator(PPS, It),
+     ppl_ at CLASS@_end_iterator(PPS, It_end),
+     ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim),
+     ppl_ at CLASS@_OK(PPS),
+     ppl_delete_ at CLASS@_iterator(It),
+     ppl_delete_ at CLASS@_iterator(It_end),
+     ppl_delete_ at CLASS@(PPS)
+   ->
+     fail ; true)
+  ).
+
+ppl_ at CLASS@_get_disjunct_2_test1(_, []).
+ppl_ at CLASS@_get_disjunct_2_test1(PPS, [Test|Tests]) :-
+  (
+   ppl_build_test_data(Test, t_ at DISJUNCT_TOPOLOGY@, @CONSTRAINER at s, RS),
+   clean_ppl_new_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _from_@CONSTRAINER at s(RS, PS),
+   ppl_ at CLASS@_add_disjunct(PPS, PS),
+   ppl_delete_ at DISJUNCT@(PS),
+   ppl_ at CLASS@_get_disjunct_2_test1(PPS, Tests),
+   !
+  ).
+
+ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim) :-
+  (
+   (ppl_ at CLASS@_iterator_equals_iterator(It, It_end)
+   ->
+     true
+   ;
+     ppl_ at CLASS@_get_disjunct(It, PS),
+     ppl_ at CLASS@_increment_iterator(It),
+     ppl_ at DISJUNCT@_OK(PS),
+     ppl_ at DISJUNCT@_space_dimension(PS, D),
+     D = Space_Dim,
+     ppl_ at CLASS@_get_disjunct_2_test2(PPS, It, It_end, Space_Dim)
+   )
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_linear_ at PARTITION@_code',
+`dnl
+ppl_ at CLASS@_linear_ at PARTITION@_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_linear_partition(PS1, PS2, PS3, PPS),
+     ppl_ at CLASS@_OK(PS3),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS3),
+     ppl_delete_Pointset_Powerset_NNC_Polyhedron(PPS)
+   ->
+     fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_approximate_ at PARTITION@_code',
+`dnl
+ppl_ at CLASS@_approximate_ at PARTITION@_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at CLASS@_build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at CLASS@_build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_approximate_partition(PS1, PS2, PS3, PPS, _Is_finite),
+     ppl_ at CLASS@_OK(PS3),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS3),
+     ppl_delete_Pointset_Powerset_NNC_Polyhedron(PPS)
+   ->
+     fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_code',
+`
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@_3_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     class_ at CLASS@ \== class_BD_Shape_int8_t,
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_relation_test_data(TEST_DATA, @RELATION_REPRESENT@, R, Rel_Expected),
+     ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@(PS, R, Rel),
+     (class_ at CLASS@ == class_Polyhedron ; class_ at CLASS@ == class_Grid
+     ->
+       Rel = Rel_Expected
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; (class_ at CLASS@ == class_BD_Shape_int8_t -> fail ; true))
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at HAS_PROPERTY@_code',
+`
+ppl_ at CLASS@_ at HAS_PROPERTY@_1_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+    (ppl_property_test_data(TEST_DATA, t_ at TOPOLOGY@,
+                            @CONSTRAINER@, @HAS_PROPERTY@)
+    ->
+      ppl_ at CLASS@_ at HAS_PROPERTY@(PS)
+    ;
+      \+ ppl_ at CLASS@_ at HAS_PROPERTY@(PS)
+    ),
+    ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at SIMPLIFY@_code',
+`
+ppl_ at CLASS@_ at SIMPLIFY@_1_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   TEST_DATA = test04,
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     ppl_ at CLASS@_ at SIMPLIFY@(PS),
+     ppl_ at CLASS@_OK(PS),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimensions_code',
+`
+ppl_ at CLASS@_unconstrain_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_unconstrain_space_dimensions(PS, [Var]),
+     ppl_ at CLASS@_OK(PS),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+ppl_ at CLASS@_unconstrain_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, 0),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, 0),
+     ppl_ at CLASS@_unconstrain_space_dimensions(PS, []),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_unconstrain_space_dimension_code',
+`
+ppl_ at CLASS@_unconstrain_space_dimension_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_unconstrain_space_dimension(PS, Var),
+     ppl_ at CLASS@_OK(PS),
+     (predicate_exists(ppl_ at CLASS@_contains_ at CLASS@)
+     ->
+       ppl_ at CLASS@_contains_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_constrains_code',
+`
+ppl_ at CLASS@_constrains_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   \+ TEST_DATA = test00, \+ TEST_DATA = test02,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS1, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_constrains_test_data(TEST_DATA, _, Bool),
+     (ppl_ at CLASS@_constrains(PS, Var)
+        -> Bool = true
+        ; Bool = false
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_code',
+`
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@_2_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   TEST_DATA \= test05,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ((
+       class_ at DISJUNCT@ \= class_Grid,
+       ppl_bounds_test_data(TEST_DATA, @CONSTRAINER at s, LE,
+                           @ABOVEBELOW@, true))
+     ->
+       ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(PS, LE)
+     ;
+       true
+     ),
+     ((
+       class_ at DISJUNCT@ \= class_Grid,
+       ppl_bounds_test_data(TEST_DATA, @CONSTRAINER at s, LE1,
+                           @ABOVEBELOW@, false))
+     ->
+       \+ ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@(PS, LE1)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_has_ at UPPERLOWER@_bound_code',
+`
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ((
+       Space_Dim = 0
+      ;
+       ppl_ at CLASS@_is_empty(PS)
+      ) ->
+       true
+     ;
+       make_vars(Space_Dim, [Var| _Var_List]),
+       (ppl_ at CLASS@_has_ at UPPERLOWER@_bound(PS, Var, _, _, _) -> true ; true)
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+dnl FIXME:: The test fails for BD_Shape.
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_codeXXXXX',
+`
+ppl_ at CLASS@_ at MAXMIN@_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_maxmin_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@, @MAXMIN@,
+                          LE, Nexptd, Dexptd, Bexptd, _, SuccessFlag),
+     (SuccessFlag == true
+     ->
+       (ppl_ at CLASS@_ at MAXMIN@(PS, LE, N, D, B),
+        B == Bexptd, N == Nexptd, D == Dexptd)
+     ;
+       \+ ppl_ at CLASS@_ at MAXMIN@(PS, LE, N, D, B)
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+dnl FIXME:: The test fails for BD_Shape.
+m4_define(`ppl_ at CLASS@_ at MAXMIN@_with_point_codeXXXXX',
+`
+ppl_ at CLASS@_ at MAXMIN@_with_point_6_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_maxmin_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@, @MAXMIN@,
+                          LE, Nexptd, Dexptd, Bexptd, Gexptd, SuccessFlag),
+     (SuccessFlag == true
+     ->
+       (ppl_ at CLASS@_ at MAXMIN@_with_point(PS, LE, N, D, B, G),
+        B == Bexptd, N == Nexptd, D == Dexptd,
+        (predicate_exists(ppl_Polyhedron_add_generator)
+        ->
+          clean_ppl_new_C_Polyhedron_from_space_dimension(Space_Dim,
+                                                             empty, PSG),
+          clean_ppl_new_C_Polyhedron_from_space_dimension(Space_Dim,
+                                                             empty, PSGexptd),
+          (G =.. [closure_point|CP]
+          ->
+            Gexptd =.. [closure_point|CPexptd],
+            G_Point =.. [point|CP],
+            Gexptd_Point =.. [point|CPexptd],
+            ppl_Polyhedron_add_generator(PSG, G_Point),
+            ppl_Polyhedron_add_generator(PSGexptd, Gexptd_Point)
+          ;
+            (ppl_Polyhedron_add_generator(PSG, G),
+             ppl_Polyhedron_add_generator(PSGexptd, Gexptd))
+          ),
+          ppl_C_Polyhedron_equals_C_Polyhedron(PSG, PSGexptd),
+          ppl_delete_Polyhedron(PSG),
+          ppl_delete_Polyhedron(PSGexptd)
+        ;
+          true
+        ))
+     ;
+        \+ ppl_ at CLASS@_ at MAXMIN@_with_point(PS, LE, N, _, _, _)
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+m4_define(`ppl_ at CLASS@_frequency_code',
+`
+ppl_ at CLASS@_frequency_6_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_frequency_test_data(TEST_DATA, t_ at TOPOLOGY@, @CONSTRAINER@,
+                             LE, F_Nexptd, F_Dexptd, V_Nexptd, V_Dexptd,
+                             SuccessFlag),
+     (SuccessFlag == true
+     ->
+       (ppl_ at CLASS@_frequency(PS, LE, F_N, F_D, V_N, V_D),
+        F_N == F_Nexptd, F_D == F_Dexptd,
+        V_N == V_Nexptd, V_D == V_Dexptd)
+     ;
+       \+ ppl_ at CLASS@_frequency(PS, LE, F_N, F_D, V_N, V_D)
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_code',
+`
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     (ppl_ at CLASS@_ at COMPARISON@_ at CLASS@(PS1, PS2)
+     ->
+       ppl_ at CLASS@_comparison_check(@COMPARISON@, PS1, PS2, true)
+     ;
+       ppl_ at CLASS@_comparison_check(@COMPARISON@, PS1, PS2, false)
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@_code',
+`
+:- discontiguous(ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1/3).
+
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test :-
+  (
+   member(TEST_DATA, [test00, test02, test03, test04, test05]),
+   choose_test(TEST_DATA, Space_Dim),
+   ppl_build_test_data(TEST_DATA, t_ at TOPOLOGY@, @CLASS_REPRESENT at s, RS),
+   ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E),
+   ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS),
+   ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS, RS),
+   ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS1),
+   (ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, RS)
+   ->
+     fail ; true)
+  ).
+
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, []) :-
+  (
+   (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+      ->
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+   ;
+     true
+   ),
+   ppl_delete_ at CLASS@(PS),
+   ppl_delete_ at CLASS@(PS1)
+  ).
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, [R | RS]) :-
+  (
+     ppl_ at CLASS@_add_ at CLASS_REPRESENT@(PS1, R),
+     ppl_ at CLASS@_add_ at CLASS_REPRESENT@_2_test1(PS, PS1, RS)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_code',
+`
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s_2_test :-
+  (
+   member(TEST_DATA1, [test00, test02, test03, test04, test05]),
+   member(TEST_DATA2, [test00, test02, test03, test04, test05]),
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_build_test_data(TEST_DATA1, t_ at TOPOLOGY@, @CLASS_REPRESENT at s, RS),
+     ppl_build_test_data(TEST_DATA2, t_ at TOPOLOGY@, @CLASS_REPRESENT at s, RS1),
+     ppl_initial_test_system(@CLASS_REPRESENT@, U_or_E),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(Space_Dim, U_or_E, PS1),
+     ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS, RS),
+     ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS, RS1),
+     ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS1),
+     ppl_ at CLASS@_add_ at CLASS_REPRESENT@s(PS1, RS),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS1)
+     ;
+       true
+     ),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_disjunct_code',
+`
+ppl_ at CLASS@_add_disjunct_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PPS1, Space_Dim),
+     ppl_ at DISJUNCT_TOPOLOGY@@DISJUNCT at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_add_disjunct(PPS1, PS2),
+     ppl_ at CLASS@_OK(PPS1),
+     ppl_ at DISJUNCT@_OK(PS2),
+     ppl_delete_ at DISJUNCT@(PS2),
+     ppl_delete_ at CLASS@(PPS1)
+   ->
+     fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at BINOP@_code',
+`
+ppl_ at CLASS@_ at BINOP@_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2a, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_ at BINOP@(PS1_Copy, PS2),
+     ((@BINOP@ == upper_bound_assign ; @BINOP@ == poly_hull_assign)
+     ->
+m4_ifelse(m4_current_group, pointset_powerset,`dnl
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1_Copy, PS1),
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1_Copy, PS2)',
+`       ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS1),
+       ppl_ at CLASS@_contains_ at CLASS@(PS1_Copy, PS2)')
+     ;
+       true
+     ),
+     (@BINOP@ == intersection_assign
+     ->
+m4_ifelse(m4_current_group, pointset_powerset,`dnl
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1, PS1_Copy),
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS2, PS1_Copy)',
+`       ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy),
+       ppl_ at CLASS@_contains_ at CLASS@(PS2, PS1_Copy)')
+     ;
+       true
+     ),
+     (@BINOP@ == difference_assign ; @BINOP@ == poly_difference_assign
+     ->
+m4_ifelse(m4_current_group, pointset_powerset,`dnl
+       ppl_ at CLASS@_geometrically_covers_ at CLASS@(PS1, PS1_Copy)',
+`       ppl_ at CLASS@_contains_ at CLASS@(PS1, PS1_Copy)')
+     ;
+       true
+     ),
+     (@BINOP@ == concatenate_assign
+     ->
+       ppl_ at CLASS@_space_dimension(PS1, Dim1),
+       ppl_ at CLASS@_space_dimension(PS2, Dim2),
+       Dim_Conc is Dim1 + Dim2,
+       ppl_ at CLASS@_space_dimension(PS1_Copy, Dim_Conc)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2a)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_simplify_using_context_assign_code',
+`
+ppl_ at CLASS@_simplify_using_context_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_simplify_using_context_assign(PS1_Copy, PS2,
+                                               _Is_Intersection),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS1_Copy),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at AFFIMAGE@_code',
+`ppl_ at CLASS@_ at AFFIMAGE@_4_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var + 5, 1),
+     ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var - 5, 1),
+     (@AFFIMAGE@ == affine_image
+     ->
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, 2*Var, 1),
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var, 2)
+     ;
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, Var, 2),
+       ppl_ at CLASS@_ at AFFIMAGE@(PS, Var, 2*Var, 1)
+     ),
+dnl  FIXME: This fails with Uint??_Box domains for many of the tests
+dnl      (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+dnl      ->
+dnl        ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+dnl      ;
+dnl        true
+dnl      ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_bounded_ at AFFIMAGE@_code',
+`
+ppl_ at CLASS@_bounded_ at AFFIMAGE@_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   ppl_dimension_test_data(TEST_DATA, space_dimension, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS, Var, Var, 2*Var, 4),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS, Var, 4*Var, 4*Var, 1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS_Copy, Var, 4*Var, 4*Var, 1),
+     ppl_ at CLASS@_bounded_ at AFFIMAGE@(PS_Copy, Var, Var, 2*Var, 2),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, >=, 2*Var, 2),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS, Var, >=, Var + 2, 1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, >=, Var + 2, 1),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@(PS_Copy, Var, >=, 2*Var, 2),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence_6_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS, Var, =, 2*Var, 3, 5),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS, Var, =, Var + 2, 1, 0),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS_Copy, Var, =, Var + 2, 1, 0),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence(PS_Copy, Var, =, 2*Var, 3, 5),
+%%     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_4_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (t_ at TOPOLOGY@ == t_NNC_
+   ->
+     member(Op, [>=, =<, =, >, <])
+   ;
+     member(Op, [>=, =<, =])
+   ),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, 2*Var, Op, 2*(Var + 2)),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy, Var, Op, Var + 2),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_code',
+`
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence_5_test :-
+  (
+   choose_test(TEST_DATA, Space_Dim),
+   Space_Dim > 0,
+   (
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS, Space_Dim),
+     ppl_ at CLASS@_build_test_object(TEST_DATA, PS_Copy, Space_Dim),
+     make_vars(Space_Dim, [Var| _Var_List]),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, Var + 2, =, 2*Var, 5),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS, 1 - Var, =, Var + 2, 0),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy,
+                                                1 - Var, =, Var + 2, 0),
+     ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence(PS_Copy,
+                                                Var + 2, =, 2*Var, 5),
+%%     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS_Copy),
+     ppl_delete_ at CLASS@(PS_Copy),
+     ppl_delete_ at CLASS@(PS)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_code',
+`
+ppl_ at CLASS@_ at WIDEN@_widening_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_ at WIDEN@_widening_assign(PS1, PS2),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+     ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(PS1, PS2, 1, T),
+     ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens(PS1a, PS2, 0, T1),
+     ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+                                                PS2, PS2_Copy, T, T1)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BHZ03_ at DISJUNCT_TOPOLOGY@@DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign_code',
+`
+ppl_ at CLASS@_BHZ03_ at DISJUNCT_TOPOLOGY@@DISJUNCT_WIDEN at _@DISJUNCT_WIDEN at _widening_assign_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign(
+                                                           PS1, PS2),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign(
+                                                           PS1, PS2, 3),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign(
+                                                           PS1, PS2, 3),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at EXTRAPOLATION@_extrapolation_assign_3_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+   Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     make_vars(Dim, [Var|_]),
+     ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign(
+           PS1, PS2, [Var = 1]),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens_5_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Dim),
+   Dim > 0,
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+     make_vars(Dim, [Var|_]),
+     ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(
+                                                  PS1, PS2, [Var = 1], 1, T),
+     ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens(
+                                                  PS1a, PS2, [Var = 1], 0, T1),
+     ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+                                                PS2, PS2_Copy, T, T1)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign(PS1, PS2),
+     ppl_ at CLASS@_wdn_exn_check_code(PS1, PS1_Copy, PS2, PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1a),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1, PS2,
+                                                                  1, T),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens(PS1a, PS2,
+                                                                  0, T1),
+     ppl_ at CLASS@_wdn_exn_with_tokens_check_code(PS1, PS1a, PS1_Copy,
+                                                PS2, PS2_Copy, T, T1)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_code',
+`
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_upper_bound_assign(PS1, PS2),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS1, PS1_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign(PS2, PS1),
+     ppl_ at CLASS@_contains_ at CLASS@(PS2, PS2_Copy),
+     ppl_ at CLASS@_contains_ at CLASS@(PS1, PS2),
+     ppl_ at CLASS@_equals_ at CLASS@(PS1, PS1_Copy),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS1_Copy),
+     ppl_delete_ at CLASS@(PS2),
+     ppl_delete_ at CLASS@(PS2_Copy)
+   ->
+     fail ; true)
+ ).
+
+')
+
+m4_define(`ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_code',
+`
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@_2_test :-
+  (
+    (
+      clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(1, universe, PS),
+      ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@(PS, 1),
+      ppl_ at CLASS@_OK(PS),
+      ppl_ at CLASS@_space_dimension(PS, 2),
+      (@EMBEDPROJECT@ == and_embed
+      ->
+        clean_ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension(2, universe, PS1)
+      ;
+        make_vars(2, [Var0, Var1]),
+        clean_ppl_new_ at TOPOLOGY@@CLASS at _from_@CONSTRAINER at s(
+                            [Var0 = Var0, Var1 = 0], PS1)
+      ),
+      (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+      ->
+        ppl_ at CLASS@_equals_ at CLASS@(PS, PS1),
+        ppl_ at CLASS@_OK(PS1),
+        ppl_ at CLASS@_OK(PS)
+      ;
+        true
+      ),
+      ppl_delete_ at CLASS@(PS1),
+      ppl_delete_ at CLASS@(PS)
+
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_higher_space_dimensions_code',
+`
+ppl_ at CLASS@_remove_higher_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     Dim1 is Dim + 1,
+     ppl_ at CLASS@_remove_higher_space_dimensions(PS, Dim),
+     ppl_ at CLASS@_space_dimension(PS, Dim),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_remove_higher_space_dimensions(PS, 0),
+     ppl_ at CLASS@_space_dimension(PS, 0),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_remove_space_dimensions_code',
+`
+ppl_ at CLASS@_remove_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     Dim1 is Dim + 1,
+     ppl_ at CLASS@_remove_space_dimensions(PS, []),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     make_vars(Dim1, Var_List),
+     append(_, [Var], Var_List),
+     ppl_ at CLASS@_remove_space_dimensions(PS, [Var]),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_expand_space_dimension_code',
+`
+ppl_ at CLASS@_expand_space_dimension_3_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     Dim1 is Dim + 1,
+     make_vars(1, [Var]),
+     ppl_ at CLASS@_expand_space_dimension(PS, Var, 0),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     make_vars(Dim1, Var_List),
+     append(_, [Var1], Var_List),
+     ppl_ at CLASS@_expand_space_dimension(PS, Var1, 1),
+     Dim2 is Dim1 + 1,
+     ppl_ at CLASS@_space_dimension(PS, Dim2),
+     ppl_ at CLASS@_remove_higher_space_dimensions(PS, Dim1),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_fold_space_dimensions_code',
+`
+ppl_ at CLASS@_fold_space_dimensions_3_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     Dim1 is Dim + 1,
+     make_vars(Dim1, [Var | _]),
+     ppl_ at CLASS@_fold_space_dimensions(PS, [], Var),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     Dim2 is Dim1 + 1,
+     make_vars(Dim2, Var_List),
+     append(_, [Var1], Var_List),
+     ppl_ at CLASS@_fold_space_dimensions(PS, [Var], Var1),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_map_space_dimensions_code',
+`
+ppl_ at CLASS@_map_space_dimensions_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_ at CLASS@_add_space_dimensions_and_embed(PS, 1),
+     ppl_ at CLASS@_add_space_dimensions_and_project(PS, 1),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PSa),
+     Dim1 is Dim + 2,
+     ppl_ at CLASS@_map_space_dimensions(PSa, []),
+     ppl_ at CLASS@_space_dimension(PSa, 0),
+     make_vars(Dim1, Var_List),
+     append(_, [Var, Var1], Var_List),
+     make_map_vars(Dim, Var_Map_List),
+     append(Var_Map_List, [Var-Var1, Var1-Var], Var_Map_List1),
+     ppl_ at CLASS@_map_space_dimensions(PS, Var_Map_List1),
+     ppl_ at CLASS@_map_space_dimensions(PS, Var_Map_List1),
+     ppl_ at CLASS@_space_dimension(PS, Dim1),
+     (predicate_exists(ppl_ at CLASS@_equals_ at CLASS@)
+     ->
+       ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy)
+     ;
+       true
+     ),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PSa),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_wrap_assign_code',
+`
+ppl_ at CLASS@_wrap_assign_8_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_wrap_assign(PS, [], bits_8, unsigned, overflow_wraps,
+                             [], 0, true),
+     ppl_ at CLASS@_equals_ at CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_ at CLASS@_drop_some_non_integer_points_code',
+`
+ppl_ at CLASS@_drop_some_non_integer_points_2_test :-
+  (
+   choose_test(TEST_DATA, Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA, PS, Dim),
+     ppl_new_ at TOPOLOGY@@CLASS at _from_@TOPOLOGY@@CLASS@(PS, PS_Copy),
+     ppl_ at CLASS@_drop_some_non_integer_points(PS, any),
+     ppl_ at CLASS@_OK(PS),
+     ppl_delete_ at CLASS@(PS),
+     ppl_delete_ at CLASS@(PS_Copy)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _1_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     (ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(PS1) ->
+        true
+     ;
+        true
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(`ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     (ppl_termination_test_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(PS2, PS1) ->
+        true
+     ;
+        true
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(
+  `ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     (ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(PS1,
+                                                                         _Pt)
+     ->
+        true
+     ;
+        true
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(
+  `ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     (ppl_one_affine_ranking_function_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(PS2,
+                                                                           PS1,
+                                                                           _Pt)
+     ->
+        true
+     ;
+        true
+     ),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(
+  `ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS@(PS1,
+                                                                         Ph),
+     ppl_Polyhedron_OK(Ph),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(
+  `ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2_2_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     ppl_all_affine_ranking_functions_ at TERMINATION_ID@_ at TOPOLOGY@@CLASS at _2(PS2,
+                                                                           PS1,
+                                                                           Ph),
+     ppl_Polyhedron_OK(Ph),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(
+  `ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _code',
+`
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _3_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS@(PS1, Ph1, Ph2),
+     ppl_Polyhedron_OK(Ph1),
+     ppl_Polyhedron_OK(Ph2),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+m4_define(
+  `ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_code',
+`
+ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2_4_test :-
+  (
+   choose_2_tests(TEST_DATA1, TEST_DATA2, Space_Dim),
+   (
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA1, PS1, Space_Dim),
+     ppl_ at TOPOLOGY@@CLASS at _build_test_object(TEST_DATA2, PS2, Space_Dim),
+     ppl_ at CLASS@_concatenate_assign(PS1, PS2),
+     ppl_all_affine_quasi_ranking_functions_MS_ at TOPOLOGY@@CLASS at _2(PS2, PS1,
+                                                                   Ph1, Ph2),
+     ppl_Polyhedron_OK(Ph1),
+     ppl_Polyhedron_OK(Ph2),
+     ppl_ at CLASS@_OK(PS1),
+     ppl_ at CLASS@_OK(PS2),
+     ppl_delete_ at CLASS@(PS1),
+     ppl_delete_ at CLASS@(PS2)
+   ->
+    fail ; true)
+  ).
+
+')
+
+dnl ppl_ at CLASS@_ at NARROWING@_narrowing_assign/2,
diff --git a/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl b/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
new file mode 100644
index 0000000..985f2cf
--- /dev/null
+++ b/interfaces/Prolog/tests/ppl_prolog_generated_test_common.pl
@@ -0,0 +1,648 @@
+% Extra test code for the generated tests for the Prolog interfaces.
+% Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+% Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 3 of the License, or (at your
+% option) any later version.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://bugseng.com/products/ppl/ .
+
+:- dynamic(noisy/1).
+
+% check_noisy
+% This also executes all the test predicates but also prints some messages
+% including the banner, version numbers and expected output from
+% the exception tests.
+
+check_noisy :-
+   make_noisy,
+   check_all,
+   make_quiet.
+
+check_extra_noisy :-
+   make_extra_noisy,
+   check_all,
+   make_quiet.
+
+%%%%%%%%%%%% predicates for switching on/off output messages %
+
+make_extra_noisy :-
+  (retract(noisy(_)) ->
+      make_extra_noisy
+  ;
+      assertz(noisy(2))
+  ).
+
+make_noisy :-
+  (retract(noisy(_)) ->
+      make_noisy
+  ;
+      assertz(noisy(1))
+  ).
+
+make_quiet :-
+  (retract(noisy(_)) ->
+      make_quiet
+   ; assertz(noisy(0))
+  ).
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+   write_all(Message),
+   fail.
+
+display_message(Message):-
+    noisy(_),
+    (noisy(0) -> true ;
+     (write_all(Message))
+    ).
+
+write_all([]) :- nl.
+write_all([Phrase|Phrases]):-
+   (Phrase == nl ->
+      nl
+   ;
+      (write(Phrase),
+      write(' '))
+   ),
+   write_all(Phrases).
+
+%%%%%%%%%%%% predicates for variable generation %%%%%%%%%%%%%%%%%%
+
+% make_var_list(+I,+Dimension,?Variable_List)
+% constructs a list of variables with indices from I to Dimension - 1.
+% It is assumed that I =< Dimension.
+
+make_vars(Dim, Var_List) :-
+  make_var_list(0, Dim, Var_List).
+make_var_list(Dim, Dim, []) :- !.
+make_var_list(I, Dim, ['$VAR'(I)|Var_List]) :-
+  I < Dim,
+  (I1 is I + 1,
+  make_var_list(I1, Dim, Var_List)).
+
+make_map_vars(Dim, Var_Map_List) :-
+  make_map_var_list(0, Dim, Var_Map_List).
+make_map_var_list(Dim, Dim, []) :- !.
+make_map_var_list(I, Dim, ['$VAR'(I)-'$VAR'(I)|Var_Map_List]) :-
+  I < Dim,
+  (I1 is I + 1,
+  make_map_var_list(I1, Dim, Var_Map_List)).
+
+%%%%%%%%%%%% predicates for success and errors.  %%%%%%%%%%%%%%%%%
+
+write_success(Predicate_name) :-
+  display_message([test, for, Predicate_name, 'succeeded.']).
+
+write_error(Predicate_name) :-
+  write_all([test, for, Predicate_name, 'failed.']).
+
+
+%%%%%%%%%%%% test data selection       %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+all_tests(0, [test00, test02]).
+all_tests(1, [test01, test03, test04, test05, test06, test07]).
+
+choose_test(TEST_DATA, Dim) :-
+   all_tests(_, Tests),
+   member(TEST_DATA, Tests),
+   ppl_dimension_test_data(TEST_DATA, space_dimension, Dim).
+
+choose_2_tests(TEST_DATA1, TEST_DATA2, Dim) :-
+   all_tests(0, Tests0),
+   all_tests(1, Tests1),
+   (
+     (member(TEST_DATA1, Tests0),
+      member(TEST_DATA2, Tests0)) ;
+     (member(TEST_DATA1, Tests1),
+      member(TEST_DATA2, Tests1))
+   ),
+   ppl_dimension_test_data(TEST_DATA1, space_dimension, Dim),
+   ppl_dimension_test_data(TEST_DATA2, space_dimension, Dim).
+
+:- discontiguous(ppl_build_test_data/4).
+:- discontiguous(ppl_dimension_test_data/3).
+:- discontiguous(ppl_relation_test_data/4).
+:- discontiguous(ppl_property_test_data/4).
+:- discontiguous(ppl_bounds_test_data/5).
+:- discontiguous(ppl_maxmin_test_data/10).
+:- discontiguous(ppl_frequency_test_data/9).
+:- discontiguous(ppl_constrains_test_data/3).
+:- dynamic(all_class_dependent_predicates/1).
+:- discontiguous(all_class_dependent_predicates/1).
+
+ppl_initial_test_system(constraint, universe).
+ppl_initial_test_system(congruence, universe).
+ppl_initial_test_system(generator, empty).
+ppl_initial_test_system(grid_generator, empty).
+
+predicate_exists(Predicate) :-
+  all_class_dependent_predicates(List_of_Predicates),
+  member(Predicate, List_of_Predicates).
+
+
+%%%%%%%%%%%% predicates for test data %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+/* Test data for test test00 (an empty object in 0 dimensions) */
+
+ppl_build_test_data(test00, _Topology, constraints, [0 = 1]).
+ppl_build_test_data(test00, _Topology, generators, []).
+ppl_build_test_data(test00, _Topology, congruences, [(0 =:= 1) / 0]).
+ppl_build_test_data(test00, _Topology, grid_generators, []).
+
+ppl_dimension_test_data(test00, _, 0).
+
+ppl_relation_test_data(test00, constraint, 0 = 1, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test00, generator, point(0), []).
+ppl_relation_test_data(test00, congruence, (0 =:= 1) / 0, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test00, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test00, _, _, is_empty).
+ppl_property_test_data(test00, _, _, is_bounded).
+ppl_property_test_data(test00, _, _, is_topologically_closed).
+ppl_property_test_data(test00, _, _, is_discrete).
+
+ppl_bounds_test_data(test00, _, 0, _, true).
+
+ppl_maxmin_test_data(test00, _Topology, _, _, 0, _, _, _, _, false).
+
+ppl_frequency_test_data(test00, _Topology, _, 0, _, _, _, _, false).
+
+/* Test data for test test01 (an empty object in 1 dimension) */
+
+ppl_build_test_data(test01, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A >= 1, A =< 0]).
+ppl_build_test_data(test01, _Topology, generators, []).
+ppl_build_test_data(test01, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= 1) / 2, (A =:= 0) / 2]).
+ppl_build_test_data(test01, _Topology, grid_generators, []).
+
+ppl_dimension_test_data(test01, space_dimension, 1).
+ppl_dimension_test_data(test01, affine_dimension, 0).
+
+ppl_relation_test_data(test01, constraint, 0 = 1, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test01, generator, point(0), []).
+ppl_relation_test_data(test01, congruence, (0 =:= 1) / 0, Rel) :-
+  Rel = [saturates, is_included, is_disjoint]
+  ; Rel = [saturates, is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint, saturates]
+  ; Rel = [is_included, saturates, is_disjoint]
+  ; Rel = [is_disjoint, is_included, saturates]
+  ; Rel = [is_disjoint, saturates, is_included]
+  ; Rel = [is_disjoint, is_included]
+  ; Rel = [is_included, is_disjoint].
+ppl_relation_test_data(test01, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test01, _, _, is_empty).
+ppl_property_test_data(test01, _, _, is_bounded).
+ppl_property_test_data(test01, _, _, is_topologically_closed).
+ppl_property_test_data(test01, _, _, is_discrete).
+
+ppl_bounds_test_data(test01, _, A, _, true) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test01, _Topology, _, _, 0, _, _, _, _, false).
+
+ppl_frequency_test_data(test01, _Topology, _, 0, _, _, _, _, false).
+
+ppl_constrains_test_data(test01, _, true).
+
+/* Test data for test test02 (a universe object in 0 dimensions) */
+
+ppl_build_test_data(test02, _Topology, constraints, []).
+ppl_build_test_data(test02, _Topology, generators, [point(0)]).
+ppl_build_test_data(test02, _Topology, congruences, []).
+ppl_build_test_data(test02, _Topology, grid_generators, [grid_point(0)]).
+
+ppl_dimension_test_data(test02, _, 0).
+
+ppl_relation_test_data(test02, constraint, 0 = 0, Rel) :-
+  Rel = [saturates, is_included] ; Rel = [is_included, saturates]
+  ; Rel = [is_included].
+ppl_relation_test_data(test02, generator, point(0), [subsumes]).
+ppl_relation_test_data(test02, congruence, (0 =:= 0) / 0, Rel) :-
+  Rel = [saturates, is_included] ; Rel = [is_included, saturates]
+  ; Rel = [is_included].
+ppl_relation_test_data(test02, grid_generator, grid_point(0), [subsumes]).
+
+ppl_property_test_data(test02, _, _, is_universe).
+ppl_property_test_data(test02, _, _, is_bounded).
+ppl_property_test_data(test02, _, _, is_topologically_closed).
+ppl_property_test_data(test02, _, _, is_discrete).
+ppl_property_test_data(test02, _, _, contains_integer_point).
+
+ppl_bounds_test_data(test02, _, 0, _, true).
+
+ppl_maxmin_test_data(test02, _Topology, constraint, _, 0, 0, 1, true,
+                     point(0), true).
+ppl_maxmin_test_data(test02, _Topology, congruence, _, 0, 0, 1, true,
+                     grid_point(0), true).
+
+ppl_frequency_test_data(test02, _Topology, _, 0, 0, 1, 0, 1, true).
+
+/* Test data for test test03 (a universe object in 1 dimension) */
+
+ppl_build_test_data(test03, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = A]).
+ppl_build_test_data(test03, _Topology, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(0), line(A)]).
+ppl_build_test_data(test03, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= A) / 0]).
+ppl_build_test_data(test03, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(0), grid_line(A)]).
+
+ppl_dimension_test_data(test03, _, 1).
+
+ppl_relation_test_data(test03, constraint, A = 0, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test03, generator, point(0), [subsumes]).
+ppl_relation_test_data(test03, congruence, (A =:= 0) / 0, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test03, grid_generator, grid_point(0), [subsumes]).
+
+ppl_property_test_data(test03, _, _, is_universe).
+ppl_property_test_data(test03, _, _, is_topologically_closed).
+ppl_property_test_data(test03, _, _, contains_integer_point).
+
+ppl_bounds_test_data(test03, _, A, _, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test03, _Topology, _, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test03, _Topology, _, 0, 0, 1, 0, 1, true).
+
+ppl_constrains_test_data(test03, _, false).
+
+/* Test data for test test04 and test05
+   (an object in 1 dimension with a single point) */
+
+ppl_build_test_data(test04, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = 1]).
+
+ppl_build_test_data(test04, _Topology, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(1*A)]).
+ppl_build_test_data(test04, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= 1) / 0]).
+ppl_build_test_data(test04, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(1*A)]).
+
+ppl_dimension_test_data(test04, space_dimension, 1).
+ppl_dimension_test_data(test04, affine_dimension, 0).
+
+ppl_relation_test_data(test04, constraint, A = 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test04, generator, point(0), []).
+ppl_relation_test_data(test04, congruence, (A =:= 0) / 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test04, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test04, _, _, is_bounded).
+ppl_property_test_data(test04, _, _, is_topologically_closed).
+ppl_property_test_data(test04, _, _, contains_integer_point).
+ppl_property_test_data(test04, _, _, is_discrete).
+
+ppl_bounds_test_data(test04, _, A, _, true) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test04, _Topology, constraint, _, A, 1, 1, true,
+                     point(A), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test04, _Topology, congruence, _, A, 1, 1, true,
+             grid_point(A), true) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test04, _Topology, _, A, 0, 1, 1, 1, true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test04, _, true).
+
+ppl_build_test_data(test05, _Topology, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A = -1]).
+ppl_build_test_data(test05, _Topology, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(-1*A)]).
+ppl_build_test_data(test05, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= -1) / 0]).
+ppl_build_test_data(test05, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(-1*A)]).
+
+ppl_dimension_test_data(test05, space_dimension, 1).
+ppl_dimension_test_data(test05, affine_dimension, 0).
+
+ppl_relation_test_data(test05, constraint, A = 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test05, generator, point(0), []).
+ppl_relation_test_data(test05, congruence, (A =:= 0) / 0, [is_disjoint]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test05, grid_generator, grid_point(0), []).
+
+ppl_property_test_data(test05, _, _, is_bounded).
+ppl_property_test_data(test05, _, _, is_topologically_closed).
+ppl_property_test_data(test05, _, _, contains_integer_point).
+ppl_property_test_data(test05, _, _, is_discrete).
+
+ppl_bounds_test_data(test05, _, A, _, true) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test05, _Topology, constraint, _, A, -1, 1, true,
+                     point(-1*A), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test05, _Topology, congruence, _, A, -1, 1, true,
+             grid_point(-1*A), true) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test05, _Topology, _, A, 0, 1, -1, 1, true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test05, _, true).
+
+/* Test data for test test06,
+            a non-universe object in 1 dimension with no upper bound */
+
+ppl_build_test_data(test06, T, constraints, CS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   CS = [A >= 0]).
+ppl_build_test_data(test06, T, generators, GS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   GS = [point(0*A), ray(A)]).
+ppl_build_test_data(test06, t_NNC_, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A > 0]).
+ppl_build_test_data(test06, t_NNC_, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(A), closure_point(0*A), ray(A)]).
+ppl_build_test_data(test06, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [A =:= 0]).
+ppl_build_test_data(test06, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(0*A), parameter(1*A)]).
+
+ppl_dimension_test_data(test06, _, 1).
+
+ppl_relation_test_data(test06, constraint, A =< 3, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test06, generator, point(3*A), [subsumes]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test06, congruence, (2*A =:= 1) / 3,
+                                              [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test06, grid_generator, grid_point(3*A), [subsumes]) :-
+  make_vars(1, [A]).
+
+ppl_property_test_data(test06, T, _, is_topologically_closed) :-
+  \+ T == t_NNC_.
+ppl_property_test_data(test06, _, _, contains_integer_point).
+ppl_property_test_data(test06, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test06, _, A, above, false) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test06, constraint, A, below, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test06, congruence, A, below, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test06, T, constraint, maximize, A, _, _, _, _, false) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test06, T, constraint, minimize, A, 0, 1, true,
+                     point(0), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test06, t_NNC_, constraint, maximize, A, _, _, _,
+                     _, false) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test06, t_NNC_, constraint, minimize, A, 0, 1, false,
+                     closure_point(0), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test06, _, congruence, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test06, _Topology, constraint, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test06, _Topology, congruence, A, 1, 1, 0, 1, true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test06, _, true).
+
+/* Test data for test test07,
+    a non-universe object in 1 dimension with no lower bound */
+
+ppl_build_test_data(test07, T, constraints, CS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   CS = [A =< 0]).
+ppl_build_test_data(test07, T, generators, GS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   GS = [point(0*A), ray(-1*A)]).
+ppl_build_test_data(test07, t_NNC_, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [A < 0]).
+ppl_build_test_data(test07, t_NNC_, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(A), closure_point(0*A), ray(-1*A)]).
+ppl_build_test_data(test07, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(A =:= 0) / 2]).
+ppl_build_test_data(test07, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(0*A), parameter(-2*A)]).
+
+ppl_dimension_test_data(test07, _, 1).
+
+ppl_relation_test_data(test07, constraint, A >= -3, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test07, generator, point(-4*A), [subsumes]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test07, congruence, (2*A =:= 1) / 3,
+                                              [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test07, grid_generator, grid_point(6*A), [subsumes]) :-
+  make_vars(1, [A]).
+
+ppl_property_test_data(test07, T, _, is_topologically_closed) :-
+  \+ T == t_NNC_.
+ppl_property_test_data(test07, _, _, contains_integer_point).
+ppl_property_test_data(test07, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test07, _, A, below, false) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test07, constraint, A, above, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test07, congruence, A, above, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test07, T, constraint, minimize, A, _, _, _, _, false) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test07, T, constraint, maximize, A, 0, 1, true,
+                     point(0), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test07, t_NNC_, constraint, minimize, A, _, _, _,
+                     _, false) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test07, t_NNC_, constraint, maximize, A, 0, 1, false,
+                     closure_point(0), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test07, _, congruence, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, constraint, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, congruence, A, 2, 1, 0, 1, true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test07, _, true).
+
+/* Test data for test test08,
+    a non-universe bounded object in 1 dimension */
+
+ppl_build_test_data(test08, T, constraints, CS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   CS = [2*A >= 3, A =< 5]).
+ppl_build_test_data(test08, T, generators, GS) :-
+  (\+ T == t_NNC_,
+   make_vars(1, [A]),
+   GS = [point(3*A, 2), point(5*A)]).
+ppl_build_test_data(test08, t_NNC_, constraints, CS) :-
+  (make_vars(1, [A]),
+   CS = [2*A > 3, A < 5]).
+ppl_build_test_data(test08, t_NNC_, generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [point(2*A), closure_point(3*A, 2), closure_point(5*A)]).
+ppl_build_test_data(test08, _Topology, congruences, CS) :-
+  (make_vars(1, [A]),
+   CS = [(2*A =:= 3) / 7]).
+ppl_build_test_data(test08, _Topology, grid_generators, GS) :-
+  (make_vars(1, [A]),
+   GS = [grid_point(3*A, 2), parameter(7*A, 2)]).
+
+ppl_dimension_test_data(test08, _, 1).
+
+ppl_relation_test_data(test08, constraint, A >= 3, [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test08, generator, point(5*A, 2), [subsumes]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test08, congruence, (2*A =:= 1) / 3,
+                                              [strictly_intersects]) :-
+  make_vars(1, [A]).
+ppl_relation_test_data(test08, grid_generator, grid_point(5*A), [subsumes]) :-
+  make_vars(1, [A]).
+
+ppl_property_test_data(test08, T, _, is_topologically_closed) :-
+  \+ T == t_NNC_.
+ppl_property_test_data(test08, _, _, contains_integer_point).
+ppl_property_test_data(test08, _, congruence, is_discrete).
+
+ppl_bounds_test_data(test08, constraint, A, above, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test08, congruence, A, above, false) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test08, constraint, A, below, true) :-
+  make_vars(1, [A]).
+ppl_bounds_test_data(test08, congruence, A, below, false) :-
+  make_vars(1, [A]).
+
+ppl_maxmin_test_data(test08, T, constraint, minimize, A, 3, 2, true,
+                     point(3*A, 2), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+
+ppl_maxmin_test_data(test08, T, constraint, maximize, A, 5, 1, true,
+                     point(5*A), true) :-
+   (T = t_ ; T = t_C_), make_vars(1, [A]).
+ppl_maxmin_test_data(test08, t_NNC_, constraint, minimize, A, 3, 2, false,
+                     closure_point(3*A, 2), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test08, t_NNC_, constraint, maximize, A, 5, 1, false,
+                     closure_point(5*A), true) :-
+   make_vars(1, [A]).
+ppl_maxmin_test_data(test08, _, congruence, _, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, constraint, A, _, _, _, _, false) :-
+   make_vars(1, [A]).
+
+ppl_frequency_test_data(test07, _Topology, congruence, A, 7, 2, 3, 2, true) :-
+   make_vars(1, [A]).
+
+ppl_constrains_test_data(test08, _, true).
+
+/* boxes  */
+
+ppl_dimension_test_data(test10, _, 2).
+ppl_dimension_test_data(test11, _, 2).
+ppl_dimension_test_data(test12, _, 2).
+
+ppl_build_test_data(test00, _Topology, box, [empty]).
+ppl_build_test_data(test01, _Topology, box, [empty]).
+ppl_build_test_data(test02, _Topology, box, []).
+ppl_build_test_data(test03, _Topology, box, [i(o(minf), o(pinf))]).
+ppl_build_test_data(test04, _Topology, box, [i(c(1), c(1))]).
+ppl_build_test_data(test05, _Topology, box, [i(c(-1), c(-1))]).
+ppl_build_test_data(test06, _Topology, box, [i(c(0), o(pinf))]).
+ppl_build_test_data(test07, _Topology, box, [i(o(minf), c(0))]).
+ppl_build_test_data(test08, _Topology, box, [i(c(3/2), c(5))]).
+ppl_build_test_data(test10, _Topology, box,
+                               [i(c(1/2), o(pinf)), i(o(minf), c(-1/2))]).
+ppl_build_test_data(test11, _Topology, box, [i(c(-4), c(1)), i(c(-1), c(1))]).
+ppl_build_test_data(test12, T, box, [i(c(0/2), o(pinf)), i(o(minf), c(1))]) :-
+  \+ T == t_NNC_.
+ppl_build_test_data(test12, t_NNC_, box, [i(o(0/2), o(pinf)), i(o(minf), o(1))]).
diff --git a/interfaces/Prolog/tests/schedule.clpq b/interfaces/Prolog/tests/schedule.clpq
new file mode 100644
index 0000000..6281d5b
--- /dev/null
+++ b/interfaces/Prolog/tests/schedule.clpq
@@ -0,0 +1,22 @@
+into(task(S1, D1), task(S2, D2)) :-
+  {S2 =< S1, S1 + D1 = SD1, S2 + D2 = SD2, SD1 =< SD2}.
+
+noOverlap(_, []).
+noOverlap(task(S1, D1), [task(S2, D2)|Tasks]) :-
+  (
+    {S1 + D1 = SD1, SD1 < S2}
+  ;
+    {S2 + D2 = SD2, SD2 < S1}
+  ),
+  noOverlap(task(S1, D1), Tasks).
+
+schedule([], _).
+schedule([Task|Tasks], Supertask) :-
+  into(Task, Supertask),
+  noOverlap(Task, Tasks),
+  schedule(Tasks, Supertask).
+
+test1(S) :-
+  schedule([task(0, 1), task(3, 1), task(S, 1)], task(0, 6)).
+test2(S) :-
+  schedule([task(0, 28), task(70, 40), task(S, 35)], task(0, 240)).
diff --git a/interfaces/Prolog/tests/script_clpq b/interfaces/Prolog/tests/script_clpq
new file mode 100644
index 0000000..0434ccf
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq
@@ -0,0 +1,18 @@
+reconsult('ack.clpq').
+ack(2, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
diff --git a/interfaces/Prolog/tests/script_clpq2 b/interfaces/Prolog/tests/script_clpq2
new file mode 100644
index 0000000..9ea257c
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq2
@@ -0,0 +1,36 @@
+reconsult('ack.clpq').
+ack(3, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
+reconsult('schedule.clpq').
+test1(X).
+;
+;
+
+test2(X).
+;
+;
+
+schedule([task(S1, D1), task(S2, D2), task(S2, D3)], task(S, D)).
+;
+;
+;
+;
+;
+;
+;
+;
diff --git a/interfaces/Prolog/tests/script_clpq2_int8 b/interfaces/Prolog/tests/script_clpq2_int8
new file mode 100644
index 0000000..4ca8087
--- /dev/null
+++ b/interfaces/Prolog/tests/script_clpq2_int8
@@ -0,0 +1,34 @@
+reconsult('ack.clpq').
+ack(3, 1, Z).
+
+reconsult('ackn.clpq').
+ack(X, Y, Z).
+
+reconsult('mc91.clpq').
+mc(112, Y).
+
+reconsult('fib.clpq').
+fib(5, Y).
+
+reconsult('smm.clpq').
+solve(S, E, N, D, M, O, R, Y).
+
+reconsult('sumto.clpq').
+sumto(X, 55).
+
+reconsult('schedule.clpq').
+test1(X).
+;
+;
+
+test2(X).
+
+schedule([task(S1, D1), task(S2, D2), task(S2, D3)], task(S, D)).
+;
+;
+;
+;
+;
+;
+;
+;
diff --git a/interfaces/Prolog/tests/smm.clpq b/interfaces/Prolog/tests/smm.clpq
new file mode 100644
index 0000000..d6c608b
--- /dev/null
+++ b/interfaces/Prolog/tests/smm.clpq
@@ -0,0 +1,31 @@
+% *************************************
+% CLP(R) Version 1.1 - Example Programs
+% *************************************
+%
+% The classic cryptarithmetic puzzle:
+%
+%       S E N D
+%     + M O R E
+%     ---------
+%     M O N E Y
+
+solve(S, E, N, D, M, O, R, Y) :-
+        constraints(S, E, N, D, M, O, R, Y).
+
+constraints(S, E, N, D, M, O, R, Y) :-
+{
+        S >= 0, E >= 0, N >= 0, D >= 0, M >= 0, O >= 0, R >= 0, Y >= 0,
+        S =< 9, E =< 9, N =< 9, D =< 9, M =< 9, O =< 9, R =< 9, Y =< 9,
+        S >= 1, M >= 1,
+        C1 >= 0, C2 >= 0, C3 >= 0, C4 >= 0,
+        C1 =< 1, C2 =< 1, C3 =< 1, C4 =< 1,
+        M = C1,
+        C2 + S + M = O + C1 * 10,
+        C3 + E + O = N + 10 * C2,
+        C4 + N + R = E + 10 * C3,
+        D + E = Y + 10*C4
+},
+        bit(C1), bit(C2), bit(C3), bit(C4).
+
+bit(0).
+bit(1).
diff --git a/interfaces/Prolog/tests/sumto.clpq b/interfaces/Prolog/tests/sumto.clpq
new file mode 100644
index 0000000..329ef1b
--- /dev/null
+++ b/interfaces/Prolog/tests/sumto.clpq
@@ -0,0 +1,4 @@
+sumto(N, S) :-
+  { N = 0, S = 0 }.
+sumto(N, S) :-
+  { N = N1+1, S = N+S1 }, sumto(N1, S1).
diff --git a/interfaces/Prolog/tests/tak.clpq b/interfaces/Prolog/tests/tak.clpq
new file mode 100644
index 0000000..6defd26
--- /dev/null
+++ b/interfaces/Prolog/tests/tak.clpq
@@ -0,0 +1,20 @@
+%   Evan Tick (from Lisp version by R. P. Gabriel)
+%
+%   (almost) Takeuchi function (recursive arithmetic)
+
+tak(R) :- tak(18, 12, 6, R).
+
+tak(X, Y, Z, A) :-
+    {
+      X =< Y,
+      Z = A
+    }.
+
+tak(X, Y, Z, A) :-
+    {
+      X >= Y+1
+    },
+    tak(X-1, Y,   Z,  A1),
+    tak(Y-1, Z,   X,  A2),
+    tak(Z-1, X,   Y,  A3),
+    tak(A1,  A2,  A3, A ).
diff --git a/interfaces/interfaced_boxes.hh b/interfaces/interfaced_boxes.hh
new file mode 100644
index 0000000..7293f5b
--- /dev/null
+++ b/interfaces/interfaced_boxes.hh
@@ -0,0 +1,108 @@
+/* Declarations for the Box instantiations offered by the non-templatic
+   language interfaces.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_interfaced_boxes_hh
+#define PPL_interfaced_boxes_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+struct Z_Box_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Z_Box_Interval_Info_Policy> Z_Box_Interval_Info;
+
+typedef Box<Interval<mpz_class, Z_Box_Interval_Info> > Z_Box;
+
+struct Floating_Point_Box_Interval_Info_Policy {
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset <unsigned int,
+                              Floating_Point_Box_Interval_Info_Policy> Floating_Point_Box_Interval_Info;
+
+typedef
+Box<Interval<float, Floating_Point_Box_Interval_Info> >
+Float_Box;
+
+typedef Box<Interval<double, Floating_Point_Box_Interval_Info> >
+Double_Box;
+
+typedef Box<Interval<long double, Floating_Point_Box_Interval_Info> >
+Long_Double_Box;
+
+struct Native_Integer_Box_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Native_Integer_Box_Interval_Info_Policy> Native_Integer_Box_Interval_Info;
+
+typedef Box<Interval<int8_t, Native_Integer_Box_Interval_Info> > Int8_Box;
+
+typedef Box<Interval<int16_t, Native_Integer_Box_Interval_Info> > Int16_Box;
+
+typedef Box<Interval<int32_t, Native_Integer_Box_Interval_Info> > Int32_Box;
+
+typedef Box<Interval<int64_t, Native_Integer_Box_Interval_Info> > Int64_Box;
+
+typedef Box<Interval<uint8_t, Native_Integer_Box_Interval_Info> > Uint8_Box;
+
+typedef Box<Interval<uint16_t, Native_Integer_Box_Interval_Info> > Uint16_Box;
+
+typedef Box<Interval<uint32_t, Native_Integer_Box_Interval_Info> > Uint32_Box;
+
+typedef Box<Interval<uint64_t, Native_Integer_Box_Interval_Info> > Uint64_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_interfaced_boxes_hh)
diff --git a/interfaces/marked_pointers.hh b/interfaces/marked_pointers.hh
new file mode 100644
index 0000000..86a365d
--- /dev/null
+++ b/interfaces/marked_pointers.hh
@@ -0,0 +1,64 @@
+/* Implementation of marked pointers for use in some PPL non-templatic
+   language interfaces.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_marked_pointers_hh
+#define PPL_marked_pointers_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#define PPL_MARKED_POINTERS_MASK ((uintptr_t) 1)
+
+/*! \brief
+  Returns the marked pointer corresponding to \p p.
+
+  The marking consists in setting the least significant bit to 1.
+*/
+template <typename T>
+inline T*
+mark(T* p) {
+  uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+  return reinterpret_cast<T*>(uint_p | (PPL_MARKED_POINTERS_MASK));
+}
+
+//! Returns the unmarked pointer corresponding to \p p.
+template <typename T>
+inline T*
+unmark(T* p) {
+  uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+  return reinterpret_cast<T*>(uint_p & ~(PPL_MARKED_POINTERS_MASK));
+}
+
+//! Returns <CODE>true</CODE> if and only if \p p is marked.
+template <typename T>
+inline bool
+marked(T* p) {
+  uintptr_t uint_p = reinterpret_cast<uintptr_t>(p);
+  return (uint_p & (PPL_MARKED_POINTERS_MASK)) != 0;
+}
+
+#undef PPL_MARKED_POINTERS_MASK
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_marked_pointers_hh)
diff --git a/interfaces/ppl_interface_generator_common.m4 b/interfaces/ppl_interface_generator_common.m4
new file mode 100644
index 0000000..8b3cd1a
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common.m4
@@ -0,0 +1,925 @@
+m4_divert(-1)
+
+dnl This m4 file includes macro definitions for:
+dnl - application independent helper macros used here and by other m4 files.
+dnl - defining the main code generation macro m4_all_code.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl ---------------------------------------------------------------------
+dnl           --- MACRO GROUPS and DEPENDENCIES ---
+dnl
+dnl For ease of keeping track of these macros and their dependencies,
+dnl the macro definitions are separated by the "===" comments into groups.
+dnl
+dnl Where a macro is only used within the group, it is labelled as "LOCAL".
+dnl Where it is used in this file but by another macro group, it is
+dnl labelled as "PRIVATE" and an indication of which group uses it.
+dnl Where it may be used in the generator files, it is labelled
+dnl as "PUBLIC".
+dnl
+dnl Some simple macros may be redefined by generator files and we
+dnl indicate that here is the default definition by the label
+dnl "DEFAULT DEF".
+dnl
+dnl The macro groups and the dependencies are:
+dnl
+dnl HELPERS (m4_forloop, m4_upcase, m4_downcase, m4_capfirstletter,
+dnl          m4_capfirstletters, m4_changecase, m4_add_one_after_underscore,
+dnl          m4_ifndef, m4_nargs, m4_arg, m4_arg_counter, m4_echo_unquoted,
+dnl          m4_echo_quoted, m4_seq_intersection, m4_seq_difference
+dnl          are all public.)
+dnl          WARNING: some may not be used and may not be fully tested.
+dnl
+dnl ALL_CLASSES (m4_all_code is public)
+dnl |-- m4_interface_generator_common_dat.m4 (m4_init_class_definitions)
+dnl `-- ONE_CLASS (m4_one_class_code)
+dnl     |-- FILTER_PROCEDURES (m4_filter_all_procedures)
+dnl     |   `-- m4_interface_generator_common_dat.m4 (m4_group_names)
+dnl     |-- PATTERNS_TO_REPLACEMENTS (m4_replace_all_patterns_in_string)
+dnl     |-- PATTERNS (m4_pattern_annotation0, ...)
+dnl     |-- REPLACEMENT_TEXT (m4_annotated_pattern_replacement,
+dnl     |   |                 m4_def_replacements_for_extended_patterns,
+dnl     |   |                 m4_def_extended_replacements)
+dnl     |   |-- PATTERNS (m4_pattern_extension0, ...)
+dnl     |   `-- m4_interface_generator_common_dat.m4
+dnl     |         (m4_class_pattern_replacements)
+dnl     |-- m4_interface_generator_<interface>_procedure_generator.m4
+dnl     |    (m4_procedure_list)
+dnl     `-- EXPAND_PROCEDURES (m4_get_schematic_code)
+dnl
+dnl Note that the macro names indicate that they are used by the parent
+dnl macro group.
+dnl ---------------------------------------------------------------------
+
+dnl =====================================================================
+dnl           *** HELPERS ****
+dnl  The following are application independent helper macros
+dnl =====================================================================
+
+dnl All these helper macros are intended to be "PUBLIC"
+dnl except for auxiliary macros, labelled as "LOCAL".
+
+dnl m4_forloop(Iteration_Var, From_Value, To_Value, Loop_Body)
+dnl
+dnl Code copied from m4 documentation.
+m4_define(`m4_forloop',
+  `m4_pushdef(`$1', `$2')_m4_forloop(`$1', `$2', `$3', `$4')m4_popdef(`$1')')
+m4_define(`_m4_forloop',
+  `$4`'m4_ifelse($1, `$3', ,
+    `m4_define(`$1', m4_incr($1))_m4_forloop(`$1', `$2', `$3', `$4')')')
+
+
+dnl m4_upcase(String), m4_downcase(String)
+dnl
+dnl Code copied from m4 documentation.
+dnl Examples: m4_upcase(`abCd')   ==> ABCD
+dnl           m4_downcase(`abCd') ==> abcd
+m4_define(`m4_upcase', `m4_translit(`$*', `a-z', `A-Z')')
+m4_define(`m4_downcase', `m4_translit(`$*', `A-Z', `a-z')')
+
+dnl m4_capfirstletter(String)
+dnl
+dnl Capitalises first letter of words that can have letters and underscores.
+dnl Example: m4_capfirstletter(`xyz_abc') ==> Xyz_abc
+m4_define(`m4_capfirstletter',
+  `m4_regexp(`$1', `^\(\w\)\([\w_]*\)',
+     m4_upcase(`\1')`\2')')
+
+dnl m4_capfirstletters(String)
+dnl
+dnl Capitalises first letter of subwords that can have letters only.
+dnl Example: m4_capfirstletter(`xyz_abc') ==> Xyz_Abc
+m4_define(`m4_capfirstletters',
+  `m4_ifelse(m4_index(`$1', `_'), -1,
+     `m4_regexp(`$1', `^\(\w\)\(\w*\)',
+       `m4_upcase(`\1')`\2'')',
+         m4_regexp(`$1', `^\(\w\)\(\w*_\)\(\w\)\(\w*\)',
+           `m4_upcase(`\1')`\2'm4_upcase(`\3')`\4''))')
+
+m4_define(`m4_changecase',
+  `m4_ifelse(m4_regexp(`$1', `[A-Z]'), -1,
+    m4_capfirstletters($1),
+    m4_downcase($1))`'dnl
+')
+
+
+dnl m4_add_one_after_underscore(String)
+dnl
+dnl Adds a 1 after any underscore (needed for Java interface code)..
+dnl Example: m4_capfirstletter(`xyz_abc') ==> xyz_1abc
+m4_define(`m4_add_one_after_underscore', `m4_patsubst(`$1', `_', `_1')')
+
+dnl m4_ifndef(Macro, Default Definition)
+dnl
+dnl If Macro is defined, use that definition;
+dnl otherwise use the Default Definition.
+m4_define(`m4_ifndef', `m4_ifdef(`$1', $1, $2)')
+
+dnl m4_nargs expands to the number of arguments.
+dnl
+dnl Code copied from m4 documentation.
+m4_define(`m4_nargs', `$#')
+
+dnl m4_arg(Ind, Arg1, Arg2, ...)
+dnl
+dnl m4_arg expands to Arg`'Ind
+m4_define(`m4_arg',
+`m4_ifelse($1, 0, , $1, 1, $2, `m4_arg(m4_decr($1), m4_shift(m4_shift($@)))')')
+
+dnl m4_arg_counter(String, Arg1, Arg2, ...)
+dnl
+dnl If String = Arg`'Counter, m4_arg_counter expands to Counter
+dnl where Counter is the least index for which this holds.
+dnl Otherwise it expands to the empty string.
+m4_define(`m4_arg_counter', `m4_arg_counter_aux(1, $@)')
+
+dnl LOCAL
+m4_define(`m4_arg_counter_aux', `dnl
+m4_ifelse($#, 0, ,$#, 1, , $#, 2, ,
+  $2, $3, $1,
+  $#, 3, ,
+  `m4_arg_counter_aux(m4_incr($1), $2, m4_shift(m4_shift(m4_shift($@))))')`'dnl
+')
+
+dnl m4_echo_unquoted(Args)
+dnl
+dnl Code copied from m4 documentation where it is called echo1.
+m4_define(`m4_echo_unquoted', `$*')
+dnl m4_echo_quoted(Args)
+dnl
+dnl Code copied from m4 documentation where it is called echo2.
+m4_define(`m4_echo_quoted', `$@')
+
+dnl ----------------------------------------------------------------------
+dnl m4_two_seq_intersection,
+dnl m4_three_seq_intersection and helper macros
+dnl
+dnl These find the intersection of two and three sequences, respectively.
+dnl ----------------------------------------------------------------------
+dnl
+dnl m4_seq_intersection
+dnl
+dnl This macro with its helper macros below,
+dnl intersects two or three sequences that must be previously defined
+dnl as `m4_1st_sequence', `m4_2nd_sequence' and, if there is a third,
+dnl `m4_3rd_sequence'. The number of sequences (2 or 3) must also be defined
+dnl by the macro `m4_number_of_sequences'. The order of the
+dnl intersected sequence is that of m4_1st_sequence.
+dnl
+dnl For example, if m4_1st_sequence is defined to be `a, b, c, d' and
+dnl m4_2nd_sequence is defined to be `b, d, e, a, f',
+dnl this macro is defined to be `a, b, d'.
+m4_define(`m4_seq_intersection', `dnl
+m4_define(`m4_add_one_first', 1)`'dnl
+m4_patsubst(m4_seq_intersection_aux(m4_1st_sequence),
+            |COMMA|, `, ')`'dnl
+')
+
+dnl LOCAL
+dnl m4_seq_intersection_aux(...)
+dnl
+dnl The arguments are the first sequence to be intersected.
+dnl It calls either the helper macro for 3 sequences or the helper
+dnl macro for 2 sequences (depending on the number of sequences).
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1,
+  m4_`'m4_num_of_sequences`'_seq_intersection_aux($1, m4_2nd_sequence),
+  m4_`'m4_num_of_sequences`'_seq_intersection_aux($1, m4_2nd_sequence)`'dnl
+`m4_seq_intersection_aux(m4_shift($@))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_3_seq_intersection_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' also occurs
+dnl in the 2nd or in a later argument position
+dnl as well as in m4_3rd_sequence.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_3_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+  `m4_ifelse($1, $2, `m4_2_seq_intersection_aux($1, m4_3rd_sequence)')',
+  `m4_ifelse($1, $2, `m4_2_seq_intersection_aux($1, m4_3rd_sequence)',
+`m4_3_seq_intersection_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl LOCAL
+dnl m4_2_seq_intersection_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' also occurs
+dnl in the 2nd or in a later argument position.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_2_seq_intersection_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2,
+  `m4_ifelse($1, $2, `m4_add_one($1)')',
+  `m4_ifelse($1, $2, `m4_add_one($1)',
+`m4_2_seq_intersection_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl LOCAL
+dnl m4_add_one(String)
+dnl
+dnl This separates the new sequence temporarily with |COMMA| to avoid
+dnl the `,' being mis-interpreted by m4.
+m4_define(`m4_add_one', `dnl
+m4_ifelse(m4_add_one_first, 1,
+  $1`'m4_undefine(`m4_add_one_first'), |COMMA|$1)`'dnl
+')
+
+dnl ----------------------------------------------------------------------
+dnl m4_seq_difference and helper macros
+dnl
+dnl This finds the difference of two sequences.
+dnl ----------------------------------------------------------------------
+dnl
+dnl m4_seq_difference
+dnl
+dnl CHECKME: Currently this macro is not used.
+dnl This macro with its helper macros below,
+dnl finds the difference of two sequences that must be previously defined
+dnl as `m4_1st_sequence', `m4_2nd_sequence'. The order of the
+dnl difference sequence is that of m4_1st_sequence.
+dnl
+dnl For example, if m4_1st_sequence is defined to be `a, b, c, d' and
+dnl m4_2nd_sequence is defined to be `d, e, a, f',
+dnl this macro is defined to be `b, c'.
+m4_define(`m4_seq_difference', `dnl
+m4_patsubst(m4_seq_difference_aux(m4_1st_sequence),
+            `^|COMMA|', `')`'dnl
+')
+m4_define(`m4_seq_differencexx', `dnl
+m4_patsubst(m4_patsubst(m4_seq_difference_aux(m4_1st_sequence),
+            `^|COMMA|', `'),
+            |COMMA|, `, ')`'dnl
+')
+
+dnl LOCAL
+dnl m4_seq_difference_aux(...)
+dnl
+dnl The arguments are the first sequence to be intersected.
+dnl It calls either the helper macro for 3 sequences or the helper
+dnl macro for 2 sequences (depending on the number of sequences).
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_seq_difference_aux', `dnl
+m4_ifelse($#, 0, , $#, 1,
+  m4_2_seq_difference_aux($1, m4_2nd_sequence),
+  `m4_2_seq_difference_aux($1, m4_2nd_sequence)`'dnl
+m4_seq_difference_aux(m4_shift($@))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_2_seq_difference_aux(String, ...)
+dnl
+dnl This is defined to be `String' if `String' does not occur
+dnl in the 2nd or in a later argument position.
+dnl It calls itself recursively with the tail of the sequence.
+m4_define(`m4_2_seq_difference_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, `m4_add_one($1)', $#, 2,
+  `m4_ifelse($1, $2, , `m4_add_one($1)')',
+  `m4_ifelse($1, $2, ,
+`m4_2_seq_difference_aux($1, m4_shift(m4_shift($@)))')')`'dnl
+')
+
+dnl =====================================================================
+dnl              *** PATTERNS ***
+dnl Some processing that just involves the patterns themselves.
+dnl =====================================================================
+
+dnl ----------- General Info on Patterns --------------------------------
+dnl Each pattern can be plain, have an extension (eg "A_") and/or
+dnl be annotated by "!", and, for Java "1" where the
+dnl latter can be combined with a "!".
+dnl In the text being replaced, all patterns, extensions, and annotations
+dnl are in upper case and the complete pattern is bracketed by the pattern
+dnl delimiter.
+dnl ---------------------------------------------------------------------
+
+dnl PRIVATE
+dnl Used in macro-group "REPLACEMENT_TEXT"
+dnl
+dnl DEFAULT_DEF
+dnl m4_pattern_extension`'EIndex
+dnl
+dnl is defined for each allowed extension.
+dnl These options can be added to as needed by any of the generator files.
+dnl
+m4_define(`m4_pattern_extension0', `')
+m4_define(`m4_pattern_extension1', `A_')
+m4_define(`m4_pattern_extension2', `B_')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS"
+dnl
+dnl m4_pattern_annotation`'AIndex
+dnl
+dnl is defined here for AIndex values 0 and 1.
+dnl - 0, which has the empty annotation,
+dnl   means that the actual replacement must be unchanged:
+dnl - 1, which has annotation !,
+dnl   means that the actual replacement must be:
+dnl   - lowercase, if the original has the first character uppercase, and
+dnl   - the first letter of each word ("_" separated) uppercase, otherwise.
+m4_define(`m4_pattern_annotation0', `')
+m4_define(`m4_pattern_annotation1', `!')
+
+dnl PUBLIC
+dnl m4_java_prefix_one_annotation
+dnl Only used by Java/jni/ppl_interface_generator_java_classes_cc_files.m4
+dnl as the extra annotations are only needed there.
+dnl PRIVATE
+dnl m4_pattern_annotation`'AIndex
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS"
+dnl
+dnl m4_pattern_annotation`'AIndex is defined here for AIndex values 2 and 3:
+dnl - 2, which has annotation 1,
+dnl   means that the actual replacement must have a 1 after
+dnl   the underscore;
+dnl - 3, which has annotation 1!,
+dnl   means that the actual replacement must have a 1 after
+dnl   the underscore with the same change of case as for the annotation "!".
+m4_define(`m4_java_prefix_one_annotation',
+`m4_define(`m4_pattern_annotation2', `1')
+m4_define(`m4_pattern_annotation3', `1!')')
+
+dnl =====================================================================
+dnl              *** REPLACEMENT_TEXT ***
+dnl The precise replacing text is defined in
+dnl m4_interfaces_generator_common_dat.m4
+dnl We first retrieve this text by constructing the correct macro
+dnl for the extended pattern. We then define the additional text
+dnl processing needed based on the annotation of the pattern.
+dnl =====================================================================
+
+dnl LOCAL
+dnl DEFAULT_DEF
+dnl m4_replacement_extension`'EIndex
+dnl
+dnl is defined for each allowed extension EIndex.
+dnl This should correspond in lowercase to m4_pattern_extension.
+dnl
+m4_define(`m4_replacement_extension0', `')
+m4_define(`m4_replacement_extension1', `a_')
+m4_define(`m4_replacement_extension2', `b_')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS".
+dnl
+dnl m4_def_replacements_for_extended_patterns(RIndex, EIndex)
+dnl m4_replace`'EIndex
+dnl
+dnl RIndex         - is the index of the replacement;
+dnl EIndex         - is the index of the extension.
+dnl For each possible EIndex value, m4_replace`'EIndex
+dnl is defined for the RIndex replacement.
+dnl
+m4_define(`m4_def_replacements_for_extended_patterns', `dnl
+m4_ifdef(`m4_pattern_extension$2',
+  `m4_define(`m4_replace$2',
+    `m4_arg($1, m4_replacements$2)')`'dnl
+m4_def_replacements_for_extended_patterns($1, m4_incr($2))`'dnl
+')`'dnl
+')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS".
+dnl
+dnl m4_annotated_pattern_replacement`'AIndex(EIndex)
+dnl
+dnl where AIndex in {0..3}
+dnl Note that annotations 2 and 3 are only used by the Java interface.
+dnl
+dnl EIndex         - is the index of the extension.
+dnl
+dnl For each annotation and, for the single replacement
+dnl m4_replace`'EIndex (already defined for the current pattern),
+dnl this macro defines an exact replacement string to be used to
+dnl replace the annotated and extended pattern.
+dnl
+m4_define(`m4_annotated_pattern_replacement0',
+  `m4_replace$1')
+m4_define(`m4_annotated_pattern_replacement1',
+  `m4_changecase(m4_replace$1)')
+m4_define(`m4_annotated_pattern_replacement2',
+  `m4_add_one_after_underscore(m4_replace$1)')
+m4_define(`m4_annotated_pattern_replacement3',
+  `m4_add_one_after_underscore(m4_changecase(m4_replace$1))')
+
+dnl PRIVATE
+dnl Used in macro-group "PATTERNS_TO_REPLACEMENTS".
+dnl
+dnl m4_def_extended_replacements(Class_Counter, Pattern, EIndex)
+dnl m4_replacements`'EIndex
+dnl
+dnl Class_Counter    - The current class counter;
+dnl Pattern          - The current pattern;
+dnl EIndex           - is the index of the replacement macro name extension.
+dnl
+dnl m4_replacements`'EIndex is defined to be the list
+dnl of the replacements for Pattern with the EIndex extension
+dnl and for the class indicated by Class_Counter.
+dnl This uses m4_class_pattern_replacements/3 that is defined in
+dnl ppl_interface_generator_common_dat.m4 and uses the data for
+dnl the replacements defined in the same file.
+dnl
+m4_define(`m4_def_extended_replacements', `dnl
+m4_ifdef(m4_replacement_extension`'$3, `dnl
+m4_define(`m4_replacements$3',
+  `m4_class_pattern_replacements($1, $2, m4_replacement_extension$3)`'dnl
+m4_def_extended_replacements($1, $2, m4_incr($3))')')`'dnl
+')
+
+dnl =====================================================================
+dnl              *** EXPAND_PROCEDURES ***
+dnl  The next macros deal with expanding the schematic procedures.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_get_arity(Procedure_Flags)
+dnl
+dnl Procedure_Flags - The schematic code flags.
+dnl
+dnl If the substring "/Arity" is found in the Procedure_Flags,
+dnl this macro expands to Arity.
+m4_define(`m4_get_arity', `m4_regexp(`$1', `/\([0-9]*\)', \1)')
+
+dnl LOCAL
+dnl m4_get_attribute(Procedure_Flags)
+dnl
+dnl Procedure_Flags - The schematic code flags.
+dnl
+dnl If the substring "*nofail" is found in the Procedure_Flags,
+dnl this macro expands to "nofail"
+dnl This is only needed for the Ciao system code.
+m4_define(`m4_get_attribute', `m4_regexp(`$1', `\*\(nofail\)', \1)')
+
+dnl We next define the default values for two extra macros
+dnl giving us more dynamic control by the individual code generators.
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl m4_procedure_schema_extension
+dnl
+dnl Normally, the procedure schema is defined using the extension `code'
+dnl but in the (Prolog) documentation this is varied according to the type of
+dnl the procedure.
+m4_define(`m4_procedure_schema_extension', `code')
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl m4_procedure_schema_debug
+dnl
+dnl the default is to do nothing;
+dnl However, by locally defining this to be
+dnl m4_dumpdef($1, m4_procedure_schema_extension, we can check
+dnl that all the procedure schemas are defined with the given extension.
+m4_define(`m4_procedure_schema_debug', `')
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl m4_expanded_procedure_schema(Procedure_Name,
+dnl                              [Arity, Attribute],
+dnl                              Start_Flag)
+dnl
+dnl Procedure_Name - The schematic name;
+dnl Arity          - The arity of the procedure;
+dnl Attribute      - The attribute `nofail' or `';
+dnl Start_Flag     - 0 suppresses any separator
+dnl                  (needed for expanding a comma separated list).
+dnl
+dnl The default definition.
+dnl Appends "_code" to Procedure_Name so that it can match the name
+dnl of one of the macros defined (if ever) in file *_code.m4 and get
+dnl therefore expanded to the corresponding code schema.
+dnl
+dnl Here arguments Arity and Attribute are ignored.
+dnl This macro is redefined when a different extension is needed.
+dnl (e.g., in the Prolog system files).
+dnl
+dnl Note: the macro `$1_code' has to be called using builtin `indir'
+dnl because it is not a legal m4 identifier (it contains `@').
+dnl
+dnl Some test generators and the Prolog system file generators redefine this
+dnl macro to construct the code directly from the schema name, arity
+dnl and its attributes.
+m4_define(`m4_expanded_procedure_schema',
+  `m4_ifdef($1_`'m4_procedure_schema_extension,
+            `m4_indir($1_`'m4_procedure_schema_extension)',
+            `m4_procedure_schema_debug($1)')`'dnl
+')
+
+dnl PRIVATE
+dnl Used in macro-group "ONE_CLASS".
+dnl
+dnl m4_get_schematic_code(Procedure_Spec, Start_Flag, Class_Kind)
+dnl
+dnl Procedure_Spec - The schematic procedure name, complete with any flags;
+dnl Start_Flag     - 0 suppresses any separator
+dnl                  (needed for expanding a comma separated list);
+dnl Class_Kind     - The current class kind.
+dnl
+dnl Procedure_Spec has the flags removed and expanded to the extended code.
+m4_define(`m4_get_schematic_code', `dnl
+m4_patsubst(`$1',
+         `[ ]*\(ppl_[^ /]+\)\(.*\)',
+         `m4_expanded_procedure_schema(\1, m4_get_arity(\2),
+                                       m4_get_attribute(\2), $2, $3)')`'dnl
+')
+
+dnl =====================================================================
+dnl              *** FILTER_PROCEDURES ***
+dnl ====== The next set of macros filter the procedure specifications   =
+dnl ====== according to the +/-group names in the extra flags in the    =
+dnl ====== procedure specification.                                     =
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_keep_or_throw_for_one_group(
+dnl     Class_Counter, Procedure_Spec, +_or_-, Group)
+dnl
+dnl Class_Counter   - The current class counter;
+dnl Procedure_Spec  - A schematic procedure name with flags still attached;
+dnl +_or_-          - + or -;
+dnl Group           - A group name.
+dnl
+dnl This checks if Class_Kind is in the list of class kinds defined
+dnl by Group (in ppl_interface_generator_common_dat.m4);
+dnl if it is, it checks if +Group or -Group
+dnl (depending if +_or_- is + or -) is included in the Procedure_Spec;
+dnl if it is, then it expands to 1, otherwise, expands to 0.
+m4_define(`m4_keep_or_throw_for_one_group', `dnl
+m4_ifelse(m4_arg_counter($1, m4_$4_group), `', 0,
+  `m4_ifelse(m4_index($2, $3$4), -1, 0, 1)')`'dnl
+')
+
+dnl LOCAL
+dnl m4_keep_or_throw(
+dnl     Class_Counter, Procedure_Spec, +_or_-, Group1, Group2, ...)
+dnl
+dnl Class_Counter   - The current class counter;
+dnl Procedure_Spec  - A schematic procedure name with flags still attached;
+dnl +_or_-          - + or -;
+dnl Group1          - A group name;
+dnl ....
+dnl Groupk          - A group name.
+m4_define(`m4_keep_or_throw', `dnl
+m4_ifelse($#, 0, 0, $#, 1, 0, $#, 2, 0, $#, 3, 0,
+  $#, 4, `m4_keep_or_throw_for_one_group($1, $2, $3, $4)',
+    `m4_ifelse(m4_keep_or_throw_for_one_group($1, $2, $3, $4), 1, 1,
+      `m4_keep_or_throw($1, $2, $3,
+                       m4_shift(m4_shift(m4_shift(m4_shift($@)))))')')`'dnl
+')
+
+dnl LOCAL
+dnl m4_filter_one_procedure(Class_Counter, Procedure_Spec)
+dnl
+dnl Class_Counter   - The current class counter;
+dnl Procedure_Spec  - A schematic procedure name with flags still attached.
+dnl
+dnl Keeps just those procedures that are wanted for the given class kind.
+dnl It first checks if there is a group in Procedure_Spec, whose
+dnl definition includes the Class_Kind, preceded by a "-",
+dnl if so, it expands to the empty string;
+dnl otherwise, it checks if there is a group in Procedure_Spec, whose
+dnl definition includes the Class_Kind, preceded by a "+",
+dnl if so, it expands to Procedure_Spec.
+m4_define(`m4_filter_one_procedure', `dnl
+m4_define(`m4_proc_info_string',
+       `m4_patsubst(`$2', `[ ]*ppl_[^ ]+ \(.*\)', \1)')`'dnl
+m4_ifelse(m4_keep_or_throw(m4_class_kind$1,
+                           m4_proc_info_string, -,
+                           m4_group_names),
+  1, 0,
+  m4_keep_or_throw(m4_class_body_kind$1,
+                             m4_proc_info_string, \,
+                             m4_group_names),
+  1, 0,
+  m4_keep_or_throw(m4_class_body_2nd_kind$1,
+                             m4_proc_info_string, ?,
+                             m4_group_names),
+  1, 0,
+  `m4_keep_or_throw(m4_class_kind$1,
+                   m4_proc_info_string, +,
+                   m4_group_names)')`'dnl
+m4_undefine(m4_proc_info_string)`'dnl
+')
+
+dnl PRIVATE
+dnl Used in macro-group "ONE_CLASS".
+dnl
+dnl m4_filter_all_procedures(Class_Counter, keep_or_throw_flag,
+dnl                         Procedure_Spec1, ProcedureSpec2, ...)
+dnl
+dnl Class_Counter   - The current class kind;
+dnl keep_or_throw_flag
+dnl                 - has value 1 or 0;
+dnl Procedure_Spec1 - A schematic procedure name with flags still attached;
+dnl ...
+dnl Procedure_Speck - A schematic procedure name with flags still attached;
+dnl Keeps just those procedure names that are needed for the given class kind.
+dnl The classes to be kept or filtered away are determined by extra info
+dnl included with each Procedure_Name
+dnl The keep_or_throw_flag determines if the filtered procedures
+dnl are the wanted (value 1) procedures or the unwanted ones (value 0);
+dnl Here we only use the wanted procedures list.
+dnl The unwanted list is used when generating the Prolog tests.
+m4_define(`m4_filter_all_procedures', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, ,
+  $#, 3,
+    `m4_ifelse(m4_filter_one_procedure($1, $3), $2,
+       `$3')',
+    `m4_ifelse(m4_filter_one_procedure($1, $3), $2,
+       `$3,
+')`'dnl
+m4_filter_all_procedures($1, $2, m4_shift(m4_shift(m4_shift($@))))`'dnl
+')`'dnl
+')
+
+dnl =====================================================================
+dnl              *** PATTERNS_TO_REPLACEMENTS ***
+dnl The string has all its patterns replaced by the corresponding
+dnl replacements. If there are several alternative replacements
+dnl then several versions of the pattern-replaced string are generated.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_annotated_extended_pattern_replacement(String, EIndex, AIndex)
+dnl
+dnl String        - is the string that has the patterns for replacing;
+dnl EIndex        - is the index of the extension;
+dnl AIndex        - is the index of the annotation.
+dnl
+dnl One pattern with an optional extension and annotation is replaced
+dnl by the corresponding replacement.
+dnl This is the key inner step for each string
+dnl (usually this string is the expanded procedure schema).
+dnl
+m4_define(`m4_annotated_extended_pattern_replacement', `dnl
+m4_ifdef(`m4_pattern_annotation$3',
+  `m4_define(`m4_annotated_extended_pattern',
+        m4_pattern_annotation$3`'m4_extended_pattern)`'dnl
+m4_annotated_extended_pattern_replacement(m4_patsubst($1,
+  @`'m4_annotated_extended_pattern`'@,
+  m4_annotated_pattern_replacement$3($2)), $2, m4_incr($3))',
+  `$1')`'dnl
+')
+
+dnl LOCAL
+dnl m4_expand_pattern_by_one_replacement(String, RIndex)
+dnl
+dnl String        - is the string;
+dnl RIndex        - is the index of the replacement.
+dnl
+dnl The patterns in the string are replaced by the replacement
+dnl indexed by RIndex.
+dnl
+dnl It first defines the m4_replace`'EIndex macros for each EIndex
+dnl extension using the macro m4_def_replacements_for_extended_patterns/2.
+dnl If m4_replace0 is defined to be different from "NONE",
+dnl the macro m4_expand_pattern_by_one_replacement_aux/2 is called
+dnl to do the replacements, iterating through the extensions.
+dnl When m4_replace0 is NONE, then the code is replaced by the
+dnl the empty string.
+dnl
+m4_define(`m4_expand_pattern_by_one_replacement', `dnl
+m4_def_replacements_for_extended_patterns($2, 0)`'dnl
+m4_ifelse(m4_replace0, NONE, `',
+  m4_expand_pattern_by_one_replacement_aux($1, 0)`'dnl
+)`'dnl
+')
+
+dnl LOCAL
+dnl m4_expand_pattern_by_one_replacement_aux(String, EIndex)
+dnl m4_extended_pattern(EIndex)
+dnl
+dnl String        - is the string;
+dnl EIndex        - is the index of the pattern extension.
+dnl
+dnl Iterates through EIndex values, defining m4_extended_pattern(EIndex)
+dnl and calling an auxiliary macro to replace the (delimited, possibly
+dnl extended and annotated) m4_PATTERN in String.
+dnl
+dnl If there are no replacements for EIndex, stop the replacements.
+dnl
+m4_define(`m4_expand_pattern_by_one_replacement_aux', `dnl
+m4_ifelse(`m4_replacements$2', `', `$1',
+   `m4_ifdef(`m4_pattern_extension$2',
+   `m4_define(`m4_extended_pattern', m4_pattern_extension$2`'m4_PATTERN)`'dnl
+m4_expand_pattern_by_one_replacement_aux(
+    m4_annotated_extended_pattern_replacement($1, $2, 0),
+       m4_incr($2))',
+   `$1')`'dnl
+')`'dnl
+')
+
+dnl LOCAL
+dnl m4_expand_pattern_by_all_replacements(String, RIndex)
+dnl
+dnl String        - is the string;
+dnl RIndex        - is the index of the replacement.
+dnl
+dnl This iteratively calls m4_expand_pattern_by_one_replacement/2 to replace
+dnl (a delimited form of possibly extended and annotated) m4_PATTERN by the
+dnl arguments of m4_replacements`'RIndex.
+m4_define(`m4_expand_pattern_by_all_replacements', `dnl
+m4_ifelse($2, m4_nargs(m4_replacements0),
+  m4_expand_pattern_by_one_replacement($1, $2),
+  `m4_expand_pattern_by_one_replacement($1, $2)`'dnl
+m4_expand_pattern_by_all_replacements($1, m4_incr($2))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_replace_one_pattern_in_string(Class_Number, String, Pattern)
+dnl
+dnl Class_Number  - is the index to Class in Class_List;
+dnl String        - is the code to be changed;
+dnl Pattern       - is the pattern to be replaced.
+dnl
+dnl Replaces all occurrences of the capitalised form of Pattern
+dnl in String by the required replacement
+dnl (determined both by the class kind of Class and Pattern).
+m4_define(`m4_replace_one_pattern_in_string', `dnl
+dnl the m4_PATTERN (in uppercase) is the string to be replaced.
+m4_define(`m4_PATTERN', m4_upcase($3))`'dnl
+m4_def_extended_replacements($1, $3, 0)`'dnl
+m4_expand_pattern_by_all_replacements($2, 1)`'dnl
+dnl Cleanup temporary definitions.
+m4_undefine(`m4_PATTERN')`'dnl
+')
+
+dnl PUBLIC
+dnl Used in macro-group "ONE_CLASS" and by other m4 generator files.
+dnl
+dnl m4_replace_all_patterns(Class_Number, String)
+dnl
+dnl A (recursive) macro to replace, inside the second argument String,
+dnl all of the patterns.
+dnl
+dnl This is public because it is used by some code generators to replace
+dnl patterns used in some additional text provided locally.
+m4_define(`m4_replace_all_patterns', `dnl
+m4_define(`m4_ann_ext_pattern_in_string',
+  `m4_regexp($2, `[.]*@[^@_A-Z]*\([_A-Z]+\)@.*', `\1')')`'dnl
+m4_ifelse(m4_ann_ext_pattern_in_string, `', $2,
+  `m4_replace_all_patterns($1,
+    m4_replace_one_pattern_in_string($1, $2,
+      m4_downcase(m4_patsubst(m4_ann_ext_pattern_in_string, ^[A-E]_, `'))))')
+')
+
+dnl =====================================================================
+dnl              *** ONE_CLASS ***
+dnl   The next set of macros process a single class.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_replace_procedure_spec_by_code(Class_Number, Procedure_Spec)
+dnl
+dnl Class_Number   - The current class counter;
+dnl Procedure_Spec - The schematic procedure name, complete with any flags.
+dnl
+dnl The procedure specification is replaced with the code and then
+dnl the patterns in the code are replaced by the required replacements.
+dnl
+dnl Note: one schematic specification will replaced by a single
+dnl matching schematic code item; which is then replaced by several
+dnl instances.
+m4_define(`m4_replace_procedure_spec_by_code', `dnl
+m4_patsubst(`$2', `\(.*\)', `dnl
+m4_replace_all_patterns($1,
+  m4_get_schematic_code(\1, 1, $1))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_replace_all_procedure_specs_by_code(Class_Number,
+dnl                            Procedure_Spec1, Procedure_Spec2, ...)
+dnl
+dnl Class_Number    - The current class counter;
+dnl Procedure_Spec1 - A schematic procedure name;
+dnl ...
+dnl Procedure_Speck - A schematic procedure name.
+dnl
+dnl Each name from the second argument onwards is replaced
+dnl with the code and then the schema patterns in the code
+dnl are replaced by the various instances.
+m4_define(`m4_replace_all_procedure_specs_by_code', `dnl
+m4_ifelse($#, 0, , $#, 1, ,
+       $#, 2, `m4_replace_procedure_spec_by_code($1, $2)',
+       `dnl
+m4_replace_procedure_spec_by_code($1, $2)`'dnl
+m4_replace_all_procedure_specs_by_code($1, m4_shift(m4_shift($@)))`'dnl
+')dnl
+')
+
+dnl LOCAL
+dnl DEFAULT DEF
+dnl
+dnl m4_pre_extra_class_code(Class_Counter)
+dnl m4_post_extra_class_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class.
+dnl
+dnl Default (empty) definitions for pre- and post- code for each class.
+dnl These should be redefined as needed.
+m4_define(`m4_pre_extra_class_code', `')
+m4_define(`m4_post_extra_class_code', `')
+
+dnl PRIVATE
+dnl Used by macro-group "ALL_CLASSES".
+dnl
+dnl DEFAULT DEF
+dnl m4_one_class_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class.
+dnl
+dnl First, any necessary prefix code for the procedures in
+dnl that class is added.
+dnl Then, the main procedure input list is filtered according to
+dnl the current class kind and the +/- codes included with the procedure.
+dnl Each procedure that is not filtered away is checked to see if
+dnl there is a macro with "_code" extension that defines the code.
+dnl Then a macro sets the class and other schematic components.
+dnl Finally, any necessary postfix code for the procedures in
+dnl that class is added.
+m4_define(`m4_one_class_code', `dnl
+dnl m4_this_class_stuff($1)`'dnl
+m4_pre_extra_class_code($1)`'dnl
+m4_define(`m4_filtered_proc_list',
+       `m4_filter_all_procedures($1, 1, m4_procedure_list)')`'dnl
+m4_replace_all_procedure_specs_by_code($1, m4_filtered_proc_list)`'dnl
+m4_undefine(`m4_filtered_proc_list')`'dnl
+m4_post_extra_class_code($1)`'dnl
+')
+
+dnl =====================================================================
+dnl              *** ALL_CLASSES ***
+dnl  The final set of macros process all the classes, one at a time.
+dnl =====================================================================
+
+dnl LOCAL
+dnl m4_pre_all_classes_code
+dnl
+dnl Default (empty) definitions for code that must be placed before all
+dnl the generated code.
+dnl This is required for code that depends on the instantiated classes
+dnl (so must be generated from a schema) but has to be included before
+dnl all classes (as in ppl_prolog_icc.m4).
+m4_define(`m4_pre_all_classes_code', `')
+
+dnl LOCAL
+dnl m4_all_classes_code(Class_Counter)
+dnl
+dnl Class_Counter   - The index for the current class;
+dnl This iterates through the classes to generate the code.
+dnl The actual code for each class is generated by m4_one_class_code.
+dnl The generated code then has the pattern "|COMMA|" replaced by ",".
+m4_define(`m4_all_classes_code', `dnl
+m4_ifdef(m4_interface_class`'$1,
+  `m4_patsubst(m4_one_class_code($1), `|COMMA|', `,')`'dnl
+m4_all_classes_code(m4_incr($1))')`'dnl
+')
+
+dnl LOCAL
+dnl m4_class_definitions_initialized/0
+dnl
+dnl Avoids initializing the class macro definitions more than once
+dnl when the main macro m4_all_code/0 is called more than once in a
+dnl file generation.
+m4_define(`m4_class_initialized', `false')
+
+m4_define(`m4_initialize_all', `dnl
+m4_init_class_definitions`'dnl
+m4_define(`m4_class_initialized', `true')`'dnl
+')
+
+dnl PUBLIC
+dnl m4_all_code
+dnl
+dnl The macros for names of the classes are first initialized:
+dnl
+dnl The main loop macro m4_all_classes_loop is called to generate
+dnl code for all the required classes.
+m4_define(`m4_all_code', `dnl
+m4_ifelse(m4_class_initialized, `false', `m4_initialize_all')`'dnl
+m4_pre_all_classes_code`'dnl
+m4_all_classes_code(1)`'dnl
+')
diff --git a/interfaces/ppl_interface_generator_common_dat.m4 b/interfaces/ppl_interface_generator_common_dat.m4
new file mode 100644
index 0000000..d887eb8
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common_dat.m4
@@ -0,0 +1,1006 @@
+m4_divert(-1)
+
+dnl This m4 file includes macro definitions for:
+dnl - processing the class list in ppl_interface_instantiations.m4;
+dnl - the control of the procedures to be generated for each class;
+dnl - the replacements for the patterns in the code files.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl Classes to be implemented and C++ versions of these classes.
+dnl If generating the documentation, the instantiations are fixed and defined locally.
+m4_ifdef(`m4_configuration_independent', `',
+  `m4_include(ppl_interface_instantiations.m4)')
+
+dnl =====================================================================
+dnl ===== The first set of macros here initialise the class names   =====
+dnl ===== using "@" separated lists and defined                     =====
+dnl ===== by macros in ppl_interface_instantiations.m4.             =====
+dnl =====================================================================
+
+
+dnl m4_init_class_definitions
+dnl
+dnl Macro called by m4_all_code in m4_interface_generators_common.m4
+dnl
+dnl For all the classes required by the configuration and specified
+dnl by m4_interface_classes_names and m4_cplusplus_classes_names
+dnl in <build_dir>/interfaces/m4_interface_instantiations.m4
+dnl this defines macros for their interface and cplusplus names,
+dnl their components and 'entities' related to these components.
+dnl
+dnl The Boolean flag m4_class_definitions_initialized is set to true
+dnl to avoid repeated generation when more than one set of code is
+dnl generated for any one file.
+m4_define(`m4_init_class_definitions', `dnl
+m4_init_interface_classes(m4_interface_classes_names)`'dnl
+m4_init_cplusplus_classes(m4_cplusplus_classes_names)`'dnl
+')
+dnl ---------------------------------------------------------------------
+dnl =====  any extra macros needed for both interfaces and          =====
+dnl =====  cplusplus names go here                           .      =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_prefix_polyhedron(Class, String)
+dnl
+dnl Every occurrence of Polyhedron in the name is replaced by
+dnl String_Polyhedron.
+m4_define(`m4_prefix_polyhedron', `dnl
+m4_patsubst($1, Polyhedron, $2_Polyhedron)`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl =====  Macros for m4_interface_class<class_num> are defined     =====
+dnl =====  here.                                                    =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_init_interface_classes(Class_List)
+dnl
+dnl Parses the @-separated list of class names Class_List
+dnl for the names of the classes used to form the names of procedures
+dnl in the user interface.
+m4_define(`m4_init_interface_classes', `dnl
+m4_init_interface_classes_aux(1, $1)')
+
+dnl m4_init_interface_classes_aux(Class_Counter, Class_List)
+dnl
+dnl Class_Counter - is the index to the first class in Class_List;
+dnl Class_List    - is a tail part of the input list of interface
+dnl                 class names.
+dnl The macro also defines m4_num_classes to be the number of classes
+dnl in the full list (ie counter + number in the current list - 1).
+dnl The macro calls m4_init_interface_names to define the next
+dnl interface names and then to to call this macro to recursively
+dnl process the rest of the list.
+m4_define(`m4_init_interface_classes_aux', `dnl
+m4_ifelse($2, `',  `m4_define(m4_num_classes, m4_decr($1))',
+  m4_regexp(`$2', `\([^@]+\)@?\(.*\)',
+    `m4_init_interface_names($1, \1, \2)'))`'dnl
+')
+
+dnl m4_init_interface_names(Class_Counter, Class, Class_List)
+dnl
+dnl Class_Counter - is the index to the first class in Class_List;
+dnl Class         - is the interface class name, as input;
+dnl Class_List    - is a tail part of the input list of interface
+dnl                 class names.
+m4_define(`m4_init_interface_names', `dnl
+m4_define(m4_interface_class`'$1, $2)`'dnl
+m4_init_interface_classes_aux(m4_incr($1), $3)`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl =====  Macros for m4_cplusplus_class<class_num> and             =====
+dnl =====  its components are defined here.                         =====
+dnl ---------------------------------------------------------------------
+
+dnl m4_init_cplusplus_classes(Class_List)
+dnl
+dnl Parses the "@"-separated list of class names Class_List
+dnl to be used in the C++ code implementing the interface procedures.
+dnl Note that first the "," is replaced by |COMMA| using the macro
+dnl m4_subst_comma because the ',' in the product class is wrongly
+dnl parsed by m4.
+dnl First all the macros m4_cplusplus_class`'Class_Counter
+dnl are defined and then the components are parsed and their entities
+dnl defined by additional macros.
+m4_define(`m4_init_cplusplus_classes',   `dnl
+dnl First all the macros m4_cplusplus_class`'Class_Counter
+dnl are defined.
+m4_init_cplusplus_classes_aux(1, m4_subst_comma($@))`'dnl
+dnl Then the components are parsed and their entities are
+dnl defined by additional macros.
+m4_init_all_cplusplus_class_components(1)`'dnl
+')
+
+dnl m4_subst_comma(String1, String2,...)
+dnl
+dnl String1, String2,... is the "@"-separated list of C++ class names
+dnl provided by the configuration.
+dnl As the product classes have their arguments ","-separated,
+dnl the "," separates the list into macro arguments.
+dnl This macro iterates through these macro arguments, replacing the
+dnl "," by |COMMA| so that the C++ names are handled as intended.
+m4_define(`m4_subst_comma',
+`m4_ifelse($#, 0, , $#, 1, $1,
+  `$1`'COMMA`'m4_subst_comma(m4_shift($@))')')
+
+dnl m4_init_cplusplus_classes_aux(Class_Counter, Class_List)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl Class_List    - is a tail part of the input list of cplusplus
+dnl                 class names.
+dnl The macro calls m4_init_cplusplus_names to define the
+dnl cplusplus names (which calls this macro recursively).
+dnl The COMMA pattern is revised to |COMMA| as soon as a class name
+dnl has been separated from the @-separated list of classes.
+m4_define(`m4_init_cplusplus_classes_aux', `dnl
+m4_ifelse($2, `',  `',
+  m4_regexp(`$2', `\([^@]+\)@?\(.*\)',
+    `m4_init_cplusplus_names(`$1',
+      m4_patsubst(\1, COMMA, |COMMA|), `\2')'))`'dnl
+')
+
+dnl m4_init_cplusplus_names(Class_Counter, Class, Class_List)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl Class         - is the cplusplus class name, as input;
+dnl Class_List    - is a tail part of the input list of cplusplus
+dnl                 class names.
+dnl This defines m4_cplusplus_class`'Class_Counter
+dnl and then calls m4_init_cplusplus_classes_aux to process the rest
+dnl of the list of classes.
+m4_define(`m4_init_cplusplus_names', `dnl
+m4_define(m4_cplusplus_class`'$1, `$2')`'dnl
+m4_init_cplusplus_classes_aux(m4_incr($1), $3)`'dnl
+')
+
+dnl m4_init_all_cplusplus_class_components(Class_Counter)
+dnl
+dnl Class_Counter - is the index to the next class in Class_List;
+dnl
+dnl For each class, this parses the name, finding and defining
+dnl schemas for its class kind and group.
+dnl For classes that have a sub-component "<...>" part
+dnl this also parses and defines macros for these components.
+m4_define(`m4_init_all_cplusplus_class_components', `dnl
+m4_init_cplusplus_class_components($1, m4_cplusplus_class`'$1, class)`'dnl
+m4_ifelse($1, m4_num_classes, ,
+    `m4_init_all_cplusplus_class_components(m4_incr($1))')`'dnl
+')
+
+dnl m4_init_cplusplus_class_components(Class_Counter,
+dnl                                    String, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Class         - is the cplusplus class name, as input;
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+dnl Initially (at the top level), the Macro_Specifier is just "class".
+dnl For each component in the name the string "_body" is added.
+dnl Thus for Pointset_Powerset<BD_Shape<long> > with Class_Counter = 4
+dnl and interface names Pointset_Powerset_BD_Shape_long
+dnl with BD_Shape_long defined for the component:
+dnl
+dnl m4_cplusplus_class4 = Pointset_Powerset<BD_Shape<long> >
+dnl m4_interface_class4 = Pointset_Powerset_BD_Shape_long
+dnl m4_class_kind4 = Pointset_Powerset
+dnl m4_class_group4 = pointset_powerset
+dnl m4_class_body_body4 = BD_Shape<long>
+dnl m4_cplusplus_class_body4 = BD_Shape<long>
+dnl m4_interface_class_body4 = BD_Shape_long
+dnl m4_class_body_kind4 = BD_Shape
+dnl m4_class_body_group4 = bd_shape
+dnl m4_class_body_body4 = long
+dnl
+dnl For the Product classes, the body is parsed into a "1st"
+dnl and "2nd" component:
+dnl Thus for Direct_Product<Grid,BD_Shape<long> > with Class_Counter = 5
+dnl and interface names Product_BD_Shape_long
+dnl with Grid and BD_Shape_long for the components:
+dnl m4_cplusplus_class5 = Direct_Product<Grid|COMMA|BD_Shape<long> >
+dnl m4_interface_class5 = Direct_Product_Grid_BD_Shape_long
+dnl m4_class_kind5 = Direct_Product
+dnl m4_class_group5 = product
+dnl m4_class_body5 = Grid|COMMA|BD_Shape<long>
+dnl m4_class_body_1st5 = Grid
+dnl m4_cplusplus_class_body_1st5 = Grid
+dnl m4_interface_class_body_1st5 = Grid
+dnl m4_class_body_1st_kind5 = Grid
+dnl m4_class_body_1st_group5 = grid
+dnl m4_class_body_2nd5 = BD_Shape<long>
+dnl m4_cplusplus_class_body_2nd5 = BD_Shape<long>
+dnl m4_interface_class_body_2nd5 = BD_Shape_long
+dnl m4_class_body_2nd_kind5 = BD_Shape
+dnl m4_class_body_2nd_group5 = bd_shape
+dnl m4_class_body_2nd_body5 = long
+dnl
+m4_define(`m4_init_cplusplus_class_components', `dnl
+m4_get_kind($1, $2, $3)`'dnl
+m4_get_group($1, $3)`'dnl
+m4_get_body($1, $2, $3)`'dnl
+m4_get_counter($1, $2, $3)`'dnl
+dnl
+m4_ifelse(m4_$3_group$1, pointset_powerset,
+  `m4_parse_body_for_powerset($1, $3)')`'dnl
+dnl
+m4_ifelse(m4_$3_group$1, product,
+  `m4_parse_body_for_product($1, $3)')`'dnl
+dnl
+')
+
+dnl m4_get_kind(Class_Counter, String, Macro_Specifier)
+dnl m4_get_body(Class_Counter, String, Macro_Specifier)
+dnl m4_get_group(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl String        - a cplusplus class name.
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+dnl The head (Macro_Specifier_kind) and the body of
+dnl the C++ class name in String are separated out.
+dnl m4_Macro_Specifier_kind`'Class_Counter = the first part before the "<"
+dnl m4_Macro_Specifier_body`'Class_Counter = the rest
+dnl and m4_Macro_Specifier_body`'Class_Counter defines the group to which this
+dnl class belongs.
+dnl
+dnl For example:
+dnl If Macro_Specifier = class, String = Polyhedron and Class_Counter = 1
+dnl m4_class_kind1 => `Polyhedron'
+dnl m4_class_body1 => `'
+dnl If String = Pointset_Powerset<BD_Shape<signed char> >
+dnl               and Class_Counter = 2
+dnl m4_class_kind2 => `Pointset_Powerset'
+dnl m4_class_body2 => `BD_Shape<signed char>'
+dnl m4_class_group2 => `pointset_powerset'
+m4_define(`m4_get_body',
+  `m4_define(m4_$3_body`'$1,
+    m4_ifelse($2, `', ,
+               m4_index(`$2', <), -1, `',
+                 m4_regexp(`$2', `[^ <]+[<]\(.*\w>?\)[ ]*[>]', `\1')))`'dnl
+')
+
+m4_define(`m4_get_kind',
+  `m4_define(m4_$3_kind`'$1,
+    `m4_ifelse($2, `', ,
+               m4_index($2, <), -1, m4_remove_topology($2),
+                 m4_regexp($2, `\([^ <]+\)[.]*', `\1'))')`'dnl
+')
+
+m4_define(`m4_get_counter',
+  `m4_define(m4_$3_counter`'$1,
+    m4_ifelse($2, `', ,
+               m4_get_class_counter($2)))`'dnl
+')
+
+m4_define(`m4_get_group',
+  `m4_define(m4_$2_group`'$1, `')`'dnl
+m4_get_group_aux($1, $2, m4_class_groups)`'dnl
+')
+
+m4_define(`m4_get_group_aux', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, , $#, 3,
+    m4_get_group_aux2($1, $2, $3, m4_$3_group),
+    `m4_ifelse(m4_get_group_aux2($1, $2, $3, m4_$3_group), 0,
+      `m4_get_group_aux($1, $2, m4_shift(m4_shift(m4_shift($@))))')')`'dnl
+')
+
+m4_define(`m4_get_group_aux2', `dnl
+m4_ifelse($#, 0, , $#, 1, , $#, 2, 0, $#, 3, 0, $#, 4,
+  `m4_ifelse(`$4', m4_$2_kind$1,
+    `m4_define(m4_$2_group`'$1, `$3')', 0)',
+  `m4_ifelse(`$4', m4_$2_kind$1,
+    `m4_define(m4_$2_group`'$1, `$3')',
+    m4_get_group_aux2($1, $2, $3,
+      m4_shift(m4_shift(m4_shift(m4_shift($@))))))')`'dnl
+')
+
+
+dnl m4_get_class_counter(String)
+dnl
+dnl String        - a cplusplus class name.
+dnl
+dnl This finds the class counter from the cpp name.
+m4_define(`m4_get_class_counter', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_remove_topology($1),
+  m4_echo_unquoted(m4_cplusplus_class`'m4_ind),
+  m4_ind)`'dnl
+')`'dnl
+')
+
+dnl m4_get_interface_name_counter(String)
+dnl
+dnl String        - an interface class name.
+dnl
+dnl This finds the class counter from the interface name.
+m4_define(`m4_get_interface_name_counter', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_remove_topology($1),
+  m4_echo_unquoted(m4_interface_class`'m4_ind),
+  m4_ind)`'dnl
+')`'dnl
+')
+
+dnl m4_parse_body_for_powerset(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+m4_define(`m4_parse_body_for_powerset', `dnl
+m4_define(`m4_interface_$2_body$1',
+  m4_interface_class`'m4_get_class_counter(m4_$2_body$1))`'dnl
+m4_define(`m4_cplusplus_$2_body$1', m4_$2_body$1)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body$1, $2_body)`'dnl
+')
+
+dnl m4_parse_body_for_product(Class_Counter, Macro_Specifier)
+dnl
+dnl Class_Counter - is the index to Class;
+dnl Macro_Specifier
+dnl               - is the component of the macro name that
+dnl                 determines the precise component it refers to.
+dnl
+m4_define(`m4_parse_body_for_product', `dnl
+m4_define(`m4_$2_body_1st$1',
+  `m4_regexp(m4_$2_body$1, `\([^|]*\).*', `\1')')`'dnl
+m4_define(`m4_$2_body_2nd$1',
+  `m4_regexp(m4_$2_body$1, `\([^@]*\)|COMMA|\(.*\)', `\2')')`'dnl
+m4_define(`m4_interface_$2_body_1st$1',
+  m4_interface_class`'m4_get_class_counter(m4_$2_body_1st$1))`'dnl
+m4_define(`m4_cplusplus_$2_body_1st$1', m4_$2_body_1st$1)`'dnl
+m4_define(`m4_interface_$2_body_2nd$1',
+  m4_interface_class`'m4_get_class_counter(m4_$2_body_2nd$1))`'dnl
+m4_define(`m4_cplusplus_$2_body_2nd$1', m4_$2_body_2nd$1)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body_1st$1, $2_body_1st)`'dnl
+m4_init_cplusplus_class_components($1, m4_$2_body_2nd$1, $2_body_2nd)`'dnl
+')
+
+dnl m4_get_class_topology(Class)
+dnl
+dnl expands to the empty string unless the class is
+dnl C_Polyhedron or NNC_Polyhedron, in which case it expands to
+dnl "C_" or "NNC_" respectively.
+m4_define(`m4_get_class_topology', `dnl
+m4_ifelse(m4_index($1, C_), 0, C_,
+m4_index($1, NNC_), 0, NNC_)`'dnl
+')
+
+dnl m4_remove_topology(Class_Name)
+dnl
+dnl expands to the class name unless it is
+dnl C_Polyhedron or NNC_Polyhedron, in which case it expands to
+dnl "Polyhedron".
+m4_define(`m4_remove_topology', `dnl
+m4_ifelse(m4_index($1, C_), 0, Polyhedron,
+            m4_index($1, NNC_), 0, Polyhedron, $1)`'dnl
+')
+
+dnl =====================================================================
+dnl ===== The next set of macros define the groups used to          =====
+dnl ===== specify to which classes the schematic procedures apply;  =====
+dnl ===== see ppl_interface_generators_common_procedure_list.m4     =====
+dnl ===== and <interface>/ppl_interface_generators_<interface>_dat.m4 ===
+dnl =====================================================================
+
+dnl m4_group_names expands to all the group names.
+dnl
+dnl Each group_name in the expansion should
+dnl have a corresponding definition for
+dnl "m4_`'group_name`'_group
+dnl which must be defined as a (comma separated) list of class kinds.
+dnl
+dnl If more groups are wanted, then these must be added to this list.
+dnl and the list of class_kinds they include be defined.
+dnl If a group_name occurs in the extra text preceded by a - after
+dnl a procedure name, then no code for any classes in that group is generated.
+dnl Conversely, if a group_name preceded by a + occurs in the extra text after
+dnl a procedure name, then code for those classes in that group that are
+dnl not covered by a - is generated.
+dnl
+dnl More formally, if the extra text for a procedure includes
+dnl +g1 +g2 ''' +gm and -h1 -h2 ... -hn
+dnl where g1,g2, ..., gm and h1, h2, ..., hn are group names,
+dnl then the actual class kinds that code will be generated for
+dnl will be determined using set difference "\":
+dnl (m4_g1_group union m4_g2_group union ... union m4_gm_group)\
+dnl (m4_h1_group union m4_h2_group union ... union m4_hn_group)
+dnl
+dnl That is: in case of conflict between the + and - groups,
+dnl the - takes precedence over the +;
+dnl all class kinds for group_names preceded by - are filtered away.
+dnl For instance, with:
+dnl "+shape -bd_shape"
+dnl following a procedure name, only code (for that procedure)
+dnl for the Polyhedron and Octagonal_Shape class will be generated.
+m4_define(`m4_group_names', `dnl
+all,
+simple_pps,
+simple,
+shape,
+wr_shape,
+polyhedron,
+grid,
+bd_shape,
+octagonal_shape,
+box,
+pointset_powerset,
+product')
+
+dnl A sublist of the same groups whose elements are disjoint.
+dnl These are used to define the m4_class_group`'class_index
+dnl which is used for the "pattern" replacements (see below).
+m4_define(`m4_class_groups', `dnl
+polyhedron,
+grid,
+wr_shape,
+box,
+pointset_powerset,
+product')
+
+m4_define(`m4_all_group',
+  `Polyhedron, Grid, BD_Shape, Octagonal_Shape, m4_box_group,
+   Pointset_Powerset, m4_product_group')
+m4_define(`m4_simple_pps_group', `m4_simple_group, Pointset_Powerset')
+m4_define(`m4_simple_group', `Grid, m4_shape_group')
+m4_define(`m4_shape_group', `Polyhedron, m4_wr_shape_group, m4_box_group')
+m4_define(`m4_wr_shape_group', `BD_Shape, Octagonal_Shape')
+m4_define(`m4_polyhedron_group', Polyhedron)
+m4_define(`m4_grid_group', Grid)
+m4_define(`m4_bd_shape_group', BD_Shape)
+m4_define(`m4_octagonal_shape_group', Octagonal_Shape)
+m4_define(`m4_box_group',
+  `Rational_Box, Z_Box, Float_Box, Double_Box, Long_Double_Box,
+   Int8_Box, Int16_Box, Int32_Box, Int64_Box,
+   Uint8_Box, Uint16_Box, Uint32_Box, Uint64_Box')
+m4_define(`m4_pointset_powerset_group', Pointset_Powerset)
+m4_define(`m4_product_group',
+  `Direct_Product, Smash_Product, Constraints_Product,
+   Shape_Preserving_Product')
+
+dnl =====================================================================
+dnl ===== The next set of macros define the replacements            =====
+dnl ===== for the patterns used                                     =====
+dnl =====================================================================
+
+dnl ---------------------------------------------------------------------
+dnl First the list of patterns. Note that the order is important.
+dnl ---------------------------------------------------------------------
+
+dnl m4_pattern_list
+dnl
+dnl Returns a list of patterns (in lowercase) used for the generation
+dnl of procedure names and code schemas.
+dnl This is no longer used as a macro but is a list of all patterns.
+m4_define(`m4_pattern_list', `dnl
+class,
+topology,
+friend,
+build_represent,
+dimension,
+relation_represent,
+class_represent,
+has_property,
+simplify,
+abovebelow,
+upperlower,
+maxmin,
+comparison,
+refine_represent,
+binop,
+ub_exact,
+affimage,
+embedproject,
+membytes,
+widen,
+limitedbounded,
+widenexpn,
+extrapolation,
+beginend,
+incdec,
+partition,
+disjunct_widen,
+recycle,
+cpp_class,
+generator,
+point,
+constrainer,
+disjunct,
+disjunct_topology,
+disjunct_extrapolation,
+termination_id')
+
+dnl ---------------------------------------------------------------------
+dnl Define the replacement macros for all patterns
+dnl ---------------------------------------------------------------------
+
+dnl m4_class_pattern_replacement(Class_Counter, Pattern, Replacement_Id)
+dnl
+dnl Class_Counter:  counter of class for which we want the replacements.
+dnl Pattern:        pattern to be replaced (lower-case);
+dnl Replacement_Id: Can be the empty string, `a_' or `b_'
+dnl                 depending on the required group of replacements.
+dnl
+dnl To find any sequence of replacements the macro
+dnl "m4_replace_one_pattern_in_string"
+dnl defined in "m4_interface_generators_common.m4"
+dnl calls this macro.
+dnl
+m4_define(`m4_class_pattern_replacements', `dnl
+  m4_ifdef(m4_`'m4_class_kind$1`'_$3$2_replacements,
+    m4_`'m4_class_kind$1`'_$3$2_replacements($1),
+    `m4_ifdef(m4_`'m4_class_group$1`'_$3$2_replacements,
+       m4_`'m4_class_group$1`'_$3$2_replacements($1),
+       `m4_ifdef(`m4_$3$2_replacements',
+          `m4_$3$2_replacements($1)')')')`'dnl
+')
+
+dnl =====================================================================
+dnl ===== Define the individual replacements for each pattern       =====
+dnl =====================================================================
+
+dnl ---------------------------------------------------------------------
+dnl pattern == class
+dnl The class being generated
+dnl ---------------------------------------------------------------------
+
+dnl The interface class name.
+m4_define(`m4_class_replacements', m4_interface_class`'$1)
+
+dnl The cplusplus name.
+m4_define(`m4_cpp_class_replacements', m4_cplusplus_class`'$1)
+
+dnl The product full cplusplus name.
+m4_define(`m4_product_cpp_class_replacements',
+     Domain_Product<`'m4_class_body_1st$1|COMMA|`'m4_class_body_2nd$1 >::`'m4_class_kind$1)
+
+dnl The defined cplusplus name (the default is as before).
+dnl This is only used in the C interface.
+m4_define(`m4_cppdef_class_replacements', m4_cplusplus_class`'$1)
+
+dnl The defined product cplusplus name.
+m4_define(`m4_product_cppdef_class_replacements',
+m4_interface_class`'$1)
+
+dnl The defined box cplusplus name.
+m4_define(`m4_box_cppdef_class_replacements',
+m4_interface_class`'$1)
+
+dnl ---------------------------------------------------------------------
+dnl pattern == friend
+dnl A class can be built from any other class named as a "friend".
+dnl A friend must be one of the classes named in the instantiations
+dnl ---------------------------------------------------------------------
+
+dnl The friend class name.
+dnl There is the interface name as default friend,
+dnl the interface name but where "Polyhedron" does not include
+dnl the topology (a_friend), and the C++ name (b_friend).
+dnl
+dnl To allow for other classes to be friends,
+dnl we cannot just take a predefined list of friends as some
+dnl may not be instantiated and available.
+m4_define(`m4_friend_replacements', `m4_all_friends(interface)')
+
+m4_define(`m4_a_friend_replacements', `dnl
+m4_all_friends(interface, no_topology)`'dnl
+')
+
+m4_define(`m4_b_friend_replacements',`m4_all_friends(cplusplus)')
+
+m4_define(`m4_all_friends', `dnl
+m4_patsubst(m4_all_friends_aux($1, $2), `|COMMA|', `, ')`'dnl
+')
+m4_define(`m4_all_friends_aux', `dnl
+m4_forloop(m4_ind, 1, m4_num_classes, `dnl
+m4_ifelse(m4_echo_unquoted(m4_class_kind`'m4_ind), Pointset_Powerset, ,
+m4_echo_unquoted(m4_class_group`'m4_ind), product, , `dnl
+m4_define(`m4_friend_class', m4_`'$1`'_class`'m4_ind)`'dnl
+m4_ifelse(m4_friend_class, Polyhedron,
+          `m4_ifelse($2, `',
+          `m4_one_friend(C_`'m4_friend_class|COMMA|NNC_`'m4_friend_class)',
+          `m4_one_friend(m4_friend_class|COMMA|m4_friend_class)')',
+          `m4_one_friend(m4_friend_class)')`'dnl
+m4_undefine(`m4_friend_class')')')`'dnl
+')
+
+m4_define(`m4_one_friend', `dnl
+m4_ifelse(m4_ind, 1, `$1', |COMMA|`'$1)`'dnl
+')
+
+dnl For Pointset_Powerset class kind, if the body is C_Polyhedron
+dnl or NNC_Polyhedron, and Polyhedron is generated, then C_Polyhedron
+dnl (if the body is C_Polyhedron) or NNC_Polyhedron
+dnl (if the body is NNC_Polyhedron) is a friend.
+dnl
+m4_define(`m4_Pointset_Powerset_friend_replacements', `dnl
+dnl
+m4_interface_class$1,
+m4_get_class_topology(m4_cplusplus_class_body$1)`'dnl
+m4_interface_class_body$1`'dnl
+')
+
+m4_define(`m4_Pointset_Powerset_a_friend_replacements', `dnl
+dnl
+m4_interface_class$1, m4_interface_class_body$1`'dnl
+')
+
+m4_define(`m4_Pointset_Powerset_b_friend_replacements', `dnl
+dnl
+m4_cplusplus_class$1, m4_cplusplus_class_body$1`'dnl
+')
+
+dnl For product class kinds, C_Polyhedron, NNC_Polyhedron, BD_Shape,
+dnl Octagonal_Shape and other products are all friends.
+dnl
+m4_define(`m4_product_friend_replacements',
+  `m4_all_friends(interface), m4_interface_class$1`'dnl
+')
+
+m4_define(`m4_product_a_friend_replacements',
+  `m4_all_friends(interface, no_topology), m4_interface_class$1`'dnl
+')
+
+m4_define(`m4_product_b_friend_replacements',
+  `m4_all_friends(cplusplus),
+     Domain_Product<`'m4_cplusplus_class_body_1st$1`'|COMMA|`'m4_cplusplus_class_body_2nd$1`' >::`'m4_class_kind$1')
+)
+
+dnl ---------------------------------------------------------------------
+dnl pattern == topology or intopology
+dnl This is C_ or NNC_ if the class is Polyhedron and `' otherwise
+dnl ---------------------------------------------------------------------
+
+dnl The topology of the domain element. The default is the empty string.
+m4_define(`m4_topology_replacements', `')
+m4_define(`m4_Polyhedron_topology_replacements', `C_, NNC_')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == widen
+dnl ---------------------------------------------------------------------
+dnl The widening operators.
+m4_define(`m4_widen_replacements', `')
+m4_define(`m4_Polyhedron_widen_replacements', `BHRZ03, H79')
+m4_define(`m4_Grid_widen_replacements', `congruence, generator')
+m4_define(`m4_BD_Shape_widen_replacements', `BHMZ05, H79')
+m4_define(`m4_Octagonal_Shape_widen_replacements', `BHMZ05')
+m4_define(`m4_box_widen_replacements', `CC76')
+m4_define(`m4_Pointset_Powerset_widen_replacements', `BHZ03')
+dnl The a replacement defines the certificates for the widenings
+m4_define(`m4_Polyhedron_a_widen_replacements', `BHRZ03, H79')
+m4_define(`m4_BD_Shape_a_widen_replacements', `H79, H79')
+m4_define(`m4_Octagonal_Shape_a_widen_replacements', `H79')
+m4_define(`m4_Grid_a_widen_replacements', `Grid, Grid')
+dnl FIXME: This is not in the C++ box domain and will fail if used.
+m4_define(`m4_box_a_widen_replacements', `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == extrapolation
+dnl ---------------------------------------------------------------------
+m4_define(`m4_extrapolation_replacements', `NONE')
+m4_define(`m4_BD_Shape_extrapolation_replacements',
+  `CC76')
+m4_define(`m4_Octagonal_Shape_extrapolation_replacements',
+  `CC76')
+m4_define(`m4_box_extrapolation_replacements',
+  `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == widenexp
+dnl The limited/bounded extrapolation operators.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_widenexpn_replacements', `m4_widen_replacements')
+m4_define(`m4_Polyhedron_widenexpn_replacements',
+  `m4_Polyhedron_widen_replacements')
+m4_define(`m4_Grid_widenexpn_replacements', `m4_Grid_widen_replacements')
+m4_define(`m4_BD_Shape_widenexpn_replacements',
+  `m4_BD_Shape_widen_replacements,
+   m4_BD_Shape_extrapolation_replacements')
+m4_define(`m4_Octagonal_Shape_widenexpn_replacements',
+   `m4_Octagonal_Shape_widen_replacements,
+    m4_Octagonal_Shape_extrapolation_replacements')
+m4_define(`m4_box_widenexpn_replacements', `m4_box_widen_replacements')
+m4_define(`m4_Pointset_Powerset_widenexpn_replacements',
+  `m4_Pointset_Powerset_widen_replacements')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == narrow
+dnl ---------------------------------------------------------------------
+m4_define(`m4_narrow_replacements', `CC76')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == limitedbounded
+dnl limited/bounded are qualifiers for widening and extrapolation
+dnl operations.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_limitedbounded_replacements', `limited')
+m4_define(`m4_Polyhedron_limitedbounded_replacements', `limited, bounded')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == dimension
+dnl ---------------------------------------------------------------------
+m4_define(`m4_dimension_replacements', `space_dimension, affine_dimension')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == generator
+dnl The different kinds of objects use to generate a class.
+dnl ---------------------------------------------------------------------
+m4_define(`m4_generator_replacements', `generator')
+m4_define(`m4_Grid_generator_replacements', `grid_generator')
+
+dnl  The different kinds of points.
+m4_define(`m4_point_replacements', `point')
+m4_define(`m4_Grid_point_replacements', `grid_point')
+
+dnl  The constrainer objects used to describe a class.
+m4_define(`m4_constrainer_replacements', `constraint')
+m4_define(`m4_Grid_constrainer_replacements', `congruence')
+m4_define(`m4_Pointset_Powerset_constrainer_replacements',
+  `m4_class_pattern_replacements(m4_class_body_counter$1,
+                                constrainer, `')')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct
+dnl The different kinds of objects that are elements of a Pointset_Powerset.
+dnl ---------------------------------------------------------------------
+
+dnl If the interface disjunct name is C_Polyhedron or NNC_Polyhedron
+dnl the topology is removed.
+m4_define(`m4_disjunct_replacements', `')
+m4_define(`m4_Pointset_Powerset_disjunct_replacements',
+  `m4_remove_topology(m4_interface_class_body$1)')
+
+dnl If the cplusplus disjunct name is C_Polyhedron or NNC_Polyhedron
+dnl the topology is removed.
+m4_define(`m4_a_disjunct_replacements',
+  `m4_remove_topology(m4_cplusplus_class_body$1)')
+
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_topology
+dnl The topology of the disjunct of the current class
+dnl If the class is not Pointset_Powerset, it is `'.
+dnl ---------------------------------------------------------------------
+dnl The disjunct topology replacement.
+m4_define(`m4_disjunct_topology_replacements',
+  `m4_get_class_topology(m4_cplusplus_class_body$1)')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_widen
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_disjunct_widen_replacements',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_widen_replacements)')
+
+m4_define(`m4_a_disjunct_widen_replacements',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_a_widen_replacements)')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == disjunct_extrapolation
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_disjunct_extrapolation_replacements',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_extrapolation_replacements)')
+
+m4_define(`m4_a_disjunct_extrapolation_replacements',
+  `m4_echo_unquoted(m4_`'m4_remove_topology(m4_class_body_kind$1)`'_a_extrapolation_replacements)')
+
+
+dnl ---------------------------------------------------------------------
+dnl pattern == relation_represent
+dnl  The different kinds of objects that can have a relation with a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_relation_represent_replacements',
+	`constraint, generator, congruence')
+m4_define(`m4_Grid_relation_represent_replacements',
+         `m4_relation_represent_replacements, grid_generator')
+
+dnl The type of these relations with a class.
+m4_define(`m4_a_relation_represent_replacements', `con, gen, con')
+m4_define(`m4_Grid_a_relation_represent_replacements',
+    `con, gen, con, gen')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == build_represent
+dnl  The different kinds of objects that can build a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_build_represent_replacements',
+         `constraint, congruence, generator')
+m4_define(`m4_Grid_build_represent_replacements',
+         `constraint, congruence, grid_generator')
+m4_define(`m4_Pointset_Powerset_build_represent_replacements',
+         `constraint, congruence')
+m4_define(`m4_product_build_represent_replacements',
+         `constraint, congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == class_represent
+dnl The different kinds of geometric descriptors that can be added to
+dnl a class or we can get from a class.
+dnl Note that a class can be built from generators when the add and get
+dnl can only use constraints or congruences (eg BD_Shape).
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_class_represent_replacements', `constraint, congruence')
+m4_define(`m4_Polyhedron_class_represent_replacements',
+         `m4_class_represent_replacements, generator')
+m4_define(`m4_Grid_class_represent_replacements',
+         `m4_class_represent_replacements, grid_generator')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == refine_represent
+dnl The different kinds of objects that can refine a class.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_refine_represent_replacements', `constraint, congruence')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == recycle_represent
+dnl The recycling argument which is only needed for the Polyhedron
+dnl or Grid class in the C interface.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_recycle_replacements', `')
+m4_define(`m4_Polyhedron_recycle_replacements',
+         `|COMMA| Recycle_Input()')
+m4_define(`m4_Grid_recycle_replacements',
+         `|COMMA| Recycle_Input()')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == partition
+dnl The "partition" is replaced by "NONE" if the powerset is not
+dnl in the list of instantiations; in which case
+dnl no code is generated, otherwise it is replaced by partition.
+dnl This is used for the linear_partition and approximate_partition only.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_partition_replacements',
+  `m4_ifelse(m4_get_interface_name_counter(`Pointset_Powerset_NNC_Polyhedron'),
+             `', NONE, ``partition'')')
+m4_define(`m4_Grid_partition_replacements',
+  `m4_ifelse(m4_get_interface_name_counter(`Pointset_Powerset_Grid'),
+             `', NONE, ``partition'')')
+m4_define(`m4_Pointset_Powerset_partition_replacements', `NONE')
+m4_define(`m4_Product_partition_replacements', `NONE')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == has_property
+dnl The unary "has_property" predicates check properties of the domains
+dnl The check "contains_integer_point" is not available for the
+dnl product domains.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_has_property_replacements', `is_empty, is_universe,
+            is_bounded, contains_integer_point, is_topologically_closed,
+            is_discrete')
+
+dnl For products, contains_integer_point is not yet implemented.
+m4_define(`m4_product_has_property_replacements', `dnl
+  is_empty, is_universe, is_bounded, is_topologically_closed, is_discrete')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == simplify
+dnl This just groups two methods that modify a domain element.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_simplify_replacements', `topological_closure_assign')
+m4_define(`m4_Pointset_Powerset_simplify_replacements', `dnl
+m4_simplify_replacements, pairwise_reduce, omega_reduce`'dnl
+')
+
+m4_define(`m4_product_simplify_replacements', `dnl
+m4_define(`m4_1st_sequence',
+  `m4_simplify_replacements')`'dnl
+m4_define(`m4_2nd_sequence',
+  `m4_class_pattern_replacements(m4_class_body_1st_counter$1,
+    simplify, `')')`'dnl
+m4_define(`m4_3rd_sequence',
+  `m4_class_pattern_replacements(m4_class_body_2nd_counter$1,
+    simplify, `')')`'dnl
+m4_define(`m4_num_of_sequences', 3)`'dnl
+m4_seq_intersection`'dnl
+m4_undefine(`m4_1st_sequence')`'dnl
+m4_undefine(`m4_2nd_sequence')`'dnl
+m4_undefine(`m4_3rd_sequence')`'dnl
+m4_undefine(`m4_num_of_sequences')`'dnl
+')
+
+dnl ---------------------------------------------------------------------
+dnl pattern -- above/below
+dnl Used for the bounds_from_above and bounds_from_below methods.
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_abovebelow_replacements', `above, below')
+
+dnl ---------------------------------------------------------------------
+dnl pattern -- upper/lower
+dnl Used for has_upper_bound and has_lower_bound methods (Box domains).
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_upperlower_replacements', `upper, lower')
+
+dnl ---------------------------------------------------------------------
+dnl pattern == maxmin
+dnl Maximize or Minimize
+dnl ---------------------------------------------------------------------
+
+m4_define(`m4_maxmin_replacements', `maximize, minimize')
+
+dnl  Embed or project
+m4_define(`m4_embedproject_replacements', `and_embed, and_project')
+
+dnl  Affine_image or affine_preimage
+m4_define(`m4_affimage_replacements', `affine_image, affine_preimage')
+
+dnl  One object can be contained, strictly contained or disjoint in the other.
+m4_define(`m4_comparison_replacements',
+         `contains, strictly_contains, is_disjoint_from')
+m4_define(`m4_Pointset_Powerset_comparison_replacements',
+         `m4_comparison_replacements,
+          geometrically_covers, geometrically_equals')
+
+dnl  The different kinds of binary operators.
+m4_define(`m4_binop_replacements',
+         `intersection_assign, upper_bound_assign, difference_assign,
+          concatenate_assign, time_elapse_assign')
+m4_define(`m4_Polyhedron_binop_replacements',
+         `m4_binop_replacements, poly_hull_assign, poly_difference_assign')
+
+dnl  The different kinds of "upper_bound_if_exact" binary operators.
+m4_define(`m4_ub_exact_replacements', `upper_bound_assign_if_exact')
+m4_define(`m4_Polyhedron_ub_exact_replacements',
+         `m4_ub_exact_replacements, poly_hull_assign_if_exact')
+
+dnl  The iterators for the Powerset domains can increment or decrement
+m4_define(`m4_incdec_replacements', `increment, decrement')
+
+dnl  The Java replacements for the increment/decrement operators.
+m4_define(`m4_a_incdec_replacements', `next, prev')
+
+dnl  The C++ replacements for the increment/decrement operators.
+m4_define(`m4_b_incdec_replacements', `++, --')
+
+dnl  The iterators for the Powerset domains have a begin and end iterator
+m4_define(`m4_beginend_replacements', `begin, end')
+
+dnl  The total and external memory query methods for all the domains
+dnl  and the size query to the pointset powerset domain.
+m4_define(`m4_membytes_replacements',
+   `external_memory_in_bytes, total_memory_in_bytes')
+m4_define(`m4_Pointset_Powerset_membytes_replacements',
+   `m4_membytes_replacements, size')
+
+dnl  The termination algorithms are either sourced from MS or PR.
+m4_define(`m4_termination_id_replacements', `MS, PR')
+
+dnl If sourced from MS, the last argument is C_Polyhedron,
+dnl If sourced from PR, the last argument is NNC_Polyhedron.
+m4_define(`m4_a_termination_id_replacements', `C_, NNC_')
diff --git a/interfaces/ppl_interface_generator_common_procedure_generators.m4 b/interfaces/ppl_interface_generator_common_procedure_generators.m4
new file mode 100644
index 0000000..0d0d226
--- /dev/null
+++ b/interfaces/ppl_interface_generator_common_procedure_generators.m4
@@ -0,0 +1,140 @@
+m4_divert(-1)
+
+dnl This m4 file defines the list of the procedures generated
+dnl that are independent of the interface being generated.
+
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl m4_procedure_list
+dnl This class using patterns wherever possible.
+dnl Which classes the schema applies to is determined by +/-group_name.
+dnl The group_names represent sets of PPL classes +group1 and -group2.
+dnl These are defined in ../ppl_interface_generator_common_dat.m4.
+dnl The actual classes the schema applies to is the set difference
+dnl +group1 \ -group2 where a missing +group1 or -group2 is
+dnl assumed to be the empty set.
+dnl For the pointset-powerset classes, the schema they apply to may also
+dnl depend on the disjunct. In this case, a schema with
+dnl "+pointset_powerset \group" will apply to any powerset
+dnl whose disjunct is not in "group".
+dnl Where "@CLASS@" is replaced by the class name, then that class only
+dnl is applicable for that schema.
+dnl
+dnl Note that the code for the schema "<name>_code" must be defined
+dnl in the ppl_interface_generator_*_code.m4 file.
+dnl The <name> must be exactly as written here.
+
+m4_define(`m4_common_procedure_list', `dnl
+ppl_delete_ at CLASS@/1 *nofail +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_space_dimension/3 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND@/2 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@FRIEND at _with_complexity/3 +all,
+ppl_new_ at TOPOLOGY@@CLASS at _from_@BUILD_REPRESENT at s/2 +all,
+ppl_ at CLASS@_swap/2 *nofail +all,
+ppl_ at CLASS@_ at DIMENSION@/2 +all,
+ppl_ at CLASS@_relation_with_ at RELATION_REPRESENT@/3 +all,
+dnl
+dnl NOTE: The next two schemas are only for simple domains since
+dnl       we can only "get" a meaningful system (such as a set of
+dnl       constraints) that represents a domain from a simple domain.
+dnl
+ppl_ at CLASS@_get_ at CLASS_REPRESENT@s/2 +simple,
+ppl_ at CLASS@_get_minimized_ at CLASS_REPRESENT@s/2 +simple,
+ppl_ at CLASS@_ at HAS_PROPERTY@/1 +all,
+ppl_ at CLASS@_ at SIMPLIFY@/1 *nofail +all,
+ppl_ at CLASS@_bounds_from_ at ABOVEBELOW@/2 +all,
+ppl_ at CLASS@_has_ at UPPERLOWER@_bound/5 +box,
+ppl_ at CLASS@_ at MAXMIN@/5 +all,
+ppl_ at CLASS@_ at MAXMIN@_with_point/6 +all,
+ppl_ at CLASS@_frequency/6 +simple,
+ppl_ at CLASS@_ at COMPARISON@_ at CLASS@/2 +all,
+ppl_ at CLASS@_equals_ at CLASS@/2 +all,
+ppl_ at CLASS@_OK/1 +all,
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@/2 *nofail +all,
+ppl_ at CLASS@_add_ at CLASS_REPRESENT@s/2 *nofail +all,
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@/2 *nofail +all,
+ppl_ at CLASS@_refine_with_ at REFINE_REPRESENT@s/2 *nofail +all,
+ppl_ at CLASS@_ at BINOP@/2 *nofail +all,
+ppl_ at CLASS@_ at UB_EXACT@/2 +all,
+ppl_ at CLASS@_positive_time_elapse_assign/2 *nofail +polyhedron,
+ppl_ at CLASS@_simplify_using_context_assign/3 +simple_pps,
+ppl_ at CLASS@_constrains/2 +all,
+ppl_ at CLASS@_unconstrain_space_dimension/2 +all,
+ppl_ at CLASS@_unconstrain_space_dimensions/2 +all,
+ppl_ at CLASS@_ at AFFIMAGE@/4 *nofail +all,
+ppl_ at CLASS@_bounded_ at AFFIMAGE@/5 *nofail +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@/5 +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs/4 +all,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_with_congruence/6 +grid,
+ppl_ at CLASS@_generalized_ at AFFIMAGE@_lhs_rhs_with_congruence/5 +grid,
+ppl_ at CLASS@_add_space_dimensions_ at EMBEDPROJECT@/2 *nofail +all,
+ppl_ at CLASS@_remove_space_dimensions/2 +all,
+ppl_ at CLASS@_remove_higher_space_dimensions/2 *nofail +all,
+ppl_ at CLASS@_expand_space_dimension/3 *nofail +all,
+ppl_ at CLASS@_fold_space_dimensions/3  +all,
+ppl_ at CLASS@_map_space_dimensions/2 +all,
+ppl_ at CLASS@_drop_some_non_integer_points/2 +all,
+ppl_ at CLASS@_drop_some_non_integer_points_2/3 +all,
+ppl_ at CLASS@_ascii_dump/1 +all,
+ppl_ at CLASS@_ at MEMBYTES@/2 +all,
+dnl
+dnl NOTE: The next few schemas provide special widenings and
+dnl       extrapolations that depend on the domains.
+dnl
+ppl_ at CLASS@_ at WIDEN@_widening_assign_with_tokens/4 +simple,
+ppl_ at CLASS@_ at WIDEN@_widening_assign/2 *nofail +simple,
+dnl
+dnl FIXME: We do not have a default widening for the
+dnl        pointset_powerset domain.
+dnl
+ppl_ at CLASS@_widening_assign_with_tokens/4 +simple +product,
+ppl_ at CLASS@_widening_assign/2 *nofail +simple +product,
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign_with_tokens/5 +simple,
+ppl_ at CLASS@_ at LIMITEDBOUNDED@_ at WIDENEXPN@_extrapolation_assign/3 *nofail +simple,
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign_with_tokens/4 +wr_shape,
+ppl_ at CLASS@_ at EXTRAPOLATION@_extrapolation_assign/2 *nofail +wr_shape,
+ppl_ at CLASS@_ at EXTRAPOLATION@_narrowing_assign/2 +shape_group,
+dnl
+dnl NOTE: The next few schemas provide procedures specifically for
+dnl       the pointset_powerset domains.
+dnl
+ppl_new_ at CLASS@_iterator_from_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_ at BEGINEND@_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_iterator_equals_iterator/2 +pointset_powerset,
+ppl_ at CLASS@_ at INCDEC@_iterator/1 +pointset_powerset,
+ppl_ at CLASS@_get_disjunct/2 +pointset_powerset,
+ppl_delete_ at CLASS@_iterator/1 +pointset_powerset,
+ppl_ at CLASS@_add_disjunct/2 *nofail +pointset_powerset,
+ppl_ at CLASS@_drop_disjunct/2 +pointset_powerset,
+ppl_ at CLASS@_drop_disjuncts/3 +pointset_powerset,
+ppl_ at CLASS@_linear_ at PARTITION@/4 +simple -grid,
+ppl_ at CLASS@_approximate_ at PARTITION@/5  +grid,
+ppl_ at CLASS@_BHZ03_ at A_DISJUNCT_WIDEN@_ at DISJUNCT_WIDEN@_widening_assign/2 +pointset_powerset \box,
+ppl_ at CLASS@_BGP99_ at DISJUNCT_WIDEN@_extrapolation_assign/3 +pointset_powerset \box,
+dnl
+dnl CHECKME: This is not implemented.
+dnl
+ppl_ at CLASS@_BGP99_ at DISJUNCT_EXTRAPOLATION@_extrapolation_assign/3 -pointset_powerset,
+ppl_ at CLASS@_wrap_assign/8 +simple,
+
+')
diff --git a/interfaces/ppl_interface_generator_copyright b/interfaces/ppl_interface_generator_copyright
new file mode 100644
index 0000000..ec4176b
--- /dev/null
+++ b/interfaces/ppl_interface_generator_copyright
@@ -0,0 +1,21 @@
+`   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . 'dnl
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100755
index 0000000..63ae69d
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,9655 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.4.2
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..397ae4a
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,59 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = \
+ppl.m4 \
+ppl_c.m4
+
+# M4 macro files for internal use.
+m4macros = \
+ac_check_ciao.m4 \
+ac_check_classpath.m4 \
+ac_check_fpu_control.m4 \
+ac_check_gmp.m4 \
+ac_check_sicstus_prolog.m4 \
+ac_check_swi_prolog.m4 \
+ac_check_xsb_prolog.m4 \
+ac_cxx_attribute_weak.m4 \
+ac_cxx_double_binary_format.m4 \
+ac_cxx_zero_length_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_ieee_inexact_flag.m4 \
+ac_cxx_limit_memory.m4 \
+ac_cxx_long_double_binary_format.m4 \
+ac_cxx_plain_char_is_signed.m4 \
+ac_cxx_proper_long_double.m4 \
+ac_prog_jar.m4 \
+ac_prog_java.m4 \
+ac_prog_javac.m4 \
+ac_prog_javah.m4 \
+ac_text_md5sum.m4 \
+libtool.m4 \
+ltoptions.m4 \
+ltsugar.m4 \
+ltversion.m4 \
+lt~obsolete.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..e2b24c7
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,637 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(m4datadir)"
+DATA = $(m4data_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = \
+ppl.m4 \
+ppl_c.m4
+
+
+# M4 macro files for internal use.
+m4macros = \
+ac_check_ciao.m4 \
+ac_check_classpath.m4 \
+ac_check_fpu_control.m4 \
+ac_check_gmp.m4 \
+ac_check_sicstus_prolog.m4 \
+ac_check_swi_prolog.m4 \
+ac_check_xsb_prolog.m4 \
+ac_cxx_attribute_weak.m4 \
+ac_cxx_double_binary_format.m4 \
+ac_cxx_zero_length_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_ieee_inexact_flag.m4 \
+ac_cxx_limit_memory.m4 \
+ac_cxx_long_double_binary_format.m4 \
+ac_cxx_plain_char_is_signed.m4 \
+ac_cxx_proper_long_double.m4 \
+ac_prog_jar.m4 \
+ac_prog_java.m4 \
+ac_prog_javac.m4 \
+ac_prog_javah.m4 \
+ac_text_md5sum.m4 \
+libtool.m4 \
+ltoptions.m4 \
+ltsugar.m4 \
+ltversion.m4 \
+lt~obsolete.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-m4dataDATA: $(m4data_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(m4datadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(m4datadir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \
+	done
+
+uninstall-m4dataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(m4datadir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-m4dataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-m4dataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am \
+	install-m4dataDATA install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
+	uninstall-am uninstall-m4dataDATA
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/ac_check_ciao.m4 b/m4/ac_check_ciao.m4
new file mode 100644
index 0000000..265596c
--- /dev/null
+++ b/m4/ac_check_ciao.m4
@@ -0,0 +1,89 @@
+dnl A function to check for the existence and usability of Ciao-Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_CIAO_PROLOG],
+[
+AC_PATH_PROG(ciao_prolog, ciao)
+if test x$ciao_prolog != x
+then
+  # Create a temporary directory $tmp in $TMPDIR (default /tmp).
+  # Use mktemp if possible; otherwise fall back on mkdir,
+  # with $RANDOM to make collisions less likely.
+  : ${TMPDIR=/tmp}
+  {
+    tmp=`
+      (umask 077 && mktemp -d "$TMPDIR/ppl_ciao_XXXXXX") 2>/dev/null
+    ` &&
+    test -n "$tmp" && test -d "$tmp"
+  } || {
+    tmp=$TMPDIR/ppl_ciao_$$-$RANDOM
+    (umask 077 && mkdir "$tmp")
+  } || exit $?
+  cat >$tmp/print_include_dir.pl <<_CIAO_PRINT_INCLUDE_DIR_EOF
+main(_) :-
+    ciaolibdir(Lib_Dir),
+    get_os(Os),
+    get_arch(Arch),
+    format("~p/include/~p~p", [[Lib_Dir, Os, Arch]]).
+_CIAO_PRINT_INCLUDE_DIR_EOF
+  ciao_prolog_include_dir=`$ciao_prolog $tmp/print_include_dir.pl`
+  rm -rf $tmp
+
+  CIAO_PROLOG_INCLUDE_OPTIONS="-I${ciao_prolog_include_dir}"
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $CIAO_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  AC_CHECK_HEADER(ciao_prolog.h,
+                  AC_MSG_CHECKING([for Ciao Prolog version x.y.z or later])
+                  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <ciao_prolog.h>
+
+int
+main() {
+  return 0;
+}
+                    ]])],
+                    AC_MSG_RESULT(yes),
+                    ciao_prolog=""
+                    AC_MSG_RESULT(no)
+                  ),
+                  ciao_prolog="")
+
+  dnl Additional version checks could be inserted here, if necessary.
+
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  CIAO_PROLOG="$ciao_prolog"
+  AC_SUBST(CIAO_PROLOG)
+  AC_SUBST(CIAO_PROLOG_INCLUDE_OPTIONS)
+  dnl AC_SUBST(CIAO_PROLOG_LD_OPTIONS)
+fi
+
+if test x$ciao_prolog != x
+then
+  have_ciao_prolog=yes
+else
+  have_ciao_prolog=no
+fi
+])
diff --git a/m4/ac_check_classpath.m4 b/m4/ac_check_classpath.m4
new file mode 100644
index 0000000..bfbdda4
--- /dev/null
+++ b/m4/ac_check_classpath.m4
@@ -0,0 +1,63 @@
+##### http://autoconf-archive.cryp.to/ac_check_classpath.html
+#
+# SYNOPSIS
+#
+#   AC_CHECK_CLASSPATH
+#
+# DESCRIPTION
+#
+#   AC_CHECK_CLASSPATH just displays the CLASSPATH, for the edification
+#   of the user.
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission. The general documentation, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2000-07-19
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000 Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#
+#   This program is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU General Public License as
+#   published by the Free Software Foundation; either version 2 of the
+#   License, or (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+#   02111-1307, USA.
+#
+#   As a special exception, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+
+AC_DEFUN([AC_CHECK_CLASSPATH],[
+if test "x$CLASSPATH" = x; then
+        echo "You have no CLASSPATH, I hope it is good"
+else
+        echo "You have CLASSPATH $CLASSPATH, hope it is correct"
+fi
+])
diff --git a/m4/ac_check_fpu_control.m4 b/m4/ac_check_fpu_control.m4
new file mode 100644
index 0000000..806d2f0
--- /dev/null
+++ b/m4/ac_check_fpu_control.m4
@@ -0,0 +1,145 @@
+dnl A function to check for the possibility to control the FPU.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_FPU_CONTROL],
+[
+AC_LANG_PUSH(C++)
+AC_CHECK_HEADERS([fenv.h ieeefp.h])
+AC_MSG_CHECKING([if it is possible to control the FPU])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if i386
+
+int
+main() {
+  return 0;
+}
+
+#elif defined(HAVE_FENV_H)
+
+# include <fenv.h>
+
+# if !defined(FE_UPWARD) || !defined(FE_DOWNWARD)
+
+  choke me
+
+# elif defined(__arm__) \
+  && (!defined(PPL_ARM_CAN_CONTROL_FPU) || !PPL_ARM_CAN_CONTROL_FPU)
+
+  choke me
+
+#else
+
+     float  nf1 =  -3, pf1 = 3,  f2 =  5;
+     double nd1 =  -7, pd1 = 7,  d2 = 11;
+long double nl1 = -13, pl1 = 13, l2 = 17;
+
+      float nf[2], pf[2];
+     double nd[2], pd[2];
+long double nl[2], pl[2];
+
+int
+ppl_check_function() {
+  int r = 0;
+  if (nf[0] == nf[1] || pf[0] == pf[1] || -nf[0] != pf[1] || -nf[1] != pf[0])
+    r |= 1;
+  if (nd[0] == nd[1] || pd[0] == pd[1] || -nd[0] != pd[1] || -nd[1] != pd[0])
+    r |= 2;
+  if (nl[0] == nl[1] || pl[0] == pl[1] || -nl[0] != pl[1] || -nl[1] != pl[0])
+    r |= 4;
+  return r;
+}
+
+int
+ppl_setround_function(int rounding_mode) {
+  return fesetround(rounding_mode);
+}
+
+int (* volatile ppl_check_function_p)() = ppl_check_function;
+int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
+
+int
+main() {
+  if ((*ppl_setround_function_p)(FE_DOWNWARD) != 0)
+    return 255;
+
+  nf[0] = nf1 / f2;
+  nd[0] = nd1 / d2;
+  nl[0] = nl1 / l2;
+  pf[0] = pf1 / f2;
+  pd[0] = pd1 / d2;
+  pl[0] = pl1 / l2;
+
+  if ((*ppl_setround_function_p)(FE_UPWARD) != 0)
+    return 255;
+
+  nf[1] = nf1 / f2;
+  nd[1] = nd1 / d2;
+  nl[1] = nl1 / l2;
+  pf[1] = pf1 / f2;
+  pd[1] = pd1 / d2;
+  pl[1] = pl1 / l2;
+
+  return (*ppl_check_function_p)();
+}
+
+# endif
+
+#elif sparc && defined(HAVE_IEEEFP_H)
+
+int
+main() {
+  return 0;
+}
+
+#else
+
+  choke me
+
+#endif
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cv_can_control_fpu=1,
+  AC_MSG_RESULT(no)
+  ac_cv_can_control_fpu=0,
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#if i386 || (sparc && defined(HAVE_IEEEFP_H))
+
+int
+main() {
+  return 0;
+}
+
+#else
+
+  choke me
+
+#endif
+  ]])],
+    AC_MSG_RESULT(yes)
+    ac_cv_can_control_fpu=1,
+    AC_MSG_RESULT(no)
+    ac_cv_can_control_fpu=0
+  )
+)
+AC_LANG_POP(C++)
+])
diff --git a/m4/ac_check_gmp.m4 b/m4/ac_check_gmp.m4
new file mode 100644
index 0000000..39b6513
--- /dev/null
+++ b/m4/ac_check_gmp.m4
@@ -0,0 +1,235 @@
+dnl A function to check for the existence and usability of GMP.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_GMP],
+[
+AC_ARG_WITH(gmp,
+  AS_HELP_STRING([--with-gmp=DIR],
+		 [search for libgmp/libgmpxx in DIR/include and DIR/lib]))
+
+AC_ARG_WITH(gmp-include,
+  AS_HELP_STRING([--with-gmp-include=DIR],
+		 [search for libgmp/libgmpxx headers in DIR]))
+
+AC_ARG_WITH(gmp-lib,
+  AS_HELP_STRING([--with-gmp-lib=DIR],
+		 [search for libgmp/libgmpxx library objects in DIR]))
+
+if test -n "$with_gmp"
+then
+  gmp_include_options="-I$with_gmp/include"
+  gmp_library_paths="$with_gmp/lib"
+  gmp_library_options="-L$gmp_library_paths"
+fi
+
+if test -n "$with_gmp_include"
+then
+  gmp_include_options="-I$with_gmp_include"
+fi
+
+if test -n "$with_gmp_lib"
+then
+  gmp_library_paths="$with_gmp_lib"
+  gmp_library_options="-L$gmp_library_paths"
+fi
+
+gmp_libs="-lgmpxx -lgmp"
+
+AC_ARG_WITH(gmp-build,
+  AS_HELP_STRING([--with-gmp-build=DIR],
+                 [use a non-installed build of GMP in DIR]),
+  gmp_build_dir=$with_gmp_build
+  if test -n "$with_gmp" \
+  || test -n "$with_gmp_include" || test -n "$with_gmp_lib"
+  then
+    AC_MSG_ERROR([cannot use --with-gmp-build and other --with-gmp* options together])
+  else
+    gmp_srcdir=`echo @abs_srcdir@ | $gmp_build_dir/config.status --file=-`
+    gmp_include_options="-I$gmp_build_dir -I$gmp_build_dir/tune -I$gmp_srcdir"
+    gmp_libs="$gmp_build_dir/libgmp.la $gmp_build_dir/libgmpxx.la"
+  fi)
+
+gmp_library_options="$gmp_library_options $gmp_libs"
+
+if test -n "$with_gmp_build"
+then
+  ac_save_CXX="$CXX"
+  CXX="libtool --mode=link --tag=CXX $CXX"
+fi
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $gmp_include_options"
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $gmp_library_options"
+eval ac_save_shared_library_path="\$$shared_library_path_env_var"
+eval $shared_library_path_env_var=\"$gmp_library_paths:$ac_save_shared_library_path\"
+export $shared_library_path_env_var
+
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([for the GMP library version 4.1.3 or above])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+#include <climits>
+#include <string>
+#include <sstream>
+#include <iostream>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+#ifndef BITS_PER_MP_LIMB
+#define BITS_PER_MP_LIMB GMP_LIMB_BITS
+#endif
+
+int
+main() {
+  std::string header_version;
+  {
+    std::ostringstream s(header_version);
+    s << __GNU_MP_VERSION << "." << __GNU_MP_VERSION_MINOR;
+    // Starting from GMP version 4.3.0, the gmp_version variable
+    // always contains three parts.  In previous versions the
+    // patchlevel was omitted if it was 0.
+    if (__GNU_MP_VERSION_PATCHLEVEL != 0
+        || __GNU_MP_VERSION > 4
+        || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 3))
+      s << "." << __GNU_MP_VERSION_PATCHLEVEL;
+    header_version = s.str();
+  }
+
+  std::string library_version = gmp_version;
+
+  if (header_version != library_version) {
+    std::cerr
+      << "GMP header (gmpxx.h) and library (ligmpxx.*) version mismatch:\n"
+      << "header gives " << header_version << ";\n"
+      << "library gives " << library_version << "." << std::endl;
+    return 1;
+  }
+
+  if (sizeof(mp_limb_t)*CHAR_BIT != BITS_PER_MP_LIMB
+      || BITS_PER_MP_LIMB != mp_bits_per_limb) {
+    std::cerr
+      << "GMP header (gmpxx.h) and library (ligmpxx.*) bits-per-limb mismatch:\n"
+      << "header gives " << BITS_PER_MP_LIMB << ";\n"
+      << "library gives " << mp_bits_per_limb << ".\n"
+      << "This probably means you are on a bi-arch system and\n"
+      << "you are compiling with the wrong header or linking with\n"
+      << "the wrong library." << std::endl;
+    return 1;
+  }
+
+  mpz_class n("3141592653589793238462643383279502884");
+  return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cv_have_gmp=yes,
+  AC_MSG_RESULT(no)
+  ac_cv_have_gmp=no,
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+
+#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 1) || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR == 1 && __GNU_MP_VERSION_PATCHLEVEL < 3)
+#GMP version 4.1.3 or higher is required
+#endif
+
+int
+main() {
+  return 0;
+}
+]])],
+    AC_MSG_RESULT(yes)
+    ac_cv_have_gmp=yes,
+    AC_MSG_RESULT(no)
+    ac_cv_have_gmp=no))
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+AC_CHECK_SIZEOF(mp_limb_t, , [#include <gmpxx.h>])
+
+AC_MSG_CHECKING([whether GMP has been compiled with support for exceptions])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <gmpxx.h>
+#include <new>
+#include <cstddef>
+
+static void*
+x_malloc(size_t) {
+  throw std::bad_alloc();
+}
+
+static void*
+x_realloc(void*, size_t, size_t) {
+  throw std::bad_alloc();
+}
+
+static void
+x_free(void*, size_t) {
+}
+
+int main() {
+  mp_set_memory_functions(x_malloc, x_realloc, x_free);
+  try {
+    mpz_class n("3141592653589793238462643383279502884");
+  }
+  catch (std::bad_alloc&) {
+    return 0;
+  }
+  return 1;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cv_gmp_supports_exceptions=yes,
+  AC_MSG_RESULT(no)
+  ac_cv_gmp_supports_exceptions=no,
+  AC_MSG_RESULT([assuming yes])
+  ac_cv_gmp_supports_exceptions=yes)
+
+gmp_supports_exceptions=${ac_cv_gmp_supports_exceptions}
+if test x"$gmp_supports_exceptions" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_GMP_SUPPORTS_EXCEPTIONS, $value,
+  [Not zero if GMP has been compiled with support for exceptions.])
+
+fi
+
+AC_LANG_POP(C++)
+eval $shared_library_path_env_var=\"$ac_save_shared_library_path\"
+LIBS="$ac_save_LIBS"
+CPPFLAGS="$ac_save_CPPFLAGS"
+
+if test -n "$with_gmp_build"
+then
+  CXX="$ac_save_CXX"
+fi
+])
diff --git a/m4/ac_check_sicstus_prolog.m4 b/m4/ac_check_sicstus_prolog.m4
new file mode 100644
index 0000000..764e9d7
--- /dev/null
+++ b/m4/ac_check_sicstus_prolog.m4
@@ -0,0 +1,61 @@
+dnl A function to check for the existence and usability of SICStus Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_SICSTUS_PROLOG],
+[
+AC_PATH_PROG(sicstus_prolog, sicstus)
+if test x$sicstus_prolog != x
+then
+  sicstus_prolog_app_dir=`$sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."`
+  sicstus_prolog_base=`dirname $sicstus_prolog_app_dir`
+  SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  # We require SICStus Prolog 3.9.1 or later.
+  AC_CHECK_HEADER(sicstus/sicstus.h,
+                  AC_MSG_CHECKING([for SICStus version 3.9.1 or later])
+                  AC_EGREP_CPP(yes,
+                    [
+                      #include <sicstus/sicstus.h>
+                      #if SICSTUS_MAJOR_VERSION > 3 || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION > 9) || (SICSTUS_MAJOR_VERSION == 3 && SICSTUS_MINOR_VERSION == 9 && SICSTUS_REVISION_VERSION >= 1)
+                      yes
+                      #endif
+                    ],
+                    AC_MSG_RESULT(yes),
+                    sicstus_prolog=""
+                    AC_MSG_RESULT(no)
+                  ),
+                  sicstus_prolog="")
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  AC_SUBST(SICSTUS_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$sicstus_prolog != x
+then
+  have_sicstus_prolog=yes
+else
+  have_sicstus_prolog=no
+fi
+])
diff --git a/m4/ac_check_swi_prolog.m4 b/m4/ac_check_swi_prolog.m4
new file mode 100644
index 0000000..e6df9b0
--- /dev/null
+++ b/m4/ac_check_swi_prolog.m4
@@ -0,0 +1,109 @@
+dnl A function to check for the existence and usability of SWI-Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_SWI_PROLOG],
+[
+dnl By default, old versions of SWI-Prolog were installed as `pl',
+dnl though some administrators called it `swipl' or `swi-prolog'.
+dnl In particular, on Mac OS X `pl' is the name of another program.
+dnl On Windows, the console version of SWI-Prolog was called `plcon'.
+dnl Since SWI-Prolog 5.9.9, by default and on all systems, the
+dnl interpreter is called `swipl' and `plld' is called `swipl-ld'
+
+AC_PATH_PROG(swi_prolog, swipl$EXEEXT)
+if test -z $swi_prolog
+then
+  AC_PATH_PROG(swi_prolog, swi-prolog$EXEEXT)
+  if test -z $swi_prolog
+  then
+    AC_PATH_PROG(swi_prolog, pl$EXEEXT)
+    if test -z $swi_prolog
+    then
+      AC_PATH_PROG(swi_prolog, plcon$EXEEXT)
+    fi
+  fi
+fi
+if test x$swi_prolog != x
+then
+  swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\([[a-z]]:\)\{0,1\}\(.*\)";.*/\2/'`
+  swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";.*/\1/'`
+  swi_prolog_arch=`$swi_prolog -dump-runtime-variables | grep PLARCH= | sed 's/PLARCH="\(.*\)";.*/\1/'`
+  swi_prolog_libs=`$swi_prolog -dump-runtime-variables | grep PLLIBS= | sed 's/PLLIBS="\(.*\)";.*/\1/'`
+  swi_prolog_lib=`$swi_prolog -dump-runtime-variables | grep PLLIB= | sed 's/PLLIB="\(.*\)";.*/\1/'`
+
+  dnl Additional version checks could be inserted here, if necessary.
+
+  AC_PATH_PROG(swi_prolog_ld, swipl-ld$EXEEXT)
+  if test -z $swi_prolog_ld
+  then
+    AC_PATH_PROG(swi_prolog_ld, plld$EXEEXT)
+  fi
+
+  # In Fedora, SWI-Prolog.h is installed only in /usr/include/pl, which,
+  # IMHO, is a bug (https://bugzilla.redhat.com/show_bug.cgi?id=471071).
+  SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include -I/usr/include/pl"
+  # If SWI-Prolog was configured with `--disable-libdirversion', then
+  # the files are not in the `${swi_prolog_arch}' subdirectory.  Since
+  # currently there is no way to know that, we look in both places.
+  SWI_PROLOG_LD_OPTIONS="-L${swi_prolog_base}/lib/${swi_prolog_arch} -L${swi_prolog_base}/lib ${swi_prolog_lib} ${swi_prolog_libs}"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  # We require SWI-Prolog 5.6.0 or later.
+  AC_CHECK_HEADER(SWI-Prolog.h,
+                  AC_MSG_CHECKING([for SWI-Prolog version 5.6.0 or later])
+                  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+  choke me
+#endif
+
+  ;
+  return 0;
+}
+                    ]])],
+                    AC_MSG_RESULT(yes),
+                    swi_prolog=""
+                    AC_MSG_RESULT(no)
+                  ),
+                  swi_prolog="")
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  SWI_PROLOG="$swi_prolog"
+  SWI_PROLOG_LD="$swi_prolog_ld"
+  AC_SUBST(SWI_PROLOG)
+  AC_SUBST(SWI_PROLOG_LD)
+  AC_SUBST(SWI_PROLOG_INCLUDE_OPTIONS)
+  AC_SUBST(SWI_PROLOG_LD_OPTIONS)
+fi
+
+if test x$swi_prolog != x
+then
+  have_swi_prolog=yes
+else
+  have_swi_prolog=no
+fi
+])
diff --git a/m4/ac_check_xsb_prolog.m4 b/m4/ac_check_xsb_prolog.m4
new file mode 100644
index 0000000..c0ff9ad
--- /dev/null
+++ b/m4/ac_check_xsb_prolog.m4
@@ -0,0 +1,50 @@
+dnl A function to check for the existence and usability of XSB Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_XSB_PROLOG],
+[
+AC_PATH_PROG(xsb_prolog, xsb)
+if test x$xsb_prolog != x
+then
+  dnl The foreign language interface include file is `cinterf.h',
+  dnl but this resides in the emulator directory and is not installed
+  dnl in any standard place.
+  xsb_emu_dir=`xsb --nobanner --quietload --noprompt \
+                -e "write('emudir='), \
+                  xsb_configuration(emudir, X), write(X), nl, halt." \
+                    2>/dev/null | sed "s/^emudir=//g"`
+  xsb_config_dir=`xsb --nobanner --quietload --noprompt \
+                   -e "write('config_dir='), \
+                     xsb_configuration(config_dir,X), write(X), nl, halt." \
+                       2>/dev/null | sed "s/^config_dir=//g"`
+  XSB_PROLOG_INCLUDE_OPTIONS="-I${xsb_emu_dir} -I${xsb_config_dir}"
+  AC_SUBST(XSB_PROLOG_INCLUDE_OPTIONS)
+fi
+
+if test x$xsb_prolog != x
+then
+  have_xsb_prolog=yes
+else
+  have_xsb_prolog=no
+fi
+])
diff --git a/m4/ac_check_yap.m4 b/m4/ac_check_yap.m4
new file mode 100644
index 0000000..e95665c
--- /dev/null
+++ b/m4/ac_check_yap.m4
@@ -0,0 +1,55 @@
+dnl A function to check for the existence and usability of YAP Prolog.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CHECK_YAP_PROLOG],
+[
+dnl By default, YAP-Prolog is installed as `yap'.
+AC_PATH_PROG(yap_prolog, yap)
+if test x$yap_prolog != x
+then
+  dnl Additional version checks could be inserted here, if necessary.
+
+  YAP_PROLOG_INCLUDE_OPTIONS=""
+  YAP_PROLOG_LD_OPTIONS="-lYap"
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $YAP_PROLOG_INCLUDE_OPTIONS"
+  AC_LANG_PUSH(C++)
+  # Check for YAP's foreign language interface header file.
+  AC_CHECK_HEADER(Yap/c_interface.h,
+                  [],
+                  yap_prolog="")
+  AC_LANG_POP(C++)
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  YAP_PROLOG="$yap_prolog"
+  AC_SUBST(YAP_PROLOG)
+  AC_SUBST(YAP_PROLOG_INCLUDE_OPTIONS)
+  AC_SUBST(YAP_PROLOG_LD_OPTIONS)
+fi
+
+if test x$yap_prolog != x
+then
+  have_yap_prolog=yes
+else
+  have_yap_prolog=no
+fi
+])
diff --git a/m4/ac_cxx_attribute_weak.m4 b/m4/ac_cxx_attribute_weak.m4
new file mode 100644
index 0000000..34e6596
--- /dev/null
+++ b/m4/ac_cxx_attribute_weak.m4
@@ -0,0 +1,59 @@
+dnl A function to check whether the C++ compiler supports the function
+dnl __attribute__ ((weak)).
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_ATTRIBUTE_WEAK],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports __attribute__ ((weak))])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_supports_attribute_weak=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_attribute_weak=no,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_attribute_weak=no)
+
+if test x"$ac_cxx_supports_attribute_weak" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK, $value,
+  [Not zero if the C++ compiler supports __attribute__ ((weak)).])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_double_binary_format.m4 b/m4/ac_cxx_double_binary_format.m4
new file mode 100644
index 0000000..83c8ec7
--- /dev/null
+++ b/m4/ac_cxx_double_binary_format.m4
@@ -0,0 +1,113 @@
+dnl A function to detect the binary format used by C++ doubles.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_DOUBLE_BINARY_FORMAT],
+[
+AC_REQUIRE([AC_C_BIGENDIAN])
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ doubles])
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<double>::is_iec559
+      && (convert(0xaaacccaaUL, 0xacccaaacUL)
+          == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103
+          && convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0
+          && convert(0x00000000UL, 0x00000001UL)
+          == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+          && convert(0x80000000UL, 0x00000001UL)
+          == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+]])],
+  AC_DEFINE(PPL_CXX_DOUBLE_BINARY_FORMAT, PPL_FLOAT_IEEE754_DOUBLE,
+    [The unique code of the binary format of C++ doubles, if supported; undefined otherwise.])
+  ac_cxx_double_binary_format="IEEE754 Double Precision",
+  ac_cxx_double_binary_format=unknown,
+  ac_cxx_double_binary_format=unknown)
+
+AC_MSG_RESULT($ac_cxx_double_binary_format)
+
+if test x"$ac_cxx_double_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+  ac_supported_double=0
+else
+  ac_supported_double=1
+fi
+AM_CONDITIONAL(SUPPORTED_DOUBLE, test $ac_supported_double = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_DOUBLE, $ac_supported_double,
+  [Not zero if doubles are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_float_binary_format.m4 b/m4/ac_cxx_float_binary_format.m4
new file mode 100644
index 0000000..8427bcc
--- /dev/null
+++ b/m4/ac_cxx_float_binary_format.m4
@@ -0,0 +1,102 @@
+dnl A function to detect the binary format used by C++ floats.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_FLOAT_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ floats])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_FLOAT == 4
+
+inline float
+convert(uint32_t x) {
+  union {
+    float value;
+    uint32_t word;
+  } u;
+
+  u.word = x;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<float>::is_iec559
+      && (   convert(0xaaacccaaU)
+          == -3.069535185924732179074680971098132431507110595703125e-13
+          && convert(0xcccaaaccU)
+          == -106255968
+          && convert(0x00000001U)
+          == 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45
+          && convert(0x80000001U)
+          == -1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45))
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+]])],
+  AC_DEFINE(PPL_CXX_FLOAT_BINARY_FORMAT, PPL_FLOAT_IEEE754_SINGLE,
+    [The binary format of C++ floats, if supported; undefined otherwise.])
+  ac_cxx_float_binary_format="IEEE754 Single Precision",
+  ac_cxx_float_binary_format=unknown,
+  ac_cxx_float_binary_format=unknown)
+
+AC_MSG_RESULT($ac_cxx_float_binary_format)
+
+if test x"$ac_cxx_float_binary_format" = x"unknown" || test $ac_cv_can_control_fpu = 0
+then
+  ac_supported_float=0
+else
+  ac_supported_float=1
+fi
+AM_CONDITIONAL(SUPPORTED_FLOAT, test $ac_supported_float = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_FLOAT, $ac_supported_float,
+  [Not zero if floats are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_ieee_inexact_flag.m4 b/m4/ac_cxx_ieee_inexact_flag.m4
new file mode 100644
index 0000000..e05bfb6
--- /dev/null
+++ b/m4/ac_cxx_ieee_inexact_flag.m4
@@ -0,0 +1,133 @@
+dnl A function to check whether the IEEE inexact flag is supported and
+dnl available to C++ programs.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_IEEE_INEXACT_FLAG],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the IEEE inexact flag is supported in C++])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+int
+main() {
+  return 0;
+}
+
+#elif defined(PPL_HAVE_IEEEFP_H)					\
+  && (defined(__sparc)							\
+      || defined(sparc)							\
+      || defined(__sparc__))
+
+int
+main() {
+  return 0;
+}
+
+#elif !defined(HAVE_FENV_H)
+
+int
+main() {
+  return 1;
+}
+
+#else
+
+#include <fenv.h>
+
+#if !defined(FE_INEXACT)
+
+int
+main() {
+  return 1;
+}
+
+#else // defined(FE_INEXACT)
+
+struct A {
+  double dividend;
+  double divisor;
+  bool inexact;
+} a[] = {
+  { 1.0, 2.0, false },
+  { 2.0, 3.0, true },
+};
+
+int main() {
+  for (unsigned i = 0; i < sizeof(a)/sizeof(a[0]); ++i) {
+    {
+      volatile float x = a[i].dividend;
+      volatile float y = a[i].divisor;
+      feclearexcept(FE_INEXACT);
+      x = x / y;
+      if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+        return 1;
+    }
+    {
+      volatile double x = a[i].dividend;
+      volatile double y = a[i].divisor;
+      feclearexcept(FE_INEXACT);
+      x = x / y;
+      if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+        return 1;
+    }
+    {
+      volatile long double x = a[i].dividend;
+      volatile long double y = a[i].divisor;
+      feclearexcept(FE_INEXACT);
+      x = x / y;
+      if ((fetestexcept(FE_INEXACT) != 0) != a[i].inexact)
+        return 1;
+    }
+  }
+  return 0;
+}
+
+#endif // defined(FE_INEXACT)
+
+#endif
+
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_supports_ieee_inexact_flag=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_ieee_inexact_flag=no,
+  AC_MSG_RESULT([assuming not])
+  ac_cxx_supports_ieee_inexact_flag=no)
+
+if test x"$ac_cxx_supports_ieee_inexact_flag" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG, $value,
+  [Not zero if the the IEEE inexact flag is supported in C++.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_limit_memory.m4 b/m4/ac_cxx_limit_memory.m4
new file mode 100644
index 0000000..fcf8ec8
--- /dev/null
+++ b/m4/ac_cxx_limit_memory.m4
@@ -0,0 +1,121 @@
+dnl A function to check whether it is possible to limit the memory
+dnl available to processes using setrlimit().
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_LIMITING_MEMORY],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether we can limit memory in C++ using setrlimit()])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#if !HAVE_DECL_SETRLIMIT
+# error "cannot limit memory without setrlimit()"
+#endif
+
+#include <stdexcept>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., ru_utime.
+# include <sys/resource.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#define LIMIT(WHAT) \
+  do {									\
+    if (getrlimit(WHAT, &t) != 0) 					\
+      return false;                                                     \
+    t.rlim_cur = bytes;							\
+    if (setrlimit(WHAT, &t) != 0)					\
+      return false;                                                     \
+  } while (0)
+
+bool
+limit_memory(unsigned long bytes) {
+  struct rlimit t;
+#if HAVE_DECL_RLIMIT_DATA
+  // Limit heap size.
+  LIMIT(RLIMIT_DATA);
+#endif
+#if HAVE_DECL_RLIMIT_RSS
+  // Limit resident set size.
+  LIMIT(RLIMIT_RSS);
+#endif
+#if HAVE_DECL_RLIMIT_VMEM
+  // Limit mapped memory (brk + mmap).
+  LIMIT(RLIMIT_VMEM);
+#endif
+#if HAVE_DECL_RLIMIT_AS
+  // Limit virtual memory.
+  LIMIT(RLIMIT_AS);
+#endif
+  return true;
+}
+
+int
+main() try {
+  if (!limit_memory(10000))
+    return 1;
+  (void) new char[20000];
+  return 1;
+ }
+ catch (std::bad_alloc) {
+   return 0;
+ }
+ catch (...) {
+   return 1;
+ }
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_supports_limiting_memory=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_limiting_memory=no,
+  AC_MSG_RESULT([assuming not])
+  ac_cxx_supports_limiting_memory=no)
+
+if test x"$ac_cxx_supports_limiting_memory" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_LIMITING_MEMORY, $value,
+  [Not zero if it is possible to limit memory using setrlimit().])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_long_double_binary_format.m4 b/m4/ac_cxx_long_double_binary_format.m4
new file mode 100644
index 0000000..bc6cc49
--- /dev/null
+++ b/m4/ac_cxx_long_double_binary_format.m4
@@ -0,0 +1,353 @@
+dnl A function to detect the binary format used by C++ long doubles.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_LONG_DOUBLE_BINARY_FORMAT],
+[
+AC_REQUIRE([AC_C_BIGENDIAN])
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ long doubles])
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 12
+
+long double
+convert(uint32_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+          == -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034 [...]
+          && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+          == -3.23434990843367356978836243375823670140137920038631047807023049120171609457620808873309220935271108176353097313943940275472100621788903190230956690534410676669705059335585140518969412596610080153759381132049385057915293867970546587078868452351854180615879140837871859693613285468342558175420524259461419246587664010262843224689767458364974546764113923420713958481010186877291531245407558226524068718427924386121735166705992087823616450647326179770339398151079922803077815239965 [...]
+          && convert(0x00000000UL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+          && convert(0x80000000UL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+]])],
+  AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_INTEL_DOUBLE_EXTENDED,
+  [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="Intel Double-Extended",
+  ac_cxx_long_double_binary_format=unknown,
+  ac_cxx_long_double_binary_format=unknown)
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+#if defined(__sparc__) && defined(__arch64__) \
+    && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+
+// Work around http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37661
+int
+main() {
+  return 1;
+}
+
+#else // !defined(__sparc__) || !defined(__arch64__) ...
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+          == -8.55855653885100434741341853993902633367349104766375354667159377718342093894815477326286823233135691805519944470138219932524951165689852082013017904043605683486724317550972746307400400204571080045247416605879743573136814766221652651396476675668866980798618379071105211750397249729982891787041148520384572930274879267722158826932337019191713973025403784448443813348692062209940856126724493492803365972504505177354875652033856070760087261648660638833868952644144747756799606849182 [...]
+          && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+          == -1245145811075115522107964569349668036873048429802955738289544979224937529833971888147113044115600185809657440463151337899852742080173681519641002844007842161066491872877272689899483098933357761372012363074222544903849943421327866952518563408226075393323377411859119799862094642227761121175434773105923957353216410161917656139242348962530519313341883531064222310528951125334264629650711950000833461188453888512224682758538996197678583645934917458956166559210225915729833706160100 [...]
+          && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+          == 6.475175119438025110924438958227646552499569338034681009689884389197039540124119371017671491276649940255878141476848119676587219886382542046685110071972617983042792710751334934416734625638471740239448526505553990391455556252171148068070822034688256982476272828789103028357337561348031062386564592639826226991907907867663262065711211583064657196068308332845234453069760526489447660964579313751403402631804350039948870075255648713368066117879403155766713303467434937062409411685215 [...]
+          && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+          == -6.47517511943802511092443895822764655249956933803468100968988438919703954012411937101767149127664994025587814147684811967658721988638254204668511007197261798304279271075133493441673462563847174023944852650555399039145555625217114806807082203468825698247627282878910302835733756134803106238656459263982622699190790786766326206571121158306465719606830833284523445306976052648944766096457931375140340263180435003994887007525564871336806611787940315576671330346743493706240941168521 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#endif // !defined(__sparc__) || !defined(__arch64__) ...
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+  AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_IEEE754_QUAD,
+  [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="IEEE754 Quad Precision",
+  ac_cxx_long_double_binary_format=unknown,
+  ac_cxx_long_double_binary_format=unknown)
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 16
+
+long double
+convert(uint64_t msp, uint64_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint64_t msp;
+      uint64_t lsp;
+#else
+      uint64_t lsp;
+      uint64_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+          == -7.60485409436602033833759988758780020217551374528569429669911873757906182254327119546821375294569706862634123096006179131975601459939317923749460760611755945509159249553133915285667773529968161411385504730903997838176525168965533046787887965329768475303861077507591270048979509969375307518720976751563959372182344600137482199546034650881151618280482157637543315750344472366897650456745841889271161287700829333629145672371870175300825285400580026318002741921464859617583666254762 [...]
+          && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+          == -9965833187718142564038919371244528880400911264240719763322990704886435019238181462823338415353952436874830526964270445045957245891305882920209440893355853355213758922643053767150375473715384555384564609917951254069603870739549122332594610600777084466038134002807982723703367090044608379335368276188508415489863689777967712401011928894574027307241589899644172257148781505238731702567519166576191811900643182875678049360454665894916648664135478300253607136628778029068062099599179 [...]
+          && convert(0x0000000000000000ULL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+          && convert(0x8000000000000000ULL, 0x0000000000000001ULL)
+          == 3.645199531882474602528405933619419816399050815693563343720980487028371688633397736809560708625827205197247347347203531101966985632622032169973508075589809005483822581177931678569225263805633559756621562565983410728940319793553527268591240799954172811015518538383046054768715422449295305859718268214262622067532355460844068079259753739688226338971902813354664211957293812000216762672292032277433639030845605529795518855299212255321171163487629138462930035513852750160313284578587 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+  AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_INTEL_DOUBLE_EXTENDED,
+    [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="Intel Double-Extended",
+  ac_cxx_long_double_binary_format=unknown,
+  ac_cxx_long_double_binary_format=unknown)
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if SIZEOF_LONG_DOUBLE == 8
+
+double
+convert(uint32_t msp, uint32_t lsp) {
+  union {
+    long double value;
+    struct {
+#ifdef WORDS_BIGENDIAN
+      uint32_t msp;
+      uint32_t lsp;
+#else
+      uint32_t lsp;
+      uint32_t msp;
+#endif
+    } parts;
+  } u;
+
+  u.parts.msp = msp;
+  u.parts.lsp = lsp;
+  return u.value;
+}
+
+int
+main() {
+  if (std::numeric_limits<long double>::is_iec559
+      && (convert(0xaaacccaaUL, 0xacccaaacUL)
+          == -4.018242396032647085467373664662028399901175154542925376476863248797653889888945947404163925979898721593782464256360719269163883854613473748830842329884157359816532025640075051481726120707111709993717456369512975427023957197464411926714771905463723621065863511603311053477227687835693359375e-103L
+          && convert(0xcccaaaccUL, 0xcaaacccaUL)
+	  == -85705035845709846787631445265530356117787053916987832397725696.0L
+          && convert(0x00000000UL, 0x00000001UL)
+          == 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753 [...]
+          && convert(0x80000000UL, 0x00000001UL)
+          == -4.94065645841246544176568792868221372365059802614324764425585682500675507270208751865299836361635992379796564695445717730926656710355939796398774796010781878126300713190311404527845817167848982103688718636056998730723050006387409153564984387312473397273169615140031715385398074126238565591171026658556686768187039560310624931945271591492455329305456544401127480129709999541931989409080416563324524757147869014726780159355238611550134803526493472019379026810710749170333222684475 [...]
+    return 0;
+  else
+    return 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+  return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+]])],
+  AC_DEFINE(PPL_CXX_LONG_DOUBLE_BINARY_FORMAT, PPL_FLOAT_IEEE754_DOUBLE,
+    [The unique code of the binary format of C++ long doubles, if supported; undefined otherwise.])
+  ac_cxx_long_double_binary_format="IEEE754 Double Precision",
+  ac_cxx_long_double_binary_format=unknown,
+  ac_cxx_long_double_binary_format=unknown)
+fi
+
+AC_MSG_RESULT($ac_cxx_long_double_binary_format)
+
+AC_MSG_CHECKING([whether std::floor(long double) is buggy])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <cmath>
+#include <cstdlib>
+
+long double x = 13311002825915415087.0L;
+
+int main() {
+  long double y = std::floor(x);
+  if (x != y)
+    return 1;
+  else
+    return 0;
+}
+  ]])],
+  ac_std_floor_long_double_is_buggy=no
+  AC_MSG_RESULT(no),
+  ac_std_floor_long_double_is_buggy=yes
+  AC_MSG_RESULT(yes),
+  ac_std_floor_long_double_is_buggy=no
+  AC_MSG_RESULT([assuming is not]))
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown" \
+|| test $ac_cv_can_control_fpu = 0 \
+|| test x"$ac_std_floor_long_double_is_buggy" = x"yes"
+then
+  ac_supported_long_double=0
+else
+  ac_supported_long_double=1
+fi
+AM_CONDITIONAL(SUPPORTED_LONG_DOUBLE, test $ac_supported_long_double = 1)
+AC_DEFINE_UNQUOTED(PPL_SUPPORTED_LONG_DOUBLE, $ac_supported_long_double,
+  [Not zero if long doubles are supported.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_plain_char_is_signed.m4 b/m4/ac_cxx_plain_char_is_signed.m4
new file mode 100644
index 0000000..81b6fed
--- /dev/null
+++ b/m4/ac_cxx_plain_char_is_signed.m4
@@ -0,0 +1,53 @@
+dnl A function to check whether the plain char type is signed.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_PLAIN_CHAR_IS_SIGNED],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the plain char type is signed])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+
+int foo[std::numeric_limits<char>::is_signed ? 1 : -1];
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_plain_char_is_signed=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_plain_char_is_signed=no)
+
+if test x"$ac_cxx_plain_char_is_signed" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_PLAIN_CHAR_IS_SIGNED, $value,
+  [Not zero if the the plain char type is signed.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_proper_long_double.m4 b/m4/ac_cxx_proper_long_double.m4
new file mode 100644
index 0000000..17432aa
--- /dev/null
+++ b/m4/ac_cxx_proper_long_double.m4
@@ -0,0 +1,64 @@
+dnl A function to check whether the C++ compiler provides long double
+dnl numbers that have bigger range or precision than double.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_PROVIDES_PROPER_LONG_DOUBLE],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler provides proper long doubles])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <cfloat>
+
+long double f = 0.0;
+
+int main() {
+  if ((LDBL_MAX <= DBL_MAX) && (DBL_EPSILON <= LDBL_EPSILON)
+      && (LDBL_MAX_EXP <= DBL_MAX_EXP) && (LDBL_MANT_DIG <= DBL_MANT_DIG))
+    return 1;
+  else
+    return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_provides_proper_long_double=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_provides_proper_long_double=no,
+  AC_MSG_RESULT([assuming not])
+  ac_cxx_provides_proper_long_double=no)
+
+if test x"$ac_cxx_provides_proper_long_double" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE, $value,
+  [Not zero if the C++ compiler provides long double numbers that have bigger range or precision than double.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_cxx_zero_length_arrays.m4 b/m4/ac_cxx_zero_length_arrays.m4
new file mode 100644
index 0000000..33d5a98
--- /dev/null
+++ b/m4/ac_cxx_zero_length_arrays.m4
@@ -0,0 +1,142 @@
+dnl A function to check whether the C++ compiler supports zero-length arrays.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports zero-length arrays])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+  int i;
+  bool b;
+
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec[];
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  return 0;
+}
+]])],
+  AC_MSG_RESULT(yes)
+  ac_cxx_supports_zero_length_arrays=yes,
+  AC_MSG_RESULT(no)
+  ac_cxx_supports_zero_length_arrays=no,
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <new>
+#include <cstddef>
+
+class A {
+private:
+  int i;
+  bool b;
+
+public:
+  A()
+    : i(0), b(false) {
+  }
+};
+
+class B {
+private:
+  int capacity;
+  A vec[0];
+
+public:
+  void* operator new(size_t fixed_size, int c) {
+    return ::operator new(fixed_size + c*sizeof(B));
+  }
+
+  void operator delete(void* p) {
+    ::operator delete(p);
+  }
+
+  void operator delete(void* p, int) {
+    ::operator delete(p);
+  }
+
+  B(int s)
+    : capacity(s) {
+  }
+};
+
+int
+main() {
+  B* p = new (100) B(100);
+  delete p;
+  return 0;
+}
+]])],
+    AC_MSG_RESULT(yes)
+    ac_cxx_supports_zero_length_arrays=yes,
+    AC_MSG_RESULT(no)
+    ac_cxx_supports_zero_length_arrays=no))
+
+if test x"$ac_cxx_supports_zero_length_arrays" = xyes
+then
+  value=1
+else
+  value=0
+fi
+AC_DEFINE_UNQUOTED(PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS, $value,
+  [Not zero if the C++ compiler supports zero_length arrays.])
+
+AC_LANG_POP(C++)
+CPPFLAGS="$ac_save_CPPFLAGS"
+LIBS="$ac_save_LIBS"
+])
diff --git a/m4/ac_prog_jar.m4 b/m4/ac_prog_jar.m4
new file mode 100644
index 0000000..7e0f9b2
--- /dev/null
+++ b/m4/ac_prog_jar.m4
@@ -0,0 +1,54 @@
+##### http://autoconf-archive.cryp.to/ac_prog_jar.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAR
+#
+# DESCRIPTION
+#
+#   AC_PROG_JAR tests for an existing jar program. It uses the
+#   environment variable JAR then tests in sequence various common jar
+#   programs.
+#
+#   If you want to force a specific compiler:
+#
+#   - at the configure.in level, set JAR=yourcompiler before calling
+#   AC_PROG_JAR
+#
+#   - at the configure level, setenv JAR
+#
+#   You can use the JAR variable in your Makefile.in, with @JAR at .
+#
+#   Note: This macro depends on the autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download that whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission.
+#
+#   The general documentation of those macros, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2006-11-06
+#
+# COPYLEFT
+#
+#   Copyright (C) 2000      Egon Willighagen <e.willighagen at science.ru.nl>
+#   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+#   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+#   Copying and distribution of this file, with or without
+#   modification, are permitted in any medium without royalty provided
+#   the copyright notice and this notice are preserved.
+
+AC_DEFUN([AC_PROG_JAR],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x; then
+        test "x$JAR" = x && AC_CHECK_PROGS(JAR, jar$EXEEXT, no)
+else
+        test "x$JAR" = x && AC_PATH_PROGS(JAR, jar, no, $JAVAPREFIX)
+fi
+test "x$JAR" = xno
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_java.m4 b/m4/ac_prog_java.m4
new file mode 100644
index 0000000..5205c79
--- /dev/null
+++ b/m4/ac_prog_java.m4
@@ -0,0 +1,268 @@
+#### http://autoconf-archive.cryp.to/ac_prog_java_works.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVA_WORKS
+#
+# DESCRIPTION
+#
+#   Internal use ONLY.
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission. The general documentation, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2006-11-15
+#
+# COPYLEFT
+#
+#   Copyright (C) 2000      Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+#   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+#   This program is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU General Public License as
+#   published by the Free Software Foundation; either version 2 of the
+#   License, or (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+#   02111-1307, USA.
+#
+#   As a special exception, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+AC_DEFUN([AC_PROG_JAVA_WORKS], [
+AC_CHECK_PROG(uudecode, uudecode$EXEEXT, yes)
+if test x$uudecode = xyes; then
+AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [
+dnl /**
+dnl  * Test.java: used to test if java compiler works.
+dnl  */
+dnl public class Test
+dnl {
+dnl
+dnl public static void
+dnl main( String[] argv )
+dnl {
+dnl     System.exit (0);
+dnl }
+dnl
+dnl }
+cat << \EOF > Test.uue
+begin-base64 644 Test.class
+yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
+bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
+bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
+YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
+aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
+AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
+AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
+====
+EOF
+if uudecode$EXEEXT Test.uue; then
+        ac_cv_prog_uudecode_base64=yes
+else
+        echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AS_MESSAGE_LOG_FD
+        echo "configure: failed file was:" >&AS_MESSAGE_LOG_FD
+        cat Test.uue >&AS_MESSAGE_LOG_FD
+        ac_cv_prog_uudecode_base64=no
+fi
+rm -f Test.uue])
+fi
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        rm -f Test.class
+        if test x$ac_cv_javac_supports_enums = x; then
+                AC_PROG_JAVAC
+        fi
+fi
+AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+TEST=Test
+changequote(, )dnl
+cat << \EOF > $JAVA_TEST
+/* [#]line __oline__ "configure" */
+public class Test {
+public static void main (String args[]) {
+        System.exit (0);
+} }
+EOF
+changequote([, ])dnl
+if test x$ac_cv_prog_uudecode_base64 != xyes; then
+        if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then
+                :
+        else
+          echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+          cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
+          AC_MSG_WARN(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?))
+        fi
+fi
+# if we don't have a Java compiler installed, it's useless to check if Java
+# works beacause a working javac is needed.
+if test x$ac_cv_javac_supports_enums = xno; then
+ ac_cv_prog_java_works=skipping
+else
+if AC_TRY_COMMAND($JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then
+  ac_cv_prog_java_works=yes
+else
+  echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+  cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
+  AC_MSG_WARN(The Java VM $JAVA failed (see config.log, check the CLASSPATH?))
+  fi
+fi
+rm -fr $JAVA_TEST $CLASS_TEST Test.uue
+])
+AC_PROVIDE([$0])dnl
+]
+)
+
+
+##### http://autoconf-archive.cryp.to/ac_prog_java.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVA
+#
+# DESCRIPTION
+#
+#   Here is a summary of the main macros:
+#
+#   AC_PROG_JAVAC: finds a Java compiler.
+#
+#   AC_PROG_JAVA: finds a Java virtual machine.
+#
+#   AC_CHECK_CLASS: finds if we have the given class (beware of
+#   CLASSPATH!).
+#
+#   AC_CHECK_RQRD_CLASS: finds if we have the given class and stops
+#   otherwise.
+#
+#   AC_TRY_COMPILE_JAVA: attempt to compile user given source.
+#
+#   AC_TRY_RUN_JAVA: attempt to compile and run user given source.
+#
+#   AC_JAVA_OPTIONS: adds Java configure options.
+#
+#   AC_PROG_JAVA tests an existing Java virtual machine. It uses the
+#   environment variable JAVA then tests in sequence various common
+#   Java virtual machines. For political reasons, it starts with the
+#   free ones. You *must* call [AC_PROG_JAVAC] before.
+#
+#   If you want to force a specific VM:
+#
+#   - at the configure.in level, set JAVA=yourvm before calling
+#   AC_PROG_JAVA
+#
+#     (but after AC_INIT)
+#
+#   - at the configure level, setenv JAVA
+#
+#   You can use the JAVA variable in your Makefile.in, with @JAVA at .
+#
+#   *Warning*: its success or failure can depend on a proper setting of
+#   the CLASSPATH env. variable.
+#
+#   TODO: allow to exclude virtual machines (rationale: most Java
+#   programs cannot run with some VM like kaffe).
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission.
+#
+#   A Web page, with a link to the latest CVS snapshot is at
+#   <http://www.internatif.org/bortzmeyer/autoconf-Java/>.
+#
+#   This is a sample configure.in Process this file with autoconf to
+#   produce a configure script.
+#
+#      AC_INIT(UnTag.java)
+#
+#      dnl Checks for programs.
+#      AC_CHECK_CLASSPATH
+#      AC_PROG_JAVAC
+#      AC_PROG_JAVA
+#
+#      dnl Checks for classes
+#      AC_CHECK_RQRD_CLASS(org.xml.sax.Parser)
+#      AC_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver)
+#
+#      AC_OUTPUT(Makefile)
+#
+# LAST MODIFICATION
+#
+#   2006-11-06
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000      Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+#   This program is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU General Public License as
+#   published by the Free Software Foundation; either version 2 of the
+#   License, or (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+#   02111-1307, USA.
+#
+#   As a special exception, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+
+
+AC_DEFUN([AC_PROG_JAVA],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test x$JAVAPREFIX = x; then
+        test x$JAVA = x && AC_CHECK_PROGS(JAVA, java$EXEEXT, no)
+else
+        test x$JAVA = x && AC_PATH_PROGS(JAVA, java$EXEEXT, no, $JAVAPREFIX)
+fi
+if test ! x$JAVA = "xno"
+then
+ 	AC_PROG_JAVA_WORKS
+fi
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_javac.m4 b/m4/ac_prog_javac.m4
new file mode 100644
index 0000000..7a9a9b6
--- /dev/null
+++ b/m4/ac_prog_javac.m4
@@ -0,0 +1,145 @@
+dnl A function to check whether the Java compiler supports enums.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_JAVAC_SUPPORTS_ENUMS],[
+AC_CACHE_CHECK([whether $JAVAC supports enums], ac_cv_javac_supports_enums, [
+JAVA_TEST=Test.java
+CLASS_TEST=Test.class
+cat << \EOF > $JAVA_TEST
+/* [#]line __oline__ "configure" */
+public class Test {
+public enum Relation_Symbol {
+    /*! Less than. */
+    LESS_THAN,
+    /*! Less than or equal to. */
+    LESS_OR_EQUAL,
+    /*! Equal to. */
+    EQUAL,
+    /*! Greater than or equal to. */
+    GREATER_OR_EQUAL,
+    /*! Greater than. */
+    GREATER_THAN,
+ }
+}
+EOF
+if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then
+  ac_cv_javac_supports_enums=yes
+else
+  echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
+  cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
+  ac_cv_javac_supports_enums=no
+fi
+
+rm -f $JAVA_TEST $CLASS_TEST Test\$Relation_Symbol.class
+])
+AC_PROVIDE([$0])dnl
+])
+
+##### http://autoconf-archive.cryp.to/ac_prog_javac.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVAC
+#
+# DESCRIPTION
+#
+#   AC_PROG_JAVAC tests an existing Java compiler. It uses the
+#   environment variable JAVAC then tests in sequence various common
+#   Java compilers. For political reasons, it starts with the free
+#   ones.
+#
+#   If you want to force a specific compiler:
+#
+#   - at the configure.in level, set JAVAC=yourcompiler before calling
+#   AC_PROG_JAVAC
+#
+#   - at the configure level, setenv JAVAC
+#
+#   You can use the JAVAC variable in your Makefile.in, with @JAVAC at .
+#
+#   *Warning*: its success or failure can depend on a proper setting of
+#   the CLASSPATH env. variable.
+#
+#   TODO: allow to exclude compilers (rationale: most Java programs
+#   cannot compile with some compilers like guavac).
+#
+#   Note: This is part of the set of autoconf M4 macros for Java
+#   programs. It is VERY IMPORTANT that you download the whole set,
+#   some macros depend on other. Unfortunately, the autoconf archive
+#   does not support the concept of set of macros, so I had to break it
+#   for submission. The general documentation, as well as the sample
+#   configure.in, is included in the AC_PROG_JAVA macro.
+#
+# LAST MODIFICATION
+#
+#   2006-11-07
+#
+# COPYLEFT
+#
+#   Copyright (c) 2000      Stephane Bortzmeyer <bortzmeyer at pasteur.fr>
+#   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+#   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+#   This program is free software; you can redistribute it and/or
+#   modify it under the terms of the GNU General Public License as
+#   published by the Free Software Foundation; either version 2 of the
+#   License, or (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+#   02111-1307, USA.
+#
+#   As a special exception, the respective Autoconf Macro's copyright
+#   owner gives unlimited permission to copy, distribute and modify the
+#   configure scripts that are the output of Autoconf when processing
+#   the Macro. You need not follow the terms of the GNU General Public
+#   License when using or distributing such scripts, even though
+#   portions of the text of the Macro appear in them. The GNU General
+#   Public License (GPL) does govern all other use of the material that
+#   constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the
+#   Autoconf Macro released by the Autoconf Macro Archive. When you
+#   make and distribute a modified version of the Autoconf Macro, you
+#   may extend this special exception to the GPL to apply to your
+#   modified version as well.
+AC_DEFUN([AC_PROG_JAVAC],[
+AC_REQUIRE([AC_EXEEXT])dnl
+if test "x$JAVAPREFIX" = x
+then
+        test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, javac$EXEEXT, no)
+else
+        test "x$JAVAC" = x && AC_PATH_PROGS(JAVAC, javac$EXEEXT, no, $JAVAPREFIX)
+fi
+if test ! x$JAVAC = "xno"
+then
+ 	AC_JAVAC_SUPPORTS_ENUMS
+fi
+AC_PROVIDE([$0])dnl
+])
diff --git a/m4/ac_prog_javah.m4 b/m4/ac_prog_javah.m4
new file mode 100644
index 0000000..0525349
--- /dev/null
+++ b/m4/ac_prog_javah.m4
@@ -0,0 +1,54 @@
+##### http://autoconf-archive.cryp.to/ac_prog_javah.html
+#
+# SYNOPSIS
+#
+#   AC_PROG_JAVAH
+#
+# DESCRIPTION
+#
+#   AC_PROG_JAVAH tests the availability of the javah header generator
+#   and looks for the jni.h header file. If available, JAVAH is set to
+#   the full path of javah and CPPFLAGS is updated accordingly.
+#
+# LAST MODIFICATION
+#
+#   2006-12-20
+#
+# COPYLEFT
+#
+#   Copyright (C) 2002      Luc Maisonobe <luc at spaceroots.org>
+#   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+#   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+#   Copying and distribution of this file, with or without
+#   modification, are permitted in any medium without royalty provided
+#   the copyright notice and this notice are preserved.
+
+AC_DEFUN([AC_PROG_JAVAH],[
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CPP])dnl
+AC_LANG_PUSH(C++)dnl
+if test "x$JAVAPREFIX" = x; then
+        AC_CHECK_PROGS(JAVAH,javah, no)
+else
+	AC_PATH_PROGS(JAVAH,javah, no, $JAVAPREFIX)
+fi
+
+if test x"`eval 'echo $ac_cv_path_JAVAH'`" != xno ; then
+  AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <jni.h>]]) ] ,,[
+    ac_save_CPPFLAGS="$CPPFLAGS"
+changequote(, )dnl
+    ac_dir=`echo $ac_cv_path_JAVAH | sed 's,\(.*\)/[^/]*/[^/]*$,\1/include,'`
+    ac_machdep=`echo $build_os | sed 's,[-0-9].*,,' | sed 's,cygwin,win32,'`
+changequote([, ])dnl
+    JNIFLAGS="-I$ac_dir -I$ac_dir/$ac_machdep"
+    CPPFLAGS="$ac_save_CPPFLAGS $JNIFLAGS"
+    AC_SUBST(JNIFLAGS)
+    AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <jni.h>]])],
+               CPPFLAGS="$ac_save_CPPFLAGS",
+               AC_MSG_WARN([unable to include <jni.h>])
+	       JAVAH=no)
+    CPPFLAGS="$ac_save_CPPFLAGS"])
+fi
+AC_LANG_POP(C++)
+])
diff --git a/m4/ac_text_md5sum.m4 b/m4/ac_text_md5sum.m4
new file mode 100644
index 0000000..d1c77d7
--- /dev/null
+++ b/m4/ac_text_md5sum.m4
@@ -0,0 +1,38 @@
+dnl A function to set the command for computing the MD5 checksum of text files.
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+AC_DEFUN([AC_TEXT_MD5SUM],
+[
+AC_MSG_CHECKING([for the text md5sum command])
+if echo a | (md5sum -t) >/dev/null 2>&1
+then
+  ac_cv_prog_text_md5sum='md5sum -t'
+else
+  ac_cv_prog_text_md5sum='md5sum'
+fi
+AC_MSG_RESULT($ac_cv_prog_text_md5sum)
+TEXT_MD5SUM=$ac_cv_prog_text_md5sum
+AC_SUBST([TEXT_MD5SUM])
+])
+
+
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..44e0ecf
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,7982 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/m4/m4.m4 b/m4/m4.m4
new file mode 100644
index 0000000..3b6fcc6
--- /dev/null
+++ b/m4/m4.m4
@@ -0,0 +1,46 @@
+# m4.m4 serial 5
+dnl Copyright (C) 2000, 2006, 2007, 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# AC_PROG_GNU_M4
+# --------------
+# Check for GNU M4, at least 1.4.5 (all earlier versions had a bug in
+# trace support:
+# http://lists.gnu.org/archive/html/bug-gnu-utils/2006-11/msg00096.html)
+# Also, check whether --error-output (through 1.4.x) or --debugfile (2.0)
+# is supported, and AC_SUBST M4_DEBUGFILE accordingly.
+AC_DEFUN([AC_PROG_GNU_M4],
+  [AC_ARG_VAR([M4], [Location of GNU M4 1.4.5 or later.  Defaults to the first
+    program of `m4', `gm4', or `gnum4' on PATH that meets Autoconf needs.])
+  AC_CACHE_CHECK([for GNU M4 that supports accurate traces], [ac_cv_path_M4],
+    [rm -f conftest.m4f
+AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4 gnum4],
+      [dnl Creative quoting here to avoid raw dnl and ifdef in configure.
+      # Root out GNU M4 1.4.4, as well as non-GNU m4 that ignore -t, -F.
+      ac_snippet=change'quote(<,>)in''dir(<if''def>,mac,bug)d'nl
+      test -z "`$ac_path_M4 -F conftest.m4f </dev/null 2>&1`" \
+      && test -z "`echo $ac_snippet | $ac_path_M4 --trace=mac 2>&1`" \
+      && test -f conftest.m4f \
+      && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:
+      rm -f conftest.m4f],
+      [AC_MSG_ERROR([no acceptable m4 could be found in \$PATH.
+GNU M4 1.4.5 or later is required; 1.4.11 or later is recommended])])])
+  M4=$ac_cv_path_M4
+  AC_CACHE_CHECK([how m4 supports trace files], [ac_cv_prog_gnu_m4_debugfile],
+    [case `$M4 --help < /dev/null 2>&1` in
+      *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;;
+      *) ac_cv_prog_gnu_m4_debugfile=--error-output ;;
+    esac])
+  AC_SUBST([M4_DEBUGFILE], [$ac_cv_prog_gnu_m4_debugfile])
+])
+
+# Compatibility for bootstrapping with Autoconf 2.61.
+dnl FIXME - replace this with AC_PREREQ([2.62]) after the release.
+# AC_PATH_PROGS_FEATURE_CHECK was added the same time the slightly broken,
+# undocumented _AC_PATH_PROG_FEATURE_CHECK was deleted.
+m4_ifndef([AC_PATH_PROGS_FEATURE_CHECK],
+  [m4_define([AC_PATH_PROGS_FEATURE_CHECK],
+    [_AC_PATH_PROG_FEATURE_CHECK([$1], [$2], [$3], [$5])
+])])
diff --git a/m4/ocaml.m4 b/m4/ocaml.m4
new file mode 100644
index 0000000..87b1e3b
--- /dev/null
+++ b/m4/ocaml.m4
@@ -0,0 +1,244 @@
+dnl autoconf macros for OCaml
+dnl
+dnl Copyright (C) 2009      Richard W.M. Jones
+dnl Copyright (C) 2009      Stefano Zacchiroli
+dnl Copyright (C) 2000-2005 Olivier Andrieu
+dnl Copyright (C) 2000-2005 Jean-Christophe Filliatre
+dnl Copyright (C) 2000-2005 Georges Mariano
+dnl
+dnl For documentation, please read the ocaml.m4 man page.
+dnl
+dnl All rights reserved.
+dnl
+dnl Redistribution and use in source and binary forms, with or without
+dnl modification, are permitted provided that the following conditions are
+dnl met:
+dnl
+dnl * Redistributions of source code must retain the above copyright
+dnl   notice, this list of conditions and the following disclaimer.
+dnl * Redistributions in binary form must reproduce the above copyright
+dnl   notice, this list of conditions and the following disclaimer in the
+dnl   documentation and/or other materials provided with the distribution.
+dnl * The names of the contributors may not be used to endorse or promote
+dnl   products derived from this software without specific prior written
+dnl   permission.
+dnl
+dnl THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS''
+dnl AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+dnl THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+dnl BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+dnl CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+dnl SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+dnl BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+dnl WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+dnl OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+dnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+AC_DEFUN([AC_PROG_OCAML],
+[dnl
+  # checking for ocamlc
+  AC_CHECK_TOOL([OCAMLC],[ocamlc],[no])
+
+  if test "$OCAMLC" != "no"; then
+     OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'`
+     AC_MSG_RESULT([OCaml version is $OCAMLVERSION])
+     OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4`
+     AC_MSG_RESULT([OCaml library path is $OCAMLLIB])
+
+     AC_SUBST([OCAMLVERSION])
+     AC_SUBST([OCAMLLIB])
+
+     # checking for ocamlopt
+     AC_CHECK_TOOL([OCAMLOPT],[ocamlopt],[no])
+     OCAMLBEST=byte
+     if test "$OCAMLOPT" = "no"; then
+	AC_MSG_WARN([Cannot find ocamlopt; bytecode compilation only.])
+     else
+	TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+	if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	    AC_MSG_RESULT([versions differs from ocamlc; ocamlopt discarded.])
+	    OCAMLOPT=no
+	else
+	    OCAMLBEST=opt
+	fi
+     fi
+
+     AC_SUBST([OCAMLBEST])
+
+     # checking for ocamlc.opt
+     AC_CHECK_TOOL([OCAMLCDOTOPT],[ocamlc.opt],[no])
+     if test "$OCAMLCDOTOPT" != "no"; then
+	TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+	if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	    AC_MSG_RESULT([versions differs from ocamlc; ocamlc.opt discarded.])
+	else
+	    OCAMLC=$OCAMLCDOTOPT
+	fi
+     fi
+
+     # checking for ocamlopt.opt
+     if test "$OCAMLOPT" != "no" ; then
+	AC_CHECK_TOOL([OCAMLOPTDOTOPT],[ocamlopt.opt],[no])
+	if test "$OCAMLOPTDOTOPT" != "no"; then
+	   TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' `
+	   if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	      AC_MSG_RESULT([version differs from ocamlc; ocamlopt.opt discarded.])
+	   else
+	      OCAMLOPT=$OCAMLOPTDOTOPT
+	   fi
+        fi
+     fi
+
+     AC_SUBST([OCAMLOPT])
+  fi
+
+  AC_SUBST([OCAMLC])
+
+  # checking for ocamldep
+  AC_CHECK_TOOL([OCAMLDEP],[ocamldep],[no])
+
+  # checking for ocamlmktop
+  AC_CHECK_TOOL([OCAMLMKTOP],[ocamlmktop],[no])
+
+  # checking for ocamlmklib
+  AC_CHECK_TOOL([OCAMLMKLIB],[ocamlmklib],[no])
+
+  # checking for ocamldoc
+  AC_CHECK_TOOL([OCAMLDOC],[ocamldoc],[no])
+
+  # checking for ocamlbuild
+  AC_CHECK_TOOL([OCAMLBUILD],[ocamlbuild],[no])
+])
+
+
+AC_DEFUN([AC_PROG_OCAMLLEX],
+[dnl
+  # checking for ocamllex
+  AC_CHECK_TOOL([OCAMLLEX],[ocamllex],[no])
+  if test "$OCAMLLEX" != "no"; then
+    AC_CHECK_TOOL([OCAMLLEXDOTOPT],[ocamllex.opt],[no])
+    if test "$OCAMLLEXDOTOPT" != "no"; then
+	OCAMLLEX=$OCAMLLEXDOTOPT
+    fi
+  fi
+  AC_SUBST([OCAMLLEX])
+])
+
+AC_DEFUN([AC_PROG_OCAMLYACC],
+[dnl
+  AC_CHECK_TOOL([OCAMLYACC],[ocamlyacc],[no])
+  AC_SUBST([OCAMLYACC])
+])
+
+
+AC_DEFUN([AC_PROG_CAMLP4],
+[dnl
+  AC_REQUIRE([AC_PROG_OCAML])dnl
+
+  # checking for camlp4
+  AC_CHECK_TOOL([CAMLP4],[camlp4],[no])
+  if test "$CAMLP4" != "no"; then
+     TMPVERSION=`$CAMLP4 -v 2>&1| sed -n -e 's|.*version *\(.*\)$|\1|p'`
+     if test "$TMPVERSION" != "$OCAMLVERSION" ; then
+	AC_MSG_RESULT([versions differs from ocamlc])
+        CAMLP4=no
+     fi
+  fi
+  AC_SUBST([CAMLP4])
+
+  # checking for companion tools
+  AC_CHECK_TOOL([CAMLP4BOOT],[camlp4boot],[no])
+  AC_CHECK_TOOL([CAMLP4O],[camlp4o],[no])
+  AC_CHECK_TOOL([CAMLP4OF],[camlp4of],[no])
+  AC_CHECK_TOOL([CAMLP4OOF],[camlp4oof],[no])
+  AC_CHECK_TOOL([CAMLP4ORF],[camlp4orf],[no])
+  AC_CHECK_TOOL([CAMLP4PROF],[camlp4prof],[no])
+  AC_CHECK_TOOL([CAMLP4R],[camlp4r],[no])
+  AC_CHECK_TOOL([CAMLP4RF],[camlp4rf],[no])
+  AC_SUBST([CAMLP4BOOT])
+  AC_SUBST([CAMLP4O])
+  AC_SUBST([CAMLP4OF])
+  AC_SUBST([CAMLP4OOF])
+  AC_SUBST([CAMLP4ORF])
+  AC_SUBST([CAMLP4PROF])
+  AC_SUBST([CAMLP4R])
+  AC_SUBST([CAMLP4RF])
+])
+
+
+AC_DEFUN([AC_PROG_FINDLIB],
+[dnl
+  AC_REQUIRE([AC_PROG_OCAML])dnl
+
+  # checking for ocamlfind
+  AC_CHECK_TOOL([OCAMLFIND],[ocamlfind],[no])
+  AC_SUBST([OCAMLFIND])
+])
+
+
+dnl Thanks to Jim Meyering for working this next bit out for us.
+dnl XXX We should define AS_TR_SH if it's not defined already
+dnl (eg. for old autoconf).
+AC_DEFUN([AC_CHECK_OCAML_PKG],
+[dnl
+  AC_REQUIRE([AC_PROG_FINDLIB])dnl
+
+  AC_MSG_CHECKING([for OCaml findlib package $1])
+
+  unset found
+  unset pkg
+  found=no
+  for pkg in $1 $2 ; do
+    if $OCAMLFIND query $pkg >/dev/null 2>/dev/null; then
+      AC_MSG_RESULT([found])
+      AS_TR_SH([OCAML_PKG_$1])=$pkg
+      found=yes
+      break
+    fi
+  done
+  if test "$found" = "no" ; then
+    AC_MSG_RESULT([not found])
+    AS_TR_SH([OCAML_PKG_$1])=no
+  fi
+
+  AC_SUBST(AS_TR_SH([OCAML_PKG_$1]))
+])
+
+
+AC_DEFUN([AC_CHECK_OCAML_MODULE],
+[dnl
+  AC_MSG_CHECKING([for OCaml module $2])
+
+  cat > conftest.ml <<EOF
+open $3
+EOF
+  unset found
+  for $1 in $$1 $4 ; do
+    if $OCAMLC -c -I "$$1" conftest.ml >&5 2>&5 ; then
+      found=yes
+      break
+    fi
+  done
+
+  if test "$found" ; then
+    AC_MSG_RESULT([$$1])
+  else
+    AC_MSG_RESULT([not found])
+    $1=no
+  fi
+  AC_SUBST([$1])
+])
+
+
+dnl XXX Cross-compiling
+AC_DEFUN([AC_CHECK_OCAML_WORD_SIZE],
+[dnl
+  AC_MSG_CHECKING([for OCaml compiler word size])
+  cat > conftest.ml <<EOF
+  print_endline (string_of_int Sys.word_size)
+  EOF
+  OCAML_WORD_SIZE=`ocaml conftest.ml`
+  AC_MSG_RESULT([$OCAML_WORD_SIZE])
+  AC_SUBST([OCAML_WORD_SIZE])
+])
diff --git a/m4/ppl.m4 b/m4/ppl.m4
new file mode 100644
index 0000000..6259ce4
--- /dev/null
+++ b/m4/ppl.m4
@@ -0,0 +1,288 @@
+dnl A function to test for the existence and usability of particular
+dnl versions of the PPL, defining macros containing the required paths.
+dnl Copyright (C) 1997 Owen Taylor
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl AM_PATH_PPL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for PPL, and define PPL_CPPFLAGS, PPL_LDFLAGS, ... what else?
+
+AC_DEFUN([AM_PATH_PPL],
+[
+dnl Get the required information from the ppl-config program.
+AC_ARG_WITH(ppl-prefix,
+  AS_HELP_STRING([--with-ppl-prefix=PREFIX],
+    [prefix used to configure the PPL]),
+  ppl_prefix="$withval",
+  ppl_prefix="")
+AC_ARG_WITH(ppl-exec-prefix,
+  AS_HELP_STRING([--with-ppl-exec-prefix=PREFIX],
+    [exec-prefix used to configure the PPL]),
+  ppl_exec_prefix="$withval",
+  ppl_exec_prefix="")
+AC_ARG_ENABLE(ppl-test,
+  AS_HELP_STRING([--disable-ppltest],
+    [do not try to compile and run a test PPL program]),
+  ,
+  enable_ppltest=yes)
+
+if test "x$ppl_exec_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --exec-prefix=$ppl_exec_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_exec_prefix/bin/ppl-config"
+  fi
+fi
+if test "x$ppl_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --prefix=$ppl_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_prefix/bin/ppl-config"
+  fi
+fi
+
+AC_PATH_PROG(PPL_CONFIG, ppl-config, no)
+min_ppl_version=ifelse([$1], ,0.0,$1)
+if test \( "x$min_ppl_version" = "x0.0" \) -o \( "x$min_ppl_version" = "x0.0.0" \)
+then
+  AC_MSG_CHECKING([for the Parma Polyhedra Library])
+else
+  AC_MSG_CHECKING([for the Parma Polyhedra Library, version >= $min_ppl_version])
+fi
+no_ppl=""
+if test $PPL_CONFIG = no
+then
+  no_ppl=yes
+else
+  PPL_CPPFLAGS=`$PPL_CONFIG $ppl_config_args --cppflags`
+  PPL_LDFLAGS=`$PPL_CONFIG $ppl_config_args --ldflags`
+  ppl_config_version="`$PPL_CONFIG $ppl_config_args --version`"
+
+  if test "x$enable_ppltest" = xyes
+  then
+    ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_save_LDFLAGS="$LDFLAGS"
+    CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+    LDFLAGS="$PPL_LDFLAGS $LDFLAGS"
+
+dnl Now check if the installed PPL is sufficiently new.
+dnl (Also sanity checks the results of ppl-config to some extent.)
+
+    AC_LANG_PUSH(C++)
+
+    rm -f conf.ppltest
+    AC_TRY_RUN([
+#include <ppl.hh>
+#include <iostream>
+#include <cstdio>
+#include <cstdlib>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+using std::cout;
+using std::endl;
+
+int
+main() {
+  system("touch conf.ppltest");
+
+  unsigned min_ppl_major, min_ppl_minor, min_ppl_revision, min_ppl_beta;
+  int n = sscanf("$min_ppl_version",
+                 "%u.%u.%upre%u%*c",
+                 &min_ppl_major, &min_ppl_minor,
+                 &min_ppl_revision, &min_ppl_beta);
+  bool min_ppl_version_ok = true;
+  if (n == 4) {
+    if (min_ppl_beta == 0)
+      min_ppl_version_ok = false;
+  }
+  else if (n == 3) {
+    n = sscanf("$min_ppl_version",
+               "%u.%u.%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_revision);
+    if (n != 3)
+      min_ppl_version_ok = false;
+    else
+      min_ppl_beta = 0;
+  }
+  else if (n == 2) {
+    n = sscanf("$min_ppl_version",
+               "%u.%upre%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_beta);
+    if (n == 3) {
+      if (min_ppl_beta == 0)
+        min_ppl_version_ok = false;
+      else
+        min_ppl_revision = 0;
+    }
+    else if (n == 2) {
+      n = sscanf("$min_ppl_version",
+                 "%u.%u%*c",
+                 &min_ppl_major, &min_ppl_minor);
+      if (n != 2)
+        min_ppl_version_ok = false;
+      else {
+        min_ppl_revision = 0;
+        min_ppl_beta = 0;
+      }
+    }
+    else
+      min_ppl_version_ok = false;
+  }
+  else
+    min_ppl_version_ok = false;
+
+  if (!min_ppl_version_ok) {
+    cout << "illegal version string '$min_ppl_version'"
+         << endl;
+    return 1;
+  }
+
+  if (strcmp("$ppl_config_version", PPL::version()) != 0) {
+    cout << "\n*** 'ppl-config --version' returned $ppl_config_version, "
+            "but PPL version "
+         << PPL::version()
+         << "\n*** was found!  If ppl-config was correct, then it is best"
+            "\n*** to remove the old version of PPL."
+            "  You may also be able to fix the error"
+            "\n*** by modifying your LD_LIBRARY_PATH enviroment variable,"
+            " or by editing"
+            "\n*** /etc/ld.so.conf."
+            "  Make sure you have run ldconfig if that is"
+            "\n*** required on your system."
+            "\n*** If ppl-config was wrong, set the environment variable"
+            " PPL_CONFIG"
+            "\n*** to point to the correct copy of ppl-config,"
+            " and remove the file config.cache"
+            "\n*** before re-running configure."
+         << endl;
+      return 1;
+  }
+  else if (strcmp(PPL_VERSION, PPL::version()) != 0) {
+    cout << "\n*** PPL header file (version " PPL_VERSION ") does not match"
+         << "\n*** library (version " << PPL::version() << ")"
+         << endl;
+      return 1;
+  }
+  else if (PPL_VERSION_MAJOR < min_ppl_major
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR < min_ppl_minor)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION < min_ppl_revision)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION == min_ppl_revision
+              && PPL_VERSION_BETA < min_ppl_beta)) {
+      cout << "\n*** An old version of PPL (" PPL_VERSION ") was found."
+              "\n*** You need at least PPL version $min_ppl_version."
+              "  The latest version of"
+              "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
+              "\n***"
+              "\n*** If you have already installed a sufficiently new version,"
+              " this error"
+              "\n*** probably means that the wrong copy of the ppl-config"
+              " program is"
+              "\n*** being found.  The easiest way to fix this is to remove"
+              " the old version"
+              "\n*** of PPL, but you can also set the PPL_CONFIG environment"
+              " variable to point"
+              "\n*** to the correct copy of ppl-config.  (In this case,"
+              " you will have to"
+              "\n*** modify your LD_LIBRARY_PATH enviroment"
+              " variable or edit /etc/ld.so.conf"
+              "\n*** so that the correct libraries are found at run-time.)"
+           << endl;
+      return 1;
+  }
+  return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+
+    AC_LANG_POP
+
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LDFLAGS="$ac_save_LDFLAGS"
+  fi
+fi
+
+if test "x$no_ppl" = x
+then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], , :, [$2])
+else
+  AC_MSG_RESULT(no)
+  if test x"$PPL_CONFIG" = xno
+  then
+    echo "*** The ppl-config script installed by PPL could not be found."
+    echo "*** If the PPL was installed in PREFIX, make sure PREFIX/bin is in"
+    echo "*** your path, or set the PPL_CONFIG environment variable to the"
+    echo "*** full path to ppl-config."
+  else
+    if test -f conf.ppltest
+    then
+      :
+    else
+      echo "*** Could not run PPL test program, checking why..."
+      CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+      LDFLAGS="$LDFLAGS $PPL_LDFLAGS"
+      AC_TRY_LINK([
+#include <ppl.hh>
+using namespace Parma_Polyhedra_Library;
+],
+[
+  return version_major() || version_minor()
+  || version_revision() || version_beta();
+],
+[
+  echo "*** The test program compiled, but did not run.  This usually means"
+  echo "*** that the run-time linker is not finding the PPL or finding the"
+  echo "*** wrong version of the PPL.  If it is not finding the PPL, you will"
+  echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
+  echo "*** /etc/ld.so.conf to point to the installed location.  Also, make"
+  echo "*** sure you have run ldconfig if that is required on your system."
+  echo "***"
+  echo "*** If you have an old version installed, it is best to remove it,"
+  echo "*** although you may also be able to get things to work by modifying"
+  echo "*** LD_LIBRARY_PATH."
+],
+[
+  echo "*** The test program failed to compile or link. See the file"
+  echo "*** config.log for the exact error that occured.  This usually means"
+  echo "*** the PPL was incorrectly installed or that someone moved the PPL"
+  echo "*** since it was installed.  In both cases you should reinstall"
+  echo "*** the library."
+])
+      CPPFLAGS="$ac_save_CPPFLAGS"
+      LDFLAGS="$ac_save_LDFLAGS"
+    fi
+  fi
+  PPL_CPPFLAGS=""
+  PPL_LDFLAGS=""
+  ifelse([$3], , :, [$3])
+fi
+AC_SUBST(PPL_CPPFLAGS)
+AC_SUBST(PPL_LDFLAGS)
+rm -f conf.ppltest
+])
diff --git a/m4/ppl_c.m4 b/m4/ppl_c.m4
new file mode 100644
index 0000000..8680612
--- /dev/null
+++ b/m4/ppl_c.m4
@@ -0,0 +1,286 @@
+dnl A function to test for the existence and usability of particular
+dnl versions of the C interface of the PPL, defining macros containing
+dnl the required paths.
+dnl Copyright (C) 1997 Owen Taylor
+dnl Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+dnl
+dnl This file is part of the Parma Polyhedra Library (PPL).
+dnl
+dnl The PPL is free software; you can redistribute it and/or modify it
+dnl under the terms of the GNU General Public License as published by the
+dnl Free Software Foundation; either version 3 of the License, or (at your
+dnl option) any later version.
+dnl
+dnl The PPL is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+dnl for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software Foundation,
+dnl Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+dnl
+dnl For the most up-to-date information see the Parma Polyhedra Library
+dnl site: http://bugseng.com/products/ppl/ .
+
+dnl AM_PATH_PPL_C([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for the C interface of the PPL, and define PPL_CPPFLAGS,
+dnl PPL_LDFLAGS, ... what else?
+
+AC_DEFUN([AM_PATH_PPL_C],
+[
+dnl Get the required information from the ppl-config program.
+AC_ARG_WITH(ppl-prefix,
+  AS_HELP_STRING([--with-ppl-prefix=PREFIX],
+    [prefix used to configure the PPL]),
+  ppl_prefix="$withval",
+  ppl_prefix="")
+AC_ARG_WITH(ppl-exec-prefix,
+  AS_HELP_STRING([--with-ppl-exec-prefix=PREFIX],
+    [exec-prefix used to configure the PPL]),
+  ppl_exec_prefix="$withval",
+  ppl_exec_prefix="")
+AC_ARG_ENABLE(ppl-test,
+  AS_HELP_STRING([--disable-ppltest],
+    [do not try to compile and run a test PPL program]),
+  ,
+  enable_ppltest=yes)
+
+if test "x$ppl_exec_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --exec-prefix=$ppl_exec_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_exec_prefix/bin/ppl-config"
+  fi
+fi
+if test "x$ppl_prefix" != x
+then
+  ppl_config_args="$ppl_config_args --prefix=$ppl_prefix"
+  if test "x${PPL_CONFIG+set}" != xset
+  then
+    PPL_CONFIG="$ppl_prefix/bin/ppl-config"
+  fi
+fi
+
+AC_PATH_PROG(PPL_CONFIG, ppl-config, no)
+min_ppl_version=ifelse([$1], ,0.0,$1)
+if test \( "x$min_ppl_version" = "x0.0" \) -o \( "x$min_ppl_version" = "x0.0.0" \)
+then
+  AC_MSG_CHECKING([for the Parma Polyhedra Library])
+else
+  AC_MSG_CHECKING([for the Parma Polyhedra Library, version >= $min_ppl_version])
+fi
+no_ppl=""
+if test $PPL_CONFIG = no
+then
+  no_ppl=yes
+else
+  PPL_CPPFLAGS=`$PPL_CONFIG $ppl_config_args --cppflags`
+  PPL_LDFLAGS=`$PPL_CONFIG $ppl_config_args --interface=C --ldflags`
+  ppl_config_version="`$PPL_CONFIG $ppl_config_args --version`"
+
+  if test "x$enable_ppltest" = xyes
+  then
+    ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_save_LDFLAGS="$LDFLAGS"
+    CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+    LDFLAGS="$PPL_LDFLAGS $LDFLAGS"
+
+dnl Now check if the installed (C interface of the) PPL is sufficiently new.
+dnl (Also sanity checks the results of ppl-config to some extent.)
+
+    AC_LANG_PUSH(C)
+
+    rm -f conf.ppltest
+    AC_TRY_RUN([
+#include <ppl_c.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BOOL int
+#define TRUE 1
+#define FALSE 0
+
+int
+main() {
+  const char* version_string = 0;
+
+  system("touch conf.ppltest");
+
+  unsigned min_ppl_major, min_ppl_minor, min_ppl_revision, min_ppl_beta;
+  int n = sscanf("$min_ppl_version",
+                 "%u.%u.%upre%u%*c",
+                 &min_ppl_major, &min_ppl_minor,
+                 &min_ppl_revision, &min_ppl_beta);
+  BOOL min_ppl_version_ok = TRUE;
+  if (n == 4) {
+    if (min_ppl_beta == 0)
+      min_ppl_version_ok = FALSE;
+  }
+  else if (n == 3) {
+    n = sscanf("$min_ppl_version",
+               "%u.%u.%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_revision);
+    if (n != 3)
+      min_ppl_version_ok = FALSE;
+    else
+      min_ppl_beta = 0;
+  }
+  else if (n == 2) {
+    n = sscanf("$min_ppl_version",
+               "%u.%upre%u%*c",
+               &min_ppl_major, &min_ppl_minor, &min_ppl_beta);
+    if (n == 3) {
+      if (min_ppl_beta == 0)
+        min_ppl_version_ok = FALSE;
+      else
+        min_ppl_revision = 0;
+    }
+    else if (n == 2) {
+      n = sscanf("$min_ppl_version",
+                 "%u.%u%*c",
+                 &min_ppl_major, &min_ppl_minor);
+      if (n != 2)
+        min_ppl_version_ok = FALSE;
+      else {
+        min_ppl_revision = 0;
+        min_ppl_beta = 0;
+      }
+    }
+    else
+      min_ppl_version_ok = FALSE;
+  }
+  else
+    min_ppl_version_ok = FALSE;
+
+  if (!min_ppl_version_ok) {
+    printf("illegal version string '$min_ppl_version'\n");
+    return 1;
+  }
+
+  ppl_version(&version_string);
+
+  if (strcmp("$ppl_config_version", version_string) != 0) {
+    printf("\n*** 'ppl-config --version' returned $ppl_config_version, "
+           "but PPL version %s", version_string);
+    printf("\n*** was found!  If ppl-config was correct, then it is best"
+           "\n*** to remove the old version of PPL."
+           "  You may also be able to fix the error"
+           "\n*** by modifying your LD_LIBRARY_PATH enviroment variable,"
+           " or by editing"
+           "\n*** /etc/ld.so.conf."
+           "  Make sure you have run ldconfig if that is"
+           "\n*** required on your system."
+           "\n*** If ppl-config was wrong, set the environment variable"
+           " PPL_CONFIG"
+           "\n*** to point to the correct copy of ppl-config,"
+           " and remove the file config.cache"
+           "\n*** before re-running configure.\n");
+    return 1;
+  }
+  else if (strcmp(PPL_VERSION, version_string) != 0) {
+    printf("\n*** PPL header file (version " PPL_VERSION ") does not match"
+           "\n*** library (version %s)\n", version_string);
+    return 1;
+  }
+  else if (PPL_VERSION_MAJOR < min_ppl_major
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR < min_ppl_minor)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION < min_ppl_revision)
+           || (PPL_VERSION_MAJOR == min_ppl_major
+              && PPL_VERSION_MINOR == min_ppl_minor
+              && PPL_VERSION_REVISION == min_ppl_revision
+              && PPL_VERSION_BETA < min_ppl_beta)) {
+      printf("\n*** An old version of PPL (" PPL_VERSION ") was found."
+             "\n*** You need at least PPL version $min_ppl_version."
+             "  The latest version of"
+             "\n*** PPL is always available from ftp://ftp.cs.unipr.it/ppl/ ."
+             "\n***"
+             "\n*** If you have already installed a sufficiently new version,"
+             " this error"
+             "\n*** probably means that the wrong copy of the ppl-config"
+             " program is"
+             "\n*** being found.  The easiest way to fix this is to remove"
+             " the old version"
+             "\n*** of PPL, but you can also set the PPL_CONFIG environment"
+             " variable to point"
+             "\n*** to the correct copy of ppl-config.  (In this case,"
+             " you will have to"
+             "\n*** modify your LD_LIBRARY_PATH enviroment"
+             " variable or edit /etc/ld.so.conf"
+             "\n*** so that the correct libraries are found at run-time.)\n");
+      return 1;
+  }
+  return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+
+    AC_LANG_POP
+
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LDFLAGS="$ac_save_LDFLAGS"
+  fi
+fi
+
+if test "x$no_ppl" = x
+then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], , :, [$2])
+else
+  AC_MSG_RESULT(no)
+  if test x"$PPL_CONFIG" = xno
+  then
+    echo "*** The ppl-config script installed by PPL could not be found."
+    echo "*** If the PPL was installed in PREFIX, make sure PREFIX/bin is in"
+    echo "*** your path, or set the PPL_CONFIG environment variable to the"
+    echo "*** full path to ppl-config."
+  else
+    if test -f conf.ppltest
+    then
+      :
+    else
+      echo "*** Could not run PPL test program, checking why..."
+      CPPFLAGS="$CPPFLAGS $PPL_CPPFLAGS"
+      LDFLAGS="$LDFLAGS $PPL_LDFLAGS"
+      AC_TRY_LINK([
+#include <ppl_c.h>
+],
+[
+  return ppl_version_major() || ppl_version_minor()
+  || ppl_version_revision() || ppl_version_beta();
+],
+[
+  echo "*** The test program compiled, but did not run.  This usually means"
+  echo "*** that the run-time linker is not finding the PPL or finding the"
+  echo "*** wrong version of the PPL.  If it is not finding the PPL, you will"
+  echo "*** need to set your LD_LIBRARY_PATH environment variable, or edit"
+  echo "*** /etc/ld.so.conf to point to the installed location.  Also, make"
+  echo "*** sure you have run ldconfig if that is required on your system."
+  echo "***"
+  echo "*** If you have an old version installed, it is best to remove it,"
+  echo "*** although you may also be able to get things to work by modifying"
+  echo "*** LD_LIBRARY_PATH."
+],
+[
+  echo "*** The test program failed to compile or link. See the file"
+  echo "*** config.log for the exact error that occured.  This usually means"
+  echo "*** the PPL was incorrectly installed or that someone moved the PPL"
+  echo "*** since it was installed.  In both cases you should reinstall"
+  echo "*** the library."
+])
+      CPPFLAGS="$ac_save_CPPFLAGS"
+      LDFLAGS="$ac_save_LDFLAGS"
+    fi
+  fi
+  PPL_CPPFLAGS=""
+  PPL_LDFLAGS=""
+  ifelse([$3], , :, [$3])
+fi
+AC_SUBST(PPL_CPPFLAGS)
+AC_SUBST(PPL_LDFLAGS)
+rm -f conf.ppltest
+])
diff --git a/missing b/missing
new file mode 100755
index 0000000..cdea514
--- /dev/null
+++ b/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2012-06-26.16; # UTC
+
+# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'automa4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..55d537f
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,162 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2009-04-28.21; # UTC
+
+# Original author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+nl='
+'
+IFS=" ""	$nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake at gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage"
+      exit $?
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --version)
+      echo "$0 $scriptversion"
+      exit $?
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error.  This is a problem when calling mkinstalldirs
+# from a parallel make.  We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+  '')
+    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    else
+      # On NextStep and OpenStep, the 'mkdir' command does not
+      # recognize any option.  It will interpret all options as
+      # directories to create, and then abort because '.' already
+      # exists.
+      test -d ./-p && rmdir ./-p
+      test -d ./--version && rmdir ./--version
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+       test ! -d ./--version; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    else
+      # Clean up after NextStep and OpenStep mkdir.
+      for d in ./-m ./-p ./--version "./$dirmode";
+      do
+        test -d $d && rmdir $d
+      done
+    fi
+    ;;
+esac
+
+for file
+do
+  case $file in
+    /*) pathcomp=/ ;;
+    *)  pathcomp= ;;
+  esac
+  oIFS=$IFS
+  IFS=/
+  set fnord $file
+  shift
+  IFS=$oIFS
+
+  for d
+  do
+    test "x$d" = x && continue
+
+    pathcomp=$pathcomp$d
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+	errstatus=$lasterr
+      else
+	if test ! -z "$dirmode"; then
+	  echo "chmod $dirmode $pathcomp"
+	  lasterr=
+	  chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+	  if test ! -z "$lasterr"; then
+	    errstatus=$lasterr
+	  fi
+	fi
+      fi
+    fi
+
+    pathcomp=$pathcomp/
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/ppl-config.h.in b/ppl-config.h.in
new file mode 100644
index 0000000..b8f71c0
--- /dev/null
+++ b/ppl-config.h.in
@@ -0,0 +1,411 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+   floating point format.  */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#undef PPL_HAVE_DECL_FFS
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#undef PPL_HAVE_DECL_FMA
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_FMAF
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_FMAL
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_GETRUSAGE
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_RINTF
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_RINTL
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_RLIMIT_AS
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_RLIMIT_DATA
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_RLIMIT_RSS
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_RLIMIT_VMEM
+
+/* Define to 1 if you have the declaration of `setitimer', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_SETITIMER
+
+/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_SETRLIMIT
+
+/* Define to 1 if you have the declaration of `sigaction', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_SIGACTION
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_STRTOD
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+   */
+#undef PPL_HAVE_DECL_STRTOF
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_STRTOLD
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_STRTOLL
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+   don't. */
+#undef PPL_HAVE_DECL_STRTOULL
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef PPL_HAVE_DLFCN_H
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#undef PPL_HAVE_FENV_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef PPL_HAVE_GETOPT_H
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+#undef PPL_HAVE_GLPK_GLPK_H
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#undef PPL_HAVE_GLPK_H
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+#undef PPL_HAVE_IEEEFP_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef PPL_HAVE_INTTYPES_H
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#undef PPL_HAVE_INT_FAST16_T
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#undef PPL_HAVE_INT_FAST32_T
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#undef PPL_HAVE_INT_FAST64_T
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef PPL_HAVE_MEMORY_H
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#undef PPL_HAVE_SIGINFO_T
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef PPL_HAVE_SIGNAL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef PPL_HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef PPL_HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef PPL_HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef PPL_HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef PPL_HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef PPL_HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef PPL_HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef PPL_HAVE_SYS_TYPES_H
+
+/* Define to 1 if the system has the type `timeval'. */
+#undef PPL_HAVE_TIMEVAL
+
+/* Define to 1 if typeof works with your compiler. */
+#undef PPL_HAVE_TYPEOF
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef PPL_HAVE_UINTPTR_T
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#undef PPL_HAVE_UINT_FAST16_T
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#undef PPL_HAVE_UINT_FAST32_T
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#undef PPL_HAVE_UINT_FAST64_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef PPL_HAVE_UNISTD_H
+
+/* Define to 1 if `_mp_alloc' is a member of `__mpz_struct'. */
+#undef PPL_HAVE___MPZ_STRUCT__MP_ALLOC
+
+/* Define to 1 if `_mp_d' is a member of `__mpz_struct'. */
+#undef PPL_HAVE___MPZ_STRUCT__MP_D
+
+/* Define to 1 if `_mp_size' is a member of `__mpz_struct'. */
+#undef PPL_HAVE___MPZ_STRUCT__MP_SIZE
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PPL_PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PPL_PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PPL_PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PPL_PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PPL_PACKAGE_VERSION
+
+/* ABI-breaking extra assertions are enabled when this is defined. */
+#undef PPL_ABI_BREAKING_EXTRA_DEBUG
+
+/* Not zero if the FPU can be controlled. */
+#undef PPL_CAN_CONTROL_FPU
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+   */
+#undef PPL_CHECKED_INTEGERS
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#undef PPL_COEFFICIENT_BITS
+
+/* The integral type used to represent coefficients. */
+#undef PPL_COEFFICIENT_TYPE
+
+/* This contains the options with which `configure' was invoked. */
+#undef PPL_CONFIGURE_OPTIONS
+
+/* The unique code of the binary format of C++ doubles, if supported;
+   undefined otherwise. */
+#undef PPL_CXX_DOUBLE_BINARY_FORMAT
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#undef PPL_CXX_FLOAT_BINARY_FORMAT
+
+/* The unique code of the binary format of C++ long doubles, if supported;
+   undefined otherwise. */
+#undef PPL_CXX_LONG_DOUBLE_BINARY_FORMAT
+
+/* Not zero if the the plain char type is signed. */
+#undef PPL_CXX_PLAIN_CHAR_IS_SIGNED
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+   range or precision than double. */
+#undef PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#undef PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+/* Not zero if the the IEEE inexact flag is supported in C++. */
+#undef PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+
+/* Not zero if it is possible to limit memory using setrlimit(). */
+#undef PPL_CXX_SUPPORTS_LIMITING_MEMORY
+
+/* Not zero if the C++ compiler supports zero_length arrays. */
+#undef PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+
+/* Defined if floating point arithmetic may use the 387 unit. */
+#undef PPL_FPMATH_MAY_USE_387
+
+/* Defined if floating point arithmetic may use the SSE instruction set. */
+#undef PPL_FPMATH_MAY_USE_SSE
+
+/* Defined if GLPK provides glp_term_hook(). */
+#undef PPL_GLPK_HAS_GLP_TERM_HOOK
+
+/* Defined if GLPK provides glp_term_out(). */
+#undef PPL_GLPK_HAS_GLP_TERM_OUT
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+#undef PPL_GLPK_HAS_LIB_SET_PRINT_HOOK
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+#undef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#undef PPL_GMP_INTEGERS
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#undef PPL_GMP_SUPPORTS_EXCEPTIONS
+
+/* Defined if the integral type to be used for coefficients is a native one.
+   */
+#undef PPL_NATIVE_INTEGERS
+
+/* Assertions are disabled when this is defined. */
+#undef PPL_NDEBUG
+
+/* Not zero if doubles are supported. */
+#undef PPL_SUPPORTED_DOUBLE
+
+/* Not zero if floats are supported. */
+#undef PPL_SUPPORTED_FLOAT
+
+/* Not zero if long doubles are supported. */
+#undef PPL_SUPPORTED_LONG_DOUBLE
+
+/* The size of `char', as computed by sizeof. */
+#undef PPL_SIZEOF_CHAR
+
+/* The size of `double', as computed by sizeof. */
+#undef PPL_SIZEOF_DOUBLE
+
+/* The size of `float', as computed by sizeof. */
+#undef PPL_SIZEOF_FLOAT
+
+/* The size of `fp', as computed by sizeof. */
+#undef PPL_SIZEOF_FP
+
+/* The size of `int', as computed by sizeof. */
+#undef PPL_SIZEOF_INT
+
+/* The size of `int*', as computed by sizeof. */
+#undef PPL_SIZEOF_INTP
+
+/* The size of `long', as computed by sizeof. */
+#undef PPL_SIZEOF_LONG
+
+/* The size of `long double', as computed by sizeof. */
+#undef PPL_SIZEOF_LONG_DOUBLE
+
+/* The size of `long long', as computed by sizeof. */
+#undef PPL_SIZEOF_LONG_LONG
+
+/* The size of `mp_limb_t', as computed by sizeof. */
+#undef PPL_SIZEOF_MP_LIMB_T
+
+/* The size of `short', as computed by sizeof. */
+#undef PPL_SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef PPL_SIZEOF_SIZE_T
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef PPL_STDC_HEADERS
+
+/* Define PPL_WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define PPL_WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef PPL_WORDS_BIGENDIAN
+#  undef PPL_WORDS_BIGENDIAN
+# endif
+#endif
+
+/* When defined and libstdc++ is used, it is used in debug mode. */
+#undef _GLIBCXX_DEBUG
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+#undef _GLIBCXX_DEBUG_PEDANTIC
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to __typeof__ if your compiler spells it that way. */
+#undef typeof
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+   pointer, if such a type exists, and if the system does not define it. */
+#undef uintptr_t
+
+
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+   we must make sure <stdint.h> is included before <sys/types.hh> is
+   (even indirectly) included.  Moreover we need to define
+   __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+   in order to have the macros defined also in C++.  */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+
diff --git a/ppl-config.sed b/ppl-config.sed
new file mode 100644
index 0000000..5d6d721
--- /dev/null
+++ b/ppl-config.sed
@@ -0,0 +1,71 @@
+s/\([^A-Z_]\)HAVE_DECL_FFS/\1PPL_HAVE_DECL_FFS/g
+s/\([^A-Z_]\)HAVE_DECL_FMA/\1PPL_HAVE_DECL_FMA/g
+s/\([^A-Z_]\)HAVE_DECL_FMAF/\1PPL_HAVE_DECL_FMAF/g
+s/\([^A-Z_]\)HAVE_DECL_FMAL/\1PPL_HAVE_DECL_FMAL/g
+s/\([^A-Z_]\)HAVE_DECL_GETENV/\1PPL_HAVE_DECL_GETENV/g
+s/\([^A-Z_]\)HAVE_DECL_GETRUSAGE/\1PPL_HAVE_DECL_GETRUSAGE/g
+s/\([^A-Z_]\)HAVE_DECL_RINTF/\1PPL_HAVE_DECL_RINTF/g
+s/\([^A-Z_]\)HAVE_DECL_RINTL/\1PPL_HAVE_DECL_RINTL/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_AS/\1PPL_HAVE_DECL_RLIMIT_AS/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_DATA/\1PPL_HAVE_DECL_RLIMIT_DATA/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_RSS/\1PPL_HAVE_DECL_RLIMIT_RSS/g
+s/\([^A-Z_]\)HAVE_DECL_RLIMIT_VMEM/\1PPL_HAVE_DECL_RLIMIT_VMEM/g
+s/\([^A-Z_]\)HAVE_DECL_SETITIMER/\1PPL_HAVE_DECL_SETITIMER/g
+s/\([^A-Z_]\)HAVE_DECL_SETRLIMIT/\1PPL_HAVE_DECL_SETRLIMIT/g
+s/\([^A-Z_]\)HAVE_DECL_SIGACTION/\1PPL_HAVE_DECL_SIGACTION/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOD/\1PPL_HAVE_DECL_STRTOD/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOF/\1PPL_HAVE_DECL_STRTOF/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOLD/\1PPL_HAVE_DECL_STRTOLD/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOLL/\1PPL_HAVE_DECL_STRTOLL/g
+s/\([^A-Z_]\)HAVE_DECL_STRTOULL/\1PPL_HAVE_DECL_STRTOULL/g
+s/\([^A-Z_]\)HAVE_DLFCN_H/\1PPL_HAVE_DLFCN_H/g
+s/\([^A-Z_]\)HAVE_FENV_H/\1PPL_HAVE_FENV_H/g
+s/\([^A-Z_]\)HAVE_GETOPT_H/\1PPL_HAVE_GETOPT_H/g
+s/\([^A-Z_]\)HAVE_GLPK_GLPK_H/\1PPL_HAVE_GLPK_GLPK_H/g
+s/\([^A-Z_]\)HAVE_GLPK_H/\1PPL_HAVE_GLPK_H/g
+s/\([^A-Z_]\)HAVE_IEEEFP_H/\1PPL_HAVE_IEEEFP_H/g
+s/\([^A-Z_]\)HAVE_INTTYPES_H/\1PPL_HAVE_INTTYPES_H/g
+s/\([^A-Z_]\)HAVE_INT_FAST16_T/\1PPL_HAVE_INT_FAST16_T/g
+s/\([^A-Z_]\)HAVE_INT_FAST32_T/\1PPL_HAVE_INT_FAST32_T/g
+s/\([^A-Z_]\)HAVE_INT_FAST64_T/\1PPL_HAVE_INT_FAST64_T/g
+s/\([^A-Z_]\)HAVE_MEMORY_H/\1PPL_HAVE_MEMORY_H/g
+s/\([^A-Z_]\)HAVE_SETITIMER/\1PPL_HAVE_SETITIMER/g
+s/\([^A-Z_]\)HAVE_SIGINFO_T/\1PPL_HAVE_SIGINFO_T/g
+s/\([^A-Z_]\)HAVE_SIGNAL_H/\1PPL_HAVE_SIGNAL_H/g
+s/\([^A-Z_]\)HAVE_STDINT_H/\1PPL_HAVE_STDINT_H/g
+s/\([^A-Z_]\)HAVE_STDLIB_H/\1PPL_HAVE_STDLIB_H/g
+s/\([^A-Z_]\)HAVE_STRINGS_H/\1PPL_HAVE_STRINGS_H/g
+s/\([^A-Z_]\)HAVE_STRING_H/\1PPL_HAVE_STRING_H/g
+s/\([^A-Z_]\)HAVE_SYS_RESOURCE_H/\1PPL_HAVE_SYS_RESOURCE_H/g
+s/\([^A-Z_]\)HAVE_SYS_STAT_H/\1PPL_HAVE_SYS_STAT_H/g
+s/\([^A-Z_]\)HAVE_SYS_TIME_H/\1PPL_HAVE_SYS_TIME_H/g
+s/\([^A-Z_]\)HAVE_SYS_TYPES_H/\1PPL_HAVE_SYS_TYPES_H/g
+s/\([^A-Z_]\)HAVE_TIMEVAL/\1PPL_HAVE_TIMEVAL/g
+s/\([^A-Z_]\)HAVE_TYPEOF/\1PPL_HAVE_TYPEOF/g
+s/\([^A-Z_]\)HAVE_UINT_FAST16_T/\1PPL_HAVE_UINT_FAST16_T/g
+s/\([^A-Z_]\)HAVE_UINT_FAST32_T/\1PPL_HAVE_UINT_FAST32_T/g
+s/\([^A-Z_]\)HAVE_UINT_FAST64_T/\1PPL_HAVE_UINT_FAST64_T/g
+s/\([^A-Z_]\)HAVE_UINTPTR_T/\1PPL_HAVE_UINTPTR_T/g
+s/\([^A-Z_]\)HAVE_UNISTD_H/\1PPL_HAVE_UNISTD_H/g
+s/\([^A-Z_]\)HAVE___MPZ_STRUCT__MP_ALLOC/\1PPL_HAVE___MPZ_STRUCT__MP_ALLOC/g
+s/\([^A-Z_]\)HAVE___MPZ_STRUCT__MP_D/\1PPL_HAVE___MPZ_STRUCT__MP_D/g
+s/\([^A-Z_]\)HAVE___MPZ_STRUCT__MP_SIZE/\1PPL_HAVE___MPZ_STRUCT__MP_SIZE/g
+s/\([^A-Z_]\)PACKAGE_BUGREPORT/\1PPL_PACKAGE_BUGREPORT/g
+s/\([^A-Z_]\)PACKAGE_NAME/\1PPL_PACKAGE_NAME/g
+s/\([^A-Z_]\)PACKAGE_STRING/\1PPL_PACKAGE_STRING/g
+s/\([^A-Z_]\)PACKAGE_TARNAME/\1PPL_PACKAGE_TARNAME/g
+s/\([^A-Z_]\)PACKAGE_VERSION/\1PPL_PACKAGE_VERSION/g
+s/\([^A-Z_]\)SIZEOF_CHAR/\1PPL_SIZEOF_CHAR/g
+s/\([^A-Z_]\)SIZEOF_DOUBLE/\1PPL_SIZEOF_DOUBLE/g
+s/\([^A-Z_]\)SIZEOF_FLOAT/\1PPL_SIZEOF_FLOAT/g
+s/\([^A-Z_]\)SIZEOF_FP/\1PPL_SIZEOF_FP/g
+s/\([^A-Z_]\)SIZEOF_INT/\1PPL_SIZEOF_INT/g
+s/\([^A-Z_]\)SIZEOF_INTP/\1PPL_SIZEOF_INTP/g
+s/\([^A-Z_]\)SIZEOF_LONG/\1PPL_SIZEOF_LONG/g
+s/\([^A-Z_]\)SIZEOF_LONG_DOUBLE/\1PPL_SIZEOF_LONG_DOUBLE/g
+s/\([^A-Z_]\)SIZEOF_LONG_LONG/\1PPL_SIZEOF_LONG_LONG/g
+s/\([^A-Z_]\)SIZEOF_MP_LIMB_T/\1PPL_SIZEOF_MP_LIMB_T/g
+s/\([^A-Z_]\)SIZEOF_SHORT/\1PPL_SIZEOF_SHORT/g
+s/\([^A-Z_]\)SIZEOF_SIZE_T/\1PPL_SIZEOF_SIZE_T/g
+s/\([^A-Z_]\)STDC_HEADERS/\1PPL_STDC_HEADERS/g
+s/\([^A-Z_]\)WORDS_BIGENDIAN/\1PPL_WORDS_BIGENDIAN/g
diff --git a/ppl.lsm.in b/ppl.lsm.in
new file mode 100644
index 0000000..0e01b58
--- /dev/null
+++ b/ppl.lsm.in
@@ -0,0 +1,45 @@
+Begin4
+Title:		ppl
+Version:	@VERSION@
+Entered-date:	@ISODATE@
+Description:	The Parma Polyhedra Library (PPL) is a C++ library
+		for the manipulation of numerical abstractions.
+Keywords:	C++ library convex polyhedra verification
+Author:		Roberto Bagnara (BUGSENG srl and University of Parma)
+		Patricia M. Hill (BUGSENG srl and University of Leeds)
+		Enea Zaffanella (BUGSENG srl and University of Parma)
+		Abramo Bagnara (BUGSENG srl)
+		Elisa Ricci (former student of the University of Parma)
+		Marco Poletti (student of the University of Bologna)
+		Alessandro Zaccagnini (University of Parma)
+		Roberto Amadini (former student of the University of Parma)
+		Irene Bacchi (former student of the University of Parma)
+		Fabio Biselli (student of the University of Parma)
+		Fabio Bossi (former student of the University of Parma)
+		Danilo Bonardi (former student of the University of Parma)
+		Sara Bonini (former student of the University of Parma)
+		Andrea Cimino (former student of the University of Parma)
+		Katy Dobson (former student of the University of Leeds)
+		Giordano Fracasso (former student of the University of Parma)
+		Francois Galea (University of Versailles)
+		Maximiliano Marchesi (former student of the University of Parma)
+		Elena Mazzi (former student of the University of Parma)
+		David Merchat (formerly at the University of Parma)
+		Matthew Mundell (formerly at the University of Leeds)
+		Andrea Pescetti (former student of the University of Parma)
+		Barbara Quartieri (former student of the University of Parma)
+		Enric Rodriguez Carbonell (Technical University of Catalonia)
+		Angela Stazzone (former student of the University of Parma)
+		Fabio Trabucchi (University of Parma)
+		Claudio Trento (former student of the University of Pisa)
+		Tatiana Zolo (former student of the University of Parma)
+Maintained-by:	ppl-devel at cs.unipr.it (PPL developers)
+Primary-site:	metlab.unc.edu /pub/linux/libs
+		16788k ppl- at VERSION@.tar.gz
+		800 ppl.lsm
+Alternate-site:	
+Original-site:	http://bugseng.com/products/ppl/
+Platforms:      Portable; tested on Linux, FreeBSD, OpenBSD, Solaris,
+                IRIX64, Mac OS X, Cygwin, DEC OSF/1.
+Copying-policy:	GPL
+End
diff --git a/src/BDS_Status_idefs.hh b/src/BDS_Status_idefs.hh
new file mode 100644
index 0000000..c2a609e
--- /dev/null
+++ b/src/BDS_Status_idefs.hh
@@ -0,0 +1,117 @@
+/* BD_Shape<T>::Status class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BDS_Status_idefs_hh
+#define PPL_BDS_Status_idefs_hh 1
+
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status_idefs.hh directly; use BD_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the BDS is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the BDS is the empty set;
+  - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences, so that all the constraints are
+    as tight as possible;
+  - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences and each constraint in such a system
+    is marked as being either redundant or non-redundant.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_shortest_path_closed() const;
+  void reset_shortest_path_closed();
+  void set_shortest_path_closed();
+
+  bool test_shortest_path_reduced() const;
+  void reset_shortest_path_reduced();
+  void set_shortest_path_reduced();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV         = 0U;
+  static const flags_t EMPTY                 = 1U << 0;
+  static const flags_t SHORTEST_PATH_CLOSED  = 1U << 1;
+  static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_BDS_Status_idefs_hh)
diff --git a/src/BDS_Status_inlines.hh b/src/BDS_Status_inlines.hh
new file mode 100644
index 0000000..8cf9130
--- /dev/null
+++ b/src/BDS_Status_inlines.hh
@@ -0,0 +1,268 @@
+/* BD_Shape<T>::Status class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BDS_Status_inlines_hh
+#define PPL_BDS_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+  return test_any(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+  // A system is reduced only if it is also closed.
+  reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_closed() {
+  set(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+  return test_any(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+  reset(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+  PPL_ASSERT(test_shortest_path_closed());
+  set(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Shortest-path reduction implies shortest-path closure.
+  if (test_shortest_path_reduced()) {
+    if (test_shortest_path_closed())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The shortest-path reduction flag should also imply "
+                << "the closure flag."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace BD_Shapes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace BD_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::BD_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << separator
+    << (test_empty() ? yes : no) << empty << separator
+    << separator
+    << (test_shortest_path_closed() ? yes : no) << sp_closed << separator
+    << (test_shortest_path_reduced() ? yes : no) << sp_reduced << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status)
+
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::BD_Shapes;
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, sp_closed, positive))
+    return false;
+  if (positive)
+    set_shortest_path_closed();
+  else
+    reset_shortest_path_closed();
+
+  if (!get_field(s, sp_reduced, positive))
+    return false;
+  if (positive)
+    set_shortest_path_reduced();
+  else
+    reset_shortest_path_reduced();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BDS_Status_inlines_hh)
diff --git a/src/BD_Shape.cc b/src/BD_Shape.cc
new file mode 100644
index 0000000..f772fcd
--- /dev/null
+++ b/src/BD_Shape.cc
@@ -0,0 +1,93 @@
+/* BD_Shape class implementation: non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "BD_Shape_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+PPL::BD_Shape_Helpers::extract_bounded_difference(const Constraint& c,
+                                                  dimension_type& c_num_vars,
+                                                  dimension_type& c_first_var,
+                                                  dimension_type& c_second_var,
+                                                  Coefficient& c_coeff) {
+  // Check for preconditions.
+  const dimension_type space_dim = c.space_dimension();
+  PPL_ASSERT(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+
+  c_first_var = c.expression().first_nonzero(1, space_dim + 1);
+  if (c_first_var == space_dim + 1)
+    // All the inhomogeneous coefficients are zero.
+    return true;
+
+  ++c_num_vars;
+
+  c_second_var = c.expression().first_nonzero(c_first_var + 1, space_dim + 1);
+  if (c_second_var == space_dim + 1) {
+    // c_first_var is the only inhomogeneous coefficient different from zero.
+    c_coeff = -c.expression().get(Variable(c_first_var - 1));
+
+    c_second_var = 0;
+    return true;
+  }
+
+  ++c_num_vars;
+
+  if (!c.expression().all_zeroes(c_second_var + 1, space_dim + 1))
+    // The constraint `c' is not a bounded difference.
+    return false;
+
+  // Make sure that `c' is indeed a bounded difference, i.e., it is of the
+  // form:
+  // a*x - a*y <=/= b.
+  Coefficient_traits::const_reference c0 = c.expression().get(Variable(c_first_var - 1));
+  Coefficient_traits::const_reference c1 = c.expression().get(Variable(c_second_var - 1));
+  if (sgn(c0) == sgn(c1) || c0 != -c1)
+    // Constraint `c' is not a bounded difference.
+    return false;
+
+  c_coeff = c1;
+  
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+PPL::compute_leader_indices(const std::vector<dimension_type>& predecessor,
+                            std::vector<dimension_type>& indices) {
+  // The vector `indices' contains one entry for each equivalence
+  // class, storing the index of the corresponding leader in
+  // increasing order: it is used to avoid repeated tests for leadership.
+  PPL_ASSERT(indices.size() == 0);
+  PPL_ASSERT(0 == predecessor[0]);
+  indices.push_back(0);
+  for (dimension_type i = 1, p_size = predecessor.size(); i != p_size; ++i)
+    if (i == predecessor[i])
+      indices.push_back(i);
+}
diff --git a/src/BD_Shape_defs.hh b/src/BD_Shape_defs.hh
new file mode 100644
index 0000000..0bfe836
--- /dev/null
+++ b/src/BD_Shape_defs.hh
@@ -0,0 +1,2371 @@
+/* BD_Shape class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BD_Shape_defs_hh
+#define PPL_BD_Shape_defs_hh 1
+
+#include "BD_Shape_types.hh"
+#include "globals_defs.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Poly_Con_Relation_types.hh"
+#include "Poly_Gen_Relation_types.hh"
+#include "Polyhedron_types.hh"
+#include "Box_types.hh"
+#include "Grid_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "DB_Matrix_defs.hh"
+#include "DB_Row_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "WRD_coefficient_types_defs.hh"
+#include "Bit_Matrix_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+  Writes a textual representation of \p bds on \p s:
+  <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+  <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+  a system of constraints defining \p bds is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates BD_Shape */
+template <typename T>
+void swap(BD_Shape<T>& x, BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*! \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same BDS.
+/*! \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class BD_Shape_Helpers {
+public:
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Decodes the constraint \p c as a bounded difference.
+  /*! \relates BD_Shape
+    \return
+    <CODE>true</CODE> if the constraint \p c is a
+    \ref Bounded_Difference_Shapes "bounded difference";
+    <CODE>false</CODE> otherwise.
+
+    \param c
+    The constraint to be decoded.
+
+    \param c_num_vars
+    If <CODE>true</CODE> is returned, then it will be set to the number
+    of variables having a non-zero coefficient. The only legal values
+    will therefore be 0, 1 and 2.
+
+    \param c_first_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the index of the first variable having
+    a non-zero coefficient in \p c.
+
+    \param c_second_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+    then it will be set to the index of the second variable having
+    a non-zero coefficient in \p c. If \p c_num_vars is set to 1, this must be
+    0.
+
+    \param c_coeff
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the value of the first non-zero coefficient
+    in \p c.
+  */
+  #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  static bool extract_bounded_difference(const Constraint& c,
+                                         dimension_type& c_num_vars,
+                                         dimension_type& c_first_var,
+                                         dimension_type& c_second_var,
+                                         Coefficient& c_coeff);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+/*! \relates BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+                            std::vector<dimension_type>& indices);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
+/*! \ingroup PPL_CXX_interface
+  The class template BD_Shape<T> allows for the efficient representation
+  of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+  called <EM>bounded difference shapes</EM> (BDSs, for short).
+  The name comes from the fact that the closed affine half-spaces that
+  characterize the polyhedron can be expressed by constraints of the form
+  \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+  term \f$k\f$ is a rational number.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  bounded differences. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for BDSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.
+
+  The domain of BD shapes <EM>optimally supports</EM>:
+    - tautological and inconsistent constraints and congruences;
+    - bounded difference constraints;
+    - non-proper congruences (i.e., equalities) that are expressible
+      as bounded-difference constraints.
+
+  Depending on the method, using a constraint or congruence that is not
+  optimally supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  A constraint is a bounded difference if it has the form
+    \f[
+      a_i x_i - a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above bounded difference Constraint object
+  will be mapped into a \e correct and \e optimal approximation that,
+  depending on the expressive power of the chosen template argument \p T,
+  may loose some precision. Also note that strict constraints are not
+  bounded differences.
+
+  For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x - y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x - y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, depending from the context, a Constraint object
+  encoding \f$3x - y \leq 1\f$ will be either upward approximated
+  (e.g., by safely ignoring it) or it will cause an exception.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    BD_Shape<T> bd(cs);
+  \endcode
+  Since only those constraints having the syntactic form of a
+  <EM>bounded difference</EM> are optimally supported, the following code
+  will throw an exception (caused by constraints 7, 8 and 9):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    cs.insert(x + y <= 0);      // 7
+    cs.insert(x - z + x >= 0);  // 8
+    cs.insert(3*z - y <= 1);    // 9
+    BD_Shape<T> bd(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining a BDS.
+  */
+#ifndef NDEBUG
+  typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+  typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+  //! The numeric base type upon which bounded differences are built.
+  typedef T coefficient_type_base;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining a BDS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that a BDS can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty BDS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the BDS;
+
+    \param kind
+    Specifies whether the universe or the empty BDS has to be built.
+  */
+  explicit BD_Shape(dimension_type num_dimensions = 0,
+                    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  BD_Shape(const BD_Shape& y,
+           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename U>
+  explicit BD_Shape(const BD_Shape<U>& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS from the system of constraints \p cs.
+  /*!
+    The BDS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of BD constraints.
+
+    \exception std::invalid_argument
+    Thrown if \p cs contains a constraint which is not optimally supported
+    by the BD shape domain.
+  */
+  explicit BD_Shape(const Constraint_System& cs);
+
+  //! Builds a BDS from a system of congruences.
+  /*!
+    The BDS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences.
+
+    \exception std::invalid_argument
+    Thrown if \p cgs contains congruences which are not optimally
+    supported by the BD shape domain.
+  */
+  explicit BD_Shape(const Congruence_System& cgs);
+
+  //! Builds a BDS from the system of generators \p gs.
+  /*!
+    Builds the smallest BDS containing the polyhedron defined by \p gs.
+    The BDS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit BD_Shape(const Generator_System& gs);
+
+  //! Builds a BDS from the polyhedron \p ph.
+  /*!
+    Builds a BDS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+    smallest one containing \p ph.
+  */
+  explicit BD_Shape(const Polyhedron& ph,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS out of a box.
+  /*!
+    The BDS inherits the space dimension of the box.
+    The built BDS is the most precise BDS that includes the box.
+
+    \param box
+    The box representing the BDS to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit BD_Shape(const Box<Interval>& box,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS out of a grid.
+  /*!
+    The BDS inherits the space dimension of the grid.
+    The built BDS is the most precise BDS that includes the grid.
+
+    \param grid
+    The grid used to build the BDS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit BD_Shape(const Grid& grid,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS from an octagonal shape.
+  /*!
+    The BDS inherits the space dimension of the octagonal shape.
+    The built BDS is the most precise BDS that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the BDS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit BD_Shape(const Octagonal_Shape<U>& os,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  BD_Shape& operator=(const BD_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void m_swap(BD_Shape& y);
+
+  //! Destructor.
+  ~BD_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the BD_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const BD_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const BD_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const BD_Shape& y) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+  bool is_universe() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded BDS.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the BD_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is not optimally supported by the BD shape domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p *this.
+
+    \param cg
+    The congruence to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    or \p cg is not optimally supported by the BD shape domain.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the BD shape domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this.
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the BD shape domain.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the BD shape domain.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this. Its elements may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the BD shape domain.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint. If it is not a bounded difference, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    bounded differences  of \p *this.
+
+    \param cg
+    The congruence. If it is not a bounded difference equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    bounded differences defining \p *this.
+
+    \param  cs
+    The constraint system to be used. Constraints that are not bounded
+    differences are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    bounded differences defining \p *this.
+
+    \param  cgs
+    The congruence system to be used. Congruences that are not bounded
+    difference equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Refines the system of BD_Shape constraints defining \p *this using
+    the constraint expressed by \p left \f$\leq\f$ \p right.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void refine_with_linear_form_inequality(
+                   const Linear_Form<Interval<T, Interval_Info> >& left,
+                   const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Refines the system of BD_Shape constraints defining \p *this using
+    the constraint expressed by \p left \f$\relsym\f$ \p right, where
+    \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param relsym
+    The relation symbol.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    \exception std::runtime_error
+    Thrown if \p relsym is not a valid relation symbol.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void generalized_refine_with_linear_form_inequality(
+                   const Linear_Form<Interval<T, Interval_Info> >& left,
+                   const Linear_Form<Interval<T, Interval_Info> >& right,
+                   Relation_Symbol relsym);
+
+  //! Applies to \p dest the interval constraints embedded in \p *this.
+  /*!
+    \param dest
+    The object to which the constraints will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest.
+
+    The template type parameter U must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the space dimension of the object.
+    \code
+      void set_empty()
+    \endcode
+    sets the object to an empty object.
+    \code
+      bool restrict_lower(dimension_type dim, const T& lb)
+    \endcode
+    restricts the object by applying the lower bound \p lb to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+    \code
+      bool restrict_upper(dimension_type dim, const T& ub)
+    \endcode
+    restricts the object by applying the upper bound \p ub to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+  */
+  template <typename U>
+  void export_interval_constraints(U& dest) const;
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const BD_Shape& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    If the \e integer upper bound of \p *this and \p y is exact,
+    it is assigned to \p *this and <CODE>true</CODE> is returned;
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    The integer upper bound of two rational BDS is the smallest rational
+    BDS containing all the integral points of the two arguments.
+    This method requires that the coefficient type parameter \c T is
+    an integral type.
+  */
+  bool integer_upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BD shape containing
+    the set difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*! \brief
+    Assigns to \p *this the \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point coefficients that
+    defines the affine expression. ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+    is not a dimension of \p *this.
+  */
+  template <typename Interval_Info>
+  void affine_form_image(Variable var,
+                        const Linear_Form<Interval<T, Interval_Info> >& lf);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const BD_Shape& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator referencing the first stop-point.
+
+    \param last
+    An iterator referencing one past the last stop-point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const BD_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A BDS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const BD_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const BD_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const BD_Shape& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old BDS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    BDS, which is defined by a system of bounded differences in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the BDS and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new BDS, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const BD_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //! Refines \p store with the constraints defining \p *this.
+  /*!
+    \param store
+    The interval floating point abstract store to refine.
+  */
+  template <typename Interval_Info>
+  void refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+                                         store) const;
+
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  friend bool operator==<T>(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! The matrix representing the system of bounded differences.
+  DB_Matrix<N> dbm;
+
+#define PPL_IN_BD_Shape_CLASS
+#include "BDS_Status_idefs.hh"
+#undef PPL_IN_BD_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! A matrix indicating which constraints are redundant.
+  Bit_Matrix redundancy_dbm;
+
+  //! Returns <CODE>true</CODE> if the BDS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the BDS is known to be empty.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+  */
+  bool marked_shortest_path_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path reduced.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
+  */
+  bool marked_shortest_path_reduced() const;
+
+  //! Turns \p *this into an empty BDS.
+  void set_empty();
+
+  //! Turns \p *this into an zero-dimensional universe BDS.
+  void set_zero_dim_univ();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_closed();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_reduced();
+
+  //! Marks \p *this as possibly not shortest-path closed.
+  void reset_shortest_path_closed();
+
+  //! Marks \p *this as possibly not shortest-path reduced.
+  void reset_shortest_path_reduced();
+
+  //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+  void shortest_path_closure_assign() const;
+
+  /*! \brief
+    Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+    records into <CODE>this->redundancy_dbm</CODE> which of the entries
+    in <CODE>this->dbm</CODE> are redundant.
+  */
+  void shortest_path_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+    is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+    correctly flags the redundant entries in <CODE>this->dbm</CODE>.
+  */
+  bool is_shortest_path_reduced() const;
+
+  /*! \brief
+    Incrementally computes shortest-path closure, assuming that only
+    constraints affecting variable \p var need to be considered.
+
+    \note
+    It is assumed that \c *this, which was shortest-path closed,
+    has only been modified by adding constraints affecting variable
+    \p var. If this assumption is not satisfied, i.e., if a non-redundant
+    constraint not affecting variable \p var has been added, the behavior
+    is undefined.
+  */
+  void incremental_shortest_path_closure_assign(Variable var) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact it is assigned
+    to \p *this and \c true is returned, otherwise \c false is returned.
+
+    Current implementation is based on a variant of Algorithm 4.1 in
+      A. Bemporad, K. Fukuda, and F. D. Torrisi
+      <em>Convexity Recognition of the Union of Polyhedra</em>
+      Technical Report AUT00-13, ETH Zurich, 2000
+    tailored to the special case of BD shapes.
+
+    \note
+    It is assumed that \p *this and \p y are dimension-compatible;
+    if the assumption does not hold, the behavior is undefined.
+  */
+  bool BFT00_upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact it is assigned
+    to \p *this and \c true is returned, otherwise \c false is returned.
+
+    Implementation for the rational (resp., integer) case is based on
+    Theorem 5.2 (resp. Theorem 5.3) of \ref BHZ09b "[BHZ09b]".
+    The Boolean template parameter \c integer_upper_bound allows for
+    choosing between the rational and integer upper bound algorithms.
+
+    \note
+    It is assumed that \p *this and \p y are dimension-compatible;
+    if the assumption does not hold, the behavior is undefined.
+
+    \note
+    The integer case is only enabled if T is an integer data type.
+  */
+  template <bool integer_upper_bound>
+  bool BHZ09_upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added. Non BD constraints are ignored.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be added.
+    Nontrivial proper congruences are ignored.
+    Non BD equalities are ignored.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j, const N& k);
+
+  //! Adds the constraint <CODE>dbm[i][j] \<= numer/denom</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j,
+                          Coefficient_traits::const_reference numer,
+                          Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    Adds to the BDS the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var, Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
+
+  //! Removes all the constraints on row/column \p v.
+  void forget_all_dbm_constraints(dimension_type v);
+  //! Removes all binary constraints on row/column \p v.
+  void forget_binary_dbm_constraints(dimension_type v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+    starting from \p ub_v which is an upper bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the upper bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero. In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+  */
+  void deduce_v_minus_u_bounds(dimension_type v,
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_denom,
+                               const N& ub_v);
+
+  /*! \brief
+    Auxiliary function for \ref affine_form_relation "affine form image" that
+    handle the general case: \f$l = c\f$
+  */
+  template <typename Interval_Info>
+  void inhomogeneous_affine_form_image(const dimension_type& var_id,
+                                       const Interval<T, Interval_Info>& b);
+
+  /*! \brief
+    Auxiliary function for \ref affine_form_relation "affine form
+    image" that handle the general case: \f$l = ax + c\f$
+  */
+  template <typename Interval_Info>
+  void one_variable_affine_form_image
+  (const dimension_type& var_id,
+   const Interval<T, Interval_Info>& b,
+   const Interval<T, Interval_Info>& w_coeff,
+   const dimension_type& w_id,
+   const dimension_type& space_dim);
+
+  /*! \brief
+    Auxiliary function for \ref affine_form_relation "affine form image" that
+    handle the general case: \f$l = ax + by + c\f$
+  */
+  template <typename Interval_Info>
+  void two_variables_affine_form_image
+  (const dimension_type& var_id,
+   const Linear_Form<Interval<T,Interval_Info> >& lf,
+   const dimension_type& space_dim);
+
+  /*! \brief
+    Auxiliary function for refine with linear form that handle
+    the general case: \f$l = ax + c\f$
+  */
+  template <typename Interval_Info>
+  void left_inhomogeneous_refine
+  (const dimension_type& right_t,
+   const dimension_type& right_w_id,
+   const Linear_Form<Interval<T, Interval_Info> >& left,
+   const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Auxiliary function for refine with linear form that handle
+    the general case: \f$ax + b = cy + d\f$
+  */
+  template <typename Interval_Info>
+  void left_one_var_refine
+  (const dimension_type& left_w_id,
+   const dimension_type& right_t,
+   const dimension_type& right_w_id,
+   const Linear_Form<Interval<T, Interval_Info> >& left,
+   const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Auxiliary function for refine with linear form that handle
+    the general case.
+  */
+  template <typename Interval_Info>
+  void general_refine(const dimension_type& left_w_id,
+                      const dimension_type& right_w_id,
+                      const Linear_Form<Interval<T, Interval_Info> >& left,
+                      const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  template <typename Interval_Info>
+  void linear_form_upper_bound(const Linear_Form<Interval<T, Interval_Info> >&
+                               lf,
+                               N& result) const;
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+    starting from \p minus_lb_v which is a lower bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the lower bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+  */
+  void deduce_u_minus_v_bounds(dimension_type v,
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_denom,
+                               const N& minus_lb_v);
+
+  /*! \brief
+    Adds to \p limiting_shape the bounded differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_shape(const Constraint_System& cs,
+                          BD_Shape& limiting_shape) const;
+
+  //! Compute the (zero-equivalence classes) predecessor relation.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+  void drop_some_non_integer_points_helper(N& elem);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const BD_Shape<T>& c);
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const BD_Shape& y) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+
+  template<typename Interval_Info>
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* lf_name,
+                               const Linear_Form<Interval<T, Interval_Info> >&
+                               lf) const;
+
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& le);
+
+  static void throw_invalid_argument(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+#include "BDS_Status_inlines.hh"
+#include "BD_Shape_inlines.hh"
+#include "BD_Shape_templates.hh"
+
+#endif // !defined(PPL_BD_Shape_defs_hh)
diff --git a/src/BD_Shape_inlines.hh b/src/BD_Shape_inlines.hh
new file mode 100644
index 0000000..d3b7022
--- /dev/null
+++ b/src/BD_Shape_inlines.hh
@@ -0,0 +1,910 @@
+/* BD_Shape class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BD_Shape_inlines_hh
+#define PPL_BD_Shape_inlines_hh 1
+
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Octagonal_Shape_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Temp_defs.hh"
+#include "meta_programming.hh"
+#include "wrap_assign.hh"
+#include "assert.hh"
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(DB_Matrix<N>::max_num_rows() - 1,
+                  DB_Matrix<N>::max_num_columns() - 1);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+  return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+  return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+  status.set_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_closed() {
+  status.set_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_reduced() {
+  status.set_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_closed() {
+  status.reset_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_reduced() {
+  status.reset_shortest_path_reduced();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+                      const Degenerate_Element kind)
+  : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+  if (kind == EMPTY)
+    set_empty();
+  else {
+    if (num_dimensions > 0)
+      // A (non zero-dim) universe BDS is closed.
+      set_shortest_path_closed();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y, Complexity_Class)
+  : dbm(y.dbm), status(y.status), redundancy_dbm() {
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y, Complexity_Class)
+  // For maximum precision, enforce shortest-path closure
+  // before copying the DB matrix.
+  : dbm((y.shortest_path_closure_assign(), y.dbm)),
+    status(),
+    redundancy_dbm() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline Congruence_System
+BD_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    add_constraint(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    add_congruence(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  if (!marked_empty())
+    refine_no_check(c);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_constraints(cs)",
+                           "cs and *this are space-dimension incompatible");
+
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  if (!marked_empty())
+    refine_no_check(cg);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_congruences(cgs)",
+                           "cgs and *this are space-dimension incompatible");
+
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  if (cg.is_proper_congruence()) {
+    if (cg.is_inconsistent())
+      set_empty();
+    // Other proper congruences are just ignored.
+    return;
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+  : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(cs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+BD_Shape<T>::BD_Shape(const Box<Interval>& box,
+                      Complexity_Class)
+  : dbm(box.space_dimension() + 1), status(), redundancy_dbm() {
+  // Check emptiness for maximum precision.
+  if (box.is_empty())
+    set_empty();
+  else if (box.space_dimension() > 0) {
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+    refine_with_constraints(box.constraints());
+  }
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Grid& grid,
+                      Complexity_Class)
+  : dbm(grid.space_dimension() + 1), status(), redundancy_dbm() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  // Taking minimized congruences ensures maximum precision.
+  refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const Octagonal_Shape<U>& os,
+                      Complexity_Class)
+  : dbm(os.space_dimension() + 1), status(), redundancy_dbm() {
+  // Check for emptiness for maximum precision.
+  if (os.is_empty())
+    set_empty();
+  else if (os.space_dimension() > 0) {
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+    refine_with_constraints(os.constraints());
+    // After refining, shortest-path closure is possibly lost
+    // (even when `os' was strongly closed: recall that U
+    // is possibly different from T).
+  }
+}
+
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+  dbm = y.dbm;
+  status = y.status;
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+  return *this;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::m_swap(BD_Shape& y) {
+  using std::swap;
+  swap(dbm, y.dbm);
+  swap(status, y.status);
+  swap(redundancy_dbm, y.redundancy_dbm);
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+  return dbm.num_rows() - 1;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+  shortest_path_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+                      Coefficient& sup_n, Coefficient& sup_d,
+                      bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+                      Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                      Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+                      Coefficient& inf_n, Coefficient& inf_d,
+                      bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+                      Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                      Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_topologically_closed() const {
+  return true;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
+
+  // The exact equivalence test requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal
+  // if and only if the other BDS is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Check for syntactic equivalence of the two (shortest-path closed)
+  // systems of bounded differences.
+  return x.dbm == y.dbm;
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  return !(x == y);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const BD_Shape<T>& x,
+                            const BD_Shape<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const BD_Shape<T>& x,
+                            const BD_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const BD_Shape<T>& x,
+                            const BD_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const BD_Shape<T>& x,
+                          const BD_Shape<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const BD_Shape<T>& x,
+                          const BD_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const BD_Shape<T>& x,
+                          const BD_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const BD_Shape<T>& x,
+                           const BD_Shape<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const BD_Shape<T>& x,
+                           const BD_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const BD_Shape<T>& x,
+                           const BD_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+                                const dimension_type j,
+                                const N& k) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+  N& dbm_ij = dbm[i][j];
+  if (dbm_ij > k) {
+    dbm_ij = k;
+    if (marked_shortest_path_closed())
+      reset_shortest_path_closed();
+  }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+                                const dimension_type j,
+                                Coefficient_traits::const_reference numer,
+                                Coefficient_traits::const_reference denom) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+  PPL_ASSERT(denom != 0);
+  PPL_DIRTY_TEMP(N, k);
+  div_round_up(k, numer, denom);
+  add_dbm_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // Compute time-elapse on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.time_elapse_assign(ph_y);
+  BD_Shape<T> x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+#if 0
+  return BFT00_upper_bound_assign_if_exact(y);
+#else
+  const bool integer_upper_bound = false;
+  return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+#endif
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::integer_upper_bound_assign_if_exact(const BD_Shape& y) {
+  PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+                         "BD_Shape<T>::integer_upper_bound_assign_if_exact(y):"
+                         " T in not an integer datatype.");
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+  const bool integer_upper_bound = true;
+  return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  const dimension_type space_dim = space_dimension();
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+                                 new_dimension);
+
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space BDS.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Shortest-path closure is necessary as in remove_space_dimensions().
+  shortest_path_closure_assign();
+  dbm.resize_no_copy(new_dimension + 1);
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether or not reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // If we removed _all_ dimensions from a non-empty BDS,
+  // the zero-dim universe BDS has been obtained.
+  if (new_dimension == 0 && !marked_empty())
+    set_zero_dim_univ();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::wrap_assign(const Variables_Set& vars,
+                         Bounded_Integer_Type_Width w,
+                         Bounded_Integer_Type_Representation r,
+                         Bounded_Integer_Type_Overflow o,
+                         const Constraint_System* cs_p,
+                         unsigned complexity_threshold,
+                         bool wrap_individually) {
+  Implementation::wrap_assign(*this,
+                              vars, w, r, o, cs_p,
+                              complexity_threshold, wrap_individually,
+                              "BD_Shape");
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+                            stop_points,
+                            stop_points
+                            + sizeof(stop_points)/sizeof(stop_points[0]),
+                            tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+  // Compute the H79 widening on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.H79_widening_assign(ph_y, tp);
+  BD_Shape x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::widening_assign(const BD_Shape& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+                                              const Constraint_System& cs,
+                                              unsigned* tp) {
+  // Compute the limited H79 extrapolation on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.limited_H79_extrapolation_assign(ph_y, cs, tp);
+  BD_Shape x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline memory_size_type
+BD_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+BD_Shape<T>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>::generalized_refine_with_linear_form_inequality(
+             const Linear_Form<Interval<T, Interval_Info> >& left,
+             const Linear_Form<Interval<T, Interval_Info> >& right,
+             const Relation_Symbol relsym) {
+  switch (relsym) {
+  case EQUAL:
+    // TODO: see if we can handle this case more efficiently.
+    refine_with_linear_form_inequality(left, right);
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case LESS_THAN:
+  case LESS_OR_EQUAL:
+    refine_with_linear_form_inequality(left, right);
+    break;
+  case GREATER_THAN:
+  case GREATER_OR_EQUAL:
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case NOT_EQUAL:
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>
+::refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+                                    store) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "BD_Shape<T>::refine_fp_interval_abstract_store:"
+                     " T not a floating point type.");
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  store.intersection_assign(Box<FP_Interval_Type>(*this));
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+  if (!is_integer(elem)) {
+    Result r = floor_assign_r(elem, elem, ROUND_DOWN);
+    PPL_USED(r);
+    PPL_ASSERT(r == V_EQ);
+    reset_shortest_path_closed();
+  }
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline void
+swap(BD_Shape<T>& x, BD_Shape<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_inlines_hh)
diff --git a/src/BD_Shape_templates.hh b/src/BD_Shape_templates.hh
new file mode 100644
index 0000000..3a175c2
--- /dev/null
+++ b/src/BD_Shape_templates.hh
@@ -0,0 +1,6789 @@
+/* BD_Shape class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BD_Shape_templates_hh
+#define PPL_BD_Shape_templates_hh 1
+
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Congruence_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "MIP_Problem_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Bit_Row_defs.hh"
+#include "Temp_defs.hh"
+#include "assert.hh"
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Congruence_System& cgs)
+  : dbm(cgs.space_dimension() + 1),
+    status(),
+    redundancy_dbm() {
+  add_congruences(cgs);
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+  : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty BD shape.
+    set_empty();
+    return;
+  }
+
+  const dimension_type space_dim = space_dimension();
+  DB_Row<N>& dbm_0 = dbm[0];
+  PPL_DIRTY_TEMP(N, tmp);
+
+  bool dbm_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!dbm_initialized) {
+        // When handling the first (closure) point, we initialize the DBM.
+        dbm_initialized = true;
+        const Coefficient& d = g.divisor();
+        // TODO: Check if the following loop can be optimized used
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.expression().get(Variable(i - 1));
+          DB_Row<N>& dbm_i = dbm[i];
+          for (dimension_type j = space_dim; j > 0; --j)
+            if (i != j) {
+              const Coefficient& g_j = g.expression().get(Variable(j - 1));
+              div_round_up(dbm_i[j], g_j - g_i, d);
+            }
+          div_round_up(dbm_i[0], -g_i, d);
+        }
+        for (dimension_type j = space_dim; j > 0; --j) {
+          const Coefficient& g_j = g.expression().get(Variable(j - 1));
+          div_round_up(dbm_0[j], g_j, d);
+        }
+        // Note: no need to initialize the first element of the main diagonal.
+      }
+      else {
+        // This is not the first point: the DBM already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        // TODO: Check if the following loop can be optimized used
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.expression().get(Variable(i - 1));
+          DB_Row<N>& dbm_i = dbm[i];
+          // The loop correctly handles the case when i == j.
+          for (dimension_type j = space_dim; j > 0; --j) {
+            const Coefficient& g_j = g.expression().get(Variable(j - 1));
+            div_round_up(tmp, g_j - g_i, d);
+            max_assign(dbm_i[j], tmp);
+          }
+          div_round_up(tmp, -g_i, d);
+          max_assign(dbm_i[0], tmp);
+        }
+        for (dimension_type j = space_dim; j > 0; --j) {
+          const Coefficient& g_j = g.expression().get(Variable(j - 1));
+          div_round_up(tmp, g_j, d);
+          max_assign(dbm_0[j], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw_invalid_argument("BD_Shape(gs)",
+                           "the non-empty generator system gs "
+                           "contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      // TODO: Check if the following loop can be optimized used
+      // Generator::expr_type::const_iterator.
+      for (dimension_type i = space_dim; i > 0; --i) {
+        const Coefficient& g_i = g.expression().get(Variable(i - 1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i != g.expression().get(Variable(j - 1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i != 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+            i_end = g.expression().end(); i != i_end; ++i)
+        assign_r(dbm_0[i.variable().space_dimension()],
+                 PLUS_INFINITY, ROUND_NOT_NEEDED);
+      break;
+    case Generator::RAY:
+      // TODO: Check if the following loop can be optimized used
+      // Generator::expr_type::const_iterator.
+      for (dimension_type i = space_dim; i > 0; --i) {
+        const Coefficient& g_i = g.expression().get(Variable(i - 1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i < g.expression().get(Variable(j - 1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i < 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+            i_end = g.expression().end(); i != i_end; ++i)
+        if (*i > 0)
+          assign_r(dbm_0[i.variable().space_dimension()],
+                   PLUS_INFINITY, ROUND_NOT_NEEDED);
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+  : dbm(), status(), redundancy_dbm() {
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = BD_Shape<T>(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = BD_Shape<T>(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  PPL_ASSERT(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our BDSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality()) {
+          Linear_Expression expr(c.expression());
+          lp.add_constraint(expr >= 0);
+        }
+        else
+          lp.add_constraint(c);
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Start with a universe BDS that will be refined by the simplex.
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    PPL_DIRTY_TEMP_COEFFICIENT(numer);
+    PPL_DIRTY_TEMP_COEFFICIENT(denom);
+    for (dimension_type i = 1; i <= num_dimensions; ++i) {
+      Variable x(i-1);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        div_round_up(dbm[0][i], numer, denom);
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 1; j <= num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j-1);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(dbm[j][i], numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        div_round_up(dbm[i][0], numer, denom);
+      }
+    }
+    set_shortest_path_closed();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+  *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+  refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+dimension_type
+BD_Shape<T>::affine_dimension() const {
+  const dimension_type space_dim = space_dimension();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (space_dim == 0)
+    return 0;
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `predecessor' is used to represent equivalence classes:
+  // `predecessor[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class).
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+
+  // Due to the fictitious variable `0', the affine dimension is one
+  // less the number of equivalence classes.
+  dimension_type affine_dim = 0;
+  // Note: disregard the first equivalence class.
+  for (dimension_type i = 1; i <= space_dim; ++i)
+    if (predecessor[i] == i)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+BD_Shape<T>::minimized_congruences() const {
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+    return cgs;
+  }
+
+  if (marked_empty()) {
+    cgs.insert(Congruence::zero_dim_false());
+    return cgs;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+  // Compute leader information.
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  // Go through the non-leaders to generate equality constraints.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    const dimension_type leader = leaders[i];
+    if (i != leader) {
+      // Generate the constraint relating `i' and its leader.
+      if (leader == 0) {
+        // A unary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+        numer_denom(dbm_0[i], numer, denom);
+        cgs.insert(denom*Variable(i-1) == numer);
+      }
+      else {
+        // A binary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+        numer_denom(dbm[i][leader], numer, denom);
+        cgs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+      }
+    }
+  }
+  return cgs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+  // Dimension-compatibility check.
+  if (c.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  // Get rid of strict inequalities.
+  if (c.is_strict_inequality()) {
+    if (c.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    if (c.is_tautological())
+      return;
+    // Nontrivial strict inequalities are not allowed.
+    throw_invalid_argument("add_constraint(c)",
+                           "strict inequalities are not allowed");
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Constraints that are not bounded differences are not allowed.
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+    throw_invalid_argument("add_constraint(c)",
+                           "c is not a bounded difference constraint");
+
+  const Coefficient& inhomo = c.inhomogeneous_term();
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint (not a strict inequality).
+    if (inhomo < 0
+        || (inhomo != 0 && c.is_equality()))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  if (negative)
+    neg_assign(coeff);
+
+  bool changed = false;
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  // Compute the bound for `x', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, inhomo, coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    N& y = negative ? dbm[j][i] : dbm[i][j];
+    // Also compute the bound for `y', rounding towards plus infinity.
+    PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+    neg_assign(minus_c_term, inhomo);
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dimension() < cg_space_dim)
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  // Handle the case of proper congruences first.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_tautological())
+      return;
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    // Non-trivial and proper congruences are not allowed.
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is a non-trivial, proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  add_constraint(c);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+    return;
+
+  const Coefficient& inhomo = c.inhomogeneous_term();
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint (might be a strict inequality).
+    if (inhomo < 0
+        || (c.is_equality() && inhomo != 0)
+        || (c.is_strict_inequality() && inhomo == 0))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, inhomo, coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+    neg_assign(minus_c_term, inhomo);
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
+
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is an empty 0-dim space bounded difference shape,
+  // let `*this' become empty.
+  if (y_space_dim == 0 && y.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x_space_dim == 0 && marked_empty()) {
+    dbm.grow(y_space_dim + 1);
+    PPL_ASSERT(OK());
+    return;
+  }
+  // First we increase the space dimension of `x' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `y' in the lower right-hand side,
+  // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+  // placed in the right position on the new matrix.
+  add_space_dimensions_and_embed(y_space_dim);
+  const dimension_type new_space_dim = x_space_dim + y_space_dim;
+  for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+    DB_Row<N>& dbm_i = dbm[i];
+    dbm_i[0] = y.dbm[i - x_space_dim][0];
+    dbm[0][i] = y.dbm[0][i - x_space_dim];
+    for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+      dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+  }
+
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("contains(y)", y);
+
+  if (x_space_dim == 0) {
+    // The zero-dimensional empty shape only contains another
+    // zero-dimensional empty shape.
+    // The zero-dimensional universe shape contains any other
+    // zero-dimensional shape.
+    return marked_empty() ? y.marked_empty() : true;
+  }
+
+  /*
+    The `y' bounded difference shape must be closed.  As an example,
+    consider the case where in `*this' we have the constraints
+
+    x1 - x2 <= 1,
+    x1      <= 3,
+    x2      <= 2,
+
+    and in `y' the constraints are
+
+    x1 - x2 <= 0,
+    x2      <= 1.
+
+    Without closure the (erroneous) analysis of the inhomogeneous terms
+    would conclude containment does not hold.  Closing `y' results into
+    the "discovery" of the implicit constraint
+
+    x1      <= 1,
+
+    at which point the inhomogeneous terms can be examined to determine
+    that containment does hold.
+  */
+  y.shortest_path_closure_assign();
+  // An empty shape is contained in any other dimension-compatible shapes.
+  if (y.marked_empty())
+    return true;
+
+  // If `x' is empty it can not contain `y' (which is not empty).
+  if (x.is_empty())
+    return false;
+
+  // `*this' contains `y' if and only if every cell of `dbm'
+  // is greater than or equal to the correspondent one of `y.dbm'.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; )
+      if (x_dbm_i[j] < y_dbm_i[j])
+        return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_disjoint_from(const BD_Shape& y) const {
+  const dimension_type space_dim = space_dimension();
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If one of the two bounded difference shape is empty,
+  // then the two bounded difference shape are disjoint.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return true;
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return true;
+
+  // Two BDSs are disjoint when their intersection is empty.
+  // That is if and only if there exists at least a bounded difference
+  // such that the upper bound of the bounded difference in the first
+  // BD_Shape is strictly less than the lower bound of
+  // the corresponding bounded difference in the second BD_Shape
+  // or vice versa.
+  // For example: let be
+  // in `*this':    -a_j_i <= v_j - v_i <= a_i_j;
+  // and in `y':    -b_j_i <= v_j - v_i <= b_i_j;
+  // `*this' and `y' are disjoint if
+  // 1.) a_i_j < -b_j_i or
+  // 2.) b_i_j < -a_j_i.
+  PPL_DIRTY_TEMP(N, tmp);
+  for (dimension_type i = space_dim+1; i-- > 0; ) {
+    const DB_Row<N>& x_i = dbm[i];
+    for (dimension_type j = space_dim+1; j-- > 0; ) {
+      neg_assign_r(tmp, y.dbm[j][i], ROUND_UP);
+      if (x_i[j] < tmp)
+        return true;
+    }
+  }
+
+  return false;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  // If the BDS is non-empty and zero-dimensional,
+  // then it is necessarily the universe BDS.
+  if (space_dim == 0)
+    return true;
+
+  // A bounded difference shape defining the universe BDS can only
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (!is_plus_infinity(dbm_i[j]))
+        return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_bounded() const {
+  shortest_path_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  // A zero-dimensional or empty BDS is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  // A bounded difference shape defining the bounded BDS never can
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (i != j)
+        if (is_plus_infinity(dbm_i[j]))
+          return false;
+  }
+
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains_integer_point() const {
+  // Force shortest-path closure.
+  if (is_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
+
+  // A non-empty BD_Shape defined by integer constraints
+  // necessarily contains an integer point.
+  if (std::numeric_limits<T>::is_integer)
+    return true;
+
+  // Build an integer BD_Shape z with bounds at least as tight as
+  // those in *this and then recheck for emptiness.
+  BD_Shape<mpz_class> bds_z(space_dim);
+  typedef BD_Shape<mpz_class>::N Z;
+  bds_z.reset_shortest_path_closed();
+  PPL_DIRTY_TEMP(N, tmp);
+  bool all_integers = true;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<Z>& z_i = bds_z.dbm[i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      const N& dbm_i_j = dbm_i[j];
+      if (is_plus_infinity(dbm_i_j))
+        continue;
+      if (is_integer(dbm_i_j))
+        assign_r(z_i[j], dbm_i_j, ROUND_NOT_NEEDED);
+      else {
+        all_integers = false;
+        Z& z_i_j = z_i[j];
+        // Copy dbm_i_j into z_i_j, but rounding downwards.
+        neg_assign_r(tmp, dbm_i_j, ROUND_NOT_NEEDED);
+        assign_r(z_i_j, tmp, ROUND_UP);
+        neg_assign_r(z_i_j, z_i_j, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  return all_integers || !bds_z.is_empty();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::frequency(const Linear_Expression& expr,
+                       Coefficient& freq_n, Coefficient& freq_d,
+                       Coefficient& val_n, Coefficient& val_d) const {
+  dimension_type space_dim = space_dimension();
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Check if `expr' has a constant value.
+  // If it is constant, set the frequency `freq_n' to 0
+  // and return true. Otherwise the values for \p expr
+  // are not discrete so return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 0 and the value is the inhomogeneous term.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BD shape, we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The BD shape has at least 1 dimension and is not empty.
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP(N, tmp);
+  Linear_Expression le = expr;
+  // Boolean to keep track of a variable `v' in expression `le'.
+  // If we can replace `v' by an expression using variables other
+  // than `v' and are already in `le', then this is set to true.
+
+  PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+  val_denom = 1;
+
+  // TODO: This loop can be optimized more, if needed, exploiting the
+  // (possible) sparseness of le.
+  for (dimension_type i = dbm.num_rows(); i-- > 1; ) {
+    const Variable v(i-1);
+    coeff = le.coefficient(v);
+    if (coeff == 0)
+      continue;
+
+    const DB_Row<N>& dbm_i = dbm[i];
+    // Check if `v' is constant in the BD shape.
+    assign_r(tmp, dbm_i[0], ROUND_NOT_NEEDED);
+    if (is_additive_inverse(dbm[0][i], tmp)) {
+      // If `v' is constant, replace it in `le' by the value.
+      numer_denom(tmp, numer, denom);
+      sub_mul_assign(le, coeff, v);
+      le *= denom;
+      le -= numer*coeff;
+      val_denom *= denom;
+      continue;
+    }
+    // Check the bounded differences with the other dimensions that
+    // have non-zero coefficient in `le'.
+    else {
+      bool constant_v = false;
+      for (Linear_Expression::const_iterator j = le.begin(),
+            j_end = le.lower_bound(Variable(i - 1)); j != j_end; ++j) {
+        const Variable vj = j.variable();
+        const dimension_type j_dim = vj.space_dimension();
+        assign_r(tmp, dbm_i[j_dim], ROUND_NOT_NEEDED);
+        if (is_additive_inverse(dbm[j_dim][i], tmp)) {
+          // The coefficient for `vj' in `le' is not 0
+          // and the difference with `v' in the BD shape is constant.
+          // So apply this equality to eliminate `v' in `le'.
+          numer_denom(tmp, numer, denom);
+          // Modifying le invalidates the iterators, but it's not a problem
+          // since we are going to exit the loop.
+          sub_mul_assign(le, coeff, v);
+          add_mul_assign(le, coeff, vj);
+          le *= denom;
+          le -= numer*coeff;
+          val_denom *= denom;
+          constant_v = true;
+          break;
+        }
+      }
+      if (!constant_v)
+        // The expression `expr' is not constant.
+        return false;
+    }
+  }
+
+  // The expression `expr' is constant.
+  freq_n = 0;
+  freq_d = 1;
+
+  // Reduce `val_n' and `val_d'.
+  normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the BD shape.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  shortest_path_closure_assign();
+  // A BD shape known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
+
+  // Check whether `var' is syntactically constrained.
+  const DB_Row<N>& dbm_v = dbm[var_space_dim];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    if (!is_plus_infinity(dbm_v[i])
+        || !is_plus_infinity(dbm[i][var_space_dim]))
+      return true;
+  }
+
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+  PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+  PPL_ASSERT(predecessor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `predecessor' is used to indicate which variable
+  // immediately precedes a given one in the corresponding equivalence class.
+  // The `leader' of an equivalence class is the element having minimum
+  // index: leaders are their own predecessors.
+  const dimension_type predecessor_size = dbm.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  predecessor.reserve(predecessor_size);
+  for (dimension_type i = 0; i < predecessor_size; ++i)
+    predecessor.push_back(i);
+  // Now compute actual predecessors.
+  for (dimension_type i = predecessor_size; i-- > 1; )
+    if (i == predecessor[i]) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i; j-- > 0; )
+        if (j == predecessor[j]
+            && is_additive_inverse(dbm[j][i], dbm_i[j])) {
+          // Choose as predecessor the variable having the smaller index.
+          predecessor[i] = j;
+          break;
+        }
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+  PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+  PPL_ASSERT(leaders.size() == 0);
+  // Compute predecessor information.
+  compute_predecessors(leaders);
+  // Flatten the predecessor chains so as to obtain leaders.
+  PPL_ASSERT(leaders[0] == 0);
+  for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) {
+    const dimension_type leaders_i = leaders[i];
+    PPL_ASSERT(leaders_i <= i);
+    if (leaders_i != i) {
+      const dimension_type leaders_leaders_i = leaders[leaders_i];
+      PPL_ASSERT(leaders_leaders_i == leaders[leaders_leaders_i]);
+      leaders[i] = leaders_leaders_i;
+    }
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+  // If the BDS is empty, it is also reduced.
+  if (marked_empty())
+    return true;
+
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return true;
+
+  // A shortest-path reduced dbm is just a dbm with an indication of
+  // those constraints that are redundant. If there is no indication
+  // of the redundant constraints, then it cannot be reduced.
+  if (!marked_shortest_path_reduced())
+    return false;
+
+  const BD_Shape x_copy = *this;
+  x_copy.shortest_path_closure_assign();
+  // If we just discovered emptiness, it cannot be reduced.
+  if (x_copy.marked_empty())
+    return false;
+
+  // The vector `leader' is used to indicate which variables are equivalent.
+  std::vector<dimension_type> leader(space_dim + 1);
+
+  // We store the leader.
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    leader[i] = i;
+
+  // Step 1: we store really the leader with the corrected value.
+  // We search for the equivalent or zero-equivalent variables.
+  // The variable(i-1) and variable(j-1) are equivalent if and only if
+  // m_i_j == -(m_j_i).
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    const DB_Row<N>& x_copy_dbm_i = x_copy.dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j)
+      if (is_additive_inverse(x_copy.dbm[j][i], x_copy_dbm_i[j]))
+        // Two equivalent variables have got the same leader
+        // (the smaller variable).
+        leader[j] = leader[i];
+  }
+
+  // Step 2: we check if there are redundant constraints in the zero_cycle
+  // free bounded difference shape, considering only the leaders.
+  // A constraint `c' is redundant, when there are two constraints such that
+  // their sum is the same constraint with the inhomogeneous term
+  // less than or equal to the `c' one.
+  PPL_DIRTY_TEMP(N, c);
+  for (dimension_type k = 0; k <= space_dim; ++k)
+    if (leader[k] == k) {
+      const DB_Row<N>& x_k = x_copy.dbm[k];
+      for (dimension_type i = 0; i <= space_dim; ++i)
+        if (leader[i] == i) {
+          const DB_Row<N>& x_i = x_copy.dbm[i];
+          const Bit_Row& redundancy_i = redundancy_dbm[i];
+          const N& x_i_k = x_i[k];
+          for (dimension_type j = 0; j <= space_dim; ++j)
+            if (leader[j] == j) {
+              const N& x_i_j = x_i[j];
+              if (!is_plus_infinity(x_i_j)) {
+                add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+                if (x_i_j >= c && !redundancy_i[j])
+                  return false;
+              }
+            }
+        }
+    }
+
+  // The vector `var_conn' is used to check if there is a single cycle
+  // that connected all zero-equivalent variables between them.
+  // The value `space_dim + 1' is used to indicate that the equivalence
+  // class contains a single variable.
+  std::vector<dimension_type> var_conn(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    var_conn[i] = space_dim + 1;
+
+  // Step 3: we store really the `var_conn' with the right value, putting
+  // the variable with the selected variable is connected:
+  // we check the row of each variable:
+  // a- each leader could be connected with only zero-equivalent one,
+  // b- each non-leader with only another zero-equivalent one.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    // It count with how many variables the selected variable is
+    // connected.
+    dimension_type t = 0;
+    dimension_type leader_i = leader[i];
+    // Case a: leader.
+    if (leader_i == i) {
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        dimension_type leader_j = leader[j];
+        // Only the connectedness with equivalent variables
+        // is considered.
+        if (j != leader_j)
+          if (!redundancy_dbm[i][j]) {
+            if (t == 1)
+              // Two non-leaders cannot be connected with the same leader.
+              return false;
+            else
+              if (leader_j != i)
+                // The variables are not in the same equivalence class.
+                return false;
+              else {
+                ++t;
+                var_conn[i] = j;
+              }
+          }
+      }
+    }
+    // Case b: non-leader.
+    else {
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        if (!redundancy_dbm[i][j]) {
+          dimension_type leader_j = leader[j];
+          if (leader_i != leader_j)
+            // The variables are not in the same equivalence class.
+            return false;
+          else {
+            if (t == 1)
+              // The variables cannot be connected with the same leader.
+              return false;
+            else {
+              ++t;
+              var_conn[i] = j;
+            }
+          }
+          // A non-leader must be connected with
+          // another variable.
+          if (t == 0)
+            return false;
+        }
+      }
+    }
+  }
+
+  // The vector `just_checked' is used to check if
+  // a variable is already checked.
+  std::vector<bool> just_checked(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    just_checked[i] = false;
+
+  // Step 4: we check if there are single cycles that
+  // connected all the zero-equivalent variables between them.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    // We do not re-check the already considered single cycles.
+    if (!just_checked[i]) {
+      dimension_type v_con = var_conn[i];
+      // We consider only the equivalence classes with
+      // 2 or plus variables.
+      if (v_con != space_dim + 1) {
+        // There is a single cycle if taken a variable,
+        // we return to this same variable.
+        while (v_con != i) {
+          just_checked[v_con] = true;
+          v_con = var_conn[v_con];
+          // If we re-pass to an already considered variable,
+          // then we haven't a single cycle.
+          if (just_checked[v_con])
+            return false;
+        }
+      }
+    }
+    just_checked[i] = true;
+  }
+
+  // The system bounded differences is just reduced.
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::bounds(const Linear_Expression& expr,
+                    const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+
+  shortest_path_closure_assign();
+  // A zero-dimensional or empty BDS bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
+
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = from_above ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Check if `c' is a BD constraint.
+  if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+    if (num_vars == 0)
+      // Dealing with a trivial constraint.
+      return true;
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    return !is_plus_infinity(x);
+  }
+  else {
+    // Not a DB constraint: use the MIP solver.
+    Optimization_Mode mode_bounds
+      = from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    // Problem is known to be feasible.
+    return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = maximize ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Check if `c' is a BD constraint.
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+    Optimization_Mode mode_max_min
+      = maximize ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // Here `expr' is a bounded difference.
+    if (num_vars == 0) {
+      // Dealing with a trivial expression.
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    if (!is_plus_infinity(x)) {
+      // Compute the maximize/minimize of `expr'.
+      PPL_DIRTY_TEMP(N, d);
+      const Coefficient& b = expr.inhomogeneous_term();
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of
+      // a variable in `expr'.
+      PPL_DIRTY_TEMP(N, coeff_expr);
+      PPL_ASSERT(i != 0);
+      const Coefficient& coeff_i = expr.get(Variable(i - 1));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+        neg_assign(minus_coeff_i, coeff_i);
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      add_mul_assign_r(d, coeff_expr, x, ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
+
+    // `expr' is unbounded.
+    return false;
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included,
+                     Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
+
+  Optimization_Mode mode_max_min
+    = maximize ? MAXIMIZATION : MINIMIZATION;
+  MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+  if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+    g = mip.optimizing_point();
+    mip.evaluate_objective_function(g, ext_n, ext_d);
+    included = true;
+    return true;
+  }
+  // Here `expr' is unbounded in `*this'.
+  return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Congruence& cg) const {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg.space_dimension() > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  // If the congruence is an equality, find the relation with
+  // the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    return relation_with(c);
+  }
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  // Find the lower bound for a hyperplane with direction
+  // defined by the congruence.
+  Linear_Expression le = Linear_Expression(cg.expression());
+  PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+  bool min_included;
+  bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+  // If there is no lower bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  // TODO: Consider adding a max_and_min() method, performing both
+  // maximization and minimization so as to possibly exploit
+  // incrementality of the MIP solver.
+
+  // Find the upper bound for a hyperplane with direction
+  // defined by the congruence.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+  bool max_included;
+  bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+  // If there is no upper bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_above)
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is above the lower bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  min_value = min_numer / min_denom;
+  const Coefficient& modulus = cg.modulus();
+  signed_distance = min_value % modulus;
+  min_value -= signed_distance;
+  if (min_value * min_denom < min_numer)
+    min_value += modulus;
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is below the upper bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  max_value = max_numer / max_denom;
+  signed_distance = max_value % modulus;
+  max_value += signed_distance;
+  if (max_value * max_denom > max_numer)
+    max_value -= modulus;
+
+  // If the upper bound value is less than the lower bound value,
+  // then there is an empty intersection with the congruence;
+  // otherwise it will strictly intersect.
+  if (max_value < min_value)
+    return Poly_Con_Relation::is_disjoint();
+  else
+    return Poly_Con_Relation::strictly_intersects();
+}
+
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+    // Constraints that are not bounded differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le(c.expression());
+    le.set_inhomogeneous_term(Coefficient_zero());
+
+    PPL_DIRTY_TEMP(Coefficient, max_numer);
+    PPL_DIRTY_TEMP(Coefficient, max_denom);
+    bool max_included;
+    PPL_DIRTY_TEMP(Coefficient, min_numer);
+    PPL_DIRTY_TEMP(Coefficient, min_denom);
+    bool min_included;
+    bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+    bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(min_numer)) {
+      case 1:
+        if (c.is_equality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return Poly_Con_Relation::strictly_intersects();
+        return Poly_Con_Relation::is_included();
+      case -1:
+        return Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        switch (sgn(min_numer)) {
+        case 1:
+          if (c.is_equality())
+            return Poly_Con_Relation::is_disjoint();
+          return Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::strictly_intersects();
+          return Poly_Con_Relation::is_included();
+        case -1:
+          return Poly_Con_Relation::strictly_intersects();
+        }
+        PPL_UNREACHABLE;
+        break;
+      case 0:
+        if (min_numer == 0) {
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
+
+  // Constraints that are bounded differences.
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  const N& x = negative ? dbm[i][j] : dbm[j][i];
+  const N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+  // Deduce the relation/s of the constraint `c' of the form
+  // `coeff*v - coeff*u </<=/== c.inhomogeneous_term()'
+  // with the respectively constraints in `*this'
+  // `-y <= v - u <= x'.
+  // Let `d == c.inhomogeneous_term()/coeff'
+  // and `d1 == -c.inhomogeneous_term()/coeff'.
+  // The following variables of mpq_class type are used to be precise
+  // when the bds is defined by integer constraints.
+  PPL_DIRTY_TEMP(mpq_class, q_x);
+  PPL_DIRTY_TEMP(mpq_class, q_y);
+  PPL_DIRTY_TEMP(mpq_class, d);
+  PPL_DIRTY_TEMP(mpq_class, d1);
+  PPL_DIRTY_TEMP(mpq_class, c_denom);
+  PPL_DIRTY_TEMP(mpq_class, q_denom);
+  assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(x)) {
+    if (!is_plus_infinity(y)) {
+      // `*this' is in the following form:
+      // `-y <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+      // `y < d1' (`y <= d1' if c is a strict equality).
+      PPL_DIRTY_TEMP_COEFFICIENT(numer);
+      PPL_DIRTY_TEMP_COEFFICIENT(denom);
+      numer_denom(y, numer, denom);
+      assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
+
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
+
+  // Here `x' is not plus-infinity.
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  numer_denom(x, numer, denom);
+  assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(y)) {
+    numer_denom(y, numer, denom);
+    assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+    // `y < d1' (`y <= d1' if c is a strict equality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
+
+  // Here `y' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `x < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
+
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  shortest_path_closure_assign();
+  // The empty BDS cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe BDS in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
+
+  // The relation between the BDS and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the BDS.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the BDS.
+
+  // Allocation of temporaries done once and for all.
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP_COEFFICIENT(product);
+  // We find in `*this' all the constraints.
+  // TODO: This loop can be optimized more, if needed.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    const Coefficient& g_coeff_y = (i > g_space_dim || i == 0)
+      ? Coefficient_zero() : g.coefficient(Variable(i-1));
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Coefficient& g_coeff_x = (j > g_space_dim)
+        ? Coefficient_zero() : g.coefficient(Variable(j-1));
+      const N& dbm_ij = dbm_i[j];
+      const N& dbm_ji = dbm[j][i];
+      if (is_additive_inverse(dbm_ji, dbm_ij)) {
+        // We have one equality constraint: denom*x - denom*y = numer.
+        // Compute the scalar product.
+        numer_denom(dbm_ij, numer, denom);
+        product = g_coeff_y;
+        product -= g_coeff_x;
+        product *= denom;
+        if (!is_line_or_ray)
+          add_mul_assign(product, numer, g.divisor());
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        // We have 0, 1 or 2 binary inequality constraint/s.
+        if (!is_plus_infinity(dbm_ij)) {
+          // We have the binary inequality constraint:
+          // denom*x - denom*y <= numer.
+          // Compute the scalar product.
+          numer_denom(dbm_ij, numer, denom);
+          product = g_coeff_y;
+          product -= g_coeff_x;
+          product *= denom;
+          if (!is_line_or_ray)
+            add_mul_assign(product, numer, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+
+        if (!is_plus_infinity(dbm_ji)) {
+          // We have the binary inequality constraint: denom*y - denom*x <= b.
+          // Compute the scalar product.
+          numer_denom(dbm_ji, numer, denom);
+          product = 0;
+          add_mul_assign(product, denom, g_coeff_x);
+          add_mul_assign(product, -denom, g_coeff_y);
+          if (!is_line_or_ray)
+            add_mul_assign(product, numer, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
+
+  // The generator satisfies all the constraints.
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  // Zero-dimensional BDSs are necessarily shortest-path closed.
+  if (num_dimensions == 0)
+    return;
+
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
+
+  PPL_DIRTY_TEMP(N, sum);
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    const DB_Row<N>& x_dbm_k = x.dbm[k];
+    for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+      DB_Row<N>& x_dbm_i = x.dbm[i];
+      const N& x_dbm_i_k = x_dbm_i[k];
+      if (!is_plus_infinity(x_dbm_i_k))
+        for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+          const N& x_dbm_k_j = x_dbm_k[j];
+          if (!is_plus_infinity(x_dbm_k_j)) {
+            // Rounding upward for correctness.
+            add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+            min_assign(x_dbm_i[j], sum);
+          }
+        }
+    }
+  }
+
+  // Check for emptiness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (sgn(x_dbm_hh) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      PPL_ASSERT(sgn(x_dbm_hh) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // The BDS is not empty and it is now shortest-path closed.
+  x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::incremental_shortest_path_closure_assign(Variable var) const {
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  PPL_ASSERT(var.id() < num_dimensions);
+
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the incremental Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape&>(*this);
+
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
+
+  // Using the incremental Floyd-Warshall algorithm.
+  PPL_DIRTY_TEMP(N, sum);
+  const dimension_type v = var.id() + 1;
+  DB_Row<N>& x_v = x.dbm[v];
+  // Step 1: Improve all constraints on variable `var'.
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    DB_Row<N>& x_k = x.dbm[k];
+    const N& x_v_k = x_v[k];
+    const N& x_k_v = x_k[v];
+    const bool x_v_k_finite = !is_plus_infinity(x_v_k);
+    const bool x_k_v_finite = !is_plus_infinity(x_k_v);
+    // Specialize inner loop based on finiteness info.
+    if (x_v_k_finite) {
+      if (x_k_v_finite) {
+        // Here both x_v_k and x_k_v are finite.
+        for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+          DB_Row<N>& x_i = x.dbm[i];
+          const N& x_i_k = x_i[k];
+          if (!is_plus_infinity(x_i_k)) {
+            add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+            min_assign(x_i[v], sum);
+          }
+          const N& x_k_i = x_k[i];
+          if (!is_plus_infinity(x_k_i)) {
+            add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+            min_assign(x_v[i], sum);
+          }
+        }
+      }
+      else {
+        // Here x_v_k is finite, but x_k_v is not.
+        for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+          const N& x_k_i = x_k[i];
+          if (!is_plus_infinity(x_k_i)) {
+            add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+            min_assign(x_v[i], sum);
+          }
+        }
+      }
+    }
+    else if (x_k_v_finite) {
+      // Here x_v_k is infinite, but x_k_v is finite.
+      for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+        DB_Row<N>& x_i = x.dbm[i];
+        const N& x_i_k = x_i[k];
+        if (!is_plus_infinity(x_i_k)) {
+          add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+          min_assign(x_i[v], sum);
+        }
+      }
+    }
+    else
+      // Here both x_v_k and x_k_v are infinite.
+      continue;
+  }
+
+  // Step 2: improve the other bounds by using the precise bounds
+  // for the constraints on `var'.
+  for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+    DB_Row<N>& x_i = x.dbm[i];
+    const N& x_i_v = x_i[v];
+    if (!is_plus_infinity(x_i_v)) {
+      for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+        const N& x_v_j = x_v[j];
+        if (!is_plus_infinity(x_v_j)) {
+          add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+          min_assign(x_i[j], sum);
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (sgn(x_dbm_hh) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      PPL_ASSERT(sgn(x_dbm_hh) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // The BDS is not empty and it is now shortest-path closed.
+  x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+  // Do something only if necessary.
+  if (marked_shortest_path_reduced())
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return;
+
+  // First find the tightest constraints for this BDS.
+  shortest_path_closure_assign();
+
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is shortest-path
+  // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+  std::vector<dimension_type> leaders;
+  compute_leader_indices(predecessor, leaders);
+  const dimension_type num_leaders = leaders.size();
+
+  Bit_Matrix redundancy(space_dim + 1, space_dim + 1);
+  // Init all constraints to be redundant.
+  // TODO: provide an appropriate method to set multiple bits.
+  Bit_Row& red_0 = redundancy[0];
+  for (dimension_type j = space_dim + 1; j-- > 0; )
+    red_0.set(j);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    redundancy[i] = red_0;
+
+  // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+  // subsystem of bounded differences having only leaders as variables.
+  PPL_DIRTY_TEMP(N, c);
+  for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leaders[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    Bit_Row& redundancy_i = redundancy[i];
+    for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leaders[l_j];
+      if (redundancy_i[j]) {
+        const N& dbm_i_j = dbm_i[j];
+        redundancy_i.clear(j);
+        for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+          const dimension_type k = leaders[l_k];
+          add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+          if (dbm_i_j >= c) {
+            redundancy_i.set(j);
+            break;
+          }
+        }
+      }
+    }
+  }
+
+  // Step 3: flag non-redundant constraints in zero-equivalence classes.
+  // Each equivalence class must have a single 0-cycle connecting
+  // all the equivalent variables in increasing order.
+  std::deque<bool> dealt_with(space_dim + 1, false);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    // We only need to deal with non-singleton zero-equivalence classes
+    // that haven't already been dealt with.
+    if (i != predecessor[i] && !dealt_with[i]) {
+      dimension_type j = i;
+      while (true) {
+        const dimension_type predecessor_j = predecessor[j];
+        if (j == predecessor_j) {
+          // We finally found the leader of `i'.
+          PPL_ASSERT(redundancy[i][j]);
+          redundancy[i].clear(j);
+          // Here we dealt with `j' (i.e., `predecessor_j'), but it is useless
+          // to update `dealt_with' because `j' is a leader.
+          break;
+        }
+        // We haven't found the leader of `i' yet.
+        PPL_ASSERT(redundancy[predecessor_j][j]);
+        redundancy[predecessor_j].clear(j);
+        dealt_with[predecessor_j] = true;
+        j = predecessor_j;
+      }
+    }
+
+  // Even though shortest-path reduction is not going to change the BDS,
+  // it might change its internal representation.
+  BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+  using std::swap;
+  swap(x.redundancy_dbm, redundancy);
+  x.set_shortest_path_reduced();
+
+  PPL_ASSERT(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+  // The upper bound of a BD shape `bd' with an empty shape is `bd'.
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The bds-hull consists in constructing `*this' with the maximum
+  // elements selected from `*this' and `y'.
+  PPL_ASSERT(space_dim == 0 || marked_shortest_path_closed());
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij < y_dbm_ij)
+        dbm_ij = y_dbm_ij;
+    }
+  }
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::BFT00_upper_bound_assign_if_exact(const BD_Shape& y) {
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const BD_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x_space_dim == y.space_dimension());
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+  // Implementation based on Algorithm 4.1 (page 6) in [BemporadFT00TR],
+  // tailored to the special case of BD shapes.
+
+  Variable epsilon(x_space_dim);
+  Linear_Expression zero_expr;
+  zero_expr.set_space_dimension(x_space_dim + 1);
+  Linear_Expression db_expr;
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+  // Step 1: compute the constraint system for the envelope env(x,y)
+  // and put into x_cs_removed and y_cs_removed those non-redundant
+  // constraints that are not in the constraint system for env(x,y).
+  // While at it, also add the additional space dimension (epsilon).
+  Constraint_System env_cs;
+  Constraint_System x_cs_removed;
+  Constraint_System y_cs_removed;
+  x.shortest_path_reduction_assign();
+  y.shortest_path_reduction_assign();
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const Bit_Row& x_red_i = x.redundancy_dbm[i];
+    const Bit_Row& y_red_i = y.redundancy_dbm[i];
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+      if (x_red_i[j] && y_red_i[j])
+        continue;
+      if (!x_red_i[j]) {
+        const N& x_dbm_ij = x_dbm_i[j];
+        PPL_ASSERT(!is_plus_infinity(x_dbm_ij));
+        numer_denom(x_dbm_ij, numer, denom);
+        // Build skeleton DB constraint (having the right space dimension).
+        db_expr = zero_expr;
+        if (i > 0)
+          db_expr += Variable(i-1);
+        if (j > 0)
+          db_expr -= Variable(j-1);
+        if (denom != 1)
+          db_expr *= denom;
+        db_expr += numer;
+        if (x_dbm_ij >= y_dbm_i[j])
+          env_cs.insert(db_expr >= 0);
+        else {
+          db_expr += epsilon;
+          x_cs_removed.insert(db_expr == 0);
+        }
+      }
+      if (!y_red_i[j]) {
+        const N& y_dbm_ij = y_dbm_i[j];
+        const N& x_dbm_ij = x_dbm_i[j];
+        PPL_ASSERT(!is_plus_infinity(y_dbm_ij));
+        numer_denom(y_dbm_ij, numer, denom);
+        // Build skeleton DB constraint (having the right space dimension).
+        db_expr = zero_expr;
+        if (i > 0)
+          db_expr += Variable(i-1);
+        if (j > 0)
+          db_expr -= Variable(j-1);
+        if (denom != 1)
+          db_expr *= denom;
+        db_expr += numer;
+        if (y_dbm_ij >= x_dbm_ij) {
+          // Check if same constraint was added when considering x_dbm_ij.
+          if (!x_red_i[j] && x_dbm_ij == y_dbm_ij)
+            continue;
+          env_cs.insert(db_expr >= 0);
+        }
+        else {
+          db_expr += epsilon;
+          y_cs_removed.insert(db_expr == 0);
+        }
+      }
+    }
+  }
+
+  if (x_cs_removed.empty())
+    // No constraint of x was removed: y is included in x.
+    return true;
+  if (y_cs_removed.empty()) {
+    // No constraint of y was removed: x is included in y.
+    *this = y;
+    return true;
+  }
+
+  // In preparation to Step 4: build the common part of LP problems,
+  // i.e., the constraints corresponding to env(x,y),
+  // where the additional space dimension (epsilon) has to be maximized.
+  MIP_Problem env_lp(x_space_dim + 1, env_cs, epsilon, MAXIMIZATION);
+  // Pre-solve `env_lp' to later exploit incrementality.
+  env_lp.solve();
+  PPL_ASSERT(env_lp.solve() != UNFEASIBLE_MIP_PROBLEM);
+
+  // Implementing loop in Steps 3-6.
+  for (Constraint_System::const_iterator i = x_cs_removed.begin(),
+         i_end = x_cs_removed.end(); i != i_end; ++i) {
+    MIP_Problem lp_i(env_lp);
+    lp_i.add_constraint(*i);
+    // Pre-solve to exploit incrementality.
+    if (lp_i.solve() == UNFEASIBLE_MIP_PROBLEM)
+      continue;
+    for (Constraint_System::const_iterator j = y_cs_removed.begin(),
+           j_end = y_cs_removed.end(); j != j_end; ++j) {
+      MIP_Problem lp_ij(lp_i);
+      lp_ij.add_constraint(*j);
+      // Solve and check for a positive optimal value.
+      switch (lp_ij.solve()) {
+      case UNFEASIBLE_MIP_PROBLEM:
+        // CHECKME: is the following actually impossible?
+        PPL_UNREACHABLE;
+        return false;
+      case UNBOUNDED_MIP_PROBLEM:
+        return false;
+      case OPTIMIZED_MIP_PROBLEM:
+        lp_ij.optimal_value(numer, denom);
+        if (numer > 0)
+          return false;
+        break;
+      }
+    }
+  }
+
+  // The upper bound of x and y is indeed exact.
+  upper_bound_assign(y);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+template <bool integer_upper_bound>
+bool
+BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(const BD_Shape& y) {
+  PPL_COMPILE_TIME_CHECK(!integer_upper_bound
+                         || std::numeric_limits<T>::is_integer,
+                         "BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(y):"
+                         " instantiating for integer upper bound,"
+                         " but T in not an integer datatype.");
+
+  // FIXME, CHECKME: what about inexact computations?
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const BD_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x_space_dim == y.space_dimension());
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+  x.shortest_path_reduction_assign();
+  y.shortest_path_reduction_assign();
+  PPL_ASSERT(x.marked_shortest_path_closed());
+  PPL_ASSERT(y.marked_shortest_path_closed());
+  // Pre-compute the upper bound of `x' and `y'.
+  BD_Shape<T> ub(x);
+  ub.upper_bound_assign(y);
+
+  PPL_DIRTY_TEMP(N, lhs);
+  PPL_DIRTY_TEMP(N, rhs);
+  PPL_DIRTY_TEMP(N, temp_zero);
+  assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, temp_one);
+  if (integer_upper_bound)
+    assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_i = x.dbm[i];
+    const Bit_Row& x_red_i = x.redundancy_dbm[i];
+    const DB_Row<N>& y_i = y.dbm[i];
+    const DB_Row<N>& ub_i = ub.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+      // Check redundancy of x_i_j.
+      if (x_red_i[j])
+        continue;
+      // By non-redundancy, we know that i != j.
+      PPL_ASSERT(i != j);
+      const N& x_i_j = x_i[j];
+      if (x_i_j < y_i[j]) {
+        for (dimension_type k = x_space_dim + 1; k-- > 0; ) {
+          const DB_Row<N>& x_k = x.dbm[k];
+          const DB_Row<N>& y_k = y.dbm[k];
+          const Bit_Row& y_red_k = y.redundancy_dbm[k];
+          const DB_Row<N>& ub_k = ub.dbm[k];
+          const N& ub_k_j = (k == j) ? temp_zero : ub_k[j];
+          for (dimension_type ell = x_space_dim + 1; ell-- > 0; ) {
+            // Check redundancy of y_k_ell.
+            if (y_red_k[ell])
+              continue;
+            // By non-redundancy, we know that k != ell.
+            PPL_ASSERT(k != ell);
+            const N& y_k_ell = y_k[ell];
+            if (y_k_ell < x_k[ell]) {
+              // The first condition in BHZ09 theorem holds;
+              // now check for the second condition.
+              add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+              const N& ub_i_ell = (i == ell) ? temp_zero : ub_i[ell];
+              add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+              if (integer_upper_bound) {
+                // Note: adding 1 rather than 2 (as in Theorem 5.3)
+                // so as to later test for < rather than <=.
+                add_assign_r(lhs, lhs, temp_one, ROUND_NOT_NEEDED);
+              }
+              // Testing for < in both the rational and integer case.
+              if (lhs < rhs)
+                return false;
+            }
+          }
+        }
+      }
+    }
+  }
+  // The upper bound of x and y is indeed exact.
+  m_swap(ub);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("difference_assign(y)", y);
+
+  BD_Shape new_bd_shape(space_dim, EMPTY);
+
+  BD_Shape& x = *this;
+
+  x.shortest_path_closure_assign();
+  // The difference of an empty bounded difference shape
+  // and of a bounded difference shape `p' is empty.
+  if (x.marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // The difference of a bounded difference shape `p'
+  // and an empty bounded difference shape is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both bounded difference shapes are zero-dimensional,
+  // then at this point they are necessarily universe system of
+  // bounded differences, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  // We take a constraint of the system y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementary constraints with the system x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the bounded difference shape `x' is included
+    // in the bounded difference shape defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty bounded difference shape,
+    // and as we would obtain a result that is less precise
+    // than the bds-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    BD_Shape z = x;
+    const Linear_Expression e(c.expression());
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_bd_shape.upper_bound_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_bd_shape.upper_bound_assign(z);
+    }
+  }
+  *this = new_bd_shape;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::simplify_using_context_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
+  const dimension_type dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (dim != y.space_dimension())
+    throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+  // Filter away the zero-dimensional case.
+  if (dim == 0) {
+    if (y.marked_empty()) {
+      x.set_zero_dim_univ();
+      return false;
+    }
+    else
+      return !x.marked_empty();
+  }
+
+  // Filter away the case where `x' contains `y'
+  // (this subsumes the case when `y' is empty).
+  y.shortest_path_closure_assign();
+  if (x.contains(y)) {
+    BD_Shape<T> res(dim, UNIVERSE);
+    x.m_swap(res);
+    return false;
+  }
+
+  // Filter away the case where `x' is empty.
+  x.shortest_path_closure_assign();
+  if (x.marked_empty()) {
+    // Search for a constraint of `y' that is not a tautology.
+    dimension_type i;
+    dimension_type j;
+    // Prefer unary constraints.
+    i = 0;
+    const DB_Row<N>& y_dbm_0 = y.dbm[0];
+    for (j = 1; j <= dim; ++j) {
+      if (!is_plus_infinity(y_dbm_0[j]))
+        // FIXME: if N is a float or bounded integer type, then
+        // we also need to check that we are actually able to construct
+        // a constraint inconsistent with respect to this one.
+        goto found;
+    }
+    j = 0;
+    for (i = 1; i <= dim; ++i) {
+      if (!is_plus_infinity(y.dbm[i][0]))
+        // FIXME: if N is a float or bounded integer type, then
+        // we also need to check that we are actually able to construct
+        // a constraint inconsistent with respect to this one.
+        goto found;
+    }
+    // Then search binary constraints.
+    for (i = 1; i <= dim; ++i) {
+      const DB_Row<N>& y_dbm_i = y.dbm[i];
+      for (j = 1; j <= dim; ++j)
+        if (!is_plus_infinity(y_dbm_i[j]))
+          // FIXME: if N is a float or bounded integer type, then
+          // we also need to check that we are actually able to construct
+          // a constraint inconsistent with respect to this one.
+          goto found;
+    }
+    // Not found: we were not able to build a constraint contradicting
+    // one of the constraints in `y': `x' cannot be enlarged.
+    return false;
+
+  found:
+    // Found: build a new BDS contradicting the constraint found.
+    PPL_ASSERT(i <= dim && j <= dim && (i > 0 || j > 0));
+    BD_Shape<T> res(dim, UNIVERSE);
+    PPL_DIRTY_TEMP(N, tmp);
+    assign_r(tmp, 1, ROUND_UP);
+    add_assign_r(tmp, tmp, y.dbm[i][j], ROUND_UP);
+    PPL_ASSERT(!is_plus_infinity(tmp));
+    // CHECKME: round down is really meant.
+    neg_assign_r(res.dbm[j][i], tmp, ROUND_DOWN);
+    x.m_swap(res);
+    return false;
+  }
+
+  // Here `x' and `y' are not empty and shortest-path closed;
+  // also, `x' does not contain `y'.
+  // Let `target' be the intersection of `x' and `y'.
+  BD_Shape<T> target = x;
+  target.intersection_assign(y);
+  const bool bool_result = !target.is_empty();
+
+  // Compute a reduced dbm for `x' and ...
+  x.shortest_path_reduction_assign();
+  // ... count the non-redundant constraints.
+  dimension_type x_num_non_redundant = (dim+1)*(dim+1);
+  for (dimension_type i = dim + 1; i-- > 0; )
+    x_num_non_redundant -= x.redundancy_dbm[i].count_ones();
+  PPL_ASSERT(x_num_non_redundant > 0);
+
+  // Let `yy' be a copy of `y': we will keep adding to `yy'
+  // the non-redundant constraints of `x',
+  // stopping as soon as `yy' becomes equal to `target'.
+  BD_Shape<T> yy = y;
+
+  // The constraints added to `yy' will be recorded in `res' ...
+  BD_Shape<T> res(dim, UNIVERSE);
+  // ... and we will count them too.
+  dimension_type res_num_non_redundant = 0;
+
+  // Compute leader information for `x'.
+  std::vector<dimension_type> x_leaders;
+  x.compute_leaders(x_leaders);
+
+  // First go through the unary equality constraints.
+  const DB_Row<N>& x_dbm_0 = x.dbm[0];
+  DB_Row<N>& yy_dbm_0 = yy.dbm[0];
+  DB_Row<N>& res_dbm_0 = res.dbm[0];
+  for (dimension_type j = 1; j <= dim; ++j) {
+    // Unary equality constraints are encoded in entries dbm_0j and dbm_j0
+    // provided index j has special variable index 0 as its leader.
+    if (x_leaders[j] != 0)
+      continue;
+    PPL_ASSERT(!is_plus_infinity(x_dbm_0[j]));
+    if (x_dbm_0[j] < yy_dbm_0[j]) {
+      res_dbm_0[j] = x_dbm_0[j];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_dbm_0[j] = x_dbm_0[j];
+      yy.reset_shortest_path_closed();
+    }
+    PPL_ASSERT(!is_plus_infinity(x.dbm[j][0]));
+    if (x.dbm[j][0] < yy.dbm[j][0]) {
+      res.dbm[j][0] = x.dbm[j][0];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy.dbm[j][0] = x.dbm[j][0];
+      yy.reset_shortest_path_closed();
+    }
+    // Restore shortest-path closure, if it was lost.
+    if (!yy.marked_shortest_path_closed()) {
+      Variable var_j(j-1);
+      yy.incremental_shortest_path_closure_assign(var_j);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_shortest_path_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Go through the binary equality constraints.
+  // Note: no need to consider the case i == 1.
+  for (dimension_type i = 2; i <= dim; ++i) {
+    const dimension_type j = x_leaders[i];
+    if (j == i || j == 0)
+      continue;
+    PPL_ASSERT(!is_plus_infinity(x.dbm[i][j]));
+    if (x.dbm[i][j] < yy.dbm[i][j]) {
+      res.dbm[i][j] = x.dbm[i][j];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy.dbm[i][j] = x.dbm[i][j];
+      yy.reset_shortest_path_closed();
+    }
+    PPL_ASSERT(!is_plus_infinity(x.dbm[j][i]));
+    if (x.dbm[j][i] < yy.dbm[j][i]) {
+      res.dbm[j][i] = x.dbm[j][i];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy.dbm[j][i] = x.dbm[j][i];
+      yy.reset_shortest_path_closed();
+    }
+    // Restore shortest-path closure, if it was lost.
+    if (!yy.marked_shortest_path_closed()) {
+      Variable var_j(j-1);
+      yy.incremental_shortest_path_closure_assign(var_j);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_shortest_path_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Finally go through the (proper) inequality constraints:
+  // both indices i and j should be leaders.
+  for (dimension_type i = 0; i <= dim; ++i) {
+    if (i != x_leaders[i])
+      continue;
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const Bit_Row& x_redundancy_dbm_i = x.redundancy_dbm[i];
+    DB_Row<N>& yy_dbm_i = yy.dbm[i];
+    DB_Row<N>& res_dbm_i = res.dbm[i];
+    for (dimension_type j = 0; j <= dim; ++j) {
+      if (j != x_leaders[j] || x_redundancy_dbm_i[j])
+        continue;
+      N& yy_dbm_ij = yy_dbm_i[j];
+      const N& x_dbm_ij = x_dbm_i[j];
+      if (x_dbm_ij < yy_dbm_ij) {
+        res_dbm_i[j] = x_dbm_ij;
+        ++res_num_non_redundant;
+        // Tighten context `yy' using the newly added constraint.
+        yy_dbm_ij = x_dbm_ij;
+        yy.reset_shortest_path_closed();
+        PPL_ASSERT(i > 0 || j > 0);
+        Variable var(((i > 0) ? i : j) - 1);
+        yy.incremental_shortest_path_closure_assign(var);
+        if (target.contains(yy)) {
+          // Target reached: swap `x' and `res' if needed.
+          if (res_num_non_redundant < x_num_non_redundant) {
+            res.reset_shortest_path_closed();
+            x.m_swap(res);
+          }
+          return bool_result;
+        }
+      }
+    }
+  }
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return false;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  const dimension_type new_space_dim = space_dim + m;
+  const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+
+  // To embed an n-dimension space BDS in a (n+m)-dimension space,
+  // we just add `m' rows and columns in the bounded difference shape,
+  // initialized to PLUS_INFINITY.
+  dbm.grow(new_space_dim + 1);
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // If `*this' was the zero-dim space universe BDS,
+  // the we can set the shortest-path closure flag.
+  if (was_zero_dim_univ)
+    set_shortest_path_closed();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+
+  // If `*this' was zero-dimensional, then we add `m' rows and columns.
+  // If it also was non-empty, then we zero all the added elements
+  // and set the flag for shortest-path closure.
+  if (space_dim == 0) {
+    dbm.grow(m + 1);
+    if (!marked_empty()) {
+      for (dimension_type i = m + 1; i-- > 0; ) {
+        DB_Row<N>& dbm_i = dbm[i];
+        for (dimension_type j = m + 1; j-- > 0; )
+          if (i != j)
+            assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+      }
+      set_shortest_path_closed();
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // To project an n-dimension space bounded difference shape
+  // in a (n+m)-dimension space, we add `m' rows and columns.
+  // In the first row and column of the matrix we add `zero' from
+  // the (n+1)-th position to the end.
+  const dimension_type new_space_dim = space_dim + m;
+  dbm.grow(new_space_dim + 1);
+
+  // Bottom of the matrix and first row.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+    assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+    assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a BDS in a 0-dim space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  const dimension_type old_space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (old_space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  // Shortest-path closure is necessary to keep precision.
+  shortest_path_closure_assign();
+
+  // When removing _all_ dimensions from a BDS, we obtain the
+  // zero-dimensional BDS.
+  const dimension_type new_space_dim = old_space_dim - vars.size();
+  if (new_space_dim == 0) {
+    dbm.resize_no_copy(1);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Handle the case of an empty BD_Shape.
+  if (marked_empty()) {
+    dbm.resize_no_copy(new_space_dim + 1);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // For each variable to remove, we fill the corresponding column and
+  // row by shifting respectively left and above those
+  // columns and rows, that will not be removed.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  dimension_type dst = *vsi + 1;
+  dimension_type src = dst + 1;
+  for (++vsi; vsi != vsi_end; ++vsi) {
+    const dimension_type vsi_next = *vsi + 1;
+    // All other columns and rows are moved respectively to the left
+    // and above.
+    while (src < vsi_next) {
+      using std::swap;
+      swap(dbm[dst], dbm[src]);
+      for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+        DB_Row<N>& dbm_i = dbm[i];
+        assign_or_swap(dbm_i[dst], dbm_i[src]);
+      }
+      ++dst;
+      ++src;
+    }
+    ++src;
+  }
+
+  // Moving the remaining rows and columns.
+  while (src <= old_space_dim) {
+    using std::swap;
+    swap(dbm[dst], dbm[src]);
+    for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+      DB_Row<N>& dbm_i = dbm[i];
+      assign_or_swap(dbm_i[dst], dbm_i[src]);
+    }
+    ++src;
+    ++dst;
+  }
+
+  // Update the space dimension.
+  dbm.resize_no_copy(new_space_dim + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+BD_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  // TODO: this implementation is just an executable specification.
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the BDS becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    shortest_path_closure_assign();
+
+  // If the BDS is empty, then it is sufficient to adjust the
+  // space dimension of the bounded difference shape.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // We create a new matrix with the new space dimension.
+  DB_Matrix<N> x(new_space_dim+1);
+  // First of all we must map the unary constraints, because
+  // there is the fictitious variable `zero', that can't be mapped
+  // at all.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& x_0 = x[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    dimension_type new_j;
+    if (pfunc.maps(j - 1, new_j)) {
+      assign_or_swap(x_0[new_j + 1], dbm_0[j]);
+      assign_or_swap(x[new_j + 1][0], dbm[j][0]);
+    }
+  }
+  // Now we map the binary constraints, exchanging the indexes.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i - 1, new_i)) {
+      DB_Row<N>& dbm_i = dbm[i];
+      ++new_i;
+      DB_Row<N>& x_new_i = x[new_i];
+      for (dimension_type j = i+1; j <= space_dim; ++j) {
+        dimension_type new_j;
+        if (pfunc.maps(j - 1, new_j)) {
+          ++new_j;
+          assign_or_swap(x_new_i[new_j], dbm_i[j]);
+          assign_or_swap(x[new_j][new_i], dbm[j][i]);
+        }
+      }
+    }
+  }
+
+  using std::swap;
+  swap(dbm, x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two bounded difference shapes is empty,
+  // the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // If both bounded difference shapes are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two bounded difference shapes we compare
+  // the constraints and we choose the less values.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij > y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
+      }
+    }
+  }
+
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+                                       Iterator first, Iterator last,
+                                       unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If both bounded difference shapes are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  shortest_path_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (y_dbm_ij < dbm_ij) {
+        Iterator k = std::lower_bound(first, last, dbm_ij);
+        if (k != last) {
+          if (dbm_ij < *k)
+            assign_r(dbm_ij, *k, ROUND_UP);
+        }
+        else
+          assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+                                BD_Shape& limiting_shape) const {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+  shortest_path_closure_assign();
+  bool changed = false;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+  PPL_DIRTY_TEMP(N, d);
+  PPL_DIRTY_TEMP(N, d1);
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not bounded differences are ignored.
+    if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+      // Select the cell to be modified for the "<=" part of the constraint,
+      // and set `coeff' to the absolute value of itself.
+      const bool negative = (coeff < 0);
+      const N& x = negative ? dbm[i][j] : dbm[j][i];
+      const N& y = negative ? dbm[j][i] : dbm[i][j];
+      DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+      if (negative)
+        neg_assign(coeff);
+      // Compute the bound for `x', rounding towards plus infinity.
+      div_round_up(d, c.inhomogeneous_term(), coeff);
+      if (x <= d) {
+        if (c.is_inequality()) {
+          N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+          if (ls_x > d) {
+            ls_x = d;
+            changed = true;
+          }
+        }
+        else {
+          // Compute the bound for `y', rounding towards plus infinity.
+          neg_assign(minus_c_term, c.inhomogeneous_term());
+          div_round_up(d1, minus_c_term, coeff);
+          if (y <= d1) {
+            N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+            N& ls_y = negative ? ls_dbm[j][i] : ls_dbm[i][j];
+            if ((ls_x >= d && ls_y > d1) || (ls_x > d && ls_y >= d1)) {
+              ls_x = d;
+              ls_y = d1;
+              changed = true;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure of the bounded difference shape.
+  if (changed && limiting_shape.marked_shortest_path_closed())
+    limiting_shape.reset_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+                                               const Constraint_System& cs,
+                                               unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+                           "cs is space_dimension incompatible");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+                           "cs has strict inequalities");
+
+  // The limited CC76-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  PPL_ASSERT(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  PPL_ASSERT(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+  // Minimize `y'.
+  y.shortest_path_reduction_assign();
+
+  // Extrapolate unstable bounds, taking into account redundancy in `y'.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    const Bit_Row& y_redundancy_i = y.redundancy_dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+      if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+        assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+  // NOTE: this will also reset the shortest-path reduction flag,
+  // even though the dbm is still in reduced form. However, the
+  // current implementation invariant requires that any reduced dbm
+  // is closed too.
+  reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+                                                 const Constraint_System& cs,
+                                                 unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+                           "cs is space-dimension incompatible");
+
+  // Strict inequalities are not allowed.
+  if (cs.has_strict_inequalities())
+    throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+                           "cs has strict inequalities");
+
+  // The limited BHMZ05-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+  // We assume that `*this' is contained in or equal to `y'.
+  PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+  // If both bounded difference shapes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  y.shortest_path_closure_assign();
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (!is_plus_infinity(dbm_ij)
+          && !is_plus_infinity(y_dbm_ij)
+          && dbm_ij != y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
+      }
+    }
+  }
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_denom,
+                          const N& ub_v) {
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(ub_v));
+  // Deduce constraints of the form `v - u', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+  // played an active role in the computation of the upper bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/denom' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `v - u <= ub_v - ub_u';
+  // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+        u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+    const dimension_type u_dim = u.variable().space_dimension();
+    if (u_dim == v)
+      continue;
+    const Coefficient& expr_u = *u;
+    if (expr_u < 0)
+      continue;
+    PPL_ASSERT(expr_u > 0);
+    if (expr_u >= sc_denom)
+      // Deducing `v - u <= ub_v - ub_u'.
+      sub_assign_r(dbm[u_dim][v], ub_v, dbm_0[u_dim], ROUND_UP);
+    else {
+      DB_Row<N>& dbm_u = dbm[u_dim];
+      const N& dbm_u0 = dbm_u[0];
+      if (!is_plus_infinity(dbm_u0)) {
+        // Let `ub_u' and `lb_u' be the known upper and lower bound
+        // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+        // rational coefficient of `u' in `sc_expr/sc_denom',
+        // the upper bound for `v - u' is computed as
+        // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+        // `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+        assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+        assign_r(q, expr_u, ROUND_NOT_NEEDED);
+        div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+        assign_r(ub_u, dbm_0[u_dim], ROUND_NOT_NEEDED);
+        // Compute `ub_u - lb_u'.
+        add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+        // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+        sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+        assign_r(up_approx, minus_lb_u, ROUND_UP);
+        // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+        add_assign_r(dbm_u[v], ub_v, up_approx, ROUND_UP);
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_denom,
+                          const N& minus_lb_v) {
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+  // Deduce constraints of the form `u - v', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+  // played an active role in the computation of the lower bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/denom' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `u - v <= lb_u - lb_v';
+  // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  // No need to consider indices greater than `last_v'.
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+        u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+    const Variable u_var = u.variable();
+    const dimension_type u_dim = u_var.space_dimension();
+    if (u_var.space_dimension() == v)
+      continue;
+    const Coefficient& expr_u = *u;
+    if (expr_u < 0)
+      continue;
+    PPL_ASSERT(expr_u > 0);
+    if (expr_u >= sc_denom)
+      // Deducing `u - v <= lb_u - lb_v',
+      // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+      sub_assign_r(dbm_v[u_dim], minus_lb_v, dbm[u_dim][0], ROUND_UP);
+    else {
+      const N& dbm_0u = dbm_0[u_dim];
+      if (!is_plus_infinity(dbm_0u)) {
+        // Let `ub_u' and `lb_u' be the known upper and lower bound
+        // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+        // rational coefficient of `u' in `sc_expr/sc_denom',
+        // the upper bound for `u - v' is computed as
+        // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+        // `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+        assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+        assign_r(q, expr_u, ROUND_NOT_NEEDED);
+        div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+        assign_r(minus_lb_u, dbm[u_dim][0], ROUND_NOT_NEEDED);
+        // Compute `ub_u - lb_u'.
+        add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+        // Compute `ub_u - q * (ub_u - lb_u)'.
+        sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+        assign_r(up_approx, ub_u, ROUND_UP);
+        // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+        add_assign_r(dbm_v[u_dim], up_approx, minus_lb_v, ROUND_UP);
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+  PPL_ASSERT(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+  PPL_ASSERT(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("unconstrain(var)", var_space_dim);
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  forget_all_dbm_constraints(var_space_dim);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+    forget_all_dbm_constraints(*vsi + 1);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine(const Variable var,
+                    const Relation_Symbol relsym,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator) {
+  PPL_ASSERT(denominator != 0);
+  PPL_ASSERT(space_dimension() >= expr.space_dimension());
+  const dimension_type v = var.id() + 1;
+  PPL_ASSERT(v <= space_dimension());
+  PPL_ASSERT(expr.coefficient(var) == 0);
+  PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Since we are only able to record bounded differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.get(Variable(w - 1)) != denominator)
+    t = 2;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w != v' and `a == denominator';
+  // - If t == 2, the `expr' is of the general form.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      add_dbm_constraint(v, 0, b, minus_denom);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    return;
+  }
+
+  if (t == 1) {
+    // Case 2: expr == a*w + b, w != v, a == denominator.
+    PPL_ASSERT(expr.get(Variable(w - 1)) == denominator);
+    PPL_DIRTY_TEMP(N, d);
+    switch (relsym) {
+    case EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_denom);
+      add_dbm_constraint(v, w, d);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_denom);
+      add_dbm_constraint(v, w, d);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    return;
+  }
+
+  // Here t == 2, so that either
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, or
+  // expr == a*w + b, w != v and a != denominator.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  // Speculative allocation of temporaries that are used in most
+  // of the computational traces starting from this point (also loops).
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  PPL_DIRTY_TEMP(N, coeff_i);
+
+  switch (relsym) {
+  case EQUAL:
+    {
+      PPL_DIRTY_TEMP(N, neg_sum);
+      // Indices of the variables that are unbounded in `this->dbm'.
+      PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+      // Number of unbounded variables found.
+      dimension_type neg_pinf_count = 0;
+
+      // Compute an upper approximation for `expr' into `sum',
+      // taking into account the sign of `denominator'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `sc_expr'.
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `expr'.
+      for (Linear_Expression::const_iterator i = sc_expr.begin(),
+            i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+        const dimension_type i_dim = i.variable().space_dimension();
+        const Coefficient& sc_i = *i;
+        const int sign_i = sgn(sc_i);
+        PPL_ASSERT(sign_i != 0);
+        if (sign_i > 0) {
+          assign_r(coeff_i, sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_i = dbm_0[i_dim];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i_dim;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i_dim][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i_dim;
+            }
+          }
+        }
+        else {
+          PPL_ASSERT(sign_i < 0);
+          neg_assign(minus_sc_i, sc_i);
+          // Note: using temporary named `coeff_i' to store -coeff_i.
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i_dim][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i_dim;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_i = dbm_0[i_dim];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i_dim;
+            }
+          }
+        }
+      }
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1 && neg_pinf_count > 1) {
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      // In the following, shortest-path closure will be definitely lost.
+      reset_shortest_path_closed();
+
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+
+      // Exploit the upper approximation, if possible.
+      if (pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_denom != 1)
+          div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+        // Add the upper bound constraint, if meaningful.
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          dbm[0][v] = sum;
+          // Deduce constraints of the form `v - u', where `u != v'.
+          deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+        }
+        else
+          // Here `pinf_count == 1'.
+          if (pinf_index != v
+              && sc_expr.get(Variable(pinf_index - 1)) == sc_denom)
+            // Add the constraint `v - pinf_index <= sum'.
+            dbm[pinf_index][v] = sum;
+      }
+
+      // Exploit the lower approximation, if possible.
+      if (neg_pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_denom != 1)
+          div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+        // Add the lower bound constraint, if meaningful.
+        if (neg_pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          DB_Row<N>& dbm_v = dbm[v];
+          dbm_v[0] = neg_sum;
+          // Deduce constraints of the form `u - v', where `u != v'.
+          deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+        }
+        else
+          // Here `neg_pinf_count == 1'.
+          if (neg_pinf_index != v
+              && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+            // Add the constraint `v - neg_pinf_index >= -neg_sum',
+            // i.e., `neg_pinf_index - v <= neg_sum'.
+            dbm[v][neg_pinf_index] = neg_sum;
+      }
+    }
+    break;
+
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `expr' into `sum',
+    // taking into account the sign of `denominator'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `expr'.
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+          i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const dimension_type i_dim = i.variable().space_dimension();
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_denom' is known to be
+      // positive, this amounts to rounding downwards, which is achieved
+      // by rounding upwards `minus_sc - denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+    break;
+
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+          i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const dimension_type i_dim = i.variable().space_dimension();
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_denom' is known to be positive,
+      // this amounts to rounding downwards, which is achieved by rounding
+      // upwards `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+          && expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Add the constraint `var == b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    add_dbm_constraint(v, 0, b, minus_denom);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.get(Variable(w - 1));
+    if (a == denominator || a == minus_denom) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // `expr' is of the form: a*v + b.
+        if (a == denominator) {
+          if (b == 0)
+            // The transformation is the identity function.
+            return;
+          else {
+            // Translate all the constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            PPL_DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_denom);
+            DB_Row<N>& dbm_v = dbm[v];
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+            }
+            // Both shortest-path closure and reduction are preserved.
+          }
+        }
+        else {
+          // Here `a == -denominator'.
+          // Remove the binary constraints on `var'.
+          forget_binary_dbm_constraints(v);
+          // Swap the unary constraints on `var'.
+          using std::swap;
+          swap(dbm[v][0], dbm[0][v]);
+          // Shortest-path closure is not preserved.
+          reset_shortest_path_closed();
+          if (b != 0) {
+            // Translate the unary constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            PPL_DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_denom);
+            N& dbm_v0 = dbm[v][0];
+            add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            N& dbm_0v = dbm[0][v];
+            add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+          }
+        }
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+          add_dbm_constraint(v, w, b, minus_denom);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+          const N& dbm_0w = dbm[0][w];
+          if (!is_plus_infinity(dbm_0w)) {
+            // Add the constraint `v >= b/denominator - upper_w'.
+            PPL_DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_denom);
+            add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, pos_sum);
+  PPL_DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+  PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+    const Coefficient& sc_i = *i;
+    const dimension_type i_dim = i.variable().space_dimension();
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i_dim];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i_dim][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i_dim;
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(sign_i < 0);
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i_dim][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i_dim];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i_dim;
+        }
+      }
+    }
+  }
+
+  // Remove all constraints on 'v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DB_Row<N>& dbm_v = dbm[v];
+      dbm_v[0] = neg_sum;
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != v
+          && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+        // Add the constraint `v - neg_pinf_index >= -neg_sum',
+        // i.e., `neg_pinf_index - v <= neg_sum'.
+        dbm[v][neg_pinf_index] = neg_sum;
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::affine_form_image(const Variable var,
+                    const Linear_Form< Interval<T, Interval_Info> >& lf) {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                    "BD_Shape<T>::affine_form_image(Variable, Linear_Form):"
+                    " T not a floating point type.");
+
+  // Dimension-compatibility checks.
+  // The dimension of `lf' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(var_id, l)", "l", lf);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type var_id = var.id() + 1;
+  if (space_dim < var_id)
+    throw_dimension_incompatible("affine_form_image(var_id, l)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lf': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `lf', if any.
+  dimension_type w_id = 0;
+  // Get information about the number of non-zero coefficients in `lf'.
+  for (dimension_type i = lf_space_dim; i-- > 0; )
+    if (lf.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i + 1;
+    }
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+  // Now we know the form of `lf':
+  // - If t == 0, then lf == b, with `b' a constant;
+  // - If t == 1, then lf == a*w + b, where `w' can be `v' or another
+  //   variable;
+  // - If t == 2, the linear form 'lf' is of the general form.
+
+  if (t == 0) {
+    inhomogeneous_affine_form_image(var_id, b);
+    PPL_ASSERT(OK());
+    return;
+  }
+  else if (t == 1) {
+    const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id - 1));
+    if (w_coeff == 1 || w_coeff == -1) {
+      one_variable_affine_form_image(var_id, b, w_coeff, w_id, space_dim);
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+  two_variables_affine_form_image(var_id, lf, space_dim);
+  PPL_ASSERT(OK());
+}
+
+// Case 1: var = b, where b = [-b_mlb, b_ub]
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::inhomogeneous_affine_form_image(const dimension_type& var_id,
+                                  const Interval<T, Interval_Info>& b) {
+  PPL_DIRTY_TEMP(N, b_ub);
+  assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, b_mlb);
+  neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+  // Remove all constraints on `var'.
+  forget_all_dbm_constraints(var_id);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+    // Add the constraint `var >= lb && var <= ub'.
+    add_dbm_constraint(0, var_id, b_ub);
+    add_dbm_constraint(var_id, 0, b_mlb);
+    return;
+}
+
+// case 2: var = (+/-1) * w + [-b_mlb, b_ub], where `w' can be `var'
+// or another variable.
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::one_variable_affine_form_image(const dimension_type& var_id,
+                            const Interval<T, Interval_Info>& b,
+                            const Interval<T, Interval_Info>& w_coeff,
+                            const dimension_type& w_id,
+                            const dimension_type& space_dim) {
+
+  PPL_DIRTY_TEMP(N, b_ub);
+  assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, b_mlb);
+  neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+  // True if `w_coeff' is in [1, 1].
+  bool is_w_coeff_one = (w_coeff == 1);
+
+  if (w_id == var_id) {
+    // True if `b' is in [b_mlb, b_ub] and that is [0, 0].
+    bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+    // Here `lf' is of the form: [+/-1, +/-1] * v + b.
+    if (is_w_coeff_one) {
+      if (is_b_zero)
+        // The transformation is the identity function.
+        return;
+      else {
+        // Translate all the constraints on `var' by adding the value
+        // `b_ub' or subtracting the value `b_mlb'.
+        DB_Row<N>& dbm_v = dbm[var_id];
+        for (dimension_type i = space_dim + 1; i-- > 0; ) {
+          N& dbm_vi = dbm_v[i];
+          add_assign_r(dbm_vi, dbm_vi, b_mlb, ROUND_UP);
+          N& dbm_iv = dbm[i][var_id];
+          add_assign_r(dbm_iv, dbm_iv, b_ub, ROUND_UP);
+        }
+        // Both shortest-path closure and reduction are preserved.
+      }
+    }
+    else {
+      // Here `w_coeff = [-1, -1].
+      // Remove the binary constraints on `var'.
+      forget_binary_dbm_constraints(var_id);
+      using std::swap;
+      swap(dbm[var_id][0], dbm[0][var_id]);
+      // Shortest-path closure is not preserved.
+      reset_shortest_path_closed();
+      if (!is_b_zero) {
+        // Translate the unary constraints on `var' by adding the value
+        // `b_ub' or subtracting the value `b_mlb'.
+        N& dbm_v0 = dbm[var_id][0];
+        add_assign_r(dbm_v0, dbm_v0, b_mlb, ROUND_UP);
+        N& dbm_0v = dbm[0][var_id];
+        add_assign_r(dbm_0v, dbm_0v, b_ub, ROUND_UP);
+      }
+    }
+  }
+  else {
+    // Here `w != var', so that `lf' is of the form
+    // [+/-1, +/-1] * w + b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(var_id);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    if (is_w_coeff_one) {
+      // Add the new constraints `var - w >= b_mlb'
+      // `and var - w <= b_ub'.
+      add_dbm_constraint(w_id, var_id, b_ub);
+      add_dbm_constraint(var_id, w_id, b_mlb);
+    }
+    else {
+      // We have to add the constraint `v + w == b', over-approximating it
+      // by computing lower and upper bounds for `w'.
+      const N& mlb_w = dbm[w_id][0];
+      if (!is_plus_infinity(mlb_w)) {
+        // Add the constraint `v <= ub - lb_w'.
+        add_assign_r(dbm[0][var_id], b_ub, mlb_w, ROUND_UP);
+        reset_shortest_path_closed();
+      }
+      const N& ub_w = dbm[0][w_id];
+      if (!is_plus_infinity(ub_w)) {
+        // Add the constraint `v >= lb - ub_w'.
+        add_assign_r(dbm[var_id][0], ub_w, b_mlb, ROUND_UP);
+        reset_shortest_path_closed();
+      }
+    }
+  }
+  return;
+}
+
+// General case.
+// Either t == 2, so that
+// lf == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+// or t == 1, lf == i*w + b, but i <> [+/-1, +/-1].
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::two_variables_affine_form_image(const dimension_type& var_id,
+           const Linear_Form< Interval<T, Interval_Info> >& lf,
+                             const dimension_type& space_dim) {
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  reset_shortest_path_closed();
+
+  Linear_Form< Interval<T, Interval_Info> > minus_lf(lf);
+  minus_lf.negate();
+
+  // Declare temporaries outside the loop.
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  // Update binary constraints on var FIRST.
+  for (dimension_type curr_var = 1; curr_var < var_id; ++curr_var) {
+    Variable current(curr_var - 1);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+  }
+  for (dimension_type curr_var = var_id + 1; curr_var <= space_dim;
+                                                      ++curr_var) {
+    Variable current(curr_var - 1);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+  }
+  // Finally, update unary constraints on var.
+  PPL_DIRTY_TEMP(N, lf_ub);
+  linear_form_upper_bound(lf, lf_ub);
+  PPL_DIRTY_TEMP(N, minus_lf_ub);
+  linear_form_upper_bound(minus_lf, minus_lf_ub);
+  assign_r(dbm[0][var_id], lf_ub, ROUND_NOT_NEEDED);
+  assign_r(dbm[var_id][0], minus_lf_ub, ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>::refine_with_linear_form_inequality(
+                   const Linear_Form< Interval<T, Interval_Info> >& left,
+                   const Linear_Form< Interval<T, Interval_Info> >& right) {
+    // Check that T is a floating point type.
+    PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                    "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+                    " T not a floating point type.");
+
+    //We assume that the analyzer will not try to apply an unreachable filter.
+    PPL_ASSERT(!marked_empty());
+
+    // Dimension-compatibility checks.
+    // The dimensions of `left' and `right' should not be greater than the
+    // dimension of `*this'.
+    const dimension_type left_space_dim = left.space_dimension();
+    const dimension_type space_dim = space_dimension();
+    if (space_dim < left_space_dim)
+      throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "left", left);
+
+    const dimension_type right_space_dim = right.space_dimension();
+    if (space_dim < right_space_dim)
+      throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "right", right);
+
+  // Number of non-zero coefficients in `left': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type left_t = 0;
+  // Variable-index of the last non-zero coefficient in `left', if any.
+  dimension_type left_w_id = 0;
+  // Number of non-zero coefficients in `right': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type right_t = 0;
+  // Variable-index of the last non-zero coefficient in `right', if any.
+  dimension_type right_w_id = 0;
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  // Get information about the number of non-zero coefficients in `left'.
+  for (dimension_type i = left_space_dim; i-- > 0; )
+    if (left.coefficient(Variable(i)) != 0) {
+      if (left_t++ == 1)
+        break;
+      else
+        left_w_id = i;
+    }
+
+  // Get information about the number of non-zero coefficients in `right'.
+  for (dimension_type i = right_space_dim; i-- > 0; )
+    if (right.coefficient(Variable(i)) != 0) {
+      if (right_t++ == 1)
+        break;
+      else
+        right_w_id = i;
+    }
+
+  const FP_Interval_Type& left_w_coeff =
+          left.coefficient(Variable(left_w_id));
+  const FP_Interval_Type& right_w_coeff =
+          right.coefficient(Variable(right_w_id));
+
+  if (left_t == 0) {
+    if (right_t == 0) {
+      // The constraint involves constants only. Ignore it: it is up to
+      // the analyzer to handle it.
+      PPL_ASSERT(OK());
+      return;
+    }
+    else if (right_w_coeff == 1 || right_w_coeff == -1) {
+      left_inhomogeneous_refine(right_t, right_w_id, left, right);
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+  else if (left_t == 1) {
+    if (left_w_coeff == 1 || left_w_coeff == -1) {
+      if (right_t == 0 || (right_w_coeff == 1 || right_w_coeff == -1)) {
+        left_one_var_refine(left_w_id, right_t, right_w_id, left, right);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  general_refine(left_w_id, right_w_id, left, right);
+  PPL_ASSERT(OK());
+} // end of refine_with_linear_form_inequality
+
+template <typename T>
+template <typename U>
+void
+BD_Shape<T>
+::export_interval_constraints(U& dest) const {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim > dest.space_dimension())
+    throw std::invalid_argument(
+               "BD_Shape<T>::export_interval_constraints");
+
+  // Expose all the interval constraints.
+  shortest_path_closure_assign();
+
+  if (marked_empty()) {
+    dest.set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  PPL_DIRTY_TEMP(N, tmp);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    // Set the upper bound.
+    const N& u = dbm_0[i+1];
+    if (!is_plus_infinity(u))
+      if (!dest.restrict_upper(i, u.raw_value()))
+        return;
+
+    // Set the lower bound.
+    const N& negated_l = dbm[i+1][0];
+    if (!is_plus_infinity(negated_l)) {
+      neg_assign_r(tmp, negated_l, ROUND_DOWN);
+      if (!dest.restrict_lower(i, tmp.raw_value()))
+        return;
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::left_inhomogeneous_refine(const dimension_type& right_t,
+                                       const dimension_type& right_w_id,
+                    const Linear_Form< Interval<T, Interval_Info> >& left,
+                    const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  if (right_t == 1) {
+    // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+    // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+      if (right_w_coeff == 1) {
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(right_w_id+1, 0, b_plus_minus_a_minus);
+        return;
+      }
+
+      if (right_w_coeff == -1) {
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(0, right_w_id+1, b_plus_minus_a_minus);
+        return;
+      }
+    }
+} // end of left_inhomogeneous_refine
+
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::left_one_var_refine(const dimension_type& left_w_id,
+                      const dimension_type& right_t,
+                      const dimension_type& right_w_id,
+                const Linear_Form< Interval<T, Interval_Info> >& left,
+                const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+    if (right_t == 0) {
+      // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+      // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+        left.coefficient(Variable(left_w_id));
+
+      if (left_w_coeff == 1) {
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(0, left_w_id+1, a_plus_minus_b_minus);
+        return;
+      }
+
+      if (left_w_coeff == -1) {
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(left_w_id+1, 0, a_plus_minus_b_minus);
+        return;
+      }
+    }
+    else if (right_t == 1) {
+      // The constraint has the form
+      // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+      // Reduce it to the constraint +/-x +/-y <= c+ - a-
+      // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+                              left.coefficient(Variable(left_w_id));
+
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+
+      bool is_left_coeff_one = (left_w_coeff == 1);
+      bool is_left_coeff_minus_one = (left_w_coeff == -1);
+      bool is_right_coeff_one = (right_w_coeff == 1);
+      bool is_right_coeff_minus_one = (right_w_coeff == -1);
+      if (left_w_id == right_w_id) {
+        if ((is_left_coeff_one && is_right_coeff_one)
+            ||
+            (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+          // Here we have an identity or a constants-only constraint.
+          return;
+        }
+        if (is_left_coeff_one && is_right_coeff_minus_one) {
+          // We fall back to a previous case.
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                            ROUND_UP);
+          add_dbm_constraint(0, left_w_id + 1, a_plus_minus_b_minus);
+          return;
+        }
+        if (is_left_coeff_minus_one && is_right_coeff_one) {
+          // We fall back to a previous case.
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                            ROUND_UP);
+          add_dbm_constraint(right_w_id + 1, 0, a_plus_minus_b_minus);
+          return;
+        }
+      }
+      else if (is_left_coeff_minus_one && is_right_coeff_one) {
+        // over-approximate (if is it possible) the inequality
+        // -B + [b1, b2] <= A + [a1, a2] by adding the constraints
+        // -B <= upper_bound(A) + (a2 - b1) and
+        // -A <= upper_bound(B) + (a2 - b1)
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+        PPL_DIRTY_TEMP(N, ub);
+        ub = dbm[0][right_w_id + 1];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(left_w_id + 1, 0, ub);
+        }
+        ub = dbm[0][left_w_id + 1];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(right_w_id + 1, 0, ub);
+        }
+        return;
+      }
+      if (is_left_coeff_one && is_right_coeff_minus_one) {
+        // over-approximate (if is it possible) the inequality
+        // B + [b1, b2] <= -A + [a1, a2] by adding the constraints
+        // B <= upper_bound(-A) + (a2 - b1) and
+        // A <= upper_bound(-B) + (a2 - b1)
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+        PPL_DIRTY_TEMP(N, ub);
+        ub = dbm[right_w_id + 1][0];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(0, left_w_id + 1, ub);
+        }
+        ub = dbm[left_w_id + 1][0];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(0, right_w_id + 1, ub);
+        }
+            return;
+      }
+      if (is_left_coeff_one && is_right_coeff_one) {
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(right_w_id+1, left_w_id+1, c_plus_minus_a_minus);
+        return;
+      }
+      if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(left_w_id+1, right_w_id+1, c_plus_minus_a_minus);
+        return;
+      }
+    }
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::general_refine(const dimension_type& left_w_id,
+                 const dimension_type& right_w_id,
+                 const Linear_Form< Interval<T, Interval_Info> >& left,
+                 const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  Linear_Form<FP_Interval_Type> right_minus_left(right);
+  right_minus_left -= left;
+
+  // Declare temporaries outside of the loop.
+  PPL_DIRTY_TEMP(N, low_coeff);
+  PPL_DIRTY_TEMP(N, high_coeff);
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  dimension_type max_w_id = std::max(left_w_id, right_w_id);
+
+  for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+    for (dimension_type second_v = first_v+1;
+         second_v <= max_w_id; ++second_v) {
+      const FP_Interval_Type& lfv_coefficient =
+        left.coefficient(Variable(first_v));
+      const FP_Interval_Type& lsv_coefficient =
+        left.coefficient(Variable(second_v));
+      const FP_Interval_Type& rfv_coefficient =
+        right.coefficient(Variable(first_v));
+      const FP_Interval_Type& rsv_coefficient =
+        right.coefficient(Variable(second_v));
+      // We update the constraints only when both variables appear in at
+      // least one argument.
+      bool do_update = false;
+      assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0) {
+        assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0)
+          do_update = true;
+        else {
+          assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+        }
+      }
+      else {
+        assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0) {
+          assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+          else {
+            assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+            assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+            if (low_coeff != 0 || high_coeff != 0)
+              do_update = true;
+          }
+        }
+      }
+
+      if (do_update) {
+        Variable first(first_v);
+        Variable second(second_v);
+        dimension_type n_first_var = first_v +1 ;
+        dimension_type n_second_var = second_v + 1;
+        linear_form_upper_bound(right_minus_left - first + second,
+                                upper_bound);
+        add_dbm_constraint(n_first_var, n_second_var, upper_bound);
+        linear_form_upper_bound(right_minus_left + first - second,
+                                upper_bound);
+        add_dbm_constraint(n_second_var, n_first_var, upper_bound);
+      }
+    }
+  }
+
+  // Finally, update the unary constraints.
+  for (dimension_type v = 0; v < max_w_id; ++v) {
+    const FP_Interval_Type& lv_coefficient =
+      left.coefficient(Variable(v));
+    const FP_Interval_Type& rv_coefficient =
+      right.coefficient(Variable(v));
+    // We update the constraints only if v appears in at least one of the
+    // two arguments.
+    bool do_update = false;
+    assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (low_coeff != 0 || high_coeff != 0)
+      do_update = true;
+    else {
+      assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0)
+        do_update = true;
+    }
+
+    if (do_update) {
+      Variable var(v);
+      dimension_type n_var = v + 1;
+      linear_form_upper_bound(right_minus_left + var, upper_bound);
+      add_dbm_constraint(0, n_var, upper_bound);
+      linear_form_upper_bound(right_minus_left - var, upper_bound);
+      add_dbm_constraint(n_var, 0, upper_bound);
+    }
+  }
+
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+                        N& result) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "BD_Shape<T>::linear_form_upper_bound:"
+                     " T not a floating point type.");
+
+  const dimension_type lf_space_dimension = lf.space_dimension();
+  PPL_ASSERT(lf_space_dimension <= space_dimension());
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  PPL_DIRTY_TEMP(N, curr_lb);
+  PPL_DIRTY_TEMP(N, curr_ub);
+  PPL_DIRTY_TEMP(N, curr_var_ub);
+  PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+  PPL_DIRTY_TEMP(N, first_comparison_term);
+  PPL_DIRTY_TEMP(N, second_comparison_term);
+
+  PPL_DIRTY_TEMP(N, negator);
+
+  assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+  for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+       ++curr_var) {
+    n_var = curr_var + 1;
+    const FP_Interval_Type&
+      curr_coefficient = lf.coefficient(Variable(curr_var));
+    assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (curr_lb != 0 || curr_ub != 0) {
+      assign_r(curr_var_ub, dbm[0][n_var], ROUND_NOT_NEEDED);
+      neg_assign_r(curr_minus_var_ub, dbm[n_var][0], ROUND_NOT_NEEDED);
+      // Optimize the most commons cases: curr = +/-[1, 1].
+      if (curr_lb == 1 && curr_ub == 1) {
+        add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+                     ROUND_UP);
+      }
+      else if (curr_lb == -1 && curr_ub == -1) {
+        neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+                     ROUND_NOT_NEEDED);
+        add_assign_r(result, result, negator, ROUND_UP);
+      }
+      else {
+        // Next addend will be the maximum of four quantities.
+        assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+                         ROUND_UP);
+        add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+
+        add_assign_r(result, result, first_comparison_term, ROUND_UP);
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+                             const Linear_Expression& expr,
+                             Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of
+  // the bounded difference shapes.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = expr.last_nonzero();
+
+  if (j != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, j))
+      ++t;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr = b, with `b' a constant;
+  // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t > 1, the `expr' is of the general form.
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.get(Variable(j - 1));
+    if (a == denominator || a == -denominator) {
+      // Case 2: expr = a*w + b, with a = +/- denominator.
+      if (j == var.space_dimension())
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, a);
+      else {
+        // `expr == a*w + b', where `w != v'.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        PPL_ASSERT(OK());
+      }
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    // The transformation is invertible.
+    Linear_Expression inverse((expr_v + denominator)*var);
+    inverse -= expr;
+    affine_image(var, inverse, expr_v);
+  }
+  else {
+    // Transformation not invertible: all constraints on `var' are lost.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > bds_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (bds_space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (bds_space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = ub_expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `ub_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `ub_expr', if any.
+  dimension_type w = ub_expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!ub_expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Now we know the form of `ub_expr':
+  // - If t == 0, then ub_expr == b, with `b' a constant;
+  // - If t == 1, then ub_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `ub_expr' is of the general form.
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: ub_expr == b.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    // Add the constraint `var <= b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `ub_expr'.
+    const Coefficient& a = ub_expr.get(Variable(w - 1));
+    if (a == denominator || a == minus_denom) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // Here `var' occurs in `ub_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var(bds_space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `ub_expr'.
+        affine_image(new_var, ub_expr, denominator);
+        // NOTE: enforce shortest-path closure for precision.
+        shortest_path_closure_assign();
+        PPL_ASSERT(!marked_empty());
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        // Now apply the affine upper bound, as recorded in `new_var'.
+        add_constraint(var <= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(bds_space_dim);
+        return;
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // ub_expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, ub_expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `ub_expr' into `pos_sum'
+  // taking into account the sign of `denominator'.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -ub_expr;
+  const Linear_Expression& sc_expr = is_sc ? ub_expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, pos_sum);
+  // Index of the variable that are unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+    const Coefficient& sc_i = *i;
+    const dimension_type i_dim = i.variable().space_dimension();
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i_dim];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(sign_i < 0);
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i_dim][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+    }
+  }
+  // Apply the affine lower bound.
+  generalized_affine_image(var,
+                           GREATER_OR_EQUAL,
+                           lb_expr,
+                           denominator);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1) {
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
+  }
+
+  const Coefficient& lb_expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (lb_expr_v + denominator)*var;
+  PPL_DIRTY_TEMP_COEFFICIENT(lb_inverse_denom);
+  neg_assign(lb_inverse_denom, lb_expr_v);
+  affine_image(new_var, lb_inverse, lb_inverse_denom);
+  shortest_path_closure_assign();
+  PPL_ASSERT(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(lb_inverse_denom))
+    add_constraint(var >= new_var);
+  else
+    add_constraint(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim);
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& expr,
+                                      Coefficient_traits::const_reference
+                                      denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Both shortest-path closure and reduction are lost.
+    reset_shortest_path_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.get(Variable(w - 1));
+    if (a == denominator || a == minus_denom) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      PPL_DIRTY_TEMP(N, d);
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        div_round_up(d, b, denominator);
+        if (w == v) {
+          // `expr' is of the form: a*v + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `v - w <= dbm_wv'
+            // into the constraint `v - w <= dbm_wv + b/denominator';
+            // forget each constraint `w - v <= dbm_vw'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+              assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+            N& dbm_v0 = dbm_v[0];
+            add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_v0, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w <= b/denominator'.
+            add_dbm_constraint(w, v, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v <= b/denominator - w'.
+            // Approximate it by computing a lower bound for `w'.
+            const N& dbm_w0 = dbm[w][0];
+            if (!is_plus_infinity(dbm_w0)) {
+              // Add the constraint `v <= b/denominator - lb_w'.
+              add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
+
+      case GREATER_OR_EQUAL:
+        div_round_up(d, b, minus_denom);
+        if (w == v) {
+          // `expr' is of the form: a*w + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `w - v <= dbm_vw'
+            // into the constraint `w - v <= dbm_vw - b/denominator';
+            // forget each constraint `v - w <= dbm_wv'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+              assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_0v - b/denominator'.
+            N& dbm_0v = dbm_0[v];
+            add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_0v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w >= b/denominator',
+            // i.e., `w - v <= -b/denominator'.
+            add_dbm_constraint(v, w, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v >= -w + b/denominator',
+            // i.e., `-v <= w - b/denominator'.
+            // Approximate it by computing an upper bound for `w'.
+            const N& dbm_0w = dbm_0[w];
+            if (!is_plus_infinity(dbm_0w)) {
+              // Add the constraint `-v <= ub_w - b/denominator'.
+              add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
+
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  // Speculative allocation of temporaries to be used in the following loops.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `sc_expr' into `sum'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `sc_expr'.
+    PPL_ASSERT(w != 0);
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const dimension_type i_dim = i.variable().space_dimension();
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `v'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      PPL_ASSERT(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+    break;
+
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      const dimension_type i_dim = i.variable().space_dimension();
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      PPL_ASSERT(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    PPL_UNREACHABLE;
+    break;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // The image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    --j_lhs;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is a bounded difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not a bounded difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, denom);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // a bounded differences (since it has 3 variables at least).
+      // Thus, the method refine_no_check() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= new_var);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // The preimage of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+    neg_assign(inverse_denom, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+    return;
+  }
+
+  refine(var, relsym, expr, denominator);
+  // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (bds_space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (bds_space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // The preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    --j_lhs;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In this case, preimage and image happen to be the same.
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, denom);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+
+      // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+    }
+    else {
+
+      // Some variables in `lhs' also occur in `rhs'.
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(bds_space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `lhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, lhs);
+      // Existentiallly quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == a_rhs*v + b_rhs' where `a_rhs' is in {0, 1},
+      // then one of the following constraints will be added,
+      // since it is a bounded difference. Else the method
+      // refine_no_check() will ignore it, because the
+      // constraint is NOT a bounded difference.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(new_var <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(bds_space_dim);
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  if (marked_shortest_path_reduced()) {
+    // Disregard redundant constraints.
+    cs = minimized_constraints();
+    return cs;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(a);
+  PPL_DIRTY_TEMP_COEFFICIENT(b);
+  // Go through all the unary constraints in `dbm'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    const Variable x(j-1);
+    const N& dbm_0j = dbm_0[j];
+    const N& dbm_j0 = dbm[j][0];
+    if (is_additive_inverse(dbm_j0, dbm_0j)) {
+      // We have a unary equality constraint.
+      numer_denom(dbm_0j, b, a);
+      cs.insert(a*x == b);
+    }
+    else {
+      // We have 0, 1 or 2 unary inequality constraints.
+      if (!is_plus_infinity(dbm_0j)) {
+        numer_denom(dbm_0j, b, a);
+        cs.insert(a*x <= b);
+      }
+      if (!is_plus_infinity(dbm_j0)) {
+        numer_denom(dbm_j0, b, a);
+        cs.insert(-a*x <= b);
+      }
+    }
+  }
+
+  // Go through all the binary constraints in `dbm'.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    const Variable y(i-1);
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Variable x(j-1);
+      const N& dbm_ij = dbm_i[j];
+      const N& dbm_ji = dbm[j][i];
+      if (is_additive_inverse(dbm_ji, dbm_ij)) {
+        // We have a binary equality constraint.
+        numer_denom(dbm_ij, b, a);
+        cs.insert(a*x - a*y == b);
+      }
+      else {
+        // We have 0, 1 or 2 binary inequality constraints.
+        if (!is_plus_infinity(dbm_ij)) {
+          numer_denom(dbm_ij, b, a);
+          cs.insert(a*x - a*y <= b);
+        }
+        if (!is_plus_infinity(dbm_ji)) {
+          numer_denom(dbm_ji, b, a);
+          cs.insert(a*y - a*x <= b);
+        }
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+  shortest_path_reduction_assign();
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+  // Compute leader information.
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+  std::vector<dimension_type> leader_indices;
+  compute_leader_indices(leaders, leader_indices);
+  const dimension_type num_leaders = leader_indices.size();
+
+  // Go through the non-leaders to generate equality constraints.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    const dimension_type leader = leaders[i];
+    if (i != leader) {
+      // Generate the constraint relating `i' and its leader.
+      if (leader == 0) {
+        // A unary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+        numer_denom(dbm_0[i], numer, denom);
+        cs.insert(denom*Variable(i-1) == numer);
+      }
+      else {
+        // A binary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+        numer_denom(dbm[i][leader], numer, denom);
+        cs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+      }
+    }
+  }
+
+  // Go through the leaders to generate inequality constraints.
+  // First generate all the unary inequalities.
+  const Bit_Row& red_0 = redundancy_dbm[0];
+  for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leader_indices[l_i];
+    if (!red_0[i]) {
+      numer_denom(dbm_0[i], numer, denom);
+      cs.insert(denom*Variable(i-1) <= numer);
+    }
+    if (!redundancy_dbm[i][0]) {
+      numer_denom(dbm[i][0], numer, denom);
+      cs.insert(-denom*Variable(i-1) <= numer);
+    }
+  }
+  // Then generate all the binary inequalities.
+  for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leader_indices[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    const Bit_Row& red_i = redundancy_dbm[i];
+    for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leader_indices[l_j];
+      if (!red_i[j]) {
+        numer_denom(dbm_i[j], numer, denom);
+        cs.insert(denom*Variable(j-1) - denom*Variable(i-1) <= numer);
+      }
+      if (!redundancy_dbm[j][i]) {
+        numer_denom(dbm[j][i], numer, denom);
+        cs.insert(denom*Variable(i-1) - denom*Variable(j-1) <= numer);
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  dimension_type old_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > old_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting BDS should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_invalid_argument("expand_dimension(v, m)",
+                           "adding m new space dimensions exceeds "
+                           "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  const dimension_type v_id = var.id() + 1;
+  const DB_Row<N>& dbm_v = dbm[v_id];
+  for (dimension_type i = old_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const N& dbm_i_v = dbm[i][v_id];
+    const N& dbm_v_i = dbm_v[i];
+    for (dimension_type j = old_dim+1; j < old_dim+m+1; ++j) {
+      dbm_i[j] = dbm_i_v;
+      dbm[j][i] = dbm_v_i;
+    }
+  }
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+                                   Variable dest) {
+  const dimension_type space_dim = space_dimension();
+  // `dest' should be one of the dimensions of the BDS.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the BDS.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  shortest_path_closure_assign();
+  if (!marked_empty()) {
+    // Recompute the elements of the row and the column corresponding
+    // to variable `dest' by taking the join of their value with the
+    // value of the corresponding elements in the row and column of the
+    // variable `vars'.
+    const dimension_type v_id = dest.id() + 1;
+    DB_Row<N>& dbm_v = dbm[v_id];
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vs_end = vars.end(); i != vs_end; ++i) {
+      const dimension_type to_be_folded_id = *i + 1;
+      const DB_Row<N>& dbm_to_be_folded_id = dbm[to_be_folded_id];
+      for (dimension_type j = space_dim + 1; j-- > 0; ) {
+        max_assign(dbm[j][v_id], dbm[j][to_be_folded_id]);
+        max_assign(dbm_v[j], dbm_to_be_folded_id[j]);
+      }
+    }
+  }
+  remove_space_dimensions(vars);
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+  if (std::numeric_limits<T>::is_integer)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  shortest_path_closure_assign();
+  if (space_dim == 0 || marked_empty())
+    return;
+
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (i != j)
+        drop_some_non_integer_points_helper(dbm_i[j]);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(const Variables_Set& vars,
+                                          Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+    return;
+
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Variables_Set::const_iterator v_begin = vars.begin();
+  const Variables_Set::const_iterator v_end = vars.end();
+  PPL_ASSERT(v_begin != v_end);
+  // Unary constraints on a variable occurring in `vars'.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+    const dimension_type i = *v_i + 1;
+    drop_some_non_integer_points_helper(dbm_0[i]);
+    drop_some_non_integer_points_helper(dbm[i][0]);
+  }
+
+  // Binary constraints where both variables occur in `vars'.
+  for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+    const dimension_type i = *v_i + 1;
+    DB_Row<N>& dbm_i = dbm[i];
+    for (Variables_Set::const_iterator v_j = v_begin; v_j != v_end; ++v_j) {
+      const dimension_type j = *v_j + 1;
+      if (i != j)
+        drop_some_non_integer_points_helper(dbm_i[j]);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& bds) {
+  typedef typename BD_Shape<T>::coefficient_type N;
+  if (bds.is_universe())
+    s << "true";
+  else {
+    // We control empty bounded difference shape.
+    dimension_type n = bds.space_dimension();
+    if (bds.marked_empty())
+      s << "false";
+    else {
+      PPL_DIRTY_TEMP(N, v);
+      bool first = true;
+      for (dimension_type i = 0; i <= n; ++i)
+        for (dimension_type j = i + 1; j <= n; ++j) {
+          const N& c_i_j = bds.dbm[i][j];
+          const N& c_j_i = bds.dbm[j][i];
+          if (is_additive_inverse(c_j_i, c_i_j)) {
+            // We will print an equality.
+            if (first)
+              first = false;
+            else
+              s << ", ";
+            if (i == 0) {
+              // We have got a equality constraint with one variable.
+              s << Variable(j - 1);
+              s << " = " << c_i_j;
+            }
+            else {
+              // We have got a equality constraint with two variables.
+              if (sgn(c_i_j) >= 0) {
+                s << Variable(j - 1);
+                s << " - ";
+                s << Variable(i - 1);
+                s << " = " << c_i_j;
+              }
+              else {
+                s << Variable(i - 1);
+                s << " - ";
+                s << Variable(j - 1);
+                s << " = " << c_j_i;
+              }
+            }
+          }
+          else {
+            // We will print a non-strict inequality.
+            if (!is_plus_infinity(c_j_i)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with only one variable.
+                s << Variable(j - 1);
+                neg_assign_r(v, c_j_i, ROUND_DOWN);
+                s << " >= " << v;
+              }
+              else {
+                // We have got a constraint with two variables.
+                if (sgn(c_j_i) >= 0) {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  s << " <= " << c_j_i;
+                }
+                else {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  neg_assign_r(v, c_j_i, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+            if (!is_plus_infinity(c_i_j)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with only one variable.
+                s << Variable(j - 1);
+                s << " <= " << c_i_j;
+              }
+              else {
+                // We have got a constraint with two variables.
+                if (sgn(c_i_j) >= 0) {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  s << " <= " << c_i_j;
+                }
+                else {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  neg_assign_r(v, c_i_j, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+          }
+        }
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+  status.ascii_dump(s);
+  s << "\n";
+  dbm.ascii_dump(s);
+  s << "\n";
+  redundancy_dbm.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>)
+
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+  if (!dbm.ascii_load(s))
+    return false;
+  if (!redundancy_dbm.ascii_load(s))
+    return false;
+  return true;
+}
+
+template <typename T>
+memory_size_type
+BD_Shape<T>::external_memory_in_bytes() const {
+  return dbm.external_memory_in_bytes()
+    + redundancy_dbm.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+  // Check whether the difference-bound matrix is well-formed.
+  if (!dbm.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // An empty BDS is OK.
+  if (marked_empty())
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    for (dimension_type j = dbm.num_rows(); j-- > 0; )
+      if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                  << dbm[i][j] << "!"
+                  << std::endl;
+#endif
+        return false;
+      }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+                << dbm[i][i] << "!  (+inf was expected.)"
+                << std::endl;
+#endif
+      return false;
+    }
+
+  // Check whether the shortest-path closure information is legal.
+  if (marked_shortest_path_closed()) {
+    BD_Shape x = *this;
+    x.reset_shortest_path_closed();
+    x.shortest_path_closure_assign();
+    if (x.dbm != dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as closed but it is not!"
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise shortest-path closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the shortest-path reduction information is legal.
+    if (marked_shortest_path_reduced()) {
+      // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+      for (dimension_type i = dbm.num_rows(); i-- > 0; )
+        for (dimension_type j = dbm.num_rows(); j-- > 0; )
+          if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+            using namespace Parma_Polyhedra_Library::IO_Operators;
+            std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                      << dbm[i][j] << " is marked as non-redundant!"
+                      << std::endl;
+#endif
+            return false;
+          }
+
+      BD_Shape x = *this;
+      x.reset_shortest_path_reduced();
+      x.shortest_path_reduction_assign();
+      if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+        std::cerr << "BD_Shape is marked as reduced but it is not!"
+                  << std::endl;
+#endif
+        return false;
+      }
+    }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const BD_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+                                          const Linear_Expression& le) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << le << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const char* le_name,
+                                          const Linear_Expression& le) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << le_name << "->space_dimension() == "
+    << le.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template<typename Interval_Info>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const char* lf_name,
+                                          const Linear_Form< Interval<T,
+                                          Interval_Info> >& lf) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << lf_name << "->space_dimension() == "
+    << lf.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_invalid_argument(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_templates_hh)
diff --git a/src/BD_Shape_types.hh b/src/BD_Shape_types.hh
new file mode 100644
index 0000000..5209605
--- /dev/null
+++ b/src/BD_Shape_types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_BD_Shape_types_hh
+#define PPL_BD_Shape_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+class BD_Shape_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Shape_types_hh)
diff --git a/src/BHRZ03_Certificate.cc b/src/BHRZ03_Certificate.cc
new file mode 100644
index 0000000..b640ff7
--- /dev/null
+++ b/src/BHRZ03_Certificate.cc
@@ -0,0 +1,318 @@
+/* BHRZ03_Certificate class implementation (non-inline member functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "BHRZ03_Certificate_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::BHRZ03_Certificate::BHRZ03_Certificate(const Polyhedron& ph)
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(0),
+    num_rays_null_coord(ph.space_dimension(), 0) {
+  // TODO: provide a correct and reasonably efficient
+  // implementation for NNC polyhedra.
+
+  // The computation of the certificate requires both the
+  // constraint and the generator systems in minimal form.
+  ph.minimize();
+  // It is assumed that `ph' is not an empty polyhedron.
+  PPL_ASSERT(!ph.marked_empty());
+
+  // The dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  affine_dim = space_dim;
+  PPL_ASSERT(num_constraints == 0);
+  const Constraint_System& cs = ph.minimized_constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    ++num_constraints;
+    if (i->is_equality())
+      --affine_dim;
+  }
+
+  PPL_ASSERT(lin_space_dim == 0);
+  PPL_ASSERT(num_points == 0);
+  const Generator_System& gs = ph.minimized_generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    switch (i->type()) {
+    case Generator::POINT:
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      ++num_points;
+      break;
+    case Generator::RAY:
+      // For each i such that 0 <= j < space_dim,
+      // `num_rays_null_coord[j]' will be the number of rays
+      // having exactly `j' coordinates equal to 0.
+      ++num_rays_null_coord[i->expression().num_zeroes(1, space_dim + 1)];
+      break;
+    case Generator::LINE:
+      // Since the generator systems is minimized, the dimension of
+      // the lineality space is equal to the number of lines.
+      ++lin_space_dim;
+      break;
+    }
+  PPL_ASSERT(OK());
+
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, constraints might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to generators when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the constraint
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+}
+
+int
+PPL::BHRZ03_Certificate::compare(const BHRZ03_Certificate& y) const {
+  PPL_ASSERT(OK() && y.OK());
+  if (affine_dim != y.affine_dim)
+    return (affine_dim > y.affine_dim) ? 1 : -1;
+  if (lin_space_dim != y.lin_space_dim)
+    return (lin_space_dim > y.lin_space_dim) ? 1 : -1;
+  if (num_constraints != y.num_constraints)
+    return (num_constraints > y.num_constraints) ? 1 : -1;
+  if (num_points != y.num_points)
+    return (num_points > y.num_points) ? 1 : -1;
+
+  const dimension_type space_dim = num_rays_null_coord.size();
+  PPL_ASSERT(num_rays_null_coord.size() == y.num_rays_null_coord.size());
+  // Note: iterating upwards, because we have to check first
+  // the number of rays having more NON-zero coordinates.
+  for (dimension_type i = 0; i < space_dim; ++i)
+    if (num_rays_null_coord[i] != y.num_rays_null_coord[i])
+      return (num_rays_null_coord[i] > y.num_rays_null_coord[i]) ? 1 : -1;
+  // All components are equal.
+  return 0;
+}
+
+int
+PPL::BHRZ03_Certificate::compare(const Polyhedron& ph) const {
+  PPL_ASSERT(ph.space_dimension() == num_rays_null_coord.size());
+
+  // TODO: provide a correct and reasonably efficient
+  // implementation for NNC polyhedra.
+
+  // The computation of the certificate requires both the
+  // constraint and the generator systems in minimal form.
+  ph.minimize();
+  // It is assumed that `ph' is a polyhedron containing the
+  // polyhedron described by `*this': hence, it cannot be empty.
+  PPL_ASSERT(!ph.marked_empty());
+
+  // The dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  dimension_type ph_affine_dim = space_dim;
+  dimension_type ph_num_constraints = 0;
+  const Constraint_System& cs = ph.minimized_constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    ++ph_num_constraints;
+    if (i->is_equality())
+      --ph_affine_dim;
+  }
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, constraints might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to generators when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the constraint
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+
+  // If the dimension of `ph' is increasing, the chain is stabilizing.
+  if (ph_affine_dim > affine_dim)
+    return 1;
+
+  // At this point the two polyhedra must have the same dimension.
+  PPL_ASSERT(ph_affine_dim == affine_dim);
+
+  // Speculative optimization: in order to better exploit the incrementality
+  // of the comparison, we do not compute information about rays here,
+  // hoping that the other components will be enough.
+  dimension_type ph_lin_space_dim = 0;
+  dimension_type ph_num_points = 0;
+  const Generator_System& gs = ph.minimized_generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    switch (i->type()) {
+    case Generator::POINT:
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      ++ph_num_points;
+      break;
+    case Generator::RAY:
+      break;
+    case Generator::LINE:
+      // Since the generator systems is minimized, the dimension of
+      // the lineality space is equal to the number of lines.
+      ++ph_lin_space_dim;
+      break;
+    }
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, constraints might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to generators when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the constraint
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+
+  // If the dimension of the lineality space is increasing,
+  // then the chain is stabilizing.
+  if (ph_lin_space_dim > lin_space_dim)
+    return 1;
+
+  // At this point the lineality space of the two polyhedra must have
+  // the same dimension.
+  PPL_ASSERT(ph_lin_space_dim == lin_space_dim);
+
+  // If the number of constraints of `ph' is decreasing, then the chain
+  // is stabilizing. If it is increasing, the chain is not stabilizing.
+  // If they are equal, further investigation is needed.
+  if (ph_num_constraints != num_constraints)
+    return (ph_num_constraints < num_constraints) ? 1 : -1;
+
+  // If the number of points of `ph' is decreasing, then the chain
+  // is stabilizing. If it is increasing, the chain is not stabilizing.
+  // If they are equal, further investigation is needed.
+  if (ph_num_points != num_points)
+    return (ph_num_points < num_points) ? 1 : -1;
+
+  // The speculative optimization was not worth:
+  // compute information about rays.
+  std::vector<dimension_type> ph_num_rays_null_coord(ph.space_dim, 0);
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    if (i->is_ray())
+      ++ph_num_rays_null_coord[i->expression().num_zeroes(1, space_dim + 1)];
+
+  // Compare (lexicographically) the two vectors:
+  // if ph_num_rays_null_coord < num_rays_null_coord the chain is stabilizing.
+  for (dimension_type i = 0; i < space_dim; ++i)
+    if (ph_num_rays_null_coord[i] != num_rays_null_coord[i])
+      return (ph_num_rays_null_coord[i] < num_rays_null_coord[i]) ? 1 : -1;
+
+  // All components are equal.
+  return 0;
+}
+
+bool
+PPL::BHRZ03_Certificate::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The dimension of the vector space.
+  const dimension_type space_dim = num_rays_null_coord.size();
+
+  if (affine_dim > space_dim) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+         << endl
+         << "the affine dimension is greater than the space dimension!"
+         << endl;
+#endif
+    return false;
+  }
+
+  if (lin_space_dim > affine_dim) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+         << endl
+         << "the lineality space dimension is greater than "
+         << "the affine dimension!"
+         << endl;
+#endif
+    return false;
+  }
+
+  if (num_constraints < space_dim - affine_dim) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+         << endl
+         << "in a vector space of dimension `n',"
+         << "any polyhedron of affine dimension `k'" << endl
+         << "should have `n-k' non-redundant constraints at least."
+         << endl
+         << "Here space_dim = " << space_dim << ", "
+         << "affine_dim = " << affine_dim << ", "
+         << "but num_constraints = " << num_constraints << "!"
+         << endl;
+#endif
+    return false;
+  }
+
+  if (num_points == 0) {
+#ifndef NDEBUG
+    cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+         << endl
+         << "the generator system has no points!"
+         << endl;
+#endif
+    return false;
+  }
+
+  if (lin_space_dim == space_dim) {
+    // This was a universe polyhedron.
+    if (num_constraints > 0) {
+#ifndef NDEBUG
+      cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+           << endl
+           << "a universe polyhedron has non-redundant constraints!"
+           << endl;
+#endif
+      return false;
+    }
+
+    if (num_points != 1) {
+#ifndef NDEBUG
+      cerr << "In the BHRZ03 certificate about a non-empty polyhedron:"
+           << endl
+           << "a universe polyhedron has more than one non-redundant point!"
+           << endl;
+#endif
+      return false;
+    }
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/BHRZ03_Certificate_defs.hh b/src/BHRZ03_Certificate_defs.hh
new file mode 100644
index 0000000..433f5d6
--- /dev/null
+++ b/src/BHRZ03_Certificate_defs.hh
@@ -0,0 +1,118 @@
+/* BHRZ03_Certificate class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BHRZ03_Certificate_defs_hh
+#define PPL_BHRZ03_Certificate_defs_hh 1
+
+#include "BHRZ03_Certificate_types.hh"
+#include "Polyhedron_types.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+#include <vector>
+
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, BHRZ03_Certificate
+  can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+  //! Default constructor.
+  BHRZ03_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  BHRZ03_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  BHRZ03_Certificate(const BHRZ03_Certificate& y);
+
+  //! Destructor.
+  ~BHRZ03_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    BHRZ03 widening.
+  */
+  int compare(const BHRZ03_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for
+    polyhedron \p ph is strictly smaller than \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_stabilizing(const Polyhedron& ph) const;
+
+  //! A total ordering on BHRZ03 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on BHRZ03 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const BHRZ03_Certificate& x,
+                    const BHRZ03_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Dimension of the lineality space of the polyhedron.
+  dimension_type lin_space_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+  /*! \brief
+    Number of non-redundant points in a generator system
+    for the polyhedron.
+  */
+  dimension_type num_points;
+  /*! \brief
+    A vector containing, for each index `0 <= i < space_dim',
+    the number of non-redundant rays in a generator system of the
+    polyhedron having exactly `i' null coordinates.
+  */
+  std::vector<dimension_type> num_rays_null_coord;
+};
+
+#include "BHRZ03_Certificate_inlines.hh"
+
+#endif // !defined(PPL_BHRZ03_Certificate_defs_hh)
diff --git a/src/BHRZ03_Certificate_inlines.hh b/src/BHRZ03_Certificate_inlines.hh
new file mode 100644
index 0000000..6d17f7e
--- /dev/null
+++ b/src/BHRZ03_Certificate_inlines.hh
@@ -0,0 +1,63 @@
+/* BHRZ03_Certificate class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_BHRZ03_Certificate_inlines_hh
+#define PPL_BHRZ03_Certificate_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate()
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+    num_rays_null_coord() {
+  // This is the certificate for a zero-dim universe polyhedron.
+  PPL_ASSERT(OK());
+}
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+  : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+    num_constraints(y.num_constraints), num_points(y.num_points),
+    num_rays_null_coord(y.num_rays_null_coord) {
+}
+
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
+}
+
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+  return compare(ph) == 1;
+}
+
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+                                        const BHRZ03_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this LGO relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BHRZ03_Certificate_inlines_hh)
diff --git a/src/BHRZ03_Certificate_types.hh b/src/BHRZ03_Certificate_types.hh
new file mode 100644
index 0000000..f025348
--- /dev/null
+++ b/src/BHRZ03_Certificate_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_BHRZ03_Certificate_types_hh
+#define PPL_BHRZ03_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BHRZ03_Certificate_types_hh)
diff --git a/src/BUGS.cc.dist b/src/BUGS.cc.dist
new file mode 100644
index 0000000..6de4b3f
--- /dev/null
+++ b/src/BUGS.cc.dist
@@ -0,0 +1,24 @@
+extern const char* const BUGS_array[23] = {
+  "",
+  "The PPL developers encourage you to report any bugs you find using the",
+  "bug tracking system available at https://www.cs.unipr.it/mantis/ .",
+  "Here `bug' should be interpreted in its broadest sense: outright",
+  "software errors, misfeatures, bad interfaces, missing or unclear",
+  "documentation... whatever is a subject for possible improvement.",
+  "",
+  "As far as software bugs are concerned, the best reports are those that",
+  "are reproducible.  Including (or pointing us to) code that exhibits",
+  "the reported misbehavior is the best thing you can do to help us fix",
+  "the library.  Of course, this is not always possible and we will",
+  "welcome any kind of bug report.  Anyway, you may be interested to read",
+  "http://www.chiark.greenend.org.uk/~sgtatham/bugs.html on how to report",
+  "bugs effectively.",
+  "",
+  "",
+  "KNOWN BUGS",
+  "==========",
+  "",
+  "All known bugs were resolved before the release.  It is likely that",
+  "there are still bugs in the released version.  Any bugs found after",
+  "the release will be listed at http://bugseng.com/products/ppl/Bugs/ .",
+  0};
diff --git a/src/BUGS.hh.dist b/src/BUGS.hh.dist
new file mode 100644
index 0000000..586ffeb
--- /dev/null
+++ b/src/BUGS.hh.dist
@@ -0,0 +1,4 @@
+#ifndef PPL_BUGS_hh
+#define PPL_BUGS_hh 1
+extern const char* const BUGS_array[23];
+#endif // !defined(PPL_BUGS_hh)
diff --git a/src/Bit_Matrix.cc b/src/Bit_Matrix.cc
new file mode 100644
index 0000000..85eedf0
--- /dev/null
+++ b/src/Bit_Matrix.cc
@@ -0,0 +1,265 @@
+/* Bit_Matrix class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Bit_Matrix_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "globals_defs.hh"
+#include "swapping_sort_templates.hh"
+#include "C_Integer.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Bit_Matrix&
+PPL::Bit_Matrix::operator=(const Bit_Matrix& y){
+  rows = y.rows;
+  row_size = y.row_size;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+void
+PPL::Bit_Matrix::sort_rows() {
+  const dimension_type num_elems = rows.size();
+  if (num_elems < 2)
+    return;
+
+  // Build the function objects implementing indirect sort comparison,
+  // indirect unique comparison and indirect swap operation.
+  using namespace Implementation;
+  typedef std::vector<Bit_Row> Cont;
+  typedef Indirect_Sort_Compare<Cont, Bit_Row_Less_Than> Sort_Compare;
+  typedef Indirect_Unique_Compare<Cont> Unique_Compare;
+  typedef Indirect_Swapper<Cont> Swapper;
+  const dimension_type num_duplicates
+    = indirect_sort_and_unique(num_elems,
+                               Sort_Compare(rows),
+                               Unique_Compare(rows),
+                               Swapper(rows));
+
+  if (num_duplicates > 0) {
+    typedef Cont::iterator Iter;
+    typedef std::iterator_traits<Iter>::difference_type diff_t;
+    Iter last = rows.end();
+    Iter first = last - static_cast<diff_t>(num_duplicates);
+    rows.erase(first, last);
+  }
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::add_recycled_row(Bit_Row& row) {
+  const dimension_type new_rows_size = rows.size() + 1;
+  if (rows.capacity() < new_rows_size) {
+    // Reallocation will take place.
+    std::vector<Bit_Row> new_rows;
+    new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+    new_rows.insert(new_rows.end(), new_rows_size, Bit_Row());
+    // Put the new row in place.
+    dimension_type i = new_rows_size-1;
+    new_rows[i].m_swap(row);
+    // Steal the old rows.
+    while (i-- > 0)
+      new_rows[i].m_swap(rows[i]);
+    // Put the new rows into place.
+    using std::swap;
+    swap(rows, new_rows);
+  }
+  else
+    // Reallocation will NOT take place: append an empty row
+    // and swap it with the new row.
+    rows.insert(rows.end(), Bit_Row())->m_swap(row);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::transpose() {
+  const Bit_Matrix& x = *this;
+  const dimension_type nrows = num_rows();
+  const dimension_type ncols = num_columns();
+  Bit_Matrix tmp(ncols, nrows);
+  for (dimension_type i = nrows; i-- > 0; )
+    for (unsigned long j = x[i].last();
+         j != C_Integer<unsigned long>::max; j = x[i].prev(j))
+      tmp[j].set(i);
+  m_swap(tmp);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::transpose_assign(const Bit_Matrix& y) {
+  const dimension_type y_num_rows = y.num_rows();
+  const dimension_type y_num_columns = y.num_columns();
+  Bit_Matrix tmp(y_num_columns, y_num_rows);
+  for (dimension_type i = y_num_rows; i-- > 0; )
+    for (unsigned long j = y[i].last();
+         j != C_Integer<unsigned long>::max; j = y[i].prev(j))
+      tmp[j].set(i);
+  m_swap(tmp);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::resize(dimension_type new_n_rows,
+                        dimension_type new_n_columns) {
+  PPL_ASSERT(OK());
+  const dimension_type old_num_rows = num_rows();
+  if (new_n_columns < row_size) {
+    const dimension_type num_preserved_rows
+      = std::min(old_num_rows, new_n_rows);
+    Bit_Matrix& x = *this;
+    for (dimension_type i = num_preserved_rows; i-- > 0; )
+      x[i].clear_from(new_n_columns);
+  }
+  row_size = new_n_columns;
+  if (new_n_rows > old_num_rows) {
+    if (rows.capacity() < new_n_rows) {
+      // Reallocation will take place.
+      std::vector<Bit_Row> new_rows;
+      new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_rows.insert(new_rows.end(), new_n_rows, Bit_Row());
+      // Steal the old rows.
+      for (dimension_type i = old_num_rows; i-- > 0; )
+        new_rows[i].m_swap(rows[i]);
+      // Put the new vector into place.
+      using std::swap;
+      swap(rows, new_rows);
+    }
+    else
+      // Reallocation will NOT take place.
+      rows.insert(rows.end(), new_n_rows - old_num_rows, Bit_Row());
+  }
+  else if (new_n_rows < old_num_rows)
+    // Drop some rows.
+    rows.resize(new_n_rows);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Bit_Matrix::ascii_dump(std::ostream& s) const {
+  const Bit_Matrix& x = *this;
+  const char separator = ' ';
+  s << num_rows() << separator << 'x' << separator
+    << num_columns() << "\n";
+  for (dimension_type i = 0; i < num_rows(); ++i) {
+    for (dimension_type j = 0; j < num_columns(); ++j)
+      s << x[i][j] << separator;
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Bit_Matrix)
+
+bool
+PPL::Bit_Matrix::ascii_load(std::istream& s) {
+  Bit_Matrix& x = *this;
+  dimension_type nrows;
+  dimension_type ncols;
+  std::string str;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str) || str != "x")
+    return false;
+  if (!(s >> ncols))
+    return false;
+  resize(nrows, ncols);
+
+  for (dimension_type i = 0; i < num_rows(); ++i)
+    for (dimension_type j = 0; j < num_columns(); ++j) {
+      int bit;
+      if (!(s >> bit))
+        return false;
+      if (bit != 0)
+        x[i].set(j);
+      else
+        x[i].clear(j);
+    }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Bit_Matrix::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(Dense_Row);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes();
+  return n;
+}
+
+bool
+PPL::Bit_Matrix::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const Bit_Matrix& x = *this;
+  for (dimension_type i = num_rows(); i-- > 0; ) {
+    const Bit_Row& row = x[i];
+    if (!row.OK())
+      return false;
+    else if (row.last() != C_Integer<unsigned long>::max
+             && row.last() >= row_size) {
+#ifndef NDEBUG
+      cerr << "Bit_Matrix[" << i << "] is a row with too many bits!"
+           << endl
+           << "(row_size == " << row_size
+           << ", row.last() == " << row.last() << ")"
+           << endl;
+#endif
+      return false;
+    }
+  }
+  return true;
+}
+
+#ifndef NDEBUG
+bool
+PPL::Bit_Matrix::check_sorted() const {
+  const Bit_Matrix& x = *this;
+  for (dimension_type i = num_rows(); i-- > 1; )
+    if (compare(x[i-1], x[i]) > 0)
+      return false;
+  return true;
+}
+#endif
+
+/*! \relates Parma_Polyhedra_Library::Bit_Matrix */
+bool
+PPL::operator==(const Bit_Matrix& x, const Bit_Matrix& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows()
+      || x.num_columns() != y.num_columns())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
diff --git a/src/Bit_Matrix_defs.hh b/src/Bit_Matrix_defs.hh
new file mode 100644
index 0000000..d2b67ee
--- /dev/null
+++ b/src/Bit_Matrix_defs.hh
@@ -0,0 +1,187 @@
+/* Bit_Matrix class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Matrix_defs_hh
+#define PPL_Bit_Matrix_defs_hh 1
+
+#include "Bit_Matrix_types.hh"
+#include "Linear_System_types.hh"
+#include "Bit_Row_defs.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Matrix */
+void swap(Bit_Matrix& x, Bit_Matrix& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Matrix {
+public:
+  //! Default constructor.
+  Bit_Matrix();
+
+  //! Construct a bit matrix with \p n_rows rows and \p n_columns columns.
+  Bit_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+  //! Copy constructor.
+  Bit_Matrix(const Bit_Matrix& y);
+
+  //! Destructor.
+  ~Bit_Matrix();
+
+  //! Assignment operator.
+  Bit_Matrix& operator=(const Bit_Matrix& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Bit_Matrix& y);
+
+  //! Subscript operator.
+  Bit_Row& operator[](dimension_type k);
+
+  //! Constant subscript operator.
+  const Bit_Row& operator[](dimension_type k) const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  //! Transposes the matrix.
+  void transpose();
+
+  //! Makes \p *this a transposed copy of \p y.
+  void transpose_assign(const Bit_Matrix& y);
+
+  //! Returns the maximum number of rows of a Bit_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the number of columns of \p *this.
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows of \p *this.
+  dimension_type num_rows() const;
+
+  //! Sorts the rows and removes duplicates.
+  void sort_rows();
+
+  //! Looks for \p row in \p *this, which is assumed to be sorted.
+  /*!
+    \return
+    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+    \param row
+    The row that will be searched for in the matrix.
+
+    Given a sorted bit matrix (this ensures better efficiency),
+    tells whether it contains the given row.
+  */
+  bool sorted_contains(const Bit_Row& row) const;
+
+  //! Adds \p row to \p *this.
+  /*!
+    \param row
+    The row whose implementation will be recycled.
+
+    The only thing that can be done with \p row upon return is destruction.
+  */
+  void add_recycled_row(Bit_Row& row);
+
+  //! Removes the last \p n rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Removes the last \p n columns.
+  /*!
+    The last \p n columns of the matrix are all made of zeros.
+    If such an assumption is not met, the behavior is undefined.
+  */
+  void remove_trailing_columns(dimension_type n);
+
+  //! Resizes the matrix copying the old contents.
+  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+  bool check_sorted() const;
+#endif
+
+private:
+  //! Contains the rows of the matrix.
+  std::vector<Bit_Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  /*! \ingroup PPL_CXX_interface */
+  struct Bit_Row_Less_Than {
+    bool operator()(const Bit_Row& x, const Bit_Row& y) const;
+  };
+
+  template <typename Row>
+  friend class Parma_Polyhedra_Library::Linear_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Matrix& x, const Bit_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Matrix& x, const Bit_Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Bit_Matrix_inlines.hh"
+
+#endif // !defined(PPL_Bit_Matrix_defs_hh)
diff --git a/src/Bit_Matrix_inlines.hh b/src/Bit_Matrix_inlines.hh
new file mode 100644
index 0000000..a5e2f96
--- /dev/null
+++ b/src/Bit_Matrix_inlines.hh
@@ -0,0 +1,149 @@
+/* Bit_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Matrix_inlines_hh
+#define PPL_Bit_Matrix_inlines_hh 1
+
+#include <algorithm>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Matrix::Bit_Matrix()
+  : rows(),
+    row_size(0) {
+}
+
+inline dimension_type
+Bit_Matrix::max_num_rows() {
+  return std::vector<Bit_Row>().max_size();
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const dimension_type n_rows,
+                       const dimension_type n_columns)
+  : rows(n_rows),
+    row_size(n_columns) {
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const Bit_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size) {
+}
+
+inline
+Bit_Matrix::~Bit_Matrix() {
+}
+
+inline void
+Bit_Matrix::remove_trailing_rows(const dimension_type n) {
+  // The number of rows to be erased cannot be greater
+  // than the actual number of the rows of the matrix.
+  PPL_ASSERT(n <= rows.size());
+  if (n != 0)
+    rows.resize(rows.size() - n);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::remove_trailing_columns(const dimension_type n) {
+  // The number of columns to be erased cannot be greater
+  // than the actual number of the columns of the matrix.
+  PPL_ASSERT(n <= row_size);
+  row_size -= n;
+  PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::m_swap(Bit_Matrix& y) {
+  using std::swap;
+  swap(row_size, y.row_size);
+  swap(rows, y.rows);
+}
+
+inline Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+inline const Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Bit_Matrix::num_columns() const {
+  return row_size;
+}
+
+inline dimension_type
+Bit_Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline void
+Bit_Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Bit_Row> tmp;
+  using std::swap;
+  swap(tmp, rows);
+  row_size = 0;
+}
+
+inline memory_size_type
+Bit_Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Bit_Matrix::Bit_Row_Less_Than::
+operator()(const Bit_Row& x, const Bit_Row& y) const {
+  return compare(x, y) < 0;
+}
+
+inline bool
+Bit_Matrix::sorted_contains(const Bit_Row& row) const {
+  PPL_ASSERT(check_sorted());
+  return std::binary_search(rows.begin(), rows.end(), row,
+                            Bit_Row_Less_Than());
+}
+
+/*! \relates Bit_Matrix */
+inline bool
+operator!=(const Bit_Matrix& x, const Bit_Matrix& y) {
+  return !(x == y);
+}
+
+/*! \relates Bit_Matrix */
+inline void
+swap(Bit_Matrix& x, Bit_Matrix& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Matrix_inlines_hh)
diff --git a/src/Bit_Matrix_types.hh b/src/Bit_Matrix_types.hh
new file mode 100644
index 0000000..11bfb42
--- /dev/null
+++ b/src/Bit_Matrix_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Bit_Matrix_types_hh
+#define PPL_Bit_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Matrix_types_hh)
diff --git a/src/Bit_Row.cc b/src/Bit_Row.cc
new file mode 100644
index 0000000..aabeb21
--- /dev/null
+++ b/src/Bit_Row.cc
@@ -0,0 +1,341 @@
+/* Bit_Row class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Bit_Row_defs.hh"
+#include "assert.hh"
+#include "C_Integer.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+unsigned long
+PPL::Bit_Row::first() const {
+  const mp_size_t vec_size = vec->_mp_size;
+  PPL_ASSERT(vec_size >= 0);
+  mp_srcptr p = vec->_mp_d;
+  for (mp_size_t li = 0; li < vec_size; ++li, ++p) {
+    const mp_limb_t limb = *p;
+    if (limb != 0)
+      return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+        + Implementation::first_one(limb);
+  }
+  return C_Integer<unsigned long>::max;
+}
+
+unsigned long
+PPL::Bit_Row::next(unsigned long position) const {
+  ++position;
+
+  // The alternative implementation using the mpz_scan1() function
+  // of GMP was measured to be slower that ours.  Here it is, in
+  // case mpz_scan1() is improved.
+  //
+  // <CODE>
+  //   unsigned long r = mpz_scan1(vec, position);
+  //   return (r == C_Integer<unsigned long>::max) ? -1 : r;
+  // </CODE>
+
+  const unsigned long uli = position / PPL_BITS_PER_GMP_LIMB;
+  mp_size_t li = static_cast<mp_size_t>(uli);
+  const mp_size_t vec_size = vec->_mp_size;
+  PPL_ASSERT(vec_size >= 0);
+  if (li >= vec_size)
+    return C_Integer<unsigned long>::max;
+
+  // Get the first limb.
+  mp_srcptr p = vec->_mp_d + li;
+
+  // Mask off any bits before `position' in the first limb.
+  mp_limb_t limb
+    = *p & ((~static_cast<mp_limb_t>(0)) << (position % PPL_BITS_PER_GMP_LIMB));
+
+  while (true) {
+    if (limb != 0)
+      return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+        + Implementation::first_one(limb);
+    ++li;
+    if (li == vec_size)
+      break;
+    ++p;
+    limb = *p;
+  }
+  return C_Integer<unsigned long>::max;
+}
+
+unsigned long
+PPL::Bit_Row::last() const {
+  mp_size_t li = vec->_mp_size;
+  PPL_ASSERT(li >= 0);
+  if (li == 0)
+    return C_Integer<unsigned long>::max;
+  --li;
+  const mp_srcptr p = vec->_mp_d + li;
+  const mp_limb_t limb = *p;
+  PPL_ASSERT(limb != 0);
+  return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB
+    + Implementation::last_one(limb);
+}
+
+unsigned long
+PPL::Bit_Row::prev(unsigned long position) const {
+  if (position == 0)
+    return C_Integer<unsigned long>::max;
+
+  --position;
+
+  const mp_size_t vec_size = vec->_mp_size;
+  PPL_ASSERT(vec_size > 0);
+  const unsigned long uli = position / PPL_BITS_PER_GMP_LIMB;
+  mp_size_t li = static_cast<mp_size_t>(uli);
+
+  mp_limb_t limb;
+  mp_srcptr p = vec->_mp_d;
+
+  // Get the first limb.
+  if (li >= vec_size) {
+    li = vec_size - 1;
+    p += li;
+    limb = *p;
+  }
+  else {
+    const mp_limb_t mask
+      = (~static_cast<mp_limb_t>(0))
+      >> (PPL_BITS_PER_GMP_LIMB - 1U - position % PPL_BITS_PER_GMP_LIMB);
+    p += li;
+    limb = *p & mask;
+  }
+
+  while (true) {
+    if (limb != 0)
+      return static_cast<unsigned long>(li) * PPL_BITS_PER_GMP_LIMB 
+        + Implementation::last_one(limb);
+    if (li == 0)
+      break;
+    --li;
+    --p;
+    limb = *p;
+  }
+  return C_Integer<unsigned long>::max;
+}
+
+bool
+PPL::Bit_Row::operator[](const unsigned long k) const {
+  const mp_size_t vec_size = vec->_mp_size;
+  PPL_ASSERT(vec_size >= 0);
+
+  const unsigned long i = k / static_cast<unsigned long>(GMP_NUMB_BITS);
+  if (i >= static_cast<unsigned long>(vec_size))
+    return false;
+
+  const mp_limb_t limb = *(vec->_mp_d + i);
+  return ((limb >> (k % static_cast<unsigned long>(GMP_NUMB_BITS))) & 1U) != 0;
+}
+
+void
+PPL::Bit_Row::set_until(unsigned long k) {
+  // FIXME, TODO: this is an inefficient implementation.
+  while (k-- > 0)
+    mpz_setbit(vec, k);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+int
+PPL::compare(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_size = x.vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  mp_size_t size = ((x_size > y_size) ? y_size : x_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if (xl != yl) {
+      // Get the ones where they are different.
+      const mp_limb_t diff = xl ^ yl;
+      // First bit that is different.
+      const mp_limb_t mask = diff & ~(diff-1);
+      return ((xl & mask) != 0) ? 1 : -1;
+    }
+    ++xp;
+    ++yp;
+    --size;
+  }
+  return (x_size == y_size) ? 0 : ((x_size > y_size) ? 1 : -1);
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::subset_or_equal(const Bit_Row& x, const Bit_Row& y) {
+  mp_size_t x_size = x.vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    if ((*xp & ~*yp) != 0)
+      return false;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+                     bool& strict_subset) {
+  mp_size_t x_size = x.vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  strict_subset = (x_size < y_size);
+  mp_limb_t xl;
+  mp_limb_t yl;
+  if (strict_subset) {
+    while (x_size > 0) {
+      xl = *xp;
+      yl = *yp;
+      if ((xl & ~yl) != 0)
+        return false;
+    strict_subset_next:
+      ++xp;
+      ++yp;
+      --x_size;
+    }
+  }
+  else {
+    while (x_size > 0) {
+      xl = *xp;
+      yl = *yp;
+      if (xl != yl) {
+        if ((xl & ~yl) != 0)
+          return false;
+        strict_subset = true;
+        goto strict_subset_next;
+      }
+      ++xp;
+      ++yp;
+      --x_size;
+    }
+  }
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bit_Row */
+bool
+PPL::strict_subset(const Bit_Row& x, const Bit_Row& y) {
+  mp_size_t x_size = x.vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  if (x_size > y_size)
+    return false;
+  bool different = (x_size < y_size);
+  mp_srcptr xp = x.vec->_mp_d;
+  mp_srcptr yp = y.vec->_mp_d;
+  while (x_size > 0) {
+    const mp_limb_t xl = *xp;
+    const mp_limb_t yl = *yp;
+    if ((xl & ~yl) != 0)
+      return false;
+    if (!different && xl != yl)
+      different = true;
+    ++xp;
+    ++yp;
+    --x_size;
+  }
+  return different;
+}
+
+/*! \relates Bit_Row */
+bool
+PPL::operator==(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_vec_size = x.vec->_mp_size;
+  PPL_ASSERT(x_vec_size >= 0);
+  const mp_size_t y_vec_size = y.vec->_mp_size;
+  PPL_ASSERT(y_vec_size >= 0);
+
+  if (x_vec_size != y_vec_size)
+    return false;
+
+  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) == 0;
+}
+
+/*! \relates Bit_Row */
+bool
+PPL::operator!=(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_vec_size = x.vec->_mp_size;
+  PPL_ASSERT(x_vec_size >= 0);
+  const mp_size_t y_vec_size = y.vec->_mp_size;
+  PPL_ASSERT(y_vec_size >= 0);
+
+  if (x_vec_size != y_vec_size)
+    return true;
+
+  return mpn_cmp(x.vec->_mp_d, y.vec->_mp_d, x_vec_size) != 0;
+}
+
+bool
+PPL::Bit_Row::OK() const {
+  const mp_size_t vec_size = vec->_mp_size;
+  const mp_size_t vec_alloc = vec->_mp_alloc;
+  return vec_size >= 0
+    && vec_alloc >= vec_size
+    && (vec_size == 0 || mpz_getlimbn(vec, vec_size-1) != 0);
+}
+
+void
+PPL::Bit_Row::union_helper(const Bit_Row& y, const Bit_Row& z) {
+  mp_size_t y_size = y.vec->_mp_size;
+  mp_size_t z_size = z.vec->_mp_size;
+  PPL_ASSERT(y_size <= z_size);
+  PPL_ASSERT(vec->_mp_alloc >= z_size);
+  vec->_mp_size = z.vec->_mp_size;
+  mp_srcptr yp = y.vec->_mp_d;
+  mp_srcptr zp = z.vec->_mp_d;
+  mp_ptr p = vec->_mp_d;
+  z_size -= y_size;
+  while (y_size > 0) {
+    *p = *yp | * zp;
+    ++yp;
+    ++zp;
+    ++p;
+    --y_size;
+  }
+  while (z_size > 0) {
+    *p = *zp;
+    ++zp;
+    ++p;
+    --z_size;
+  }
+}
diff --git a/src/Bit_Row_defs.hh b/src/Bit_Row_defs.hh
new file mode 100644
index 0000000..d51f39a
--- /dev/null
+++ b/src/Bit_Row_defs.hh
@@ -0,0 +1,214 @@
+/* Bit_Row class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Row_defs_hh
+#define PPL_Bit_Row_defs_hh 1
+
+#include "Bit_Row_types.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include <gmpxx.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Row */
+void swap(Bit_Row& x, Bit_Row& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(std::vector<Bit_Row>::iterator x,
+          std::vector<Bit_Row>::iterator y);
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Bit_Row
+  Compares \p x with \p y starting from the least significant bits.
+  The ordering is total and has the following property: if \p x and \p y
+  are two rows seen as sets of naturals, if \p x is a strict subset
+  of \p y, then \p x comes before \p y.
+
+  Returns
+  - -1 if \p x comes before \p y in the ordering;
+  -  0 if \p x and \p y are equal;
+  -  1 if \p x comes after \p y in the ordering.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Set-theoretic inclusion test: sets \p strict_subset to a Boolean
+  indicating whether the inclusion is strict or not.
+
+  \relates Bit_Row
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+                     bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row in a matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Row {
+public:
+  //! Default constructor.
+  Bit_Row();
+
+  //! Copy constructor.
+  Bit_Row(const Bit_Row& y);
+
+  //! Set-union constructor.
+  /*!
+    Constructs an object containing the set-union of \p y and \p z.
+  */
+  Bit_Row(const Bit_Row& y, const Bit_Row& z);
+
+  //! Destructor.
+  ~Bit_Row();
+
+  //! Assignment operator.
+  Bit_Row& operator=(const Bit_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Bit_Row& y);
+
+  //! Returns the truth value corresponding to the bit in position \p k.
+  bool operator[](unsigned long k) const;
+
+  //! Sets the bit in position \p k.
+  void set(unsigned long k);
+
+  //! Sets bits up to position \p k (excluded).
+  void set_until(unsigned long k);
+
+  //! Clears the bit in position \p k.
+  void clear(unsigned long k);
+
+  //! Clears bits from position \p k (included) onward.
+  void clear_from(unsigned long k);
+
+  //! Clears all the bits of the row.
+  void clear();
+
+  //! Assigns to \p *this the set-theoretic union of \p x and \p y.
+  void union_assign(const Bit_Row& x, const Bit_Row& y);
+
+  //! Assigns to \p *this the set-theoretic intersection of \p x and \p y.
+  void intersection_assign(const Bit_Row& x, const Bit_Row& y);
+
+  //! Assigns to \p *this the set-theoretic difference of \p x and \p y.
+  void difference_assign(const Bit_Row& x, const Bit_Row& y);
+
+
+  friend int compare(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator==(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator!=(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+                              bool& strict_subset);
+  friend bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+  unsigned long first() const;
+
+  /*! \brief
+    Returns the index of the first set bit after \p position
+    or ULONG_MAX if no bit after \p position is set.
+  */
+  unsigned long next(unsigned long position) const;
+
+  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+  unsigned long last() const;
+
+  /*! \brief
+    Returns the index of the first set bit before \p position
+    or ULONG_MAX if no bits before \p position is set.
+  */
+  unsigned long prev(unsigned long position) const;
+
+  //! Returns the number of set bits in the row.
+  unsigned long count_ones() const;
+
+  //! Returns <CODE>true</CODE> if no bit is set in the row.
+  bool empty() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied
+  bool OK() const;
+
+private:
+  //! Bit-vector representing the row.
+  mpz_t vec;
+
+  //! Assigns to \p *this the union of \p y and \p z.
+  /*!
+    The size of \p y must be be less than or equal to the size of \p z.
+    Upon entry, \p vec must have allocated enough space to contain the result.
+  */
+  void union_helper(const Bit_Row& y, const Bit_Row& z);
+};
+
+#include "Bit_Row_inlines.hh"
+
+#endif // !defined(PPL_Bit_Row_defs_hh)
diff --git a/src/Bit_Row_inlines.hh b/src/Bit_Row_inlines.hh
new file mode 100644
index 0000000..ccb700b
--- /dev/null
+++ b/src/Bit_Row_inlines.hh
@@ -0,0 +1,236 @@
+/* Bit_Row class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Bit_Row_inlines_hh
+#define PPL_Bit_Row_inlines_hh 1
+
+#include "compiler.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+
+// For the declaration of ffs(3).
+#if defined(PPL_HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(PPL_HAVE_STRING_H)
+# include <string.h>
+#endif
+
+#define PPL_BITS_PER_GMP_LIMB sizeof_to_bits(PPL_SIZEOF_MP_LIMB_T)
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Row::Bit_Row() {
+  mpz_init(vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y) {
+  mpz_init_set(vec, y.vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z) {
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  const mp_size_t z_size = z.vec->_mp_size;
+  PPL_ASSERT(z_size >= 0);
+  if (y_size < z_size) {
+    PPL_ASSERT(static_cast<unsigned long>(z_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_init2(vec, static_cast<unsigned long>(z_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(y, z);
+  }
+  else {
+    PPL_ASSERT(static_cast<unsigned long>(y_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_init2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(z, y);
+  }
+}
+
+inline
+Bit_Row::~Bit_Row() {
+  mpz_clear(vec);
+}
+
+inline Bit_Row&
+Bit_Row::operator=(const Bit_Row& y) {
+  mpz_set(vec, y.vec);
+  return *this;
+}
+
+inline void
+Bit_Row::set(const unsigned long k) {
+  mpz_setbit(vec, k);
+}
+
+inline void
+Bit_Row::clear(const unsigned long k) {
+  mpz_clrbit(vec, k);
+}
+
+inline void
+Bit_Row::clear_from(const unsigned long k) {
+  mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Bit_Row::count_ones() const {
+  const mp_size_t x_size = vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  return (x_size == 0) ? 0 : mpn_popcount(vec->_mp_d, x_size);
+}
+
+inline bool
+Bit_Row::empty() const {
+  return mpz_sgn(vec) == 0;
+}
+
+inline void
+Bit_Row::m_swap(Bit_Row& y) {
+  mpz_swap(vec, y.vec);
+}
+
+inline void
+Bit_Row::clear() {
+  mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Bit_Row::external_memory_in_bytes() const {
+  return static_cast<memory_size_type>(vec[0]._mp_alloc) * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Bit_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Bit_Row::union_assign(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_size = x.vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  if (x_size < y_size) {
+    PPL_ASSERT(static_cast<unsigned long>(y_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_realloc2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(x, y);
+  }
+  else {
+    PPL_ASSERT(static_cast<unsigned long>(x_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_realloc2(vec, static_cast<unsigned long>(x_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(y, x);
+  }
+}
+
+inline void
+Bit_Row::intersection_assign(const Bit_Row& x, const Bit_Row& y) {
+  mpz_and(vec, x.vec, y.vec);
+}
+
+inline void
+Bit_Row::difference_assign(const Bit_Row& x, const Bit_Row& y) {
+  PPL_DIRTY_TEMP(mpz_class, complement_y);
+  mpz_com(complement_y.get_mpz_t(), y.vec);
+  mpz_and(vec, x.vec, complement_y.get_mpz_t());
+}
+
+namespace Implementation {
+
+/*! \brief
+  Assuming \p u is nonzero, returns the index of the first set bit in \p u.
+*/
+inline unsigned int
+first_one(unsigned int u) {
+  return ctz(u);
+}
+
+/*! \brief
+  Assuming \p ul is nonzero, returns the index of the first set bit in
+  \p ul.
+*/
+inline unsigned int
+first_one(unsigned long ul) {
+  return ctz(ul);
+}
+
+/*! \brief
+  Assuming \p ull is nonzero, returns the index of the first set bit in
+  \p ull.
+*/
+inline unsigned int
+first_one(unsigned long long ull) {
+  return ctz(ull);
+}
+
+/*! \brief
+  Assuming \p u is nonzero, returns the index of the last set bit in \p u.
+*/
+inline unsigned int
+last_one(unsigned int u) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(u)))
+    - 1U - clz(u);
+}
+
+/*! \brief
+  Assuming \p ul is nonzero, returns the index of the last set bit in
+  \p ul.
+*/
+inline unsigned int
+last_one(unsigned long ul) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(ul)))
+    - 1U - clz(ul);
+}
+
+/*! \brief
+  Assuming \p ull is nonzero, returns the index of the last set bit in
+  \p ull.
+*/
+inline unsigned int
+last_one(unsigned long long ull) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(ull)))
+    - 1U - clz(ull);
+}
+
+} // namespace Implementation
+
+/*! \relates Bit_Row */
+inline void
+swap(Bit_Row& x, Bit_Row& y) {
+  x.m_swap(y);
+}
+
+/*! \relates Bit_Row */
+inline void
+iter_swap(std::vector<Bit_Row>::iterator x,
+          std::vector<Bit_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Row_inlines_hh)
diff --git a/src/Bit_Row_types.hh b/src/Bit_Row_types.hh
new file mode 100644
index 0000000..7206d43
--- /dev/null
+++ b/src/Bit_Row_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Bit_Row_types_hh
+#define PPL_Bit_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bit_Row_types_hh)
diff --git a/src/Boundary_defs.hh b/src/Boundary_defs.hh
new file mode 100644
index 0000000..b00fe51
--- /dev/null
+++ b/src/Boundary_defs.hh
@@ -0,0 +1,729 @@
+/* Interval boundary functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Boundary_defs_hh
+#define PPL_Boundary_defs_hh 1
+
+#include "Checked_Number_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Boundary_NS {
+
+struct Property {
+  enum Type {
+    SPECIAL_,
+    OPEN_,
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+static const Property SPECIAL(Property::SPECIAL_);
+static const Property OPEN(Property::OPEN_);
+
+enum Boundary_Type {
+  LOWER = ROUND_DOWN,
+  UPPER = ROUND_UP
+};
+
+inline Rounding_Dir
+round_dir_check(Boundary_Type t, bool check = false) {
+  if (check)
+    return static_cast<Rounding_Dir>(t) | ROUND_STRICT_RELATION;
+  else
+    return static_cast<Rounding_Dir>(t);
+}
+
+template <typename T, typename Info>
+inline Result
+special_set_boundary_infinity(Boundary_Type type, T&, Info& info) {
+  PPL_ASSERT(Info::store_special);
+  info.set_boundary_property(type, SPECIAL);
+  return V_EQ;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_open(Boundary_Type, const T&, const Info&) {
+  return !Info::may_contain_infinity;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::store_special && !Info::may_contain_infinity
+      && normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::may_contain_infinity
+      && is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline Result
+set_unbounded(Boundary_Type type, T& x, Info& info) {
+  PPL_COMPILE_TIME_CHECK(Info::store_special
+                         || std::numeric_limits<T>::is_bounded
+                         || std::numeric_limits<T>::has_infinity,
+                         "unbounded is not representable");
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, ROUND_UP);
+  else
+    r = assign_r(x, PLUS_INFINITY, ROUND_DOWN);
+  if (result_relation(r) == VR_EQ && !Info::may_contain_infinity)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  if (open) {
+    PPL_ASSERT(type == LOWER);
+  }
+  else {
+    PPL_ASSERT(Info::may_contain_infinity);
+  }
+  Result r;
+  if (Info::store_special) {
+    PPL_ASSERT(type == LOWER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else {
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+    PPL_ASSERT(result_representable(r));
+  }
+  if (open || result_relation(r) != VR_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  if (open) {
+    PPL_ASSERT(type == UPPER);
+  }
+  else {
+    PPL_ASSERT(Info::may_contain_infinity);
+  }
+  Result r;
+  if (Info::store_special) {
+    PPL_ASSERT(type == UPPER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else {
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+    PPL_ASSERT(result_representable(r));
+  }
+  if (open || result_relation(r) != VR_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  PPL_ASSERT(open || Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+  else
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+  PPL_ASSERT(result_representable(r));
+  if (open)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_inf(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special && type == LOWER)
+    return info.get_boundary_property(type, SPECIAL);
+  else if (std::numeric_limits<T>::has_infinity)
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+  else if (std::numeric_limits<T>::is_bounded)
+    return x == std::numeric_limits<T>::min();
+  else
+    return false;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_sup(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special && type == UPPER)
+    return info.get_boundary_property(type, SPECIAL);
+  else if (std::numeric_limits<T>::has_infinity)
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+  else if (std::numeric_limits<T>::is_bounded)
+      return x == std::numeric_limits<T>::max();
+  else
+    return false;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (!std::numeric_limits<T>::has_infinity)
+    return false;
+  if (type == LOWER)
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special)
+    return info.get_boundary_property(type, SPECIAL);
+  else
+    return normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_reverse_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (!Info::may_contain_infinity)
+    return false;
+  else if (type == LOWER)
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_minus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == LOWER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_plus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == UPPER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) {
+  return normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline int
+infinity_sign(Boundary_Type type, const T& x, const Info& info) {
+  if (is_boundary_infinity(type, x, info))
+    return (type == LOWER) ? -1 : 1;
+  else if (is_reverse_infinity(type, x, info))
+    return (type == UPPER) ? -1 : 1;
+  else
+    return 0;
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity_closed(Boundary_Type type, const T& x, const Info& info) {
+  return Info::may_contain_infinity
+    && !info.get_boundary_property(type, OPEN)
+    && is_boundary_infinity(type, x, info);
+}
+
+template <typename Info>
+inline bool
+boundary_infinity_is_open(Boundary_Type type, const Info& info) {
+  return !Info::may_contain_infinity
+    || info.get_boundary_property(type, OPEN);
+}
+
+template <typename T, typename Info>
+inline int
+sgn_b(Boundary_Type type, const T& x, const Info& info) {
+  if (info.get_boundary_property(type, SPECIAL))
+    return (type == LOWER) ? -1 : 1;
+  else
+    // The following Parma_Polyhedra_Library:: qualification is to work
+    // around a bug of GCC 4.0.x.
+    return Parma_Polyhedra_Library::sgn(x);
+}
+
+template <typename T, typename Info>
+inline int
+sgn(Boundary_Type type, const T& x, const Info& info) {
+  int sign = sgn_b(type, x, info);
+  if (x == 0 && info.get_boundary_property(type, OPEN))
+    return (type == LOWER) ? -1 : 1;
+  else
+    return sign;
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+eq(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (type1 == type2) {
+    if (is_open(type1, x1, info1)
+        != is_open(type2, x2, info2))
+      return false;
+  }
+  else if (is_open(type1, x1, info1)
+           || is_open(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1))
+    return is_minus_infinity(type2, x2, info2);
+  else if (is_plus_infinity(type1, x1, info1))
+    return is_plus_infinity(type2, x2, info2);
+  else if (is_minus_infinity(type2, x2, info2)
+           || is_plus_infinity(type2, x2, info2))
+    return false;
+  else
+    return equal(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+lt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (is_open(type1, x1, info1)) {
+    if (type1 == UPPER
+        && (type2 == LOWER
+            || !is_open(type2, x2, info2)))
+      goto le;
+  }
+  else if (type2 == LOWER
+           && is_open(type2, x2, info2)) {
+  le:
+    if (is_minus_infinity(type1, x1, info1)
+        || is_plus_infinity(type2, x2, info2))
+      return true;
+    if (is_plus_infinity(type1, x1, info1)
+        || is_minus_infinity(type2, x2, info2))
+      return false;
+    else
+      return less_or_equal(x1, x2);
+  }
+  if (is_plus_infinity(type1, x1, info1)
+      || is_minus_infinity(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1)
+      || is_plus_infinity(type2, x2, info2))
+    return true;
+  else
+    return less_than(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+gt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return lt(type2, x2, info2, type1, x1, info1);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+le(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !gt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+ge(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !lt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T, typename Info>
+inline Result
+adjust_boundary(Boundary_Type type, T& x, Info& info,
+                bool open, Result r) {
+  r = result_relation_class(r);
+  if (type == LOWER) {
+    switch (r) {
+    case V_GT_MINUS_INFINITY:
+      open = true;
+      /* Fall through */
+    case V_EQ_MINUS_INFINITY:
+      if (!Info::store_special)
+        return r;
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_GT:
+      open = true;
+      /* Fall through */
+    case V_GE:
+    case V_EQ:
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return r;
+    default:
+      PPL_UNREACHABLE;
+      return V_NAN;
+    }
+  }
+  else {
+    switch (r) {
+    case V_LT_PLUS_INFINITY:
+      open = true;
+      /* Fall through */
+    case V_EQ_PLUS_INFINITY:
+      if (!Info::store_special)
+        return r;
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_LT:
+      open = true;
+      /* Fall through */
+    case V_LE:
+    case V_EQ:
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return r;
+    default:
+      PPL_UNREACHABLE;
+      return V_NAN;
+    }
+  }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+complement(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  PPL_ASSERT(to_type != type);
+  bool should_shrink;
+  if (info.get_boundary_property(type, SPECIAL)) {
+    should_shrink = !special_is_open(type, x, info);
+    if (type == LOWER)
+      return set_minus_infinity(to_type, to, to_info, should_shrink);
+    else
+      return set_plus_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = !normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+assign(Boundary_Type to_type, To& to, To_Info& to_info,
+       Boundary_Type type, const T& x, const Info& info,
+       bool should_shrink = false) {
+  PPL_ASSERT(to_type == type);
+  if (info.get_boundary_property(type, SPECIAL)) {
+    should_shrink = (should_shrink || special_is_open(type, x, info));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (should_shrink || normal_is_open(type, x, info));
+  const bool check
+    = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  const Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  if (lt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (lt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  if (gt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (gt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+neg_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  PPL_ASSERT(to_type != type);
+  bool should_shrink;
+  if (info.get_boundary_property(type, SPECIAL)) {
+    should_shrink = special_is_open(type, x, info);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = neg_assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+add_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  PPL_ASSERT(type1 == type2);
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = (boundary_infinity_is_open(type1, info1)
+                     && !is_boundary_infinity_closed(type2, x2, info2));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = (boundary_infinity_is_open(type2, info2)
+                     && !is_boundary_infinity_closed(type1, x1, info1));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  // FIXME: extended handling is not needed
+  Result r = add_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+sub_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  PPL_ASSERT(type1 != type2);
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = (boundary_infinity_is_open(type1, info1)
+                     && !is_boundary_infinity_closed(type2, x2, info2));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = (boundary_infinity_is_open(type2, info2)
+                     && !is_boundary_infinity_closed(type1, x1, info1));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  // FIXME: extended handling is not needed
+  Result r = sub_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = (boundary_infinity_is_open(type1, info1)
+                     && !is_boundary_infinity_closed(type2, x2, info2));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = (boundary_infinity_is_open(type2, info2)
+                     && !is_boundary_infinity_closed(type1, x1, info1));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = mul_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info>
+inline Result
+set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool should_shrink) {
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+             Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+             Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  bool should_shrink;
+  if (x1s != 0) {
+    if (x2s != 0)
+      return mul_assign(to_type, to, to_info,
+                        type1, x1, info1,
+                        type2, x2, info2);
+    else
+      should_shrink = info2.get_boundary_property(type2, OPEN);
+  }
+  else {
+    should_shrink = (info1.get_boundary_property(type1, OPEN)
+                     && (x2s != 0 || info2.get_boundary_property(type2, OPEN)));
+  }
+  return set_zero(to_type, to, to_info, should_shrink);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = boundary_infinity_is_open(type1, info1);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = boundary_infinity_is_open(type2, info2);
+    return set_zero(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = div_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+             Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+             Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  if (x1s != 0) {
+    if (x2s != 0)
+      return div_assign(to_type, to, to_info,
+                        type1, x1, info1,
+                        type2, x2, info2);
+    else {
+      return set_boundary_infinity(to_type, to, to_info, true);
+    }
+  }
+  else {
+    bool should_shrink = info1.get_boundary_property(type1, OPEN)
+      && !is_boundary_infinity_closed(type2, x2, info2);
+    return set_zero(to_type, to, to_info, should_shrink);
+  }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+umod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+                 Boundary_Type type, const T& x, const Info& info,
+                 unsigned int exp) {
+  PPL_ASSERT(to_type == type);
+  bool should_shrink;
+  if (is_boundary_infinity(type, x, info)) {
+    should_shrink = boundary_infinity_is_open(type, info);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = umod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+smod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+                 Boundary_Type type, const T& x, const Info& info,
+                 unsigned int exp) {
+  PPL_ASSERT(to_type == type);
+  bool should_shrink;
+  if (is_boundary_infinity(type, x, info)) {
+    should_shrink = boundary_infinity_is_open(type, info);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = smod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+} // namespace Boundary_NS
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Boundary_defs_hh)
diff --git a/src/Box.cc b/src/Box.cc
new file mode 100644
index 0000000..07ca2ab
--- /dev/null
+++ b/src/Box.cc
@@ -0,0 +1,63 @@
+/* Box class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Box_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Box_Helpers::extract_interval_constraint(const Constraint& c,
+                                              dimension_type& c_num_vars,
+                                              dimension_type& c_only_var) {
+  // Check for preconditions.
+  PPL_ASSERT(c_num_vars == 0 && c_only_var == 0);
+
+  c_only_var = c.expression().first_nonzero(1, c.space_dimension() + 1);
+  if (c_only_var == c.space_dimension() + 1)
+    // All the inhomogeneous coefficients are zero.
+    return true;
+
+  ++c_num_vars;
+  --c_only_var;
+  return c.expression().all_zeroes(c_only_var + 2, c.space_dimension() + 1);
+}
+
+bool
+PPL::Box_Helpers::extract_interval_congruence(const Congruence& cg,
+                                              dimension_type& cg_num_vars,
+                                              dimension_type& cg_only_var) {
+  // Check for preconditions.
+  PPL_ASSERT(cg_num_vars == 0 && cg_only_var == 0);
+  // Only equality congruences can be intervals.
+  PPL_ASSERT(cg.is_equality());
+
+  cg_only_var = cg.expression().first_nonzero(1, cg.space_dimension() + 1);
+  if (cg_only_var == cg.space_dimension() + 1)
+    // All the inhomogeneous coefficients are zero.
+    return true;
+
+  ++cg_num_vars;
+  --cg_only_var;
+  return cg.expression().all_zeroes(cg_only_var + 2, cg.space_dimension() + 1);
+}
diff --git a/src/Box_Status_idefs.hh b/src/Box_Status_idefs.hh
new file mode 100644
index 0000000..8ec9fcd
--- /dev/null
+++ b/src/Box_Status_idefs.hh
@@ -0,0 +1,115 @@
+/* Box<ITV>::Status class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_Status_idefs_hh
+#define PPL_Box_Status_idefs_hh 1
+
+#ifndef PPL_IN_Box_CLASS
+#error "Do not include Box_Status_idefs.hh directly; use Box_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Box<ITV> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>empty up-to-date</EM>: the empty flag is meaningful;
+  - <EM>empty</EM>: the box is the empty set.
+  - <EM>universe</EM>: the box is universe \f$n\f$-dimensional vector space
+     \f$\Rset^n\f$.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>empty up-to-date</EM> and <EM>empty</EM> excludes <EM>universe</EM>.
+*/
+class Status;
+
+class Status {
+public:
+  //! By default Status is the empty set of assertion.
+  Status();
+
+  //! Ordinary copy constructor.
+  Status(const Status& y);
+
+  //! Copy constructor from a box of different type.
+  template <typename Other_ITV>
+  Status(const typename Box<Other_ITV>::Status& y);
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_empty_up_to_date() const;
+  void reset_empty_up_to_date();
+  void set_empty_up_to_date();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_universe() const;
+  void reset_universe();
+  void set_universe();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t NONE             = 0U;
+  static const flags_t EMPTY_UP_TO_DATE = 1U << 0;
+  static const flags_t EMPTY            = 1U << 1;
+  static const flags_t UNIVERSE         = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Box_Status_idefs_hh)
diff --git a/src/Box_Status_inlines.hh b/src/Box_Status_inlines.hh
new file mode 100644
index 0000000..84d89c3
--- /dev/null
+++ b/src/Box_Status_inlines.hh
@@ -0,0 +1,228 @@
+/* Box<ITV>::Status class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_Status_inlines_hh
+#define PPL_Box_Status_inlines_hh 1
+
+#include <string>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(const Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Status::Status(const typename Box<Other_ITV>::Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status()
+  : flags(NONE) {
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty_up_to_date() const {
+  return test_any(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty_up_to_date() {
+  reset(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty_up_to_date() {
+  set(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty() {
+  set(EMPTY);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_universe() const {
+  return test_any(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_universe() {
+  reset(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_universe() {
+  set(UNIVERSE);
+}
+
+template <typename ITV>
+bool
+Box<ITV>::Status::OK() const {
+  if (test_empty_up_to_date()
+      && test_empty()
+      && test_universe()) {
+#ifndef NDEBUG
+    std::cerr
+      << "The status asserts emptiness and universality at the same time."
+      << std::endl;
+#endif
+    return false;
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Boxes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string empty_up_to_date = "EUP";
+const std::string empty = "EM";
+const std::string universe = "UN";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Box::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+template <typename ITV>
+void
+Box<ITV>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Boxes;
+  s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << separator
+    << (test_empty() ? yes : no) << empty << separator
+    << (test_universe() ? yes : no) << universe << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box<ITV>::Status)
+
+template <typename ITV>
+bool
+Box<ITV>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Boxes;
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, Implementation::Boxes::empty_up_to_date, positive))
+    return false;
+  if (positive)
+    set_empty_up_to_date();
+
+  if (!get_field(s, Implementation::Boxes::empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, universe, positive))
+    return false;
+  if (positive)
+    set_universe();
+  else
+    reset_universe();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_Status_inlines_hh)
diff --git a/src/Box_defs.hh b/src/Box_defs.hh
new file mode 100644
index 0000000..2b83268
--- /dev/null
+++ b/src/Box_defs.hh
@@ -0,0 +1,2286 @@
+/* Box class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_defs_hh
+#define PPL_Box_defs_hh 1
+
+#include "Box_types.hh"
+#include "globals_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Constraint_defs.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_types.hh"
+#include "Congruence_System_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Poly_Con_Relation_types.hh"
+#include "Poly_Gen_Relation_types.hh"
+#include "Polyhedron_types.hh"
+#include "Grid_types.hh"
+#include "Partially_Reduced_Product_types.hh"
+#include "intervals_defs.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+struct Interval_Base;
+
+//! Swaps \p x with \p y.
+/*! \relates Box */
+template <typename ITV>
+void swap(Box<ITV>& x, Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename ITV>
+bool operator==(const Box<ITV>& x, const Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename ITV>
+bool operator!=(const Box<ITV>& x, const Box<ITV>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream& operator<<(std::ostream& s, const Box<ITV>& box);
+
+} // namespace IO_Operators
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box
+  Helper function for computing distances.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+          typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const Box<ITV>& x, const Box<ITV>& y,
+                    Rounding_Dir dir,
+                    Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A not necessarily closed, iso-oriented hyperrectangle.
+/*! \ingroup PPL_CXX_interface
+  A Box object represents the smash product of \f$n\f$
+  not necessarily closed and possibly unbounded intervals
+  represented by objects of class \p ITV,
+  where \f$n\f$ is the space dimension of the box.
+
+  An <EM>interval constraint</EM> (resp., <EM>interval congruence</EM>)
+  is a syntactic constraint (resp., congruence) that only mentions
+  a single space dimension.
+
+  The Box domain <EM>optimally supports</EM>:
+    - tautological and inconsistent constraints and congruences;
+    - the interval constraints that are optimally supported by
+      the template argument class \c ITV;
+    - the interval congruences that are optimally supported by
+      the template argument class \c ITV.
+
+  Depending on the method, using a constraint or congruence that is not
+  optimally supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  The user interface for the Box domain is meant to be as similar
+  as possible to the one developed for the polyhedron class C_Polyhedron.
+*/
+template <typename ITV>
+class Parma_Polyhedra_Library::Box {
+public:
+  //! The type of intervals used to implement the box.
+  typedef ITV interval_type;
+
+  //! Returns the maximum space dimension that a Box can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty box of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the box;
+
+    \param kind
+    Specifies whether the universe or the empty box has to be built.
+  */
+  explicit Box(dimension_type num_dimensions = 0,
+               Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Box(const Box& y,
+      Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename Other_ITV>
+  explicit Box(const Box<Other_ITV>& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box from the system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref intervals "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+  */
+  explicit Box(const Constraint_System& cs);
+
+  //! Builds a box recycling a system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref intervals "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a box from the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Box(const Generator_System& gs);
+
+  //! Builds a box recycling the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \param gs
+    The generator system describing the polyhedron to be approximated.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  Box(const Generator_System& gs, Recycle_Input dummy);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they may have contributed to the space dimension).
+  */
+  explicit Box(const Congruence_System& cgs);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs, recycling \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they will contribute to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds a box containing the BDS \p bds.
+  /*!
+    Builds the smallest box containing \p bds using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const BD_Shape<T>& bds,
+               Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the octagonal shape \p oct.
+  /*!
+    Builds the smallest box containing \p oct using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const Octagonal_Shape<T>& oct,
+               Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the polyhedron \p ph.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the built box is the
+    smallest one containing \p ph.
+  */
+  explicit Box(const Polyhedron& ph,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box containing the grid \p gr.
+  /*!
+    Builds the smallest box containing \p gr using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  explicit Box(const Grid& gr,
+               Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the partially reduced product \p dp.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+  */
+  template <typename D1, typename D2, typename R>
+  explicit Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Box& operator=(const Box& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void m_swap(Box& y);
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Box
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty box.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe box.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded box.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool contains(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Box
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Box
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    defining \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is not optimally supported by the Box domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the box domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints to be added. They may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the box domain.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+    \param cg
+    The congruence to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    or \p cg is not optimally supported by the box domain.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the box domain.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the box domain.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+    The constraints to be used for refinement.
+    To avoid termination problems, each constraint in \p cs
+    will be used for a single refinement step.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \note
+    The user is warned that the accuracy of this refinement operator
+    depends on the order of evaluation of the constraints in \p cs,
+    which is in general unpredictable. If a fine control on such an
+    order is needed, the user should consider calling the method
+    <code>refine_with_constraint(const Constraint& c)</code> inside
+    an appropriate looping construct.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c for constraint propagation on \p *this.
+
+    \param c
+    The constraint to be used for constraint propagation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void propagate_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs for constraint propagation on \p *this.
+
+    \param cs
+    The constraints to be used for constraint propagation.
+
+    \param max_iterations
+    The maximum number of propagation steps for each constraint in
+    \p cs.  If zero (the default), the number of propagation steps
+    will be unbounded, possibly resulting in an infinite loop.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    This method may lead to non-termination if \p max_iterations is 0.
+  */
+  void propagate_constraints(const Constraint_System& cs,
+                             dimension_type max_iterations = 0);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest box containing the union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Box& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*! \brief
+    Assigns to \p *this the \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point boundaries that
+    defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+    is not a dimension of \p *this.
+
+    This function is used in abstract interpretation to model an assignment
+    of a value that is correctly overapproximated by \p lf to the
+    floating point variable represented by \p var.
+  */
+  void affine_form_image(Variable var,
+                         const Linear_Form<ITV>& lf);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Box& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system.  When non-null,
+    the pointed-to constraint system is assumed to represent the
+    conditional or looping construct guard with respect to which
+    wrapping is performed.  Since wrapping requires the computation
+    of upper bounds and due to non-distributivity of constraint
+    refinement over upper bounds, passing a constraint system in this
+    way can be more precise than refining the result of the wrapping
+    operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter which is ignored for the Box domain.
+
+    \param wrap_individually
+    A precision parameter which is ignored for the Box domain.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename T>
+  typename Enable_If<Is_Same<T, Box>::value
+                     && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                     void>::type
+  CC76_widening_assign(const T& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop-point.
+
+    \param last
+    An iterator that points one past the last stop-point.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename T, typename Iterator>
+  typename Enable_If<Is_Same<T, Box>::value
+                     && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                     void>::type
+  CC76_widening_assign(const T& y,
+                       Iterator first, Iterator last);
+
+  //! Same as CC76_widening_assign(y, tp).
+  void widening_assign(const Box& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened box.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Box& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A Box that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  template <typename T>
+  typename Enable_If<Is_Same<T, Box>::value
+                     && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                     void>::type
+  CC76_narrowing_assign(const T& y);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old box into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    box, which is defined by a system of interval constraints in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the box and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new box, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Seeing a box as a set of tuples (its points),
+    assigns to \p *this all the tuples that can be obtained by concatenating,
+    in the order given, a tuple of \p *this with a tuple of \p y.
+
+    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the boxes
+    corresponding, on entry, to \p *this and \p y, respectively.
+    Upon successful completion, \p *this will represent the box
+    \f$R \sseq \Rset^{n+m}\f$ such that
+    \f[
+      R \defeq
+          \Bigl\{\,
+            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+          \Bigm|
+            (x_1, \ldots, x_n)^\transpose \in B,
+            (y_1, \ldots, y_m)^\transpose \in D
+          \,\Bigl\}.
+    \f]
+    Another way of seeing it is as follows: first increases the space
+    dimension of \p *this by adding \p y.space_dimension() new
+    dimensions; then adds to the system of constraints of \p *this a
+    renamed-apart version of the constraints of \p y.
+  */
+  void concatenate_assign(const Box& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  /*! \brief
+    Returns a reference the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  const ITV& get_interval(Variable var) const;
+
+  /*! \brief
+    Sets to \p i the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void set_interval(Variable var, const ITV& i);
+
+  /*! \brief
+    If the space dimension of \p var is unbounded below, return
+    <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+    \p n, \p d and \p closed accordingly.
+
+    \note
+    It is assumed that <CODE>*this</CODE> is a non-empty box
+    having space dimension greater than or equal to that of \p var.
+    An undefined behavior is obtained if this assumption is not met.
+    \if Include_Implementation_Details
+    To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+    (having space dimension greater than or equal to that of \p var)
+    such that <CODE>!marked_empty()</CODE> holds, then the method can be
+    called without incurring in undefined behavior: it will return
+    <EM>unspecified</EM> boundary values that, if queried systematically
+    on all space dimensions, will encode the box emptiness.
+    \endif
+
+    Let \f$I\f$ be the interval corresponding to variable \p var
+    in the non-empty box <CODE>*this</CODE>.
+    If \f$I\f$ is not bounded from below, simply return <CODE>false</CODE>
+    (leaving all other parameters unchanged).
+    Otherwise, set \p n, \p d and \p closed as follows:
+     - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+       that the fraction \f$n/d\f$ corresponds to the greatest lower bound
+       of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+       that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+       and if \f$n\f$ is zero then \f$d\f$ is one;
+     - \p closed is set to <CODE>true</CODE> if and only if the lower
+       boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+  */
+  bool has_lower_bound(Variable var,
+                       Coefficient& n, Coefficient& d, bool& closed) const;
+
+  /*! \brief
+    If the space dimension of \p var is unbounded above, return
+    <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+    \p n, \p d and \p closed accordingly.
+
+    \note
+    It is assumed that <CODE>*this</CODE> is a non-empty box
+    having space dimension greater than or equal to that of \p var.
+    An undefined behavior is obtained if this assumption is not met.
+    \if Include_Implementation_Details
+    To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+    (having space dimension greater than or equal to that of \p var)
+    such that <CODE>!marked_empty()</CODE> holds, then the method can be
+    called without incurring in undefined behavior: it will return
+    <EM>unspecified</EM> boundary values that, if queried systematically
+    on all space dimensions, will encode the box emptiness.
+    \endif
+
+    Let \f$I\f$ be the interval corresponding to variable \p var
+    in the non-empty box <CODE>*this</CODE>.
+    If \f$I\f$ is not bounded from above, simply return <CODE>false</CODE>
+    (leaving all other parameters unchanged).
+    Otherwise, set \p n, \p d and \p closed as follows:
+     - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+       that the fraction \f$n/d\f$ corresponds to the least upper bound
+       of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+       that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+       and if \f$n\f$ is zero then \f$d\f$ is one;
+     - \p closed is set to <CODE>true</CODE> if and only if the upper
+       boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+  */
+  bool has_upper_bound(Variable var,
+                       Coefficient& n, Coefficient& d, bool& closed) const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences approximating \p *this.
+  Congruence_System congruences() const;
+
+  //! Returns a minimized system of congruences approximating \p *this.
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If <CODE>x</CODE> and <CODE>y</CODE> are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+private:
+  template <typename Other_ITV>
+  friend class Parma_Polyhedra_Library::Box;
+
+  friend bool
+  operator==<ITV>(const Box<ITV>& x, const Box<ITV>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library
+  ::IO_Operators::operator<<<>(std::ostream& s, const Box<ITV>& box);
+
+  template <typename Specialization, typename Temp, typename To, typename I>
+  friend bool Parma_Polyhedra_Library::l_m_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Box<I>& x, const Box<I>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+  //! The type of sequence used to implement the box.
+  typedef std::vector<ITV> Sequence;
+
+  /*! \brief
+    The type of intervals used by inner computations when trying to limit
+    the cumulative effect of approximation errors.
+  */
+  typedef ITV Tmp_Interval_Type;
+
+  //! A sequence of intervals, one for each dimension of the vector space.
+  Sequence seq;
+
+#define PPL_IN_Box_CLASS
+#include "Box_Status_idefs.hh"
+#undef PPL_IN_Box_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the box is known to be empty.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+public:
+  //! Causes the box to become empty, i.e., to represent the empty set.
+  void set_empty();
+
+private:
+  //! Marks \p *this as definitely not empty.
+  void set_nonempty();
+
+  //! Asserts the validity of the empty flag of \p *this.
+  void set_empty_up_to_date();
+
+  //! Invalidates empty flag of \p *this.
+  void reset_empty_up_to_date();
+
+  /*! \brief
+    Checks the hard way whether \p *this is an empty box:
+    returns <CODE>true</CODE> if and only if it is so.
+  */
+  bool check_empty() const;
+
+   /*! \brief
+     Returns a reference the interval that bounds
+     the box on the <CODE>k</CODE>-th space dimension.
+   */
+  const ITV& operator[](dimension_type k) const;
+
+  /*! \brief
+    WRITE ME.
+  */
+  static I_Result
+  refine_interval_no_check(ITV& itv,
+                           Constraint::Type type,
+                           Coefficient_traits::const_reference numer,
+                           Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void
+  add_interval_constraint_no_check(dimension_type var_id,
+                                   Constraint::Type type,
+                                   Coefficient_traits::const_reference numer,
+                                   Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_constraints_no_check(const Constraint_System& cs);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_congruence_no_check(const Congruence& cg);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_congruences_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for the refinement.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the constraints in \p cs to refine \p *this.
+
+    \param cs
+    The constraints to be used for the refinement.
+    To avoid termination problems, each constraint in \p cs
+    will be used for a single refinement step.
+
+    \warning
+    If \p cs and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint_System& cs);
+
+  /*! \brief
+    Uses the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be added.
+    Nontrivial proper congruences are ignored.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  /*! \brief
+    Uses the congruences in \p cgs to refine \p *this.
+
+    \param cgs
+    The congruences to be added.
+    Nontrivial proper congruences are ignored.
+
+    \warning
+    If \p cgs and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Propagates the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be propagated.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+
+    \warning
+    This method may lead to non-termination.
+
+    \if Include_Implementation_Details
+
+    For any expression \f$e\f$, we denote by
+    \f$\left\uparrow e \right\uparrow\f$ (resp., \f$\left\downarrow e
+    \right\downarrow\f$) the result of any computation that is
+    guaranteed to yield an upper (resp., lower) approximation of
+    \f$e\f$.  So there exists \f$\epsilon \in \Rset\f$ with
+    \f$\epsilon \geq 0\f$ such that
+    \f$\left\uparrow e \right\uparrow = e + \epsilon\f$.
+    If \f$\epsilon = 0\f$ we say that the computation of
+    \f$\left\uparrow e \right\uparrow\f$ is <EM>exact</EM>;
+    we say it is <EM>inexact</EM> otherwise.
+    Similarly for \f$\left\downarrow e \right\downarrow\f$.
+
+    Consider a constraint of the general form
+    \f[
+      z + \sum_{i \in I}{a_ix_i} \relsym 0,
+    \f]
+    where \f$z \in \Zset\f$, \f$I\f$ is a set of indices,
+    \f$a_i \in \Zset\f$ with \f$a_i \neq 0\f$ for each \f$i \in I\f$, and
+    \f$\mathord{\relsym} \in \{ \mathord{\geq}, \mathord{>}, \mathord{=} \}\f$.
+    The set \f$I\f$ is subdivided into the disjoint sets \f$P\f$ and \f$N\f$
+    such that, for each \f$i \in I\f$, \f$a_i > 0\f$ if \f$i \in P\f$ and
+    \f$a_i < 0\f$ if \f$i \in N\f$.
+    Suppose that, for each \f$i \in P \union N\f$ a variation interval
+    \f$\chi_i \sseq \Rset\f$ is known for \f$x_i\f$ and that the infimum
+    and the supremum of \f$\chi_i\f$ are denoted, respectively,
+    by \f$\chi_i^\mathrm{l}\f$ and \f$\chi_i^\mathrm{u}\f$, where
+    \f$\chi_i^\mathrm{l}, \chi_i^\mathrm{u} \in \Rset \union \{ -\infty, +\infty \}\f$.
+
+    For each \f$k \in P\f$, we have
+    \f[
+      x_k
+        \relsym
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_ix_i}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_ix_i}
+            \Biggr).
+    \f]
+    Thus, if \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P \setdiff \{ k \}\f$,
+    we have
+    \f[
+      x_k
+        \geq
+          \Biggl\downarrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{l}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+            \Biggr)
+          \Biggr\downarrow
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$P \setdiff \{ k \}\f$,
+    \f[
+      x_k
+        \leq
+          \Biggl\uparrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{u}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+            \Biggr)
+          \Biggl\uparrow.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+
+    For each \f$k \in N\f$, we have
+    \f[
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_ix_i}
+          - \sum_{i \in P}{a_ix_i}
+        \Biggr)
+          \relsym
+            x_k.
+    \f]
+    Thus, if
+    \f$\chi_i^\mathrm{l} \in \Rset\f$
+    for each \f$i \in N \setdiff \{ k \}\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P\f$,
+    we have
+    \f[
+      \Biggl\uparrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{u}}
+        \Biggr)
+      \Biggl\uparrow
+        \geq
+          x_k
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N \setdiff \{ k \}\f$
+    and \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in P\f$,
+    \f[
+      \Biggl\downarrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{l}}
+        \Biggr)
+      \Biggl\downarrow
+        \leq
+          x_k.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    \endif
+  */
+  void propagate_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    Propagates the constraints in \p cs to refine \p *this.
+
+    \param  cs
+    The constraints to be propagated.
+
+    \param max_iterations
+    The maximum number of propagation steps for each constraint in \p cs.
+    If zero, the number of propagation steps will be unbounded, possibly
+    resulting in an infinite loop.
+
+    \warning
+    If \p cs and \p *this are dimension-incompatible,
+    the behavior is undefined.
+
+    \warning
+    This method may lead to non-termination if \p max_iterations is 0.
+  */
+  void propagate_constraints_no_check(const Constraint_System& cs,
+                                      dimension_type max_iterations);
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p *this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  /*! \brief
+    Adds to \p limiting_box the interval constraints in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_box(const Constraint_System& cs,
+                        Box& limiting_box) const;
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const Box& y) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint_System& cs) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence_System& cgs) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+
+  template <typename C>
+  void throw_dimension_incompatible(const char* method,
+                                    const char* lf_name,
+                                    const Linear_Form<C>& lf) const;
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& le);
+
+  static void throw_invalid_argument(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns the relations holding between an interval and
+  an interval constraint.
+
+  \param i
+  The interval;
+
+  \param constraint_type
+  The constraint type;
+
+  \param numer
+  The numerator of the constraint bound;
+
+  \param denom
+  The denominator of the constraint bound
+
+  The interval constraint has the form
+  <CODE>denom * Variable(0) relsym numer</CODE>
+  where relsym is  <CODE>==</CODE>,  <CODE>></CODE> or  <CODE>>=</CODE>
+  depending on the <CODE>constraint_type</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+                  const Constraint::Type constraint_type,
+                  Coefficient_traits::const_reference numer,
+                  Coefficient_traits::const_reference denom = 1);
+
+class Box_Helpers {
+public:
+  // This is declared here so that Linear_Expression needs to be friend of
+  // Box_Helpers only, and doesn't need to be friend of this, too.
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Decodes the constraint \p c as an interval constraint.
+  /*! \relates Box
+    \return
+    <CODE>true</CODE> if the constraint \p c is an
+    \ref intervals "interval constraint";
+    <CODE>false</CODE> otherwise.
+
+    \param c
+    The constraint to be decoded.
+
+    \param c_num_vars
+    If <CODE>true</CODE> is returned, then it will be set to the number
+    of variables having a non-zero coefficient. The only legal values
+    will therefore be 0 and 1.
+
+    \param c_only_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the index of the only variable having
+    a non-zero coefficient in \p c.
+  */
+  #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  static bool extract_interval_constraint(const Constraint& c,
+                                          dimension_type& c_num_vars,
+                                          dimension_type& c_only_var);
+
+  // This is declared here so that Linear_Expression needs to be friend of
+  // Box_Helpers only, and doesn't need to be friend of this, too.
+  static bool extract_interval_congruence(const Congruence& cg,
+                                          dimension_type& cg_num_vars,
+                                          dimension_type& cg_only_var);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Box_Status_inlines.hh"
+#include "Box_inlines.hh"
+#include "Box_templates.hh"
+
+#endif // !defined(PPL_Box_defs_hh)
diff --git a/src/Box_inlines.hh b/src/Box_inlines.hh
new file mode 100644
index 0000000..84aa99a
--- /dev/null
+++ b/src/Box_inlines.hh
@@ -0,0 +1,692 @@
+/* Box class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_inlines_hh
+#define PPL_Box_inlines_hh 1
+
+#include "Boundary_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "distances_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline bool
+Box<ITV>::marked_empty() const {
+  return status.test_empty_up_to_date() && status.test_empty();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty() {
+  status.set_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_nonempty() {
+  status.reset_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty_up_to_date() {
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::reset_empty_up_to_date() {
+  return status.reset_empty_up_to_date();
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Box& y, Complexity_Class)
+  : seq(y.seq), status(y.status) {
+}
+
+template <typename ITV>
+inline Box<ITV>&
+Box<ITV>::operator=(const Box& y) {
+  seq = y.seq;
+  status = y.status;
+  return *this;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::m_swap(Box& y) {
+  Box& x = *this;
+  using std::swap;
+  swap(x.seq, y.seq);
+  swap(x.status, y.status);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cs);
+  this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Generator_System& gs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(gs);
+  this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cgs);
+  this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline memory_size_type
+Box<ITV>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::space_dimension() const {
+  return seq.size();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return Sequence().max_size() - 1;
+}
+
+template <typename ITV>
+inline int32_t
+Box<ITV>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < seq.size());
+  return seq[k];
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::get_interval(const Variable var) const {
+  if (space_dimension() < var.space_dimension())
+    throw_dimension_incompatible("get_interval(v)", "v", var);
+
+  if (is_empty()) {
+    static ITV empty_interval(EMPTY);
+    return empty_interval;
+  }
+
+  return seq[var.id()];
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_interval(const Variable var, const ITV& i) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < var.space_dimension())
+    throw_dimension_incompatible("set_interval(v, i)", "v", var);
+
+  if (is_empty() && space_dim >= 2)
+    // If the box is empty, and has dimension >= 2, setting only one
+    // interval will not make it non-empty.
+    return;
+
+  seq[var.id()] = i;
+  reset_empty_up_to_date();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::is_empty() const {
+  return marked_empty() || check_empty();
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+                   Coefficient& sup_n, Coefficient& sup_d,
+                   bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+                   Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                   Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+                   Coefficient& inf_n, Coefficient& inf_d,
+                   bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+                   Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                   Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::strictly_contains(const Box& y) const {
+  const Box& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::expand_space_dimension(const Variable var,
+                                 const dimension_type m) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting Box should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_invalid_argument("expand_dimension(v, m)",
+                           "adding m new space dimensions exceeds "
+                           "the maximum allowed space dimension");
+
+  // To expand the space dimension corresponding to variable `var',
+  // we append to the box `m' copies of the corresponding interval.
+  seq.insert(seq.end(), m, seq[var.id()]);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+operator!=(const Box<ITV>& x, const Box<ITV>& y) {
+  return !(x == y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_lower_bound(const Variable var,
+                          Coefficient& n, Coefficient& d, bool& closed) const {
+  // NOTE: assertion !is_empty() would be wrong;
+  // see the calls in method Box<ITV>::constraints().
+  PPL_ASSERT(!marked_empty());
+  const dimension_type k = var.id();
+  PPL_ASSERT(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.lower_is_boundary_infinity())
+    return false;
+
+  closed = !seq_k.lower_is_open();
+
+  PPL_DIRTY_TEMP(mpq_class, lr);
+  assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED);
+  n = lr.get_num();
+  d = lr.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_upper_bound(const Variable var,
+                          Coefficient& n, Coefficient& d, bool& closed) const {
+  // NOTE: assertion !is_empty() would be wrong;
+  // see the calls in method Box<ITV>::constraints().
+  PPL_ASSERT(!marked_empty());
+  const dimension_type k = var.id();
+  PPL_ASSERT(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.upper_is_boundary_infinity())
+    return false;
+
+  closed = !seq_k.upper_is_open();
+
+  PPL_DIRTY_TEMP(mpq_class, ur);
+  assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED);
+  n = ur.get_num();
+  d = ur.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  add_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", cs);
+
+  add_constraints_no_check(cs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  add_congruence_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruences(const Congruence_System& cgs) {
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", cgs);
+  add_congruences_no_check(cgs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Box<T>::widening_assign(const Box& y, unsigned* tp) {
+  CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+inline Congruence_System
+Box<ITV>::minimized_congruences() const {
+  // Only equalities can be congruences and these are already minimized.
+  return congruences();
+}
+
+template <typename ITV>
+inline I_Result
+Box<ITV>
+::refine_interval_no_check(ITV& itv,
+                           const Constraint::Type type,
+                           Coefficient_traits::const_reference numer,
+                           Coefficient_traits::const_reference denom) {
+  PPL_ASSERT(denom != 0);
+  // The interval constraint is of the form
+  // `var + numer / denom rel 0',
+  // where `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining the interval, this is
+  // (morally) turned into `var rel -numer/denom'.
+  PPL_DIRTY_TEMP(mpq_class, q);
+  assign_r(q.get_num(), numer, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), denom, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `numer/denom' into `-numer/denom'.
+  q = -q;
+
+  Relation_Symbol rel_sym;
+  switch (type) {
+  case Constraint::EQUALITY:
+    rel_sym = EQUAL;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    rel_sym = (denom > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    rel_sym = (denom > 0) ? GREATER_THAN : LESS_THAN;
+    break;
+  default:
+    // Silence compiler warning.
+    PPL_UNREACHABLE;
+    return I_ANY;
+  }
+  I_Result res = itv.add_constraint(i_constraint(rel_sym, q));
+  PPL_ASSERT(itv.OK());
+  return res;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>
+::add_interval_constraint_no_check(const dimension_type var_id,
+                                   const Constraint::Type type,
+                                   Coefficient_traits::const_reference numer,
+                                   Coefficient_traits::const_reference denom) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(var_id < space_dimension());
+  PPL_ASSERT(denom != 0);
+  refine_interval_no_check(seq[var_id], type, numer, denom);
+  // FIXME: do check the value returned and set `empty' and
+  // `empty_up_to_date' as appropriate.
+  // This has to be done after reimplementation of intervals.
+  reset_empty_up_to_date();
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_constraints(cs)", cs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_congruences(cgs)", cgs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cgs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("propagate_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  propagate_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraints(const Constraint_System& cs,
+                                const dimension_type max_iterations) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("propagate_constraints(cs)", cs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  propagate_constraints_no_check(cs, max_iterations);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::unconstrain(const Variable var) {
+  const dimension_type var_id = var.id();
+  // Dimension-compatibility check.
+  if (space_dimension() < var_id + 1)
+    throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for `var' before cylindrification.
+  ITV& seq_var = seq[var_id];
+  if (seq_var.is_empty())
+    set_empty();
+  else
+    seq_var.assign(UNIVERSE);
+
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            const Rounding_Dir dir) {
+  // FIXME: the following qualification is only to work around a bug
+  // in the Intel C/C++ compiler version 10.1.x.
+  return Parma_Polyhedra_Library
+    ::rectilinear_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          const Rounding_Dir dir) {
+  // FIXME: the following qualification is only to work around a bug
+  // in the Intel C/C++ compiler version 10.1.x.
+  return Parma_Polyhedra_Library
+    ::euclidean_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           const Rounding_Dir dir) {
+  // FIXME: the following qualification is only to work around a bug
+  // in the Intel C/C++ compiler version 10.1.x.
+  return Parma_Polyhedra_Library
+    ::l_infinity_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename ITV>
+inline void
+swap(Box<ITV>& x, Box<ITV>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_inlines_hh)
diff --git a/src/Box_templates.hh b/src/Box_templates.hh
new file mode 100644
index 0000000..227dd65
--- /dev/null
+++ b/src/Box_templates.hh
@@ -0,0 +1,4295 @@
+/* Box class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Box_templates_hh
+#define PPL_Box_templates_hh 1
+
+#include "Variables_Set_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "BD_Shape_defs.hh"
+#include "Octagonal_Shape_defs.hh"
+#include "MIP_Problem_defs.hh"
+#include "Rational_Interval.hh"
+#include <vector>
+#include <map>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Box(dimension_type num_dimensions, Degenerate_Element kind)
+  : seq(check_space_dimension_overflow(num_dimensions,
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(n, k)",
+                                       "n exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // In a box that is marked empty the intervals are completely
+  // meaningless: we exploit this by avoiding their initialization.
+  if (kind == UNIVERSE) {
+    for (dimension_type i = num_dimensions; i-- > 0; )
+      seq[i].assign(UNIVERSE);
+    set_empty_up_to_date();
+  }
+  else
+    set_empty();
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs)
+  : seq(check_space_dimension_overflow(cs.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(cs)",
+                                       "cs exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_constraints_no_check(cs);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs)
+  : seq(check_space_dimension_overflow(cgs.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(cgs)",
+                                       "cgs exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cgs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_congruences_no_check(cgs);
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Box(const Box<Other_ITV>& y, Complexity_Class)
+  : seq(y.space_dimension()),
+    // FIXME: why the following does not work?
+    // status(y.status) {
+    status() {
+  // FIXME: remove when the above is fixed.
+  if (y.marked_empty())
+    set_empty();
+
+  if (!y.marked_empty())
+    for (dimension_type k = y.space_dimension(); k-- > 0; )
+      seq[k].assign(y.seq[k]);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Generator_System& gs)
+  : seq(check_space_dimension_overflow(gs.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(gs)",
+                                       "gs exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty box.
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  PPL_DIRTY_TEMP(mpq_class, q);
+  bool point_seen = false;
+  // Going through all the points.
+  for (Generator_System::const_iterator
+         gs_i = gs_begin; gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    if (g.is_point()) {
+      const Coefficient& d = g.divisor();
+      if (point_seen) {
+        // This is not the first point: `seq' already contains valid values.
+        // TODO: If the variables in the expression that have coefficient 0
+        // have no effect on seq[i], this loop can be optimized using
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+          assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+          q.canonicalize();
+          PPL_DIRTY_TEMP(ITV, iq);
+          iq.build(i_constraint(EQUAL, q));
+          seq[i].join_assign(iq);
+        }
+      }
+      else {
+        // This is the first point seen: initialize `seq'.
+        point_seen = true;
+        // TODO: If the variables in the expression that have coefficient 0
+        // have no effect on seq[i], this loop can be optimized using
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+          assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+          q.canonicalize();
+          seq[i].build(i_constraint(EQUAL, q));
+        }
+      }
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::Box<ITV>::Box(gs):\n"
+                                "the non-empty generator system gs "
+                                "contains no points.");
+
+  // Going through all the lines, rays and closure points.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+              i_end = g.expression().end();
+              i != i_end; ++i)
+          seq[i.variable().id()].assign(UNIVERSE);
+      break;
+    case Generator::RAY:
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+              i_end = g.expression().end();
+              i != i_end; ++i)
+        switch (sgn(*i)) {
+        case 1:
+          seq[i.variable().id()].upper_extend();
+          break;
+        case -1:
+          seq[i.variable().id()].lower_extend();
+          break;
+        default:
+          PPL_UNREACHABLE;
+          break;
+        }
+      break;
+    case Generator::CLOSURE_POINT:
+      {
+        const Coefficient& d = g.divisor();
+        // TODO: If the variables in the expression that have coefficient 0
+        // have no effect on seq[i], this loop can be optimized using
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+          assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+          q.canonicalize();
+          ITV& seq_i = seq[i];
+          seq_i.lower_extend(i_constraint(GREATER_THAN, q));
+          seq_i.upper_extend(i_constraint(LESS_THAN, q));
+        }
+      }
+      break;
+    default:
+      // Points already dealt with.
+      break;
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const BD_Shape<T>& bds, Complexity_Class)
+  : seq(check_space_dimension_overflow(bds.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(bds)",
+                                       "bds exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // Expose all the interval constraints.
+  bds.shortest_path_closure_assign();
+  if (bds.marked_empty()) {
+    set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  typedef typename BD_Shape<T>::coefficient_type Coeff;
+  PPL_DIRTY_TEMP(Coeff, tmp);
+  const DB_Row<Coeff>& dbm_0 = bds.dbm[0];
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    I_Constraint<Coeff> lower;
+    I_Constraint<Coeff> upper;
+    ITV& seq_i = seq[i];
+
+    // Set the upper bound.
+    const Coeff& u = dbm_0[i+1];
+    if (!is_plus_infinity(u))
+      upper.set(LESS_OR_EQUAL, u, true);
+
+    // Set the lower bound.
+    const Coeff& negated_l = bds.dbm[i+1][0];
+    if (!is_plus_infinity(negated_l)) {
+      neg_assign_r(tmp, negated_l, ROUND_DOWN);
+      lower.set(GREATER_OR_EQUAL, tmp);
+    }
+
+    seq_i.build(lower, upper);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const Octagonal_Shape<T>& oct, Complexity_Class)
+  : seq(check_space_dimension_overflow(oct.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(oct)",
+                                       "oct exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // Expose all the interval constraints.
+  oct.strong_closure_assign();
+  if (oct.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
+
+  PPL_DIRTY_TEMP(mpq_class, lower_bound);
+  PPL_DIRTY_TEMP(mpq_class, upper_bound);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    typedef typename Octagonal_Shape<T>::coefficient_type Coeff;
+    I_Constraint<mpq_class> lower;
+    I_Constraint<mpq_class> upper;
+    ITV& seq_i = seq[i];
+    const dimension_type ii = 2*i;
+    const dimension_type cii = ii + 1;
+
+    // Set the upper bound.
+    const Coeff& twice_ub = oct.matrix[cii][ii];
+    if (!is_plus_infinity(twice_ub)) {
+      assign_r(upper_bound, twice_ub, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(upper_bound, upper_bound, 1, ROUND_NOT_NEEDED);
+      upper.set(LESS_OR_EQUAL, upper_bound);
+    }
+
+    // Set the lower bound.
+    const Coeff& twice_lb = oct.matrix[ii][cii];
+    if (!is_plus_infinity(twice_lb)) {
+      assign_r(lower_bound, twice_lb, ROUND_NOT_NEEDED);
+      neg_assign_r(lower_bound, lower_bound, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(lower_bound, lower_bound, 1, ROUND_NOT_NEEDED);
+      lower.set(GREATER_OR_EQUAL, lower_bound);
+    }
+    seq_i.build(lower, upper);
+  }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Polyhedron& ph, Complexity_Class complexity)
+  : seq(check_space_dimension_overflow(ph.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(ph)",
+                                       "ph exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  // We do not need to bother about `complexity' if:
+  // a) the polyhedron is already marked empty; or ...
+  if (ph.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // b) the polyhedron is zero-dimensional; or ...
+  const dimension_type space_dim = ph.space_dimension();
+  if (space_dim == 0)
+    return;
+
+  // c) the polyhedron is already described by a generator system.
+  if (ph.generators_are_up_to_date() && !ph.has_pending_constraints()) {
+    Box tmp(ph.generators());
+    m_swap(tmp);
+    return;
+  }
+
+  // Here generators are not up-to-date or there are pending constraints.
+  PPL_ASSERT(ph.constraints_are_up_to_date());
+
+  if (complexity == POLYNOMIAL_COMPLEXITY) {
+    // FIXME: is there a way to avoid this initialization?
+    for (dimension_type i = space_dim; i-- > 0; )
+      seq[i].assign(UNIVERSE);
+    // Get a simplified version of the constraints.
+    const Constraint_System cs = ph.simplified_constraints();
+    // Propagate easy-to-find bounds from the constraints,
+    // allowing for a limited number of iterations.
+    // FIXME: 20 is just a wild guess.
+    const dimension_type max_iterations = 20;
+    propagate_constraints_no_check(cs, max_iterations);
+  }
+  else if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(space_dim);
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality()) {
+          const Linear_Expression expr(c.expression());
+          lp.add_constraint(expr >= 0);
+        }
+        else
+          lp.add_constraint(c);
+      }
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      set_empty();
+      return;
+    }
+    // Get all the bounds for the space dimensions.
+    Generator g(point());
+    PPL_DIRTY_TEMP(mpq_class, lower_bound);
+    PPL_DIRTY_TEMP(mpq_class, upper_bound);
+    PPL_DIRTY_TEMP(Coefficient, bound_numer);
+    PPL_DIRTY_TEMP(Coefficient, bound_denom);
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      I_Constraint<mpq_class> lower;
+      I_Constraint<mpq_class> upper;
+      ITV& seq_i = seq[i];
+      lp.set_objective_function(Variable(i));
+      // Evaluate upper bound.
+      lp.set_optimization_mode(MAXIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, bound_numer, bound_denom);
+        assign_r(upper_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+        assign_r(upper_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+        PPL_ASSERT(is_canonical(upper_bound));
+        upper.set(LESS_OR_EQUAL, upper_bound);
+      }
+      // Evaluate optimal lower bound.
+      lp.set_optimization_mode(MINIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, bound_numer, bound_denom);
+        assign_r(lower_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+        assign_r(lower_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+        PPL_ASSERT(is_canonical(lower_bound));
+        lower.set(GREATER_OR_EQUAL, lower_bound);
+      }
+      seq_i.build(lower, upper);
+    }
+  }
+  else {
+    PPL_ASSERT(complexity == ANY_COMPLEXITY);
+    if (ph.is_empty())
+      set_empty();
+    else {
+      Box tmp(ph.generators());
+      m_swap(tmp);
+    }
+  }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Grid& gr, Complexity_Class)
+  : seq(check_space_dimension_overflow(gr.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(gr)",
+                                       "gr exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+
+  if (gr.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = gr.space_dimension();
+
+  if (space_dim == 0)
+    return;
+
+  if (!gr.generators_are_up_to_date() && !gr.update_generators()) {
+    // Updating found the grid empty.
+    set_empty();
+    return;
+  }
+
+  PPL_ASSERT(!gr.gen_sys.empty());
+
+  // For each dimension that is bounded by the grid, set both bounds
+  // of the interval to the value of the associated coefficient in a
+  // generator point.
+  PPL_DIRTY_TEMP(mpq_class, bound);
+  PPL_DIRTY_TEMP(Coefficient, bound_numer);
+  PPL_DIRTY_TEMP(Coefficient, bound_denom);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    Variable var(i);
+    bool max;
+    if (gr.maximize(var, bound_numer, bound_denom, max)) {
+      assign_r(bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+      assign_r(bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+      bound.canonicalize();
+      seq_i.build(i_constraint(EQUAL, bound));
+    }
+    else
+      seq_i.assign(UNIVERSE);
+  }
+}
+
+template <typename ITV>
+template <typename D1, typename D2, typename R>
+Box<ITV>::Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+              Complexity_Class complexity)
+  : seq(), status() {
+  check_space_dimension_overflow(dp.space_dimension(),
+                                 max_space_dimension(),
+                                 "PPL::Box::",
+                                 "Box(dp)",
+                                 "dp exceeds the maximum "
+                                 "allowed space dimension");
+  Box tmp1(dp.domain1(), complexity);
+  Box tmp2(dp.domain2(), complexity);
+  tmp1.intersection_assign(tmp2);
+  m_swap(tmp1);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Box::",
+                                 "add_space_dimensions_and_embed(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+  // To embed an n-dimension space box in a (n+m)-dimension space,
+  // we just add `m' new universe elements to the sequence.
+  seq.insert(seq.end(), m, ITV(UNIVERSE));
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Box::",
+                                 "add_space_dimensions_and_project(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+  // Add `m' new zero elements to the sequence.
+  seq.insert(seq.end(), m, ITV(0));
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+operator==(const Box<ITV>& x, const Box<ITV>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  if (x.is_empty())
+    return y.is_empty();
+
+  if (y.is_empty())
+    return x.is_empty();
+
+  for (dimension_type k = x_space_dim; k-- > 0; )
+    if (x.seq[k] != y.seq[k])
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::bounds(const Linear_Expression& expr, const bool from_above) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+  // A zero-dimensional or empty Box bounds everything.
+  if (space_dim == 0 || is_empty())
+    return true;
+
+  const int from_above_sign = from_above ? 1 : -1;
+  // TODO: This loop can be optimized more, if needed, exploiting the
+  // (possible) sparseness of expr.
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.end(); i != i_end; ++i) {
+    const Variable v = i.variable();
+    switch (sgn(*i) * from_above_sign) {
+    case 1:
+      if (seq[v.id()].upper_is_boundary_infinity())
+        return false;
+      break;
+    case 0:
+      PPL_UNREACHABLE;
+      break;
+    case -1:
+      if (seq[v.id()].lower_is_boundary_infinity())
+        return false;
+      break;
+    }
+  }
+  return true;
+}
+
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+                  const Constraint::Type constraint_type,
+                  Coefficient_traits::const_reference numer,
+                  Coefficient_traits::const_reference denom) {
+
+  if (i.is_universe())
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_DIRTY_TEMP(mpq_class, bound);
+  assign_r(bound.get_num(), numer, ROUND_NOT_NEEDED);
+  assign_r(bound.get_den(), denom, ROUND_NOT_NEEDED);
+  bound.canonicalize();
+  neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+  const bool is_lower_bound = (denom > 0);
+
+  PPL_DIRTY_TEMP(mpq_class, bound_diff);
+  if (constraint_type == Constraint::EQUALITY) {
+    if (i.lower_is_boundary_infinity()) {
+      PPL_ASSERT(!i.upper_is_boundary_infinity());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        return i.upper_is_open()
+          ? Poly_Con_Relation::is_disjoint()
+          : Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::is_disjoint();
+      case 0:
+        if (i.lower_is_open())
+          return Poly_Con_Relation::is_disjoint();
+        if (i.is_singleton())
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        if (i.upper_is_boundary_infinity())
+          return Poly_Con_Relation::strictly_intersects();
+        else {
+          assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+          sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+          switch (sgn(bound_diff)) {
+          case 1:
+            return Poly_Con_Relation::strictly_intersects();
+          case 0:
+            if (i.upper_is_open())
+              return Poly_Con_Relation::is_disjoint();
+            else
+              return Poly_Con_Relation::strictly_intersects();
+          case -1:
+            return Poly_Con_Relation::is_disjoint();
+          }
+        }
+      }
+    }
+  }
+
+  PPL_ASSERT(constraint_type != Constraint::EQUALITY);
+  if (is_lower_bound) {
+    if (i.lower_is_boundary_infinity()) {
+      PPL_ASSERT(!i.upper_is_boundary_infinity());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (constraint_type == Constraint::STRICT_INEQUALITY
+            || i.upper_is_open())
+          return Poly_Con_Relation::is_disjoint();
+        else
+          return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+            || i.lower_is_open()) {
+          Poly_Con_Relation result = Poly_Con_Relation::is_included();
+          if (i.is_singleton())
+            result = result && Poly_Con_Relation::saturates();
+          return result;
+        }
+        else {
+          PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+                 && !i.lower_is_open());
+          if (i.is_singleton())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          else
+            return Poly_Con_Relation::strictly_intersects();
+        }
+      case -1:
+        if (i.upper_is_boundary_infinity())
+          return Poly_Con_Relation::strictly_intersects();
+        else {
+          assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+          sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+          switch (sgn(bound_diff)) {
+          case 1:
+            return Poly_Con_Relation::strictly_intersects();
+          case 0:
+            if (constraint_type == Constraint::STRICT_INEQUALITY
+                || i.upper_is_open())
+              return Poly_Con_Relation::is_disjoint();
+            else
+              return Poly_Con_Relation::strictly_intersects();
+          case -1:
+            return Poly_Con_Relation::is_disjoint();
+          }
+        }
+      }
+    }
+  }
+  else {
+    // `c' is an upper bound.
+    if (i.upper_is_boundary_infinity())
+      return Poly_Con_Relation::strictly_intersects();
+    else {
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case -1:
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+            || i.upper_is_open()) {
+          Poly_Con_Relation result = Poly_Con_Relation::is_included();
+          if (i.is_singleton())
+            result = result && Poly_Con_Relation::saturates();
+          return result;
+        }
+        else {
+          PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+                 && !i.upper_is_open());
+          if (i.is_singleton())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          else
+            return Poly_Con_Relation::strictly_intersects();
+        }
+      case 1:
+        if (i.lower_is_boundary_infinity())
+          return Poly_Con_Relation::strictly_intersects();
+        else {
+          assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+          sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+          switch (sgn(bound_diff)) {
+          case -1:
+            return Poly_Con_Relation::strictly_intersects();
+          case 0:
+            if (constraint_type == Constraint::STRICT_INEQUALITY
+                || i.lower_is_open())
+              return Poly_Con_Relation::is_disjoint();
+            else
+              return Poly_Con_Relation::strictly_intersects();
+          case 1:
+            return Poly_Con_Relation::is_disjoint();
+          }
+        }
+      }
+    }
+  }
+
+  // Quiet a compiler warning: this program point is unreachable.
+  PPL_UNREACHABLE;
+  return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  if (cg.is_equality()) {
+    const Constraint c(cg);
+    return relation_with(c);
+  }
+
+  PPL_DIRTY_TEMP(Rational_Interval, r);
+  PPL_DIRTY_TEMP(Rational_Interval, t);
+  PPL_DIRTY_TEMP(mpq_class, m);
+  r = 0;
+  for (Congruence::expr_type::const_iterator i = cg.expression().begin(),
+      i_end = cg.expression().end(); i != i_end; ++i) {
+    const Coefficient& cg_i = *i;
+    const Variable v = i.variable();
+    assign_r(m, cg_i, ROUND_NOT_NEEDED);
+    // FIXME: an add_mul_assign() method would come handy here.
+    t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+    t *= m;
+    r += t;
+  }
+
+  if (r.lower_is_boundary_infinity() || r.upper_is_boundary_infinity())
+    return Poly_Con_Relation::strictly_intersects();
+
+
+  // Find the value that satisfies the congruence and is
+  // nearest to the lower bound such that the point lies on or above it.
+
+  PPL_DIRTY_TEMP_COEFFICIENT(lower);
+  PPL_DIRTY_TEMP_COEFFICIENT(mod);
+  PPL_DIRTY_TEMP_COEFFICIENT(v);
+  mod = cg.modulus();
+  v = cg.inhomogeneous_term() % mod;
+  assign_r(lower, r.lower(), ROUND_DOWN);
+  v -= ((lower / mod) * mod);
+  if (v + lower > 0)
+    v -= mod;
+  return interval_relation(r, Constraint::EQUALITY, v);
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+
+  if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+    if (c_num_vars == 0)
+      // c is a trivial constraint.
+      switch (sgn(c.inhomogeneous_term())) {
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      case 0:
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::saturates()
+            && Poly_Con_Relation::is_disjoint();
+        else
+          return Poly_Con_Relation::saturates()
+            && Poly_Con_Relation::is_included();
+      case 1:
+        return Poly_Con_Relation::is_included();
+      }
+    else {
+      // c is an interval constraint.
+      return interval_relation(seq[c_only_var],
+                               c.type(),
+                               c.inhomogeneous_term(),
+                               c.coefficient(Variable(c_only_var)));
+    }
+  else {
+    // Deal with a non-trivial and non-interval constraint.
+    PPL_DIRTY_TEMP(Rational_Interval, r);
+    PPL_DIRTY_TEMP(Rational_Interval, t);
+    PPL_DIRTY_TEMP(mpq_class, m);
+    r = 0;
+    const Constraint::expr_type& e = c.expression();
+    for (Constraint::expr_type::const_iterator i = e.begin(), i_end = e.end();
+          i != i_end; ++i) {
+      assign_r(m, *i, ROUND_NOT_NEEDED);
+      const Variable v = i.variable();
+      // FIXME: an add_mul_assign() method would come handy here.
+      t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+      t *= m;
+      r += t;
+    }
+    return interval_relation(r,
+                             c.type(),
+                             c.inhomogeneous_term());
+  }
+
+  // Quiet a compiler warning: this program point is unreachable.
+  PPL_UNREACHABLE;
+  return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Gen_Relation
+Box<ITV>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The empty box cannot subsume a generator.
+  if (is_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe box in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (g.is_line_or_ray()) {
+    if (g.is_line()) {
+      const Generator::expr_type& e = g.expression();
+      for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+           i != i_end; ++i)
+        if (!seq[i.variable().id()].is_universe())
+          return Poly_Gen_Relation::nothing();
+      return Poly_Gen_Relation::subsumes();
+    }
+    else {
+      PPL_ASSERT(g.is_ray());
+      const Generator::expr_type& e = g.expression();
+      for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+           i != i_end; ++i) {
+        const Variable v = i.variable();
+        switch (sgn(*i)) {
+        case 1:
+          if (!seq[v.id()].upper_is_boundary_infinity())
+            return Poly_Gen_Relation::nothing();
+          break;
+        case 0:
+          PPL_UNREACHABLE;
+          break;
+        case -1:
+          if (!seq[v.id()].lower_is_boundary_infinity())
+            return Poly_Gen_Relation::nothing();
+          break;
+        }
+      }
+      return Poly_Gen_Relation::subsumes();
+    }
+  }
+
+  // Here `g' is a point or closure point.
+  const Coefficient& g_divisor = g.divisor();
+  PPL_DIRTY_TEMP(mpq_class, g_coord);
+  PPL_DIRTY_TEMP(mpq_class, bound);
+  // TODO: If the variables in the expression that have coefficient 0
+  // have no effect on seq[i], this loop can be optimized using
+  // Generator::expr_type::const_iterator.
+  for (dimension_type i = g_space_dim; i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    if (seq_i.is_universe())
+      continue;
+    assign_r(g_coord.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    assign_r(g_coord.get_den(), g_divisor, ROUND_NOT_NEEDED);
+    g_coord.canonicalize();
+    // Check lower bound.
+    if (!seq_i.lower_is_boundary_infinity()) {
+      assign_r(bound, seq_i.lower(), ROUND_NOT_NEEDED);
+      if (g_coord <= bound) {
+        if (seq_i.lower_is_open()) {
+          if (g.is_point() || g_coord != bound)
+            return Poly_Gen_Relation::nothing();
+        }
+        else if (g_coord != bound)
+          return Poly_Gen_Relation::nothing();
+      }
+    }
+    // Check upper bound.
+    if (!seq_i.upper_is_boundary_infinity()) {
+      assign_r(bound, seq_i.upper(), ROUND_NOT_NEEDED);
+      if (g_coord >= bound) {
+        if (seq_i.upper_is_open()) {
+          if (g.is_point() || g_coord != bound)
+            return Poly_Gen_Relation::nothing();
+        }
+        else if (g_coord != bound)
+          return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+  return Poly_Gen_Relation::subsumes();
+}
+
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim Box first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  // For an empty Box we simply return false.
+  if (is_empty())
+    return false;
+
+  PPL_DIRTY_TEMP(mpq_class, result);
+  assign_r(result, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  bool is_included = true;
+  const int maximize_sign = maximize ? 1 : -1;
+  PPL_DIRTY_TEMP(mpq_class, bound_i);
+  PPL_DIRTY_TEMP(mpq_class, expr_i);
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.end(); i != i_end; ++i) {
+    const ITV& seq_i = seq[i.variable().id()];
+    assign_r(expr_i, *i, ROUND_NOT_NEEDED);
+    switch (sgn(expr_i) * maximize_sign) {
+    case 1:
+      if (seq_i.upper_is_boundary_infinity())
+        return false;
+      assign_r(bound_i, seq_i.upper(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.upper_is_open())
+        is_included = false;
+      break;
+    case 0:
+      PPL_UNREACHABLE;
+      break;
+    case -1:
+      if (seq_i.lower_is_boundary_infinity())
+        return false;
+      assign_r(bound_i, seq_i.lower(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.lower_is_open())
+        is_included = false;
+      break;
+    }
+  }
+  // Extract output info.
+  PPL_ASSERT(is_canonical(result));
+  ext_n = result.get_num();
+  ext_d = result.get_den();
+  included = is_included;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included,
+                  Generator& g) const {
+  if (!max_min(expr, maximize, ext_n, ext_d, included))
+    return false;
+
+  // Compute generator `g'.
+  Linear_Expression g_expr;
+  PPL_DIRTY_TEMP(Coefficient, g_divisor);
+  g_divisor = 1;
+  const int maximize_sign = maximize ? 1 : -1;
+  PPL_DIRTY_TEMP(mpq_class, g_coord);
+  PPL_DIRTY_TEMP(Coefficient, numer);
+  PPL_DIRTY_TEMP(Coefficient, denom);
+  PPL_DIRTY_TEMP(Coefficient, lcm);
+  PPL_DIRTY_TEMP(Coefficient, factor);
+  // TODO: Check if the following loop can be optimized to exploit the
+  // (possible) sparseness of expr.
+  for (dimension_type i = space_dimension(); i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    switch (sgn(expr.coefficient(Variable(i))) * maximize_sign) {
+    case 1:
+      assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+      break;
+    case 0:
+      // If 0 belongs to the interval, choose it
+      // (and directly proceed to the next iteration).
+      // FIXME: name qualification issue.
+      if (seq_i.contains(0))
+        continue;
+      if (!seq_i.lower_is_boundary_infinity())
+        if (seq_i.lower_is_open())
+          if (!seq_i.upper_is_boundary_infinity())
+            if (seq_i.upper_is_open()) {
+              // Bounded and open interval: compute middle point.
+              assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+              PPL_DIRTY_TEMP(mpq_class, q_seq_i_upper);
+              assign_r(q_seq_i_upper, seq_i.upper(), ROUND_NOT_NEEDED);
+              g_coord += q_seq_i_upper;
+              g_coord /= 2;
+            }
+            else
+              // The upper bound is in the interval.
+              assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+          else {
+            // Lower is open, upper is unbounded.
+            assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+            ++g_coord;
+          }
+        else
+          // The lower bound is in the interval.
+          assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      else {
+        // Lower is unbounded, hence upper is bounded
+        // (since we know that 0 does not belong to the interval).
+        PPL_ASSERT(!seq_i.upper_is_boundary_infinity());
+        assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+        if (seq_i.upper_is_open())
+          --g_coord;
+      }
+      break;
+    case -1:
+      assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      break;
+    }
+    // Add g_coord * Variable(i) to the generator.
+    assign_r(denom, g_coord.get_den(), ROUND_NOT_NEEDED);
+    lcm_assign(lcm, g_divisor, denom);
+    exact_div_assign(factor, lcm, g_divisor);
+    g_expr *= factor;
+    exact_div_assign(factor, lcm, denom);
+    assign_r(numer, g_coord.get_num(), ROUND_NOT_NEEDED);
+    numer *= factor;
+    g_expr += numer * Variable(i);
+    g_divisor = lcm;
+  }
+  g = Generator::point(g_expr, g_divisor);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("contains(y)", y);
+
+  // If `y' is empty, then `x' contains `y'.
+  if (y.is_empty())
+    return true;
+
+  // If `x' is empty, then `x' cannot contain `y'.
+  if (x.is_empty())
+    return false;
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (!x.seq[k].contains(y.seq[k]))
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_disjoint_from(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If any of `x' or `y' is marked empty, then they are disjoint.
+  // Note: no need to use `is_empty', as the following loop is anyway correct.
+  if (x.marked_empty() || y.marked_empty())
+    return true;
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (x.seq[k].is_disjoint_from(y.seq[k]))
+      return true;
+  return false;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::upper_bound_assign_if_exact(const Box& y) {
+  Box& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+  // The lub of a box with an empty box is equal to the first box.
+  if (y.is_empty())
+    return true;
+  if (x.is_empty()) {
+    x = y;
+    return true;
+  }
+
+  bool x_j_does_not_contain_y_j = false;
+  bool y_j_does_not_contain_x_j = false;
+
+  for (dimension_type i = x.seq.size(); i-- > 0; ) {
+    const ITV& x_seq_i = x.seq[i];
+    const ITV& y_seq_i = y.seq[i];
+
+    if (!x_seq_i.can_be_exactly_joined_to(y_seq_i))
+      return false;
+
+    // Note: the use of `y_i_does_not_contain_x_i' is needed
+    // because we want to temporarily preserve the old value
+    // of `y_j_does_not_contain_x_j'.
+    bool y_i_does_not_contain_x_i = !y_seq_i.contains(x_seq_i);
+    if (y_i_does_not_contain_x_i && x_j_does_not_contain_y_j)
+      return false;
+    if (!x_seq_i.contains(y_seq_i)) {
+      if (y_j_does_not_contain_x_j)
+        return false;
+      else
+        x_j_does_not_contain_y_j = true;
+    }
+    if (y_i_does_not_contain_x_i)
+      y_j_does_not_contain_x_j = true;
+  }
+
+  // The upper bound is exact: compute it into *this.
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    x.seq[k].join_assign(y.seq[k]);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::OK() const {
+  if (status.test_empty_up_to_date() && !status.test_empty()) {
+    Box tmp = *this;
+    tmp.reset_empty_up_to_date();
+    if (tmp.check_empty()) {
+#ifndef NDEBUG
+      std::cerr << "The box is empty, but it is marked as non-empty."
+                << std::endl;
+#endif // NDEBUG
+      return false;
+    }
+  }
+
+  // A box that is not marked empty must have meaningful intervals.
+  if (!marked_empty()) {
+    for (dimension_type k = seq.size(); k-- > 0; )
+      if (!seq[k].OK())
+        return false;
+  }
+
+  return true;
+}
+
+template <typename ITV>
+dimension_type
+Box<ITV>::affine_dimension() const {
+  dimension_type d = space_dimension();
+  // A zero-space-dim box always has affine dimension zero.
+  if (d == 0)
+    return 0;
+
+  // An empty box has affine dimension zero.
+  if (is_empty())
+    return 0;
+
+  for (dimension_type k = d; k-- > 0; )
+    if (seq[k].is_singleton())
+      --d;
+
+  return d;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::check_empty() const {
+  PPL_ASSERT(!marked_empty());
+  Box<ITV>& x = const_cast<Box<ITV>&>(*this);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (seq[k].is_empty()) {
+      x.set_empty();
+      return true;
+    }
+  x.set_nonempty();
+  return false;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_universe() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_universe())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_topologically_closed() const {
+  if (ITV::is_always_topologically_closed() || is_empty())
+    return true;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_topologically_closed())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_discrete() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_singleton())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_bounded() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_bounded())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains_integer_point() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].contains_integer_point())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::frequency(const Linear_Expression& expr,
+                  Coefficient& freq_n, Coefficient& freq_d,
+                  Coefficient& val_n, Coefficient& val_d) const {
+  dimension_type space_dim = space_dimension();
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Check if `expr' has a constant value.
+  // If it is constant, set the frequency `freq_n' to 0
+  // and return true. Otherwise the values for \p expr
+  // are not discrete so return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 0 and the value is the inhomogeneous term.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  // For an empty Box, we simply return false.
+  if (is_empty())
+    return false;
+
+  // The Box has at least 1 dimension and is not empty.
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP(mpq_class, tmp);
+  Coefficient c = expr.inhomogeneous_term();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+  val_denom = 1;
+
+  for (Linear_Expression::const_iterator i = expr.begin(), i_end = expr.end();
+       i != i_end; ++i) {
+    const ITV& seq_i = seq[i.variable().id()];
+    // Check if `v' is constant in the BD shape.
+    if (seq_i.is_singleton()) {
+      // If `v' is constant, replace it in `le' by the value.
+      assign_r(tmp, seq_i.lower(), ROUND_NOT_NEEDED);
+      numer = tmp.get_num();
+      denom = tmp.get_den();
+      c *= denom;
+      c += numer * val_denom * (*i);
+      val_denom *= denom;
+      continue;
+    }
+    // The expression `expr' is not constant.
+    return false;
+  }
+
+  // The expression `expr' is constant.
+  freq_n = 0;
+  freq_d = 1;
+
+  // Reduce `val_n' and `val_d'.
+  normalize2(c, val_denom, val_n, val_d);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::constrains(Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  if (marked_empty() || !seq[var_space_dim-1].is_universe())
+    return true;
+  // Now force an emptiness check.
+  return is_empty();
+}
+
+template <typename ITV>
+void
+Box<ITV>::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a box in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for each of the variables in
+  // `vars' before cylindrification.
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi) {
+    ITV& seq_vsi = seq[*vsi];
+    if (!seq_vsi.is_empty())
+      seq_vsi.assign(UNIVERSE);
+    else {
+      set_empty();
+      break;
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::topological_closure_assign() {
+  if (ITV::is_always_topologically_closed() || is_empty())
+    return;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    seq[k].topological_closure_assign();
+}
+
+template <typename ITV>
+void
+Box<ITV>::wrap_assign(const Variables_Set& vars,
+                      Bounded_Integer_Type_Width w,
+                      Bounded_Integer_Type_Representation r,
+                      Bounded_Integer_Type_Overflow o,
+                      const Constraint_System* cs_p,
+                      unsigned complexity_threshold,
+                      bool wrap_individually) {
+#if 0 // Generic implementation commented out.
+  Implementation::wrap_assign(*this,
+                              vars, w, r, o, cs_p,
+                              complexity_threshold, wrap_individually,
+                              "Box");
+#else // Specialized implementation.
+  PPL_USED(wrap_individually);
+  PPL_USED(complexity_threshold);
+  Box& x = *this;
+
+  // Dimension-compatibility check for `*cs_p', if any.
+  const dimension_type vars_space_dim = vars.space_dimension();
+  if (cs_p != 0 && cs_p->space_dimension() > vars_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Box<ITV>::wrap_assign(vars, w, r, o, cs_p, ...):"
+      << std::endl
+      << "vars.space_dimension() == " << vars_space_dim
+      << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Wrapping no variable only requires refining with *cs_p, if any.
+  if (vars.empty()) {
+    if (cs_p != 0)
+      refine_with_constraints(*cs_p);
+    return;
+  }
+
+  // Dimension-compatibility check for `vars'.
+  const dimension_type space_dim = x.space_dimension();
+  if (space_dim < vars_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Box<ITV>::wrap_assign(vars, ...):"
+      << std::endl
+      << "this->space_dimension() == " << space_dim
+      << ", required space dimension == " << vars_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Wrapping an empty polyhedron is a no-op.
+  if (x.is_empty())
+    return;
+
+  // FIXME: temporarily (ab-) using Coefficient.
+  // Set `min_value' and `max_value' to the minimum and maximum values
+  // a variable of width `w' and signedness `s' can take.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  if (r == UNSIGNED) {
+    min_value = 0;
+    mul_2exp_assign(max_value, Coefficient_one(), w);
+    --max_value;
+  }
+  else {
+    PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+    mul_2exp_assign(max_value, Coefficient_one(), w-1);
+    neg_assign(min_value, max_value);
+    --max_value;
+  }
+
+  // FIXME: Build the (integer) quadrant interval.
+  PPL_DIRTY_TEMP(ITV, integer_quadrant_itv);
+  PPL_DIRTY_TEMP(ITV, rational_quadrant_itv);
+  {
+    I_Constraint<Coefficient> lower = i_constraint(GREATER_OR_EQUAL, min_value);
+    I_Constraint<Coefficient> upper = i_constraint(LESS_OR_EQUAL, max_value);
+    integer_quadrant_itv.build(lower, upper);
+    // The rational quadrant is only needed if overflow is undefined.
+    if (o == OVERFLOW_UNDEFINED) {
+      ++max_value;
+      upper = i_constraint(LESS_THAN, max_value);
+      rational_quadrant_itv.build(lower, upper);
+    }
+  }
+
+  const Variables_Set::const_iterator vs_end = vars.end();
+
+  if (cs_p == 0) {
+    // No constraint refinement is needed here.
+    switch (o) {
+    case OVERFLOW_WRAPS:
+      for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+        x.seq[*i].wrap_assign(w, r, integer_quadrant_itv);
+      reset_empty_up_to_date();
+      break;
+    case OVERFLOW_UNDEFINED:
+      for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+        ITV& x_seq_v = x.seq[*i];
+        if (!rational_quadrant_itv.contains(x_seq_v)) {
+          x_seq_v.assign(integer_quadrant_itv);
+        }
+      }
+      break;
+    case OVERFLOW_IMPOSSIBLE:
+      for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+        x.seq[*i].intersect_assign(integer_quadrant_itv);
+      reset_empty_up_to_date();
+      break;
+    }
+    PPL_ASSERT(x.OK());
+    return;
+  }
+
+  PPL_ASSERT(cs_p != 0);
+  const Constraint_System& cs = *cs_p;
+  // A map associating interval constraints to variable indexes.
+  typedef std::map<dimension_type, std::vector<const Constraint*> > map_type;
+  map_type var_cs_map;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         i_end = cs.end(); i != i_end; ++i) {
+    const Constraint& c = *i;
+    dimension_type c_num_vars = 0;
+    dimension_type c_only_var = 0;
+    if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+      if (c_num_vars == 1) {
+        // An interval constraint on variable index `c_only_var'.
+        PPL_ASSERT(c_only_var < space_dim);
+        // We do care about c if c_only_var is going to be wrapped.
+        if (vars.find(c_only_var) != vs_end)
+          var_cs_map[c_only_var].push_back(&c);
+      }
+      else {
+        PPL_ASSERT(c_num_vars == 0);
+        // Note: tautologies have been filtered out by iterators.
+        PPL_ASSERT(c.is_inconsistent());
+        x.set_empty();
+        return;
+      }
+    }
+  }
+
+  PPL_DIRTY_TEMP(ITV, refinement_itv);
+  const map_type::const_iterator var_cs_map_end = var_cs_map.end();
+  // Loop through the variable indexes in `vars'.
+  for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+    const dimension_type v = *i;
+    refinement_itv = integer_quadrant_itv;
+    // Look for the refinement constraints for space dimension index `v'.
+    map_type::const_iterator var_cs_map_iter = var_cs_map.find(v);
+    if (var_cs_map_iter != var_cs_map_end) {
+      // Refine interval for variable `v'.
+      const map_type::mapped_type& var_cs = var_cs_map_iter->second;
+      for (dimension_type j = var_cs.size(); j-- > 0; ) {
+        const Constraint& c = *var_cs[j];
+        refine_interval_no_check(refinement_itv,
+                                 c.type(),
+                                 c.inhomogeneous_term(),
+                                 c.coefficient(Variable(v)));
+      }
+    }
+    // Wrap space dimension index `v'.
+    ITV& x_seq_v = x.seq[v];
+    switch (o) {
+    case OVERFLOW_WRAPS:
+      x_seq_v.wrap_assign(w, r, refinement_itv);
+      break;
+    case OVERFLOW_UNDEFINED:
+      if (!rational_quadrant_itv.contains(x_seq_v))
+        x_seq_v.assign(UNIVERSE);
+      break;
+    case OVERFLOW_IMPOSSIBLE:
+      x_seq_v.intersect_assign(refinement_itv);
+      break;
+    }
+  }
+  PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(Complexity_Class) {
+  if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+      && !ITV::info_type::store_open)
+    return;
+
+  if (marked_empty())
+    return;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    seq[k].drop_some_non_integer_points();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(const Variables_Set& vars,
+                                       Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+      && !ITV::info_type::store_open)
+    return;
+
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator v_i = vars.begin(),
+         v_end = vars.end(); v_i != v_end; ++v_i)
+    seq[*v_i].drop_some_non_integer_points();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::intersection_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two boxes is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both boxes are zero-dimensional, then at this point they are
+  // necessarily non-empty, so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // FIXME: here we may conditionally exploit a capability of the
+  // underlying interval to eagerly detect empty results.
+  reset_empty_up_to_date();
+
+  for (dimension_type k = space_dim; k-- > 0; )
+    x.seq[k].intersect_assign(y.seq[k]);
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::upper_bound_assign(const Box& y) {
+  Box& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+  // The lub of a box with an empty box is equal to the first box.
+  if (y.is_empty())
+    return;
+  if (x.is_empty()) {
+    x = y;
+    return;
+  }
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    x.seq[k].join_assign(y.seq[k]);
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::concatenate_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is marked empty, the result will be empty too.
+  if (y.marked_empty())
+    x.set_empty();
+
+  // If `y' is a 0-dim space box, there is nothing left to do.
+  if (y_space_dim == 0)
+    return;
+  // The resulting space dimension must be at most the maximum.
+  check_space_dimension_overflow(y.space_dimension(),
+                                 max_space_dimension() - space_dimension(),
+                                 "PPL::Box::",
+                                 "concatenate_assign(y)",
+                                 "concatenation exceeds the maximum "
+                                 "allowed space dimension");
+  // Here `y_space_dim > 0', so that a non-trivial concatenation will occur:
+  // make sure that reallocation will occur once at most.
+  x.seq.reserve(x_space_dim + y_space_dim);
+
+  // If `x' is marked empty, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x.marked_empty()) {
+    x.seq.insert(x.seq.end(), y_space_dim, ITV(EMPTY));
+    PPL_ASSERT(x.OK());
+    return;
+  }
+
+  // Here neither `x' nor `y' are marked empty: concatenate them.
+  std::copy(y.seq.begin(), y.seq.end(),
+            std::back_insert_iterator<Sequence>(x.seq));
+  // Update the `empty_up_to_date' flag.
+  if (!y.status.test_empty_up_to_date())
+    reset_empty_up_to_date();
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::difference_assign(const Box& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("difference_assign(y)", y);
+
+  Box& x = *this;
+  if (x.is_empty() || y.is_empty())
+    return;
+
+  switch (space_dim) {
+  case 0:
+    // If `x' is zero-dimensional, then at this point both `x' and `y'
+    // are the universe box, so that their difference is empty.
+    x.set_empty();
+    break;
+
+  case 1:
+    x.seq[0].difference_assign(y.seq[0]);
+    if (x.seq[0].is_empty())
+      x.set_empty();
+    break;
+
+  default:
+    {
+      dimension_type index_non_contained = space_dim;
+      dimension_type number_non_contained = 0;
+      for (dimension_type i = space_dim; i-- > 0; )
+        if (!y.seq[i].contains(x.seq[i])) {
+          if (++number_non_contained == 1)
+            index_non_contained = i;
+          else
+            break;
+        }
+
+      switch (number_non_contained) {
+      case 0:
+        // `y' covers `x': the difference is empty.
+        x.set_empty();
+        break;
+      case 1:
+        x.seq[index_non_contained]
+          .difference_assign(y.seq[index_non_contained]);
+        if (x.seq[index_non_contained].is_empty())
+          x.set_empty();
+        break;
+      default:
+        // Nothing to do: the difference is `x'.
+        break;
+      }
+    }
+    break;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+Box<ITV>::simplify_using_context_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type num_dims = x.space_dimension();
+  // Dimension-compatibility check.
+  if (num_dims != y.space_dimension())
+    x.throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+  // Filter away the zero-dimensional case.
+  if (num_dims == 0) {
+    if (y.marked_empty()) {
+      x.set_nonempty();
+      return false;
+    }
+    else
+      return !x.marked_empty();
+  }
+
+  // Filter away the case when `y' is empty.
+  if (y.is_empty()) {
+    for (dimension_type i = num_dims; i-- > 0; )
+      x.seq[i].assign(UNIVERSE);
+    x.set_nonempty();
+    return false;
+  }
+
+  if (x.is_empty()) {
+    // Find in `y' a non-universe interval, if any.
+    for (dimension_type i = 0; i < num_dims; ++i) {
+      if (y.seq[i].is_universe())
+        x.seq[i].assign(UNIVERSE);
+      else {
+        // Set x.seq[i] so as to contradict y.seq[i], if possible.
+        ITV& seq_i = x.seq[i];
+        seq_i.empty_intersection_assign(y.seq[i]);
+        if (seq_i.is_empty()) {
+          // We were not able to assign to `seq_i' a non-empty interval:
+          // reset `seq_i' to the universe interval and keep searching.
+          seq_i.assign(UNIVERSE);
+          continue;
+        }
+        // We assigned to `seq_i' a non-empty interval:
+        // set the other intervals to universe and return.
+        for (++i; i < num_dims; ++i)
+          x.seq[i].assign(UNIVERSE);
+        x.set_nonempty();
+        PPL_ASSERT(x.OK());
+        return false;
+      }
+    }
+    // All intervals in `y' are universe or could not be contradicted:
+    // simplification can leave the empty box `x' as is.
+    PPL_ASSERT(x.OK() && x.is_empty());
+    return false;
+  }
+
+  // Loop index `i' is intentionally going upwards.
+  for (dimension_type i = 0; i < num_dims; ++i) {
+    if (!x.seq[i].simplify_using_context_assign(y.seq[i])) {
+      PPL_ASSERT(!x.seq[i].is_empty());
+      // The intersection of `x' and `y' is empty due to the i-th interval:
+      // reset other intervals to UNIVERSE.
+      for (dimension_type j = num_dims; j-- > i; )
+        x.seq[j].assign(UNIVERSE);
+      for (dimension_type j = i; j-- > 0; )
+        x.seq[j].assign(UNIVERSE);
+      PPL_ASSERT(x.OK());
+      return false;
+    }
+  }
+  PPL_ASSERT(x.OK());
+  return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::time_elapse_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("time_elapse_assign(y)", y);
+
+  // Dealing with the zero-dimensional case.
+  if (x_space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  // Note: if possible, avoid cost of checking for emptiness.
+  if (x.marked_empty() || y.marked_empty()
+      || x.is_empty() || y.is_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    ITV& x_seq_i = x.seq[i];
+    const ITV& y_seq_i = y.seq[i];
+    if (!x_seq_i.lower_is_boundary_infinity())
+      if (y_seq_i.lower_is_boundary_infinity() || y_seq_i.lower() < 0)
+        x_seq_i.lower_extend();
+    if (!x_seq_i.upper_is_boundary_infinity())
+      if (y_seq_i.upper_is_boundary_infinity() || y_seq_i.upper() > 0)
+        x_seq_i.upper_extend();
+  }
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a box in a zero-dimensional space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  const dimension_type old_space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  const dimension_type vsi_space_dim = vars.space_dimension();
+  if (old_space_dim < vsi_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)",
+                                 vsi_space_dim);
+
+  const dimension_type new_space_dim = old_space_dim - vars.size();
+
+  // If the box is empty (this must be detected), then resizing is all
+  // what is needed.  If it is not empty and we are removing _all_ the
+  // dimensions then, again, resizing suffices.
+  if (is_empty() || new_space_dim == 0) {
+    seq.resize(new_space_dim);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // For each variable to be removed, we fill the corresponding interval
+  // by shifting left those intervals that will not be removed.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  dimension_type dst = *vsi;
+  dimension_type src = dst + 1;
+  for (++vsi; vsi != vsi_end; ++vsi) {
+    const dimension_type vsi_next = *vsi;
+    // All intervals in between are moved to the left.
+    while (src < vsi_next)
+      swap(seq[dst++], seq[src++]);
+    ++src;
+  }
+  // Moving the remaining intervals.
+  while (src < old_space_dim)
+    swap(seq[dst++], seq[src++]);
+
+  PPL_ASSERT(dst == new_space_dim);
+  seq.resize(new_space_dim);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  const dimension_type space_dim = space_dimension();
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+                                 new_dimension);
+
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space box.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  seq.resize(new_dimension);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename Partial_Function>
+void
+Box<ITV>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the box becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If the box is empty, then simply adjust the space dimension.
+  if (is_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // We create a new Box with the new space dimension.
+  Box<ITV> tmp(new_space_dim);
+  // Map the intervals, exchanging the indexes.
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i, new_i))
+      swap(seq[i], tmp.seq[new_i]);
+  }
+  m_swap(tmp);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::fold_space_dimensions(const Variables_Set& vars,
+                                const Variable dest) {
+  const dimension_type space_dim = space_dimension();
+  // `dest' should be one of the dimensions of the box.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the box.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  // Note: the check for emptiness is needed for correctness.
+  if (!is_empty()) {
+    // Join the interval corresponding to variable `dest' with the intervals
+    // corresponding to the variables in `vars'.
+    ITV& seq_v = seq[dest.id()];
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vs_end = vars.end(); i != vs_end; ++i)
+      seq_v.join_assign(seq[*i]);
+  }
+  remove_space_dimensions(vars);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraint_no_check(const Constraint& c) {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+  // Throw an exception if c is not an interval constraints.
+  if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+    throw_invalid_argument("add_constraint(c)",
+                           "c is not an interval constraint");
+
+  // Throw an exception if c is a nontrivial strict constraint
+  // and ITV does not support open boundaries.
+  if (c.is_strict_inequality() && c_num_vars != 0
+      && ITV::is_always_topologically_closed())
+    throw_invalid_argument("add_constraint(c)",
+                           "c is a nontrivial strict constraint");
+
+  // Avoid doing useless work if the box is known to be empty.
+  if (marked_empty())
+    return;
+
+  const Coefficient& n = c.inhomogeneous_term();
+  if (c_num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (n < 0
+        || (c.is_equality() && n != 0)
+        || (c.is_strict_inequality() && n == 0))
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(c_num_vars == 1);
+  const Coefficient& d = c.coefficient(Variable(c_only_var));
+  add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraints_no_check(const Constraint_System& cs) {
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+  // Note: even when the box is known to be empty, we need to go
+  // through all the constraints to fulfill the method's contract
+  // for what concerns exception throwing.
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    add_constraint_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruence_no_check(const Congruence& cg) {
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  // Set aside the case of proper congruences.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    else if (cg.is_tautological())
+      return;
+    else
+      throw_invalid_argument("add_congruence(cg)",
+                             "cg is a nontrivial proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  dimension_type cg_num_vars = 0;
+  dimension_type cg_only_var = 0;
+  // Throw an exception if c is not an interval congruence.
+  if (!Box_Helpers::extract_interval_congruence(cg, cg_num_vars, cg_only_var))
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is not an interval congruence");
+
+  // Avoid doing useless work if the box is known to be empty.
+  if (marked_empty())
+    return;
+
+  const Coefficient& n = cg.inhomogeneous_term();
+  if (cg_num_vars == 0) {
+    // Dealing with a trivial equality congruence.
+    if (n != 0)
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(cg_num_vars == 1);
+  const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+  add_interval_constraint_no_check(cg_only_var, Constraint::EQUALITY, n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruences_no_check(const Congruence_System& cgs) {
+  PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+  // Note: even when the box is known to be empty, we need to go
+  // through all the congruences to fulfill the method's contract
+  // for what concerns exception throwing.
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    add_congruence_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+  PPL_ASSERT(!marked_empty());
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+  // Non-interval constraints are approximated.
+  if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+    propagate_constraint_no_check(c);
+    return;
+  }
+
+  const Coefficient& n = c.inhomogeneous_term();
+  if (c_num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (n < 0
+        || (c.is_equality() && n != 0)
+        || (c.is_strict_inequality() && n == 0))
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(c_num_vars == 1);
+  const Coefficient& d = c.coefficient(Variable(c_only_var));
+  add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint_System& cs) {
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  if (cg.is_proper_congruence()) {
+    // A proper congruences is also an interval constraint
+    // if and only if it is trivial.
+    if (cg.is_inconsistent())
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  refine_no_check(c);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence_System& cgs) {
+  PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+#if 1 // Alternative implementations for propagate_constraint_no_check.
+namespace Implementation {
+
+namespace Boxes {
+
+inline bool
+propagate_constraint_check_result(Result r, Ternary& open) {
+  r = result_relation_class(r);
+  switch (r) {
+  case V_GT_MINUS_INFINITY:
+  case V_LT_PLUS_INFINITY:
+    return true;
+  case V_LT:
+  case V_GT:
+    open = T_YES;
+    return false;
+  case V_LE:
+  case V_GE:
+    if (open == T_NO)
+      open = T_MAYBE;
+    return false;
+  case V_EQ:
+    return false;
+  default:
+    PPL_UNREACHABLE;
+    return true;
+  }
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+  using namespace Implementation::Boxes;
+
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  typedef
+    typename Select_Temp_Boundary_Type<typename ITV::boundary_type>::type
+    Temp_Boundary_Type;
+
+  const dimension_type c_space_dim = c.space_dimension();
+  const Constraint::Type c_type = c.type();
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+
+  // Find a space dimension having a non-zero coefficient (if any).
+  const dimension_type last_k
+    = c.expression().last_nonzero(1, c_space_dim + 1);
+  if (last_k == c_space_dim + 1) {
+    // Constraint c is trivial: check if it is inconsistent.
+    if (c_inhomogeneous_term < 0
+        || (c_inhomogeneous_term == 0
+            && c_type != Constraint::NONSTRICT_INEQUALITY))
+      set_empty();
+    return;
+  }
+
+  // Here constraint c is non-trivial.
+  PPL_ASSERT(last_k <= c_space_dim);
+  Temp_Boundary_Type t_bound;
+  Temp_Boundary_Type t_a;
+  Temp_Boundary_Type t_x;
+  Ternary open;
+  const Constraint::expr_type c_e = c.expression();
+  for (Constraint::expr_type::const_iterator k = c_e.begin(),
+         k_end = c_e.lower_bound(Variable(last_k)); k != k_end; ++k) {
+    const Coefficient& a_k = *k;
+    const Variable k_var = k.variable();
+    const int sgn_a_k = sgn(a_k);
+    if (sgn_a_k == 0)
+      continue;
+    Result r;
+    if (sgn_a_k > 0) {
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+        maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(last_k)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.lower_is_boundary_infinity())
+            goto maybe_refine_upper_1;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.upper_is_boundary_infinity())
+            goto maybe_refine_upper_1;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+
+      // Refine the lower bound of `seq[k]' with `t_bound'.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      {
+        const Relation_Symbol rel
+          = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+        seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      }
+      reset_empty_up_to_date();
+    maybe_refine_upper_1:
+      if (c_type != Constraint::EQUALITY)
+        continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.upper_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.lower_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      const Relation_Symbol rel
+        = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+      seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      reset_empty_up_to_date();
+    }
+    else {
+      PPL_ASSERT(sgn_a_k < 0);
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+        maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.lower_is_boundary_infinity())
+            goto maybe_refine_upper_2;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.upper_is_boundary_infinity())
+            goto maybe_refine_upper_2;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      {
+        const Relation_Symbol rel
+          = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+        seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      }
+      reset_empty_up_to_date();
+    maybe_refine_upper_2:
+      if (c_type != Constraint::EQUALITY)
+        continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.upper_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.lower_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+
+      // Refine the lower bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      const Relation_Symbol rel
+        = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+      seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      reset_empty_up_to_date();
+    }
+  next_k:
+    ;
+  }
+}
+
+#else // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  dimension_type c_space_dim = c.space_dimension();
+  ITV k[c_space_dim];
+  ITV p[c_space_dim];
+  for (Constraint::expr_type::const_iterator i = c_e.begin(),
+        i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+    const Variable i_var = i.variable();
+    k[i_var.id()] = *i;
+    ITV& p_i = p[i_var.id()];
+    p_i = seq[i_var.id()];
+    p_i.mul_assign(p_i, k[i_var.id()]);
+  }
+  const Coefficient& inhomogeneous_term = c.inhomogeneous_term();
+  for (Constraint::expr_type::const_iterator i = c_e.begin(),
+        i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+    const Variable i_var = i.variable();
+    int sgn_coefficient_i = sgn(*i);
+    ITV q(inhomogeneous_term);
+    for (Constraint::expr_type::const_iterator j = c_e.begin(),
+          j_end = c_e.lower_bound(Variable(c_space_dim)); j != j_end; ++j) {
+      const Variable j_var = j.variable();
+      if (i_var == j_var)
+        continue;
+      q.add_assign(q, p[j_var.id()]);
+    }
+    q.div_assign(q, k[i_var.id()]);
+    q.neg_assign(q);
+    Relation_Symbol rel;
+    switch (c.type()) {
+    case Constraint::EQUALITY:
+      rel = EQUAL;
+      break;
+    case Constraint::NONSTRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_THAN : LESS_THAN;
+      break;
+    }
+    seq[i_var.id()].add_constraint(i_constraint(rel, q));
+    // FIXME: could/should we exploit the return value of add_constraint
+    //        in case it is available?
+    // FIXME: should we instead be lazy and do not even bother about
+    //        the possibility the interval becomes empty apart from setting
+    //        empty_up_to_date = false?
+    if (seq[i_var.id()].is_empty()) {
+      set_empty();
+      break;
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+#endif // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>
+::propagate_constraints_no_check(const Constraint_System& cs,
+                                 const dimension_type max_iterations) {
+  const dimension_type space_dim = space_dimension();
+  PPL_ASSERT(cs.space_dimension() <= space_dim);
+
+  const Constraint_System::const_iterator cs_begin = cs.begin();
+  const Constraint_System::const_iterator cs_end = cs.end();
+  const dimension_type propagation_weight
+    = Implementation::num_constraints(cs) * space_dim;
+
+  Sequence copy;
+  bool changed;
+  dimension_type num_iterations = 0;
+  do {
+    WEIGHT_BEGIN();
+    ++num_iterations;
+    copy = seq;
+    for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i)
+      propagate_constraint_no_check(*i);
+
+    WEIGHT_ADD_MUL(40, propagation_weight);
+    // Check if the client has requested abandoning all expensive
+    // computations.  If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // NOTE: if max_iterations == 0 (i.e., no iteration limit is set)
+    // the following test will anyway trigger on wrap around.
+    if (num_iterations == max_iterations)
+      break;
+
+    changed = (copy != seq);
+  } while (changed);
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_image(const Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  Tmp_Interval_Type expr_value;
+  Tmp_Interval_Type temp0;
+  Tmp_Interval_Type temp1;
+  expr_value.assign(expr.inhomogeneous_term());
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.end(); i != i_end; ++i) {
+    temp0.assign(*i);
+    temp1.assign(seq[i.variable().id()]);
+    temp0.mul_assign(temp0, temp1);
+    expr_value.add_assign(expr_value, temp0);
+  }
+  if (denominator != 1) {
+    temp0.assign(denominator);
+    expr_value.div_assign(expr_value, temp0);
+  }
+  seq[var.id()].assign(expr_value);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_form_image(const Variable var,
+                            const Linear_Form<ITV>& lf) {
+
+  // Check that ITV has a floating point boundary type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<typename ITV::boundary_type>
+            ::is_exact, "Box<ITV>::affine_form_image(Variable, Linear_Form):"
+                        "ITV has not a floating point boundary type.");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(var, lf)", "lf", lf);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_form_image(var, lf)", "var", var);
+
+  if (is_empty())
+    return;
+
+  // Intervalization of 'lf'.
+  ITV result = lf.inhomogeneous_term();
+  for (dimension_type i = 0; i < lf_space_dim; ++i) {
+    ITV current_addend = lf.coefficient(Variable(i));
+    const ITV& curr_int = seq[i];
+    current_addend *= curr_int;
+    result += current_addend;
+  }
+
+  seq[var.id()].assign(result);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_preimage(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference
+                          denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type x_space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (x_space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x_space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  const Coefficient& expr_v = expr.coefficient(var);
+  const bool invertible = (expr_v != 0);
+  if (!invertible) {
+    Tmp_Interval_Type expr_value;
+    Tmp_Interval_Type temp0;
+    Tmp_Interval_Type temp1;
+    expr_value.assign(expr.inhomogeneous_term());
+    for (Linear_Expression::const_iterator i = expr.begin(),
+            i_end = expr.end(); i != i_end; ++i) {
+      temp0.assign(*i);
+      temp1.assign(seq[i.variable().id()]);
+      temp0.mul_assign(temp0, temp1);
+      expr_value.add_assign(expr_value, temp0);
+    }
+    if (denominator != 1) {
+      temp0.assign(denominator);
+      expr_value.div_assign(expr_value, temp0);
+    }
+    ITV& x_seq_v = seq[var.id()];
+    expr_value.intersect_assign(x_seq_v);
+    if (expr_value.is_empty())
+      set_empty();
+    else
+      x_seq_v.assign(UNIVERSE);
+  }
+  else {
+    // The affine transformation is invertible.
+    // CHECKME: for efficiency, would it be meaningful to avoid
+    // the computation of inverse by partially evaluating the call
+    // to affine_image?
+    Linear_Expression inverse;
+    inverse -= expr;
+    inverse += (expr_v + denominator) * var;
+    affine_image(var, inverse, expr_v);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+    // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
+
+  // Add the constraint implied by the `lb_expr' and `ub_expr'.
+  if (denominator > 0)
+    refine_with_constraint(lb_expr <= ub_expr);
+  else
+    refine_with_constraint(lb_expr >= ub_expr);
+
+  // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+  if (lb_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `ub_expr'.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    if (denominator > 0)
+      refine_with_constraint(lb_expr <= denominator*var);
+    else
+      refine_with_constraint(denominator*var <= lb_expr);
+  }
+  else if (ub_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `lb_expr'.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    if (denominator > 0)
+      refine_with_constraint(denominator*var <= ub_expr);
+    else
+      refine_with_constraint(ub_expr <= denominator*var);
+  }
+  else {
+    // Here `var' occurs in both `lb_expr' and `ub_expr'.  As boxes
+    // can only use the non-relational constraints, we find the
+    // maximum/minimum values `ub_expr' and `lb_expr' obtain with the
+    // box and use these instead of the `ub-expr' and `lb-expr'.
+    PPL_DIRTY_TEMP(Coefficient, max_numer);
+    PPL_DIRTY_TEMP(Coefficient, max_denom);
+    bool max_included;
+    PPL_DIRTY_TEMP(Coefficient, min_numer);
+    PPL_DIRTY_TEMP(Coefficient, min_denom);
+    bool min_included;
+    ITV& seq_v = seq[var.id()];
+    if (maximize(ub_expr, max_numer, max_denom, max_included)) {
+      if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+        // The `ub_expr' has a maximum value and the `lb_expr'
+        // has a minimum value for the box.
+        // Set the bounds for `var' using the minimum for `lb_expr'.
+        min_denom *= denominator;
+        PPL_DIRTY_TEMP(mpq_class, q1);
+        PPL_DIRTY_TEMP(mpq_class, q2);
+        assign_r(q1.get_num(), min_numer, ROUND_NOT_NEEDED);
+        assign_r(q1.get_den(), min_denom, ROUND_NOT_NEEDED);
+        q1.canonicalize();
+        // Now make the maximum of lb_expr the upper bound.  If the
+        // maximum is not at a box point, then inequality is strict.
+        max_denom *= denominator;
+        assign_r(q2.get_num(), max_numer, ROUND_NOT_NEEDED);
+        assign_r(q2.get_den(), max_denom, ROUND_NOT_NEEDED);
+        q2.canonicalize();
+
+        if (denominator > 0) {
+          Relation_Symbol gr = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          Relation_Symbol lr = max_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_v.build(i_constraint(gr, q1), i_constraint(lr, q2));
+        }
+        else {
+          Relation_Symbol gr = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          Relation_Symbol lr = min_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_v.build(i_constraint(gr, q2), i_constraint(lr, q1));
+        }
+      }
+      else {
+        // The `ub_expr' has a maximum value but the `lb_expr'
+        // has no minimum value for the box.
+        // Set the bounds for `var' using the maximum for `lb_expr'.
+        PPL_DIRTY_TEMP(mpq_class, q);
+        max_denom *= denominator;
+        assign_r(q.get_num(), max_numer, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), max_denom, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        Relation_Symbol rel = (denominator > 0)
+          ? (max_included ? LESS_OR_EQUAL : LESS_THAN)
+          : (max_included ? GREATER_OR_EQUAL : GREATER_THAN);
+        seq_v.build(i_constraint(rel, q));
+      }
+    }
+    else if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+        // The `ub_expr' has no maximum value but the `lb_expr'
+        // has a minimum value for the box.
+        // Set the bounds for `var' using the minimum for `lb_expr'.
+        min_denom *= denominator;
+        PPL_DIRTY_TEMP(mpq_class, q);
+        assign_r(q.get_num(), min_numer, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), min_denom, ROUND_NOT_NEEDED);
+        q.canonicalize();
+
+        Relation_Symbol rel = (denominator > 0)
+          ? (min_included ? GREATER_OR_EQUAL : GREATER_THAN)
+          : (min_included ? LESS_OR_EQUAL : LESS_THAN);
+        seq_v.build(i_constraint(rel, q));
+    }
+    else {
+      // The `ub_expr' has no maximum value and the `lb_expr'
+      // has no minimum value for the box.
+      // So we set the bounds to be unbounded.
+      seq_v.assign(UNIVERSE);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  const dimension_type space_dim = space_dimension();
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  const bool negative_denom = (denominator < 0);
+  const Coefficient& lb_var_coeff = lb_expr.coefficient(var);
+  const Coefficient& ub_var_coeff = ub_expr.coefficient(var);
+
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // independent of `var', then impose it now.
+  if (lb_var_coeff == ub_var_coeff) {
+    if (negative_denom)
+      refine_with_constraint(lb_expr >= ub_expr);
+    else
+      refine_with_constraint(lb_expr <= ub_expr);
+  }
+
+  ITV& seq_var = seq[var.id()];
+  if (!seq_var.is_universe()) {
+    // We want to work with a positive denominator,
+    // so the sign and its (unsigned) value are separated.
+    PPL_DIRTY_TEMP_COEFFICIENT(pos_denominator);
+    pos_denominator = denominator;
+    if (negative_denom)
+      neg_assign(pos_denominator, pos_denominator);
+    // Store all the information about the upper and lower bounds
+    // for `var' before making this interval unbounded.
+    bool open_lower = seq_var.lower_is_open();
+    bool unbounded_lower = seq_var.lower_is_boundary_infinity();
+    PPL_DIRTY_TEMP(mpq_class, q_seq_var_lower);
+    PPL_DIRTY_TEMP(Coefficient, numer_lower);
+    PPL_DIRTY_TEMP(Coefficient, denom_lower);
+    if (!unbounded_lower) {
+      assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED);
+      assign_r(numer_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED);
+      assign_r(denom_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(denom_lower, denom_lower);
+      numer_lower *= pos_denominator;
+      seq_var.lower_extend();
+    }
+    bool open_upper = seq_var.upper_is_open();
+    bool unbounded_upper = seq_var.upper_is_boundary_infinity();
+    PPL_DIRTY_TEMP(mpq_class, q_seq_var_upper);
+    PPL_DIRTY_TEMP(Coefficient, numer_upper);
+    PPL_DIRTY_TEMP(Coefficient, denom_upper);
+    if (!unbounded_upper) {
+      assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED);
+      assign_r(numer_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED);
+      assign_r(denom_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(denom_upper, denom_upper);
+      numer_upper *= pos_denominator;
+      seq_var.upper_extend();
+    }
+
+    if (!unbounded_lower) {
+      // `lb_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the lower bound for `var',
+      // and adding the lower bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_lb_expr(ub_expr);
+      revised_lb_expr -= ub_var_coeff * var;
+      PPL_DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, denom_lower);
+      revised_lb_expr *= d;
+      revised_lb_expr += numer_lower;
+
+      // Find the minimum value for the revised lower bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      PPL_DIRTY_TEMP(Coefficient, denom);
+      if (minimize(revised_lb_expr, numer_lower, denom, included)) {
+        denom_lower *= (denom * ub_var_coeff);
+        PPL_DIRTY_TEMP(mpq_class, q);
+        assign_r(q.get_num(), numer_lower, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), denom_lower, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        if (!included)
+          open_lower = true;
+        Relation_Symbol rel;
+        if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom)
+          rel = open_lower ? GREATER_THAN : GREATER_OR_EQUAL;
+        else
+          rel = open_lower ? LESS_THAN : LESS_OR_EQUAL;
+        seq_var.add_constraint(i_constraint(rel, q));
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+
+    if (!unbounded_upper) {
+      // `ub_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the upper bound for `var',
+      // and adding the upper bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_ub_expr(lb_expr);
+      revised_ub_expr -= lb_var_coeff * var;
+      PPL_DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, denom_upper);
+      revised_ub_expr *= d;
+      revised_ub_expr += numer_upper;
+
+      // Find the maximum value for the revised upper bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      PPL_DIRTY_TEMP(Coefficient, denom);
+      if (maximize(revised_ub_expr, numer_upper, denom, included)) {
+        denom_upper *= (denom * lb_var_coeff);
+        PPL_DIRTY_TEMP(mpq_class, q);
+        assign_r(q.get_num(), numer_upper, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), denom_upper, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        if (!included)
+          open_upper = true;
+        Relation_Symbol rel;
+        if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom)
+          rel = open_upper ? LESS_THAN : LESS_OR_EQUAL;
+        else
+          rel = open_upper ? GREATER_THAN : GREATER_OR_EQUAL;
+        seq_var.add_constraint(i_constraint(rel, q));
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+  }
+
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // dependent on `var', then impose on the new box.
+  if (lb_var_coeff != ub_var_coeff) {
+    if (denominator > 0)
+      refine_with_constraint(lb_expr <= ub_expr);
+    else
+      refine_with_constraint(lb_expr >= ub_expr);
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "v", var);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  // First compute the affine image.
+  affine_image(var, expr, denominator);
+
+  if (relsym == EQUAL)
+    // The affine relation is indeed an affine function.
+    return;
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
+
+  ITV& seq_var = seq[var.id()];
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    seq_var.lower_extend();
+    break;
+  case LESS_THAN:
+    seq_var.lower_extend();
+    if (!seq_var.upper_is_boundary_infinity())
+      seq_var.remove_sup();
+    break;
+  case GREATER_OR_EQUAL:
+    seq_var.upper_extend();
+    break;
+  case GREATER_THAN:
+    seq_var.upper_extend();
+    if (!seq_var.lower_is_boundary_infinity())
+      seq_var.remove_inf();
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator)
+{
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "v", var);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  // Check whether the affine relation is indeed an affine function.
+  if (relsym == EQUAL) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Compute the reversed relation symbol to simplify later coding.
+  Relation_Symbol reversed_relsym;
+  switch (relsym) {
+  case LESS_THAN:
+    reversed_relsym = GREATER_THAN;
+    break;
+  case LESS_OR_EQUAL:
+    reversed_relsym = GREATER_OR_EQUAL;
+    break;
+  case GREATER_OR_EQUAL:
+    reversed_relsym = LESS_OR_EQUAL;
+    break;
+  case GREATER_THAN:
+    reversed_relsym = LESS_THAN;
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_coefficient != 0) {
+    Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
+    Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denominator))
+      ? relsym
+      : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse_expr,
+                             inverse_denominator);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the box by adding the constraint induced
+  // by the affine relation.
+  // First, compute the maximum and minimum value reached by
+  // `denominator*var' on the box as we need to use non-relational
+  // expressions.
+  PPL_DIRTY_TEMP(Coefficient, max_numer);
+  PPL_DIRTY_TEMP(Coefficient, max_denom);
+  bool max_included;
+  bool bound_above = maximize(denominator*var, max_numer, max_denom, max_included);
+  PPL_DIRTY_TEMP(Coefficient, min_numer);
+  PPL_DIRTY_TEMP(Coefficient, min_denom);
+  bool min_included;
+  bool bound_below = minimize(denominator*var, min_numer, min_denom, min_included);
+  // Use the correct relation symbol
+  const Relation_Symbol corrected_relsym
+    = (denominator > 0) ? relsym : reversed_relsym;
+  // Revise the expression to take into account the denominator of the
+  // maximum/minimum value for `var'.
+  Linear_Expression revised_expr;
+  PPL_DIRTY_TEMP_COEFFICIENT(d);
+  if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) {
+    if (bound_below) {
+      revised_expr = expr;
+      revised_expr.set_inhomogeneous_term(Coefficient_zero());
+      revised_expr *= d;
+    }
+  }
+  else {
+    if (bound_above) {
+      revised_expr = expr;
+      revised_expr.set_inhomogeneous_term(Coefficient_zero());
+      revised_expr *= max_denom;
+    }
+  }
+
+  switch (corrected_relsym) {
+  case LESS_THAN:
+    if (bound_below)
+      refine_with_constraint(min_numer < revised_expr);
+    break;
+  case LESS_OR_EQUAL:
+    if (bound_below)
+      (min_included)
+        ? refine_with_constraint(min_numer <= revised_expr)
+        : refine_with_constraint(min_numer < revised_expr);
+    break;
+  case GREATER_OR_EQUAL:
+    if (bound_above)
+      (max_included)
+        ? refine_with_constraint(max_numer >= revised_expr)
+        : refine_with_constraint(max_numer > revised_expr);
+    break;
+  case GREATER_THAN:
+    if (bound_above)
+      refine_with_constraint(max_numer > revised_expr);
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+  // If the shrunk box is empty, its preimage is empty too.
+  if (is_empty())
+    return;
+  ITV& seq_v = seq[var.id()];
+  seq_v.assign(UNIVERSE);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the maximum and minimum value reached by the rhs on the box.
+  PPL_DIRTY_TEMP(Coefficient, max_numer);
+  PPL_DIRTY_TEMP(Coefficient, max_denom);
+  bool max_included;
+  bool max_rhs = maximize(rhs, max_numer, max_denom, max_included);
+  PPL_DIRTY_TEMP(Coefficient, min_numer);
+  PPL_DIRTY_TEMP(Coefficient, min_denom);
+  bool min_included;
+  bool min_rhs = minimize(rhs, min_numer, min_denom, min_included);
+
+  // Check whether there is 0, 1 or more than one variable in the lhs
+  // and record the variable with the highest dimension; set the box
+  // intervals to be unbounded for all other dimensions with non-zero
+  // coefficients in the lhs.
+  bool has_var = false;
+  dimension_type has_var_id = lhs.last_nonzero();
+
+  if (has_var_id != 0) {
+    has_var = true;
+    --has_var_id;
+    dimension_type other_var = lhs.first_nonzero(1, has_var_id + 1);
+    --other_var;
+    if (other_var != has_var_id) {
+      // There is more than one dimension with non-zero coefficient, so
+      // we cannot have any information about the dimensions in the lhs.
+      ITV& seq_var = seq[has_var_id];
+      seq_var.assign(UNIVERSE);
+      // Since all but the highest dimension with non-zero coefficient
+      // in the lhs have been set unbounded, it remains to set the
+      // highest dimension in the lhs unbounded.
+      ITV& seq_i = seq[other_var];
+      seq_i.assign(UNIVERSE);
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  if (has_var) {
+    // There is exactly one dimension with non-zero coefficient.
+    ITV& seq_var = seq[has_var_id];
+
+    // Compute the new bounds for this dimension defined by the rhs
+    // expression.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    const Coefficient& coeff = lhs.coefficient(Variable(has_var_id));
+    PPL_DIRTY_TEMP(mpq_class, q_max);
+    PPL_DIRTY_TEMP(mpq_class, q_min);
+    if (max_rhs) {
+      max_numer -= inhomo * max_denom;
+      max_denom *= coeff;
+      assign_r(q_max.get_num(), max_numer, ROUND_NOT_NEEDED);
+      assign_r(q_max.get_den(), max_denom, ROUND_NOT_NEEDED);
+      q_max.canonicalize();
+    }
+    if (min_rhs) {
+      min_numer -= inhomo * min_denom;
+      min_denom *= coeff;
+      assign_r(q_min.get_num(), min_numer, ROUND_NOT_NEEDED);
+      assign_r(q_min.get_den(), min_denom, ROUND_NOT_NEEDED);
+      q_min.canonicalize();
+    }
+
+    // The choice as to which bounds should be set depends on the sign
+    // of the coefficient of the dimension `has_var_id' in the lhs.
+    if (coeff > 0)
+      // The coefficient of the dimension in the lhs is positive.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        if (max_rhs) {
+          Relation_Symbol rel = max_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_var.build(i_constraint(rel, q_max));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case LESS_THAN:
+        if (max_rhs)
+          seq_var.build(i_constraint(LESS_THAN, q_max));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case EQUAL:
+        {
+          I_Constraint<mpq_class> l;
+          I_Constraint<mpq_class> u;
+          if (max_rhs)
+            u.set(max_included ? LESS_OR_EQUAL : LESS_THAN, q_max);
+          if (min_rhs)
+            l.set(min_included ? GREATER_OR_EQUAL : GREATER_THAN, q_min);
+          seq_var.build(l, u);
+          break;
+        }
+      case GREATER_OR_EQUAL:
+        if (min_rhs) {
+          Relation_Symbol rel = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          seq_var.build(i_constraint(rel, q_min));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case GREATER_THAN:
+        if (min_rhs)
+          seq_var.build(i_constraint(GREATER_THAN, q_min));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        PPL_UNREACHABLE;
+        break;
+      }
+    else
+      // The coefficient of the dimension in the lhs is negative.
+      switch (relsym) {
+      case GREATER_OR_EQUAL:
+        if (min_rhs) {
+          Relation_Symbol rel = min_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_var.build(i_constraint(rel, q_min));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case GREATER_THAN:
+        if (min_rhs)
+          seq_var.build(i_constraint(LESS_THAN, q_min));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case EQUAL:
+        {
+          I_Constraint<mpq_class> l;
+          I_Constraint<mpq_class> u;
+          if (max_rhs)
+            l.set(max_included ? GREATER_OR_EQUAL : GREATER_THAN, q_max);
+          if (min_rhs)
+            u.set(min_included ? LESS_OR_EQUAL : LESS_THAN, q_min);
+          seq_var.build(l, u);
+          break;
+        }
+      case LESS_OR_EQUAL:
+        if (max_rhs) {
+          Relation_Symbol rel = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          seq_var.build(i_constraint(rel, q_max));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case LESS_THAN:
+        if (max_rhs)
+          seq_var.build(i_constraint(GREATER_THAN, q_max));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        PPL_UNREACHABLE;
+        break;
+      }
+  }
+
+  else {
+    // The lhs is a constant value, so we just need to add the
+    // appropriate constraint.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    switch (relsym) {
+    case LESS_THAN:
+      refine_with_constraint(inhomo < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      refine_with_constraint(inhomo <= rhs);
+      break;
+    case EQUAL:
+      refine_with_constraint(inhomo == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_with_constraint(inhomo >= rhs);
+      break;
+    case GREATER_THAN:
+      refine_with_constraint(inhomo > rhs);
+      break;
+    default:
+      // The NOT_EQUAL case has been already dealt with.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
+
+  // For any dimension occurring in the lhs, swap and change the sign
+  // of this component for the rhs and lhs.  Then use these in a call
+  // to generalized_affine_image/3.
+  Linear_Expression revised_lhs = lhs;
+  Linear_Expression revised_rhs = rhs;
+  for (Linear_Expression::const_iterator i = lhs.begin(),
+         i_end = lhs.end(); i != i_end; ++i) {
+    const Variable var = i.variable();
+    PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+    tmp = *i;
+    tmp += rhs.coefficient(var);
+    sub_mul_assign(revised_rhs, tmp, var);
+    sub_mul_assign(revised_lhs, tmp, var);
+  }
+  generalized_affine_image(revised_lhs, relsym, revised_rhs);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T, typename Iterator>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+                   && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                   void>::type
+Box<ITV>::CC76_widening_assign(const T& y, Iterator first, Iterator last) {
+  if (y.is_empty())
+    return;
+
+  for (dimension_type i = seq.size(); i-- > 0; )
+    seq[i].CC76_widening_assign(y.seq[i], first, last);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+                   && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                   void>::type
+Box<ITV>::CC76_widening_assign(const T& y, unsigned* tp) {
+  static typename ITV::boundary_type stop_points[] = {
+    typename ITV::boundary_type(-2),
+    typename ITV::boundary_type(-1),
+    typename ITV::boundary_type(0),
+    typename ITV::boundary_type(1),
+    typename ITV::boundary_type(2)
+  };
+
+  Box& x = *this;
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Box<ITV> x_tmp(x);
+    x_tmp.CC76_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!x.contains(x_tmp))
+      --(*tp);
+    return;
+  }
+  x.CC76_widening_assign(y,
+                         stop_points,
+                         stop_points
+                         + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+template <typename ITV>
+void
+Box<ITV>::get_limiting_box(const Constraint_System& cs,
+                           Box& limiting_box) const {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type c_num_vars = 0;
+    dimension_type c_only_var = 0;
+    // Constraints that are not interval constraints are ignored.
+    if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+      continue;
+    // Trivial constraints are ignored.
+    if (c_num_vars != 0) {
+      // c is a non-trivial interval constraint.
+      // add interval constraint to limiting box
+      const Coefficient& n = c.inhomogeneous_term();
+      const Coefficient& d = c.coefficient(Variable(c_only_var));
+      if (interval_relation(seq[c_only_var], c.type(), n, d)
+          == Poly_Con_Relation::is_included())
+        limiting_box.add_interval_constraint_no_check(c_only_var, c.type(),
+                                                      n, d);
+    }
+  }
+}
+
+template <typename ITV>
+void
+Box<ITV>::limited_CC76_extrapolation_assign(const Box& y,
+                                            const Constraint_System& cs,
+                                            unsigned* tp) {
+  Box& x = *this;
+  const dimension_type space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two boxes.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two boxes in a
+  // zero-dimensional space is also a zero-dimensional box
+  if (space_dim == 0)
+    return;
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // Build a limiting box using all the constraints in cs
+  // that are satisfied by *this.
+  Box limiting_box(space_dim, UNIVERSE);
+  get_limiting_box(cs, limiting_box);
+
+  x.CC76_widening_assign(y, tp);
+
+  // Intersect the widened box with the limiting box.
+  intersection_assign(limiting_box);
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+                   && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                   void>::type
+Box<ITV>::CC76_narrowing_assign(const T& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+  // Assume `*this' is contained in or equal to `y'.
+  PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+  // If both boxes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.is_empty())
+    return;
+  // If `*this' is empty, we return.
+  if (is_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& x_i = seq[i];
+    const ITV& y_i = y.seq[i];
+    if (!x_i.lower_is_boundary_infinity()
+        && !y_i.lower_is_boundary_infinity()
+        && x_i.lower() != y_i.lower())
+      x_i.lower() = y_i.lower();
+    if (!x_i.upper_is_boundary_infinity()
+        && !y_i.upper_is_boundary_infinity()
+        && x_i.upper() != y_i.upper())
+      x_i.upper() = y_i.upper();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  for (dimension_type k = 0; k < space_dim; ++k) {
+    const Variable v_k = Variable(k);
+    PPL_DIRTY_TEMP(Coefficient, n);
+    PPL_DIRTY_TEMP(Coefficient, d);
+    bool closed = false;
+    if (has_lower_bound(v_k, n, d, closed)) {
+      if (closed)
+        cs.insert(d * v_k >= n);
+      else
+        cs.insert(d * v_k > n);
+    }
+    if (has_upper_bound(v_k, n, d, closed)) {
+      if (closed)
+        cs.insert(d * v_k <= n);
+      else
+        cs.insert(d * v_k < n);
+    }
+  }
+  return cs;
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::minimized_constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  // Make sure emptiness is detected.
+  if (is_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  for (dimension_type k = 0; k < space_dim; ++k) {
+    const Variable v_k = Variable(k);
+    PPL_DIRTY_TEMP(Coefficient, n);
+    PPL_DIRTY_TEMP(Coefficient, d);
+    bool closed = false;
+    if (has_lower_bound(v_k, n, d, closed)) {
+      if (closed)
+        // Make sure equality constraints are detected.
+        if (seq[k].is_singleton()) {
+          cs.insert(d * v_k == n);
+          continue;
+        }
+        else
+          cs.insert(d * v_k >= n);
+      else
+        cs.insert(d * v_k > n);
+    }
+    if (has_upper_bound(v_k, n, d, closed)) {
+      if (closed)
+        cs.insert(d * v_k <= n);
+      else
+        cs.insert(d * v_k < n);
+    }
+  }
+  return cs;
+}
+
+template <typename ITV>
+Congruence_System
+Box<ITV>::congruences() const {
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+    return cgs;
+  }
+
+  // Make sure emptiness is detected.
+  if (is_empty()) {
+    cgs.insert(Congruence::zero_dim_false());
+    return cgs;
+  }
+
+  for (dimension_type k = 0; k < space_dim; ++k) {
+    const Variable v_k = Variable(k);
+    PPL_DIRTY_TEMP(Coefficient, n);
+    PPL_DIRTY_TEMP(Coefficient, d);
+    bool closed = false;
+    if (has_lower_bound(v_k, n, d, closed) && closed)
+      // Make sure equality congruences are detected.
+      if (seq[k].is_singleton())
+        cgs.insert((d * v_k %= n) / 0);
+  }
+  return cgs;
+}
+
+template <typename ITV>
+memory_size_type
+Box<ITV>::external_memory_in_bytes() const {
+  memory_size_type n = seq.capacity() * sizeof(ITV);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    n += seq[k].external_memory_in_bytes();
+  return n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Box<ITV>& box) {
+  if (box.is_empty())
+    s << "false";
+  else if (box.is_universe())
+    s << "true";
+  else
+    for (dimension_type k = 0,
+           space_dim = box.space_dimension(); k < space_dim; ) {
+      s << Variable(k) << " in " << box[k];
+      ++k;
+      if (k < space_dim)
+        s << ", ";
+      else
+        break;
+    }
+  return s;
+}
+
+template <typename ITV>
+void
+Box<ITV>::ascii_dump(std::ostream& s) const {
+  const char separator = ' ';
+  status.ascii_dump(s);
+  const dimension_type space_dim = space_dimension();
+  s << "space_dim" << separator << space_dim;
+  s << "\n";
+  for (dimension_type i = 0; i < space_dim;  ++i)
+    seq[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(ITV, Box<ITV>)
+
+template <typename ITV>
+bool
+Box<ITV>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+
+  std::string str;
+  dimension_type space_dim;
+  if (!(s >> str) || str != "space_dim")
+    return false;
+  if (!(s >> space_dim))
+    return false;
+
+  seq.clear();
+  ITV seq_i;
+  for (dimension_type i = 0; i < space_dim;  ++i) {
+    if (seq_i.ascii_load(s))
+      seq.push_back(seq_i);
+    else
+      return false;
+  }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Box& y) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << this->space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::throw_dimension_incompatible(const char* method,
+                               dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint_System& cs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cs->space_dimension == " << cs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence_System& cgs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cgs->space_dimension == " << cgs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_expression_too_complex(const char* method,
+                                       const Linear_Expression& le) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << le << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const char* le_name,
+                                       const Linear_Expression& le) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << le_name << "->space_dimension() == "
+    << le.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+template <typename C>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const char* lf_name,
+                                       const Linear_Form<C>& lf) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << lf_name << "->space_dimension() == "
+    << lf.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_invalid_argument(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+          typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const Box<ITV>& x, const Box<ITV>& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0, Temp& tmp1, Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim boxes are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires a check for emptiness.
+  (void) x.is_empty();
+  (void) y.is_empty();
+  // If one of two boxes is empty, then they are equal if and only if
+  // the other box is empty too.
+  if (x.marked_empty() || y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty()) {
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+      return true;
+    }
+    else
+      goto pinf;
+  }
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    const ITV& x_i = x.seq[i];
+    const ITV& y_i = y.seq[i];
+    // Dealing with the lower bounds.
+    if (x_i.lower_is_boundary_infinity()) {
+      if (!y_i.lower_is_boundary_infinity())
+        goto pinf;
+    }
+    else if (y_i.lower_is_boundary_infinity())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.lower() > y_i.lower()) {
+        maybe_assign(tmp1p, tmp1, x_i.lower(), dir);
+        maybe_assign(tmp2p, tmp2, y_i.lower(), inverse(dir));
+      }
+      else {
+        maybe_assign(tmp1p, tmp1, y_i.lower(), dir);
+        maybe_assign(tmp2p, tmp2, x_i.lower(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      PPL_ASSERT(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+    // Dealing with the lower bounds.
+    if (x_i.upper_is_boundary_infinity())
+      if (y_i.upper_is_boundary_infinity())
+        continue;
+      else
+        goto pinf;
+    else if (y_i.upper_is_boundary_infinity())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.upper() > y_i.upper()) {
+        maybe_assign(tmp1p, tmp1, x_i.upper(), dir);
+        maybe_assign(tmp2p, tmp2, y_i.upper(), inverse(dir));
+      }
+      else {
+        maybe_assign(tmp1p, tmp1, y_i.upper(), dir);
+        maybe_assign(tmp2p, tmp2, x_i.upper(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      PPL_ASSERT(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+
+ pinf:
+  assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_templates_hh)
diff --git a/src/Box_types.hh b/src/Box_types.hh
new file mode 100644
index 0000000..3383e02
--- /dev/null
+++ b/src/Box_types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Box_types_hh
+#define PPL_Box_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+class Box;
+
+class Box_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Box_types_hh)
diff --git a/src/COPYING.cc.dist b/src/COPYING.cc.dist
new file mode 100644
index 0000000..f341b8b
--- /dev/null
+++ b/src/COPYING.cc.dist
@@ -0,0 +1,676 @@
+extern const char* const COPYING_array[675] = {
+  "                    GNU GENERAL PUBLIC LICENSE",
+  "                       Version 3, 29 June 2007",
+  "",
+  " Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>",
+  " Everyone is permitted to copy and distribute verbatim copies",
+  " of this license document, but changing it is not allowed.",
+  "",
+  "                            Preamble",
+  "",
+  "  The GNU General Public License is a free, copyleft license for",
+  "software and other kinds of works.",
+  "",
+  "  The licenses for most software and other practical works are designed",
+  "to take away your freedom to share and change the works.  By contrast,",
+  "the GNU General Public License is intended to guarantee your freedom to",
+  "share and change all versions of a program--to make sure it remains free",
+  "software for all its users.  We, the Free Software Foundation, use the",
+  "GNU General Public License for most of our software; it applies also to",
+  "any other work released this way by its authors.  You can apply it to",
+  "your programs, too.",
+  "",
+  "  When we speak of free software, we are referring to freedom, not",
+  "price.  Our General Public Licenses are designed to make sure that you",
+  "have the freedom to distribute copies of free software (and charge for",
+  "them if you wish), that you receive source code or can get it if you",
+  "want it, that you can change the software or use pieces of it in new",
+  "free programs, and that you know you can do these things.",
+  "",
+  "  To protect your rights, we need to prevent others from denying you",
+  "these rights or asking you to surrender the rights.  Therefore, you have",
+  "certain responsibilities if you distribute copies of the software, or if",
+  "you modify it: responsibilities to respect the freedom of others.",
+  "",
+  "  For example, if you distribute copies of such a program, whether",
+  "gratis or for a fee, you must pass on to the recipients the same",
+  "freedoms that you received.  You must make sure that they, too, receive",
+  "or can get the source code.  And you must show them these terms so they",
+  "know their rights.",
+  "",
+  "  Developers that use the GNU GPL protect your rights with two steps:",
+  "(1) assert copyright on the software, and (2) offer you this License",
+  "giving you legal permission to copy, distribute and/or modify it.",
+  "",
+  "  For the developers' and authors' protection, the GPL clearly explains",
+  "that there is no warranty for this free software.  For both users' and",
+  "authors' sake, the GPL requires that modified versions be marked as",
+  "changed, so that their problems will not be attributed erroneously to",
+  "authors of previous versions.",
+  "",
+  "  Some devices are designed to deny users access to install or run",
+  "modified versions of the software inside them, although the manufacturer",
+  "can do so.  This is fundamentally incompatible with the aim of",
+  "protecting users' freedom to change the software.  The systematic",
+  "pattern of such abuse occurs in the area of products for individuals to",
+  "use, which is precisely where it is most unacceptable.  Therefore, we",
+  "have designed this version of the GPL to prohibit the practice for those",
+  "products.  If such problems arise substantially in other domains, we",
+  "stand ready to extend this provision to those domains in future versions",
+  "of the GPL, as needed to protect the freedom of users.",
+  "",
+  "  Finally, every program is threatened constantly by software patents.",
+  "States should not allow patents to restrict development and use of",
+  "software on general-purpose computers, but in those that do, we wish to",
+  "avoid the special danger that patents applied to a free program could",
+  "make it effectively proprietary.  To prevent this, the GPL assures that",
+  "patents cannot be used to render the program non-free.",
+  "",
+  "  The precise terms and conditions for copying, distribution and",
+  "modification follow.",
+  "",
+  "                       TERMS AND CONDITIONS",
+  "",
+  "  0. Definitions.",
+  "",
+  "  \"This License\" refers to version 3 of the GNU General Public License.",
+  "",
+  "  \"Copyright\" also means copyright-like laws that apply to other kinds of",
+  "works, such as semiconductor masks.",
+  "",
+  "  \"The Program\" refers to any copyrightable work licensed under this",
+  "License.  Each licensee is addressed as \"you\".  \"Licensees\" and",
+  "\"recipients\" may be individuals or organizations.",
+  "",
+  "  To \"modify\" a work means to copy from or adapt all or part of the work",
+  "in a fashion requiring copyright permission, other than the making of an",
+  "exact copy.  The resulting work is called a \"modified version\" of the",
+  "earlier work or a work \"based on\" the earlier work.",
+  "",
+  "  A \"covered work\" means either the unmodified Program or a work based",
+  "on the Program.",
+  "",
+  "  To \"propagate\" a work means to do anything with it that, without",
+  "permission, would make you directly or secondarily liable for",
+  "infringement under applicable copyright law, except executing it on a",
+  "computer or modifying a private copy.  Propagation includes copying,",
+  "distribution (with or without modification), making available to the",
+  "public, and in some countries other activities as well.",
+  "",
+  "  To \"convey\" a work means any kind of propagation that enables other",
+  "parties to make or receive copies.  Mere interaction with a user through",
+  "a computer network, with no transfer of a copy, is not conveying.",
+  "",
+  "  An interactive user interface displays \"Appropriate Legal Notices\"",
+  "to the extent that it includes a convenient and prominently visible",
+  "feature that (1) displays an appropriate copyright notice, and (2)",
+  "tells the user that there is no warranty for the work (except to the",
+  "extent that warranties are provided), that licensees may convey the",
+  "work under this License, and how to view a copy of this License.  If",
+  "the interface presents a list of user commands or options, such as a",
+  "menu, a prominent item in the list meets this criterion.",
+  "",
+  "  1. Source Code.",
+  "",
+  "  The \"source code\" for a work means the preferred form of the work",
+  "for making modifications to it.  \"Object code\" means any non-source",
+  "form of a work.",
+  "",
+  "  A \"Standard Interface\" means an interface that either is an official",
+  "standard defined by a recognized standards body, or, in the case of",
+  "interfaces specified for a particular programming language, one that",
+  "is widely used among developers working in that language.",
+  "",
+  "  The \"System Libraries\" of an executable work include anything, other",
+  "than the work as a whole, that (a) is included in the normal form of",
+  "packaging a Major Component, but which is not part of that Major",
+  "Component, and (b) serves only to enable use of the work with that",
+  "Major Component, or to implement a Standard Interface for which an",
+  "implementation is available to the public in source code form.  A",
+  "\"Major Component\", in this context, means a major essential component",
+  "(kernel, window system, and so on) of the specific operating system",
+  "(if any) on which the executable work runs, or a compiler used to",
+  "produce the work, or an object code interpreter used to run it.",
+  "",
+  "  The \"Corresponding Source\" for a work in object code form means all",
+  "the source code needed to generate, install, and (for an executable",
+  "work) run the object code and to modify the work, including scripts to",
+  "control those activities.  However, it does not include the work's",
+  "System Libraries, or general-purpose tools or generally available free",
+  "programs which are used unmodified in performing those activities but",
+  "which are not part of the work.  For example, Corresponding Source",
+  "includes interface definition files associated with source files for",
+  "the work, and the source code for shared libraries and dynamically",
+  "linked subprograms that the work is specifically designed to require,",
+  "such as by intimate data communication or control flow between those",
+  "subprograms and other parts of the work.",
+  "",
+  "  The Corresponding Source need not include anything that users",
+  "can regenerate automatically from other parts of the Corresponding",
+  "Source.",
+  "",
+  "  The Corresponding Source for a work in source code form is that",
+  "same work.",
+  "",
+  "  2. Basic Permissions.",
+  "",
+  "  All rights granted under this License are granted for the term of",
+  "copyright on the Program, and are irrevocable provided the stated",
+  "conditions are met.  This License explicitly affirms your unlimited",
+  "permission to run the unmodified Program.  The output from running a",
+  "covered work is covered by this License only if the output, given its",
+  "content, constitutes a covered work.  This License acknowledges your",
+  "rights of fair use or other equivalent, as provided by copyright law.",
+  "",
+  "  You may make, run and propagate covered works that you do not",
+  "convey, without conditions so long as your license otherwise remains",
+  "in force.  You may convey covered works to others for the sole purpose",
+  "of having them make modifications exclusively for you, or provide you",
+  "with facilities for running those works, provided that you comply with",
+  "the terms of this License in conveying all material for which you do",
+  "not control copyright.  Those thus making or running the covered works",
+  "for you must do so exclusively on your behalf, under your direction",
+  "and control, on terms that prohibit them from making any copies of",
+  "your copyrighted material outside their relationship with you.",
+  "",
+  "  Conveying under any other circumstances is permitted solely under",
+  "the conditions stated below.  Sublicensing is not allowed; section 10",
+  "makes it unnecessary.",
+  "",
+  "  3. Protecting Users' Legal Rights From Anti-Circumvention Law.",
+  "",
+  "  No covered work shall be deemed part of an effective technological",
+  "measure under any applicable law fulfilling obligations under article",
+  "11 of the WIPO copyright treaty adopted on 20 December 1996, or",
+  "similar laws prohibiting or restricting circumvention of such",
+  "measures.",
+  "",
+  "  When you convey a covered work, you waive any legal power to forbid",
+  "circumvention of technological measures to the extent such circumvention",
+  "is effected by exercising rights under this License with respect to",
+  "the covered work, and you disclaim any intention to limit operation or",
+  "modification of the work as a means of enforcing, against the work's",
+  "users, your or third parties' legal rights to forbid circumvention of",
+  "technological measures.",
+  "",
+  "  4. Conveying Verbatim Copies.",
+  "",
+  "  You may convey verbatim copies of the Program's source code as you",
+  "receive it, in any medium, provided that you conspicuously and",
+  "appropriately publish on each copy an appropriate copyright notice;",
+  "keep intact all notices stating that this License and any",
+  "non-permissive terms added in accord with section 7 apply to the code;",
+  "keep intact all notices of the absence of any warranty; and give all",
+  "recipients a copy of this License along with the Program.",
+  "",
+  "  You may charge any price or no price for each copy that you convey,",
+  "and you may offer support or warranty protection for a fee.",
+  "",
+  "  5. Conveying Modified Source Versions.",
+  "",
+  "  You may convey a work based on the Program, or the modifications to",
+  "produce it from the Program, in the form of source code under the",
+  "terms of section 4, provided that you also meet all of these conditions:",
+  "",
+  "    a) The work must carry prominent notices stating that you modified",
+  "    it, and giving a relevant date.",
+  "",
+  "    b) The work must carry prominent notices stating that it is",
+  "    released under this License and any conditions added under section",
+  "    7.  This requirement modifies the requirement in section 4 to",
+  "    \"keep intact all notices\".",
+  "",
+  "    c) You must license the entire work, as a whole, under this",
+  "    License to anyone who comes into possession of a copy.  This",
+  "    License will therefore apply, along with any applicable section 7",
+  "    additional terms, to the whole of the work, and all its parts,",
+  "    regardless of how they are packaged.  This License gives no",
+  "    permission to license the work in any other way, but it does not",
+  "    invalidate such permission if you have separately received it.",
+  "",
+  "    d) If the work has interactive user interfaces, each must display",
+  "    Appropriate Legal Notices; however, if the Program has interactive",
+  "    interfaces that do not display Appropriate Legal Notices, your",
+  "    work need not make them do so.",
+  "",
+  "  A compilation of a covered work with other separate and independent",
+  "works, which are not by their nature extensions of the covered work,",
+  "and which are not combined with it such as to form a larger program,",
+  "in or on a volume of a storage or distribution medium, is called an",
+  "\"aggregate\" if the compilation and its resulting copyright are not",
+  "used to limit the access or legal rights of the compilation's users",
+  "beyond what the individual works permit.  Inclusion of a covered work",
+  "in an aggregate does not cause this License to apply to the other",
+  "parts of the aggregate.",
+  "",
+  "  6. Conveying Non-Source Forms.",
+  "",
+  "  You may convey a covered work in object code form under the terms",
+  "of sections 4 and 5, provided that you also convey the",
+  "machine-readable Corresponding Source under the terms of this License,",
+  "in one of these ways:",
+  "",
+  "    a) Convey the object code in, or embodied in, a physical product",
+  "    (including a physical distribution medium), accompanied by the",
+  "    Corresponding Source fixed on a durable physical medium",
+  "    customarily used for software interchange.",
+  "",
+  "    b) Convey the object code in, or embodied in, a physical product",
+  "    (including a physical distribution medium), accompanied by a",
+  "    written offer, valid for at least three years and valid for as",
+  "    long as you offer spare parts or customer support for that product",
+  "    model, to give anyone who possesses the object code either (1) a",
+  "    copy of the Corresponding Source for all the software in the",
+  "    product that is covered by this License, on a durable physical",
+  "    medium customarily used for software interchange, for a price no",
+  "    more than your reasonable cost of physically performing this",
+  "    conveying of source, or (2) access to copy the",
+  "    Corresponding Source from a network server at no charge.",
+  "",
+  "    c) Convey individual copies of the object code with a copy of the",
+  "    written offer to provide the Corresponding Source.  This",
+  "    alternative is allowed only occasionally and noncommercially, and",
+  "    only if you received the object code with such an offer, in accord",
+  "    with subsection 6b.",
+  "",
+  "    d) Convey the object code by offering access from a designated",
+  "    place (gratis or for a charge), and offer equivalent access to the",
+  "    Corresponding Source in the same way through the same place at no",
+  "    further charge.  You need not require recipients to copy the",
+  "    Corresponding Source along with the object code.  If the place to",
+  "    copy the object code is a network server, the Corresponding Source",
+  "    may be on a different server (operated by you or a third party)",
+  "    that supports equivalent copying facilities, provided you maintain",
+  "    clear directions next to the object code saying where to find the",
+  "    Corresponding Source.  Regardless of what server hosts the",
+  "    Corresponding Source, you remain obligated to ensure that it is",
+  "    available for as long as needed to satisfy these requirements.",
+  "",
+  "    e) Convey the object code using peer-to-peer transmission, provided",
+  "    you inform other peers where the object code and Corresponding",
+  "    Source of the work are being offered to the general public at no",
+  "    charge under subsection 6d.",
+  "",
+  "  A separable portion of the object code, whose source code is excluded",
+  "from the Corresponding Source as a System Library, need not be",
+  "included in conveying the object code work.",
+  "",
+  "  A \"User Product\" is either (1) a \"consumer product\", which means any",
+  "tangible personal property which is normally used for personal, family,",
+  "or household purposes, or (2) anything designed or sold for incorporation",
+  "into a dwelling.  In determining whether a product is a consumer product,",
+  "doubtful cases shall be resolved in favor of coverage.  For a particular",
+  "product received by a particular user, \"normally used\" refers to a",
+  "typical or common use of that class of product, regardless of the status",
+  "of the particular user or of the way in which the particular user",
+  "actually uses, or expects or is expected to use, the product.  A product",
+  "is a consumer product regardless of whether the product has substantial",
+  "commercial, industrial or non-consumer uses, unless such uses represent",
+  "the only significant mode of use of the product.",
+  "",
+  "  \"Installation Information\" for a User Product means any methods,",
+  "procedures, authorization keys, or other information required to install",
+  "and execute modified versions of a covered work in that User Product from",
+  "a modified version of its Corresponding Source.  The information must",
+  "suffice to ensure that the continued functioning of the modified object",
+  "code is in no case prevented or interfered with solely because",
+  "modification has been made.",
+  "",
+  "  If you convey an object code work under this section in, or with, or",
+  "specifically for use in, a User Product, and the conveying occurs as",
+  "part of a transaction in which the right of possession and use of the",
+  "User Product is transferred to the recipient in perpetuity or for a",
+  "fixed term (regardless of how the transaction is characterized), the",
+  "Corresponding Source conveyed under this section must be accompanied",
+  "by the Installation Information.  But this requirement does not apply",
+  "if neither you nor any third party retains the ability to install",
+  "modified object code on the User Product (for example, the work has",
+  "been installed in ROM).",
+  "",
+  "  The requirement to provide Installation Information does not include a",
+  "requirement to continue to provide support service, warranty, or updates",
+  "for a work that has been modified or installed by the recipient, or for",
+  "the User Product in which it has been modified or installed.  Access to a",
+  "network may be denied when the modification itself materially and",
+  "adversely affects the operation of the network or violates the rules and",
+  "protocols for communication across the network.",
+  "",
+  "  Corresponding Source conveyed, and Installation Information provided,",
+  "in accord with this section must be in a format that is publicly",
+  "documented (and with an implementation available to the public in",
+  "source code form), and must require no special password or key for",
+  "unpacking, reading or copying.",
+  "",
+  "  7. Additional Terms.",
+  "",
+  "  \"Additional permissions\" are terms that supplement the terms of this",
+  "License by making exceptions from one or more of its conditions.",
+  "Additional permissions that are applicable to the entire Program shall",
+  "be treated as though they were included in this License, to the extent",
+  "that they are valid under applicable law.  If additional permissions",
+  "apply only to part of the Program, that part may be used separately",
+  "under those permissions, but the entire Program remains governed by",
+  "this License without regard to the additional permissions.",
+  "",
+  "  When you convey a copy of a covered work, you may at your option",
+  "remove any additional permissions from that copy, or from any part of",
+  "it.  (Additional permissions may be written to require their own",
+  "removal in certain cases when you modify the work.)  You may place",
+  "additional permissions on material, added by you to a covered work,",
+  "for which you have or can give appropriate copyright permission.",
+  "",
+  "  Notwithstanding any other provision of this License, for material you",
+  "add to a covered work, you may (if authorized by the copyright holders of",
+  "that material) supplement the terms of this License with terms:",
+  "",
+  "    a) Disclaiming warranty or limiting liability differently from the",
+  "    terms of sections 15 and 16 of this License; or",
+  "",
+  "    b) Requiring preservation of specified reasonable legal notices or",
+  "    author attributions in that material or in the Appropriate Legal",
+  "    Notices displayed by works containing it; or",
+  "",
+  "    c) Prohibiting misrepresentation of the origin of that material, or",
+  "    requiring that modified versions of such material be marked in",
+  "    reasonable ways as different from the original version; or",
+  "",
+  "    d) Limiting the use for publicity purposes of names of licensors or",
+  "    authors of the material; or",
+  "",
+  "    e) Declining to grant rights under trademark law for use of some",
+  "    trade names, trademarks, or service marks; or",
+  "",
+  "    f) Requiring indemnification of licensors and authors of that",
+  "    material by anyone who conveys the material (or modified versions of",
+  "    it) with contractual assumptions of liability to the recipient, for",
+  "    any liability that these contractual assumptions directly impose on",
+  "    those licensors and authors.",
+  "",
+  "  All other non-permissive additional terms are considered \"further",
+  "restrictions\" within the meaning of section 10.  If the Program as you",
+  "received it, or any part of it, contains a notice stating that it is",
+  "governed by this License along with a term that is a further",
+  "restriction, you may remove that term.  If a license document contains",
+  "a further restriction but permits relicensing or conveying under this",
+  "License, you may add to a covered work material governed by the terms",
+  "of that license document, provided that the further restriction does",
+  "not survive such relicensing or conveying.",
+  "",
+  "  If you add terms to a covered work in accord with this section, you",
+  "must place, in the relevant source files, a statement of the",
+  "additional terms that apply to those files, or a notice indicating",
+  "where to find the applicable terms.",
+  "",
+  "  Additional terms, permissive or non-permissive, may be stated in the",
+  "form of a separately written license, or stated as exceptions;",
+  "the above requirements apply either way.",
+  "",
+  "  8. Termination.",
+  "",
+  "  You may not propagate or modify a covered work except as expressly",
+  "provided under this License.  Any attempt otherwise to propagate or",
+  "modify it is void, and will automatically terminate your rights under",
+  "this License (including any patent licenses granted under the third",
+  "paragraph of section 11).",
+  "",
+  "  However, if you cease all violation of this License, then your",
+  "license from a particular copyright holder is reinstated (a)",
+  "provisionally, unless and until the copyright holder explicitly and",
+  "finally terminates your license, and (b) permanently, if the copyright",
+  "holder fails to notify you of the violation by some reasonable means",
+  "prior to 60 days after the cessation.",
+  "",
+  "  Moreover, your license from a particular copyright holder is",
+  "reinstated permanently if the copyright holder notifies you of the",
+  "violation by some reasonable means, this is the first time you have",
+  "received notice of violation of this License (for any work) from that",
+  "copyright holder, and you cure the violation prior to 30 days after",
+  "your receipt of the notice.",
+  "",
+  "  Termination of your rights under this section does not terminate the",
+  "licenses of parties who have received copies or rights from you under",
+  "this License.  If your rights have been terminated and not permanently",
+  "reinstated, you do not qualify to receive new licenses for the same",
+  "material under section 10.",
+  "",
+  "  9. Acceptance Not Required for Having Copies.",
+  "",
+  "  You are not required to accept this License in order to receive or",
+  "run a copy of the Program.  Ancillary propagation of a covered work",
+  "occurring solely as a consequence of using peer-to-peer transmission",
+  "to receive a copy likewise does not require acceptance.  However,",
+  "nothing other than this License grants you permission to propagate or",
+  "modify any covered work.  These actions infringe copyright if you do",
+  "not accept this License.  Therefore, by modifying or propagating a",
+  "covered work, you indicate your acceptance of this License to do so.",
+  "",
+  "  10. Automatic Licensing of Downstream Recipients.",
+  "",
+  "  Each time you convey a covered work, the recipient automatically",
+  "receives a license from the original licensors, to run, modify and",
+  "propagate that work, subject to this License.  You are not responsible",
+  "for enforcing compliance by third parties with this License.",
+  "",
+  "  An \"entity transaction\" is a transaction transferring control of an",
+  "organization, or substantially all assets of one, or subdividing an",
+  "organization, or merging organizations.  If propagation of a covered",
+  "work results from an entity transaction, each party to that",
+  "transaction who receives a copy of the work also receives whatever",
+  "licenses to the work the party's predecessor in interest had or could",
+  "give under the previous paragraph, plus a right to possession of the",
+  "Corresponding Source of the work from the predecessor in interest, if",
+  "the predecessor has it or can get it with reasonable efforts.",
+  "",
+  "  You may not impose any further restrictions on the exercise of the",
+  "rights granted or affirmed under this License.  For example, you may",
+  "not impose a license fee, royalty, or other charge for exercise of",
+  "rights granted under this License, and you may not initiate litigation",
+  "(including a cross-claim or counterclaim in a lawsuit) alleging that",
+  "any patent claim is infringed by making, using, selling, offering for",
+  "sale, or importing the Program or any portion of it.",
+  "",
+  "  11. Patents.",
+  "",
+  "  A \"contributor\" is a copyright holder who authorizes use under this",
+  "License of the Program or a work on which the Program is based.  The",
+  "work thus licensed is called the contributor's \"contributor version\".",
+  "",
+  "  A contributor's \"essential patent claims\" are all patent claims",
+  "owned or controlled by the contributor, whether already acquired or",
+  "hereafter acquired, that would be infringed by some manner, permitted",
+  "by this License, of making, using, or selling its contributor version,",
+  "but do not include claims that would be infringed only as a",
+  "consequence of further modification of the contributor version.  For",
+  "purposes of this definition, \"control\" includes the right to grant",
+  "patent sublicenses in a manner consistent with the requirements of",
+  "this License.",
+  "",
+  "  Each contributor grants you a non-exclusive, worldwide, royalty-free",
+  "patent license under the contributor's essential patent claims, to",
+  "make, use, sell, offer for sale, import and otherwise run, modify and",
+  "propagate the contents of its contributor version.",
+  "",
+  "  In the following three paragraphs, a \"patent license\" is any express",
+  "agreement or commitment, however denominated, not to enforce a patent",
+  "(such as an express permission to practice a patent or covenant not to",
+  "sue for patent infringement).  To \"grant\" such a patent license to a",
+  "party means to make such an agreement or commitment not to enforce a",
+  "patent against the party.",
+  "",
+  "  If you convey a covered work, knowingly relying on a patent license,",
+  "and the Corresponding Source of the work is not available for anyone",
+  "to copy, free of charge and under the terms of this License, through a",
+  "publicly available network server or other readily accessible means,",
+  "then you must either (1) cause the Corresponding Source to be so",
+  "available, or (2) arrange to deprive yourself of the benefit of the",
+  "patent license for this particular work, or (3) arrange, in a manner",
+  "consistent with the requirements of this License, to extend the patent",
+  "license to downstream recipients.  \"Knowingly relying\" means you have",
+  "actual knowledge that, but for the patent license, your conveying the",
+  "covered work in a country, or your recipient's use of the covered work",
+  "in a country, would infringe one or more identifiable patents in that",
+  "country that you have reason to believe are valid.",
+  "",
+  "  If, pursuant to or in connection with a single transaction or",
+  "arrangement, you convey, or propagate by procuring conveyance of, a",
+  "covered work, and grant a patent license to some of the parties",
+  "receiving the covered work authorizing them to use, propagate, modify",
+  "or convey a specific copy of the covered work, then the patent license",
+  "you grant is automatically extended to all recipients of the covered",
+  "work and works based on it.",
+  "",
+  "  A patent license is \"discriminatory\" if it does not include within",
+  "the scope of its coverage, prohibits the exercise of, or is",
+  "conditioned on the non-exercise of one or more of the rights that are",
+  "specifically granted under this License.  You may not convey a covered",
+  "work if you are a party to an arrangement with a third party that is",
+  "in the business of distributing software, under which you make payment",
+  "to the third party based on the extent of your activity of conveying",
+  "the work, and under which the third party grants, to any of the",
+  "parties who would receive the covered work from you, a discriminatory",
+  "patent license (a) in connection with copies of the covered work",
+  "conveyed by you (or copies made from those copies), or (b) primarily",
+  "for and in connection with specific products or compilations that",
+  "contain the covered work, unless you entered into that arrangement,",
+  "or that patent license was granted, prior to 28 March 2007.",
+  "",
+  "  Nothing in this License shall be construed as excluding or limiting",
+  "any implied license or other defenses to infringement that may",
+  "otherwise be available to you under applicable patent law.",
+  "",
+  "  12. No Surrender of Others' Freedom.",
+  "",
+  "  If conditions are imposed on you (whether by court order, agreement or",
+  "otherwise) that contradict the conditions of this License, they do not",
+  "excuse you from the conditions of this License.  If you cannot convey a",
+  "covered work so as to satisfy simultaneously your obligations under this",
+  "License and any other pertinent obligations, then as a consequence you may",
+  "not convey it at all.  For example, if you agree to terms that obligate you",
+  "to collect a royalty for further conveying from those to whom you convey",
+  "the Program, the only way you could satisfy both those terms and this",
+  "License would be to refrain entirely from conveying the Program.",
+  "",
+  "  13. Use with the GNU Affero General Public License.",
+  "",
+  "  Notwithstanding any other provision of this License, you have",
+  "permission to link or combine any covered work with a work licensed",
+  "under version 3 of the GNU Affero General Public License into a single",
+  "combined work, and to convey the resulting work.  The terms of this",
+  "License will continue to apply to the part which is the covered work,",
+  "but the special requirements of the GNU Affero General Public License,",
+  "section 13, concerning interaction through a network will apply to the",
+  "combination as such.",
+  "",
+  "  14. Revised Versions of this License.",
+  "",
+  "  The Free Software Foundation may publish revised and/or new versions of",
+  "the GNU General Public License from time to time.  Such new versions will",
+  "be similar in spirit to the present version, but may differ in detail to",
+  "address new problems or concerns.",
+  "",
+  "  Each version is given a distinguishing version number.  If the",
+  "Program specifies that a certain numbered version of the GNU General",
+  "Public License \"or any later version\" applies to it, you have the",
+  "option of following the terms and conditions either of that numbered",
+  "version or of any later version published by the Free Software",
+  "Foundation.  If the Program does not specify a version number of the",
+  "GNU General Public License, you may choose any version ever published",
+  "by the Free Software Foundation.",
+  "",
+  "  If the Program specifies that a proxy can decide which future",
+  "versions of the GNU General Public License can be used, that proxy's",
+  "public statement of acceptance of a version permanently authorizes you",
+  "to choose that version for the Program.",
+  "",
+  "  Later license versions may give you additional or different",
+  "permissions.  However, no additional obligations are imposed on any",
+  "author or copyright holder as a result of your choosing to follow a",
+  "later version.",
+  "",
+  "  15. Disclaimer of Warranty.",
+  "",
+  "  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY",
+  "APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT",
+  "HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY",
+  "OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,",
+  "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR",
+  "PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM",
+  "IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF",
+  "ALL NECESSARY SERVICING, REPAIR OR CORRECTION.",
+  "",
+  "  16. Limitation of Liability.",
+  "",
+  "  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING",
+  "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS",
+  "THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY",
+  "GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE",
+  "USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF",
+  "DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD",
+  "PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),",
+  "EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF",
+  "SUCH DAMAGES.",
+  "",
+  "  17. Interpretation of Sections 15 and 16.",
+  "",
+  "  If the disclaimer of warranty and limitation of liability provided",
+  "above cannot be given local legal effect according to their terms,",
+  "reviewing courts shall apply local law that most closely approximates",
+  "an absolute waiver of all civil liability in connection with the",
+  "Program, unless a warranty or assumption of liability accompanies a",
+  "copy of the Program in return for a fee.",
+  "",
+  "                     END OF TERMS AND CONDITIONS",
+  "",
+  "            How to Apply These Terms to Your New Programs",
+  "",
+  "  If you develop a new program, and you want it to be of the greatest",
+  "possible use to the public, the best way to achieve this is to make it",
+  "free software which everyone can redistribute and change under these terms.",
+  "",
+  "  To do so, attach the following notices to the program.  It is safest",
+  "to attach them to the start of each source file to most effectively",
+  "state the exclusion of warranty; and each file should have at least",
+  "the \"copyright\" line and a pointer to where the full notice is found.",
+  "",
+  "    <one line to give the program's name and a brief idea of what it does.>",
+  "    Copyright (C) <year>  <name of author>",
+  "",
+  "    This program is free software: you can redistribute it and/or modify",
+  "    it under the terms of the GNU General Public License as published by",
+  "    the Free Software Foundation, either version 3 of the License, or",
+  "    (at your option) any later version.",
+  "",
+  "    This program is distributed in the hope that it will be useful,",
+  "    but WITHOUT ANY WARRANTY; without even the implied warranty of",
+  "    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the",
+  "    GNU General Public License for more details.",
+  "",
+  "    You should have received a copy of the GNU General Public License",
+  "    along with this program.  If not, see <http://www.gnu.org/licenses/>.",
+  "",
+  "Also add information on how to contact you by electronic and paper mail.",
+  "",
+  "  If the program does terminal interaction, make it output a short",
+  "notice like this when it starts in an interactive mode:",
+  "",
+  "    <program>  Copyright (C) <year>  <name of author>",
+  "    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.",
+  "    This is free software, and you are welcome to redistribute it",
+  "    under certain conditions; type `show c' for details.",
+  "",
+  "The hypothetical commands `show w' and `show c' should show the appropriate",
+  "parts of the General Public License.  Of course, your program's commands",
+  "might be different; for a GUI interface, you would use an \"about box\".",
+  "",
+  "  You should also get your employer (if you work as a programmer) or school,",
+  "if any, to sign a \"copyright disclaimer\" for the program, if necessary.",
+  "For more information on this, and how to apply and follow the GNU GPL, see",
+  "<http://www.gnu.org/licenses/>.",
+  "",
+  "  The GNU General Public License does not permit incorporating your program",
+  "into proprietary programs.  If your program is a subroutine library, you",
+  "may consider it more useful to permit linking proprietary applications with",
+  "the library.  If this is what you want to do, use the GNU Lesser General",
+  "Public License instead of this License.  But first, please read",
+  "<http://www.gnu.org/philosophy/why-not-lgpl.html>.",
+  0};
diff --git a/src/COPYING.hh.dist b/src/COPYING.hh.dist
new file mode 100644
index 0000000..ed4cdbc
--- /dev/null
+++ b/src/COPYING.hh.dist
@@ -0,0 +1,4 @@
+#ifndef PPL_COPYING_hh
+#define PPL_COPYING_hh 1
+extern const char* const COPYING_array[675];
+#endif // !defined(PPL_COPYING_hh)
diff --git a/src/CO_Tree.cc b/src/CO_Tree.cc
new file mode 100644
index 0000000..a7e5ecd
--- /dev/null
+++ b/src/CO_Tree.cc
@@ -0,0 +1,1337 @@
+/* CO_Tree class implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "CO_Tree_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::CO_Tree::external_memory_in_bytes() const {
+  dimension_type memory_size = 0;
+  if (reserved_size != 0) {
+    // Add the size of data[]
+    memory_size += (reserved_size + 1)*sizeof(data[0]);
+    // Add the size of indexes[]
+    memory_size += (reserved_size + 2)*sizeof(indexes[0]);
+    for (const_iterator itr = begin(), itr_end = end(); itr != itr_end; ++itr)
+      memory_size += PPL::external_memory_in_bytes(*itr);
+  }
+  return memory_size;
+}
+
+PPL::CO_Tree::iterator
+PPL::CO_Tree::insert(iterator itr, dimension_type key1) {
+  PPL_ASSERT(key1 != unused_index);
+
+  if (empty()) {
+    insert_in_empty_tree(key1, Coefficient_zero());
+    return iterator(*this);
+  }
+
+  if (itr == end())
+    return insert(key1);
+
+  iterator candidate1 = bisect_near(itr, key1);
+
+  if (key1 == candidate1.index())
+    return candidate1;
+
+  dimension_type candidate2_index = dfs_index(candidate1);
+
+  if (key1 < candidate1.index()) {
+    --candidate2_index;
+    while (indexes[candidate2_index] == unused_index)
+      --candidate2_index;
+  }
+  else {
+    ++candidate2_index;
+    while (indexes[candidate2_index] == unused_index)
+      ++candidate2_index;
+  }
+
+  tree_iterator candidate1_node(candidate1, *this);
+
+  PPL_ASSERT(candidate2_index <= reserved_size + 1);
+
+  if (candidate2_index == 0 || candidate2_index > reserved_size)
+    // Use candidate1
+    return iterator(insert_precise(key1, Coefficient_zero(),
+                                   candidate1_node));
+
+  tree_iterator candidate2_node(*this, candidate2_index);
+
+  // Adjacent nodes in an in-order visit of a tree always have different
+  // heights. This fact can be easily proven by induction on the tree's
+  // height, using the definition of the in-order layout.
+  PPL_ASSERT(candidate1_node.get_offset() != candidate2_node.get_offset());
+
+  if (candidate1_node.get_offset() < candidate2_node.get_offset()) {
+    PPL_ASSERT(candidate1_node.depth() > candidate2_node.depth());
+    // candidate1_node is deeper in the tree than candidate2_node, so use
+    // candidate1_node.
+    return iterator(insert_precise(key1, Coefficient_zero(),
+                                   candidate1_node));
+  }
+  else {
+    PPL_ASSERT(candidate1_node.depth() < candidate2_node.depth());
+    // candidate2_node is deeper in the tree than candidate1_node, so use
+    // candidate2_node.
+    return iterator(insert_precise(key1, Coefficient_zero(),
+                                    candidate2_node));
+  }
+}
+
+PPL::CO_Tree::iterator
+PPL::CO_Tree::insert(iterator itr, dimension_type key1,
+                     data_type_const_reference data1) {
+  PPL_ASSERT(key1 != unused_index);
+
+  if (empty()) {
+    insert_in_empty_tree(key1, data1);
+    return iterator(*this);
+  }
+
+  if (itr == end())
+    return insert(key1, data1);
+
+  iterator candidate1 = bisect_near(itr, key1);
+
+  if (key1 == candidate1.index()) {
+    *candidate1 = data1;
+    return candidate1;
+  }
+
+  dimension_type candidate2_index = dfs_index(candidate1);
+
+  if (key1 < candidate1.index()) {
+    --candidate2_index;
+    while (indexes[candidate2_index] == unused_index)
+      --candidate2_index;
+  }
+  else {
+    ++candidate2_index;
+    while (indexes[candidate2_index] == unused_index)
+      ++candidate2_index;
+  }
+
+  tree_iterator candidate1_node(candidate1, *this);
+
+  if (candidate2_index == 0 || candidate2_index > reserved_size)
+    // Use candidate1
+    return iterator(insert_precise(key1, data1, candidate1_node));
+
+  tree_iterator candidate2_node(*this, candidate2_index);
+
+  // Adjacent nodes in an in-order visit of a tree always have different
+  // heights. This fact can be easily proven by induction on the tree's
+  // height, using the definition of the in-order layout.
+  PPL_ASSERT(candidate1_node.get_offset() != candidate2_node.get_offset());
+
+  if (candidate1_node.get_offset() < candidate2_node.get_offset()) {
+    PPL_ASSERT(candidate1_node.depth() > candidate2_node.depth());
+    // candidate1_node is deeper in the tree than candidate2_node, so
+    // use candidate1_node.
+    return iterator(insert_precise(key1, data1, candidate1_node));
+  }
+  else {
+    PPL_ASSERT(candidate1_node.depth() < candidate2_node.depth());
+    // candidate2_node is deeper in the tree than candidate1_node, so
+    // use candidate2_node.
+    return iterator(insert_precise(key1, data1, candidate2_node));
+  }
+}
+
+void
+PPL::CO_Tree::erase_element_and_shift_left(dimension_type key) {
+  iterator itr = erase(key);
+  if (itr == end())
+    return;
+  const dimension_type i = dfs_index(itr);
+  dimension_type* p = indexes + i;
+  const dimension_type* const p_end = indexes + (reserved_size + 1);
+  for ( ; p != p_end; ++p)
+    if (*p != unused_index)
+      --(*p);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::CO_Tree::increase_keys_from(dimension_type key, dimension_type n) {
+  if (empty())
+    return;
+  dimension_type* p = indexes + reserved_size;
+  while (*p == unused_index)
+    --p;
+  while (p != indexes && *p >= key) {
+    *p += n;
+    --p;
+    while (*p == unused_index)
+      --p;
+  }
+  PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::CO_Tree::bisect_in(dimension_type first, dimension_type last,
+                   dimension_type key) const {
+  PPL_ASSERT(first != 0);
+  PPL_ASSERT(last <= reserved_size);
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(indexes[first] != unused_index);
+  PPL_ASSERT(indexes[last] != unused_index);
+
+  while (first < last) {
+    dimension_type half = (first + last) / 2;
+    dimension_type new_half = half;
+
+    while (indexes[new_half] == unused_index)
+      ++new_half;
+
+    if (indexes[new_half] == key)
+      return new_half;
+
+    if (indexes[new_half] > key) {
+
+      while (indexes[half] == unused_index)
+        --half;
+
+      last = half;
+
+    }
+    else {
+
+      ++new_half;
+      while (indexes[new_half] == unused_index)
+        ++new_half;
+
+      first = new_half;
+    }
+  }
+
+  // It is important that last is returned instead of first, because first
+  // may have increased beyond last, even beyond the original value of last
+  // at the beginning of this method.
+  return last;
+}
+
+PPL::dimension_type
+PPL::CO_Tree::bisect_near(dimension_type hint, dimension_type key) const {
+  PPL_ASSERT(hint != 0);
+  PPL_ASSERT(hint <= reserved_size);
+  PPL_ASSERT(indexes[hint] != unused_index);
+
+  if (indexes[hint] == key)
+    return hint;
+
+  dimension_type new_hint;
+  dimension_type offset = 1;
+
+  if (indexes[hint] > key) {
+    // The searched element is before `hint'.
+
+    while (true) {
+
+      if (hint <= offset) {
+        // The searched element is in (0,hint).
+        new_hint = hint;
+        hint = 1;
+        // The searched element is in [hint,new_hint).
+        while (indexes[hint] == unused_index)
+          ++hint;
+        if (indexes[hint] >= key)
+          return hint;
+        // The searched element is in (hint,new_hint) and both indexes point
+        // to valid elements.
+        break;
+      }
+      else
+        new_hint = hint - offset;
+
+      PPL_ASSERT(new_hint > 0);
+      PPL_ASSERT(new_hint <= reserved_size);
+
+      // Find the element at `new_hint' (or the first after it).
+      while (indexes[new_hint] == unused_index)
+        ++new_hint;
+
+      PPL_ASSERT(new_hint <= hint);
+
+      if (indexes[new_hint] == key)
+        return new_hint;
+      else
+        if (indexes[new_hint] < key) {
+          // The searched element is in (new_hint,hint)
+          using std::swap;
+          swap(hint, new_hint);
+          // The searched element is now in (hint,new_hint).
+          break;
+        }
+
+      hint = new_hint;
+      offset *= 2;
+    }
+
+  }
+  else {
+    // The searched element is after `hint'.
+    while (true) {
+
+      if (hint + offset > reserved_size) {
+        // The searched element is in (hint,reserved_size+1).
+        new_hint = reserved_size;
+        // The searched element is in (hint,new_hint].
+        while (indexes[new_hint] == unused_index)
+          --new_hint;
+        if (indexes[new_hint] <= key)
+          return new_hint;
+        // The searched element is in (hint,new_hint) and both indexes point
+        // to valid elements.
+        break;
+      }
+      else
+        new_hint = hint + offset;
+
+      PPL_ASSERT(new_hint > 0);
+      PPL_ASSERT(new_hint <= reserved_size);
+
+      // Find the element at `new_hint' (or the first after it).
+      while (indexes[new_hint] == unused_index)
+        --new_hint;
+
+      PPL_ASSERT(hint <= new_hint);
+
+      if (indexes[new_hint] == key)
+        return new_hint;
+      else
+        if (indexes[new_hint] > key)
+          // The searched element is in (hint,new_hint).
+          break;
+
+      hint = new_hint;
+      offset *= 2;
+    }
+  }
+  // The searched element is in (hint,new_hint).
+  PPL_ASSERT(hint > 0);
+  PPL_ASSERT(hint < new_hint);
+  PPL_ASSERT(new_hint <= reserved_size);
+  PPL_ASSERT(indexes[hint] != unused_index);
+  PPL_ASSERT(indexes[new_hint] != unused_index);
+
+  ++hint;
+  while (indexes[hint] == unused_index)
+    ++hint;
+
+  if (hint == new_hint)
+    return hint;
+
+  --new_hint;
+  while (indexes[new_hint] == unused_index)
+    --new_hint;
+
+  PPL_ASSERT(hint <= new_hint);
+  PPL_ASSERT(indexes[hint] != unused_index);
+  PPL_ASSERT(indexes[new_hint] != unused_index);
+
+  return bisect_in(hint, new_hint, key);
+}
+
+PPL::CO_Tree::tree_iterator
+PPL::CO_Tree::insert_precise(dimension_type key1,
+                             data_type_const_reference data1,
+                             tree_iterator itr) {
+  PPL_ASSERT(key1 != unused_index);
+  PPL_ASSERT(!empty());
+
+#ifndef NDEBUG
+  // Check that `itr' is a correct hint.
+  tree_iterator itr2(*this);
+  itr2.go_down_searching_key(key1);
+  PPL_ASSERT(itr == itr2);
+#endif
+
+  if (itr.index() == key1) {
+    // Replacement, rather than insertion.
+    *itr = data1;
+    PPL_ASSERT(OK());
+    return itr;
+  }
+
+  // Proper insertion: check if it would invalidate `data1'.
+  const bool invalidating
+    = (data <= &data1) && (&data1 < data + (reserved_size + 1));
+
+  if (!invalidating)
+    return insert_precise_aux(key1, data1, itr);
+
+  // `data1' could be invalidated by the insert, because it is
+  // a coefficient of this row. Avoid the issue by copying it.
+  data_type data1_copy = data1;
+
+#ifndef NDEBUG
+  dimension_type i = &data1 - data;
+  dimension_type key2 = indexes[i];
+  PPL_ASSERT(key2 != unused_index);
+  // This is true since `key1' is not in the tree.
+  PPL_ASSERT(key2 != key1);
+#endif
+
+  // Insert a dummy coefficient.
+  // NOTE: this may invalidate `data1', because it may reallocate the tree
+  // and/or move coefficients during rebalancing.
+  itr = insert_precise_aux(key1, Coefficient_zero(), itr);
+
+  PPL_ASSERT(itr.index() == key1);
+
+  // Swap the correct coefficient in place.
+  using std::swap;
+  swap(*itr, data1_copy);
+
+  PPL_ASSERT(OK());
+  return itr;
+}
+
+PPL::CO_Tree::tree_iterator
+PPL::CO_Tree::insert_precise_aux(dimension_type key1,
+                                 data_type_const_reference data1,
+                                 tree_iterator itr) {
+  PPL_ASSERT(key1 != unused_index);
+  PPL_ASSERT(!empty());
+  // This is a proper insert.
+  PPL_ASSERT(itr.index() != key1);
+  // `data1' is not going to be invalidated.
+  PPL_ASSERT(!(data <= &data1 && &data1 < data + (reserved_size + 1)));
+
+  if (is_greater_than_ratio(size_ + 1, reserved_size, max_density_percent)) {
+    rebuild_bigger_tree();
+    // `itr' was invalidated by the rebuild operation
+    itr.get_root();
+    itr.go_down_searching_key(key1);
+    PPL_ASSERT(itr.index() != key1);
+  }
+
+  PPL_ASSERT(!is_greater_than_ratio(size_ + 1, reserved_size,
+                                    max_density_percent));
+
+  ++size_;
+
+  if (!itr.is_leaf()) {
+    if (key1 < itr.index())
+      itr.get_left_child();
+    else
+      itr.get_right_child();
+    PPL_ASSERT(itr.index() == unused_index);
+
+    new (&(*itr)) data_type(data1);
+    // Set the index only if the construction was successful.
+    itr.index() = key1;
+  }
+  else {
+    itr = rebalance(itr, key1, data1);
+    itr.go_down_searching_key(key1);
+    PPL_ASSERT(itr.index() == key1);
+  }
+  PPL_ASSERT(OK());
+
+  return itr;
+}
+
+PPL::CO_Tree::iterator
+PPL::CO_Tree::erase(tree_iterator itr) {
+  PPL_ASSERT(itr.index() != unused_index);
+
+  PPL_ASSERT(size_ != 0);
+
+  if (size_ == 1) {
+    // Deleting the only element of this tree, now it is empty.
+    clear();
+    return end();
+  }
+
+  if (is_less_than_ratio(size_ - 1, reserved_size, min_density_percent)
+      && !is_greater_than_ratio(size_ - 1, reserved_size/2,
+                                max_density_percent)) {
+
+    const dimension_type key = itr.index();
+
+    PPL_ASSERT(!is_greater_than_ratio(size_, reserved_size,
+                                      max_density_percent));
+
+    rebuild_smaller_tree();
+    itr.get_root();
+    itr.go_down_searching_key(key);
+
+    PPL_ASSERT(itr.index() == key);
+  }
+
+#ifndef NDEBUG
+  if (size_ > 1)
+    PPL_ASSERT(!is_less_than_ratio(size_ - 1, reserved_size,
+                                   min_density_percent)
+               || is_greater_than_ratio(size_ - 1, reserved_size/2,
+                                        max_density_percent));
+#endif
+
+  const dimension_type deleted_key = itr.index();
+  tree_iterator deleted_node = itr;
+  (*itr).~data_type();
+  while (true) {
+    dimension_type& current_key  = itr.index();
+    data_type&      current_data = *itr;
+    if (itr.is_leaf())
+      break;
+    itr.get_left_child();
+    if (itr.index() != unused_index)
+      // The left child has a value.
+      itr.follow_right_children_with_value();
+    else {
+      // The left child has not a value, try the right child.
+      itr.get_parent();
+      itr.get_right_child();
+      if (itr.index() != unused_index)
+        // The right child has a value.
+        itr.follow_left_children_with_value();
+      else {
+        // The right child has not a value, too.
+        itr.get_parent();
+        break;
+      }
+    }
+    using std::swap;
+    swap(current_key, itr.index());
+    move_data_element(current_data, *itr);
+  }
+
+  PPL_ASSERT(itr.index() != unused_index);
+  itr.index() = unused_index;
+  --size_;
+
+  PPL_ASSERT(OK());
+
+  itr = rebalance(itr, 0, Coefficient_zero());
+
+  if (itr.get_offset() < deleted_node.get_offset())
+    // deleted_node is an ancestor of itr
+    itr = deleted_node;
+
+  itr.go_down_searching_key(deleted_key);
+
+  iterator result(itr);
+
+  if (result.index() < deleted_key)
+    ++result;
+
+  PPL_ASSERT(OK());
+  PPL_ASSERT(result == end() || result.index() > deleted_key);
+#ifndef NDEBUG
+  if (!empty()) {
+    iterator last = end();
+    --last;
+    PPL_ASSERT((result == end()) == (last.index() < deleted_key));
+  }
+#endif
+
+  return result;
+}
+
+void
+PPL::CO_Tree::init(dimension_type n) {
+  indexes = NULL;
+  data = NULL;
+  size_ = 0;
+  reserved_size = 0;
+  max_depth = 0;
+
+  if (n > 0) {
+    const dimension_type max_d = integer_log2(n) + 1;
+    const height_t new_max_depth = static_cast<height_t>(max_d);
+    const dimension_type new_reserved_size
+      = (static_cast<dimension_type>(1) << new_max_depth) - 1;
+    // If this throws, *this will be the empty tree.
+    indexes = new dimension_type[new_reserved_size + 2];
+    try {
+      data = data_allocator.allocate(new_reserved_size + 1);
+    }
+    catch (...) {
+      delete[] indexes;
+      indexes = 0;
+      PPL_ASSERT(OK());
+      throw;
+    }
+    max_depth = new_max_depth;
+    reserved_size = new_reserved_size;
+
+    // Mark all pairs as unused.
+    for (dimension_type i = 1; i <= reserved_size; ++i)
+      indexes[i] = unused_index;
+
+    // These are used as markers by iterators.
+    indexes[0] = 0;
+    indexes[reserved_size + 1] = 0;
+  }
+
+  refresh_cached_iterators();
+
+  PPL_ASSERT(structure_OK());
+}
+
+void
+PPL::CO_Tree::destroy() {
+
+  if (reserved_size != 0) {
+    for (dimension_type i = 1; i <= reserved_size; ++i) {
+      if (indexes[i] != unused_index)
+        data[i].~data_type();
+    }
+
+    delete[] indexes;
+    data_allocator.deallocate(data, reserved_size + 1);
+  }
+}
+
+bool
+PPL::CO_Tree::structure_OK() const {
+
+  if (size_ > reserved_size)
+    return false;
+
+  if (reserved_size == 0) {
+    if (indexes != NULL)
+      return false;
+    if (data != NULL)
+      return false;
+    if (max_depth != 0)
+      return false;
+
+    return true;
+  }
+
+  if (reserved_size < 3)
+    return false;
+
+  if (reserved_size != (static_cast<dimension_type>(1) << max_depth) - 1)
+    return false;
+
+  if (data == NULL)
+    return false;
+
+  if (indexes == NULL)
+    return false;
+
+  if (max_depth == 0)
+    return false;
+
+  if (size_ == 0) {
+
+    // This const_cast could be removed by adding a const_tree_iterator,
+    // but it would add much code duplication without a real need.
+    tree_iterator itr(*const_cast<CO_Tree*>(this));
+    if (itr.index() != unused_index)
+      return false;
+
+  }
+  else {
+    // This const_cast could be removed by adding a const_tree_iterator,
+    // but it would add much code duplication without a real need.
+    tree_iterator itr(*const_cast<CO_Tree*>(this));
+    const dimension_type real_size = count_used_in_subtree(itr);
+    if (real_size != size_)
+      // There are \p real_size elements in the tree that are reachable by the
+      // root, but size is \p size.
+      return false;
+  }
+
+  if (size_ != 0) {
+    const_iterator itr = begin();
+    const_iterator itr_end = end();
+
+    if (itr != itr_end) {
+      dimension_type last_index = itr.index();
+      for (++itr; itr != itr_end; ++itr) {
+        if (last_index >= itr.index())
+          // Found index \p itr->first after index \p last_index.
+          return false;
+        last_index = itr.index();
+      }
+    }
+  }
+
+  if (const_iterator(cached_end) != const_iterator(*this, reserved_size + 1))
+    return false;
+  if (cached_const_end != const_iterator(*this, reserved_size + 1))
+    return false;
+
+  return true;
+}
+
+bool
+PPL::CO_Tree::OK() const {
+
+  if (!structure_OK())
+    return false;
+
+  {
+    dimension_type real_size = 0;
+
+    for (const_iterator itr = begin(), itr_end = end(); itr != itr_end; ++itr)
+      ++real_size;
+
+    if (real_size != size_)
+      // There are \p real_size elements in the tree, but size is \p size.
+      return false;
+  }
+
+  if (reserved_size > 0) {
+    if (is_greater_than_ratio(size_, reserved_size, max_density_percent)
+        && reserved_size != 3)
+      // Found too high density.
+      return false;
+    if (is_less_than_ratio(size_, reserved_size, min_density_percent)
+        && !is_greater_than_ratio(size_, reserved_size/2, max_density_percent))
+      // Found too low density
+      return false;
+  }
+
+  return true;
+}
+
+unsigned
+PPL::CO_Tree::integer_log2(dimension_type n) {
+  PPL_ASSERT(n != 0);
+  unsigned result = 0;
+  while (n != 1) {
+    n /= 2;
+    ++result;
+  }
+  return result;
+}
+
+void
+PPL::CO_Tree::dump_subtree(tree_iterator itr) {
+  if (!itr.is_leaf()) {
+    itr.get_left_child();
+    dump_subtree(itr);
+    itr.get_parent();
+  }
+  std::cout << "At depth: " << itr.depth();
+  if (itr.index() == unused_index)
+    std::cout << " (no data)" << std::endl;
+  else
+    std::cout << " pair (" << itr.index() << "," << *itr << ")" << std::endl;
+  if (!itr.is_leaf()) {
+    itr.get_right_child();
+    dump_subtree(itr);
+    itr.get_parent();
+  }
+}
+
+void
+PPL::CO_Tree::rebuild_bigger_tree() {
+  if (reserved_size == 0) {
+    init(3);
+    PPL_ASSERT(structure_OK());
+    return;
+  }
+
+  const dimension_type new_reserved_size = reserved_size*2 + 1;
+
+  dimension_type* const new_indexes = new dimension_type[new_reserved_size + 2];
+
+  data_type* new_data;
+
+  try {
+    new_data = data_allocator.allocate(new_reserved_size + 1);
+  } catch (...) {
+    delete[] new_indexes;
+    throw;
+  }
+
+  new_indexes[1] = unused_index;
+
+  for (dimension_type i = 1, j = 2; i <= reserved_size; ++i, ++j) {
+    new_indexes[j] = indexes[i];
+    if (indexes[i] != unused_index)
+      move_data_element(new_data[j], data[i]);
+    ++j;
+    new_indexes[j] = unused_index;
+  }
+
+  // These are used as markers by iterators.
+  new_indexes[0] = 0;
+  new_indexes[new_reserved_size + 1] = 0;
+
+  delete[] indexes;
+  data_allocator.deallocate(data, reserved_size + 1);
+
+  indexes = new_indexes;
+  data = new_data;
+  reserved_size = new_reserved_size;
+  ++max_depth;
+
+  refresh_cached_iterators();
+
+  PPL_ASSERT(structure_OK());
+}
+
+PPL::CO_Tree::tree_iterator
+PPL::CO_Tree::rebalance(tree_iterator itr, dimension_type key,
+                        data_type_const_reference value) {
+  // Trees with reserved size 3 need not to be rebalanced.
+  // This check is needed because they can't be shrunk, so they may violate
+  // the density thresholds, and this would prevent the following while from
+  // working correctly.
+  if (reserved_size == 3) {
+    PPL_ASSERT(OK());
+    return tree_iterator(*this);
+  }
+  PPL_ASSERT(itr.index() == unused_index || itr.is_leaf());
+  height_t itr_depth_minus_1 = itr.depth() - 1;
+  const height_t height = max_depth - itr_depth_minus_1;
+  dimension_type subtree_size;
+  dimension_type subtree_reserved_size = (static_cast<dimension_type>(1)
+                                          << height) - 1;
+  const bool deleting = itr.index() == unused_index;
+  PPL_ASSERT(deleting || key != unused_index);
+  if (deleting)
+    subtree_size = 0;
+  else
+    // The existing element and the element with index key we want to add.
+    subtree_size = 2;
+
+  while (is_greater_than_ratio(subtree_size, subtree_reserved_size,
+                               max_density_percent
+                               + ((itr_depth_minus_1
+                                   * (100 - max_density_percent))
+                                  / (max_depth - 1)))
+         || is_less_than_ratio(subtree_size, subtree_reserved_size,
+                               min_density_percent
+                               - ((itr_depth_minus_1
+                                   * (min_density_percent
+                                      - min_leaf_density_percent))
+                                  / (max_depth - 1)))) {
+    // The density in the tree is correct, so the while condition is always
+    // false for the root.
+    PPL_ASSERT(itr_depth_minus_1 != 0);
+    const bool is_right_brother = itr.is_right_child();
+    itr.get_parent();
+    if (is_right_brother)
+      itr.get_left_child();
+    else
+      itr.get_right_child();
+    subtree_size += count_used_in_subtree(itr);
+    itr.get_parent();
+    PPL_ASSERT(itr.index() != unused_index);
+    ++subtree_size;
+    subtree_reserved_size = 2*subtree_reserved_size + 1;
+    --itr_depth_minus_1;
+    PPL_ASSERT(itr.depth() - 1 == itr_depth_minus_1);
+  }
+
+  // Now the subtree rooted at itr has been chosen as the subtree to be
+  // rebalanced.
+
+  // Step 1: compact elements of this subtree in the rightmost end, from right
+  //         to left.
+  const dimension_type last_index_in_subtree
+    = itr.dfs_index() + itr.get_offset() - 1;
+
+  const dimension_type first_unused
+    = compact_elements_in_the_rightmost_end(last_index_in_subtree,
+                                            subtree_size, key, value,
+                                            !deleting);
+
+  // Step 2: redistribute the elements, from left to right.
+  redistribute_elements_in_subtree(itr.dfs_index(), subtree_size,
+                                   first_unused + 1, key, value,
+                                   first_unused != last_index_in_subtree
+                                                   - subtree_size);
+
+  PPL_ASSERT(OK());
+
+  return itr;
+}
+
+PPL::dimension_type
+PPL::CO_Tree
+::compact_elements_in_the_rightmost_end(dimension_type last_in_subtree,
+                                        dimension_type subtree_size,
+                                        dimension_type key,
+                                        data_type_const_reference value,
+                                        bool add_element) {
+
+  PPL_ASSERT(subtree_size != 0);
+
+  PPL_ASSERT(subtree_size != 1 || !add_element);
+
+  dimension_type* last_index_in_subtree = &(indexes[last_in_subtree]);
+  data_type* last_data_in_subtree = &(data[last_in_subtree]);
+
+  dimension_type* first_unused_index = last_index_in_subtree;
+  data_type* first_unused_data = last_data_in_subtree;
+
+  while (*last_index_in_subtree == unused_index) {
+    --last_index_in_subtree;
+    --last_data_in_subtree;
+  }
+
+  // From now on, last_index_in_subtree and last_data_in_subtree point to the
+  // rightmost node with a value in the subtree. first_unused_index and
+  // first_unused_data point to the rightmost unused node in the subtree.
+
+  if (add_element)
+    while (subtree_size != 0) {
+      --subtree_size;
+      if (last_index_in_subtree == indexes || key > *last_index_in_subtree) {
+        if (last_index_in_subtree == indexes
+            || last_index_in_subtree != first_unused_index) {
+          PPL_ASSERT(first_unused_index != indexes);
+          PPL_ASSERT(*first_unused_index == unused_index);
+          new (first_unused_data) data_type(value);
+          // Set the index only if the construction was successful.
+          *first_unused_index = key;
+          --first_unused_index;
+          --first_unused_data;
+        }
+        break;
+      }
+      else {
+        if (last_index_in_subtree != first_unused_index) {
+          PPL_ASSERT(first_unused_index != indexes);
+          PPL_ASSERT(last_index_in_subtree != indexes);
+          PPL_ASSERT(*first_unused_index == unused_index);
+          *first_unused_index = *last_index_in_subtree;
+          *last_index_in_subtree = unused_index;
+          move_data_element(*first_unused_data, *last_data_in_subtree);
+        }
+        --last_index_in_subtree;
+        --last_data_in_subtree;
+        while (*last_index_in_subtree == unused_index) {
+          --last_index_in_subtree;
+          --last_data_in_subtree;
+        }
+        --first_unused_index;
+        --first_unused_data;
+      }
+    }
+  while (subtree_size != 0) {
+    if (last_index_in_subtree != first_unused_index) {
+      PPL_ASSERT(first_unused_index != indexes);
+      PPL_ASSERT(last_index_in_subtree != indexes);
+      PPL_ASSERT(*first_unused_index == unused_index);
+      *first_unused_index = *last_index_in_subtree;
+      *last_index_in_subtree = unused_index;
+      move_data_element(*first_unused_data, *last_data_in_subtree);
+    }
+    --last_index_in_subtree;
+    --last_data_in_subtree;
+    while (*last_index_in_subtree == unused_index) {
+      --last_index_in_subtree;
+      --last_data_in_subtree;
+    }
+    --first_unused_index;
+    --first_unused_data;
+    --subtree_size;
+  }
+
+  const ptrdiff_t distance = first_unused_index - indexes;
+  PPL_ASSERT(distance >= 0);
+  return static_cast<dimension_type>(distance);
+}
+
+void
+PPL::CO_Tree::redistribute_elements_in_subtree(
+    dimension_type root_index,
+    dimension_type subtree_size,
+    dimension_type last_used,
+    dimension_type key,
+    data_type_const_reference value,
+    bool add_element) {
+
+  // This is static and with static allocation, to improve performance.
+  // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that
+  // 2^k-1 is a dimension_type, so it is the maximum tree height.
+  // For each node level, the stack may contain up to two element (one for the
+  // subtree rooted at the right son of a node of that level, and one for the
+  // node itself). An additional element can be at the top of the tree.
+  static std::pair<dimension_type,dimension_type>
+    stack[2U * sizeof_to_bits(sizeof(dimension_type)) + 1U];
+
+  std::pair<dimension_type,dimension_type>* stack_first_empty = stack;
+
+  // A pair (n, i) in the stack means to visit the subtree with root index i
+  // and size n.
+
+  PPL_ASSERT(subtree_size != 0);
+
+  stack_first_empty->first  = subtree_size;
+  stack_first_empty->second = root_index;
+  ++stack_first_empty;
+
+  while (stack_first_empty != stack) {
+
+    --stack_first_empty;
+
+    // Implement
+    //
+    // <CODE>
+    //   top_n = stack.top().first;
+    //   top_i = stack.top().second;
+    // </CODE>
+    const dimension_type top_n = stack_first_empty->first;
+    const dimension_type top_i = stack_first_empty->second;
+
+    PPL_ASSERT(top_n != 0);
+    if (top_n == 1) {
+      if (add_element
+          && (last_used > reserved_size || indexes[last_used] > key)) {
+        PPL_ASSERT(last_used != top_i);
+        PPL_ASSERT(indexes[top_i] == unused_index);
+        add_element = false;
+        new (&(data[top_i])) data_type(value);
+        // Set the index only if the construction was successful.
+        indexes[top_i] = key;
+      }
+      else {
+        if (last_used != top_i) {
+          PPL_ASSERT(indexes[top_i] == unused_index);
+          indexes[top_i] = indexes[last_used];
+          indexes[last_used] = unused_index;
+          move_data_element(data[top_i], data[last_used]);
+        }
+        ++last_used;
+      }
+    }
+    else {
+      PPL_ASSERT(stack_first_empty + 2
+                 < stack + sizeof(stack)/sizeof(stack[0]));
+
+      const dimension_type offset = (top_i & -top_i) / 2;
+      const dimension_type half = (top_n + 1) / 2;
+
+      PPL_ASSERT(half > 0);
+
+      // Right subtree
+      PPL_ASSERT(top_n - half > 0);
+      stack_first_empty->first  = top_n - half;
+      stack_first_empty->second = top_i + offset;
+      ++stack_first_empty;
+
+      // Root of the current subtree
+      stack_first_empty->first   = 1;
+      stack_first_empty->second  = top_i;
+      ++stack_first_empty;
+
+      // Left subtree
+      if (half - 1 != 0) {
+        stack_first_empty->first   = half - 1;
+        stack_first_empty->second  = top_i - offset;
+        ++stack_first_empty;
+      }
+    }
+  }
+
+  PPL_ASSERT(!add_element);
+}
+
+void
+PPL::CO_Tree::move_data_from(CO_Tree& tree) {
+  PPL_ASSERT(size_ == 0);
+  if (tree.size_ == 0)
+    return;
+
+  tree_iterator root(*this);
+
+  dimension_type source_index = 1;
+  while (tree.indexes[source_index] == unused_index)
+    ++source_index;
+
+  // This is static and with static allocation, to improve performance.
+  // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that 2^k-1 is a
+  // dimension_type, so it is the maximum tree height.
+  // For each node level, the stack may contain up to 4 elements: two elements
+  // with operation 0, one element with operation 2 and one element
+  // with operation 3. An additional element with operation 1 can be at the
+  // top of the tree.
+  static std::pair<dimension_type, signed char>
+    stack[5U * sizeof_to_bits(sizeof(dimension_type))];
+
+  dimension_type stack_first_empty = 0;
+
+  // A pair (n, operation) in the stack means:
+  //
+  // * Go to the parent, if operation is 0.
+  // * Go to the left child, then visit the current tree (with size n), if
+  //   operation is 1.
+  // * Go to the right child, then visit the current tree (with size n), if
+  //   operation is 2.
+  // * Visit the current tree (with size n), if operation is 3.
+
+  stack[0].first = tree.size_;
+  stack[0].second = 3;
+  ++stack_first_empty;
+
+  while (stack_first_empty != 0) {
+
+    // Implement
+    //
+    // <CODE>
+    //   top_n         = stack.top().first;
+    //   top_operation = stack.top().second;
+    // </CODE>
+    const dimension_type top_n = stack[stack_first_empty - 1].first;
+    const signed char top_operation = stack[stack_first_empty - 1].second;
+
+    switch (top_operation) {
+
+    case 0:
+      root.get_parent();
+      --stack_first_empty;
+      continue;
+
+    case 1:
+      root.get_left_child();
+      break;
+
+    case 2:
+      root.get_right_child();
+      break;
+
+#ifndef NDEBUG
+    case 3:
+      break;
+
+    default:
+      PPL_UNREACHABLE;
+      break;
+#endif
+    }
+
+    // We now visit the current tree
+
+    if (top_n == 0) {
+      --stack_first_empty;
+    }
+    else {
+      if (top_n == 1) {
+        PPL_ASSERT(root.index() == unused_index);
+        PPL_ASSERT(tree.indexes[source_index] != unused_index);
+        root.index() = tree.indexes[source_index];
+        tree.indexes[source_index] = unused_index;
+        move_data_element(*root, tree.data[source_index]);
+        PPL_ASSERT(source_index <= tree.reserved_size);
+        ++source_index;
+        while (tree.indexes[source_index] == unused_index)
+          ++source_index;
+        --stack_first_empty;
+      }
+      else {
+        PPL_ASSERT(stack_first_empty + 3 < sizeof(stack)/sizeof(stack[0]));
+
+        const dimension_type half = (top_n + 1) / 2;
+        stack[stack_first_empty - 1].second = 0;
+        stack[stack_first_empty    ] = std::make_pair(top_n - half, 2);
+        stack[stack_first_empty + 1] = std::make_pair(1, 3);
+        stack[stack_first_empty + 2].second = 0;
+        stack[stack_first_empty + 3] = std::make_pair(half - 1, 1);
+        stack_first_empty += 4;
+      }
+    }
+  }
+  size_ = tree.size_;
+  tree.size_ = 0;
+  PPL_ASSERT(tree.structure_OK());
+  PPL_ASSERT(structure_OK());
+}
+
+void
+PPL::CO_Tree::copy_data_from(const CO_Tree& x) {
+  PPL_ASSERT(size_ == 0);
+  PPL_ASSERT(reserved_size == x.reserved_size);
+  PPL_ASSERT(structure_OK());
+
+  if (x.size_ == 0) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  dimension_type i;
+  try {
+    for (i = x.reserved_size; i > 0; --i)
+      if (x.indexes[i] != unused_index) {
+        indexes[i] = x.indexes[i];
+        new (&(data[i])) data_type(x.data[i]);
+      }
+      else {
+        PPL_ASSERT(indexes[i] == unused_index);
+      }
+  } catch (...) {
+    // The (used) data elements in (i,x.reserved_size] have been constructed
+    // successfully.
+    // The constructor of data[i] has thrown an exception, so data[i] has not
+    // been constructed.
+
+    // 1. Destroy the data elements that have been constructed successfully.
+    for (dimension_type j = x.reserved_size; j > i; --j)
+      if (indexes[j] != unused_index)
+        data[j].~data_type();
+
+    // 2. Deallocate index[] and data[]
+    delete[] indexes;
+    data_allocator.deallocate(data, reserved_size + 1);
+
+    // 3. Set the tree to an empty tree and rethrow exception.
+    init(0);
+    throw;
+  }
+
+  size_ = x.size_;
+  PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::CO_Tree::count_used_in_subtree(tree_iterator itr) {
+  dimension_type n = 0;
+
+  const dimension_type k = itr.get_offset();
+  const dimension_type root_index = itr.dfs_index();
+
+  // The complete subtree rooted at itr has 2*k - 1 nodes.
+
+  PPL_ASSERT(root_index > (k - 1));
+
+  const dimension_type* current_index
+    = &(itr.tree.indexes[root_index - (k - 1)]);
+
+  for (dimension_type j = 2*k - 1; j > 0; --j, ++current_index)
+    if (*current_index != unused_index)
+      ++n;
+
+  return n;
+}
+
+bool
+PPL::CO_Tree::const_iterator::OK() const {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  if (tree == 0) {
+    if (current_index != 0)
+      return false;
+    if (current_data != 0)
+      return false;
+  }
+  else
+    if (tree->reserved_size == 0) {
+      if (current_index != 1 + static_cast<dimension_type*>(0)
+          || current_data != 1 + static_cast<data_type*>(0))
+        return false;
+    }
+    else {
+      if (current_index <= &(tree->indexes[0]))
+        return false;
+      if (current_index > &(tree->indexes[tree->reserved_size + 1]))
+        return false;
+      if (current_data <= &(tree->data[0]))
+        return false;
+      if (current_data > &(tree->data[tree->reserved_size + 1]))
+        return false;
+      if (*current_index == unused_index)
+        return false;
+      if (current_index - tree->indexes != current_data - tree->data)
+        return false;
+    }
+#endif
+  return true;
+}
+
+bool
+PPL::CO_Tree::iterator::OK() const {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  if (tree == 0) {
+    if (current_index != 0)
+      return false;
+    if (current_data != 0)
+      return false;
+  }
+  else
+    if (tree->reserved_size == 0) {
+      if (current_index != 1 + static_cast<dimension_type*>(0)
+          || current_data != 1 + static_cast<data_type*>(0))
+        return false;
+    }
+    else {
+      if (current_index <= &(tree->indexes[0]))
+        return false;
+      if (current_index > &(tree->indexes[tree->reserved_size + 1]))
+        return false;
+      if (current_data <= &(tree->data[0]))
+        return false;
+      if (current_data > &(tree->data[tree->reserved_size + 1]))
+        return false;
+      if (*current_index == unused_index)
+        return false;
+      if (current_index - tree->indexes != current_data - tree->data)
+        return false;
+    }
+#endif
+  return true;
+}
+
+bool
+PPL::CO_Tree::tree_iterator::OK() const {
+  if (i == 0 || i > tree.reserved_size)
+    return false;
+
+  // This assumes two's complement encoding.
+  const dimension_type correct_offset = i & -i;
+
+  if (offset != correct_offset)
+    return false;
+
+  return true;
+}
+
+void
+PPL::CO_Tree::tree_iterator::go_down_searching_key(dimension_type key) {
+  // *this points to a node, so the tree is not empty.
+  PPL_ASSERT(!tree.empty());
+  PPL_ASSERT(key != unused_index);
+  PPL_ASSERT(index() != unused_index);
+  while (!is_leaf()) {
+    if (key == index())
+      break;
+    if (key < index()) {
+      get_left_child();
+      if (index() == unused_index) {
+        get_parent();
+        break;
+      }
+    }
+    else {
+      get_right_child();
+      if (index() == unused_index) {
+        get_parent();
+        break;
+      }
+    }
+  }
+}
diff --git a/src/CO_Tree_defs.hh b/src/CO_Tree_defs.hh
new file mode 100644
index 0000000..223e390
--- /dev/null
+++ b/src/CO_Tree_defs.hh
@@ -0,0 +1,1559 @@
+/* CO_Tree class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_CO_Tree_defs_hh
+#define PPL_CO_Tree_defs_hh 1
+
+#include "CO_Tree_types.hh"
+
+#include "Coefficient_defs.hh"
+#include <memory>
+
+#ifndef PPL_CO_TREE_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+  \brief
+  Enables extra debugging information for class CO_Tree.
+
+  \ingroup PPL_CXX_interface
+  When <CODE>PPL_CO_TREE_EXTRA_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+  each CO_Tree iterator and const_iterator carries a pointer to the associated
+  tree; this enables extra consistency checks to be performed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_CO_TREE_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_CO_TREE_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_CO_TREE_EXTRA_DEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A cache-oblivious binary search tree of pairs.
+/*! \ingroup PPL_CXX_interface
+  This class implements a binary search tree with keys of dimension_type type
+  and data of Coefficient type, laid out in a dynamically-sized array.
+
+  The array-based layout saves calls to new/delete (to insert \f$n\f$ elements
+  only \f$O(\log n)\f$ allocations are performed) and, more importantly, is
+  much more cache-friendly than a standard (pointer-based) tree, because the
+  elements are stored sequentially in memory (leaving some holes to allow
+  fast insertion of new elements).
+  The downside of this representation is that all iterators are invalidated
+  when an element is added or removed, because the array could have been
+  enlarged or shrunk. This is partially addressed by providing references to
+  internal end iterators that are updated when needed.
+
+  B-trees are cache-friendly too, but the cache size is fixed (usually at
+  compile-time). This raises two problems: firstly the cache size must be
+  known in advance and those data structures do not perform well with other
+  cache sizes and, secondly, even if the cache size is known, the
+  optimizations target only one level of cache. This kind of data structures
+  are called cache aware. This implementation, instead, is cache oblivious:
+  it performs well with every cache size, and thus exploits all of the
+  available caches.
+
+  Assuming \p n is the number of elements in the tree and \p B is the number
+  of (dimension_type, Coefficient) pairs that fit in a cache line, the
+  time and cache misses complexities are the following:
+
+  - Insertions/Queries/Deletions: \f$O(\log^2 n)\f$ time,
+                                  \f$O(\log \frac{n}{B}))\f$ cache misses.
+  - Tree traversal from begin() to end(), using an %iterator: \f$O(n)\f$ time,
+         \f$O(\frac{n}{B})\f$  cache misses.
+  - Queries with a hint: \f$O(\log k)\f$ time and \f$O(\log \frac{k}{B})\f$
+    cache misses, where k is the distance between the given %iterator and the
+    searched element (or the position where it would have been).
+
+  The binary search tree is embedded in a (slightly bigger) complete tree,
+  that is enlarged and shrunk when needed. The complete tree is laid out
+  in an in-order DFS layout in two arrays: one for the keys and one for the
+  associated data.
+  The indexes and values are stored in different arrays to reduce
+  cache-misses during key queries.
+
+  The tree can store up to \f$(-(dimension_type)1)/100\f$ elements.
+  This limit allows faster density computations, but can be removed if needed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class CO_Tree {
+
+public:
+  class const_iterator;
+  class iterator;
+
+private:
+  //! This is used for node heights and depths in the tree.
+  typedef unsigned height_t;
+
+  PPL_COMPILE_TIME_CHECK(C_Integer<height_t>::max
+                         >= sizeof_to_bits(sizeof(dimension_type)),
+                         "height_t is too small to store depths.");
+
+  class tree_iterator;
+
+  // This must be declared here, because it is a friend of const_iterator.
+  //! Returns the index of the current element in the DFS layout of the
+  //! complete tree.
+  /*!
+    \return the index of the current element in the DFS layout of the complete
+            tree.
+
+    \param itr the iterator that points to the desired element.
+  */
+  dimension_type dfs_index(const_iterator itr) const;
+
+  // This must be declared here, because it is a friend of iterator.
+  //! Returns the index of the current element in the DFS layout of the
+  //! complete tree.
+  /*!
+    \return the index of the current element in the DFS layout of the complete
+            tree.
+
+    \param itr the iterator that points to the desired element.
+  */
+  dimension_type dfs_index(iterator itr) const;
+
+public:
+
+  //! The type of the data elements associated with keys.
+  /*!
+    If this is changed, occurrences of Coefficient_zero() in the CO_Tree
+    implementation have to be replaced with constants of the correct type.
+  */
+  typedef Coefficient data_type;
+  typedef Coefficient_traits::const_reference data_type_const_reference;
+
+  //! A const %iterator on the tree elements, ordered by key.
+  /*!
+    Iterator increment and decrement operations are \f$O(1)\f$ time.
+    These iterators are invalidated by operations that add or remove elements
+    from the tree.
+  */
+  class const_iterator {
+  private:
+  public:
+
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef const data_type value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef data_type_const_reference reference;
+
+    //! Constructs an invalid const_iterator.
+    /*!
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit const_iterator();
+
+    //! Constructs an %iterator pointing to the first element of the tree.
+    /*!
+      \param tree
+      The tree that the new %iterator will point to.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit const_iterator(const CO_Tree& tree);
+
+    //! Constructs a const_iterator pointing to the i-th node of the tree.
+    /*!
+      \param tree
+      The tree that the new %iterator will point to.
+
+      \param i
+      The index of the element in \p tree to which the %iterator will point
+      to.
+
+      The i-th node must be a node with a value or end().
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const CO_Tree& tree, dimension_type i);
+
+    //! The copy constructor.
+    /*!
+      \param itr
+      The %iterator that will be copied.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const const_iterator& itr);
+
+    //! Converts an iterator into a const_iterator.
+    /*!
+      \param itr
+      The iterator that will be converted into a const_iterator.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const iterator& itr);
+
+    //! Swaps itr with *this.
+    /*!
+      \param itr
+      The %iterator that will be swapped with *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    void m_swap(const_iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator=(const const_iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator=(const iterator& itr);
+
+    //! Navigates to the next element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator++();
+
+    //! Navigates to the previous element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator--();
+
+    //! Navigates to the next element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator operator++(int);
+
+    //! Navigates to the previous element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator operator--(int);
+
+    //! Returns the current element.
+    data_type_const_reference operator*() const;
+
+    //! Returns the index of the element pointed to by \c *this.
+    /*!
+      \returns the index of the element pointed to by \c *this.
+    */
+    dimension_type index() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const const_iterator& x) const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const const_iterator& x) const;
+
+  private:
+    //! Checks the internal invariants, in debug mode only.
+    bool OK() const;
+
+    //! A pointer to the corresponding element of the tree's indexes[] array.
+    const dimension_type* current_index;
+
+    //! A pointer to the corresponding element of the tree's data[] array.
+    const data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+    //! A pointer to the corresponding tree, used for debug purposes only.
+    const CO_Tree* tree;
+#endif
+
+    friend dimension_type CO_Tree::dfs_index(const_iterator itr) const;
+  };
+
+  //! An %iterator on the tree elements, ordered by key.
+  /*!
+    Iterator increment and decrement operations are \f$O(1)\f$ time.
+    These iterators are invalidated by operations that add or remove elements
+    from the tree.
+  */
+  class iterator {
+  public:
+
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef data_type value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef value_type& reference;
+
+    //! Constructs an invalid iterator.
+    /*!
+      This constructor takes \f$O(1)\f$ time.
+    */
+    iterator();
+
+    //! Constructs an %iterator pointing to first element of the tree.
+    /*!
+      \param tree
+      The tree to which the new %iterator will point to.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit iterator(CO_Tree& tree);
+
+    //! Constructs an %iterator pointing to the i-th node.
+    /*!
+      \param tree
+      The tree to which the new %iterator will point to.
+
+      \param i
+      The index of the element in \p tree to which the new %iterator will
+      point to.
+
+      The i-th node must be a node with a value or end().
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    iterator(CO_Tree& tree, dimension_type i);
+
+    //! The constructor from a tree_iterator.
+    /*!
+      \param itr
+      The tree_iterator that will be converted into an iterator.
+
+      This is meant for use by CO_Tree only.
+      This is not private to avoid the friend declaration.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit iterator(const tree_iterator& itr);
+
+    //! The copy constructor.
+    /*!
+      \param itr
+      The %iterator that will be copied.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    iterator(const iterator& itr);
+
+    //! Swaps itr with *this.
+    /*!
+      \param itr
+      The %iterator that will be swapped with *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    void m_swap(iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator=(const iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator=(const tree_iterator& itr);
+
+    //! Navigates to the next element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator++();
+
+    //! Navigates to the previous element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator--();
+
+    //! Navigates to the next element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator operator++(int);
+
+    //! Navigates to the previous element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator operator--(int);
+
+    //! Returns the current element.
+    data_type& operator*();
+
+    //! Returns the current element.
+    data_type_const_reference operator*() const;
+
+    //! Returns the index of the element pointed to by \c *this.
+    /*!
+      \returns the index of the element pointed to by \c *this.
+    */
+    dimension_type index() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const iterator& x) const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const iterator& x) const;
+
+  private:
+    //! Checks the internal invariants, in debug mode only.
+    bool OK() const;
+
+    //! A pointer to the corresponding element of the tree's indexes[] array.
+    const dimension_type* current_index;
+
+    //! A pointer to the corresponding element of the tree's data[] array.
+    data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+    //! A pointer to the corresponding tree, used for debug purposes only.
+    CO_Tree* tree;
+#endif
+
+    friend const_iterator& const_iterator::operator=(const iterator&);
+    friend dimension_type CO_Tree::dfs_index(iterator itr) const;
+  };
+
+  //! Constructs an empty tree.
+  /*!
+    This constructor takes \f$O(1)\f$ time.
+  */
+  CO_Tree();
+
+  //! The copy constructor.
+  /*!
+    \param y
+    The tree that will be copied.
+
+    This constructor takes \f$O(n)\f$ time.
+  */
+  CO_Tree(const CO_Tree& y);
+
+  //! A constructor from a sequence of \p n elements.
+  /*!
+    \param i
+    An iterator that points to the first element of the sequence.
+
+    \param n
+    The number of elements in the [i, i_end) sequence.
+
+    i must be an input iterator on a sequence of data_type elements,
+    sorted by index.
+    Objects of Iterator type must have an index() method that returns the
+    index with which the element pointed to by the iterator must be inserted.
+
+    This constructor takes \f$O(n)\f$ time, so it is more efficient than
+    the construction of an empty tree followed by n insertions, that would
+    take \f$O(n*\log^2 n)\f$ time.
+  */
+  template <typename Iterator>
+  CO_Tree(Iterator i, dimension_type n);
+
+  //! The assignment operator.
+  /*!
+    \param y
+    The tree that will be assigned to *this.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  CO_Tree& operator=(const CO_Tree& y);
+
+  //! Removes all elements from the tree.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  void clear();
+
+  //! The destructor.
+  /*!
+    This destructor takes \f$O(n)\f$ time.
+  */
+  ~CO_Tree();
+
+  //! Returns \p true if the tree has no elements.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool empty() const;
+
+  //! Returns the number of elements stored in the tree.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type size() const;
+
+  //! Returns the size() of the largest possible CO_Tree.
+  static dimension_type max_size();
+
+  //! Dumps the tree to stdout, for debugging purposes.
+  void dump_tree() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  dimension_type external_memory_in_bytes() const;
+
+  //! Inserts an element in the tree.
+  /*!
+    \returns
+    An %iterator that points to the inserted pair.
+
+    \param key
+    The key that will be inserted into the tree, associated with the default
+    data.
+
+    If such a pair already exists, an %iterator pointing to that pair is
+    returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator insert(dimension_type key);
+
+  //! Inserts an element in the tree.
+  /*!
+    \returns
+    An %iterator that points to the inserted element.
+
+    \param key
+    The key that will be inserted into the tree..
+
+    \param data
+    The data that will be inserted into the tree.
+
+    If an element with the specified key already exists, its associated data
+    is set to \p data and an %iterator pointing to that pair is returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.amortized
+  */
+  iterator insert(dimension_type key, data_type_const_reference data);
+
+  //! Inserts an element in the tree.
+  /*!
+    \return
+    An %iterator that points to the inserted element.
+
+    \param itr
+    The %iterator used as hint
+
+    \param key
+    The key that will be inserted into the tree, associated with the default
+    data.
+
+    This will be faster if \p itr points near to the place where the new
+    element will be inserted (or where is already stored).
+    However, the value of \p itr does not affect the result of this
+    method, as long it is a valid %iterator for this tree. \p itr may even be
+    end().
+
+    If an element with the specified key already exists, an %iterator pointing
+    to that pair is returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator insert(iterator itr, dimension_type key);
+
+  //! Inserts an element in the tree.
+  /*!
+    \return
+    An iterator that points to the inserted element.
+
+    \param itr
+    The iterator used as hint
+
+    \param key
+    The key that will be inserted into the tree.
+
+    \param data
+    The data that will be inserted into the tree.
+
+    This will be faster if \p itr points near to the place where the new
+    element will be inserted (or where is already stored).
+    However, the value of \p itr does not affect the result of this
+    method, as long it is a valid iterator for this tree. \p itr may even be
+    end().
+
+    If an element with the specified key already exists, its associated data
+    is set to \p data and an iterator pointing to that pair is returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists,
+    and \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator insert(iterator itr, dimension_type key,
+                  data_type_const_reference data);
+
+  //! Erases the element with key \p key from the tree.
+  /*!
+    This operation invalidates existing iterators.
+
+    \returns an iterator to the next element (or end() if there are no
+             elements with key greater than \p key ).
+
+    \param key
+    The key of the element that will be erased from the tree.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists,
+    and \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator erase(dimension_type key);
+
+  //! Erases the element pointed to by \p itr from the tree.
+  /*!
+    This operation invalidates existing iterators.
+
+    \returns an iterator to the next element (or end() if there are no
+             elements with key greater than \p key ).
+
+    \param itr
+    An iterator pointing to the element that will be erased from the tree.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator erase(iterator itr);
+
+  /*!
+    \brief Removes the element with key \p key (if it exists) and decrements
+           by 1 all elements' keys that were greater than \p key.
+
+    \param key
+    The key of the element that will be erased from the tree.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k+\log^2 n)\f$ expected time, where k is the number
+    of elements with keys greater than \p key.
+  */
+  void erase_element_and_shift_left(dimension_type key);
+
+  //! Adds \p n to all keys greater than or equal to \p key.
+  /*!
+    \param key
+    The key of the first element whose key will be increased.
+
+    \param n
+    Specifies how much the keys will be increased.
+
+    This method takes \f$O(k+\log n)\f$ expected time, where k is the number
+    of elements with keys greater than or equal to \p key.
+  */
+  void increase_keys_from(dimension_type key, dimension_type n);
+
+  //! Sets to \p i the key of *itr. Assumes that i<=itr.index() and that there
+  //! are no elements with keys in [i,itr.index()).
+  /*!
+    All existing iterators remain valid.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void fast_shift(dimension_type i, iterator itr);
+
+  //! Swaps x with *this.
+  /*!
+    \param x
+    The tree that will be swapped with *this.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void m_swap(CO_Tree& x);
+
+  //! Returns an iterator that points at the first element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator begin();
+
+  //! Returns an iterator that points after the last element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is updated at each operation that modifies the structure.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const iterator& end();
+
+  //! Equivalent to cbegin().
+  const_iterator begin() const;
+
+  //! Equivalent to cend().
+  const const_iterator& end() const;
+
+  //! Returns a const_iterator that points at the first element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator cbegin() const;
+
+  //! Returns a const_iterator that points after the last element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is updated at each operation that modifies the structure.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const const_iterator& cend() const;
+
+  //! Searches an element with key \p key using bisection.
+  /*!
+    \param key
+    The key that will be searched for.
+
+    If the element is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  iterator bisect(dimension_type key);
+
+  //! Searches an element with key \p key using bisection.
+  /*!
+    \param key
+    The key that will be searched for.
+
+    If the element is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  const_iterator bisect(dimension_type key) const;
+
+  //! Searches an element with key \p key in [first, last] using bisection.
+  /*!
+    \param first
+    An %iterator pointing to the first element in the range.
+    It must not be end().
+
+    \param last
+    An %iterator pointing to the last element in the range.
+    Note that this is included in the search.
+    It must not be end().
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the specified key is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log(last - first + 1))\f$ time.
+  */
+  iterator bisect_in(iterator first, iterator last, dimension_type key);
+
+  //! Searches an element with key \p key in [first, last] using bisection.
+  /*!
+    \param first
+    An %iterator pointing to the first element in the range.
+    It must not be end().
+
+    \param last
+    An %iterator pointing to the last element in the range.
+    Note that this is included in the search.
+    It must not be end().
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the specified key is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log(last - first + 1))\f$ time.
+  */
+  const_iterator bisect_in(const_iterator first, const_iterator last,
+                           dimension_type key) const;
+
+  //! Searches an element with key \p key near \p hint.
+  /*!
+    \param hint
+    An %iterator used as a hint.
+
+    \param key
+    The key that will be searched for.
+
+    If the element is found, the returned %iterator points to that element;
+    otherwise, it points to the immediately preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this tree. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time. If the distance between the
+    returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+  */
+  iterator bisect_near(iterator hint, dimension_type key);
+
+  //! Searches an element with key \p key near \p hint.
+  /*!
+    \param hint
+    An %iterator used as a hint.
+
+    \param key
+    The key that will be searched for.
+
+    If the element is found, the returned %iterator points to that element;
+    otherwise, it points to the immediately preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this tree. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time. If the distance between the
+    returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+  */
+  const_iterator bisect_near(const_iterator hint, dimension_type key) const;
+
+private:
+
+  //! Searches an element with key \p key in [first, last] using bisection.
+  /*!
+    \param first
+    The index of the first element in the range.
+    It must be the index of an element with a value.
+
+    \param last
+    The index of the last element in the range.
+    It must be the index of an element with a value.
+    Note that this is included in the search.
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the element is found, the index of that element is returned; otherwise,
+    the returned index refers to the immediately preceding or succeeding
+    value.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  dimension_type bisect_in(dimension_type first, dimension_type last,
+                           dimension_type key) const;
+
+  //! Searches an element with key \p key near \p hint.
+  /*!
+    \param hint
+    An index used as a hint.
+    It must be the index of an element with a value.
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the element is found, the index of that element is returned; otherwise,
+    the returned index refers to the immediately preceding or succeeding
+    value.
+
+    This uses a binary progression and then a bisection, so this method is
+    \f$O(\log n)\f$, and it is \f$O(1)\f$ if the distance between the returned
+    position and \p hint is \f$O(1)\f$.
+
+    This method takes \f$O(\log n)\f$ time. If the distance between the
+    returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+  */
+  dimension_type bisect_near(dimension_type hint, dimension_type key) const;
+
+  //! Inserts an element in the tree.
+  /*!
+    If there is already an element with key \p key in the tree, its
+    associated data is set to \p data.
+
+    This operation invalidates existing iterators.
+
+    \return
+    An %iterator that points to the inserted element.
+
+    \param key
+    The key that will be inserted into the tree.
+
+    \param data
+    The data that will be associated with \p key.
+
+    \param itr
+    It must point to the element in the tree with key \p key or, if no such
+    element exists, it must point to the node that would be his parent.
+
+    This method takes \f$O(1)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  tree_iterator insert_precise(dimension_type key,
+                               data_type_const_reference data,
+                               tree_iterator itr);
+
+  //! Helper for \c insert_precise.
+  /*!
+    This helper method takes the same arguments as \c insert_precise,
+    but besides assuming that \p itr is a correct hint, it also assumes
+    that \p key and \p data are not in the tree; namely, a proper
+    insertion has to be done and the insertion can not invalidate \p data.
+  */
+  tree_iterator insert_precise_aux(dimension_type key,
+                                   data_type_const_reference data,
+                                   tree_iterator itr);
+
+  //! Inserts an element in the tree.
+  /*!
+
+    \param key
+    The key that will be inserted into the tree.
+
+    \param data
+    The data that will be associated with \p key.
+
+    The tree must be empty.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void insert_in_empty_tree(dimension_type key,
+                            data_type_const_reference data);
+
+  //! Erases from the tree the element pointed to by \p itr .
+  /*!
+    This operation invalidates existing iterators.
+
+    \returns
+    An %iterator to the next element (or end() if there are no elements with
+    key greater than \p key ).
+
+    \param itr
+    An %iterator pointing to the element that will be erased.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator erase(tree_iterator itr);
+
+  //! Initializes a tree with reserved size at least \p n .
+  /*!
+    \param n
+    A lower bound on the tree's desired reserved size.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void init(dimension_type n);
+
+  //! Deallocates the tree's dynamic arrays.
+  /*!
+    After this call, the tree fields are uninitialized, so init() must be
+    called again before using the tree.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void destroy();
+
+  //! Checks the internal invariants, but not the densities.
+  bool structure_OK() const;
+
+  //! Checks the internal invariants.
+  bool OK() const;
+
+  //! Returns the floor of the base-2 logarithm of \p n .
+  /*!
+    \param n
+    It must be greater than zero.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  static unsigned integer_log2(dimension_type n);
+
+  //! Compares the fractions numer/denom with ratio/100.
+  /*!
+    \returns Returns true if the fraction numer/denom is less
+    than the fraction ratio/100.
+
+    \param ratio
+    It must be less than or equal to 100.
+
+    \param numer
+    The numerator of the fraction.
+
+    \param denom
+    The denominator of the fraction.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  static bool is_less_than_ratio(dimension_type numer, dimension_type denom,
+                                 dimension_type ratio);
+
+  //! Compares the fractions numer/denom with ratio/100.
+  /*!
+    \returns
+    Returns true if the fraction numer/denom is greater than the fraction
+    ratio/100.
+
+    \param ratio
+    It must be less than or equal to 100.
+
+    \param numer
+    The numerator of the fraction.
+
+    \param denom
+    The denominator of the fraction.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  static bool is_greater_than_ratio(dimension_type numer, dimension_type denom,
+                                    dimension_type ratio);
+
+  //! Dumps the subtree rooted at \p itr to stdout, for debugging purposes.
+  /*!
+    \param itr
+    A tree_iterator pointing to the root of the desired subtree.
+  */
+  static void dump_subtree(tree_iterator itr);
+
+  //! Increases the tree's reserved size.
+  /*!
+    This is called when the density is about to exceed the maximum density
+    (specified by max_density_percent).
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void rebuild_bigger_tree();
+
+  //! Decreases the tree's reserved size.
+  /*!
+    This is called when the density is about to become less than the minimum
+    allowed density (specified by min_density_percent).
+
+    \p reserved_size must be greater than 3 (otherwise the tree can just be
+    cleared).
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void rebuild_smaller_tree();
+
+  //! Re-initializes the cached iterators.
+  /*!
+    This method must be called when the indexes[] and data[] vector are
+    reallocated.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void refresh_cached_iterators();
+
+  //! Rebalances the tree.
+  /*!
+    For insertions, it adds the pair (key, value) in the process.
+
+    This operation invalidates existing iterators that point to nodes in the
+    rebalanced subtree.
+
+    \returns an %iterator pointing to the root of the subtree that was
+             rebalanced.
+
+    \param itr
+    It points to the node where the new element has to be inserted or where an
+    element has just been deleted.
+
+    \param key
+    The index that will be inserted in the tree (for insertions only).
+
+    \param value
+    The value that will be inserted in the tree (for insertions only).
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  tree_iterator rebalance(tree_iterator itr, dimension_type key,
+                          data_type_const_reference value);
+
+  //! Moves all elements of a subtree to the rightmost end.
+  /*!
+    \returns
+    The index of the rightmost unused node in the subtree after the process.
+
+    \param last_in_subtree
+    It is the index of the last element in the subtree.
+
+    \param subtree_size
+    It is the number of valid elements in the subtree.
+    It must be greater than zero.
+
+    \param key
+    The key that may be added to the tree if add_element is \c true.
+
+    \param value
+    The value that may be added to the tree if add_element is \c true.
+
+    \param add_element
+    If it is true, it tries to add an element with key \p key and value
+    \p value in the process (but it may not).
+
+    This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+  */
+  dimension_type compact_elements_in_the_rightmost_end(
+    dimension_type last_in_subtree, dimension_type subtree_size,
+    dimension_type key, data_type_const_reference value,
+    bool add_element);
+
+  //! Redistributes the elements in the subtree rooted at \p root_index.
+  /*!
+    The subtree's elements must be compacted to the rightmost end.
+
+    \param root_index
+    The index of the subtree's root node.
+
+    \param subtree_size
+    It is the number of used elements in the subtree.
+    It must be greater than zero.
+
+    \param last_used
+    It points to the leftmost element with a value in the subtree.
+
+    \param add_element
+    If it is true, this method adds an element with the specified key and
+    value in the process.
+
+    \param key
+    The key that will be added to the tree if \p add_element is \c true.
+
+    \param value
+    The data that will be added to the tree if \p add_element is \c true.
+
+    This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+  */
+  void redistribute_elements_in_subtree(dimension_type root_index,
+                                        dimension_type subtree_size,
+                                        dimension_type last_used,
+                                        dimension_type key,
+                                        data_type_const_reference value,
+                                        bool add_element);
+
+  //! Moves all data in the tree \p tree into *this.
+  /*!
+    \param tree
+    The tree from which the element will be moved into *this.
+
+    *this must be empty and big enough to contain all of tree's data without
+    exceeding max_density.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void move_data_from(CO_Tree& tree);
+
+  //! Copies all data in the tree \p tree into *this.
+  /*!
+    \param tree
+    The tree from which the element will be copied into *this.
+
+    *this must be empty and must have the same reserved size of \p tree.
+    this->OK() may return false before this method is called, but
+    this->structure_OK() must return true.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void copy_data_from(const CO_Tree& tree);
+
+  //! Counts the number of used elements in the subtree rooted at itr.
+  /*!
+    \param itr
+    An %iterator pointing to the root of the desired subtree.
+
+    This method takes \f$O(k)\f$ time, where k is the number of elements in
+    the subtree.
+  */
+  static dimension_type count_used_in_subtree(tree_iterator itr);
+
+  //! Moves the value of \p from in \p to .
+  /*!
+    \param from
+    It must be a valid value.
+
+    \param to
+    It must be a non-constructed chunk of memory.
+
+    After the move, \p from becomes a non-constructed chunk of memory and
+    \p to gets the value previously stored by \p from.
+
+    The implementation of this method assumes that data_type values do not
+    keep pointers to themselves nor to their fields.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  static void move_data_element(data_type& to, data_type& from);
+
+  //! The maximum density of used nodes.
+  /*!
+    This must be greater than or equal to 50 and lower than 100.
+  */
+  static const dimension_type max_density_percent = 91;
+
+  //! The minimum density of used nodes.
+  /*!
+    Must be strictly lower than the half of max_density_percent.
+  */
+  static const dimension_type min_density_percent = 38;
+
+  //! The minimum density at the leaves' depth.
+  /*!
+    Must be greater than zero and strictly lower than min_density_percent.
+
+    Increasing the value is safe but leads to time inefficiencies
+    (measured against ppl_lpsol on 24 August 2010), because it forces trees to
+    be more balanced, increasing the cost of rebalancing.
+  */
+  static const dimension_type min_leaf_density_percent = 1;
+
+  //! An index used as a marker for unused nodes in the tree.
+  /*!
+    This must not be used as a key.
+  */
+  static const dimension_type unused_index = C_Integer<dimension_type>::max;
+
+  //! The %iterator returned by end().
+  /*!
+    It is updated when needed, to keep it valid.
+  */
+  iterator cached_end;
+
+  //! The %iterator returned by the const version of end().
+  /*!
+    It is updated when needed, to keep it valid.
+  */
+  const_iterator cached_const_end;
+
+  //! The depth of the leaves in the complete tree.
+  height_t max_depth;
+
+  //! The vector that contains the keys in the tree.
+  /*!
+    If an element of this vector is \p unused_index , it means that that
+    element and the corresponding element of data[] are not used.
+
+    Its size is reserved_size + 2, because the first and the last elements
+    are used as markers for iterators.
+  */
+  dimension_type* indexes;
+
+  //! The allocator used to allocate/deallocate data.
+  std::allocator<data_type> data_allocator;
+
+  //! The vector that contains the data of the keys in the tree.
+  /*!
+    If index[i] is \p unused_index, data[i] is unused.
+    Otherwise, data[i] contains the data associated to the indexes[i] key.
+
+    Its size is reserved_size + 1, because the first element is not used (to
+    allow using the same index in both indexes[] and data[] instead of
+    adding 1 to access data[]).
+  */
+  data_type* data;
+
+  //! The number of nodes in the complete tree.
+  /*!
+    It is one less than a power of 2.
+    If this is 0, data and indexes are set to NULL.
+  */
+  dimension_type reserved_size;
+
+  //! The number of values stored in the tree.
+  dimension_type size_;
+};
+
+class CO_Tree::tree_iterator {
+
+public:
+
+  /*!
+    \brief Constructs a tree_iterator pointing at the root node of the
+           specified tree
+
+    \param tree
+    The tree to which the new %iterator will point to.
+    It must not be empty.
+  */
+  explicit tree_iterator(CO_Tree& tree);
+
+  //! Constructs a tree_iterator pointing at the specified node of the tree.
+  /*!
+    \param tree
+    The tree to which the new %iterator will point to.
+    It must not be empty.
+
+    \param i
+    The index of the element in \p tree to which the new %iterator will point
+    to.
+  */
+  tree_iterator(CO_Tree& tree, dimension_type i);
+
+  //! Constructs a tree_iterator from an iterator.
+  /*!
+    \param itr
+    The iterator that will be converted into a tree_iterator.
+    It must not be end().
+
+    \param tree
+    The tree to which the new %iterator will point to.
+    It must not be empty.
+  */
+  tree_iterator(const iterator& itr, CO_Tree& tree);
+
+  //! The assignment operator.
+  /*!
+    \param itr
+    The %iterator that will be assigned into *this.
+  */
+  tree_iterator& operator=(const tree_iterator& itr);
+
+  //! The assignment operator from an iterator.
+  /*!
+    \param itr
+    The iterator that will be assigned into *this.
+  */
+  tree_iterator& operator=(const iterator& itr);
+
+  //! Compares *this with \p itr.
+  /*!
+    \param itr
+    The %iterator that will compared with *this.
+  */
+  bool operator==(const tree_iterator& itr) const;
+
+  //! Compares *this with \p itr.
+  /*!
+    \param itr
+    The %iterator that will compared with *this.
+  */
+  bool operator!=(const tree_iterator& itr) const;
+
+  //! Makes the %iterator point to the root of \p tree.
+  /*!
+    The values of all fields (beside tree) are overwritten.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_root();
+
+  //! Makes the %iterator point to the left child of the current node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_left_child();
+
+  //! Makes the %iterator point to the right child of the current node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_right_child();
+
+  //! Makes the %iterator point to the parent of the current node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_parent();
+
+  /*!
+    \brief Searches for an element with key \p key in the subtree rooted at
+           \p *this.
+
+    \param key
+    The searched for key.
+
+    After this method, *this points to the found node (if it exists) or to
+    the node that would be his parent (otherwise).
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  void go_down_searching_key(dimension_type key);
+
+  /*!
+    \brief Follows left children with a value, until it arrives at a leaf or at
+           a node with no value.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void follow_left_children_with_value();
+
+  /*!
+    \brief Follows right children with a value, until it arrives at a leaf or at
+           a node with no value.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void follow_right_children_with_value();
+
+  //! Returns true if the pointed node is the root node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool is_root() const;
+
+  //! Returns true if the pointed node has a parent and is its right child.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool is_right_child() const;
+
+  //! Returns true if the pointed node is a leaf of the complete tree.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool is_leaf() const;
+
+  //! Returns the key and value of the current node.
+  data_type& operator*();
+
+  //! Returns the key and value of the current node.
+  Coefficient_traits::const_reference operator*() const;
+
+  //! Returns a reference to the index of the element pointed to by \c *this.
+  /*!
+    \returns a reference to the index of the element pointed to by \c *this.
+  */
+  dimension_type& index();
+
+  //! Returns the index of the element pointed to by \c *this.
+  /*!
+    \returns the index of the element pointed to by \c *this.
+  */
+  dimension_type index() const;
+
+  //! Returns the index of the node pointed to by \c *this.
+  /*!
+    \returns the key of the node pointed to by \c *this, or unused_index if
+             the current node does not contain a valid element.
+  */
+  dimension_type key() const;
+
+  //! The tree containing the element pointed to by this %iterator.
+  CO_Tree& tree;
+
+  /*!
+    \brief Returns the index of the current node in the DFS layout of the
+           complete tree.
+  */
+  dimension_type dfs_index() const;
+
+  /*!
+    \brief Returns 2^h, with h the height of the current node in the tree,
+           counting from 0.
+
+    Thus leaves have offset 1.
+    This is faster than depth(), so it is useful to compare node depths.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type get_offset() const;
+
+  //! Returns the depth of the current node in the complete tree.
+  /*!
+    This method takes \f$O(\log n)\f$ time.
+  */
+  height_t depth() const;
+
+private:
+  //! Checks the internal invariant.
+  bool OK() const;
+
+  //! The index of the current node in the DFS layout of the complete tree.
+  dimension_type i;
+
+  /*!
+    \brief This is 2^h, with h the height of the current node in the tree,
+           counting from 0.
+
+    Thus leaves have offset 1.
+    This is equal to (i & -i), and is only stored to increase performance.
+  */
+  dimension_type offset;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree& x, CO_Tree& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::const_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::iterator& x, CO_Tree::iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "CO_Tree_inlines.hh"
+#include "CO_Tree_templates.hh"
+
+#endif // !defined(PPL_CO_Tree_defs_hh)
diff --git a/src/CO_Tree_inlines.hh b/src/CO_Tree_inlines.hh
new file mode 100644
index 0000000..64bde57
--- /dev/null
+++ b/src/CO_Tree_inlines.hh
@@ -0,0 +1,868 @@
+/* CO_Tree class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_CO_Tree_inlines_hh
+#define PPL_CO_Tree_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+CO_Tree::dfs_index(const_iterator itr) const {
+  PPL_ASSERT(itr.current_index != 0);
+  PPL_ASSERT(itr.current_index >= indexes + 1);
+  PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+  const ptrdiff_t index = itr.current_index - indexes;
+  return static_cast<dimension_type>(index);
+}
+
+inline dimension_type
+CO_Tree::dfs_index(iterator itr) const {
+  PPL_ASSERT(itr.current_index != 0);
+  PPL_ASSERT(itr.current_index >= indexes + 1);
+  PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+  const ptrdiff_t index = itr.current_index - indexes;
+  return static_cast<dimension_type>(index);
+}
+
+inline
+CO_Tree::CO_Tree() {
+  init(0);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::CO_Tree(const CO_Tree& y) {
+  PPL_ASSERT(y.OK());
+  data_allocator = y.data_allocator;
+  init(y.reserved_size);
+  copy_data_from(y);
+}
+
+inline CO_Tree&
+CO_Tree::operator=(const CO_Tree& y) {
+  if (this != &y) {
+    destroy();
+    data_allocator = y.data_allocator;
+    init(y.reserved_size);
+    copy_data_from(y);
+  }
+  return *this;
+}
+
+inline void
+CO_Tree::clear() {
+  *this = CO_Tree();
+}
+
+inline
+CO_Tree::~CO_Tree() {
+
+  destroy();
+}
+
+inline bool
+CO_Tree::empty() const {
+  return size_ == 0;
+}
+
+inline dimension_type
+CO_Tree::size() const {
+  return size_;
+}
+
+inline dimension_type
+CO_Tree::max_size() {
+  return C_Integer<dimension_type>::max/100;
+}
+
+inline void
+CO_Tree::dump_tree() const {
+  if (empty())
+    std::cout << "(empty tree)" << std::endl;
+  else
+    dump_subtree(tree_iterator(*const_cast<CO_Tree*>(this)));
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(const dimension_type key) {
+  if (empty())
+    return insert(key, Coefficient_zero());
+  else {
+    tree_iterator itr(*this);
+    itr.go_down_searching_key(key);
+    if (itr.index() == key)
+      return iterator(itr);
+    else
+      return iterator(insert_precise(key, Coefficient_zero(), itr));
+  }
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(dimension_type key, data_type_const_reference data1) {
+  if (empty()) {
+    insert_in_empty_tree(key, data1);
+    tree_iterator itr(*this);
+    PPL_ASSERT(itr.index() != unused_index);
+    return iterator(itr);
+  }
+  else {
+    tree_iterator itr(*this);
+    itr.go_down_searching_key(key);
+    return iterator(insert_precise(key, data1, itr));
+  }
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(dimension_type key) {
+  PPL_ASSERT(key != unused_index);
+
+  if (empty())
+    return end();
+
+  tree_iterator itr(*this);
+  itr.go_down_searching_key(key);
+
+  if (itr.index() == key)
+    return erase(itr);
+
+  iterator result(itr);
+  if (result.index() < key)
+    ++result;
+
+  PPL_ASSERT(result == end() || result.index() > key);
+#ifndef NDEBUG
+  iterator last = end();
+  --last;
+  PPL_ASSERT((result == end()) == (last.index() < key));
+#endif
+
+  return result;
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(iterator itr) {
+  PPL_ASSERT(itr != end());
+  return erase(tree_iterator(itr, *this));
+}
+
+inline void
+CO_Tree::m_swap(CO_Tree& x) {
+  using std::swap;
+  swap(max_depth, x.max_depth);
+  swap(indexes, x.indexes);
+  swap(data_allocator, x.data_allocator);
+  swap(data, x.data);
+  swap(reserved_size, x.reserved_size);
+  swap(size_, x.size_);
+  // Cached iterators have been invalidated by the swap,
+  // they must be refreshed here.
+  refresh_cached_iterators();
+  x.refresh_cached_iterators();
+  PPL_ASSERT(structure_OK());
+  PPL_ASSERT(x.structure_OK());
+}
+
+inline CO_Tree::iterator
+CO_Tree::begin() {
+  return iterator(*this);
+}
+
+inline const CO_Tree::iterator&
+CO_Tree::end() {
+  return cached_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::begin() const {
+  return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::end() const {
+  return cached_const_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::cbegin() const {
+  return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::cend() const {
+  return cached_const_end;
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect(dimension_type key) {
+  if (empty())
+    return end();
+  iterator last = end();
+  --last;
+  return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect(dimension_type key) const {
+  if (empty())
+    return end();
+  const_iterator last = end();
+  --last;
+  return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_in(iterator first, iterator last, dimension_type key) {
+  PPL_ASSERT(first != end());
+  PPL_ASSERT(last != end());
+  const dimension_type index
+    = bisect_in(dfs_index(first), dfs_index(last), key);
+  return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_in(const_iterator first, const_iterator last,
+                   dimension_type key) const {
+  PPL_ASSERT(first != end());
+  PPL_ASSERT(last != end());
+  const dimension_type index
+    = bisect_in(dfs_index(first), dfs_index(last), key);
+  return const_iterator(*this, index);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_near(iterator hint, dimension_type key) {
+  if (hint == end())
+    return bisect(key);
+  const dimension_type index
+    = bisect_near(dfs_index(hint), key);
+  return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_near(const_iterator hint, dimension_type key) const {
+  if (hint == end())
+    return bisect(key);
+  const dimension_type index = bisect_near(dfs_index(hint), key);
+  return const_iterator(*this, index);
+}
+
+inline void
+CO_Tree::fast_shift(dimension_type i, iterator itr) {
+  PPL_ASSERT(itr != end());
+  PPL_ASSERT(i <= itr.index());
+  indexes[dfs_index(itr)] = i;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::insert_in_empty_tree(dimension_type key,
+                              data_type_const_reference data1) {
+  PPL_ASSERT(empty());
+  rebuild_bigger_tree();
+  tree_iterator itr(*this);
+  PPL_ASSERT(itr.index() == unused_index);
+  new (&(*itr)) data_type(data1);
+  // Set the index afterwards, so that if the constructor above throws
+  // the tree's structure is consistent.
+  itr.index() = key;
+  ++size_;
+
+  PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::is_less_than_ratio(dimension_type numer, dimension_type denom,
+                            dimension_type ratio) {
+  PPL_ASSERT(ratio <= 100);
+  // If these are true, no overflows are possible.
+  PPL_ASSERT(denom <= unused_index/100);
+  PPL_ASSERT(numer <= unused_index/100);
+  return 100*numer < ratio*denom;
+}
+
+inline bool
+CO_Tree::is_greater_than_ratio(dimension_type numer, dimension_type denom,
+                               dimension_type ratio) {
+  PPL_ASSERT(ratio <= 100);
+  // If these are true, no overflows are possible.
+  PPL_ASSERT(denom <= unused_index/100);
+  PPL_ASSERT(numer <= unused_index/100);
+  return 100*numer > ratio*denom;
+}
+
+inline void
+CO_Tree::rebuild_smaller_tree() {
+  PPL_ASSERT(reserved_size > 3);
+  CO_Tree new_tree;
+  new_tree.init(reserved_size / 2);
+  new_tree.move_data_from(*this);
+  m_swap(new_tree);
+  PPL_ASSERT(new_tree.structure_OK());
+  PPL_ASSERT(structure_OK());
+}
+
+inline void
+CO_Tree::refresh_cached_iterators() {
+  cached_end = iterator(*this, reserved_size + 1);
+  cached_const_end = const_iterator(*this, reserved_size + 1);
+}
+
+inline void
+CO_Tree::move_data_element(data_type& to, data_type& from) {
+  // The following code is equivalent (but slower):
+  //
+  // <CODE>
+  //   new (&to) data_type(from);
+  //   from.~data_type();
+  // </CODE>
+  std::memcpy(&to, &from, sizeof(data_type));
+}
+
+
+inline
+CO_Tree::const_iterator::const_iterator()
+  : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = 0;
+#endif
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1)
+  : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  if (!tree1.empty())
+    while (*current_index == unused_index) {
+      ++current_index;
+      ++current_data;
+    }
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1,
+                                        dimension_type i)
+  : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  PPL_ASSERT(i != 0);
+  PPL_ASSERT(i <= tree1.reserved_size + 1);
+  PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const const_iterator& itr2) {
+  (*this) = itr2;
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const iterator& itr2) {
+  (*this) = itr2;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::const_iterator::m_swap(const_iterator& itr) {
+  using std::swap;
+  swap(current_data, itr.current_data);
+  swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  swap(tree, itr.tree);
+#endif
+  PPL_ASSERT(OK());
+  PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const const_iterator& itr2) {
+  current_index = itr2.current_index;
+  current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = itr2.tree;
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const iterator& itr2) {
+  current_index = itr2.current_index;
+  current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = itr2.tree;
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator++() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  ++current_index;
+  ++current_data;
+  while (*current_index == unused_index) {
+    ++current_index;
+    ++current_data;
+  }
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator--() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  --current_index;
+  --current_data;
+  while (*current_index == unused_index) {
+    --current_index;
+    --current_data;
+  }
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator++(int) {
+  const_iterator itr(*this);
+  ++(*this);
+  return itr;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator--(int) {
+  const_iterator itr(*this);
+  --(*this);
+  return itr;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::const_iterator::operator*() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_data;
+}
+
+inline dimension_type
+CO_Tree::const_iterator::index() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_index;
+}
+
+inline bool
+CO_Tree::const_iterator::operator==(const const_iterator& x) const {
+  PPL_ASSERT((current_index == x.current_index)
+             == (current_data == x.current_data));
+  PPL_ASSERT(OK());
+  return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::const_iterator::operator!=(const const_iterator& x) const {
+  return !(*this == x);
+}
+
+
+inline
+CO_Tree::iterator::iterator()
+  : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = 0;
+#endif
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1)
+  : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  if (!tree1.empty())
+    while (*current_index == unused_index) {
+      ++current_index;
+      ++current_data;
+    }
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1, dimension_type i)
+  : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  PPL_ASSERT(i != 0);
+  PPL_ASSERT(i <= tree1.reserved_size + 1);
+  PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const tree_iterator& itr) {
+  *this = itr;
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const iterator& itr2) {
+  (*this) = itr2;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::iterator::m_swap(iterator& itr) {
+  using std::swap;
+  swap(current_data, itr.current_data);
+  swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  swap(tree, itr.tree);
+#endif
+  PPL_ASSERT(OK());
+  PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const tree_iterator& itr) {
+  current_index = &(itr.tree.indexes[itr.dfs_index()]);
+  current_data = &(itr.tree.data[itr.dfs_index()]);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &(itr.tree);
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const iterator& itr2) {
+  current_index = itr2.current_index;
+  current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = itr2.tree;
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator++() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  ++current_index;
+  ++current_data;
+  while (*current_index == unused_index) {
+    ++current_index;
+    ++current_data;
+  }
+
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator--() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  --current_index;
+  --current_data;
+  while (*current_index == unused_index) {
+    --current_index;
+    --current_data;
+  }
+
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator++(int) {
+  iterator itr(*this);
+  ++(*this);
+  return itr;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator--(int) {
+  iterator itr(*this);
+  --(*this);
+  return itr;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::iterator::operator*() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_data;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::iterator::operator*() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_data;
+}
+
+inline dimension_type
+CO_Tree::iterator::index() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_index;
+}
+
+inline bool
+CO_Tree::iterator::operator==(const iterator& x) const {
+  PPL_ASSERT((current_index == x.current_index)
+             == (current_data == x.current_data));
+  PPL_ASSERT(OK());
+  return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::iterator::operator!=(const iterator& x) const {
+  return !(*this == x);
+}
+
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1)
+  : tree(tree1) {
+  PPL_ASSERT(tree.reserved_size != 0);
+  get_root();
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1, dimension_type i1)
+  : tree(tree1) {
+  PPL_ASSERT(tree.reserved_size != 0);
+  PPL_ASSERT(i1 <= tree.reserved_size + 1);
+  i = i1;
+  offset = least_significant_one_mask(i);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(const iterator& itr, CO_Tree& tree1)
+  : tree(tree1) {
+  PPL_ASSERT(tree.reserved_size != 0);
+  *this = itr;
+  PPL_ASSERT(OK());
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const tree_iterator& itr) {
+  PPL_ASSERT(&tree == &(itr.tree));
+  i = itr.i;
+  offset = itr.offset;
+  return *this;
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const iterator& itr) {
+  PPL_ASSERT(itr != tree.end());
+  i = tree.dfs_index(itr);
+  offset = least_significant_one_mask(i);
+  return *this;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator==(const tree_iterator& itr) const {
+  return i == itr.i;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator!=(const tree_iterator& itr) const {
+  return !(*this == itr);
+}
+
+inline void
+CO_Tree::tree_iterator::get_root() {
+  i = tree.reserved_size / 2 + 1;
+  offset = i;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_left_child() {
+  PPL_ASSERT(offset != 0);
+  PPL_ASSERT(offset != 1);
+  offset /= 2;
+  i -= offset;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_right_child() {
+  PPL_ASSERT(offset != 0);
+  PPL_ASSERT(offset != 1);
+  offset /= 2;
+  i += offset;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_parent() {
+  PPL_ASSERT(!is_root());
+  PPL_ASSERT(offset != 0);
+  i &= ~offset;
+  offset *= 2;
+  i |= offset;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_left_children_with_value() {
+  PPL_ASSERT(index() != unused_index);
+  const dimension_type* p = tree.indexes;
+  p += i;
+  p -= (offset - 1);
+  while (*p == unused_index)
+    ++p;
+  const ptrdiff_t distance = p - tree.indexes;
+  PPL_ASSERT(distance >= 0);
+  i = static_cast<dimension_type>(distance);
+  offset = least_significant_one_mask(i);
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_right_children_with_value() {
+  PPL_ASSERT(index() != unused_index);
+  const dimension_type* p = tree.indexes;
+  p += i;
+  p += (offset - 1);
+  while (*p == unused_index)
+    --p;
+  const ptrdiff_t distance = p - tree.indexes;
+  PPL_ASSERT(distance >= 0);
+  i = static_cast<dimension_type>(distance);
+  offset = least_significant_one_mask(i);
+  PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::tree_iterator::is_root() const {
+  // This is implied by OK(), it is here for reference only.
+  PPL_ASSERT(offset <= (tree.reserved_size / 2 + 1));
+  return offset == (tree.reserved_size / 2 + 1);
+}
+
+inline bool
+CO_Tree::tree_iterator::is_right_child() const {
+  if (is_root())
+    return false;
+  return (i & (2*offset)) != 0;
+}
+
+inline bool
+CO_Tree::tree_iterator::is_leaf() const {
+  return offset == 1;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::tree_iterator::operator*() {
+  return tree.data[i];
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::tree_iterator::operator*() const {
+  return tree.data[i];
+}
+
+inline dimension_type&
+CO_Tree::tree_iterator::index() {
+  return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::index() const {
+  return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::dfs_index() const {
+  return i;
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::get_offset() const {
+  return offset;
+}
+
+inline CO_Tree::height_t
+CO_Tree::tree_iterator::depth() const {
+  return integer_log2((tree.reserved_size + 1) / offset);
+}
+
+inline void
+swap(CO_Tree& x, CO_Tree& y) {
+  x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y) {
+  x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::iterator& x, CO_Tree::iterator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_CO_Tree_inlines_hh)
diff --git a/src/CO_Tree_templates.hh b/src/CO_Tree_templates.hh
new file mode 100644
index 0000000..41957f8
--- /dev/null
+++ b/src/CO_Tree_templates.hh
@@ -0,0 +1,141 @@
+/* CO_Tree class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_CO_Tree_templates_hh
+#define PPL_CO_Tree_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Iterator>
+CO_Tree::CO_Tree(Iterator i, dimension_type n) {
+
+  if (n == 0) {
+    init(0);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  const dimension_type new_max_depth = integer_log2(n) + 1;
+  reserved_size = (static_cast<dimension_type>(1) << new_max_depth) - 1;
+
+  if (is_greater_than_ratio(n, reserved_size, max_density_percent)
+      && reserved_size != 3)
+    reserved_size = reserved_size*2 + 1;
+
+  init(reserved_size);
+
+  tree_iterator root(*this);
+
+  // This is static and with static allocation, to improve performance.
+  // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that
+  // 2^k-1 is a dimension_type, so it is the maximum tree height.
+  // For each node level, the stack may contain up to 4 elements: two elements
+  // with operation 0, one element with operation 2 and one element
+  // with operation 3. An additional element with operation 1 can be at the
+  // top of the tree.
+  static std::pair<dimension_type, signed char>
+    stack[4U * sizeof_to_bits(sizeof(dimension_type)) + 1U];
+
+  dimension_type stack_first_empty = 0;
+
+  // A pair (n, operation) in the stack means:
+  //
+  // * Go to the parent, if operation is 0.
+  // * Go to the left child, then fill the current tree with n elements, if
+  //   operation is 1.
+  // * Go to the right child, then fill the current tree with n elements, if
+  //   operation is 2.
+  // * Fill the current tree with n elements, if operation is 3.
+
+  stack[0].first = n;
+  stack[0].second = 3;
+  ++stack_first_empty;
+
+  while (stack_first_empty != 0) {
+
+    // Implement
+    //
+    // <CODE>
+    //   top_n         = stack.top().first;
+    //   top_operation = stack.top().second;
+    // </CODE>
+    const dimension_type top_n = stack[stack_first_empty - 1].first;
+    const signed char top_operation = stack[stack_first_empty - 1].second;
+
+    switch (top_operation) {
+
+    case 0:
+      root.get_parent();
+      --stack_first_empty;
+      continue;
+
+    case 1:
+      root.get_left_child();
+      break;
+
+    case 2:
+      root.get_right_child();
+      break;
+#ifndef NDEBUG
+    case 3:
+      break;
+
+    default:
+      // We should not be here
+      PPL_UNREACHABLE;
+#endif
+    }
+
+    // We now visit the current tree
+
+    if (top_n == 0) {
+      --stack_first_empty;
+    }
+    else {
+      if (top_n == 1) {
+        PPL_ASSERT(root.index() == unused_index);
+        root.index() = i.index();
+        new (&(*root)) data_type(*i);
+        ++i;
+        --stack_first_empty;
+      }
+      else {
+        PPL_ASSERT(stack_first_empty + 3 < sizeof(stack)/sizeof(stack[0]));
+
+        const dimension_type half = (top_n + 1) / 2;
+        stack[stack_first_empty - 1].second = 0;
+        stack[stack_first_empty    ] = std::make_pair(top_n - half, 2);
+        stack[stack_first_empty + 1] = std::make_pair(1, 3);
+        stack[stack_first_empty + 2].second = 0;
+        stack[stack_first_empty + 3] = std::make_pair(half - 1, 1);
+        stack_first_empty += 4;
+      }
+    }
+  }
+  size_ = n;
+  PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_CO_Tree_templates_hh)
diff --git a/src/CO_Tree_types.hh b/src/CO_Tree_types.hh
new file mode 100644
index 0000000..c9b36f2
--- /dev/null
+++ b/src/CO_Tree_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_CO_Tree_types_hh
+#define PPL_CO_Tree_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class CO_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_CO_Tree_types_hh)
diff --git a/src/CREDITS.cc.dist b/src/CREDITS.cc.dist
new file mode 100644
index 0000000..47b1d20
--- /dev/null
+++ b/src/CREDITS.cc.dist
@@ -0,0 +1,445 @@
+extern const char* const CREDITS_array[444] = {
+  "",
+  "Authors",
+  "=======",
+  "",
+  "The Parma Polyhedra Library and its documentation is being designed,",
+  "extended, written, debugged, maintained and improved by the following",
+  "people:",
+  "",
+  "",
+  "Core Development Team:",
+  "----------------------",
+  "",
+  "  Roberto Bagnara       [1] (BUGSENG srl and University of Parma)",
+  "  Patricia M. Hill      [2] (BUGSENG srl and University of Leeds)",
+  "  Enea Zaffanella       [3] (BUGSENG srl and University of Parma)",
+  "  Abramo Bagnara            (BUGSENG srl)",
+  "",
+  "",
+  "Former Members of the Core Development Team:",
+  "--------------------------------------------",
+  "",
+  "  Elisa Ricci           (former student of the University of Parma,",
+  "                        one of the four students with which the PPL",
+  "                        project started) has been a major contributor",
+  "                        to the development of the PPL, up until",
+  "                        December 2002.",
+  "",
+  "",
+  "Current Contributors:",
+  "---------------------",
+  "",
+  "  Massimo Benerecetti   (University of Naples) is working on additional",
+  "                        operators on polyhedra.",
+  "",
+  "  Andrea Cimino         (former student of the University of Parma)",
+  "                        wrote most of the mixed integer programming",
+  "                        solver, and also most of the Java and OCaml",
+  "                        interfaces.  He keeps helping us, especially",
+  "                        with the web site.",
+  "",
+  "  Marco Faella          (University of Naples) is working on additional",
+  "                        operators on polyhedra.",
+  "",
+  "  Stefano Minopoli      (University of Naples) is working on additional",
+  "                        operators on polyhedra.",
+  "",
+  "  Marco Poletti         (student of the University of Bologna)",
+  "                        implemented the sparse matrices that are used",
+  "                        in the MIP and PIP solvers of the PPL; he also",
+  "                        did experiments on the parallelization of the",
+  "                        sparse matrices' computations; he is now working",
+  "                        on improving the PPL's memory footprint and",
+  "                        on other improvements to the library.",
+  "",
+  "  Alessandro Zaccagnini [4] (University of Parma) has helped with",
+  "                        the efficient implementation of GCD and LCM",
+  "                        for checked numbers.  He is now working on the",
+  "                        definitions of interval arithmetic operations.",
+  "                        Alessandro is always a very valuable source of",
+  "                        mathematical advice.",
+  "",
+  "",
+  "Past Contributors:",
+  "------------------",
+  "",
+  "  Roberto Amadini       (former student of the University of Parma)",
+  "                        did some work on the PPL support for the",
+  "                        approximation of floating point computations.",
+  "",
+  "  Irene Bacchi          (former student of the University of Parma) worked",
+  "                        on a development branch where she implemented",
+  "                        several variants of algorithms, checking",
+  "                        whether or not the set-union of two polyhedra",
+  "                        is the same as their poly-hull.",
+  "",
+  "  Fabio Biselli         (student of the University of Parma)",
+  "                        did some work on the PPL support for the",
+  "                        approximation of floating point computations.",
+  "",
+  "  Fabio Bossi           (former student of the University of Parma)",
+  "                        worked on the PPL support for the approximation",
+  "                        of floating point computations.",
+  "",
+  "  Danilo Bonardi        (former student of the University of Parma) worked",
+  "                        on a development branch where he experimented",
+  "                        with the use of metaprogramming techniques",
+  "                        based on expression templates.  The objective",
+  "                        of this work was to check the effectiveness of",
+  "                        these techniques for moving computations from",
+  "                        run-time to compile-time.",
+  "",
+  "  Sara Bonini           (former student of the University of Parma) is",
+  "                        one of the four students with which the PPL",
+  "                        project started.",
+  "",
+  "  Katy Dobson           (former student of the University of Leeds)",
+  "                        worked on the formalization and definition of",
+  "                        algorithms for rational grids and products",
+  "                        of grids and polyhedra.",
+  "",
+  "  Giordano Fracasso     (former student of the University of Parma) wrote",
+  "                        the initial version of the support for native",
+  "                        and checked integer coefficients.",
+  "",
+  "  Francois Galea        [5] (University of Versailles) worked",
+  "                        at the implementation of the Parametric Integer",
+  "                        Programming solver.",
+  "",
+  "  Maximiliano Marchesi  (former student of the University of Parma)",
+  "                        helped a little to improve the documentation for",
+  "                        bounded differences.",
+  "",
+  "  Elena Mazzi           (former student of the University of Parma) worked",
+  "                        on our implementation of bounded differences",
+  "                        and octagons.  She also participated in the",
+  "                        theoretical and practical work concerning",
+  "                        widening operators for weakly relational",
+  "                        domains.",
+  "",
+  "  David Merchat         (formerly at the University of Parma) helped us",
+  "                        with the generation of the library's documentation",
+  "                        using Doxygen.",
+  "",
+  "  Matthew Mundell       [6] (formerly at the University of Leeds) worked",
+  "                        on the implementation of rational grids.  He has",
+  "                        also helped on other implementation issues.",
+  "",
+  "  Andrea Pescetti       (former student of the University of Parma) was one",
+  "                        of the four students with which the PPL",
+  "                        project started.  Later, he helped a little",
+  "                        with the library's documentation.",
+  "",
+  "  Barbara Quartieri     (former student of the University of Parma) worked",
+  "                        on our implementation of bounded differences and",
+  "                        octagons.",
+  "",
+  "  Enric Rodriguez Carbonell [7] (Technical University of Catalonia)",
+  "                        worked at the implementation of polynomial spaces.",
+  "",
+  "  Angela Stazzone       (former student of the University of Parma)",
+  "                        worked on the library's documentation.",
+  "",
+  "  Fabio Trabucchi       (former student of the University of Parma) worked",
+  "                        on a development branch where he added",
+  "                        serializers for all the objects of the PPL.",
+  "                        Support for serialization based on Fabio's",
+  "                        work will be available in a future release of",
+  "                        the library.",
+  "",
+  "  Claudio Trento        (former student of the University of Pisa) did",
+  "                        a small amount of work on an experimental OCaml",
+  "                        interface for the PPL.",
+  "",
+  "  Tatiana Zolo          (former student of the University of Parma) is",
+  "                        one of the four students with which the PPL",
+  "                        project started.",
+  "",
+  "",
+  "",
+  "Thanks!",
+  "=======",
+  "",
+  "",
+  "People:",
+  "-------",
+  "",
+  "  Lucia Alessandrini    (University of Parma) provided 4 hour-long",
+  "                        lectures on convex polyhedra for the Italian",
+  "                        authors.  This was crucial for us to acquire",
+  "                        and/or refresh the notions needed for",
+  "                        developing the PPL library.",
+  "",
+  "",
+  "  Frederic Besson       [8] provided useful comments and observations on",
+  "                        the ideas (about an extrapolation operator for",
+  "                        convex polyhedra) sketched in a paper he",
+  "                        coauthored in 1999.",
+  "",
+  "  Tevfik Bultan         [9] (University of California, Santa Barbara)",
+  "                        suggested us to add support for generalized",
+  "                        affine transfer functions.  Discussions with",
+  "                        Tevfik have been very useful.",
+  "",
+  "  Manuel Carro",
+  "  Jose Morales          [9, 10] members of the CLIP Group [12], helped us",
+  "                        to produce a Ciao Prolog [13] interface for the",
+  "                        library.  The decisive (and memorable) debugging",
+  "                        session took place in Parma in the afternoon of",
+  "                        March 10th, 2003, with the participation of",
+  "                        Jose Manuel Gomez.",
+  "",
+  "  Marco Comini          [14] (University of Udine) allows us to use his",
+  "                        Mac OS X machine to work on portability to",
+  "                        that platform.",
+  "",
+  "  Goran Frehse          [15] (VERIMAG, formerly at Carnegie Mellon University)",
+  "                        provided very useful feedback while he was",
+  "                        developing PHAVer [16].  We are working with",
+  "                        Goran in order to include more polyhedra",
+  "                        simplification facilities in the PPL.",
+  "",
+  "  Denis Gopan           [17] (University of Wisconsin-Madison) helped us",
+  "                        extend the library with the \"expand space",
+  "                        dimension\" and \"fold space dimensions\"",
+  "                        operations of the library.",
+  "",
+  "  Martin Guy            [18] gave us access to his ARM machine: without",
+  "                        this possibility, porting the PPL to the ARM's",
+  "                        ABIs would have taken ages.",
+  "",
+  "  Bruno Haible          [19] (ILOG) helped us in our first steps towards",
+  "                        using versions of the GMP library installed in",
+  "                        nonstandard places.",
+  "",
+  "  Bertrand Jeannet      [20] (IRISA) wrote the New Polka library [21]",
+  "                        and made it available.  We had several",
+  "                        interesting exchanges with Bertrand concerning",
+  "                        various aspects of polyhedra manipulation.",
+  "",
+  "  Herve Le Verge        (r.i.p.) wrote and published an implementation",
+  "                        [22] of the Chernikova's algorithm [23] that",
+  "                        has set the stage for subsequent",
+  "                        implementation work, including our own.",
+  "",
+  "  Francesco Logozzo     [24] (formerly at Ecole Polytechnique) helped us",
+  "                        straighten out some portability issues on Cygwin.",
+  "",
+  "  Kenneth MacKenzie     [25] provided very good bug reports that allowed",
+  "                        us to fix several problems in the OCaml interface.",
+  "",
+  "  Costantino Medori     [26] (University of Parma) helped us on some",
+  "                        mathematical aspects of the development.",
+  "",
+  "  Fred Mesnard          [27] (University of La Reunion), the main author",
+  "                        of cTI [28], has worked with us on one of the",
+  "                        first applications of the PPL: the \"cTI\"",
+  "                        data-flow analyzer, which performs a linear",
+  "                        size relation analysis using a domain of",
+  "                        convex polyhedra.  The China data-flow",
+  "                        analyzer [29] uses the Parma Polyhedra Library",
+  "                        to perform the same analysis.  We have been",
+  "                        running China against an old version of cTI",
+  "                        that did not use the PPL, using it to",
+  "                        analyze the same Prolog programs.  Since these",
+  "                        systems did not share a single line of code,",
+  "                        this gave us excellent opportunities for our",
+  "                        initial testing and debugging work.  Fred has",
+  "                        also helped us to port the PPL to Mac OS X.",
+  "",
+  "  Ken Mixter            (then at Carnegie Mellon University) provided",
+  "                        useful feedback while working on an",
+  "                        experimental version of the Action Language",
+  "                        Verifier [30] based on the PPL.",
+  "",
+  "  Sebastian Pop         [31] (now at AMD).  During his work on interfacing",
+  "                        CLooG [32] with the PPL, Sebastian provided",
+  "                        valuable feedback, particularly on the C",
+  "                        interface to the PPL.  He also suggested the",
+  "                        addition of new functionality such as the",
+  "                        \"simplify using context\" operation.",
+  "",
+  "  Thomas Reps           [33] (University of Wisconsin-Madison), on several",
+  "                        occasions we have had interesting discussions",
+  "                        with him both on the PPL and on the more",
+  "                        general topics of static analysis and",
+  "                        numerical abstractions.",
+  "",
+  "  Mooly Sagiv           [34] (Tel-Aviv University) stimulated the development",
+  "                        of the PPL by providing, in particular,",
+  "                        interesting challenges related to precision",
+  "                        and scalability.",
+  "",
+  "  Sriram Sankaranarayanan [35] (NEC Laboratories America, formerly at",
+  "                        Stanford University) provided very useful feedback",
+  "                        while developing StInG [36] and LPInv [37].",
+  "",
+  "  Axel Simon            [38] (ENS, formerly at the University of Kent",
+  "                        at Canterbury) wrote some PPL 0.9",
+  "                        bindings [44] for the Glasgow Haskell Compiler.",
+  "",
+  "  Fausto Spoto          [39] (University of Verona) did useful beta testing",
+  "                        for the Java interface.  He also suggested the",
+  "                        addition of the <EM>hash code</EM> operations.",
+  "",
+  "  Basile Starynkevitch  [40] (CEA LIST/DTSI/SOL). Basile is the author",
+  "                        of MELT [41] and suggested several improvements",
+  "                        to the PPL.",
+  "",
+  "",
+  "  Pedro Vasconcelos     [42] (formerly at the University of St Andrews, UK)",
+  "                        provided useful feedback while developing his",
+  "                        size and cost analyzer for Core Hume [43].",
+  "                        Pedro also solved a problem of Axel Simon's",
+  "                        PPL 0.9 bindings for the GHC and makes them",
+  "                        publicly available [44].",
+  "",
+  "  Ralf Wildenhues       [45] (University of Bonn) helped us with",
+  "                        several issues concerning the proper use of",
+  "                        the Autotools.",
+  "",
+  "",
+  "Organizations (and People Therein):",
+  "-----------------------------------",
+  "",
+  "We are grateful for the following contributions:",
+  "",
+  "- AMD Developer Central [46] has donated a bi-quad core machine with",
+  "  the latest AMD Opteron 2384 \"Shanghai\" processors and 16GB of RAM.",
+  "  This machine now hosts all the PPL data and services.  Many thanks",
+  "  to Christophe Harle and Sebastian Pop.",
+  "",
+  "- The Computing Center of the University of Parma [47] allowed us to",
+  "  test the portability of the library on a variety of platforms.",
+  "  Fausto Pagani was especially helpful in this respect.",
+  "",
+  "- The GCC Compile Farm Project [48] managed by FSF France provided",
+  "  access to a number of machines that allowed us to test and improve",
+  "  the portability of the library.  Special thanks go to Laurent Guerby",
+  "  for his kind assistance.",
+  "",
+  "- The test cluster provided by Hewlett Packard and  hosted by ESIEE [49]",
+  "  allowed us to complete the porting of the PPL to the IA64 and PA-RISC",
+  "  architectures.  Many thanks to Thibaut Varene [50] and the PA-RISC",
+  "  Linux community [51] for their kind assistance.",
+  "",
+  "- HiPEAC [52] sponsored the participation of Roberto Bagnara to the",
+  "  Graphite Workshop [53].  This was very helpful to discuss the needs",
+  "  of Graphite [54] (a framework for high-level loop optimizations on",
+  "  the polyhedral model) and, more generally, of GCC [55] in terms of",
+  "  numerical abstractions and how the PPL can help.  Special thanks go",
+  "  to Albert Cohen [57] for this sponsorship.",
+  "",
+  "- INRIA [56] supported the work of Abramo Bagnara from January 1st to",
+  "  May 31st, 2009, to work on the PPL and its development",
+  "  infrastructure.  Many thanks go, in particular, to Albert Cohen [57].",
+  "",
+  "",
+  "Some of our research work has been partly supported by the following",
+  "projects and organizations:",
+  "",
+  "- University of Parma's FIL scientific research project (ex 60%)",
+  "  ``Pure and Applied Mathematics'';",
+  "",
+  "- MURST project ``Automatic Program Certification by Abstract",
+  "  Interpretation'' [58];",
+  "",
+  "- MURST project ``Abstract Interpretation, Type Systems and Control-Flow",
+  "  Analysis'';",
+  "",
+  "- MURST project ``Automatic Aggregate- and Number-Reasoning for Computing:",
+  "  from Decision Algorithms to Constraint Programming with Multisets, Sets,",
+  "  and Maps'' [59];",
+  "",
+  "- MURST project ``Constraint Based Verification of Reactive Systems'' [60];",
+  "",
+  "- MURST project ``AIDA - Abstract Interpretation: Design and",
+  "  Applications'' [61];",
+  "",
+  "- PRIN project ``AIDA 2007 - Abstract Interpretation: Design and",
+  "  Applications'' [62];",
+  "",
+  "- Integrated Action Italy-Spain 2001-2002 ``Advanced Development Environments",
+  "  for Logic Programs'' [63];",
+  "",
+  "- Royal Society Joint project 2004/R1-EU (UK-Italy)",
+  "  ``Automatic Detection of Unstable Numerical Computations'';",
+  "",
+  "- EPSRC (UK) project EP/C520726/1",
+  "  ``Numerical Domains for Software Analysis'' [64];",
+  "",
+  "- Royal Society International Outgoing Short Visit 2007/R4",
+  "  ``Finding and Verifying the Absence of Bugs in Imperative Programs'' [65];",
+  "",
+  "- EPSRC (UK) project EP/G025177/1",
+  "  ``Geometric Abstractions for Scalable Program Analyzers'' [65].",
+  "",
+  "--------",
+  "",
+  " [1] http://www.cs.unipr.it/~bagnara/",
+  " [2] http://www.comp.leeds.ac.uk/hill/",
+  " [3] http://www.cs.unipr.it/~zaffanella/",
+  " [4] http://www.math.unipr.it/~zaccagni/",
+  " [5] http://fgalea.free.fr/",
+  " [6] http://www.mundell.ukfsn.org/",
+  " [7] http://www.lsi.upc.edu/~erodri/",
+  " [8] http://www.irisa.fr/lande/fbesson/fbesson.html",
+  " [9] http://www.cs.ucsb.edu/~bultan/",
+  "[10] http://www.clip.dia.fi.upm.es/~boris/",
+  "[11] http://clip.dia.fi.upm.es/~jfran/",
+  "[12] http://clip.dia.fi.upm.es/",
+  "[13] http://clip.dia.fi.upm.es/Software/Ciao/",
+  "[14] http://www.dimi.uniud.it/~comini/",
+  "[15] http://www-verimag.imag.fr/~frehse/",
+  "[16] http://www-verimag.imag.fr/~frehse/phaver_web/",
+  "[17] http://www.cs.wisc.edu/~gopan/",
+  "[18] http://martinwguy.co.uk/",
+  "[19] http://www.haible.de/bruno/",
+  "[20] http://www.irisa.fr/prive/Bertrand.Jeannet/",
+  "[21] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html",
+  "[22] http://bugseng.com/products/ppl/documentation/chernikova.c",
+  "[23] http://bugseng.com/products/ppl/documentation/bibliography#LeVerge92",
+  "[24] http://research.microsoft.com/~logozzo/",
+  "[25] http://homepages.inf.ed.ac.uk/kwxm/",
+  "[26] http://www.math.unipr.it/~medori/",
+  "[27] http://www.univ-reunion.fr/~fred/",
+  "[28] http://www.cs.unipr.it/cTI/",
+  "[29] http://www.cs.unipr.it/China/",
+  "[30] http://www.cs.ucsb.edu/~bultan/composite/",
+  "[31] http://www-rocq.inria.fr/~pop/",
+  "[32] http://www.cloog.org/",
+  "[33] http://www.cs.wisc.edu/~reps/",
+  "[34] http://www.math.tau.ac.il/~msagiv/",
+  "[35] http://www.nec-labs.com/~srirams/",
+  "[36] http://theory.stanford.edu/~srirams/Software/sting.html",
+  "[37] http://theory.stanford.edu/~srirams/Software/lpinv.html",
+  "[38] http://www.di.ens.fr/~simona/",
+  "[39] http://profs.sci.univr.it/~spoto/",
+  "[40] http://www.starynkevitch.net/Basile/index_en.html",
+  "[41] http://gcc.gnu.org/wiki/MiddleEndLispTranslator",
+  "[42] http://www.ncc.up.pt/~pbv/",
+  "[43] http://www.ncc.up.pt/~pbv/cgi/cost.cgi",
+  "[44] http://www.ncc.up.pt/~pbv/research/ppl/ghc.html",
+  "[45] http://wissrech.ins.uni-bonn.de/people/wildenhues.html",
+  "[46] http://developer.amd.com/",
+  "[47] http://www.siti.unipr.it/",
+  "[48] http://gcc.gnu.org/wiki/CompileFarm",
+  "[49] http://www.esiee.fr/",
+  "[50] http://www.parisc-linux.org/~varenet/",
+  "[51] http://www.parisc-linux.org/",
+  "[52] http://www.hipeac.net/",
+  "[53] http://gcc.gnu.org/wiki/Graphite_Workshop_Nov08",
+  "[54] http://gcc.gnu.org/wiki/Graphite",
+  "[55] http://gcc.gnu.org/",
+  "[56] http://www.inria.fr/",
+  "[57] http://www-rocq.inria.fr/~acohen/",
+  "[58] http://theory.sci.univr.it/p40/",
+  "[59] http://www.cs.unipr.it/Projects/COFIN01",
+  "[60] http://www.disi.unige.it/person/DelzannoG/cover/",
+  "[61] http://www.cs.unipr.it/Projects/AIDA/",
+  "[62] http://www.cs.unipr.it/Projects/AIDA2007/",
+  "[63] http://www.cs.unipr.it/Projects/AzInt2001-2002Sp",
+  "[64] http://www.comp.leeds.ac.uk/hill/chiara/WWW/linda.html",
+  "[65] http://www.comp.leeds.ac.uk/hill/chiara/WWW/projects.html",
+  0};
diff --git a/src/CREDITS.hh.dist b/src/CREDITS.hh.dist
new file mode 100644
index 0000000..79d99df
--- /dev/null
+++ b/src/CREDITS.hh.dist
@@ -0,0 +1,4 @@
+#ifndef PPL_CREDITS_hh
+#define PPL_CREDITS_hh 1
+extern const char* const CREDITS_array[444];
+#endif // !defined(PPL_CREDITS_hh)
diff --git a/src/C_Integer.hh b/src/C_Integer.hh
new file mode 100644
index 0000000..a026f86
--- /dev/null
+++ b/src/C_Integer.hh
@@ -0,0 +1,217 @@
+/* C integers info.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Integer_hh
+#define PPL_C_Integer_hh 1
+
+#include "meta_programming.hh"
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing.  In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+struct C_Integer : public False { };
+
+template <>
+struct C_Integer<char> : public True {
+  enum const_bool_value {
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+    is_signed = true
+#else
+    is_signed = false
+#endif
+  };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+  typedef unsigned char other_type;
+#else
+  typedef signed char other_type;
+#endif
+  static const char min = static_cast<char>(CHAR_MIN);
+  static const char max = static_cast<char>(CHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed char> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef unsigned char other_type;
+  static const signed char min = static_cast<signed char>(SCHAR_MIN);
+  static const signed char max = static_cast<signed char>(SCHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed short> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef unsigned short other_type;
+  static const signed short min = static_cast<signed short>(SHRT_MIN);
+  static const signed short max = static_cast<signed short>(SHRT_MAX);
+};
+
+template <>
+struct C_Integer<signed int> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef unsigned int other_type;
+  static const signed int min = INT_MIN;
+  static const signed int max = INT_MAX;
+};
+
+template <>
+struct C_Integer<signed long> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef unsigned long other_type;
+  static const signed long min = LONG_MIN;
+  static const signed long max = LONG_MAX;
+};
+
+template <>
+struct C_Integer<signed long long> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef unsigned long long other_type;
+  static const signed long long min = LLONG_MIN;
+  static const signed long long max = LLONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned char> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef signed char other_type;
+  static const unsigned char min = static_cast<unsigned char>(0U);
+  static const unsigned char max = static_cast<unsigned char>(UCHAR_MAX);
+};
+
+template <>
+struct C_Integer<unsigned short> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef signed short other_type;
+  static const unsigned short min = static_cast<unsigned short>(0U);
+  static const unsigned short max = static_cast<unsigned short>(USHRT_MAX);
+};
+
+template <>
+struct C_Integer<unsigned int> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef signed int other_type;
+  static const unsigned int min = 0U;
+  static const unsigned int max = UINT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef signed long other_type;
+  static const unsigned long min = 0UL;
+  static const unsigned long max = ULONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long long> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef signed long long other_type;
+  static const unsigned long long min = 0ULL;
+  static const unsigned long long max = ULLONG_MAX;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Integer_hh)
diff --git a/src/C_Polyhedron.cc b/src/C_Polyhedron.cc
new file mode 100644
index 0000000..96717e4
--- /dev/null
+++ b/src/C_Polyhedron.cc
@@ -0,0 +1,109 @@
+/* C_Polyhedron class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+  const Constraint_System& cs = y.constraints();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_strict_inequality()) {
+      const Linear_Expression expr(c.expression());
+      add_constraint(expr >= 0);
+    }
+    else
+      add_constraint(c);
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::C_Polyhedron::C_Polyhedron(const Congruence_System& cgs)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(cgs.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(cgs)",
+                                              "the space dimension of cgs "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_congruences(cgs);
+}
+
+PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(cgs.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(cgs, recycle)",
+                                              "the space dimension of cgs "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_congruences(cgs);
+}
+
+PPL::C_Polyhedron::C_Polyhedron(const Grid& grid, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(grid.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(grid)",
+                                              "the space dimension of grid "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(grid.constraints());
+}
+
+bool
+PPL::C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("poly_hull_assign_if_exact(y)", "y", y);
+#define USE_BHZ09 0
+#define USE_BFT00 1
+#if USE_BHZ09 // [BagnaraHZ09]
+  return BHZ09_poly_hull_assign_if_exact(y);
+#elif USE_BFT00 // [BemporadFT00TR].
+  return BFT00_poly_hull_assign_if_exact(y);
+#else // Old implementation.
+  return PPL::poly_hull_assign_if_exact(*this, y);
+#endif
+#undef USE_BHZ09
+#undef USE_BFT00
+}
+
+
+void
+PPL::C_Polyhedron::positive_time_elapse_assign(const Polyhedron& y) {
+  NNC_Polyhedron nnc_this(*this);
+  nnc_this.positive_time_elapse_assign(y);
+  *this = nnc_this;
+}
+
diff --git a/src/C_Polyhedron_defs.hh b/src/C_Polyhedron_defs.hh
new file mode 100644
index 0000000..4dc2fc9
--- /dev/null
+++ b/src/C_Polyhedron_defs.hh
@@ -0,0 +1,291 @@
+/* C_Polyhedron class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Polyhedron_defs_hh
+#define PPL_C_Polyhedron_defs_hh 1
+
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class C_Polyhedron represents a
+    <EM>topologically closed</EM> convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    When building a closed polyhedron starting from
+    a system of constraints, an exception is thrown if the system
+    contains a <EM>strict inequality</EM> constraint.
+    Similarly, an exception is thrown when building a closed polyhedron
+    starting from a system of generators containing a <EM>closure point</EM>.
+
+    \note
+    Such an exception will be obtained even if the system of
+    constraints (resp., generators) actually defines
+    a topologically closed subset of the vector space, i.e.,
+    even if all the strict inequalities (resp., closure points)
+    in the system happen to be redundant with respect to the
+    system obtained by removing all the strict inequality constraints
+    (resp., all the closure points).
+    In contrast, when building a closed polyhedron starting from
+    an object of the class NNC_Polyhedron,
+    the precise topological closure test will be performed.
+*/
+
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty C polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the C polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty C polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe C polyhedron is built.
+  */
+  explicit C_Polyhedron(dimension_type num_dimensions = 0,
+                        Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a C polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  explicit C_Polyhedron(const Constraint_System& cs);
+
+  //! Builds a C polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  C_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a C polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  explicit C_Polyhedron(const Generator_System& gs);
+
+  //! Builds a C polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  C_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+  //! Builds a C polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.
+  */
+  explicit C_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds a C polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  C_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+  /*! \brief
+    Builds a C polyhedron representing the topological closure
+    of the NNC polyhedron \p y.
+
+    \param y
+    The NNC polyhedron to be used;
+
+    \param complexity
+    This argument is ignored.
+  */
+  explicit C_Polyhedron(const NNC_Polyhedron& y,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a box.
+  /*!
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
+    The algorithm used has polynomial complexity.
+
+    \param box
+    The box representing the polyhedron to be approximated;
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Interval>
+  explicit C_Polyhedron(const Box<Interval>& box,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BDS and is
+    the most precise that includes the BDS.
+
+    \param bd
+    The BDS used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit C_Polyhedron(const BD_Shape<U>& bd,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit C_Polyhedron(const Octagonal_Shape<U>& os,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
+
+    \param grid
+    The grid used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit C_Polyhedron(const Grid& grid,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  C_Polyhedron(const C_Polyhedron& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  C_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+  C_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Destructor.
+  ~C_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest C polyhedron containing the
+    result of computing the
+    \ref Positive_Time_Elapse_Operator "positive time-elapse"
+    between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+#include "C_Polyhedron_inlines.hh"
+
+#endif // !defined(PPL_C_Polyhedron_defs_hh)
diff --git a/src/C_Polyhedron_inlines.hh b/src/C_Polyhedron_inlines.hh
new file mode 100644
index 0000000..944fbd8
--- /dev/null
+++ b/src/C_Polyhedron_inlines.hh
@@ -0,0 +1,154 @@
+/* C_Polyhedron class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Polyhedron_inlines_hh
+#define PPL_C_Polyhedron_inlines_hh 1
+
+#include <algorithm>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+                           Degenerate_Element kind)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(num_dimensions,
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(n, k)",
+                                              "n exceeds the maximum "
+                                              "allowed space dimension"),
+               kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(cs)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(cs, recycle)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(gs)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(gs, recycle)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+C_Polyhedron::C_Polyhedron(const Box<Interval>& box, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(box, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(box)",
+                                                  "the space dimension of box "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(bd.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(bd)",
+                                              "the space dimension of bd "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(os.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(os)",
+                                              "the space dimension of os "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(os.constraints());
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+  : Polyhedron(y) {
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  C_Polyhedron c_y(y);
+  m_swap(c_y);
+  return *this;
+}
+
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Polyhedron_inlines_hh)
diff --git a/src/C_Polyhedron_types.hh b/src/C_Polyhedron_types.hh
new file mode 100644
index 0000000..96d84ca
--- /dev/null
+++ b/src/C_Polyhedron_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_C_Polyhedron_types_hh
+#define PPL_C_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Polyhedron_types_hh)
diff --git a/src/Cast_Floating_Point_Expression_defs.hh b/src/Cast_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..ab6b0e8
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_defs.hh
@@ -0,0 +1,182 @@
+/* Declarations for the Cast_Floating_Point_Expression class and
+   its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Cast_Floating_Point_Expression_defs_hh
+#define PPL_Cast_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Cast_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Cast_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Cast Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of floating-point cast expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+  forms such that:
+
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v \right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+  \f]
+
+  Given a floating point expression \f$e\f$ and a composite abstract store
+  \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right \rrbracket\f$,
+  we construct the interval linear form
+  \f$\linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}\f$ as follows:
+  \f[
+  \linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Builds a cast floating point expression with the value
+    expressed by \p expr.
+  */
+  Cast_Floating_Point_Expression(
+    Floating_Point_Expression<FP_Interval_Type, FP_Format>* const expr);
+
+  //! Destructor.
+  ~Cast_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    See the class description for an explanation of how \p result is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Cast_Floating_Point_Expression& y);
+
+private:
+
+  //! Pointer to the casted expression.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* expr;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Cast_Floating_Point_Expression(
+                          const Cast_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+  Cast_Floating_Point_Expression& operator=(
+                          const Cast_Floating_Point_Expression& y);
+
+}; // class Cast_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Cast_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_defs_hh)
diff --git a/src/Cast_Floating_Point_Expression_inlines.hh b/src/Cast_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..333fe74
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,64 @@
+/* Cast_Floating_Point_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Cast_Floating_Point_Expression_inlines_hh
+#define PPL_Cast_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Cast_Floating_Point_Expression(
+Floating_Point_Expression<FP_Interval_Type, FP_Format>* const e)
+  : expr(e) {
+  assert(e != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Cast_Floating_Point_Expression() {
+  delete expr;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Cast_Floating_Point_Expression& y) {
+  swap(expr, y.expr);
+}
+
+/*! \relates Cast_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_inlines_hh)
diff --git a/src/Cast_Floating_Point_Expression_templates.hh b/src/Cast_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..695a981
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_templates.hh
@@ -0,0 +1,46 @@
+/* Cast_Floating_Point_Expression class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Cast_Floating_Point_Expression_templates_hh
+#define PPL_Cast_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!expr->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_templates_hh)
diff --git a/src/Cast_Floating_Point_Expression_types.hh b/src/Cast_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..8fa18a6
--- /dev/null
+++ b/src/Cast_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Cast_Floating_Point_Expression_types_hh
+#define PPL_Cast_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Cast_Floating_Point_Expression_types_hh)
diff --git a/src/Checked_Number.cc b/src/Checked_Number.cc
new file mode 100644
index 0000000..df0fc17
--- /dev/null
+++ b/src/Checked_Number.cc
@@ -0,0 +1,92 @@
+/* Checked_Number class implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Checked_Number_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+void
+throw_result_exception(Result r) {
+  switch (r - V_UNREPRESENTABLE) {
+  case V_EMPTY:
+    throw std::domain_error("Exact result is not comparable to computable one.");
+  case V_EQ:
+    throw std::logic_error("Exact result is equal to computed one.");
+  case V_LT:
+    throw std::logic_error("Exact result is less than computed one.");
+  case V_LE:
+    throw std::logic_error("Exact result is less than or equal to "
+                           "computed one.");
+  case V_GT:
+    throw std::logic_error("Exact result is greater than computed one.");
+  case V_GE:
+    throw std::logic_error("Exact result is greater than or equal to "
+                           "computed one.");
+  case V_NE:
+    throw std::logic_error("Exact result is less than or greater than "
+                           "computed one.");
+  case V_LGE:
+    throw std::logic_error("Exact result is less than, greater than or "
+                           "equal to computed one.");
+  case V_EQ_MINUS_INFINITY:
+    throw std::overflow_error("Minus infinity.");
+  case V_GT_MINUS_INFINITY:
+  case V_LT_INF:
+    throw std::overflow_error("Negative overflow.");
+  case V_UNKNOWN_NEG_OVERFLOW:
+    throw std::overflow_error("Unknown result due to intermediate negative overflow.");
+  case V_EQ_PLUS_INFINITY:
+    throw std::overflow_error("Plus infinity.");
+  case V_LT_PLUS_INFINITY:
+  case V_GT_SUP:
+    throw std::overflow_error("Positive overflow.");
+  case V_UNKNOWN_POS_OVERFLOW:
+    throw std::overflow_error("Unknown result due to intermediate positive overflow.");
+  case V_NAN:
+    throw std::domain_error("Not-a-Number.");
+  case V_CVT_STR_UNK:
+    throw std::domain_error("Invalid numeric string.");
+  case V_DIV_ZERO:
+    throw std::domain_error("Division by zero.");
+  case V_INF_ADD_INF:
+    throw std::domain_error("Infinities addition.");
+  case V_INF_DIV_INF:
+    throw std::domain_error("Infinities division.");
+  case V_INF_MOD:
+    throw std::domain_error("Remainder of division of infinity.");
+  case V_INF_MUL_ZERO:
+    throw std::domain_error("Multiplication of infinity and zero.");
+  case V_INF_SUB_INF:
+    throw std::domain_error("Subtraction of infinities.");
+  case V_MOD_ZERO:
+    throw std::domain_error("Remainder of division by zero.");
+  case V_SQRT_NEG:
+    throw std::domain_error("Square root of negative number.");
+  default:
+    throw std::logic_error("Unexpected result.");
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/Checked_Number_defs.hh b/src/Checked_Number_defs.hh
new file mode 100644
index 0000000..1ee1f6d
--- /dev/null
+++ b/src/Checked_Number_defs.hh
@@ -0,0 +1,1068 @@
+/* Checked_Number class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Checked_Number_defs_hh
+#define PPL_Checked_Number_defs_hh 1
+
+#include "Checked_Number_types.hh"
+#include "checked_defs.hh"
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+
+  // `convertible' is intentionally not defined: the compile time
+  // error on conversions is the expected behavior.
+
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(fpu_check_nan_result, true);
+
+  // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+  // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+  // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+  // ROUND_DEFAULT_INPUT is intentionally not defined.
+  // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Check_Overflow_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+  const_bool_nodef(convertible, true);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(fpu_check_nan_result, true);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_From_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_From_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Checked_Number_Transparent_Policy<T> Policy;
+  static const T& raw_value(const T& v) {
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static const T& raw_value(const Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_To_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_To_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Check_Overflow_Policy<T> Policy;
+  static T& raw_value(T& v) {
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static T& raw_value(Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Checked : public False { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Is_Checked<Checked_Number<T, P> > : public True { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Native_Or_Checked
+  : public Bool<Is_Native<T>::value || Is_Checked<T>::value> { };
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+  The wrapper and related functions implement an interface which is common
+  to all kinds of coefficient types, therefore allowing for a uniform
+  coding style. This class also implements the policy encoded by the
+  second template parameter. The default policy is to perform the detection
+  of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+  //! \name Constructors
+  //@{
+
+  //! Default constructor.
+  Checked_Number();
+
+  //! Copy constructor.
+  Checked_Number(const Checked_Number& y);
+
+  //! Direct initialization from a Checked_Number and rounding mode.
+  template <typename From, typename From_Policy>
+  Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+  //! Direct initialization from a plain char and rounding mode.
+  Checked_Number(char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed char and rounding mode.
+  Checked_Number(signed char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed short and rounding mode.
+  Checked_Number(signed short y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed int and rounding mode.
+  Checked_Number(signed int y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long and rounding mode.
+  Checked_Number(signed long y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long long and rounding mode.
+  Checked_Number(signed long long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned char and rounding mode.
+  Checked_Number(unsigned char y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned short and rounding mode.
+  Checked_Number(unsigned short y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned int and rounding mode.
+  Checked_Number(unsigned int y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long and rounding mode.
+  Checked_Number(unsigned long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long long and rounding mode.
+  Checked_Number(unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+  //! Direct initialization from a float and rounding mode.
+  Checked_Number(float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+  //! Direct initialization from a double and rounding mode.
+  Checked_Number(double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+  //! Direct initialization from a long double and rounding mode.
+  Checked_Number(long double y, Rounding_Dir dir);
+#endif
+
+  //! Direct initialization from a rational and rounding mode.
+  Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from an unbounded integer and rounding mode.
+  Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from a C string and rounding mode.
+  Checked_Number(const char* y, Rounding_Dir dir);
+
+  //! Direct initialization from special and rounding mode.
+  template <typename From>
+  Checked_Number(const From&, Rounding_Dir dir, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+  //! Direct initialization from a Checked_Number, default rounding mode.
+  template <typename From, typename From_Policy>
+  explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+  //! Direct initialization from a plain char, default rounding mode.
+  Checked_Number(char y);
+
+  //! Direct initialization from a signed char, default rounding mode.
+  Checked_Number(signed char y);
+
+  //! Direct initialization from a signed short, default rounding mode.
+  Checked_Number(signed short y);
+
+  //! Direct initialization from a signed int, default rounding mode.
+  Checked_Number(signed int y);
+
+  //! Direct initialization from a signed long, default rounding mode.
+  Checked_Number(signed long y);
+
+  //! Direct initialization from a signed long long, default rounding mode.
+  Checked_Number(signed long long y);
+
+  //! Direct initialization from an unsigned char, default rounding mode.
+  Checked_Number(unsigned char y);
+
+  //! Direct initialization from an unsigned short, default rounding mode.
+  Checked_Number(unsigned short y);
+
+  //! Direct initialization from an unsigned int, default rounding mode.
+  Checked_Number(unsigned int y);
+
+  //! Direct initialization from an unsigned long, default rounding mode.
+  Checked_Number(unsigned long y);
+
+  //! Direct initialization from an unsigned long long, default rounding mode.
+  Checked_Number(unsigned long long y);
+
+  //! Direct initialization from a float, default rounding mode.
+  Checked_Number(float y);
+
+  //! Direct initialization from a double, default rounding mode.
+  Checked_Number(double y);
+
+  //! Direct initialization from a long double, default rounding mode.
+  Checked_Number(long double y);
+
+  //! Direct initialization from a rational, default rounding mode.
+  Checked_Number(const mpq_class& y);
+
+  //! Direct initialization from an unbounded integer, default rounding mode.
+  Checked_Number(const mpz_class& y);
+
+  //! Direct initialization from a C string, default rounding mode.
+  Checked_Number(const char* y);
+
+  //! Direct initialization from special, default rounding mode
+  template <typename From>
+  Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+
+  //@} // Constructors
+
+  //! \name Accessors and Conversions
+  //@{
+
+  //! Conversion operator: returns a copy of the underlying numeric value.
+  operator T() const;
+
+  //! Returns a reference to the underlying numeric value.
+  T& raw_value();
+
+  //! Returns a const reference to the underlying numeric value.
+  const T& raw_value() const;
+
+  //@} // Accessors and Conversions
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Classifies *this.
+  /*!
+    Returns the appropriate Result characterizing:
+    - whether \p *this is NaN,
+      if \p nan is <CODE>true</CODE>;
+    - whether \p *this is a (positive or negative) infinity,
+      if \p inf is <CODE>true</CODE>;
+    - the sign of \p *this,
+      if \p sign is <CODE>true</CODE>.
+  */
+  Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+  //! \name Assignment Operators
+  //@{
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Checked_Number& y);
+
+  //! Assignment operator.
+  template <typename From>
+  Checked_Number& operator=(const From& y);
+
+  //! Add and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+  //! Add and assign operator.
+  Checked_Number& operator+=(const T& y);
+
+  //! Add and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator+=(const From& y);
+
+  //! Subtract and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  Checked_Number& operator-=(const T& y);
+
+  //! Subtract and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator-=(const From& y);
+
+  //! Multiply and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const T& y);
+
+  //! Multiply and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator*=(const From& y);
+
+  //! Divide and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+  //! Divide and assign operator.
+  Checked_Number& operator/=(const T& y);
+
+  //! Divide and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator/=(const From& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  Checked_Number& operator%=(const T& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>& >::type
+  operator%=(const From& y);
+
+  //@} // Assignment Operators
+
+
+  //! \name Increment and Decrement Operators
+  //@{
+
+  //! Pre-increment operator.
+  Checked_Number& operator++();
+
+  //! Post-increment operator.
+  Checked_Number  operator++(int);
+
+  //! Pre-decrement operator.
+  Checked_Number& operator--();
+
+  //! Post-decrement operator.
+  Checked_Number  operator--(int);
+
+  //@} // Increment and Decrement Operators
+
+private:
+  //! The underlying numeric value.
+  T v;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Slow_Copy<Checked_Number<T, P> > : public Bool<Slow_Copy<T>::value> {};
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename To_Policy>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define PPL_DECLARE_FUNC1_A(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_A(assign_r)
+PPL_DECLARE_FUNC1_A(floor_assign_r)
+PPL_DECLARE_FUNC1_A(ceil_assign_r)
+PPL_DECLARE_FUNC1_A(trunc_assign_r)
+PPL_DECLARE_FUNC1_A(neg_assign_r)
+PPL_DECLARE_FUNC1_A(abs_assign_r)
+PPL_DECLARE_FUNC1_A(sqrt_assign_r)
+
+#undef PPL_DECLARE_FUNC1_A
+
+#define PPL_DECLARE_FUNC1_B(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_B(add_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(sub_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(mul_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(div_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(smod_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(umod_2exp_assign_r)
+
+#undef PPL_DECLARE_FUNC1_B
+
+#define PPL_DECLARE_FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+                   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC2(add_assign_r)
+PPL_DECLARE_FUNC2(sub_assign_r)
+PPL_DECLARE_FUNC2(mul_assign_r)
+PPL_DECLARE_FUNC2(div_assign_r)
+PPL_DECLARE_FUNC2(idiv_assign_r)
+PPL_DECLARE_FUNC2(rem_assign_r)
+PPL_DECLARE_FUNC2(gcd_assign_r)
+PPL_DECLARE_FUNC2(lcm_assign_r)
+PPL_DECLARE_FUNC2(add_mul_assign_r)
+PPL_DECLARE_FUNC2(sub_mul_assign_r)
+
+#undef PPL_DECLARE_FUNC2
+
+#define PPL_DECLARE_FUNC4(name) \
+template <typename To1, typename To2, typename To3, \
+          typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To1>::value \
+                   && Is_Native_Or_Checked<To2>::value \
+                   && Is_Native_Or_Checked<To3>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+                   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+ PPL_U(name)(To1& to, To2& s, To3& t,     \
+     const From1& x, const From2& y, \
+     Rounding_Dir dir);
+
+PPL_DECLARE_FUNC4(gcdext_assign_r)
+
+#undef PPL_DECLARE_FUNC4
+
+//! \name Accessor Functions
+//@{
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x smallest integral value not less than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x smallest integral value not less than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Round \p x to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+               const Checked_Number<T, Policy>& y,
+               const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+               const Checked_Number<T, Policy>& y,
+               const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+           const Checked_Number<T, Policy>& y,
+           const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  Assigns to \p x the greatest common divisor of \p y and \p z,
+  setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+              Checked_Number<T, Policy>& s,
+              Checked_Number<T, Policy>& t,
+              const Checked_Number<T, Policy>& y,
+              const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+           const Checked_Number<T, Policy>& y,
+           const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+mul_2exp_assign(Checked_Number<T, Policy>& x,
+                const Checked_Number<T, Policy>& y,
+                unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+div_2exp_assign(Checked_Number<T, Policy>& x,
+                const Checked_Number<T, Policy>& y,
+                unsigned int exp);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates Checked_Number
+  The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+                 const Checked_Number<T, Policy>& y,
+                 const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+                 const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator==(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+equal(const T1& x, const T2& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator!=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+not_equal(const T1& x, const T2& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator>=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+greater_or_equal(const T1& x, const T2& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator>(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+greater_than(const T1& x, const T2& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator<=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+less_or_equal(const T1& x, const T2& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator<(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+less_than(const T1& x, const T2& y);
+
+/*! \brief
+  Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+  of \p x is negative, zero or positive, respectively.
+
+  \relates Checked_Number
+*/
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type \
+sgn(const From& x);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates Checked_Number
+*/
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os,
+       const T& x,
+       const Numeric_Format& format,
+       Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Ascii dump for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t);
+
+//! Input function.
+/*!
+  \relates Checked_Number
+
+  \param is
+  Input stream to read from;
+
+  \param x
+  Number (possibly extended) to assign to in case of successful reading;
+
+  \param dir
+  Rounding mode to be applied.
+
+  \return
+  Result of the input operation.  Success, success with imprecision,
+  overflow, parsing error: all possibilities are taken into account,
+  checked for, and properly reported.
+
+  This function attempts reading a (possibly extended) number from the given
+  stream \p is, possibly rounding as specified by \p dir, assigning the result
+  to \p x upon success, and returning the appropriate Result.
+
+  The input syntax allows the specification of:
+  - plain base-10 integer numbers as <CODE>34976098</CODE>,
+    <CODE>-77</CODE> and <CODE>+13</CODE>;
+  - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+    and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+    <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+  - base-10 rational numbers in fraction notation as
+    <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+  - base-10 rational numbers in fraction/scientific notation as
+    <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+    (meaning \f$3/580000\f$);
+  - base-10 rational numbers in floating point notation as
+    <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+    <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+  - base-10 rational numbers in floating point scientific notation as
+    <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+    (meaning \f$-220001/100\f$);
+  - integers and rationals (in fractional, floating point and scientific
+    notations) specified by using Mathematica-style bases, in the range
+    from 2 to 36, as
+    <CODE>2^^11</CODE> (meaning \f$3\f$),
+    <CODE>36^^z</CODE> (meaning \f$35\f$),
+    <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+    <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+    <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+    <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+    <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+    <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+    <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+    note that the base and the exponent are always written as plain
+    base-10 integer numbers; also, when an ambiguity may arise, the
+    character <CODE>e</CODE> is interpreted as a digit, so that
+    <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+    <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+  - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+    the Mathematica-style prefix <CODE>16^^</CODE>;
+  - the C-style binary exponent indicator <CODE>p</CODE> can only be used
+    when base 16 has been specified; if used, the exponent will be
+    applied to base 2 (instead of base 16, as is the case when the
+    indicator <CODE>e</CODE> is used);
+  - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+    (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+    and <CODE>nan</CODE> (meaning "not a number").
+
+  The rationale behind the accepted syntax can be summarized as follows:
+  - if the syntax is accepted by Mathematica, then this function
+    accepts it with the same semantics;
+  - if the syntax is acceptable as standard C++ integer or floating point
+    literal (except for octal notation and type suffixes, which are not
+    supported), then this function accepts it with the same semantics;
+  - natural extensions of the above are accepted with the natural
+    extensions of the semantics;
+  - special values are accepted.
+
+  Valid syntax is more formally and completely specified by the
+  following grammar, with the additional provisos that everything is
+  <EM>case insensitive</EM>, that the syntactic category
+  <CODE>BDIGIT</CODE> is further restricted by the current base
+  and that for all bases above 14, any <CODE>e</CODE> is always
+  interpreted as a digit and never as a delimiter for the exponent part
+  (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number  : NAN                                   INF     : 'inf'
+        | SIGN INF                                      ;
+        | INF
+        | num                                   NAN     : 'nan'
+        | num DIV num                                   ;
+        ;
+                                                SIGN    : '-'
+num     : u_num                                         | '+'
+        | SIGN u_num                                    ;
+
+u_num   : u_num1                                EXP     : 'e'
+        | HEX u_num1                                    | 'p'
+        | base BASE u_num1                              | '*^'
+        ;                                               ;
+                                                POINT   : '.'
+u_num1  : mantissa                                      ;
+        | mantissa EXP exponent
+        ;                                       DIV     : '/'
+                                                        ;
+mantissa: bdigits
+        | POINT bdigits                         MINUS   : '-'
+        | bdigits POINT                                 ;
+        | bdigits POINT bdigits
+        ;                                       PLUS    : '+'
+                                                ;
+exponent: SIGN digits
+        | digits                                HEX     : '0x'
+        ;                                       ;
+
+bdigits : BDIGIT                                BASE    : '^^'
+        | bdigits BDIGIT                                ;
+        ;
+                                                DIGIT   : '0' .. '9'
+digits  : DIGIT                                         ;
+        | digits DIGIT
+        ;                                       BDIGIT  : '0' .. '9'
+                                                        | 'a' .. 'z'
+                                                        ;
+\endcode
+*/
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//! Ascii load for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::ostream& s, T& t);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+//! Swaps \p x with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+template <typename T, typename Policy>
+struct FPU_Related<Checked_Number<T, Policy> > : public FPU_Related<T> {};
+
+template <typename T>
+void maybe_reset_fpu_inexact();
+
+template <typename T>
+int maybe_check_fpu_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Checked_Number_inlines.hh"
+#include "Checked_Number_templates.hh"
+
+#endif // !defined(PPL_Checked_Number_defs_hh)
diff --git a/src/Checked_Number_inlines.hh b/src/Checked_Number_inlines.hh
new file mode 100644
index 0000000..233ae28
--- /dev/null
+++ b/src/Checked_Number_inlines.hh
@@ -0,0 +1,848 @@
+/* Checked_Number class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Checked_Number_inlines_hh
+#define PPL_Checked_Number_inlines_hh 1
+
+#include "globals_defs.hh"
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+#ifndef NDEBUG
+#define DEBUG_ROUND_NOT_NEEDED
+#endif
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    return ROUND_CHECK;
+#endif
+  }
+  return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    PPL_ASSERT(result_relation(r) == VR_EQ);
+#endif
+    return r;
+  }
+  return r;
+}
+
+
+template <typename T>
+inline void
+Checked_Number_Transparent_Policy<T>::handle_result(Result) {
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+  if (result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+  // TODO: avoid default construction of value member.
+  Checked::copy<Policy, Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y,
+                 Rounding_Dir dir) {
+  // TODO: avoid default construction of value member.
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+                                     (v,
+                                      y.raw_value(),
+                                      rounding_dir(dir)),
+                                     dir)
+                        );
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+  // TODO: avoid default construction of value member.
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+                                     (v,
+                                      y.raw_value(),
+                                      rounding_dir(dir)),
+                                     dir));
+}
+
+// TODO: avoid default construction of value member.
+#define PPL_DEFINE_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type y, Rounding_Dir dir) { \
+  Policy::handle_result                                                 \
+    (check_result(Checked::assign_ext<Policy,                           \
+                                      Checked_Number_Transparent_Policy<PPL_U(type)> > \
+                  (v, y, rounding_dir(dir)),                            \
+                  dir));                                                \
+}                                                                       \
+template <typename T, typename Policy>                                  \
+inline                                                                  \
+Checked_Number<T, Policy>::Checked_Number(const type y) {               \
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;                 \
+  Policy::handle_result                                                 \
+    (check_result(Checked::assign_ext<Policy,                           \
+                                      Checked_Number_Transparent_Policy<PPL_U(type)> > \
+                  (v, y, rounding_dir(dir)),                            \
+                  dir));                                                \
+}
+
+PPL_DEFINE_CTOR(char)
+PPL_DEFINE_CTOR(signed char)
+PPL_DEFINE_CTOR(signed short)
+PPL_DEFINE_CTOR(signed int)
+PPL_DEFINE_CTOR(signed long)
+PPL_DEFINE_CTOR(signed long long)
+PPL_DEFINE_CTOR(unsigned char)
+PPL_DEFINE_CTOR(unsigned short)
+PPL_DEFINE_CTOR(unsigned int)
+PPL_DEFINE_CTOR(unsigned long)
+PPL_DEFINE_CTOR(unsigned long long)
+#if PPL_SUPPORTED_FLOAT
+PPL_DEFINE_CTOR(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_DEFINE_CTOR(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_DEFINE_CTOR(long double)
+#endif
+PPL_DEFINE_CTOR(mpq_class&)
+PPL_DEFINE_CTOR(mpz_class&)
+
+#undef PPL_DEFINE_CTOR
+
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y, Rounding_Dir dir) {
+  std::istringstream s(y);
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+                                                            s,
+                                                            rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y) {
+  std::istringstream s(y);
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+                                                            s,
+                                                            rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const From&,
+                 Rounding_Dir dir,
+                 typename Enable_If<Is_Special<From>::value, bool>::type) {
+  Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+                                                                     From::vclass,
+                                                                     rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>::Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type) {
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+                                                            From::vclass,
+                                                            rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value
+                          && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From&, Rounding_Dir dir) {
+  return check_result(Checked::assign_special<typename Native_Checked_To_Wrapper<To>
+                      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+                                From::vclass,
+                                rounding_dir(dir)),
+                      dir);
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From&, Rounding_Dir dir) {
+  return check_result(Checked::construct_special<typename Native_Checked_To_Wrapper<To>
+                      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+                                From::vclass,
+                                rounding_dir(dir)),
+                      dir);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x) {
+  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x) {
+  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x) {
+  return is_minus_infinity(x) ? -1 : (is_plus_infinity(x) ? 1 : 0);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x) {
+  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x) {
+  return Checked::is_int<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+  if (Policy::convertible)
+    return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+  return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+  return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+  return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+  return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+  return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return external_memory_in_bytes(x.raw_value());
+}
+
+
+/*! \relates Checked_Number */
+template <typename To>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>
+                      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+                                s,
+                                rounding_dir(dir)),
+                      dir);
+}
+
+#define PPL_DEFINE_FUNC1_A(name, func) \
+template <typename To, typename From>                                   \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type                                 \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir) {                 \
+  return                                                                \
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>   \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From>             \
+                 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+                           Native_Checked_From_Wrapper<From>::raw_value(x), \
+                           rounding_dir(dir)), dir);                    \
+}
+
+PPL_DEFINE_FUNC1_A(construct, construct_ext)
+PPL_DEFINE_FUNC1_A(assign_r, assign_ext)
+PPL_DEFINE_FUNC1_A(floor_assign_r, floor_ext)
+PPL_DEFINE_FUNC1_A(ceil_assign_r, ceil_ext)
+PPL_DEFINE_FUNC1_A(trunc_assign_r, trunc_ext)
+PPL_DEFINE_FUNC1_A(neg_assign_r, neg_ext)
+PPL_DEFINE_FUNC1_A(abs_assign_r, abs_ext)
+PPL_DEFINE_FUNC1_A(sqrt_assign_r, sqrt_ext)
+
+#undef PPL_DEFINE_FUNC1_A
+
+#define PPL_DEFINE_FUNC1_B(name, func) \
+template <typename To, typename From>                                   \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type                                 \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir) { \
+  return                                                                \
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>   \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From>             \
+                 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+                           Native_Checked_From_Wrapper<From>::raw_value(x), \
+                           exp,                                         \
+                           rounding_dir(dir)),                          \
+                 dir);                                                  \
+}
+
+PPL_DEFINE_FUNC1_B(add_2exp_assign_r, add_2exp_ext)
+PPL_DEFINE_FUNC1_B(sub_2exp_assign_r, sub_2exp_ext)
+PPL_DEFINE_FUNC1_B(mul_2exp_assign_r, mul_2exp_ext)
+PPL_DEFINE_FUNC1_B(div_2exp_assign_r, div_2exp_ext)
+PPL_DEFINE_FUNC1_B(smod_2exp_assign_r, smod_2exp_ext)
+PPL_DEFINE_FUNC1_B(umod_2exp_assign_r, umod_2exp_ext)
+
+#undef PPL_DEFINE_FUNC1_B
+
+#define PPL_DEFINE_FUNC2(name, func) \
+template <typename To, typename From1, typename From2>                  \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type                                 \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
+  return                                                                \
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>   \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From1>            \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From2>            \
+                 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+                           Native_Checked_From_Wrapper<From1>::raw_value(x), \
+                           Native_Checked_From_Wrapper<From2>::raw_value(y), \
+                           rounding_dir(dir)),                          \
+                 dir);                                                  \
+}
+
+PPL_DEFINE_FUNC2(add_assign_r, add_ext)
+PPL_DEFINE_FUNC2(sub_assign_r, sub_ext)
+PPL_DEFINE_FUNC2(mul_assign_r, mul_ext)
+PPL_DEFINE_FUNC2(div_assign_r, div_ext)
+PPL_DEFINE_FUNC2(idiv_assign_r, idiv_ext)
+PPL_DEFINE_FUNC2(rem_assign_r, rem_ext)
+PPL_DEFINE_FUNC2(gcd_assign_r, gcd_ext)
+PPL_DEFINE_FUNC2(lcm_assign_r, lcm_ext)
+PPL_DEFINE_FUNC2(add_mul_assign_r, add_mul_ext)
+PPL_DEFINE_FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef PPL_DEFINE_FUNC2
+
+#define PPL_DEFINE_FUNC4(name, func)                                    \
+template <typename To1,                                                 \
+          typename To2,                                                 \
+          typename To3,                                                 \
+          typename From1,                                               \
+          typename From2>                                               \
+inline typename Enable_If<Is_Native_Or_Checked<To1>::value              \
+                          && Is_Native_Or_Checked<To2>::value           \
+                          && Is_Native_Or_Checked<To3>::value           \
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type                                 \
+ PPL_U(name)(To1& to, To2& s, To3& t, const From1& x, const From2& y,   \
+     Rounding_Dir dir) {                                                \
+  return                                                                \
+    check_result                                                        \
+    (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,     \
+                   typename Native_Checked_To_Wrapper<To2>::Policy,     \
+                   typename Native_Checked_To_Wrapper<To3>::Policy,     \
+                   typename Native_Checked_From_Wrapper<From1>::Policy, \
+                   typename Native_Checked_From_Wrapper<From2>::Policy> \
+     (Native_Checked_To_Wrapper<To1>::raw_value(to),                    \
+      Native_Checked_To_Wrapper<To2>::raw_value(s),                     \
+      Native_Checked_To_Wrapper<To3>::raw_value(t),                     \
+      Native_Checked_From_Wrapper<From1>::raw_value(x),                 \
+      Native_Checked_From_Wrapper<From2>::raw_value(y),                 \
+      rounding_dir(dir)),                                               \
+     dir);                                                              \
+}
+
+PPL_DEFINE_FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef PPL_DEFINE_PPL_DEFINE_FUNC4
+
+#define PPL_DEFINE_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+  Policy::handle_result((fun)(*this, *this, T(1),             \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+  T r = v;\
+  Policy::handle_result((fun)(*this, *this, T(1),             \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r;\
+}
+
+PPL_DEFINE_INCREMENT(operator ++, add_assign_r)
+PPL_DEFINE_INCREMENT(operator --, sub_assign_r)
+
+#undef PPL_DEFINE_INCREMENT
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+  Checked::copy<Policy, Policy>(v, y.raw_value());
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+
+#define PPL_DEFINE_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+  Policy::handle_result((fun)(*this, *this, y,                          \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+  Policy::handle_result((fun)(*this, *this, y,                \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, \
+                          Checked_Number<T, Policy>& >::type \
+Checked_Number<T, Policy>::f(const From& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result((fun)(*this, *this, cy,               \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+}
+
+PPL_DEFINE_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP_ASSIGN
+
+#define PPL_DEFINE_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+ PPL_U(f)(const Checked_Number<T, Policy>& x,   \
+         const Checked_Number<T, Policy>& y) {  \
+  Checked_Number<T, Policy> r; \
+  Policy::handle_result((fun)(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename Type, typename T, typename Policy>   \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Type& x, const Checked_Number<T, Policy>& y) {          \
+  Checked_Number<T, Policy> r(x); \
+  Policy::handle_result((fun)(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename T, typename Policy, typename Type>   \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Checked_Number<T, Policy>& x, const Type& y) {          \
+  Checked_Number<T, Policy> r(y); \
+  Policy::handle_result((fun)(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+}
+
+PPL_DEFINE_BINARY_OP(operator +, add_assign_r)
+PPL_DEFINE_BINARY_OP(operator -, sub_assign_r)
+PPL_DEFINE_BINARY_OP(operator *, mul_assign_r)
+PPL_DEFINE_BINARY_OP(operator /, div_assign_r)
+PPL_DEFINE_BINARY_OP(operator %, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP
+
+#define PPL_DEFINE_COMPARE_OP(f, fun)                                   \
+template <typename T1, typename T2>                                     \
+inline                                                                  \
+typename Enable_If<Is_Native_Or_Checked<T1>::value                      \
+                   && Is_Native_Or_Checked<T2>::value                   \
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value), \
+                   bool>::type                                          \
+ PPL_U(f)(const T1& x, const T2& y) {                                   \
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+                      typename Native_Checked_From_Wrapper<T2>::Policy> \
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),                     \
+     Native_Checked_From_Wrapper<T2>::raw_value(y));                    \
+}
+
+PPL_DEFINE_COMPARE_OP(operator ==, eq_ext)
+PPL_DEFINE_COMPARE_OP(operator !=, ne_ext)
+PPL_DEFINE_COMPARE_OP(operator >=, ge_ext)
+PPL_DEFINE_COMPARE_OP(operator >, gt_ext)
+PPL_DEFINE_COMPARE_OP(operator <=, le_ext)
+PPL_DEFINE_COMPARE_OP(operator <, lt_ext)
+
+#undef PPL_DEFINE_COMPARE_OP
+
+#define PPL_DEFINE_COMPARE(f, fun)                                      \
+template <typename T1, typename T2>                                     \
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value               \
+                          && Is_Native_Or_Checked<T2>::value,           \
+                          bool>::type                                   \
+ PPL_U(f)(const T1& x, const T2& y) {                                   \
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+                      typename Native_Checked_From_Wrapper<T2>::Policy> \
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),                     \
+     Native_Checked_From_Wrapper<T2>::raw_value(y));                    \
+}
+
+PPL_DEFINE_COMPARE(equal, eq_ext)
+PPL_DEFINE_COMPARE(not_equal, ne_ext)
+PPL_DEFINE_COMPARE(greater_or_equal, ge_ext)
+PPL_DEFINE_COMPARE(greater_than, gt_ext)
+PPL_DEFINE_COMPARE(less_or_equal, le_ext)
+PPL_DEFINE_COMPARE(less_than, lt_ext)
+
+#undef PPL_DEFINE_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+  return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> r;
+  Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+  return r;
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x) {                               \
+  Policy::handle_result((fun)(x, x, Policy::ROUND_DEFAULT_FUNCTION));   \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Policy::handle_result((fun)(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+  const Checked_Number<T, Policy>& z) { \
+  Policy::handle_result((fun)(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN5_5(f, fun)                                        \
+template <typename T, typename Policy>                                  \
+inline void                                                             \
+ PPL_U(f)(Checked_Number<T, Policy>& x,                                 \
+  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t,           \
+  const Checked_Number<T, Policy>& y,                                   \
+  const Checked_Number<T, Policy>& z) {                                 \
+  Policy::handle_result((fun)(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(floor_assign, floor_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(floor_assign, floor_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(abs_assign, abs_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(abs_assign, abs_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(rem_assign, rem_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef PPL_DEFINE_ASSIGN_FUN2_1
+#undef PPL_DEFINE_ASSIGN_FUN2_2
+#undef PPL_DEFINE_ASSIGN_FUN3_2
+#undef PPL_DEFINE_ASSIGN_FUN3_3
+#undef PPL_DEFINE_ASSIGN_FUN5_5
+
+#define PPL_DEFINE_ASSIGN_2EXP(f, fun)                                  \
+template <typename T, typename Policy>                                  \
+inline void                                                             \
+ PPL_U(f)(Checked_Number<T, Policy>& x,                                 \
+          const Checked_Number<T, Policy>& y, unsigned int exp) {       \
+  Policy::handle_result((fun)(x, y, exp, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_2EXP(mul_2exp_assign, mul_2exp_assign_r)
+PPL_DEFINE_ASSIGN_2EXP(div_2exp_assign, div_2exp_assign_r)
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+                 const Checked_Number<T, Policy>& y,
+                 const Checked_Number<T, Policy>& z) {
+  Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type
+sgn(const From& x) {
+  Result_Relation r = Checked::sgn_ext<typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_From_Wrapper<From>::raw_value(x));
+  switch (r) {
+  case VR_LT:
+    return -1;
+  case VR_EQ:
+    return 0;
+  case VR_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y) {
+  Result_Relation r
+    = Checked::cmp_ext<typename Native_Checked_From_Wrapper<From1>::Policy,
+                       typename Native_Checked_From_Wrapper<From2>::Policy>
+                 (Native_Checked_From_Wrapper<From1>::raw_value(x),
+                  Native_Checked_From_Wrapper<From2>::raw_value(y));
+  switch (r) {
+  case VR_LT:
+    return -1;
+  case VR_EQ:
+    return 0;
+  case VR_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os, const T& x,
+       const Numeric_Format& format, Rounding_Dir dir) {
+  return check_result(Checked::output_ext<typename Native_Checked_From_Wrapper<T>::Policy>
+                      (os,
+                       Native_Checked_From_Wrapper<T>::raw_value(x),
+                       format,
+                       rounding_dir(dir)),
+                      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+  Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+  return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir) {
+  return check_result(Checked::input_ext<typename Native_Checked_To_Wrapper<T>::Policy>
+                      (Native_Checked_To_Wrapper<T>::raw_value(x),
+                       is,
+                       rounding_dir(dir)),
+                      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+                                Checked_Number<T, Policy>& x) {
+  Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+  if (r == V_CVT_STR_UNK)
+    is.setstate(std::ios::failbit);
+  else
+    Policy::handle_result(r);
+  return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+  return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+  return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+  return NOT_A_NUMBER;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+  using std::swap;
+  swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T>
+inline void
+maybe_reset_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_reset_inexact();
+}
+
+template <typename T>
+inline int
+maybe_check_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_check_inexact();
+  else
+    return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_inlines_hh)
diff --git a/src/Checked_Number_templates.hh b/src/Checked_Number_templates.hh
new file mode 100644
index 0000000..48a5a3e
--- /dev/null
+++ b/src/Checked_Number_templates.hh
@@ -0,0 +1,149 @@
+/* Checked_Number class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Checked_Number_templates_hh
+#define PPL_Checked_Number_templates_hh 1
+
+#include "assert.hh"
+#include <iomanip>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t) {
+  if (std::numeric_limits<T>::is_exact)
+    // An exact data type: pretty printer is accurate.
+    s << t;
+  else {
+    // An inexact data type (probably floating point):
+    // first dump its hexadecimal representation ...
+    const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+                                                std::ios::basefield);
+    const unsigned char* p = reinterpret_cast<const unsigned char*>(&t);
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      s << std::setw(2) << std::setfill('0') << static_cast<unsigned>(p[i]);
+    }
+    s.flags(old_flags);
+    // ... and then pretty print it for readability.
+    s << " (" << t << ")";
+  }
+}
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::istream& s, T& t) {
+  if (std::numeric_limits<T>::is_exact) {
+    // An exact data type: input from pretty printed version is accurate.
+    s >> t;
+    return !s.fail();
+  }
+  else {
+    // An inexact data type (probably floating point):
+    // first load its hexadecimal representation ...
+    std::string str;
+    if (!(s >> str) || str.size() != 2*sizeof(T))
+      return false;
+    unsigned char* p = reinterpret_cast<unsigned char*>(&t);
+    // CHECKME: any (portable) simpler way?
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      unsigned byte_value = 0;
+      for (unsigned j = 0; j < 2; ++j) {
+        byte_value <<= 4;
+        unsigned half_byte_value;
+        // Interpret single hex character.
+        switch (str[2*i + j]) {
+        case '0':
+          half_byte_value = 0;
+          break;
+        case '1':
+          half_byte_value = 1;
+          break;
+        case '2':
+          half_byte_value = 2;
+          break;
+        case '3':
+          half_byte_value = 3;
+          break;
+        case '4':
+          half_byte_value = 4;
+          break;
+        case '5':
+          half_byte_value = 5;
+          break;
+        case '6':
+          half_byte_value = 6;
+          break;
+        case '7':
+          half_byte_value = 7;
+          break;
+        case '8':
+          half_byte_value = 8;
+          break;
+        case '9':
+          half_byte_value = 9;
+          break;
+        case 'A':
+        case 'a':
+          half_byte_value = 10;
+          break;
+        case 'B':
+        case 'b':
+          half_byte_value = 11;
+          break;
+        case 'C':
+        case 'c':
+          half_byte_value = 12;
+          break;
+        case 'D':
+        case 'd':
+          half_byte_value = 13;
+          break;
+        case 'E':
+        case 'e':
+          half_byte_value = 14;
+          break;
+        case 'F':
+        case 'f':
+          half_byte_value = 15;
+          break;
+        default:
+          return false;
+        }
+        byte_value += half_byte_value;
+      }
+      PPL_ASSERT(byte_value <= 255);
+      p[i] = static_cast<unsigned char>(byte_value);
+    }
+    // ... then read and discard pretty printed value.
+    if (!(s >> str))
+      return false;
+    const std::string::size_type sz = str.size();
+    return sz > 2 && str[0] == '(' && str[sz-1] == ')';
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_templates_hh)
diff --git a/src/Checked_Number_types.hh b/src/Checked_Number_types.hh
new file mode 100644
index 0000000..b404b87
--- /dev/null
+++ b/src/Checked_Number_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Checked_Number_types_hh
+#define PPL_Checked_Number_types_hh 1
+
+#include "Coefficient_traits_template.hh"
+
+namespace Parma_Polyhedra_Library {
+
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_types_hh)
diff --git a/src/Coefficient.cc b/src/Coefficient.cc
new file mode 100644
index 0000000..593b344
--- /dev/null
+++ b/src/Coefficient.cc
@@ -0,0 +1,64 @@
+/* Coefficient class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Coefficient_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+void
+Coefficient_constants_initialize() {
+}
+
+void
+Coefficient_constants_finalize() {
+}
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+const Coefficient* Coefficient_zero_p = 0;
+const Coefficient* Coefficient_one_p = 0;
+
+void
+Coefficient_constants_initialize() {
+  PPL_ASSERT(Coefficient_zero_p == 0);
+  Coefficient_zero_p = new Coefficient(0);
+
+  PPL_ASSERT(Coefficient_one_p == 0);
+  Coefficient_one_p = new Coefficient(1);
+}
+
+void
+Coefficient_constants_finalize() {
+  PPL_ASSERT(Coefficient_zero_p != 0);
+  delete Coefficient_zero_p;
+  Coefficient_zero_p = 0;
+
+  PPL_ASSERT(Coefficient_one_p != 0);
+  delete Coefficient_one_p;
+  Coefficient_one_p = 0;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Coefficient_defs.hh b/src/Coefficient_defs.hh
new file mode 100644
index 0000000..a5733b2
--- /dev/null
+++ b/src/Coefficient_defs.hh
@@ -0,0 +1,61 @@
+/* Coefficient class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Coefficient_defs_hh
+#define PPL_Coefficient_defs_hh 1
+
+#include "Coefficient_types.hh"
+#include <iosfwd>
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+#include "Checked_Number_defs.hh"
+#include "checked_int_inlines.hh"
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+#include "GMP_Integer_defs.hh"
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Initializes the Coefficient constants.
+#endif
+void Coefficient_constants_initialize();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Finalizes the Coefficient constants.
+#endif
+void Coefficient_constants_finalize();
+
+//! Returns a const reference to a Coefficient with value 0.
+Coefficient_traits::const_reference Coefficient_zero();
+
+//! Returns a const reference to a Coefficient with value 1.
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Coefficient_inlines.hh"
+
+#endif // !defined(PPL_Coefficient_defs_hh)
diff --git a/src/Coefficient_inlines.hh b/src/Coefficient_inlines.hh
new file mode 100644
index 0000000..d10c36e
--- /dev/null
+++ b/src/Coefficient_inlines.hh
@@ -0,0 +1,72 @@
+/* Coefficient class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Coefficient_inlines_hh
+#define PPL_Coefficient_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_CHECKED_INTEGERS
+inline void
+Bounded_Integer_Coefficient_Policy::handle_result(Result r) {
+  // Note that the input functions can return VC_NAN.
+  if (result_overflow(r) || result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+#endif // PPL_CHECKED_INTEGERS
+
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient zero(0);
+  return zero;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient one(1);
+  return one;
+}
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+#ifdef PPL_GMP_INTEGERS
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  extern const Coefficient* Coefficient_zero_p;
+  return *Coefficient_zero_p;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  extern const Coefficient* Coefficient_one_p;
+  PPL_ASSERT(*Coefficient_one_p != 0);
+  return *Coefficient_one_p;
+}
+#endif // PPL_GMP_INTEGERS
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_inlines_hh)
diff --git a/src/Coefficient_traits_template.hh b/src/Coefficient_traits_template.hh
new file mode 100644
index 0000000..2117477
--- /dev/null
+++ b/src/Coefficient_traits_template.hh
@@ -0,0 +1,39 @@
+/* Coefficient_traits_template class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Coefficient_traits_template_hh
+#define PPL_Coefficient_traits_template_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_traits_template_hh)
diff --git a/src/Coefficient_types.hh b/src/Coefficient_types.hh
new file mode 100644
index 0000000..731a45a
--- /dev/null
+++ b/src/Coefficient_types.hh
@@ -0,0 +1,182 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Coefficient_types_hh
+#define PPL_Coefficient_types_hh 1
+
+#include "Checked_Number_defs.hh"
+
+#ifdef PPL_GMP_INTEGERS
+#include "GMP_Integer_types.hh"
+#endif
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! A policy for checked bounded integer coefficients.
+/*! \ingroup PPL_CXX_interface */
+struct Bounded_Integer_Coefficient_Policy {
+  //! Check for overflowed result.
+  const_bool_nodef(check_overflow, true);
+
+  //! Do not check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Do not check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Do not check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Do not check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Do not check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Do not check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Do not checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Do not handle not-a-number special value.
+  const_bool_nodef(has_nan, false);
+
+  //! Do not handle infinity special values.
+  const_bool_nodef(has_infinity, false);
+
+  /*! \brief
+    The checked number can always be safely converted to the
+    underlying type \p T and vice-versa.
+  */
+  const_bool_nodef(convertible, true);
+
+  //! Do not honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, false);
+
+  //! Do not make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, true);
+
+  /*! \brief
+    For constructors, by default use the same rounding used by
+    underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+  /*! \brief
+    For overloaded operators (operator+(), operator-(), ...), by
+    default use the same rounding used by the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+  /*! \brief
+    For input functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For output functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For all other functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+  //! The type used for references to const 8 bit checked integers.
+  typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+  //! The type used for references to const 16 bit checked integers.
+  typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+  //! The type used for references to const 32 bit checked integers.
+  typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+  //! The type used for references to const 64 bit checked integers.
+  typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators,
+  intervals, bounding boxes and so on.  Depending on the chosen
+  configuration options (see file <CODE>README.configure</CODE>),
+  a Coefficient may actually be:
+    - The GMP_Integer type, which in turn is an alias for the
+      <CODE>mpz_class</CODE> type implemented by the C++ interface
+      of the GMP library (this is the default configuration).
+    - An instance of the Checked_Number class template: with the policy
+      Bounded_Integer_Coefficient_Policy, this implements overflow
+      detection on top of a native integral type (available template
+      instances include checked integers having 8, 16, 32 or 64 bits);
+      with the Checked_Number_Transparent_Policy, this is a wrapper
+      for native integral types with no overflow detection
+      (available template instances are as above).
+*/
+typedef PPL_COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_types_hh)
diff --git a/src/Concrete_Expression.cc b/src/Concrete_Expression.cc
new file mode 100644
index 0000000..5c25d66
--- /dev/null
+++ b/src/Concrete_Expression.cc
@@ -0,0 +1,122 @@
+/* Concrete_Expression class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Concrete_Expression_defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Concrete_Expression_Type::OK() const {
+  if (impl.bounded_integer) {
+    if (impl.bounded_integer_type_width != BITS_8
+        && impl.bounded_integer_type_width != BITS_16
+        && impl.bounded_integer_type_width != BITS_32
+        && impl.bounded_integer_type_width != BITS_64
+        && impl.bounded_integer_type_width != BITS_128) {
+#ifndef NDEBUG
+      std::cerr << "bounded integer type has illegal width "
+                << impl.bounded_integer_type_width
+                << std::endl;
+#endif
+      return false;
+    }
+
+    if (impl.bounded_integer_type_representation != UNSIGNED
+        && impl.bounded_integer_type_representation != SIGNED_2_COMPLEMENT) {
+#ifndef NDEBUG
+      std::cerr << "bounded integer type has illegal representation "
+                << impl.bounded_integer_type_representation
+                << std::endl;
+#endif
+      return false;
+    }
+
+    if (impl.bounded_integer_type_overflow != OVERFLOW_WRAPS
+        && impl.bounded_integer_type_overflow != OVERFLOW_UNDEFINED
+        && impl.bounded_integer_type_overflow != OVERFLOW_IMPOSSIBLE) {
+#ifndef NDEBUG
+      std::cerr << "bounded integer type has illegal overflow "
+                << impl.bounded_integer_type_overflow
+                << std::endl;
+#endif
+      return false;
+    }
+
+    if (impl.floating_point_format != IEEE754_HALF) {
+#ifndef NDEBUG
+      std::cerr << "bounded integer type has illegal (unused) fp format "
+                << impl.floating_point_format
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+  else {
+    // Here we have impl.bounded_integer == false.
+    if (impl.floating_point_format != IEEE754_HALF
+        && impl.floating_point_format != IEEE754_SINGLE
+        && impl.floating_point_format != IEEE754_DOUBLE
+        && impl.floating_point_format != IBM_SINGLE
+        && impl.floating_point_format != IEEE754_QUAD
+        && impl.floating_point_format != INTEL_DOUBLE_EXTENDED) {
+#ifndef NDEBUG
+      std::cerr << "floating point type has illegal format "
+                << impl.floating_point_format
+                << std::endl;
+#endif
+      return false;
+    }
+
+    if (impl.bounded_integer_type_width != BITS_128) {
+#ifdef NDEBUG
+      std::cerr << "floating point type has illegal (unused) bi width "
+                << impl.bounded_integer_type_width
+                << std::endl;
+#endif
+      return false;
+    }
+
+    if (impl.bounded_integer_type_representation != SIGNED_2_COMPLEMENT) {
+#ifndef NDEBUG
+      std::cerr << "floating point type has illegal (unused) bi representation "
+                << impl.bounded_integer_type_representation
+                << std::endl;
+#endif
+      return false;
+    }
+
+    if (impl.bounded_integer_type_overflow != OVERFLOW_IMPOSSIBLE) {
+#ifndef NDEBUG
+      std::cerr << "floating point type has illegal (unused) bi overflow "
+                << impl.bounded_integer_type_overflow
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // If we got here, everything is OK.
+  return true;
+}
diff --git a/src/Concrete_Expression_defs.hh b/src/Concrete_Expression_defs.hh
new file mode 100644
index 0000000..d59e1c9
--- /dev/null
+++ b/src/Concrete_Expression_defs.hh
@@ -0,0 +1,201 @@
+/* Concrete_Expression class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Concrete_Expression_defs_hh
+#define PPL_Concrete_Expression_defs_hh 1
+
+#include "Concrete_Expression_types.hh"
+#include "globals_defs.hh"
+#include "Interval_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! The type of a concrete expression.
+class Concrete_Expression_Type {
+public:
+  /*! \brief
+    Returns the bounded integer type corresponding to \p width,
+    \p representation and \p overflow.
+  */
+  static Concrete_Expression_Type
+  bounded_integer(Bounded_Integer_Type_Width width,
+                  Bounded_Integer_Type_Representation representation,
+                  Bounded_Integer_Type_Overflow overflow);
+
+  /*! \brief
+    Returns the floating point type corresponding to \p format.
+  */
+  static Concrete_Expression_Type
+  floating_point(Floating_Point_Format format);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a bounded
+    integer type.
+  */
+  bool is_bounded_integer() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a floating
+    point type.
+  */
+  bool is_floating_point() const;
+
+  /*! \brief
+    Returns the width in bits of the bounded integer type encoded by
+    \p *this.
+
+    The behavior is undefined if \p *this does not encode a bounded
+    integer type.
+  */
+  Bounded_Integer_Type_Width bounded_integer_type_width() const;
+
+  /*! \brief
+    Returns the representation of the bounded integer type encoded by
+    \p *this.
+
+    The behavior is undefined if \p *this does not encode a bounded
+    integer type.
+  */
+  Bounded_Integer_Type_Representation
+  bounded_integer_type_representation() const;
+
+  /*! \brief
+    Returns the overflow behavior of the bounded integer type encoded by
+    \p *this.
+
+    The behavior is undefined if \p *this does not encode a bounded
+    integer type.
+  */
+  Bounded_Integer_Type_Overflow
+  bounded_integer_type_overflow() const;
+
+  /*! \brief
+    Returns the format of the floating point type encoded by \p *this.
+
+    The behavior is undefined if \p *this does not encode a floating
+    point type.
+  */
+  Floating_Point_Format floating_point_format() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! A 32-bit word encoding the type.
+  struct Implementation {
+    bool bounded_integer:1;
+    unsigned int bounded_integer_type_width:23;
+    unsigned int bounded_integer_type_representation:2;
+    unsigned int bounded_integer_type_overflow:2;
+    unsigned int floating_point_format:4;
+  };
+
+  //! Constructor from \p implementation.
+  Concrete_Expression_Type(Implementation implementation);
+
+  //! The encoding of \p *this.
+  Implementation impl;
+};
+
+//! Base class for all concrete expressions.
+template <typename Target>
+class Concrete_Expression_Common {
+public:
+  //! Returns the type of \* this.
+  Concrete_Expression_Type type() const;
+
+  //! Returns the kind of \* this.
+  Concrete_Expression_Kind kind() const;
+
+  //! Tests if \p *this has the same kind as <CODE>Derived\<Target\></CODE>.
+  template <template <typename T> class Derived>
+  bool is() const;
+
+  /*! \brief
+    Returns a pointer to \p *this converted to type
+    <CODE>Derived\<Target\>*</CODE>.
+  */
+  template <template <typename T> class Derived>
+  Derived<Target>* as();
+
+  /*! \brief
+    Returns a pointer to \p *this converted to type
+    <CODE>const Derived\<Target\>*</CODE>.
+  */
+  template <template <typename T> class Derived>
+  const Derived<Target>* as() const;
+
+};
+
+//! Base class for binary operator applied to two concrete expressions.
+template <typename Target>
+class Binary_Operator_Common {
+public:
+  //! Returns a constant identifying the operator of \p *this.
+  Concrete_Expression_BOP binary_operator() const;
+
+  //! Returns the left-hand side of \p *this.
+  const Concrete_Expression<Target>* left_hand_side() const;
+
+  //! Returns the right-hand side of \p *this.
+  const Concrete_Expression<Target>* right_hand_side() const;
+};
+
+//! Base class for unary operator applied to one concrete expression.
+template <typename Target>
+class Unary_Operator_Common {
+public:
+  //! Returns a constant identifying the operator of \p *this.
+  Concrete_Expression_UOP unary_operator() const;
+
+  //! Returns the argument \p *this.
+  const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for cast operator concrete expressions.
+template <typename Target>
+class Cast_Operator_Common {
+  //! Returns the casted expression.
+  const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for integer constant concrete expressions.
+template <typename Target>
+class Integer_Constant_Common {
+};
+
+//! Base class for floating-point constant concrete expression.
+template <typename Target>
+class Floating_Point_Constant_Common {
+};
+
+//! Base class for references to some approximable.
+template <typename Target>
+class Approximable_Reference_Common {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Concrete_Expression_inlines.hh"
+
+#endif // !defined(PPL_Concrete_Expression_defs_hh)
diff --git a/src/Concrete_Expression_inlines.hh b/src/Concrete_Expression_inlines.hh
new file mode 100644
index 0000000..e6963e6
--- /dev/null
+++ b/src/Concrete_Expression_inlines.hh
@@ -0,0 +1,123 @@
+/* Concrete_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Concrete_Expression_inlines_hh
+#define PPL_Concrete_Expression_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Concrete_Expression_Type
+::Concrete_Expression_Type(Implementation implementation)
+  : impl(implementation) {
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::bounded_integer(const Bounded_Integer_Type_Width width,
+                  const Bounded_Integer_Type_Representation representation,
+                  const Bounded_Integer_Type_Overflow overflow) {
+  Implementation impl;
+  impl.bounded_integer = true;
+  impl.bounded_integer_type_width = width;
+  impl.bounded_integer_type_representation = representation;
+  impl.bounded_integer_type_overflow = overflow;
+  // Arbitrary choice to ensure determinism.
+  impl.floating_point_format = IEEE754_HALF;
+  return Concrete_Expression_Type(impl);
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::floating_point(const Floating_Point_Format format) {
+  Implementation impl;
+  impl.bounded_integer = false;
+  impl.floating_point_format = format;
+  // Arbitrary choices to ensure determinism.
+  impl.bounded_integer_type_width = BITS_128;
+  impl.bounded_integer_type_representation =  SIGNED_2_COMPLEMENT;
+  impl.bounded_integer_type_overflow = OVERFLOW_IMPOSSIBLE;
+  return Concrete_Expression_Type(impl);
+}
+
+inline bool
+Concrete_Expression_Type::is_bounded_integer() const {
+  return impl.bounded_integer;
+}
+
+inline bool
+Concrete_Expression_Type::is_floating_point() const {
+  return !impl.bounded_integer;
+}
+
+inline Bounded_Integer_Type_Width
+Concrete_Expression_Type::bounded_integer_type_width() const {
+  const unsigned int u = impl.bounded_integer_type_width;
+  return static_cast<Bounded_Integer_Type_Width>(u);
+}
+
+inline Bounded_Integer_Type_Representation
+Concrete_Expression_Type::bounded_integer_type_representation() const {
+  const unsigned int u = impl.bounded_integer_type_representation;
+  return static_cast<Bounded_Integer_Type_Representation>(u);
+}
+
+inline Bounded_Integer_Type_Overflow
+Concrete_Expression_Type::bounded_integer_type_overflow() const {
+  const unsigned int u = impl.bounded_integer_type_overflow;
+  return static_cast<Bounded_Integer_Type_Overflow>(u);
+}
+
+inline Floating_Point_Format
+Concrete_Expression_Type::floating_point_format() const {
+  const unsigned int u = impl.floating_point_format;
+  return static_cast<Floating_Point_Format>(u);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline bool
+Concrete_Expression_Common<Target>::is() const {
+  return static_cast<const Concrete_Expression<Target>*>(this)->kind() ==
+         Derived<Target>::KIND;
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline Derived<Target>*
+Concrete_Expression_Common<Target>::as() {
+  PPL_ASSERT(is<Derived>());
+  return static_cast<Derived<Target>*>(this);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline const Derived<Target>*
+Concrete_Expression_Common<Target>::as() const {
+  PPL_ASSERT(is<Derived>());
+  return static_cast<const Derived<Target>*>(this);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Concrete_Expression_inlines_hh)
diff --git a/src/Concrete_Expression_types.hh b/src/Concrete_Expression_types.hh
new file mode 100644
index 0000000..ea0f68e
--- /dev/null
+++ b/src/Concrete_Expression_types.hh
@@ -0,0 +1,98 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Concrete_Expression_types_hh
+#define PPL_Concrete_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+/*
+  NOTE: Doxygen seems to ignore documentation blocks attached to
+  template class declarations that are not provided with a definition.
+  This justifies (here below) the explicit use of Doxygen command \class.
+*/
+
+/*! \brief The base class of all concrete expressions.
+  \class Parma_Polyhedra_Library::Concrete_Expression
+*/
+template <typename Target>
+class Concrete_Expression;
+
+/*! \brief A binary operator applied to two concrete expressions.
+  \class Parma_Polyhedra_Library::Binary_Operator
+*/
+template <typename Target>
+class Binary_Operator;
+
+/*! \brief A unary operator applied to one concrete expression.
+  \class Parma_Polyhedra_Library::Unary_Operator
+*/
+template <typename Target>
+class Unary_Operator;
+
+/*! \brief A cast operator converting one concrete expression to some type.
+  \class Parma_Polyhedra_Library::Cast_Operator
+*/
+template <typename Target>
+class Cast_Operator;
+
+/*! \brief An integer constant concrete expression.
+  \class Parma_Polyhedra_Library::Integer_Constant
+*/
+template <typename Target>
+class Integer_Constant;
+
+/*! \brief A floating-point constant concrete expression.
+  \class Parma_Polyhedra_Library::Floating_Point_Constant
+*/
+template <typename Target>
+class Floating_Point_Constant;
+
+/*! \brief A concrete expression representing a reference to some approximable.
+  \class Parma_Polyhedra_Library::Approximable_Reference
+*/
+template <typename Target>
+class Approximable_Reference;
+
+class Concrete_Expression_Type;
+
+/*! \brief
+  Encodes the kind of concrete expression.
+
+  The values should be defined by the particular instance
+  and uniquely identify one of: Binary_Operator, Unary_Operator,
+  Cast_Operator, Integer_Constant, Floating_Point_Constant, or
+  Approximable_Reference.  For example, the Binary_Operator kind
+  integer constant should be defined by an instance as the member
+  <CODE>Binary_Operator\<T\>::%KIND</CODE>.
+*/
+typedef int Concrete_Expression_Kind;
+
+/*! \brief
+  Encodes a binary operator of concrete expressions.
+
+  The values should be uniquely defined by the particular instance and
+  named: ADD, SUB, MUL, DIV, REM, BAND, BOR, BXOR, LSHIFT, RSHIFT.
+*/
+typedef int Concrete_Expression_BOP;
+
+/*! \brief
+  Encodes a unary operator of concrete expressions.
+
+  The values should be uniquely defined by the particular instance and
+  named: PLUS, MINUS, BNOT.
+*/
+typedef int Concrete_Expression_UOP;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Concrete_Expression_types_hh)
diff --git a/src/Congruence.cc b/src/Congruence.cc
new file mode 100644
index 0000000..a8ad80b
--- /dev/null
+++ b/src/Congruence.cc
@@ -0,0 +1,271 @@
+/* Congruence class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Congruence_defs.hh"
+#include "Variable_defs.hh"
+#include "Constraint_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence::Congruence(const Constraint& c, Representation r)
+  : expr(c.expression(), c.space_dimension(), r),
+    modulus_(0) {
+  if (!c.is_equality())
+    throw_invalid_argument("Congruence(c, r)",
+                           "constraint c must be an equality.");
+}
+
+PPL::Congruence::Congruence(const Constraint& c,
+                            dimension_type new_space_dimension,
+                            Representation r)
+  : expr(c.expression(), new_space_dimension, r),
+    modulus_(0) {
+  if (!c.is_equality())
+    throw_invalid_argument("Congruence(c, space_dim, r)",
+                           "constraint c must be an equality.");
+}
+
+void
+PPL::Congruence::sign_normalize() {
+  expr.sign_normalize();
+}
+
+void
+PPL::Congruence::normalize() {
+  PPL_ASSERT(OK());
+  sign_normalize();
+
+  if (modulus_ == 0)
+    return;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  c = expr.inhomogeneous_term();
+  // Factor the modulus out of the inhomogeneous term.
+  c %= modulus_;
+  if (c < 0)
+    // Make inhomogeneous term positive.
+    c += modulus_;
+  expr.set_inhomogeneous_term(c);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence::strong_normalize() {
+  normalize();
+  
+  Coefficient gcd = expr.gcd(0, expr.space_dimension() + 1);
+  if (gcd == 0)
+    gcd = modulus_;
+  else
+    gcd_assign(gcd, modulus_, gcd);
+  
+  if (gcd != 0 && gcd != 1) {
+    expr /= gcd;
+    modulus_ /= gcd;
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence::scale(Coefficient_traits::const_reference factor) {
+  if (factor == 1)
+    // Nothing to do.
+    return;
+  
+  expr *= factor;
+  modulus_ *= factor;
+}
+
+void
+PPL::Congruence
+::affine_preimage(Variable v, const Linear_Expression& e,
+                  Coefficient_traits::const_reference denominator) {
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  c = expr.get(v);
+
+  if (c == 0)
+    return;
+
+  scale(denominator);
+
+  expr.linear_combine(e, 1, c, 0, e.space_dimension() + 1);
+
+  if (v.space_dimension() > e.space_dimension() || e.get(v) == 0)
+    // Not invertible
+    expr.set(v, Coefficient_zero());
+  else {
+    c *= e.get(v);
+    expr.set(v, c);
+  }
+}
+
+PPL::Congruence
+PPL::Congruence::create(const Linear_Expression& e1,
+                        const Linear_Expression& e2,
+                        Representation r) {
+  Linear_Expression e(e1,
+                      std::max(e1.space_dimension(), e2.space_dimension()),
+                      r);
+  e -= e2;
+  return Congruence(e, 1, Recycle_Input());
+}
+
+void
+PPL::Congruence::throw_invalid_argument(const char* method,
+                                        const char* message) const {
+  std::ostringstream s;
+  s << "PPL::Congruence::" << method << ":" << std::endl
+    << message;
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Congruence::throw_dimension_incompatible(const char* method,
+                                              const char* v_name,
+                                              const Variable v) const {
+  std::ostringstream s;
+  s << "this->space_dimension() == " << space_dimension() << ", "
+    << v_name << ".space_dimension() == " << v.space_dimension() << ".";
+  const std::string str = s.str();
+  throw_invalid_argument(method, str.c_str());
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence& c) {
+  const dimension_type num_variables = c.space_dimension();
+  PPL_DIRTY_TEMP_COEFFICIENT(cv);
+  bool first = true;
+  const Congruence::expr_type c_e = c.expression();
+  for (Congruence::expr_type::const_iterator i = c_e.begin(),
+        i_end = c_e.lower_bound(Variable(num_variables)); i != i_end; ++i) {
+    cv = *i;
+    if (!first) {
+      if (cv > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(cv);
+      }
+    }
+    else
+      first = false;
+    if (cv == -1)
+      s << "-";
+    else if (cv != 1)
+      s << cv << "*";
+    s << i.variable();
+  }
+  if (first)
+    s << Coefficient_zero();
+  s << " = " << -c.inhomogeneous_term();
+  if (c.is_proper_congruence())
+    s << " (mod " << c.modulus() << ")";
+  return s;
+}
+
+bool
+PPL::Congruence::is_tautological() const {
+  if (is_equality())
+    return (inhomogeneous_term() == 0) && expr.all_homogeneous_terms_are_zero();
+  
+  return (inhomogeneous_term() % modulus() == 0) && expr.all_homogeneous_terms_are_zero();
+}
+
+bool
+PPL::Congruence::is_inconsistent() const {
+  if (is_equality())
+    return (inhomogeneous_term() != 0) && expr.all_homogeneous_terms_are_zero();
+  
+  return (inhomogeneous_term() % modulus() != 0) && expr.all_homogeneous_terms_are_zero();
+}
+
+void
+PPL::Congruence::ascii_dump(std::ostream& s) const {
+  expr.ascii_dump(s);
+  s << " m " << modulus_ << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence)
+
+bool
+PPL::Congruence::ascii_load(std::istream& s) {
+  expr.ascii_load(s);
+
+  std::string str;
+  if (!(s >> str) || str != "m")
+    return false;
+
+  if (!(s >> modulus_))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+bool
+PPL::Congruence::OK() const {
+  // Modulus check.
+  if (modulus() < 0) {
+#ifndef NDEBUG
+    std::cerr << "Congruence has a negative modulus " << modulus() << "."
+              << std::endl;
+#endif
+    return false;
+  }
+
+  // All tests passed.
+  return true;
+}
+
+const PPL::Congruence* PPL::Congruence::zero_dim_false_p = 0;
+const PPL::Congruence* PPL::Congruence::zero_dim_integrality_p = 0;
+
+void
+PPL::Congruence::initialize() {
+  PPL_ASSERT(zero_dim_false_p == 0);
+  zero_dim_false_p
+    = new Congruence((Linear_Expression::zero() %= Coefficient(-1)) / 0);
+
+  PPL_ASSERT(zero_dim_integrality_p == 0);
+  zero_dim_integrality_p
+    = new Congruence(Linear_Expression::zero() %= Coefficient(-1));
+}
+
+void
+PPL::Congruence::finalize() {
+  PPL_ASSERT(zero_dim_false_p != 0);
+  delete zero_dim_false_p;
+  zero_dim_false_p = 0;
+
+  PPL_ASSERT(zero_dim_integrality_p != 0);
+  delete zero_dim_integrality_p;
+  zero_dim_integrality_p = 0;
+}
diff --git a/src/Congruence_System.cc b/src/Congruence_System.cc
new file mode 100644
index 0000000..f4edb8f
--- /dev/null
+++ b/src/Congruence_System.cc
@@ -0,0 +1,471 @@
+/* Congruence_System class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence_System::Congruence_System(const Constraint_System& cs,
+                                          Representation r)
+  : rows(),
+    space_dimension_(cs.space_dimension()),
+    representation_(r) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      insert(*i);
+}
+
+void
+PPL::Congruence_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  for (dimension_type k = rows.size(); k-- > 0; ) {
+    Congruence& rows_k = rows[k];
+    rows_k.permute_space_dimensions(cycle);
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::remove_rows(const dimension_type first,
+                                    const dimension_type last,
+                                    bool keep_sorted) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= num_rows());
+  const dimension_type n = last - first;
+
+  // Swap the rows in [first, last) with the rows in [size() - n, size())
+  // (note that these intervals may not be disjunct).
+  if (keep_sorted) {
+    for (dimension_type i = last; i < rows.size(); ++i)
+      swap(rows[i], rows[i - n]);
+  }
+  else {
+    const dimension_type offset = rows.size() - n - first;
+    for (dimension_type i = first; i < last; ++i)
+      swap(rows[i], rows[i + offset]);
+  }
+
+  rows.resize(rows.size() - n);
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Congruence_System
+::set_space_dimension(const dimension_type new_space_dim) {
+  if (space_dimension() != new_space_dim) {
+    space_dimension_ = new_space_dim;
+    for (dimension_type i = num_rows(); i-- > 0; )
+      rows[i].set_space_dimension(new_space_dim);
+  }
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PPL::Congruence_System::swap_space_dimensions(Variable v1, Variable v2) {
+  for (dimension_type k = num_rows(); k-- > 0; )
+    rows[k].swap_space_dimensions(v1, v2);
+}
+
+void
+PPL::Congruence_System::insert_verbatim(Congruence& cg, Recycle_Input) {
+  // TODO: Remove this.
+  PPL_ASSERT(cg.OK());
+
+  cg.set_representation(representation());
+
+  if (cg.space_dimension() >= space_dimension())
+    set_space_dimension(cg.space_dimension());
+  else
+    cg.set_space_dimension(space_dimension());
+
+  rows.resize(num_rows() + 1);
+
+  swap(cg, rows.back());
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Constraint& c) {
+  if (c.space_dimension() > space_dimension())
+    set_space_dimension(c.space_dimension());
+  Congruence cg(c, space_dimension(), representation());
+  cg.strong_normalize();
+  rows.resize(num_rows() + 1);
+
+  swap(cg, rows.back());
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::insert(Congruence_System& cgs, Recycle_Input) {
+  const dimension_type old_num_rows = num_rows();
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  if (space_dimension() < cgs.space_dimension())
+    set_space_dimension(cgs.space_dimension());
+  rows.resize(old_num_rows + cgs_num_rows);
+  for (dimension_type i = cgs_num_rows; i-- > 0; ) {
+    cgs.rows[i].set_space_dimension(space_dimension());
+    cgs.rows[i].set_representation(representation());
+    swap(cgs.rows[i], rows[old_num_rows + i]);
+  }
+  cgs.clear();
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Congruence_System& y) {
+  Congruence_System& x = *this;
+
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type y_num_rows = y.num_rows();
+
+  // Grow to the required size.
+  if (space_dimension() < y.space_dimension())
+    set_space_dimension(y.space_dimension());
+
+  rows.resize(rows.size() + y_num_rows);
+
+  // Copy the rows of `y', with the new space dimension.
+  for (dimension_type i = y_num_rows; i-- > 0; ) {
+    Congruence copy(y[i], space_dimension(), representation());
+    swap(copy, x.rows[x_num_rows+i]);
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::normalize_moduli() {
+  const Congruence_System& cgs = *this;
+  dimension_type row = cgs.num_rows();
+  if (row > 0) {
+    // Calculate the LCM of all the moduli.
+    PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+    // Find last proper congruence.
+    while (true) {
+      --row;
+      lcm = cgs[row].modulus();
+      if (lcm > 0)
+        break;
+      if (row == 0)
+        // All rows are equalities.
+        return;
+    }
+    while (row > 0) {
+      --row;
+      const Coefficient& modulus = cgs[row].modulus();
+      if (modulus > 0)
+        lcm_assign(lcm, lcm, modulus);
+    }
+
+    // Represent every row using the LCM as the modulus.
+    PPL_DIRTY_TEMP_COEFFICIENT(factor);
+    for (row = num_rows(); row-- > 0; ) {
+      const Coefficient& modulus = cgs[row].modulus();
+      if (modulus <= 0 || modulus == lcm)
+        continue;
+      exact_div_assign(factor, lcm, modulus);
+      rows[row].scale(factor);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const {
+  return (*this) == cgs;
+}
+
+bool
+PPL::Congruence_System::has_linear_equalities() const {
+  const Congruence_System& cgs = *this;
+  for (dimension_type i = cgs.num_rows(); i-- > 0; )
+    if (cgs[i].modulus() == 0)
+      return true;
+  return false;
+}
+
+void
+PPL::Congruence_System::const_iterator::skip_forward() {
+  const Swapping_Vector<Congruence>::const_iterator csp_end = csp->end();
+  while (i != csp_end && (*this)->is_tautological())
+    ++i;
+}
+
+PPL::dimension_type
+PPL::Congruence_System::num_equalities() const {
+  const Congruence_System& cgs = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0 ; )
+    if (cgs[i].is_equality())
+      ++n;
+  return n;
+}
+
+PPL::dimension_type
+PPL::Congruence_System::num_proper_congruences() const {
+  const Congruence_System& cgs = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0 ; ) {
+    const Congruence& cg = cgs[i];
+    if (cg.is_proper_congruence())
+      ++n;
+  }
+  return n;
+}
+
+bool
+PPL::Congruence_System::
+satisfies_all_congruences(const Grid_Generator& g) const {
+  PPL_ASSERT(g.space_dimension() <= space_dimension());
+
+  const Congruence_System& cgs = *this;
+  PPL_DIRTY_TEMP_COEFFICIENT(sp);
+  if (g.is_line())
+    for (dimension_type i = cgs.num_rows(); i-- > 0; ) {
+      const Congruence& cg = cgs[i];
+      Scalar_Products::assign(sp, g, cg);
+      if (sp != 0)
+        return false;
+    }
+  else {
+    const Coefficient& divisor = g.divisor();
+    for (dimension_type i = cgs.num_rows(); i-- > 0; ) {
+      const Congruence& cg = cgs[i];
+      Scalar_Products::assign(sp, g, cg);
+      if (cg.is_equality()) {
+        if (sp != 0)
+          return false;
+      }
+      else if (sp % (cg.modulus() * divisor) != 0)
+        return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::Congruence_System::has_a_free_dimension() const {
+  // Search for a dimension that is free of any congruence or equality
+  // constraint.  Assumes a minimized system.
+  std::set<dimension_type> candidates;
+  for (dimension_type i = space_dimension(); i-- > 0; )
+    candidates.insert(i + 1);
+
+  for (dimension_type i = num_rows(); i-- > 0; ) {
+    rows[i].expression().has_a_free_dimension_helper(candidates);
+    if (candidates.empty())
+      return false;
+  }
+  return !candidates.empty();
+}
+
+void
+PPL::Congruence_System::
+affine_preimage(Variable v,
+                const Linear_Expression& expr,
+                Coefficient_traits::const_reference denominator) {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  PPL_ASSERT(expr.space_dimension() <= space_dimension());
+  PPL_ASSERT(denominator > 0);
+
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].affine_preimage(v, expr, denominator);
+}
+
+void
+PPL::Congruence_System::ascii_dump(std::ostream& s) const {
+  const Congruence_System& x = *this;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type x_space_dim = x.space_dimension();
+  s << x_num_rows << " x " << x_space_dim << " ";
+  Parma_Polyhedra_Library::ascii_dump(s, representation());
+  s << std::endl;
+  for (dimension_type i = 0; i < x_num_rows; ++i)
+    x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence_System)
+
+bool
+PPL::Congruence_System::ascii_load(std::istream& s) {
+  std::string str;
+  dimension_type num_rows;
+  dimension_type space_dim;
+  if (!(s >> num_rows))
+    return false;
+  if (!(s >> str) || str != "x")
+    return false;
+  if (!(s >> space_dim))
+    return false;
+  clear();
+  space_dimension_ = space_dim;
+
+  if (!Parma_Polyhedra_Library::ascii_load(s, representation_))
+    return false;
+
+  Congruence c;
+  for (dimension_type i = 0; i < num_rows; ++i) {
+    if (!c.ascii_load(s))
+      return false;
+    insert_verbatim(c, Recycle_Input());
+  }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+const PPL::Congruence_System* PPL::Congruence_System::zero_dim_empty_p = 0;
+
+void
+PPL::Congruence_System::initialize() {
+  PPL_ASSERT(zero_dim_empty_p == 0);
+  zero_dim_empty_p
+    = new Congruence_System(Congruence::zero_dim_false());
+}
+
+void
+PPL::Congruence_System::finalize() {
+  PPL_ASSERT(zero_dim_empty_p != 0);
+  delete zero_dim_empty_p;
+  zero_dim_empty_p = 0;
+}
+
+bool
+PPL::Congruence_System::OK() const {
+  // All rows must have space dimension `space_dimension()'
+  // and representation `representation()'.
+  for (dimension_type i = num_rows(); i-- > 0; ) {
+    const Congruence& cg = rows[i];
+    if (cg.space_dimension() != space_dimension())
+      return false;
+    if (cg.representation() != representation())
+      return false;
+    if (!cg.OK())
+      return false;
+  }
+  // All checks passed.
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence_System& cgs) {
+  Congruence_System::const_iterator i = cgs.begin();
+  const Congruence_System::const_iterator cgs_end = cgs.end();
+  if (i == cgs_end)
+    return s << "true";
+  while (true) {
+    Congruence cg = *i;
+    cg.strong_normalize();
+    s << cg;
+    ++i;
+    if (i == cgs_end)
+      return s;
+    s << ", ";
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+bool
+PPL::operator==(const Congruence_System& x, const Congruence_System& y) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  for (dimension_type i = x.num_rows(); i-- > 0; ) {
+    // NOTE: this also checks for space dimension.
+    if (x[i] != y[i])
+      return false;
+  }
+  return true;
+}
+
+void
+PPL::Congruence_System
+::add_unit_rows_and_space_dimensions(dimension_type dims) {
+  const dimension_type old_num_rows = num_rows();
+  set_space_dimension(space_dimension() + dims);
+
+  rows.resize(rows.size() + dims);
+
+  // Swap the added rows to the front of the vector.
+  for (dimension_type row = old_num_rows; row-- > 0; )
+    swap(rows[row], rows[row + dims]);
+
+  const dimension_type dim = space_dimension();
+  // Set the space dimension and the diagonal element of each added row.
+  for (dimension_type row = dims; row-- > 0; ) {
+    Linear_Expression expr(representation());
+    expr.set_space_dimension(space_dimension());
+    PPL_ASSERT(dim >= row + 1);
+    expr += Variable(dim - row - 1);
+    // This constructor steals the contents of `expr'.
+    Congruence cg(expr, Coefficient_zero(), Recycle_Input());
+    swap(rows[row], cg);
+  }
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Congruence_System::concatenate(const Congruence_System& y) {
+  // TODO: this implementation is just an executable specification.
+  Congruence_System cgs = y;
+
+  const dimension_type added_rows = cgs.num_rows();
+  const dimension_type added_columns = cgs.space_dimension();
+
+  const dimension_type old_num_rows = num_rows();
+  const dimension_type old_space_dim = space_dimension();
+
+  set_space_dimension(space_dimension() + added_columns);
+
+  rows.resize(rows.size() + added_rows);
+
+  // Move the congruences into *this from `cgs', shifting the
+  // coefficients along into the appropriate columns.
+  for (dimension_type i = added_rows; i-- > 0; ) {
+    Congruence& cg_old = cgs.rows[i];
+    Congruence& cg_new = rows[old_num_rows + i];
+    cg_old.set_representation(representation());
+    cg_old.shift_space_dimensions(Variable(0), old_space_dim);
+    swap(cg_old, cg_new);
+  }
+}
diff --git a/src/Congruence_System_defs.hh b/src/Congruence_System_defs.hh
new file mode 100644
index 0000000..18296dc
--- /dev/null
+++ b/src/Congruence_System_defs.hh
@@ -0,0 +1,544 @@
+/* Congruence_System class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_System_defs_hh
+#define PPL_Congruence_System_defs_hh 1
+
+#include "Congruence_System_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Swapping_Vector_defs.hh"
+#include "Congruence_defs.hh"
+#include "Constraint_System_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+}
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+    When inserting congruences in a system, space dimensions are
+    automatically adjusted so that all the congruences in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of congruences corresponding to
+    an integer grid in \f$\Rset^2\f$:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert(y %= 0);
+    \endcode
+    Note that:
+    the congruence system is created with space dimension zero;
+    the first and second congruence insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding to the congruence system of the previous example,
+    the congruence \f$x + y = 1 \pmod{2}\f$:
+    \code
+  cgs.insert((x + y %= 1) / 2);
+    \endcode
+    we obtain the grid containing just those integral
+    points where the sum of the \p x and \p y values is odd.
+
+    \par Example 3
+    The following code builds a system of congruences corresponding to
+    the grid in \f$\Zset^2\f$ containing just the integral points on
+    the \p x axis:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert((y %= 0) / 0);
+    \endcode
+
+    \note
+    After inserting a multiset of congruences in a congruence system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> congruence system
+    will be available, where original congruences may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System {
+public:
+
+  typedef Congruence row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of congruences.
+  explicit Congruence_System(Representation r = default_representation);
+
+  //! Builds an empty (i.e. zero rows) system of dimension \p d.
+  explicit Congruence_System(dimension_type d,
+                             Representation r = default_representation);
+
+  //! Builds the singleton system containing only congruence \p cg.
+  explicit Congruence_System(const Congruence& cg,
+                             Representation r = default_representation);
+
+  /*! \brief
+    If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+    singleton system containing only constraint \f$ e_1 = e_2
+    \pmod{0}\f$.
+
+    \exception std::invalid_argument
+    Thrown if \p c is not an equality constraint.
+  */
+  explicit Congruence_System(const Constraint& c,
+                             Representation r = default_representation);
+
+  //! Builds a system containing copies of any equalities in \p cs.
+  explicit Congruence_System(const Constraint_System& cs,
+                             Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note
+    The new Congruence_System will have the same Representation as `cgs'
+    so that it's indistinguishable from `cgs'.
+  */
+  Congruence_System(const Congruence_System& cgs);
+
+  //! Copy constructor with specified representation.
+  Congruence_System(const Congruence_System& cgs, Representation r);
+
+  //! Destructor.
+  ~Congruence_System();
+
+  //! Assignment operator.
+  Congruence_System& operator=(const Congruence_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Congruence_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+    to \p y.
+  */
+  bool is_equal_to(const Congruence_System& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more linear equalities.
+  */
+  bool has_linear_equalities() const;
+
+  //! Removes all the congruences and sets the space dimension to 0.
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruence \p cg, increasing the
+    number of space dimensions if needed.
+
+    The copy of \p cg will be strongly normalized after being
+    inserted.
+  */
+  void insert(const Congruence& cg);
+
+  /*! \brief
+    Inserts in \p *this the congruence \p cg, stealing its contents and
+    increasing the number of space dimensions if needed.
+
+    \p cg will be strongly normalized.
+  */
+  void insert(Congruence& cg, Recycle_Input);
+
+  /*! \brief
+    Inserts in \p *this a copy of the equality constraint \p c, seen
+    as a modulo 0 congruence, increasing the number of space
+    dimensions if needed.
+
+    The modulo 0 congruence will be strongly normalized after being
+    inserted.
+
+    \exception std::invalid_argument
+    Thrown if \p c is a relational constraint.
+  */
+  void insert(const Constraint& c);
+
+  // TODO: Consider adding a insert(cg, Recycle_Input).
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruences in \p y,
+    increasing the number of space dimensions if needed.
+
+    The inserted copies will be strongly normalized.
+  */
+  void insert(const Congruence_System& y);
+
+  /*! \brief
+    Inserts into \p *this the congruences in \p cgs, increasing the
+    number of space dimensions if needed.
+  */
+  void insert(Congruence_System& cgs, Recycle_Input);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the system containing only Congruence::zero_dim_false().
+  static const Congruence_System& zero_dim_empty();
+
+  //! An iterator over a system of congruences.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each congruence contained in an object of Congruence_System.
+
+    \par Example
+    The following code prints the system of congruences
+    defining the grid <CODE>gr</CODE>:
+    \code
+  const Congruence_System& cgs = gr.congruences();
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+                           Congruence,
+                           ptrdiff_t,
+                           const Congruence*,
+                           const Congruence&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Congruence& operator*() const;
+
+    //! Indirect member selector.
+    const Congruence* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Congruence_System;
+
+    //! The const iterator over the vector of congruences.
+    Swapping_Vector<Congruence>::const_iterator i;
+
+    //! A const pointer to the vector of congruences.
+    const Swapping_Vector<Congruence>* csp;
+
+    //! Constructor.
+    const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+                   const Congruence_System& cgs);
+
+    //! \p *this skips to the next non-trivial congruence.
+    void skip_forward();
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no congruences.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first congruence, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if all rows have space dimension
+    space_dimension_, each row in the system is a valid Congruence and the
+    space dimension is consistent with the number of congruences.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the number of equalities.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of proper congruences.
+  dimension_type num_proper_congruences() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Congruence_System& y);
+
+  /*! \brief
+    Adds \p dims rows and \p dims space dimensions to the matrix,
+    initializing the added rows as in the unit congruence system.
+
+    \param dims
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+    (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{A} \genfrac{}{}{0pt}{}{B}{A}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{1} \genfrac{}{}{0pt}{}{1}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_unit_rows_and_space_dimensions(dimension_type dims);
+
+  //! Permutes the space dimensions of the system.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Sets the number of space dimensions to \p new_space_dim.
+  /*!
+    If \p new_space_dim is lower than the current space dimension, the
+    coefficients referring to the removed space dimensions are lost.
+  */
+  bool set_space_dimension(dimension_type new_space_dim);
+
+  // Note: the following method is protected to allow tests/Grid/congruences2
+  // to call it using a derived class.
+protected:
+  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+  bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+  //! Returns the number of rows in the system.
+  dimension_type num_rows() const;
+
+  //! Returns \c true if num_rows()==0.
+  bool has_no_rows() const;
+
+  //! Returns a constant reference to the \p k- th congruence of the system.
+  const Congruence& operator[](dimension_type k) const;
+
+  //! Adjusts all expressions to have the same moduli.
+  void normalize_moduli();
+
+  /*! \brief
+    Substitutes a given column of coefficients by a given affine
+    expression.
+
+    \param v
+    Index of the column to which the affine transformation is
+    substituted;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations) to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its default value
+    is 1.
+
+    The affine transformation substitutes the matrix of congruences
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(Variable v,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator);
+
+  // TODO: Consider making this private.
+  /*! \brief
+    Concatenates copies of the congruences from \p y onto \p *this.
+
+    \param y
+    The congruence system to append to \p this.  The number of rows in
+    \p y must be strictly positive.
+
+    The matrix for the new system of congruences is obtained by
+    leaving the old system in the upper left-hand side and placing the
+    congruences of \p y in the lower right-hand side, and padding
+    with zeroes.
+  */
+  void concatenate(const Congruence_System& y);
+
+  /*! \brief
+    Inserts in \p *this the congruence \p cg, stealing its contents and
+    increasing the number of space dimensions if needed.
+
+    This method inserts \p cg in the given form, instead of first strong
+    normalizing \p cg as \ref insert would do.
+  */
+  void insert_verbatim(Congruence& cg, Recycle_Input);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    If \p keep_sorted is <CODE>true</CODE>, the ordering of the remaining rows
+    will be preserved.
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                   bool keep_sorted);
+
+  void remove_trailing_rows(dimension_type n);
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Congruence::zero_dim_false().
+  */
+  static const Congruence_System* zero_dim_empty_p;
+
+  Swapping_Vector<Congruence> rows;
+
+  dimension_type space_dimension_;
+
+  Representation representation_;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if any of the dimensions in
+    \p *this is free of constraint.
+
+    Any equality or proper congruence affecting a dimension constrains
+    that dimension.
+
+    This method assumes the system is in minimal form.
+  */
+  bool has_a_free_dimension() const;
+
+  friend class Grid;
+
+  friend bool
+  operator==(const Congruence_System& x, const Congruence_System& y);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Congruence_System
+  Writes <CODE>true</CODE> if \p cgs is empty.  Otherwise, writes on
+  \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+/*! \relates Congruence_System */
+void
+swap(Congruence_System& x, Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Congruence_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Congruence_System_defs_hh)
diff --git a/src/Congruence_System_inlines.hh b/src/Congruence_System_inlines.hh
new file mode 100644
index 0000000..c63fb1f
--- /dev/null
+++ b/src/Congruence_System_inlines.hh
@@ -0,0 +1,272 @@
+/* Congruence_System class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_System_inlines_hh
+#define PPL_Congruence_System_inlines_hh 1
+
+#include "Congruence_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+  return rows[k];
+}
+
+inline dimension_type
+Congruence_System::num_rows() const {
+  return rows.size();
+}
+
+inline bool
+Congruence_System::has_no_rows() const {
+  return num_rows() == 0;
+}
+
+inline void
+Congruence_System::remove_trailing_rows(dimension_type n) {
+  PPL_ASSERT(num_rows() >= n);
+  rows.resize(num_rows() - n);
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+  Congruence tmp = cg;
+  insert(tmp, Recycle_Input());
+}
+
+inline void
+Congruence_System::insert(Congruence& cg, Recycle_Input) {
+  PPL_ASSERT(cg.OK());
+  cg.strong_normalize();
+  PPL_ASSERT(cg.OK());
+  insert_verbatim(cg, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+inline
+Congruence_System::Congruence_System(Representation r)
+  : rows(),
+    space_dimension_(0),
+    representation_(r) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg, Representation r)
+  : rows(),
+    space_dimension_(0),
+    representation_(r) {
+  insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c, Representation r)
+  : rows(),
+    space_dimension_(0),
+    representation_(r) {
+  insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs)
+  : rows(cgs.rows),
+    space_dimension_(cgs.space_dimension_),
+    representation_(cgs.representation_) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs,
+                                     Representation r)
+  : rows(cgs.rows),
+    space_dimension_(cgs.space_dimension_),
+    representation_(r) {
+  if (cgs.representation() != r) {
+    for (dimension_type i = 0; i < num_rows(); ++i)
+      rows[i].set_representation(representation());
+  }
+}
+
+inline
+Congruence_System::Congruence_System(const dimension_type d, Representation r)
+  : rows(),
+    space_dimension_(d),
+    representation_(r) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+  Congruence_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Representation
+Congruence_System::representation() const {
+  return representation_;
+}
+
+inline void
+Congruence_System::set_representation(Representation r) {
+  if (representation_ == r)
+    return;
+  representation_ = r;
+  for (dimension_type i = 0; i < num_rows(); ++i)
+    rows[i].set_representation(r);
+  PPL_ASSERT(OK());
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+  return Congruence::max_space_dimension();
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+  return space_dimension_;
+}
+
+inline void
+Congruence_System::clear() {
+  rows.clear();
+  space_dimension_ = 0;
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+  PPL_ASSERT(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+               const Congruence_System& cgs)
+  : i(iter), csp(&cgs.rows) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+  const_iterator i(rows.begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+  const const_iterator i(rows.end(), *this);
+  return i;
+}
+
+inline bool
+Congruence_System::empty() const {
+  return begin() == end();
+}
+
+inline void
+Congruence_System::m_swap(Congruence_System& y) {
+  using std::swap;
+  swap(rows, y.rows);
+  swap(space_dimension_, y.space_dimension_);
+  swap(representation_, y.representation_);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(y.OK());
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+  return rows.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+  return rows.external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Congruence_System */
+inline void
+swap(Congruence_System& x, Congruence_System& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Congruence_System_inlines_hh)
diff --git a/src/Congruence_System_types.hh b/src/Congruence_System_types.hh
new file mode 100644
index 0000000..0e3e919
--- /dev/null
+++ b/src/Congruence_System_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Congruence_System_types_hh
+#define PPL_Congruence_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+#endif // !defined(PPL_Congruence_System_types_hh)
diff --git a/src/Congruence_defs.hh b/src/Congruence_defs.hh
new file mode 100644
index 0000000..92e0045
--- /dev/null
+++ b/src/Congruence_defs.hh
@@ -0,0 +1,506 @@
+/* Congruence class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_defs_hh
+#define PPL_Congruence_defs_hh 1
+
+#include "Congruence_types.hh"
+
+#include "Coefficient_defs.hh"
+#include "Variable_defs.hh"
+
+#include "Constraint_types.hh"
+#include "Grid_types.hh"
+#include "Scalar_Products_types.hh"
+#include "Linear_Expression_defs.hh"
+#include "Expression_Adapter_defs.hh"
+
+#include <iosfwd>
+#include <vector>
+
+// These are declared here because they are friend of Congruence.
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Congruence is a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+
+  \par How to build a congruence
+  Congruences \f$\pmod{1}\f$ are typically built by
+  applying the congruence symbol `<CODE>\%=</CODE>'
+  to a pair of linear expressions.
+  Congruences with modulus \p m
+  are typically constructed by building a congruence \f$\pmod{1}\f$
+  using the given pair of linear expressions
+  and then adding the modulus \p m
+  using the modulus symbol is `<CODE>/</CODE>'.
+
+  The space dimension of a congruence is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality congruence
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod1_cg(4*x %= 2*y - 13);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+  \endcode
+  An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Congruence false_cg = Congruence::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+  Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+  \endcode
+  In contrast, the following code defines an unsatisfiable congruence
+  having space dimension \f$3\f$:
+  \code
+  Congruence false_cg3((0*z %= 1) / 0);
+  \endcode
+
+  \par How to inspect a congruence
+  Several methods are provided to examine a congruence and extract
+  all the encoded information: its space dimension, its modulus
+  and the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access the modulus
+  as well as each of the coefficients.
+  Given a congruence with linear expression \p e and modulus \p m
+  (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+  congruence with the same modulus \p m but where the linear
+  expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+  \code
+  Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+  cout << "Congruence cg1: " << cg1 << endl;
+  const Coefficient& m = cg1.modulus();
+  if (m == 0)
+    cout << "Congruence cg1 is an equality." << endl;
+  else {
+    Linear_Expression e;
+    for (dimension_type i = cg1.space_dimension(); i-- > 0; )
+      e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+      e += 2 * cg1.inhomogeneous_term();
+    Congruence cg2((e %= 0) / m);
+    cout << "Congruence cg2: " << cg2 << endl;
+  }
+  \endcode
+  The actual output could be the following:
+  \code
+  Congruence cg1: A - 5*B + 3*C %= 4 / 5
+  Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence {
+public:
+
+  //! The representation used for new Congruences.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Constructs the 0 = 0 congruence with space dimension \p 0 .
+  explicit Congruence(Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note The new Congruence will have the same representation as `cg',
+          not default_representation, so that they are indistinguishable.
+  */
+  Congruence(const Congruence& cg);
+
+  //! Copy constructor with specified representation.
+  Congruence(const Congruence& cg, Representation r);
+
+  //! Copy-constructs (modulo 0) from equality constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p c is an inequality.
+  */
+  explicit Congruence(const Constraint& c,
+                      Representation r = default_representation);
+
+  //! Destructor.
+  ~Congruence();
+
+  //! Assignment operator.
+  Congruence& operator=(const Congruence& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Congruence can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  void permute_space_dimensions(const std::vector<Variable>& cycles);
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Adapter_Transparent<Linear_Expression> expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns a const reference to the modulus of \p *this.
+  Coefficient_traits::const_reference modulus() const;
+
+  //! Sets the modulus of \p *this to \p m .
+  //! If \p m is 0, the congruence becomes an equality.
+  void set_modulus(Coefficient_traits::const_reference m);
+
+  //! Multiplies all the coefficients, including the modulus, by \p factor .
+  void scale(Coefficient_traits::const_reference factor);
+
+  // TODO: Document this.
+  void affine_preimage(Variable v,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator);
+
+  //! Multiplies \p k into the modulus of \p *this.
+  /*!
+    If called with \p *this representing the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then it returns with *this representing
+    the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence&
+  operator/=(Coefficient_traits::const_reference k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a tautology
+    (i.e., an always true congruence).
+
+    A tautological congruence has one the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b = 0 \pmod{m}\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false congruence).
+
+    An inconsistent congruence has one of the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+      where \f$b \neq 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b \neq 0 \pmod{m}\f$.
+  */
+  bool is_inconsistent() const;
+
+  //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+  /*!
+    A congruence with a modulus of 0 is a linear equality.
+  */
+  bool is_proper_congruence() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is an equality.
+  /*!
+    A modulus of zero denotes a linear equality.
+  */
+  bool is_equality() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns a reference to the true (zero-dimension space) congruence
+    \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+    congruence</EM>.
+  */
+  static const Congruence& zero_dim_integrality();
+
+  /*! \brief
+    Returns a reference to the false (zero-dimension space) congruence
+    \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence& zero_dim_false();
+
+  //! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e1, const Linear_Expression& e2,
+         Representation r = default_representation);
+
+  //! Returns the congruence \f$e = n \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e, Coefficient_traits::const_reference n,
+         Representation r = default_representation);
+
+  //! Returns the congruence \f$n = e \pmod{1}\f$.
+  static Congruence
+  create(Coefficient_traits::const_reference n, const Linear_Expression& e,
+         Representation r = default_representation);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Congruence& y);
+
+  //! Copy-constructs with the specified space dimension.
+  /*!
+    \note The new Congruence will have the same representation as `cg',
+          not default_representation, for consistency with the copy
+          constructor.
+  */
+  Congruence(const Congruence& cg, dimension_type new_space_dimension);
+
+  //! Copy-constructs with the specified space dimension and representation.
+  Congruence(const Congruence& cg, dimension_type new_space_dimension,
+             Representation r);
+
+  //! Copy-constructs from a constraint, with the specified space dimension
+  //! and (optional) representation.
+  Congruence(const Constraint& cg, dimension_type new_space_dimension,
+             Representation r = default_representation);
+
+  //! Constructs from Linear_Expression \p le, using modulus \p m.
+  /*!
+    Builds a congruence with modulus \p m, stealing the coefficients
+    from \p le.
+
+    \note The new Congruence will have the same representation as `le'.
+
+    \param le
+    The Linear_Expression holding the coefficients.
+
+    \param m
+    The modulus for the congruence, which must be zero or greater.
+  */
+  Congruence(Linear_Expression& le,
+             Coefficient_traits::const_reference m, Recycle_Input);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Sets the space dimension by \p n , adding or removing coefficients as
+  //! needed.
+  void set_space_dimension(dimension_type n);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Normalizes the signs.
+  /*!
+    The signs of the coefficients and the inhomogeneous term are
+    normalized, leaving the first non-zero homogeneous coefficient
+    positive.
+  */
+  void sign_normalize();
+
+  //! Normalizes signs and the inhomogeneous term.
+  /*!
+    Applies sign_normalize, then reduces the inhomogeneous term to the
+    smallest possible positive number.
+  */
+  void normalize();
+
+  //! Calls normalize, then divides out common factors.
+  /*!
+    Strongly normalized Congruences have equivalent semantics if and
+    only if they have the same syntax (as output by operator<<).
+  */
+  void strong_normalize();
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the false (zero-dimension space) congruence \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+    also known as the <EM>integrality congruence</EM>.
+  */
+  static const Congruence* zero_dim_integrality_p;
+
+  Linear_Expression expr;
+
+  Coefficient modulus_;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+    dimension \p v.
+  */
+  bool is_equal_at_dimension(Variable v,
+                             const Congruence& cg) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* v_name,
+                               Variable v) const;
+
+  friend bool
+  operator==(const Congruence& x, const Congruence& y);
+
+  friend bool
+  operator!=(const Congruence& x, const Congruence& y);
+
+  friend class Scalar_Products;
+  friend class Grid;
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+} // namespace IO_Operators
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m);
+
+/*! \relates Congruence */
+void
+swap(Congruence& x, Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Congruence_inlines.hh"
+
+#endif // !defined(PPL_Congruence_defs_hh)
diff --git a/src/Congruence_inlines.hh b/src/Congruence_inlines.hh
new file mode 100644
index 0000000..77e7246
--- /dev/null
+++ b/src/Congruence_inlines.hh
@@ -0,0 +1,281 @@
+/* Congruence class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Congruence_inlines_hh
+#define PPL_Congruence_inlines_hh 1
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(Representation r)
+  : expr(r) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg)
+  : expr(cg.expr), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg, Representation r)
+  : expr(cg.expr, r), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+                       dimension_type new_space_dimension)
+  : expr(cg.expr, new_space_dimension), modulus_(cg.modulus_) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+                       dimension_type new_space_dimension,
+                       Representation r)
+  : expr(cg.expr, new_space_dimension, r), modulus_(cg.modulus_) {
+  PPL_ASSERT(OK());
+}
+
+inline Representation
+Congruence::representation() const {
+  return expr.representation();
+}
+
+inline void
+Congruence::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline Congruence::expr_type
+Congruence::expression() const {
+  return expr_type(expr);
+}
+
+inline void
+Congruence::set_space_dimension(dimension_type n) {
+  expr.set_space_dimension(n);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Congruence::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+                       Coefficient_traits::const_reference m,
+                       Recycle_Input)
+  : modulus_(m) {
+  PPL_ASSERT(m >= 0);
+  swap(expr, le);
+
+  PPL_ASSERT(OK());
+}
+
+inline Congruence
+Congruence::create(const Linear_Expression& e,
+                   Coefficient_traits::const_reference n,
+                   Representation r) {
+  Linear_Expression diff(e, r);
+  diff -= n;
+  const Congruence cg(diff, 1, Recycle_Input());
+  return cg;
+}
+
+inline Congruence
+Congruence::create(Coefficient_traits::const_reference n,
+                   const Linear_Expression& e,
+                   Representation r) {
+  Linear_Expression diff(e, r);
+  diff -= n;
+  const Congruence cg(diff, 1, Recycle_Input());
+  return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return Congruence::create(e1, e2);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return Congruence::create(e, n);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k) {
+  Congruence ret = cg;
+  ret /= k;
+  return ret;
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+  return *zero_dim_integrality_p;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+  return *zero_dim_false_p;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& y) {
+  Congruence tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m) {
+  Congruence ret(c);
+  ret /= m;
+  return ret;
+}
+
+inline Congruence&
+Congruence::operator/=(Coefficient_traits::const_reference k) {
+  if (k >= 0)
+    modulus_ *= k;
+  else
+    modulus_ *= -k;
+  return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+  if (x.space_dimension() != y.space_dimension())
+    return false;
+  Congruence x_temp(x);
+  Congruence y_temp(y);
+  x_temp.strong_normalize();
+  y_temp.strong_normalize();
+  return x_temp.expr.is_equal_to(y_temp.expr)
+    && x_temp.modulus() == y_temp.modulus();
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+  return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+  return Linear_Expression::max_space_dimension();
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+  return expr.space_dimension();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline void
+Congruence::permute_space_dimensions(const std::vector<Variable>& cycles) {
+  expr.permute_space_dimensions(cycles);
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+  return expr.inhomogeneous_term();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+  return modulus_;
+}
+
+inline void
+Congruence::set_modulus(Coefficient_traits::const_reference m) {
+  modulus_ = m;
+  PPL_ASSERT(OK());
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+  return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+  return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(Variable v,
+                                  const Congruence& cg) const {
+  return coefficient(v) * cg.modulus() == cg.coefficient(v) * modulus();
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes()
+         + Parma_Polyhedra_Library::external_memory_in_bytes(modulus_);
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Congruence::m_swap(Congruence& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(modulus_, y.modulus_);
+}
+
+inline void
+Congruence::swap_space_dimensions(Variable v1, Variable v2) {
+  expr.swap_space_dimensions(v1, v2);
+}
+
+/*! \relates Congruence */
+inline void
+swap(Congruence& x, Congruence& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Congruence_inlines_hh)
diff --git a/src/Congruence_types.hh b/src/Congruence_types.hh
new file mode 100644
index 0000000..5cc5e09
--- /dev/null
+++ b/src/Congruence_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Congruence_types_hh
+#define PPL_Congruence_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+#endif // !defined(PPL_Congruence_types_hh)
diff --git a/src/Constant_Floating_Point_Expression_defs.hh b/src/Constant_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..26906dd
--- /dev/null
+++ b/src/Constant_Floating_Point_Expression_defs.hh
@@ -0,0 +1,173 @@
+/* Declarations for the Constant_Floating_Point_Expression class and
+   its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constant_Floating_Point_Expression_defs_hh
+#define PPL_Constant_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Constant_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Constant_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Constant Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of floating-point constant expressions
+
+  The linearization of a constant floating point expression results in a
+  linear form consisting of only the inhomogeneous term
+  \f$[l, u]\f$, where \f$l\f$ and \f$u\f$ are the lower
+  and upper bounds of the constant value given to the class constructor.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the constant floating point
+    expression from a \p lower_bound and an \p upper_bound of its
+    value in the concrete domain.
+  */
+  Constant_Floating_Point_Expression(const boundary_type lower_bound,
+                                     const boundary_type upper_bound);
+
+  /*! \brief
+    Builds a constant floating point expression with the value
+    expressed by the string \p str_value.
+  */
+  Constant_Floating_Point_Expression(const char* str_value);
+
+  //! Destructor.
+  ~Constant_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    See the class description for an explanation of how \p result is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Constant_Floating_Point_Expression& y);
+
+private:
+
+  FP_Interval_Type value;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Constant_Floating_Point_Expression(
+                          const Constant_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+  Constant_Floating_Point_Expression& operator=(
+                          const Constant_Floating_Point_Expression& y);
+
+}; // class Constant_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Constant_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Constant_Floating_Point_Expression_defs_hh)
diff --git a/src/Constant_Floating_Point_Expression_inlines.hh b/src/Constant_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..5e138d2
--- /dev/null
+++ b/src/Constant_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,80 @@
+/* Constant_Floating_Point_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constant_Floating_Point_Expression_inlines_hh
+#define PPL_Constant_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const char* str_value)
+  : value(str_value) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const boundary_type lb,
+                                   const boundary_type ub) {
+  assert(lb <= ub);
+  value.build(i_constraint(GREATER_OR_EQUAL, lb),
+              i_constraint(LESS_OR_EQUAL, ub));
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Constant_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Constant_Floating_Point_Expression& y) {
+  using std::swap;
+  swap(value, y.value);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+            const FP_Linear_Form_Abstract_Store&,
+            FP_Linear_Form& result) const {
+  result = FP_Linear_Form(value);
+  return true;
+}
+
+/*! \relates Constant_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constant_Floating_Point_Expression_inlines_hh)
diff --git a/src/Constant_Floating_Point_Expression_types.hh b/src/Constant_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..72ab45f
--- /dev/null
+++ b/src/Constant_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constant_Floating_Point_Expression_types_hh
+#define PPL_Constant_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constant_Floating_Point_Expression_types_hh)
diff --git a/src/Constraint.cc b/src/Constraint.cc
new file mode 100644
index 0000000..f1e5b44
--- /dev/null
+++ b/src/Constraint.cc
@@ -0,0 +1,460 @@
+/* Constraint class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Constraint_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Congruence_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Constraint::throw_invalid_argument(const char* method,
+                                        const char* message) const {
+  std::ostringstream s;
+  s << "PPL::Constraint::" << method << ":" << std::endl
+    << message;
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Constraint::throw_dimension_incompatible(const char* method,
+                                              const char* name_var,
+                                              const Variable v) const {
+  std::ostringstream s;
+  s << "PPL::Constraint::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << name_var << ".space_dimension() == " << v.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::Constraint
+PPL::Constraint::construct_epsilon_geq_zero() {
+  Linear_Expression e;
+  Constraint c(e, NONSTRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+  c.set_epsilon_coefficient(Coefficient_one());
+  PPL_ASSERT(c.OK());
+  return c;
+}
+
+PPL::Constraint::Constraint(const Congruence& cg, Representation r)
+  : expr(cg.expression(), r),
+    kind_(LINE_OR_EQUALITY),
+    topology_(NECESSARILY_CLOSED) {
+  if (!cg.is_equality())
+    throw_invalid_argument("Constraint(cg)",
+                           "congruence cg must be an equality.");
+  // Enforce normalization.
+  strong_normalize();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Constraint::swap_space_dimensions(Variable v1, Variable v2) {
+  PPL_ASSERT(v1.space_dimension() <= space_dimension());
+  PPL_ASSERT(v2.space_dimension() <= space_dimension());
+  expr.swap_space_dimensions(v1, v2);
+  // *this is still normalized but it may not be strongly normalized.
+  sign_normalize();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Constraint
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  if (cycle.size() < 2)
+    // No-op. No need to call sign_normalize().
+    return;
+
+  expr.permute_space_dimensions(cycle);
+  // *this is still normalized but may be not strongly normalized:
+  // sign normalization is necessary.
+  sign_normalize();
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Constraint::is_tautological() const {
+  if (expr.all_homogeneous_terms_are_zero())
+    if (is_equality())
+      return expr.inhomogeneous_term() == 0;
+    else
+      // Non-strict inequality constraint.
+      return expr.inhomogeneous_term() >= 0;
+  else
+    // There is a non-zero homogeneous coefficient.
+    if (is_necessarily_closed())
+      return false;
+    else {
+      // The constraint is NOT necessarily closed.
+      const int eps_sign = sgn(epsilon_coefficient());
+      if (eps_sign > 0)
+        // We have found the constraint epsilon >= 0.
+        return true;
+      if (eps_sign == 0)
+        // One of the `true' dimensions has a non-zero coefficient.
+        return false;
+      else {
+        // Here the epsilon coefficient is negative: strict inequality.
+        if (expr.inhomogeneous_term() <= 0)
+          // A strict inequality such as `lhs - k > 0',
+          // where k is a non negative integer, cannot be trivially true.
+          return false;
+        // Checking for another non-zero coefficient.
+        // If the check succeeds, we have the inequality `k > 0',
+        // where k is a positive integer.
+        return expression().all_homogeneous_terms_are_zero();
+      }
+    }
+}
+
+bool
+PPL::Constraint::is_inconsistent() const {
+  if (expr.all_homogeneous_terms_are_zero())
+    // The inhomogeneous term is the only non-zero coefficient.
+    if (is_equality())
+      return expr.inhomogeneous_term() != 0;
+    else
+      // Non-strict inequality constraint.
+      return expr.inhomogeneous_term() < 0;
+  else
+    // There is a non-zero homogeneous coefficient.
+    if (is_necessarily_closed())
+      return false;
+    else {
+      // The constraint is NOT necessarily closed.
+      if (epsilon_coefficient() >= 0)
+        // If positive, we have found the constraint epsilon >= 0.
+        // If zero, one of the `true' dimensions has a non-zero coefficient.
+        // In both cases, it is not trivially false.
+        return false;
+      else {
+        // Here the epsilon coefficient is negative: strict inequality.
+        if (expr.inhomogeneous_term() > 0)
+          // A strict inequality such as `lhs + k > 0',
+          // where k is a positive integer, cannot be trivially false.
+          return false;
+        // Checking for another non-zero coefficient.
+        // If the check succeeds, we have the inequality `k > 0',
+        // where k is a positive integer.
+        return expression().all_homogeneous_terms_are_zero();
+      }
+    }
+}
+
+void
+PPL::Constraint::linear_combine(const Constraint& y, dimension_type i) {
+  expr.linear_combine(y.expr, i);
+  strong_normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+int
+PPL::compare(const Constraint& x, const Constraint& y) {
+  const bool x_is_line_or_equality = x.is_line_or_equality();
+  const bool y_is_line_or_equality = y.is_line_or_equality();
+  if (x_is_line_or_equality != y_is_line_or_equality)
+    // Equalities (lines) precede inequalities (ray/point).
+    return y_is_line_or_equality ? 2 : -2;
+
+  return compare(x.expr, y.expr);
+}
+
+bool
+PPL::Constraint::is_equivalent_to(const Constraint& y) const {
+  const Constraint& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  const Type x_type = x.type();
+  if (x_type != y.type()) {
+    // Check for special cases.
+    if (x.is_tautological())
+      return y.is_tautological();
+    else
+      return x.is_inconsistent() && y.is_inconsistent();
+  }
+
+  if (x_type == STRICT_INEQUALITY) {
+    // Due to the presence of epsilon-coefficients, syntactically
+    // different strict inequalities may actually encode the same
+    // topologically open half-space.
+    // First, drop the epsilon-coefficient ...
+    Linear_Expression x_expr(x.expression());
+    Linear_Expression y_expr(y.expression());
+    // ... then, re-normalize ...
+    x_expr.normalize();
+    y_expr.normalize();
+    // ... and finally check for syntactic equality.
+    return x_expr.is_equal_to(y_expr);
+  }
+
+  // `x' and 'y' are of the same type and they are not strict inequalities;
+  // thus, the epsilon-coefficient, if present, is zero.
+  // It is sufficient to check for syntactic equality.
+  return x.expr.is_equal_to(y.expr);
+}
+
+bool
+PPL::Constraint::is_equal_to(const Constraint& y) const {
+  return expr.is_equal_to(y.expr) && kind_ == y.kind_ && topology() == y.topology();
+}
+
+void
+PPL::Constraint::sign_normalize() {
+  if (is_line_or_equality())
+    expr.sign_normalize();
+}
+
+bool
+PPL::Constraint::check_strong_normalized() const {
+  Constraint tmp = *this;
+  tmp.strong_normalize();
+  return compare(*this, tmp) == 0;
+}
+
+const PPL::Constraint* PPL::Constraint::zero_dim_false_p = 0;
+const PPL::Constraint* PPL::Constraint::zero_dim_positivity_p = 0;
+const PPL::Constraint* PPL::Constraint::epsilon_geq_zero_p = 0;
+const PPL::Constraint* PPL::Constraint::epsilon_leq_one_p = 0;
+
+void
+PPL::Constraint::initialize() {
+  PPL_ASSERT(zero_dim_false_p == 0);
+  zero_dim_false_p
+    = new Constraint(Linear_Expression::zero() == Coefficient_one());
+
+  PPL_ASSERT(zero_dim_positivity_p == 0);
+  zero_dim_positivity_p
+    = new Constraint(Linear_Expression::zero() <= Coefficient_one());
+
+  PPL_ASSERT(epsilon_geq_zero_p == 0);
+  epsilon_geq_zero_p
+    = new Constraint(construct_epsilon_geq_zero());
+
+  PPL_ASSERT(epsilon_leq_one_p == 0);
+  epsilon_leq_one_p
+    = new Constraint(Linear_Expression::zero() < Coefficient_one());
+}
+
+void
+PPL::Constraint::finalize() {
+  PPL_ASSERT(zero_dim_false_p != 0);
+  delete zero_dim_false_p;
+  zero_dim_false_p = 0;
+
+  PPL_ASSERT(zero_dim_positivity_p != 0);
+  delete zero_dim_positivity_p;
+  zero_dim_positivity_p = 0;
+
+  PPL_ASSERT(epsilon_geq_zero_p != 0);
+  delete epsilon_geq_zero_p;
+  epsilon_geq_zero_p = 0;
+
+  PPL_ASSERT(epsilon_leq_one_p != 0);
+  delete epsilon_leq_one_p;
+  epsilon_leq_one_p = 0;
+}
+
+void
+PPL::Constraint::ascii_dump(std::ostream& s) const {
+  expr.ascii_dump(s);
+
+  s << " ";
+  
+  switch (type()) {
+  case Constraint::EQUALITY:
+    s << "=";
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    s << ">=";
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    s << ">";
+    break;
+  }
+  s << " ";
+  if (topology() == NECESSARILY_CLOSED)
+    s << "(C)";
+  else
+    s << "(NNC)";
+
+  s << "\n";
+}
+
+bool
+PPL::Constraint::ascii_load(std::istream& s) {
+  std::string str;
+  std::string str2;
+
+  expr.ascii_load(s);
+
+  if (!(s >> str))
+    return false;
+  if (str == "=")
+    set_is_equality();
+  else if (str == ">=" || str == ">")
+    set_is_inequality();
+  else
+    return false;
+
+  if (!(s >> str2))
+    return false;
+  if (str2 == "(NNC)") {
+    // TODO: Avoid the mark_as_*() methods if possible.
+    if (topology() == NECESSARILY_CLOSED)
+      mark_as_not_necessarily_closed();
+  }
+  else
+    if (str2 == "(C)") {
+      // TODO: Avoid the mark_as_*() methods if possible.
+      if (topology() == NOT_NECESSARILY_CLOSED)
+        mark_as_necessarily_closed();
+    }
+    else
+      return false;
+
+  // Checking for equality of actual and declared types.
+  switch (type()) {
+  case EQUALITY:
+    if (str != "=")
+      return false;
+    break;
+  case NONSTRICT_INEQUALITY:
+    if (str != ">=")
+      return false;
+    break;
+  case STRICT_INEQUALITY:
+    if (str != ">")
+      return false;
+    break;
+  }
+
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint& c) {
+  PPL_DIRTY_TEMP_COEFFICIENT(cv);
+  bool first = true;
+  for (Constraint::expr_type::const_iterator i = c.expression().begin(),
+         i_end = c.expression().end(); i != i_end; ++i) {
+    cv = *i;
+    if (!first) {
+      if (cv > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(cv);
+      }
+    }
+    else
+      first = false;
+    if (cv == -1)
+      s << "-";
+    else if (cv != 1)
+      s << cv << "*";
+    s << i.variable();
+  }
+  if (first)
+    s << Coefficient_zero();
+  const char* relation_symbol = 0;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    relation_symbol = " = ";
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    relation_symbol = " >= ";
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    relation_symbol = " > ";
+    break;
+  }
+  s << relation_symbol << -c.inhomogeneous_term();
+  return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint::Type& t) {
+  const char* n = 0;
+  switch (t) {
+  case Constraint::EQUALITY:
+    n = "EQUALITY";
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    n = "NONSTRICT_INEQUALITY";
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    n = "STRICT_INEQUALITY";
+    break;
+  }
+  s << n;
+  return s;
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint)
+
+bool
+PPL::Constraint::OK() const {
+  // Topology consistency checks.
+  if (is_not_necessarily_closed() && expr.space_dimension() == 0) {
+#ifndef NDEBUG
+    std::cerr << "Constraint has fewer coefficients than the minimum "
+              << "allowed by its topology."
+              << std::endl;
+#endif
+    return false;
+  }
+
+  if (is_equality() && is_not_necessarily_closed()
+      && epsilon_coefficient() != 0) {
+#ifndef NDEBUG
+    std::cerr << "Illegal constraint: an equality cannot be strict."
+              << std::endl;
+#endif
+    return false;
+  }
+
+  // Normalization check.
+  Constraint tmp = *this;
+  tmp.strong_normalize();
+  if (tmp != *this) {
+#ifndef NDEBUG
+    std::cerr << "Constraint is not strongly normalized as it should be."
+              << std::endl;
+#endif
+    return false;
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Constraint_System.cc b/src/Constraint_System.cc
new file mode 100644
index 0000000..03cef66
--- /dev/null
+++ b/src/Constraint_System.cc
@@ -0,0 +1,381 @@
+/* Constraint_System class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Constraint_System::Constraint_System(const Congruence_System& cgs,
+                                          Representation r)
+  : sys(NECESSARILY_CLOSED, cgs.space_dimension(), r) {
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    if (i->is_equality()) {
+      Constraint tmp(*i);
+      insert(tmp, Recycle_Input());
+    }
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Constraint_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+                                    const dimension_type new_space_dim) {
+  PPL_ASSERT(space_dimension() <= new_space_dim);
+
+  if (sys.topology() == NOT_NECESSARILY_CLOSED
+      && new_topology == NECESSARILY_CLOSED) {
+    // A NOT_NECESSARILY_CLOSED constraint system
+    // can be converted to a NECESSARILY_CLOSED one
+    // only if it does not contain strict inequalities.
+    if (has_strict_inequalities())
+      return false;
+    // Since there were no strict inequalities,
+    // the only constraints that may have a non-zero epsilon coefficient
+    // are the eps-leq-one and the eps-geq-zero constraints.
+    // If they are present, we erase these rows, so that the
+    // epsilon column will only contain zeroes: as a consequence,
+    // we just decrement the number of columns to be added.
+    const bool was_sorted = sys.is_sorted();
+
+    // Note that num_rows() is *not* constant, because it is decreased by
+    // remove_row().
+    for (dimension_type i = 0; i < num_rows(); )
+      if (sys[i].epsilon_coefficient() != 0)
+        sys.remove_row(i, false);
+      else
+        ++i;
+
+    // If `cs' was sorted we sort it again.
+    if (was_sorted)
+      sys.sort_rows();
+  }
+
+  sys.set_topology(new_topology);
+  sys.set_space_dimension(new_space_dim);
+
+  // We successfully adjusted space dimensions and topology.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+bool
+PPL::Constraint_System::has_equalities() const {
+  // We verify if the system has equalities also in the pending part.
+  for (dimension_type i = sys.num_rows(); i-- > 0; )
+    if (sys[i].is_equality())
+      return true;
+  return false;
+}
+
+bool
+PPL::Constraint_System::has_strict_inequalities() const {
+  if (sys.is_necessarily_closed())
+    return false;
+  // We verify if the system has strict inequalities
+  // also in the pending part.
+  for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+    const Constraint& c = sys[i];
+    // Optimized type checking: we already know the topology;
+    // also, equalities have the epsilon coefficient equal to zero.
+    // NOTE: the constraint eps_leq_one should not be considered
+    //       a strict inequality.
+    if (c.epsilon_coefficient() < 0 && !c.is_tautological())
+      return true;
+  }
+  return false;
+}
+
+void
+PPL::Constraint_System::insert(const Constraint& r) {
+  Constraint tmp = r;
+  insert(tmp, Recycle_Input());
+}
+
+void
+PPL::Constraint_System::insert(Constraint& c, Recycle_Input) {
+  // We are sure that the matrix has no pending rows
+  // and that the new row is not a pending constraint.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+
+  if (sys.topology() != c.topology()) {
+    if (sys.topology() == NECESSARILY_CLOSED)
+      sys.set_topology(NOT_NECESSARILY_CLOSED);
+    else
+      c.set_topology(NOT_NECESSARILY_CLOSED);
+  }
+
+  sys.insert(c, Recycle_Input());
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Constraint_System::insert_pending(const Constraint& r) {
+  Constraint tmp = r;
+  insert_pending(tmp, Recycle_Input());
+}
+
+void
+PPL::Constraint_System::insert_pending(Constraint& c, Recycle_Input) {
+  if (sys.topology() != c.topology()) {
+    if (sys.topology() == NECESSARILY_CLOSED)
+      sys.set_topology(NOT_NECESSARILY_CLOSED);
+    else
+      c.set_topology(NOT_NECESSARILY_CLOSED);
+  }
+
+  sys.insert_pending(c, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::Constraint_System::num_inequalities() const {
+  // We are sure that we call this method only when
+  // the matrix has no pending rows.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  const Constraint_System& cs = *this;
+  dimension_type n = 0;
+  // If the Base happens to be sorted, take advantage of the fact
+  // that inequalities are at the bottom of the system.
+  if (sys.is_sorted())
+    for (dimension_type i = sys.num_rows(); i > 0 && cs[--i].is_inequality(); )
+      ++n;
+  else
+    for (dimension_type i = sys.num_rows(); i-- > 0 ; )
+      if (cs[i].is_inequality())
+        ++n;
+  return n;
+}
+
+PPL::dimension_type
+PPL::Constraint_System::num_equalities() const {
+  // We are sure that we call this method only when
+  // the matrix has no pending rows.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  return sys.num_rows() - num_inequalities();
+}
+
+void
+PPL::Constraint_System_const_iterator::skip_forward() {
+  const Linear_System<Constraint>::const_iterator csp_end = csp->end();
+  while (i != csp_end && (*this)->is_tautological())
+    ++i;
+}
+
+bool
+PPL::Constraint_System::satisfies_all_constraints(const Generator& g) const {
+  PPL_ASSERT(g.space_dimension() <= space_dimension());
+
+  // Setting `sps' to the appropriate scalar product sign operator.
+  // This also avoids problems when having _legal_ topology mismatches
+  // (which could also cause a mismatch in the number of columns).
+  const Topology_Adjusted_Scalar_Product_Sign sps(g);
+
+  if (sys.is_necessarily_closed()) {
+    if (g.is_line()) {
+      // Lines must saturate all constraints.
+      for (dimension_type i = sys.num_rows(); i-- > 0; )
+        if (sps(g, sys[i]) != 0)
+          return false;
+    }
+    else
+      // `g' is either a ray, a point or a closure point.
+      for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+        const Constraint& c = sys[i];
+        const int sp_sign = sps(g, c);
+        if (c.is_inequality()) {
+          // As `cs' is necessarily closed,
+          // `c' is a non-strict inequality.
+          if (sp_sign < 0)
+            return false;
+        }
+        else
+          // `c' is an equality.
+          if (sp_sign != 0)
+            return false;
+      }
+  }
+  else
+    // `cs' is not necessarily closed.
+    switch (g.type()) {
+
+    case Generator::LINE:
+      // Lines must saturate all constraints.
+      for (dimension_type i = sys.num_rows(); i-- > 0; )
+        if (sps(g, sys[i]) != 0)
+          return false;
+
+      break;
+
+    case Generator::POINT:
+      // Have to perform the special test
+      // when dealing with a strict inequality.
+      for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+        const Constraint& c = sys[i];
+        const int sp_sign = sps(g, c);
+        switch (c.type()) {
+        case Constraint::EQUALITY:
+          if (sp_sign != 0)
+            return false;
+          break;
+        case Constraint::NONSTRICT_INEQUALITY:
+          if (sp_sign < 0)
+            return false;
+          break;
+        case Constraint::STRICT_INEQUALITY:
+          if (sp_sign <= 0)
+            return false;
+          break;
+        }
+      }
+      break;
+
+    case Generator::RAY:
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+        const Constraint& c = sys[i];
+        const int sp_sign = sps(g, c);
+        if (c.is_inequality()) {
+          // Constraint `c' is either a strict or a non-strict inequality.
+          if (sp_sign < 0)
+            return false;
+        }
+        else
+          // Constraint `c' is an equality.
+          if (sp_sign != 0)
+            return false;
+      }
+      break;
+    }
+
+  // If we reach this point, `g' satisfies all constraints.
+  return true;
+}
+
+
+void
+PPL::Constraint_System
+::affine_preimage(const Variable v,
+                  const Linear_Expression& expr,
+                  Coefficient_traits::const_reference denominator) {
+  PPL_ASSERT(v.space_dimension() <= sys.space_dimension());
+  PPL_ASSERT(expr.space_dimension() <= sys.space_dimension());
+  PPL_ASSERT(denominator > 0);
+
+  Coefficient_traits::const_reference expr_v = expr.coefficient(v);
+
+  const dimension_type n_rows = sys.num_rows();
+  const bool not_invertible = (v.space_dimension() > expr.space_dimension()
+                               || expr_v == 0);
+
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    Constraint& row = sys.rows[i];
+    Coefficient_traits::const_reference row_v = row.coefficient(v);
+    if (row_v != 0) {
+      const Coefficient c = row_v;
+      if (denominator != 1)
+        row.expr *= denominator;
+      row.expr.linear_combine(expr, 1, c, 0, expr.space_dimension() + 1);
+      if (not_invertible)
+        row.expr.set_coefficient(v, Coefficient_zero());
+      else
+        row.expr.set_coefficient(v, c * expr_v);
+      row.strong_normalize();
+      PPL_ASSERT(row.OK());
+    }
+  }
+
+  // Strong normalization also resets the sortedness flag.
+  sys.strong_normalize();
+
+  PPL_ASSERT(sys.OK());
+}
+
+void
+PPL::Constraint_System::ascii_dump(std::ostream& s) const {
+  sys.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint_System)
+
+bool
+PPL::Constraint_System::ascii_load(std::istream& s) {
+  if (!sys.ascii_load(s))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+const PPL::Constraint_System* PPL::Constraint_System::zero_dim_empty_p = 0;
+
+void
+PPL::Constraint_System::initialize() {
+  PPL_ASSERT(zero_dim_empty_p == 0);
+  zero_dim_empty_p
+    = new Constraint_System(Constraint::zero_dim_false());
+}
+
+void
+PPL::Constraint_System::finalize() {
+  PPL_ASSERT(zero_dim_empty_p != 0);
+  delete zero_dim_empty_p;
+  zero_dim_empty_p = 0;
+}
+
+bool
+PPL::Constraint_System::OK() const {
+  return sys.OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint_System& cs) {
+  Constraint_System_const_iterator i = cs.begin();
+  const Constraint_System_const_iterator cs_end = cs.end();
+  if (i == cs_end)
+    s << "true";
+  else {
+    while (i != cs_end) {
+      s << *i;
+      ++i;
+      if (i != cs_end)
+        s << ", ";
+    }
+  }
+  return s;
+}
diff --git a/src/Constraint_System_defs.hh b/src/Constraint_System_defs.hh
new file mode 100644
index 0000000..5a26a2d
--- /dev/null
+++ b/src/Constraint_System_defs.hh
@@ -0,0 +1,687 @@
+/* Constraint_System class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_System_defs_hh
+#define PPL_Constraint_System_defs_hh 1
+
+#include "Constraint_System_types.hh"
+
+#include "Linear_System_defs.hh"
+#include "Constraint_defs.hh"
+
+#include "Linear_Expression_types.hh"
+#include "Generator_types.hh"
+#include "Constraint_types.hh"
+#include "Congruence_System_types.hh"
+#include "Polyhedron_types.hh"
+#include "termination_types.hh"
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Constraint_System
+  Writes <CODE>true</CODE> if \p cs is empty.  Otherwise, writes on
+  \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Constraint_System& x, const Constraint_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Constraint_System& x, const Constraint_System& y);
+
+/*! \relates Constraint_System */
+void
+swap(Constraint_System& x, Constraint_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+    When inserting constraints in a system, space dimensions are
+    automatically adjusted so that all the constraints in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of constraints corresponding to
+    a square in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+    \endcode
+    Note that:
+    the constraint system is created with space dimension zero;
+    the first and third constraint insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding four strict inequalities to the constraint system
+    of the previous example, we can remove just the four
+    vertices from the square defined above.
+    \code
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 6);
+  cs.insert(x - y < 3);
+  cs.insert(y - x < 3);
+    \endcode
+
+    \par Example 3
+    The following code builds a system of constraints corresponding to
+    a half-strip in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+    \endcode
+
+    \note
+    After inserting a multiset of constraints in a constraint system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> constraint system
+    will be available, where original constraints may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System {
+public:
+  typedef Constraint row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of constraints.
+  explicit Constraint_System(Representation r = default_representation);
+
+  //! Builds the singleton system containing only constraint \p c.
+  explicit Constraint_System(const Constraint& c,
+                             Representation r = default_representation);
+
+  //! Builds a system containing copies of any equalities in \p cgs.
+  explicit Constraint_System(const Congruence_System& cgs,
+                             Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note The copy will have the same representation as `cs', to make it
+          indistinguishable from `cs'.
+  */
+  Constraint_System(const Constraint_System& cs);
+
+  //! Copy constructor with specified representation.
+  Constraint_System(const Constraint_System& cs, Representation r);
+
+  //! Destructor.
+  ~Constraint_System();
+
+  //! Assignment operator.
+  Constraint_System& operator=(const Constraint_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Constraint_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more equality constraints.
+  */
+  bool has_equalities() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more strict inequality constraints.
+  */
+  bool has_strict_inequalities() const;
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Constraint& c);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System& zero_dim_empty();
+
+  typedef Constraint_System_const_iterator const_iterator;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no constraints.
+  bool empty() const;
+
+  /*! \brief
+    Removes all the constraints from the constraint system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Returns the const_iterator pointing to the first constraint,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Constraint_System& y);
+
+private:
+  Linear_System<Constraint> sys;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System* zero_dim_empty_p;
+
+  friend class Constraint_System_const_iterator;
+
+  friend bool operator==(const Constraint_System& x,
+                         const Constraint_System& y);
+
+  //! Builds an empty system of constraints having the specified topology.
+  explicit Constraint_System(Topology topol,
+                             Representation r = default_representation);
+
+  /*! \brief
+    Builds a system of constraints on a \p space_dim dimensional space. If
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+    dimension is added.
+  */
+  Constraint_System(Topology topol, dimension_type space_dim,
+                    Representation r = default_representation);
+
+  //! Returns the number of equality constraints.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of inequality constraints.
+  dimension_type num_inequalities() const;
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as
+    to provide a partial simplification of the system of constraints.
+
+    It is assumed that the system has no pending constraints.
+  */
+  void simplify();
+
+  /*! \brief
+    Adjusts \p *this so that it matches \p new_topology and
+    \p new_space_dim (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains strict inequalities.
+  */
+  bool adjust_topology_and_space_dimension(Topology new_topology,
+                                           dimension_type new_space_dim);
+
+  //! Returns a constant reference to the \p k- th constraint of the system.
+  const Constraint& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+  bool satisfies_all_constraints(const Generator& g) const;
+
+  //! Substitutes a given column of coefficients by a given affine expression.
+  /*!
+    \param v
+    The variable to which the affine transformation is substituted.
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations
+    (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+    having any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p
+    denominator that will be used as denominator of the affine
+    transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation substitutes the matrix of constraints
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(Variable v,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator);
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+    It is a pending constraint.
+  */
+  void insert_pending(const Constraint& c);
+
+  //! Adds low-level constraints to the constraint system.
+  void add_low_level_constraints();
+
+  //! Returns the system topology.
+  Topology topology() const;
+
+  dimension_type num_rows() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+  */
+  void remove_row(dimension_type i, bool keep_sorted = false);
+
+  //! Removes the specified rows. The row ordering of remaining rows is
+  //! preserved.
+  /*!
+    \param indexes specifies a list of row indexes.
+                   It must be sorted.
+  */
+  void remove_rows(const std::vector<dimension_type>& indexes);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(num_rows()).
+
+    Otherwise, this method just swaps the rows with the last ones and then
+    removes them, so it costs O(last - first).
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                   bool keep_sorted = false);
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Removes all the specified dimensions from the constraint system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  bool has_no_rows() const;
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Adds the given row to the pending part of the system, stealing its
+    contents and automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(Constraint& r, Recycle_Input);
+
+  //! Adds the rows of `y' to the pending part of `*this', stealing them from
+  //! `y'.
+  void insert_pending(Constraint_System& r, Recycle_Input);
+
+  /*! \brief
+    Adds \p r to the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+  */
+  void insert(Constraint& r, Recycle_Input);
+
+  //! Adds to \p *this a the rows of `y', stealing them from `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(Constraint_System& r, Recycle_Input);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void insert_pending(const Constraint_System& r);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Constraint_System& y);
+
+  //! Adds to \p *this a copy of  the rows of \p y.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(const Constraint_System& y);
+
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Constraint_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Adds \p n rows and space dimensions to the system.
+  /*!
+    \param n
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_universe_rows_and_space_dimensions(dimension_type n);
+
+  friend class Polyhedron;
+  friend class Termination_Helpers;
+};
+
+//! An iterator over a system of constraints.
+/*! \ingroup PPL_CXX_interface
+  A const_iterator is used to provide read-only access
+  to each constraint contained in a Constraint_System object.
+
+  \par Example
+  The following code prints the system of constraints
+  defining the polyhedron <CODE>ph</CODE>:
+  \code
+const Constraint_System& cs = ph.constraints();
+for (Constraint_System::const_iterator i = cs.begin(),
+        cs_end = cs.end(); i != cs_end; ++i)
+  cout << *i << endl;
+  \endcode
+*/
+// NOTE: This is not an inner class of Constraint_System, so Constraint can
+// declare that this class is his friend without including this file
+// (the .types.hh file suffices).
+class Parma_Polyhedra_Library::Constraint_System_const_iterator
+  : public std::iterator<std::forward_iterator_tag,
+                         Constraint,
+                         ptrdiff_t,
+                         const Constraint*,
+                         const Constraint&> {
+public:
+  //! Default constructor.
+  Constraint_System_const_iterator();
+
+  //! Ordinary copy constructor.
+  Constraint_System_const_iterator(const Constraint_System_const_iterator& y);
+
+  //! Destructor.
+  ~Constraint_System_const_iterator();
+
+  //! Assignment operator.
+  Constraint_System_const_iterator&
+  operator=(const Constraint_System_const_iterator& y);
+
+  //! Dereference operator.
+  const Constraint& operator*() const;
+
+  //! Indirect member selector.
+  const Constraint* operator->() const;
+
+  //! Prefix increment operator.
+  Constraint_System_const_iterator& operator++();
+
+  //! Postfix increment operator.
+  Constraint_System_const_iterator operator++(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const Constraint_System_const_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const Constraint_System_const_iterator& y) const;
+
+private:
+  friend class Constraint_System;
+
+  //! The const iterator over the matrix of constraints.
+  Linear_System<Constraint>::const_iterator i;
+
+  //! A const pointer to the matrix of constraints.
+  const Linear_System<Constraint>* csp;
+
+  //! Constructor.
+  Constraint_System_const_iterator(const Linear_System<Constraint>
+                                   ::const_iterator& iter,
+                                   const Constraint_System& cs);
+
+  //! \p *this skips to the next non-trivial constraint.
+  void skip_forward();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper returning number of constraints in system.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+num_constraints(const Constraint_System& cs);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Constraint_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Constraint_System_defs_hh)
diff --git a/src/Constraint_System_inlines.hh b/src/Constraint_System_inlines.hh
new file mode 100644
index 0000000..7a23d6b
--- /dev/null
+++ b/src/Constraint_System_inlines.hh
@@ -0,0 +1,439 @@
+/* Constraint_System class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_System_inlines_hh
+#define PPL_Constraint_System_inlines_hh 1
+
+#include "Constraint_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System(Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c, Representation r)
+  : sys(c.topology(), r) {
+  sys.insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+  : sys(cs.sys) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs,
+                                     Representation r)
+  : sys(cs.sys, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol, Representation r)
+  : sys(topol, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+                                     const dimension_type space_dim,
+                                     Representation r)
+  : sys(topol, space_dim, r) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+  Constraint_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+  return sys[k];
+}
+
+inline Representation
+Constraint_System::representation() const {
+  return sys.representation();
+}
+
+inline void
+Constraint_System::set_representation(Representation r) {
+  sys.set_representation(r);
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+  return Linear_System<Constraint>::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+  return sys.space_dimension();
+}
+
+inline void
+Constraint_System::set_space_dimension(dimension_type space_dim) {
+  return sys.set_space_dimension(space_dim);
+}
+
+inline void
+Constraint_System::clear() {
+  sys.clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+  PPL_ASSERT(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator(const Constraint_System_const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System_const_iterator::~Constraint_System_const_iterator() {
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator=(const Constraint_System_const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System_const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Constraint*
+Constraint_System_const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System_const_iterator::operator++(int) {
+  const Constraint_System_const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Constraint_System_const_iterator::operator==(const Constraint_System_const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Constraint_System_const_iterator::operator!=(const Constraint_System_const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Constraint_System_const_iterator::
+Constraint_System_const_iterator(const Linear_System<Constraint>::const_iterator& iter,
+               const Constraint_System& cs)
+  : i(iter), csp(&cs.sys) {
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::begin() const {
+  const_iterator i(sys.begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::end() const {
+  const Constraint_System_const_iterator i(sys.end(), *this);
+  return i;
+}
+
+inline bool
+Constraint_System::empty() const {
+  return begin() == end();
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+  if (sys.is_necessarily_closed())
+    // The positivity constraint.
+    insert(Constraint::zero_dim_positivity());
+  else {
+    // Add the epsilon constraints.
+    insert(Constraint::epsilon_leq_one());
+    insert(Constraint::epsilon_geq_zero());
+  }
+}
+
+inline void
+Constraint_System::m_swap(Constraint_System& y) {
+  swap(sys, y.sys);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+  return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Constraint_System::simplify() {
+  sys.simplify();
+}
+
+inline Topology
+Constraint_System::topology() const {
+  return sys.topology();
+}
+
+inline dimension_type
+Constraint_System::num_rows() const {
+  return sys.num_rows();
+}
+
+inline bool
+Constraint_System::is_necessarily_closed() const {
+  return sys.is_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::num_pending_rows() const {
+  return sys.num_pending_rows();
+}
+
+inline dimension_type
+Constraint_System::first_pending_row() const {
+  return sys.first_pending_row();
+}
+
+inline bool
+Constraint_System::is_sorted() const {
+  return sys.is_sorted();
+}
+
+inline void
+Constraint_System::unset_pending_rows() {
+  sys.unset_pending_rows();
+}
+
+inline void
+Constraint_System::set_index_first_pending_row(dimension_type i) {
+  sys.set_index_first_pending_row(i);
+}
+
+inline void
+Constraint_System::set_sorted(bool b) {
+  sys.set_sorted(b);
+}
+
+inline void
+Constraint_System::remove_row(dimension_type i, bool keep_sorted) {
+  sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(dimension_type first, dimension_type last,
+                               bool keep_sorted) {
+  sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(const std::vector<dimension_type>& indexes) {
+  sys.remove_rows(indexes);
+}
+
+inline void
+Constraint_System::remove_trailing_rows(dimension_type n) {
+  sys.remove_trailing_rows(n);
+}
+
+inline void
+Constraint_System
+::remove_space_dimensions(const Variables_Set& vars) {
+  sys.remove_space_dimensions(vars);
+}
+
+inline void
+Constraint_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+  sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Constraint_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Constraint_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+  sys.swap_space_dimensions(v1, v2);
+}
+
+inline bool
+Constraint_System::has_no_rows() const {
+  return sys.has_no_rows();
+}
+
+inline void
+Constraint_System::strong_normalize() {
+  sys.strong_normalize();
+}
+
+inline void
+Constraint_System::sort_rows() {
+  sys.sort_rows();
+}
+
+inline void
+Constraint_System::insert_pending(Constraint_System& r, Recycle_Input) {
+  sys.insert_pending(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert(Constraint_System& r, Recycle_Input) {
+  sys.insert(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert_pending(const Constraint_System& r) {
+  sys.insert_pending(r.sys);
+}
+
+inline void
+Constraint_System::merge_rows_assign(const Constraint_System& y) {
+  sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Constraint_System::insert(const Constraint_System& y) {
+  sys.insert(y.sys);
+}
+
+inline void
+Constraint_System::mark_as_necessarily_closed() {
+  sys.mark_as_necessarily_closed();
+}
+
+inline void
+Constraint_System::mark_as_not_necessarily_closed() {
+  sys.mark_as_not_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::gauss(dimension_type n_lines_or_equalities) {
+  return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::back_substitute(dimension_type n_lines_or_equalities) {
+  sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::assign_with_pending(const Constraint_System& y) {
+  sys.assign_with_pending(y.sys);
+}
+
+inline void
+Constraint_System::sort_pending_and_remove_duplicates() {
+  sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Constraint_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+  sys.sort_and_remove_with_sat(sat);
+}
+
+inline bool
+Constraint_System::check_sorted() const {
+  return sys.check_sorted();
+}
+
+inline dimension_type
+Constraint_System::num_lines_or_equalities() const {
+  return sys.num_lines_or_equalities();
+}
+
+inline void
+Constraint_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+  sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline bool
+operator==(const Constraint_System& x, const Constraint_System& y) {
+  return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Constraint_System& x, const Constraint_System& y) {
+  return !(x == y);
+}
+
+/*! \relates Constraint_System */
+inline void
+swap(Constraint_System& x, Constraint_System& y) {
+  x.m_swap(y);
+}
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+num_constraints(const Constraint_System& cs) {
+  return static_cast<dimension_type>(std::distance(cs.begin(), cs.end()));
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_System_inlines_hh)
diff --git a/src/Constraint_System_types.hh b/src/Constraint_System_types.hh
new file mode 100644
index 0000000..7e947e8
--- /dev/null
+++ b/src/Constraint_System_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constraint_System_types_hh
+#define PPL_Constraint_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+class Constraint_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_System_types_hh)
diff --git a/src/Constraint_defs.hh b/src/Constraint_defs.hh
new file mode 100644
index 0000000..aedfa5b
--- /dev/null
+++ b/src/Constraint_defs.hh
@@ -0,0 +1,836 @@
+/* Constraint class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_defs_hh
+#define PPL_Constraint_defs_hh 1
+
+#include "Constraint_types.hh"
+
+#include "Congruence_types.hh"
+#include "Variables_Set_types.hh"
+#include "Polyhedron_types.hh"
+#include "termination_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Grid_types.hh"
+
+#include "Linear_Expression_defs.hh"
+#include "Variable_defs.hh"
+#include "Topology_types.hh"
+#include "Expression_Hide_Last_defs.hh"
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \< \p v2.
+/*! \relates Constraint */
+Constraint
+operator<(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \> \p v2.
+/*! \relates Constraint */
+Constraint
+operator>(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 = \p v2.
+/*! \relates Constraint */
+Constraint
+operator==(Variable v1, Variable v2);
+
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \<= \p v2.
+/*! \relates Constraint */
+Constraint
+operator<=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \>= \p v2.
+/*! \relates Constraint */
+Constraint
+operator>=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Constraint
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Constraint& x, const Constraint& y);
+
+}
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Constraint is either:
+  - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+  - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+  - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+  and \f$b\f$ is the integer inhomogeneous term.
+
+  \par How to build a constraint
+  Constraints are typically built by applying a relation symbol
+  to a pair of linear expressions.
+  Available relation symbols are equality (<CODE>==</CODE>),
+  non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+  strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+  The space dimension of a constraint is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality constraint
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Constraint eq_c(3*x + 5*y - z == 0);
+  \endcode
+  The following code builds the (non-strict) inequality constraint
+  \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+  \code
+  Constraint ineq_c(4*x >= 2*y - 13);
+  \endcode
+  The corresponding strict inequality constraint
+  \f$4x > 2y - 13\f$ is obtained as follows:
+  \code
+  Constraint strict_ineq_c(4*x > 2*y - 13);
+  \endcode
+  An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Constraint false_c = Constraint::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Constraint false_c1(Linear_Expression::zero() == 1);
+  Constraint false_c2(Linear_Expression::zero() >= 1);
+  Constraint false_c3(Linear_Expression::zero() > 0);
+  \endcode
+  In contrast, the following code defines an unsatisfiable constraint
+  having space dimension \f$3\f$:
+  \code
+  Constraint false_c(0*z == 1);
+  \endcode
+
+  \par How to inspect a constraint
+  Several methods are provided to examine a constraint and extract
+  all the encoded information: its space dimension, its type
+  (equality, non-strict inequality, strict inequality) and
+  the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access each single
+  coefficient of a constraint. Given an inequality constraint
+  (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+  corresponding to its complement (thus, in this case we want to obtain
+  the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+  \code
+  Constraint c1(x - 5*y + 3*z <= 4);
+  cout << "Constraint c1: " << c1 << endl;
+  if (c1.is_equality())
+    cout << "Constraint c1 is not an inequality." << endl;
+  else {
+    Linear_Expression e;
+    for (dimension_type i = c1.space_dimension(); i-- > 0; )
+      e += c1.coefficient(Variable(i)) * Variable(i);
+    e += c1.inhomogeneous_term();
+    Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+    cout << "Complement c2: " << c2 << endl;
+  }
+  \endcode
+  The actual output is the following:
+  \code
+  Constraint c1: -A + 5*B - 3*C >= -4
+  Complement c2: A - 5*B + 3*C > 4
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint {
+public:
+
+  //! The constraint type.
+  enum Type {
+    /*! The constraint is an equality. */
+    EQUALITY,
+    /*! The constraint is a non-strict inequality. */
+    NONSTRICT_INEQUALITY,
+    /*! The constraint is a strict inequality. */
+    STRICT_INEQUALITY
+  };
+
+  //! The representation used for new Constraints.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Constructs the \f$0<=0\f$ constraint.
+  explicit Constraint(Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note The new Constraint will have the same representation as `c',
+          not default_representation, so that they are indistinguishable.
+  */
+  Constraint(const Constraint& c);
+
+  //! Copy constructor with given size.
+  /*!
+    \note The new Constraint will have the same representation as `c',
+          not default_representation, so that they are indistinguishable.
+  */
+  Constraint(const Constraint& c, dimension_type space_dim);
+
+  //! Copy constructor with given representation.
+  Constraint(const Constraint& c, Representation r);
+
+  //! Copy constructor with given size and representation.
+  Constraint(const Constraint& c, dimension_type space_dim,
+             Representation r);
+
+  //! Copy-constructs from equality congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p cg is a proper congruence.
+  */
+  explicit Constraint(const Congruence& cg,
+                      Representation r = default_representation);
+
+  //! Destructor.
+  ~Constraint();
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Assignment operator.
+  Constraint& operator=(const Constraint& c);
+
+  //! Returns the maximum space dimension a Constraint can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the constraint.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+
+    Always returns \p true. The return value is needed for compatibility with
+    the Generator class.
+  */
+  bool remove_space_dimensions(const Variables_Set& vars);
+
+  //! Permutes the space dimensions of the constraint.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Returns the constraint type of \p *this.
+  Type type() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an equality constraint.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an inequality constraint (either strict or non-strict).
+  */
+  bool is_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a non-strict inequality constraint.
+  */
+  bool is_nonstrict_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a strict inequality constraint.
+  */
+  bool is_strict_inequality() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  static const Constraint& zero_dim_false();
+
+  /*! \brief
+    The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+    also known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint& zero_dim_positivity();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a tautology (i.e., an always true constraint).
+
+    A tautology can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b \geq 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b > 0\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false constraint).
+
+    An inconsistent constraint can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+      where \f$b \neq 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b < 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b \leq 0\f$.
+  */
+  bool is_inconsistent() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent constraints.
+
+    Constraints having different space dimensions are not equivalent.
+    Note that constraints having different types may nonetheless be
+    equivalent, if they both are tautologies or inconsistent.
+  */
+  bool is_equivalent_to(const Constraint& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  /*!
+    This is faster than is_equivalent_to(), but it may return `false' even
+    for equivalent constraints.
+  */
+  bool is_equal_to(const Constraint& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Constraint& y);
+
+  //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  static const Constraint& epsilon_geq_zero();
+
+  /*! \brief
+    The zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint& epsilon_leq_one();
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Hide_Last<Linear_Expression> expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+private:
+
+  //! The possible kinds of Constraint objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+  Linear_Expression expr;
+
+  Kind kind_;
+
+  Topology topology_;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  */
+  static const Constraint* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) constraint \f$0 \leq 1\f$, also
+    known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint* zero_dim_positivity_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  */
+  static const Constraint* epsilon_geq_zero_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint* epsilon_leq_one_p;
+
+  //! Constructs the \f$0<0\f$ constraint.
+  Constraint(dimension_type space_dim, Kind kind, Topology topology,
+             Representation r = default_representation);
+
+  /*! \brief
+    Builds a constraint of kind \p kind and topology \p topology,
+    stealing the coefficients from \p e.
+
+    \note The new Constraint will have the same representation as `e'.
+  */
+  Constraint(Linear_Expression& e, Kind kind, Topology topology);
+
+  /*! \brief
+    Builds a constraint of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+
+    \note The new Constraint will have the same representation as `e'.
+  */
+  Constraint(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+
+  // TODO: Consider setting the epsilon dimension in this method.
+  //! Sets to \p x the topological kind of \p *this row.
+  void set_topology(Topology x);
+
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+  //@} // Flags coercion methods
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid objects.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* name_var,
+                               Variable v) const;
+
+  //! Returns the epsilon coefficient. The constraint must be NNC.
+  Coefficient_traits::const_reference epsilon_coefficient() const;
+
+  //! Sets the epsilon coefficient to \p n. The constraint must be NNC.
+  void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+  void set_is_equality();
+
+  //! Sets the constraint to be an inequality.
+  /*!
+    Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+    or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+    of the low-level coefficients of the constraint.
+  */
+  void set_is_inequality();
+
+  //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+  /*!
+    \param y
+    The Constraint that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting Constraint to \p *this and normalizes it.
+  */
+  void linear_combine(const Constraint& y, dimension_type i);
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Constraint objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Constraint::normalize() and Constraint::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  /*! \brief
+    Builds a new copy of the zero-dimension space constraint
+    \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+  */
+  static Constraint construct_epsilon_geq_zero();
+
+  friend int
+  compare(const Constraint& x, const Constraint& y);
+
+  friend class Linear_System<Constraint>;
+  friend class Constraint_System;
+  friend class Polyhedron;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+  friend class Termination_Helpers;
+  friend class Grid;
+  template <typename T>
+  friend class Octagonal_Shape;
+
+  friend Constraint
+  operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator<(Variable v1, Variable v2);
+
+  friend Constraint
+  operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator>(Variable v1, Variable v2);
+
+  friend Constraint
+  operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator==(Variable v1, Variable v2);
+
+  friend Constraint
+  operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator<=(Variable v1, Variable v2);
+
+  friend Constraint
+  operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator>=(Variable v1, Variable v2);
+
+  friend Constraint
+  operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+/*! \relates Constraint */
+void swap(Constraint& x, Constraint& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Constraint_inlines.hh"
+
+#endif // !defined(PPL_Constraint_defs_hh)
diff --git a/src/Constraint_inlines.hh b/src/Constraint_inlines.hh
new file mode 100644
index 0000000..2a077f4
--- /dev/null
+++ b/src/Constraint_inlines.hh
@@ -0,0 +1,577 @@
+/* Constraint class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Constraint_inlines_hh
+#define PPL_Constraint_inlines_hh 1
+
+#include "Linear_Expression_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Constraint::is_necessarily_closed() const {
+  return (topology_ == NECESSARILY_CLOSED);
+}
+
+inline bool
+Constraint::is_not_necessarily_closed() const {
+  return !is_necessarily_closed();
+}
+
+inline Constraint::expr_type
+Constraint::expression() const {
+  return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+  return expression().space_dimension();
+}
+
+inline void
+Constraint::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Constraint::is_line_or_equality() const {
+  return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Constraint::is_ray_or_point_or_inequality() const {
+  return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Constraint::topology() const {
+  return topology_;
+}
+
+inline void
+Constraint::set_is_line_or_equality() {
+  kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Constraint::set_is_ray_or_point_or_inequality() {
+  kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Constraint::set_topology(Topology x) {
+  if (topology() == x)
+    return;
+  if (topology() == NECESSARILY_CLOSED) {
+    // Add a column for the epsilon dimension.
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  }
+  else {
+    PPL_ASSERT(expr.space_dimension() != 0);
+    expr.set_space_dimension(expr.space_dimension() - 1);
+  }
+  topology_ = x;
+}
+
+inline void
+Constraint::mark_as_necessarily_closed() {
+  PPL_ASSERT(is_not_necessarily_closed());
+  topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::mark_as_not_necessarily_closed() {
+  PPL_ASSERT(is_necessarily_closed());
+  topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Constraint::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Constraint::Constraint(Representation r)
+  : expr(r),
+    kind_(RAY_OR_POINT_OR_INEQUALITY),
+    topology_(NECESSARILY_CLOSED) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(dimension_type space_dim, Kind kind, Topology topology,
+                       Representation r)
+  : expr(r),
+    kind_(kind),
+    topology_(topology) {
+  expr.set_space_dimension(space_dim + 1);
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Kind kind, Topology topology)
+  : kind_(kind),
+    topology_(topology) {
+  PPL_ASSERT(kind != RAY_OR_POINT_OR_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    // Add the epsilon dimension.
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  strong_normalize();
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology)
+  : topology_(topology) {
+  PPL_ASSERT(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  if (type == EQUALITY)
+    kind_ = LINE_OR_EQUALITY;
+  else
+    kind_ = RAY_OR_POINT_OR_INEQUALITY;
+  strong_normalize();
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+  : expr(c.expr),
+    kind_(c.kind_),
+    topology_(c.topology_) {
+  // NOTE: This does not call PPL_ASSERT(OK()) because this is called by OK().
+}
+
+inline
+Constraint::Constraint(const Constraint& c, Representation r)
+  : expr(c.expr, r),
+    kind_(c.kind_),
+    topology_(c.topology_) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim)
+  : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+    kind_(c.kind_), topology_(c.topology_) {
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim,
+                       Representation r)
+  : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+    kind_(c.kind_), topology_(c.topology_) {
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+  Constraint tmp = c;
+  swap(*this, tmp);
+
+  return *this;
+}
+
+inline Representation
+Constraint::representation() const {
+  return expr.representation();
+}
+
+inline void
+Constraint::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+  return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Constraint::set_space_dimension_no_ok(dimension_type space_dim) {
+  const dimension_type old_expr_space_dim = expr.space_dimension();
+  if (topology() == NECESSARILY_CLOSED) {
+    expr.set_space_dimension(space_dim);
+  }
+  else {
+    const dimension_type old_space_dim = space_dimension();
+    if (space_dim > old_space_dim) {
+      expr.set_space_dimension(space_dim + 1);
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+    }
+    else {
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+      expr.set_space_dimension(space_dim + 1);
+    }
+  }
+  PPL_ASSERT(space_dimension() == space_dim);
+  if (expr.space_dimension() < old_expr_space_dim)
+    strong_normalize();
+}
+
+inline void
+Constraint::set_space_dimension(dimension_type space_dim) {
+  set_space_dimension_no_ok(space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline bool
+Constraint::remove_space_dimensions(const Variables_Set& vars) {
+  expr.remove_space_dimensions(vars);
+  return true;
+}
+
+inline bool
+Constraint::is_equality() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+  if (is_equality())
+    return EQUALITY;
+  if (is_necessarily_closed())
+    return NONSTRICT_INEQUALITY;
+  if (epsilon_coefficient() < 0)
+    return STRICT_INEQUALITY;
+  else
+    return NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+  return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+  return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+  set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+  return expr.inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Constraint::strong_normalize() {
+  expr.normalize();
+  sign_normalize();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+  return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff(e1,
+                         std::max(e1.space_dimension(), e2.space_dimension()),
+                         Constraint::default_representation);
+  diff -= e2;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Variable v1, Variable v2) {
+  if (v1.space_dimension() > v2.space_dimension())
+    swap(v1, v2);
+  PPL_ASSERT(v1.space_dimension() <= v2.space_dimension());
+
+  Linear_Expression diff(v1, Constraint::default_representation);
+  diff -= v2;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff(e1,
+                         std::max(e1.space_dimension(), e2.space_dimension()),
+                         Constraint::default_representation);
+  diff -= e2;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Variable v1, const Variable v2) {
+  Linear_Expression diff(Constraint::default_representation);
+  diff.set_space_dimension(std::max(v1.space_dimension(),
+                                    v2.space_dimension()));
+  diff += v1;
+  diff -= v2;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff(e1, Constraint::default_representation);
+  diff -= e2;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  // NOTE: this also enforces normalization.
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Variable v1, const Variable v2) {
+  Linear_Expression diff(Constraint::default_representation);
+  diff.set_space_dimension(std::max(v1.space_dimension(),
+                                    v2.space_dimension()));
+  diff += v1;
+  diff -= v2;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  neg_assign(diff);
+  diff += n;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  neg_assign(diff);
+  diff += n;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  neg_assign(diff);
+  diff += n;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  // NOTE: this also enforces normalization.
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  diff -= n;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  diff -= n;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  diff -= n;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  // NOTE: this also enforces normalization.
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Variable v1, const Variable v2) {
+  return v2 >= v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Variable v1, const Variable v2) {
+  return v2 > v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+  PPL_ASSERT(zero_dim_false_p != 0);
+  return *zero_dim_false_p;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+  PPL_ASSERT(zero_dim_positivity_p != 0);
+  return *zero_dim_positivity_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+  PPL_ASSERT(epsilon_geq_zero_p != 0);
+  return *epsilon_geq_zero_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+  PPL_ASSERT(epsilon_leq_one_p != 0);
+  return *epsilon_leq_one_p;
+}
+
+inline void
+Constraint::m_swap(Constraint& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(kind_, y.kind_);
+  swap(topology_, y.topology_);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::epsilon_coefficient() const {
+  PPL_ASSERT(is_not_necessarily_closed());
+  return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+inline void
+Constraint::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+  PPL_ASSERT(is_not_necessarily_closed());
+  expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+/*! \relates Constraint */
+inline void
+swap(Constraint& x, Constraint& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_inlines_hh)
diff --git a/src/Constraint_types.hh b/src/Constraint_types.hh
new file mode 100644
index 0000000..223a3c6
--- /dev/null
+++ b/src/Constraint_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Constraint_types_hh
+#define PPL_Constraint_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_types_hh)
diff --git a/src/DB_Matrix_defs.hh b/src/DB_Matrix_defs.hh
new file mode 100644
index 0000000..507972f
--- /dev/null
+++ b/src/DB_Matrix_defs.hh
@@ -0,0 +1,325 @@
+/* DB_Matrix class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Matrix_defs_hh
+#define PPL_DB_Matrix_defs_hh 1
+
+#include "DB_Matrix_types.hh"
+#include "globals_defs.hh"
+#include "DB_Row_defs.hh"
+#include "Checked_Number_types.hh"
+#include "Rounding_Dir_defs.hh"
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+  The template class DB_Matrix<T> allows for the representation of
+  a square matrix of T objects.
+  Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+  //! Returns the maximum number of rows a DB_Matrix can handle.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns a DB_Matrix can handle.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    DB_Rows' size and capacity are initialized to \f$0\f$.
+  */
+  DB_Matrix();
+
+  //! Builds a square matrix having the specified dimension.
+  explicit DB_Matrix(dimension_type n_rows);
+
+  //! Copy constructor.
+  DB_Matrix(const DB_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit DB_Matrix(const DB_Matrix<U>& y);
+
+  //! Destructor.
+  ~DB_Matrix();
+
+  //! Assignment operator.
+  DB_Matrix& operator=(const DB_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A read-only iterator over the rows of the matrix.
+  /*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  class const_iterator {
+  private:
+    typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef typename std::iterator_traits<Iter>::value_type value_type;
+    typedef typename std::iterator_traits<Iter>::difference_type
+    difference_type;
+    typedef typename std::iterator_traits<Iter>::pointer pointer;
+    typedef typename std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+private:
+  template <typename U> friend class DB_Matrix;
+
+  //! The rows of the matrix.
+  std::vector<DB_Row<T> > rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  /*! \brief
+    Capacity allocated for each row, i.e., number of
+    <CODE>long</CODE> objects that each row can contain.
+  */
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void m_swap(DB_Matrix& y);
+
+  //! Makes the matrix grow by adding more rows and more columns.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created.
+    The contents of the old matrix are copied in the upper, left-hand
+    corner of the new matrix, which is then assigned to \p *this.
+  */
+  void grow(dimension_type new_n_rows);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created without copying
+    the content of the old matrix and assigned to \p *this.
+  */
+  void resize_no_copy(dimension_type new_n_rows);
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  DB_Row<T>& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const DB_Row<T>& operator[](dimension_type k) const;
+  //@}
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Matrix<T>& x, DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const DB_Matrix<T>& x,
+                                 const DB_Matrix<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const DB_Matrix<T>& x,
+                               const DB_Matrix<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const DB_Matrix<T>& x,
+                                const DB_Matrix<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "DB_Matrix_inlines.hh"
+#include "DB_Matrix_templates.hh"
+
+#endif // !defined(PPL_DB_Matrix_defs_hh)
diff --git a/src/DB_Matrix_inlines.hh b/src/DB_Matrix_inlines.hh
new file mode 100644
index 0000000..63c52ca
--- /dev/null
+++ b/src/DB_Matrix_inlines.hh
@@ -0,0 +1,330 @@
+/* DB_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Matrix_inlines_hh
+#define PPL_DB_Matrix_inlines_hh 1
+
+#include "globals_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "distances_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::m_swap(DB_Matrix& y) {
+  using std::swap;
+  swap(rows, y.rows);
+  swap(row_size, y.row_size);
+  swap(row_capacity, y.row_capacity);
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+  return std::vector<DB_Row<T> >().max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+  return DB_Row<T>::max_size();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+  return *i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+  return &*i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+  return const_iterator(rows.begin());
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+  return const_iterator(rows.end());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+  return rows.size();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const DB_Matrix<T>& x,
+                    const DB_Matrix<T>& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0,
+                    Temp& tmp1,
+                    Temp& tmp2) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_num_rows; i-- > 0; ) {
+    const DB_Row<T>& x_i = x[i];
+    const DB_Row<T>& y_i = y[i];
+    for (dimension_type j = x_num_rows; j-- > 0; ) {
+      const T& x_i_j = x_i[j];
+      const T& y_i_j = y_i[j];
+      if (is_plus_infinity(x_i_j)) {
+        if (is_plus_infinity(y_i_j))
+          continue;
+        else {
+        pinf:
+          assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+          return true;
+        }
+      }
+      else if (is_plus_infinity(y_i_j))
+        goto pinf;
+
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i_j > y_i_j) {
+        maybe_assign(tmp1p, tmp1, x_i_j, dir);
+        maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+      }
+      else {
+        maybe_assign(tmp1p, tmp1, y_i_j, dir);
+        maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      PPL_ASSERT(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const DB_Matrix<T>& x,
+                            const DB_Matrix<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+                                                                    dir,
+                                                                    tmp0,
+                                                                    tmp1,
+                                                                    tmp2);
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const DB_Matrix<T>& x,
+                          const DB_Matrix<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+                                                                  dir,
+                                                                  tmp0,
+                                                                  tmp1,
+                                                                  tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const DB_Matrix<T>& x,
+                           const DB_Matrix<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+                                                                   dir,
+                                                                   tmp0,
+                                                                   tmp1,
+                                                                   tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+swap(DB_Matrix<T>& x, DB_Matrix<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_inlines_hh)
diff --git a/src/DB_Matrix_templates.hh b/src/DB_Matrix_templates.hh
new file mode 100644
index 0000000..6fba4e1
--- /dev/null
+++ b/src/DB_Matrix_templates.hh
@@ -0,0 +1,319 @@
+/* DB_Matrix class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Matrix_templates_hh
+#define PPL_DB_Matrix_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+  : rows(n_rows),
+    row_size(n_rows),
+    row_capacity(compute_capacity(n_rows, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_rows, row_capacity);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+  : rows(y.rows.size()),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+    rows[i].construct_upward_approximation(y[i], row_capacity);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+  const dimension_type old_n_rows = rows.size();
+  PPL_ASSERT(new_n_rows >= old_n_rows);
+
+  if (new_n_rows > old_n_rows) {
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+        // Reallocation will take place.
+        std::vector<DB_Row<T> > new_rows;
+        new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+        new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+        // Construct the new rows.
+        dimension_type i = new_n_rows;
+        while (i-- > old_n_rows)
+          new_rows[i].construct(new_n_rows, row_capacity);
+        // Steal the old rows.
+        ++i;
+        while (i-- > 0)
+          swap(new_rows[i], rows[i]);
+        // Put the new vector into place.
+        using std::swap;
+        swap(rows, new_rows);
+      }
+      else {
+        // Reallocation will NOT take place.
+        rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+        for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+          rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows.
+      DB_Matrix new_matrix;
+      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+      // Construct the new rows.
+      new_matrix.row_size = new_n_rows;
+      new_matrix.row_capacity = compute_capacity(new_n_rows,
+                                                 max_num_columns());
+      dimension_type i = new_n_rows;
+      while (i-- > old_n_rows)
+        new_matrix.rows[i].construct(new_matrix.row_size,
+                                     new_matrix.row_capacity);
+      // Copy the old rows.
+      ++i;
+      while (i-- > 0) {
+        // FIXME: copying may be unnecessarily costly.
+        DB_Row<T> new_row(rows[i],
+                          new_matrix.row_size,
+                          new_matrix.row_capacity);
+        swap(new_matrix.rows[i], new_row);
+      }
+      // Put the new vector into place.
+      m_swap(new_matrix);
+      return;
+    }
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+        rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+        = compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+        // FIXME: copying may be unnecessarily costly.
+        DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+        swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+    // Rows have grown or shrunk.
+    row_size = new_n_rows;
+  }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+  dimension_type old_n_rows = rows.size();
+
+  if (new_n_rows > old_n_rows) {
+    // Rows will be inserted.
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+        // Reallocation (of vector `rows') will take place.
+        std::vector<DB_Row<T> > new_rows;
+        new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+        new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+        // Construct the new rows (be careful: each new row must have
+        // the same capacity as each one of the old rows).
+        dimension_type i = new_n_rows;
+        while (i-- > old_n_rows)
+          new_rows[i].construct(new_n_rows, row_capacity);
+        // Steal the old rows.
+        ++i;
+        while (i-- > 0)
+          swap(new_rows[i], rows[i]);
+        // Put the new vector into place.
+        using std::swap;
+        swap(rows, new_rows);
+      }
+      else {
+        // Reallocation (of vector `rows') will NOT take place.
+        rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+        // Be careful: each new row must have
+        // the same capacity as each one of the old rows.
+        for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+          rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      DB_Matrix new_matrix(new_n_rows);
+      m_swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.resize(new_n_rows);
+    // Shrink the existing rows.
+    for (dimension_type i = new_n_rows; i-- > 0; )
+      rows[i].shrink(new_n_rows);
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+        rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+        = compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+        DB_Row<T> new_row(new_n_rows, new_row_capacity);
+        swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+  }
+  // DB_Rows have grown or shrunk.
+  row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const DB_Matrix<T>& x = *this;
+  const char separator = ' ';
+  const dimension_type nrows = x.num_rows();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j) {
+      using namespace IO_Operators;
+      s << x[i][j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>)
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type nrows;
+  if (!(s >> nrows))
+    return false;
+  resize_no_copy(nrows);
+  DB_Matrix& x = *this;
+  for (dimension_type i = 0; i < nrows;  ++i)
+    for (dimension_type j = 0; j < nrows; ++j) {
+      Result r = input(x[i][j], s, ROUND_CHECK);
+      if (result_relation(r) != VR_EQ || is_minus_infinity(x[i][j]))
+        return false;
+    }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename T>
+memory_size_type
+DB_Matrix<T>::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(DB_Row<T>);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes(row_capacity);
+  return n;
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The matrix must be square.
+  if (num_rows() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Matrix has fewer columns than rows:\n"
+         << "row_size is " << row_size
+         << ", num_rows() is " << num_rows() << "!"
+         << endl;
+#endif
+    return false;
+  }
+
+  const DB_Matrix& x = *this;
+  const dimension_type n_rows = x.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+  const dimension_type n = c.num_rows();
+  for (dimension_type i = 0; i < n; ++i) {
+    for (dimension_type j = 0; j < n; ++j)
+      s << c[i][j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_templates_hh)
diff --git a/src/DB_Matrix_types.hh b/src/DB_Matrix_types.hh
new file mode 100644
index 0000000..afc4e2a
--- /dev/null
+++ b/src/DB_Matrix_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_DB_Matrix_types_hh
+#define PPL_DB_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Matrix_types_hh)
diff --git a/src/DB_Row_defs.hh b/src/DB_Row_defs.hh
new file mode 100644
index 0000000..d756481
--- /dev/null
+++ b/src/DB_Row_defs.hh
@@ -0,0 +1,470 @@
+/* DB_Row class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Row_defs_hh
+#define PPL_DB_Row_defs_hh 1
+
+#include "DB_Row_types.hh"
+#include "globals_types.hh"
+#include "Ptr_Iterator_defs.hh"
+#include <cstddef>
+#include <vector>
+
+#ifndef PPL_DB_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When PPL_DB_ROW_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each instance
+  of the class DB_Row carries its own capacity; this enables extra
+  consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_DB_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_DB_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_DB_ROW_EXTRA_DEBUG)
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+  //! Default constructor.
+  DB_Row_Impl_Handler();
+
+  //! Destructor.
+  ~DB_Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+  The class template DB_Row<T> allows for the efficient representation of
+  the single rows of a DB_Matrix. It contains elements of type T stored
+  as a vector. The class T is a family of extended numbers that
+  must provide representation for
+  \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+  <EM>not a number</EM>, since this arises as the ``result'' of
+  undefined sums like \f$ +\infty + (-\infty) \f$).
+
+  The class T must provide the following methods:
+
+  \code
+    T()
+  \endcode
+  is the default constructor: no assumption is made on the particular
+  object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+  (see below).
+  \code
+    ~T()
+  \endcode
+  is the destructor.
+  \code
+    bool is_nan() const
+  \endcode
+  returns <CODE>true</CODE> if and only \p *this represents
+  the  <EM>not a number</EM> value.
+  \code
+    bool OK() const
+  \endcode
+  returns <CODE>true</CODE> if and only if \p *this satisfies all
+  its invariants.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+  //! Pre-constructs a row: construction must be completed by construct().
+  DB_Row();
+
+  //! \name Post-constructors.
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed.
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity of
+    (i.e., it can contain at least) \p elements, \p sz of which
+    will be constructed now.
+  */
+  void construct(dimension_type sz, dimension_type capacity);
+
+  //! Constructs properly a conservative approximation of \p y.
+  /*!
+    \param y
+    A row containing the elements whose upward approximations will
+    be used to properly construct \p *this.
+
+    \param capacity
+    The capacity of the constructed row.
+
+    It is assumed that \p capacity is greater than or equal to the
+    size of \p y.
+  */
+  template <typename U>
+  void construct_upward_approximation(const DB_Row<U>& y,
+                                      dimension_type capacity);
+
+  //@}
+
+  //! Tight constructor: resizing will require reallocation.
+  DB_Row(dimension_type sz);
+
+  //! Sizing constructor with capacity.
+  DB_Row(dimension_type sz, dimension_type capacity);
+
+  //! Ordinary copy constructor.
+  DB_Row(const DB_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  DB_Row(const DB_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+    Any new position is initialized to \f$+\infty\f$.
+  */
+  DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~DB_Row();
+
+  //! Assignment operator.
+  DB_Row& operator=(const DB_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(DB_Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  void assign(DB_Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed DB_Row object,
+    allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the DB_Row object is zero.
+  */
+  void allocate(dimension_type capacity);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row. The new positions are initialized
+    to \f$+\infty\f$.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns the size() of the largest possible DB_Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+  //! A (non const) random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<T*> iterator;
+
+  //! A const random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<const T*> const_iterator;
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const iterator.
+  const_iterator end() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const DB_Row& y);
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Row<T>& x, DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+               typename std::vector<DB_Row<T> >::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+  The class DB_Row_Impl_Handler::Impl provides the implementation of
+  DB_Row objects and, in particular, of the corresponding memory
+  allocation functions.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+public:
+  //! \name Custom allocator and deallocator.
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity T objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version: uses the standard operator delete to free
+    the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@}
+
+  //! Default constructor.
+  Impl();
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  /*! \brief
+    Exception-safe upward approximation construction mechanism
+    for coefficients.
+  */
+  template <typename U>
+  void construct_upward_approximation(const U& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Size accessors.
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_sz the actual size of \p *this.
+  void set_size(dimension_type new_sz);
+
+  //! Increments the size of \p *this by 1.
+  void bump_size();
+  //@}
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+private:
+  friend class DB_Row<T>;
+
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The vector of coefficients.
+  T vec_[
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+          0
+#else
+          1
+#endif
+  ];
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+
+  //! Exception-safe copy construction mechanism.
+  void copy_construct(const Impl& y);
+};
+
+#include "DB_Row_inlines.hh"
+#include "DB_Row_templates.hh"
+
+#endif // !defined(PPL_DB_Row_defs_hh)
diff --git a/src/DB_Row_inlines.hh b/src/DB_Row_inlines.hh
new file mode 100644
index 0000000..1ceeb7e
--- /dev/null
+++ b/src/DB_Row_inlines.hh
@@ -0,0 +1,428 @@
+/* DB_Row class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Row_inlines_hh
+#define PPL_DB_Row_inlines_hh 1
+
+#include "checked_defs.hh"
+#include "assert.hh"
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+                                           const dimension_type capacity) {
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+  PPL_ASSERT(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl
+::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(T)
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+    - 1*sizeof(T)
+#endif
+    + external_memory_in_bytes();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+  return std::numeric_limits<size_t>::max() / sizeof(T);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+  return size_;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+  size_ = new_sz;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+  ++size_;
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+  : size_(0) {
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+  shrink(0);
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+  : impl(0) {
+#if PPL_DB_ROW_EXTRA_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+  delete impl;
+}
+
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+  PPL_ASSERT(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+  return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+  return this->impl->size();
+}
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+  return this->capacity_;
+}
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+  : DB_Row_Impl_Handler<T>() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+               const
+#endif
+               dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(capacity <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  PPL_ASSERT(x.impl == 0);
+  x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if PPL_DB_ROW_EXTRA_DEBUG
+  PPL_ASSERT(x.capacity_ == 0);
+  x.capacity_ = capacity;
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(x.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  PPL_ASSERT(new_size <= x.capacity_);
+#endif
+  x.impl->expand_within_capacity(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(x.impl && y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  PPL_ASSERT(y.size() <= x.capacity_);
+#endif
+  x.impl->copy_construct_coefficients(*(y.impl));
+}
+
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+                                          const dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  PPL_ASSERT(y.impl);
+  x.impl->construct_upward_approximation(*(y.impl));
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+                     const dimension_type capacity) {
+  PPL_ASSERT(sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+  construct(sz, sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+                  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  construct(sz, capacity);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+  construct(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+  : DB_Row_Impl_Handler<T>() {
+  if (y.impl != 0) {
+    allocate(compute_capacity(y.size(), max_size()));
+    copy_construct_coefficients(y);
+  }
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+                  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  PPL_ASSERT(y.impl);
+  PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+                  const dimension_type sz,
+                  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  PPL_ASSERT(y.impl);
+  PPL_ASSERT(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(x.impl);
+  x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::m_swap(DB_Row& y) {
+  using std::swap;
+  DB_Row<T>& x = *this;
+  swap(x.impl, y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  swap(x.capacity_, y.capacity_);
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  x.impl = y.impl;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+  DB_Row tmp(y);
+  m_swap(tmp);
+  return *this;
+}
+
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+  DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+  const DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes(dimension_type capacity) const {
+  const DB_Row<T>& x = *this;
+  return x.impl->total_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes() const {
+  const DB_Row<T>& x = *this;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  return x.impl->total_memory_in_bytes(x.capacity_);
+#else
+  return x.impl->total_memory_in_bytes();
+#endif
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+  return !(x == y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+swap(DB_Row<T>& x, DB_Row<T>& y) {
+  x.m_swap(y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+          typename std::vector<DB_Row<T> >::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_inlines_hh)
diff --git a/src/DB_Row_templates.hh b/src/DB_Row_templates.hh
new file mode 100644
index 0000000..12dbac4
--- /dev/null
+++ b/src/DB_Row_templates.hh
@@ -0,0 +1,215 @@
+/* DB_Row class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_DB_Row_templates_hh
+#define PPL_DB_Row_templates_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    construct(vec_[i], y[i], ROUND_UP);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (y_size > 0) {
+    assign_r(vec_[0], y[0], ROUND_UP);
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      construct(vec_[i], y[i], ROUND_UP);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  PPL_ASSERT(size() <= new_size && new_size <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (size() == 0 && new_size > 0) {
+    // vec_[0] is already constructed: we just need to assign +infinity.
+    assign_r(vec_[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    bump_size();
+  }
+#endif
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED);
+    bump_size();
+  }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  PPL_ASSERT(new_size <= old_size);
+  // Since ~T() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) T(y.vec_[i]);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) T(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+memory_size_type
+DB_Row_Impl_Handler<T>::Impl::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += Parma_Polyhedra_Library::external_memory_in_bytes(vec_[i]);
+  return n;
+}
+
+template <typename T>
+bool
+DB_Row<T>::OK(const dimension_type row_size,
+              const dimension_type
+#if PPL_DB_ROW_EXTRA_DEBUG
+              row_capacity
+#endif
+              ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const DB_Row<T>& x = *this;
+  bool is_broken = false;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (x.capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+         << endl;
+    is_broken = true;
+  }
+  else if (x.capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif // !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (x.capacity_ != row_capacity) {
+    cerr << "DB_Row capacity mismatch: is " << x.capacity_
+         << ", should be " << row_capacity << "."
+         << endl;
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+  if (x.size() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Row size mismatch: is " << x.size()
+         << ", should be " << row_size << "."
+         << endl;
+#endif
+    is_broken = true;
+  }
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+         << ", size is " << x.size() << "."
+         << endl;
+#endif
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+  for (dimension_type i = x.size(); i-- > 0; ) {
+    const T& element = x[i];
+    // Not OK is bad.
+    if (!element.OK()) {
+      is_broken = true;
+      break;
+    }
+    // In addition, nans should never occur.
+    if (is_not_a_number(element)) {
+#ifndef NDEBUG
+      cerr << "Not-a-number found in DB_Row."
+           << endl;
+#endif
+      is_broken = true;
+      break;
+    }
+  }
+
+  return !is_broken;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+  if (x.size() != y.size())
+    return false;
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_templates_hh)
diff --git a/src/DB_Row_types.hh b/src/DB_Row_types.hh
new file mode 100644
index 0000000..03e6183
--- /dev/null
+++ b/src/DB_Row_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_DB_Row_types_hh
+#define PPL_DB_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Row_Impl_Handler;
+
+template <typename T>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_types_hh)
diff --git a/src/Dense_Row.cc b/src/Dense_Row.cc
new file mode 100644
index 0000000..20503c1
--- /dev/null
+++ b/src/Dense_Row.cc
@@ -0,0 +1,581 @@
+/* Dense_Row class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Dense_Row_defs.hh"
+#include "Coefficient_defs.hh"
+#include "assert.hh"
+#include "Sparse_Row_defs.hh"
+#include <iostream>
+#include <iomanip>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Dense_Row::Dense_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity) {
+  resize(sz, capacity);
+  for (Sparse_Row::const_iterator i = y.begin(),
+         i_end = y.lower_bound(sz); i != i_end; ++i)
+    (*this)[i.index()] = *i;
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::resize(dimension_type new_size) {
+  if (new_size <= size())
+    shrink(new_size);
+  else {
+    if (new_size > capacity()) {
+      // Reallocation is required.
+      // TODO: Consider using realloc() here.
+      // TODO: Consider using a smarter allocation strategy.
+      const dimension_type new_capacity = new_size;
+      Coefficient* const new_vec = impl.coeff_allocator.allocate(new_capacity);
+
+      if (impl.vec != 0) {
+        memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
+        impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+      }
+
+      impl.vec = new_vec;
+      impl.capacity = new_capacity;
+    }
+    PPL_ASSERT(new_size <= impl.capacity);
+    // Construct the additional elements.
+    while (impl.size != new_size) {
+      new (&impl.vec[impl.size]) Coefficient();
+      ++impl.size;
+    }
+  }
+  PPL_ASSERT(size() == new_size);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::resize(dimension_type new_size, dimension_type new_capacity) {
+  PPL_ASSERT(new_size <= new_capacity);
+
+  if (new_capacity == 0) {
+    destroy();
+    impl.vec = 0;
+    impl.size = 0;
+    impl.capacity = 0;
+
+    PPL_ASSERT(size() == new_size);
+    PPL_ASSERT(capacity() == new_capacity);
+    PPL_ASSERT(OK());
+
+    return;
+  }
+
+  if (new_capacity < capacity()) {
+
+    shrink(new_size);
+
+    PPL_ASSERT(impl.size == new_size);
+
+    Coefficient* const new_vec = impl.coeff_allocator.allocate(new_capacity);
+
+    PPL_ASSERT(impl.vec != 0);
+
+    memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
+
+    impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+
+    impl.vec = new_vec;
+    impl.capacity = new_capacity;
+  }
+  else {
+    if (new_capacity > capacity()) {
+
+      Coefficient* const new_vec = impl.coeff_allocator.allocate(new_capacity);
+
+      if (impl.vec != 0) {
+        memcpy(new_vec, impl.vec, sizeof(Coefficient) * impl.size);
+        impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+      }
+
+      impl.vec = new_vec;
+      impl.capacity = new_capacity;
+
+      resize(new_size);
+    }
+  }
+
+  PPL_ASSERT(size() == new_size);
+  PPL_ASSERT(capacity() == new_capacity);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::clear() {
+  for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+    *i = 0;
+}
+
+void
+PPL::Dense_Row::add_zeroes_and_shift(dimension_type n, dimension_type i) {
+  PPL_ASSERT(i <= size());
+  const dimension_type new_size = size() + n;
+  if (new_size > capacity()) {
+    Dense_Row new_row;
+    const dimension_type new_capacity = compute_capacity(new_size, max_size());
+    // This may throw.
+    new_row.impl.vec = new_row.impl.coeff_allocator.allocate(new_capacity);
+    new_row.impl.capacity = new_capacity;
+
+    dimension_type j = i;
+    try {
+      // Construct coefficients with value 0 in
+      // new_row.impl.vec[i ... i + n - 1]
+      for ( ; j < i + n; ++j)
+        new (&(new_row.impl.vec[j])) Coefficient(0);
+    } catch (...) {
+      // Destroy the zeroes constructed so far.
+      while (j != i) {
+        --j;
+        new_row.impl.vec[j].~Coefficient();
+      }
+      // The new_row's destructor will de-allocate the memory.
+      throw;
+    }
+
+    // Raw-copy the coefficients.
+    memcpy(new_row.impl.vec, impl.vec, sizeof(Coefficient) * i);
+    memcpy(&(new_row.impl.vec[i + n]), &impl.vec[i],
+           sizeof(Coefficient) * (impl.size - i));
+
+    using std::swap;
+    swap(impl.vec, new_row.impl.vec);
+    swap(impl.capacity, new_row.impl.capacity);
+
+    // *this now owns all coefficients, including the newly-added zeroes.
+    impl.size = new_size;
+
+    // The old vec will be de-allocated at the end of this block.
+
+  }
+  else {
+    memmove(&impl.vec[n + i], &impl.vec[i], sizeof(Coefficient)
+            * (impl.size - i));
+    impl.size = i;
+    const dimension_type target_size = impl.size + n;
+    PPL_ASSERT(target_size == i + n);
+    try {
+      // Construct n zeroes where the moved elements resided.
+      while (impl.size != target_size) {
+        new (&impl.vec[impl.size]) Coefficient(0);
+        ++impl.size;
+      }
+      impl.size = new_size;
+    } catch (...) {
+      // impl.vec[impl.size]..impl.vec[target_size-1] are still unconstructed,
+      // but impl.vec[target_size]..impl.vec[new_size] are constructed,
+      // because the memmove() moved already-constructed objects.
+
+      // NOTE: This loop can't throw, because destructors must not throw.
+      for (dimension_type j = target_size; j < new_size; ++j)
+        impl.vec[j].~Coefficient();
+
+      throw;
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::expand_within_capacity(const dimension_type new_size) {
+  PPL_ASSERT(new_size <= impl.capacity);
+  PPL_ASSERT(size() <= new_size && new_size <= max_size());
+  while (impl.size != new_size) {
+    new (&impl.vec[impl.size]) Coefficient();
+    ++impl.size;
+  }
+  PPL_ASSERT(size() == new_size);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::shrink(dimension_type new_size) {
+  PPL_ASSERT(new_size <= size());
+  // Since ~Coefficient() does not throw exceptions, nothing here does.
+
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  while (impl.size != new_size) {
+    --impl.size;
+    impl.vec[impl.size].~Coefficient();
+  }
+
+  PPL_ASSERT(size() == new_size);
+  PPL_ASSERT(OK());
+}
+
+PPL::Dense_Row::Dense_Row(const Sparse_Row& row)
+  : impl() {
+
+  init(row);
+
+  PPL_ASSERT(size() == row.size());
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Dense_Row::init(const Sparse_Row& row) {
+  impl.capacity = row.size();
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+  Sparse_Row::const_iterator itr = row.begin();
+  Sparse_Row::const_iterator itr_end = row.end();
+  while (impl.size != impl.capacity) {
+    // Constructs (*this)[impl.size] with row[impl.size].
+    if (itr != itr_end && itr.index() == impl.size) {
+      new (&impl.vec[impl.size]) Coefficient(*itr);
+      ++itr;
+    }
+    else
+      new (&impl.vec[impl.size]) Coefficient();
+    ++impl.size;
+  }
+  PPL_ASSERT(size() == row.size());
+  PPL_ASSERT(OK());
+}
+
+PPL::Dense_Row&
+PPL::Dense_Row::operator=(const Sparse_Row& row) {
+  if (size() > row.size()) {
+    // TODO: If the shrink() is modified to reallocate a smaller chunk,
+    // this can be optimized.
+    shrink(row.size());
+    Sparse_Row::const_iterator itr = row.begin();
+    Sparse_Row::const_iterator itr_end = row.end();
+    for (dimension_type i = 0; i < impl.size; ++i) {
+      // Computes (*this)[impl.size] = row[impl.size].
+      if (itr != itr_end && itr.index() == i) {
+        impl.vec[impl.size] = *itr;
+        ++itr;
+      }
+      else
+        impl.vec[impl.size] = Coefficient_zero();
+    }
+  }
+  else {
+    if (capacity() >= row.size()) {
+      // size() <= row.size() <= capacity().
+      Sparse_Row::const_iterator itr = row.begin();
+      Sparse_Row::const_iterator itr_end = row.end();
+      for (dimension_type i = 0; i < impl.size; ++i) {
+        // The following code is equivalent to (*this)[i] = row[i].
+        if (itr != itr_end && itr.index() == impl.size) {
+          new (&impl.vec[impl.size]) Coefficient(*itr);
+          ++itr;
+        }
+        else
+          new (&impl.vec[impl.size]) Coefficient();
+      }
+      // Construct the additional elements.
+      for ( ; impl.size != row.size(); ++impl.size) {
+        // Constructs (*this)[impl.size] with row[impl.size].
+        if (itr != itr_end && itr.index() == impl.size) {
+          new (&impl.vec[impl.size]) Coefficient(*itr);
+          ++itr;
+        }
+        else
+          new (&impl.vec[impl.size]) Coefficient();
+      }
+    }
+    else {
+      // Reallocation is required.
+      destroy();
+      init(row);
+    }
+  }
+  PPL_ASSERT(size() == row.size());
+  PPL_ASSERT(OK());
+
+  return *this;
+}
+
+void
+PPL::Dense_Row::normalize() {
+  Dense_Row& x = *this;
+  // Compute the GCD of all the coefficients.
+  const dimension_type sz = size();
+  dimension_type i = sz;
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  while (i > 0) {
+    Coefficient_traits::const_reference x_i = x[--i];
+    if (const int x_i_sign = sgn(x_i)) {
+      gcd = x_i;
+      if (x_i_sign < 0)
+        neg_assign(gcd);
+      goto compute_gcd;
+    }
+  }
+  // We reach this point only if all the coefficients were zero.
+  return;
+
+compute_gcd:
+  if (gcd == 1)
+    return;
+  while (i > 0) {
+    Coefficient_traits::const_reference x_i = x[--i];
+    if (x_i != 0) {
+      // Note: we use the ternary version instead of a more concise
+      // gcd_assign(gcd, x_i) to take advantage of the fact that
+      // `gcd' will decrease very rapidly (see D. Knuth, The Art of
+      // Computer Programming, second edition, Section 4.5.2,
+      // Algorithm C, and the discussion following it).  Our
+      // implementation of gcd_assign(x, y, z) for checked numbers is
+      // optimized for the case where `z' is smaller than `y', so that
+      // on checked numbers we gain.  On the other hand, for the
+      // implementation of gcd_assign(x, y, z) on GMP's unbounded
+      // integers we cannot make any assumption, so here we draw.
+      // Overall, we win.
+      gcd_assign(gcd, x_i, gcd);
+      if (gcd == 1)
+        return;
+    }
+  }
+  // Divide the coefficients by the GCD.
+  for (dimension_type j = sz; j-- > 0; ) {
+    Coefficient& x_j = x[j];
+    exact_div_assign(x_j, x_j, gcd);
+  }
+}
+
+void
+PPL::Dense_Row::reset(dimension_type first, dimension_type last) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= size());
+  for (dimension_type i = first; i < last; ++i)
+    (*this)[i] = 0;
+}
+
+void
+PPL::Dense_Row::linear_combine(const Dense_Row& y,
+                               Coefficient_traits::const_reference coeff1,
+                               Coefficient_traits::const_reference coeff2) {
+  Dense_Row& x = *this;
+  PPL_ASSERT(x.size() == y.size());
+
+  x.linear_combine(y, coeff1, coeff2, 0, x.size());
+}
+
+void
+PPL::Dense_Row::linear_combine(const Dense_Row& y,
+                               Coefficient_traits::const_reference coeff1,
+                               Coefficient_traits::const_reference coeff2,
+                               dimension_type start, dimension_type end) {
+  Dense_Row& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.size());
+  PPL_ASSERT(end <= y.size());
+  PPL_ASSERT(coeff1 != 0);
+  PPL_ASSERT(coeff2 != 0);
+
+  // If coeff1 is 1 and/or coeff2 is 1 or -1, we use an optimized
+  // implementation.
+
+  if (coeff1 == 1) {
+    if (coeff2 == 1) {
+      // Optimized implementation for coeff1==1, coeff2==1.
+      for (dimension_type i = start; i < end; ++i)
+        if (y[i] != 0)
+          x[i] += y[i];
+      return;
+    }
+    if (coeff2 == -1) {
+      // Optimized implementation for coeff1==1, coeff2==-1.
+      for (dimension_type i = start; i < end; ++i)
+        if (y[i] != 0)
+          x[i] -= y[i];
+      return;
+    }
+    // Optimized implementation for coeff1==1.
+    for (dimension_type i = start; i < end; ++i) {
+      Coefficient& x_i = x[i];
+      // The test against 0 gives rise to a consistent speed up: see
+      // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/014000.html
+      Coefficient_traits::const_reference y_i = y[i];
+      if (y_i != 0)
+        add_mul_assign(x_i, y_i, coeff2);
+    }
+    return;
+  }
+
+  if (coeff2 == 1) {
+    // Optimized implementation for coeff2==1.
+    for (dimension_type i = start; i < end; ++i) {
+      x[i] *= coeff1;
+      if (y[i] != 0)
+        x[i] += y[i];
+    }
+    return;
+  }
+  if (coeff2 == -1) {
+    // Optimized implementation for coeff2==-1.
+    for (dimension_type i = start; i < end; ++i) {
+      x[i] *= coeff1;
+      if (y[i] != 0)
+        x[i] -= y[i];
+    }
+    return;
+  }
+  // General case.
+  for (dimension_type i = start; i < end; ++i) {
+    Coefficient& x_i = x[i];
+    x[i] *= coeff1;
+    // The test against 0 gives rise to a consistent speed up: see
+    // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/014000.html
+    Coefficient_traits::const_reference y_i = y[i];
+    if (y_i != 0)
+      add_mul_assign(x_i, y_i, coeff2);
+  }
+}
+
+void
+PPL::Dense_Row::ascii_dump(std::ostream& s) const {
+  const Dense_Row& x = *this;
+  const dimension_type x_size = x.size();
+  s << "size " << x_size << " ";
+  for (dimension_type i = 0; i < x_size; ++i)
+    s << x[i] << ' ';
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Dense_Row)
+
+bool
+PPL::Dense_Row::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "size")
+    return false;
+  dimension_type new_size;
+  if (!(s >> new_size))
+    return false;
+
+  resize(new_size);
+
+  for (dimension_type col = 0; col < new_size; ++col)
+    if (!(s >> (*this)[col]))
+      return false;
+
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Dense_Row::external_memory_in_bytes(dimension_type /* capacity */) const {
+  return external_memory_in_bytes();
+}
+
+PPL::memory_size_type
+PPL::Dense_Row::external_memory_in_bytes() const {
+  memory_size_type n = impl.capacity * sizeof(Coefficient);
+  for (dimension_type i = size(); i-- > 0; )
+    n += PPL::external_memory_in_bytes(impl.vec[i]);
+  return n;
+}
+
+bool
+PPL::Dense_Row::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  bool is_broken = false;
+
+  if (impl.capacity > max_size()) {
+#ifndef NDEBUG
+    cerr << "Dense_Row capacity exceeds the maximum allowed size:" << endl
+         << "is " << impl.capacity
+         << ", should be less than or equal to " << max_size() << "."
+         << endl;
+#endif
+    is_broken = true;
+  }
+
+  if (size() > max_size()) {
+#ifndef NDEBUG
+    cerr << "Dense_Row size exceeds the maximum allowed size:" << endl
+         << "is " << size()
+         << ", should be less than or equal to " << max_size() << "." << endl;
+#endif
+    is_broken = true;
+  }
+
+  if (impl.capacity < size()) {
+#ifndef NDEBUG
+    cerr << "Dense_Row is completely broken: capacity is " << impl.capacity
+         << ", size is " << size() << "." << endl;
+#endif
+    is_broken = true;
+  }
+
+  if (capacity() == 0) {
+    if (impl.vec != 0)
+      is_broken = true;
+  }
+  else {
+    if (impl.vec == 0)
+      is_broken = true;
+  }
+
+  return !is_broken;
+}
+
+bool
+PPL::Dense_Row::OK(const dimension_type row_size) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  bool is_broken = !OK();
+
+  // Check the declared size.
+  if (size() != row_size) {
+#ifndef NDEBUG
+    cerr << "Dense_Row size mismatch: is " << size()
+         << ", should be " << row_size << "." << endl;
+#endif
+    is_broken = true;
+  }
+  return !is_broken;
+}
+
+/*! \relates Parma_Polyhedra_Library::Dense_Row */
+bool
+PPL::operator==(const Dense_Row& x, const Dense_Row& y) {
+  const dimension_type x_size = x.size();
+  const dimension_type y_size = y.size();
+
+  if (x_size != y_size)
+    return false;
+
+  for (dimension_type i = x_size; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+
+  return true;
+}
diff --git a/src/Dense_Row_defs.hh b/src/Dense_Row_defs.hh
new file mode 100644
index 0000000..429ca97
--- /dev/null
+++ b/src/Dense_Row_defs.hh
@@ -0,0 +1,561 @@
+/* Dense_Row class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Dense_Row_defs_hh
+#define PPL_Dense_Row_defs_hh 1
+
+#include "Dense_Row_types.hh"
+
+#include "globals_defs.hh"
+
+#include "Sparse_Row_types.hh"
+#include "Coefficient_defs.hh"
+#include <memory>
+#include <vector>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Dense_Row {
+public:
+  class iterator;
+  class const_iterator;
+
+  //! Constructs an empty row.
+  Dense_Row();
+
+  explicit Dense_Row(const Sparse_Row& row);
+
+  //! Tight constructor: resizing may require reallocation.
+  /*!
+    Constructs a row with size and capacity \p sz.
+  */
+  Dense_Row(dimension_type sz);
+
+  //! Sizing constructor with capacity.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+  */
+  Dense_Row(dimension_type sz, dimension_type capacity);
+
+  //! Ordinary copy constructor.
+  Dense_Row(const Dense_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Dense_Row(const Dense_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Dense_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity from a Sparse_Row.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Dense_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Dense_Row();
+
+  //! Assignment operator.
+  Dense_Row& operator=(const Dense_Row& y);
+
+  //! Assignment operator.
+  Dense_Row& operator=(const Sparse_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Dense_Row& y);
+
+  //! Resizes the row to \p sz.
+  void resize(dimension_type sz);
+
+  //! Resizes the row to \p sz, with capacity \p capacity.
+  void resize(dimension_type sz, dimension_type capacity);
+
+  //! Resets all the elements of this row.
+  void clear();
+
+  //! Adds \p n zeroes before index \p i.
+  /*!
+    \param n
+    The number of zeroes that will be added to the row.
+
+    \param i
+    The index of the element before which the zeroes will be added.
+
+    Existing elements with index greater than or equal to \p i are shifted
+    to the right by \p n positions. The size is increased by \p n.
+
+    Existing iterators are invalidated.
+  */
+  void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns the size() of the largest possible Dense_Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of
+    the row and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  //! Swaps the i-th element with the j-th element.
+  //! Provided for compatibility with Sparse_Row
+  void swap_coefficients(dimension_type i, dimension_type j);
+
+  //! Swaps the element pointed to by i with the element pointed to by j.
+  //! Provided for compatibility with Sparse_Row
+  void swap_coefficients(iterator i, iterator j);
+
+  iterator begin();
+  const_iterator begin() const;
+
+  iterator end();
+  const_iterator end() const;
+
+  //! Resets the i-th element to 0.
+  //! Provided for compatibility with Sparse_Row
+  void reset(dimension_type i);
+
+  //! Resets the elements [first,last) to 0.
+  //! Provided for compatibility with Sparse_Row
+  void reset(dimension_type first, dimension_type last);
+
+  //! Resets the element pointed to by itr to 0.
+  //! Provided for compatibility with Sparse_Row.
+  iterator reset(iterator itr);
+
+  //! Gets the i-th element.
+  //! Provided for compatibility with Sparse_Row.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator find(dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator find(dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator find(iterator itr, dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator find(const_iterator itr, dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator lower_bound(dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator lower_bound(dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator lower_bound(iterator itr, dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(iterator itr, dimension_type i,
+                       Coefficient_traits::const_reference x);
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(iterator itr, dimension_type i);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when c1 is zero.
+
+    This method takes \f$O(n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_second
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_first(const Dense_Row& y,
+                           const Func1& f, const Func2& g);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, 0) must do nothing, for every c1.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_second(const Dense_Row& y,
+                            const Func1& g, const Func2& h);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine_needs_second
+  */
+  template <typename Func1, typename Func2, typename Func3>
+  void combine(const Dense_Row& y,
+               const Func1& f, const Func2& g, const Func3& h);
+
+  //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+  //! each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param coeff1
+    The coefficient used for elements of *this.
+    It must not be 0.
+
+    \param coeff2
+    The coefficient used for elements of y.
+    It must not be 0.
+
+    This method takes \f$O(n)\f$ time.
+
+    \see combine_needs_first
+    \see combine_needs_second
+    \see combine
+  */
+  void linear_combine(const Dense_Row& y,
+                      Coefficient_traits::const_reference coeff1,
+                      Coefficient_traits::const_reference coeff2);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  /*!
+    This method detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+    order to save some work.
+
+    coeff1 and coeff2 must not be 0.
+  */
+  void linear_combine(const Dense_Row& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Checks if all the invariants are satisfied and that the actual
+    size matches the value provided as argument.
+  */
+  bool OK(dimension_type row_size) const;
+
+private:
+  void init(const Sparse_Row& row);
+
+  void destroy();
+
+  struct Impl {
+
+    Impl();
+
+    ~Impl();
+
+    //! The number of coefficients in the row.
+    dimension_type size;
+
+    //! The capacity of the row.
+    dimension_type capacity;
+
+    //! The allocator used to allocate/deallocate vec.
+    std::allocator<Coefficient> coeff_allocator;
+
+    //! The vector of coefficients.
+    //! An empty vector may be stored as NULL instead of using a valid pointer.
+    Coefficient* vec;
+  };
+
+  Impl impl;
+
+  //! Returns the capacity of the row.
+  dimension_type capacity() const;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::iterator {
+public:
+
+  typedef std::bidirectional_iterator_tag iterator_category;
+  typedef Coefficient value_type;
+  typedef ptrdiff_t difference_type;
+  typedef value_type* pointer;
+  typedef value_type& reference;
+
+  iterator();
+  iterator(Dense_Row& row1, dimension_type i1);
+
+  Coefficient& operator*();
+  Coefficient_traits::const_reference operator*() const;
+
+  //! Returns the index of the element pointed to by \c *this.
+  /*!
+    If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+    equivalent to *itr.
+
+    \returns the index of the element pointed to by \c *this.
+  */
+  dimension_type index() const;
+
+  iterator& operator++();
+  iterator operator++(int);
+
+  iterator& operator--();
+  iterator operator--(int);
+
+  bool operator==(const iterator& x) const;
+  bool operator!=(const iterator& x) const;
+
+  operator const_iterator() const;
+
+  bool OK() const;
+
+private:
+  Dense_Row* row;
+  dimension_type i;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::const_iterator {
+public:
+
+  typedef const Coefficient value_type;
+  typedef ptrdiff_t difference_type;
+  typedef value_type* pointer;
+  typedef Coefficient_traits::const_reference reference;
+
+  const_iterator();
+  const_iterator(const Dense_Row& row1, dimension_type i1);
+
+  Coefficient_traits::const_reference operator*() const;
+
+  //! Returns the index of the element pointed to by \c *this.
+  /*!
+    If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+    equivalent to *itr.
+
+    \returns the index of the element pointed to by \c *this.
+  */
+  dimension_type index() const;
+
+  const_iterator& operator++();
+  const_iterator operator++(int);
+
+  const_iterator& operator--();
+  const_iterator operator--(int);
+
+  bool operator==(const const_iterator& x) const;
+  bool operator!=(const const_iterator& x) const;
+
+  bool OK() const;
+
+private:
+  const Dense_Row* row;
+  dimension_type i;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Dense_Row& x, Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void iter_swap(std::vector<Dense_Row>::iterator x,
+               std::vector<Dense_Row>::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Dense_Row_inlines.hh"
+#include "Dense_Row_templates.hh"
+
+#endif // !defined(PPL_Dense_Row_defs_hh)
diff --git a/src/Dense_Row_inlines.hh b/src/Dense_Row_inlines.hh
new file mode 100644
index 0000000..10c98b8
--- /dev/null
+++ b/src/Dense_Row_inlines.hh
@@ -0,0 +1,531 @@
+/* Dense_Row class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Dense_Row_inlines_hh
+#define PPL_Dense_Row_inlines_hh 1
+
+#include "assert.hh"
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Dense_Row::Impl::Impl()
+  : size(0), capacity(0), coeff_allocator(), vec(0) {
+}
+
+inline
+Dense_Row::Impl::~Impl() {
+  while (size != 0) {
+    --size;
+    vec[size].~Coefficient();
+  }
+  coeff_allocator.deallocate(vec, capacity);
+}
+
+inline dimension_type
+Dense_Row::max_size() {
+  return std::numeric_limits<size_t>::max() / sizeof(Coefficient);
+}
+
+inline dimension_type
+Dense_Row::size() const {
+  return impl.size;
+}
+
+inline dimension_type
+Dense_Row::capacity() const {
+  return impl.capacity;
+}
+
+inline
+Dense_Row::Dense_Row()
+  : impl() {
+
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz,
+                     const dimension_type capacity)
+  : impl() {
+
+  resize(sz, capacity);
+
+  PPL_ASSERT(size() == sz);
+  PPL_ASSERT(impl.capacity == capacity);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz)
+  : impl() {
+
+  resize(sz);
+
+  PPL_ASSERT(size() == sz);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y)
+  : impl() {
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  if (y.impl.vec != 0) {
+    impl.capacity = y.capacity();
+    impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+    while (impl.size != y.size()) {
+      new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+      ++impl.size;
+    }
+  }
+  PPL_ASSERT(size() == y.size());
+  PPL_ASSERT(capacity() == y.capacity());
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+                     const dimension_type capacity)
+  : impl() {
+  PPL_ASSERT(y.size() <= capacity);
+  PPL_ASSERT(capacity <= max_size());
+
+  impl.capacity = capacity;
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+  if (y.impl.vec != 0) {
+    while (impl.size != y.size()) {
+      new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+      ++impl.size;
+    }
+  }
+
+  PPL_ASSERT(size() == y.size());
+  PPL_ASSERT(impl.capacity == capacity);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+                     const dimension_type sz,
+                     const dimension_type capacity)
+  : impl() {
+  PPL_ASSERT(sz <= capacity);
+  PPL_ASSERT(capacity <= max_size());
+  PPL_ASSERT(capacity != 0);
+
+  impl.capacity = capacity;
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+  const dimension_type n = std::min(sz, y.size());
+  while (impl.size != n) {
+    new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+    ++impl.size;
+  }
+  while (impl.size != sz) {
+    new (&impl.vec[impl.size]) Coefficient();
+    ++impl.size;
+  }
+
+  PPL_ASSERT(size() == sz);
+  PPL_ASSERT(impl.capacity == capacity);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::~Dense_Row() {
+  // The `impl' field will be destroyed automatically.
+}
+
+inline void
+Dense_Row::destroy() {
+  resize(0);
+  impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+}
+
+inline void
+Dense_Row::m_swap(Dense_Row& y) {
+  using std::swap;
+  swap(impl.size, y.impl.size);
+  swap(impl.capacity, y.impl.capacity);
+  swap(impl.coeff_allocator, y.impl.coeff_allocator);
+  swap(impl.vec, y.impl.vec);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(y.OK());
+}
+
+inline Dense_Row&
+Dense_Row::operator=(const Dense_Row& y) {
+
+  if (this != &y && size() == y.size()) {
+    // Avoid reallocation.
+
+    for (dimension_type i = size(); i-- > 0; )
+      (*this)[i] = y[i];
+
+    return *this;
+  }
+
+  Dense_Row x(y);
+  swap(*this, x);
+
+  return *this;
+}
+
+inline Coefficient&
+Dense_Row::operator[](const dimension_type k) {
+  PPL_ASSERT(impl.vec != 0);
+  PPL_ASSERT(k < size());
+  return impl.vec[k];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::operator[](const dimension_type k) const {
+  PPL_ASSERT(impl.vec != 0);
+  PPL_ASSERT(k < size());
+  return impl.vec[k];
+}
+
+inline void
+Dense_Row::swap_coefficients(dimension_type i, dimension_type j) {
+  std::swap((*this)[i], (*this)[j]);
+}
+
+inline void
+Dense_Row::swap_coefficients(iterator i, iterator j) {
+  std::swap(*i, *j);
+}
+
+inline void
+Dense_Row::reset(dimension_type i) {
+  (*this)[i] = 0;
+}
+
+inline Dense_Row::iterator
+Dense_Row::reset(iterator itr) {
+  *itr = 0;
+  ++itr;
+  return itr;
+}
+
+inline Dense_Row::iterator
+Dense_Row::begin() {
+  return iterator(*this, 0);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::begin() const {
+  return const_iterator(*this, 0);
+}
+
+inline Dense_Row::iterator
+Dense_Row::end() {
+  return iterator(*this, size());
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::end() const {
+  return const_iterator(*this, size());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::get(dimension_type i) const {
+  return (*this)[i];
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(dimension_type i) {
+  return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(dimension_type i) const {
+  return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(iterator itr, dimension_type i) {
+  (void)itr;
+  return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(const_iterator itr, dimension_type i) const {
+  (void)itr;
+  return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(dimension_type i) {
+  return find(i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(dimension_type i) const {
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(iterator itr, dimension_type i) {
+  return find(itr, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(const_iterator itr, dimension_type i) const {
+  return find(itr, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i,
+                  Coefficient_traits::const_reference x) {
+  (*this)[i] = x;
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i) {
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i,
+                  Coefficient_traits::const_reference x) {
+  (void)itr;
+  (*this)[i] = x;
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i) {
+  (void)itr;
+  return find(i);
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+/*! \relates Dense_Row */
+inline bool
+operator!=(const Dense_Row& x, const Dense_Row& y) {
+  return !(x == y);
+}
+
+
+inline
+Dense_Row::iterator::iterator()
+  : row(NULL), i(0) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::iterator::iterator(Dense_Row& row1,dimension_type i1)
+  : row(&row1), i(i1) {
+  PPL_ASSERT(OK());
+}
+
+inline Coefficient&
+Dense_Row::iterator::operator*() {
+  PPL_ASSERT(i < row->size());
+  return (*row)[i];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::iterator::operator*() const {
+  PPL_ASSERT(i < row->size());
+  return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::iterator::index() const {
+  return i;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator++() {
+  PPL_ASSERT(i < row->size());
+  ++i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator++(int) {
+  iterator tmp(*this);
+  ++(*this);
+  return tmp;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator--() {
+  PPL_ASSERT(i > 0);
+  --i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator--(int) {
+  iterator tmp(*this);
+  --(*this);
+  return tmp;
+}
+
+inline bool
+Dense_Row::iterator::operator==(const iterator& x) const {
+  return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::iterator::operator!=(const iterator& x) const {
+  return !(*this == x);
+}
+
+inline
+Dense_Row::iterator::operator const_iterator() const {
+  return const_iterator(*row, i);
+}
+
+inline bool
+Dense_Row::iterator::OK() const {
+  if (row == NULL)
+    return true;
+  // i can be equal to row.size() for past-the-end iterators
+  return (i <= row->size());
+}
+
+
+inline
+Dense_Row::const_iterator::const_iterator()
+  : row(NULL), i(0) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::const_iterator::const_iterator(const Dense_Row& row1,
+                                          dimension_type i1)
+  : row(&row1), i(i1) {
+  PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::const_iterator::operator*() const {
+  PPL_ASSERT(i < row->size());
+  return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::const_iterator::index() const {
+  return i;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator++() {
+  PPL_ASSERT(i < row->size());
+  ++i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator++(int) {
+  const_iterator tmp(*this);
+  ++(*this);
+  return tmp;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator--() {
+  PPL_ASSERT(i > 0);
+  --i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator--(int) {
+  const_iterator tmp(*this);
+  --(*this);
+  return tmp;
+}
+
+inline bool
+Dense_Row::const_iterator::operator==(const const_iterator& x) const {
+  return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::const_iterator::operator!=(const const_iterator& x) const {
+  return !(*this == x);
+}
+
+inline bool
+Dense_Row::const_iterator::OK() const {
+  if (row == NULL)
+    return true;
+  // i can be equal to row.size() for past-the-end iterators
+  return (i <= row->size());
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+               Coefficient_traits::const_reference coeff1,
+               Coefficient_traits::const_reference coeff2) {
+  x.linear_combine(y, coeff1, coeff2);
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+               Coefficient_traits::const_reference c1,
+               Coefficient_traits::const_reference c2,
+               dimension_type start, dimension_type end) {
+  x.linear_combine(y, c1, c2, start, end);
+}
+
+/*! \relates Dense_Row */
+inline void
+swap(Dense_Row& x, Dense_Row& y) {
+  x.m_swap(y);
+}
+
+/*! \relates Dense_Row */
+inline void
+iter_swap(std::vector<Dense_Row>::iterator x,
+          std::vector<Dense_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Dense_Row_inlines_hh)
diff --git a/src/Dense_Row_templates.hh b/src/Dense_Row_templates.hh
new file mode 100644
index 0000000..6108256
--- /dev/null
+++ b/src/Dense_Row_templates.hh
@@ -0,0 +1,56 @@
+/* Dense_Row class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Dense_Row_templates_hh
+#define PPL_Dense_Row_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_first(const Dense_Row& y, const Func1& /* f */,
+                               const Func2& g) {
+  for (dimension_type i = size(); i-- > 0; )
+    g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_second(const Dense_Row& y, const Func1& g,
+                                const Func2& /* h */) {
+  for (dimension_type i = size(); i-- > 0; )
+    g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Dense_Row::combine(const Dense_Row& y, const Func1& /* f */, const Func2& g,
+                   const Func3& /* h */) {
+  for (dimension_type i = size(); i-- > 0; )
+    g((*this)[i], y[i]);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Dense_Row_templates_hh)
diff --git a/src/Dense_Row_types.hh b/src/Dense_Row_types.hh
new file mode 100644
index 0000000..e4a31d5
--- /dev/null
+++ b/src/Dense_Row_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Dense_Row_types_hh
+#define PPL_Dense_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Dense_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Dense_Row_types_hh)
diff --git a/src/Determinate_defs.hh b/src/Determinate_defs.hh
new file mode 100644
index 0000000..1db6792
--- /dev/null
+++ b/src/Determinate_defs.hh
@@ -0,0 +1,331 @@
+/* Determinate class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Determinate_defs_hh
+#define PPL_Determinate_defs_hh
+
+#include "Determinate_types.hh"
+#include "Constraint_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Variable_defs.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Determinate */
+template <typename PSET>
+void swap(Determinate<PSET>& x, Determinate<PSET>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  COW-wrapped pointset.
+
+  \relates Determinate
+*/
+template <typename PSET>
+bool operator==(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  COW-wrapped pointsets.
+
+  \relates Determinate
+*/
+template <typename PSET>
+bool operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PSET>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \brief
+  A wrapper for PPL pointsets, providing them with a
+  <EM>determinate constraint system</EM> interface, as defined
+  in \ref Bag98 "[Bag98]".
+
+  The implementation uses a copy-on-write optimization, making the
+  class suitable for constructions, like the <EM>finite powerset</EM>
+  and <EM>ask-and-tell</EM> of \ref Bag98 "[Bag98]", that are likely
+  to perform many copies.
+
+  \ingroup PPL_CXX_interface
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Determinate {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Constructs a COW-wrapped object corresponding to the pointset \p pset.
+  */
+  Determinate(const PSET& pset);
+
+  /*! \brief
+    Constructs a COW-wrapped object corresponding to the pointset
+    defined by \p cs.
+  */
+  Determinate(const Constraint_System& cs);
+
+  /*! \brief
+    Constructs a COW-wrapped object corresponding to the pointset
+    defined by \p cgs.
+  */
+  Determinate(const Congruence_System& cgs);
+
+  //! Copy constructor.
+  Determinate(const Determinate& y);
+
+  //! Destructor.
+  ~Determinate();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Domain Element
+  //@{
+
+  //! Returns a const reference to the embedded pointset.
+  const PSET& pointset() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this embeds the universe
+    element \p PSET.
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this embeds the empty
+    element of \p PSET.
+  */
+  bool is_bottom() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+  bool definitely_entails(const Determinate& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are definitely equivalent.
+  */
+  bool is_definitely_equivalent_to(const Determinate& y) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*!
+    Returns <CODE>true</CODE> if and only if this domain
+    has a nontrivial weakening operator.
+  */
+  static bool has_nontrivial_weakening();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Domain Element
+
+
+  //! \name Member Functions that May Modify the Domain Element
+  //@{
+
+  //! Assigns to \p *this the upper bound of \p *this and \p y.
+  void upper_bound_assign(const Determinate& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Determinate& y);
+
+  //! Assigns to \p *this the result of weakening \p *this with \p y.
+  void weakening_assign(const Determinate& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+  */
+  void concatenate_assign(const Determinate& y);
+
+  //! Returns a reference to the embedded element.
+  PSET& pointset();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    On return from this method, the representation of \p *this
+    is not shared by different Determinate objects.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  void mutate();
+
+  //! Assignment operator.
+  Determinate& operator=(const Determinate& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Determinate& y);
+
+  //@} // Member Functions that May Modify the Domain Element
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A function adapter for the Determinate class.
+  /*! \ingroup PPL_CXX_interface
+    It lifts a Binary_Operator_Assign function object, taking arguments
+    of type PSET, producing the corresponding function object taking
+    arguments of type Determinate<PSET>.
+
+    The template parameter Binary_Operator_Assign is supposed to
+    implement an <EM>apply and assign</EM> function, i.e., a function
+    having signature <CODE>void foo(PSET& x, const PSET& y)</CODE> that
+    applies an operator to \c x and \c y and assigns the result to \c x.
+    For instance, such a function object is obtained by
+    <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  template <typename Binary_Operator_Assign>
+  class Binary_Operator_Assign_Lifter {
+  public:
+    //! Explicit unary constructor.
+    explicit
+    Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+
+    //! Function-application operator.
+    void operator()(Determinate& x, const Determinate& y) const;
+
+  private:
+    //! The function object to be lifted.
+    Binary_Operator_Assign op_assign_;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Helper function returning a Binary_Operator_Assign_Lifter object,
+    also allowing for the deduction of template arguments.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  template <typename Binary_Operator_Assign>
+  static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+  lift_op_assign(Binary_Operator_Assign op_assign);
+
+private:
+  //! The possibly shared representation of a Determinate object.
+  /*! \ingroup PPL_CXX_interface
+    By adopting the <EM>copy-on-write</EM> technique, a single
+    representation of the base-level object may be shared by more than
+    one object of the class Determinate.
+  */
+  class Rep {
+  private:
+    /*! \brief
+      Count the number of references:
+      -   0: leaked, \p pset is non-const;
+      -   1: one reference, \p pset is non-const;
+      - > 1: more than one reference, \p pset is const.
+    */
+    mutable unsigned long references;
+
+    //! Private and unimplemented: assignment not allowed.
+    Rep& operator=(const Rep& y);
+
+    //! Private and unimplemented: copies not allowed.
+    Rep(const Rep& y);
+
+    //! Private and unimplemented: default construction not allowed.
+    Rep();
+
+  public:
+    //! The possibly shared, embedded pointset.
+    PSET pset;
+
+    /*! \brief
+      Builds a new representation by creating a pointset
+      of the specified kind, in the specified vector space.
+    */
+    Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+    //! Builds a new representation by copying the pointset \p p.
+    Rep(const PSET& p);
+
+    //! Builds a new representation by copying the constraints in \p cs.
+    Rep(const Constraint_System& cs);
+
+    //! Builds a new representation by copying the constraints in \p cgs.
+    Rep(const Congruence_System& cgs);
+
+    //! Destructor.
+    ~Rep();
+
+    //! Registers a new reference.
+    void new_reference() const;
+
+    /*! \brief
+      Unregisters one reference; returns <CODE>true</CODE> if and only if
+      the representation has become unreferenced.
+    */
+    bool del_reference() const;
+
+    //! True if and only if this representation is currently shared.
+    bool is_shared() const;
+
+    /*! \brief
+      Returns a lower bound to the total size in bytes of the memory
+      occupied by \p *this.
+    */
+    memory_size_type total_memory_in_bytes() const;
+
+    /*! \brief
+      Returns a lower bound to the size in bytes of the memory
+      managed by \p *this.
+    */
+    memory_size_type external_memory_in_bytes() const;
+  };
+
+  /*! \brief
+    A pointer to the possibly shared representation of
+    the base-level domain element.
+  */
+  Rep* prep;
+
+  friend bool
+  operator==<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+  friend bool
+  operator!=<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+};
+
+#include "Determinate_inlines.hh"
+
+#endif // !defined(PPL_Determinate_defs_hh)
diff --git a/src/Determinate_inlines.hh b/src/Determinate_inlines.hh
new file mode 100644
index 0000000..43cdacb
--- /dev/null
+++ b/src/Determinate_inlines.hh
@@ -0,0 +1,305 @@
+/* Determinate class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Determinate_inlines_hh
+#define PPL_Determinate_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(dimension_type num_dimensions,
+                          Degenerate_Element kind)
+  : references(0), pset(num_dimensions, kind) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const PSET& p)
+  : references(0), pset(p) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Constraint_System& cs)
+  : references(0), pset(cs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Congruence_System& cgs)
+  : references(0), pset(cgs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::~Rep() {
+  PPL_ASSERT(references == 0);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::Rep::new_reference() const {
+  ++references;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::del_reference() const {
+  return --references == 0;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::is_shared() const {
+  return references > 1;
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::external_memory_in_bytes() const {
+  return pset.external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const PSET& pset)
+  : prep(new Rep(pset)) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Constraint_System& cs)
+  : prep(new Rep(cs)) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Congruence_System& cgs)
+  : prep(new Rep(cgs)) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Determinate& y)
+  : prep(y.prep) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::~Determinate() {
+  if (prep->del_reference())
+    delete prep;
+}
+
+template <typename PSET>
+inline Determinate<PSET>&
+Determinate<PSET>::operator=(const Determinate& y) {
+  y.prep->new_reference();
+  if (prep->del_reference())
+    delete prep;
+  prep = y.prep;
+  return *this;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::m_swap(Determinate& y) {
+  using std::swap;
+  swap(prep, y.prep);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::mutate() {
+  if (prep->is_shared()) {
+    Rep* const new_prep = new Rep(prep->pset);
+    (void) prep->del_reference();
+    new_prep->new_reference();
+    prep = new_prep;
+  }
+}
+
+template <typename PSET>
+inline const PSET&
+Determinate<PSET>::pointset() const {
+  return prep->pset;
+}
+
+template <typename PSET>
+inline PSET&
+Determinate<PSET>::pointset() {
+  mutate();
+  return prep->pset;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::upper_bound_assign(const Determinate& y) {
+  pointset().upper_bound_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::meet_assign(const Determinate& y) {
+  pointset().intersection_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::has_nontrivial_weakening() {
+  // FIXME: the following should be turned into a query to PSET.  This
+  // can be postponed until the time the ask-and-tell construction is
+  // revived.
+  return false;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::weakening_assign(const Determinate& y) {
+  // FIXME: the following should be turned into a proper
+  // implementation.  This can be postponed until the time the
+  // ask-and-tell construction is revived.
+  pointset().difference_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::concatenate_assign(const Determinate& y) {
+  pointset().concatenate_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::definitely_entails(const Determinate& y) const {
+  return prep == y.prep || y.prep->pset.contains(prep->pset);
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_definitely_equivalent_to(const Determinate& y) const {
+  return prep == y.prep || prep->pset == y.prep->pset;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_top() const {
+  return prep->pset.is_universe();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_bottom() const {
+  return prep->pset.is_empty();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::external_memory_in_bytes() const {
+  return prep->total_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::OK() const {
+  return prep->pset.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PSET>& x) {
+  s << x.pointset();
+  return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator==(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+  return x.prep == y.prep || x.prep->pset == y.prep->pset;
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+  return x.prep != y.prep && x.prep->pset != y.prep->pset;
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+  : op_assign_(op_assign) {
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+  op_assign_(x.pointset(), y.pointset());
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PSET>::lift_op_assign(Binary_Operator_Assign op_assign) {
+  return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline void
+swap(Determinate<PSET>& x, Determinate<PSET>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Determinate_inlines_hh)
diff --git a/src/Determinate_types.hh b/src/Determinate_types.hh
new file mode 100644
index 0000000..2c79f6f
--- /dev/null
+++ b/src/Determinate_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Determinate_types_hh
+#define PPL_Determinate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Determinate_types_hh)
diff --git a/src/Difference_Floating_Point_Expression_defs.hh b/src/Difference_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..c2e6ef8
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_defs.hh
@@ -0,0 +1,221 @@
+/* Declarations for the Difference_Floating_Point_Expression class and
+   its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Difference_Floating_Point_Expression_defs_hh
+#define PPL_Difference_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Difference_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Difference Floating Point Expression.
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of difference floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+  operators on linear form such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \adifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,  we construct the interval linear form
+  \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  on \f$\cV\f$ as follows:
+  \f[
+  \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the difference floating point
+    expression corresponding to \p x \f$\ominus\f$ \p y.
+  */
+  Difference_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+  //! Destructor.
+  ~Difference_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Difference_Floating_Point_Expression<FP_Interval_Type,
+                                                   FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Difference_Floating_Point_Expression(
+         const Difference_Floating_Point_Expression<FP_Interval_Type,
+                                                    FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited asssignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Difference_Floating_Point_Expression<FP_Interval_Type,
+                                                       FP_Format>& e);
+
+
+}; // class Difference_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Difference_Floating_Point_Expression_inlines.hh"
+#include "Difference_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_defs_hh)
diff --git a/src/Difference_Floating_Point_Expression_inlines.hh b/src/Difference_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..ac7daf2
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,70 @@
+/* Difference_Floating_Point_Expression class implementation: inline
+   functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Difference_Floating_Point_Expression_inlines_hh
+#define PPL_Difference_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Difference_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+  : first_operand(x), second_operand(y){
+  assert(x != 0);
+  assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Difference_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_inlines_hh)
diff --git a/src/Difference_Floating_Point_Expression_templates.hh b/src/Difference_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..9923c5a
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_templates.hh
@@ -0,0 +1,53 @@
+/* Difference_Floating_Point_Expression class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Difference_Floating_Point_Expression_templates_hh
+#define PPL_Difference_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!first_operand->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                      linearized_second_operand))
+    return false;
+  result -= linearized_second_operand;
+  relative_error(linearized_second_operand, rel_error);
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_templates_hh)
diff --git a/src/Difference_Floating_Point_Expression_types.hh b/src/Difference_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..2a435e7
--- /dev/null
+++ b/src/Difference_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Difference_Floating_Point_Expression_types_hh
+#define PPL_Difference_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Difference_Floating_Point_Expression_types_hh)
diff --git a/src/Division_Floating_Point_Expression_defs.hh b/src/Division_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..ed9751b
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_defs.hh
@@ -0,0 +1,237 @@
+/* Declarations for the Division_Floating_Point_Expression class and its
+   constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Division_Floating_Point_Expression_defs_hh
+#define PPL_Division_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Division_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Division Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearizationd of division floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+  operator on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adivlf
+  i'
+  =
+  \left(i \adivifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+  \f]
+  Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,
+  we construct the interval linear form
+  \f$
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  \f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adivlf
+  [a, b]\right)
+  \aslf
+  \left(\varepsilon_{\mathbf{f}}\left(
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \adivlf
+  [a, b]\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1],
+  \f]
+  given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1} \oslash \iota\left(
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+  method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+  and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the division floating point
+    expression corresponding to \p num \f$\oslash\f$ \p den.
+  */
+  Division_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den);
+
+  //! Destructor.
+  ~Division_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Division_Floating_Point_Expression<FP_Interval_Type,
+                                                 FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Copy constructor: temporary inhibited.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Division_Floating_Point_Expression(
+         const Division_Floating_Point_Expression<FP_Interval_Type,
+                                                  FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Assignment operator: temporary inhibited.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Division_Floating_Point_Expression<FP_Interval_Type,
+            FP_Format>& e);
+
+}; // class Division_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Division_Floating_Point_Expression_inlines.hh"
+#include "Division_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_defs_hh)
diff --git a/src/Division_Floating_Point_Expression_inlines.hh b/src/Division_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..c6ed4df
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,69 @@
+/* Division_Floating_Point_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Division_Floating_Point_Expression_inlines_hh
+#define PPL_Division_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Division_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den)
+  : first_operand(num), second_operand(den) {
+  assert(num != 0);
+  assert(den != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Division_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_inlines_hh)
diff --git a/src/Division_Floating_Point_Expression_templates.hh b/src/Division_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..3feb26a
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_templates.hh
@@ -0,0 +1,61 @@
+/* Division_Floating_Point_Expression class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Division_Floating_Point_Expression_templates_hh
+#define PPL_Division_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                                linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  this->intervalize(linearized_second_operand, int_store,
+                    intervalized_second_operand);
+
+  // Check if we may divide by zero.
+  if (intervalized_second_operand.lower() <= 0
+      && intervalized_second_operand.upper() >= 0)
+    return false;
+
+  if (!first_operand->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result /= intervalized_second_operand;
+  rel_error /= intervalized_second_operand;
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_templates_hh)
diff --git a/src/Division_Floating_Point_Expression_types.hh b/src/Division_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..bfd2010
--- /dev/null
+++ b/src/Division_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Division_Floating_Point_Expression_types_hh
+#define PPL_Division_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Division_Floating_Point_Expression_types_hh)
diff --git a/src/Doubly_Linked_Object_defs.hh b/src/Doubly_Linked_Object_defs.hh
new file mode 100644
index 0000000..bb6b4f2
--- /dev/null
+++ b/src/Doubly_Linked_Object_defs.hh
@@ -0,0 +1,65 @@
+/* Doubly_Linked_Object class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Doubly_Linked_Object_defs_hh
+#define PPL_Doubly_Linked_Object_defs_hh 1
+
+#include "Doubly_Linked_Object_types.hh"
+#include "EList_types.hh"
+#include "EList_Iterator_types.hh"
+
+//! A (base) class for doubly linked objects.
+class Parma_Polyhedra_Library::Implementation::Doubly_Linked_Object {
+public:
+  //! Default constructor.
+  Doubly_Linked_Object();
+
+  //! Creates a chain element with forward link \p f and backward link \p b.
+  Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b);
+
+  //! Inserts \p y before \p *this.
+  void insert_before(Doubly_Linked_Object& y);
+
+  //! Inserts \p y after \p *this.
+  void insert_after(Doubly_Linked_Object& y);
+
+  //! Erases \p *this from the chain and returns a pointer to the next element.
+  Doubly_Linked_Object* erase();
+
+  //! Erases \p *this from the chain.
+  ~Doubly_Linked_Object();
+
+private:
+  //! Forward link.
+  Doubly_Linked_Object* next;
+
+  //! Backward link.
+  Doubly_Linked_Object* prev;
+
+  template <typename T> friend class EList;
+  template <typename T> friend class EList_Iterator;
+};
+
+#include "Doubly_Linked_Object_inlines.hh"
+
+#endif // !defined(PPL_Doubly_Linked_Object_defs_hh)
diff --git a/src/Doubly_Linked_Object_inlines.hh b/src/Doubly_Linked_Object_inlines.hh
new file mode 100644
index 0000000..147c6e3
--- /dev/null
+++ b/src/Doubly_Linked_Object_inlines.hh
@@ -0,0 +1,74 @@
+/* Doubly_Linked_Object class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Doubly_Linked_Object_inlines_hh
+#define PPL_Doubly_Linked_Object_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object() {
+}
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f,
+                                           Doubly_Linked_Object* b)
+  : next(f),
+    prev(b) {
+}
+
+inline void
+Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) {
+  y.next = this;
+  y.prev = prev;
+  prev->next = &y;
+  prev = &y;
+}
+
+inline void
+Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) {
+  y.next = next;
+  y.prev = this;
+  next->prev = &y;
+  next = &y;
+}
+
+inline Doubly_Linked_Object*
+Doubly_Linked_Object::erase() {
+  next->prev = prev;
+  prev->next = next;
+  return next;
+}
+
+inline
+Doubly_Linked_Object::~Doubly_Linked_Object() {
+  erase();
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Doubly_Linked_Object_inlines_hh)
diff --git a/src/Doubly_Linked_Object_types.hh b/src/Doubly_Linked_Object_types.hh
new file mode 100644
index 0000000..2e3cac1
--- /dev/null
+++ b/src/Doubly_Linked_Object_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Doubly_Linked_Object_types_hh
+#define PPL_Doubly_Linked_Object_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+class Doubly_Linked_Object;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Doubly_Linked_Object_types_hh)
diff --git a/src/EList_Iterator_defs.hh b/src/EList_Iterator_defs.hh
new file mode 100644
index 0000000..0cabaa5
--- /dev/null
+++ b/src/EList_Iterator_defs.hh
@@ -0,0 +1,88 @@
+/* EList_Iterator class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_Iterator_defs_hh
+#define PPL_EList_Iterator_defs_hh 1
+
+#include "EList_Iterator_types.hh"
+#include "Doubly_Linked_Object_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+template <typename T>
+bool operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+template <typename T>
+bool operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList_Iterator {
+public:
+  //! Constructs an iterator pointing to nothing.
+  EList_Iterator();
+
+  //! Constructs an iterator pointing to \p p.
+  explicit EList_Iterator(Doubly_Linked_Object* p);
+
+  //! Changes \p *this so that it points to \p p.
+  EList_Iterator& operator=(Doubly_Linked_Object* p);
+
+  //! Indirect member selector.
+  T* operator->();
+
+  //! Dereference operator.
+  T& operator*();
+
+  //! Preincrement operator.
+  EList_Iterator& operator++();
+
+  //! Postincrement operator.
+  EList_Iterator operator++(int);
+
+  //! Predecrement operator.
+  EList_Iterator& operator--();
+
+  //! Postdecrement operator.
+  EList_Iterator operator--(int);
+
+private:
+  //! Embedded pointer.
+  Doubly_Linked_Object* ptr;
+
+  friend bool operator==<T>(const EList_Iterator& x, const EList_Iterator& y);
+
+  friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
+};
+
+#include "EList_Iterator_inlines.hh"
+
+#endif // !defined(PPL_EList_Iterator_defs_hh)
diff --git a/src/EList_Iterator_inlines.hh b/src/EList_Iterator_inlines.hh
new file mode 100644
index 0000000..1d5e96c
--- /dev/null
+++ b/src/EList_Iterator_inlines.hh
@@ -0,0 +1,109 @@
+/* EList_Iterator class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_Iterator_inlines_hh
+#define PPL_EList_Iterator_inlines_hh 1
+
+#include "Doubly_Linked_Object_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator() {
+}
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator(Doubly_Linked_Object* p)
+  : ptr(p) {
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator=(Doubly_Linked_Object* p) {
+  ptr = p;
+  return *this;
+}
+
+template <typename T>
+inline T*
+EList_Iterator<T>::operator->() {
+  return static_cast<T*>(ptr);
+}
+
+template <typename T>
+inline T&
+EList_Iterator<T>::operator*() {
+  return *operator->();
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator++() {
+  ptr = ptr->next;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator++(int) {
+  EList_Iterator tmp = *this;
+  ++*this;
+  return tmp;
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator--() {
+  ptr = ptr->prev;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator--(int) {
+  EList_Iterator tmp = *this;
+  --*this;
+  return tmp;
+}
+
+template <typename T>
+inline bool
+operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr == y.ptr;
+}
+
+template <typename T>
+inline bool
+operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr != y.ptr;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_Iterator_inlines_hh)
diff --git a/src/EList_Iterator_types.hh b/src/EList_Iterator_types.hh
new file mode 100644
index 0000000..584f9fa
--- /dev/null
+++ b/src/EList_Iterator_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_EList_Iterator_types_hh
+#define PPL_EList_Iterator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_Iterator_types_hh)
diff --git a/src/EList_defs.hh b/src/EList_defs.hh
new file mode 100644
index 0000000..3d3fa96
--- /dev/null
+++ b/src/EList_defs.hh
@@ -0,0 +1,90 @@
+/* EList class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_defs_hh
+#define PPL_EList_defs_hh 1
+
+#include "EList_types.hh"
+#include "Doubly_Linked_Object_defs.hh"
+#include "EList_Iterator_defs.hh"
+
+/*! \brief
+  A simple kind of embedded list (i.e., a doubly linked objects
+  where the links are embedded in the objects themselves).
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList
+  : private Doubly_Linked_Object {
+public:
+  //! A const iterator to traverse the list.
+  typedef EList_Iterator<const T> const_iterator;
+
+  //! A non-const iterator to traverse the list.
+  typedef EList_Iterator<T> iterator;
+
+  //! Constructs an empty list.
+  EList();
+
+  //! Destructs the list and all the elements in it.
+  ~EList();
+
+  //! Pushes \p obj to the front of the list.
+  void push_front(T& obj);
+
+  //! Pushes \p obj to the back of the list.
+  void push_back(T& obj);
+
+  /*! \brief
+    Inserts \p obj just before \p position and returns an iterator
+    that points to the inserted object.
+  */
+  iterator insert(iterator position, T& obj);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  iterator erase(iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  iterator end();
+
+  //! Returns a const iterator pointing to the beginning of the list.
+  const_iterator begin() const;
+
+  //! Returns a const iterator pointing one past the last element in the list.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#include "EList_inlines.hh"
+
+#endif // !defined(PPL_EList_defs_hh)
diff --git a/src/EList_inlines.hh b/src/EList_inlines.hh
new file mode 100644
index 0000000..010c2a3
--- /dev/null
+++ b/src/EList_inlines.hh
@@ -0,0 +1,119 @@
+/* EList class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_EList_inlines_hh
+#define PPL_EList_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList<T>::EList()
+  : Doubly_Linked_Object(this, this) {
+}
+
+template <typename T>
+inline void
+EList<T>::push_front(T& obj) {
+  next->insert_before(obj);
+}
+
+template <typename T>
+inline void
+EList<T>::push_back(T& obj) {
+  prev->insert_after(obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::insert(iterator position, T& obj) {
+  position->insert_before(obj);
+  return iterator(&obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::begin() {
+  return iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::end() {
+  return iterator(this);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::begin() const {
+  return const_iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::end() const {
+  return const_iterator(const_cast<EList<T>*>(this));
+}
+
+template <typename T>
+inline bool
+EList<T>::empty() const {
+  return begin() == end();
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::erase(iterator position) {
+  assert(!empty());
+  return iterator(position->erase());
+}
+
+template <typename T>
+inline
+EList<T>::~EList() {
+  // Erase and deallocate all the elements.
+  for (iterator i = begin(), lend = end(), next; i != lend; i = next) {
+    next = erase(i);
+    delete &*i;
+  }
+}
+
+template <typename T>
+inline bool
+EList<T>::OK() const {
+  for (const_iterator i = begin(), lend = end(); i != lend; ++i)
+    if (!i->OK())
+      return false;
+
+  return true;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_inlines_hh)
diff --git a/src/EList_types.hh b/src/EList_types.hh
new file mode 100644
index 0000000..4793ecc
--- /dev/null
+++ b/src/EList_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_EList_types_hh
+#define PPL_EList_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_EList_types_hh)
diff --git a/src/Expression_Adapter_defs.hh b/src/Expression_Adapter_defs.hh
new file mode 100644
index 0000000..f06e1ea
--- /dev/null
+++ b/src/Expression_Adapter_defs.hh
@@ -0,0 +1,216 @@
+/* Expression_Adapter class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Adapter_defs_hh
+#define PPL_Expression_Adapter_defs_hh 1
+
+#include "Expression_Adapter_types.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Adapters' base type (for template meta-programming).
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Expression_Adapter_Base {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression objects.
+/*!
+  The adapters are meant to provide read-only, customized access to the
+  Linear_Expression members in Constraint, Generator, Congruence and
+  Grid_Generator objects. They typically implement the user-level view
+  of these expressions.
+
+  \note
+  A few methods implement low-level access routines and will take
+  bare indexes as arguments (rather than Variable objects):
+  when such a bare index \c i is zero, the inhomogeneous term is meant;
+  when the bare index \c i is greater than zero, the coefficient of the
+  variable having id <CODE>i - 1</CODE> is meant.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter
+  : public Expression_Adapter_Base {
+public:
+  //! The type of this object.
+  typedef Expression_Adapter<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename T::const_reference inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename T::raw_type raw_type;
+
+  //! Returns an adapter after one-level unwrapping.
+  inner_type inner() const;
+
+  //! The type of const iterators on coefficients.
+  typedef typename raw_type::const_iterator const_iterator;
+
+  //! Returns the current representation of \p *this.
+  Representation representation() const;
+
+  //! Iterator pointing to the first nonzero variable coefficient.
+  const_iterator begin() const;
+
+  //! Iterator pointing after the last nonzero variable coefficient.
+  const_iterator end() const;
+
+  //! Iterator pointing to the first nonzero variable coefficient
+  //! of a variable bigger than or equal to \p v.
+  const_iterator lower_bound(Variable v) const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+  bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are zero.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief Returns \p true if \p *this is equal to \p y.
+
+    Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+  */
+  template <typename Expression>
+  bool is_equal_to(const Expression& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars is zero.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+  //! Returns the \p i -th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Returns the coefficient of variable \p v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is zero,
+    for each i in [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  //! Returns the number of zero coefficient in [start, end).
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end).
+    Returns zero if all the coefficients in the range are zero.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  //! Returns the index of the last nonzero element, or zero if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last),
+  //! or \p last if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there
+  //! are no nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+  //! for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+  //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Sparse_Row& row) const;
+
+  //! Returns \c true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both \p *this and \p y.
+  template <typename Expression>
+  bool have_a_common_variable(const Expression& y,
+                              Variable first, Variable last) const;
+
+protected:
+  //! Constructor.
+  explicit Expression_Adapter(const raw_type& expr);
+  //! The raw, completely unwrapped object subject to adaptation.
+  const raw_type& raw_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A transparent adapter for Linear_Expression objects.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter_Transparent
+  : public Expression_Adapter<T> {
+  typedef Expression_Adapter<T> base_type;
+public:
+  //! The type of this object.
+  typedef Expression_Adapter_Transparent<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename base_type::inner_type inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename base_type::raw_type raw_type;
+
+  //! The type of const iterators on coefficients.
+  typedef typename base_type::const_iterator const_iterator;
+
+  //! Constructor.
+  explicit Expression_Adapter_Transparent(const raw_type& expr);
+};
+
+#include "Expression_Adapter_inlines.hh"
+
+#endif // !defined(PPL_Expression_Adapter_defs_hh)
diff --git a/src/Expression_Adapter_inlines.hh b/src/Expression_Adapter_inlines.hh
new file mode 100644
index 0000000..c45f5e8
--- /dev/null
+++ b/src/Expression_Adapter_inlines.hh
@@ -0,0 +1,229 @@
+/* Expression_Adapter class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Adapter_inlines_hh
+#define PPL_Expression_Adapter_inlines_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Adapter<T>::Expression_Adapter(const raw_type& expr)
+  : raw_(expr) {
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::inner_type
+Expression_Adapter<T>::inner() const {
+  return inner_type(raw_);
+}
+
+template <typename T>
+inline Representation
+Expression_Adapter<T>::representation() const {
+  return inner().representation();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::begin() const {
+  return inner().begin();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::end() const {
+  return inner().end();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::lower_bound(Variable v) const {
+  return inner().lower_bound(v);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::space_dimension() const {
+  return inner().space_dimension();
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::coefficient(Variable v) const {
+  return inner().coefficient(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::inhomogeneous_term() const {
+  return inner().inhomogeneous_term();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::is_zero() const {
+  return inner().is_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_homogeneous_terms_are_zero() const {
+  return inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>::is_equal_to(const Expression& y) const {
+  return inner().is_equal_to(y);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes(const Variables_Set& vars) const {
+  return inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(dimension_type i) const {
+  return inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(Variable v) const {
+  return inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_zeroes(dimension_type start,
+                                  dimension_type end) const {
+  return inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::num_zeroes(dimension_type start,
+                                  dimension_type end) const {
+  return inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Adapter<T>::gcd(dimension_type start,
+                           dimension_type end) const {
+  return inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero() const {
+  return inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero(dimension_type first,
+                                    dimension_type last) const {
+  return inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::first_nonzero(dimension_type first,
+                                     dimension_type last) const {
+  return inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  return inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+              dimension_type start, dimension_type end) const {
+  return inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  return inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Dense_Row& row) const {
+  inner().get_row(row);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Sparse_Row& row) const {
+  inner().get_row(row);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::have_a_common_variable(const Expression& y,
+                         Variable first, Variable last) const {
+  return inner().have_a_common_variable(y, first, last);
+}
+
+template <typename T>
+inline
+Expression_Adapter_Transparent<T>
+::Expression_Adapter_Transparent(const raw_type& expr)
+  : base_type(expr) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Adapter_inlines_hh)
diff --git a/src/Expression_Adapter_types.hh b/src/Expression_Adapter_types.hh
new file mode 100644
index 0000000..856d260
--- /dev/null
+++ b/src/Expression_Adapter_types.hh
@@ -0,0 +1,28 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Expression_Adapter_types_hh
+#define PPL_Expression_Adapter_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Expression_Adapter_Base;
+
+template <typename T>
+class Expression_Adapter;
+
+template <typename T>
+class Expression_Adapter_Transparent;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Adapter_types_hh)
diff --git a/src/Expression_Hide_Inhomo_defs.hh b/src/Expression_Hide_Inhomo_defs.hh
new file mode 100644
index 0000000..877c8e1
--- /dev/null
+++ b/src/Expression_Hide_Inhomo_defs.hh
@@ -0,0 +1,147 @@
+/* Expression_Hide_Inhomo class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Inhomo_defs_hh
+#define PPL_Expression_Hide_Inhomo_defs_hh 1
+
+#include "Expression_Hide_Inhomo_types.hh"
+
+#include "Expression_Adapter_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  An adapter for Linear_Expression that hides the inhomogeneous term.
+
+  The methods of this class always pretend that the value of the
+  inhomogeneous term is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Inhomo
+  : public Expression_Adapter<T> {
+  typedef Expression_Adapter<T> base_type;
+public:
+  //! The type of this object.
+  typedef Expression_Hide_Inhomo<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename base_type::inner_type inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename base_type::raw_type raw_type;
+
+  //! Constructor.
+  explicit Expression_Hide_Inhomo(const raw_type& expr);
+
+public:
+  //! The type of const iterators on coefficients.
+  typedef typename base_type::const_iterator const_iterator;
+
+  //! Returns the constant zero.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+  bool is_zero() const;
+
+  /*! \brief Returns \p true if \p *this is equal to \p y.
+
+    Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+  */
+  template <typename Expression>
+  bool is_equal_to(const Expression& y) const;
+
+  //! Returns the i-th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Returns the coefficient of v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars is zero.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is zero,
+    for each i in [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are zero, returns zero.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  //! Returns the index of the last nonzero element, or zero if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there
+  //! are no nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+  //! for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+  //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Sparse_Row& row) const;
+};
+
+#include "Expression_Hide_Inhomo_inlines.hh"
+
+#endif // !defined(PPL_Expression_Hide_Inhomo_defs_hh)
diff --git a/src/Expression_Hide_Inhomo_inlines.hh b/src/Expression_Hide_Inhomo_inlines.hh
new file mode 100644
index 0000000..e3a6919
--- /dev/null
+++ b/src/Expression_Hide_Inhomo_inlines.hh
@@ -0,0 +1,218 @@
+/* Expression_Hide_Inhomo class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Inhomo_inlines_hh
+#define PPL_Expression_Hide_Inhomo_inlines_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Expression_Hide_Inhomo<T>::Expression_Hide_Inhomo(const raw_type& expr)
+  : base_type(expr) {
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::inhomogeneous_term() const {
+  // Pretend it is zero.
+  return Coefficient_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::is_zero() const {
+  // Don't check the inhomogeneous_term (i.e., pretend it is zero).
+  return this->inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y) const {
+  const dimension_type x_dim = this->space_dimension();
+  const dimension_type y_dim = y.space_dimension();
+  if (x_dim != y_dim)
+    return false;
+  if (y.inhomogeneous_term() != 0)
+    return false;
+  // Note that the inhomogeneous term is not compared.
+  return this->inner().is_equal_to(y, 1, x_dim + 1);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(dimension_type i) const {
+  if (i == 0)
+    return Coefficient_zero();
+  else
+    return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(Variable v) const {
+  return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes(const Variables_Set& vars) const {
+  return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::all_zeroes(dimension_type start,
+                                      dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::num_zeroes(dimension_type start,
+                                      dimension_type end) const {
+  if (start == end)
+    return 0;
+  dimension_type nz = 0;
+  if (start == 0) {
+    ++start;
+    ++nz;
+  }
+  nz += this->inner().num_zeroes(start, end);
+  return nz;
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Inhomo<T>::gcd(dimension_type start,
+                               dimension_type end) const {
+  if (start == end)
+    return Coefficient_zero();
+  if (start == 0)
+    ++start;
+  return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero() const {
+  return this->inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero(dimension_type first,
+                                        dimension_type last) const {
+  if (first == last)
+    return last;
+  if (first == 0)
+    ++first;
+  return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::first_nonzero(dimension_type first,
+                                         dimension_type last) const {
+  if (first == last)
+    return last;
+  if (first == 0)
+    ++first;
+  return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& y) const {
+  bool had_0 = (y.count(0) == 1);
+  this->inner().has_a_free_dimension_helper(y);
+  if (had_0)
+    y.insert(0);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+              dimension_type start, dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Dense_Row& row) const {
+  this->inner().get_row(row);
+  row.reset(0);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Sparse_Row& row) const {
+  this->inner().get_row(row);
+  row.reset(0);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Inhomo_inlines_hh)
diff --git a/src/Expression_Hide_Inhomo_types.hh b/src/Expression_Hide_Inhomo_types.hh
new file mode 100644
index 0000000..b9174ea
--- /dev/null
+++ b/src/Expression_Hide_Inhomo_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Expression_Hide_Inhomo_types_hh
+#define PPL_Expression_Hide_Inhomo_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Inhomo;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Inhomo_types_hh)
diff --git a/src/Expression_Hide_Last_defs.hh b/src/Expression_Hide_Last_defs.hh
new file mode 100644
index 0000000..7da0a9f
--- /dev/null
+++ b/src/Expression_Hide_Last_defs.hh
@@ -0,0 +1,165 @@
+/* Expression_Hide_Last class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Last_defs_hh
+#define PPL_Expression_Hide_Last_defs_hh 1
+
+#include "Expression_Hide_Last_types.hh"
+
+#include "Expression_Adapter_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression that maybe hides the last coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Last
+  : public Expression_Adapter<T> {
+  typedef Expression_Adapter<T> base_type;
+public:
+  //! The type of this object.
+  typedef Expression_Hide_Last<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename base_type::inner_type inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename base_type::raw_type raw_type;
+
+  //! The type of const iterators on coefficients.
+  typedef typename base_type::const_iterator const_iterator;
+
+  //! Constructor.
+  explicit Expression_Hide_Last(const raw_type& expr, bool hide_last);
+
+  //! Iterator pointing after the last nonzero variable coefficient.
+  const_iterator end() const;
+
+  //! Iterator pointing to the first nonzero variable coefficient
+  //! of a variable bigger than or equal to \p v.
+  const_iterator lower_bound(Variable v) const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+  bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are zero.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief Returns \p true if \p *this is equal to \p y.
+
+    Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+  */
+  template <typename Expression>
+  bool is_equal_to(const Expression& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars is zero.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+  //! Returns the \p i -th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Returns the coefficient of variable \p v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is zero,
+    for each i in [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  //! Returns the number of zero coefficient in [start, end).
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end).
+    Returns zero if all the coefficients in the range are zero.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  //! Returns the index of the last nonzero element, or zero if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last),
+  //! or \p last if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+  //! for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+  //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Sparse_Row& row) const;
+
+  //! Returns \c true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both \p *this and \p y.
+  template <typename Expression>
+  bool have_a_common_variable(const Expression& y,
+                              Variable first, Variable last) const;
+
+private:
+  //! Whether or not the last coefficient is hidden.
+  const bool hide_last_;
+};
+
+#include "Expression_Hide_Last_inlines.hh"
+
+#endif // !defined(PPL_Expression_Hide_Last_defs_hh)
diff --git a/src/Expression_Hide_Last_inlines.hh b/src/Expression_Hide_Last_inlines.hh
new file mode 100644
index 0000000..db169fc
--- /dev/null
+++ b/src/Expression_Hide_Last_inlines.hh
@@ -0,0 +1,241 @@
+/* Expression_Hide_Last class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Expression_Hide_Last_inlines_hh
+#define PPL_Expression_Hide_Last_inlines_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Hide_Last<T>::Expression_Hide_Last(const raw_type& expr,
+                                              const bool hide_last)
+  : base_type(expr), hide_last_(hide_last) {
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::space_dimension() const {
+  dimension_type dim = this->inner().space_dimension();
+  if (hide_last_) {
+    PPL_ASSERT(dim > 0);
+    --dim;
+  }
+  return dim;
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::end() const {
+  if (hide_last_) {
+    return this->inner().lower_bound(Variable(space_dimension()));
+  }
+  else {
+    return this->inner().end();
+  }
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::lower_bound(Variable v) const {
+  PPL_ASSERT(v.space_dimension() <= space_dimension() + 1);
+  return this->inner().lower_bound(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::coefficient(Variable v) const {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  return this->inner().coefficient(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::is_zero() const {
+  return this->inner().all_zeroes(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_homogeneous_terms_are_zero() const {
+  return this->inner().all_zeroes(1, space_dimension() + 1);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y) const {
+  const dimension_type x_dim = space_dimension();
+  const dimension_type y_dim = y.space_dimension();
+  if (x_dim != y_dim)
+    return false;
+  return is_equal_to(y, 0, x_dim + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(const Variables_Set& vars) const {
+  PPL_ASSERT(vars.space_dimension() <= space_dimension());
+  return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(dimension_type i) const {
+  PPL_ASSERT(i <= space_dimension());
+  return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(Variable v) const {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(dimension_type start,
+                                    dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::num_zeroes(dimension_type start,
+                                    dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Last<T>::gcd(dimension_type start,
+                             dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero() const {
+  return this->inner().last_nonzero(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero(dimension_type first,
+                                      dimension_type last) const {
+  PPL_ASSERT(last <= space_dimension() + 1);
+  return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::first_nonzero(dimension_type first,
+                                       dimension_type last) const {
+  PPL_ASSERT(last <= space_dimension() + 1);
+  return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  if (x.empty())
+    return;
+  PPL_ASSERT(*(--x.end()) <= space_dimension());
+  this->inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+              dimension_type start, dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  PPL_ASSERT(end <= y.space_dimension() + 1);
+  return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  PPL_ASSERT(end <= y.space_dimension() + 1);
+  return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Dense_Row& row) const {
+  this->inner().get_row(row);
+  if (hide_last_) {
+    PPL_ASSERT(row.size() != 0);
+    row.resize(row.size() - 1);
+  }
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Sparse_Row& row) const {
+  this->inner().get_row(row);
+  if (hide_last_) {
+    PPL_ASSERT(row.size() != 0);
+    row.resize(row.size() - 1);
+  }
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::have_a_common_variable(const Expression& y,
+                         Variable first, Variable last) const {
+  PPL_ASSERT(last.space_dimension() <= space_dimension() + 1);
+  PPL_ASSERT(last.space_dimension() <= y.space_dimension() + 1);
+  return this->inner().have_a_common_variable(y, first, last);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Last_inlines_hh)
diff --git a/src/Expression_Hide_Last_types.hh b/src/Expression_Hide_Last_types.hh
new file mode 100644
index 0000000..ce37227
--- /dev/null
+++ b/src/Expression_Hide_Last_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Expression_Hide_Last_types_hh
+#define PPL_Expression_Hide_Last_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Last;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Expression_Hide_Last_types_hh)
diff --git a/src/Float.cc b/src/Float.cc
new file mode 100644
index 0000000..1571a1b
--- /dev/null
+++ b/src/Float.cc
@@ -0,0 +1,44 @@
+/* IEC 559 floating point format related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Float_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+const uint64_t float_intel_double_extended::LSP_INF;
+const uint64_t float_intel_double_extended::LSP_ZERO;
+const uint64_t float_intel_double_extended::LSP_DMAX;
+const uint64_t float_intel_double_extended::LSP_NMAX;
+
+const uint64_t float_ieee754_quad::MSP_SGN_MASK;
+const uint64_t float_ieee754_quad::MSP_POS_INF;
+const uint64_t float_ieee754_quad::MSP_NEG_INF;
+const uint64_t float_ieee754_quad::MSP_POS_ZERO;
+const uint64_t float_ieee754_quad::MSP_NEG_ZERO;
+const uint64_t float_ieee754_quad::LSP_INF;
+const uint64_t float_ieee754_quad::LSP_ZERO;
+const uint64_t float_ieee754_quad::MSP_MAX;
+const uint64_t float_ieee754_quad::LSP_MAX;
+
+} // Parma_Polyhedra_Library
diff --git a/src/Float_defs.hh b/src/Float_defs.hh
new file mode 100644
index 0000000..090e70e
--- /dev/null
+++ b/src/Float_defs.hh
@@ -0,0 +1,523 @@
+/* IEC 559 floating point format related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Float_defs_hh
+#define PPL_Float_defs_hh 1
+
+#include "globals_types.hh"
+#include "meta_programming.hh"
+#include "compiler.hh"
+#include "assert.hh"
+#include "Concrete_Expression_types.hh"
+#include "Variable_types.hh"
+#include "Linear_Form_types.hh"
+#include <set>
+#include <cmath>
+#include <map>
+#include <gmp.h>
+
+#ifdef NAN
+#define PPL_NAN NAN
+#else
+#define PPL_NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_half {
+  uint16_t word;
+  static const uint16_t SGN_MASK = 0x8000U;
+  static const uint16_t EXP_MASK = 0xfc00U;
+  static const uint16_t WRD_MAX = 0x7bffU;
+  static const uint16_t POS_INF = 0x7c00U;
+  static const uint16_t NEG_INF = 0xfc00U;
+  static const uint16_t POS_ZERO = 0x0000U;
+  static const uint16_t NEG_ZERO = 0x8000U;
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 5;
+  static const unsigned int MANTISSA_BITS = 10;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_HALF;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_single {
+  uint32_t word;
+  static const uint32_t SGN_MASK = 0x80000000U;
+  static const uint32_t EXP_MASK = 0x7f800000U;
+  static const uint32_t WRD_MAX = 0x7f7fffffU;
+  static const uint32_t POS_INF = 0x7f800000U;
+  static const uint32_t NEG_INF = 0xff800000U;
+  static const uint32_t POS_ZERO = 0x00000000U;
+  static const uint32_t NEG_ZERO = 0x80000000U;
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 8;
+  static const unsigned int MANTISSA_BITS = 23;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_SINGLE;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef WORDS_BIGENDIAN
+#ifndef PPL_WORDS_BIGENDIAN
+#define PPL_WORDS_BIGENDIAN
+#endif
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_double {
+#ifdef PPL_WORDS_BIGENDIAN
+  uint32_t msp;
+  uint32_t lsp;
+#else
+  uint32_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x80000000U;
+  static const uint32_t MSP_POS_INF = 0x7ff00000U;
+  static const uint32_t MSP_NEG_INF = 0xfff00000U;
+  static const uint32_t MSP_POS_ZERO = 0x00000000U;
+  static const uint32_t MSP_NEG_ZERO = 0x80000000U;
+  static const uint32_t LSP_INF = 0;
+  static const uint32_t LSP_ZERO = 0;
+  static const uint32_t MSP_MAX = 0x7fefffffU;
+  static const uint32_t LSP_MAX = 0xffffffffU;
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 11;
+  static const unsigned int MANTISSA_BITS = 52;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_DOUBLE;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_single {
+  uint32_t word;
+  static const uint32_t SGN_MASK = 0x80000000U;
+  static const uint32_t EXP_MASK = 0x7f000000U;
+  static const uint32_t WRD_MAX = 0x7fffffffU;
+  static const uint32_t POS_INF = 0x7f000000U;
+  static const uint32_t NEG_INF = 0xff000000U;
+  static const uint32_t POS_ZERO = 0x00000000U;
+  static const uint32_t NEG_ZERO = 0x80000000U;
+  static const unsigned int BASE = 16;
+  static const unsigned int EXPONENT_BITS = 7;
+  static const unsigned int MANTISSA_BITS = 24;
+  static const int EXPONENT_BIAS = 64;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IBM_SINGLE;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_double {
+  static const unsigned int BASE = 16;
+  static const unsigned int EXPONENT_BITS = 7;
+  static const unsigned int MANTISSA_BITS = 56;
+  static const int EXPONENT_BIAS = 64;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_intel_double_extended {
+#ifdef PPL_WORDS_BIGENDIAN
+  uint32_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x00008000U;
+  static const uint32_t MSP_POS_INF = 0x00007fffU;
+  static const uint32_t MSP_NEG_INF = 0x0000ffffU;
+  static const uint32_t MSP_POS_ZERO = 0x00000000U;
+  static const uint32_t MSP_NEG_ZERO = 0x00008000U;
+  static const uint64_t LSP_INF = static_cast<uint64_t>(0x8000000000000000ULL);
+  static const uint64_t LSP_ZERO = 0;
+  static const uint32_t MSP_MAX = 0x00007ffeU;
+  static const uint64_t LSP_DMAX = static_cast<uint64_t>(0x7fffffffffffffffULL);
+  static const uint64_t LSP_NMAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 63;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format =
+                                     INTEL_DOUBLE_EXTENDED;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_quad {
+#ifdef PPL_WORDS_BIGENDIAN
+  uint64_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint64_t msp;
+#endif
+  static const uint64_t MSP_SGN_MASK = static_cast<uint64_t>(0x8000000000000000ULL);
+  static const uint64_t MSP_POS_INF = static_cast<uint64_t>(0x7fff000000000000ULL);
+  static const uint64_t MSP_NEG_INF = static_cast<uint64_t>(0xffff000000000000ULL);
+  static const uint64_t MSP_POS_ZERO = static_cast<uint64_t>(0x0000000000000000ULL);
+  static const uint64_t MSP_NEG_ZERO = static_cast<uint64_t>(0x8000000000000000ULL);
+  static const uint64_t LSP_INF = 0;
+  static const uint64_t LSP_ZERO = 0;
+  static const uint64_t MSP_MAX = static_cast<uint64_t>(0x7ffeffffffffffffULL);
+  static const uint64_t LSP_MAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 112;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_QUAD;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Float : public False { };
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> : public True {
+public:
+#if PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+  typedef float_ieee754_half Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+  typedef float_ieee754_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+  typedef float_ieee754_double Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+  typedef float_ibm_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+  typedef float_ieee754_quad Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+  typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_FLOAT_BINARY_FORMAT"
+#endif
+  union {
+    float number;
+    Binary binary;
+  } u;
+  Float();
+  Float(float v);
+  float value();
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> : public True {
+public:
+#if PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+  typedef float_ieee754_half Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+  typedef float_ieee754_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+  typedef float_ieee754_double Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+  typedef float_ibm_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+  typedef float_ieee754_quad Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+  typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_DOUBLE_BINARY_FORMAT"
+#endif
+  union {
+    double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(double v);
+  double value();
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> : public True {
+public:
+#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+  typedef float_ieee754_half Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+  typedef float_ieee754_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+  typedef float_ieee754_double Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+  typedef float_ibm_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+  typedef float_ieee754_quad Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+  typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_LONG_DOUBLE_BINARY_FORMAT"
+#endif
+  union {
+    long double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(long double v);
+  long double value();
+};
+#endif
+
+// FIXME: is this the right place for this function?
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \p v is nonzero, returns the position of the most significant bit
+  in \p a.
+
+  The behavior is undefined if \p v is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+unsigned int msb_position(unsigned long long v);
+
+/*! \brief
+  An abstract class to be implemented by an external analyzer such
+  as ECLAIR in order to provide to the PPL the necessary information
+  for performing the analysis of floating point computations.
+
+  \par Template type parameters
+
+  - The class template parameter \p Target specifies the implementation
+  of Concrete_Expression to be used.
+  - The class template parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain. The interval bounds
+  should have a floating point type.
+*/
+template <typename Target, typename FP_Interval_Type>
+class FP_Oracle {
+public:
+  /*
+    FIXME: the const qualifiers on expressions may raise CLANG
+    compatibility issues. It may be necessary to omit them.
+  */
+
+  /*! \brief
+    Asks the external analyzer for an interval that correctly
+    approximates the floating point entity referenced by \p dim.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to find a correct
+    approximation, <CODE>false</CODE> otherwise.
+  */
+  virtual bool get_interval(dimension_type dim, FP_Interval_Type& result) const
+    = 0;
+
+  /*! \brief
+    Asks the external analyzer for an interval that correctly
+    approximates the value of floating point constant \p expr.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to find a correct
+    approximation, <CODE>false</CODE> otherwise.
+  */
+  virtual bool get_fp_constant_value(
+               const Floating_Point_Constant<Target>& expr,
+                     FP_Interval_Type& result) const = 0;
+
+  /*! \brief
+    Asks the external analyzer for an interval that correctly approximates
+    the value of \p expr, which must be of integer type.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to find a correct
+    approximation, <CODE>false</CODE> otherwise.
+  */
+  virtual bool get_integer_expr_value(const Concrete_Expression<Target>& expr,
+                                      FP_Interval_Type& result) const = 0;
+
+  /*! \brief
+    Asks the external analyzer for the possible space dimensions that
+    are associated to the approximable reference \p expr.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to return
+    the (possibly empty!) set, <CODE>false</CODE> otherwise.
+
+    The resulting set MUST NOT contain <CODE>not_a_dimension()</CODE>.
+  */
+  virtual bool get_associated_dimensions(
+          const Approximable_Reference<Target>& expr,
+          std::set<dimension_type>& result) const = 0;
+
+};
+
+/* FIXME: some of the following  documentation should probably be
+   under PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS */
+
+/*! \brief \relates Float
+  Returns <CODE>true</CODE> if and only if there is some floating point
+  number that is representable by \p f2 but not by \p f1.
+*/
+bool is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2);
+
+/*! \brief \relates Float
+  Computes the absolute error of floating point computations.
+
+  \par Template type parameters
+
+  - The class template parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain. The interval bounds
+  should have a floating point type.
+
+  \param analyzed_format The floating point format used by the analyzed
+  program.
+
+  \return The interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+  smallest non-zero positive number in the less precise floating point
+  format between the analyzer format and the analyzed format.
+*/
+template <typename FP_Interval_Type>
+const FP_Interval_Type&
+compute_absolute_error(Floating_Point_Format analyzed_format);
+
+/*! \brief \relates Linear_Form
+  Discards all linear forms containing variable \p var from the
+  linear form abstract store \p lf_store.
+*/
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+                             Linear_Form<FP_Interval_Type> >& lf_store,
+                    Variable var);
+
+/*! \brief \relates Linear_Form
+  Assigns the linear form \p lf to \p var in the linear form abstract
+  store \p lf_store, then discards all occurrences of \p var from it.
+*/
+template <typename FP_Interval_Type>
+void
+affine_form_image(std::map<dimension_type,
+                           Linear_Form<FP_Interval_Type> >& lf_store,
+                  Variable var,
+                  const Linear_Form<FP_Interval_Type>& lf);
+
+/*! \brief \relates Linear_Form
+  Discards from \p ls1 all linear forms but those that are associated
+  to the same variable in \p ls2.
+*/
+template <typename FP_Interval_Type>
+void
+upper_bound_assign(std::map<dimension_type,
+                            Linear_Form<FP_Interval_Type> >& ls1,
+                   const std::map<dimension_type,
+                                  Linear_Form<FP_Interval_Type> >& ls2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Float_inlines.hh"
+#include "Float_templates.hh"
+
+#endif // !defined(PPL_Float_defs_hh)
diff --git a/src/Float_inlines.hh b/src/Float_inlines.hh
new file mode 100644
index 0000000..3db069a
--- /dev/null
+++ b/src/Float_inlines.hh
@@ -0,0 +1,536 @@
+/* IEC 559 floating point format related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Float_inlines_hh
+#define PPL_Float_inlines_hh 1
+
+#include <climits>
+#include "Variable_defs.hh"
+#include "Linear_Form_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_half::inf_sign() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_half::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_half::zero_sign() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_half::negate() {
+  word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_half::sign_bit() const {
+  return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_half::dec() {
+  --word;
+}
+
+inline void
+float_ieee754_half::inc() {
+  ++word;
+}
+
+inline void
+float_ieee754_half::set_max(bool negative) {
+  word = WRD_MAX;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_half::build(bool negative, mpz_t mantissa, int exponent) {
+  word = static_cast<uint16_t>(mpz_get_ui(mantissa)
+                               & ((1UL << MANTISSA_BITS) - 1));
+  if (negative)
+    word |= SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  word |= static_cast<uint16_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_single::inf_sign() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_single::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::zero_sign() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_single::negate() {
+  word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_single::sign_bit() const {
+  return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_single::dec() {
+  --word;
+}
+
+inline void
+float_ieee754_single::inc() {
+  ++word;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+  word = WRD_MAX;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+  word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+                               & ((1UL << MANTISSA_BITS) - 1));
+  if (negative)
+    word |= SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::inf_sign() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_double::is_nan() const {
+  const uint32_t a = msp & ~MSP_SGN_MASK;
+  return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF);
+}
+
+inline int
+float_ieee754_double::zero_sign() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_double::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_double::sign_bit() const {
+  return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_double::dec() {
+  if (lsp == 0) {
+    --msp;
+    lsp = LSP_MAX;
+  }
+  else
+    --lsp;
+}
+
+inline void
+float_ieee754_double::inc() {
+  if (lsp == LSP_MAX) {
+    ++msp;
+    lsp = 0;
+  }
+  else
+    ++lsp;
+}
+
+inline void
+float_ieee754_double::set_max(bool negative) {
+  msp = MSP_MAX;
+  lsp = LSP_MAX;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+  unsigned long m;
+#if ULONG_MAX == 0xffffffffUL
+  lsp = mpz_get_ui(mantissa);
+  mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+  m = mpz_get_ui(mantissa);
+#else
+  m = mpz_get_ui(mantissa);
+  lsp = static_cast<uint32_t>(m & LSP_MAX);
+  m >>= 32;
+#endif
+  msp = static_cast<uint32_t>(m & ((1UL << (MANTISSA_BITS - 32)) - 1));
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  msp |= static_cast<uint32_t>(exponent_repr) << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_ibm_single::inf_sign() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ibm_single::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ibm_single::zero_sign() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ibm_single::negate() {
+  word ^= SGN_MASK;
+}
+
+inline bool
+float_ibm_single::sign_bit() const {
+  return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ibm_single::dec() {
+  --word;
+}
+
+inline void
+float_ibm_single::inc() {
+  ++word;
+}
+
+inline void
+float_ibm_single::set_max(bool negative) {
+  word = WRD_MAX;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ibm_single::build(bool negative, mpz_t mantissa, int exponent) {
+  word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+                               & ((1UL << MANTISSA_BITS) - 1));
+  if (negative)
+    word |= SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_intel_double_extended::inf_sign() const {
+  if (lsp != LSP_INF)
+    return 0;
+  const uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_INF)
+    return -1;
+  if (a == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_intel_double_extended::is_nan() const {
+  return (msp & MSP_POS_INF) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::zero_sign() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  const uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_ZERO)
+    return -1;
+  if (a == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_intel_double_extended::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_intel_double_extended::sign_bit() const {
+  return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_intel_double_extended::dec() {
+  if ((lsp & LSP_DMAX) == 0) {
+    --msp;
+    lsp = ((msp & MSP_NEG_INF) == 0) ? LSP_DMAX : LSP_NMAX;
+  }
+  else
+    --lsp;
+}
+
+inline void
+float_intel_double_extended::inc() {
+  if ((lsp & LSP_DMAX) == LSP_DMAX) {
+    ++msp;
+    lsp = LSP_DMAX + 1;
+  }
+  else
+    ++lsp;
+}
+
+inline void
+float_intel_double_extended::set_max(bool negative) {
+  msp = MSP_MAX;
+  lsp = LSP_NMAX;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_intel_double_extended::build(bool negative,
+                                   mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+  mpz_export(&lsp, 0, -1, sizeof(lsp), 0, 0, mantissa);
+#else
+  lsp = mpz_get_ui(mantissa);
+#endif
+  msp = (negative ? MSP_SGN_MASK : 0);
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  msp |= static_cast<uint32_t>(exponent_repr);
+}
+
+inline int
+float_ieee754_quad::inf_sign() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_quad::is_nan() const {
+  return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::zero_sign() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_quad::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_quad::sign_bit() const {
+  return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_quad::dec() {
+  if (lsp == 0) {
+    --msp;
+    lsp = LSP_MAX;
+  }
+  else
+    --lsp;
+}
+
+inline void
+float_ieee754_quad::inc() {
+  if (lsp == LSP_MAX) {
+    ++msp;
+    lsp = 0;
+  }
+  else
+    ++lsp;
+}
+
+inline void
+float_ieee754_quad::set_max(bool negative) {
+  msp = MSP_MAX;
+  lsp = LSP_MAX;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
+  uint64_t parts[2];
+  mpz_export(parts, 0, -1, sizeof(parts[0]), 0, 0, mantissa);
+  lsp = parts[0];
+  msp = parts[1];
+  msp &= ((static_cast<uint64_t>(1) << (MANTISSA_BITS - 64)) - 1);
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  msp |= static_cast<uint64_t>(exponent_repr) << (MANTISSA_BITS - 64);
+}
+
+inline bool
+is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2) {
+  return f1 < f2;
+}
+
+inline unsigned int
+msb_position(unsigned long long v) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(v))) - 1U - clz(v);
+}
+
+template <typename FP_Interval_Type>
+inline void
+affine_form_image(std::map<dimension_type,
+                           Linear_Form<FP_Interval_Type> >& lf_store,
+                  const Variable var,
+                  const Linear_Form<FP_Interval_Type>& lf) {
+  // Assign the new linear form for var.
+  lf_store[var.id()] = lf;
+  // Now invalidate all linear forms in which var occurs.
+  discard_occurrences(lf_store, var);
+}
+
+#if PPL_SUPPORTED_FLOAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+  u.number = v;
+}
+
+inline float
+Float<float>::value() {
+  return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+  u.number = v;
+}
+
+inline double
+Float<double>::value() {
+  return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+inline
+Float<long double>::Float() {
+}
+
+inline
+Float<long double>::Float(long double v) {
+  u.number = v;
+}
+
+inline long double
+Float<long double>::value() {
+  return u.number;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_inlines_hh)
diff --git a/src/Float_templates.hh b/src/Float_templates.hh
new file mode 100644
index 0000000..19663bf
--- /dev/null
+++ b/src/Float_templates.hh
@@ -0,0 +1,167 @@
+/* IEC 559 floating point format related functions:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Float_templates_hh
+#define PPL_Float_templates_hh 1
+
+#include "Variable_defs.hh"
+#include "Linear_Form_defs.hh"
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type>
+const FP_Interval_Type& compute_absolute_error(
+                        const Floating_Point_Format analyzed_format) {
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+
+  // FIXME: check if initializing caches with EMPTY is better.
+  static const FP_Interval_Type ZERO_INTERVAL = FP_Interval_Type(0);
+  // Cached results for each different analyzed format.
+  static FP_Interval_Type ieee754_half_result = ZERO_INTERVAL;
+  static FP_Interval_Type ieee754_single_result = ZERO_INTERVAL;
+  static FP_Interval_Type ieee754_double_result = ZERO_INTERVAL;
+  static FP_Interval_Type ibm_single_result = ZERO_INTERVAL;
+  static FP_Interval_Type ieee754_quad_result = ZERO_INTERVAL;
+  static FP_Interval_Type intel_double_extended_result = ZERO_INTERVAL;
+
+  FP_Interval_Type* to_compute = NULL;
+  // Get the necessary information on the analyzed's format.
+  unsigned int f_base;
+  int f_exponent_bias;
+  unsigned int f_mantissa_bits;
+  switch (analyzed_format) {
+    case IEEE754_HALF:
+      if (ieee754_half_result != ZERO_INTERVAL)
+        return ieee754_half_result;
+
+      to_compute = &ieee754_half_result;
+      f_base = float_ieee754_half::BASE;
+      f_exponent_bias = float_ieee754_half::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+      break;
+    case IEEE754_SINGLE:
+      if (ieee754_single_result != ZERO_INTERVAL)
+        return ieee754_single_result;
+
+      to_compute = &ieee754_single_result;
+      f_base = float_ieee754_single::BASE;
+      f_exponent_bias = float_ieee754_single::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+      break;
+    case IEEE754_DOUBLE:
+      if (ieee754_double_result != ZERO_INTERVAL)
+        return ieee754_double_result;
+
+      to_compute = &ieee754_double_result;
+      f_base = float_ieee754_double::BASE;
+      f_exponent_bias = float_ieee754_double::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+      break;
+    case IBM_SINGLE:
+      if (ibm_single_result != ZERO_INTERVAL)
+        return ibm_single_result;
+
+      to_compute = &ibm_single_result;
+      f_base = float_ibm_single::BASE;
+      f_exponent_bias = float_ibm_single::EXPONENT_BIAS;
+      f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+      break;
+    case IEEE754_QUAD:
+      if (ieee754_quad_result != ZERO_INTERVAL)
+        return ieee754_quad_result;
+
+      to_compute = &ieee754_quad_result;
+      f_base = float_ieee754_quad::BASE;
+      f_exponent_bias = float_ieee754_quad::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+      break;
+    case INTEL_DOUBLE_EXTENDED:
+      if (intel_double_extended_result != ZERO_INTERVAL)
+        return intel_double_extended_result;
+
+      to_compute = &intel_double_extended_result;
+      f_base = float_intel_double_extended::BASE;
+      f_exponent_bias = float_intel_double_extended::EXPONENT_BIAS;
+      f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+  }
+
+  PPL_ASSERT(to_compute != NULL);
+
+  // We assume that f_base is a power of 2.
+  analyzer_format omega;
+  int power = static_cast<int>(msb_position(f_base))
+    * ((1 - f_exponent_bias) - static_cast<int>(f_mantissa_bits));
+  omega = std::max(static_cast<analyzer_format>(ldexp(1.0, power)),
+                   std::numeric_limits<analyzer_format>::denorm_min());
+
+  to_compute->build(i_constraint(GREATER_OR_EQUAL, -omega),
+                    i_constraint(LESS_OR_EQUAL, omega));
+  return *to_compute;
+}
+
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+                             Linear_Form<FP_Interval_Type> >& lf_store,
+                    Variable var) {
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+  for (Iter i = lf_store.begin(); i != lf_store.end(); ) {
+    if((i->second).coefficient(var) != 0)
+      i = lf_store.erase(i);
+    else
+      ++i;
+  }
+}
+
+/* FIXME: improve efficiency by adding the list of potentially conflicting
+   variables as an argument. */
+template <typename FP_Interval_Type>
+void upper_bound_assign(std::map<dimension_type,
+                                 Linear_Form<FP_Interval_Type> >& ls1,
+                        const std::map<dimension_type,
+                                       Linear_Form<FP_Interval_Type> >& ls2) {
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+  typedef typename std::map<dimension_type,
+                            FP_Linear_Form>::const_iterator Const_Iter;
+
+  Const_Iter i2_end = ls2.end();
+  for (Iter i1 = ls1.begin(), i1_end = ls1.end(); i1 != i1_end; ) {
+    Const_Iter i2 = ls2.find(i1->first);
+    if ((i2 == i2_end) || (i1->second != i2->second))
+      i1 = ls1.erase(i1);
+    else
+      ++i1;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_templates_hh)
diff --git a/src/Floating_Point_Expression_defs.hh b/src/Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..57231bf
--- /dev/null
+++ b/src/Floating_Point_Expression_defs.hh
@@ -0,0 +1,212 @@
+/* Declarations for the Floating_Point_Expression class and its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Floating_Point_Expression_defs_hh
+#define PPL_Floating_Point_Expression_defs_hh 1
+
+#include "globals_defs.hh"
+#include "Floating_Point_Expression_types.hh"
+#include "Linear_Form_types.hh"
+#include "Box_types.hh"
+#include <cmath>
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_Interface \brief
+  A floating point expression on a given format.
+
+  This class represents a concrete <EM>floating point expression</EM>. This
+  includes constants, floating point variables, binary and unary
+  arithmetic operators.
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain. The interval bounds
+  should have a floating point type.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+  This parameter must be a struct similar to the ones defined in file
+  Float_defs.hh, even though it is sufficient to define the three
+  fields BASE, MANTISSA_BITS and EXPONENT_BIAS.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression {
+
+public:
+
+  //! Alias for a linear form with template argument \p FP_Interval_Type.
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  //! Alias for a map that associates a variable index to an interval.
+  /*! \brief
+    Alias for a Box storing lower and upper bounds for floating point
+    variables.
+
+    The type a linear form abstract store associating each variable with an
+    interval that correctly approximates its value.
+  */
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+
+  //! Alias for a map that associates a variable index to a linear form.
+  /*!
+    The type a linear form abstract store associating each variable with a
+    linear form that correctly approximates its value.
+  */
+  typedef std::map<dimension_type, FP_Linear_Form>
+          FP_Linear_Form_Abstract_Store;
+
+  //! The floating point format used by the analyzer.
+  typedef typename FP_Interval_Type::boundary_type boundary_type;
+
+  //! The interval policy used by \p FP_Interval_Type.
+  typedef typename FP_Interval_Type::info_type info_type;
+
+  //! Destructor.
+  virtual ~Floating_Point_Expression();
+
+  //! Linearizes a floating point expression.
+  /*! \brief
+    Makes \p result become a linear form that correctly approximates the
+    value of the floating point expression in the given composite
+    abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result Becomes the linearized expression.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Formally, if \p *this represents the expression \f$e\f$,
+    \p int_store represents the interval abstract store \f$\rho^{\#}\f$ and
+    \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+    then \p result will become
+    \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+    if the linearization succeeds.
+
+    All variables occurring in the floating point expression MUST have
+    an associated interval in \p int_store.
+    If this precondition is not met, calling the method causes an
+    undefined behavior.
+  */
+  virtual bool linearize(const FP_Interval_Abstract_Store& int_store,
+                         const FP_Linear_Form_Abstract_Store& lf_store,
+                         FP_Linear_Form& result) const = 0;
+
+  /*! \brief
+    Absolute error.
+
+    Represents the interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+    smallest non-zero positive number in the less precise floating point
+    format between the analyzer format and the analyzed format.
+
+  */
+  static FP_Interval_Type absolute_error;
+
+  // FIXME: this may not be the best place for them.
+  /*! \brief
+    Verifies if a given linear form overflows.
+    \param lf The linear form to verify.
+    \return
+    Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+    <CODE>true</CODE> otherwise.
+  */
+  static bool overflows(const FP_Linear_Form& lf);
+
+  /*! \brief
+    Computes the relative error of a given linear form.
+
+    Static helper method that is used by <CODE>linearize</CODE>
+    to account for the relative errors on \p lf.
+    \param lf The linear form used to compute the relative error.
+    \param result Becomes the linear form corresponding to a relative
+    error committed on \p lf.
+
+    This method makes <CODE>result</CODE> become a linear form
+    obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+    on the linear form \p lf. This function is defined
+    such as:
+    \f[
+    \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+    \defeq
+    (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+    +
+    \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+    \amifp
+    [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+    \f]
+    where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+    \f$\beta\f$ the base.
+  */
+  static void relative_error(const FP_Linear_Form& lf,
+                             FP_Linear_Form& result);
+
+  /*! \brief
+    Makes \p result become an interval that overapproximates all the
+    possible values of \p lf in the interval abstract store \p store.
+
+    \param lf The linear form to aproximate.
+    \param store The abstract store.
+    \param result The linear form that will be modified.
+
+    This method makes <CODE>result</CODE> become
+    \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+    \f[
+    \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+    \defeq
+    i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+    \rho^{\#}(v)\right)
+    \f]
+  */
+  static void intervalize(const FP_Linear_Form& lf,
+                          const FP_Interval_Abstract_Store& store,
+                          FP_Interval_Type& result);
+
+private:
+
+  /*! \brief
+    Computes the absolute error.
+
+    Static helper method that is used to compute the value of the public
+    static field <CODE>absolute_error</CODE>.
+
+    \return The interval \f$[-\omega, \omega]\f$ corresponding to the value
+    of <CODE>absolute_error</CODE>
+  */
+  static FP_Interval_Type compute_absolute_error();
+
+}; // class Floating_Point_Expression
+
+
+template <typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::absolute_error = compute_absolute_error();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Floating_Point_Expression_inlines.hh"
+#include "Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Floating_Point_Expression_defs_hh)
diff --git a/src/Floating_Point_Expression_inlines.hh b/src/Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..644f839
--- /dev/null
+++ b/src/Floating_Point_Expression_inlines.hh
@@ -0,0 +1,55 @@
+/* Floating_Point_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Floating_Point_Expression_inlines_hh
+#define PPL_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+#include "Linear_Form_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::overflows(const FP_Linear_Form& lf) {
+  if (!lf.inhomogeneous_term().is_bounded())
+    return true;
+
+  dimension_type dimension = lf.space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    if (!lf.coefficient(Variable(i)).is_bounded())
+      return true;
+  }
+
+  return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Floating_Point_Expression_inlines_hh)
diff --git a/src/Floating_Point_Expression_templates.hh b/src/Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..b10e685
--- /dev/null
+++ b/src/Floating_Point_Expression_templates.hh
@@ -0,0 +1,111 @@
+/* Floating_Point_Expression class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Floating_Point_Expression_templates_hh
+#define PPL_Floating_Point_Expression_templates_hh 1
+
+#include "Linear_Form_defs.hh"
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::relative_error(const FP_Linear_Form& lf, FP_Linear_Form& result) {
+
+  FP_Interval_Type error_propagator;
+  boundary_type lb = -pow(FP_Format::BASE,
+  -static_cast<typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::boundary_type>(FP_Format::MANTISSA_BITS));
+  error_propagator.build(i_constraint(GREATER_OR_EQUAL, lb),
+                         i_constraint(LESS_OR_EQUAL, -lb));
+
+  // Handle the inhomogeneous term.
+  const FP_Interval_Type* current_term = &lf.inhomogeneous_term();
+  assert(current_term->is_bounded());
+
+  FP_Interval_Type
+    current_multiplier(std::max(std::abs(current_term->lower()),
+                                std::abs(current_term->upper())));
+  FP_Linear_Form current_result_term(current_multiplier);
+  current_result_term *= error_propagator;
+  result = FP_Linear_Form(current_result_term);
+
+  // Handle the other terms.
+  dimension_type dimension = lf.space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    current_term = &lf.coefficient(Variable(i));
+    assert(current_term->is_bounded());
+    current_multiplier
+      = FP_Interval_Type(std::max(std::abs(current_term->lower()),
+                                  std::abs(current_term->upper())));
+    current_result_term = FP_Linear_Form(Variable(i));
+    current_result_term *= current_multiplier;
+    current_result_term *= error_propagator;
+    result += current_result_term;
+  }
+
+  return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::intervalize(const FP_Linear_Form& lf,
+              const FP_Interval_Abstract_Store& store,
+              FP_Interval_Type& result) {
+  result = FP_Interval_Type(lf.inhomogeneous_term());
+  dimension_type dimension = lf.space_dimension();
+  assert(dimension <= store.space_dimension());
+  for (dimension_type i = 0; i < dimension; ++i) {
+    FP_Interval_Type current_addend = lf.coefficient(Variable(i));
+    const FP_Interval_Type& curr_int = store.get_interval(Variable(i));
+    current_addend *= curr_int;
+    result += current_addend;
+  }
+
+  return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::compute_absolute_error() {
+  typedef typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+    ::boundary_type Boundary;
+  boundary_type omega;
+  omega = std::max(pow(static_cast<Boundary>(FP_Format::BASE),
+                       static_cast<Boundary>(1 - FP_Format::EXPONENT_BIAS
+                                             - FP_Format::MANTISSA_BITS)),
+                   std::numeric_limits<Boundary>::denorm_min());
+  FP_Interval_Type result;
+  result.build(i_constraint(GREATER_OR_EQUAL, -omega),
+               i_constraint(LESS_OR_EQUAL, omega));
+  return result;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Floating_Point_Expression_templates_hh)
diff --git a/src/Floating_Point_Expression_types.hh b/src/Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..27cca82
--- /dev/null
+++ b/src/Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Floating_Point_Expression_types_hh
+#define PPL_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Floating_Point_Expression_types_hh)
diff --git a/src/GMP_Integer_defs.hh b/src/GMP_Integer_defs.hh
new file mode 100644
index 0000000..0030825
--- /dev/null
+++ b/src/GMP_Integer_defs.hh
@@ -0,0 +1,134 @@
+/* GMP_Integer class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_GMP_Integer_defs_hh
+#define PPL_GMP_Integer_defs_hh 1
+
+#include "GMP_Integer_types.hh"
+#include "globals_types.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the remainder of the division of \p y by \p z.
+/*! \relates GMP_Integer */
+void rem_assign(GMP_Integer& x,
+                const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+                const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+  Assigns to \p x the greatest common divisor of \p y and \p z, and to
+  \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+                   const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+                const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+                    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+                    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates GMP_Integer
+  The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+                      const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "GMP_Integer_inlines.hh"
+
+#endif // !defined(PPL_GMP_Integer_defs_hh)
diff --git a/src/GMP_Integer_inlines.hh b/src/GMP_Integer_inlines.hh
new file mode 100644
index 0000000..449622c
--- /dev/null
+++ b/src/GMP_Integer_inlines.hh
@@ -0,0 +1,122 @@
+/* GMP_Integer class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_GMP_Integer_inlines_hh
+#define PPL_GMP_Integer_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+  mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x) {
+  mpz_abs(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_abs(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+rem_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_tdiv_r(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+              const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcdext(x.get_mpz_t(),
+             s.get_mpz_t(), t.get_mpz_t(),
+             y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+  mpz_mul_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+  mpz_tdiv_q_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  PPL_ASSERT(y % z == 0);
+  mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+  return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+  return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+  return x;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_GMP_Integer_inlines_hh)
diff --git a/src/GMP_Integer_types.hh b/src/GMP_Integer_types.hh
new file mode 100644
index 0000000..9463fed
--- /dev/null
+++ b/src/GMP_Integer_types.hh
@@ -0,0 +1,45 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_GMP_Integer_types_hh
+#define PPL_GMP_Integer_types_hh 1
+
+#include "Coefficient_traits_template.hh"
+#include <gmpxx.h>
+#include "mp_std_bits_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+  \brief
+  Unbounded integers as provided by the GMP library.
+
+  \ingroup PPL_CXX_interface
+  GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+  defined in the C++ interface of the GMP library.
+  For more information, see <CODE>http://gmplib.org/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+  //! The type used for references to const unbounded integers.
+  typedef const GMP_Integer& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_GMP_Integer_types_hh)
diff --git a/src/Generator.cc b/src/Generator.cc
new file mode 100644
index 0000000..4ec86a6
--- /dev/null
+++ b/src/Generator.cc
@@ -0,0 +1,496 @@
+/* Generator class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Generator_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Generator::throw_dimension_incompatible(const char* method,
+                                             const char* v_name,
+                                             const Variable v) const {
+  std::ostringstream s;
+  s << "PPL::Generator::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << v_name << ".space_dimension() == " << v.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Generator::throw_invalid_argument(const char* method,
+                                       const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Generator::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::Generator
+PPL::Generator::point(const Linear_Expression& e,
+                      Coefficient_traits::const_reference d,
+                      Representation r) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::point(e, d):\n"
+                                "d == 0.");
+  Linear_Expression ec(e, r);
+  ec.set_inhomogeneous_term(d);
+  Generator g(ec, Generator::POINT, NECESSARILY_CLOSED);
+
+  // If the divisor is negative, we negate it as well as
+  // all the coefficients of the point, because we want to preserve
+  // the invariant: the divisor of a point is strictly positive.
+  if (d < 0)
+    neg_assign(g.expr);
+
+  // Enforce normalization.
+  g.expr.normalize();
+  return g;
+}
+
+PPL::Generator
+PPL::Generator::point(const Linear_Expression& e,
+                      Representation r) {
+  return point(e, Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::point(Representation r) {
+  return point(Linear_Expression::zero(), Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::closure_point(const Linear_Expression& e,
+                              Coefficient_traits::const_reference d,
+                              Representation r) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::closure_point(e, d):\n"
+                                "d == 0.");
+  Linear_Expression ec(e, r);
+  ec.set_inhomogeneous_term(d);
+
+  Generator g(ec, Generator::POINT, NOT_NECESSARILY_CLOSED);
+
+  // If the divisor is negative, we negate it as well as
+  // all the coefficients of the point, because we want to preserve
+  // the invariant: the divisor of a point is strictly positive.
+  if (d < 0)
+    neg_assign(g.expr);
+
+  // Enforce normalization.
+  g.expr.normalize();
+  return g;
+}
+
+PPL::Generator
+PPL::Generator::closure_point(const Linear_Expression& e,
+                              Representation r) {
+  return closure_point(e, Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::closure_point(Representation r) {
+  return closure_point(Linear_Expression::zero(), Coefficient_one(), r);
+}
+
+PPL::Generator
+PPL::Generator::ray(const Linear_Expression& e, Representation r) {
+  // The origin of the space cannot be a ray.
+  if (e.all_homogeneous_terms_are_zero())
+    throw std::invalid_argument("PPL::ray(e):\n"
+                                "e == 0, but the origin cannot be a ray.");
+
+  Linear_Expression ec(e, r);
+  ec.set_inhomogeneous_term(0);
+  const Generator g(ec, Generator::RAY, NECESSARILY_CLOSED);
+
+  return g;
+}
+
+PPL::Generator
+PPL::Generator::line(const Linear_Expression& e, Representation r) {
+  // The origin of the space cannot be a line.
+  if (e.all_homogeneous_terms_are_zero())
+    throw std::invalid_argument("PPL::line(e):\n"
+                                "e == 0, but the origin cannot be a line.");
+
+  Linear_Expression ec(e, r);
+  ec.set_inhomogeneous_term(0);
+  const Generator g(ec, Generator::LINE, NECESSARILY_CLOSED);
+
+  return g;
+}
+
+void
+PPL::Generator::swap_space_dimensions(Variable v1, Variable v2) {
+  PPL_ASSERT(v1.space_dimension() <= space_dimension());
+  PPL_ASSERT(v2.space_dimension() <= space_dimension());
+  expr.swap_space_dimensions(v1, v2);
+  // *this is still normalized but it may not be strongly normalized.
+  sign_normalize();
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Generator::remove_space_dimensions(const Variables_Set& vars) {
+  PPL_ASSERT(vars.space_dimension() <= space_dimension());
+  expr.remove_space_dimensions(vars);
+
+  if (is_line_or_ray() && expr.all_homogeneous_terms_are_zero()) {
+    // Become a point.
+    set_is_ray_or_point();
+    expr.set_inhomogeneous_term(1);
+    if (is_not_necessarily_closed())
+      set_epsilon_coefficient(1);
+
+    PPL_ASSERT(OK());
+    return false;
+  }
+  else {
+    strong_normalize();
+    PPL_ASSERT(OK());
+    return true;
+  }
+}
+
+void
+PPL::Generator
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  if (cycle.size() < 2)
+    // No-op. No need to call sign_normalize().
+    return;
+
+  expr.permute_space_dimensions(cycle);
+
+  // *this is still normalized but may be not strongly normalized: sign
+  // normalization is necessary.
+  sign_normalize();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Generator::linear_combine(const Generator& y, dimension_type i) {
+  expr.linear_combine(y.expr, i);
+  strong_normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+int
+PPL::compare(const Generator& x, const Generator& y) {
+  const bool x_is_line_or_equality = x.is_line_or_equality();
+  const bool y_is_line_or_equality = y.is_line_or_equality();
+  if (x_is_line_or_equality != y_is_line_or_equality)
+    // Equalities (lines) precede inequalities (ray/point).
+    return y_is_line_or_equality ? 2 : -2;
+
+  return compare(x.expr, y.expr);
+}
+
+bool
+PPL::Generator::is_equivalent_to(const Generator& y) const {
+  const Generator& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  const Type x_type = x.type();
+  if (x_type != y.type())
+    return false;
+
+  if (x_type == POINT
+      && !(x.is_necessarily_closed() && y.is_necessarily_closed())) {
+    // Due to the presence of epsilon-coefficients, syntactically
+    // different points may actually encode the same generator.
+    // First, drop the epsilon-coefficient ...
+    Linear_Expression x_expr(x.expression());
+    Linear_Expression y_expr(y.expression());
+    // ... second, re-normalize ...
+    x_expr.normalize();
+    y_expr.normalize();
+    // ... and finally check for syntactic equality.
+    return x_expr.is_equal_to(y_expr);
+  }
+
+  // Here the epsilon-coefficient, if present, is zero.
+  // It is sufficient to check for syntactic equality.
+  return x.expr.is_equal_to(y.expr);
+}
+
+bool
+PPL::Generator::is_equal_to(const Generator& y) const {
+  return expr.is_equal_to(y.expr) && kind_ == y.kind_
+         && topology_ == y.topology_;
+}
+
+void
+PPL::Generator::sign_normalize() {
+  if (is_line_or_equality())
+    expr.sign_normalize();
+}
+
+bool
+PPL::Generator::check_strong_normalized() const {
+  Generator tmp = *this;
+  tmp.strong_normalize();
+  return compare(*this, tmp) == 0;
+}
+
+const PPL::Generator* PPL::Generator::zero_dim_point_p = 0;
+const PPL::Generator* PPL::Generator::zero_dim_closure_point_p = 0;
+
+void
+PPL::Generator::initialize() {
+  PPL_ASSERT(zero_dim_point_p == 0);
+  zero_dim_point_p
+    = new Generator(point());
+
+  PPL_ASSERT(zero_dim_closure_point_p == 0);
+  zero_dim_closure_point_p
+    = new Generator(closure_point());
+}
+
+void
+PPL::Generator::finalize() {
+  PPL_ASSERT(zero_dim_point_p != 0);
+  delete zero_dim_point_p;
+  zero_dim_point_p = 0;
+
+  PPL_ASSERT(zero_dim_closure_point_p != 0);
+  delete zero_dim_closure_point_p;
+  zero_dim_closure_point_p = 0;
+}
+
+void
+PPL::Generator::fancy_print(std::ostream& s) const {
+    bool needed_divisor = false;
+  bool extra_parentheses = false;
+  const dimension_type num_variables = space_dimension();
+  const Generator::Type t = type();
+  switch (t) {
+  case Generator::LINE:
+    s << "l(";
+    break;
+  case Generator::RAY:
+    s << "r(";
+    break;
+  case Generator::POINT:
+    s << "p(";
+    goto any_point;
+  case Generator::CLOSURE_POINT:
+    s << "c(";
+  any_point:
+    if (expr.inhomogeneous_term() != 1) {
+      needed_divisor = true;
+      if (!expr.all_zeroes(1, num_variables + 1)) {
+        extra_parentheses = true;
+        s << "(";
+      }
+    }
+    break;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  bool first = true;
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.lower_bound(Variable(num_variables)); i != i_end; ++i) {
+    c = *i;
+    if (!first) {
+      if (c > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(c);
+      }
+    }
+    else
+      first = false;
+    if (c == -1)
+      s << "-";
+    else if (c != 1)
+      s << c << "*";
+    IO_Operators::operator<<(s, i.variable());
+  }
+  if (first)
+    // A point or closure point in the origin.
+    s << 0;
+  if (extra_parentheses)
+    s << ")";
+  if (needed_divisor)
+    s << "/" << expr.inhomogeneous_term();
+  s << ")";
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
+  g.fancy_print(s);
+  return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator::Type& t) {
+  const char* n = 0;
+  switch (t) {
+  case Generator::LINE:
+    n = "LINE";
+    break;
+  case Generator::RAY:
+    n = "RAY";
+    break;
+  case Generator::POINT:
+    n = "POINT";
+    break;
+  case Generator::CLOSURE_POINT:
+    n = "CLOSURE_POINT";
+    break;
+  }
+  s << n;
+  return s;
+}
+
+bool
+PPL::Generator::is_matching_closure_point(const Generator& p) const {
+  PPL_ASSERT(topology() == p.topology()
+         && space_dimension() == p.space_dimension()
+         && type() == CLOSURE_POINT
+         && p.type() == POINT);
+  const Generator& cp = *this;
+  if (cp.expr.inhomogeneous_term() == p.expr.inhomogeneous_term()) {
+    // Divisors are equal: we can simply compare coefficients
+    // (disregarding the epsilon coefficient).
+    return cp.expr.is_equal_to(p.expr, 1, cp.expr.space_dimension());
+  }
+  else {
+    // Divisors are different: divide them by their GCD
+    // to simplify the following computation.
+    PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+    gcd_assign(gcd, cp.expr.inhomogeneous_term(), p.expr.inhomogeneous_term());
+    const bool rel_prime = (gcd == 1);
+    PPL_DIRTY_TEMP_COEFFICIENT(cp_0_scaled);
+    PPL_DIRTY_TEMP_COEFFICIENT(p_0_scaled);
+    if (!rel_prime) {
+      exact_div_assign(cp_0_scaled, cp.expr.inhomogeneous_term(), gcd);
+      exact_div_assign(p_0_scaled, p.expr.inhomogeneous_term(), gcd);
+    }
+    const Coefficient& cp_div = rel_prime ? cp.expr.inhomogeneous_term() : cp_0_scaled;
+    const Coefficient& p_div = rel_prime ? p.expr.inhomogeneous_term() : p_0_scaled;
+    return cp.expr.is_equal_to(p.expr, p_div, cp_div, 1, cp.expr.space_dimension());
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator)
+
+
+bool
+PPL::Generator::OK() const {
+  // Topology consistency checks.
+  if (is_not_necessarily_closed() && expr.space_dimension() == 0) {
+#ifndef NDEBUG
+    std::cerr << "Generator has fewer coefficients than the minimum "
+              << "allowed by its topology."
+              << std::endl;
+#endif
+    return false;
+  }
+
+  // Normalization check.
+  Generator tmp = *this;
+  tmp.strong_normalize();
+  if (tmp != *this) {
+#ifndef NDEBUG
+    std::cerr << "Generators should be strongly normalized!"
+              << std::endl;
+#endif
+    return false;
+  }
+
+  switch (type()) {
+  case LINE:
+    // Intentionally fall through.
+  case RAY:
+    if (expr.inhomogeneous_term() != 0) {
+#ifndef NDEBUG
+      std::cerr << "Lines must have a zero inhomogeneous term!"
+                << std::endl;
+#endif
+      return false;
+    }
+    if (!is_necessarily_closed() && epsilon_coefficient() != 0) {
+#ifndef NDEBUG
+      std::cerr << "Lines and rays must have a zero coefficient "
+                << "for the epsilon dimension!"
+                << std::endl;
+#endif
+      return false;
+    }
+    // The following test is correct, since we already checked
+    // that the epsilon coordinate is zero.
+    if (expr.all_homogeneous_terms_are_zero()) {
+#ifndef NDEBUG
+      std::cerr << "The origin of the vector space cannot be a line or a ray!"
+                << std::endl;
+#endif
+      return false;
+    }
+    break;
+
+  case POINT:
+    if (expr.inhomogeneous_term() <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Points must have a positive divisor!"
+                << std::endl;
+#endif
+      return false;
+    }
+    if (!is_necessarily_closed())
+      if (epsilon_coefficient() <= 0) {
+#ifndef NDEBUG
+        std::cerr << "In the NNC topology, points must have epsilon > 0"
+                  << std::endl;
+#endif
+        return false;
+      }
+    break;
+
+  case CLOSURE_POINT:
+    if (expr.inhomogeneous_term() <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Closure points must have a positive divisor!"
+                << std::endl;
+#endif
+      return false;
+    }
+    break;
+  }
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Generator_System.cc b/src/Generator_System.cc
new file mode 100644
index 0000000..b203497
--- /dev/null
+++ b/src/Generator_System.cc
@@ -0,0 +1,805 @@
+/* Generator_System class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Constraint_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Generator_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+                                    const dimension_type new_space_dim) {
+  PPL_ASSERT(space_dimension() <= new_space_dim);
+
+  if (sys.topology() != new_topology) {
+    if (new_topology == NECESSARILY_CLOSED) {
+      // A NOT_NECESSARILY_CLOSED generator system
+      // can be converted to a NECESSARILY_CLOSED one
+      // only if it does not contain closure points.
+      // This check has to be performed under the user viewpoint.
+      if (has_closure_points())
+        return false;
+      // For a correct implementation, we have to remove those
+      // closure points that were matching a point (i.e., those
+      // that are in the generator system, but are invisible to
+      // the user).
+      const Generator_System& gs = *this;
+      for (dimension_type i = 0; i < sys.num_rows(); )
+        if (gs[i].is_closure_point())
+          sys.remove_row(i, false);
+        else
+          ++i;
+      sys.set_necessarily_closed();
+    }
+    else {
+      convert_into_non_necessarily_closed();
+    }
+  }
+
+  sys.set_space_dimension(new_space_dim);
+
+  // We successfully adjusted dimensions and topology.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+// TODO: would be worth to avoid adding closure points
+// that already are in the system of generators?
+// To do this efficiently we could sort the system and
+// perform insertions keeping its sortedness.
+void
+PPL::Generator_System::add_corresponding_closure_points() {
+  PPL_ASSERT(!sys.is_necessarily_closed());
+  // NOTE: we always add (pending) rows at the end of the generator system.
+  // Updating `index_first_pending', if needed, is done by the caller.
+  Generator_System& gs = *this;
+  const dimension_type n_rows = gs.sys.num_rows();
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    const Generator& g = gs[i];
+    if (g.epsilon_coefficient() > 0) {
+      // `g' is a point: adding the closure point.
+      Generator cp = g;
+      cp.set_epsilon_coefficient(0);
+      // Enforcing normalization.
+      cp.expr.normalize();
+      gs.insert_pending(cp, Recycle_Input());
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+
+// TODO: would be worth to avoid adding points
+// that already are in the system of generators?
+// To do this efficiently we could sort the system and
+// perform insertions keeping its sortedness.
+void
+PPL::Generator_System::add_corresponding_points() {
+  PPL_ASSERT(!sys.is_necessarily_closed());
+  // NOTE: we always add (pending) rows at the end of the generator system.
+  // Updating `index_first_pending', if needed, is done by the caller.
+  Generator_System& gs = *this;
+  const dimension_type n_rows = gs.sys.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    const Generator& g = gs[i];
+    if (!g.is_line_or_ray() && g.epsilon_coefficient() == 0) {
+      // `g' is a closure point: adding the point.
+      // Note: normalization is preserved.
+      Generator p = g;
+      p.set_epsilon_coefficient(p.expr.inhomogeneous_term());
+      gs.insert_pending(p, Recycle_Input());
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Generator_System::has_closure_points() const {
+  if (sys.is_necessarily_closed())
+    return false;
+  // Adopt the point of view of the user.
+  for (Generator_System::const_iterator i = begin(),
+         this_end = end(); i != this_end; ++i)
+    if (i->is_closure_point())
+      return true;
+  return false;
+}
+
+void
+PPL::Generator_System::convert_into_non_necessarily_closed() {
+  // Padding the matrix with the column
+  // corresponding to the epsilon coefficients:
+  // all points must have epsilon coordinate equal to 1
+  // (i.e., the epsilon coefficient is equal to the divisor);
+  // rays and lines must have epsilon coefficient equal to 0.
+  // Note: normalization is preserved.
+  sys.set_not_necessarily_closed();
+
+  for (dimension_type i = sys.rows.size(); i-- > 0; ) {
+    Generator& gen = sys.rows[i];
+    if (!gen.is_line_or_ray())
+      gen.set_epsilon_coefficient(gen.expr.inhomogeneous_term());
+  }
+
+  PPL_ASSERT(sys.OK());
+}
+
+bool
+PPL::Generator_System::has_points() const {
+  const Generator_System& gs = *this;
+  // Avoiding the repeated tests on topology.
+  if (sys.is_necessarily_closed())
+    for (dimension_type i = sys.num_rows(); i-- > 0; ) {
+      if (!gs[i].is_line_or_ray())
+        return true;
+    }
+  else {
+    // !is_necessarily_closed()
+    for (dimension_type i = sys.num_rows(); i-- > 0; )
+    if (gs[i].epsilon_coefficient() != 0)
+      return true;
+  }
+  return false;
+}
+
+void
+PPL::Generator_System_const_iterator::skip_forward() {
+  const Linear_System<Generator>::const_iterator gsp_end = gsp->end();
+  if (i != gsp_end) {
+    Linear_System<Generator>::const_iterator i_next = i;
+    ++i_next;
+    if (i_next != gsp_end) {
+      const Generator& cp = *i;
+      const Generator& p = *i_next;
+      if (cp.is_closure_point()
+          && p.is_point()
+          && cp.is_matching_closure_point(p))
+        i = i_next;
+    }
+  }
+}
+
+void
+PPL::Generator_System::insert(const Generator& g) {
+  Generator tmp = g;
+  insert(tmp, Recycle_Input());
+}
+
+void
+PPL::Generator_System::insert_pending(const Generator& g) {
+  Generator tmp = g;
+  insert_pending(tmp, Recycle_Input());
+}
+
+void
+PPL::Generator_System::insert(Generator& g, Recycle_Input) {
+  // We are sure that the matrix has no pending rows
+  // and that the new row is not a pending generator.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  if (sys.topology() == g.topology())
+    sys.insert(g, Recycle_Input());
+  else
+    // `*this' and `g' have different topologies.
+    if (sys.is_necessarily_closed()) {
+      convert_into_non_necessarily_closed();
+      // Inserting the new generator.
+      sys.insert(g, Recycle_Input());
+    }
+    else {
+      // The generator system is NOT necessarily closed:
+      // copy the generator, adding the missing dimensions
+      // and the epsilon coefficient.
+      const dimension_type new_space_dim = std::max(g.space_dimension(),
+                                                    space_dimension());
+      g.set_not_necessarily_closed();
+      g.set_space_dimension(new_space_dim);
+      // If it was a point, set the epsilon coordinate to 1
+      // (i.e., set the coefficient equal to the divisor).
+      // Note: normalization is preserved.
+      if (!g.is_line_or_ray())
+        g.set_epsilon_coefficient(g.expr.inhomogeneous_term());
+      // Inserting the new generator.
+      sys.insert(g, Recycle_Input());
+    }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Generator_System::insert_pending(Generator& g, Recycle_Input) {
+  if (sys.topology() == g.topology())
+    sys.insert_pending(g, Recycle_Input());
+  else
+    // `*this' and `g' have different topologies.
+    if (sys.is_necessarily_closed()) {
+      convert_into_non_necessarily_closed();
+
+      // Inserting the new generator.
+      sys.insert_pending(g, Recycle_Input());
+    }
+    else {
+      // The generator system is NOT necessarily closed:
+      // copy the generator, adding the missing dimensions
+      // and the epsilon coefficient.
+      const dimension_type new_space_dim = std::max(g.space_dimension(),
+                                                    space_dimension());
+      g.set_topology(NOT_NECESSARILY_CLOSED);
+      g.set_space_dimension(new_space_dim);
+      // If it was a point, set the epsilon coordinate to 1
+      // (i.e., set the coefficient equal to the divisor).
+      // Note: normalization is preserved.
+      if (!g.is_line_or_ray())
+        g.set_epsilon_coefficient(g.expr.inhomogeneous_term());
+      // Inserting the new generator.
+      sys.insert_pending(g, Recycle_Input());
+    }
+  PPL_ASSERT(OK());
+}
+
+PPL::dimension_type
+PPL::Generator_System::num_lines() const {
+  // We are sure that this method is applied only to a matrix
+  // that does not contain pending rows.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  const Generator_System& gs = *this;
+  dimension_type n = 0;
+  // If sys happens to be sorted, take advantage of the fact
+  // that lines are at the top of the system.
+  if (sys.is_sorted()) {
+    const dimension_type nrows = sys.num_rows();
+    for (dimension_type i = 0; i < nrows && gs[i].is_line(); ++i)
+      ++n;
+  }
+  else
+    for (dimension_type i = sys.num_rows(); i-- > 0 ; )
+      if (gs[i].is_line())
+        ++n;
+  return n;
+}
+
+PPL::dimension_type
+PPL::Generator_System::num_rays() const {
+  // We are sure that this method is applied only to a matrix
+  // that does not contain pending rows.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  const Generator_System& gs = *this;
+  dimension_type n = 0;
+  // If sys happens to be sorted, take advantage of the fact
+  // that rays and points are at the bottom of the system and
+  // rays have the inhomogeneous term equal to zero.
+  if (sys.is_sorted()) {
+    for (dimension_type i = sys.num_rows(); i != 0 && gs[--i].is_ray_or_point(); )
+      if (gs[i].is_line_or_ray())
+        ++n;
+  }
+  else
+    for (dimension_type i = sys.num_rows(); i-- > 0 ; )
+      if (gs[i].is_ray())
+        ++n;
+  return n;
+}
+
+PPL::Poly_Con_Relation
+PPL::Generator_System::relation_with(const Constraint& c) const {
+  // Note: this method is not public and it is the responsibility
+  // of the caller to actually test for dimension compatibility.
+  // We simply assert it.
+  PPL_ASSERT(space_dimension() >= c.space_dimension());
+  // Number of generators: the case of an empty polyhedron
+  // has already been filtered out by the caller.
+  const dimension_type n_rows = sys.num_rows();
+  PPL_ASSERT(n_rows > 0);
+  const Generator_System& gs = *this;
+
+  // `result' will keep the relation holding between the generators
+  // we have seen so far and the constraint `c'.
+  Poly_Con_Relation result = Poly_Con_Relation::saturates();
+
+  switch (c.type()) {
+
+  case Constraint::EQUALITY:
+    {
+      // The hyperplane defined by the equality `c' is included
+      // in the set of points satisfying `c' (it is the same set!).
+      result = result && Poly_Con_Relation::is_included();
+      // The following integer variable will hold the scalar product sign
+      // of either the first point or the first non-saturating ray we find.
+      // If it is equal to 2, then it means that we haven't found such
+      // a generator yet.
+      int first_point_or_nonsaturating_ray_sign = 2;
+
+      for (dimension_type i = n_rows; i-- > 0; ) {
+        const Generator& g = gs[i];
+        const int sp_sign = Scalar_Products::sign(c, g);
+        // Checking whether the generator saturates the equality.
+        // If that is the case, then we have to do something only if
+        // the generator is a point.
+        if (sp_sign == 0) {
+          if (g.is_point()) {
+            if (first_point_or_nonsaturating_ray_sign == 2)
+              // It is the first time that we find a point and
+              // we have not found a non-saturating ray yet.
+              first_point_or_nonsaturating_ray_sign = 0;
+            else
+              // We already found a point or a non-saturating ray.
+              if (first_point_or_nonsaturating_ray_sign != 0)
+                return Poly_Con_Relation::strictly_intersects();
+          }
+        }
+        else
+          // Here we know that sp_sign != 0.
+          switch (g.type()) {
+
+          case Generator::LINE:
+            // If a line does not saturate `c', then there is a strict
+            // intersection between the points satisfying `c'
+            // and the points generated by `gs'.
+            return Poly_Con_Relation::strictly_intersects();
+
+          case Generator::RAY:
+            if (first_point_or_nonsaturating_ray_sign == 2) {
+              // It is the first time that we have a non-saturating ray
+              // and we have not found any point yet.
+              first_point_or_nonsaturating_ray_sign = sp_sign;
+              result = Poly_Con_Relation::is_disjoint();
+            }
+            else
+              // We already found a point or a non-saturating ray.
+              if (sp_sign != first_point_or_nonsaturating_ray_sign)
+                return Poly_Con_Relation::strictly_intersects();
+            break;
+
+          case Generator::POINT:
+          case Generator::CLOSURE_POINT:
+            // NOTE: a non-saturating closure point is treated as
+            // a normal point.
+            if (first_point_or_nonsaturating_ray_sign == 2) {
+              // It is the first time that we find a point and
+              // we have not found a non-saturating ray yet.
+              first_point_or_nonsaturating_ray_sign = sp_sign;
+              result = Poly_Con_Relation::is_disjoint();
+            }
+            else
+              // We already found a point or a non-saturating ray.
+              if (sp_sign != first_point_or_nonsaturating_ray_sign)
+                return Poly_Con_Relation::strictly_intersects();
+            break;
+          }
+      }
+    }
+    break;
+
+  case Constraint::NONSTRICT_INEQUALITY:
+    {
+      // The hyperplane implicitly defined by the non-strict inequality `c'
+      // is included in the set of points satisfying `c'.
+      result = result && Poly_Con_Relation::is_included();
+      // The following Boolean variable will be set to `false'
+      // as soon as either we find (any) point or we find a
+      // non-saturating ray.
+      bool first_point_or_nonsaturating_ray = true;
+
+      for (dimension_type i = n_rows; i-- > 0; ) {
+        const Generator& g = gs[i];
+        const int sp_sign = Scalar_Products::sign(c, g);
+        // Checking whether the generator saturates the non-strict
+        // inequality. If that is the case, then we have to do something
+        // only if the generator is a point.
+        if (sp_sign == 0) {
+          if (g.is_point()) {
+            if (first_point_or_nonsaturating_ray)
+              // It is the first time that we have a point and
+              // we have not found a non-saturating ray yet.
+              first_point_or_nonsaturating_ray = false;
+            else
+              // We already found a point or a non-saturating ray before.
+              if (result == Poly_Con_Relation::is_disjoint())
+                // Since g saturates c, we have a strict intersection if
+                // none of the generators seen so far are included in `c'.
+                return Poly_Con_Relation::strictly_intersects();
+          }
+        }
+        else
+          // Here we know that sp_sign != 0.
+          switch (g.type()) {
+
+          case Generator::LINE:
+            // If a line does not saturate `c', then there is a strict
+            // intersection between the points satisfying `c' and
+            // the points generated by `gs'.
+            return Poly_Con_Relation::strictly_intersects();
+
+          case Generator::RAY:
+            if (first_point_or_nonsaturating_ray) {
+              // It is the first time that we have a non-saturating ray
+              // and we have not found any point yet.
+              first_point_or_nonsaturating_ray = false;
+              result = (sp_sign > 0)
+                ? Poly_Con_Relation::is_included()
+                : Poly_Con_Relation::is_disjoint();
+            }
+            else {
+              // We already found a point or a non-saturating ray.
+              if ((sp_sign > 0
+                   && result == Poly_Con_Relation::is_disjoint())
+                  || (sp_sign < 0
+                      && result.implies(Poly_Con_Relation::is_included())))
+                // We have a strict intersection if either:
+                // - `g' satisfies `c' but none of the generators seen
+                //    so far are included in `c'; or
+                // - `g' does not satisfy `c' and all the generators
+                //    seen so far are included in `c'.
+                return Poly_Con_Relation::strictly_intersects();
+              if (sp_sign > 0)
+                // Here all the generators seen so far either saturate
+                // or are included in `c'.
+                // Since `g' does not saturate `c' ...
+                result = Poly_Con_Relation::is_included();
+            }
+            break;
+
+          case Generator::POINT:
+          case Generator::CLOSURE_POINT:
+            // NOTE: a non-saturating closure point is treated as
+            // a normal point.
+            if (first_point_or_nonsaturating_ray) {
+              // It is the first time that we have a point and
+              // we have not found a non-saturating ray yet.
+              // - If point `g' saturates `c', then all the generators
+              //   seen so far saturate `c'.
+              // - If point `g' is included (but does not saturate) `c',
+              //   then all the generators seen so far are included in `c'.
+              // - If point `g' does not satisfy `c', then all the
+              //   generators seen so far are disjoint from `c'.
+              first_point_or_nonsaturating_ray = false;
+              if (sp_sign > 0)
+                result = Poly_Con_Relation::is_included();
+              else if (sp_sign < 0)
+                result = Poly_Con_Relation::is_disjoint();
+            }
+            else {
+              // We already found a point or a non-saturating ray before.
+              if ((sp_sign > 0
+                   && result == Poly_Con_Relation::is_disjoint())
+                  || (sp_sign < 0
+                      && result.implies(Poly_Con_Relation::is_included())))
+                // We have a strict intersection if either:
+                // - `g' satisfies or saturates `c' but none of the
+                //    generators seen so far are included in `c'; or
+                // - `g' does not satisfy `c' and all the generators
+                //    seen so far are included in `c'.
+                return Poly_Con_Relation::strictly_intersects();
+              if (sp_sign > 0)
+                // Here all the generators seen so far either saturate
+                // or are included in `c'.
+                // Since `g' does not saturate `c' ...
+                result = Poly_Con_Relation::is_included();
+            }
+            break;
+          }
+      }
+    }
+    break;
+
+  case Constraint::STRICT_INEQUALITY:
+    {
+      // The hyperplane implicitly defined by the strict inequality `c'
+      // is disjoint from the set of points satisfying `c'.
+      result = result && Poly_Con_Relation::is_disjoint();
+      // The following Boolean variable will be set to `false'
+      // as soon as either we find (any) point or we find a
+      // non-saturating ray.
+      bool first_point_or_nonsaturating_ray = true;
+      for (dimension_type i = n_rows; i-- > 0; ) {
+        const Generator& g = gs[i];
+        // Using the reduced scalar product operator to avoid
+        // both topology and space dimension mismatches.
+        const int sp_sign = Scalar_Products::reduced_sign(c, g);
+        // Checking whether the generator saturates the strict inequality.
+        // If that is the case, then we have to do something
+        // only if the generator is a point.
+        if (sp_sign == 0) {
+          if (g.is_point()) {
+            if (first_point_or_nonsaturating_ray)
+              // It is the first time that we have a point and
+              // we have not found a non-saturating ray yet.
+              first_point_or_nonsaturating_ray = false;
+            else
+              // We already found a point or a non-saturating ray before.
+              if (result == Poly_Con_Relation::is_included())
+                return Poly_Con_Relation::strictly_intersects();
+          }
+        }
+        else
+          // Here we know that sp_sign != 0.
+          switch (g.type()) {
+
+          case Generator::LINE:
+            // If a line does not saturate `c', then there is a strict
+            // intersection between the points satisfying `c' and the points
+            // generated by `gs'.
+            return Poly_Con_Relation::strictly_intersects();
+
+          case Generator::RAY:
+            if (first_point_or_nonsaturating_ray) {
+              // It is the first time that we have a non-saturating ray
+              // and we have not found any point yet.
+              first_point_or_nonsaturating_ray = false;
+              result = (sp_sign > 0)
+                ? Poly_Con_Relation::is_included()
+                : Poly_Con_Relation::is_disjoint();
+            }
+            else {
+              // We already found a point or a non-saturating ray before.
+              if ((sp_sign > 0
+                   && result.implies(Poly_Con_Relation::is_disjoint()))
+                  ||
+                  (sp_sign <= 0
+                   && result == Poly_Con_Relation::is_included()))
+                return Poly_Con_Relation::strictly_intersects();
+              if (sp_sign < 0)
+                // Here all the generators seen so far either saturate
+                // or are disjoint from `c'.
+                // Since `g' does not saturate `c' ...
+                result = Poly_Con_Relation::is_disjoint();
+            }
+            break;
+
+          case Generator::POINT:
+          case Generator::CLOSURE_POINT:
+            if (first_point_or_nonsaturating_ray) {
+              // It is the first time that we have a point and
+              // we have not found a non-saturating ray yet.
+              // - If point `g' saturates `c', then all the generators
+              //   seen so far saturate `c'.
+              // - If point `g' is included in (but does not saturate) `c',
+              //   then all the generators seen so far are included in `c'.
+              // - If point `g' strictly violates `c', then all the
+              //   generators seen so far are disjoint from `c'.
+              first_point_or_nonsaturating_ray = false;
+              if (sp_sign > 0)
+                result = Poly_Con_Relation::is_included();
+              else if (sp_sign < 0)
+                result = Poly_Con_Relation::is_disjoint();
+            }
+            else {
+              // We already found a point or a non-saturating ray before.
+              if ((sp_sign > 0
+                   && result.implies(Poly_Con_Relation::is_disjoint()))
+                  ||
+                  (sp_sign <= 0
+                   && result == Poly_Con_Relation::is_included()))
+                return Poly_Con_Relation::strictly_intersects();
+              if (sp_sign < 0)
+                // Here all the generators seen so far either saturate
+                // or are disjoint from `c'.
+                // Since `g' does not saturate `c' ...
+                result = Poly_Con_Relation::is_disjoint();
+            }
+            break;
+          }
+      }
+    }
+    break;
+  }
+  // We have seen all generators.
+  return result;
+}
+
+
+bool
+PPL::Generator_System::satisfied_by_all_generators(const Constraint& c) const {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  // Setting `sps' to the appropriate scalar product sign operator.
+  // This also avoids problems when having _legal_ topology mismatches
+  // (which could also cause a mismatch in the number of space dimensions).
+  const Topology_Adjusted_Scalar_Product_Sign sps(c);
+
+  const Generator_System& gs = *this;
+  switch (c.type()) {
+  case Constraint::EQUALITY:
+    // Equalities must be saturated by all generators.
+    for (dimension_type i = gs.sys.num_rows(); i-- > 0; )
+      if (sps(c, gs[i]) != 0)
+        return false;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    // Non-strict inequalities must be saturated by lines and
+    // satisfied by all the other generators.
+    for (dimension_type i = gs.sys.num_rows(); i-- > 0; ) {
+      const Generator& g = gs[i];
+      const int sp_sign = sps(c, g);
+      if (g.is_line()) {
+        if (sp_sign != 0)
+          return false;
+      }
+      else
+        // `g' is a ray, point or closure point.
+        if (sp_sign < 0)
+          return false;
+    }
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    // Strict inequalities must be saturated by lines,
+    // satisfied by all generators, and must not be saturated by points.
+    for (dimension_type i = gs.sys.num_rows(); i-- > 0; ) {
+      const Generator& g = gs[i];
+      const int sp_sign = sps(c, g);
+      switch (g.type()) {
+      case Generator::POINT:
+        if (sp_sign <= 0)
+          return false;
+        break;
+      case Generator::LINE:
+        if (sp_sign != 0)
+          return false;
+        break;
+      default:
+        // `g' is a ray or closure point.
+        if (sp_sign < 0)
+          return false;
+        break;
+      }
+    }
+    break;
+  }
+  // If we reach this point, `c' is satisfied by all generators.
+  return true;
+}
+
+
+void
+PPL::Generator_System
+::affine_image(Variable v,
+               const Linear_Expression& expr,
+               Coefficient_traits::const_reference denominator) {
+  Generator_System& x = *this;
+  PPL_ASSERT(v.space_dimension() <= x.space_dimension());
+  PPL_ASSERT(expr.space_dimension() <= x.space_dimension());
+  PPL_ASSERT(denominator > 0);
+
+  const dimension_type n_rows = x.sys.num_rows();
+
+  // Compute the numerator of the affine transformation and assign it
+  // to the column of `*this' indexed by `v'.
+  PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    Generator& row = sys.rows[i];
+    Scalar_Products::assign(numerator, expr, row.expr);
+    if (denominator != 1) {
+      // Since we want integer elements in the matrix,
+      // we multiply by `denominator' all the columns of `*this'
+      // having an index different from `v'.
+      // Note that this operation also modifies the coefficient of v, but
+      // it will be overwritten by the set_coefficient() below.
+      row.expr *= denominator;
+    }
+    row.expr.set_coefficient(v, numerator);
+  }
+
+  set_sorted(false);
+
+  // If the mapping is not invertible we may have transformed
+  // valid lines and rays into the origin of the space.
+  const bool not_invertible = (v.space_dimension() > expr.space_dimension()
+                               || expr.coefficient(v) == 0);
+  if (not_invertible)
+    x.remove_invalid_lines_and_rays();
+
+  // TODO: Consider normalizing individual rows in the loop above.
+  // Strong normalization also resets the sortedness flag.
+  x.sys.strong_normalize();
+
+#ifndef NDEBUG
+  // Make sure that the (remaining) generators are still OK after fiddling
+  // with their internal data.
+  for (dimension_type i = x.num_rows(); i-- > 0; )
+    PPL_ASSERT(x.sys[i].OK());
+#endif
+
+  PPL_ASSERT(sys.OK());
+}
+
+void
+PPL::Generator_System::ascii_dump(std::ostream& s) const {
+  sys.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator_System)
+
+bool
+PPL::Generator_System::ascii_load(std::istream& s) {
+  if (!sys.ascii_load(s))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PPL::Generator_System::remove_invalid_lines_and_rays() {
+  // The origin of the vector space cannot be a valid line/ray.
+  // NOTE: the following swaps will mix generators without even trying
+  // to preserve sortedness: as a matter of fact, it will almost always
+  // be the case that the input generator system is NOT sorted.
+  
+  // Note that num_rows() is *not* constant, because it is decreased by
+  // remove_row().
+  for (dimension_type i = 0; i < num_rows(); ) {
+    const Generator& g = (*this)[i];
+    if (g.is_line_or_ray() && g.expr.all_homogeneous_terms_are_zero()) {
+      sys.remove_row(i, false);
+      set_sorted(false);
+    }
+    else
+      ++i;
+  }
+}
+
+const PPL::Generator_System* PPL::Generator_System::zero_dim_univ_p = 0;
+
+void
+PPL::Generator_System::initialize() {
+  PPL_ASSERT(zero_dim_univ_p == 0);
+  zero_dim_univ_p
+    = new Generator_System(Generator::zero_dim_point());
+}
+
+void
+PPL::Generator_System::finalize() {
+  PPL_ASSERT(zero_dim_univ_p != 0);
+  delete zero_dim_univ_p;
+  zero_dim_univ_p = 0;
+}
+
+bool
+PPL::Generator_System::OK() const {
+  return sys.OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator_System& gs) {
+  Generator_System::const_iterator i = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (i == gs_end)
+    return s << "false";
+  while (true) {
+    s << *i;
+    ++i;
+    if (i == gs_end)
+      return s;
+    s << ", ";
+  }
+}
+
diff --git a/src/Generator_System_defs.hh b/src/Generator_System_defs.hh
new file mode 100644
index 0000000..b93e929
--- /dev/null
+++ b/src/Generator_System_defs.hh
@@ -0,0 +1,744 @@
+/* Generator_System class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_System_defs_hh
+#define PPL_Generator_System_defs_hh 1
+
+#include "Generator_System_types.hh"
+
+#include "Linear_Expression_types.hh"
+#include "Linear_System_defs.hh"
+#include "Generator_defs.hh"
+#include "Constraint_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Polyhedron_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Generator_System& x, const Generator_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Generator_System& x, const Generator_System& y);
+
+/*! \relates Generator_System */
+void
+swap(Generator_System& x, Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+    When inserting generators in a system, space dimensions are automatically
+    adjusted so that all the generators in the system are defined
+    on the same vector space.
+    A system of generators which is meant to define a non-empty
+    polyhedron must include at least one point: the reason is that
+    lines, rays and closure points need a supporting point
+    (lines and rays only specify directions while closure points only
+    specify points in the topological closure of the NNC polyhedron).
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty polyhedron, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a ray having the same direction as
+    the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(ray(x + 0*y));
+    \endcode
+    To define a system of generators indeed corresponding to the set
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \geq 0
+      \,\bigr\},
+    \f]
+    one just has to add the origin:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having four points
+    and corresponding to a square in \f$\Rset^2\f$
+    (the same as Example 1 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+    \endcode
+
+    \par Example 4
+    By using closure points, we can define the \e kernel
+    (i.e., the largest open set included in a given set)
+    of the square defined in the previous example.
+    Note that a supporting point is needed and, for that purpose,
+    any inner point could be considered.
+    \code
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(closure_point(0*x + 0*y));
+  gs.insert(closure_point(0*x + 3*y));
+  gs.insert(closure_point(3*x + 0*y));
+  gs.insert(closure_point(3*x + 3*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having two points
+    and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+    (the same as Example 2 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 1*y));
+  gs.insert(ray(x - y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System {
+public:
+  typedef Generator row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of generators.
+  Generator_System(Representation r = default_representation);
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Generator_System(const Generator& g,
+                            Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  //! The new Generator_System will have the same representation as `gs'.
+  Generator_System(const Generator_System& gs);
+
+  //! Copy constructor with specified representation.
+  Generator_System(const Generator_System& gs, Representation r);
+
+  //! Destructor.
+  ~Generator_System();
+
+  //! Assignment operator.
+  Generator_System& operator=(const Generator_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  /*! \brief
+    Removes all the generators from the generator system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Generator& g);
+
+  /*! \brief
+    Inserts in \p *this the generator \p g, stealing its contents and
+    increasing the number of space dimensions if needed.
+  */
+  void insert(Generator& g, Recycle_Input);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System& zero_dim_univ();
+
+  typedef Generator_System_const_iterator const_iterator;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Generator_System& y);
+
+private:
+
+  bool has_no_rows() const;
+
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  dimension_type num_rows() const;
+
+  //! Adds \p n rows and space dimensions to the system.
+  /*!
+    \param n
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_universe_rows_and_space_dimensions(dimension_type n);
+
+  Topology topology() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Generator_System& y);
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+  */
+  void remove_row(dimension_type i, bool keep_sorted = false);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(num_rows()).
+
+    Otherwise, this method just swaps the rows with the last ones and then
+    removes them, so it costs O(last - first).
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                   bool keep_sorted = false);
+
+  //! Removes the specified rows. The row ordering of remaining rows is
+  //! preserved.
+  /*!
+    \param indexes specifies a list of row indexes.
+                   It must be sorted.
+  */
+  void remove_rows(const std::vector<dimension_type>& indexes);
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Generator_System& y);
+
+  //! Adds to \p *this a copy of  the rows of \p y.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(const Generator_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void insert_pending(const Generator_System& r);
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System* zero_dim_univ_p;
+
+  friend class Generator_System_const_iterator;
+
+  //! Builds an empty system of generators having the specified topology.
+  explicit Generator_System(Topology topol,
+                            Representation r = default_representation);
+
+  /*! \brief
+    Builds a system of rays/points on a \p space_dim dimensional space. If
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+    dimension is added.
+  */
+  Generator_System(Topology topol, dimension_type space_dim,
+                   Representation r = default_representation);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the \p new_topology and
+    \p new_space_dim (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains closure points.
+  */
+  bool adjust_topology_and_space_dimension(Topology new_topology,
+                                           dimension_type new_space_dim);
+
+  /*! \brief
+    For each unmatched closure point in \p *this, adds the
+    corresponding point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more points.
+  */
+  bool has_points() const;
+
+  /*! \brief
+    For each unmatched point in \p *this, adds the corresponding
+    closure point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_closure_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more closure points.
+
+    Note: the check for the presence of closure points is
+    done under the point of view of the user. Namely, we scan
+    the generator system using high-level iterators, so that
+    closure points that are matching the corresponding points
+    will be disregarded.
+  */
+  bool has_closure_points() const;
+
+  //! Converts this generator system into a non-necessarily closed generator
+  //! system.
+  void convert_into_non_necessarily_closed();
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Generator& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns the relations holding between the generator system
+    and the constraint \p c.
+  */
+  Parma_Polyhedra_Library::Poly_Con_Relation
+  relation_with(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  bool satisfied_by_all_generators(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+  */
+  bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+  */
+  bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    The variable to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations (see the Introduction) having
+    any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p denominator
+    that will be used as denominator of the affine transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation assigns to each element of the column containing
+    the coefficients of v the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(Variable v,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of lines of the system.
+  dimension_type num_lines() const;
+
+  //! Returns the number of rays of the system.
+  dimension_type num_rays() const;
+
+  //! Removes all the invalid lines and rays.
+  /*!
+    The invalid lines and rays are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_rays();
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as
+    to provide a partial simplification of the system of generators.
+
+    It is assumed that the system has no pending generators.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(const Generator& g);
+
+  /*! \brief
+    Inserts in \p *this the generator \p g, stealing its contents and
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(Generator& g, Recycle_Input);
+
+  Linear_System<Generator> sys;
+
+  friend bool
+  operator==(const Generator_System& x, const Generator_System& y);
+
+  friend class Polyhedron;
+};
+
+//! An iterator over a system of generators
+/*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the polyhedron <CODE>ph</CODE>:
+    \code
+const Generator_System& gs = ph.generators();
+for (Generator_System::const_iterator i = gs.begin(),
+        gs_end = gs.end(); i != gs_end; ++i)
+  cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+const Generator_System& gs = ph.generators();
+copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+    \endcode
+*/
+class Parma_Polyhedra_Library::Generator_System_const_iterator
+  : public std::iterator<std::forward_iterator_tag,
+        Generator,
+        ptrdiff_t,
+        const Generator*,
+        const Generator&> {
+public:
+  //! Default constructor.
+  Generator_System_const_iterator();
+
+  //! Ordinary copy constructor.
+  Generator_System_const_iterator(const Generator_System_const_iterator& y);
+
+  //! Destructor.
+  ~Generator_System_const_iterator();
+
+  //! Assignment operator.
+  Generator_System_const_iterator& operator=(const Generator_System_const_iterator& y);
+
+  //! Dereference operator.
+  const Generator& operator*() const;
+
+  //! Indirect member selector.
+  const Generator* operator->() const;
+
+  //! Prefix increment operator.
+  Generator_System_const_iterator& operator++();
+
+  //! Postfix increment operator.
+  Generator_System_const_iterator operator++(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const Generator_System_const_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const Generator_System_const_iterator& y) const;
+
+private:
+  friend class Generator_System;
+
+  //! The const iterator over the Linear_System.
+  Linear_System<Generator>::const_iterator i;
+
+  //! A const pointer to the Linear_System.
+  const Linear_System<Generator>* gsp;
+
+  //! Constructor.
+  Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+      const Generator_System& gsys);
+
+  /*! \brief
+    \p *this skips to the next generator, skipping those
+    closure points that are immediately followed by a matching point.
+  */
+  void skip_forward();
+};
+
+// Generator_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Generator_System_defs_hh)
diff --git a/src/Generator_System_inlines.hh b/src/Generator_System_inlines.hh
new file mode 100644
index 0000000..bd4cb43
--- /dev/null
+++ b/src/Generator_System_inlines.hh
@@ -0,0 +1,411 @@
+/* Generator_System class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_System_inlines_hh
+#define PPL_Generator_System_inlines_hh 1
+
+#include "Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System(Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g, Representation r)
+  : sys(g.topology(), r) {
+  sys.insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+  : sys(gs.sys) {
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs,
+                                   Representation r)
+  : sys(gs.sys, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol, Representation r)
+  : sys(topol, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+                                   const dimension_type space_dim,
+                                   Representation r)
+  : sys(topol, space_dim, r) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+  Generator_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Representation
+Generator_System::representation() const {
+  return sys.representation();
+}
+
+inline void
+Generator_System::set_representation(Representation r) {
+  sys.set_representation(r);
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+  return Linear_System<Generator>::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+  return sys.space_dimension();
+}
+
+inline void
+Generator_System::set_space_dimension(dimension_type space_dim) {
+  const dimension_type old_space_dim = space_dimension();
+  sys.set_space_dimension_no_ok(space_dim);
+
+  if (space_dim < old_space_dim)
+    // We may have invalid lines and rays now.
+    remove_invalid_lines_and_rays();
+
+#ifndef NDEBUG
+  for (dimension_type i = 0; i < sys.num_rows(); ++i)
+    PPL_ASSERT(sys[i].OK());
+#endif
+  PPL_ASSERT(sys.OK());
+  PPL_ASSERT(OK());
+}
+
+inline void
+Generator_System::clear() {
+  sys.clear();
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+  return sys[k];
+}
+
+inline void
+Generator_System
+::remove_space_dimensions(const Variables_Set& vars) {
+  sys.remove_space_dimensions(vars);
+}
+
+inline void
+Generator_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+  sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Generator_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+  sys.swap_space_dimensions(v1, v2);
+}
+
+inline dimension_type
+Generator_System::num_rows() const {
+  return sys.num_rows();
+}
+
+inline void
+Generator_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+  sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline Topology
+Generator_System::topology() const {
+  return sys.topology();
+}
+
+inline dimension_type
+Generator_System::first_pending_row() const {
+  return sys.first_pending_row();
+}
+
+inline void
+Generator_System::unset_pending_rows() {
+  sys.unset_pending_rows();
+}
+
+inline void
+Generator_System::set_sorted(bool b) {
+  sys.set_sorted(b);
+}
+
+inline bool
+Generator_System::is_sorted() const {
+  return sys.is_sorted();
+}
+
+inline void
+Generator_System::set_index_first_pending_row(dimension_type i) {
+  sys.set_index_first_pending_row(i);
+}
+
+inline bool
+Generator_System::is_necessarily_closed() const {
+  return sys.is_necessarily_closed();
+}
+
+inline void
+Generator_System::assign_with_pending(const Generator_System& y) {
+  sys.assign_with_pending(y.sys);
+}
+
+inline dimension_type
+Generator_System::num_pending_rows() const {
+  return sys.num_pending_rows();
+}
+
+inline void
+Generator_System::sort_pending_and_remove_duplicates() {
+  return sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Generator_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+  sys.sort_and_remove_with_sat(sat);
+}
+
+inline void
+Generator_System::sort_rows() {
+  sys.sort_rows();
+}
+
+inline bool
+Generator_System::check_sorted() const {
+  return sys.check_sorted();
+}
+
+inline dimension_type
+Generator_System::num_lines_or_equalities() const {
+  return sys.num_lines_or_equalities();
+}
+
+inline void
+Generator_System::remove_row(dimension_type i, bool keep_sorted) {
+  sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(dimension_type first, dimension_type last,
+                              bool keep_sorted) {
+  sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(const std::vector<dimension_type>& indexes) {
+  sys.remove_rows(indexes);
+}
+
+inline void
+Generator_System::remove_trailing_rows(dimension_type n) {
+  sys.remove_trailing_rows(n);
+}
+
+inline dimension_type
+Generator_System::gauss(dimension_type n_lines_or_equalities) {
+  return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::back_substitute(dimension_type n_lines_or_equalities) {
+  sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::strong_normalize() {
+  sys.strong_normalize();
+}
+
+inline void
+Generator_System::merge_rows_assign(const Generator_System& y) {
+  sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Generator_System::insert(const Generator_System& y) {
+  sys.insert(y.sys);
+}
+
+inline void
+Generator_System::insert_pending(const Generator_System& r) {
+  sys.insert_pending(r.sys);
+}
+
+inline bool
+operator==(const Generator_System& x, const Generator_System& y) {
+  return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Generator_System& x, const Generator_System& y) {
+  return !(x == y);
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator()
+  : i(), gsp(0) {
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator(const Generator_System_const_iterator& y)
+  : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System_const_iterator::~Generator_System_const_iterator() {
+}
+
+inline
+Generator_System_const_iterator&
+Generator_System_const_iterator::operator=(const Generator_System_const_iterator& y) {
+  i = y.i;
+  gsp = y.gsp;
+  return *this;
+}
+
+inline const Generator&
+Generator_System_const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Generator*
+Generator_System_const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Generator_System_const_iterator&
+Generator_System_const_iterator::operator++() {
+  ++i;
+  if (!gsp->is_necessarily_closed())
+    skip_forward();
+  return *this;
+}
+
+inline Generator_System_const_iterator
+Generator_System_const_iterator::operator++(int) {
+  const Generator_System_const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Generator_System_const_iterator::operator==(const Generator_System_const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Generator_System_const_iterator::operator!=(const Generator_System_const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Generator_System_const_iterator::
+Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+                                const Generator_System& gs)
+  : i(iter), gsp(&gs.sys) {
+}
+
+inline bool
+Generator_System::empty() const {
+  return sys.has_no_rows();
+}
+
+inline bool
+Generator_System::has_no_rows() const {
+  return sys.has_no_rows();
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+  const_iterator i(sys.begin(), *this);
+  if (!sys.is_necessarily_closed())
+    i.skip_forward();
+  return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+  const const_iterator i(sys.end(), *this);
+  return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+  PPL_ASSERT(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
+}
+
+inline void
+Generator_System::m_swap(Generator_System& y) {
+  swap(sys, y.sys);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+  return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Generator_System::simplify() {
+  sys.simplify();
+  remove_invalid_lines_and_rays();
+}
+
+/*! \relates Generator_System */
+inline void
+swap(Generator_System& x, Generator_System& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_System_inlines_hh)
diff --git a/src/Generator_System_types.hh b/src/Generator_System_types.hh
new file mode 100644
index 0000000..f368654
--- /dev/null
+++ b/src/Generator_System_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Generator_System_types_hh
+#define PPL_Generator_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+class Generator_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_System_types_hh)
diff --git a/src/Generator_defs.hh b/src/Generator_defs.hh
new file mode 100644
index 0000000..5bb204c
--- /dev/null
+++ b/src/Generator_defs.hh
@@ -0,0 +1,1033 @@
+/* Generator class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_defs_hh
+#define PPL_Generator_defs_hh 1
+
+#include "Generator_types.hh"
+#include "Scalar_Products_types.hh"
+#include "Variables_Set_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Polyhedron_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Grid_Generator_System_types.hh"
+#include "MIP_Problem_types.hh"
+#include "Grid_types.hh"
+
+#include "Variable_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "distances_defs.hh"
+#include "Topology_types.hh"
+#include "Expression_Hide_Last_defs.hh"
+#include "Expression_Hide_Inhomo_defs.hh"
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Generator
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Generator& x, const Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Generator */
+void swap(Generator& x, Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a closure point
+    \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+  \par A note on terminology.
+  As observed in Section \ref representation, there are cases when,
+  in order to represent a polyhedron \f$\cP\f$ using the generator system
+  \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+  \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+  of \f$\cP\f$.
+  This situation is even more frequent when working with NNC polyhedra
+  and it is the reason why we prefer to use the word `point'
+  where other libraries use the word `vertex'.
+
+  \par How to build a generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+  or <CODE>closure_point</CODE>) to a linear expression,
+  representing a direction in the space;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and closure points, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Generator l = line(x - y - z);
+  \endcode
+  As mentioned above, the constant term of the linear expression
+  is not relevant. Thus, the following code has the same effect:
+  \code
+  Generator l = line(x - y - z + 15);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Generator l = line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds a ray with the same direction as the
+  line in Example 1:
+  \code
+  Generator r = ray(x - y - z);
+  \endcode
+  As is the case for lines, when specifying a ray the constant term
+  of the linear expression is not relevant; also, an exception is thrown
+  when trying to build a ray from the origin of the space.
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Generator p = point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Generator p = point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Generator origin3 = point(0*x + 0*y + 0*z);
+  Generator origin3_alt = point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Generator origin2 = point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Generator origin0 = Generator::zero_dim_point();
+  Generator origin0_alt = point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>point</CODE> (the divisor):
+  \code
+  Generator p = point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be usefully exploited to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Generator q = point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Closure points are specified in the same way we defined points,
+  but invoking their specific constructor function.
+  For instance, the closure point
+  \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+  \code
+  Generator c = closure_point(1*x + 0*y + 2*z);
+  \endcode
+  For the particular case of the (only) closure point
+  having space dimension zero, we can use any of the following:
+  \code
+  Generator closure_origin0 = Generator::zero_dim_closure_point();
+  Generator closure_origin0_alt = closure_point();
+  \endcode
+
+  \par How to inspect a generator
+  Several methods are provided to examine a generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the closure point <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Generator g2 = closure_point(e, g1.divisor());
+    cout << "Closure point g2: " << g2 << endl;
+  }
+  else
+    cout << "Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Generator g1 = point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Closure point g2: cp((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with (closure) points, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator {
+public:
+
+  //! The representation used for new Generators.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator line(const Linear_Expression& e,
+                        Representation r = default_representation);
+
+  //! Returns the ray of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator ray(const Linear_Expression& e,
+                       Representation r = default_representation);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator point(const Linear_Expression& e
+                         = Linear_Expression::zero(),
+                         Coefficient_traits::const_reference d
+                         = Coefficient_one(),
+                         Representation r = default_representation);
+
+  //! Returns the origin.
+  static Generator point(Representation r);
+
+  //! Returns the point at \p e.
+  static Generator point(const Linear_Expression& e,
+                         Representation r);
+
+  //! Constructs the point at the origin.
+  explicit Generator(Representation r = default_representation);
+
+  //! Returns the closure point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator
+  closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+                Coefficient_traits::const_reference d = Coefficient_one(),
+                Representation r = default_representation);
+
+  //! Returns the closure point at the origin.
+  static Generator
+  closure_point(Representation r);
+
+  //! Returns the closure point at \p e.
+  static Generator
+  closure_point(const Linear_Expression& e, Representation r);
+
+  //! Ordinary copy constructor.
+  //! The representation of the new Generator will be the same as g.
+  Generator(const Generator& g);
+
+  //! Copy constructor with given representation.
+  Generator(const Generator& g, Representation r);
+
+  //! Copy constructor with given space dimension.
+  //! The representation of the new Generator will be the same as g.
+  Generator(const Generator& g, dimension_type space_dim);
+
+  //! Copy constructor with given representation and space dimension.
+  Generator(const Generator& g, dimension_type space_dim, Representation r);
+
+  //! Destructor.
+  ~Generator();
+
+  //! Assignment operator.
+  Generator& operator=(const Generator& g);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the generator.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+
+    If all dimensions with nonzero coefficients are removed from a ray or a
+    line, it is changed into a point and this method returns \p false .
+    Otherwise, it returns \p true .
+  */
+  bool remove_space_dimensions(const Variables_Set& vars);
+
+  //! Permutes the space dimensions of the generator.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a ray. */
+    RAY,
+    /*! The generator is a point. */
+    POINT,
+    /*! The generator is a closure point. */
+    CLOSURE_POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+  bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_line_or_ray() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+  bool is_closure_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! If \p *this is either a point or a closure point, returns its divisor.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is neither a point nor a closure point.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Generator& zero_dim_point();
+
+  /*! \brief
+    Returns, as a closure point,
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator& zero_dim_closure_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Generator& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  /*!
+    This is faster than is_equivalent_to(), but it may return `false' even
+    for equivalent generators.
+  */
+  bool is_equal_to(const Generator& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Generator& y);
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+  expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+private:
+  //! The possible kinds of Generator objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+  //! The linear expression encoding \p *this.
+  Linear_Expression expr;
+
+  //! The kind of \p *this.
+  Kind kind_;
+
+  //! The topology of \p *this.
+  Topology topology_;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator* zero_dim_point_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$, as a closure point.
+  */
+  static const Generator* zero_dim_closure_point_p;
+
+  /*! \brief
+    Builds a generator of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+
+    If the topology is NNC, the last dimension of \p e is used as the epsilon
+    coefficient.
+  */
+  Generator(Linear_Expression& e, Type type, Topology topology);
+
+  Generator(Linear_Expression& e, Kind kind, Topology topology);
+
+  Generator(dimension_type space_dim, Kind kind, Topology topology,
+            Representation r = default_representation);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+
+  //! Sets to \p x the topological kind of \p *this row.
+  void set_topology(Topology x);
+
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+  //@} // Flags coercion methods
+
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+  /*!
+    \param y
+    The Generator that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting Generator to \p *this and normalizes it.
+  */
+  void linear_combine(const Generator& y, dimension_type i);
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid objects.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* v_name,
+                               Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+  bool is_ray_or_point() const;
+
+  //! Sets the Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_ray_or_point();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the closure point
+    \p *this has the same \e coordinates of the point \p p.
+
+    It is \e assumed that \p *this is a closure point, \p p is a point
+    and both topologies and space dimensions agree.
+  */
+  bool is_matching_closure_point(const Generator& p) const;
+
+  //! Returns the epsilon coefficient. The generator must be NNC.
+  Coefficient_traits::const_reference epsilon_coefficient() const;
+
+  //! Sets the epsilon coefficient to \p n. The generator must be NNC.
+  void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Generator objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Generator::normalize() and Generator::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  /*! \brief
+    A print function, with fancy, more human-friendly output.
+
+    This is used by operator<<().
+  */
+  void fancy_print(std::ostream& s) const;
+
+  friend class Expression_Adapter<Generator>;
+  friend class Linear_System<Generator>;
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+  friend class Parma_Polyhedra_Library::Generator_System;
+  friend class Parma_Polyhedra_Library::Generator_System_const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  // This is for access to Linear_Expression in `insert'.
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+  friend class Parma_Polyhedra_Library::MIP_Problem;
+  friend class Parma_Polyhedra_Library::Grid;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+                                                    const Generator& g);
+
+  friend int
+  compare(const Generator& x, const Generator& y);
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator::line(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e,
+               Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::ray(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e,
+              Representation r = Generator::default_representation);
+
+/*! \brief
+  Shorthand for
+  Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+      Coefficient_traits::const_reference d = Coefficient_one(),
+      Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::point(Representation r).
+/*! \relates Generator */
+Generator
+point(Representation r);
+
+/*! \brief
+  Shorthand for
+  Generator::point(const Linear_Expression& e, Representation r).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e, Representation r);
+
+/*! \brief
+  Shorthand for
+  Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+              Coefficient_traits::const_reference d = Coefficient_one(),
+              Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::closure_point(Representation r).
+/*! \relates Generator */
+Generator
+closure_point(Representation r);
+
+/*! \brief
+  Shorthand for
+  Generator::closure_point(const Linear_Expression& e, Representation r).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Generator_inlines.hh"
+
+#endif // !defined(PPL_Generator_defs_hh)
diff --git a/src/Generator_inlines.hh b/src/Generator_inlines.hh
new file mode 100644
index 0000000..8de552b
--- /dev/null
+++ b/src/Generator_inlines.hh
@@ -0,0 +1,709 @@
+/* Generator class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Generator_inlines_hh
+#define PPL_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Generator::is_necessarily_closed() const {
+  return (topology() == NECESSARILY_CLOSED);
+}
+
+inline bool
+Generator::is_not_necessarily_closed() const {
+  return (topology() == NOT_NECESSARILY_CLOSED);
+}
+
+inline Generator::expr_type
+Generator::expression() const {
+  return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+  return expression().space_dimension();
+}
+
+inline bool
+Generator::is_line_or_equality() const {
+  return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Generator::is_ray_or_point_or_inequality() const {
+  return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Generator::topology() const {
+  return topology_;
+}
+
+inline void
+Generator::set_is_line_or_equality() {
+  kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Generator::set_is_ray_or_point_or_inequality() {
+  kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Generator::set_topology(Topology x) {
+  if (topology() == x)
+    return;
+  if (topology() == NECESSARILY_CLOSED) {
+    // Add a column for the epsilon dimension.
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  }
+  else {
+    PPL_ASSERT(expr.space_dimension() > 0);
+    expr.set_space_dimension(expr.space_dimension() - 1);
+  }
+  topology_ = x;
+}
+
+inline void
+Generator::mark_as_necessarily_closed() {
+  PPL_ASSERT(is_not_necessarily_closed());
+  topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::mark_as_not_necessarily_closed() {
+  PPL_ASSERT(is_necessarily_closed());
+  topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Generator::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Generator::Generator(Representation r)
+  : expr(r),
+    kind_(RAY_OR_POINT_OR_INEQUALITY),
+    topology_(NECESSARILY_CLOSED) {
+  expr.set_inhomogeneous_term(Coefficient_one());
+  PPL_ASSERT(space_dimension() == 0);
+  PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(dimension_type space_dim, Kind kind, Topology topology,
+                     Representation r)
+  : expr(r),
+    kind_(kind),
+    topology_(topology) {
+  if (is_necessarily_closed())
+    expr.set_space_dimension(space_dim);
+  else
+    expr.set_space_dimension(space_dim + 1);
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology)
+  : topology_(topology) {
+  PPL_ASSERT(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  if (type == LINE)
+    kind_ = LINE_OR_EQUALITY;
+  else
+    kind_ = RAY_OR_POINT_OR_INEQUALITY;
+  strong_normalize();
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Kind kind, Topology topology)
+  : kind_(kind),
+    topology_(topology) {
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  strong_normalize();
+}
+
+inline
+Generator::Generator(const Generator& g)
+  : expr(g.expr),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+}
+
+inline
+Generator::Generator(const Generator& g, Representation r)
+  : expr(g.expr, r),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+  // This does not assert OK() because it's called by OK().
+  PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim)
+  : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim,
+                     Representation r)
+  : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+  Generator tmp = g;
+  swap(*this, tmp);
+
+  return *this;
+}
+
+inline Representation
+Generator::representation() const {
+  return expr.representation();
+}
+
+inline void
+Generator::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+  return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+  const dimension_type old_expr_space_dim = expr.space_dimension();
+  if (topology() == NECESSARILY_CLOSED) {
+    expr.set_space_dimension(space_dim);
+  }
+  else {
+    const dimension_type old_space_dim = space_dimension();
+    if (space_dim > old_space_dim) {
+      expr.set_space_dimension(space_dim + 1);
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+    }
+    else {
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+      expr.set_space_dimension(space_dim + 1);
+    }
+  }
+  PPL_ASSERT(space_dimension() == space_dim);
+  if (expr.space_dimension() < old_expr_space_dim)
+    strong_normalize();
+}
+
+inline void
+Generator::set_space_dimension(dimension_type space_dim) {
+  set_space_dimension_no_ok(space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Generator::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+  return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+  return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+  if (is_line())
+    return LINE;
+  if (is_line_or_ray())
+    return RAY;
+  if (is_necessarily_closed())
+    return POINT;
+  else {
+    // Checking the value of the epsilon coefficient.
+    if (epsilon_coefficient() == 0)
+      return CLOSURE_POINT;
+    else
+      return POINT;
+  }
+}
+
+inline bool
+Generator::is_point() const {
+  return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+  return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+  Coefficient_traits::const_reference d = expr.inhomogeneous_term();
+  if (!is_ray_or_point() || d == 0)
+    throw_invalid_argument("divisor()",
+                           "*this is neither a point nor a closure point");
+  return d;
+}
+
+inline Coefficient_traits::const_reference
+Generator::epsilon_coefficient() const {
+  PPL_ASSERT(is_not_necessarily_closed());
+  return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+
+inline void
+Generator::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+  PPL_ASSERT(is_not_necessarily_closed());
+  expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Generator::strong_normalize() {
+  expr.normalize();
+  sign_normalize();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+  PPL_ASSERT(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+  PPL_ASSERT(zero_dim_closure_point_p != 0);
+  return *zero_dim_closure_point_p;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e, Representation r) {
+  return Generator::line(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e, Representation r) {
+  return Generator::ray(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d,
+      Representation r) {
+  return Generator::point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(Representation r) {
+  return Generator::point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Representation r) {
+  return Generator::point(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+              Coefficient_traits::const_reference d,
+              Representation r) {
+  return Generator::closure_point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(Representation r) {
+  return Generator::closure_point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+              Representation r) {
+  return Generator::closure_point(e, r);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+  return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+
+  expr.ascii_dump(s);
+
+  s << " ";
+  
+  switch (type()) {
+  case Generator::LINE:
+    s << "L ";
+    break;
+  case Generator::RAY:
+    s << "R ";
+    break;
+  case Generator::POINT:
+    s << "P ";
+    break;
+  case Generator::CLOSURE_POINT:
+    s << "C ";
+    break;
+  }
+  if (is_necessarily_closed())
+    s << "(C)";
+  else
+    s << "(NNC)";
+  s << "\n";
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+  std::string str;
+
+  expr.ascii_load(s);
+
+  if (!(s >> str))
+    return false;
+  if (str == "L")
+    set_is_line();
+  else if (str == "R" || str == "P" || str == "C")
+    set_is_ray_or_point();
+  else
+    return false;
+
+  std::string str2;
+
+  if (!(s >> str2))
+    return false;
+  if (str2 == "(C)") {
+    if (is_not_necessarily_closed())
+      // TODO: Avoid using the mark_as_*() methods if possible.
+      mark_as_necessarily_closed();
+  }
+  else {
+    if (str2 == "(NNC)") {
+      if (is_necessarily_closed())
+        // TODO: Avoid using the mark_as_*() methods if possible.
+        mark_as_not_necessarily_closed();
+    }
+    else
+      return false;
+  }
+
+  // Checking for equality of actual and declared types.
+  switch (type()) {
+  case Generator::LINE:
+    if (str != "L")
+      return false;
+    break;
+  case Generator::RAY:
+    if (str != "R")
+      return false;
+    break;
+  case Generator::POINT:
+    if (str != "P")
+      return false;
+    break;
+  case Generator::CLOSURE_POINT:
+    if (str != "C")
+      return false;
+    break;
+  }
+
+  return true;
+}
+
+inline void
+Generator::m_swap(Generator& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(kind_, y.kind_);
+  swap(topology_, y.topology_);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Generator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const Generator& x,
+                    const Generator& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0,
+                    Temp& tmp1,
+                    Temp& tmp2) {
+  // Generator kind compatibility check: we only compute distances
+  // between (closure) points.
+  if (x.is_line_or_ray() || y.is_line_or_ray())
+    return false;
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // All zero-dim generators have distance zero.
+  if (x_space_dim == 0) {
+    assign_r(r, 0, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  PPL_DIRTY_TEMP(mpq_class, x_coord);
+  PPL_DIRTY_TEMP(mpq_class, y_coord);
+  PPL_DIRTY_TEMP(mpq_class, x_div);
+  PPL_DIRTY_TEMP(mpq_class, y_div);
+  assign_r(x_div, x.divisor(), ROUND_NOT_NEEDED);
+  assign_r(y_div, y.divisor(), ROUND_NOT_NEEDED);
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  // TODO: This loop can be optimized more, if needed.
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    assign_r(x_coord, x.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(x_coord, x_coord, x_div, ROUND_NOT_NEEDED);
+    assign_r(y_coord, y.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(y_coord, y_coord, y_div, ROUND_NOT_NEEDED);
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+
+    if (x_coord > y_coord) {
+      maybe_assign(tmp1p, tmp1, x_coord, dir);
+      maybe_assign(tmp2p, tmp2, y_coord, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_coord, dir);
+      maybe_assign(tmp2p, tmp2, x_coord, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    PPL_ASSERT(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Generator& x,
+                            const Generator& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Generator& x,
+                            const Generator& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Generator& x,
+                            const Generator& y,
+                            const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Generator& x,
+                          const Generator& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Generator& x,
+                          const Generator& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Generator& x,
+                          const Generator& y,
+                          const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Generator& x,
+                           const Generator& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Generator& x,
+                           const Generator& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Generator& x,
+                           const Generator& y,
+                           const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+inline void
+swap(Generator& x, Generator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_inlines_hh)
diff --git a/src/Generator_types.hh b/src/Generator_types.hh
new file mode 100644
index 0000000..f2a7178
--- /dev/null
+++ b/src/Generator_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Generator_types_hh
+#define PPL_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_types_hh)
diff --git a/src/Grid_Certificate.cc b/src/Grid_Certificate.cc
new file mode 100644
index 0000000..d535b5f
--- /dev/null
+++ b/src/Grid_Certificate.cc
@@ -0,0 +1,108 @@
+/* Grid_Certificate class implementation
+   (non-inline member functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_Certificate_defs.hh"
+#include "Grid_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Grid_Certificate::Grid_Certificate(const Grid& gr)
+  : num_equalities(0), num_proper_congruences(0) {
+
+  // As in Polyhedron assume that `gr' contains at least one point.
+  PPL_ASSERT(!gr.marked_empty());
+  if (gr.space_dimension() == 0)
+    return;
+  // One of the systems must be in minimal form.
+  if (gr.congruences_are_up_to_date()) {
+    if (gr.congruences_are_minimized()) {
+      num_proper_congruences = gr.con_sys.num_proper_congruences();
+      num_equalities = gr.con_sys.num_equalities();
+    }
+    else
+      if (gr.generators_are_up_to_date() && gr.generators_are_minimized()) {
+        // Calculate number of congruences from generators.
+        num_proper_congruences
+          = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
+        num_equalities = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
+      }
+      else {
+        // Minimize `gr' congruence system.  As in Polyhedron assume
+        // that `gr' contains at least one point.
+        Grid& mgr = const_cast<Grid&>(gr);
+        const bool empty = Grid::simplify(mgr.con_sys, mgr.dim_kinds);
+        // Avoid possible compiler warning.
+        PPL_USED(empty);
+        PPL_ASSERT(!empty);
+        mgr.set_congruences_minimized();
+
+        num_proper_congruences = mgr.con_sys.num_proper_congruences();
+        num_equalities = mgr.con_sys.num_equalities();
+      }
+  }
+  else {
+    if (!gr.generators_are_minimized()) {
+      // Minimize `gr' generator system.  As in Polyhedron assume that
+      // `gr' contains at least one point.
+      Grid& mgr = const_cast<Grid&>(gr);
+      Grid::simplify(mgr.gen_sys, mgr.dim_kinds);
+      // If gen_sys contained rows before being reduced, it should
+      // contain at least a single point afterward.
+      PPL_ASSERT(!mgr.gen_sys.empty());
+      mgr.set_generators_minimized();
+    }
+    // Calculate number of congruences from generators.
+    num_proper_congruences
+      = gr.gen_sys.num_parameters() + 1 /* Integrality cg. */;
+    num_equalities
+      = gr.space_dimension() + 1 - gr.gen_sys.num_rows();
+  }
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid_Certificate& y) const {
+  PPL_ASSERT(OK() && y.OK());
+  if (num_equalities == y.num_equalities) {
+    if (num_proper_congruences == y.num_proper_congruences)
+      return 0;
+    else
+      return (num_proper_congruences > y.num_proper_congruences) ? 1 : -1;
+  }
+  return (num_equalities > y.num_equalities) ? 1 : -1;
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid& gr) const {
+  const Grid_Certificate gc(gr);
+  return compare(gc);
+}
+
+bool
+PPL::Grid_Certificate::OK() const {
+  // There is nothing to test.
+  return true;
+}
diff --git a/src/Grid_Certificate_defs.hh b/src/Grid_Certificate_defs.hh
new file mode 100644
index 0000000..5aaac9a
--- /dev/null
+++ b/src/Grid_Certificate_defs.hh
@@ -0,0 +1,104 @@
+/* Grid_Certificate class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Certificate_defs_hh
+#define PPL_Grid_Certificate_defs_hh 1
+
+#include "Grid_Certificate_types.hh"
+
+#include "Grid_types.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+#include <vector>
+
+//! The convergence certificate for the Grid widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, Grid_Certificate can
+  certify the Grid widening.
+*/
+class Parma_Polyhedra_Library::Grid_Certificate {
+public:
+  //! Default constructor.
+  Grid_Certificate();
+
+  //! Constructor: computes the certificate for \p gr.
+  Grid_Certificate(const Grid& gr);
+
+  //! Copy constructor.
+  Grid_Certificate(const Grid_Certificate& y);
+
+  //! Destructor.
+  ~Grid_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+  */
+  int compare(const Grid_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for grid \p gr.
+  int compare(const Grid& gr) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for grid
+    \p gr is strictly smaller than \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_stabilizing(const Grid& gr) const;
+
+  //! A total ordering on Grid certificates.
+  /*!
+    This binary predicate defines a total ordering on Grid certificates
+    which is used when storing information about sets of grids.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const Grid_Certificate& x,
+                    const Grid_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+private:
+  //! Number of a equalities in a minimized congruence system for the
+  //! grid.
+  dimension_type num_equalities;
+  //! Number of a proper congruences in a minimized congruence system
+  //! for the grid.
+  dimension_type num_proper_congruences;
+};
+
+#include "Grid_Certificate_inlines.hh"
+
+#endif // !defined(PPL_Grid_Certificate_defs_hh)
diff --git a/src/Grid_Certificate_inlines.hh b/src/Grid_Certificate_inlines.hh
new file mode 100644
index 0000000..35d3433
--- /dev/null
+++ b/src/Grid_Certificate_inlines.hh
@@ -0,0 +1,61 @@
+/* Grid_Certificate class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Certificate_inlines_hh
+#define PPL_Grid_Certificate_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Certificate::Grid_Certificate()
+  : num_equalities(0), num_proper_congruences(0) {
+  // This is the certificate for a zero-dim universe grid.
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+  : num_equalities(y.num_equalities),
+    num_proper_congruences(y.num_proper_congruences) {
+}
+
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
+
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+  return compare(gr) == 1;
+}
+
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+                                      const Grid_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this LGO relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Certificate_inlines_hh)
diff --git a/src/Grid_Certificate_types.hh b/src/Grid_Certificate_types.hh
new file mode 100644
index 0000000..d825c8e
--- /dev/null
+++ b/src/Grid_Certificate_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Certificate_types_hh
+#define PPL_Grid_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+#endif // !defined(PPL_Grid_Certificate_types_hh)
diff --git a/src/Grid_Generator.cc b/src/Grid_Generator.cc
new file mode 100644
index 0000000..24022fd
--- /dev/null
+++ b/src/Grid_Generator.cc
@@ -0,0 +1,479 @@
+/* Grid_Generator class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_Generator_defs.hh"
+
+#include "Variables_Set_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <iostream>
+#include <sstream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator::throw_dimension_incompatible(const char* method,
+                                                  const char* name_var,
+                                                  const Variable v) const {
+  std::ostringstream s;
+  s << "PPL::Grid_Generator::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << name_var << ".space_dimension() == " << v.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid_Generator::throw_invalid_argument(const char* method,
+                                            const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::Grid_Generator::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::parameter(const Linear_Expression& e,
+                               Coefficient_traits::const_reference d,
+                               Representation r) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::parameter(e, d):\n"
+                                "d == 0.");
+  // Add 1 to space dimension to allow for parameter divisor column.
+  Linear_Expression ec(e, e.space_dimension() + 1, r);
+
+  ec.set_inhomogeneous_term(Coefficient_zero());
+  const Variable divisor_var(e.space_dimension());
+  ec.set(divisor_var, d);
+
+  // If the divisor is negative, negate it and all the coefficients of
+  // the parameter, so as to satisfy the invariant.
+  if (d < 0)
+    neg_assign(ec);
+
+  // Using this constructor saves reallocation when creating the
+  // coefficients.
+  const Grid_Generator gg(ec, PARAMETER);
+
+  // NOTE: normalize() must *not* be called here, because this is a parameter,
+  // and it would change the represented parameter.
+  return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_point(const Linear_Expression& e,
+                                Coefficient_traits::const_reference d,
+                                Representation r) {
+  if (d == 0)
+    throw std::invalid_argument("PPL::grid_point(e, d):\n"
+                                "d == 0.");
+  // Add 1 to space dimension to allow for parameter divisor column.
+  Linear_Expression ec(e, 1 + e.space_dimension(), r);
+  ec.set_inhomogeneous_term(d);
+
+  // If the divisor is negative, negate it and all the coefficients of
+  // the point, so as to satisfy the invariant.
+  if (d < 0)
+    neg_assign(ec);
+
+  // Using this constructor saves reallocation when creating the
+  // coefficients.
+  Grid_Generator gg(ec, POINT);
+
+  // Enforce normalization.
+  gg.expr.normalize();
+  return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_point(Representation r) {
+  return grid_point(Linear_Expression::zero(), Coefficient_one(), r);
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_point(const Linear_Expression& e,
+                                Representation r) {
+  return grid_point(e, Coefficient_one(), r);
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::grid_line(const Linear_Expression& e, Representation r) {
+  // The origin of the space cannot be a line.
+  if (e.all_homogeneous_terms_are_zero())
+    throw std::invalid_argument("PPL::grid_line(e):\n"
+                                "e == 0, but the origin cannot be a line.");
+
+  // Add 1 to space dimension to allow for parameter divisor column.
+  Linear_Expression ec(e, 1 + e.space_dimension(), r);
+  ec.set_inhomogeneous_term(Coefficient_zero());
+  // Using this constructor saves reallocation when creating the
+  // coefficients.
+  Grid_Generator gg(ec, LINE);
+
+  // Enforce normalization.
+  gg.strong_normalize();
+  return gg;
+}
+
+void
+PPL::Grid_Generator::swap_space_dimensions(Variable v1, Variable v2) {
+  PPL_ASSERT(v1.space_dimension() <= space_dimension());
+  PPL_ASSERT(v2.space_dimension() <= space_dimension());
+  expr.swap_space_dimensions(v1, v2);
+  // *this is still normalized but it may not be strongly normalized.
+  if (!is_parameter())
+    sign_normalize();
+  PPL_ASSERT(OK());
+}
+
+bool
+PPL::Grid_Generator::remove_space_dimensions(const Variables_Set& vars) {
+  PPL_ASSERT(vars.space_dimension() <= space_dimension());
+  
+  expr.remove_space_dimensions(vars);
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PPL::Grid_Generator
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  if (cycle.size() < 2)
+    // No-op. No need to call sign_normalize().
+    return;
+
+  expr.permute_space_dimensions(cycle);
+
+  // *this is still normalized but may be not strongly normalized: sign
+  // normalization is necessary.
+  // Sign-normalizing a parameter changes its meaning, so do nothing for
+  // parameters.
+  if (!is_parameter())
+    sign_normalize();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid_Generator::ascii_dump(std::ostream& s) const {
+  expr.ascii_dump(s);
+  s << ' ';
+  switch (type()) {
+  case LINE:
+    s << "L";
+    break;
+  case PARAMETER:
+    s << "Q";
+    break;
+  case POINT:
+    s << "P";
+    break;
+  }
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator)
+
+bool
+PPL::Grid_Generator::ascii_load(std::istream& s) {
+
+  if (!expr.ascii_load(s))
+    return false;
+
+  std::string str;
+
+  if (!(s >> str))
+    return false;
+  if (str == "L")
+    set_is_line();
+  else if (str == "P" || str == "Q")
+    set_is_parameter_or_point();
+  else
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PPL::Grid_Generator::set_is_parameter() {
+  if (is_line())
+    set_is_parameter_or_point();
+  else if (!is_line_or_parameter()) {
+    // The grid generator is a point.
+    expr.set(Variable(expr.space_dimension() - 1), expr.inhomogeneous_term());
+    expr.set_inhomogeneous_term(Coefficient_zero());
+  }
+}
+
+void
+PPL::Grid_Generator::linear_combine(const Grid_Generator& y,
+                                    dimension_type i) {
+  expr.linear_combine(y.expr, i);
+  strong_normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+int
+PPL::compare(const Grid_Generator& x, const Grid_Generator& y) {
+  const bool x_is_line_or_equality = x.is_line_or_equality();
+  const bool y_is_line_or_equality = y.is_line_or_equality();
+  if (x_is_line_or_equality != y_is_line_or_equality)
+    // Equalities (lines) precede inequalities (ray/point).
+    return y_is_line_or_equality ? 2 : -2;
+
+  return compare(x.expr, y.expr);
+}
+
+bool
+PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const {
+  const Grid_Generator& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  const Type x_type = x.type();
+  if (x_type != y.type())
+    return false;
+
+  Grid_Generator tmp_x = *this;
+  Grid_Generator tmp_y = y;
+  const Variable last_var(x_space_dim);
+  if (x_type == POINT || x_type == LINE) {
+    tmp_x.expr.set(last_var, Coefficient_zero());
+    tmp_y.expr.set(last_var, Coefficient_zero());
+  }
+  // Normalize the copies, including the divisor column.
+  tmp_x.expr.normalize();
+  tmp_y.expr.normalize();
+  // Check for equality.
+  return tmp_x.is_equal_to(tmp_y);
+}
+
+bool
+PPL::Grid_Generator::is_equal_to(const Grid_Generator& y) const {
+  return expr.is_equal_to(y.expr) && kind_ == y.kind_;
+}
+
+bool
+PPL::Grid_Generator::all_homogeneous_terms_are_zero() const {
+  // This does not check neither the first nor the last coefficient.
+  return expr.all_zeroes(1, expr.space_dimension());
+}
+
+void
+PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) {
+  PPL_ASSERT(d != 0);
+  if (is_line())
+    return;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(factor);
+  exact_div_assign(factor, d, divisor());
+  set_divisor(d);
+  PPL_ASSERT(factor > 0);
+  if (factor > 1)
+    // Don't scale the first and last coefficients.
+    expr.mul_assign(factor, 1, expr.space_dimension());
+}
+
+void
+PPL::Grid_Generator::sign_normalize() {
+  if (is_line_or_equality())
+    expr.sign_normalize();
+}
+
+bool
+PPL::Grid_Generator::check_strong_normalized() const {
+  Grid_Generator tmp = *this;
+  tmp.strong_normalize();
+  return compare(*this, tmp) == 0;
+}
+
+const PPL::Grid_Generator* PPL::Grid_Generator::zero_dim_point_p = 0;
+
+void
+PPL::Grid_Generator::initialize() {
+  PPL_ASSERT(zero_dim_point_p == 0);
+  zero_dim_point_p = new Grid_Generator(grid_point());
+}
+
+void
+PPL::Grid_Generator::finalize() {
+  PPL_ASSERT(zero_dim_point_p != 0);
+  delete zero_dim_point_p;
+  zero_dim_point_p = 0;
+}
+
+void
+PPL::Grid_Generator::fancy_print(std::ostream& s) const {
+  bool need_divisor = false;
+  bool extra_parentheses = false;
+  const dimension_type num_variables = space_dimension();
+  const Grid_Generator::Type t = type();
+  switch (t) {
+  case Grid_Generator::LINE:
+    s << "l(";
+    break;
+  case Grid_Generator::PARAMETER:
+    s << "q(";
+    if (expr.coefficient(Variable(num_variables)) == 1)
+      break;
+    goto any_point;
+  case Grid_Generator::POINT:
+    s << "p(";
+    if (expr.inhomogeneous_term() > 1) {
+    any_point:
+      need_divisor = true;
+      if (!expr.all_zeroes(1, num_variables + 1)) {
+        extra_parentheses = true;
+        s << "(";
+        break;
+      }
+    }
+    break;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+  bool first = true;
+  for (Linear_Expression::const_iterator i = expr.begin(),
+         i_end = expr.lower_bound(Variable(num_variables)); i != i_end; ++i) {
+    c = *i;
+    if (!first) {
+      if (c > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(c);
+      }
+    }
+    else
+      first = false;
+    if (c == -1)
+      s << "-";
+    else if (c != 1)
+      s << c << "*";
+    IO_Operators::operator<<(s, i.variable());
+  }
+  if (first)
+    // A grid generator in the origin.
+    s << 0;
+  if (extra_parentheses)
+    s << ")";
+  if (need_divisor)
+    s << "/" << divisor();
+  s << ")";
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
+  g.fancy_print(s);
+  return s;
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s,
+                              const Grid_Generator::Type& t) {
+  const char* n = 0;
+  switch (t) {
+  case Grid_Generator::LINE:
+    n = "LINE";
+    break;
+  case Grid_Generator::PARAMETER:
+    n = "PARAMETER";
+    break;
+  case Grid_Generator::POINT:
+    n = "POINT";
+    break;
+  }
+  s << n;
+  return s;
+}
+
+bool
+PPL::Grid_Generator::OK() const {
+  // NOTE: do not check for normalization, as it does not hold.
+  const Grid_Generator& x = *this;
+
+  if (!x.is_necessarily_closed()) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator should be necessarily closed.\n";
+#endif
+    return false;
+  }
+
+  if (x.expr.space_dimension() < 1) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator has fewer coefficients than the minimum "
+              << "allowed:\nspace dimension is " << x.expr.space_dimension()
+              << ", minimum is 1.\n";
+#endif
+    return false;
+  }
+
+  switch (x.type()) {
+  case Grid_Generator::LINE:
+    if (x.expr.inhomogeneous_term() != 0) {
+#ifndef NDEBUG
+      std::cerr << "Inhomogeneous terms of lines must be zero!\n";
+#endif
+      return false;
+    }
+    break;
+
+  case Grid_Generator::PARAMETER:
+    if (x.expr.inhomogeneous_term() != 0) {
+#ifndef NDEBUG
+      std::cerr << "Inhomogeneous terms of parameters must be zero!\n";
+#endif
+      return false;
+    }
+    if (x.divisor() <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Parameters must have positive divisors!\n";
+#endif
+      return false;
+    }
+    break;
+
+  case Grid_Generator::POINT:
+    if (x.expr.inhomogeneous_term() <= 0) {
+#ifndef NDEBUG
+      std::cerr << "Points must have positive divisors!\n";
+#endif
+      return false;
+    }
+    if (x.expr.coefficient(Variable(space_dimension())) != 0) {
+#ifndef NDEBUG
+      std::cerr << "Points must have a zero parameter divisor!\n";
+#endif
+      return false;
+    }
+    break;
+
+  } // switch (x.type())
+
+  // All tests passed.
+  return true;
+}
diff --git a/src/Grid_Generator_System.cc b/src/Grid_Generator_System.cc
new file mode 100644
index 0000000..762aa27
--- /dev/null
+++ b/src/Grid_Generator_System.cc
@@ -0,0 +1,298 @@
+/* Grid_Generator_System class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Variables_Set_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator_System::insert(Grid_Generator_System& gs, Recycle_Input) {
+  const dimension_type gs_num_rows = gs.num_rows();
+
+  if (space_dimension() < gs.space_dimension())
+    set_space_dimension(gs.space_dimension());
+  else
+    gs.set_space_dimension(space_dimension());
+
+  for (dimension_type i = 0; i < gs_num_rows; ++i)
+    sys.insert(gs.sys.rows[i], Recycle_Input());
+
+  gs.clear();
+
+  unset_pending_rows();
+}
+
+void
+PPL::Grid_Generator_System::insert(const Grid_Generator& g) {
+  Grid_Generator tmp(g, representation());
+  insert(tmp, Recycle_Input());
+}
+
+void
+PPL::Grid_Generator_System::insert(Grid_Generator& g, Recycle_Input) {
+  if (g.is_parameter() && g.all_homogeneous_terms_are_zero()) {
+    // There is no need to add the origin as a parameter,
+    // as it will be immediately flagged as redundant.
+    // However, we still have to adjust space dimension.
+    if (space_dimension() < g.space_dimension())
+      set_space_dimension(g.space_dimension());
+    return;
+  }
+
+  sys.insert(g, Recycle_Input());
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid_Generator_System
+::affine_image(Variable v,
+               const Linear_Expression& expr,
+               Coefficient_traits::const_reference denominator) {
+  // This is mostly a copy of Generator_System::affine_image.
+
+  Grid_Generator_System& x = *this;
+  PPL_ASSERT(v.space_dimension() <= x.sys.space_dimension());
+  PPL_ASSERT(expr.space_dimension() <= x.sys.space_dimension());
+  PPL_ASSERT(denominator > 0);
+
+  const dimension_type num_rows = x.num_rows();
+
+  // Compute the numerator of the affine transformation and assign it
+  // to the column of `*this' indexed by `v'.
+  PPL_DIRTY_TEMP_COEFFICIENT(numerator);
+
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    Grid_Generator& row = sys.rows[i];
+    Scalar_Products::assign(numerator, expr, row.expr);
+    if (denominator != 1) {
+      // Since we want integer elements in the matrix,
+      // we multiply by `denominator' all the columns of `*this'
+      // having an index different from `v'.
+      // Note that this operation also modifies the coefficient of v, but
+      // it will be overwritten by the set_coefficient() below.
+      row.expr *= denominator;
+    }
+    row.expr.set_coefficient(v, numerator);
+    // Check that the row is stll OK after fiddling with its internal data.
+    PPL_ASSERT(row.OK());
+  }
+
+  PPL_ASSERT(sys.OK());
+
+  // If the mapping is not invertible we may have transformed valid
+  // lines and rays into the origin of the space.
+  const bool not_invertible = (v.space_dimension() >= expr.space_dimension()
+                               || expr.coefficient(v) == 0);
+  if (not_invertible)
+    x.remove_invalid_lines_and_parameters();
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator_System)
+
+void
+PPL::Grid_Generator_System::ascii_dump(std::ostream& s) const {
+  sys.ascii_dump(s);
+}
+
+bool
+PPL::Grid_Generator_System::ascii_load(std::istream& s) {
+  if (!sys.ascii_load(s))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+const PPL::Grid_Generator_System*
+PPL::Grid_Generator_System::zero_dim_univ_p = 0;
+
+void
+PPL::Grid_Generator_System::initialize() {
+  PPL_ASSERT(zero_dim_univ_p == 0);
+  zero_dim_univ_p
+    = new Grid_Generator_System(Grid_Generator::zero_dim_point());
+}
+
+void
+PPL::Grid_Generator_System::finalize() {
+  PPL_ASSERT(zero_dim_univ_p != 0);
+  delete zero_dim_univ_p;
+  zero_dim_univ_p = 0;
+}
+
+bool
+PPL::Grid_Generator_System::OK() const {
+  if (sys.topology() == NOT_NECESSARILY_CLOSED) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator_System is NOT_NECESSARILY_CLOSED"
+              << std::endl;
+#endif
+    return false;
+  }
+
+  if (sys.is_sorted()) {
+#ifndef NDEBUG
+    std::cerr << "Grid_Generator_System is marked as sorted."
+              << std::endl;
+#endif
+    return false;
+  }
+
+  return sys.OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s,
+                              const Grid_Generator_System& gs) {
+  Grid_Generator_System::const_iterator i = gs.begin();
+  const Grid_Generator_System::const_iterator gs_end = gs.end();
+  if (i == gs_end)
+    return s << "false";
+  while (true) {
+    s << *i;
+    ++i;
+    if (i == gs_end)
+      return s;
+    s << ", ";
+  }
+}
+
+void
+PPL::Grid_Generator_System
+::add_universe_rows_and_columns(dimension_type dims) {
+  dimension_type col = sys.space_dimension();
+
+  set_space_dimension(space_dimension() + dims);
+
+  // Add the new rows and set their diagonal element.
+  for (dimension_type i = 0; i < dims; ++i) {
+    Grid_Generator tmp(space_dimension(), Grid_Generator::LINE_OR_EQUALITY,
+                       NECESSARILY_CLOSED, representation());
+    tmp.expr += Variable(col);
+    PPL_ASSERT(tmp.OK());
+    ++col;
+    sys.insert(tmp, Recycle_Input());
+  }
+}
+
+void
+PPL::Grid_Generator_System
+::remove_space_dimensions(const Variables_Set& vars) {
+  sys.remove_space_dimensions(vars);
+}
+
+void
+PPL::Grid_Generator_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+  sys.shift_space_dimensions(v, n);
+}
+
+void
+PPL::Grid_Generator_System
+::set_space_dimension(const dimension_type new_dimension) {
+  sys.set_space_dimension(new_dimension);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid_Generator_System::remove_invalid_lines_and_parameters() {
+  // The origin of the vector space cannot be a valid line/parameter.
+  // NOTE: the following swaps will mix grid generators without even trying
+  // to preserve sortedness: as a matter of fact, it will almost always
+  // be the case that the input generator system is NOT sorted.
+  
+  // Note that the num_rows() value is *not* constant because remove_row()
+  // decreases it.
+  for (dimension_type i = 0; i < num_rows(); ) {
+    const Grid_Generator& g = (*this)[i];
+    if (g.is_line_or_parameter() && g.all_homogeneous_terms_are_zero())
+      sys.remove_row(i, false);
+    else
+      ++i;
+  }
+}
+
+bool
+PPL::Grid_Generator_System::has_points() const {
+  const Grid_Generator_System& ggs = *this;
+  for (dimension_type i = num_rows(); i-- > 0; ) {
+    if (!ggs[i].is_line_or_parameter())
+      return true;
+  }
+  return false;
+}
+
+PPL::dimension_type
+PPL::Grid_Generator_System::num_lines() const {
+  // We are sure that this method is applied only to a matrix
+  // that does not contain pending rows.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  const Grid_Generator_System& ggs = *this;
+  dimension_type n = 0;
+  // If the Linear_System happens to be sorted, take advantage of the fact
+  // that lines are at the top of the system.
+  if (sys.is_sorted()) {
+    const dimension_type nrows = num_rows();
+    for (dimension_type i = 0; i < nrows && ggs[i].is_line(); ++i)
+      ++n;
+  }
+  else {
+    for (dimension_type i = num_rows(); i-- > 0 ; )
+      if (ggs[i].is_line())
+        ++n;
+  }
+  return n;
+}
+
+PPL::dimension_type
+PPL::Grid_Generator_System::num_parameters() const {
+  // We are sure that this method is applied only to a matrix
+  // that does not contain pending rows.
+  PPL_ASSERT(sys.num_pending_rows() == 0);
+  const Grid_Generator_System& ggs = *this;
+  dimension_type n = 0;
+  // If the Linear_System happens to be sorted, take advantage of the fact
+  // that rays and points are at the bottom of the system and
+  // rays have the inhomogeneous term equal to zero.
+  if (sys.is_sorted()) {
+    for (dimension_type i = num_rows();
+         i != 0 && ggs[--i].is_parameter_or_point(); )
+      if (ggs[i].is_line_or_parameter())
+        ++n;
+  }
+  else {
+    for (dimension_type i = num_rows(); i-- > 0 ; )
+      if (ggs[i].is_parameter())
+        ++n;
+  }
+  return n;
+}
diff --git a/src/Grid_Generator_System_defs.hh b/src/Grid_Generator_System_defs.hh
new file mode 100644
index 0000000..efe2f98
--- /dev/null
+++ b/src/Grid_Generator_System_defs.hh
@@ -0,0 +1,514 @@
+/* Grid_Generator_System class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_defs_hh
+#define PPL_Grid_Generator_System_defs_hh 1
+
+#include "Grid_Generator_System_types.hh"
+
+#include "Linear_System_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Polyhedron_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid_Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator_System */
+void swap(Grid_Generator_System& x, Grid_Generator_System& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+                const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Grid_Generator_System is a system of
+    grid generators, i.e., a multiset of objects of the class
+    Grid_Generator (lines, parameters and points).
+    When inserting generators in a system, space dimensions are
+    automatically adjusted so that all the generators in the system
+    are defined on the same vector space.
+    A system of grid generators which is meant to define a non-empty
+    grid must include at least one point: the reason is that
+    lines and parameters need a supporting point
+    (lines only specify directions while parameters only
+    specify direction and distance.
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty grid, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(grid_point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(grid_point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a system of generators corresponding
+    to the grid consisting of all the integral points on the \f$x\f$ axes;
+    that is, all points satisfying the congruence relation
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \pmod{1}\ 0
+      \,\bigr\},
+    \f]
+    \code
+  Grid_Generator_System gs;
+  gs.insert(parameter(x + 0*y));
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having three points
+    corresponding to a non-relational grid consisting of all points
+    whose coordinates are integer multiple of 3.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 3*y));
+  gs.insert(grid_point(3*x + 0*y));
+    \endcode
+
+    \par Example 4
+    By using parameters instead of two of the points we
+    can define the same grid as that defined in the previous example.
+    Note that there has to be at least one point and, for this purpose,
+    any point in the grid could be considered.
+    Thus the following code builds two identical grids from the
+    grid generator systems \p gs and \p gs1.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(0*x + 3*y));
+  gs.insert(parameter(3*x + 0*y));
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(3*x + 3*y));
+  gs1.insert(parameter(0*x + 3*y));
+  gs1.insert(parameter(3*x + 0*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having one point and
+    a parameter corresponding to all the integral points that
+    lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(1*x + 1*y));
+  gs.insert(parameter(1*x - 1*y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a grid generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> grid generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System {
+public:
+  typedef Grid_Generator row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of generators.
+  explicit Grid_Generator_System(Representation r = default_representation);
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Grid_Generator_System(const Grid_Generator& g,
+                                 Representation r = default_representation);
+
+  //! Builds an empty system of generators of dimension \p dim.
+  explicit Grid_Generator_System(dimension_type dim,
+                                 Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  //! The new Grid_Generator_System will have the same representation as `gs'.
+  Grid_Generator_System(const Grid_Generator_System& gs);
+
+  //! Copy constructor with specified representation.
+  Grid_Generator_System(const Grid_Generator_System& gs, Representation r);
+
+  //! Destructor.
+  ~Grid_Generator_System();
+
+  //! Assignment operator.
+  Grid_Generator_System& operator=(const Grid_Generator_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Grid_Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system and sets its
+    space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts into \p *this a copy of the generator \p g, increasing the
+    number of space dimensions if needed.
+
+    If \p g is an all-zero parameter then the only action is to ensure
+    that the space dimension of \p *this is at least the space
+    dimension of \p g.
+  */
+  void insert(const Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generator \p g, increasing the number of
+    space dimensions if needed.
+  */
+  void insert(Grid_Generator& g, Recycle_Input);
+
+  /*! \brief
+    Inserts into \p *this the generators in \p gs, increasing the
+    number of space dimensions if needed.
+  */
+  void insert(Grid_Generator_System& gs, Recycle_Input);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only
+    Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System& zero_dim_univ();
+
+  //! An iterator over a system of grid generators
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Grid_Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the grid <CODE>gr</CODE>:
+    \code
+  const Grid_Generator_System& ggs = gr.generators();
+  for (Grid_Generator_System::const_iterator i = ggs.begin(),
+        ggs_end = ggs.end(); i != ggs_end; ++i)
+    cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+  const Grid_Generator_System& ggs = gr.generators();
+  copy(ggs.begin(), ggs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+                           Grid_Generator,
+                           ptrdiff_t,
+                           const Grid_Generator*,
+                           const Grid_Generator&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Grid_Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Grid_Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Grid_Generator_System;
+
+    Linear_System<Grid_Generator>::const_iterator i;
+
+    //! Copy constructor from Linear_System< Grid_Generator>::const_iterator.
+    const_iterator(const Linear_System<Grid_Generator>::const_iterator& y);
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Returns the number of rows (generators) in the system.
+  dimension_type num_rows() const;
+
+  //! Returns the number of parameters in the system.
+  dimension_type num_parameters() const;
+
+  //! Returns the number of lines in the system.
+  dimension_type num_lines() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more points.
+  */
+  bool has_points() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  bool is_equal_to(const Grid_Generator_System& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Grid_Generator_System& y);
+
+private:
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Grid_Generator& operator[](dimension_type k) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    The variable to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation;
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations)to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its
+    default value is 1.
+
+    The affine transformation assigns to every variable \p v, in every
+    column, the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(Variable v,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the universe system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+    \times (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{A}{0} \genfrac{}{}{0pt}{}{0}{B}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{1}{0} \genfrac{}{}{0pt}{}{0}{1}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_universe_rows_and_columns(dimension_type dims);
+
+  //! Resizes the system to the specified space dimension.
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  bool has_no_rows() const;
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  void insert_verbatim(const Grid_Generator& g);
+
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  Linear_System<Grid_Generator> sys;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System* zero_dim_univ_p;
+
+  friend bool
+  operator==(const Grid_Generator_System& x, const Grid_Generator_System& y);
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Removes all the invalid lines and parameters.
+  /*!
+    The invalid lines and parameters are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_parameters();
+
+  friend class Polyhedron;
+  friend class Grid;
+};
+
+// Grid_Generator_System_inlines.hh is not included here on purpose.
+
+#endif // !defined(PPL_Grid_Generator_System_defs_hh)
diff --git a/src/Grid_Generator_System_inlines.hh b/src/Grid_Generator_System_inlines.hh
new file mode 100644
index 0000000..4b4b56f
--- /dev/null
+++ b/src/Grid_Generator_System_inlines.hh
@@ -0,0 +1,279 @@
+/* Grid_Generator_System class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_inlines_hh
+#define PPL_Grid_Generator_System_inlines_hh 1
+
+#include "Grid_Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+  sys.set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+  sys.unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+  sys.set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  return sys.permute_space_dimensions(cycle);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const {
+  return (sys == y.sys);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+  sys.set_sorted(false);
+  PPL_ASSERT(space_dimension() == 0);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+  : sys(gs.sys) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs,
+                                             Representation r)
+  : sys(gs.sys, r) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim,
+                                             Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+  sys.set_space_dimension(dim);
+  sys.set_sorted(false);
+  PPL_ASSERT(space_dimension() == dim);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g,
+                                             Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+  sys.insert(g);
+  sys.set_sorted(false);
+}
+
+inline
+Grid_Generator_System::~Grid_Generator_System() {
+}
+
+inline Grid_Generator_System&
+Grid_Generator_System::operator=(const Grid_Generator_System& y) {
+  Grid_Generator_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Representation
+Grid_Generator_System::representation() const {
+  return sys.representation();
+}
+
+inline void
+Grid_Generator_System::set_representation(Representation r) {
+  sys.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+  // Grid generators use an extra column for the parameter divisor.
+  return Linear_System<Grid_Generator>::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+  return sys.space_dimension();
+}
+
+inline const Grid_Generator_System&
+Grid_Generator_System::zero_dim_univ() {
+  PPL_ASSERT(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
+}
+
+inline void
+Grid_Generator_System::clear() {
+  sys.clear();
+  sys.set_sorted(false);
+  sys.unset_pending_rows();
+  PPL_ASSERT(space_dimension() == 0);
+}
+
+inline void
+Grid_Generator_System::m_swap(Grid_Generator_System& y) {
+  swap(sys, y.sys);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+  return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline dimension_type
+Grid_Generator_System::num_rows() const {
+  return sys.num_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+  : i() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline bool
+Grid_Generator_System::empty() const {
+  return sys.has_no_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator
+::const_iterator(const Linear_System<Grid_Generator>::const_iterator& y)
+  : i(y) {
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+  return static_cast<Grid_Generator_System::const_iterator>(sys.begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+  return static_cast<Grid_Generator_System::const_iterator>(sys.end());
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+  return sys[k];
+}
+
+inline bool
+Grid_Generator_System::has_no_rows() const {
+  return sys.has_no_rows();
+}
+
+inline void
+Grid_Generator_System::remove_trailing_rows(dimension_type n) {
+  sys.remove_trailing_rows(n);
+}
+
+inline void
+Grid_Generator_System::insert_verbatim(const Grid_Generator& g) {
+  sys.insert(g);
+}
+
+inline Topology
+Grid_Generator_System::topology() const {
+  return sys.topology();
+}
+
+inline dimension_type
+Grid_Generator_System::first_pending_row() const {
+  return sys.first_pending_row();
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+           const Grid_Generator_System& y) {
+  return x.is_equal_to(y);
+}
+
+/*! \relates Grid_Generator_System */
+inline void
+swap(Grid_Generator_System& x, Grid_Generator_System& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Generator_System_inlines_hh)
diff --git a/src/Grid_Generator_System_types.hh b/src/Grid_Generator_System_types.hh
new file mode 100644
index 0000000..3c5dff7
--- /dev/null
+++ b/src/Grid_Generator_System_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Generator_System_types_hh
+#define PPL_Grid_Generator_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+#endif // !defined(PPL_Grid_Generator_System_types_hh)
diff --git a/src/Grid_Generator_defs.hh b/src/Grid_Generator_defs.hh
new file mode 100644
index 0000000..d3b03ea
--- /dev/null
+++ b/src/Grid_Generator_defs.hh
@@ -0,0 +1,796 @@
+/* Grid_Generator class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_defs_hh
+#define PPL_Grid_Generator_defs_hh 1
+
+#include "Grid_Generator_types.hh"
+#include "Grid_types.hh"
+
+#include "Variables_Set_types.hh"
+#include "Grid_Generator_System_types.hh"
+#include "Linear_System_types.hh"
+
+#include "Coefficient_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Topology_types.hh"
+#include "Expression_Hide_Inhomo_defs.hh"
+#include "Expression_Hide_Last_defs.hh"
+
+#include "Grid_types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Grid_Generator
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Grid_Generator& x, const Grid_Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator */
+void swap(Grid_Generator& x, Grid_Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid_Generator is one of the following:
+
+  - a grid_line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a parameter
+    \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a grid_point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for grid_points and parameters, \f$d > 0\f$ is the divisor.
+
+  \par How to build a grid generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>grid_line</CODE>, <CODE>parameter</CODE>
+  or <CODE>grid_point</CODE>) to a linear expression;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining grid points and parameters, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a grid line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Grid_Generator l = grid_line(x - y - z);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator l = grid_line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds the parameter as the vector
+  \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+  which has the same direction as the line in Example 1:
+  \code
+  Grid_Generator q = parameter(x - y - z);
+  \endcode
+  Note that, unlike lines, for parameters, the length as well
+  as the direction of the vector represented by the code is significant.
+  Thus \p q is \e not the same as the parameter \p q1 defined by
+  \code
+  Grid_Generator q1 = parameter(2x - 2y - 2z);
+  \endcode
+  By definition, the origin of the space is not a parameter, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator q = parameter(0*x);
+  \endcode
+
+  \par Example 3
+  The following code builds the grid point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Grid_Generator p = grid_point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+  Grid_Generator origin3_alt = grid_point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Grid_Generator origin2 = grid_point(0*y);
+  \endcode
+  The following two lines of code both define the only grid point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Grid_Generator origin0 = Generator::zero_dim_point();
+  Grid_Generator origin0_alt = grid_point();
+  \endcode
+
+  \par Example 4
+  The grid point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>grid_point</CODE> (the divisor):
+  \code
+  Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be used to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the grid point
+  \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Parameters, like grid points can have a divisor.
+  For instance, the parameter
+  \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+  \code
+  Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+  \endcode
+  Also, the divisor can be used to specify
+  parameters having some non-integer (but rational) coordinates.
+  For instance, the parameter
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be defined:
+  \code
+  Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par How to inspect a grid generator
+  Several methods are provided to examine a grid generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients and the value of the denominator.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a grid generator.
+  If <CODE>g1</CODE> is a grid point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the parameter <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Grid point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Grid_Generator g2 = parameter(e, g1.divisor());
+    cout << "Parameter g2: " << g2 << endl;
+  }
+  else
+    cout << "Grid generator g1 is not a grid point." << endl;
+  \endcode
+  Therefore, for the grid point
+  \code
+  Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Grid point g1: p((2*A - B + 3*C)/2)
+  Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with grid points and parameters, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator {
+public:
+
+  //! The possible kinds of Grid_Generator objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+  //! The representation used for new Grid_Generators.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Grid_Generator grid_line(const Linear_Expression& e,
+                                  Representation r = default_representation);
+
+  //! Returns the parameter of direction \p e and size \p e/d, with the same
+  //! representation as e.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator parameter(const Linear_Expression& e
+                                  = Linear_Expression::zero(),
+                                  Coefficient_traits::const_reference d
+                                  = Coefficient_one(),
+                                  Representation r = default_representation);
+
+  // TODO: Improve the documentation of this method.
+  //! Returns the parameter of direction and size \p Linear_Expression::zero() .
+  static Grid_Generator parameter(Representation r);
+
+  //! Returns the parameter of direction and size \p e .
+  static Grid_Generator parameter(const Linear_Expression& e,
+                                  Representation r);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator grid_point(const Linear_Expression& e
+                                   = Linear_Expression::zero(),
+                                   Coefficient_traits::const_reference d
+                                   = Coefficient_one(),
+                                   Representation r = default_representation);
+
+  //! Returns the point at \p e .
+  static Grid_Generator grid_point(Representation r);
+
+  //! Returns the point at \p e .
+  static Grid_Generator grid_point(const Linear_Expression& e,
+                                   Representation r);
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  explicit Grid_Generator(Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  //! The new Grid_Generator will have the same representation as g.
+  Grid_Generator(const Grid_Generator& g);
+
+  //! Copy constructor with specified representation.
+  Grid_Generator(const Grid_Generator& g, Representation r);
+
+  //! Copy constructor with specified space dimension.
+  //! The new Grid_Generator will have the same representation as g.
+  Grid_Generator(const Grid_Generator& g, dimension_type space_dim);
+
+  //! Copy constructor with specified space dimension and representation.
+  Grid_Generator(const Grid_Generator& g, dimension_type space_dim,
+                 Representation r);
+
+  //! Destructor.
+  ~Grid_Generator();
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Grid_Generator& g);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Grid_Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the grid generator.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+
+    Always returns \p true. The return value is needed for compatibility with
+    the Generator class.
+  */
+  bool remove_space_dimensions(const Variables_Set& vars);
+
+  //! Permutes the space dimensions of the grid generator.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a grid line. */
+    LINE,
+    /*! The generator is a parameter. */
+    PARAMETER,
+    /*! The generator is a grid point. */
+    POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+  bool is_parameter() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a line or
+    a parameter.
+  */
+  bool is_line_or_parameter() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row represents a
+    parameter or a point.
+  */
+  bool is_parameter_or_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Grid_Generator& zero_dim_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Grid_Generator& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  /*!
+    This is faster than is_equivalent_to(), but it may return `false' even
+    for equivalent generators.
+  */
+  bool is_equal_to(const Grid_Generator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous terms
+    of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Grid_Generator& y);
+
+  /*! \brief
+    Scales \p *this to be represented with a divisor of \p d (if
+    \*this is a parameter or point). Does nothing at all on lines.
+
+    It is assumed that \p d is a multiple of the current divisor
+    and different from zero. The behavior is undefined if the assumption
+    does not hold.
+  */
+  void scale_to_divisor(Coefficient_traits::const_reference d);
+
+  //! Sets the divisor of \p *this to \p d.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  void set_divisor(Coefficient_traits::const_reference d);
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+  expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+private:
+  Linear_Expression expr;
+
+  Kind kind_;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Grid_Generator* zero_dim_point_p;
+
+  //! Constructs a Grid_Generator with the specified space dimension, kind
+  //! and topology.
+  Grid_Generator(dimension_type space_dim, Kind kind, Topology topology,
+                 Representation r = default_representation);
+
+  // TODO: Avoid reducing the space dimension.
+  /*! \brief
+    Constructs a grid generator of type \p t from linear expression \p e,
+    stealing the underlying data structures from \p e.
+
+    The last column in \p e becomes the parameter divisor column of
+    the new Grid_Generator.
+
+    \note The new Grid_Generator will have the same representation as `e'.
+  */
+  Grid_Generator(Linear_Expression& e, Type t);
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid objects.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p gg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+                             const Grid_Generator& gg) const;
+
+  /*! \brief
+    A print function, with fancy, more human-friendly output.
+
+    This is used by operator<<().
+  */
+  void fancy_print(std::ostream& s) const;
+
+  //! Converts the Grid_Generator into a parameter.
+  void set_is_parameter();
+
+  //! Sets the Grid_Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Grid_Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_parameter_or_point();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+
+  //! Sets to \p x the topological kind of \p *this row.
+  void set_topology(Topology x);
+
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+  //@} // Flags coercion methods
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Grid_Generator objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Grid_Generator::normalize() and Grid_Generator::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+  /*!
+    \param y
+    The Grid_Generator that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting Grid_Generator to \p *this and normalizes it.
+  */
+  void linear_combine(const Grid_Generator& y, dimension_type i);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* name_var,
+                               const Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend std::ostream&
+  IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+
+  friend int
+  compare(const Grid_Generator& x, const Grid_Generator& y);
+
+  friend class Expression_Adapter<Grid_Generator>;
+  friend class Grid_Generator_System;
+  friend class Grid;
+  friend class Linear_System<Grid_Generator>;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::grid_line(const Linear_Expression& e, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+grid_line(const Linear_Expression& e,
+          Representation r = Grid_Generator::default_representation);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::parameter(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+          Coefficient_traits::const_reference d = Coefficient_one(),
+          Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::parameter(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(Representation r);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::parameter(const Linear_Expression& e, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e, Representation r);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::grid_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+           Coefficient_traits::const_reference d = Coefficient_one(),
+           Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::grid_point(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(Representation r);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::grid_point(const Linear_Expression& e, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Grid_Generator_inlines.hh"
+
+#endif // !defined(PPL_Grid_Generator_defs_hh)
diff --git a/src/Grid_Generator_inlines.hh b/src/Grid_Generator_inlines.hh
new file mode 100644
index 0000000..2d7b6bb
--- /dev/null
+++ b/src/Grid_Generator_inlines.hh
@@ -0,0 +1,369 @@
+/* Grid Generator class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Generator_inlines_hh
+#define PPL_Grid_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid_Generator::is_necessarily_closed() const {
+  return true;
+}
+
+inline bool
+Grid_Generator::is_not_necessarily_closed() const {
+  return false;
+}
+
+inline bool
+Grid_Generator::is_line_or_equality() const {
+  return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Grid_Generator::is_ray_or_point_or_inequality() const {
+  return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Grid_Generator::topology() const {
+  return NECESSARILY_CLOSED;
+}
+
+inline void
+Grid_Generator::set_is_line_or_equality() {
+  kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Grid_Generator::set_is_ray_or_point_or_inequality() {
+  kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Grid_Generator::set_topology(Topology x) {
+  PPL_USED(x);
+  PPL_ASSERT(x == NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Grid_Generator::Grid_Generator(Linear_Expression& e, Type type) {
+  swap(expr, e);
+  if (type == LINE)
+    kind_ = LINE_OR_EQUALITY;
+  else
+    kind_ = RAY_OR_POINT_OR_INEQUALITY;
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(Representation r)
+  : expr(Coefficient_one(), r),
+    kind_(RAY_OR_POINT_OR_INEQUALITY) {
+  expr.set_space_dimension(1);
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g)
+  : expr(g.expr),
+    kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g, Representation r)
+  : expr(g.expr, r),
+    kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(dimension_type space_dim, Kind kind,
+                               Topology topology, Representation r)
+  : expr(r),
+    kind_(kind) {
+  PPL_USED(topology);
+  PPL_ASSERT(topology == NECESSARILY_CLOSED);
+  expr.set_space_dimension(space_dim + 1);
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+                               dimension_type space_dim)
+  : expr(g.expr, space_dim + 1),
+    kind_(g.kind_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+                               dimension_type space_dim, Representation r)
+  : expr(g.expr, space_dim + 1, r),
+    kind_(g.kind_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::~Grid_Generator() {
+}
+
+inline Grid_Generator::expr_type
+Grid_Generator::expression() const {
+  return expr_type(expr, true);
+}
+
+inline Representation
+Grid_Generator::representation() const {
+  return expr.representation();
+}
+
+inline void
+Grid_Generator::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator::max_space_dimension() {
+  return Linear_Expression::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+  return expression().space_dimension();
+}
+
+inline void
+Grid_Generator::set_space_dimension(dimension_type space_dim) {
+  const dimension_type old_space_dim = space_dimension();
+  if (space_dim > old_space_dim) {
+    expr.set_space_dimension(space_dim + 1);
+    expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+  }
+  else {
+    expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+    expr.set_space_dimension(space_dim + 1);
+  }
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline void
+Grid_Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+  set_space_dimension(space_dim);
+}
+
+inline void
+Grid_Generator::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+  if (is_line())
+    return LINE;
+  return is_point() ? POINT : PARAMETER;
+}
+
+inline bool
+Grid_Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+  return is_parameter_or_point() && is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+  return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Grid_Generator::is_point() const {
+  return !is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_divisor(Coefficient_traits::const_reference d) {
+  PPL_ASSERT(!is_line());
+  if (is_line_or_parameter())
+    expr.set_coefficient(Variable(space_dimension()), d);
+  else
+    expr.set_inhomogeneous_term(d);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return expr.coefficient(Variable(space_dimension()));
+  else
+    return expr.inhomogeneous_term();
+}
+
+inline bool
+Grid_Generator::is_equal_at_dimension(dimension_type dim,
+                                      const Grid_Generator& y) const {
+  const Grid_Generator& x = *this;
+  return x.expr.get(dim) * y.divisor() == y.expr.get(dim) * x.divisor();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+  Grid_Generator tmp = g;
+  swap(*this, tmp);
+
+  return *this;
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes();
+}
+
+inline const Grid_Generator&
+Grid_Generator::zero_dim_point() {
+  PPL_ASSERT(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+  PPL_ASSERT(!is_parameter());
+  expr.normalize();
+  sign_normalize();
+}
+
+inline void
+Grid_Generator::m_swap(Grid_Generator& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(kind_, y.kind_);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+  return !(x == y);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e, Representation r) {
+  return Grid_Generator::grid_line(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+          Coefficient_traits::const_reference d, Representation r) {
+  return Grid_Generator::parameter(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(Representation r) {
+  return Grid_Generator::parameter(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e, Representation r) {
+  return Grid_Generator::parameter(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+           Coefficient_traits::const_reference d, Representation r) {
+  return Grid_Generator::grid_point(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(Representation r) {
+  return Grid_Generator::grid_point(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e, Representation r) {
+  return Grid_Generator::grid_point(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline void
+swap(Grid_Generator& x, Grid_Generator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_Generator_inlines_hh)
diff --git a/src/Grid_Generator_types.hh b/src/Grid_Generator_types.hh
new file mode 100644
index 0000000..e7a86ad
--- /dev/null
+++ b/src/Grid_Generator_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_Generator_types_hh
+#define PPL_Grid_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+#endif // !defined(PPL_Grid_Generator_types_hh)
diff --git a/src/Grid_Status.cc b/src/Grid_Status.cc
new file mode 100644
index 0000000..63b5edb
--- /dev/null
+++ b/src/Grid_Status.cc
@@ -0,0 +1,245 @@
+/* Grid::Status class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* zero_dim_univ = "ZE";
+const char* empty = "EM";
+const char* consys_min = "CM";
+const char* gensys_min = "GM";
+const char* consys_upd = "CS";
+const char* gensys_upd = "GS";
+const char* satc_upd = "SC";
+const char* satg_upd = "SG";
+const char* consys_pending = "CP";
+const char* gensys_pending = "GP";
+
+/*! \relates Parma_Polyhedra_Library::Grid::Status
+  Reads a keyword and its associated on/off, +/- flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+bool
+get_field(std::istream& s, const char* keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != '+' && str[0] != '-')
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == '+');
+  return true;
+}
+
+} // namespace
+
+void
+PPL::Grid::Status::ascii_dump(std::ostream& s) const {
+  s << (test_zero_dim_univ() ? '+' : '-') << zero_dim_univ << ' '
+    << (test_empty() ? '+' : '-') << empty << ' '
+    << ' '
+    << (test_c_minimized() ? '+' : '-') << consys_min << ' '
+    << (test_g_minimized() ? '+' : '-') << gensys_min << ' '
+    << ' '
+    << (test_c_up_to_date() ? '+' : '-') << consys_upd << ' '
+    << (test_g_up_to_date() ? '+' : '-') << gensys_upd << ' '
+    << ' '
+    << (test_c_pending() ? '+' : '-') << consys_pending << ' '
+    << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
+    << ' '
+    << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
+    << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd
+    << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Grid::Status)
+
+bool
+PPL::Grid::Status::ascii_load(std::istream& s) {
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, consys_min, positive))
+    return false;
+  if (positive)
+    set_c_minimized();
+  else
+    reset_c_minimized();
+
+  if (!get_field(s, gensys_min, positive))
+    return false;
+  if (positive)
+    set_g_minimized();
+  else
+    reset_g_minimized();
+
+  if (!get_field(s, consys_upd, positive))
+    return false;
+  if (positive)
+    set_c_up_to_date();
+  else
+    reset_c_up_to_date();
+
+  if (!get_field(s, gensys_upd, positive))
+    return false;
+  if (positive)
+    set_g_up_to_date();
+  else
+    reset_g_up_to_date();
+
+  if (!get_field(s, consys_pending, positive))
+    return false;
+  if (positive)
+    set_c_pending();
+  else
+    reset_c_pending();
+
+  if (!get_field(s, gensys_pending, positive))
+    return false;
+  if (positive)
+    set_g_pending();
+  else
+    reset_g_pending();
+
+  if (!get_field(s, satc_upd, positive))
+    return false;
+  if (positive)
+    set_sat_c_up_to_date();
+  else
+    reset_sat_c_up_to_date();
+
+  if (!get_field(s, satg_upd, positive))
+    return false;
+  if (positive)
+    set_sat_g_up_to_date();
+  else
+    reset_sat_g_up_to_date();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+bool
+PPL::Grid::Status::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+#ifndef NDEBUG
+    cerr << "The empty flag is incompatible with any other one."
+         << endl << "Flags:" << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if ((test_sat_c_up_to_date() || test_sat_g_up_to_date())
+      && !(test_c_up_to_date() && test_g_up_to_date())) {
+#ifndef NDEBUG
+    cerr <<
+      "If a saturation matrix is up-to-date, congruences and\n"
+      "generators have to be both up-to-date."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_minimized() && !test_c_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If congruences are minimized they must be up-to-date."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_g_minimized() && !test_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If generators are minimized they must be up-to-date."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() && test_g_pending()) {
+#ifndef NDEBUG
+    cerr << "There cannot be both pending congruences and pending generators."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() || test_g_pending()) {
+    if (!test_c_minimized() || !test_g_minimized()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending congruences or generators, congruences\n"
+      "and generators must be minimized."
+         << endl;
+#endif
+      return false;
+    }
+
+    if (!test_sat_c_up_to_date() && !test_sat_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending congruences or generators, there must\n"
+      "be at least a saturation matrix up-to-date."
+         << endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
diff --git a/src/Grid_Status_idefs.hh b/src/Grid_Status_idefs.hh
new file mode 100644
index 0000000..cb4ea19
--- /dev/null
+++ b/src/Grid_Status_idefs.hh
@@ -0,0 +1,168 @@
+/* Grid::Status class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Status_idefs_hh
+#define PPL_Grid_Status_idefs_hh 1
+
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status_idefs.hh directly; use Grid_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a grid.
+/*!
+  The assertions supported that are in use are:
+  - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the grid is the empty set;
+  - <EM>congruences up-to-date</EM>: the grid is correctly
+    characterized by the attached system of congruences, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the grid is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending congruences;
+  - <EM>congruences minimized</EM>: the non-pending part of the system
+    of congruences attached to the grid is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the grid is in minimal form.
+
+  Other supported assertions are:
+  - <EM>congruences pending</EM>
+  - <EM>generators pending</EM>
+  - <EM>congruences' saturation matrix up-to-date</EM>
+  - <EM>generators' saturation matrix up-to-date</EM>.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>congruences pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>congruences' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bitmasks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Grid_Status_idefs_hh)
diff --git a/src/Grid_Status_inlines.hh b/src/Grid_Status_inlines.hh
new file mode 100644
index 0000000..0b031ae
--- /dev/null
+++ b/src/Grid_Status_inlines.hh
@@ -0,0 +1,217 @@
+/* Grid::Status class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_Status_inlines_hh
+#define PPL_Grid_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Grid::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+inline void
+Grid::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Grid::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Grid::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Grid::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Grid::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Grid::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Grid::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Grid::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Grid::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Grid::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Grid::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Grid::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Grid::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Grid::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Status_inlines_hh)
diff --git a/src/Grid_chdims.cc b/src/Grid_chdims.cc
new file mode 100644
index 0000000..6147549
--- /dev/null
+++ b/src/Grid_chdims.cc
@@ -0,0 +1,477 @@
+/* Grid class implementation
+   (non-inline operators that may change the dimension of the vector space).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "assert.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// Used for add_space_dimensions_and_embed.
+void
+PPL::Grid::add_space_dimensions(Congruence_System& cgs,
+                                Grid_Generator_System& gs,
+                                const dimension_type dims) {
+  PPL_ASSERT(cgs.space_dimension() == gs.space_dimension());
+  PPL_ASSERT(dims > 0);
+
+  const dimension_type old_modulus_index = cgs.space_dimension() + 1;
+  cgs.set_space_dimension(space_dimension() + dims);
+
+  if (congruences_are_minimized() || generators_are_minimized())
+    dim_kinds.resize(old_modulus_index + dims, CON_VIRTUAL /* a.k.a. LINE */);
+
+  gs.add_universe_rows_and_columns(dims);
+}
+
+// Used for add_space_dimensions_and_project.
+void
+PPL::Grid::add_space_dimensions(Grid_Generator_System& gs,
+                                Congruence_System& cgs,
+                                const dimension_type dims) {
+  PPL_ASSERT(cgs.space_dimension() == gs.space_dimension());
+  PPL_ASSERT(dims > 0);
+
+  cgs.add_unit_rows_and_space_dimensions(dims);
+
+  // Add `dims' zero columns onto gs.
+  gs.set_space_dimension(space_dim + dims);
+
+  normalize_divisors(gs);
+
+  dim_kinds.resize(cgs.space_dimension() + 1, EQUALITY /* a.k.a GEN_VIRTUAL */);
+}
+
+// (o is a point)       y
+//
+//                      |   |   |
+//                 =>   |   |   |
+//                      |   |   |
+// o---o---o-- x        |---|---|-- x
+// 0 1 2 3 4 5          0 1 2 3 4 5
+//     R^1                   R^2
+void
+PPL::Grid::add_space_dimensions_and_embed(dimension_type m) {
+  if (m == 0)
+    return;
+
+  // The space dimension of the resulting grid must be at most the
+  // maximum allowed space dimension.
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Grid::",
+                                 "add_space_dimensions_and_embed(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+
+  // Adding dimensions to an empty grid is obtained by adjusting
+  // `space_dim' and clearing `con_sys' (since it can contain the
+  // integrality congruence of the current dimension).
+  if (marked_empty()) {
+    space_dim += m;
+    set_empty();
+    return;
+  }
+
+  // The case of a zero-dimension space grid.
+  if (space_dim == 0) {
+    // Since it is not empty, it has to be the universe grid.
+    PPL_ASSERT(status.test_zero_dim_univ());
+    // Swap *this with a newly created `m'-dimensional universe grid.
+    Grid gr(m, UNIVERSE);
+    m_swap(gr);
+    return;
+  }
+
+  // To embed an n-dimension space grid in a (n+m)-dimension space, we
+  // add `m' zero-columns to the rows in the system of congruences; in
+  // contrast, the system of generators needs additional rows,
+  // corresponding to the vectors of the canonical basis for the added
+  // dimensions. That is, for each new dimension we add the line
+  // having that direction. This is done by invoking the function
+  // add_space_dimensions().
+  if (congruences_are_up_to_date())
+    if (generators_are_up_to_date())
+      // Adds rows and/or columns to both matrices.
+      add_space_dimensions(con_sys, gen_sys, m);
+    else {
+      // Only congruences are up-to-date, so modify only them.
+      con_sys.set_space_dimension(con_sys.space_dimension() + m);
+      if (congruences_are_minimized())
+        dim_kinds.resize(con_sys.space_dimension() + 1, CON_VIRTUAL);
+    }
+  else {
+    // Only generators are up-to-date, so modify only them.
+    PPL_ASSERT(generators_are_up_to_date());
+    gen_sys.add_universe_rows_and_columns(m);
+    if (generators_are_minimized())
+      dim_kinds.resize(gen_sys.space_dimension() + 1, LINE);
+  }
+  // Update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // congruences may be unsatisfiable.
+  PPL_ASSERT(OK());
+}
+
+// (o is a point)       y
+//
+//
+//                 =>
+//
+// o---o---o-- x        o---o---o-- x
+// 0 1 2 3 4 5          0 1 2 3 4 5
+//     R^1                   R^2
+void
+PPL::Grid::add_space_dimensions_and_project(dimension_type m) {
+  if (m == 0)
+    return;
+
+  // The space dimension of the resulting grid should be at most the
+  // maximum allowed space dimension.
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Grid::",
+                                 "add_space_dimensions_and_project(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+
+  // Adding dimensions to an empty grid is obtained by merely
+  // adjusting `space_dim'.
+  if (marked_empty()) {
+    space_dim += m;
+    set_empty();
+    return;
+  }
+
+  if (space_dim == 0) {
+    PPL_ASSERT(status.test_zero_dim_univ());
+    // Swap *this with a newly created `n'-dimensional universe grid.
+    Grid gr(m, UNIVERSE);
+    m_swap(gr);
+    return;
+  }
+
+  // To project an n-dimension space grid in a (n+m)-dimension space,
+  // we just add to the system of generators `m' zero-columns; in
+  // contrast, in the system of congruences, new rows are needed in
+  // order to avoid embedding the old grid in the new space.  Thus,
+  // for each new dimensions `x[k]', we add the constraint x[k] = 0;
+  // this is done by invoking the function add_space_dimensions()
+  // giving the system of constraints as the second argument.
+  if (congruences_are_up_to_date())
+    if (generators_are_up_to_date())
+      // Add rows and/or columns to both matrices.
+      add_space_dimensions(gen_sys, con_sys, m);
+    else {
+      // Only congruences are up-to-date so modify only them.
+      con_sys.add_unit_rows_and_space_dimensions(m);
+      if (congruences_are_minimized())
+        dim_kinds.resize(con_sys.space_dimension() + 1, EQUALITY);
+    }
+  else {
+    // Only generators are up-to-date so modify only them.
+    PPL_ASSERT(generators_are_up_to_date());
+
+    // Add m zero columns onto gs.
+    gen_sys.set_space_dimension(space_dim + m);
+
+    normalize_divisors(gen_sys);
+
+    if (generators_are_minimized())
+      dim_kinds.resize(gen_sys.space_dimension() + 1, EQUALITY);
+  }
+  // Now update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // congruences may be unsatisfiable.
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::concatenate_assign(const Grid& y) {
+  // The space dimension of the resulting grid must be at most the
+  // maximum allowed space dimension.
+  check_space_dimension_overflow(y.space_dimension(),
+                                 max_space_dimension() - space_dimension(),
+                                 "PPL::Grid::",
+                                 "concatenate_assign(y)",
+                                 "concatenation exceeds the maximum "
+                                 "allowed space dimension");
+
+  const dimension_type added_columns = y.space_dim;
+
+  // If `*this' or `y' are empty grids just adjust the space
+  // dimension.
+  if (marked_empty() || y.marked_empty()) {
+    space_dim += added_columns;
+    set_empty();
+    return;
+  }
+
+  // If `y' is a universe 0-dim grid, the result is `*this'.
+  if (added_columns == 0)
+    return;
+
+  // If `*this' is a universe 0-dim space grid, the result is `y'.
+  if (space_dim == 0) {
+    *this = y;
+    return;
+  }
+
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  con_sys.concatenate(y.congruences());
+
+  space_dim += added_columns;
+
+  clear_congruences_minimized();
+  clear_generators_up_to_date();
+
+  // Check that the system is OK, taking into account that the system
+  // of congruences may now be empty.
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any grid is a no-op.  This case
+  // also captures the only legal removal of dimensions from a grid in
+  // a 0-dim space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - vars.size();
+
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Update the space dimension.
+    space_dim = new_space_dim;
+    set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Removing _all_ dimensions from a non-empty grid obtains the
+  // zero-dimensional universe grid.
+  if (new_space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  gen_sys.remove_space_dimensions(vars);
+
+  clear_congruences_up_to_date();
+  clear_generators_minimized();
+
+  // Update the space dimension.
+  space_dim = new_space_dim;
+
+  PPL_ASSERT(OK(true));
+}
+
+void
+PPL::Grid::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+                                 new_dimension);
+
+  // The removal of no dimensions from any grid is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a grid in a 0-dim space.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (is_empty()) {
+    // Removing dimensions from the empty grid just updates the space
+    // dimension.
+    space_dim = new_dimension;
+    set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (new_dimension == 0) {
+    // Removing all dimensions from a non-empty grid just returns the
+    // zero-dimensional universe grid.
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Favor the generators, as is done by is_empty().
+  if (generators_are_up_to_date()) {
+    gen_sys.set_space_dimension(new_dimension);
+    if (generators_are_minimized()) {
+      // Count the actual number of rows that are now redundant.
+      dimension_type num_redundant = 0;
+      const dimension_type num_old_gs = space_dim - new_dimension;
+      for (dimension_type row = 0; row < num_old_gs; ++row) {
+        if (dim_kinds[row] != GEN_VIRTUAL)
+          ++num_redundant;
+      }
+      if (num_redundant > 0) {
+        // Chop zero rows from end of system, to keep minimal form.
+        gen_sys.remove_trailing_rows(num_redundant);
+        gen_sys.unset_pending_rows();
+      }
+      dim_kinds.resize(new_dimension + 1);
+      // TODO: Consider if it is worth also preserving the congruences
+      //       if they are also in minimal form.
+    }
+    clear_congruences_up_to_date();
+    // Extend the zero dim false congruence system to the appropriate
+    // dimension and then swap it with `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_false());
+    // Extra 2 columns for inhomogeneous term and modulus.
+    cgs.set_space_dimension(new_dimension + 2);
+    swap(con_sys, cgs);
+  }
+  else {
+    PPL_ASSERT(congruences_are_minimized());
+    con_sys.set_space_dimension(new_dimension);
+    // Count the actual number of rows that are now redundant.
+    dimension_type num_redundant = 0;
+    for (dimension_type row = space_dim; row > new_dimension; --row) {
+      if (dim_kinds[row] != CON_VIRTUAL)
+        ++num_redundant;
+    }
+
+    con_sys.remove_rows(0, num_redundant, true);
+    dim_kinds.erase(dim_kinds.begin() + (new_dimension + 1),
+                    dim_kinds.end());
+
+    clear_generators_up_to_date();
+    // Replace gen_sys with an empty system of the right dimension.
+    // Extra 2 columns for inhomogeneous term and modulus.
+    Grid_Generator_System gs(new_dimension + 2);
+    gen_sys.m_swap(gs);
+  }
+
+  // Update the space dimension.
+  space_dim = new_dimension;
+
+  PPL_ASSERT(OK(true));
+}
+
+void
+PPL::Grid::expand_space_dimension(Variable var, dimension_type m) {
+  // `var' must be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // Adding 0 dimensions leaves the same grid.
+  if (m == 0)
+    return;
+
+  // The resulting space dimension must be at most the maximum.
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Grid::",
+                                 "expand_space_dimension(v, m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+
+  // Save the number of dimensions before adding new ones.
+  const dimension_type old_dim = space_dim;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  const Congruence_System& cgs = congruences();
+  Congruence_System new_congruences;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i) {
+    const Congruence& cg = *i;
+
+    Coefficient_traits::const_reference coeff = cg.coefficient(var);
+
+    // Only consider congruences that constrain `var'.
+    if (coeff == 0)
+      continue;
+
+    Congruence cg_copy = cg;
+    cg_copy.expr.set_coefficient(var, Coefficient_zero());
+
+    // Each relevant congruence results in `m' new congruences.
+    for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+      Congruence x = cg_copy;
+      add_mul_assign(x.expr, coeff, Variable(dst_d));
+      new_congruences.insert_verbatim(x, Recycle_Input());
+    }
+  }
+  add_recycled_congruences(new_congruences);
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::fold_space_dimensions(const Variables_Set& vars, Variable dest) {
+  // TODO: this implementation is _really_ an executable specification.
+
+  // `dest' should be one of the dimensions of the grid.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+  // Folding only has effect if dimensions are given.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' must be dimensions of the grid.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 "vs.space_dimension()",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' must not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+  // All of the affine images we are going to compute are not invertible,
+  // hence we will need to compute the grid generators of the polyhedron.
+  // Since we keep taking copies, make sure that a single conversion
+  // from congruences to grid generators is computed.
+  (void) grid_generators();
+  // Having grid generators, we now know if the grid is empty:
+  // in that case, folding is equivalent to just removing space dimensions.
+  if (!marked_empty()) {
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vs_end = vars.end(); i != vs_end; ++i) {
+      Grid copy = *this;
+      copy.affine_image(dest, Linear_Expression(Variable(*i)));
+      upper_bound_assign(copy);
+    }
+  }
+  remove_space_dimensions(vars);
+  PPL_ASSERT(OK());
+}
diff --git a/src/Grid_conversion.cc b/src/Grid_conversion.cc
new file mode 100644
index 0000000..90e2449
--- /dev/null
+++ b/src/Grid_conversion.cc
@@ -0,0 +1,511 @@
+/* Grid class implementation: conversion().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+// X 0 0 0  upside down, so  x x x X
+// x X 0 0                   x x X 0
+// x x X 0                   x X 0 0
+// x x x X                   X 0 0 0
+//
+// Where X is greater than zero and x is an integer.
+bool
+Grid::lower_triangular(const Congruence_System& sys,
+                       const Dimension_Kinds& dim_kinds) {
+  const dimension_type num_columns = sys.space_dimension() + 1;
+
+  // Check for easy square failure case.
+  if (sys.num_rows() > num_columns)
+    return false;
+
+  // Check triangularity.
+
+  dimension_type row = 0;
+  for (dimension_type dim = num_columns; dim-- > 0; ) {
+    if (dim_kinds[dim] == CON_VIRTUAL)
+      continue;
+    const Congruence& cg = sys[row];
+    ++row;
+    // Check diagonal.
+    if (cg.expr.get(dim) <= 0)
+      return false;
+    if (!cg.expr.all_zeroes(dim + 1, num_columns))
+      return false;
+  }
+
+  // Check squareness.
+  return row == sys.num_rows();
+}
+
+// X x x x
+// 0 X x x
+// 0 0 X x
+// 0 0 0 X
+//
+// Where X is greater than zero and x is an integer.
+bool
+Grid::upper_triangular(const Grid_Generator_System& sys,
+                       const Dimension_Kinds& dim_kinds) {
+  dimension_type num_columns = sys.space_dimension() + 1;
+  dimension_type row = sys.num_rows();
+
+  // Check for easy square fail case.
+  if (row > num_columns)
+    return false;
+
+  // Check triangularity.
+  while (num_columns > 0) {
+    --num_columns;
+    if (dim_kinds[num_columns] == GEN_VIRTUAL)
+      continue;
+    const Grid_Generator& gen = sys[--row];
+    // Check diagonal.
+    if (gen.expr.get(num_columns) <= 0)
+      return false;
+    // Check elements preceding diagonal.
+    if (!gen.expr.all_zeroes(0, num_columns))
+      return false;
+  }
+
+  // Check for squareness.
+  return num_columns == row;
+}
+
+void
+Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+                    Swapping_Vector<Grid_Generator>& dest_rows,
+                    const dimension_type num_rows) {
+  if (multiplier == 1)
+    return;
+
+  if (gen.is_line()) {
+    // Multiply every element of the line.
+    gen.expr *= multiplier;
+  }
+  else {
+    PPL_ASSERT(gen.is_parameter_or_point());
+    // Multiply every element of every parameter.
+
+    for (dimension_type index = num_rows; index-- > 0; ) {
+      Grid_Generator& generator = dest_rows[index];
+      if (generator.is_parameter_or_point())
+        generator.expr *= multiplier;
+    }
+  }
+}
+
+void
+Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg,
+                    Swapping_Vector<Congruence>& dest,
+                    const dimension_type num_rows) {
+  if (multiplier == 1)
+    return;
+
+  if (cg.is_proper_congruence()) {
+    // Multiply every element of every congruence.
+    for (dimension_type index = num_rows; index-- > 0; ) {
+      Congruence& congruence = dest[index];
+      if (congruence.is_proper_congruence())
+        congruence.scale(multiplier);
+    }
+  }
+  else {
+    PPL_ASSERT(cg.is_equality());
+    // Multiply every element of the equality.
+    cg.scale(multiplier);
+  }
+}
+
+// TODO: Rename the next two methods to convert and this file to
+//       Grid_convert.cc (and equivalently for Polyhedron) to use
+//       verbs consistently as function and method names.
+
+void
+Grid::conversion(Grid_Generator_System& source, Congruence_System& dest,
+                 Dimension_Kinds& dim_kinds) {
+  // Quite similar to the congruence to generator version below.
+  // Changes here may be needed there too.
+
+  PPL_ASSERT(upper_triangular(source, dim_kinds));
+
+  // Initialize matrix row number counters and compute the LCM of the
+  // diagonal entries of the parameters in `source'.
+  //
+  // The top-down order of the generator system rows corresponds to
+  // the left-right order of the dimensions, while the congruence
+  // system rows have a bottom-up ordering.
+  dimension_type dest_num_rows = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(diagonal_lcm);
+  diagonal_lcm = 1;
+  const dimension_type dims = source.space_dimension() + 1;
+  dimension_type source_index = source.num_rows();
+  for (dimension_type dim = dims; dim-- > 0; )
+    if (dim_kinds[dim] == GEN_VIRTUAL)
+      // Virtual generators map to equalities.
+      ++dest_num_rows;
+    else {
+      --source_index;
+      if (dim_kinds[dim] == PARAMETER) {
+        // Dimension `dim' has a parameter row at `source_index' in
+        // `source', so include in `diagonal_lcm' the `dim'th element
+        // of that row.
+        lcm_assign(diagonal_lcm, diagonal_lcm, source[source_index].expr.get(dim));
+        // Parameters map to proper congruences.
+        ++dest_num_rows;
+      }
+      // Lines map to virtual congruences.
+    }
+  PPL_ASSERT(source_index == 0);
+
+  // `source' must be regular.
+  PPL_ASSERT(diagonal_lcm != 0);
+
+  dest.clear();
+  dest.set_space_dimension(dims - 1);
+
+  // In `dest' initialize row types and elements, including setting
+  // the diagonal elements to the inverse ratio of the `source'
+  // diagonal elements.
+  source_index = source.num_rows();
+  for (dimension_type dim = dims; dim-- > 0; ) {
+    if (dim_kinds[dim] == LINE)
+      --source_index;
+    else {
+      Linear_Expression le;
+      le.set_space_dimension(dest.space_dimension());
+
+      if (dim_kinds[dim] == GEN_VIRTUAL) {
+        le.set(dim, Coefficient_one());
+        Congruence cg(le, Coefficient_zero(), Recycle_Input());
+        dest.insert_verbatim(cg, Recycle_Input());
+      }
+      else {
+        PPL_ASSERT(dim_kinds[dim] == PARAMETER);
+        --source_index;
+        PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+        exact_div_assign(tmp, diagonal_lcm,
+                         source[source_index].expr.get(dim));
+        le.set(dim, tmp);
+        Congruence cg(le, Coefficient_one(), Recycle_Input());
+        dest.insert_verbatim(cg, Recycle_Input());
+      }
+    }
+  }
+
+  PPL_ASSERT(source_index == 0);
+  PPL_ASSERT(lower_triangular(dest, dim_kinds));
+
+  // Convert.
+  //
+  // `source_index' and `dest_index' hold the positions of pivot rows
+  // in `source' and `dest'.  The order of the rows in `dest' is the
+  // reverse of the order in `source', so the rows are iterated from
+  // last to first (index 0) in `source' and from first to last in
+  // `dest'.
+  source_index = source.num_rows();
+  dimension_type dest_index = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(multiplier);
+
+  for (dimension_type dim = dims; dim-- > 0; ) {
+    if (dim_kinds[dim] != GEN_VIRTUAL) {
+      --source_index;
+      const Coefficient& source_dim = source[source_index].expr.get(dim);
+
+      // In the rows in `dest' above `dest_index' divide each element
+      // at column `dim' by `source_dim'.
+      for (dimension_type row = dest_index; row-- > 0; ) {
+        Congruence& cg = dest.rows[row];
+
+        // Multiply the representation of `dest' such that entry `dim'
+        // of `g' is a multiple of `source_dim'.  This ensures that
+        // the result of the division that follows is a whole number.
+        gcd_assign(multiplier, cg.expression().get(dim), source_dim);
+        exact_div_assign(multiplier, source_dim, multiplier);
+        multiply_grid(multiplier, cg, dest.rows, dest_num_rows);
+
+        cg.expr.exact_div_assign(source_dim, dim, dim + 1);
+      }
+    }
+
+    // Invert and transpose the source row at `source_index' into the
+    // destination row at `dest_index'.
+    //
+    // Consider each dimension `dim_prec' that precedes `dim', as the
+    // rows in `dest' that follow `dim_index' have zeroes at index
+    // `dim'.
+    dimension_type tmp_source_index = source_index;
+    if (dim_kinds[dim] != LINE)
+      ++dest_index;
+    for (dimension_type dim_prec = dim; dim_prec-- > 0; ) {
+      if (dim_kinds[dim_prec] != GEN_VIRTUAL) {
+        --tmp_source_index;
+        const Coefficient& source_dim = source[tmp_source_index].expr.get(dim);
+        
+        // In order to compute the transpose of the inverse of
+        // `source', subtract source[tmp_source_index][dim] times the
+        // column vector in `dest' at `dim' from the column vector in
+        // `dest' at `dim_prec'.
+        //
+        // I.e., for each row `dest_index' in `dest' that is above the
+        // row `dest_index', subtract dest[tmp_source_index][dim]
+        // times the entry `dim' from the entry at `dim_prec'.
+        PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+        for (dimension_type row = dest_index; row-- > 0; ) {
+          PPL_ASSERT(row < dest_num_rows);
+          Congruence& cg = dest.rows[row];
+          tmp = cg.expr.get(dim_prec);
+          sub_mul_assign(tmp, source_dim, cg.expression().get(dim));
+          cg.expr.set(dim_prec, tmp);
+        }
+      }
+    }
+  }
+  // Set the modulus in every congruence.
+  Coefficient_traits::const_reference modulus
+    = dest.rows[dest_num_rows - 1].inhomogeneous_term();
+  for (dimension_type row = dest_num_rows; row-- > 0; ) {
+    Congruence& cg = dest.rows[row];
+    if (cg.is_proper_congruence())
+      cg.set_modulus(modulus);
+  }
+
+  PPL_ASSERT(lower_triangular(dest, dim_kinds));
+
+  // Since we are reducing the system to "strong minimal form",
+  // reduce the coefficients in the congruence system
+  // using "diagonal" values.
+  for (dimension_type dim = dims, i = 0; dim-- > 0; )
+    if (dim_kinds[dim] != CON_VIRTUAL)
+      // Factor the "diagonal" congruence out of the preceding rows.
+      reduce_reduced<Congruence_System>
+        (dest.rows, dim, i++, 0, dim, dim_kinds, false);
+
+#ifndef NDEBUG
+  // Make sure that all the rows are now OK.
+  for (dimension_type i = dest.num_rows(); i-- > 0; )
+    PPL_ASSERT(dest[i].OK());
+#endif
+
+  PPL_ASSERT(dest.OK());
+}
+
+void
+Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
+                 Dimension_Kinds& dim_kinds) {
+  // Quite similar to the generator to congruence version above.
+  // Changes here may be needed there too.
+
+  PPL_ASSERT(lower_triangular(source, dim_kinds));
+
+  // Initialize matrix row number counters and compute the LCM of the
+  // diagonal entries of the proper congruences in `source'.
+  dimension_type source_num_rows = 0;
+  dimension_type dest_num_rows = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(diagonal_lcm);
+  diagonal_lcm = 1;
+  const dimension_type dims = source.space_dimension() + 1;
+  for (dimension_type dim = dims; dim-- > 0; )
+    if (dim_kinds[dim] == CON_VIRTUAL)
+      // Virtual congruences map to lines.
+      ++dest_num_rows;
+    else {
+      if (dim_kinds[dim] == PROPER_CONGRUENCE) {
+        // Dimension `dim' has a proper congruence row at
+        // `source_num_rows' in `source', so include in `diagonal_lcm'
+        // the `dim'th element of that row.
+        lcm_assign(diagonal_lcm, diagonal_lcm, source[source_num_rows].expr.get(dim));
+        // Proper congruences map to parameters.
+        ++dest_num_rows;
+      }
+      // Equalities map to virtual generators.
+      ++source_num_rows;
+    }
+
+  // `source' must be regular.
+  PPL_ASSERT(diagonal_lcm != 0);
+
+  dest.clear();
+  PPL_ASSERT(dims > 0);
+  dest.set_space_dimension(dims - 1);
+
+  // In `dest' initialize row types and elements, including setting
+  // the diagonal elements to the inverse ratio of the `source'
+  // diagonal elements.
+  //
+  // The top-down order of the congruence system rows corresponds to
+  // the right-left order of the dimensions.
+  dimension_type source_index = source_num_rows;
+  // The generator system has a bottom-up ordering.
+  for (dimension_type dim = 0; dim < dims; ++dim) {
+    if (dim_kinds[dim] == EQUALITY) {
+      --source_index;
+    }
+    else {
+      Grid_Generator g(dest.representation());
+      g.set_topology(dest.topology());
+      g.expr.set_space_dimension(dims);
+
+      if (dim_kinds[dim] == CON_VIRTUAL) {
+        g.set_is_line();
+        g.expr.set(0, Coefficient_zero());
+        g.expr.set(dim, Coefficient_one());
+      }
+      else {
+        PPL_ASSERT(dim_kinds[dim] == PROPER_CONGRUENCE);
+        g.set_is_parameter_or_point();
+        --source_index;
+        PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+        exact_div_assign(tmp, diagonal_lcm,
+                         source[source_index].expr.get(dim));
+        g.expr.set(0, Coefficient_zero());
+        g.expr.set(dim, tmp);
+      }
+      // Don't assert g.OK() here, because it may fail.
+      // All the rows in `dest' are checked at the end of this function.
+      dest.insert_verbatim(g);
+    }
+  }
+
+  PPL_ASSERT(dest.num_rows() == dest_num_rows);
+  PPL_ASSERT(dest.first_pending_row() == dest_num_rows);
+  PPL_ASSERT(upper_triangular(dest, dim_kinds));
+
+  // Convert.
+  //
+  // `source_index' and `dest_index' hold the positions of pivot rows
+  // in `source' and `dest'.  The order of the rows in `dest' is the
+  // reverse of the order in `source', so the rows are iterated from
+  // last to first (index 0) in `source' and from first to last in
+  // `dest'.
+  source_index = source_num_rows;
+  dimension_type dest_index = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_source_dim);
+
+  for (dimension_type dim = 0; dim < dims; ++dim) {
+    if (dim_kinds[dim] != CON_VIRTUAL) {
+      --source_index;
+      Coefficient_traits::const_reference source_dim
+        = source[source_index].expr.get(dim);
+
+      // In the rows in `dest' above `dest_index' divide each element
+      // at column `dim' by `source_dim'.
+
+      for (dimension_type i = dest_index; i-- > 0; ) {
+        Grid_Generator& g = dest.sys.rows[i];
+
+        // Multiply the representation of `dest' such that entry `dim'
+        // of `g' is a multiple of `source_dim'.  This ensures that
+        // the result of the division that follows is a whole number.
+        gcd_assign(reduced_source_dim, g.expr.get(dim), source_dim);
+        exact_div_assign(reduced_source_dim, source_dim, reduced_source_dim);
+        multiply_grid(reduced_source_dim, g, dest.sys.rows, dest_num_rows);
+
+        g.expr.exact_div_assign(source_dim, dim, dim + 1);
+        // Don't assert g.OK() here, because it may fail.
+        // All the rows in `dest' are checked at the end of this function.
+      }
+    }
+
+    // Invert and transpose the source row at `source_index' into the
+    // destination row at `dest_index'.
+    //
+    // Consider each dimension `dim_fol' that follows `dim', as the
+    // rows in `dest' that follow row `dest_index' are zero at index
+    // `dim'.
+    dimension_type tmp_source_index = source_index;
+    if (dim_kinds[dim] != EQUALITY)
+      ++dest_index;
+    for (dimension_type dim_fol = dim + 1; dim_fol < dims; ++dim_fol) {
+      if (dim_kinds[dim_fol] != CON_VIRTUAL) {
+        --tmp_source_index;
+        Coefficient_traits::const_reference source_dim
+          = source[tmp_source_index].expr.get(dim);
+        // In order to compute the transpose of the inverse of
+        // `source', subtract source[tmp_source_index][dim] times the
+        // column vector in `dest' at `dim' from the column vector in
+        // `dest' at `dim_fol'.
+        //
+        // I.e., for each row `dest_index' in `dest' that is above the
+        // row `dest_index', subtract dest[tmp_source_index][dim]
+        // times the entry `dim' from the entry at `dim_fol'.
+
+        PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+        for (dimension_type i = dest_index; i-- > 0; ) {
+          PPL_ASSERT(i < dest_num_rows);
+          Grid_Generator& row = dest.sys.rows[i];
+          tmp = row.expr.get(dim_fol);
+          sub_mul_assign(tmp, source_dim,
+                         row.expr.get(dim));
+          row.expr.set(dim_fol, tmp);
+          // Don't assert row.OK() here, because it may fail.
+          // All the rows in `dest' are checked at the end of this function.
+        }
+      }
+    }
+  }
+
+  PPL_ASSERT(upper_triangular(dest, dim_kinds));
+
+  // Since we are reducing the system to "strong minimal form",
+  // reduce the coordinates in the grid_generator system
+  // using "diagonal" values.
+  for (dimension_type dim = 0, i = 0; dim < dims; ++dim) {
+    if (dim_kinds[dim] != GEN_VIRTUAL)
+      // Factor the "diagonal" generator out of the preceding rows.
+      reduce_reduced<Grid_Generator_System>
+        (dest.sys.rows, dim, i++, dim, dims - 1, dim_kinds);
+  }
+
+  // Ensure that the parameter divisors are the same as the divisor of
+  // the point.
+  const Coefficient& system_divisor
+    = dest.sys.rows[0].expr.inhomogeneous_term();
+
+  for (dimension_type i = dest.sys.rows.size() - 1, dim = dims; dim-- > 1; ) {
+    switch (dim_kinds[dim]) {
+    case PARAMETER:
+      dest.sys.rows[i].set_divisor(system_divisor);
+      // Intentionally fall through.
+    case LINE:
+      --i;
+      break;
+    case GEN_VIRTUAL:
+      break;
+    }
+  }
+
+#ifndef NDEBUG
+  // The previous code can modify the rows' fields, exploiting the friendness.
+  // Check that all rows are OK now.
+  for (dimension_type i = dest.sys.rows.size(); i-- > 0; )
+    PPL_ASSERT(dest.sys.rows[i].OK());
+#endif
+
+  PPL_ASSERT(dest.sys.OK());
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_defs.hh b/src/Grid_defs.hh
new file mode 100644
index 0000000..9aaf374
--- /dev/null
+++ b/src/Grid_defs.hh
@@ -0,0 +1,2665 @@
+/* Grid class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_defs_hh
+#define PPL_Grid_defs_hh 1
+
+#include "Grid_types.hh"
+#include "globals_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_types.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include "Grid_Generator_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Grid_Certificate_types.hh"
+#include "Box_types.hh"
+#include "Polyhedron_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid
+  Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+  is written if \p gr is an empty grid; <CODE>true</CODE> is written
+  if \p gr is a universe grid; a minimized system of congruences
+  defining \p gr is written otherwise, all congruences in one row
+  separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid */
+void swap(Grid& x, Grid& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  grid.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  grids.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid represents a rational grid.
+
+  The domain of grids <EM>optimally supports</EM>:
+    - all (proper and non-proper) congruences;
+    - tautological and inconsistent constraints;
+    - linear equality constraints (i.e., non-proper congruences).
+
+  Depending on the method, using a constraint that is not optimally
+  supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  The domain of grids support a concept of double description similar
+  to the one developed for polyhedra: hence, a grid can be specified
+  as either a finite system of congruences or a finite system of
+  generators (see Section \ref sect_rational_grids) and it is always
+  possible to obtain either representation.
+  That is, if we know the system of congruences, we can obtain
+  from this a system of generators that define the same grid
+  and vice versa.
+  These systems can contain redundant members, or they can be in the
+  minimal form.
+
+  A key attribute of any grid is its space dimension (the dimension
+  \f$n \in \Nset\f$ of the enclosing vector space):
+
+  - all grids, the empty ones included, are endowed with a space
+    dimension;
+  - most operations working on a grid and another object (another
+    grid, a congruence, a generator, a set of variables, etc.) will
+    throw an exception if the grid and the object are not
+    dimension-compatible (see Section \ref Grid_Space_Dimensions);
+  - the only ways in which the space dimension of a grid can be
+    changed are with <EM>explicit</EM> calls to operators provided for
+    that purpose, and with standard copy, assignment and swap
+    operators.
+
+  Note that two different grids can be defined on the zero-dimension
+  space: the empty grid and the universe grid \f$R^0\f$.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a grid corresponding to the even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying three of the points:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 2*y));
+  gs.insert(grid_point(2*x + 0*y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds a grid corresponding to a line in
+  \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a line:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_line(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds a grid corresponding to the integral
+  points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+  by adding an equality and congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  cgs.insert(x %= 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a parameter:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 4
+  The following code builds the grid corresponding to a plane by
+  creating the universe grid in \f$\Rset^2\f$:
+  \code
+  Grid gr(2);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+  generators (a point, and two lines).
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_line(x));
+  gr.add_grid_generator(grid_line(y));
+  \endcode
+  Note that a generator system must contain a point when describing
+  a grid.  To ensure that this is always the case it is required
+  that the first generator inserted in an empty grid is a point
+  (otherwise, an exception is thrown).
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe grid in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality congruence,
+  thus obtaining the grid corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting grid is
+  \f[
+  \bigl\{\,
+  (2, y)^\transpose \in \Rset^2
+  \bigm|
+  y \in \Rset
+  \,\bigr\}.
+  \f]
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting grid is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_image(x, expr);
+  \endcode
+  In this example the starting grid is all the pairs of \f$x\f$ and
+  \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2.  The considered variable
+  is \f$x\f$ and the affine expression is \f$x+3\f$.  The resulting
+  grid is the given grid translated 3 integers to the right (all the
+  pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2).
+  Moreover, if the affine transformation for the same variable \p x
+  is instead \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is every second integral point along the \f$x=y\f$
+  line, with this line of points repeated at every fourth integral value
+  along the \f$x\f$ axis.
+  Instead, if we do not use an invertible transformation for the
+  same variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every second point along the \f$x=y\f$ line.
+
+  \par Example 8
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_preimage(x, expr);
+  \endcode
+  In this example the starting grid, \p var and the affine
+  expression and the denominator are the same as in Example 6, while
+  the resulting grid is similar but translated 3 integers to the
+  left (all the pairs \f$(x, y)\f$
+  where \f$x\f$ is -3 plus an integer multiple of 4 and
+  \f$y\f$ is an integer multiple of 2)..
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is a similar grid to the result in Example 6,
+  only the grid is slanted along \f$x=-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every fourth line parallel to the \f$x\f$
+  axis.
+
+  \par Example 9
+  For this example we also use the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*x + y +0*z + 2*w));
+  Grid gr(gs);
+  Variables_Set vars;
+  vars.insert(y);
+  vars.insert(z);
+  gr.remove_space_dimensions(vars);
+  \endcode
+  The starting grid is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting grid is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> vars1;
+  vars1.insert(y);
+  gr.remove_space_dimensions(vars1);
+  set<Variable> vars2;
+  vars2.insert(z);
+  gr.remove_space_dimensions(vars2);
+  \endcode
+  In this case, the result is the grid
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p vars2
+  we are actually removing variable \f$w\f$ of the original grid.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Grid {
+public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
+
+  //! Returns the maximum space dimension all kinds of Grid can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  //! Builds a grid having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    Specifies whether the universe or the empty grid has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(dimension_type num_dimensions = 0,
+                Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a grid, copying a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Congruence_System& cgs);
+
+  //! Builds a grid, recycling a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  Grid(Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds a grid, copying a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains inequality constraints.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Constraint_System& cs);
+
+  //! Builds a grid, recycling a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains inequality constraints.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  Grid(Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a grid, copying a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param ggs
+    The system of generators defining the grid.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Grid_Generator_System& ggs);
+
+  //! Builds a grid, recycling a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param ggs
+    The system of generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  */
+  Grid(Grid_Generator_System& ggs, Recycle_Input dummy);
+
+  //! Builds a grid out of a box.
+  /*!
+    The grid inherits the space dimension of the box.
+    The built grid is the most precise grid that includes the box.
+
+    \param box
+    The box representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Grid(const Box<Interval>& box,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a grid out of a bounded-difference shape.
+  /*!
+    The grid inherits the space dimension of the BDS.
+    The built grid is the most precise grid that includes the BDS.
+
+    \param bd
+    The BDS representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Grid(const BD_Shape<U>& bd,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a grid out of an octagonal shape.
+  /*!
+    The grid inherits the space dimension of the octagonal shape.
+    The built grid is the most precise grid that includes the octagonal shape.
+
+    \param os
+    The octagonal shape representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Grid(const Octagonal_Shape<U>& os,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Builds a grid from a polyhedron using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the grid built is the
+    smallest one containing \p ph.
+
+    The grid inherits the space dimension of polyhedron.
+
+    \param ph
+    The polyhedron.
+
+    \param complexity
+    The complexity class.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Polyhedron& ph,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Grid(const Grid& y,
+       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Grid& operator=(const Grid& y);
+
+  //! \name Member Functions that Do Not Modify the Grid
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns
+    the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  /*! \brief
+    Returns a system of equality constraints satisfied by \p *this
+    with the same affine dimension as \p *this.
+  */
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Returns a minimal system of equality constraints satisfied by
+    \p *this with the same affine dimension as \p *this.
+  */
+  Constraint_System minimized_constraints() const;
+
+  //! Returns the system of congruences.
+  const Congruence_System& congruences() const;
+
+  //! Returns the system of congruences in minimal form.
+  const Congruence_System& minimized_congruences() const;
+
+  //! Returns the system of generators.
+  const Grid_Generator_System& grid_generators() const;
+
+  //! Returns the minimized system of generators.
+  const Grid_Generator_System& minimized_grid_generators() const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Grid_Generator& g) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Generator& g) const;
+
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns \c true if and only if \p *this is an empty grid.
+  bool is_empty() const;
+
+  //! Returns \c true if and only if \p *this is a universe grid.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a
+    topologically closed subset of the vector space.
+
+    A grid is always topologically closed.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  /*!
+    A grid is discrete if it can be defined by a generator system which
+    contains only points and parameters.  This includes the empty grid
+    and any grid in dimension zero.
+  */
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false;
+
+    \param point
+    When maximization succeeds, will be assigned a point where \p expr
+    reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false;
+
+    \param point
+    When minimization succeeds, will be assigned a point where \p expr
+    reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+    is defined, in which case the frequency and the value for \p expr
+    that is closest to zero are computed.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    The numerator of the maximum frequency of \p expr;
+
+    \param freq_d
+    The denominator of the maximum frequency of \p expr;
+
+    \param val_n
+    The numerator of them value of \p expr at a point in the grid
+    that is closest to zero;
+
+    \param val_d
+    The denominator of a value of \p expr at a point in the grid
+    that is closest to zero;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or frequency is undefined with respect to \p expr,
+    then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Grid& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly
+    contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Grid& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Grid
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+  //@{
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of grid generator \p g to the system of generators of
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
+  */
+  void add_grid_generator(const Grid_Generator& g);
+
+  //! Adds a copy of each congruence in \p cgs to \p *this.
+  /*!
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this a congruence equivalent to constraint \p c.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible
+    or if constraint \p c is not optimally supported by the grid domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+    \param cs
+    The constraints to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible
+    or if \p cs contains a constraint which is not optimally supported
+    by the grid domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+    \param cs
+    The constraints to be added. They may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible
+    or if \p cs contains a constraint which is not optimally supported
+    by the grid domain.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  //! Uses a copy of the congruence \p cg to refine \p *this.
+  /*!
+    \param cg
+    The congruence used.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+ //! Uses a copy of the congruences in \p cgs to refine \p *this.
+  /*!
+    \param cgs
+    The congruences used.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  //! Uses a copy of the constraint \p c to refine \p *this.
+  /*!
+
+    \param c
+    The constraint used. If it is not an equality, it will be ignored
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Uses a copy of the constraints in \p cs to refine \p *this.
+  /*!
+    \param cs
+    The constraints used. Constraints that are not equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  void add_grid_generators(const Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this.
+
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_grid_generators(Grid_Generator_System& gs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the least upper bound of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Grid& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact it is assigned to \p
+    *this and <CODE>true</CODE> is returned, otherwise
+    <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Convex_Polyhedral_Difference "grid-difference"
+    of \p *this and \p y.
+
+    The grid difference between grids x and y is the smallest grid
+    containing all the points from x and y that are only in x.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a grid, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If congruences are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of congruences)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+             + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering congruences of a grid, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only congruences remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void
+  generalized_affine_image(Variable var,
+                           Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator
+                           = Coefficient_one(),
+                           Coefficient_traits::const_reference modulus
+                           = Coefficient_zero());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one(),
+                              Coefficient_traits::const_reference modulus
+                              = Coefficient_zero());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void
+  generalized_affine_image(const Linear_Expression& lhs,
+                           Relation_Symbol relsym,
+                           const Linear_Expression& rhs,
+                           Coefficient_traits::const_reference modulus
+                           = Coefficient_zero());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param rhs
+    The right hand side affine expression;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void
+  generalized_affine_preimage(const Linear_Expression& lhs,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& rhs,
+                              Coefficient_traits::const_reference modulus
+                              = Coefficient_zero());
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+    "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Grid& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system.
+    This argument is for compatibility with wrap_assign()
+    for the other domains and only checked for dimension-compatibility.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator".
+    This argument is for compatibility with wrap_assign()
+    for the other domains and is ignored.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually.
+    As wrapping dimensions collectively does not improve the precision,
+    this argument is ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+
+    \warning
+    It is assumed that variables in \p Vars represent integers.  Thus,
+    where the extra cost is negligible, the integrality of these
+    variables is enforced; possibly causing a non-integral grid to
+    become empty.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping all points with non-integer
+    coordinates.
+
+    \param complexity
+    This argument is ignored as the algorithm used has polynomial
+    complexity.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping all points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    This argument is ignored as the algorithm used has polynomial
+    complexity.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using congruence systems.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void congruence_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using generator systems.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void generator_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y.
+
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the congruence variant of
+    \ref Grid_Widening "Grid widening" computation by also enforcing
+    those congruences in \p cgs that are satisfied by all the points
+    of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+  */
+  void limited_congruence_extrapolation_assign(const Grid& y,
+                                               const Congruence_System& cgs,
+                                               unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the generator variant of the
+    \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+  */
+  void limited_generator_extrapolation_assign(const Grid& y,
+                                              const Congruence_System& cgs,
+                                              unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+  */
+  void limited_extrapolation_assign(const Grid& y,
+                                    const Congruence_System& cgs,
+                                    unsigned* tp = NULL);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+    \p m new space dimensions and embeds the old grid in the new
+    vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables which are the new dimensions can have any
+    value.  For instance, when starting from the grid \f$\cL \sseq
+    \Rset^2\f$ and adding a third space dimension, the result will be
+    the grid
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+    \p m new space dimensions to the grid and does not embed it
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables running through the new dimensions are all
+    constrained to be equal to 0.  For instance, when starting from
+    the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+    dimension, the result will be the grid
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation" of
+    \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Grid& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have \ref Removing_Dimensions_from_the_Vector_Space
+    "dimension \p new_dimension."
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the grid.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.  Also
+    thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==(const Grid& x, const Grid& y);
+
+  friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Grid();
+
+  /*! \brief
+    Swaps \p *this with grid \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void m_swap(Grid& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+
+  //! The system of congruences.
+  Congruence_System con_sys;
+
+  //! The system of generators.
+  Grid_Generator_System gen_sys;
+
+#define PPL_IN_Grid_CLASS
+#include "Grid_Status_idefs.hh"
+#undef PPL_IN_Grid_CLASS
+
+  //! The status flags to keep track of the grid's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  enum Dimension_Kind {
+    PARAMETER = 0,
+    LINE = 1,
+    GEN_VIRTUAL = 2,
+    PROPER_CONGRUENCE = PARAMETER,
+    CON_VIRTUAL = LINE,
+    EQUALITY = GEN_VIRTUAL
+  };
+
+  typedef std::vector<Dimension_Kind> Dimension_Kinds;
+
+  // The type of row associated with each dimension.  If the virtual
+  // rows existed then the reduced systems would be square and upper
+  // or lower triangular, and the rows in each would have the types
+  // given in this vector.  As the congruence system is reduced to an
+  // upside-down lower triangular form the ordering of the congruence
+  // types is last to first.
+  Dimension_Kinds dim_kinds;
+
+  //! Builds a grid universe or empty grid.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    specifies whether the universe or the empty grid has to be built.
+  */
+  void construct(dimension_type num_dimensions, Degenerate_Element kind);
+
+  //! Builds a grid from a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid. Its data-structures
+    may be recycled to build the grid.
+  */
+  void construct(Congruence_System& cgs);
+
+  //! Builds a grid from a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param ggs
+    The system of grid generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
+  */
+  void construct(Grid_Generator_System& ggs);
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the grid is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+  bool congruences_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+  bool congruences_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  bool generators_are_minimized() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the grid is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the grid is empty, clearing all
+    corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that congruences are up-to-date.
+  void set_congruences_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are minimized.
+  void set_congruences_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the grid is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that congruences are out of date.
+  void clear_congruences_up_to_date();
+
+  //! Sets \p status to express that generators are out of date.
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are no longer minimized.
+  void clear_congruences_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name Updating Matrices
+  //@{
+
+  //! Updates and minimizes the congruences from the generators.
+  void update_congruences() const;
+
+  //! Updates and minimizes the generators from the congruences.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    It is illegal to call this method when the Status field already
+    declares the grid to be empty.
+  */
+  bool update_generators() const;
+
+  //@} // Updating Matrices
+
+  //! \name Minimization of Descriptions
+  //@{
+
+  //! Minimizes both the congruences and the generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    Minimization is performed on each system only if the minimized
+    Status field is clear.
+  */
+  bool minimize() const;
+
+  //@} // Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between grids.
+  Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Grid& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "bounded_from_above(e)".  Passed to throw_dimension_incompatible,
+    as the first argument.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, const char* method_call) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "maximize(e)".  Passed to throw_dimension_incompatible, as the
+    first argument;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr in \p
+    *this can actually be reached (which is always the case);
+
+    \param point
+    When maximization or minimization succeeds, will be assigned the
+    point where \p expr reaches the extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               const char* method_call,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator* point = NULL) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+    is defined, in which case the frequency and the value for \p expr
+    that is closest to zero are computed.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    The numerator of the maximum frequency of \p expr;
+
+    \param freq_d
+    The denominator of the maximum frequency of \p expr;
+
+    \param val_n
+    The numerator of a value of \p expr at a point in the grid
+    that is closest to zero;
+
+    \param val_d
+    The denominator of a value of \p expr at a point in the grid
+    that is closest to zero;
+
+    If \p *this is empty or frequency is undefined with respect to \p expr,
+    then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+
+    \warning
+    If \p expr and \p *this are dimension-incompatible,
+    the grid generator system is not minimized or \p *this is
+    empty, then the behavior is undefined.
+  */
+  bool frequency_no_check(const Linear_Expression& expr,
+                Coefficient& freq_n, Coefficient& freq_d,
+                Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+  */
+  bool bounds_no_check(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Adds the congruence \p cg to \p *this.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the grid generator system is not minimized or \p *this is
+    empty, then the behavior is undefined.
+  */
+  void add_congruence_no_check(const Congruence& cg);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if c is a non-trivial inequality constraint.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void add_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added.
+    Non-trivial inequalities are ignored.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+  void select_wider_congruences(const Grid& y,
+                                Congruence_System& selected_cgs) const;
+
+  //! Copies widened generators from \p y to \p widened_ggs.
+  void select_wider_generators(const Grid& y,
+                               Grid_Generator_System& widened_ggs) const;
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param cgs
+    A congruence system, to which columns are added;
+
+    \param gs
+    A generator system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE>.
+  */
+  void add_space_dimensions(Congruence_System& cgs,
+                            Grid_Generator_System& gs,
+                            dimension_type dims);
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param gs
+    A generator system, to which columns are added;
+
+    \param cgs
+    A congruence system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_project()</CODE>.
+  */
+  void add_space_dimensions(Grid_Generator_System& gs,
+                            Congruence_System& cgs,
+                            dimension_type dims);
+
+  //! \name Minimization-related Static Member Functions
+  //@{
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
+
+    \param divisor
+    A reference to the initial value of the divisor.  The resulting
+    value of this object is the new system divisor.
+
+    \param first_point
+    If \p first_point has a value other than NULL then it is taken as
+    the first point in \p sys, and it is assumed that any following
+    points have the same divisor as \p first_point.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys,
+                     Coefficient& divisor,
+                     const Grid_Generator* first_point = NULL);
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys);
+
+  //! Normalize all the divisors in \p sys and \p gen_sys.
+  /*!
+    Modify \p sys and \p gen_sys to use the same single divisor value
+    for all generators, leaving each system representing the grid it
+    represented originally.
+
+    \param sys
+    The first of the generator systems to be normalized.
+
+    \param gen_sys
+    The second of the generator systems to be normalized.  This system
+    must have at least one row and the divisors of the generators in
+    this system must be equal.
+
+    \exception std::runtime_error
+    Thrown if all rows in \p gen_sys are lines and/or parameters.
+  */
+  static void normalize_divisors(Grid_Generator_System& sys,
+                                 Grid_Generator_System& gen_sys);
+
+  /*! \brief
+    Converts generator system \p dest to be equivalent to congruence
+    system \p source.
+  */
+  static void conversion(Congruence_System& source,
+                         Grid_Generator_System& dest,
+                         Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    Converts congruence system \p dest to be equivalent to generator
+    system \p source.
+  */
+  static void conversion(Grid_Generator_System& source,
+                         Congruence_System& dest,
+                         Dimension_Kinds& dim_kinds);
+
+  //! Converts \p cgs to upper triangular (i.e. minimized) form.
+  /*!
+    Returns <CODE>true</CODE> if \p cgs represents the empty set,
+    otherwise returns <CODE>false</CODE>.
+  */
+  static bool simplify(Congruence_System& cgs,
+                       Dimension_Kinds& dim_kinds);
+
+  //! Converts \p gs to lower triangular (i.e. minimized) form.
+  /*!
+    Expects \p gs to contain at least one point.
+  */
+  static void simplify(Grid_Generator_System& ggs,
+                       Dimension_Kinds& dim_kinds);
+
+  //! Reduces the line \p row using the line \p pivot.
+  /*!
+    Uses the line \p pivot to change the representation of the line
+    \p row so that the element at index \p column of \p row is zero.
+  */
+  // A member of Grid for access to Matrix<Dense_Row>::rows.
+  static void reduce_line_with_line(Grid_Generator& row,
+                                    Grid_Generator& pivot,
+                                    dimension_type column);
+
+  //! Reduces the equality \p row using the equality \p pivot.
+  /*!
+    Uses the equality \p pivot to change the representation of the
+    equality \p row so that the element at index \p column of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix<Dense_Row>::rows.
+  static void reduce_equality_with_equality(Congruence& row,
+                                            const Congruence& pivot,
+                                            dimension_type column);
+
+  //! Reduces \p row using \p pivot.
+  /*!
+    Uses the point, parameter or proper congruence at \p pivot to
+    change the representation of the point, parameter or proper
+    congruence at \p row so that the element at index \p column of \p row
+    is zero.  Only elements from index \p start to index \p end are
+    modified (i.e. it is assumed that all other elements are zero).
+    This means that \p col must be in [start,end).
+
+    NOTE: This may invalidate the rows, since it messes with the divisors.
+    Client code has to fix that (if needed) and assert OK().
+  */
+  // Part of Grid for access to Matrix<Dense_Row>::rows.
+  template <typename R>
+  static void reduce_pc_with_pc(R& row,
+                                R& pivot,
+                                dimension_type column,
+                                dimension_type start,
+                                dimension_type end);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the line \p pivot to change the representation of the
+    parameter \p row such that the element at index \p column of \p row
+    is zero.
+  */
+  // This takes a parameter with type Swapping_Vector<Grid_Generator> (instead
+  // of Grid_Generator_System) to simplify the implementation of `simplify()'.
+  // NOTE: This may invalidate `row' and the rows in `sys'. Client code must
+  // fix/check this.
+  static void reduce_parameter_with_line(Grid_Generator& row,
+                                         const Grid_Generator& pivot,
+                                         dimension_type column,
+                                         Swapping_Vector<Grid_Generator>& sys,
+                                         dimension_type num_columns);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the equality \p pivot to change the representation of the
+    congruence \p row such that element at index \p column of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix<Dense_Row>::rows.
+  // This takes a parameter with type Swapping_Vector<Congruence> (instead of
+  // Congruence_System) to simplify the implementation of `conversion()'.
+  static void reduce_congruence_with_equality(Congruence& row,
+                                              const Congruence& pivot,
+                                              dimension_type column,
+                                              Swapping_Vector<Congruence>& sys);
+
+  //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+  /*!
+    Required when converting (or simplifying) a congruence or generator
+    system to "strong minimal form"; informally, strong minimal form means
+    that, not only is the system in minimal form (ie a triangular matrix),
+    but also the absolute values of the coefficients of the proper congruences
+    and parameters are minimal. As a simple example, the set of congruences
+    \f$\{3x \equiv_3 0, 4x + y \equiv_3 1\}\f$,
+    (which is in minimal form) is equivalent to the set
+    \f$\{3x \equiv_3 0, x + y \equiv_3 1\}\f$
+    (which is in strong minimal form).
+
+    \param sys
+    The generator or congruence system to be reduced to strong minimal form.
+
+    \param dim
+    Column to be reduced.
+
+    \param pivot_index
+    Index of last row to be reduced.
+
+    \param start
+    Index of first column to be changed.
+
+    \param end
+    Index of last column to be changed.
+
+    \param sys_dim_kinds
+    Dimension kinds of the elements of \p sys.
+
+    \param generators
+    Flag indicating whether \p sys is a congruence or generator system
+  */
+  template <typename M>
+  // This takes a parameter with type `Swapping_Vector<M::row_type>'
+  // instead of `M' to simplify the implementation of simplify().
+  // NOTE: This may invalidate the rows in `sys'. Client code must
+  // fix/check this.
+  static void reduce_reduced(Swapping_Vector<typename M::row_type>& sys,
+                             dimension_type dim,
+                             dimension_type pivot_index,
+                             dimension_type start, dimension_type end,
+                             const Dimension_Kinds& sys_dim_kinds,
+                             bool generators = true);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Matrix<Dense_Row>::rows and cgs::operator[].
+  // The type of `dest' is Swapping_Vector<Congruence> instead of
+  // Congruence_System to simplify the implementation of conversion().
+  static void multiply_grid(const Coefficient& multiplier,
+                            Congruence& cg,
+                            Swapping_Vector<Congruence>& dest,
+                            dimension_type num_rows);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Grid_Generator::operator[].
+  // The type of `dest' is Swapping_Vector<Grid_Generator> instead of
+  // Grid_Generator_System to simplify the implementation of conversion().
+  // NOTE: This does not check whether the rows are OK(). Client code
+  // should do that.
+  static void multiply_grid(const Coefficient& multiplier,
+                            Grid_Generator& gen,
+                            Swapping_Vector<Grid_Generator>& dest,
+                            dimension_type num_rows);
+
+  /*! \brief
+    If \p sys is lower triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool lower_triangular(const Congruence_System& sys,
+                               const Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    If \p sys is upper triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool upper_triangular(const Grid_Generator_System& sys,
+                               const Dimension_Kinds& dim_kinds);
+
+#ifndef NDEBUG
+  //! Checks that trailing rows contain only zero terms.
+  /*!
+    If all columns contain zero in the rows of \p system from row
+    index \p first to row index \p last then return <code>true</code>,
+    else return <code>false</code>.  \p row_size gives the number of
+    columns in each row.
+
+    This method is only used in assertions in the simplify methods.
+  */
+  template <typename M, typename R>
+  static bool rows_are_zero(M& system,
+                            dimension_type first,
+                            dimension_type last,
+                            dimension_type row_size);
+#endif
+
+  //@} // Minimization-Related Static Member Functions
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \name Exception Throwers
+  //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+  void throw_dimension_incompatible(const char* method,
+                                    const char* other_name,
+                                    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* gr_name,
+                                    const Grid& gr) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cg_name,
+                                    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* c_name,
+                                    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* g_name,
+                                    const Grid_Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* g_name,
+                                    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cgs_name,
+                                    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cs_name,
+                                    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* gs_name,
+                                    const Grid_Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* var_name,
+                                    Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_space_dim) const;
+
+  static void throw_invalid_argument(const char* method,
+                                     const char* reason);
+  static void throw_invalid_constraint(const char* method,
+                                       const char* c_name);
+  static void throw_invalid_constraints(const char* method,
+                                        const char* cs_name);
+  static void throw_invalid_generator(const char* method,
+                                      const char* g_name);
+  static void throw_invalid_generators(const char* method,
+                                       const char* gs_name);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+};
+
+#include "Grid_Status_inlines.hh"
+#include "Grid_inlines.hh"
+#include "Grid_templates.hh"
+
+#endif // !defined(PPL_Grid_defs_hh)
diff --git a/src/Grid_inlines.hh b/src/Grid_inlines.hh
new file mode 100644
index 0000000..5c496dc
--- /dev/null
+++ b/src/Grid_inlines.hh
@@ -0,0 +1,383 @@
+/* Grid class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_inlines_hh
+#define PPL_Grid_inlines_hh 1
+
+#include "Grid_Generator_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Grid::congruences_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Grid::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Grid::congruences_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Grid::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline void
+Grid::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline void
+Grid::set_congruences_minimized() {
+  set_congruences_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Grid::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Grid::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Grid::clear_congruences_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Grid::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Grid::clear_congruences_up_to_date() {
+  clear_congruences_minimized();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Grid::clear_generators_up_to_date() {
+  clear_generators_minimized();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline dimension_type
+Grid::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(std::numeric_limits<dimension_type>::max() - 1,
+                  std::min(Congruence_System::max_space_dimension(),
+                           Grid_Generator_System::max_space_dimension()
+                           )
+                  );
+}
+
+inline
+Grid::Grid(dimension_type num_dimensions,
+           const Degenerate_Element kind)
+  : con_sys(),
+    gen_sys(check_space_dimension_overflow(num_dimensions,
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(n, k)",
+                                           "n exceeds the maximum "
+                                           "allowed space dimension")) {
+  construct(num_dimensions, kind);
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid::Grid(const Congruence_System& cgs)
+  : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(cgs)",
+                                           "the space dimension of cgs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(cgs.space_dimension()) {
+  Congruence_System cgs_copy(cgs);
+  construct(cgs_copy);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs, Recycle_Input)
+  : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(cgs, recycle)",
+                                           "the space dimension of cgs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(cgs.space_dimension()) {
+  construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& ggs)
+  : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(ggs)",
+                                           "the space dimension of ggs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(ggs.space_dimension()) {
+  Grid_Generator_System ggs_copy(ggs);
+  construct(ggs_copy);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& ggs, Recycle_Input)
+  : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(ggs, recycle)",
+                                           "the space dimension of ggs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(ggs.space_dimension()) {
+  construct(ggs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const BD_Shape<U>& bd, Complexity_Class)
+  : con_sys(check_space_dimension_overflow(bd.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(bd)",
+                                           "the space dimension of bd "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(bd.space_dimension()) {
+  Congruence_System cgs = bd.congruences();
+  construct(cgs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const Octagonal_Shape<U>& os, Complexity_Class)
+  : con_sys(check_space_dimension_overflow(os.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(os)",
+                                           "the space dimension of os "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(os.space_dimension()) {
+  Congruence_System cgs = os.congruences();
+  construct(cgs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+  return space_dim;
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline int32_t
+Grid::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+inline Constraint_System
+Grid::constraints() const {
+  return Constraint_System(congruences());
+}
+
+inline Constraint_System
+Grid::minimized_constraints() const {
+  return Constraint_System(minimized_congruences());
+}
+
+inline void
+Grid::m_swap(Grid& y) {
+  using std::swap;
+  swap(con_sys, y.con_sys);
+  swap(gen_sys, y.gen_sys);
+  swap(status, y.status);
+  swap(space_dim, y.space_dim);
+  swap(dim_kinds, y.dim_kinds);
+}
+
+inline void
+Grid::add_congruence(const Congruence& cg) {
+  // Dimension-compatibility check.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+  if (!marked_empty())
+    add_congruence_no_check(cg);
+}
+
+inline void
+Grid::add_congruences(const Congruence_System& cgs) {
+  // TODO: this is just an executable specification.
+  // Space dimension compatibility check.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+  if (!marked_empty()) {
+    Congruence_System cgs_copy = cgs;
+    add_recycled_congruences(cgs_copy);
+  }
+}
+
+inline void
+Grid::refine_with_congruence(const Congruence& cg) {
+  add_congruence(cg);
+}
+
+inline void
+Grid::refine_with_congruences(const Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+inline bool
+Grid::can_recycle_constraint_systems() {
+  return true;
+}
+
+inline bool
+Grid::can_recycle_congruence_systems() {
+  return true;
+}
+
+inline void
+Grid::add_constraint(const Constraint& c) {
+  // Space dimension compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+  if (!marked_empty())
+    add_constraint_no_check(c);
+}
+
+inline void
+Grid::add_recycled_constraints(Constraint_System& cs) {
+  // TODO: really recycle the constraints.
+  add_constraints(cs);
+}
+
+inline bool
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_above(e)");
+}
+
+inline bool
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_below(e)");
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+               Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+               Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+               Generator& point) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+               Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+               Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+               Generator& point) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+inline void
+Grid::normalize_divisors(Grid_Generator_System& sys) {
+  PPL_DIRTY_TEMP_COEFFICIENT(divisor);
+  divisor = 1;
+  normalize_divisors(sys, divisor);
+}
+
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+  return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+  const Grid& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Grid::topological_closure_assign() {
+}
+
+/*! \relates Grid */
+inline void
+swap(Grid& x, Grid& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_inlines_hh)
diff --git a/src/Grid_nonpublic.cc b/src/Grid_nonpublic.cc
new file mode 100644
index 0000000..69fadd8
--- /dev/null
+++ b/src/Grid_nonpublic.cc
@@ -0,0 +1,846 @@
+/* Grid class implementation
+   (non-inline private or protected functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_defines
+  \brief
+  Controls the laziness level of the implementation.
+
+  Temporarily used in a few of the function implementations to
+  switch to an even more lazy algorithm. To be removed as soon as
+  we collect enough information to decide which is the better
+  implementation alternative.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::construct(dimension_type num_dimensions,
+                     const Degenerate_Element kind) {
+  space_dim = num_dimensions;
+
+  if (kind == EMPTY) {
+    // Set emptiness directly instead of with set_empty, as gen_sys is
+    // already correctly initialized.
+    status.set_empty();
+
+    // Extend the zero dim false congruence system to the appropriate
+    // dimension and then store it in `con_sys'.
+    Congruence_System cgs(Congruence::zero_dim_false());
+    cgs.set_space_dimension(space_dim);
+    swap(con_sys, cgs);
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Initialize both systems to universe representations.
+  set_congruences_minimized();
+  set_generators_minimized();
+  dim_kinds.resize(space_dim + 1);
+
+  // Building a universe congruence system.
+  // Extend the zero dim integrality congruence system to the
+  // appropriate dimension and then store it in `con_sys'.
+  Congruence_System cgs(Congruence::zero_dim_integrality());
+  cgs.set_space_dimension(num_dimensions);
+  // Recover minimal form after cgs(zdi) normalization.
+  cgs.rows[0].expr.set_inhomogeneous_term(Coefficient_one());
+  PPL_ASSERT(cgs.OK());
+  swap(con_sys, cgs);
+
+  // Building a universe grid generator system (and dim_kinds).
+  gen_sys.set_space_dimension(space_dim);
+  gen_sys.insert(grid_point());
+  dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */;
+  for (dimension_type dim = 0; dim < space_dim; ++dim) {
+    gen_sys.insert(grid_line(Variable(dim)));
+    dim_kinds[1+dim] = CON_VIRTUAL /* a.k.a. LINE */;
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::construct(Congruence_System& cgs) {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(cgs.space_dimension() <= max_space_dimension());
+  // Preparing con_sys and gen_sys is up to the caller.
+  PPL_ASSERT(cgs.space_dimension() == con_sys.space_dimension());
+  PPL_ASSERT(cgs.space_dimension() == gen_sys.space_dimension());
+  PPL_ASSERT(con_sys.has_no_rows());
+  PPL_ASSERT(gen_sys.has_no_rows());
+
+  // Set the space dimension.
+  space_dim = cgs.space_dimension();
+
+  if (space_dim > 0) {
+    // Stealing the rows from `cgs'.
+    con_sys.m_swap(cgs);
+    con_sys.normalize_moduli();
+    set_congruences_up_to_date();
+  }
+  else {
+    // Here `space_dim == 0'.
+    // See if an inconsistent congruence has been passed.
+    for (dimension_type i = cgs.num_rows(); i-- > 0; )
+      if (cgs[i].is_inconsistent()) {
+        // Inconsistent congruence found: the grid is empty.
+        status.set_empty();
+        // Insert the zero dim false congruence system into `con_sys'.
+        // `gen_sys' is already in empty form.
+        con_sys.insert(Congruence::zero_dim_false());
+        PPL_ASSERT(OK());
+        return;
+      }
+    set_zero_dim_univ();
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::construct(Grid_Generator_System& ggs) {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(ggs.space_dimension() <= max_space_dimension());
+  // Preparing con_sys and gen_sys is up to the caller.
+  PPL_ASSERT(ggs.space_dimension() == con_sys.space_dimension());
+  PPL_ASSERT(ggs.space_dimension() == gen_sys.space_dimension());
+  PPL_ASSERT(con_sys.has_no_rows());
+  PPL_ASSERT(gen_sys.has_no_rows());
+
+  // Set the space dimension.
+  space_dim = ggs.space_dimension();
+
+  // An empty set of generators defines the empty grid.
+  if (ggs.has_no_rows()) {
+    status.set_empty();
+    // Insert the zero dim false congruence system into `con_sys'.
+    // `gen_sys' is already in empty form.
+    con_sys.insert(Congruence::zero_dim_false());
+    return;
+  }
+
+  // Non-empty valid generator systems have a supporting point, at least.
+  if (!ggs.has_points())
+    throw_invalid_generators("Grid(ggs)", "ggs");
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Steal the rows from `ggs'.
+    gen_sys.m_swap(ggs);
+    normalize_divisors(gen_sys);
+    // Generators are now up-to-date.
+    set_generators_up_to_date();
+  }
+
+  PPL_ASSERT(OK());
+}
+
+PPL::Grid::Three_Valued_Boolean
+PPL::Grid::quick_equivalence_test(const Grid& y) const {
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Grid& x = *this;
+
+  bool css_normalized = false;
+
+  if (x.congruences_are_minimized() && y.congruences_are_minimized()) {
+    // Equivalent minimized congruence systems have:
+    //  - the same number of congruences; ...
+    if (x.con_sys.num_rows() != y.con_sys.num_rows())
+      return Grid::TVB_FALSE;
+    //  - the same number of equalities; ...
+    const dimension_type x_num_equalities = x.con_sys.num_equalities();
+    if (x_num_equalities != y.con_sys.num_equalities())
+      return Grid::TVB_FALSE;
+    //  - and if there are no equalities, the same congruences.
+    //    Delay this test: try cheaper tests on generators first.
+    css_normalized = (x_num_equalities == 0);
+  }
+
+  if (x.generators_are_minimized() && y.generators_are_minimized()) {
+    // Equivalent minimized generator systems have:
+    //  - the same number of generators; ...
+    if (x.gen_sys.num_rows() != y.gen_sys.num_rows())
+      return Grid::TVB_FALSE;
+    //  - the same number of lines; ...
+    const dimension_type x_num_lines = x.gen_sys.num_lines();
+    if (x_num_lines != y.gen_sys.num_lines())
+      return Grid::TVB_FALSE;
+      //  - and if there are no lines, the same generators.
+    if (x_num_lines == 0) {
+      // Check for syntactic identity.
+      if (x.gen_sys == y.gen_sys)
+        return Grid::TVB_TRUE;
+      else
+        return Grid::TVB_FALSE;
+    }
+  }
+
+  // TODO: Consider minimizing the systems and re-performing these
+  //       checks.
+
+  if (css_normalized) {
+    if (x.con_sys == y.con_sys)
+      return Grid::TVB_TRUE;
+    else
+      return Grid::TVB_FALSE;
+  }
+
+  return Grid::TVB_DONT_KNOW;
+}
+
+bool
+PPL::Grid::is_included_in(const Grid& y) const {
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Grid& x = *this;
+
+#if BE_LAZY
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // Updating found `x' empty.
+    return true;
+  if (!y.congruences_are_up_to_date())
+    y.update_congruences();
+#else
+  if (!x.generators_are_minimized() && !x.minimize())
+    // Minimizing found `x' empty.
+    return true;
+  if (!y.congruences_are_minimized())
+    y.minimize();
+#endif
+
+  PPL_ASSERT(x.OK());
+  PPL_ASSERT(y.OK());
+
+  const Grid_Generator_System& gs = x.gen_sys;
+  const Congruence_System& cgs = y.con_sys;
+
+  const dimension_type num_rows = gs.num_rows();
+  for (dimension_type i = num_rows; i-- > 0; )
+    if (!cgs.satisfies_all_congruences(gs[i]))
+      return false;
+
+  // Inclusion holds.
+  return true;
+}
+
+bool
+PPL::Grid::bounds(const Linear_Expression& expr,
+                  const char* method_call) const {
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible(method_call, "e", expr);
+
+  // A zero-dimensional or empty grid bounds everything.
+  if (space_dim == 0
+      || marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+  if (!generators_are_minimized() && !minimize())
+    // Minimizing found `this' empty.
+    return true;
+
+  return bounds_no_check(expr);
+}
+
+bool
+PPL::Grid::bounds_no_check(const Linear_Expression& expr) const {
+  // The dimension of `expr' must be at most the dimension of *this.
+  PPL_ASSERT(space_dim > 0 && space_dim >= expr.space_dimension());
+  PPL_ASSERT(generators_are_minimized() && !marked_empty());
+
+  // The generators are up to date and minimized.
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+    const Grid_Generator& g = gen_sys[i];
+    // Only lines and parameters in `*this' can cause `expr' to be
+    // unbounded.
+    if (g.is_line_or_parameter()) {
+      const int sp_sign = Scalar_Products::homogeneous_sign(expr, g);
+      if (sp_sign != 0)
+        // `*this' does not bound `expr'.
+        return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::Grid::frequency_no_check(const Linear_Expression& expr,
+                     Coefficient& freq_n, Coefficient& freq_d,
+                     Coefficient& val_n, Coefficient& val_d) const {
+
+  // The dimension of `expr' must be at most the dimension of *this.
+  PPL_ASSERT(space_dim >= expr.space_dimension());
+  PPL_ASSERT(generators_are_minimized() && !marked_empty());
+
+  // The generators are up to date and minimized and the grid is non-empty.
+
+  // If the grid is bounded for the expression `expr',
+  // then `expr' has a constant value and the frequency is 0.
+  if (bounds_no_check(expr)) {
+    freq_n = 0;
+    freq_d = 1;
+    // Find the value of the constant expression.
+    const Grid_Generator& point = gen_sys[0];
+    val_d = point.divisor();
+    Scalar_Products::homogeneous_assign(val_n, expr, point);
+    val_n += expr.inhomogeneous_term() * val_d;
+    // Reduce `val_n' and `val_d'.
+    PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+    gcd_assign(gcd, val_n, val_d);
+    exact_div_assign(val_n, val_n, gcd);
+    exact_div_assign(val_d, val_d, gcd);
+    return true;
+  }
+
+  // The frequency is the gcd of the scalar products of the parameters
+  // in `gen_sys'.
+  const dimension_type num_rows = gen_sys.num_rows();
+  PPL_DIRTY_TEMP_COEFFICIENT(sp);
+  freq_n = 0;
+
+  // As the generators are minimized, `gen_sys[0]' is a point
+  // and considered later.
+  for (dimension_type row = 1; row < num_rows; ++row) {
+    const Grid_Generator& gen = gen_sys[row];
+    Scalar_Products::homogeneous_assign(sp, expr, gen);
+    if (gen.is_line()) {
+      if (sgn(sp) != 0)
+          return false;
+      continue;
+    }
+    // `gen' must be a parameter.
+    PPL_ASSERT(gen.is_parameter());
+    if (sgn(sp) != 0)
+    gcd_assign(freq_n, freq_n, sp);
+  }
+  const Grid_Generator& point = gen_sys[0];
+  PPL_ASSERT(point.is_point());
+
+  // The denominator of the frequency and of the value is
+  // the divisor for the generators.
+  freq_d = point.divisor();
+  val_d = freq_d;
+
+  // As point is a grid generator, homogeneous_assign() must be used.
+  Scalar_Products::homogeneous_assign(val_n, expr, point);
+  val_n += expr.inhomogeneous_term() * val_d;
+
+  // Reduce `val_n' by the frequency `freq_n'.
+  val_n %= freq_n;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  // Reduce `freq_n' and `freq_d'.
+  gcd_assign(gcd, freq_n, freq_d);
+  exact_div_assign(freq_n, freq_n, gcd);
+  exact_div_assign(freq_d, freq_d, gcd);
+
+  // Reduce `val_n' and `val_d'.
+  gcd_assign(gcd, val_n, val_d);
+  exact_div_assign(val_n, val_n, gcd);
+  exact_div_assign(val_d, val_d, gcd);
+
+  return true;
+}
+
+bool
+PPL::Grid::max_min(const Linear_Expression& expr,
+                   const char* method_call,
+                   Coefficient& ext_n, Coefficient& ext_d, bool& included,
+                   Generator* point) const {
+  if (bounds(expr, method_call)) {
+    if (marked_empty())
+      return false;
+    if (space_dim == 0) {
+      ext_n = 0;
+      ext_d = 1;
+      included = true;
+      if (point != 0)
+        *point = Generator::point();
+      return true;
+    }
+    // Grid::bounds above ensures the generators are up to date.
+    if (!generators_are_minimized()) {
+      // Minimize the generator system.
+      Grid& gr = const_cast<Grid&>(*this);
+      gr.simplify(gr.gen_sys, gr.dim_kinds);
+      gr.set_generators_minimized();
+    }
+
+    const Grid_Generator& gen = gen_sys[0];
+    Scalar_Products::homogeneous_assign(ext_n, expr, gen);
+    ext_n += expr.inhomogeneous_term();
+    ext_d = gen.divisor();
+    // Reduce ext_n and ext_d.
+    PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+    gcd_assign(gcd, ext_n, ext_d);
+    exact_div_assign(ext_n, ext_n, gcd);
+    exact_div_assign(ext_d, ext_d, gcd);
+
+    included = true;
+    if (point != 0) {
+      const Linear_Expression g_expr(gen.expression());
+      *point = Generator::point(g_expr, gen.divisor());
+    }
+    return true;
+  }
+  return false;
+}
+
+void
+PPL::Grid::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+  space_dim = 0;
+  con_sys.clear();
+  gen_sys.clear();
+  gen_sys.insert(grid_point());
+}
+
+void
+PPL::Grid::set_empty() {
+  status.set_empty();
+
+  // Replace gen_sys with an empty system of the right dimension.
+  Grid_Generator_System gs(space_dim);
+  gen_sys.m_swap(gs);
+
+  // Extend the zero dim false congruence system to the appropriate
+  // dimension and then swap it with `con_sys'.
+  Congruence_System cgs(Congruence::zero_dim_false());
+  cgs.set_space_dimension(space_dim);
+  swap(con_sys, cgs);
+}
+
+void
+PPL::Grid::update_congruences() const {
+  // The caller must ensure that the generators are up to date.
+  PPL_ASSERT(space_dim > 0);
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(!gen_sys.has_no_rows());
+  PPL_ASSERT(gen_sys.space_dimension() > 0);
+
+  Grid& gr = const_cast<Grid&>(*this);
+
+  if (!generators_are_minimized())
+    gr.simplify(gr.gen_sys, gr.dim_kinds);
+
+  // `gen_sys' contained rows before being reduced, so it should
+  // contain at least a single point afterward.
+  PPL_ASSERT(!gen_sys.has_no_rows());
+
+  // Populate `con_sys' with congruences characterizing the grid
+  // described by `gen_sys'.
+  gr.conversion(gr.gen_sys, gr.con_sys, gr.dim_kinds);
+
+  // Both systems are minimized.
+  gr.set_congruences_minimized();
+  gr.set_generators_minimized();
+}
+
+bool
+PPL::Grid::update_generators() const {
+  PPL_ASSERT(space_dim > 0);
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(congruences_are_up_to_date());
+
+  Grid& x = const_cast<Grid&>(*this);
+
+  if (!congruences_are_minimized())
+    // Either the system of congruences is consistent, or the grid is
+    // empty.
+    if (simplify(x.con_sys, x.dim_kinds)) {
+      x.set_empty();
+      return false;
+    }
+
+  // Populate gen_sys with generators characterizing the grid
+  // described by con_sys.
+  conversion(x.con_sys, x.gen_sys, x.dim_kinds);
+
+  // Both systems are minimized.
+  x.set_congruences_minimized();
+  x.set_generators_minimized();
+  return true;
+}
+
+bool
+PPL::Grid::minimize() const {
+  // 0-dimension and empty grids are already minimized.
+  if (marked_empty())
+    return false;
+  if (space_dim == 0)
+    return true;
+
+  // Are both systems already minimized?
+  if (congruences_are_minimized() && generators_are_minimized())
+    return true;
+
+  // Invoke update_generators, update_congruences or simplify,
+  // depending on the state of the systems.
+  if (congruences_are_up_to_date()) {
+    if (generators_are_up_to_date()) {
+      Grid& gr = const_cast<Grid&>(*this);
+      // Only one of the systems can be minimized here.
+      if (congruences_are_minimized()) {
+        // Minimize the generator system.
+        gr.simplify(gr.gen_sys, gr.dim_kinds);
+        gr.set_generators_minimized();
+      }
+      else {
+#ifndef NDEBUG
+        // Both systems are up to date, and the empty case is handled
+        // above, so the grid should contain points.
+        bool empty = simplify(gr.con_sys, gr.dim_kinds);
+        PPL_ASSERT(!empty);
+#else
+        simplify(gr.con_sys, gr.dim_kinds);
+#endif
+        gr.set_congruences_minimized();
+        if (!generators_are_minimized()) {
+          // Minimize the generator system.
+          gr.simplify(gr.gen_sys, gr.dim_kinds);
+          gr.set_generators_minimized();
+        }
+      }
+    }
+    else {
+      // Updating the generators may reveal that `*this' is empty.
+      const bool ret = update_generators();
+      PPL_ASSERT(OK());
+      return ret;
+    }
+  }
+  else {
+    PPL_ASSERT(generators_are_up_to_date());
+    update_congruences();
+  }
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+                              Grid_Generator_System& gen_sys) {
+#ifndef NDEBUG
+  const dimension_type num_rows = gen_sys.num_rows();
+#endif
+  PPL_ASSERT(num_rows > 0);
+
+  // Find the first point in gen_sys.
+  dimension_type row = 0;
+  while (gen_sys[row].is_line_or_parameter()) {
+    ++row;
+    // gen_sys should have at least one point.
+    PPL_ASSERT(row < num_rows);
+  }
+  const Grid_Generator& first_point = gen_sys[row];
+  const Coefficient& gen_sys_divisor = first_point.divisor();
+
+#ifndef NDEBUG
+  // Check that the divisors in gen_sys are equal.
+  for (dimension_type i = row + 1; i < num_rows; ++i) {
+    const Grid_Generator& g = gen_sys[i];
+    if (g.is_parameter_or_point())
+      PPL_ASSERT(gen_sys_divisor == g.divisor());
+  }
+#endif // !defined(NDEBUG)
+
+  PPL_DIRTY_TEMP_COEFFICIENT(divisor);
+  divisor = gen_sys_divisor;
+  // Adjust sys to include the gen_sys divisor.
+  normalize_divisors(sys, divisor);
+  if (divisor != gen_sys_divisor)
+    // Adjust gen_sys to use the new divisor.
+    //
+    // The points and parameters in gen_sys share a common divisor
+    // value, so the new divisor will be the LCM of this common
+    // divisor and `divisor', hence the third argument.
+    normalize_divisors(gen_sys, divisor, &first_point);
+}
+
+void
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+                              Coefficient& divisor,
+                              const Grid_Generator* first_point) {
+  PPL_ASSERT(divisor >= 0);
+  if (sys.space_dimension() > 0 && divisor > 0) {
+    const dimension_type num_rows = sys.num_rows();
+
+    if (first_point != 0)
+      lcm_assign(divisor, divisor, (*first_point).divisor());
+    else {
+      PPL_ASSERT(num_rows > 0);
+      // Move to the first point or parameter.
+      dimension_type row = 0;
+      while (sys[row].is_line())
+        if (++row == num_rows)
+          // All rows are lines.
+          return;
+
+      // Calculate the LCM of the given divisor and the divisor of
+      // every point or parameter.
+      while (row < num_rows) {
+        const Grid_Generator& g = sys[row];
+        if (g.is_parameter_or_point())
+          lcm_assign(divisor, divisor, g.divisor());
+        ++row;
+      }
+    }
+
+    // Represent every point and every parameter using the newly
+    // calculated divisor.
+    for (dimension_type i = num_rows; i-- > 0; )
+      sys.sys.rows[i].scale_to_divisor(divisor);
+
+    // Put the rows back into the linear system.
+    PPL_ASSERT(sys.sys.OK());
+  }
+}
+
+void
+PPL::Grid::add_congruence_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(space_dim >= cg.space_dimension());
+
+  // Dealing with a zero-dimensional space grid first.
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      set_empty();
+    return;
+  }
+
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  con_sys.insert(cg);
+
+  clear_congruences_minimized();
+  set_congruences_up_to_date();
+  clear_generators_up_to_date();
+
+  // Note: the congruence system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_constraint_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(space_dim >= c.space_dimension());
+
+  if (c.is_inequality()) {
+    // Only trivial inequalities can be handled.
+    if (c.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    if (c.is_tautological())
+      return;
+    // Non-trivial inequality constraints are not allowed.
+    throw_invalid_constraint("add_constraint(c)", "c");
+  }
+
+  PPL_ASSERT(c.is_equality());
+  const Congruence cg(c);
+  add_congruence_no_check(cg);
+}
+
+void
+PPL::Grid::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(space_dim >= c.space_dimension());
+
+  if (c.is_equality()) {
+    const Congruence cg(c);
+    add_congruence_no_check(cg);
+  }
+  else if (c.is_inconsistent())
+    set_empty();
+}
+
+void
+PPL::Grid::throw_invalid_argument(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* other_name,
+                                        dimension_type other_dim) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << other_name << ".space_dimension() == " << other_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* gr_name,
+                                        const Grid& gr) const {
+  throw_dimension_incompatible(method, gr_name, gr.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* le_name,
+                                        const Linear_Expression& le) const {
+  throw_dimension_incompatible(method, le_name, le.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* cg_name,
+                                        const Congruence& cg) const {
+  throw_dimension_incompatible(method, cg_name, cg.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* c_name,
+                                        const Constraint& c) const {
+  throw_dimension_incompatible(method, c_name, c.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* g_name,
+                                        const Grid_Generator& g) const {
+  throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* g_name,
+                                        const Generator& g) const {
+  throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* cgs_name,
+                                        const Congruence_System& cgs) const {
+  throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* cs_name,
+                                        const Constraint_System& cs) const {
+  throw_dimension_incompatible(method, cs_name, cs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* gs_name,
+                                        const Grid_Generator_System& gs) const {
+  throw_dimension_incompatible(method, gs_name, gs.space_dimension());
+}
+
+void
+PPL::Grid::throw_dimension_incompatible(const char* method,
+                                        const char* var_name,
+                                        const Variable var) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << var_name << ".space_dimension() == " << var.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::
+throw_dimension_incompatible(const char* method,
+                             dimension_type required_space_dim) const {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required space dimension == " << required_space_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_constraint(const char* method,
+                                    const char* c_name) {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << c_name << " is not an equality constraint.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_constraints(const char* method,
+                                    const char* cs_name) {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "the constraint system " << cs_name
+    << " contains inequalities.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generator(const char* method,
+                                   const char* g_name) {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "*this is an empty grid and "
+    << g_name << " is not a point.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generators(const char* method,
+                                    const char* gs_name) {
+  std::ostringstream s;
+  s << "PPL::Grid::" << method << ":" << std::endl
+    << "*this is an empty grid and" << std::endl
+    << "the non-empty generator system " << gs_name << " contains no points.";
+  throw std::invalid_argument(s.str());
+}
diff --git a/src/Grid_public.cc b/src/Grid_public.cc
new file mode 100644
index 0000000..d2dcea2
--- /dev/null
+++ b/src/Grid_public.cc
@@ -0,0 +1,2890 @@
+/* Grid class implementation (non-inline public functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "Topology_types.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// TODO: In the Grid constructors adapt and use the given system if it
+//       is modifiable, instead of using a copy.
+
+PPL::Grid::Grid(const Grid& y, Complexity_Class)
+  : con_sys(),
+    gen_sys(),
+    status(y.status),
+    space_dim(y.space_dim),
+    dim_kinds(y.dim_kinds) {
+  if (space_dim == 0) {
+    con_sys = y.con_sys;
+    gen_sys = y.gen_sys;
+  }
+  else {
+    if (y.congruences_are_up_to_date())
+      con_sys = y.con_sys;
+    else
+      con_sys.set_space_dimension(space_dim);
+    if (y.generators_are_up_to_date())
+      gen_sys = y.gen_sys;
+    else
+      gen_sys = Grid_Generator_System(y.space_dim);
+  }
+}
+
+PPL::Grid::Grid(const Constraint_System& cs)
+  : con_sys(check_space_dimension_overflow(cs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(cs)",
+                                           "the space dimension of cs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(cs.space_dimension()) {
+  space_dim = cs.space_dimension();
+
+  if (space_dim == 0) {
+    // See if an inconsistent constraint has been passed.
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i)
+      if (i->is_inconsistent()) {
+        // Inconsistent constraint found: the grid is empty.
+        status.set_empty();
+        // Insert the zero dim false congruence system into `con_sys'.
+        // `gen_sys' is already in empty form.
+        con_sys.insert(Congruence::zero_dim_false());
+        PPL_ASSERT(OK());
+        return;
+      }
+    set_zero_dim_univ();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  Congruence_System cgs(cs.space_dimension());
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      cgs.insert(*i);
+    else
+      throw_invalid_constraints("Grid(cs)", "cs");
+  construct(cgs);
+}
+
+PPL::Grid::Grid(Constraint_System& cs, Recycle_Input)
+  : con_sys(check_space_dimension_overflow(cs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(cs, recycle)",
+                                           "the space dimension of cs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(cs.space_dimension()) {
+  space_dim = cs.space_dimension();
+
+  if (space_dim == 0) {
+    // See if an inconsistent constraint has been passed.
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i)
+      if (i->is_inconsistent()) {
+        // Inconsistent constraint found: the grid is empty.
+        status.set_empty();
+        // Insert the zero dim false congruence system into `con_sys'.
+        // `gen_sys' is already in empty form.
+        con_sys.insert(Congruence::zero_dim_false());
+        PPL_ASSERT(OK());
+        return;
+      }
+    set_zero_dim_univ();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  Congruence_System cgs(space_dim);
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      cgs.insert(*i);
+    else
+      throw_invalid_constraint("Grid(cs)", "cs");
+  construct(cgs);
+}
+
+PPL::Grid::Grid(const Polyhedron& ph,
+                Complexity_Class complexity)
+  : con_sys(check_space_dimension_overflow(ph.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(ph)",
+                                           "the space dimension of ph "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(ph.space_dimension()) {
+  space_dim = ph.space_dimension();
+
+  // A zero-dim polyhedron causes no complexity problems.
+  if (space_dim == 0) {
+    if (ph.is_empty())
+      set_empty();
+    else
+      set_zero_dim_univ();
+    return;
+  }
+
+  // A polyhedron known to be empty causes no complexity problems.
+  if (ph.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  const bool use_constraints = ph.constraints_are_minimized()
+    || !ph.generators_are_up_to_date();
+
+  // Minimize the constraint description if it is needed and
+  // the complexity allows it.
+  if (use_constraints && complexity == ANY_COMPLEXITY)
+    if (!ph.minimize()) {
+      set_empty();
+      return;
+    }
+
+  if (use_constraints) {
+    // Only the equality constraints need be used.
+    PPL_ASSERT(ph.constraints_are_up_to_date());
+    const Constraint_System& cs = ph.constraints();
+    Congruence_System cgs(space_dim);
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i)
+      if (i->is_equality())
+        cgs.insert(*i);
+    construct(cgs);
+  }
+  else {
+    // First find a point or closure point and convert it to a
+    // grid point and add to the (initially empty) set of grid generators.
+    PPL_ASSERT(ph.generators_are_up_to_date());
+    const Generator_System& gs = ph.generators();
+    Grid_Generator_System ggs(space_dim);
+    Linear_Expression point_expr;
+    point_expr.set_space_dimension(space_dim);
+    PPL_DIRTY_TEMP_COEFFICIENT(point_divisor);
+    for (Generator_System::const_iterator g = gs.begin(),
+           gs_end = gs.end(); g != gs_end; ++g) {
+      if (g->is_point() || g->is_closure_point()) {
+        point_expr.linear_combine(g->expr, Coefficient_one(), Coefficient_one(),
+                                  1, space_dim + 1);
+        point_divisor = g->divisor();
+        ggs.insert(grid_point(point_expr, point_divisor));
+        break;
+      }
+    }
+    // Add grid lines for all the other generators.
+    // If the polyhedron's generator is a (closure) point, the grid line must
+    // have the direction given by a line that joins the grid point already
+    // inserted and the new point.
+    for (Generator_System::const_iterator g = gs.begin(),
+           gs_end = gs.end(); g != gs_end; ++g) {
+      Linear_Expression e;
+      e.set_space_dimension(space_dim);
+      if (g->is_point() || g->is_closure_point()) {
+        e.linear_combine(point_expr, Coefficient_one(), g->divisor(),
+                         1, space_dim + 1);
+        e.linear_combine(g->expr, Coefficient_one(), -point_divisor,
+                         1, space_dim + 1);
+        if (e.all_homogeneous_terms_are_zero())
+          continue;
+      }
+      else {
+        e.linear_combine(g->expr, Coefficient_one(), Coefficient_one(),
+                         1, space_dim + 1);
+      }
+      ggs.insert(grid_line(e));
+    }
+    construct(ggs);
+  }
+  PPL_ASSERT(OK());
+}
+
+PPL::Grid&
+PPL::Grid::operator=(const Grid& y) {
+  space_dim = y.space_dim;
+  dim_kinds = y.dim_kinds;
+  if (y.marked_empty())
+    set_empty();
+  else if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    status = y.status;
+    if (y.congruences_are_up_to_date())
+      con_sys = y.con_sys;
+    if (y.generators_are_up_to_date())
+      gen_sys = y.gen_sys;
+  }
+  return *this;
+}
+
+PPL::dimension_type
+PPL::Grid::affine_dimension() const {
+  if (space_dim == 0 || is_empty())
+    return 0;
+
+  if (generators_are_up_to_date()) {
+    if (generators_are_minimized())
+      return gen_sys.num_rows() - 1;
+    if (!(congruences_are_up_to_date() && congruences_are_minimized()))
+      return minimized_grid_generators().num_rows() - 1;
+  }
+  else
+    minimized_congruences();
+  PPL_ASSERT(congruences_are_minimized());
+  dimension_type d = space_dim;
+  for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+    if (con_sys[i].is_equality())
+      --d;
+  return d;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::congruences() const {
+  if (marked_empty())
+    return con_sys;
+
+  if (space_dim == 0) {
+    // Zero-dimensional universe.
+    PPL_ASSERT(con_sys.num_rows() == 0 && con_sys.space_dimension() == 0);
+    return con_sys;
+  }
+
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  return con_sys;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::minimized_congruences() const {
+  if (congruences_are_up_to_date() && !congruences_are_minimized()) {
+    // Minimize the congruences.
+    Grid& gr = const_cast<Grid&>(*this);
+    if (gr.simplify(gr.con_sys, gr.dim_kinds))
+      gr.set_empty();
+    else
+      gr.set_congruences_minimized();
+  }
+  return congruences();
+}
+
+const PPL::Grid_Generator_System&
+PPL::Grid::grid_generators() const {
+  if (space_dim == 0) {
+    PPL_ASSERT(gen_sys.space_dimension() == 0
+               && gen_sys.num_rows() == (marked_empty() ? 0U : 1U));
+    return gen_sys;
+  }
+
+  if (marked_empty()) {
+    PPL_ASSERT(gen_sys.has_no_rows());
+    return gen_sys;
+  }
+
+  if (!generators_are_up_to_date() && !update_generators()) {
+    // Updating found the grid empty.
+    const_cast<Grid&>(*this).set_empty();
+    return gen_sys;
+  }
+
+  return gen_sys;
+}
+
+const PPL::Grid_Generator_System&
+PPL::Grid::minimized_grid_generators() const {
+  if (space_dim == 0) {
+    PPL_ASSERT(gen_sys.space_dimension() == 0
+               && gen_sys.num_rows() == (marked_empty() ? 0U : 1U));
+    return gen_sys;
+  }
+
+  if (marked_empty()) {
+    PPL_ASSERT(gen_sys.has_no_rows());
+    return gen_sys;
+  }
+
+  if (generators_are_up_to_date()) {
+    if (!generators_are_minimized()) {
+      // Minimize the generators.
+      Grid& gr = const_cast<Grid&>(*this);
+      gr.simplify(gr.gen_sys, gr.dim_kinds);
+      gr.set_generators_minimized();
+    }
+  }
+  else if (!update_generators()) {
+    // Updating found the grid empty.
+    const_cast<Grid&>(*this).set_empty();
+    return gen_sys;
+  }
+
+  return gen_sys;
+}
+
+PPL::Poly_Con_Relation
+PPL::Grid::relation_with(const Congruence& cg) const {
+  // Dimension-compatibility check.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("relation_with(cg)", "cg", cg);
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else if (cg.is_equality())
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  if (!generators_are_up_to_date() && !update_generators())
+    // Updating found the grid empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  // Return one of the relations
+  // 'strictly_intersects'   a strict subset of the grid points satisfy cg
+  // 'is_included'           every grid point satisfies cg
+  // 'is_disjoint'           cg and the grid occupy separate spaces.
+
+  // There is always a point.
+
+  // Scalar product of the congruence and the first point that
+  // satisfies the congruence.
+  PPL_DIRTY_TEMP_COEFFICIENT(point_sp);
+  point_sp = 0;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(div);
+  div = cg.modulus();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sp);
+
+  bool known_to_intersect = false;
+
+  for (Grid_Generator_System::const_iterator i = gen_sys.begin(),
+         i_end = gen_sys.end(); i != i_end; ++i) {
+    const Grid_Generator& g = *i;
+    Scalar_Products::assign(sp, cg, g);
+
+    switch (g.type()) {
+
+    case Grid_Generator::POINT:
+      if (cg.is_proper_congruence())
+        sp %= div;
+      if (sp == 0) {
+        // The point satisfies the congruence.
+        if (point_sp == 0)
+          // Any previous points satisfied the congruence.
+          known_to_intersect = true;
+        else
+          return Poly_Con_Relation::strictly_intersects();
+      }
+      else {
+        if (point_sp == 0) {
+          if (known_to_intersect)
+            return Poly_Con_Relation::strictly_intersects();
+          // Assign `sp' to `point_sp' as `sp' is the scalar product
+          // of cg and a point g and is non-zero.
+          point_sp = sp;
+        }
+        else {
+          // A previously considered point p failed to satisfy cg such that
+          // `point_sp' = `scalar_prod(p, cg)'
+          // so, if we consider the parameter g-p instead of g, we have
+          // scalar_prod(g-p, cg) = scalar_prod(g, cg) - scalar_prod(p, cg)
+          //                      = sp - point_sp
+          sp -= point_sp;
+
+          if (sp != 0) {
+            // Find the GCD between sp and the previous GCD.
+            gcd_assign(div, div, sp);
+            if (point_sp % div == 0)
+              // There is a point in the grid satisfying cg.
+              return Poly_Con_Relation::strictly_intersects();
+          }
+        }
+      }
+      break;
+
+    case Grid_Generator::PARAMETER:
+      if (cg.is_proper_congruence())
+        sp %= (div * g.divisor());
+      if (sp == 0)
+        // Parameter g satisfies the cg so the relation depends
+        // entirely on the other generators.
+        break;
+      if (known_to_intersect)
+        // At least one point satisfies cg.  However, the sum of such
+        // a point and the parameter g fails to satisfy cg (due to g).
+        return Poly_Con_Relation::strictly_intersects();
+      // Find the GCD between sp and the previous GCD.
+      gcd_assign(div, div, sp);
+      if (point_sp != 0) {
+        // At least one of any previously encountered points fails to
+        // satisfy cg.
+        if (point_sp % div == 0)
+          // There is also a grid point that satisfies cg.
+          return Poly_Con_Relation::strictly_intersects();
+      }
+      break;
+
+    case Grid_Generator::LINE:
+      if (sp == 0)
+        // Line g satisfies the cg so the relation depends entirely on
+        // the other generators.
+        break;
+
+      // Line g intersects the congruence.
+      //
+      // There is a point p in the grid.  Suppose <p*cg> = p_sp.  Then
+      // (-p_sp/sp)*g + p is a point that satisfies cg: <((-p_sp/sp)*g
+      // + p).cg> = -(p_sp/sp)*sp + p_sp) = 0.  If p does not satisfy
+      // `cg' and hence is not in the grid defined by `cg', the grid
+      // `*this' strictly intersects the `cg' grid.  On the other
+      // hand, if `p' is in the grid defined by `cg' so that p_sp = 0,
+      // then <p+g.cg> = p_sp + sp != 0; thus `p+g' is a point in
+      // *this that does not satisfy `cg' and hence `p+g' is a point
+      // in *this not in the grid defined by `cg'; therefore `*this'
+      // strictly intersects the `cg' grid.
+      return Poly_Con_Relation::strictly_intersects();
+    }
+  }
+
+  if (point_sp == 0) {
+    if (cg.is_equality())
+      // Every generator satisfied the cg.
+      return Poly_Con_Relation::is_included()
+        && Poly_Con_Relation::saturates();
+    else
+      // Every generator satisfied the cg.
+      return Poly_Con_Relation::is_included();
+  }
+
+  PPL_ASSERT(!known_to_intersect);
+  return Poly_Con_Relation::is_disjoint();
+}
+
+PPL::Poly_Gen_Relation
+PPL::Grid::relation_with(const Grid_Generator& g) const {
+  // Dimension-compatibility check.
+  if (space_dim < g.space_dimension())
+    throw_dimension_incompatible("relation_with(g)", "g", g);
+
+  // The empty grid cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe grid in a zero-dimensional space subsumes all the
+  // generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  return
+    con_sys.satisfies_all_congruences(g)
+    ? Poly_Gen_Relation::subsumes()
+    : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Gen_Relation
+PPL::Grid::relation_with(const Generator& g) const {
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", "g", g);
+
+  // The empty grid cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe grid in a zero-dimensional space subsumes all the
+  // generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  const Linear_Expression expr(g.expression());
+  Grid_Generator gg(grid_point());
+  if (g.is_point() || g.is_closure_point())
+    // Points and closure points are converted to grid points.
+    gg = grid_point(expr, g.divisor());
+  else
+    // The generator is a ray or line.
+    // In both cases, we convert it to a grid line
+    gg = grid_line(expr);
+
+  return
+    con_sys.satisfies_all_congruences(gg)
+    ? Poly_Gen_Relation::subsumes()
+    : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Con_Relation
+PPL::Grid::relation_with(const Constraint& c) const {
+  // Dimension-compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("relation_with(c)", "c", c);
+
+  if (c.is_equality()) {
+    const Congruence cg(c);
+    return relation_with(cg);
+  }
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      &&  Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (c.is_inconsistent())
+      if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+        // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+        // thus, the zero-dimensional point also saturates it.
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_disjoint();
+    else if (c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (!generators_are_up_to_date() && !update_generators())
+    // Updating found the grid empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  // Return one of the relations
+  // 'strictly_intersects'   a strict subset of the grid points satisfy c
+  // 'is_included'           every grid point satisfies c
+  // 'is_disjoint'           c and the grid occupy separate spaces.
+
+  // There is always a point.
+
+  bool point_is_included = false;
+  bool point_saturates = false;
+  const Grid_Generator* first_point = 0;
+
+  for (Grid_Generator_System::const_iterator i = gen_sys.begin(),
+         i_end = gen_sys.end(); i != i_end; ++i) {
+    const Grid_Generator& g = *i;
+    switch (g.type()) {
+    case Grid_Generator::POINT:
+      {
+        if (first_point == 0) {
+          first_point = &g;
+          const int sign = Scalar_Products::sign(c, g);
+          if (sign == 0)
+            point_saturates = !c.is_strict_inequality();
+          else if (sign > 0)
+            point_is_included = !c.is_equality();
+          break;
+        }
+        // Not the first point: convert `g' to be a parameter
+        // and fall through into the parameter case.
+        Grid_Generator& gen = const_cast<Grid_Generator&>(g);
+        const Grid_Generator& point = *first_point;
+        const Coefficient& p_div = point.divisor();
+        const Coefficient& g_div = gen.divisor();
+        gen.expr.linear_combine(point.expr, p_div, -g_div,
+                                1, gen.expr.space_dimension());
+        gen.expr.set_inhomogeneous_term(g_div * p_div);
+        gen.strong_normalize();
+        gen.set_is_parameter();
+        PPL_ASSERT(gen.OK());
+      }
+      // Intentionally fall through.
+
+    case Grid_Generator::PARAMETER:
+    case Grid_Generator::LINE:
+      {
+        const int sign = c.is_strict_inequality()
+          ? Scalar_Products::reduced_sign(c.expr, g.expr)
+          : Scalar_Products::sign(c.expr, g.expr);
+        if (sign != 0)
+          return Poly_Con_Relation::strictly_intersects();
+      }
+      break;
+    } // switch
+  }
+
+  // If this program point is reached, then all lines and parameters
+  // saturate the constraint. Hence, the result is determined by
+  // the previosly computed relation with the point.
+  if (point_saturates)
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included();
+
+  if (point_is_included)
+    return Poly_Con_Relation::is_included();
+
+  return Poly_Con_Relation::is_disjoint();
+}
+
+bool
+PPL::Grid::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date then the
+  // generator system (since it is well formed) contains a point.
+  if (generators_are_up_to_date())
+    return false;
+  if (space_dim == 0)
+    return false;
+  if (congruences_are_minimized())
+    // If the grid was empty it would be marked empty.
+    return false;
+  // Minimize the congruences to check if the grid is empty.
+  Grid& gr = const_cast<Grid&>(*this);
+  if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+    gr.set_empty();
+    return true;
+  }
+  gr.set_congruences_minimized();
+  return false;
+}
+
+bool
+PPL::Grid::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  if (space_dim == 0)
+    return true;
+
+  if (congruences_are_up_to_date()) {
+    if (congruences_are_minimized())
+      // The minimized universe congruence system has only one row,
+      // the integrality congruence.
+      return con_sys.num_rows() == 1 && con_sys[0].is_tautological();
+  }
+  else {
+    update_congruences();
+    return con_sys.num_rows() == 1 && con_sys[0].is_tautological();
+  }
+
+  // Test con_sys's inclusion in a universe generator system.
+
+  // The zero dimension cases are handled above.
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    Linear_Expression expr;
+    expr.set_space_dimension(space_dim);
+    expr += Variable(i);
+    if (!con_sys.satisfies_all_congruences(grid_line(expr)))
+      return false;
+  }
+#ifndef NDEBUG
+  Linear_Expression expr;
+  expr.set_space_dimension(space_dim);
+  PPL_ASSERT(con_sys.satisfies_all_congruences(grid_point(expr)));
+#endif
+  return true;
+}
+
+bool
+PPL::Grid::is_bounded() const {
+  // A zero-dimensional or empty grid is bounded.
+  if (space_dim == 0
+      || marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // TODO: Consider using con_sys when gen_sys is out of date.
+
+  if (gen_sys.num_rows() > 1) {
+    // Check if all generators are the same point.
+    const Grid_Generator& first_point = gen_sys[0];
+    if (first_point.is_line_or_parameter())
+      return false;
+    for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) {
+      const Grid_Generator& gen = gen_sys[row];
+      if (gen.is_line_or_parameter() || gen != first_point)
+        return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::Grid::is_discrete() const {
+  // A zero-dimensional or empty grid is discrete.
+  if (space_dim == 0
+      || marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // Search for lines in the generator system.
+  for (dimension_type row = gen_sys.num_rows(); row-- > 1; )
+    if (gen_sys[row].is_line())
+      return false;
+
+  // The system of generators is composed only by
+  // points and parameters: the grid is discrete.
+  return true;
+}
+
+bool
+PPL::Grid::is_topologically_closed() const {
+  return true;
+}
+
+bool
+PPL::Grid::contains_integer_point() const {
+  // Empty grids have no points.
+  if (marked_empty())
+    return false;
+
+  // A zero-dimensional, universe grid has, by convention, an
+  // integer point.
+  if (space_dim == 0)
+    return true;
+
+  // A grid has an integer point if its intersection with the integer
+  // grid is non-empty.
+  Congruence_System cgs;
+  for (dimension_type var_index = space_dim; var_index-- > 0; )
+    cgs.insert(Variable(var_index) %= 0);
+
+  Grid gr = *this;
+  gr.add_recycled_congruences(cgs);
+  return !gr.is_empty();
+}
+
+bool
+PPL::Grid::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // An empty grid constrains all variables.
+  if (marked_empty())
+    return true;
+
+  if (generators_are_up_to_date()) {
+    // Since generators are up-to-date, the generator system (since it is
+    // well formed) contains a point.  Hence the grid is not empty.
+    if (congruences_are_up_to_date())
+      // Here a variable is constrained if and only if it is
+      // syntactically constrained.
+      goto syntactic_check;
+
+    if (generators_are_minimized()) {
+      // Try a quick, incomplete check for the universe grid:
+      // a universe grid constrains no variable.
+      // Count the number of lines (they are linearly independent).
+      dimension_type num_lines = 0;
+      for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+        if (gen_sys[i].is_line())
+          ++num_lines;
+
+      if (num_lines == space_dim)
+        return false;
+    }
+
+    // Scan generators: perhaps we will find line(var).
+    for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+      const Grid_Generator& g_i = gen_sys[i];
+      if (!g_i.is_line())
+        continue;
+      if (sgn(g_i.coefficient(var)) != 0) {
+        if (g_i.expression().all_zeroes(1, var.space_dimension())
+            && g_i.expression().all_zeroes(var.space_dimension() + 1, space_dim + 1))
+          // The only nonzero coefficient in g_i is the one of var.
+          return true;
+      }
+    }
+
+    // We are still here: at least we know that the grid is not empty.
+    update_congruences();
+    goto syntactic_check;
+  }
+
+  // We must minimize to detect emptiness and obtain constraints.
+  if (!minimize())
+    return true;
+
+ syntactic_check:
+  for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+    if (con_sys[i].coefficient(var) != 0)
+      return true;
+  return false;
+}
+
+bool
+PPL::Grid::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    goto fail;
+
+  if (marked_empty()) {
+    if (check_not_empty) {
+      // The caller does not want the grid to be empty.
+#ifndef NDEBUG
+      cerr << "Empty grid!" << endl;
+#endif
+      goto fail;
+    }
+
+    if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+      cerr << "The grid is in a space of dimension " << space_dim
+           << " while the system of congruences is in a space of dimension "
+           << con_sys.space_dimension()
+           << endl;
+#endif
+      goto fail;
+    }
+    return true;
+  }
+
+  // A zero-dimensional universe grid is legal only if the system of
+  // congruences `con_sys' is empty, and the generator system contains
+  // one point.
+  if (space_dim == 0) {
+    if (con_sys.has_no_rows())
+      if (gen_sys.num_rows() == 1 && gen_sys[0].is_point())
+        return true;
+#ifndef NDEBUG
+    cerr << "Zero-dimensional grid should have an empty congruence" << endl
+         << "system and a generator system of a single point." << endl;
+#endif
+    goto fail;
+  }
+
+  // A grid is defined by a system of congruences or a system of
+  // generators.  At least one of them must be up to date.
+  if (!congruences_are_up_to_date() && !generators_are_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "Grid not empty, not zero-dimensional" << endl
+         << "and with neither congruences nor generators up-to-date!"
+         << endl;
+#endif
+    goto fail;
+  }
+
+  {
+    // The expected number of columns in the congruence and generator
+    // systems, if they are not empty.
+    const dimension_type num_columns = space_dim + 1;
+
+    // Here we check if the size of the matrices is consistent.
+    // Let us suppose that all the matrices are up-to-date; this means:
+    // `con_sys' : number of congruences x poly_num_columns
+    // `gen_sys' : number of generators  x poly_num_columns
+    if (congruences_are_up_to_date())
+      if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (con_sys and space_dim)"
+             << endl;
+#endif
+        goto fail;
+      }
+
+    if (generators_are_up_to_date()) {
+      if (gen_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (gen_sys and space_dim)"
+             << endl;
+#endif
+        goto fail;
+      }
+
+      // A non-empty system of generators describing a grid is valid
+      // if and only if it contains a point.
+      if (!gen_sys.has_no_rows() && !gen_sys.has_points()) {
+#ifndef NDEBUG
+        cerr << "Non-empty generator system declared up-to-date "
+             << "has no points!"
+             << endl;
+#endif
+        goto fail;
+      }
+
+      if (generators_are_minimized()) {
+        Grid_Generator_System gs = gen_sys;
+
+        if (dim_kinds.size() != num_columns) {
+#ifndef NDEBUG
+          cerr << "Size of dim_kinds should equal the number of columns."
+               << endl;
+#endif
+          goto fail;
+        }
+
+        if (!upper_triangular(gs, dim_kinds)) {
+#ifndef NDEBUG
+          cerr << "Reduced generators should be upper triangular."
+               << endl;
+#endif
+          goto fail;
+        }
+
+        // Check that dim_kinds corresponds to the row kinds in gen_sys.
+        for (dimension_type dim = space_dim,
+               row = gen_sys.num_rows(); dim > 0; --dim) {
+          if (dim_kinds[dim] == GEN_VIRTUAL)
+            goto ok;
+          if (gen_sys[--row].is_parameter_or_point()
+              && dim_kinds[dim] == PARAMETER)
+            goto ok;
+          PPL_ASSERT(gen_sys[row].is_line());
+          if (dim_kinds[dim] == LINE)
+            goto ok;
+#ifndef NDEBUG
+          cerr << "Kinds in dim_kinds should match those in gen_sys."
+               << endl;
+#endif
+          goto fail;
+        ok:
+          PPL_ASSERT(row <= dim);
+        }
+
+        // A reduced generator system must be the same as a temporary
+        // reduced copy.
+        Dimension_Kinds dim_kinds_copy = dim_kinds;
+        // `gs' is minimized and marked_empty returned false, so `gs'
+        // should contain rows.
+        PPL_ASSERT(!gs.has_no_rows());
+        simplify(gs, dim_kinds_copy);
+        // gs contained rows before being reduced, so it should
+        // contain at least a single point afterward.
+        PPL_ASSERT(!gs.has_no_rows());
+        for (dimension_type row = gen_sys.num_rows(); row-- > 0; ) {
+          const Grid_Generator& g = gs[row];
+          const Grid_Generator& g_copy = gen_sys[row];
+          if (g.is_equal_to(g_copy))
+            continue;
+#ifndef NDEBUG
+          cerr << "Generators are declared minimized,"
+            " but they change under reduction.\n"
+               << "Here is the generator system:\n";
+          gen_sys.ascii_dump(cerr);
+          cerr << "and here is the minimized form of the temporary copy:\n";
+          gs.ascii_dump(cerr);
+#endif
+          goto fail;
+        }
+      }
+
+    } // if (congruences_are_up_to_date())
+  }
+
+  if (congruences_are_up_to_date()) {
+    // Check if the system of congruences is well-formed.
+    if (!con_sys.OK())
+      goto fail;
+
+    Grid tmp_gr = *this;
+    // Make a copy here, before changing tmp_gr, to check later.
+    const Congruence_System cs_copy = tmp_gr.con_sys;
+
+    // Clear the generators in tmp_gr.
+    Grid_Generator_System gs(space_dim);
+    tmp_gr.gen_sys.m_swap(gs);
+    tmp_gr.clear_generators_up_to_date();
+
+    if (!tmp_gr.update_generators()) {
+      if (check_not_empty) {
+        // Want to know the satisfiability of the congruences.
+#ifndef NDEBUG
+        cerr << "Unsatisfiable system of congruences!"
+             << endl;
+#endif
+        goto fail;
+      }
+      // The grid is empty, all checks are done.
+      return true;
+    }
+
+    if (congruences_are_minimized()) {
+      // A reduced congruence system must be lower triangular.
+      if (!lower_triangular(con_sys, dim_kinds)) {
+#ifndef NDEBUG
+        cerr << "Reduced congruences should be lower triangular." << endl;
+#endif
+        goto fail;
+      }
+
+      // If the congruences are minimized, all the elements in the
+      // congruence system must be the same as those in the temporary,
+      // minimized system `cs_copy'.
+      if (!con_sys.is_equal_to(cs_copy)) {
+#ifndef NDEBUG
+        cerr << "Congruences are declared minimized, but they change under reduction!"
+             << endl
+             << "Here is the minimized form of the congruence system:"
+             << endl;
+        cs_copy.ascii_dump(cerr);
+        cerr << endl;
+#endif
+        goto fail;
+      }
+
+      if (dim_kinds.size() != con_sys.space_dimension() + 1 /* inhomogeneous term */) {
+#ifndef NDEBUG
+        cerr << "Size of dim_kinds should equal the number of columns."
+             << endl;
+#endif
+        goto fail;
+      }
+
+      // Check that dim_kinds corresponds to the row kinds in con_sys.
+      for (dimension_type dim = space_dim, row = 0; dim > 0; --dim) {
+        if (dim_kinds[dim] == CON_VIRTUAL)
+            continue;
+        if (con_sys[row++].is_proper_congruence()
+            && dim_kinds[dim] == PROPER_CONGRUENCE)
+          continue;
+        PPL_ASSERT(con_sys[row-1].is_equality());
+        if (dim_kinds[dim] == EQUALITY)
+          continue;
+#ifndef NDEBUG
+        cerr << "Kinds in dim_kinds should match those in con_sys." << endl;
+#endif
+        goto fail;
+      }
+    }
+  }
+
+  return true;
+
+ fail:
+#ifndef NDEBUG
+  cerr << "Here is the grid under check:" << endl;
+  ascii_dump(cerr);
+#endif
+  return false;
+}
+
+void
+PPL::Grid::add_constraints(const Constraint_System& cs) {
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", "cs", cs);
+  if (marked_empty())
+    return;
+
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    add_constraint_no_check(*i);
+    if (marked_empty())
+      return;
+  }
+}
+
+void
+PPL::Grid::add_grid_generator(const Grid_Generator& g) {
+  // The dimension of `g' must be at most space_dim.
+  const dimension_type g_space_dim = g.space_dimension();
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("add_grid_generator(g)", "g", g);
+
+  // Deal with zero-dimension case first.
+  if (space_dim == 0) {
+    // Points and parameters are the only zero-dimension generators
+    // that can be created.
+    if (marked_empty()) {
+      if (g.is_parameter())
+        throw_invalid_generator("add_grid_generator(g)", "g");
+      set_zero_dim_univ();
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Here the grid is empty: the specification says we can only
+    // insert a point.
+    if (g.is_line_or_parameter())
+      throw_invalid_generator("add_grid_generator(g)", "g");
+    gen_sys.insert(g);
+    clear_empty();
+  }
+  else {
+    PPL_ASSERT(generators_are_up_to_date());
+    gen_sys.insert(g);
+    if (g.is_parameter_or_point())
+      normalize_divisors(gen_sys);
+  }
+
+  // With the added generator, congruences are out of date.
+  clear_congruences_up_to_date();
+
+  clear_generators_minimized();
+  set_generators_up_to_date();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_recycled_congruences(Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (space_dim < cgs_space_dim)
+    throw_dimension_incompatible("add_recycled_congruences(cgs)", "cgs", cgs);
+
+  if (cgs.has_no_rows())
+    return;
+
+  if (marked_empty())
+    return;
+
+  if (space_dim == 0) {
+    // In a 0-dimensional space the congruences are trivial (e.g., 0
+    // == 0 or 1 %= 0) or false (e.g., 1 == 0).  In a system of
+    // congruences `begin()' and `end()' are equal if and only if the
+    // system contains only trivial congruences.
+    if (cgs.begin() != cgs.end())
+      // There is a congruence, it must be false, the grid becomes empty.
+      set_empty();
+    return;
+  }
+
+  // The congruences are required.
+  if (!congruences_are_up_to_date())
+    update_congruences();
+
+  // Swap (instead of copying) the coefficients of `cgs' (which is
+  // writable).
+  con_sys.insert(cgs, Recycle_Input());
+
+  // Congruences may not be minimized and generators are out of date.
+  clear_congruences_minimized();
+  clear_generators_up_to_date();
+  // Note: the congruence system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_recycled_grid_generators(Grid_Generator_System& gs) {
+  // Dimension-compatibility check.
+  const dimension_type gs_space_dim = gs.space_dimension();
+  if (space_dim < gs_space_dim)
+    throw_dimension_incompatible("add_recycled_grid_generators(gs)", "gs", gs);
+
+  // Adding no generators leaves the grid the same.
+  if (gs.has_no_rows())
+    return;
+
+  // Adding valid generators to a zero-dimensional grid transforms it
+  // to the zero-dimensional universe grid.
+  if (space_dim == 0) {
+    if (marked_empty())
+      set_zero_dim_univ();
+    else {
+      PPL_ASSERT(gs.has_points());
+    }
+    PPL_ASSERT(OK(true));
+    return;
+  }
+
+  if (!marked_empty()) {
+    // The grid contains at least one point.
+
+    if (!generators_are_up_to_date())
+      update_generators();
+    normalize_divisors(gs, gen_sys);
+
+    gen_sys.insert(gs, Recycle_Input());
+
+    // Congruences are out of date and generators are not minimized.
+    clear_congruences_up_to_date();
+    clear_generators_minimized();
+
+    PPL_ASSERT(OK(true));
+    return;
+  }
+
+  // The grid is empty.
+
+  // `gs' must contain at least one point.
+  if (!gs.has_points())
+    throw_invalid_generators("add_recycled_grid_generators(gs)", "gs");
+
+  // Adjust `gs' to the right dimension.
+  gs.set_space_dimension(space_dim);
+
+  gen_sys.m_swap(gs);
+
+  normalize_divisors(gen_sys);
+
+  // The grid is no longer empty and generators are up-to-date.
+  set_generators_up_to_date();
+  clear_empty();
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::add_grid_generators(const Grid_Generator_System& gs) {
+  // TODO: this is just an executable specification.
+  Grid_Generator_System gs_copy = gs;
+  add_recycled_grid_generators(gs_copy);
+}
+
+void
+PPL::Grid::refine_with_constraint(const Constraint& c) {
+  // The dimension of `c' must be at most `space_dim'.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", "c", c);
+  if (marked_empty())
+    return;
+  refine_no_check(c);
+}
+
+void
+PPL::Grid::refine_with_constraints(const Constraint_System& cs) {
+  // The dimension of `cs' must be at most `space_dim'.
+  if (space_dim < cs.space_dimension())
+    throw_dimension_incompatible("refine_with_constraints(cs)", "cs", cs);
+
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+}
+
+void
+PPL::Grid::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  if (space_dim < var.space_dimension())
+    throw_dimension_incompatible("unconstrain(var)", var.space_dimension());
+
+  // Do something only if the grid is non-empty.
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  PPL_ASSERT(generators_are_up_to_date());
+  Grid_Generator l = grid_line(var);
+  gen_sys.insert(l, Recycle_Input());
+  // With the added generator, congruences are out of date.
+  clear_congruences_up_to_date();
+  clear_generators_minimized();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a grid in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Do something only if the grid is non-empty.
+  if (marked_empty()
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  PPL_ASSERT(generators_are_up_to_date());
+  // Since `gen_sys' is not empty, the space dimension of the inserted
+  // generators are automatically adjusted.
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi) {
+    Grid_Generator l = grid_line(Variable(*vsi));
+    gen_sys.insert(l, Recycle_Input());
+  }
+  // Constraints are no longer up-to-date.
+  clear_generators_minimized();
+  clear_congruences_up_to_date();
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::intersection_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", "y", y);
+
+  // If one of the two grids is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both grids are zero-dimensional, then at this point they are
+  // necessarily universe, so the intersection is also universe.
+  if (x.space_dim == 0)
+    return;
+
+  // The congruences must be up-to-date.
+  if (!x.congruences_are_up_to_date())
+    x.update_congruences();
+  if (!y.congruences_are_up_to_date())
+    y.update_congruences();
+
+  if (!y.con_sys.has_no_rows()) {
+    x.con_sys.insert(y.con_sys);
+    // Grid_Generators may be out of date and congruences may have changed
+    // from minimal form.
+    x.clear_generators_up_to_date();
+    x.clear_congruences_minimized();
+  }
+
+  PPL_ASSERT(x.OK() && y.OK());
+}
+
+void
+PPL::Grid::upper_bound_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("upper_bound_assign(y)", "y", y);
+
+  // The join of a grid `gr' with an empty grid is `gr'.
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty()) {
+    x = y;
+    return;
+  }
+
+  // If both grids are zero-dimensional, then they are necessarily
+  // universe grids, and so is their join.
+  if (x.space_dim == 0)
+    return;
+
+  // The generators must be up-to-date.
+  if (!x.generators_are_up_to_date() && !x.update_generators()) {
+    // Discovered `x' empty when updating generators.
+    x = y;
+    return;
+  }
+  if (!y.generators_are_up_to_date() && !y.update_generators())
+    // Discovered `y' empty when updating generators.
+    return;
+
+  // Match the divisors of the x and y generator systems.
+  Grid_Generator_System gs(y.gen_sys);
+  normalize_divisors(x.gen_sys, gs);
+  x.gen_sys.insert(gs, Recycle_Input());
+  // Congruences may be out of date and generators may have lost
+  // minimal form.
+  x.clear_congruences_up_to_date();
+  x.clear_generators_minimized();
+
+  // At this point both `x' and `y' are not empty.
+  PPL_ASSERT(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Grid::upper_bound_assign_if_exact(const Grid& y) {
+  const Grid& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("upper_bound_assign_if_exact(y)", "y", y);
+
+  if (x.marked_empty()
+      || y.marked_empty()
+      || x.space_dim == 0
+      || x.is_included_in(y)
+      || y.is_included_in(x)) {
+    upper_bound_assign(y);
+    return true;
+  }
+
+  // The above test 'x.is_included_in(y)' will ensure the generators of x
+  // are up to date.
+  PPL_ASSERT(generators_are_up_to_date());
+
+  Grid x_copy = x;
+  x_copy.upper_bound_assign(y);
+  x_copy.difference_assign(y);
+  if (x_copy.is_included_in(x)) {
+    upper_bound_assign(y);
+    return true;
+  }
+
+  return false;
+}
+
+void
+PPL::Grid::difference_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("difference_assign(y)", "y", y);
+
+  if (y.marked_empty() || x.marked_empty())
+    return;
+
+  // If both grids are zero-dimensional, then they are necessarily
+  // universe grids, so the result is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  Grid new_grid(x.space_dim, EMPTY);
+
+  const Congruence_System& y_cgs = y.congruences();
+  for (Congruence_System::const_iterator i = y_cgs.begin(),
+         y_cgs_end = y_cgs.end(); i != y_cgs_end; ++i) {
+    const Congruence& cg = *i;
+
+    // The 2-complement cg2 of cg = ((e %= 0) / m) is the congruence
+    // defining the sets of points exactly half-way between successive
+    // hyperplanes e = km and e = (k+1)m, for any integer k; that is,
+    // the hyperplanes defined by 2e = (2k + 1)m, for any integer k.
+    // Thus `cg2' is the congruence ((2e %= m) / 2m).
+
+    // As the grid difference must be a grid, only add the
+    // 2-complement congruence to x if the resulting grid includes all
+    // the points in x that did not satisfy `cg'.
+
+    // The 2-complement of cg can be included in the result only if x
+    // holds points other than those in cg.
+    if (x.relation_with(cg).implies(Poly_Con_Relation::is_included()))
+      continue;
+
+    if (cg.is_proper_congruence()) {
+      const Linear_Expression e(cg.expression());
+      // Congruence cg is ((e %= 0) / m).
+      const Coefficient& m = cg.modulus();
+      // If x is included in the grid defined by the congruences cg
+      // and its 2-complement (i.e. the grid defined by the congruence
+      // (2e %= 0) / m) then add the 2-complement to the potential
+      // result.
+      if (x.relation_with((2*e %= 0) / m)
+          .implies(Poly_Con_Relation::is_included())) {
+        Grid z = x;
+        z.add_congruence_no_check((2*e %= m) / (2*m));
+        new_grid.upper_bound_assign(z);
+        continue;
+      }
+    }
+    return;
+  }
+
+  *this = new_grid;
+
+  PPL_ASSERT(OK());
+}
+
+namespace {
+
+struct Ruled_Out_Pair {
+  PPL::dimension_type congruence_index;
+  PPL::dimension_type num_ruled_out;
+};
+
+struct Ruled_Out_Less_Than {
+  bool operator()(const Ruled_Out_Pair& x,
+                  const Ruled_Out_Pair& y) const {
+    return x.num_ruled_out > y.num_ruled_out;
+  }
+};
+
+} // namespace
+
+bool
+PPL::Grid::simplify_using_context_assign(const Grid& y) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("simplify_using_context_assign(y)", "y", y);
+
+  // Filter away the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.is_empty()) {
+      set_zero_dim_univ();
+      PPL_ASSERT(OK());
+      return false;
+    }
+    else
+      return !x.is_empty();
+  }
+
+  // If `y' is empty, the biggest enlargement for `x' is the universe.
+  if (!y.minimize()) {
+    Grid gr(x.space_dim, UNIVERSE);
+    m_swap(gr);
+    return false;
+  }
+
+  // If `x' is empty, the intersection is empty.
+  if (!x.minimize()) {
+    // Search for a congruence of `y' that is not a tautology.
+    PPL_ASSERT(y.congruences_are_up_to_date());
+    Grid gr(x.space_dim, UNIVERSE);
+    for (dimension_type i = y.con_sys.num_rows(); i-- > 0; ) {
+      const Congruence& y_con_sys_i = y.con_sys[i];
+      if (!y_con_sys_i.is_tautological()) {
+        // Found: we obtain a congruence `c' contradicting the one we
+        // found, and assign to `x' the grid `gr' with `c' as
+        // the only congruence.
+        const Linear_Expression le(y_con_sys_i.expression());
+        if (y_con_sys_i.is_equality()) {
+          gr.refine_no_check(le == 1);
+          break;
+        }
+        else {
+          const Coefficient& y_modulus_i = y_con_sys_i.modulus();
+          if (y_modulus_i > 1)
+            gr.refine_no_check(le == 1);
+          else {
+            Linear_Expression le2 = le;
+            le2 *= 2;
+            gr.refine_no_check(le2 == y_modulus_i);
+          }
+          break;
+        }
+      }
+    }
+    m_swap(gr);
+    PPL_ASSERT(OK());
+    return false;
+  }
+
+  PPL_ASSERT(x.congruences_are_minimized()
+         && y.generators_are_minimized());
+
+  const Congruence_System& x_cs = x.con_sys;
+  const dimension_type x_cs_num_rows = x_cs.num_rows();
+
+  // Record into `redundant_by_y' the info about which congruences of
+  // `x' are redundant in the context `y'.  Count the number of
+  // redundancies found.
+  std::vector<bool> redundant_by_y(x_cs_num_rows, false);
+  dimension_type num_redundant_by_y = 0;
+  for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+    if (y.relation_with(x_cs[i]).implies(Poly_Con_Relation::is_included())) {
+      redundant_by_y[i] = true;
+      ++num_redundant_by_y;
+    }
+  }
+
+  if (num_redundant_by_y < x_cs_num_rows) {
+
+    // Some congruences were not identified as redundant.
+
+    Congruence_System result_cs;
+    const Congruence_System& y_cs = y.con_sys;
+    const dimension_type y_cs_num_rows = y_cs.num_rows();
+    // Compute into `z' the intersection of `x' and `y'.
+    const bool x_first = (x_cs_num_rows > y_cs_num_rows);
+    Grid z(x_first ? x : y);
+    if (x_first)
+      z.add_congruences(y_cs);
+    else {
+      // Only copy (and then recycle) the non-redundant congruences.
+      Congruence_System tmp_cs;
+      for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+        if (!redundant_by_y[i])
+          tmp_cs.insert(x_cs[i]);
+      }
+      z.add_recycled_congruences(tmp_cs);
+    }
+
+    // Congruences are added to `w' until it equals `z'.
+    // We do not care about minimization or maximization, since
+    // we are only interested in satisfiability.
+    Grid w;
+    w.add_space_dimensions_and_embed(x.space_dim);
+    // First add the congruences for `y'.
+    w.add_congruences(y_cs);
+
+    // We apply the following heuristics here: congruences of `x' that
+    // are not made redundant by `y' are added to `w' depending on
+    // the number of generators of `y' they rule out (the more generators)
+    // (they rule out, the sooner they are added).  Of course, as soon
+    // as `w' becomes empty, we stop adding.
+    std::vector<Ruled_Out_Pair>
+      ruled_out_vec(x_cs_num_rows - num_redundant_by_y);
+
+    PPL_DIRTY_TEMP_COEFFICIENT(sp);
+    PPL_DIRTY_TEMP_COEFFICIENT(div);
+
+    for (dimension_type i = 0, j = 0; i < x_cs_num_rows; ++i) {
+      if (!redundant_by_y[i]) {
+        const Congruence& c = x_cs[i];
+        const Coefficient& modulus = c.modulus();
+        div = modulus;
+
+        const Grid_Generator_System& y_gs = y.gen_sys;
+        dimension_type num_ruled_out_generators = 0;
+        for (Grid_Generator_System::const_iterator k = y_gs.begin(),
+               y_gs_end = y_gs.end(); k != y_gs_end; ++k) {
+          const Grid_Generator& g = *k;
+          // If the generator is not to be ruled out,
+          // it must saturate the congruence.
+          Scalar_Products::assign(sp, c, g);
+          // If `c' is a proper congruence the scalar product must be
+          // reduced modulo a (possibly scaled) modulus.
+          if (c.is_proper_congruence()) {
+            // If `g' is a parameter the congruence modulus must be scaled
+            // up by the divisor of the generator.
+            if (g.is_parameter())
+              sp %= (div * g.divisor());
+            else
+              if (g.is_point())
+                sp %= div;
+          }
+          if (sp == 0)
+            continue;
+          ++num_ruled_out_generators;
+        }
+        ruled_out_vec[j].congruence_index = i;
+        ruled_out_vec[j].num_ruled_out = num_ruled_out_generators;
+        ++j;
+      }
+    }
+    std::sort(ruled_out_vec.begin(), ruled_out_vec.end(),
+              Ruled_Out_Less_Than());
+
+    const bool empty_intersection = (!z.minimize());
+
+    // Add the congruences in the "ruled out" order to `w'
+    // until the result is the intersection.
+    for (std::vector<Ruled_Out_Pair>::const_iterator
+           j = ruled_out_vec.begin(), ruled_out_vec_end = ruled_out_vec.end();
+         j != ruled_out_vec_end;
+         ++j) {
+      const Congruence& c = x_cs[j->congruence_index];
+      result_cs.insert(c);
+      w.add_congruence(c);
+      if ((empty_intersection && w.is_empty())
+          || (!empty_intersection && w.is_included_in(z))) {
+        Grid result_gr(x.space_dim, UNIVERSE);
+        result_gr.add_congruences(result_cs);
+        x.m_swap(result_gr);
+        PPL_ASSERT(x.OK());
+        return !empty_intersection;
+      }
+    }
+    // Cannot exit from here.
+    PPL_UNREACHABLE;
+  }
+
+  // All the congruences are redundant so that the simplified grid
+  // is the universe.
+  Grid result_gr(x.space_dim, UNIVERSE);
+  x.m_swap(result_gr);
+  PPL_ASSERT(x.OK());
+  return true;
+}
+
+void
+PPL::Grid::affine_image(const Variable var,
+                        const Linear_Expression& expr,
+                        Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' must be at most the dimension of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' must be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  Coefficient_traits::const_reference expr_var = expr.coefficient(var);
+
+  if (var_space_dim <= expr_space_dim
+      && expr_var != 0) {
+    // The transformation is invertible.
+    if (generators_are_up_to_date()) {
+      // Grid_Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+        gen_sys.affine_image(var, expr, denominator);
+      else
+        gen_sys.affine_image(var, -expr, -denominator);
+      clear_generators_minimized();
+      // Strong normalization in gs::affine_image may have modified
+      // divisors.
+      normalize_divisors(gen_sys);
+    }
+    if (congruences_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      if (expr_var > 0) {
+        inverse = -expr;
+        inverse.set_coefficient(var, denominator);
+        con_sys.affine_preimage(var, inverse, expr_var);
+      }
+      else {
+        // The new denominator is negative: we negate everything once
+        // more, as Congruence_System::affine_preimage() requires the
+        // third argument to be positive.
+        inverse = expr;
+        inverse.set_coefficient(var, -denominator);
+        con_sys.affine_preimage(var, inverse, -expr_var);
+      }
+      clear_congruences_minimized();
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of generators.
+    if (!generators_are_up_to_date())
+      minimize();
+    if (!marked_empty()) {
+      // Grid_Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+        gen_sys.affine_image(var, expr, denominator);
+      else
+        gen_sys.affine_image(var, -expr, -denominator);
+
+      clear_congruences_up_to_date();
+      clear_generators_minimized();
+      // Strong normalization in gs::affine_image may have modified
+      // divisors.
+      normalize_divisors(gen_sys);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+affine_preimage(const Variable var,
+                const Linear_Expression& expr,
+                Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  Coefficient_traits::const_reference expr_var = expr.coefficient(var);
+
+  if (var_space_dim <= expr_space_dim && expr_var != 0) {
+    // The transformation is invertible.
+    if (congruences_are_up_to_date()) {
+      // Congruence_System::affine_preimage() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+        con_sys.affine_preimage(var, expr, denominator);
+      else
+        con_sys.affine_preimage(var, -expr, -denominator);
+      clear_congruences_minimized();
+    }
+    if (generators_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      if (expr_var > 0) {
+        inverse = -expr;
+        inverse.set_coefficient(var, denominator);
+        gen_sys.affine_image(var, inverse, expr_var);
+      }
+      else {
+        // The new denominator is negative: we negate everything once
+        // more, as Grid_Generator_System::affine_image() requires the
+        // third argument to be positive.
+        inverse = expr;
+        inverse.set_coefficient(var, -denominator);
+        gen_sys.affine_image(var, inverse, -expr_var);
+      }
+      clear_generators_minimized();
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of congruences.
+    if (!congruences_are_up_to_date())
+      minimize();
+    // Congruence_System::affine_preimage() requires the third argument
+    // to be a positive Coefficient.
+    if (denominator > 0)
+      con_sys.affine_preimage(var, expr, denominator);
+    else
+      con_sys.affine_preimage(var, -expr, -denominator);
+
+    clear_generators_up_to_date();
+    clear_congruences_minimized();
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Variable var,
+                         const Relation_Symbol relsym,
+                         const Linear_Expression& expr,
+                         Coefficient_traits::const_reference denominator,
+                         Coefficient_traits::const_reference modulus) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+                           "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d, m)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d, m)",
+                                 "v", var);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_image(v, r, e, d, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    add_grid_generator(grid_line(var));
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  PPL_ASSERT(relsym == EQUAL);
+
+  affine_image(var, expr, denominator);
+
+  if (modulus == 0)
+    return;
+
+  // Modulate dimension `var' according to `modulus'.
+
+  if (!generators_are_up_to_date())
+    minimize();
+
+  // Test if minimization, possibly in affine_image, found an empty
+  // grid.
+  if (marked_empty())
+    return;
+
+  if (modulus < 0)
+    gen_sys.insert(parameter(-modulus * var));
+  else
+    gen_sys.insert(parameter(modulus * var));
+
+  normalize_divisors(gen_sys);
+
+  clear_generators_minimized();
+  clear_congruences_up_to_date();
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_preimage(const Variable var,
+                            const Relation_Symbol relsym,
+                            const Linear_Expression& expr,
+                            Coefficient_traits::const_reference denominator,
+                            Coefficient_traits::const_reference modulus) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+                           "d == 0");
+
+  // The dimension of `expr' should be at most the dimension of
+  // `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d, m)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d, m)",
+                                 "v", var);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+                           "r is the disequality relation symbol");
+
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_preimage(v, r, e, d, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    add_grid_generator(grid_line(var));
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  PPL_ASSERT(relsym == EQUAL);
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // Check whether the affine relation is an affine function.
+  if (modulus == 0) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_space_dim <= expr_space_dim && var_coefficient != 0) {
+    const Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
+    if (modulus < 0)
+      generalized_affine_image(var, EQUAL, inverse_expr, inverse_denominator,
+                               - modulus);
+    else
+      generalized_affine_image(var, EQUAL, inverse_expr, inverse_denominator,
+                               modulus);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot be
+  // easily computed by inverting the affine relation.  Add the
+  // congruence induced by the affine relation.
+  {
+    Congruence cg((denominator*var %= expr) / denominator);
+    if (modulus < 0)
+      cg /= -modulus;
+    else
+      cg /= modulus;
+    add_congruence_no_check(cg);
+  }
+
+  // If the resulting grid is empty, its preimage is empty too.
+  // Note: DO check for emptiness here, as we will later add a line.
+  if (is_empty())
+    return;
+  add_grid_generator(grid_line(var));
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Linear_Expression& lhs,
+                         const Relation_Symbol relsym,
+                         const Linear_Expression& rhs,
+                         Coefficient_traits::const_reference modulus) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should be at most the dimension of
+  // `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2, m)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should be at most the dimension of
+  // `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2, m)",
+                                 "e2", rhs);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2, m)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_image(e1, r, e2, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      add_grid_generator(grid_line(i.variable()));
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  PPL_ASSERT(relsym == EQUAL);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp_modulus);
+  tmp_modulus = modulus;
+  if (tmp_modulus < 0)
+    neg_assign(tmp_modulus);
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+
+  lhs_space_dim = lhs.last_nonzero();
+  if (lhs_space_dim == 0) {
+    // All variables have zero coefficients, so `lhs' is a constant.
+    add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+    return;
+  }
+
+  // Gather in `new_lines' the collections of all the lines having the
+  // direction of variables occurring in `lhs'.
+  Grid_Generator_System new_lines;
+  for (Linear_Expression::const_iterator i = lhs.begin(),
+        i_end = lhs.lower_bound(Variable(lhs_space_dim)); i != i_end; ++i)
+    new_lines.insert(grid_line(i.variable()));
+
+  const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+  if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, add an additional dimension.
+    const Variable new_var(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to the right hand side.
+    // TODO: Use add_congruence() when it has been updated.
+    Congruence_System new_cgs1(new_var == rhs);
+    add_recycled_congruences(new_cgs1);
+    if (!is_empty()) {
+      // The grid still contains points.
+
+      // Existentially quantify all the variables occurring in the left
+      // hand side expression.
+
+      // Adjust `new_lines' to the right dimension.
+      new_lines.set_space_dimension(space_dim);
+      // Add the lines to `gen_sys' (first make sure they are up-to-date).
+      update_generators();
+      gen_sys.insert(new_lines, Recycle_Input());
+      normalize_divisors(gen_sys);
+      // Update the flags.
+      clear_congruences_up_to_date();
+      clear_generators_minimized();
+
+      // Constrain the new dimension so that it is congruent to the left
+      // hand side expression modulo `modulus'.
+      // TODO: Use add_congruence() when it has been updated.
+      Congruence_System new_cgs2((lhs %= new_var) / tmp_modulus);
+      add_recycled_congruences(new_cgs2);
+    }
+
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Only add the lines and congruence if there are points.
+    if (is_empty())
+      return;
+
+    // Existentially quantify all the variables occurring in the left hand
+    // side expression.
+    add_recycled_grid_generators(new_lines);
+
+    // Constrain the left hand side expression so that it is congruent to
+    // the right hand side expression modulo `modulus'.
+    add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+  }
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_preimage(const Linear_Expression& lhs,
+                            const Relation_Symbol relsym,
+                            const Linear_Expression& rhs,
+                            Coefficient_traits::const_reference modulus) {
+  // The dimension of `lhs' must be at most the dimension of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2, m)",
+                                 "lhs", lhs);
+  // The dimension of `rhs' must be at most the dimension of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2, m)",
+                                 "e2", rhs);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2, m)",
+                           "r is the disequality relation symbol");
+
+  // Any preimage of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // If relsym is not EQUAL, then we return a safe approximation
+  // by adding a line in the direction of var.
+  if (relsym != EQUAL) {
+
+    if (modulus != 0)
+      throw_invalid_argument("generalized_affine_preimage(e1, r, e2, m)",
+                             "r != EQUAL && m != 0");
+
+    if (!generators_are_up_to_date())
+      minimize();
+
+    // Any image of an empty grid is empty.
+    if (marked_empty())
+      return;
+
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      add_grid_generator(grid_line(i.variable()));
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  PPL_ASSERT(relsym == EQUAL);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp_modulus);
+  tmp_modulus = modulus;
+  if (tmp_modulus < 0)
+    neg_assign(tmp_modulus);
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  lhs_space_dim = lhs.last_nonzero();
+  if (lhs_space_dim == 0) {
+    // All variables have zero coefficients, so `lhs' is a constant.
+    // In this case, preimage and image happen to be the same.
+    add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+    return;
+  }
+
+  // Gather in `new_lines' the collections of all the lines having
+  // the direction of variables occurring in `lhs'.
+  Grid_Generator_System new_lines;
+  for (Linear_Expression::const_iterator i = lhs.begin(),
+        i_end = lhs.lower_bound(Variable(lhs_space_dim)); i != i_end; ++i)
+      new_lines.insert(grid_line(i.variable()));
+
+  const dimension_type num_common_dims
+    = std::min(lhs_space_dim, rhs_space_dim);
+  if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, add an additional dimension.
+    const Variable new_var(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to `lhs'
+    // TODO: Use add_congruence() when it has been updated.
+    Congruence_System new_cgs1(new_var == lhs);
+    add_recycled_congruences(new_cgs1);
+    if (!is_empty()) {
+      // The grid still contains points.
+
+      // Existentially quantify all the variables occurring in the left
+      // hand side
+
+      // Adjust `new_lines' to the right dimension.
+      new_lines.set_space_dimension(space_dim);
+      // Add the lines to `gen_sys' (first make sure they are up-to-date).
+      update_generators();
+      gen_sys.insert(new_lines, Recycle_Input());
+      normalize_divisors(gen_sys);
+      // Update the flags.
+      clear_congruences_up_to_date();
+      clear_generators_minimized();
+
+      // Constrain the new dimension so that it is related to
+      // the right hand side modulo `modulus'.
+      // TODO: Use add_congruence() when it has been updated.
+      Congruence_System new_cgs2((rhs %= new_var) / tmp_modulus);
+      add_recycled_congruences(new_cgs2);
+    }
+
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Constrain the left hand side expression so that it is congruent to
+    // the right hand side expression modulo `mod'.
+    add_congruence_no_check((lhs %= rhs) / tmp_modulus);
+
+    // Any image of an empty grid is empty.
+    if (is_empty())
+      return;
+
+    // Existentially quantify all the variables occurring in `lhs'.
+    add_recycled_grid_generators(new_lines);
+  }
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::
+bounded_affine_image(const Variable var,
+                     const Linear_Expression& lb_expr,
+                     const Linear_Expression& ub_expr,
+                     Coefficient_traits::const_reference denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any image of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // In all other cases, generalized_affine_preimage() must
+  // just add a line in the direction of var.
+  generalized_affine_image(var,
+                           LESS_OR_EQUAL,
+                           ub_expr,
+                           denominator);
+
+  PPL_ASSERT(OK());
+}
+
+
+void
+PPL::Grid::
+bounded_affine_preimage(const Variable var,
+                        const Linear_Expression& lb_expr,
+                        const Linear_Expression& ub_expr,
+                        Coefficient_traits::const_reference denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the grid.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty grid is empty.
+  if (marked_empty())
+    return;
+
+  // In all other cases, generalized_affine_preimage() must
+  // just add a line in the direction of var.
+  generalized_affine_preimage(var,
+                              LESS_OR_EQUAL,
+                              ub_expr,
+                              denominator);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::time_elapse_assign(const Grid& y) {
+  Grid& x = *this;
+  // Check dimension-compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("time_elapse_assign(y)", "y", y);
+
+  // Deal with the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()
+      || (!x.generators_are_up_to_date() && !x.update_generators())
+      || (!y.generators_are_up_to_date() && !y.update_generators())) {
+    x.set_empty();
+    return;
+  }
+
+  // At this point both generator systems are up-to-date.
+  Grid_Generator_System gs = y.gen_sys;
+  const dimension_type gs_num_rows = gs.num_rows();
+
+  normalize_divisors(gs, gen_sys);
+
+  for (dimension_type i = gs_num_rows; i-- > 0; ) {
+    Grid_Generator& g = gs.sys.rows[i];
+    if (g.is_point())
+      // Transform the point into a parameter.
+      g.set_is_parameter();
+  }
+
+  PPL_ASSERT(gs.sys.OK());
+
+  if (gs_num_rows == 0)
+    // `y' was the grid containing a single point at the origin, so
+    // the result is `x'.
+    return;
+
+  // Append `gs' to the generators of `x'.
+
+  gen_sys.insert(gs, Recycle_Input());
+
+  x.clear_congruences_up_to_date();
+  x.clear_generators_minimized();
+
+  PPL_ASSERT(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Grid::frequency(const Linear_Expression& expr,
+                     Coefficient& freq_n, Coefficient& freq_d,
+                     Coefficient& val_n, Coefficient& val_d) const {
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 1 and the value is 0.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = 0;
+    val_d = 1;
+    return true;
+  }
+  if (!generators_are_minimized() && !minimize())
+    // Minimizing found `this' empty.
+    return false;
+
+  return frequency_no_check(expr, freq_n, freq_d, val_n, val_d);
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+bool
+PPL::operator==(const Grid& x, const Grid& y) {
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  if (x.marked_empty())
+    return y.is_empty();
+  if (y.marked_empty())
+    return x.is_empty();
+  if (x.space_dim == 0)
+    return true;
+
+  switch (x.quick_equivalence_test(y)) {
+  case Grid::TVB_TRUE:
+    return true;
+
+  case Grid::TVB_FALSE:
+    return false;
+
+  default:
+    if (x.is_included_in(y)) {
+      if (x.marked_empty())
+        return y.is_empty();
+      return y.is_included_in(x);
+    }
+    return false;
+  }
+}
+
+bool
+PPL::Grid::contains(const Grid& y) const {
+  const Grid& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", "y", y);
+
+  if (y.marked_empty())
+    return true;
+  if (x.marked_empty())
+    return y.is_empty();
+  if (y.space_dim == 0)
+    return true;
+  if (x.quick_equivalence_test(y) == Grid::TVB_TRUE)
+    return true;
+  return y.is_included_in(x);
+}
+
+bool
+PPL::Grid::is_disjoint_from(const Grid& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("is_disjoint_from(y)", "y", y);
+  Grid z = *this;
+  z.intersection_assign(y);
+  return z.is_empty();
+}
+
+void
+PPL::Grid::ascii_dump(std::ostream& s) const {
+  using std::endl;
+
+  s << "space_dim "
+    << space_dim
+    << endl;
+  status.ascii_dump(s);
+  s << "con_sys ("
+    << (congruences_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << endl;
+  con_sys.ascii_dump(s);
+  s << "gen_sys ("
+    << (generators_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << endl;
+  gen_sys.ascii_dump(s);
+  s << "dimension_kinds";
+  if ((generators_are_up_to_date() && generators_are_minimized())
+      || (congruences_are_up_to_date() && congruences_are_minimized()))
+    for (Dimension_Kinds::const_iterator i = dim_kinds.begin();
+         i != dim_kinds.end();
+         ++i)
+      s << " " << *i;
+  s << endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid)
+
+bool
+PPL::Grid::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "con_sys")
+    return false;
+
+  if (!(s >> str))
+    return false;
+  if (str == "(up-to-date)")
+    set_congruences_up_to_date();
+  else if (str != "(not_up-to-date)")
+    return false;
+
+  if (!con_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "gen_sys")
+    return false;
+
+  if (!(s >> str))
+    return false;
+  if (str == "(up-to-date)")
+    set_generators_up_to_date();
+  else if (str != "(not_up-to-date)")
+    return false;
+
+  if (!gen_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "dimension_kinds")
+    return false;
+
+  if (!marked_empty()
+      && ((generators_are_up_to_date() && generators_are_minimized())
+          || (congruences_are_up_to_date() && congruences_are_minimized()))) {
+    dim_kinds.resize(space_dim + 1);
+    for (Dimension_Kinds::size_type dim = 0; dim <= space_dim; ++dim) {
+      short unsigned int dim_kind;
+      if (!(s >> dim_kind))
+        return false;
+      switch(dim_kind) {
+      case 0: dim_kinds[dim] = PARAMETER; break;
+      case 1: dim_kinds[dim] = LINE; break;
+      case 2: dim_kinds[dim] = GEN_VIRTUAL; break;
+      default: return false;
+      }
+    }
+  }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Grid::external_memory_in_bytes() const {
+  return
+    con_sys.external_memory_in_bytes()
+    + gen_sys.external_memory_in_bytes();
+}
+
+void
+PPL::Grid::wrap_assign(const Variables_Set& vars,
+                       Bounded_Integer_Type_Width w,
+                       Bounded_Integer_Type_Representation r,
+                       Bounded_Integer_Type_Overflow o,
+                       const Constraint_System* cs_p,
+                       unsigned /* complexity_threshold */,
+                       bool /* wrap_individually */) {
+
+  // Dimension-compatibility check of `*cs_p', if any.
+  if (cs_p != 0) {
+    const dimension_type cs_p_space_dim  = cs_p->space_dimension();
+    if (cs_p->space_dimension() > space_dim)
+      throw_dimension_incompatible("wrap_assign(vs, ...)", cs_p_space_dim);
+  }
+
+  // Wrapping no variable is a no-op.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check of `vars'.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("wrap_assign(vs, ...)", min_space_dim);
+
+  // Wrapping an empty grid is a no-op.
+  if (marked_empty())
+    return;
+  if (!generators_are_minimized() && !minimize())
+    // Minimizing found `this' empty.
+    return;
+
+  // Set the wrap frequency for variables of width `w'.
+  // This is independent of the signedness `s'.
+  PPL_DIRTY_TEMP_COEFFICIENT(wrap_frequency);
+  mul_2exp_assign(wrap_frequency, Coefficient_one(), w);
+  // Set `min_value' and `max_value' to the minimum and maximum values
+  // a variable of width `w' and signedness `s' can take.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  if (r == UNSIGNED) {
+    min_value = 0;
+    mul_2exp_assign(max_value, Coefficient_one(), w);
+    --max_value;
+  }
+  else {
+    PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+    mul_2exp_assign(max_value, Coefficient_one(), w-1);
+    neg_assign(min_value, max_value);
+    --max_value;
+  }
+
+  // Generators are up-to-date and minimized.
+  const Grid gr = *this;
+
+  // Overflow is impossible or wraps.
+  if (o == OVERFLOW_IMPOSSIBLE || o == OVERFLOW_WRAPS) {
+    PPL_DIRTY_TEMP_COEFFICIENT(f_n);
+    PPL_DIRTY_TEMP_COEFFICIENT(f_d);
+    PPL_DIRTY_TEMP_COEFFICIENT(v_n);
+    PPL_DIRTY_TEMP_COEFFICIENT(v_d);
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vars_end = vars.end(); i != vars_end; ++i) {
+      const Variable x(*i);
+      // Find the frequency and a value for `x' in `gr'.
+      if (!gr.frequency_no_check(x, f_n, f_d, v_n, v_d))
+        continue;
+      if (f_n == 0) {
+
+        // `x' is a constant in `gr'.
+        if (v_d != 1) {
+          // The value for `x' is not integral (`frequency_no_check()'
+          // ensures that `v_n' and `v_d' have no common divisors).
+          set_empty();
+          return;
+        }
+
+        // `x' is a constant and has an integral value.
+        if ((v_n > max_value) || (v_n < min_value)) {
+          // The value is outside the range of the bounded integer type.
+          if (o == OVERFLOW_IMPOSSIBLE) {
+            // Then `x' has no possible value and hence set empty.
+            set_empty();
+            return;
+          }
+          PPL_ASSERT(o == OVERFLOW_WRAPS);
+          // The value v_n for `x' is wrapped modulo the 'wrap_frequency'.
+          v_n %= wrap_frequency;
+          // `v_n' is the value closest to 0 and may be negative.
+          if (r == UNSIGNED && v_n < 0)
+            v_n += wrap_frequency;
+          unconstrain(x);
+          add_constraint(x == v_n);
+        }
+        continue;
+      }
+
+      // `x' is not a constant in `gr'.
+      PPL_ASSERT(f_n != 0);
+
+      if (f_d % v_d != 0) {
+        // Then `x' has no integral value and hence `gr' is set empty.
+        set_empty();
+        return;
+      }
+      if (f_d != 1) {
+        // `x' has non-integral values, so add the integrality
+        // congruence for `x'.
+        add_congruence((x %= 0) / 1);
+      }
+      if (o == OVERFLOW_WRAPS && f_n != wrap_frequency)
+        // We know that `x' is not a constant, so, if overflow wraps,
+        // `x' may wrap to a value modulo the `wrap_frequency'.
+        add_grid_generator(parameter(wrap_frequency * x));
+      else if ((o == OVERFLOW_IMPOSSIBLE && 2*f_n >= wrap_frequency)
+               || (f_n == wrap_frequency)) {
+        // In these cases, `x' can only take a unique (ie constant)
+        // value.
+        if (r == UNSIGNED && v_n < 0) {
+          // `v_n' is the value closest to 0 and may be negative.
+          v_n += f_n;
+        }
+        unconstrain(x);
+        add_constraint(x == v_n);
+      }
+      else {
+        // If overflow is impossible but the grid frequency is less than
+        // half the wrap frequency, then there is more than one possible
+        // value for `x' in the range of the bounded integer type,
+        // so the grid is unchanged.
+        PPL_ASSERT(o == OVERFLOW_IMPOSSIBLE && 2*f_n < wrap_frequency);
+      }
+    }
+    return;
+  }
+
+  PPL_ASSERT(o == OVERFLOW_UNDEFINED);
+  // If overflow is undefined, then all we know is that the variable
+  // may take any integer within the range of the bounded integer type.
+  const Grid_Generator& point = gr.gen_sys[0];
+  const Coefficient& div = point.divisor();
+  max_value *= div;
+  min_value *= div;
+  for (Variables_Set::const_iterator i = vars.begin(),
+         vars_end = vars.end(); i != vars_end; ++i) {
+    const Variable x(*i);
+    if (!gr.bounds_no_check(x)) {
+      // `x' is not a constant in `gr'.
+      // We know that `x' is not a constant, so `x' may wrap to any
+      // value `x + z' where z is an integer.
+      if (point.coefficient(x) % div != 0) {
+        // We know that `x' can take non-integral values, so enforce
+        // integrality.
+        unconstrain(x);
+        add_congruence(x %= 0);
+      }
+      else
+        // `x' has at least one integral value.
+        // `x' may also take other non-integral values,
+        // but checking could be costly so we ignore this.
+        add_grid_generator(parameter(x));
+    }
+    else {
+      // `x' is a constant `v' in `gr'.
+      const Coefficient& coeff_x = point.coefficient(x);
+      // `x' should be integral.
+      if (coeff_x % div != 0) {
+        set_empty();
+        return;
+      }
+      // If the value `v' for `x' is not within the range for the
+      // bounded integer type, then `x' may wrap to any value `v + z'
+      // where `z' is an integer; otherwise `x' is unchanged.
+      if (coeff_x > max_value || coeff_x < min_value) {
+        add_grid_generator(parameter(x));
+      }
+    }
+  }
+}
+
+void
+PPL::Grid::drop_some_non_integer_points(Complexity_Class) {
+  if (marked_empty() || space_dim == 0)
+    return;
+
+  // By adding integral congruences for each dimension to the
+  // congruence system, defining \p *this, the grid will keep only
+  // those points that have integral coordinates. All points in \p
+  // *this with non-integral coordinates are removed.
+  for (dimension_type i = space_dim; i-- > 0; )
+    add_congruence(Variable(i) %= 0);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::drop_some_non_integer_points(const Variables_Set& vars,
+                                        Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (marked_empty() || min_space_dim == 0)
+    return;
+
+  // By adding the integral congruences for each dimension in vars to
+  // the congruence system defining \p *this, the grid will keep only
+  // those points that have integer coordinates for all the dimensions
+  // in vars. All points in \p *this with non-integral coordinates for
+  // the dimensions in vars are removed.
+  for (Variables_Set::const_iterator i = vars.begin(),
+         vars_end = vars.end(); i != vars_end; ++i)
+    add_congruence(Variable(*i) %= 0);
+
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid& gr) {
+  if (gr.is_empty())
+    s << "false";
+  else if (gr.is_universe())
+    s << "true";
+  else
+    s << gr.minimized_congruences();
+  return s;
+}
diff --git a/src/Grid_simplify.cc b/src/Grid_simplify.cc
new file mode 100644
index 0000000..b52a9e1
--- /dev/null
+++ b/src/Grid_simplify.cc
@@ -0,0 +1,588 @@
+/* Grid class implementation: simplify().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "assert.hh"
+#include "Grid_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+void
+Grid::reduce_line_with_line(Grid_Generator& row, Grid_Generator& pivot,
+                            dimension_type column) {
+  Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+  Coefficient_traits::const_reference row_column = row.expr.get(column);
+  PPL_ASSERT(pivot_column != 0);
+  PPL_ASSERT(row_column != 0);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
+  // Store the reduced ratio between pivot[column] and row[column].
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+  // Multiply row, then subtract from it a multiple of pivot such that
+  // the result in row[column] is zero.
+  neg_assign(reduced_row_col);
+  // pivot.space_dimension() is the index for the parameter divisor so we
+  // start reducing the line at index pivot.space_dimension() - 2.
+  row.expr.linear_combine(pivot.expr,
+                          reduced_pivot_col, reduced_row_col,
+                          column, pivot.expr.space_dimension());
+  PPL_ASSERT(row.OK());
+  PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+void
+Grid::reduce_equality_with_equality(Congruence& row,
+                                    const Congruence& pivot,
+                                    const dimension_type column) {
+  // Assume two equalities.
+  PPL_ASSERT(row.modulus() == 0 && pivot.modulus() == 0);
+
+  Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+  Coefficient_traits::const_reference row_column = row.expr.get(column);
+  PPL_ASSERT(pivot_column != 0);
+  PPL_ASSERT(row_column != 0);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
+  // Store the reduced ratio between pivot[column] and row[column].
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+  // Multiply row, then subtract from it a multiple of pivot such that
+  // the result in row[column] is zero.
+  neg_assign(reduced_row_col);
+  row.expr.linear_combine(pivot.expr,
+                          reduced_pivot_col, reduced_row_col,
+                          0, column + 1);
+  PPL_ASSERT(row.OK());
+  PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+template <typename R>
+void
+Grid::reduce_pc_with_pc(R& row, R& pivot,
+                        const dimension_type column,
+                        const dimension_type start,
+                        const dimension_type end) {
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(start <= column);
+  PPL_ASSERT(column < end);
+
+  Linear_Expression& row_e = row.expr;
+  Linear_Expression& pivot_e = pivot.expr;
+
+  Coefficient_traits::const_reference pivot_column = pivot_e.get(column);
+  Coefficient_traits::const_reference row_column = row_e.get(column);
+  PPL_ASSERT(pivot_column != 0);
+  PPL_ASSERT(row_column != 0);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(s);
+  PPL_DIRTY_TEMP_COEFFICIENT(t);
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  gcdext_assign(gcd, s, t, pivot_column, row_column);
+  PPL_ASSERT(pivot_e.get(column) * s + row_e.get(column) * t == gcd);
+
+  // Store the reduced ratio between pivot[column] and row[column].
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, gcd);
+  exact_div_assign(reduced_row_col, row_column, gcd);
+
+  // Multiply row, then subtract from it a multiple of pivot such that
+  // the result in row[column] is zero.  Afterward, multiply pivot,
+  // then add to it a (possibly negative) multiple of row such that
+  // the result in pivot[column] is the smallest possible positive
+  // integer.
+  const Linear_Expression old_pivot_e = pivot_e;
+  pivot_e.linear_combine_lax(row_e, s, t, start, end);
+  PPL_ASSERT(pivot_e.get(column) == gcd);
+  row_e.linear_combine(old_pivot_e, reduced_pivot_col, -reduced_row_col, start, end);
+  PPL_ASSERT(row_e.get(column) == 0);
+}
+
+void
+Grid::reduce_parameter_with_line(Grid_Generator& row,
+                                 const Grid_Generator& pivot,
+                                 const dimension_type column,
+                                 Swapping_Vector<Grid_Generator>& rows,
+                                 const dimension_type total_num_columns) {
+  // Very similar to reduce_congruence_with_equality below.  Any
+  // change here may be needed there too.
+
+  Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+  Coefficient_traits::const_reference row_column = row.expr.get(column);
+  PPL_ASSERT(pivot_column != 0);
+  PPL_ASSERT(row_column != 0);
+
+  // Subtract one to allow for the parameter divisor column
+  const dimension_type num_columns = total_num_columns - 1;
+
+  // If the elements at column in row and pivot are the same, then
+  // just subtract pivot from row.
+  if (row_column == pivot_column) {
+    row.expr.linear_combine(pivot.expr, 1, -1, 0, num_columns);
+    return;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
+  // Store the reduced ratio between pivot[column] and row[column].
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+
+
+  // Since we are reducing the system to "strong minimal form",
+  // ensure that the multiplier is positive, so that the preceding
+  // diagonals (including the divisor) remain positive.  It's safe to
+  // swap the signs as row[column] will still come out 0.
+  if (reduced_pivot_col < 0) {
+    neg_assign(reduced_pivot_col);
+    neg_assign(reduced_row_col);
+  }
+
+  // Multiply row such that a multiple of pivot can be subtracted from
+  // it below to render row[column] zero.  This requires multiplying
+  // all other parameters to match.
+  for (dimension_type index = rows.size(); index-- > 0; ) {
+    Grid_Generator& gen = rows[index];
+    if (gen.is_parameter_or_point())
+      // Do not scale the last coefficient.
+      gen.expr.mul_assign(reduced_pivot_col, 0, num_columns);
+  }
+
+  // Subtract from row a multiple of pivot such that the result in
+  // row[column] is zero.
+  row.expr.linear_combine(pivot.expr,
+                          Coefficient_one(), -reduced_row_col,
+                          column, num_columns);
+  PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+void
+Grid::reduce_congruence_with_equality(Congruence& row,
+                                      const Congruence& pivot,
+                                      const dimension_type column,
+                                      Swapping_Vector<Congruence>& sys) {
+  // Very similar to reduce_parameter_with_line above.  Any change
+  // here may be needed there too.
+  PPL_ASSERT(row.modulus() > 0 && pivot.modulus() == 0);
+
+  Coefficient_traits::const_reference pivot_column = pivot.expr.get(column);
+  Coefficient_traits::const_reference row_column = row.expr.get(column);
+
+  // If the elements at `column' in row and pivot are the same, then
+  // just subtract `pivot' from `row'.
+  if (row_column == pivot_column) {
+    row.expr -= pivot.expr;
+    return;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_row_col);
+  // Use reduced_row_col temporarily to hold the gcd.
+  gcd_assign(reduced_row_col, pivot_column, row_column);
+  PPL_DIRTY_TEMP_COEFFICIENT(reduced_pivot_col);
+  exact_div_assign(reduced_pivot_col, pivot_column, reduced_row_col);
+  exact_div_assign(reduced_row_col, row_column, reduced_row_col);
+  // Ensure that `reduced_pivot_col' is positive, so that the modulus
+  // remains positive when multiplying the proper congruences below.
+  // It's safe to swap the signs as row[column] will still come out 0.
+  if (reduced_pivot_col < 0) {
+    neg_assign(reduced_pivot_col);
+    neg_assign(reduced_row_col);
+  }
+  // Multiply `row', including the modulus, by reduced_pivot_col.  To
+  // keep all the moduli the same this requires multiplying all the
+  // other proper congruences in the same way.
+  for (dimension_type index = sys.size(); index-- > 0; ) {
+    Congruence& cg = sys[index];
+    if (cg.is_proper_congruence())
+      cg.scale(reduced_pivot_col);
+  }
+  // Subtract from row a multiple of pivot such that the result in
+  // row[column] is zero.
+  sub_mul_assign(row.expr, reduced_row_col, pivot.expr);
+  PPL_ASSERT(row.expr.get(column) == 0);
+}
+
+#ifndef NDEBUG
+template <typename M, typename R>
+bool
+Grid::rows_are_zero(M& system, dimension_type first,
+                    dimension_type last, dimension_type row_size) {
+  while (first <= last) {
+    const R& row = system[first++];
+    if (!row.expr.all_zeroes(0, row_size))
+      return false;
+  }
+  return true;
+}
+#endif
+
+void
+Grid::simplify(Grid_Generator_System& ggs, Dimension_Kinds& dim_kinds) {
+  PPL_ASSERT(!ggs.has_no_rows());
+  // Changes here may also be required in the congruence version below.
+
+  // Subtract one to allow for the parameter divisor column
+  const dimension_type num_columns = ggs.space_dimension() + 1;
+
+  if (dim_kinds.size() != num_columns)
+    dim_kinds.resize(num_columns);
+
+  const dimension_type num_rows = ggs.num_rows();
+
+  // For each dimension `dim' move or construct a row into position
+  // `pivot_index' such that the row has zero in all elements
+  // following column `dim' and a value other than zero in column
+  // `dim'.
+  dimension_type pivot_index = 0;
+  for (dimension_type dim = 0; dim < num_columns; ++dim) {
+    // Consider the pivot and following rows.
+    dimension_type row_index = pivot_index;
+
+    // Move down over rows which have zero in column `dim'.
+    while (row_index < num_rows
+           && ggs.sys.rows[row_index].expr.get(dim) == 0)
+      ++row_index;
+
+    if (row_index == num_rows)
+      // Element in column `dim' is zero in all rows from the pivot.
+      dim_kinds[dim] = GEN_VIRTUAL;
+    else {
+      if (row_index != pivot_index) {
+        using std::swap;
+        swap(ggs.sys.rows[row_index], ggs.sys.rows[pivot_index]);
+      }
+      Grid_Generator& pivot = ggs.sys.rows[pivot_index];
+      bool pivot_is_line = pivot.is_line();
+
+      // Change the matrix so that the value at `dim' in every row
+      // following `pivot_index' is 0, leaving an equivalent grid.
+      while (row_index < num_rows - 1) {
+        ++row_index;
+        Grid_Generator& row = ggs.sys.rows[row_index];
+
+        if (row.expr.get(dim) == 0)
+          continue;
+
+        if (row.is_line())
+          if (pivot_is_line)
+            reduce_line_with_line(row, pivot, dim);
+          else {
+            PPL_ASSERT(pivot.is_parameter_or_point());
+            using std::swap;
+            swap(row, pivot);
+            pivot_is_line = true;
+            reduce_parameter_with_line(row, pivot, dim, ggs.sys.rows,
+                                       num_columns + 1);
+          }
+        else {
+          PPL_ASSERT(row.is_parameter_or_point());
+          if (pivot_is_line)
+            reduce_parameter_with_line(row, pivot, dim, ggs.sys.rows,
+                                       num_columns + 1);
+          else {
+            PPL_ASSERT(pivot.is_parameter_or_point());
+            reduce_pc_with_pc(row, pivot, dim, dim, num_columns);
+          }
+        }
+      }
+
+      if (pivot_is_line)
+        dim_kinds[dim] = LINE;
+      else {
+        PPL_ASSERT(pivot.is_parameter_or_point());
+        dim_kinds[dim] = PARAMETER;
+      }
+
+      // Since we are reducing the system to "strong minimal form",
+      // ensure that a positive value follows the leading zeros.
+      if (pivot.expr.get(dim) < 0)
+        pivot.expr.negate(dim, num_columns);
+
+      // Factor this row out of the preceding rows.
+      reduce_reduced<Grid_Generator_System>
+        (ggs.sys.rows, dim, pivot_index, dim, num_columns - 1, dim_kinds);
+
+      ++pivot_index;
+    }
+  }
+
+  // Clip any zero rows from the end of the matrix.
+  if (num_rows > pivot_index) {
+#ifndef NDEBUG
+    const bool ret = rows_are_zero<Grid_Generator_System, Grid_Generator>
+      (ggs,
+       // index of first
+       pivot_index,
+       // index of last
+       ggs.num_rows() - 1,
+       // row size
+       ggs.space_dimension() + 1);
+    PPL_ASSERT(ret == true);
+#endif
+    ggs.sys.rows.resize(pivot_index);
+  }
+
+  // Ensure that the parameter divisors are the same as the system
+  // divisor.
+  const Coefficient& system_divisor = ggs.sys.rows[0].expr.inhomogeneous_term();
+  for (dimension_type i = ggs.sys.rows.size() - 1,
+         dim = num_columns - 1; dim > 0; --dim) {
+    switch (dim_kinds[dim]) {
+    case PARAMETER:
+      ggs.sys.rows[i].set_divisor(system_divisor);
+      // Intentionally fall through.
+    case LINE:
+      PPL_ASSERT(ggs.sys.rows[i].OK());
+      --i;
+      break;
+    case GEN_VIRTUAL:
+      break;
+    }
+  }
+
+  ggs.unset_pending_rows();
+  PPL_ASSERT(ggs.sys.OK());
+}
+
+bool
+Grid::simplify(Congruence_System& cgs, Dimension_Kinds& dim_kinds) {
+  PPL_ASSERT(cgs.space_dimension() != 0);
+  // Changes here may also be required in the generator version above.
+
+  // TODO: Consider normalizing the moduli only when congruences are
+  //       added to con_sys.
+  cgs.normalize_moduli();
+
+  // NOTE: add one for the inhomogeneous term (but not the modulus).
+  const dimension_type num_columns = cgs.space_dimension() + 1;
+
+  if (dim_kinds.size() != num_columns)
+    dim_kinds.resize(num_columns);
+
+  const dimension_type num_rows = cgs.num_rows();
+
+  // For each dimension `dim' move or construct a row into position
+  // `pivot_index' such that the row has a value of zero in all
+  // elements preceding column `dim' and some other value in column
+  // `dim'.
+  dimension_type pivot_index = 0;
+  for (dimension_type dim = num_columns; dim-- > 0; ) {
+    // Consider the pivot and following rows.
+    dimension_type row_index = pivot_index;
+
+    // Move down over rows which have zero in column `dim'.
+    while (row_index < num_rows && cgs.rows[row_index].expr.get(dim) == 0)
+      ++row_index;
+
+    if (row_index == num_rows)
+      // Element in column `dim' is zero in all rows from the pivot,
+      // or `cgs' is empty of rows.
+      dim_kinds[dim] = CON_VIRTUAL;
+    else {
+      // Here row_index != num_rows.
+      if (row_index != pivot_index) {
+        using std::swap;
+        swap(cgs.rows[row_index], cgs.rows[pivot_index]);
+      }
+
+      Congruence& pivot = cgs.rows[pivot_index];
+      bool pivot_is_equality = pivot.is_equality();
+
+      // Change the matrix so that the value at `dim' in every row
+      // following `pivot_index' is 0, leaving an equivalent grid.
+      while (row_index < num_rows - 1) {
+        ++row_index;
+        Congruence& row = cgs.rows[row_index];
+        if (row.expr.get(dim) == 0)
+          continue;
+
+        if (row.is_equality()) {
+          if (pivot_is_equality)
+            reduce_equality_with_equality(row, pivot, dim);
+          else {
+            PPL_ASSERT(pivot.is_proper_congruence());
+            using std::swap;
+            swap(row, pivot);
+            pivot_is_equality = true;
+            reduce_congruence_with_equality(row, pivot, dim, cgs.rows);
+          }
+        }
+        else {
+          PPL_ASSERT(row.is_proper_congruence());
+          if (pivot_is_equality)
+            reduce_congruence_with_equality(row, pivot, dim, cgs.rows);
+          else {
+            PPL_ASSERT(pivot.is_proper_congruence());
+            reduce_pc_with_pc(row, pivot, dim, 0, dim + 1);
+          }
+        }
+      }
+
+      if (pivot_is_equality)
+        dim_kinds[dim] = EQUALITY;
+      else {
+        PPL_ASSERT(pivot.is_proper_congruence());
+        dim_kinds[dim] = PROPER_CONGRUENCE;
+      }
+
+      // Since we are reducing the system to "strong minimal form",
+      // ensure that a positive value follows the leading zeros.
+      if (pivot.expr.get(dim) < 0)
+        pivot.expr.negate(0, dim + 1);
+
+      // Factor this row out of the preceding ones.
+      reduce_reduced<Congruence_System>
+        (cgs.rows, dim, pivot_index, 0, dim, dim_kinds, false);
+
+      PPL_ASSERT(cgs.OK());
+
+      ++pivot_index;
+    }
+  }
+
+  if (pivot_index > 0) {
+    // If the last row is false then make it the equality 1 = 0, and
+    // make it the only row.
+
+#ifndef NDEBUG
+    {
+      const bool ret = rows_are_zero<Congruence_System, Congruence>
+        (cgs,
+         // index of first
+         pivot_index,
+         // index of last
+         num_rows - 1,
+         // row size
+         num_columns);
+      PPL_ASSERT(ret == true);
+    }
+#endif
+
+    cgs.remove_trailing_rows(num_rows - pivot_index);
+    Congruence& last_row = cgs.rows.back();
+
+    switch (dim_kinds[0]) {
+
+    case PROPER_CONGRUENCE:
+      if (last_row.inhomogeneous_term() % last_row.modulus() == 0)
+        break;
+      // The last row is a false proper congruence.
+      last_row.set_modulus(Coefficient_zero());
+      dim_kinds[0] = EQUALITY;
+      // Intentionally fall through.
+
+    case EQUALITY:
+      // The last row is a false equality, as all the coefficient terms
+      // are zero while the inhomogeneous term (as a result of the
+      // reduced form) is some other value.
+      last_row.expr.set_inhomogeneous_term(Coefficient_one());
+      dim_kinds.resize(1);
+      using std::swap;
+      swap(cgs.rows[0], last_row);
+      cgs.remove_trailing_rows(cgs.num_rows() - 1);
+      PPL_ASSERT(cgs.OK());
+      return true;
+
+    default:
+      break;
+    }
+  }
+  else {
+    // Either `cgs' is empty (it defines the universe) or every column
+    // before the modulus column contains only zeroes.
+
+    if (num_rows > 0) {
+#ifndef NDEBUG
+      const bool ret = rows_are_zero<Congruence_System, Congruence>
+        (cgs,
+         // index of first
+         0,
+         // index of last
+         num_rows - 1,
+         // row size
+         num_columns);
+      PPL_ASSERT(ret == true);
+#endif
+      // Ensure that a single row will remain for the integrality congruence.
+      cgs.remove_trailing_rows(num_rows - 1);
+    }
+
+    // Set up the integrality congruence.
+    dim_kinds[0] = PROPER_CONGRUENCE;
+    if (num_rows == 0) {
+      Congruence cg;
+      cg.set_modulus(Coefficient_one());
+      cg.set_space_dimension(cgs.space_dimension());
+      cg.expr.set_inhomogeneous_term(Coefficient_one());
+      cgs.insert_verbatim(cg, Recycle_Input());
+
+      PPL_ASSERT(cgs.OK());
+      return false;
+    }
+
+    PPL_ASSERT(cgs.num_rows() == 1);
+    cgs.rows.back().set_modulus(Coefficient_one());
+  }
+
+  // Ensure that the last row is the integrality congruence.
+  if (dim_kinds[0] == CON_VIRTUAL) {
+    // The last row is virtual, append the integrality congruence.
+    dim_kinds[0] = PROPER_CONGRUENCE;
+    Congruence new_last_row;
+    new_last_row.set_space_dimension(cgs.space_dimension());
+    new_last_row.set_modulus(Coefficient_one());
+    // Try use an existing modulus.
+    dimension_type row_index = cgs.num_rows();
+    while (row_index-- > 0) {
+      const Congruence& row = cgs[row_index];
+      if (row.modulus() > 0) {
+        new_last_row.set_modulus(row.modulus());
+        break;
+      }
+    }
+    new_last_row.expr.set_inhomogeneous_term(new_last_row.modulus());
+    cgs.insert_verbatim(new_last_row, Recycle_Input());
+  }
+  else {
+    cgs.rows.back().expr.set_inhomogeneous_term(cgs.rows.back().modulus());
+  }
+
+  // Since we are reducing the system to "strong minimal form",
+  // factor the modified integrality congruence out of the other rows;
+  reduce_reduced<Congruence_System>
+    (cgs.rows, 0, cgs.num_rows() - 1, 0, 0, dim_kinds, false);
+
+  PPL_ASSERT(cgs.OK());
+  return false;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_templates.hh b/src/Grid_templates.hh
new file mode 100644
index 0000000..a4223f1
--- /dev/null
+++ b/src/Grid_templates.hh
@@ -0,0 +1,339 @@
+/* Grid class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Grid_templates_hh
+#define PPL_Grid_templates_hh 1
+
+#include "Grid_Generator_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Grid::Grid(const Box<Interval>& box, Complexity_Class)
+  : con_sys(),
+    gen_sys() {
+  space_dim = check_space_dimension_overflow(box.space_dimension(),
+                                             max_space_dimension(),
+                                             "PPL::Grid::",
+                                             "Grid(box, from_bounding_box)",
+                                             "the space dimension of box "
+                                             "exceeds the maximum allowed "
+                                             "space dimension");
+
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.set_space_dimension(space_dim);
+    gen_sys.set_space_dimension(space_dim);
+    // Add congruences and generators according to `box'.
+    PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+    PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+    PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+    PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+    gen_sys.insert(grid_point());
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      const Variable v_k = Variable(k);
+      bool closed = false;
+      // TODO: Consider producing the system(s) in minimized form.
+      if (box.has_lower_bound(v_k, l_n, l_d, closed)) {
+        if (box.has_upper_bound(v_k, u_n, u_d, closed))
+          if (l_n * u_d == u_n * l_d) {
+            // A point interval sets dimension k of every point to a
+            // single value.
+            con_sys.insert(l_d * v_k == l_n);
+
+            // This is declared here because it may be invalidated
+            // by the call to gen_sys.insert() at the end of the loop.
+            Grid_Generator& point = gen_sys.sys.rows[0];
+
+            // Scale the point to use as divisor the lcm of the
+            // divisors of the existing point and the lower bound.
+            const Coefficient& point_divisor = point.divisor();
+            gcd_assign(u_n, l_d, point_divisor);
+            // `u_n' now holds the gcd.
+            exact_div_assign(u_n, point_divisor, u_n);
+            if (l_d < 0)
+              neg_assign(u_n);
+            // l_d * u_n == abs(l_d * (point_divisor / gcd(l_d, point_divisor)))
+            point.scale_to_divisor(l_d * u_n);
+            // Set dimension k of the point to the lower bound.
+            if (l_d < 0)
+              neg_assign(u_n);
+            // point[k + 1] = l_n * point_divisor / gcd(l_d, point_divisor)
+            point.expr.set(Variable(k), l_n * u_n);
+            PPL_ASSERT(point.OK());
+
+            PPL_ASSERT(gen_sys.sys.OK());
+
+            continue;
+          }
+      }
+      // A universe interval allows any value in dimension k.
+      gen_sys.insert(grid_line(v_k));
+    }
+    set_congruences_up_to_date();
+    set_generators_up_to_date();
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the grid becomes zero_dimensional.
+    if (marked_empty()
+        || (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty grid.
+      space_dim = 0;
+      set_empty();
+    }
+    else
+      // Removing all dimensions from a non-empty grid.
+      set_zero_dim_univ();
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    std::vector<Variable> cycle;
+    cycle.reserve(space_dim);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+        dimension_type j = i;
+        do {
+          visited[j] = true;
+          // The following initialization is only to make the compiler happy.
+          dimension_type k = 0;
+          if (!pfunc.maps(j, k))
+            throw_invalid_argument("map_space_dimensions(pfunc)",
+                                   " pfunc is inconsistent");
+          if (k == j)
+            break;
+
+          cycle.push_back(Variable(j));
+          // Go along the cycle.
+          j = k;
+        } while (!visited[j]);
+
+        // End of cycle.
+
+        // Avoid calling clear_*_minimized() if cycle.size() is less than 2,
+        // to improve efficiency.
+        if (cycle.size() >= 2) {
+          // Permute all that is up-to-date.
+          if (congruences_are_up_to_date()) {
+            con_sys.permute_space_dimensions(cycle);
+            clear_congruences_minimized();
+          }
+
+          if (generators_are_up_to_date()) {
+            gen_sys.permute_space_dimensions(cycle);
+            clear_generators_minimized();
+          }
+        }
+
+        cycle.clear();
+      }
+    }
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  const Grid_Generator_System& old_gensys = grid_generators();
+
+  if (old_gensys.has_no_rows()) {
+    // The grid is empty.
+    Grid new_grid(new_space_dimension, EMPTY);
+    m_swap(new_grid);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Grid_Generator_System new_gensys;
+  // Set sortedness, for the assertion met via gs::insert.
+  new_gensys.set_sorted(false);
+  // Get the divisor of the first point.
+  Grid_Generator_System::const_iterator i;
+  Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+    if (i->is_point())
+      break;
+  PPL_ASSERT(i != old_gensys_end);
+  const Coefficient& system_divisor = i->divisor();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i) {
+    const Grid_Generator& old_g = *i;
+    const Grid_Generator::expr_type old_g_e = old_g.expression();
+    Linear_Expression expr;
+    expr.set_space_dimension(new_space_dimension);
+    bool all_zeroes = true;
+    for (Grid_Generator::expr_type::const_iterator j = old_g_e.begin(),
+          j_end = old_g_e.end(); j != j_end; ++j) {
+      const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+      if (mapped_id != not_a_dimension()) {
+        add_mul_assign(expr, *j, Variable(mapped_id));
+        all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Grid_Generator::LINE:
+      if (!all_zeroes)
+        new_gensys.insert(grid_line(expr));
+      break;
+    case Grid_Generator::PARAMETER:
+      if (!all_zeroes)
+        new_gensys.insert(parameter(expr, system_divisor));
+      break;
+    case Grid_Generator::POINT:
+      new_gensys.insert(grid_point(expr, old_g.divisor()));
+      break;
+    }
+  }
+
+  Grid new_grid(new_gensys);
+  m_swap(new_grid);
+
+  PPL_ASSERT(OK(true));
+}
+
+// Needed for converting the congruence or grid_generator system
+// to "strong minimal form".
+template <typename M>
+void
+Grid::reduce_reduced(Swapping_Vector<typename M::row_type>& rows,
+                     const dimension_type dim,
+                     const dimension_type pivot_index,
+                     const dimension_type start,
+                     const dimension_type end,
+                     const Dimension_Kinds& sys_dim_kinds,
+                     const bool generators) {
+  // TODO: Remove this.
+  typedef typename M::row_type M_row_type;
+
+  const M_row_type& pivot = rows[pivot_index];
+  const Coefficient& pivot_dim = pivot.expr.get(dim);
+
+  if (pivot_dim == 0)
+    return;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(pivot_dim_half);
+  pivot_dim_half = (pivot_dim + 1) / 2;
+  const Dimension_Kind row_kind = sys_dim_kinds[dim];
+  const bool row_is_line_or_equality
+    = (row_kind == (generators ? LINE : EQUALITY));
+
+  PPL_DIRTY_TEMP_COEFFICIENT(num_rows_to_subtract);
+  PPL_DIRTY_TEMP_COEFFICIENT(row_dim_remainder);
+  for (dimension_type kinds_index = dim,
+         row_index = pivot_index; row_index-- > 0; ) {
+    if (generators) {
+      --kinds_index;
+      // Move over any virtual rows.
+      while (sys_dim_kinds[kinds_index] == GEN_VIRTUAL)
+        --kinds_index;
+    }
+    else {
+      ++kinds_index;
+      // Move over any virtual rows.
+      while (sys_dim_kinds[kinds_index] == CON_VIRTUAL)
+        ++kinds_index;
+    }
+
+    // row_kind CONGRUENCE is included as PARAMETER
+    if (row_is_line_or_equality
+        || (row_kind == PARAMETER
+            && sys_dim_kinds[kinds_index] == PARAMETER)) {
+      M_row_type& row = rows[row_index];
+
+      const Coefficient& row_dim = row.expr.get(dim);
+      // num_rows_to_subtract may be positive or negative.
+      num_rows_to_subtract = row_dim / pivot_dim;
+
+      // Ensure that after subtracting num_rows_to_subtract * r_dim
+      // from row_dim, -pivot_dim_half < row_dim <= pivot_dim_half.
+      // E.g., if pivot[dim] = 9, then after this reduction
+      // -5 < row_dim <= 5.
+      row_dim_remainder = row_dim % pivot_dim;
+      if (row_dim_remainder < 0) {
+        if (row_dim_remainder <= -pivot_dim_half)
+          --num_rows_to_subtract;
+      }
+      else if (row_dim_remainder > 0 && row_dim_remainder > pivot_dim_half)
+        ++num_rows_to_subtract;
+
+      // Subtract num_rows_to_subtract copies of pivot from row i.  Only the
+      // entries from dim need to be subtracted, as the preceding
+      // entries are all zero.
+      // If num_rows_to_subtract is negative, these copies of pivot are
+      // added to row i.
+      if (num_rows_to_subtract != 0)
+        row.expr.linear_combine(pivot.expr,
+                                Coefficient_one(), -num_rows_to_subtract,
+                                start, end + 1);
+    }
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_templates_hh)
diff --git a/src/Grid_types.hh b/src/Grid_types.hh
new file mode 100644
index 0000000..060d7f6
--- /dev/null
+++ b/src/Grid_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Grid_types_hh
+#define PPL_Grid_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_types_hh)
diff --git a/src/Grid_widenings.cc b/src/Grid_widenings.cc
new file mode 100644
index 0000000..972f127
--- /dev/null
+++ b/src/Grid_widenings.cc
@@ -0,0 +1,493 @@
+/* Grid class implementation
+   (non-inline widening-related member functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Grid_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::select_wider_congruences(const Grid& y,
+                                    Congruence_System& selected_cgs) const {
+  // Private method: the caller must ensure the following conditions
+  // (beside the inclusion `y <= x').
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(!y.marked_empty());
+  PPL_ASSERT(congruences_are_minimized());
+  PPL_ASSERT(y.congruences_are_minimized());
+
+  // Note: row counters start at 0, to preserve the original order in
+  // the selected congruences.
+  for (dimension_type dim = con_sys.space_dimension(), x_row = 0, y_row = 0;
+       dim > 0; --dim) {
+    PPL_ASSERT(dim_kinds[dim] == CON_VIRTUAL
+           || dim_kinds[dim] == y.dim_kinds[dim]);
+    switch (dim_kinds[dim]) {
+    case PROPER_CONGRUENCE:
+      {
+        const Congruence& cg = con_sys[x_row];
+        const Congruence& y_cg = y.con_sys[y_row];
+        if (cg.is_equal_at_dimension(Variable(dim - 1), y_cg))
+          // The leading diagonal entries are equal.
+          selected_cgs.insert(cg);
+        ++x_row;
+        ++y_row;
+      }
+      break;
+    case EQUALITY:
+      selected_cgs.insert(con_sys[x_row]);
+      ++x_row;
+      ++y_row;
+      break;
+    case CON_VIRTUAL:
+      if (y.dim_kinds[dim] != CON_VIRTUAL)
+        ++y_row;
+      break;
+    }
+  }
+}
+
+void
+PPL::Grid::congruence_widening_assign(const Grid& y, unsigned* tp) {
+  Grid& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  // Leave `x' the same if `x' or `y' is zero-dimensional or empty.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // Ensure that the `x' congruences are in minimal form.
+  if (x.congruences_are_up_to_date()) {
+    if (!x.congruences_are_minimized()) {
+      if (simplify(x.con_sys, x.dim_kinds)) {
+        // `x' is empty.
+        x.set_empty();
+        return;
+      }
+      x.set_congruences_minimized();
+    }
+  }
+  else
+    x.update_congruences();
+
+  // Ensure that the `y' congruences are in minimal form.
+  Grid& yy = const_cast<Grid&>(y);
+  if (yy.congruences_are_up_to_date()) {
+    if (!yy.congruences_are_minimized()) {
+      if (simplify(yy.con_sys, yy.dim_kinds)) {
+        // `y' is empty.
+        yy.set_empty();
+        return;
+      }
+      yy.set_congruences_minimized();
+    }
+  }
+  else
+    yy.update_congruences();
+
+  if (con_sys.num_equalities() < yy.con_sys.num_equalities())
+    return;
+
+  // Copy into `cgs' the congruences of `x' that are common to `y',
+  // according to the grid widening.
+  Congruence_System cgs;
+  x.select_wider_congruences(yy, cgs);
+
+  if (cgs.num_rows() == con_sys.num_rows())
+    // All congruences were selected, thus the result is `x'.
+    return;
+
+  // A strict subset of the congruences was selected.
+
+  Grid result(x.space_dim);
+  result.add_recycled_congruences(cgs);
+
+  // Check whether we are using the widening-with-tokens technique
+  // and there are still tokens available.
+  if (tp != 0 && *tp > 0) {
+    // There are tokens available.  If `result' is not a subset of
+    // `x', then it is less precise and we use one of the available
+    // tokens.
+    if (!x.contains(result))
+      --(*tp);
+  }
+  else
+    // No tokens.
+    x.m_swap(result);
+
+  PPL_ASSERT(x.OK(true));
+}
+
+void
+PPL::Grid::limited_congruence_extrapolation_assign(const Grid& y,
+                                                   const Congruence_System& cgs,
+                                                   unsigned* tp) {
+  Grid& x = *this;
+
+  // Check dimension compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+                                 "y", y);
+  // `cgs' must be dimension-compatible with the two grids.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (x.space_dim < cgs_space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+                                 "cgs", cgs);
+
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  // If `cgs' is empty (of rows), fall back to ordinary widening.
+  if (cgs_num_rows == 0) {
+    x.widening_assign(y, tp);
+    return;
+  }
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited widening between two grids in a zero-dimensional
+  // space is also a grid in a zero-dimensional space.
+  if (x.space_dim == 0)
+    return;
+
+  // Update the generators of `x': these are used to select, from the
+  // congruences in `cgs', those that must be added to the widened
+  // grid.
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // `x' is empty.
+    return;
+
+  if (tp == NULL || *tp == 0) {
+    // Widening may change the grid, so add the congruences.
+    Congruence_System new_cgs;
+    // The congruences to be added need only be satisfied by all the
+    // generators of `x', as `y <= x'.  Iterate upwards here, to keep
+    // the relative ordering of congruences (just for aesthetics).
+    for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+      const Congruence& cg = cgs[i];
+      if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+        new_cgs.insert(cg);
+    }
+    x.congruence_widening_assign(y, tp);
+    x.add_recycled_congruences(new_cgs);
+  }
+  else
+    // There are tokens, so widening will leave the grid the same.
+    x.congruence_widening_assign(y, tp);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::select_wider_generators(const Grid& y,
+                                   Grid_Generator_System& widened_ggs) const {
+  // Private method: the caller must ensure the following conditions
+  // (beside the inclusion `y <= x').
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(!y.marked_empty());
+  PPL_ASSERT(generators_are_minimized());
+  PPL_ASSERT(y.generators_are_minimized());
+
+  // Note: row counters start at 0, to preserve the original order in
+  // the selected generators.
+  for (dimension_type dim = 0, x_row = 0, y_row = 0;
+       dim <= gen_sys.space_dimension(); ++dim) {
+    PPL_ASSERT(dim_kinds[dim] == LINE
+           || y.dim_kinds[dim] == GEN_VIRTUAL
+           || dim_kinds[dim] == y.dim_kinds[dim]);
+    switch (dim_kinds[dim]) {
+    case PARAMETER:
+      {
+        const Grid_Generator& gg = gen_sys[x_row];
+        const Grid_Generator& y_gg = y.gen_sys[y_row];
+        if (gg.is_equal_at_dimension(dim, y_gg))
+          // The leading diagonal entry is equal.
+          widened_ggs.insert(gg);
+        else {
+          const Linear_Expression expr(gg.expression());
+          Grid_Generator line = grid_line(expr);
+          widened_ggs.insert(line, Recycle_Input());
+        }
+        ++x_row;
+        ++y_row;
+      }
+      break;
+    case LINE:
+      widened_ggs.insert(gen_sys[x_row]);
+      ++x_row;
+      ++y_row;
+      break;
+    case GEN_VIRTUAL:
+      if (y.dim_kinds[dim] != GEN_VIRTUAL)
+        ++y_row;
+      break;
+    }
+  }
+}
+
+void
+PPL::Grid::generator_widening_assign(const Grid& y, unsigned* tp) {
+  Grid& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("generator_widening_assign(y)", "y", y);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  // Leave `x' the same if `x' or `y' is zero-dimensional or empty.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // Ensure that the `x' generators are in minimal form.
+  if (x.generators_are_up_to_date()) {
+    if (!x.generators_are_minimized()) {
+      simplify(x.gen_sys, x.dim_kinds);
+      PPL_ASSERT(!x.gen_sys.has_no_rows());
+      x.set_generators_minimized();
+    }
+  }
+  else
+    x.update_generators();
+
+  if (x.marked_empty())
+    return;
+
+  // Ensure that the `y' generators are in minimal form.
+  Grid& yy = const_cast<Grid&>(y);
+  if (yy.generators_are_up_to_date()) {
+    if (!yy.generators_are_minimized()) {
+      simplify(yy.gen_sys, yy.dim_kinds);
+      PPL_ASSERT(!yy.gen_sys.has_no_rows());
+      yy.set_generators_minimized();
+    }
+  }
+  else
+    yy.update_generators();
+
+  if (gen_sys.num_rows() > yy.gen_sys.num_rows())
+    return;
+
+  if (gen_sys.num_lines() > yy.gen_sys.num_lines())
+    return;
+
+  // Copy into `ggs' the generators of `x' that are common to `y',
+  // according to the grid widening.
+  Grid_Generator_System ggs;
+  x.select_wider_generators(yy, ggs);
+
+  if (ggs.num_parameters() == gen_sys.num_parameters())
+    // All parameters are kept as parameters, thus the result is `x'.
+    return;
+
+  // A strict subset of the parameters was selected.
+
+  Grid result(x.space_dim, EMPTY);
+  result.add_recycled_grid_generators(ggs);
+
+  // Check whether we are using the widening-with-tokens technique
+  // and there are still tokens available.
+  if (tp != 0 && *tp > 0) {
+    // There are tokens available.  If `result' is not a subset of
+    // `x', then it is less precise and we use one of the available
+    // tokens.
+    if (!x.contains(result))
+      --(*tp);
+  }
+  else
+    // No tokens.
+    x.m_swap(result);
+
+  PPL_ASSERT(x.OK(true));
+}
+
+void
+PPL::Grid::limited_generator_extrapolation_assign(const Grid& y,
+                                                  const Congruence_System& cgs,
+                                                  unsigned* tp) {
+  Grid& x = *this;
+
+  // Check dimension compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+                                 "y", y);
+  // `cgs' must be dimension-compatible with the two grids.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (x.space_dim < cgs_space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+                                 "cgs", cgs);
+
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  // If `cgs' is empty (of rows), fall back to ordinary widening.
+  if (cgs_num_rows == 0) {
+    x.generator_widening_assign(y, tp);
+    return;
+  }
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited widening between two grids in a zero-dimensional
+  // space is also a grid in a zero-dimensional space.
+  if (x.space_dim == 0)
+    return;
+
+  // Update the generators of `x': these are used to select, from the
+  // congruences in `cgs', those that must be added to the widened
+  // grid.
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // `x' is empty.
+    return;
+
+  if (tp == NULL || *tp == 0) {
+    // Widening may change the grid, so add the congruences.
+    Congruence_System new_cgs;
+    // The congruences to be added need only be satisfied by all the
+    // generators of `x', as `y <= x'.  Iterate upwards here, to keep
+    // the relative ordering of congruences (just for aesthetics).
+    for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+      const Congruence& cg = cgs[i];
+      if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+        new_cgs.insert(cg);
+    }
+    x.generator_widening_assign(y, tp);
+    x.add_recycled_congruences(new_cgs);
+  }
+  else
+    // There are tokens, so widening will leave the grid the same.
+    x.generator_widening_assign(y, tp);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Grid::widening_assign(const Grid& y, unsigned* tp) {
+  Grid& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  // If the `x' congruences are up to date and `y' congruences are up
+  // to date use the congruence widening.
+  if (x.congruences_are_up_to_date() && y.congruences_are_up_to_date()) {
+    x.congruence_widening_assign(y, tp);
+    return;
+  }
+
+  // If the `x' generators are up to date and `y' generators are up to
+  // date use the generator widening.
+  if (x.generators_are_up_to_date() && y.generators_are_up_to_date()) {
+    x.generator_widening_assign(y, tp);
+    return;
+  }
+
+  x.congruence_widening_assign(y, tp);
+}
+
+void
+PPL::Grid::limited_extrapolation_assign(const Grid& y,
+                                        const Congruence_System& cgs,
+                                        unsigned* tp) {
+  Grid& x = *this;
+
+  // Check dimension compatibility.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+                                 "y", y);
+  // `cgs' must be dimension-compatible with the two grids.
+  const dimension_type cgs_space_dim = cgs.space_dimension();
+  if (x.space_dim < cgs_space_dim)
+    throw_dimension_incompatible("limited_extrapolation_assign(y, cgs)",
+                                 "cgs", cgs);
+
+  const dimension_type cgs_num_rows = cgs.num_rows();
+  // If `cgs' is empty (of rows), fall back to ordinary widening.
+  if (cgs_num_rows == 0) {
+    x.widening_assign(y, tp);
+    return;
+  }
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited widening between two grids in a zero-dimensional
+  // space is also a grid in a zero-dimensional space.
+  if (x.space_dim == 0)
+    return;
+
+  // Update the generators of `x': these are used to select, from the
+  // congruences in `cgs', those that must be added to the widened
+  // grid.
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    // `x' is empty.
+    return;
+
+  if (tp == NULL || *tp == 0) {
+    // Widening may change the grid, so add the congruences.
+    Congruence_System new_cgs;
+    // The congruences to be added need only be satisfied by all the
+    // generators of `x', as `y <= x'.  Iterate upwards here, to keep
+    // the relative ordering of congruences (just for aesthetics).
+    for (dimension_type i = 0; i < cgs_num_rows; ++i) {
+      const Congruence& cg = cgs[i];
+      if (x.relation_with(cg) == Poly_Con_Relation::is_included())
+        new_cgs.insert(cg);
+    }
+    x.widening_assign(y, tp);
+    x.add_recycled_congruences(new_cgs);
+  }
+  else
+    // There are tokens, so widening will leave the grid the same.
+    x.widening_assign(y, tp);
+
+  PPL_ASSERT(OK());
+}
diff --git a/src/H79_Certificate.cc b/src/H79_Certificate.cc
new file mode 100644
index 0000000..f90b6c3
--- /dev/null
+++ b/src/H79_Certificate.cc
@@ -0,0 +1,118 @@
+/* H79_Certificate class implementation
+   (non-inline member functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "H79_Certificate_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::H79_Certificate::H79_Certificate(const Polyhedron& ph)
+  : affine_dim(0), num_constraints(0) {
+  // The affine dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  affine_dim = space_dim;
+  const Constraint_System& cs = ph.minimized_constraints();
+  // It is assumed that `ph' is not an empty polyhedron.
+  PPL_ASSERT(!ph.marked_empty());
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    ++num_constraints;
+    if (i->is_equality())
+      --affine_dim;
+  }
+
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, generators might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to constraints when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the generator
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+}
+
+int
+PPL::H79_Certificate::compare(const H79_Certificate& y) const {
+  if (affine_dim != y.affine_dim)
+    return (affine_dim > y.affine_dim) ? 1 : -1;
+  if (num_constraints != y.num_constraints)
+    return (num_constraints > y.num_constraints) ? 1 : -1;
+  // All components are equal.
+  return 0;
+}
+
+int
+PPL::H79_Certificate::compare(const Polyhedron& ph) const {
+  // The affine dimension of the polyhedron is obtained by subtracting
+  // the number of equalities from the space dimension.
+  // When counting constraints, for a correct reasoning, we have
+  // to disregard the low-level constraints (i.e., the positivity
+  // constraint and epsilon bounds).
+  const dimension_type space_dim = ph.space_dimension();
+  dimension_type ph_affine_dim = space_dim;
+  dimension_type ph_num_constraints = 0;
+  const Constraint_System& cs = ph.minimized_constraints();
+  // It is assumed that `ph' is a polyhedron containing the
+  // polyhedron described by `*this': hence, it cannot be empty.
+  PPL_ASSERT(!ph.marked_empty());
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    ++ph_num_constraints;
+    if (i->is_equality())
+      --ph_affine_dim;
+  }
+  // TODO: this is an inefficient workaround.
+  // For NNC polyhedra, generators might be no longer up-to-date
+  // (and hence, neither minimized) due to the strong minimization
+  // process applied to constraints when constructing the certificate.
+  // We have to reinforce the (normal) minimization of the generator
+  // system. The future, lazy implementation of the strong minimization
+  // process will solve this problem.
+  if (!ph.is_necessarily_closed())
+    ph.minimize();
+
+  // If the affine dimension of `ph' is increasing, the chain is stabilizing.
+  if (ph_affine_dim > affine_dim)
+    return 1;
+
+  // At this point the two polyhedra must have the same affine dimension.
+  PPL_ASSERT(ph_affine_dim == affine_dim);
+
+  // If the number of constraints of `ph' is decreasing, then the chain
+  // is stabilizing. If it is increasing, the chain is not stabilizing.
+  if (ph_num_constraints != num_constraints)
+    return (ph_num_constraints < num_constraints) ? 1 : -1;
+
+  // All components are equal.
+  return 0;
+}
+
diff --git a/src/H79_Certificate_defs.hh b/src/H79_Certificate_defs.hh
new file mode 100644
index 0000000..1cc6fe2
--- /dev/null
+++ b/src/H79_Certificate_defs.hh
@@ -0,0 +1,98 @@
+/* H79_Certificate class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_H79_Certificate_defs_hh
+#define PPL_H79_Certificate_defs_hh 1
+
+#include "H79_Certificate_types.hh"
+#include "Polyhedron_types.hh"
+#include "globals_types.hh"
+#include "assert.hh"
+#include <vector>
+
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+  \note
+  The convergence of the H79 widening can also be certified by
+  BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+  //! Default constructor.
+  H79_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  template <typename PH>
+  H79_Certificate(const PH& ph);
+
+  //! Constructor: computes the certificate for \p ph.
+  H79_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  H79_Certificate(const H79_Certificate& y);
+
+  //! Destructor.
+  ~H79_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    H79 widening.
+  */
+  int compare(const H79_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  template <typename PH>
+  int compare(const PH& ph) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+  //! A total ordering on H79 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on H79 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const H79_Certificate& x,
+                    const H79_Certificate& y) const;
+  };
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+};
+
+#include "H79_Certificate_inlines.hh"
+
+#endif // !defined(PPL_H79_Certificate_defs_hh)
diff --git a/src/H79_Certificate_inlines.hh b/src/H79_Certificate_inlines.hh
new file mode 100644
index 0000000..0f94d8f
--- /dev/null
+++ b/src/H79_Certificate_inlines.hh
@@ -0,0 +1,71 @@
+/* H79_Certificate class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_H79_Certificate_inlines_hh
+#define PPL_H79_Certificate_inlines_hh 1
+
+#include "Polyhedron_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+H79_Certificate::H79_Certificate()
+  : affine_dim(0), num_constraints(0) {
+  // This is the certificate for a zero-dim universe polyhedron.
+}
+
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+  : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
+}
+
+inline
+H79_Certificate::~H79_Certificate() {
+}
+
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+                                     const H79_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this LGO relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+  : affine_dim(0), num_constraints(0) {
+  H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+  affine_dim = cert.affine_dim;
+  num_constraints = cert.num_constraints;
+}
+
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+  return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_H79_Certificate_inlines_hh)
diff --git a/src/H79_Certificate_types.hh b/src/H79_Certificate_types.hh
new file mode 100644
index 0000000..7da155b
--- /dev/null
+++ b/src/H79_Certificate_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_H79_Certificate_types_hh
+#define PPL_H79_Certificate_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_H79_Certificate_types_hh)
diff --git a/src/Handler_defs.hh b/src/Handler_defs.hh
new file mode 100644
index 0000000..ca2f6fd
--- /dev/null
+++ b/src/Handler_defs.hh
@@ -0,0 +1,96 @@
+/* Handler and derived classes' declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Handler_defs_hh
+#define PPL_Handler_defs_hh 1
+
+#include "Handler_types.hh"
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler {
+public:
+  //! Does the job.
+  virtual void act() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Handler();
+};
+
+//! A kind of Handler that installs a flag onto a flag-holder.
+/*!
+  The template class <CODE>Handler_Flag\<Flag_Base, Flag\></CODE>
+  is an handler whose job is to install a flag onto an <EM>holder</EM>
+  for the flag.
+  The flag is of type \p Flag and the holder is a (volatile) pointer
+  to \p Flag_Base.  Installing the flag onto the holder means making
+  the holder point to the flag, so that it must be possible to assign
+  a value of type <CODE>Flag*</CODE> to an entity of type
+  <CODE>Flag_Base*</CODE>.
+  The class \p Flag must provide the method
+
+  \code
+    int priority() const
+  \endcode
+  returning an integer priority associated to the flag.
+
+  The handler will install its flag onto the holder only if the holder
+  is empty, namely, it is the null pointer, or if the holder holds a
+  flag of strictly lower priority.
+ */
+template <typename Flag_Base, typename Flag>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Flag
+  : public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+  /*! \brief
+    Does its job: installs the flag onto the holder, if a flag with
+    an higher priority has not already been installed.
+  */
+  virtual void act() const;
+
+private:
+  // declare holder as reference to volatile pointer to const Flag_Base
+  const Flag_Base* volatile& h;
+  Flag& f;
+};
+
+//! A kind of Handler calling a given function.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Function
+  : public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Function(void (* const function)());
+
+  //! Does its job: calls the embedded function.
+  virtual void act() const;
+
+private:
+  //! Pointer to the embedded function.
+  void (* const f)();
+};
+
+#include "Handler_inlines.hh"
+
+#endif // !defined(PPL_Handler_defs_hh)
diff --git a/src/Handler_inlines.hh b/src/Handler_inlines.hh
new file mode 100644
index 0000000..00fa0c1
--- /dev/null
+++ b/src/Handler_inlines.hh
@@ -0,0 +1,66 @@
+/* Handler and derived classes' implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Handler_inlines_hh
+#define PPL_Handler_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Handler::~Handler() {
+}
+
+template <typename Flag_Base, typename Flag>
+Handler_Flag<Flag_Base, Flag>::Handler_Flag(const Flag_Base* volatile& holder,
+                                            Flag& flag)
+  : h(holder), f(flag) {
+}
+
+template <typename Flag_Base, typename Flag>
+void
+Handler_Flag<Flag_Base, Flag>::act() const {
+  if (h == 0 || static_cast<const Flag&>(*h).priority() < f.priority())
+    h = &f;
+}
+
+inline
+Handler_Function::Handler_Function(void (* const function)())
+  : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+  (*f)();
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Handler_inlines_hh)
diff --git a/src/Handler_types.hh b/src/Handler_types.hh
new file mode 100644
index 0000000..9f842ab
--- /dev/null
+++ b/src/Handler_types.hh
@@ -0,0 +1,35 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Handler_types_hh
+#define PPL_Handler_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Handler_types_hh)
diff --git a/src/Has_Assign_Or_Swap.hh b/src/Has_Assign_Or_Swap.hh
new file mode 100644
index 0000000..55945ed
--- /dev/null
+++ b/src/Has_Assign_Or_Swap.hh
@@ -0,0 +1,54 @@
+/* Has_Assign_Or_Swap classes declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Has_Assign_Or_Swap_hh
+#define PPL_Has_Assign_Or_Swap_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is not present by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Has_Assign_Or_Swap : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is present if it is present (!).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Has_Assign_Or_Swap<T,
+                          typename Enable_If_Is<void (T::*)(T& x),
+                                                &T::assign_or_swap>::type>
+  : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Has_Assign_Or_Swap_hh)
diff --git a/src/Init.cc b/src/Init.cc
new file mode 100644
index 0000000..cef1af6
--- /dev/null
+++ b/src/Init.cc
@@ -0,0 +1,219 @@
+/* Init class implementation (non-inline functions and static variables).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Init_defs.hh"
+#include "Variable_defs.hh"
+#include "fpu_defs.hh"
+#include "Rounding_Dir_defs.hh"
+#include "checked_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+#include "Congruence_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Generator_System_defs.hh"
+#include "Congruence_System_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Watchdog_defs.hh"
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+unsigned int PPL::Init::count = 0;
+
+PPL::fpu_rounding_direction_type PPL::Init::old_rounding_direction;
+
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void)
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+  __attribute__((weak));
+
+void
+ppl_set_GMP_memory_allocation_functions(void) {
+}
+#else
+  ;
+#endif
+
+#if PPL_CAN_CONTROL_FPU \
+  && defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+
+namespace {
+
+     float  nf1 =  -3, pf1 = 3,  f2 =  5;
+     double nd1 =  -7, pd1 = 7,  d2 = 11;
+long double nl1 = -13, pl1 = 13, l2 = 17;
+
+      float nf[2], pf[2];
+     double nd[2], pd[2];
+long double nl[2], pl[2];
+
+int
+ppl_check_function() {
+  int r = 0;
+  if (nf[0] == nf[1] || pf[0] == pf[1] || -nf[0] != pf[1] || -nf[1] != pf[0])
+    r |= 1;
+  if (nd[0] == nd[1] || pd[0] == pd[1] || -nd[0] != pd[1] || -nd[1] != pd[0])
+    r |= 2;
+  if (nl[0] == nl[1] || pl[0] == pl[1] || -nl[0] != pl[1] || -nl[1] != pl[0])
+    r |= 4;
+  return r;
+}
+
+int
+ppl_setround_function(int rounding_mode) {
+  return fesetround(rounding_mode);
+}
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+int (* volatile ppl_check_function_p)() = ppl_check_function;
+int (* volatile ppl_setround_function_p)(int) = ppl_setround_function;
+
+} // Implementation
+
+} // Parma_Polyhedra_Library
+
+namespace {
+
+int
+ppl_test_rounding() {
+  if ((*ppl_setround_function_p)(FE_DOWNWARD) != 0)
+    return 255;
+
+  nf[0] = nf1 / f2;
+  nd[0] = nd1 / d2;
+  nl[0] = nl1 / l2;
+  pf[0] = pf1 / f2;
+  pd[0] = pd1 / d2;
+  pl[0] = pl1 / l2;
+
+  if ((*ppl_setround_function_p)(FE_UPWARD) != 0)
+    return 255;
+
+  nf[1] = nf1 / f2;
+  nd[1] = nd1 / d2;
+  nl[1] = nl1 / l2;
+  pf[1] = pf1 / f2;
+  pd[1] = pd1 / d2;
+  pl[1] = pl1 / l2;
+
+  return (*ppl_check_function_p)();
+}
+
+} // namespace
+
+#endif // PPL_CAN_CONTROL_FPU 
+       // && defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+
+PPL::Init::Init() {
+  // Only when the first Init object is constructed...
+  if (count++ == 0) {
+    // ... the GMP memory allocation functions are set, ...
+    ppl_set_GMP_memory_allocation_functions();
+    // ... the default output function for Variable objects is set, ...
+    Variable::set_output_function(&Variable::default_output_function);
+    // ... the Coefficient constants are initialized, ...
+    Coefficient_constants_initialize();
+    // ... the Linear_Expression class is initialized, ...
+    Linear_Expression::initialize();
+    // ... the Constraint, Generator, Congruence, Grid_Generator,
+    // Constraint_System, Generator_System, Congruence_System,
+    // Grid_Generator_System and Polyhedron classes are initialized, ...
+    Constraint::initialize();
+    Generator::initialize();
+    Congruence::initialize();
+    Grid_Generator::initialize();
+    Constraint_System::initialize();
+    Generator_System::initialize();
+    Congruence_System::initialize();
+    Grid_Generator_System::initialize();
+    Polyhedron::initialize();
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+    // ... the Watchdog subsystem is initialized, ...
+    Watchdog::Watchdog::initialize();
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+#if PPL_CAN_CONTROL_FPU
+
+    // ... and the FPU rounding direction is set.
+    fpu_initialize_control_functions();
+    old_rounding_direction = fpu_get_rounding_direction();
+    fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+
+#if defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+    if (ppl_test_rounding() != 0)
+      throw std::logic_error("PPL configuration error:"
+                             " PPL_ARM_CAN_CONTROL_FPU evaluates to true,"
+                             " but rounding does not work.");
+#endif // defined(PPL_ARM_CAN_CONTROL_FPU) && PPL_ARM_CAN_CONTROL_FPU
+
+#endif // PPL_CAN_CONTROL_FPU
+
+    // The default is chosen to have a precision greater than most
+    // precise IEC 559 floating point (112 bits of mantissa).
+    set_irrational_precision(DEFAULT_IRRATIONAL_PRECISION);
+  }
+}
+
+PPL::Init::~Init() {
+  // Only when the last Init object is destroyed...
+  if (--count == 0) {
+#if PPL_CAN_CONTROL_FPU
+    // ... the FPU rounding direction is restored, ...
+    fpu_set_rounding_direction(old_rounding_direction);
+#endif
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+    // ... the Watchdog subsystem is finalized, ...
+    Watchdog::Watchdog::finalize();
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+    // ... the Polyhedron, Grid_Generator_System, Congruence_System,
+    // Generator_System, Constraint_System, Grid_Generator,
+    // Congruence, Generator and Constraint classes are finalized
+    // IN THAT ORDER, ...
+    Polyhedron::finalize();
+    Grid_Generator_System::finalize();
+    Congruence_System::finalize();
+    Generator_System::finalize();
+    Constraint_System::finalize();
+    Grid_Generator::finalize();
+    Congruence::finalize();
+    Generator::finalize();
+    Constraint::finalize();
+    // ... the Linear_Expression class is finalized, ...
+    Linear_Expression::finalize();
+    // ... and the Coefficient constants are finalized.
+    Coefficient_constants_finalize();
+  }
+}
diff --git a/src/Init_defs.hh b/src/Init_defs.hh
new file mode 100644
index 0000000..80923e8
--- /dev/null
+++ b/src/Init_defs.hh
@@ -0,0 +1,100 @@
+/* Init class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Init_defs_hh
+#define PPL_Init_defs_hh 1
+
+#include "Init_types.hh"
+#include "fpu_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+void set_rounding_for_PPL();
+
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
+
+  This is important if the application uses floating-point computations
+  outside the PPL.  It is crucial when the application uses functions
+  from a mathematical library that are not guaranteed to work correctly
+  under all rounding modes.
+
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+void restore_pre_PPL_rounding();
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+  <EM>Nifty Counter</EM> initialization class,
+  ensuring that the library is initialized only once
+  and before its first use.
+  A count of the number of translation units using the library
+  is maintained. A static object of Init type will be declared
+  by each translation unit using the library.  As a result,
+  only one of them will initialize and properly finalize
+  the library.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Init {
+public:
+  //! Initializes the PPL.
+  Init();
+
+  //! Finalizes the PPL.
+  ~Init();
+
+private:
+  /*! \brief
+    Default precision parameter used for irrational calculations.
+
+    The default is chosen to have a precision greater than most
+    precise IEC 559 floating point (112 bits of mantissa).
+  */
+  static const unsigned DEFAULT_IRRATIONAL_PRECISION = 128U;
+
+  //! Count the number of objects created.
+  static unsigned int count;
+  static fpu_rounding_direction_type old_rounding_direction;
+
+  friend void set_rounding_for_PPL();
+  friend void restore_pre_PPL_rounding();
+};
+
+#include "Init_inlines.hh"
+
+
+#endif // !defined(PPL_Init_defs_hh)
diff --git a/src/Init_inlines.hh b/src/Init_inlines.hh
new file mode 100644
index 0000000..124a03e
--- /dev/null
+++ b/src/Init_inlines.hh
@@ -0,0 +1,48 @@
+/* Init class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Init_inlines_hh
+#define PPL_Init_inlines_hh 1
+
+#include "fpu_defs.hh"
+#include "Rounding_Dir_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+set_rounding_for_PPL() {
+#if PPL_CAN_CONTROL_FPU
+    fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+#endif
+}
+
+inline void
+restore_pre_PPL_rounding() {
+#if PPL_CAN_CONTROL_FPU
+  fpu_set_rounding_direction(Init::old_rounding_direction);
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Init_inlines_hh)
diff --git a/src/Init_types.hh b/src/Init_types.hh
new file mode 100644
index 0000000..410bc01
--- /dev/null
+++ b/src/Init_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Init_types_hh
+#define PPL_Init_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Init_types_hh)
diff --git a/src/Integer_Interval.hh b/src/Integer_Interval.hh
new file mode 100644
index 0000000..1f873ed
--- /dev/null
+++ b/src/Integer_Interval.hh
@@ -0,0 +1,53 @@
+/* Integer_Interval class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Integer_Interval_hh
+#define PPL_Integer_Interval_hh 1
+
+#include "Interval_defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Integer_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int, Integer_Interval_Info_Policy> Integer_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with integral, necessarily closed boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpz_class, Integer_Interval_Info> Integer_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Integer_Interval_hh)
diff --git a/src/Interval_Info_defs.hh b/src/Interval_Info_defs.hh
new file mode 100644
index 0000000..235b35b
--- /dev/null
+++ b/src/Interval_Info_defs.hh
@@ -0,0 +1,285 @@
+/* Interval_Info class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_Info_defs_hh
+#define PPL_Interval_Info_defs_hh 1
+
+#include "Boundary_defs.hh"
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interval_NS {
+
+struct Property {
+  enum Type {
+    CARDINALITY_0_,
+    CARDINALITY_1_,
+    CARDINALITY_IS_
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+const Property CARDINALITY_0(Property::CARDINALITY_0_);
+const Property CARDINALITY_1(Property::CARDINALITY_1_);
+const Property CARDINALITY_IS(Property::CARDINALITY_IS_);
+
+template <typename T>
+inline void
+reset_bits(T& bits) {
+  bits = 0;
+}
+
+template <typename T>
+inline void
+reset_bit(T& bits, unsigned int bit) {
+  bits &= ~(static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bit(T& bits, unsigned int bit, bool value) {
+  if (value)
+    bits |= static_cast<T>(1) << bit;
+  else
+    reset_bit(bits, bit);
+}
+
+template <typename T>
+inline bool
+get_bit(const T& bits, unsigned int bit) {
+  return (bits & (static_cast<T>(1) << bit)) != 0;
+}
+
+template <typename T>
+inline void
+set_bits(T& bits, unsigned int start, unsigned int len, T value) {
+  bits &= ~(((static_cast<T>(1) << len) - 1) << start);
+  bits |= value << start;
+}
+
+template <typename T>
+inline T
+get_bits(T& bits, unsigned int start, unsigned int len) {
+  return (bits >> start) & ((static_cast<T>(1) << len) - 1);
+}
+
+} // namespace Interval_NS
+
+using namespace Interval_NS;
+using namespace Boundary_NS;
+
+
+template <typename Policy>
+class Interval_Info_Null {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, false);
+  const_bool_nodef(cache_singleton, false);
+  Interval_Info_Null() {
+  }
+  void clear() {
+  }
+  void clear_boundary_properties(Boundary_Type) {
+  }
+
+  template <typename Property>
+  void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_boundary_property(Boundary_Type, const Property&) const {
+    return Property::unsupported_value;
+  }
+  template <typename Property>
+  void set_interval_property(const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_interval_property(const Property&) const {
+    return Property::unsupported_value;
+  }
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Interval_Info_Null& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+};
+
+template <typename Policy>
+class Interval_Info_Null_Open : public Interval_Info_Null<Policy> {
+public:
+  const_bool_nodef(store_open, true);
+  Interval_Info_Null_Open(bool o)
+    : open(o) {
+  }
+  bool get_boundary_property(Boundary_Type,
+                             const Boundary_NS::Property& p) const {
+    if (p.type == Boundary_NS::Property::OPEN_)
+      return open;
+    else
+      return Boundary_NS::Property::unsupported_value;
+  }
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+private:
+  bool open;
+};
+
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, Policy::store_special);
+  const_bool_nodef(store_open, Policy::store_open);
+  const_bool_nodef(cache_empty, Policy::cache_empty);
+  const_bool_nodef(cache_singleton, Policy::cache_singleton);
+  const_int_nodef(lower_special_bit, Policy::next_bit);
+  const_int_nodef(lower_open_bit, lower_special_bit + (store_special ? 1 : 0));
+  const_int_nodef(upper_special_bit, lower_open_bit + (store_open ? 1 : 0));
+  const_int_nodef(upper_open_bit, upper_special_bit + (store_special ? 1 : 0));
+  const_int_nodef(cardinality_is_bit, upper_open_bit + (store_open ? 1 : 0));
+  const_int_nodef(cardinality_0_bit, cardinality_is_bit
+                  + ((cache_empty || cache_singleton) ? 1 : 0));
+  const_int_nodef(cardinality_1_bit, cardinality_0_bit + (cache_empty ? 1 : 0));
+  const_int_nodef(next_bit, cardinality_1_bit + (cache_singleton ? 1 : 0));
+
+  Interval_Info_Bitset() {
+    // FIXME: would we have speed benefits with uninitialized info?
+    // (Dirty_Temp)
+    clear();
+  }
+
+  void clear() {
+    reset_bits(bitset);
+  }
+  void clear_boundary_properties(Boundary_Type t) {
+    set_boundary_property(t, SPECIAL, false);
+    set_boundary_property(t, OPEN, false);
+  }
+  void set_boundary_property(Boundary_Type t,
+                             const Boundary_NS::Property& p,
+                             bool value = true) {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (store_special) {
+        if (t == LOWER)
+          set_bit(bitset, lower_special_bit, value);
+        else
+          set_bit(bitset, upper_special_bit, value);
+      }
+      break;
+    case Boundary_NS::Property::OPEN_:
+      if (store_open) {
+        if (t == LOWER)
+          set_bit(bitset, lower_open_bit, value);
+        else
+          set_bit(bitset, upper_open_bit, value);
+      }
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_boundary_property(Boundary_Type t, const Boundary_NS::Property& p) const {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (!store_special)
+        return false;
+      if (t == LOWER)
+        return get_bit(bitset, lower_special_bit);
+      else
+        return get_bit(bitset, upper_special_bit);
+    case Boundary_NS::Property::OPEN_:
+      if (!store_open)
+        return false;
+      else if (t == LOWER)
+        return get_bit(bitset, lower_open_bit);
+      else
+        return get_bit(bitset, upper_open_bit);
+    default:
+      return false;
+    }
+  }
+  void set_interval_property(const Interval_NS::Property& p, bool value = true) {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      if (cache_empty)
+        set_bit(bitset, cardinality_0_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_1_:
+      if (cache_singleton)
+        set_bit(bitset, cardinality_1_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_IS_:
+      if (cache_empty || cache_singleton)
+        set_bit(bitset, cardinality_is_bit, value);
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_interval_property(Interval_NS::Property p) const {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      return cache_empty && get_bit(bitset, cardinality_0_bit);
+    case Interval_NS::Property::CARDINALITY_1_:
+      return cache_singleton && get_bit(bitset, cardinality_1_bit);
+    case Interval_NS::Property::CARDINALITY_IS_:
+      return (cache_empty || cache_singleton)
+        && get_bit(bitset, cardinality_is_bit);
+    default:
+      return false;
+    }
+  }
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Interval_Info_Bitset& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+protected:
+  T bitset;
+};
+
+}
+
+#include "Interval_Info_inlines.hh"
+
+#endif // !defined(PPL_Interval_Info_defs_hh)
diff --git a/src/Interval_Info_inlines.hh b/src/Interval_Info_inlines.hh
new file mode 100644
index 0000000..e93173d
--- /dev/null
+++ b/src/Interval_Info_inlines.hh
@@ -0,0 +1,116 @@
+/* Interval_Info class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_Info_inlines_hh
+#define PPL_Interval_Info_inlines_hh 1
+
+#include <iomanip>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::m_swap(Interval_Info_Null<Policy>&) {
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::ascii_dump(std::ostream&) const {
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null<Policy>::ascii_load(std::istream&) {
+  return true;
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null_Open<Policy>::ascii_dump(std::ostream& s) const {
+  s << (open ? "open" : "closed");
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null_Open<Policy>::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str))
+    return false;
+  if (str == "open") {
+    open = true;
+    return true;
+  }
+  if (str == "closed") {
+    open = false;
+    return true;
+  }
+  return false;
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::m_swap(Interval_Info_Bitset<T, Policy>& y) {
+  using std::swap;
+  swap(bitset, y.bitset);
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::ascii_dump(std::ostream& s) const {
+  const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+                                              std::ios::basefield);
+  s << bitset;
+  s.flags(old_flags);
+}
+
+template <typename T, typename Policy>
+inline bool
+Interval_Info_Bitset<T, Policy>::ascii_load(std::istream& s) {
+  const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+                                              std::ios::basefield);
+  s >> bitset;
+  s.flags(old_flags);
+  return !s.fail();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Null */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+inline void
+swap(Interval_Info_Null<Policy>& x, Interval_Info_Null<Policy>& y) {
+  x.m_swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Bitset */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+inline void
+swap(Interval_Info_Bitset<T, Policy>& x, Interval_Info_Bitset<T, Policy>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_Info_inlines_hh)
diff --git a/src/Interval_Info_types.hh b/src/Interval_Info_types.hh
new file mode 100644
index 0000000..ba1e6fb
--- /dev/null
+++ b/src/Interval_Info_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Interval_Info_types_hh
+#define PPL_Interval_Info_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+class Interval_Info_Null;
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_Info_types_hh)
diff --git a/src/Interval_defs.hh b/src/Interval_defs.hh
new file mode 100644
index 0000000..f953ac9
--- /dev/null
+++ b/src/Interval_defs.hh
@@ -0,0 +1,763 @@
+/* Declarations for the Interval class and its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_defs_hh
+#define PPL_Interval_defs_hh 1
+
+#include "globals_defs.hh"
+#include "meta_programming.hh"
+#include "assign_or_swap.hh"
+#include "intervals_defs.hh"
+#include "Interval_types.hh"
+#include "Interval_Info_defs.hh"
+#include <iosfwd>
+
+// Temporary!
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+enum Ternary { T_YES, T_NO, T_MAYBE };
+
+inline I_Result
+combine(Result l, Result u) {
+  const unsigned res
+    = static_cast<unsigned>(l) | (static_cast<unsigned>(u) << 6);
+  return static_cast<I_Result>(res);
+}
+
+struct Interval_Base {
+};
+
+using namespace Boundary_NS;
+using namespace Interval_NS;
+
+template <typename T, typename Enable = void>
+struct Is_Singleton : public Is_Native_Or_Checked<T> {};
+
+template <typename T>
+struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
+
+//! A generic, not necessarily closed, possibly restricted interval.
+/*! \ingroup PPL_CXX_interface
+  The class template type parameter \p Boundary represents the type
+  of the interval boundaries, and can be chosen, among other possibilities,
+  within one of the following number families:
+
+  - a bounded precision native integer type (that is,
+    from <CODE>signed char</CODE> to <CODE>long long</CODE>
+    and from <CODE>int8_t</CODE> to <CODE>int64_t</CODE>);
+  - a bounded precision floating point type (<CODE>float</CODE>,
+    <CODE>double</CODE> or <CODE>long double</CODE>);
+  - an unbounded integer or rational type, as provided by the C++ interface
+    of GMP (<CODE>mpz_class</CODE> or <CODE>mpq_class</CODE>).
+
+  The class template type parameter \p Info allows to control a number
+  of features of the class, among which:
+
+  - the ability to support open as well as closed boundaries;
+  - the ability to represent empty intervals in addition to nonempty ones;
+  - the ability to represent intervals of extended number families
+    that contain positive and negative infinities;
+*/
+template <typename Boundary, typename Info>
+class Interval : public Interval_Base, private Info {
+private:
+  PPL_COMPILE_TIME_CHECK(!Info::store_special
+                         || !std::numeric_limits<Boundary>::has_infinity,
+                         "store_special is meaningless"
+                         " when boundary type may contains infinity");
+  Info& w_info() const {
+    return const_cast<Interval&>(*this);
+  }
+
+public:
+  typedef Boundary boundary_type;
+  typedef Info info_type;
+
+  typedef Interval_NS::Property Property;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator=(const T& x) {
+    assign(x);
+    return *this;
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator+=(const T& x) {
+    add_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator-=(const T& x) {
+    sub_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator*=(const T& x) {
+    mul_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator/=(const T& x) {
+    div_assign(*this, x);
+    return *this;
+  }
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Interval& y);
+
+  Info& info() {
+    return *this;
+  }
+
+  const Info& info() const {
+    return *this;
+  }
+
+  Boundary& lower() {
+    return lower_;
+  }
+
+  const Boundary& lower() const {
+    return lower_;
+  }
+
+  Boundary& upper() {
+    return upper_;
+  }
+
+  const Boundary& upper() const {
+    return upper_;
+  }
+
+  I_Constraint<boundary_type> lower_constraint() const {
+    PPL_ASSERT(!is_empty());
+    if (info().get_boundary_property(LOWER, SPECIAL))
+      return I_Constraint<boundary_type>();
+    return i_constraint(lower_is_open() ? GREATER_THAN : GREATER_OR_EQUAL,
+                        lower(), true);
+  }
+  I_Constraint<boundary_type> upper_constraint() const {
+    PPL_ASSERT(!is_empty());
+    if (info().get_boundary_property(UPPER, SPECIAL))
+      return I_Constraint<boundary_type>();
+    return i_constraint(upper_is_open() ? LESS_THAN : LESS_OR_EQUAL,
+                        upper(), true);
+  }
+
+  bool is_empty() const {
+    return lt(UPPER, upper(), info(), LOWER, lower(), info());
+  }
+
+  bool check_empty(I_Result r) const {
+    return (r & I_ANY) == I_EMPTY
+      || ((r & I_ANY) != I_NOT_EMPTY && is_empty());
+  }
+
+  bool is_singleton() const {
+    return eq(LOWER, lower(), info(), UPPER, upper(), info());
+  }
+
+  bool lower_is_open() const {
+    PPL_ASSERT(OK());
+    return is_open(LOWER, lower(), info());
+  }
+
+  bool upper_is_open() const {
+    PPL_ASSERT(OK());
+    return is_open(UPPER, upper(), info());
+  }
+
+  bool lower_is_boundary_infinity() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_boundary_infinity(LOWER, lower(), info());
+  }
+
+  bool upper_is_boundary_infinity() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_boundary_infinity(UPPER, upper(), info());
+  }
+
+  bool lower_is_domain_inf() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_domain_inf(LOWER, lower(), info());
+  }
+
+  bool upper_is_domain_sup() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_domain_sup(UPPER, upper(), info());
+  }
+
+  bool is_bounded() const {
+    PPL_ASSERT(OK());
+    return !lower_is_boundary_infinity() && !upper_is_boundary_infinity();
+  }
+
+  bool is_universe() const {
+    PPL_ASSERT(OK());
+    return lower_is_domain_inf() && upper_is_domain_sup();
+  }
+
+  I_Result lower_extend() {
+    info().clear_boundary_properties(LOWER);
+    set_unbounded(LOWER, lower(), info());
+    return I_ANY;
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  lower_extend(const C& c);
+
+  I_Result upper_extend() {
+    info().clear_boundary_properties(UPPER);
+    set_unbounded(UPPER, upper(), info());
+    return I_ANY;
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  upper_extend(const C& c);
+
+  I_Result build() {
+    return assign(UNIVERSE);
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  build(const C& c) {
+    Relation_Symbol rs;
+    switch (c.rel()) {
+    case V_LGE:
+    case V_GT_MINUS_INFINITY:
+    case V_LT_PLUS_INFINITY:
+      return assign(UNIVERSE);
+    default:
+      return assign(EMPTY);
+    case V_LT:
+    case V_LE:
+    case V_GT:
+    case V_GE:
+    case V_EQ:
+    case V_NE:
+      assign(UNIVERSE);
+      rs = static_cast<Relation_Symbol>(c.rel());
+      return refine_existential(rs, c.value());
+    }
+  }
+
+  template <typename C1, typename C2>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C1>::value
+                     &&
+                     Is_Same_Or_Derived<I_Constraint_Base, C2>::value,
+                     I_Result>::type
+  build(const C1& c1, const C2& c2) {
+    switch (c1.rel()) {
+    case V_LGE:
+      return build(c2);
+    case V_NAN:
+      return assign(EMPTY);
+    default:
+      break;
+    }
+    switch (c2.rel()) {
+    case V_LGE:
+      return build(c1);
+    case V_NAN:
+      return assign(EMPTY);
+    default:
+      break;
+    }
+    build(c1);
+    const I_Result r = add_constraint(c2);
+    return r - (I_CHANGED | I_UNCHANGED);
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  add_constraint(const C& c) {
+    Interval x;
+    x.build(c);
+    return intersect_assign(x);
+  }
+
+  I_Result assign(Degenerate_Element e) {
+    I_Result r;
+    info().clear();
+    switch (e) {
+    case EMPTY:
+      lower_ = 1;
+      upper_ = 0;
+      r = I_EMPTY | I_EXACT;
+      break;
+    case UNIVERSE:
+      set_unbounded(LOWER, lower(), info());
+      set_unbounded(UPPER, upper(), info());
+      r = I_UNIVERSE | I_EXACT;
+      break;
+    default:
+      PPL_UNREACHABLE;
+      r = I_EMPTY;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return r;
+  }
+
+  template <typename From>
+  typename Enable_If<Is_Special<From>::value, I_Result>::type
+  assign(const From&) {
+    info().clear();
+    Result rl;
+    Result ru;
+    switch (From::vclass) {
+    case VC_MINUS_INFINITY:
+      rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+      ru = Boundary_NS::set_minus_infinity(UPPER, upper(), info());
+      break;
+    case VC_PLUS_INFINITY:
+      rl = Boundary_NS::set_plus_infinity(LOWER, lower(), info());
+      ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+      break;
+    default:
+      PPL_UNREACHABLE;
+      rl = V_NAN;
+      ru = V_NAN;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return combine(rl, ru);
+  }
+
+  I_Result set_infinities() {
+    info().clear();
+    Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+    Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+    PPL_ASSERT(OK());
+    return combine(rl, ru);
+  }
+
+  static bool is_always_topologically_closed() {
+    return !Info::store_open;
+  }
+
+  bool is_topologically_closed() const {
+    PPL_ASSERT(OK());
+    return is_always_topologically_closed()
+      || is_empty()
+      || ((lower_is_boundary_infinity() || !lower_is_open())
+          && (upper_is_boundary_infinity() || !upper_is_open()));
+  }
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign() {
+    if (!Info::store_open || is_empty())
+      return;
+    if (lower_is_open() && !lower_is_boundary_infinity())
+      info().set_boundary_property(LOWER, OPEN, false);
+    if (upper_is_open() && !upper_is_boundary_infinity())
+      info().set_boundary_property(UPPER, OPEN, false);
+  }
+
+  void remove_inf() {
+    PPL_ASSERT(!is_empty());
+    if (!Info::store_open)
+      return;
+    info().set_boundary_property(LOWER, OPEN, true);
+  }
+
+  void remove_sup() {
+    PPL_ASSERT(!is_empty());
+    if (!Info::store_open)
+      return;
+    info().set_boundary_property(UPPER, OPEN, true);
+  }
+
+  int infinity_sign() const {
+    PPL_ASSERT(OK());
+    if (is_reverse_infinity(LOWER, lower(), info()))
+      return 1;
+    else if (is_reverse_infinity(UPPER, upper(), info()))
+      return -1;
+    else
+      return 0;
+  }
+
+  bool contains_integer_point() const {
+    PPL_ASSERT(OK());
+    if (is_empty())
+      return false;
+    if (!is_bounded())
+      return true;
+    Boundary l;
+    if (lower_is_open()) {
+      add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
+      floor_assign_r(l, l, ROUND_DOWN);
+    }
+    else
+      ceil_assign_r(l, lower(), ROUND_DOWN);
+    Boundary u;
+    if (upper_is_open()) {
+      sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
+      ceil_assign_r(u, u, ROUND_UP);
+    }
+    else
+      floor_assign_r(u, upper(), ROUND_UP);
+    return u >= l;
+  }
+
+  void drop_some_non_integer_points() {
+    if (is_empty())
+      return;
+    if (lower_is_open() && !lower_is_boundary_infinity()) {
+      add_assign_r(lower(), lower(), Boundary(1), ROUND_DOWN);
+      floor_assign_r(lower(), lower(), ROUND_DOWN);
+      info().set_boundary_property(LOWER, OPEN, false);
+    }
+    else
+      ceil_assign_r(lower(), lower(), ROUND_DOWN);
+    if (upper_is_open() && !upper_is_boundary_infinity()) {
+      sub_assign_r(upper(), upper(), Boundary(1), ROUND_UP);
+      ceil_assign_r(upper(), upper(), ROUND_UP);
+      info().set_boundary_property(UPPER, OPEN, false);
+    }
+    else
+      floor_assign_r(upper(), upper(), ROUND_UP);
+  }
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  wrap_assign(Bounded_Integer_Type_Width w,
+              Bounded_Integer_Type_Representation r,
+              const From& refinement) {
+    if (is_empty())
+      return I_EMPTY;
+    if (lower_is_boundary_infinity() || upper_is_boundary_infinity())
+      return assign(refinement);
+    PPL_DIRTY_TEMP(Boundary, u);
+    Result result = sub_2exp_assign_r(u, upper(), w, ROUND_UP);
+    if (result_overflow(result) == 0 && u > lower())
+      return assign(refinement);
+    info().clear();
+    switch (r) {
+    case UNSIGNED:
+      umod_2exp_assign(LOWER, lower(), info(),
+                       LOWER, lower(), info(), w);
+      umod_2exp_assign(UPPER, upper(), info(),
+                       UPPER, upper(), info(), w);
+      break;
+    case SIGNED_2_COMPLEMENT:
+      smod_2exp_assign(LOWER, lower(), info(),
+                       LOWER, lower(), info(), w);
+      smod_2exp_assign(UPPER, upper(), info(),
+                       UPPER, upper(), info(), w);
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+    }
+    if (le(LOWER, lower(), info(), UPPER, upper(), info()))
+      return intersect_assign(refinement);
+    PPL_DIRTY_TEMP(Interval, tmp);
+    tmp.info().clear();
+    Boundary_NS::assign(LOWER, tmp.lower(), tmp.info(),
+                        LOWER, lower(), info());
+    set_unbounded(UPPER, tmp.upper(), tmp.info());
+    tmp.intersect_assign(refinement);
+    lower_extend();
+    intersect_assign(refinement);
+    return join_assign(tmp);
+  }
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+  bool OK() const {
+    if (!Info::may_be_empty && is_empty()) {
+#ifndef NDEBUG
+      std::cerr << "The interval is unexpectedly empty.\n";
+#endif
+      return false;
+    }
+
+    if (is_open(LOWER, lower(), info())) {
+      if (is_plus_infinity(LOWER, lower(), info())) {
+#ifndef NDEBUG
+        std::cerr << "The lower boundary is +inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+             && (is_minus_infinity(LOWER, lower(), info())
+                 || is_plus_infinity(LOWER, lower(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The lower boundary is unexpectedly infinity.\n";
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(LOWER, SPECIAL)) {
+      if (is_not_a_number(lower())) {
+#ifndef NDEBUG
+        std::cerr << "The lower boundary is not a number.\n";
+#endif
+        return false;
+      }
+    }
+
+    if (is_open(UPPER, upper(), info())) {
+      if (is_minus_infinity(UPPER, upper(), info())) {
+#ifndef NDEBUG
+        std::cerr << "The upper boundary is -inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+             && (is_minus_infinity(UPPER, upper(), info())
+                 || is_plus_infinity(UPPER, upper(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The upper boundary is unexpectedly infinity."
+                << std::endl;
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(UPPER, SPECIAL)) {
+      if (is_not_a_number(upper())) {
+#ifndef NDEBUG
+        std::cerr << "The upper boundary is not a number.\n";
+#endif
+        return false;
+      }
+    }
+
+    // Everything OK.
+    return true;
+  }
+
+  Interval() {
+  }
+
+  template <typename T>
+  explicit Interval(const T& x) {
+    assign(x);
+  }
+
+  /*! \brief
+    Builds the smallest interval containing the number whose textual
+    representation is contained in \p s.
+  */
+  explicit Interval(const char* s);
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  strictly_contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  is_disjoint_from(const T& y) const;
+
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  assign(const From& x);
+
+  template <typename Type>
+  typename Enable_If<Is_Singleton<Type>::value
+                     || Is_Interval<Type>::value, bool>::type
+  can_be_exactly_joined_to(const Type& x) const;
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  join_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  join_assign(const From1& x, const From2& y);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  intersect_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  intersect_assign(const From1& x, const From2& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p *this and \p x.
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  difference_assign(const From& x);
+
+  /*! \brief
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p x and \p y.
+  */
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  difference_assign(const From1& x, const From2& y);
+
+  /*! \brief
+    Assigns to \p *this the largest interval contained in the set-theoretic
+    difference of \p *this and \p x.
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  lower_approximation_difference_assign(const From& x);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+
+    \return
+    \c false if and only if the meet of \p *this and \p y is empty.
+  */
+  template <typename From>
+  typename Enable_If<Is_Interval<From>::value, bool>::type
+  simplify_using_context_assign(const From& y);
+
+  /*! \brief
+    Assigns to \p *this an interval having empty intersection with \p y.
+    The assigned interval should be as large as possible.
+  */
+  template <typename From>
+  typename Enable_If<Is_Interval<From>::value, void>::type
+  empty_intersection_assign(const From& y);
+
+  /*! \brief
+    Refines \p to according to the existential relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \exists b \in \mathtt{x} \st a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  refine_existential(Relation_Symbol rel, const From& x);
+
+  /*! \brief
+    Refines \p to so that it satisfies the universal relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \forall b \in \mathtt{x} \itc a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  refine_universal(Relation_Symbol rel, const From& x);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  neg_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  add_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  sub_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  mul_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  div_assign(const From1& x, const From2& y);
+
+  template <typename From, typename Iterator>
+  typename Enable_If<Is_Interval<From>::value, void>::type
+  CC76_widening_assign(const From& y, Iterator first, Iterator last);
+
+private:
+  Boundary lower_;
+  Boundary upper_;
+};
+
+//! Swaps \p x with \p y.
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+void swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Interval_inlines.hh"
+#include "Interval_templates.hh"
+
+#endif // !defined(PPL_Interval_defs_hh)
diff --git a/src/Interval_inlines.hh b/src/Interval_inlines.hh
new file mode 100644
index 0000000..8ab37e4
--- /dev/null
+++ b/src/Interval_inlines.hh
@@ -0,0 +1,1160 @@
+/* Inline functions for the Interval class and its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_inlines_hh
+#define PPL_Interval_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::external_memory_in_bytes() const {
+  return Parma_Polyhedra_Library::external_memory_in_bytes(lower())
+    + Parma_Polyhedra_Library::external_memory_in_bytes(upper());
+}
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::m_swap(Interval<Boundary, Info>& y) {
+  using std::swap;
+  swap(lower(), y.lower());
+  swap(upper(), y.upper());
+  swap(info(), y.info());
+}
+
+template <typename Boundary, typename Info>
+inline bool
+f_is_empty(const Interval<Boundary, Info>& x) {
+  return x.is_empty();
+}
+template <typename Boundary, typename Info>
+inline bool
+f_is_singleton(const Interval<Boundary, Info>& x) {
+  return x.is_singleton();
+}
+template <typename Boundary, typename Info>
+inline int
+infinity_sign(const Interval<Boundary, Info>& x) {
+  return x.infinity_sign();
+}
+
+namespace Interval_NS {
+
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_lower(const Interval<Boundary, Info>& x) {
+  return x.lower();
+}
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_upper(const Interval<Boundary, Info>& x) {
+  return x.upper();
+}
+template <typename Boundary, typename Info>
+inline const Info&
+f_info(const Interval<Boundary, Info>& x) {
+  return x.info();
+}
+
+struct Scalar_As_Interval_Policy {
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, true);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Null<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info;
+
+const Scalar_As_Interval_Info SCALAR_INFO;
+
+typedef Interval_Info_Null_Open<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info_Open;
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_lower(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_upper(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+                          const Scalar_As_Interval_Info&>::type
+f_info(const T&) {
+  return SCALAR_INFO;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+                          Scalar_As_Interval_Info_Open>::type
+f_info(const T&, bool open) {
+  return Scalar_As_Interval_Info_Open(open);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_empty(const T& x) {
+  return is_not_a_number(x);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_singleton(const T& x) {
+  return !f_is_empty(x);
+}
+
+} // namespace Interval_NS
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+is_singleton_integer(const T& x) {
+  return is_singleton(x) && is_integer(f_lower(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+check_empty_arg(const T& x) {
+  if (f_info(x).may_be_empty)
+    return f_is_empty(x);
+  else {
+    PPL_ASSERT(!f_is_empty(x));
+    return false;
+  }
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+                            || Is_Interval<T1>::value)
+                           && (Is_Singleton<T2>::value
+                               || Is_Interval<T2>::value)
+                           && (Is_Interval<T1>::value
+                               || Is_Interval<T2>::value)),
+                          bool>::type
+operator==(const T1& x, const T2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x))
+    return check_empty_arg(y);
+  else if (check_empty_arg(y))
+    return false;
+  return eq(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y))
+    && eq(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+                            || Is_Interval<T1>::value)
+                           && (Is_Singleton<T2>::value
+                               || Is_Interval<T2>::value)
+                           && (Is_Interval<T1>::value
+                               || Is_Interval<T2>::value)),
+                          bool>::type
+operator!=(const T1& x, const T2& y) {
+  return !(x == y);
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::contains(const T& y) const {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(y))
+    return true;
+  if (check_empty_arg(*this))
+    return false;
+  return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+    && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::strictly_contains(const T& y) const {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(y))
+    return !check_empty_arg(*this);
+  if (check_empty_arg(*this))
+    return false;
+  return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+          && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)))
+    || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+        && gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::is_disjoint_from(const T& y) const {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(*this) || check_empty_arg(y))
+    return true;
+  return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))
+    || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  const Result rl = Boundary_NS::assign(LOWER, lower(), to_info,
+                                        LOWER, f_lower(x), f_info(x));
+  const Result ru = Boundary_NS::assign(UPPER, upper(), to_info,
+                                        UPPER, f_upper(x), f_info(x));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(*this))
+    return assign(x);
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  Result rl;
+  Result ru;
+  rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x))
+    return assign(y);
+  if (check_empty_arg(y))
+    return assign(x);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  rl = min_assign(LOWER, lower(), to_info,
+                  LOWER, f_lower(x), f_info(x),
+                  LOWER, f_lower(y), f_info(y));
+  ru = max_assign(UPPER, upper(), to_info,
+                  UPPER, f_upper(x), f_info(x),
+                  UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename Boundary, typename Info>
+template <typename Type>
+inline typename Enable_If<Is_Singleton<Type>::value
+                          || Is_Interval<Type>::value, bool>::type
+Interval<Boundary, Info>::can_be_exactly_joined_to(const Type& x) const {
+  PPL_DIRTY_TEMP(Boundary, b);
+  if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) {
+    b = lower();
+    return eq(LOWER, b, info(), UPPER, f_upper(x), f_info(x));
+  }
+  else if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))) {
+    b = upper();
+    return eq(UPPER, b, info(), LOWER, f_lower(x), f_info(x));
+  }
+  return true;
+}
+
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  PPL_ASSERT(OK());
+  return I_ANY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From1& x,
+                                                 const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  max_assign(LOWER, lower(), to_info,
+             LOWER, f_lower(x), f_info(x),
+             LOWER, f_lower(y), f_info(y));
+  min_assign(UPPER, upper(), to_info,
+             UPPER, f_upper(x), f_info(x),
+             UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return I_NOT_EMPTY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))
+      || gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+    return combine(V_EQ, V_EQ);
+  bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  Result rl = V_EQ;
+  Result ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else {
+      info().clear_boundary_properties(LOWER);
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x));
+    }
+  }
+  else if (nu) {
+    info().clear_boundary_properties(UPPER);
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x));
+  }
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From1& x,
+                                                  const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y))
+      || gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y)))
+    return assign(x);
+  bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y));
+  bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+  Result rl = V_EQ;
+  Result ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else {
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y));
+      ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+    }
+  }
+  else if (nu) {
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::assign(LOWER, lower(), info(),
+                             LOWER, f_lower(x), f_info(x));
+  }
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>
+::refine_existential(Relation_Symbol rel, const From& x) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Boundary_NS::assign(UPPER, upper(), info(),
+                          UPPER, f_upper(x), f_info(x), true);
+      return I_ANY;
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Boundary_NS::assign(UPPER, upper(), info(),
+                          UPPER, f_upper(x), f_info(x));
+      return I_ANY;
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Boundary_NS::assign(LOWER, lower(), info(),
+                          LOWER, f_lower(x), f_info(x), true);
+      return I_ANY;
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Boundary_NS::assign(LOWER, lower(), info(),
+                          LOWER, f_lower(x), f_info(x));
+      return I_ANY;
+    }
+  case EQUAL:
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (!f_is_singleton(x))
+        return combine(V_EQ, V_EQ);
+      if (check_empty_arg(*this))
+        return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        remove_inf();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        remove_sup();
+      return I_ANY;
+    }
+  default:
+    PPL_UNREACHABLE;
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::refine_universal(Relation_Symbol rel,
+                                                 const From& x) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+                                      LOWER, f_lower(x), SCALAR_INFO,
+                                      !is_open(LOWER, f_lower(x), f_info(x)));
+      PPL_USED(ru);
+      return I_ANY;
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+                                      LOWER, f_lower(x), SCALAR_INFO);
+      PPL_USED(ru);
+      return I_ANY;
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+                                      UPPER, f_upper(x), SCALAR_INFO,
+                                      !is_open(UPPER, f_upper(x), f_info(x)));
+      PPL_USED(rl);
+      return I_ANY;
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+                                      UPPER, f_upper(x), SCALAR_INFO);
+      PPL_USED(rl);
+      return I_ANY;
+    }
+  case EQUAL:
+    if (!f_is_singleton(x))
+      return assign(EMPTY);
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (check_empty_arg(*this))
+        return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        remove_inf();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        remove_sup();
+      return I_ANY;
+    }
+  default:
+    PPL_UNREACHABLE;
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::neg_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x));
+  ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::add_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  if (inf_sign != 0) {
+    if (Parma_Polyhedra_Library::infinity_sign(y) == -inf_sign)
+      return assign(EMPTY);
+  }
+  else
+    inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+  if (inf_sign < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf_sign > 0)
+    return assign(PLUS_INFINITY);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info,
+                                      LOWER, f_lower(x), f_info(x),
+                                      LOWER, f_lower(y), f_info(y));
+  Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info,
+                                      UPPER, f_upper(x), f_info(x),
+                                      UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::sub_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  if (inf_sign != 0) {
+    if (Parma_Polyhedra_Library::infinity_sign(y) == inf_sign)
+      return assign(EMPTY);
+  }
+  else
+    inf_sign = -Parma_Polyhedra_Library::infinity_sign(y);
+  if (inf_sign < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf_sign > 0)
+    return assign(PLUS_INFINITY);
+
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info,
+                               LOWER, f_lower(x), f_info(x),
+                               UPPER, f_upper(y), f_info(y));
+  ru = Boundary_NS::sub_assign(UPPER, upper(), to_info,
+                               UPPER, f_upper(x), f_info(x),
+                               LOWER, f_lower(y), f_info(y));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+/**
++---------+-----------+-----------+-----------------+
+|    *    |  yl > 0   |  yu < 0   |  yl < 0, yu > 0 |
++---------+-----------+-----------+-----------------+
+| xl > 0  |xl*yl,xu*yu|xu*yl,xl*yu|   xu*yl,xu*yu   |
++---------+-----------+-----------+-----------------+
+| xu < 0  |xl*yu,xu*yl|xu*yu,xl*yl|   xl*yu,xl*yl   |
++---------+-----------+-----------+-----------------+
+|xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),|
+|         |           |           |max(xl*yl,xu*yu) |
++---------+-----------+-----------+-----------------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::mul_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  int ls;
+  int us;
+  if (inf_sign != 0) {
+    ls = yls;
+    us = yus;
+    goto inf;
+  }
+  else {
+    inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+    if (inf_sign != 0) {
+      ls = xls;
+      us = xus;
+    inf:
+      if (ls == 0 && us == 0)
+        return assign(EMPTY);
+      if (ls == -us)
+        return set_infinities();
+      if (ls < 0 || us < 0)
+        inf_sign = -inf_sign;
+      if (inf_sign < 0)
+        return assign(MINUS_INFINITY);
+      else
+        return assign(PLUS_INFINITY);
+    }
+  }
+
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+
+  if (xls >= 0) {
+    if (yls >= 0) {
+      // 0 <= xl <= xu, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else if (yus <= 0) {
+      // 0 <= xl <= xu, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      // 0 <= xl <= xu, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else if (xus <= 0) {
+    if (yls >= 0) {
+      // xl <= xu <= 0, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (yus <= 0) {
+      // xl <= xu <= 0, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else {
+      // xl <= xu <= 0, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yls >= 0) {
+    // xl < 0 < xu, 0 <= yl <= yu
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+                      LOWER, f_lower(x), f_info(x), xls,
+                      UPPER, f_upper(y), f_info(y), yus);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+                      UPPER, f_upper(x), f_info(x), xus,
+                      UPPER, f_upper(y), f_info(y), yus);
+  }
+  else if (yus <= 0) {
+    // xl < 0 < xu, yl <= yu <= 0
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+                      UPPER, f_upper(x), f_info(x), xus,
+                      LOWER, f_lower(y), f_info(y), yls);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+                      LOWER, f_lower(x), f_info(x), xls,
+                      LOWER, f_lower(y), f_info(y), yls);
+  }
+  else {
+    // xl < 0 < xu, yl < 0 < yu
+    PPL_DIRTY_TEMP(To_Boundary, tmp);
+    PPL_DIRTY_TEMP(To_Info, tmp_info);
+    tmp_info.clear();
+    Result tmp_r;
+    tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info,
+                                    UPPER, f_upper(x), f_info(x),
+                                    LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info,
+                                 LOWER, f_lower(x), f_info(x),
+                                 UPPER, f_upper(y), f_info(y));
+    if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) {
+      to_lower = tmp;
+      rl = tmp_r;
+    }
+    tmp_info.clear();
+    tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info,
+                                    UPPER, f_upper(x), f_info(x),
+                                    UPPER, f_upper(y), f_info(y));
+    ru = Boundary_NS::mul_assign(UPPER, upper(), to_info,
+                                 LOWER, f_lower(x), f_info(x),
+                                 LOWER, f_lower(y), f_info(y));
+    if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) {
+      upper() = tmp;
+      ru = tmp_r;
+    }
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+/**
++-----------+-----------+-----------+
+|     /     |  yu < 0   |  yl > 0   |
++-----------+-----------+-----------+
+|   xu<=0   |xu/yl,xl/yu|xl/yl,xu/yu|
++-----------+-----------+-----------+
+|xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl|
++-----------+-----------+-----------+
+|   xl>=0   |xu/yu,xl/yl|xl/yu,xu/yl|
++-----------+-----------+-----------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::div_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  if (yls == 0 && yus == 0)
+    return assign(EMPTY);
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  if (inf_sign != 0) {
+    if (Parma_Polyhedra_Library::infinity_sign(y) != 0)
+      return assign(EMPTY);
+    if (yls == -yus)
+      return set_infinities();
+    if (yls < 0 || yus < 0)
+    inf_sign = -inf_sign;
+    if (inf_sign < 0)
+      return assign(MINUS_INFINITY);
+    else
+      return assign(PLUS_INFINITY);
+  }
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+  if (yls >= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yus <= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else {
+    return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES);
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator+(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator-(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator*(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator/(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename Boundary, typename Info>
+inline std::ostream&
+operator<<(std::ostream& os, const Interval<Boundary, Info>& x) {
+  if (check_empty_arg(x))
+    return os << "[]";
+  if (x.is_singleton()) {
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+    return os;
+  }
+  os << (x.lower_is_open() ? "(" : "[");
+  if (x.info().get_boundary_property(LOWER, SPECIAL))
+    os << "-inf";
+  else
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << ", ";
+  if (x.info().get_boundary_property(UPPER, SPECIAL))
+    os << "+inf";
+  else
+    output(os, x.upper(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << (x.upper_is_open() ? ")" : "]");
+  return os;
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::ascii_dump(std::ostream& s) const {
+  using Parma_Polyhedra_Library::ascii_dump;
+  s << "info ";
+  info().ascii_dump(s);
+  s << " lower ";
+  ascii_dump(s, lower());
+  s << " upper ";
+  ascii_dump(s, upper());
+  s << '\n';
+}
+
+template <typename Boundary, typename Info>
+inline bool
+Interval<Boundary, Info>::ascii_load(std::istream& s) {
+  using Parma_Polyhedra_Library::ascii_load;
+  std::string str;
+  if (!(s >> str) || str != "info")
+    return false;
+  if (!info().ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "lower")
+    return false;
+  if (!ascii_load(s, lower()))
+    return false;
+  if (!(s >> str) || str != "upper")
+    return false;
+  if (!ascii_load(s, upper()))
+    return false;
+  PPL_ASSERT(OK());
+  return true;
+}
+
+/*! \brief
+  Helper class to select the appropriate numerical type to perform
+  boundary computations so as to reduce the chances of overflow without
+  incurring too much overhead.
+*/
+template <typename Interval_Boundary_Type> struct Select_Temp_Boundary_Type;
+
+template <typename Interval_Boundary_Type>
+struct Select_Temp_Boundary_Type {
+  typedef Interval_Boundary_Type type;
+};
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+struct Select_Temp_Boundary_Type<float> {
+  typedef double type;
+};
+#endif
+
+template <>
+struct Select_Temp_Boundary_Type<char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long long> {
+  typedef signed long long type;
+};
+
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+inline void
+swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_inlines_hh)
diff --git a/src/Interval_templates.hh b/src/Interval_templates.hh
new file mode 100644
index 0000000..fca1b17
--- /dev/null
+++ b/src/Interval_templates.hh
@@ -0,0 +1,402 @@
+/* Interval class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Interval_templates_hh
+#define PPL_Interval_templates_hh 1
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::lower_extend(const C& c) {
+  PPL_ASSERT(OK());
+  bool open;
+  switch (c.rel()) {
+  case V_LGE:
+    return lower_extend();
+  case V_NAN:
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  case V_GT:
+    open = true;
+    break;
+  case V_GE: // Fall through.
+  case V_EQ:
+    open = false;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  }
+  min_assign(LOWER, lower(), info(), LOWER, c.value(), f_info(c.value(), open));
+  PPL_ASSERT(OK());
+  return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::upper_extend(const C& c) {
+  PPL_ASSERT(OK());
+  bool open;
+  switch (c.rel()) {
+  case V_LGE:
+    return lower_extend();
+  case V_NAN:
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  case V_LT:
+    open = true;
+    break;
+  case V_LE: // Fall through.
+  case V_EQ:
+    open = false;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  }
+  max_assign(UPPER, upper(), info(), UPPER, c.value(), f_info(c.value(), open));
+  PPL_ASSERT(OK());
+  return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename From, typename Iterator>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::CC76_widening_assign(const From& y,
+                                               Iterator first,
+                                               Iterator last) {
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_ASSERT(contains(y));
+  Interval<Boundary, Info>& x = *this;
+
+  // Upper bound.
+  if (!x.upper_is_boundary_infinity()) {
+    Boundary& x_ub = x.upper();
+    const Boundary& y_ub = y.upper();
+    PPL_ASSERT(!y.upper_is_boundary_infinity() && y_ub <= x_ub);
+    if (y_ub < x_ub) {
+      Iterator k = std::lower_bound(first, last, x_ub);
+      if (k != last) {
+        if (x_ub < *k)
+          x_ub = *k;
+      }
+      else
+        x.upper_extend();
+    }
+  }
+
+  // Lower bound.
+  if (!x.lower_is_boundary_infinity()) {
+    Boundary& x_lb = x.lower();
+    const Boundary& y_lb = y.lower();
+    PPL_ASSERT(!y.lower_is_boundary_infinity() && y_lb >= x_lb);
+    if (y_lb > x_lb) {
+      Iterator k = std::lower_bound(first, last, x_lb);
+      if (k != last) {
+        if (x_lb < *k) {
+          if (k != first)
+            x_lb = *--k;
+          else
+            x.lower_extend();
+        }
+      }
+      else {
+        if (k != first)
+          x_lb = *--k;
+        else
+          x.lower_extend();
+      }
+    }
+  }
+}
+
+template <typename Boundary, typename Info>
+Interval<Boundary, Info>::Interval(const char* s) {
+  // Get the lower bound.
+  Boundary lower_bound;
+  Result lower_r = assign_r(lower_bound, s, ROUND_DOWN);
+  if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN) {
+    throw std::invalid_argument("PPL::Interval(const char* s)"
+                                " with s invalid");
+  }
+  lower_r = result_relation_class(lower_r);
+
+  // Get the upper bound.
+  Boundary upper_bound;
+  Result upper_r = assign_r(upper_bound, s, ROUND_UP);
+  PPL_ASSERT(upper_r != V_CVT_STR_UNK && upper_r != V_NAN);
+  upper_r = result_relation_class(upper_r);
+
+  // Build the interval.
+  bool lower_open = false;
+  bool upper_open = false;
+  bool lower_boundary_infinity = false;
+  bool upper_boundary_infinity = false;
+  switch (lower_r) {
+  case V_EQ: // Fall through.
+  case V_GE:
+    break;
+  case V_GT:
+    lower_open = true;
+    break;
+  case V_GT_MINUS_INFINITY:
+    lower_open = true;
+    // Fall through.
+  case V_EQ_MINUS_INFINITY:
+    lower_boundary_infinity = true;
+    break;
+  case V_EQ_PLUS_INFINITY: // Fall through.
+  case V_LT_PLUS_INFINITY:
+    if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+      assign(UNIVERSE);
+    else
+      assign(EMPTY);
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+  switch (upper_r) {
+  case V_EQ: // Fall through.
+  case V_LE:
+    break;
+  case V_LT:
+    upper_open = true;
+    break;
+  case V_EQ_MINUS_INFINITY: // Fall through.
+  case V_GT_MINUS_INFINITY:
+    if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+      assign(UNIVERSE);
+    else
+      assign(EMPTY);
+    break;
+  case V_LT_PLUS_INFINITY:
+    upper_open = true;
+    // Fall through.
+  case V_EQ_PLUS_INFINITY:
+    upper_boundary_infinity = true;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  if (!lower_boundary_infinity
+      && !upper_boundary_infinity
+      && (lower_bound > upper_bound
+          || (lower_open && lower_bound == upper_bound)))
+    assign(EMPTY);
+  else {
+    if (lower_boundary_infinity)
+      set_minus_infinity(LOWER, lower(), info(), lower_open);
+    else
+      Boundary_NS::assign(LOWER, lower(), info(),
+                          LOWER, lower_bound, SCALAR_INFO, lower_open);
+    if (upper_boundary_infinity)
+      set_plus_infinity(UPPER, upper(), info(), upper_open);
+    else
+      Boundary_NS::assign(UPPER, upper(), info(),
+                          UPPER, upper_bound, SCALAR_INFO, upper_open);
+  }
+}
+
+
+template <typename Boundary, typename Info>
+inline std::istream&
+operator>>(std::istream& is, Interval<Boundary, Info>& x) {
+  Boundary lower_bound;
+  Boundary upper_bound;
+  bool lower_boundary_infinity = false;
+  bool upper_boundary_infinity = false;
+  bool lower_open = false;
+  bool upper_open = false;
+  Result lower_r;
+  Result upper_r;
+
+  // Eat leading white space.
+  char c;
+  do {
+    if (!is.get(c))
+      goto fail;
+  } while (is_space(c));
+
+  // Get the opening parenthesis and handle the empty interval case.
+  if (c == '(')
+    lower_open = true;
+  else if (c == '[') {
+    if (!is.get(c))
+      goto fail;
+    if (c == ']') {
+      // Empty interval.
+      x.assign(EMPTY);
+      return is;
+    }
+    else
+      is.unget();
+  }
+  else
+    goto unexpected;
+
+  // Get the lower bound.
+  lower_r = input(lower_bound, is, ROUND_DOWN);
+  if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN)
+    goto fail;
+  lower_r = result_relation_class(lower_r);
+
+  // Match the comma separating the lower and upper bounds.
+  do {
+    if (!is.get(c))
+      goto fail;
+  } while (is_space(c));
+  if (c != ',')
+    goto unexpected;
+
+  // Get the upper bound.
+  upper_r = input(upper_bound, is, ROUND_UP);
+  if (upper_r == V_CVT_STR_UNK || upper_r == V_NAN)
+    goto fail;
+  upper_r = result_relation_class(upper_r);
+
+  // Get the closing parenthesis.
+  do {
+    if (!is.get(c))
+      goto fail;
+  } while (is_space(c));
+  if (c == ')')
+    upper_open = true;
+  else if (c != ']') {
+  unexpected:
+    is.unget();
+  fail:
+    is.setstate(std::ios::failbit);
+    return is;
+  }
+
+  // Build interval.
+  switch (lower_r) {
+  case V_EQ: // Fall through.
+  case V_GE:
+    break;
+  case V_GT:
+    lower_open = true;
+    break;
+  case V_GT_MINUS_INFINITY:
+    lower_open = true;
+    // Fall through.
+  case V_EQ_MINUS_INFINITY:
+    lower_boundary_infinity = true;
+    break;
+  case V_EQ_PLUS_INFINITY: // Fall through.
+  case V_LT_PLUS_INFINITY:
+    if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+  switch (upper_r) {
+  case V_EQ: // Fall through.
+  case V_LE:
+    break;
+  case V_LT:
+    upper_open = true;
+    break;
+  case V_GT_MINUS_INFINITY:
+    upper_open = true;
+    // Fall through.
+  case V_EQ_MINUS_INFINITY:
+    if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  case V_EQ_PLUS_INFINITY: // Fall through.
+  case V_LT_PLUS_INFINITY:
+    upper_boundary_infinity = true;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  if (!lower_boundary_infinity
+      && !upper_boundary_infinity
+      && (lower_bound > upper_bound
+          || (lower_open && lower_bound == upper_bound)))
+    x.assign(EMPTY);
+  else {
+    if (lower_boundary_infinity)
+      set_minus_infinity(LOWER, x.lower(), x.info(), lower_open);
+    else
+      assign(LOWER, x.lower(), x.info(),
+             LOWER, lower_bound, SCALAR_INFO, lower_open);
+    if (upper_boundary_infinity)
+      set_plus_infinity(UPPER, x.upper(), x.info(), upper_open);
+    else
+      assign(UPPER, x.upper(), x.info(),
+             UPPER, upper_bound, SCALAR_INFO, upper_open);
+  }
+  return is;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, bool>::type
+Interval<Boundary, Info>::simplify_using_context_assign(const From& y) {
+  // FIXME: the following code wrongly assumes that intervals are closed
+  if (lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y))) {
+    lower_extend();
+    return false;
+  }
+  if (gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))) {
+    upper_extend();
+    return false;
+  }
+  // Weakening the upper bound.
+  if (!upper_is_boundary_infinity() && !y.upper_is_boundary_infinity()
+      && y.upper() <= upper())
+    upper_extend();
+  // Weakening the lower bound.
+  if (!lower_is_boundary_infinity() && !y.lower_is_boundary_infinity()
+      && y.lower() >= lower())
+    lower_extend();
+  return true;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::empty_intersection_assign(const From&) {
+  // FIXME: write me.
+  assign(EMPTY);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_templates_hh)
diff --git a/src/Interval_types.hh b/src/Interval_types.hh
new file mode 100644
index 0000000..948d0dc
--- /dev/null
+++ b/src/Interval_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Interval_types_hh
+#define PPL_Interval_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_types_hh)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc
new file mode 100644
index 0000000..4c02145
--- /dev/null
+++ b/src/Linear_Expression.cc
@@ -0,0 +1,194 @@
+/* Linear_Expression class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+#include "ppl-config.h"
+#include "Linear_Expression_defs.hh"
+
+#include "Linear_Expression_Impl_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::Linear_Expression::max_space_dimension() {
+  return Dense_Row::max_size() - 1;
+}
+
+const PPL::Linear_Expression* PPL::Linear_Expression::zero_p = 0;
+
+void
+PPL::Linear_Expression::initialize() {
+  PPL_ASSERT(zero_p == 0);
+  zero_p = new Linear_Expression(Coefficient_zero());
+}
+
+void
+PPL::Linear_Expression::finalize() {
+  PPL_ASSERT(zero_p != 0);
+  delete zero_p;
+  zero_p = 0;
+}
+
+PPL::Linear_Expression::Linear_Expression(Representation r) {
+  switch (r) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>();
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>();
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(dimension_type space_dim, bool x,
+                                          Representation r) {
+  switch (r) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(space_dim, x);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(space_dim, x);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e) {
+  switch (e.representation()) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(*e.impl);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e,
+                                          Representation r) {
+  switch (r) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(*e.impl);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e,
+                                          dimension_type space_dim) {
+  switch (e.representation()) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(*e.impl, space_dim);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl, space_dim);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Linear_Expression& e,
+                                          dimension_type space_dim,
+                                          Representation r) {
+  switch (r) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(*e.impl, space_dim);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(*e.impl, space_dim);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n,
+                                          Representation r) {
+  switch (r) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(n);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(n);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+PPL::Linear_Expression::Linear_Expression(const Variable v, Representation r) {
+  switch (r) {
+  case DENSE:
+    impl = new Linear_Expression_Impl<Dense_Row>(v);
+    break;
+
+  case SPARSE:
+    impl = new Linear_Expression_Impl<Sparse_Row>(v);
+    break;
+
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+}
+
+void
+PPL::Linear_Expression::set_representation(Representation r) {
+  if (representation() == r)
+    return;
+  Linear_Expression tmp(*this, r);
+  swap(*this, tmp);
+}
+
+PPL_OUTPUT_DEFINITIONS(Linear_Expression)
+
+bool
+PPL::Linear_Expression::OK() const {
+  return impl->OK();
+}
diff --git a/src/Linear_Expression_Impl.cc b/src/Linear_Expression_Impl.cc
new file mode 100644
index 0000000..e802c04
--- /dev/null
+++ b/src/Linear_Expression_Impl.cc
@@ -0,0 +1,468 @@
+/* Linear_Expression_Impl class implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Linear_Expression_Impl_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+#include "assert.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::OK() const {
+  return (row.size() != 0);
+}
+
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::OK() const {
+  if (row.size() == 0)
+    return false;
+  for (Sparse_Row::const_iterator i = row.begin(),
+         i_end = row.end(); i != i_end; ++i) {
+    if (*i == 0) {
+      std::cerr << "Linear_Expression_Impl<Sparse_Row>::OK() failed."
+                << " row was:\n";
+      row.ascii_dump(std::cerr);
+      // Found a stored zero.
+      return false;
+    }
+  }
+  return true;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::remove_space_dimensions(const Variables_Set& vars) {
+  PPL_ASSERT(vars.space_dimension() <= space_dimension());
+  if (vars.empty())
+    return;
+
+  // For each variable to be removed, replace the corresponding coefficient
+  // by shifting left the coefficient to the right that will be kept.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  dimension_type dst_col = *vsi+1;
+  dimension_type src_col = dst_col + 1;
+  for (++vsi; vsi != vsi_end; ++vsi) {
+    const dimension_type vsi_col = *vsi+1;
+    // Move all columns in between to the left.
+    while (src_col < vsi_col)
+      row.swap_coefficients(dst_col++, src_col++);
+    ++src_col;
+  }
+  // Move any remaining columns.
+  const dimension_type sz = row.size();
+  while (src_col < sz)
+    row.swap_coefficients(dst_col++, src_col++);
+
+  // The number of remaining coefficients is `dst_col'.
+  row.resize(dst_col);
+  PPL_ASSERT(OK());
+}
+
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::remove_space_dimensions(const Variables_Set& vars) {
+  PPL_ASSERT(vars.space_dimension() <= space_dimension());
+  if (vars.empty())
+    return;
+
+  // For each variable to be removed, replace the corresponding coefficient
+  // by shifting left the coefficient to the right that will be kept.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  Sparse_Row::iterator src = row.lower_bound(*vsi + 1);
+  const Sparse_Row::iterator& row_end = row.end();
+  dimension_type num_removed = 0;
+  while (vsi != vsi_end) {
+    // Delete the element.
+    if (src != row_end && src.index() == *vsi + 1)
+      src = row.reset(src);
+    ++num_removed;
+    ++vsi;
+    if (vsi != vsi_end) {
+      // Shift left the coefficients in [src.index(), *vsi + 1) by num_removed
+      // positions.
+      while (src != row_end && src.index() < *vsi + 1) {
+        row.fast_swap(src.index() - num_removed, src);
+        ++src;
+      }
+    }
+    else {
+      // Shift left the coefficients in [src.index(), row.size()) by
+      // num_removed positions.
+      while (src != row_end) {
+        row.fast_swap(src.index() - num_removed, src);
+        ++src;
+      }
+    }
+  }
+
+  PPL_ASSERT(num_removed == vars.size());
+
+  row.resize(row.size() - num_removed);
+  PPL_ASSERT(OK());
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::is_zero() const {
+  for (dimension_type i = row.size(); i-- > 0; )
+    if (row[i] != 0)
+      return false;
+  return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_homogeneous_terms_are_zero() const {
+  for (dimension_type i = 1; i < row.size(); ++i)
+    if (row[i] != 0)
+      return false;
+  return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_zeroes(dimension_type start,
+                                              dimension_type end) const {
+  for (dimension_type i = start; i < end; ++i)
+    if (row[i] != 0)
+      return false;
+  return true;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::num_zeroes(dimension_type start,
+                                              dimension_type end) const {
+  PPL_ASSERT(start <= end);
+  dimension_type result = 0;
+  for (dimension_type i = start; i < end; ++i)
+    if (row[i] == 0)
+      ++result;
+  return result;
+}
+
+template <>
+Coefficient
+Linear_Expression_Impl<Dense_Row>::gcd(dimension_type start,
+                                       dimension_type end) const {
+  dimension_type i;
+
+  for (i = start; i < end; ++i)
+    if (row[i] != 0)
+      break;
+
+  if (i == end)
+    return 0;
+
+  PPL_ASSERT(row[i] != 0);
+
+  Coefficient result = row[i];
+  ++i;
+
+  if (result < 0)
+    neg_assign(result);
+
+  for ( ; i < end; ++i) {
+    if (row[i] == 0)
+      continue;
+    gcd_assign(result, row[i], result);
+    if (result == 1)
+      return result;
+  }
+
+  return result;
+}
+
+template <>
+Coefficient
+Linear_Expression_Impl<Sparse_Row>::gcd(dimension_type start,
+                                        dimension_type end) const {
+  Sparse_Row::const_iterator i = row.lower_bound(start);
+  Sparse_Row::const_iterator i_end = row.lower_bound(end);
+
+  if (i == i_end)
+    return 0;
+
+  PPL_ASSERT(*i != 0);
+
+  Coefficient result = *i;
+  ++i;
+
+  if (result < 0)
+    neg_assign(result);
+
+  for ( ; i != i_end; ++i) {
+    gcd_assign(result, *i, result);
+    if (result == 1)
+      return result;
+  }
+
+  return result;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes(const Variables_Set& vars) const {
+  Variables_Set::const_iterator j = vars.begin();
+  Variables_Set::const_iterator j_end = vars.end();
+
+  for ( ; j != j_end; ++j)
+    if (row[*j + 1] != 0)
+      return false;
+
+  return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes(const Variables_Set& vars) const {
+  Sparse_Row::const_iterator i = row.begin();
+  Sparse_Row::const_iterator i_end = row.end();
+  Variables_Set::const_iterator j = vars.begin();
+  Variables_Set::const_iterator j_end = vars.end();
+
+  for ( ; j != j_end; ++j) {
+    i = row.lower_bound(i, *j + 1);
+    if (i == i_end)
+      break;
+    if (i.index() == *j + 1)
+      return false;
+  }
+
+  return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  if (start == 0) {
+    if (row[0] != 0)
+      return false;
+    ++start;
+  }
+  for (dimension_type i = start; i < end; ++i)
+    if (row[i] != 0 && vars.count(i - 1) == 0)
+      return false;
+  return true;
+}
+
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  PPL_ASSERT(start <= end);
+  if (start == end)
+    return true;
+  if (start == 0) {
+    if (row.find(0) != row.end())
+      return false;
+
+    start = 1;
+  }
+
+  PPL_ASSERT(start != 0);
+  PPL_ASSERT(start <= end);
+  for (Sparse_Row::const_iterator i = row.lower_bound(start),
+         i_end = row.lower_bound(end); i != i_end; ++i)
+    if (vars.count(i.index() - 1) == 0)
+      return false;
+
+  return true;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::last_nonzero() const {
+  for (dimension_type i = row.size(); i-- > 0; )
+    if (row[i] != 0)
+      return i;
+  return 0;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::first_nonzero(dimension_type first, dimension_type last) const {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  for (dimension_type i = first; i < last; ++i)
+    if (row[i] != 0)
+      return i;
+
+  return last;
+}
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::last_nonzero(dimension_type first, dimension_type last) const {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  for (dimension_type i = last; i-- > first; )
+    if (row[i] != 0)
+      return i;
+
+  return last;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  typedef std::set<dimension_type> set_t;
+  set_t result;
+  for (set_t::const_iterator i = x.begin(), i_end = x.end(); i != i_end; ++i)
+    if (row[*i] == 0)
+      result.insert(*i);
+  using std::swap;
+  swap(x, result);
+}
+
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  typedef std::set<dimension_type> set_t;
+  set_t result;
+  Sparse_Row::const_iterator itr = row.end();
+  Sparse_Row::const_iterator itr_end = row.end();
+  set_t::const_iterator i = x.begin();
+  set_t::const_iterator i_end = x.end();
+  for ( ; i != i_end; ++i) {
+    itr = row.lower_bound(itr, *i);
+    if (itr == itr_end)
+      break;
+    if (itr.index() != *i)
+      result.insert(*i);
+  }
+  for ( ; i != i_end; ++i)
+    result.insert(*i);
+  using std::swap;
+  swap(x, result);
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+                         Variable first, Variable last) const {
+  const dimension_type start = first.space_dimension();
+  const dimension_type end = last.space_dimension();
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= row.size());
+  PPL_ASSERT(end <= y.row.size());
+  for (dimension_type i = start; i < end; ++i)
+    if (row[i] != 0 && y.row[i] != 0)
+      return true;
+  return false;
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+                         Variable first, Variable last) const {
+  const dimension_type start = first.space_dimension();
+  const dimension_type end = last.space_dimension();
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= row.size());
+  PPL_ASSERT(end <= y.row.size());
+  for (Sparse_Row::const_iterator i = row.lower_bound(start),
+        i_end = row.lower_bound(end); i != i_end; ++i)
+    if (y.row[i.index()] != 0)
+      return true;
+  return false;
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+                         Variable first, Variable last) const {
+  return y.have_a_common_variable(*this, first, last);
+}
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+                         Variable first, Variable last) const {
+  const dimension_type start = first.space_dimension();
+  const dimension_type end = last.space_dimension();
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= row.size());
+  PPL_ASSERT(end <= y.row.size());
+  Sparse_Row::const_iterator i = row.lower_bound(start);
+  Sparse_Row::const_iterator i_end = row.lower_bound(end);
+  Sparse_Row::const_iterator j = y.row.lower_bound(start);
+  Sparse_Row::const_iterator j_end = y.row.lower_bound(end);
+  while (i != i_end && j != j_end) {
+    if (i.index() == j.index())
+      return true;
+    if (i.index() < j.index())
+      ++i;
+    else
+      ++j;
+  }
+  return false;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator
+::skip_zeroes_forward() {
+  while (itr != row->end() && *itr == 0)
+    ++itr;
+}
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator
+::skip_zeroes_backward() {
+  PPL_ASSERT(itr.index() > 0);
+  while (*itr == 0) {
+    PPL_ASSERT(itr.index() > 1);
+    --itr;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/Linear_Expression_Impl_defs.hh b/src/Linear_Expression_Impl_defs.hh
new file mode 100644
index 0000000..b5b0bb0
--- /dev/null
+++ b/src/Linear_Expression_Impl_defs.hh
@@ -0,0 +1,906 @@
+/* Linear_Expression_Impl class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Impl_defs_hh
+#define PPL_Linear_Expression_Impl_defs_hh 1
+
+#include "Linear_Expression_Impl_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+#include <cstddef>
+#include "Linear_Expression_Interface_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression_Impl represents the linear
+  expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression_Impl e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression_Impl e1 = 4*x;
+  Linear_Expression_Impl e2 = 2*y;
+  Linear_Expression_Impl e3 = z;
+  Linear_Expression_Impl e = Linear_Expression_Impl(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_Expression_Impl
+  : public Linear_Expression_Interface {
+public:
+  //! Default constructor: returns a copy of Linear_Expression_Impl::zero().
+  Linear_Expression_Impl();
+
+  //! Ordinary copy constructor.
+  Linear_Expression_Impl(const Linear_Expression_Impl& e);
+
+  //! Copy constructor for other row types.
+  template <typename Row2>
+  Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e);
+
+  //! Copy constructor from any implementation of Linear_Expression_Interface.
+  Linear_Expression_Impl(const Linear_Expression_Interface& e);
+
+  //! Destructor.
+  virtual ~Linear_Expression_Impl();
+
+  //! Checks if all the invariants are satisfied.
+  virtual bool OK() const;
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression_Impl(Coefficient_traits::const_reference n);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression_Impl::max_space_dimension()</CODE>.
+  */
+  Linear_Expression_Impl(Variable v);
+
+  //! Returns the current representation of this linear expression.
+  virtual Representation representation() const;
+
+  //! An interface for const iterators on the expression (homogeneous)
+  //! coefficients that are nonzero.
+  /*!
+    These iterators are invalidated by operations that modify the expression.
+  */
+  class const_iterator: public const_iterator_interface {
+  public:
+    explicit const_iterator(const Row& row, dimension_type i);
+
+    //! Returns a copy of *this.
+    //! This returns a pointer to dynamic-allocated memory. The caller has the
+    //! duty to free the memory when it's not needed anymore.
+    virtual const_iterator_interface* clone() const;
+
+    //! Navigates to the next nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator++();
+
+    //! Navigates to the previous nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator--();
+
+    //! Returns the current element.
+    virtual reference operator*() const;
+
+    //! Returns the variable of the coefficient pointed to by \c *this.
+    /*!
+      \returns the variable of the coefficient pointed to by \c *this.
+    */
+    virtual Variable variable() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    virtual bool operator==(const const_iterator_interface& x) const;
+
+  private:
+
+    void skip_zeroes_forward();
+    void skip_zeroes_backward();
+
+    const Row* row;
+    typename Row::const_iterator itr;
+  };
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* begin() const;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* end() const;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  //! Returns (a pointer to) an iterator that points to the first nonzero
+  //! coefficient of a variable greater than or equal to v, or at end if no
+  //! such coefficient exists.
+  virtual const_iterator_interface* lower_bound(Variable v) const;
+
+  //! Returns the maximum space dimension a Linear_Expression_Impl can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  virtual dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to \p n .
+  virtual void set_space_dimension(dimension_type n);
+
+  //! Returns the coefficient of \p v in \p *this.
+  virtual Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Sets the coefficient of \p v in \p *this to \p n.
+  virtual void set_coefficient(Variable v,
+                               Coefficient_traits::const_reference n);
+
+  //! Returns the inhomogeneous term of \p *this.
+  virtual Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Sets the inhomogeneous term of \p *this to \p n.
+  virtual void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void linear_combine(const Linear_Expression_Interface& y, Variable v);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! \p *this and \p y have the same space dimension.
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  virtual void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the expression.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  virtual void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  virtual void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the expression.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  virtual void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+  virtual bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  virtual bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  virtual memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const;
+
+  //! Writes to \p s an ASCII representation of \p *this.
+  virtual void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  virtual bool ascii_load(std::istream& s);
+
+  //! Copy constructor with a specified space dimension.
+  Linear_Expression_Impl(const Linear_Expression_Interface& e,
+                         dimension_type space_dim);
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  virtual bool is_equal_to(const Linear_Expression_Interface& x) const;
+
+  //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+  //! so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the coefficients
+    and the inhomogeneous term and normalizes them by the GCD itself.
+  */
+  virtual void normalize();
+
+  //! Ensures that the first nonzero homogeneous coefficient is positive,
+  //! by negating the row if necessary.
+  virtual void sign_normalize();
+
+  /*! \brief
+    Negates the elements from index \p first (included)
+    to index \p last (excluded).
+  */
+  virtual void negate(dimension_type first, dimension_type last);
+
+  virtual Linear_Expression_Impl&
+  operator+=(Coefficient_traits::const_reference n);
+  virtual Linear_Expression_Impl&
+  operator-=(Coefficient_traits::const_reference n);
+
+  //! The basic comparison function.
+  /*! \relates Linear_Expression_Impl
+
+    \returns
+    -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+    is greater. The absolute value of the result is 1 if the difference
+    is only in the inhomogeneous terms, 2 otherwise.
+
+    The order is a lexicographic. It starts comparing the variables'
+    coefficient, starting from Variable(0), and at the end it compares
+    the inhomogeneous terms.
+  */
+  virtual int compare(const Linear_Expression_Interface& y) const;
+
+  virtual Linear_Expression_Impl&
+  operator+=(const Linear_Expression_Interface& e2);
+  virtual Linear_Expression_Impl& operator+=(const Variable v);
+  virtual Linear_Expression_Impl&
+  operator-=(const Linear_Expression_Interface& e2);
+  virtual Linear_Expression_Impl& operator-=(const Variable v);
+  virtual Linear_Expression_Impl&
+  operator*=(Coefficient_traits::const_reference n);
+  virtual Linear_Expression_Impl&
+  operator/=(Coefficient_traits::const_reference n);
+
+  virtual void negate();
+
+  virtual Linear_Expression_Impl&
+  add_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+  virtual Linear_Expression_Impl&
+  sub_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+  virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2);
+
+  virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2);
+
+  virtual void print(std::ostream& s) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars[i] is \f$0\f$.
+  */
+  virtual bool all_zeroes(const Variables_Set& vars) const;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+                                      Variable first, Variable last) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the i-th coefficient.
+  virtual Coefficient_traits::const_reference get(dimension_type i) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the i-th coefficient to n.
+  virtual void set(dimension_type i, Coefficient_traits::const_reference n);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+    [start, end).
+  */
+  virtual bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  virtual dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are 0 returns 0.
+  */
+  virtual Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  virtual void exact_div_assign(Coefficient_traits::const_reference c,
+                                dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+  virtual void mul_assign(Coefficient_traits::const_reference n,
+                          dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void
+  linear_combine(const Linear_Expression_Interface& y, dimension_type i);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2,
+                              dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2,
+                                  dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element, or 0 if there are no
+  //! nonzero elements.
+  virtual dimension_type last_nonzero() const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+    \f$0\f$, disregarding coefficients of variables in \p vars.
+  */
+  virtual bool
+  all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  virtual void
+  scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Interface& y,
+                        dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Computes the sign of the sum of (*this)[i]*y[i], for each i in [start,end).
+  virtual int
+  scalar_product_sign(const Linear_Expression_Interface& y,
+                      dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  virtual dimension_type
+  first_nonzero(dimension_type first, dimension_type last) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  virtual dimension_type
+  last_nonzero(dimension_type first, dimension_type last) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Removes from the set x all the indexes of nonzero elements of *this.
+  virtual void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           Coefficient_traits::const_reference c1,
+                           Coefficient_traits::const_reference c2,
+                           dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Dense_Row& row) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Sparse_Row& row) const;
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with the constructor
+    Linear_Expression_Impl(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression_Impl(dimension_type space_dim, bool);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y, Variable v);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! \p *this and \p y have the same space dimension.
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  template <typename Row2>
+  void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2);
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  template <typename Row2>
+  bool is_equal_to(const Linear_Expression_Impl<Row2>& x) const;
+
+  template <typename Row2>
+  Linear_Expression_Impl& operator+=(const Linear_Expression_Impl<Row2>& e2);
+  template <typename Row2>
+  Linear_Expression_Impl& operator-=(const Linear_Expression_Impl<Row2>& e2);
+
+  template <typename Row2>
+  Linear_Expression_Impl&
+  sub_mul_assign(Coefficient_traits::const_reference n,
+                 const Linear_Expression_Impl<Row2>& y,
+                 dimension_type start, dimension_type end);
+
+  template <typename Row2>
+  void add_mul_assign(Coefficient_traits::const_reference factor,
+                      const Linear_Expression_Impl<Row2>& e2);
+
+  template <typename Row2>
+  void sub_mul_assign(Coefficient_traits::const_reference factor,
+                      const Linear_Expression_Impl<Row2>& e2);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  template <typename Row2>
+  void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2,
+                          dimension_type start, dimension_type end);
+
+  //! The basic comparison function.
+  /*! \relates Linear_Expression_Impl
+
+    \returns
+    -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+    is greater. The absolute value of the result is 1 if the difference
+    is only in the inhomogeneous terms, 2 otherwise.
+
+    The order is a lexicographic. It starts comparing the variables'
+    coefficient, starting from Variable(0), and at the end it compares
+    the inhomogeneous terms.
+  */
+  template <typename Row2>
+  int compare(const Linear_Expression_Impl<Row2>& y) const;
+
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  template <typename Row2>
+  void
+  scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Impl<Row2>& y,
+                        dimension_type start, dimension_type end) const;
+
+  //! Computes the sign of the sum of (*this)[i]*y[i],
+  //! for each i in [start,end).
+  template <typename Row2>
+  int scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+                          dimension_type start, dimension_type end) const;
+
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  template <typename Row2>
+  bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  template <typename Row2>
+  bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  template <typename Row2>
+  bool have_a_common_variable(const Linear_Expression_Impl<Row2>& x,
+                              Variable first, Variable last) const;
+
+private:
+
+  void construct(const Linear_Expression_Interface& e);
+  void construct(const Linear_Expression_Interface& e,
+                 dimension_type space_dim);
+
+  template <typename Row2>
+  void construct(const Linear_Expression_Impl<Row2>& e);
+  template <typename Row2>
+  void construct(const Linear_Expression_Impl<Row2>& e,
+                 dimension_type space_dim);
+
+  Row row;
+
+  template <typename Row2>
+  friend class Linear_Expression_Impl;
+
+}; // class Parma_Polyhedra_Library::Linear_Expression_Impl
+
+
+namespace Parma_Polyhedra_Library {
+
+// NOTE: declaring explicit specializations.
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::OK() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::OK() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_homogeneous_terms_are_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_zeroes(dimension_type start,
+                                              dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+                                               dimension_type end) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes(const Variables_Set& vars) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes(const Variables_Set& vars) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+Coefficient
+Linear_Expression_Impl<Dense_Row>::gcd(dimension_type start,
+                                       dimension_type end) const;
+template <>
+Coefficient
+Linear_Expression_Impl<Sparse_Row>::gcd(dimension_type start,
+                                        dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+                         Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+                         Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+                         Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+                         Variable first, Variable last) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::is_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::last_nonzero() const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::num_zeroes(dimension_type start,
+                                              dimension_type end) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+                                               dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+
+template <>
+Representation
+Linear_Expression_Impl<Dense_Row>::representation() const;
+template <>
+Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_backward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_backward();
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_forward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_forward();
+
+} // namespace Parma_Polyhedra_Library
+
+
+#include "Linear_Expression_Impl_inlines.hh"
+#include "Linear_Expression_Impl_templates.hh"
+
+#endif // !defined(PPL_Linear_Expression_Impl_defs_hh)
diff --git a/src/Linear_Expression_Impl_inlines.hh b/src/Linear_Expression_Impl_inlines.hh
new file mode 100644
index 0000000..40ca53e
--- /dev/null
+++ b/src/Linear_Expression_Impl_inlines.hh
@@ -0,0 +1,282 @@
+/* Linear_Expression_Impl class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Impl_inlines_hh
+#define PPL_Linear_Expression_Impl_inlines_hh 1
+
+#include "math_utilities_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::max_space_dimension() {
+  return Row::max_size() - 1;
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::Linear_Expression_Impl()
+  : row(1) {
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(dimension_type space_dim, bool)
+  : row(space_dim + 1) {
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::~Linear_Expression_Impl() {
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(Coefficient_traits::const_reference n)
+  : row(1) {
+  if (n != 0)
+    row.insert(0, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::space_dimension() const {
+  return row.size() - 1;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::set_space_dimension(dimension_type n) {
+  row.resize(n + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return Coefficient_zero();
+  return row.get(v.id() + 1);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  const dimension_type i = v.space_dimension();
+  if (n == 0)
+    row.reset(i);
+  else
+    row.insert(i, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::inhomogeneous_term() const {
+  return row.get(0);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+  if (n == 0)
+    row.reset(0);
+  else
+    row.insert(0, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::swap_space_dimensions(Variable v1, Variable v2) {
+  row.swap_coefficients(v1.space_dimension(), v2.space_dimension());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::shift_space_dimensions(Variable v,
+                                                    dimension_type n) {
+  row.add_zeroes_and_shift(n, v.space_dimension());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::external_memory_in_bytes() const {
+  return row.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(Coefficient_traits::const_reference n) {
+  typename Row::iterator itr = row.insert(0);
+  (*itr) += n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(Coefficient_traits::const_reference n) {
+  typename Row::iterator itr = row.insert(0);
+  (*itr) -= n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::normalize() {
+  row.normalize();
+  PPL_ASSERT(OK());
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const {
+  return row.num_stored_elements() == 0;
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const {
+  return row.lower_bound(1) == row.end();
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+                                               dimension_type end) const {
+  return row.lower_bound(start) == row.lower_bound(end);
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+                                               dimension_type end) const {
+  PPL_ASSERT(start <= end);
+  return (end - start)
+    - std::distance(row.lower_bound(start), row.lower_bound(end));
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const {
+  if (row.num_stored_elements() == 0)
+    return 0;
+  Sparse_Row::const_iterator i = row.end();
+  --i;
+  return i.index();
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  Sparse_Row::const_iterator i = row.lower_bound(first);
+
+  if (i != row.end() && i.index() < last)
+    return i.index();
+  else
+    return last;
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  Sparse_Row::const_iterator itr1 = row.lower_bound(first);
+  Sparse_Row::const_iterator itr2 = row.lower_bound(last);
+
+  if (itr1 == itr2)
+    return last;
+
+  --itr2;
+  return itr2.index();
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Dense_Row>::representation() const {
+  return DENSE;
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const {
+  return SPARSE;
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_forward() {
+  // Nothing to do.
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_backward() {
+  // Nothing to do.
+}
+
+namespace IO_Operators {
+
+template <typename Row>
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e) {
+  e.print(s);
+  return s;
+}
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Impl_inlines_hh)
diff --git a/src/Linear_Expression_Impl_templates.hh b/src/Linear_Expression_Impl_templates.hh
new file mode 100644
index 0000000..e9419ed
--- /dev/null
+++ b/src/Linear_Expression_Impl_templates.hh
@@ -0,0 +1,1316 @@
+/* Linear_Expression_Impl class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Impl_templates_hh
+#define PPL_Linear_Expression_Impl_templates_hh 1
+
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+#include "Grid_Generator_defs.hh"
+#include "Congruence_defs.hh"
+#include <stdexcept>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl& e) {
+  construct(e);
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e) {
+  construct(e);
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+    construct(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+    construct(*p);
+  }
+  else {
+    // Add implementations for other derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e,
+                         dimension_type space_dim) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+    construct(*p, space_dim);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+    construct(*p, space_dim);
+  }
+  else {
+    // Add implementations for other derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, Variable i) {
+  PPL_ASSERT(space_dimension() == y.space_dimension());
+  PPL_ASSERT(i.space_dimension() <= space_dimension());
+  linear_combine(y, i.space_dimension());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i) {
+  const Linear_Expression_Impl& x = *this;
+  PPL_ASSERT(i < x.space_dimension() + 1);
+  PPL_ASSERT(x.space_dimension() == y.space_dimension());
+  Coefficient_traits::const_reference x_i = x.row.get(i);
+  Coefficient_traits::const_reference y_i = y.row.get(i);
+  PPL_ASSERT(x_i != 0);
+  PPL_ASSERT(y_i != 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_v);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_v);
+  normalize2(x_i, y_i, normalized_x_v, normalized_y_v);
+  neg_assign(normalized_x_v);
+  linear_combine(y, normalized_y_v, normalized_x_v);
+  // We cannot use x_i here because it may have been invalidated by
+  // linear_combine().
+  assert(x.row.get(i) == 0);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2) {
+  PPL_ASSERT(c1 != 0);
+  PPL_ASSERT(c2 != 0);
+  if (space_dimension() < y.space_dimension())
+    set_space_dimension(y.space_dimension());
+  linear_combine(y, c1, c2, 0, y.space_dimension() + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2) {
+  if (space_dimension() < y.space_dimension())
+    set_space_dimension(y.space_dimension());
+  linear_combine_lax(y, c1, c2, 0, y.space_dimension() + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Impl<Row2>& y) const {
+  const Linear_Expression_Impl& x = *this;
+  // Compare all the coefficients of the row starting from position 1.
+  // NOTE: x and y may be of different size.
+  typename Row::const_iterator i = x.row.lower_bound(1);
+  typename Row::const_iterator i_end = x.row.end();
+  typename Row2::const_iterator j = y.row.lower_bound(1);
+  typename Row2::const_iterator j_end = y.row.end();
+  while (i != i_end && j != j_end) {
+    if (i.index() < j.index()) {
+      const int s = sgn(*i);
+      if (s != 0)
+        return 2*s;
+      ++i;
+      continue;
+    }
+    if (i.index() > j.index()) {
+      const int s = sgn(*j);
+      if (s != 0)
+        return -2*s;
+      ++j;
+      continue;
+    }
+    PPL_ASSERT(i.index() == j.index());
+    const int s = cmp(*i, *j);
+    if (s < 0)
+      return -2;
+    if (s > 0)
+      return 2;
+    PPL_ASSERT(s == 0);
+    ++i;
+    ++j;
+  }
+  for ( ; i != i_end; ++i) {
+    const int s = sgn(*i);
+    if (s != 0)
+      return 2*s;
+  }
+  for ( ; j != j_end; ++j) {
+    const int s = sgn(*j);
+    if (s != 0)
+      return -2*s;
+  }
+
+  // If all the coefficients in `x' equal all the coefficients in `y'
+  // (starting from position 1) we compare coefficients in position 0,
+  // i.e., inhomogeneous terms.
+  const int comp = cmp(x.row.get(0), y.row.get(0));
+  if (comp > 0)
+    return 1;
+  if (comp < 0)
+    return -1;
+  PPL_ASSERT(comp == 0);
+
+  // `x' and `y' are equal.
+  return 0;
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::Linear_Expression_Impl(const Variable v) {
+  if (v.space_dimension() > max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl::"
+                            "Linear_Expression_Impl(v):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  set_space_dimension(v.space_dimension());
+  (*this) += v;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& x) const {
+  return row == x.row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Dense_Row& row) const {
+  row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Sparse_Row& row) const {
+  row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  const dimension_type n = cycle.size();
+  if (n < 2)
+    return;
+
+  if (n == 2) {
+    row.swap_coefficients(cycle[0].space_dimension(),
+                          cycle[1].space_dimension());
+  }
+  else {
+    PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+    tmp = row.get(cycle.back().space_dimension());
+    for (dimension_type i = n - 1; i-- > 0; )
+      row.swap_coefficients(cycle[i + 1].space_dimension(),
+                            cycle[i].space_dimension());
+    if (tmp == 0)
+      row.reset(cycle[0].space_dimension());
+    else {
+      using std::swap;
+      swap(tmp, row[cycle[0].space_dimension()]);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Linear_Expression_Impl<Row2>& e) {
+  linear_combine(e, Coefficient_one(), Coefficient_one());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "operator+=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  typename Row::iterator itr = row.insert(v_space_dim);
+  ++(*itr);
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Linear_Expression_Impl<Row2>& e2) {
+  linear_combine(e2, Coefficient_one(), -1);
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "operator-=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  typename Row::iterator itr = row.insert(v_space_dim);
+  --(*itr);
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator*=(Coefficient_traits::const_reference n) {
+  if (n == 0) {
+    row.clear();
+    PPL_ASSERT(OK());
+    return *this;
+  }
+  for (typename Row::iterator i = row.begin(),
+         i_end = row.end(); i != i_end; ++i)
+    (*i) *= n;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator/=(Coefficient_traits::const_reference n) {
+  typename Row::iterator i = row.begin();
+  const typename Row::iterator& i_end = row.end();
+  while (i != i_end) {
+    (*i) /= n;
+    if (*i == 0)
+      i = row.reset(i);
+    else
+      ++i;
+  }
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate() {
+  for (typename Row::iterator i = row.begin(),
+         i_end = row.end(); i != i_end; ++i)
+    neg_assign(*i);
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::add_mul_assign(Coefficient_traits::const_reference n,
+                                            const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "add_mul_assign(e, n, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  if (n == 0)
+    return *this;
+  typename Row::iterator itr = row.insert(v_space_dim);
+  (*itr) += n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference n,
+                 const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "sub_mul_assign(e, n, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  if (n == 0)
+    return *this;
+  typename Row::iterator itr = row.insert(v_space_dim);
+  (*itr) -= n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Impl<Row2>& y) {
+  if (factor != 0)
+    linear_combine(y, Coefficient_one(), factor);
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Impl<Row2>& y) {
+  if (factor != 0)
+    linear_combine(y, Coefficient_one(), -factor);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::print(std::ostream& s) const {
+  PPL_DIRTY_TEMP_COEFFICIENT(ev);
+  bool first = true;
+  for (typename Row::const_iterator i = row.lower_bound(1), i_end = row.end();
+       i != i_end; ++i) {
+    ev = *i;
+    if (ev == 0)
+      continue;
+    if (!first) {
+      if (ev > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(ev);
+      }
+    }
+    else
+      first = false;
+    if (ev == -1)
+      s << "-";
+    else if (ev != 1)
+      s << ev << "*";
+    IO_Operators::operator<<(s, Variable(i.index() - 1));
+  }
+  // Inhomogeneous term.
+  PPL_DIRTY_TEMP_COEFFICIENT(it);
+  it = row[0];
+  if (it != 0) {
+    if (!first) {
+      if (it > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(it);
+      }
+    }
+    else
+      first = false;
+    s << it;
+  }
+
+  if (first)
+    // The null linear expression.
+    s << Coefficient_zero();
+}
+
+template <typename Row>
+Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::get(dimension_type i) const {
+  return row.get(i);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::set(dimension_type i, Coefficient_traits::const_reference n) {
+  if (n == 0)
+    row.reset(i);
+  else
+    row.insert(i, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::exact_div_assign(Coefficient_traits::const_reference c,
+                   dimension_type start, dimension_type end) {
+  // NOTE: Since all coefficients in [start,end) are multiple of c,
+  // each of the resulting coefficients will be nonzero iff the initial
+  // coefficient was.
+  for (typename Row::iterator i = row.lower_bound(start),
+         i_end = row.lower_bound(end); i != i_end; ++i)
+    Parma_Polyhedra_Library::exact_div_assign(*i, *i, c);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::mul_assign(Coefficient_traits::const_reference c,
+                   dimension_type start, dimension_type end) {
+  if (c == 0) {
+    typename Row::iterator i = row.lower_bound(start);
+    const typename Row::iterator& i_end = row.end();
+    while (i != i_end && i.index() < end)
+      i = row.reset(i);
+  }
+  else {
+    for (typename Row::iterator
+      i = row.lower_bound(start), i_end = row.lower_bound(end); i != i_end; ++i)
+      (*i) *= c;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2,
+                 dimension_type start, dimension_type end) {
+  Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2,
+                     dimension_type start, dimension_type end) {
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= row.size());
+  PPL_ASSERT(end <= y.row.size());
+  if (c1 == 0) {
+    if (c2 == 0) {
+      PPL_ASSERT(c1 == 0);
+      PPL_ASSERT(c2 == 0);
+      typename Row::iterator i = row.lower_bound(start);
+      const typename Row::iterator& i_end = row.end();
+      while (i != i_end && i.index() < end)
+        i = row.reset(i);
+    }
+    else {
+      PPL_ASSERT(c1 == 0);
+      PPL_ASSERT(c2 != 0);
+
+      typename Row::iterator i = row.lower_bound(start);
+      const typename Row::iterator& i_end = row.end();
+      typename Row2::const_iterator j = y.row.lower_bound(start);
+      typename Row2::const_iterator j_last = y.row.lower_bound(end);
+
+      while (i != i_end && i.index() < end && j != j_last) {
+        if (i.index() < j.index()) {
+          i = row.reset(i);
+          continue;
+        }
+        if (i.index() > j.index()) {
+          i = row.insert(i, j.index(), *j);
+          (*i) *= c2;
+          ++i;
+          ++j;
+          continue;
+        }
+        PPL_ASSERT(i.index() == j.index());
+        (*i) = (*j);
+        (*i) *= c2;
+        ++i;
+        ++j;
+      }
+      while (i != i_end && i.index() < end)
+        i = row.reset(i);
+      while (j != j_last) {
+        i = row.insert(i, j.index(), *j);
+        (*i) *= c2;
+        // No need to increment i here.
+        ++j;
+      }
+    }
+  }
+  else {
+    if (c2 == 0) {
+      PPL_ASSERT(c1 != 0);
+      PPL_ASSERT(c2 == 0);
+      for (typename Row::iterator i = row.lower_bound(start),
+             i_end = row.lower_bound(end); i != i_end; ++i)
+        (*i) *= c1;
+    }
+    else {
+      PPL_ASSERT(c1 != 0);
+      PPL_ASSERT(c2 != 0);
+      Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::sign_normalize() {
+  typename Row::iterator i = row.lower_bound(1);
+  typename Row::iterator i_end = row.end();
+
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      break;
+
+  if (i != i_end && *i < 0) {
+    for ( ; i != i_end; ++i)
+      neg_assign(*i);
+    // Negate the first coefficient, too.
+    typename Row::iterator first = row.begin();
+    if (first != row.end() && first.index() == 0)
+      neg_assign(*first);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate(dimension_type first, dimension_type last) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  typename Row::iterator i = row.lower_bound(first);
+  typename Row::iterator i_end = row.lower_bound(last);
+  for ( ; i != i_end; ++i)
+    neg_assign(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e) {
+  row = e.row;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e,
+                                       dimension_type space_dim) {
+  Row x(e.row, space_dim + 1, space_dim + 1);
+  swap(row, x);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Impl<Row2>& y,
+                        dimension_type start, dimension_type end) const {
+  const Linear_Expression_Impl<Row>& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.row.size());
+  PPL_ASSERT(end <= y.row.size());
+  result = 0;
+  typename Row ::const_iterator x_i = x.row.lower_bound(start);
+  typename Row ::const_iterator x_end = x.row.lower_bound(end);
+  typename Row2::const_iterator y_i = y.row.lower_bound(start);
+  typename Row2::const_iterator y_end = y.row.lower_bound(end);
+  while (x_i != x_end && y_i != y_end) {
+    if (x_i.index() == y_i.index()) {
+      Parma_Polyhedra_Library::add_mul_assign(result, *x_i, *y_i);
+      ++x_i;
+      ++y_i;
+    }
+    else {
+      if (x_i.index() < y_i.index()) {
+        PPL_ASSERT(y.row.get(x_i.index()) == 0);
+        // (*x_i) * 0 == 0, nothing to do.
+        ++x_i;
+      }
+      else {
+        PPL_ASSERT(x.row.get(y_i.index()) == 0);
+        // 0 * (*y_i) == 0, nothing to do.
+        ++y_i;
+      }
+    }
+  }
+  // In the remaining positions (if any) at most one row is nonzero, so
+  // there's nothing left to do.
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+                      dimension_type start, dimension_type end) const {
+  PPL_DIRTY_TEMP_COEFFICIENT(result);
+  scalar_product_assign(result, y, start, end);
+  return sgn(result);
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+              dimension_type start, dimension_type end) const {
+  const Linear_Expression_Impl<Row>& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.row.size());
+  PPL_ASSERT(end <= y.row.size());
+
+  typename Row::const_iterator i = x.row.lower_bound(start);
+  typename Row::const_iterator i_end = x.row.lower_bound(end);
+  typename Row2::const_iterator j = y.row.lower_bound(start);
+  typename Row2::const_iterator j_end = y.row.lower_bound(end);
+  while (i != i_end && j != j_end) {
+    if (i.index() == j.index()) {
+      if (*i != *j)
+        return false;
+      ++i;
+      ++j;
+    }
+    else {
+      if (i.index() < j.index()) {
+        if (*i != 0)
+          return false;
+        ++i;
+      }
+      else {
+        PPL_ASSERT(i.index() > j.index());
+        if (*j != 0)
+          return false;
+        ++j;
+      }
+    }
+  }
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      return false;
+  for ( ; j != j_end; ++j)
+    if (*j != 0)
+      return false;
+  return true;
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  const Linear_Expression_Impl<Row>& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.row.size());
+  PPL_ASSERT(end <= y.row.size());
+
+  // Deal with trivial cases.
+  if (c1 == 0) {
+    if (c2 == 0)
+      return true;
+    else
+      return y.all_zeroes(start, end);
+  }
+  if (c2 == 0)
+    return x.all_zeroes(start, end);
+
+  PPL_ASSERT(c1 != 0);
+  PPL_ASSERT(c2 != 0);
+  typename Row::const_iterator i = x.row.lower_bound(start);
+  typename Row::const_iterator i_end = x.row.lower_bound(end);
+  typename Row2::const_iterator j = y.row.lower_bound(start);
+  typename Row2::const_iterator j_end = y.row.lower_bound(end);
+  while (i != i_end && j != j_end) {
+    if (i.index() == j.index()) {
+      if ((*i) * c1 != (*j) * c2)
+        return false;
+      ++i;
+      ++j;
+    }
+    else {
+      if (i.index() < j.index()) {
+        if (*i != 0)
+          return false;
+        ++i;
+      }
+      else {
+        PPL_ASSERT(i.index() > j.index());
+        if (*j != 0)
+          return false;
+        ++j;
+      }
+    }
+  }
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      return false;
+  for ( ; j != j_end; ++j)
+    if (*j != 0)
+      return false;
+  return true;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, Variable v) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, v);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, v);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, c1, c2);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, c1, c2);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return is_equal_to(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return is_equal_to(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator+=(const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return operator+=(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return operator+=(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return *this;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator-=(const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return operator-=(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return operator-=(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return *this;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    add_mul_assign(factor, *p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    add_mul_assign(factor, *p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    sub_mul_assign(factor, *p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    sub_mul_assign(factor, *p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, dimension_type i) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, i);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, i);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2,
+                 dimension_type start, dimension_type end) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, c1, c2, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, c1, c2, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2,
+                     dimension_type start, dimension_type end) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Interface& y) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return compare(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return compare(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return 0;
+  }
+}
+
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return construct(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return construct(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y,
+                                       dimension_type space_dim) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return construct(*p, space_dim);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return construct(*p, space_dim);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Interface& y,
+                        dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    scalar_product_assign(result, *p, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    scalar_product_assign(result, *p, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Interface& y,
+                      dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return scalar_product_sign(*p, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return scalar_product_sign(*p, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return 0;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+              dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return is_equal_to(*p, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return is_equal_to(*p, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return is_equal_to(*p, c1, c2, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return is_equal_to(*p, c1, c2, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::have_a_common_variable(const Linear_Expression_Interface& y,
+                         Variable first, Variable last) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return have_a_common_variable(*p, first, last);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return have_a_common_variable(*p, first, last);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::begin() const {
+  return new const_iterator(row, 1);
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::end() const {
+  return new const_iterator(row, row.size());
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::lower_bound(Variable v) const {
+  return new const_iterator(row, v.space_dimension());
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::const_iterator
+::const_iterator(const Row& row1, dimension_type i)
+  : row(&row1), itr(row1.lower_bound(i)) {
+  skip_zeroes_forward();
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::const_iterator
+::clone() const {
+  return new const_iterator(*this);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator++() {
+  ++itr;
+  skip_zeroes_forward();
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator--() {
+  --itr;
+  skip_zeroes_backward();
+}
+
+template <typename Row>
+typename Linear_Expression_Impl<Row>::const_iterator::reference
+Linear_Expression_Impl<Row>::const_iterator
+::operator*() const {
+  return *itr;
+}
+
+template <typename Row>
+Variable
+Linear_Expression_Impl<Row>::const_iterator
+::variable() const {
+  const dimension_type i = itr.index();
+  PPL_ASSERT(i != 0);
+  return Variable(i - 1);
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::const_iterator
+::operator==(const const_iterator_interface& x) const {
+  const const_iterator* const p = dynamic_cast<const const_iterator*>(&x);
+  // Comparing iterators belonging to different rows is forbidden.
+  PPL_ASSERT(p != 0);
+  PPL_ASSERT(row == p->row);
+  return itr == p->itr;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::ascii_dump(std::ostream& s) const {
+  s << "size " << (space_dimension() + 1) << " ";
+  for (dimension_type i = 0; i < row.size(); ++i) {
+    s << row.get(i);
+    if (i != row.size() - 1)
+      s << ' ';
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str))
+    return false;
+  if (str != "size")
+    return false;
+
+  dimension_type new_size;
+  if (!(s >> new_size))
+    return false;
+
+  row.resize(0);
+  row.resize(new_size);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+
+  for (dimension_type j = 0; j < new_size; ++j) {
+    if (!(s >> c))
+      return false;
+    if (c != 0)
+      row.insert(j, c);
+  }
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::OK() const {
+  return row.OK();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Impl_templates_hh)
diff --git a/src/Linear_Expression_Impl_types.hh b/src/Linear_Expression_Impl_types.hh
new file mode 100644
index 0000000..e2beb9b
--- /dev/null
+++ b/src/Linear_Expression_Impl_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_Impl_types_hh
+#define PPL_Linear_Expression_Impl_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_Expression_Impl;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Impl_types_hh)
diff --git a/src/Linear_Expression_Interface.cc b/src/Linear_Expression_Interface.cc
new file mode 100644
index 0000000..b064538
--- /dev/null
+++ b/src/Linear_Expression_Interface.cc
@@ -0,0 +1,35 @@
+/* Linear_Expression_Interface class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+
+#include "Linear_Expression_Interface_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Linear_Expression_Interface::~Linear_Expression_Interface() {
+}
+
+PPL::Linear_Expression_Interface::const_iterator_interface
+::~const_iterator_interface() {
+}
diff --git a/src/Linear_Expression_Interface_defs.hh b/src/Linear_Expression_Interface_defs.hh
new file mode 100644
index 0000000..e2d3b8f
--- /dev/null
+++ b/src/Linear_Expression_Interface_defs.hh
@@ -0,0 +1,489 @@
+/* Linear_Expression_Interface class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_Interface_defs_hh
+#define PPL_Linear_Expression_Interface_defs_hh 1
+
+#include "Linear_Expression_Interface_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Dense_Row_types.hh"
+#include "Sparse_Row_types.hh"
+#include <vector>
+#include <set>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of a class implementing Linear_Expression_Interface
+  represents a linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Linear_Expression_Interface {
+public:
+  virtual ~Linear_Expression_Interface();
+
+  virtual bool OK() const = 0;
+
+  //! Returns the current representation of this linear expression.
+  virtual Representation representation() const = 0;
+
+  //! An interface for const iterators on the expression (homogeneous)
+  //! coefficients that are nonzero.
+  /*!
+    These iterators are invalidated by operations that modify the expression.
+  */
+  class const_iterator_interface {
+  public:
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef const Coefficient value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef Coefficient_traits::const_reference reference;
+
+    //! Returns a copy of *this.
+    //! This returns a pointer to dynamic-allocated memory. The caller has the
+    //! duty to free the memory when it's not needed anymore.
+    virtual const_iterator_interface* clone() const = 0;
+
+    virtual ~const_iterator_interface();
+
+    //! Navigates to the next nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator++() = 0;
+
+    //! Navigates to the previous nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator--() = 0;
+
+    //! Returns the current element.
+    virtual reference operator*() const = 0;
+
+    //! Returns the variable of the coefficient pointed to by \c *this.
+    /*!
+      \returns the variable of the coefficient pointed to by \c *this.
+    */
+    virtual Variable variable() const = 0;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    virtual bool operator==(const const_iterator_interface& x) const = 0;
+  };
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* begin() const = 0;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* end() const = 0;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  //! Returns (a pointer to) an iterator that points to the first nonzero
+  //! coefficient of a variable greater than or equal to v, or at end if no
+  //! such coefficient exists.
+  virtual const_iterator_interface* lower_bound(Variable v) const = 0;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  virtual dimension_type space_dimension() const = 0;
+
+  //! Sets the dimension of the vector space enclosing \p *this to \p n .
+  virtual void set_space_dimension(dimension_type n) = 0;
+
+  //! Returns the coefficient of \p v in \p *this.
+  virtual Coefficient_traits::const_reference
+  coefficient(Variable v) const = 0;
+
+  //! Sets the coefficient of \p v in \p *this to \p n.
+  virtual void
+  set_coefficient(Variable v, Coefficient_traits::const_reference n) = 0;
+
+  //! Returns the inhomogeneous term of \p *this.
+  virtual Coefficient_traits::const_reference inhomogeneous_term() const = 0;
+
+  //! Sets the inhomogeneous term of \p *this to \p n.
+  virtual void
+  set_inhomogeneous_term(Coefficient_traits::const_reference n) = 0;
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void
+  linear_combine(const Linear_Expression_Interface& y, Variable v) = 0;
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! \p *this and \p y have the same space dimension.
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2) = 0;
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2) = 0;
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  virtual void swap_space_dimensions(Variable v1, Variable v2) = 0;
+
+  //! Removes all the specified dimensions from the expression.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  virtual void remove_space_dimensions(const Variables_Set& vars) = 0;
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  virtual void shift_space_dimensions(Variable v, dimension_type n) = 0;
+
+  //! Permutes the space dimensions of the expression.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  virtual void
+  permute_space_dimensions(const std::vector<Variable>& cycle) = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+  virtual bool is_zero() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  virtual bool all_homogeneous_terms_are_zero() const = 0;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  virtual memory_size_type total_memory_in_bytes() const = 0;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const = 0;
+
+  //! Writes to \p s an ASCII representation of \p *this.
+  virtual void ascii_dump(std::ostream& s) const = 0;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  virtual bool ascii_load(std::istream& s) = 0;
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  virtual bool is_equal_to(const Linear_Expression_Interface& x) const = 0;
+
+  //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+  //! so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the coefficients
+    and the inhomogeneous term and normalizes them by the GCD itself.
+  */
+  virtual void normalize() = 0;
+
+  //! Ensures that the first nonzero homogeneous coefficient is positive,
+  //! by negating the row if necessary.
+  virtual void sign_normalize() = 0;
+
+  /*! \brief
+    Negates the elements from index \p first (included)
+    to index \p last (excluded).
+  */
+  virtual void negate(dimension_type first, dimension_type last) = 0;
+
+  virtual Linear_Expression_Interface&
+  operator+=(Coefficient_traits::const_reference n) = 0;
+  virtual Linear_Expression_Interface&
+  operator-=(Coefficient_traits::const_reference n) = 0;
+
+  //! The basic comparison function.
+  /*! \relates Linear_Expression_Interface
+
+    \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+            is greater. The absolute value of the result is 1 if the difference
+            is only in the inhomogeneous terms, 2 otherwise
+
+    The order is a lexicographic. It starts comparing the variables'
+    coefficient, starting from Variable(0), and at the end it compares
+    the inhomogeneous terms.
+  */
+  virtual int compare(const Linear_Expression_Interface& y) const = 0;
+
+  virtual Linear_Expression_Interface&
+  operator+=(const Linear_Expression_Interface& e2) = 0;
+  virtual Linear_Expression_Interface&
+  operator+=(const Variable v) = 0;
+  virtual Linear_Expression_Interface&
+  operator-=(const Linear_Expression_Interface& e2) = 0;
+  virtual Linear_Expression_Interface&
+  operator-=(const Variable v) = 0;
+  virtual Linear_Expression_Interface&
+  operator*=(Coefficient_traits::const_reference n) = 0;
+  virtual Linear_Expression_Interface&
+  operator/=(Coefficient_traits::const_reference n) = 0;
+
+  virtual void negate() = 0;
+
+  virtual Linear_Expression_Interface&
+  add_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+  virtual Linear_Expression_Interface&
+  sub_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+  virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2) = 0;
+
+  virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2) = 0;
+
+  virtual void print(std::ostream& s) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars[i] is \f$0\f$.
+  */
+  virtual bool all_zeroes(const Variables_Set& vars) const = 0;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+                                      Variable first, Variable last) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the i-th coefficient.
+  virtual Coefficient_traits::const_reference get(dimension_type i) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the i-th coefficient to n.
+  virtual void set(dimension_type i, Coefficient_traits::const_reference n) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+    [start, end).
+  */
+  virtual bool all_zeroes(dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  virtual dimension_type
+  num_zeroes(dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are 0 returns 0.
+  */
+  virtual Coefficient gcd(dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  virtual void exact_div_assign(Coefficient_traits::const_reference c,
+                                dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+  virtual void mul_assign(Coefficient_traits::const_reference n,
+                          dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void
+  linear_combine(const Linear_Expression_Interface& y, dimension_type i) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2,
+                              dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2,
+                                  dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element, or 0 if there are no
+  //! nonzero elements.
+  virtual dimension_type last_nonzero() const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  virtual dimension_type
+  last_nonzero(dimension_type first, dimension_type last) const = 0;
+
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  virtual dimension_type
+  first_nonzero(dimension_type first, dimension_type last) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+    \f$0\f$, disregarding coefficients of variables in \p vars.
+  */
+  virtual bool
+  all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  virtual void
+  scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Interface& y,
+                        dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Computes the sign of the sum of (*this)[i]*y[i],
+  //! for each i in [start,end).
+  virtual int
+  scalar_product_sign(const Linear_Expression_Interface& y,
+                      dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Removes from the set x all the indexes of nonzero elements of *this.
+  virtual void
+  has_a_free_dimension_helper(std::set<dimension_type>& x) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           Coefficient_traits::const_reference c1,
+                           Coefficient_traits::const_reference c2,
+                           dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Dense_Row& row) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Sparse_Row& row) const = 0;
+};
+
+#endif // !defined(PPL_Linear_Expression_Interface_defs_hh)
diff --git a/src/Linear_Expression_Interface_types.hh b/src/Linear_Expression_Interface_types.hh
new file mode 100644
index 0000000..0a62b78
--- /dev/null
+++ b/src/Linear_Expression_Interface_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_Interface_types_hh
+#define PPL_Linear_Expression_Interface_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression_Interface;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_Interface_types_hh)
diff --git a/src/Linear_Expression_defs.hh b/src/Linear_Expression_defs.hh
new file mode 100644
index 0000000..02b43e3
--- /dev/null
+++ b/src/Linear_Expression_defs.hh
@@ -0,0 +1,928 @@
+/* Linear_Expression class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_defs_hh
+#define PPL_Linear_Expression_defs_hh 1
+
+#include "Linear_Expression_types.hh"
+
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Linear_System_types.hh"
+#include "Constraint_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Coefficient_types.hh"
+#include "Polyhedron_types.hh"
+#include "Grid_types.hh"
+#include "PIP_Problem_types.hh"
+#include "BHRZ03_Certificate_types.hh"
+#include "Scalar_Products_types.hh"
+#include "MIP_Problem_types.hh"
+#include "Box_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "termination_types.hh"
+
+#include "Expression_Adapter_defs.hh"
+#include "Expression_Hide_Inhomo_types.hh"
+#include "Expression_Hide_Last_types.hh"
+
+#include "Linear_Expression_Interface_defs.hh"
+#include "Variable_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n / \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Assigns to \p e its own negation.
+/*! \relates Linear_Expression */
+void
+neg_assign(Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+               Coefficient_traits::const_reference n, Variable v);
+
+//! Sums \p e2 multiplied by \p factor into \p e1.
+/*! \relates Linear_Expression */
+void add_mul_assign(Linear_Expression& e1,
+                    Coefficient_traits::const_reference factor,
+                    const Linear_Expression& e2);
+
+//! Subtracts \p e2 multiplied by \p factor from \p e1.
+/*! \relates Linear_Expression */
+void sub_mul_assign(Linear_Expression& e1,
+                    Coefficient_traits::const_reference factor,
+                    const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+               Coefficient_traits::const_reference n, Variable v);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Expression
+
+  \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+           is greater. The absolute value of the result is 1 if the difference
+           is only in the inhomogeneous terms, 2 otherwise
+
+  The order is a lexicographic. It starts comparing the variables' coefficient,
+  starting from Variable(0), and at the end it compares the inhomogeneous
+  terms.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Linear_Expression& x, const Linear_Expression& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression represents the linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression e1 = 4*x;
+  Linear_Expression e2 = 2*y;
+  Linear_Expression e3 = z;
+  Linear_Expression e = Linear_Expression(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression {
+public:
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: returns a copy of Linear_Expression::zero().
+  explicit Linear_Expression(Representation r = default_representation);
+
+  /*! \brief Ordinary copy constructor.
+    \note
+    The new expression will have the same representation as \p e
+    (not necessarily the default_representation).
+  */
+  Linear_Expression(const Linear_Expression& e);
+
+  //! Copy constructor that takes also a Representation.
+  Linear_Expression(const Linear_Expression& e, Representation r);
+
+  // Queried by expression adapters.
+  typedef const Linear_Expression& const_reference;
+  typedef Linear_Expression raw_type;
+
+  /*! \brief Copy constructor from a linear expression adapter.
+    \note
+    The new expression will have the same representation as \p e
+    (not necessarily the default_representation).
+  */
+  template <typename LE_Adapter>
+  explicit
+  Linear_Expression(const LE_Adapter& e,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  /*! \brief Copy constructor from a linear expression adapter that takes a
+    Representation.
+  */
+  template <typename LE_Adapter>
+  Linear_Expression(const LE_Adapter& e, Representation r,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  /*! \brief
+    Copy constructor from a linear expression adapter that takes a
+    space dimension.
+    \note
+    The new expression will have the same representation as \p e
+    (not necessarily default_representation).
+  */
+  template <typename LE_Adapter>
+  explicit
+  Linear_Expression(const LE_Adapter& e, dimension_type space_dim,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  /*! \brief
+    Copy constructor from a linear expression adapter that takes a
+    space dimension and a Representation.
+  */
+  template <typename LE_Adapter>
+  Linear_Expression(const LE_Adapter& e,
+                    dimension_type space_dim, Representation r,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  //! Assignment operator.
+  Linear_Expression& operator=(const Linear_Expression& e);
+
+  //! Destructor.
+  ~Linear_Expression();
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression(Coefficient_traits::const_reference n,
+                             Representation r = default_representation);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v, Representation r = default_representation);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! A const %iterator on the expression (homogeneous) coefficient that are
+  //! nonzero.
+  /*!
+    These iterators are invalidated by operations that modify the expression.
+  */
+  class const_iterator {
+  private:
+  public:
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef const Coefficient value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef Coefficient_traits::const_reference reference;
+
+    //! Constructs an invalid const_iterator.
+    /*!
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit const_iterator();
+
+    //! The copy constructor.
+    /*!
+      \param itr
+      The %iterator that will be copied.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const const_iterator& itr);
+
+    ~const_iterator();
+
+    //! Swaps itr with *this.
+    /*!
+      \param itr
+      The %iterator that will be swapped with *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    void m_swap(const_iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator=(const const_iterator& itr);
+
+    //! Navigates to the next nonzero coefficient.
+    /*!
+      This method takes \f$O(n)\f$ time for dense expressions, and
+      \f$O(1)\f$ time for sparse expressions.
+    */
+    const_iterator& operator++();
+
+    //! Navigates to the previous nonzero coefficient.
+    /*!
+      This method takes \f$O(n)\f$ time for dense expressions, and
+      \f$O(1)\f$ time for sparse expressions.
+    */
+    const_iterator& operator--();
+
+    //! Returns the current element.
+    reference operator*() const;
+
+    //! Returns the variable of the coefficient pointed to by \c *this.
+    /*!
+      \returns the variable of the coefficient pointed to by \c *this.
+    */
+    Variable variable() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const const_iterator& x) const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const const_iterator& x) const;
+
+  private:
+    //! Constructor from a const_iterator_interface*.
+    //! The new object takes ownership of the dynamic object.
+    const_iterator(Linear_Expression_Interface::const_iterator_interface* itr);
+
+    Linear_Expression_Interface::const_iterator_interface* itr;
+
+    friend class Linear_Expression;
+  };
+
+  //! Returns an iterator that points to the first nonzero coefficient in the
+  //! expression.
+  const_iterator begin() const;
+
+  //! Returns an iterator that points to the last nonzero coefficient in the
+  //! expression.
+  const_iterator end() const;
+
+  //! Returns an iterator that points to the first nonzero coefficient of a
+  //! variable bigger than or equal to v.
+  const_iterator lower_bound(Variable v) const;
+
+  //! Returns the maximum space dimension a Linear_Expression can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to \p n .
+  void set_space_dimension(dimension_type n);
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Sets the coefficient of \p v in \p *this to \p n.
+  void set_coefficient(Variable v,
+                       Coefficient_traits::const_reference n);
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Sets the inhomogeneous term of \p *this to \p n.
+  void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  void linear_combine(const Linear_Expression& y, Variable v);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! c1 and c2 are not 0.
+  void linear_combine(const Linear_Expression& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  void linear_combine_lax(const Linear_Expression& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the expression.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the expression.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+  bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the (zero-dimension space) constant 0.
+  static const Linear_Expression& zero();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Linear_Expression& y);
+
+  //! Copy constructor with a specified space dimension.
+  Linear_Expression(const Linear_Expression& e, dimension_type space_dim);
+
+  //! Copy constructor with a specified space dimension and representation.
+  Linear_Expression(const Linear_Expression& e, dimension_type space_dim,
+                    Representation r);
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  bool is_equal_to(const Linear_Expression& x) const;
+
+  //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+  //! so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the coefficients
+    and the inhomogeneous term and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  //! Ensures that the first nonzero homogeneous coefficient is positive,
+  //! by negating the row if necessary.
+  void sign_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars[i] is \f$0\f$.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the (zero-dimension space) constant 0.
+  */
+  static const Linear_Expression* zero_p;
+
+  Linear_Expression_Interface* impl;
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Expression(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression(dimension_type space_dim, bool,
+                    Representation r = default_representation);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the i-th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the i-th coefficient to n.
+  void set(dimension_type i, Coefficient_traits::const_reference n);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the coefficient of v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the coefficient of v to n.
+  void set(Variable v, Coefficient_traits::const_reference n);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+    [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are 0 returns 0.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  void exact_div_assign(Coefficient_traits::const_reference c,
+                        dimension_type start, dimension_type end);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  void linear_combine(const Linear_Expression& y, dimension_type i);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). It assumes that c1 and c2 are nonzero.
+  void linear_combine(const Linear_Expression& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  void linear_combine_lax(const Linear_Expression& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2,
+                          dimension_type start, dimension_type end);
+
+  //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+  void mul_assign(Coefficient_traits::const_reference n,
+                  dimension_type start, dimension_type end);
+
+  //! Returns the index of the last nonzero element, or 0 if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Sets results to the sum of (*this)[i]*y[i], for each i.
+  void scalar_product_assign(Coefficient& result,
+                             const Linear_Expression& y) const;
+
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  void scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+                             dimension_type start, dimension_type end) const;
+
+  //! Computes the sign of the sum of (*this)[i]*y[i], for each i.
+  int scalar_product_sign(const Linear_Expression& y) const;
+
+  //! Computes the sign of the sum of (*this)[i]*y[i],
+  //! for each i in [start,end).
+  int scalar_product_sign(const Linear_Expression& y,
+                          dimension_type start, dimension_type end) const;
+
+  //! Removes from the set x all the indexes of nonzero elements of *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  bool is_equal_to(const Linear_Expression& x,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  bool is_equal_to(const Linear_Expression& x,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets `row' to a copy of the row that implements *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets `row' to a copy of the row that implements *this.
+  void get_row(Sparse_Row& row) const;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  bool have_a_common_variable(const Linear_Expression& x,
+                              Variable first, Variable last) const;
+
+  /*! \brief
+    Negates the elements from index \p first (included)
+    to index \p last (excluded).
+  */
+  void negate(dimension_type first, dimension_type last);
+
+  template <typename Row>
+  friend class Linear_Expression_Impl;
+
+  // NOTE: The following classes are friends of Linear_Expression in order
+  // to access its private methods.
+  // Since they are *not* friend of Linear_Expression_Impl, they can only
+  // access its public methods so they cannot break the class invariant of
+  // Linear_Expression_Impl.
+  friend class Grid;
+  friend class Congruence;
+  friend class Polyhedron;
+  friend class PIP_Tree_Node;
+  friend class Grid_Generator;
+  friend class Generator;
+  friend class Constraint;
+  friend class Constraint_System;
+  friend class PIP_Problem;
+  friend class BHRZ03_Certificate;
+  friend class Scalar_Products;
+  friend class MIP_Problem;
+  friend class Box_Helpers;
+  friend class Congruence_System;
+  friend class BD_Shape_Helpers;
+  friend class Octagonal_Shape_Helper;
+  friend class Termination_Helpers;
+  template <typename T>
+  friend class BD_Shape;
+  template <typename T>
+  friend class Octagonal_Shape;
+  template <typename T>
+  friend class Linear_System;
+  template <typename T>
+  friend class Box;
+  template <typename T>
+  friend class Expression_Adapter;
+  template <typename T>
+  friend class Expression_Hide_Inhomo;
+  template <typename T>
+  friend class Expression_Hide_Last;
+
+  friend Linear_Expression
+  operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression
+  operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Linear_Expression
+  operator+(Variable v, const Linear_Expression& e);
+  friend Linear_Expression
+  operator+(Variable v, Variable w);
+
+  friend Linear_Expression
+  operator-(const Linear_Expression& e);
+
+  friend Linear_Expression
+  operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression
+  operator-(Variable v, Variable w);
+  friend Linear_Expression
+  operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Linear_Expression
+  operator-(Variable v, const Linear_Expression& e);
+  friend Linear_Expression
+  operator-(const Linear_Expression& e, Variable v);
+
+  friend Linear_Expression
+  operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e, Variable v);
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e, Variable v);
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Linear_Expression&
+  operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend void
+  neg_assign(Linear_Expression& e);
+
+  friend Linear_Expression&
+  add_mul_assign(Linear_Expression& e,
+                 Coefficient_traits::const_reference n, Variable v);
+  friend Linear_Expression&
+  sub_mul_assign(Linear_Expression& e,
+                 Coefficient_traits::const_reference n, Variable v);
+
+  friend void
+  add_mul_assign(Linear_Expression& e1,
+                 Coefficient_traits::const_reference factor,
+                 const Linear_Expression& e2);
+  friend void
+  sub_mul_assign(Linear_Expression& e1,
+                 Coefficient_traits::const_reference factor,
+                 const Linear_Expression& e2);
+
+  friend int
+  compare(const Linear_Expression& x, const Linear_Expression& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<(std::ostream& s, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression */
+void swap(Linear_Expression& x, Linear_Expression& y);
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression::const_iterator */
+void swap(Linear_Expression::const_iterator& x,
+          Linear_Expression::const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Linear_Expression_inlines.hh"
+
+#endif // !defined(PPL_Linear_Expression_defs_hh)
diff --git a/src/Linear_Expression_inlines.hh b/src/Linear_Expression_inlines.hh
new file mode 100644
index 0000000..3641fe0
--- /dev/null
+++ b/src/Linear_Expression_inlines.hh
@@ -0,0 +1,822 @@
+/* Linear_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Expression_inlines_hh
+#define PPL_Linear_Expression_inlines_hh 1
+
+#include "Expression_Adapter_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline Linear_Expression&
+Linear_Expression::operator=(const Linear_Expression& e) {
+  Linear_Expression tmp = e;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+  delete impl;
+}
+
+inline Representation
+Linear_Expression::representation() const {
+  return impl->representation();
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+  return impl->space_dimension();
+}
+
+inline void
+Linear_Expression::set_space_dimension(dimension_type n) {
+  impl->set_space_dimension(n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+  return impl->coefficient(v);
+}
+
+inline void
+Linear_Expression
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+  impl->set_coefficient(v, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+  return impl->inhomogeneous_term();
+}
+
+inline void
+Linear_Expression
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+  impl->set_inhomogeneous_term(n);
+}
+
+inline void
+Linear_Expression::swap_space_dimensions(Variable v1, Variable v2) {
+  impl->swap_space_dimensions(v1, v2);
+}
+
+inline void
+Linear_Expression::shift_space_dimensions(Variable v, dimension_type n) {
+  impl->shift_space_dimensions(v, n);
+}
+
+inline bool
+Linear_Expression::is_zero() const {
+  return impl->is_zero();
+}
+
+inline bool
+Linear_Expression::all_homogeneous_terms_are_zero() const {
+  return impl->all_homogeneous_terms_are_zero();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+  PPL_ASSERT(zero_p != 0);
+  return *zero_p;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+  return impl->total_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression x = e;
+  x += n;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+  Linear_Expression x = e;
+  x += v;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression x = e;
+  x -= n;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > Linear_Expression::max_space_dimension())
+    throw std::length_error("Linear_Expression "
+                            "PPL::operator+(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  if (v_space_dim >= w_space_dim) {
+    Linear_Expression e(v);
+    e -= w;
+    return e;
+  }
+  else {
+    Linear_Expression e(w.space_dimension(), true);
+    e -= w;
+    e += v;
+    return e;
+  }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression x = e;
+  x *= n;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl += n;
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl -= n;
+  return e;
+}
+
+inline void
+Linear_Expression::m_swap(Linear_Expression& y) {
+  using std::swap;
+  swap(impl, y.impl);
+}
+
+inline void
+Linear_Expression::normalize() {
+  impl->normalize();
+}
+
+inline void
+Linear_Expression::ascii_dump(std::ostream& s) const {
+  impl->ascii_dump(s);
+}
+
+inline bool
+Linear_Expression::ascii_load(std::istream& s) {
+  return impl->ascii_load(s);
+}
+
+inline void
+Linear_Expression::remove_space_dimensions(const Variables_Set& vars) {
+  impl->remove_space_dimensions(vars);
+}
+
+inline void
+Linear_Expression::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  impl->permute_space_dimensions(cycle);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
+  if (e1.space_dimension() >= e2.space_dimension()) {
+    Linear_Expression e = e1;
+    e += e2;
+    return e;
+  }
+  else {
+    Linear_Expression e = e2;
+    e += e1;
+    return e;
+  }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+  return e + v;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(Coefficient_traits::const_reference n,
+               const Linear_Expression& e) {
+  return e + n;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > Linear_Expression::max_space_dimension())
+    throw std::length_error("Linear_Expression "
+                            "PPL::operator+(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  if (v_space_dim >= w_space_dim) {
+    Linear_Expression e(v);
+    e += w;
+    return e;
+  }
+  else {
+    Linear_Expression e(w);
+    e += v;
+    return e;
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e) {
+  Linear_Expression r(e);
+  neg_assign(r);
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
+  if (e1.space_dimension() >= e2.space_dimension()) {
+    Linear_Expression e = e1;
+    e -= e2;
+    return e;
+  }
+  else {
+    Linear_Expression e = e2;
+    neg_assign(e);
+    e += e1;
+    return e;
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+  Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+  result.negate(0, e.space_dimension() + 1);
+  result += v;
+  return result;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+  Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+  result -= v;
+  return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(Coefficient_traits::const_reference n,
+               const Linear_Expression& e) {
+  Linear_Expression result(e);
+  neg_assign(result);
+  result += n;
+  return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator*(Coefficient_traits::const_reference n,
+               const Linear_Expression& e) {
+  return e * n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2) {
+  *e1.impl += *e2.impl;
+  return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, const Variable v) {
+  *e.impl += v;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2) {
+  *e1.impl -= *e2.impl;
+  return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, const Variable v) {
+  *e.impl -= v;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl *= n;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl /= n;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+neg_assign(Linear_Expression& e) {
+  e.impl->negate();
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+               Coefficient_traits::const_reference n,
+               const Variable v) {
+  e.impl->add_mul_assign(n, v);
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+                    Coefficient_traits::const_reference n,
+                    const Variable v) {
+  e.impl->sub_mul_assign(n, v);
+  return e;
+}
+
+inline void
+add_mul_assign(Linear_Expression& e1,
+               Coefficient_traits::const_reference factor,
+               const Linear_Expression& e2) {
+  e1.impl->add_mul_assign(factor, *e2.impl);
+}
+
+inline void
+sub_mul_assign(Linear_Expression& e1,
+                    Coefficient_traits::const_reference factor,
+                    const Linear_Expression& e2) {
+  e1.impl->sub_mul_assign(factor, *e2.impl);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(dimension_type i) const {
+  return impl->get(i);
+}
+
+inline void
+Linear_Expression::set(dimension_type i,
+                       Coefficient_traits::const_reference n) {
+  impl->set(i, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(Variable v) const {
+  return impl->get(v.space_dimension());
+}
+
+inline void
+Linear_Expression::set(Variable v,
+                       Coefficient_traits::const_reference n) {
+  impl->set(v.space_dimension(), n);
+}
+
+inline bool
+Linear_Expression::all_zeroes(dimension_type start, dimension_type end) const {
+  return impl->all_zeroes(start, end);
+}
+
+inline dimension_type
+Linear_Expression::num_zeroes(dimension_type start, dimension_type end) const {
+  return impl->num_zeroes(start, end);
+}
+
+inline Coefficient
+Linear_Expression::gcd(dimension_type start, dimension_type end) const {
+  return impl->gcd(start, end);
+}
+
+inline void
+Linear_Expression
+::exact_div_assign(Coefficient_traits::const_reference c,
+                   dimension_type start, dimension_type end) {
+  impl->exact_div_assign(c, start, end);
+}
+
+inline void
+Linear_Expression
+::mul_assign(Coefficient_traits::const_reference c,
+             dimension_type start, dimension_type end) {
+  impl->mul_assign(c, start, end);
+}
+
+inline void
+Linear_Expression::sign_normalize() {
+  impl->sign_normalize();
+}
+
+inline void
+Linear_Expression::negate(dimension_type first, dimension_type last) {
+  impl->negate(first, last);
+}
+
+inline bool
+Linear_Expression::all_zeroes(const Variables_Set& vars) const {
+  return impl->all_zeroes(vars);
+}
+
+inline bool
+Linear_Expression::all_zeroes_except(const Variables_Set& vars,
+                                     dimension_type start,
+                                     dimension_type end) const {
+  return impl->all_zeroes_except(vars, start, end);
+}
+
+inline dimension_type
+Linear_Expression::last_nonzero() const {
+  return impl->last_nonzero();
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y) const {
+  scalar_product_assign(result, y, 0, space_dimension() + 1);
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+                        dimension_type start, dimension_type end) const {
+  impl->scalar_product_assign(result, *(y.impl), start, end);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y) const {
+  return scalar_product_sign(y, 0, space_dimension() + 1);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y,
+                      dimension_type start, dimension_type end) const {
+  return impl->scalar_product_sign(*(y.impl), start, end);
+}
+
+inline dimension_type
+Linear_Expression
+::first_nonzero(dimension_type first, dimension_type last) const {
+  return impl->first_nonzero(first, last);
+}
+
+inline dimension_type
+Linear_Expression
+::last_nonzero(dimension_type first, dimension_type last) const {
+  return impl->last_nonzero(first, last);
+}
+
+inline void
+Linear_Expression
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  return impl->has_a_free_dimension_helper(x);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+              dimension_type start, dimension_type end) const {
+  return impl->is_equal_to(*(x.impl), start, end);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  return impl->is_equal_to(*(x.impl), c1, c2, start, end);
+}
+
+inline void
+Linear_Expression
+::get_row(Dense_Row& row) const {
+  return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::get_row(Sparse_Row& row) const {
+  return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y, dimension_type i) {
+  impl->linear_combine(*y.impl, i);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2) {
+  impl->linear_combine(*y.impl, c1, c2);
+}
+
+inline void
+Linear_Expression
+::linear_combine_lax(const Linear_Expression& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2) {
+  impl->linear_combine_lax(*y.impl, c1, c2);
+}
+
+inline int
+compare(const Linear_Expression& x, const Linear_Expression& y) {
+  return x.impl->compare(*y.impl);
+}
+
+inline bool
+Linear_Expression::is_equal_to(const Linear_Expression& x) const {
+  return impl->is_equal_to(*x.impl);
+}
+
+inline void
+Linear_Expression::linear_combine(const Linear_Expression& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2,
+                                  dimension_type start,
+                                  dimension_type end) {
+  impl->linear_combine(*y.impl, c1, c2, start, end);
+}
+
+inline void
+Linear_Expression::linear_combine_lax(const Linear_Expression& y,
+                                      Coefficient_traits::const_reference c1,
+                                      Coefficient_traits::const_reference c2,
+                                      dimension_type start,
+                                      dimension_type end) {
+  impl->linear_combine_lax(*y.impl, c1, c2, start, end);
+}
+
+inline bool
+Linear_Expression
+::have_a_common_variable(const Linear_Expression& x,
+                         Variable first, Variable last) const {
+  return impl->have_a_common_variable(*(x.impl), first, last);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator()
+  : itr(NULL) {
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(const const_iterator& x)
+  : itr(x.itr->clone()) {
+}
+
+inline
+Linear_Expression::const_iterator
+::~const_iterator() {
+  // Note that this does nothing if itr==NULL.
+  delete itr;
+}
+
+inline void
+Linear_Expression::const_iterator::m_swap(const_iterator& x) {
+  using std::swap;
+  swap(itr, x.itr);
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator=(const const_iterator& itr) {
+  const_iterator tmp = itr;
+  using std::swap;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator++() {
+  PPL_ASSERT(itr != NULL);
+  ++(*itr);
+  return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator--() {
+  PPL_ASSERT(itr != NULL);
+  --(*itr);
+  return *this;
+}
+
+inline Linear_Expression::const_iterator::reference
+Linear_Expression::const_iterator
+::operator*() const {
+  PPL_ASSERT(itr != NULL);
+  return *(*itr);
+}
+
+inline Variable
+Linear_Expression::const_iterator
+::variable() const {
+  PPL_ASSERT(itr != NULL);
+  return itr->variable();
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator==(const const_iterator& x) const {
+  PPL_ASSERT(itr != NULL);
+  PPL_ASSERT(x.itr != NULL);
+  return *itr == *(x.itr);
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator!=(const const_iterator& x) const {
+  return !(*this == x);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(Linear_Expression_Interface::const_iterator_interface* itr)
+  : itr(itr) {
+  PPL_ASSERT(itr != NULL);
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::begin() const {
+  return const_iterator(impl->begin());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::end() const {
+  return const_iterator(impl->end());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::lower_bound(Variable v) const {
+  return const_iterator(impl->lower_bound(v));
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(e.representation());
+  tmp.set_space_dimension(e.space_dimension());
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  for (typename LE_Adapter::const_iterator i = e.begin(),
+         i_end = e.end(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     Representation r,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(r);
+  tmp.set_space_dimension(e.space_dimension());
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  for (typename LE_Adapter::const_iterator i = e.begin(),
+         i_end = e.end(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     dimension_type space_dim,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(e.representation());
+  tmp.set_space_dimension(space_dim);
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  typedef typename LE_Adapter::const_iterator itr_t;
+  itr_t i_end;
+  if (space_dim <= e.space_dimension())
+    i_end = e.lower_bound(Variable(space_dim));
+  else
+    i_end = e.end();
+  for (itr_t i = e.begin(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     dimension_type space_dim,
+                                     Representation r,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(r);
+  tmp.set_space_dimension(space_dim);
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  typedef typename LE_Adapter::const_iterator itr_t;
+  itr_t i_end;
+  if (space_dim <= e.space_dimension())
+    i_end = e.lower_bound(Variable(space_dim));
+  else
+    i_end = e.end();
+  for (itr_t i = e.begin(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression& e) {
+  e.impl->print(s);
+  return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Linear_Expression& x, Linear_Expression& y) {
+  x.m_swap(y);
+}
+
+/*! \relates Linear_Expression::const_iterator */
+inline void
+swap(Linear_Expression::const_iterator& x,
+     Linear_Expression::const_iterator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_inlines_hh)
diff --git a/src/Linear_Expression_types.hh b/src/Linear_Expression_types.hh
new file mode 100644
index 0000000..b2f216a
--- /dev/null
+++ b/src/Linear_Expression_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Expression_types_hh
+#define PPL_Linear_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Expression_types_hh)
diff --git a/src/Linear_Form.cc b/src/Linear_Form.cc
new file mode 100644
index 0000000..8ed57e6
--- /dev/null
+++ b/src/Linear_Form.cc
@@ -0,0 +1,26 @@
+/* Linear_Form class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+
+#include "ppl-config.h"
+#include "Linear_Form_defs.hh"
diff --git a/src/Linear_Form_defs.hh b/src/Linear_Form_defs.hh
new file mode 100644
index 0000000..57d75c7
--- /dev/null
+++ b/src/Linear_Form_defs.hh
@@ -0,0 +1,499 @@
+/* Linear_Form class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Form_defs_hh
+#define PPL_Linear_Form_defs_hh 1
+
+#include "Linear_Form_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Variable_defs.hh"
+#include "Box_types.hh"
+#include "Float_defs.hh"
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Form */
+template <typename C>
+void swap(Linear_Form<C>& x, Linear_Form<C>& y);
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear form \p f1 + \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f);
+
+//! Returns the linear form - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f);
+
+//! Returns the linear form \p f1 - \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f * \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 + \p f2 and assigns it to \p e1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f + \p v and assigns it to \p f.
+/*! \relates Linear_Form
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f + \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 - \p f2 and assigns it to \p f1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f - \p v and assigns it to \p f.
+/*! \relates Linear_Form
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f - \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f / \p n and assigns it to \p f.
+/*!
+   \relates Linear_Form
+   Performs the division of a linear form by a scalar. It is up to the user to
+   ensure that division by 0 is not performed.
+*/
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream& operator<<(std::ostream& s, const Linear_Form<C>& f);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear form with interval coefficients.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Form represents the interval linear form
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the inhomogeneous term.
+  The coefficients and the inhomogeneous term of the linear form
+  have the template parameter \p C as their type. \p C must be the
+  type of an Interval.
+
+  \par How to build a linear form.
+  A full set of functions is defined in order to provide a convenient
+  interface for building complex linear forms starting from simpler ones
+  and from objects of the classes Variable and \p C. Available operators
+  include binary addition and subtraction, as well as multiplication and
+  division by a coefficient.
+  The space dimension of a linear form is defined as
+  the highest variable dimension among variables that have a nonzero
+  coefficient in the linear form, or zero if no such variable exists.
+  The space dimension for each variable \f$x_i\f$ is given by \f$i + 1\f$.
+
+  \par Example
+  Given the type \p T of an Interval with floating point coefficients (though
+  any integral type may also be used), the following code builds the interval
+  linear form \f$lf = x_5 - x_2 + 1\f$ with space dimension 6:
+  \code
+  Variable x5(5);
+  Variable x2(2);
+  T x5_coefficient;
+  x5_coefficient.lower() = 2.0;
+  x5_coefficient.upper() = 3.0;
+  T inhomogeneous_term;
+  inhomogeneous_term.lower() = 4.0;
+  inhomogeneous_term.upper() = 8.0;
+  Linear_Form<T> lf(x2);
+  lf = -lf;
+  lf += Linear_Form<T>(x2);
+  Linear_Form<T> lf_x5(x5);
+  lf_x5 *= x5_coefficient;
+  lf += lf_x5;
+  \endcode
+  Note that \c lf_x5 is created with space dimension 6, while \c lf is
+  created with space dimension 0 and then extended first to space
+  dimension 2 when \c x2 is subtracted and finally to space dimension
+  6 when \c lf_x5 is added.
+*/
+template <typename C>
+class Parma_Polyhedra_Library::Linear_Form {
+public:
+  //! Default constructor: returns a copy of Linear_Form::zero().
+  Linear_Form();
+
+  //! Ordinary copy constructor.
+  Linear_Form(const Linear_Form& f);
+
+  //! Destructor.
+  ~Linear_Form();
+
+  //! Builds the linear form corresponding to the inhomogeneous term \p n.
+  explicit Linear_Form(const C& n);
+
+  //! Builds the linear form corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Form::max_space_dimension()</CODE>.
+  */
+  Linear_Form(Variable v);
+
+  //! Builds a linear form approximating the linear expression \p e.
+  Linear_Form(const Linear_Expression& e);
+
+  //! Returns the maximum space dimension a Linear_Form can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  const C& coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  const C& inhomogeneous_term() const;
+
+  //! Negates all the coefficients of \p *this.
+  void negate();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Linear_Form& y);
+
+  // Floating point analysis related methods.
+
+  /*! \brief
+    Verifies if the linear form overflows.
+
+    \return
+    Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+    <CODE>true</CODE> otherwise.
+
+    \p T must be the type of possibly unbounded quantities.
+  */
+  bool overflows() const;
+
+  /*! \brief
+    Computes the relative error associated to floating point computations
+    that operate on a quantity that is overapproximated by \p *this.
+
+    \param analyzed_format The floating point format used by the analyzed
+    program.
+    \param result Becomes the linear form corresponding to the relative
+    error committed.
+
+    This method makes <CODE>result</CODE> become a linear form
+    obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+    on the linear form. This function is defined as:
+    \f[
+    \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+    \defeq
+    (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+    +
+    \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+    \amifp
+    [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+    \f]
+    where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+    \f$\beta\f$ the base.
+
+    The result is undefined if \p T is not the type of an interval with
+    floating point boundaries.
+  */
+  void relative_error(Floating_Point_Format analyzed_format,
+                      Linear_Form& result) const;
+
+  /*! \brief
+    Makes \p result become an interval that overapproximates all the
+    possible values of \p *this.
+
+    \param oracle The FP_Oracle to be queried.
+    \param result The linear form that will store the result.
+
+    \return <CODE>true</CODE> if the operation was successful,
+    <CODE>false</CODE> otherwise (the possibility of failure
+    depends on the oracle's implementation).
+
+    \par Template type parameters
+
+    - The class template parameter \p Target specifies the implementation
+    of Concrete_Expression to be used.
+
+    This method makes <CODE>result</CODE> become
+    \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+    \f[
+    \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+    \defeq
+    i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+    \rho^{\#}(v)\right)
+    \f]
+    where \f$\rho^{\#}(v)\f$ is an interval (provided by the oracle)
+    that correctly approximates the value of \f$v\f$.
+
+    The result is undefined if \p C is not the type of an interval with
+    floating point boundaries.
+  */
+  template <typename Target>
+  bool intervalize(const FP_Oracle<Target,C>& oracle, C& result) const;
+
+private:
+  //! The generic coefficient equal to the singleton zero.
+  static C zero;
+
+  //! Type of the container vector.
+  typedef std::vector<C> vec_type;
+
+  //! The container vector.
+  vec_type vec;
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Form(const C& n).
+  */
+  Linear_Form(dimension_type sz, bool);
+
+  /*! \brief
+    Builds the linear form corresponding to the difference of
+    \p v and \p w.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p v or the one of \p w exceed
+    <CODE>Linear_Form::max_space_dimension()</CODE>.
+  */
+  Linear_Form(Variable v, Variable w);
+
+  //! Gives the number of generic coefficients currently in use.
+  dimension_type size() const;
+
+  //! Extends the vector of \p *this to size \p sz.
+  void extend(dimension_type sz);
+
+  //! Returns a reference to \p vec[i].
+  C& operator[](dimension_type i);
+
+  //! Returns a const reference to \p vec[i].
+  const C& operator[](dimension_type i) const;
+
+  friend Linear_Form<C>
+  operator+<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>
+  operator+<C>(const C& n, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator+<C>(const Linear_Form<C>& f, const C& n);
+  friend Linear_Form<C>
+  operator+<C>(Variable v, const Linear_Form<C>& f);
+
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f);
+
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>
+  operator-<C>(const C& n, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f, const C& n);
+  friend Linear_Form<C>
+  operator-<C>(Variable v, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f, Variable v);
+
+  friend Linear_Form<C>
+  operator*<C>(const C& n, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator*<C>(const Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator+=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>&
+  operator+=<C>(Linear_Form<C>& f, Variable v);
+  friend Linear_Form<C>&
+  operator+=<C>(Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator-=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>&
+  operator-=<C>(Linear_Form<C>& f, Variable v);
+  friend Linear_Form<C>&
+  operator-=<C>(Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator*=<C>(Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator/=<C>(Linear_Form<C>& f, const C& n);
+
+  friend bool
+  operator==<C>(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<C>(std::ostream& s, const Linear_Form<C>& f);
+};
+
+#include "Linear_Form_inlines.hh"
+// Linear_Form_templates.hh is not included here on purpose.
+
+#endif // !defined(PPL_Linear_Form_defs_hh)
diff --git a/src/Linear_Form_inlines.hh b/src/Linear_Form_inlines.hh
new file mode 100644
index 0000000..2ab24b1
--- /dev/null
+++ b/src/Linear_Form_inlines.hh
@@ -0,0 +1,252 @@
+/* Linear_Form class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Form_inlines_hh
+#define PPL_Linear_Form_inlines_hh 1
+
+#include "Variable_defs.hh"
+#include <iostream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::max_space_dimension() {
+  return vec_type().max_size() - 1;
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form()
+  : vec(1, zero) {
+  vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(dimension_type sz, bool)
+  : vec(sz, zero) {
+  vec.reserve(compute_capacity(sz, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const Linear_Form& f)
+  : vec(f.vec) {
+}
+
+template <typename C>
+inline
+Linear_Form<C>::~Linear_Form() {
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::size() const {
+  return vec.size();
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::extend(dimension_type sz) {
+  assert(sz > size());
+  vec.reserve(compute_capacity(sz, vec_type().max_size()));
+  vec.resize(sz, zero);
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const C& n)
+  : vec(1, n) {
+  vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::space_dimension() const {
+  return size() - 1;
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return zero;
+  return vec[v.id()+1];
+}
+
+template <typename C>
+inline C&
+Linear_Form<C>::operator[](dimension_type i) {
+  assert(i < size());
+  return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::operator[](dimension_type i) const {
+  assert(i < size());
+  return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::inhomogeneous_term() const {
+  return vec[0];
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f) {
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n) {
+  return n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const Variable v) {
+  return v + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n) {
+  return -n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Variable v, const Variable w) {
+  return Linear_Form<C>(v, w);
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n) {
+  return n * f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n) {
+  f[0] += n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n) {
+  f[0] -= n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+  return !(x == y);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::m_swap(Linear_Form& y) {
+  using std::swap;
+  swap(vec, y.vec);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::ascii_dump(std::ostream& s) const {
+  using namespace IO_Operators;
+  dimension_type space_dim = space_dimension();
+  s << space_dim << "\n";
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    const char separator = ' ';
+    s << vec[i] << separator;
+  }
+  s << "\n";
+}
+
+template <typename C>
+inline bool
+Linear_Form<C>::ascii_load(std::istream& s) {
+  using namespace IO_Operators;
+  dimension_type new_dim;
+  if (!(s >> new_dim))
+    return false;
+
+  vec.resize(new_dim + 1, zero);
+  for (dimension_type i = 0; i <= new_dim; ++i) {
+    if (!(s >> vec[i]))
+      return false;
+  }
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+inline bool
+Linear_Form<C>::overflows() const {
+  if (!inhomogeneous_term().is_bounded())
+    return true;
+
+  for (dimension_type i = space_dimension(); i-- > 0; ) {
+    if (!coefficient(Variable(i)).is_bounded())
+      return true;
+  }
+
+  return false;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline void
+swap(Linear_Form<C>& x, Linear_Form<C>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Form_inlines_hh)
diff --git a/src/Linear_Form_templates.hh b/src/Linear_Form_templates.hh
new file mode 100644
index 0000000..724b89f
--- /dev/null
+++ b/src/Linear_Form_templates.hh
@@ -0,0 +1,527 @@
+/* Linear_Form class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_Form_templates_hh
+#define PPL_Linear_Form_templates_hh 1
+
+#include "Linear_Form_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Box_defs.hh"
+#include <stdexcept>
+#include <iostream>
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v)
+  : vec() {
+  const dimension_type space_dim = v.space_dimension();
+  if (space_dim > max_space_dimension())
+    throw std::length_error("Linear_Form<C>::"
+                            "Linear_Form(v):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+  vec.resize(space_dim+1, zero);
+  vec[v.space_dimension()] = C(typename C::boundary_type(1));
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v, const Variable w)
+  : vec() {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > max_space_dimension())
+    throw std::length_error("Linear_Form<C>::"
+                            "Linear_Form(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+  vec.resize(space_dim+1, zero);
+  if (v_space_dim != w_space_dim) {
+    vec[v_space_dim] = C(typename C::boundary_type(1));
+    vec[w_space_dim] = C(typename C::boundary_type(-1));
+  }
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Linear_Expression& e)
+  : vec() {
+  const dimension_type space_dim = e.space_dimension();
+  if (space_dim > max_space_dimension())
+    throw std::length_error("Linear_Form<C>::"
+                            "Linear_Form(e):\n"
+                            "e exceeds the maximum allowed "
+                            "space dimension.");
+  vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+  vec.resize(space_dim+1);
+  for (dimension_type i = space_dim; i-- > 0; )
+    vec[i+1] = e.coefficient(Variable(i));
+  vec[0] = e.inhomogeneous_term();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  dimension_type min_size;
+  dimension_type max_size;
+  const Linear_Form<C>* p_e_max;
+  if (f1_size > f2_size) {
+    min_size = f2_size;
+    max_size = f1_size;
+    p_e_max = &f1;
+  }
+  else {
+    min_size = f1_size;
+    max_size = f2_size;
+    p_e_max = &f2;
+  }
+
+  Linear_Form<C> r(max_size, false);
+  dimension_type i = max_size;
+  while (i > min_size) {
+    --i;
+    r[i] = p_e_max->vec[i];
+  }
+  while (i > 0) {
+    --i;
+    r[i] = f1[i];
+    r[i] += f2[i];
+  }
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Variable v, const Linear_Form<C>& f) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form "
+                            "operator+(v, f):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  Linear_Form<C> r(f);
+  if (v_space_dim > f.space_dimension())
+    r.extend(v_space_dim+1);
+  r[v_space_dim] += C(typename C::boundary_type(1));
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  r[0] += n;
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i].neg_assign(r[i]);
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  if (f1_size > f2_size) {
+    Linear_Form<C> r(f1_size, false);
+    dimension_type i = f1_size;
+    while (i > f2_size) {
+      --i;
+      r[i] = f1[i];
+    }
+    while (i > 0) {
+      --i;
+      r[i] = f1[i];
+      r[i] -= f2[i];
+    }
+    return r;
+  }
+  else {
+    Linear_Form<C> r(f2_size, false);
+    dimension_type i = f2_size;
+    while (i > f1_size) {
+      --i;
+      r[i].neg_assign(f2[i]);
+    }
+    while (i > 0) {
+      --i;
+      r[i] = f1[i];
+      r[i] -= f2[i];
+    }
+    return r;
+  }
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Variable v, const Linear_Form<C>& f) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form "
+                            "operator-(v, e):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  Linear_Form<C> r(f);
+  if (v_space_dim > f.space_dimension())
+    r.extend(v_space_dim+1);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i].neg_assign(r[i]);
+  r[v_space_dim] += C(typename C::boundary_type(1));
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form "
+                            "operator-(e, v):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  Linear_Form<C> r(f);
+  if (v_space_dim > f.space_dimension())
+    r.extend(v_space_dim+1);
+  r[v_space_dim] -= C(typename C::boundary_type(1));
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i].neg_assign(r[i]);
+  r[0] += n;
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i] *= n;
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  if (f1_size < f2_size)
+    f1.extend(f2_size);
+  for (dimension_type i = f2_size; i-- > 0; )
+    f1[i] += f2[i];
+  return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form<C>& "
+                            "operator+=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (v_space_dim > f.space_dimension())
+    f.extend(v_space_dim+1);
+  f[v_space_dim] += C(typename C::boundary_type(1));
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  if (f1_size < f2_size)
+    f1.extend(f2_size);
+  for (dimension_type i = f2_size; i-- > 0; )
+    f1[i] -= f2[i];
+  return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form<C>& "
+                            "operator-=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (v_space_dim > f.space_dimension())
+    f.extend(v_space_dim+1);
+  f[v_space_dim] -= C(typename C::boundary_type(1));
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n) {
+  dimension_type f_size = f.size();
+  for (dimension_type i = f_size; i-- > 0; )
+    f[i] *= n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n) {
+  dimension_type f_size = f.size();
+  for (dimension_type i = f_size; i-- > 0; )
+    f[i] /= n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+  const dimension_type x_size = x.size();
+  const dimension_type y_size = y.size();
+  if (x_size >= y_size) {
+    for (dimension_type i = y_size; i-- > 0; )
+      if (x[i] != y[i])
+        return false;
+
+    for (dimension_type i = x_size; --i >= y_size; )
+      if (x[i] != x.zero)
+        return false;
+
+  }
+  else {
+    for (dimension_type i = x_size; i-- > 0; )
+      if (x[i] != y[i])
+        return false;
+
+    for (dimension_type i = y_size; --i >= x_size; )
+      if (y[i] != x.zero)
+        return false;
+
+  }
+
+  return true;
+}
+
+template <typename C>
+void
+Linear_Form<C>::negate() {
+  for (dimension_type i = vec.size(); i-- > 0; )
+    vec[i].neg_assign(vec[i]);
+  return;
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += vec[i].external_memory_in_bytes();
+  n += vec.capacity()*sizeof(C);
+  return n;
+}
+
+template <typename C>
+bool
+Linear_Form<C>::OK() const {
+  for (dimension_type i = size(); i-- > 0; )
+    if (!vec[i].OK())
+      return false;
+  return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+void
+Linear_Form<C>::relative_error(
+                const Floating_Point_Format analyzed_format,
+                Linear_Form& result) const {
+  typedef typename C::boundary_type analyzer_format;
+
+  // Get the necessary information on the analyzed's format.
+  unsigned int f_base;
+  unsigned int f_mantissa_bits;
+  switch (analyzed_format) {
+    case IEEE754_HALF:
+      f_base = float_ieee754_half::BASE;
+      f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+      break;
+    case IEEE754_SINGLE:
+      f_base = float_ieee754_single::BASE;
+      f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+      break;
+    case IEEE754_DOUBLE:
+      f_base = float_ieee754_double::BASE;
+      f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+      break;
+    case IBM_SINGLE:
+      f_base = float_ibm_single::BASE;
+      f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+      break;
+    case IEEE754_QUAD:
+      f_base = float_ieee754_quad::BASE;
+      f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+      break;
+    case INTEL_DOUBLE_EXTENDED:
+      f_base = float_intel_double_extended::BASE;
+      f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+  }
+
+  C error_propagator;
+  // We assume that f_base is a power of 2.
+  unsigned int u_power = msb_position(f_base) * f_mantissa_bits;
+  int neg_power = -static_cast<int>(u_power);
+  analyzer_format lb = static_cast<analyzer_format>(ldexp(1.0, neg_power));
+
+  error_propagator.build(i_constraint(GREATER_OR_EQUAL, -lb),
+                         i_constraint(LESS_OR_EQUAL, lb));
+
+  // Handle the inhomogeneous term.
+  const C* current_term = &inhomogeneous_term();
+  assert(current_term->is_bounded());
+
+  C current_multiplier(std::max(std::abs(current_term->lower()),
+                                std::abs(current_term->upper())));
+  Linear_Form current_result_term(current_multiplier);
+  current_result_term *= error_propagator;
+  result = Linear_Form(current_result_term);
+
+  // Handle the other terms.
+  dimension_type dimension = space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    current_term = &coefficient(Variable(i));
+    assert(current_term->is_bounded());
+    current_multiplier = C(std::max(std::abs(current_term->lower()),
+                                    std::abs(current_term->upper())));
+    current_result_term = Linear_Form(Variable(i));
+    current_result_term *= current_multiplier;
+    current_result_term *= error_propagator;
+    result += current_result_term;
+  }
+
+  return;
+}
+
+template <typename C>
+template <typename Target>
+bool
+Linear_Form<C>::intervalize(const FP_Oracle<Target,C>& oracle,
+                            C& result) const {
+  result = C(inhomogeneous_term());
+  dimension_type dimension = space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    C current_addend = coefficient(Variable(i));
+    C curr_int;
+    if (!oracle.get_interval(i, curr_int))
+      return false;
+    current_addend *= curr_int;
+    result += current_addend;
+  }
+
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Linear_Form<C>& f) {
+  const dimension_type num_variables = f.space_dimension();
+  bool first = true;
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    const C& fv = f[v+1];
+    if (fv != typename C::boundary_type(0)) {
+      if (first) {
+        if (fv == typename C::boundary_type(-1))
+          s << "-";
+        else if (fv != typename C::boundary_type(1))
+          s << fv << "*";
+        first = false;
+      }
+      else {
+        if (fv == typename C::boundary_type(-1))
+          s << " - ";
+        else {
+          s << " + ";
+          if (fv != typename C::boundary_type(1))
+            s << fv << "*";
+        }
+      }
+      s << Variable(v);
+    }
+  }
+  // Inhomogeneous term.
+  const C& it = f[0];
+  if (it != 0) {
+    if (!first)
+        s << " + ";
+    else
+      first = false;
+    s << it;
+  }
+
+  if (first)
+    // The null linear form.
+    s << Linear_Form<C>::zero;
+  return s;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(C, Linear_Form<C>)
+
+template <typename C>
+C Linear_Form<C>::zero(typename C::boundary_type(0));
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Form_templates_hh)
diff --git a/src/Linear_Form_types.hh b/src/Linear_Form_types.hh
new file mode 100644
index 0000000..97a1282
--- /dev/null
+++ b/src/Linear_Form_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_Form_types_hh
+#define PPL_Linear_Form_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+class Linear_Form;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Form_types_hh)
diff --git a/src/Linear_System_defs.hh b/src/Linear_System_defs.hh
new file mode 100644
index 0000000..e2d5168
--- /dev/null
+++ b/src/Linear_System_defs.hh
@@ -0,0 +1,582 @@
+/* Linear_System class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_System_defs_hh
+#define PPL_Linear_System_defs_hh 1
+
+#include "Linear_System_types.hh"
+
+#include "Swapping_Vector_defs.hh"
+#include "globals_defs.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_defs.hh"
+
+#include "Polyhedron_types.hh"
+#include "Bit_Row_types.hh"
+#include "Bit_Matrix_types.hh"
+#include "Generator_System_types.hh"
+#include "Topology_types.hh"
+
+// TODO: Check how much of this description is still true.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents either a constraint system
+  or a generator system. Each Linear_System object can be viewed
+  as a finite sequence of strong-normalized Row objects,
+  where each Row implements a constraint or a generator.
+  Linear systems are characterized by the matrix of coefficients,
+  also encoding the number, size and capacity of Row objects,
+  as well as a few additional information, including:
+   - the topological kind of (all) the rows;
+   - an indication of whether or not some of the rows in the Linear_System
+     are <EM>pending</EM>, meaning that they still have to undergo
+     an (unspecified) elaboration; if there are pending rows, then these
+     form a proper suffix of the overall sequence of rows;
+   - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+     non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_System {
+public:
+
+  // NOTE: `iterator' is actually a const_iterator.
+  typedef typename Swapping_Vector<Row>::const_iterator iterator;
+  typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+  //! Builds an empty linear system with specified topology.
+  /*!
+    Rows size and capacity are initialized to \f$0\f$.
+  */
+  Linear_System(Topology topol, Representation r);
+
+  //! Builds a system with specified topology and dimensions.
+  /*!
+    \param topol
+    The topology of the system that will be created;
+
+    \param space_dim
+    The number of space dimensions of the system that will be created.
+
+    \param r
+    The representation for system's rows.
+
+    Creates a \p n_rows \f$\times\f$ \p space_dim system whose
+    coefficients are all zero and with the given topology.
+  */
+  Linear_System(Topology topol, dimension_type space_dim, Representation r);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A tag class.
+  /*! \ingroup PPL_CXX_interface
+    Tag class to differentiate the Linear_System copy constructor that
+    copies pending rows as pending from the one that transforms
+    pending rows into non-pending ones.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct With_Pending {
+  };
+
+  //! Copy constructor: pending rows are transformed into non-pending ones.
+  Linear_System(const Linear_System& y);
+
+  //! Copy constructor with specified representation. Pending rows are
+  //! transformed into non-pending ones.
+  Linear_System(const Linear_System& y, Representation r);
+
+  //! Full copy constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, With_Pending);
+
+  //! Full copy constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, Representation r, With_Pending);
+
+  //! Assignment operator: pending rows are transformed into non-pending ones.
+  Linear_System& operator=(const Linear_System& y);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Linear_System& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Linear_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Linear_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the rows in the system.
+  /*!
+    The computation of the space dimension correctly ignores
+    the column encoding the inhomogeneous terms of constraint
+    (resp., the divisors of generators);
+    if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+    also the column of the \f$\epsilon\f$-dimension coefficients
+    will be ignored.
+  */
+  dimension_type space_dimension() const;
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+  */
+  void remove_row(dimension_type i, bool keep_sorted = false);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(num_rows()).
+
+    Otherwise, this method just swaps the rows with the last ones and then
+    removes them, so it costs O(last - first).
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                  bool keep_sorted = false);
+
+  // TODO: Consider removing this.
+  //! Removes the specified rows. The row ordering of remaining rows is
+  //! preserved.
+  /*!
+    \param indexes specifies a list of row indexes.
+                   It must be sorted.
+  */
+  void remove_rows(const std::vector<dimension_type>& indexes);
+
+  // TODO: Consider making this private.
+  //! Removes all the specified dimensions from the system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  // TODO: Consider making this private.
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a const reference to the \p k-th row of the system.
+  const Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  iterator begin();
+  iterator end();
+  const_iterator begin() const;
+  const_iterator end() const;
+
+  bool has_no_rows() const;
+  dimension_type num_rows() const;
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  //! Sign-normalizes the system.
+  void sign_normalize();
+
+  //! \name Accessors
+  //@{
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+  //@} // Accessors
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  //! Sets the system topology to \p t .
+  void set_topology(Topology t);
+
+  //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+  void set_necessarily_closed();
+
+  //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  void set_not_necessarily_closed();
+
+  // TODO: Consider removing this, or making it private.
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  // TODO: Consider removing this, or making it private.
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Adds \p n rows and space dimensions to the system.
+  /*!
+    \param n
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_universe_rows_and_space_dimensions(dimension_type n);
+
+  /*! \brief
+    Adds a copy of \p r to the system,
+    automatically resizing the system or the row's copy, if needed.
+  */
+  void insert(const Row& r);
+
+  /*! \brief
+    Adds a copy of the given row to the pending part of the system,
+    automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(const Row& r);
+
+  /*! \brief
+    Adds \p r to the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+  */
+  void insert(Row& r, Recycle_Input);
+
+  /*! \brief
+    Adds the given row to the pending part of the system, stealing its
+    contents and automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(Row& r, Recycle_Input);
+
+  //! Adds to \p *this a copy of  the rows of \p y.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(const Linear_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void insert_pending(const Linear_System& r);
+
+  //! Adds to \p *this a the rows of `y', stealing them from `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(Linear_System& r, Recycle_Input);
+
+  //! Adds the rows of `y' to the pending part of `*this', stealing them from
+  //! `y'.
+  void insert_pending(Linear_System& r, Recycle_Input);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Sorts the rows (in growing order) form \p first_row to
+    \p last_row and eliminates duplicated ones.
+  */
+  void sort_rows(dimension_type first_row, dimension_type last_row);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Linear_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most space dimensions.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as to
+    simplify the linear system.
+  */
+  void simplify();
+
+  //! Clears the system deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Reads into a Linear_System object the information produced by the
+    output of ascii_dump(std::ostream&) const.  The specialized methods
+    provided by Constraint_System and Generator_System take care of
+    properly reading the contents of the system.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! The vector that contains the rows.
+  /*!
+    \note This is public for convenience. Clients that modify if must preserve
+          the class invariant.
+  */
+  Swapping_Vector<Row> rows;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void remove_row_no_ok(dimension_type i, bool keep_sorted = false);
+
+  /*! \brief
+    Adds \p r to the pending part of the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void insert_pending_no_ok(Row& r, Recycle_Input);
+
+  /*! \brief
+    Adds \p r to the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void insert_no_ok(Row& r, Recycle_Input);
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  //! Swaps the [first,last) row interval with the
+  //! [first + offset, last + offset) interval.
+  /*!
+    These intervals may not be disjunct.
+
+    Sorting of these intervals is *not* preserved.
+
+    Either both intervals contain only not-pending rows, or they both
+    contain pending rows.
+  */
+  void swap_row_intervals(dimension_type first, dimension_type last,
+                          dimension_type offset);
+
+  //! The space dimension of each row. All rows must have this number of
+  //! space dimensions.
+  dimension_type space_dimension_;
+
+  //! The topological kind of the rows in the system. All rows must have this
+  //! topology.
+  Topology row_topology;
+
+  //! The index of the first pending row.
+  dimension_type index_first_pending;
+
+  /*! \brief
+    <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+    <CODE>bool compare(const Row&, const Row&)</CODE>.
+    If <CODE>false</CODE> may not be sorted.
+  */
+  bool sorted;
+
+  Representation representation_;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  struct Row_Less_Than {
+    bool operator()(const Row& x, const Row& y) const;
+  };
+
+  //! Comparison predicate (used when implementing the unique algorithm).
+  struct Unique_Compare {
+    Unique_Compare(const Swapping_Vector<Row>& cont,
+                   dimension_type base = 0);
+
+    bool operator()(dimension_type i, dimension_type j) const;
+
+    const Swapping_Vector<Row>& container;
+    const dimension_type base_index;
+  };
+
+  friend class Polyhedron;
+  friend class Generator_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Parma_Polyhedra_Library::Linear_System<Row>& x,
+          Parma_Polyhedra_Library::Linear_System<Row>& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Linear_System_inlines.hh"
+#include "Linear_System_templates.hh"
+
+#endif // !defined(PPL_Linear_System_defs_hh)
diff --git a/src/Linear_System_inlines.hh b/src/Linear_System_inlines.hh
new file mode 100644
index 0000000..a2aedba
--- /dev/null
+++ b/src/Linear_System_inlines.hh
@@ -0,0 +1,698 @@
+/* Linear_System class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_System_inlines_hh
+#define PPL_Linear_System_inlines_hh 1
+
+#include "Bit_Row_defs.hh"
+#include "Coefficient_defs.hh"
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::external_memory_in_bytes() const {
+  return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_sorted() const {
+  // The flag `sorted' does not really reflect the sortedness status
+  // of a system (if `sorted' evaluates to `false' nothing is known).
+  // This assertion is used to ensure that the system
+  // is actually sorted when `sorted' value is 'true'.
+  PPL_ASSERT(!sorted || check_sorted());
+  return sorted;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_sorted(const bool b) {
+  sorted = b;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol, Representation r)
+  : rows(),
+    space_dimension_(0),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true),
+    representation_(r) {
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol,
+                                  dimension_type space_dim,
+                                  Representation r)
+  : rows(),
+    space_dimension_(0),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true),
+    representation_(r) {
+  set_space_dimension(space_dim);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::first_pending_row() const {
+  return index_first_pending;
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_pending_rows() const {
+  PPL_ASSERT(num_rows() >= first_pending_row());
+  return num_rows() - first_pending_row();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::unset_pending_rows() {
+  index_first_pending = num_rows();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_index_first_pending_row(const dimension_type i) {
+  index_first_pending = i;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y)
+  : rows(y.rows),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    representation_(y.representation_) {
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  unset_pending_rows();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r)
+  : rows(),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    representation_(r) {
+  rows.resize(y.num_rows());
+  for (dimension_type i = 0; i < y.num_rows(); ++i) {
+    // Create the copies with the right representation.
+    Row row(y.rows[i], r);
+    swap(rows[i], row);
+  }
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  unset_pending_rows();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, With_Pending)
+  : rows(y.rows),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted),
+    representation_(y.representation_) {
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r,
+                                  With_Pending)
+  : rows(),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted),
+    representation_(r) {
+  rows.resize(y.num_rows());
+  for (dimension_type i = 0; i < y.num_rows(); ++i) {
+    // Create the copies with the right representation.
+    Row row(y.rows[i], r);
+    swap(rows[i], row);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Linear_System<Row>&
+Linear_System<Row>::operator=(const Linear_System& y) {
+  // NOTE: Pending rows are transformed into non-pending ones.
+  Linear_System<Row> tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::assign_with_pending(const Linear_System& y) {
+  Linear_System<Row> tmp(y, With_Pending());
+  swap(*this, tmp);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::m_swap(Linear_System& y) {
+  using std::swap;
+  swap(rows, y.rows);
+  swap(space_dimension_, y.space_dimension_);
+  swap(row_topology, y.row_topology);
+  swap(index_first_pending, y.index_first_pending);
+  swap(sorted, y.sorted);
+  swap(representation_, y.representation_);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(y.OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::clear() {
+  // Note: do NOT modify the value of `row_topology' and `representation'.
+  rows.clear();
+  index_first_pending = 0;
+  sorted = true;
+  space_dimension_ = 0;
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_necessarily_closed() {
+  PPL_ASSERT(topology() == NOT_NECESSARILY_CLOSED);
+  row_topology = NECESSARILY_CLOSED;
+  ++space_dimension_;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].mark_as_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_not_necessarily_closed() {
+  PPL_ASSERT(topology() == NECESSARILY_CLOSED);
+  PPL_ASSERT(space_dimension() > 0);
+  row_topology = NOT_NECESSARILY_CLOSED;
+  --space_dimension_;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].mark_as_not_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_topology(Topology t) {
+  if (topology() == t)
+    return;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].set_topology(t);
+  row_topology = t;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_necessarily_closed() const {
+  return row_topology == NECESSARILY_CLOSED;
+}
+
+template <typename Row>
+inline const Row&
+Linear_System<Row>::operator[](const dimension_type k) const {
+  return rows[k];
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::begin() {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::end() {
+  return rows.end();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::begin() const {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::end() const {
+  return rows.end();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::has_no_rows() const {
+  return rows.empty();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_rows() const {
+  return rows.size();
+}
+
+template <typename Row>
+inline Topology
+Linear_System<Row>::topology() const {
+  return row_topology;
+}
+
+template <typename Row>
+inline Representation
+Linear_System<Row>::representation() const {
+  return representation_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_representation(Representation r) {
+  representation_ = r;
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].set_representation(r);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::max_space_dimension() {
+  return Row::max_space_dimension();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::space_dimension() const {
+  return space_dimension_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension_no_ok(dimension_type space_dim) {
+  for (dimension_type i = rows.size(); i-- > 0; )
+    rows[i].set_space_dimension_no_ok(space_dim);
+  space_dimension_ = space_dim;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension(dimension_type space_dim) {
+  set_space_dimension_no_ok(space_dim);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row_no_ok(const dimension_type i,
+                                     const bool keep_sorted) {
+  PPL_ASSERT(i < num_rows());
+  const bool was_pending = (i >= index_first_pending);
+
+  if (sorted && keep_sorted && !was_pending) {
+    for (dimension_type j = i + 1; j < rows.size(); ++j)
+      swap(rows[j], rows[j-1]);
+    rows.pop_back();
+  }
+  else {
+    if (!was_pending)
+      sorted = false;
+    const bool last_row_is_pending = (num_rows() - 1 >= index_first_pending);
+    if (was_pending == last_row_is_pending)
+      // Either both rows are pending or both rows are not pending.
+      swap(rows[i], rows.back());
+    else {
+      // Pending rows are stored after the non-pending ones.
+      PPL_ASSERT(!was_pending);
+      PPL_ASSERT(last_row_is_pending);
+
+      // Swap the row with the last non-pending row.
+      swap(rows[i], rows[index_first_pending - 1]);
+
+      // Now the (non-pending) row that has to be deleted is between the
+      // non-pending and the pending rows.
+      swap(rows[i], rows.back());
+    }
+    rows.pop_back();
+  }
+  if (!was_pending)
+    // A non-pending row has been removed.
+    --index_first_pending;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row(const dimension_type i, bool keep_sorted) {
+  remove_row_no_ok(i, keep_sorted);
+  PPL_ASSERT(OK());
+}
+
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(dimension_type first,
+                                dimension_type last,
+                                bool keep_sorted) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= num_rows());
+  const dimension_type n = last - first;
+
+  if (n == 0)
+    return;
+
+  // All the rows that have to be removed must have the same (pending or
+  // non-pending) status.
+  PPL_ASSERT(first >= index_first_pending || last <= index_first_pending);
+
+  const bool were_pending = (first >= index_first_pending);
+
+  // Move the rows in [first,last) at the end of the system.
+  if (sorted && keep_sorted && !were_pending) {
+    // Preserve the row ordering.
+    for (dimension_type i = last; i < rows.size(); ++i)
+      swap(rows[i], rows[i - n]);
+
+    rows.resize(rows.size() - n);
+
+    // `n' non-pending rows have been removed.
+    index_first_pending -= n;
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // We can ignore the row ordering, but we must not mix pending and
+  // non-pending rows.
+
+  const dimension_type offset = rows.size() - n - first;
+  // We want to swap the rows in [first, last) and
+  // [first + offset, last + offset) (note that these intervals may not be
+  // disjunct).
+
+  if (index_first_pending == num_rows()) {
+    // There are no pending rows.
+    PPL_ASSERT(!were_pending);
+
+    swap_row_intervals(first, last, offset);
+
+    rows.resize(rows.size() - n);
+
+    // `n' non-pending rows have been removed.
+    index_first_pending -= n;
+  }
+  else {
+    // There are some pending rows in [first + offset, last + offset).
+    if (were_pending) {
+      // Both intervals contain only pending rows, because the second
+      // interval is after the first.
+
+      swap_row_intervals(first, last, offset);
+
+      rows.resize(rows.size() - n);
+
+      // `n' non-pending rows have been removed.
+      index_first_pending -= n;
+    }
+    else {
+      PPL_ASSERT(rows.size() - n < index_first_pending);
+      PPL_ASSERT(rows.size() > index_first_pending);
+      PPL_ASSERT(!were_pending);
+      // In the [size() - n, size()) interval there are some non-pending
+      // rows and some pending ones. Be careful not to mix them.
+
+      PPL_ASSERT(index_first_pending >= last);
+      swap_row_intervals(first, last, index_first_pending - last);
+
+      // Mark the rows that must be deleted as pending.
+      index_first_pending -= n;
+      first = index_first_pending;
+      last = first + n;
+
+      // Move them at the end of the system.
+      swap_row_intervals(first, last, num_rows() - last);
+
+      // Actually remove the rows.
+      rows.resize(rows.size() - n);
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::swap_row_intervals(dimension_type first,
+                                       dimension_type last,
+                                       dimension_type offset) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last + offset <= num_rows());
+#ifndef NDEBUG
+  if (first < last) {
+    bool first_interval_has_pending_rows = (last > index_first_pending);
+    bool second_interval_has_pending_rows = (last + offset > index_first_pending);
+    bool first_interval_has_not_pending_rows = (first < index_first_pending);
+    bool second_interval_has_not_pending_rows = (first + offset < index_first_pending);
+    PPL_ASSERT(first_interval_has_not_pending_rows
+               == !first_interval_has_pending_rows);
+    PPL_ASSERT(second_interval_has_not_pending_rows
+               == !second_interval_has_pending_rows);
+    PPL_ASSERT(first_interval_has_pending_rows
+               == second_interval_has_pending_rows);
+  }
+#endif
+  if (first + offset < last) {
+    // The intervals are not disjunct, make them so.
+    const dimension_type k = last - first - offset;
+    last -= k;
+    offset += k;
+  }
+
+  if (first == last)
+    // Nothing to do.
+    return;
+
+  for (dimension_type i = first; i < last; ++i)
+    swap(rows[i], rows[i + offset]);
+
+  if (first < index_first_pending)
+    // The swaps involved not pending rows, so they may not be sorted anymore.
+    set_sorted(false);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(const std::vector<dimension_type>& indexes) {
+#ifndef NDEBUG
+  {
+    // Check that `indexes' is sorted.
+    std::vector<dimension_type> sorted_indexes = indexes;
+    std::sort(sorted_indexes.begin(), sorted_indexes.end());
+    PPL_ASSERT(indexes == sorted_indexes);
+
+    // Check that the last index (if any) is lower than num_rows().
+    // This guarantees that all indexes are in [0, num_rows()).
+    if (!indexes.empty())
+      PPL_ASSERT(indexes.back() < num_rows());
+  }
+#endif
+
+  if (indexes.empty())
+    return;
+
+  const dimension_type rows_size = rows.size();
+  typedef std::vector<dimension_type>::const_iterator itr_t;
+
+  // `i' and last_unused_row' start with the value `indexes[0]' instead
+  // of `0', because the loop would just increment `last_unused_row' in the
+  // preceding iterations.
+  dimension_type last_unused_row = indexes[0];
+  dimension_type i = indexes[0];
+  itr_t itr = indexes.begin();
+  itr_t itr_end = indexes.end();
+  while (itr != itr_end) {
+    // i <= *itr < rows_size
+    PPL_ASSERT(i < rows_size);
+    if (*itr == i) {
+      // The current row has to be removed, don't increment last_unused_row.
+      ++itr;
+    }
+    else {
+      // The current row must not be removed, swap it after the last used row.
+      swap(rows[last_unused_row], rows[i]);
+      ++last_unused_row;
+    }
+    ++i;
+  }
+
+  // Move up the remaining rows, if any.
+  for ( ; i < rows_size; ++i) {
+    swap(rows[last_unused_row], rows[i]);
+    ++last_unused_row;
+  }
+
+  PPL_ASSERT(last_unused_row == num_rows() - indexes.size());
+
+  // The rows that have to be removed are now at the end of the system, just
+  // remove them.
+  rows.resize(last_unused_row);
+
+  // Adjust index_first_pending.
+  if (indexes[0] >= index_first_pending) {
+    // Removing pending rows only.
+  }
+  else {
+    if (indexes.back() < index_first_pending) {
+      // Removing non-pending rows only.
+      index_first_pending -= indexes.size();
+    }
+    else {
+      // Removing some pending and some non-pending rows, count the
+      // non-pending rows that must be removed.
+      // This exploits the fact that `indexes' is sorted by using binary
+      // search.
+      itr_t j = std::lower_bound(indexes.begin(), indexes.end(),
+                                 index_first_pending);
+      std::iterator_traits<itr_t>::difference_type
+        non_pending = j - indexes.begin();
+      index_first_pending -= static_cast<dimension_type>(non_pending);
+    }
+  }
+
+  // NOTE: This method does *not* call set_sorted(false), because it preserves
+  // the relative row ordering.
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_trailing_rows(const dimension_type n) {
+  PPL_ASSERT(rows.size() >= n);
+  rows.resize(rows.size() - n);
+  if (first_pending_row() > rows.size())
+    index_first_pending = rows.size();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].permute_space_dimensions(cycle);
+  sorted = false;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::swap_space_dimensions(Variable v1, Variable v2) {
+  PPL_ASSERT(v1.space_dimension() <= space_dimension());
+  PPL_ASSERT(v2.space_dimension() <= space_dimension());
+  for (dimension_type k = num_rows(); k-- > 0; )
+    rows[k].swap_space_dimensions(v1, v2);
+  sorted = false;
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline bool
+operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+  return !(x == y);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Row_Less_Than::operator()(const Row& x,
+                                              const Row& y) const {
+  return compare(x, y) < 0;
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Unique_Compare
+::Unique_Compare(const Swapping_Vector<Row>& cont,
+                 dimension_type base)
+  : container(cont), base_index(base) {
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Unique_Compare
+::operator()(dimension_type i, dimension_type j) const {
+  return container[base_index + i].is_equal_to(container[base_index + j]);
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline void
+swap(Linear_System<Row>& x, Linear_System<Row>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_inlines_hh)
diff --git a/src/Linear_System_templates.hh b/src/Linear_System_templates.hh
new file mode 100644
index 0000000..dd28e87
--- /dev/null
+++ b/src/Linear_System_templates.hh
@@ -0,0 +1,930 @@
+/* Linear_System class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Linear_System_templates_hh
+#define PPL_Linear_System_templates_hh 1
+
+#include "Bit_Matrix_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <deque>
+
+#include "swapping_sort_templates.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::num_lines_or_equalities() const {
+  PPL_ASSERT(num_pending_rows() == 0);
+  const Linear_System& x = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    if (x[i].is_line_or_equality())
+      ++n;
+  return n;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::merge_rows_assign(const Linear_System& y) {
+  PPL_ASSERT(space_dimension() >= y.space_dimension());
+  // Both systems have to be sorted and have no pending rows.
+  PPL_ASSERT(check_sorted() && y.check_sorted());
+  PPL_ASSERT(num_pending_rows() == 0 && y.num_pending_rows() == 0);
+
+  Linear_System& x = *this;
+
+  // A temporary vector...
+  Swapping_Vector<Row> tmp;
+  // ... with enough capacity not to require any reallocations.
+  tmp.reserve(compute_capacity(x.rows.size() + y.rows.size(),
+                               tmp.max_num_rows()));
+
+  dimension_type xi = 0;
+  const dimension_type x_num_rows = x.num_rows();
+  dimension_type yi = 0;
+  const dimension_type y_num_rows = y.num_rows();
+
+  while (xi < x_num_rows && yi < y_num_rows) {
+    const int comp = compare(x[xi], y[yi]);
+    if (comp <= 0) {
+      // Elements that can be taken from `x' are actually _stolen_ from `x'
+      tmp.resize(tmp.size() + 1);
+      swap(tmp.back(), x.rows[xi++]);
+      tmp.back().set_representation(representation());
+      if (comp == 0)
+        // A duplicate element.
+        ++yi;
+    }
+    else {
+      // (comp > 0)
+      tmp.resize(tmp.size() + 1);
+      Row copy(y[yi++], space_dimension(), representation());
+      swap(tmp.back(), copy);
+    }
+  }
+  // Insert what is left.
+  if (xi < x_num_rows)
+    while (xi < x_num_rows) {
+      tmp.resize(tmp.size() + 1);
+      swap(tmp.back(), x.rows[xi++]);
+      tmp.back().set_representation(representation());
+    }
+  else
+    while (yi < y_num_rows) {
+      tmp.resize(tmp.size() + 1);
+      Row copy(y[yi++], space_dimension(), representation());
+      swap(tmp.back(), copy);
+    }
+
+  // We get the result matrix and let the old one be destroyed.
+  swap(tmp, rows);
+  // There are no pending rows.
+  unset_pending_rows();
+  PPL_ASSERT(check_sorted());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::ascii_dump(std::ostream& s) const {
+  // Prints the topology, the number of rows, the number of columns
+  // and the sorted flag.  The specialized methods provided by
+  // Constraint_System and Generator_System take care of properly
+  // printing the contents of the system.
+  s << "topology " << (is_necessarily_closed()
+                       ? "NECESSARILY_CLOSED"
+                       : "NOT_NECESSARILY_CLOSED")
+    << "\n"
+    << num_rows() << " x " << space_dimension() << " ";
+  Parma_Polyhedra_Library::ascii_dump(s, representation());
+  s << " " << (sorted ? "(sorted)" : "(not_sorted)")
+    << "\n"
+    << "index_first_pending " << first_pending_row()
+    << "\n";
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Linear_System<Row>)
+
+template <typename Row>
+bool
+Linear_System<Row>::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "topology")
+    return false;
+  if (!(s >> str))
+    return false;
+
+  clear();
+
+  Topology t;
+  if (str == "NECESSARILY_CLOSED")
+    t = NECESSARILY_CLOSED;
+  else {
+    if (str != "NOT_NECESSARILY_CLOSED")
+      return false;
+    t = NOT_NECESSARILY_CLOSED;
+  }
+
+  set_topology(t);
+
+  dimension_type nrows;
+  dimension_type space_dims;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str) || str != "x")
+    return false;
+  if (!(s >> space_dims))
+    return false;
+
+  space_dimension_ = space_dims;
+
+  if (!Parma_Polyhedra_Library::ascii_load(s, representation_))
+    return false;
+
+  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+    return false;
+  const bool sortedness = (str == "(sorted)");
+  dimension_type index;
+  if (!(s >> str) || str != "index_first_pending")
+    return false;
+  if (!(s >> index))
+    return false;
+
+  Row row;
+  for (dimension_type i = 0; i < nrows; ++i) {
+    if (!row.ascii_load(s))
+      return false;
+    insert(row, Recycle_Input());
+  }
+  index_first_pending = index;
+  sorted = sortedness;
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Row& r) {
+  Row tmp(r, representation());
+  insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Row& r, Recycle_Input) {
+  insert_no_ok(r, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_no_ok(Row& r, Recycle_Input) {
+  PPL_ASSERT(topology() == r.topology());
+  // This method is only used when the system has no pending rows.
+  PPL_ASSERT(num_pending_rows() == 0);
+
+  const bool was_sorted = is_sorted();
+
+  insert_pending_no_ok(r, Recycle_Input());
+
+  if (was_sorted) {
+    const dimension_type nrows = num_rows();
+    // The added row may have caused the system to be not sorted anymore.
+    if (nrows > 1) {
+      // If the system is not empty and the inserted row is the
+      // greatest one, the system is set to be sorted.
+      // If it is not the greatest one then the system is no longer sorted.
+      sorted = (compare(rows[nrows-2], rows[nrows-1]) <= 0);
+    }
+    else
+      // A system having only one row is sorted.
+      sorted = true;
+  }
+
+  unset_pending_rows();
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending_no_ok(Row& r, Recycle_Input) {
+  // TODO: A Grid_Generator_System may contain non-normalized lines that
+  // represent parameters, so this check is disabled. Consider re-enabling it
+  // when it's possibile.
+#if 0
+  // The added row must be strongly normalized and have the same
+  // number of elements as the existing rows of the system.
+  PPL_ASSERT(r.check_strong_normalized());
+#endif
+
+  PPL_ASSERT(r.topology() == topology());
+
+  r.set_representation(representation());
+
+  if (space_dimension() < r.space_dimension())
+    set_space_dimension_no_ok(r.space_dimension());
+  else
+    r.set_space_dimension_no_ok(space_dimension());
+
+  rows.resize(rows.size() + 1);
+  swap(rows.back(), r);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Row& r) {
+  Row tmp(r, representation());
+  insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Row& r, Recycle_Input) {
+  insert_pending_no_ok(r, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Linear_System& y) {
+  Linear_System tmp(y, representation(), With_Pending());
+  insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Linear_System& y, Recycle_Input) {
+  Linear_System& x = *this;
+  PPL_ASSERT(x.space_dimension() == y.space_dimension());
+
+  // Steal the rows of `y'.
+  // This loop must use an increasing index (instead of a decreasing one) to
+  // preserve the row ordering.
+  for (dimension_type i = 0; i < y.num_rows(); ++i)
+    x.insert_pending(y.rows[i], Recycle_Input());
+
+  y.clear();
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Linear_System& y) {
+  Linear_System tmp(y, representation(), With_Pending());
+  insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Linear_System& y, Recycle_Input) {
+  PPL_ASSERT(num_pending_rows() == 0);
+
+  // Adding no rows is a no-op.
+  if (y.has_no_rows())
+    return;
+
+  // Check if sortedness is preserved.
+  if (is_sorted()) {
+    if (!y.is_sorted() || y.num_pending_rows() > 0)
+      sorted = false;
+    else {
+      // `y' is sorted and has no pending rows.
+      const dimension_type n_rows = num_rows();
+      if (n_rows > 0)
+        sorted = (compare(rows[n_rows-1], y[0]) <= 0);
+    }
+  }
+
+  // Add the rows of `y' as if they were pending.
+  insert_pending(y, Recycle_Input());
+
+  // TODO: May y have pending rows? Should they remain pending?
+
+  // There are no pending_rows.
+  unset_pending_rows();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::remove_space_dimensions(const Variables_Set& vars) {
+  // Dimension-compatibility assertion.
+  PPL_ASSERT(space_dimension() >= vars.space_dimension());
+
+  // The removal of no dimensions from any system is a no-op.  This
+  // case also captures the only legal removal of dimensions from a
+  // 0-dim system.
+  if (vars.empty())
+    return;
+
+  // NOTE: num_rows() is *not* constant, because it may be decreased by
+  // remove_row_no_ok().
+  for (dimension_type i = 0; i < num_rows(); ) {
+    const bool valid = rows[i].remove_space_dimensions(vars);
+    if (!valid) {
+      // Remove the current row.
+      // We can't call remove_row(i) here, because the system is not OK as
+      // some rows already have the new space dimension and others still have
+      // the old one.
+      remove_row_no_ok(i, false);
+    }
+    else
+      ++i;
+  }
+
+  space_dimension_ -= vars.size();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::shift_space_dimensions(Variable v, dimension_type n) {
+  // NOTE: v.id() may be equal to the space dimension of the system
+  // (when no space dimension need to be shifted).
+  PPL_ASSERT(v.id() <= space_dimension());
+  for (dimension_type i = rows.size(); i-- > 0; )
+    rows[i].shift_space_dimensions(v, n);
+  space_dimension_ += n;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows() {
+  // We sort the non-pending rows only.
+  sort_rows(0, first_pending_row());
+  sorted = true;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows(const dimension_type first_row,
+                              const dimension_type last_row) {
+  PPL_ASSERT(first_row <= last_row && last_row <= num_rows());
+  // We cannot mix pending and non-pending rows.
+  PPL_ASSERT(first_row >= first_pending_row()
+             || last_row <= first_pending_row());
+
+  const bool sorting_pending = (first_row >= first_pending_row());
+  const dimension_type old_num_pending = num_pending_rows();
+
+  const dimension_type num_elems = last_row - first_row;
+  if (num_elems < 2)
+    return;
+
+  // Build the function objects implementing indirect sort comparison,
+  // indirect unique comparison and indirect swap operation.
+  using namespace Implementation;
+  typedef Swapping_Vector<Row> Cont;
+  typedef Indirect_Sort_Compare<Cont, Row_Less_Than> Sort_Compare;
+  typedef Indirect_Swapper<Cont> Swapper;
+  const dimension_type num_duplicates
+    = indirect_sort_and_unique(num_elems,
+                               Sort_Compare(rows, first_row),
+                               Unique_Compare(rows, first_row),
+                               Swapper(rows, first_row));
+
+  if (num_duplicates > 0) {
+    typedef typename Cont::iterator Iter;
+    typedef typename std::iterator_traits<Iter>::difference_type diff_t;
+    Iter last = rows.begin() + static_cast<diff_t>(last_row);
+    Iter first = last - + static_cast<diff_t>(num_duplicates);
+    rows.erase(first, last);
+  }
+
+  if (sorting_pending) {
+    PPL_ASSERT(old_num_pending >= num_duplicates);
+    index_first_pending = num_rows() - (old_num_pending - num_duplicates);
+  }
+  else {
+    index_first_pending = num_rows() - old_num_pending;
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::strong_normalize() {
+  const dimension_type nrows = rows.size();
+  // We strongly normalize also the pending rows.
+  for (dimension_type i = nrows; i-- > 0; )
+    rows[i].strong_normalize();
+  sorted = (nrows <= 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sign_normalize() {
+  const dimension_type nrows = rows.size();
+  // We sign-normalize also the pending rows.
+  for (dimension_type i = nrows; i-- > 0; )
+    rows[i].sign_normalize();
+  sorted = (nrows <= 1);
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+template <typename Row>
+bool
+operator==(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+  if (x.space_dimension() != y.space_dimension())
+    return false;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type y_num_rows = y.num_rows();
+  if (x_num_rows != y_num_rows)
+    return false;
+  if (x.first_pending_row() != y.first_pending_row())
+    return false;
+  // TODO: Check if the following comment is up to date.
+  // Notice that calling operator==(const Swapping_Vector<Row>&,
+  //                                const Swapping_Vector<Row>&)
+  // would be wrong here, as equality of the type fields would
+  // not be checked.
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_and_remove_with_sat(Bit_Matrix& sat) {
+  // We can only sort the non-pending part of the system.
+  PPL_ASSERT(first_pending_row() == sat.num_rows());
+  if (first_pending_row() <= 1) {
+    set_sorted(true);
+    return;
+  }
+
+  const dimension_type num_elems = sat.num_rows();
+  // Build the function objects implementing indirect sort comparison,
+  // indirect unique comparison and indirect swap operation.
+  typedef Swapping_Vector<Row> Cont;
+  const Implementation::Indirect_Sort_Compare<Cont, Row_Less_Than>
+    sort_cmp(rows);
+  const Unique_Compare unique_cmp(rows);
+  const Implementation::Indirect_Swapper2<Cont, Bit_Matrix> swapper(rows, sat);
+
+  const dimension_type num_duplicates
+    = Implementation::indirect_sort_and_unique(num_elems, sort_cmp,
+                                               unique_cmp, swapper);
+
+  const dimension_type new_first_pending_row
+    = first_pending_row() - num_duplicates;
+
+  if (num_pending_rows() > 0) {
+    // In this case, we must put the duplicates after the pending rows.
+    const dimension_type n_rows = num_rows() - 1;
+    for (dimension_type i = 0; i < num_duplicates; ++i)
+      swap(rows[new_first_pending_row + i], rows[n_rows - i]);
+  }
+
+  // Erasing the duplicated rows...
+  rows.resize(rows.size() - num_duplicates);
+  index_first_pending = new_first_pending_row;
+  // ... and the corresponding rows of the saturation matrix.
+  sat.remove_trailing_rows(num_duplicates);
+
+  // Now the system is sorted.
+  sorted = true;
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::gauss(const dimension_type n_lines_or_equalities) {
+  // This method is only applied to a linear system having no pending rows and
+  // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+  // before the rays or points or inequalities.
+  PPL_ASSERT(num_pending_rows() == 0);
+  PPL_ASSERT(n_lines_or_equalities == num_lines_or_equalities());
+#ifndef NDEBUG
+  for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+    PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+  dimension_type rank = 0;
+  // Will keep track of the variations on the system of equalities.
+  bool changed = false;
+  // TODO: Don't use the number of columns.
+  const dimension_type num_cols
+    = is_necessarily_closed() ? space_dimension() + 1 : space_dimension() + 2;
+  // TODO: Consider exploiting the row (possible) sparseness of rows in the
+  // following loop, if needed. It would probably make it more cache-efficient
+  // for dense rows, too.
+  for (dimension_type j = num_cols; j-- > 0; )
+    for (dimension_type i = rank; i < n_lines_or_equalities; ++i) {
+      // Search for the first row having a non-zero coefficient
+      // (the pivot) in the j-th column.
+      if ((*this)[i].expr.get(j) == 0)
+        continue;
+      // Pivot found: if needed, swap rows so that this one becomes
+      // the rank-th row in the linear system.
+      if (i > rank) {
+        swap(rows[i], rows[rank]);
+        // After swapping the system is no longer sorted.
+        changed = true;
+      }
+      // Combine the row containing the pivot with all the lines or
+      // equalities following it, so that all the elements on the j-th
+      // column in these rows become 0.
+      for (dimension_type k = i + 1; k < n_lines_or_equalities; ++k) {
+        if (rows[k].expr.get(Variable(j - 1)) != 0) {
+          rows[k].linear_combine(rows[rank], j);
+          changed = true;
+        }
+      }
+      // Already dealt with the rank-th row.
+      ++rank;
+      // Consider another column index `j'.
+      break;
+    }
+  if (changed)
+    sorted = false;
+
+  PPL_ASSERT(OK());
+  return rank;
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::back_substitute(const dimension_type n_lines_or_equalities) {
+  // This method is only applied to a system having no pending rows and
+  // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+  // before the first ray or point or inequality.
+  PPL_ASSERT(num_pending_rows() == 0);
+  PPL_ASSERT(n_lines_or_equalities <= num_lines_or_equalities());
+#ifndef NDEBUG
+  for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+    PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+  const dimension_type nrows = num_rows();
+  // Trying to keep sortedness.
+  bool still_sorted = is_sorted();
+  // This deque of Booleans will be used to flag those rows that,
+  // before exiting, need to be re-checked for sortedness.
+  std::deque<bool> check_for_sortedness;
+  if (still_sorted)
+    check_for_sortedness.insert(check_for_sortedness.end(), nrows, false);
+
+  for (dimension_type k = n_lines_or_equalities; k-- > 0; ) {
+    // For each line or equality, starting from the last one,
+    // looks for the last non-zero element.
+    // `j' will be the index of such a element.
+    Row& row_k = rows[k];
+    const dimension_type j = row_k.expr.last_nonzero();
+    // TODO: Check this.
+    PPL_ASSERT(j != 0);
+
+    // Go through the equalities above `row_k'.
+    for (dimension_type i = k; i-- > 0; ) {
+      Row& row_i = rows[i];
+      if (row_i.expr.get(Variable(j - 1)) != 0) {
+        // Combine linearly `row_i' with `row_k'
+        // so that `row_i[j]' becomes zero.
+        row_i.linear_combine(row_k, j);
+        if (still_sorted) {
+          // Trying to keep sortedness: remember which rows
+          // have to be re-checked for sortedness at the end.
+          if (i > 0)
+            check_for_sortedness[i-1] = true;
+          check_for_sortedness[i] = true;
+        }
+      }
+    }
+
+    // Due to strong normalization during previous iterations,
+    // the pivot coefficient `row_k[j]' may now be negative.
+    // Since an inequality (or ray or point) cannot be multiplied
+    // by a negative factor, the coefficient of the pivot must be
+    // forced to be positive.
+    const bool have_to_negate = (row_k.expr.get(Variable(j - 1)) < 0);
+    if (have_to_negate)
+      neg_assign(row_k.expr);
+
+    // NOTE: Here row_k will *not* be ok if we have negated it.
+
+    // Note: we do not mark index `k' in `check_for_sortedness',
+    // because we will later negate back the row.
+
+    // Go through all the other rows of the system.
+    for (dimension_type i = n_lines_or_equalities; i < nrows; ++i) {
+      Row& row_i = rows[i];
+      if (row_i.expr.get(Variable(j - 1)) != 0) {
+        // Combine linearly the `row_i' with `row_k'
+        // so that `row_i[j]' becomes zero.
+        row_i.linear_combine(row_k, j);
+        if (still_sorted) {
+          // Trying to keep sortedness: remember which rows
+          // have to be re-checked for sortedness at the end.
+          if (i > n_lines_or_equalities)
+            check_for_sortedness[i-1] = true;
+          check_for_sortedness[i] = true;
+        }
+      }
+    }
+    if (have_to_negate)
+      // Negate `row_k' to restore strong-normalization.
+      neg_assign(row_k.expr);
+
+    PPL_ASSERT(row_k.OK());
+  }
+
+  // Trying to keep sortedness.
+  for (dimension_type i = 0; still_sorted && i+1 < nrows; ++i)
+    if (check_for_sortedness[i])
+      // Have to check sortedness of `(*this)[i]' with respect to `(*this)[i+1]'.
+      still_sorted = (compare((*this)[i], (*this)[i+1]) <= 0);
+
+  // Set the sortedness flag.
+  sorted = still_sorted;
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::simplify() {
+  // This method is only applied to a system having no pending rows.
+  PPL_ASSERT(num_pending_rows() == 0);
+
+  // Partially sort the linear system so that all lines/equalities come first.
+  const dimension_type old_nrows = num_rows();
+  dimension_type nrows = old_nrows;
+  dimension_type n_lines_or_equalities = 0;
+  for (dimension_type i = 0; i < nrows; ++i)
+    if ((*this)[i].is_line_or_equality()) {
+      if (n_lines_or_equalities < i) {
+        swap(rows[i], rows[n_lines_or_equalities]);
+        // The system was not sorted.
+        PPL_ASSERT(!sorted);
+      }
+      ++n_lines_or_equalities;
+    }
+  // Apply Gaussian elimination to the subsystem of lines/equalities.
+  const dimension_type rank = gauss(n_lines_or_equalities);
+  // Eliminate any redundant line/equality that has been detected.
+  if (rank < n_lines_or_equalities) {
+    const dimension_type
+      n_rays_or_points_or_inequalities = nrows - n_lines_or_equalities;
+    const dimension_type
+      num_swaps = std::min(n_lines_or_equalities - rank,
+                           n_rays_or_points_or_inequalities);
+    for (dimension_type i = num_swaps; i-- > 0; )
+      swap(rows[--nrows], rows[rank + i]);
+    remove_trailing_rows(old_nrows - nrows);
+    if (n_rays_or_points_or_inequalities > num_swaps)
+      set_sorted(false);
+    unset_pending_rows();
+    n_lines_or_equalities = rank;
+  }
+  // Apply back-substitution to the system of rays/points/inequalities.
+  back_substitute(n_lines_or_equalities);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::add_universe_rows_and_space_dimensions(const dimension_type n) {
+  PPL_ASSERT(n > 0);
+  const bool was_sorted = is_sorted();
+  const dimension_type old_n_rows = num_rows();
+  const dimension_type old_space_dim
+    = is_necessarily_closed() ? space_dimension() : space_dimension() + 1;
+  set_space_dimension(space_dimension() + n);
+  rows.resize(rows.size() + n);
+  // The old system is moved to the bottom.
+  for (dimension_type i = old_n_rows; i-- > 0; )
+    swap(rows[i], rows[i + n]);
+  for (dimension_type i = n, c = old_space_dim; i-- > 0; ) {
+    // The top right-hand sub-system (i.e., the system made of new
+    // rows and columns) is set to the specular image of the identity
+    // matrix.
+    if (Variable(c).space_dimension() <= space_dimension()) {
+      // Variable(c) is a user variable.
+      Linear_Expression le(representation());
+      le.set_space_dimension(space_dimension());
+      le += Variable(c);
+      Row r(le, Row::LINE_OR_EQUALITY, row_topology);
+      swap(r, rows[i]);
+    }
+    else {
+      // Variable(c) is the epsilon dimension.
+      PPL_ASSERT(row_topology == NOT_NECESSARILY_CLOSED);
+      Linear_Expression le(Variable(c), representation());
+      Row r(le, Row::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+      r.mark_as_not_necessarily_closed();
+      swap(r, rows[i]);
+      // Note: `r' is strongly normalized.
+    }
+    ++c;
+  }
+  // If the old system was empty, the last row added is either
+  // a positivity constraint or a point.
+  if (was_sorted)
+    sorted = (compare(rows[n-1], rows[n]) <= 0);
+
+  // If the system is not necessarily closed, move the epsilon coefficients to
+  // the last column.
+  if (!is_necessarily_closed()) {
+    // Try to preserve sortedness of `gen_sys'.
+    PPL_ASSERT(old_space_dim != 0);
+    if (!is_sorted()) {
+      for (dimension_type i = n; i-- > 0; ) {
+        rows[i].expr.swap_space_dimensions(Variable(old_space_dim - 1),
+                                           Variable(old_space_dim - 1 + n));
+        PPL_ASSERT(rows[i].OK());
+      }
+    }
+    else {
+      dimension_type old_eps_index = old_space_dim - 1;
+      // The upper-right corner of `rows' contains the J matrix:
+      // swap coefficients to preserve sortedness.
+      for (dimension_type i = n; i-- > 0; ++old_eps_index) {
+        rows[i].expr.swap_space_dimensions(Variable(old_eps_index),
+                                           Variable(old_eps_index + 1));
+        PPL_ASSERT(rows[i].OK());
+      }
+
+      sorted = true;
+    }
+  }
+  // NOTE: this already checks for OK().
+  set_index_first_pending_row(index_first_pending + n);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_pending_and_remove_duplicates() {
+  PPL_ASSERT(num_pending_rows() > 0);
+  PPL_ASSERT(is_sorted());
+
+  // The non-pending part of the system is already sorted.
+  // Now sorting the pending part..
+  const dimension_type first_pending = first_pending_row();
+  sort_rows(first_pending, num_rows());
+  // Recompute the number of rows, because we may have removed
+  // some rows occurring more than once in the pending part.
+  const dimension_type old_num_rows = num_rows();
+  dimension_type num_rows = old_num_rows;
+
+  dimension_type k1 = 0;
+  dimension_type k2 = first_pending;
+  dimension_type num_duplicates = 0;
+  // In order to erase them, put at the end of the system
+  // those pending rows that also occur in the non-pending part.
+  while (k1 < first_pending && k2 < num_rows) {
+    const int cmp = compare(rows[k1], rows[k2]);
+    if (cmp == 0) {
+      // We found the same row.
+      ++num_duplicates;
+      --num_rows;
+      // By initial sortedness, we can increment index `k1'.
+      ++k1;
+      // Do not increment `k2'; instead, swap there the next pending row.
+      if (k2 < num_rows)
+        swap(rows[k2], rows[k2 + num_duplicates]);
+    }
+    else if (cmp < 0)
+      // By initial sortedness, we can increment `k1'.
+      ++k1;
+    else {
+      // Here `cmp > 0'.
+      // Increment `k2' and, if we already found any duplicate,
+      // swap the next pending row in position `k2'.
+      ++k2;
+      if (num_duplicates > 0 && k2 < num_rows)
+        swap(rows[k2], rows[k2 + num_duplicates]);
+    }
+  }
+  // If needed, swap any duplicates found past the pending rows
+  // that has not been considered yet; then erase the duplicates.
+  if (num_duplicates > 0) {
+    if (k2 < num_rows)
+      for (++k2; k2 < num_rows; ++k2)
+        swap(rows[k2], rows[k2 + num_duplicates]);
+    rows.resize(num_rows);
+  }
+  sorted = true;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::check_sorted() const {
+  for (dimension_type i = first_pending_row(); i-- > 1; )
+    if (compare(rows[i], rows[i-1]) < 0)
+      return false;
+  return true;
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  for (dimension_type i = rows.size(); i-- > 0; ) {
+    if (rows[i].representation() != representation()) {
+#ifndef NDEBUG
+      cerr << "Linear_System has a row with the wrong representation!"
+           << endl;
+#endif
+      return false;
+    }
+    if (rows[i].space_dimension() != space_dimension()) {
+#ifndef NDEBUG
+      cerr << "Linear_System has a row with the wrong number of space dimensions!"
+           << endl;
+#endif
+      return false;
+    }
+  }
+
+  for (dimension_type i = rows.size(); i-- > 0; )
+    if (rows[i].topology() != topology()) {
+#ifndef NDEBUG
+      cerr << "Linear_System has a row with the wrong topology!"
+           << endl;
+#endif
+      return false;
+    }
+
+  // `index_first_pending' must be less than or equal to `num_rows()'.
+  if (first_pending_row() > num_rows()) {
+#ifndef NDEBUG
+    cerr << "Linear_System has a negative number of pending rows!"
+         << endl;
+#endif
+    return false;
+  }
+
+  // Check for topology mismatches.
+  const dimension_type n_rows = num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i)
+    if (topology() != rows[i].topology()) {
+#ifndef NDEBUG
+      cerr << "Topology mismatch between the system "
+           << "and one of its rows!"
+           << endl;
+#endif
+      return false;
+    }
+
+  if (sorted && !check_sorted()) {
+#ifndef NDEBUG
+    cerr << "The system declares itself to be sorted but it is not!"
+         << endl;
+#endif
+    return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_templates_hh)
diff --git a/src/Linear_System_types.hh b/src/Linear_System_types.hh
new file mode 100644
index 0000000..7a8355c
--- /dev/null
+++ b/src/Linear_System_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Linear_System_types_hh
+#define PPL_Linear_System_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_System;
+
+template <typename Row>
+class Linear_System_With_Bit_Matrix_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_types_hh)
diff --git a/src/MIP_Problem.cc b/src/MIP_Problem.cc
new file mode 100644
index 0000000..251f106
--- /dev/null
+++ b/src/MIP_Problem.cc
@@ -0,0 +1,2739 @@
+/* MIP_Problem class implementation: non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "MIP_Problem_defs.hh"
+#include "globals_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "math_utilities_defs.hh"
+
+#include <stdexcept>
+#include <deque>
+#include <vector>
+#include <algorithm>
+#include <cmath>
+
+// TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+// These are needed for the linear_combine() method that takes a Dense_Row and
+// a Sparse_Row.
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+#endif // PPL_USE_SPARSE_MATRIX
+
+#ifndef PPL_NOISY_SIMPLEX
+#define PPL_NOISY_SIMPLEX 0
+#endif
+
+#ifndef PPL_SIMPLEX_USE_MIP_HEURISTIC
+#define PPL_SIMPLEX_USE_MIP_HEURISTIC 1
+#endif
+
+#if PPL_NOISY_SIMPLEX
+#include <iostream>
+#endif
+
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_NOISY_SIMPLEX
+namespace {
+
+unsigned long num_iterations = 0;
+
+unsigned mip_recursion_level = 0;
+
+} // namespace
+#endif // PPL_NOISY_SIMPLEX
+
+PPL::MIP_Problem::MIP_Problem(const dimension_type dim)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    pricing(PRICING_STEEPEST_EDGE_FLOAT),
+    initialized(false),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(0),
+    input_obj_function(),
+    opt_mode(MAXIMIZATION),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::MIP_Problem(dim, cs, obj, "
+                            "mode):\n"
+                            "dim exceeds the maximum allowed "
+                            "space dimension.");
+  PPL_ASSERT(OK());
+}
+
+PPL::MIP_Problem::MIP_Problem(const dimension_type dim,
+                              const Constraint_System& cs,
+                              const Linear_Expression& obj,
+                              const Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    pricing(PRICING_STEEPEST_EDGE_FLOAT),
+    initialized(false),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::MIP_Problem(dim, cs, obj, "
+                            "mode):\n"
+                            "dim exceeds the maximum allowed"
+                            "space dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, cs, obj,"
+      << " mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds dim == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraint system.
+  if (cs.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, cs, obj, mode):\n"
+      << "cs.space_dimension == " << cs.space_dimension()
+      << " exceeds dim == " << dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  if (cs.has_strict_inequalities())
+    throw std::invalid_argument("PPL::MIP_Problem::"
+                                "MIP_Problem(d, cs, obj, m):\n"
+                                "cs contains strict inequalities.");
+  // Actually copy the constraints.
+  for (Constraint_System::const_iterator
+         i = cs.begin(), i_end = cs.end(); i != i_end; ++i)
+    add_constraint_helper(*i);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem::add_constraint(const Constraint& c) {
+  if (space_dimension() < c.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::add_constraint(c):\n"
+      << "c.space_dimension() == "<< c.space_dimension() << " exceeds "
+         "this->space_dimension == " << space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  if (c.is_strict_inequality())
+    throw std::invalid_argument("PPL::MIP_Problem::add_constraint(c):\n"
+                                "c is a strict inequality.");
+  add_constraint_helper(c);
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem::add_constraints(const Constraint_System& cs) {
+  if (space_dimension() < cs.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::add_constraints(cs):\n"
+      << "cs.space_dimension() == " << cs.space_dimension()
+      << " exceeds this->space_dimension() == " << this->space_dimension()
+      << ".";
+    throw std::invalid_argument(s.str());
+  }
+  if (cs.has_strict_inequalities())
+    throw std::invalid_argument("PPL::MIP_Problem::add_constraints(cs):\n"
+                                "cs contains strict inequalities.");
+  for (Constraint_System::const_iterator
+         i = cs.begin(), i_end = cs.end(); i != i_end; ++i)
+    add_constraint_helper(*i);
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem::set_objective_function(const Linear_Expression& obj) {
+  if (space_dimension() < obj.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::set_objective_function(obj):\n"
+      << "obj.space_dimension() == " << obj.space_dimension()
+      << " exceeds this->space_dimension == " << space_dimension()
+      << ".";
+    throw std::invalid_argument(s.str());
+  }
+  input_obj_function = obj;
+  if (status == UNBOUNDED || status == OPTIMIZED)
+    status = SATISFIABLE;
+  PPL_ASSERT(OK());
+}
+
+const PPL::Generator&
+PPL::MIP_Problem::feasible_point() const {
+  if (is_satisfiable())
+    return last_generator;
+  else
+    throw std::domain_error("PPL::MIP_Problem::feasible_point():\n"
+                            "*this is not satisfiable.");
+}
+
+const PPL::Generator&
+PPL::MIP_Problem::optimizing_point() const {
+  if (solve() == OPTIMIZED_MIP_PROBLEM)
+    return last_generator;
+  else
+    throw std::domain_error("PPL::MIP_Problem::optimizing_point():\n"
+                            "*this does not have an optimizing point.");
+}
+
+bool
+PPL::MIP_Problem::is_satisfiable() const {
+  // Check `status' to filter out trivial cases.
+  switch (status) {
+  case UNSATISFIABLE:
+    PPL_ASSERT(OK());
+    return false;
+  case SATISFIABLE:
+    // Intentionally fall through
+  case UNBOUNDED:
+    // Intentionally fall through.
+  case OPTIMIZED:
+    PPL_ASSERT(OK());
+    return true;
+  case PARTIALLY_SATISFIABLE:
+    {
+      MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+      // LP case.
+      if (x.i_variables.empty())
+        return x.is_lp_satisfiable();
+
+      // MIP case.
+      {
+        // Temporarily relax the MIP into an LP problem.
+        RAII_Temporary_Real_Relaxation relaxed(x);
+        Generator p = point();
+        relaxed.lp.is_lp_satisfiable();
+#if PPL_NOISY_SIMPLEX
+        mip_recursion_level = 0;
+#endif // PPL_NOISY_SIMPLEX
+        if (is_mip_satisfiable(relaxed.lp, relaxed.i_vars, p)) {
+          x.last_generator = p;
+          x.status = SATISFIABLE;
+        }
+        else
+          x.status = UNSATISFIABLE;
+      } // `relaxed' destroyed here: relaxation automatically reset.
+      return (x.status == SATISFIABLE);
+    }
+  }
+  // We should not be here!
+  PPL_UNREACHABLE;
+  return false;
+}
+
+PPL::MIP_Problem_Status
+PPL::MIP_Problem::solve() const{
+  switch (status) {
+  case UNSATISFIABLE:
+    PPL_ASSERT(OK());
+    return UNFEASIBLE_MIP_PROBLEM;
+  case UNBOUNDED:
+    PPL_ASSERT(OK());
+    return UNBOUNDED_MIP_PROBLEM;
+  case OPTIMIZED:
+    PPL_ASSERT(OK());
+    return OPTIMIZED_MIP_PROBLEM;
+  case SATISFIABLE:
+    // Intentionally fall through
+  case PARTIALLY_SATISFIABLE:
+    {
+      MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+      if (x.i_variables.empty()) {
+        // LP case.
+        if (x.is_lp_satisfiable()) {
+          x.second_phase();
+          if (x.status == UNBOUNDED)
+            return UNBOUNDED_MIP_PROBLEM;
+          else {
+            PPL_ASSERT(x.status == OPTIMIZED);
+            return OPTIMIZED_MIP_PROBLEM;
+          }
+        }
+        return UNFEASIBLE_MIP_PROBLEM;
+      }
+
+      // MIP case.
+      MIP_Problem_Status return_value;
+      Generator g = point();
+      {
+        // Temporarily relax the MIP into an LP problem.
+        RAII_Temporary_Real_Relaxation relaxed(x);
+        if (relaxed.lp.is_lp_satisfiable())
+          relaxed.lp.second_phase();
+        else {
+          x.status = UNSATISFIABLE;
+          // NOTE: `relaxed' destroyed: relaxation automatically reset.
+          return UNFEASIBLE_MIP_PROBLEM;
+        }
+        PPL_DIRTY_TEMP(mpq_class, incumbent_solution);
+        bool have_incumbent_solution = false;
+
+        MIP_Problem lp_copy(relaxed.lp, Inherit_Constraints());
+        PPL_ASSERT(lp_copy.integer_space_dimensions().empty());
+        return_value = solve_mip(have_incumbent_solution,
+                                 incumbent_solution, g,
+                                 lp_copy, relaxed.i_vars);
+      } // `relaxed' destroyed here: relaxation automatically reset.
+
+      switch (return_value) {
+      case UNFEASIBLE_MIP_PROBLEM:
+        x.status = UNSATISFIABLE;
+        break;
+      case UNBOUNDED_MIP_PROBLEM:
+        x.status = UNBOUNDED;
+        // A feasible point has been set in `solve_mip()', so that
+        // a call to `feasible_point' will be successful.
+        x.last_generator = g;
+        break;
+      case OPTIMIZED_MIP_PROBLEM:
+        x.status = OPTIMIZED;
+        // Set the internal generator.
+        x.last_generator = g;
+        break;
+      }
+      PPL_ASSERT(OK());
+      return return_value;
+    }
+  }
+  // We should not be here!
+  PPL_UNREACHABLE;
+  return UNFEASIBLE_MIP_PROBLEM;
+}
+
+void
+PPL::MIP_Problem::add_space_dimensions_and_embed(const dimension_type m) {
+  // The space dimension of the resulting MIP problem should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw std::length_error("PPL::MIP_Problem::"
+                            "add_space_dimensions_and_embed(m):\n"
+                            "adding m new space dimensions exceeds "
+                            "the maximum allowed space dimension.");
+  external_space_dim += m;
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem
+::add_to_integer_space_dimensions(const Variables_Set& i_vars) {
+  if (i_vars.space_dimension() > external_space_dim)
+    throw std::invalid_argument("PPL::MIP_Problem::"
+                                "add_to_integer_space_dimension(i_vars):\n"
+                                "*this and i_vars are dimension"
+                                "incompatible.");
+  const dimension_type original_size = i_variables.size();
+  i_variables.insert(i_vars.begin(), i_vars.end());
+  // If a new integral variable was inserted, set the internal status to
+  // PARTIALLY_SATISFIABLE.
+  if (i_variables.size() != original_size && status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+}
+
+bool
+PPL::MIP_Problem::is_in_base(const dimension_type var_index,
+                             dimension_type& row_index) const {
+  for (row_index = base.size(); row_index-- > 0; )
+    if (base[row_index] == var_index)
+      return true;
+  return false;
+}
+
+PPL::dimension_type
+PPL::MIP_Problem::merge_split_variable(dimension_type var_index) {
+  // Initialize the return value to a dummy index.
+  dimension_type unfeasible_tableau_row = not_a_dimension();
+
+  const dimension_type removing_column = mapping[1+var_index].second;
+
+  // Check if the negative part of the split variable is in base:
+  // if so, the corresponding row of the tableau becomes non-feasible.
+  {
+    dimension_type base_index;
+    if (is_in_base(removing_column, base_index)) {
+      // Set the return value.
+      unfeasible_tableau_row = base_index;
+      // Reset base[base_index] to zero to remember non-feasibility.
+      base[base_index] = 0;
+      // Since the negative part of the variable is in base,
+      // the positive part can not be in base too.
+      PPL_ASSERT(!is_in_base(mapping[1+var_index].first, base_index));
+    }
+  }
+
+  tableau.remove_column(removing_column);
+
+  // var_index is no longer split.
+  mapping[1+var_index].second = 0;
+
+  // Adjust data structures, `shifting' the proper columns to the left by 1.
+  const dimension_type base_size = base.size();
+  for (dimension_type i = base_size; i-- > 0; ) {
+    if (base[i] > removing_column)
+      --base[i];
+  }
+  const dimension_type mapping_size = mapping.size();
+  for (dimension_type i = mapping_size; i-- > 0; ) {
+    if (mapping[i].first > removing_column)
+      --mapping[i].first;
+    if (mapping[i].second > removing_column)
+      --mapping[i].second;
+  }
+
+  return unfeasible_tableau_row;
+}
+
+bool
+PPL::MIP_Problem::is_satisfied(const Constraint& c, const Generator& g) {
+  // Scalar_Products::sign() requires the second argument to be at least
+  // as large as the first one.
+  const int sp_sign
+    = (g.space_dimension() <= c.space_dimension())
+    ? Scalar_Products::sign(g, c)
+    : Scalar_Products::sign(c, g);
+  return c.is_inequality() ? (sp_sign >= 0) : (sp_sign == 0);
+}
+
+bool
+PPL::MIP_Problem::is_saturated(const Constraint& c, const Generator& g) {
+  // Scalar_Products::sign() requires the space dimension of the second
+  // argument to be at least as large as the one of the first one.
+  const int sp_sign
+    = (g.space_dimension() <= c.space_dimension())
+    ? Scalar_Products::sign(g, c)
+    : Scalar_Products::sign(c, g);
+  return sp_sign == 0;
+}
+
+bool
+PPL::MIP_Problem
+::parse_constraints(dimension_type& additional_tableau_rows,
+                    dimension_type& additional_slack_variables,
+                    std::deque<bool>& is_tableau_constraint,
+                    std::deque<bool>& is_satisfied_inequality,
+                    std::deque<bool>& is_nonnegative_variable,
+                    std::deque<bool>& is_remergeable_variable) const {
+  // Initially all containers are empty.
+  PPL_ASSERT(is_tableau_constraint.empty()
+             && is_satisfied_inequality.empty()
+             && is_nonnegative_variable.empty()
+             && is_remergeable_variable.empty());
+
+  const dimension_type cs_space_dim = external_space_dim;
+  const dimension_type cs_num_rows = input_cs.size();
+  const dimension_type cs_num_pending
+    = cs_num_rows - first_pending_constraint;
+
+  // Counters determining the change in dimensions of the tableau:
+  // initialized here, they will be updated while examining `input_cs'.
+  additional_tableau_rows = cs_num_pending;
+  additional_slack_variables = 0;
+
+  // Resize containers appropriately.
+
+  // On exit, `is_tableau_constraint[i]' will be true if and only if
+  // `input_cs[first_pending_constraint + i]' is neither a tautology
+  // (e.g., 1 >= 0) nor a non-negativity constraint (e.g., X >= 0).
+  is_tableau_constraint.insert(is_tableau_constraint.end(),
+                               cs_num_pending, true);
+
+  // On exit, `is_satisfied_inequality[i]' will be true if and only if
+  // `input_cs[first_pending_constraint + i]' is an inequality and it is
+  // satisfied by `last_generator'.
+  is_satisfied_inequality.insert(is_satisfied_inequality.end(),
+                                 cs_num_pending, false);
+
+  // On exit, `is_nonnegative_variable[j]' will be true if and only if
+  // Variable(j) is bound to be nonnegative in `input_cs'.
+  is_nonnegative_variable.insert(is_nonnegative_variable.end(),
+                                 cs_space_dim, false);
+
+  // On exit, `is_remergeable_variable[j]' will be true if and only if
+  // Variable(j) was initially split and is now remergeable.
+  is_remergeable_variable.insert(is_remergeable_variable.end(),
+                                 internal_space_dim, false);
+
+  // Check for variables that are already known to be nonnegative
+  // due to non-pending constraints.
+  const dimension_type mapping_size = mapping.size();
+  if (mapping_size > 0) {
+    // Note: mapping[0] is associated to the cost function.
+    for (dimension_type i = std::min(mapping_size - 1, cs_space_dim);
+         i-- > 0; )
+      if (mapping[i + 1].second == 0)
+        is_nonnegative_variable[i] = true;
+  }
+
+  // Process each pending constraint in `input_cs' and
+  //  - detect variables that are constrained to be nonnegative;
+  //  - detect (non-negativity or tautology) pending constraints that
+  //    will not be part of the tableau;
+  //  - count the number of new slack variables.
+  for (dimension_type i = cs_num_rows; i-- > first_pending_constraint; ) {
+    const Constraint& cs_i = *(input_cs[i]);
+    const dimension_type cs_i_end = cs_i.space_dimension() + 1;
+
+    const dimension_type nonzero_coeff_column_index
+      = cs_i.expression().first_nonzero(1, cs_i_end);
+    const bool found_a_nonzero_coeff = (nonzero_coeff_column_index != cs_i_end);
+    const bool found_many_nonzero_coeffs
+      = (found_a_nonzero_coeff
+         && !cs_i.expression().all_zeroes(nonzero_coeff_column_index + 1,
+                                               cs_i_end));
+
+    // If more than one coefficient is nonzero,
+    // continue with next constraint.
+    if (found_many_nonzero_coeffs) {
+      if (cs_i.is_inequality())
+        ++additional_slack_variables;
+      // CHECKME: Is it true that in the first phase we can apply
+      // `is_satisfied()' with the generator `point()'?  If so, the following
+      // code works even if we do not have a feasible point.
+      // Check for satisfiability of the inequality. This can be done if we
+      // have a feasible point of *this.
+      if (cs_i.is_inequality() && is_satisfied(cs_i, last_generator))
+        is_satisfied_inequality[i - first_pending_constraint] = true;
+      continue;
+    }
+
+    if (!found_a_nonzero_coeff) {
+      // All coefficients are 0.
+      // The constraint is either trivially true or trivially false.
+      if (cs_i.is_inequality()) {
+        if (cs_i.inhomogeneous_term() < 0)
+          // A constraint such as -1 >= 0 is trivially false.
+          return false;
+      }
+      else
+        // The constraint is an equality.
+        if (cs_i.inhomogeneous_term() != 0)
+          // A constraint such as 1 == 0 is trivially false.
+          return false;
+      // Here the constraint is trivially true.
+      is_tableau_constraint[i - first_pending_constraint] = false;
+      --additional_tableau_rows;
+      continue;
+    }
+    else {
+      // Here we have only one nonzero coefficient.
+      /*
+
+      We have the following methods:
+      A) Do split the variable and do add the constraint
+         in the tableau.
+      B) Do not split the variable and do add the constraint
+         in the tableau.
+      C) Do not split the variable and do not add the constraint
+         in the tableau.
+
+      Let the constraint be (a*v + b relsym 0).
+      These are the 12 possible combinations we can have:
+                a |  b | relsym | method
+      ----------------------------------
+      1)       >0 | >0 |   >=   |   A
+      2)       >0 | >0 |   ==   |   A
+      3)       <0 | <0 |   >=   |   A
+      4)       >0 | =0 |   ==   |   B
+      5)       >0 | <0 |   ==   |   B
+      Note:    <0 | >0 |   ==   | impossible by strong normalization
+      Note:    <0 | =0 |   ==   | impossible by strong normalization
+      Note:    <0 | <0 |   ==   | impossible by strong normalization
+      6)       >0 | <0 |   >=   |   B
+      7)       >0 | =0 |   >=   |   C
+      8)       <0 | >0 |   >=   |   A
+      9)       <0 | =0 |   >=   |   A
+
+      The next lines will apply the correct method to each case.
+      */
+
+      // The variable index is not equal to the column index.
+      const dimension_type nonzero_var_index = nonzero_coeff_column_index - 1;
+
+      const int sgn_a = sgn(cs_i.coefficient(Variable(nonzero_var_index)));
+      const int sgn_b = sgn(cs_i.inhomogeneous_term());
+
+      // Cases 1-3: apply method A.
+      if (sgn_a == sgn_b) {
+        if (cs_i.is_inequality())
+          ++additional_slack_variables;
+      }
+      // Cases 4-5: apply method B.
+      else if (cs_i.is_equality())
+        is_nonnegative_variable[nonzero_var_index] = true;
+      // Case 6: apply method B.
+      else if (sgn_b < 0) {
+        is_nonnegative_variable[nonzero_var_index] = true;
+        ++additional_slack_variables;
+      }
+      // Case 7: apply method C.
+      else if (sgn_a > 0) {
+        if (!is_nonnegative_variable[nonzero_var_index]) {
+          is_nonnegative_variable[nonzero_var_index] = true;
+          if (nonzero_coeff_column_index < mapping_size) {
+            // Remember to merge back the positive and negative parts.
+            PPL_ASSERT(nonzero_var_index < internal_space_dim);
+            is_remergeable_variable[nonzero_var_index] = true;
+          }
+        }
+        is_tableau_constraint[i - first_pending_constraint] = false;
+        --additional_tableau_rows;
+      }
+      // Cases 8-9: apply method A.
+      else {
+        PPL_ASSERT(cs_i.is_inequality());
+        ++additional_slack_variables;
+      }
+    }
+  }
+  return true;
+}
+
+void
+PPL::MIP_Problem::process_pending_constraints() {
+  // Check the pending constraints to adjust the data structures.
+  // If `false' is returned, they are trivially unfeasible.
+  dimension_type additional_tableau_rows = 0;
+  dimension_type additional_slack_vars = 0;
+  std::deque<bool> is_tableau_constraint;
+  std::deque<bool> is_satisfied_inequality;
+  std::deque<bool> is_nonnegative_variable;
+  std::deque<bool> is_remergeable_variable;
+  if (!parse_constraints(additional_tableau_rows,
+                         additional_slack_vars,
+                         is_tableau_constraint,
+                         is_satisfied_inequality,
+                         is_nonnegative_variable,
+                         is_remergeable_variable)) {
+    status = UNSATISFIABLE;
+    return;
+  }
+
+  // Merge back any variable that was previously split into a positive
+  // and a negative part and is now known to be nonnegative.
+  std::vector<dimension_type> unfeasible_tableau_rows;
+  for (dimension_type i = internal_space_dim; i-- > 0; ) {
+    if (!is_remergeable_variable[i])
+      continue;
+    // TODO: merging all rows in a single shot may be more efficient
+    // as it would require a single call to permute_columns().
+    const dimension_type unfeasible_row = merge_split_variable(i);
+    if (unfeasible_row != not_a_dimension())
+      unfeasible_tableau_rows.push_back(unfeasible_row);
+  }
+
+  const dimension_type old_tableau_num_rows = tableau.num_rows();
+  const dimension_type old_tableau_num_cols = tableau.num_columns();
+  const dimension_type first_free_tableau_index = old_tableau_num_cols - 1;
+
+  // Update mapping for the new problem variables (if any).
+  dimension_type additional_problem_vars = 0;
+  if (external_space_dim > internal_space_dim) {
+    const dimension_type space_diff = external_space_dim - internal_space_dim;
+    for (dimension_type i = 0, j = 0; i < space_diff; ++i) {
+      // Let `mapping' associate the variable index with the corresponding
+      // tableau column: split the variable into positive and negative
+      // parts if it is not known to be nonnegative.
+      const dimension_type positive = first_free_tableau_index + j;
+      if (is_nonnegative_variable[internal_space_dim + i]) {
+        // Do not split.
+        mapping.push_back(std::make_pair(positive, 0));
+        ++j;
+        ++additional_problem_vars;
+      }
+      else {
+        // Split: negative index is positive + 1.
+        mapping.push_back(std::make_pair(positive, positive + 1));
+        j += 2;
+        additional_problem_vars += 2;
+      }
+    }
+  }
+
+  // Resize the tableau: first add additional rows ...
+  if (additional_tableau_rows > 0)
+    tableau.add_zero_rows(additional_tableau_rows);
+
+  // ... then add additional columns.
+  // We need columns for additional (split) problem variables, additional
+  // slack variables and additional artificials.
+  // The number of artificials to be added is computed as:
+  // * number of pending constraints entering the tableau
+  //     minus
+  // * pending constraints that are inequalities and are already satisfied
+  //   by `last_generator'
+  //     plus
+  // * number of non-pending constraints that are no longer satisfied
+  //   due to re-merging of split variables.
+
+  const dimension_type num_satisfied_inequalities
+    = static_cast<dimension_type>(std::count(is_satisfied_inequality.begin(),
+                                             is_satisfied_inequality.end(),
+                                             true));
+  const dimension_type unfeasible_tableau_rows_size
+    = unfeasible_tableau_rows.size();
+
+  PPL_ASSERT(additional_tableau_rows >= num_satisfied_inequalities);
+  const dimension_type additional_artificial_vars
+    = (additional_tableau_rows - num_satisfied_inequalities)
+    + unfeasible_tableau_rows_size;
+
+  const dimension_type additional_tableau_columns
+    = additional_problem_vars
+    + additional_slack_vars
+    + additional_artificial_vars;
+
+  if (additional_tableau_columns > 0)
+    tableau.add_zero_columns(additional_tableau_columns);
+
+  // Dimensions of the tableau after resizing.
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  const dimension_type tableau_num_cols = tableau.num_columns();
+
+  // The following vector will be useful know if a constraint is feasible
+  // and does not require an additional artificial variable.
+  std::deque<bool> worked_out_row (tableau_num_rows, false);
+
+  // Sync the `base' vector size to the new tableau: fill with zeros
+  // to encode that these rows are not OK and must be adjusted.
+  base.insert(base.end(), additional_tableau_rows, 0);
+  const dimension_type base_size = base.size();
+
+  // These indexes will be used to insert slack and artificial variables
+  // in the appropriate position.
+  dimension_type slack_index
+    = tableau_num_cols - additional_artificial_vars - 1;
+  dimension_type artificial_index = slack_index;
+
+  // The first column index of the tableau that contains an
+  // artificial variable. Encode with 0 the fact the there are not
+  // artificial variables.
+  const dimension_type begin_artificials
+    = (additional_artificial_vars > 0)
+    ? artificial_index
+    : 0;
+
+  // Proceed with the insertion of the constraints.
+  for (dimension_type k = tableau_num_rows,
+       i = input_cs.size() - first_pending_constraint; i-- > 0; ) {
+    if (!is_tableau_constraint[i])
+      continue;
+    // Copy the original constraint in the tableau.
+    Row& tableau_k = tableau[--k];
+    Row::iterator itr = tableau_k.end();
+
+    const Constraint& c = *(input_cs[i + first_pending_constraint]);
+    const Constraint::expr_type c_e = c.expression();
+    for (Constraint::expr_type::const_iterator j = c_e.begin(),
+           j_end = c_e.end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference coeff_sd = *j;
+      const std::pair<dimension_type, dimension_type> mapped
+        = mapping[j.variable().space_dimension()];
+      itr = tableau_k.insert(itr, mapped.first, coeff_sd);
+      // Split if needed.
+      if (mapped.second != 0) {
+        itr = tableau_k.insert(itr, mapped.second);
+        neg_assign(*itr, coeff_sd);
+      }
+    }
+    Coefficient_traits::const_reference inhomo = c.inhomogeneous_term();
+    if (inhomo != 0) {
+      tableau_k.insert(itr, mapping[0].first, inhomo);
+      // Split if needed.
+      if (mapping[0].second != 0) {
+        itr = tableau_k.insert(itr, mapping[0].second);
+        neg_assign(*itr, inhomo);
+      }
+    }
+
+    // Add the slack variable, if needed.
+    if (c.is_inequality()) {
+      neg_assign(tableau_k[--slack_index], Coefficient_one());
+      // If the constraint is already satisfied, we will not use artificial
+      // variables to compute a feasible base: this to speed up
+      // the algorithm.
+      if (is_satisfied_inequality[i]) {
+        base[k] = slack_index;
+        worked_out_row[k] = true;
+      }
+    }
+    for (dimension_type j = base_size; j-- > 0; )
+      if (k != j && base[j] != 0 && tableau_k.get(base[j]) != 0)
+        linear_combine(tableau_k, tableau[j], base[j]);
+  }
+
+  // Let all inhomogeneous terms in the tableau be nonpositive,
+  // so as to simplify the insertion of artificial variables
+  // (the coefficient of each artificial variable will be 1).
+  for (dimension_type i = tableau_num_rows; i-- > 0 ; ) {
+    Row& tableau_i = tableau[i];
+    if (tableau_i.get(0) > 0) {
+      for (Row::iterator
+           j = tableau_i.begin(), j_end = tableau_i.end(); j != j_end; ++j)
+        neg_assign(*j);
+    }
+  }
+
+  // Reset the working cost function to have the right size.
+  working_cost = working_cost_type(tableau_num_cols);
+
+  // Set up artificial variables: these will have coefficient 1 in the
+  // constraint, will enter the base and will have coefficient -1 in
+  // the cost function.
+
+  // This is used as a hint for insertions in working_cost.
+  working_cost_type::iterator cost_itr = working_cost.end();
+
+  // First go through non-pending constraints that became unfeasible
+  // due to re-merging of split variables.
+  for (dimension_type i = 0; i < unfeasible_tableau_rows_size; ++i) {
+    tableau[unfeasible_tableau_rows[i]].insert(artificial_index,
+                                               Coefficient_one());
+    cost_itr = working_cost.insert(cost_itr, artificial_index);
+    *cost_itr = -1;
+    base[unfeasible_tableau_rows[i]] = artificial_index;
+    ++artificial_index;
+  }
+  // Then go through newly added tableau rows, disregarding inequalities
+  // that are already satisfied by `last_generator' (this information
+  // is encoded in `worked_out_row').
+  for (dimension_type i = old_tableau_num_rows; i < tableau_num_rows; ++i) {
+    if (worked_out_row[i])
+      continue;
+    tableau[i].insert(artificial_index, Coefficient_one());
+    cost_itr = working_cost.insert(cost_itr, artificial_index);
+    *cost_itr = -1;
+    base[i] = artificial_index;
+    ++artificial_index;
+  }
+  // One past the last tableau column index containing an artificial variable.
+  const dimension_type end_artificials = artificial_index;
+
+  // Set the extra-coefficient of the cost functions to record its sign.
+  // This is done to keep track of the possible sign's inversion.
+  const dimension_type last_obj_index = working_cost.size() - 1;
+  working_cost.insert(cost_itr, last_obj_index, Coefficient_one());
+
+  // Express the problem in terms of the variables in base.
+  {
+    working_cost_type::const_iterator itr = working_cost.end();
+    for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+      itr = working_cost.lower_bound(itr, base[i]);
+      if (itr != working_cost.end() && itr.index() == base[i] && *itr != 0) {
+        linear_combine(working_cost, tableau[i], base[i]);
+        // itr has been invalidated by the call to linear_combine().
+        itr = working_cost.end();
+      }
+    }
+  }
+
+  // Deal with zero dimensional problems.
+  if (space_dimension() == 0) {
+    status = OPTIMIZED;
+    last_generator = point();
+    return;
+  }
+  // Deal with trivial cases.
+  // If there is no constraint in the tableau, then the feasible region
+  // is only delimited by non-negativity constraints. Therefore,
+  // the problem is unbounded as soon as the cost function has
+  // a variable with a positive coefficient.
+  if (tableau_num_rows == 0) {
+    if (is_unbounded_obj_function(input_obj_function, mapping, opt_mode)) {
+      // Ensure the right space dimension is obtained.
+      last_generator = point();
+      last_generator.set_space_dimension(space_dimension());
+      status = UNBOUNDED;
+      return;
+    }
+
+    // The problem is neither trivially unfeasible nor trivially unbounded.
+    // The tableau was successful computed and the caller has to figure
+    // out which case applies.
+    status = OPTIMIZED;
+    // Ensure the right space dimension is obtained.
+    last_generator = point();
+    last_generator.set_space_dimension(space_dimension());
+    return;
+  }
+
+  // Now we are ready to solve the first phase.
+  const bool first_phase_successful
+    = (get_control_parameter(PRICING) == PRICING_STEEPEST_EDGE_FLOAT)
+    ? compute_simplex_using_steepest_edge_float()
+    : compute_simplex_using_exact_pricing();
+
+#if PPL_NOISY_SIMPLEX
+  std::cout << "MIP_Problem::process_pending_constraints(): "
+            << "1st phase ended at iteration " << num_iterations
+            << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+
+  if (!first_phase_successful || working_cost.get(0) != 0) {
+    // The feasible region is empty.
+    status = UNSATISFIABLE;
+    return;
+  }
+
+  // Prepare *this for a possible second phase.
+  if (begin_artificials != 0)
+    erase_artificials(begin_artificials, end_artificials);
+  compute_generator();
+  status = SATISFIABLE;
+}
+
+namespace {
+
+// NOTE: the following two `assign' helper functions are needed to
+// handle the assignment of a Coefficient to a double in method
+//     MIP_Problem::steepest_edge_float_entering_index().
+// We cannot use assign_r(double, Coefficient, Rounding_Dir) as it would
+// lead to a compilation error on those platforms (e.g., ARM) where
+// controlled floating point rounding is not available (even if the
+// rounding mode would be set to ROUND_IGNORE).
+
+inline void
+assign(double& d, const mpz_class& c) {
+  d = c.get_d();
+}
+
+template <typename T, typename Policy>
+inline void
+assign(double& d,
+       const Parma_Polyhedra_Library::Checked_Number<T, Policy>& c) {
+  d = raw_value(c);
+}
+
+} // namespace
+
+PPL::dimension_type
+PPL::MIP_Problem::steepest_edge_float_entering_index() const {
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  const dimension_type tableau_num_columns = tableau.num_columns();
+  PPL_ASSERT(tableau_num_rows == base.size());
+  double current_value = 0.0;
+  // Due to our integer implementation, the `1' term in the denominator
+  // of the original formula has to be replaced by `squared_lcm_basis'.
+  double float_tableau_value;
+  double float_tableau_denom;
+  dimension_type entering_index = 0;
+  const int cost_sign = sgn(working_cost.get(working_cost.size() - 1));
+
+  // These two implementation work for both sparse and dense matrices.
+  // However, when using sparse matrices the first one is fast and the second
+  // one is slow, and when using dense matrices the first one is slow and
+  // the second one is fast.
+#if PPL_USE_SPARSE_MATRIX
+
+  const dimension_type tableau_num_columns_minus_1 = tableau_num_columns - 1;
+  // This is static to improve performance.
+  // A vector of <column_index, challenger_denom> pairs, ordered by
+  // column_index.
+  static std::vector<std::pair<dimension_type, double> > columns;
+  columns.clear();
+  // (working_cost.size() - 2) is an upper bound only.
+  columns.reserve(working_cost.size() - 2);
+  {
+    working_cost_type::const_iterator i = working_cost.lower_bound(1);
+    // Note that find() is used instead of lower_bound().
+    working_cost_type::const_iterator i_end
+      = working_cost.find(tableau_num_columns_minus_1);
+    for ( ; i != i_end; ++i)
+      if (sgn(*i) == cost_sign)
+        columns.push_back(std::make_pair(i.index(), 1.0));
+  }
+  for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+    const Row& tableau_i = tableau[i];
+    assign(float_tableau_denom, tableau_i.get(base[i]));
+    Row::const_iterator j = tableau_i.begin();
+    Row::const_iterator j_end = tableau_i.end();
+    std::vector<std::pair<dimension_type, double> >::iterator k
+      = columns.begin();
+    std::vector<std::pair<dimension_type, double> >::iterator k_end
+      = columns.end();
+    while (j != j_end && k != k_end) {
+      const dimension_type column = j.index();
+      while (k != k_end && column > k->first)
+        ++k;
+      if (k == k_end)
+        break;
+      if (k->first > column) {
+        j = tableau_i.lower_bound(j, k->first);
+      }
+      else {
+        PPL_ASSERT(k->first == column);
+        PPL_ASSERT(tableau_i.get(base[i]) != 0);
+        WEIGHT_BEGIN();
+        assign(float_tableau_value, *j);
+        float_tableau_value /= float_tableau_denom;
+        float_tableau_value *= float_tableau_value;
+        k->second += float_tableau_value;
+        WEIGHT_ADD(22);
+        ++j;
+        ++k;
+      }
+    }
+  }
+  // The candidates are processed backwards to get the same result in both
+  // this implementation and the dense implementation below.
+  for (std::vector<std::pair<dimension_type, double> >::const_reverse_iterator
+       i = columns.rbegin(), i_end = columns.rend(); i != i_end; ++i) {
+    const double challenger_value = sqrt(i->second);
+    if (entering_index == 0 || challenger_value > current_value) {
+      current_value = challenger_value;
+      entering_index = i->first;
+    }
+  }
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+  double challenger_numer = 0.0;
+  double challenger_denom = 0.0;
+  for (dimension_type j = tableau_num_columns - 1; j-- > 1; ) {
+    Coefficient_traits::const_reference cost_j = working_cost.get(j);
+    if (sgn(cost_j) == cost_sign) {
+      WEIGHT_BEGIN();
+      // We cannot compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      assign(challenger_numer, cost_j);
+      challenger_numer = std::abs(challenger_numer);
+      // Due to our integer implementation, the `1' term in the denominator
+      // of the original formula has to be replaced by `squared_lcm_basis'.
+      challenger_denom = 1.0;
+      for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+        const Row& tableau_i = tableau[i];
+        Coefficient_traits::const_reference tableau_ij = tableau_i[j];
+        if (tableau_ij != 0) {
+          PPL_ASSERT(tableau_i[base[i]] != 0);
+          assign(float_tableau_value, tableau_ij);
+          assign(float_tableau_denom, tableau_i[base[i]]);
+          float_tableau_value /= float_tableau_denom;
+          challenger_denom += float_tableau_value * float_tableau_value;
+        }
+      }
+      double challenger_value = sqrt(challenger_denom);
+      // Initialize `current_value' during the first iteration.
+      // Otherwise update if the challenger wins.
+      if (entering_index == 0 || challenger_value > current_value) {
+        current_value = challenger_value;
+        entering_index = j;
+      }
+      WEIGHT_ADD_MUL(10, tableau_num_rows);
+    }
+  }
+
+#endif // !PPL_USE_SPARSE_MATRIX
+
+  return entering_index;
+}
+
+PPL::dimension_type
+PPL::MIP_Problem::steepest_edge_exact_entering_index() const {
+  using std::swap;
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  PPL_ASSERT(tableau_num_rows == base.size());
+  // The square of the lcm of all the coefficients of variables in base.
+  PPL_DIRTY_TEMP_COEFFICIENT(squared_lcm_basis);
+  // The normalization factor for each coefficient in the tableau.
+  std::vector<Coefficient> norm_factor(tableau_num_rows);
+  {
+    WEIGHT_BEGIN();
+    // Compute the lcm of all the coefficients of variables in base.
+    PPL_DIRTY_TEMP_COEFFICIENT(lcm_basis);
+    lcm_basis = 1;
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      lcm_assign(lcm_basis, lcm_basis, tableau[i].get(base[i]));
+    // Compute normalization factors.
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      exact_div_assign(norm_factor[i], lcm_basis, tableau[i].get(base[i]));
+    // Compute the square of `lcm_basis', exploiting the fact that
+    // `lcm_basis' will no longer be needed.
+    lcm_basis *= lcm_basis;
+    swap(squared_lcm_basis, lcm_basis);
+    WEIGHT_ADD_MUL(444, tableau_num_rows);
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(challenger_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(scalar_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(challenger_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(current_value);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(current_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(current_denom);
+  dimension_type entering_index = 0;
+  const int cost_sign = sgn(working_cost.get(working_cost.size() - 1));
+
+  // These two implementation work for both sparse and dense matrices.
+  // However, when using sparse matrices the first one is fast and the second
+  // one is slow, and when using dense matrices the first one is slow and
+  // the second one is fast.
+#if PPL_USE_SPARSE_MATRIX
+
+  const dimension_type tableau_num_columns = tableau.num_columns();
+  const dimension_type tableau_num_columns_minus_1 = tableau_num_columns - 1;
+  // This is static to improve performance.
+  // A pair (i, x) means that sgn(working_cost[i]) == cost_sign and x
+  // is the denominator of the challenger, for the column i.
+  static std::vector<std::pair<dimension_type, Coefficient> > columns;
+  columns.clear();
+  // tableau_num_columns - 2 is only an upper bound on the required elements.
+  // This helps to reduce the number of calls to new [] and delete [] and
+  // the construction/destruction of Coefficient objects.
+  columns.reserve(tableau_num_columns - 2);
+  {
+    working_cost_type::const_iterator i = working_cost.lower_bound(1);
+    // Note that find() is used instead of lower_bound.
+    working_cost_type::const_iterator i_end
+      = working_cost.find(tableau_num_columns_minus_1);
+    for ( ; i != i_end; ++i)
+      if (sgn(*i) == cost_sign)
+        columns.push_back(std::pair<dimension_type, Coefficient>
+                          (i.index(), squared_lcm_basis));
+  }
+  for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+    const Row& tableau_i = tableau[i];
+    Row::const_iterator j = tableau_i.begin();
+    Row::const_iterator j_end = tableau_i.end();
+    std::vector<std::pair<dimension_type, Coefficient> >::iterator
+      k = columns.begin();
+    std::vector<std::pair<dimension_type, Coefficient> >::iterator
+      k_end = columns.end();
+    while (j != j_end) {
+      while (k != k_end && j.index() > k->first)
+        ++k;
+      if (k == k_end)
+        break;
+      PPL_ASSERT(j.index() <= k->first);
+      if (j.index() < k->first)
+        j = tableau_i.lower_bound(j, k->first);
+      else {
+        Coefficient_traits::const_reference tableau_ij = *j;
+        WEIGHT_BEGIN();
+#if PPL_USE_SPARSE_MATRIX
+        scalar_value = tableau_ij * norm_factor[i];
+        add_mul_assign(k->second, scalar_value, scalar_value);
+#else
+        // The test against 0 gives rise to a consistent speed up in the dense
+        // implementation: see
+        // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/
+        // 014000.html
+        if (tableau_ij != 0) {
+          scalar_value = tableau_ij * norm_factor[i];
+          add_mul_assign(k->second, scalar_value, scalar_value);
+        }
+#endif
+        WEIGHT_ADD_MUL(47, tableau_num_rows);
+        ++k;
+        ++j;
+      }
+    }
+  }
+  working_cost_type::const_iterator itr = working_cost.end();
+  for (std::vector<std::pair<dimension_type, Coefficient> >::reverse_iterator
+       k = columns.rbegin(), k_end = columns.rend(); k != k_end; ++k) {
+    itr = working_cost.lower_bound(itr, k->first);
+    if (itr != working_cost.end() && itr.index() == k->first) {
+      // We cannot compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      challenger_numer = (*itr) * (*itr);
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+        swap(current_numer, challenger_numer);
+        swap(current_denom, k->second);
+        entering_index = k->first;
+        continue;
+      }
+      challenger_value = challenger_numer * current_denom;
+      current_value = current_numer * k->second;
+      // Update the values, if the challenger wins.
+      if (challenger_value > current_value) {
+        swap(current_numer, challenger_numer);
+        swap(current_denom, k->second);
+        entering_index = k->first;
+      }
+    }
+    else {
+      PPL_ASSERT(working_cost.get(k->first) == 0);
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+        current_numer = 0;
+        swap(current_denom, k->second);
+        entering_index = k->first;
+        continue;
+      }
+      // Update the values, if the challenger wins.
+      if (0 > sgn(current_numer) * sgn(k->second)) {
+        current_numer = 0;
+        swap(current_denom, k->second);
+        entering_index = k->first;
+      }
+    }
+  }
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+  PPL_DIRTY_TEMP_COEFFICIENT(challenger_denom);
+  for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
+    Coefficient_traits::const_reference cost_j = working_cost[j];
+    if (sgn(cost_j) == cost_sign) {
+      WEIGHT_BEGIN();
+      // We cannot compute the (exact) square root of abs(\Delta x_j).
+      // The workaround is to compute the square of `cost[j]'.
+      challenger_numer = cost_j * cost_j;
+      // Due to our integer implementation, the `1' term in the denominator
+      // of the original formula has to be replaced by `squared_lcm_basis'.
+      challenger_denom = squared_lcm_basis;
+      for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+        Coefficient_traits::const_reference tableau_ij = tableau[i][j];
+        // The test against 0 gives rise to a consistent speed up: see
+        // http://www.cs.unipr.it/pipermail/ppl-devel/2009-February/
+        // 014000.html
+        if (tableau_ij != 0) {
+          scalar_value = tableau_ij * norm_factor[i];
+          add_mul_assign(challenger_denom, scalar_value, scalar_value);
+        }
+      }
+      // Initialization during the first loop.
+      if (entering_index == 0) {
+        swap(current_numer, challenger_numer);
+        swap(current_denom, challenger_denom);
+        entering_index = j;
+        continue;
+      }
+      challenger_value = challenger_numer * current_denom;
+      current_value = current_numer * challenger_denom;
+      // Update the values, if the challenger wins.
+      if (challenger_value > current_value) {
+        swap(current_numer, challenger_numer);
+        swap(current_denom, challenger_denom);
+        entering_index = j;
+      }
+      WEIGHT_ADD_MUL(47, tableau_num_rows);
+    }
+  }
+
+#endif // !PPL_USE_SPARSE_MATRIX
+
+  return entering_index;
+}
+
+
+// See page 47 of [PapadimitriouS98].
+PPL::dimension_type
+PPL::MIP_Problem::textbook_entering_index() const {
+  // The variable entering the base is the first one whose coefficient
+  // in the cost function has the same sign the cost function itself.
+  // If no such variable exists, then we met the optimality condition
+  // (and return 0 to the caller).
+
+  // Get the "sign" of the cost function.
+  const dimension_type cost_sign_index = working_cost.size() - 1;
+  const int cost_sign = sgn(working_cost.get(cost_sign_index));
+  PPL_ASSERT(cost_sign != 0);
+
+  working_cost_type::const_iterator i = working_cost.lower_bound(1);
+  // Note that find() is used instead of lower_bound() because they are
+  // equivalent when searching the last element in the row.
+  working_cost_type::const_iterator i_end
+    = working_cost.find(cost_sign_index);
+  for ( ; i != i_end; ++i)
+    if (sgn(*i) == cost_sign)
+      return i.index();
+  // No variable has to enter the base:
+  // the cost function was optimized.
+  return 0;
+}
+
+void
+PPL::MIP_Problem::linear_combine(Row& x, const Row& y,
+                                 const dimension_type k) {
+  PPL_ASSERT(x.size() == y.size());
+  WEIGHT_BEGIN();
+  const dimension_type x_size = x.size();
+  Coefficient_traits::const_reference x_k = x.get(k);
+  Coefficient_traits::const_reference y_k = y.get(k);
+  PPL_ASSERT(y_k != 0 && x_k != 0);
+  // Let g be the GCD between `x[k]' and `y[k]'.
+  // For each i the following computes
+  //   x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_k);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_k);
+  normalize2(x_k, y_k, normalized_x_k, normalized_y_k);
+
+  neg_assign(normalized_y_k);
+  x.linear_combine(y, normalized_y_k, normalized_x_k);
+
+  PPL_ASSERT(x.get(k) == 0);
+
+#if PPL_USE_SPARSE_MATRIX
+  PPL_ASSERT(x.find(k) == x.end());
+#endif
+
+  x.normalize();
+  WEIGHT_ADD_MUL(31, x_size);
+}
+
+// TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+void
+PPL::MIP_Problem::linear_combine(Dense_Row& x,
+                                 const Sparse_Row& y,
+                                 const dimension_type k) {
+  PPL_ASSERT(x.size() == y.size());
+  WEIGHT_BEGIN();
+  const dimension_type x_size = x.size();
+  Coefficient_traits::const_reference x_k = x.get(k);
+  Coefficient_traits::const_reference y_k = y.get(k);
+  PPL_ASSERT(y_k != 0 && x_k != 0);
+  // Let g be the GCD between `x[k]' and `y[k]'.
+  // For each i the following computes
+  //   x[i] = x[i]*y[k]/g - y[i]*x[k]/g.
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_k);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_k);
+  normalize2(x_k, y_k, normalized_x_k, normalized_y_k);
+
+  neg_assign(normalized_y_k);
+  Parma_Polyhedra_Library::linear_combine(x, y, normalized_y_k, normalized_x_k);
+
+  PPL_ASSERT(x[k] == 0);
+
+  x.normalize();
+  WEIGHT_ADD_MUL(83, x_size);
+}
+
+#endif // defined(PPL_USE_SPARSE_MATRIX)
+
+bool
+PPL::MIP_Problem::is_unbounded_obj_function(
+  const Linear_Expression& x,
+  const std::vector<std::pair<dimension_type, dimension_type> >& mapping,
+  Optimization_Mode optimization_mode) {
+
+  for (Linear_Expression::const_iterator i = x.begin(),
+         i_end = x.end(); i != i_end; ++i) {
+    // If a the value of a variable in the objective function is
+    // different from zero, the final status is unbounded.
+    // In the first part the variable is constrained to be greater or equal
+    // than zero.
+    if (mapping[i.variable().space_dimension()].second != 0)
+      return true;
+    if (optimization_mode == MAXIMIZATION) {
+      if (*i > 0)
+        return true;
+    }
+    else {
+      PPL_ASSERT(optimization_mode == MINIMIZATION);
+      if (*i < 0)
+        return true;
+    }
+  }
+  return false;
+}
+
+// See pages 42-43 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::pivot(const dimension_type entering_var_index,
+                        const dimension_type exiting_base_index) {
+  const Row& tableau_out = tableau[exiting_base_index];
+  // Linearly combine the constraints.
+  for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+    Row& tableau_i = tableau[i];
+    if (i != exiting_base_index && tableau_i.get(entering_var_index) != 0)
+      linear_combine(tableau_i, tableau_out, entering_var_index);
+  }
+  // Linearly combine the cost function.
+  if (working_cost.get(entering_var_index) != 0)
+    linear_combine(working_cost, tableau_out, entering_var_index);
+  // Adjust the base.
+  base[exiting_base_index] = entering_var_index;
+}
+
+// See pages 47 and 50 of [PapadimitriouS98].
+PPL::dimension_type
+PPL::MIP_Problem
+::get_exiting_base_index(const dimension_type entering_var_index) const {
+  // The variable exiting the base should be associated to a tableau
+  // constraint such that the ratio
+  // tableau[i][entering_var_index] / tableau[i][base[i]]
+  // is strictly positive and minimal.
+
+  // Find the first tableau constraint `c' having a positive value for
+  // tableau[i][entering_var_index] / tableau[i][base[i]]
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  dimension_type exiting_base_index = tableau_num_rows;
+  for (dimension_type i = 0; i < tableau_num_rows; ++i) {
+    const Row& t_i = tableau[i];
+    const int num_sign = sgn(t_i.get(entering_var_index));
+    if (num_sign != 0 && num_sign == sgn(t_i.get(base[i]))) {
+      exiting_base_index = i;
+      break;
+    }
+  }
+  // Check for unboundedness.
+  if (exiting_base_index == tableau_num_rows)
+    return tableau_num_rows;
+
+  // Reaching this point means that a variable will definitely exit the base.
+  PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+  PPL_DIRTY_TEMP_COEFFICIENT(current_min);
+  PPL_DIRTY_TEMP_COEFFICIENT(challenger);
+  Coefficient t_e0 = tableau[exiting_base_index].get(0);
+  Coefficient t_ee = tableau[exiting_base_index].get(entering_var_index);
+  for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) {
+    const Row& t_i = tableau[i];
+    Coefficient_traits::const_reference t_ie = t_i.get(entering_var_index);
+    const int t_ie_sign = sgn(t_ie);
+    if (t_ie_sign != 0 && t_ie_sign == sgn(t_i.get(base[i]))) {
+      WEIGHT_BEGIN();
+      Coefficient_traits::const_reference t_i0 = t_i.get(0);
+      lcm_assign(lcm, t_ee, t_ie);
+      exact_div_assign(current_min, lcm, t_ee);
+      current_min *= t_e0;
+      abs_assign(current_min);
+      exact_div_assign(challenger, lcm, t_ie);
+      challenger *= t_i0;
+      abs_assign(challenger);
+      current_min -= challenger;
+      const int sign = sgn(current_min);
+      if (sign > 0
+          || (sign == 0 && base[i] < base[exiting_base_index])) {
+        exiting_base_index = i;
+        t_e0 = t_i0;
+        t_ee = t_ie;
+      }
+      WEIGHT_ADD(642);
+    }
+  }
+  return exiting_base_index;
+}
+
+// See page 49 of [PapadimitriouS98].
+bool
+PPL::MIP_Problem::compute_simplex_using_steepest_edge_float() {
+  // We may need to temporarily switch to the textbook pricing.
+  const unsigned long allowed_non_increasing_loops = 200;
+  unsigned long non_increased_times = 0;
+  bool textbook_pricing = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(cost_sgn_coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(current_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(current_denom);
+  PPL_DIRTY_TEMP_COEFFICIENT(challenger);
+  PPL_DIRTY_TEMP_COEFFICIENT(current);
+
+  cost_sgn_coeff = working_cost.get(working_cost.size() - 1);
+  current_numer = working_cost.get(0);
+  if (cost_sgn_coeff < 0)
+    neg_assign(current_numer);
+  abs_assign(current_denom, cost_sgn_coeff);
+  PPL_ASSERT(tableau.num_columns() == working_cost.size());
+  const dimension_type tableau_num_rows = tableau.num_rows();
+
+  while (true) {
+    // Choose the index of the variable entering the base, if any.
+    const dimension_type entering_var_index
+      = textbook_pricing
+      ? textbook_entering_index()
+      : steepest_edge_float_entering_index();
+
+    // If no entering index was computed, the problem is solved.
+    if (entering_var_index == 0)
+      return true;
+
+    // Choose the index of the row exiting the base.
+    const dimension_type exiting_base_index
+      = get_exiting_base_index(entering_var_index);
+    // If no exiting index was computed, the problem is unbounded.
+    if (exiting_base_index == tableau_num_rows)
+      return false;
+
+    // Check if the client has requested abandoning all expensive
+    // computations. If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // We have not reached the optimality or unbounded condition:
+    // compute the new base and the corresponding vertex of the
+    // feasible region.
+    pivot(entering_var_index, exiting_base_index);
+
+    WEIGHT_BEGIN();
+    // Now begins the objective function's value check to choose between
+    // the `textbook' and the float `steepest-edge' technique.
+    cost_sgn_coeff = working_cost.get(working_cost.size() - 1);
+
+    challenger = working_cost.get(0);
+    if (cost_sgn_coeff < 0)
+      neg_assign(challenger);
+    challenger *= current_denom;
+    abs_assign(current, cost_sgn_coeff);
+    current *= current_numer;
+#if PPL_NOISY_SIMPLEX
+    ++num_iterations;
+    if (num_iterations % 200 == 0)
+      std::cout << "Primal simplex: iteration " << num_iterations
+                << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+    // If the following condition fails, probably there's a bug.
+    PPL_ASSERT(challenger >= current);
+    // If the value of the objective function does not improve,
+    // keep track of that.
+    if (challenger == current) {
+      ++non_increased_times;
+      // In the following case we will proceed using the `textbook'
+      // technique, until the objective function is not improved.
+      if (non_increased_times > allowed_non_increasing_loops)
+        textbook_pricing = true;
+    }
+    // The objective function has an improvement:
+    // reset `non_increased_times' and `textbook_pricing'.
+    else {
+      non_increased_times = 0;
+      textbook_pricing = false;
+    }
+    current_numer = working_cost.get(0);
+    if (cost_sgn_coeff < 0)
+      neg_assign(current_numer);
+    abs_assign(current_denom, cost_sgn_coeff);
+    WEIGHT_ADD(433);
+  }
+}
+
+bool
+PPL::MIP_Problem::compute_simplex_using_exact_pricing() {
+  PPL_ASSERT(tableau.num_columns() == working_cost.size());
+  PPL_ASSERT(get_control_parameter(PRICING) == PRICING_STEEPEST_EDGE_EXACT
+         || get_control_parameter(PRICING) == PRICING_TEXTBOOK);
+
+  const dimension_type tableau_num_rows = tableau.num_rows();
+  const bool textbook_pricing
+    = (PRICING_TEXTBOOK == get_control_parameter(PRICING));
+
+  while (true) {
+    // Choose the index of the variable entering the base, if any.
+    const dimension_type entering_var_index
+      = textbook_pricing
+      ? textbook_entering_index()
+      : steepest_edge_exact_entering_index();
+    // If no entering index was computed, the problem is solved.
+    if (entering_var_index == 0)
+      return true;
+
+    // Choose the index of the row exiting the base.
+    const dimension_type exiting_base_index
+      = get_exiting_base_index(entering_var_index);
+    // If no exiting index was computed, the problem is unbounded.
+    if (exiting_base_index == tableau_num_rows)
+      return false;
+
+    // Check if the client has requested abandoning all expensive
+    // computations. If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // We have not reached the optimality or unbounded condition:
+    // compute the new base and the corresponding vertex of the
+    // feasible region.
+    pivot(entering_var_index, exiting_base_index);
+#if PPL_NOISY_SIMPLEX
+    ++num_iterations;
+    if (num_iterations % 200 == 0)
+      std::cout << "Primal simplex: iteration " << num_iterations
+                << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+  }
+}
+
+
+// See pages 55-56 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::erase_artificials(const dimension_type begin_artificials,
+                                    const dimension_type end_artificials) {
+  PPL_ASSERT(0 < begin_artificials && begin_artificials < end_artificials);
+
+  const dimension_type old_last_column = tableau.num_columns() - 1;
+  dimension_type tableau_n_rows = tableau.num_rows();
+  // Step 1: try to remove from the base all the remaining slack variables.
+  for (dimension_type i = 0; i < tableau_n_rows; ++i)
+    if (begin_artificials <= base[i] && base[i] < end_artificials) {
+      // Search for a non-zero element to enter the base.
+      Row& tableau_i = tableau[i];
+      bool redundant = true;
+      Row::const_iterator j = tableau_i.begin();
+      Row::const_iterator j_end = tableau_i.end();
+      // Skip the first element
+      if (j != j_end && j.index() == 0)
+        ++j;
+      for ( ; (j != j_end) && (j.index() < begin_artificials); ++j)
+        if (*j != 0) {
+          pivot(j.index(), i);
+          redundant = false;
+          break;
+        }
+      if (redundant) {
+        // No original variable entered the base:
+        // the constraint is redundant and should be deleted.
+        --tableau_n_rows;
+        if (i < tableau_n_rows) {
+          // Replace the redundant row with the last one,
+          // taking care of adjusting the iteration index.
+          tableau_i.m_swap(tableau[tableau_n_rows]);
+          base[i] = base[tableau_n_rows];
+          --i;
+        }
+        tableau.remove_trailing_rows(1);
+        base.pop_back();
+      }
+    }
+
+  // Step 2: Adjust data structures so as to enter phase 2 of the simplex.
+
+  // Resize the tableau.
+  const dimension_type num_artificials = end_artificials - begin_artificials;
+  tableau.remove_trailing_columns(num_artificials);
+
+  // Zero the last column of the tableau.
+  const dimension_type new_last_column = tableau.num_columns() - 1;
+  for (dimension_type i = tableau_n_rows; i-- > 0; )
+    tableau[i].reset(new_last_column);
+
+  // ... then properly set the element in the (new) last column,
+  // encoding the kind of optimization; ...
+  {
+    // This block is equivalent to
+    //
+    // <CODE>
+    //   working_cost[new_last_column] = working_cost.get(old_last_column);
+    // </CODE>
+    //
+    // but it avoids storing zeroes.
+    Coefficient_traits::const_reference old_cost
+      = working_cost.get(old_last_column);
+    if (old_cost == 0)
+      working_cost.reset(new_last_column);
+    else
+      working_cost.insert(new_last_column, old_cost);
+  }
+
+  // ... and finally remove redundant columns.
+  const dimension_type working_cost_new_size
+    = working_cost.size() - num_artificials;
+  working_cost.shrink(working_cost_new_size);
+}
+
+// See page 55 of [PapadimitriouS98].
+void
+PPL::MIP_Problem::compute_generator() const {
+  // Early exit for 0-dimensional problems.
+  if (external_space_dim == 0) {
+    MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+    x.last_generator = point();
+    return;
+  }
+
+  // We will store in numer[] and in denom[] the numerators and
+  // the denominators of every variable of the original problem.
+  std::vector<Coefficient> numer(external_space_dim);
+  std::vector<Coefficient> denom(external_space_dim);
+  dimension_type row = 0;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+  // Speculatively allocate temporaries out of loop.
+  PPL_DIRTY_TEMP_COEFFICIENT(split_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(split_denom);
+
+  // We start to compute numer[] and denom[].
+  for (dimension_type i = external_space_dim; i-- > 0; ) {
+    Coefficient& numer_i = numer[i];
+    Coefficient& denom_i = denom[i];
+    // Get the value of the variable from the tableau
+    // (if it is not a basic variable, the value is 0).
+    const dimension_type original_var = mapping[i+1].first;
+    if (is_in_base(original_var, row)) {
+      const Row& t_row = tableau[row];
+      Coefficient_traits::const_reference t_row_original_var
+        = t_row.get(original_var);
+      if (t_row_original_var > 0) {
+        neg_assign(numer_i, t_row.get(0));
+        denom_i = t_row_original_var;
+      }
+      else {
+        numer_i = t_row.get(0);
+        neg_assign(denom_i, t_row_original_var);
+      }
+    }
+    else {
+      numer_i = 0;
+      denom_i = 1;
+    }
+    // Check whether the variable was split.
+    const dimension_type split_var = mapping[i+1].second;
+    if (split_var != 0) {
+      // The variable was split: get the value for the negative component,
+      // having index mapping[i+1].second .
+      // Like before, we he have to check if the variable is in base.
+      if (is_in_base(split_var, row)) {
+        const Row& t_row = tableau[row];
+        Coefficient_traits::const_reference t_row_split_var
+          = t_row.get(split_var);
+        if (t_row_split_var > 0) {
+          neg_assign(split_numer, t_row.get(0));
+          split_denom = t_row_split_var;
+        }
+        else {
+          split_numer = t_row.get(0);
+          neg_assign(split_denom, t_row_split_var);
+        }
+        // We compute the lcm to compute subsequently the difference
+        // between the 2 variables.
+        lcm_assign(lcm, denom_i, split_denom);
+        exact_div_assign(denom_i, lcm, denom_i);
+        exact_div_assign(split_denom, lcm, split_denom);
+        numer_i *= denom_i;
+        sub_mul_assign(numer_i, split_numer, split_denom);
+        if (numer_i == 0)
+          denom_i = 1;
+        else
+          denom_i = lcm;
+      }
+      // Note: if the negative component was not in base, then
+      // it has value zero and there is nothing left to do.
+    }
+  }
+
+  // Compute the lcm of all denominators.
+  PPL_ASSERT(external_space_dim > 0);
+  lcm = denom[0];
+  for (dimension_type i = 1; i < external_space_dim; ++i)
+    lcm_assign(lcm, lcm, denom[i]);
+  // Use the denominators to store the numerators' multipliers
+  // and then compute the normalized numerators.
+  for (dimension_type i = external_space_dim; i-- > 0; ) {
+    exact_div_assign(denom[i], lcm, denom[i]);
+    numer[i] *= denom[i];
+  }
+
+  // Finally, build the generator.
+  Linear_Expression expr;
+  for (dimension_type i = external_space_dim; i-- > 0; )
+    add_mul_assign(expr, numer[i], Variable(i));
+
+  MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+  x.last_generator = point(expr, lcm);
+}
+
+void
+PPL::MIP_Problem::second_phase() {
+  // Second_phase requires that *this is satisfiable.
+  PPL_ASSERT(status == SATISFIABLE
+             || status == UNBOUNDED
+             || status == OPTIMIZED);
+  // In the following cases the problem is already solved.
+  if (status == UNBOUNDED || status == OPTIMIZED)
+    return;
+
+  // Build the objective function for the second phase.
+  Row new_cost;
+  input_obj_function.get_row(new_cost);
+
+  // Negate the cost function if we are minimizing.
+  if (opt_mode == MINIMIZATION)
+    for (Row::iterator i = new_cost.begin(),
+           i_end = new_cost.end(); i != i_end; ++i)
+      neg_assign(*i);
+
+  const dimension_type cost_zero_size = working_cost.size();
+
+  // Substitute properly the cost function in the `costs' matrix.
+  {
+    working_cost_type tmp_cost(cost_zero_size, cost_zero_size);
+    swap(tmp_cost, working_cost);
+  }
+
+  {
+    working_cost_type::iterator itr
+      = working_cost.insert(cost_zero_size - 1, Coefficient_one());
+
+    // Split the variables in the cost function.
+    for (Row::const_iterator i = new_cost.lower_bound(1),
+           i_end = new_cost.end(); i != i_end; ++i) {
+      const dimension_type index = i.index();
+      const dimension_type original_var = mapping[index].first;
+      const dimension_type split_var = mapping[index].second;
+      itr = working_cost.insert(itr, original_var, *i);
+      if (mapping[index].second != 0) {
+        itr = working_cost.insert(itr, split_var);
+        neg_assign(*itr, *i);
+      }
+    }
+  }
+
+  // Here the first phase problem succeeded with optimum value zero.
+  // Express the old cost function in terms of the computed base.
+  {
+    working_cost_type::iterator itr = working_cost.end();
+    for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+      const dimension_type base_i = base[i];
+      itr = working_cost.lower_bound(itr, base_i);
+      if (itr != working_cost.end() && itr.index() == base_i && *itr != 0) {
+        linear_combine(working_cost, tableau[i], base_i);
+        itr = working_cost.end();
+      }
+    }
+  }
+
+  // Solve the second phase problem.
+  const bool second_phase_successful
+    = (get_control_parameter(PRICING) == PRICING_STEEPEST_EDGE_FLOAT)
+    ? compute_simplex_using_steepest_edge_float()
+    : compute_simplex_using_exact_pricing();
+  compute_generator();
+#if PPL_NOISY_SIMPLEX
+  std::cout << "MIP_Problem::second_phase(): 2nd phase ended at iteration "
+            << num_iterations
+            << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+  status = second_phase_successful ? OPTIMIZED : UNBOUNDED;
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::MIP_Problem
+::evaluate_objective_function(const Generator& evaluating_point,
+                              Coefficient& numer,
+                              Coefficient& denom) const {
+  const dimension_type ep_space_dim = evaluating_point.space_dimension();
+  if (space_dimension() < ep_space_dim)
+    throw std::invalid_argument("PPL::MIP_Problem::"
+                                "evaluate_objective_function(p, n, d):\n"
+                                "*this and p are dimension incompatible.");
+  if (!evaluating_point.is_point())
+    throw std::invalid_argument("PPL::MIP_Problem::"
+                                "evaluate_objective_function(p, n, d):\n"
+                                "p is not a point.");
+
+  // Compute the smallest space dimension  between `input_obj_function'
+  // and `evaluating_point'.
+  const dimension_type working_space_dim
+    = std::min(ep_space_dim, input_obj_function.space_dimension());
+  input_obj_function.scalar_product_assign(numer,
+                                           evaluating_point.expr,
+                                           0, working_space_dim + 1);
+
+  // Numerator and denominator should be coprime.
+  normalize2(numer, evaluating_point.divisor(), numer, denom);
+}
+
+bool
+PPL::MIP_Problem::is_lp_satisfiable() const {
+#if PPL_NOISY_SIMPLEX
+  num_iterations = 0;
+#endif // PPL_NOISY_SIMPLEX
+  switch (status) {
+  case UNSATISFIABLE:
+    return false;
+  case SATISFIABLE:
+    // Intentionally fall through.
+  case UNBOUNDED:
+    // Intentionally fall through.
+  case OPTIMIZED:
+    // Intentionally fall through.
+    return true;
+  case PARTIALLY_SATISFIABLE:
+    {
+      MIP_Problem& x = const_cast<MIP_Problem&>(*this);
+      // This code tries to handle the case that happens if the tableau is
+      // empty, so it must be initialized.
+      if (tableau.num_columns() == 0) {
+        // Add two columns, the first that handles the inhomogeneous term and
+        // the second that represent the `sign'.
+        x.tableau.add_zero_columns(2);
+        // Sync `mapping' for the inhomogeneous term.
+        x.mapping.push_back(std::make_pair(0, 0));
+        // The internal data structures are ready, so prepare for more
+        // assertion to be checked.
+        x.initialized = true;
+      }
+
+      // Apply incrementality to the pending constraint system.
+      x.process_pending_constraints();
+      // Update `first_pending_constraint': no more pending.
+      x.first_pending_constraint = input_cs.size();
+      // Update also `internal_space_dim'.
+      x.internal_space_dim = x.external_space_dim;
+      PPL_ASSERT(OK());
+      return status != UNSATISFIABLE;
+    }
+  }
+  // We should not be here!
+  PPL_UNREACHABLE;
+  return false;
+}
+
+PPL::MIP_Problem_Status
+PPL::MIP_Problem::solve_mip(bool& have_incumbent_solution,
+                            mpq_class& incumbent_solution_value,
+                            Generator& incumbent_solution_point,
+                            MIP_Problem& mip,
+                            const Variables_Set& i_vars) {
+  // Solve the problem as a non MIP one, it must be done internally.
+  PPL::MIP_Problem_Status mip_status;
+  if (mip.is_lp_satisfiable()) {
+    mip.second_phase();
+    mip_status = (mip.status == OPTIMIZED) ? OPTIMIZED_MIP_PROBLEM
+      : UNBOUNDED_MIP_PROBLEM;
+  }
+  else
+    return UNFEASIBLE_MIP_PROBLEM;
+
+  PPL_DIRTY_TEMP(mpq_class, tmp_rational);
+
+  Generator p = point();
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff1);
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff2);
+
+  if (mip_status == UNBOUNDED_MIP_PROBLEM)
+    p = mip.last_generator;
+  else {
+    PPL_ASSERT(mip_status == OPTIMIZED_MIP_PROBLEM);
+    // Do not call optimizing_point().
+    p = mip.last_generator;
+    mip.evaluate_objective_function(p, tmp_coeff1, tmp_coeff2);
+    assign_r(tmp_rational.get_num(), tmp_coeff1, ROUND_NOT_NEEDED);
+    assign_r(tmp_rational.get_den(), tmp_coeff2, ROUND_NOT_NEEDED);
+    PPL_ASSERT(is_canonical(tmp_rational));
+    if (have_incumbent_solution
+        && ((mip.optimization_mode() == MAXIMIZATION
+              && tmp_rational <= incumbent_solution_value)
+            || (mip.optimization_mode() == MINIMIZATION
+                && tmp_rational >= incumbent_solution_value)))
+      // Abandon this path.
+      return mip_status;
+  }
+
+  bool found_satisfiable_generator = true;
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  Coefficient_traits::const_reference p_divisor = p.divisor();
+  dimension_type non_int_dim = mip.space_dimension();
+  // TODO: This can be optimized more, exploiting the (possible)
+  // sparseness of p, if the size of i_vars is expected to be greater than
+  // the number of nonzeroes in p in most cases.
+  for (Variables_Set::const_iterator v_begin = i_vars.begin(),
+         v_end = i_vars.end(); v_begin != v_end; ++v_begin) {
+    gcd_assign(gcd, p.coefficient(Variable(*v_begin)), p_divisor);
+    if (gcd != p_divisor) {
+      non_int_dim = *v_begin;
+      found_satisfiable_generator = false;
+      break;
+    }
+  }
+  if (found_satisfiable_generator) {
+    // All the coordinates of `point' are satisfiable.
+    if (mip_status == UNBOUNDED_MIP_PROBLEM) {
+      // This is a point that belongs to the MIP_Problem.
+      // In this way we are sure that we will return every time
+      // a feasible point if requested by the user.
+      incumbent_solution_point = p;
+      return mip_status;
+    }
+    if (!have_incumbent_solution
+        || (mip.optimization_mode() == MAXIMIZATION
+            && tmp_rational > incumbent_solution_value)
+        || tmp_rational < incumbent_solution_value) {
+      incumbent_solution_value = tmp_rational;
+      incumbent_solution_point = p;
+      have_incumbent_solution = true;
+#if PPL_NOISY_SIMPLEX
+      PPL_DIRTY_TEMP_COEFFICIENT(numer);
+      PPL_DIRTY_TEMP_COEFFICIENT(denom);
+      mip.evaluate_objective_function(p, numer, denom);
+      std::cout << "MIP_Problem::solve_mip(): "
+                << "new value found: " << numer << "/" << denom
+                << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+    }
+    return mip_status;
+  }
+
+  PPL_ASSERT(non_int_dim < mip.space_dimension());
+
+  assign_r(tmp_rational.get_num(), p.coefficient(Variable(non_int_dim)),
+           ROUND_NOT_NEEDED);
+  assign_r(tmp_rational.get_den(), p_divisor, ROUND_NOT_NEEDED);
+  tmp_rational.canonicalize();
+  assign_r(tmp_coeff1, tmp_rational, ROUND_DOWN);
+  assign_r(tmp_coeff2, tmp_rational, ROUND_UP);
+  {
+    MIP_Problem mip_aux(mip, Inherit_Constraints());
+    mip_aux.add_constraint(Variable(non_int_dim) <= tmp_coeff1);
+#if PPL_NOISY_SIMPLEX
+    using namespace IO_Operators;
+    std::cout << "MIP_Problem::solve_mip(): "
+              << "descending with: "
+              << (Variable(non_int_dim) <= tmp_coeff1)
+              << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+    solve_mip(have_incumbent_solution, incumbent_solution_value,
+              incumbent_solution_point, mip_aux, i_vars);
+  }
+  // TODO: change this when we will be able to remove constraints.
+  mip.add_constraint(Variable(non_int_dim) >= tmp_coeff2);
+#if PPL_NOISY_SIMPLEX
+  using namespace IO_Operators;
+  std::cout << "MIP_Problem::solve_mip(): "
+            << "descending with: "
+            << (Variable(non_int_dim) >= tmp_coeff2)
+            << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+  solve_mip(have_incumbent_solution, incumbent_solution_value,
+            incumbent_solution_point, mip, i_vars);
+  return have_incumbent_solution ? mip_status : UNFEASIBLE_MIP_PROBLEM;
+}
+
+bool
+PPL::MIP_Problem::choose_branching_variable(const MIP_Problem& mip,
+                                            const Variables_Set& i_vars,
+                                            dimension_type& branching_index) {
+  // Insert here the variables that do not satisfy the integrality
+  // condition.
+  const std::vector<Constraint*>& input_cs = mip.input_cs;
+  const Generator& last_generator = mip.last_generator;
+  Coefficient_traits::const_reference last_generator_divisor
+    = last_generator.divisor();
+  Variables_Set candidate_variables;
+
+  // TODO: This can be optimized more, exploiting the (possible)
+  // sparseness of last_generator, if the size of i_vars is expected to be
+  // greater than the number of nonzeroes in last_generator in most cases.
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  for (Variables_Set::const_iterator v_it = i_vars.begin(),
+         v_end = i_vars.end(); v_it != v_end; ++v_it) {
+    gcd_assign(gcd,
+               last_generator.coefficient(Variable(*v_it)),
+               last_generator_divisor);
+    if (gcd != last_generator_divisor)
+      candidate_variables.insert(*v_it);
+  }
+  // If this set is empty, we have finished.
+  if (candidate_variables.empty())
+    return true;
+
+  // Check how many `active constraints' we have and track them.
+  const dimension_type input_cs_num_rows = input_cs.size();
+  std::deque<bool> satisfiable_constraints (input_cs_num_rows, false);
+  for (dimension_type i = input_cs_num_rows; i-- > 0; )
+    // An equality is an `active constraint' by definition.
+    // If we have an inequality, check if it is an `active constraint'.
+    if (input_cs[i]->is_equality()
+        || is_saturated(*(input_cs[i]), last_generator))
+      satisfiable_constraints[i] = true;
+
+  dimension_type winning_num_appearances = 0;
+
+  std::vector<dimension_type>
+    num_appearances(candidate_variables.space_dimension(), 0);
+
+  // For every candidate variable, check how many times this appear in the
+  // active constraints.
+  for (dimension_type i = input_cs_num_rows; i-- > 0; ) {
+    if (!satisfiable_constraints[i])
+      continue;
+    // TODO: This can be optimized more, exploiting the (possible)
+    // sparseness of input_cs, if the size of candidate_variables is expected
+    // to be greater than the number of nonzeroes of most rows.
+    for (Variables_Set::const_iterator v_it = candidate_variables.begin(),
+            v_end = candidate_variables.end(); v_it != v_end; ++v_it) {
+      if (*v_it >= input_cs[i]->space_dimension())
+        break;
+      if (input_cs[i]->coefficient(Variable(*v_it)) != 0)
+        ++num_appearances[*v_it];
+    }
+  }
+  for (Variables_Set::const_iterator v_it = candidate_variables.begin(),
+         v_end = candidate_variables.end(); v_it != v_end; ++v_it) {
+    const dimension_type n = num_appearances[*v_it];
+    if (n >= winning_num_appearances) {
+      winning_num_appearances = n;
+      branching_index = *v_it;
+    }
+  }
+  return false;
+}
+
+bool
+PPL::MIP_Problem::is_mip_satisfiable(MIP_Problem& mip,
+                                     const Variables_Set& i_vars,
+                                     Generator& p) {
+#if PPL_NOISY_SIMPLEX
+  ++mip_recursion_level;
+  std::cout << "MIP_Problem::is_mip_satisfiable(): "
+            << "entering recursion level " << mip_recursion_level
+            << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+  PPL_ASSERT(mip.integer_space_dimensions().empty());
+
+  // Solve the MIP problem.
+  if (!mip.is_lp_satisfiable()) {
+#if PPL_NOISY_SIMPLEX
+    std::cout << "MIP_Problem::is_mip_satisfiable(): "
+              << "exiting from recursion level " << mip_recursion_level
+              << "." << std::endl;
+    --mip_recursion_level;
+#endif // PPL_NOISY_SIMPLEX
+    return false;
+  }
+
+  PPL_DIRTY_TEMP(mpq_class, tmp_rational);
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff1);
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp_coeff2);
+  bool found_satisfiable_generator = true;
+  dimension_type non_int_dim;
+  p = mip.last_generator;
+  Coefficient_traits::const_reference p_divisor = p.divisor();
+
+#if PPL_SIMPLEX_USE_MIP_HEURISTIC
+  found_satisfiable_generator
+    = choose_branching_variable(mip, i_vars, non_int_dim);
+#else
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  // TODO: This can be optimized more, exploiting the (possible)
+  // sparseness of p, if the size of i_vars is expected to be greater than
+  // the number of nonzeroes in p in most cases.
+  for (Variables_Set::const_iterator v_begin = i_vars.begin(),
+         v_end = i_vars.end(); v_begin != v_end; ++v_begin) {
+    gcd_assign(gcd, p.coefficient(Variable(*v_begin)), p_divisor);
+    if (gcd != p_divisor) {
+      non_int_dim = *v_begin;
+      found_satisfiable_generator = false;
+      break;
+    }
+  }
+#endif
+
+  if (found_satisfiable_generator)
+    return true;
+
+  PPL_ASSERT(non_int_dim < mip.space_dimension());
+
+  assign_r(tmp_rational.get_num(), p.coefficient(Variable(non_int_dim)),
+           ROUND_NOT_NEEDED);
+  assign_r(tmp_rational.get_den(), p_divisor, ROUND_NOT_NEEDED);
+  tmp_rational.canonicalize();
+  assign_r(tmp_coeff1, tmp_rational, ROUND_DOWN);
+  assign_r(tmp_coeff2, tmp_rational, ROUND_UP);
+  {
+    MIP_Problem mip_aux(mip, Inherit_Constraints());
+    mip_aux.add_constraint(Variable(non_int_dim) <= tmp_coeff1);
+#if PPL_NOISY_SIMPLEX
+    using namespace IO_Operators;
+    std::cout << "MIP_Problem::is_mip_satisfiable(): "
+              << "descending with: "
+              << (Variable(non_int_dim) <= tmp_coeff1)
+              << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+    if (is_mip_satisfiable(mip_aux, i_vars, p)) {
+#if PPL_NOISY_SIMPLEX
+      std::cout << "MIP_Problem::is_mip_satisfiable(): "
+                << "exiting from recursion level " << mip_recursion_level
+                << "." << std::endl;
+      --mip_recursion_level;
+#endif // PPL_NOISY_SIMPLEX
+      return true;
+    }
+  }
+  mip.add_constraint(Variable(non_int_dim) >= tmp_coeff2);
+#if PPL_NOISY_SIMPLEX
+  using namespace IO_Operators;
+  std::cout << "MIP_Problem::is_mip_satisfiable(): "
+            << "descending with: "
+            << (Variable(non_int_dim) >= tmp_coeff2)
+            << "." << std::endl;
+#endif // PPL_NOISY_SIMPLEX
+  const bool satisfiable = is_mip_satisfiable(mip, i_vars, p);
+#if PPL_NOISY_SIMPLEX
+  std::cout << "MIP_Problem::is_mip_satisfiable(): "
+            << "exiting from recursion level " << mip_recursion_level
+            << "." << std::endl;
+  --mip_recursion_level;
+#endif // PPL_NOISY_SIMPLEX
+  return satisfiable;
+}
+
+bool
+PPL::MIP_Problem::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+  const dimension_type input_cs_num_rows = input_cs.size();
+
+  // Check that every member used is OK.
+
+  if (inherited_constraints > input_cs_num_rows) {
+#ifndef NDEBUG
+    cerr << "The MIP_Problem claims to have inherited from its ancestors "
+         << "more constraints than are recorded in this->input_cs."
+         << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (first_pending_constraint > input_cs_num_rows) {
+#ifndef NDEBUG
+    cerr << "The MIP_Problem claims to have pending constraints "
+         << "that are not recorded in this->input_cs."
+         << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (!tableau.OK() || !last_generator.OK())
+    return false;
+
+  // Constraint system should contain no strict inequalities.
+  for (dimension_type i = input_cs_num_rows; i-- > 0; )
+    if (input_cs[i]->is_strict_inequality()) {
+#ifndef NDEBUG
+      cerr << "The feasible region of the MIP_Problem is defined by "
+           << "a constraint system containing strict inequalities."
+           << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+  if (external_space_dim < internal_space_dim) {
+#ifndef NDEBUG
+    cerr << "The MIP_Problem claims to have an internal space dimension "
+         << "greater than its external space dimension."
+         << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (external_space_dim > internal_space_dim
+      && status != UNSATISFIABLE
+      && status != PARTIALLY_SATISFIABLE) {
+#ifndef NDEBUG
+    cerr << "The MIP_Problem claims to have a pending space dimension "
+         << "addition, but the status is incompatible."
+         << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  // Constraint system and objective function should be dimension compatible.
+  if (external_space_dim < input_obj_function.space_dimension()) {
+#ifndef NDEBUG
+    cerr << "The MIP_Problem and the objective function have "
+         << "incompatible space dimensions ("
+         << external_space_dim << " < "
+         << input_obj_function.space_dimension() << ")."
+         << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (status != UNSATISFIABLE && initialized) {
+    // Here `last_generator' has to be meaningful.
+    // Check for dimension compatibility and actual feasibility.
+    if (internal_space_dim != last_generator.space_dimension()) {
+#ifndef NDEBUG
+      cerr << "The MIP_Problem and the cached feasible point have "
+           << "incompatible space dimensions ("
+           << internal_space_dim << " != "
+           << last_generator.space_dimension() << ")."
+           << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+    for (dimension_type i = 0; i < first_pending_constraint; ++i)
+      if (!is_satisfied(*(input_cs[i]), last_generator)) {
+#ifndef NDEBUG
+        cerr << "The cached feasible point does not belong to "
+             << "the feasible region of the MIP_Problem."
+             << endl;
+        ascii_dump(cerr);
+#endif
+        return false;
+      }
+
+    // Check that every integer declared variable is really integer.
+    // in the solution found.
+    if (!i_variables.empty()) {
+      PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+      // TODO: This can be optimized more, exploiting the (possible)
+      // sparseness of last_generator, if the size of i_variables is expected
+      // to be greater than the number of nonzeroes in last_generator in most
+      // cases.
+      for (Variables_Set::const_iterator v_it = i_variables.begin(),
+             v_end = i_variables.end(); v_it != v_end; ++v_it) {
+        gcd_assign(gcd, last_generator.coefficient(Variable(*v_it)),
+                   last_generator.divisor());
+        if (gcd != last_generator.divisor())
+          return false;
+      }
+    }
+
+    const dimension_type tableau_num_rows = tableau.num_rows();
+    const dimension_type tableau_num_columns = tableau.num_columns();
+
+    // The number of rows in the tableau and base should be equal.
+    if (tableau_num_rows != base.size()) {
+#ifndef NDEBUG
+      cerr << "tableau and base have incompatible sizes" << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+    // The size of `mapping' should be equal to the internal
+    // space dimension plus one.
+    if (mapping.size() != internal_space_dim + 1) {
+#ifndef NDEBUG
+      cerr << "The internal space dimension and `mapping' "
+           << "have incompatible sizes" << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+    // The number of columns in the tableau and working_cost should be equal.
+    if (tableau_num_columns != working_cost.size()) {
+#ifndef NDEBUG
+      cerr << "tableau and working_cost have incompatible sizes" << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+    // The vector base should contain indices of tableau's columns.
+    for (dimension_type i = base.size(); i-- > 0; ) {
+      if (base[i] > tableau_num_columns) {
+#ifndef NDEBUG
+        cerr << "base contains an invalid column index" << endl;
+        ascii_dump(cerr);
+#endif
+        return false;
+      }
+    }
+    {
+      // Needed to sort accesses to tableau_j, improving performance.
+      typedef std::vector<std::pair<dimension_type, dimension_type> >
+        pair_vector_t;
+      pair_vector_t vars_in_base;
+      for (dimension_type i = base.size(); i-- > 0; )
+        vars_in_base.push_back(std::make_pair(base[i], i));
+
+      std::sort(vars_in_base.begin(), vars_in_base.end());
+
+      for (dimension_type j = tableau_num_rows; j-- > 0; ) {
+        const Row& tableau_j = tableau[j];
+        pair_vector_t::iterator i = vars_in_base.begin();
+        pair_vector_t::iterator i_end = vars_in_base.end();
+        Row::const_iterator itr = tableau_j.begin();
+        Row::const_iterator itr_end = tableau_j.end();
+        for ( ; i != i_end && itr != itr_end; ++i) {
+          // tableau[i][base[j]], with i different from j, must be zero.
+          if (itr.index() < i->first)
+            itr = tableau_j.lower_bound(itr, itr.index());
+          if (i->second != j && itr.index() == i->first && *itr != 0) {
+#ifndef NDEBUG
+            cerr << "tableau[i][base[j]], with i different from j, must be "
+                 << "zero" << endl;
+            ascii_dump(cerr);
+#endif
+            return false;
+          }
+        }
+      }
+    }
+    // tableau[i][base[i]] must not be a zero.
+    for (dimension_type i = base.size(); i-- > 0; ) {
+      if (tableau[i].get(base[i]) == 0) {
+#ifndef NDEBUG
+        cerr << "tableau[i][base[i]] must not be a zero" << endl;
+        ascii_dump(cerr);
+#endif
+        return false;
+      }
+    }
+
+    // The last column of the tableau must contain only zeroes.
+    for (dimension_type i = tableau_num_rows; i-- > 0; )
+      if (tableau[i].get(tableau_num_columns - 1) != 0) {
+#ifndef NDEBUG
+        cerr << "the last column of the tableau must contain only"
+          "zeroes"<< endl;
+        ascii_dump(cerr);
+#endif
+        return false;
+      }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+void
+PPL::MIP_Problem::ascii_dump(std::ostream& s) const {
+  using namespace IO_Operators;
+  s << "\nexternal_space_dim: " << external_space_dim << " \n";
+  s << "\ninternal_space_dim: " << internal_space_dim << " \n";
+
+  const dimension_type input_cs_size = input_cs.size();
+
+  s << "\ninput_cs( " << input_cs_size << " )\n";
+  for (dimension_type i = 0; i < input_cs_size; ++i)
+    input_cs[i]->ascii_dump(s);
+
+  s << "\ninherited_constraints: " <<  inherited_constraints
+    << std::endl;
+
+  s << "\nfirst_pending_constraint: " <<  first_pending_constraint
+    << std::endl;
+
+  s << "\ninput_obj_function\n";
+  input_obj_function.ascii_dump(s);
+  s << "\nopt_mode "
+    << ((opt_mode == MAXIMIZATION) ? "MAXIMIZATION" : "MINIMIZATION") << "\n";
+
+  s << "\ninitialized: " << (initialized ? "YES" : "NO") << "\n";
+  s << "\npricing: ";
+  switch (pricing) {
+  case PRICING_STEEPEST_EDGE_FLOAT:
+    s << "PRICING_STEEPEST_EDGE_FLOAT";
+    break;
+  case PRICING_STEEPEST_EDGE_EXACT:
+    s << "PRICING_STEEPEST_EDGE_EXACT";
+    break;
+  case PRICING_TEXTBOOK:
+    s << "PRICING_TEXTBOOK";
+    break;
+  }
+  s << "\n";
+
+  s << "\nstatus: ";
+  switch (status) {
+  case UNSATISFIABLE:
+    s << "UNSATISFIABLE";
+    break;
+  case SATISFIABLE:
+    s << "SATISFIABLE";
+    break;
+  case UNBOUNDED:
+    s << "UNBOUNDED";
+    break;
+  case OPTIMIZED:
+    s << "OPTIMIZED";
+    break;
+  case PARTIALLY_SATISFIABLE:
+    s << "PARTIALLY_SATISFIABLE";
+    break;
+  }
+  s << "\n";
+
+  s << "\ntableau\n";
+  tableau.ascii_dump(s);
+  s << "\nworking_cost( " << working_cost.size()<< " )\n";
+  working_cost.ascii_dump(s);
+
+  const dimension_type base_size = base.size();
+  s << "\nbase( " << base_size << " )\n";
+  for (dimension_type i = 0; i != base_size; ++i)
+    s << base[i] << ' ';
+
+  s << "\nlast_generator\n";
+  last_generator.ascii_dump(s);
+
+  const dimension_type mapping_size = mapping.size();
+  s << "\nmapping( " << mapping_size << " )\n";
+  for (dimension_type i = 1; i < mapping_size; ++i)
+    s << "\n"<< i << " -> " << mapping[i].first << " -> " << mapping[i].second
+      << ' ';
+
+  s << "\n\ninteger_variables";
+  i_variables.ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS(MIP_Problem)
+
+bool
+PPL::MIP_Problem::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "external_space_dim:")
+    return false;
+
+  if (!(s >> external_space_dim))
+    return false;
+
+  if (!(s >> str) || str != "internal_space_dim:")
+    return false;
+
+  if (!(s >> internal_space_dim))
+    return false;
+
+  if (!(s >> str) || str != "input_cs(")
+    return false;
+
+  dimension_type input_cs_size;
+
+  if (!(s >> input_cs_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  Constraint c(Constraint::zero_dim_positivity());
+  input_cs.reserve(input_cs_size);
+  for (dimension_type i = 0; i < input_cs_size; ++i) {
+    if (!c.ascii_load(s))
+      return false;
+    add_constraint_helper(c);
+  }
+
+  if (!(s >> str) || str != "inherited_constraints:")
+    return false;
+
+  if (!(s >> inherited_constraints))
+    return false;
+  // NOTE: we loaded the number of inherited constraints, but we nonetheless
+  // reset to zero the corresponding data member, since we do not support
+  // constraint inheritance via ascii_load.
+  inherited_constraints = 0;
+
+  if (!(s >> str) || str != "first_pending_constraint:")
+    return false;
+
+  if (!(s >> first_pending_constraint))
+    return false;
+
+  if (!(s >> str) || str != "input_obj_function")
+    return false;
+
+  if (!input_obj_function.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "opt_mode")
+    return false;
+
+  if (!(s >> str))
+    return false;
+
+  if (str == "MAXIMIZATION")
+    set_optimization_mode(MAXIMIZATION);
+  else {
+    if (str != "MINIMIZATION")
+      return false;
+    set_optimization_mode(MINIMIZATION);
+  }
+
+  if (!(s >> str) || str != "initialized:")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "YES")
+    initialized = true;
+  else if (str == "NO")
+    initialized = false;
+  else
+    return false;
+
+  if (!(s >> str) || str != "pricing:")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "PRICING_STEEPEST_EDGE_FLOAT")
+    pricing = PRICING_STEEPEST_EDGE_FLOAT;
+  else if (str == "PRICING_STEEPEST_EDGE_EXACT")
+    pricing = PRICING_STEEPEST_EDGE_EXACT;
+  else if (str == "PRICING_TEXTBOOK")
+    pricing = PRICING_TEXTBOOK;
+  else
+    return false;
+
+  if (!(s >> str) || str != "status:")
+    return false;
+
+  if (!(s >> str))
+    return false;
+
+  if (str == "UNSATISFIABLE")
+    status = UNSATISFIABLE;
+  else if (str == "SATISFIABLE")
+    status = SATISFIABLE;
+  else if (str == "UNBOUNDED")
+    status = UNBOUNDED;
+  else if (str == "OPTIMIZED")
+    status = OPTIMIZED;
+  else if (str == "PARTIALLY_SATISFIABLE")
+    status = PARTIALLY_SATISFIABLE;
+  else
+    return false;
+
+  if (!(s >> str) || str != "tableau")
+    return false;
+
+  if (!tableau.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "working_cost(")
+    return false;
+
+  dimension_type working_cost_dim;
+
+  if (!(s >> working_cost_dim))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  if (!working_cost.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "base(")
+    return false;
+
+  dimension_type base_size;
+  if (!(s >> base_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  for (dimension_type i = 0; i != base_size; ++i) {
+    dimension_type base_value;
+    if (!(s >> base_value))
+      return false;
+    base.push_back(base_value);
+  }
+
+  if (!(s >> str) || str != "last_generator")
+    return false;
+
+  if (!last_generator.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "mapping(")
+    return false;
+
+  dimension_type mapping_size;
+  if (!(s >> mapping_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  // The first `mapping' index is never used, so we initialize
+  // it pushing back a dummy value.
+  if (tableau.num_columns() != 0)
+    mapping.push_back(std::make_pair(0, 0));
+
+  for (dimension_type i = 1; i < mapping_size; ++i) {
+    dimension_type index;
+    if (!(s >> index))
+      return false;
+
+    if (!(s >> str) || str != "->")
+      return false;
+
+    dimension_type first_value;
+    if (!(s >> first_value))
+      return false;
+
+    if (!(s >> str) || str != "->")
+      return false;
+
+    dimension_type second_value;
+    if (!(s >> second_value))
+      return false;
+
+    mapping.push_back(std::make_pair(first_value, second_value));
+  }
+
+  if (!(s >> str) || str != "integer_variables")
+    return false;
+
+  if (!i_variables.ascii_load(s))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const MIP_Problem& mip) {
+  s << "Constraints:";
+  for (MIP_Problem::const_iterator i = mip.constraints_begin(),
+         i_end = mip.constraints_end(); i != i_end; ++i)
+    s << "\n" << *i;
+  s << "\nObjective function: "
+    << mip.objective_function()
+    << "\nOptimization mode: "
+    << ((mip.optimization_mode() == MAXIMIZATION)
+        ? "MAXIMIZATION"
+        : "MINIMIZATION");
+  s << "\nInteger variables: " << mip.integer_space_dimensions();
+  return s;
+}
diff --git a/src/MIP_Problem_defs.hh b/src/MIP_Problem_defs.hh
new file mode 100644
index 0000000..989838f
--- /dev/null
+++ b/src/MIP_Problem_defs.hh
@@ -0,0 +1,975 @@
+/* MIP_Problem class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_MIP_Problem_defs_hh
+#define PPL_MIP_Problem_defs_hh 1
+
+#include "MIP_Problem_types.hh"
+#include "globals_types.hh"
+#include "Matrix_defs.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+#include <vector>
+#include <deque>
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const MIP_Problem& mip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates MIP_Problem */
+void swap(MIP_Problem& x, MIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+  An object of this class encodes a mixed integer (linear) programming
+  problem.
+  The MIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the feasible region, by means of a finite set of linear equality
+     and non-strict inequality constraints;
+   - the subset of the unknown variables that range over the integers
+     (the other variables implicitly ranging over the reals);
+   - the objective function, described by a Linear_Expression;
+   - the optimization mode (either maximization or minimization).
+
+  The class provides support for the (incremental) solution of the
+  MIP problem based on variations of the revised simplex method and
+  on branch-and-bound techniques. The result of the resolution
+  process is expressed in terms of an enumeration, encoding the
+  feasibility and the unboundedness of the optimization problem.
+  The class supports simple feasibility tests (i.e., no optimization),
+  as well as the extraction of an optimal (resp., feasible) point,
+  provided the MIP_Problem is optimizable (resp., feasible).
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given MIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of constraints,
+  the change of objective function and the change of optimization mode.
+*/
+class Parma_Polyhedra_Library::MIP_Problem {
+public:
+  //! Builds a trivial MIP problem.
+  /*!
+    A trivial MIP problem requires to maximize the objective function
+    \f$0\f$ on a vector space under no constraints at all:
+    the origin of the vector space is an optimal solution.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this
+    (optional argument with default value \f$0\f$).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+  explicit MIP_Problem(dimension_type dim = 0);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode;
+    those dimensions whose indices occur in \p int_vars are
+    constrained to take an integer value.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param int_vars
+    The set of variables' indexes that are constrained to take integer values.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality,
+    if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) or the space dimension
+    of the integer variable set is strictly greater than \p dim.
+  */
+  template <typename In>
+  MIP_Problem(dimension_type dim,
+              In first, In last,
+              const Variables_Set& int_vars,
+              const Linear_Expression& obj = Linear_Expression::zero(),
+              Optimization_Mode mode = MAXIMIZATION);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality
+    or if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) is strictly
+    greater than \p dim.
+  */
+  template <typename In>
+  MIP_Problem(dimension_type dim,
+              In first, In last,
+              const Linear_Expression& obj = Linear_Expression::zero(),
+              Optimization_Mode mode = MAXIMIZATION);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim from the constraint
+    system \p cs, the objective function \p obj and optimization mode \p mode.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param cs
+    The constraint system defining the feasible region.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system contains any strict inequality
+    or if the space dimension of the constraint system (resp., the
+    objective function) is strictly greater than \p dim.
+  */
+  MIP_Problem(dimension_type dim,
+              const Constraint_System& cs,
+              const Linear_Expression& obj = Linear_Expression::zero(),
+              Optimization_Mode mode = MAXIMIZATION);
+
+  //! Ordinary copy constructor.
+  MIP_Problem(const MIP_Problem& y);
+
+  //! Destructor.
+  ~MIP_Problem();
+
+  //! Assignment operator.
+  MIP_Problem& operator=(const MIP_Problem& y);
+
+  //! Returns the maximum space dimension an MIP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the MIP problem.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a set containing all the variables' indexes constrained
+    to be integral.
+  */
+  const Variables_Set& integer_space_dimensions() const;
+
+private:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint*> Constraint_Sequence;
+
+public:
+  //! A read-only iterator on the constraints defining the feasible region.
+  class const_iterator {
+  private:
+    typedef Constraint_Sequence::const_iterator Base;
+    typedef std::iterator_traits<Base> Base_Traits;
+  public:
+    typedef Base_Traits::iterator_category iterator_category;
+    typedef Base_Traits::difference_type difference_type;
+    typedef const Constraint value_type;
+    typedef const Constraint* pointer;
+    typedef const Constraint& reference;
+
+    //! Iterator difference: computes distances.
+    difference_type operator-(const const_iterator& y) const;
+
+    //! Prefix increment.
+    const_iterator& operator++();
+
+    //! Prefix decrement.
+    const_iterator& operator--();
+
+    //! Postfix increment.
+    const_iterator operator++(int);
+
+    //! Postfix decrement.
+    const_iterator operator--(int);
+
+    //! Moves iterator forward of \p n positions.
+    const_iterator& operator+=(difference_type n);
+
+    //! Moves iterator backward of \p n positions.
+    const_iterator& operator-=(difference_type n);
+
+    //! Returns an iterator \p n positions forward.
+    const_iterator operator+(difference_type n) const;
+
+    //! Returns an iterator \p n positions backward.
+    const_iterator operator-(difference_type n) const;
+
+    //! Returns a reference to the "pointed" object.
+    reference operator*() const;
+
+    //! Returns the address of the "pointed" object.
+    pointer operator->() const;
+
+    //! Compares \p *this with y.
+    /*!
+      \param y
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    //! Compares \p *this with y.
+    /*!
+      \param y
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    //! Constructor from a Base iterator.
+    explicit const_iterator(Base base);
+
+    //! The Base iterator on the Constraint_Sequence.
+    Base itr;
+
+    friend class MIP_Problem;
+  };
+
+  /*! \brief
+    Returns a read-only iterator to the first constraint defining
+    the feasible region.
+  */
+  const_iterator constraints_begin() const;
+
+  /*! \brief
+    Returns a past-the-end read-only iterator to the sequence of
+    constraints defining the feasible region.
+  */
+  const_iterator constraints_end() const;
+
+  //! Returns the objective function.
+  const Linear_Expression& objective_function() const;
+
+  //! Returns the optimization mode.
+  Optimization_Mode optimization_mode() const;
+
+  //! Resets \p *this to be equal to the trivial MIP problem.
+  /*!
+    The space dimension is reset to \f$0\f$.
+  */
+  void clear();
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old MIP problem
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new MIP problem; they are initially unconstrained.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Sets the variables whose indexes are in set \p i_vars to be
+    integer space dimensions.
+
+    \exception std::invalid_argument
+    Thrown if some index in \p i_vars does not correspond to
+    a space dimension in \p *this.
+  */
+  void add_to_integer_space_dimensions(const Variables_Set& i_vars);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint \p c is a strict inequality or if its space
+    dimension is strictly greater than the space dimension of \p *this.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains any strict inequality
+    or if its space dimension is strictly greater than the space dimension
+    of \p *this.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Sets the objective function to \p obj.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p obj is strictly greater than
+    the space dimension of \p *this.
+  */
+  void set_objective_function(const Linear_Expression& obj);
+
+  //! Sets the optimization mode to \p mode.
+  void set_optimization_mode(Optimization_Mode mode);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the MIP problem.
+  /*!
+    \return
+    An MIP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible, unbounded or optimized problem).
+  */
+  MIP_Problem_Status solve() const;
+
+  /*! \brief
+    Sets \p num and \p denom so that
+    \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the result of
+    evaluating the objective function on \p evaluating_point.
+
+    \param evaluating_point
+    The point on which the objective function will be evaluated.
+
+    \param numer
+    On exit will contain the numerator of the evaluated value.
+
+    \param denom
+    On exit will contain the denominator of the evaluated value.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p evaluating_point are dimension-incompatible
+    or if the generator \p evaluating_point is not a point.
+  */
+  void evaluate_objective_function(const Generator& evaluating_point,
+                                   Coefficient& numer,
+                                   Coefficient& denom) const;
+
+  //! Returns a feasible point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if the MIP problem is not satisfiable.
+  */
+  const Generator& feasible_point() const;
+
+  //! Returns an optimal point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if \p *this does not not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  const Generator& optimizing_point() const;
+
+  /*! \brief
+    Sets \p numer and \p denom so that
+    \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the solution of the
+    optimization problem.
+
+    \exception std::domain_error
+    Thrown if \p *this does not not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  void optimal_value(Coefficient& numer, Coefficient& denom) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(MIP_Problem& y);
+
+  //! Names of MIP problems' control parameters.
+  enum Control_Parameter_Name {
+    //! The pricing rule.
+    PRICING
+  };
+
+  //! Possible values for MIP problem's control parameters.
+  enum Control_Parameter_Value {
+    //! Steepest edge pricing method, using floating points (default).
+    PRICING_STEEPEST_EDGE_FLOAT,
+    //! Steepest edge pricing method, using Coefficient.
+    PRICING_STEEPEST_EDGE_EXACT,
+    //! Textbook pricing method.
+    PRICING_TEXTBOOK
+  };
+
+  //! Returns the value of the control parameter \p name.
+  Control_Parameter_Value
+  get_control_parameter(Control_Parameter_Name name) const;
+
+  //! Sets control parameter \p value.
+  void set_control_parameter(Control_Parameter_Value value);
+
+private:
+  //! The dimension of the vector space.
+  dimension_type external_space_dim;
+
+  /*! \brief
+    The space dimension of the current (partial) solution of the
+    MIP problem; it may be smaller than \p external_space_dim.
+  */
+  dimension_type internal_space_dim;
+
+#if PPL_USE_SPARSE_MATRIX
+  typedef Sparse_Row Row;
+#else
+  typedef Dense_Row Row;
+#endif
+
+  //! The matrix encoding the current feasible region in tableau form.
+  Matrix<Row> tableau;
+
+  typedef Row working_cost_type;
+
+  //! The working cost function.
+  working_cost_type working_cost;
+
+  //! A map between the variables of `input_cs' and `tableau'.
+  /*!
+    Contains all the pairs (i, j) such that mapping[i].first encodes the index
+    of the column in the tableau where input_cs[i] is stored; if
+    mapping[i].second is not a zero, it encodes the split part of the tableau
+    of input_cs[i].
+    The "positive" one is represented by mapping[i].first and the "negative"
+    one is represented by mapping[i].second.
+  */
+  std::vector<std::pair<dimension_type, dimension_type> > mapping;
+
+  //! The current basic solution.
+  std::vector<dimension_type> base;
+
+  //! An enumerated type describing the internal status of the MIP problem.
+  enum Status {
+    //! The MIP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The MIP problem is satisfiable; a feasible solution has been computed.
+    SATISFIABLE,
+    //! The MIP problem is unbounded; a feasible solution has been computed.
+    UNBOUNDED,
+    //! The MIP problem is optimized; an optimal solution has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the MIP problem has been changed by adding
+      new space dimensions or new constraints; a feasible solution for
+      the old feasible region is still available.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the MIP problem.
+  Status status;
+
+  // TODO: merge `status', `initialized', `pricing' and (maybe) `opt_mode'
+  // into a single bitset status word, so as to save space and allow
+  // for other control parameters.
+
+  //! The pricing method in use.
+  Control_Parameter_Value pricing;
+
+  /*! \brief
+    A Boolean encoding whether or not internal data structures have
+    already been properly sized and populated: useful to allow for
+    deeper checks in method OK().
+  */
+  bool initialized;
+
+  //! The sequence of constraints describing the feasible region.
+  std::vector<Constraint*> input_cs;
+
+  /*! \brief
+    The number of constraints that are inherited from our parent
+    in the recursion tree built when solving via branch-and-bound.
+
+    The first \c inherited_constraints elements in \c input_cs point to
+    the inherited constraints, whose resources are owned by our ancestors.
+    The resources of the other elements in \c input_cs are owned by \c *this
+    and should be appropriately released on destruction.
+  */
+  dimension_type inherited_constraints;
+
+  //! The first index of `input_cs' containing a pending constraint.
+  dimension_type first_pending_constraint;
+
+  //! The objective function to be optimized.
+  Linear_Expression input_obj_function;
+
+  //! The optimization mode requested.
+  Optimization_Mode opt_mode;
+
+  //! The last successfully computed feasible or optimizing point.
+  Generator last_generator;
+
+  /*! \brief
+    A set containing all the indexes of variables that are constrained
+    to have an integer value.
+  */
+  Variables_Set i_variables;
+
+  //! A helper class to temporarily relax a MIP problem using RAII.
+  struct RAII_Temporary_Real_Relaxation {
+    MIP_Problem& lp;
+    Variables_Set i_vars;
+
+    RAII_Temporary_Real_Relaxation(MIP_Problem& mip)
+      : lp(mip), i_vars() {
+      // Turn mip into an LP problem (saving i_variables in i_vars).
+      using std::swap;
+      swap(i_vars, lp.i_variables);
+    }
+
+    ~RAII_Temporary_Real_Relaxation() {
+      // Restore the original set of integer variables.
+      using std::swap;
+      swap(i_vars, lp.i_variables);
+    }
+  };
+  friend struct RAII_Temporary_Real_Relaxation;
+
+  //! A tag type to distinguish normal vs. inheriting copy constructor.
+  struct Inherit_Constraints {};
+
+  //! Copy constructor inheriting constraints.
+  MIP_Problem(const MIP_Problem& y, Inherit_Constraints);
+
+  //! Helper method: implements exception safe addition.
+  void add_constraint_helper(const Constraint& c);
+
+  //! Processes the pending constraints of \p *this.
+  void process_pending_constraints();
+
+  /*! \brief
+    Optimizes the MIP problem using the second phase of the
+    primal simplex algorithm.
+  */
+  void second_phase();
+
+  /*! \brief
+    Assigns to \p this->tableau a simplex tableau representing the
+    MIP problem, inserting into \p this->mapping the information
+    that is required to recover the original MIP problem.
+
+    \return
+    <CODE>UNFEASIBLE_MIP_PROBLEM</CODE> if the constraint system contains
+    any trivially unfeasible constraint (tableau was not computed);
+    <CODE>UNBOUNDED_MIP_PROBLEM</CODE> if the problem is trivially unbounded
+    (the computed tableau contains no constraints);
+    <CODE>OPTIMIZED_MIP_PROBLEM></CODE> if the problem is neither trivially
+    unfeasible nor trivially unbounded (the tableau was computed
+    successfully).
+  */
+  MIP_Problem_Status
+  compute_tableau(std::vector<dimension_type>& worked_out_row);
+
+  /*! \brief
+    Parses the pending constraints to gather information on
+    how to resize the tableau.
+
+    \note
+    All of the method parameters are output parameters; their value
+    is only meaningful when the function exit returning value \c true.
+
+    \return
+    \c false if a trivially false constraint is detected, \c true otherwise.
+
+    \param additional_tableau_rows
+    On exit, this will store the number of rows that have to be added
+    to the original tableau.
+
+    \param additional_slack_variables
+    This will store the number of slack variables that have to be added
+    to the original tableau.
+
+    \param is_tableau_constraint
+    This container of Boolean flags is initially empty. On exit, it size
+    will be equal to the number of pending constraints in \c input_cs.
+    For each pending constraint index \c i, the corresponding element
+    of this container (having index <CODE>i - first_pending_constraint</CODE>)
+    will be set to \c true if and only if the constraint has to be included
+    in the tableau.
+
+    \param is_satisfied_inequality
+    This container of Boolean flags is initially empty. On exit, its size
+    will be equal to the number of pending constraints in \c input_cs.
+    For each pending constraint index \c i, the corresponding element
+    of this container (having index <CODE>i - first_pending_constraint</CODE>)
+    will be set to \c true if and only if it is an inequality and it
+    is already satisfied by \c last_generator (hence it does not require
+    the introduction of an artificial variable).
+
+    \param is_nonnegative_variable
+    This container of Boolean flags is initially empty.
+    On exit, it size is equal to \c external_space_dim.
+    For each variable (index), the corresponding element of this container
+    is \c true if the variable is known to be nonnegative (and hence should
+    not be split into a positive and a negative part).
+
+    \param is_remergeable_variable
+    This container of Boolean flags is initially empty.
+    On exit, it size is equal to \c internal_space_dim.
+    For each variable (index), the corresponding element of this container
+    is \c true if the variable was previously split into positive and
+    negative parts that can now be merged back, since it is known
+    that the variable is nonnegative.
+  */
+  bool parse_constraints(dimension_type& additional_tableau_rows,
+                         dimension_type& additional_slack_variables,
+                         std::deque<bool>& is_tableau_constraint,
+                         std::deque<bool>& is_satisfied_inequality,
+                         std::deque<bool>& is_nonnegative_variable,
+                         std::deque<bool>& is_remergeable_variable) const;
+
+  /*! \brief
+    Computes the row index of the variable exiting the base
+    of the MIP problem. Implemented with anti-cycling rule.
+
+    \return
+    The row index of the variable exiting the base.
+
+    \param entering_var_index
+    The column index of the variable entering the base.
+  */
+  dimension_type
+  get_exiting_base_index(dimension_type entering_var_index) const;
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The row that will be combined with \p y object.
+
+    \param y
+    The row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Row to \p x and normalizes it.
+  */
+  static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+  // TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The row that will be combined with \p y object.
+
+    \param y
+    The row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Dense_Row to \p x and normalizes it.
+  */
+  static void linear_combine(Dense_Row& x, const Sparse_Row& y,
+                             const dimension_type k);
+
+#endif // defined(PPL_USE_SPARSE_MATRIX)
+
+  static bool is_unbounded_obj_function(
+    const Linear_Expression& obj_function,
+    const std::vector<std::pair<dimension_type, dimension_type> >& mapping,
+    Optimization_Mode optimization_mode);
+
+  /*! \brief
+    Performs the pivoting operation on the tableau.
+
+    \param entering_var_index
+    The index of the variable entering the base.
+
+    \param exiting_base_index
+    The index of the row exiting the base.
+  */
+  void pivot(dimension_type entering_var_index,
+             dimension_type exiting_base_index);
+
+  /*! \brief
+    Computes the column index of the variable entering the base,
+    using the textbook algorithm with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base.
+    If no such variable exists, optimality was achieved
+    and <CODE>0</CODE> is returned.
+  */
+  dimension_type textbook_entering_index() const;
+
+  /*! \brief
+    Computes the column index of the variable entering the base,
+    using an exact steepest-edge algorithm with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base.
+    If no such variable exists, optimality was achieved
+    and <CODE>0</CODE> is returned.
+
+    To compute the entering_index, the steepest edge algorithm chooses
+    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+    largest in absolute value, where
+    \f[
+      \|\Delta x^{j} \|
+        = \left(
+            1+\sum_{i=1}^{m} \alpha_{ij}^2
+          \right)^{\frac{1}{2}}.
+    \f]
+    Recall that, due to the exact integer implementation of the algorithm,
+    our tableau does not contain the ``real'' \f$\alpha\f$ values, but these
+    can be computed dividing the value of the coefficient by the value of
+    the variable in base. Obviously the result may not be an integer, so
+    we will proceed in another way: we compute the lcm of all the variables
+    in base to get the good ``weight'' of each Coefficient of the tableau.
+  */
+  dimension_type steepest_edge_exact_entering_index() const;
+
+  /*! \brief
+    Same as steepest_edge_exact_entering_index,
+    but using floating points.
+
+    \note
+    Due to rounding errors, the index of the variable entering the base
+    of the MIP problem is not predictable across different architectures.
+    Hence, the overall simplex computation may differ in the path taken
+    to reach the optimum. Anyway, the exact final result will be computed
+    for the MIP_Problem.
+  */
+  dimension_type steepest_edge_float_entering_index() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+
+    \note
+    Uses an exact pricing method (either textbook or exact steepest edge),
+    so that the result is deterministic across different architectures.
+  */
+  bool compute_simplex_using_exact_pricing();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+
+    \note
+    Uses a floating point implementation of the steepest edge pricing
+    method, so that the result is correct, but not deterministic across
+    different architectures.
+  */
+  bool compute_simplex_using_steepest_edge_float();
+
+  /*! \brief
+    Drop unnecessary artificial variables from the tableau and get ready
+    for the second phase of the simplex algorithm.
+
+    \note
+    The two parameters denote a STL-like half-open range.
+    It is assumed that \p begin_artificials is strictly greater than 0
+    and smaller than \p end_artificials.
+
+    \param begin_artificials
+    The start of the tableau column index range for artificial variables.
+
+    \param end_artificials
+    The end of the tableau column index range for artificial variables.
+    Note that column index end_artificial is \e excluded from the range.
+  */
+  void erase_artificials(dimension_type begin_artificials,
+                         dimension_type end_artificials);
+
+  bool is_in_base(dimension_type var_index,
+                  dimension_type& row_index) const;
+
+  /*! \brief
+    Computes a valid generator that satisfies all the constraints of the
+    Linear Programming problem associated to \p *this.
+  */
+  void compute_generator() const;
+
+  /*! \brief
+    Merges back the positive and negative part of a (previously split)
+    variable after detecting a corresponding nonnegativity constraint.
+
+    \return
+    If the negative part of \p var_index was in base, the index of
+    the corresponding tableau row (which has become non-feasible);
+    otherwise \c not_a_dimension().
+
+    \param var_index
+    The index of the variable that has to be merged.
+  */
+  dimension_type merge_split_variable(dimension_type var_index);
+
+  //! Returns <CODE>true</CODE> if and only if \p c is satisfied by \p g.
+  static bool is_satisfied(const Constraint& c, const Generator& g);
+
+  //! Returns <CODE>true</CODE> if and only if \p c is saturated by \p g.
+  static bool is_saturated(const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Returns a status that encodes the solution of the MIP problem.
+
+    \param have_incumbent_solution
+    It is used to store if the solving process has found a provisional
+    optimum point.
+
+    \param incumbent_solution_value
+    Encodes the evaluated value of the provisional optimum point found.
+
+    \param incumbent_solution_point
+    If the method returns `OPTIMIZED', this will contain the optimality point.
+
+    \param mip
+    The problem that has to be solved.
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+  */
+  static MIP_Problem_Status solve_mip(bool& have_incumbent_solution,
+                                      mpq_class& incumbent_solution_value,
+                                      Generator& incumbent_solution_point,
+                                      MIP_Problem& mip,
+                                      const Variables_Set& i_vars);
+
+  /*! \brief
+    Returns \c true if and if only the LP problem is satisfiable.
+  */
+  bool is_lp_satisfiable() const;
+
+  /*! \brief
+    Returns \c true if and if only the MIP problem \p mip is satisfiable
+    when variables in \p i_vars can only take integral values.
+
+    \param mip
+    The MIP problem. This is assumed to have no integral space dimension
+    (so that it is a pure LP problem).
+
+    \param i_vars
+    The variables that are constrained to take integral values.
+
+    \param p
+    If \c true is returned, it will encode a feasible point.
+  */
+  static bool is_mip_satisfiable(MIP_Problem& mip,
+                                 const Variables_Set& i_vars,
+                                 Generator& p);
+
+  /*! \brief
+    Returns \c true if and if only \c mip.last_generator satisfies all the
+    integrality conditions implicitly stated using by \p i_vars.
+
+    \param mip
+    The MIP problem. This is assumed to have no integral space dimension
+    (so that it is a pure LP problem).
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+
+    \param branching_index
+    If \c false is returned, this will encode the non-integral variable
+    index on which the `branch and bound' algorithm should be applied.
+  */
+  static bool choose_branching_variable(const MIP_Problem& mip,
+                                        const Variables_Set& i_vars,
+                                        dimension_type& branching_index);
+};
+
+#include "MIP_Problem_inlines.hh"
+#include "MIP_Problem_templates.hh"
+
+#endif // !defined(PPL_MIP_Problem_defs_hh)
diff --git a/src/MIP_Problem_inlines.hh b/src/MIP_Problem_inlines.hh
new file mode 100644
index 0000000..97b3cce
--- /dev/null
+++ b/src/MIP_Problem_inlines.hh
@@ -0,0 +1,321 @@
+/* MIP_Problem class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_MIP_Problem_inlines_hh
+#define PPL_MIP_Problem_inlines_hh 1
+
+#include "Constraint_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+MIP_Problem::max_space_dimension() {
+  return Constraint::max_space_dimension();
+}
+
+inline dimension_type
+MIP_Problem::space_dimension() const {
+  return external_space_dim;
+}
+
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    tableau(y.tableau),
+    working_cost(y.working_cost),
+    mapping(y.mapping),
+    base(y.base),
+    status(y.status),
+    pricing(y.pricing),
+    initialized(y.initialized),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(),
+    input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode),
+    last_generator(y.last_generator),
+    i_variables(y.i_variables) {
+  input_cs.reserve(y.input_cs.size());
+  for (Constraint_Sequence::const_iterator i = y.input_cs.begin(),
+         i_end = y.input_cs.end(); i != i_end; ++i)
+    add_constraint_helper(*(*i));
+  PPL_ASSERT(OK());
+}
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y, Inherit_Constraints)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    tableau(y.tableau),
+    working_cost(y.working_cost),
+    mapping(y.mapping),
+    base(y.base),
+    status(y.status),
+    pricing(y.pricing),
+    initialized(y.initialized),
+    input_cs(y.input_cs),
+    // NOTE: The constraints are inherited, NOT copied!
+    inherited_constraints(y.input_cs.size()),
+    first_pending_constraint(y.first_pending_constraint),
+    input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode),
+    last_generator(y.last_generator),
+    i_variables(y.i_variables) {
+  PPL_ASSERT(OK());
+}
+
+inline void
+MIP_Problem::add_constraint_helper(const Constraint& c) {
+  // For exception safety, reserve space for the new element.
+  const dimension_type size = input_cs.size();
+  if (size == input_cs.capacity()) {
+    const dimension_type max_size = input_cs.max_size();
+    if (size == max_size)
+      throw std::length_error("MIP_Problem::add_constraint(): "
+                              "too many constraints");
+    // Use an exponential grow policy to avoid too many reallocations.
+    input_cs.reserve(compute_capacity(size + 1, max_size));
+  }
+
+  // This operation does not throw, because the space for the new element
+  // has already been reserved: hence the new-ed Constraint is safe.
+  input_cs.push_back(new Constraint(c));
+}
+
+inline
+MIP_Problem::~MIP_Problem() {
+  // NOTE: do NOT delete inherited constraints; they are owned
+  // (and will eventually be deleted) by ancestors.
+  for (Constraint_Sequence::const_iterator
+         i = nth_iter(input_cs, inherited_constraints),
+         i_end = input_cs.end(); i != i_end; ++i)
+    delete *i;
+}
+
+
+inline void
+MIP_Problem::set_optimization_mode(const Optimization_Mode mode) {
+  if (opt_mode != mode) {
+    opt_mode = mode;
+    if (status == UNBOUNDED || status == OPTIMIZED)
+      status = SATISFIABLE;
+    PPL_ASSERT(OK());
+  }
+}
+
+inline const Linear_Expression&
+MIP_Problem::objective_function() const {
+  return input_obj_function;
+}
+
+inline Optimization_Mode
+MIP_Problem::optimization_mode() const {
+  return opt_mode;
+}
+
+inline void
+MIP_Problem::optimal_value(Coefficient& numer, Coefficient& denom) const {
+  const Generator& g = optimizing_point();
+  evaluate_objective_function(g, numer, denom);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_begin() const {
+  return const_iterator(input_cs.begin());
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_end() const {
+  return const_iterator(input_cs.end());
+}
+
+inline const Variables_Set&
+MIP_Problem::integer_space_dimensions() const {
+  return i_variables;
+}
+
+inline MIP_Problem::Control_Parameter_Value
+MIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+  PPL_USED(name);
+  PPL_ASSERT(name == PRICING);
+  return pricing;
+}
+
+inline void
+MIP_Problem::set_control_parameter(Control_Parameter_Value value) {
+  pricing = value;
+}
+
+inline void
+MIP_Problem::m_swap(MIP_Problem& y) {
+  using std::swap;
+  swap(external_space_dim, y.external_space_dim);
+  swap(internal_space_dim, y.internal_space_dim);
+  swap(tableau, y.tableau);
+  swap(working_cost, y.working_cost);
+  swap(mapping, y.mapping);
+  swap(initialized, y.initialized);
+  swap(base, y.base);
+  swap(status, y.status);
+  swap(pricing, y.pricing);
+  swap(input_cs, y.input_cs);
+  swap(inherited_constraints, y.inherited_constraints);
+  swap(first_pending_constraint, y.first_pending_constraint);
+  swap(input_obj_function, y.input_obj_function);
+  swap(opt_mode, y.opt_mode);
+  swap(last_generator, y.last_generator);
+  swap(i_variables, y.i_variables);
+}
+
+inline MIP_Problem&
+MIP_Problem::operator=(const MIP_Problem& y) {
+  MIP_Problem tmp(y);
+  m_swap(tmp);
+  return *this;
+}
+
+inline void
+MIP_Problem::clear() {
+  MIP_Problem tmp;
+  m_swap(tmp);
+}
+
+
+inline memory_size_type
+MIP_Problem::external_memory_in_bytes() const {
+  memory_size_type n
+    = working_cost.external_memory_in_bytes()
+    + tableau.external_memory_in_bytes()
+    + input_obj_function.external_memory_in_bytes()
+    + last_generator.external_memory_in_bytes();
+
+  // Adding the external memory for `input_cs'.
+  // NOTE: disregard inherited constraints, as they are owned by ancestors.
+  n += input_cs.capacity() * sizeof(Constraint*);
+  for (Constraint_Sequence::const_iterator
+         i = nth_iter(input_cs, inherited_constraints),
+         i_end = input_cs.end(); i != i_end; ++i)
+    n += ((*i)->total_memory_in_bytes());
+
+  // Adding the external memory for `base'.
+  n += base.capacity() * sizeof(dimension_type);
+  // Adding the external memory for `mapping'.
+  n += mapping.capacity() * sizeof(std::pair<dimension_type, dimension_type>);
+  return n;
+}
+
+inline memory_size_type
+MIP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+MIP_Problem::const_iterator::const_iterator(Base base)
+  : itr(base) {
+}
+
+inline MIP_Problem::const_iterator::difference_type
+MIP_Problem::const_iterator::operator-(const const_iterator& y) const {
+  return itr - y.itr;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator++() {
+  ++itr;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator--() {
+  --itr;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator++(int) {
+  const_iterator x = *this;
+  operator++();
+  return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator--(int) {
+  const_iterator x = *this;
+  operator--();
+  return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator+(difference_type n) const {
+  return const_iterator(itr + n);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator-(difference_type n) const {
+  return const_iterator(itr - n);
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator+=(difference_type n) {
+  itr += n;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator-=(difference_type n) {
+  itr -= n;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator::reference
+MIP_Problem::const_iterator::operator*() const {
+  return *(*itr);
+}
+
+inline MIP_Problem::const_iterator::pointer
+MIP_Problem::const_iterator::operator->() const {
+  return *itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator==(const const_iterator& y) const {
+  return itr == y.itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator!=(const const_iterator& y) const {
+  return itr != y.itr;
+}
+
+/*! \relates MIP_Problem */
+inline void
+swap(MIP_Problem& x, MIP_Problem& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_inlines_hh)
diff --git a/src/MIP_Problem_templates.hh b/src/MIP_Problem_templates.hh
new file mode 100644
index 0000000..123d2bc
--- /dev/null
+++ b/src/MIP_Problem_templates.hh
@@ -0,0 +1,181 @@
+/* MIP_Problem class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_MIP_Problem_templates_hh
+#define PPL_MIP_Problem_templates_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+MIP_Problem::MIP_Problem(const dimension_type dim,
+                         In first, In last,
+                         const Variables_Set& int_vars,
+                         const Linear_Expression& obj,
+                         const Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    pricing(PRICING_STEEPEST_EDGE_FLOAT),
+    initialized(false),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables(int_vars) {
+  // Check that integer Variables_Set does not exceed the space dimension
+  // of the problem.
+  if (i_variables.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem"
+      << "(dim, first, last, int_vars, obj, mode):\n"
+      << "dim == "<< external_space_dim << " and int_vars.space_dimension() =="
+      << " " << i_variables.space_dimension() << " are dimension"
+      "incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem:: MIP_Problem(dim, first, "
+                            "last, int_vars, obj, mode):\n"
+                            "dim exceeds the maximum allowed"
+                            "space dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+      << "int_vars, obj, mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds d == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraints.
+  try {
+    for (In i = first; i != last; ++i) {
+      if (i->is_strict_inequality())
+        throw std::invalid_argument("PPL::MIP_Problem::"
+                                    "MIP_Problem(dim, first, last, int_vars,"
+                                    "obj, mode):\nrange [first, last) contains"
+                                    "a strict inequality constraint.");
+      if (i->space_dimension() > dim) {
+        std::ostringstream s;
+        s << "PPL::MIP_Problem::"
+          << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+          << "range [first, last) contains a constraint having space"
+          << "dimension  == " << i->space_dimension() << " that exceeds"
+          "this->space_dimension == " << dim << ".";
+        throw std::invalid_argument(s.str());
+      }
+      add_constraint_helper(*i);
+    }
+  } catch (...) {
+    // Delete the allocated constraints, to avoid memory leaks.
+
+    for (Constraint_Sequence::const_iterator
+          i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+      delete *i;
+
+    throw;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename In>
+MIP_Problem::MIP_Problem(dimension_type dim,
+                         In first, In last,
+                         const Linear_Expression& obj,
+                         Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    pricing(PRICING_STEEPEST_EDGE_FLOAT),
+    initialized(false),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::"
+                            "MIP_Problem(dim, first, last, obj, mode):\n"
+                            "dim exceeds the maximum allowed space "
+                            "dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+      << " obj, mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds d == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraints.
+  try {
+    for (In i = first; i != last; ++i) {
+      if (i->is_strict_inequality())
+        throw std::invalid_argument("PPL::MIP_Problem::"
+                                    "MIP_Problem(dim, first, last, obj, mode):"
+                                    "\n"
+                                    "range [first, last) contains a strict "
+                                    "inequality constraint.");
+      if (i->space_dimension() > dim) {
+        std::ostringstream s;
+        s << "PPL::MIP_Problem::"
+          << "MIP_Problem(dim, first, last, obj, mode):\n"
+          << "range [first, last) contains a constraint having space"
+          << "dimension" << " == " << i->space_dimension() << " that exceeds"
+          "this->space_dimension == " << dim << ".";
+        throw std::invalid_argument(s.str());
+      }
+      add_constraint_helper(*i);
+    }
+  } catch (...) {
+    // Delete the allocated constraints, to avoid memory leaks.
+
+    for (Constraint_Sequence::const_iterator
+          i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+      delete *i;
+
+    throw;
+  }
+  PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_templates_hh)
diff --git a/src/MIP_Problem_types.hh b/src/MIP_Problem_types.hh
new file mode 100644
index 0000000..0ec632f
--- /dev/null
+++ b/src/MIP_Problem_types.hh
@@ -0,0 +1,33 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_MIP_Problem_types_hh
+#define PPL_MIP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum MIP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_MIP_PROBLEM,
+  //! The problem is unbounded.
+  UNBOUNDED_MIP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_MIP_PROBLEM
+};
+
+class MIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_MIP_Problem_types_hh)
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..8cd12b7
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,699 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Libtool -version-info for libppl.la.
+#
+#  1. Start with version information of `0:0:0' for each Libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    0:0:0
+#	    0.4			    1:0:1
+#	    0.5			    2:0:0
+#	    0.6			    3:0:0
+#	    0.7			    4:0:0
+#	    0.8			    5:0:0
+#	    0.9			    6:0:0
+#	    0.10		    7:0:0
+#	    0.10.1		    8:0:1
+#	    0.10.2		    8:0:1
+#	    0.11		    9:0:0
+#	    0.12		   10:0:0
+#	    0.12.1		   11:0:0
+#	    1.0			   12:0:0
+#	    1.1			   13:0:0
+
+LIBPPL_LT_CURRENT =  13
+LIBPPL_LT_REVISION =  0
+LIBPPL_LT_AGE =       0
+
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_srcdir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl.la
+
+bin_PROGRAMS = ppl-config
+
+ppl_config_SOURCES = \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+nodist_ppl_config_SOURCES = \
+ppl-config.cc \
+ppl.hh
+
+ppl_config_LDADD = \
+ at extra_libraries@ \
+libppl.la
+
+if USE_NATIVE_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif USE_NATIVE_INTEGERS
+
+if USE_CHECKED_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif USE_CHECKED_INTEGERS
+
+if USE_GMP_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES = \
+  GMP_Integer_types.hh
+
+COEFFICIENT_DEFS_INCLUDE_FILES = \
+  GMP_Integer_defs.hh \
+  GMP_Integer_inlines.hh
+
+endif USE_GMP_INTEGERS
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+assert.hh \
+meta_programming.hh \
+Slow_Copy.hh \
+Has_Assign_Or_Swap.hh \
+assign_or_swap.hh \
+mp_std_bits_defs.hh \
+mp_std_bits_inlines.hh \
+Concrete_Expression_types.hh \
+Concrete_Expression_defs.hh \
+Concrete_Expression_inlines.hh \
+Temp_defs.hh \
+Temp_inlines.hh \
+Temp_templates.hh \
+Coefficient_traits_template.hh \
+Checked_Number_types.hh \
+termination_types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient_types.hh \
+stdiobuf_types.hh \
+c_streambuf_types.hh \
+globals_types.hh \
+iterator_to_const_types.hh \
+distances_types.hh \
+Interval_Info_types.hh \
+Interval_types.hh \
+Box_types.hh \
+Constraint_types.hh \
+Generator_types.hh \
+Grid_Generator_types.hh \
+Congruence_types.hh \
+Init_types.hh \
+Dense_Row_types.hh \
+CO_Tree_types.hh \
+Sparse_Row_types.hh \
+Matrix_types.hh \
+Swapping_Vector_types.hh \
+Variable_types.hh \
+Variables_Set_types.hh \
+Linear_Expression_types.hh \
+Expression_Adapter_types.hh \
+Expression_Hide_Last_types.hh \
+Expression_Hide_Inhomo_types.hh \
+Linear_Expression_Impl_types.hh \
+Linear_Expression_Interface_types.hh \
+Linear_System_types.hh \
+Linear_Form_types.hh \
+Bit_Row_types.hh \
+Bit_Matrix_types.hh \
+Constraint_System_types.hh \
+Generator_System_types.hh \
+Grid_Generator_System_types.hh \
+Congruence_System_types.hh \
+Scalar_Products_types.hh \
+PIP_Tree_types.hh \
+PIP_Problem_types.hh \
+Poly_Con_Relation_types.hh \
+Poly_Gen_Relation_types.hh \
+BHRZ03_Certificate_types.hh \
+H79_Certificate_types.hh \
+Grid_Certificate_types.hh \
+Partial_Function_types.hh \
+Polyhedron_types.hh \
+C_Polyhedron_types.hh \
+NNC_Polyhedron_types.hh \
+Grid_types.hh \
+Ptr_Iterator_types.hh \
+DB_Row_types.hh \
+DB_Matrix_types.hh \
+BD_Shape_types.hh \
+OR_Matrix_types.hh \
+Octagonal_Shape_types.hh \
+fpu_types.hh \
+Float_defs.hh \
+Float_inlines.hh \
+Float_templates.hh \
+C_Integer.hh \
+fpu_defs.hh \
+fpu-c99_inlines.hh \
+fpu-ia32_inlines.hh \
+fpu-none_inlines.hh \
+fpu-sparc_inlines.hh \
+Rounding_Dir_defs.hh \
+Rounding_Dir_inlines.hh \
+Result_defs.hh \
+Result_inlines.hh \
+Numeric_Format_defs.hh \
+checked_defs.hh \
+checked_inlines.hh \
+checked_int_inlines.hh \
+checked_float_inlines.hh \
+checked_mpz_inlines.hh \
+checked_mpq_inlines.hh \
+checked_ext_inlines.hh \
+Checked_Number_defs.hh \
+Checked_Number_inlines.hh \
+Checked_Number_templates.hh \
+WRD_coefficient_types_defs.hh \
+WRD_coefficient_types_inlines.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient_defs.hh \
+Coefficient_inlines.hh \
+stdiobuf_defs.hh \
+stdiobuf_inlines.hh \
+c_streambuf_defs.hh \
+c_streambuf_inlines.hh \
+globals_defs.hh \
+globals_inlines.hh \
+math_utilities_defs.hh \
+math_utilities_inlines.hh \
+iterator_to_const_defs.hh \
+iterator_to_const_inlines.hh \
+distances_defs.hh \
+distances_inlines.hh \
+Boundary_defs.hh \
+intervals_defs.hh \
+Interval_Info_defs.hh \
+Interval_Info_inlines.hh \
+Interval_defs.hh \
+Interval_inlines.hh \
+Interval_templates.hh \
+Box_defs.hh \
+Box_Status_inlines.hh \
+Box_inlines.hh \
+Box_templates.hh \
+Integer_Interval.hh \
+Rational_Interval.hh \
+Rational_Box.hh \
+Variable_defs.hh \
+Variable_inlines.hh \
+Variables_Set_defs.hh \
+Variables_Set_inlines.hh \
+Init_defs.hh \
+Init_inlines.hh \
+initializer.hh \
+Topology_types.hh \
+Dense_Row_defs.hh \
+Dense_Row_inlines.hh \
+Dense_Row_templates.hh \
+CO_Tree_defs.hh \
+CO_Tree_inlines.hh \
+CO_Tree_templates.hh \
+Sparse_Row_defs.hh \
+Sparse_Row_inlines.hh \
+Sparse_Row_templates.hh \
+Bit_Row_defs.hh \
+Bit_Row_inlines.hh \
+Linear_System_defs.hh \
+Linear_System_inlines.hh \
+Linear_System_templates.hh \
+Bit_Matrix_defs.hh \
+Bit_Matrix_inlines.hh \
+Constraint_System_defs.hh \
+Generator_System_defs.hh \
+Grid_Generator_System_defs.hh \
+Congruence_System_defs.hh \
+Linear_Expression_defs.hh \
+Linear_Expression_inlines.hh \
+Expression_Adapter_defs.hh \
+Expression_Adapter_inlines.hh \
+Expression_Hide_Last_defs.hh \
+Expression_Hide_Last_inlines.hh \
+Expression_Hide_Inhomo_defs.hh \
+Expression_Hide_Inhomo_inlines.hh \
+Linear_Expression_Impl_defs.hh \
+Linear_Expression_Impl_inlines.hh \
+Linear_Expression_Impl_templates.hh \
+Linear_Expression_Interface_defs.hh \
+Linear_Form_defs.hh \
+Linear_Form_inlines.hh \
+Linear_Form_templates.hh \
+linearize.hh \
+Constraint_defs.hh \
+Constraint_inlines.hh \
+Constraint_System_inlines.hh \
+Generator_defs.hh \
+Generator_inlines.hh \
+Grid_Generator_defs.hh \
+Grid_Generator_inlines.hh \
+Congruence_defs.hh \
+Congruence_inlines.hh \
+Generator_System_inlines.hh \
+Grid_Generator_System_inlines.hh \
+Congruence_System_inlines.hh \
+Scalar_Products_defs.hh \
+Scalar_Products_inlines.hh \
+Matrix_defs.hh \
+Matrix_inlines.hh \
+Matrix_templates.hh \
+Swapping_Vector_defs.hh \
+Swapping_Vector_inlines.hh \
+MIP_Problem_types.hh \
+MIP_Problem_defs.hh \
+MIP_Problem_inlines.hh \
+MIP_Problem_templates.hh \
+PIP_Tree_types.hh \
+PIP_Tree_defs.hh \
+PIP_Tree_inlines.hh \
+PIP_Problem_types.hh \
+PIP_Problem_defs.hh \
+PIP_Problem_inlines.hh \
+PIP_Problem_templates.hh \
+Poly_Con_Relation_defs.hh \
+Poly_Con_Relation_inlines.hh \
+Poly_Gen_Relation_defs.hh \
+Poly_Gen_Relation_inlines.hh \
+BHRZ03_Certificate_defs.hh \
+BHRZ03_Certificate_inlines.hh \
+H79_Certificate_defs.hh \
+H79_Certificate_inlines.hh \
+Grid_Certificate_defs.hh \
+Grid_Certificate_inlines.hh \
+Partial_Function_defs.hh \
+Partial_Function_inlines.hh \
+Polyhedron_defs.hh \
+Ph_Status_inlines.hh \
+Polyhedron_inlines.hh \
+Polyhedron_chdims_templates.hh \
+Polyhedron_conversion_templates.hh \
+Polyhedron_minimize_templates.hh \
+Polyhedron_simplify_templates.hh \
+Polyhedron_templates.hh \
+Grid_defs.hh \
+Grid_Status_inlines.hh \
+Grid_inlines.hh \
+Grid_templates.hh \
+C_Polyhedron_defs.hh \
+C_Polyhedron_inlines.hh \
+NNC_Polyhedron_defs.hh \
+NNC_Polyhedron_inlines.hh \
+Widening_Function_types.hh \
+Widening_Function_defs.hh \
+Widening_Function_inlines.hh \
+Ptr_Iterator_defs.hh \
+Ptr_Iterator_inlines.hh \
+DB_Row_defs.hh \
+DB_Row_inlines.hh \
+DB_Row_templates.hh \
+DB_Matrix_defs.hh \
+DB_Matrix_inlines.hh \
+DB_Matrix_templates.hh \
+BD_Shape_defs.hh \
+BDS_Status_inlines.hh \
+BD_Shape_inlines.hh \
+BD_Shape_templates.hh \
+OR_Matrix_defs.hh \
+OR_Matrix_inlines.hh \
+OR_Matrix_templates.hh \
+Octagonal_Shape_defs.hh \
+Og_Status_inlines.hh \
+Octagonal_Shape_inlines.hh \
+Octagonal_Shape_templates.hh \
+Determinate_types.hh \
+Determinate_defs.hh \
+Determinate_inlines.hh \
+Powerset_types.hh \
+Powerset_defs.hh \
+Powerset_inlines.hh \
+Powerset_templates.hh \
+Pointset_Powerset_types.hh \
+Pointset_Powerset_defs.hh \
+Pointset_Powerset_inlines.hh \
+Pointset_Powerset_templates.hh \
+Partially_Reduced_Product_types.hh \
+Partially_Reduced_Product_defs.hh \
+Partially_Reduced_Product_inlines.hh \
+Partially_Reduced_Product_templates.hh \
+Weight_Profiler_defs.hh \
+max_space_dimension.hh \
+algorithms.hh \
+termination_defs.hh \
+termination_templates.hh \
+wrap_assign.hh \
+wrap_string.hh \
+Floating_Point_Expression_types.hh \
+Floating_Point_Expression_defs.hh \
+Floating_Point_Expression_inlines.hh \
+Floating_Point_Expression_templates.hh \
+Cast_Floating_Point_Expression_types.hh \
+Cast_Floating_Point_Expression_defs.hh \
+Cast_Floating_Point_Expression_inlines.hh \
+Cast_Floating_Point_Expression_templates.hh \
+Constant_Floating_Point_Expression_types.hh \
+Constant_Floating_Point_Expression_defs.hh \
+Constant_Floating_Point_Expression_inlines.hh \
+Variable_Floating_Point_Expression_types.hh \
+Variable_Floating_Point_Expression_defs.hh \
+Variable_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_types.hh \
+Sum_Floating_Point_Expression_defs.hh \
+Sum_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_templates.hh \
+Difference_Floating_Point_Expression_types.hh \
+Difference_Floating_Point_Expression_defs.hh \
+Difference_Floating_Point_Expression_inlines.hh \
+Difference_Floating_Point_Expression_templates.hh \
+Multiplication_Floating_Point_Expression_types.hh \
+Multiplication_Floating_Point_Expression_defs.hh \
+Multiplication_Floating_Point_Expression_inlines.hh \
+Multiplication_Floating_Point_Expression_templates.hh \
+Division_Floating_Point_Expression_types.hh \
+Division_Floating_Point_Expression_defs.hh \
+Division_Floating_Point_Expression_inlines.hh \
+Division_Floating_Point_Expression_templates.hh \
+Opposite_Floating_Point_Expression_types.hh \
+Opposite_Floating_Point_Expression_defs.hh \
+Opposite_Floating_Point_Expression_inlines.hh \
+Doubly_Linked_Object_types.hh \
+EList_types.hh \
+EList_Iterator_types.hh \
+Handler_types.hh \
+Pending_Element_types.hh \
+Pending_List_types.hh \
+Time_types.hh \
+Watchdog_types.hh \
+Threshold_Watcher_types.hh \
+Handler_defs.hh \
+Handler_inlines.hh \
+Time_defs.hh \
+Time_inlines.hh \
+Doubly_Linked_Object_defs.hh \
+Doubly_Linked_Object_inlines.hh \
+EList_Iterator_defs.hh \
+EList_Iterator_inlines.hh \
+EList_defs.hh \
+EList_inlines.hh \
+Pending_Element_defs.hh \
+Pending_Element_inlines.hh \
+Pending_List_defs.hh \
+Pending_List_inlines.hh \
+Pending_List_templates.hh \
+Watchdog_defs.hh \
+Watchdog_inlines.hh \
+Threshold_Watcher_defs.hh \
+Threshold_Watcher_inlines.hh \
+Threshold_Watcher_templates.hh
+#Any_Pointset_types.hh \
+#Any_Pointset_defs.hh \
+#Any_Pointset_inlines.hh \
+#Ask_Tell_types.hh \
+#Ask_Tell_defs.hh \
+#Ask_Tell_inlines.hh \
+#Ask_Tell_templates.hh \
+#Pointset_Ask_Tell_types.hh \
+#Pointset_Ask_Tell_defs.hh \
+#Pointset_Ask_Tell_inlines.hh \
+#Pointset_Ask_Tell_templates.hh
+
+NESTED_INCLUDE_FILES = \
+Ph_Status_idefs.hh \
+Grid_Status_idefs.hh \
+Box_Status_idefs.hh \
+BDS_Status_idefs.hh \
+Og_Status_idefs.hh
+
+libppl_la_SOURCES = \
+assert.cc \
+Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.cc \
+fpu-ia32.cc \
+Concrete_Expression.cc \
+Constraint.cc \
+Constraint_System.cc \
+Congruence.cc \
+Congruence_System.cc \
+Generator_System.cc \
+Grid_Generator_System.cc \
+Generator.cc \
+Grid_Generator.cc \
+Init.cc \
+Coefficient.cc \
+Linear_Expression.cc \
+Linear_Expression_Impl.cc \
+Linear_Expression_Interface.cc \
+Linear_Form.cc \
+Scalar_Products.cc \
+MIP_Problem.cc \
+PIP_Tree.cc \
+PIP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.cc \
+Partial_Function.cc \
+Polyhedron_nonpublic.cc \
+Polyhedron_public.cc \
+Polyhedron_chdims.cc \
+Polyhedron_widenings.cc \
+C_Polyhedron.cc \
+NNC_Polyhedron.cc \
+Grid_nonpublic.cc \
+Grid_public.cc \
+Grid_chdims.cc \
+Grid_widenings.cc \
+BD_Shape.cc \
+Octagonal_Shape.cc \
+Pointset_Powerset.cc \
+CO_Tree.cc \
+Sparse_Row.cc \
+Dense_Row.cc \
+Bit_Matrix.cc \
+Bit_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+Variables_Set.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+stdiobuf.cc \
+c_streambuf.cc \
+globals.cc \
+mp_std_bits.cc \
+Weight_Profiler.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort_templates.hh \
+termination.cc \
+wrap_string.cc \
+Time.cc \
+Watchdog.cc \
+Threshold_Watcher.cc
+#Pointset_Ask_Tell.cc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libppl_la_LIBADD = @extra_libraries@
+
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+if BUILD_CXX_INTERFACE
+
+include_HEADERS = ppl.hh
+
+else !BUILD_CXX_INTERFACE
+
+noinst_HEADERS = ppl.hh
+
+endif !BUILD_CXX_INTERFACE
+
+nodist_noinst_HEADERS = ppl_include_files.hh
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+	for file in $(INCLUDE_FILES) ; \
+	do \
+	  i="#include \"$$file\"" ; \
+	  ( cd $(top_srcdir)/src ; $(FGREP) -q "$$i" $(INCLUDE_FILES) ) || echo "$$i" ; \
+	done > $@
+
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+
+if HAVE_PERL
+
+ppl.hh:	$(top_builddir)/ppl-config.h $(top_builddir)/src/version.hh ppl_header.hh ppl_include_files.hh $(INCLUDE_FILES) $(NESTED_INCLUDE_FILES) Makefile $(top_builddir)/utils/build_header
+	$(top_builddir)/utils/build_header \
+		-I $(top_builddir) -I $(top_builddir)/src \
+		$(top_srcdir)/src/ppl_header.hh >$@
+
+BUGS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+	@echo "#ifndef PPL_BUGS_hh" >$@
+	@echo "#define PPL_BUGS_hh 1" >>$@
+	$(top_builddir)/utils/text2cxxarray --name=BUGS_array --decl-only \
+		$(top_srcdir)/BUGS >>$@
+	@echo "#endif // !defined(PPL_BUGS_hh)" >>$@
+BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+	$(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+		$(top_srcdir)/BUGS >$@
+
+COPYING.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+	@echo "#ifndef PPL_COPYING_hh" >$@
+	@echo "#define PPL_COPYING_hh 1" >>$@
+	$(top_builddir)/utils/text2cxxarray --name=COPYING_array --decl-only \
+		$(top_srcdir)/COPYING >>$@
+	@echo "#endif // !defined(PPL_COPYING_hh)" >>$@
+
+COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+	$(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+		$(top_srcdir)/COPYING >$@
+CREDITS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+	@echo "#ifndef PPL_CREDITS_hh" >$@
+	@echo "#define PPL_CREDITS_hh 1" >>$@
+	$(top_builddir)/utils/text2cxxarray --name=CREDITS_array --decl-only \
+		$(top_srcdir)/CREDITS >>$@
+	@echo "#endif // !defined(PPL_CREDITS_hh)" >>$@
+CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+	$(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+		$(top_srcdir)/CREDITS >$@
+
+else !HAVE_PERL
+
+ppl.hh.sed: Makefile
+	@echo "/^\/\* BEGIN ppl-config.h \*\/$$/ {"    >$@
+	@echo "  r $(top_builddir)/ppl-config.h"      >>$@
+	@echo "  : loop"                              >>$@
+	@echo "  /\n\/\* END ppl-config.h \*\/$$/ !{" >>$@
+	@echo "    N"                                 >>$@
+	@echo "    b loop"                            >>$@
+	@echo "  }"                                   >>$@
+	@echo "  d"                                   >>$@
+	@echo "}"                                     >>$@
+
+ppl.hh:	ppl.hh.dist ppl.hh.sed
+	$(SED) -f ppl.hh.sed ppl.hh.dist >$@
+	rm -f ppl.hh.sed
+
+BUGS.hh:	BUGS.hh.dist
+	cp -f BUGS.hh.dist $@
+BUGS.cc:	BUGS.cc.dist
+	cp -f BUGS.cc.dist $@
+COPYING.hh:	COPYING.hh.dist
+	cp -f COPYING.hh.dist $@
+COPYING.cc:	COPYING.cc.dist
+	cp -f COPYING.cc.dist $@
+CREDITS.hh:	CREDITS.hh.dist
+	cp -f CREDITS.hh.dist $@
+CREDITS.cc:	CREDITS.cc.dist
+	cp -f CREDITS.cc.dist $@
+
+endif !HAVE_PERL
+
+if USE_PRECOMPILED_HEADERS
+
+ppl.hh.gch: ppl.hh
+	$(CXXCOMPILE) -xc++-header -o $@ ppl.hh
+
+PRECOMPILED = ppl.hh.gch
+
+else !USE_PRECOMPILED_HEADERS
+
+PRECOMPILED =
+
+endif !USE_PRECOMPILED_HEADERS
+
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+# ppl.hh is not distributed.
+# ppl.hh.dist, which is distributed, is a copy of ppl.hh;
+# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist.
+dist-hook:
+	mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist
+	mv -f $(distdir)/BUGS.hh $(distdir)/BUGS.hh.dist
+	mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist
+	mv -f $(distdir)/COPYING.hh $(distdir)/COPYING.hh.dist
+	mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+	mv -f $(distdir)/CREDITS.hh $(distdir)/CREDITS.hh.dist
+	mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+
+CLEANFILES = $(BUILT_SOURCES)
+
+$(top_builddir)/utils/build_header:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+$(top_builddir)/utils/text2cxxarray:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils text2cxxarray
+
+$(top_builddir)/ppl-config.h:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) ppl-config.h
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..27efd47
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,1783 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+# Libtool -version-info for libppl.la.
+#
+#  1. Start with version information of `0:0:0' for each Libtool library.
+#
+#  2. Update the version information only immediately before a public
+#     release of your software.  More frequent updates are unnecessary,
+#     and only guarantee that the current interface number gets larger
+#     faster.
+#
+#  3. If the library source code has changed at all since the last
+#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
+#
+#  4. If any interfaces have been added, removed, or changed since the
+#     last update, increment CURRENT, and set REVISION to 0.
+#
+#  5. If any interfaces have been added since the last public release,
+#     then increment AGE.
+#
+#  6. If any interfaces have been removed since the last public release,
+#     then set AGE to 0.
+#
+#	PPL release		-version-info
+#	    0.1			    -----
+#	    0.2			    -----
+#	    0.3			    0:0:0
+#	    0.4			    1:0:1
+#	    0.5			    2:0:0
+#	    0.6			    3:0:0
+#	    0.7			    4:0:0
+#	    0.8			    5:0:0
+#	    0.9			    6:0:0
+#	    0.10		    7:0:0
+#	    0.10.1		    8:0:1
+#	    0.10.2		    8:0:1
+#	    0.11		    9:0:0
+#	    0.12		   10:0:0
+#	    0.12.1		   11:0:0
+#	    1.0			   12:0:0
+#	    1.1			   13:0:0
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ppl-config$(EXEEXT)
+subdir = src
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(srcdir)/version.hh.in \
+	$(srcdir)/ppl-config.cc.in $(top_srcdir)/depcomp \
+	$(am__include_HEADERS_DIST) $(am__noinst_HEADERS_DIST)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = version.hh ppl-config.cc
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libppl_la_DEPENDENCIES =
+am__libppl_la_SOURCES_DIST = assert.cc Box.cc checked.cc \
+	Checked_Number.cc Float.cc fpu-ia32.cc Concrete_Expression.cc \
+	Constraint.cc Constraint_System.cc Congruence.cc \
+	Congruence_System.cc Generator_System.cc \
+	Grid_Generator_System.cc Generator.cc Grid_Generator.cc \
+	Init.cc Coefficient.cc Linear_Expression.cc \
+	Linear_Expression_Impl.cc Linear_Expression_Interface.cc \
+	Linear_Form.cc Scalar_Products.cc MIP_Problem.cc PIP_Tree.cc \
+	PIP_Problem.cc Poly_Con_Relation.cc Poly_Gen_Relation.cc \
+	BHRZ03_Certificate.cc H79_Certificate.cc Grid_Certificate.cc \
+	Partial_Function.cc Polyhedron_nonpublic.cc \
+	Polyhedron_public.cc Polyhedron_chdims.cc \
+	Polyhedron_widenings.cc C_Polyhedron.cc NNC_Polyhedron.cc \
+	Grid_nonpublic.cc Grid_public.cc Grid_chdims.cc \
+	Grid_widenings.cc BD_Shape.cc Octagonal_Shape.cc \
+	Pointset_Powerset.cc CO_Tree.cc Sparse_Row.cc Dense_Row.cc \
+	Bit_Matrix.cc Bit_Row.cc Ph_Status.cc Grid_Status.cc \
+	Variable.cc Variables_Set.cc Grid_conversion.cc \
+	Grid_simplify.cc stdiobuf.cc c_streambuf.cc globals.cc \
+	mp_std_bits.cc Weight_Profiler.cc version.cc namespaces.hh \
+	compiler.hh assert.hh meta_programming.hh Slow_Copy.hh \
+	Has_Assign_Or_Swap.hh assign_or_swap.hh mp_std_bits_defs.hh \
+	mp_std_bits_inlines.hh Concrete_Expression_types.hh \
+	Concrete_Expression_defs.hh Concrete_Expression_inlines.hh \
+	Temp_defs.hh Temp_inlines.hh Temp_templates.hh \
+	Coefficient_traits_template.hh Checked_Number_types.hh \
+	termination_types.hh GMP_Integer_types.hh Coefficient_types.hh \
+	stdiobuf_types.hh c_streambuf_types.hh globals_types.hh \
+	iterator_to_const_types.hh distances_types.hh \
+	Interval_Info_types.hh Interval_types.hh Box_types.hh \
+	Constraint_types.hh Generator_types.hh Grid_Generator_types.hh \
+	Congruence_types.hh Init_types.hh Dense_Row_types.hh \
+	CO_Tree_types.hh Sparse_Row_types.hh Matrix_types.hh \
+	Swapping_Vector_types.hh Variable_types.hh \
+	Variables_Set_types.hh Linear_Expression_types.hh \
+	Expression_Adapter_types.hh Expression_Hide_Last_types.hh \
+	Expression_Hide_Inhomo_types.hh \
+	Linear_Expression_Impl_types.hh \
+	Linear_Expression_Interface_types.hh Linear_System_types.hh \
+	Linear_Form_types.hh Bit_Row_types.hh Bit_Matrix_types.hh \
+	Constraint_System_types.hh Generator_System_types.hh \
+	Grid_Generator_System_types.hh Congruence_System_types.hh \
+	Scalar_Products_types.hh PIP_Tree_types.hh \
+	PIP_Problem_types.hh Poly_Con_Relation_types.hh \
+	Poly_Gen_Relation_types.hh BHRZ03_Certificate_types.hh \
+	H79_Certificate_types.hh Grid_Certificate_types.hh \
+	Partial_Function_types.hh Polyhedron_types.hh \
+	C_Polyhedron_types.hh NNC_Polyhedron_types.hh Grid_types.hh \
+	Ptr_Iterator_types.hh DB_Row_types.hh DB_Matrix_types.hh \
+	BD_Shape_types.hh OR_Matrix_types.hh Octagonal_Shape_types.hh \
+	fpu_types.hh Float_defs.hh Float_inlines.hh Float_templates.hh \
+	C_Integer.hh fpu_defs.hh fpu-c99_inlines.hh \
+	fpu-ia32_inlines.hh fpu-none_inlines.hh fpu-sparc_inlines.hh \
+	Rounding_Dir_defs.hh Rounding_Dir_inlines.hh Result_defs.hh \
+	Result_inlines.hh Numeric_Format_defs.hh checked_defs.hh \
+	checked_inlines.hh checked_int_inlines.hh \
+	checked_float_inlines.hh checked_mpz_inlines.hh \
+	checked_mpq_inlines.hh checked_ext_inlines.hh \
+	Checked_Number_defs.hh Checked_Number_inlines.hh \
+	Checked_Number_templates.hh WRD_coefficient_types_defs.hh \
+	WRD_coefficient_types_inlines.hh checked_numeric_limits.hh \
+	GMP_Integer_defs.hh GMP_Integer_inlines.hh Coefficient_defs.hh \
+	Coefficient_inlines.hh stdiobuf_defs.hh stdiobuf_inlines.hh \
+	c_streambuf_defs.hh c_streambuf_inlines.hh globals_defs.hh \
+	globals_inlines.hh math_utilities_defs.hh \
+	math_utilities_inlines.hh iterator_to_const_defs.hh \
+	iterator_to_const_inlines.hh distances_defs.hh \
+	distances_inlines.hh Boundary_defs.hh intervals_defs.hh \
+	Interval_Info_defs.hh Interval_Info_inlines.hh \
+	Interval_defs.hh Interval_inlines.hh Interval_templates.hh \
+	Box_defs.hh Box_Status_inlines.hh Box_inlines.hh \
+	Box_templates.hh Integer_Interval.hh Rational_Interval.hh \
+	Rational_Box.hh Variable_defs.hh Variable_inlines.hh \
+	Variables_Set_defs.hh Variables_Set_inlines.hh Init_defs.hh \
+	Init_inlines.hh initializer.hh Topology_types.hh \
+	Dense_Row_defs.hh Dense_Row_inlines.hh Dense_Row_templates.hh \
+	CO_Tree_defs.hh CO_Tree_inlines.hh CO_Tree_templates.hh \
+	Sparse_Row_defs.hh Sparse_Row_inlines.hh \
+	Sparse_Row_templates.hh Bit_Row_defs.hh Bit_Row_inlines.hh \
+	Linear_System_defs.hh Linear_System_inlines.hh \
+	Linear_System_templates.hh Bit_Matrix_defs.hh \
+	Bit_Matrix_inlines.hh Constraint_System_defs.hh \
+	Generator_System_defs.hh Grid_Generator_System_defs.hh \
+	Congruence_System_defs.hh Linear_Expression_defs.hh \
+	Linear_Expression_inlines.hh Expression_Adapter_defs.hh \
+	Expression_Adapter_inlines.hh Expression_Hide_Last_defs.hh \
+	Expression_Hide_Last_inlines.hh Expression_Hide_Inhomo_defs.hh \
+	Expression_Hide_Inhomo_inlines.hh \
+	Linear_Expression_Impl_defs.hh \
+	Linear_Expression_Impl_inlines.hh \
+	Linear_Expression_Impl_templates.hh \
+	Linear_Expression_Interface_defs.hh Linear_Form_defs.hh \
+	Linear_Form_inlines.hh Linear_Form_templates.hh linearize.hh \
+	Constraint_defs.hh Constraint_inlines.hh \
+	Constraint_System_inlines.hh Generator_defs.hh \
+	Generator_inlines.hh Grid_Generator_defs.hh \
+	Grid_Generator_inlines.hh Congruence_defs.hh \
+	Congruence_inlines.hh Generator_System_inlines.hh \
+	Grid_Generator_System_inlines.hh Congruence_System_inlines.hh \
+	Scalar_Products_defs.hh Scalar_Products_inlines.hh \
+	Matrix_defs.hh Matrix_inlines.hh Matrix_templates.hh \
+	Swapping_Vector_defs.hh Swapping_Vector_inlines.hh \
+	MIP_Problem_types.hh MIP_Problem_defs.hh \
+	MIP_Problem_inlines.hh MIP_Problem_templates.hh \
+	PIP_Tree_defs.hh PIP_Tree_inlines.hh PIP_Problem_defs.hh \
+	PIP_Problem_inlines.hh PIP_Problem_templates.hh \
+	Poly_Con_Relation_defs.hh Poly_Con_Relation_inlines.hh \
+	Poly_Gen_Relation_defs.hh Poly_Gen_Relation_inlines.hh \
+	BHRZ03_Certificate_defs.hh BHRZ03_Certificate_inlines.hh \
+	H79_Certificate_defs.hh H79_Certificate_inlines.hh \
+	Grid_Certificate_defs.hh Grid_Certificate_inlines.hh \
+	Partial_Function_defs.hh Partial_Function_inlines.hh \
+	Polyhedron_defs.hh Ph_Status_inlines.hh Polyhedron_inlines.hh \
+	Polyhedron_chdims_templates.hh \
+	Polyhedron_conversion_templates.hh \
+	Polyhedron_minimize_templates.hh \
+	Polyhedron_simplify_templates.hh Polyhedron_templates.hh \
+	Grid_defs.hh Grid_Status_inlines.hh Grid_inlines.hh \
+	Grid_templates.hh C_Polyhedron_defs.hh C_Polyhedron_inlines.hh \
+	NNC_Polyhedron_defs.hh NNC_Polyhedron_inlines.hh \
+	Widening_Function_types.hh Widening_Function_defs.hh \
+	Widening_Function_inlines.hh Ptr_Iterator_defs.hh \
+	Ptr_Iterator_inlines.hh DB_Row_defs.hh DB_Row_inlines.hh \
+	DB_Row_templates.hh DB_Matrix_defs.hh DB_Matrix_inlines.hh \
+	DB_Matrix_templates.hh BD_Shape_defs.hh BDS_Status_inlines.hh \
+	BD_Shape_inlines.hh BD_Shape_templates.hh OR_Matrix_defs.hh \
+	OR_Matrix_inlines.hh OR_Matrix_templates.hh \
+	Octagonal_Shape_defs.hh Og_Status_inlines.hh \
+	Octagonal_Shape_inlines.hh Octagonal_Shape_templates.hh \
+	Determinate_types.hh Determinate_defs.hh \
+	Determinate_inlines.hh Powerset_types.hh Powerset_defs.hh \
+	Powerset_inlines.hh Powerset_templates.hh \
+	Pointset_Powerset_types.hh Pointset_Powerset_defs.hh \
+	Pointset_Powerset_inlines.hh Pointset_Powerset_templates.hh \
+	Partially_Reduced_Product_types.hh \
+	Partially_Reduced_Product_defs.hh \
+	Partially_Reduced_Product_inlines.hh \
+	Partially_Reduced_Product_templates.hh Weight_Profiler_defs.hh \
+	max_space_dimension.hh algorithms.hh termination_defs.hh \
+	termination_templates.hh wrap_assign.hh wrap_string.hh \
+	Floating_Point_Expression_types.hh \
+	Floating_Point_Expression_defs.hh \
+	Floating_Point_Expression_inlines.hh \
+	Floating_Point_Expression_templates.hh \
+	Cast_Floating_Point_Expression_types.hh \
+	Cast_Floating_Point_Expression_defs.hh \
+	Cast_Floating_Point_Expression_inlines.hh \
+	Cast_Floating_Point_Expression_templates.hh \
+	Constant_Floating_Point_Expression_types.hh \
+	Constant_Floating_Point_Expression_defs.hh \
+	Constant_Floating_Point_Expression_inlines.hh \
+	Variable_Floating_Point_Expression_types.hh \
+	Variable_Floating_Point_Expression_defs.hh \
+	Variable_Floating_Point_Expression_inlines.hh \
+	Sum_Floating_Point_Expression_types.hh \
+	Sum_Floating_Point_Expression_defs.hh \
+	Sum_Floating_Point_Expression_inlines.hh \
+	Sum_Floating_Point_Expression_templates.hh \
+	Difference_Floating_Point_Expression_types.hh \
+	Difference_Floating_Point_Expression_defs.hh \
+	Difference_Floating_Point_Expression_inlines.hh \
+	Difference_Floating_Point_Expression_templates.hh \
+	Multiplication_Floating_Point_Expression_types.hh \
+	Multiplication_Floating_Point_Expression_defs.hh \
+	Multiplication_Floating_Point_Expression_inlines.hh \
+	Multiplication_Floating_Point_Expression_templates.hh \
+	Division_Floating_Point_Expression_types.hh \
+	Division_Floating_Point_Expression_defs.hh \
+	Division_Floating_Point_Expression_inlines.hh \
+	Division_Floating_Point_Expression_templates.hh \
+	Opposite_Floating_Point_Expression_types.hh \
+	Opposite_Floating_Point_Expression_defs.hh \
+	Opposite_Floating_Point_Expression_inlines.hh \
+	Doubly_Linked_Object_types.hh EList_types.hh \
+	EList_Iterator_types.hh Handler_types.hh \
+	Pending_Element_types.hh Pending_List_types.hh Time_types.hh \
+	Watchdog_types.hh Threshold_Watcher_types.hh Handler_defs.hh \
+	Handler_inlines.hh Time_defs.hh Time_inlines.hh \
+	Doubly_Linked_Object_defs.hh Doubly_Linked_Object_inlines.hh \
+	EList_Iterator_defs.hh EList_Iterator_inlines.hh EList_defs.hh \
+	EList_inlines.hh Pending_Element_defs.hh \
+	Pending_Element_inlines.hh Pending_List_defs.hh \
+	Pending_List_inlines.hh Pending_List_templates.hh \
+	Watchdog_defs.hh Watchdog_inlines.hh Threshold_Watcher_defs.hh \
+	Threshold_Watcher_inlines.hh Threshold_Watcher_templates.hh \
+	Ph_Status_idefs.hh Grid_Status_idefs.hh Box_Status_idefs.hh \
+	BDS_Status_idefs.hh Og_Status_idefs.hh \
+	swapping_sort_templates.hh termination.cc wrap_string.cc \
+	Time.cc Watchdog.cc Threshold_Watcher.cc
+am__objects_1 =
+am__objects_2 = $(am__objects_1) $(am__objects_1)
+am_libppl_la_OBJECTS = assert.lo Box.lo checked.lo Checked_Number.lo \
+	Float.lo fpu-ia32.lo Concrete_Expression.lo Constraint.lo \
+	Constraint_System.lo Congruence.lo Congruence_System.lo \
+	Generator_System.lo Grid_Generator_System.lo Generator.lo \
+	Grid_Generator.lo Init.lo Coefficient.lo Linear_Expression.lo \
+	Linear_Expression_Impl.lo Linear_Expression_Interface.lo \
+	Linear_Form.lo Scalar_Products.lo MIP_Problem.lo PIP_Tree.lo \
+	PIP_Problem.lo Poly_Con_Relation.lo Poly_Gen_Relation.lo \
+	BHRZ03_Certificate.lo H79_Certificate.lo Grid_Certificate.lo \
+	Partial_Function.lo Polyhedron_nonpublic.lo \
+	Polyhedron_public.lo Polyhedron_chdims.lo \
+	Polyhedron_widenings.lo C_Polyhedron.lo NNC_Polyhedron.lo \
+	Grid_nonpublic.lo Grid_public.lo Grid_chdims.lo \
+	Grid_widenings.lo BD_Shape.lo Octagonal_Shape.lo \
+	Pointset_Powerset.lo CO_Tree.lo Sparse_Row.lo Dense_Row.lo \
+	Bit_Matrix.lo Bit_Row.lo Ph_Status.lo Grid_Status.lo \
+	Variable.lo Variables_Set.lo Grid_conversion.lo \
+	Grid_simplify.lo stdiobuf.lo c_streambuf.lo globals.lo \
+	mp_std_bits.lo Weight_Profiler.lo version.lo $(am__objects_2) \
+	$(am__objects_1) termination.lo wrap_string.lo Time.lo \
+	Watchdog.lo Threshold_Watcher.lo
+libppl_la_OBJECTS = $(am_libppl_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libppl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(libppl_la_LDFLAGS) $(LDFLAGS) -o $@
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_config_OBJECTS = BUGS.$(OBJEXT) COPYING.$(OBJEXT) \
+	CREDITS.$(OBJEXT)
+nodist_ppl_config_OBJECTS = ppl-config.$(OBJEXT)
+ppl_config_OBJECTS = $(am_ppl_config_OBJECTS) \
+	$(nodist_ppl_config_OBJECTS)
+ppl_config_DEPENDENCIES = libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_la_SOURCES) $(ppl_config_SOURCES) \
+	$(nodist_ppl_config_SOURCES)
+DIST_SOURCES = $(am__libppl_la_SOURCES_DIST) $(ppl_config_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__include_HEADERS_DIST = ppl.hh
+am__noinst_HEADERS_DIST = ppl.hh
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS) \
+	$(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+LIBPPL_LT_CURRENT = 13
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE = 0
+AM_CPPFLAGS = \
+-I$(top_builddir) \
+-I$(top_srcdir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl.la
+ppl_config_SOURCES = \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+nodist_ppl_config_SOURCES = \
+ppl-config.cc \
+ppl.hh
+
+ppl_config_LDADD = \
+ at extra_libraries@ \
+libppl.la
+
+ at USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = 
+ at USE_GMP_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = \
+ at USE_GMP_INTEGERS_TRUE@  GMP_Integer_types.hh
+
+ at USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_TYPES_INCLUDE_FILES = 
+ at USE_CHECKED_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = 
+ at USE_GMP_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = \
+ at USE_GMP_INTEGERS_TRUE@  GMP_Integer_defs.hh \
+ at USE_GMP_INTEGERS_TRUE@  GMP_Integer_inlines.hh
+
+ at USE_NATIVE_INTEGERS_TRUE@COEFFICIENT_DEFS_INCLUDE_FILES = 
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+assert.hh \
+meta_programming.hh \
+Slow_Copy.hh \
+Has_Assign_Or_Swap.hh \
+assign_or_swap.hh \
+mp_std_bits_defs.hh \
+mp_std_bits_inlines.hh \
+Concrete_Expression_types.hh \
+Concrete_Expression_defs.hh \
+Concrete_Expression_inlines.hh \
+Temp_defs.hh \
+Temp_inlines.hh \
+Temp_templates.hh \
+Coefficient_traits_template.hh \
+Checked_Number_types.hh \
+termination_types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient_types.hh \
+stdiobuf_types.hh \
+c_streambuf_types.hh \
+globals_types.hh \
+iterator_to_const_types.hh \
+distances_types.hh \
+Interval_Info_types.hh \
+Interval_types.hh \
+Box_types.hh \
+Constraint_types.hh \
+Generator_types.hh \
+Grid_Generator_types.hh \
+Congruence_types.hh \
+Init_types.hh \
+Dense_Row_types.hh \
+CO_Tree_types.hh \
+Sparse_Row_types.hh \
+Matrix_types.hh \
+Swapping_Vector_types.hh \
+Variable_types.hh \
+Variables_Set_types.hh \
+Linear_Expression_types.hh \
+Expression_Adapter_types.hh \
+Expression_Hide_Last_types.hh \
+Expression_Hide_Inhomo_types.hh \
+Linear_Expression_Impl_types.hh \
+Linear_Expression_Interface_types.hh \
+Linear_System_types.hh \
+Linear_Form_types.hh \
+Bit_Row_types.hh \
+Bit_Matrix_types.hh \
+Constraint_System_types.hh \
+Generator_System_types.hh \
+Grid_Generator_System_types.hh \
+Congruence_System_types.hh \
+Scalar_Products_types.hh \
+PIP_Tree_types.hh \
+PIP_Problem_types.hh \
+Poly_Con_Relation_types.hh \
+Poly_Gen_Relation_types.hh \
+BHRZ03_Certificate_types.hh \
+H79_Certificate_types.hh \
+Grid_Certificate_types.hh \
+Partial_Function_types.hh \
+Polyhedron_types.hh \
+C_Polyhedron_types.hh \
+NNC_Polyhedron_types.hh \
+Grid_types.hh \
+Ptr_Iterator_types.hh \
+DB_Row_types.hh \
+DB_Matrix_types.hh \
+BD_Shape_types.hh \
+OR_Matrix_types.hh \
+Octagonal_Shape_types.hh \
+fpu_types.hh \
+Float_defs.hh \
+Float_inlines.hh \
+Float_templates.hh \
+C_Integer.hh \
+fpu_defs.hh \
+fpu-c99_inlines.hh \
+fpu-ia32_inlines.hh \
+fpu-none_inlines.hh \
+fpu-sparc_inlines.hh \
+Rounding_Dir_defs.hh \
+Rounding_Dir_inlines.hh \
+Result_defs.hh \
+Result_inlines.hh \
+Numeric_Format_defs.hh \
+checked_defs.hh \
+checked_inlines.hh \
+checked_int_inlines.hh \
+checked_float_inlines.hh \
+checked_mpz_inlines.hh \
+checked_mpq_inlines.hh \
+checked_ext_inlines.hh \
+Checked_Number_defs.hh \
+Checked_Number_inlines.hh \
+Checked_Number_templates.hh \
+WRD_coefficient_types_defs.hh \
+WRD_coefficient_types_inlines.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient_defs.hh \
+Coefficient_inlines.hh \
+stdiobuf_defs.hh \
+stdiobuf_inlines.hh \
+c_streambuf_defs.hh \
+c_streambuf_inlines.hh \
+globals_defs.hh \
+globals_inlines.hh \
+math_utilities_defs.hh \
+math_utilities_inlines.hh \
+iterator_to_const_defs.hh \
+iterator_to_const_inlines.hh \
+distances_defs.hh \
+distances_inlines.hh \
+Boundary_defs.hh \
+intervals_defs.hh \
+Interval_Info_defs.hh \
+Interval_Info_inlines.hh \
+Interval_defs.hh \
+Interval_inlines.hh \
+Interval_templates.hh \
+Box_defs.hh \
+Box_Status_inlines.hh \
+Box_inlines.hh \
+Box_templates.hh \
+Integer_Interval.hh \
+Rational_Interval.hh \
+Rational_Box.hh \
+Variable_defs.hh \
+Variable_inlines.hh \
+Variables_Set_defs.hh \
+Variables_Set_inlines.hh \
+Init_defs.hh \
+Init_inlines.hh \
+initializer.hh \
+Topology_types.hh \
+Dense_Row_defs.hh \
+Dense_Row_inlines.hh \
+Dense_Row_templates.hh \
+CO_Tree_defs.hh \
+CO_Tree_inlines.hh \
+CO_Tree_templates.hh \
+Sparse_Row_defs.hh \
+Sparse_Row_inlines.hh \
+Sparse_Row_templates.hh \
+Bit_Row_defs.hh \
+Bit_Row_inlines.hh \
+Linear_System_defs.hh \
+Linear_System_inlines.hh \
+Linear_System_templates.hh \
+Bit_Matrix_defs.hh \
+Bit_Matrix_inlines.hh \
+Constraint_System_defs.hh \
+Generator_System_defs.hh \
+Grid_Generator_System_defs.hh \
+Congruence_System_defs.hh \
+Linear_Expression_defs.hh \
+Linear_Expression_inlines.hh \
+Expression_Adapter_defs.hh \
+Expression_Adapter_inlines.hh \
+Expression_Hide_Last_defs.hh \
+Expression_Hide_Last_inlines.hh \
+Expression_Hide_Inhomo_defs.hh \
+Expression_Hide_Inhomo_inlines.hh \
+Linear_Expression_Impl_defs.hh \
+Linear_Expression_Impl_inlines.hh \
+Linear_Expression_Impl_templates.hh \
+Linear_Expression_Interface_defs.hh \
+Linear_Form_defs.hh \
+Linear_Form_inlines.hh \
+Linear_Form_templates.hh \
+linearize.hh \
+Constraint_defs.hh \
+Constraint_inlines.hh \
+Constraint_System_inlines.hh \
+Generator_defs.hh \
+Generator_inlines.hh \
+Grid_Generator_defs.hh \
+Grid_Generator_inlines.hh \
+Congruence_defs.hh \
+Congruence_inlines.hh \
+Generator_System_inlines.hh \
+Grid_Generator_System_inlines.hh \
+Congruence_System_inlines.hh \
+Scalar_Products_defs.hh \
+Scalar_Products_inlines.hh \
+Matrix_defs.hh \
+Matrix_inlines.hh \
+Matrix_templates.hh \
+Swapping_Vector_defs.hh \
+Swapping_Vector_inlines.hh \
+MIP_Problem_types.hh \
+MIP_Problem_defs.hh \
+MIP_Problem_inlines.hh \
+MIP_Problem_templates.hh \
+PIP_Tree_types.hh \
+PIP_Tree_defs.hh \
+PIP_Tree_inlines.hh \
+PIP_Problem_types.hh \
+PIP_Problem_defs.hh \
+PIP_Problem_inlines.hh \
+PIP_Problem_templates.hh \
+Poly_Con_Relation_defs.hh \
+Poly_Con_Relation_inlines.hh \
+Poly_Gen_Relation_defs.hh \
+Poly_Gen_Relation_inlines.hh \
+BHRZ03_Certificate_defs.hh \
+BHRZ03_Certificate_inlines.hh \
+H79_Certificate_defs.hh \
+H79_Certificate_inlines.hh \
+Grid_Certificate_defs.hh \
+Grid_Certificate_inlines.hh \
+Partial_Function_defs.hh \
+Partial_Function_inlines.hh \
+Polyhedron_defs.hh \
+Ph_Status_inlines.hh \
+Polyhedron_inlines.hh \
+Polyhedron_chdims_templates.hh \
+Polyhedron_conversion_templates.hh \
+Polyhedron_minimize_templates.hh \
+Polyhedron_simplify_templates.hh \
+Polyhedron_templates.hh \
+Grid_defs.hh \
+Grid_Status_inlines.hh \
+Grid_inlines.hh \
+Grid_templates.hh \
+C_Polyhedron_defs.hh \
+C_Polyhedron_inlines.hh \
+NNC_Polyhedron_defs.hh \
+NNC_Polyhedron_inlines.hh \
+Widening_Function_types.hh \
+Widening_Function_defs.hh \
+Widening_Function_inlines.hh \
+Ptr_Iterator_defs.hh \
+Ptr_Iterator_inlines.hh \
+DB_Row_defs.hh \
+DB_Row_inlines.hh \
+DB_Row_templates.hh \
+DB_Matrix_defs.hh \
+DB_Matrix_inlines.hh \
+DB_Matrix_templates.hh \
+BD_Shape_defs.hh \
+BDS_Status_inlines.hh \
+BD_Shape_inlines.hh \
+BD_Shape_templates.hh \
+OR_Matrix_defs.hh \
+OR_Matrix_inlines.hh \
+OR_Matrix_templates.hh \
+Octagonal_Shape_defs.hh \
+Og_Status_inlines.hh \
+Octagonal_Shape_inlines.hh \
+Octagonal_Shape_templates.hh \
+Determinate_types.hh \
+Determinate_defs.hh \
+Determinate_inlines.hh \
+Powerset_types.hh \
+Powerset_defs.hh \
+Powerset_inlines.hh \
+Powerset_templates.hh \
+Pointset_Powerset_types.hh \
+Pointset_Powerset_defs.hh \
+Pointset_Powerset_inlines.hh \
+Pointset_Powerset_templates.hh \
+Partially_Reduced_Product_types.hh \
+Partially_Reduced_Product_defs.hh \
+Partially_Reduced_Product_inlines.hh \
+Partially_Reduced_Product_templates.hh \
+Weight_Profiler_defs.hh \
+max_space_dimension.hh \
+algorithms.hh \
+termination_defs.hh \
+termination_templates.hh \
+wrap_assign.hh \
+wrap_string.hh \
+Floating_Point_Expression_types.hh \
+Floating_Point_Expression_defs.hh \
+Floating_Point_Expression_inlines.hh \
+Floating_Point_Expression_templates.hh \
+Cast_Floating_Point_Expression_types.hh \
+Cast_Floating_Point_Expression_defs.hh \
+Cast_Floating_Point_Expression_inlines.hh \
+Cast_Floating_Point_Expression_templates.hh \
+Constant_Floating_Point_Expression_types.hh \
+Constant_Floating_Point_Expression_defs.hh \
+Constant_Floating_Point_Expression_inlines.hh \
+Variable_Floating_Point_Expression_types.hh \
+Variable_Floating_Point_Expression_defs.hh \
+Variable_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_types.hh \
+Sum_Floating_Point_Expression_defs.hh \
+Sum_Floating_Point_Expression_inlines.hh \
+Sum_Floating_Point_Expression_templates.hh \
+Difference_Floating_Point_Expression_types.hh \
+Difference_Floating_Point_Expression_defs.hh \
+Difference_Floating_Point_Expression_inlines.hh \
+Difference_Floating_Point_Expression_templates.hh \
+Multiplication_Floating_Point_Expression_types.hh \
+Multiplication_Floating_Point_Expression_defs.hh \
+Multiplication_Floating_Point_Expression_inlines.hh \
+Multiplication_Floating_Point_Expression_templates.hh \
+Division_Floating_Point_Expression_types.hh \
+Division_Floating_Point_Expression_defs.hh \
+Division_Floating_Point_Expression_inlines.hh \
+Division_Floating_Point_Expression_templates.hh \
+Opposite_Floating_Point_Expression_types.hh \
+Opposite_Floating_Point_Expression_defs.hh \
+Opposite_Floating_Point_Expression_inlines.hh \
+Doubly_Linked_Object_types.hh \
+EList_types.hh \
+EList_Iterator_types.hh \
+Handler_types.hh \
+Pending_Element_types.hh \
+Pending_List_types.hh \
+Time_types.hh \
+Watchdog_types.hh \
+Threshold_Watcher_types.hh \
+Handler_defs.hh \
+Handler_inlines.hh \
+Time_defs.hh \
+Time_inlines.hh \
+Doubly_Linked_Object_defs.hh \
+Doubly_Linked_Object_inlines.hh \
+EList_Iterator_defs.hh \
+EList_Iterator_inlines.hh \
+EList_defs.hh \
+EList_inlines.hh \
+Pending_Element_defs.hh \
+Pending_Element_inlines.hh \
+Pending_List_defs.hh \
+Pending_List_inlines.hh \
+Pending_List_templates.hh \
+Watchdog_defs.hh \
+Watchdog_inlines.hh \
+Threshold_Watcher_defs.hh \
+Threshold_Watcher_inlines.hh \
+Threshold_Watcher_templates.hh
+
+#Any_Pointset_types.hh \
+#Any_Pointset_defs.hh \
+#Any_Pointset_inlines.hh \
+#Ask_Tell_types.hh \
+#Ask_Tell_defs.hh \
+#Ask_Tell_inlines.hh \
+#Ask_Tell_templates.hh \
+#Pointset_Ask_Tell_types.hh \
+#Pointset_Ask_Tell_defs.hh \
+#Pointset_Ask_Tell_inlines.hh \
+#Pointset_Ask_Tell_templates.hh
+NESTED_INCLUDE_FILES = \
+Ph_Status_idefs.hh \
+Grid_Status_idefs.hh \
+Box_Status_idefs.hh \
+BDS_Status_idefs.hh \
+Og_Status_idefs.hh
+
+libppl_la_SOURCES = \
+assert.cc \
+Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.cc \
+fpu-ia32.cc \
+Concrete_Expression.cc \
+Constraint.cc \
+Constraint_System.cc \
+Congruence.cc \
+Congruence_System.cc \
+Generator_System.cc \
+Grid_Generator_System.cc \
+Generator.cc \
+Grid_Generator.cc \
+Init.cc \
+Coefficient.cc \
+Linear_Expression.cc \
+Linear_Expression_Impl.cc \
+Linear_Expression_Interface.cc \
+Linear_Form.cc \
+Scalar_Products.cc \
+MIP_Problem.cc \
+PIP_Tree.cc \
+PIP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.cc \
+Partial_Function.cc \
+Polyhedron_nonpublic.cc \
+Polyhedron_public.cc \
+Polyhedron_chdims.cc \
+Polyhedron_widenings.cc \
+C_Polyhedron.cc \
+NNC_Polyhedron.cc \
+Grid_nonpublic.cc \
+Grid_public.cc \
+Grid_chdims.cc \
+Grid_widenings.cc \
+BD_Shape.cc \
+Octagonal_Shape.cc \
+Pointset_Powerset.cc \
+CO_Tree.cc \
+Sparse_Row.cc \
+Dense_Row.cc \
+Bit_Matrix.cc \
+Bit_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+Variables_Set.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+stdiobuf.cc \
+c_streambuf.cc \
+globals.cc \
+mp_std_bits.cc \
+Weight_Profiler.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort_templates.hh \
+termination.cc \
+wrap_string.cc \
+Time.cc \
+Watchdog.cc \
+Threshold_Watcher.cc
+
+#Pointset_Ask_Tell.cc
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+libppl_la_LIBADD = @extra_libraries@
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+ at BUILD_CXX_INTERFACE_TRUE@include_HEADERS = ppl.hh
+ at BUILD_CXX_INTERFACE_FALSE@noinst_HEADERS = ppl.hh
+nodist_noinst_HEADERS = ppl_include_files.hh
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+ at USE_PRECOMPILED_HEADERS_FALSE@PRECOMPILED = 
+ at USE_PRECOMPILED_HEADERS_TRUE@PRECOMPILED = ppl.hh.gch
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.hh \
+BUGS.cc \
+COPYING.hh \
+COPYING.cc \
+CREDITS.hh \
+CREDITS.cc
+
+CLEANFILES = $(BUILT_SOURCES)
+all: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+version.hh: $(top_builddir)/config.status $(srcdir)/version.hh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+ppl-config.cc: $(top_builddir)/config.status $(srcdir)/ppl-config.cc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libppl.la: $(libppl_la_OBJECTS) $(libppl_la_DEPENDENCIES) $(EXTRA_libppl_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libppl_la_LINK) -rpath $(libdir) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+ppl-config$(EXEEXT): $(ppl_config_OBJECTS) $(ppl_config_DEPENDENCIES) $(EXTRA_ppl_config_DEPENDENCIES) 
+	@rm -f ppl-config$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ppl_config_OBJECTS) $(ppl_config_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BD_Shape.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BHRZ03_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BUGS.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bit_Matrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Bit_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Box.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/COPYING.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CO_Tree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/CREDITS.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/C_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Checked_Number.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Coefficient.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Concrete_Expression.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Congruence.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Congruence_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Constraint.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Constraint_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Dense_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Float.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Generator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Generator_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Generator.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Generator_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_chdims.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_conversion.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_nonpublic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_public.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_simplify.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Grid_widenings.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H79_Certificate.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression_Impl.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Expression_Interface.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_Form.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/MIP_Problem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/NNC_Polyhedron.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Octagonal_Shape.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PIP_Problem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/PIP_Tree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Partial_Function.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Ph_Status.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pointset_Powerset.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Con_Relation.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Poly_Gen_Relation.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_chdims.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_nonpublic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_public.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Polyhedron_widenings.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Scalar_Products.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Sparse_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Threshold_Watcher.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Time.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variable.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Variables_Set.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Watchdog.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Weight_Profiler.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/assert.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/c_streambuf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/checked.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fpu-ia32.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/globals.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mp_std_bits.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl-config.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stdiobuf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/termination.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/version.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap_string.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
+	uninstall-libLTLIBRARIES
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+	clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am \
+	install-includeHEADERS install-info install-info-am \
+	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+	uninstall-includeHEADERS uninstall-libLTLIBRARIES
+
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+	for file in $(INCLUDE_FILES) ; \
+	do \
+	  i="#include \"$$file\"" ; \
+	  ( cd $(top_srcdir)/src ; $(FGREP) -q "$$i" $(INCLUDE_FILES) ) || echo "$$i" ; \
+	done > $@
+
+ at HAVE_PERL_TRUE@ppl.hh:	$(top_builddir)/ppl-config.h $(top_builddir)/src/version.hh ppl_header.hh ppl_include_files.hh $(INCLUDE_FILES) $(NESTED_INCLUDE_FILES) Makefile $(top_builddir)/utils/build_header
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/build_header \
+ at HAVE_PERL_TRUE@		-I $(top_builddir) -I $(top_builddir)/src \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/src/ppl_header.hh >$@
+
+ at HAVE_PERL_TRUE@BUGS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ at HAVE_PERL_TRUE@	@echo "#ifndef PPL_BUGS_hh" >$@
+ at HAVE_PERL_TRUE@	@echo "#define PPL_BUGS_hh 1" >>$@
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=BUGS_array --decl-only \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/BUGS >>$@
+ at HAVE_PERL_TRUE@	@echo "#endif // !defined(PPL_BUGS_hh)" >>$@
+ at HAVE_PERL_TRUE@BUGS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/BUGS >$@
+
+ at HAVE_PERL_TRUE@COPYING.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ at HAVE_PERL_TRUE@	@echo "#ifndef PPL_COPYING_hh" >$@
+ at HAVE_PERL_TRUE@	@echo "#define PPL_COPYING_hh 1" >>$@
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=COPYING_array --decl-only \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/COPYING >>$@
+ at HAVE_PERL_TRUE@	@echo "#endif // !defined(PPL_COPYING_hh)" >>$@
+
+ at HAVE_PERL_TRUE@COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/COPYING >$@
+ at HAVE_PERL_TRUE@CREDITS.hh: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ at HAVE_PERL_TRUE@	@echo "#ifndef PPL_CREDITS_hh" >$@
+ at HAVE_PERL_TRUE@	@echo "#define PPL_CREDITS_hh 1" >>$@
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=CREDITS_array --decl-only \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/CREDITS >>$@
+ at HAVE_PERL_TRUE@	@echo "#endif // !defined(PPL_CREDITS_hh)" >>$@
+ at HAVE_PERL_TRUE@CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ at HAVE_PERL_TRUE@	$(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+ at HAVE_PERL_TRUE@		$(top_srcdir)/CREDITS >$@
+
+ at HAVE_PERL_FALSE@ppl.hh.sed: Makefile
+ at HAVE_PERL_FALSE@	@echo "/^\/\* BEGIN ppl-config.h \*\/$$/ {"    >$@
+ at HAVE_PERL_FALSE@	@echo "  r $(top_builddir)/ppl-config.h"      >>$@
+ at HAVE_PERL_FALSE@	@echo "  : loop"                              >>$@
+ at HAVE_PERL_FALSE@	@echo "  /\n\/\* END ppl-config.h \*\/$$/ !{" >>$@
+ at HAVE_PERL_FALSE@	@echo "    N"                                 >>$@
+ at HAVE_PERL_FALSE@	@echo "    b loop"                            >>$@
+ at HAVE_PERL_FALSE@	@echo "  }"                                   >>$@
+ at HAVE_PERL_FALSE@	@echo "  d"                                   >>$@
+ at HAVE_PERL_FALSE@	@echo "}"                                     >>$@
+
+ at HAVE_PERL_FALSE@ppl.hh:	ppl.hh.dist ppl.hh.sed
+ at HAVE_PERL_FALSE@	$(SED) -f ppl.hh.sed ppl.hh.dist >$@
+ at HAVE_PERL_FALSE@	rm -f ppl.hh.sed
+
+ at HAVE_PERL_FALSE@BUGS.hh:	BUGS.hh.dist
+ at HAVE_PERL_FALSE@	cp -f BUGS.hh.dist $@
+ at HAVE_PERL_FALSE@BUGS.cc:	BUGS.cc.dist
+ at HAVE_PERL_FALSE@	cp -f BUGS.cc.dist $@
+ at HAVE_PERL_FALSE@COPYING.hh:	COPYING.hh.dist
+ at HAVE_PERL_FALSE@	cp -f COPYING.hh.dist $@
+ at HAVE_PERL_FALSE@COPYING.cc:	COPYING.cc.dist
+ at HAVE_PERL_FALSE@	cp -f COPYING.cc.dist $@
+ at HAVE_PERL_FALSE@CREDITS.hh:	CREDITS.hh.dist
+ at HAVE_PERL_FALSE@	cp -f CREDITS.hh.dist $@
+ at HAVE_PERL_FALSE@CREDITS.cc:	CREDITS.cc.dist
+ at HAVE_PERL_FALSE@	cp -f CREDITS.cc.dist $@
+
+ at USE_PRECOMPILED_HEADERS_TRUE@ppl.hh.gch: ppl.hh
+ at USE_PRECOMPILED_HEADERS_TRUE@	$(CXXCOMPILE) -xc++-header -o $@ ppl.hh
+
+# ppl.hh is not distributed.
+# ppl.hh.dist, which is distributed, is a copy of ppl.hh;
+# likewise for BUGS.cc.dist, COPYING.cc.dist and CREDITS.cc.dist.
+dist-hook:
+	mv -f $(distdir)/ppl.hh $(distdir)/ppl.hh.dist
+	mv -f $(distdir)/BUGS.hh $(distdir)/BUGS.hh.dist
+	mv -f $(distdir)/BUGS.cc $(distdir)/BUGS.cc.dist
+	mv -f $(distdir)/COPYING.hh $(distdir)/COPYING.hh.dist
+	mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+	mv -f $(distdir)/CREDITS.hh $(distdir)/CREDITS.hh.dist
+	mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+
+$(top_builddir)/utils/build_header:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils build_header
+
+$(top_builddir)/utils/text2cxxarray:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils text2cxxarray
+
+$(top_builddir)/ppl-config.h:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir) ppl-config.h
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/Matrix_defs.hh b/src/Matrix_defs.hh
new file mode 100644
index 0000000..02743b7
--- /dev/null
+++ b/src/Matrix_defs.hh
@@ -0,0 +1,437 @@
+/* Matrix class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Matrix_defs_hh
+#define PPL_Matrix_defs_hh 1
+
+#include "Matrix_types.hh"
+#include "globals_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Swapping_Vector_defs.hh"
+#include <ostream>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A sparse matrix of Coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Matrix {
+
+public:
+  typedef typename Swapping_Vector<Row>::iterator iterator;
+  typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+  //! Returns the maximum number of rows of a Sparse_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns of a Sparse_Matrix.
+  static dimension_type max_num_columns();
+
+  /*!
+    \brief Constructs a square matrix with the given size, filled with
+           unstored zeroes.
+
+    \param n
+    The size of the new square matrix.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  explicit Matrix(dimension_type n = 0);
+
+  /*!
+    \brief Constructs a matrix with the given dimensions, filled with unstored
+           zeroes.
+
+    \param num_rows
+    The number of rows in the new matrix.
+
+    \param num_columns
+    The number of columns in the new matrix.
+
+    This method takes \f$O(n)\f$ time, where n is \p num_rows.
+  */
+  Matrix(dimension_type num_rows, dimension_type num_columns);
+
+  //! Swaps (*this) with x.
+  /*!
+
+    \param x
+    The matrix that will be swapped with *this.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void m_swap(Matrix& x);
+
+  //! Returns the number of rows in the matrix.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type num_rows() const;
+
+  //! Returns the number of columns in the matrix.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type num_columns() const;
+
+  // TODO: Check if this can be removed.
+  //! Returns the capacity of the row vector.
+  dimension_type capacity() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no rows.
+  /*!
+    \note
+    The unusual naming for this method is \em intentional:
+    we do not want it to be named \c empty because this would cause
+    an error prone name clash with the corresponding methods in derived
+    classes Constraint_System and Congruence_System (which have a
+    different semantics).
+  */
+  bool has_no_rows() const;
+
+  //! Equivalent to resize(n, n).
+  void resize(dimension_type n);
+
+  // TODO: Check if this can become private.
+  //! Reserves space for at least \p n rows.
+  void reserve_rows(dimension_type n);
+
+  //! Resizes this matrix to the specified dimensions.
+  /*!
+
+    \param num_rows
+    The desired numer of rows.
+
+    \param num_columns
+    The desired numer of columns.
+
+    New rows and columns will contain non-stored zeroes.
+
+    This operation invalidates existing iterators.
+
+    Adding n rows takes \f$O(n)\f$ amortized time.
+
+    Adding n columns takes \f$O(r)\f$ time, where r is \p num_rows.
+
+    Removing n rows takes \f$O(n+k)\f$ amortized time, where k is the total
+    number of elements stored in the removed rows.
+
+    Removing n columns takes \f$O(\sum_{j=1}^{r} (k_j*\log^2 n_j))\f$ time,
+    where r is the number of rows, \f$k_j\f$ is the number of elements stored
+    in the columns of the j-th row that must be removed and \f$n_j\f$ is the
+    total number of elements stored in the j-th row.
+    A weaker (but simpler) bound is \f$O(r+k*\log^2 c)\f$, where r is the
+    number of rows, k is the number of elements that have to be removed and c
+    is the number of columns.
+  */
+  void resize(dimension_type num_rows, dimension_type num_columns);
+
+  //! Adds \p n rows and \p m columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param m
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times (c+m)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+
+    This method takes \f$O(r)\f$ time, where r is the number of the matrix's
+    rows after the operation.
+  */
+  void add_zero_rows_and_columns(dimension_type n, dimension_type m);
+
+  //! Adds to the matrix \p n rows of zeroes.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+
+    This method takes \f$O(k)\f$ amortized time, where k is the number of the
+    new rows.
+  */
+  void add_zero_rows(dimension_type n);
+
+  //! Adds a copy of the row \p x at the end of the matrix.
+  /*!
+
+    \param x
+    The row that will be appended to the matrix.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(n)\f$ amortized time, where n is the numer of
+    elements stored in \p x.
+  */
+  void add_row(const Row& x);
+
+  //! Adds the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be added: it must have the same size and capacity as
+    \p *this. It is not declared <CODE>const</CODE> because its
+    data-structures will recycled to build the new matrix row.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\genfrac{(}{)}{0pt}{}{M}{y}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_recycled_row(Row& y);
+
+  /*! \brief
+    Removes from the matrix the last \p n rows.
+
+    \param n
+    The number of row that will be removed.
+
+    It is equivalent to num_rows() - n, num_columns()).
+
+    This method takes \f$O(n+k)\f$ amortized time, where k is the total number
+    of elements stored in the removed rows and n is the number of removed
+    rows.
+  */
+  void remove_trailing_rows(dimension_type n);
+
+  void remove_rows(iterator first, iterator last);
+
+  //! Permutes the columns of the matrix.
+  /*!
+    This method may be slow for some Row types, and should be avoided if
+    possible.
+
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of \e non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 7
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+
+    This method takes \f$O(k*\sum_{j=1}^{r} \log^2 n_j)\f$ expected time,
+    where k is the size of the \p cycles vector, r the number of rows and
+    \f$n_j\f$ the number of elements stored in row j.
+    A weaker (but simpler) bound is \f$O(k*r*\log^2 c)\f$, where k is the size
+    of the \p cycles vector, r is the number of rows and c is the number of
+    columns.
+
+    \note
+    The first column of the matrix, having index zero, is never involved
+    in a permutation.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_columns(dimension_type i,  dimension_type j);
+
+  //! Adds \p n columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+
+    This method takes \f$O(r)\f$ amortized time, where r is the numer of the
+    matrix's rows.
+  */
+  void add_zero_columns(dimension_type n);
+
+  //! Adds \p n columns of non-stored zeroes to the matrix before column i.
+  /*!
+
+    \param n
+    The numer of columns that will be added.
+
+    \param i
+    The index of the column before which the new columns will be added.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\sum_{j=1}^{r} (k_j+\log n_j))\f$ time, where r is
+    the number of rows, \f$k_j\f$ is the number of elements stored in the
+    columns of the j-th row that must be shifted and \f$n_j\f$ is the number
+    of elements stored in the j-th row.
+    A weaker (but simpler) bound is \f$O(k+r*\log c)\f$ time, where k is the
+    number of elements that must be shifted, r is the number of the rows and c
+    is the number of the columns.
+  */
+  void add_zero_columns(dimension_type n, dimension_type i);
+
+  //! Removes the i-th from the matrix, shifting other columns to the left.
+  /*!
+
+    \param i
+    The index of the column that will be removed.
+
+    This operation invalidates existing iterators on rows' elements.
+
+    This method takes \f$O(k + \sum_{j=1}^{r} (\log^2 n_j))\f$ amortized time,
+    where k is the number of elements stored with column index greater than i,
+    r the number of rows in this matrix and \f$n_j\f$ the number of elements
+    stored in row j.
+    A weaker (but simpler) bound is \f$O(r*(c-i+\log^2 c))\f$, where r is the
+    number of rows, c is the number of columns and i is the parameter passed
+    to this method.
+  */
+  void remove_column(dimension_type i);
+
+  //! Shrinks the matrix by removing its \p n trailing columns.
+  /*!
+
+    \param n
+    The number of trailing columns that will be removed.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\sum_{j=1}^r (k_j*\log n_j))\f$ amortized time,
+    where r is the number of rows, \f$k_j\f$ is the number of elements that
+    have to be removed from row j and \f$n_j\f$ is the total number of
+    elements stored in row j.
+    A weaker (but simpler) bound is \f$O(r*n*\log c)\f$, where r is the number
+    of rows, c the number of columns and n the parameter passed to this
+    method.
+  */
+  void remove_trailing_columns(dimension_type n);
+
+  //! Equivalent to resize(0,0).
+  void clear();
+
+  //! Returns an %iterator pointing to the first row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator begin();
+
+  //! Returns an %iterator pointing after the last row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator end();
+
+  //! Returns an %iterator pointing to the first row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator begin() const;
+
+  //! Returns an %iterator pointing after the last row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator end() const;
+
+  //! Returns a reference to the i-th row.
+  /*!
+    \param i
+    The index of the desired row.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  Row& operator[](dimension_type i);
+
+  //! Returns a const reference to the i-th row.
+  /*!
+    \param i
+    The index of the desired row.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const Row& operator[](dimension_type i) const;
+
+  //! Loads the row from an ASCII representation generated using ascii_dump().
+  /*!
+    \param s
+    The stream from which read the ASCII representation.
+
+    This method takes \f$O(n*\log n)\f$ time.
+  */
+  bool ascii_load(std::istream& s);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  /*!
+    This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+    number of elements stored in the matrix.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+    number of elements stored in the matrix.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The vector that stores the matrix's elements.
+  Swapping_Vector<Row> rows;
+
+  //! The number of columns in this matrix.
+  dimension_type num_columns_;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Matrix<Row>& x, Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Matrix<Row>& x, const Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Matrix<Row>& x, const Matrix<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+#include "Matrix_inlines.hh"
+#include "Matrix_templates.hh"
+
+#endif // !defined(PPL_Matrix_defs_hh)
diff --git a/src/Matrix_inlines.hh b/src/Matrix_inlines.hh
new file mode 100644
index 0000000..1e7bee9
--- /dev/null
+++ b/src/Matrix_inlines.hh
@@ -0,0 +1,200 @@
+/* Matrix class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Matrix_inlines_hh
+#define PPL_Matrix_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_rows() {
+  return std::vector<Row>().max_size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_columns() {
+  return Row::max_size();
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::m_swap(Matrix& x) {
+  using std::swap;
+  swap(rows, x.rows);
+  swap(num_columns_, x.num_columns_);
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_rows() const {
+  return rows.size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_columns() const {
+  return num_columns_;
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::capacity() const {
+  return rows.capacity();
+}
+
+template <typename Row>
+inline bool
+Matrix<Row>::has_no_rows() const {
+  return num_rows() == 0;
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::resize(dimension_type n) {
+  resize(n, n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::reserve_rows(dimension_type requested_capacity) {
+
+  rows.reserve(requested_capacity);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows_and_columns(dimension_type n, dimension_type m) {
+  resize(num_rows() + n, num_columns() + m);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows(dimension_type n) {
+  resize(num_rows() + n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_row(const Row& x) {
+  // TODO: Optimize this.
+  Row row(x);
+  add_zero_rows(1);
+  // Now x may have been invalidated, if it was a row of this matrix.
+  swap(rows.back(), row);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_recycled_row(Row& x) {
+  add_zero_rows(1);
+  swap(rows.back(), x);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_rows(dimension_type n) {
+  resize(num_rows() - n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_rows(iterator first, iterator last) {
+  rows.erase(first, last);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_columns(dimension_type n) {
+  resize(num_rows(), num_columns() + n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_columns(dimension_type n) {
+  PPL_ASSERT(n <= num_columns());
+  resize(num_rows(), num_columns() - n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::clear() {
+  resize(0, 0);
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::begin() {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::end() {
+  return rows.end();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::begin() const {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::end() const {
+  return rows.end();
+}
+
+template <typename Row>
+inline Row&
+Matrix<Row>::operator[](dimension_type i) {
+  PPL_ASSERT(i < rows.size());
+  return rows[i];
+}
+
+template <typename Row>
+inline const Row&
+Matrix<Row>::operator[](dimension_type i) const {
+  PPL_ASSERT(i < rows.size());
+  return rows[i];
+}
+
+template <typename Row>
+inline memory_size_type
+Matrix<Row>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline void
+swap(Matrix<Row>& x, Matrix<Row>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_inlines_hh)
diff --git a/src/Matrix_templates.hh b/src/Matrix_templates.hh
new file mode 100644
index 0000000..e091eaa
--- /dev/null
+++ b/src/Matrix_templates.hh
@@ -0,0 +1,202 @@
+/* Matrix class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Matrix_templates_hh
+#define PPL_Matrix_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type n)
+  : rows(n), num_columns_(n) {
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].resize(num_columns_);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type num_rows, dimension_type num_columns)
+  : rows(num_rows), num_columns_(num_columns) {
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].resize(num_columns_);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::resize(dimension_type num_rows, dimension_type num_columns) {
+  const dimension_type old_num_rows = rows.size();
+  rows.resize(num_rows);
+  if (old_num_rows < num_rows) {
+    for (dimension_type i = old_num_rows; i < num_rows; ++i)
+      rows[i].resize(num_columns);
+    if (num_columns_ != num_columns) {
+      num_columns_ = num_columns;
+      for (dimension_type i = 0; i < old_num_rows; ++i)
+        rows[i].resize(num_columns);
+    }
+  }
+  else
+    if (num_columns_ != num_columns) {
+      num_columns_ = num_columns;
+      for (dimension_type i = 0; i < num_rows; ++i)
+        rows[i].resize(num_columns);
+    }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::permute_columns(const std::vector<dimension_type>& cycles) {
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+  const dimension_type n = cycles.size();
+  PPL_ASSERT(cycles[n - 1] == 0);
+  for (dimension_type k = num_rows(); k-- > 0; ) {
+    Row& rows_k = (*this)[k];
+    for (dimension_type i = 0, j = 0; i < n; i = ++j) {
+      // Make `j' be the index of the next cycle terminator.
+      while (cycles[j] != 0)
+        ++j;
+      // Cycles of length less than 2 are not allowed.
+      PPL_ASSERT(j - i >= 2);
+      if (j - i == 2)
+        // For cycles of length 2 no temporary is needed, just a swap.
+        rows_k.swap_coefficients(cycles[i], cycles[i + 1]);
+      else {
+        // Longer cycles need a temporary.
+        tmp = rows_k.get(cycles[j - 1]);
+        for (dimension_type l = (j - 1); l > i; --l)
+          rows_k.swap_coefficients(cycles[l-1], cycles[l]);
+        if (tmp == 0)
+          rows_k.reset(cycles[i]);
+        else {
+          using std::swap;
+          swap(tmp, rows_k[cycles[i]]);
+        }
+      }
+    }
+  }
+}
+
+template <typename Row>
+void
+Matrix<Row>::swap_columns(dimension_type i, dimension_type j) {
+  for (dimension_type k = num_rows(); k-- > 0; )
+    (*this)[k].swap_coefficients(i, j);
+}
+
+template <typename Row>
+void
+Matrix<Row>::add_zero_columns(dimension_type n, dimension_type i) {
+  for (dimension_type j = rows.size(); j-- > 0; )
+    rows[j].add_zeroes_and_shift(n, i);
+  num_columns_ += n;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::remove_column(dimension_type i) {
+  for (dimension_type j = rows.size(); j-- > 0; )
+    rows[j].delete_element_and_shift(i);
+  --num_columns_;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::ascii_dump(std::ostream& s) const {
+  s << num_rows() << " x ";
+  s << num_columns() << "\n";
+  for (const_iterator i = begin(), i_end = end(); i !=i_end; ++i)
+    i->ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Matrix<Row>)
+
+template <typename Row>
+bool
+Matrix<Row>::ascii_load(std::istream& s) {
+  std::string str;
+  dimension_type new_num_rows;
+  dimension_type new_num_cols;
+  if (!(s >> new_num_rows))
+    return false;
+  if (!(s >> str) || str != "x")
+    return false;
+  if (!(s >> new_num_cols))
+    return false;
+
+  for (iterator i = rows.begin(), i_end = rows.end(); i != i_end; ++i)
+    i->clear();
+
+  resize(new_num_rows, new_num_cols);
+
+  for (dimension_type row = 0; row < new_num_rows; ++row)
+    if (!rows[row].ascii_load(s))
+      return false;
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename Row>
+memory_size_type
+Matrix<Row>::external_memory_in_bytes() const {
+  return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+bool
+Matrix<Row>::OK() const {
+  for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+    if (i->size() != num_columns_)
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator==(const Matrix<Row>& x, const Matrix<Row>& y) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  if (x.num_columns() != y.num_columns())
+    return false;
+  for (dimension_type i = x.num_rows(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator!=(const Matrix<Row>& x, const Matrix<Row>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_templates_hh)
diff --git a/src/Matrix_types.hh b/src/Matrix_types.hh
new file mode 100644
index 0000000..40e0185
--- /dev/null
+++ b/src/Matrix_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Matrix_types_hh
+#define PPL_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_types_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_defs.hh b/src/Multiplication_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..d660399
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_defs.hh
@@ -0,0 +1,251 @@
+/* Declarations for the Multiplication_Floating_Point_Expression class and
+   its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_defs_hh
+#define PPL_Multiplication_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Multiplication_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Multiplication Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of multiplication floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+  operators on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  i
+  \amlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \amifp i'\right)
+  + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left([a, b]
+  \amlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+  \aslf
+  \left([a, b]
+  \amlf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1].
+  \f].
+
+  Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+  \f]
+
+  Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}
+  \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+  method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+  and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+
+  Even though we intervalize the first operand in the above example, the
+  actual implementation utilizes an heuristics for choosing which of the two
+  operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the multiplication floating point
+    expression corresponding to \p x \f$\otimes\f$ \p y.
+  */
+  Multiplication_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+  //! Destructor.
+  ~Multiplication_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor.
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                         const FP_Linear_Form_Abstract_Store& lf_store,
+                       FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+                                                       FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Multiplication_Floating_Point_Expression(
+         const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+                                                        FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+            FP_Format>& e);
+
+
+}; // class Multiplication_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Multiplication_Floating_Point_Expression_inlines.hh"
+#include "Multiplication_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_defs_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_inlines.hh b/src/Multiplication_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..4c4ffaf
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,71 @@
+/* Multiplication_Floating_Point_Expression class implementation: inline
+   functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_inlines_hh
+#define PPL_Multiplication_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Multiplication_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+  : first_operand(x), second_operand(y) {
+  assert(x != 0);
+  assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Multiplication_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+                                                  FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_inlines_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_templates.hh b/src/Multiplication_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..762d7bd
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_templates.hh
@@ -0,0 +1,109 @@
+/* Multiplication_Floating_Point_Expression class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_templates_hh
+#define PPL_Multiplication_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  /*
+    FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+    decide which of the two linear forms must be intervalized, as described
+    in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+    thesis "Weakly Relational Numerical Abstract Domains".
+    In this Section are also described other multiplication strategies, such
+    as All-Cases, Relative-Size Local, Simplification-Driven Global and
+    Homogeneity Global.
+  */
+
+  // Here we choose which of the two linear forms must be intervalized.
+
+  // true if we intervalize the first form, false if we intervalize the second.
+  bool intervalize_first;
+  FP_Linear_Form linearized_first_operand;
+  if (!first_operand->linearize(int_store, lf_store,
+                               linearized_first_operand))
+    return false;
+  FP_Interval_Type intervalized_first_operand;
+  this->intervalize(linearized_first_operand, int_store,
+                    intervalized_first_operand);
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                                linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  this->intervalize(linearized_second_operand, int_store,
+                    intervalized_second_operand);
+
+  // FIXME: we are not sure that what we do here is policy-proof.
+  if (intervalized_first_operand.is_bounded()) {
+    if (intervalized_second_operand.is_bounded()) {
+      boundary_type first_interval_size
+        = intervalized_first_operand.upper()
+        - intervalized_first_operand.lower();
+      boundary_type second_interval_size
+        = intervalized_second_operand.upper()
+        - intervalized_second_operand.lower();
+      if (first_interval_size <= second_interval_size)
+        intervalize_first = true;
+      else
+        intervalize_first = false;
+    }
+    else
+      intervalize_first = true;
+  }
+  else {
+    if (intervalized_second_operand.is_bounded())
+      intervalize_first = false;
+    else
+      return false;
+  }
+
+  // Here we do the actual computation.
+  // For optimizing, we store the relative error directly into result.
+  if (intervalize_first) {
+    relative_error(linearized_second_operand, result);
+    linearized_second_operand *= intervalized_first_operand;
+    result *= intervalized_first_operand;
+    result += linearized_second_operand;
+  }
+  else {
+    relative_error(linearized_first_operand, result);
+    linearized_first_operand *= intervalized_second_operand;
+    result *= intervalized_second_operand;
+    result += linearized_first_operand;
+  }
+
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_templates_hh)
diff --git a/src/Multiplication_Floating_Point_Expression_types.hh b/src/Multiplication_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..5e00f29
--- /dev/null
+++ b/src/Multiplication_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Multiplication_Floating_Point_Expression_types_hh
+#define PPL_Multiplication_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Multiplication_Floating_Point_Expression_types_hh)
diff --git a/src/NNC_Polyhedron.cc b/src/NNC_Polyhedron.cc
new file mode 100644
index 0000000..65fb421
--- /dev/null
+++ b/src/NNC_Polyhedron.cc
@@ -0,0 +1,88 @@
+/* NNC_Polyhedron class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "NNC_Polyhedron_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+  add_constraints(y.constraints());
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Congruence_System& cgs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(cgs.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(cgs)",
+                                              "the space dimension of cgs "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_congruences(cgs);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(cgs.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(cgs, recycle)",
+                                              "the space dimension of cgs "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_congruences(cgs);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Grid& grid, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(grid.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(grid)",
+                                              "the space dimension of grid "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(grid.constraints());
+}
+
+bool
+PPL::NNC_Polyhedron::poly_hull_assign_if_exact(const NNC_Polyhedron& y) {
+#define USE_BHZ09 1
+#if USE_BHZ09 // [BagnaraHZ09]
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("poly_hull_assign_if_exact(y)", "y", y);
+  return BHZ09_poly_hull_assign_if_exact(y);
+#else // Old implementation.
+  return PPL::poly_hull_assign_if_exact(*this, y);
+#endif
+#undef USE_BHZ09
+}
diff --git a/src/NNC_Polyhedron_defs.hh b/src/NNC_Polyhedron_defs.hh
new file mode 100644
index 0000000..bf8caf2
--- /dev/null
+++ b/src/NNC_Polyhedron_defs.hh
@@ -0,0 +1,267 @@
+/* NNC_Polyhedron class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_NNC_Polyhedron_defs_hh
+#define PPL_NNC_Polyhedron_defs_hh 1
+
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_types.hh"
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class NNC_Polyhedron represents a
+    <EM>not necessarily closed</EM> (NNC) convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    \note
+    Since NNC polyhedra are a generalization of closed polyhedra,
+    any object of the class C_Polyhedron can be (explicitly) converted
+    into an object of the class NNC_Polyhedron.
+    The reason for defining two different classes is that objects of
+    the class C_Polyhedron are characterized by a more efficient
+    implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty NNC polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the NNC polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty NNC polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe NNC polyhedron is built.
+  */
+  explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+                          Degenerate_Element kind = UNIVERSE);
+
+  //! Builds an NNC polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Constraint_System& cs);
+
+  //! Builds an NNC polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  NNC_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds an NNC polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(const Generator_System& gs);
+
+  //! Builds an NNC polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  NNC_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+  //! Builds an NNC polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds an NNC polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  NNC_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds an NNC polyhedron from the C polyhedron \p y.
+  /*!
+    \param y
+    The C polyhedron to be used;
+
+    \param complexity
+    This argument is ignored.
+  */
+  explicit NNC_Polyhedron(const C_Polyhedron& y,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an NNC polyhedron out of a box.
+  /*!
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
+
+    \param box
+    The box representing the polyhedron to be built;
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Interval>
+  explicit NNC_Polyhedron(const Box<Interval>& box,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an NNC polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
+
+    \param grid
+    The grid used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit NNC_Polyhedron(const Grid& grid,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a NNC polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BD shape
+    and is the most precise that includes the BD shape.
+
+    \param bd
+    The BD shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const BD_Shape<U>& bd,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a NNC polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const Octagonal_Shape<U>& os,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  NNC_Polyhedron(const NNC_Polyhedron& y,
+                 Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Assigns to \p *this the C polyhedron \p y.
+  NNC_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Destructor.
+  ~NNC_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this (the best approximation of) the result of
+    computing the
+    \ref Positive_Time_Elapse_Operator "positive time-elapse"
+    between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+#include "NNC_Polyhedron_inlines.hh"
+
+#endif // !defined(PPL_NNC_Polyhedron_defs_hh)
diff --git a/src/NNC_Polyhedron_inlines.hh b/src/NNC_Polyhedron_inlines.hh
new file mode 100644
index 0000000..7e19c34
--- /dev/null
+++ b/src/NNC_Polyhedron_inlines.hh
@@ -0,0 +1,158 @@
+/* NNC_Polyhedron class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_NNC_Polyhedron_inlines_hh
+#define PPL_NNC_Polyhedron_inlines_hh 1
+
+#include "C_Polyhedron_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+                               Degenerate_Element kind)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(num_dimensions,
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(n, k)",
+                                              "n exceeds the maximum "
+                                              "allowed space dimension"),
+               kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(cs)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(cs, recycle)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(gs)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(gs, recycle)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>& box, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(box, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(box)",
+                                                  "the space dimension of box "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(bd.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(bd)",
+                                              "the space dimension of bd "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(os.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(os)",
+                                              "the space dimension of os "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(os.constraints());
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+  : Polyhedron(y) {
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+  NNC_Polyhedron nnc_y(y);
+  m_swap(nnc_y);
+  return *this;
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+inline void
+NNC_Polyhedron::positive_time_elapse_assign(const Polyhedron& y) {
+  Polyhedron::positive_time_elapse_assign_impl(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_NNC_Polyhedron_inlines_hh)
diff --git a/src/NNC_Polyhedron_types.hh b/src/NNC_Polyhedron_types.hh
new file mode 100644
index 0000000..23fd390
--- /dev/null
+++ b/src/NNC_Polyhedron_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_NNC_Polyhedron_types_hh
+#define PPL_NNC_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_NNC_Polyhedron_types_hh)
diff --git a/src/Numeric_Format_defs.hh b/src/Numeric_Format_defs.hh
new file mode 100644
index 0000000..fcc1b7c
--- /dev/null
+++ b/src/Numeric_Format_defs.hh
@@ -0,0 +1,38 @@
+/* Numeric format.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Numeric_Format_defs_hh
+#define PPL_Numeric_Format_defs_hh 1
+
+#include "Result_defs.hh"
+#include "fpu_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Float_defs_hh)
+
diff --git a/src/OR_Matrix_defs.hh b/src/OR_Matrix_defs.hh
new file mode 100644
index 0000000..0215646
--- /dev/null
+++ b/src/OR_Matrix_defs.hh
@@ -0,0 +1,610 @@
+/* OR_Matrix class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_OR_Matrix_defs_hh
+#define PPL_OR_Matrix_defs_hh 1
+
+#include "globals_defs.hh"
+#include "OR_Matrix_types.hh"
+#include "DB_Row_defs.hh"
+#include "Checked_Number_defs.hh"
+#include <cstddef>
+#include <iosfwd>
+
+#ifndef PPL_OR_MATRIX_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When PPL_OR_MATRIX_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each
+  instance of the class OR_Matrix::Pseudo_Row carries its own size;
+  this enables extra consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_OR_MATRIX_EXTRA_DEBUG)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const OR_Matrix<T>& m);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix representing octagonal constraints.
+/*!
+  An OR_Matrix object is a DB_Row object that allows
+  the representation of a \em pseudo-triangular matrix,
+  like the following:
+
+<PRE>
+         _ _
+   0    |_|_|
+   1    |_|_|_ _
+   2    |_|_|_|_|
+   3    |_|_|_|_|_ _
+   4    |_|_|_|_|_|_|
+   5    |_|_|_|_|_|_|
+         . . .
+         _ _ _ _ _ _       _
+ 2n-2   |_|_|_|_|_|_| ... |_|
+ 2n-1   |_|_|_|_|_|_| ... |_|
+         0 1 2 3 4 5  ... 2n-1
+
+</PRE>
+
+  It is characterized by parameter n that defines the structure,
+  and such that there are 2*n rows (and 2*n columns).
+  It provides row_iterators for the access to the rows
+  and element_iterators for the access to the elements.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+template <typename T>
+class Parma_Polyhedra_Library::OR_Matrix {
+private:
+  /*! \brief
+    An object that behaves like a matrix's row with respect to
+    the subscript operators.
+  */
+  template <typename U>
+  class Pseudo_Row {
+  public:
+    /*! \brief
+      Copy constructor allowing the construction of a const pseudo-row
+      from a non-const pseudo-row.
+      Ordinary copy constructor.
+    */
+    template <typename V>
+    Pseudo_Row(const Pseudo_Row<V>& y);
+
+    //! Destructor.
+    ~Pseudo_Row();
+
+    //! Subscript operator.
+    U& operator[](dimension_type k) const;
+
+    //! Default constructor: creates an invalid object that has to be assigned.
+    Pseudo_Row();
+
+    //! Assignment operator.
+    Pseudo_Row& operator=(const Pseudo_Row& y);
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+  private:
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  public:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Private constructor for a Pseudo_Row with size \p s beginning at \p y.
+    Pseudo_Row(U& y, dimension_type s);
+
+#else // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Private constructor for a Pseudo_Row beginning at \p y.
+    explicit Pseudo_Row(U& y);
+
+#endif // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Holds a reference to the beginning of this row.
+    U* first;
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  private:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! The size of the row.
+    dimension_type size_;
+
+    //! Returns the size of the row.
+    dimension_type size() const;
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+    // FIXME: the EDG-based compilers (such as Comeau and Intel)
+    // are here in wild disagreement with GCC: what is a legal friend
+    // declaration for one, is illegal for the others.
+#ifdef __EDG__
+    template <typename V> template<typename W>
+    friend class OR_Matrix<V>::Pseudo_Row;
+    template <typename V> template<typename W>
+    friend class OR_Matrix<V>::any_row_iterator;
+#else
+    template <typename V> friend class Pseudo_Row;
+    template <typename V> friend class any_row_iterator;
+#endif
+
+    friend class OR_Matrix;
+  }; // class Pseudo_Row
+
+public:
+  //! A (non const) reference to a matrix's row.
+  typedef Pseudo_Row<T> row_reference_type;
+
+  //! A const reference to a matrix's row.
+  typedef Pseudo_Row<const T> const_row_reference_type;
+
+private:
+  /*! \brief
+    A template class to derive both OR_Matrix::iterator
+    and OR_Matrix::const_iterator.
+  */
+  template <typename U>
+  class any_row_iterator {
+  public:
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Pseudo_Row<U> value_type;
+    typedef long difference_type;
+    typedef const Pseudo_Row<U>* pointer;
+    typedef const Pseudo_Row<U>& reference;
+
+    //! Constructor to build past-the-end objects.
+    any_row_iterator(dimension_type n_rows);
+
+    /*! \brief
+      Builds an iterator pointing at the beginning of an OR_Matrix whose
+      first element is \p base;
+    */
+    explicit any_row_iterator(U& base);
+
+    /*! \brief
+      Copy constructor allowing the construction of a const_iterator
+      from a non-const iterator.
+    */
+    template <typename V>
+    any_row_iterator(const any_row_iterator<V>& y);
+
+    /*! \brief
+      Assignment operator allowing the assignment of a non-const iterator
+      to a const_iterator.
+    */
+    template <typename V>
+    any_row_iterator& operator=(const any_row_iterator<V>& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    any_row_iterator& operator++();
+
+    //! Postfix increment operator.
+    any_row_iterator operator++(int);
+
+    //! Prefix decrement operator.
+    any_row_iterator& operator--();
+
+    //! Postfix decrement operator.
+    any_row_iterator operator--(int);
+
+    //! Subscript operator.
+    reference operator[](difference_type m) const;
+
+    //! Assignment-increment operator.
+    any_row_iterator& operator+=(difference_type m);
+
+    //! Assignment-increment operator for \p m of unsigned type.
+    template <typename Unsigned>
+    typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator&>::type
+    operator+=(Unsigned m);
+
+    //! Assignment-decrement operator.
+    any_row_iterator& operator-=(difference_type m);
+
+    //! Returns the difference between \p *this and \p y.
+    difference_type operator-(const any_row_iterator& y) const;
+
+    //! Returns the sum of \p *this and \p m.
+    any_row_iterator operator+(difference_type m) const;
+
+    //! Returns the sum of \p *this and \p m, for \p m of unsigned type.
+    template <typename Unsigned>
+    typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator>::type
+    operator+(Unsigned m) const;
+
+    //! Returns the difference of \p *this and \p m.
+    any_row_iterator operator-(difference_type m) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is equal to \p y.
+    bool operator==(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this
+      is different from \p y.
+    */
+    bool operator!=(const any_row_iterator& y) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is less than \p y.
+    bool operator<(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is less than
+      or equal to \p y.
+    */
+    bool operator<=(const any_row_iterator& y) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is greater than \p y.
+    bool operator>(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is greater than
+      or equal to \p y.
+    */
+    bool operator>=(const any_row_iterator& y) const;
+
+    dimension_type row_size() const;
+
+    dimension_type index() const;
+
+  private:
+    //! Represents the beginning of a row.
+    Pseudo_Row<U> value;
+
+    //! External index.
+    dimension_type e;
+
+    //! Internal index: <CODE>i = (e+1)*(e+1)/2</CODE>.
+    dimension_type i;
+
+    // FIXME: the EDG-based compilers (such as Comeau and Intel)
+    // are here in wild disagreement with GCC: what is a legal friend
+    // declaration for one, is illegal for the others.
+#ifdef __EDG__
+    template <typename V> template<typename W>
+    friend class OR_Matrix<V>::any_row_iterator;
+#else
+    template <typename V> friend class any_row_iterator;
+#endif
+  }; // class any_row_iterator
+
+public:
+  //! A (non const) row iterator.
+  typedef any_row_iterator<T> row_iterator;
+
+  //! A const row iterator.
+  typedef any_row_iterator<const T> const_row_iterator;
+
+  //! A (non const) element iterator.
+  typedef typename DB_Row<T>::iterator element_iterator;
+
+  //! A const element iterator.
+  typedef typename DB_Row<T>::const_iterator const_element_iterator;
+
+public:
+  //! Returns the maximum number of rows of a OR_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Builds a matrix with specified dimensions.
+  /*!
+    \param num_dimensions
+    The space dimension of the matrix that will be created.
+
+    This constructor creates a matrix with \p 2*num_dimensions rows.
+    Each element is initialized to plus infinity.
+  */
+  OR_Matrix(dimension_type num_dimensions);
+
+  //! Copy constructor.
+  OR_Matrix(const OR_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit OR_Matrix(const OR_Matrix<U>& y);
+
+  //! Destructor.
+  ~OR_Matrix();
+
+  //! Assignment operator.
+  OR_Matrix& operator=(const OR_Matrix& y);
+
+private:
+  template <typename U> friend class OR_Matrix;
+
+  //! Contains the rows of the matrix.
+  /*!
+    A DB_Row which contains the rows of the OR_Matrix
+    inserting each successive row to the end of the vec.
+    To contain all the elements of OR_Matrix the size of the DB_Row
+    is 2*n*(n+1), where the n is the characteristic parameter of
+    OR_Matrix.
+  */
+  DB_Row<T> vec;
+
+  //! Contains the dimension of the space of the matrix.
+  dimension_type space_dim;
+
+  //! Contains the capacity of \p vec.
+  dimension_type vec_capacity;
+
+  //! Private and not implemented: default construction is not allowed.
+  OR_Matrix();
+
+  /*! \brief
+    Returns the index into <CODE>vec</CODE> of the first element
+    of the row of index \p k.
+  */
+  static dimension_type row_first_element_index(dimension_type k);
+
+public:
+  //! Returns the size of the row of index \p k.
+  static dimension_type row_size(dimension_type k);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(OR_Matrix& y);
+
+  //! Makes the matrix grow by adding more space dimensions.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Adds new rows of right dimension to the end if
+    there is enough capacity; otherwise, creates a new matrix,
+    with the specified dimension, copying the old elements
+    in the upper part of the new matrix, which is
+    then assigned to \p *this.
+    Each new element is initialized to plus infinity.
+  */
+  void grow(dimension_type new_dim);
+
+  //! Makes the matrix shrink by removing the last space dimensions.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Erases from matrix to the end the rows with index
+    greater than 2*new_dim-1.
+  */
+  void shrink(dimension_type new_dim);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    If the new dimension is greater than the old one, it adds new rows
+    of right dimension to the end if there is enough capacity; otherwise,
+    it creates a new matrix, with the specified dimension, which is
+    then assigned to \p *this.
+    If the new dimension is less than the old one, it erase from the matrix
+    the rows having index greater than 2*new_dim-1
+  */
+  void resize_no_copy(dimension_type new_dim);
+
+  //! Returns the space-dimension of the matrix.
+  dimension_type space_dimension() const;
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  row_reference_type operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const_row_reference_type operator[](dimension_type k) const;
+  //@}
+
+
+  /*! \brief
+    Returns an iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  row_iterator row_begin();
+
+  //! Returns the past-the-end const_iterator.
+  row_iterator row_end();
+
+  /*! \brief
+    Returns a const row iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_row_iterator row_begin() const;
+
+  //! Returns the past-the-end const row iterator.
+  const_row_iterator row_end() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  element_iterator element_begin();
+
+  //! Returns the past-the-end const_iterator.
+  element_iterator element_end();
+
+  /*! \brief
+    Returns a const element iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_element_iterator element_begin() const;
+
+  //! Returns the past-the-end const element iterator.
+  const_element_iterator element_end() const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  friend bool operator==<T>(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(OR_Matrix<T>& x, OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const OR_Matrix<T>& x,
+                                 const OR_Matrix<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const OR_Matrix<T>& x,
+                               const OR_Matrix<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const OR_Matrix<T>& x,
+                                 const OR_Matrix<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "OR_Matrix_inlines.hh"
+#include "OR_Matrix_templates.hh"
+
+#endif // !defined(PPL_OR_Matrix_defs_hh)
diff --git a/src/OR_Matrix_inlines.hh b/src/OR_Matrix_inlines.hh
new file mode 100644
index 0000000..f0e8349
--- /dev/null
+++ b/src/OR_Matrix_inlines.hh
@@ -0,0 +1,751 @@
+/* OR_Matrix class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_OR_Matrix_inlines_hh
+#define PPL_OR_Matrix_inlines_hh 1
+
+#include "globals_defs.hh"
+#include "Checked_Number_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "distances_defs.hh"
+#include "assert.hh"
+#include "checked_defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_first_element_index(const dimension_type k) {
+  return ((k + 1)*(k + 1))/2;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_size(const dimension_type k) {
+  return k + 2 - k % 2;
+}
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::Pseudo_Row<U>::size() const {
+  return size_;
+}
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row()
+  : first(0)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(0)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(U& y
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+                , dimension_type s
+#endif
+                )
+  : first(&y)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(s)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(const Pseudo_Row<V>& y)
+  : first(y.first)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    , size_(y.size_)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline OR_Matrix<T>::Pseudo_Row<U>&
+OR_Matrix<T>::Pseudo_Row<U>::operator=(const Pseudo_Row& y) {
+  first = y.first;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  size_ = y.size_;
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::~Pseudo_Row() {
+}
+
+template <typename T>
+template <typename U>
+inline U&
+OR_Matrix<T>::Pseudo_Row<U>::operator[](const dimension_type k) const {
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  PPL_ASSERT(k < size_);
+#endif
+  return *(first + k);
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const dimension_type n_rows)
+  : value(),
+    e(n_rows)
+    // Field `i' is intentionally not initialized here.
+{
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  // Turn `value' into a valid object.
+  value.size_ = OR_Matrix::row_size(e);
+#endif
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>::any_row_iterator(U& base)
+  :  value(base
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+           , OR_Matrix<T>::row_size(0)
+#endif
+           ),
+     e(0),
+     i(0) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const any_row_iterator<V>& y)
+  : value(y.value),
+    e(y.e),
+    i(y.i) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator=(const any_row_iterator<V>& y) {
+  value = y.value;
+  e = y.e;
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::reference
+OR_Matrix<T>::any_row_iterator<U>::operator*() const {
+  return value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::pointer
+OR_Matrix<T>::any_row_iterator<U>::operator->() const {
+  return &value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator++() {
+  ++e;
+  dimension_type increment = e;
+  if (e % 2 != 0)
+    ++increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  else {
+    value.size_ += 2;
+  }
+#endif
+  i += increment;
+  value.first += increment;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator++(int) {
+  any_row_iterator old = *this;
+  ++(*this);
+  return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator--() {
+  dimension_type decrement = e + 1;
+  --e;
+  if (e % 2 != 0) {
+    ++decrement;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    value.size_ -= 2;
+#endif
+  }
+  i -= decrement;
+  value.first -= decrement;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator--(int) {
+  any_row_iterator old = *this;
+  --(*this);
+  return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator+=(const difference_type m) {
+  difference_type e_dt = static_cast<difference_type>(e);
+  difference_type i_dt = static_cast<difference_type>(i);
+  difference_type increment = m + (m * m) / 2 + m * e_dt;
+  if (e_dt % 2 == 0 && m % 2 != 0)
+    ++increment;
+  e_dt += m;
+  i_dt += increment;
+  e = static_cast<dimension_type>(e_dt);
+  i = static_cast<dimension_type>(i_dt);
+  value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  difference_type value_size_dt = static_cast<difference_type>(value.size_);
+  value_size_dt += (m - m % 2);
+  value.size_ = static_cast<dimension_type>(value_size_dt);
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+            typename OR_Matrix<T>::template any_row_iterator<U>& >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+=(Unsigned m) {
+  dimension_type n = m;
+  dimension_type increment = n + (n*n)/2 + n*e;
+  if (e % 2 == 0 && n % 2 != 0)
+    ++increment;
+  e += n;
+  i += increment;
+  value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  value.size_ = value.size_ + n - n % 2;
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator-=(difference_type m) {
+  return *this += -m;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::difference_type
+OR_Matrix<T>::any_row_iterator<U>::operator-(const any_row_iterator& y) const {
+  return e - y.e;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator+(difference_type m) const {
+  any_row_iterator r = *this;
+  r += m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+            typename OR_Matrix<T>::template any_row_iterator<U> >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+(Unsigned m) const {
+  any_row_iterator r = *this;
+  r += m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator-(const difference_type m) const {
+  any_row_iterator r = *this;
+  r -= m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator==(const any_row_iterator& y) const {
+  return e == y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator!=(const any_row_iterator& y) const {
+  return e != y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator<(const any_row_iterator& y) const {
+  return e < y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator<=(const any_row_iterator& y) const {
+  return e <= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator>(const any_row_iterator& y) const {
+  return e > y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator>=(const any_row_iterator& y) const {
+  return e >= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::row_size() const {
+  return OR_Matrix::row_size(e);
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::index() const {
+  return e;
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_begin() {
+  return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_end() {
+  return row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_begin() const {
+  return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_end() const {
+  return const_row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_begin() {
+  return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_end() {
+  return vec.end();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_begin() const {
+  return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_end() const {
+  return vec.end();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::m_swap(OR_Matrix& y) {
+  using std::swap;
+  swap(vec, y.vec);
+  swap(space_dim, y.space_dim);
+  swap(vec_capacity, y.vec_capacity);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the integer square root of \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+isqrt(dimension_type x) {
+  dimension_type r = 0;
+  const dimension_type FIRST_BIT_MASK = 0x40000000U;
+  for (dimension_type t = FIRST_BIT_MASK; t != 0; t >>= 2) {
+    const dimension_type s = r + t;
+    if (s <= x) {
+      x -= s;
+      r = s + t;
+    }
+    r >>= 1;
+  }
+  return r;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::max_num_rows() {
+  // Compute the maximum number of rows that are contained in a DB_Row
+  // that allocates a pseudo-triangular matrix.
+  const dimension_type k = isqrt(2*DB_Row<T>::max_size() + 1);
+  return (k - 1) - (k - 1) % 2;
+}
+
+template <typename T>
+inline memory_size_type
+OR_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const dimension_type num_dimensions)
+  : vec(2*num_dimensions*(num_dimensions + 1)),
+    space_dim(num_dimensions),
+    vec_capacity(vec.size()) {
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::~OR_Matrix() {
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) {
+  return row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+                            , row_size(k)
+#endif
+                            );
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) const {
+  return const_row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+                                  , row_size(k)
+#endif
+                                  );
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::num_rows() const {
+  return 2*space_dimension();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::clear() {
+  OR_Matrix<T>(0).m_swap(*this);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return x.space_dim == y.space_dim && x.vec == y.vec;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix& y)
+  : vec(y.vec),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size(),
+                                  DB_Row<T>::max_size())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix<U>& y)
+  : vec(),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size(),
+                                  DB_Row<T>::max_size())) {
+  vec.construct_upward_approximation(y.vec, vec_capacity);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline OR_Matrix<T>&
+OR_Matrix<T>::operator=(const OR_Matrix& y) {
+  vec = y.vec;
+  space_dim = y.space_dim;
+  vec_capacity = compute_capacity(y.vec.size(), DB_Row<T>::max_size());
+  return *this;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::grow(const dimension_type new_dim) {
+  PPL_ASSERT(new_dim >= space_dim);
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      element_iterator j = new_matrix.element_begin();
+      for (element_iterator i = element_begin(),
+             mend = element_end(); i != mend; ++i, ++j)
+        assign_or_swap(*j, *i);
+      m_swap(new_matrix);
+    }
+  }
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::shrink(const dimension_type new_dim) {
+  PPL_ASSERT(new_dim <= space_dim);
+  const dimension_type new_size = 2*new_dim*(new_dim + 1);
+  vec.shrink(new_size);
+  space_dim = new_dim;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::resize_no_copy(const dimension_type new_dim) {
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      m_swap(new_matrix);
+    }
+  }
+  else if (new_dim < space_dim)
+    shrink(new_dim);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const OR_Matrix<T>& x,
+                    const OR_Matrix<T>& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0,
+                    Temp& tmp1,
+                    Temp& tmp2) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (typename OR_Matrix<T>::const_element_iterator
+         i = x.element_begin(), j = y.element_begin(),
+         mat_end = x.element_end(); i != mat_end; ++i, ++j) {
+    const T& x_i = *i;
+    const T& y_i = *j;
+    if (is_plus_infinity(x_i)) {
+      if (is_plus_infinity(y_i))
+        continue;
+      else {
+      pinf:
+        assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+        return true;
+      }
+    }
+    else if (is_plus_infinity(y_i))
+      goto pinf;
+
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+    if (x_i > y_i) {
+      maybe_assign(tmp1p, tmp1, x_i, dir);
+      maybe_assign(tmp2p, tmp2, y_i, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_i, dir);
+      maybe_assign(tmp2p, tmp2, x_i, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    PPL_ASSERT(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const OR_Matrix<T>& x,
+                            const OR_Matrix<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+                                                                    dir,
+                                                                    tmp0,
+                                                                    tmp1,
+                                                                    tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const OR_Matrix<T>& x,
+                          const OR_Matrix<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+                                                                  dir,
+                                                                  tmp0,
+                                                                  tmp1,
+                                                                  tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const OR_Matrix<T>& x,
+                           const OR_Matrix<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+                                                                   dir,
+                                                                   tmp0,
+                                                                   tmp1,
+                                                                   tmp2);
+}
+
+/*! \relates OR_Matrix */
+template <typename T>
+inline void
+swap(OR_Matrix<T>& x, OR_Matrix<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_OR_Matrix_inlines_hh)
diff --git a/src/OR_Matrix_templates.hh b/src/OR_Matrix_templates.hh
new file mode 100644
index 0000000..303677a
--- /dev/null
+++ b/src/OR_Matrix_templates.hh
@@ -0,0 +1,124 @@
+/* OR_Matrix class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_OR_Matrix_templates_hh
+#define PPL_OR_Matrix_templates_hh 1
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+memory_size_type
+OR_Matrix<T>::external_memory_in_bytes() const{
+  return vec.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+OR_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+  // The right number of cells should be in use.
+  const dimension_type dim = space_dimension();
+  if (vec.size() != 2*dim*(dim + 1)) {
+#ifndef NDEBUG
+    cerr << "OR_Matrix has a wrong number of cells:\n"
+         << "vec.size() is " << vec.size()
+         << ", expected size is " << (2*dim*(dim+1)) << "!\n";
+#endif
+    return false;
+  }
+
+  // The underlying DB_Row should be OK.
+  if (!vec.OK(vec.size(), vec_capacity))
+    return false;
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+OR_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const OR_Matrix<T>& x = *this;
+  const char separator = ' ';
+  dimension_type space = x.space_dimension();
+  s << space << separator << "\n";
+  for (const_row_iterator i = x.row_begin(),
+         x_row_end = x.row_end(); i != x_row_end; ++i) {
+    const_row_reference_type r = *i;
+    dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      using namespace IO_Operators;
+      s << r[j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, OR_Matrix<T>)
+
+template <typename T>
+bool
+OR_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type space;
+  if (!(s >> space))
+    return false;
+  resize_no_copy(space);
+  for (row_iterator i = row_begin(),
+         this_row_end = row_end(); i != this_row_end; ++i) {
+    row_reference_type r_i = *i;
+    const dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      Result r = input(r_i[j], s, ROUND_CHECK);
+      if (result_relation(r) != VR_EQ || is_minus_infinity(r_i[j]))
+        return false;
+    }
+  }
+  PPL_ASSERT(OK());
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const OR_Matrix<T>& m) {
+  for (typename OR_Matrix<T>::const_row_iterator m_iter = m.row_begin(),
+         m_end = m.row_end(); m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<T>::const_row_reference_type r_m = *m_iter;
+    const dimension_type mr_size = m_iter.row_size();
+    for (dimension_type j = 0; j < mr_size; ++j)
+      s << r_m[j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_OR_Matrix_templates_hh)
diff --git a/src/OR_Matrix_types.hh b/src/OR_Matrix_types.hh
new file mode 100644
index 0000000..2b46764
--- /dev/null
+++ b/src/OR_Matrix_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_OR_Matrix_types_hh
+#define PPL_OR_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class OR_Matrix;
+
+}
+
+#endif // !defined(PPL_OR_Matrix_types_hh)
diff --git a/src/Octagonal_Shape.cc b/src/Octagonal_Shape.cc
new file mode 100644
index 0000000..924f21e
--- /dev/null
+++ b/src/Octagonal_Shape.cc
@@ -0,0 +1,104 @@
+/* Octagonal_Shape class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Octagonal_Shape_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+PPL::Octagonal_Shape_Helper
+::extract_octagonal_difference(const Constraint& c,
+                               const dimension_type c_space_dim,
+                               dimension_type& c_num_vars,
+                               dimension_type& c_first_var,
+                               dimension_type& c_second_var,
+                               Coefficient& c_coeff,
+                               Coefficient& c_term) {
+  // Check for preconditions.
+  PPL_ASSERT(c.space_dimension() == c_space_dim);
+  PPL_ASSERT(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+
+  c_first_var = c.expression().first_nonzero(1, c_space_dim + 1);
+
+  if (c_first_var == c_space_dim + 1) {
+    c_term = c.inhomogeneous_term();
+    return true;
+  }
+
+  ++c_num_vars;
+  --c_first_var;
+
+  c_second_var = c.expression().first_nonzero(c_first_var + 2, c_space_dim + 1);
+
+  if (c_second_var == c_space_dim + 1) {
+    c_term = c.inhomogeneous_term();
+    const Coefficient& c0 = c.coefficient(Variable(c_first_var));
+    c_term *= 2;
+    c_first_var *= 2;
+    if (sgn(c0) < 0) {
+      c_second_var = c_first_var;
+      ++c_first_var;
+    }
+    else
+      c_second_var = c_first_var + 1;
+    c_coeff = c0;
+    return true;
+  }
+
+  ++c_num_vars;
+  --c_second_var;
+
+  if (!c.expression().all_zeroes(c_second_var + 2, c_space_dim + 1))
+    return false;
+
+  using std::swap;
+
+  // FIXME: The calling code expects c_first_var > c_second_var, when
+  // c_num_vars==2, but it shouldn't.
+  swap(c_first_var, c_second_var);
+
+  // Make sure that `c' is indeed an octagonal difference,
+  // i.e., it is of this form:
+  //   (+/-) a*x (+/-) a*y <=/= b.
+  c_term = c.inhomogeneous_term();
+  const Coefficient& c0 = c.coefficient(Variable(c_first_var));
+  const Coefficient& c1 = c.coefficient(Variable(c_second_var));
+  if (c0 != c1 && c0 != -c1)
+    // Constraint `c' is not an octagonal difference.
+    return false;
+  
+  c_first_var *= 2;
+  c_second_var *= 2;
+  if (sgn(c0) < 0)
+    ++c_first_var;
+  if (sgn(c1) > 0)
+    ++c_second_var;
+  c_coeff = c0;
+  
+  return true;
+}
+
diff --git a/src/Octagonal_Shape_defs.hh b/src/Octagonal_Shape_defs.hh
new file mode 100644
index 0000000..6cff16b
--- /dev/null
+++ b/src/Octagonal_Shape_defs.hh
@@ -0,0 +1,2324 @@
+/* Octagonal_Shape class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_defs_hh
+#define PPL_Octagonal_Shape_defs_hh 1
+
+#include "Octagonal_Shape_types.hh"
+#include "globals_types.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "OR_Matrix_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "Polyhedron_types.hh"
+#include "Box_types.hh"
+#include "Grid_types.hh"
+#include "BD_Shape_types.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Checked_Number_defs.hh"
+#include "WRD_coefficient_types_defs.hh"
+#include "Bit_Row_defs.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <vector>
+#include <cstddef>
+#include <climits>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape
+  Writes a textual representation of \p oct on \p s:
+  <CODE>false</CODE> is written if \p oct is an empty polyhedron;
+  <CODE>true</CODE> is written if \p oct is a universe polyhedron;
+  a system of constraints defining \p oct is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const Octagonal_Shape<T>& oct);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Octagonal_Shape */
+template <typename T>
+void swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same octagon.
+
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different shapes.
+
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class Octagonal_Shape_Helper {
+public:
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Decodes the constraint \p c as an octagonal difference.
+  /*! \relates Octagonal_Shape
+    \return
+    <CODE>true</CODE> if the constraint \p c is an octagonal difference;
+    <CODE>false</CODE> otherwise.
+
+    \param c
+    The constraint to be decoded.
+
+    \param c_space_dim
+    The space dimension of the constraint \p c (it is <EM>assumed</EM>
+    to match the actual space dimension of \p c).
+
+    \param c_num_vars
+    If <CODE>true</CODE> is returned, then it will be set to the number
+    of variables having a non-zero coefficient. The only legal values
+    will therefore be 0, 1 and 2.
+
+    \param c_first_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the index of the first variable having
+    a non-zero coefficient in \p c.
+
+    \param c_second_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+    then it will be set to the index of the second variable having
+    a non-zero coefficient in \p c.
+
+    \param c_coeff
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the value of the first non-zero coefficient
+    in \p c.
+
+    \param c_term
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the right value of the inhomogeneous term
+    of \p c.
+  */
+  #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  static bool extract_octagonal_difference(const Constraint& c,
+                                           dimension_type c_space_dim,
+                                           dimension_type& c_num_vars,
+                                           dimension_type& c_first_var,
+                                           dimension_type& c_second_var,
+                                           Coefficient& c_coeff,
+                                           Coefficient& c_term);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+//! An octagonal shape.
+/*! \ingroup PPL_CXX_interface
+  The class template Octagonal_Shape<T> allows for the efficient
+  representation of a restricted kind of <EM>topologically closed</EM>
+  convex polyhedra called <EM>octagonal shapes</EM> (OSs, for short).
+  The name comes from the fact that, in a vector space of dimension 2,
+  bounded OSs are polygons with at most eight sides.
+  The closed affine half-spaces that characterize the OS can be expressed
+  by constraints of the form
+  \f[
+    ax_i + bx_j \leq k
+  \f]
+  where \f$a, b \in \{-1, 0, 1\}\f$ and \f$k\f$ is a rational number,
+  which are called <EM>octagonal constraints</EM>.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  octagonal constraints. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for OSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.
+
+  The OS domain <EM>optimally supports</EM>:
+    - tautological and inconsistent constraints and congruences;
+    - octagonal constraints;
+    - non-proper congruences (i.e., equalities) that are expressible
+      as octagonal constraints.
+
+  Depending on the method, using a constraint or congruence that is not
+  optimally supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  A constraint is octagonal if it has the form
+    \f[
+      \pm a_i x_i \pm a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above octagonal Constraint object
+  will be mapped into a \e correct and \e optimal approximation that,
+  depending on the expressive power of the chosen template argument \p T,
+  may loose some precision.
+  Also note that strict constraints are not octagonal.
+
+  For instance, a Constraint object encoding \f$3x + 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x + y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x + y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x + y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, depending from the context, a Constraint object
+  encoding \f$3x - y \leq 1\f$ will be either upward approximated
+  (e.g., by safely ignoring it) or it will cause an exception.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  \c x, \c y and \c z are defined (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds an OS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+  In contrast, the following code will raise an exception,
+  since constraints 7, 8, and 9 are not octagonal:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    cs.insert(x - 3*y <= 5);    // (7)
+    cs.insert(x - y + z <= 5);  // (8)
+    cs.insert(x + y + z <= 5);  // (9)
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Octagonal_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining an OS.
+  */
+#ifndef NDEBUG
+  typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+  typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+
+  //! The numeric base type upon which OSs are built.
+  typedef T coefficient_type_base;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining an OS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that an OS can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain cannot recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain cannot recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds an universe or empty OS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the OS;
+
+    \param kind
+    Specifies whether the universe or the empty OS has to be built.
+  */
+  explicit Octagonal_Shape(dimension_type num_dimensions = 0,
+                           Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Octagonal_Shape(const Octagonal_Shape& y,
+                  Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const Octagonal_Shape<U>& y,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS from the system of constraints \p cs.
+  /*!
+    The OS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of octagonal constraints.
+
+    \exception std::invalid_argument
+    Thrown if \p cs contains a constraint which is not optimally supported
+    by the Octagonal shape domain.
+  */
+  explicit Octagonal_Shape(const Constraint_System& cs);
+
+  //! Builds an OS from a system of congruences.
+  /*!
+    The OS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences.
+
+    \exception std::invalid_argument
+    Thrown if \p cgs contains a congruence which is not optimally supported
+    by the Octagonal shape domain.
+  */
+  explicit Octagonal_Shape(const Congruence_System& cgs);
+
+  //! Builds an OS from the system of generators \p gs.
+  /*!
+    Builds the smallest OS containing the polyhedron defined by \p gs.
+    The OS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Octagonal_Shape(const Generator_System& gs);
+
+  //! Builds an OS from the polyhedron \p ph.
+  /*!
+    Builds an OS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the OS built is the
+    smallest one containing \p ph.
+  */
+  explicit Octagonal_Shape(const Polyhedron& ph,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS out of a box.
+  /*!
+    The OS inherits the space dimension of the box.
+    The built OS is the most precise OS that includes the box.
+
+    \param box
+    The box representing the OS to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Octagonal_Shape(const Box<Interval>& box,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS that approximates a grid.
+  /*!
+    The OS inherits the space dimension of the grid.
+    The built OS is the most precise OS that includes the grid.
+
+    \param grid
+    The grid used to build the OS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Octagonal_Shape(const Grid& grid,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS from a BD shape.
+  /*!
+    The OS inherits the space dimension of the BD shape.
+    The built OS is the most precise OS that includes the BD shape.
+
+    \param bd
+    The BD shape used to build the OS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const BD_Shape<U>& bd,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Octagonal_Shape& operator=(const Octagonal_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with octagon \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  void m_swap(Octagonal_Shape& y);
+
+  //! Destructor.
+  ~Octagonal_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Octagonal_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Octagonal_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Octagonal_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Octagonal_Shape& y) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the congruence \p cg.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty OS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe OS.
+  bool is_universe() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded OS.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains (at least) an integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Octagonal_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Octagonal_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    defining \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is not optimally supported by the OS domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the OS domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this.
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the OS domain.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+    \param cg
+    The congruence to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    or \p cg is not optimally supported by the OS domain.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the OS domain.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the OS domain.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of octagonal
+    constraints defining \p *this.
+
+    \param c
+    The constraint. If it is not a octagonal constraint, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    octagonal constraints  of \p *this.
+
+    \param cg
+    The congruence. If it is not a octagonal equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    octagonal constraints defining \p *this.
+
+    \param  cs
+    The constraint system to be used. Constraints that are not octagonal
+    are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    octagonal constraints defining \p *this.
+
+    \param  cgs
+    The congruence system to be used. Congruences that are not octagonal
+    equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Refines the system of octagonal constraints defining \p *this using
+    the constraint expressed by \p left \f$\leq\f$ \p right.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void refine_with_linear_form_inequality(
+                   const Linear_Form< Interval<T, Interval_Info> >& left,
+                   const Linear_Form< Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Refines the system of octagonal constraints defining \p *this using
+    the constraint expressed by \p left \f$\relsym\f$ \p right, where
+    \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param relsym
+    The relation symbol.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    \exception std::runtime_error
+    Thrown if \p relsym is not a valid relation symbol.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void generalized_refine_with_linear_form_inequality(
+                   const Linear_Form< Interval<T, Interval_Info> >& left,
+                   const Linear_Form< Interval<T, Interval_Info> >& right,
+                   Relation_Symbol relsym);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest OS that contains
+    the convex union of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    Implementation is based on Theorem 6.3 of \ref BHZ09b "[BHZ09b]".
+  */
+  bool upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+  /*! \brief
+    If the \e integer upper bound of \p *this and \p y is exact,
+    it is assigned to \p *this and <CODE>true</CODE> is returned;
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    This operator is only available when the class template parameter
+    \c T is bound to an integer data type.
+
+    \note
+    The integer upper bound of two rational OS is the smallest
+    rational OS containing all the integral points in the two arguments.
+    In general, the result is \e not an upper bound for the two input
+    arguments, as it may cut away non-integral portions of the two
+    rational shapes.
+
+    Implementation is based on Theorem 6.8 of \ref BHZ09b "[BHZ09b]".
+  */
+  bool integer_upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest octagon containing
+    the set difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference  denominator
+                    = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*! \brief
+    Assigns to \p *this the \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point boundaries that
+    defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+    is not a dimension of \p *this.
+
+    This function is used in abstract interpretation to model an assignment
+    of a value that is correctly overapproximated by \p lf to the
+    floating point variable represented by \p var.
+  */
+  template <typename Interval_Info>
+  void affine_form_image(Variable var,
+                        const Linear_Form< Interval<T, Interval_Info> >& lf);
+
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+    /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+/*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop_point.
+
+    \param last
+    An iterator that points to the last stop_point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  //! Same as BHMZ05_widening_assign(y, tp).
+  void widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened OS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if there is in \p cs a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Restores from \p y the constraints of \p *this, lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    An OS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_narrowing_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened OS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old OS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new OS,
+    which is characterized by a system of constraints in which the variables
+    running through the new dimensions are not constrained.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the OS
+    and does not embed it in the new space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes
+    in the new OS, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Octagonal_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //! Applies to \p dest the interval constraints embedded in \p *this.
+  /*!
+    \param dest
+    The object to which the constraints will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest.
+
+    The template type parameter U must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the space dimension of the object.
+    \code
+      void set_empty()
+    \endcode
+    sets the object to an empty object.
+    \code
+      bool restrict_lower(dimension_type dim, const T& lb)
+    \endcode
+    restricts the object by applying the lower bound \p lb to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+    \code
+      bool restrict_upper(dimension_type dim, const T& ub)
+    \endcode
+    restricts the object by applying the upper bound \p ub to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+  */
+  template <typename U>
+  void export_interval_constraints(U& dest) const;
+
+  //! Refines \p store with the constraints defining \p *this.
+  /*!
+    \param store
+    The interval floating point abstract store to refine.
+  */
+  template <typename Interval_Info>
+  void refine_fp_interval_abstract_store(
+                          Box< Interval<T, Interval_Info> >& store) const;
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  friend bool
+  operator==<T>(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! The matrix that represents the octagonal shape.
+  OR_Matrix<N> matrix;
+
+  //! Dimension of the space of the octagonal shape.
+  dimension_type space_dim;
+
+  // Please, do not move the following include directive:
+  // `Og_Status_idefs.hh' must be included exactly at this point.
+  // And please do not remove the space separating `#' from `include':
+  // this ensures that the directive will not be moved during the
+  // procedure that automatically creates the library's include file
+  // (see `Makefile.am' in the `src' directory).
+#define PPL_IN_Octagonal_Shape_CLASS
+#include "Og_Status_idefs.hh"
+#undef PPL_IN_Octagonal_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! Returns <CODE>true</CODE> if the OS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  //! Returns <CODE>true</CODE> if the OS is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \c this->matrix is known to be
+    strongly closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \c this->matrix is not strongly closed.
+  */
+  bool marked_strongly_closed() const;
+
+  //! Turns \p *this into a zero-dimensional universe OS.
+  void set_zero_dim_univ();
+
+  //! Turns \p *this into an empty OS.
+  void set_empty();
+
+  //! Marks \p *this as strongly closed.
+  void set_strongly_closed();
+
+  //! Marks \p *this as possibly not strongly closed.
+  void reset_strongly_closed();
+
+  N& matrix_at(dimension_type i, dimension_type j);
+  const N& matrix_at(dimension_type i, dimension_type j) const;
+
+  /*! \brief
+    Returns an upper bound for \p lf according to the constraints
+    embedded in \p *this.
+
+    \p lf must be a linear form on intervals with floating point coefficients.
+    If all coefficients in \p lf are bounded, then \p result will become a
+    correct overapproximation of the value of \p lf when variables in
+    \p lf satisfy the constraints expressed by \p *this. Otherwise the
+    behavior of the method is undefined.
+  */
+  template <typename Interval_Info>
+  void linear_form_upper_bound(
+                   const Linear_Form< Interval<T, Interval_Info> >& lf,
+                   N& result) const;
+
+  // FIXME: this function is currently not used. Consider removing it.
+  static void interval_coefficient_upper_bound(const N& var_ub,
+                                               const N& minus_var_ub,
+                                               const N& int_ub, const N& int_lb,
+                                               N& result);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added. Non-octagonal constraints are ignored.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be added.
+    Nontrivial proper congruences are ignored.
+    Non-octagonal equalities are ignored.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  //! Adds the constraint <CODE>matrix[i][j] <= k</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                const N& k);
+
+  //! Adds the constraint <CODE>matrix[i][j] <= numer/denom</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                Coefficient_traits::const_reference numer,
+                                Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    Adds to the Octagonal_Shape the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var,
+              Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
+
+  //! Removes all the constraints on variable \p v_id.
+  void forget_all_octagonal_constraints(dimension_type v_id);
+
+  //! Removes all binary constraints on variable \p v_id.
+  void forget_binary_octagonal_constraints(dimension_type v_id);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>v - u \<= k</CODE> and <CODE>v + u \<= k</CODE>,
+    starting from \p ub_v, which is an upper bound for \c v
+    computed according to \p sc_expr and \p sc_denom.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>v - u \<= ub_v - lb_u</CODE> and <CODE>v + u \<= ub_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of the upper bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>v - u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>v + u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>v + u \<= ub_v + lb_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u)</CODE>.
+  */
+  void deduce_v_pm_u_bounds(dimension_type v_id,
+                            dimension_type last_id,
+                            const Linear_Expression& sc_expr,
+                            Coefficient_traits::const_reference sc_denom,
+                            const N& ub_v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>-v + u \<= k</CODE> and <CODE>-v - u \<= k</CODE>,
+    starting from \p minus_lb_v, which is the negation of a lower bound
+    for \c v computed according to \p sc_expr and \p sc_denom.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>-v - u \<= -lb_v - lb_u</CODE> and
+    <CODE>-v + u \<= -lb_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of (the negation of) the lower bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>-v + u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>-v + u \<= -lb_v + lb_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>-v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>-v - u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>-v - u \<= -lb_v - ub_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>-v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u)</CODE>.
+  */
+  void deduce_minus_v_pm_u_bounds(dimension_type v_id,
+                                  dimension_type last_id,
+                                  const Linear_Expression& sc_expr,
+                                  Coefficient_traits::const_reference sc_denom,
+                                  const N& minus_lb_v);
+
+  /*! \brief
+    Adds to \p limiting_octagon the octagonal differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_octagon(const Constraint_System& cs,
+                            Octagonal_Shape& limiting_octagon) const;
+  //! Compute the (zero-equivalence classes) successor relation.
+  /*!
+    It is assumed that the octagon is not empty and strongly closed.
+  */
+  void compute_successors(std::vector<dimension_type>& successor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& successor,
+                       std::vector<dimension_type>& no_sing_leaders,
+                       bool& exist_sing_class,
+                       dimension_type& sing_leader) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+  /*! \brief
+    Stores into \p non_redundant information about the matrix entries
+    that are non-redundant (i.e., they will occur in the strongly
+    reduced matrix).
+
+    It is assumed that the OS is not empty and strongly closed;
+    moreover, argument \p non_redundant is assumed to be empty.
+  */
+  void non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const;
+
+  //! Removes the redundant constraints from \c this->matrix.
+  void strong_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \c this->matrix
+    is strongly reduced.
+  */
+  bool is_strongly_reduced() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if in the octagon taken two at a time
+    unary constraints, there is also the constraint that represent their sum.
+  */
+  bool is_strong_coherent() const;
+
+  bool tight_coherence_would_make_empty() const;
+
+  //! Assigns to \c this->matrix its strong closure.
+  /*!
+    Strong closure is a necessary condition for the precision and/or
+    the correctness of many methods. It explicitly records into \c matrix
+    those constraints that are implicitly obtainable by the other ones,
+    therefore obtaining a canonical representation for the OS.
+  */
+  void strong_closure_assign() const;
+
+  //! Applies the strong-coherence step to \c this->matrix.
+  void strong_coherence_assign();
+
+  //! Assigns to \c this->matrix its tight closure.
+  /*!
+    \note
+    This is \e not marked as a <code>const</code> method,
+    as it may modify the rational-valued geometric shape by cutting away
+    non-integral points. The method is only available if the template
+    parameter \c T is bound to an integer data type.
+  */
+  void tight_closure_assign();
+
+  /*! \brief
+    Incrementally computes strong closure, assuming that only
+    constraints affecting variable \p var need to be considered.
+
+    \note
+    It is assumed that \c *this, which was strongly closed, has only been
+    modified by adding constraints affecting variable \p var. If this
+    assumption is not satisfied, i.e., if a non-redundant constraint not
+    affecting variable \p var has been added, the behavior is undefined.
+    Worst-case complexity is \f$O(n^2)\f$.
+  */
+  void incremental_strong_closure_assign(Variable var) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d and
+    \p included are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  void drop_some_non_integer_points_helper(N& elem);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const Octagonal_Shape<T>& c);
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const Octagonal_Shape& y) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+
+  template <typename C>
+  void throw_dimension_incompatible(const char* method,
+                                    const char* lf_name,
+                                    const Linear_Form<C>& lf) const;
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& le);
+
+  static void throw_invalid_argument(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+#include "Og_Status_inlines.hh"
+#include "Octagonal_Shape_inlines.hh"
+#include "Octagonal_Shape_templates.hh"
+
+#endif // !defined(PPL_Octagonal_Shape_defs_hh)
diff --git a/src/Octagonal_Shape_inlines.hh b/src/Octagonal_Shape_inlines.hh
new file mode 100644
index 0000000..361b56b
--- /dev/null
+++ b/src/Octagonal_Shape_inlines.hh
@@ -0,0 +1,892 @@
+/* Octagonal_Shape class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_inlines_hh
+#define PPL_Octagonal_Shape_inlines_hh 1
+
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "BD_Shape_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "wrap_assign.hh"
+#include "assert.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the index coherent to \p i.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+coherent_index(const dimension_type i) {
+  return (i % 2 != 0) ? (i-1) : (i+1);
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::max_space_dimension() {
+  return OR_Matrix<N>::max_num_rows()/2;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_strongly_closed() const {
+  return status.test_strongly_closed();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_empty() {
+  status.set_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_strongly_closed() {
+  status.set_strongly_closed();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::reset_strongly_closed() {
+  status.reset_strongly_closed();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const dimension_type num_dimensions,
+                                    const Degenerate_Element kind)
+  : matrix(num_dimensions), space_dim(num_dimensions), status() {
+  if (kind == EMPTY)
+    set_empty();
+  else if (num_dimensions > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class)
+  : matrix(y.matrix), space_dim(y.space_dim), status(y.status) {
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape<U>& y,
+                                    Complexity_Class)
+  // For maximum precision, enforce shortest-path closure
+  // before copying the DB matrix.
+  : matrix((y.strong_closure_assign(), y.matrix)),
+    space_dim(y.space_dim),
+    status() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs)
+  : matrix(cs.space_dimension()),
+    space_dim(cs.space_dimension()),
+    status() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_constraints(cs);
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Congruence_System& cgs)
+  : matrix(cgs.space_dimension()),
+    space_dim(cgs.space_dimension()),
+    status() {
+  if (cgs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_congruences(cgs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Box<Interval>& box,
+                                    Complexity_Class)
+  : matrix(box.space_dimension()),
+    space_dim(box.space_dimension()),
+    status() {
+  // Check for emptiness for maximum precision.
+  if (box.is_empty())
+    set_empty();
+  else if (box.space_dimension() > 0) {
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+    refine_with_constraints(box.constraints());
+  }
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Grid& grid,
+                                    Complexity_Class)
+  : matrix(grid.space_dimension()),
+    space_dim(grid.space_dimension()),
+    status() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+  // Taking minimized congruences ensures maximum precision.
+  refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const BD_Shape<U>& bd,
+                                    Complexity_Class)
+  : matrix(bd.space_dimension()),
+    space_dim(bd.space_dimension()),
+    status() {
+  // Check for emptiness for maximum precision.
+  if (bd.is_empty())
+    set_empty();
+  else if (bd.space_dimension() > 0) {
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+    refine_with_constraints(bd.constraints());
+  }
+}
+
+template <typename T>
+inline Congruence_System
+Octagonal_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
+
+template <typename T>
+inline Octagonal_Shape<T>&
+Octagonal_Shape<T>::operator=(const Octagonal_Shape& y) {
+  matrix = y.matrix;
+  space_dim = y.space_dim;
+  status = y.status;
+  return *this;
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::~Octagonal_Shape() {
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::m_swap(Octagonal_Shape& y) {
+  using std::swap;
+  swap(matrix, y.matrix);
+  swap(space_dim, y.space_dim);
+  swap(status, y.status);
+}
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_empty() const {
+  strong_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+                             Coefficient& sup_n, Coefficient& sup_d,
+                             bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+                             Coefficient& sup_n, Coefficient& sup_d,
+                             bool& maximum,
+                             Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+                             Coefficient& inf_n, Coefficient& inf_d,
+                             bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+                             Coefficient& inf_n, Coefficient& inf_d,
+                             bool& minimum,
+                             Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_topologically_closed() const {
+  return true;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  if (x.space_dim != y.space_dim)
+    // Dimension-incompatible OSs are different.
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
+
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+  // If one of two octagons is empty, then they are equal if and only if
+  // the other octagon is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Strong closure is a canonical form.
+  return x.matrix == y.matrix;
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline const typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+                              const dimension_type j) const {
+  PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+  using namespace Implementation::Octagonal_Shapes;
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+                              const dimension_type j) {
+  PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+  using namespace Implementation::Octagonal_Shapes;
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline Constraint_System
+Octagonal_Shape<T>::minimized_constraints() const {
+  strong_reduction_assign();
+  return constraints();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_octagonal_constraint(const dimension_type i,
+                                             const dimension_type j,
+                                             const N& k) {
+  // Private method: the caller has to ensure the following.
+#ifndef NDEBUG
+  PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  PPL_ASSERT(j < m_i.row_size());
+#endif
+  N& r_i_j = matrix[i][j];
+  if (r_i_j > k) {
+    r_i_j = k;
+    if (marked_strongly_closed())
+      reset_strongly_closed();
+  }
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::add_octagonal_constraint(const dimension_type i,
+                           const dimension_type j,
+                           Coefficient_traits::const_reference numer,
+                           Coefficient_traits::const_reference denom) {
+#ifndef NDEBUG
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  PPL_ASSERT(j < m_i.row_size());
+  PPL_ASSERT(denom != 0);
+#endif
+  PPL_DIRTY_TEMP(N, k);
+  div_round_up(k, numer, denom);
+  add_octagonal_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+         i_end = cs.end(); i != i_end; ++i)
+    add_constraint(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    add_congruence(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraint(const Constraint& c) {
+  // Dimension-compatibility check.
+  if (c.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  if (!marked_empty())
+    refine_no_check(c);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_constraints(cs)",
+                           "cs and *this are space-dimension incompatible");
+
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  if (!marked_empty())
+    refine_no_check(cg);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_congruences(cgs)",
+                           "cgs and *this are space-dimension incompatible");
+
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  if (cg.is_proper_congruence()) {
+    if (cg.is_inconsistent())
+      set_empty();
+    // Other proper congruences are just ignored.
+    return;
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimension(nd)",
+                                 new_dimension);
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from an octagon in a 0-dim space.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  strong_closure_assign();
+  matrix.shrink(new_dimension);
+  // When we remove all dimensions from a non-empty octagon,
+  // we obtain the zero-dimensional universe octagon.
+  if (new_dimension == 0 && !marked_empty())
+    set_zero_dim_univ();
+  space_dim = new_dimension;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::wrap_assign(const Variables_Set& vars,
+                                Bounded_Integer_Type_Width w,
+                                Bounded_Integer_Type_Representation r,
+                                Bounded_Integer_Type_Overflow o,
+                                const Constraint_System* cs_p,
+                                unsigned complexity_threshold,
+                                bool wrap_individually) {
+  Implementation::wrap_assign(*this,
+                              vars, w, r, o, cs_p,
+                              complexity_threshold, wrap_individually,
+                              "Octagonal_Shape");
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::widening_assign(const Octagonal_Shape& y, unsigned* tp) {
+  BHMZ05_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                              unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+                            stop_points,
+                            stop_points
+                            + sizeof(stop_points)/sizeof(stop_points[0]),
+                            tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::time_elapse_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // Compute time-elapse on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.time_elapse_assign(ph_y);
+  Octagonal_Shape<T> x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::strictly_contains(const Octagonal_Shape& y) const {
+  const Octagonal_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::generalized_refine_with_linear_form_inequality(
+                    const Linear_Form< Interval<T, Interval_Info> >& left,
+                    const Linear_Form< Interval<T, Interval_Info> >& right,
+                    const Relation_Symbol relsym) {
+  switch (relsym) {
+  case EQUAL:
+    // TODO: see if we can handle this case more efficiently.
+    refine_with_linear_form_inequality(left, right);
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case LESS_THAN:
+  case LESS_OR_EQUAL:
+    refine_with_linear_form_inequality(left, right);
+    break;
+  case GREATER_THAN:
+  case GREATER_OR_EQUAL:
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case NOT_EQUAL:
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::
+refine_fp_interval_abstract_store(
+          Box< Interval<T, Interval_Info> >& store) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::refine_fp_interval_abstract_store:"
+                     " T not a floating point type.");
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Octagonal_Shape<T>& x,
+                            const Octagonal_Shape<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return rectilinear_distance_assign(r, x.matrix, y.matrix, dir,
+                                     tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Octagonal_Shape<T>& x,
+                            const Octagonal_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Octagonal_Shape<T>& x,
+                            const Octagonal_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Octagonal_Shape<T>& x,
+                          const Octagonal_Shape<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return euclidean_distance_assign(r, x.matrix, y.matrix, dir,
+                                   tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Octagonal_Shape<T>& x,
+                          const Octagonal_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Octagonal_Shape<T>& x,
+                          const Octagonal_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Octagonal_Shape<T>& x,
+                           const Octagonal_Shape<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return l_infinity_distance_assign(r, x.matrix, y.matrix, dir,
+                                    tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Octagonal_Shape<T>& x,
+                           const Octagonal_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Octagonal_Shape<T>& x,
+                           const Octagonal_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline memory_size_type
+Octagonal_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+Octagonal_Shape<T>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+  if (!is_integer(elem)) {
+#ifndef NDEBUG
+    Result r =
+#endif
+    floor_assign_r(elem, elem, ROUND_DOWN);
+    PPL_ASSERT(r == V_EQ);
+    reset_strongly_closed();
+  }
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline void
+swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Octagonal_Shape_inlines_hh)
diff --git a/src/Octagonal_Shape_templates.hh b/src/Octagonal_Shape_templates.hh
new file mode 100644
index 0000000..f4e5ae9
--- /dev/null
+++ b/src/Octagonal_Shape_templates.hh
@@ -0,0 +1,8115 @@
+/* Octagonal_Shape class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Octagonal_Shape_templates_hh
+#define PPL_Octagonal_Shape_templates_hh 1
+
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "meta_programming.hh"
+#include "assert.hh"
+#include <vector>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Polyhedron& ph,
+                                    const Complexity_Class complexity)
+  : matrix(0), space_dim(0), status() {
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = Octagonal_Shape(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = Octagonal_Shape(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  PPL_ASSERT(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = Octagonal_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our OSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality()) {
+          Linear_Expression expr(c.expression());
+          lp.add_constraint(expr >= 0);
+        }
+        else
+          lp.add_constraint(c);
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = Octagonal_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Start with a universe OS that will be refined by the simplex.
+    *this = Octagonal_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    PPL_DIRTY_TEMP_COEFFICIENT(numer);
+    PPL_DIRTY_TEMP_COEFFICIENT(denom);
+    for (dimension_type i = 0; i < num_dimensions; ++i) {
+      Variable x(i);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        numer *= 2;
+        div_round_up(matrix[2*i + 1][2*i], numer, denom);
+      }
+      // Evaluate optimal upper bounds for `x + y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(x + y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(matrix[2*i + 1][2*j], numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(((i < j) ?
+                        matrix[2*j][2*i]
+                        : matrix[2*i + 1][2*j + 1]),
+                       numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `y - x <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(((i < j)
+                        ? matrix[2*j][2*i]
+                        : matrix[2*i + 1][2*j + 1]),
+                       numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `-x - y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(-x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(matrix[2*i][2*j + 1], numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        numer *= 2;
+        div_round_up(matrix[2*i][2*i + 1], numer, denom);
+      }
+    }
+    set_strongly_closed();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+  *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+  refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs)
+  : matrix(gs.space_dimension()),
+    space_dim(gs.space_dimension()),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    return;
+  }
+
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typename OR_Matrix<N>::row_iterator mat_begin = matrix.row_begin();
+
+  PPL_DIRTY_TEMP(N, tmp);
+  bool mat_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!mat_initialized) {
+        // When handling the first (closure) point, we initialize the matrix.
+        mat_initialized = true;
+        const Coefficient& d = g.divisor();
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the hyperplanes passing in the point
+            // and having the octagonal gradient.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplanes: X_i - X_j = P_i - P_j.
+            div_round_up(x_i[dj], g_j - g_i, d);
+            div_round_up(x_ii[dj + 1], g_i - g_j, d);
+            // Hyperplanes: X_i + X_j = P_i + P_j.
+            div_round_up(x_i[dj + 1], -g_j - g_i, d);
+            div_round_up(x_ii[dj], g_i + g_j, d);
+          }
+          // Hyperplanes: X_i = P_i.
+          div_round_up(x_i[di + 1], -g_i - g_i, d);
+          div_round_up(x_ii[di], g_i + g_i, d);
+        }
+      }
+      else {
+        // This is not the first point: the matrix already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the straight lines passing in the point
+            // and having the octagonal gradient; compute maxima values.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplane: X_i - X_j = max (P_i - P_j, const).
+            div_round_up(tmp, g_j - g_i, d);
+            max_assign(x_i[dj], tmp);
+            div_round_up(tmp, g_i - g_j, d);
+            max_assign(x_ii[dj + 1], tmp);
+            // Hyperplane: X_i + X_j = max (P_i + P_j, const).
+            div_round_up(tmp, -g_j - g_i, d);
+            max_assign(x_i[dj + 1], tmp);
+            div_round_up(tmp, g_i + g_j, d);
+            max_assign(x_ii[dj], tmp);
+          }
+          // Hyperplane: X_i = max (P_i, const).
+          div_round_up(tmp, -g_i - g_i, d);
+          max_assign(x_i[di + 1], tmp);
+          div_round_up(tmp, g_i + g_i, d);
+          max_assign(x_ii[di], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw_invalid_argument("Octagonal_Shape(gs)",
+                           "the non-empty generator system gs "
+                           "contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::LINE:
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any line the right limit.
+            if (g_i != g_j) {
+              // Hyperplane: X_i - X_j <=/>= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            if (g_i != -g_j) {
+              // Hyperplane: X_i + X_j <=/>= +Inf.
+              assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          if (g_i != 0) {
+            // Hyperplane: X_i <=/>= +Inf.
+            assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+        }
+      break;
+    case Generator::RAY:
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any ray the right limit in the case
+            // of the binary constraints.
+            if (g_i < g_j)
+              // Hyperplane: X_i - X_j >= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > g_j)
+              // Hyperplane: X_i - X_j <= +Inf.
+              assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i < -g_j)
+              // Hyperplane: X_i + X_j >= +Inf.
+              assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > -g_j)
+              // Hyperplane: X_i + X_j <= +Inf.
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+          // Case: unary constraints.
+          if (g_i < 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          if (g_i > 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        }
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  // Get rid of strict inequalities.
+  if (c.is_strict_inequality()) {
+    if (c.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    if (c.is_tautological())
+      return;
+    // Nontrivial strict inequalities are not allowed.
+    throw_invalid_argument("add_constraint(c)",
+                           "strict inequalities are not allowed");
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  // Constraints that are not octagonal differences are not allowed.
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c_space_dim, num_vars,
+                                   i, j, coeff, term))
+    throw_invalid_argument("add_constraint(c)",
+                           "c is not an octagonal constraint");
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint (not a strict inequality).
+    if (c.inhomogeneous_term() < 0
+        || (c.is_equality() && c.inhomogeneous_term() != 0))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i % 2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    using namespace Implementation::Octagonal_Shapes;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
+
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dimension() < cg_space_dim)
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  // Handle the case of proper congruences first.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_tautological())
+      return;
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    // Non-trivial and proper congruences are not allowed.
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is a non-trivial, proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  add_constraint(c);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::refine_with_linear_form_inequality(
+                    const Linear_Form< Interval<T, Interval_Info> >& left,
+                    const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+                     " T not a floating point type.");
+
+  // We assume that the analyzer will not try to apply an unreachable filter.
+  PPL_ASSERT(!marked_empty());
+
+  // Dimension-compatibility checks.
+  // The dimensions of `left' and `right' should not be greater than the
+  // dimension of `*this'.
+  const dimension_type left_space_dim = left.space_dimension();
+  if (space_dim < left_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "left", left);
+
+  const dimension_type right_space_dim = right.space_dimension();
+  if (space_dim < right_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "right", right);
+
+  // Number of non-zero coefficients in `left': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type left_t = 0;
+  // Variable-index of the last non-zero coefficient in `left', if any.
+  dimension_type left_w_id = 0;
+  // Number of non-zero coefficients in `right': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type right_t = 0;
+  // Variable-index of the last non-zero coefficient in `right', if any.
+  dimension_type right_w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `left'.
+  for (dimension_type i = left_space_dim; i-- > 0; )
+    if (left.coefficient(Variable(i)) != 0) {
+      if (left_t++ == 1)
+        break;
+      else
+        left_w_id = i;
+    }
+
+  // Get information about the number of non-zero coefficients in `right'.
+  for (dimension_type i = right_space_dim; i-- > 0; )
+    if (right.coefficient(Variable(i)) != 0) {
+      if (right_t++ == 1)
+        break;
+      else
+        right_w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  // FIXME: there is plenty of duplicate code in the following lines. We could
+  // shorten it at the expense of a bit of efficiency.
+
+  if (left_t == 0) {
+    if (right_t == 0) {
+      // The constraint involves constants only. Ignore it: it is up to
+      // the analyzer to handle it.
+      PPL_ASSERT(OK());
+      return;
+    }
+
+    if (right_t == 1) {
+      // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+      // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+      if (right_w_coeff == 1) {
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_right, n_right + 1, b_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      if (right_w_coeff == -1) {
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_right + 1, n_right, b_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+  else if (left_t == 1) {
+    if (right_t == 0) {
+      // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+      // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+                              left.coefficient(Variable(left_w_id));
+      if (left_w_coeff == 1) {
+        const dimension_type n_left = left_w_id * 2;
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      if (left_w_coeff == -1) {
+        const dimension_type n_left = left_w_id * 2;
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+
+    if (right_t == 1) {
+      // The constraint has the form
+      // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+      // Reduce it to the constraint +/-x +/-y <= c+ - a-
+      // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+                              left.coefficient(Variable(left_w_id));
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+      bool is_left_coeff_one = (left_w_coeff == 1);
+      bool is_left_coeff_minus_one = (left_w_coeff == -1);
+      bool is_right_coeff_one = (right_w_coeff == 1);
+      bool is_right_coeff_minus_one = (right_w_coeff == -1);
+      if (left_w_id == right_w_id) {
+        if ((is_left_coeff_one && is_right_coeff_one)
+            || (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+          // Here we have an identity or a constants-only constraint.
+          PPL_ASSERT(OK());
+          return;
+        }
+        if (is_left_coeff_one && is_right_coeff_minus_one) {
+          // We fall back to a previous case
+          // (but we do not need to multiply the result by two).
+          const dimension_type n_left = left_w_id * 2;
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+          PPL_ASSERT(OK());
+          return;
+        }
+        if (is_left_coeff_minus_one && is_right_coeff_one) {
+          // We fall back to a previous case
+          // (but we do not need to multiply the result by two).
+          const dimension_type n_left = left_w_id * 2;
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+          PPL_ASSERT(OK());
+          return;
+        }
+      }
+      else if (is_left_coeff_one && is_right_coeff_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right, n_left, c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left + 1, n_right + 1,
+                                   c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+      if (is_left_coeff_one && is_right_coeff_minus_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right + 1, n_left, c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left + 1, n_right, c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+      if (is_left_coeff_minus_one && is_right_coeff_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right, n_left + 1, c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left, n_right + 1, c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+      if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right + 1, n_left + 1,
+                                   c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left, n_right, c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+
+  // FIRST, update the binary constraints for each pair of DIFFERENT variables
+  // in `left' and `right'.
+
+  // Declare temporaries outside of the loop.
+  PPL_DIRTY_TEMP(N, low_coeff);
+  PPL_DIRTY_TEMP(N, high_coeff);
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  Linear_Form<FP_Interval_Type> right_minus_left(right);
+  right_minus_left -= left;
+
+  dimension_type max_w_id = std::max(left_w_id, right_w_id);
+  for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+    for (dimension_type second_v = first_v + 1;
+         second_v <= max_w_id; ++second_v) {
+      const FP_Interval_Type& lfv_coefficient =
+                        left.coefficient(Variable(first_v));
+      const FP_Interval_Type& lsv_coefficient =
+                        left.coefficient(Variable(second_v));
+      const FP_Interval_Type& rfv_coefficient =
+                        right.coefficient(Variable(first_v));
+      const FP_Interval_Type& rsv_coefficient =
+                        right.coefficient(Variable(second_v));
+      // We update the constraints only when both variables appear in at
+      // least one argument.
+      bool do_update = false;
+      assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0) {
+        assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0)
+          do_update = true;
+        else {
+          assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+        }
+      }
+      else {
+        assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0) {
+          assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+          else {
+            assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+            assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+            if (low_coeff != 0 || high_coeff != 0)
+              do_update = true;
+          }
+        }
+      }
+
+      if (do_update) {
+        Variable first(first_v);
+        Variable second(second_v);
+        dimension_type n_first_var = first_v * 2;
+        dimension_type n_second_var = second_v * 2;
+        linear_form_upper_bound(right_minus_left - first + second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var + 1, n_first_var + 1,
+                                 upper_bound);
+        linear_form_upper_bound(right_minus_left + first + second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var + 1, n_first_var, upper_bound);
+        linear_form_upper_bound(right_minus_left - first - second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var, n_first_var + 1, upper_bound);
+        linear_form_upper_bound(right_minus_left + first - second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var, n_first_var, upper_bound);
+      }
+    }
+  }
+
+  // Finally, update the unary constraints.
+  for (dimension_type v = 0; v <= max_w_id; ++v) {
+    const FP_Interval_Type& lv_coefficient =
+                        left.coefficient(Variable(v));
+    const FP_Interval_Type& rv_coefficient =
+                        right.coefficient(Variable(v));
+    // We update the constraints only if v appears in at least one of the
+    // two arguments.
+    bool do_update = false;
+    assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (low_coeff != 0 || high_coeff != 0)
+      do_update = true;
+    else {
+      assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0)
+        do_update = true;
+    }
+
+    if (do_update) {
+      Variable var(v);
+      dimension_type n_var = 2 * v;
+      /*
+        VERY DIRTY trick: since we need to keep the old unary constraints
+        while computing the new ones, we momentarily keep the new coefficients
+        in the main diagonal of the matrix. They will be moved later.
+      */
+      linear_form_upper_bound(right_minus_left + var, upper_bound);
+      mul_2exp_assign_r(matrix[n_var + 1][n_var + 1], upper_bound, 1,
+                        ROUND_UP);
+      linear_form_upper_bound(right_minus_left - var, upper_bound);
+      mul_2exp_assign_r(matrix[n_var][n_var], upper_bound, 1,
+                        ROUND_UP);
+    }
+  }
+
+  /*
+    Now move the newly computed coefficients from the main diagonal to
+    their proper place, and restore +infinity on the diagonal.
+  */
+  row_iterator m_ite = matrix.row_begin();
+  row_iterator m_end = matrix.row_end();
+  for (dimension_type i = 0; m_ite != m_end; i += 2) {
+    row_reference upper = *m_ite;
+    N& ul = upper[i];
+    add_octagonal_constraint(i, i + 1, ul);
+    assign_r(ul, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    ++m_ite;
+    row_reference lower = *m_ite;
+    N& lr = lower[i + 1];
+    add_octagonal_constraint(i + 1, i, lr);
+    assign_r(lr, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    ++m_ite;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  const dimension_type c_space_dim = c.space_dimension();
+  PPL_ASSERT(c_space_dim <= space_dim);
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  // Constraints that are not octagonal differences are ignored.
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c_space_dim, num_vars,
+                                   i, j, coeff, term))
+    return;
+
+  if (num_vars == 0) {
+    const Coefficient& c_inhomo = c.inhomogeneous_term();
+    // Dealing with a trivial constraint (maybe a strict inequality).
+    if (c_inhomo < 0
+        || (c_inhomo != 0 && c.is_equality())
+        || (c_inhomo == 0 && c.is_strict_inequality()))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i % 2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    using namespace Implementation::Octagonal_Shapes;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
+
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+dimension_type
+Octagonal_Shape<T>::affine_dimension() const {
+  const dimension_type n_rows = matrix.num_rows();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (n_rows == 0)
+    return 0;
+
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `leaders' is used to represent non-singular
+  // equivalence classes:
+  // `leaders[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class).
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  // Due to the splitting of variables, the affine dimension is the
+  // number of non-singular positive zero-equivalence classes.
+  dimension_type affine_dim = 0;
+  for (dimension_type i = 0; i < n_rows; i += 2)
+    // Note: disregard the singular equivalence class.
+    if (leaders[i] == i && leaders[i + 1] == i + 1)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+Octagonal_Shape<T>::minimized_congruences() const {
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+    return cgs;
+  }
+
+  if (marked_empty()) {
+    cgs.insert(Congruence::zero_dim_false());
+    return cgs;
+  }
+
+  // The vector `leaders' is used to represent equivalence classes:
+  // `leaders[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class).
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  for (dimension_type i = 0, i_end = 2*space_dim; i != i_end; i += 2) {
+    const dimension_type lead_i = leaders[i];
+    if (i == lead_i) {
+      if (leaders[i + 1] == i)
+        // `i' is the leader of the singular equivalence class.
+        goto singular;
+      else
+        // `i' is the leader of a non-singular equivalence class.
+        continue;
+    }
+    else {
+      // `i' is not a leader.
+      if (leaders[i + 1] == lead_i)
+        // `i' belongs to the singular equivalence class.
+        goto singular;
+      else
+        // `i' does not belong to the singular equivalence class.
+        goto non_singular;
+    }
+
+  singular:
+    // `i' belongs to the singular equivalence class:
+    // we have a unary equality constraint.
+    {
+      const Variable x(i/2);
+      const N& c_ii_i = matrix[i + 1][i];
+#ifndef NDEBUG
+      const N& c_i_ii = matrix[i][i + 1];
+      PPL_ASSERT(is_additive_inverse(c_i_ii, c_ii_i));
+#endif
+      numer_denom(c_ii_i, numer, denom);
+      denom *= 2;
+      cgs.insert(denom*x == numer);
+    }
+    continue;
+
+  non_singular:
+    // `i' does not belong to the singular equivalence class.
+    // we have a binary equality constraint.
+    {
+      const N& c_i_li = matrix[i][lead_i];
+#ifndef NDEBUG
+      using namespace Implementation::Octagonal_Shapes;
+      const N& c_ii_lii = matrix[i + 1][coherent_index(lead_i)];
+      PPL_ASSERT(is_additive_inverse(c_ii_lii, c_i_li));
+#endif
+      const Variable x(lead_i/2);
+      const Variable y(i/2);
+      numer_denom(c_i_li, numer, denom);
+      if (lead_i % 2 == 0)
+        cgs.insert(denom*x - denom*y == numer);
+      else
+        cgs.insert(denom*x + denom*y + numer == 0);
+    }
+    continue;
+  }
+  return cgs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::concatenate_assign(const Octagonal_Shape& y) {
+  // If `y' is an empty 0-dim space octagon, let `*this' become empty.
+  // If `y' is an universal 0-dim space octagon, we simply return.
+  if (y.space_dim == 0) {
+    if (y.marked_empty())
+      set_empty();
+    return;
+  }
+
+  // If `*this' is an empty 0-dim space octagon, then it is sufficient
+  // to adjust the dimension of the vector space.
+  if (space_dim == 0 && marked_empty()) {
+    add_space_dimensions_and_embed(y.space_dim);
+    return;
+  }
+
+  // This is the old number of rows in the matrix. It is equal to
+  // the first index of columns to change.
+  dimension_type old_num_rows = matrix.num_rows();
+  // First we increase the space dimension of `*this' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new octagon is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // (where they are at the present) and placing the constraints of `y' in the
+  // lower right-hand side.
+  add_space_dimensions_and_embed(y.space_dim);
+  typename OR_Matrix<N>::const_element_iterator
+    y_it = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::row_iterator
+         i = matrix.row_begin() + old_num_rows,
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::row_reference_type r = *i;
+    dimension_type rs_i = i.row_size();
+    for (dimension_type j = old_num_rows; j < rs_i; ++j, ++y_it)
+      r[j] = *y_it;
+  }
+
+  // The concatenation does not preserve the closure.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", y);
+
+  if (space_dim == 0) {
+    // The zero-dimensional empty octagon only contains another
+    // zero-dimensional empty octagon.
+    // The zero-dimensional universe octagon contains any other
+    // zero-dimensional octagon.
+    return marked_empty() ? y.marked_empty() : true;
+  }
+
+  // `y' needs to be transitively closed.
+  y.strong_closure_assign();
+  // An empty octagon is in any other dimension-compatible octagons.
+  if (y.marked_empty())
+    return true;
+
+  // If `*this' is empty it can not contain `y' (which is not empty).
+  if (is_empty())
+    return false;
+
+  // `*this' contains `y' if and only if every element of `*this'
+  // is greater than or equal to the correspondent one of `y'.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), j = y.matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end; ++i, ++j)
+    if (*i < *j)
+      return false;
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_disjoint_from(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If one Octagonal_Shape is empty, the Octagonal_Shapes are disjoint.
+  strong_closure_assign();
+  if (marked_empty())
+    return true;
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return true;
+
+  // Two Octagonal_Shapes are disjoint if and only if their
+  // intersection is empty, i.e., if and only if there exists a
+  // variable such that the upper bound of the constraint on that
+  // variable in the first Octagonal_Shape is strictly less than the
+  // lower bound of the corresponding constraint in the second
+  // Octagonal_Shape or vice versa.
+
+  const dimension_type n_rows = matrix.num_rows();
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+
+  const row_iterator y_begin = y.matrix.row_begin();
+
+  PPL_DIRTY_TEMP(N, neg_y_ci_cj);
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    row_reference m_i = *i_iter;
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      row_reference m_cj = *(m_begin + cj);
+      const N& m_i_j = (j < rs_i) ? m_i[j] : m_cj[ci];
+      row_reference y_ci = *(y_begin + ci);
+      row_reference y_j = *(y_begin + j);
+      const N& y_ci_cj = (j < rs_i) ? y_ci[cj] : y_j[i];
+      neg_assign_r(neg_y_ci_cj, y_ci_cj, ROUND_UP);
+      if (m_i_j < neg_y_ci_cj)
+        return true;
+    }
+  }
+  return false;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_universe() const {
+  // An empty octagon is not universe.
+  if (marked_empty())
+    return false;
+
+  // If the octagon is non-empty and zero-dimensional,
+  // then it is necessarily the universe octagon.
+  if (space_dim == 0)
+    return true;
+
+  // An universe octagon can only contains trivial  constraints.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i)
+    if (!is_plus_infinity(*i))
+      return false;
+
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_bounded() const {
+  strong_closure_assign();
+  // A zero-dimensional or empty octagon is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  // A bounded octagon never can contains trivial constraints.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    const dimension_type i_index = i.index();
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (i_index != j)
+        if (is_plus_infinity(x_i[j]))
+          return false;
+  }
+
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains_integer_point() const {
+  // Force strong closure.
+  if (is_empty())
+    return false;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
+
+  // A strongly closed and consistent Octagonal_Shape defined by
+  // integer constraints can only be empty due to tight coherence.
+  if (std::numeric_limits<T>::is_integer)
+    return !tight_coherence_would_make_empty();
+
+  // Build an integer Octagonal_Shape oct_z with bounds at least as
+  // tight as those in *this and then recheck for emptiness, also
+  // exploiting tight-coherence.
+  Octagonal_Shape<mpz_class> oct_z(space_dim);
+  oct_z.reset_strongly_closed();
+
+  typedef Octagonal_Shape<mpz_class>::N Z;
+  bool all_integers = true;
+  typename OR_Matrix<N>::const_element_iterator x_i = matrix.element_begin();
+  for (typename OR_Matrix<Z>::element_iterator
+         z_i = oct_z.matrix.element_begin(),
+         z_end = oct_z.matrix.element_end(); z_i != z_end; ++z_i, ++x_i) {
+    const N& d = *x_i;
+    if (is_plus_infinity(d))
+      continue;
+    if (is_integer(d))
+      assign_r(*z_i, d, ROUND_NOT_NEEDED);
+    else {
+      all_integers = false;
+      assign_r(*z_i, d, ROUND_DOWN);
+    }
+  }
+  // Restore strong closure.
+  if (all_integers)
+    // oct_z unchanged, so it is still strongly closed.
+    oct_z.set_strongly_closed();
+  else {
+    // oct_z changed: recompute strong closure.
+    oct_z.strong_closure_assign();
+    if (oct_z.marked_empty())
+      return false;
+  }
+  return !oct_z.tight_coherence_would_make_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::frequency(const Linear_Expression& expr,
+                              Coefficient& freq_n, Coefficient& freq_d,
+                              Coefficient& val_n, Coefficient& val_d) const {
+  dimension_type space_dim = space_dimension();
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Check if `expr' has a constant value.
+  // If it is constant, set the frequency `freq_n' to 0
+  // and return true. Otherwise the values for \p expr
+  // are not discrete so return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 0 and the value is the inhomogeneous term.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  strong_closure_assign();
+  // For an empty Octagonal shape, we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The Octagonal shape has at least 1 dimension and is not empty.
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff_j);
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  Linear_Expression le = expr;
+  // Boolean to keep track of a variable `v' in expression `le'.
+  // If we can replace `v' by an expression using variables other
+  // than `v' and are already in `le', then this is set to true.
+  bool constant_v = false;
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+  val_denom = 1;
+
+  for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+    constant_v = false;
+    dimension_type i = i_iter.index();
+    const Variable v(i/2);
+    coeff = le.coefficient(v);
+    if (coeff == 0) {
+      constant_v = true;
+      continue;
+    }
+    // We check the unary constraints.
+    row_reference m_i = *i_iter;
+    row_reference m_ii = *(i_iter + 1);
+    const N& m_i_ii = m_i[i + 1];
+    const N& m_ii_i = m_ii[i];
+    if ((!is_plus_infinity(m_i_ii) && !is_plus_infinity(m_ii_i))
+        && (is_additive_inverse(m_i_ii, m_ii_i))) {
+      // If `v' is constant, replace it in `le' by the value.
+      numer_denom(m_i_ii, numer, denom);
+      denom *= 2;
+      le -= coeff*v;
+      le *= denom;
+      le -= numer*coeff;
+      val_denom *= denom;
+      constant_v = true;
+      continue;
+    }
+    // Check the octagonal constraints between `v' and the other dimensions
+    // that have non-zero coefficient in `le'.
+    else {
+      PPL_ASSERT(!constant_v);
+      using namespace Implementation::Octagonal_Shapes;
+      const dimension_type ci = coherent_index(i);
+      for (row_iterator j_iter = i_iter; j_iter != m_end; j_iter += 2) {
+        dimension_type j = j_iter.index();
+        const Variable vj(j/2);
+        coeff_j = le.coefficient(vj);
+        if (coeff_j == 0)
+          // The coefficient in `le' is 0, so do nothing.
+          continue;
+        const dimension_type cj = coherent_index(j);
+        const dimension_type cjj = coherent_index(j + 1);
+
+        row_reference m_j = *(m_begin + j);
+        row_reference m_cj = *(m_begin + cj);
+        const N& m_j_i = m_j[i];
+        const N& m_i_j = m_cj[ci];
+        if ((!is_plus_infinity(m_i_j) && !is_plus_infinity(m_j_i))
+            && (is_additive_inverse(m_i_j, m_j_i))) {
+          // The coefficient for `vj' in `le' is not 0
+          // and the constraint with `v' is an equality.
+          // So apply this equality to eliminate `v' in `le'.
+          numer_denom(m_i_j, numer, denom);
+          le -= coeff*v;
+          le += coeff*vj;
+          le *= denom;
+          le -= numer*coeff;
+          val_denom *= denom;
+          constant_v = true;
+          break;
+        }
+
+        m_j = *(m_begin + (j + 1));
+        m_cj = *(m_begin + cjj);
+        const N& m_j_i1 = m_j[i];
+        const N& m_i_j1 = m_cj[ci];
+        if ((!is_plus_infinity(m_i_j1) && !is_plus_infinity(m_j_i1))
+            && (is_additive_inverse(m_i_j1, m_j_i1))) {
+          // The coefficient for `vj' in `le' is not 0
+          // and the constraint with `v' is an equality.
+          // So apply this equality to eliminate `v' in `le'.
+          numer_denom(m_i_j1, numer, denom);
+          le -= coeff*v;
+          le -= coeff*vj;
+          le *= denom;
+          le -= numer*coeff;
+          val_denom *= denom;
+          constant_v = true;
+          break;
+        }
+      }
+      if (!constant_v)
+        // The expression `expr' is not constant.
+        return false;
+    }
+  }
+  if (!constant_v)
+    // The expression `expr' is not constant.
+    return false;
+
+  // The expression 'expr' is constant.
+  freq_n = 0;
+  freq_d = 1;
+
+  // Reduce `val_n' and `val_d'.
+  normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the octagonal shape.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // An octagon known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
+
+  // Check whether `var' is syntactically constrained.
+  const dimension_type n_v = 2*(var_space_dim - 1);
+  typename OR_Matrix<N>::const_row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::const_row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::const_row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    if (!is_plus_infinity(r_v[h]) || !is_plus_infinity(r_cv[h]))
+      return true;
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::const_row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::const_row_reference_type r = *m_iter;
+    if (!is_plus_infinity(r[n_v]) || !is_plus_infinity(r[n_v + 1]))
+      return true;
+  }
+
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strong_coherent() const {
+  // This method is only used by method OK() so as to check if a
+  // strongly closed matrix is also strong-coherent, as it must be.
+  const dimension_type num_rows = matrix.num_rows();
+
+  // Allocated here once and for all.
+  PPL_DIRTY_TEMP(N, semi_sum);
+  // The strong-coherence is: for every indexes i and j (and i != j)
+  // matrix[i][j] <= (matrix[i][ci] + matrix[cj][j])/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    using namespace Implementation::Octagonal_Shapes;
+    const N& m_i_ci = m_i[coherent_index(i)];
+    for (dimension_type j = matrix.row_size(i); j-- > 0; )
+      // Note: on the main diagonal only PLUS_INFINITY can occur.
+      if (i != j) {
+        const N& m_cj_j = matrix[coherent_index(j)][j];
+        if (!is_plus_infinity(m_i_ci)
+            && !is_plus_infinity(m_cj_j)) {
+          // Compute (m_i_ci + m_cj_j)/2 into `semi_sum',
+          // rounding the result towards plus infinity.
+          add_assign_r(semi_sum, m_i_ci, m_cj_j, ROUND_UP);
+          div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+          if (m_i[j] > semi_sum)
+            return false;
+        }
+      }
+  }
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strongly_reduced() const {
+  // This method is only used in assertions: efficiency is not a must.
+
+  // An empty octagon is already transitively reduced.
+  if (marked_empty())
+    return true;
+
+  Octagonal_Shape x = *this;
+  // The matrix representing an OS is strongly reduced if, by removing
+  // any constraint, the resulting matrix describes a different OS.
+  for (typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    const dimension_type i = iter.index();
+    for (dimension_type j = iter.row_size(); j-- > 0; ) {
+      if (!is_plus_infinity(m_i[j])) {
+        Octagonal_Shape x_copy = *this;
+        assign_r(x_copy.matrix[i][j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (x == x_copy)
+          return false;
+      }
+    }
+  }
+  // The octagon is just reduced.
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::bounds(const Linear_Expression& expr,
+                           const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+  strong_closure_assign();
+
+  // A zero-dimensional or empty octagon bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
+
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (from_above) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  if (Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                   i, j, coeff, term)) {
+    if (num_vars == 0)
+      return true;
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    return !is_plus_infinity(m_i[j]);
+  }
+  else {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode mode_bounds =
+      from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (maximize) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                   i, j, coeff, term)) {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // `c' is an octagonal constraint.
+    if (num_vars == 0) {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    PPL_DIRTY_TEMP(N, d);
+    if (!is_plus_infinity(m_i[j])) {
+      const Coefficient& b = expr.inhomogeneous_term();
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of a variable
+      // of `expr'.
+      PPL_DIRTY_TEMP(N, coeff_expr);
+      const Coefficient& coeff_i = expr.coefficient(Variable(i/2));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+        neg_assign(minus_coeff_i, coeff_i);
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      if (num_vars == 1) {
+        PPL_DIRTY_TEMP(N, m_i_j);
+        div_2exp_assign_r(m_i_j, m_i[j], 1, ROUND_UP);
+        add_mul_assign_r(d, coeff_expr, m_i_j, ROUND_UP);
+      }
+      else
+        add_mul_assign_r(d, coeff_expr, m_i[j], ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
+
+    // The `expr' is unbounded.
+    return false;
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included, Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+  if (!is_universe()) {
+    // We use MIP_Problems to handle constraints that are not
+    // octagonal difference.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      g = mip.optimizing_point();
+      mip.evaluate_objective_function(g, ext_n, ext_d);
+      included = true;
+      return true;
+    }
+  }
+  // The `expr' is unbounded.
+  return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
+  dimension_type cg_space_dim = cg.space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  // If the congruence is an equality,
+  // find the relation with the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    return relation_with(c);
+  }
+
+  strong_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  // Find the lower bound for a hyperplane with direction
+  // defined by the congruence.
+  Linear_Expression le(cg.expression());
+  PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+  bool min_included;
+  bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+  // If there is no lower bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  // TODO: Consider adding a max_and_min() method, performing both
+  // maximization and minimization so as to possibly exploit
+  // incrementality of the MIP solver.
+
+  // Find the upper bound for a hyperplane with direction
+  // defined by the congruence.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+  bool max_included;
+  bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+  // If there is no upper bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_above)
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is above the lower bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  min_value = min_numer / min_denom;
+  const Coefficient& modulus = cg.modulus();
+  signed_distance = min_value % modulus;
+  min_value -= signed_distance;
+  if (min_value * min_denom < min_numer)
+    min_value += modulus;
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is below the upper bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  max_value = max_numer / max_denom;
+  signed_distance = max_value % modulus;
+  max_value += signed_distance;
+  if (max_value * max_denom > max_numer)
+    max_value -= modulus;
+
+  // If the upper bound value is less than the lower bound value,
+  // then there is an empty intersection with the congruence;
+  // otherwise it will strictly intersect.
+  if (max_value < min_value)
+    return Poly_Con_Relation::is_disjoint();
+  else
+    return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+  dimension_type c_space_dim = c.space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  // The closure needs to make explicit the implicit constraints.
+  strong_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    // Trivially false zero-dimensional constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+
+    // Trivially true zero-dimensional constraint.
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(c_term);
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c_space_dim, num_vars,
+                                   i, j, coeff, c_term)) {
+    // Constraints that are not octagonal differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le;
+    le.set_space_dimension(c.space_dimension());
+    le.linear_combine(c.expr, Coefficient_one(), Coefficient_one(),
+                      1, c_space_dim + 1);
+
+    PPL_DIRTY_TEMP(Coefficient, max_numer);
+    PPL_DIRTY_TEMP(Coefficient, max_denom);
+    bool max_included;
+    PPL_DIRTY_TEMP(Coefficient, min_numer);
+    PPL_DIRTY_TEMP(Coefficient, min_denom);
+    bool min_included;
+    bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+    bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(min_numer)) {
+      case 1:
+        if (c.is_equality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return Poly_Con_Relation::strictly_intersects();
+        return Poly_Con_Relation::is_included();
+      case -1:
+        return Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        switch (sgn(min_numer)) {
+        case 1:
+          if (c.is_equality())
+            return Poly_Con_Relation::is_disjoint();
+          return Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::strictly_intersects();
+          return Poly_Con_Relation::is_included();
+        case -1:
+          return Poly_Con_Relation::strictly_intersects();
+        }
+        PPL_UNREACHABLE;
+        break;
+      case 0:
+        if (min_numer == 0) {
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of constraint.
+  typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+  const N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  // Select the cell to be checked for the ">=" part of constraint.
+  // Select the right row of the cell.
+  if (i % 2 == 0)
+    ++i_iter;
+  else
+    --i_iter;
+  typename OR_Matrix<N>::const_row_reference_type m_ci = *i_iter;
+  using namespace Implementation::Octagonal_Shapes;
+  const N& m_ci_cj = m_ci[coherent_index(j)];
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  // The following variables of mpq_class type are used to be precise
+  // when the octagon is defined by integer constraints.
+  PPL_DIRTY_TEMP(mpq_class, q_x);
+  PPL_DIRTY_TEMP(mpq_class, q_y);
+  PPL_DIRTY_TEMP(mpq_class, d);
+  PPL_DIRTY_TEMP(mpq_class, d1);
+  PPL_DIRTY_TEMP(mpq_class, c_denom);
+  PPL_DIRTY_TEMP(mpq_class, q_denom);
+  assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c_term, ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(m_i_j)) {
+    if (!is_plus_infinity(m_ci_cj)) {
+      // `*this' is in the following form:
+      // `-m_ci_cj <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-m_ci_cj > d' (`-m_ci_cj >= d' if c is a strict inequality),
+      // i.e., if `m_ci_cj < d1' (`m_ci_cj <= d1'
+      // if c is a strict inequality).
+      numer_denom(m_ci_cj, numer, denom);
+      assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
+
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
+
+  // Here `m_i_j' is not plus-infinity.
+  numer_denom(m_i_j, numer, denom);
+  assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(m_ci_cj)) {
+    numer_denom(m_ci_cj, numer, denom);
+    assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `m_ci_cj < d1' (`m_ci_cj <= d1' if `c' is a strict inequality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
+
+  // Here `m_ci_cj' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `m_i_j < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
+
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+Octagonal_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The closure needs to make explicit the implicit constraints and if the
+  // octagon is empty.
+  strong_closure_assign();
+
+  // The empty octagon cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe octagon in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
+
+  // The relation between the octagon and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the octagon.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the octagon.
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP_COEFFICIENT(product);
+
+  // We find in `*this' all the constraints.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    row_reference m_i = *i_iter;
+    row_reference m_ii = *(i_iter + 1);
+    const N& m_i_ii = m_i[i + 1];
+    const N& m_ii_i = m_ii[i];
+    // We have the unary constraints.
+    const Variable x(i/2);
+    const Coefficient& g_coeff_x
+      = (x.space_dimension() > g_space_dim)
+      ? Coefficient_zero()
+      : g.coefficient(x);
+    if (is_additive_inverse(m_i_ii, m_ii_i)) {
+      // The constraint has form ax = b.
+      // To satisfy the constraint it is necessary that the scalar product
+      // is not zero. The scalar product has the form
+      // 'denom * g_coeff_x - numer * g.divisor()'.
+      numer_denom(m_ii_i, numer, denom);
+      denom *= 2;
+      product = denom * g_coeff_x;
+      // Note that if the generator `g' is a line or a ray,
+      // its divisor is zero.
+      if (!is_line_or_ray) {
+        neg_assign(numer);
+        add_mul_assign(product, numer, g.divisor());
+      }
+      if (product != 0)
+        return Poly_Gen_Relation::nothing();
+    }
+    // We have 0, 1 or 2 inequality constraints.
+    else {
+      if (!is_plus_infinity(m_i_ii)) {
+        // The constraint has form -ax <= b.
+        // If the generator is a line it's necessary to check if
+        // the scalar product is not zero, if it is positive otherwise.
+        numer_denom(m_i_ii, numer, denom);
+        denom *= -2;
+        product = denom * g_coeff_x;
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer, g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form
+          // '-denom * g.coeff_x - numer * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+      if (!is_plus_infinity(m_ii_i)) {
+        // The constraint has form ax <= b.
+        numer_denom(m_ii_i, numer, denom);
+        denom *= 2;
+        product = denom * g_coeff_x;
+         // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer , g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form
+          // 'denom * g_coeff_x - numer * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+
+  // We have the binary constraints.
+  for (row_iterator i_iter = m_begin ; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    row_reference m_i = *i_iter;
+    row_reference m_ii = *(i_iter + 1);
+    for (dimension_type j = 0; j < i; j += 2) {
+      const N& m_i_j = m_i[j];
+      const N& m_ii_jj = m_ii[j + 1];
+      const N& m_ii_j = m_ii[j];
+      const N& m_i_jj = m_i[j + 1];
+      const Variable x(j/2);
+      const Variable y(i/2);
+      const Coefficient& g_coeff_x
+        = (x.space_dimension() > g_space_dim)
+        ? Coefficient_zero()
+        : g.coefficient(x);
+      const Coefficient& g_coeff_y
+        = (y.space_dimension() > g_space_dim)
+        ? Coefficient_zero()
+        : g.coefficient(y);
+
+      const bool difference_is_equality = is_additive_inverse(m_ii_jj, m_i_j);
+      if (difference_is_equality) {
+        // The constraint has form a*x - a*y = b.
+        // The scalar product has the form
+        // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_i_j, numer, denom);
+        product = denom * g_coeff_x;
+        neg_assign(denom);
+        add_mul_assign(product, denom, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_j)) {
+          // The constraint has form a*x - a*y <= b.
+          // The scalar product has the form
+          // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_j, numer, denom);
+          product = denom * g_coeff_x;
+          neg_assign(denom);
+          add_mul_assign(product, denom, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_jj)) {
+          // The constraint has form -a*x + a*y <= b.
+          // The scalar product has the form
+          // '-denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_jj, numer, denom);
+          product = denom * g_coeff_y;
+          neg_assign(denom);
+          add_mul_assign(product, denom, g_coeff_x);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+
+      const bool sum_is_equality = is_additive_inverse(m_i_jj, m_ii_j);
+      if (sum_is_equality) {
+        // The constraint has form a*x + a*y = b.
+        // The scalar product has the form
+        // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_ii_j, numer, denom);
+        product = denom * g_coeff_x;
+        add_mul_assign(product, denom, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_jj)) {
+          // The constraint has form -a*x - a*y <= b.
+          // The scalar product has the form
+          // '-denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_jj, numer, denom);
+          neg_assign(denom);
+          product = denom * g_coeff_x;
+          add_mul_assign(product, denom, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_j)) {
+          // The constraint has form a*x + a*y <= b.
+          // The scalar product has the form
+          // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_j, numer, denom);
+          product = denom * g_coeff_x;
+          add_mul_assign(product, denom, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
+  // If this point is reached the constraint 'g' satisfies
+  // all the constraints in the octagon.
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_closure_assign() const {
+  // Do something only if necessary (zero-dim implies strong closure).
+  if (marked_empty() || marked_strongly_closed() || space_dim == 0)
+    return;
+
+  // Even though the octagon will not change, its internal representation
+  // is going to be modified by the closure algorithm.
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  const dimension_type n_rows = x.matrix.num_rows();
+  const row_iterator m_begin = x.matrix.row_begin();
+  const row_iterator m_end = x.matrix.row_end();
+
+  // Fill the main diagonal with zeros.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
+
+  // This algorithm is given by two steps: the first one is a simple
+  // adaptation of the `shortest-path closure' using the Floyd-Warshall
+  // algorithm; the second one is the `strong-coherence' algorithm.
+  // It is important to note that after the strong-coherence,
+  // the octagon is still shortest-path closed and hence, strongly closed.
+
+  // Recall that, given an index `h', we indicate with `ch' the coherent
+  // index, i.e., the index such that:
+  //   ch = h + 1, if h is an even number;
+  //   ch = h - 1, if h is an odd number.
+
+  typename OR_Matrix<N>::element_iterator iter_ij;
+  std::vector<N> vec_k(n_rows);
+  std::vector<N> vec_ck(n_rows);
+  PPL_DIRTY_TEMP(N, sum1);
+  PPL_DIRTY_TEMP(N, sum2);
+  row_reference x_k;
+  row_reference x_ck;
+  row_reference x_i;
+  row_reference x_ci;
+
+  // Since the index `j' of the inner loop will go from 0 up to `i',
+  // the three nested loops have to be executed twice.
+  for (int twice = 0; twice < 2; ++twice) {
+
+    row_iterator x_k_iter = m_begin;
+    row_iterator x_i_iter = m_begin;
+    for (dimension_type k = 0; k < n_rows; k += 2) {
+      const dimension_type ck = k + 1;
+      // Re-initialize the element iterator.
+      iter_ij = x.matrix.element_begin();
+      // Compute the row references `x_k' and `x_ck'.
+      x_k  = *x_k_iter;
+      ++x_k_iter;
+      x_ck = *x_k_iter;
+      ++x_k_iter;
+
+      for (dimension_type i = 0; i <= k; i += 2) {
+        const dimension_type ci = i + 1;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_k[i];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_k[ci];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ck[i];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_ck[ci];
+      }
+      x_i_iter = x_k_iter;
+      for (dimension_type i = k + 2; i < n_rows; i += 2) {
+        const dimension_type ci = i + 1;
+        x_i = *x_i_iter;
+        ++x_i_iter;
+        x_ci = *x_i_iter;
+        ++x_i_iter;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_ci[ck];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_i[ck];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ci[k];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_i[k];
+      }
+
+      for (dimension_type i = 0; i < n_rows; ++i) {
+        using namespace Implementation::Octagonal_Shapes;
+        const dimension_type ci = coherent_index(i);
+        const N& vec_k_ci = vec_k[ci];
+        const N& vec_ck_ci = vec_ck[ci];
+        // Unfolding two iterations on `j': this ensures that
+        // the loop exit condition `j <= i' is OK.
+        for (dimension_type j = 0; j <= i; ) {
+          // First iteration: compute
+          //
+          // <CODE>
+          //   sum1 = x_i_k + x_k_j == x_ck_ci + x_k_j;
+          //   sum2 = x_i_ck + x_ck_j == x_k_ci + x_ck_j;
+          // </CODE>
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the first iteration: loop index control.
+          ++j;
+          ++iter_ij;
+          // Second iteration: ditto.
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the second iteration: loop index control.
+          ++j;
+          ++iter_ij;
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value in the main diagonal.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      PPL_ASSERT(sgn(x_i_i) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // Step 2: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_coherence_assign() {
+  // The strong-coherence is: for every indexes i and j
+  // m_i_j <= (m_i_ci + m_cj_j)/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  PPL_DIRTY_TEMP(N, semi_sum);
+  for (typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin(),
+         i_end = matrix.row_end(); i_iter != i_end; ++i_iter) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i_iter;
+    const dimension_type i = i_iter.index();
+    using namespace Implementation::Octagonal_Shapes;
+    const N& x_i_ci = x_i[coherent_index(i)];
+    // Avoid to do unnecessary sums.
+    if (!is_plus_infinity(x_i_ci))
+      for (dimension_type j = 0, rs_i = i_iter.row_size(); j < rs_i; ++j)
+        if (i != j) {
+          const N& x_cj_j = matrix[coherent_index(j)][j];
+          if (!is_plus_infinity(x_cj_j)) {
+            add_assign_r(semi_sum, x_i_ci, x_cj_j, ROUND_UP);
+            div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+            min_assign(x_i[j], semi_sum);
+          }
+        }
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::tight_coherence_would_make_empty() const {
+  PPL_ASSERT(std::numeric_limits<N>::is_integer);
+  PPL_ASSERT(marked_strongly_closed());
+  const dimension_type space_dim = space_dimension();
+  for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+    const dimension_type ci = i + 1;
+    const N& mat_i_ci = matrix[i][ci];
+    if (!is_plus_infinity(mat_i_ci)
+        // Check for oddness of `mat_i_ci'.
+        && !is_even(mat_i_ci)
+        // Check for zero-equivalence of `i' and `ci'.
+        && is_additive_inverse(mat_i_ci, matrix[ci][i]))
+      return true;
+  }
+  return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::tight_closure_assign() {
+  PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+                         "Octagonal_Shape<T>::tight_closure_assign():"
+                         " T in not an integer datatype.");
+  // FIXME: this is just an executable specification.
+  // (The following call could be replaced by shortest-path closure.)
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+  if (tight_coherence_would_make_empty())
+    set_empty();
+  else {
+    // Tighten the unary constraints.
+    PPL_DIRTY_TEMP(N, temp_one);
+    assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+    const dimension_type space_dim = space_dimension();
+    for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+      const dimension_type ci = i + 1;
+      N& mat_i_ci = matrix[i][ci];
+      if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci))
+        sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+      N& mat_ci_i = matrix[ci][i];
+      if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i))
+        sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+    }
+    // Propagate tightened unary constraints.
+    strong_coherence_assign();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::incremental_strong_closure_assign(const Variable var) const {
+  // `var' should be one of the dimensions of the octagon.
+  if (var.id() >= space_dim)
+    throw_dimension_incompatible("incremental_strong_closure_assign(v)",
+                                 var.id());
+
+  // Do something only if necessary.
+  if (marked_empty() || marked_strongly_closed())
+    return;
+
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  const row_iterator m_begin = x.matrix.row_begin();
+  const row_iterator m_end = x.matrix.row_end();
+
+  // Fill the main diagonal with zeros.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
+
+  // Using the incremental Floyd-Warshall algorithm.
+  // Step 1: Improve all constraints on variable `var'.
+  const dimension_type v = 2*var.id();
+  const dimension_type cv = v + 1;
+  row_iterator v_iter = m_begin + v;
+  row_iterator cv_iter = v_iter + 1;
+  row_reference x_v = *v_iter;
+  row_reference x_cv = *cv_iter;
+  const dimension_type rs_v = v_iter.row_size();
+  const dimension_type n_rows = x.matrix.num_rows();
+  PPL_DIRTY_TEMP(N, sum);
+  using namespace Implementation::Octagonal_Shapes;
+  for (row_iterator k_iter = m_begin; k_iter != m_end; ++k_iter) {
+    const dimension_type k = k_iter.index();
+    const dimension_type ck = coherent_index(k);
+    const dimension_type rs_k = k_iter.row_size();
+    row_reference x_k = *k_iter;
+    row_reference x_ck = (k % 2 != 0) ? *(k_iter-1) : *(k_iter + 1);
+
+    for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+      const dimension_type i = i_iter.index();
+      const dimension_type ci = coherent_index(i);
+      const dimension_type rs_i = i_iter.row_size();
+      row_reference x_i = *i_iter;
+      row_reference x_ci = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+
+      const N& x_i_k = (k < rs_i) ? x_i[k] : x_ck[ci];
+      if (!is_plus_infinity(x_i_k)) {
+        const N& x_k_v = (v < rs_k) ? x_k[v] : x_cv[ck];
+        if (!is_plus_infinity(x_k_v)) {
+          add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+          N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+          min_assign(x_i_v, sum);
+        }
+        const N& x_k_cv = (cv < rs_k) ? x_k[cv] : x_v[ck];
+        if (!is_plus_infinity(x_k_cv)) {
+          add_assign_r(sum, x_i_k, x_k_cv, ROUND_UP);
+          N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+          min_assign(x_i_cv, sum);
+        }
+      }
+      const N& x_k_i = (i < rs_k) ? x_k[i] : x_ci[ck];
+      if (!is_plus_infinity(x_k_i)) {
+        const N& x_v_k = (k < rs_v) ? x_v[k] : x_ck[cv];
+        if (!is_plus_infinity(x_v_k)) {
+          N& x_v_i = (i < rs_v) ? x_v[i] : x_ci[cv];
+          add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+          min_assign(x_v_i, sum);
+        }
+        const N& x_cv_k = (k < rs_v) ? x_cv[k] : x_ck[v];
+        if (!is_plus_infinity(x_cv_k)) {
+          N& x_cv_i = (i < rs_v) ? x_cv[i] : x_ci[v];
+          add_assign_r(sum, x_cv_k, x_k_i, ROUND_UP);
+          min_assign(x_cv_i, sum);
+        }
+      }
+
+    }
+  }
+
+  // Step 2: improve the other bounds by using the precise bounds
+  // for the constraints on `var'.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    row_reference x_i = *i_iter;
+    const N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+    // TODO: see if it is possible to optimize this inner loop
+    // by splitting it into several parts, so as to avoid
+    // conditional expressions.
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      row_reference x_cj = *(m_begin + cj);
+      N& x_i_j = (j < rs_i) ? x_i[j] : x_cj[ci];
+      if (!is_plus_infinity(x_i_v)) {
+        const N& x_v_j = (j < rs_v) ? x_v[j] : x_cj[cv];
+        if (!is_plus_infinity(x_v_j)) {
+          add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+      const N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+      if (!is_plus_infinity(x_i_cv)) {
+        const N& x_cv_j = (j < rs_v) ? x_cv[j] : x_cj[v];
+        if (!is_plus_infinity(x_cv_j)) {
+          add_assign_r(sum, x_i_cv, x_cv_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value on the main diagonal.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      // Restore PLUS_INFINITY on the main diagonal.
+      PPL_ASSERT(sgn(x_i_i) == 0);
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // Step 3: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_successors(std::vector<dimension_type>& successor) const {
+  PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(successor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `successor' is used to indicate which variable
+  // immediately follows a given one in the corresponding equivalence class.
+  const dimension_type successor_size = matrix.num_rows();
+  // Initially, each variable is successor of its own zero-equivalence class.
+  successor.reserve(successor_size);
+  for (dimension_type i = 0; i < successor_size; ++i)
+    successor.push_back(i);
+  // Now compute actual successors.
+  for (dimension_type i = successor_size; i-- > 0; )  {
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    typename OR_Matrix<N>::const_row_reference_type m_ci
+      = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+    for (dimension_type j = 0; j < i; ++j) {
+      // FIXME: what is the following, commented-out for?
+    //for (dimension_type j = i; j-- > 0; ) {
+      using namespace Implementation::Octagonal_Shapes;
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as successor the variable having the greatest index.
+        successor[j] = i;
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& leaders) const {
+  PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(leaders.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `leaders' is used to indicate the smallest variable
+  // that belongs to the corresponding equivalence class.
+  const dimension_type leader_size = matrix.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  leaders.reserve(leader_size);
+  for (dimension_type i = 0; i < leader_size; ++i)
+    leaders.push_back(i);
+  // Now compute actual leaders.
+  for (typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end();
+       i_iter != matrix_row_end; ++i_iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    dimension_type i = i_iter.index();
+    typename OR_Matrix<N>::const_row_reference_type m_ci
+      = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+    for (dimension_type j = 0; j < i; ++j) {
+      using namespace Implementation::Octagonal_Shapes;
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as leader the variable having the smaller index.
+        leaders[i] = leaders[j];
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& successor,
+                  std::vector<dimension_type>& no_sing_leaders,
+                  bool& exist_sing_class,
+                  dimension_type& sing_leader) const {
+  PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(no_sing_leaders.size() == 0);
+  dimension_type successor_size = successor.size();
+  std::deque<bool> dealt_with(successor_size, false);
+  for (dimension_type i = 0; i < successor_size; ++i) {
+    dimension_type next_i = successor[i];
+    if (!dealt_with[i]) {
+      // The index is a leader.
+      // Now check if it is a leader of a singular class or not.
+      using namespace Implementation::Octagonal_Shapes;
+      if (next_i == coherent_index(i)) {
+        exist_sing_class = true;
+        sing_leader = i;
+      }
+      else
+        no_sing_leaders.push_back(i);
+    }
+    // The following index is not a leader.
+    dealt_with[next_i] = true;
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_reduction_assign() const {
+  // Zero-dimensional octagonal shapes are necessarily reduced.
+  if (space_dim == 0)
+    return;
+  strong_closure_assign();
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Detect non-redundant constraints.
+  std::vector<Bit_Row> non_red;
+  non_redundant_matrix_entries(non_red);
+
+  // Throw away redundant constraints.
+  Octagonal_Shape<T>& x = const_cast<Octagonal_Shape<T>&>(*this);
+#ifndef NDEBUG
+  const Octagonal_Shape x_copy_before(x);
+#endif
+  typename OR_Matrix<N>::element_iterator x_i = x.matrix.element_begin();
+  for (dimension_type i = 0; i < 2 * space_dim; ++i) {
+    const Bit_Row& non_red_i = non_red[i];
+    for (dimension_type j = 0,
+           j_end = OR_Matrix<N>::row_size(i); j < j_end; ++j, ++x_i) {
+      if (!non_red_i[j])
+        assign_r(*x_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+  x.reset_strongly_closed();
+#ifndef NDEBUG
+  const Octagonal_Shape x_copy_after(x);
+  PPL_ASSERT(x_copy_before == x_copy_after);
+  PPL_ASSERT(x.is_strongly_reduced());
+  PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(space_dim > 0 && !marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(non_redundant.empty());
+
+  // Initialize `non_redundant' as if it was an OR_Matrix of booleans
+  // (initially set to false).
+  non_redundant.resize(2*space_dim);
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is strongly
+  // closed, this happens if and only if matrix[i][j] == -matrix[ci][cj].
+  std::vector<dimension_type> no_sing_leaders;
+  dimension_type sing_leader = 0;
+  bool exist_sing_class = false;
+  std::vector<dimension_type> successor;
+  compute_successors(successor);
+  compute_leaders(successor, no_sing_leaders, exist_sing_class, sing_leader);
+  const dimension_type num_no_sing_leaders = no_sing_leaders.size();
+
+
+  // Step 2: flag redundant constraints in `redundancy'.
+  // Go through non-singular leaders first.
+  for (dimension_type li = 0; li < num_no_sing_leaders; ++li) {
+    const dimension_type i = no_sing_leaders[li];
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type ci = coherent_index(i);
+    typename OR_Matrix<N>::const_row_reference_type
+      m_i = *(matrix.row_begin() + i);
+    if (i % 2 == 0) {
+      // Each positive equivalence class must have a single 0-cycle
+      // connecting all equivalent variables in increasing order.
+      // Note: by coherence assumption, the variables in the
+      // corresponding negative equivalence class are
+      // automatically connected.
+      if (i != successor[i]) {
+        dimension_type j = i;
+        dimension_type next_j = successor[j];
+        while (j != next_j) {
+          non_redundant[next_j].set(j);
+          j = next_j;
+          next_j = successor[j];
+        }
+        const dimension_type cj = coherent_index(j);
+        non_redundant[cj].set(ci);
+      }
+    }
+
+    dimension_type rs_li = (li % 2 != 0) ? li : (li + 1);
+    // Check if the constraint is redundant.
+    PPL_DIRTY_TEMP(N, tmp);
+    for (dimension_type lj = 0 ; lj <= rs_li; ++lj) {
+      const dimension_type j = no_sing_leaders[lj];
+      const dimension_type cj = coherent_index(j);
+      const N& m_i_j = m_i[j];
+      const N& m_i_ci = m_i[ci];
+      bool to_add = true;
+      // Control if the constraint is redundant by strong-coherence,
+      // that is:
+      // m_i_j >= (m_i_ci + m_cj_j)/2,   where j != ci.
+      if (j != ci) {
+        add_assign_r(tmp, m_i_ci, matrix[cj][j], ROUND_UP);
+        div_2exp_assign_r(tmp, tmp, 1, ROUND_UP);
+        if (m_i_j >= tmp)
+          // The constraint is redundant.
+          continue;
+      }
+      // Control if the constraint is redundant by strong closure, that is
+      // if there is a path from i to j (i = i_0, ... , i_n = j), such that
+      // m_i_j = sum_{k=0}^{n-1} m_{i_k}_{i_(k + 1)}.
+      // Since the octagon is already strongly closed, the above relation
+      // is reduced to three case, in accordance with k, i, j inter-depend:
+      // exit k such that
+      // 1.) m_i_j >= m_i_k   + m_cj_ck,   if k < j < i; or
+      // 2.) m_i_j >= m_i_k   + m_k,_j,    if j < k < i; or
+      // 3.) m_i_j >= m_ck_ci + m_k_j,     if j < i < k.
+      // Note: `i > j'.
+      for (dimension_type lk = 0; lk < num_no_sing_leaders; ++lk) {
+        const dimension_type k = no_sing_leaders[lk];
+        if (k != i && k != j) {
+          dimension_type ck = coherent_index(k);
+          if (k < j)
+            // Case 1.
+            add_assign_r(tmp, m_i[k], matrix[cj][ck], ROUND_UP);
+          else if (k < i)
+            // Case 2.
+            add_assign_r(tmp, m_i[k], matrix[k][j], ROUND_UP);
+          else
+            // Case 3.
+            add_assign_r(tmp, matrix[ck][ci], matrix[k][j], ROUND_UP);
+
+          // Checks if the constraint is redundant.
+          if (m_i_j >= tmp) {
+            to_add = false;
+            break;
+          }
+        }
+      }
+
+      if (to_add)
+        // The constraint is not redundant.
+        non_redundant[i].set(j);
+    }
+  }
+
+  // If there exist a singular equivalence class, then it must have a
+  // single 0-cycle connecting all the positive and negative equivalent
+  // variables.
+  // Note: the singular class is not connected with the other classes.
+  if (exist_sing_class) {
+    non_redundant[sing_leader].set(sing_leader + 1);
+    if (successor[sing_leader + 1] != sing_leader + 1) {
+      dimension_type j = sing_leader;
+      dimension_type next_j = successor[j + 1];
+      while (next_j != j + 1) {
+        non_redundant[next_j].set(j);
+        j = next_j;
+        next_j = successor[j + 1];
+      }
+      non_redundant[j + 1].set(j);
+    }
+    else
+      non_redundant[sing_leader + 1].set(sing_leader);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::upper_bound_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+  // The hull of an octagon `x' with an empty octagon is `x'.
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The oct-hull is obtained by computing maxima.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end; ++i, ++j)
+    max_assign(*i, *j);
+
+  // The result is still closed.
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::difference_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("difference_assign(y)", y);
+
+  Octagonal_Shape& x = *this;
+
+  // Being lazy here is only harmful.
+  // We close.
+  x.strong_closure_assign();
+  // The difference of an empty octagon and of an octagon `p' is empty.
+  if (x.marked_empty())
+    return;
+  // The difference of a octagon `p' and an empty octagon is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both octagons are zero-dimensional,
+  // then at this point they are necessarily universe octagons,
+  // so that their difference is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  Octagonal_Shape new_oct(space_dim, EMPTY);
+  // We take a constraint of the octagon y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementary constraints with the octagon x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the octagon `x' is included the octagon defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty octagon, and as we would obtain
+    // a result that is less precise than the difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    Octagonal_Shape z = x;
+    const Linear_Expression e(c.expression());
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_oct.upper_bound_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_oct.upper_bound_assign(z);
+    }
+  }
+  *this = new_oct;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::simplify_using_context_assign(const Octagonal_Shape& y) {
+  Octagonal_Shape& x = *this;
+  const dimension_type dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (dim != y.space_dimension())
+    throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+  // Filter away the zero-dimensional case.
+  if (dim == 0) {
+    if (y.marked_empty()) {
+      x.set_zero_dim_univ();
+      return false;
+    }
+    else
+      return !x.marked_empty();
+  }
+
+  // Filter away the case where `x' contains `y'
+  // (this subsumes the case when `y' is empty).
+  if (x.contains(y)) {
+    Octagonal_Shape<T> res(dim, UNIVERSE);
+    x.m_swap(res);
+    return false;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iter;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_CIter;
+  typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+  typedef typename OR_Matrix<N>::const_element_iterator Elem_CIter;
+
+  // Filter away the case where `x' is empty.
+  x.strong_closure_assign();
+  if (x.marked_empty()) {
+    // Search for a constraint of `y' that is not a tautology.
+    dimension_type i;
+    dimension_type j;
+    // Prefer unary constraints.
+    for (i = 0; i < 2*dim; i += 2) {
+      // FIXME: if N is a float or bounded integer type, then
+      // we also need to check that we are actually able to construct
+      // a constraint inconsistent with respect to this one.
+      // Use something like !is_maximal()?
+      if (!is_plus_infinity(y.matrix_at(i, i + 1))) {
+        j = i + 1;
+        goto found;
+      }
+      // Use something like !is_maximal()?
+      if (!is_plus_infinity(y.matrix_at(i + 1, i))) {
+        j = i;
+        ++i;
+        goto found;
+      }
+    }
+    // Then search binary constraints.
+    // TODO: use better iteration scheme.
+    for (i = 2; i < 2*dim; ++i)
+      for (j = 0; j < i; ++j) {
+        // Use something like !is_maximal()?
+        if (!is_plus_infinity(y.matrix_at(i, j)))
+          goto found;
+      }
+
+    // Not found: we were not able to build a constraint contradicting
+    // one of the constraints in `y': `x' cannot be enlarged.
+    return false;
+
+  found:
+    // Found: build a new OS contradicting the constraint found.
+    PPL_ASSERT(i < dim && j < dim && i != j);
+    Octagonal_Shape<T> res(dim, UNIVERSE);
+    // FIXME: compute a proper contradicting constraint.
+    PPL_DIRTY_TEMP(N, tmp);
+    assign_r(tmp, 1, ROUND_UP);
+    add_assign_r(tmp, tmp, y.matrix_at(i, j), ROUND_UP);
+    // CHECKME: round down is really meant.
+    neg_assign_r(res.matrix_at(j, i), tmp, ROUND_DOWN);
+    PPL_ASSERT(!is_plus_infinity(res.matrix_at(j, i)));
+    x.m_swap(res);
+    return false;
+  }
+
+  // Here `x' and `y' are not empty and strongly closed;
+  // also, `x' does not contain `y'.
+  // Let `target' be the intersection of `x' and `y'.
+  Octagonal_Shape<T> target = x;
+  target.intersection_assign(y);
+  const bool bool_result = !target.is_empty();
+
+  // Compute redundancy information for x and ...
+  // TODO: provide a nicer data structure for redundancy.
+  std::vector<Bit_Row> x_non_redundant;
+  x.non_redundant_matrix_entries(x_non_redundant);
+  // ... count the non-redundant constraints.
+  dimension_type x_num_non_redundant = 0;
+  for (size_t i = x_non_redundant.size(); i-- > 0 ; )
+    x_num_non_redundant += x_non_redundant[i].count_ones();
+  PPL_ASSERT(x_num_non_redundant > 0);
+
+  // Let `yy' be a copy of `y': we will keep adding to `yy'
+  // the non-redundant constraints of `x',
+  // stopping as soon as `yy' becomes equal to `target'.
+  Octagonal_Shape<T> yy = y;
+
+  // The constraints added to `yy' will be recorded in `res' ...
+  Octagonal_Shape<T> res(dim, UNIVERSE);
+  // ... and we will count them too.
+  dimension_type res_num_non_redundant = 0;
+
+  // Compute leader information for `x'.
+  std::vector<dimension_type> x_leaders;
+  x.compute_leaders(x_leaders);
+
+  // First go through the unary equality constraints.
+  // Find the leader of the singular equivalence class (it is even!).
+  dimension_type sing_leader;
+  for (sing_leader = 0; sing_leader < 2*dim; sing_leader += 2) {
+    if (sing_leader == x_leaders[sing_leader]) {
+      const N& x_s_ss = x.matrix_at(sing_leader, sing_leader + 1);
+      const N& x_ss_s = x.matrix_at(sing_leader + 1, sing_leader);
+      if (is_additive_inverse(x_s_ss, x_ss_s))
+        // Singular leader found.
+        break;
+    }
+  }
+
+  // Unary equalities have `sing_leader' as a leader.
+  for (dimension_type i = sing_leader; i < 2*dim; i += 2) {
+    if (x_leaders[i] != sing_leader)
+      continue;
+    // Found a unary equality constraint:
+    // see if any of the two inequalities have to be added.
+    const N& x_i_ii = x.matrix_at(i, i + 1);
+    N& yy_i_ii = yy.matrix_at(i, i + 1);
+    if (x_i_ii < yy_i_ii) {
+      // The \leq inequality is not implied by context.
+      res.matrix_at(i, i + 1) = x_i_ii;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_i_ii = x_i_ii;
+      yy.reset_strongly_closed();
+    }
+    const N& x_ii_i = x.matrix_at(i + 1, i);
+    N& yy_ii_i = yy.matrix_at(i + 1, i);
+    if (x_ii_i < yy_ii_i) {
+      // The \geq inequality is not implied by context.
+      res.matrix_at(i + 1, i) = x_ii_i;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_ii_i = x_ii_i;
+      yy.reset_strongly_closed();
+    }
+    // Restore strong closure, if it was lost.
+    if (!yy.marked_strongly_closed()) {
+      Variable var_i(i/2);
+      yy.incremental_strong_closure_assign(var_i);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_strongly_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Go through the binary equality constraints.
+  for (dimension_type i = 0; i < 2*dim; ++i) {
+    const dimension_type j = x_leaders[i];
+    if (j == i || j == sing_leader)
+      continue;
+    const N& x_i_j = x.matrix_at(i, j);
+    PPL_ASSERT(!is_plus_infinity(x_i_j));
+    N& yy_i_j = yy.matrix_at(i, j);
+    if (x_i_j < yy_i_j) {
+      res.matrix_at(i, j) = x_i_j;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_i_j = x_i_j;
+      yy.reset_strongly_closed();
+    }
+    const N& x_j_i = x.matrix_at(j, i);
+    N& yy_j_i = yy.matrix_at(j, i);
+    PPL_ASSERT(!is_plus_infinity(x_j_i));
+    if (x_j_i < yy_j_i) {
+      res.matrix_at(j, i) = x_j_i;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_j_i = x_j_i;
+      yy.reset_strongly_closed();
+    }
+    // Restore strong closure, if it was lost.
+    if (!yy.marked_strongly_closed()) {
+      Variable var_j(j/2);
+      yy.incremental_strong_closure_assign(var_j);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_strongly_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Finally go through the (proper) inequality constraints:
+  // both indices i and j should be leaders.
+  // FIXME: improve iteration scheme (are we doing twice the work?)
+  for (dimension_type i = 0; i < 2*dim; ++i) {
+    if (i != x_leaders[i])
+      continue;
+    const Bit_Row& x_non_redundant_i = x_non_redundant[i];
+    for (dimension_type j = 0; j < 2*dim; ++j) {
+      if (j != x_leaders[j])
+        continue;
+      if (i >= j) {
+        if (!x_non_redundant_i[j])
+          continue;
+      }
+      else if (!x_non_redundant[j][i])
+        continue;
+      N& yy_i_j = yy.matrix_at(i, j);
+      const N& x_i_j = x.matrix_at(i, j);
+      if (x_i_j < yy_i_j) {
+        res.matrix_at(i, j) = x_i_j;
+        ++res_num_non_redundant;
+        // Tighten context `yy' using the newly added constraint.
+        yy_i_j = x_i_j;
+        yy.reset_strongly_closed();
+        Variable var(i/2);
+        yy.incremental_strong_closure_assign(var);
+        if (target.contains(yy)) {
+          // Target reached: swap `x' and `res' if needed.
+          if (res_num_non_redundant < x_num_non_redundant) {
+            res.reset_strongly_closed();
+            x.m_swap(res);
+          }
+          return bool_result;
+        }
+      }
+    }
+  }
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_embed(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type new_dim = space_dim + m;
+  const bool was_zero_dim_univ = !marked_empty() && space_dim == 0;
+
+  // To embed an n-dimension space octagon in a (n + m)-dimension space,
+  // we just add `m' variables in the matrix of constraints.
+  matrix.grow(new_dim);
+  space_dim = new_dim;
+  // If `*this' was the zero-dim space universe octagon,
+  // then we can set the strongly closure flag.
+  if (was_zero_dim_univ)
+    set_strongly_closed();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_project(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type n = matrix.num_rows();
+
+  // To project an n-dimension space OS in a (space_dim + m)-dimension space,
+  // we just add `m' columns and rows in the matrix of constraints.
+  add_space_dimensions_and_embed(m);
+  // We insert 0 where it needs.
+  // Attention: now num_rows of matrix is update!
+  for (typename OR_Matrix<N>::row_iterator i = matrix.row_begin() + n,
+         matrix_row_end =  matrix.row_end(); i != matrix_row_end; i += 2) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i;
+    typename OR_Matrix<N>::row_reference_type x_ci = *(i + 1);
+    const dimension_type ind = i.index();
+    assign_r(x_i[ind + 1], 0, ROUND_NOT_NEEDED);
+    assign_r(x_ci[ind], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a octagon in a 0-dim space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - vars.size();
+
+  strong_closure_assign();
+  // When removing _all_ dimensions from an octagon,
+  // we obtain the zero-dimensional octagon.
+  if (new_space_dim == 0) {
+    matrix.shrink(0);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    space_dim = 0;
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // We consider each variable and we check if it has to be removed.
+  // If it has to be removed, we pass to the next one, then we will
+  // overwrite its representation in the matrix.
+  typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+  typedef typename std::iterator_traits<Elem_Iter>::difference_type diff_t;
+
+  dimension_type first = *vars.begin();
+  const dimension_type first_size = 2 * first * (first + 1);
+  Elem_Iter iter = matrix.element_begin() + static_cast<diff_t>(first_size);
+
+  for (dimension_type i = first + 1; i < space_dim; ++i) {
+    if (vars.count(i) == 0) {
+      typename OR_Matrix<N>::row_iterator row_iter = matrix.row_begin() + 2*i;
+      typename OR_Matrix<N>::row_reference_type row_ref = *row_iter;
+      typename OR_Matrix<N>::row_reference_type row_ref1 = *(++row_iter);
+      // Beware: first we shift the cells corresponding to the first
+      // row of variable(j), then we shift the cells corresponding to the
+      // second row. We recall that every variable is represented
+      // in the `matrix' by two rows and two columns.
+      for (dimension_type j = 0; j <= i; ++j)
+        if (vars.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref[2*j]);
+          assign_or_swap(*(iter++), row_ref[2*j + 1]);
+        }
+      for (dimension_type j = 0; j <= i; ++j)
+        if (vars.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref1[2*j]);
+          assign_or_swap(*(iter++), row_ref1[2*j + 1]);
+        }
+    }
+  }
+  // Update the space dimension.
+  matrix.shrink(new_space_dim);
+  space_dim = new_space_dim;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+Octagonal_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the octagon becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    strong_closure_assign();
+
+  // If the octagon is empty, then it is sufficient to adjust
+  // the space dimension of the octagon.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // We create a new matrix with the new space dimension.
+  OR_Matrix<N> x(new_space_dim);
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  row_iterator m_begin = x.row_begin();
+
+  for (row_iterator i_iter = matrix.row_begin(), i_end = matrix.row_end();
+       i_iter != i_end; i_iter += 2) {
+    dimension_type new_i;
+    dimension_type i = i_iter.index()/2;
+    // We copy and place in the position into `x' the only cells of
+    // the `matrix' that refer to both mapped variables,
+    // the variable `i' and `j'.
+    if (pfunc.maps(i, new_i)) {
+      row_reference r_i = *i_iter;
+      row_reference r_ii = *(i_iter + 1);
+      dimension_type double_new_i = 2*new_i;
+      row_iterator x_iter = m_begin + double_new_i;
+      row_reference x_i = *x_iter;
+      row_reference x_ii = *(x_iter + 1);
+      for (dimension_type j = 0; j <= i; ++j) {
+        dimension_type new_j;
+        // If also the second variable is mapped, we work.
+        if (pfunc.maps(j, new_j)) {
+          dimension_type dj = 2*j;
+          dimension_type double_new_j = 2*new_j;
+          // Mapped the constraints, exchanging the indexes.
+          // Attention: our matrix is pseudo-triangular.
+          // If new_j > new_i, we must consider, as rows, the rows of
+          // the variable new_j, and not of new_i ones.
+          if (new_i >= new_j) {
+            assign_or_swap(x_i[double_new_j], r_i[dj]);
+            assign_or_swap(x_ii[double_new_j], r_ii[dj]);
+            assign_or_swap(x_ii[double_new_j + 1], r_ii[dj + 1]);
+            assign_or_swap(x_i[double_new_j + 1], r_i[dj + 1]);
+          }
+          else {
+            row_iterator x_j_iter = m_begin + double_new_j;
+            row_reference x_j = *x_j_iter;
+            row_reference x_jj = *(x_j_iter + 1);
+            assign_or_swap(x_jj[double_new_i + 1], r_i[dj]);
+            assign_or_swap(x_jj[double_new_i], r_ii[dj]);
+            assign_or_swap(x_j[double_new_i + 1], r_i[dj + 1]);
+            assign_or_swap(x_j[double_new_i], r_ii[dj + 1]);
+          }
+
+        }
+      }
+    }
+  }
+
+  using std::swap;
+  swap(matrix, x);
+  space_dim = new_space_dim;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::intersection_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two octagons is empty, the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+  // If both octagons are zero-dimensional,then at this point
+  // they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two octagons we compare the constraints
+  // and we choose the less values.
+  bool changed = false;
+
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+    const N& y_elem = *j;
+    if (y_elem < elem) {
+      elem = y_elem;
+      changed = true;
+    }
+  }
+
+  // This method not preserve the closure.
+  if (changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                              Iterator first, Iterator last,
+                                              unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If both octagons are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  strong_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.strong_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    const N& y_elem = *j;
+    N& elem = *i;
+    if (y_elem < elem) {
+      Iterator k = std::lower_bound(first, last, elem);
+      if (k != last) {
+        if (elem < *k)
+          assign_r(elem, *k, ROUND_UP);
+      }
+      else
+        assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::get_limiting_octagon(const Constraint_System& cs,
+                       Octagonal_Shape& limiting_octagon) const {
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(cs_space_dim <= space_dim);
+
+  strong_closure_assign();
+  bool is_oct_changed = false;
+
+  // Allocate temporaries outside of the loop.
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  PPL_DIRTY_TEMP(N, d);
+
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not octagonal differences are ignored.
+    if (!Octagonal_Shape_Helper
+      ::extract_octagonal_difference(c, cs_space_dim, num_vars, i, j,
+                                     coeff, term))
+      continue;
+
+    typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+    typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+    typedef typename OR_Matrix<N>::row_iterator row_iterator;
+    typedef typename OR_Matrix<N>::row_reference_type row_reference;
+    Row_iterator m_begin = matrix.row_begin();
+    // Select the cell to be modified for the "<=" part of the constraint.
+    Row_iterator i_iter = m_begin + i;
+    Row_reference m_i = *i_iter;
+    OR_Matrix<N>& lo_mat = limiting_octagon.matrix;
+    row_iterator lo_iter = lo_mat.row_begin() + i;
+    row_reference lo_m_i = *lo_iter;
+    N& lo_m_i_j = lo_m_i[j];
+    if (coeff < 0)
+      neg_assign(coeff);
+    // Compute the bound for `m_i_j', rounding towards plus infinity.
+    div_round_up(d, term, coeff);
+    if (m_i[j] <= d)
+      if (c.is_inequality()) {
+        if (lo_m_i_j > d) {
+          lo_m_i_j = d;
+          is_oct_changed = true;
+        }
+        else {
+          // Select the right row of the cell.
+          if (i % 2 == 0) {
+            ++i_iter;
+            ++lo_iter;
+          }
+          else {
+            --i_iter;
+            --lo_iter;
+          }
+          Row_reference m_ci = *i_iter;
+          row_reference lo_m_ci = *lo_iter;
+          // Select the right column of the cell.
+          using namespace Implementation::Octagonal_Shapes;
+          dimension_type cj = coherent_index(j);
+          N& lo_m_ci_cj = lo_m_ci[cj];
+          neg_assign(term);
+          div_round_up(d, term, coeff);
+          if (m_ci[cj] <= d && lo_m_ci_cj > d) {
+            lo_m_ci_cj = d;
+            is_oct_changed = true;
+          }
+        }
+      }
+  }
+  // In general, adding a constraint does not preserve the strongly
+  // closure of the octagon.
+  if (is_oct_changed && limiting_octagon.marked_strongly_closed())
+    limiting_octagon.reset_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                    const Constraint_System& cs,
+                                    unsigned* tp) {
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::BHMZ05_widening_assign(const Octagonal_Shape& y,
+                                           unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  PPL_ASSERT(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  PPL_ASSERT(marked_strongly_closed() && y.marked_strongly_closed());
+  // Minimize `y'.
+  y.strong_reduction_assign();
+
+  // Extrapolate unstable bounds.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+       matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+    if (*j != elem)
+      assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                      const Constraint_System& cs,
+                                      unsigned* tp) {
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+  // The limited BHMZ05-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::CC76_narrowing_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+  // Assume `*this' is contained in or equal to `y'.
+  PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+  // If both octagons are zero-dimensional, since `*this' contains `y',
+  // we simply return '*this'.
+  if (space_dim == 0)
+    return;
+
+  y.strong_closure_assign();
+  // If `y' is empty, since `y' contains `*this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // We consider a constraint of `*this', if its value is `plus_infinity',
+  // we take the value of the corresponding constraint of `y'.
+  bool is_oct_changed = false;
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    if (!is_plus_infinity(*i)
+        && !is_plus_infinity(*j)
+        && *i != *j) {
+      *i = *j;
+      is_oct_changed = true;
+    }
+  }
+
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_v_pm_u_bounds(const dimension_type v_id,
+                       const dimension_type last_id,
+                       const Linear_Expression& sc_expr,
+                       Coefficient_traits::const_reference sc_denom,
+                       const N& ub_v) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(ub_v));
+
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_cv = matrix[n_v + 1];
+
+  // Speculatively allocate temporaries out of the loop.
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, minus_q);
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(mpq_class, lb_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+      u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+    const dimension_type u_id = u.variable().id();
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = *u;
+
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `v - u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_denom) {
+        // Here q >= 1: deducing `v - u <= ub_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_cu_u / 2.
+        div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+        N& m_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v] : m_cv[n_u + 1];
+        sub_assign_r(m_v_minus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u + 1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v - u' is
+          // computed as `ub_v - (q * ub_u + (1-q) * lb_u)',
+          // i.e., `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+          assign_r(minus_lb_u, m_u_cu, ROUND_NOT_NEEDED);
+          div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+          N& m_v_minus_u = (n_v < n_u) ? m_u[n_v] : m_cv[n_u + 1];
+          add_assign_r(m_v_minus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(expr_u < 0);
+      // If `expr_u' is negative, we can improve `v + u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_denom) {
+        // Here q <= -1: Deducing `v + u <= ub_v + lb_u'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_u_cu / 2.
+        div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+        N& m_v_plus_u = (n_v < n_u) ? matrix[n_u + 1][n_v] : m_cv[n_u];
+        sub_assign_r(m_v_plus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v + u' is
+          // computed as `ub_v + ((-q) * lb_u + (1 + q) * ub_u)',
+          // i.e., `ub_v + ub_u + (-q) * (lb_u - ub_u)'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(minus_q, minus_expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(minus_q, minus_q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(lb_u, lb_u, 1, ROUND_NOT_NEEDED);
+          neg_assign_r(lb_u, lb_u, ROUND_NOT_NEEDED);
+          // Compute `lb_u - ub_u'.
+          sub_assign_r(lb_u, lb_u, ub_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u + (-q) * (lb_u - ub_u)'.
+          add_mul_assign_r(ub_u, minus_q, lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `v + u <= ub_v + ((-q) * lb_u + (1 + q) * ub_u)'.
+          N& m_v_plus_u = (n_v < n_u) ? m_cu[n_v] : m_cv[n_u];
+          add_assign_r(m_v_plus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_minus_v_pm_u_bounds(const dimension_type v_id,
+                             const dimension_type last_id,
+                             const Linear_Expression& sc_expr,
+                             Coefficient_traits::const_reference sc_denom,
+                             const N& minus_lb_v) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_v = matrix[n_v];
+
+  // Speculatively allocate temporaries out of the loop.
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+      u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+    const dimension_type u_id = u.variable().id();
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = *u;
+
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `-v + u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_denom) {
+        // Here q >= 1: deducing `-v + u <= lb_u - lb_v',
+        // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_u_cu / 2.
+        div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+        N& m_u_minus_v = (n_v < n_u) ? matrix[n_u + 1][n_v + 1] : m_v[n_u];
+        sub_assign_r(m_u_minus_v, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `u - v' is
+          // computed as `(q * lb_u + (1-q) * ub_u) - lb_v',
+          // i.e., `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(minus_lb_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `u - v <= -lb_v - (q * lb_u + (1-q) * ub_u)'.
+          N& m_u_minus_v = (n_v < n_u) ? m_cu[n_v + 1] : m_v[n_u];
+          add_assign_r(m_u_minus_v, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(expr_u < 0);
+      // If `expr_u' is negative, we can improve `-v - u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_denom) {
+        // Here q <= -1: Deducing `-v - u <= -lb_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_cu_u / 2.
+        div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+        N& m_minus_v_minus_u = (n_v < n_u)
+          ? matrix[n_u][n_v + 1]
+          : m_v[n_u + 1];
+        sub_assign_r(m_minus_v_minus_u, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u + 1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `-v - u' is
+          // computed as `-lb_v - ((-q)*ub_u + (1 + q)*lb_u)',
+          // i.e., `minus_lb_v - lb_u + q*(ub_u - lb_u)'.
+          assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, m_u[n_u + 1], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `-lb_u + q*(ub_u - lb_u)'.
+          add_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `-v - u <= -lb_v - ((-q) * ub_u + (1 + q) * lb_u)'.
+          N& m_minus_v_minus_u = (n_v < n_u) ? m_u[n_v + 1] : m_v[n_u + 1];
+          add_assign_r(m_minus_v_minus_u, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_all_octagonal_constraints(const dimension_type v_id) {
+  PPL_ASSERT(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    assign_r(r_v[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_binary_octagonal_constraints(const dimension_type v_id) {
+  PPL_ASSERT(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type k = n_v; k-- > 0; ) {
+    assign_r(r_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type var_id = var.id();
+  if (space_dimension() < var_id + 1)
+    throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+  // Enforce strong closure for precision.
+  strong_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  forget_all_octagonal_constraints(var_id);
+  // Strong closure is preserved.
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Enforce strong closure for precision.
+  strong_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+    forget_all_octagonal_constraints(*vsi);
+  // Strong closure is preserved.
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  PPL_ASSERT(denominator != 0);
+  PPL_ASSERT(space_dim >= expr.space_dimension());
+  const dimension_type var_id = var.id();
+  PPL_ASSERT(var_id <= space_dim);
+  PPL_ASSERT(expr.coefficient(var) == 0);
+  PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+
+  // Variable index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*j + b, where `j != v';
+  // - If t == 2, then `expr' is of the general form.
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const dimension_type n_var = 2*var_id;
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  // Since we are only able to record octagonal differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.coefficient(Variable(w_id)) != denominator
+      && expr.coefficient(Variable(w_id)) != minus_denom)
+    t = 2;
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+      add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  else if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    const dimension_type n_w = 2*w_id;
+    switch (relsym) {
+    case EQUAL:
+      if (w_coeff == denominator)
+        // Add the new constraint `var - w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w, n_var, b, denominator);
+          add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+        }
+        else {
+          add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+          add_octagonal_constraint(n_var, n_w, b, minus_denom);
+        }
+      else
+        // Add the new constraint `var + w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+          add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+        }
+        else {
+          add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+          add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+        }
+      break;
+    case LESS_OR_EQUAL:
+      {
+        PPL_DIRTY_TEMP(N, d);
+        div_round_up(d, b, denominator);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraints `v - w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var, d);
+          else
+            add_octagonal_constraint(n_var + 1, n_w + 1, d);
+        }
+        else if (w_coeff == minus_denom) {
+          // Add the new constraints `v + w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w + 1, n_var, d);
+          else
+            add_octagonal_constraint(n_var + 1, n_w, d);
+        }
+        break;
+      }
+
+    case GREATER_OR_EQUAL:
+      {
+        PPL_DIRTY_TEMP(N, d);
+        div_round_up(d, b, minus_denom);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraint `v - w >= b/denominator',
+          // i.e.,  `-v + w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w + 1, n_var + 1, d);
+          else
+            add_octagonal_constraint(n_var, n_w, d);
+        }
+        else if (w_coeff == minus_denom) {
+          // Add the new constraints `v + w >= b/denominator',
+          // i.e.,  `-v - w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var + 1, d);
+          else
+            add_octagonal_constraint(n_var, n_w + 1, d);
+        }
+        break;
+      }
+
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  else {
+    // Here t == 2, so that
+    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+    const bool is_sc = (denominator > 0);
+    PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+    neg_assign(minus_b, b);
+    const Coefficient& sc_b = is_sc ? b : minus_b;
+    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+    const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+    const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+    // when `denominator' is negative. Do not use it unless you are sure
+    // it has been correctly assigned.
+    Linear_Expression minus_expr;
+    if (!is_sc)
+      minus_expr = -expr;
+    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+    PPL_DIRTY_TEMP(N, sum);
+    // Index of variable that is unbounded in `this'.
+    PPL_UNINITIALIZED(dimension_type, pinf_index);
+    // Number of unbounded variables found.
+    dimension_type pinf_count = 0;
+
+    switch (relsym) {
+    case EQUAL:
+      {
+        PPL_DIRTY_TEMP(N, neg_sum);
+        // Index of variable that is unbounded in `this'.
+        PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+        // Number of unbounded variables found.
+        dimension_type neg_pinf_count = 0;
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+        assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        PPL_DIRTY_TEMP(N, coeff_i);
+        PPL_DIRTY_TEMP(N, half);
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+        PPL_DIRTY_TEMP(N, minus_coeff_i);
+        // Note: indices above `w' can be disregarded, as they all have
+        // a zero coefficient in `sc_expr'.
+        for (Row_iterator m_iter = m_begin,
+               m_iter_end = m_begin + (2 * w_id + 2);
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_reference m_i = *m_iter;
+          ++m_iter;
+          Row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i > 0) {
+            assign_r(coeff_i, sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i + 1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+          else if (sign_i < 0) {
+            neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+            assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i + 1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+        }
+        // Return immediately if no approximation could be computed.
+        if (pinf_count > 1 && neg_pinf_count > 1) {
+          PPL_ASSERT(OK());
+          return;
+        }
+
+        // In the following, strong closure will be definitely lost.
+        reset_strongly_closed();
+
+        // Exploit the upper approximation, if possible.
+        if (pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_denom != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_denom' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_denom'
+            // and negating again the result.
+            PPL_DIRTY_TEMP(N, down_sc_denom);
+            assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+            neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+            div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+          }
+          // Add the upper bound constraint, if meaningful.
+          if (pinf_count == 0) {
+            // Add the constraint `v <= sum'.
+            PPL_DIRTY_TEMP(N, double_sum);
+            mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+            matrix[n_var + 1][n_var] = double_sum;
+            // Deduce constraints of the form `v +/- u', where `u != v'.
+            deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+          }
+          else
+            // Here `pinf_count == 1'.
+            if (pinf_index != var_id) {
+              const Coefficient& ppi
+                = sc_expr.coefficient(Variable(pinf_index));
+              if (ppi == sc_denom)
+                // Add the constraint `v - pinf_index <= sum'.
+                if (var_id < pinf_index)
+                  matrix[2*pinf_index][n_var] = sum;
+                else
+                  matrix[n_var + 1][2*pinf_index + 1] = sum;
+              else
+                if (ppi == minus_sc_denom) {
+                  // Add the constraint `v + pinf_index <= sum'.
+                  if (var_id < pinf_index)
+                    matrix[2*pinf_index + 1][n_var] = sum;
+                  else
+                    matrix[n_var + 1][2*pinf_index] = sum;
+                }
+            }
+        }
+
+        // Exploit the lower approximation, if possible.
+        if (neg_pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_denom != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_denom' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_denom'
+            // and negating again the result.
+            PPL_DIRTY_TEMP(N, down_sc_denom);
+            assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+            neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+            div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+          }
+          // Add the lower bound constraint, if meaningful.
+          if (neg_pinf_count == 0) {
+            // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+            PPL_DIRTY_TEMP(N, double_neg_sum);
+            mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+            matrix[n_var][n_var + 1] = double_neg_sum;
+            // Deduce constraints of the form `-v +/- u', where `u != v'.
+            deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom,
+                                       neg_sum);
+          }
+          else
+            // Here `neg_pinf_count == 1'.
+            if (neg_pinf_index != var_id) {
+              const Coefficient& npi
+                = sc_expr.coefficient(Variable(neg_pinf_index));
+              if (npi == sc_denom)
+                // Add the constraint `v - neg_pinf_index >= -neg_sum',
+                // i.e., `neg_pinf_index - v <= neg_sum'.
+                if (neg_pinf_index < var_id)
+                  matrix[n_var][2*neg_pinf_index] = neg_sum;
+                else
+                  matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+              else
+                if (npi == minus_sc_denom) {
+                  // Add the constraint `v + neg_pinf_index >= -neg_sum',
+                  // i.e., `-neg_pinf_index - v <= neg_sum'.
+                  if (neg_pinf_index < var_id)
+                    matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+                  else
+                    matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+                }
+            }
+        }
+        break;
+      }
+
+    case LESS_OR_EQUAL:
+      {
+        // Compute an upper approximation for `expr' into `sum',
+        // taking into account the sign of `denominator'.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        PPL_DIRTY_TEMP(N, coeff_i);
+        PPL_DIRTY_TEMP(N, approx_i);
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+        // Note: indices above `w_id' can be disregarded, as they all have
+        // a zero coefficient in `expr'.
+        for (row_iterator m_iter = m_begin,
+               m_iter_end = m_begin + (2 * w_id + 2);
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          row_reference m_i = *m_iter;
+          ++m_iter;
+          row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_denom != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_denom' is known to be
+          // positive, this amounts to rounding downwards, which is achieved
+          // by rounding upwards `minus_sc-denom' and negating again the result.
+          PPL_DIRTY_TEMP(N, down_sc_denom);
+          assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+          neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          PPL_DIRTY_TEMP(N, double_sum);
+          mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+          add_octagonal_constraint(n_var + 1, n_var, double_sum);
+          // Deduce constraints of the form `v +/- u', where `u != v'.
+          deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              add_octagonal_constraint(pinf_ind, n_var, sum);
+            else
+              add_octagonal_constraint(n_var + 1, pinf_ind + 1, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+              else
+                add_octagonal_constraint(n_var + 1, pinf_ind, sum);
+            }
+          }
+        }
+        break;
+      }
+
+    case GREATER_OR_EQUAL:
+      {
+        // Compute an upper approximation for `-sc_expr' into `sum'.
+        // Note: approximating `-sc_expr' from above and then negating the
+        // result is the same as approximating `sc_expr' from below.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `-sc_expr'.
+        PPL_DIRTY_TEMP(N, coeff_i);
+        PPL_DIRTY_TEMP(N, approx_i);
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+        for (row_iterator m_iter = m_begin,
+               m_iter_end = m_begin + (2 * w_id + 2);
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          row_reference m_i = *m_iter;
+          ++m_iter;
+          row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `-sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_denom != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_denom' is known to be
+          // positive, this amounts to rounding downwards, which is
+          // achieved by rounding upwards `minus_sc_denom' and
+          // negating again the result.
+          PPL_DIRTY_TEMP(N, down_sc_denom);
+          assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+          neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          PPL_DIRTY_TEMP(N, double_sum);
+          mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+          add_octagonal_constraint(n_var, n_var + 1, double_sum);
+          // Deduce constraints of the form `-v +/- u', where `u != v'.
+          deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom,
+                                     sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              add_octagonal_constraint(n_var, pinf_ind, sum);
+            else
+              add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                add_octagonal_constraint(n_var, pinf_ind + 1, sum);
+              else
+                add_octagonal_constraint(pinf_ind, n_var + 1, sum);
+            }
+          }
+        }
+        break;
+      }
+
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_image(const Variable var,
+                                 const Linear_Expression& expr,
+                                 Coefficient_traits::const_reference
+                                 denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_image(v, e, d)", var_id + 1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+  using std::swap;
+
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    // Add the constraint `var == b/denominator'.
+    add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+    add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_denom) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Here `expr' is of the form: +/- denominator * v + b.
+        const bool sign_symmetry = (w_coeff != denominator);
+        if (!sign_symmetry && b == 0)
+          // The transformation is the identity function.
+          return;
+        // Translate all the constraints on `var' adding or
+        // subtracting the value `b/denominator'.
+        PPL_DIRTY_TEMP(N, d);
+        div_round_up(d, b, denominator);
+        PPL_DIRTY_TEMP(N, minus_d);
+        div_round_up(minus_d, b, minus_denom);
+        if (sign_symmetry)
+          swap(d, minus_d);
+        const row_iterator m_begin = matrix.row_begin();
+        const row_iterator m_end = matrix.row_end();
+        row_iterator m_iter = m_begin + n_var;
+        row_reference m_v = *m_iter;
+        ++m_iter;
+        row_reference m_cv = *m_iter;
+        ++m_iter;
+        // NOTE: delay update of unary constraints on `var'.
+        for (dimension_type j = n_var; j-- > 0; ) {
+          N& m_v_j = m_v[j];
+          add_assign_r(m_v_j, m_v_j, minus_d, ROUND_UP);
+          N& m_cv_j = m_cv[j];
+          add_assign_r(m_cv_j, m_cv_j, d, ROUND_UP);
+          if (sign_symmetry)
+            swap(m_v_j, m_cv_j);
+        }
+        for ( ; m_iter != m_end; ++m_iter) {
+          row_reference m_i = *m_iter;
+          N& m_i_v = m_i[n_var];
+          add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+          N& m_i_cv = m_i[n_var + 1];
+          add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+          if (sign_symmetry)
+            swap(m_i_v, m_i_cv);
+        }
+        // Now update unary constraints on var.
+        mul_2exp_assign_r(d, d, 1, ROUND_UP);
+        N& m_cv_v = m_cv[n_var];
+        add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+        mul_2exp_assign_r(minus_d, minus_d, 1, ROUND_UP);
+        N& m_v_cv = m_v[n_var + 1];
+        add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+        if (sign_symmetry)
+          swap(m_cv_v, m_v_cv);
+        // Note: strong closure is preserved.
+      }
+      else {
+        // Here `w != var', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w = b/denominator'.
+        if (w_coeff == denominator) {
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w, n_var, b, denominator);
+            add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+            add_octagonal_constraint(n_var, n_w, b, minus_denom);
+          }
+        }
+        else {
+          // Add the new constraint `var + w = b/denominator'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+            add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+            add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+          }
+        }
+        incremental_strong_closure_assign(var);
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, pos_sum);
+  PPL_DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+  PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP(N, minus_coeff_i);
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  const row_iterator m_begin = matrix.row_begin();
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i + 1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i + 1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
+
+  // Remove all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      PPL_DIRTY_TEMP(N, double_pos_sum);
+      mul_2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_UP);
+      matrix[n_var + 1][n_var] = double_pos_sum;
+      // Deduce constraints of the form `v +/- u', where `u != v'.
+      deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != var_id) {
+        const Coefficient& ppi = sc_expr.coefficient(Variable(pos_pinf_index));
+        if (ppi == sc_denom)
+          // Add the constraint `v - pos_pinf_index <= pos_sum'.
+          if (var_id < pos_pinf_index)
+            matrix[2*pos_pinf_index][n_var] = pos_sum;
+          else
+            matrix[n_var + 1][2*pos_pinf_index + 1] = pos_sum;
+        else
+          if (ppi == minus_sc_denom) {
+            // Add the constraint `v + pos_pinf_index <= pos_sum'.
+            if (var_id < pos_pinf_index)
+              matrix[2*pos_pinf_index + 1][n_var] = pos_sum;
+            else
+              matrix[n_var + 1][2*pos_pinf_index] = pos_sum;
+          }
+      }
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      PPL_DIRTY_TEMP(N, double_neg_sum);
+      mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+      matrix[n_var][n_var + 1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_denom)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+        else
+          if (npi == minus_sc_denom) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+          }
+      }
+  }
+
+  incremental_strong_closure_assign(var);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::affine_form_image(const Variable var,
+                    const Linear_Form< Interval<T, Interval_Info> >& lf) {
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+    "Octagonal_Shape<T>::affine_form_image(Variable, Linear_Form):"
+    " T is not a floating point type.");
+
+  // Dimension-compatibility checks.
+  // The dimension of `lf' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(v, l)", "l", lf);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_form_image(v, l)", var.id() + 1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lf': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `lf', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `lf'.
+  for (dimension_type i = lf_space_dim; i-- > 0; )
+    if (lf.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  using std::swap;
+
+  const dimension_type n_var = 2*var_id;
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `lf':
+  // - If t == 0, then lf == [lb, ub];
+  // - If t == 1, then lf == a*w + [lb, ub], where `w' can be `v' or another
+  //   variable;
+  // - If t == 2, the `lf' is of the general form.
+
+  PPL_DIRTY_TEMP(N, b_ub);
+  assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, b_mlb);
+  neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+  if (t == 0) {
+    // Case 1: lf = [lb, ub].
+    forget_all_octagonal_constraints(var_id);
+    mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+    mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+    // Add the constraint `var >= lb && var <= ub'.
+    add_octagonal_constraint(n_var + 1, n_var, b_ub);
+    add_octagonal_constraint(n_var, n_var + 1, b_mlb);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // True if `b' is in [0, 0].
+  bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `lf'.
+    const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id));
+    // True if `w_coeff' is in [1, 1].
+    bool is_w_coeff_one = (w_coeff == 1);
+    // True if `w_coeff' is in [-1, -1].
+    bool is_w_coeff_minus_one = (w_coeff == -1);
+    if (is_w_coeff_one || is_w_coeff_minus_one) {
+      // Case 2: lf = w_coeff*w + b, with w_coeff = [+/-1, +/-1].
+      if (w_id == var_id) {
+        // Here lf = w_coeff*v + b, with w_coeff = [+/-1, +/-1].
+        if (is_w_coeff_one && is_b_zero)
+          // The transformation is the identity function.
+          return;
+        // Translate all the constraints on `var' by adding the value
+        // `b_ub' or subtracting the value `b_lb'.
+        if (is_w_coeff_minus_one)
+          swap(b_ub, b_mlb);
+        const row_iterator m_begin = matrix.row_begin();
+        const row_iterator m_end = matrix.row_end();
+        row_iterator m_iter = m_begin + n_var;
+        row_reference m_v = *m_iter;
+        ++m_iter;
+        row_reference m_cv = *m_iter;
+        ++m_iter;
+        // NOTE: delay update of unary constraints on `var'.
+        for (dimension_type j = n_var; j-- > 0; ) {
+          N& m_v_j = m_v[j];
+          add_assign_r(m_v_j, m_v_j, b_mlb, ROUND_UP);
+          N& m_cv_j = m_cv[j];
+          add_assign_r(m_cv_j, m_cv_j, b_ub, ROUND_UP);
+          if (is_w_coeff_minus_one)
+            swap(m_v_j, m_cv_j);
+        }
+        for ( ; m_iter != m_end; ++m_iter) {
+          row_reference m_i = *m_iter;
+          N& m_i_v = m_i[n_var];
+          add_assign_r(m_i_v, m_i_v, b_ub, ROUND_UP);
+          N& m_i_cv = m_i[n_var + 1];
+          add_assign_r(m_i_cv, m_i_cv, b_mlb, ROUND_UP);
+          if (is_w_coeff_minus_one)
+            swap(m_i_v, m_i_cv);
+        }
+        // Now update unary constraints on var.
+        mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+        N& m_cv_v = m_cv[n_var];
+        add_assign_r(m_cv_v, m_cv_v, b_ub, ROUND_UP);
+        mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+        N& m_v_cv = m_v[n_var + 1];
+        add_assign_r(m_v_cv, m_v_cv, b_mlb, ROUND_UP);
+        if (is_w_coeff_minus_one)
+          swap(m_cv_v, m_v_cv);
+        // Note: strong closure is preserved.
+      }
+      else {
+        // Here `w != var', so that `lf' is of the form
+        // [+/-1, +/-1] * w + b.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        const dimension_type n_w = 2*w_id;
+        if (is_w_coeff_one)
+          // Add the new constraints `var - w >= b_lb'
+          // `and var - w <= b_ub'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w, n_var, b_ub);
+            add_octagonal_constraint(n_w + 1, n_var + 1, b_mlb);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w + 1, b_ub);
+            add_octagonal_constraint(n_var, n_w, b_mlb);
+          }
+        else
+          // Add the new constraints `var + w >= b_lb'
+          // `and var + w <= b_ub'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w + 1, n_var, b_ub);
+            add_octagonal_constraint(n_w, n_var + 1, b_mlb);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w, b_ub);
+            add_octagonal_constraint(n_var, n_w + 1, b_mlb);
+          }
+        incremental_strong_closure_assign(var);
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+  // or t == 1, expr == i*w + b, but i <> [+/-1, +/-1].
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  Linear_Form<FP_Interval_Type> minus_lf(lf);
+  minus_lf.negate();
+
+  // Declare temporaries outside the loop.
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  row_iterator m_iter = matrix.row_begin();
+  m_iter += n_var;
+  row_reference var_ite = *m_iter;
+  ++m_iter;
+  row_reference var_cv_ite = *m_iter;
+  ++m_iter;
+  row_iterator m_end = matrix.row_end();
+
+  // Update binary constraints on var FIRST.
+  for (dimension_type curr_var = var_id,
+         n_curr_var = n_var - 2; curr_var-- > 0; ) {
+    Variable current(curr_var);
+    linear_form_upper_bound(lf + current, upper_bound);
+    assign_r(var_cv_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(var_cv_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(var_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf - current, upper_bound);
+    assign_r(var_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    n_curr_var -= 2;
+  }
+  for (dimension_type curr_var = var_id + 1; m_iter != m_end; ++m_iter) {
+    row_reference m_v_ite = *m_iter;
+    ++m_iter;
+    row_reference m_cv_ite = *m_iter;
+    Variable current(curr_var);
+    linear_form_upper_bound(lf + current, upper_bound);
+    assign_r(m_cv_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(m_v_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(m_cv_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf - current, upper_bound);
+    assign_r(m_v_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    ++curr_var;
+  }
+
+  // Finally, update unary constraints on var.
+  PPL_DIRTY_TEMP(N, lf_ub);
+  linear_form_upper_bound(lf, lf_ub);
+  PPL_DIRTY_TEMP(N, minus_lf_ub);
+  linear_form_upper_bound(minus_lf, minus_lf_ub);
+  mul_2exp_assign_r(lf_ub, lf_ub, 1, ROUND_UP);
+  assign_r(matrix[n_var + 1][n_var], lf_ub, ROUND_NOT_NEEDED);
+  mul_2exp_assign_r(minus_lf_ub, minus_lf_ub, 1, ROUND_UP);
+  assign_r(matrix[n_var][n_var + 1], minus_lf_ub, ROUND_NOT_NEEDED);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+                        N& result) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::linear_form_upper_bound:"
+                     " T not a floating point type.");
+
+  const dimension_type lf_space_dimension = lf.space_dimension();
+  PPL_ASSERT(lf_space_dimension <= space_dim);
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  PPL_DIRTY_TEMP(N, curr_lb);
+  PPL_DIRTY_TEMP(N, curr_ub);
+  PPL_DIRTY_TEMP(N, curr_var_ub);
+  PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+  PPL_DIRTY_TEMP(N, first_comparison_term);
+  PPL_DIRTY_TEMP(N, second_comparison_term);
+
+  PPL_DIRTY_TEMP(N, negator);
+
+  assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+  for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+       ++curr_var) {
+    const FP_Interval_Type& curr_coefficient =
+                            lf.coefficient(Variable(curr_var));
+    assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (curr_lb != 0 || curr_ub != 0) {
+      assign_r(curr_var_ub, matrix[n_var + 1][n_var], ROUND_NOT_NEEDED);
+      div_2exp_assign_r(curr_var_ub, curr_var_ub, 1, ROUND_UP);
+      neg_assign_r(curr_minus_var_ub, matrix[n_var][n_var + 1],
+                   ROUND_NOT_NEEDED);
+      div_2exp_assign_r(curr_minus_var_ub, curr_minus_var_ub, 1, ROUND_DOWN);
+      // Optimize the most common case: curr = +/-[1, 1].
+      if (curr_lb == 1 && curr_ub == 1) {
+        add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+                     ROUND_UP);
+      }
+      else if (curr_lb == -1 && curr_ub == -1) {
+        neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+                     ROUND_NOT_NEEDED);
+        add_assign_r(result, result, negator, ROUND_UP);
+      }
+      else {
+        // Next addend will be the maximum of four quantities.
+        assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+                         ROUND_UP);
+        add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+
+        add_assign_r(result, result, first_comparison_term, ROUND_UP);
+      }
+    }
+
+    n_var += 2;
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::
+interval_coefficient_upper_bound(const N& var_ub, const N& minus_var_ub,
+                                 const N& int_ub, const N& int_lb,
+                                 N& result) {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::interval_coefficient_upper_bound:"
+                     " T not a floating point type.");
+
+  // NOTE: we store the first comparison term directly into result.
+  PPL_DIRTY_TEMP(N, second_comparison_term);
+  PPL_DIRTY_TEMP(N, third_comparison_term);
+  PPL_DIRTY_TEMP(N, fourth_comparison_term);
+
+  assign_r(result, 0, ROUND_NOT_NEEDED);
+  assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+  assign_r(third_comparison_term, 0, ROUND_NOT_NEEDED);
+  assign_r(fourth_comparison_term, 0, ROUND_NOT_NEEDED);
+
+  add_mul_assign_r(result, var_ub, int_ub, ROUND_UP);
+  add_mul_assign_r(second_comparison_term, minus_var_ub, int_ub, ROUND_UP);
+  add_mul_assign_r(third_comparison_term, var_ub, int_lb, ROUND_UP);
+  add_mul_assign_r(fourth_comparison_term, minus_var_ub, int_lb, ROUND_UP);
+
+  assign_r(result, std::max(result, second_comparison_term), ROUND_NOT_NEEDED);
+  assign_r(result, std::max(result, third_comparison_term), ROUND_NOT_NEEDED);
+  assign_r(result, std::max(result, fourth_comparison_term), ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_preimage(const Variable var,
+                                    const Linear_Expression& expr,
+                                    Coefficient_traits::const_reference
+                                    denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var_id + 1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == -denominator) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, w_coeff);
+      }
+      else {
+        // `expr == w_coeff*w + b', where `w != var'.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        PPL_ASSERT(OK());
+      }
+      return;
+    }
+  }
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& coeff_v = expr.coefficient(var);
+  if (coeff_v != 0) {
+    if (coeff_v > 0) {
+      // The transformation is invertible.
+      Linear_Expression inverse = ((coeff_v + denominator)*var);
+      inverse -= expr;
+      affine_image(var, inverse, coeff_v);
+    }
+    else {
+      // The transformation is invertible.
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_v);
+      neg_assign(minus_coeff_v, coeff_v);
+      Linear_Expression inverse = ((minus_coeff_v - denominator)*var);
+      inverse += expr;
+      affine_image(var, inverse, minus_coeff_v);
+    }
+  }
+  else {
+    // The transformation is not invertible: all constraints on `var' are lost.
+    forget_all_octagonal_constraints(var_id);
+    PPL_ASSERT(OK());
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression&  expr ,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", "e",
+                                 expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var_id + 1);
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr = b.
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    // Strong closure is lost.
+    reset_strongly_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= n/denominator',
+      // i.e., `-var <= -b/denominator'.
+      add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_denom) {
+      // Case 2: expr == w_coeff*w + b, with w_coeff == +/- denominator.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        {
+          PPL_DIRTY_TEMP(N, d);
+          div_round_up(d, b, denominator);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate all the constraints of the form `v - w <= cost'
+              // into the constraint `v - w <= cost + b/denominator';
+              // forget each constraint `w - v <= cost1'.
+              row_iterator m_iter = m_begin + n_var;
+              row_reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var + 1];
+              ++m_iter;
+              row_reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ; m_iter != m_end; ++m_iter) {
+                row_reference m_i = *m_iter;
+                N& m_i_v = m_i[n_var];
+                add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+                assign_r(m_i[n_var + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                assign_r(m_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_cv[k], m_cv[k], d, ROUND_UP);
+              }
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_v_cv = matrix[n_var][n_var + 1];
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(matrix[n_var + 1][n_var], m_v_cv, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is the form
+            // +/- denominator*w + b.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            if (w_coeff == denominator) {
+              // Add the new constraint `v - w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+            }
+            else {
+              // Add the new constraint `v + w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+            }
+          }
+          break;
+        }
+
+      case GREATER_OR_EQUAL:
+        {
+          PPL_DIRTY_TEMP(N, d);
+          div_round_up(d, b, minus_denom);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate each constraint `w - v <= cost'
+              // into the constraint `w - v <= cost - b/denominator';
+              // forget each constraint `v - w <= cost1'.
+              row_iterator m_iter = m_begin + n_var;
+              row_reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var + 1];
+              ++m_iter;
+              row_reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ; m_iter != m_end; ++m_iter) {
+                row_reference m_i = *m_iter;
+                assign_r(m_i[n_var], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_i[n_var + 1], m_i[n_var + 1], d, ROUND_UP);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                add_assign_r(m_v[k], m_v[k], d, ROUND_UP);
+                assign_r(m_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(m_v_cv, m_v_cv, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_cv_v = matrix[n_var + 1][n_var];
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(matrix[n_var][n_var + 1], m_cv_v, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is of the form
+            // +/-denominator * w + b, with `w != v'.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            // We have got an expression of the following form:
+            // var1 + n, with `var1' != `var'.
+            // We remove all constraints of the form `var (+/- var1) >= const'
+            // and we add the new constraint `var +/- var1 >= n/denominator'.
+            if (w_coeff == denominator) {
+              // Add the new constraint `var - w >= b/denominator',
+              // i.e., `w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+              else
+                add_octagonal_constraint(n_var, n_w, b, minus_denom);
+            }
+            else {
+              // Add the new constraint `var + w >= b/denominator',
+              // i.e., `-w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+              else
+                add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+            }
+          }
+          break;
+        }
+
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->matrix'.
+  PPL_UNINITIALIZED(dimension_type, pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    {
+      // Compute an upper approximation for `sc_expr' into `sum'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      // Approximate the homogeneous part of `sc_expr'.
+      PPL_DIRTY_TEMP(N, coeff_i);
+      PPL_DIRTY_TEMP(N, approx_i);
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+      // Remove all constraints on `v'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_denom != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_denom' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_denom' and negating again the result.
+        PPL_DIRTY_TEMP(N, down_sc_denom);
+        assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+        neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+        // Add the constraint `v <= pos_sum'.
+        PPL_DIRTY_TEMP(N, double_sum);
+        mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+        matrix[n_var + 1][n_var] = double_sum;
+        // Deduce constraints of the form `v +/- u', where `u != v'.
+        deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              matrix[2*pinf_index][n_var] = sum;
+            else
+              matrix[n_var + 1][2*pinf_index + 1] = sum;
+          }
+          else {
+            if (pi == minus_denom) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                matrix[2*pinf_index + 1][n_var] = sum;
+              else
+                matrix[n_var + 1][2*pinf_index] = sum;
+            }
+          }
+        }
+      break;
+    }
+
+  case GREATER_OR_EQUAL:
+    {
+      // Compute an upper approximation for `-sc_expr' into `sum'.
+      // Note: approximating `-sc_expr' from above and then negating the
+      // result is the same as approximating `sc_expr' from below.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, minus_sc_b, ROUND_UP);
+      PPL_DIRTY_TEMP(N, coeff_i);
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+      PPL_DIRTY_TEMP(N, approx_i);
+      // Approximate the homogeneous part of `-sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `-sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Remove all constraints on `var'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_denom != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_denom' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_denom' and negating again the result.
+        PPL_DIRTY_TEMP(N, down_sc_denom);
+        assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+        neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+        // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+        PPL_DIRTY_TEMP(N, double_sum);
+        mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+        matrix[n_var][n_var + 1] = double_sum;
+        // Deduce constraints of the form `-v +/- u', where `u != v'.
+        deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              matrix[n_var][2*pinf_index] = sum;
+            else
+              matrix[2*pinf_index + 1][n_var + 1] = sum;
+          }
+          else {
+            if (pi == minus_denom) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                matrix[n_var][2*pinf_index + 1] = sum;
+              else
+                matrix[2*pinf_index][n_var + 1] = sum;
+            }
+          }
+        }
+      break;
+    }
+
+  default:
+    // We already dealt with the other cases.
+    PPL_UNREACHABLE;
+    break;
+  }
+  incremental_strong_closure_assign(var);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                             const Relation_Symbol relsym,
+                                             const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    --j_lhs;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is an octagonal difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs' or
+    // `rhs == a*v + a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not an octagonal difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, denom);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not an octagonal constraint.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // an octagonal difference (since it has 3 variables at least).
+      // Thus, the method refine_no_check() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= new_var);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_image(const Variable var,
+                                         const Linear_Expression& lb_expr,
+                                         const Linear_Expression& ub_expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 var_id + 1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lb_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `lb_expr', if any.
+  dimension_type w_id = lb_expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!lb_expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = lb_expr.inhomogeneous_term();
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `lb_expr':
+  // - If t == 0, then lb_expr == b, with `b' a constant;
+  // - If t == 1, then lb_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `lb_expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: lb_expr == b.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    // Add the constraint `var >= b/denominator'.
+    add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `lb_expr'.
+    const Coefficient& w_coeff = lb_expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_denom) {
+      // Case 2: lb_expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Here `var' occurs in `lb_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var(space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `lb_expr'.
+        // Here `lb_expr' is of the form: +/- denominator * v + b.
+        affine_image(new_var, lb_expr, denominator);
+        // Enforce the strong closure for precision.
+        strong_closure_assign();
+        PPL_ASSERT(!marked_empty());
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Now apply the affine lower bound, as recorded in `new_var'
+        refine_no_check(var >= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(space_dim-1);
+        return;
+      }
+      else {
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Here `w != var', so that `lb_expr' is of the form
+        // +/-denominator * w + b.
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w >= b/denominator'.
+        if (w_coeff == denominator)
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+          else
+            add_octagonal_constraint(n_var, n_w, b, minus_denom);
+        else {
+          // Add the new constraint `var + w >= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+          else
+            add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+        }
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -lb_expr;
+  const Linear_Expression& sc_expr = is_sc ? lb_expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP(N, minus_coeff_i);
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i + 1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
+
+  // Apply the affine upper bound.
+  generalized_affine_image(var,
+                           LESS_OR_EQUAL,
+                           ub_expr,
+                           denominator);
+
+  // Return immediately if no approximation could be computed.
+  if (neg_pinf_count > 1) {
+    return;
+  }
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      PPL_DIRTY_TEMP(N, double_neg_sum);
+      mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+      matrix[n_var][n_var + 1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_denom)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+        else
+          if (npi == minus_sc_denom) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+          }
+      }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference
+                              denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var_id + 1);
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // The image of an empty octagon is empty too.
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+    neg_assign(inverse_denom, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the Octagonal_Shape by adding the constraint induced
+  // by the affine relation.
+  refine(var, relsym, expr, denominator);
+
+  // If the shrunk OS is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    j_lhs--;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // in this case, preimage and image happen to be the same.
+  if (t_lhs == 0) {
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, denom);
+  }
+
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+
+      // Any image of an empty octagon is empty.
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not an octagonal difference.
+      affine_image(new_var, lhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == v + b_rhs' or `rhs == -v + b_rhs' or `rhs == b_rhs',
+      // one of the following constraints will be added, because they
+      // are octagonal differences.
+      // Else the following constraints are NOT octagonal differences,
+      // so the method refine_no_check() will ignore them.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(new_var <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_preimage(const Variable var,
+                                            const Linear_Expression& lb_expr,
+                                            const Linear_Expression& ub_expr,
+                                            Coefficient_traits::const_reference
+                                            denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 var_id + 1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
+  }
+
+  const Coefficient& expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (expr_v + denominator)*var;
+  PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+  neg_assign(inverse_denom, expr_v);
+  affine_image(new_var, lb_inverse, inverse_denom);
+  strong_closure_assign();
+  PPL_ASSERT(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(inverse_denom))
+    refine_no_check(var >= new_var) ;
+  else
+    refine_no_check(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim-1);
+}
+
+template <typename T>
+Constraint_System
+Octagonal_Shape<T>::constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  row_iterator m_begin = matrix.row_begin();
+  row_iterator m_end = matrix.row_end();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(a);
+  PPL_DIRTY_TEMP_COEFFICIENT(b);
+
+  // Go through all the unary constraints in `matrix'.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable x(i/2);
+    const N& c_i_ii = (*i_iter)[i + 1];
+    ++i_iter;
+    const N& c_ii_i = (*i_iter)[i];
+    ++i_iter;
+    // Go through unary constraints.
+    if (is_additive_inverse(c_i_ii, c_ii_i)) {
+      // We have a unary equality constraint.
+      numer_denom(c_ii_i, b, a);
+      a *= 2;
+      cs.insert(a*x == b);
+    }
+    else {
+      // We have 0, 1 or 2 inequality constraints.
+      if (!is_plus_infinity(c_i_ii)) {
+        numer_denom(c_i_ii, b, a);
+        a *= 2;
+        cs.insert(-a*x <= b);
+      }
+      if (!is_plus_infinity(c_ii_i)) {
+        numer_denom(c_ii_i, b, a);
+        a *= 2;
+        cs.insert(a*x <= b);
+      }
+    }
+  }
+  //  Go through all the binary constraints in `matrix'.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    row_reference r_i = *i_iter;
+    ++i_iter;
+    row_reference r_ii = *i_iter;
+    ++i_iter;
+    const Variable y(i/2);
+    for (dimension_type j = 0; j < i; j += 2) {
+      const N& c_i_j = r_i[j];
+      const N& c_ii_jj = r_ii[j + 1];
+      const Variable x(j/2);
+      if (is_additive_inverse(c_ii_jj, c_i_j)) {
+        // We have an equality constraint of the form a*x - a*y = b.
+        numer_denom(c_i_j, b, a);
+        cs.insert(a*x - a*y == b);
+      }
+      else {
+        // We have 0, 1 or 2 inequality constraints.
+        if (!is_plus_infinity(c_i_j)) {
+          numer_denom(c_i_j, b, a);
+          cs.insert(a*x - a*y <= b);
+        }
+        if (!is_plus_infinity(c_ii_jj)) {
+          numer_denom(c_ii_jj, b, a);
+          cs.insert(a*y - a*x <= b);
+        }
+      }
+
+      const N& c_ii_j = r_ii[j];
+      const N& c_i_jj = r_i[j + 1];
+      if (is_additive_inverse(c_i_jj, c_ii_j)) {
+        // We have an equality constraint of the form a*x + a*y = b.
+        numer_denom(c_ii_j, b, a);
+        cs.insert(a*x + a*y == b);
+      }
+      else {
+        // We have 0, 1 or 2 inequality constraints.
+        if (!is_plus_infinity(c_i_jj)) {
+          numer_denom(c_i_jj, b, a);
+          cs.insert(-a*x - a*y <= b);
+        }
+        if (!is_plus_infinity(c_ii_j)) {
+          numer_denom(c_ii_j, b, a);
+          cs.insert(a*x + a*y <= b);
+        }
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  // `var' should be one of the dimensions of the vector space.
+  const dimension_type var_id = var.id();
+  if (var_id + 1 > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", var_id + 1);
+
+  // The space dimension of the resulting octagon should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_invalid_argument("expand_dimension(v, m)",
+                           "adding m new space dimensions exceeds "
+                           "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Keep track of the dimension before adding the new ones.
+  const dimension_type old_num_rows = matrix.num_rows();
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  Row_iterator v_iter = m_begin + n_var;
+  Row_reference m_v = *v_iter;
+  Row_reference m_cv = *(v_iter + 1);
+
+  for (row_iterator i_iter = m_begin + old_num_rows; i_iter != m_end;
+       i_iter += 2) {
+    row_reference m_i = *i_iter;
+    row_reference m_ci = *(i_iter + 1);
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = i + 1;
+    m_i[ci] = m_v[n_var + 1];
+    m_ci[i] = m_cv[n_var];
+    for (dimension_type j = 0; j < n_var; ++j) {
+      m_i[j] = m_v[j];
+      m_ci[j] = m_cv[j];
+    }
+    for (dimension_type j = n_var + 2; j < old_num_rows; ++j) {
+      row_iterator j_iter = m_begin + j;
+      row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+      m_i[j] = m_cj[n_var + 1];
+      m_ci[j] = m_cj[n_var];
+    }
+  }
+  // In general, adding a constraint does not preserve the strong closure
+  // of the octagon.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+                                          Variable dest) {
+  // `dest' should be one of the dimensions of the octagon.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the octagon.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  // Recompute the elements of the row and the column corresponding
+  // to variable `dest' by taking the join of their value with the
+  // value of the corresponding elements in the row and column of the
+  // variable `vars'.
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+
+  strong_closure_assign();
+  const dimension_type n_rows = matrix.num_rows();
+  const dimension_type n_dest = 2*dest.id();
+  row_iterator v_iter = m_begin + n_dest;
+  row_reference m_v = *v_iter;
+  row_reference m_cv = *(v_iter + 1);
+  for (Variables_Set::const_iterator i = vars.begin(),
+         vs_end = vars.end(); i != vs_end; ++i) {
+    const dimension_type tbf_id = *i;
+    const dimension_type tbf_var = 2*tbf_id;
+    row_iterator tbf_iter = m_begin + tbf_var;
+    row_reference m_tbf = *tbf_iter;
+    row_reference m_ctbf = *(tbf_iter + 1);
+    max_assign(m_v[n_dest + 1], m_tbf[tbf_var + 1]);
+    max_assign(m_cv[n_dest], m_ctbf[tbf_var]);
+
+    const dimension_type min_id = std::min(n_dest, tbf_var);
+    const dimension_type max_id = std::max(n_dest, tbf_var);
+
+    using namespace Implementation::Octagonal_Shapes;
+    for (dimension_type j = 0; j < min_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      max_assign(m_v[j], m_tbf[j]);
+      max_assign(m_cv[j], m_ctbf[j]);
+      max_assign(m_cv[cj], m_ctbf[cj]);
+      max_assign(m_v[cj], m_tbf[cj]);
+    }
+    for (dimension_type j = min_id + 2; j < max_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      row_iterator j_iter = m_begin + j;
+      row_reference m_j = *j_iter;
+      row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+      if (n_dest == min_id) {
+        max_assign(m_cj[n_dest + 1], m_tbf[j]);
+        max_assign(m_cj[n_dest], m_ctbf[j]);
+        max_assign(m_j[n_dest], m_ctbf[cj]);
+        max_assign(m_j[n_dest + 1], m_tbf[cj]);
+      }
+      else {
+        max_assign(m_v[j], m_cj[tbf_var + 1]);
+        max_assign(m_cv[j], m_cj[tbf_var]);
+        max_assign(m_cv[cj], m_j[tbf_var]);
+        max_assign(m_v[cj], m_j[tbf_var + 1]);
+      }
+    }
+    for (dimension_type j = max_id + 2; j < n_rows; ++j) {
+      row_iterator j_iter = m_begin + j;
+      row_reference m_j = *j_iter;
+      row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+      max_assign(m_cj[n_dest + 1], m_cj[tbf_var + 1]);
+      max_assign(m_cj[n_dest], m_cj[tbf_var]);
+      max_assign(m_j[n_dest], m_j[tbf_var]);
+      max_assign(m_j[n_dest + 1], m_j[tbf_var + 1]);
+    }
+  }
+  remove_space_dimensions(vars);
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+  // FIXME, CHECKME: what about inexact computations?
+
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const Octagonal_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+  PPL_ASSERT(x.marked_strongly_closed());
+  PPL_ASSERT(y.marked_strongly_closed());
+  // Pre-compute the upper bound of `x' and `y'.
+  Octagonal_Shape<T> ub(x);
+  ub.upper_bound_assign(y);
+
+  // Compute redundancy information for x and y.
+  // TODO: provide a nicer data structure for redundancy.
+  std::vector<Bit_Row> x_non_red;
+  x.non_redundant_matrix_entries(x_non_red);
+  std::vector<Bit_Row> y_non_red;
+  y.non_redundant_matrix_entries(y_non_red);
+
+  PPL_DIRTY_TEMP(N, lhs);
+  PPL_DIRTY_TEMP(N, lhs_copy);
+  PPL_DIRTY_TEMP(N, rhs);
+  PPL_DIRTY_TEMP(N, temp_zero);
+  assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+  const dimension_type n_rows = x.matrix.num_rows();
+  const row_iterator x_m_begin = x.matrix.row_begin();
+  const row_iterator y_m_begin = y.matrix.row_begin();
+  const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    const Bit_Row& x_non_red_i = x_non_red[i];
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type ci = coherent_index(i);
+    const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+    row_reference x_i = *(x_m_begin + i);
+    row_reference y_i = *(y_m_begin + i);
+    row_reference ub_i = *(ub_m_begin + i);
+    const N& ub_i_ci = ub_i[ci];
+    for (dimension_type j = row_size_i; j-- > 0; ) {
+      // Check redundancy of x_i_j.
+      if (!x_non_red_i[j])
+        continue;
+      const N& x_i_j = x_i[j];
+      // Check 1st condition in BHZ09 theorem.
+      if (x_i_j >= y_i[j])
+        continue;
+      const dimension_type cj = coherent_index(j);
+      const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+      row_reference ub_cj = *(ub_m_begin + cj);
+      const N& ub_cj_j = ub_cj[j];
+      for (dimension_type k = 0; k < n_rows; ++k) {
+        const Bit_Row& y_non_red_k = y_non_red[k];
+        const dimension_type ck = coherent_index(k);
+        const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+        row_reference x_k = *(x_m_begin + k);
+        row_reference y_k = *(y_m_begin + k);
+        row_reference ub_k = *(ub_m_begin + k);
+        const N& ub_k_ck = ub_k[ck];
+        // Be careful: for each index h, the diagonal element m[h][h]
+        // is (by convention) +infty in our implementation; however,
+        // BHZ09 theorem assumes that it is equal to 0.
+        const N& ub_k_j
+          = (k == j)
+          ? temp_zero
+          : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+        const N& ub_i_ck
+          = (i == ck)
+          ? temp_zero
+          : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+        for (dimension_type ell = row_size_k; ell-- > 0; ) {
+          // Check redundancy of y_k_ell.
+          if (!y_non_red_k[ell])
+            continue;
+          const N& y_k_ell = y_k[ell];
+          // Check 2nd condition in BHZ09 theorem.
+          if (y_k_ell >= x_k[ell])
+            continue;
+          const dimension_type cell = coherent_index(ell);
+          row_reference ub_cell = *(ub_m_begin + cell);
+          const N& ub_i_ell
+            = (i == ell)
+            ? temp_zero
+            : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+          const N& ub_cj_ell
+            = (cj == ell)
+            ? temp_zero
+            : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+          // Check 3rd condition in BHZ09 theorem.
+          add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+          add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 4th condition in BHZ09 theorem.
+          add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 5th condition in BHZ09 theorem.
+          assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+          add_assign_r(lhs, lhs_copy, x_i_j, ROUND_UP);
+          add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_cj_j, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 6th condition in BHZ09 theorem.
+          add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_i_ci, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 7th condition of BHZ09 theorem.
+          add_assign_r(lhs, lhs_copy, y_k_ell, ROUND_UP);
+          add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_k_ck, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 8th (last) condition in BHZ09 theorem.
+          add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_cell[ell], ROUND_UP);
+          if (lhs < rhs)
+            // All 8 conditions are satisfied:
+            // upper bound is not exact.
+            return false;
+        }
+      }
+    }
+  }
+
+  // The upper bound of x and y is indeed exact.
+  m_swap(ub);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>
+::integer_upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+  PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+                         "Octagonal_Shape<T>::"
+                         "integer_upper_bound_assign_if_exact(y):"
+                         " T in not an integer datatype.");
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const Octagonal_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+
+  // If `x' or `y' is (known to) contain no integral point,
+  // then the integer upper bound can be computed exactly by tight closure.
+  if (x.marked_empty()) {
+    *this = y;
+    tight_closure_assign();
+    return true;
+  }
+  else if (y.marked_empty()) {
+    tight_closure_assign();
+    return true;
+  }
+  else if (x.is_empty() || x.tight_coherence_would_make_empty()) {
+    *this = y;
+    tight_closure_assign();
+    return true;
+  }
+  else if (y.is_empty() || y.tight_coherence_would_make_empty()) {
+    tight_closure_assign();
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty (and Z-consistent).
+  PPL_ASSERT(x.marked_strongly_closed());
+  PPL_ASSERT(y.marked_strongly_closed());
+  // Pre-compute the integer upper bound of `x' and `y':
+  // have to take copies, since tight closure might modify the rational shape.
+  Octagonal_Shape<T> tx(x);
+  tx.tight_closure_assign();
+  Octagonal_Shape<T> ty(y);
+  ty.tight_closure_assign();
+  Octagonal_Shape<T> ub(tx);
+  ub.upper_bound_assign(ty);
+
+  // Compute redundancy information for tx and ty.
+  // TODO: provide a nicer data structure for redundancy.
+  // NOTE: there is no need to identify all redundancies, since this is
+  // an optimization; hence we reuse the strong-reduction helper methods.
+  std::vector<Bit_Row> tx_non_red;
+  tx.non_redundant_matrix_entries(tx_non_red);
+  std::vector<Bit_Row> ty_non_red;
+  ty.non_redundant_matrix_entries(ty_non_red);
+
+  PPL_DIRTY_TEMP(N, lhs_i_j);
+  PPL_DIRTY_TEMP(N, lhs_k_ell);
+  PPL_DIRTY_TEMP(N, lhs);
+  PPL_DIRTY_TEMP(N, lhs_copy);
+  PPL_DIRTY_TEMP(N, rhs);
+  PPL_DIRTY_TEMP(N, temp_zero);
+  assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, temp_one);
+  assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, temp_two);
+  assign_r(temp_two, 2, ROUND_NOT_NEEDED);
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+  const dimension_type n_rows = tx.matrix.num_rows();
+  const row_iterator tx_m_begin = tx.matrix.row_begin();
+  const row_iterator ty_m_begin = ty.matrix.row_begin();
+  const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    const Bit_Row& tx_non_red_i = tx_non_red[i];
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type ci = coherent_index(i);
+    const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+    row_reference tx_i = *(tx_m_begin + i);
+    row_reference ty_i = *(ty_m_begin + i);
+    row_reference ub_i = *(ub_m_begin + i);
+    const N& ub_i_ci = ub_i[ci];
+    for (dimension_type j = row_size_i; j-- > 0; ) {
+      // Check redundancy of tx_i_j.
+      if (!tx_non_red_i[j])
+        continue;
+      const N& tx_i_j = tx_i[j];
+      const dimension_type cj = coherent_index(j);
+      const N& eps_i_j = (i == cj) ? temp_two : temp_one;
+      // Check condition 1a in BHZ09 Theorem 6.8.
+      add_assign_r(lhs_i_j, tx_i_j, eps_i_j, ROUND_NOT_NEEDED);
+      if (lhs_i_j > ty_i[j])
+        continue;
+      const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+      row_reference ub_cj = *(ub_m_begin + cj);
+      const N& ub_cj_j = ub_cj[j];
+      for (dimension_type k = 0; k < n_rows; ++k) {
+        const Bit_Row& ty_non_red_k = ty_non_red[k];
+        const dimension_type ck = coherent_index(k);
+        const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+        row_reference tx_k = *(tx_m_begin + k);
+        row_reference ty_k = *(ty_m_begin + k);
+        row_reference ub_k = *(ub_m_begin + k);
+        const N& ub_k_ck = ub_k[ck];
+        // Be careful: for each index h, the diagonal element m[h][h]
+        // is (by convention) +infty in our implementation; however,
+        // BHZ09 theorem assumes that it is equal to 0.
+        const N& ub_k_j
+          = (k == j)
+          ? temp_zero
+          : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+        const N& ub_i_ck
+          = (i == ck)
+          ? temp_zero
+          : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+        for (dimension_type ell = row_size_k; ell-- > 0; ) {
+          // Check redundancy of y_k_ell.
+          if (!ty_non_red_k[ell])
+            continue;
+          const N& ty_k_ell = ty_k[ell];
+          const dimension_type cell = coherent_index(ell);
+          const N& eps_k_ell = (k == cell) ? temp_two : temp_one;
+          // Check condition 1b in BHZ09 Theorem 6.8.
+          add_assign_r(lhs_k_ell, ty_k_ell, eps_k_ell, ROUND_NOT_NEEDED);
+          if (lhs_k_ell > tx_k[ell])
+            continue;
+          row_reference ub_cell = *(ub_m_begin + cell);
+          const N& ub_i_ell
+            = (i == ell)
+            ? temp_zero
+            : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+          const N& ub_cj_ell
+            = (cj == ell)
+            ? temp_zero
+            : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+          // Check condition 2a in BHZ09 Theorem 6.8.
+          add_assign_r(lhs, lhs_i_j, lhs_k_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 2b in BHZ09 Theorem 6.8.
+          add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 3a in BHZ09 Theorem 6.8.
+          assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+          add_assign_r(lhs, lhs, lhs_i_j, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_cj_j, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 3b in BHZ09 Theorem 6.8.
+          add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_i_ci, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 4a in BHZ09 Theorem 6.8.
+          add_assign_r(lhs, lhs_copy, lhs_k_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_k_ck, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 4b in BHZ09 Theorem 6.8.
+          add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_cell[ell], ROUND_NOT_NEEDED);
+          if (lhs <= rhs)
+            // All 8 conditions are satisfied:
+            // integer upper bound is not exact.
+            return false;
+        }
+      }
+    }
+  }
+
+  // The upper bound of x and y is indeed exact.
+  m_swap(ub);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+  if (std::numeric_limits<T>::is_integer)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  strong_closure_assign();
+  if (space_dim == 0 || marked_empty())
+    return;
+
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         i_end = matrix.element_end(); i != i_end; ++i)
+    drop_some_non_integer_points_helper(*i);
+
+  // Unary constraints should have an even integer boundary.
+  PPL_DIRTY_TEMP(N, temp_one);
+  assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+  for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+    const dimension_type ci = i + 1;
+    N& mat_i_ci = matrix[i][ci];
+    if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci)) {
+      sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+      reset_strongly_closed();
+    }
+    N& mat_ci_i = matrix[ci][i];
+    if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i)) {
+      sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+      reset_strongly_closed();
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::drop_some_non_integer_points(const Variables_Set& vars,
+                               Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+    return;
+
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+
+  PPL_DIRTY_TEMP(N, temp_one);
+  assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+  const Variables_Set::const_iterator v_begin = vars.begin();
+  const Variables_Set::const_iterator v_end = vars.end();
+  PPL_ASSERT(v_begin != v_end);
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+    const dimension_type i = 2 * (*v_i);
+    const dimension_type ci = i + 1;
+    row_reference m_i = matrix[i];
+    row_reference m_ci = matrix[ci];
+
+    // Unary constraints: should be even integers.
+    N& m_i_ci = m_i[ci];
+    if (!is_plus_infinity(m_i_ci)) {
+      drop_some_non_integer_points_helper(m_i_ci);
+      if (!is_even(m_i_ci)) {
+        sub_assign_r(m_i_ci, m_i_ci, temp_one, ROUND_UP);
+        reset_strongly_closed();
+      }
+    }
+    N& m_ci_i = m_ci[i];
+    if (!is_plus_infinity(m_ci_i)) {
+      drop_some_non_integer_points_helper(m_ci_i);
+      if (!is_even(m_ci_i)) {
+        sub_assign_r(m_ci_i, m_ci_i, temp_one, ROUND_UP);
+        reset_strongly_closed();
+      }
+    }
+
+    // Binary constraints (note: only consider j < i).
+    for (Variables_Set::const_iterator v_j = v_begin; v_j != v_i; ++v_j) {
+      const dimension_type j = 2 * (*v_j);
+      const dimension_type cj = j + 1;
+      drop_some_non_integer_points_helper(m_i[j]);
+      drop_some_non_integer_points_helper(m_i[cj]);
+      drop_some_non_integer_points_helper(m_ci[j]);
+      drop_some_non_integer_points_helper(m_ci[cj]);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+void
+Octagonal_Shape<T>
+::export_interval_constraints(U& dest) const {
+  if (space_dim > dest.space_dimension())
+    throw std::invalid_argument(
+               "Octagonal_Shape<T>::export_interval_constraints");
+
+  strong_closure_assign();
+
+  if (marked_empty()) {
+    dest.set_empty();
+    return;
+  }
+
+  PPL_DIRTY_TEMP(N, lb);
+  PPL_DIRTY_TEMP(N, ub);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    const dimension_type ii = 2*i;
+    const dimension_type cii = ii + 1;
+
+    // Set the upper bound.
+    const N& twice_ub = matrix[cii][ii];
+    if (!is_plus_infinity(twice_ub)) {
+      assign_r(ub, twice_ub, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(ub, ub, 1, ROUND_UP);
+      // FIXME: passing a raw value may not be general enough.
+      if (!dest.restrict_upper(i, ub.raw_value()))
+        return;
+    }
+
+    // Set the lower bound.
+    const N& twice_lb = matrix[ii][cii];
+    if (!is_plus_infinity(twice_lb)) {
+      assign_r(lb, twice_lb, ROUND_NOT_NEEDED);
+      neg_assign_r(lb, lb, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(lb, lb, 1, ROUND_DOWN);
+      // FIXME: passing a raw value may not be general enough.
+      if (!dest.restrict_lower(i, lb.raw_value()))
+        return;
+    }
+  }
+
+}
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape<T>& oct) {
+  // Handle special cases first.
+  if (oct.marked_empty()) {
+    s << "false";
+    return s;
+  }
+  if (oct.is_universe()) {
+    s << "true";
+    return s;
+  }
+
+  typedef typename Octagonal_Shape<T>::coefficient_type N;
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  // Records whether or not we still have to print the first constraint.
+  bool first = true;
+
+  row_iterator m_begin = oct.matrix.row_begin();
+  row_iterator m_end = oct.matrix.row_end();
+
+  // Temporaries.
+  PPL_DIRTY_TEMP(N, negation);
+  PPL_DIRTY_TEMP(N, half);
+  // Go through all the unary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i(i/2);
+    const N& c_i_ii = (*i_iter)[i + 1];
+    ++i_iter;
+    const N& c_ii_i = (*i_iter)[i];
+    ++i_iter;
+    // Check whether or not it is an equality constraint.
+    if (is_additive_inverse(c_i_ii, c_ii_i)) {
+      // It is an equality.
+      PPL_ASSERT(!is_plus_infinity(c_i_ii) && !is_plus_infinity(c_ii_i));
+      if (first)
+        first = false;
+      else
+        s << ", ";
+      // If the value bound can NOT be divided by 2 exactly,
+      // then we output the constraint `2*v_i = bound'.
+      if (div_2exp_assign_r(half, c_ii_i, 1,
+                            ROUND_UP | ROUND_STRICT_RELATION)
+          == V_EQ)
+        s << v_i << " = " << half;
+      else
+        s << "2*" << v_i << " = " << c_ii_i;
+    }
+    else {
+      // We will print unary non-strict inequalities, if any.
+      if (!is_plus_infinity(c_i_ii)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        neg_assign_r(negation, c_i_ii, ROUND_NOT_NEEDED);
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i >= negation'.
+        if (div_2exp_assign_r(half, negation, 1,
+                              ROUND_UP | ROUND_STRICT_RELATION)
+            == V_EQ)
+          s << v_i << " >= " << half;
+        else
+          s << "2*" << v_i << " >= " << negation;
+      }
+      if (!is_plus_infinity(c_ii_i)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i <= bound'.
+        if (div_2exp_assign_r(half, c_ii_i, 1,
+                              ROUND_UP | ROUND_STRICT_RELATION)
+            == V_EQ)
+          s << v_i << " <= " << half;
+        else
+          s << "2*" << v_i << " <= " << c_ii_i;
+      }
+    }
+  }
+
+  // Go through all the binary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i(i/2);
+    row_reference r_i = *i_iter;
+    ++i_iter;
+    row_reference r_ii = *i_iter;
+    ++i_iter;
+
+    for (dimension_type j = 0; j < i; j += 2) {
+      const Variable v_j(j/2);
+      // Print binary differences.
+      const N& c_ii_jj = r_ii[j + 1];
+      const N& c_i_j = r_i[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(c_ii_jj, c_i_j)) {
+        // It is an equality.
+        PPL_ASSERT(!is_plus_infinity(c_i_j) && !is_plus_infinity(c_ii_jj));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        if (sgn(c_i_j) >= 0)
+          s << v_j << " - " << v_i << " = " << c_i_j;
+        else
+          s << v_i << " - " << v_j << " = " << c_ii_jj;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(c_i_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(c_i_j) >= 0)
+            s << v_j << " - " << v_i << " <= " << c_i_j;
+          else {
+            neg_assign_r(negation, c_i_j, ROUND_DOWN);
+            s << v_i << " - " << v_j << " >= " << negation;
+          }
+        }
+        if (!is_plus_infinity(c_ii_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(c_ii_jj) >= 0)
+            s << v_i << " - " << v_j << " <= " << c_ii_jj;
+          else {
+            neg_assign_r(negation, c_ii_jj, ROUND_DOWN);
+            s << v_j << " - " << v_i << " >= " << negation;
+          }
+        }
+      }
+      // Print binary sums.
+      const N& c_i_jj = r_i[j + 1];
+      const N& c_ii_j = r_ii[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(c_i_jj, c_ii_j)) {
+        // It is an equality.
+        PPL_ASSERT(!is_plus_infinity(c_i_jj) && !is_plus_infinity(c_ii_j));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        s << v_j << " + " << v_i << " = " << c_ii_j;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(c_i_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          neg_assign_r(negation, c_i_jj, ROUND_DOWN);
+          s << v_j << " + " << v_i << " >= " << negation;
+        }
+        if (!is_plus_infinity(c_ii_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          s << v_j << " + " << v_i << " <= " << c_ii_j;
+        }
+      }
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::ascii_dump(std::ostream& s) const {
+  s << "space_dim "
+    << space_dim
+    << "\n";
+  status.ascii_dump(s);
+  s << "\n";
+  matrix.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, Octagonal_Shape<T>)
+
+template <typename T>
+bool
+Octagonal_Shape<T>::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!matrix.ascii_load(s))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+memory_size_type
+Octagonal_Shape<T>::external_memory_in_bytes() const {
+  return matrix.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::OK() const {
+  // Check whether the matrix is well-formed.
+  if (!matrix.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // All empty octagons are OK.
+  if (marked_empty())
+    return true;
+
+  // 0-dim universe octagon is OK.
+  if (space_dim == 0)
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (is_minus_infinity(x_i[j])) {
+#ifndef NDEBUG
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        std::cerr << "Octagonal_Shape::"
+                  << "matrix[" << i.index() << "][" << j << "] = "
+                  << x_i[j] << "!"
+                  << std::endl;
+#endif
+        return false;
+      }
+  }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         m_end = matrix.row_end(); i != m_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type r = *i;
+    const N& m_i_i = r[i.index()];
+    if (!is_plus_infinity(m_i_i)) {
+#ifndef NDEBUG
+      const dimension_type j = i.index();
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "Octagonal_Shape::matrix[" << j << "][" << j << "] = "
+                << m_i_i << "!  (+inf was expected.)\n";
+#endif
+      return false;
+    }
+  }
+
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise strong closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the closure information is legal.
+    if (marked_strongly_closed()) {
+      Octagonal_Shape x = *this;
+      x.reset_strongly_closed();
+      x.strong_closure_assign();
+      if (x.matrix != matrix) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is marked as strongly closed "
+                  << "but it is not!\n";
+#endif
+        return false;
+      }
+    }
+
+    // A closed octagon must be strong-coherent.
+    if (marked_strongly_closed())
+      if (!is_strong_coherent()) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is not strong-coherent!\n";
+#endif
+        return false;
+      }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const Octagonal_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_expression_too_complex(const char* method,
+                                                 const Linear_Expression& le) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << le << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const char* le_name,
+                               const Linear_Expression& le) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << le_name << "->space_dimension() == "
+    << le.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template <typename C>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const char* lf_name,
+                               const Linear_Form<C>& lf) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << lf_name << "->space_dimension() == "
+    << lf.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_invalid_argument(const char* method,
+                                           const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Octagonal_Shape_templates_hh)
diff --git a/src/Octagonal_Shape_types.hh b/src/Octagonal_Shape_types.hh
new file mode 100644
index 0000000..594433f
--- /dev/null
+++ b/src/Octagonal_Shape_types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Octagonal_Shape_types_hh
+#define PPL_Octagonal_Shape_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Octagonal_Shape;
+
+class Octagonal_Shape_Helper;
+
+}
+
+#endif // !defined(PPL_Octagonal_Shape_types_hh)
diff --git a/src/Og_Status_idefs.hh b/src/Og_Status_idefs.hh
new file mode 100644
index 0000000..c4bd280
--- /dev/null
+++ b/src/Og_Status_idefs.hh
@@ -0,0 +1,112 @@
+/* Octagonal_Shape<T>::Status class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Og_Status_idefs_hh
+#define PPL_Og_Status_idefs_hh 1
+
+#ifndef PPL_IN_Octagonal_Shape_CLASS
+#error "Do not include Og_Status_idefs.hh directly; use Octagonal_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Octagonal_Shape<T> object.
+/*!
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>strongly closed</EM>: the Octagonal_Shape object is strongly
+    closed, so that all the constraints are as tight as possible.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_strongly_closed() const;
+  void reset_strongly_closed();
+  void set_strongly_closed();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Writes to \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+  void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV   = 0U;
+  static const flags_t EMPTY           = 1U << 0;
+  static const flags_t STRONGLY_CLOSED = 1U << 1;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+
+};
+
+#endif // !defined(PPL_Og_Status_idefs_hh)
diff --git a/src/Og_Status_inlines.hh b/src/Og_Status_inlines.hh
new file mode 100644
index 0000000..228f79f
--- /dev/null
+++ b/src/Og_Status_inlines.hh
@@ -0,0 +1,225 @@
+/* Octagonal_Shape<T>::Status class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Og_Status_inlines_hh
+#define PPL_Og_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_strongly_closed() const {
+  return test_any(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_strongly_closed() {
+  reset(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_strongly_closed() {
+  set(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string strong_closed = "SC";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Octagonal_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ
+    << separator
+    << (test_empty() ? yes : no) << empty
+    << separator
+    << separator
+    << (test_strongly_closed() ? yes : no) << strong_closed
+    << separator;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Octagonal_Shapes;
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, strong_closed, positive))
+    return false;
+  if (positive)
+    set_strongly_closed();
+  else
+    reset_strongly_closed();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Og_Status_inlines_hh)
diff --git a/src/Opposite_Floating_Point_Expression_defs.hh b/src/Opposite_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..f853769
--- /dev/null
+++ b/src/Opposite_Floating_Point_Expression_defs.hh
@@ -0,0 +1,193 @@
+/* Declarations for the Opposite_Floating_Point_Expression class and
+   its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Opposite_Floating_Point_Expression_defs_hh
+#define PPL_Opposite_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Opposite_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Opposite_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Opposite Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of opposite floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ be an interval linear form and
+  let \f$\adlf\f$ be a sound unary operator on linear forms such that:
+
+  \f[
+  \adlf
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  =
+  \left(\adifp i\right)
+  + \sum_{v \in \cV}\left(\adifp i_{v} \right)v,
+  \f]
+
+  Given a floating point expression \f$\ominus e\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \adlf
+  \left(
+  \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+  \right).
+  \f]
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+    Alias for the Linear_Form<FP_Interval_Type> from
+    Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+    Alias for the std::map<dimension_type, FP_Interval_Type> from
+    Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+    Alias for the std::map<dimension_type, FP_Linear_Form> from
+    Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+    Alias for the FP_Interval_Type::boundary_type from
+    Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+    Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with one parameter: builds the opposite floating point
+    expression \f$\ominus\f$ \p op.
+  */
+  explicit Opposite_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op);
+
+  //! Destructor.
+  ~Opposite_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expression represented
+    by \p operand MUST have an associated value in \p int_store.
+    If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Opposite_Floating_Point_Expression& y);
+
+private:
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Opposite_Floating_Point_Expression(
+                          const Opposite_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Opposite_Floating_Point_Expression& operator=(
+                          const Opposite_Floating_Point_Expression& y);
+
+  //! Pointer to the operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* operand;
+
+}; // class Opposite_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Opposite_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Opposite_Floating_Point_Expression_defs_hh)
diff --git a/src/Opposite_Floating_Point_Expression_inlines.hh b/src/Opposite_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..2e62b56
--- /dev/null
+++ b/src/Opposite_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,79 @@
+/* Opposite_Floating_Point_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Opposite_Floating_Point_Expression_inlines_hh
+#define PPL_Opposite_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Opposite_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op)
+  : operand(op)
+{
+  assert(op != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Opposite_Floating_Point_Expression() {
+  delete operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Opposite_Floating_Point_Expression& y) {
+  using std::swap;
+  swap(operand, y.operand);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!operand->linearize(int_store, lf_store, result))
+    return false;
+
+  result.negate();
+  return true;
+}
+
+/*! \relates Opposite_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Opposite_Floating_Point_Expression_inlines_hh)
diff --git a/src/Opposite_Floating_Point_Expression_types.hh b/src/Opposite_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..fd8f3a4
--- /dev/null
+++ b/src/Opposite_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Opposite_Floating_Point_Expression_types_hh
+#define PPL_Opposite_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Opposite_Floating_Point_Expression_types_hh)
diff --git a/src/PIP_Problem.cc b/src/PIP_Problem.cc
new file mode 100644
index 0000000..e02c103
--- /dev/null
+++ b/src/PIP_Problem.cc
@@ -0,0 +1,741 @@
+/* PIP_Problem class implementation: non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "PIP_Problem_defs.hh"
+#include "PIP_Tree_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+/*! \relates Parma_Polyhedra_Library::PIP_Problem */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const PIP_Problem& pip) {
+  s << "Space dimension: " << pip.space_dimension();
+  s << "\nConstraints:";
+  for (PIP_Problem::const_iterator i = pip.constraints_begin(),
+         i_end = pip.constraints_end(); i != i_end; ++i)
+    s << "\n" << *i;
+  s << "\nProblem parameters: " << pip.parameter_space_dimensions();
+  if (pip.get_big_parameter_dimension() == not_a_dimension())
+    s << "\nNo big-parameter set.\n";
+  else
+    s << "\nBig-parameter: " << Variable(pip.get_big_parameter_dimension());
+  s << "\n";
+  return s;
+}
+
+PPL::PIP_Problem::PIP_Problem(const dimension_type dim)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    status(PARTIALLY_SATISFIABLE),
+    current_solution(0),
+    input_cs(),
+    first_pending_constraint(0),
+    parameters(),
+    initial_context(),
+    big_parameter_dimension(not_a_dimension()) {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::PIP_Problem::PIP_Problem(dim):\n"
+                            "dim exceeds the maximum allowed "
+                            "space dimension.");
+  control_parameters_init();
+  PPL_ASSERT(OK());
+}
+
+PPL::PIP_Problem::PIP_Problem(const PIP_Problem& y)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    status(y.status),
+    current_solution(0),
+    input_cs(y.input_cs),
+    first_pending_constraint(y.first_pending_constraint),
+    parameters(y.parameters),
+    initial_context(y.initial_context),
+    big_parameter_dimension(y.big_parameter_dimension) {
+  if (y.current_solution != 0) {
+    current_solution = y.current_solution->clone();
+    current_solution->set_owner(this);
+  }
+  control_parameters_copy(y);
+  PPL_ASSERT(OK());
+}
+
+PPL::PIP_Problem::~PIP_Problem() {
+  delete current_solution;
+}
+
+void
+PPL::PIP_Problem::control_parameters_init() {
+  control_parameters[CUTTING_STRATEGY] = CUTTING_STRATEGY_FIRST;
+  control_parameters[PIVOT_ROW_STRATEGY] = PIVOT_ROW_STRATEGY_FIRST;
+}
+
+void
+PPL::PIP_Problem::control_parameters_copy(const PIP_Problem& y) {
+  for (dimension_type i = CONTROL_PARAMETER_NAME_SIZE; i-- > 0; )
+    control_parameters[i] = y.control_parameters[i];
+}
+
+PPL::PIP_Problem_Status
+PPL::PIP_Problem::solve() const {
+  switch (status) {
+
+  case UNSATISFIABLE:
+    PPL_ASSERT(OK());
+    return UNFEASIBLE_PIP_PROBLEM;
+
+  case OPTIMIZED:
+    PPL_ASSERT(OK());
+    return OPTIMIZED_PIP_PROBLEM;
+
+  case PARTIALLY_SATISFIABLE:
+    {
+      PIP_Problem& x = const_cast<PIP_Problem&>(*this);
+      // Allocate PIP solution tree root, if needed.
+      if (current_solution == 0)
+        x.current_solution = new PIP_Solution_Node(this);
+
+      // Properly resize context matrix.
+      const dimension_type new_num_cols = parameters.size() + 1;
+      const dimension_type old_num_cols = initial_context.num_columns();
+      if (old_num_cols < new_num_cols)
+        x.initial_context.add_zero_columns(new_num_cols - old_num_cols);
+
+      // Computed once for all (to be used inside loop).
+      const Variables_Set::const_iterator param_begin = parameters.begin();
+      const Variables_Set::const_iterator param_end = parameters.end();
+
+      // This flag will be set if we insert a pending constraint
+      // in the initial context.
+      bool check_feasible_context = false;
+
+      // Go through all pending constraints.
+      for (Constraint_Sequence::const_iterator
+             cs_i = nth_iter(input_cs, first_pending_constraint),
+             cs_end = input_cs.end(); cs_i != cs_end; ++cs_i) {
+        const Constraint& c = *cs_i;
+        const dimension_type c_space_dim = c.space_dimension();
+        PPL_ASSERT(external_space_dim >= c_space_dim);
+
+        // Constraints having a non-zero variable coefficient
+        // should not be inserted in context.
+        if (!c.expression().all_zeroes_except(parameters, 1, c_space_dim + 1))
+          continue;
+
+        check_feasible_context = true;
+
+        x.initial_context.add_zero_rows(1);
+
+        Row& row = x.initial_context[x.initial_context.num_rows()-1];
+
+        {
+          Row::iterator itr = row.end();
+
+          if (c.inhomogeneous_term() != 0) {
+            itr = row.insert(0, c.inhomogeneous_term());
+            // Adjust inhomogeneous term if strict.
+            if (c.is_strict_inequality())
+              --(*itr);
+          }
+          else {
+            // Adjust inhomogeneous term if strict.
+            if (c.is_strict_inequality())
+              itr = row.insert(0, -1);
+          }
+          dimension_type i = 1;
+
+          // TODO: This loop may be optimized more, if needed.
+          // If the size of param_end is expected to be greater than the
+          // number of nonzeroes of c in most cases, then this implementation
+          // can't be optimized further.
+          // itr may still be end(), but it can still be used as hint.
+          for (Variables_Set::const_iterator
+               pi = param_begin; pi != param_end; ++pi, ++i) {
+            if (*pi < c_space_dim) {
+              Coefficient_traits::const_reference coeff_pi
+                = c.coefficient(Variable(*pi));
+              if (coeff_pi != 0)
+                itr = row.insert(itr, i, coeff_pi);
+            }
+            else
+              break;
+          }
+        }
+
+        // If it is an equality, also insert its negation.
+        if (c.is_equality()) {
+          x.initial_context.add_zero_rows(1);
+
+          // The reference `row' has been invalidated.
+
+          Row& last_row = x.initial_context[x.initial_context.num_rows()-1];
+
+          last_row = x.initial_context[x.initial_context.num_rows()-2];
+
+          for (Row::iterator i = last_row.begin(),
+                 i_end = last_row.end(); i != i_end; ++i)
+            neg_assign(*i);
+        }
+      }
+
+      if (check_feasible_context) {
+        // Check for feasibility of initial context.
+        Matrix<Row> ctx_copy(initial_context);
+        if (!PIP_Solution_Node::compatibility_check(ctx_copy)) {
+          // Problem found to be unfeasible.
+          delete x.current_solution;
+          x.current_solution = 0;
+          x.status = UNSATISFIABLE;
+          PPL_ASSERT(OK());
+          return UNFEASIBLE_PIP_PROBLEM;
+        }
+      }
+
+      // Update tableau and mark constraints as no longer pending.
+      x.current_solution->update_tableau(*this,
+                                         external_space_dim,
+                                         first_pending_constraint,
+                                         input_cs,
+                                         parameters);
+      x.internal_space_dim = external_space_dim;
+      x.first_pending_constraint = input_cs.size();
+
+      // Actually solve problem.
+      x.current_solution = x.current_solution->solve(*this,
+                                                     check_feasible_context,
+                                                     initial_context,
+                                                     parameters,
+                                                     external_space_dim,
+                                                     /*indent_level=*/ 0);
+      // Update problem status.
+      x.status = (x.current_solution != 0) ? OPTIMIZED : UNSATISFIABLE;
+
+      PPL_ASSERT(OK());
+      return (x.current_solution != 0)
+        ? OPTIMIZED_PIP_PROBLEM
+        : UNFEASIBLE_PIP_PROBLEM;
+    } // End of handler for PARTIALLY_SATISFIABLE case.
+
+  } // End of switch.
+
+  // We should not be here!
+  PPL_UNREACHABLE;
+  return UNFEASIBLE_PIP_PROBLEM;
+}
+
+PPL::PIP_Tree
+PPL::PIP_Problem::solution() const {
+  if (status == PARTIALLY_SATISFIABLE)
+    solve();
+  return current_solution;
+}
+
+PPL::PIP_Tree
+PPL::PIP_Problem::optimizing_solution() const {
+  if (status == PARTIALLY_SATISFIABLE)
+    solve();
+  return current_solution;
+}
+
+bool
+PPL::PIP_Problem::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  if (external_space_dim < internal_space_dim) {
+#ifndef NDEBUG
+      cerr << "The internal space dimension of the PIP_Problem is "
+           << "greater than its external space dimension."
+           << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+
+  // Constraint system should be space dimension compatible.
+  const dimension_type input_cs_num_rows = input_cs.size();
+  for (dimension_type i = input_cs_num_rows; i-- > 0; ) {
+    if (input_cs[i].space_dimension() > external_space_dim) {
+#ifndef NDEBUG
+      cerr << "The space dimension of the PIP_Problem is smaller than "
+           << "the space dimension of one of its constraints."
+           << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+  }
+
+  // Test validity of control parameter values.
+  Control_Parameter_Value strategy = control_parameters[CUTTING_STRATEGY];
+  if (strategy != CUTTING_STRATEGY_FIRST
+      && strategy != CUTTING_STRATEGY_DEEPEST
+      && strategy != CUTTING_STRATEGY_ALL) {
+#ifndef NDEBUG
+    cerr << "Invalid value for the CUTTING_STRATEGY control parameter."
+         << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  strategy = control_parameters[PIVOT_ROW_STRATEGY];
+  if (strategy < PIVOT_ROW_STRATEGY_FIRST
+      || strategy > PIVOT_ROW_STRATEGY_MAX_COLUMN) {
+#ifndef NDEBUG
+    cerr << "Invalid value for the PIVOT_ROW_STRATEGY control parameter."
+        << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (big_parameter_dimension != not_a_dimension()
+      && parameters.count(big_parameter_dimension) == 0) {
+#ifndef NDEBUG
+    cerr << "The big parameter is set, but it is not a parameter." << endl;
+    ascii_dump(cerr);
+#endif
+    return false;
+  }
+
+  if (!parameters.OK())
+    return false;
+  if (!initial_context.OK())
+    return false;
+
+  if (current_solution != 0) {
+    // Check well formedness of the solution tree.
+    if (!current_solution->OK()) {
+#ifndef NDEBUG
+      cerr << "The computed solution tree is broken.\n";
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+    // Check that all nodes in the solution tree belong to *this.
+    if (!current_solution->check_ownership(this)) {
+#ifndef NDEBUG
+      cerr << "There are nodes in the solution tree "
+           << "that are not owned by *this.\n";
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+void
+PPL::PIP_Problem::ascii_dump(std::ostream& s) const {
+  using namespace IO_Operators;
+  s << "\nexternal_space_dim: " << external_space_dim << "\n";
+  s << "\ninternal_space_dim: " << internal_space_dim << "\n";
+
+  const dimension_type input_cs_size = input_cs.size();
+
+  s << "\ninput_cs( " << input_cs_size << " )\n";
+  for (dimension_type i = 0; i < input_cs_size; ++i)
+    input_cs[i].ascii_dump(s);
+
+  s << "\nfirst_pending_constraint: " <<  first_pending_constraint << "\n";
+
+  s << "\nstatus: ";
+  switch (status) {
+  case UNSATISFIABLE:
+    s << "UNSATISFIABLE";
+    break;
+  case OPTIMIZED:
+    s << "OPTIMIZED";
+    break;
+  case PARTIALLY_SATISFIABLE:
+    s << "PARTIALLY_SATISFIABLE";
+    break;
+  }
+  s << "\n";
+
+  s << "\nparameters";
+  parameters.ascii_dump(s);
+
+  s << "\ninitial_context\n";
+  initial_context.ascii_dump(s);
+
+  s << "\ncontrol_parameters\n";
+  for (dimension_type i = 0; i < CONTROL_PARAMETER_NAME_SIZE; ++i) {
+    const Control_Parameter_Value value = control_parameters[i];
+    switch (value) {
+    case CUTTING_STRATEGY_FIRST:
+      s << "CUTTING_STRATEGY_FIRST";
+      break;
+    case CUTTING_STRATEGY_DEEPEST:
+      s << "CUTTING_STRATEGY_DEEPEST";
+      break;
+    case CUTTING_STRATEGY_ALL:
+      s << "CUTTING_STRATEGY_ALL";
+      break;
+    case PIVOT_ROW_STRATEGY_FIRST:
+      s << "PIVOT_ROW_STRATEGY_FIRST";
+      break;
+    case PIVOT_ROW_STRATEGY_MAX_COLUMN:
+      s << "PIVOT_ROW_STRATEGY_MAX_COLUMN";
+      break;
+    default:
+      s << "Invalid control parameter value";
+    }
+    s << "\n";
+  }
+
+  s << "\nbig_parameter_dimension: " << big_parameter_dimension << "\n";
+
+  s << "\ncurrent_solution: ";
+  if (current_solution == 0)
+    s << "BOTTOM\n";
+  else if (const PIP_Decision_Node* const dec
+             = current_solution->as_decision()) {
+    s << "DECISION\n";
+    dec->ascii_dump(s);
+  }
+  else {
+    const PIP_Solution_Node* const sol = current_solution->as_solution();
+    PPL_ASSERT(sol != 0);
+    s << "SOLUTION\n";
+    sol->ascii_dump(s);
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(PIP_Problem)
+
+bool
+PPL::PIP_Problem::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "external_space_dim:")
+    return false;
+
+  if (!(s >> external_space_dim))
+    return false;
+
+  if (!(s >> str) || str != "internal_space_dim:")
+    return false;
+
+  if (!(s >> internal_space_dim))
+    return false;
+
+  if (!(s >> str) || str != "input_cs(")
+    return false;
+
+  dimension_type input_cs_size;
+
+  if (!(s >> input_cs_size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  Constraint c(Constraint::zero_dim_positivity());
+  for (dimension_type i = 0; i < input_cs_size; ++i) {
+    if (!c.ascii_load(s))
+      return false;
+    input_cs.push_back(c);
+  }
+
+  if (!(s >> str) || str != "first_pending_constraint:")
+    return false;
+
+  if (!(s >> first_pending_constraint))
+    return false;
+
+  if (!(s >> str) || str != "status:")
+    return false;
+
+  if (!(s >> str))
+    return false;
+
+  if (str == "UNSATISFIABLE")
+    status = UNSATISFIABLE;
+  else if (str == "OPTIMIZED")
+    status = OPTIMIZED;
+  else if (str == "PARTIALLY_SATISFIABLE")
+    status = PARTIALLY_SATISFIABLE;
+  else
+    return false;
+
+  if (!(s >> str) || str != "parameters")
+    return false;
+
+  if (!parameters.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "initial_context")
+    return false;
+
+  if (!initial_context.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "control_parameters")
+    return false;
+
+  for (dimension_type i = 0; i < CONTROL_PARAMETER_NAME_SIZE; ++i) {
+    if (!(s >> str))
+      return false;
+    Control_Parameter_Value value;
+    if (str == "CUTTING_STRATEGY_FIRST")
+      value = CUTTING_STRATEGY_FIRST;
+    else if (str == "CUTTING_STRATEGY_DEEPEST")
+      value = CUTTING_STRATEGY_DEEPEST;
+    else if (str == "CUTTING_STRATEGY_ALL")
+      value = CUTTING_STRATEGY_ALL;
+    else if (str == "PIVOT_ROW_STRATEGY_FIRST")
+      value = PIVOT_ROW_STRATEGY_FIRST;
+    else if (str == "PIVOT_ROW_STRATEGY_MAX_COLUMN")
+      value = PIVOT_ROW_STRATEGY_MAX_COLUMN;
+    else
+      return false;
+    control_parameters[i] = value;
+  }
+
+  if (!(s >> str) || str != "big_parameter_dimension:")
+    return false;
+  if (!(s >> big_parameter_dimension))
+    return false;
+
+  // Release current_solution tree (if any).
+  delete current_solution;
+  current_solution = 0;
+  // Load current_solution (if any).
+  if (!(s >> str) || str != "current_solution:")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "BOTTOM")
+    current_solution = 0;
+  else if (str == "DECISION") {
+    PIP_Decision_Node* const dec = new PIP_Decision_Node(0, 0, 0);
+    current_solution = dec;
+    if (!dec->ascii_load(s))
+      return false;
+    dec->set_owner(this);
+  }
+  else if (str == "SOLUTION") {
+    PIP_Solution_Node* const sol = new PIP_Solution_Node(0);
+    current_solution = sol;
+    if (!sol->ascii_load(s))
+      return false;
+    sol->set_owner(this);
+  }
+  else
+    // Unknown node kind.
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PPL::PIP_Problem::clear() {
+  external_space_dim = 0;
+  internal_space_dim = 0;
+  status = PARTIALLY_SATISFIABLE;
+  if (current_solution != 0) {
+    delete current_solution;
+    current_solution = 0;
+  }
+  input_cs.clear();
+  first_pending_constraint = 0;
+  parameters.clear();
+  initial_context.clear();
+  control_parameters_init();
+  big_parameter_dimension = not_a_dimension();
+}
+
+void
+PPL::PIP_Problem
+::add_space_dimensions_and_embed(const dimension_type m_vars,
+                                 const dimension_type m_params) {
+  // Adding no space dims at all is a no-op:
+  // this avoids invalidating problem status (if it was optimized).
+  if (m_vars == 0 && m_params == 0)
+    return;
+
+  // The space dimension of the resulting PIP problem should not
+  // overflow the maximum allowed space dimension.
+  dimension_type available = max_space_dimension() - space_dimension();
+  bool should_throw = (m_vars > available);
+  if (!should_throw) {
+    available -= m_vars;
+    should_throw = (m_params > available);
+  }
+  if (should_throw)
+    throw std::length_error("PPL::PIP_Problem::"
+                            "add_space_dimensions_and_embed(m_v, m_p):\n"
+                            "adding m_v+m_p new space dimensions exceeds "
+                            "the maximum allowed space dimension.");
+  // First add PIP variables ...
+  external_space_dim += m_vars;
+  // ... then add PIP parameters.
+  for (dimension_type i = m_params; i-- > 0; ) {
+    parameters.insert(Variable(external_space_dim));
+    ++external_space_dim;
+  }
+  // Update problem status.
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::PIP_Problem
+::add_to_parameter_space_dimensions(const Variables_Set& p_vars) {
+  if (p_vars.space_dimension() > external_space_dim)
+    throw std::invalid_argument("PPL::PIP_Problem::"
+                                "add_to_parameter_space_dimension(p_vars):\n"
+                                "*this and p_vars are dimension "
+                                "incompatible.");
+  const dimension_type original_size = parameters.size();
+  parameters.insert(p_vars.begin(), p_vars.end());
+  // Do not allow to turn variables into parameters.
+  for (Variables_Set::const_iterator p = p_vars.begin(),
+         end = p_vars.end(); p != end; ++p) {
+    if (*p < internal_space_dim) {
+      throw std::invalid_argument("PPL::PIP_Problem::"
+                                  "add_to_parameter_space_dimension(p_vars):"
+                                  "p_vars contain variable indices.");
+    }
+  }
+
+  // If a new parameter was inserted, set the internal status to
+  // PARTIALLY_SATISFIABLE.
+  if (parameters.size() != original_size && status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+}
+
+void
+PPL::PIP_Problem::add_constraint(const Constraint& c) {
+  if (c.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::PIP_Problem::add_constraint(c):\n"
+      << "dim == "<< external_space_dim << " and c.space_dimension() == "
+      << c.space_dimension() << " are dimension incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+  input_cs.push_back(c);
+  // Update problem status.
+  if (status != UNSATISFIABLE)
+    status = PARTIALLY_SATISFIABLE;
+}
+
+void
+PPL::PIP_Problem::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator ci = cs.begin(),
+         ci_end = cs.end(); ci != ci_end; ++ci)
+    add_constraint(*ci);
+}
+
+bool
+PPL::PIP_Problem::is_satisfiable() const {
+  if (status == PARTIALLY_SATISFIABLE)
+    solve();
+  return status == OPTIMIZED;
+}
+
+void
+PPL::PIP_Problem::set_control_parameter(Control_Parameter_Value value) {
+  switch (value) {
+  case CUTTING_STRATEGY_FIRST:
+    // Intentionally fall through.
+  case CUTTING_STRATEGY_DEEPEST:
+    // Intentionally fall through.
+  case CUTTING_STRATEGY_ALL:
+    control_parameters[CUTTING_STRATEGY] = value;
+    break;
+  case PIVOT_ROW_STRATEGY_FIRST:
+    // Intentionally fall through.
+  case PIVOT_ROW_STRATEGY_MAX_COLUMN:
+    control_parameters[PIVOT_ROW_STRATEGY] = value;
+    break;
+  default:
+    throw std::invalid_argument("PPL::PIP_Problem::set_control_parameter(v)"
+                                ":\ninvalid value.");
+  }
+}
+
+void
+PPL::PIP_Problem::set_big_parameter_dimension(dimension_type big_dim) {
+  if (parameters.count(big_dim) == 0)
+    throw std::invalid_argument("PPL::PIP_Problem::"
+                                "set_big_parameter_dimension(big_dim):\n"
+                                "dimension 'big_dim' is not a parameter.");
+  if (big_dim < internal_space_dim)
+    throw std::invalid_argument("PPL::PIP_Problem::"
+                                "set_big_parameter_dimension(big_dim):\n"
+                                "only newly-added parameters can be"
+                                "converted into the big parameter.");
+  big_parameter_dimension = big_dim;
+}
+
+PPL::memory_size_type
+PPL::PIP_Problem::external_memory_in_bytes() const {
+  memory_size_type n = initial_context.external_memory_in_bytes();
+  // Adding the external memory for `current_solution'.
+  if (current_solution != 0)
+    n += current_solution->total_memory_in_bytes();
+  // Adding the external memory for `input_cs'.
+  n += input_cs.capacity() * sizeof(Constraint);
+  for (const_iterator i = input_cs.begin(),
+         i_end = input_cs.end(); i != i_end; ++i)
+    n += (i->external_memory_in_bytes());
+  // FIXME: Adding the external memory for `parameters'.
+  n += parameters.size() * sizeof(dimension_type);
+
+  return n;
+}
+
+PPL::memory_size_type
+PPL::PIP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+void
+PPL::PIP_Problem::print_solution(std::ostream& s, int indent) const {
+  switch (status) {
+
+  case UNSATISFIABLE:
+    PPL_ASSERT(current_solution == 0);
+    PIP_Tree_Node::indent_and_print(s, indent, "_|_\n");
+    break;
+
+  case OPTIMIZED:
+    PPL_ASSERT(current_solution != 0);
+    current_solution->print(s, indent);
+    break;
+
+  case PARTIALLY_SATISFIABLE:
+    throw std::logic_error("PIP_Problem::print_solution():\n"
+                           "the PIP problem has not been solved.");
+  }
+}
+
diff --git a/src/PIP_Problem_defs.hh b/src/PIP_Problem_defs.hh
new file mode 100644
index 0000000..c4f89d8
--- /dev/null
+++ b/src/PIP_Problem_defs.hh
@@ -0,0 +1,834 @@
+/* PIP_Problem class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Problem_defs_hh
+#define PPL_PIP_Problem_defs_hh 1
+
+#include "PIP_Problem_types.hh"
+#include "PIP_Tree_types.hh"
+#include "globals_types.hh"
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_defs.hh"
+#include "Variables_Set_defs.hh"
+#include <vector>
+#include <deque>
+#include <iosfwd>
+
+#include "Matrix_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const PIP_Problem& pip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Problem */
+void swap(PIP_Problem& x, PIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Parametric Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+  An object of this class encodes a parametric integer (linear)
+  programming problem. The PIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the subset of those dimensions of the vector space that are
+     interpreted as integer parameters (the other space dimensions
+     are interpreted as non-parameter integer variables);
+   - a finite set of linear equality and (strict or non-strict)
+     inequality constraints involving variables and/or parameters;
+     these constraints are used to define:
+       - the <EM>feasible region</EM>, if they involve one or more
+         problem variable (and maybe some parameters);
+       - the <EM>initial context</EM>, if they only involve the
+         parameters;
+   - optionally, the so-called <EM>big parameter</EM>,
+     i.e., a problem parameter to be considered arbitrarily big.
+
+  Note that all problem variables and problem parameters are assumed
+  to take non-negative integer values, so that there is no need
+  to specify non-negativity constraints.
+
+  The class provides support for the (incremental) solution of the
+  PIP problem based on variations of the revised simplex method and
+  on Gomory cut generation techniques.
+
+  The solution for a PIP problem is the lexicographic minimum of the
+  integer points of the feasible region, expressed in terms of the
+  parameters. As the problem to be solved only involves non-negative
+  variables and parameters, the problem will always be either unfeasible
+  or optimizable.
+
+  As the feasibility and the solution value of a PIP problem depend on the
+  values of the parameters, the solution is a binary decision tree,
+  dividing the context parameter set into subsets.
+  The tree nodes are of two kinds:
+   - \e Decision nodes.
+     These are internal tree nodes encoding one or more linear tests
+     on the parameters; if all the tests are satisfied, then the solution
+     is the node's \e true child; otherwise, the solution is the node's
+     \e false child;
+   - \e Solution nodes.
+     These are leaf nodes in the tree, encoding the solution of the problem
+     in the current context subset, where each variable is defined in terms
+     of a linear expression of the parameters.
+     Solution nodes also optionally embed a set of parameter constraints:
+     if all these constraints are satisfied, the solution is described by
+     the node, otherwise the problem has no solution.
+
+  It may happen that a decision node has no \e false child. This means
+  that there is no solution if at least one of the corresponding
+  constraints is not satisfied. Decision nodes having two or more linear
+  tests on the parameters cannot have a \e false child. Decision nodes
+  always have a \e true child.
+
+  Both kinds of tree nodes may also contain the definition of extra
+  parameters which are artificially introduced by the solver to enforce
+  an integral solution. Such artificial parameters are defined by
+  the integer division of a linear expression on the parameters
+  by an integer coefficient.
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given PIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of parameters
+  and the addition of constraints.
+
+  \par Example problem
+  An example PIP problem can be defined the following:
+  \code
+  3*j >= -2*i+8
+  j <= 4*i - 4
+  i <= n
+  j <= m
+  \endcode
+  where \c i and \c j are the problem variables
+  and \c n and \c m are the problem parameters.
+  This problem can be optimized; the resulting solution tree may be
+  represented as follows:
+  \verbatim
+  if 7*n >= 10 then
+    if 7*m >= 12 then
+      {i = 2 ; j = 2}
+    else
+      Parameter P = (m) div 2
+      if 2*n + 3*m >= 8 then
+        {i = -m - P + 4 ; j = m}
+      else
+        _|_
+  else
+    _|_
+  \endverbatim
+  The solution tree starts with a decision node depending on the
+  context constraint <code>7*n >= 10</code>.
+  If this constraint is satisfied by the values assigned to the
+  problem parameters, then the (textually first) \c then branch is taken,
+  reaching the \e true child of the root node (which in this case
+  is another decision node); otherwise, the (textually last) \c else
+  branch is taken, for which there is no corresponding \e false child.
+  \par
+  The \f$\perp\f$ notation, also called \e bottom, denotes the
+  lexicographic minimum of an empty set of solutions,
+  here meaning the corresponding subproblem is unfeasible.
+  \par
+  Notice that a tree node may introduce new (non-problem) parameters,
+  as is the case for parameter \c P in the (textually first) \c else
+  branch above. These \e artificial parameters are only meaningful
+  inside the subtree where they are defined and are used to define
+  the parametric values of the problem variables in solution nodes
+  (e.g., the <CODE>{i,j}</CODE> vector in the textually third \c then branch).
+
+  \par Context restriction
+  The above solution is correct in an unrestricted initial context,
+  meaning all possible values are allowed for the parameters. If we
+  restrict the context with the following parameter inequalities:
+  \code
+  m >= n
+  n >= 5
+  \endcode
+  then the resulting optimizing tree will be a simple solution node:
+  \verbatim
+  {i = 2 ; j = 2}
+  \endverbatim
+
+  \par Creating the PIP_Problem object
+  The PIP_Problem object corresponding to the above example can be
+  created as follows:
+  \code
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  \endcode
+  If you want to restrict the initial context, simply add the parameter
+  constraints the same way as for normal constraints.
+  \code
+  cs.insert(m >= n);
+  cs.insert(n >= 5);
+  \endcode
+
+  \par Solving the problem
+  Once the PIP_Problem object has been created, you can start the
+  resolution of the problem by calling the solve() method:
+  \code
+  PIP_Problem_Status status = pip.solve();
+  \endcode
+  where the returned \c status indicates if the problem has been optimized
+  or if it is unfeasible for any possible configuration of the parameter
+  values. The resolution process is also started if an attempt is made
+  to get its solution, as follows:
+  \code
+  const PIP_Tree_Node* node = pip.solution();
+  \endcode
+  In this case, an unfeasible problem will result in an empty solution
+  tree, i.e., assigning a null pointer to \c node.
+
+  \par Printing the solution tree
+  A previously computed solution tree may be printed as follows:
+  \code
+  pip.print_solution(std::cout);
+  \endcode
+  This will produce the following output (note: variables and parameters
+  are printed according to the default output function; see
+  <code>Variable::set_output_function</code>):
+  \verbatim
+  if 7*C >= 10 then
+    if 7*D >= 12 then
+      {2 ; 2}
+    else
+      Parameter E = (D) div 2
+      if 2*C + 3*D >= 8 then
+        {-D - E + 4 ; D}
+      else
+        _|_
+  else
+    _|_
+  \endverbatim
+
+  \par Spanning the solution tree
+  A parameter assignment for a PIP problem binds each of the problem
+  parameters to a non-negative integer value. After fixing a parameter
+  assignment, the ``spanning'' of the PIP problem solution tree refers
+  to the process whereby the solution tree is navigated, starting from
+  the root node: the value of artificial parameters is computed according
+  to the parameter assignment and the node's constraints are evaluated,
+  thereby descending in either the true or the false subtree of decision
+  nodes and eventually reaching a solution node or a bottom node.
+  If a solution node is found, each of the problem variables is provided
+  with a parametric expression, which can be evaluated to a fixed value
+  using the given parameter assignment and the computed values for
+  artificial parameters.
+  \par
+  The coding of the spanning process can be done as follows.
+  First, the root of the PIP solution tree is retrieved:
+  \code
+  const PIP_Tree_Node* node = pip.solution();
+  \endcode
+  If \c node represents an unfeasible solution (i.e., \f$\perp\f$),
+  its value will be \c 0. For a non-null tree node, the virtual methods
+  \c PIP_Tree_Node::as_decision() and \c PIP_Tree_Node::as_solution()
+  can be used to check whether the node is a decision or a solution node:
+  \code
+  const PIP_Solution_Node* sol = node->as_solution();
+  if (sol != 0) {
+    // The node is a solution node
+    ...
+  }
+  else {
+    // The node is a decision node
+    const PIP_Decision_Node* dec = node->as_decision();
+    ...
+  }
+  \endcode
+  \par
+  The true (resp., false) child node of a Decision Node may be accessed by
+  using method \c PIP_Decision_Node::child_node(bool), passing \c true
+  (resp., \c false) as the input argument.
+
+  \par Artificial parameters
+  A PIP_Tree_Node::Artificial_Parameter object represents the result
+  of the integer division of a Linear_Expression (on the other
+  parameters, including the previously-defined artificials)
+  by an integer denominator (a Coefficient object).
+  The dimensions of the artificial parameters (if any) in a tree node
+  have consecutive indices starting from <code>dim+1</code>, where the value
+  of \c dim is computed as follows:
+   - for the tree root node, \c dim is the space dimension of the PIP_Problem;
+   - for any other node of the tree, it is recursively obtained by adding
+     the value of \c dim computed for the parent node to the number of
+     artificial parameters defined in the parent node.
+  \par
+  Since the numbering of dimensions for artificial parameters follows
+  the rule above, the addition of new problem variables and/or new problem
+  parameters to an already solved PIP_Problem object (as done when
+  incrementally solving a problem) will result in the systematic
+  renumbering of all the existing artificial parameters.
+
+  \par Node constraints
+  All kind of tree nodes can contain context constraints.
+  Decision nodes always contain at least one of them.
+  The node's local constraint system can be obtained using method
+  PIP_Tree_Node::constraints.
+  These constraints only involve parameters, including both the problem
+  parameters and the artificial parameters that have been defined
+  in nodes occurring on the path from the root node to the current node.
+  The meaning of these constraints is as follows:
+   - On a decision node, if all tests in the constraints are true, then the
+     solution is the \e true child; otherwise it is the \e false child.
+   - On a solution node, if the (possibly empty) system of constraints
+     evaluates to true for a given parameter assignment, then the solution
+     is described by the node; otherwise the solution is \f$\perp\f$
+     (i.e., the problem is unfeasible for that parameter assignment).
+
+  \par Getting the optimal values for the variables
+  After spanning the solution tree using the given parameter assignment,
+  if a solution node has been reached, then it is possible to retrieve
+  the parametric expression for each of the problem variables using
+  method PIP_Solution_Node::parametric_values. The retrieved expression
+  will be defined in terms of all the parameters (problem parameters
+  and artificial parameters defined along the path).
+
+  \par Solving maximization problems
+  You can solve a lexicographic maximization problem by reformulating its
+  constraints using variable substitution. Proceed the following steps:
+   - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+     which we will call \f$M\f$.
+   - Reformulate each of the maximization problem constraints by
+     substituting each \f$x_i\f$ variable with an expression of the form
+     \f$M-x'_i\f$, where the \f$x'_i\f$ variables are positive variables to
+     be minimized.
+   - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+   - In the solution expressions, the values of the \f$x'\f$ variables will
+     be expressed in the form: \f$x'_i = M-x_i\f$. To get back the value of
+     the expression of each \f$x_i\f$ variable, just apply the
+     formula: \f$x_i = M-x'_i\f$.
+  \par
+  Note that if the resulting expression of one of the \f$x'_i\f$ variables
+  is not in the \f$x'_i = M-x_i\f$ form, this means that the
+  sign-unrestricted problem is unbounded.
+  \par
+  You can choose to maximize only a subset of the variables while minimizing
+  the other variables. In that case, just apply the variable substitution
+  method on the variables you want to be maximized. The variable
+  optimization priority will still be in lexicographic order.
+
+  \par
+  \b Example: consider you want to find the lexicographic maximum of the
+  \f$(x,y)\f$ vector, under the constraints:
+    \f[\left\{\begin{array}{l}
+      y \geq 2x - 4\\
+      y \leq -x + p
+    \end{array}\right.\f]
+  \par
+  where \f$p\f$ is a parameter.
+  \par
+  After variable substitution, the constraints become:
+    \f[\left\{\begin{array}{l}
+      M - y \geq 2M - 2x - 4\\
+      M - y \leq -M + x + p
+    \end{array}\right.\f]
+  \par
+  The code for creating the corresponding problem object is the following:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable M(3);
+  Variables_Set params(p, M);
+  Constraint_System cs;
+  cs.insert(M - y >= 2*M - 2*x - 4);
+  cs.insert(M - y <= -M + x + p);
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_big_parameter_dimension(3);     // M is the big parameter
+  \endcode
+  Solving the problem provides the following solution:
+  \verbatim
+  Parameter E = (C + 1) div 3
+  {D - E - 1 ; -C + D + E + 1}
+  \endverbatim
+  Under the notations above, the solution is:
+  \f[ \left\{\begin{array}{l}
+    x' = M - \left\lfloor\frac{p+1}{3}\right\rfloor - 1 \\
+    y' = M - p + \left\lfloor\frac{p+1}{3}\right\rfloor + 1
+  \end{array}\right.
+  \f]
+  \par
+  Performing substitution again provides us with the values of the original
+  variables:
+  \f[ \left\{\begin{array}{l}
+    x = \left\lfloor\frac{p+1}{3}\right\rfloor + 1 \\
+    y = p - \left\lfloor\frac{p+1}{3}\right\rfloor - 1
+  \end{array}\right.
+  \f]
+
+  \par Allowing variables to be arbitrarily signed
+  You can deal with arbitrarily signed variables by reformulating the
+  constraints using variable substitution. Proceed the following steps:
+   - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+     which we will call \f$M\f$.
+   - Reformulate each of the maximization problem constraints by
+     substituting each \f$x_i\f$ variable with an expression of the form
+     \f$x'_i-M\f$, where the \f$x'_i\f$ variables are positive.
+   - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+   - The solution expression can be read in the form:
+   - In the solution expressions, the values of the \f$x'\f$ variables will
+     be expressed in the form: \f$x'_i = x_i+M\f$. To get back the value of
+     the expression of each signed \f$x_i\f$ variable, just apply the
+     formula: \f$x_i = x'_i-M\f$.
+  \par
+  Note that if the resulting expression of one of the \f$x'_i\f$ variables
+  is not in the \f$x'_i = x_i+M\f$ form, this means that the
+  sign-unrestricted problem is unbounded.
+  \par
+  You can choose to define only a subset of the variables to be
+  sign-unrestricted. In that case, just apply the variable substitution
+  method on the variables you want to be sign-unrestricted.
+
+  \par
+  \b Example: consider you want to find the lexicographic minimum of the
+  \f$(x,y)\f$ vector, where the \f$x\f$ and \f$y\f$ variables are
+  sign-unrestricted, under the constraints:
+    \f[\left\{\begin{array}{l}
+      y \geq -2x - 4\\
+      2y \leq x + 2p
+    \end{array}\right.\f]
+  \par
+  where \f$p\f$ is a parameter.
+  \par
+  After variable substitution, the constraints become:
+    \f[\left\{\begin{array}{l}
+      y' - M \geq -2x' + 2M - 4\\
+      2y' - 2M \leq x' - M + 2p
+    \end{array}\right.\f]
+  \par
+  The code for creating the corresponding problem object is the following:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable M(3);
+  Variables_Set params(p, M);
+  Constraint_System cs;
+  cs.insert(y - M >= -2*x + 2*M - 4);
+  cs.insert(2*y - 2*M <= x - M + 2*p);
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_big_parameter_dimension(3);     // M is the big parameter
+  \endcode
+  \par
+  Solving the problem provides the following solution:
+  \verbatim
+  Parameter E = (2*C + 3) div 5
+  {D - E - 1 ; D + 2*E - 2}
+  \endverbatim
+  Under the notations above, the solution is:
+  \f[ \left\{\begin{array}{l}
+    x' = M - \left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+    y' = M + 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+  \end{array}\right.
+  \f]
+  \par
+  Performing substitution again provides us with the values of the original
+  variables:
+  \f[ \left\{\begin{array}{l}
+    x = -\left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+    y = 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+  \end{array}\right.
+  \f]
+
+  \par Allowing parameters to be arbitrarily signed
+  You can consider a parameter \f$p\f$ arbitrarily signed by replacing
+  \f$p\f$ with \f$p^+-p^-\f$, where both \f$p^+\f$ and \f$p^-\f$ are
+  positive parameters. To represent a set of arbitrarily signed parameters,
+  replace each parameter \f$p_i\f$ with \f$p^+_i-p^-\f$, where \f$-p^-\f$ is
+  the minimum negative value of all parameters.
+
+  \par Minimizing a linear cost function
+  Lexicographic solving can be used to find the parametric minimum of a
+  linear cost function.
+  \par
+  Suppose the variables are named \f$x_1, x_2, \dots, x_n\f$, and the
+  parameters \f$p_1, p_2, \dots, p_m\f$. You can minimize a linear cost
+  function \f$f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ by simply adding the
+  constraint \f$x_1 \geq f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ to the
+  constraint system. As lexicographic minimization ensures \f$x_1\f$ is
+  minimized in priority, and because \f$x_1\f$ is forced by a constraint to
+  be superior or equal to the cost function, optimal solutions of the
+  problem necessarily ensure that the solution value of \f$x_1\f$ is the
+  optimal value of the cost function.
+*/
+class Parma_Polyhedra_Library::PIP_Problem {
+public:
+  //! Builds a trivial PIP problem.
+  /*!
+    A trivial PIP problem requires to compute the lexicographic minimum
+    on a vector space under no constraints and with no parameters:
+    due to the implicit non-negativity constraints, the origin of the
+    vector space is an optimal solution.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this
+    (optional argument with default value \f$0\f$).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+  explicit PIP_Problem(dimension_type dim = 0);
+
+  /*! \brief
+    Builds a PIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$;
+    those dimensions whose indices occur in \p p_vars are
+    interpreted as parameters.
+
+    \param dim
+    The dimension of the vector space (variables and parameters) enclosing
+    \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param p_vars
+    The set of variables' indexes that are interpreted as parameters.
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if the space dimension of a constraint in the sequence
+    (resp., the parameter variables) is strictly greater than \p dim.
+  */
+  template <typename In>
+  PIP_Problem(dimension_type dim, In first, In last,
+              const Variables_Set& p_vars);
+
+  //! Ordinary copy-constructor.
+  PIP_Problem(const PIP_Problem& y);
+
+  //! Destructor.
+  ~PIP_Problem();
+
+  //! Assignment operator.
+  PIP_Problem& operator=(const PIP_Problem& y);
+
+  //! Returns the maximum space dimension a PIP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the PIP problem.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a set containing all the variables' indexes representing
+    the parameters of the PIP problem.
+  */
+  const Variables_Set& parameter_space_dimensions() const;
+
+private:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint> Constraint_Sequence;
+
+public:
+  /*! \brief
+    A type alias for the read-only iterator on the constraints
+    defining the feasible region.
+  */
+  typedef Constraint_Sequence::const_iterator const_iterator;
+
+  /*! \brief
+    Returns a read-only iterator to the first constraint defining
+    the feasible region.
+  */
+  const_iterator constraints_begin() const;
+
+  /*! \brief
+    Returns a past-the-end read-only iterator to the sequence of
+    constraints defining the feasible region.
+  */
+  const_iterator constraints_end() const;
+
+  //! Resets \p *this to be equal to the trivial PIP problem.
+  /*!
+    The space dimension is reset to \f$0\f$.
+  */
+  void clear();
+
+  /*! \brief
+    Adds <CODE>m_vars + m_params</CODE> new space dimensions
+    and embeds the old PIP problem in the new vector space.
+
+    \param m_vars
+    The number of space dimensions to add that are interpreted as
+    PIP problem variables (i.e., non parameters). These are added
+    \e before adding the \p m_params parameters.
+
+    \param m_params
+    The number of space dimensions to add that are interpreted as
+    PIP problem parameters. These are added \e after having added the
+    \p m_vars problem variables.
+
+    \exception std::length_error
+    Thrown if adding <CODE>m_vars + m_params</CODE> new space
+    dimensions would cause the vector space to exceed dimension
+    <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new PIP problem; they are initially unconstrained.
+  */
+  void add_space_dimensions_and_embed(dimension_type m_vars,
+                                      dimension_type m_params);
+
+  /*! \brief
+    Sets the space dimensions whose indexes which are in set \p p_vars
+    to be parameter space dimensions.
+
+    \exception std::invalid_argument
+    Thrown if some index in \p p_vars does not correspond to
+    a space dimension in \p *this.
+  */
+  void add_to_parameter_space_dimensions(const Variables_Set& p_vars);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the PIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p c is strictly greater than
+    the space dimension of \p *this.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the PIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the space dimension of constraint system \p cs is strictly
+    greater than the space dimension of \p *this.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    \c true if and only if the PIP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the PIP problem.
+  /*!
+    \return
+    A PIP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible or optimized problem).
+  */
+  PIP_Problem_Status solve() const;
+
+  //! Returns a feasible solution for \p *this, if it exists.
+  /*!
+    A null pointer is returned for an unfeasible PIP problem.
+  */
+  PIP_Tree solution() const;
+
+  //! Returns an optimizing solution for \p *this, if it exists.
+  /*!
+    A null pointer is returned for an unfeasible PIP problem.
+  */
+  PIP_Tree optimizing_solution() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Prints on \p s the solution computed for \p *this.
+  /*!
+    \param s
+    The output stream.
+
+    \param indent
+    An indentation parameter (default value 0).
+
+    \exception std::logic_error
+    Thrown if trying to print the solution when the PIP problem
+    still has to be solved.
+  */
+  void print_solution(std::ostream& s, int indent = 0) const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(PIP_Problem& y);
+
+  //! Possible names for PIP_Problem control parameters.
+  enum Control_Parameter_Name {
+    //! Cutting strategy
+    CUTTING_STRATEGY,
+    //! Pivot row strategy
+    PIVOT_ROW_STRATEGY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    CONTROL_PARAMETER_NAME_SIZE
+  };
+
+  //! Possible values for PIP_Problem control parameters.
+  enum Control_Parameter_Value {
+    //! Choose the first non-integer row.
+    CUTTING_STRATEGY_FIRST,
+    //! Choose row which generates the deepest cut.
+    CUTTING_STRATEGY_DEEPEST,
+    //! Always generate all possible cuts.
+    CUTTING_STRATEGY_ALL,
+
+    //! Choose the first row with negative parameter sign.
+    PIVOT_ROW_STRATEGY_FIRST,
+    //! Choose a row that generates a lexicographically maximal pivot column.
+    PIVOT_ROW_STRATEGY_MAX_COLUMN,
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    CONTROL_PARAMETER_VALUE_SIZE
+  };
+
+  //! Returns the value of control parameter \p name.
+  Control_Parameter_Value
+  get_control_parameter(Control_Parameter_Name name) const;
+
+  //! Sets control parameter \p value.
+  void set_control_parameter(Control_Parameter_Value value);
+
+  //! Sets the dimension for the big parameter to \p big_dim.
+  void set_big_parameter_dimension(dimension_type big_dim);
+
+  /*! \brief
+    Returns the space dimension for the big parameter.
+
+    If a big parameter was not set, returns \c not_a_dimension().
+  */
+  dimension_type get_big_parameter_dimension() const;
+
+private:
+  //! Initializes the control parameters with default values.
+  void control_parameters_init();
+
+  //! Copies the control parameters from problem object \p y.
+  void control_parameters_copy(const PIP_Problem& y);
+
+  //! The dimension of the vector space.
+  dimension_type external_space_dim;
+
+  /*! \brief
+    The space dimension of the current (partial) solution of the
+    PIP problem; it may be smaller than \p external_space_dim.
+  */
+  dimension_type internal_space_dim;
+
+  //! An enumerated type describing the internal status of the PIP problem.
+  enum Status {
+    //! The PIP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The PIP problem is optimized; the solution tree has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the PIP problem has been changed by adding
+      new variables, parameters or constraints; a feasible solution for
+      the old feasible region is still available.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the MIP problem.
+  Status status;
+
+  //! The current solution decision tree
+  PIP_Tree_Node* current_solution;
+
+  //! The sequence of constraints describing the feasible region.
+  Constraint_Sequence input_cs;
+
+  //! The first index of `input_cs' containing a pending constraint.
+  dimension_type first_pending_constraint;
+
+  /*! \brief
+    A set containing all the indices of space dimensions that are
+    interpreted as problem parameters.
+  */
+  Variables_Set parameters;
+
+#if PPL_USE_SPARSE_MATRIX
+  typedef Sparse_Row Row;
+#else
+  typedef Dense_Row Row;
+#endif
+
+  /*! \brief
+    The initial context
+
+    Contains problem constraints on parameters only
+  */
+  Matrix<Row> initial_context;
+
+  //! The control parameters for the problem object.
+  Control_Parameter_Value
+  control_parameters[CONTROL_PARAMETER_NAME_SIZE];
+
+  /*! \brief
+    The dimension for the big parameter, or \c not_a_dimension()
+    if not set.
+  */
+  dimension_type big_parameter_dimension;
+
+  friend class PIP_Solution_Node;
+};
+
+#include "PIP_Problem_inlines.hh"
+#include "PIP_Problem_templates.hh"
+
+#endif // !defined(PPL_PIP_Problem_defs_hh)
diff --git a/src/PIP_Problem_inlines.hh b/src/PIP_Problem_inlines.hh
new file mode 100644
index 0000000..4f7d234
--- /dev/null
+++ b/src/PIP_Problem_inlines.hh
@@ -0,0 +1,96 @@
+/* PIP_Problem class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Problem_inlines_hh
+#define PPL_PIP_Problem_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+PIP_Problem::space_dimension() const {
+  return external_space_dim;
+}
+
+inline dimension_type
+PIP_Problem::max_space_dimension() {
+  return Constraint::max_space_dimension();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_begin() const {
+  return input_cs.begin();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_end() const {
+  return input_cs.end();
+}
+
+inline const Variables_Set&
+PIP_Problem::parameter_space_dimensions() const {
+  return parameters;
+}
+
+inline void
+PIP_Problem::m_swap(PIP_Problem& y) {
+  using std::swap;
+  swap(external_space_dim, y.external_space_dim);
+  swap(internal_space_dim, y.internal_space_dim);
+  swap(status, y.status);
+  swap(current_solution, y.current_solution);
+  swap(input_cs, y.input_cs);
+  swap(first_pending_constraint, y.first_pending_constraint);
+  swap(parameters, y.parameters);
+  swap(initial_context, y.initial_context);
+  for (dimension_type i = CONTROL_PARAMETER_NAME_SIZE; i-- > 0; )
+    swap(control_parameters[i], y.control_parameters[i]);
+  swap(big_parameter_dimension, y.big_parameter_dimension);
+}
+
+inline PIP_Problem&
+PIP_Problem::operator=(const PIP_Problem& y) {
+  PIP_Problem tmp(y);
+  m_swap(tmp);
+  return *this;
+}
+
+inline PIP_Problem::Control_Parameter_Value
+PIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+  PPL_ASSERT(name >= 0 && name < CONTROL_PARAMETER_NAME_SIZE);
+  return control_parameters[name];
+}
+
+inline dimension_type
+PIP_Problem::get_big_parameter_dimension() const {
+  return big_parameter_dimension;
+}
+
+/*! \relates PIP_Problem */
+inline void
+swap(PIP_Problem& x, PIP_Problem& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Problem_inlines_hh)
diff --git a/src/PIP_Problem_templates.hh b/src/PIP_Problem_templates.hh
new file mode 100644
index 0000000..2d414a8
--- /dev/null
+++ b/src/PIP_Problem_templates.hh
@@ -0,0 +1,81 @@
+/* PIP_Problem class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Problem_templates_hh
+#define PPL_PIP_Problem_templates_hh 1
+
+#include "Variables_Set_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+PIP_Problem::PIP_Problem(dimension_type dim,
+                         In first, In last,
+                         const Variables_Set& p_vars)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    status(PARTIALLY_SATISFIABLE),
+    current_solution(0),
+    input_cs(),
+    first_pending_constraint(0),
+    parameters(p_vars),
+    initial_context(),
+    big_parameter_dimension(not_a_dimension()) {
+  // Check that integer Variables_Set does not exceed the space dimension
+  // of the problem.
+  if (p_vars.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::PIP_Problem::PIP_Problem(dim, first, last, p_vars):\n"
+      << "dim == " << external_space_dim
+      << " and p_vars.space_dimension() == "
+      << p_vars.space_dimension()
+      << " are dimension incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::PIP_Problem::"
+                            "PIP_Problem(dim, first, last, p_vars):\n"
+                            "dim exceeds the maximum allowed "
+                            "space dimension.");
+  // Check the constraints.
+  for (In i = first; i != last; ++i) {
+    if (i->space_dimension() > dim) {
+      std::ostringstream s;
+      s << "PPL::PIP_Problem::"
+        << "PIP_Problem(dim, first, last, p_vars):\n"
+        << "range [first, last) contains a constraint having space "
+        << "dimension == " << i->space_dimension()
+        << " that exceeds this->space_dimension == " << dim << ".";
+      throw std::invalid_argument(s.str());
+    }
+    input_cs.push_back(*i);
+  }
+  control_parameters_init();
+  PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Problem_templates_hh)
diff --git a/src/PIP_Problem_types.hh b/src/PIP_Problem_types.hh
new file mode 100644
index 0000000..a1f044f
--- /dev/null
+++ b/src/PIP_Problem_types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_PIP_Problem_types_hh
+#define PPL_PIP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the PIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum PIP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_PIP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_PIP_PROBLEM
+};
+
+class PIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Problem_types_hh)
diff --git a/src/PIP_Tree.cc b/src/PIP_Tree.cc
new file mode 100644
index 0000000..4a6d6b3
--- /dev/null
+++ b/src/PIP_Tree.cc
@@ -0,0 +1,3809 @@
+/* PIP_Tree related class implementation: non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "PIP_Tree_defs.hh"
+#include "PIP_Problem_defs.hh"
+#include <algorithm>
+#include <memory>
+#include <map>
+
+// #define NOISY_PIP_TREE_STRUCTURE 1
+// #define NOISY_PIP 1
+// #define VERY_NOISY_PIP 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace {
+
+//! Assigns to \p x the positive remainder of the division of \p y by \p z.
+inline void
+pos_rem_assign(Coefficient& x,
+               Coefficient_traits::const_reference y,
+               Coefficient_traits::const_reference z) {
+  rem_assign(x, y, z);
+  if (x < 0)
+    x += z;
+}
+
+class Add_Mul_Assign_Row_Helper1 {
+public:
+  Add_Mul_Assign_Row_Helper1(Coefficient_traits::const_reference coeff)
+    : c(coeff) {
+  }
+
+  void
+  operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+    add_mul_assign(x, c, y);
+  }
+
+private:
+  Coefficient c;
+}; // class Add_Mul_Assign_Row_Helper1
+
+
+class Add_Mul_Assign_Row_Helper2 {
+public:
+  Add_Mul_Assign_Row_Helper2(Coefficient_traits::const_reference coeff)
+    : c(coeff) {
+  }
+
+  void
+  operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+    x = y;
+    x *= c;
+  }
+
+private:
+  Coefficient c;
+}; // class Add_Mul_Assign_Row_Helper2
+
+// Compute x += c * y
+inline void
+add_mul_assign_row(PIP_Tree_Node::Row& x,
+                   Coefficient_traits::const_reference c,
+                   const PIP_Tree_Node::Row& y) {
+  WEIGHT_BEGIN();
+  x.combine_needs_second(y,
+                         Add_Mul_Assign_Row_Helper1(c),
+                         Add_Mul_Assign_Row_Helper2(c));
+  WEIGHT_ADD_MUL(108, x.size());
+}
+
+
+struct Sub_Assign_Helper1 {
+  void
+  operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+    x -= y;
+  }
+}; // struct Sub_Assign_Helper1
+
+struct Sub_Assign_Helper2 {
+  void
+  operator()(Coefficient& x, Coefficient_traits::const_reference y) const {
+    x = y;
+    neg_assign(x);
+  }
+}; // struct Sub_Assign_Helper2
+
+// Compute x -= y
+inline void
+sub_assign(PIP_Tree_Node::Row& x, const PIP_Tree_Node::Row& y) {
+  WEIGHT_BEGIN();
+  x.combine_needs_second(y, Sub_Assign_Helper1(), Sub_Assign_Helper2());
+  WEIGHT_ADD_MUL(10, x.size());
+}
+
+// Merge constraint system to a matrix-form context such as x = x U y
+void
+merge_assign(Matrix<PIP_Tree_Node::Row>& x, const Constraint_System& y,
+             const Variables_Set& parameters) {
+  const dimension_type params_size = parameters.size();
+  PPL_ASSERT(params_size == x.num_columns() - 1);
+  const dimension_type new_rows = Implementation::num_constraints(y);
+  if (new_rows == 0)
+    return;
+  const dimension_type old_num_rows = x.num_rows();
+  x.add_zero_rows(new_rows);
+
+  // Compute once for all.
+  const dimension_type cs_space_dim = y.space_dimension();
+  const Variables_Set::const_iterator param_begin = parameters.begin();
+  const Variables_Set::const_iterator param_end = parameters.end();
+
+  dimension_type i = old_num_rows;
+  for (Constraint_System::const_iterator y_i = y.begin(),
+         y_end = y.end(); y_i != y_end; ++y_i, ++i) {
+    WEIGHT_BEGIN();
+    PPL_ASSERT(y_i->is_nonstrict_inequality());
+    PIP_Tree_Node::Row& x_i = x[i];
+    Coefficient_traits::const_reference inhomogeneous_term
+      = y_i->inhomogeneous_term();
+    Variables_Set::const_iterator pj = param_begin;
+    PIP_Tree_Node::Row::iterator itr = x_i.end();
+    if (inhomogeneous_term != 0)
+      itr = x_i.insert(0, inhomogeneous_term);
+    // itr may still be end() but it can still be used as a hint.
+    // TODO: This code could be optimized more (if it's expected that the
+    // size of `parameters' will be greater than the number of nonzero
+    // coefficients in y_i).
+    for (dimension_type j = 1; pj != param_end; ++pj, ++j) {
+      const Variable vj(*pj);
+      if (vj.space_dimension() > cs_space_dim)
+        break;
+      Coefficient_traits::const_reference c = y_i->coefficient(vj);
+      if (c != 0)
+        itr = x_i.insert(itr, j, c);
+    }
+    WEIGHT_ADD_MUL(102, params_size);
+  }
+}
+
+#if PPL_USE_SPARSE_MATRIX
+
+// Assigns to row x the negation of row y.
+inline void
+neg_assign_row(PIP_Tree_Node::Row& x, const PIP_Tree_Node::Row& y) {
+  WEIGHT_BEGIN();
+  x = y;
+  for (PIP_Tree_Node::Row::iterator i = x.begin(),
+         i_end = x.end(); i != i_end; ++i) {
+    neg_assign(*i);
+    WEIGHT_ADD(1);
+  }
+}
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+inline void
+neg_assign_row(PIP_Tree_Node::Row& x, const PIP_Tree_Node::Row& y) {
+  WEIGHT_BEGIN();
+  const dimension_type x_size = x.size();
+  for (dimension_type i = x_size; i-- > 0; )
+    neg_assign(x[i], y[i]);
+  WEIGHT_ADD_MUL(14, x_size);
+}
+
+#endif // !PPL_USE_SPARSE_MATRIX
+
+// Given context row \p y and denominator \p denom,
+// to be interpreted as expression expr = y / denom,
+// assigns to context row \p x a new value such that
+//     x / denom == - expr - 1.
+inline void
+complement_assign(PIP_Tree_Node::Row& x,
+                  const PIP_Tree_Node::Row& y,
+                  Coefficient_traits::const_reference denom) {
+  PPL_ASSERT(denom > 0);
+  neg_assign_row(x, y);
+  PIP_Tree_Node::Row::iterator itr = x.insert(0);
+  Coefficient& x_0 = *itr;
+  if (denom == 1)
+    --x_0;
+  else {
+    PPL_DIRTY_TEMP_COEFFICIENT(mod);
+    pos_rem_assign(mod, x_0, denom);
+    x_0 -= (mod == 0) ? denom : mod;
+  }
+  if (x_0 == 0)
+    x.reset(itr);
+}
+
+// Add to `context' the columns for new artificial parameters.
+inline void
+add_artificial_parameters(Matrix<PIP_Tree_Node::Row>& context,
+                          const dimension_type num_art_params) {
+  if (num_art_params > 0)
+    context.add_zero_columns(num_art_params);
+}
+
+// Add to `params' the indices of new artificial parameters.
+inline void
+add_artificial_parameters(Variables_Set& params,
+                          const dimension_type space_dim,
+                          const dimension_type num_art_params) {
+  for (dimension_type i = 0; i < num_art_params; ++i)
+    params.insert(space_dim + i);
+}
+
+// Update `context', `params' and `space_dim' to account for
+// the addition of the new artificial parameters.
+inline void
+add_artificial_parameters(Matrix<PIP_Tree_Node::Row>& context,
+                          Variables_Set& params,
+                          dimension_type& space_dim,
+                          const dimension_type num_art_params) {
+  add_artificial_parameters(context, num_art_params);
+  add_artificial_parameters(params, space_dim, num_art_params);
+  space_dim += num_art_params;
+}
+
+/* Compares two columns lexicographically in a revised simplex tableau:
+  - returns true if
+    <CODE>
+      (column ja)*(-cst_a)/pivot_a[ja] < (column jb)*(-cst_b)/pivot_b[jb];
+    </CODE>
+  - returns false otherwise.
+*/
+bool
+column_lower(const Matrix<PIP_Tree_Node::Row>& tableau,
+             const std::vector<dimension_type>& mapping,
+             const std::vector<bool>& basis,
+             const PIP_Tree_Node::Row& pivot_a, const dimension_type ja,
+             const PIP_Tree_Node::Row& pivot_b, const dimension_type jb,
+             Coefficient_traits::const_reference cst_a = -1,
+             Coefficient_traits::const_reference cst_b = -1) {
+  Coefficient_traits::const_reference sij_a = pivot_a.get(ja);
+  Coefficient_traits::const_reference sij_b = pivot_b.get(jb);
+  PPL_ASSERT(sij_a > 0);
+  PPL_ASSERT(sij_b > 0);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(lhs_coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(rhs_coeff);
+  lhs_coeff = cst_a * sij_b;
+  rhs_coeff = cst_b * sij_a;
+
+  const int lhs_coeff_sign = sgn(lhs_coeff);
+  const int rhs_coeff_sign = sgn(rhs_coeff);
+
+  if (ja == jb) {
+    // Same column: just compare the ratios.
+    // This works since all columns are lexico-positive.
+    return lhs_coeff > rhs_coeff;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+  PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+  const dimension_type num_vars = mapping.size();
+  dimension_type k = 0;
+  // While loop guard is: (k < num_rows && lhs == rhs).
+  // Return value is false, if k >= num_rows; it is equivalent to
+  // lhs < rhs, otherwise.
+  // Try to optimize the computation of lhs and rhs.
+  WEIGHT_BEGIN();
+  while (true) {
+    const dimension_type mk = mapping[k];
+    const bool in_base = basis[k];
+    if (++k >= num_vars)
+      return false;
+    if (in_base) {
+      // Reconstitute the identity submatrix part of tableau.
+      if (mk == ja) {
+        // Optimizing for: lhs == lhs_coeff && rhs == 0;
+        if (lhs_coeff == 0)
+          continue;
+        else
+          return lhs_coeff > 0;
+      }
+      if (mk == jb) {
+        // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+        if (rhs_coeff == 0)
+          continue;
+        else
+          return 0 > rhs_coeff;
+      }
+      // Optimizing for: lhs == 0 && rhs == 0;
+      continue;
+    }
+    else {
+      // Not in base.
+      const PIP_Tree_Node::Row& t_mk = tableau[mk];
+      Coefficient_traits::const_reference t_mk_ja = t_mk.get(ja);
+      Coefficient_traits::const_reference t_mk_jb = t_mk.get(jb);
+      if (t_mk_ja == 0)
+        if (t_mk_jb == 0)
+          continue;
+        else {
+          const int rhs_sign = rhs_coeff_sign * sgn(t_mk_jb);
+          if (0 == rhs_sign)
+            continue;
+          else
+            return 0 > rhs_sign;
+        }
+      else
+        if (t_mk_jb == 0) {
+          const int lhs_sign = lhs_coeff_sign * sgn(t_mk_ja);
+          if (lhs_sign == 0)
+            continue;
+          else
+            return lhs_sign > 0;
+        }
+        else {
+          WEIGHT_ADD(2);
+          lhs = lhs_coeff * t_mk_ja;
+          rhs = rhs_coeff * t_mk_jb;
+          if (lhs == rhs)
+            continue;
+          else
+            return lhs > rhs;
+        }
+    }
+  }
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return false;
+}
+
+/* Find the column j in revised simplex tableau such that
+  - j is in candidates
+  - (column j) / pivot_row[j] is lexico-minimal
+  When this function returns, candidates contains the minimum(s) column(s)
+  index(es).
+*/
+void
+find_lexico_minimal_column_in_set(std::vector<dimension_type>& candidates,
+                                  const Matrix<PIP_Tree_Node::Row>& tableau,
+                                  const std::vector<dimension_type>& mapping,
+                                  const std::vector<bool>& basis,
+                                  const PIP_Tree_Node::Row& pivot_row) {
+  WEIGHT_BEGIN();
+  const dimension_type num_vars = mapping.size();
+
+  PPL_ASSERT(!candidates.empty());
+  // This is used as a set, it is always sorted.
+  std::vector<dimension_type> new_candidates;
+  for (dimension_type var_index = 0; var_index < num_vars; ++var_index) {
+    new_candidates.clear();
+    std::vector<dimension_type>::const_iterator i = candidates.begin();
+    std::vector<dimension_type>::const_iterator i_end = candidates.end();
+    PPL_ASSERT(!candidates.empty());
+    new_candidates.push_back(*i);
+    dimension_type min_column = *i;
+    ++i;
+    if (i == i_end)
+      // Only one candidate left, so it is the minimum.
+      break;
+    PIP_Tree_Node::Row::const_iterator pivot_itr;
+    pivot_itr = pivot_row.find(min_column);
+    PPL_ASSERT(pivot_itr != pivot_row.end());
+    Coefficient sij_b = *pivot_itr;
+    ++pivot_itr;
+    const dimension_type row_index = mapping[var_index];
+    const bool in_base = basis[var_index];
+    if (in_base) {
+      for ( ; i != i_end; ++i) {
+        pivot_itr = pivot_row.find(pivot_itr, *i);
+        PPL_ASSERT(pivot_itr != pivot_row.end());
+        Coefficient_traits::const_reference sij_a = *pivot_itr;
+        ++pivot_itr;
+        PPL_ASSERT(sij_a > 0);
+        PPL_ASSERT(sij_b > 0);
+
+        // Reconstitute the identity submatrix part of tableau.
+        if (row_index != *i) {
+          if (row_index == min_column) {
+            // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+            new_candidates.clear();
+            min_column = *i;
+            sij_b = sij_a;
+            new_candidates.push_back(min_column);
+          }
+          else
+            // Optimizing for: lhs == 0 && rhs == 0;
+            new_candidates.push_back(*i);
+        }
+      }
+      WEIGHT_ADD_MUL(44, candidates.size());
+    }
+    else {
+      // Not in base.
+      const PIP_Tree_Node::Row& row = tableau[row_index];
+      PIP_Tree_Node::Row::const_iterator row_itr = row.lower_bound(min_column);
+      PIP_Tree_Node::Row::const_iterator row_end = row.end();
+      PPL_DIRTY_TEMP_COEFFICIENT(row_jb);
+      if (row_itr == row_end || row_itr.index() > min_column)
+        row_jb = 0;
+      else {
+        PPL_ASSERT(row_itr.index() == min_column);
+        row_jb = *row_itr;
+        ++row_itr;
+      }
+      for ( ; i != i_end; ++i) {
+        pivot_itr = pivot_row.find(pivot_itr, *i);
+        PPL_ASSERT(pivot_itr != pivot_row.end());
+        Coefficient_traits::const_reference sij_a = *pivot_itr;
+        PPL_ASSERT(sij_a > 0);
+        PPL_ASSERT(sij_b > 0);
+
+        PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+        PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+        if (row_itr != row_end && row_itr.index() < *i)
+          row_itr = row.lower_bound(row_itr, *i);
+        PPL_DIRTY_TEMP_COEFFICIENT(row_ja);
+        if (row_itr == row_end || row_itr.index() > *i)
+          row_ja = 0;
+        else {
+          PPL_ASSERT(row_itr.index() == *i);
+          row_ja = *row_itr;
+          ++row_itr;
+        }
+
+        // lhs is actually the left-hand side with toggled sign.
+        // rhs is actually the right-hand side with toggled sign.
+        lhs = sij_b * row_ja;
+        rhs = sij_a * row_jb;
+        if (lhs == rhs)
+          new_candidates.push_back(*i);
+        else
+          if (lhs < rhs) {
+            new_candidates.clear();
+            min_column = *i;
+            row_jb = row_ja;
+            sij_b = sij_a;
+            new_candidates.push_back(min_column);
+          }
+      }
+      WEIGHT_ADD_MUL(68, candidates.size());
+    }
+    using std::swap;
+    swap(candidates, new_candidates);
+  }
+}
+
+/* Find the column j in revised simplex tableau such that
+  - pivot_row[j] is positive;
+  - (column j) / pivot_row[j] is lexico-minimal.
+*/
+bool
+find_lexico_minimal_column(const Matrix<PIP_Tree_Node::Row>& tableau,
+                           const std::vector<dimension_type>& mapping,
+                           const std::vector<bool>& basis,
+                           const PIP_Tree_Node::Row& pivot_row,
+                           const dimension_type start_j,
+                           dimension_type& j_out) {
+  WEIGHT_BEGIN();
+  const dimension_type num_columns = tableau.num_columns();
+
+  PPL_ASSERT(start_j <= pivot_row.size());
+  if (start_j == pivot_row.size())
+    // There are no candidates, so there is no minimum.
+    return false;
+
+  // This is used as a set, it is always sorted.
+  std::vector<dimension_type> candidates;
+  for (PIP_Tree_Node::Row::const_iterator i = pivot_row.lower_bound(start_j),
+         i_end = pivot_row.end(); i != i_end; ++i) {
+    if (*i > 0)
+      candidates.push_back(i.index());
+  }
+  WEIGHT_ADD_MUL(201, candidates.size());
+
+  if (candidates.empty()) {
+    j_out = num_columns;
+    return false;
+  }
+
+  find_lexico_minimal_column_in_set(candidates, tableau,
+                                    mapping, basis, pivot_row);
+  PPL_ASSERT(!candidates.empty());
+  j_out = *(candidates.begin());
+
+  return true;
+}
+
+// Computes into gcd the GCD of gcd and all coefficients in [first, last).
+template <typename Iter>
+void
+gcd_assign_iter(Coefficient& gcd, Iter first, Iter last) {
+  PPL_ASSERT(gcd != 0);
+  if (gcd < 0)
+    neg_assign(gcd);
+  if (gcd == 1)
+    return;
+  WEIGHT_BEGIN();
+  for ( ; first != last; ++first) {
+    Coefficient_traits::const_reference coeff = *first;
+    if (coeff != 0) {
+      WEIGHT_ADD(24);
+      gcd_assign(gcd, coeff, gcd);
+      if (gcd == 1)
+        return;
+    }
+  }
+}
+
+// Simplify row by exploiting variable integrality.
+void
+integral_simplification(PIP_Tree_Node::Row& row) {
+  if (row[0] != 0) {
+    PIP_Tree_Node::Row::const_iterator j_begin = row.begin();
+    PIP_Tree_Node::Row::const_iterator j_end = row.end();
+    PPL_ASSERT(j_begin != j_end && j_begin.index() == 0 && *j_begin != 0);
+    /* Find next column with a non-zero value (there should be one). */
+    ++j_begin;
+    PPL_ASSERT(j_begin != j_end);
+    for ( ; *j_begin == 0; ++j_begin)
+      PPL_ASSERT(j_begin != j_end);
+    /* Use it to initialize gcd. */
+    PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+    gcd = *j_begin;
+    ++j_begin;
+    gcd_assign_iter(gcd, j_begin, j_end);
+    if (gcd != 1) {
+      PPL_DIRTY_TEMP_COEFFICIENT(mod);
+      pos_rem_assign(mod, row[0], gcd);
+      row[0] -= mod;
+    }
+  }
+  /* Final normalization. */
+  row.normalize();
+}
+
+// Divide all coefficients in row x and denominator y by their GCD.
+void
+row_normalize(PIP_Tree_Node::Row& x, Coefficient& denom) {
+  if (denom == 1)
+    return;
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  gcd = denom;
+  gcd_assign_iter(gcd, x.begin(), x.end());
+
+  // Divide the coefficients by the GCD.
+  WEIGHT_BEGIN();
+  for (PIP_Tree_Node::Row::iterator i = x.begin(),
+         i_end = x.end(); i != i_end; ++i) {
+    Coefficient& x_i = *i;
+    exact_div_assign(x_i, x_i, gcd);
+    WEIGHT_ADD(22);
+  }
+  // Divide the denominator by the GCD.
+  exact_div_assign(denom, denom, gcd);
+}
+
+// This is here because it is used as a template argument in
+// compatibility_check_find_pivot, so it must be a global declaration.
+struct compatibility_check_find_pivot_in_set_data {
+  dimension_type row_index;
+  // We cache cost and value to avoid calling get() multiple times.
+  Coefficient cost;
+  Coefficient value;
+  bool operator==(const compatibility_check_find_pivot_in_set_data& x) const {
+    return row_index == x.row_index;
+  }
+  // Needed by std::vector to sort the values.
+  bool operator<(const compatibility_check_find_pivot_in_set_data& x) const {
+    return row_index < x.row_index;
+  }
+};
+
+void
+compatibility_check_find_pivot_in_set(
+    std::vector<std::pair<dimension_type,
+                          compatibility_check_find_pivot_in_set_data> >&
+        candidates,
+    const Matrix<PIP_Tree_Node::Row>& s,
+    const std::vector<dimension_type>& mapping,
+    const std::vector<bool>& basis) {
+
+  typedef compatibility_check_find_pivot_in_set_data data_struct;
+  typedef std::vector<std::pair<dimension_type, data_struct> > candidates_t;
+  // This is used as a set, it is always sorted.
+  candidates_t new_candidates;
+  const dimension_type num_vars = mapping.size();
+  for (dimension_type var_index = 0; var_index < num_vars; ++var_index) {
+    const dimension_type row_index = mapping[var_index];
+    const bool in_base = basis[var_index];
+    candidates_t::const_iterator i = candidates.begin();
+    candidates_t::const_iterator i_end = candidates.end();
+    PPL_ASSERT(i != i_end);
+    dimension_type pj = i->first;
+    Coefficient cost = i->second.cost;
+    Coefficient value = i->second.value;
+    new_candidates.clear();
+    new_candidates.push_back(*i);
+    if (in_base) {
+      for (++i; i != i_end; ++i) {
+        bool found_better_pivot = false;
+
+        const dimension_type challenger_j = i->first;
+        Coefficient_traits::const_reference challenger_cost = i->second.cost;
+        PPL_ASSERT(value > 0);
+        PPL_ASSERT(i->second.value > 0);
+        PPL_ASSERT(pj < challenger_j);
+
+        const int lhs_coeff_sgn = sgn(cost);
+        const int rhs_coeff_sgn = sgn(challenger_cost);
+
+        PPL_ASSERT(pj != challenger_j);
+
+        // Reconstitute the identity submatrix part of tableau.
+        if (row_index == pj) {
+          // Optimizing for: lhs == lhs_coeff && rhs == 0;
+          if (lhs_coeff_sgn == 0)
+            new_candidates.push_back(*i);
+          else
+            found_better_pivot = (lhs_coeff_sgn > 0);
+        }
+        else {
+          if (row_index == challenger_j) {
+            // Optimizing for: lhs == 0 && rhs == rhs_coeff;
+            if (rhs_coeff_sgn == 0)
+              new_candidates.push_back(*i);
+            else
+              found_better_pivot = (0 > rhs_coeff_sgn);
+          }
+          else
+            // Optimizing for: lhs == 0 && rhs == 0;
+            new_candidates.push_back(*i);
+        }
+        if (found_better_pivot) {
+          pj = challenger_j;
+          cost = challenger_cost;
+          value = i->second.value;
+          new_candidates.clear();
+          new_candidates.push_back(*i);
+        }
+      }
+    }
+    else {
+      // Not in base.
+      const PIP_Tree_Node::Row& row = s[row_index];
+      PIP_Tree_Node::Row::const_iterator row_itr = row.lower_bound(pj);
+      PIP_Tree_Node::Row::const_iterator new_row_itr;
+      PIP_Tree_Node::Row::const_iterator row_end = row.end();
+      PPL_DIRTY_TEMP_COEFFICIENT(row_value);
+      if (row_itr != row_end && row_itr.index() == pj) {
+        row_value = *row_itr;
+        ++row_itr;
+      }
+      else
+        row_value = 0;
+      PPL_DIRTY_TEMP_COEFFICIENT(row_challenger_value);
+      for (++i; i != i_end; ++i) {
+        const dimension_type challenger_j = i->first;
+        Coefficient_traits::const_reference challenger_cost = i->second.cost;
+        Coefficient_traits::const_reference challenger_value
+          = i->second.value;
+        PPL_ASSERT(value > 0);
+        PPL_ASSERT(challenger_value > 0);
+        PPL_ASSERT(pj < challenger_j);
+
+        new_row_itr = row.find(row_itr, challenger_j);
+        if (new_row_itr != row.end()) {
+          row_challenger_value = *new_row_itr;
+          // Use new_row_itr as a hint in next iterations
+          row_itr = new_row_itr;
+        }
+        else {
+          row_challenger_value = 0;
+          // Using end() as a hint is not useful, keep the current hint.
+        }
+        PPL_ASSERT(row_challenger_value == row.get(challenger_j));
+
+        // Before computing and comparing the actual values, the signs are
+        // compared. This speeds up the code, because the values' computation
+        // is a bit expensive.
+
+        const int lhs_sign = sgn(cost) * sgn(row_value);
+        const int rhs_sign = sgn(challenger_cost) * sgn(row_challenger_value);
+
+        if (lhs_sign != rhs_sign) {
+          if (lhs_sign > rhs_sign) {
+            pj = challenger_j;
+            cost = challenger_cost;
+            value = challenger_value;
+            row_value = row_challenger_value;
+            new_candidates.clear();
+            new_candidates.push_back(*i);
+          }
+        }
+        else {
+
+          // Sign comparison is not enough this time.
+          // Do the full computation.
+
+          PPL_DIRTY_TEMP_COEFFICIENT(lhs);
+          lhs = cost;
+          lhs *= challenger_value;
+          PPL_DIRTY_TEMP_COEFFICIENT(rhs);
+          rhs = challenger_cost;
+          rhs *= value;
+
+          lhs *= row_value;
+          rhs *= row_challenger_value;
+
+          if (lhs == rhs)
+            new_candidates.push_back(*i);
+          else {
+            if (lhs > rhs) {
+              pj = challenger_j;
+              cost = challenger_cost;
+              value = challenger_value;
+              row_value = row_challenger_value;
+              new_candidates.clear();
+              new_candidates.push_back(*i);
+            }
+          }
+        }
+      }
+    }
+    using std::swap;
+    swap(candidates, new_candidates);
+  }
+}
+
+// Returns false if there is not a positive pivot candidate.
+// Otherwise, it sets pi, pj to the coordinates of the pivot in s.
+bool
+compatibility_check_find_pivot(const Matrix<PIP_Tree_Node::Row>& s,
+                               const std::vector<dimension_type>& mapping,
+                               const std::vector<bool>& basis,
+                               dimension_type& pi, dimension_type& pj) {
+  // Look for a negative RHS (i.e., constant term, stored in column 0),
+  // maximizing pivot column.
+  const dimension_type num_rows = s.num_rows();
+  typedef compatibility_check_find_pivot_in_set_data data_struct;
+  // This is used as a set, it is always sorted.
+  typedef std::vector<std::pair<dimension_type, data_struct> > candidates_t;
+  typedef std::map<dimension_type,data_struct> candidates_map_t;
+  candidates_map_t candidates_map;
+  for (dimension_type i = 0; i < num_rows; ++i) {
+    const PIP_Tree_Node::Row& s_i = s[i];
+    Coefficient_traits::const_reference s_i0 = s_i.get(0);
+    if (s_i0 < 0) {
+      dimension_type j;
+      if (!find_lexico_minimal_column(s, mapping, basis, s_i, 1, j)) {
+        // No positive pivot candidate: unfeasible problem.
+        return false;
+      }
+      Coefficient_traits::const_reference s_ij = s_i.get(j);
+      candidates_map_t::iterator itr = candidates_map.find(j);
+      if (itr == candidates_map.end()) {
+        data_struct& current_data = candidates_map[j];
+        current_data.row_index = i;
+        current_data.cost = s_i0;
+        current_data.value = s_ij;
+      }
+      else {
+        data_struct& current_data = candidates_map[j];
+        PPL_ASSERT(current_data.value > 0);
+
+        // Before computing and comparing the actual values, the signs are
+        // compared. This speeds up the code, because the values' computation
+        // is a bit expensive.
+        const int lhs_coeff_sgn = sgn(current_data.cost);
+        const int rhs_coeff_sgn = sgn(s_i0);
+
+        if (lhs_coeff_sgn != rhs_coeff_sgn) {
+          // Same column: just compare the ratios.
+          // This works since all columns are lexico-positive:
+          // return cst_a * sij_b > cst_b * sij_a.
+          if (lhs_coeff_sgn > rhs_coeff_sgn) {
+            // Found better pivot
+            current_data.row_index = i;
+            current_data.cost = s_i0;
+            current_data.value = s_ij;
+          }
+          // Otherwise, keep current pivot for this column.
+        }
+        else {
+          // Sign comparison is not enough this time.
+          // Do the full computation.
+          Coefficient_traits::const_reference value_b = s_i.get(j);
+          PPL_ASSERT(value_b > 0);
+
+          PPL_DIRTY_TEMP_COEFFICIENT(lhs_coeff);
+          lhs_coeff = current_data.cost;
+          lhs_coeff *= value_b;
+
+          PPL_DIRTY_TEMP_COEFFICIENT(rhs_coeff);
+          rhs_coeff = s_i0;
+          rhs_coeff *= current_data.value;
+
+          // Same column: just compare the ratios.
+          // This works since all columns are lexico-positive:
+          // return cst_a * sij_b > cst_b * sij_a.
+          if (lhs_coeff > rhs_coeff) {
+            // Found better pivot
+            current_data.row_index = i;
+            current_data.cost = s_i0;
+            current_data.value = s_ij;
+          }
+          // Otherwise, keep current pivot for this column.
+        }
+      }
+    }
+  }
+  candidates_t candidates;
+  for (candidates_map_t::iterator
+         i = candidates_map.begin(), i_end = candidates_map.end();
+       i != i_end; ++i)
+    candidates.push_back(*i);
+  if (!candidates.empty()) {
+    compatibility_check_find_pivot_in_set(candidates, s, mapping, basis);
+    PPL_ASSERT(!candidates.empty());
+    pi = candidates.begin()->second.row_index;
+    pj = candidates.begin()->first;
+  }
+  else {
+    pi = s.num_rows();
+    pj = 0;
+  }
+
+  return true;
+}
+
+} // namespace
+
+namespace IO_Operators {
+
+std::ostream&
+operator<<(std::ostream& os, const PIP_Tree_Node& x) {
+  x.print(os);
+  return os;
+}
+
+std::ostream&
+operator<<(std::ostream& os, const PIP_Tree_Node::Artificial_Parameter& x) {
+  const Linear_Expression& expr = static_cast<const Linear_Expression&>(x);
+  os << "(" << expr << ") div " << x.denominator();
+  return os;
+}
+
+} // namespace IO_Operators
+
+PIP_Tree_Node::PIP_Tree_Node(const PIP_Problem* owner)
+  : owner_(owner),
+    parent_(0),
+    constraints_(),
+    artificial_parameters() {
+}
+
+PIP_Tree_Node::PIP_Tree_Node(const PIP_Tree_Node& y)
+  : owner_(y.owner_),
+    parent_(0), // NOTE: parent is not copied.
+    constraints_(y.constraints_),
+    artificial_parameters(y.artificial_parameters) {
+}
+
+PIP_Tree_Node::Artificial_Parameter
+::Artificial_Parameter(const Linear_Expression& expr,
+                       Coefficient_traits::const_reference d)
+  : Linear_Expression(expr), denom(d) {
+  if (denom == 0)
+    throw std::invalid_argument("PIP_Tree_Node::Artificial_Parameter(e, d): "
+                                "denominator d is zero.");
+
+  // Normalize if needed.
+  // FIXME: Provide a proper normalization helper.
+  Linear_Expression& param_expr = *this;
+  if (denom < 0) {
+    neg_assign(denom);
+    neg_assign(param_expr);
+  }
+
+  // Compute GCD of parameter expression and denominator.
+
+  Coefficient gcd = param_expr.gcd(0, space_dimension() + 1);
+
+  if (gcd == 1)
+    return;
+
+  if (gcd == 0)
+    gcd = denom;
+  else
+    gcd_assign(gcd, denom, gcd);
+
+  if (gcd == 1)
+    return;
+
+  // Divide coefficients and denominator by their (non-trivial) GCD.
+  PPL_ASSERT(gcd > 1);
+  param_expr.exact_div_assign(gcd, 0, space_dimension() + 1);
+  Parma_Polyhedra_Library::exact_div_assign(denom, denom, gcd);
+
+  PPL_ASSERT(OK());
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter
+::operator==(const PIP_Tree_Node::Artificial_Parameter& y) const {
+  const Artificial_Parameter& x = *this;
+  if (x.space_dimension() != y.space_dimension())
+    return false;
+  if (x.denom != y.denom)
+    return false;
+  return x.is_equal_to(y);
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter
+::operator!=(const PIP_Tree_Node::Artificial_Parameter& y) const {
+  return !operator==(y);
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter::OK() const {
+  if (denom <= 0) {
+#ifndef NDEBUG
+    std::cerr << "PIP_Tree_Node::Artificial_Parameter "
+              << "has a non-positive denominator.\n";
+#endif
+    return false;
+  }
+  return true;
+}
+
+void
+PIP_Tree_Node::Artificial_Parameter::ascii_dump(std::ostream& s) const {
+  s << "artificial_parameter ";
+  Linear_Expression::ascii_dump(s);
+  s << " / " << denom << "\n";
+}
+
+bool
+PIP_Tree_Node::Artificial_Parameter::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "artificial_parameter")
+    return false;
+  if (!Linear_Expression::ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "/")
+    return false;
+  if (!(s >> denom))
+    return false;
+  PPL_ASSERT(OK());
+  return true;
+}
+
+PPL_OUTPUT_DEFINITIONS(PIP_Tree_Node::Artificial_Parameter)
+
+PIP_Solution_Node::PIP_Solution_Node(const PIP_Problem* owner)
+  : PIP_Tree_Node(owner),
+    tableau(),
+    basis(),
+    mapping(),
+    var_row(),
+    var_column(),
+    special_equality_row(0),
+    big_dimension(not_a_dimension()),
+    sign(),
+    solution(),
+    solution_valid(false) {
+}
+
+PIP_Solution_Node::PIP_Solution_Node(const PIP_Solution_Node& y)
+  : PIP_Tree_Node(y),
+    tableau(y.tableau),
+    basis(y.basis),
+    mapping(y.mapping),
+    var_row(y.var_row),
+    var_column(y.var_column),
+    special_equality_row(y.special_equality_row),
+    big_dimension(y.big_dimension),
+    sign(y.sign),
+    solution(y.solution),
+    solution_valid(y.solution_valid) {
+}
+
+PIP_Solution_Node::PIP_Solution_Node(const PIP_Solution_Node& y,
+                                     No_Constraints)
+  : PIP_Tree_Node(y.owner_), // NOTE: only copy owner.
+    tableau(y.tableau),
+    basis(y.basis),
+    mapping(y.mapping),
+    var_row(y.var_row),
+    var_column(y.var_column),
+    special_equality_row(y.special_equality_row),
+    big_dimension(y.big_dimension),
+    sign(y.sign),
+    solution(y.solution),
+    solution_valid(y.solution_valid) {
+}
+
+PIP_Solution_Node::~PIP_Solution_Node() {
+}
+
+PIP_Decision_Node::PIP_Decision_Node(const PIP_Problem* owner,
+                                     PIP_Tree_Node* fcp,
+                                     PIP_Tree_Node* tcp)
+  : PIP_Tree_Node(owner),
+    false_child(fcp),
+    true_child(tcp) {
+  if (false_child != 0)
+    false_child->set_parent(this);
+  if (true_child != 0)
+    true_child->set_parent(this);
+}
+
+PIP_Decision_Node::PIP_Decision_Node(const PIP_Decision_Node& y)
+  : PIP_Tree_Node(y),
+    false_child(0),
+    true_child(0) {
+  if (y.false_child != 0) {
+    false_child = y.false_child->clone();
+    false_child->set_parent(this);
+  }
+  // Protect false_child from exception safety issues via std::auto_ptr.
+  std::auto_ptr<PIP_Tree_Node> wrapped_node(false_child);
+  if (y.true_child != 0) {
+    true_child = y.true_child->clone();
+    true_child->set_parent(this);
+  }
+  // It is now safe to release false_child.
+  wrapped_node.release();
+}
+
+PIP_Decision_Node::~PIP_Decision_Node() {
+  delete false_child;
+  delete true_child;
+}
+
+void
+PIP_Solution_Node::set_owner(const PIP_Problem* owner) {
+  owner_ = owner;
+}
+
+void
+PIP_Decision_Node::set_owner(const PIP_Problem* owner) {
+  owner_ = owner;
+  if (false_child != 0)
+    false_child->set_owner(owner);
+  if (true_child != 0)
+    true_child->set_owner(owner);
+}
+
+bool
+PIP_Solution_Node::check_ownership(const PIP_Problem* owner) const {
+  return get_owner() == owner;
+}
+
+bool
+PIP_Decision_Node::check_ownership(const PIP_Problem* owner) const {
+  return get_owner() == owner
+    && (false_child == 0 || false_child->check_ownership(owner))
+    && (true_child == 0 || true_child->check_ownership(owner));
+}
+
+const PIP_Decision_Node*
+PIP_Decision_Node::as_decision() const {
+  return this;
+}
+
+const PIP_Decision_Node*
+PIP_Solution_Node::as_decision() const {
+  return 0;
+}
+
+const PIP_Solution_Node*
+PIP_Decision_Node::as_solution() const {
+  return 0;
+}
+
+const PIP_Solution_Node*
+PIP_Solution_Node::as_solution() const {
+  return this;
+}
+
+bool
+PIP_Solution_Node::Tableau::OK() const {
+  if (s.num_rows() != t.num_rows()) {
+#ifndef NDEBUG
+    std::cerr << "PIP_Solution_Node::Tableau matrices "
+              << "have a different number of rows.\n";
+#endif
+    return false;
+  }
+
+  if (!s.OK() || !t.OK()) {
+#ifndef NDEBUG
+    std::cerr << "A PIP_Solution_Node::Tableau matrix is broken.\n";
+#endif
+    return false;
+  }
+
+  if (denom <= 0) {
+#ifndef NDEBUG
+    std::cerr << "PIP_Solution_Node::Tableau with non-positive "
+              << "denominator.\n";
+#endif
+    return false;
+  }
+
+  // All tests passed.
+  return true;
+}
+
+bool
+PIP_Tree_Node::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // Parameter constraint system should contain no strict inequalities.
+  for (Constraint_System::const_iterator
+         i = constraints_.begin(), i_end = constraints_.end(); i != i_end; ++i)
+    if (i->is_strict_inequality()) {
+#ifndef NDEBUG
+      cerr << "The feasible region of the PIP_Problem parameter context"
+           << "is defined by a constraint system containing strict "
+           << "inequalities."
+           << endl;
+      ascii_dump(cerr);
+#endif
+      return false;
+    }
+  return true;
+}
+
+void
+PIP_Tree_Node
+::add_constraint(const Row& row, const Variables_Set& parameters) {
+  // Compute the expression for the parameter constraint.
+  Linear_Expression expr = Linear_Expression(row.get(0));
+  Variables_Set::const_iterator j = parameters.begin();
+  if (!parameters.empty()) {
+    // Needed to avoid reallocations in expr when iterating upward.
+    add_mul_assign(expr, 0, Variable(*(parameters.rbegin())));
+    // The number of increments of j plus one.
+    dimension_type j_index = 1;
+    Row::const_iterator i = row.begin();
+    Row::const_iterator i_end = row.end();
+    if (i != i_end && i.index() == 0)
+      ++i;
+    // NOTE: iterating in [1..num_params].
+    WEIGHT_BEGIN();
+    for ( ; i != i_end; ++i) {
+      PPL_ASSERT(i.index() <= parameters.size());
+      std::advance(j, i.index() - j_index);
+      j_index = i.index();
+      WEIGHT_ADD(74);
+      add_mul_assign(expr, *i, Variable(*j));
+    }
+  }
+  // Add the parameter constraint.
+  constraints_.insert(expr >= 0);
+}
+
+void
+PIP_Tree_Node::parent_merge() {
+  const PIP_Decision_Node& parent = *parent_;
+
+  // Merge the parent's artificial parameters.
+  artificial_parameters.insert(artificial_parameters.begin(),
+                               parent.art_parameter_begin(),
+                               parent.art_parameter_end());
+
+  PPL_ASSERT(OK());
+}
+
+bool
+PIP_Solution_Node::OK() const {
+#ifndef NDEBUG
+  using std::cerr;
+#endif
+  if (!PIP_Tree_Node::OK())
+    return false;
+
+  // Check that every member used is OK.
+
+  if (!tableau.OK())
+    return false;
+
+  // Check coherency of basis, mapping, var_row and var_column
+  if (basis.size() != mapping.size()) {
+#ifndef NDEBUG
+    cerr << "The PIP_Solution_Node::basis and PIP_Solution_Node::mapping "
+         << "vectors do not have the same number of elements.\n";
+#endif
+    return false;
+  }
+  if (basis.size() != var_row.size() + var_column.size()) {
+#ifndef NDEBUG
+    cerr << "The sum of number of elements in the PIP_Solution_Node::var_row "
+         << "and PIP_Solution_Node::var_column vectors is different from the "
+         << "number of elements in the PIP_Solution_Node::basis vector.\n";
+#endif
+    return false;
+  }
+  if (var_column.size() != tableau.s.num_columns()) {
+#ifndef NDEBUG
+    cerr << "The number of elements in the PIP_Solution_Node::var_column "
+         << "vector is different from the number of columns in the "
+         << "PIP_Solution_Node::tableau.s matrix.\n";
+#endif
+    return false;
+  }
+  if (var_row.size() != tableau.s.num_rows()) {
+#ifndef NDEBUG
+    cerr << "The number of elements in the PIP_Solution_Node::var_row "
+         << "vector is different from the number of rows in the "
+         << "PIP_Solution_Node::tableau.s matrix.\n";
+#endif
+    return false;
+  }
+  for (dimension_type i = mapping.size(); i-- > 0; ) {
+    const dimension_type row_column = mapping[i];
+    if (basis[i] && var_column[row_column] != i) {
+#ifndef NDEBUG
+      cerr << "Variable " << i << " is basic and corresponds to column "
+           << row_column << " but PIP_Solution_Node::var_column["
+           << row_column << "] does not correspond to variable " << i
+           << ".\n";
+#endif
+      return false;
+    }
+    if (!basis[i] && var_row[row_column] != i) {
+#ifndef NDEBUG
+      cerr << "Variable " << i << " is nonbasic and corresponds to row "
+           << row_column << " but PIP_Solution_Node::var_row["
+           << row_column << "] does not correspond to variable " << i
+           << ".\n";
+#endif
+      return false;
+    }
+  }
+  // All checks passed.
+  return true;
+}
+
+bool
+PIP_Decision_Node::OK() const {
+  // Perform base class well-formedness check on this node.
+  if (!PIP_Tree_Node::OK())
+    return false;
+
+  // Recursively check if child nodes are well-formed.
+  if (false_child != 0 && !false_child->OK())
+    return false;
+  if (true_child != 0 && !true_child->OK())
+    return false;
+
+  // Decision nodes should always have a true child.
+  if (true_child == 0) {
+#ifndef NDEBUG
+    std::cerr << "PIP_Decision_Node with no 'true' child.\n";
+#endif
+    return false;
+  }
+
+  // Decision nodes with a false child must have exactly one constraint.
+  if (false_child != 0) {
+    const dimension_type dist = Implementation::num_constraints(constraints_);
+    if (dist != 1) {
+#ifndef NDEBUG
+      std::cerr << "PIP_Decision_Node with a 'false' child has "
+                << dist << " parametric constraints (should be 1).\n";
+#endif
+      return false;
+    }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+void
+PIP_Decision_Node::update_tableau(
+    const PIP_Problem& pip,
+    const dimension_type external_space_dim,
+    const dimension_type first_pending_constraint,
+    const Constraint_Sequence& input_cs,
+    const Variables_Set& parameters) {
+
+  true_child->update_tableau(pip,
+                             external_space_dim,
+                             first_pending_constraint,
+                             input_cs,
+                             parameters);
+  if (false_child != 0)
+    false_child->update_tableau(pip,
+                                external_space_dim,
+                                first_pending_constraint,
+                                input_cs,
+                                parameters);
+  PPL_ASSERT(OK());
+}
+
+PIP_Tree_Node*
+PIP_Decision_Node::solve(const PIP_Problem& pip,
+                         const bool check_feasible_context,
+                         const Matrix<Row>& context,
+                         const Variables_Set& params,
+                         dimension_type space_dim,
+                         const int indent_level) {
+  PPL_ASSERT(indent_level >= 0);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+  indent_and_print(std::cerr, indent_level, "=== SOLVING DECISION NODE\n");
+#else
+  PPL_USED(indent_level);
+#endif
+  PPL_ASSERT(true_child != 0);
+  Matrix<Row> context_true(context);
+  Variables_Set all_params(params);
+  const dimension_type num_art_params = artificial_parameters.size();
+  add_artificial_parameters(context_true, all_params, space_dim,
+                            num_art_params);
+  merge_assign(context_true, constraints_, all_params);
+  const bool has_false_child = (false_child != 0);
+  const bool has_true_child = (true_child != 0);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+  indent_and_print(std::cerr, indent_level,
+                   "=== DECISION: SOLVING THEN CHILD\n");
+#endif
+  true_child = true_child->solve(pip, check_feasible_context,
+                                 context_true, all_params, space_dim,
+                                 indent_level + 1);
+
+  if (has_false_child) {
+    // Decision nodes with false child must have exactly one constraint
+    PPL_ASSERT(1 == Implementation::num_constraints(constraints_));
+    // NOTE: modify context_true in place, complementing its last constraint.
+    Matrix<Row>& context_false = context_true;
+    Row& last = context_false[context_false.num_rows() - 1];
+    complement_assign(last, last, 1);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+    indent_and_print(std::cerr, indent_level,
+                     "=== DECISION: SOLVING ELSE CHILD\n");
+#endif
+    false_child = false_child->solve(pip, check_feasible_context,
+                                     context_false, all_params, space_dim,
+                                     indent_level + 1);
+  }
+
+  if (true_child == 0 && false_child == 0) {
+    // No children: the whole subtree is unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+    indent_and_print(std::cerr, indent_level,
+                     "=== DECISION: BOTH BRANCHES NOW UNFEASIBLE: _|_\n");
+#endif
+    delete this;
+    return 0;
+  }
+
+  if (has_false_child && false_child == 0) {
+    // False child has become unfeasible: merge this node's artificials with
+    // the true child, while removing the local parameter constraints, which
+    // are no longer discriminative.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+    indent_and_print(std::cerr, indent_level,
+                     "=== DECISION: ELSE BRANCH NOW UNFEASIBLE\n");
+    indent_and_print(std::cerr, indent_level,
+                     "==> merge then branch with parent.\n");
+#endif
+    PIP_Tree_Node* const node = true_child;
+    node->parent_merge();
+    node->set_parent(parent());
+    true_child = 0;
+    delete this;
+    PPL_ASSERT(node->OK());
+    return node;
+  }
+  else if (has_true_child && true_child == 0) {
+    // True child has become unfeasible: merge this node's artificials
+    // with the false child.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+    indent_and_print(std::cerr, indent_level,
+                     "=== DECISION: THEN BRANCH NOW UNFEASIBLE\n");
+    indent_and_print(std::cerr, indent_level,
+                     "==> merge else branch with parent.\n");
+#endif
+    PIP_Tree_Node* const node = false_child;
+    node->parent_merge();
+    node->set_parent(parent());
+    false_child = 0;
+    delete this;
+    PPL_ASSERT(node->OK());
+    return node;
+  }
+  else if (check_feasible_context) {
+    // Test all constraints for redundancy with the context, and eliminate
+    // them if not necessary.
+    Constraint_System cs;
+    swap(cs, constraints_);
+    for (Constraint_System::const_iterator ci = cs.begin(),
+           ci_end = cs.end(); ci != ci_end; ++ci) {
+      Matrix<Row> ctx_copy(context);
+      merge_assign(ctx_copy, Constraint_System(*ci), all_params);
+      Row& last = ctx_copy[ctx_copy.num_rows()-1];
+      complement_assign(last, last, 1);
+      if (compatibility_check(ctx_copy)) {
+        // The constraint is not redundant with the context: keep it.
+        constraints_.insert(*ci);
+      }
+    }
+    // If the constraints set has become empty, only keep the true child.
+    if (constraints_.empty()) {
+#ifdef NOISY_PIP_TREE_STRUCTURE
+      indent_and_print(std::cerr, indent_level,
+                       "=== DECISION: NO BRANCHING CONSTRAINTS LEFT\n");
+      indent_and_print(std::cerr, indent_level,
+                       "==> merge then branch with parent.\n");
+#endif
+      PIP_Tree_Node* const node = true_child;
+      node->parent_merge();
+      node->set_parent(parent());
+      true_child = 0;
+      delete this;
+      PPL_ASSERT(node->OK());
+      return node;
+    }
+  }
+  PPL_ASSERT(OK());
+  return this;
+}
+
+void
+PIP_Decision_Node::ascii_dump(std::ostream& s) const {
+  // Dump base class info.
+  PIP_Tree_Node::ascii_dump(s);
+
+  // Dump true child (if any).
+  s << "\ntrue_child: ";
+  if (true_child == 0) {
+    // Note: this branch should normally be unreachable code, since a
+    // well-formed decision node always has a true child. We keep this code
+    // for debugging purposes (since we want to dump broken nodes).
+    s << "BOTTOM\n";
+  }
+  else if (const PIP_Decision_Node* const dec = true_child->as_decision()) {
+    s << "DECISION\n";
+    dec->ascii_dump(s);
+  }
+  else {
+    const PIP_Solution_Node* const sol = true_child->as_solution();
+    PPL_ASSERT(sol != 0);
+    s << "SOLUTION\n";
+    sol->ascii_dump(s);
+  }
+
+  // Dump false child (if any).
+  s << "\nfalse_child: ";
+  if (false_child == 0)
+    s << "BOTTOM\n";
+  else if (const PIP_Decision_Node* const dec = false_child->as_decision()) {
+    // Note: this branch should normally be unreachable code.
+    // Since a well-formed decision node having a false child should have
+    // a single context constraint, its false child will have no context
+    // constraints at all, so that no further branch is possible.
+    // We keep this code for debugging purposes.
+    s << "DECISION\n";
+    dec->ascii_dump(s);
+  }
+  else {
+    const PIP_Solution_Node* const sol = false_child->as_solution();
+    PPL_ASSERT(sol != 0);
+    s << "SOLUTION\n";
+    sol->ascii_dump(s);
+  }
+}
+
+bool
+PIP_Decision_Node::ascii_load(std::istream& s) {
+  std::string str;
+
+  // Load base class info.
+  if (!PIP_Tree_Node::ascii_load(s))
+    return false;
+
+  // Release the "true" subtree (if any).
+  delete true_child;
+  true_child = 0;
+
+  // Load true child (if any).
+  if (!(s >> str) || str != "true_child:")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "BOTTOM")
+    // Note: normally unreachable code (see comment on ascii_dump).
+    true_child = 0;
+  else if (str == "DECISION") {
+    PIP_Decision_Node* const dec = new PIP_Decision_Node(0, 0, 0);
+    true_child = dec;
+    if (!dec->ascii_load(s))
+      return false;
+  }
+  else if (str == "SOLUTION") {
+    PIP_Solution_Node* const sol = new PIP_Solution_Node(0);
+    true_child = sol;
+    if (!sol->ascii_load(s))
+      return false;
+  }
+  else
+    // Unknown node kind.
+    return false;
+
+  // Release the "false" subtree (if any).
+  delete false_child;
+  false_child = 0;
+
+  // Load false child (if any).
+  if (!(s >> str) || str != "false_child:")
+    return false;
+  if (!(s >> str))
+    return false;
+  if (str == "BOTTOM")
+    false_child = 0;
+  else if (str == "DECISION") {
+    // Note: normally unreachable code (see comment on ascii_dump).
+    PIP_Decision_Node* const dec = new PIP_Decision_Node(0, 0, 0);
+    false_child = dec;
+    if (!dec->ascii_load(s))
+      return false;
+  }
+  else if (str == "SOLUTION") {
+    PIP_Solution_Node* const sol = new PIP_Solution_Node(0);
+    false_child = sol;
+    if (!sol->ascii_load(s))
+      return false;
+  }
+  else
+    // Unknown node kind.
+    return false;
+
+  // Loaded all info.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+
+void
+PIP_Solution_Node::Tableau::normalize() {
+  if (denom == 1)
+    return;
+
+  const dimension_type num_rows = s.num_rows();
+
+  // Compute global gcd.
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  gcd = denom;
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    WEIGHT_BEGIN();
+    const Row& s_i = s[i];
+    for (Row::const_iterator
+           j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference s_ij = *j;
+      if (s_ij != 0) {
+        WEIGHT_ADD(30);
+        gcd_assign(gcd, s_ij, gcd);
+        if (gcd == 1)
+          return;
+      }
+    }
+    WEIGHT_BEGIN();
+    const Row& t_i = t[i];
+    for (Row::const_iterator
+           j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference t_ij = *j;
+      if (t_ij != 0) {
+        WEIGHT_ADD(14);
+        gcd_assign(gcd, t_ij, gcd);
+        if (gcd == 1)
+          return;
+      }
+    }
+  }
+  PPL_ASSERT(gcd > 1);
+  // Normalize all coefficients.
+  WEIGHT_BEGIN();
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    Row& s_i = s[i];
+    for (Row::iterator j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+      Coefficient& s_ij = *j;
+      WEIGHT_ADD(19);
+      exact_div_assign(s_ij, s_ij, gcd);
+    }
+    Row& t_i = t[i];
+    for (Row::iterator j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+      Coefficient& t_ij = *j;
+      WEIGHT_ADD(27);
+      exact_div_assign(t_ij, t_ij, gcd);
+    }
+  }
+  // Normalize denominator.
+  exact_div_assign(denom, denom, gcd);
+}
+
+void
+PIP_Solution_Node::Tableau::scale(Coefficient_traits::const_reference ratio) {
+  WEIGHT_BEGIN();
+  for (dimension_type i = s.num_rows(); i-- > 0; ) {
+    Row& s_i = s[i];
+    for (Row::iterator j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+      WEIGHT_ADD(19);
+      *j *= ratio;
+    }
+    Row& t_i = t[i];
+    for (Row::iterator j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+      WEIGHT_ADD(25);
+      *j *= ratio;
+    }
+  }
+  denom *= ratio;
+}
+
+bool
+PIP_Solution_Node::Tableau
+::is_better_pivot(const std::vector<dimension_type>& mapping,
+                  const std::vector<bool>& basis,
+                  const dimension_type row_0,
+                  const dimension_type col_0,
+                  const dimension_type row_1,
+                  const dimension_type col_1) const {
+  const dimension_type num_params = t.num_columns();
+  const dimension_type num_rows = s.num_rows();
+  const Row& s_0 = s[row_0];
+  const Row& s_1 = s[row_1];
+  Coefficient_traits::const_reference s_0_0 = s_0.get(col_0);
+  Coefficient_traits::const_reference s_1_1 = s_1.get(col_1);
+  const Row& t_0 = t[row_0];
+  const Row& t_1 = t[row_1];
+  PPL_DIRTY_TEMP_COEFFICIENT(product_0);
+  PPL_DIRTY_TEMP_COEFFICIENT(product_1);
+  WEIGHT_BEGIN();
+  // On exit from the loop, if j_mismatch == num_params then
+  // no column mismatch was found.
+  dimension_type j_mismatch = num_params;
+  Row::const_iterator j0 = t_0.end();
+  Row::const_iterator j0_end = t_0.end();
+  Row::const_iterator j1 = t_1.end();
+  Row::const_iterator j1_end = t_1.end();
+  for (dimension_type i = 0; i < num_rows; ++i) {
+    const Row& s_i = s[i];
+    Coefficient_traits::const_reference s_i_col_0 = s_i.get(col_0);
+    Coefficient_traits::const_reference s_i_col_1 = s_i.get(col_1);
+    j0 = t_0.begin();
+    j1 = t_1.begin();
+    while (j0 != j0_end && j1 != j1_end) {
+      if (j0.index() == j1.index()) {
+        WEIGHT_ADD(1361);
+        product_0 = (*j0) * s_1_1 * s_i_col_0;
+        product_1 = (*j1) * s_0_0 * s_i_col_1;
+        if (product_0 != product_1) {
+          // Mismatch found: exit from both loops.
+          j_mismatch = j0.index();
+          goto end_loop;
+        }
+        ++j0;
+        ++j1;
+      }
+      else
+        if (j0.index() < j1.index()) {
+          if (*j0 != 0 && s_1_1 != 0 && s_i_col_0 != 0) {
+            // Mismatch found: exit from both loops.
+            j_mismatch = j0.index();
+            goto end_loop;
+          }
+          ++j0;
+        }
+        else {
+          PPL_ASSERT(j0.index() > j1.index());
+          if (*j1 != 0 && s_0_0 != 0 && s_i_col_1 != 0) {
+            // Mismatch found: exit from both loops.
+            j_mismatch = j1.index();
+            goto end_loop;
+          }
+          ++j1;
+        }
+    }
+    while (j0 != j0_end) {
+      if (*j0 != 0 && s_1_1 != 0 && s_i_col_0 != 0) {
+        // Mismatch found: exit from both loops.
+        j_mismatch = j0.index();
+        goto end_loop;
+      }
+      ++j0;
+    }
+    while (j1 != j1_end) {
+      if (*j1 != 0 && s_0_0 != 0 && s_i_col_1 != 0) {
+        // Mismatch found: exit from both loops.
+        j_mismatch = j1.index();
+        goto end_loop;
+      }
+    }
+  }
+
+ end_loop:
+  return (j_mismatch != num_params)
+    && column_lower(s, mapping, basis, s_0, col_0, s_1, col_1, *j0, *j1);
+}
+
+void
+PIP_Tree_Node::ascii_dump(std::ostream& s) const {
+  s << "constraints_\n";
+  constraints_.ascii_dump(s);
+  const dimension_type artificial_parameters_size
+    = artificial_parameters.size();
+  s << "\nartificial_parameters( " << artificial_parameters_size << " )\n";
+  for (dimension_type i = 0; i < artificial_parameters_size; ++i)
+    artificial_parameters[i].ascii_dump(s);
+}
+
+bool
+PIP_Tree_Node::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "constraints_")
+    return false;
+  constraints_.ascii_load(s);
+
+  if (!(s >> str) || str != "artificial_parameters(")
+    return false;
+  dimension_type artificial_parameters_size;
+  if (!(s >> artificial_parameters_size))
+    return false;
+  if (!(s >> str) || str != ")")
+    return false;
+  Artificial_Parameter ap;
+  for (dimension_type i = 0; i < artificial_parameters_size; ++i) {
+    if (!ap.ascii_load(s))
+      return false;
+    artificial_parameters.push_back(ap);
+  }
+
+  // Note: do not assert OK() here.
+  // The node invariants should be checked on derived nodes.
+  return true;
+}
+
+PIP_Tree_Node*
+PIP_Solution_Node::clone() const {
+  return new PIP_Solution_Node(*this);
+}
+
+PIP_Tree_Node*
+PIP_Decision_Node::clone() const {
+  return new PIP_Decision_Node(*this);
+}
+
+void
+PIP_Solution_Node::Tableau::ascii_dump(std::ostream& os) const {
+  os << "denominator " << denom << "\n";
+  os << "variables ";
+  s.ascii_dump(os);
+  os << "parameters ";
+  t.ascii_dump(os);
+}
+
+bool
+PIP_Solution_Node::Tableau::ascii_load(std::istream& is) {
+  std::string str;
+  if (!(is >> str) || str != "denominator")
+    return false;
+  Coefficient d;
+  if (!(is >> d))
+    return false;
+  denom = d;
+  if (!(is >> str) || str != "variables")
+    return false;
+  if (!s.ascii_load(is))
+    return false;
+  if (!(is >> str) || str != "parameters")
+    return false;
+  if (!t.ascii_load(is))
+    return false;
+  PPL_ASSERT(OK());
+  return true;
+}
+
+void
+PIP_Solution_Node::ascii_dump(std::ostream& os) const {
+  PIP_Tree_Node::ascii_dump(os);
+
+  os << "\ntableau\n";
+  tableau.ascii_dump(os);
+
+  os << "\nbasis ";
+  const dimension_type basis_size = basis.size();
+  os << basis_size;
+  for (dimension_type i = 0; i < basis_size; ++i)
+    os << (basis[i] ? " true" : " false");
+
+  os << "\nmapping ";
+  const dimension_type mapping_size = mapping.size();
+  os << mapping_size;
+  for (dimension_type i = 0; i < mapping_size; ++i)
+    os << " " << mapping[i];
+
+  os << "\nvar_row ";
+  const dimension_type var_row_size = var_row.size();
+  os << var_row_size;
+  for (dimension_type i = 0; i < var_row_size; ++i)
+    os << " " << var_row[i];
+
+  os << "\nvar_column ";
+  const dimension_type var_column_size = var_column.size();
+  os << var_column_size;
+  for (dimension_type i = 0; i < var_column_size; ++i)
+    os << " " << var_column[i];
+  os << "\n";
+
+  os << "special_equality_row " << special_equality_row << "\n";
+  os << "big_dimension " << big_dimension << "\n";
+
+  os << "sign ";
+  const dimension_type sign_size = sign.size();
+  os << sign_size;
+  for (dimension_type i = 0; i < sign_size; ++i) {
+    os << " ";
+    switch (sign[i]) {
+    case UNKNOWN:
+      os << "UNKNOWN";
+      break;
+    case ZERO:
+      os << "ZERO";
+      break;
+    case POSITIVE:
+      os << "POSITIVE";
+      break;
+    case NEGATIVE:
+      os << "NEGATIVE";
+      break;
+    case MIXED:
+      os << "MIXED";
+      break;
+    }
+  }
+  os << "\n";
+
+  const dimension_type solution_size = solution.size();
+  os << "solution " << solution_size << "\n";
+  for (dimension_type i = 0; i < solution_size; ++i)
+    solution[i].ascii_dump(os);
+  os << "\n";
+
+  os << "solution_valid " << (solution_valid ? "true" : "false") << "\n";
+}
+
+bool
+PIP_Solution_Node::ascii_load(std::istream& is) {
+  if (!PIP_Tree_Node::ascii_load(is))
+    return false;
+
+  std::string str;
+  if (!(is >> str) || str != "tableau")
+    return false;
+  if (!tableau.ascii_load(is))
+    return false;
+
+  if (!(is >> str) || str != "basis")
+    return false;
+  dimension_type basis_size;
+  if (!(is >> basis_size))
+    return false;
+  basis.clear();
+  for (dimension_type i = 0; i < basis_size; ++i) {
+    if (!(is >> str))
+      return false;
+    bool val = false;
+    if (str == "true")
+      val = true;
+    else if (str != "false")
+      return false;
+    basis.push_back(val);
+  }
+
+  if (!(is >> str) || str != "mapping")
+    return false;
+  dimension_type mapping_size;
+  if (!(is >> mapping_size))
+    return false;
+  mapping.clear();
+  for (dimension_type i = 0; i < mapping_size; ++i) {
+    dimension_type val;
+    if (!(is >> val))
+      return false;
+    mapping.push_back(val);
+  }
+
+  if (!(is >> str) || str != "var_row")
+    return false;
+  dimension_type var_row_size;
+  if (!(is >> var_row_size))
+    return false;
+  var_row.clear();
+  for (dimension_type i = 0; i < var_row_size; ++i) {
+    dimension_type val;
+    if (!(is >> val))
+      return false;
+    var_row.push_back(val);
+  }
+
+  if (!(is >> str) || str != "var_column")
+    return false;
+  dimension_type var_column_size;
+  if (!(is >> var_column_size))
+    return false;
+  var_column.clear();
+  for (dimension_type i = 0; i < var_column_size; ++i) {
+    dimension_type val;
+    if (!(is >> val))
+      return false;
+    var_column.push_back(val);
+  }
+
+  if (!(is >> str) || str != "special_equality_row")
+    return false;
+  if (!(is >> special_equality_row))
+    return false;
+
+  if (!(is >> str) || str != "big_dimension")
+    return false;
+  if (!(is >> big_dimension))
+    return false;
+
+  if (!(is >> str) || str != "sign")
+    return false;
+  dimension_type sign_size;
+  if (!(is >> sign_size))
+    return false;
+  sign.clear();
+  for (dimension_type i = 0; i < sign_size; ++i) {
+    if (!(is >> str))
+      return false;
+    Row_Sign val;
+    if (str == "UNKNOWN")
+      val = UNKNOWN;
+    else if (str == "ZERO")
+      val = ZERO;
+    else if (str == "POSITIVE")
+      val = POSITIVE;
+    else if (str == "NEGATIVE")
+      val = NEGATIVE;
+    else if (str == "MIXED")
+      val = MIXED;
+    else
+      return false;
+    sign.push_back(val);
+  }
+
+  if (!(is >> str) || str != "solution")
+    return false;
+  dimension_type solution_size;
+  if (!(is >> solution_size))
+    return false;
+  solution.clear();
+  for (dimension_type i = 0; i < solution_size; ++i) {
+    Linear_Expression val;
+    if (!val.ascii_load(is))
+      return false;
+    solution.push_back(val);
+  }
+
+  if (!(is >> str) || str != "solution_valid")
+    return false;
+  if (!(is >> str))
+    return false;
+  if (str == "true")
+    solution_valid = true;
+  else if (str == "false")
+    solution_valid = false;
+  else
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+PIP_Solution_Node::Row_Sign
+PIP_Solution_Node::row_sign(const Row& x,
+                            const dimension_type big_dimension) {
+  if (big_dimension != not_a_dimension()) {
+    // If a big parameter has been set and its coefficient is not zero,
+    // then return the sign of the coefficient.
+    Coefficient_traits::const_reference x_big = x.get(big_dimension);
+    if (x_big > 0)
+      return POSITIVE;
+    if (x_big < 0)
+      return NEGATIVE;
+    // Otherwise x_big == 0, then no big parameter involved.
+  }
+
+  PIP_Solution_Node::Row_Sign sign = ZERO;
+  for (Row::const_iterator i = x.begin(), i_end = x.end(); i != i_end; ++i) {
+    Coefficient_traits::const_reference x_i = *i;
+    if (x_i > 0) {
+      if (sign == NEGATIVE)
+        return MIXED;
+      sign = POSITIVE;
+    }
+    else if (x_i < 0) {
+      if (sign == POSITIVE)
+        return MIXED;
+      sign = NEGATIVE;
+    }
+  }
+  return sign;
+}
+
+bool
+PIP_Tree_Node::compatibility_check(const Matrix<Row>& context, const Row& row) {
+  // CHECKME: do `context' and `row' have compatible (row) capacity?
+  Matrix<Row> s(context);
+  s.add_row(row);
+  return compatibility_check(s);
+}
+
+bool
+PIP_Tree_Node::compatibility_check(Matrix<Row>& s) {
+  PPL_ASSERT(s.OK());
+  // Note: num_rows may increase.
+  dimension_type num_rows = s.num_rows();
+  const dimension_type num_columns = s.num_columns();
+  const dimension_type num_vars = num_columns - 1;
+
+  std::vector<Coefficient> scaling(num_rows, 1);
+  std::vector<bool> basis;
+  basis.reserve(num_vars + num_rows);
+  std::vector<dimension_type> mapping;
+  mapping.reserve(num_vars + num_rows);
+  std::vector<dimension_type> var_row;
+  var_row.reserve(num_rows);
+  std::vector<dimension_type> var_column;
+  var_column.reserve(num_columns);
+
+  // Column 0 is the constant term, not a variable
+  var_column.push_back(not_a_dimension());
+  for (dimension_type j = 1; j <= num_vars; ++j) {
+    basis.push_back(true);
+    mapping.push_back(j);
+    var_column.push_back(j - 1);
+  }
+  for (dimension_type i = 0; i < num_rows; ++i) {
+    basis.push_back(false);
+    mapping.push_back(i);
+    var_row.push_back(i + num_vars);
+  }
+
+  // Scaling factor (i.e., denominator) for pivot coefficients.
+  PPL_DIRTY_TEMP_COEFFICIENT(pivot_denom);
+  // Allocate once and for all: short life temporaries.
+  PPL_DIRTY_TEMP_COEFFICIENT(product);
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  PPL_DIRTY_TEMP_COEFFICIENT(scale_factor);
+
+  // Perform simplex pivots on the context
+  // until we find an empty solution or an optimum.
+  while (true) {
+    // Check if the client has requested abandoning all expensive
+    // computations. If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // pi is the pivot's row index.
+    dimension_type pi = num_rows;
+    // pj is the pivot's column index.
+    dimension_type pj = 0;
+
+    const bool found_positive_pivot_candidate
+      = compatibility_check_find_pivot(s, mapping, basis, pi, pj);
+
+    if (!found_positive_pivot_candidate)
+      return false;
+
+    if (pj == 0) {
+      // No negative RHS: fractional optimum found.
+      // If it is integer, then the test is successful.
+      // Otherwise, generate a new cut.
+      bool all_integer_vars = true;
+      // NOTE: iterating downwards would be correct, but it would change
+      // the ordering of cut generation.
+      WEIGHT_BEGIN();
+      for (dimension_type i = 0; i < num_vars; ++i) {
+        if (basis[i])
+          // Basic variable = 0, hence integer.
+          continue;
+        // Not a basic variable.
+        WEIGHT_ADD(70);
+        const dimension_type mi = mapping[i];
+        Coefficient_traits::const_reference denom = scaling[mi];
+        if (s[mi].get(0) % denom == 0)
+          continue;
+        // Here constant term is not integer.
+        all_integer_vars = false;
+        // Generate a new cut.
+        var_row.push_back(mapping.size());
+        basis.push_back(false);
+        mapping.push_back(num_rows);
+        s.add_zero_rows(1);
+        Row& cut = s[num_rows];
+        ++num_rows;
+        const Row& s_mi = s[mi];
+        cut = s_mi;
+        for (Row::iterator
+               j = cut.begin(), j_end = cut.end(); j != j_end; ++j) {
+          WEIGHT_ADD(32);
+          pos_rem_assign(*j, *j, denom);
+        }
+        cut[0] -= denom;
+        scaling.push_back(denom);
+      }
+      // Check if an integer solution was found.
+      if (all_integer_vars)
+        return true;
+      else
+        continue;
+    }
+
+    // Here we have a positive s[pi][pj] pivot.
+
+    // Normalize the tableau before pivoting.
+    for (dimension_type i = num_rows; i-- > 0; )
+      row_normalize(s[i], scaling[i]);
+
+    // Update basis.
+    {
+      const dimension_type var_pi = var_row[pi];
+      const dimension_type var_pj = var_column[pj];
+      var_row[pi] = var_pj;
+      var_column[pj] = var_pi;
+      basis[var_pi] = true;
+      basis[var_pj] = false;
+      mapping[var_pi] = pj;
+      mapping[var_pj] = pi;
+    }
+
+    // Create an identity row corresponding to basic variable pj.
+    s.add_zero_rows(1);
+    Row& pivot = s[num_rows];
+    pivot[pj] = 1;
+
+    // Swap identity row with the pivot row previously found.
+    using std::swap;
+    swap(pivot, s[pi]);
+    // Save original pivot scaling factor in a temporary,
+    // then reset scaling factor for identity row.
+    pivot_denom = scaling[pi];
+    scaling[pi] = 1;
+
+    // Perform a pivot operation on the matrix.
+    Coefficient_traits::const_reference pivot_pj = pivot.get(pj);
+    {
+      for (Row::const_iterator
+             j = pivot.begin(), j_end = pivot.end(); j != j_end; ++j) {
+        if (j.index() == pj)
+          continue;
+        Coefficient_traits::const_reference pivot_j = *j;
+        // Do nothing if the j-th pivot element is zero.
+        if (pivot_j == 0)
+          continue;
+        WEIGHT_BEGIN();
+        for (dimension_type i = num_rows; i-- > 0; ) {
+          Row& s_i = s[i];
+          product = s_i.get(pj) * pivot_j;
+          if (product % pivot_pj != 0) {
+            WEIGHT_ADD(103);
+            // Must scale row s_i to stay in integer case.
+            gcd_assign(gcd, product, pivot_pj);
+            exact_div_assign(scale_factor, pivot_pj, gcd);
+            for (Row::iterator
+                   k = s_i.begin(), k_end = s_i.end(); k != k_end; ++k) {
+              WEIGHT_ADD(30);
+              *k *= scale_factor;
+            }
+            product *= scale_factor;
+            scaling[i] *= scale_factor;
+          }
+          PPL_ASSERT(product % pivot_pj == 0);
+          exact_div_assign(product, product, pivot_pj);
+          s_i[j.index()] -= product;
+          WEIGHT_ADD(134);
+        }
+      }
+    }
+    // Update column only if pivot coordinate != 1.
+    if (pivot_pj != pivot_denom) {
+      WEIGHT_BEGIN();
+      for (dimension_type i = num_rows; i-- > 0; ) {
+        Row& s_i = s[i];
+        Coefficient& s_i_pj = s_i[pj];
+        product = s_i_pj * pivot_denom;
+        if (product % pivot_pj != 0) {
+          WEIGHT_ADD(98);
+          // As above, perform row scaling.
+          gcd_assign(gcd, product, pivot_pj);
+          exact_div_assign(scale_factor, pivot_pj, gcd);
+          for (Row::iterator
+                 k = s_i.begin(), k_end = s_i.end(); k != k_end; ++k) {
+            WEIGHT_ADD(26);
+            *k *= scale_factor;
+          }
+          product *= scale_factor;
+          scaling[i] *= scale_factor;
+        }
+        PPL_ASSERT(product % pivot_pj == 0);
+        exact_div_assign(s_i_pj, product, pivot_pj);
+        WEIGHT_ADD(97);
+      }
+    }
+    // Drop pivot to restore proper matrix size.
+    s.remove_trailing_rows(1);
+  }
+
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return false;
+}
+
+void
+PIP_Solution_Node
+::update_tableau(const PIP_Problem& pip,
+                 const dimension_type external_space_dim,
+                 const dimension_type first_pending_constraint,
+                 const Constraint_Sequence& input_cs,
+                 const Variables_Set& parameters) {
+
+  // Make sure a parameter column exists, for the inhomogeneous term.
+  if (tableau.t.num_columns() == 0)
+    tableau.t.add_zero_columns(1);
+
+  // NOTE: here 'params' stands for problem (i.e., non artificial) parameters.
+  const dimension_type old_num_vars = tableau.s.num_columns();
+  const dimension_type old_num_params
+    = pip.internal_space_dim - old_num_vars;
+  const dimension_type num_added_dims
+    = pip.external_space_dim - pip.internal_space_dim;
+  const dimension_type new_num_params = parameters.size();
+  const dimension_type num_added_params = new_num_params - old_num_params;
+  const dimension_type num_added_vars = num_added_dims - num_added_params;
+
+  // Resize the two tableau matrices.
+  if (num_added_vars > 0)
+    tableau.s.add_zero_columns(num_added_vars);
+
+  if (num_added_params > 0)
+    tableau.t.add_zero_columns(num_added_params, old_num_params + 1);
+
+  dimension_type new_var_column = old_num_vars;
+  const dimension_type initial_space_dim = old_num_vars + old_num_params;
+  for (dimension_type i = initial_space_dim; i < external_space_dim; ++i) {
+    if (parameters.count(i) == 0) {
+      // A new problem variable.
+      if (tableau.s.num_rows() == 0) {
+        // No rows have been added yet
+        basis.push_back(true);
+        mapping.push_back(new_var_column);
+      }
+      else {
+        /*
+          Need to insert the original variable id
+          before the slack variable id's to respect variable ordering.
+        */
+        basis.insert(nth_iter(basis, new_var_column), true);
+        mapping.insert(nth_iter(mapping, new_var_column), new_var_column);
+        // Update variable id's of slack variables.
+        for (dimension_type j = var_row.size(); j-- > 0; )
+          if (var_row[j] >= new_var_column)
+            ++var_row[j];
+        for (dimension_type j = var_column.size(); j-- > 0; )
+          if (var_column[j] >= new_var_column)
+            ++var_column[j];
+        if (special_equality_row > 0)
+          ++special_equality_row;
+      }
+      var_column.push_back(new_var_column);
+      ++new_var_column;
+    }
+  }
+
+  if (big_dimension == not_a_dimension()
+      && pip.big_parameter_dimension != not_a_dimension()) {
+    // Compute the column number of big parameter in tableau.t matrix.
+    Variables_Set::const_iterator pos
+      = parameters.find(pip.big_parameter_dimension);
+    big_dimension = 1U
+      + static_cast<dimension_type>(std::distance(parameters.begin(), pos));
+  }
+
+  Coefficient_traits::const_reference denom = tableau.denominator();
+
+  for (Constraint_Sequence::const_iterator
+         c_iter = nth_iter(input_cs, first_pending_constraint),
+         c_end = input_cs.end(); c_iter != c_end; ++c_iter) {
+    const Constraint& constraint = *c_iter;
+    // (Tentatively) Add new rows to s and t matrices.
+    // These will be removed at the end if they turn out to be useless.
+    const dimension_type row_id = tableau.s.num_rows();
+    tableau.s.add_zero_rows(1);
+    tableau.t.add_zero_rows(1);
+    Row& v_row = tableau.s[row_id];
+    Row& p_row = tableau.t[row_id];
+
+    {
+      dimension_type p_index = 1;
+      dimension_type v_index = 0;
+      // Setting the inhomogeneous term.
+      if (constraint.inhomogeneous_term() != 0) {
+        Coefficient& p_row0 = p_row[0];
+        p_row0 = constraint.inhomogeneous_term();
+        if (constraint.is_strict_inequality())
+          // Transform (expr > 0) into (expr - 1 >= 0).
+          --p_row0;
+        p_row0 *= denom;
+      }
+      else {
+        if (constraint.is_strict_inequality())
+          // Transform (expr > 0) into (expr - 1 >= 0).
+          neg_assign(p_row[0], denom);
+      }
+      WEIGHT_BEGIN();
+      dimension_type last_dim = 0;
+      const Constraint::expr_type e = constraint.expression();
+      for (Constraint::expr_type::const_iterator
+          i = e.begin(), i_end = e.end(); i != i_end; ++i) {
+        const dimension_type dim = i.variable().space_dimension();
+        if (dim != last_dim + 1) {
+          // We have skipped some zero coefficients.
+          // Update p_index and v_index accordingly.
+          const dimension_type n
+            = std::distance(parameters.lower_bound(last_dim),
+                            parameters.lower_bound(dim - 1));
+          const dimension_type num_skipped = dim - last_dim - 1;
+          p_index += n;
+          v_index += (num_skipped - n);
+        }
+        PPL_ASSERT(p_index + v_index == i.variable().id() + 1);
+        const bool is_parameter = (1 == parameters.count(dim - 1));
+        Coefficient_traits::const_reference coeff_i = *i;
+
+        WEIGHT_ADD(140);
+        if (is_parameter) {
+          p_row.insert(p_index, coeff_i * denom);
+          ++p_index;
+        }
+        else {
+          const dimension_type mv = mapping[v_index];
+          if (basis[v_index]) {
+            // Basic variable: add coeff_i * x_i
+            add_mul_assign(v_row[mv], coeff_i, denom);
+          }
+          else {
+            // Non-basic variable: add coeff_i * row_i
+            add_mul_assign_row(v_row, coeff_i, tableau.s[mv]);
+            add_mul_assign_row(p_row, coeff_i, tableau.t[mv]);
+          }
+          ++v_index;
+        }
+
+        last_dim = dim;
+      }
+    }
+
+    if (row_sign(v_row, not_a_dimension()) == ZERO) {
+      // Parametric-only constraints have already been inserted in
+      // initial context, so no need to insert them in the tableau.
+      tableau.s.remove_trailing_rows(1);
+      tableau.t.remove_trailing_rows(1);
+    }
+    else {
+      const dimension_type var_id = mapping.size();
+      sign.push_back(row_sign(p_row, big_dimension));
+      basis.push_back(false);
+      mapping.push_back(row_id);
+      var_row.push_back(var_id);
+      if (constraint.is_equality()) {
+        // Handle equality constraints.
+        // After having added the f_i(x,p) >= 0 constraint,
+        // we must add -f_i(x,p) to the special equality row.
+        if (special_equality_row == 0 || basis[special_equality_row]) {
+          // The special constraint has not been created yet
+          // FIXME: for now, we do not handle the case where the variable
+          // is basic, and we just create a new row.
+          // This might be faster however.
+          tableau.s.add_zero_rows(1);
+          tableau.t.add_zero_rows(1);
+          // NOTE: addition of rows invalidates references v_row and p_row
+          // due to possible matrix reallocations: recompute them.
+          neg_assign_row(tableau.s[1 + row_id], tableau.s[row_id]);
+          neg_assign_row(tableau.t[1 + row_id], tableau.t[row_id]);
+          sign.push_back(row_sign(tableau.t[1 + row_id], big_dimension));
+          special_equality_row = mapping.size();
+          basis.push_back(false);
+          mapping.push_back(1 + row_id);
+          var_row.push_back(1 + var_id);
+        }
+        else {
+          // The special constraint already exists and is nonbasic.
+          const dimension_type m_eq = mapping[special_equality_row];
+          sub_assign(tableau.s[m_eq], v_row);
+          sub_assign(tableau.t[m_eq], p_row);
+          sign[m_eq] = row_sign(tableau.t[m_eq], big_dimension);
+        }
+      }
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+PIP_Tree_Node*
+PIP_Solution_Node::solve(const PIP_Problem& pip,
+                         const bool check_feasible_context,
+                         const Matrix<Row>& context,
+                         const Variables_Set& params,
+                         dimension_type space_dim,
+                         const int indent_level) {
+  PPL_ASSERT(indent_level >= 0);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+  indent_and_print(std::cerr, indent_level, "=== SOLVING NODE\n");
+#else
+  PPL_USED(indent_level);
+#endif
+  // Reset current solution as invalid.
+  solution_valid = false;
+
+  Matrix<Row> ctx(context);
+  Variables_Set all_params(params);
+  const dimension_type num_art_params = artificial_parameters.size();
+  add_artificial_parameters(ctx, all_params, space_dim, num_art_params);
+  merge_assign(ctx, constraints_, all_params);
+
+  // If needed, (re-)check feasibility of context.
+  if (check_feasible_context) {
+    Matrix<Row> ctx_copy(ctx);
+    if (!compatibility_check(ctx_copy)) {
+      delete this;
+      return 0;
+    }
+  }
+
+  const dimension_type not_a_dim = not_a_dimension();
+
+  // Main loop of the simplex algorithm.
+  while (true) {
+    // Check if the client has requested abandoning all expensive
+    // computations. If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    PPL_ASSERT(OK());
+
+    const dimension_type num_rows = tableau.t.num_rows();
+    const dimension_type num_vars = tableau.s.num_columns();
+    const dimension_type num_params = tableau.t.num_columns();
+    Coefficient_traits::const_reference tableau_denom = tableau.denominator();
+
+#ifdef VERY_NOISY_PIP
+    tableau.ascii_dump(std::cerr);
+    std::cerr << "context ";
+    ctx.ascii_dump(std::cerr);
+#endif // #ifdef VERY_NOISY_PIP
+
+    // (Re-) Compute parameter row signs.
+    // While at it, keep track of the first parameter rows
+    // having negative and mixed sign.
+    dimension_type first_negative = not_a_dim;
+    dimension_type first_mixed = not_a_dim;
+    for (dimension_type i = 0; i < num_rows; ++i) {
+      Row_Sign& sign_i = sign[i];
+      if (sign_i == UNKNOWN || sign_i == MIXED)
+        sign_i = row_sign(tableau.t[i], big_dimension);
+
+      if (sign_i == NEGATIVE && first_negative == not_a_dim)
+        first_negative = i;
+      else if (sign_i == MIXED && first_mixed == not_a_dim)
+        first_mixed = i;
+    }
+
+    // If no negative parameter row was found, try to refine the sign of
+    // mixed rows using compatibility checks with the current context.
+    if (first_negative == not_a_dim && first_mixed != not_a_dim) {
+      for (dimension_type i = first_mixed; i < num_rows; ++i) {
+        // Consider mixed sign parameter rows only.
+        if (sign[i] != MIXED)
+          continue;
+        const Row& t_i = tableau.t[i];
+        Row_Sign new_sign = ZERO;
+        // Check compatibility for constraint t_i(z) >= 0.
+        if (compatibility_check(ctx, t_i))
+          new_sign = POSITIVE;
+        // Check compatibility for constraint t_i(z) < 0,
+        // i.e., -t_i(z) - 1 >= 0.
+        Row t_i_complement(num_params);
+        complement_assign(t_i_complement, t_i, tableau_denom);
+        if (compatibility_check(ctx, t_i_complement))
+          new_sign = (new_sign == POSITIVE) ? MIXED : NEGATIVE;
+        // Update sign for parameter row i.
+        sign[i] = new_sign;
+        // Maybe update first_negative and first_mixed.
+        if (new_sign == NEGATIVE && first_negative == not_a_dim) {
+          first_negative = i;
+          if (i == first_mixed)
+            first_mixed = not_a_dim;
+        }
+        else if (new_sign == MIXED) {
+          if (first_mixed == not_a_dim)
+            first_mixed = i;
+        }
+        else if (i == first_mixed)
+          first_mixed = not_a_dim;
+      }
+    }
+
+    // If there still is no negative parameter row and a mixed sign
+    // parameter row (first_mixed) such that:
+    //  - it has at least one positive variable coefficient;
+    //  - constraint t_i(z) > 0 is not compatible with the context;
+    // then this parameter row can be considered negative.
+    if (first_negative == not_a_dim && first_mixed != not_a_dim) {
+      WEIGHT_BEGIN();
+      for (dimension_type i = first_mixed; i < num_rows; ++i) {
+        // Consider mixed sign parameter rows only.
+        if (sign[i] != MIXED)
+          continue;
+        // Check for a positive variable coefficient.
+        const Row& s_i = tableau.s[i];
+        bool has_positive = false;
+        {
+          for (Row::const_iterator
+                 j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j)
+            if (*j > 0) {
+              has_positive = true;
+              break;
+            }
+        }
+        if (!has_positive)
+          continue;
+        // Check compatibility of constraint t_i(z) > 0.
+        Row row(tableau.t[i]);
+        PPL_DIRTY_TEMP_COEFFICIENT(mod);
+        Coefficient& row0 = row[0];
+        pos_rem_assign(mod, row0, tableau_denom);
+        row0 -= (mod == 0) ? tableau_denom : mod;
+        WEIGHT_ADD(210);
+        const bool compatible = compatibility_check(ctx, row);
+        // Maybe update sign (and first_* indices).
+        if (compatible) {
+          // Sign is still mixed.
+          if (first_mixed == not_a_dim)
+            first_mixed = i;
+        }
+        else {
+          // Sign becomes negative (i.e., no longer mixed).
+          sign[i] = NEGATIVE;
+          if (first_negative == not_a_dim)
+            first_negative = i;
+          if (first_mixed == i)
+            first_mixed = not_a_dim;
+        }
+      }
+    }
+
+#ifdef VERY_NOISY_PIP
+    std::cerr << "sign =";
+    for (dimension_type i = 0; i < sign.size(); ++i)
+      std::cerr << " " << "?0+-*"[sign[i]];
+    std::cerr << std::endl;
+#endif // #ifdef VERY_NOISY_PIP
+
+    // If we have found a negative parameter row, then
+    // either the problem is unfeasible, or a pivoting step is required.
+    if (first_negative != not_a_dim) {
+
+      // Search for the best pivot row.
+      dimension_type pi = not_a_dim;
+      dimension_type pj = not_a_dim;
+      for (dimension_type i = first_negative; i < num_rows; ++i) {
+        if (sign[i] != NEGATIVE)
+          continue;
+        dimension_type j;
+        if (!find_lexico_minimal_column(tableau.s, mapping, basis,
+                                        tableau.s[i], 0, j)) {
+          // No positive s_ij was found: problem is unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+          indent_and_print(std::cerr, indent_level,
+                           "No positive pivot: Solution = _|_\n");
+#endif // #ifdef NOISY_PIP_TREE_STRUCTURE
+          delete this;
+          return 0;
+        }
+        if (pj == not_a_dim
+            || tableau.is_better_pivot(mapping, basis, i, j, pi, pj)) {
+          // Update pivot indices.
+          pi = i;
+          pj = j;
+          if (pip.control_parameters[PIP_Problem::PIVOT_ROW_STRATEGY]
+              == PIP_Problem::PIVOT_ROW_STRATEGY_FIRST)
+            // Stop at first valid row.
+            break;
+        }
+      }
+
+#ifdef VERY_NOISY_PIP
+      std::cerr << "Pivot (pi, pj) = (" << pi << ", " << pj << ")\n";
+#endif // #ifdef VERY_NOISY_PIP
+
+      // Normalize the tableau before pivoting.
+      tableau.normalize();
+
+      // Perform pivot operation.
+
+      // Update basis.
+      {
+        const dimension_type var_pi = var_row[pi];
+        const dimension_type var_pj = var_column[pj];
+        var_row[pi] = var_pj;
+        var_column[pj] = var_pi;
+        basis[var_pi] = true;
+        basis[var_pj] = false;
+        mapping[var_pi] = pj;
+        mapping[var_pj] = pi;
+      }
+
+      PPL_DIRTY_TEMP_COEFFICIENT(product);
+      PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+      PPL_DIRTY_TEMP_COEFFICIENT(scale_factor);
+
+      // Creating identity rows corresponding to basic variable pj:
+      // 1. add them to tableau so as to have proper size and capacity;
+      tableau.s.add_zero_rows(1);
+      tableau.t.add_zero_rows(1);
+      // 2. swap the rows just added with empty ones.
+      Row s_pivot(0);
+      Row t_pivot(0);
+      swap(s_pivot, tableau.s[num_rows]);
+      swap(t_pivot, tableau.t[num_rows]);
+      // 3. drop rows previously added at end of tableau.
+      tableau.s.remove_trailing_rows(1);
+      tableau.t.remove_trailing_rows(1);
+
+      // Save current pivot denominator.
+      PPL_DIRTY_TEMP_COEFFICIENT(pivot_denom);
+      pivot_denom = tableau.denominator();
+      // Let the (scaled) pivot coordinate be 1.
+      s_pivot[pj] = pivot_denom;
+
+      // Swap identity row with the pivot row previously found.
+      s_pivot.m_swap(tableau.s[pi]);
+      t_pivot.m_swap(tableau.t[pi]);
+      sign[pi] = ZERO;
+
+      PPL_DIRTY_TEMP_COEFFICIENT(s_pivot_pj);
+      s_pivot_pj = s_pivot.get(pj);
+
+      // Compute columns s[*][j]:
+      //
+      // <CODE>
+      //   s[i][j] -= s[i][pj] * s_pivot[j] / s_pivot_pj;
+      // </CODE>
+      for (dimension_type i = num_rows; i-- > 0; ) {
+        Row& s_i = tableau.s[i];
+        PPL_DIRTY_TEMP_COEFFICIENT(s_i_pj);
+        s_i_pj = s_i.get(pj);
+
+        if (s_i_pj == 0)
+          continue;
+
+        WEIGHT_BEGIN();
+        Row::iterator itr = s_i.end();
+        for (Row::const_iterator
+               j = s_pivot.begin(), j_end = s_pivot.end(); j != j_end; ++j) {
+          if (j.index() != pj) {
+            Coefficient_traits::const_reference s_pivot_j = *j;
+            // Do nothing if the j-th pivot element is zero.
+            if (s_pivot_j != 0) {
+              product = s_pivot_j * s_i_pj;
+              if (product % s_pivot_pj != 0) {
+                // Must scale matrix to stay in integer case.
+                gcd_assign(gcd, product, s_pivot_pj);
+                exact_div_assign(scale_factor, s_pivot_pj, gcd);
+                tableau.scale(scale_factor);
+                s_i_pj *= scale_factor;
+                product *= scale_factor;
+                WEIGHT_ADD(102);
+              }
+              PPL_ASSERT(product % s_pivot_pj == 0);
+              exact_div_assign(product, product, s_pivot_pj);
+              WEIGHT_ADD(130);
+              if (product != 0) {
+                itr = s_i.insert(itr, j.index());
+                *itr -= product;
+                WEIGHT_ADD(34);
+              }
+            }
+          }
+        }
+      }
+
+      // Compute columns t[*][j]:
+      //
+      // <CODE>
+      //   t[i][j] -= s[i][pj] * t_pivot[j] / s_pivot_pj;
+      // </CODE>
+      for (dimension_type i = num_rows; i-- > 0; ) {
+        Row& s_i = tableau.s[i];
+        Row& t_i = tableau.t[i];
+
+        Row::iterator s_i_pj_itr = s_i.find(pj);
+
+        if (s_i_pj_itr == s_i.end())
+          continue;
+
+        // FIXME: the following comment does not make sense.
+        // NOTE: This is a Coefficient& instead of a
+        // Coefficient_traits::const_reference, because scale() may silently
+        // modify it.
+        const Coefficient& s_i_pj = *s_i_pj_itr;
+
+        if (s_i_pj == 0)
+          continue;
+
+        WEIGHT_BEGIN();
+        Row::iterator k = t_i.end();
+        for (Row::const_iterator
+               j = t_pivot.begin(), j_end = t_pivot.end(); j != j_end; ++j) {
+          Coefficient_traits::const_reference t_pivot_j = *j;
+          // Do nothing if the j-th pivot element is zero.
+          if (t_pivot_j != 0) {
+            product = t_pivot_j * s_i_pj;
+            if (product % s_pivot_pj != 0) {
+              // Must scale matrix to stay in integer case.
+              gcd_assign(gcd, product, s_pivot_pj);
+              exact_div_assign(scale_factor, s_pivot_pj, gcd);
+              tableau.scale(scale_factor);
+              product *= scale_factor;
+              WEIGHT_ADD(261);
+            }
+            PPL_ASSERT(product % s_pivot_pj == 0);
+            exact_div_assign(product, product, s_pivot_pj);
+            WEIGHT_ADD(115);
+            if (product != 0) {
+              k = t_i.insert(k, j.index());
+              *k -= product;
+              WEIGHT_ADD(41);
+            }
+
+            // Update row sign.
+            Row_Sign& sign_i = sign[i];
+            switch (sign_i) {
+            case ZERO:
+              if (product > 0)
+                sign_i = NEGATIVE;
+              else if (product < 0)
+                sign_i = POSITIVE;
+              break;
+            case POSITIVE:
+              if (product > 0)
+                sign_i = MIXED;
+              break;
+            case NEGATIVE:
+              if (product < 0)
+                sign_i = MIXED;
+              break;
+            default:
+              break;
+            }
+          }
+        }
+      }
+
+      // Compute column s[*][pj]: s[i][pj] /= s_pivot_pj;
+      // Update column only if pivot coordinate != 1.
+      if (s_pivot_pj != pivot_denom) {
+        WEIGHT_BEGIN();
+        Row::iterator itr;
+        for (dimension_type i = num_rows; i-- > 0; ) {
+          Row& s_i = tableau.s[i];
+          itr = s_i.find(pj);
+          if (itr == s_i.end())
+            continue;
+          WEIGHT_ADD(43);
+          product = *itr * pivot_denom;
+          if (product % s_pivot_pj != 0) {
+            // As above, perform matrix scaling.
+            gcd_assign(gcd, product, s_pivot_pj);
+            exact_div_assign(scale_factor, s_pivot_pj, gcd);
+            tableau.scale(scale_factor);
+            product *= scale_factor;
+            WEIGHT_ADD(177);
+          }
+          PPL_ASSERT(product % s_pivot_pj == 0);
+          if (product != 0 || *itr != 0) {
+            WEIGHT_ADD(106);
+            exact_div_assign(*itr, product, s_pivot_pj);
+          }
+        }
+      }
+
+      // Pivoting process ended: jump to next iteration.
+      continue;
+    } // if (first_negative != not_a_dim)
+
+
+    PPL_ASSERT(first_negative == not_a_dim);
+    // If no negative parameter row was found,
+    // but a mixed parameter row was found ...
+    if (first_mixed != not_a_dim) {
+      // Look for a constraint (i_neg):
+      //  - having mixed parameter sign;
+      //  - having no positive variable coefficient;
+      //  - minimizing the score (sum of parameter coefficients).
+      dimension_type i_neg = not_a_dim;
+      PPL_DIRTY_TEMP_COEFFICIENT(best_score);
+      PPL_DIRTY_TEMP_COEFFICIENT(score);
+      for (dimension_type i = first_mixed; i < num_rows; ++i) {
+        // Mixed parameter sign.
+        if (sign[i] != MIXED)
+          continue;
+        // No positive variable coefficient.
+        bool has_positive = false;
+        {
+          const Row& s_i = tableau.s[i];
+          for (Row::const_iterator
+                 j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j)
+            if (*j > 0) {
+              has_positive = true;
+              break;
+            }
+        }
+        if (has_positive)
+          continue;
+        // Minimize parameter coefficient score,
+        // eliminating implicated tautologies (if any).
+        score = 0;
+        {
+          WEIGHT_BEGIN();
+          const Row& t_i = tableau.t[i];
+          for (Row::const_iterator
+                 j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+            WEIGHT_ADD(55);
+            score += *j;
+          }
+        }
+        if (i_neg == not_a_dim || score < best_score) {
+          i_neg = i;
+          best_score = score;
+        }
+      }
+
+      if (i_neg != not_a_dim) {
+        Row tautology = tableau.t[i_neg];
+        /* Simplify tautology by exploiting integrality. */
+        integral_simplification(tautology);
+        ctx.add_row(tautology);
+        add_constraint(tautology, all_params);
+        sign[i_neg] = POSITIVE;
+#ifdef NOISY_PIP
+        {
+          Linear_Expression expr = Linear_Expression(tautology.get(0));
+          dimension_type j = 1;
+          for (Variables_Set::const_iterator p = all_params.begin(),
+                 p_end = all_params.end(); p != p_end; ++p, ++j)
+            add_mul_assign(expr, tautology.get(j), Variable(*p));
+          using namespace IO_Operators;
+          std::cerr << std::setw(2 * indent_level) << ""
+                    << "Row " << i_neg
+                    << ": mixed param sign, negative var coeffs\n";
+          std::cerr << std::setw(2 * indent_level) << ""
+                    << "==> adding tautology: "
+                    << Constraint(expr >= 0) << ".\n";
+        }
+#endif // #ifdef NOISY_PIP
+        // Jump to next iteration.
+        continue;
+      }
+
+      PPL_ASSERT(i_neg == not_a_dim);
+      // Heuristically choose "best" (mixed) pivoting row.
+      dimension_type best_i = not_a_dim;
+      for (dimension_type i = first_mixed; i < num_rows; ++i) {
+        if (sign[i] != MIXED)
+          continue;
+        score = 0;
+        {
+          WEIGHT_BEGIN();
+          const Row& t_i = tableau.t[i];
+          for (Row::const_iterator
+                 j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+            WEIGHT_ADD(51);
+            score += *j;
+          }
+        }
+        if (best_i == not_a_dim || score < best_score) {
+          best_score = score;
+          best_i = i;
+        }
+      }
+
+      Row t_test(tableau.t[best_i]);
+      /* Simplify t_test by exploiting integrality. */
+      integral_simplification(t_test);
+
+#ifdef NOISY_PIP
+      {
+        Linear_Expression expr = Linear_Expression(t_test.get(0));
+        dimension_type j = 1;
+        for (Variables_Set::const_iterator p = all_params.begin(),
+               p_end = all_params.end(); p != p_end; ++p, ++j)
+          add_mul_assign(expr, t_test.get(j), Variable(*p));
+        using namespace IO_Operators;
+        std::cerr << std::setw(2 * indent_level) << ""
+                  << "Row " << best_i << ": mixed param sign\n";
+        std::cerr << std::setw(2 * indent_level) << ""
+                  << "==> depends on sign of " << expr << ".\n";
+      }
+#endif // #ifdef NOISY_PIP
+
+      // Create a solution node for the "true" version of current node.
+      PIP_Tree_Node* t_node = new PIP_Solution_Node(*this, No_Constraints());
+      // Protect it from exception safety issues via std::auto_ptr.
+      std::auto_ptr<PIP_Tree_Node> wrapped_node(t_node);
+
+      // Add parametric constraint to context.
+      ctx.add_row(t_test);
+      // Recursively solve true node with respect to updated context.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+      indent_and_print(std::cerr, indent_level, "=== SOLVING THEN CHILD\n");
+#endif
+      t_node = t_node->solve(pip, check_feasible_context,
+                             ctx, all_params, space_dim,
+                             indent_level + 1);
+      // Resolution may have changed t_node: in case, re-wrap it.
+      if (t_node != wrapped_node.get()) {
+        wrapped_node.release();
+        wrapped_node.reset(t_node);
+      }
+
+      // Modify *this in place to become the "false" version of current node.
+      PIP_Tree_Node* f_node = this;
+      // Swap aside constraints and artificial parameters
+      // (these will be later restored if needed).
+      Constraint_System cs;
+      Artificial_Parameter_Sequence aps;
+      swap(cs, f_node->constraints_);
+      swap(aps, f_node->artificial_parameters);
+      // Compute the complement of the constraint used for the "true" node.
+      Row& f_test = ctx[ctx.num_rows() - 1];
+      complement_assign(f_test, t_test, 1);
+
+      // Recursively solve false node with respect to updated context.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+      indent_and_print(std::cerr, indent_level, "=== SOLVING ELSE CHILD\n");
+#endif
+      f_node = f_node->solve(pip, check_feasible_context,
+                             ctx, all_params, space_dim,
+                             indent_level + 1);
+
+      // Case analysis on recursive resolution calls outcome.
+      if (t_node == 0) {
+        if (f_node == 0) {
+          // Both t_node and f_node unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+          indent_and_print(std::cerr, indent_level,
+                           "=== EXIT: BOTH BRANCHES UNFEASIBLE: _|_\n");
+#endif
+          return 0;
+        }
+        else {
+          // t_node unfeasible, f_node feasible:
+          // restore cs and aps into f_node (i.e., this).
+          PPL_ASSERT(f_node == this);
+          swap(f_node->constraints_, cs);
+          swap(f_node->artificial_parameters, aps);
+          // Add f_test to constraints.
+          f_node->add_constraint(f_test, all_params);
+#ifdef NOISY_PIP_TREE_STRUCTURE
+          indent_and_print(std::cerr, indent_level,
+                           "=== EXIT: THEN BRANCH UNFEASIBLE: SWAP BRANCHES\n");
+#endif
+          return f_node;
+        }
+      }
+      else if (f_node == 0) {
+        // t_node feasible, f_node unfeasible.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+        indent_and_print(std::cerr, indent_level,
+                         "=== EXIT: THEN BRANCH FEASIBLE\n");
+#endif
+        // NOTE: in principle, we could merge t_node into its parent.
+        // However, if t_node is a decision node having both children,
+        // then we would obtain a node violating the PIP_Decision_Node
+        // invariant saying that t_node should have a single constraint:
+        // it will have, at least, the two splitting constraints.
+        const PIP_Decision_Node* const decision_node_p
+          = dynamic_cast<PIP_Decision_Node*>(t_node);
+        if (decision_node_p != 0 && decision_node_p->false_child != 0) {
+          // Do NOT merge: create a new decision node.
+          PIP_Tree_Node* const parent
+            = new PIP_Decision_Node(t_node->get_owner(), 0, t_node);
+          // Previously wrapped 't_node' is now safe: release it
+          // and protect new 'parent' node from exception safety issues.
+          wrapped_node.release();
+          wrapped_node.reset(parent);
+          // Restore into parent `cs' and `aps'.
+          swap(parent->constraints_, cs);
+          swap(parent->artificial_parameters, aps);
+          // Add t_test to parent's constraints.
+          parent->add_constraint(t_test, all_params);
+          // It is now safe to release previously wrapped parent pointer
+          // and return it to caller.
+          return wrapped_node.release();
+        }
+        else {
+          // Merge t_node with its parent:
+          // a) append into `cs' the constraints of t_node;
+          for (Constraint_System::const_iterator
+                 i = t_node->constraints_.begin(),
+                 i_end = t_node->constraints_.end(); i != i_end; ++i)
+            cs.insert(*i);
+          // b) append into `aps' the parameters of t_node;
+          aps.insert(aps.end(),
+                     t_node->artificial_parameters.begin(),
+                     t_node->artificial_parameters.end());
+          // c) swap the updated `cs' and `aps' into t_node.
+          swap(cs, t_node->constraints_);
+          swap(aps, t_node->artificial_parameters);
+          // d) add t_test to t_nodes's constraints.
+          t_node->add_constraint(t_test, all_params);
+          // It is now safe to release previously wrapped t_node pointer
+          // and return it to caller.
+          return wrapped_node.release();
+        }
+      }
+
+      // Here both t_node and f_node are feasible:
+      // create a new decision node.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+      indent_and_print(std::cerr, indent_level,
+                       "=== EXIT: BOTH BRANCHES FEASIBLE: NEW DECISION NODE\n");
+#endif
+      PIP_Tree_Node* parent
+        = new PIP_Decision_Node(f_node->get_owner(), f_node, t_node);
+      // Previously wrapped 't_node' is now safe: release it
+      // and protect new 'parent' node from exception safety issues.
+      wrapped_node.release();
+      wrapped_node.reset(parent);
+
+      // Add t_test to the constraints of the new decision node.
+      parent->add_constraint(t_test, all_params);
+
+      if (!cs.empty()) {
+#ifdef NOISY_PIP_TREE_STRUCTURE
+        indent_and_print(std::cerr, indent_level,
+                         "=== NODE HAS BOTH BRANCHES AND TAUTOLOGIES:\n");
+        indent_and_print(std::cerr, indent_level,
+                         "=== CREATE NEW PARENT FOR TAUTOLOGIES\n");
+#endif
+        // If node to be solved had tautologies,
+        // store them in a new decision node.
+        parent = new PIP_Decision_Node(parent->get_owner(), 0, parent);
+        // Previously wrapped 'parent' node is now safe: release it
+        // and protect new 'parent' node from exception safety issues.
+        wrapped_node.release();
+        wrapped_node.reset(parent);
+        swap(parent->constraints_, cs);
+      }
+      swap(parent->artificial_parameters, aps);
+      // It is now safe to release previously wrapped decision node
+      // and return it to the caller.
+      return wrapped_node.release();
+    } // if (first_mixed != not_a_dim)
+
+
+    PPL_ASSERT(first_negative == not_a_dim);
+    PPL_ASSERT(first_mixed == not_a_dim);
+    // Here all parameters are positive: we have found a continuous
+    // solution. If the solution happens to be integer, then it is the
+    // solution of the  integer problem. Otherwise, we may need to generate
+    // a new cut to try and get back into the integer case.
+#ifdef NOISY_PIP
+    indent_and_print(std::cerr, indent_level,
+                     "All parameters are positive.\n");
+#endif // #ifdef NOISY_PIP
+    tableau.normalize();
+
+    // Look for any row having non integer parameter coefficients.
+    Coefficient_traits::const_reference denom = tableau.denominator();
+    for (dimension_type k = 0; k < num_vars; ++k) {
+      if (basis[k])
+        // Basic variable = 0, hence integer.
+        continue;
+      const dimension_type i = mapping[k];
+      const Row& t_i = tableau.t[i];
+      WEIGHT_BEGIN();
+      for (Row::const_iterator
+             j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+        WEIGHT_ADD(27);
+        if (*j % denom != 0)
+          goto non_integer;
+      }
+    }
+    // The goto was not taken, the solution is integer.
+#ifdef NOISY_PIP_TREE_STRUCTURE
+    indent_and_print(std::cerr, indent_level,
+                     "EXIT: solution found.\n");
+#endif // #ifdef NOISY_PIP
+    return this;
+
+  non_integer:
+    // The solution is non-integer: generate a cut.
+    PPL_DIRTY_TEMP_COEFFICIENT(mod);
+    dimension_type best_i = not_a_dim;
+    dimension_type best_pcount = not_a_dim;
+
+    const PIP_Problem::Control_Parameter_Value cutting_strategy
+      = pip.control_parameters[PIP_Problem::CUTTING_STRATEGY];
+
+    if (cutting_strategy == PIP_Problem::CUTTING_STRATEGY_FIRST) {
+      // Find the first row with simplest parametric part.
+      for (dimension_type k = 0; k < num_vars; ++k) {
+        if (basis[k])
+          continue;
+        const dimension_type i = mapping[k];
+        // Count the number of non-integer parameter coefficients.
+        WEIGHT_BEGIN();
+        dimension_type pcount = 0;
+        const Row& t_i = tableau.t[i];
+        for (Row::const_iterator
+               j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+          WEIGHT_ADD(18);
+          pos_rem_assign(mod, *j, denom);
+          if (mod != 0)
+            ++pcount;
+        }
+        if (pcount > 0 && (best_i == not_a_dim || pcount < best_pcount)) {
+          best_pcount = pcount;
+          best_i = i;
+        }
+      }
+      // Generate cut using 'best_i'.
+      generate_cut(best_i, all_params, ctx, space_dim, indent_level);
+    }
+    else {
+      PPL_ASSERT(cutting_strategy == PIP_Problem::CUTTING_STRATEGY_DEEPEST
+                 || cutting_strategy == PIP_Problem::CUTTING_STRATEGY_ALL);
+      // Find the row with simplest parametric part
+      // which will generate the "deepest" cut.
+      PPL_DIRTY_TEMP_COEFFICIENT(best_score);
+      best_score = 0;
+      PPL_DIRTY_TEMP_COEFFICIENT(score);
+      PPL_DIRTY_TEMP_COEFFICIENT(s_score);
+      std::vector<dimension_type> all_best_is;
+
+      for (dimension_type k = 0; k < num_vars; ++k) {
+        if (basis[k])
+          continue;
+        const dimension_type i = mapping[k];
+        // Compute score and pcount.
+        score = 0;
+        dimension_type pcount = 0;
+        {
+          WEIGHT_BEGIN();
+          const Row& t_i = tableau.t[i];
+          for (Row::const_iterator
+                 j = t_i.begin(), j_end = t_i.end(); j != j_end; ++j) {
+            WEIGHT_ADD(46);
+            pos_rem_assign(mod, *j, denom);
+            if (mod != 0) {
+              WEIGHT_ADD(94);
+              score += denom;
+              score -= mod;
+              ++pcount;
+            }
+          }
+        }
+
+        // Compute s_score.
+        s_score = 0;
+        {
+          WEIGHT_BEGIN();
+          const Row& s_i = tableau.s[i];
+          for (Row::const_iterator
+                 j = s_i.begin(), j_end = s_i.end(); j != j_end; ++j) {
+            WEIGHT_ADD(94);
+            pos_rem_assign(mod, *j, denom);
+            s_score += denom;
+            s_score -= mod;
+          }
+        }
+        // Combine 'score' and 's_score'.
+        score *= s_score;
+        /*
+          Select row i if it is non integer AND
+            - no row has been chosen yet; OR
+            - it has fewer non-integer parameter coefficients; OR
+            - it has the same number of non-integer parameter coefficients,
+              but its score is greater.
+        */
+        if (pcount != 0
+            && (best_i == not_a_dim
+                || pcount < best_pcount
+                || (pcount == best_pcount && score > best_score))) {
+          if (pcount < best_pcount)
+            all_best_is.clear();
+          best_i = i;
+          best_pcount = pcount;
+          best_score = score;
+        }
+        if (pcount > 0)
+          all_best_is.push_back(i);
+      }
+      if (cutting_strategy == PIP_Problem::CUTTING_STRATEGY_DEEPEST)
+        generate_cut(best_i, all_params, ctx, space_dim, indent_level);
+      else {
+        PPL_ASSERT(cutting_strategy == PIP_Problem::CUTTING_STRATEGY_ALL);
+        for (dimension_type k = all_best_is.size(); k-- > 0; )
+          generate_cut(all_best_is[k], all_params, ctx,
+                       space_dim, indent_level);
+      }
+    } // End of processing for non-integer solutions.
+
+  } // Main loop of the simplex algorithm
+
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return 0;
+}
+
+void
+PIP_Solution_Node::generate_cut(const dimension_type index,
+                                Variables_Set& parameters,
+                                Matrix<Row>& context,
+                                dimension_type& space_dimension,
+                                const int indent_level) {
+  PPL_ASSERT(indent_level >= 0);
+#ifdef NOISY_PIP
+  std::cerr << std::setw(2 * indent_level) << ""
+            << "Row " << index << " requires cut generation.\n";
+#else
+  PPL_USED(indent_level);
+#endif // #ifdef NOISY_PIP
+
+  const dimension_type num_rows = tableau.t.num_rows();
+  PPL_ASSERT(index < num_rows);
+  const dimension_type num_vars = tableau.s.num_columns();
+  const dimension_type num_params = tableau.t.num_columns();
+  PPL_ASSERT(num_params == 1 + parameters.size());
+  Coefficient_traits::const_reference denom = tableau.denominator();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(mod);
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+
+  // Test if cut to be generated must be parametric or not.
+  bool generate_parametric_cut = false;
+  {
+    // Limiting the scope of reference row_t (may be later invalidated).
+    const Row& row_t = tableau.t[index];
+    Row::const_iterator j = row_t.begin();
+    Row::const_iterator j_end = row_t.end();
+    // Skip the element with index 0.
+    if (j != j_end && j.index() == 0)
+      ++j;
+    WEIGHT_BEGIN();
+    for ( ; j != j_end; ++j) {
+      WEIGHT_ADD(7);
+      if (*j % denom != 0) {
+        generate_parametric_cut = true;
+        break;
+      }
+    }
+  }
+
+  // Column index of already existing Artificial_Parameter.
+  dimension_type ap_column = not_a_dimension();
+
+  if (generate_parametric_cut) {
+    // Fractional parameter coefficient found: generate parametric cut.
+    bool reuse_ap = false;
+    Linear_Expression expr;
+
+    // Limiting the scope of reference row_t (may be later invalidated).
+    {
+      const Row& row_t = tableau.t[index];
+      Row::const_iterator j = row_t.begin();
+      Row::const_iterator j_end = row_t.end();
+      if (j != j_end && j.index() == 0) {
+        pos_rem_assign(mod, *j, denom);
+        ++j;
+        if (mod != 0) {
+          // Optimizing computation: expr += (denom - mod);
+          expr += denom;
+          expr -= mod;
+        }
+      }
+      if (!parameters.empty()) {
+        // To avoid reallocations of expr.
+        add_mul_assign(expr, 0, Variable(*(parameters.rbegin())));
+        Variables_Set::const_iterator p_j = parameters.begin();
+        dimension_type last_index = 1;
+        WEIGHT_BEGIN();
+        for ( ; j != j_end; ++j) {
+          WEIGHT_ADD(69);
+          pos_rem_assign(mod, *j, denom);
+          if (mod != 0) {
+            // Optimizing computation: expr += (denom - mod) * Variable(*p_j);
+            WEIGHT_ADD(164);
+            coeff = denom - mod;
+            PPL_ASSERT(last_index <= j.index());
+            std::advance(p_j, j.index() - last_index);
+            last_index = j.index();
+            add_mul_assign(expr, coeff, Variable(*p_j));
+          }
+        }
+      }
+    }
+    // Generate new artificial parameter.
+    const Artificial_Parameter ap(expr, denom);
+
+    // Search if the Artificial_Parameter has already been generated.
+    ap_column = space_dimension;
+    const PIP_Tree_Node* node = this;
+    do {
+      for (dimension_type j = node->artificial_parameters.size(); j-- > 0; ) {
+        --ap_column;
+        if (node->artificial_parameters[j] == ap) {
+          reuse_ap = true;
+          break;
+        }
+      }
+      node = node->parent();
+    } while (!reuse_ap && node != 0);
+
+    if (reuse_ap) {
+      // We can re-use an existing Artificial_Parameter.
+#ifdef NOISY_PIP
+      using namespace IO_Operators;
+      std::cerr << std::setw(2 * indent_level) << ""
+                << "Re-using parameter " << Variable(ap_column)
+                << " = " << ap << std::endl;
+#endif // #ifdef NOISY_PIP
+      ap_column = ap_column - num_vars + 1;
+    }
+    else {
+      // Here reuse_ap == false: the Artificial_Parameter does not exist yet.
+      // Beware: possible reallocation invalidates row references.
+      tableau.t.add_zero_columns(1);
+      context.add_zero_columns(1);
+      artificial_parameters.push_back(ap);
+      parameters.insert(space_dimension);
+#ifdef NOISY_PIP
+      using namespace IO_Operators;
+      std::cerr << std::setw(2 * indent_level) << ""
+                << "New parameter " << Variable(space_dimension)
+                << " = " << ap << std::endl;
+#endif // #ifdef NOISY_PIP
+      ++space_dimension;
+      ap_column = num_params;
+
+      // Update current context with constraints on the new parameter.
+      const dimension_type ctx_num_rows = context.num_rows();
+      context.add_zero_rows(2);
+      Row& ctx1 = context[ctx_num_rows];
+      Row& ctx2 = context[ctx_num_rows+1];
+      // Recompute row reference after possible reallocation.
+      const Row& row_t = tableau.t[index];
+      {
+        Row::const_iterator j = row_t.begin();
+        Row::const_iterator j_end = row_t.end();
+        Row::iterator itr1 = ctx1.end();
+        Row::iterator itr2 = ctx2.end();
+        if (j != j_end && j.index() == 0) {
+          pos_rem_assign(mod, *j, denom);
+          if (mod != 0) {
+            itr1 = ctx1.insert(0, denom);
+            *itr1 -= mod;
+            itr2 = ctx2.insert(0, *itr1);
+            neg_assign(*itr2);
+            // Compute <CODE> ctx2[0] += denom-1; </CODE>
+            *itr2 += denom;
+            --(*itr2);
+          }
+          else {
+            // Compute <CODE> ctx2[0] += denom-1; </CODE>
+            itr2 = ctx2.insert(0, denom);
+            --(*itr2);
+          }
+          ++j;
+        }
+        else {
+          // Compute <CODE> ctx2[0] += denom-1; </CODE>
+          itr2 = ctx2.insert(0, denom);
+          --(*itr2);
+        }
+        WEIGHT_BEGIN();
+        for ( ; j != j_end; ++j) {
+          pos_rem_assign(mod, *j, denom);
+          if (mod != 0) {
+            const dimension_type j_index = j.index();
+            itr1 = ctx1.insert(itr1, j_index, denom);
+            *itr1 -= mod;
+            itr2 = ctx2.insert(itr2, j_index, *itr1);
+            neg_assign(*itr2);
+            WEIGHT_ADD(294);
+          }
+        }
+        itr1 = ctx1.insert(itr1, num_params, denom);
+        neg_assign(*itr1);
+        itr2 = ctx2.insert(itr2, num_params, denom);
+        WEIGHT_ADD(122);
+      }
+
+#ifdef NOISY_PIP
+      {
+        using namespace IO_Operators;
+        Variables_Set::const_iterator p = parameters.begin();
+        Linear_Expression expr1(ctx1.get(0));
+        Linear_Expression expr2(ctx2.get(0));
+        for (dimension_type j = 1; j <= num_params; ++j, ++p) {
+          add_mul_assign(expr1, ctx1.get(j), Variable(*p));
+          add_mul_assign(expr2, ctx2.get(j), Variable(*p));
+        }
+        std::cerr << std::setw(2 * indent_level) << ""
+                  << "Adding to context: "
+                  << Constraint(expr1 >= 0) << " ; "
+                  << Constraint(expr2 >= 0) << std::endl;
+      }
+#endif // #ifdef NOISY_PIP
+    }
+  }
+
+  // Generate new cut.
+  tableau.s.add_zero_rows(1);
+  tableau.t.add_zero_rows(1);
+  Row& cut_s = tableau.s[num_rows];
+  Row& cut_t = tableau.t[num_rows];
+  // Recompute references after possible reallocation.
+  const Row& row_s = tableau.s[index];
+  const Row& row_t = tableau.t[index];
+  WEIGHT_BEGIN();
+  {
+    Row::iterator itr = cut_s.end();
+    for (Row::const_iterator
+           j = row_s.begin(), j_end = row_s.end(); j != j_end; ++j) {
+      WEIGHT_ADD(55);
+      itr = cut_s.insert(itr, j.index(), *j);
+      pos_rem_assign(*itr, *itr, denom);
+    }
+  }
+  {
+    Row::iterator cut_t_itr = cut_t.end();
+    for (Row::const_iterator
+           j = row_t.begin(), j_end = row_t.end(); j!=j_end; ++j) {
+      WEIGHT_ADD(37);
+      pos_rem_assign(mod, *j, denom);
+      if (mod != 0) {
+        WEIGHT_ADD(108);
+        cut_t_itr = cut_t.insert(cut_t_itr, j.index(), mod);
+        *cut_t_itr -= denom;
+      }
+    }
+  }
+  if (ap_column != not_a_dimension())
+    // If we re-use an existing Artificial_Parameter
+    cut_t[ap_column] = denom;
+
+#ifdef NOISY_PIP
+  {
+    using namespace IO_Operators;
+    Linear_Expression expr;
+    dimension_type ti = 1;
+    dimension_type si = 0;
+    for (dimension_type j = 0; j < space_dimension; ++j) {
+      if (parameters.count(j) == 1) {
+        add_mul_assign(expr, cut_t.get(ti), Variable(j));
+        ++ti;
+      }
+      else {
+        add_mul_assign(expr, cut_s.get(si), Variable(j));
+        ++si;
+      }
+    }
+    std::cerr << std::setw(2 * indent_level) << ""
+              << "Adding cut: "
+              << Constraint(expr + cut_t.get(0) >= 0)
+              << std::endl;
+  }
+#endif // #ifdef NOISY_PIP
+  var_row.push_back(num_rows + num_vars);
+  basis.push_back(false);
+  mapping.push_back(num_rows);
+  sign.push_back(NEGATIVE);
+}
+
+
+memory_size_type
+PIP_Tree_Node::Artificial_Parameter::external_memory_in_bytes() const {
+  return Linear_Expression::external_memory_in_bytes()
+    + Parma_Polyhedra_Library::external_memory_in_bytes(denom);
+}
+
+memory_size_type
+PIP_Tree_Node::Artificial_Parameter::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+memory_size_type
+PIP_Tree_Node::external_memory_in_bytes() const {
+  memory_size_type n = constraints_.external_memory_in_bytes();
+  // Adding the external memory for `artificial_parameters'.
+  n += artificial_parameters.capacity() * sizeof(Artificial_Parameter);
+  for (Artificial_Parameter_Sequence::const_iterator
+         ap = art_parameter_begin(),
+         ap_end = art_parameter_end(); ap != ap_end; ++ap)
+    n += (ap->external_memory_in_bytes());
+
+  return n;
+}
+
+memory_size_type
+PIP_Decision_Node::external_memory_in_bytes() const {
+  memory_size_type n = PIP_Tree_Node::external_memory_in_bytes();
+  PPL_ASSERT(true_child != 0);
+  n += true_child->total_memory_in_bytes();
+  if (false_child != 0)
+    n += false_child->total_memory_in_bytes();
+  return n;
+}
+
+memory_size_type
+PIP_Decision_Node::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+memory_size_type
+PIP_Solution_Node::Tableau::external_memory_in_bytes() const {
+  return Parma_Polyhedra_Library::external_memory_in_bytes(denom)
+    + s.external_memory_in_bytes()
+    + t.external_memory_in_bytes();
+}
+
+memory_size_type
+PIP_Solution_Node::external_memory_in_bytes() const {
+  memory_size_type n = PIP_Tree_Node::external_memory_in_bytes();
+  n += tableau.external_memory_in_bytes();
+  // FIXME: size of std::vector<bool> ?
+  n += basis.capacity() * sizeof(bool);
+  n += sizeof(dimension_type)
+    * (mapping.capacity() + var_row.capacity() + var_column.capacity());
+  n += sign.capacity() * sizeof(Row_Sign);
+  // FIXME: Adding the external memory for `solution'.
+  n += solution.capacity() * sizeof(Linear_Expression);
+  for (std::vector<Linear_Expression>::const_iterator
+         i = solution.begin(), i_end = solution.end(); i != i_end; ++i)
+    n += (i->external_memory_in_bytes());
+
+  return n;
+}
+
+memory_size_type
+PIP_Solution_Node::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+void
+PIP_Tree_Node::indent_and_print(std::ostream& s,
+                                const int indent,
+                                const char* str) {
+  PPL_ASSERT(indent >= 0);
+  s << std::setw(2 * indent) << "" << str;
+}
+
+void
+PIP_Tree_Node::print(std::ostream& s, const int indent) const {
+  const dimension_type pip_space_dim = get_owner()->space_dimension();
+  const Variables_Set& pip_params = get_owner()->parameter_space_dimensions();
+
+  std::vector<bool> pip_dim_is_param(pip_space_dim);
+  for (Variables_Set::const_iterator p = pip_params.begin(),
+         p_end = pip_params.end(); p != p_end; ++p)
+    pip_dim_is_param[*p] = true;
+
+  dimension_type first_art_dim = pip_space_dim;
+  for (const PIP_Tree_Node* node = parent(); node != 0; node = node->parent())
+    first_art_dim += node->art_parameter_count();
+
+  print_tree(s, indent, pip_dim_is_param, first_art_dim);
+}
+
+void
+PIP_Tree_Node::print_tree(std::ostream& s, const int indent,
+                          const std::vector<bool>&,
+                          dimension_type first_art_dim) const {
+  using namespace IO_Operators;
+
+  // Print artificial parameters.
+  for (Artificial_Parameter_Sequence::const_iterator
+         api = art_parameter_begin(),
+         api_end = art_parameter_end(); api != api_end; ++api) {
+    indent_and_print(s, indent, "Parameter ");
+    s << Variable(first_art_dim) << " = " << *api << "\n";
+    ++first_art_dim;
+  }
+
+  // Print constraints, if any.
+  if (!constraints_.empty()) {
+    indent_and_print(s, indent, "if ");
+
+    Constraint_System::const_iterator ci = constraints_.begin();
+    Constraint_System::const_iterator ci_end = constraints_.end();
+    PPL_ASSERT(ci != ci_end);
+    s << *ci;
+    for (++ci; ci != ci_end; ++ci)
+      s << " and " << *ci;
+
+    s << " then\n";
+  }
+}
+
+void
+PIP_Decision_Node::print_tree(std::ostream& s, const int indent,
+                              const std::vector<bool>& pip_dim_is_param,
+                              const dimension_type first_art_dim) const {
+  // First print info common to decision and solution nodes.
+  PIP_Tree_Node::print_tree(s, indent, pip_dim_is_param, first_art_dim);
+
+  // Then print info specific of decision nodes.
+  const dimension_type child_first_art_dim
+    = first_art_dim + art_parameter_count();
+
+  PPL_ASSERT(true_child != 0);
+  true_child->print_tree(s, indent+1, pip_dim_is_param, child_first_art_dim);
+
+  indent_and_print(s, indent, "else\n");
+
+  if (false_child != 0)
+    false_child->print_tree(s, indent+1, pip_dim_is_param,
+                            child_first_art_dim);
+  else
+    indent_and_print(s, indent+1, "_|_\n");
+}
+
+void
+PIP_Solution_Node::print_tree(std::ostream& s, const int indent,
+                              const std::vector<bool>& pip_dim_is_param,
+                              const dimension_type first_art_dim) const {
+  // Print info common to decision and solution nodes.
+  PIP_Tree_Node::print_tree(s, indent, pip_dim_is_param, first_art_dim);
+
+  // Print info specific of solution nodes:
+  // first update solution if needed ...
+  update_solution(pip_dim_is_param);
+  // ... and then actually print it.
+  const bool no_constraints = constraints_.empty();
+  indent_and_print(s, indent + (no_constraints ? 0 : 1), "{");
+  const dimension_type pip_space_dim = pip_dim_is_param.size();
+  for (dimension_type i = 0, num_var = 0; i < pip_space_dim; ++i) {
+    if (pip_dim_is_param[i])
+      continue;
+    if (num_var > 0)
+      s << " ; ";
+    using namespace IO_Operators;
+    s << solution[num_var];
+    ++num_var;
+  }
+  s << "}\n";
+
+  if (!no_constraints) {
+    indent_and_print(s, indent, "else\n");
+    indent_and_print(s, indent+1, "_|_\n");
+  }
+}
+
+const Linear_Expression&
+PIP_Solution_Node::parametric_values(const Variable var) const {
+  const PIP_Problem* const pip = get_owner();
+  PPL_ASSERT(pip != 0);
+
+  const dimension_type space_dim = pip->space_dimension();
+  if (var.space_dimension() > space_dim) {
+    std::ostringstream s;
+    s << "PPL::PIP_Solution_Node::parametric_values(v):\n"
+      << "v.space_dimension() == " << var.space_dimension()
+      << " is incompatible with the owning PIP_Problem "
+      << " (space dim == " << space_dim << ").";
+    throw std::invalid_argument(s.str());
+  }
+
+  dimension_type solution_index = var.id();
+  const Variables_Set& params = pip->parameter_space_dimensions();
+  for (Variables_Set::const_iterator p = params.begin(),
+         p_end = params.end(); p != p_end; ++p) {
+    const dimension_type param_index = *p;
+    if (param_index < var.id())
+      --solution_index;
+    else if (param_index == var.id())
+      throw std::invalid_argument("PPL::PIP_Solution_Node"
+                                  "::parametric_values(v):\n"
+                                  "v is a problem parameter.");
+    else
+      break;
+  }
+
+  update_solution();
+  return solution[solution_index];
+}
+
+
+void
+PIP_Solution_Node::update_solution() const {
+  // Avoid doing useless work.
+  if (solution_valid)
+    return;
+
+  const PIP_Problem* const pip = get_owner();
+  PPL_ASSERT(pip != 0);
+  std::vector<bool> pip_dim_is_param(pip->space_dimension());
+  const Variables_Set& params = pip->parameter_space_dimensions();
+  for (Variables_Set::const_iterator p = params.begin(),
+         p_end = params.end(); p != p_end; ++p)
+    pip_dim_is_param[*p] = true;
+
+  update_solution(pip_dim_is_param);
+}
+
+void
+PIP_Solution_Node
+::update_solution(const std::vector<bool>& pip_dim_is_param) const {
+  // Avoid doing useless work.
+  if (solution_valid)
+    return;
+
+  // const_cast required so as to refresh the solution cache.
+  PIP_Solution_Node& x = const_cast<PIP_Solution_Node&>(*this);
+
+  const dimension_type num_pip_dims = pip_dim_is_param.size();
+  const dimension_type num_pip_vars = tableau.s.num_columns();
+  const dimension_type num_pip_params = num_pip_dims - num_pip_vars;
+  const dimension_type num_all_params = tableau.t.num_columns() - 1;
+  const dimension_type num_art_params = num_all_params - num_pip_params;
+
+  if (solution.size() != num_pip_vars)
+    x.solution.resize(num_pip_vars);
+
+  // Compute external "names" (i.e., indices) for all parameters.
+  std::vector<dimension_type> all_param_names(num_all_params);
+
+  // External indices for problem parameters.
+  for (dimension_type i = 0, p_index = 0; i < num_pip_dims; ++i)
+    if (pip_dim_is_param[i]) {
+      all_param_names[p_index] = i;
+      ++p_index;
+    }
+  // External indices for artificial parameters.
+  for (dimension_type i = 0; i < num_art_params; ++i)
+    all_param_names[num_pip_params + i] = num_pip_dims + i;
+
+
+  PPL_DIRTY_TEMP_COEFFICIENT(norm_coeff);
+  Coefficient_traits::const_reference denom = tableau.denominator();
+  for (dimension_type i = num_pip_vars; i-- > 0; ) {
+    Linear_Expression& sol_i = x.solution[i];
+    sol_i = Linear_Expression(0);
+    if (basis[i])
+      continue;
+    const Row& row = tableau.t[mapping[i]];
+
+    // Start from index 1 to skip the inhomogeneous term.
+    Row::const_iterator j = row.begin();
+    Row::const_iterator j_end = row.end();
+    // Skip the element with index 0.
+    if (j != j_end && j.index() == 0)
+      ++j;
+    for ( ; j != j_end; ++j) {
+      Coefficient_traits::const_reference coeff = *j;
+      if (coeff == 0)
+        continue;
+      norm_coeff = coeff / denom;
+      if (norm_coeff != 0)
+        add_mul_assign(sol_i, norm_coeff,
+                      Variable(all_param_names[j.index() - 1]));
+    }
+    norm_coeff = row.get(0) / denom;
+    sol_i += norm_coeff;
+  }
+
+  // Mark solution as valid.
+  x.solution_valid = true;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/PIP_Tree_defs.hh b/src/PIP_Tree_defs.hh
new file mode 100644
index 0000000..c26d7eb
--- /dev/null
+++ b/src/PIP_Tree_defs.hh
@@ -0,0 +1,836 @@
+/* PIP_Tree_Node class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Tree_defs_hh
+#define PPL_PIP_Tree_defs_hh 1
+
+#include "PIP_Tree_types.hh"
+#include "Variable_defs.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Constraint_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "globals_defs.hh"
+#include "PIP_Problem_defs.hh"
+
+#include "Matrix_defs.hh"
+#include "Dense_Row_defs.hh"
+#include "Sparse_Row_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! A node of the PIP solution tree.
+/*!
+  This is the base class for the nodes of the binary trees representing
+  the solutions of PIP problems. From this one, two classes are derived:
+    - PIP_Decision_Node, for the internal nodes of the tree;
+    - PIP_Solution_Node, for the leaves of the tree.
+*/
+class PIP_Tree_Node {
+protected:
+  //! Constructor: builds a node owned by \p *owner.
+  explicit PIP_Tree_Node(const PIP_Problem* owner);
+
+  //! Copy constructor.
+  PIP_Tree_Node(const PIP_Tree_Node& y);
+
+  //! Returns a pointer to the PIP_Problem owning object.
+  const PIP_Problem* get_owner() const;
+
+  //! Sets the pointer to the PIP_Problem owning object.
+  virtual void set_owner(const PIP_Problem* owner) = 0;
+
+  /*! \brief
+    Returns \c true if and only if all the nodes in the subtree
+    rooted in \p *this are owned by \p *owner.
+  */
+  virtual bool check_ownership(const PIP_Problem* owner) const = 0;
+
+public:
+#if PPL_USE_SPARSE_MATRIX
+  typedef Sparse_Row Row;
+#else
+  typedef Dense_Row Row;
+#endif
+
+  //! Returns a pointer to a dynamically-allocated copy of \p *this.
+  virtual PIP_Tree_Node* clone() const = 0;
+
+  //! Destructor.
+  virtual ~PIP_Tree_Node();
+
+  //! Returns \c true if and only if \p *this is well formed.
+  virtual bool OK() const = 0;
+
+  //! Returns \p this if \p *this is a solution node, 0 otherwise.
+  virtual const PIP_Solution_Node* as_solution() const = 0;
+
+  //! Returns \p this if \p *this is a decision node, 0 otherwise.
+  virtual const PIP_Decision_Node* as_decision() const = 0;
+
+  /*! \brief
+    Returns the system of parameter constraints controlling \p *this.
+
+    The indices in the constraints are the same as the original variables and
+    parameters. Coefficients in indices corresponding to variables always are
+    zero.
+  */
+  const Constraint_System& constraints() const;
+
+  class Artificial_Parameter;
+
+  //! A type alias for a sequence of Artificial_Parameter's.
+  typedef std::vector<Artificial_Parameter> Artificial_Parameter_Sequence;
+
+  //! Returns a const_iterator to the beginning of local artificial parameters.
+  Artificial_Parameter_Sequence::const_iterator art_parameter_begin() const;
+
+  //! Returns a const_iterator to the end of local artificial parameters.
+  Artificial_Parameter_Sequence::const_iterator art_parameter_end() const;
+
+  //! Returns the number of local artificial parameters.
+  dimension_type art_parameter_count() const;
+
+  //! Prints on \p s the tree rooted in \p *this.
+  /*!
+    \param s
+    The output stream.
+
+    \param indent
+    The amount of indentation.
+  */
+  void print(std::ostream& s, int indent = 0) const;
+
+  //! Dumps to \p s an ASCII representation of \p *this.
+  void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const = 0;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const = 0;
+
+protected:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint> Constraint_Sequence;
+
+  // Only PIP_Problem and PIP_Decision_Node are allowed to use the
+  // constructor and methods.
+  friend class PIP_Problem;
+  friend class PIP_Decision_Node;
+  friend class PIP_Solution_Node;
+
+  //! A pointer to the PIP_Problem object owning this node.
+  const PIP_Problem* owner_;
+
+  //! A pointer to the parent of \p *this, null if \p *this is the root.
+  const PIP_Decision_Node* parent_;
+
+  //! The local system of parameter constraints.
+  Constraint_System constraints_;
+
+  //! The local sequence of expressions for local artificial parameters.
+  Artificial_Parameter_Sequence artificial_parameters;
+
+  //! Returns a pointer to this node's parent.
+  const PIP_Decision_Node* parent() const;
+
+  //! Set this node's parent to \p *p.
+  void set_parent(const PIP_Decision_Node* p);
+
+  /*! \brief
+    Populates the parametric simplex tableau using external data.
+
+    \param pip
+    The PIP_Problem object containing this node.
+
+    \param external_space_dim
+    The number of all problem variables and problem parameters
+    (excluding artificial parameters).
+
+    \param first_pending_constraint
+    The first element in \p input_cs to be added to the tableau,
+    which already contains the previous elements.
+
+    \param input_cs
+    All the constraints of the PIP problem.
+
+    \param parameters
+    The set of indices of the problem parameters.
+  */
+  virtual void update_tableau(const PIP_Problem& pip,
+                              dimension_type external_space_dim,
+                              dimension_type first_pending_constraint,
+                              const Constraint_Sequence& input_cs,
+                              const Variables_Set& parameters) = 0;
+
+  /*! \brief
+    Executes a parametric simplex on the tableau, under specified context.
+
+    \return
+    The root of the PIP tree solution, or 0 if unfeasible.
+
+    \param pip
+    The PIP_Problem object containing this node.
+
+    \param check_feasible_context
+    Whether the resolution process should (re-)check feasibility of
+    context (since the initial context may have been modified).
+
+    \param context
+    The context, being a set of constraints on the parameters.
+
+    \param params
+    The local parameter set, including parent's artificial parameters.
+
+    \param space_dim
+    The space dimension of parent, including artificial parameters.
+
+    \param indent_level
+    The indentation level (for debugging output only).
+  */
+  virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+                               bool check_feasible_context,
+                               const Matrix<Row>& context,
+                               const Variables_Set& params,
+                               dimension_type space_dim,
+                               int indent_level) = 0;
+
+  //! Inserts a new parametric constraint in internal row format.
+  void add_constraint(const Row& row, const Variables_Set& parameters);
+
+  //! Merges parent's artificial parameters into \p *this.
+  void parent_merge();
+
+  //! Prints on \p s the tree rooted in \p *this.
+  /*!
+    \param s
+    The output stream.
+
+    \param indent
+    The amount of indentation.
+
+    \param pip_dim_is_param
+    A vector of Boolean flags telling which PIP problem dimensions are
+    problem parameters. The size of the vector is equal to the PIP
+    problem internal space dimension (i.e., no artificial parameters).
+
+    \param first_art_dim
+    The first space dimension corresponding to an artificial parameter
+    that was created in this node (if any).
+  */
+  virtual void print_tree(std::ostream& s,
+                          int indent,
+                          const std::vector<bool>& pip_dim_is_param,
+                          dimension_type first_art_dim) const = 0;
+
+  //! A helper function used when printing PIP trees.
+  static void
+  indent_and_print(std::ostream& s, int indent, const char* str);
+
+  /*! \brief
+    Checks whether a context matrix is satisfiable.
+
+    The satisfiability check is implemented by the revised dual simplex
+    algorithm on the context matrix. The algorithm ensures the feasible
+    solution is integer by applying a cut generation method when
+    intermediate non-integer solutions are found.
+  */
+  static bool compatibility_check(Matrix<Row>& s);
+
+  /*! \brief
+    Helper method: checks for satisfiability of the restricted context
+    obtained by adding \p row to \p context.
+  */
+  static bool compatibility_check(const Matrix<Row>& context, const Row& row);
+
+}; // class PIP_Tree_Node
+
+
+/*! \brief
+  Artificial parameters in PIP solution trees.
+
+  These parameters are built from a linear expression combining other
+  parameters (constant term included) divided by a positive integer
+  denominator. Coefficients at variables indices corresponding to
+  PIP problem variables are always zero.
+*/
+class PIP_Tree_Node::Artificial_Parameter
+  : public Linear_Expression {
+public:
+  //! Default constructor: builds a zero artificial parameter.
+  Artificial_Parameter();
+
+  //! Constructor.
+  /*!
+    Builds artificial parameter \f$\frac{\mathtt{expr}}{\mathtt{d}}\f$.
+
+    \param expr
+    The expression that, after normalization, will form the numerator of
+    the artificial parameter.
+
+    \param d
+    The integer constant that, after normalization, will form the
+    denominator of the artificial parameter.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+
+    Normalization will ensure that the denominator is positive.
+  */
+  Artificial_Parameter(const Linear_Expression& expr,
+                       Coefficient_traits::const_reference d);
+
+  //! Copy constructor.
+  Artificial_Parameter(const Artificial_Parameter& y);
+
+  //! Returns the normalized (i.e., positive) denominator.
+  Coefficient_traits::const_reference denominator() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Artificial_Parameter& y);
+
+  //! Returns \c true if and only if \p *this and \p y are equal.
+  /*!
+    Note that two artificial parameters having different space dimensions
+    are considered to be different.
+  */
+  bool operator==(const Artificial_Parameter& y) const;
+  //! Returns \c true if and only if \p *this and \p y are different.
+  bool operator!=(const Artificial_Parameter& y) const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns \c true if and only if the parameter is well-formed.
+  bool OK() const;
+
+private:
+  //! The normalized (i.e., positive) denominator.
+  Coefficient denom;
+}; // class PIP_Tree_Node::Artificial_Parameter
+
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+     PIP_Tree_Node::Artificial_Parameter& y);
+
+
+//! A tree node representing part of the space of solutions.
+class PIP_Solution_Node : public PIP_Tree_Node {
+public:
+
+  //! Constructor: builds a solution node owned by \p *owner.
+  explicit PIP_Solution_Node(const PIP_Problem* owner);
+
+  //! Returns a pointer to a dynamically-allocated copy of \p *this.
+  virtual PIP_Tree_Node* clone() const;
+
+  //! Destructor.
+  virtual ~PIP_Solution_Node();
+
+  //! Returns \c true if and only if \p *this is well formed.
+  virtual bool OK() const;
+
+  //! Returns \p this.
+  virtual const PIP_Solution_Node* as_solution() const;
+
+  //! Returns 0, since \p this is not a decision node.
+  virtual const PIP_Decision_Node* as_decision() const;
+
+  /*! \brief
+    Returns a parametric expression for the values of problem variable \p var.
+
+    The returned linear expression may involve problem parameters
+    as well as artificial parameters.
+
+    \param var
+    The problem variable which is queried about.
+
+    \exception std::invalid_argument
+    Thrown if \p var is dimension-incompatible with the PIP_Problem
+    owning this solution node, or if \p var is a problem parameter.
+  */
+  const Linear_Expression& parametric_values(Variable var) const;
+
+  //! Dumps to \p os an ASCII representation of \p *this.
+  void ascii_dump(std::ostream& os) const;
+
+  /*! \brief
+    Loads from \p is an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& is);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+  //! The type for parametric simplex tableau.
+  struct Tableau {
+    //! The matrix of simplex coefficients.
+    Matrix<Row> s;
+    //! The matrix of parameter coefficients.
+    Matrix<Row> t;
+    //! A common denominator for all matrix elements
+    Coefficient denom;
+
+    //! Default constructor.
+    Tableau();
+    //! Copy constructor.
+    Tableau(const Tableau& y);
+    //! Destructor.
+    ~Tableau();
+
+    //! Tests whether the matrix is integer, i.e., the denominator is 1.
+    bool is_integer() const;
+
+    //! Multiplies all coefficients and denominator with ratio.
+    void scale(Coefficient_traits::const_reference ratio);
+
+    //! Normalizes the modulo of coefficients so that they are mutually prime.
+    /*!
+      Computes the Greatest Common Divisor (GCD) among the elements of
+      the matrices and normalizes them and the denominator by the GCD itself.
+    */
+    void normalize();
+
+    /*! \brief
+      Compares two pivot row and column pairs before pivoting.
+
+      The algorithm searches the first (ie, leftmost) column \f$k\f$ in
+      parameter matrix for which the \f$c=s_{*j}\frac{t_{ik}}{s_{ij}}\f$
+      and \f$c'=s_{*j'}\frac{t_{i'k}}{s_{i'j'}}\f$ columns are different,
+      where \f$s_{*j}\f$ denotes the \f$j\f$<sup>th</sup> column from the
+      \f$s\f$ matrix and \f$s_{*j'}\f$ is the \f$j'\f$<sup>th</sup> column
+      of \f$s\f$.
+
+      \f$c\f$ is the computed column that would be subtracted to column
+      \f$k\f$ in parameter matrix if pivoting is done using the \f$(i,j)\f$
+      row and column pair.
+      \f$c'\f$ is the computed column that would be subtracted to column
+      \f$k\f$ in parameter matrix if pivoting is done using the
+      \f$(i',j')\f$ row and column pair.
+
+      The test is true if the computed \f$-c\f$ column is lexicographically
+      bigger than the \f$-c'\f$ column. Due to the column ordering in the
+      parameter matrix of the tableau, leftmost search will enforce solution
+      increase with respect to the following priority order:
+       - the constant term
+       - the coefficients for the original parameters
+       - the coefficients for the oldest artificial parameters.
+
+      \return
+      \c true if pivot row and column pair \f$(i,j)\f$ is more
+      suitable for pivoting than the \f$(i',j')\f$ pair
+
+      \param mapping
+      The PIP_Solution_Node::mapping vector for the tableau.
+
+      \param basis
+      The PIP_Solution_Node::basis vector for the tableau.
+
+      \param row_0
+      The row number for the first pivot row and column pair to be compared.
+
+      \param col_0
+      The column number for the first pivot row and column pair to be
+      compared.
+
+      \param row_1
+      The row number for the second pivot row and column pair to be compared.
+
+      \param col_1
+      The column number for the second pivot row and column pair to be
+      compared.
+    */
+    bool is_better_pivot(const std::vector<dimension_type>& mapping,
+                         const std::vector<bool>& basis,
+                         const dimension_type row_0,
+                         const dimension_type col_0,
+                         const dimension_type row_1,
+                         const dimension_type col_1) const;
+
+    //! Returns the value of the denominator.
+    Coefficient_traits::const_reference denominator() const;
+
+    //! Dumps to \p os an ASCII representation of \p *this.
+    void ascii_dump(std::ostream& os) const;
+
+    /*! \brief
+      Loads from \p is an ASCII representation (as produced by
+      ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+      Returns \c true if successful, \c false otherwise.
+    */
+    bool ascii_load(std::istream& is);
+
+    //! Returns the size in bytes of the memory managed by \p *this.
+    /*!
+      \note
+      No need for a \c total_memory_in_bytes() method, since
+      class Tableau is a private inner class of PIP_Solution_Node.
+    */
+    memory_size_type external_memory_in_bytes() const;
+
+    //! Returns \c true if and only if \p *this is well formed.
+    bool OK() const;
+  }; // struct Tableau
+
+  //! The parametric simplex tableau.
+  Tableau tableau;
+
+  /*! \brief
+    A boolean vector for identifying the basic variables.
+
+    Variable identifiers are numbered from 0 to <CODE>n+m-1</CODE>, where \p n
+    is the number of columns in the simplex tableau corresponding to variables,
+    and \p m is the number of rows.
+
+    Indices from 0 to <CODE>n-1</CODE> correspond to the original variables.
+
+    Indices from \p n to <CODE>n+m-1</CODE> correspond to the slack variables
+    associated to the internal constraints, which do not strictly correspond
+    to original constraints, since these may have been transformed to fit the
+    standard form of the dual simplex.
+
+    The value for <CODE>basis[i]</CODE> is:
+     - \b true if variable \p i is basic,
+     - \b false if variable \p i is nonbasic.
+  */
+  std::vector<bool> basis;
+
+  /*! \brief
+    A mapping between the tableau rows/columns and the original variables.
+
+    The value of <CODE>mapping[i]</CODE> depends of the value of <CODE>basis[i]</CODE>.
+
+     - If <CODE>basis[i]</CODE> is \b true, <CODE>mapping[i]</CODE> encodes the column
+       index of variable \p i in the \p s matrix of the tableau.
+     - If <CODE>basis[i]</CODE> is \b false, <CODE>mapping[i]</CODE> encodes the row
+       index of variable \p i in the tableau.
+  */
+  std::vector<dimension_type> mapping;
+
+  /*! \brief
+    The variable identifiers associated to the rows of the simplex tableau.
+  */
+  std::vector<dimension_type> var_row;
+
+  /*! \brief
+    The variable identifiers associated to the columns of the simplex tableau.
+  */
+  std::vector<dimension_type> var_column;
+
+  /*! \brief
+    The variable number of the special inequality used for modeling
+    equality constraints.
+
+    The subset of equality constraints in a specific problem can be expressed
+    as: \f$f_i(x,p) = 0 ; 1 \leq i \leq n\f$. As the dual simplex standard form
+    requires constraints to be inequalities, the following constraints can be
+    modeled as follows:
+
+     - \f$f_i(x,p) \geq 0 ; 1 \leq i \leq n\f$
+
+     - \f$\sum\limits_{i=1}^n f_i(x,p) \leq 0\f$
+
+    The \p special_equality_row value stores the variable number of the
+    specific constraint which is used to model the latter sum of
+    constraints. If no such constraint exists, the value is set to \p 0.
+  */
+  dimension_type special_equality_row;
+
+  /*! \brief
+    The column index in the parametric part of the simplex tableau
+    corresponding to the big parameter; \c not_a_dimension() if not set.
+  */
+  dimension_type big_dimension;
+
+  //! The possible values for the sign of a parametric linear expression.
+  enum Row_Sign {
+    //! Not computed yet (default).
+    UNKNOWN,
+    //! All row coefficients are zero.
+    ZERO,
+    //! All nonzero row coefficients are positive.
+    POSITIVE,
+    //! All nonzero row coefficients are negative.
+    NEGATIVE,
+    //! The row contains both positive and negative coefficients.
+    MIXED
+  };
+
+  //! A cache for computed sign values of constraint parametric RHS.
+  std::vector<Row_Sign> sign;
+
+  //! Parametric values for the solution.
+  std::vector<Linear_Expression> solution;
+
+  //! An indicator for solution validity.
+  bool solution_valid;
+
+  //! Returns the sign of row \p x.
+  static Row_Sign row_sign(const Row& x,
+                           dimension_type big_dimension);
+
+protected:
+  //! Copy constructor.
+  PIP_Solution_Node(const PIP_Solution_Node& y);
+
+  //! A tag type to select the alternative copy constructor.
+  struct No_Constraints {};
+
+  //! Alternative copy constructor.
+  /*!
+    This constructor differs from the default copy constructor in that
+    it will not copy the constraint system, nor the artificial parameters.
+  */
+  PIP_Solution_Node(const PIP_Solution_Node& y, No_Constraints);
+
+  // PIP_Problem::ascii load() method needs access set_owner().
+  friend bool PIP_Problem::ascii_load(std::istream& s);
+
+  //! Sets the pointer to the PIP_Problem owning object.
+  virtual void set_owner(const PIP_Problem* owner);
+
+  /*! \brief
+    Returns \c true if and only if all the nodes in the subtree
+    rooted in \p *this is owned by \p *pip.
+  */
+  virtual bool check_ownership(const PIP_Problem* owner) const;
+
+  //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+  virtual void update_tableau(const PIP_Problem& pip,
+                              dimension_type external_space_dim,
+                              dimension_type first_pending_constraint,
+                              const Constraint_Sequence& input_cs,
+                              const Variables_Set& parameters);
+
+  /*! \brief
+    Update the solution values.
+
+    \param pip_dim_is_param
+    A vector of Boolean flags telling which PIP problem dimensions are
+    problem parameters. The size of the vector is equal to the PIP
+    problem internal space dimension (i.e., no artificial parameters).
+  */
+  void update_solution(const std::vector<bool>& pip_dim_is_param) const;
+
+  //! Helper method.
+  void update_solution() const;
+
+  //! Implements pure virtual method PIP_Tree_Node::solve.
+  virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+                               bool check_feasible_context,
+                               const Matrix<Row>& context,
+                               const Variables_Set& params,
+                               dimension_type space_dim,
+                               int indent_level);
+
+  /*! \brief
+    Generate a Gomory cut using non-integer tableau row \p index.
+
+    \param index
+    Row index in simplex tableau from which the cut is generated.
+
+    \param parameters
+    A std::set of the current parameter dimensions (including artificials);
+    to be updated if a new artificial parameter is to be created.
+
+    \param context
+    A set of linear inequalities on the parameters, in matrix form; to be
+    updated if a new artificial parameter is to be created.
+
+    \param space_dimension
+    The current space dimension, including variables and all parameters; to
+    be updated if an extra parameter is to be created.
+
+    \param indent_level
+    The indentation level (for debugging output only).
+  */
+  void generate_cut(dimension_type index, Variables_Set& parameters,
+                    Matrix<Row>& context, dimension_type& space_dimension,
+                    int indent_level);
+
+  //! Prints on \p s the tree rooted in \p *this.
+  virtual void print_tree(std::ostream& s, int indent,
+                          const std::vector<bool>& pip_dim_is_param,
+                          dimension_type first_art_dim) const;
+
+}; // class PIP_Solution_Node
+
+
+//! A tree node representing a decision in the space of solutions.
+class PIP_Decision_Node : public PIP_Tree_Node {
+public:
+  //! Returns a pointer to a dynamically-allocated copy of \p *this.
+  virtual PIP_Tree_Node* clone() const;
+
+  //! Destructor.
+  virtual ~PIP_Decision_Node();
+
+  //! Returns \c true if and only if \p *this is well formed.
+  virtual bool OK() const;
+
+  //! Returns \p this.
+  virtual const PIP_Decision_Node* as_decision() const;
+
+  //! Returns 0, since \p this is not a solution node.
+  virtual const PIP_Solution_Node* as_solution() const;
+
+  //! Returns a const pointer to the \p b (true or false) branch of \p *this.
+  const PIP_Tree_Node* child_node(bool b) const;
+
+  //! Returns a pointer to the \p b (true or false) branch of \p *this.
+  PIP_Tree_Node* child_node(bool b);
+
+  //! Dumps to \p s an ASCII representation of \p *this.
+  void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+  // PIP_Solution_Node is allowed to use the constructor and methods.
+  friend class PIP_Solution_Node;
+
+  // PIP_Problem ascii load method needs access to private constructors.
+  friend bool PIP_Problem::ascii_load(std::istream& s);
+
+  //! Pointer to the "false" child of \p *this.
+  PIP_Tree_Node* false_child;
+
+  //! Pointer to the "true" child of \p *this.
+  PIP_Tree_Node* true_child;
+
+  /*! \brief
+    Builds a decision node having \p fcp and \p tcp as child.
+
+    The decision node will encode the structure
+    "if \c cs then \p tcp else \p fcp",
+    where the system of constraints \c cs is initially empty.
+
+    \param owner
+    Pointer to the owning PIP_Problem object; it may be null if and
+    only if both children are null.
+
+    \param fcp
+    Pointer to "false" child; it may be null.
+
+    \param tcp
+    Pointer to "true" child; it may be null.
+
+    \note
+    If any of \p fcp or \p tcp is not null, then \p owner is required
+    to be not null and equal to the owner of its non-null children;
+    otherwise the behavior is undefined.
+  */
+  explicit PIP_Decision_Node(const PIP_Problem* owner,
+                             PIP_Tree_Node* fcp,
+                             PIP_Tree_Node* tcp);
+
+  //! Sets the pointer to the PIP_Problem owning object.
+  virtual void set_owner(const PIP_Problem* owner);
+
+  /*! \brief
+    Returns \c true if and only if all the nodes in the subtree
+    rooted in \p *this is owned by \p *pip.
+  */
+  virtual bool check_ownership(const PIP_Problem* owner) const;
+
+protected:
+  //! Copy constructor.
+  PIP_Decision_Node(const PIP_Decision_Node& y);
+
+  //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+  virtual void update_tableau(const PIP_Problem& pip,
+                              dimension_type external_space_dim,
+                              dimension_type first_pending_constraint,
+                              const Constraint_Sequence& input_cs,
+                              const Variables_Set& parameters);
+
+  //! Implements pure virtual method PIP_Tree_Node::solve.
+  virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+                               bool check_feasible_context,
+                               const Matrix<Row>& context,
+                               const Variables_Set& params,
+                               dimension_type space_dim,
+                               int indent_level);
+
+  //! Prints on \p s the tree rooted in \p *this.
+  virtual void print_tree(std::ostream& s, int indent,
+                          const std::vector<bool>& pip_dim_is_param,
+                          dimension_type first_art_dim) const;
+
+}; // class PIP_Decision_Node
+
+namespace IO_Operators {
+
+//! Output operator: prints the solution tree rooted in \p x.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node */
+std::ostream& operator<<(std::ostream& os, const PIP_Tree_Node& x);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter */
+std::ostream& operator<<(std::ostream& os,
+                         const PIP_Tree_Node::Artificial_Parameter& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "PIP_Tree_inlines.hh"
+
+#endif // !defined(PPL_PIP_Tree_defs_hh)
diff --git a/src/PIP_Tree_inlines.hh b/src/PIP_Tree_inlines.hh
new file mode 100644
index 0000000..6e666d9
--- /dev/null
+++ b/src/PIP_Tree_inlines.hh
@@ -0,0 +1,140 @@
+/* PIP_Tree related class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_PIP_Tree_inlines_hh
+#define PPL_PIP_Tree_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+PIP_Solution_Node::Tableau::Tableau()
+  : s(), t(), denom(1) {
+  PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::Tableau(const Tableau& y)
+  : s(y.s), t(y.t), denom(y.denom) {
+  PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::~Tableau() {
+}
+
+inline bool
+PIP_Solution_Node::Tableau::is_integer() const {
+  return denom == 1;
+}
+
+inline Coefficient_traits::const_reference
+PIP_Solution_Node::Tableau::denominator() const {
+  return denom;
+}
+
+inline
+PIP_Tree_Node::~PIP_Tree_Node() {
+}
+
+inline void
+PIP_Tree_Node::set_parent(const PIP_Decision_Node* p) {
+  parent_ = p;
+}
+
+inline const PIP_Decision_Node*
+PIP_Tree_Node::parent() const {
+  return parent_;
+}
+
+inline const PIP_Problem*
+PIP_Tree_Node::get_owner() const {
+  return owner_;
+}
+
+inline const Constraint_System&
+PIP_Tree_Node::constraints() const {
+  return constraints_;
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_begin() const {
+  return artificial_parameters.begin();
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_end() const {
+  return artificial_parameters.end();
+}
+
+inline dimension_type
+PIP_Tree_Node::art_parameter_count() const {
+  return artificial_parameters.size();
+}
+
+inline
+const PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) const {
+  return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) {
+  return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter::Artificial_Parameter()
+  : Linear_Expression(), denom(1) {
+  PPL_ASSERT(OK());
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter
+::Artificial_Parameter(const Artificial_Parameter& y)
+  : Linear_Expression(y), denom(y.denom) {
+  PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+PIP_Tree_Node::Artificial_Parameter::denominator() const {
+  return denom;
+}
+
+inline void
+PIP_Tree_Node::Artificial_Parameter::m_swap(Artificial_Parameter& y) {
+  Linear_Expression::m_swap(y);
+  using std::swap;
+  swap(denom, y.denom);
+}
+
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+inline void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+     PIP_Tree_Node::Artificial_Parameter& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Tree_inlines_hh)
diff --git a/src/PIP_Tree_types.hh b/src/PIP_Tree_types.hh
new file mode 100644
index 0000000..2eb61ad
--- /dev/null
+++ b/src/PIP_Tree_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_PIP_Tree_types_hh
+#define PPL_PIP_Tree_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class PIP_Tree_Node;
+class PIP_Solution_Node;
+class PIP_Decision_Node;
+
+typedef const PIP_Tree_Node* PIP_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_PIP_Tree_types_hh)
diff --git a/src/Partial_Function.cc b/src/Partial_Function.cc
new file mode 100644
index 0000000..b20e036
--- /dev/null
+++ b/src/Partial_Function.cc
@@ -0,0 +1,42 @@
+/* Implementation of class Partial_Function (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Partial_Function_defs.hh"
+#include "Variable_defs.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+void
+Partial_Function::print(std::ostream& s) const {
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  if (has_empty_codomain())
+    s << "empty" << std::endl;
+  else
+    for (dimension_type i = 0, i_end = vec.size(); i < i_end; ++i)
+      if (vec[i] != not_a_dimension())
+        s << Variable(i) << " --> " << Variable(vec[i]) << "\n";
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Partial_Function_defs.hh b/src/Partial_Function_defs.hh
new file mode 100644
index 0000000..a621eef
--- /dev/null
+++ b/src/Partial_Function_defs.hh
@@ -0,0 +1,87 @@
+/* Partial_Function class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partial_Function_defs_hh
+#define PPL_Partial_Function_defs_hh 1
+
+#include "Partial_Function_types.hh"
+#include "globals_defs.hh"
+#include <vector>
+#ifndef NDEBUG
+#include <set>
+#endif
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function {
+public:
+  /*! \brief
+    Default constructor: builds a function with empty codomain
+    (i.e., always undefined).
+  */
+  Partial_Function();
+
+  /*! \brief
+    Returns \c true if and only if the represented partial function
+    has an empty codomain (i.e., it is always undefined).
+  */
+  bool has_empty_codomain() const;
+
+  /*! \brief
+    If the codomain is \e not empty, returns the maximum value in it.
+
+    \exception std::runtime_error
+    Thrown if called when \p *this has an empty codomain.
+  */
+  dimension_type max_in_codomain() const;
+
+  /*! \brief
+    If \p *this maps \p i to a value \c k, assigns \c k to \p j and
+    returns \c true; otherwise, \p j is unchanged and \c false is returned.
+  */
+  bool maps(dimension_type i, dimension_type& j) const;
+
+  void print(std::ostream& s) const;
+
+  /*! \brief
+    Modifies \p *this so that \p i is mapped to \p j.
+
+    \exception std::runtime_error
+    Thrown if \p *this is already mapping \p j.
+  */
+  void insert(dimension_type i, dimension_type j);
+
+private:
+  std::vector<dimension_type> vec;
+  dimension_type max;
+#ifndef NDEBUG
+  std::set<dimension_type> codomain;
+#endif
+}; // class Partial_Function
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Partial_Function_inlines.hh"
+
+#endif // !defined(PPL_Partial_Function_defs_hh)
diff --git a/src/Partial_Function_inlines.hh b/src/Partial_Function_inlines.hh
new file mode 100644
index 0000000..03fa44f
--- /dev/null
+++ b/src/Partial_Function_inlines.hh
@@ -0,0 +1,90 @@
+/* Partial_Function class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partial_Function_inlines_hh
+#define PPL_Partial_Function_inlines_hh 1
+
+#include <stdexcept>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Partial_Function::Partial_Function()
+  : max(0) {
+}
+
+inline bool
+Partial_Function::has_empty_codomain() const {
+  PPL_ASSERT(vec.empty() == codomain.empty());
+  return vec.empty();
+}
+
+inline dimension_type
+Partial_Function::max_in_codomain() const {
+  if (has_empty_codomain())
+    throw std::runtime_error("Partial_Function::max_in_codomain() called"
+                             " when has_empty_codomain()");
+  PPL_ASSERT(codomain.begin() != codomain.end()
+             && max == *codomain.rbegin());
+  return max;
+}
+
+inline void
+Partial_Function::insert(dimension_type i, dimension_type j) {
+#ifndef NDEBUG
+  // The partial function has to be an injective map.
+  std::pair<std::set<dimension_type>::iterator, bool> s = codomain.insert(j);
+  PPL_ASSERT(s.second);
+#endif // #ifndef NDEBUG
+
+  // Expand `vec' if needed.
+  const dimension_type sz = vec.size();
+  if (i >= sz)
+    vec.insert(vec.end(), i - sz + 1, not_a_dimension());
+
+  // We cannot remap the same index to another one.
+  PPL_ASSERT(i < vec.size() && vec[i] == not_a_dimension());
+  vec[i] = j;
+
+  // Maybe update `max'.
+  if (j > max)
+    max = j;
+  PPL_ASSERT(codomain.begin() != codomain.end()
+             && max == *codomain.rbegin());
+}
+
+inline bool
+Partial_Function::maps(dimension_type i, dimension_type& j) const {
+  if (i >= vec.size())
+    return false;
+  const dimension_type vec_i = vec[i];
+  if (vec_i == not_a_dimension())
+    return false;
+  j = vec_i;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partial_Function_inlines_hh)
diff --git a/src/Partial_Function_types.hh b/src/Partial_Function_types.hh
new file mode 100644
index 0000000..647d135
--- /dev/null
+++ b/src/Partial_Function_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Partial_Function_types_hh
+#define PPL_Partial_Function_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partial_Function_types_hh)
diff --git a/src/Partially_Reduced_Product_defs.hh b/src/Partially_Reduced_Product_defs.hh
new file mode 100644
index 0000000..5f830bc
--- /dev/null
+++ b/src/Partially_Reduced_Product_defs.hh
@@ -0,0 +1,1689 @@
+/* Partially_Reduced_Product class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_defs_hh
+#define PPL_Partially_Reduced_Product_defs_hh 1
+
+#include "Partially_Reduced_Product_types.hh"
+#include "globals_types.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_types.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+#include "Constraint_System_types.hh"
+#include "Generator_System_types.hh"
+#include "Congruence_System_types.hh"
+#include "Grid_Generator_System_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Grid_types.hh"
+#include "Box_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Partially_Reduced_Product
+  Writes a textual representation of \p dp on \p s.
+*/
+template <typename D1, typename D2, typename R>
+std::ostream&
+operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+void swap(Partially_Reduced_Product<D1, D2, R>& x,
+          Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are pairwise equal.
+
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+                const Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are not pairwise equal.
+
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+                const Partially_Reduced_Product<D1, D2, R>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/*! \brief
+  This class provides the reduction method for the Smash_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class propagates emptiness between its components.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Smash_Reduction {
+public:
+  //! Default constructor.
+  Smash_Reduction();
+
+  /*! \brief
+    The smash reduction operator for propagating emptiness between the
+    domain elements \p d1 and \p d2.
+
+    If either of the the domain elements \p d1 or \p d2 is empty
+    then the other is also set empty.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Smash_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Constraints_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class adds the constraints defining each of the component
+  domains to the other component.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Constraints_Reduction {
+public:
+  //! Default constructor.
+  Constraints_Reduction();
+
+  /*! \brief
+    The constraints reduction operator for sharing constraints between the
+    domains.
+
+    The minimized constraint system defining the domain element \p d1
+    is added to \p d2 and the minimized constraint system  defining \p d2
+    is added to \p d1.
+    In each case, the donor domain must provide a constraint system
+    in minimal form; this must define a polyhedron in which the
+    donor element is contained.
+    The recipient domain selects a subset of these constraints
+    that it can add to the recipient element.
+    For example: if the domain \p D1 is the Grid domain and \p D2
+    the NNC Polyhedron domain, then only the equality constraints are copied
+    from \p d1 to \p d2 and from \p d2 to \p d1.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Constraints_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Congruences_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain.
+
+  This class uses the minimized congruences defining each of the components.
+  For each of the congruences, it checks if the other component
+  intersects none, one or more than one hyperplane defined by the congruence
+  and adds equalities or emptiness as appropriate; in more detail:
+  Letting the components be d1 and d2, then, for each congruence cg
+  representing d1:
+  - if more than one hyperplane defined by cg intersects
+    d2, then d1 and d2 are unchanged;
+  - if exactly one hyperplane intersects d2, then d1 and d2 are
+    refined with the corresponding equality ;
+  - otherwise, d1 and d2 are set to empty.
+  Unless d1 and d2 are already empty, the process is repeated where the
+  roles of d1 and d2 are reversed.
+  If d1 or d2 is empty, then the emptiness is propagated.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Congruences_Reduction {
+public:
+  //! Default constructor.
+  Congruences_Reduction();
+
+  /*! \brief
+    The congruences reduction operator for detect emptiness or any equalities
+    implied by each of the congruences defining one of the components
+    and the bounds of the other component. It is assumed that the
+    components are already constraints reduced.
+
+    The minimized congruence system defining the domain element \p d1
+    is used to check if \p d2 intersects none, one or more than one
+    of the hyperplanes defined by the congruences: if it intersects none,
+    then product is set empty; if it intersects one, then the equality
+    defining this hyperplane is added to both components; otherwise,
+    the product is unchanged.
+    In each case, the donor domain must provide a congruence system
+    in minimal form.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Congruences_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Shape_Preserving_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain.
+
+  This reduction method includes the congruences reduction.
+  This class uses the minimized constraints defining each of the components.
+  For each of the constraints, it checks the frequency and value for the same
+  linear expression in the other component. If the constraint does not satisfy
+  the implied congruence, the inhomogeneous term is adjusted so that it does.
+  Note that, unless the congruences reduction adds equalities, the
+  shapes of the domains are unaltered.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Shape_Preserving_Reduction {
+public:
+  //! Default constructor.
+  Shape_Preserving_Reduction();
+
+  /*! \brief
+    The congruences reduction operator for detect emptiness or any equalities
+    implied by each of the congruences defining one of the components
+    and the bounds of the other component. It is assumed that the
+    components are already constraints reduced.
+
+    The minimized congruence system defining the domain element \p d1
+    is used to check if \p d2 intersects none, one or more than one
+    of the hyperplanes defined by the congruences: if it intersects none,
+    then product is set empty; if it intersects one, then the equality
+    defining this hyperplane is added to both components; otherwise,
+    the product is unchanged.
+    In each case, the donor domain must provide a congruence system
+    in minimal form.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Shape_Preserving_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Direct_Product domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain template parameter \p R. This class does no reduction at all.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::No_Reduction {
+public:
+  //! Default constructor.
+  No_Reduction();
+
+  /*! \brief
+    The null reduction operator.
+
+    The parameters \p d1 and \p d2 are ignored.
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~No_Reduction();
+};
+
+//! The partially reduced product of two abstractions.
+/*! \ingroup PPL_CXX_interface
+
+  \warning
+  At present, the supported instantiations for the
+  two domain templates \p D1 and \p D2 are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape\<T\></CODE>,
+  <CODE>BD_Shape\<T\></CODE>,
+  <CODE>Box\<T\></CODE>.
+
+  An object of the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE>
+  represents the (partially reduced) product of two pointset domains \p D1
+  and \p D2 where the form of any reduction is defined by the
+  reduction class \p R.
+
+  Suppose \f$D_1\f$ and \f$D_2\f$ are two abstract domains
+  with concretization functions:
+  \f$\fund{\gamma_1}{D_1}{\Rset^n}\f$ and
+  \f$\fund{\gamma_2}{D_2}{\Rset^n}\f$, respectively.
+
+  The partially reduced product \f$D = D_1 \times D_2\f$,
+  for any reduction class \p R, has a concretization
+  \f$\fund{\gamma}{D}{\Rset^n}\f$
+  where, if \f$d = (d_1, d_2) \in D\f$
+  \f[
+    \gamma(d) = \gamma_1(d_1) \inters \gamma_2(d_2).
+  \f]
+
+  The operations are defined to be the result of applying the corresponding
+  operations on each of the components provided the product is already reduced
+  by the reduction method defined by \p R.
+  In particular, if \p R is the <CODE>No_Reduction\<D1, D2\></CODE> class,
+  then the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> domain
+  is the direct product as defined in \ref CC79 "[CC79]".
+
+  How the results on the components are interpreted and
+  combined depend on the specific test.
+  For example, the test for emptiness will first make sure
+  the product is reduced (using the reduction method provided by \p R
+  if it is not already known to be reduced) and then test if either component
+  is empty; thus, if \p R defines no reduction between its components and
+  \f$d = (G, P) \in (\Gset \times \Pset)\f$
+  is a direct product in one dimension where \f$G\f$ denotes the set of
+  numbers that are integral multiples of 3 while \f$P\f$ denotes the
+  set of numbers between 1 and 2, then an operation that tests for
+  emptiness should return false.
+  However, the test for the universe returns true if and only if the
+  test <CODE>is_universe()</CODE> on both components returns true.
+
+  \par
+  In all the examples it is assumed that the template \c R is the
+  <CODE>No_Reduction\<D1, D2\></CODE> class and that variables
+  \c x and \c y are defined (where they are used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a direct product of a Grid and NNC Polyhedron,
+  corresponding to the positive even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> >
+    dp(cgs);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  \endcode
+
+  \par Example 2
+  The following code builds the same product
+  in \f$\Rset^2\f$:
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(2);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((y %= 0) / 2);
+  \endcode
+
+  \par Example 3
+  The following code will write "dp is empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((x %= 1) / 2);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
+  else
+    cout << "dp is not empty." << endl;
+  \endcode
+
+  \par Example 4
+  The following code will write "dp is not empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_constraint(x >= 1);
+  dp.add_constraint(x <= 1);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
+  else
+    cout << "dp is not empty." << endl;
+  \endcode
+*/
+
+template <typename D1, typename D2, typename R>
+class Parma_Polyhedra_Library::Partially_Reduced_Product {
+public:
+  /*! \brief
+    Returns the maximum space dimension this product
+    can handle.
+  */
+  static dimension_type max_space_dimension();
+
+  //! Builds an object having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the pair;
+
+    \param kind
+    Specifies whether a universe or an empty pair has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(dimension_type num_dimensions = 0,
+                                     Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a pair, copying a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Congruence_System& cgs);
+
+  //! Builds a pair, recycling a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences to be approximates by the pair.
+    Its data-structures may be recycled to build the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(Congruence_System& cgs);
+
+  //! Builds a pair, copying a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Constraint_System& cs);
+
+  //! Builds a pair, recycling a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p cs exceeds the maximum allowed
+    space dimension.
+  */
+  explicit Partially_Reduced_Product(Constraint_System& cs);
+
+  //! Builds a product, from a C polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
+
+    \param ph
+    The polyhedron to be approximated by the product.
+
+    \param complexity
+    The complexity that will not be exceeded.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product, from an NNC polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
+
+    \param ph
+    The polyhedron to be approximated by the product.
+
+    \param complexity
+    The complexity that will not be exceeded.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product, from a grid.
+  /*!
+    Builds a product containing \p gr.
+    The product inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be approximated by the product.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const Grid& gr,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of a box.
+  /*!
+    Builds a product containing \p box.
+    The product inherits the space dimension of the box.
+
+    \param box
+    The box representing the pair to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  Partially_Reduced_Product(const Box<Interval>& box,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of a BD shape.
+  /*!
+    Builds a product containing \p bd.
+    The product inherits the space dimension of the BD shape.
+
+    \param bd
+    The BD shape representing the product to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const BD_Shape<U>& bd,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of an octagonal shape.
+  /*!
+    Builds a product containing \p os.
+    The product inherits the space dimension of the octagonal shape.
+
+    \param os
+    The octagonal shape representing the product to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const Octagonal_Shape<U>& os,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename E1, typename E2, typename S>
+  explicit
+  Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Partially_Reduced_Product& operator=(const Partially_Reduced_Product& y);
+
+  //! \name Member Functions that Do Not Modify the Partially_Reduced_Product
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns the minimum \ref Affine_Independence_and_Affine_Dimension
+    "affine dimension"
+    (see also \ref Grid_Affine_Dimension "grid affine dimension")
+    of the components of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a constant reference to the first of the pair.
+  const D1& domain1() const;
+
+  //! Returns a constant reference to the second of the pair.
+  const D2& domain2() const;
+
+  //! Returns a system of constraints which approximates \p *this.
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Returns a system of constraints which approximates \p *this, in
+    reduced form.
+  */
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences which approximates \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a system of congruences which approximates \p *this, in
+    reduced form.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+
+    Returns the Poly_Con_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r implies <CODE>is_included()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_included()</CODE>;
+    \p r implies <CODE>saturates()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>saturates()</CODE>;
+    \p r implies <CODE>is_disjoint()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_disjoint()</CODE>;
+    and \p r implies <CODE>nothing()</CODE>
+    if and only if both \p r1 and \p r2 imply
+    <CODE>strictly_intersects()</CODE>.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+
+    Returns the Poly_Gen_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r = <CODE>subsumes()</CODE>
+    if and only if \p r1 = \p r2 = <CODE>subsumes()</CODE>;
+    and \p r = <CODE>nothing()</CODE>
+    if and only if one or both of \p r1 and \p r2 = <CODE>nothing()</CODE>;
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if either of the components
+    of \p *this are empty.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are the universe.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are topologically closed subsets of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    componentwise disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Partially_Reduced_Product& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is discrete.
+  */
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is bounded.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below i \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+    \param g
+    When minimization succeeds, will be assigned the point or closure
+    point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    contains the corresponding component of \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Partially_Reduced_Product& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    strictly contains the corresponding component of \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Partially_Reduced_Product& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Partially_Reduced_Product
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Partially_Reduced_Product
+  //@{
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Adds a copy of the congruences in \p cgs to \p *this.
+  /*!
+    \param cgs
+    The congruence system to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added that may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  //! Adds a copy of the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  //! Adds the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added that may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Assigns to \p *this the componentwise intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+    If it is exact on each of the components of \p *this, <CODE>true</CODE>
+    is returned, otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an approximation of the set-theoretic difference
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Single_Update_Affine_Functions
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref  Single_Update_Affine_Functions
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym
+    (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Time_Elapse_Operator
+    "time-elapse" between \p *this and \p y.
+    (See also \ref Grid_Time_Elapse "time-elapse".)
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Partially_Reduced_Product& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  // TODO: Add a way to call other widenings.
+
+  // CHECKME: This may not be a real widening; it depends on the reduction
+  //          class R and the widening used.
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    "widening" between \p *this and \p y.
+
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
+
+    \param y
+    A product that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Partially_Reduced_Product& y,
+                       unsigned* tp = NULL);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the components
+    of \p *this in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions and does not embed the components
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to the first (resp., second) component of \p *this
+    the "concatenation" of the first (resp., second) components
+    of \p *this and \p y, taken in this order.
+    See also \ref Concatenating_Polyhedra.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Partially_Reduced_Product& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template class <CODE>Partial_Function</CODE> must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing \p *this.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.  Also
+    thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==<>(const Partially_Reduced_Product<D1, D2, R>& x,
+                           const Partially_Reduced_Product<D1, D2, R>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::
+  operator<<<>(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Partially_Reduced_Product();
+
+  /*! \brief
+    Swaps \p *this with product \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void m_swap(Partially_Reduced_Product& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+  //! Reduce.
+  /*
+    \return
+    <CODE>true</CODE> if and only if either of the resulting component
+    is strictly contained in the respective original.
+  */
+  bool reduce() const;
+
+protected:
+  //! The type of the first component.
+  typedef D1 Domain1;
+
+  //! The type of the second component.
+  typedef D2 Domain2;
+
+  //! The first component.
+  D1 d1;
+
+  //! The second component.
+  D2 d2;
+
+protected:
+  //! Clears the reduced flag.
+  void clear_reduced_flag() const;
+
+  //! Sets the reduced flag.
+  void set_reduced_flag() const;
+
+  //! Return <CODE>true</CODE> if and only if the reduced flag is set.
+  bool is_reduced() const;
+
+  /*! \brief
+    Flag to record whether the components are reduced with respect
+    to each other and the reduction class.
+  */
+  bool reduced;
+
+private:
+  void throw_space_dimension_overflow(const char* method,
+                                      const char* reason);
+};
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  This class is temporary and will be removed when template typedefs will
+  be supported in C++.
+
+  When template typedefs will be supported in C++, what now is verbosely
+  denoted by <CODE>Domain_Product\<Domain1, Domain2\>::%Direct_Product</CODE>
+  will simply be denoted by <CODE>Direct_Product\<Domain1, Domain2\></CODE>.
+*/
+template <typename D1, typename D2>
+class Domain_Product {
+public:
+  typedef Partially_Reduced_Product<D1, D2, No_Reduction<D1, D2> >
+  Direct_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Smash_Reduction<D1, D2> >
+  Smash_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Constraints_Reduction<D1, D2> >
+  Constraints_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Congruences_Reduction<D1, D2> >
+  Congruences_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Shape_Preserving_Reduction<D1, D2> >
+  Shape_Preserving_Product;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Partially_Reduced_Product_inlines.hh"
+#include "Partially_Reduced_Product_templates.hh"
+
+#endif // !defined(PPL_Partially_Reduced_Product_defs_hh)
diff --git a/src/Partially_Reduced_Product_inlines.hh b/src/Partially_Reduced_Product_inlines.hh
new file mode 100644
index 0000000..378b5a7
--- /dev/null
+++ b/src/Partially_Reduced_Product_inlines.hh
@@ -0,0 +1,815 @@
+/* Partially_Reduced_Product class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_inlines_hh
+#define PPL_Partially_Reduced_Product_inlines_hh 1
+
+#include "Constraint_System_defs.hh"
+#include "Congruence_System_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::max_space_dimension() {
+  return (D1::max_space_dimension() < D2::max_space_dimension())
+    ? D1::max_space_dimension()
+    : D2::max_space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(dimension_type num_dimensions,
+                            const Degenerate_Element kind)
+  : d1(num_dimensions <= max_space_dimension()
+       ? num_dimensions
+       : (throw_space_dimension_overflow("Partially_Reduced_Product(n, k)",
+                                         "n exceeds the maximum "
+                                         "allowed space dimension"),
+          num_dimensions),
+       kind),
+    d2(num_dimensions, kind) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Congruence_System& cgs)
+  : d1(cgs), d2(cgs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Congruence_System& cgs)
+  : d1(const_cast<const Congruence_System&>(cgs)), d2(cgs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Constraint_System& cs)
+  : d1(cs), d2(cs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Constraint_System& cs)
+  : d1(const_cast<const Constraint_System&>(cs)), d2(cs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Grid& gr, Complexity_Class)
+  : d1(gr), d2(gr) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Interval>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Box<Interval>& box, Complexity_Class)
+  : d1(box), d2(box) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const BD_Shape<U>& bd, Complexity_Class)
+  : d1(bd), d2(bd) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Octagonal_Shape<U>& os, Complexity_Class)
+  : d1(os), d2(os) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class)
+  : d1(y.d1), d2(y.d2) {
+  reduced = y.reduced;
+}
+
+template <typename D1, typename D2, typename R>
+template <typename E1, typename E2, typename S>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity)
+  : d1(y.space_dimension()), d2(y.space_dimension()), reduced(false) {
+  Partially_Reduced_Product<D1, D2, R> pg1(y.domain1(), complexity);
+  Partially_Reduced_Product<D1, D2, R> pg2(y.domain2(), complexity);
+  pg1.intersection_assign(pg2);
+  m_swap(pg1);
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>::~Partially_Reduced_Product() {
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::external_memory_in_bytes() const {
+  return d1.external_memory_in_bytes() + d2.external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::space_dimension() const {
+  PPL_ASSERT(d1.space_dimension() == d2.space_dimension());
+  return d1.space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::affine_dimension() const {
+  reduce();
+  const dimension_type d1_dim = d1.affine_dimension();
+  const dimension_type d2_dim = d2.affine_dimension();
+  return std::min(d1_dim, d2_dim);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variable var) {
+  reduce();
+  d1.unconstrain(var);
+  d2.unconstrain(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::unconstrain(const Variables_Set& vars) {
+  reduce();
+  d1.unconstrain(vars);
+  d2.unconstrain(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::intersection_assign(const Partially_Reduced_Product& y) {
+  d1.intersection_assign(y.d1);
+  d2.intersection_assign(y.d2);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::difference_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.difference_assign(y.d1);
+  d2.difference_assign(y.d2);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.upper_bound_assign(y.d1);
+  d2.upper_bound_assign(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign_if_exact(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  D1 d1_copy = d1;
+  bool ub_exact = d1_copy.upper_bound_assign_if_exact(y.d1);
+  if (!ub_exact)
+    return false;
+  ub_exact = d2.upper_bound_assign_if_exact(y.d2);
+  if (!ub_exact)
+    return false;
+  using std::swap;
+  swap(d1, d1_copy);
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_image(Variable var,
+               const Linear_Expression& expr,
+               Coefficient_traits::const_reference denominator) {
+  d1.affine_image(var, expr, denominator);
+  d2.affine_image(var, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_preimage(Variable var,
+                  const Linear_Expression& expr,
+                  Coefficient_traits::const_reference denominator) {
+  d1.affine_preimage(var, expr, denominator);
+  d2.affine_preimage(var, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_image(var, relsym, expr, denominator);
+  d2.generalized_affine_image(var, relsym, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_preimage(var, relsym, expr, denominator);
+  d2.generalized_affine_preimage(var, relsym, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  d1.generalized_affine_image(lhs, relsym, rhs);
+  d2.generalized_affine_image(lhs, relsym, rhs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  d1.generalized_affine_preimage(lhs, relsym, rhs);
+  d2.generalized_affine_preimage(lhs, relsym, rhs);
+  clear_reduced_flag();
+}
+
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::time_elapse_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.time_elapse_assign(y.d1);
+  d2.time_elapse_assign(y.d2);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::topological_closure_assign() {
+  d1.topological_closure_assign();
+  d2.topological_closure_assign();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::m_swap(Partially_Reduced_Product& y) {
+  using std::swap;
+  swap(d1, y.d1);
+  swap(d2, y.d2);
+  swap(reduced, y.reduced);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_constraint(const Constraint& c) {
+  d1.add_constraint(c);
+  d2.add_constraint(c);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_constraint(const Constraint& c) {
+  d1.refine_with_constraint(c);
+  d2.refine_with_constraint(c);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_congruence(const Congruence& cg) {
+  d1.add_congruence(cg);
+  d2.add_congruence(cg);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_congruence(const Congruence& cg) {
+  d1.refine_with_congruence(cg);
+  d2.refine_with_congruence(cg);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_constraints(const Constraint_System& cs) {
+  d1.add_constraints(cs);
+  d2.add_constraints(cs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_constraints(const Constraint_System& cs) {
+  d1.refine_with_constraints(cs);
+  d2.refine_with_constraints(cs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_congruences(const Congruence_System& cgs) {
+  d1.add_congruences(cgs);
+  d2.add_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_congruences(const Congruence_System& cgs) {
+  d1.refine_with_congruences(cgs);
+  d2.refine_with_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+  reduce();
+  d1.drop_some_non_integer_points(complexity);
+  d2.drop_some_non_integer_points(complexity);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity) {
+  reduce();
+  d1.drop_some_non_integer_points(vars, complexity);
+  d2.drop_some_non_integer_points(vars, complexity);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline Partially_Reduced_Product<D1, D2, R>&
+Partially_Reduced_Product<D1, D2, R>
+::operator=(const Partially_Reduced_Product& y) {
+  d1 = y.d1;
+  d2 = y.d2;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D1&
+Partially_Reduced_Product<D1, D2, R>::domain1() const {
+  reduce();
+  return d1;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D2&
+Partially_Reduced_Product<D1, D2, R>::domain2() const {
+  reduce();
+  return d2;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_empty() const {
+  reduce();
+  return d1.is_empty() || d2.is_empty();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_universe() const {
+  return d1.is_universe() && d2.is_universe();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_topologically_closed() const {
+  reduce();
+  return d1.is_topologically_closed() && d2.is_topologically_closed();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::is_disjoint_from(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.is_disjoint_from(y.d1) || d2.is_disjoint_from(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_discrete() const {
+  reduce();
+  return d1.is_discrete() || d2.is_discrete();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_bounded() const {
+  reduce();
+  return d1.is_bounded() || d2.is_bounded();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_above(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_above(expr) || d2.bounds_from_above(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_below(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_below(expr) || d2.bounds_from_below(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::constrains(Variable var) const {
+  reduce();
+  return d1.constrains(var) || d2.constrains(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::widening_assign(const Partially_Reduced_Product& y,
+                  unsigned* tp) {
+  // FIXME(0.10.1): In general this is _NOT_ a widening since the reduction
+  //        may mean that the sequence does not satisfy the ascending
+  //        chain condition.
+  //        However, for the direct, smash and constraints product
+  //        it may be ok - but this still needs checking.
+  reduce();
+  y.reduce();
+  d1.widening_assign(y.d1, tp);
+  d2.widening_assign(y.d2, tp);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_embed(dimension_type m) {
+  d1.add_space_dimensions_and_embed(m);
+  d2.add_space_dimensions_and_embed(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_project(dimension_type m) {
+  d1.add_space_dimensions_and_project(m);
+  d2.add_space_dimensions_and_project(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::concatenate_assign(const Partially_Reduced_Product& y) {
+  d1.concatenate_assign(y.d1);
+  d2.concatenate_assign(y.d2);
+  if (!is_reduced() || !y.is_reduced())
+    clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_space_dimensions(const Variables_Set& vars) {
+  d1.remove_space_dimensions(vars);
+  d2.remove_space_dimensions(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  d1.remove_higher_space_dimensions(new_dimension);
+  d2.remove_higher_space_dimensions(new_dimension);
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Partial_Function>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::map_space_dimensions(const Partial_Function& pfunc) {
+  d1.map_space_dimensions(pfunc);
+  d2.map_space_dimensions(pfunc);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::expand_space_dimension(Variable var, dimension_type m) {
+  d1.expand_space_dimension(var, m);
+  d2.expand_space_dimension(var, m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::fold_space_dimensions(const Variables_Set& vars,
+                        Variable dest) {
+  d1.fold_space_dimensions(vars, dest);
+  d2.fold_space_dimensions(vars, dest);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.contains(y.d1) && d2.contains(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::strictly_contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return (d1.contains(y.d1) && d2.strictly_contains(y.d2))
+    || (d2.contains(y.d2) && d1.strictly_contains(y.d1));
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::reduce() const {
+  Partially_Reduced_Product& dp
+    = const_cast<Partially_Reduced_Product&>(*this);
+  if (dp.is_reduced())
+    return false;
+  R r;
+  r.product_reduce(dp.d1, dp.d2);
+  set_reduced_flag();
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_reduced() const {
+  return reduced;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::clear_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = false;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::set_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = true;
+}
+
+PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product)
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const {
+  const char yes = '+';
+  const char no = '-';
+  s << "Partially_Reduced_Product\n";
+  s << (reduced ? yes : no) << "reduced\n";
+  s << "Domain 1:\n";
+  d1.ascii_dump(s);
+  s << "Domain 2:\n";
+  d2.ascii_dump(s);
+}
+
+template <typename D1, typename D2, typename R>
+inline int32_t
+Partially_Reduced_Product<D1, D2, R>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+           const Partially_Reduced_Product<D1, D2, R>& y) {
+  x.reduce();
+  y.reduce();
+  return x.d1 == y.d1 && x.d2 == y.d2;
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+           const Partially_Reduced_Product<D1, D2, R>& y) {
+  return !(x == y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline std::ostream&
+IO_Operators::operator<<(std::ostream& s,
+                         const Partially_Reduced_Product<D1, D2, R>& dp) {
+  return s << "Domain 1:\n"
+           << dp.d1
+           << "Domain 2:\n"
+           << dp.d2;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::No_Reduction() {
+}
+
+template <typename D1, typename D2>
+void No_Reduction<D1, D2>::product_reduce(D1&, D2&) {
+}
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::~No_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::~Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::~Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::~Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::Shape_Preserving_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::~Shape_Preserving_Reduction() {
+}
+
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline void
+swap(Partially_Reduced_Product<D1, D2, R>& x,
+     Partially_Reduced_Product<D1, D2, R>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_inlines_hh)
diff --git a/src/Partially_Reduced_Product_templates.hh b/src/Partially_Reduced_Product_templates.hh
new file mode 100644
index 0000000..791ece7
--- /dev/null
+++ b/src/Partially_Reduced_Product_templates.hh
@@ -0,0 +1,710 @@
+/* Partially_Reduced_Product class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Partially_Reduced_Product_templates_hh
+#define PPL_Partially_Reduced_Product_templates_hh 1
+
+#include "Grid_Generator_defs.hh"
+#include "Grid_Generator_System_defs.hh"
+#include "Grid_Generator_System_inlines.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::throw_space_dimension_overflow(const char* method,
+                                 const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Partially_Reduced_Product::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::length_error(s.str());
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+         cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  return cs;
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::minimized_constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+         cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  if (cs.has_strict_inequalities()) {
+    NNC_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+  else {
+    C_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+         cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  return cgs;
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::minimized_congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+         cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  Grid gr(cgs);
+  return gr.minimized_congruences();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_constraints(Constraint_System& cs) {
+  if (d1.can_recycle_constraint_systems()) {
+    d2.refine_with_constraints(cs);
+    d1.add_recycled_constraints(cs);
+  }
+  else
+    if (d2.can_recycle_constraint_systems()) {
+      d1.refine_with_constraints(cs);
+      d2.add_recycled_constraints(cs);
+    }
+    else {
+      d1.add_constraints(cs);
+      d2.add_constraints(cs);
+    }
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_congruences(Congruence_System& cgs) {
+  if (d1.can_recycle_congruence_systems()) {
+    d2.refine_with_congruences(cgs);
+    d1.add_recycled_congruences(cgs);
+  }
+  else
+    if (d2.can_recycle_congruence_systems()) {
+      d1.refine_with_congruences(cgs);
+      d2.add_recycled_congruences(cgs);
+    }
+    else {
+      d1.add_congruences(cgs);
+      d2.add_congruences(cgs);
+    }
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Gen_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Generator& g) const {
+  reduce();
+  if (Poly_Gen_Relation::nothing() == d1.relation_with(g)
+      || Poly_Gen_Relation::nothing() == d2.relation_with(g))
+    return Poly_Gen_Relation::nothing();
+  else
+    return Poly_Gen_Relation::subsumes();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Constraint& c) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(c);
+  Poly_Con_Relation relation2 = d2.relation_with(c);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Congruence& cg) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(cg);
+  Poly_Con_Relation relation2 = d2.relation_with(cg);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+           Coefficient& sup_n,
+           Coefficient& sup_d,
+           bool& maximum) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+  bool maximum1;
+  bool maximum2;
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+           Coefficient& inf_n,
+           Coefficient& inf_d,
+           bool& minimum) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+  PPL_ASSERT(reduced);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+  bool minimum1;
+  bool minimum2;
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+           Coefficient& sup_n,
+           Coefficient& sup_d,
+           bool& maximum,
+           Generator& g) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+  PPL_ASSERT(reduced);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+  bool maximum1;
+  bool maximum2;
+  Generator g1(point());
+  Generator g2(point());
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, g1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, g2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    g = g2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    g = g1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    g = g1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    g = g2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+           Coefficient& inf_n,
+           Coefficient& inf_d,
+           bool& minimum,
+           Generator& g) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+  PPL_ASSERT(reduced);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+  bool minimum1;
+  bool minimum2;
+  Generator g1(point());
+  Generator g2(point());
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, g1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, g2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    g = g2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    g = g1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    g = g1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    g = g2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::OK() const {
+  if (reduced) {
+    Partially_Reduced_Product<D1, D2, R> dp1 = *this;
+    Partially_Reduced_Product<D1, D2, R> dp2 = *this;
+    /* Force dp1 reduction */
+    dp1.clear_reduced_flag();
+    dp1.reduce();
+    if (dp1 != dp2)
+      return false;
+  }
+  return d1.OK() && d2.OK();
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>::ascii_load(std::istream& s) {
+  const char yes = '+';
+  const char no = '-';
+  std::string str;
+  if (!(s >> str) || str != "Partially_Reduced_Product")
+    return false;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != "reduced")
+    return false;
+  reduced = (str[0] == yes);
+  if (!(s >> str) || str != "Domain")
+    return false;
+  if (!(s >> str) || str != "1:")
+    return false;
+  if (!d1.ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "Domain")
+    return false;
+  if (!(s >> str) || str != "2:")
+    return false;
+  return d2.ascii_load(s);
+}
+
+template <typename D1, typename D2>
+void Smash_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  using std::swap;
+  if (d2.is_empty()) {
+    if (!d1.is_empty()) {
+      D1 new_d1(d1.space_dimension(), EMPTY);
+      swap(d1, new_d1);
+    }
+  }
+  else if (d1.is_empty()) {
+    D2 new_d2(d2.space_dimension(), EMPTY);
+    swap(d2, new_d2);
+  }
+}
+
+template <typename D1, typename D2>
+void Constraints_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d1.is_empty() || d2.is_empty()) {
+    // If one of the components is empty, do the smash reduction and return.
+    Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+    sr.product_reduce(d1, d2);
+    return;
+  }
+  else {
+    using std::swap;
+    dimension_type space_dim = d1.space_dimension();
+    d1.refine_with_constraints(d2.minimized_constraints());
+    if (d1.is_empty()) {
+      D2 new_d2(space_dim, EMPTY);
+      swap(d2, new_d2);
+      return;
+    }
+    d2.refine_with_constraints(d1.minimized_constraints());
+    if (d2.is_empty()) {
+      D1 new_d1(space_dim, EMPTY);
+      swap(d1, new_d1);
+    }
+  }
+}
+
+/* Auxiliary procedure for the Congruences_Reduction() method.
+   If more than one hyperplane defined by congruence cg intersect
+   d2, then d1 and d2 are unchanged; if exactly one intersects d2, then
+   the corresponding equality is added to d1 and d2;
+   otherwise d1 and d2 are set empty. */
+template <typename D1, typename D2>
+bool shrink_to_congruence_no_check(D1& d1, D2& d2, const Congruence& cg) {
+  // It is assumed that cg is a proper congruence.
+  PPL_ASSERT(cg.modulus() != 0);
+  // It is assumed that cg is satisfied by all points in d1.
+  PPL_ASSERT(d1.relation_with(cg) == Poly_Con_Relation::is_included());
+
+  Linear_Expression e(cg.expression());
+
+  // Find the maximum and minimum bounds for the domain element d with the
+  // linear expression e.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+  bool max_included;
+  PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+  if (d2.maximize(e, max_numer, max_denom, max_included)) {
+    bool min_included;
+    if (d2.minimize(e, min_numer, min_denom, min_included)) {
+      // Adjust values to allow for the denominators max_denom and min_denom.
+      max_numer *= min_denom;
+      min_numer *= max_denom;
+      PPL_DIRTY_TEMP_COEFFICIENT(denom);
+      PPL_DIRTY_TEMP_COEFFICIENT(mod);
+      denom = max_denom * min_denom;
+      mod = cg.modulus() * denom;
+      // If the difference between the maximum and minimum bounds is more than
+      // twice the modulus, then there will be two neighboring hyperplanes
+      // defined by cg that are intersected by the domain element d;
+      // there is no possible reduction in this case.
+      PPL_DIRTY_TEMP_COEFFICIENT(mod2);
+      mod2 = 2 * mod;
+      if (max_numer - min_numer < mod2
+          || (max_numer - min_numer == mod2 && (!max_included || !min_included)))
+        {
+          PPL_DIRTY_TEMP_COEFFICIENT(shrink_amount);
+          PPL_DIRTY_TEMP_COEFFICIENT(max_decreased);
+          PPL_DIRTY_TEMP_COEFFICIENT(min_increased);
+          // Find the amount by which the maximum value may be decreased.
+          shrink_amount = max_numer % mod;
+          if (!max_included && shrink_amount == 0)
+            shrink_amount = mod;
+          if (shrink_amount < 0)
+            shrink_amount += mod;
+          max_decreased = max_numer - shrink_amount;
+          // Find the amount by which the minimum value may be increased.
+          shrink_amount = min_numer % mod;
+          if (!min_included && shrink_amount == 0)
+            shrink_amount = - mod;
+          if (shrink_amount > 0)
+            shrink_amount -= mod;
+          min_increased = min_numer - shrink_amount;
+          if (max_decreased == min_increased) {
+            // The domain element d2 intersects exactly one hyperplane
+            // defined by cg, so add the equality to d1 and d2.
+            Constraint new_c(denom * e == min_increased);
+            d1.refine_with_constraint(new_c);
+            d2.refine_with_constraint(new_c);
+            return true;
+          }
+          else {
+            if (max_decreased < min_increased) {
+              using std::swap;
+              // In this case, d intersects no hyperplanes defined by cg,
+              // so set d to empty and return false.
+              D1 new_d1(d1.space_dimension(), EMPTY);
+              swap(d1, new_d1);
+              D2 new_d2(d2.space_dimension(), EMPTY);
+              swap(d2, new_d2);
+              return false;
+            }
+          }
+        }
+    }
+  }
+  return true;
+}
+
+template <typename D1, typename D2>
+void
+Congruences_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d1.is_empty() || d2.is_empty()) {
+    // If one of the components is empty, do the smash reduction and return.
+    Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+    sr.product_reduce(d1, d2);
+    return;
+  }
+  // Use the congruences representing d1 to shrink both components.
+  const Congruence_System cgs1 = d1.minimized_congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+         cgs_end = cgs1.end(); i != cgs_end; ++i) {
+    const Congruence& cg1 = *i;
+    if (cg1.is_equality())
+      d2.refine_with_congruence(cg1);
+    else
+      if (!Parma_Polyhedra_Library::
+          shrink_to_congruence_no_check(d1, d2, cg1))
+        // The product is empty.
+        return;
+  }
+  // Use the congruences representing d2 to shrink both components.
+  const Congruence_System cgs2 = d2.minimized_congruences();
+  for (Congruence_System::const_iterator i = cgs2.begin(),
+         cgs_end = cgs2.end(); i != cgs_end; ++i) {
+    const Congruence& cg2 = *i;
+    if (cg2.is_equality())
+      d1.refine_with_congruence(cg2);
+    else
+      if (!Parma_Polyhedra_Library::
+          shrink_to_congruence_no_check(d2, d1, cg2))
+        // The product is empty.
+        return;
+  }
+}
+
+template <typename D1, typename D2>
+void
+Shape_Preserving_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  // First do the congruences reduction.
+  Parma_Polyhedra_Library::Congruences_Reduction<D1, D2> cgr;
+  cgr.product_reduce(d1, d2);
+  if (d1.is_empty())
+    return;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(freq_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(freq_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(val_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(val_d);
+
+  // Use the constraints representing d2.
+  Constraint_System cs = d2.minimized_constraints();
+  Constraint_System refining_cs;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality())
+      continue;
+    // Check the frequency and value of the linear expression for
+    // the constraint `c'.
+    Linear_Expression le(c.expression());
+    if (!d1.frequency(le, freq_n, freq_d, val_n, val_d))
+      // Nothing to do.
+      continue;
+    if (val_n == 0)
+      // Nothing to do.
+      continue;
+    // Adjust the value of the inhomogeneous term to satisfy
+    // the implied congruence.
+    if (val_n < 0) {
+      val_n = val_n*freq_d + val_d*freq_n;
+      val_d *= freq_d;
+    }
+    le *= val_d;
+    le -= val_n;
+    refining_cs.insert(le >= 0);
+  }
+  d2.refine_with_constraints(refining_cs);
+
+  // Use the constraints representing d1.
+  cs = d1.minimized_constraints();
+  refining_cs.clear();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality())
+      // Equalities already shared.
+      continue;
+    // Check the frequency and value of the linear expression for
+    // the constraint `c'.
+    Linear_Expression le(c.expression());
+    if (!d2.frequency(le, freq_n, freq_d, val_n, val_d))
+      // Nothing to do.
+      continue;
+    if (val_n == 0)
+      // Nothing to do.
+      continue;
+    // Adjust the value of the inhomogeneous term to satisfy
+    // the implied congruence.
+    if (val_n < 0) {
+      val_n = val_n*freq_d + val_d*freq_n;
+      val_d *= freq_d;
+    }
+    le *= val_d;
+    le -= val_n;
+    refining_cs.insert(le >= 0);
+  }
+  d1.refine_with_constraints(refining_cs);
+
+  // The reduction may have introduced additional equalities
+  // so these must be shared with the other component.
+  Parma_Polyhedra_Library::Constraints_Reduction<D1, D2> cr;
+  cr.product_reduce(d1, d2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_templates_hh)
diff --git a/src/Partially_Reduced_Product_types.hh b/src/Partially_Reduced_Product_types.hh
new file mode 100644
index 0000000..9db15b9
--- /dev/null
+++ b/src/Partially_Reduced_Product_types.hh
@@ -0,0 +1,38 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Partially_Reduced_Product_types_hh
+#define PPL_Partially_Reduced_Product_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+class Smash_Reduction;
+
+template <typename D1, typename D2>
+class Constraints_Reduction;
+
+template <typename D1, typename D2>
+class Congruences_Reduction;
+
+template <typename D1, typename D2>
+class Shape_Preserving_Reduction;
+
+template <typename D1, typename D2>
+class No_Reduction;
+
+template <typename D1, typename D2, typename R>
+class Partially_Reduced_Product;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partially_Reduced_Product_types_hh)
diff --git a/src/Pending_Element_defs.hh b/src/Pending_Element_defs.hh
new file mode 100644
index 0000000..aabe2a9
--- /dev/null
+++ b/src/Pending_Element_defs.hh
@@ -0,0 +1,77 @@
+/* Pending_Element class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_Element_defs_hh
+#define PPL_Pending_Element_defs_hh 1
+
+#include "Pending_Element_types.hh"
+#include "Doubly_Linked_Object_defs.hh"
+#include "Handler_types.hh"
+
+//! A class for pending watchdog events with embedded links.
+/*!
+  Each pending watchdog event is characterized by a deadline (a positive
+  time interval), an associated handler that will be invoked upon event
+  expiration, and a Boolean flag that indicates whether the event has already
+  expired or not.
+*/
+template <typename Threshold>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_Element
+  : public Doubly_Linked_Object {
+public:
+  //! Constructs an element with the given attributes.
+  Pending_Element(const Threshold& deadline,
+                  const Handler& handler,
+                  bool& expired_flag);
+
+  //! Modifies \p *this so that it has the given attributes.
+  void assign(const Threshold& deadline,
+              const Handler& handler,
+              bool& expired_flag);
+
+  //! Returns the deadline of the event.
+  const Threshold& deadline() const;
+
+  //! Returns the handler associated to the event.
+  const Handler& handler() const;
+
+  //! Returns a reference to the "event-expired" flag.
+  bool& expired_flag() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The deadline of the event.
+  Threshold d;
+
+  //! A pointer to the handler associated to the event.
+  const Handler* p_h;
+
+  //! A pointer to a flag saying whether the event has already expired or not.
+  bool* p_f;
+};
+
+#include "Pending_Element_inlines.hh"
+
+#endif // !defined(PPL_Pending_Element_defs_hh)
diff --git a/src/Pending_Element_inlines.hh b/src/Pending_Element_inlines.hh
new file mode 100644
index 0000000..92d646d
--- /dev/null
+++ b/src/Pending_Element_inlines.hh
@@ -0,0 +1,85 @@
+/* Pending_Element class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_Element_inlines_hh
+#define PPL_Pending_Element_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Threshold>
+inline bool
+Pending_Element<Threshold>::OK() const {
+  return true;
+}
+
+template <typename Threshold>
+inline
+Pending_Element<Threshold>::Pending_Element(const Threshold& deadline,
+                                            const Handler& handler,
+                                            bool& expired_flag)
+  : d(deadline), p_h(&handler), p_f(&expired_flag) {
+  assert(OK());
+}
+
+template <typename Threshold>
+inline void
+Pending_Element<Threshold>::assign(const Threshold& deadline,
+                                   const Handler& handler,
+                                   bool& expired_flag) {
+  d = deadline;
+  p_h = &handler;
+  p_f = &expired_flag;
+  assert(OK());
+}
+
+template <typename Threshold>
+inline const Threshold&
+Pending_Element<Threshold>::deadline() const {
+  return d;
+}
+
+template <typename Threshold>
+inline const Handler&
+Pending_Element<Threshold>::handler() const {
+  return *p_h;
+}
+
+template <typename Threshold>
+inline bool&
+Pending_Element<Threshold>::expired_flag() const {
+  return *p_f;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_Element_inlines_hh)
diff --git a/src/Pending_Element_types.hh b/src/Pending_Element_types.hh
new file mode 100644
index 0000000..0bc1b6a
--- /dev/null
+++ b/src/Pending_Element_types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Pending_Element_types_hh
+#define PPL_Pending_Element_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <class Threshold>
+class Pending_Element;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_Element_types_hh)
diff --git a/src/Pending_List_defs.hh b/src/Pending_List_defs.hh
new file mode 100644
index 0000000..171990e
--- /dev/null
+++ b/src/Pending_List_defs.hh
@@ -0,0 +1,79 @@
+/* Pending_List class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_List_defs_hh
+#define PPL_Pending_List_defs_hh 1
+
+#include "Pending_List_types.hh"
+#include "Pending_Element_defs.hh"
+#include "EList_defs.hh"
+#include "Handler_types.hh"
+
+//! An ordered list for recording pending watchdog events.
+template <typename Traits>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_List {
+public:
+  //! A non-const iterator to traverse the list.
+  typedef typename EList<Pending_Element<typename Traits::Threshold> >::iterator iterator;
+
+  //! A const iterator to traverse the list.
+  typedef typename EList<Pending_Element<typename Traits::Threshold> >::const_iterator const_iterator;
+
+  //! Constructs an empty list.
+  Pending_List();
+
+  //! Destructor.
+  ~Pending_List();
+
+  //! Inserts a new Pending_Element object with the given attributes.
+  iterator insert(const typename Traits::Threshold& deadline,
+                  const Handler& handler,
+                  bool& expired_flag);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  iterator erase(iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  iterator end();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  EList<Pending_Element<typename Traits::Threshold> > active_list;
+  EList<Pending_Element<typename Traits::Threshold> > free_list;
+};
+
+#include "Pending_List_inlines.hh"
+#include "Pending_List_templates.hh"
+
+#endif // !defined(PPL_Pending_List_defs_hh)
diff --git a/src/Pending_List_inlines.hh b/src/Pending_List_inlines.hh
new file mode 100644
index 0000000..20c62b1
--- /dev/null
+++ b/src/Pending_List_inlines.hh
@@ -0,0 +1,82 @@
+/* Pending_List class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_List_inlines_hh
+#define PPL_Pending_List_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+inline
+Pending_List<Traits>::Pending_List()
+  : active_list(),
+    free_list() {
+  assert(OK());
+}
+
+template <typename Traits>
+inline
+Pending_List<Traits>::~Pending_List() {
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::begin() {
+  return active_list.begin();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::end() {
+  return active_list.end();
+}
+
+template <typename Traits>
+inline bool
+Pending_List<Traits>::empty() const {
+  return active_list.empty();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::erase(iterator position) {
+  assert(!empty());
+  iterator next = active_list.erase(position);
+  free_list.push_back(*position);
+  assert(OK());
+  return next;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_List_inlines_hh)
diff --git a/src/Pending_List_templates.hh b/src/Pending_List_templates.hh
new file mode 100644
index 0000000..e984ce2
--- /dev/null
+++ b/src/Pending_List_templates.hh
@@ -0,0 +1,96 @@
+/* Pending_List class implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pending_List_templates_hh
+#define PPL_Pending_List_templates_hh 1
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+typename Pending_List<Traits>::iterator
+Pending_List<Traits>::insert(const typename Traits::Threshold& deadline,
+                             const Handler& handler,
+                             bool& expired_flag) {
+  iterator position = active_list.begin();
+  for (iterator active_list_end = active_list.end();
+       position != active_list_end
+         && Traits::less_than(position->deadline(), deadline);
+       ++position)
+    ;
+  iterator pending_element_p;
+  // Only allocate a new element if the free list is empty.
+  if (free_list.empty())
+    pending_element_p
+      = new Pending_Element<typename Traits::Threshold>(deadline,
+                                                        handler,
+                                                        expired_flag);
+  else {
+    pending_element_p = free_list.begin();
+    free_list.erase(pending_element_p);
+    pending_element_p->assign(deadline, handler, expired_flag);
+  }
+  iterator r = active_list.insert(position, *pending_element_p);
+  assert(OK());
+  return r;
+}
+
+template <typename Traits>
+bool
+Pending_List<Traits>::OK() const {
+  if (!active_list.OK())
+    return false;
+
+  if (!free_list.OK())
+    return false;
+
+  const typename Traits::Threshold* old;
+  const_iterator i = active_list.begin();
+  old = &i->deadline();
+  ++i;
+  for (const_iterator active_list_end = active_list.end(); i != active_list_end; ++i) {
+    const typename Traits::Threshold& t = i->deadline();
+    if (Traits::less_than(t, *old)) {
+#ifndef NDEBUG
+      std::cerr << "The active list is not sorted!"
+                << std::endl;
+#endif
+      return false;
+    }
+    old = &t;
+  }
+  return true;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_List_templates_hh)
diff --git a/src/Pending_List_types.hh b/src/Pending_List_types.hh
new file mode 100644
index 0000000..af6c6ba
--- /dev/null
+++ b/src/Pending_List_types.hh
@@ -0,0 +1,31 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Pending_List_types_hh
+#define PPL_Pending_List_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+class Pending_List;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pending_List_types_hh)
diff --git a/src/Ph_Status.cc b/src/Ph_Status.cc
new file mode 100644
index 0000000..eb9dd8e
--- /dev/null
+++ b/src/Ph_Status.cc
@@ -0,0 +1,245 @@
+/* Polyhedron::Status class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* zero_dim_univ = "ZE";
+const char* empty = "EM";
+const char* consys_min = "CM";
+const char* gensys_min = "GM";
+const char* consys_upd = "CS";
+const char* gensys_upd = "GS";
+const char* satc_upd = "SC";
+const char* satg_upd = "SG";
+const char* consys_pending = "CP";
+const char* gensys_pending = "GP";
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron::Status
+  Reads a keyword and its associated on/off, +/- flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+bool
+get_field(std::istream& s, const char* keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != '+' && str[0] != '-')
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == '+');
+  return true;
+}
+
+} // namespace
+
+void
+PPL::Polyhedron::Status::ascii_dump(std::ostream& s) const {
+  s << (test_zero_dim_univ() ? '+' : '-') << zero_dim_univ << ' '
+    << (test_empty() ? '+' : '-') << empty << ' '
+    << ' '
+    << (test_c_minimized() ? '+' : '-') << consys_min << ' '
+    << (test_g_minimized() ? '+' : '-') << gensys_min << ' '
+    << ' '
+    << (test_c_up_to_date() ? '+' : '-') << consys_upd << ' '
+    << (test_g_up_to_date() ? '+' : '-') << gensys_upd << ' '
+    << ' '
+    << (test_c_pending() ? '+' : '-') << consys_pending << ' '
+    << (test_g_pending() ? '+' : '-') << gensys_pending << ' '
+    << ' '
+    << (test_sat_c_up_to_date() ? '+' : '-') << satc_upd << ' '
+    << (test_sat_g_up_to_date() ? '+' : '-') << satg_upd << ' ';
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Polyhedron::Status)
+
+bool
+PPL::Polyhedron::Status::ascii_load(std::istream& s) {
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, consys_min, positive))
+    return false;
+  if (positive)
+    set_c_minimized();
+  else
+    reset_c_minimized();
+
+  if (!get_field(s, gensys_min, positive))
+    return false;
+  if (positive)
+    set_g_minimized();
+  else
+    reset_g_minimized();
+
+  if (!get_field(s, consys_upd, positive))
+    return false;
+  if (positive)
+    set_c_up_to_date();
+  else
+    reset_c_up_to_date();
+
+  if (!get_field(s, gensys_upd, positive))
+    return false;
+  if (positive)
+    set_g_up_to_date();
+  else
+    reset_g_up_to_date();
+
+  if (!get_field(s, consys_pending, positive))
+    return false;
+  if (positive)
+    set_c_pending();
+  else
+    reset_c_pending();
+
+  if (!get_field(s, gensys_pending, positive))
+    return false;
+  if (positive)
+    set_g_pending();
+  else
+    reset_g_pending();
+
+  if (!get_field(s, satc_upd, positive))
+    return false;
+  if (positive)
+    set_sat_c_up_to_date();
+  else
+    reset_sat_c_up_to_date();
+
+  if (!get_field(s, satg_upd, positive))
+    return false;
+  if (positive)
+    set_sat_g_up_to_date();
+  else
+    reset_sat_g_up_to_date();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+bool
+PPL::Polyhedron::Status::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      cerr << "The empty flag is incompatible with any other one."
+           << endl;
+#endif
+      return false;
+    }
+  }
+
+  if ((test_sat_c_up_to_date() || test_sat_g_up_to_date())
+      && !(test_c_up_to_date() && test_g_up_to_date())) {
+#ifndef NDEBUG
+    cerr <<
+      "If a saturation matrix is up-to-date, constraints and\n"
+      "generators have to be both up-to-date."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_minimized() && !test_c_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If constraints are minimized they must be up-to-date."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_g_minimized() && !test_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "If generators are minimized they must be up-to-date."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() && test_g_pending()) {
+#ifndef NDEBUG
+    cerr << "There cannot be both pending constraints and pending generators."
+         << endl;
+#endif
+    return false;
+  }
+
+  if (test_c_pending() || test_g_pending()) {
+    if (!test_c_minimized() || !test_g_minimized()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending constraints or generators, constraints\n"
+      "and generators must be minimized."
+         << endl;
+#endif
+      return false;
+    }
+
+    if (!test_sat_c_up_to_date() && !test_sat_g_up_to_date()) {
+#ifndef NDEBUG
+    cerr <<
+      "If there are pending constraints or generators, there must\n"
+      "be at least a saturation matrix up-to-date."
+         << endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
diff --git a/src/Ph_Status_idefs.hh b/src/Ph_Status_idefs.hh
new file mode 100644
index 0000000..1c3128f
--- /dev/null
+++ b/src/Ph_Status_idefs.hh
@@ -0,0 +1,183 @@
+/* Polyhedron::Status class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Status_idefs_hh
+#define PPL_Status_idefs_hh 1
+
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status_idefs.hh directly; use Polyhedron_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>constraints pending</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, which is
+    split in two non-empty subsets: the already processed constraints,
+    which are in minimal form, and the pending constraints, which
+    still have to be processed and may thus be inconsistent or
+    contain redundancies;
+  - <EM>generators pending</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, which is
+    split in two non-empty subsets: the already processed generators,
+    which are in minimal form, and the pending generators, which still
+    have to be processed and may thus contain redundancies;
+  - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending constraints;
+  - <EM>constraints minimized</EM>: the non-pending part of the system
+    of constraints attached to the polyhedron is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the polyhedron is in minimal form;
+  - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending generators and
+    columns indexed by non-pending constraints correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+  - <EM>generators' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending constraints and
+    columns indexed by non-pending generators correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>constraints pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>constraints' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bit-masks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+#endif // !defined(PPL_Status_idefs_hh)
diff --git a/src/Ph_Status_inlines.hh b/src/Ph_Status_inlines.hh
new file mode 100644
index 0000000..a4ce90b
--- /dev/null
+++ b/src/Ph_Status_inlines.hh
@@ -0,0 +1,217 @@
+/* Polyhedron::Status class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Status_inlines_hh
+#define PPL_Status_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Polyhedron::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Polyhedron::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+inline void
+Polyhedron::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Polyhedron::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Polyhedron::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Polyhedron::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Polyhedron::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Polyhedron::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Polyhedron::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Polyhedron::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Polyhedron::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Status_inlines_hh)
diff --git a/src/Pointset_Powerset.cc b/src/Pointset_Powerset.cc
new file mode 100644
index 0000000..1a33b05
--- /dev/null
+++ b/src/Pointset_Powerset.cc
@@ -0,0 +1,344 @@
+/* Pointset_Powerset class implementation: non-inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Pointset_Powerset_defs.hh"
+#include "Grid_defs.hh"
+#include <utility>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+template <>
+void
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::difference_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  using std::swap;
+  // Ensure omega-reduction.
+  x.omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence = x.sequence;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+    const NNC_Polyhedron& ph_yi = yi->pointset();
+    Sequence tmp_sequence;
+    for (Sequence_const_iterator itr = new_sequence.begin(),
+           ns_end = new_sequence.end(); itr != ns_end; ++itr) {
+      const std::pair<NNC_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+        partition = linear_partition(ph_yi, itr->pointset());
+      const Pointset_Powerset<NNC_Polyhedron>& residues = partition.second;
+      // Append the contents of `residues' to `tmp_sequence'.
+      std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+    }
+    swap(tmp_sequence, new_sequence);
+  }
+  swap(x.sequence, new_sequence);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+bool
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+    if (!check_containment(yi->pointset(), x))
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+bool
+PPL::check_containment(const NNC_Polyhedron& ph,
+                       const Pointset_Powerset<NNC_Polyhedron>& ps) {
+  if (ph.is_empty())
+    return true;
+  Pointset_Powerset<NNC_Polyhedron> tmp(ph.space_dimension(), EMPTY);
+  tmp.add_disjunct(ph);
+  for (Pointset_Powerset<NNC_Polyhedron>::const_iterator
+         i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+    const NNC_Polyhedron& pi = i->pointset();
+    for (Pointset_Powerset<NNC_Polyhedron>::iterator
+           j = tmp.begin(); j != tmp.end(); ) {
+      const NNC_Polyhedron& pj = j->pointset();
+      if (pi.contains(pj))
+        j = tmp.drop_disjunct(j);
+      else
+        ++j;
+    }
+    if (tmp.empty())
+      return true;
+    else {
+      Pointset_Powerset<NNC_Polyhedron> new_disjuncts(ph.space_dimension(),
+                                                      EMPTY);
+      for (Pointset_Powerset<NNC_Polyhedron>::iterator
+             j = tmp.begin(); j != tmp.end(); ) {
+        const NNC_Polyhedron& pj = j->pointset();
+        if (pj.is_disjoint_from(pi))
+          ++j;
+        else {
+          const std::pair<NNC_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+            partition = linear_partition(pi, pj);
+          new_disjuncts.upper_bound_assign(partition.second);
+          j = tmp.drop_disjunct(j);
+        }
+      }
+      tmp.upper_bound_assign(new_disjuncts);
+    }
+  }
+  return false;
+}
+
+
+namespace {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Uses the congruence \p c to approximately partition the grid \p gr.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p gr and congruence \p c is stored
+  in \p gr, whereas a finite set of grids whose set-theoretic union
+  contains the intersection of \p gr with the negation of \p c
+  is added, as a set of new disjuncts, to the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+approximate_partition_aux(const PPL::Congruence& c,
+                          PPL::Grid& gr,
+                          PPL::Pointset_Powerset<PPL::Grid>& r) {
+  using namespace PPL;
+  const Coefficient& c_modulus = c.modulus();
+  const Grid gr_copy(gr);
+  gr.add_congruence(c);
+  if (gr.is_empty()) {
+    r.add_disjunct(gr_copy);
+    return true;
+  }
+
+  const Congruence_System cgs = gr.congruences();
+  const Congruence_System cgs_copy = gr_copy.congruences();
+  // When c is an equality, not satisfied by Grid gr
+  // then add gr to the set r. There is no finite
+  // partition in this case.
+  if (c_modulus == 0) {
+    if (cgs.num_equalities() != cgs_copy.num_equalities()) {
+      r.add_disjunct(gr_copy);
+      return false;
+    }
+    return true;
+  }
+
+  // When c is a proper congruence but, in gr, this direction has
+  // no congruence, then add gr to the set r. There is no finite
+  // partition in this case.
+  if (cgs.num_proper_congruences() != cgs_copy.num_proper_congruences()) {
+    r.add_disjunct(gr_copy);
+    return false;
+  }
+
+  // When  c is a proper congruence and gr also is discrete
+  // in this direction, then there is a finite partition and that
+  // is added to r.
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+  Linear_Expression le(c.expression());
+  le -= c_inhomogeneous_term;
+  PPL_DIRTY_TEMP_COEFFICIENT(n);
+  rem_assign(n, c_inhomogeneous_term, c_modulus);
+  if (n < 0)
+    n += c_modulus;
+  PPL_DIRTY_TEMP_COEFFICIENT(i);
+  for (i = c_modulus; i-- > 0; )
+    if (i != n) {
+      Grid gr_tmp(gr_copy);
+      gr_tmp.add_congruence((le+i %= 0) / c_modulus);
+      if (!gr_tmp.is_empty())
+        r.add_disjunct(gr_tmp);
+    }
+  return true;
+}
+
+} // namespace
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+std::pair<PPL::Grid, PPL::Pointset_Powerset<PPL::Grid> >
+PPL::approximate_partition(const Grid& p, const Grid& q,
+                           bool& finite_partition) {
+  using namespace PPL;
+  finite_partition = true;
+  Pointset_Powerset<Grid> r(p.space_dimension(), EMPTY);
+  // Ensure that the congruence system of q is minimized
+  // before copying and calling approximate_partition_aux().
+  (void) q.minimized_congruences();
+  Grid gr = q;
+  const Congruence_System& p_congruences = p.congruences();
+  for (Congruence_System::const_iterator i = p_congruences.begin(),
+         p_congruences_end = p_congruences.end(); i != p_congruences_end; ++i)
+    if (!approximate_partition_aux(*i, gr, r)) {
+      finite_partition = false;
+      const Pointset_Powerset<Grid> s(q);
+      return std::make_pair(gr, s);
+    }
+  return std::make_pair(gr, r);
+}
+
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset */
+bool
+PPL::check_containment(const Grid& ph,
+                       const Pointset_Powerset<Grid>& ps) {
+  if (ph.is_empty())
+    return true;
+  Pointset_Powerset<Grid> tmp(ph.space_dimension(), EMPTY);
+  tmp.add_disjunct(ph);
+  for (Pointset_Powerset<Grid>::const_iterator
+         i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+    const Grid& pi = i->pointset();
+    for (Pointset_Powerset<Grid>::iterator
+           j = tmp.begin(); j != tmp.end(); ) {
+      const Grid& pj = j->pointset();
+      if (pi.contains(pj))
+        j = tmp.drop_disjunct(j);
+      else
+        ++j;
+    }
+    if (tmp.empty())
+      return true;
+    else {
+      Pointset_Powerset<Grid> new_disjuncts(ph.space_dimension(),
+                                                      EMPTY);
+      for (Pointset_Powerset<Grid>::iterator
+             j = tmp.begin(); j != tmp.end(); ) {
+        const Grid& pj = j->pointset();
+        if (pj.is_disjoint_from(pi))
+          ++j;
+        else {
+          bool finite_partition;
+          const std::pair<Grid, Pointset_Powerset<Grid> >
+            partition = approximate_partition(pi, pj, finite_partition);
+
+          // If there is a finite partition, then we add the new
+          // disjuncts to the temporary set of disjuncts and drop pj.
+          // If there is no finite partition, then by the
+          // specification of approximate_partition(), we can
+          // ignore checking the remaining temporary disjuncts as they
+          // will all have the same lines and equalities and therefore
+          // also not have a finite partition with respect to pi.
+          if (!finite_partition)
+            break;
+          new_disjuncts.upper_bound_assign(partition.second);
+          j = tmp.drop_disjunct(j);
+        }
+      }
+      tmp.upper_bound_assign(new_disjuncts);
+    }
+  }
+  return false;
+}
+
+template <>
+void
+PPL::Pointset_Powerset<PPL::Grid>
+::difference_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  using std::swap;
+  // Ensure omega-reduction.
+  x.omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence = x.sequence;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi) {
+    const Grid& gr_yi = yi->pointset();
+    Sequence tmp_sequence;
+    for (Sequence_const_iterator itr = new_sequence.begin(),
+           ns_end = new_sequence.end(); itr != ns_end; ++itr) {
+      bool finite_partition;
+      const std::pair<Grid, Pointset_Powerset<Grid> > partition
+        = approximate_partition(gr_yi, itr->pointset(), finite_partition);
+      const Pointset_Powerset<Grid>& residues = partition.second;
+      // Append the contents of `residues' to `tmp_sequence'.
+      std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+    }
+    swap(tmp_sequence, new_sequence);
+  }
+  swap(x.sequence, new_sequence);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+bool
+PPL::Pointset_Powerset<PPL::Grid>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+    if (!check_containment(yi->pointset(), x))
+      return false;
+  return true;
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+                    Complexity_Class)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+                         (NNC_Polyhedron(i->pointset())));
+  x.reduced = y.reduced;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+                    Complexity_Class)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (Pointset_Powerset<Grid>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+                         (NNC_Polyhedron(i->pointset())));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <>
+PPL::Pointset_Powerset<PPL::C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+                    Complexity_Class)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (Pointset_Powerset<NNC_Polyhedron>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<C_Polyhedron>
+                         (C_Polyhedron(i->pointset())));
+
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of C_Polyhedron, by
+  // enforcing topological closure, may have made different elements
+  // comparable.
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
diff --git a/src/Pointset_Powerset_defs.hh b/src/Pointset_Powerset_defs.hh
new file mode 100644
index 0000000..7d33bf8
--- /dev/null
+++ b/src/Pointset_Powerset_defs.hh
@@ -0,0 +1,1449 @@
+/* Pointset_Powerset class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_defs_hh
+#define PPL_Pointset_Powerset_defs_hh
+
+#include "Pointset_Powerset_types.hh"
+#include "globals_defs.hh"
+#include "BHRZ03_Certificate_types.hh"
+#include "Constraint_types.hh"
+#include "Constraint_System_types.hh"
+#include "Congruence_types.hh"
+#include "Congruence_System_types.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Partially_Reduced_Product_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Determinate_defs.hh"
+#include "Powerset_defs.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL pointset domains.
+/*! \ingroup PPL_CXX_interface
+  \warning
+  At present, the supported instantiations for the
+  disjunct domain template \p PSET are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape\<T\></CODE>,
+  <CODE>BD_Shape\<T\></CODE>,
+  <CODE>Box\<T\></CODE>.
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Pointset_Powerset
+  : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PSET> > {
+public:
+  typedef PSET element_type;
+
+private:
+  typedef Determinate<PSET> Det_PSET;
+  typedef Powerset<Det_PSET> Base;
+
+public:
+  //! Returns the maximum space dimension a Pointset_Powerset<PSET> can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors
+  //@{
+
+  //! Builds a universe (top) or empty (bottom) Pointset_Powerset.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the powerset;
+
+    \param kind
+    Specifies whether the universe or the empty powerset has to be built.
+  */
+  explicit
+  Pointset_Powerset(dimension_type num_dimensions = 0,
+                    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Pointset_Powerset(const Pointset_Powerset& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Conversion constructor: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PSET</CODE>.
+
+    \param y
+    The powerset to be used to build the new powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+  */
+  template <typename QH>
+  explicit Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Creates a Pointset_Powerset from a product
+    This will be created as a single disjunct of type PSET that
+    approximates the product.
+  */
+  template <typename QH1, typename QH2, typename R>
+  explicit
+  Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of constraints \p cs.
+  */
+  explicit Pointset_Powerset(const Constraint_System& cs);
+
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of congruences \p cgs.
+  */
+  explicit Pointset_Powerset(const Congruence_System& cgs);
+
+
+  //! Builds a pointset_powerset out of a closed polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
+
+    \param ph
+    The closed polyhedron to be used to build the powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const C_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of an nnc polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
+
+    \param ph
+    The closed polyhedron to be used to build the powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const NNC_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+
+  //! Builds a pointset_powerset out of a grid.
+  /*!
+    If the grid is nonempty, builds a powerset containing a single
+    disjunct approximating the grid. Builds the empty powerset
+    otherwise. The powerset inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const Grid& gr,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of an octagonal shape.
+  /*!
+    If the octagonal shape is nonempty, builds a powerset
+    containing a single disjunct approximating the octagonal
+    shape. Builds the empty powerset otherwise. The powerset
+    inherits the space dimension of the octagonal shape.
+
+    \param os
+    The octagonal shape to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const Octagonal_Shape<T>& os,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of a bd shape.
+  /*!
+    If the bd shape is nonempty, builds a powerset containing a
+    single disjunct approximating the bd shape. Builds the empty
+    powerset otherwise.  The powerset inherits the space dimension
+    of the bd shape.
+
+    \param bds
+    The bd shape to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bds exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const BD_Shape<T>& bds,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of a box.
+  /*!
+    If the box is nonempty, builds a powerset containing a single
+    disjunct approximating the box. Builds the empty powerset
+    otherwise.  The powerset inherits the space dimension of the box.
+
+    \param box
+    The box to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Pointset_Powerset(const Box<Interval>& box,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Pointset_Powerset
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type affine_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty powerset.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is the top element of the powerset lattice.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the disjuncts
+    in \p *this are topologically closed.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all elements in \p *this
+    are bounded.
+  */
+  bool is_bounded() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Pointset_Powerset& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+
+    \note
+    A variable is constrained if there exists a non-redundant disjunct
+    that is constraining the variable: this definition relies on the
+    powerset lattice structure and may be somewhat different from the
+    geometric intuition.
+    For instance, variable \f$x\f$ is constrained in the powerset
+    \f[
+      \mathit{ps} = \bigl\{ \{ x \geq 0 \}, \{ x \leq 0 \} \bigr\},
+    \f]
+    even though \f$\mathit{ps}\f$ is geometrically equal to the
+    whole vector space.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this geometrically
+    covers \p y, i.e., if any point (in some element) of \p y is also
+    a point (of some element) of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_covers(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is geometrically
+    equal to \p y, i.e., if (the elements of) \p *this and \p y
+    contain the same set of points.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_equals(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is strictly contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Pointset_Powerset
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Pointset_Powerset
+  //@{
+
+  //! Adds to \p *this the disjunct \p ph.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p ph are dimension-incompatible.
+  */
+  void add_disjunct(const PSET& ph);
+
+  //! Intersects \p *this with constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Intersects \p *this with the constraints in \p cs.
+  /*!
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  //! Intersects \p *this with congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Intersects \p *this with the congruences in \p cgs.
+  /*!
+    \param cgs
+    The congruences to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each disjunct in \p *this
+    with each disjunct in \p y and collecting all these intersections.
+  */
+  void intersection_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this an (a smallest)
+    over-approximation as a powerset of the disjunct domain of the
+    set-theoretical difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Powerset_Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_preimage(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    The result is obtained by computing the pairwise
+    \ref Time_Elapse_Operator "time elapse" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void time_elapse_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Assign to \p *this the result of (recursively) merging together
+    the pairs of disjuncts whose upper-bound is the same as their
+    set-theoretical union.
+
+    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different disjuncts
+    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+  */
+  void pairwise_reduce();
+
+  /*! \brief
+    Assigns to \p *this the result of applying the
+    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+    to \p *this and \p y, using the widening function \p widen_fun
+    and the cardinality threshold \p max_disjuncts.
+
+    \param y
+    A powerset that <EM>must</EM> definitely entail \p *this;
+
+    \param widen_fun
+    The widening function to be used on polyhedra objects. It is obtained
+    from the corresponding widening method by using the helper function
+    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+    \param max_disjuncts
+    The maximum number of disjuncts occurring in the powerset \p *this
+    <EM>before</EM> starting the computation. If this number is exceeded,
+    some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    For a description of the extrapolation operator,
+    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+  */
+  template <typename Widening>
+  void BGP99_extrapolation_assign(const Pointset_Powerset& y,
+                                  Widening widen_fun,
+                                  unsigned max_disjuncts);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref pps_certificate_widening "BHZ03-widening"
+    between \p *this and \p y, using the widening function \p widen_fun
+    certified by the convergence certificate \p Cert.
+
+    \param y
+    The finite powerset computed in the previous iteration step.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param widen_fun
+    The widening function to be used on disjuncts.
+    It is obtained from the corresponding widening method by using
+    the helper function widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    In order to obtain a proper widening operator, the template parameter
+    \p Cert should be a finite convergence certificate for the base-level
+    widening function \p widen_fun; otherwise, an extrapolation operator is
+    obtained.
+    For a description of the methods that should be provided
+    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+  */
+  template <typename Cert, typename Widening>
+  void BHZ03_widening_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Pointset_Powerset& operator=(const Pointset_Powerset& y);
+
+  /*! \brief
+    Conversion assignment: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PSET</CODE>
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  template <typename QH>
+  Pointset_Powerset& operator=(const Pointset_Powerset<QH>& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Pointset_Powerset& y);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    and embeds each disjunct in \p *this in the new space.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    without embedding the disjuncts in \p *this in the new space.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  //! Assigns to \p *this the concatenation of \p *this and \p y.
+  /*!
+    The result is obtained by computing the pairwise
+    \ref Concatenating_Polyhedra "concatenation" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void concatenate_assign(const Pointset_Powerset& y);
+
+  //! Removes all the specified space dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher space dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a partial function.
+
+    See also Polyhedron::map_space_dimensions.
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.  Also
+    thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+  typedef typename Base::size_type size_type;
+  typedef typename Base::value_type value_type;
+  typedef typename Base::iterator iterator;
+  typedef typename Base::const_iterator const_iterator;
+  typedef typename Base::reverse_iterator reverse_iterator;
+  typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  typedef typename Base::Sequence Sequence;
+  typedef typename Base::Sequence_iterator Sequence_iterator;
+  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  /*! \brief
+    Assigns to \p dest a \ref Powerset_Meet_Preserving_Simplification
+    "powerset meet-preserving enlargement" of itself with respect to
+    \p *this.  If \c false is returned, then the intersection is empty.
+
+    \note
+    It is assumed that \p *this and \p dest are topology-compatible
+    and dimension-compatible.
+  */
+  bool intersection_preserving_enlarge_element(PSET& dest) const;
+
+  /*! \brief
+    Assigns to \p *this the result of applying the BGP99 heuristics
+    to \p *this and \p y, using the widening function \p widen_fun.
+  */
+  template <typename Widening>
+  void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+  //! Records in \p cert_ms the certificates for this set of disjuncts.
+  template <typename Cert>
+  void collect_certificates(std::map<Cert, size_type,
+                                     typename Cert::Compare>& cert_ms) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the current set of disjuncts
+    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+  */
+  template <typename Cert>
+  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                                                   typename Cert::Compare>&
+                                    y_cert_ms) const;
+
+  // FIXME: here it should be enough to befriend the template constructor
+  // template <typename QH>
+  // Pointset_Powerset(const Pointset_Powerset<QH>&),
+  // but, apparently, this cannot be done.
+  friend class Pointset_Powerset<NNC_Polyhedron>;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+void swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y);
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Pointset_Powerset
+  Let \p p and \p q be two polyhedra.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PSET, Pointset_Powerset\<NNC_Polyhedron\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p;
+  - the set-theoretical union of <CODE>r.first</CODE> with all the
+    elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+
+  \if Include_Implementation_Details
+
+  See
+  <A HREF="http://bugseng.com/products/ppl/Documentation/bibliography#Srivastava93">
+  this paper</A> for more information about the implementation.
+  \endif
+*/
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+                  const Pointset_Powerset<NNC_Polyhedron>& ps);
+
+
+/*! \brief
+  Partitions the grid \p q with respect to grid \p p if and only if
+  such a partition is finite.
+
+  \relates Parma_Polyhedra_Library::Pointset_Powerset
+  Let \p p and \p q be two grids.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PSET, Pointset_Powerset\<Grid\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - If there is a finite partition of \p q with respect to \p p
+    the Boolean <CODE>finite_partition</CODE> is set to true and
+    <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p and the set-theoretical
+    union of <CODE>r.first</CODE> with all the elements of
+    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+  - Otherwise the Boolean <CODE>finite_partition</CODE> is set to false
+    and the singleton set that contains \p q is stored in
+    <CODE>r.second</CODE>r.
+*/
+std::pair<Grid, Pointset_Powerset<Grid> >
+approximate_partition(const Grid& p, const Grid& q, bool& finite_partition);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the grids \p ps contains the grid \p g.
+
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const Grid& ph,
+                  const Pointset_Powerset<Grid>& ps);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the objects in \p ps contains \p ph.
+
+  \relates Pointset_Powerset
+  \note
+  It is assumed that the template parameter PSET can be converted
+  without precision loss into an NNC_Polyhedron; otherwise,
+  an incorrect result might be obtained.
+*/
+template <typename PSET>
+bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps);
+
+// CHECKME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+                    Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+                    Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+                    Complexity_Class);
+
+template <>
+void
+Pointset_Powerset<NNC_Polyhedron>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+void
+Pointset_Powerset<Grid>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+template <>
+bool
+Pointset_Powerset<Grid>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Pointset_Powerset_inlines.hh"
+#include "Pointset_Powerset_templates.hh"
+
+#endif // !defined(PPL_Pointset_Powerset_defs_hh)
diff --git a/src/Pointset_Powerset_inlines.hh b/src/Pointset_Powerset_inlines.hh
new file mode 100644
index 0000000..a09a265
--- /dev/null
+++ b/src/Pointset_Powerset_inlines.hh
@@ -0,0 +1,320 @@
+/* Pointset_Powerset class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_inlines_hh
+#define PPL_Pointset_Powerset_inlines_hh 1
+
+#include "Constraint_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Congruence_defs.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::max_space_dimension() {
+  return PSET::max_space_dimension();
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(dimension_type num_dimensions,
+                                           Degenerate_Element kind)
+  : Base(), space_dim(num_dimensions) {
+  Pointset_Powerset& x = *this;
+  if (kind == UNIVERSE)
+    x.sequence.push_back(Determinate<PSET>(PSET(num_dimensions, kind)));
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Pointset_Powerset& y,
+                                           Complexity_Class)
+  : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const C_Polyhedron& ph,
+                                           Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const NNC_Polyhedron& ph,
+                                           Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Grid& gr,
+                                           Complexity_Class)
+  : Base(), space_dim(gr.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!gr.is_empty()) {
+    x.sequence.push_back(Determinate<PSET>(PSET(gr)));
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename QH1, typename QH2, typename R>
+inline
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                    Complexity_Class complexity)
+  : Base(), space_dim(prp.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (prp.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PSET>(PSET(prp, complexity)));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename Interval>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Box<Interval>& box,
+                                           Complexity_Class)
+  : Base(), space_dim(box.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!box.is_empty())
+    x.sequence.push_back(Determinate<PSET>(PSET(box)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Octagonal_Shape<T>& os,
+                                           Complexity_Class)
+  : Base(), space_dim(os.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!os.is_empty())
+    x.sequence.push_back(Determinate<PSET>(PSET(os)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const BD_Shape<T>& bds,
+                                           Complexity_Class)
+  : Base(), space_dim(bds.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!bds.is_empty())
+    x.sequence.push_back(Determinate<PSET>(PSET(bds)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Constraint_System& cs)
+  : Base(Determinate<PSET>(cs)), space_dim(cs.space_dimension()) {
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Congruence_System& cgs)
+  : Base(Determinate<PSET>(cgs)), space_dim(cgs.space_dimension()) {
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::operator=(y);
+  x.space_dim = y.space_dim;
+  return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::m_swap(Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::m_swap(y);
+  using std::swap;
+  swap(x.space_dim, y.space_dim);
+}
+
+template <typename PSET>
+template <typename QH>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset<QH>& y) {
+  Pointset_Powerset& x = *this;
+  Pointset_Powerset<PSET> ps(y);
+  swap(x, ps);
+  return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::intersection_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y,
+     Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::intersection_assign)));
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::time_elapse_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y,
+     Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::time_elapse_assign)));
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy);
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Pointset_Powerset<Grid>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <>
+inline bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::external_memory_in_bytes() const {
+  return Base::external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline int32_t
+Pointset_Powerset<PSET>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>
+::difference_assign(const Pointset_Powerset& y) {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  Pointset_Powerset<NNC_Polyhedron> nnc_this(*this);
+  Pointset_Powerset<NNC_Polyhedron> nnc_y(y);
+  nnc_this.difference_assign(nnc_y);
+  *this = nnc_this;
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps) {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  const NNC_Polyhedron ph_nnc = NNC_Polyhedron(ph.constraints());
+  const Pointset_Powerset<NNC_Polyhedron> ps_nnc(ps);
+  return check_containment(ph_nnc, ps_nnc);
+}
+
+/*! \relates Pointset_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+                  const Pointset_Powerset<C_Polyhedron>& ps) {
+  return check_containment(NNC_Polyhedron(ph),
+                           Pointset_Powerset<NNC_Polyhedron>(ps));
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline void
+swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_inlines_hh)
diff --git a/src/Pointset_Powerset_templates.hh b/src/Pointset_Powerset_templates.hh
new file mode 100644
index 0000000..12b5f12
--- /dev/null
+++ b/src/Pointset_Powerset_templates.hh
@@ -0,0 +1,1610 @@
+/* Pointset_Powerset class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Pointset_Powerset_templates_hh
+#define PPL_Pointset_Powerset_templates_hh 1
+
+#include "Constraint_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Variables_Set_defs.hh"
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_disjunct(const PSET& ph) {
+  Pointset_Powerset& x = *this;
+  if (x.space_dimension() != ph.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PSET>::add_disjunct(ph):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "ph.space_dimension() == " << ph.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  x.sequence.push_back(Determinate<PSET>(ph));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+                         (NNC_Polyhedron(i->pointset(), complexity)));
+
+  // FIXME: If the domain elements can be represented _exactly_ as NNC
+  // polyhedra, then having x.reduced = y.reduced is correct. This is
+  // the case if the domains are both linear and convex which holds
+  // for all the currently supported instantiations except for
+  // Grids; for this reason the Grid specialization has a
+  // separate implementation.  For any non-linear or non-convex
+  // domains (e.g., a domain of Intervals with restrictions or a
+  // domain of circles) that may be supported in the future, the
+  // assignment x.reduced = y.reduced will be a bug.
+  x.reduced = y.reduced;
+
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename QH>
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<PSET>(PSET(i->pointset(), complexity)));
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of PSET may have made
+  // different QH elements to become comparable.
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::concatenate_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  x.omega_reduce();
+  y.omega_reduce();
+  Pointset_Powerset<PSET> new_x(x.space_dim + y.space_dim, EMPTY);
+  for (const_iterator xi = x.begin(), x_end = x.end(),
+         y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      Det_PSET zi = *xi;
+      zi.concatenate_assign(*yi);
+      PPL_ASSERT_HEAVY(!zi.is_bottom());
+      new_x.sequence.push_back(zi);
+    }
+    ++xi;
+    if ((abandon_expensive_computations != 0)
+        && (xi != x_end) && (y_begin != y_end)) {
+      // Hurry up!
+      PSET x_ph = xi->pointset();
+      for (++xi; xi != x_end; ++xi)
+        x_ph.upper_bound_assign(xi->pointset());
+      const_iterator yi = y_begin;
+      PSET y_ph = yi->pointset();
+      for (++yi; yi != y_end; ++yi)
+        y_ph.upper_bound_assign(yi->pointset());
+      x_ph.concatenate_assign(y_ph);
+      swap(x, new_x);
+      x.add_disjunct(x_ph);
+      PPL_ASSERT_HEAVY(x.OK());
+      return;
+    }
+  }
+  swap(x, new_x);
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_constraint(c);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_constraint(c);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_constraints(cs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_constraints(cs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruence(const Congruence& cg) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_congruence(cg);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruence(const Congruence& cg) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_congruence(cg);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruences(const Congruence_System& cgs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_congruences(cgs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruences(const Congruence_System& cgs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_congruences(cgs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variable var) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().unconstrain(var);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variables_Set& vars) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().unconstrain(vars);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_embed(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_space_dimensions_and_embed(m);
+  x.space_dim += m;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_project(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_space_dimensions_and_project(m);
+  x.space_dim += m;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::remove_space_dimensions(const Variables_Set& vars) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_removed = vars.size();
+  if (num_removed > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si) {
+      si->pointset().remove_space_dimensions(vars);
+      x.reduced = false;
+    }
+    x.space_dim -= num_removed;
+    PPL_ASSERT_HEAVY(x.OK());
+  }
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  Pointset_Powerset& x = *this;
+  if (new_dimension < x.space_dim) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si) {
+      si->pointset().remove_higher_space_dimensions(new_dimension);
+      x.reduced = false;
+    }
+    x.space_dim = new_dimension;
+    PPL_ASSERT_HEAVY(x.OK());
+  }
+}
+
+template <typename PSET>
+template <typename Partial_Function>
+void
+Pointset_Powerset<PSET>::map_space_dimensions(const Partial_Function& pfunc) {
+  Pointset_Powerset& x = *this;
+  if (x.is_bottom()) {
+    dimension_type n = 0;
+    for (dimension_type i = x.space_dim; i-- > 0; ) {
+      dimension_type new_i;
+      if (pfunc.maps(i, new_i))
+        ++n;
+    }
+    x.space_dim = n;
+  }
+  else {
+    Sequence_iterator s_begin = x.sequence.begin();
+    for (Sequence_iterator si = s_begin,
+           s_end = x.sequence.end(); si != s_end; ++si)
+      si->pointset().map_space_dimensions(pfunc);
+    x.space_dim = s_begin->pointset().space_dimension();
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::expand_space_dimension(Variable var,
+                                                dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().expand_space_dimension(var, m);
+  x.space_dim += m;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::fold_space_dimensions(const Variables_Set& vars,
+                                               Variable dest) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_folded = vars.size();
+  if (num_folded > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si)
+      si->pointset().fold_space_dimensions(vars, dest);
+  }
+  x.space_dim -= num_folded;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_image(Variable var,
+                                      const Linear_Expression& expr,
+                                      Coefficient_traits::const_reference
+                                      denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().affine_image(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_preimage(Variable var,
+                                         const Linear_Expression& expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().affine_preimage(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_image(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_preimage(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_image(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference
+                              denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_preimage(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().bounded_affine_image(var, lb_expr, ub_expr, denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().bounded_affine_preimage(var, lb_expr, ub_expr,
+                                          denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+dimension_type
+Pointset_Powerset<PSET>::affine_dimension() const {
+  // The affine dimension of the powerset is the affine dimension of
+  // the smallest vector space in which it can be embedded.
+  const Pointset_Powerset& x = *this;
+  C_Polyhedron x_ph(space_dim, EMPTY);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    PSET pi(si->pointset());
+    if (!pi.is_empty()) {
+      C_Polyhedron phi(space_dim);
+      const Constraint_System& cs = pi.minimized_constraints();
+      for (Constraint_System::const_iterator i = cs.begin(),
+             cs_end = cs.end(); i != cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_equality())
+          phi.add_constraint(c);
+      }
+      x_ph.poly_hull_assign(phi);
+    }
+  }
+
+  return x_ph.affine_dimension();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_universe() const {
+  const Pointset_Powerset& x = *this;
+  // Exploit omega-reduction, if already computed.
+  if (x.is_omega_reduced())
+    return x.size() == 1 && x.begin()->pointset().is_universe();
+
+  // A powerset is universe iff one of its disjuncts is.
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->pointset().is_universe()) {
+      // Speculative omega-reduction, if it is worth.
+      if (x.size() > 1) {
+        Pointset_Powerset<PSET> universe(x.space_dimension(), UNIVERSE);
+        Pointset_Powerset& xx = const_cast<Pointset_Powerset&>(x);
+        swap(xx, universe);
+      }
+      return true;
+    }
+  return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_empty() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_empty())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_discrete() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_discrete())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_topologically_closed() const {
+  const Pointset_Powerset& x = *this;
+  // The powerset must be omega-reduced before checking
+  // topological closure.
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_topologically_closed())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_bounded() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_bounded())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::constrains(Variable var) const {
+  const Pointset_Powerset& x = *this;
+  // `var' should be one of the dimensions of the powerset.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x.space_dimension() < var_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PSET>::constrains(v):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "v.space_dimension() == " << var_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // omega_reduction needed, since a redundant disjunct may constrain var.
+  x.omega_reduce();
+  // An empty powerset constrains all variables.
+  if (x.is_empty())
+    return true;
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->pointset().constrains(var))
+      return true;
+  return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_disjoint_from(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         x_s_end = x.sequence.end(); si != x_s_end; ++si) {
+    const PSET& pi = si->pointset();
+    for (Sequence_const_iterator sj = y.sequence.begin(),
+           y_s_end = y.sequence.end(); sj != y_s_end; ++sj) {
+      const PSET& pj = sj->pointset();
+      if (!pi.is_disjoint_from(pj))
+        return false;
+    }
+  }
+  return true;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(const Variables_Set& vars,
+                               Complexity_Class complexity) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().drop_some_non_integer_points(vars, complexity);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().drop_some_non_integer_points(complexity);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::topological_closure_assign() {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().topological_closure_assign();
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::intersection_preserving_enlarge_element(PSET& dest) const {
+  // FIXME: this is just an executable specification.
+  const Pointset_Powerset& context = *this;
+  PPL_ASSERT(context.space_dimension() == dest.space_dimension());
+  bool nonempty_intersection = false;
+  // TODO: maybe use a *sorted* constraint system?
+  PSET enlarged(context.space_dimension(), UNIVERSE);
+  for (Sequence_const_iterator si = context.sequence.begin(),
+         s_end = context.sequence.end(); si != s_end; ++si) {
+    PSET context_i(si->pointset());
+    context_i.intersection_assign(enlarged);
+    PSET enlarged_i(dest);
+    if (enlarged_i.simplify_using_context_assign(context_i))
+      nonempty_intersection = true;
+    // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'?
+    enlarged.intersection_assign(enlarged_i);
+  }
+  swap(dest, enlarged);
+  return nonempty_intersection;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::simplify_using_context_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+
+  // Omega reduction is required.
+  // TODO: check whether it would be more efficient to Omega-reduce x
+  // during the simplification process: when examining *si, we check
+  // if it has been made redundant by any of the elements preceding it
+  // (which have been already simplified).
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+  y.omega_reduce();
+  if (y.is_empty()) {
+    x = y;
+    return false;
+  }
+
+  if (y.size() == 1) {
+    // More efficient, special handling of the singleton context case.
+    const PSET& y_i = y.sequence.begin()->pointset();
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ) {
+      PSET& x_i = si->pointset();
+      if (x_i.simplify_using_context_assign(y_i))
+        ++si;
+      else
+        // Intersection is empty: drop the disjunct.
+        si = x.sequence.erase(si);
+    }
+  }
+  else {
+    // The context is not a singleton.
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ) {
+      if (y.intersection_preserving_enlarge_element(si->pointset()))
+        ++si;
+      else
+        // Intersection with `*si' is empty: drop the disjunct.
+        si = x.sequence.erase(si);
+    }
+  }
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+  return !x.sequence.empty();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+    const PSET& pi = si->pointset();
+    bool pi_is_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           x_s_end = x.sequence.end();
+         (sj != x_s_end && !pi_is_contained);
+         ++sj) {
+      const PSET& pj = sj->pointset();
+      if (pj.contains(pi))
+        pi_is_contained = true;
+    }
+    if (!pi_is_contained)
+      return false;
+  }
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::strictly_contains(const Pointset_Powerset& y) const {
+  /* omega reduction ensures that a disjunct of y cannot be strictly
+     contained in one disjunct and also contained but not strictly
+     contained in another disjunct of *this */
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+    const PSET& pi = si->pointset();
+    bool pi_is_strictly_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           x_s_end = x.sequence.end();
+         (sj != x_s_end && !pi_is_strictly_contained); ++sj) {
+      const PSET& pj = sj->pointset();
+      if (pj.strictly_contains(pi))
+        pi_is_strictly_contained = true;
+    }
+    if (!pi_is_strictly_contained)
+      return false;
+  }
+  return true;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Congruence& cg) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in cg if every disjunct is included in cg */
+  bool is_included = true;
+  /* *this is disjoint with cg if every disjunct is disjoint with cg */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with cg if some disjunct strictly
+     intersects with cg */
+  bool is_strictly_intersecting = false;
+  /* *this saturates cg if some disjunct saturates cg and
+     every disjunct is either disjoint from cg or saturates cg */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->pointset().relation_with(cg);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Constraint& c) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in c if every disjunct is included in c */
+  bool is_included = true;
+  /* *this is disjoint with c if every disjunct is disjoint with c */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with c if some disjunct strictly
+     intersects with c */
+  bool is_strictly_intersecting = false;
+  /* *this saturates c if some disjunct saturates c and
+     every disjunct is either disjoint from c or saturates c */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->pointset().relation_with(c);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
+}
+
+template <typename PSET>
+Poly_Gen_Relation
+Pointset_Powerset<PSET>::relation_with(const Generator& g) const {
+  const Pointset_Powerset& x = *this;
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Gen_Relation relation_i = si->pointset().relation_with(g);
+    if (relation_i.implies(Poly_Gen_Relation::subsumes()))
+      return Poly_Gen_Relation::subsumes();
+  }
+
+  return Poly_Gen_Relation::nothing();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_above(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().bounds_from_above(expr))
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_below(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().bounds_from_below(expr))
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+                                  Coefficient& sup_n,
+                                  Coefficient& sup_d,
+                                  bool& maximum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+  best_sup_n = 0;
+  best_sup_d = 1;
+  bool best_max = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+  iter_sup_n = 0;
+  iter_sup_d = 1;
+  bool iter_max = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().maximize(expr, iter_sup_n, iter_sup_d, iter_max))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_sup_n = iter_sup_n;
+        best_sup_d = iter_sup_d;
+        best_max = iter_max;
+      }
+      else {
+        tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+        if (tmp < 0) {
+          best_sup_n = iter_sup_n;
+          best_sup_d = iter_sup_d;
+          best_max = iter_max;
+        }
+        else if (tmp == 0)
+          best_max = (best_max || iter_max);
+      }
+  }
+  sup_n = best_sup_n;
+  sup_d = best_sup_d;
+  maximum = best_max;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+                                  Coefficient& sup_n,
+                                  Coefficient& sup_d,
+                                  bool& maximum,
+                                  Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+  best_sup_n = 0;
+  best_sup_d = 1;
+  bool best_max = false;
+  Generator best_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+  iter_sup_n = 0;
+  iter_sup_d = 1;
+  bool iter_max = false;
+  Generator iter_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().maximize(expr,
+                                 iter_sup_n, iter_sup_d, iter_max, iter_g))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_sup_n = iter_sup_n;
+        best_sup_d = iter_sup_d;
+        best_max = iter_max;
+        best_g = iter_g;
+      }
+      else {
+        tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+        if (tmp < 0) {
+          best_sup_n = iter_sup_n;
+          best_sup_d = iter_sup_d;
+          best_max = iter_max;
+          best_g = iter_g;
+        }
+        else if (tmp == 0) {
+          best_max = (best_max || iter_max);
+          best_g = iter_g;
+        }
+      }
+  }
+  sup_n = best_sup_n;
+  sup_d = best_sup_d;
+  maximum = best_max;
+  g = best_g;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+                                  Coefficient& inf_n,
+                                  Coefficient& inf_d,
+                                  bool& minimum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+  best_inf_n = 0;
+  best_inf_d = 1;
+  bool best_min = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+  iter_inf_n = 0;
+  iter_inf_d = 1;
+  bool iter_min = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().minimize(expr, iter_inf_n, iter_inf_d, iter_min))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_inf_n = iter_inf_n;
+        best_inf_d = iter_inf_d;
+        best_min = iter_min;
+      }
+      else {
+        tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+        if (tmp > 0) {
+          best_inf_n = iter_inf_n;
+          best_inf_d = iter_inf_d;
+          best_min = iter_min;
+        }
+        else if (tmp == 0)
+          best_min = (best_min || iter_min);
+      }
+  }
+  inf_n = best_inf_n;
+  inf_d = best_inf_d;
+  minimum = best_min;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+                                  Coefficient& inf_n,
+                                  Coefficient& inf_d,
+                                  bool& minimum,
+                                  Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+  best_inf_n = 0;
+  best_inf_d = 1;
+  bool best_min = false;
+  Generator best_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+  iter_inf_n = 0;
+  iter_inf_d = 1;
+  bool iter_min = false;
+  Generator iter_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().minimize(expr,
+                                 iter_inf_n, iter_inf_d, iter_min, iter_g))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_inf_n = iter_inf_n;
+        best_inf_d = iter_inf_d;
+        best_min = iter_min;
+        best_g = iter_g;
+      }
+      else {
+        tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+        if (tmp > 0) {
+          best_inf_n = iter_inf_n;
+          best_inf_d = iter_inf_d;
+          best_min = iter_min;
+          best_g = iter_g;
+        }
+        else if (tmp == 0) {
+          best_min = (best_min || iter_min);
+          best_g = iter_g;
+        }
+      }
+  }
+  inf_n = best_inf_n;
+  inf_d = best_inf_d;
+  minimum = best_min;
+  g = best_g;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains_integer_point() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (si->pointset().contains_integer_point())
+      return true;
+  return false;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::wrap_assign(const Variables_Set& vars,
+                                     Bounded_Integer_Type_Width w,
+                                     Bounded_Integer_Type_Representation r,
+                                     Bounded_Integer_Type_Overflow o,
+                                     const Constraint_System* cs_p,
+                                     unsigned complexity_threshold,
+                                     bool wrap_individually) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().wrap_assign(vars, w, r, o, cs_p,
+                               complexity_threshold, wrap_individually);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::pairwise_reduce() {
+  Pointset_Powerset& x = *this;
+  // It is wise to omega-reduce before pairwise-reducing.
+  x.omega_reduce();
+
+  size_type n = x.size();
+  size_type deleted;
+  do {
+    Pointset_Powerset new_x(x.space_dim, EMPTY);
+    std::deque<bool> marked(n, false);
+    deleted = 0;
+    Sequence_iterator s_begin = x.sequence.begin();
+    Sequence_iterator s_end = x.sequence.end();
+    unsigned si_index = 0;
+    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+      if (marked[si_index])
+        continue;
+      PSET& pi = si->pointset();
+      Sequence_const_iterator sj = si;
+      unsigned sj_index = si_index;
+      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+        if (marked[sj_index])
+          continue;
+        const PSET& pj = sj->pointset();
+        if (pi.upper_bound_assign_if_exact(pj)) {
+          marked[si_index] = true;
+          marked[sj_index] = true;
+          new_x.add_non_bottom_disjunct_preserve_reduction(pi);
+          ++deleted;
+          goto next;
+        }
+      }
+    next:
+      ;
+    }
+    iterator new_x_begin = new_x.begin();
+    iterator new_x_end = new_x.end();
+    unsigned xi_index = 0;
+    for (const_iterator xi = x.begin(),
+           x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+      if (!marked[xi_index])
+        new_x_begin
+          = new_x.add_non_bottom_disjunct_preserve_reduction(*xi,
+                                                             new_x_begin,
+                                                             new_x_end);
+    using std::swap;
+    swap(x.sequence, new_x.sequence);
+    n -= deleted;
+  } while (deleted > 0);
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PSET> x_copy = x;
+    const Pointset_Powerset<PSET> y_copy = y;
+    PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  size_type n = x.size();
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  std::deque<bool> marked(n, false);
+  const_iterator x_begin = x.begin();
+  const_iterator x_end = x.end();
+  unsigned i_index = 0;
+  for (const_iterator i = x_begin,
+         y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+    for (const_iterator j = y_begin; j != y_end; ++j) {
+      const PSET& pi = i->pointset();
+      const PSET& pj = j->pointset();
+      if (pi.contains(pj)) {
+        PSET pi_copy = pi;
+        widen_fun(pi_copy, pj);
+        new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy);
+        marked[i_index] = true;
+      }
+    }
+  iterator new_x_begin = new_x.begin();
+  iterator new_x_end = new_x.end();
+  i_index = 0;
+  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+    if (!marked[i_index])
+      new_x_begin
+        = new_x.add_non_bottom_disjunct_preserve_reduction(*i,
+                                                           new_x_begin,
+                                                           new_x_end);
+  using std::swap;
+  swap(x.sequence, new_x.sequence);
+  PPL_ASSERT_HEAVY(x.OK());
+  PPL_ASSERT(x.is_omega_reduced());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_extrapolation_assign(const Pointset_Powerset& y,
+                           Widening widen_fun,
+                           unsigned max_disjuncts) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PSET> x_copy = x;
+    const Pointset_Powerset<PSET> y_copy = y;
+    PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  x.pairwise_reduce();
+  if (max_disjuncts != 0)
+    x.collapse(max_disjuncts);
+  x.BGP99_heuristics_assign(y, widen_fun);
+}
+
+template <typename PSET>
+template <typename Cert>
+void
+Pointset_Powerset<PSET>::
+collect_certificates(std::map<Cert, size_type,
+                     typename Cert::Compare>& cert_ms) const {
+  const Pointset_Powerset& x = *this;
+  PPL_ASSERT(x.is_omega_reduced());
+  PPL_ASSERT(cert_ms.size() == 0);
+  for (const_iterator i = x.begin(), end = x.end(); i != end; ++i) {
+    Cert ph_cert(i->pointset());
+    ++cert_ms[ph_cert];
+  }
+}
+
+template <typename PSET>
+template <typename Cert>
+bool
+Pointset_Powerset<PSET>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                             typename Cert::Compare>& y_cert_ms) const {
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset x_cert_ms;
+  collect_certificates(x_cert_ms);
+  typename Cert_Multiset::const_iterator xi = x_cert_ms.begin();
+  typename Cert_Multiset::const_iterator x_cert_ms_end = x_cert_ms.end();
+  typename Cert_Multiset::const_iterator yi = y_cert_ms.begin();
+  typename Cert_Multiset::const_iterator y_cert_ms_end = y_cert_ms.end();
+  while (xi != x_cert_ms_end && yi != y_cert_ms_end) {
+    const Cert& xi_cert = xi->first;
+    const Cert& yi_cert = yi->first;
+    switch (xi_cert.compare(yi_cert)) {
+    case 0:
+      // xi_cert == yi_cert: check the number of multiset occurrences.
+      {
+        const size_type& xi_count = xi->second;
+        const size_type& yi_count = yi->second;
+        if (xi_count == yi_count) {
+          // Same number of occurrences: compare the next pair.
+          ++xi;
+          ++yi;
+        }
+        else
+          // Different number of occurrences: can decide ordering.
+          return xi_count < yi_count;
+        break;
+      }
+    case 1:
+      // xi_cert > yi_cert: it is not stabilizing.
+      return false;
+
+    case -1:
+      // xi_cert < yi_cert: it is stabilizing.
+      return true;
+    }
+  }
+  // Here xi == x_cert_ms_end or yi == y_cert_ms_end.
+  // Stabilization is achieved if `y_cert_ms' still has other elements.
+  return yi != y_cert_ms_end;
+}
+
+template <typename PSET>
+template <typename Cert, typename Widening>
+void
+Pointset_Powerset<PSET>::BHZ03_widening_assign(const Pointset_Powerset& y,
+                                               Widening widen_fun) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PSET> x_copy = x;
+    const Pointset_Powerset<PSET> y_copy = y;
+    PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  // First widening technique: do nothing.
+
+  // If `y' is the empty collection, do nothing.
+  PPL_ASSERT(x.size() > 0);
+  if (y.size() == 0)
+    return;
+
+  // Compute the poly-hull of `x'.
+  PSET x_hull(x.space_dim, EMPTY);
+  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+    x_hull.upper_bound_assign(i->pointset());
+
+  // Compute the poly-hull of `y'.
+  PSET y_hull(y.space_dim, EMPTY);
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    y_hull.upper_bound_assign(i->pointset());
+  // Compute the certificate for `y_hull'.
+  const Cert y_hull_cert(y_hull);
+
+  // If the hull is stabilizing, do nothing.
+  int hull_stabilization = y_hull_cert.compare(x_hull);
+  if (hull_stabilization == 1)
+    return;
+
+  // Multiset ordering is only useful when `y' is not a singleton.
+  const bool y_is_not_a_singleton = y.size() > 1;
+
+  // The multiset certificate for `y':
+  // we want to be lazy about its computation.
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset y_cert_ms;
+  bool y_cert_ms_computed = false;
+
+  if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // Collect the multiset certificate for `y'.
+    y.collect_certificates(y_cert_ms);
+    y_cert_ms_computed = true;
+    // If multiset ordering is stabilizing, do nothing.
+    if (x.is_cert_multiset_stabilizing(y_cert_ms))
+      return;
+  }
+
+  // Second widening technique: try the BGP99 powerset heuristics.
+  Pointset_Powerset<PSET> bgp99_heuristics = x;
+  bgp99_heuristics.BGP99_heuristics_assign(y, widen_fun);
+
+  // Compute the poly-hull of `bgp99_heuristics'.
+  PSET bgp99_heuristics_hull(x.space_dim, EMPTY);
+  for (const_iterator i = bgp99_heuristics.begin(),
+         b_h_end = bgp99_heuristics.end(); i != b_h_end; ++i)
+    bgp99_heuristics_hull.upper_bound_assign(i->pointset());
+
+  // Check for stabilization and, if successful,
+  // commit to the result of the extrapolation.
+  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+  if (hull_stabilization == 1) {
+    // The poly-hull is stabilizing.
+    swap(x, bgp99_heuristics);
+    return;
+  }
+  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // If not already done, compute multiset certificate for `y'.
+    if (!y_cert_ms_computed) {
+      y.collect_certificates(y_cert_ms);
+      y_cert_ms_computed = true;
+    }
+    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      swap(x, bgp99_heuristics);
+      return;
+    }
+    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+    // Note that pairwise-reduction does not affect the computation
+    // of the poly-hulls, so that we only have to check the multiset
+    // certificate relation.
+    Pointset_Powerset<PSET> reduced_bgp99_heuristics(bgp99_heuristics);
+    reduced_bgp99_heuristics.pairwise_reduce();
+    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      swap(x, reduced_bgp99_heuristics);
+      return;
+    }
+  }
+
+  // Fourth widening technique: this is applicable only when
+  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+    // Compute (y_hull \widen bgp99_heuristics_hull).
+    PSET ph = bgp99_heuristics_hull;
+    widen_fun(ph, y_hull);
+    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+    ph.difference_assign(bgp99_heuristics_hull);
+    x.add_disjunct(ph);
+    return;
+  }
+
+  // Fall back to the computation of the poly-hull.
+  Pointset_Powerset<PSET> x_hull_singleton(x.space_dim, EMPTY);
+  x_hull_singleton.add_disjunct(x_hull);
+  swap(x, x_hull_singleton);
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::ascii_dump(std::ostream& s) const {
+  const Pointset_Powerset& x = *this;
+  s << "size " << x.size()
+    << "\nspace_dim " << x.space_dim
+    << "\n";
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+    xi->pointset().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PSET, Pointset_Powerset<PSET>)
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::ascii_load(std::istream& s) {
+  Pointset_Powerset& x = *this;
+  std::string str;
+
+  if (!(s >> str) || str != "size")
+    return false;
+
+  size_type sz;
+
+  if (!(s >> sz))
+    return false;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> x.space_dim))
+    return false;
+
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  while (sz-- > 0) {
+    PSET ph;
+    if (!ph.ascii_load(s))
+      return false;
+    new_x.add_disjunct(ph);
+  }
+  swap(x, new_x);
+
+  // Check invariants.
+  PPL_ASSERT_HEAVY(x.OK());
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::OK() const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+    const PSET& pi = xi->pointset();
+    if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+                << " in an element of the sequence,\nshould be "
+                << x.space_dim << "."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+  return x.Base::OK();
+}
+
+namespace Implementation {
+
+namespace Pointset_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p pset according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p pset and constraint \p c is stored
+  in \p pset, whereas the intersection of \p pset with the negation of \p c
+  is added as a new disjunct of the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+void
+linear_partition_aux(const Constraint& c,
+                     PSET& pset,
+                     Pointset_Powerset<NNC_Polyhedron>& r) {
+  const Linear_Expression le(c.expression());
+  const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+  NNC_Polyhedron nnc_ph_pset(pset);
+  nnc_ph_pset.add_constraint(neg_c);
+  if (!nnc_ph_pset.is_empty())
+    r.add_disjunct(nnc_ph_pset);
+  pset.add_constraint(c);
+}
+
+} // namespace Pointset_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q) {
+  using Implementation::Pointset_Powersets::linear_partition_aux;
+
+  Pointset_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+  PSET pset = q;
+  const Constraint_System& p_constraints = p.constraints();
+  for (Constraint_System::const_iterator i = p_constraints.begin(),
+         p_constraints_end = p_constraints.end();
+       i != p_constraints_end;
+       ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality()) {
+      const Linear_Expression le(c.expression());
+      linear_partition_aux(le <= 0, pset, r);
+      linear_partition_aux(le >= 0, pset, r);
+    }
+    else
+      linear_partition_aux(c, pset, r);
+  }
+  return std::make_pair(pset, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_templates_hh)
diff --git a/src/Pointset_Powerset_types.hh b/src/Pointset_Powerset_types.hh
new file mode 100644
index 0000000..f52e4f5
--- /dev/null
+++ b/src/Pointset_Powerset_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Pointset_Powerset_types_hh
+#define PPL_Pointset_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Pointset_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Pointset_Powerset_types_hh)
diff --git a/src/Poly_Con_Relation.cc b/src/Poly_Con_Relation.cc
new file mode 100644
index 0000000..3a8f0f7
--- /dev/null
+++ b/src/Poly_Con_Relation.cc
@@ -0,0 +1,76 @@
+/* Poly_Con_Relation class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Poly_Con_Relation_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Poly_Con_Relation::ascii_dump(std::ostream& s) const {
+  flags_t f = flags;
+  if (f == NOTHING) {
+    s << "NOTHING";
+    return;
+  }
+
+  while (true) {
+    if (implies(f, IS_DISJOINT)) {
+      s << "IS_DISJOINT";
+      f &= ~IS_DISJOINT;
+    }
+    else if (implies(f, STRICTLY_INTERSECTS)) {
+      s << "STRICTLY_INTERSECTS";
+      f &= ~STRICTLY_INTERSECTS;
+    }
+    else if (implies(f, IS_INCLUDED)) {
+      s << "IS_INCLUDED";
+      f &= ~IS_INCLUDED;
+    }
+    else if (implies(f, SATURATES)) {
+      s << "SATURATES";
+      f &= ~SATURATES;
+    }
+    if (f != NOTHING)
+      s << " & ";
+    else
+      break;
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Poly_Con_Relation)
+
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r) {
+  r.ascii_dump(s);
+  return s;
+}
+
+bool
+PPL::Poly_Con_Relation::OK() const {
+  return true;
+}
diff --git a/src/Poly_Con_Relation_defs.hh b/src/Poly_Con_Relation_defs.hh
new file mode 100644
index 0000000..73034ff
--- /dev/null
+++ b/src/Poly_Con_Relation_defs.hh
@@ -0,0 +1,166 @@
+/* Poly_Con_Relation class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Con_Relation_defs_hh
+#define PPL_Poly_Con_Relation_defs_hh 1
+
+#include "Poly_Con_Relation_types.hh"
+#include "globals_defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+                             const Poly_Con_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+                            const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+  //! Poly_Con_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING             = 0U;
+  static const flags_t IS_DISJOINT         = 1U << 0;
+  static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+  static const flags_t IS_INCLUDED         = 1U << 2;
+  static const flags_t SATURATES           = 1U << 3;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = IS_DISJOINT
+  | STRICTLY_INTERSECTS
+  | IS_INCLUDED
+  | SATURATES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Con_Relation(flags_t mask);
+
+  friend bool
+  operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+  friend bool
+  operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some language
+    interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Con_Relation nothing();
+
+  /*! \brief
+    The polyhedron and the set of points satisfying
+    the constraint are disjoint.
+  */
+  static Poly_Con_Relation is_disjoint();
+
+  /*! \brief
+    The polyhedron intersects the set of points satisfying
+    the constraint, but it is not included in it.
+  */
+  static Poly_Con_Relation strictly_intersects();
+
+  /*! \brief
+    The polyhedron is included in the set of points satisfying
+    the constraint.
+  */
+  static Poly_Con_Relation is_included();
+
+  /*! \brief
+    The polyhedron is included in the set of points saturating
+    the constraint.
+  */
+  static Poly_Con_Relation saturates();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Con_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#include "Poly_Con_Relation_inlines.hh"
+
+#endif // !defined(PPL_Poly_Con_Relation_defs_hh)
diff --git a/src/Poly_Con_Relation_inlines.hh b/src/Poly_Con_Relation_inlines.hh
new file mode 100644
index 0000000..b9ba49c
--- /dev/null
+++ b/src/Poly_Con_Relation_inlines.hh
@@ -0,0 +1,100 @@
+/* Poly_Con_Relation class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Con_Relation_inlines_hh
+#define PPL_Poly_Con_Relation_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+  return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+  return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+  return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+  return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+  return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Con_Relation_inlines_hh)
diff --git a/src/Poly_Con_Relation_types.hh b/src/Poly_Con_Relation_types.hh
new file mode 100644
index 0000000..c20d762
--- /dev/null
+++ b/src/Poly_Con_Relation_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Poly_Con_Relation_types_hh
+#define PPL_Poly_Con_Relation_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Con_Relation_types_hh)
diff --git a/src/Poly_Gen_Relation.cc b/src/Poly_Gen_Relation.cc
new file mode 100644
index 0000000..180155e
--- /dev/null
+++ b/src/Poly_Gen_Relation.cc
@@ -0,0 +1,64 @@
+/* Poly_Gen_Relation class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Poly_Gen_Relation_defs.hh"
+#include "assert.hh"
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Poly_Gen_Relation::ascii_dump(std::ostream& s) const {
+  flags_t f = flags;
+  if (f == NOTHING) {
+    s << "NOTHING";
+    return;
+  }
+
+  while (true) {
+    if (implies(f, SUBSUMES)) {
+      s << "SUBSUMES";
+      f &= ~SUBSUMES;
+    }
+    if (f != NOTHING)
+      s << " & ";
+    else
+      break;
+  }
+}
+
+PPL_OUTPUT_DEFINITIONS(Poly_Gen_Relation)
+
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r) {
+  r.ascii_dump(s);
+  return s;
+}
+
+bool
+PPL::Poly_Gen_Relation::OK() const {
+  return true;
+}
diff --git a/src/Poly_Gen_Relation_defs.hh b/src/Poly_Gen_Relation_defs.hh
new file mode 100644
index 0000000..13e5d00
--- /dev/null
+++ b/src/Poly_Gen_Relation_defs.hh
@@ -0,0 +1,139 @@
+/* Poly_Gen_Relation class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Gen_Relation_defs_hh
+#define PPL_Poly_Gen_Relation_defs_hh 1
+
+#include "Poly_Gen_Relation_types.hh"
+#include "globals_defs.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+                             const Poly_Gen_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+                            const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+  //! Poly_Gen_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING  = 0U;
+  static const flags_t SUBSUMES = 1U << 0;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = SUBSUMES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Gen_Relation(flags_t mask);
+
+  friend bool
+  operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+  friend bool
+  operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some language
+    interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Gen_Relation nothing();
+
+  //! Adding the generator would not change the polyhedron.
+  static Poly_Gen_Relation subsumes();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Gen_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+#include "Poly_Gen_Relation_inlines.hh"
+
+#endif // !defined(PPL_Poly_Gen_Relation_defs_hh)
diff --git a/src/Poly_Gen_Relation_inlines.hh b/src/Poly_Gen_Relation_inlines.hh
new file mode 100644
index 0000000..1d6e991
--- /dev/null
+++ b/src/Poly_Gen_Relation_inlines.hh
@@ -0,0 +1,85 @@
+/* Poly_Gen_Relation class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Poly_Gen_Relation_inlines_hh
+#define PPL_Poly_Gen_Relation_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+  return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+  return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Gen_Relation_inlines_hh)
diff --git a/src/Poly_Gen_Relation_types.hh b/src/Poly_Gen_Relation_types.hh
new file mode 100644
index 0000000..d7f5ec4
--- /dev/null
+++ b/src/Poly_Gen_Relation_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Poly_Gen_Relation_types_hh
+#define PPL_Poly_Gen_Relation_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Poly_Gen_Relation_types_hh)
diff --git a/src/Polyhedron_chdims.cc b/src/Polyhedron_chdims.cc
new file mode 100644
index 0000000..e5afa64
--- /dev/null
+++ b/src/Polyhedron_chdims.cc
@@ -0,0 +1,477 @@
+/* Polyhedron class implementation
+   (non-inline operators that may change the dimension of the vector space).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "Variables_Set_defs.hh"
+#include "assert.hh"
+
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron::add_space_dimensions_and_embed(dimension_type m) {
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 topology(),
+                                 "add_space_dimensions_and_embed(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+
+  // Adding no dimensions to any polyhedron is a no-op.
+  if (m == 0)
+    return;
+
+  // Adding dimensions to an empty polyhedron is obtained by adjusting
+  // `space_dim' and clearing `con_sys' (since it can contain the
+  // unsatisfiable constraint system of the wrong dimension).
+  if (marked_empty()) {
+    space_dim += m;
+    con_sys.clear();
+    return;
+  }
+
+  // The case of a zero-dimensional space polyhedron.
+  if (space_dim == 0) {
+    // Since it is not empty, it has to be the universe polyhedron.
+    PPL_ASSERT(status.test_zero_dim_univ());
+    // We swap `*this' with a newly created
+    // universe polyhedron of dimension `m'.
+    Polyhedron ph(topology(), m, UNIVERSE);
+    m_swap(ph);
+    return;
+  }
+
+  // To embed an n-dimension space polyhedron in a (n+m)-dimension space,
+  // we just add `m' zero-columns to the rows in the system of constraints;
+  // in contrast, the system of generators needs additional rows,
+  // corresponding to the vectors of the canonical basis
+  // for the added dimensions. That is, for each new dimension `x[k]'
+  // we add the line having that direction. This is done by invoking
+  // the function add_space_dimensions() giving the system of generators
+  // as the second argument.
+  if (constraints_are_up_to_date())
+    if (generators_are_up_to_date()) {
+      // `sat_c' must be up to date for add_space_dimensions().
+      if (!sat_c_is_up_to_date())
+        update_sat_c();
+      // Adds rows and/or columns to both matrices.
+      // `add_space_dimensions' correctly handles pending constraints
+      // or generators.
+      add_space_dimensions(con_sys, gen_sys, sat_c, sat_g, m);
+    }
+    else {
+      // Only constraints are up-to-date: no need to modify the generators.
+      con_sys.set_space_dimension(con_sys.space_dimension() + m);
+    }
+  else {
+    // Only generators are up-to-date: no need to modify the constraints.
+    PPL_ASSERT(generators_are_up_to_date());
+    gen_sys.add_universe_rows_and_space_dimensions(m);
+  }
+  // Update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // constraints may be unsatisfiable.
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::add_space_dimensions_and_project(dimension_type m) {
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 topology(),
+                                 "add_space_dimensions_and_project(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+
+  // Adding no dimensions to any polyhedron is a no-op.
+  if (m == 0)
+    return;
+
+  // Adding dimensions to an empty polyhedron is obtained
+  // by merely adjusting `space_dim'.
+  if (marked_empty()) {
+    space_dim += m;
+    con_sys.clear();
+    return;
+  }
+
+  if (space_dim == 0) {
+    PPL_ASSERT(status.test_zero_dim_univ() && gen_sys.has_no_rows());
+    // The system of generators for this polyhedron has only
+    // the origin as a point.
+    // In an NNC polyhedron, all points have to be accompanied
+    // by the corresponding closure points
+    // (this time, dimensions are automatically adjusted).
+    if (!is_necessarily_closed())
+      gen_sys.insert(Generator::zero_dim_closure_point());
+    gen_sys.insert(Generator::zero_dim_point());
+    gen_sys.adjust_topology_and_space_dimension(topology(), m);
+    set_generators_minimized();
+    space_dim = m;
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // To project an n-dimension space polyhedron in a (n+m)-dimension space,
+  // we just add to the system of generators `m' zero-columns;
+  // In contrast, in the system of constraints, new rows are needed
+  // in order to avoid embedding the old polyhedron in the new space.
+  // Thus, for each new dimensions `x[k]', we add the constraint
+  // x[k] = 0: this is done by invoking the function add_space_dimensions()
+  // giving the system of constraints as the second argument.
+  if (constraints_are_up_to_date())
+    if (generators_are_up_to_date()) {
+      // `sat_g' must be up to date for add_space_dimensions().
+      if (!sat_g_is_up_to_date())
+        update_sat_g();
+      // Adds rows and/or columns to both matrices.
+      // `add_space_dimensions()' correctly handles pending constraints
+      // or generators.
+      add_space_dimensions(gen_sys, con_sys, sat_g, sat_c, m);
+    }
+    else {
+      // Only constraints are up-to-date: no need to modify the generators.
+      con_sys.add_universe_rows_and_space_dimensions(m);
+    }
+  else {
+    // Only generators are up-to-date: no need to modify the constraints.
+    PPL_ASSERT(generators_are_up_to_date());
+    gen_sys.set_space_dimension(gen_sys.space_dimension() + m);
+  }
+  // Now we update the space dimension.
+  space_dim += m;
+
+  // Note: we do not check for satisfiability, because the system of
+  // constraints may be unsatisfiable.
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::concatenate_assign(const Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("concatenate_assign(y)", "y", y);
+
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  const dimension_type added_columns = y.space_dim;
+  check_space_dimension_overflow(added_columns,
+                                 max_space_dimension() - space_dimension(),
+                                 topology(),
+                                 "concatenate_assign(y)",
+                                 "concatenation exceeds the maximum "
+                                 "allowed space dimension");
+
+  // If `*this' or `y' are empty polyhedra, it is sufficient to adjust
+  // the dimension of the space.
+  if (marked_empty() || y.marked_empty()) {
+    space_dim += added_columns;
+    set_empty();
+    return;
+  }
+
+  // If `y' is a non-empty 0-dim space polyhedron, the result is `*this'.
+  if (added_columns == 0)
+    return;
+
+  // If `*this' is a non-empty 0-dim space polyhedron, the result is `y'.
+  if (space_dim == 0) {
+    *this = y;
+    return;
+  }
+
+  // TODO: this implementation is just an executable specification.
+  Constraint_System cs = y.constraints();
+
+  // The constraints of `x' (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `cs' in the lower right-hand side.
+  // NOTE: here topologies agree, whereas dimensions may not agree.
+  const dimension_type added_rows = cs.num_rows();
+
+  // We already dealt with the cases of an empty or zero-dim `y' polyhedron;
+  // also, `cs' contains the low-level constraints, at least.
+  PPL_ASSERT(added_rows > 0 && added_columns > 0);
+
+  con_sys.set_space_dimension(con_sys.space_dimension() + added_columns);
+
+  if (can_have_something_pending()) {
+    // Steal the constraints from `cs' and put them in `con_sys'
+    // using the right displacement for coefficients.
+    for (dimension_type i = 0; i < added_rows; ++i) {
+      cs.sys.rows[i].shift_space_dimensions(Variable(0), space_dim);
+      con_sys.insert_pending(cs.sys.rows[i], Recycle_Input());
+    }
+    cs.clear();
+
+    // If `*this' can support pending constraints, then, since we have
+    // resized the system of constraints, we must also add to the generator
+    // system those lines corresponding to the newly added dimensions,
+    // because the non-pending parts of `con_sys' and `gen_sys' must still
+    // be a DD pair in minimal form.
+    gen_sys.add_universe_rows_and_space_dimensions(added_columns);
+    // Since we added new lines at the beginning of `x.gen_sys',
+    // we also have to adjust the saturation matrix `sat_c'.
+    // FIXME: if `sat_c' is not up-to-date, could not we directly update
+    // `sat_g' by resizing it and shifting its columns?
+    if (!sat_c_is_up_to_date()) {
+      sat_c.transpose_assign(sat_g);
+      set_sat_c_up_to_date();
+    }
+    clear_sat_g_up_to_date();
+    sat_c.resize(sat_c.num_rows() + added_columns, sat_c.num_columns());
+    // The old saturation rows are copied at the end of the matrix.
+    // The newly introduced lines saturate all the non-pending constraints,
+    // thus their saturation rows are made of zeroes.
+    using std::swap;
+    for (dimension_type i = sat_c.num_rows() - added_columns; i-- > 0; )
+      swap(sat_c[i], sat_c[i+added_columns]);
+    // Since `added_rows > 0', we now have pending constraints.
+    set_constraints_pending();
+  }
+  else {
+    // Steal the constraints from `cs' and put them in `con_sys'
+    // using the right displacement for coefficients.
+    for (dimension_type i = 0; i < added_rows; ++i) {
+      cs.sys.rows[i].shift_space_dimensions(Variable(0), space_dim);
+      con_sys.insert(cs.sys.rows[i], Recycle_Input());
+    }
+#if !BE_LAZY
+    con_sys.sort_rows();
+#endif
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+    clear_sat_g_up_to_date();
+    clear_sat_c_up_to_date();
+  }
+  // Update space dimension.
+  space_dim += added_columns;
+
+  // The system of constraints may be unsatisfiable,
+  // thus we do not check for satisfiability.
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any polyhedron is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a polyhedron in a 0-dim space.
+  if (vars.empty()) {
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - vars.size();
+
+  // We need updated generators; note that keeping pending generators
+  // is useless because the constraints will be dropped anyway.
+  if (marked_empty()
+      || (has_something_pending() && !remove_pending_to_obtain_generators())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Removing dimensions from the empty polyhedron:
+    // we clear `con_sys' since it could have contained the
+    // unsatisfiable constraint of the wrong dimension.
+    con_sys.clear();
+    // Update the space dimension.
+    space_dim = new_space_dim;
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // When removing _all_ dimensions from a non-empty polyhedron,
+  // we obtain the zero-dimensional universe polyhedron.
+  if (new_space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  gen_sys.remove_space_dimensions(vars);
+
+  // Constraints are not up-to-date and generators are not minimized.
+  clear_constraints_up_to_date();
+  clear_generators_minimized();
+
+  // Update the space dimension.
+  space_dim = new_space_dim;
+
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::remove_higher_space_dimensions(dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+                                 new_dimension);
+
+  // The removal of no dimensions from any polyhedron is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a polyhedron in a 0-dim space.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // We need updated generators; note that keeping pending generators
+  // is useless because constraints will be dropped anyway.
+  if (marked_empty()
+      || (has_something_pending() && !remove_pending_to_obtain_generators())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Removing dimensions from the empty polyhedron:
+    // just updates the space dimension.
+    space_dim = new_dimension;
+    con_sys.clear();
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  if (new_dimension == 0) {
+    // Removing all dimensions from a non-empty polyhedron:
+    // just return the zero-dimensional universe polyhedron.
+    set_zero_dim_univ();
+    return;
+  }
+
+  gen_sys.set_space_dimension(new_dimension);
+
+  // Constraints are not up-to-date and generators are not minimized.
+  clear_constraints_up_to_date();
+  clear_generators_minimized();
+
+  // Update the space dimension.
+  space_dim = new_dimension;
+
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::expand_space_dimension(Variable var, dimension_type m) {
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting polyhedron should not
+  // overflow the maximum allowed space dimension.
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 topology(),
+                                 "expand_dimension(v, m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Keep track of the dimension before adding the new ones.
+  const dimension_type old_dim = space_dim;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  const Constraint_System& cs = constraints();
+  Constraint_System new_constraints(cs.topology());
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+
+    Coefficient_traits::const_reference coeff = c.coefficient(var);
+
+    // If `c' does not constrain `var', skip it.
+    if (coeff == 0)
+      continue;
+
+    Constraint c_template = c;
+    c_template.expr.set_coefficient(var, Coefficient_zero());
+    
+    // Each relevant constraint results in `m' new constraints.
+    for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+      Constraint new_c = c_template;
+      add_mul_assign(new_c.expr, coeff, Variable(dst_d));
+      PPL_ASSERT(new_c.OK());
+      new_constraints.insert(new_c, Recycle_Input());
+    }
+  }
+  add_recycled_constraints(new_constraints);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::fold_space_dimensions(const Variables_Set& vars,
+                                       Variable dest) {
+  // TODO: this implementation is _really_ an executable specification.
+
+  // `dest' should be one of the dimensions of the polyhedron.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the polyhedron.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 "vs.space_dimension()",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  // All of the affine images we are going to compute are not invertible,
+  // hence we will need to compute the generators of the polyhedron.
+  // Since we keep taking copies, make sure that a single conversion
+  // from constraints to generators is computed.
+  (void) generators();
+  // Having generators, we now know if the polyhedron is empty:
+  // in that case, folding is equivalent to just removing space dimensions.
+  if (!marked_empty()) {
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vs_end = vars.end(); i != vs_end; ++i) {
+      Polyhedron copy = *this;
+      copy.affine_image(dest, Linear_Expression(Variable(*i)));
+      poly_hull_assign(copy);
+    }
+  }
+  remove_space_dimensions(vars);
+  PPL_ASSERT_HEAVY(OK());
+}
diff --git a/src/Polyhedron_chdims_templates.hh b/src/Polyhedron_chdims_templates.hh
new file mode 100644
index 0000000..77692c3
--- /dev/null
+++ b/src/Polyhedron_chdims_templates.hh
@@ -0,0 +1,63 @@
+/* Polyhedron class implementation (non-inline template operators that
+   may change the dimension of the vector space).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_chdims_templates_hh
+#define PPL_Polyhedron_chdims_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Linear_System1, typename Linear_System2>
+void
+Polyhedron::add_space_dimensions(Linear_System1& sys1,
+                                 Linear_System2& sys2,
+                                 Bit_Matrix& sat1,
+                                 Bit_Matrix& sat2,
+                                 dimension_type add_dim) {
+
+  typedef typename Linear_System2::row_type sys2_row_type;
+
+  PPL_ASSERT(sys1.topology() == sys2.topology());
+  PPL_ASSERT(sys1.space_dimension() == sys2.space_dimension());
+  PPL_ASSERT(add_dim != 0);
+
+  sys1.set_space_dimension(sys1.space_dimension() + add_dim);
+  sys2.add_universe_rows_and_space_dimensions(add_dim);
+
+  // The resulting saturation matrix will be as follows:
+  // from row    0    to      add_dim-1       : only zeroes
+  //          add_dim     add_dim+num_rows-1  : old saturation matrix
+
+  // In fact all the old generators saturate all the new constraints
+  // because the polyhedron has not been embedded in the new space.
+  sat1.resize(sat1.num_rows() + add_dim, sat1.num_columns());
+  // The old matrix is moved to the end of the new matrix.
+  for (dimension_type i = sat1.num_rows() - add_dim; i-- > 0; )
+    swap(sat1[i], sat1[i+add_dim]);
+  // Computes the "sat_c", too.
+  sat2.transpose_assign(sat1);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_chdims_templates_hh)
diff --git a/src/Polyhedron_conversion_templates.hh b/src/Polyhedron_conversion_templates.hh
new file mode 100644
index 0000000..91d4772
--- /dev/null
+++ b/src/Polyhedron_conversion_templates.hh
@@ -0,0 +1,925 @@
+/* Polyhedron class implementation: conversion().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_conversion_templates_hh
+#define PPL_Polyhedron_conversion_templates_hh 1
+
+#include "Bit_Row_defs.hh"
+#include "Bit_Matrix_defs.hh"
+#include "Polyhedron_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Temp_defs.hh"
+#include "math_utilities_defs.hh"
+
+#include <cstddef>
+#include <climits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+  \return
+  The number of lines of the polyhedron or the number of equality
+  constraints in the result of conversion.
+
+  \param source
+  The system to use to convert \p dest: it may be modified;
+
+  \param start
+  The index of \p source row from which conversion begin;
+
+  \param dest
+  The result of the conversion;
+
+  \param sat
+  The saturation matrix telling us, for each row in \p source, which
+  are the rows of \p dest that satisfy but do not saturate it;
+
+  \param num_lines_or_equalities
+  The number of rows in the system \p dest that are either lines of
+  the polyhedron (when \p dest is a system of generators) or equality
+  constraints (when \p dest is a system of constraints).
+
+  \if Include_Implementation_Details
+
+  For simplicity, all the following comments assume we are converting a
+  constraint system \p source to a generator system \p dest;
+  the comments for the symmetric case can be obtained by duality.
+
+  If some of the constraints in \p source are redundant, they will be removed.
+  This is why the \p source is not declared to be a constant parameter.
+
+  If \p start is 0, then \p source is a sorted system; also, \p dest is
+  a generator system corresponding to an empty constraint system.
+  If otherwise \p start is greater than 0, then the two sub-systems of
+  \p source made by the non-pending rows and the pending rows, respectively,
+  are both sorted; also, \p dest is the generator system corresponding to
+  the non-pending constraints of \p source.
+
+  Independently from the value of \p start, \p dest has lines from index 0
+  to index \p num_lines_or_equalities - 1 and rays/points from index
+  \p num_lines_or_equalities to the last of its rows.
+
+  Note that here the rows of \p sat are indexed by rows of \p dest
+  and its columns are indexed by rows of \p source.
+
+  We know that polyhedra can be represented by both a system of
+  constraints or a system of generators (points, rays and lines)
+  (see Section \ref representation).
+  When we have both descriptions for a polyhedron \f$P\f$
+  we have what is called a <EM>double description</EM>
+  (or <EM>DD pair</EM>) for \f$P\f$.
+
+  Here, the <EM>representation system</EM> refers to the system \f$C\f$
+  whose rows represent the constraints that characterize \f$P\f$
+  and the <EM>generating system</EM>, the system \f$G\f$ whose rows
+  represent the generators of \f$P\f$.
+  We say that a pair \f$(C, G)\f$ of (real) systems is
+  a <EM>double description pair</EM> if
+  \f[
+    C\vect{x} \geq \vect{0}
+      \quad\iff\quad
+        \exists \vect{\lambda} \geq \vect{0} \mathrel{.}
+        \vect{x} = G\vect{\lambda}.
+  \f]
+
+  The term "double description" is quite natural in the sense that
+  such a pair contains two different description of the same object.
+  In fact, if we refer to the cone representation of a polyhedron \f$P\f$
+  and we call \f$C\f$ and \f$G\f$ the systems of constraints and
+  rays respectively, we have
+  \f[
+    P = \{\, \vect{x} \in \Rset^n \mid C\vect{x} \geq \vect{0}\, \}
+      = \{\, \vect{x} \in \Rset^n \mid \vect{x} = G\vect{\lambda}
+      \text{ for some } \vect{\lambda} \geq \vect{0}\, \}.
+  \f]
+
+  Because of the theorem of Minkowski (see Section \ref prelims),
+  we can say that, given a \f$m \times n\f$ representation system
+  \f$C\f$ such that
+  \f$\mathop{\mathrm{rank}}(C) = n = \mathit{dimension of the whole space}\f$
+  for a non-empty polyhedron \f$P\f$,
+  it is always possible to find a generating system \f$G\f$ for \f$P\f$
+  such that \f$(C, G)\f$ is a DD pair.
+  Conversely, Weyl's theorem ensures that, for each generating system
+  \f$G\f$, it is possible to find a representation system \f$C\f$
+  such that \f$(C, G)\f$ is a DD pair.
+
+  For efficiency reasons, our representation of polyhedra makes use
+  of a double description.
+  We are thus left with two problems:
+    -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair;
+    -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair.
+
+  Using Farkas' Lemma we can prove that these two problems are
+  computationally equivalent (i.e., linear-time reducible to each other).
+  Farkas' Lemma establishes a fundamental property of vectors in
+  \f$\Rset^n\f$ that, in a sense, captures the essence of duality.
+  Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let
+  \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors.
+  Consider also another vector \f$\vect{c} \in \Rset^n\f$ such that,
+  whenever a vector \f$\vect{y} \in \Rset^n\f$ has a non-negative projection
+  on the \f$\vect{a}_i\f$'s, it also has a non-negative projection
+  on \f$\vect{c}\f$.
+  The lemma states that \f$\vect{c}\f$ has this property if and only if
+  it is in the cone generated by the \f$\vect{a}_i\f$'s.
+  Formally, the lemma states the equivalence of the two following
+  assertions:
+    -# \f$
+         \forall \vect{y}
+           \mathrel{:} (A\vect{y} \geq 0 \implies
+           \langle \vect{y},\vect{c} \rangle \geq 0)
+       \f$;
+    -# \f$
+         \exists \vect{\lambda} \geq \vect{0}
+           \mathrel{.} \vect{c}^\mathrm{T} = \vect{\lambda}^\mathrm{T}A
+       \f$.
+
+  With this result we can prove that \f$(C, G)\f$ is a DD pair
+  if and only if \f$(G^\mathrm{T}, C^\mathrm{T})\f$ is a DD pair.
+
+  Suppose \f$(C, G)\f$ is a DD pair.
+  Thus, for each \f$x\f$ of the appropriate dimension,
+  \f$C\vect{x} \geq \vect{0}\f$ if and only if
+  \f$\exists \lambda \geq 0 \mathrel{.} \vect{x} = G\vect{\lambda}\f$,
+  which is of course equivalent to
+  \f$
+    \exists \vect{\lambda} \geq \vect{0}
+      \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+  \f$.
+
+  First, we assume that \f$\vect{z}\f$ is such that
+  \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+  and we will show that
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+  Let \f$\vect{x}\f$ be such that \f$C\vect{x} \geq \vect{0}\f$.
+  Since \f$(C, G)\f$ is a DD pair, this is equivalent to
+  \f$
+    \exists \vect{\lambda} \geq \vect{0}
+      \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+  \f$,
+  which, by Farkas' Lemma is equivalent to
+  \f$
+    \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies
+                                 \langle \vect{y}, \vect{x} \rangle \geq 0)
+  \f$.
+  Taking \f$\vect{y} = \vect{z}\f$ and recalling our assumption that
+  \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+  we can conclude that \f$\langle \vect{z}, \vect{x} \rangle \geq 0\f$,
+  that is equivalent to \f$\langle \vect{x}, \vect{z} \rangle \geq 0\f$.
+  We have thus established that
+  \f$
+    \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies
+    \langle \vect{x}, \vect{z} \rangle \geq 0)
+  \f$.
+  By Farkas' Lemma, this is equivalent to
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$,
+  which is equivalent to what we wanted to prove, that is,
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+
+  In order to prove the reverse implication, the following observation
+  turns out to be useful:
+  when \f$(C, G)\f$ is a DD pair, \f$CG \geq 0\f$.
+  In fact,
+  let \f$\vect{e}_j\f$ be the vector whose components are all \f$0\f$
+  apart from the \f$j\f$-th one, which is \f$1\f$.
+  Clearly \f$\vect{e}_j \geq \vect{0}\f$ and, taking
+  \f$\vect{\lambda} = \vect{e}_j\f$ and
+  \f$\vect{x} = G\vect{\lambda} = G \vect{e}_j\f$, we have
+  \f$C\vect{x} = C(G \vect{e}_j) = (CG)\vect{e}_j \geq \vect{0}\f$,
+  since \f$(C, G)\f$ is a DD pair.
+  Thus, as \f$(CG)\vect{e}_j\f$ is the \f$j\f$-th column of \f$CG\f$
+  and since the choice of \f$j\f$ was arbitrary, \f$CG \geq \vect{0}\f$.
+
+  We now assume that \f$\vect{z}\f$ is such that
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$
+  and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$.
+  By Farkas' Lemma, the assumption
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$,
+  is equivalent to
+  \f$\forall \vect{y} \mathrel{:} (C\vect{y} \geq \vect{0}
+  \implies \langle \vect{y}, \vect{z} \rangle \geq 0)\f$.
+  If we take \f$\vect{y} = G\vect{e}_j\f$ then \f$C\vect{y}
+                 = CG\vect{e}_j \geq 0\f$,
+  since \f$CG \geq \vect{0}\f$.
+  So
+  \f$
+    \langle \vect{y}, \vect{z} \rangle
+      = (\vect{e}_j^\mathrm{T}G^\mathrm{T}) \vect{z}
+      = \vect{e}_j^\mathrm{T}(G^\mathrm{T} \vect{z})
+      \geq 0
+  \f$,
+  that is, the \f$j\f$-th component of \f$G^\mathrm{T}\vect{z}\f$
+  is non-negative. The arbitrary choice of \f$j\f$ allows us to conclude
+  that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$, as required.
+
+  In view of this result, the following exposition assumes, for clarity,
+  that the conversion being performed is from constraints to generators.
+  Thus, even if the roles of \p source and \p dest can be interchanged,
+  in the sequel we assume the \p source system will contain the constraints
+  that represent the polyhedron and the \p dest system will contain
+  the generator that generates it.
+
+  There are some observations that are useful to understand this function:
+
+  Observation 1: Let \f$A\f$ be a system of constraints that generate
+  the polyhedron \f$P\f$ and \f$\vect{c}\f$ a new constraint that must
+  be added. Suppose that there is a line \f$\vect{z}\f$ that does not
+  saturate the constraint \f$\vect{c}\f$. If we combine the old lines
+  and rays that do not saturate \f$\vect{c}\f$ (except \f$\vect{z}\f$)
+  with \f$\vect{z}\f$ such that the new ones saturate \f$\vect{c}\f$,
+  the new lines and rays also saturate the constraints  saturated by
+  the old lines and rays.
+
+  In fact, if \f$\vect{y}_1\f$ is the old generator that does not saturate
+  \f$\vect{c}\f$, \f$\vect{y}_2\f$ is the new one such that
+  \f[
+    \vect{y}_2 = \lambda \vect{y}_1 + \mu \vect{z}
+  \f]
+  and \f$\vect{c}_1\f$ is a previous constraint that \f$\vect{y}_1\f$
+  and \f$\vect{z}\f$ saturates, we can see
+  \f[
+    \langle \vect{c}_1, \vect{y}_2 \rangle
+    = \langle \vect{c}_1, (\lambda \vect{y}_1 + \mu \vect{z}) \rangle
+    = \lambda \langle \vect{c}_1, \vect{y}_1 \rangle
+       + \mu \langle \vect{c}_1, \vect{z} \rangle
+       = 0 + \mu \langle \vect{c}_1, \vect{z} \rangle
+       = \mu \langle \vect{c}_1, \vect{z} \rangle
+  \f]
+  and
+  \f[
+    \mu \langle \vect{c}_1, \vect{z} \rangle = 0.
+  \f]
+
+  Proposition 1: Let \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ be distinct
+  rays of \f$P\f$.
+  Then the following statements are equivalent:
+  a) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are adjacent extreme rays
+     (see Section \ref prelims);
+  b) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are extreme rays and the
+     rank of the system composed by the constraints saturated by both
+     \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is equal to
+     \f$d - 2\f$, where \f$d\f$ is the rank of the system of constraints.
+
+  In fact, let \f$F\f$ be the system of generators that saturate the
+  constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+  If b) holds, the set \f$F\f$ is 2-dimensional and \f$\vect{r}_1\f$ and
+  \f$\vect{r}_2\f$ generate this set. So, every generator
+  \f$\vect{x}\f$ of \f$F\f$ can be built as a combination of
+  \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, i.e.
+  \f[
+    \vect{x} = \lambda \vect{r}_1 + \mu \vect{r}_2.
+  \f]
+  This combination is non-negative because there exists at least a
+  constraint \f$c\f$ saturated by \f$\vect{r}_1\f$ and not
+  \f$\vect{r}_2\f$ (or vice versa) (because they are distinct) for which
+  \f[
+    \langle \vect{c}, \vect{x} \rangle \geq 0
+  \f]
+  and
+  \f[
+    \langle \vect{c}, \vect{x} \rangle
+    = \lambda \langle \vect{c}, \vect{r}_1 \rangle
+                           (or = \mu \langle \vect{c}, \vect{r}_2 \rangle).
+  \f]
+  So, there is no other extreme ray in \f$F\f$ and a) holds.
+  Otherwise, if b) does not hold, the rank of the system generated by
+  the constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+  is equal to \f$d - k\f$, with \p k \>= 3, the set \f$F\f$ is
+  \p k -dimensional and at least \p k extreme rays are necessary
+  to generate \f$F\f$.
+  So, \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent and
+  a) does not hold.
+
+  Proposition 2: When we build the new system of generators starting from
+  a system \f$A\f$ of constraints of \f$P\f$, if \f$\vect{c}\f$ is the
+  constraint to add to \f$A\f$ and all lines of \f$P\f$ saturate
+  \f$\vect{c}\f$, the new set of rays is the union of those rays that
+  saturate, of those that satisfy and of a set \f$\overline Q\f$ of
+  rays such that each of them
+  -# lies on the hyper-plane represented by the k-th constraint,
+  -# is a positive combination of two adjacent rays \f$\vect{r}_1\f$ and
+     \f$\vect{r}_2\f$ such that the first one satisfies the constraint and
+     the other does not satisfy it.
+  If the adjacency property is not taken in account, the new set of
+  rays is not irredundant, in general.
+
+  In fact, if \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent,
+  the rank of the system composed by the constraints saturated by both
+  \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is different from \f$d - 2\f$
+  (see the previous proposition) or neither \f$\vect{r}_1\f$ nor
+  \f$\vect{r}_2\f$ are extreme rays. Since the new ray \f$\vect{r}\f$
+  is a combination of \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$,
+  it saturates the same constraints saturated by both \f$\vect{r}_1\f$ and
+  \f$\vect{r}_2\f$.
+  If the rank is less than \f$d - 2\f$, the rank of
+  the system composed by \f$\vect{c}\f$ (that is saturated by \f$\vect{r}\f$)
+  and by the constraints of \f$A\f$ saturated by \f$\vect{r}\f$  is less
+  than \f$d - 1\f$. It means that \f$r\f$ is redundant (see
+  Section \ref prelims).
+  If neither \f$\vect{r}_1\f$ nor \f$\vect{r}_2\f$ are extreme rays,
+  they belong to a 2-dimensional face containing exactly two extreme rays
+  of \f$P\f$.
+  These two adjacent rays build a ray equal to \f$\vect{r}\f$ and so
+  \f$\vect{r}\f$ is redundant.
+
+  \endif
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+dimension_type
+Polyhedron::conversion(Source_Linear_System& source,
+                       const dimension_type start,
+                       Dest_Linear_System& dest,
+                       Bit_Matrix& sat,
+                       dimension_type num_lines_or_equalities) {
+  typedef typename Dest_Linear_System::row_type dest_row_type;
+  typedef typename Source_Linear_System::row_type source_row_type;
+
+  // Constraints and generators must have the same dimension,
+  // otherwise the scalar products below will bomb.
+  PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+  const dimension_type source_space_dim = source.space_dimension();
+  const dimension_type source_num_rows = source.num_rows();
+  const dimension_type source_num_columns = source_space_dim
+    + (source.is_necessarily_closed() ? 1U : 2U);
+
+
+  dimension_type dest_num_rows = dest.num_rows();
+  // The rows removed from `dest' will be placed in this vector, so they
+  // can be recycled if needed.
+  std::vector<dest_row_type> recyclable_dest_rows;
+
+  using std::swap;
+
+  // By construction, the number of columns of `sat' is the same as
+  // the number of rows of `source'; also, the number of rows of `sat'
+  // is the same as the number of rows of `dest'.
+  PPL_ASSERT(source_num_rows == sat.num_columns());
+  PPL_ASSERT(dest_num_rows == sat.num_rows());
+
+  // If `start > 0', then we are converting the pending constraints.
+  PPL_ASSERT(start == 0 || start == source.first_pending_row());
+
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_o);
+
+  bool dest_sorted = dest.is_sorted();
+  const dimension_type dest_first_pending_row = dest.first_pending_row();
+
+  // This will contain the row indexes of the redundant rows of `source'.
+  std::vector<dimension_type> redundant_source_rows;
+
+  // Converting the sub-system of `source' having rows with indexes
+  // from `start' to the last one (i.e., `source_num_rows' - 1).
+  for (dimension_type k = start; k < source_num_rows; ++k) {
+    const source_row_type& source_k = source[k];
+
+    // `scalar_prod[i]' will contain the scalar product of the
+    // constraint `source_k' and the generator `dest_rows[i]'.  This
+    // product is 0 if and only if the generator saturates the
+    // constraint.
+    PPL_DIRTY_TEMP(std::vector<Coefficient>, scalar_prod);
+    if (dest_num_rows > scalar_prod.size()) {
+      scalar_prod.insert(scalar_prod.end(),
+                         dest_num_rows - scalar_prod.size(),
+                         Coefficient_zero());
+    }
+    // `index_non_zero' will indicate the first generator in `dest_rows'
+    // that does not saturate the constraint `source_k'.
+    dimension_type index_non_zero = 0;
+    for ( ; index_non_zero < dest_num_rows; ++index_non_zero) {
+      WEIGHT_BEGIN();
+      Scalar_Products::assign(scalar_prod[index_non_zero],
+                              source_k,
+                              dest.sys.rows[index_non_zero]);
+      WEIGHT_ADD_MUL(17, source_space_dim);
+      if (scalar_prod[index_non_zero] != 0)
+        // The generator does not saturate the constraint.
+        break;
+      // Check if the client has requested abandoning all expensive
+      // computations.  If so, the exception specified by the client
+      // is thrown now.
+      maybe_abandon();
+    }
+    for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) {
+      WEIGHT_BEGIN();
+      Scalar_Products::assign(scalar_prod[i], source_k, dest.sys.rows[i]);
+      WEIGHT_ADD_MUL(25, source_space_dim);
+      // Check if the client has requested abandoning all expensive
+      // computations.  If so, the exception specified by the client
+      // is thrown now.
+      maybe_abandon();
+    }
+
+    // We first treat the case when `index_non_zero' is less than
+    // `num_lines_or_equalities', i.e., when the generator that
+    // does not saturate the constraint `source_k' is a line.
+    // The other case (described later) is when all the lines
+    // in `dest_rows' (i.e., all the rows having indexes less than
+    // `num_lines_or_equalities') do saturate the constraint.
+
+    if (index_non_zero < num_lines_or_equalities) {
+      // Since the generator `dest_rows[index_non_zero]' does not saturate
+      // the constraint `source_k', it can no longer be a line
+      // (see saturation rule in Section \ref prelims).
+      // Therefore, we first transform it to a ray.
+      dest.sys.rows[index_non_zero].set_is_ray_or_point_or_inequality();
+      // Of the two possible choices, we select the ray satisfying
+      // the constraint (namely, the ray whose scalar product
+      // with the constraint gives a positive result).
+      if (scalar_prod[index_non_zero] < 0) {
+        // The ray `dest_rows[index_non_zero]' lies on the wrong half-space:
+        // we change it to have the opposite direction.
+        neg_assign(scalar_prod[index_non_zero]);
+        neg_assign(dest.sys.rows[index_non_zero].expr);
+        // The modified row may still not be OK(), so don't assert OK here.
+        // They are all checked at the end of this function.
+      }
+      // Having changed a line to a ray, we set `dest_rows' to be a
+      // non-sorted system, we decrement the number of lines of `dest_rows'
+      // and, if necessary, we move the new ray below all the remaining lines.
+      dest_sorted = false;
+      --num_lines_or_equalities;
+      if (index_non_zero != num_lines_or_equalities) {
+        swap(dest.sys.rows[index_non_zero],
+             dest.sys.rows[num_lines_or_equalities]);
+        swap(scalar_prod[index_non_zero],
+             scalar_prod[num_lines_or_equalities]);
+      }
+      const dest_row_type& dest_nle = dest.sys.rows[num_lines_or_equalities];
+
+      // Computing the new lineality space.
+      // Since each line must lie on the hyper-plane corresponding to
+      // the constraint `source_k', the scalar product between
+      // the line and the constraint must be 0.
+      // This property already holds for the lines having indexes
+      // between 0 and `index_non_zero' - 1.
+      // We have to consider the remaining lines, having indexes
+      // between `index_non_zero' and `num_lines_or_equalities' - 1.
+      // Each line that does not saturate the constraint has to be
+      // linearly combined with generator `dest_nle' so that the
+      // resulting new line saturates the constraint.
+      // Note that, by Observation 1 above, the resulting new line
+      // will still saturate all the constraints that were saturated by
+      // the old line.
+
+      Coefficient& scalar_prod_nle = scalar_prod[num_lines_or_equalities];
+      PPL_ASSERT(scalar_prod_nle != 0);
+      for (dimension_type
+             i = index_non_zero; i < num_lines_or_equalities; ++i) {
+        if (scalar_prod[i] != 0) {
+          // The following fragment optimizes the computation of
+          //
+          // <CODE>
+          //   Coefficient scale = scalar_prod[i];
+          //   scale.gcd_assign(scalar_prod_nle);
+          //   Coefficient normalized_sp_i = scalar_prod[i] / scale;
+          //   Coefficient normalized_sp_n = scalar_prod_nle / scale;
+          //   for (dimension_type c = dest_num_columns; c-- > 0; ) {
+          //     dest[i][c] *= normalized_sp_n;
+          //     dest[i][c] -= normalized_sp_i * dest_nle[c];
+          //   }
+          // </CODE>
+          normalize2(scalar_prod[i],
+                     scalar_prod_nle,
+                     normalized_sp_i,
+                     normalized_sp_o);
+          dest_row_type& dest_i = dest.sys.rows[i];
+          neg_assign(normalized_sp_i);
+          dest_i.expr.linear_combine(dest_nle.expr,
+                                     normalized_sp_o, normalized_sp_i);
+          dest_i.strong_normalize();
+          // The modified row may still not be OK(), so don't assert OK here.
+          // They are all checked at the end of this function.
+          scalar_prod[i] = 0;
+          // dest_sorted has already been set to false.
+        }
+      }
+
+      // Computing the new pointed cone.
+      // Similarly to what we have done during the computation of
+      // the lineality space, we consider all the remaining rays
+      // (having indexes strictly greater than `num_lines_or_equalities')
+      // that do not saturate the constraint `source_k'. These rays
+      // are positively combined with the ray `dest_nle' so that the
+      // resulting new rays saturate the constraint.
+      for (dimension_type
+             i = num_lines_or_equalities + 1; i < dest_num_rows; ++i) {
+        if (scalar_prod[i] != 0) {
+          // The following fragment optimizes the computation of
+          //
+          // <CODE>
+          //   Coefficient scale = scalar_prod[i];
+          //   scale.gcd_assign(scalar_prod_nle);
+          //   Coefficient normalized_sp_i = scalar_prod[i] / scale;
+          //   Coefficient normalized_sp_n = scalar_prod_nle / scale;
+          //   for (dimension_type c = dest_num_columns; c-- > 0; ) {
+          //     dest[i][c] *= normalized_sp_n;
+          //     dest[i][c] -= normalized_sp_i * dest_nle[c];
+          //   }
+          // </CODE>
+          normalize2(scalar_prod[i],
+                     scalar_prod_nle,
+                     normalized_sp_i,
+                     normalized_sp_o);
+          dest_row_type& dest_i = dest.sys.rows[i];
+          WEIGHT_BEGIN();
+          neg_assign(normalized_sp_i);
+          dest_i.expr.linear_combine(dest_nle.expr,
+                                     normalized_sp_o, normalized_sp_i);
+          dest_i.strong_normalize();
+          // The modified row may still not be OK(), so don't assert OK here.
+          // They are all checked at the end of this function.
+          scalar_prod[i] = 0;
+          // `dest_sorted' has already been set to false.
+          WEIGHT_ADD_MUL(41, source_space_dim);
+        }
+        // Check if the client has requested abandoning all expensive
+        // computations.  If so, the exception specified by the client
+        // is thrown now.
+        maybe_abandon();
+      }
+      // Since the `scalar_prod_nle' is positive (by construction), it
+      // does not saturate the constraint `source_k'.  Therefore, if
+      // the constraint is an inequality, we set to 1 the
+      // corresponding element of `sat' ...
+      Bit_Row& sat_nle = sat[num_lines_or_equalities];
+      if (source_k.is_ray_or_point_or_inequality())
+        sat_nle.set(k - redundant_source_rows.size());
+      // ... otherwise, the constraint is an equality which is
+      // violated by the generator `dest_nle': the generator has to be
+      // removed from `dest_rows'.
+      else {
+        --dest_num_rows;
+        swap(dest.sys.rows[num_lines_or_equalities],
+             dest.sys.rows[dest_num_rows]);
+        recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+        swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+        dest.sys.rows.pop_back();
+        PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+
+        swap(scalar_prod_nle, scalar_prod[dest_num_rows]);
+        swap(sat_nle, sat[dest_num_rows]);
+        // dest_sorted has already been set to false.
+      }
+    }
+    // Here we have `index_non_zero' >= `num_lines_or_equalities',
+    // so that all the lines in `dest_rows' saturate the constraint `source_k'.
+    else {
+      // First, we reorder the generators in `dest_rows' as follows:
+      // -# all the lines should have indexes between 0 and
+      //    `num_lines_or_equalities' - 1 (this already holds);
+      // -# all the rays that saturate the constraint should have
+      //    indexes between `num_lines_or_equalities' and
+      //    `lines_or_equal_bound' - 1; these rays form the set Q=.
+      // -# all the rays that have a positive scalar product with the
+      //    constraint should have indexes between `lines_or_equal_bound'
+      //    and `sup_bound' - 1; these rays form the set Q+.
+      // -# all the rays that have a negative scalar product with the
+      //    constraint should have indexes between `sup_bound' and
+      //    `dest_num_rows' - 1; these rays form the set Q-.
+      dimension_type lines_or_equal_bound = num_lines_or_equalities;
+      dimension_type inf_bound = dest_num_rows;
+      // While we find saturating generators, we simply increment
+      // `lines_or_equal_bound'.
+      while (inf_bound > lines_or_equal_bound
+             && scalar_prod[lines_or_equal_bound] == 0)
+        ++lines_or_equal_bound;
+      dimension_type sup_bound = lines_or_equal_bound;
+      while (inf_bound > sup_bound) {
+        const int sp_sign = sgn(scalar_prod[sup_bound]);
+        if (sp_sign == 0) {
+          // This generator has to be moved in Q=.
+          swap(dest.sys.rows[sup_bound], dest.sys.rows[lines_or_equal_bound]);
+          swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]);
+          swap(sat[sup_bound], sat[lines_or_equal_bound]);
+          ++lines_or_equal_bound;
+          ++sup_bound;
+          dest_sorted = false;
+        }
+        else if (sp_sign < 0) {
+          // This generator has to be moved in Q-.
+          --inf_bound;
+          swap(dest.sys.rows[sup_bound], dest.sys.rows[inf_bound]);
+          swap(sat[sup_bound], sat[inf_bound]);
+          swap(scalar_prod[sup_bound], scalar_prod[inf_bound]);
+          dest_sorted = false;
+        }
+        else
+          // sp_sign > 0: this generator has to be moved in Q+.
+          ++sup_bound;
+      }
+
+      if (sup_bound == dest_num_rows) {
+        // Here the set Q- is empty.
+        // If the constraint is an inequality, then all the generators
+        // in Q= and Q+ satisfy the constraint. The constraint is redundant
+        // and it can be safely removed from the constraint system.
+        // This is why the `source' parameter is not declared `const'.
+        if (source_k.is_ray_or_point_or_inequality()) {
+          redundant_source_rows.push_back(k);
+        }
+        else {
+          // The constraint is an equality, so that all the generators
+          // in Q+ violate it. Since the set Q- is empty, we can simply
+          // remove from `dest_rows' all the generators of Q+.
+          PPL_ASSERT(dest_num_rows >= lines_or_equal_bound);
+          while (dest_num_rows != lines_or_equal_bound) {
+            recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+            swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+            dest.sys.rows.pop_back();
+            --dest_num_rows;
+          }
+          PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+        }
+      }
+      else {
+        // The set Q- is not empty, i.e., at least one generator
+        // violates the constraint `source_k'.
+        // We have to further distinguish two cases:
+        if (sup_bound == num_lines_or_equalities) {
+          // The set Q+ is empty, so that all generators that satisfy
+          // the constraint also saturate it.
+          // We can simply remove from `dest_rows' all the generators in Q-.
+          PPL_ASSERT(dest_num_rows >= sup_bound);
+          while (dest_num_rows != sup_bound) {
+            recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+            swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+            dest.sys.rows.pop_back();
+            --dest_num_rows;
+          }
+          PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+        }
+        else {
+          // The sets Q+ and Q- are both non-empty.
+          // The generators of the new pointed cone are all those satisfying
+          // the constraint `source_k' plus a set of new rays enjoying
+          // the following properties:
+          // -# they lie on the hyper-plane represented by the constraint
+          // -# they are obtained as a positive combination of two
+          //    adjacent rays, the first taken from Q+ and the second
+          //    taken from Q-.
+
+          // The adjacency property is necessary to have an irredundant
+          // set of new rays (see proposition 2).
+          const dimension_type bound = dest_num_rows;
+
+          // In the following loop,
+          // `i' runs through the generators in the set Q+ and
+          // `j' runs through the generators in the set Q-.
+          for (dimension_type i = lines_or_equal_bound; i < sup_bound; ++i) {
+            for(dimension_type j = sup_bound; j < bound; ++j) {
+              // Checking if generators `dest_rows[i]' and `dest_rows[j]' are
+              // adjacent.
+              // If there exist another generator that saturates
+              // all the constraints saturated by both `dest_rows[i]' and
+              // `dest_rows[j]', then they are NOT adjacent.
+              PPL_ASSERT(sat[i].last() == C_Integer<unsigned long>::max
+                         || sat[i].last() < k);
+              PPL_ASSERT(sat[j].last() == C_Integer<unsigned long>::max
+                         || sat[j].last() < k);
+
+              // Being the union of `sat[i]' and `sat[j]',
+              // `new_satrow' corresponds to a ray that saturates all the
+              // constraints saturated by both `dest_rows[i]' and
+              // `dest_rows[j]'.
+              Bit_Row new_satrow(sat[i], sat[j]);
+
+              // Compute the number of common saturators.
+              // NOTE: this number has to be less than `k' because
+              // we are treating the `k'-th constraint.
+              const dimension_type num_common_satur
+                = k - redundant_source_rows.size() - new_satrow.count_ones();
+
+              // Even before actually creating the new ray as a
+              // positive combination of `dest_rows[i]' and `dest_rows[j]',
+              // we exploit saturation information to check if
+              // it can be an extremal ray. To this end, we refer
+              // to the definition of a minimal proper face
+              // (see comments in Polyhedron_defs.hh):
+              // an extremal ray saturates at least `n' - `t' - 1
+              // constraints, where `n' is the dimension of the space
+              // and `t' is the dimension of the lineality space.
+              // Since `n == source_num_columns - 1' and
+              // `t == num_lines_or_equalities', we obtain that
+              // an extremal ray saturates at least
+              // `source_num_columns - num_lines_or_equalities - 2'
+              // constraints.
+              if (num_common_satur
+                  >= source_num_columns - num_lines_or_equalities - 2) {
+                // The minimal proper face rule is satisfied.
+                // Now we actually check for redundancy by computing
+                // adjacency information.
+                bool redundant = false;
+                WEIGHT_BEGIN();
+                for (dimension_type
+                       l = num_lines_or_equalities; l < bound; ++l)
+                  if (l != i && l != j
+                      && subset_or_equal(sat[l], new_satrow)) {
+                    // Found another generator saturating all the
+                    // constraints saturated by both `dest_rows[i]' and
+                    // `dest_rows[j]'.
+                    redundant = true;
+                    break;
+                  }
+                PPL_ASSERT(bound >= num_lines_or_equalities);
+                WEIGHT_ADD_MUL(15, bound - num_lines_or_equalities);
+                if (!redundant) {
+                  // Adding the new ray to `dest_rows' and the corresponding
+                  // saturation row to `sat'.
+                  dest_row_type new_row;
+                  if (recyclable_dest_rows.empty()) {
+                    sat.add_recycled_row(new_satrow);
+                  }
+                  else {
+                    swap(new_row, recyclable_dest_rows.back());
+                    recyclable_dest_rows.pop_back();
+                    new_row.set_space_dimension_no_ok(source_space_dim);
+                    swap(sat[dest_num_rows], new_satrow);
+                  }
+
+                  // The following fragment optimizes the computation of
+                  //
+                  // <CODE>
+                  //   Coefficient scale = scalar_prod[i];
+                  //   scale.gcd_assign(scalar_prod[j]);
+                  //   Coefficient normalized_sp_i = scalar_prod[i] / scale;
+                  //   Coefficient normalized_sp_j = scalar_prod[j] / scale;
+                  //   for (dimension_type c = dest_num_columns; c-- > 0; ) {
+                  //     new_row[c] = normalized_sp_i * dest[j][c];
+                  //     new_row[c] -= normalized_sp_j * dest[i][c];
+                  //   }
+                  // </CODE>
+                  normalize2(scalar_prod[i],
+                             scalar_prod[j],
+                             normalized_sp_i,
+                             normalized_sp_o);
+                  WEIGHT_BEGIN();
+
+                  neg_assign(normalized_sp_o);
+                  new_row = dest.sys.rows[j];
+                  // TODO: Check if the following assertions hold.
+                  PPL_ASSERT(normalized_sp_i != 0);
+                  PPL_ASSERT(normalized_sp_o != 0);
+                  new_row.expr.linear_combine(dest.sys.rows[i].expr,
+                                              normalized_sp_i, normalized_sp_o);
+
+                  WEIGHT_ADD_MUL(86, source_space_dim);
+                  new_row.strong_normalize();
+                  // Don't assert new_row.OK() here, because it may fail if
+                  // the parameter `dest' contained a row that wasn't ok.
+                  // Since we added a new generator to `dest_rows',
+                  // we also add a new element to `scalar_prod';
+                  // by construction, the new ray lies on the hyper-plane
+                  // represented by the constraint `source_k'.
+                  // Thus, the added scalar product is 0.
+                  PPL_ASSERT(scalar_prod.size() >= dest_num_rows);
+                  if (scalar_prod.size() <= dest_num_rows)
+                    scalar_prod.push_back(Coefficient_zero());
+                  else
+                    scalar_prod[dest_num_rows] = Coefficient_zero();
+
+                  dest.sys.rows.resize(dest.sys.rows.size() + 1);
+                  swap(dest.sys.rows.back(), new_row);
+                  // Increment the number of generators.
+                  ++dest_num_rows;
+                } // if (!redundant)
+              }
+            }
+            // Check if the client has requested abandoning all expensive
+            // computations.  If so, the exception specified by the client
+            // is thrown now.
+            maybe_abandon();
+          }
+          // Now we substitute the rays in Q- (i.e., the rays violating
+          // the constraint) with the newly added rays.
+          dimension_type j;
+          if (source_k.is_ray_or_point_or_inequality()) {
+            // The constraint is an inequality:
+            // the violating generators are those in Q-.
+            j = sup_bound;
+            // For all the generators in Q+, set to 1 the corresponding
+            // entry for the constraint `source_k' in the saturation matrix.
+
+            // After the removal of redundant rows in `source', the k-th
+            // row will have index `new_k'.
+            const dimension_type new_k = k - redundant_source_rows.size();
+            for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l)
+              sat[l].set(new_k);
+          }
+          else
+            // The constraint is an equality:
+            // the violating generators are those in the union of Q+ and Q-.
+            j = lines_or_equal_bound;
+
+          // Swapping the newly added rays
+          // (index `i' running through `dest_num_rows - 1' down-to `bound')
+          // with the generators violating the constraint
+          // (index `j' running through `j' up-to `bound - 1').
+          dimension_type i = dest_num_rows;
+          while (j < bound && i > bound) {
+            --i;
+            swap(dest.sys.rows[i], dest.sys.rows[j]);
+            swap(scalar_prod[i], scalar_prod[j]);
+            swap(sat[i], sat[j]);
+            ++j;
+            dest_sorted = false;
+          }
+          // Setting the number of generators in `dest':
+          // - if the number of generators violating the constraint
+          //   is less than or equal to the number of the newly added
+          //   generators, we assign `i' to `dest_num_rows' because
+          //   all generators above this index are significant;
+          // - otherwise, we assign `j' to `dest_num_rows' because
+          //   all generators below index `j-1' violates the constraint.
+          const dimension_type new_num_rows = (j == bound) ? i : j;
+          PPL_ASSERT(dest_num_rows >= new_num_rows);
+          while (dest_num_rows != new_num_rows) {
+            recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+            swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+            dest.sys.rows.pop_back();
+            --dest_num_rows;
+          }
+          PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+        }
+      }
+    }
+  }
+
+  // We may have identified some redundant constraints in `source',
+  // which have been swapped at the end of the system.
+  if (redundant_source_rows.size() > 0) {
+    source.remove_rows(redundant_source_rows);
+    sat.remove_trailing_columns(redundant_source_rows.size());
+  }
+
+  // If `start == 0', then `source' was sorted and remained so.
+  // If otherwise `start > 0', then the two sub-system made by the
+  // non-pending rows and the pending rows, respectively, were both sorted.
+  // Thus, the overall system is sorted if and only if either
+  // `start == source_num_rows' (i.e., the second sub-system is empty)
+  // or the row ordering holds for the two rows at the boundary between
+  // the two sub-systems.
+  if (start > 0 && start < source.num_rows())
+    source.set_sorted(compare(source[start - 1], source[start]) <= 0);
+  // There are no longer pending constraints in `source'.
+  source.unset_pending_rows();
+
+  // We may have identified some redundant rays in `dest_rows',
+  // which have been swapped into recyclable_dest_rows.
+  if (!recyclable_dest_rows.empty()) {
+    const dimension_type num_removed_rows = recyclable_dest_rows.size();
+    sat.remove_trailing_rows(num_removed_rows);
+  }
+  if (dest_sorted)
+    // If the non-pending generators in `dest' are still declared to be
+    // sorted, then we have to also check for the sortedness of the
+    // pending generators.
+    for (dimension_type i = dest_first_pending_row; i < dest_num_rows; ++i)
+      if (compare(dest.sys.rows[i - 1], dest.sys.rows[i]) > 0) {
+        dest_sorted = false;
+        break;
+      }
+
+#ifndef NDEBUG
+  // The previous code can modify the rows' fields, exploiting the friendness.
+  // Check that all rows are OK now.
+  for (dimension_type i = dest.num_rows(); i-- > 0; )
+    PPL_ASSERT(dest.sys.rows[i].OK());
+#endif
+
+  dest.sys.index_first_pending = dest.num_rows();
+  dest.set_sorted(dest_sorted);
+  PPL_ASSERT(dest.sys.OK());
+
+  return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_conversion_templates_hh)
diff --git a/src/Polyhedron_defs.hh b/src/Polyhedron_defs.hh
new file mode 100644
index 0000000..ecc2bc6
--- /dev/null
+++ b/src/Polyhedron_defs.hh
@@ -0,0 +1,2863 @@
+/* Polyhedron class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_defs_hh
+#define PPL_Polyhedron_defs_hh 1
+
+#include "Polyhedron_types.hh"
+#include "globals_types.hh"
+#include "Variable_defs.hh"
+#include "Variables_Set_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_System_defs.hh"
+#include "Constraint_System_inlines.hh"
+#include "Generator_System_defs.hh"
+#include "Generator_System_inlines.hh"
+#include "Congruence_System_defs.hh"
+#include "Congruence_System_inlines.hh"
+#include "Bit_Matrix_defs.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Poly_Con_Relation_defs.hh"
+#include "Poly_Gen_Relation_defs.hh"
+#include "BHRZ03_Certificate_types.hh"
+#include "H79_Certificate_types.hh"
+#include "Box_types.hh"
+#include "BD_Shape_types.hh"
+#include "Octagonal_Shape_types.hh"
+#include "Interval_types.hh"
+#include "Linear_Form_types.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Polyhedron
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+  <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+  a minimized system of constraints defining \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Polyhedron */
+void swap(Polyhedron& x, Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same polyhedron.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different polyhedra.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns \c true if and only if
+  <code>ph.topology() == NECESSARILY_CLOSED</code>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_necessarily_closed_for_interfaces(const Polyhedron& ph);
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Polyhedron represents a convex polyhedron
+  in the vector space \f$\Rset^n\f$.
+
+  A polyhedron can be specified as either a finite system of constraints
+  or a finite system of generators (see Section \ref representation)
+  and it is always possible to obtain either representation.
+  That is, if we know the system of constraints, we can obtain
+  from this the system of generators that define the same polyhedron
+  and vice versa.
+  These systems can contain redundant members: in this case we say
+  that they are not in the minimal form.
+
+  Two key attributes of any polyhedron are its topological kind
+  (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+  and its space dimension (the dimension \f$n \in \Nset\f$ of
+  the enclosing vector space):
+
+  - all polyhedra, the empty ones included, are endowed with
+    a specific topology and space dimension;
+  - most operations working on a polyhedron and another object
+    (i.e., another polyhedron, a constraint or generator,
+    a set of variables, etc.) will throw an exception if
+    the polyhedron and the object are not both topology-compatible
+    and dimension-compatible (see Section \ref representation);
+  - the topology of a polyhedron cannot be changed;
+    rather, there are constructors for each of the two derived classes
+    that will build a new polyhedron with the topology of that class
+    from another polyhedron from either class and any topology;
+  - the only ways in which the space dimension of a polyhedron can
+    be changed are:
+    - <EM>explicit</EM> calls to operators provided for that purpose;
+    - standard copy, assignment and swap operators.
+
+  Note that four different polyhedra can be defined on
+  the zero-dimension space:
+  the empty polyhedron, either closed or NNC,
+  and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a polyhedron corresponding to
+  a square in \f$\Rset^2\f$, given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from a system of generators specifying
+  the four vertices of the square:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds an unbounded polyhedron
+  corresponding to a half-strip in \f$\Rset^2\f$,
+  given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the system of generators specifying
+  the two vertices of the polyhedron and one ray:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + y));
+  gs.insert(ray(x - y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds the polyhedron corresponding to
+  a half-plane by adding a single constraint
+  to the universe polyhedron in \f$\Rset^2\f$:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(y >= 0);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the empty polyhedron in the space \f$\Rset^2\f$
+  and inserting the appropriate generators
+  (a point, a ray and a line).
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(ray(y));
+  ph.add_generator(line(x));
+  \endcode
+  Note that, although the above polyhedron has no vertices, we must add
+  one point, because otherwise the result of the Minkowski's sum
+  would be an empty polyhedron.
+  To avoid subtle errors related to the minimization process,
+  it is required that the first generator inserted in an empty
+  polyhedron is a point (otherwise, an exception is thrown).
+
+  \par Example 4
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality constraint,
+  thus obtaining the polyhedron corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting polyhedron is
+  \f[
+    \bigl\{\,
+      (2, y)^\transpose \in \Rset^2
+    \bigm|
+      y \in \Rset
+    \,\bigr\}.
+  \f]
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting polyhedron is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(point(0*x + 3*y));
+  ph.add_generator(point(3*x + 0*y));
+  ph.add_generator(point(3*x + 3*y));
+  Linear_Expression expr = x + 4;
+  ph.affine_image(x, expr);
+  \endcode
+  In this example the starting polyhedron is a square in
+  \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+  expression is \f$x+4\f$.  The resulting polyhedron is the same
+  square translated to the right.  Moreover, if the affine
+  transformation for the same variable \p x is \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a diagonal of the square.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y >= 0);
+  ph.add_constraint(y <= 3);
+  Linear_Expression expr = x + 4;
+  ph.affine_preimage(x, expr);
+  \endcode
+  In this example the starting polyhedron, \p var and the affine
+  expression and the denominator are the same as in Example 6,
+  while the resulting polyhedron is again the same square,
+  but translated to the left.
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x+y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+
+  \par Example 8
+  For this example we use also the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Generator_System gs;
+  gs.insert(point(3*x + y + 0*z + 2*w));
+  C_Polyhedron ph(gs);
+  Variables_Set vars;
+  vars.insert(y);
+  vars.insert(z);
+  ph.remove_space_dimensions(vars);
+  \endcode
+  The starting polyhedron is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting polyhedron is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> vars1;
+  vars1.insert(y);
+  ph.remove_space_dimensions(vars1);
+  set<Variable> vars2;
+  vars2.insert(z);
+  ph.remove_space_dimensions(vars2);
+  \endcode
+  In this case, the result is the polyhedron
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p vars2
+  we are actually removing variable \f$w\f$ of the original polyhedron.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
+
+  //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns \c true indicating that this domain has methods that
+    can recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
+protected:
+  //! Builds a polyhedron having the specified properties.
+  /*!
+    \param topol
+    The topology of the polyhedron;
+
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the polyhedron;
+
+    \param kind
+    Specifies whether the universe or the empty polyhedron has to be built.
+  */
+  Polyhedron(Topology topol,
+             dimension_type num_dimensions,
+             Degenerate_Element kind);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Polyhedron(const Polyhedron& y,
+             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, const Constraint_System& cs);
+
+  //! Builds a polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, const Generator_System& gs);
+
+  //! Builds a polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, Generator_System& gs, Recycle_Input dummy);
+
+  //! Builds a polyhedron from a box.
+  /*!
+    This will use an algorithm whose complexity is polynomial and build
+    the smallest polyhedron with topology \p topol containing \p box.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param box
+    The box representing the polyhedron to be built;
+
+    \param complexity
+    This argument is ignored.
+  */
+  template <typename Interval>
+  Polyhedron(Topology topol, const Box<Interval>& box,
+             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Polyhedron& operator=(const Polyhedron& y);
+
+public:
+  //! \name Member Functions that Do Not Modify the Polyhedron
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints.
+  const Constraint_System& constraints() const;
+
+  //! Returns the system of constraints, with no redundant constraint.
+  const Constraint_System& minimized_constraints() const;
+
+  //! Returns the system of generators.
+  const Generator_System& generators() const;
+
+  //! Returns the system of generators, with no redundant generator.
+  const Generator_System& minimized_generators() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a system of (equality) congruences satisfied by \p *this,
+    with no redundant congruences and having the same affine dimension
+    as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty polyhedron.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe polyhedron.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded polyhedron.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Polyhedron& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Polyhedron
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param c
+    The constraint that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  void add_generator(const Generator& g);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to \p *this,
+    if \p cg can be exactly represented by a polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    of if \p cg is a proper congruence which is neither a tautology,
+    nor a contradiction.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+  */
+  void add_generators(const Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this (without minimizing the result).
+
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Generator_System& gs);
+
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
+
+    \param cgs
+    The congruences to be added. Its elements may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine \p *this.
+
+    \param cs
+    Contains the constraints used to refine the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine \p *this.
+
+    \param cgs
+    Contains the congruences used to refine the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Refines \p *this with the constraint expressed by \p left \f$<\f$
+    \p right if \p is_strict is set, with the constraint \p left \f$\leq\f$
+    \p right otherwise.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is on the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is on the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param is_strict
+    True if the comparison is strict.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void refine_with_linear_form_inequality(
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+  bool is_strict = false);
+
+  /*! \brief
+    Refines \p *this with the constraint expressed by \p left \f$\relsym\f$
+    \p right, where \f$\relsym\f$ is the relation symbol specified by
+    \p relsym..
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is on the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is on the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param relsym
+    The relation symbol.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    \exception std::runtime_error
+    Thrown if \p relsym is not a valid relation symbol.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void generalized_refine_with_linear_form_inequality(
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+  Relation_Symbol relsym);
+
+  //! Refines \p store with the constraints defining \p *this.
+  /*!
+    \param store
+    The interval floating point abstract store to refine.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void refine_fp_interval_abstract_store(
+       Box< Interval<FP_Format, Interval_Info> >& store)
+       const;
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void intersection_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_hull_assign(const Polyhedron& y);
+
+  //! Same as poly_hull_assign(y).
+  void upper_bound_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_difference_assign(const Polyhedron& y);
+
+  //! Same as poly_difference_assign(y).
+  void difference_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a polyhedron, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+             + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the polyhedron and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+            \vect{\lambda} \in \Rset^{m_1}_+,
+            \vect{\mu} \in \Rset^{m_2}_+,
+            \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
+
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*!
+    Assigns to \p *this the
+    \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point boundaries that
+    defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var is
+    not a space dimension of \p *this.
+
+    This function is used in abstract interpretation to model an assignment
+    of a value that is correctly overapproximated by \p lf to the
+    floating point variable represented by \p var.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void affine_form_image(Variable var,
+  const Linear_Form<Interval <FP_Format, Interval_Info> >& lf);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering constraints of a polyhedron, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
+
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the polyhedron, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void time_elapse_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this (the best approximation of) the result of
+    computing the
+    \ref Positive_Time_Elapse_Operator "positive time-elapse"
+    between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign(const Polyhedron& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref limited_extrapolation "limited extrapolation"
+    between \p *this and \p y using the \ref BHRZ03_widening
+    "BHRZ03-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref bounded_extrapolation "bounded extrapolation"
+    between \p *this and \p y using the \ref BHRZ03_widening
+    "BHRZ03-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79_widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref limited_extrapolation "limited extrapolation"
+    between \p *this and \p y using the \ref H79_widening
+    "H79-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Polyhedron& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref bounded_extrapolation "bounded extrapolation"
+    between \p *this and \p y using the \ref H79_widening
+    "H79-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Polyhedron& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old polyhedron
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions to the polyhedron
+    and does not embed it in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Polyhedron& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the polyhedron.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Polyhedron();
+
+  /*! \brief
+    Swaps \p *this with polyhedron \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void m_swap(Polyhedron& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+  static const Representation default_con_sys_repr = DENSE;
+  static const Representation default_gen_sys_repr = DENSE;
+
+  //! The system of constraints.
+  Constraint_System con_sys;
+
+  //! The system of generators.
+  Generator_System gen_sys;
+
+  //! The saturation matrix having constraints on its columns.
+  Bit_Matrix sat_c;
+
+  //! The saturation matrix having generators on its columns.
+  Bit_Matrix sat_g;
+
+#define PPL_IN_Polyhedron_CLASS
+#include "Ph_Status_idefs.hh"
+#undef PPL_IN_Polyhedron_CLASS
+
+  //! The status flags to keep track of the polyhedron's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  //! Returns the topological kind of the polyhedron.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the polyhedron
+    is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  friend bool
+  Parma_Polyhedra_Library::Interfaces
+  ::is_necessarily_closed_for_interfaces(const Polyhedron&);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of constraints
+    of \p *this.
+
+    \param c The constraint to be added. If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+  bool constraints_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+  */
+  bool constraints_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+  */
+  bool generators_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if there are pending constraints.
+  bool has_pending_constraints() const;
+
+  //! Returns <CODE>true</CODE> if there are pending generators.
+  bool has_pending_generators() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if there are
+    either pending constraints or pending generators.
+  */
+  bool has_something_pending() const;
+
+  //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+  bool can_have_something_pending() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+    is up-to-date.
+  */
+  bool sat_c_is_up_to_date() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+    is up-to-date.
+  */
+  bool sat_g_is_up_to_date() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is empty,
+    clearing all corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that constraints are up-to-date.
+  void set_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are minimized.
+  void set_constraints_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //! Sets \p status to express that constraints are pending.
+  void set_constraints_pending();
+
+  //! Sets \p status to express that generators are pending.
+  void set_generators_pending();
+
+  //! Sets \p status to express that \p sat_c is up-to-date.
+  void set_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is up-to-date.
+  void set_sat_g_up_to_date();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the polyhedron is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that constraints are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are no longer minimized.
+  void clear_constraints_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //! Sets \p status to express that there are no longer pending constraints.
+  void clear_pending_constraints();
+
+  //! Sets \p status to express that there are no longer pending generators.
+  void clear_pending_generators();
+
+  //! Sets \p status to express that \p sat_c is no longer up-to-date.
+  void clear_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is no longer up-to-date.
+  void clear_sat_g_up_to_date();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name The Handling of Pending Rows
+  //@{
+
+  /*! \brief
+    Processes the pending rows of either description of the polyhedron
+    and obtains a minimized polyhedron.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool process_pending() const;
+
+  //! Processes the pending constraints and obtains a minimized polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some pending constraints.
+  */
+  bool process_pending_constraints() const;
+
+  //! Processes the pending generators and obtains a minimized polyhedron.
+  /*!
+    It is assumed that the polyhedron does have some pending generators.
+  */
+  void process_pending_generators() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a constraint system without pending rows.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  void remove_pending_to_obtain_constraints() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a generator system without pending rows.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool remove_pending_to_obtain_generators() const;
+
+  //@} // The Handling of Pending Rows
+
+  //! \name Updating and Sorting Matrices
+  //@{
+
+  //! Updates constraints starting from generators and minimizes them.
+  /*!
+    The resulting system of constraints is only partially sorted:
+    the equalities are in the upper part of the matrix,
+    while the inequalities in the lower part.
+  */
+  void update_constraints() const;
+
+  //! Updates generators starting from constraints and minimizes them.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    The resulting system of generators is only partially sorted:
+    the lines are in the upper part of the matrix,
+    while rays and points are in the lower part.
+    It is illegal to call this method when the Status field
+    already declares the polyhedron to be empty.
+  */
+  bool update_generators() const;
+
+  //! Updates \p sat_c using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_c to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_c[i][j] = 0,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+        sat\_c[i][j] = 1,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_c() const;
+
+  //! Updates \p sat_g using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_g to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_g[i][j] = 0,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+        sat\_g[i][j] = 1,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_g() const;
+
+  //! Sorts the matrix of constraints keeping status consistency.
+  /*!
+    It is assumed that constraints are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_g is kept consistent with the sorted matrix
+    of constraints.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints() const;
+
+  //! Sorts the matrix of generators keeping status consistency.
+  /*!
+    It is assumed that generators are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_c is kept consistent with the sorted matrix
+    of generators.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators() const;
+
+  //! Sorts the matrix of constraints and updates \p sat_c.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints_with_sat_c() const;
+
+  //! Sorts the matrix of generators and updates \p sat_g.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators_with_sat_g() const;
+
+  //@} // Updating and Sorting Matrices
+
+  //! \name Weak and Strong Minimization of Descriptions
+  //@{
+
+  //! Applies (weak) minimization to both the constraints and generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    Minimization is not attempted if the Status field already declares
+    both systems to be minimized.
+  */
+  bool minimize() const;
+
+  //! Applies strong minimization to the constraints of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_constraints() const;
+
+  //! Applies strong minimization to the generators of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_generators() const;
+
+  //! If constraints are up-to-date, obtain a simplified copy of them.
+  Constraint_System simplified_constraints() const;
+
+  //@} // Weak and Strong Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between polyhedra.
+  Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Polyhedron& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  /*! \brief
+    Copies to \p cs_selection the constraints of \p y corresponding
+    to the definition of the CH78-widening of \p *this and \p y.
+  */
+  void select_CH78_constraints(const Polyhedron& y,
+                               Constraint_System& cs_selection) const;
+
+  /*! \brief
+    Splits the constraints of `x' into two subsets, depending on whether
+    or not they are selected to compute the \ref H79_widening "H79-widening"
+    of \p *this and \p y.
+  */
+  void select_H79_constraints(const Polyhedron& y,
+                              Constraint_System& cs_selected,
+                              Constraint_System& cs_not_selected) const;
+
+  bool BHRZ03_combining_constraints(const Polyhedron& y,
+                                    const BHRZ03_Certificate& y_cert,
+                                    const Polyhedron& H79,
+                                    const Constraint_System& x_minus_H79_cs);
+
+  bool BHRZ03_evolving_points(const Polyhedron& y,
+                              const BHRZ03_Certificate& y_cert,
+                              const Polyhedron& H79);
+
+  bool BHRZ03_evolving_rays(const Polyhedron& y,
+                            const BHRZ03_Certificate& y_cert,
+                            const Polyhedron& H79);
+
+  static void modify_according_to_evolution(Linear_Expression& ray,
+                                            const Linear_Expression& x,
+                                            const Linear_Expression& y);
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given linear systems.
+  /*!
+    \param sys1
+    The linear system to which columns are added;
+
+    \param sys2
+    The linear system to which rows and columns are added;
+
+    \param sat1
+    The saturation matrix whose columns are indexed by the rows of
+    \p sys1. On entry it is up-to-date;
+
+    \param sat2
+    The saturation matrix whose columns are indexed by the rows of \p
+    sys2;
+
+    \param add_dim
+    The number of space dimensions to add.
+
+    Adds new space dimensions to the vector space modifying the linear
+    systems and saturation matrices.
+    This function is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE> and
+    <CODE>add_space_dimensions_and_project()</CODE>, passing the
+    linear system of constraints and that of generators (and the
+    corresponding saturation matrices) in different order (see those
+    methods for details).
+  */
+  template <typename Linear_System1, typename Linear_System2>
+  static void add_space_dimensions(Linear_System1& sys1,
+                                   Linear_System2& sys2,
+                                   Bit_Matrix& sat1,
+                                   Bit_Matrix& sat2,
+                                   dimension_type add_dim);
+
+  //! \name Minimization-Related Static Member Functions
+  //@{
+
+  //! Builds and simplifies constraints from generators (or vice versa).
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  template <typename Source_Linear_System, typename Dest_Linear_System>
+  static bool minimize(bool con_to_gen,
+                       Source_Linear_System& source,
+                       Dest_Linear_System& dest,
+                       Bit_Matrix& sat);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  template <typename Source_Linear_System1, typename Source_Linear_System2,
+            typename Dest_Linear_System>
+  static bool add_and_minimize(bool con_to_gen,
+                               Source_Linear_System1& source1,
+                               Dest_Linear_System& dest,
+                               Bit_Matrix& sat,
+                               const Source_Linear_System2& source2);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa. The given constraints are in \p source.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  template <typename Source_Linear_System, typename Dest_Linear_System>
+  static bool add_and_minimize(bool con_to_gen,
+                               Source_Linear_System& source,
+                               Dest_Linear_System& dest,
+                               Bit_Matrix& sat);
+
+  //! Performs the conversion from constraints to generators and vice versa.
+  // Detailed Doxygen comment to be found in file conversion.cc.
+  template <typename Source_Linear_System, typename Dest_Linear_System>
+  static dimension_type conversion(Source_Linear_System& source,
+                                   dimension_type start,
+                                   Dest_Linear_System& dest,
+                                   Bit_Matrix& sat,
+                                   dimension_type num_lines_or_equalities);
+
+  /*! \brief
+    Uses Gauss' elimination method to simplify the result of
+    <CODE>conversion()</CODE>.
+  */
+  // Detailed Doxygen comment to be found in file simplify.cc.
+  template <typename Linear_System1>
+  static dimension_type simplify(Linear_System1& sys, Bit_Matrix& sat);
+
+  //@} // Minimization-Related Static Member Functions
+
+  /*! \brief
+    Pointer to an array used by simplify().
+
+    Holds (between class initialization and finalization) a pointer to
+    an array, allocated with operator new[](), of
+    simplify_num_saturators_size elements.
+  */
+  static dimension_type* simplify_num_saturators_p;
+
+  /*! \brief
+    Dimension of an array used by simplify().
+
+    Holds (between class initialization and finalization) the size of the
+    array pointed to by simplify_num_saturators_p.
+  */
+  static size_t simplify_num_saturators_size;
+
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+  template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename T> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+  friend class Parma_Polyhedra_Library::H79_Certificate;
+
+protected:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and \c true is returned, otherwise \c false is returned.
+
+    Current implementation is based on (a variant of) Algorithm 8.1 in
+      A. Bemporad, K. Fukuda, and F. D. Torrisi
+      <em>Convexity Recognition of the Union of Polyhedra</em>
+      Technical Report AUT00-13, ETH Zurich, 2000
+
+    \note
+    It is assumed that \p *this and \p y are topologically closed
+    and dimension-compatible;
+    if the assumption does not hold, the behavior is undefined.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool BFT00_poly_hull_assign_if_exact(const Polyhedron& y);
+
+  bool BHZ09_poly_hull_assign_if_exact(const Polyhedron& y);
+  bool BHZ09_C_poly_hull_assign_if_exact(const Polyhedron& y);
+  bool BHZ09_NNC_poly_hull_assign_if_exact(const Polyhedron& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \name Exception Throwers
+  //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+  void throw_invalid_argument(const char* method, const char* reason) const;
+
+  void throw_topology_incompatible(const char* method,
+                                   const char* ph_name,
+                                   const Polyhedron& ph) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* c_name,
+                                   const Constraint& c) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* g_name,
+                                   const Generator& g) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* cs_name,
+                                   const Constraint_System& cs) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* gs_name,
+                                   const Generator_System& gs) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* other_name,
+                                    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* ph_name,
+                                    const Polyhedron& ph) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* c_name,
+                                    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* g_name,
+                                    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cg_name,
+                                    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cs_name,
+                                    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* gs_name,
+                                    const Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cgs_name,
+                                    const Congruence_System& cgs) const;
+  template <typename C>
+  void throw_dimension_incompatible(const char* method,
+                                    const char* lf_name,
+                                    const Linear_Form<C>& lf) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* var_name,
+                                    Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_space_dim) const;
+
+  // Note: the following three methods need to be static, because they
+  // can be called inside constructors (before actually constructing the
+  // polyhedron object).
+  static dimension_type
+  check_space_dimension_overflow(dimension_type dim, dimension_type max,
+                                 const Topology topol,
+                                 const char* method, const char* reason);
+
+  static dimension_type
+  check_space_dimension_overflow(dimension_type dim, const Topology topol,
+                                 const char* method, const char* reason);
+
+  template <typename Object>
+  static Object&
+  check_obj_space_dimension_overflow(Object& input, Topology topol,
+                                     const char* method, const char* reason);
+
+  void throw_invalid_generator(const char* method,
+                               const char* g_name) const;
+
+  void throw_invalid_generators(const char* method,
+                                const char* gs_name) const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p *vars_p.
+
+    \param vars_p
+    When nonzero, points with non-integer coordinates for the
+    variables/space-dimensions contained in \p *vars_p can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set* vars_p,
+                                    Complexity_Class complexity);
+
+  //! Helper function that overapproximates an interval linear form.
+  /*!
+    \param lf
+    The linear form on intervals with floating point boundaries to approximate.
+    ALL of its coefficients MUST be bounded.
+
+    \param lf_dimension
+    Must be the space dimension of \p lf.
+
+    \param result
+    Used to store the result.
+
+    This function makes \p result become a linear form that is a correct
+    approximation of \p lf under the constraints specified by \p *this.
+    The resulting linear form has the property that all of its variable
+    coefficients have a non-significant upper bound and can thus be
+    considered as singletons.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void overapproximate_linear_form(
+  const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+  const dimension_type lf_dimension,
+  Linear_Form<Interval <FP_Format, Interval_Info> >& result);
+
+  /*! \brief
+    Helper function that makes \p result become a Linear_Expression obtained
+    by normalizing the denominators in \p lf.
+
+    \param lf
+    The linear form on intervals with floating point boundaries to normalize.
+    It should be the result of an application of static method
+    <CODE>overapproximate_linear_form</CODE>.
+
+    \param lf_dimension
+    Must be the space dimension of \p lf.
+
+    \param result
+    Used to store the result.
+
+    This function ignores the upper bound of intervals in \p lf,
+    so that in fact \p result can be seen as \p lf multiplied by a proper
+    normalization constant.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  static void convert_to_integer_expression(
+              const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+              const dimension_type lf_dimension,
+              Linear_Expression& result);
+
+  //! Normalization helper function.
+  /*!
+    \param lf
+    The linear form on intervals with floating point boundaries to normalize.
+    It should be the result of an application of static method
+    <CODE>overapproximate_linear_form</CODE>.
+
+    \param lf_dimension
+    Must be the space dimension of \p lf.
+
+    \param res
+    Stores the normalized linear form, except its inhomogeneous term.
+
+    \param res_low_coeff
+    Stores the lower boundary of the inhomogeneous term of the result.
+
+    \param res_hi_coeff
+    Stores the higher boundary of the inhomogeneous term of the result.
+
+    \param denominator
+    Becomes the common denominator of \p res_low_coeff, \p res_hi_coeff
+    and all coefficients in \p res.
+
+    Results are obtained by normalizing denominators in \p lf, ignoring
+    the upper bounds of variable coefficients in \p lf.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  static void
+  convert_to_integer_expressions(const Linear_Form<Interval<FP_Format,
+                                                            Interval_Info> >&
+                                 lf,
+                                 const dimension_type lf_dimension,
+                                 Linear_Expression& res,
+                                 Coefficient& res_low_coeff,
+                                 Coefficient& res_hi_coeff,
+                                 Coefficient& denominator);
+
+  template <typename Linear_System1, typename Row2>
+  static bool
+  add_to_system_and_check_independence(Linear_System1& eq_sys,
+                                       const Row2& eq);
+
+  /*! \brief
+    Assuming \p *this is NNC, assigns to \p *this the result of the
+    "positive time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign_impl(const Polyhedron& y);
+};
+
+#include "Ph_Status_inlines.hh"
+#include "Polyhedron_inlines.hh"
+#include "Polyhedron_templates.hh"
+#include "Polyhedron_chdims_templates.hh"
+#include "Polyhedron_conversion_templates.hh"
+#include "Polyhedron_minimize_templates.hh"
+#include "Polyhedron_simplify_templates.hh"
+
+#endif // !defined(PPL_Polyhedron_defs_hh)
diff --git a/src/Polyhedron_inlines.hh b/src/Polyhedron_inlines.hh
new file mode 100644
index 0000000..f543e9c
--- /dev/null
+++ b/src/Polyhedron_inlines.hh
@@ -0,0 +1,459 @@
+/* Polyhedron class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_inlines_hh
+#define PPL_Polyhedron_inlines_hh 1
+
+#include "Generator_defs.hh"
+#include "compiler.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Polyhedron::space_dimension() const {
+  return space_dim;
+}
+
+inline int32_t
+Polyhedron::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+inline dimension_type
+Polyhedron::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+             min(Constraint_System::max_space_dimension(),
+                 Generator_System::max_space_dimension()
+                 )
+             );
+}
+
+inline Topology
+Polyhedron::topology() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.topology();
+}
+
+inline bool
+Polyhedron::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+inline bool
+Polyhedron::is_necessarily_closed() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.is_necessarily_closed();
+}
+
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+  poly_hull_assign(y);
+}
+
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+  poly_difference_assign(y);
+}
+
+inline void
+Polyhedron::widening_assign(const Polyhedron& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
+
+inline
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::m_swap(Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("swap(y)", "y", y);
+  using std::swap;
+  swap(con_sys, y.con_sys);
+  swap(gen_sys, y.gen_sys);
+  swap(sat_c, y.sat_c);
+  swap(sat_g, y.sat_g);
+  swap(status, y.status);
+  swap(space_dim, y.space_dim);
+}
+
+/*! \relates Polyhedron */
+inline void
+swap(Polyhedron& x, Polyhedron& y) {
+  x.m_swap(y);
+}
+
+inline bool
+Polyhedron::can_recycle_constraint_systems() {
+  return true;
+}
+
+inline bool
+Polyhedron::can_recycle_congruence_systems() {
+  return false;
+}
+
+inline bool
+Polyhedron::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Polyhedron::constraints_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Polyhedron::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+  return status.test_sat_c_up_to_date();
+}
+
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+  return status.test_sat_g_up_to_date();
+}
+
+inline bool
+Polyhedron::has_pending_constraints() const {
+  return status.test_c_pending();
+}
+
+inline bool
+Polyhedron::has_pending_generators() const {
+  return status.test_g_pending();
+}
+
+inline bool
+Polyhedron::has_something_pending() const {
+  return status.test_c_pending() || status.test_g_pending();
+}
+
+inline bool
+Polyhedron::can_have_something_pending() const {
+  return constraints_are_minimized()
+    && generators_are_minimized()
+    && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
+
+inline bool
+Polyhedron::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date and
+  // there are no pending constraints, then the generator system
+  // (since it is well formed) contains a point.
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    return false;
+  return !minimize();
+}
+
+inline void
+Polyhedron::set_constraints_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Polyhedron::set_constraints_minimized() {
+  set_constraints_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Polyhedron::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Polyhedron::set_constraints_pending() {
+  status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+  status.set_g_pending();
+}
+
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+  status.set_sat_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+  status.set_sat_g_up_to_date();
+}
+
+inline void
+Polyhedron::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Polyhedron::clear_constraints_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Polyhedron::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Polyhedron::clear_pending_constraints() {
+  status.reset_c_pending();
+}
+
+inline void
+Polyhedron::clear_pending_generators() {
+  status.reset_g_pending();
+}
+
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+  status.reset_sat_c_up_to_date();
+  // Can get rid of sat_c here.
+}
+
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+  status.reset_sat_g_up_to_date();
+  // Can get rid of sat_g here.
+}
+
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+  clear_pending_constraints();
+  clear_constraints_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Polyhedron::clear_generators_up_to_date() {
+  clear_pending_generators();
+  clear_generators_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline bool
+Polyhedron::process_pending() const {
+  PPL_ASSERT(space_dim > 0 && !marked_empty());
+  PPL_ASSERT(has_something_pending());
+
+  if (has_pending_constraints())
+    return process_pending_constraints();
+
+  PPL_ASSERT(has_pending_generators());
+  process_pending_generators();
+  return true;
+}
+
+inline bool
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+                     Coefficient& sup_n, Coefficient& sup_d,
+                     bool& maximum) const {
+  Generator g(point());
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+                     Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+                     Coefficient& inf_n, Coefficient& inf_d,
+                     bool& minimum) const {
+  Generator g(point());
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+                     Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline Constraint_System
+Polyhedron::simplified_constraints() const {
+  PPL_ASSERT(constraints_are_up_to_date());
+  Constraint_System cs(con_sys);
+  if (cs.num_pending_rows() > 0)
+    cs.unset_pending_rows();
+  if (has_pending_constraints() || !constraints_are_minimized())
+    cs.simplify();
+  return cs;
+}
+
+inline Congruence_System
+Polyhedron::congruences() const {
+  return Congruence_System(minimized_constraints());
+}
+
+inline Congruence_System
+Polyhedron::minimized_congruences() const {
+  return Congruence_System(minimized_constraints());
+}
+
+inline void
+Polyhedron::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::generalized_refine_with_linear_form_inequality(
+            const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+            const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+            const Relation_Symbol relsym) {
+  switch (relsym) {
+  case EQUAL:
+    // TODO: see if we can handle this case more efficiently.
+    refine_with_linear_form_inequality(left, right, false);
+    refine_with_linear_form_inequality(right, left, false);
+    break;
+  case LESS_THAN:
+    refine_with_linear_form_inequality(left, right, true);
+    break;
+  case LESS_OR_EQUAL:
+    refine_with_linear_form_inequality(left, right, false);
+    break;
+  case GREATER_THAN:
+    refine_with_linear_form_inequality(right, left, true);
+    break;
+  case GREATER_OR_EQUAL:
+    refine_with_linear_form_inequality(right, left, false);
+    break;
+  case NOT_EQUAL:
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::
+refine_fp_interval_abstract_store(
+       Box< Interval<FP_Format, Interval_Info> >& store) const {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                     "Polyhedron::refine_fp_interval_abstract_store:"
+                     " T not a floating point type.");
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+  return !(x == y);
+}
+
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(Complexity_Class complexity) {
+  const Variables_Set* const p_vs = 0;
+  drop_some_non_integer_points(p_vs, complexity);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(const Variables_Set& vars,
+                                         Complexity_Class complexity) {
+  drop_some_non_integer_points(&vars, complexity);
+}
+
+
+namespace Interfaces {
+
+inline bool
+is_necessarily_closed_for_interfaces(const Polyhedron& ph) {
+  return ph.is_necessarily_closed();
+}
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_inlines_hh)
diff --git a/src/Polyhedron_minimize_templates.hh b/src/Polyhedron_minimize_templates.hh
new file mode 100644
index 0000000..7a268f8
--- /dev/null
+++ b/src/Polyhedron_minimize_templates.hh
@@ -0,0 +1,437 @@
+/* Polyhedron class implementation: minimize() and add_and_minimize().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_minimize_templates_hh
+#define PPL_Polyhedron_minimize_templates_hh 1
+
+#include "Bit_Matrix_defs.hh"
+#include "Polyhedron_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+  \return
+  <CODE>true</CODE> if the polyhedron is empty, <CODE>false</CODE>
+  otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source represents the constraints,
+  <CODE>false</CODE> otherwise;
+
+  \param source
+  The given system, which is not empty;
+
+  \param dest
+  The system to build and minimize;
+
+  \param sat
+  The saturation matrix.
+
+  \p dest is not <CODE>const</CODE> because it will be built (and then
+  modified) during minimize(). Also, \p sat and \p source are
+  not <CODE>const</CODE> because the former will be built during
+  \p dest creation and the latter will maybe be sorted and modified by
+  <CODE>conversion()</CODE> and <CODE>simplify()</CODE>.
+
+  \p sat has the generators on its columns and the constraints on its rows
+  if \p con_to_gen is <CODE>true</CODE>, otherwise it has the generators on
+  its rows and the constraints on its columns.
+
+  Given \p source, this function builds (by means of
+  <CODE>conversion()</CODE>) \p dest and then simplifies (invoking
+  <CODE>simplify()</CODE>) \p source, erasing redundant rows.
+  For the sequel we assume that \p source is the system of constraints
+  and \p dest is the system of generators.
+  This will simplify the description of the function; the dual case is
+  similar.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::minimize(const bool con_to_gen,
+                     Source_Linear_System& source,
+                     Dest_Linear_System& dest,
+                     Bit_Matrix& sat) {
+
+  typedef typename Dest_Linear_System::row_type dest_row_type;
+
+  // Topologies have to agree.
+  PPL_ASSERT(source.topology() == dest.topology());
+  // `source' cannot be empty: even if it is an empty constraint system,
+  // representing the universe polyhedron, homogenization has added
+  // the positive constraint. It also cannot be an empty generator system,
+  // since this function is always called starting from a non-empty
+  // polyhedron.
+  PPL_ASSERT(!source.has_no_rows());
+
+  // Sort the source system, if necessary.
+  if (!source.is_sorted())
+    source.sort_rows();
+
+  // Initialization of the system of generators `dest'.
+  // The algorithm works incrementally and we haven't seen any
+  // constraint yet: as a consequence, `dest' should describe
+  // the universe polyhedron of the appropriate dimension.
+  // To this end, we initialize it to the identity matrix of dimension
+  // `source.num_columns()': the rows represent the lines corresponding
+  // to the canonical basis of the vector space.
+  dimension_type dest_num_rows
+    = source.topology() == NECESSARILY_CLOSED ? source.space_dimension() + 1
+                                              : source.space_dimension() + 2;
+
+  dest.clear();
+  dest.set_space_dimension(source.space_dimension());
+
+  // Initialize `dest' to the identity matrix.
+  for (dimension_type i = 0; i < dest_num_rows; ++i) {
+    Linear_Expression expr;
+    expr.set_space_dimension(dest_num_rows - 1);
+    if (i == 0)
+      expr += 1;
+    else
+      expr += Variable(i - 1);
+    dest_row_type dest_i(expr, dest_row_type::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+    if (dest.topology() == NOT_NECESSARILY_CLOSED)
+      dest_i.mark_as_not_necessarily_closed();
+    dest.sys.insert_no_ok(dest_i, Recycle_Input());
+  }
+  // The identity matrix `dest' is not sorted (see the sorting rules
+  // in Constrant.cc and Generator.cc).
+  dest.set_sorted(false);
+
+  // NOTE: the system `dest', as it is now, is not a _legal_ system of
+  //       generators, because in the first row we have a line with a
+  //       non-zero divisor (which should only happen for
+  //       points). However, this is NOT a problem, because `source'
+  //       necessarily contains the positivity constraint (or a
+  //       combination of it with another constraint) which will
+  //       restore things as they should be.
+
+
+  // Building a saturation matrix and initializing it by setting
+  // all of its elements to zero. This matrix will be modified together
+  // with `dest' during the conversion.
+  // NOTE: since we haven't seen any constraint yet, the relevant
+  //       portion of `tmp_sat' is the sub-matrix consisting of
+  //       the first 0 columns: thus the relevant portion correctly
+  //       characterizes the initial saturation information.
+  Bit_Matrix tmp_sat(dest_num_rows, source.num_rows());
+
+  // By invoking the function conversion(), we populate `dest' with
+  // the generators characterizing the polyhedron described by all
+  // the constraints in `source'.
+  // The `start' parameter is zero (we haven't seen any constraint yet)
+  // and the 5th parameter (representing the number of lines in `dest'),
+  // by construction, is equal to `dest_num_rows'.
+  const dimension_type num_lines_or_equalities
+    = conversion(source, 0U, dest, tmp_sat, dest_num_rows);
+  // conversion() may have modified the number of rows in `dest'.
+  dest_num_rows = dest.num_rows();
+
+#ifndef NDEBUG
+  for (dimension_type i = dest.num_rows(); i-- > 0; )
+    PPL_ASSERT(dest[i].OK());
+#endif
+
+  // Checking if the generators in `dest' represent an empty polyhedron:
+  // the polyhedron is empty if there are no points
+  // (because rays, lines and closure points need a supporting point).
+  // Points can be detected by looking at:
+  // - the divisor, for necessarily closed polyhedra;
+  // - the epsilon coordinate, for NNC polyhedra.
+  dimension_type first_point;
+  if (dest.is_necessarily_closed()) {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.inhomogeneous_term() > 0)
+        break;
+  }
+  else {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+        break;
+  }
+
+  if (first_point == dest_num_rows)
+    if (con_to_gen)
+      // No point has been found: the polyhedron is empty.
+      return true;
+    else {
+      // Here `con_to_gen' is false: `dest' is a system of constraints.
+      // In this case the condition `first_point == dest_num_rows'
+      // actually means that all the constraints in `dest' have their
+      // inhomogeneous term equal to 0.
+      // This is an ILLEGAL situation, because it implies that
+      // the constraint system `dest' lacks the positivity constraint
+      // and no linear combination of the constraints in `dest'
+      // can reintroduce the positivity constraint.
+      PPL_UNREACHABLE;
+      return false;
+    }
+  else {
+    // A point has been found: the polyhedron is not empty.
+    // Now invoking simplify() to remove all the redundant constraints
+    // from the system `source'.
+    // Since the saturation matrix `tmp_sat' returned by conversion()
+    // has rows indexed by generators (the rows of `dest') and columns
+    // indexed by constraints (the rows of `source'), we have to
+    // transpose it to obtain the saturation matrix needed by simplify().
+    sat.transpose_assign(tmp_sat);
+    simplify(source, sat);
+    return false;
+  }
+}
+
+
+/*!
+  \return
+  <CODE>true</CODE> if the obtained polyhedron is empty,
+  <CODE>false</CODE> otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source1 and \p source2 are system of
+  constraints, <CODE>false</CODE> otherwise;
+
+  \param source1
+  The first element of the given DD pair;
+
+  \param dest
+  The second element of the given DD pair;
+
+  \param sat
+  The saturation matrix that bind \p source1 to \p dest;
+
+  \param source2
+  The new system of generators or constraints.
+
+  It is assumed that \p source1 and \p source2 are sorted and have
+  no pending rows. It is also assumed that \p dest has no pending rows.
+  On entry, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of \p source1.
+  On exit, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of the system obtained
+  by merging \p source1 and \p source2.
+
+  Let us suppose we want to add some constraints to a given system of
+  constraints \p source1. This method, given a minimized double description
+  pair (\p source1, \p dest) and a system of new constraints \p source2,
+  modifies \p source1 by adding to it the constraints of \p source2 that
+  are not in \p source1. Then, by invoking
+  <CODE>add_and_minimize(bool, Linear_System_Class&, Linear_System_Class&, Bit_Matrix&)</CODE>,
+  processes the added constraints obtaining a new DD pair.
+
+  This method treats also the dual case, i.e., adding new generators to
+  a previous system of generators. In this case \p source1 contains the
+  old generators, \p source2 the new ones and \p dest is the system
+  of constraints in the given minimized DD pair.
+
+  Since \p source2 contains the constraints (or the generators) that
+  will be added to \p source1, it is constant: it will not be modified.
+*/
+template <typename Source_Linear_System1, typename Source_Linear_System2,
+          typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+                             Source_Linear_System1& source1,
+                             Dest_Linear_System& dest,
+                             Bit_Matrix& sat,
+                             const Source_Linear_System2& source2) {
+  // `source1' and `source2' cannot be empty.
+  PPL_ASSERT(!source1.has_no_rows() && !source2.has_no_rows());
+  // `source1' and `source2' must have the same number of columns
+  // to be merged.
+  PPL_ASSERT(source1.num_columns() == source2.num_columns());
+  // `source1' and `source2' are fully sorted.
+  PPL_ASSERT(source1.is_sorted() && source1.num_pending_rows() == 0);
+  PPL_ASSERT(source2.is_sorted() && source2.num_pending_rows() == 0);
+  PPL_ASSERT(dest.num_pending_rows() == 0);
+
+  const dimension_type old_source1_num_rows = source1.num_rows();
+  // `k1' and `k2' run through the rows of `source1' and `source2', resp.
+  dimension_type k1 = 0;
+  dimension_type k2 = 0;
+  dimension_type source2_num_rows = source2.num_rows();
+  while (k1 < old_source1_num_rows && k2 < source2_num_rows) {
+    // Add to `source1' the constraints from `source2', as pending rows.
+    // We exploit the property that initially both `source1' and `source2'
+    // are sorted and index `k1' only scans the non-pending rows of `source1',
+    // so that it is not influenced by the pending rows appended to it.
+    // This way no duplicate (i.e., trivially redundant) constraint
+    // is introduced in `source1'.
+    const int cmp = compare(source1[k1], source2[k2]);
+    if (cmp == 0) {
+      // We found the same row: there is no need to add `source2[k2]'.
+      ++k2;
+      // By sortedness, since `k1 < old_source1_num_rows',
+      // we can increment index `k1' too.
+      ++k1;
+    }
+    else if (cmp < 0)
+      // By sortedness, we can increment `k1'.
+      ++k1;
+    else {
+      // Here `cmp > 0'.
+      // By sortedness, `source2[k2]' cannot be in `source1'.
+      // We add it as a pending row of `source1' (sortedness unaffected).
+      source1.add_pending_row(source2[k2]);
+      // We can increment `k2'.
+      ++k2;
+    }
+  }
+  // Have we scanned all the rows in `source2'?
+  if (k2 < source2_num_rows)
+    // By sortedness, all the rows in `source2' having indexes
+    // greater than or equal to `k2' were not in `source1'.
+    // We add them as pending rows of 'source1' (sortedness not affected).
+    for ( ; k2 < source2_num_rows; ++k2)
+      source1.add_pending_row(source2[k2]);
+
+  if (source1.num_pending_rows() == 0)
+    // No row was appended to `source1', because all the constraints
+    // in `source2' were already in `source1'.
+    // There is nothing left to do ...
+    return false;
+
+  return add_and_minimize(con_to_gen, source1, dest, sat);
+}
+
+/*!
+  \return
+  <CODE>true</CODE> if the obtained polyhedron is empty,
+  <CODE>false</CODE> otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source is a system of constraints,
+  <CODE>false</CODE> otherwise;
+
+  \param source
+  The first element of the given DD pair. It also contains the pending
+  rows to be processed;
+
+  \param dest
+  The second element of the given DD pair. It cannot have pending rows;
+
+  \param sat
+  The saturation matrix that bind the upper part of \p source to \p dest.
+
+  On entry, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the non-pending rows of \p source.
+  On exit, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of \p source.
+
+  Let us suppose that \p source is a system of constraints.
+  This method assumes that the non-pending part of \p source and
+  system \p dest form a double description pair in minimal form and
+  will build a new DD pair in minimal form by processing the pending
+  constraints in \p source. To this end, it will call
+  <CODE>conversion()</CODE>) and <CODE>simplify</CODE>.
+
+  This method treats also the dual case, i.e., processing pending
+  generators. In this case \p source contains generators and \p dest
+  is the system of constraints corresponding to the non-pending part
+  of \p source.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+                             Source_Linear_System& source,
+                             Dest_Linear_System& dest,
+                             Bit_Matrix& sat) {
+  PPL_ASSERT(source.num_pending_rows() > 0);
+  PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+  PPL_ASSERT(source.is_sorted());
+
+  // First, pad the saturation matrix with new columns (of zeroes)
+  // to accommodate for the pending rows of `source'.
+  sat.resize(dest.num_rows(), source.num_rows());
+
+  // Incrementally compute the new system of generators.
+  // Parameter `start' is set to the index of the first pending constraint.
+  const dimension_type num_lines_or_equalities
+    = conversion(source, source.first_pending_row(),
+                 dest, sat,
+                 dest.num_lines_or_equalities());
+
+  // conversion() may have modified the number of rows in `dest'.
+  const dimension_type dest_num_rows = dest.num_rows();
+
+  // Checking if the generators in `dest' represent an empty polyhedron:
+  // the polyhedron is empty if there are no points
+  // (because rays, lines and closure points need a supporting point).
+  // Points can be detected by looking at:
+  // - the divisor, for necessarily closed polyhedra;
+  // - the epsilon coordinate, for NNC polyhedra.
+  dimension_type first_point;
+  if (dest.is_necessarily_closed()) {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.inhomogeneous_term() > 0)
+        break;
+  }
+  else {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+        break;
+  }
+
+  if (first_point == dest_num_rows)
+    if (con_to_gen)
+      // No point has been found: the polyhedron is empty.
+      return true;
+    else {
+      // Here `con_to_gen' is false: `dest' is a system of constraints.
+      // In this case the condition `first_point == dest_num_rows'
+      // actually means that all the constraints in `dest' have their
+      // inhomogeneous term equal to 0.
+      // This is an ILLEGAL situation, because it implies that
+      // the constraint system `dest' lacks the positivity constraint
+      // and no linear combination of the constraints in `dest'
+      // can reintroduce the positivity constraint.
+      PPL_UNREACHABLE;
+      return false;
+    }
+  else {
+    // A point has been found: the polyhedron is not empty.
+    // Now invoking `simplify()' to remove all the redundant constraints
+    // from the system `source'.
+    // Since the saturation matrix `sat' returned by `conversion()'
+    // has rows indexed by generators (the rows of `dest') and columns
+    // indexed by constraints (the rows of `source'), we have to
+    // transpose it to obtain the saturation matrix needed by `simplify()'.
+    sat.transpose();
+    simplify(source, sat);
+    // Transposing back.
+    sat.transpose();
+    return false;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_minimize_templates_hh)
diff --git a/src/Polyhedron_nonpublic.cc b/src/Polyhedron_nonpublic.cc
new file mode 100644
index 0000000..8d455cb
--- /dev/null
+++ b/src/Polyhedron_nonpublic.cc
@@ -0,0 +1,2597 @@
+/* Polyhedron class implementation
+   (non-inline private or protected functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Linear_Form_defs.hh"
+#include "C_Integer.hh"
+#include "assert.hh"
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_defines
+  \brief
+  Controls the laziness level of the implementation.
+
+  Temporarily used in a few of the function implementations to
+  switch to an even more lazy algorithm. To be removed as soon as
+  we collect enough information to decide which is the better
+  implementation alternative.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+                            const dimension_type num_dimensions,
+                            const Degenerate_Element kind)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(num_dimensions <= max_space_dimension());
+
+  if (kind == EMPTY)
+    status.set_empty();
+  else if (num_dimensions > 0) {
+    con_sys.add_low_level_constraints();
+    con_sys.adjust_topology_and_space_dimension(topol, num_dimensions);
+    set_constraints_minimized();
+  }
+  space_dim = num_dimensions;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Polyhedron& y, Complexity_Class)
+  : con_sys(y.topology(), default_con_sys_repr),
+    gen_sys(y.topology(), default_gen_sys_repr),
+    status(y.status),
+    space_dim(y.space_dim) {
+  // Being a protected method, we simply assert that topologies do match.
+  PPL_ASSERT(topology() == y.topology());
+  if (y.constraints_are_up_to_date())
+    con_sys.assign_with_pending(y.con_sys);
+  if (y.generators_are_up_to_date())
+    gen_sys.assign_with_pending(y.gen_sys);
+  if (y.sat_c_is_up_to_date())
+    sat_c = y.sat_c;
+  if (y.sat_g_is_up_to_date())
+    sat_g = y.sat_g;
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Constraint_System& cs)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(cs.space_dimension() <= max_space_dimension());
+
+  // TODO: this implementation is just an executable specification.
+  Constraint_System cs_copy = cs;
+
+  // Try to adapt `cs_copy' to the required topology.
+  const dimension_type cs_copy_space_dim = cs_copy.space_dimension();
+  if (!cs_copy.adjust_topology_and_space_dimension(topol, cs_copy_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+                                ? "C_Polyhedron(cs)"
+                                : "NNC_Polyhedron(cs)", "cs", cs_copy);
+
+  // Set the space dimension.
+  space_dim = cs_copy_space_dim;
+
+  if (space_dim > 0) {
+    // Stealing the rows from `cs_copy'.
+    using std::swap;
+    swap(con_sys, cs_copy);
+    if (con_sys.num_pending_rows() > 0) {
+      // Even though `cs_copy' has pending constraints, since the
+      // generators of the polyhedron are not up-to-date, the
+      // polyhedron cannot have pending constraints. By integrating
+      // the pending part of `con_sys' we may loose sortedness.
+      con_sys.set_sorted(false);
+      con_sys.unset_pending_rows();
+    }
+    con_sys.add_low_level_constraints();
+    set_constraints_up_to_date();
+  }
+  else {
+    // Here `space_dim == 0'.
+    // See if an inconsistent constraint has been passed.
+    for (dimension_type i = cs_copy.num_rows(); i-- > 0; )
+      if (cs_copy[i].is_inconsistent()) {
+        // Inconsistent constraint found: the polyhedron is empty.
+        set_empty();
+        break;
+      }
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+                            Constraint_System& cs,
+                            Recycle_Input)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(cs.space_dimension() <= max_space_dimension());
+
+  // Try to adapt `cs' to the required topology.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (!cs.adjust_topology_and_space_dimension(topol, cs_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+                                ? "C_Polyhedron(cs, recycle)"
+                                : "NNC_Polyhedron(cs, recycle)", "cs", cs);
+
+  // Set the space dimension.
+  space_dim = cs_space_dim;
+
+  if (space_dim > 0) {
+    // Stealing the rows from `cs'.
+    swap(con_sys, cs);
+    if (con_sys.num_pending_rows() > 0) {
+      // Even though `cs' has pending constraints, since the generators
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending constraints. By integrating the pending part
+      // of `con_sys' we may loose sortedness.
+      con_sys.unset_pending_rows();
+      con_sys.set_sorted(false);
+    }
+    con_sys.add_low_level_constraints();
+    set_constraints_up_to_date();
+  }
+  else {
+    // Here `space_dim == 0'.
+
+    // See if an inconsistent constraint has been passed.
+    for (dimension_type i = cs.num_rows(); i-- > 0; )
+      if (cs[i].is_inconsistent()) {
+        // Inconsistent constraint found: the polyhedron is empty.
+        set_empty();
+        break;
+      }
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& gs)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(gs.space_dimension() <= max_space_dimension());
+
+  // An empty set of generators defines the empty polyhedron.
+  if (gs.has_no_rows()) {
+    space_dim = gs.space_dimension();
+    status.set_empty();
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Non-empty valid generator systems have a supporting point, at least.
+  if (!gs.has_points())
+    throw_invalid_generators((topol == NECESSARILY_CLOSED)
+                             ? "C_Polyhedron(gs)"
+                             : "NNC_Polyhedron(gs)", "gs");
+
+  // TODO: this implementation is just an executable specification.
+  Generator_System gs_copy = gs;
+
+  const dimension_type gs_copy_space_dim = gs_copy.space_dimension();
+  // Try to adapt `gs_copy' to the required topology.
+  if (!gs_copy.adjust_topology_and_space_dimension(topol, gs_copy_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+                                ? "C_Polyhedron(gs)"
+                                : "NNC_Polyhedron(gs)", "gs", gs_copy);
+
+  if (gs_copy_space_dim > 0) {
+    // Stealing the rows from `gs_copy'.
+    using std::swap;
+    swap(gen_sys, gs_copy);
+    // In a generator system describing a NNC polyhedron,
+    // for each point we must also have the corresponding closure point.
+    if (topol == NOT_NECESSARILY_CLOSED)
+      gen_sys.add_corresponding_closure_points();
+    if (gen_sys.num_pending_rows() > 0) {
+      // Even though `gs_copy' has pending generators, since the
+      // constraints of the polyhedron are not up-to-date, the
+      // polyhedron cannot have pending generators. By integrating the
+      // pending part of `gen_sys' we may lose sortedness.
+      gen_sys.set_sorted(false);
+      gen_sys.unset_pending_rows();
+    }
+    // Generators are now up-to-date.
+    set_generators_up_to_date();
+
+    // Set the space dimension.
+    space_dim = gs_copy_space_dim;
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Here `gs_copy.num_rows > 0' and `gs_copy_space_dim == 0':
+  // we already checked for both the topology-compatibility
+  // and the supporting point.
+  space_dim = 0;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol,
+                            Generator_System& gs,
+                            Recycle_Input)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Protecting against space dimension overflow is up to the caller.
+  PPL_ASSERT(gs.space_dimension() <= max_space_dimension());
+
+  // An empty set of generators defines the empty polyhedron.
+  if (gs.has_no_rows()) {
+    space_dim = gs.space_dimension();
+    status.set_empty();
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Non-empty valid generator systems have a supporting point, at least.
+  if (!gs.has_points())
+    throw_invalid_generators((topol == NECESSARILY_CLOSED)
+                             ? "C_Polyhedron(gs, recycle)"
+                             : "NNC_Polyhedron(gs, recycle)", "gs");
+
+  const dimension_type gs_space_dim = gs.space_dimension();
+  // Try to adapt `gs' to the required topology.
+  if (!gs.adjust_topology_and_space_dimension(topol, gs_space_dim))
+    throw_topology_incompatible((topol == NECESSARILY_CLOSED)
+                                ? "C_Polyhedron(gs, recycle)"
+                                : "NNC_Polyhedron(gs, recycle)", "gs", gs);
+
+  if (gs_space_dim > 0) {
+    // Stealing the rows from `gs'.
+    swap(gen_sys, gs);
+    // In a generator system describing a NNC polyhedron,
+    // for each point we must also have the corresponding closure point.
+    if (topol == NOT_NECESSARILY_CLOSED)
+      gen_sys.add_corresponding_closure_points();
+    if (gen_sys.num_pending_rows() > 0) {
+      // Even though `gs' has pending generators, since the constraints
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending generators. By integrating the pending part
+      // of `gen_sys' we may loose sortedness.
+      gen_sys.set_sorted(false);
+      gen_sys.unset_pending_rows();
+    }
+    // Generators are now up-to-date.
+    set_generators_up_to_date();
+
+    // Set the space dimension.
+    space_dim = gs_space_dim;
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Here `gs.num_rows > 0' and `gs_space_dim == 0':
+  // we already checked for both the topology-compatibility
+  // and the supporting point.
+  space_dim = 0;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+PPL::Polyhedron&
+PPL::Polyhedron::operator=(const Polyhedron& y) {
+  // Being a protected method, we simply assert that topologies do match.
+  PPL_ASSERT(topology() == y.topology());
+  space_dim = y.space_dim;
+  if (y.marked_empty())
+    set_empty();
+  else if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    status = y.status;
+    if (y.constraints_are_up_to_date())
+      con_sys.assign_with_pending(y.con_sys);
+    if (y.generators_are_up_to_date())
+      gen_sys.assign_with_pending(y.gen_sys);
+    if (y.sat_c_is_up_to_date())
+      sat_c = y.sat_c;
+    if (y.sat_g_is_up_to_date())
+      sat_g = y.sat_g;
+  }
+  return *this;
+}
+
+PPL::Polyhedron::Three_Valued_Boolean
+PPL::Polyhedron::quick_equivalence_test(const Polyhedron& y) const {
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(topology() == y.topology());
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Polyhedron& x = *this;
+
+  if (x.is_necessarily_closed()) {
+    if (!x.has_something_pending() && !y.has_something_pending()) {
+      bool css_normalized = false;
+      if (x.constraints_are_minimized() && y.constraints_are_minimized()) {
+        // Equivalent minimized constraint systems have:
+        //  - the same number of constraints; ...
+        if (x.con_sys.num_rows() != y.con_sys.num_rows())
+          return Polyhedron::TVB_FALSE;
+        //  - the same number of equalities; ...
+        const dimension_type x_num_equalities = x.con_sys.num_equalities();
+        if (x_num_equalities != y.con_sys.num_equalities())
+          return Polyhedron::TVB_FALSE;
+        //  - if there are no equalities, they have the same constraints.
+        //    Delay this test: try cheaper tests on generators first.
+        css_normalized = (x_num_equalities == 0);
+      }
+
+      if (x.generators_are_minimized() && y.generators_are_minimized()) {
+        // Equivalent minimized generator systems have:
+        //  - the same number of generators; ...
+        if (x.gen_sys.num_rows() != y.gen_sys.num_rows())
+          return Polyhedron::TVB_FALSE;
+        //  - the same number of lines; ...
+        const dimension_type x_num_lines = x.gen_sys.num_lines();
+        if (x_num_lines != y.gen_sys.num_lines())
+          return Polyhedron::TVB_FALSE;
+        //  - if there are no lines, they have the same generators.
+        if (x_num_lines == 0) {
+          // Sort the two systems and check for syntactic identity.
+          x.obtain_sorted_generators();
+          y.obtain_sorted_generators();
+          if (x.gen_sys == y.gen_sys)
+            return Polyhedron::TVB_TRUE;
+          else
+            return Polyhedron::TVB_FALSE;
+        }
+      }
+
+      if (css_normalized) {
+        // Sort the two systems and check for identity.
+        x.obtain_sorted_constraints();
+        y.obtain_sorted_constraints();
+        if (x.con_sys == y.con_sys)
+            return Polyhedron::TVB_TRUE;
+          else
+            return Polyhedron::TVB_FALSE;
+      }
+    }
+  }
+  return Polyhedron::TVB_DONT_KNOW;
+}
+
+bool
+PPL::Polyhedron::is_included_in(const Polyhedron& y) const {
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(topology() == y.topology());
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty() && !y.marked_empty() && space_dim > 0);
+
+  const Polyhedron& x = *this;
+
+  // `x' cannot have pending constraints, because we need its generators.
+  if (x.has_pending_constraints() && !x.process_pending_constraints())
+    return true;
+  // `y' cannot have pending generators, because we need its constraints.
+  if (y.has_pending_generators())
+    y.process_pending_generators();
+
+#if BE_LAZY
+  if (!x.generators_are_up_to_date() && !x.update_generators())
+    return true;
+  if (!y.constraints_are_up_to_date())
+    y.update_constraints();
+#else
+  if (!x.generators_are_minimized())
+    x.minimize();
+  if (!y.constraints_are_minimized())
+    y.minimize();
+#endif
+
+  PPL_ASSERT_HEAVY(x.OK());
+  PPL_ASSERT_HEAVY(y.OK());
+
+  const Generator_System& gs = x.gen_sys;
+  const Constraint_System& cs = y.con_sys;
+
+  if (x.is_necessarily_closed())
+    // When working with necessarily closed polyhedra,
+    // `x' is contained in `y' if and only if all the generators of `x'
+    // satisfy all the inequalities and saturate all the equalities of `y'.
+    // This comes from the definition of a polyhedron as the set of
+    // vectors satisfying a constraint system and the fact that all
+    // vectors in `x' can be obtained by suitably combining its generators.
+    for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+      const Constraint& c = cs[i];
+      if (c.is_inequality()) {
+        for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+          const Generator& g = gs[j];
+          const int sp_sign = Scalar_Products::sign(c, g);
+          if (g.is_line()) {
+            if (sp_sign != 0)
+              return false;
+          }
+          else
+            // `g' is a ray or a point.
+            if (sp_sign < 0)
+              return false;
+        }
+      }
+      else {
+        // `c' is an equality.
+        for (dimension_type j = gs.num_rows(); j-- > 0; )
+          if (Scalar_Products::sign(c, gs[j]) != 0)
+            return false;
+      }
+    }
+  else {
+    // Here we have an NNC polyhedron: using the reduced scalar product,
+    // which ignores the epsilon coefficient.
+    for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+      const Constraint& c = cs[i];
+      switch (c.type()) {
+      case Constraint::NONSTRICT_INEQUALITY:
+        for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+          const Generator& g = gs[j];
+          const int sp_sign = Scalar_Products::reduced_sign(c, g);
+          if (g.is_line()) {
+            if (sp_sign != 0)
+              return false;
+          }
+          else
+            // `g' is a ray or a point or a closure point.
+            if (sp_sign < 0)
+              return false;
+        }
+        break;
+      case Constraint::EQUALITY:
+        for (dimension_type j = gs.num_rows(); j-- > 0; )
+          if (Scalar_Products::reduced_sign(c, gs[j]) != 0)
+            return false;
+        break;
+      case Constraint::STRICT_INEQUALITY:
+        for (dimension_type j = gs.num_rows(); j-- > 0; ) {
+          const Generator& g = gs[j];
+          const int sp_sign = Scalar_Products::reduced_sign(c, g);
+          switch (g.type()) {
+          case Generator::POINT:
+            // If a point violates or saturates a strict inequality
+            // (when ignoring the epsilon coefficients) then it is
+            // not included in the polyhedron.
+            if (sp_sign <= 0)
+              return false;
+            break;
+          case Generator::LINE:
+            // Lines have to saturate all constraints.
+            if (sp_sign != 0)
+              return false;
+            break;
+          case Generator::RAY:
+            // Intentionally fall through.
+          case Generator::CLOSURE_POINT:
+            // The generator is a ray or closure point: usual test.
+            if (sp_sign < 0)
+              return false;
+            break;
+          }
+        }
+        break;
+      }
+    }
+  }
+
+  // Inclusion holds.
+  return true;
+}
+
+bool
+PPL::Polyhedron::bounds(const Linear_Expression& expr,
+                        const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+
+  // A zero-dimensional or empty polyhedron bounds everything.
+  if (space_dim == 0
+      || marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // The polyhedron has updated, possibly pending generators.
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& g = gen_sys[i];
+    // Only lines and rays in `*this' can cause `expr' to be unbounded.
+    if (g.is_line_or_ray()) {
+      const int sp_sign = Scalar_Products::homogeneous_sign(expr, g);
+      if (sp_sign != 0
+          && (g.is_line()
+              || (from_above && sp_sign > 0)
+              || (!from_above && sp_sign < 0)))
+        // `*this' does not bound `expr'.
+        return false;
+    }
+  }
+  // No sources of unboundedness have been found for `expr'
+  // in the given direction.
+  return true;
+}
+
+bool
+PPL::Polyhedron::max_min(const Linear_Expression& expr,
+                         const bool maximize,
+                         Coefficient& ext_n, Coefficient& ext_d,
+                         bool& included,
+                         Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+
+  // Deal with zero-dim polyhedra first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  // For an empty polyhedron we simply return false.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return false;
+
+  // The polyhedron has updated, possibly pending generators.
+  // The following loop will iterate through the generator
+  // to find the extremum.
+  PPL_DIRTY_TEMP(mpq_class, extremum);
+
+  // True if we have no other candidate extremum to compare with.
+  bool first_candidate = true;
+
+  // To store the position of the current candidate extremum.
+  PPL_UNINITIALIZED(dimension_type, ext_position);
+
+  // Whether the current candidate extremum is included or not.
+  PPL_UNINITIALIZED(bool, ext_included);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sp);
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& gen_sys_i = gen_sys[i];
+    Scalar_Products::homogeneous_assign(sp, expr, gen_sys_i);
+    // Lines and rays in `*this' can cause `expr' to be unbounded.
+    if (gen_sys_i.is_line_or_ray()) {
+      const int sp_sign = sgn(sp);
+      if (sp_sign != 0
+          && (gen_sys_i.is_line()
+              || (maximize && sp_sign > 0)
+              || (!maximize && sp_sign < 0)))
+        // `expr' is unbounded in `*this'.
+        return false;
+    }
+    else {
+      // We have a point or a closure point.
+      PPL_ASSERT(gen_sys_i.is_point() || gen_sys_i.is_closure_point());
+      // Notice that we are ignoring the constant term in `expr' here.
+      // We will add it to the extremum as soon as we find it.
+      PPL_DIRTY_TEMP(mpq_class, candidate);
+      assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
+      assign_r(candidate.get_den(), gen_sys_i.expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+      candidate.canonicalize();
+      const bool g_is_point = gen_sys_i.is_point();
+      if (first_candidate
+          || (maximize
+              && (candidate > extremum
+                  || (g_is_point
+                      && !ext_included
+                      && candidate == extremum)))
+          || (!maximize
+              && (candidate < extremum
+                  || (g_is_point
+                      && !ext_included
+                      && candidate == extremum)))) {
+        // We have a (new) candidate extremum.
+        first_candidate = false;
+        extremum = candidate;
+        ext_position = i;
+        ext_included = g_is_point;
+      }
+    }
+  }
+
+  // Add in the constant term in `expr'.
+  PPL_DIRTY_TEMP(mpz_class, n);
+  assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  extremum += n;
+
+  // The polyhedron is bounded in the right direction and we have
+  // computed the extremum: write the result into the caller's structures.
+  PPL_ASSERT(!first_candidate);
+  // FIXME: avoid these temporaries, if possible.
+  // This can be done adding an `assign' function working on native
+  // and checked or an operator= that have on one side a checked and
+  // on the other a native or checked.
+  // The reason why now we can't use operator= is the fact that we
+  // still can have Coefficient defined to mpz_class (and not
+  // Checked_Number<mpz_class>).
+  ext_n = Coefficient(extremum.get_num());
+  ext_d = Coefficient(extremum.get_den());
+  included = ext_included;
+  g = gen_sys[ext_position];
+
+  return true;
+}
+
+void
+PPL::Polyhedron::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+  space_dim = 0;
+  con_sys.clear();
+  gen_sys.clear();
+}
+
+void
+PPL::Polyhedron::set_empty() {
+  status.set_empty();
+  // The polyhedron is empty: we can thus throw away everything.
+  con_sys.clear();
+  gen_sys.clear();
+  sat_c.clear();
+  sat_g.clear();
+}
+
+bool
+PPL::Polyhedron::process_pending_constraints() const {
+  PPL_ASSERT(space_dim > 0 && !marked_empty());
+  PPL_ASSERT(has_pending_constraints() && !has_pending_generators());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // Integrate the pending part of the system of constraints and minimize.
+  // We need `sat_c' up-to-date and `con_sys' sorted (together with `sat_c').
+  if (!x.sat_c_is_up_to_date())
+    x.sat_c.transpose_assign(x.sat_g);
+  if (!x.con_sys.is_sorted())
+    x.obtain_sorted_constraints_with_sat_c();
+  // We sort in place the pending constraints, erasing those constraints
+  // that also occur in the non-pending part of `con_sys'.
+  x.con_sys.sort_pending_and_remove_duplicates();
+  if (x.con_sys.num_pending_rows() == 0) {
+    // All pending constraints were duplicates.
+    x.clear_pending_constraints();
+    PPL_ASSERT_HEAVY(OK(true));
+    return true;
+  }
+
+  const bool empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c);
+  PPL_ASSERT(x.con_sys.num_pending_rows() == 0);
+
+  if (empty)
+    x.set_empty();
+  else {
+    x.clear_pending_constraints();
+    x.clear_sat_g_up_to_date();
+    x.set_sat_c_up_to_date();
+  }
+  PPL_ASSERT_HEAVY(OK(!empty));
+  return !empty;
+}
+
+void
+PPL::Polyhedron::process_pending_generators() const {
+  PPL_ASSERT(space_dim > 0 && !marked_empty());
+  PPL_ASSERT(has_pending_generators() && !has_pending_constraints());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // Integrate the pending part of the system of generators and minimize.
+  // We need `sat_g' up-to-date and `gen_sys' sorted (together with `sat_g').
+  if (!x.sat_g_is_up_to_date())
+    x.sat_g.transpose_assign(x.sat_c);
+  if (!x.gen_sys.is_sorted())
+    x.obtain_sorted_generators_with_sat_g();
+  // We sort in place the pending generators, erasing those generators
+  // that also occur in the non-pending part of `gen_sys'.
+  x.gen_sys.sort_pending_and_remove_duplicates();
+  if (x.gen_sys.num_pending_rows() == 0) {
+    // All pending generators were duplicates.
+    x.clear_pending_generators();
+    PPL_ASSERT_HEAVY(OK(true));
+    return;
+  }
+
+  add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g);
+  PPL_ASSERT(x.gen_sys.num_pending_rows() == 0);
+
+  x.clear_pending_generators();
+  x.clear_sat_c_up_to_date();
+  x.set_sat_g_up_to_date();
+}
+
+void
+PPL::Polyhedron::remove_pending_to_obtain_constraints() const {
+  PPL_ASSERT(has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // If the polyhedron has pending constraints, simply unset them.
+  if (x.has_pending_constraints()) {
+    // Integrate the pending constraints, which are possibly not sorted.
+    x.con_sys.set_sorted(false);
+    x.con_sys.unset_pending_rows();
+    x.clear_pending_constraints();
+    x.clear_constraints_minimized();
+    x.clear_generators_up_to_date();
+  }
+  else {
+    PPL_ASSERT(x.has_pending_generators());
+    // We must process the pending generators and obtain the
+    // corresponding system of constraints.
+    x.process_pending_generators();
+  }
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+bool
+PPL::Polyhedron::remove_pending_to_obtain_generators() const {
+  PPL_ASSERT(has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // If the polyhedron has pending generators, simply unset them.
+  if (x.has_pending_generators()) {
+    // Integrate the pending generators, which are possibly not sorted.
+    x.gen_sys.set_sorted(false);
+    x.gen_sys.unset_pending_rows();
+    x.clear_pending_generators();
+    x.clear_generators_minimized();
+    x.clear_constraints_up_to_date();
+    PPL_ASSERT_HEAVY(OK(true));
+    return true;
+  }
+  else {
+    PPL_ASSERT(x.has_pending_constraints());
+    // We must integrate the pending constraints and obtain the
+    // corresponding system of generators.
+    return x.process_pending_constraints();
+  }
+}
+
+void
+PPL::Polyhedron::update_constraints() const {
+  PPL_ASSERT(space_dim > 0);
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(generators_are_up_to_date());
+  // We assume the polyhedron has no pending constraints or generators.
+  PPL_ASSERT(!has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  minimize(false, x.gen_sys, x.con_sys, x.sat_c);
+  // `sat_c' is the only saturation matrix up-to-date.
+  x.set_sat_c_up_to_date();
+  x.clear_sat_g_up_to_date();
+  // The system of constraints and the system of generators
+  // are minimized.
+  x.set_constraints_minimized();
+  x.set_generators_minimized();
+}
+
+bool
+PPL::Polyhedron::update_generators() const {
+  PPL_ASSERT(space_dim > 0);
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(constraints_are_up_to_date());
+  // We assume the polyhedron has no pending constraints or generators.
+  PPL_ASSERT(!has_something_pending());
+
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // If the system of constraints is not consistent the
+  // polyhedron is empty.
+  const bool empty = minimize(true, x.con_sys, x.gen_sys, x.sat_g);
+  if (empty)
+    x.set_empty();
+  else {
+    // `sat_g' is the only saturation matrix up-to-date.
+    x.set_sat_g_up_to_date();
+    x.clear_sat_c_up_to_date();
+    // The system of constraints and the system of generators
+    // are minimized.
+    x.set_constraints_minimized();
+    x.set_generators_minimized();
+  }
+  return !empty;
+}
+
+void
+PPL::Polyhedron::update_sat_c() const {
+  PPL_ASSERT(constraints_are_minimized());
+  PPL_ASSERT(generators_are_minimized());
+  PPL_ASSERT(!sat_c_is_up_to_date());
+
+  // We only consider non-pending rows.
+  const dimension_type csr = con_sys.first_pending_row();
+  const dimension_type gsr = gen_sys.first_pending_row();
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // The columns of `sat_c' represent the constraints and
+  // its rows represent the generators: resize accordingly.
+  x.sat_c.resize(gsr, csr);
+  for (dimension_type i = gsr; i-- > 0; )
+    for (dimension_type j = csr; j-- > 0; ) {
+      const int sp_sign = Scalar_Products::sign(con_sys[j], gen_sys[i]);
+      // The negativity of this scalar product would mean
+      // that the generator `gen_sys[i]' violates the constraint
+      // `con_sys[j]' and it is not possible because both generators
+      // and constraints are up-to-date.
+      PPL_ASSERT(sp_sign >= 0);
+      if (sp_sign > 0)
+        // `gen_sys[i]' satisfies (without saturate) `con_sys[j]'.
+        x.sat_c[i].set(j);
+      else
+        // `gen_sys[i]' saturates `con_sys[j]'.
+        x.sat_c[i].clear(j);
+    }
+  x.set_sat_c_up_to_date();
+}
+
+void
+PPL::Polyhedron::update_sat_g() const {
+  PPL_ASSERT(constraints_are_minimized());
+  PPL_ASSERT(generators_are_minimized());
+  PPL_ASSERT(!sat_g_is_up_to_date());
+
+  // We only consider non-pending rows.
+  const dimension_type csr = con_sys.first_pending_row();
+  const dimension_type gsr = gen_sys.first_pending_row();
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // The columns of `sat_g' represent generators and its
+  // rows represent the constraints: resize accordingly.
+  x.sat_g.resize(csr, gsr);
+  for (dimension_type i = csr; i-- > 0; )
+    for (dimension_type j = gsr; j-- > 0; ) {
+      const int sp_sign = Scalar_Products::sign(con_sys[i], gen_sys[j]);
+      // The negativity of this scalar product would mean
+      // that the generator `gen_sys[j]' violates the constraint
+      // `con_sys[i]' and it is not possible because both generators
+      // and constraints are up-to-date.
+      PPL_ASSERT(sp_sign >= 0);
+      if (sp_sign > 0)
+        // `gen_sys[j]' satisfies (without saturate) `con_sys[i]'.
+        x.sat_g[i].set(j);
+      else
+        // `gen_sys[j]' saturates `con_sys[i]'.
+        x.sat_g[i].clear(j);
+    }
+  x.set_sat_g_up_to_date();
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints() const {
+  PPL_ASSERT(constraints_are_up_to_date());
+  // `con_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  if (!x.con_sys.is_sorted()) {
+    if (x.sat_g_is_up_to_date()) {
+      // Sorting constraints keeping `sat_g' consistent.
+      x.con_sys.sort_and_remove_with_sat(x.sat_g);
+      // `sat_c' is not up-to-date anymore.
+      x.clear_sat_c_up_to_date();
+    }
+    else if (x.sat_c_is_up_to_date()) {
+      // Using `sat_c' to obtain `sat_g', then it is like previous case.
+      x.sat_g.transpose_assign(x.sat_c);
+      x.con_sys.sort_and_remove_with_sat(x.sat_g);
+      x.set_sat_g_up_to_date();
+      x.clear_sat_c_up_to_date();
+    }
+    else
+      // If neither `sat_g' nor `sat_c' are up-to-date,
+      // we just sort the constraints.
+      x.con_sys.sort_rows();
+  }
+
+  PPL_ASSERT(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators() const {
+  PPL_ASSERT(generators_are_up_to_date());
+  // `gen_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  if (!x.gen_sys.is_sorted()) {
+    if (x.sat_c_is_up_to_date()) {
+      // Sorting generators keeping 'sat_c' consistent.
+      x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+      // `sat_g' is not up-to-date anymore.
+      x.clear_sat_g_up_to_date();
+    }
+    else if (x.sat_g_is_up_to_date()) {
+      // Obtaining `sat_c' from `sat_g' and proceeding like previous case.
+      x.sat_c.transpose_assign(x.sat_g);
+      x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+      x.set_sat_c_up_to_date();
+      x.clear_sat_g_up_to_date();
+    }
+    else
+      // If neither `sat_g' nor `sat_c' are up-to-date, we just sort
+      // the generators.
+      x.gen_sys.sort_rows();
+  }
+
+  PPL_ASSERT(gen_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints_with_sat_c() const {
+  PPL_ASSERT(constraints_are_up_to_date());
+  PPL_ASSERT(constraints_are_minimized());
+  // `con_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // At least one of the saturation matrices must be up-to-date.
+  if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date())
+    x.update_sat_c();
+
+  if (x.con_sys.is_sorted()) {
+    if (x.sat_c_is_up_to_date())
+      // If constraints are already sorted and sat_c is up to
+      // date there is nothing to do.
+      return;
+  }
+  else {
+    if (!x.sat_g_is_up_to_date()) {
+      // If constraints are not sorted and sat_g is not up-to-date
+      // we obtain sat_g from sat_c (that has to be up-to-date)...
+      x.sat_g.transpose_assign(x.sat_c);
+      x.set_sat_g_up_to_date();
+    }
+    // ... and sort it together with constraints.
+    x.con_sys.sort_and_remove_with_sat(x.sat_g);
+  }
+  // Obtaining sat_c from sat_g.
+  x.sat_c.transpose_assign(x.sat_g);
+  x.set_sat_c_up_to_date();
+  // Constraints are sorted now.
+  x.con_sys.set_sorted(true);
+
+  PPL_ASSERT(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators_with_sat_g() const {
+  PPL_ASSERT(generators_are_up_to_date());
+  // `gen_sys' will be sorted up to `index_first_pending'.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+  // At least one of the saturation matrices must be up-to-date.
+  if (!x.sat_c_is_up_to_date() && !x.sat_g_is_up_to_date())
+    x.update_sat_g();
+
+  if (x.gen_sys.is_sorted()) {
+    if (x.sat_g_is_up_to_date())
+      // If generators are already sorted and sat_g is up to
+      // date there is nothing to do.
+      return;
+  }
+  else {
+    if (!x.sat_c_is_up_to_date()) {
+      // If generators are not sorted and sat_c is not up-to-date
+      // we obtain sat_c from sat_g (that has to be up-to-date)...
+      x.sat_c.transpose_assign(x.sat_g);
+      x.set_sat_c_up_to_date();
+    }
+    // ... and sort it together with generators.
+    x.gen_sys.sort_and_remove_with_sat(x.sat_c);
+  }
+  // Obtaining sat_g from sat_c.
+  x.sat_g.transpose_assign(sat_c);
+  x.set_sat_g_up_to_date();
+  // Generators are sorted now.
+  x.gen_sys.set_sorted(true);
+
+  PPL_ASSERT(gen_sys.check_sorted());
+}
+
+bool
+PPL::Polyhedron::minimize() const {
+  // 0-dim space or empty polyhedra are already minimized.
+  if (marked_empty())
+    return false;
+  if (space_dim == 0)
+    return true;
+
+  // If the polyhedron has something pending, process it.
+  if (has_something_pending()) {
+    const bool not_empty = process_pending();
+    PPL_ASSERT_HEAVY(OK());
+    return not_empty;
+  }
+
+  // Here there are no pending constraints or generators.
+  // Is the polyhedron already minimized?
+  if (constraints_are_minimized() && generators_are_minimized())
+    return true;
+
+  // If constraints or generators are up-to-date, invoking
+  // update_generators() or update_constraints(), respectively,
+  // minimizes both constraints and generators.
+  // If both are up-to-date it does not matter whether we use
+  // update_generators() or update_constraints():
+  // both minimize constraints and generators.
+  if (constraints_are_up_to_date()) {
+    // We may discover here that `*this' is empty.
+    const bool ret = update_generators();
+    PPL_ASSERT_HEAVY(OK());
+    return ret;
+  }
+  else {
+    PPL_ASSERT(generators_are_up_to_date());
+    update_constraints();
+    PPL_ASSERT_HEAVY(OK());
+    return true;
+  }
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_constraints() const {
+  PPL_ASSERT(!is_necessarily_closed());
+
+  // From the user perspective, the polyhedron will not change.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // We need `con_sys' (weakly) minimized and `gen_sys' up-to-date.
+  // `minimize()' will process any pending constraints or generators.
+  if (!minimize())
+    return false;
+
+  // If the polyhedron `*this' is zero-dimensional
+  // at this point it must be a universe polyhedron.
+  if (x.space_dim == 0)
+    return true;
+
+  // We also need `sat_g' up-to-date.
+  if (!sat_g_is_up_to_date()) {
+    PPL_ASSERT(sat_c_is_up_to_date());
+    x.sat_g.transpose_assign(sat_c);
+  }
+
+  // These Bit_Row's will be later used as masks in order to
+  // check saturation conditions restricted to particular subsets of
+  // the generator system.
+  Bit_Row sat_all_but_rays;
+  Bit_Row sat_all_but_points;
+  Bit_Row sat_all_but_closure_points;
+
+  const dimension_type gs_rows = gen_sys.num_rows();
+  const dimension_type n_lines = gen_sys.num_lines();
+  for (dimension_type i = gs_rows; i-- > n_lines; )
+    switch (gen_sys[i].type()) {
+    case Generator::RAY:
+      sat_all_but_rays.set(i);
+      break;
+    case Generator::POINT:
+      sat_all_but_points.set(i);
+      break;
+    case Generator::CLOSURE_POINT:
+      sat_all_but_closure_points.set(i);
+      break;
+    case Generator::LINE:
+      // Found a line with index i >= n_lines !
+      PPL_UNREACHABLE;
+      break;
+    }
+  const Bit_Row
+    sat_lines_and_rays(sat_all_but_points, sat_all_but_closure_points);
+  const Bit_Row
+    sat_lines_and_closure_points(sat_all_but_rays, sat_all_but_points);
+  const Bit_Row
+    sat_lines(sat_lines_and_rays, sat_lines_and_closure_points);
+
+  // These flags are maintained to later decide if we have to add the
+  // eps_leq_one constraint and whether or not the constraint system
+  // was changed.
+  bool changed = false;
+  bool found_eps_leq_one = false;
+
+  // For all the strict inequalities in `con_sys', check for
+  // eps-redundancy and eventually move them to the bottom part of the
+  // system.
+  Constraint_System& cs = x.con_sys;
+  Bit_Matrix& sat = x.sat_g;
+  const Variable eps_var(cs.space_dimension());
+  // Note that cs.num_rows() is *not* constant because the calls to
+  // cs.remove_row() decrease it.
+  for (dimension_type i = 0; i < cs.num_rows(); )
+    if (cs[i].is_strict_inequality()) {
+      // First, check if it is saturated by no closure points
+      Bit_Row sat_ci;
+      sat_ci.union_assign(sat[i], sat_lines_and_closure_points);
+      if (sat_ci == sat_lines) {
+        // It is saturated by no closure points.
+        if (!found_eps_leq_one) {
+          // Check if it is the eps_leq_one constraint.
+          const Constraint& c = cs[i];
+          if (c.expression().all_homogeneous_terms_are_zero()
+              && (c.expression().inhomogeneous_term() + c.epsilon_coefficient() == 0)) {
+            // We found the eps_leq_one constraint.
+            found_eps_leq_one = true;
+            // Consider next constraint.
+            ++i;
+            continue;
+          }
+        }
+        // Here `cs[i]' is not the eps_leq_one constraint,
+        // so it is eps-redundant.
+        // Remove it, while keeping `sat_g' consistent.
+        cs.remove_row(i, false);
+        swap(sat[i], sat[cs.num_rows()]);
+        // The constraint system is changed.
+        changed = true;
+        // Continue by considering next constraint,
+        // which is already in place due to the swap.
+        continue;
+      }
+      // Now we check if there exists another strict inequality
+      // constraint having a superset of its saturators,
+      // when disregarding points.
+      sat_ci.union_assign(sat[i], sat_all_but_points);
+      bool eps_redundant = false;
+      for (dimension_type j = 0; j < cs.num_rows(); ++j)
+        if (i != j && cs[j].is_strict_inequality()
+            && subset_or_equal(sat[j], sat_ci)) {
+          // Constraint `cs[i]' is eps-redundant:
+          // remove it, while keeping `sat_g' consistent.
+          cs.remove_row(i, false);
+          swap(sat[i], sat[cs.num_rows()]);
+          eps_redundant = true;
+          // The constraint system is changed.
+          changed = true;
+          break;
+        }
+      // Continue with next constraint, which is already in place
+      // due to the swap if we have found an eps-redundant constraint.
+      if (!eps_redundant)
+        ++i;
+    }
+    else
+      // `cs[i]' is not a strict inequality: consider next constraint.
+      ++i;
+
+  PPL_ASSERT(cs.num_pending_rows() == 0);
+
+  if (changed) {
+    // If the constraint system has been changed, we have erased
+    // the epsilon-redundant constraints.
+
+    // The generator system is no longer up-to-date.
+    x.clear_generators_up_to_date();
+
+    // If we haven't found an upper bound for the epsilon dimension,
+    // then we have to check whether such an upper bound is implied
+    // by the remaining constraints (exploiting the simplex algorithm).
+    if (!found_eps_leq_one) {
+      MIP_Problem lp;
+      // KLUDGE: temporarily mark the constraint system as if it was
+      // necessarily closed, so that we can interpret the epsilon
+      // dimension as a standard dimension. Be careful to reset the
+      // topology of `cs' even on exceptional execution path.
+      cs.mark_as_necessarily_closed();
+      try {
+        lp.add_space_dimensions_and_embed(cs.space_dimension());
+        lp.add_constraints(cs);
+        cs.mark_as_not_necessarily_closed();
+      }
+      catch (...) {
+        cs.mark_as_not_necessarily_closed();
+        throw;
+      }
+      // The objective function is `epsilon'.
+      lp.set_objective_function(Variable(x.space_dim));
+      lp.set_optimization_mode(MAXIMIZATION);
+      const MIP_Problem_Status status = lp.solve();
+      PPL_ASSERT(status != UNFEASIBLE_MIP_PROBLEM);
+      // If the epsilon dimension is actually unbounded,
+      // then add the eps_leq_one constraint.
+      if (status == UNBOUNDED_MIP_PROBLEM)
+        cs.insert(Constraint::epsilon_leq_one());
+    }
+  }
+
+  PPL_ASSERT_HEAVY(OK());
+  return true;
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_generators() const {
+  PPL_ASSERT(!is_necessarily_closed());
+
+  // From the user perspective, the polyhedron will not change.
+  Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+  // We need `gen_sys' (weakly) minimized and `con_sys' up-to-date.
+  // `minimize()' will process any pending constraints or generators.
+  if (!minimize())
+    return false;
+
+  // If the polyhedron `*this' is zero-dimensional
+  // at this point it must be a universe polyhedron.
+  if (x.space_dim == 0)
+    return true;
+
+  // We also need `sat_c' up-to-date.
+  if (!sat_c_is_up_to_date()) {
+    PPL_ASSERT(sat_g_is_up_to_date());
+    x.sat_c.transpose_assign(sat_g);
+  }
+
+  // This Bit_Row will have all and only the indexes
+  // of strict inequalities set to 1.
+  Bit_Row sat_all_but_strict_ineq;
+  const dimension_type cs_rows = con_sys.num_rows();
+  const dimension_type n_equals = con_sys.num_equalities();
+  for (dimension_type i = cs_rows; i-- > n_equals; )
+    if (con_sys[i].is_strict_inequality())
+      sat_all_but_strict_ineq.set(i);
+
+  // Will record whether or not we changed the generator system.
+  bool changed = false;
+
+  // For all points in the generator system, check for eps-redundancy
+  // and eventually move them to the bottom part of the system.
+  Generator_System& gs = const_cast<Generator_System&>(gen_sys);
+  Bit_Matrix& sat = const_cast<Bit_Matrix&>(sat_c);
+  const dimension_type old_gs_rows = gs.num_rows();
+  dimension_type gs_rows = old_gs_rows;
+  const dimension_type n_lines = gs.num_lines();
+  bool gs_sorted = gs.is_sorted();
+
+  for (dimension_type i = n_lines; i < gs_rows; ) {
+    Generator& g = gs.sys.rows[i];
+    if (g.is_point()) {
+      // Compute the Bit_Row corresponding to the candidate point
+      // when strict inequality constraints are ignored.
+      const Bit_Row sat_gs_i(sat[i], sat_all_but_strict_ineq);
+      // Check if the candidate point is actually eps-redundant:
+      // namely, if there exists another point that saturates
+      // all the non-strict inequalities saturated by the candidate.
+      bool eps_redundant = false;
+      for (dimension_type j = n_lines; j < gs_rows; ++j) {
+        const Generator& g2 = gs.sys.rows[j];
+        if (i != j && g2.is_point() && subset_or_equal(sat[j], sat_gs_i)) {
+          // Point `g' is eps-redundant:
+          // move it to the bottom of the generator system,
+          // while keeping `sat_c' consistent.
+          --gs_rows;
+          swap(g, gs.sys.rows[gs_rows]);
+          swap(sat[i], sat[gs_rows]);
+          eps_redundant = true;
+          changed = true;
+          break;
+        }
+      }
+      if (!eps_redundant) {
+        // Let all point encodings have epsilon coordinate 1.
+        if (g.epsilon_coefficient() != g.expr.inhomogeneous_term()) {
+          g.set_epsilon_coefficient(g.expr.inhomogeneous_term());
+          // Enforce normalization.
+          g.expr.normalize();
+          PPL_ASSERT(g.OK());
+          changed = true;
+        }
+        // Consider next generator.
+        ++i;
+      }
+    }
+    else
+      // Consider next generator.
+      ++i;
+  }
+
+  // If needed, erase the eps-redundant generators.
+  if (gs_rows < old_gs_rows)
+    gs.sys.rows.resize(gs_rows);
+
+  if (changed) {
+    // The generator system is no longer sorted.
+    gs_sorted = false;
+    // The constraint system is no longer up-to-date.
+    x.clear_constraints_up_to_date();
+  }
+
+  gs.sys.index_first_pending = gs.num_rows();
+  gs.set_sorted(gs_sorted);
+
+  PPL_ASSERT(gs.sys.OK());
+
+  PPL_ASSERT_HEAVY(OK());
+  return true;
+}
+
+void
+PPL::Polyhedron::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(space_dim >= c.space_dimension());
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    if (c.is_inconsistent())
+      set_empty();
+    return;
+  }
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  const bool adding_pending = can_have_something_pending();
+
+  if (c.is_necessarily_closed() || !is_necessarily_closed())
+    // Since `con_sys' is not empty, the topology and space dimension
+    // of the inserted constraint are automatically adjusted.
+    if (adding_pending)
+      con_sys.insert_pending(c);
+    else
+      con_sys.insert(c);
+  else {
+    // Here we know that the system of constraints has at least a row.
+    // However, by barely invoking `con_sys.insert(c)' we would
+    // cause a change in the topology of `con_sys', which is wrong.
+    // Thus, we insert a "topology corrected" copy of `c'.
+    const Linear_Expression nc_expr(c.expression());
+    if (c.is_equality())
+      if (adding_pending)
+        con_sys.insert_pending(nc_expr == 0);
+      else
+        con_sys.insert(nc_expr == 0);
+    else
+      if (adding_pending)
+        con_sys.insert_pending(nc_expr >= 0);
+      else
+        con_sys.insert(nc_expr >= 0);
+  }
+
+  if (adding_pending)
+    set_constraints_pending();
+  else {
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  PPL_ASSERT_HEAVY(OK());
+}
+
+bool
+PPL::Polyhedron::BHZ09_poly_hull_assign_if_exact(const Polyhedron& y) {
+  Polyhedron& x = *this;
+
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x.topology() == y.topology());
+  PPL_ASSERT(x.space_dim == y.space_dim);
+
+  // The zero-dim case is trivial.
+  if (x.space_dim == 0) {
+    x.upper_bound_assign(y);
+    return true;
+  }
+
+  // If `x' or `y' are (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    x = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    x = y;
+    return true;
+  }
+
+  if (x.is_necessarily_closed())
+    return x.BHZ09_C_poly_hull_assign_if_exact(y);
+  else
+    return x.BHZ09_NNC_poly_hull_assign_if_exact(y);
+}
+
+bool
+PPL::Polyhedron::BHZ09_C_poly_hull_assign_if_exact(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x.is_necessarily_closed() && y.is_necessarily_closed());
+  PPL_ASSERT(x.space_dim > 0 && x.space_dim == y.space_dim);
+  PPL_ASSERT(!x.is_empty() && !y.is_empty());
+
+  // Minimization is not really required, but it is probably the best
+  // way of getting constraints, generators and saturation matrices
+  // up-to-date.  Minimization it also removes redundant
+  // constraints/generators.
+  (void) x.minimize();
+  (void) y.minimize();
+
+  // Handle a special case: for topologically closed polyhedra P and Q,
+  // if the affine dimension of P is greater than that of Q, then
+  // their upper bound is exact if and only if P includes Q.
+  const dimension_type x_affine_dim = x.affine_dimension();
+  const dimension_type y_affine_dim = y.affine_dimension();
+  if (x_affine_dim > y_affine_dim)
+    return y.is_included_in(x);
+  else if (x_affine_dim < y_affine_dim) {
+    if (x.is_included_in(y)) {
+      x = y;
+      return true;
+    }
+    else
+      return false;
+  }
+
+  const Constraint_System& x_cs = x.con_sys;
+  const Generator_System& x_gs = x.gen_sys;
+  const Generator_System& y_gs = y.gen_sys;
+  const dimension_type x_gs_num_rows = x_gs.num_rows();
+  const dimension_type y_gs_num_rows = y_gs.num_rows();
+
+  // Step 1: generators of `x' that are redundant in `y', and vice versa.
+  Bit_Row x_gs_red_in_y;
+  dimension_type num_x_gs_red_in_y = 0;
+  for (dimension_type i = x_gs_num_rows; i-- > 0; )
+    if (y.relation_with(x_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+      x_gs_red_in_y.set(i);
+      ++num_x_gs_red_in_y;
+    }
+  Bit_Row y_gs_red_in_x;
+  dimension_type num_y_gs_red_in_x = 0;
+  for (dimension_type i = y_gs_num_rows; i-- > 0; )
+    if (x.relation_with(y_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+      y_gs_red_in_x.set(i);
+      ++num_y_gs_red_in_x;
+    }
+
+  // Step 2: filter away special cases.
+
+  // Step 2.1: inclusion tests.
+  if (num_y_gs_red_in_x == y_gs_num_rows)
+    // `y' is included into `x': upper bound `x' is exact.
+    return true;
+  if (num_x_gs_red_in_y == x_gs_num_rows) {
+    // `x' is included into `y': upper bound `y' is exact.
+    x = y;
+    return true;
+  }
+
+  // Step 2.2: if no generator of `x' is redundant for `y', then
+  // (as by 2.1 there exists a constraint of `x' non-redundant for `y')
+  // the upper bound is not exact; the same if exchanging `x' and `y'.
+  if (num_x_gs_red_in_y == 0 || num_y_gs_red_in_x == 0)
+    return false;
+
+  // Step 3: see if `x' has a non-redundant constraint `c_x' that is not
+  // satisfied by `y' and a non-redundant generator in `y' (see Step 1)
+  // saturating `c_x'. If so, the upper bound is not exact.
+
+  // Make sure the saturation matrix for `x' is up to date.
+  // Any sat matrix would do: we choose `sat_g' because it matches
+  // the two nested loops (constraints on rows and generators on columns).
+  if (!x.sat_g_is_up_to_date())
+    x.update_sat_g();
+  const Bit_Matrix& x_sat = x.sat_g;
+
+  Bit_Row all_ones;
+  all_ones.set_until(x_gs_num_rows);
+  Bit_Row row_union;
+  for (dimension_type i = x_cs.num_rows(); i-- > 0; ) {
+    const bool included
+      = y.relation_with(x_cs[i]).implies(Poly_Con_Relation::is_included());
+    if (!included) {
+      row_union.union_assign(x_gs_red_in_y, x_sat[i]);
+      if (row_union != all_ones)
+        return false;
+    }
+  }
+
+  // Here we know that the upper bound is exact: compute it.
+  for (dimension_type j = y_gs_num_rows; j-- > 0; )
+    if (!y_gs_red_in_x[j])
+      add_generator(y_gs[j]);
+
+  PPL_ASSERT_HEAVY(OK());
+  return true;
+}
+
+bool
+PPL::Polyhedron::BHZ09_NNC_poly_hull_assign_if_exact(const Polyhedron& y) {
+  const Polyhedron& x = *this;
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(!x.is_necessarily_closed() && !y.is_necessarily_closed());
+  PPL_ASSERT(x.space_dim > 0 && x.space_dim == y.space_dim);
+  PPL_ASSERT(!x.is_empty() && !y.is_empty());
+
+  // Minimization is not really required, but it is probably the best
+  // way of getting constraints, generators and saturation matrices
+  // up-to-date.  Minimization also removes redundant
+  // constraints/generators.
+  (void) x.minimize();
+  (void) y.minimize();
+
+  const Generator_System& x_gs = x.gen_sys;
+  const Generator_System& y_gs = y.gen_sys;
+  const dimension_type x_gs_num_rows = x_gs.num_rows();
+  const dimension_type y_gs_num_rows = y_gs.num_rows();
+
+  // Compute generators of `x' that are non-redundant in `y' ...
+  Bit_Row x_gs_non_redundant_in_y;
+  Bit_Row x_points_non_redundant_in_y;
+  Bit_Row x_closure_points;
+  dimension_type num_x_gs_non_redundant_in_y = 0;
+  for (dimension_type i = x_gs_num_rows; i-- > 0; ) {
+    const Generator& x_gs_i = x_gs[i];
+    if (x_gs_i.is_closure_point())
+      x_closure_points.set(i);
+    if (y.relation_with(x_gs[i]).implies(Poly_Gen_Relation::subsumes()))
+      continue;
+    x_gs_non_redundant_in_y.set(i);
+    ++num_x_gs_non_redundant_in_y;
+    if (x_gs_i.is_point())
+      x_points_non_redundant_in_y.set(i);
+  }
+
+  // If `x' is included into `y', the upper bound `y' is exact.
+  if (num_x_gs_non_redundant_in_y == 0) {
+    *this = y;
+    return true;
+  }
+
+  // ... and vice versa, generators of `y' that are non-redundant in `x'.
+  Bit_Row y_gs_non_redundant_in_x;
+  Bit_Row y_points_non_redundant_in_x;
+  Bit_Row y_closure_points;
+  dimension_type num_y_gs_non_redundant_in_x = 0;
+  for (dimension_type i = y_gs_num_rows; i-- > 0; ) {
+    const Generator& y_gs_i = y_gs[i];
+    if (y_gs_i.is_closure_point())
+      y_closure_points.set(i);
+    if (x.relation_with(y_gs_i).implies(Poly_Gen_Relation::subsumes()))
+      continue;
+    y_gs_non_redundant_in_x.set(i);
+    ++num_y_gs_non_redundant_in_x;
+    if (y_gs_i.is_point())
+      y_points_non_redundant_in_x.set(i);
+  }
+
+  // If `y' is included into `x', the upper bound `x' is exact.
+  if (num_y_gs_non_redundant_in_x == 0)
+    return true;
+
+  Bit_Row x_non_points_non_redundant_in_y;
+  x_non_points_non_redundant_in_y
+    .difference_assign(x_gs_non_redundant_in_y,
+                       x_points_non_redundant_in_y);
+
+  const Constraint_System& x_cs = x.con_sys;
+  const Constraint_System& y_cs = y.con_sys;
+  const dimension_type x_cs_num_rows = x_cs.num_rows();
+  const dimension_type y_cs_num_rows = y_cs.num_rows();
+
+  // Filter away the points of `x_gs' that would be redundant
+  // in the topological closure of `y'.
+  Bit_Row x_points_non_redundant_in_y_closure;
+  for (dimension_type i = x_points_non_redundant_in_y.first();
+       i != C_Integer<unsigned long>::max;
+       i = x_points_non_redundant_in_y.next(i)) {
+    const Generator& x_p = x_gs[i];
+    PPL_ASSERT(x_p.is_point());
+    // NOTE: we cannot use Constraint_System::relation_with()
+    // as we need to treat strict inequalities as if they were nonstrict.
+    for (dimension_type j = y_cs_num_rows; j-- > 0; ) {
+      const Constraint& y_c = y_cs[j];
+      const int sp_sign = Scalar_Products::reduced_sign(y_c, x_p);
+      if (sp_sign < 0 || (y_c.is_equality() && sp_sign > 0)) {
+        x_points_non_redundant_in_y_closure.set(i);
+        break;
+      }
+    }
+  }
+
+  // Make sure the saturation matrix for `x' is up to date.
+  // Any sat matrix would do: we choose `sat_g' because it matches
+  // the two nested loops (constraints on rows and generators on columns).
+  if (!x.sat_g_is_up_to_date())
+    x.update_sat_g();
+  const Bit_Matrix& x_sat = x.sat_g;
+
+  Bit_Row x_cs_condition_3;
+  Bit_Row x_gs_condition_3;
+  Bit_Row all_ones;
+  all_ones.set_until(x_gs_num_rows);
+  Bit_Row saturators;
+  Bit_Row tmp_set;
+  for (dimension_type i = x_cs_num_rows; i-- > 0; ) {
+    const Constraint& x_c = x_cs[i];
+    // Skip constraint if it is not violated by `y'.
+    if (y.relation_with(x_c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    saturators.difference_assign(all_ones, x_sat[i]);
+    // Check condition 1.
+    tmp_set.intersection_assign(x_non_points_non_redundant_in_y, saturators);
+    if (!tmp_set.empty())
+      return false;
+    if (x_c.is_strict_inequality()) {
+      // Postpone check for condition 3.
+      x_cs_condition_3.set(i);
+      tmp_set.intersection_assign(x_closure_points, saturators);
+      x_gs_condition_3.union_assign(x_gs_condition_3, tmp_set);
+    }
+    else {
+      // Check condition 2.
+      tmp_set.intersection_assign(x_points_non_redundant_in_y_closure,
+                                  saturators);
+      if (!tmp_set.empty())
+        return false;
+    }
+  }
+
+  // Now exchange the roles of `x' and `y'
+  // (the statement of the NNC theorem in BHZ09 is symmetric).
+
+  Bit_Row y_non_points_non_redundant_in_x;
+  y_non_points_non_redundant_in_x
+    .difference_assign(y_gs_non_redundant_in_x,
+                       y_points_non_redundant_in_x);
+
+  // Filter away the points of `y_gs' that would be redundant
+  // in the topological closure of `x'.
+  Bit_Row y_points_non_redundant_in_x_closure;
+  for (dimension_type i = y_points_non_redundant_in_x.first();
+       i != C_Integer<unsigned long>::max;
+       i = y_points_non_redundant_in_x.next(i)) {
+    const Generator& y_p = y_gs[i];
+    PPL_ASSERT(y_p.is_point());
+    // NOTE: we cannot use Constraint_System::relation_with()
+    // as we need to treat strict inequalities as if they were nonstrict.
+    for (dimension_type j = x_cs_num_rows; j-- > 0; ) {
+      const Constraint& x_c = x_cs[j];
+      const int sp_sign = Scalar_Products::reduced_sign(x_c, y_p);
+      if (sp_sign < 0 || (x_c.is_equality() && sp_sign > 0)) {
+        y_points_non_redundant_in_x_closure.set(i);
+        break;
+      }
+    }
+  }
+
+  // Make sure the saturation matrix `sat_g' for `y' is up to date.
+  if (!y.sat_g_is_up_to_date())
+    y.update_sat_g();
+  const Bit_Matrix& y_sat = y.sat_g;
+
+  Bit_Row y_cs_condition_3;
+  Bit_Row y_gs_condition_3;
+  all_ones.clear();
+  all_ones.set_until(y_gs_num_rows);
+  for (dimension_type i = y_cs_num_rows; i-- > 0; ) {
+    const Constraint& y_c = y_cs[i];
+    // Skip constraint if it is not violated by `x'.
+    if (x.relation_with(y_c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    saturators.difference_assign(all_ones, y_sat[i]);
+    // Check condition 1.
+    tmp_set.intersection_assign(y_non_points_non_redundant_in_x, saturators);
+    if (!tmp_set.empty())
+      return false;
+    if (y_c.is_strict_inequality()) {
+      // Postpone check for condition 3.
+      y_cs_condition_3.set(i);
+      tmp_set.intersection_assign(y_closure_points, saturators);
+      y_gs_condition_3.union_assign(y_gs_condition_3, tmp_set);
+    }
+    else {
+      // Check condition 2.
+      tmp_set.intersection_assign(y_points_non_redundant_in_x_closure,
+                                  saturators);
+      if (!tmp_set.empty())
+        return false;
+    }
+  }
+
+  // Now considering condition 3.
+
+  if (x_cs_condition_3.empty() && y_cs_condition_3.empty()) {
+    // No test for condition 3 is needed.
+    // The hull is exact: compute it.
+    for (dimension_type j = y_gs_num_rows; j-- > 0; )
+      if (y_gs_non_redundant_in_x[j])
+        add_generator(y_gs[j]);
+    return true;
+  }
+
+  // We have anyway to compute the upper bound and its constraints too.
+  Polyhedron ub(x);
+  for (dimension_type j = y_gs_num_rows; j-- > 0; )
+    if (y_gs_non_redundant_in_x[j])
+      ub.add_generator(y_gs[j]);
+  (void) ub.minimize();
+  PPL_ASSERT(!ub.is_empty());
+
+  // NOTE: the following computation of x_gs_condition_3_not_in_y
+  // (resp., y_gs_condition_3_not_in_x) is not required for correctness.
+  // It is done so as to later apply a speculative test
+  // (i.e., a non-conclusive but computationally lighter test).
+
+  // Filter away from `x_gs_condition_3' those closure points
+  // that, when considered as points, would belong to `y',
+  // i.e., those that violate no strict constraint in `y_cs'.
+  Bit_Row x_gs_condition_3_not_in_y;
+  for (dimension_type i = y_cs_num_rows; i-- > 0; ) {
+    const Constraint& y_c = y_cs[i];
+    if (y_c.is_strict_inequality()) {
+      for (dimension_type j = x_gs_condition_3.first();
+           j != C_Integer<unsigned long>::max; j = x_gs_condition_3.next(j)) {
+        const Generator& x_cp = x_gs[j];
+        PPL_ASSERT(x_cp.is_closure_point());
+        const int sp_sign = Scalar_Products::reduced_sign(y_c, x_cp);
+        PPL_ASSERT(sp_sign >= 0);
+        if (sp_sign == 0) {
+          x_gs_condition_3.clear(j);
+          x_gs_condition_3_not_in_y.set(j);
+        }
+      }
+      if (x_gs_condition_3.empty())
+        break;
+    }
+  }
+  // Symmetrically, filter away from `y_gs_condition_3' those
+  // closure points that, when considered as points, would belong to `x',
+  // i.e., those that violate no strict constraint in `x_cs'.
+  Bit_Row y_gs_condition_3_not_in_x;
+  for (dimension_type i = x_cs_num_rows; i-- > 0; ) {
+    if (x_cs[i].is_strict_inequality()) {
+      const Constraint& x_c = x_cs[i];
+      for (dimension_type j = y_gs_condition_3.first();
+           j != C_Integer<unsigned long>::max; j = y_gs_condition_3.next(j)) {
+        const Generator& y_cp = y_gs[j];
+        PPL_ASSERT(y_cp.is_closure_point());
+        const int sp_sign = Scalar_Products::reduced_sign(x_c, y_cp);
+        PPL_ASSERT(sp_sign >= 0);
+        if (sp_sign == 0) {
+          y_gs_condition_3.clear(j);
+          y_gs_condition_3_not_in_x.set(j);
+        }
+      }
+      if (y_gs_condition_3.empty())
+        break;
+    }
+  }
+
+  // NOTE: here we apply the speculative test.
+  // Check if there exists a closure point in `x_gs_condition_3_not_in_y'
+  // or `y_gs_condition_3_not_in_x' that belongs (as point) to the hull.
+  // If so, the hull is not exact.
+  const Constraint_System& ub_cs = ub.constraints();
+  for (dimension_type i = ub_cs.num_rows(); i-- > 0; ) {
+    if (ub_cs[i].is_strict_inequality()) {
+      const Constraint& ub_c = ub_cs[i];
+      for (dimension_type j = x_gs_condition_3_not_in_y.first();
+           j != C_Integer<unsigned long>::max;
+           j = x_gs_condition_3_not_in_y.next(j)) {
+        const Generator& x_cp = x_gs[j];
+        PPL_ASSERT(x_cp.is_closure_point());
+        const int sp_sign = Scalar_Products::reduced_sign(ub_c, x_cp);
+        PPL_ASSERT(sp_sign >= 0);
+        if (sp_sign == 0)
+          x_gs_condition_3_not_in_y.clear(j);
+      }
+      for (dimension_type j = y_gs_condition_3_not_in_x.first();
+           j != C_Integer<unsigned long>::max;
+           j = y_gs_condition_3_not_in_x.next(j)) {
+        const Generator& y_cp = y_gs[j];
+        PPL_ASSERT(y_cp.is_closure_point());
+        const int sp_sign = Scalar_Products::reduced_sign(ub_c, y_cp);
+        PPL_ASSERT(sp_sign >= 0);
+        if (sp_sign == 0)
+          y_gs_condition_3_not_in_x.clear(j);
+      }
+    }
+  }
+
+  if (!(x_gs_condition_3_not_in_y.empty()
+        && y_gs_condition_3_not_in_x.empty()))
+    // There exist a closure point satisfying condition 3,
+    // hence the hull is not exact.
+    return false;
+
+  // The speculative test was not successful:
+  // apply the expensive (but conclusive) test for condition 3.
+
+  // Consider strict inequalities in `x' violated by `y'.
+  for (dimension_type i = x_cs_condition_3.first();
+       i != C_Integer<unsigned long>::max; i = x_cs_condition_3.next(i)) {
+    const Constraint& x_cs_i = x_cs[i];
+    PPL_ASSERT(x_cs_i.is_strict_inequality());
+    // Build the equality constraint induced by x_cs_i.
+    const Linear_Expression expr(x_cs_i.expression());
+    const Constraint eq_i(expr == 0);
+    PPL_ASSERT(!(ub.relation_with(eq_i)
+                 .implies(Poly_Con_Relation::is_disjoint())));
+    Polyhedron ub_inters_hyperplane(ub);
+    ub_inters_hyperplane.add_constraint(eq_i);
+    Polyhedron y_inters_hyperplane(y);
+    y_inters_hyperplane.add_constraint(eq_i);
+    if (!y_inters_hyperplane.contains(ub_inters_hyperplane))
+      // The hull is not exact.
+      return false;
+  }
+
+  // Consider strict inequalities in `y' violated by `x'.
+  for (dimension_type i = y_cs_condition_3.first();
+       i != C_Integer<unsigned long>::max; i = y_cs_condition_3.next(i)) {
+    const Constraint& y_cs_i = y_cs[i];
+    PPL_ASSERT(y_cs_i.is_strict_inequality());
+    // Build the equality constraint induced by y_cs_i.
+    const Constraint eq_i(Linear_Expression(y_cs_i.expression()) == 0);
+    PPL_ASSERT(!(ub.relation_with(eq_i)
+                 .implies(Poly_Con_Relation::is_disjoint())));
+    Polyhedron ub_inters_hyperplane(ub);
+    ub_inters_hyperplane.add_constraint(eq_i);
+    Polyhedron x_inters_hyperplane(x);
+    x_inters_hyperplane.add_constraint(eq_i);
+    if (!x_inters_hyperplane.contains(ub_inters_hyperplane))
+      // The hull is not exact.
+      return false;
+  }
+
+  // The hull is exact.
+  m_swap(ub);
+  return true;
+}
+
+bool
+PPL::Polyhedron::BFT00_poly_hull_assign_if_exact(const Polyhedron& y) {
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const Polyhedron& x = *this;
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x.is_necessarily_closed());
+  PPL_ASSERT(x.topology() == y.topology());
+  PPL_ASSERT(x.space_dim == y.space_dim);
+
+  // The zero-dim case is trivial.
+  if (x.space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the convex union is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+
+  // Implementation based on Algorithm 8.1 (page 15) in [BemporadFT00TR],
+  // generalized so as to also allow for unbounded polyhedra.
+  // The extension to unbounded polyhedra is obtained by mimicking
+  // what done in Algorithm 8.2 (page 19) with respect to
+  // Algorithm 6.2 (page 13).
+  // We also apply a couple of improvements (see steps 2.1, 3.1, 6.1, 7.1)
+  // so as to quickly handle special cases and avoid the splitting
+  // of equalities/lines into pairs of inequalities/rays.
+
+  (void) x.minimize();
+  (void) y.minimize();
+  const Constraint_System& x_cs = x.con_sys;
+  const Constraint_System& y_cs = y.con_sys;
+  const Generator_System& x_gs = x.gen_sys;
+  const Generator_System& y_gs = y.gen_sys;
+  const dimension_type x_gs_num_rows = x_gs.num_rows();
+  const dimension_type y_gs_num_rows = y_gs.num_rows();
+
+  // Step 1: generators of `x' that are redundant in `y', and vice versa.
+  std::vector<bool> x_gs_red_in_y(x_gs_num_rows, false);
+  dimension_type num_x_gs_red_in_y = 0;
+  for (dimension_type i = x_gs_num_rows; i-- > 0; )
+    if (y.relation_with(x_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+      x_gs_red_in_y[i] = true;
+      ++num_x_gs_red_in_y;
+    }
+  std::vector<bool> y_gs_red_in_x(y_gs_num_rows, false);
+  dimension_type num_y_gs_red_in_x = 0;
+  for (dimension_type i = y_gs_num_rows; i-- > 0; )
+    if (x.relation_with(y_gs[i]).implies(Poly_Gen_Relation::subsumes())) {
+      y_gs_red_in_x[i] = true;
+      ++num_y_gs_red_in_x;
+    }
+
+  // Step 2: if no redundant generator has been identified,
+  // then the union is not convex. CHECKME: why?
+  if (num_x_gs_red_in_y == 0 && num_y_gs_red_in_x == 0)
+    return false;
+
+  // Step 2.1: while at it, also perform quick inclusion tests.
+  if (num_y_gs_red_in_x == y_gs_num_rows)
+    // `y' is included into `x': union is convex.
+    return true;
+  if (num_x_gs_red_in_y == x_gs_num_rows) {
+    // `x' is included into `y': union is convex.
+    *this = y;
+    return true;
+  }
+
+  // Here we know that `x' is not included in `y', and vice versa.
+
+  // Step 3: constraints of `x' that are satisfied by `y', and vice versa.
+  const dimension_type x_cs_num_rows = x_cs.num_rows();
+  std::vector<bool> x_cs_red_in_y(x_cs_num_rows, false);
+  for (dimension_type i = x_cs_num_rows; i-- > 0; ) {
+    const Constraint& x_cs_i = x_cs[i];
+    if (y.relation_with(x_cs_i).implies(Poly_Con_Relation::is_included()))
+      x_cs_red_in_y[i] = true;
+    else if (x_cs_i.is_equality())
+      // Step 3.1: `x' has an equality not satisfied by `y':
+      // union is not convex (recall that `y' does not contain `x').
+      // NOTE: this would be false for NNC polyhedra.
+      // Example: x = { A == 0 }, y = { 0 < A <= 1 }.
+      return false;
+  }
+  const dimension_type y_cs_num_rows = y_cs.num_rows();
+  std::vector<bool> y_cs_red_in_x(y_cs_num_rows, false);
+  for (dimension_type i = y_cs_num_rows; i-- > 0; ) {
+    const Constraint& y_cs_i = y_cs[i];
+    if (x.relation_with(y_cs_i).implies(Poly_Con_Relation::is_included()))
+      y_cs_red_in_x[i] = true;
+    else if (y_cs_i.is_equality())
+      // Step 3.1: `y' has an equality not satisfied by `x':
+      // union is not convex (see explanation above).
+      return false;
+  }
+
+  // Loop in steps 5-9: for each pair of non-redundant generators,
+  // compute their "mid-point" and check if it is both in `x' and `y'.
+
+  // Note: reasoning at the polyhedral cone level.
+  Generator mid_g;
+
+  for (dimension_type i = x_gs_num_rows; i-- > 0; ) {
+    if (x_gs_red_in_y[i])
+      continue;
+    const Generator& x_g = x_gs[i];
+    const bool x_g_is_line = x_g.is_line_or_equality();
+    for (dimension_type j = y_gs_num_rows; j-- > 0; ) {
+      if (y_gs_red_in_x[j])
+        continue;
+      const Generator& y_g = y_gs[j];
+      const bool y_g_is_line = y_g.is_line_or_equality();
+
+      // Step 6: compute mid_g = x_g + y_g.
+      // NOTE: no need to actually compute the "mid-point",
+      // since any strictly positive combination would do.
+      mid_g = x_g;
+      mid_g.expr += y_g.expr;
+      // A zero ray is not a well formed generator.
+      const bool illegal_ray
+        = (mid_g.expr.inhomogeneous_term() == 0 && mid_g.expr.all_homogeneous_terms_are_zero());
+      // A zero ray cannot be generated from a line: this holds
+      // because x_row (resp., y_row) is not subsumed by y (resp., x).
+      PPL_ASSERT(!(illegal_ray && (x_g_is_line || y_g_is_line)));
+      if (illegal_ray)
+        continue;
+      mid_g.expr.normalize();
+      if (x_g_is_line) {
+        if (y_g_is_line)
+          // mid_row is a line too: sign normalization is needed.
+          mid_g.sign_normalize();
+        else
+          // mid_row is a ray/point.
+          mid_g.set_is_ray_or_point_or_inequality();
+      }
+      PPL_ASSERT(mid_g.OK());
+
+      // Step 7: check if mid_g is in the union of x and y.
+      if (x.relation_with(mid_g) == Poly_Gen_Relation::nothing()
+          && y.relation_with(mid_g) == Poly_Gen_Relation::nothing())
+        return false;
+
+      // If either x_g or y_g is a line, we should use its
+      // negation to produce another generator to be tested too.
+      // NOTE: exclusive-or is meant.
+      if (!x_g_is_line && y_g_is_line) {
+        // Step 6.1: (re-)compute mid_row = x_g - y_g.
+        mid_g = x_g;
+        mid_g.expr -= y_g.expr;
+        mid_g.expr.normalize();
+        PPL_ASSERT(mid_g.OK());
+        // Step 7.1: check if mid_g is in the union of x and y.
+        if (x.relation_with(mid_g) == Poly_Gen_Relation::nothing()
+            && y.relation_with(mid_g) == Poly_Gen_Relation::nothing())
+          return false;
+      }
+      else if (x_g_is_line && !y_g_is_line) {
+        // Step 6.1: (re-)compute mid_row = - x_row + y_row.
+        mid_g = y_g;
+        mid_g.expr -= x_g.expr;
+        mid_g.expr.normalize();
+        PPL_ASSERT(mid_g.OK());
+        // Step 7.1: check if mid_g is in the union of x and y.
+        if (x.relation_with(mid_g) == Poly_Gen_Relation::nothing()
+            && y.relation_with(mid_g) == Poly_Gen_Relation::nothing())
+          return false;
+      }
+    }
+  }
+
+  // Here we know that the union of x and y is convex.
+  // TODO: exploit knowledge on the cardinality of non-redundant
+  // constraints/generators to improve the convex-hull computation.
+  // Using generators allows for exploiting incrementality.
+  for (dimension_type j = 0; j < y_gs_num_rows; ++j) {
+    if (!y_gs_red_in_x[j])
+      add_generator(y_gs[j]);
+  }
+  PPL_ASSERT_HEAVY(OK());
+  return true;
+}
+
+void
+PPL::Polyhedron::drop_some_non_integer_points(const Variables_Set* vars_p,
+                                              Complexity_Class complexity) {
+  // There is nothing to do for an empty set of variables.
+  if (vars_p != 0 && vars_p->empty())
+    return;
+
+  // Any empty polyhedron does not contain integer points.
+  if (marked_empty())
+    return;
+
+  // A zero-dimensional, universe polyhedron has, by convention, an
+  // integer point.
+  if (space_dim == 0) {
+    set_empty();
+    return;
+  }
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators()) {
+    // Processing of pending generators is exponential in the worst case.
+    if (complexity != ANY_COMPLEXITY)
+      return;
+    else
+      process_pending_generators();
+  }
+  if (!constraints_are_up_to_date()) {
+    // Constraints update is exponential in the worst case.
+    if (complexity != ANY_COMPLEXITY)
+      return;
+    else
+      update_constraints();
+  }
+  // For NNC polyhedra we need to process any pending constraints.
+  if (!is_necessarily_closed() && has_pending_constraints()) {
+    if (complexity != ANY_COMPLEXITY)
+      return;
+    else if (!process_pending_constraints())
+      // We just discovered the polyhedron is empty.
+      return;
+  }
+
+  PPL_ASSERT(!has_pending_generators() && constraints_are_up_to_date());
+  PPL_ASSERT(is_necessarily_closed() || !has_pending_constraints());
+
+  bool changed = false;
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+
+  const bool con_sys_was_sorted = con_sys.is_sorted();
+
+  Variables_Set other_vars;
+  if (vars_p != 0) {
+    // Compute the complement of `*vars_p'.
+    for (dimension_type i = 0; i < space_dim; ++i) {
+      if (vars_p->find(i) == vars_p->end())
+        other_vars.insert(Variable(i));
+    }
+  }
+
+  for (dimension_type j = con_sys.sys.rows.size(); j-- > 0; ) {
+    Constraint& c = con_sys.sys.rows[j];
+    if (c.is_tautological())
+      continue;
+
+    if (!other_vars.empty()) {
+      // Skip constraints having a nonzero coefficient for a variable
+      // that does not occurr in the input set.
+      if (!c.expression().all_zeroes(other_vars))
+        continue;
+    }
+
+    if (!is_necessarily_closed()) {
+      // Transform all strict inequalities into non-strict ones,
+      // with the inhomogeneous term incremented by 1.
+      if (c.epsilon_coefficient() < 0) {
+        c.set_epsilon_coefficient(0);
+        Linear_Expression& e = c.expr;
+        e.set_inhomogeneous_term(e.inhomogeneous_term() - 1);
+        // Enforce normalization.
+        // FIXME: is this really necessary?
+        e.normalize();
+        PPL_ASSERT(c.OK());
+        changed = true;
+      }
+    }
+
+    // Compute the GCD of all the homogeneous terms.
+    gcd = c.expression().gcd(1, space_dim + 1);
+
+    if (gcd != 0 && gcd != 1) {
+      PPL_ASSERT(c.expr.inhomogeneous_term() % gcd != 0);
+
+      // If we have an equality, the polyhedron becomes empty.
+      if (c.is_equality()) {
+        set_empty();
+        return;
+      }
+
+      // Divide the inhomogeneous coefficients by the GCD.
+      c.expr.exact_div_assign(gcd, 1, space_dim + 1);
+
+      PPL_DIRTY_TEMP_COEFFICIENT(c_0);
+      c_0 = c.expr.inhomogeneous_term();
+      const int c_0_sign = sgn(c_0);
+      c_0 /= gcd;
+      if (c_0_sign < 0)
+        --c_0;
+      c.expr.set_inhomogeneous_term(c_0);
+      PPL_ASSERT(c.OK());
+      changed = true;
+    }
+  }
+
+  con_sys.set_sorted(!changed && con_sys_was_sorted);
+  PPL_ASSERT(con_sys.sys.OK());
+
+  if (changed) {
+    if (is_necessarily_closed())
+      con_sys.insert(Constraint::zero_dim_positivity());
+    else
+      con_sys.insert(Constraint::epsilon_leq_one());
+
+    // After changing the system of constraints, the generators
+    // are no longer up-to-date and the constraints are no longer
+    // minimized.
+    clear_generators_up_to_date();
+    clear_constraints_minimized();
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::positive_time_elapse_assign_impl(const Polyhedron& y) {
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(!is_necessarily_closed());
+
+  Polyhedron& x = *this;
+  // Dimension-compatibility checks.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("positive_time_elapse_assign(y)", "y", y);
+
+  // Dealing with the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  if (x.marked_empty() || y.marked_empty()
+      || (x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators())
+      || (y.has_pending_constraints() && !y.process_pending_constraints())
+      || (!y.generators_are_up_to_date() && !y.update_generators())) {
+    x.set_empty();
+    return;
+  }
+
+  // At this point both generator systems are up-to-date,
+  // possibly containing pending generators.
+
+  // The new system of generators that will replace the one of x.
+  Generator_System new_gs(x.gen_sys);
+  dimension_type num_rows = new_gs.num_rows();
+
+  // We are going to do all sorts of funny things with new_gs, so we better
+  // mark it unsorted.
+  // Note: `sorted' is an attribute of Linear_System, encapsulated by
+  // Generator_System; hence, the following is equivalent to
+  // new_gs.set_sorted(false).
+  new_gs.sys.set_sorted(false);
+
+  // Remove all points from new_gs and put them in 'x_points_gs' for later use.
+  // Notice that we do not remove the corresponding closure points.
+  Generator_System x_points_gs;
+  for (dimension_type i = num_rows; i-- > 0;) {
+    Generator &g = new_gs.sys.rows[i];
+    if (g.is_point()) {
+      x_points_gs.insert(g);
+      num_rows--;
+      swap(g, new_gs.sys.rows[num_rows]);
+    }
+  }
+  new_gs.sys.rows.resize(num_rows);
+
+  // When there are no pending rows, the pending row index points at
+  // the smallest non-valid row, i.e., it is equal to the number of rows.
+  // Hence, each time the system is manually resized, the pending row index
+  // must be updated.
+  new_gs.unset_pending_rows();
+  PPL_ASSERT(new_gs.sys.OK());
+
+  // We use a pointer in order to avoid copying the generator
+  // system when it is not necessary, i.e., when y is an NNC.
+  const Generator_System *gs = &y.gen_sys;
+  Generator_System y_gs;
+
+  // If y is closed, promote its generator system to not necessarily closed.
+  if (y.is_necessarily_closed()) {
+    y_gs = y.gen_sys;
+    y_gs.convert_into_non_necessarily_closed();
+    y_gs.add_corresponding_closure_points();
+    gs = &y_gs;
+  }
+
+  PPL_ASSERT(gs->OK());
+  //gs->ascii_dump(std::cout);
+  //IO_Operators::operator<<(std::cout, *gs);
+
+  const dimension_type gs_num_rows = gs->num_rows();
+
+  // For each generator g of y...
+  for (dimension_type i = gs_num_rows; i-- > 0; ) {
+    const Generator &g = gs->sys.rows[i];
+
+    switch (g.type()) {
+    case Generator::POINT:
+      // In principle, points should be added to new_gs as rays.
+      // However, for each point there is a corresponding closure point in "gs".
+      // Hence, we leave this operation to closure points.
+
+      // Insert into new_gs the sum of g and each point of x.
+      // For each original point gx of x...
+      for (dimension_type j = x_points_gs.sys.num_rows(); j-- > 0; ) {
+        const Generator &gx = x_points_gs.sys.rows[j];
+        PPL_ASSERT(gx.is_point());
+        // ...insert the point obtained as the sum of g and gx.
+        Generator new_g = g; // make a copy
+        Coefficient new_divisor = g.expr.inhomogeneous_term() * gx.expr.inhomogeneous_term();
+
+        new_g.expr.linear_combine(gx.expr, gx.expr.inhomogeneous_term(), g.expr.inhomogeneous_term());
+        new_g.expr.set_inhomogeneous_term(new_divisor);
+        if (new_g.is_not_necessarily_closed()) {
+          new_g.set_epsilon_coefficient(g.epsilon_coefficient());
+        }
+        new_g.expr.normalize();
+        PPL_ASSERT(new_g.OK());
+	new_gs.insert(new_g);
+      }
+      break;
+    case Generator::CLOSURE_POINT:
+      // If g is not the origin, insert g into new_gs, as a ray.
+      if (!g.expr.all_homogeneous_terms_are_zero()) {
+	// Turn a copy of g into a ray.
+	Generator g_as_a_ray = g;
+	g_as_a_ray.expr.set_inhomogeneous_term(0);
+	g_as_a_ray.expr.normalize();
+	PPL_ASSERT(g_as_a_ray.OK());
+	// Insert the ray.
+	new_gs.insert(g_as_a_ray);
+      }
+      break;
+    case Generator::RAY:
+    case Generator::LINE:
+      // Insert g into new_gs.
+      new_gs.insert(g);
+      break;
+    }
+  }
+  new_gs.add_corresponding_closure_points();
+  // Notice: add_corresponding_closure_points adds them as pending.
+  new_gs.unset_pending_rows();
+
+  //Polyhedron new_x(...,new_gs);
+  //swap(x,new_x);
+
+  PPL_ASSERT(new_gs.sys.OK());
+
+  // Stealing the rows from `new_gs'.
+  using std::swap;
+  swap(gen_sys, new_gs);
+
+  gen_sys.set_sorted(false);
+  clear_generators_minimized();
+  // Generators are now up-to-date.
+  set_generators_up_to_date();
+  // Constraints are not up-to-date.
+  clear_constraints_up_to_date();
+
+  PPL_ASSERT_HEAVY(x.OK(true) && y.OK(true));
+}
+
+void
+PPL::Polyhedron::throw_invalid_argument(const char* method,
+                                        const char* reason) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+                                             const char* ph_name,
+                                             const Polyhedron& ph) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << ph_name << " is a ";
+  if (ph.is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron." << std::endl;
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+                                             const char* c_name,
+                                             const Constraint&) const {
+  PPL_ASSERT(is_necessarily_closed());
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << c_name << " is a strict inequality.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+                                             const char* g_name,
+                                             const Generator&) const {
+  PPL_ASSERT(is_necessarily_closed());
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << g_name << " is a closure point.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+                                             const char* cs_name,
+                                             const Constraint_System&) const {
+  PPL_ASSERT(is_necessarily_closed());
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << cs_name << " contains strict inequalities.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_topology_incompatible(const char* method,
+                                             const char* gs_name,
+                                             const Generator_System&) const {
+  std::ostringstream s;
+  s << "PPL::C_Polyhedron::" << method << ":" << std::endl
+    << gs_name << " contains closure points.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* other_name,
+                                              dimension_type other_dim) const {
+  std::ostringstream s;
+  s << "PPL::"
+    << (is_necessarily_closed() ? "C_" : "NNC_")
+    << "Polyhedron::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << other_name << ".space_dimension() == " << other_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* ph_name,
+                                              const Polyhedron& ph) const {
+  throw_dimension_incompatible(method, ph_name, ph.space_dimension());
+}
+
+void
+PPL::Polyhedron
+::throw_dimension_incompatible(const char* method,
+                               const char* le_name,
+                               const Linear_Expression& le) const {
+  throw_dimension_incompatible(method, le_name, le.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* c_name,
+                                              const Constraint& c) const {
+  throw_dimension_incompatible(method, c_name, c.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* g_name,
+                                              const Generator& g) const {
+  throw_dimension_incompatible(method, g_name, g.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* cg_name,
+                                              const Congruence& cg) const {
+  throw_dimension_incompatible(method, cg_name, cg.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* cs_name,
+                                              const Constraint_System& cs) const {
+  throw_dimension_incompatible(method, cs_name, cs.space_dimension());
+}
+
+void
+PPL::Polyhedron
+::throw_dimension_incompatible(const char* method,
+                               const char* gs_name,
+                               const Generator_System& gs) const {
+  throw_dimension_incompatible(method, gs_name, gs.space_dimension());
+}
+
+void
+PPL::Polyhedron
+::throw_dimension_incompatible(const char* method,
+                               const char* cgs_name,
+                               const Congruence_System& cgs) const {
+  throw_dimension_incompatible(method, cgs_name, cgs.space_dimension());
+}
+
+void
+PPL::Polyhedron::throw_dimension_incompatible(const char* method,
+                                              const char* var_name,
+                                              const Variable var) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension() << ", "
+    << var_name << ".space_dimension() == " << var.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::
+throw_dimension_incompatible(const char* method,
+                             dimension_type required_space_dim) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required space dimension == " << required_space_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+PPL::dimension_type
+PPL::Polyhedron::check_space_dimension_overflow(const dimension_type dim,
+                                                const dimension_type max,
+                                                const Topology topol,
+                                                const char* method,
+                                                const char* reason) {
+  const char* const domain = (topol == NECESSARILY_CLOSED)
+    ? "PPL::C_Polyhedron::" : "PPL::NNC_Polyhedron::";
+  return PPL::check_space_dimension_overflow(dim, max, domain, method, reason);
+}
+
+PPL::dimension_type
+PPL::Polyhedron::check_space_dimension_overflow(const dimension_type dim,
+                                                const Topology topol,
+                                                const char* method,
+                                                const char* reason) {
+  return check_space_dimension_overflow(dim, Polyhedron::max_space_dimension(),
+                                        topol, method, reason);
+}
+
+void
+PPL::Polyhedron::throw_invalid_generator(const char* method,
+                                         const char* g_name) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "*this is an empty polyhedron and "
+    << g_name << " is not a point.";
+  throw std::invalid_argument(s.str());
+}
+
+void
+PPL::Polyhedron::throw_invalid_generators(const char* method,
+                                          const char* gs_name) const {
+  std::ostringstream s;
+  s << "PPL::";
+  if (is_necessarily_closed())
+    s << "C_";
+  else
+    s << "NNC_";
+  s << "Polyhedron::" << method << ":" << std::endl
+    << "*this is an empty polyhedron and" << std::endl
+    << "the non-empty generator system " << gs_name << " contains no points.";
+  throw std::invalid_argument(s.str());
+}
diff --git a/src/Polyhedron_public.cc b/src/Polyhedron_public.cc
new file mode 100644
index 0000000..0cebe75
--- /dev/null
+++ b/src/Polyhedron_public.cc
@@ -0,0 +1,3747 @@
+/* Polyhedron class implementation (non-inline public functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "MIP_Problem_defs.hh"
+#include "wrap_assign.hh"
+#include "assert.hh"
+#include <cstdlib>
+#include <iostream>
+
+#ifndef ENSURE_SORTEDNESS
+#define ENSURE_SORTEDNESS 0
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type* PPL::Polyhedron::simplify_num_saturators_p = 0;
+
+size_t PPL::Polyhedron::simplify_num_saturators_size = 0;
+
+void
+PPL::Polyhedron::initialize() {
+  PPL_ASSERT(simplify_num_saturators_p == 0);
+  PPL_ASSERT(simplify_num_saturators_size == 0);
+  simplify_num_saturators_p = new dimension_type[simplify_num_saturators_size];
+}
+
+void
+PPL::Polyhedron::finalize() {
+  delete [] simplify_num_saturators_p;
+  simplify_num_saturators_p = 0;
+  simplify_num_saturators_size = 0;
+}
+
+PPL::dimension_type
+PPL::Polyhedron::affine_dimension() const {
+  if (is_empty())
+    return 0;
+
+  const Constraint_System& cs = minimized_constraints();
+  dimension_type d = space_dim;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    if (i->is_equality())
+      --d;
+  return d;
+}
+
+const PPL::Constraint_System&
+PPL::Polyhedron::constraints() const {
+  if (marked_empty()) {
+    // We want `con_sys' to only contain the unsatisfiable constraint
+    // of the appropriate dimension.
+    if (con_sys.has_no_rows()) {
+      // The 0-dim unsatisfiable constraint is extended to
+      // the appropriate dimension and then stored in `con_sys'.
+      Constraint_System unsat_cs = Constraint_System::zero_dim_empty();
+      unsat_cs.adjust_topology_and_space_dimension(topology(), space_dim);
+      swap(const_cast<Constraint_System&>(con_sys), unsat_cs);
+    }
+    else {
+      // Checking that `con_sys' contains the right thing.
+      PPL_ASSERT(con_sys.space_dimension() == space_dim);
+      PPL_ASSERT(con_sys.num_rows() == 1);
+      PPL_ASSERT(con_sys[0].is_inconsistent());
+    }
+    return con_sys;
+  }
+
+  if (space_dim == 0) {
+    // Zero-dimensional universe.
+    PPL_ASSERT(con_sys.num_rows() == 0 && con_sys.space_dimension() == 0);
+    return con_sys;
+  }
+
+  // If the polyhedron has pending generators, we process them to obtain
+  // the constraints. No processing is needed if the polyhedron has
+  // pending constraints.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  // TODO: reconsider whether to really sort constraints at this stage.
+#if ENSURE_SORTEDNESS
+  // We insist in returning a sorted system of constraints,
+  // but sorting is useless if there are pending constraints.
+  if (!has_pending_constraints())
+    obtain_sorted_constraints();
+#endif
+  return con_sys;
+}
+
+const PPL::Constraint_System&
+PPL::Polyhedron::minimized_constraints() const {
+  // `minimize()' or `strongly_minimize_constraints()'
+  // will process any pending constraints or generators.
+  if (is_necessarily_closed())
+    minimize();
+  else
+    strongly_minimize_constraints();
+  return constraints();
+}
+
+const PPL::Generator_System&
+PPL::Polyhedron::generators() const {
+  if (marked_empty()) {
+    PPL_ASSERT(gen_sys.has_no_rows());
+    // We want `gen_sys' to have the appropriate space dimension,
+    // even though it is an empty generator system.
+    if (gen_sys.space_dimension() != space_dim) {
+      Generator_System gs;
+      gs.adjust_topology_and_space_dimension(topology(), space_dim);
+      swap(const_cast<Generator_System&>(gen_sys), gs);
+    }
+    return gen_sys;
+  }
+
+  if (space_dim == 0) {
+    PPL_ASSERT(gen_sys.num_rows() == 0 && gen_sys.space_dimension() == 0);
+    return Generator_System::zero_dim_univ();
+  }
+
+  // If the polyhedron has pending constraints, we process them to obtain
+  // the generators (we may discover that the polyhedron is empty).
+  // No processing is needed if the polyhedron has pending generators.
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // We have just discovered that `*this' is empty.
+    PPL_ASSERT(gen_sys.has_no_rows());
+    // We want `gen_sys' to have the appropriate space dimension,
+    // even though it is an empty generator system.
+    if (gen_sys.space_dimension() != space_dim) {
+      Generator_System gs;
+      gs.adjust_topology_and_space_dimension(topology(), space_dim);
+      swap(const_cast<Generator_System&>(gen_sys), gs);
+    }
+    return gen_sys;
+  }
+
+  // TODO: reconsider whether to really sort generators at this stage.
+#if ENSURE_SORTEDNESS
+  // We insist in returning a sorted system of generators,
+  // but sorting is useless if there are pending generators.
+  if (!has_pending_generators())
+    obtain_sorted_generators();
+#else
+  // In the case of an NNC polyhedron, if the generator system is fully
+  // minimized (i.e., minimized and with no pending generator), then
+  // return a sorted system of generators: this is needed so that the
+  // const_iterator could correctly filter out the matched closure points.
+  if (!is_necessarily_closed()
+      && generators_are_minimized() && !has_pending_generators())
+    obtain_sorted_generators();
+#endif
+  return gen_sys;
+}
+
+const PPL::Generator_System&
+PPL::Polyhedron::minimized_generators() const {
+  // `minimize()' or `strongly_minimize_generators()'
+  // will process any pending constraints or generators.
+  if (is_necessarily_closed())
+    minimize();
+  else
+    strongly_minimize_generators();
+  // Note: calling generators() on a strongly minimized NNC generator
+  // system will also ensure sortedness, which is required to correctly
+  // filter away the matched closure points.
+  return generators();
+}
+
+PPL::Poly_Con_Relation
+PPL::Polyhedron::relation_with(const Constraint& c) const {
+  // Dimension-compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("relation_with(c)", "c", c);
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (c.is_inconsistent())
+      if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+        // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+        // thus, the zero-dimensional point also saturates it.
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // The polyhedron is empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  return gen_sys.relation_with(c);
+}
+
+PPL::Poly_Gen_Relation
+PPL::Polyhedron::relation_with(const Generator& g) const {
+  // Dimension-compatibility check.
+  if (space_dim < g.space_dimension())
+    throw_dimension_incompatible("relation_with(g)", "g", g);
+
+  // The empty polyhedron cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe polyhedron in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  return
+    con_sys.satisfies_all_constraints(g)
+    ? Poly_Gen_Relation::subsumes()
+    : Poly_Gen_Relation::nothing();
+}
+
+PPL::Poly_Con_Relation
+PPL::Polyhedron::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (space_dim < cg_space_dim)
+    throw_dimension_incompatible("relation_with(cg)", "cg", cg);
+
+  if (cg.is_equality()) {
+    const Constraint c(cg);
+    return relation_with(c);
+  }
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // The polyhedron is empty.
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  // Build the equality corresponding to the congruence (ignoring the modulus).
+  Linear_Expression expr(cg.expression());
+  const Constraint c(expr == 0);
+
+  // The polyhedron is non-empty so that there exists a point.
+  // For an arbitrary generator point, compute the scalar product with
+  // the equality.
+  PPL_DIRTY_TEMP_COEFFICIENT(sp_point);
+  for (Generator_System::const_iterator gs_i = gen_sys.begin(),
+         gs_end = gen_sys.end(); gs_i != gs_end; ++gs_i) {
+    if (gs_i->is_point()) {
+      Scalar_Products::assign(sp_point, c, *gs_i);
+      expr -= sp_point;
+      break;
+    }
+  }
+
+  // Find two hyperplanes that satisfy the congruence and are near to
+  // the generating point (so that the point lies on or between these
+  // two hyperplanes).
+  // Then use the relations between the polyhedron and the halfspaces
+  // corresponding to the hyperplanes to determine the result.
+
+  // Compute the distance from the point to an hyperplane.
+  const Coefficient& modulus = cg.modulus();
+  PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+  signed_distance = sp_point % modulus;
+  if (signed_distance == 0)
+    // The point is lying on the hyperplane.
+    return relation_with(expr == 0);
+  else
+    // The point is not lying on the hyperplane.
+    expr += signed_distance;
+
+  // Build first halfspace constraint.
+  const bool positive = (signed_distance > 0);
+  const Constraint first_halfspace = positive ? (expr >= 0) : (expr <= 0);
+
+  const Poly_Con_Relation first_rels = relation_with(first_halfspace);
+  PPL_ASSERT(!first_rels.implies(Poly_Con_Relation::saturates())
+             && !first_rels.implies(Poly_Con_Relation::is_disjoint()));
+  if (first_rels.implies(Poly_Con_Relation::strictly_intersects()))
+    return Poly_Con_Relation::strictly_intersects();
+
+  // Build second halfspace.
+  if (positive)
+    expr -= modulus;
+  else
+    expr += modulus;
+  const Constraint second_halfspace = positive ? (expr <= 0) : (expr >= 0);
+
+  PPL_ASSERT(first_rels == Poly_Con_Relation::is_included());
+  const Poly_Con_Relation second_rels = relation_with(second_halfspace);
+  PPL_ASSERT(!second_rels.implies(Poly_Con_Relation::saturates())
+             && !second_rels.implies(Poly_Con_Relation::is_disjoint()));
+  if (second_rels.implies(Poly_Con_Relation::strictly_intersects()))
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_ASSERT(second_rels == Poly_Con_Relation::is_included());
+  return Poly_Con_Relation::is_disjoint();
+}
+
+bool
+PPL::Polyhedron::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  if (space_dim == 0)
+    return true;
+
+  if (!has_pending_generators() && constraints_are_up_to_date()) {
+    // Search for a constraint that is not a tautology.
+    for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+      if (!con_sys[i].is_tautological())
+        return false;
+    // All the constraints are tautologies.
+    return true;
+  }
+
+  PPL_ASSERT(!has_pending_constraints() && generators_are_up_to_date());
+
+  // Try a fast-fail test.
+  dimension_type num_lines = 0;
+  dimension_type num_rays = 0;
+  const dimension_type first_pending = gen_sys.first_pending_row();
+  for (dimension_type i = first_pending; i-- > 0; )
+    switch (gen_sys[i].type()) {
+    case Generator::RAY:
+      ++num_rays;
+      break;
+    case Generator::LINE:
+      ++num_lines;
+      break;
+    default:
+      break;
+    }
+
+  if (has_pending_generators()) {
+    // The non-pending part of `gen_sys' was minimized:
+    // a success-first test is possible in this case.
+    PPL_ASSERT(generators_are_minimized());
+    if (num_lines == space_dim) {
+      PPL_ASSERT(num_rays == 0);
+      return true;
+    }
+    PPL_ASSERT(num_lines < space_dim);
+    // Now scan the pending generators.
+    dimension_type num_pending_lines = 0;
+    dimension_type num_pending_rays = 0;
+    const dimension_type gs_num_rows = gen_sys.num_rows();
+    for (dimension_type i = first_pending; i < gs_num_rows; ++i)
+      switch (gen_sys[i].type()) {
+      case Generator::RAY:
+        ++num_pending_rays;
+        break;
+      case Generator::LINE:
+        ++num_pending_lines;
+        break;
+      default:
+        break;
+      }
+    // If no pending rays and lines were found,
+    // then it is not the universe polyhedron.
+    if (num_pending_rays == 0 && num_pending_lines == 0)
+      return false;
+    // Factor away the lines already seen (to be on the safe side,
+    // we assume they are all linearly independent).
+    if (num_lines + num_pending_lines < space_dim) {
+      const dimension_type num_dims_missing
+        = space_dim - (num_lines + num_pending_lines);
+      // In order to span an n dimensional space (where n = num_dims_missing),
+      // at least n+1 rays are needed.
+      if (num_rays + num_pending_rays <= num_dims_missing)
+        return false;
+    }
+  }
+  else {
+    // There is nothing pending.
+    if (generators_are_minimized()) {
+      // The exact test is possible.
+      PPL_ASSERT(num_rays == 0 || num_lines < space_dim);
+      return num_lines == space_dim;
+    }
+    else
+      // Only the fast-fail test can be computed: in order to span
+      // an n dimensional space (where n = space_dim - num_lines),
+      // at least n+1 rays are needed.
+      if (num_lines < space_dim && num_lines + num_rays <= space_dim)
+        return false;
+  }
+
+  // We need the polyhedron in minimal form.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_minimized())
+    minimize();
+  if (is_necessarily_closed())
+    return con_sys.num_rows() == 1
+      && con_sys[0].is_inequality()
+      && con_sys[0].is_tautological();
+  else {
+    // NNC polyhedron.
+    if (con_sys.num_rows() != 2
+        || con_sys[0].is_equality()
+        || con_sys[1].is_equality())
+      return false;
+    else {
+      // If the system of constraints contains two rows that
+      // are not equalities, we are sure that they are
+      // epsilon constraints: in this case we know that
+      // the polyhedron is universe.
+#ifndef NDEBUG
+      obtain_sorted_constraints();
+      const Constraint& eps_leq_one = con_sys[0];
+      const Constraint& eps_geq_zero = con_sys[1];
+      PPL_ASSERT(eps_leq_one.inhomogeneous_term() > 0
+                 && eps_leq_one.epsilon_coefficient() < 0
+                 && eps_geq_zero.inhomogeneous_term() == 0
+                 && eps_geq_zero.epsilon_coefficient() > 0);
+      PPL_ASSERT(eps_leq_one.expression().all_homogeneous_terms_are_zero());
+      PPL_ASSERT(eps_geq_zero.expression().all_homogeneous_terms_are_zero());
+#endif
+      return true;
+    }
+  }
+}
+
+bool
+PPL::Polyhedron::is_bounded() const {
+  // A zero-dimensional or empty polyhedron is bounded.
+  if (space_dim == 0
+      || marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return true;
+
+  // If the system of generators contains any line or a ray,
+  // then the polyhedron is unbounded.
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+    if (gen_sys[i].is_line_or_ray())
+      return false;
+
+  // The system of generators is composed only by
+  // points and closure points: the polyhedron is bounded.
+  return true;
+}
+
+bool
+PPL::Polyhedron::is_topologically_closed() const {
+  // Necessarily closed polyhedra are trivially closed.
+  if (is_necessarily_closed())
+    return true;
+  // Any empty or zero-dimensional polyhedron is closed.
+  if (marked_empty()
+      || space_dim == 0
+      || (has_something_pending() && !process_pending()))
+    return true;
+
+  // At this point there are no pending constraints or generators.
+  PPL_ASSERT(!has_something_pending());
+
+  if (generators_are_minimized()) {
+    // A polyhedron is closed if and only if all of its (non-redundant)
+    // closure points are matched by a corresponding point.
+    const dimension_type n_rows = gen_sys.num_rows();
+    const dimension_type n_lines = gen_sys.num_lines();
+    for (dimension_type i = n_rows; i-- > n_lines; ) {
+      const Generator& gen_sys_i = gen_sys[i];
+      if (gen_sys_i.is_closure_point()) {
+        bool gen_sys_i_has_no_matching_point = true;
+        for (dimension_type j = n_rows; j-- > n_lines; ) {
+          const Generator& gen_sys_j = gen_sys[j];
+          if (i != j
+              && gen_sys_j.is_point()
+              && gen_sys_i.is_matching_closure_point(gen_sys_j)) {
+            gen_sys_i_has_no_matching_point = false;
+            break;
+          }
+        }
+        if (gen_sys_i_has_no_matching_point)
+          return false;
+      }
+    }
+    // All closure points are matched.
+    return true;
+  }
+
+  // A polyhedron is closed if, after strong minimization
+  // of its constraint system, it has no strict inequalities.
+  strongly_minimize_constraints();
+  return marked_empty() || !con_sys.has_strict_inequalities();
+}
+
+bool
+PPL::Polyhedron::contains_integer_point() const {
+  // Any empty polyhedron does not contain integer points.
+  if (marked_empty())
+    return false;
+
+  // A zero-dimensional, universe polyhedron has, by convention, an
+  // integer point.
+  if (space_dim == 0)
+    return true;
+
+  // CHECKME: do we really want to call conversion to check for emptiness?
+  if (has_pending_constraints() && !process_pending())
+    // Empty again.
+    return false;
+
+  // FIXME: do also exploit info regarding rays and lines, if possible.
+  // Is any integer point already available?
+  PPL_ASSERT(!has_pending_constraints());
+  if (generators_are_up_to_date())
+    for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+      if (gen_sys[i].is_point() && gen_sys[i].divisor() == 1)
+        return true;
+
+  const Constraint_System& cs = constraints();
+#if 0 // TEMPORARILY DISABLED.
+  MIP_Problem mip(space_dim,
+                  cs.begin(), cs.end(),
+                  Variables_Set(Variable(0), Variable(space_dim-1)));
+#else
+  // FIXME: temporary workaround, to be removed as soon as the MIP
+  // problem class will correctly and precisely handle
+  // ((strict) in-) equality constraints having all integer variables.
+  MIP_Problem mip(space_dim);
+  mip.add_to_integer_space_dimensions(Variables_Set(Variable(0),
+                                                    Variable(space_dim-1)));
+  PPL_DIRTY_TEMP_COEFFICIENT(homogeneous_gcd);
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  PPL_DIRTY_TEMP(mpq_class, rational_inhomogeneous);
+  PPL_DIRTY_TEMP_COEFFICIENT(tightened_inhomogeneous);
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    const Constraint::Type c_type = c.type();
+    const Coefficient& inhomogeneous = c.inhomogeneous_term();
+    if (c_type == Constraint::STRICT_INEQUALITY) {
+      // CHECKME: should we change the behavior of Linear_Expression(c) ?
+      // Compute the GCD of the coefficients of c
+      // (disregarding the inhomogeneous term and the epsilon dimension).
+      homogeneous_gcd = c.expression().gcd(1, space_dim + 1);
+      if (homogeneous_gcd == 0) {
+        // NOTE: since tautological constraints are already filtered away
+        // by iterators, here we must have an inconsistent constraint.
+        PPL_ASSERT(c.is_inconsistent());
+        return false;
+      }
+      Linear_Expression le(c.expression());
+      if (homogeneous_gcd != 1)
+        le /= homogeneous_gcd;
+      // Further tighten the constraint if the inhomogeneous term
+      // was integer, i.e., if `homogeneous_gcd' divides `inhomogeneous'.
+      gcd_assign(gcd, homogeneous_gcd, inhomogeneous);
+      if (gcd == homogeneous_gcd)
+        le -= 1;
+      mip.add_constraint(le >= 0);
+    }
+    else {
+      // Equality or non-strict inequality.
+      // If possible, avoid useless gcd computations.
+      if (inhomogeneous == 0)
+        // The inhomogeneous term cannot be tightened.
+        mip.add_constraint(c);
+      else {
+        // Compute the GCD of the coefficients of c
+        // (disregarding the inhomogeneous term)
+        // to see whether or not the inhomogeneous term can be tightened.
+        homogeneous_gcd = c.expression().gcd(1, space_dim + 1);
+        if (homogeneous_gcd == 0) {
+          // NOTE: since tautological constraints are already filtered away
+          // by iterators, here we must have an inconsistent constraint.
+          PPL_ASSERT(c.is_inconsistent());
+          return false;
+        }
+        else if (homogeneous_gcd == 1)
+          // The normalized inhomogeneous term is integer:
+          // add the constraint as-is.
+          mip.add_constraint(c);
+        else {
+          PPL_ASSERT(homogeneous_gcd > 1);
+          // Here the normalized inhomogeneous term is rational:
+          // the constraint has to be tightened.
+#ifndef NDEBUG
+          // `homogeneous_gcd' does not divide `inhomogeneous'.
+          // FIXME: add a divisibility test for Coefficient.
+          gcd_assign(gcd, homogeneous_gcd, inhomogeneous);
+          PPL_ASSERT(gcd == 1);
+#endif
+          if (c.type() == Constraint::EQUALITY)
+            return false;
+          // Extract the homogeneous part of the constraint.
+          Linear_Expression le(c.expression());
+          le -= inhomogeneous;
+          // Tighten the inhomogeneous term.
+          assign_r(rational_inhomogeneous.get_num(),
+                   inhomogeneous, ROUND_NOT_NEEDED);
+          assign_r(rational_inhomogeneous.get_den(),
+                   homogeneous_gcd, ROUND_NOT_NEEDED);
+          // Note: canonicalization is not needed (as gcd == 1).
+          PPL_ASSERT(is_canonical(rational_inhomogeneous));
+          assign_r(tightened_inhomogeneous,
+                   rational_inhomogeneous, ROUND_DOWN);
+          tightened_inhomogeneous *= homogeneous_gcd;
+          le += tightened_inhomogeneous;
+          mip.add_constraint(le >= 0);
+        }
+      }
+    }
+  }
+#endif // TEMPORARY WORKAROUND.
+  return mip.is_satisfiable();
+}
+
+bool
+PPL::Polyhedron::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // An empty polyhedron constrains all variables.
+  if (marked_empty())
+    return true;
+
+  if (generators_are_up_to_date() && !has_pending_constraints()) {
+    // Since generators are up-to-date and there are no pending
+    // constraints, the generator system (since it is well formed)
+    // contains a point.  Hence the polyhedron is not empty.
+    if (constraints_are_up_to_date() && !has_pending_generators())
+      // Here a variable is constrained if and only if it is
+      // syntactically constrained.
+      goto syntactic_check;
+
+    if (generators_are_minimized()) {
+      // Try a quick, incomplete check for the universe polyhedron:
+      // a universe polyhedron constrains no variable.
+      // Count the number of non-pending
+      // (hence, linearly independent) lines.
+      dimension_type num_lines = 0;
+      const dimension_type first_pending = gen_sys.first_pending_row();
+      for (dimension_type i = first_pending; i-- > 0; )
+        if (gen_sys[i].is_line())
+          ++num_lines;
+
+      if (num_lines == space_dim)
+        return false;
+    }
+
+    // Scan generators: perhaps we will find a generator equivalent to
+    // line(var) or a pair of generators equivalent to ray(-var) and
+    // ray(var).
+    bool have_positive_ray = false;
+    bool have_negative_ray = false;
+    const dimension_type var_id = var.id();
+    for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+      const Generator& gen_sys_i = gen_sys[i];
+      if (gen_sys_i.is_line_or_ray()) {
+        const int sign = sgn(gen_sys_i.coefficient(var));
+        if (sign != 0) {
+          if (gen_sys_i.expression().all_zeroes(1, var_id)
+              && gen_sys_i.expression().all_zeroes(var_id + 1, space_dim + 1)) {
+            
+            if (gen_sys_i.is_line())
+              return true;
+            if (sign > 0)
+              if (have_negative_ray)
+                return true;
+              else
+                have_positive_ray = true;
+            else if (have_positive_ray)
+              return true;
+            else
+              have_negative_ray = true;
+          }
+        }
+      }
+    }
+
+    // We are still here: at least we know that, since generators are
+    // up-to-date and there are no pending constraints, then the
+    // generator system (since it is well formed) contains a point.
+    // Hence the polyhedron is not empty.
+    if (has_pending_generators())
+      process_pending_generators();
+    else if (!constraints_are_up_to_date())
+      update_constraints();
+    goto syntactic_check;
+  }
+
+  // We must minimize to detect emptiness and obtain constraints.
+  if (!minimize())
+    return true;
+
+ syntactic_check:
+  for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+    if (con_sys[i].coefficient(var) != 0)
+      return true;
+  return false;
+}
+
+bool
+PPL::Polyhedron::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // Check whether the topologies of `con_sys' and `gen_sys' agree.
+  if (con_sys.topology() != gen_sys.topology()) {
+#ifndef NDEBUG
+    cerr << "Constraints and generators have different topologies!"
+         << endl;
+#endif
+    goto bomb;
+  }
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    goto bomb;
+
+  if (marked_empty()) {
+    if (check_not_empty) {
+      // The caller does not want the polyhedron to be empty.
+#ifndef NDEBUG
+      cerr << "Empty polyhedron!" << endl;
+#endif
+      goto bomb;
+    }
+
+    // An empty polyhedron is allowed if the system of constraints
+    // either has no rows or only contains an unsatisfiable constraint
+    // and if it has no pending constraints or generators.
+    if (has_something_pending()) {
+#ifndef NDEBUG
+      cerr << "The polyhedron is empty, "
+           << "but it has something pending" << endl;
+#endif
+      goto bomb;
+    }
+    if (con_sys.has_no_rows())
+      return true;
+    else {
+      if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+        cerr << "The polyhedron is in a space of dimension "
+             << space_dim
+             << " while the system of constraints is in a space of dimension "
+             << con_sys.space_dimension()
+             << endl;
+#endif
+        goto bomb;
+      }
+      if (con_sys.num_rows() != 1) {
+#ifndef NDEBUG
+        cerr << "The system of constraints for an empty polyhedron "
+             << "has more then one row"
+             << endl;
+#endif
+        goto bomb;
+      }
+      if (!con_sys[0].is_inconsistent()) {
+#ifndef NDEBUG
+        cerr << "Empty polyhedron with a satisfiable system of constraints"
+             << endl;
+#endif
+        goto bomb;
+      }
+      // Here we have only one, inconsistent constraint.
+      return true;
+    }
+  }
+
+  // A zero-dimensional, non-empty polyhedron is legal only if the
+  // system of constraint `con_sys' and the system of generators
+  // `gen_sys' have no rows.
+  if (space_dim == 0) {
+    if (has_something_pending()) {
+#ifndef NDEBUG
+      cerr << "Zero-dimensional polyhedron with something pending"
+           << endl;
+#endif
+      goto bomb;
+    }
+    if (!con_sys.has_no_rows() || !gen_sys.has_no_rows()) {
+#ifndef NDEBUG
+      cerr << "Zero-dimensional polyhedron with a non-empty"
+           << endl
+           << "system of constraints or generators."
+           << endl;
+#endif
+      goto bomb;
+    }
+    return true;
+  }
+
+  // A polyhedron is defined by a system of constraints
+  // or a system of generators: at least one of them must be up to date.
+  if (!constraints_are_up_to_date() && !generators_are_up_to_date()) {
+#ifndef NDEBUG
+    cerr << "Polyhedron not empty, not zero-dimensional"
+         << endl
+         << "and with neither constraints nor generators up-to-date!"
+         << endl;
+#endif
+    goto bomb;
+  }
+
+  // Here we check if the size of the matrices is consistent.
+  // Let us suppose that all the matrices are up-to-date; this means:
+  // `con_sys' : number of constraints x poly_num_columns
+  // `gen_sys' : number of generators  x poly_num_columns
+  // `sat_c'   : number of generators  x number of constraints
+  // `sat_g'   : number of constraints x number of generators.
+  if (constraints_are_up_to_date()) {
+    if (con_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+      cerr << "Incompatible size! (con_sys and space_dim)"
+           << endl;
+#endif
+      goto bomb;
+    }
+    if (sat_c_is_up_to_date())
+      if (con_sys.first_pending_row() != sat_c.num_columns()) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (con_sys and sat_c)"
+             << endl;
+#endif
+        goto bomb;
+      }
+    if (sat_g_is_up_to_date())
+      if (con_sys.first_pending_row() != sat_g.num_rows()) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (con_sys and sat_g)"
+             << endl;
+#endif
+        goto bomb;
+      }
+    if (generators_are_up_to_date())
+      if (con_sys.space_dimension() != gen_sys.space_dimension()) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (con_sys and gen_sys)"
+             << endl;
+#endif
+        goto bomb;
+      }
+  }
+
+  if (generators_are_up_to_date()) {
+    if (gen_sys.space_dimension() != space_dim) {
+#ifndef NDEBUG
+      cerr << "Incompatible size! (gen_sys and space_dim)"
+           << endl;
+#endif
+      goto bomb;
+    }
+    if (sat_c_is_up_to_date())
+      if (gen_sys.first_pending_row() != sat_c.num_rows()) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (gen_sys and sat_c)"
+             << endl;
+#endif
+        goto bomb;
+      }
+    if (sat_g_is_up_to_date())
+      if (gen_sys.first_pending_row() != sat_g.num_columns()) {
+#ifndef NDEBUG
+        cerr << "Incompatible size! (gen_sys and sat_g)"
+             << endl;
+#endif
+        goto bomb;
+      }
+
+    if (gen_sys.first_pending_row() == 0) {
+#ifndef NDEBUG
+      cerr << "Up-to-date generator system with all rows pending!"
+           << endl;
+#endif
+      goto bomb;
+    }
+
+    // A non-empty system of generators describing a polyhedron
+    // is valid if and only if it contains a point.
+    if (!gen_sys.has_no_rows() && !gen_sys.has_points()) {
+#ifndef NDEBUG
+      cerr << "Non-empty generator system declared up-to-date "
+           << "has no points!"
+           << endl;
+#endif
+      goto bomb;
+    }
+
+#if 0 // To be activated when Status keeps strong minimization flags.
+    //=================================================
+    // TODO: this test is wrong in the general case.
+    // However, such an invariant does hold for a
+    // strongly-minimized Generator_System.
+    // We will activate this test as soon as the Status
+    // flags will be able to remember if a system is
+    // strongly minimized.
+
+    // Checking that the number of closure points is always
+    // greater than the number of points.
+    if (!is_necessarily_closed()) {
+      dimension_type num_points = 0;
+      dimension_type num_closure_points = 0;
+      dimension_type eps_index = gen_sys.space_dimension() + 1;
+      for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+        if (!gen_sys[i].is_line_or_ray())
+          if (gen_sys[i][eps_index] > 0)
+            ++num_points;
+          else
+            ++num_closure_points;
+      if (num_points > num_closure_points) {
+#ifndef NDEBUG
+        cerr << "# POINTS > # CLOSURE_POINTS" << endl;
+#endif
+        goto bomb;
+      }
+    }
+    //=================================================
+#endif
+
+    if (generators_are_minimized()) {
+      // If the system of generators is minimized, the number of
+      // lines, rays and points of the polyhedron must be the same as
+      // of a temporary, minimized one. If this does not happen then
+      // the polyhedron is not OK.
+      Constraint_System new_con_sys(topology(), default_con_sys_repr);
+      Generator_System gs_without_pending = gen_sys;
+      gs_without_pending.remove_trailing_rows(gs_without_pending.num_rows()
+                                              - gen_sys.first_pending_row());
+      gs_without_pending.unset_pending_rows();
+      Generator_System copy_of_gen_sys = gs_without_pending;
+      Bit_Matrix new_sat_c;
+      minimize(false, copy_of_gen_sys, new_con_sys, new_sat_c);
+      const dimension_type copy_num_lines = copy_of_gen_sys.num_lines();
+      if (gs_without_pending.num_rows() != copy_of_gen_sys.num_rows()
+          || gs_without_pending.num_lines() != copy_num_lines
+          || gs_without_pending.num_rays() != copy_of_gen_sys.num_rays()) {
+#ifndef NDEBUG
+        cerr << "Generators are declared minimized, but they are not!\n"
+             << "Here is the minimized form of the generators:\n";
+        copy_of_gen_sys.ascii_dump(cerr);
+        cerr << endl;
+#endif
+        goto bomb;
+      }
+
+      // CHECKME : the following observation is not formally true
+      //           for a NNC_Polyhedron. But it may be true for its
+      //           representation ...
+
+      // If the corresponding polyhedral cone is _pointed_, then
+      // a minimal system of generators is unique up to positive scaling.
+      // We thus verify if the cone is pointed (i.e., there are no lines)
+      // and, after normalizing and sorting a copy of the system `gen_sys'
+      // of the polyhedron (we use a copy not to modify the polyhedron's
+      // system) and the system `copy_of_gen_sys' that has been just
+      // minimized, we check if the two matrices are identical.  If
+      // they are different it means that the generators of the
+      // polyhedron are declared minimized, but they are not.
+      if (copy_num_lines == 0) {
+        copy_of_gen_sys.strong_normalize();
+        copy_of_gen_sys.sort_rows();
+        gs_without_pending.strong_normalize();
+        gs_without_pending.sort_rows();
+        if (copy_of_gen_sys != gs_without_pending) {
+#ifndef NDEBUG
+          cerr << "Generators are declared minimized, but they are not!\n"
+               << "(we are in the case:\n"
+               << "dimension of lineality space equal to 0)\n"
+               << "Here is the minimized form of the generators:\n";
+          copy_of_gen_sys.ascii_dump(cerr);
+          cerr << endl;
+#endif
+            goto bomb;
+        }
+      }
+    }
+  }
+
+  if (constraints_are_up_to_date()) {
+    if (con_sys.first_pending_row() == 0) {
+#ifndef NDEBUG
+      cerr << "Up-to-date constraint system with all rows pending!"
+           << endl;
+#endif
+      goto bomb;
+    }
+
+    // A non-empty system of constraints describing a polyhedron
+    // must contain a constraint with a non-zero inhomogeneous term;
+    // such a constraint corresponds to (a combination of other
+    // constraints with):
+    // -* the positivity constraint, for necessarily closed polyhedra;
+    // -* the epsilon <= 1 constraint, for NNC polyhedra.
+    bool no_positivity_constraint = true;
+    for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+      if (con_sys[i].inhomogeneous_term() != 0) {
+        no_positivity_constraint = false;
+        break;
+      }
+    if (no_positivity_constraint) {
+#ifndef NDEBUG
+      cerr << "Non-empty constraint system has no positivity constraint"
+           << endl;
+#endif
+      goto bomb;
+    }
+
+    if (!is_necessarily_closed()) {
+      // A non-empty system of constraints describing a NNC polyhedron
+      // must also contain a (combination of) the constraint epsilon >= 0,
+      // i.e., a constraint with a positive epsilon coefficient.
+      bool no_epsilon_geq_zero = true;
+      for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+        if (con_sys[i].epsilon_coefficient() > 0) {
+          no_epsilon_geq_zero = false;
+          break;
+        }
+      if (no_epsilon_geq_zero) {
+#ifndef NDEBUG
+        cerr << "Non-empty constraint system for NNC polyhedron "
+             << "has no epsilon >= 0 constraint"
+             << endl;
+#endif
+        goto bomb;
+      }
+    }
+
+    Constraint_System cs_without_pending = con_sys;
+    cs_without_pending.remove_trailing_rows(cs_without_pending.num_rows()
+                                            - con_sys.first_pending_row());
+    cs_without_pending.unset_pending_rows();
+    Constraint_System copy_of_con_sys = cs_without_pending;
+    bool empty = false;
+    if (check_not_empty || constraints_are_minimized()) {
+      Generator_System new_gen_sys(topology(), default_gen_sys_repr);
+      Bit_Matrix new_sat_g;
+      empty = minimize(true, copy_of_con_sys, new_gen_sys, new_sat_g);
+    }
+
+    if (empty && check_not_empty) {
+#ifndef NDEBUG
+      cerr << "Unsatisfiable system of constraints!"
+           << endl;
+#endif
+      goto bomb;
+    }
+
+    if (constraints_are_minimized()) {
+      // If the constraints are minimized, the number of equalities
+      // and of inequalities of the system of the polyhedron must be
+      // the same of the temporary minimized one.
+      // If it does not happen, the polyhedron is not OK.
+      if (cs_without_pending.num_rows() != copy_of_con_sys.num_rows()
+          || cs_without_pending.num_equalities()
+          != copy_of_con_sys.num_equalities()) {
+#ifndef NDEBUG
+        cerr << "Constraints are declared minimized, but they are not!\n"
+             << "Here is the minimized form of the constraints:\n";
+        copy_of_con_sys.ascii_dump(cerr);
+        cerr << endl;
+#endif
+        goto bomb;
+      }
+      // The system `copy_of_con_sys' has the form that is obtained
+      // after applying methods gauss() and back_substitute().
+      // A system of constraints can be minimal even if it does not
+      // have this form. So, to verify if the polyhedron is correct,
+      // we copy the system `con_sys' in a temporary one and then
+      // modify it using method simplify() (which calls both gauss()
+      // and back_substitute()).
+      // If the temporary system and `copy_of_con_sys' are different,
+      // the polyhedron is not OK.
+      copy_of_con_sys.strong_normalize();
+      copy_of_con_sys.sort_rows();
+      cs_without_pending.simplify();
+      cs_without_pending.strong_normalize();
+      cs_without_pending.sort_rows();
+      if (cs_without_pending != copy_of_con_sys) {
+#ifndef NDEBUG
+        cerr << "Constraints are declared minimized, but they are not!\n"
+             << "Here is the minimized form of the constraints:\n";
+        copy_of_con_sys.ascii_dump(cerr);
+        cerr << endl;
+#endif
+        goto bomb;
+      }
+    }
+  }
+
+  if (sat_c_is_up_to_date())
+    for (dimension_type i = sat_c.num_rows(); i-- > 0; ) {
+      const Generator tmp_gen = gen_sys[i];
+      const Bit_Row tmp_sat = sat_c[i];
+      for (dimension_type j = sat_c.num_columns(); j-- > 0; ) {
+        const bool sat_j = (Scalar_Products::sign(con_sys[j], tmp_gen) == 0);
+        if (sat_j == tmp_sat[j]) {
+#ifndef NDEBUG
+          cerr << "sat_c is declared up-to-date, but it is not!"
+               << endl;
+#endif
+          goto bomb;
+        }
+      }
+    }
+
+  if (sat_g_is_up_to_date())
+    for (dimension_type i = sat_g.num_rows(); i-- > 0; ) {
+      const Constraint tmp_con = con_sys[i];
+      const Bit_Row tmp_sat = sat_g[i];
+      for (dimension_type j = sat_g.num_columns(); j-- > 0; ) {
+        const bool sat_j = (Scalar_Products::sign(tmp_con, gen_sys[j]) == 0);
+        if (sat_j == tmp_sat[j]) {
+#ifndef NDEBUG
+          cerr << "sat_g is declared up-to-date, but it is not!"
+               << endl;
+#endif
+          goto bomb;
+        }
+      }
+    }
+
+  if (has_pending_constraints()) {
+    if (con_sys.num_pending_rows() == 0) {
+#ifndef NDEBUG
+      cerr << "The polyhedron is declared to have pending constraints, "
+           << "but con_sys has no pending rows!"
+           << endl;
+#endif
+      goto bomb;
+    }
+  }
+
+  if (has_pending_generators()) {
+    if (gen_sys.num_pending_rows() == 0) {
+#ifndef NDEBUG
+      cerr << "The polyhedron is declared to have pending generators, "
+           << "but gen_sys has no pending rows!"
+           << endl;
+#endif
+      goto bomb;
+    }
+  }
+
+  return true;
+
+ bomb:
+#ifndef NDEBUG
+  cerr << "Here is the guilty polyhedron:"
+       << endl;
+  ascii_dump(cerr);
+#endif
+  return false;
+}
+
+void
+PPL::Polyhedron::add_constraint(const Constraint& c) {
+  // Topology-compatibility check.
+  if (c.is_strict_inequality() && is_necessarily_closed()) {
+    // Trivially true/false strict inequalities are legal.
+    if (c.is_tautological())
+      return;
+    if (c.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    // Here c is a non-trivial strict inequality.
+    throw_topology_incompatible("add_constraint(c)", "c", c);
+  }
+
+  // Dimension-compatibility check:
+  // the dimension of `c' can not be greater than space_dim.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+
+  if (!marked_empty())
+    refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::add_congruence(const Congruence& cg) {
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+  // Handle the case of proper congruences first.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_tautological())
+      return;
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    // Non-trivial and proper congruences are not allowed.
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is a non-trivial, proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  // Handle empty and 0-dim cases first.
+  if (marked_empty())
+    return;
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      set_empty();
+    return;
+  }
+
+  // Add the equality.
+  Linear_Expression le(cg.expression());
+  const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+  refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::add_generator(const Generator& g) {
+  // Topology-compatibility check.
+  if (g.is_closure_point() && is_necessarily_closed())
+    throw_topology_incompatible("add_generator(g)", "g", g);
+  // Dimension-compatibility check:
+  // the dimension of `g' can not be greater than space_dim.
+  const dimension_type g_space_dim = g.space_dimension();
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("add_generator(g)", "g", g);
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    // It is not possible to create 0-dim rays or lines.
+    PPL_ASSERT(g.is_point() || g.is_closure_point());
+    // Closure points can only be inserted in non-empty polyhedra.
+    if (marked_empty()) {
+      if (g.type() != Generator::POINT)
+        throw_invalid_generator("add_generator(g)", "g");
+      else
+        set_zero_dim_univ();
+    }
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators())) {
+    // Here the polyhedron is empty:
+    // the specification says we can only insert a point.
+    if (!g.is_point())
+      throw_invalid_generator("add_generator(g)", "g");
+    if (g.is_necessarily_closed() || !is_necessarily_closed()) {
+      gen_sys.insert(g);
+      // Since `gen_sys' was empty, after inserting `g' we have to resize
+      // the system of generators to have the right dimension.
+      gen_sys.adjust_topology_and_space_dimension(topology(), space_dim);
+      if (!is_necessarily_closed()) {
+        // In the NNC topology, each point has to be matched by
+        // a corresponding closure point:
+        // turn the just inserted point into the corresponding
+        // (normalized) closure point.
+        gen_sys.sys.rows.back().set_epsilon_coefficient(0);
+        gen_sys.sys.rows.back().expr.normalize();
+        PPL_ASSERT(gen_sys.sys.rows.back().OK());
+        PPL_ASSERT(gen_sys.sys.OK());
+        // Re-insert the point (which is already normalized).
+        gen_sys.insert(g);
+      }
+    }
+    else {
+      // Note: here we have a _legal_ topology mismatch,
+      // because `g' is NOT a closure point (it is a point!)
+      // However, by barely invoking `gen_sys.insert(g)' we would
+      // cause a change in the topology of `gen_sys', which is wrong.
+      // Thus, we insert a "topology corrected" copy of `g'.
+      const Linear_Expression nc_expr(g.expression());
+      gen_sys.insert(Generator::point(nc_expr, g.divisor()));
+      // Since `gen_sys' was empty, after inserting `g' we have to resize
+      // the system of generators to have the right dimension.
+      gen_sys.adjust_topology_and_space_dimension(topology(), space_dim);
+    }
+    // No longer empty, generators up-to-date and minimized.
+    clear_empty();
+    set_generators_minimized();
+  }
+  else {
+    PPL_ASSERT(generators_are_up_to_date());
+    const bool has_pending = can_have_something_pending();
+    if (g.is_necessarily_closed() || !is_necessarily_closed()) {
+      // Since `gen_sys' is not empty, the topology and space dimension
+      // of the inserted generator are automatically adjusted.
+      if (has_pending)
+        gen_sys.insert_pending(g);
+      else
+        gen_sys.insert(g);
+      if (!is_necessarily_closed() && g.is_point()) {
+        // In the NNC topology, each point has to be matched by
+        // a corresponding closure point:
+        // turn the just inserted point into the corresponding
+        // (normalized) closure point.
+        gen_sys.sys.rows.back().set_epsilon_coefficient(0);
+        gen_sys.sys.rows.back().expr.normalize();
+        PPL_ASSERT(gen_sys.sys.rows.back().OK());
+        PPL_ASSERT(gen_sys.sys.OK());
+        // Re-insert the point (which is already normalized).
+        if (has_pending)
+          gen_sys.insert_pending(g);
+        else
+          gen_sys.insert(g);
+      }
+    }
+    else {
+      PPL_ASSERT(!g.is_closure_point());
+      // Note: here we have a _legal_ topology mismatch, because
+      // `g' is NOT a closure point.
+      // However, by barely invoking `gen_sys.insert(g)' we would
+      // cause a change in the topology of `gen_sys', which is wrong.
+      // Thus, we insert a "topology corrected" copy of `g'.
+      const Linear_Expression nc_expr(g.expression());
+      switch (g.type()) {
+      case Generator::LINE:
+        if (has_pending)
+          gen_sys.insert_pending(Generator::line(nc_expr));
+        else
+          gen_sys.insert(Generator::line(nc_expr));
+        break;
+      case Generator::RAY:
+        if (has_pending)
+          gen_sys.insert_pending(Generator::ray(nc_expr));
+        else
+          gen_sys.insert(Generator::ray(nc_expr));
+        break;
+      case Generator::POINT:
+        if (has_pending)
+          gen_sys.insert_pending(Generator::point(nc_expr, g.divisor()));
+        else
+          gen_sys.insert(Generator::point(nc_expr, g.divisor()));
+        break;
+      case Generator::CLOSURE_POINT:
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+
+    if (has_pending)
+      set_generators_pending();
+    else {
+      // After adding the new generator,
+      // constraints are no longer up-to-date.
+      clear_generators_minimized();
+      clear_constraints_up_to_date();
+    }
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::add_recycled_constraints(Constraint_System& cs) {
+  // Topology compatibility check.
+  if (is_necessarily_closed() && cs.has_strict_inequalities()) {
+    // We check if _all_ strict inequalities in cs are trivially false.
+    // (The iterators already filter away trivially true constraints.)
+    for (Constraint_System::const_iterator i = cs.begin(),
+           i_end = cs.end(); i != i_end; ++i) {
+      if (i->is_strict_inequality()
+          && !i->is_inconsistent())
+        throw_topology_incompatible("add_recycled_constraints(cs)",
+                                    "cs", cs);
+    }
+    // If we reach this point, all strict inequalities were inconsistent.
+    set_empty();
+    return;
+  }
+
+  // Dimension-compatibility check:
+  // the dimension of `cs' can not be greater than space_dim.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_dimension_incompatible("add_recycled_constraints(cs)", "cs", cs);
+
+  // Adding no constraints is a no-op.
+  if (cs.has_no_rows())
+    return;
+
+  if (space_dim == 0) {
+    // In a 0-dimensional space the constraints are
+    // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+    // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+    // In a system of constraints `begin()' and `end()' are equal
+    // if and only if the system only contains tautologies.
+    if (cs.begin() != cs.end())
+      // There is a constraint, it must be inconsistent,
+      // the polyhedron is empty.
+      status.set_empty();
+    return;
+  }
+
+  if (marked_empty())
+    return;
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  // Adjust `cs' to the right topology and space dimension.
+  // NOTE: we already checked for topology compatibility.
+  cs.adjust_topology_and_space_dimension(topology(), space_dim);
+
+  const bool adding_pending = can_have_something_pending();
+
+  // Here we do not require `con_sys' to be sorted.
+  // also, we _recycle_ (instead of copying) the coefficients of `cs'.
+  if (adding_pending) {
+    con_sys.insert_pending(cs, Recycle_Input());
+    set_constraints_pending();
+  }
+  else {
+    con_sys.insert(cs, Recycle_Input());
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::add_constraints(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+  Constraint_System cs_copy = cs;
+  add_recycled_constraints(cs_copy);
+}
+
+void
+PPL::Polyhedron::add_recycled_generators(Generator_System& gs) {
+  // Topology compatibility check.
+  if (is_necessarily_closed() && gs.has_closure_points())
+    throw_topology_incompatible("add_recycled_generators(gs)", "gs", gs);
+  // Dimension-compatibility check:
+  // the dimension of `gs' can not be greater than space_dim.
+  const dimension_type gs_space_dim = gs.space_dimension();
+  if (space_dim < gs_space_dim)
+    throw_dimension_incompatible("add_recycled_generators(gs)", "gs", gs);
+
+  // Adding no generators is a no-op.
+  if (gs.has_no_rows())
+    return;
+
+  // Adding valid generators to a zero-dimensional polyhedron
+  // transform it in the zero-dimensional universe polyhedron.
+  if (space_dim == 0) {
+    if (marked_empty() && !gs.has_points())
+      throw_invalid_generators("add_recycled_generators(gs)", "gs");
+    set_zero_dim_univ();
+    PPL_ASSERT_HEAVY(OK(true));
+    return;
+  }
+
+  // Adjust `gs' to the right topology and dimensions.
+  // NOTE: we already checked for topology compatibility.
+  gs.adjust_topology_and_space_dimension(topology(), space_dim);
+  // For NNC polyhedra, each point must be matched by
+  // the corresponding closure point.
+  if (!is_necessarily_closed())
+    gs.add_corresponding_closure_points();
+
+  // The generators (possibly with pending rows) are required.
+  if ((has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !minimize())) {
+    // We have just discovered that `*this' is empty.
+    // So `gs' must contain at least one point.
+    if (!gs.has_points())
+      throw_invalid_generators("add_recycled_generators(gs)", "gs");
+    // The polyhedron is no longer empty and generators are up-to-date.
+    swap(gen_sys, gs);
+    if (gen_sys.num_pending_rows() > 0) {
+      // Even though `gs' has pending generators, since the constraints
+      // of the polyhedron are not up-to-date, the polyhedron cannot
+      // have pending generators. By integrating the pending part
+      // of `gen_sys' we may loose sortedness.
+      gen_sys.sys.index_first_pending = gen_sys.num_rows();
+      gen_sys.set_sorted(false);
+    }
+    set_generators_up_to_date();
+    clear_empty();
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  if (can_have_something_pending()) {
+    // Here we do not require `gen_sys' to be sorted.
+    // also, we _remove_ (instead of copying) the rows of `gs'
+    // (which is not a const).
+    for (dimension_type i = 0; i < gs.num_rows(); ++i) {
+      gs.sys.rows[i].set_topology(topology());
+      gen_sys.insert_pending(gs.sys.rows[i], Recycle_Input());
+    }
+    gs.clear();
+
+    set_generators_pending();
+  }
+  else {
+    // Here we do not require `gen_sys' to be sorted.
+    // also, we _remove_ (instead of copying) the coefficients of `gs'
+    // (which is not a const).
+    for (dimension_type i = 0; i < gs.num_rows(); ++i) {
+      gs.sys.rows[i].set_topology(topology());
+      gen_sys.insert(gs.sys.rows[i], Recycle_Input());
+    }
+    gs.clear();
+
+    // Constraints are not up-to-date and generators are not minimized.
+    clear_constraints_up_to_date();
+    clear_generators_minimized();
+  }
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::add_generators(const Generator_System& gs) {
+  // TODO: this is just an executable specification.
+  Generator_System gs_copy = gs;
+  add_recycled_generators(gs_copy);
+}
+
+void
+PPL::Polyhedron::add_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+  Constraint_System cs;
+  bool inserted = false;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i) {
+    const Congruence& cg = *i;
+    if (cg.is_equality()) {
+      Linear_Expression le(cg.expression());
+      const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+
+      // TODO: Consider stealing the row in c when adding it to cs.
+      cs.insert(c);
+      inserted = true;
+    }
+    else {
+      PPL_ASSERT(cg.is_proper_congruence());
+      if (cg.is_inconsistent()) {
+        set_empty();
+        return;
+      }
+      if (!cg.is_tautological())
+        throw_invalid_argument("add_congruences(cgs)",
+                               "cgs has a non-trivial, proper congruence");
+    }
+  }
+  // Only add cs if it contains something.
+  if (inserted)
+    add_recycled_constraints(cs);
+}
+
+void
+PPL::Polyhedron::refine_with_constraint(const Constraint& c) {
+  // Dimension-compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", "c", c);
+  // If the polyhedron is known to be empty, do nothing.
+  if (!marked_empty())
+    refine_no_check(c);
+}
+
+void
+PPL::Polyhedron::refine_with_congruence(const Congruence& cg) {
+  // Dimension-compatibility check.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", "cg", cg);
+
+  // If the polyhedron is known to be empty, do nothing.
+  if (marked_empty())
+    return;
+
+  // Dealing with a zero-dimensional space polyhedron first.
+  if (space_dim == 0) {
+    if (!cg.is_tautological())
+      set_empty();
+    return;
+  }
+
+  if (cg.is_equality()) {
+    Linear_Expression le(cg.expression());
+    const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+    refine_no_check(c);
+  }
+}
+
+void
+PPL::Polyhedron::refine_with_constraints(const Constraint_System& cs) {
+  // TODO: this is just an executable specification.
+
+  // Dimension-compatibility check.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_dimension_incompatible("refine_with_constraints(cs)a",
+                                 "cs", cs);
+
+  // Adding no constraints is a no-op.
+  if (cs.has_no_rows())
+    return;
+
+  if (space_dim == 0) {
+    // In a 0-dimensional space the constraints are
+    // tautologies (e.g., 0 == 0 or 1 >= 0 or 1 > 0) or
+    // inconsistent (e.g., 1 == 0 or -1 >= 0 or 0 > 0).
+    // In a system of constraints `begin()' and `end()' are equal
+    // if and only if the system only contains tautologies.
+    if (cs.begin() != cs.end())
+      // There is a constraint, it must be inconsistent,
+      // the polyhedron is empty.
+      status.set_empty();
+    return;
+  }
+
+  if (marked_empty())
+    return;
+
+  // The constraints (possibly with pending rows) are required.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!constraints_are_up_to_date())
+    update_constraints();
+
+  const bool adding_pending = can_have_something_pending();
+  for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+    const Constraint& c = cs[i];
+
+    if (c.is_necessarily_closed() || !is_necessarily_closed())
+      // Since `con_sys' is not empty, the topology and space dimension
+      // of the inserted constraint are automatically adjusted.
+      if (adding_pending)
+        con_sys.insert_pending(c);
+      else
+        con_sys.insert(c);
+    else {
+      // Here we know that *this is necessarily closed so even if c is
+      // topologically closed, by barely invoking `con_sys.insert(c)' we
+      // would cause a change in the topology of `con_sys', which is
+      // wrong.  Thus, we insert a topology closed and "topology
+      // corrected" version of `c'.
+      const Linear_Expression nc_expr(c.expression());
+      if (c.is_equality())
+        if (adding_pending)
+          con_sys.insert_pending(nc_expr == 0);
+        else
+          con_sys.insert(nc_expr == 0);
+      else
+        if (adding_pending)
+          con_sys.insert_pending(nc_expr >= 0);
+        else
+          con_sys.insert(nc_expr >= 0);
+    }
+  }
+
+  if (adding_pending)
+    set_constraints_pending();
+  else {
+    // Constraints are not minimized and generators are not up-to-date.
+    clear_constraints_minimized();
+    clear_generators_up_to_date();
+  }
+
+  // Note: the constraint system may have become unsatisfiable, thus
+  // we do not check for satisfiability.
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("refine_with_congruences(cgs)", "cgs", cgs);
+
+  Constraint_System cs;
+  bool inserted = false;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i) {
+    if (i->is_equality()) {
+      Linear_Expression le(i->expression());
+      const Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+
+      // TODO: Consider stealing the row in c when adding it to cs.
+      cs.insert(c);
+      inserted = true;
+    }
+    else if (i->is_inconsistent()) {
+      set_empty();
+      return;
+    }
+  }
+  // Only add cgs if congruences were inserted into cgs, as the
+  // dimension of cs must be at most that of the polyhedron.
+  if (inserted)
+    add_recycled_constraints(cs);
+}
+
+void
+PPL::Polyhedron::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  if (space_dim < var.space_dimension())
+    throw_dimension_incompatible("unconstrain(var)", var.space_dimension());
+
+  // Do something only if the polyhedron is non-empty.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  PPL_ASSERT(generators_are_up_to_date());
+  // Since `gen_sys' is not empty, the topology and space dimension
+  // of the inserted generator are automatically adjusted.
+  if (can_have_something_pending()) {
+    gen_sys.insert_pending(Generator::line(var));
+    set_generators_pending();
+  }
+  else {
+    gen_sys.insert(Generator::line(var));
+    // After adding the new generator,
+    // constraints are no longer up-to-date.
+    clear_generators_minimized();
+    clear_constraints_up_to_date();
+  }
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a polyhedron in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Do something only if the polyhedron is non-empty.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    // Empty: do nothing.
+    return;
+
+  PPL_ASSERT(generators_are_up_to_date());
+  // Since `gen_sys' is not empty, the topology and space dimension
+  // of the inserted generators are automatically adjusted.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  if (can_have_something_pending()) {
+    for ( ; vsi != vsi_end; ++vsi)
+      gen_sys.insert_pending(Generator::line(Variable(*vsi)));
+    set_generators_pending();
+  }
+  else {
+    for ( ; vsi != vsi_end; ++vsi)
+      gen_sys.insert(Generator::line(Variable(*vsi)));
+    // After adding the new generators,
+    // constraints are no longer up-to-date.
+    clear_generators_minimized();
+    clear_constraints_up_to_date();
+  }
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+void
+PPL::Polyhedron::intersection_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("intersection_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", "y", y);
+
+  // If one of the two polyhedra is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (x.space_dim == 0)
+    return;
+
+  // Both systems of constraints have to be up-to-date,
+  // possibly having pending constraints.
+  if (x.has_pending_generators())
+    x.process_pending_generators();
+  else if (!x.constraints_are_up_to_date())
+    x.update_constraints();
+
+  if (y.has_pending_generators())
+    y.process_pending_generators();
+  else if (!y.constraints_are_up_to_date())
+    y.update_constraints();
+
+  // Here both systems are up-to-date and possibly have pending constraints
+  // (but they cannot have pending generators).
+  PPL_ASSERT(!x.has_pending_generators() && x.constraints_are_up_to_date());
+  PPL_ASSERT(!y.has_pending_generators() && y.constraints_are_up_to_date());
+
+  // If `x' can support pending constraints,
+  // the constraints of `y' are added as pending constraints of `x'.
+  if (x.can_have_something_pending()) {
+    x.con_sys.insert_pending(y.con_sys);
+    x.set_constraints_pending();
+  }
+  else {
+    // `x' cannot support pending constraints.
+    // If both constraint systems are (fully) sorted, then we can
+    // merge them; otherwise we simply add the second to the first.
+    if (x.con_sys.is_sorted()
+        && y.con_sys.is_sorted() && !y.has_pending_constraints())
+      x.con_sys.merge_rows_assign(y.con_sys);
+    else
+      x.con_sys.insert(y.con_sys);
+    // Generators are no longer up-to-date and constraints are no
+    // longer minimized.
+    x.clear_generators_up_to_date();
+    x.clear_constraints_minimized();
+  }
+  PPL_ASSERT_HEAVY(x.OK() && y.OK());
+}
+
+namespace {
+
+struct Ruled_Out_Pair {
+  PPL::dimension_type constraint_index;
+  PPL::dimension_type num_ruled_out;
+};
+
+struct Ruled_Out_Less_Than {
+  bool operator()(const Ruled_Out_Pair& x,
+                  const Ruled_Out_Pair& y) const {
+    return x.num_ruled_out > y.num_ruled_out;
+  }
+};
+
+/*
+  Modifies the vector of pointers \p ineqs_p, setting to 0 those entries
+  that point to redundant inequalities or masked equalities.
+  The redundancy test is based on saturation matrix \p sat and
+  on knowing that there exists \p rank non-redundant equalities
+  (they are implicit, i.e., not explicitly listed in \p ineqs_p).
+*/
+void
+drop_redundant_inequalities(std::vector<const PPL::Constraint*>& ineqs_p,
+                            const PPL::Topology topology,
+                            const PPL::Bit_Matrix& sat,
+                            const PPL::dimension_type rank) {
+  using namespace Parma_Polyhedra_Library;
+  const dimension_type num_rows = ineqs_p.size();
+  PPL_ASSERT(num_rows > 0);
+  // `rank' is the rank of the (implicit) system of equalities.
+  const dimension_type space_dim = ineqs_p[0]->space_dimension();
+  PPL_ASSERT(space_dim > 0 && space_dim >= rank);
+  const dimension_type num_coefficients
+    = space_dim + ((topology == NECESSARILY_CLOSED) ? 0U : 1U);
+  const dimension_type min_sat = num_coefficients - rank;
+  const dimension_type num_cols_sat = sat.num_columns();
+
+  // Perform quick redundancy test based on the number of saturators.
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    if (sat[i].empty())
+      // Masked equalities are redundant.
+      ineqs_p[i] = 0;
+    else {
+      const dimension_type num_sat = num_cols_sat - sat[i].count_ones();
+      if (num_sat < min_sat)
+        ineqs_p[i] = 0;
+    }
+  }
+
+  // Re-examine remaining inequalities.
+  // Iteration index `i' is _intentionally_ increasing.
+  for (dimension_type i = 0; i < num_rows; ++i) {
+    if (ineqs_p[i] != 0) {
+      for (dimension_type j = 0; j < num_rows; ++j) {
+        bool strict_subset;
+        if (ineqs_p[j] != 0 && i != j
+            && subset_or_equal(sat[j], sat[i], strict_subset)) {
+          if (strict_subset) {
+            ineqs_p[i] = 0;
+            break;
+          }
+          else
+            // Here `sat[j] == sat[i]'.
+            ineqs_p[j] = 0;
+        }
+      }
+    }
+  }
+}
+
+} // namespace
+
+template <typename Linear_System1, typename Row2>
+bool
+PPL::Polyhedron::add_to_system_and_check_independence(Linear_System1& eq_sys,
+                                                      const Row2& eq) {
+  // Check if eq is linearly independent from eq_sys.
+  PPL_ASSERT(eq.is_line_or_equality());
+  eq_sys.insert(eq);
+  const PPL::dimension_type eq_sys_num_rows = eq_sys.num_rows();
+  const PPL::dimension_type rank = eq_sys.gauss(eq_sys_num_rows);
+  if (rank == eq_sys_num_rows)
+    // eq is linearly independent from eq_sys.
+    return true;
+  else {
+    // eq is not linearly independent from eq_sys.
+    PPL_ASSERT(rank == eq_sys_num_rows - 1);
+    eq_sys.remove_trailing_rows(1);
+    return false;
+  }
+}
+
+bool
+PPL::Polyhedron::simplify_using_context_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("simplify_using_context_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("simplify_using_context_assign(y)", "y", y);
+
+  // Filter away the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.is_empty()) {
+      x.set_zero_dim_univ();
+      return false;
+    }
+    else
+      return !x.is_empty();
+  }
+
+  // If `y' is empty, the biggest enlargement for `x' is the universe.
+  if (!y.minimize()) {
+    Polyhedron ph(x.topology(), x.space_dim, UNIVERSE);
+    m_swap(ph);
+    return false;
+  }
+
+  // If `x' is empty, the intersection is empty.
+  if (!x.minimize()) {
+    // Search for a constraint of `y' that is not a tautology.
+    PPL_ASSERT(!y.has_pending_generators() && y.constraints_are_up_to_date());
+    for (dimension_type i = y.con_sys.num_rows(); i-- > 0; ) {
+      const Constraint& y_con_sys_i = y.con_sys[i];
+      if (!y_con_sys_i.is_tautological()) {
+        // Found: we obtain a constraint `c' contradicting the one we
+        // found, and assign to `x' the polyhedron `ph' with `c' as
+        // the only constraint.
+        Polyhedron ph(x.topology(), x.space_dim, UNIVERSE);
+        const Linear_Expression le(y_con_sys_i.expression());
+        switch (y_con_sys_i.type()) {
+        case Constraint::EQUALITY:
+          ph.refine_no_check(le == 1);
+          break;
+        case Constraint::NONSTRICT_INEQUALITY:
+          ph.refine_no_check(le <= -1);
+          break;
+        case Constraint::STRICT_INEQUALITY:
+          ph.refine_no_check(le == 0);
+          break;
+        }
+        m_swap(ph);
+        PPL_ASSERT_HEAVY(OK());
+        return false;
+      }
+    }
+    // `y' is the universe: `x' cannot be enlarged.
+    return false;
+  }
+
+  PPL_ASSERT(x.constraints_are_minimized()
+         && !x.has_something_pending()
+         && y.generators_are_minimized()
+         && !y.has_something_pending());
+  const Constraint_System& x_cs = x.con_sys;
+  const dimension_type x_cs_num_rows = x_cs.num_rows();
+  const Generator_System& y_gs = y.gen_sys;
+
+  // Record into `redundant_by_y' the info about which constraints of
+  // `x' are redundant in the context `y'.  Count the number of
+  // redundancies found.
+  std::vector<bool> redundant_by_y(x_cs_num_rows, false);
+  dimension_type num_redundant_by_y = 0;
+  for (dimension_type i = 0; i < x_cs_num_rows; ++i)
+    if (y_gs.satisfied_by_all_generators(x_cs[i])) {
+      redundant_by_y[i] = true;
+      ++num_redundant_by_y;
+    }
+
+  Constraint_System result_cs;
+
+  if (num_redundant_by_y < x_cs_num_rows) {
+    // Some constraints were not identified as redundant (yet?).
+    const Constraint_System& y_cs = y.con_sys;
+    const dimension_type y_cs_num_rows = y_cs.num_rows();
+    // Compute into `z' the minimized intersection of `x' and `y'.
+    const bool x_first = (x_cs_num_rows > y_cs_num_rows);
+    Polyhedron z(x_first ? x : y);
+    if (x_first)
+      z.add_constraints(y_cs);
+    else {
+      // Only copy (and then recycle) the non-redundant constraints.
+      Constraint_System tmp_cs;
+      for (dimension_type i = 0; i < x_cs_num_rows; ++i) {
+        if (!redundant_by_y[i])
+          tmp_cs.insert(x_cs[i]);
+      }
+      z.add_recycled_constraints(tmp_cs);
+    }
+    if (!z.minimize()) {
+      // The objective function is the default, zero.
+      // We do not care about minimization or maximization, since
+      // we are only interested in satisfiability.
+      MIP_Problem lp;
+      if (x.is_necessarily_closed()) {
+        lp.add_space_dimensions_and_embed(x.space_dim);
+        lp.add_constraints(y_cs);
+      }
+      else {
+        // KLUDGE: temporarily mark `y_cs' if it was necessarily
+        // closed, so that we can interpret the epsilon dimension as a
+        // standard dimension. Be careful to reset the topology of `cs'
+        // even on exceptional execution path.
+        const_cast<Constraint_System&>(y_cs).mark_as_necessarily_closed();
+        try {
+          lp.add_space_dimensions_and_embed(x.space_dim+1);
+          lp.add_constraints(y_cs);
+          const_cast<Constraint_System&>(y_cs).mark_as_not_necessarily_closed();
+        }
+        catch (...) {
+          const_cast<Constraint_System&>(y_cs).mark_as_not_necessarily_closed();
+          throw;
+        }
+      }
+      // We apply the following heuristics here: constraints of `x' that
+      // are not made redundant by `y' are added to `lp' depending on
+      // the number of generators of `y' they rule out (the more generators
+      // they rule out, the sooner they are added).  Of course, as soon
+      // as `lp' becomes unsatisfiable, we stop adding.
+      std::vector<Ruled_Out_Pair>
+        ruled_out_vec(x_cs_num_rows - num_redundant_by_y);
+      for (dimension_type i = 0, j = 0; i < x_cs_num_rows; ++i) {
+        if (!redundant_by_y[i]) {
+          const Constraint& c = x_cs[i];
+          const Topology_Adjusted_Scalar_Product_Sign sps(c);
+          dimension_type num_ruled_out_generators = 0;
+          for (Generator_System::const_iterator k = y_gs.begin(),
+                 y_gs_end = y_gs.end(); k != y_gs_end; ++k) {
+            const Generator& g = *k;
+            const int sp_sign = sps(g, c);
+            if (x.is_necessarily_closed()) {
+              if (g.is_line()) {
+                // Lines must saturate the constraint.
+                if (sp_sign != 0)
+                  goto ruled_out;
+              }
+              else {
+                // `g' is either a ray, a point or a closure point.
+                if (c.is_inequality()) {
+                  // `c' is a non-strict inequality.
+                  if (sp_sign < 0)
+                    goto ruled_out;
+                }
+                else
+                  // `c' is an equality.
+                  if (sp_sign != 0)
+                    goto ruled_out;
+              }
+            }
+            else
+              // The topology is not necessarily closed.
+              switch (g.type()) {
+              case Generator::LINE:
+                // Lines must saturate the constraint.
+                if (sp_sign != 0)
+                  goto ruled_out;
+                break;
+              case Generator::POINT:
+                // Have to perform the special test when dealing with
+                // a strict inequality.
+                switch (c.type()) {
+                case Constraint::EQUALITY:
+                  if (sp_sign != 0)
+                    goto ruled_out;
+                  break;
+                case Constraint::NONSTRICT_INEQUALITY:
+                  if (sp_sign < 0)
+                    goto ruled_out;
+                  break;
+                case Constraint::STRICT_INEQUALITY:
+                  if (sp_sign <= 0)
+                    goto ruled_out;
+                  break;
+                }
+                break;
+              case Generator::RAY:
+                // Intentionally fall through.
+              case Generator::CLOSURE_POINT:
+                if (c.is_inequality()) {
+                  // Constraint `c' is either a strict or a non-strict
+                  // inequality.
+                  if (sp_sign < 0)
+                    goto ruled_out;
+                }
+                else
+                  // Constraint `c' is an equality.
+                  if (sp_sign != 0)
+                    goto ruled_out;
+                break;
+              }
+
+            // If we reach this point, `g' satisfies `c'.
+            continue;
+          ruled_out:
+            ++num_ruled_out_generators;
+          }
+          ruled_out_vec[j].constraint_index = i;
+          ruled_out_vec[j].num_ruled_out = num_ruled_out_generators;
+          ++j;
+        }
+      }
+      std::sort(ruled_out_vec.begin(), ruled_out_vec.end(),
+                Ruled_Out_Less_Than());
+
+      for (std::vector<Ruled_Out_Pair>::const_iterator
+             j = ruled_out_vec.begin(),
+             ruled_out_vec_end = ruled_out_vec.end();
+           j != ruled_out_vec_end;
+           ++j) {
+        const Constraint& c = x_cs[j->constraint_index];
+        result_cs.insert(c);
+        lp.add_constraint(c);
+        const MIP_Problem_Status status = lp.solve();
+        if (status == UNFEASIBLE_MIP_PROBLEM) {
+          Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE);
+          result_ph.add_constraints(result_cs);
+          swap(x, result_ph);
+          PPL_ASSERT_HEAVY(x.OK());
+          return false;
+        }
+      }
+      // Cannot exit from here.
+      PPL_UNREACHABLE;
+    }
+    else {
+      // Here `z' is not empty and minimized.
+      PPL_ASSERT(z.constraints_are_minimized()
+             && z.generators_are_minimized()
+             && !z.has_something_pending());
+      const Constraint_System& z_cs = z.con_sys;
+      const Generator_System& z_gs = z.gen_sys;
+      const dimension_type z_gs_num_rows = z_gs.num_rows();
+
+      // Compute the number of equalities in x_cs, y_cs and z_cs
+      // (exploiting minimal form knowledge).
+      dimension_type x_cs_num_eq = 0;
+      while (x_cs[x_cs_num_eq].is_equality())
+        ++x_cs_num_eq;
+      dimension_type y_cs_num_eq = 0;
+      while (y_cs[y_cs_num_eq].is_equality())
+        ++y_cs_num_eq;
+      dimension_type z_cs_num_eq = 0;
+      while (z_cs[z_cs_num_eq].is_equality())
+        ++z_cs_num_eq;
+      PPL_ASSERT(x_cs_num_eq <= z_cs_num_eq && y_cs_num_eq <= z_cs_num_eq);
+
+      // Identify non-redundant equalities.
+      Constraint_System non_redundant_eq;
+      dimension_type num_non_redundant_eq = 0;
+      const dimension_type needed_non_redundant_eq = z_cs_num_eq - y_cs_num_eq;
+      Constraint_System eqs(x.topology());
+      if (needed_non_redundant_eq > 0) {
+        // Populate eqs with the equalities from y.
+        for (dimension_type i = 0; i < y_cs_num_eq; ++i)
+          eqs.insert(y_cs[i]);
+        // Try to find another `needed_non_redundant_eq' linear independent
+        // equalities among those from x.
+        for (dimension_type i = 0; i < x_cs_num_eq; ++i) {
+          const Constraint& x_cs_i = x_cs[i];
+          if (add_to_system_and_check_independence(eqs, x_cs_i)) {
+            // x_cs_i is linear independent.
+            non_redundant_eq.insert(x_cs_i);
+            ++num_non_redundant_eq;
+            if (num_non_redundant_eq == needed_non_redundant_eq)
+              // Already found all the needed equalities.
+              break;
+          }
+        }
+        // NOTE: if num_non_redundant_eq < needed_non_redundant_eq
+        // then we haven't found all the needed equalities yet:
+        // this means that some inequalities from x actually holds
+        // as "masked" equalities in the context of y.
+        PPL_ASSERT(eqs.num_rows() <= z_cs_num_eq);
+        PPL_ASSERT(num_non_redundant_eq <= needed_non_redundant_eq);
+        PPL_ASSERT(z_cs_num_eq - eqs.num_rows()
+               == needed_non_redundant_eq - num_non_redundant_eq);
+      }
+
+      // Identify non-redundant inequalities.
+      // Avoid useless copies (no modifications are needed).
+      std::vector<const Constraint*> non_redundant_ineq_p;
+      // Fill non_redundant_ineq_p with (pointers to) inequalities
+      // from y_cs ...
+      for (dimension_type i = y_cs_num_eq; i < y_cs_num_rows; ++i)
+        non_redundant_ineq_p.push_back(&y_cs[i]);
+      // ... and (pointers to) non-redundant inequalities from x_cs.
+      for (dimension_type i = x_cs_num_eq; i < x_cs_num_rows; ++i)
+        if (!redundant_by_y[i])
+          non_redundant_ineq_p.push_back(&x_cs[i]);
+
+      const dimension_type non_redundant_ineq_p_size
+        = non_redundant_ineq_p.size();
+      const dimension_type y_cs_num_ineq = y_cs_num_rows - y_cs_num_eq;
+
+      // Compute saturation info.
+      const dimension_type sat_num_rows = non_redundant_ineq_p_size;
+      Bit_Matrix sat(sat_num_rows, z_gs_num_rows);
+      for (dimension_type i = sat_num_rows; i-- > 0; ) {
+        const Constraint& non_redundant_ineq_i = *(non_redundant_ineq_p[i]);
+        Bit_Row& sat_i = sat[i];
+        for (dimension_type j = z_gs_num_rows; j-- > 0; )
+          if (Scalar_Products::sign(non_redundant_ineq_i, z_gs[j]) != 0)
+            sat_i.set(j);
+        if (sat_i.empty() && num_non_redundant_eq < needed_non_redundant_eq) {
+          // `non_redundant_ineq_i' is actually masking an equality
+          // and we are still looking for some masked inequalities.
+          // Iteration goes downwards, so the inequality comes from x_cs.
+          PPL_ASSERT(i >= y_cs_num_ineq);
+          // Check if the equality is independent in eqs.
+          Constraint masked_eq = non_redundant_ineq_i;
+          masked_eq.set_is_line_or_equality();
+          masked_eq.sign_normalize();
+          if (add_to_system_and_check_independence(eqs, masked_eq)) {
+            // It is independent: add the _inequality_ to non_redundant_eq.
+            non_redundant_eq.insert(non_redundant_ineq_i);
+            ++num_non_redundant_eq;
+          }
+        }
+      }
+      // Here we have already found all the needed (masked) equalities.
+      PPL_ASSERT(num_non_redundant_eq == needed_non_redundant_eq);
+
+      drop_redundant_inequalities(non_redundant_ineq_p, x.topology(),
+                                  sat, z_cs_num_eq);
+
+      // Place the non-redundant (masked) equalities into result_cs.
+      swap(result_cs, non_redundant_eq);
+      // Add to result_cs the non-redundant inequalities from x_cs,
+      // i.e., those having indices no smaller than y_cs_num_ineq.
+      for (dimension_type i = y_cs_num_ineq;
+           i < non_redundant_ineq_p_size;
+           ++i)
+        if (non_redundant_ineq_p[i] != 0)
+          result_cs.insert(*non_redundant_ineq_p[i]);
+    }
+  }
+
+  Polyhedron result_ph(x.topology(), x.space_dim, UNIVERSE);
+  result_ph.add_recycled_constraints(result_cs);
+  swap(x, result_ph);
+  PPL_ASSERT_HEAVY(x.OK());
+  return true;
+}
+
+void
+PPL::Polyhedron::poly_hull_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("poly_hull_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("poly_hull_assign(y)", "y", y);
+
+  // The poly-hull of a polyhedron `p' with an empty polyhedron is `p'.
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty()) {
+    x = y;
+    return;
+  }
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily universe polyhedra,
+  // so that their poly-hull is the universe polyhedron too.
+  if (x.space_dim == 0)
+    return;
+
+  // Both systems of generators have to be up-to-date,
+  // possibly having pending generators.
+  if ((x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators())) {
+    // Discovered `x' empty when updating generators.
+    x = y;
+    return;
+  }
+  if ((y.has_pending_constraints() && !y.process_pending_constraints())
+      || (!y.generators_are_up_to_date() && !y.update_generators()))
+    // Discovered `y' empty when updating generators.
+    return;
+
+  // Here both systems are up-to-date and possibly have pending generators
+  // (but they cannot have pending constraints).
+  PPL_ASSERT(!x.has_pending_constraints() && x.generators_are_up_to_date());
+  PPL_ASSERT(!y.has_pending_constraints() && y.generators_are_up_to_date());
+
+  // If `x' can support pending generators,
+  // the generators of `y' are added as pending generators of `x'.
+  if (x.can_have_something_pending()) {
+    x.gen_sys.insert_pending(y.gen_sys);
+    x.set_generators_pending();
+  }
+  else {
+    // `x' cannot support pending generators.
+    // If both generator systems are (fully) sorted, then we can merge
+    // them; otherwise we simply add the second to the first.
+    if (x.gen_sys.is_sorted()
+        && y.gen_sys.is_sorted() && !y.has_pending_generators())
+      x.gen_sys.merge_rows_assign(y.gen_sys);
+    else
+      x.gen_sys.insert(y.gen_sys);
+    // Constraints are no longer up-to-date
+    // and generators are no longer minimized.
+    x.clear_constraints_up_to_date();
+    x.clear_generators_minimized();
+  }
+  // At this point both `x' and `y' are not empty.
+  PPL_ASSERT_HEAVY(x.OK(true) && y.OK(true));
+}
+
+void
+PPL::Polyhedron::poly_difference_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("poly_difference_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("poly_difference_assign(y)", "y", y);
+
+  // The difference of a polyhedron `p' and an empty polyhedron is `p'.
+  if (y.marked_empty())
+    return;
+  // The difference of an empty polyhedron and of a polyhedron `p' is empty.
+  if (x.marked_empty())
+    return;
+
+  // If both polyhedra are zero-dimensional,
+  // then at this point they are necessarily universe polyhedra,
+  // so that their difference is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  // Being lazy here is only harmful.
+  // `minimize()' will process any pending constraints or generators.
+  if (!y.minimize())
+    return;
+  x.minimize();
+
+  Polyhedron new_polyhedron(topology(), x.space_dim, EMPTY);
+
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    PPL_ASSERT(!c.is_tautological());
+    PPL_ASSERT(!c.is_inconsistent());
+    // If the polyhedron `x' is included in the polyhedron defined by
+    // `c', then `c' can be skipped, as adding its complement to `x'
+    // would result in the empty polyhedron.  Moreover, if we operate
+    // on C-polyhedra and `c' is a non-strict inequality, c _must_ be
+    // skipped for otherwise we would obtain a result that is less
+    // precise than the poly-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    Polyhedron z = x;
+    const Linear_Expression e(c.expression());
+    switch (c.type()) {
+    case Constraint::NONSTRICT_INEQUALITY:
+      if (is_necessarily_closed())
+        z.refine_no_check(e <= 0);
+      else
+        z.refine_no_check(e < 0);
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      z.refine_no_check(e <= 0);
+      break;
+    case Constraint::EQUALITY:
+      if (is_necessarily_closed())
+        // We have already filtered out the case
+        // when `x' is included in `y': the result is `x'.
+        return;
+      else {
+        Polyhedron w = x;
+        w.refine_no_check(e < 0);
+        new_polyhedron.poly_hull_assign(w);
+        z.refine_no_check(e > 0);
+      }
+      break;
+    }
+    new_polyhedron.poly_hull_assign(z);
+  }
+  *this = new_polyhedron;
+
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+affine_image(const Variable var,
+             const Linear_Expression& expr,
+             Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  if (expr.coefficient(var) != 0) {
+    // The transformation is invertible:
+    // minimality and saturators are preserved, so that
+    // pending rows, if present, are correctly handled.
+    if (generators_are_up_to_date()) {
+      // Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+        gen_sys.affine_image(var, expr, denominator);
+      else
+        gen_sys.affine_image(var, -expr, -denominator);
+    }
+    if (constraints_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      Coefficient_traits::const_reference c = expr.coefficient(var);
+      if (c > 0) {
+        inverse = -expr;
+        inverse.set_coefficient(var, denominator);
+        con_sys.affine_preimage(var, inverse, c);
+      }
+      else {
+        // The new denominator is negative: we negate everything once
+        // more, as Constraint_System::affine_preimage() requires the
+        // third argument to be positive.
+        inverse = expr;
+        inverse.set_coefficient(var, -denominator);
+        con_sys.affine_preimage(var, inverse, -c);
+      }
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of generators.
+    if (has_something_pending())
+      remove_pending_to_obtain_generators();
+    else if (!generators_are_up_to_date())
+      minimize();
+    if (!marked_empty()) {
+      // Generator_System::affine_image() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+        gen_sys.affine_image(var, expr, denominator);
+      else
+        gen_sys.affine_image(var, -expr, -denominator);
+
+      clear_constraints_up_to_date();
+      clear_generators_minimized();
+      clear_sat_c_up_to_date();
+      clear_sat_g_up_to_date();
+    }
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+
+void
+PPL::Polyhedron::
+affine_preimage(const Variable var,
+                const Linear_Expression& expr,
+                Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (marked_empty())
+    return;
+
+  if (expr.coefficient(var) != 0) {
+    // The transformation is invertible:
+    // minimality and saturators are preserved.
+    if (constraints_are_up_to_date()) {
+      // Constraint_System::affine_preimage() requires the third argument
+      // to be a positive Coefficient.
+      if (denominator > 0)
+        con_sys.affine_preimage(var, expr, denominator);
+      else
+        con_sys.affine_preimage(var, -expr, -denominator);
+    }
+    if (generators_are_up_to_date()) {
+      // To build the inverse transformation,
+      // after copying and negating `expr',
+      // we exchange the roles of `expr[var_space_dim]' and `denominator'.
+      Linear_Expression inverse;
+      Coefficient_traits::const_reference c = expr.coefficient(var);
+      if (c > 0) {
+        inverse = -expr;
+        inverse.set_coefficient(var, denominator);
+        gen_sys.affine_image(var, inverse, c);
+      }
+      else {
+        // The new denominator is negative:
+        // we negate everything once more, as Generator_System::affine_image()
+        // requires the third argument to be positive.
+        inverse = expr;
+        inverse.set_coefficient(var, -denominator);
+        gen_sys.affine_image(var, inverse, -c);
+      }
+    }
+  }
+  else {
+    // The transformation is not invertible.
+    // We need an up-to-date system of constraints.
+    if (has_something_pending())
+      remove_pending_to_obtain_constraints();
+    else if (!constraints_are_up_to_date())
+      minimize();
+    // Constraint_System::affine_preimage() requires the third argument
+    // to be a positive Coefficient.
+    if (denominator > 0)
+      con_sys.affine_preimage(var, expr, denominator);
+    else
+      con_sys.affine_preimage(var, -expr, -denominator);
+    // Generators, minimality and saturators are no longer valid.
+    clear_generators_up_to_date();
+    clear_constraints_minimized();
+    clear_sat_c_up_to_date();
+    clear_sat_g_up_to_date();
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+bounded_affine_image(const Variable var,
+                     const Linear_Expression& lb_expr,
+                     const Linear_Expression& ub_expr,
+                     Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any image of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+  if (lb_expr.coefficient(var) == 0) {
+    // Here `var' may only occur in `ub_expr'.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    if (denominator > 0)
+      refine_no_check(lb_expr <= denominator*var);
+    else
+      refine_no_check(denominator*var <= lb_expr);
+  }
+  else if (ub_expr.coefficient(var) == 0) {
+    // Here `var' only occurs in `lb_expr'.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    if (denominator > 0)
+      refine_no_check(denominator*var <= ub_expr);
+    else
+      refine_no_check(ub_expr <= denominator*var);
+  }
+  else {
+    // Here `var' occurs in both `lb_expr' and `ub_expr'.
+    // To ease the computation, we add an additional dimension.
+    const Variable new_var(space_dim);
+    add_space_dimensions_and_embed(1);
+    // Constrain the new dimension to be equal to `ub_expr'.
+    refine_no_check(denominator*new_var == ub_expr);
+    // Apply the affine lower bound.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    if (!marked_empty())
+      // Now apply the affine upper bound, as recorded in `new_var'.
+      refine_no_check(new_var >= var);
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+bounded_affine_preimage(const Variable var,
+                        const Linear_Expression& lb_expr,
+                        const Linear_Expression& ub_expr,
+                        Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Check whether `var' occurs in neither `lb_expr' nor `ub_expr'.
+  if (lb_expr.coefficient(var) == 0 && ub_expr.coefficient(var) == 0) {
+    if (denominator > 0) {
+      refine_no_check(lb_expr <= denominator*var);
+      refine_no_check(denominator*var <= ub_expr);
+    }
+    else {
+      refine_no_check(ub_expr <= denominator*var);
+      refine_no_check(denominator*var <= lb_expr);
+    }
+    unconstrain(var);
+  }
+  else {
+    // Here `var' occurs in `lb_expr' or `ub_expr'.
+    // To ease the computation, add an additional dimension.
+    const Variable new_var(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Swap dimensions `var' and `new_var'.
+    if (constraints_are_up_to_date())
+      con_sys.swap_space_dimensions(var, new_var);
+    if (generators_are_up_to_date())
+      gen_sys.swap_space_dimensions(var, new_var);
+
+    // Constrain the new dimension as dictated by `lb_expr' and `ub_expr'.
+    // (we force minimization because we will need the generators).
+    if (denominator > 0) {
+      refine_no_check(lb_expr <= denominator*new_var);
+      refine_no_check(denominator*new_var <= ub_expr);
+    }
+    else {
+      refine_no_check(ub_expr <= denominator*new_var);
+      refine_no_check(denominator*new_var <= lb_expr);
+    }
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+generalized_affine_image(const Variable var,
+                         const Relation_Symbol relsym,
+                         const Linear_Expression& expr,
+                         Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "v", var);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  // First compute the affine image.
+  affine_image(var, expr, denominator);
+
+  if (relsym == EQUAL)
+    // The affine relation is indeed an affine function.
+    return;
+
+  // Any image of an empty polyhedron is empty.
+  // Note: DO check for emptiness here, as we will later add a ray.
+  if (is_empty())
+    return;
+
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    add_generator(ray(-var));
+    break;
+  case GREATER_OR_EQUAL:
+    add_generator(ray(var));
+    break;
+  case LESS_THAN:
+  // Intentionally fall through.
+  case GREATER_THAN:
+    {
+      // The relation symbol is strict.
+      PPL_ASSERT(!is_necessarily_closed());
+      // While adding the ray, we minimize the generators
+      // in order to avoid adding too many redundant generators later.
+      add_generator(ray((relsym == GREATER_THAN) ? var : -var));
+      minimize();
+
+      // We split each point of the generator system into two generators:
+      // a closure point, having the same coordinates of the given point,
+      // and another point, having the same coordinates for all but the
+      // `var' dimension, which is displaced along the direction of the
+      // newly introduced ray.
+      for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+        const Generator& gen_i = gen_sys.sys.rows[i];
+        if (gen_i.is_point()) {
+          // Add a copy of `gen_i' at the end of the system.
+          // Note: copying is really meant, to avoid undefined behavior.
+          gen_sys.sys.rows.push_back(Generator(gen_i));
+          // Note: (re-)compute references (invalidated by push_back).
+          Generator& old_gen = gen_sys.sys.rows[i];
+          Generator& new_gen = gen_sys.sys.rows.back();
+          // Transform `old_gen' into a closure point.
+          old_gen.set_epsilon_coefficient(0);
+          old_gen.expr.normalize();
+          PPL_ASSERT(old_gen.OK());
+          // Displace `new_gen' by `var' (i.e., along the new ray).
+          if (relsym == GREATER_THAN)
+            new_gen.expr += var;
+          else
+            new_gen.expr -= var;
+          new_gen.expr.normalize();
+          PPL_ASSERT(new_gen.OK());
+        }
+      }
+      // Sortedness no longer hold.
+      gen_sys.set_sorted(false);
+      gen_sys.unset_pending_rows();
+      PPL_ASSERT(gen_sys.sys.OK());
+
+      clear_constraints_up_to_date();
+      clear_generators_minimized();
+      clear_sat_c_up_to_date();
+      clear_sat_g_up_to_date();
+    }
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::
+generalized_affine_preimage(const Variable var,
+                            const Relation_Symbol relsym,
+                            const Linear_Expression& expr,
+                            Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "v", var);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  // Check whether the affine relation is indeed an affine function.
+  if (relsym == EQUAL) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Compute the reversed relation symbol to simplify later coding.
+  Relation_Symbol reversed_relsym;
+  switch (relsym) {
+  case LESS_THAN:
+    reversed_relsym = GREATER_THAN;
+    break;
+  case LESS_OR_EQUAL:
+    reversed_relsym = GREATER_OR_EQUAL;
+    break;
+  case GREATER_OR_EQUAL:
+    reversed_relsym = LESS_OR_EQUAL;
+    break;
+  case GREATER_THAN:
+    reversed_relsym = LESS_THAN;
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    return;
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_coefficient != 0) {
+    const Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denominator))
+      ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse_expr,
+                             inverse_denominator);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the polyhedron by adding the constraint induced
+  // by the affine relation.
+  const Relation_Symbol corrected_relsym
+    = (denominator > 0) ? relsym : reversed_relsym;
+  switch (corrected_relsym) {
+  case LESS_THAN:
+    refine_no_check(denominator*var < expr);
+    break;
+  case LESS_OR_EQUAL:
+    refine_no_check(denominator*var <= expr);
+    break;
+  case GREATER_OR_EQUAL:
+    refine_no_check(denominator*var >= expr);
+    break;
+  case GREATER_THAN:
+    refine_no_check(denominator*var > expr);
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+  unconstrain(var);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::generalized_affine_image(const Linear_Expression& lhs,
+                                          const Relation_Symbol relsym,
+                                          const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  lhs_space_dim = lhs.last_nonzero();
+
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // we can simply add the constraint `lhs relsym rhs'.
+  if (lhs_space_dim == 0) {
+    switch (relsym) {
+    case LESS_THAN:
+      refine_no_check(lhs < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    case GREATER_THAN:
+      refine_no_check(lhs > rhs);
+      break;
+    case NOT_EQUAL:
+      // The NOT_EQUAL case has been already dealt with.
+      PPL_UNREACHABLE;
+      break;
+    }
+    return;
+  }
+
+  // Gather in `new_lines' the collections of all the lines having
+  // the direction of variables occurring in `lhs'.
+  // While at it, check whether or not there exists a variable
+  // occurring in both `lhs' and `rhs'.
+  Generator_System new_lines;
+  for (Linear_Expression::const_iterator
+      i = lhs.begin(), i_end = lhs.end(); i != i_end; ++i)
+    new_lines.insert(line(i.variable()));
+
+  const dimension_type num_common_dims
+    = std::min(lhs.space_dimension(), rhs.space_dimension());
+  if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, we add an additional dimension.
+    const Variable new_var(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to the right hand side.
+    // (check for emptiness because we will add lines).
+    refine_no_check(new_var == rhs);
+    if (!is_empty()) {
+      // Existentially quantify the variables in the left hand side.
+      add_recycled_generators(new_lines);
+
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'
+      // (we force minimization because we will need the generators).
+      switch (relsym) {
+      case LESS_THAN:
+        refine_no_check(lhs < new_var);
+        break;
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= new_var);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= new_var);
+        break;
+      case GREATER_THAN:
+        refine_no_check(lhs > new_var);
+        break;
+      case NOT_EQUAL:
+        // The NOT_EQUAL case has been already dealt with.
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Any image of an empty polyhedron is empty.
+    // Note: DO check for emptiness here, as we will add lines.
+    if (is_empty())
+      return;
+
+    // Existentially quantify the variables in the left hand side.
+    add_recycled_generators(new_lines);
+
+    // Constrain the left hand side expression so that it is related to
+    // the right hand side expression as dictated by `relsym'.
+    switch (relsym) {
+    case LESS_THAN:
+      refine_no_check(lhs < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    case GREATER_THAN:
+      refine_no_check(lhs > rhs);
+      break;
+    case NOT_EQUAL:
+      // The NOT_EQUAL case has been already dealt with.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::generalized_affine_preimage(const Linear_Expression& lhs,
+                                             const Relation_Symbol relsym,
+                                             const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are only admitted for NNC polyhedra.
+  if (is_necessarily_closed()
+      && (relsym == LESS_THAN || relsym == GREATER_THAN))
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the actual space dimension of `lhs',
+  // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+  lhs_space_dim = lhs.last_nonzero();
+
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // in this case, preimage and image happen to be the same.
+  if (lhs_space_dim == 0) {
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+
+  // Gather in `new_lines' the collections of all the lines having
+  // the direction of variables occurring in `lhs'.
+  // While at it, check whether or not there exists a variable
+  // occurring in both `lhs' and `rhs'.
+  Generator_System new_lines;
+  for (Linear_Expression::const_iterator
+      i = lhs.begin(), i_end = lhs.end(); i != i_end; ++i)
+    new_lines.insert(line(i.variable()));
+
+  const dimension_type num_common_dims
+    = std::min(lhs.space_dimension(), rhs.space_dimension());
+  if (lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+    // Some variables in `lhs' also occur in `rhs'.
+    // To ease the computation, we add an additional dimension.
+    const Variable new_var(space_dim);
+    add_space_dimensions_and_embed(1);
+
+    // Constrain the new dimension to be equal to `lhs'
+    // (also check for emptiness because we have to add lines).
+    refine_no_check(new_var == lhs);
+    if (!is_empty()) {
+      // Existentially quantify the variables in the left hand side.
+      add_recycled_generators(new_lines);
+
+      // Constrain the new dimension so that it is related to
+      // the right hand side as dictated by `relsym'.
+      switch (relsym) {
+      case LESS_THAN:
+        refine_no_check(new_var < rhs);
+        break;
+      case LESS_OR_EQUAL:
+        refine_no_check(new_var <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(new_var >= rhs);
+        break;
+      case GREATER_THAN:
+        refine_no_check(new_var > rhs);
+        break;
+      case NOT_EQUAL:
+        // The NOT_EQUAL case has been already dealt with.
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+    // Remove the temporarily added dimension.
+    remove_higher_space_dimensions(space_dim-1);
+  }
+  else {
+    // `lhs' and `rhs' variables are disjoint:
+    // there is no need to add a further dimension.
+
+    // Constrain the left hand side expression so that it is related to
+    // the right hand side expression as dictated by `relsym'.
+    switch (relsym) {
+    case LESS_THAN:
+      refine_no_check(lhs < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    case GREATER_THAN:
+      refine_no_check(lhs > rhs);
+      break;
+    case NOT_EQUAL:
+      // The NOT_EQUAL case has been already dealt with.
+      PPL_UNREACHABLE;
+      break;
+    }
+    // Any image of an empty polyhedron is empty.
+    // Note: DO check for emptiness here, as we will add lines.
+    if (is_empty())
+      return;
+    // Existentially quantify all the variables occurring in `lhs'.
+    add_recycled_generators(new_lines);
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::time_elapse_assign(const Polyhedron& y) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("time_elapse_assign(y)", "y", y);
+  // Dimension-compatibility checks.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("time_elapse_assign(y)", "y", y);
+
+  // Dealing with the zero-dimensional case.
+  if (x.space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  if (x.marked_empty() || y.marked_empty()
+      || (x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators())
+      || (y.has_pending_constraints() && !y.process_pending_constraints())
+      || (!y.generators_are_up_to_date() && !y.update_generators())) {
+    x.set_empty();
+    return;
+  }
+
+  // At this point both generator systems are up-to-date,
+  // possibly containing pending generators.
+  Generator_System gs = y.gen_sys;
+  const dimension_type old_gs_num_rows = gs.num_rows();
+  dimension_type gs_num_rows = old_gs_num_rows;
+
+  if (!x.is_necessarily_closed()) {
+    // `x' and `y' are NNC polyhedra.
+    for (dimension_type i = gs_num_rows; i-- > 0; ) {
+      Generator& g = gs.sys.rows[i];
+      switch (g.type()) {
+      case Generator::POINT:
+        // The points of `gs' can be erased,
+        // since their role can be played by closure points.
+        --gs_num_rows;
+        swap(g, gs.sys.rows[gs_num_rows]);
+        break;
+      case Generator::CLOSURE_POINT:
+        {
+          // If it is the origin, erase it.
+          if (g.expr.all_homogeneous_terms_are_zero()) {
+            --gs_num_rows;
+            swap(g, gs.sys.rows[gs_num_rows]);
+          }
+          // Otherwise, transform the closure point into a ray.
+          else {
+            g.expr.set_inhomogeneous_term(0);
+            // Enforce normalization.
+            g.expr.normalize();
+            PPL_ASSERT(g.OK());
+          }
+        }
+        break;
+      case Generator::RAY:
+      case Generator::LINE:
+        // For rays and lines, nothing to be done.
+        break;
+      }
+    }
+  }
+  else {
+    // `x' and `y' are C polyhedra.
+    for (dimension_type i = gs_num_rows; i-- > 0; ) {
+      // For rays and lines, nothing to be done.
+      if (gs[i].is_point()) {
+        Generator& p = gs.sys.rows[i];
+        // If it is the origin, erase it.
+        if (p.expression().all_homogeneous_terms_are_zero()) {
+          --gs_num_rows;
+          swap(p, gs.sys.rows[gs_num_rows]);
+        }
+        // Otherwise, transform the point into a ray.
+        else {
+          p.expr.set_inhomogeneous_term(0);
+          // Enforce normalization.
+          p.expr.normalize();
+          PPL_ASSERT(p.OK());
+        }
+      }
+    }
+  }
+  // If it was present, erase the origin point or closure point,
+  // which cannot be transformed into a valid ray or line.
+  // For NNC polyhedra, also erase all the points of `gs',
+  // whose role can be played by the closure points.
+  // These have been previously moved to the end of `gs'.
+  gs.sys.rows.resize(gs_num_rows);
+
+  gs.unset_pending_rows();
+  PPL_ASSERT(gs.sys.OK());
+
+  // `gs' may now have no rows.
+  // Namely, this happens when `y' was the singleton polyhedron
+  // having the origin as the one and only point.
+  // In such a case, the resulting polyhedron is equal to `x'.
+  if (gs_num_rows == 0)
+    return;
+
+  // If the polyhedron can have something pending, we add `gs'
+  // to `gen_sys' as pending rows
+  if (x.can_have_something_pending()) {
+    x.gen_sys.insert_pending(gs);
+    x.set_generators_pending();
+  }
+  // Otherwise, the two systems are merged.
+  // `Linear_System::merge_rows_assign()' requires both systems to be sorted.
+  else {
+    if (!x.gen_sys.is_sorted())
+      x.gen_sys.sort_rows();
+    gs.sort_rows();
+    x.gen_sys.merge_rows_assign(gs);
+    // Only the system of generators is up-to-date.
+    x.clear_constraints_up_to_date();
+    x.clear_generators_minimized();
+  }
+  PPL_ASSERT_HEAVY(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Polyhedron::frequency(const Linear_Expression& expr,
+                           Coefficient& freq_n, Coefficient& freq_d,
+                           Coefficient& val_n, Coefficient& val_d) const {
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // If the `expr' has a constant value, then the frequency
+  // `freq_n' is 0. Otherwise the values for \p expr are not discrete
+  // and we return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 1 and the value is 0.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  // For an empty polyhedron, we simply return false.
+  if (marked_empty()
+      || (has_pending_constraints() && !process_pending_constraints())
+      || (!generators_are_up_to_date() && !update_generators()))
+    return false;
+
+  // The polyhedron has updated, possibly pending generators.
+  // The following loop will iterate through the generator
+  // to see if `expr' has a constant value.
+  PPL_DIRTY_TEMP(mpq_class, value);
+
+  // True if we have no other candidate value to compare with.
+  bool first_candidate = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sp);
+  PPL_DIRTY_TEMP(mpq_class, candidate);
+  for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& gen_sys_i = gen_sys[i];
+    Scalar_Products::homogeneous_assign(sp, expr, gen_sys_i);
+    // Lines and rays in `*this' can cause `expr' to be non-constant.
+    if (gen_sys_i.is_line_or_ray()) {
+      const int sp_sign = sgn(sp);
+      if (sp_sign != 0)
+        // `expr' is unbounded in `*this'.
+        return false;
+    }
+    else {
+      // We have a point or a closure point.
+      PPL_ASSERT(gen_sys_i.is_point() || gen_sys_i.is_closure_point());
+      // Notice that we are ignoring the constant term in `expr' here.
+      // We will add it to the value if there is a constant value.
+      assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
+      assign_r(candidate.get_den(), gen_sys_i.expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+      candidate.canonicalize();
+      if (first_candidate) {
+        // We have a (new) candidate value.
+        first_candidate = false;
+        value = candidate;
+      }
+      else if (candidate != value)
+        return false;
+    }
+  }
+
+  // Add in the constant term in `expr'.
+  PPL_DIRTY_TEMP(mpz_class, n);
+  assign_r(n, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  value += n;
+  // FIXME: avoid these temporaries, if possible.
+  // This can be done adding an `assign' function working on native
+  // and checked or an operator= that have on one side a checked and
+  // on the other a native or checked.
+  // The reason why now we can't use operator= is the fact that we
+  // still can have Coefficient defined to mpz_class (and not
+  // Checked_Number<mpz_class>).
+  val_n = Coefficient(value.get_num());
+  val_d = Coefficient(value.get_den());
+
+  freq_n = 0;
+  freq_d = 1;
+  return true;
+}
+
+void
+PPL::Polyhedron::topological_closure_assign() {
+  // Necessarily closed polyhedra are trivially closed.
+  if (is_necessarily_closed())
+    return;
+  // Any empty or zero-dimensional polyhedron is closed.
+  if (marked_empty() || space_dim == 0)
+    return;
+
+  // The computation can be done using constraints or generators.
+  // If we use constraints, we will change them, so that having pending
+  // constraints would be useless. If we use generators, we add generators,
+  // so that having pending generators still makes sense.
+
+  // Process any pending constraints.
+  if (has_pending_constraints() && !process_pending_constraints())
+    return;
+
+  // Use constraints only if they are available and
+  // there are no pending generators.
+  if (!has_pending_generators() && constraints_are_up_to_date()) {
+    bool changed = false;
+
+    // Transform all strict inequalities into non-strict ones.
+    for (dimension_type i = con_sys.num_rows(); i-- > 0; ) {
+      Constraint& c = con_sys.sys.rows[i];
+      if (c.epsilon_coefficient() < 0 && !c.is_tautological()) {
+        c.set_epsilon_coefficient(0);
+        // Enforce normalization.
+        c.expr.normalize();
+        PPL_ASSERT(c.OK());
+        changed = true;
+      }
+    }
+
+    PPL_ASSERT(con_sys.sys.OK());
+
+    if (changed) {
+      con_sys.insert(Constraint::epsilon_leq_one());
+      con_sys.set_sorted(false);
+      // After changing the system of constraints, the generators
+      // are no longer up-to-date and the constraints are no longer
+      // minimized.
+      clear_generators_up_to_date();
+      clear_constraints_minimized();
+    }
+  }
+  else {
+    // Here we use generators, possibly keeping constraints.
+    PPL_ASSERT(generators_are_up_to_date());
+    // Add the corresponding point to each closure point.
+    gen_sys.add_corresponding_points();
+    if (can_have_something_pending())
+      set_generators_pending();
+    else {
+      // We cannot have pending generators; this also implies
+      // that generators may have lost their sortedness.
+      gen_sys.unset_pending_rows();
+      gen_sys.set_sorted(false);
+      // Constraints are not up-to-date and generators are not minimized.
+      clear_constraints_up_to_date();
+      clear_generators_minimized();
+    }
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+bool
+PPL::operator==(const Polyhedron& x, const Polyhedron& y) {
+  // If the two polyhedra are topology-incompatible or dimension-incompatible,
+  // then they cannot be the same polyhedron.
+  if (x.topology() != y.topology() || x.space_dim != y.space_dim)
+    return false;
+
+  if (x.marked_empty())
+    return y.is_empty();
+  else if (y.marked_empty())
+    return x.is_empty();
+  else if (x.space_dim == 0)
+    return true;
+
+  switch (x.quick_equivalence_test(y)) {
+  case Polyhedron::TVB_TRUE:
+    return true;
+
+  case Polyhedron::TVB_FALSE:
+    return false;
+
+  default:
+    if (x.is_included_in(y))
+      if (x.marked_empty())
+        return y.is_empty();
+      else
+        return y.is_included_in(x);
+    else
+      return false;
+  }
+}
+
+bool
+PPL::Polyhedron::contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("contains(y)", "y", y);
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", "y", y);
+
+  if (y.marked_empty())
+    return true;
+  else if (x.marked_empty())
+    return y.is_empty();
+  else if (y.space_dim == 0)
+    return true;
+  else if (x.quick_equivalence_test(y) == Polyhedron::TVB_TRUE)
+    return true;
+  else
+    return y.is_included_in(x);
+}
+
+bool
+PPL::Polyhedron::is_disjoint_from(const Polyhedron& y) const {
+  Polyhedron z = *this;
+  z.intersection_assign(y);
+  return z.is_empty();
+}
+
+void
+PPL::Polyhedron::ascii_dump(std::ostream& s) const {
+  s << "space_dim " << space_dim << "\n";
+  status.ascii_dump(s);
+  s << "\ncon_sys ("
+    << (constraints_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << "\n";
+  con_sys.ascii_dump(s);
+  s << "\ngen_sys ("
+    << (generators_are_up_to_date() ? "" : "not_")
+    << "up-to-date)"
+    << "\n";
+  gen_sys.ascii_dump(s);
+  s << "\nsat_c\n";
+  sat_c.ascii_dump(s);
+  s << "\nsat_g\n";
+  sat_g.ascii_dump(s);
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS(Polyhedron)
+
+bool
+PPL::Polyhedron::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "con_sys")
+    return false;
+
+  if (!(s >> str) || (str != "(not_up-to-date)" && str != "(up-to-date)"))
+    return false;
+
+  if (!con_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "gen_sys")
+    return false;
+
+  if (!(s >> str) || (str != "(not_up-to-date)" && str != "(up-to-date)"))
+    return false;
+
+  if (!gen_sys.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "sat_c")
+    return false;
+
+  if (!sat_c.ascii_load(s))
+    return false;
+
+  if (!(s >> str) || str != "sat_g")
+    return false;
+
+  if (!sat_g.ascii_load(s))
+    return false;
+
+  // Check invariants.
+  PPL_ASSERT_HEAVY(OK());
+  return true;
+}
+
+PPL::memory_size_type
+PPL::Polyhedron::external_memory_in_bytes() const {
+  return
+    con_sys.external_memory_in_bytes()
+    + gen_sys.external_memory_in_bytes()
+    + sat_c.external_memory_in_bytes()
+    + sat_g.external_memory_in_bytes();
+}
+
+void
+PPL::Polyhedron::wrap_assign(const Variables_Set& vars,
+                             Bounded_Integer_Type_Width w,
+                             Bounded_Integer_Type_Representation r,
+                             Bounded_Integer_Type_Overflow o,
+                             const Constraint_System* cs_p,
+                             unsigned complexity_threshold,
+                             bool wrap_individually) {
+  if (is_necessarily_closed())
+    Implementation::wrap_assign(static_cast<C_Polyhedron&>(*this),
+                                vars, w, r, o, cs_p,
+                                complexity_threshold, wrap_individually,
+                                "C_Polyhedron");
+  else
+    Implementation::wrap_assign(static_cast<NNC_Polyhedron&>(*this),
+                                vars, w, r, o, cs_p,
+                                complexity_threshold, wrap_individually,
+                                "NNC_Polyhedron");
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Polyhedron& ph) {
+  if (ph.is_empty())
+    s << "false";
+  else
+    s << ph.minimized_constraints();
+  return s;
+}
diff --git a/src/Polyhedron_simplify_templates.hh b/src/Polyhedron_simplify_templates.hh
new file mode 100644
index 0000000..ce41ac4
--- /dev/null
+++ b/src/Polyhedron_simplify_templates.hh
@@ -0,0 +1,340 @@
+/* Polyhedron class implementation: simplify().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_simplify_templates_hh
+#define PPL_Polyhedron_simplify_templates_hh 1
+
+#include "Bit_Matrix_defs.hh"
+#include "Polyhedron_defs.hh"
+#include <cstddef>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+  \return
+  The rank of \p sys.
+
+  \param sys
+  The system to simplify: it will be modified;
+
+  \param sat
+  The saturation matrix corresponding to \p sys.
+
+  \p sys may be modified by swapping some of its rows and by possibly
+  removing some of them, if they turn out to be redundant.
+
+  If \p sys is a system of constraints, then the rows of \p sat are
+  indexed by constraints and its columns are indexed by generators;
+  otherwise, if \p sys is a system of generators, then the rows of
+  \p sat are indexed by generators and its columns by constraints.
+
+  Given a system of constraints or a system of generators, this function
+  simplifies it using Gauss' elimination method (to remove redundant
+  equalities/lines), deleting redundant inequalities/rays/points and
+  making back-substitution.
+  The explanation that follows assumes that \p sys is a system of
+  constraints. For the case when \p sys is a system of generators,
+  a similar explanation can be obtain by applying duality.
+
+  The explanation relies on the notion of <EM>redundancy</EM>.
+  (See the Introduction.)
+
+  First we make some observations that can help the reader
+  in understanding the function:
+
+  Proposition: An inequality that is saturated by all the generators
+  can be transformed to an equality.
+
+  In fact, by combining any number of generators that saturate the
+  constraints, we obtain a generator that saturates the constraints too:
+  \f[
+    \langle \vect{c}, \vect{r}_1 \rangle = 0 \land
+    \langle \vect{c}, \vect{r}_2 \rangle = 0
+    \Rightarrow
+    \langle \vect{c}, (\lambda_1 \vect{r}_1 + \lambda_2 \vect{r}_2) \rangle =
+    \lambda_1 \langle \vect{c}, \vect{r}_1 \rangle
+    + \lambda_2 \langle \vect{c}, \vect{r}_2 \rangle
+    = 0,
+  \f]
+  where \f$\lambda_1, \lambda_2\f$ can be any real number.
+*/
+template <typename Linear_System1>
+dimension_type
+Polyhedron::simplify(Linear_System1& sys, Bit_Matrix& sat) {
+
+  typedef typename Linear_System1::row_type sys_row_type;
+
+  dimension_type num_rows = sys.num_rows();
+  const dimension_type num_cols_sat = sat.num_columns();
+
+  using std::swap;
+
+  // Looking for the first inequality in `sys'.
+  dimension_type num_lines_or_equalities = 0;
+  while (num_lines_or_equalities < num_rows
+         && sys[num_lines_or_equalities].is_line_or_equality())
+    ++num_lines_or_equalities;
+
+  // `num_saturators[i]' will contain the number of generators
+  // that saturate the constraint `sys[i]'.
+  if (num_rows > simplify_num_saturators_size) {
+    delete [] simplify_num_saturators_p;
+    simplify_num_saturators_p = 0;
+    simplify_num_saturators_size = 0;
+    const size_t max_size
+      = std::numeric_limits<size_t>::max() / sizeof(dimension_type);
+    const size_t new_size = compute_capacity(num_rows, max_size);
+    simplify_num_saturators_p = new dimension_type[new_size];
+    simplify_num_saturators_size = new_size;
+  }
+  dimension_type* const num_saturators = simplify_num_saturators_p;
+
+  bool sys_sorted = sys.is_sorted();
+
+  // Computing the number of saturators for each inequality,
+  // possibly identifying and swapping those that happen to be
+  // equalities (see Proposition above).
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) {
+    if (sat[i].empty()) {
+      // The constraint `sys_rows[i]' is saturated by all the generators.
+      // Thus, either it is already an equality or it can be transformed
+      // to an equality (see Proposition above).
+      sys.sys.rows[i].set_is_line_or_equality();
+      // Note: simple normalization already holds.
+      sys.sys.rows[i].sign_normalize();
+      // We also move it just after all the other equalities,
+      // so that system `sys_rows' keeps its partial sortedness.
+      if (i != num_lines_or_equalities) {
+        sys.sys.rows[i].m_swap(sys.sys.rows[num_lines_or_equalities]);
+        swap(sat[i], sat[num_lines_or_equalities]);
+        swap(num_saturators[i], num_saturators[num_lines_or_equalities]);
+      }
+      ++num_lines_or_equalities;
+      // `sys' is no longer sorted.
+      sys_sorted = false;
+    }
+    else
+      // There exists a generator which does not saturate `sys[i]',
+      // so that `sys[i]' is indeed an inequality.
+      // We store the number of its saturators.
+      num_saturators[i] = num_cols_sat - sat[i].count_ones();
+  }
+
+  sys.set_sorted(sys_sorted);
+  PPL_ASSERT(sys.OK());
+
+  // At this point, all the equalities of `sys' (included those
+  // inequalities that we just transformed to equalities) have
+  // indexes between 0 and `num_lines_or_equalities' - 1,
+  // which is the property needed by method gauss().
+  // We can simplify the system of equalities, obtaining the rank
+  // of `sys' as result.
+  const dimension_type rank = sys.gauss(num_lines_or_equalities);
+
+  // Now the irredundant equalities of `sys' have indexes from 0
+  // to `rank' - 1, whereas the equalities having indexes from `rank'
+  // to `num_lines_or_equalities' - 1 are all redundant.
+  // (The inequalities in `sys' have been left untouched.)
+  // The rows containing equalities are not sorted.
+
+  if (rank < num_lines_or_equalities) {
+    // We identified some redundant equalities.
+    // Moving them at the bottom of `sys':
+    // - index `redundant' runs through the redundant equalities
+    // - index `erasing' identifies the first row that should
+    //   be erased after this loop.
+    // Note that we exit the loop either because we have removed all
+    // redundant equalities or because we have moved all the
+    // inequalities.
+    for (dimension_type redundant = rank,
+           erasing = num_rows;
+         redundant < num_lines_or_equalities
+           && erasing > num_lines_or_equalities;
+         ) {
+      --erasing;
+      sys.remove_row(redundant);
+      swap(sat[redundant], sat[erasing]);
+      swap(num_saturators[redundant], num_saturators[erasing]);
+      ++redundant;
+    }
+    // Adjusting the value of `num_rows' to the number of meaningful
+    // rows of `sys': `num_lines_or_equalities' - `rank' is the number of
+    // redundant equalities moved to the bottom of `sys', which are
+    // no longer meaningful.
+    num_rows -= num_lines_or_equalities - rank;
+
+    // If the above loop exited because it moved all inequalities, it may not
+    // have removed all the rendundant rows.
+    sys.remove_trailing_rows(sys.num_rows() - num_rows);
+
+    PPL_ASSERT(sys.num_rows() == num_rows);
+
+    sat.remove_trailing_rows(num_lines_or_equalities - rank);
+
+    // Adjusting the value of `num_lines_or_equalities'.
+    num_lines_or_equalities = rank;
+  }
+
+  const dimension_type old_num_rows = sys.num_rows();
+
+  // Now we use the definition of redundancy (given in the Introduction)
+  // to remove redundant inequalities.
+
+  // First we check the saturation rule, which provides a necessary
+  // condition for an inequality to be irredundant (i.e., it provides
+  // a sufficient condition for identifying redundant inequalities).
+  // Let
+  //
+  //   num_saturators[i] = num_sat_lines[i] + num_sat_rays_or_points[i],
+  //   dim_lin_space = num_irredundant_lines,
+  //   dim_ray_space
+  //     = dim_vector_space - num_irredundant_equalities - dim_lin_space
+  //     = num_columns - 1 - num_lines_or_equalities - dim_lin_space,
+  //   min_sat_rays_or_points = dim_ray_space.
+  //
+  // An inequality saturated by less than `dim_ray_space' _rays/points_
+  // is redundant. Thus we have the implication
+  //
+  //   (num_saturators[i] - num_sat_lines[i] < dim_ray_space)
+  //      ==>
+  //        redundant(sys[i]).
+  //
+  // Moreover, since every line saturates all inequalities, we also have
+  //     dim_lin_space = num_sat_lines[i]
+  // so that we can rewrite the condition above as follows:
+  //
+  //   (num_saturators[i] < num_columns - num_lines_or_equalities - 1)
+  //      ==>
+  //        redundant(sys[i]).
+  //
+  const dimension_type sys_num_columns
+    = sys.topology() == NECESSARILY_CLOSED ? sys.space_dimension() + 1
+                                           : sys.space_dimension() + 2;
+  const dimension_type min_saturators
+    = sys_num_columns - num_lines_or_equalities - 1;
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+    if (num_saturators[i] < min_saturators) {
+      // The inequality `sys[i]' is redundant.
+      --num_rows;
+      sys.remove_row(i);
+      swap(sat[i], sat[num_rows]);
+      swap(num_saturators[i], num_saturators[num_rows]);
+    }
+    else
+      ++i;
+  }
+
+  // Now we check the independence rule.
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+    bool redundant = false;
+    // NOTE: in the inner loop, index `j' runs through _all_ the
+    // inequalities and we do not test if `sat[i]' is strictly
+    // contained into `sat[j]'.  Experimentation has shown that this
+    // is faster than having `j' only run through the indexes greater
+    // than `i' and also doing the test `strict_subset(sat[i],
+    // sat[k])'.
+    for (dimension_type j = num_lines_or_equalities; j < num_rows; ) {
+      if (i == j)
+        // We want to compare different rows of `sys'.
+        ++j;
+      else {
+        // Let us recall that each generator lies on a facet of the
+        // polyhedron (see the Introduction).
+        // Given two constraints `c_1' and `c_2', if there are `m'
+        // generators lying on the hyper-plane corresponding to `c_1',
+        // the same `m' generators lie on the hyper-plane
+        // corresponding to `c_2', too, and there is another one lying
+        // on the latter but not on the former, then `c_2' is more
+        // restrictive than `c_1', i.e., `c_1' is redundant.
+        bool strict_subset;
+        if (subset_or_equal(sat[j], sat[i], strict_subset))
+          if (strict_subset) {
+            // All the saturators of the inequality `sys[i]' are
+            // saturators of the inequality `sys[j]' too,
+            // and there exists at least one saturator of `sys[j]'
+            // which is not a saturator of `sys[i]'.
+            // It follows that inequality `sys[i]' is redundant.
+            redundant = true;
+            break;
+          }
+          else {
+            // We have `sat[j] == sat[i]'.  Hence inequalities
+            // `sys[i]' and `sys[j]' are saturated by the same set of
+            // generators. Then we can remove either one of the two
+            // inequalities: we remove `sys[j]'.
+            --num_rows;
+            sys.remove_row(j);
+            PPL_ASSERT(sys.num_rows() == num_rows);
+            swap(sat[j], sat[num_rows]);
+            swap(num_saturators[j], num_saturators[num_rows]);
+          }
+        else
+          // If we reach this point then we know that `sat[i]' does
+          // not contain (and is different from) `sat[j]', so that
+          // `sys[i]' is not made redundant by inequality `sys[j]'.
+          ++j;
+      }
+    }
+    if (redundant) {
+      // The inequality `sys[i]' is redundant.
+      --num_rows;
+      sys.remove_row(i);
+      PPL_ASSERT(sys.num_rows() == num_rows);
+      swap(sat[i], sat[num_rows]);
+      swap(num_saturators[i], num_saturators[num_rows]);
+    }
+    else
+      // The inequality `sys[i]' is not redundant.
+      ++i;
+  }
+
+  // Here we physically remove the `sat' rows corresponding to the redundant
+  // inequalities previously removed from `sys'.
+  sat.remove_trailing_rows(old_num_rows - num_rows);
+
+  // At this point the first `num_lines_or_equalities' rows of 'sys'
+  // represent the irredundant equalities, while the remaining rows
+  // (i.e., those having indexes from `num_lines_or_equalities' to
+  // `num_rows' - 1) represent the irredundant inequalities.
+#ifndef NDEBUG
+  // Check if the flag is set (that of the equalities is already set).
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i)
+    PPL_ASSERT(sys[i].is_ray_or_point_or_inequality());
+#endif
+
+  // Finally, since now the sub-system (of `sys') of the irredundant
+  // equalities is in triangular form, we back substitute each
+  // variables with the expression obtained considering the equalities
+  // starting from the last one.
+  sys.back_substitute(num_lines_or_equalities);
+
+  // The returned value is the number of irredundant equalities i.e.,
+  // the rank of the sub-system of `sys' containing only equalities.
+  // (See the Introduction for definition of lineality space dimension.)
+  return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_simplify_templates_hh)
diff --git a/src/Polyhedron_templates.hh b/src/Polyhedron_templates.hh
new file mode 100644
index 0000000..e604fc1
--- /dev/null
+++ b/src/Polyhedron_templates.hh
@@ -0,0 +1,579 @@
+/* Polyhedron class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Polyhedron_templates_hh
+#define PPL_Polyhedron_templates_hh 1
+
+#include "Generator_defs.hh"
+#include "MIP_Problem_defs.hh"
+#include "Interval_defs.hh"
+#include "Linear_Form_defs.hh"
+// For static method overflows.
+#include "Floating_Point_Expression_defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Polyhedron::Polyhedron(Topology topol,
+                       const Box<Interval>& box,
+                       Complexity_Class)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Initialize the space dimension as indicated by the box.
+  space_dim = box.space_dimension();
+
+  // Check for emptiness.
+  if (box.is_empty()) {
+    set_empty();
+    return;
+  }
+
+  // Zero-dim universe polyhedron.
+  if (space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Properly set the space dimension of `con_sys'.
+  con_sys.set_space_dimension(space_dim);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+  if (topol == NECESSARILY_CLOSED) {
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      const Variable v_k = Variable(k);
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * v_k == l_n);
+      }
+      else {
+        if (l_bounded)
+          // Add the constraint `l_d*v_k >= l_n'.
+          con_sys.insert(l_d * v_k >= l_n);
+        if (u_bounded)
+          // Add the constraint `u_d*v_k <= u_n'.
+          con_sys.insert(u_d * v_k <= u_n);
+      }
+    }
+  }
+  else {
+    // topol == NOT_NECESSARILY_CLOSED
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      const Variable v_k = Variable(k);
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * v_k == l_n);
+      }
+      else {
+        // Check if a lower bound constraint is required.
+        if (l_bounded) {
+          if (l_closed)
+            // Add the constraint `l_d*v_k >= l_n'.
+            con_sys.insert(l_d * v_k >= l_n);
+          else
+            // Add the constraint `l_d*v_k > l_n'.
+            con_sys.insert(l_d * v_k > l_n);
+        }
+        // Check if an upper bound constraint is required.
+        if (u_bounded) {
+          if (u_closed)
+            // Add the constraint `u_d*v_k <= u_n'.
+            con_sys.insert(u_d * v_k <= u_n);
+          else
+            // Add the constraint `u_d*v_k < u_n'.
+            con_sys.insert(u_d * v_k < u_n);
+        }
+      }
+    }
+  }
+
+  // Adding the low-level constraints.
+  con_sys.add_low_level_constraints();
+
+  // Constraints are up-to-date.
+  set_constraints_up_to_date();
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the polyhedron becomes zero_dimensional.
+    if (marked_empty()
+        || (has_pending_constraints()
+            && !remove_pending_to_obtain_generators())
+        || (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty polyhedron.
+      space_dim = 0;
+      con_sys.clear();
+    }
+    else
+      // Removing all dimensions from a non-empty polyhedron.
+      set_zero_dim_univ();
+
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    std::vector<Variable> cycle;
+    cycle.reserve(space_dim);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (visited[i])
+        continue;
+
+      dimension_type j = i;
+      do {
+        visited[j] = true;
+        // The following initialization is only to make the compiler happy.
+        dimension_type k = 0;
+        if (!pfunc.maps(j, k))
+          throw_invalid_argument("map_space_dimensions(pfunc)",
+                                 " pfunc is inconsistent");
+        if (k == j)
+          break;
+
+        cycle.push_back(Variable(j));
+        // Go along the cycle.
+        j = k;
+      } while (!visited[j]);
+
+      // End of cycle.
+
+      // Permute all that is up-to-date.  Notice that the contents of
+      // the saturation matrices is unaffected by the permutation of
+      // columns: they remain valid, if they were so.
+      if (constraints_are_up_to_date())
+        con_sys.permute_space_dimensions(cycle);
+
+      if (generators_are_up_to_date())
+        gen_sys.permute_space_dimensions(cycle);
+
+      cycle.clear();
+    }
+
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  // If there are pending constraints, using `generators()' we process them.
+  const Generator_System& old_gensys = generators();
+
+  if (old_gensys.has_no_rows()) {
+    // The polyhedron is empty.
+    Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+    m_swap(new_polyhedron);
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Generator_System new_gensys;
+  for (Generator_System::const_iterator i = old_gensys.begin(),
+         old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+    const Generator& old_g = *i;
+    const Generator::expr_type old_e = old_g.expression();
+    Linear_Expression expr;
+    expr.set_space_dimension(new_space_dimension);
+    bool all_zeroes = true;
+    for (Generator::expr_type::const_iterator j = old_e.begin(),
+          j_end = old_e.end(); j != j_end; ++j) {
+      const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+      if (mapped_id != not_a_dimension()) {
+        add_mul_assign(expr, *j, Variable(mapped_id));
+        all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Generator::LINE:
+      if (!all_zeroes)
+        new_gensys.insert(line(expr));
+      break;
+    case Generator::RAY:
+      if (!all_zeroes)
+        new_gensys.insert(ray(expr));
+      break;
+    case Generator::POINT:
+      // A point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(point(expr, old_g.divisor()));
+      break;
+    case Generator::CLOSURE_POINT:
+      // A closure point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(closure_point(expr, old_g.divisor()));
+      break;
+    }
+  }
+  Polyhedron new_polyhedron(topology(), new_gensys);
+  m_swap(new_polyhedron);
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::refine_with_linear_form_inequality(
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+  const bool is_strict) {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                         "Polyhedron::refine_with_linear_form_inequality:"
+                         " FP_Format not a floating point type.");
+
+  // Dimension compatibility checks.
+  // The dimensions of left and right should not be greater than the
+  // dimension of *this.
+  const dimension_type left_space_dim = left.space_dimension();
+  if (space_dim < left_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(l1, l2, s)", "l1", left);
+
+  const dimension_type right_space_dim = right.space_dimension();
+  if (space_dim < right_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(l1, l2, s)", "l2", right);
+
+  // We assume that the analyzer will not refine an unreachable test.
+  PPL_ASSERT(!marked_empty());
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(left))
+    return;
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(right))
+    return;
+
+  // Overapproximate left - right.
+  FP_Linear_Form left_minus_right(left);
+  left_minus_right -= right;
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(left_minus_right))
+    return;
+
+  dimension_type lf_space_dim = left_minus_right.space_dimension();
+  FP_Linear_Form lf_approx;
+  overapproximate_linear_form(left_minus_right, lf_space_dim, lf_approx);
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(lf_approx))
+    return;
+
+  // Normalize left - right.
+  Linear_Expression lf_approx_le;
+  convert_to_integer_expression(lf_approx, lf_space_dim, lf_approx_le);
+
+  // Finally, do the refinement.
+  if (!is_strict || is_necessarily_closed())
+    refine_with_constraint(lf_approx_le <= 0);
+  else
+    refine_with_constraint(lf_approx_le < 0);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::affine_form_image(const Variable var,
+const Linear_Form<Interval <FP_Format, Interval_Info> >& lf) {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                         "Polyhedron::affine_form_image:"
+                         " FP_Format not a floating point type.");
+
+  // Dimension compatibility checks.
+  // The dimension of lf should not be greater than the dimension of *this.
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(v, l, s)", "l", lf);
+
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_form_image(v, l, s)", "v", var);
+
+  // We assume that the analyzer will not perform an unreachable assignment.
+  PPL_ASSERT(!marked_empty());
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(lf)) {
+    *this = Polyhedron(topology(), space_dim, UNIVERSE);
+    return;
+  }
+
+  // Overapproximate lf.
+  FP_Linear_Form lf_approx;
+  overapproximate_linear_form(lf, lf_space_dim, lf_approx);
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(lf_approx)) {
+    *this = Polyhedron(topology(), space_dim, UNIVERSE);
+    return;
+  }
+
+  // Normalize lf.
+  Linear_Expression lf_approx_le;
+  PPL_DIRTY_TEMP_COEFFICIENT(lo_coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(hi_coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(denominator);
+  convert_to_integer_expressions(lf_approx, lf_space_dim, lf_approx_le,
+                                 lo_coeff, hi_coeff, denominator);
+
+  // Finally, do the assignment.
+  bounded_affine_image(var, lf_approx_le + lo_coeff, lf_approx_le + hi_coeff,
+                       denominator);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::overapproximate_linear_form
+(const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Form<Interval <FP_Format, Interval_Info> >& result) {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                         "Polyhedron::overapproximate_linear_form:"
+                         " FP_Format not a floating point type.");
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  // Build a Box from the Polyhedron so that we can extract upper and
+  // lower bounds of variables easily.
+  Box<FP_Interval_Type> box(*this);
+
+  result = FP_Linear_Form(lf.inhomogeneous_term());
+  // FIXME: this may not be policy-neutral.
+  const FP_Interval_Type aux_divisor1(static_cast<FP_Format>(0.5));
+  FP_Interval_Type aux_divisor2(aux_divisor1);
+  aux_divisor2.lower() = static_cast<FP_Format>(-0.5);
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    Variable curr_var(i);
+    const FP_Interval_Type& curr_coeff = lf.coefficient(curr_var);
+    PPL_ASSERT(curr_coeff.is_bounded());
+    FP_Format curr_lb = curr_coeff.lower();
+    FP_Format curr_ub = curr_coeff.upper();
+    if (curr_lb != 0 || curr_ub != 0) {
+      const FP_Interval_Type& curr_int = box.get_interval(curr_var);
+      FP_Interval_Type curr_addend(curr_ub - curr_lb);
+      curr_addend *= aux_divisor2;
+      curr_addend *= curr_int;
+      result += curr_addend;
+      curr_addend = FP_Interval_Type(curr_lb + curr_ub);
+      curr_addend *= aux_divisor1;
+      FP_Linear_Form curr_addend_lf(curr_var);
+      curr_addend_lf *= curr_addend;
+      result += curr_addend_lf;
+    }
+  }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expression(
+                const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+                const dimension_type lf_dimension,
+                Linear_Expression& result) {
+  result = Linear_Expression();
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  std::vector<Coefficient> numerators(lf_dimension+1);
+  std::vector<Coefficient> denominators(lf_dimension+1);
+
+  // Convert each floating point number to a pair <numerator, denominator>
+  // and compute the lcm of all denominators.
+  PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+  lcm = 1;
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+  // FIXME: are these checks numerator[i] != 0 really necessary?
+  numer_denom(b.lower(), numerators[lf_dimension],
+                         denominators[lf_dimension]);
+  if (numerators[lf_dimension] != 0)
+      lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+    numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+    if (numerators[i] != 0)
+      lcm_assign(lcm, lcm, denominators[i]);
+  }
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    if (numerators[i] != 0) {
+      exact_div_assign(denominators[i], lcm, denominators[i]);
+      numerators[i] *= denominators[i];
+      result += numerators[i] * Variable(i);
+    }
+  }
+
+  if (numerators[lf_dimension] != 0) {
+    exact_div_assign(denominators[lf_dimension],
+                     lcm, denominators[lf_dimension]);
+    numerators[lf_dimension] *= denominators[lf_dimension];
+    result += numerators[lf_dimension];
+  }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expressions(
+                const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+                const dimension_type lf_dimension, Linear_Expression& res,
+                Coefficient& res_low_coeff, Coefficient& res_hi_coeff,
+                Coefficient& denominator) {
+  res = Linear_Expression();
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  std::vector<Coefficient> numerators(lf_dimension+2);
+  std::vector<Coefficient> denominators(lf_dimension+2);
+
+  // Convert each floating point number to a pair <numerator, denominator>
+  // and compute the lcm of all denominators.
+  Coefficient& lcm = denominator;
+  lcm = 1;
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+  numer_denom(b.lower(), numerators[lf_dimension], denominators[lf_dimension]);
+  // FIXME: are these checks numerator[i] != 0 really necessary?
+  if (numerators[lf_dimension] != 0)
+      lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+  numer_denom(b.upper(), numerators[lf_dimension+1],
+                         denominators[lf_dimension+1]);
+  if (numerators[lf_dimension+1] != 0)
+      lcm_assign(lcm, lcm, denominators[lf_dimension+1]);
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+    numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+    if (numerators[i] != 0)
+      lcm_assign(lcm, lcm, denominators[i]);
+  }
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    if (numerators[i] != 0) {
+      exact_div_assign(denominators[i], lcm, denominators[i]);
+      numerators[i] *= denominators[i];
+      res += numerators[i] * Variable(i);
+    }
+  }
+
+  if (numerators[lf_dimension] != 0) {
+    exact_div_assign(denominators[lf_dimension],
+                     lcm, denominators[lf_dimension]);
+    numerators[lf_dimension] *= denominators[lf_dimension];
+    res_low_coeff = numerators[lf_dimension];
+  }
+  else
+    res_low_coeff = Coefficient(0);
+
+  if (numerators[lf_dimension+1] != 0) {
+    exact_div_assign(denominators[lf_dimension+1],
+                     lcm, denominators[lf_dimension+1]);
+    numerators[lf_dimension+1] *= denominators[lf_dimension+1];
+    res_hi_coeff = numerators[lf_dimension+1];
+  }
+  else
+    res_hi_coeff = Coefficient(0);
+}
+
+template <typename C>
+void
+Polyhedron::throw_dimension_incompatible(const char* method,
+                                         const char* lf_name,
+                                         const Linear_Form<C>& lf) const {
+  throw_dimension_incompatible(method, lf_name, lf.space_dimension());
+}
+
+template <typename Input>
+Input&
+Polyhedron::check_obj_space_dimension_overflow(Input& input,
+                                               const Topology topol,
+                                               const char* method,
+                                               const char* reason) {
+  check_space_dimension_overflow(input.space_dimension(),
+                                 max_space_dimension(),
+                                 topol, method, reason);
+  return input;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_templates_hh)
diff --git a/src/Polyhedron_types.hh b/src/Polyhedron_types.hh
new file mode 100644
index 0000000..05e67f5
--- /dev/null
+++ b/src/Polyhedron_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Polyhedron_types_hh
+#define PPL_Polyhedron_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_types_hh)
diff --git a/src/Polyhedron_widenings.cc b/src/Polyhedron_widenings.cc
new file mode 100644
index 0000000..6960d2f
--- /dev/null
+++ b/src/Polyhedron_widenings.cc
@@ -0,0 +1,875 @@
+/* Polyhedron class implementation
+   (non-inline widening-related member functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Polyhedron_defs.hh"
+#include "BHRZ03_Certificate_defs.hh"
+#include "Rational_Box.hh"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "assert.hh"
+#include <iostream>
+#include <stdexcept>
+#include <deque>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron
+::select_CH78_constraints(const Polyhedron& y,
+                          Constraint_System& cs_selection) const {
+  // Private method: the caller must ensure the following conditions.
+  PPL_ASSERT(topology() == y.topology()
+         && topology() == cs_selection.topology()
+         && space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty()
+         && !has_pending_constraints()
+         && generators_are_up_to_date());
+  PPL_ASSERT(!y.marked_empty()
+         && !y.has_something_pending()
+         && y.constraints_are_minimized());
+
+  // A constraint in `y.con_sys' is copied to `cs_selection'
+  // if it is satisfied by all the generators of `gen_sys'.
+
+  // Note: the loop index `i' goes upward to avoid reversing
+  // the ordering of the chosen constraints.
+  for (dimension_type i = 0, end = y.con_sys.num_rows(); i < end; ++i) {
+    const Constraint& c = y.con_sys[i];
+    if (gen_sys.satisfied_by_all_generators(c))
+      cs_selection.insert(c);
+  }
+}
+
+void
+PPL::Polyhedron
+::select_H79_constraints(const Polyhedron& y,
+                         Constraint_System& cs_selected,
+                         Constraint_System& cs_not_selected) const {
+  // Private method: the caller must ensure the following conditions
+  // (beside the inclusion `y <= x').
+  PPL_ASSERT(topology() == y.topology()
+         && topology() == cs_selected.topology()
+         && topology() == cs_not_selected.topology());
+  PPL_ASSERT(space_dim == y.space_dim);
+  PPL_ASSERT(!marked_empty()
+         && !has_pending_generators()
+         && constraints_are_up_to_date());
+  PPL_ASSERT(!y.marked_empty()
+         && !y.has_something_pending()
+         && y.constraints_are_minimized()
+         && y.generators_are_up_to_date());
+
+  // FIXME: this is a workaround for NNC polyhedra.
+  if (!y.is_necessarily_closed()) {
+    // Force strong minimization of constraints.
+    y.strongly_minimize_constraints();
+    // Recompute generators (without compromising constraint minimization).
+    y.update_generators();
+  }
+
+  // Obtain a sorted copy of `y.sat_g'.
+  if (!y.sat_g_is_up_to_date())
+    y.update_sat_g();
+  Bit_Matrix tmp_sat_g = y.sat_g;
+  // Remove from `tmp_sat_g' the rows corresponding to tautologies
+  // (i.e., the positivity or epsilon-bounding constraints):
+  // this is needed in order to widen the polyhedron and not the
+  // corresponding homogenized polyhedral cone.
+  const Constraint_System& y_cs = y.con_sys;
+  const dimension_type old_num_rows = y_cs.num_rows();
+  dimension_type num_rows = old_num_rows;
+  for (dimension_type i = 0; i < num_rows; ++i)
+    if (y_cs[i].is_tautological()) {
+      using std::swap;
+      --num_rows;
+      swap(tmp_sat_g[i], tmp_sat_g[num_rows]);
+    }
+  tmp_sat_g.remove_trailing_rows(old_num_rows - num_rows);
+  tmp_sat_g.sort_rows();
+
+  // A constraint in `con_sys' is copied to `cs_selected'
+  // if its behavior with respect to `y.gen_sys' is the same
+  // as that of another constraint in `y.con_sys'.
+  // otherwise it is copied to `cs_not_selected'.
+  // Namely, we check whether the saturation row `buffer'
+  // (built starting from the given constraint and `y.gen_sys')
+  // is a row of the saturation matrix `tmp_sat_g'.
+
+  // CHECKME: the following comment is only applicable when `y.gen_sys'
+  // is minimized. In that case, the comment suggests that it would be
+  // possible to use a fast (but incomplete) redundancy test based on
+  // the number of saturators in `buffer'.
+  // NOTE: If the considered constraint of `con_sys' does not
+  // satisfy the saturation rule (see Section \ref prelims), then
+  // it will not appear in the resulting constraint system,
+  // because `tmp_sat_g' is built starting from a minimized polyhedron.
+
+  // The size of `buffer' will reach sat.num_columns() bits.
+  Bit_Row buffer;
+  // Note: the loop index `i' goes upward to avoid reversing
+  // the ordering of the chosen constraints.
+  for (dimension_type i = 0, end = con_sys.num_rows(); i < end; ++i) {
+    const Constraint& ci = con_sys[i];
+    // The saturation row `buffer' is built considering
+    // the `i'-th constraint of the polyhedron `x' and
+    // all the generators of the polyhedron `y'.
+    buffer.clear();
+    for (dimension_type j = y.gen_sys.num_rows(); j-- > 0; ) {
+      const int sp_sgn = Scalar_Products::sign(ci, y.gen_sys[j]);
+      // We are assuming that `y <= x'.
+      PPL_ASSERT(sp_sgn >= 0
+             || (!is_necessarily_closed()
+                 && ci.is_strict_inequality()
+                 && y.gen_sys[j].is_point()));
+      if (sp_sgn > 0)
+        buffer.set(j);
+    }
+    // We check whether `buffer' is a row of `tmp_sat_g',
+    // exploiting its sortedness in order to have faster comparisons.
+    if (tmp_sat_g.sorted_contains(buffer))
+      cs_selected.insert(ci);
+    else
+      cs_not_selected.insert(ci);
+  }
+}
+
+void
+PPL::Polyhedron::H79_widening_assign(const Polyhedron& y, unsigned* tp) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  const Topology topol = x.topology();
+  if (topol != y.topology())
+    throw_topology_incompatible("H79_widening_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("H79_widening_assign(y)", "y", y);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  // If any argument is zero-dimensional or empty,
+  // the H79-widening behaves as the identity function.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // `y.gen_sys' should be in minimal form and
+  // `y.sat_g' should be up-to-date.
+  if (y.is_necessarily_closed()) {
+    if (!y.minimize())
+      // `y' is empty: the result is `x'.
+      return;
+  }
+  else {
+    // Dealing with a NNC polyhedron.
+    // To obtain a correct reasoning when comparing
+    // the constraints of `x' with the generators of `y',
+    // we enforce the inclusion relation holding between
+    // the two NNC polyhedra `x' and `y' (i.e., `y <= x')
+    // to also hold for the corresponding eps-representations:
+    // this is obtained by intersecting the two eps-representations.
+    Polyhedron& yy = const_cast<Polyhedron&>(y);
+    yy.intersection_assign(x);
+    if (yy.is_empty())
+      // The result is `x'.
+      return;
+  }
+
+  // If we only have the generators of `x' and the dimensions of
+  // the two polyhedra are the same, we can compute the standard
+  // widening by using the specification in [CousotH78], therefore
+  // avoiding converting from generators to constraints.
+  if (x.has_pending_generators() || !x.constraints_are_up_to_date()) {
+    Constraint_System CH78_cs(topol);
+    x.select_CH78_constraints(y, CH78_cs);
+
+    if (CH78_cs.num_rows() == y.con_sys.num_rows()) {
+      // Having selected all the constraints, the result is `y'.
+      x = y;
+      return;
+    }
+    // Otherwise, check if `x' and `y' have the same dimension.
+    // Note that `y.con_sys' is minimized and `CH78_cs' has no redundant
+    // constraints, since it is a subset of the former.
+    else if (CH78_cs.num_equalities() == y.con_sys.num_equalities()) {
+      // Let `x' be defined by the constraints in `CH78_cs'.
+      Polyhedron CH78(topol, x.space_dim, UNIVERSE);
+      CH78.add_recycled_constraints(CH78_cs);
+
+      // Check whether we are using the widening-with-tokens technique
+      // and there still are tokens available.
+      if (tp != 0 && *tp > 0) {
+        // There are tokens available. If `CH78' is not a subset of `x',
+        // then it is less precise and we use one of the available tokens.
+        if (!x.contains(CH78))
+          --(*tp);
+      }
+      else
+        // No tokens.
+        x.m_swap(CH78);
+      PPL_ASSERT_HEAVY(x.OK(true));
+      return;
+    }
+  }
+
+  // As the dimension of `x' is strictly greater than the dimension of `y',
+  // we have to compute the standard widening by selecting a subset of
+  // the constraints of `x'.
+  // `x.con_sys' is just required to be up-to-date, because:
+  // - if `x.con_sys' is unsatisfiable, then by assumption
+  //   also `y' is empty, so that the resulting polyhedron is `x';
+  // - redundant constraints in `x.con_sys' do not affect the result
+  //   of the widening, because if they are selected they will be
+  //   redundant even in the result.
+  if (has_pending_generators())
+    process_pending_generators();
+  else if (!x.constraints_are_up_to_date())
+    x.update_constraints();
+
+  // Copy into `H79_cs' the constraints of `x' that are common to `y',
+  // according to the definition of the H79 widening.
+  Constraint_System H79_cs(topol);
+  Constraint_System x_minus_H79_cs(topol);
+  x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+  if (x_minus_H79_cs.has_no_rows())
+    // We selected all of the constraints of `x',
+    // thus the result of the widening is `x'.
+    return;
+  else {
+    // We selected a strict subset of the constraints of `x'.
+    // NOTE: as `x.con_sys' was not necessarily in minimal form,
+    // this does not imply that the result strictly includes `x'.
+    // Let `H79' be defined by the constraints in `H79_cs'.
+    Polyhedron H79(topol, x.space_dim, UNIVERSE);
+    H79.add_recycled_constraints(H79_cs);
+
+    // Check whether we are using the widening-with-tokens technique
+    // and there still are tokens available.
+    if (tp != 0 && *tp > 0) {
+      // There are tokens available. If `H79' is not a subset of `x',
+      // then it is less precise and we use one of the available tokens.
+      if (!x.contains(H79))
+        --(*tp);
+    }
+    else
+      // No tokens.
+      x.m_swap(H79);
+    PPL_ASSERT_HEAVY(x.OK(true));
+  }
+}
+
+void
+PPL::Polyhedron::limited_H79_extrapolation_assign(const Polyhedron& y,
+                                                  const Constraint_System& cs,
+                                                  unsigned* tp) {
+  Polyhedron& x = *this;
+
+  const dimension_type cs_num_rows = cs.num_rows();
+  // If `cs' is empty, we fall back to ordinary, non-limited widening.
+  if (cs_num_rows == 0) {
+    x.H79_widening_assign(y, tp);
+    return;
+  }
+
+  // Topology compatibility check.
+  if (x.is_necessarily_closed()) {
+    if (!y.is_necessarily_closed())
+      throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+                                  "y", y);
+    if (cs.has_strict_inequalities())
+      throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+                                  "cs", cs);
+  }
+  else if (y.is_necessarily_closed())
+    throw_topology_incompatible("limited_H79_extrapolation_assign(y, cs)",
+                                "y", y);
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)",
+                                 "y", y);
+  // `cs' must be dimension-compatible with the two polyhedra.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (x.space_dim < cs_space_dim)
+    throw_dimension_incompatible("limited_H79_extrapolation_assign(y, cs)",
+                                 "cs", cs);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited H79-widening between two polyhedra in a
+  // zero-dimensional space is a polyhedron in a zero-dimensional
+  // space, too.
+  if (x.space_dim == 0)
+    return;
+
+  if (!y.minimize())
+    // We have just discovered that `y' is empty.
+    return;
+
+  // Update the generators of `x': these are used to select,
+  // from the constraints in `cs', those that must be added
+  // to the resulting polyhedron.
+  if ((x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators()))
+    // We have just discovered that `x' is empty.
+    return;
+
+  Constraint_System new_cs;
+  // The constraints to be added must be satisfied by all the
+  // generators of `x'.  We can disregard `y' because `y <= x'.
+  const Generator_System& x_gen_sys = x.gen_sys;
+  // Iterate upwards here so as to keep the relative ordering of constraints.
+  // Not really an issue: just aesthetics.
+  for (dimension_type i = 0; i < cs_num_rows; ++i) {
+    const Constraint& c = cs[i];
+    if (x_gen_sys.satisfied_by_all_generators(c))
+      new_cs.insert(c);
+  }
+  x.H79_widening_assign(y, tp);
+  x.add_recycled_constraints(new_cs);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron::bounded_H79_extrapolation_assign(const Polyhedron& y,
+                                                  const Constraint_System& cs,
+                                                  unsigned* tp) {
+  Rational_Box x_box(*this, ANY_COMPLEXITY);
+  const Rational_Box y_box(y, ANY_COMPLEXITY);
+  x_box.CC76_widening_assign(y_box);
+  limited_H79_extrapolation_assign(y, cs, tp);
+  Constraint_System x_box_cs = x_box.constraints();
+  add_recycled_constraints(x_box_cs);
+}
+
+bool
+PPL::Polyhedron
+::BHRZ03_combining_constraints(const Polyhedron& y,
+                               const BHRZ03_Certificate& y_cert,
+                               const Polyhedron& H79,
+                               const Constraint_System& x_minus_H79_cs) {
+  Polyhedron& x = *this;
+  // It is assumed that `y <= x <= H79'.
+  PPL_ASSERT(x.topology() == y.topology()
+         && x.topology() == H79.topology()
+         && x.topology() == x_minus_H79_cs.topology());
+  PPL_ASSERT(x.space_dim == y.space_dim
+         && x.space_dim == H79.space_dim
+         && x.space_dim == x_minus_H79_cs.space_dimension());
+  PPL_ASSERT(!x.marked_empty() && !x.has_something_pending()
+         && x.constraints_are_minimized() && x.generators_are_minimized());
+  PPL_ASSERT(!y.marked_empty() && !y.has_something_pending()
+         && y.constraints_are_minimized() && y.generators_are_minimized());
+  PPL_ASSERT(!H79.marked_empty() && !H79.has_something_pending()
+         && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+  // We will choose from `x_minus_H79_cs' many subsets of constraints,
+  // that will be collected (one at a time) in `combining_cs'.
+  // For each group collected, we compute an average constraint,
+  // that will be stored in `new_cs'.
+
+  // There is no point in applying this technique when `x_minus_H79_cs'
+  // has one constraint at most (no ``new'' constraint can be computed).
+  const dimension_type x_minus_H79_cs_num_rows = x_minus_H79_cs.num_rows();
+  if (x_minus_H79_cs_num_rows <= 1)
+    return false;
+
+  const Topology topol = x.topology();
+  Constraint_System combining_cs(topol);
+  Constraint_System new_cs(topol);
+
+  // Consider the points that belong to both `x.gen_sys' and `y.gen_sys'.
+  // For NNC polyhedra, the role of points is played by closure points.
+  const bool closed = x.is_necessarily_closed();
+  for (dimension_type i = y.gen_sys.num_rows(); i-- > 0; ) {
+    const Generator& g = y.gen_sys[i];
+    if ((g.is_point() && closed) || (g.is_closure_point() && !closed)) {
+      // If in `H79.con_sys' there is already an inequality constraint
+      // saturating this point, then there is no need to produce another
+      // constraint.
+      bool lies_on_the_boundary_of_H79 = false;
+      const Constraint_System& H79_cs = H79.con_sys;
+      for (dimension_type j = H79_cs.num_rows(); j-- > 0; ) {
+        const Constraint& c = H79_cs[j];
+        if (c.is_inequality() && Scalar_Products::sign(c, g) == 0) {
+          lies_on_the_boundary_of_H79 = true;
+          break;
+        }
+      }
+      if (lies_on_the_boundary_of_H79)
+        continue;
+
+      // Consider all the constraints in `x_minus_H79_cs'
+      // that are saturated by the point `g'.
+      combining_cs.clear();
+      for (dimension_type j = x_minus_H79_cs_num_rows; j-- > 0; ) {
+        const Constraint& c = x_minus_H79_cs[j];
+        if (Scalar_Products::sign(c, g) == 0)
+          combining_cs.insert(c);
+      }
+      // Build a new constraint by combining all the chosen constraints.
+      const dimension_type combining_cs_num_rows = combining_cs.num_rows();
+      if (combining_cs_num_rows > 0) {
+        if (combining_cs_num_rows == 1)
+          // No combination is needed.
+          new_cs.insert(combining_cs[0]);
+        else {
+          Linear_Expression e(0);
+          bool strict_inequality = false;
+          for (dimension_type h = combining_cs_num_rows; h-- > 0; ) {
+            if (combining_cs[h].is_strict_inequality())
+              strict_inequality = true;
+            e += Linear_Expression(combining_cs[h].expression());
+          }
+
+          if (!e.all_homogeneous_terms_are_zero()) {
+            if (strict_inequality)
+              new_cs.insert(e > 0);
+            else
+              new_cs.insert(e >= 0);
+          }
+        }
+      }
+    }
+  }
+
+  // If none of the collected constraints strictly intersects `H79',
+  // then the technique was unsuccessful.
+  bool improves_upon_H79 = false;
+  const Poly_Con_Relation si = Poly_Con_Relation::strictly_intersects();
+  for (dimension_type i = new_cs.num_rows(); i-- > 0; )
+    if (H79.relation_with(new_cs[i]) == si) {
+      improves_upon_H79 = true;
+      break;
+    }
+  if (!improves_upon_H79)
+    return false;
+
+  // The resulting polyhedron is obtained by adding the constraints
+  // in `new_cs' to polyhedron `H79'.
+  Polyhedron result = H79;
+  result.add_recycled_constraints(new_cs);
+  // Force minimization.
+  result.minimize();
+
+  // Check for stabilization with respect to `y_cert' and improvement
+  // over `H79'.
+  if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+    // The technique was successful.
+    x.m_swap(result);
+    PPL_ASSERT_HEAVY(x.OK(true));
+    return true;
+  }
+  else
+    // The technique was unsuccessful.
+    return false;
+}
+
+bool
+PPL::Polyhedron::BHRZ03_evolving_points(const Polyhedron& y,
+                                        const BHRZ03_Certificate& y_cert,
+                                        const Polyhedron& H79) {
+  Polyhedron& x = *this;
+  // It is assumed that `y <= x <= H79'.
+  PPL_ASSERT(x.topology() == y.topology()
+         && x.topology() == H79.topology());
+  PPL_ASSERT(x.space_dim == y.space_dim
+         && x.space_dim == H79.space_dim);
+  PPL_ASSERT(!x.marked_empty() && !x.has_something_pending()
+         && x.constraints_are_minimized() && x.generators_are_minimized());
+  PPL_ASSERT(!y.marked_empty() && !y.has_something_pending()
+         && y.constraints_are_minimized() && y.generators_are_minimized());
+  PPL_ASSERT(!H79.marked_empty() && !H79.has_something_pending()
+         && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+  // For each point in `x.gen_sys' that is not in `y',
+  // this technique tries to identify a set of rays that:
+  //  - are included in polyhedron `H79';
+  //  - when added to `y' will subsume the point.
+  Generator_System candidate_rays;
+
+  const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows();
+  const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows();
+  const bool closed = x.is_necessarily_closed();
+  for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) {
+    const Generator& g1 = x.gen_sys[i];
+    // For C polyhedra, we choose a point of `x.gen_sys'
+    // that is not included in `y'.
+    // In the case of NNC polyhedra, we can restrict attention to
+    // closure points (considering also points will only add redundancy).
+    if (((g1.is_point() && closed) || (g1.is_closure_point() && !closed))
+        && y.relation_with(g1) == Poly_Gen_Relation::nothing()) {
+      // For each point (resp., closure point) `g2' in `y.gen_sys',
+      // where `g1' and `g2' are different,
+      // build the candidate ray `g1 - g2'.
+      for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) {
+        const Generator& g2 = y.gen_sys[j];
+        if ((g2.is_point() && closed)
+            || (g2.is_closure_point() && !closed)) {
+          PPL_ASSERT(compare(g1, g2) != 0);
+          Generator ray_from_g2_to_g1 = g1;
+          ray_from_g2_to_g1.linear_combine(g2, 0);
+          candidate_rays.insert(ray_from_g2_to_g1);
+        }
+      }
+    }
+  }
+
+  // Be non-intrusive.
+  Polyhedron result = x;
+  result.add_recycled_generators(candidate_rays);
+  result.intersection_assign(H79);
+  // Force minimization.
+  result.minimize();
+
+  // Check for stabilization with respect to `y_cert' and improvement
+  // over `H79'.
+  if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+    // The technique was successful.
+    x.m_swap(result);
+    PPL_ASSERT_HEAVY(x.OK(true));
+    return true;
+  }
+  else
+    // The technique was unsuccessful.
+    return false;
+}
+
+void
+PPL::Polyhedron::modify_according_to_evolution(Linear_Expression& ray,
+                                               const Linear_Expression& x,
+                                               const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+  std::deque<bool> considered(x.space_dimension());
+  Linear_Expression::const_iterator x_end = x.end();
+  Linear_Expression::const_iterator y_end = y.end();
+  Linear_Expression::const_iterator y_k = y.begin();
+  for (Linear_Expression::const_iterator x_k = x.begin(); x_k != x_end; ++x_k) {
+    const Variable k_var = x_k.variable();
+    const dimension_type k = k_var.id();
+    if (considered[k])
+      continue;
+
+    while (y_k != y_end && y_k.variable().id() < k)
+      ++y_k;
+
+    if (y_k == y_end)
+      break;
+
+    const Variable y_k_var = y_k.variable();
+
+    // Note that y_k_var.id() may be greater than k.
+
+    Linear_Expression::const_iterator y_h = y_k;
+    // Do *not* increment y_h, since it may be after k already.
+    Linear_Expression::const_iterator x_h = x_k;
+    ++x_h;
+    for ( ; x_h != x_end; ++x_h) {
+      const dimension_type h = x_h.variable().id();
+      if (considered[h])
+        continue;
+
+      while (y_h != y_end && y_h.variable().id() < h)
+        ++y_h;
+
+      // Note that y_h may be y_end, and y_h.variable().id() may not be k.
+
+      if (y_h != y_end && y_h.variable().id() == h)
+        tmp = (*x_k) * (*y_h);
+      else
+        tmp = 0;
+
+      if (y_k_var.id() == k) {
+        // The following line optimizes the computation of
+        // <CODE> tmp -= x[h] * y[k]; </CODE>
+        Parma_Polyhedra_Library::sub_mul_assign(tmp, *x_h, *y_k);
+      }
+
+      const int clockwise = sgn(tmp);
+      const int first_or_third_quadrant = sgn(*x_k) * sgn(*x_h);
+      switch (clockwise * first_or_third_quadrant) {
+      case -1:
+        ray.set_coefficient(k_var, Coefficient_zero());
+        considered[k] = true;
+        break;
+      case 1:
+        ray.set_coefficient(Variable(h), Coefficient_zero());
+        considered[h] = true;
+        break;
+      default:
+        break;
+      }
+    }
+  }
+  ray.normalize();
+}
+
+bool
+PPL::Polyhedron::BHRZ03_evolving_rays(const Polyhedron& y,
+                                      const BHRZ03_Certificate& y_cert,
+                                      const Polyhedron& H79) {
+  Polyhedron& x = *this;
+  // It is assumed that `y <= x <= H79'.
+  PPL_ASSERT(x.topology() == y.topology()
+         && x.topology() == H79.topology());
+  PPL_ASSERT(x.space_dim == y.space_dim
+         && x.space_dim == H79.space_dim);
+  PPL_ASSERT(!x.marked_empty() && !x.has_something_pending()
+         && x.constraints_are_minimized() && x.generators_are_minimized());
+  PPL_ASSERT(!y.marked_empty() && !y.has_something_pending()
+         && y.constraints_are_minimized() && y.generators_are_minimized());
+  PPL_ASSERT(!H79.marked_empty() && !H79.has_something_pending()
+         && H79.constraints_are_minimized() && H79.generators_are_minimized());
+
+  const dimension_type x_gen_sys_num_rows = x.gen_sys.num_rows();
+  const dimension_type y_gen_sys_num_rows = y.gen_sys.num_rows();
+
+  // Candidate rays are kept in a temporary generator system.
+  Generator_System candidate_rays;
+  for (dimension_type i = x_gen_sys_num_rows; i-- > 0; ) {
+    const Generator& x_g = x.gen_sys[i];
+    // We choose a ray of `x' that does not belong to `y'.
+    if (x_g.is_ray() && y.relation_with(x_g) == Poly_Gen_Relation::nothing()) {
+      for (dimension_type j = y_gen_sys_num_rows; j-- > 0; ) {
+        const Generator& y_g = y.gen_sys[j];
+        if (y_g.is_ray()) {
+          Generator new_ray(x_g);
+          // Modify `new_ray' according to the evolution of `x_g' with
+          // respect to `y_g'.
+          modify_according_to_evolution(new_ray.expr, x_g.expr, y_g.expr);
+          PPL_ASSERT(new_ray.OK());
+          candidate_rays.insert(new_ray);
+        }
+      }
+    }
+  }
+
+  // If there are no candidate rays, we cannot obtain stabilization.
+  if (candidate_rays.has_no_rows())
+    return false;
+
+  // Be non-intrusive.
+  Polyhedron result = x;
+  result.add_recycled_generators(candidate_rays);
+  result.intersection_assign(H79);
+  // Force minimization.
+  result.minimize();
+
+  // Check for stabilization with respect to `y' and improvement over `H79'.
+  if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+    // The technique was successful.
+    x.m_swap(result);
+    PPL_ASSERT_HEAVY(x.OK(true));
+    return true;
+  }
+  else
+    // The technique was unsuccessful.
+    return false;
+}
+
+void
+PPL::Polyhedron::BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp) {
+  Polyhedron& x = *this;
+  // Topology compatibility check.
+  if (x.topology() != y.topology())
+    throw_topology_incompatible("BHRZ03_widening_assign(y)", "y", y);
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("BHRZ03_widening_assign(y)", "y", y);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  // If any argument is zero-dimensional or empty,
+  // the BHRZ03-widening behaves as the identity function.
+  if (x.space_dim == 0 || x.marked_empty() || y.marked_empty())
+    return;
+
+  // `y.con_sys' and `y.gen_sys' should be in minimal form.
+  if (!y.minimize())
+    // `y' is empty: the result is `x'.
+    return;
+  // `x.con_sys' and `x.gen_sys' should be in minimal form.
+  x.minimize();
+
+  // Compute certificate info for polyhedron `y'.
+  const BHRZ03_Certificate y_cert(y);
+
+  // If the iteration is stabilizing, the resulting polyhedron is `x'.
+  // At this point, also check if the two polyhedra are the same
+  // (exploiting the knowledge that `y <= x').
+  if (y_cert.is_stabilizing(x) || y.contains(x)) {
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Here the iteration is not immediately stabilizing.
+  // If we are using the widening-with-tokens technique and
+  // there are tokens available, use one of them and return `x'.
+  if (tp != 0 && *tp > 0) {
+    --(*tp);
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Copy into `H79_cs' the constraints that are common to `x' and `y',
+  // according to the definition of the H79 widening.
+  // The other ones are copied into `x_minus_H79_cs'.
+  const Topology topol = x.topology();
+  Constraint_System H79_cs(topol);
+  Constraint_System x_minus_H79_cs(topol);
+  x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+  // We cannot have selected all of the rows, since otherwise
+  // the iteration should have been immediately stabilizing.
+  PPL_ASSERT(!x_minus_H79_cs.has_no_rows());
+  // Be careful to obtain the right space dimension
+  // (because `H79_cs' may be empty).
+  Polyhedron H79(topol, x.space_dim, UNIVERSE);
+  H79.add_recycled_constraints(H79_cs);
+  // Force minimization.
+  H79.minimize();
+
+  // NOTE: none of the following widening heuristics is intrusive:
+  // they will modify `x' only when returning successfully.
+  if (x.BHRZ03_combining_constraints(y, y_cert, H79, x_minus_H79_cs))
+    return;
+
+  PPL_ASSERT_HEAVY(H79.OK() && x.OK() && y.OK());
+
+  if (x.BHRZ03_evolving_points(y, y_cert, H79))
+    return;
+
+  PPL_ASSERT_HEAVY(H79.OK() && x.OK() && y.OK());
+
+  if (x.BHRZ03_evolving_rays(y, y_cert, H79))
+    return;
+
+  PPL_ASSERT_HEAVY(H79.OK() && x.OK() && y.OK());
+
+  // No previous technique was successful: fall back to the H79 widening.
+  x.m_swap(H79);
+  PPL_ASSERT_HEAVY(x.OK(true));
+
+  // The H79 widening is always stabilizing.
+  PPL_ASSERT(y_cert.is_stabilizing(x));
+}
+
+void
+PPL::Polyhedron
+::limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+                                      const Constraint_System& cs,
+                                      unsigned* tp) {
+  Polyhedron& x = *this;
+  const dimension_type cs_num_rows = cs.num_rows();
+  // If `cs' is empty, we fall back to ordinary, non-limited widening.
+  if (cs_num_rows == 0) {
+    x.BHRZ03_widening_assign(y, tp);
+    return;
+  }
+
+  // Topology compatibility check.
+  if (x.is_necessarily_closed()) {
+    if (!y.is_necessarily_closed())
+      throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+                                  "y", y);
+    if (cs.has_strict_inequalities())
+      throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+                                  "cs", cs);
+  }
+  else if (y.is_necessarily_closed())
+    throw_topology_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+                                "y", y);
+
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+                                 "y", y);
+  // `cs' must be dimension-compatible with the two polyhedra.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (x.space_dim < cs_space_dim)
+    throw_dimension_incompatible("limited_BHRZ03_extrapolation_assign(y, cs)",
+                                 "cs", cs);
+
+  // Assume `y' is contained in or equal to `x'.
+  PPL_EXPECT_HEAVY(copy_contains(x, y));
+
+  if (y.marked_empty())
+    return;
+  if (x.marked_empty())
+    return;
+
+  // The limited BHRZ03-widening between two polyhedra in a
+  // zero-dimensional space is a polyhedron in a zero-dimensional
+  // space, too.
+  if (x.space_dim == 0)
+    return;
+
+  if (!y.minimize())
+    // We have just discovered that `y' is empty.
+    return;
+
+  // Update the generators of `x': these are used to select,
+  // from the constraints in `cs', those that must be added
+  // to the resulting polyhedron.
+  if ((x.has_pending_constraints() && !x.process_pending_constraints())
+      || (!x.generators_are_up_to_date() && !x.update_generators()))
+    // We have just discovered that `x' is empty.
+    return;
+
+  Constraint_System new_cs;
+  // The constraints to be added must be satisfied by all the
+  // generators of `x'. We can disregard `y' because `y <= x'.
+  const Generator_System& x_gen_sys = x.gen_sys;
+  // Iterate upwards here so as to keep the relative ordering of constraints.
+  // Not really an issue: just aesthetics.
+  for (dimension_type i = 0; i < cs_num_rows; ++i) {
+    const Constraint& c = cs[i];
+    if (x_gen_sys.satisfied_by_all_generators(c))
+      new_cs.insert(c);
+  }
+  x.BHRZ03_widening_assign(y, tp);
+  x.add_recycled_constraints(new_cs);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+void
+PPL::Polyhedron
+::bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+                                      const Constraint_System& cs,
+                                      unsigned* tp) {
+  Rational_Box x_box(*this, ANY_COMPLEXITY);
+  const Rational_Box y_box(y, ANY_COMPLEXITY);
+  x_box.CC76_widening_assign(y_box);
+  limited_BHRZ03_extrapolation_assign(y, cs, tp);
+  Constraint_System x_box_cs = x_box.constraints();
+  add_recycled_constraints(x_box_cs);
+}
diff --git a/src/Powerset_defs.hh b/src/Powerset_defs.hh
new file mode 100644
index 0000000..1fae637
--- /dev/null
+++ b/src/Powerset_defs.hh
@@ -0,0 +1,450 @@
+/* Powerset class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Powerset_defs_hh
+#define PPL_Powerset_defs_hh
+
+#include "Powerset_types.hh"
+#include "globals_types.hh"
+#include "iterator_to_const_defs.hh"
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Powerset */
+template <typename D>
+void swap(Powerset<D>& x, Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+  This class offers a generic implementation of a
+  <EM>powerset</EM> domain as defined in Section \ref powerset.
+
+  Besides invoking the available methods on the disjuncts of a Powerset,
+  this class also provides bidirectional iterators that allow for a
+  direct inspection of these disjuncts. For a consistent handling of
+  Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+  that the disjuncts cannot be overwritten. Rather, by using the class
+  <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+  (possibly so as to later add back modified versions).  As an example
+  of iterator usage, the following template function drops from
+  powerset \p ps all the disjuncts that would have become redundant by
+  the addition of an external element \p d.
+
+  \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+  for (typename Powerset<D>::iterator i = ps.begin(),
+         ps_end = ps.end(), i != ps_end; )
+    if (i->definitely_entails(d))
+      i = ps.drop_disjunct(i);
+    else
+      ++i;
+}
+  \endcode
+
+  The template class D must provide the following methods.
+  \code
+    memory_size_type total_memory_in_bytes() const
+  \endcode
+  Returns a lower bound on the total size in bytes of the memory
+  occupied by the instance of D.
+  \code
+    bool is_top() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the top
+  element of the domain.
+  \code
+    bool is_bottom() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the
+  bottom element of the domain.
+  \code
+    bool definitely_entails(const D& y) const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D definitely entails
+  <CODE>y</CODE>.  Returns <CODE>false</CODE> if the instance may not
+  entail <CODE>y</CODE> (i.e., if the instance does not entail
+  <CODE>y</CODE> or if entailment could not be decided).
+  \code
+    void upper_bound_assign(const D& y)
+  \endcode
+  Assigns to the instance of D an upper bound of the instance and
+  <CODE>y</CODE>.
+  \code
+    void meet_assign(const D& y)
+  \endcode
+  Assigns to the instance of D the meet of the instance and
+  <CODE>y</CODE>.
+  \code
+    bool OK() const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D is in a consistent
+  state, else returns <CODE>false</CODE>.
+
+  The following operators on the template class D must be defined.
+  \code
+    operator<<(std::ostream& s, const D& x)
+  \endcode
+  Writes a textual representation of the instance of D on
+  <CODE>s</CODE>.
+  \code
+    operator==(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are equivalent D's.
+  \code
+    operator!=(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Default constructor: builds the bottom of the powerset constraint
+    system (i.e., the empty powerset).
+  */
+  Powerset();
+
+  //! Copy constructor.
+  Powerset(const Powerset& y);
+
+  /*! \brief
+    If \p d is not bottom, builds a powerset containing only \p d.
+    Builds the empty powerset otherwise.
+  */
+  explicit Powerset(const D& d);
+
+  //! Destructor.
+  ~Powerset();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Powerset Object
+  //@{
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+    Returns <CODE>false</CODE> if \p *this may not entail \p y
+    (i.e., if \p *this does not entail \p y or if entailment could
+    not be decided).
+  */
+  bool definitely_entails(const Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top
+    element of the powerset constraint system (i.e., it represents
+    the universe).
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    element of the powerset constraint system (i.e., it represents
+    the empty set).
+  */
+  bool is_bottom() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  // FIXME: document and perhaps use an enum instead of a bool.
+  bool OK(bool disallow_bottom = false) const;
+
+  //@} // Member Functions that Do Not Modify the Powerset Object
+
+protected:
+  //! A powerset is implemented as a sequence of elements.
+  /*!
+    The particular sequence employed must support efficient deletion
+    in any position and efficient back insertion.
+  */
+  typedef std::list<D> Sequence;
+
+  //! Alias for the low-level iterator on the disjuncts.
+  typedef typename Sequence::iterator Sequence_iterator;
+
+  //! Alias for the low-level %const_iterator on the disjuncts.
+  typedef typename Sequence::const_iterator Sequence_const_iterator;
+
+  //! The sequence container holding powerset's elements.
+  Sequence sequence;
+
+  //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+  mutable bool reduced;
+
+public:
+  // Sequence manipulation types, accessors and modifiers
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::value_type value_type;
+
+  /*! \brief
+    Alias for a <EM>read-only</EM> bidirectional %iterator on the
+    disjuncts of a Powerset element.
+
+    By using this iterator type, the disjuncts cannot be overwritten,
+    but they can be removed using methods
+    <CODE>drop_disjunct(iterator position)</CODE> and
+    <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+    while still ensuring a correct handling of Omega-reduction.
+  */
+  typedef iterator_to_const<Sequence> iterator;
+
+  //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+  typedef const_iterator_to_const<Sequence> const_iterator;
+
+  //! The reverse iterator type built from Powerset::iterator.
+  typedef std::reverse_iterator<iterator> reverse_iterator;
+
+  //! The reverse iterator type built from Powerset::const_iterator.
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+  //! \name Member Functions for the Direct Manipulation of Disjuncts
+  //@{
+
+  /*! \brief
+    Drops from the sequence of disjuncts in \p *this all the
+    non-maximal elements so that \p *this is non-redundant.
+
+    This method is declared <CODE>const</CODE> because, even though
+    Omega-reduction may change the syntactic representation of \p *this,
+    its semantics will be unchanged.
+  */
+  void omega_reduce() const;
+
+  //! Returns the number of disjuncts.
+  size_type size() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there are no disjuncts in
+    \p *this.
+  */
+  bool empty() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns a const_iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  /*! \brief
+    Returns a reverse_iterator pointing to the last disjunct, if \p *this
+    is not empty; otherwise, returns the before-the-start reverse_iterator.
+  */
+  reverse_iterator rbegin();
+
+  //! Returns the before-the-start reverse_iterator.
+  reverse_iterator rend();
+
+  /*! \brief
+    Returns a const_reverse_iterator pointing to the last disjunct,
+    if \p *this is not empty; otherwise, returns the before-the-start
+    const_reverse_iterator.
+  */
+  const_reverse_iterator rbegin() const;
+
+  //! Returns the before-the-start const_reverse_iterator.
+  const_reverse_iterator rend() const;
+
+  //! Adds to \p *this the disjunct \p d.
+  void add_disjunct(const D& d);
+
+  /*! \brief
+    Drops the disjunct in \p *this pointed to by \p position, returning
+    an iterator to the disjunct following \p position.
+  */
+  iterator drop_disjunct(iterator position);
+
+  //! Drops all the disjuncts from \p first to \p last (excluded).
+  void drop_disjuncts(iterator first, iterator last);
+
+  //! Drops all the disjuncts, making \p *this an empty powerset.
+  void clear();
+
+  //@} // Member Functions for the Direct Manipulation of Disjuncts
+
+  //! \name Member Functions that May Modify the Powerset Object
+  //@{
+
+  //! The assignment operator.
+  Powerset& operator=(const Powerset& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Powerset& y);
+
+  //! Assigns to \p *this the least upper bound of \p *this and \p y.
+  void least_upper_bound_assign(const Powerset& y);
+
+  //! Assigns to \p *this an upper bound of \p *this and \p y.
+  /*!
+    The result will be the least upper bound of \p *this and \p y.
+  */
+  void upper_bound_assign(const Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the least upper bound of \p *this and \p y
+    and returns \c true.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Powerset& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Powerset& y);
+
+  /*! \brief
+    If \p *this is not empty (i.e., it is not the bottom element),
+    it is reduced to a singleton obtained by computing an upper-bound
+    of all the disjuncts.
+  */
+  void collapse();
+
+  //@} // Member Functions that May Modify the Powerset element
+
+protected:
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this does not contain
+    non-maximal elements.
+  */
+  bool is_omega_reduced() const;
+
+  /*! \brief Upon return, \p *this will contain at most \p
+    max_disjuncts elements; the set of disjuncts in positions greater
+    than or equal to \p max_disjuncts, will be replaced at that
+    position by their upper-bound.
+  */
+  void collapse(unsigned max_disjuncts);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element and ensuring
+    partial Omega-reduction.
+
+    If \p d is not the bottom element and is not Omega-redundant with
+    respect to elements in positions between \p first and \p last, all
+    elements in these positions that would be made Omega-redundant by the
+    addition of \p d are dropped and \p d is added to the reduced
+    sequence.
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
+  */
+  iterator add_non_bottom_disjunct_preserve_reduction(const D& d,
+                                                      iterator first,
+                                                      iterator last);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d, assuming \p d is not the
+    bottom element and preserving Omega-reduction.
+
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
+  */
+  void add_non_bottom_disjunct_preserve_reduction(const D& d);
+
+  /*! \brief
+    Assigns to \p *this the result of applying \p op_assign pairwise
+    to the elements in \p *this and \p y.
+
+    The elements of the powerset result are obtained by applying
+    \p op_assign to each pair of elements whose components are drawn
+    from \p *this and \p y, respectively.
+  */
+  template <typename Binary_Operator_Assign>
+  void pairwise_apply_assign(const Powerset& y,
+                             Binary_Operator_Assign op_assign);
+
+private:
+  /*! \brief
+    Does the hard work of checking whether \p *this contains non-maximal
+    elements and returns <CODE>true</CODE> if and only if it does not.
+  */
+  bool check_omega_reduced() const;
+
+  /*! \brief
+    Replaces the disjunct \p *sink by an upper bound of itself and
+    all the disjuncts following it.
+  */
+  void collapse(Sequence_iterator sink);
+};
+
+#include "Powerset_inlines.hh"
+#include "Powerset_templates.hh"
+
+#endif // !defined(PPL_Powerset_defs_hh)
diff --git a/src/Powerset_inlines.hh b/src/Powerset_inlines.hh
new file mode 100644
index 0000000..ca473a2
--- /dev/null
+++ b/src/Powerset_inlines.hh
@@ -0,0 +1,231 @@
+/* Powerset class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Powerset_inlines_hh
+#define PPL_Powerset_inlines_hh 1
+
+#include <algorithm>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+  return reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+  return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+  return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+  return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+  return sequence.size();
+}
+
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+  return sequence.empty();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+  return sequence.erase(position.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+  sequence.erase(first.base, last.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::clear() {
+  sequence.clear();
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+  : sequence(y.sequence), reduced(y.reduced) {
+}
+
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+  sequence = y.sequence;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D>
+inline void
+Powerset<D>::m_swap(Powerset& y) {
+  using std::swap;
+  swap(sequence, y.sequence);
+  swap(reduced, y.reduced);
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset()
+  : sequence(), reduced(true) {
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+  : sequence(), reduced(false) {
+  sequence.push_back(d);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d) {
+  // !d.is_bottom() is asserted by the callee.
+  add_non_bottom_disjunct_preserve_reduction(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+  sequence.push_back(d);
+  reduced = false;
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+  return !(x == y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  const_iterator xi = begin();
+  const_iterator x_end = end();
+  return xi != x_end && xi->is_top() && ++xi == x_end;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  return empty();
+}
+
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+  if (!empty())
+    collapse(sequence.begin());
+}
+
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+  pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
+
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+  least_upper_bound_assign(y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::upper_bound_assign_if_exact(const Powerset& y) {
+  least_upper_bound_assign(y);
+  return true;
+}
+
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline void
+swap(Powerset<D>& x, Powerset<D>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_inlines_hh)
diff --git a/src/Powerset_templates.hh b/src/Powerset_templates.hh
new file mode 100644
index 0000000..bb0556b
--- /dev/null
+++ b/src/Powerset_templates.hh
@@ -0,0 +1,312 @@
+/* Powerset class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Powerset_templates_hh
+#define PPL_Powerset_templates_hh 1
+
+#include "globals_defs.hh"
+#include <algorithm>
+#include "assert.hh"
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+  PPL_ASSERT(sink != sequence.end());
+  D& d = *sink;
+  iterator x_sink = sink;
+  iterator next_x_sink = x_sink;
+  ++next_x_sink;
+  iterator x_end = end();
+  for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+    d.upper_bound_assign(*xi);
+  // Drop the surplus disjuncts.
+  drop_disjuncts(next_x_sink, x_end);
+
+  // Ensure omega-reduction.
+  for (iterator xi = begin(); xi != x_sink; )
+    if (xi->definitely_entails(d))
+      xi = drop_disjunct(xi);
+    else
+      ++xi;
+
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+  if (reduced)
+    return;
+
+  Powerset& x = const_cast<Powerset&>(*this);
+  // First remove all bottom elements.
+  for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+    if (xi->is_bottom())
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+  // Then remove non-maximal elements.
+  for (iterator xi = x.begin(); xi != x.end(); ) {
+    const D& xv = *xi;
+    bool dropping_xi = false;
+    for (iterator yi = x.begin(); yi != x.end(); )
+      if (xi == yi)
+        ++yi;
+      else {
+        const D& yv = *yi;
+        if (yv.definitely_entails(xv))
+          yi = x.drop_disjunct(yi);
+        else if (xv.definitely_entails(yv)) {
+          dropping_xi = true;
+          break;
+        }
+        else
+          ++yi;
+      }
+    if (dropping_xi)
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+    if (abandon_expensive_computations != 0 && xi != x.end()) {
+      // Hurry up!
+      x.collapse(xi.base);
+      break;
+    }
+  }
+  reduced = true;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+  PPL_ASSERT(max_disjuncts > 0);
+  // Omega-reduce before counting the number of disjuncts.
+  omega_reduce();
+  size_type n = size();
+  if (n > max_disjuncts) {
+    // Let `i' point to the last disjunct that will survive.
+    iterator i = begin();
+    std::advance(i, max_disjuncts-1);
+    // This disjunct will be assigned an upper-bound of itself and of
+    // all the disjuncts that follow.
+    collapse(i.base);
+  }
+  PPL_ASSERT_HEAVY(OK());
+  PPL_ASSERT(is_omega_reduced());
+}
+
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+  for (const_iterator x_begin = begin(), x_end = end(),
+         xi = x_begin; xi != x_end; ++xi) {
+    const D& xv = *xi;
+    if (xv.is_bottom())
+      return false;
+    for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+      if (xi == yi)
+        continue;
+      const D& yv = *yi;
+      if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+        return false;
+    }
+  }
+  return true;
+}
+
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+  if (!reduced && check_omega_reduced())
+    reduced = true;
+  return reduced;
+}
+
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d,
+                                                        iterator first,
+                                                        iterator last) {
+  PPL_ASSERT_HEAVY(!d.is_bottom());
+  for (iterator xi = first; xi != last; ) {
+    const D& xv = *xi;
+    if (d.definitely_entails(xv))
+      return first;
+    else if (xv.definitely_entails(d)) {
+      if (xi == first)
+        ++first;
+      xi = drop_disjunct(xi);
+    }
+    else
+      ++xi;
+  }
+  sequence.push_back(d);
+  PPL_ASSERT_HEAVY(OK());
+  return first;
+}
+
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+  const Powerset<D>& x = *this;
+  bool found = true;
+  for (const_iterator xi = x.begin(),
+         x_end = x.end(); found && xi != x_end; ++xi) {
+    found = false;
+    for (const_iterator yi = y.begin(),
+           y_end = y.end(); !found && yi != y_end; ++yi)
+      found = (*xi).definitely_entails(*yi);
+  }
+  return found;
+}
+
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+  x.omega_reduce();
+  y.omega_reduce();
+  if (x.size() != y.size())
+    return false;
+  // Take a copy of `y' and work with it.
+  Powerset<D> z = y;
+  for (typename Powerset<D>::const_iterator xi = x.begin(),
+         x_end = x.end(); xi != x_end; ++xi) {
+    typename Powerset<D>::iterator zi = z.begin();
+    typename Powerset<D>::iterator z_end = z.end();
+    zi = std::find(zi, z_end, *xi);
+    if (zi == z_end)
+      return false;
+    else
+      z.drop_disjunct(zi);
+  }
+  return true;
+}
+
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+                                   Binary_Operator_Assign op_assign) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence;
+  for (const_iterator xi = begin(), x_end = end(),
+         y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      D zi = *xi;
+      op_assign(zi, *yi);
+      if (!zi.is_bottom())
+        new_sequence.push_back(zi);
+    }
+  // Put the new sequence in place.
+  using std::swap;
+  swap(sequence, new_sequence);
+  reduced = false;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  iterator old_begin = begin();
+  iterator old_end = end();
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    old_begin = add_non_bottom_disjunct_preserve_reduction(*i,
+                                                           old_begin,
+                                                           old_end);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+  if (x.is_bottom())
+    s << "false";
+  else if (x.is_top())
+    s << "true";
+  else
+    for (typename Powerset<D>::const_iterator i = x.begin(),
+           x_end = x.end(); i != x_end; ) {
+      s << "{ " << *i << " }";
+      ++i;
+      if (i != x_end)
+        s << ", ";
+    }
+  return s;
+}
+
+} // namespace IO_Operators
+
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+  memory_size_type bytes = 0;
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    bytes += xi->total_memory_in_bytes();
+    // We assume there is at least a forward and a backward link, and
+    // that the pointers implementing them are at least the size of
+    // pointers to `D'.
+    bytes += 2*sizeof(D*);
+  }
+  return bytes;
+}
+
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    if (!xi->OK())
+      return false;
+    if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+      std::cerr << "Bottom element in powerset!"
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+  if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+    std::cerr << "Powerset claims to be reduced, but it is not!"
+              << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_templates_hh)
diff --git a/src/Powerset_types.hh b/src/Powerset_types.hh
new file mode 100644
index 0000000..30deeb6
--- /dev/null
+++ b/src/Powerset_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Powerset_types_hh
+#define PPL_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Powerset_types_hh)
diff --git a/src/Ptr_Iterator_defs.hh b/src/Ptr_Iterator_defs.hh
new file mode 100644
index 0000000..a2dc3fd
--- /dev/null
+++ b/src/Ptr_Iterator_defs.hh
@@ -0,0 +1,172 @@
+/* Ptr_Iterator class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_defs_hh
+#define PPL_Ptr_Iterator_defs_hh 1
+
+#include "Ptr_Iterator_types.hh"
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename P, typename Q>
+bool operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+                          const Ptr_Iterator<P>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+  : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+                         typename std::iterator_traits<P>::value_type,
+                         typename std::iterator_traits<P>::difference_type,
+                         typename std::iterator_traits<P>::pointer,
+                         typename std::iterator_traits<P>::reference> {
+public:
+  typedef typename std::iterator_traits<P>::difference_type difference_type;
+  typedef typename std::iterator_traits<P>::reference reference;
+  typedef typename std::iterator_traits<P>::pointer pointer;
+
+  //! Default constructor: no guarantees.
+  Ptr_Iterator();
+
+  //! Construct an iterator pointing at \p q.
+  explicit Ptr_Iterator(const P& q);
+
+  /*! \brief
+    Copy constructor allowing the construction of a const_iterator
+    from a non-const iterator.
+  */
+  template<typename Q>
+  Ptr_Iterator(const Ptr_Iterator<Q>& q);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Subscript operator.
+  reference operator[](const difference_type m) const;
+
+  //! Prefix increment operator.
+  Ptr_Iterator& operator++();
+
+  //! Postfix increment operator.
+  Ptr_Iterator operator++(int);
+
+  //! Prefix decrement operator
+  Ptr_Iterator& operator--();
+
+  //! Postfix decrement operator.
+  Ptr_Iterator operator--(int);
+
+  //! Assignment-increment operator.
+  Ptr_Iterator& operator+=(const difference_type m);
+
+  //! Assignment-decrement operator.
+  Ptr_Iterator& operator-=(const difference_type m);
+
+  //! Returns the difference between \p *this and \p y.
+  difference_type operator-(const Ptr_Iterator& y) const;
+
+  //! Returns the sum of \p *this and \p m.
+  Ptr_Iterator operator+(const difference_type m) const;
+
+  //! Returns the difference of \p *this and \p m.
+  Ptr_Iterator operator-(const difference_type m) const;
+
+private:
+  //! The base pointer implementing the iterator.
+  P p;
+
+  //! Returns the hidden pointer.
+  const P& base() const;
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend typename Ptr_Iterator<Q>::difference_type
+  Parma_Polyhedra_Library::Implementation::
+  operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  friend Ptr_Iterator<P>
+  Parma_Polyhedra_Library::Implementation::
+  operator+<>(typename Ptr_Iterator<P>::difference_type m,
+              const Ptr_Iterator<P>& y);
+};
+
+#include "Ptr_Iterator_inlines.hh"
+
+#endif // !defined(PPL_Ptr_Iterator_defs_hh)
diff --git a/src/Ptr_Iterator_inlines.hh b/src/Ptr_Iterator_inlines.hh
new file mode 100644
index 0000000..dc1bdca
--- /dev/null
+++ b/src/Ptr_Iterator_inlines.hh
@@ -0,0 +1,189 @@
+/* Ptr_Iterator class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_inlines_hh
+#define PPL_Ptr_Iterator_inlines_hh 1
+
+#include <algorithm>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+  return p;
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator()
+  : p(P()) {
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+  : p(q) {
+}
+
+template <typename P>
+template <typename Q>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& q)
+  : p(q.base()) {
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+  return *p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+  return p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+  return p[m];
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+  ++p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+  return Ptr_Iterator(p++);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+  --p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+  return Ptr_Iterator(p--);
+}
+
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+  p += m;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+  p -= m;
+  return *this;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+  return p - y.p;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+  return Ptr_Iterator(p + m);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+  return Ptr_Iterator(p - m);
+}
+
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() == y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() != y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() < y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() <= y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() > y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() >= y.base();
+}
+
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() - y.base();
+}
+
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+          const Ptr_Iterator<P>& y) {
+  return Ptr_Iterator<P>(m + y.base());
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Ptr_Iterator_inlines_hh)
diff --git a/src/Ptr_Iterator_types.hh b/src/Ptr_Iterator_types.hh
new file mode 100644
index 0000000..f696d82
--- /dev/null
+++ b/src/Ptr_Iterator_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Ptr_Iterator_types_hh
+#define PPL_Ptr_Iterator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Ptr_Iterator_types_hh)
diff --git a/src/Rational_Box.hh b/src/Rational_Box.hh
new file mode 100644
index 0000000..374a060
--- /dev/null
+++ b/src/Rational_Box.hh
@@ -0,0 +1,39 @@
+/* Rational_Box class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rational_Box_hh
+#define PPL_Rational_Box_hh 1
+
+#include "Rational_Interval.hh"
+#include "Box_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A box with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Box<Rational_Interval> Rational_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rational_Box_hh)
diff --git a/src/Rational_Interval.hh b/src/Rational_Interval.hh
new file mode 100644
index 0000000..ec8331f
--- /dev/null
+++ b/src/Rational_Interval.hh
@@ -0,0 +1,54 @@
+/* Rational_Interval class declaration and implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rational_Interval_hh
+#define PPL_Rational_Interval_hh 1
+
+#include "Interval_defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Rational_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Rational_Interval_Info_Policy> Rational_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpq_class, Rational_Interval_Info> Rational_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rational_Interval_hh)
diff --git a/src/Result_defs.hh b/src/Result_defs.hh
new file mode 100644
index 0000000..860a7b7
--- /dev/null
+++ b/src/Result_defs.hh
@@ -0,0 +1,195 @@
+/* Result enum and supporting function declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Result_defs_hh
+#define PPL_Result_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+enum Result_Class {
+  //! \hideinitializer Representable number result class.
+  VC_NORMAL = 0U << 4,
+
+  //! \hideinitializer Negative infinity result class.
+  VC_MINUS_INFINITY = 1U << 4,
+
+  //! \hideinitializer Positive infinity result class.
+  VC_PLUS_INFINITY = 2U << 4,
+
+  //! \hideinitializer Not a number result class.
+  VC_NAN = 3U << 4,
+
+  VC_MASK = VC_NAN
+};
+
+// This must be kept in sync with Relation_Symbol
+enum Result_Relation {
+  //! \hideinitializer No values satisfies the relation.
+  VR_EMPTY = 0U,
+
+  //! \hideinitializer Equal. This need to be accompanied by a value.
+  VR_EQ = 1U,
+
+  //! \hideinitializer Less than. This need to be accompanied by a value.
+  VR_LT = 2U,
+
+  //! \hideinitializer Greater than. This need to be accompanied by a value.
+  VR_GT = 4U,
+
+  //! \hideinitializer Not equal. This need to be accompanied by a value.
+  VR_NE = VR_LT | VR_GT,
+
+  //! \hideinitializer Less or equal. This need to be accompanied by a value.
+  VR_LE = VR_EQ | VR_LT,
+
+  //! \hideinitializer Greater or equal. This need to be accompanied by a value.
+  VR_GE = VR_EQ | VR_GT,
+
+  //! \hideinitializer All values satisfy the relation.
+  VR_LGE = VR_LT | VR_EQ | VR_GT,
+
+  VR_MASK = VR_LGE
+};
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+  //! \hideinitializer The exact result is not comparable.
+  V_EMPTY = VR_EMPTY,
+
+  //! \hideinitializer The computed result is exact.
+  V_EQ = static_cast<unsigned>(VR_EQ),
+
+  //! \hideinitializer The computed result is inexact and rounded up.
+  V_LT = static_cast<unsigned>(VR_LT),
+
+  //! \hideinitializer The computed result is inexact and rounded down.
+  V_GT = static_cast<unsigned>(VR_GT),
+
+  //! \hideinitializer The computed result is inexact.
+  V_NE = VR_NE,
+
+  //! \hideinitializer The computed result may be inexact and rounded up.
+  V_LE = VR_LE,
+
+  //! \hideinitializer The computed result may be inexact and rounded down.
+  V_GE = VR_GE,
+
+  //! \hideinitializer The computed result may be inexact.
+  V_LGE = VR_LGE,
+
+  //! \hideinitializer The exact result is a number out of finite bounds.
+  V_OVERFLOW = 1U << 6,
+
+  //! \hideinitializer A negative integer overflow occurred (rounding up).
+  V_LT_INF = V_LT | V_OVERFLOW,
+
+  //! \hideinitializer A positive integer overflow occurred (rounding down).
+  V_GT_SUP = V_GT | V_OVERFLOW,
+
+  //! \hideinitializer A positive integer overflow occurred (rounding up).
+  V_LT_PLUS_INFINITY = V_LT | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+  //! \hideinitializer A negative integer overflow occurred (rounding down).
+  V_GT_MINUS_INFINITY = V_GT | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+  //! \hideinitializer Negative infinity result.
+  V_EQ_MINUS_INFINITY = V_EQ | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+  //! \hideinitializer Positive infinity result.
+  V_EQ_PLUS_INFINITY = V_EQ | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+  //! \hideinitializer Not a number result.
+  V_NAN = static_cast<unsigned>(VC_NAN),
+
+  //! \hideinitializer Converting from unknown string.
+  V_CVT_STR_UNK = V_NAN | (1U << 8),
+
+  //! \hideinitializer Dividing by zero.
+  V_DIV_ZERO = V_NAN | (2U << 8),
+
+  //! \hideinitializer Adding two infinities having opposite signs.
+  V_INF_ADD_INF = V_NAN | (3U << 8),
+
+  //! \hideinitializer Dividing two infinities.
+  V_INF_DIV_INF = V_NAN | (4U << 8),
+
+  //! \hideinitializer Taking the modulus of an infinity.
+  V_INF_MOD = V_NAN | (5U << 8),
+
+  //! \hideinitializer Multiplying an infinity by zero.
+  V_INF_MUL_ZERO = V_NAN | (6U << 8),
+
+  //! \hideinitializer Subtracting two infinities having the same sign.
+  V_INF_SUB_INF = V_NAN | (7U << 8),
+
+  //! \hideinitializer Computing a remainder modulo zero.
+  V_MOD_ZERO = V_NAN | (8U << 8),
+
+  //! \hideinitializer Taking the square root of a negative number.
+  V_SQRT_NEG = V_NAN | (9U << 8),
+
+  //! \hideinitializer Unknown result due to intermediate negative overflow.
+  V_UNKNOWN_NEG_OVERFLOW = V_NAN | (10U << 8),
+
+  //! \hideinitializer Unknown result due to intermediate positive overflow.
+  V_UNKNOWN_POS_OVERFLOW = V_NAN | (11U << 8),
+
+  //! \hideinitializer The computed result is not representable.
+  V_UNREPRESENTABLE = 1U << 7
+
+};
+
+//! \name Functions Inspecting and/or Combining Result Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Result operator&(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator|(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator-(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Extracts the value class part of \p r (representable number,
+  unrepresentable minus/plus infinity or nan).
+*/
+Result_Class result_class(Result r);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Extracts the relation part of \p r.
+*/
+Result_Relation result_relation(Result r);
+
+/*! \ingroup PPL_CXX_interface */
+Result result_relation_class(Result r);
+
+//@} // Functions Inspecting and/or Combining Result Values
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Result_inlines.hh"
+
+#endif // !defined(PPL_Result_defs_hh)
diff --git a/src/Result_inlines.hh b/src/Result_inlines.hh
new file mode 100644
index 0000000..a7ad02d
--- /dev/null
+++ b/src/Result_inlines.hh
@@ -0,0 +1,102 @@
+/* Result supporting functions implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Result_inlines_hh
+#define PPL_Result_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator&(Result x, Result y) {
+  const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+  return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator|(Result x, Result y) {
+  const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+  return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator-(Result x, Result y) {
+  const Result y_neg = static_cast<Result>(~static_cast<unsigned>(y));
+  return x & y_neg;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Class
+result_class(Result r) {
+  const Result rc = r & static_cast<Result>(VC_MASK);
+  return static_cast<Result_Class>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Relation
+result_relation(Result r) {
+  const Result rc = r & static_cast<Result>(VR_MASK);
+  return static_cast<Result_Relation>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+result_relation_class(Result r) {
+  return r & (static_cast<Result>(VR_MASK) | static_cast<Result>(VC_MASK));
+}
+
+inline int
+result_overflow(Result r) {
+  switch (result_class(r)) {
+  case VC_NORMAL:
+    switch (r) {
+    case V_LT_INF:
+      return -1;
+    case V_GT_SUP:
+      return 1;
+    default:
+      break;
+    }
+    break;
+  case VC_MINUS_INFINITY:
+    return -1;
+  case VC_PLUS_INFINITY:
+    return 1;
+  default:
+    break;
+  }
+  return 0;
+}
+
+inline bool
+result_representable(Result r) {
+  return (r & V_UNREPRESENTABLE) != V_UNREPRESENTABLE;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Result_inlines_hh)
diff --git a/src/Rounding_Dir_defs.hh b/src/Rounding_Dir_defs.hh
new file mode 100644
index 0000000..82b403e
--- /dev/null
+++ b/src/Rounding_Dir_defs.hh
@@ -0,0 +1,124 @@
+/* Declaration of Rounding_Dir and related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rounding_defs_hh
+#define PPL_Rounding_defs_hh 1
+
+#include "Result_defs.hh"
+#include "fpu_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+  /*! \hideinitializer
+    Round toward \f$-\infty\f$.
+  */
+  ROUND_DOWN = 0U,
+
+  /*! \hideinitializer
+    Round toward \f$+\infty\f$.
+  */
+  ROUND_UP = 1U,
+
+  /*! \hideinitializer
+    Rounding is delegated to lower level. Result info is evaluated lazily.
+  */
+  ROUND_IGNORE = 6U,
+  ROUND_NATIVE = ROUND_IGNORE,
+
+  /*! \hideinitializer
+    Rounding is not needed: client code must ensure that the operation
+    result is exact and representable in the destination type.
+    Result info is evaluated lazily.
+  */
+  ROUND_NOT_NEEDED = 7U,
+
+  ROUND_DIRECT = ROUND_UP,
+  ROUND_INVERSE = ROUND_DOWN,
+
+  ROUND_DIR_MASK = 7U,
+
+  /*! \hideinitializer
+    The client code is willing to pay an extra price to know the exact
+    relation between the exact result and the computed one.
+   */
+  ROUND_STRICT_RELATION = 8U,
+
+  ROUND_CHECK = ROUND_DIRECT | ROUND_STRICT_RELATION
+};
+
+//! \name Functions Inspecting and/or Combining Rounding_Dir Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator&(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator|(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Returns the inverse rounding mode of \p dir,
+  <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir round_dir(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_down(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_up(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_ignore(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_needed(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_requested(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_direct(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_strict_relation(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
+
+//@} // Functions Inspecting and/or Combining Rounding_Dir Values
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Rounding_Dir_inlines.hh"
+
+#endif // !defined(PPL_Float_defs_hh)
+
diff --git a/src/Rounding_Dir_inlines.hh b/src/Rounding_Dir_inlines.hh
new file mode 100644
index 0000000..e838463
--- /dev/null
+++ b/src/Rounding_Dir_inlines.hh
@@ -0,0 +1,141 @@
+/* Inline functions operating on enum Rounding_Dir values.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Rounding_Dir_inlines_hh
+#define PPL_Rounding_Dir_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator&(Rounding_Dir x, Rounding_Dir y) {
+  const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+  return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator|(Rounding_Dir x, Rounding_Dir y) {
+  const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+  return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+round_dir(Rounding_Dir dir) {
+  return dir & ROUND_DIR_MASK;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_down(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DOWN;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_up(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_UP;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_ignore(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_IGNORE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_needed(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_requested(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_IGNORE || round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_direct(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DIRECT;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_inverse(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_INVERSE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_strict_relation(Rounding_Dir dir) {
+  return (dir & ROUND_STRICT_RELATION) == ROUND_STRICT_RELATION;
+}
+
+#if PPL_CAN_CONTROL_FPU
+
+/*! \ingroup PPL_CXX_interface */
+inline fpu_rounding_direction_type
+round_fpu_dir(Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+  case ROUND_DOWN:
+    return static_cast<fpu_rounding_direction_type>(PPL_FPU_DOWNWARD);
+  case ROUND_IGNORE: // Fall through.
+  default:
+    PPL_UNREACHABLE;
+    return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+  }
+}
+
+#undef PPL_FPU_DOWNWARD
+#undef PPL_FPU_TONEAREST
+#undef PPL_FPU_TOWARDZERO
+#undef PPL_FPU_UPWARD
+
+#endif
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    return ROUND_DOWN | (dir & ROUND_STRICT_RELATION);
+  case ROUND_DOWN:
+    return ROUND_UP | (dir & ROUND_STRICT_RELATION);
+  case ROUND_IGNORE:
+    return dir;
+  default:
+    PPL_UNREACHABLE;
+    return dir;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rounding_Dir_inlines_hh)
diff --git a/src/Scalar_Products.cc b/src/Scalar_Products.cc
new file mode 100644
index 0000000..b1729b0
--- /dev/null
+++ b/src/Scalar_Products.cc
@@ -0,0 +1,120 @@
+/* Scalar_Products class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Scalar_Products_defs.hh"
+#include "Scalar_Products_inlines.hh"
+#include "Coefficient_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+                             const Linear_Expression& x,
+                             const Linear_Expression& y) {
+  x.scalar_product_assign(z, y);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+                             const Constraint& c, const Generator& g) {
+  assign(z, c.expr, g.expr);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+                             const Generator& g, const Constraint& c) {
+  assign(z, g.expr, c.expr);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+                             const Grid_Generator& gg, const Congruence& cg) {
+  gg.expr.scalar_product_assign(z, cg.expr, 0, gg.space_dimension() + 1);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+                             const Constraint& c,
+                             const Grid_Generator& gg) {
+  assign(z, c.expr, gg.expr);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+                             const Congruence& cg, const Grid_Generator& gg) {
+  // Scalar product is only defined if `cg' and `gg' are
+  // dimension-compatible.
+  PPL_ASSERT(cg.space_dimension() <= gg.space_dimension());
+  cg.expr.scalar_product_assign(z, gg.expr);
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+                                     const Linear_Expression& x,
+                                     const Linear_Expression& y) {
+  // The reduced scalar product is only defined
+  // if `y' has enough coefficients.
+  PPL_ASSERT(x.space_dimension() - 1 <= y.space_dimension());
+  x.scalar_product_assign(z, y, 0, x.space_dimension());
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+                                     const Grid_Generator& gg,
+                                     const Congruence& cg) {
+  // The reduced scalar product is only defined
+  // if `cg' has enough coefficients.
+  PPL_ASSERT(gg.space_dimension() <= cg.space_dimension());
+  gg.expr.scalar_product_assign(z, cg.expr, 0, gg.space_dimension());
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+                                         const Linear_Expression& x,
+                                         const Linear_Expression& y) {
+  // Scalar product is only defined  if `x' and `y' are
+  // dimension-compatible.
+  PPL_ASSERT(x.space_dimension() <= y.space_dimension());
+  x.scalar_product_assign(z, y, 1, x.space_dimension() + 1);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+                                         const Grid_Generator& gg,
+                                         const Congruence& cg) {
+  // Scalar product is only defined if `gg' and `cg' are
+  // dimension-compatible.
+  PPL_ASSERT(gg.space_dimension() <= cg.space_dimension());
+  gg.expr.scalar_product_assign(z, cg.expr, 1, gg.space_dimension() + 1);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+                                         const Grid_Generator& gg,
+                                         const Constraint& c) {
+  // Scalar product is only defined if `gg' and `c' are
+  // dimension-compatible.
+  PPL_ASSERT(gg.space_dimension() <= c.space_dimension());
+  gg.expr.scalar_product_assign(z, c.expr, 1, gg.space_dimension() + 1);
+}
diff --git a/src/Scalar_Products_defs.hh b/src/Scalar_Products_defs.hh
new file mode 100644
index 0000000..9d39226
--- /dev/null
+++ b/src/Scalar_Products_defs.hh
@@ -0,0 +1,227 @@
+/* Scalar_Products class definition.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Scalar_Products_defs_hh
+#define PPL_Scalar_Products_defs_hh 1
+
+#include "Scalar_Products_types.hh"
+#include "Coefficient_types.hh"
+#include "Linear_Expression_types.hh"
+#include "Constraint_types.hh"
+#include "Generator_types.hh"
+#include "Congruence_types.hh"
+#include "Grid_Generator_types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class implementing various scalar product functions.
+/*! \ingroup PPL_CXX_interface
+  When computing the scalar product of (Linear_Expression or Constraint or
+  Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+  that the space dimension of the first object <CODE>x</CODE> is less
+  than or equal to the space dimension of the second object <CODE>y</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Scalar_Products {
+public:
+  //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Linear_Expression& x, const Linear_Expression& y);
+
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+
+  //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+  static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Constraint& c, const Grid_Generator& gg);
+
+  //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Grid_Generator& gg, const Congruence& cg);
+
+  //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Congruence& cg, const Grid_Generator& gg);
+
+  //! Returns the sign of the scalar product between \p x and \p y.
+  static int sign(const Linear_Expression& x, const Linear_Expression& y);
+
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Generator& g);
+
+  //! Returns the sign of the scalar product between \p g and \p c.
+  static int sign(const Generator& g, const Constraint& c);
+
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Grid_Generator& g);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+                             const Linear_Expression& x,
+                             const Linear_Expression& y);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+                             const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+                             const Generator& g, const Constraint& c);
+
+  //! \brief
+  //! Computes the \e reduced scalar product of \p g and \p cg,
+  //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+  //! and assigns the result to \p z.
+  static void reduced_assign(Coefficient& z,
+                             const Grid_Generator& gg, const Congruence& cg);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored.
+  */
+  static int reduced_sign(const Linear_Expression& x,
+                          const Linear_Expression& y);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored.
+  */
+  static int reduced_sign(const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored.
+  */
+  static int reduced_sign(const Generator& g, const Constraint& c);
+
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+                                 const Linear_Expression& x,
+                                 const Linear_Expression& y);
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+                                 const Linear_Expression& e,
+                                 const Generator& g);
+
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p gg and \p c,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+                                 const Grid_Generator& gg,
+                                 const Constraint& c);
+
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p cg,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+                                 const Grid_Generator& gg,
+                                 const Congruence& cg);
+
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+                                 const Linear_Expression& e,
+                                 const Grid_Generator& g);
+
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Expression& x,
+                              const Linear_Expression& y);
+
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Linear_Expression& e,
+                              const Grid_Generator& g);
+
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p g and \p c,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Grid_Generator& g, const Constraint& c);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+  //! Constructs the function object according to the topology of \p c.
+  Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+
+  //! Constructs the function object according to the topology of \p g.
+  Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+
+  //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+  int operator()(const Constraint&, const Generator&) const;
+
+  //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+  int operator()(const Generator&, const Constraint&) const;
+
+private:
+  //! The type of the scalar product sign function pointer.
+  typedef int (* const SPS_type)(const Linear_Expression&,
+                                 const Linear_Expression&);
+
+  //! The scalar product sign function pointer.
+  SPS_type sps_fp;
+};
+
+// NOTE: Scalar_Products_inlines.hh is NOT included here, to avoid cyclic
+// include dependencies.
+
+#endif // !defined(PPL_Scalar_Products_defs_hh)
diff --git a/src/Scalar_Products_inlines.hh b/src/Scalar_Products_inlines.hh
new file mode 100644
index 0000000..3ab91af
--- /dev/null
+++ b/src/Scalar_Products_inlines.hh
@@ -0,0 +1,163 @@
+/* Scalar_Products class implementation (inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Scalar_Products_inlines_hh
+#define PPL_Scalar_Products_inlines_hh 1
+
+#include "Linear_Expression_defs.hh"
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+#include "Congruence_defs.hh"
+#include "Grid_Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+Scalar_Products::sign(const Linear_Expression& x, const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Expression& x,
+                              const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  reduced_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& x,
+                                  const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  homogeneous_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+  return sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+  return sign(g.expr, c.expr);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Grid_Generator& g) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  assign(z, c, g);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+  // The reduced scalar product is only defined if the topology of `c' is
+  // NNC.
+  PPL_ASSERT(!c.is_necessarily_closed());
+  return reduced_sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+  // The reduced scalar product is only defined if the topology of `g' is
+  // NNC.
+  PPL_ASSERT(!c.is_necessarily_closed());
+  return reduced_sign(g.expr, c.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+                                    const Linear_Expression& e,
+                                    const Generator& g) {
+  homogeneous_assign(z, e, g.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+                                    const Linear_Expression& e,
+                                    const Grid_Generator& g) {
+  homogeneous_assign(z, e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+                                  const Generator& g) {
+  return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+                                  const Grid_Generator& g) {
+  return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Grid_Generator& g,
+                                  const Constraint& c) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  homogeneous_assign(z, g, c);
+  return sgn(z);
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+  : sps_fp(c.is_necessarily_closed()
+           ? static_cast<SPS_type>(&Scalar_Products::sign)
+           : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+  : sps_fp(g.is_necessarily_closed()
+           ? static_cast<SPS_type>(&Scalar_Products::sign)
+           : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+                                                  const Generator& g) const {
+  PPL_ASSERT(c.space_dimension() <= g.space_dimension());
+  PPL_ASSERT(sps_fp == (c.is_necessarily_closed()
+                    ? static_cast<SPS_type>(&Scalar_Products::sign)
+                    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(c.expr, g.expr);
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+                                                  const Constraint& c) const {
+  PPL_ASSERT(g.space_dimension() <= c.space_dimension());
+  PPL_ASSERT(sps_fp == (g.is_necessarily_closed()
+                    ? static_cast<SPS_type>(&Scalar_Products::sign)
+                    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(g.expr, c.expr);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Scalar_Products_inlines_hh)
diff --git a/src/Scalar_Products_types.hh b/src/Scalar_Products_types.hh
new file mode 100644
index 0000000..4003f37
--- /dev/null
+++ b/src/Scalar_Products_types.hh
@@ -0,0 +1,24 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Scalar_Products_types_hh
+#define PPL_Scalar_Products_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Scalar_Products_types_hh)
diff --git a/src/Slow_Copy.hh b/src/Slow_Copy.hh
new file mode 100644
index 0000000..e618f8f
--- /dev/null
+++ b/src/Slow_Copy.hh
@@ -0,0 +1,61 @@
+/* Basic Slow_Copy classes declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Slow_Copy_hh
+#define PPL_Slow_Copy_hh 1
+
+#include "meta_programming.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are not slow by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Slow_Copy : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpz_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpz_class> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpq_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpq_class> : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Slow_Copy_hh)
diff --git a/src/Sparse_Row.cc b/src/Sparse_Row.cc
new file mode 100644
index 0000000..6edee27
--- /dev/null
+++ b/src/Sparse_Row.cc
@@ -0,0 +1,1093 @@
+/* Sparse_Row class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Sparse_Row_defs.hh"
+#include "Dense_Row_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+class Sparse_Row_from_Dense_Row_helper_iterator {
+public:
+  Sparse_Row_from_Dense_Row_helper_iterator(const PPL::Dense_Row& row1,
+                                            PPL::dimension_type sz)
+    : row(row1), sz(sz), i(0) {
+    if (row.size() != 0 && row[0] == 0)
+      ++(*this);
+  }
+
+  Sparse_Row_from_Dense_Row_helper_iterator& operator++() {
+    PPL_ASSERT(i < sz);
+    ++i;
+    while (i < sz && row[i] == 0)
+      ++i;
+    return *this;
+  }
+
+  Sparse_Row_from_Dense_Row_helper_iterator operator++(int) {
+    Sparse_Row_from_Dense_Row_helper_iterator tmp = *this;
+    ++(*this);
+    return tmp;
+  }
+
+  PPL::Coefficient_traits::const_reference
+  operator*() const {
+    PPL_ASSERT(i < sz);
+    return row[i];
+  }
+
+  PPL::dimension_type
+  index() const {
+    PPL_ASSERT(i < sz);
+    return i;
+  }
+
+  bool
+  operator==(const Sparse_Row_from_Dense_Row_helper_iterator& itr) const {
+    PPL_ASSERT(&row == &(itr.row));
+    return i == itr.i;
+  }
+
+  bool
+  operator!=(const Sparse_Row_from_Dense_Row_helper_iterator& itr) const {
+    return !(*this == itr);
+  }
+
+private:
+  const PPL::Dense_Row& row;
+  PPL::dimension_type sz;
+  PPL::dimension_type i;
+};
+
+// Returns the number of nonzero elements in row.
+PPL::dimension_type
+Sparse_Row_from_Dense_Row_helper_function(const PPL::Dense_Row& row,
+                                          PPL::dimension_type sz) {
+  PPL::dimension_type count = 0;
+  for (PPL::dimension_type i = sz; i-- > 0; )
+    if (row[i] != 0)
+      ++count;
+  return count;
+}
+
+} // namespace
+
+PPL::Sparse_Row::Sparse_Row(const PPL::Dense_Row& row)
+  : tree(Sparse_Row_from_Dense_Row_helper_iterator(row, row.size()),
+         Sparse_Row_from_Dense_Row_helper_function(row, row.size())),
+    size_(row.size()) {
+  PPL_ASSERT(OK());
+}
+
+PPL::Sparse_Row::Sparse_Row(const Dense_Row& row, dimension_type sz,
+                            dimension_type capacity)
+  : tree(Sparse_Row_from_Dense_Row_helper_iterator(row, row.size()),
+         Sparse_Row_from_Dense_Row_helper_function(row, row.size())),
+    size_(sz) {
+  (void)capacity;
+  PPL_ASSERT(OK());
+}
+
+PPL::Sparse_Row&
+PPL::Sparse_Row::operator=(const PPL::Dense_Row& row) {
+  Sparse_Row tmp(row);
+  swap(*this, tmp);
+  PPL_ASSERT(OK());
+
+  return *this;
+}
+
+void
+PPL::Sparse_Row::swap_coefficients(dimension_type i, dimension_type j) {
+  PPL_ASSERT(i < size_);
+  PPL_ASSERT(j < size_);
+
+  if (tree.empty())
+    return;
+
+  using std::swap;
+
+  iterator itr_i = tree.bisect(i);
+  iterator itr_j = tree.bisect(j);
+  if (itr_i.index() == i)
+    if (itr_j.index() == j)
+      // Both elements are in the tree.
+      swap(*itr_i, *itr_j);
+    else {
+      // i is in the tree, j is not.
+      PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+      swap(*itr_i, tmp);
+      tree.erase(itr_i);
+      // Now both iterators have been invalidated.
+      itr_j = tree.insert(j);
+      swap(*itr_j, tmp);
+    }
+  else
+    if (itr_j.index() == j) {
+      // j is in the tree, i is not.
+      PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+      swap(*itr_j, tmp);
+      // Now both iterators have been invalidated.
+      tree.erase(itr_j);
+      itr_i = tree.insert(i);
+      swap(*itr_i, tmp);
+    }
+    else {
+      // Do nothing, elements are both non-stored zeroes.
+    }
+}
+
+PPL::Sparse_Row::iterator
+PPL::Sparse_Row::reset(iterator first, iterator last) {
+  if (first == last)
+    return first;
+  PPL_ASSERT(last != end());
+  --last;
+  const dimension_type j = last.index();
+  PPL_ASSERT(first.index() <= j);
+  // We can't just compare first and last at each iteration, because last will
+  // be invalidated by the first erase.
+  while (first.index() < j)
+    first = reset(first);
+
+  first = reset(first);
+
+  PPL_ASSERT(OK());
+  return first;
+}
+
+void
+PPL::Sparse_Row::reset_after(dimension_type i) {
+  PPL_ASSERT(i < size_);
+
+  iterator itr = lower_bound(i);
+  // This is a const reference to an internal iterator, that is kept valid.
+  // If we just stored a copy, that would be invalidated by the calls to
+  // reset().
+  const iterator& itr_end = end();
+
+  while (itr != itr_end)
+    itr = reset(itr);
+
+  PPL_ASSERT(OK());
+}
+
+void
+PPL::Sparse_Row::normalize() {
+  // Compute the GCD of all the coefficients.
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  const_iterator i = begin();
+  const_iterator i_end = end();
+  for ( ; i != i_end; ++i) {
+    Coefficient_traits::const_reference x_i = *i;
+    if (const int x_i_sign = sgn(x_i)) {
+      gcd = x_i;
+      if (x_i_sign < 0)
+        neg_assign(gcd);
+      goto compute_gcd;
+    }
+  }
+  // We reach this point only if all the coefficients were zero.
+  return;
+
+ compute_gcd:
+  if (gcd == 1)
+    return;
+  for (++i; i != i_end; ++i) {
+    Coefficient_traits::const_reference x_i = *i;
+    if (x_i != 0) {
+      // Note: we use the ternary version instead of a more concise
+      // gcd_assign(gcd, x_i) to take advantage of the fact that
+      // `gcd' will decrease very rapidly (see D. Knuth, The Art of
+      // Computer Programming, second edition, Section 4.5.2,
+      // Algorithm C, and the discussion following it).  Our
+      // implementation of gcd_assign(x, y, z) for checked numbers is
+      // optimized for the case where `z' is smaller than `y', so that
+      // on checked numbers we gain.  On the other hand, for the
+      // implementation of gcd_assign(x, y, z) on GMP's unbounded
+      // integers we cannot make any assumption, so here we draw.
+      // Overall, we win.
+      gcd_assign(gcd, x_i, gcd);
+      if (gcd == 1)
+        return;
+    }
+  }
+  // Divide the coefficients by the GCD.
+  for (iterator j = begin(), j_end = end(); j != j_end; ++j) {
+    Coefficient& x_j = *j;
+    exact_div_assign(x_j, x_j, gcd);
+  }
+
+  PPL_ASSERT(OK());
+}
+
+namespace {
+
+class sparse_row_linear_combine_helper_iterator {
+public:
+  sparse_row_linear_combine_helper_iterator(
+    const PPL::Sparse_Row& x, const PPL::Sparse_Row& y,
+    PPL::Coefficient_traits::const_reference coeff1_1,
+    PPL::Coefficient_traits::const_reference coeff2_1)
+    : coeff1(coeff1_1), coeff2(coeff2_1) {
+    i = x.begin();
+    i_end = x.end();
+    j = y.begin();
+    j_end = y.end();
+    update_current_data();
+  }
+
+  void operator++() {
+    if (from_i)
+      ++i;
+    if (from_j)
+      ++j;
+    update_current_data();
+  }
+
+  PPL::Coefficient_traits::const_reference operator*() {
+    return current_value;
+  }
+
+  PPL::dimension_type index() {
+    return current_index;
+  }
+
+private:
+  void update_current_data() {
+    if (i == i_end) {
+      if (j == j_end) {
+        return;
+      }
+      else {
+        // i == i_end, j != j_end, so use j.
+        current_index = j.index();
+        current_value = *j;
+        current_value *= coeff2;
+        from_i = false;
+        from_j = true;
+      }
+    }
+    else {
+      if (j == j_end) {
+        // i != i_end, j == j_end, so use i.
+        current_index = i.index();
+        current_value = *i;
+        current_value *= coeff1;
+        from_i = true;
+        from_j = false;
+      }
+      else {
+        // i != i_end and j != j_end.
+        if (i.index() < j.index()) {
+          // i.index() < j.index(), so use i.
+          current_index = i.index();
+          current_value = *i;
+          current_value *= coeff1;
+          from_i = true;
+          from_j = false;
+        }
+        else {
+          if (i.index() != j.index()) {
+            PPL_ASSERT(i.index() > j.index());
+            // i.index() > j.index(), so use j.
+            current_index = j.index();
+            current_value = *j;
+            current_value *= coeff2;
+            from_i = false;
+            from_j = true;
+          }
+          else {
+            // i.index() == j.index(), so use both i and j.
+            current_index = i.index();
+            current_value = *i;
+            current_value *= coeff1;
+            PPL::add_mul_assign(current_value, *j, coeff2);
+            from_i = true;
+            from_j = true;
+          }
+        }
+      }
+    }
+    PPL_ASSERT(!from_i || i != i_end);
+    PPL_ASSERT(!from_j || j != j_end);
+  }
+
+  PPL::Coefficient_traits::const_reference coeff1;
+  PPL::Coefficient_traits::const_reference coeff2;
+  PPL::Sparse_Row::const_iterator i;
+  PPL::Sparse_Row::const_iterator i_end;
+  PPL::Sparse_Row::const_iterator j;
+  PPL::Sparse_Row::const_iterator j_end;
+  PPL::dimension_type current_index;
+  PPL::Coefficient current_value;
+  bool from_i;
+  bool from_j;
+};
+
+} // namespace
+
+void
+PPL::Sparse_Row::linear_combine(const Sparse_Row& y,
+                                Coefficient_traits::const_reference coeff1,
+                                Coefficient_traits::const_reference coeff2) {
+  PPL_ASSERT(coeff1 != 0);
+  PPL_ASSERT(coeff2 != 0);
+  PPL_ASSERT(this != &y);
+
+  if (coeff1 == 1) {
+    // Optimize for this special case.
+    iterator i = end();
+    for (const_iterator j = y.begin(), j_end = y.end(); j != j_end; ++j) {
+      i = insert(i, j.index());
+      add_mul_assign(*i, *j, coeff2);
+      if (*i == 0)
+        i = reset(i);
+    }
+    return;
+  }
+
+  dimension_type counter = 0;
+  // Count the number of elements that are stored in y but not in *this.
+  {
+    iterator i = begin();
+    iterator i_end = end();
+    const_iterator j = y.begin();
+    const_iterator j_end = y.end();
+    if (i != i_end) {
+      while (j != j_end) {
+        PPL_ASSERT(i != i_end);
+        if (i.index() == j.index()) {
+          ++i;
+          ++j;
+          if (i == i_end)
+            break;
+        }
+        else
+          if (i.index() < j.index()) {
+            i = lower_bound(i, j.index());
+            if (i == i_end)
+              break;
+          }
+          else {
+            PPL_ASSERT(i.index() > j.index());
+            ++counter;
+            ++j;
+          }
+      }
+    }
+    PPL_ASSERT(i == i_end || j == j_end);
+    for ( ; j != j_end; ++j)
+      ++counter;
+  }
+  // This condition is arbitrary. Changing it affects performance but not
+  // correctness. The values have been tuned using some ppl_lpsol benchmarks
+  // on 2 October 2010.
+  if (counter == 0 || counter < (7 * size()) / 64) {
+    // Few insertions needed, do them directly.
+    iterator i = begin();
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset() and insert().
+    const iterator& i_end = end();
+    const_iterator j = y.begin();
+    const_iterator j_end = y.end();
+    while (i != i_end && j != j_end) {
+      if (i.index() == j.index()) {
+        (*i) *= coeff1;
+        add_mul_assign(*i, *j, coeff2);
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          (*i) *= coeff1;
+          ++i;
+        }
+        else {
+          PPL_ASSERT(i.index() > j.index());
+          i = insert(i, j.index(), *j);
+          (*i) *= coeff2;
+          ++i;
+          ++j;
+        }
+    }
+    PPL_ASSERT(i == i_end || j == j_end);
+    for ( ; i != i_end; ++i)
+      (*i) *= coeff1;
+    for ( ; j != j_end; ++j) {
+      i = insert(i, j.index(), *j);
+      (*i) *= coeff2;
+    }
+  }
+  else {
+    // Too many insertions needed, a full copy is probably faster than
+    // inserting all those new elements into *this.
+    CO_Tree new_tree(sparse_row_linear_combine_helper_iterator(*this, y,
+                                                                coeff1,
+                                                                coeff2),
+                     counter + tree.size());
+    tree.m_swap(new_tree);
+
+    // Now remove stored zeroes.
+    iterator i = begin();
+    // Note that end() can not be called only once, because reset()
+    // invalidates all iterators.
+    while (i != end()) {
+      if (*i == 0) {
+#ifndef NDEBUG
+        const dimension_type old_index = i.index();
+#endif
+        i = reset(i);
+        PPL_ASSERT(find(old_index) == end());
+      }
+      else
+        ++i;
+    }
+  }
+}
+
+void
+PPL::Sparse_Row::linear_combine(const Sparse_Row& y,
+                                Coefficient_traits::const_reference coeff1,
+                                Coefficient_traits::const_reference coeff2,
+                                dimension_type start, dimension_type end) {
+  PPL_ASSERT(coeff1 != 0);
+  PPL_ASSERT(coeff2 != 0);
+  PPL_ASSERT(this != &y);
+
+  if (coeff1 == 1) {
+    if (coeff2 == 1) {
+      // Optimized implementation for coeff1==1, coeff2==1.
+      iterator i = this->end();
+      for (const_iterator j = y.lower_bound(start),
+             j_end = y.lower_bound(end); j != j_end; ++j) {
+        i = insert(i, j.index());
+        *i += *j;
+        if (*i == 0)
+          i = reset(i);
+      }
+      return;
+    }
+    if (coeff2 == -1) {
+      // Optimized implementation for coeff1==1, coeff2==-1.
+      iterator i = this->end();
+      for (const_iterator j = y.lower_bound(start),
+             j_end = y.lower_bound(end); j != j_end; ++j) {
+        i = insert(i, j.index());
+        *i -= *j;
+        if (*i == 0)
+          i = reset(i);
+      }
+      return;
+    }
+    // Optimized implementation for coeff1==1.
+    iterator i = this->end();
+    for (const_iterator j = y.lower_bound(start),
+           j_end = y.lower_bound(end); j != j_end; ++j) {
+      i = insert(i, j.index());
+      add_mul_assign(*i, *j, coeff2);
+      if (*i == 0)
+        i = reset(i);
+    }
+    return;
+  }
+
+  if (coeff2 == 1) {
+    // Optimized implementation for coeff2==1.
+    iterator i = lower_bound(start);
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset() and insert().
+    const iterator& i_end = this->end();
+    const_iterator j = y.lower_bound(start);
+    const_iterator j_end = y.lower_bound(end);
+    while (i != i_end && i.index() < end && j != j_end) {
+      if (i.index() == j.index()) {
+        (*i) *= coeff1;
+        *i += *j;
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          (*i) *= coeff1;
+          ++i;
+        }
+        else {
+          PPL_ASSERT(i.index() > j.index());
+          i = insert(i, j.index(), *j);
+          ++i;
+          ++j;
+        }
+    }
+    PPL_ASSERT(i == i_end || j == j_end);
+    for ( ; i != i_end && i.index() < end; ++i)
+      (*i) *= coeff1;
+    for ( ; j != j_end; ++j)
+      i = insert(i, j.index(), *j);
+    return;
+  }
+
+  if (coeff2 == -1) {
+    // Optimized implementation for coeff2==-1.
+    iterator i = lower_bound(start);
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset() and insert().
+    const iterator& i_end = this->end();
+    const_iterator j = y.lower_bound(start);
+    const_iterator j_end = y.lower_bound(end);
+    while (i != i_end && i.index() < end && j != j_end) {
+      if (i.index() == j.index()) {
+        (*i) *= coeff1;
+        *i -= *j;
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          (*i) *= coeff1;
+          ++i;
+        }
+        else {
+          PPL_ASSERT(i.index() > j.index());
+          i = insert(i, j.index(), *j);
+          neg_assign(*i);
+          ++i;
+          ++j;
+        }
+    }
+    PPL_ASSERT(i == i_end || j == j_end);
+    for ( ; i != i_end && i.index() < end; ++i)
+      (*i) *= coeff1;
+    for ( ; j != j_end; ++j) {
+      i = insert(i, j.index(), *j);
+      neg_assign(*i);
+    }
+    return;
+  }
+
+  iterator i = lower_bound(start);
+  // This is a const reference to an internal iterator, that is kept valid.
+  // If we just stored a copy, that would be invalidated by the calls to
+  // reset() and insert().
+  const iterator& i_end = this->end();
+  const_iterator j = y.lower_bound(start);
+  const_iterator j_end = y.lower_bound(end);
+  while (i != i_end && i.index() < end && j != j_end) {
+    if (i.index() == j.index()) {
+      (*i) *= coeff1;
+      add_mul_assign(*i, *j, coeff2);
+      if (*i == 0)
+        i = reset(i);
+      else
+        ++i;
+      ++j;
+    }
+    else
+      if (i.index() < j.index()) {
+        (*i) *= coeff1;
+        ++i;
+      }
+      else {
+        PPL_ASSERT(i.index() > j.index());
+        i = insert(i, j.index(), *j);
+        (*i) *= coeff2;
+        ++i;
+        ++j;
+      }
+  }
+  PPL_ASSERT(i == i_end || j == j_end);
+  for ( ; i != i_end && i.index() < end; ++i)
+    (*i) *= coeff1;
+  for ( ; j != j_end; ++j) {
+    i = insert(i, j.index(), *j);
+    (*i) *= coeff2;
+  }
+}
+
+void
+PPL::Sparse_Row::ascii_dump(std::ostream& s) const {
+  s << "size " << size_ << ' ';
+  dimension_type n_elements = 0;
+  for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+    ++n_elements;
+  s << "elements " << n_elements << ' ';
+  for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+    s << "[ " << i.index() << " ]= " << *i << ' ';
+  s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Sparse_Row)
+
+bool
+PPL::Sparse_Row::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "size")
+    return false;
+  if (!(s >> size_))
+    return false;
+  clear();
+
+  if (!(s >> str) || str != "elements")
+    return false;
+
+  dimension_type n_elements;
+  if (!(s >> n_elements))
+    return false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(current_data);
+  for (dimension_type i = 0; i < n_elements; ++i) {
+    dimension_type current_key;
+    if (!(s >> str) || str != "[")
+      return false;
+    if (!(s >> current_key))
+      return false;
+    if (!(s >> str) || str != "]=")
+      return false;
+    if (!(s >> current_data))
+      return false;
+    tree.insert(current_key, current_data);
+  }
+  PPL_ASSERT(OK());
+  return true;
+}
+
+bool
+PPL::Sparse_Row::OK() const {
+  if (begin() == end())
+    return true;
+  const_iterator last = end();
+  --last;
+  return (last.index() < size_);
+}
+
+bool
+PPL::Sparse_Row::OK(dimension_type /* capacity */) const {
+  return OK();
+}
+
+/*! \relates Parma_Polyhedra_Library::Sparse_Row */
+bool
+PPL::operator==(const Sparse_Row& x, const Sparse_Row& y) {
+  if (x.size() != y.size())
+    return false;
+  Sparse_Row::const_iterator i = x.begin();
+  Sparse_Row::const_iterator i_end = x.end();
+  Sparse_Row::const_iterator j = y.begin();
+  Sparse_Row::const_iterator j_end = y.end();
+  while (i != i_end && j != j_end) {
+    if (i.index() == j.index()) {
+      if (*i != *j)
+        return false;
+      ++i;
+      ++j;
+    }
+    else {
+      if (i.index() < j.index()) {
+        if (*i != 0)
+          return false;
+        ++i;
+      }
+      else {
+        PPL_ASSERT(i.index() > j.index());
+        if (*j != 0)
+          return false;
+        ++j;
+      }
+    }
+  }
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      return false;
+  for ( ; j != j_end; ++j)
+    if (*j != 0)
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Sparse_Row */
+bool
+PPL::operator!=(const Sparse_Row& x, const Sparse_Row& y) {
+  return !(x == y);
+}
+
+bool
+PPL::operator==(const Dense_Row& x, const Sparse_Row& y) {
+  if (x.size() != y.size())
+    return false;
+  Sparse_Row::const_iterator itr = y.end();
+  for (dimension_type i = 0; i < x.size(); ++i) {
+    itr = y.lower_bound(itr, i);
+    if (itr != y.end() && itr.index() == i) {
+      if (x[i] != *itr)
+        return false;
+    }
+    else {
+      if (x[i] != 0)
+        return false;
+    }
+  }
+  return true;
+}
+
+bool
+PPL::operator!=(const Dense_Row& x, const Sparse_Row& y) {
+  return !(x == y);
+}
+
+bool
+PPL::operator==(const Sparse_Row& x, const Dense_Row& y) {
+  return y == x;
+}
+
+bool
+PPL::operator!=(const Sparse_Row& x, const Dense_Row& y) {
+  return !(x == y);
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2) {
+  PPL_ASSERT(x.size() >= y.size());
+  PPL_ASSERT(coeff1 != 0);
+  PPL_ASSERT(coeff2 != 0);
+
+  Sparse_Row::iterator itr = x.end();
+
+  for (dimension_type i = 0; i < y.size(); ++i) {
+    itr = x.lower_bound(itr, i);
+    if (itr == x.end() || itr.index() != i) {
+      if (y[i] == 0)
+        continue;
+      itr = x.insert(itr, i, y[i]);
+      (*itr) *= coeff2;
+      PPL_ASSERT((*itr) != 0);
+    }
+    else {
+      PPL_ASSERT(itr.index() == i);
+      (*itr) *= coeff1;
+      add_mul_assign(*itr, y[i], coeff2);
+      if (*itr == 0)
+        itr = x.reset(itr);
+    }
+  }
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2,
+                    dimension_type start, dimension_type end) {
+  PPL_ASSERT(coeff1 != 0);
+  PPL_ASSERT(coeff2 != 0);
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.size());
+  PPL_ASSERT(end <= y.size());
+
+  Sparse_Row::iterator itr = x.lower_bound(start);
+
+  if (coeff1 == 1) {
+    if (coeff2 == 1) {
+      for (dimension_type i = start; i < end; ++i) {
+        PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+        if (itr != x.end() && itr.index() < i)
+          ++itr;
+        PPL_ASSERT(itr == x.end() || itr.index() >= i);
+        if (itr == x.end() || itr.index() != i) {
+          if (y[i] == 0)
+            continue;
+          itr = x.insert(itr, i, y[i]);
+          PPL_ASSERT((*itr) != 0);
+        }
+        else {
+          PPL_ASSERT(itr.index() == i);
+          (*itr) += y[i];
+          if (*itr == 0)
+            itr = x.reset(itr);
+        }
+      }
+      return;
+    }
+    if (coeff2 == -1) {
+      for (dimension_type i = start; i < end; ++i) {
+        PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+        if (itr != x.end() && itr.index() < i)
+          ++itr;
+        PPL_ASSERT(itr == x.end() || itr.index() >= i);
+        if (itr == x.end() || itr.index() != i) {
+          if (y[i] == 0)
+            continue;
+          itr = x.insert(itr, i, y[i]);
+          neg_assign(*itr);
+          PPL_ASSERT((*itr) != 0);
+        }
+        else {
+          PPL_ASSERT(itr.index() == i);
+          (*itr) -= y[i];
+          if (*itr == 0)
+            itr = x.reset(itr);
+        }
+      }
+      return;
+    }
+    for (dimension_type i = start; i < end; ++i) {
+      PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+      if (itr != x.end() && itr.index() < i)
+        ++itr;
+      PPL_ASSERT(itr == x.end() || itr.index() >= i);
+      if (itr == x.end() || itr.index() != i) {
+        if (y[i] == 0)
+          continue;
+        itr = x.insert(itr, i, y[i]);
+        (*itr) *= coeff2;
+        PPL_ASSERT((*itr) != 0);
+      }
+      else {
+        PPL_ASSERT(itr.index() == i);
+        add_mul_assign(*itr, y[i], coeff2);
+        if (*itr == 0)
+          itr = x.reset(itr);
+      }
+    }
+    return;
+  }
+
+  if (coeff2 == 1) {
+    for (dimension_type i = start; i < end; ++i) {
+      PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+      if (itr != x.end() && itr.index() < i)
+        ++itr;
+      PPL_ASSERT(itr == x.end() || itr.index() >= i);
+      if (itr == x.end() || itr.index() != i) {
+        if (y[i] == 0)
+          continue;
+        itr = x.insert(itr, i, y[i]);
+        PPL_ASSERT((*itr) != 0);
+      }
+      else {
+        PPL_ASSERT(itr.index() == i);
+        (*itr) *= coeff1;
+        (*itr) += y[i];
+        if (*itr == 0)
+          itr = x.reset(itr);
+      }
+    }
+    return;
+  }
+  if (coeff2 == -1) {
+    for (dimension_type i = start; i < end; ++i) {
+      PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+      if (itr != x.end() && itr.index() < i)
+        ++itr;
+      PPL_ASSERT(itr == x.end() || itr.index() >= i);
+      if (itr == x.end() || itr.index() != i) {
+        if (y[i] == 0)
+          continue;
+        itr = x.insert(itr, i, y[i]);
+        neg_assign(*itr);
+        PPL_ASSERT((*itr) != 0);
+      }
+      else {
+        PPL_ASSERT(itr.index() == i);
+        (*itr) *= coeff1;
+        (*itr) -= y[i];
+        if (*itr == 0)
+          itr = x.reset(itr);
+      }
+    }
+    return;
+  }
+
+  for (dimension_type i = start; i < end; ++i) {
+    PPL_ASSERT(itr == x.end() || itr.index() + 1 >= i);
+    if (itr != x.end() && itr.index() < i)
+      ++itr;
+    PPL_ASSERT(itr == x.end() || itr.index() >= i);
+    if (itr == x.end() || itr.index() != i) {
+      if (y[i] == 0)
+        continue;
+      itr = x.insert(itr, i, y[i]);
+      (*itr) *= coeff2;
+      PPL_ASSERT((*itr) != 0);
+    }
+    else {
+      PPL_ASSERT(itr.index() == i);
+      (*itr) *= coeff1;
+      add_mul_assign(*itr, y[i], coeff2);
+      if (*itr == 0)
+        itr = x.reset(itr);
+    }
+  }
+}
+
+void
+PPL::linear_combine(Dense_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2) {
+  PPL_ASSERT(x.size() >= y.size());
+  if (coeff1 == 1) {
+    for (Sparse_Row::const_iterator i = y.begin(),
+           i_end = y.end(); i != i_end; ++i)
+      add_mul_assign(x[i.index()], *i, coeff2);
+    return;
+  }
+
+  Sparse_Row::const_iterator itr = y.end();
+
+  for (dimension_type i = 0; i < x.size(); ++i) {
+    x[i] *= coeff1;
+
+    itr = y.lower_bound(itr, i);
+
+    if (itr == y.end() || itr.index() != i)
+      continue;
+
+    add_mul_assign(x[i], *itr, coeff2);
+  }
+}
+
+void
+PPL::linear_combine(Dense_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2,
+                    dimension_type start, dimension_type end) {
+  PPL_ASSERT(x.size() >= y.size());
+  PPL_ASSERT(coeff1 != 0);
+  PPL_ASSERT(coeff2 != 0);
+
+  Sparse_Row::const_iterator itr = y.lower_bound(start);
+
+  if (coeff1 == 1) {
+    Sparse_Row::const_iterator itr_end = y.lower_bound(end);
+    if (coeff2 == 1) {
+      for ( ; itr != itr_end; ++itr)
+        x[itr.index()] += *itr;
+      return;
+    }
+    if (coeff2 == -1) {
+      for ( ; itr != itr_end; ++itr)
+        x[itr.index()] -= *itr;
+      return;
+    }
+    for ( ; itr != itr_end; ++itr)
+      add_mul_assign(x[itr.index()], *itr, coeff2);
+    return;
+  }
+
+  if (coeff2 == 1) {
+    for (dimension_type i = start; i < end; ++i) {
+      x[i] *= coeff1;
+
+      PPL_ASSERT(itr == y.end() || itr.index() + 1 >= i);
+      if (itr != y.end() && itr.index() < i)
+        ++itr;
+      PPL_ASSERT(itr == y.end() || itr.index() >= i);
+
+      if (itr == y.end() || itr.index() != i)
+        continue;
+
+      x[i] += *itr;
+    }
+    return;
+  }
+  if (coeff2 == -1) {
+    for (dimension_type i = start; i < end; ++i) {
+      x[i] *= coeff1;
+
+      PPL_ASSERT(itr == y.end() || itr.index() + 1 >= i);
+      if (itr != y.end() && itr.index() < i)
+        ++itr;
+      PPL_ASSERT(itr == y.end() || itr.index() >= i);
+
+      if (itr == y.end() || itr.index() != i)
+        continue;
+
+      x[i] -= *itr;
+    }
+    return;
+  }
+
+  for (dimension_type i = start; i < end; ++i) {
+    x[i] *= coeff1;
+
+    PPL_ASSERT(itr == y.end() || itr.index() + 1 >= i);
+    if (itr != y.end() && itr.index() < i)
+      ++itr;
+    PPL_ASSERT(itr == y.end() || itr.index() >= i);
+
+    if (itr == y.end() || itr.index() != i)
+      continue;
+
+    add_mul_assign(x[i], *itr, coeff2);
+  }
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2) {
+  x.linear_combine(y, coeff1, coeff2);
+}
+
+void
+PPL::linear_combine(Sparse_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end) {
+  x.linear_combine(y, c1, c2, start, end);
+}
+
+void
+PPL::swap(Sparse_Row& x, Dense_Row& y) {
+  Dense_Row new_dense(x.size(), x.size());
+
+  for (Sparse_Row::iterator i = x.begin(), i_end = x.end(); i != i_end; ++i)
+    swap(new_dense[i.index()], *i);
+
+  // NOTE: This copies the coefficients, but it could steal them.
+  // Implementing a stealing-based algorithm takes a lot of time and it's
+  // probably not worth it.
+  Sparse_Row new_sparse(y);
+
+  swap(new_dense, y);
+  swap(new_sparse, x);
+}
+
+void
+PPL::swap(Dense_Row& x, Sparse_Row& y) {
+  swap(y, x);
+}
diff --git a/src/Sparse_Row_defs.hh b/src/Sparse_Row_defs.hh
new file mode 100644
index 0000000..a8ee19a
--- /dev/null
+++ b/src/Sparse_Row_defs.hh
@@ -0,0 +1,930 @@
+/* Sparse_Row class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sparse_Row_defs_hh
+#define PPL_Sparse_Row_defs_hh 1
+
+#include "Sparse_Row_types.hh"
+
+#include "CO_Tree_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Dense_Row_types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sparse sequence of coefficients.
+/*! \ingroup PPL_CXX_interface
+  This class is implemented using a CO_Tree. See the documentation of CO_Tree
+  for details on the implementation and the performance.
+
+  This class is a drop-in replacement of Dense_Row, meaning that code
+  using Dense_Row can be ported to Sparse_Row changing only the type.
+  The resulting code will work, but probably needs more CPU and memory (it
+  does not exploit the sparse representation yet).
+
+  To take advantage of the sparse representation, the client code must then be
+  modified to use methods which can have a faster implementation on sparse
+  data structures.
+
+  The main changes are the replacement of calls to operator[] with calls to
+  find(), lower_bound() or insert(), using hint iterators when possible.
+  Sequential scanning of rows should probably be implemented using iterators
+  rather than indexes, to improve performance.
+  reset() should be called to zero elements.
+
+  \see Sparse_Matrix
+  \see CO_Tree
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Sparse_Row {
+
+public:
+
+  //! An %iterator on the row elements
+  /*!
+    This %iterator skips non-stored zeroes.
+    \see CO_Tree::iterator
+  */
+  typedef CO_Tree::iterator iterator;
+
+  //! A const %iterator on the row elements
+  /*!
+    This %iterator skips non-stored zeroes.
+    \see CO_Tree::const_iterator
+  */
+  typedef CO_Tree::const_iterator const_iterator;
+
+  //! Constructs a row with the specified size.
+  /*!
+    \param n
+    The size for the new row.
+
+    The row will contain only non-stored zeroes.
+
+    This constructor takes \f$O(1)\f$ time.
+  */
+  explicit Sparse_Row(dimension_type n = 0);
+
+  //! Constructs a row with the specified size.
+  /*!
+    \param n
+    The size for the new row.
+
+    \param capacity
+    It is ignored. This parameter is needed for compatibility with Dense_Row.
+
+    The row will contain only non-stored zeroes.
+
+    This constructor takes \f$O(1)\f$ time.
+  */
+  Sparse_Row(dimension_type n, dimension_type capacity);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Sparse_Row(const Sparse_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Constructor from a Dense_Row.
+  /*!
+    \param row
+    The row that will be copied into *this.
+
+    This constructor takes \f$O(n)\f$ time. Note that constructing of a row of
+    zeroes and then inserting n elements costs \f$O(n*\log^2 n)\f$ time.
+  */
+  explicit Sparse_Row(const Dense_Row& row);
+
+  //! Copy constructor from a Dense_Row with specified size and capacity.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Sparse_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+  Sparse_Row& operator=(const Dense_Row& row);
+
+  //! Swaps *this and x.
+  /*!
+    \param x
+    The row that will be swapped with *this.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void m_swap(Sparse_Row& x);
+
+  //! Returns the size of the row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type size() const;
+
+  //! Returns the number of elements explicitly stored in the row.
+  /*!
+    This is equivalent to std::distance(begin(), end()), but it's much faster.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type num_stored_elements() const;
+
+  //! Resizes the row to the specified size.
+  /*!
+    \param n
+    The new size for the row.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time when shrinking the
+    row and removing the trailing k elements.
+    It takes \f$O(1)\f$ time when enlarging the row.
+  */
+  void resize(dimension_type n);
+
+  //! Resizes the row to size \p n.
+  /*!
+    \param n
+    The new size for the row.
+
+    This method, with this signature, is needed for compatibility with
+    Dense_Row.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void expand_within_capacity(dimension_type n);
+
+  //! Resizes the row to size \p n.
+  /*!
+    \param n
+    The new size for the row.
+
+    This method, with this signature, is needed for compatibility with
+    Dense_Row.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time where k is the number
+    of removed elements.
+  */
+  void shrink(dimension_type n);
+
+  /*!
+    \brief Deletes the i-th element from the row, shifting the next elements
+           to the left.
+
+    \param i
+    The index of the element that will be deleted.
+
+    The size of the row is decreased by 1.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k+\log^2 n)\f$ amortized time, where k is the
+    number of elements with index greater than i.
+  */
+  void delete_element_and_shift(dimension_type i);
+
+  //! Adds \p n zeroes before index \p i.
+  /*!
+    \param n
+    The number of non-stored zeroes that will be added to the row.
+
+    \param i
+    The index of the element before which the zeroes will be added.
+
+    Existing elements with index greater than or equal to \p i are shifted to
+    the right by \p n positions. The size is increased by \p n.
+
+    Existing iterators are not invalidated, but are shifted to the right
+    by \p n if they pointed at or after index \p i (i.e., they point to
+    the same, possibly shifted, values as before).
+
+    This method takes \f$O(k + \log m)\f$ expected time, where \f$k\f$ is
+    the number of elements with index greater than or equal to \p i and
+    \f$m\f$ the number of stored elements.
+  */
+  void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+  //! Returns an %iterator that points at the first stored element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator begin();
+
+  //! Returns an %iterator that points after the last stored element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is kept valid.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const iterator& end();
+
+  //! Equivalent to <CODE>cbegin()</CODE>.
+  const_iterator begin() const;
+
+  //! Equivalent to <CODE>cend()</CODE>.
+  const const_iterator& end() const;
+
+  //! Returns an %iterator that points at the first element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator cbegin() const;
+
+  //! Returns an %iterator that points after the last element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is updated at each operation that modifies the structure.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const const_iterator& cend() const;
+
+  //! Returns the size() of the largest possible Sparse_Row.
+  static dimension_type max_size();
+
+  //! Resets all the elements of this row.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  void clear();
+
+  //! Gets a reference to the i-th element.
+  /*!
+    \param i
+    The index of the desired element.
+
+    For read-only access it's better to use get(), that avoids allocating
+    space for zeroes.
+
+    If possible, use the insert(), find() or lower_bound() methods with
+    a hint instead of this, to improve performance.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ amortized time when there is already an
+    element with index \p i, and \f$O(\log^2 n)\f$ otherwise.
+  */
+  Coefficient& operator[](dimension_type i);
+
+  //! Equivalent to <CODE>get(i)</CODE>, provided for convenience.
+  /*!
+    This method takes \f$O(\log n)\f$ time.
+  */
+  Coefficient_traits::const_reference operator[](dimension_type i) const;
+
+  //! Gets the i-th element in the sequence.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use the insert(), find() or lower_bound() methods with
+    a hint instead of this, to improve performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  iterator find(dimension_type i);
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  iterator find(iterator itr, dimension_type i);
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  const_iterator find(dimension_type i) const;
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  const_iterator find(const_iterator itr, dimension_type i) const;
+
+  //! Lower bound of index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  iterator lower_bound(dimension_type i);
+
+  //! Lower bound of index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  iterator lower_bound(iterator itr, dimension_type i);
+
+  //! Lower bound of index i.
+  /*!
+
+    \param i
+    The index of the desired element.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  const_iterator lower_bound(dimension_type i) const;
+
+  //! Lower bound of index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+  //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param x
+    The value that will be associated to the element.
+
+    If possible, use versions of this method that take a hint, to improve
+    performance.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+  //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param x
+    The value that will be associated to the element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr, even faster than <CODE>(*this)[i] = x</CODE>.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+    between \p itr and the searched position is \f$O(1)\f$ and the row already
+    contains an element with this index, this method takes \f$O(1)\f$ time.
+  */
+  iterator insert(iterator itr, dimension_type i,
+                  Coefficient_traits::const_reference x);
+
+  //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use versions of this method that take a hint, to improve
+    performance.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator insert(dimension_type i);
+
+  //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr, even faster than <CODE>(*this)[i]</CODE>.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+    between \p itr and the searched position is \f$O(1)\f$ and the row already
+    contains an element with this index, this method takes \f$O(1)\f$ time.
+  */
+  iterator insert(iterator itr, dimension_type i);
+
+  //! Swaps the i-th element with the j-th element.
+  /*!
+    \param i
+    The index of an element.
+
+    \param j
+    The index of another element.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  void swap_coefficients(dimension_type i, dimension_type j);
+
+  //! Equivalent to swap(i,itr.index()), but it assumes that
+  //! lower_bound(i)==itr.
+  /*!
+    Iterators that pointed to the itr.index()-th element remain valid
+    but now point to the i-th element. Other iterators are unaffected.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void fast_swap(dimension_type i, iterator itr);
+
+  //! Swaps the element pointed to by i with the element pointed to by j.
+  /*!
+    \param i
+    An %iterator pointing to an element.
+
+    \param j
+    An %iterator pointing to another element.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void swap_coefficients(iterator i, iterator j);
+
+  //! Resets to zero the value pointed to by i.
+  /*!
+    \param i
+    An %iterator pointing to the element that will be reset (not stored
+    anymore).
+
+    By calling this method instead of getting a reference to the value and
+    setting it to zero, the element will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator reset(iterator i);
+
+  //! Resets to zero the values in the range [first,last).
+  /*!
+    \param first
+    An %iterator pointing to the first element to reset.
+
+    \param last
+    An %iterator pointing after the last element to reset.
+
+    By calling this method instead of getting a reference to the values and
+    setting them to zero, the elements will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+    number of elements in [first,last).
+  */
+  iterator reset(iterator first, iterator last);
+
+  //! Resets to zero the i-th element.
+  /*!
+    \param i
+    The index of the element to reset.
+
+    By calling this method instead of getting a reference to the value and
+    setting it to zero, the element will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  void reset(dimension_type i);
+
+  //! Resets to zero the elements with index greater than or equal to i.
+  /*!
+    \param i
+    The index of the first element to reset.
+
+    By calling this method instead of getting a reference to the values and
+    setting them to zero, the elements will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+    number of elements with index greater than or equal to i.
+  */
+  void reset_after(dimension_type i);
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of the row
+    and normalizes them by the GCD itself.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void normalize();
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when c1 is zero.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_second
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_first(const Sparse_Row& y,
+                           const Func1& f, const Func2& g);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, 0) must do nothing, for every c1.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_second(const Sparse_Row& y,
+                            const Func1& g, const Func2& h);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine_needs_second
+  */
+  template <typename Func1, typename Func2, typename Func3>
+  void combine(const Sparse_Row& y,
+               const Func1& f, const Func2& g, const Func3& h);
+
+  //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+  //! each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param coeff1
+    The coefficient used for elements of *this.
+    This must not be 0.
+
+    \param coeff2
+    The coefficient used for elements of y.
+    This must not be 0.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary.
+    This method can be implemented in user code, too. It is provided for
+    convenience only.
+
+    \see combine_needs_first
+    \see combine_needs_second
+    \see combine
+  */
+  void linear_combine(const Sparse_Row& y,
+                      Coefficient_traits::const_reference coeff1,
+                      Coefficient_traits::const_reference coeff2);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  /*!
+    This method, unlike the other linear_combine() method, detects when
+    coeff1==1 and/or coeff2==1 or coeff2==-1 in order to save some work.
+  */
+  void linear_combine(const Sparse_Row& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! Loads the row from an ASCII representation generated using ascii_dump().
+  /*!
+    \param s
+    The stream from which the ASCII representation will be loaded.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method is provided for compatibility with Dense_Row.
+
+    This method takes \f$O(n)\f$ time.
+
+    \param capacity
+    This parameter is ignored.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method is provided for compatibility with Dense_Row.
+
+    This method takes \f$O(n)\f$ time.
+
+    \param capacity
+    This parameter is ignored.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks the invariant.
+  bool OK() const;
+
+  //! Checks the invariant.
+  /*!
+    This method is provided for compatibility with Dense_Row.
+
+    \param capacity
+    This parameter is ignored.
+  */
+  bool OK(dimension_type capacity) const;
+
+private:
+  //! The tree used to store the elements.
+  CO_Tree tree;
+
+  //! The size of the row.
+  /*!
+    The elements contained in this row have indexes that are less than size_.
+  */
+  dimension_type size_;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+          Parma_Polyhedra_Library::Sparse_Row& y);
+
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+          Parma_Polyhedra_Library::Dense_Row& y);
+
+void swap(Parma_Polyhedra_Library::Dense_Row& x,
+          Parma_Polyhedra_Library::Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Sparse_Row& x, const Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Sparse_Row& x, const Sparse_Row& y);
+
+bool operator==(const Dense_Row& x, const Sparse_Row& y);
+bool operator!=(const Dense_Row& x, const Sparse_Row& y);
+
+bool operator==(const Sparse_Row& x, const Dense_Row& y);
+bool operator!=(const Sparse_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+  This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+  order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+  This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+  order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+  This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+  order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Sparse_Row_inlines.hh"
+#include "Sparse_Row_templates.hh"
+
+#endif // !defined(PPL_Sparse_Row_defs_hh)
diff --git a/src/Sparse_Row_inlines.hh b/src/Sparse_Row_inlines.hh
new file mode 100644
index 0000000..1d4ba74
--- /dev/null
+++ b/src/Sparse_Row_inlines.hh
@@ -0,0 +1,378 @@
+/* Sparse_Row class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sparse_Row_inlines_hh
+#define PPL_Sparse_Row_inlines_hh 1
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n)
+  : size_(n) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n, dimension_type)
+  : size_(n) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type)
+  : tree(y.tree), size_(y.size_) {
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type)
+  : tree(y.begin(),
+         std::distance(y.begin(), y.lower_bound(std::min(y.size(), sz)))),
+    size_(sz) {
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::m_swap(Sparse_Row& x) {
+  using std::swap;
+  swap(tree, x.tree);
+  swap(size_, x.size_);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(x.OK());
+}
+
+inline dimension_type
+Sparse_Row::size() const {
+  return size_;
+}
+
+inline dimension_type
+Sparse_Row::num_stored_elements() const {
+  return tree.size();
+}
+
+inline void
+Sparse_Row::resize(dimension_type n) {
+  if (n < size_)
+    reset_after(n);
+  size_ = n;
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::shrink(dimension_type n) {
+  PPL_ASSERT(size() >= n);
+  resize(n);
+}
+
+inline void
+Sparse_Row::expand_within_capacity(dimension_type n) {
+  PPL_ASSERT(size() <= n);
+  resize(n);
+}
+
+inline void
+Sparse_Row::delete_element_and_shift(dimension_type i) {
+  PPL_ASSERT(i < size_);
+  tree.erase_element_and_shift_left(i);
+  --size_;
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::add_zeroes_and_shift(dimension_type n, dimension_type i) {
+  PPL_ASSERT(i <= size_);
+  tree.increase_keys_from(i, n);
+  size_ += n;
+  PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::begin() {
+  return tree.begin();
+}
+
+inline const Sparse_Row::iterator&
+Sparse_Row::end() {
+  return tree.end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::begin() const {
+  return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::end() const {
+  return tree.cend();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::cbegin() const {
+  return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::cend() const {
+  return tree.cend();
+}
+
+inline dimension_type
+Sparse_Row::max_size() {
+  return CO_Tree::max_size();
+}
+
+inline void
+Sparse_Row::clear() {
+  tree.clear();
+}
+
+inline Coefficient&
+Sparse_Row::operator[](dimension_type i) {
+  PPL_ASSERT(i < size_);
+  iterator itr = insert(i);
+  return *itr;
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::operator[](dimension_type i) const {
+  return get(i);
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::get(dimension_type i) const {
+  PPL_ASSERT(i < size_);
+  if (tree.empty())
+    return Coefficient_zero();
+  const_iterator itr = find(i);
+  if (itr != end())
+    return *itr;
+  else
+    return Coefficient_zero();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(dimension_type i) {
+  PPL_ASSERT(i < size());
+
+  iterator itr = tree.bisect(i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(iterator hint, dimension_type i) {
+  PPL_ASSERT(i < size());
+
+  iterator itr = tree.bisect_near(hint, i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(dimension_type i) const {
+  PPL_ASSERT(i < size());
+
+  const_iterator itr = tree.bisect(i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(const_iterator hint, dimension_type i) const {
+  PPL_ASSERT(i < size());
+
+  const_iterator itr = tree.bisect_near(hint, i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(dimension_type i) {
+  PPL_ASSERT(i <= size());
+
+  iterator itr = tree.bisect(i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(iterator hint, dimension_type i) {
+  PPL_ASSERT(i <= size());
+
+  iterator itr = tree.bisect_near(hint, i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(dimension_type i) const {
+  PPL_ASSERT(i <= size());
+
+  const_iterator itr = tree.bisect(i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(const_iterator hint, dimension_type i) const {
+  PPL_ASSERT(i <= size());
+
+  const_iterator itr = tree.bisect_near(hint, i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i, Coefficient_traits::const_reference x) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i,
+                   Coefficient_traits::const_reference x) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(itr, i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(i);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(itr, i);
+}
+
+inline void
+Sparse_Row::swap_coefficients(iterator i, iterator j) {
+  PPL_ASSERT(i != end());
+  PPL_ASSERT(j != end());
+  using std::swap;
+  swap(*i, *j);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::fast_swap(dimension_type i, iterator itr) {
+  PPL_ASSERT(lower_bound(i) == itr);
+  PPL_ASSERT(itr != end());
+  tree.fast_shift(i, itr);
+  PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::reset(iterator i) {
+  iterator res = tree.erase(i);
+  PPL_ASSERT(OK());
+  return res;
+}
+
+inline void
+Sparse_Row::reset(dimension_type i) {
+  PPL_ASSERT(i < size());
+
+  tree.erase(i);
+  PPL_ASSERT(OK());
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes() const {
+  return tree.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes(dimension_type /* capacity */) const {
+  return external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes(dimension_type /* capacity */) const {
+  return total_memory_in_bytes();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline void
+swap(Sparse_Row& x, Sparse_Row& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sparse_Row_inlines_hh)
diff --git a/src/Sparse_Row_templates.hh b/src/Sparse_Row_templates.hh
new file mode 100644
index 0000000..c703a3e
--- /dev/null
+++ b/src/Sparse_Row_templates.hh
@@ -0,0 +1,153 @@
+/* Sparse_Row class implementation: non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sparse_Row_templates_hh
+#define PPL_Sparse_Row_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_first(const Sparse_Row& y,
+                                const Func1& f, const Func2& g) {
+  if (this == &y) {
+    for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+      g(*i, *i);
+  }
+  else {
+    iterator i = begin();
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset().
+    const iterator& i_end = end();
+    const_iterator j = y.begin();
+    const_iterator j_end = y.end();
+    while (i != i_end && j != j_end)
+      if (i.index() == j.index()) {
+        g(*i, *j);
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          f(*i);
+          if (*i == 0)
+            i = reset(i);
+          else
+            ++i;
+        }
+        else
+          j = y.lower_bound(j, i.index());
+    while (i != i_end) {
+      f(*i);
+      if (*i == 0)
+        i = reset(i);
+      else
+        ++i;
+    }
+  }
+}
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_second(const Sparse_Row& y,
+                                 const Func1& g,
+                                 const Func2& /* h */) {
+  iterator i = begin();
+  for (const_iterator j = y.begin(), j_end = y.end(); j != j_end; ++j) {
+    i = insert(i, j.index());
+    g(*i, *j);
+    if (*i == 0)
+      i = reset(i);
+  }
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Sparse_Row::combine(const Sparse_Row& y, const Func1& f,
+                    const Func2& g, const Func3& h) {
+  if (this == &y) {
+    for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+      g(*i, *i);
+  }
+  else {
+    iterator i = begin();
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset() and insert().
+    const iterator& i_end = end();
+    const_iterator j = y.begin();
+    const_iterator j_end = y.end();
+    while (i != i_end && j != j_end) {
+      if (i.index() == j.index()) {
+        g(*i, *j);
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          f(*i);
+          if (*i == 0)
+            i = reset(i);
+          else
+            ++i;
+        }
+        else {
+          PPL_ASSERT(i.index() > j.index());
+          i = insert(i, j.index());
+          h(*i, *j);
+          if (*i == 0)
+            i = reset(i);
+          else
+            ++i;
+          ++j;
+        }
+    }
+    PPL_ASSERT(i == i_end || j == j_end);
+    while (i != i_end) {
+      f(*i);
+      if (*i == 0)
+        i = reset(i);
+      else
+        ++i;
+    }
+    while (j != j_end) {
+      i = insert(i, j.index());
+      h(*i, *j);
+      if (*i == 0)
+        i = reset(i);
+      ++j;
+    }
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sparse_Row_templates_hh)
diff --git a/src/Sparse_Row_types.hh b/src/Sparse_Row_types.hh
new file mode 100644
index 0000000..e8b60f9
--- /dev/null
+++ b/src/Sparse_Row_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Sparse_Row_types_hh
+#define PPL_Sparse_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Sparse_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sparse_Row_types_hh)
diff --git a/src/Sum_Floating_Point_Expression_defs.hh b/src/Sum_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..5d4e02e
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_defs.hh
@@ -0,0 +1,213 @@
+/* Declarations for the Sum_Floating_Point_Expression class and
+   its   constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sum_Floating_Point_Expression_defs_hh
+#define PPL_Sum_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Sum_Floating_Point_Expression_types.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Sum Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of sum floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+  forms such that:
+
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v \right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+  \f]
+
+  Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the sum floating point expression
+    corresponding to \p x \f$\oplus\f$ \p y.
+  */
+  Sum_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+  //! Destructor.
+  ~Sum_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Sum_Floating_Point_Expression(
+         const Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Sum_Floating_Point_Expression<FP_Interval_Type,
+            FP_Format>& e);
+
+
+}; // class Sum_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Sum_Floating_Point_Expression_inlines.hh"
+#include "Sum_Floating_Point_Expression_templates.hh"
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_defs_hh)
diff --git a/src/Sum_Floating_Point_Expression_inlines.hh b/src/Sum_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..8b91262
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,70 @@
+/* Sum_Floating_Point_Expression class implementation: inline
+   functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sum_Floating_Point_Expression_inlines_hh
+#define PPL_Sum_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Sum_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+  : first_operand(x), second_operand(y) {
+  assert(x != 0);
+  assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Sum_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_inlines_hh)
diff --git a/src/Sum_Floating_Point_Expression_templates.hh b/src/Sum_Floating_Point_Expression_templates.hh
new file mode 100644
index 0000000..e1d4a62
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_templates.hh
@@ -0,0 +1,53 @@
+/* Sum_Floating_Point_Expression class implementation:
+   non-inline template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Sum_Floating_Point_Expression_templates_hh
+#define PPL_Sum_Floating_Point_Expression_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!first_operand->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                                linearized_second_operand))
+    return false;
+  result += linearized_second_operand;
+  relative_error(linearized_second_operand, rel_error);
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_templates_hh)
diff --git a/src/Sum_Floating_Point_Expression_types.hh b/src/Sum_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..4597db7
--- /dev/null
+++ b/src/Sum_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Sum_Floating_Point_Expression_types_hh
+#define PPL_Sum_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Sum_Floating_Point_Expression_types_hh)
diff --git a/src/Swapping_Vector_defs.hh b/src/Swapping_Vector_defs.hh
new file mode 100644
index 0000000..870ac65
--- /dev/null
+++ b/src/Swapping_Vector_defs.hh
@@ -0,0 +1,98 @@
+/* Swapping_Vector class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Swapping_Vector_defs_hh
+#define PPL_Swapping_Vector_defs_hh 1
+
+#include "Swapping_Vector_types.hh"
+#include "globals_defs.hh"
+
+#include <vector>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A wrapper for std::vector that calls a swap() method instead of copying
+//! elements, when possible.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Swapping_Vector {
+
+public:
+  typedef typename std::vector<T>::const_iterator const_iterator;
+  typedef typename std::vector<T>::iterator iterator;
+  typedef typename std::vector<T>::size_type size_type;
+
+  Swapping_Vector();
+  explicit Swapping_Vector(dimension_type new_size);
+  Swapping_Vector(dimension_type new_size, const T& x);
+
+  void clear();
+  void reserve(dimension_type new_capacity);
+  void resize(dimension_type new_size);
+  void resize(dimension_type new_size, const T& x);
+
+  dimension_type size() const;
+  dimension_type capacity() const;
+  bool empty() const;
+
+  void m_swap(Swapping_Vector& v);
+
+  T& operator[](dimension_type i);
+  const T& operator[](dimension_type i) const;
+
+  T& back();
+  const T& back() const;
+
+  void push_back(const T& x);
+  void pop_back();
+
+  iterator begin();
+  iterator end();
+  const_iterator begin() const;
+  const_iterator end() const;
+
+  iterator erase(iterator itr);
+  iterator erase(iterator first, iterator last);
+
+  // This is defined only if T has an external_memory_in_bytes() method.
+  memory_size_type external_memory_in_bytes() const;
+
+  dimension_type max_num_rows();
+
+private:
+  std::vector<T> impl;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Swapping_Vector */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Swapping_Vector<T>& x, Swapping_Vector<T>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Swapping_Vector_inlines.hh"
+
+#endif // !defined(PPL_Swapping_Vector_defs_hh)
diff --git a/src/Swapping_Vector_inlines.hh b/src/Swapping_Vector_inlines.hh
new file mode 100644
index 0000000..8754102
--- /dev/null
+++ b/src/Swapping_Vector_inlines.hh
@@ -0,0 +1,234 @@
+/* Swapping_Vector class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Swapping_Vector_inlines_hh
+#define PPL_Swapping_Vector_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector()
+  : impl() {
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type i)
+  : impl() {
+  // NOTE: This is not the same as constructing impl as `impl(i)', because
+  // this implementation calls compute_capacity().
+  resize(i);
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type new_size, const T& x)
+  : impl() {
+  resize(new_size, x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::clear() {
+  impl.clear();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::reserve(dimension_type new_capacity) {
+  if (impl.capacity() < new_capacity) {
+    // Reallocation will take place.
+    std::vector<T> new_impl;
+
+    new_impl.reserve(compute_capacity(new_capacity, max_num_rows()));
+    new_impl.resize(impl.size());
+
+    using std::swap;
+
+    // Steal the old elements.
+    for (dimension_type i = impl.size(); i-- > 0; )
+      swap(new_impl[i], impl[i]);
+
+    // Put the new vector into place.
+    swap(impl, new_impl);
+  }
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size) {
+  reserve(new_size);
+  impl.resize(new_size);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size, const T& x) {
+  reserve(new_size);
+  impl.resize(new_size, x);
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::size() const {
+  return impl.size();
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::capacity() const {
+  return impl.capacity();
+}
+
+template <typename T>
+inline bool
+Swapping_Vector<T>::empty() const {
+  return impl.empty();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::m_swap(Swapping_Vector& v) {
+  using std::swap;
+  swap(impl, v.impl);
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::operator[](dimension_type i) {
+  return impl[i];
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::operator[](dimension_type i) const {
+  return impl[i];
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::back() {
+  return impl.back();
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::back() const {
+  return impl.back();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::push_back(const T& x) {
+  reserve(size() + 1);
+  impl.push_back(x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::pop_back() {
+  impl.pop_back();
+}
+
+template <typename T>
+inline memory_size_type
+Swapping_Vector<T>::external_memory_in_bytes() const {
+  // Estimate the size of vector.
+  memory_size_type n = impl.capacity() * sizeof(T);
+  for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+    n += i->external_memory_in_bytes();
+  return n;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::begin() {
+  return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::end() {
+  return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::begin() const {
+  return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::end() const {
+  return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator itr) {
+  PPL_ASSERT(itr >= begin());
+  PPL_ASSERT(itr < end());
+  const dimension_type old_i = itr - begin();
+  dimension_type i = old_i;
+  ++i;
+  while (i != size())
+    swap(impl[i-1], impl[i]);
+  impl.pop_back();
+  return begin() + old_i;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator first, iterator last) {
+  PPL_ASSERT(begin() <= first);
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= end());
+  const iterator old_first = first;
+  typedef typename std::iterator_traits<iterator>::difference_type diff_t;
+  const diff_t k = last - first;
+  const dimension_type n = static_cast<dimension_type>(end() - last);
+  using std::swap;
+  for (dimension_type i = 0; i < n; ++i, ++first)
+    swap(*first, *(first + k));
+  impl.erase(end() - k, end());
+  return old_first;
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::max_num_rows() {
+  return impl.max_size();
+}
+
+template <typename T>
+inline void
+swap(Swapping_Vector<T>& vec1, Swapping_Vector<T>& vec2) {
+  vec1.m_swap(vec2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#endif // !defined(PPL_Swapping_Vector_inlines_hh)
diff --git a/src/Swapping_Vector_types.hh b/src/Swapping_Vector_types.hh
new file mode 100644
index 0000000..98a587e
--- /dev/null
+++ b/src/Swapping_Vector_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Swapping_Vector_types_hh
+#define PPL_Swapping_Vector_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Swapping_Vector;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Swapping_Vector_types_hh)
diff --git a/src/Temp_defs.hh b/src/Temp_defs.hh
new file mode 100644
index 0000000..fbffd7f
--- /dev/null
+++ b/src/Temp_defs.hh
@@ -0,0 +1,143 @@
+/* Temp_* classes declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Temp_defs_hh
+#define PPL_Temp_defs_hh 1
+
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A pool of temporary items of type \p T.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Item {
+public:
+  //! Obtains a reference to a temporary item.
+  static Temp_Item& obtain();
+
+  //! Releases the temporary item \p p.
+  static void release(Temp_Item& p);
+
+  //! Returns a reference to the encapsulated item.
+  T& item();
+
+private:
+  //! The encapsulated item.
+  T item_;
+
+  //! Pointer to the next item in the free list.
+  Temp_Item* next;
+
+  //! Head of the free list.
+  static Temp_Item* free_list_head;
+
+  //! Default constructor.
+  Temp_Item();
+
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Item(const Temp_Item&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Item& operator=(const Temp_Item&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An holder for a reference to a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Reference_Holder {
+public:
+  //! Constructs an holder holding a dirty temp.
+  Temp_Reference_Holder();
+
+  //! Destructor.
+  ~Temp_Reference_Holder();
+
+  //! Returns a reference to the held item.
+  T& item();
+
+private:
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Reference_Holder(const Temp_Reference_Holder&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Reference_Holder& operator=(const Temp_Reference_Holder&);
+
+  //! The held item, encapsulated.
+  Temp_Item<T>& held;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An (fake) holder for the value of a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Value_Holder {
+public:
+  //! Constructs a fake holder.
+  Temp_Value_Holder();
+
+  //! Returns the value of the held item.
+  T& item();
+
+private:
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Value_Holder(const Temp_Value_Holder&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Value_Holder& operator=(const Temp_Value_Holder&);
+
+  //! The held item.
+  T item_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for the efficient handling of temporaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+class Dirty_Temp;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with a free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<Slow_Copy<T>::value>::type>
+  : public Temp_Reference_Holder<T> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<!Slow_Copy<T>::value>::type>
+  : public Temp_Value_Holder<T> {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Temp_inlines.hh"
+#include "Temp_templates.hh"
+
+#endif // !defined(PPL_Temp_defs_hh)
diff --git a/src/Temp_inlines.hh b/src/Temp_inlines.hh
new file mode 100644
index 0000000..036d8ea
--- /dev/null
+++ b/src/Temp_inlines.hh
@@ -0,0 +1,97 @@
+/* Temp_* classes implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Temp_inlines_hh
+#define PPL_Temp_inlines_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Temp_Item<T>::Temp_Item()
+  : item_() {
+}
+
+template <typename T>
+inline T&
+Temp_Item<T>::item() {
+    return item_;
+}
+
+template <typename T>
+inline Temp_Item<T>&
+Temp_Item<T>::obtain() {
+  if (free_list_head != 0) {
+    Temp_Item* const p = free_list_head;
+    free_list_head = free_list_head->next;
+    return *p;
+  }
+  else
+    return *new Temp_Item();
+}
+
+template <typename T>
+inline void
+Temp_Item<T>::release(Temp_Item& p) {
+  p.next = free_list_head;
+  free_list_head = &p;
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::Temp_Reference_Holder()
+  : held(Temp_Item<T>::obtain()) {
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::~Temp_Reference_Holder() {
+  Temp_Item<T>::release(held);
+}
+
+template <typename T>
+inline T&
+Temp_Reference_Holder<T>::item() {
+  return held.item();
+}
+
+template <typename T>
+inline
+Temp_Value_Holder<T>::Temp_Value_Holder() {
+}
+
+template <typename T>
+inline T&
+Temp_Value_Holder<T>::item() {
+  return item_;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#define PPL_DIRTY_TEMP(T, id)                                           \
+  Parma_Polyhedra_Library::Dirty_Temp<PPL_U(T)> holder_ ## id;          \
+  PPL_U(T)& PPL_U(id) = holder_ ## id.item()
+
+#endif // !defined(PPL_Temp_inlines_hh)
diff --git a/src/Temp_templates.hh b/src/Temp_templates.hh
new file mode 100644
index 0000000..fe31aa0
--- /dev/null
+++ b/src/Temp_templates.hh
@@ -0,0 +1,34 @@
+/* Temp_* classes implementation: non-inline template members.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Temp_templates_hh
+#define PPL_Temp_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Temp_Item<T>* Temp_Item<T>::free_list_head = 0;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Temp_templates_hh)
diff --git a/src/Threshold_Watcher.cc b/src/Threshold_Watcher.cc
new file mode 100644
index 0000000..4444a63
--- /dev/null
+++ b/src/Threshold_Watcher.cc
@@ -0,0 +1,27 @@
+/* Threshold_Watcher and associated classes' implementation
+   (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Threshold_Watcher_defs.hh"
+
diff --git a/src/Threshold_Watcher_defs.hh b/src/Threshold_Watcher_defs.hh
new file mode 100644
index 0000000..172c208
--- /dev/null
+++ b/src/Threshold_Watcher_defs.hh
@@ -0,0 +1,96 @@
+/* Threshold_Watcher and associated classes' declaration and inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Threshold_Watcher_defs_hh
+#define PPL_Threshold_Watcher_defs_hh 1
+
+#include "Threshold_Watcher_types.hh"
+#include "Handler_types.hh"
+#include "Pending_List_defs.hh"
+#include <cassert>
+
+/*! \brief
+  A class of watchdogs controlling the exceeding of a threshold.
+
+  \tparam Traits
+  A class to set data types and functions for the threshold handling.
+  See \c Parma_Polyhedra_Library::Weightwatch_Traits for an example.
+*/
+template <typename Traits>
+class Parma_Polyhedra_Library::Threshold_Watcher {
+public:
+  template <typename Flag_Base, typename Flag>
+  Threshold_Watcher(const typename Traits::Delta& delta,
+                    const Flag_Base* volatile& holder,
+                    Flag& flag);
+
+  Threshold_Watcher(const typename Traits::Delta& delta,
+                    void (*function)());
+
+  ~Threshold_Watcher();
+
+private:
+  typedef Implementation::Watchdog::Pending_List<Traits> TW_Pending_List;
+  typedef Implementation::Watchdog::Handler TW_Handler;
+
+  bool expired;
+  const TW_Handler& handler;
+  typename TW_Pending_List::iterator pending_position;
+
+  // Just to prevent their use.
+  Threshold_Watcher(const Threshold_Watcher&);
+  Threshold_Watcher& operator=(const Threshold_Watcher&);
+
+  struct Initialize {
+    //! The ordered queue of pending thresholds.
+    TW_Pending_List pending;
+  };
+  static Initialize init;
+
+  // Handle the addition of a new threshold.
+  static typename TW_Pending_List::iterator
+  add_threshold(typename Traits::Threshold threshold,
+                const TW_Handler& handler,
+                bool& expired_flag);
+
+  // Handle the removal of a threshold.
+  static typename TW_Pending_List::iterator
+  remove_threshold(typename TW_Pending_List::iterator position);
+
+  //! Check threshold reaching.
+  static void check();
+
+}; // class Parma_Polyhedra_Library::Threshold_Watcher
+
+
+// Templatic initialization of static data member.
+template <typename Traits>
+typename
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::Initialize
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::init;
+
+#include "Threshold_Watcher_inlines.hh"
+#include "Threshold_Watcher_templates.hh"
+
+#endif // !defined(PPL_Threshold_Watcher_defs_hh)
+
diff --git a/src/Threshold_Watcher_inlines.hh b/src/Threshold_Watcher_inlines.hh
new file mode 100644
index 0000000..5e7c1de
--- /dev/null
+++ b/src/Threshold_Watcher_inlines.hh
@@ -0,0 +1,66 @@
+/* Threshold_Watcher and associated classes' implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Threshold_Watcher_inlines_hh
+#define PPL_Threshold_Watcher_inlines_hh 1
+
+#include <stdexcept>
+
+#include "Handler_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+template <typename Flag_Base, typename Flag>
+Threshold_Watcher<Traits>
+::Threshold_Watcher(const typename Traits::Delta& delta,
+                    const Flag_Base* volatile& holder,
+                    Flag& flag)
+  : expired(false),
+    handler(*new
+            Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+                                                                    flag)) {
+  typename Traits::Threshold threshold;
+  Traits::from_delta(threshold, delta);
+  if (!Traits::less_than(Traits::get(), threshold))
+    throw std::invalid_argument("Threshold_Watcher constructor called with a"
+                                " threshold already reached");
+  pending_position = add_threshold(threshold, handler, expired);
+}
+
+template <typename Traits>
+inline
+Threshold_Watcher<Traits>::Threshold_Watcher(const typename Traits::Delta& delta, void (*function)())
+  : expired(false),
+    handler(*new Implementation::Watchdog::Handler_Function(function)) {
+  typename Traits::Threshold threshold;
+  Traits::from_delta(threshold, delta);
+  if (!Traits::less_than(Traits::get(), threshold))
+    throw std::invalid_argument("Threshold_Watcher constructor called with a"
+                                " threshold already reached");
+  pending_position = add_threshold(threshold, handler, expired);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Threshold_Watcher_inlines_hh)
diff --git a/src/Threshold_Watcher_templates.hh b/src/Threshold_Watcher_templates.hh
new file mode 100644
index 0000000..1f3d5e3
--- /dev/null
+++ b/src/Threshold_Watcher_templates.hh
@@ -0,0 +1,72 @@
+/* Threshold_Watcher and associated classes'.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Threshold_Watcher_templates_hh
+#define PPL_Threshold_Watcher_templates_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>::add_threshold(typename Traits::Threshold threshold,
+                                         const TW_Handler& handler,
+                                         bool& expired_flag) {
+  Traits::check_function = Threshold_Watcher::check;
+  return init.pending.insert(threshold, handler, expired_flag);
+}
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>
+::remove_threshold(typename TW_Pending_List::iterator position) {
+  typename TW_Pending_List::iterator i = init.pending.erase(position);
+  if (init.pending.empty())
+    Traits::check_function = 0;
+  return i;
+}
+
+template <typename Traits>
+Threshold_Watcher<Traits>::~Threshold_Watcher() {
+  if (!expired)
+    remove_threshold(pending_position);
+  delete &handler;
+}
+
+template <typename Traits>
+void
+Threshold_Watcher<Traits>::check() {
+  typename TW_Pending_List::iterator i = init.pending.begin();
+  assert(i != init.pending.end());
+  const typename Traits::Threshold& current = Traits::get();
+  while (!Traits::less_than(current, i->deadline())) {
+    i->handler().act();
+    i->expired_flag() = true;
+    i = remove_threshold(i);
+    if (i == init.pending.end())
+      break;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Threshold_Watcher_templates_hh)
diff --git a/src/Threshold_Watcher_types.hh b/src/Threshold_Watcher_types.hh
new file mode 100644
index 0000000..48dbb03
--- /dev/null
+++ b/src/Threshold_Watcher_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Threshold_Watcher_types_hh
+#define PPL_Threshold_Watcher_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+class Threshold_Watcher;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Threshold_Watcher_types_hh)
diff --git a/src/Time.cc b/src/Time.cc
new file mode 100644
index 0000000..1bcf4c3
--- /dev/null
+++ b/src/Time.cc
@@ -0,0 +1,32 @@
+/* Time class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Time_defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Implementation::Watchdog::Time::OK() const {
+  return microsecs < USECS_PER_SEC;
+}
diff --git a/src/Time_defs.hh b/src/Time_defs.hh
new file mode 100644
index 0000000..9aced25
--- /dev/null
+++ b/src/Time_defs.hh
@@ -0,0 +1,126 @@
+/* Time class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Time_defs_hh
+#define PPL_Time_defs_hh 1
+
+#include "Time_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+bool operator==(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+bool operator!=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is shorter than \p y.
+bool operator<(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is shorter than
+  or equal to \p y.
+*/
+bool operator<=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is longer than \p y.
+bool operator>(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is longer than
+  or equal to \p y.
+*/
+bool operator>=(const Time& x, const Time& y);
+
+//! Returns the sum of \p x and \p y.
+Time operator+(const Time& x, const Time& y);
+
+/*! \brief
+  Returns the difference of \p x and \p y or the null interval,
+  if \p x is shorter than \p y.
+*/
+Time operator-(const Time& x, const Time& y);
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Time {
+public:
+  //! Zero seconds.
+  Time();
+
+  //! Constructor taking a number of centiseconds.
+  explicit Time(long centisecs);
+
+  //! Constructor with seconds and microseconds.
+  Time(long s, long m);
+
+  /*! \brief
+    Returns the number of whole seconds contained in the represented
+    time interval.
+  */
+  long seconds() const;
+
+  /*! \brief
+    Returns the number of microseconds that, when added to the number
+    of seconds returned by seconds(), give the represent time interval.
+  */
+  long microseconds() const;
+
+  //! Adds \p y to \p *this.
+  Time& operator+=(const Time& y);
+
+  /*! \brief
+    Subtracts \p y from \p *this; if \p *this is shorter than \p y,
+    \p *this is set to the null interval.
+  */
+  Time& operator-=(const Time& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! Number of microseconds in a second.
+  static const long USECS_PER_SEC = 1000000L;
+
+  //! Number of centiseconds in a second.
+  static const long CSECS_PER_SEC = 100L;
+
+  //! Number of seconds.
+  long secs;
+
+  //! Number of microseconds.
+  long microsecs;
+};
+
+#include "Time_inlines.hh"
+
+#endif // !defined(PPL_Time_defs_hh)
diff --git a/src/Time_inlines.hh b/src/Time_inlines.hh
new file mode 100644
index 0000000..2485f7c
--- /dev/null
+++ b/src/Time_inlines.hh
@@ -0,0 +1,155 @@
+/* Time class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Time_inlines_hh
+#define PPL_Time_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Time::Time()
+  : secs(0), microsecs(0) {
+  assert(OK());
+}
+
+inline
+Time::Time(long centisecs)
+  : secs(centisecs / CSECS_PER_SEC),
+    microsecs((centisecs % CSECS_PER_SEC) * (USECS_PER_SEC/CSECS_PER_SEC)) {
+  assert(OK());
+}
+
+inline
+Time::Time(long s, long m)
+  : secs(s),
+    microsecs(m) {
+  if (microsecs >= USECS_PER_SEC) {
+    secs += microsecs / USECS_PER_SEC;
+    microsecs %= USECS_PER_SEC;
+  }
+  assert(OK());
+}
+
+inline long
+Time::seconds() const {
+  return secs;
+}
+
+inline long
+Time::microseconds() const {
+  return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+  long r_secs = secs + y.secs;
+  long r_microsecs = microsecs + y.microsecs;
+  if (r_microsecs >= USECS_PER_SEC) {
+    ++r_secs;
+    r_microsecs %= USECS_PER_SEC;
+  }
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time&
+Time::operator-=(const Time& y) {
+  long r_secs = secs - y.secs;
+  long r_microsecs = microsecs - y.microsecs;
+  if (r_microsecs < 0) {
+    --r_secs;
+    r_microsecs += USECS_PER_SEC;
+  }
+  if (r_secs < 0) {
+    r_secs = 0;
+    r_microsecs = 0;
+  }
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time
+operator+(const Time& x, const Time& y) {
+  Time z = x;
+  z += y;
+  return z;
+}
+
+inline Time
+operator-(const Time& x, const Time& y) {
+  Time z = x;
+  z -= y;
+  return z;
+}
+
+inline bool
+operator==(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() == y.seconds() && y.microseconds() == y.microseconds();
+}
+
+inline bool
+operator!=(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return !(x == y);
+}
+
+inline bool
+operator<(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() < y.seconds()
+    || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds());
+}
+
+inline bool
+operator<=(const Time& x, const Time& y) {
+  return x < y || x == y;
+}
+
+inline bool
+operator>(const Time& x, const Time& y) {
+  return y < x;
+}
+
+inline bool
+operator>=(const Time& x, const Time& y) {
+  return y <= x;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Time_inlines_hh)
diff --git a/src/Time_types.hh b/src/Time_types.hh
new file mode 100644
index 0000000..1551ebc
--- /dev/null
+++ b/src/Time_types.hh
@@ -0,0 +1,30 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Time_types_hh
+#define PPL_Time_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Time;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Time_types_hh)
diff --git a/src/Topology_types.hh b/src/Topology_types.hh
new file mode 100644
index 0000000..7a60cc1
--- /dev/null
+++ b/src/Topology_types.hh
@@ -0,0 +1,29 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Topology_types_hh
+#define PPL_Topology_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum Topology {
+  NECESSARILY_CLOSED = 0,
+  NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Topology_types_hh)
diff --git a/src/Variable.cc b/src/Variable.cc
new file mode 100644
index 0000000..44bf1bb
--- /dev/null
+++ b/src/Variable.cc
@@ -0,0 +1,53 @@
+/* Variable class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Variable_defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Variable::output_function_type*
+PPL::Variable::current_output_function = 0;
+
+bool
+PPL::Variable::OK() const {
+  return id() < max_space_dimension();
+}
+
+void
+PPL::Variable::default_output_function(std::ostream& s, const Variable v) {
+  const dimension_type varid = v.id();
+  static const char var_name_letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+  const dimension_type num_letters = sizeof(var_name_letters) - 1;
+  s << var_name_letters[varid % num_letters];
+  if (const dimension_type i = varid / num_letters)
+    s << i;
+}
+
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Variable v) {
+  (*Variable::current_output_function)(s, v);
+  return s;
+}
diff --git a/src/Variable_Floating_Point_Expression_defs.hh b/src/Variable_Floating_Point_Expression_defs.hh
new file mode 100644
index 0000000..81dde48
--- /dev/null
+++ b/src/Variable_Floating_Point_Expression_defs.hh
@@ -0,0 +1,187 @@
+/* Declarations for the Variable_Floating_Point_Expression class and
+   its constituents.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_Floating_Point_Expression_defs_hh
+#define PPL_Variable_Floating_Point_Expression_defs_hh 1
+
+#include "Floating_Point_Expression_defs.hh"
+#include "globals_defs.hh"
+#include "Variable_Floating_Point_Expression_types.hh"
+#include <map>
+#include <utility>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Variable_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Variable Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of floating-point variable expressions
+
+  Given a variable expression \f$v\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval
+  linear form \f$\linexprenv{v}{\rho^{\#}}{\rho^{\#}_l}\f$ as
+  \f$\rho^{\#}_l(v)\f$ if it is defined; otherwise we construct it as
+  \f$[-1, 1]v\f$.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression
+: public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with a parameter: builds the variable floating point
+    expression corresponding to the variable having \p v_index as its index.
+  */
+  explicit Variable_Floating_Point_Expression(const dimension_type v_index);
+
+  //! Destructor.
+  ~Variable_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given abstract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that the variable in the expression MUST have an associated value
+    in \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result is
+    computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  /*! \brief
+    Assigns a linear form to the variable with the same index of
+    \p *this in a given linear form abstract store.
+
+    \param lf The linear form assigned to the variable.
+    \param lf_store The linear form abstract store.
+
+    Note that once \p lf is assigned to a variable, all the other entries
+    of \p lf_store which contain that variable are discarded.
+  */
+  void linear_form_assign(const FP_Linear_Form& lf,
+                                FP_Linear_Form_Abstract_Store& lf_store) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Variable_Floating_Point_Expression& y);
+
+private:
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Variable_Floating_Point_Expression(
+                          const Variable_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Variable_Floating_Point_Expression& operator=(
+                          const Variable_Floating_Point_Expression& y);
+
+  //! The index of the variable.
+  dimension_type variable_index;
+
+}; // class Variable_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Variable_Floating_Point_Expression_inlines.hh"
+
+#endif // !defined(PPL_Variable_Floating_Point_Expression_defs_hh)
diff --git a/src/Variable_Floating_Point_Expression_inlines.hh b/src/Variable_Floating_Point_Expression_inlines.hh
new file mode 100644
index 0000000..397ef57
--- /dev/null
+++ b/src/Variable_Floating_Point_Expression_inlines.hh
@@ -0,0 +1,94 @@
+/* Variable_Floating_Point_Expression class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_Floating_Point_Expression_inlines_hh
+#define PPL_Variable_Floating_Point_Expression_inlines_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Variable_Floating_Point_Expression(const dimension_type v_index)
+  : variable_index(v_index) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Variable_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Variable_Floating_Point_Expression& y) {
+  using std::swap;
+  swap(variable_index, y.variable_index);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  typename FP_Linear_Form_Abstract_Store::const_iterator
+           variable_value = lf_store.find(variable_index);
+
+  if (variable_value == lf_store.end()) {
+    result = FP_Linear_Form(Variable(variable_index));
+    return true;
+  }
+
+  result = FP_Linear_Form(variable_value->second);
+  return !this->overflows(result);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linear_form_assign(const FP_Linear_Form& lf,
+                           FP_Linear_Form_Abstract_Store& lf_store) const {
+  for (typename FP_Linear_Form_Abstract_Store::iterator
+         i = lf_store.begin(); i != lf_store.end(); ) {
+    if ((i->second).coefficient(Variable(variable_index)) != 0)
+      i = lf_store.erase(i);
+    else
+      ++i;
+  }
+  lf_store[variable_index] = lf;
+  return;
+}
+
+/*! \relates Variable_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_Floating_Point_Expression_inlines_hh)
diff --git a/src/Variable_Floating_Point_Expression_types.hh b/src/Variable_Floating_Point_Expression_types.hh
new file mode 100644
index 0000000..3c9999e
--- /dev/null
+++ b/src/Variable_Floating_Point_Expression_types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variable_Floating_Point_Expression_types_hh
+#define PPL_Variable_Floating_Point_Expression_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_Floating_Point_Expression_types_hh)
diff --git a/src/Variable_defs.hh b/src/Variable_defs.hh
new file mode 100644
index 0000000..a384dcc
--- /dev/null
+++ b/src/Variable_defs.hh
@@ -0,0 +1,157 @@
+/* Variable class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_defs_hh
+#define PPL_Variable_defs_hh 1
+
+#include "Variable_types.hh"
+#include "Init_types.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+/*! \relates Variable */
+void
+swap(Variable& x, Variable& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+  The space dimension of a variable is the dimension of the vector space
+  made by all the Cartesian axes having an index less than or equal to
+  that of the considered variable; thus, if a variable has index \f$i\f$,
+  its space dimension is \f$i+1\f$.
+
+  Note that the ``meaning'' of an object of the class Variable
+  is completely specified by the integer index provided to its
+  constructor:
+  be careful not to be mislead by C++ language variable names.
+  For instance, in the following example the linear expressions
+  <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+  since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+  the same Cartesian axis.
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(0);
+  Linear_Expression e1 = x + y;
+  Linear_Expression e2 = y + z;
+  \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+  //! Builds the variable corresponding to the Cartesian axis of index \p i.
+  /*!
+    \exception std::length_error
+    Thrown if <CODE>i+1</CODE> exceeds
+    <CODE>Variable::max_space_dimension()</CODE>.
+  */
+  explicit Variable(dimension_type i);
+
+  //! Returns the index of the Cartesian axis associated to the variable.
+  dimension_type id() const;
+
+  //! Returns the maximum space dimension a Variable can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  /*!
+    The returned value is <CODE>id()+1</CODE>.
+  */
+  dimension_type space_dimension() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Type of output functions.
+  typedef void output_function_type(std::ostream& s, const Variable v);
+
+  //! The default output function.
+  static void default_output_function(std::ostream& s, const Variable v);
+
+  //! Sets the output function to be used for printing Variable objects.
+  static void set_output_function(output_function_type* p);
+
+  //! Returns the pointer to the current output function.
+  static output_function_type* get_output_function();
+
+  //! Binary predicate defining the total ordering on variables.
+  /*! \ingroup PPL_CXX_interface */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(Variable x, Variable y) const;
+  };
+
+  //! Swaps *this and v.
+  void m_swap(Variable& v);
+
+private:
+  //! The index of the Cartesian axis.
+  dimension_type varid;
+
+  // The initialization class needs to set the default output function.
+  friend class Init;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+                                                    const Variable v);
+
+  //! Pointer to the current output function.
+  static output_function_type* current_output_function;
+
+};
+
+#include "Variable_inlines.hh"
+
+#endif // !defined(PPL_Variable_defs_hh)
diff --git a/src/Variable_inlines.hh b/src/Variable_inlines.hh
new file mode 100644
index 0000000..03d8908
--- /dev/null
+++ b/src/Variable_inlines.hh
@@ -0,0 +1,100 @@
+/* Variable class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variable_inlines_hh
+#define PPL_Variable_inlines_hh 1
+
+#include "globals_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+  return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+  : varid((i < max_space_dimension())
+          ? i
+          : (throw std::length_error("PPL::Variable::Variable(i):\n"
+                                     "i exceeds the maximum allowed "
+                                     "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+  return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+  return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+  return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+  current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+  return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+  return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+  return less(x, y);
+}
+
+inline void
+Variable::m_swap(Variable& v) {
+  using std::swap;
+  swap(varid, v.varid);
+}
+
+inline void
+swap(Variable& x, Variable& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_inlines_hh)
diff --git a/src/Variable_types.hh b/src/Variable_types.hh
new file mode 100644
index 0000000..df20b90
--- /dev/null
+++ b/src/Variable_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variable_types_hh
+#define PPL_Variable_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_types_hh)
diff --git a/src/Variables_Set.cc b/src/Variables_Set.cc
new file mode 100644
index 0000000..bea50bd
--- /dev/null
+++ b/src/Variables_Set.cc
@@ -0,0 +1,92 @@
+/* Variables_Set class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Variables_Set_defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Variables_Set::Variables_Set(const Variable v, const Variable w)
+  : Base() {
+  for (dimension_type d = v.id(), last = w.id(); d <= last; ++d)
+    insert(d);
+}
+
+bool
+PPL::Variables_Set::OK() const {
+  for (const_iterator i = begin(), set_end = end(); i != set_end; ++i)
+    if (!Variable(*i).OK())
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Variables_Set& vs) {
+  s << '{';
+  for (Variables_Set::const_iterator i = vs.begin(),
+         vs_end = vs.end(); i != vs_end; ) {
+    s << ' ' << Variable(*i);
+    ++i;
+    if (i != vs_end)
+      s << ',';
+  }
+  s << " }";
+  return s;
+}
+
+void
+PPL::Variables_Set::ascii_dump(std::ostream& s) const {
+  const dimension_type variables_set_size = size();
+  s << "\nvariables( " << variables_set_size << " )\n";
+  for (Variables_Set::const_iterator i = begin(),
+         i_end = end(); i != i_end; ++i)
+    s << *i << " ";
+}
+
+PPL_OUTPUT_DEFINITIONS(Variables_Set)
+
+bool
+PPL::Variables_Set::ascii_load(std::istream& s) {
+  clear();
+  std::string str;
+  if (!(s >> str) || str != "variables(")
+    return false;
+
+  dimension_type size;
+
+  if (!(s >> size))
+    return false;
+
+  if (!(s >> str) || str != ")")
+    return false;
+
+  for (dimension_type i = 0; i < size; ++i) {
+    dimension_type variable_value;
+    if (!(s >> variable_value))
+      return false;
+    insert(variable_value);
+  }
+  return true;
+}
diff --git a/src/Variables_Set_defs.hh b/src/Variables_Set_defs.hh
new file mode 100644
index 0000000..a4af8c9
--- /dev/null
+++ b/src/Variables_Set_defs.hh
@@ -0,0 +1,107 @@
+/* Variables_Set class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variables_Set_defs_hh
+#define PPL_Variables_Set_defs_hh 1
+
+#include "Variables_Set_types.hh"
+#include "Variable_defs.hh"
+#include "globals_types.hh"
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+operator<<(std::ostream& s, const Variables_Set& vs);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! An std::set of variables' indexes.
+class Parma_Polyhedra_Library::Variables_Set
+  : public std::set<dimension_type> {
+private:
+  typedef std::set<dimension_type> Base;
+
+public:
+  //! Builds the empty set of variable indexes.
+  Variables_Set();
+
+  //! Builds the singleton set of indexes containing <CODE>v.id()</CODE>;
+  explicit Variables_Set(const Variable v);
+
+  /*! \brief
+    Builds the set of variables's indexes in the range from
+    <CODE>v.id()</CODE> to <CODE>w.id()</CODE>.
+
+    If <CODE>v.id() <= w.id()</CODE>, this constructor builds the
+    set of variables' indexes
+    <CODE>v.id()</CODE>, <CODE>v.id()+1</CODE>, ..., <CODE>w.id()</CODE>.
+    The empty set is built otherwise.
+  */
+  Variables_Set(const Variable v, const Variable w);
+
+  //! Returns the maximum space dimension a Variables_Set can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns the dimension of the smallest vector space enclosing all
+    the variables whose indexes are in the set.
+  */
+  dimension_type space_dimension() const;
+
+  //! Inserts the index of variable \p v into the set.
+  void insert(Variable v);
+
+  // The `insert' method above overloads (instead of hiding) the
+  // other `insert' method of std::set.
+  using Base::insert;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+};
+
+#include "Variables_Set_inlines.hh"
+
+#endif // !defined(PPL_Variables_Set_defs_hh)
diff --git a/src/Variables_Set_inlines.hh b/src/Variables_Set_inlines.hh
new file mode 100644
index 0000000..0f1c467
--- /dev/null
+++ b/src/Variables_Set_inlines.hh
@@ -0,0 +1,75 @@
+/* Variables_Set class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Variables_Set_inlines_hh
+#define PPL_Variables_Set_inlines_hh 1
+
+#include "globals_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Variables_Set::Variables_Set()
+  : Base() {
+}
+
+inline void
+Variables_Set::insert(const Variable v) {
+  insert(v.id());
+}
+
+inline
+Variables_Set::Variables_Set(const Variable v)
+  : Base() {
+  insert(v);
+}
+
+inline dimension_type
+Variables_Set::max_space_dimension() {
+  return Variable::max_space_dimension();
+}
+
+inline dimension_type
+Variables_Set::space_dimension() const {
+  reverse_iterator i = rbegin();
+  return (i == rend()) ? 0 : (*i + 1);
+}
+
+inline memory_size_type
+Variables_Set::external_memory_in_bytes() const {
+  // We assume sets are implemented by means of red-black trees that
+  // require to store the color (we assume an enum) and three pointers
+  // to the parent, left and right child, respectively.
+  enum color { red, black };
+  return size() * (sizeof(color) + 3*sizeof(void*) + sizeof(dimension_type));
+}
+
+inline memory_size_type
+Variables_Set::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variables_Set_inlines_hh)
diff --git a/src/Variables_Set_types.hh b/src/Variables_Set_types.hh
new file mode 100644
index 0000000..5cc6456
--- /dev/null
+++ b/src/Variables_Set_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Variables_Set_types_hh
+#define PPL_Variables_Set_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variables_Set_types_hh)
diff --git a/src/WRD_coefficient_types_defs.hh b/src/WRD_coefficient_types_defs.hh
new file mode 100644
index 0000000..f9cf6e2
--- /dev/null
+++ b/src/WRD_coefficient_types_defs.hh
@@ -0,0 +1,153 @@
+/* Coefficient types of weakly-relational domains: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_WRD_coefficient_types_defs_hh
+#define PPL_WRD_coefficient_types_defs_hh 1
+
+#include "meta_programming.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+  The production policy for checked numbers used in weakly-relational
+  domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct WRD_Extended_Number_Policy {
+  //! Check for overflowed result.
+  const_bool_nodef(check_overflow, true);
+
+  //! Do not check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Do not check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Do not check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Do not check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Do not check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Do not check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Do not checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Handle not-a-number special value.
+  const_bool_nodef(has_nan, true);
+
+  //! Handle infinity special values.
+  const_bool_nodef(has_infinity, true);
+
+  // `convertible' is intentionally not defined: the compile time
+  // error on conversions is the expected behavior.
+
+  //! Honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, true);
+
+  //! Do not make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, false);
+
+  // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+  // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+  // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+  // ROUND_DEFAULT_INPUT is intentionally not defined.
+  // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+  The debugging policy for checked numbers used in weakly-relational
+  domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Debug_WRD_Extended_Number_Policy {
+  //! Check for overflowed result.
+  const_bool_nodef(check_overflow, true);
+
+  //! Check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, true);
+
+  //! Check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, true);
+
+  //! Check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, true);
+
+  //! Check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, true);
+
+  //! Check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, true);
+
+  //! Check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, true);
+
+  //! Checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, true);
+
+  //! Handle not-a-number special value.
+  const_bool_nodef(has_nan, true);
+
+  //! Handle infinity special values.
+  const_bool_nodef(has_infinity, true);
+
+  // `convertible' is intentionally not defined: the compile time
+  // error on conversions is the expected behavior.
+
+  //! Honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, true);
+
+  //! Make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, true);
+
+  // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+  // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+  // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+  // ROUND_DEFAULT_INPUT is intentionally not defined.
+  // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "WRD_coefficient_types_inlines.hh"
+
+#endif // !defined(PPL_WRD_coefficient_types_defs_hh)
diff --git a/src/WRD_coefficient_types_inlines.hh b/src/WRD_coefficient_types_inlines.hh
new file mode 100644
index 0000000..2a8051e
--- /dev/null
+++ b/src/WRD_coefficient_types_inlines.hh
@@ -0,0 +1,43 @@
+/* Coefficient types of weakly-relational domains: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_WRD_coefficient_types_inlines_hh
+#define PPL_WRD_coefficient_types_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+WRD_Extended_Number_Policy::handle_result(Result r) {
+  if (result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+
+inline void
+Debug_WRD_Extended_Number_Policy::handle_result(Result r) {
+  if (result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_WRD_coefficient_types_inlines_hh)
diff --git a/src/Watchdog.cc b/src/Watchdog.cc
new file mode 100644
index 0000000..4f48376
--- /dev/null
+++ b/src/Watchdog.cc
@@ -0,0 +1,250 @@
+/* Watchdog and associated classes' implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "Watchdog_defs.hh"
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+#include <csignal>
+#include <iostream>
+#include <stdexcept>
+#include <cerrno>
+#include <string>
+#include <string.h>
+
+#ifdef PPL_TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <ctime>
+#else
+# ifdef PPL_HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <ctime>
+# endif
+#endif
+
+// Cygwin only supports ITIMER_REAL.
+// Apparently GNU Hurd also only supports ITIMER_REAL
+// (see http://www.cs.unipr.it/pipermail/ppl-devel/2010-March/016072.html).
+// Profiling does not work on programs that use the ITIMER_PROF timer.
+#if defined(__CYGWIN__) || defined(__gnu_hurd__) || defined(PPL_PROFILING)
+#define THE_TIMER  ITIMER_REAL
+#define THE_SIGNAL SIGALRM
+#else
+#define THE_TIMER  ITIMER_PROF
+#define THE_SIGNAL SIGPROF
+#endif
+
+using std::cerr;
+using std::endl;
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// Pass this to getitimer().
+itimerval PPL::Watchdog::current_timer_status;
+
+// Pass this to setitimer().
+itimerval PPL::Watchdog::signal_once;
+
+// Last time value we set the timer to.
+PPL::Implementation::Watchdog::Time PPL::Watchdog::last_time_requested;
+
+// Records the time elapsed since last fresh start.
+PPL::Implementation::Watchdog::Time PPL::Watchdog::time_so_far;
+
+// The ordered queue of pending watchdog events.
+PPL::Watchdog::WD_Pending_List PPL::Watchdog::pending;
+
+// Whether the alarm clock is running.
+volatile bool PPL::Watchdog::alarm_clock_running = false;
+
+// Whether we are changing data which are also changed by the signal handler.
+volatile bool PPL::Watchdog::in_critical_section = false;
+
+namespace {
+
+void
+throw_syscall_error(const char* syscall_name) {
+  throw std::runtime_error(std::string(syscall_name) + ": " + strerror(errno));
+}
+
+void
+my_getitimer(int which, struct itimerval* value) {
+  if (getitimer(which, value) != 0)
+    throw_syscall_error("getitimer");
+}
+
+void
+my_setitimer(int which,
+             const struct itimerval* value, struct itimerval* old_value) {
+  if (setitimer(which, value, old_value) != 0)
+    throw_syscall_error("setitimer");
+}
+
+void
+my_sigaction(int signum,
+             const struct sigaction* act, struct sigaction* old_action) {
+  if (sigaction(signum, act, old_action) != 0)
+    throw_syscall_error("sigaction");
+}
+
+} // namespace
+
+void
+PPL::Watchdog::get_timer(Implementation::Watchdog::Time& time) {
+  using namespace Implementation::Watchdog;
+  my_getitimer(THE_TIMER, &current_timer_status);
+  time = Time(current_timer_status.it_value.tv_sec,
+              current_timer_status.it_value.tv_usec);
+}
+
+void
+PPL::Watchdog::set_timer(const Implementation::Watchdog::Time& time) {
+  if (time.seconds() == 0 && time.microseconds() == 0)
+    throw std::runtime_error("PPL internal error");
+  last_time_requested = time;
+  signal_once.it_value.tv_sec = time.seconds();
+  signal_once.it_value.tv_usec = time.microseconds();
+  my_setitimer(THE_TIMER, &signal_once, 0);
+}
+
+void
+PPL::Watchdog::stop_timer() {
+  signal_once.it_value.tv_sec = 0;
+  signal_once.it_value.tv_usec = 0;
+  my_setitimer(THE_TIMER, &signal_once, 0);
+}
+
+void
+PPL::Watchdog::handle_timeout(int) {
+  if (in_critical_section)
+    reschedule();
+  else {
+    time_so_far += last_time_requested;
+    if (!pending.empty()) {
+      WD_Pending_List::iterator i = pending.begin();
+      do {
+        i->handler().act();
+        i->expired_flag() = true;
+        i = pending.erase(i);
+      } while (i != pending.end() && i->deadline() <= time_so_far);
+      if (pending.empty())
+        alarm_clock_running = false;
+      else
+        set_timer((*pending.begin()).deadline() - time_so_far);
+    }
+    else
+      alarm_clock_running = false;
+  }
+}
+
+void
+PPL::PPL_handle_timeout(int signum) {
+  PPL::Watchdog::handle_timeout(signum);
+}
+
+PPL::Watchdog::WD_Pending_List::iterator
+PPL::Watchdog::new_watchdog_event(long csecs,
+                                  const WD_Handler& handler,
+                                  bool& expired_flag) {
+  using namespace Implementation::Watchdog;
+  assert(csecs > 0);
+  WD_Pending_List::iterator position;
+  const Time deadline(csecs);
+  if (!alarm_clock_running) {
+    position = pending.insert(deadline, handler, expired_flag);
+    time_so_far = Time(0);
+    set_timer(deadline);
+    alarm_clock_running = true;
+  }
+  else {
+    Time time_to_shoot;
+    get_timer(time_to_shoot);
+    Time elapsed_time(last_time_requested);
+    elapsed_time -= time_to_shoot;
+    Time current_time(time_so_far);
+    current_time += elapsed_time;
+    Time real_deadline(deadline);
+    real_deadline += current_time;
+    position = pending.insert(real_deadline, handler, expired_flag);
+    if (deadline < time_to_shoot) {
+      time_so_far = current_time;
+      set_timer(deadline);
+    }
+  }
+  return position;
+}
+
+void
+PPL::Watchdog::remove_watchdog_event(WD_Pending_List::iterator position) {
+  using namespace Implementation::Watchdog;
+  assert(!pending.empty());
+  if (position == pending.begin()) {
+    WD_Pending_List::iterator next = position;
+    ++next;
+    if (next != pending.end()) {
+      const Time first_deadline(position->deadline());
+      Time next_deadline(next->deadline());
+      if (first_deadline != next_deadline) {
+        Time time_to_shoot;
+        get_timer(time_to_shoot);
+        Time elapsed_time(last_time_requested);
+        elapsed_time -= time_to_shoot;
+        time_so_far += elapsed_time;
+        next_deadline -= first_deadline;
+        time_to_shoot += next_deadline;
+        set_timer(time_to_shoot);
+      }
+    }
+    else {
+      stop_timer();
+      alarm_clock_running = false;
+    }
+  }
+  pending.erase(position);
+}
+
+PPL::Implementation::Watchdog::Time PPL::Watchdog::reschedule_time(1);
+
+void
+PPL::Watchdog::initialize() {
+  signal_once.it_interval.tv_sec = 0;
+  signal_once.it_interval.tv_usec = 0;
+
+  sigset_t mask;
+  sigemptyset(&mask);
+
+  struct sigaction s;
+  s.sa_handler = &PPL_handle_timeout;
+  s.sa_mask = mask;
+  s.sa_flags = 0;  // Was SA_ONESHOT: why?
+
+  my_sigaction(THE_SIGNAL, &s, 0);
+}
+
+void
+PPL::Watchdog::finalize() {
+}
+
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
diff --git a/src/Watchdog_defs.hh b/src/Watchdog_defs.hh
new file mode 100644
index 0000000..c39b4dd
--- /dev/null
+++ b/src/Watchdog_defs.hh
@@ -0,0 +1,148 @@
+/* Watchdog and associated classes' declaration and inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Watchdog_defs_hh
+#define PPL_Watchdog_defs_hh 1
+
+#include "Watchdog_types.hh"
+#include "Time_defs.hh"
+#include "Handler_types.hh"
+#include "Pending_List_defs.hh"
+#include <cassert>
+#include <functional>
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PPL_handle_timeout(int signum);
+
+struct Watchdog_Traits {
+  typedef Implementation::Watchdog::Time Threshold;
+  static bool less_than(const Threshold& a, const Threshold& b) {
+    return a < b;
+  }
+};
+
+//! A watchdog timer.
+class Watchdog {
+public:
+  template <typename Flag_Base, typename Flag>
+  Watchdog(long csecs, const Flag_Base* volatile& holder, Flag& flag);
+
+  /*! \brief
+    Constructor: if not reset, the watchdog will trigger after \p csecs
+    centiseconds, invoking handler \p function.
+  */
+  Watchdog(long csecs, void (* const function)());
+
+  //! Destructor.
+  ~Watchdog();
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+  //! Static class initialization.
+  static void initialize();
+  //! Static class finalization.
+  static void finalize();
+
+private:
+  //! Whether or not this watchdog has expired.
+  bool expired;
+
+  typedef Implementation::Watchdog::Pending_List<Watchdog_Traits>
+  WD_Pending_List;
+
+  typedef Implementation::Watchdog::Handler
+  WD_Handler;
+
+  const WD_Handler& handler;
+  WD_Pending_List::iterator pending_position;
+
+  // Private and not implemented: copy construction is not allowed.
+  Watchdog(const Watchdog&);
+  // Private and not implemented: copy assignment is not allowed.
+  Watchdog& operator=(const Watchdog&);
+
+  // Pass this to getitimer().
+  static itimerval current_timer_status;
+
+  //! Reads the timer value into \p time.
+  static void get_timer(Implementation::Watchdog::Time& time);
+
+  // Pass this to setitimer().
+  static itimerval signal_once;
+
+  // Last time value we set the timer to.
+  static Implementation::Watchdog::Time last_time_requested;
+
+  //! Sets the timer value to \p time.
+  static void set_timer(const Implementation::Watchdog::Time& time);
+
+  //! Stops the timer.
+  static void stop_timer();
+
+  //! Quick reschedule to avoid race conditions.
+  static void reschedule();
+
+  // Used by the above.
+  static Implementation::Watchdog::Time reschedule_time;
+
+  // Records the time elapsed since last fresh start.
+  static Implementation::Watchdog::Time time_so_far;
+
+  //! The ordered queue of pending watchdog events.
+  static WD_Pending_List pending;
+
+  //! The actual signal handler.
+  static void handle_timeout(int);
+
+  //! Handles the addition of a new watchdog event.
+  static WD_Pending_List::iterator
+  new_watchdog_event(long csecs,
+                     const WD_Handler& handler,
+                     bool& expired_flag);
+
+  //! Handles the removal of the watchdog event referred by \p position.
+  void remove_watchdog_event(WD_Pending_List::iterator position);
+
+  //! Whether the alarm clock is running.
+  static volatile bool alarm_clock_running;
+
+  //! Whether we are changing data that is also changed by the signal handler.
+  static volatile bool in_critical_section;
+
+  friend void PPL_handle_timeout(int signum);
+
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Watchdog_inlines.hh"
+
+#endif // !defined(PPL_Watchdog_defs_hh)
+
diff --git a/src/Watchdog_inlines.hh b/src/Watchdog_inlines.hh
new file mode 100644
index 0000000..cab18e4
--- /dev/null
+++ b/src/Watchdog_inlines.hh
@@ -0,0 +1,101 @@
+/* Watchdog and associated classes' implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Watchdog_inlines_hh
+#define PPL_Watchdog_inlines_hh 1
+
+#include "Handler_defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long csecs,
+                   const Flag_Base* volatile& holder,
+                   Flag& flag)
+  : expired(false),
+    handler(*new
+            Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+                                                                    flag)) {
+  if (csecs == 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+                                " non-positive number of centiseconds");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(csecs, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(long csecs, void (* const function)())
+  : expired(false),
+    handler(*new Implementation::Watchdog::Handler_Function(function)) {
+  if (csecs == 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+                                " non-positive number of centiseconds");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(csecs, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Watchdog::~Watchdog() {
+  if (!expired) {
+    in_critical_section = true;
+    remove_watchdog_event(pending_position);
+    in_critical_section = false;
+  }
+  delete &handler;
+}
+
+inline void
+Watchdog::reschedule() {
+  set_timer(reschedule_time);
+}
+
+#else // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long /* csecs */,
+                   const Flag_Base* volatile& /* holder */,
+                   Flag& /* flag */) {
+  throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+                         " system does not provide setitimer()");
+}
+
+inline
+Watchdog::Watchdog(long /* csecs */, void (* /* function */)()) {
+  throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+                         " system does not provide setitimer()");
+}
+
+inline
+Watchdog::~Watchdog() {
+}
+
+#endif // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Watchdog_inlines_hh)
diff --git a/src/Watchdog_types.hh b/src/Watchdog_types.hh
new file mode 100644
index 0000000..68d79a3
--- /dev/null
+++ b/src/Watchdog_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Watchdog_types_hh
+#define PPL_Watchdog_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Watchdog;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Watchdog_types_hh)
diff --git a/src/Weight_Profiler.cc b/src/Weight_Profiler.cc
new file mode 100644
index 0000000..153eaad
--- /dev/null
+++ b/src/Weight_Profiler.cc
@@ -0,0 +1,80 @@
+/* Weight_Profiler class implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "globals_defs.hh"
+
+#if PPL_PROFILE_ADD_WEIGHT
+#include <iostream>
+#include <cmath>
+#include "Weight_Profiler_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+void Weight_Profiler::output_stats() {
+  std::cout << file << ":" << line << ": Weight_Profiler ";
+  if (stat[VALID].samples == 0 && stat[DISCARDED].samples == 0)
+    std::cout << "never reached.";
+  else {
+    if (stat[VALID].samples > 0) {
+      double average
+        = stat[VALID].sum / stat[VALID].count;
+      double variance
+        = stat[VALID].squares_sum / stat[VALID].count - average * average;
+      std::cout << " samples(" << stat[VALID].samples << ")"
+                << " count(" << stat[VALID].count << ")"
+                << " min( " << stat[VALID].min << ")"
+                << " max( " << stat[VALID].max << ")"
+                << " average(" << average << ")";
+      std::cout << " variance( " << variance << ")"
+                << " stddev( " << sqrt(variance) << ")";
+    }
+    if (stat[DISCARDED].samples > 0) {
+      std::cout << " min_threshold( " << min_threshold << ")"
+                << " max_threshold( " << max_threshold << ")";
+      double average = stat[DISCARDED].sum / stat[DISCARDED].count;
+      std::cout << " samples(" << stat[DISCARDED].samples << ")"
+                << " count(" << stat[DISCARDED].count << ")"
+                << " min( " << stat[DISCARDED].min << ")"
+                << " max( " << stat[DISCARDED].max << ")"
+                << " average(" << average << ")";
+    }
+  }
+  std::cout << std::endl;
+}
+
+double Weight_Profiler::tune_adjustment() {
+  begin();
+  adjustment = 0;
+  static Weight_Profiler weight_profiler(__FILE__, __LINE__, 0, 0, 0);
+  for (int i = 0; i < 1000; ++i)
+    weight_profiler.end(1);
+  return weight_profiler.stat[VALID].min;
+}
+
+struct timespec Weight_Profiler::stamp;
+double Weight_Profiler::adjustment = Weight_Profiler::tune_adjustment();
+
+} // namespace Parma_Polyhedra_Library
+
+#endif
diff --git a/src/Weight_Profiler_defs.hh b/src/Weight_Profiler_defs.hh
new file mode 100644
index 0000000..68e9cb5
--- /dev/null
+++ b/src/Weight_Profiler_defs.hh
@@ -0,0 +1,154 @@
+/* Weight_Profiler class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef Weight_Profiler_defs_hh
+#define Weight_Profiler_defs_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+class Weight_Profiler {
+private:
+  enum { DISCARDED = 0, VALID = 1 };
+
+public:
+  Weight_Profiler(const char* file, int line,
+                  Weightwatch_Traits::Delta delta,
+                  double min_threshold = 0, double max_threshold = 0)
+    : file(file), line(line), delta(delta),
+      min_threshold(min_threshold), max_threshold(max_threshold) {
+    for (int i = 0; i < 2; ++i) {
+      stat[i].samples = 0;
+      stat[i].count = 0;
+      stat[i].sum = 0;
+      stat[i].squares_sum = 0;
+      stat[i].min = 0;
+      stat[i].max = 0;
+    }
+  }
+
+  ~Weight_Profiler() {
+    output_stats();
+  }
+
+  void output_stats();
+
+  static void begin() {
+#ifndef NDEBUG
+    int r = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+    assert(r >= 0);
+#else
+    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+#endif
+  }
+
+  void end(unsigned int factor = 1) {
+    Weightwatch_Traits::weight
+      += (Weightwatch_Traits::Threshold) delta * factor;
+    struct timespec start = stamp;
+    begin();
+    double elapsed;
+    if (stamp.tv_nsec >= start.tv_nsec) {
+      elapsed = (stamp.tv_nsec - start.tv_nsec)
+        + (stamp.tv_sec - start.tv_sec) * 1e9;
+    }
+    else {
+      elapsed = (1000000000 - start.tv_nsec + stamp.tv_nsec )
+        + (stamp.tv_sec - start.tv_sec - 1) * 1e9;
+    }
+    elapsed -= adjustment;
+    double elapsed1 = elapsed / factor;
+    int i = (elapsed1 < min_threshold
+             || (max_threshold > 0 && elapsed1 > max_threshold))
+      ? DISCARDED
+      : VALID;
+    ++stat[i].samples;
+    if (stat[i].count == 0)
+      stat[i].min = stat[i].max = elapsed1;
+    else if (stat[i].min > elapsed1)
+      stat[i].min = elapsed1;
+    else if (stat[i].max < elapsed1)
+      stat[i].max = elapsed1;
+    stat[i].sum += elapsed;
+    stat[i].squares_sum += elapsed * elapsed1;
+    stat[i].count += factor;
+  }
+
+  static double tune_adjustment();
+
+ private:
+  //! File of this profiling point.
+  const char *file;
+
+  //! Line of this profiling point.
+  int line;
+
+  //! Computational weight to be added at each iteration.
+  Weightwatch_Traits::Delta delta;
+
+  //! Times less than this value are discarded.
+  double min_threshold;
+
+  //! Times greater than this value are discarded.
+  double max_threshold;
+
+  //! Statistical data for samples (both DISCARDED and VALID)
+  struct {
+    //! Number of collected samples.
+    unsigned int samples;
+
+    /*! \brief
+      Number of collected iterations.
+
+      \note
+      Multiple iterations are possibly collected for each sample.
+    */
+    unsigned int count;
+
+    //! Sum of the measured times.
+    double sum;
+
+    //! Sum of the squares of the measured times (to compute variance).
+    double squares_sum;
+
+    //! Minimum measured time.
+    double min;
+
+    //! Maximum measured time.
+    double max;
+  } stat[2];
+
+  //! Holds the time corresponding to last time begin() was called.
+  static struct timespec stamp;
+
+  /*! \brief
+    Time quantity used to adjust the elapsed times so as not to take
+    into account the time spent by the measurement infrastructure.
+  */
+  static double adjustment;
+};
+
+}
+
+#endif // Weight_Profiler_defs_hh
diff --git a/src/Widening_Function_defs.hh b/src/Widening_Function_defs.hh
new file mode 100644
index 0000000..f2611b1
--- /dev/null
+++ b/src/Widening_Function_defs.hh
@@ -0,0 +1,127 @@
+/* Widening_Function class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Widening_Function_defs_hh
+#define PPL_Widening_Function_defs_hh 1
+
+#include "Widening_Function_types.hh"
+#include "Constraint_System_types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+  //! The (parametric) type of a widening method.
+  typedef void (PSET::* Widening_Method)(const PSET&, unsigned*);
+
+  //! Explicit unary constructor.
+  explicit
+  Widening_Function(Widening_Method wm);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+    method stored at construction time.
+  */
+  void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+  //! The widening method.
+  Widening_Method w_method;
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET, typename CSYS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+  //! The (parametric) type of a limited widening method.
+  typedef void (PSET::* Limited_Widening_Method)(const PSET&,
+                                                 const CSYS&,
+                                                 unsigned*);
+
+  //! Constructor.
+  /*!
+    \param lwm
+    The limited widening method.
+
+    \param cs
+    The constraint system limiting the widening.
+  */
+  Limited_Widening_Function(Limited_Widening_Method lwm,
+                            const CSYS& cs);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+    are the limited widening method and the constraint system stored
+    at construction time.
+  */
+  void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+  //! The limited widening method.
+  Limited_Widening_Method lw_method;
+  //! A constant reference to the constraint system limiting the widening.
+  const CSYS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+  \relates Pointset_Powerset
+
+  \param wm
+  The widening method.
+*/
+template <typename PSET>
+Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+  \relates Pointset_Powerset
+
+  \param lwm
+  The limited widening method.
+
+  \param cs
+  The constraint system limiting the widening.
+*/
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+              const CSYS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Widening_Function_inlines.hh"
+
+#endif // !defined(PPL_Widening_Function_defs_hh)
diff --git a/src/Widening_Function_inlines.hh b/src/Widening_Function_inlines.hh
new file mode 100644
index 0000000..8b46af2
--- /dev/null
+++ b/src/Widening_Function_inlines.hh
@@ -0,0 +1,75 @@
+/* Widening_Function class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Widening_Function_inlines_hh
+#define PPL_Widening_Function_inlines_hh 1
+
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+Widening_Function<PSET>::Widening_Function(Widening_Method wm)
+  : w_method(wm) {
+}
+
+template <typename PSET>
+inline void
+Widening_Function<PSET>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+  (x.*w_method)(y, tp);
+}
+
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+                          const CSYS& cs)
+  : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PSET, typename CSYS>
+inline void
+Limited_Widening_Function<PSET, CSYS>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+  (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*)) {
+  return Widening_Function<PSET>(wm);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET, typename CSYS>
+inline Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+              const CSYS& cs) {
+  return Limited_Widening_Function<PSET, CSYS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#endif // !defined(PPL_Widening_Function_inlines_hh)
diff --git a/src/Widening_Function_types.hh b/src/Widening_Function_types.hh
new file mode 100644
index 0000000..54a7cdb
--- /dev/null
+++ b/src/Widening_Function_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Widening_Function_types_hh
+#define PPL_Widening_Function_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Widening_Function;
+
+template <typename PSET, typename CSYS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Widening_Function_types_hh)
diff --git a/src/algorithms.hh b/src/algorithms.hh
new file mode 100644
index 0000000..333240c
--- /dev/null
+++ b/src/algorithms.hh
@@ -0,0 +1,72 @@
+/* A collection of useful convex polyhedra algorithms: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_algorithms_hh
+#define PPL_algorithms_hh 1
+
+#include "NNC_Polyhedron_defs.hh"
+#include "Pointset_Powerset_defs.hh"
+#include <utility>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the poly-hull of \p p and \p q is exact it is assigned
+  to \p p and <CODE>true</CODE> is returned,
+  otherwise <CODE>false</CODE> is returned.
+
+  \relates Polyhedron
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Polyhedron */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+  PH poly_hull = p;
+  NNC_Polyhedron nnc_p(p);
+  poly_hull.poly_hull_assign(q);
+  std::pair<PH, Pointset_Powerset<NNC_Polyhedron> >
+    partition = linear_partition(q, poly_hull);
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
+    // The polyhedral hull is exact if and only if all the elements
+    // of the partition of the polyhedral hull of `p' and `q' with
+    // respect to `q' are included in `p'
+    if (!nnc_p.contains(i->pointset()))
+      return false;
+  p = poly_hull;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_algorithms_hh)
diff --git a/src/assert.cc b/src/assert.cc
new file mode 100644
index 0000000..fe2cdf0
--- /dev/null
+++ b/src/assert.cc
@@ -0,0 +1,52 @@
+/* Definitions of assert-like functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "assert.hh"
+#include <cstdlib>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::ppl_unreachable() {
+  abort();
+}
+
+void
+PPL::ppl_unreachable_msg(const char* msg,
+                         const char* file, unsigned int line,
+                         const char* function) {
+  std::cerr << file << ":" << line << ": " << function
+            << ": Latent fault detected: " << msg << ".\n";
+  abort();
+}
+
+void
+PPL::ppl_assertion_failed(const char* assertion_text,
+                          const char* file, unsigned int line,
+                          const char* function) {
+  std::cerr << file << ":" << line << ": " << function
+            << ": Assertion `" << assertion_text << "' failed.\n";
+  abort();
+}
diff --git a/src/assert.hh b/src/assert.hh
new file mode 100644
index 0000000..c4fe5ff
--- /dev/null
+++ b/src/assert.hh
@@ -0,0 +1,150 @@
+/* Implementation of PPL assert-like macros.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_assert_hh
+#define PPL_assert_hh 1
+
+// The PPL_UNREACHABLE_MSG macro flags a program point as unreachable.
+// Argument `msg__' is added to output when assertions are turned on.
+#if defined(NDEBUG)
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library::ppl_unreachable()
+#else
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library:: \
+  ppl_unreachable_msg(msg__, __FILE__, __LINE__, __func__)
+#endif
+
+// The PPL_UNREACHABLE macro flags a program point as unreachable.
+#define PPL_UNREACHABLE PPL_UNREACHABLE_MSG("unreachable")
+
+// The PPL_ASSERTION_FAILED macro is used to output a message after
+// an assertion failure and then cause program termination.
+// (It is meant to be used only when assertions are turned on.)
+#define PPL_ASSERTION_FAILED(msg__) Parma_Polyhedra_Library:: \
+  ppl_assertion_failed(msg__, __FILE__, __LINE__, __func__)
+
+// Helper macro PPL_ASSERT_IMPL_: do not use it directly.
+#if defined(NDEBUG)
+#define PPL_ASSERT_IMPL_(cond__) ((void) 0)
+#else
+#define PPL_STRING_(s) #s
+#define PPL_ASSERT_IMPL_(cond__) \
+  ((cond__) ? (void) 0 : PPL_ASSERTION_FAILED(PPL_STRING_(cond__)))
+#endif
+
+
+// Non zero to detect use of PPL_ASSERT instead of PPL_ASSERT_HEAVY
+// Note: flag does not affect code built with NDEBUG defined.
+#define PPL_DEBUG_PPL_ASSERT 1
+
+// The PPL_ASSERT macro states that Boolean condition cond__ should hold.
+// This is meant to replace uses of C assert().
+#if defined(NDEBUG) || (!PPL_DEBUG_PPL_ASSERT)
+#define PPL_ASSERT(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+// Note: here we have assertions enabled and PPL_DEBUG_PPL_ASSERT is 1.
+// Check if the call to PPL_ASSERT should be replaced by PPL_ASSERT_HEAVY
+// (i.e., if the former may interfere with computational weights).
+#define PPL_ASSERT(cond__)                                        \
+  do {                                                            \
+    typedef Parma_Polyhedra_Library::Weightwatch_Traits W_Traits; \
+    W_Traits::Threshold old_weight__ = W_Traits::weight;          \
+    PPL_ASSERT_IMPL_(cond__);                                     \
+    PPL_ASSERT_IMPL_(old_weight__ == W_Traits::weight             \
+                     && ("PPL_ASSERT_HEAVY has to be used here" != 0)); \
+  } while (false)
+#endif // !defined(NDEBUG) && PPL_DEBUG_PPL_ASSERT
+
+
+// Macro PPL_ASSERT_HEAVY is meant to be used when the evaluation of
+// the assertion may change computational weights (via WEIGHT_ADD).
+#if defined(NDEBUG)
+#define PPL_ASSERT_HEAVY(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+#define PPL_ASSERT_HEAVY(cond__)                                \
+  do {                                                          \
+    Parma_Polyhedra_Library::In_Assert guard;                   \
+    PPL_ASSERT_IMPL_(cond__);                                   \
+  } while (false)
+#endif // !defined(NDEBUG)
+
+
+// Macro PPL_EXPECT (resp., PPL_EXPECT_HEAVY) should be used rather than
+// PPL_ASSERT (resp., PPL_ASSERT_HEAVY) when the condition is assumed to
+// hold but it is not under library control (typically, it depends on
+// user provided input).
+#define PPL_EXPECT(cond__) PPL_ASSERT(cond__)
+#define PPL_EXPECT_HEAVY(cond__) PPL_ASSERT_HEAVY(cond__)
+
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+#define PPL_WEAK_NORETURN __attribute__((weak, noreturn))
+#else
+#define PPL_WEAK_NORETURN __attribute__((noreturn))
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper function causing program termination by calling \c abort.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable() PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Helper function printing message on \c std::cerr and causing program
+  termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable_msg(const char* msg,
+                         const char* file, unsigned int line,
+                         const char* function) PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Helper function printing an assertion failure message on \c std::cerr
+  and causing program termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_assertion_failed(const char* assertion_text,
+                          const char* file, unsigned int line,
+                          const char* function) PPL_WEAK_NORETURN;
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns \c true if and only if \p x_copy contains \p y_copy.
+
+  \note
+  This is a helper function for debugging purposes, to be used in assertions.
+  The two arguments are meant to be passed by value, i.e., <em>copied</em>,
+  so that their representations will not be affected by the containment check.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool copy_contains(T x_copy, T y_copy) {
+  return x_copy.contains(y_copy);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_assert_hh)
diff --git a/src/assign_or_swap.hh b/src/assign_or_swap.hh
new file mode 100644
index 0000000..53e97e9
--- /dev/null
+++ b/src/assign_or_swap.hh
@@ -0,0 +1,71 @@
+/* The assign_or_swap() utility functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_assign_or_swap_hh
+#define PPL_assign_or_swap_hh 1
+
+#include "meta_programming.hh"
+#include "Has_Assign_Or_Swap.hh"
+#include "Slow_Copy.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is an assign_or_swap() method, use it.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Has_Assign_Or_Swap<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to.assign_or_swap(from);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() method but copies are not slow, copy.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && !Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to = from;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() and copies are slow, delegate to swap().
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  using std::swap;
+  swap(to, from);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_assign_or_swap_hh)
diff --git a/src/c_streambuf.cc b/src/c_streambuf.cc
new file mode 100644
index 0000000..a15499a
--- /dev/null
+++ b/src/c_streambuf.cc
@@ -0,0 +1,107 @@
+/* c_streambuf class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "c_streambuf_defs.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+c_streambuf::int_type
+c_streambuf::uflow() {
+  const int_type c = underflow();
+  next_char_buf = traits_type::eof();
+  return c;
+}
+
+c_streambuf::int_type
+c_streambuf::underflow() {
+  const int_type eof = traits_type::eof();
+  if (traits_type::eq_int_type(next_char_buf, eof)) {
+    char buf;
+    if (cb_read(&buf, 1) == 1)
+      next_char_buf = buf;
+    else
+      next_char_buf = eof;
+  }
+  return next_char_buf;
+}
+
+std::streamsize
+c_streambuf::xsgetn(char_type* s, std::streamsize n) {
+  PPL_ASSERT(n >= 0);
+  if (n == 0)
+    return n;
+  const int_type eof = traits_type::eof();
+  const size_t sz_n = static_cast<size_t>(n);
+  size_t a;
+  if (traits_type::eq_int_type(next_char_buf, eof))
+    a = 0;
+  else {
+    s[0] = static_cast<char_type>(next_char_buf);
+    a = 1;
+  }
+  const size_t r = cb_read(s + a, sz_n - a) + a;
+  if (r > 0)
+    unget_char_buf = traits_type::to_int_type(s[r - 1]);
+  else
+    unget_char_buf = traits_type::eof();
+  return static_cast<std::streamsize>(r);
+}
+
+c_streambuf::int_type
+c_streambuf::pbackfail(int_type c) {
+  const int_type eof = traits_type::eof();
+  next_char_buf = traits_type::eq_int_type(c, eof) ? unget_char_buf : c;
+  unget_char_buf = eof;
+  return next_char_buf;
+}
+
+std::streamsize
+c_streambuf::xsputn(const char_type* s, std::streamsize n) {
+  PPL_ASSERT(n >= 0);
+  const size_t r = cb_write(s, static_cast<size_t>(n));
+  return static_cast<std::streamsize>(r);
+}
+
+c_streambuf::int_type
+c_streambuf::overflow(int_type c) {
+  const int_type eof = traits_type::eof();
+  if (traits_type::eq_int_type(c, eof))
+    return (sync() != 0) ? eof : traits_type::not_eof(c);
+  else {
+    char buf = static_cast<char>(c);
+    if (cb_write(&buf, 1) == 1)
+      return c;
+    else
+      return eof;
+  }
+}
+
+int
+c_streambuf::sync() {
+  return cb_sync();
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/c_streambuf_defs.hh b/src/c_streambuf_defs.hh
new file mode 100644
index 0000000..0bbf9e6
--- /dev/null
+++ b/src/c_streambuf_defs.hh
@@ -0,0 +1,127 @@
+/* c_streambuf class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_c_streambuf_defs_hh
+#define PPL_c_streambuf_defs_hh 1
+
+#include "c_streambuf_types.hh"
+#include <streambuf>
+#include <cstddef>
+
+class Parma_Polyhedra_Library::c_streambuf
+  : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+  //! Constructor.
+  c_streambuf();
+
+  //! Destructor.
+  virtual ~c_streambuf();
+
+protected:
+  /*! \brief
+    Gets a character in case of underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type underflow();
+
+  /*! \brief
+    In case of underflow, gets a character and advances the next pointer.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type uflow();
+
+  /*! \brief
+    Gets a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+  /*! \brief
+    Puts character back in case of backup underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+  */
+  virtual int_type pbackfail(int_type c = traits_type::eof());
+
+  /*! \brief
+    Writes a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+  /*! \brief
+    Writes a character in case of overflow.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual int_type overflow(int_type c);
+
+  /*! \brief
+    Synchronizes the stream buffer.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+  */
+  virtual int sync();
+
+private:
+  //! Character type of the streambuf.
+  typedef char char_type;
+
+  //! Traits type of the streambuf.
+  typedef std::char_traits<char_type> traits_type;
+
+  //! Integer type of the streambuf.
+  typedef traits_type::int_type int_type;
+
+  //! Buffer for the last character read.
+  int_type unget_char_buf;
+
+  //! Buffer for next character
+  int_type next_char_buf;
+
+  virtual size_t cb_read(char *, size_t) {
+    return 0;
+  }
+  virtual size_t cb_write(const char *, size_t) {
+    return 0;
+  }
+  virtual int cb_sync() {
+    return 0;
+  }
+  virtual int cb_flush() {
+    return 0;
+  }
+};
+
+#include "c_streambuf_inlines.hh"
+
+#endif // !defined(PPL_c_streambuf_defs_hh)
diff --git a/src/c_streambuf_inlines.hh b/src/c_streambuf_inlines.hh
new file mode 100644
index 0000000..5cc069a
--- /dev/null
+++ b/src/c_streambuf_inlines.hh
@@ -0,0 +1,40 @@
+/* c_streambuf class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_c_streambuf_inlines_hh
+#define PPL_c_streambuf_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+c_streambuf::c_streambuf()
+  : unget_char_buf(traits_type::eof()), next_char_buf(traits_type::eof()) {
+}
+
+inline
+c_streambuf::~c_streambuf() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_c_streambuf_inlines_hh)
diff --git a/src/c_streambuf_types.hh b/src/c_streambuf_types.hh
new file mode 100644
index 0000000..c5bad41
--- /dev/null
+++ b/src/c_streambuf_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_c_streambuf_types_hh
+#define PPL_c_streambuf_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class c_streambuf;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_c_streambuf_types_hh)
diff --git a/src/checked.cc b/src/checked.cc
new file mode 100644
index 0000000..3cbc4ba
--- /dev/null
+++ b/src/checked.cc
@@ -0,0 +1,500 @@
+/* Helper functions for checked numbers.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "checked_defs.hh"
+#include "C_Integer.hh"
+
+namespace Parma_Polyhedra_Library {
+
+Minus_Infinity MINUS_INFINITY;
+Plus_Infinity PLUS_INFINITY;
+Not_A_Number NOT_A_NUMBER;
+
+namespace Checked {
+
+//! Holds the precision parameter used for irrational calculations.
+unsigned irrational_precision;
+
+struct number_struct {
+  unsigned int base;
+  bool neg_mantissa;
+  bool neg_exponent;
+  std::string mantissa;
+  unsigned int base_for_exponent;
+  unsigned long exponent;
+};
+
+/*! \brief
+  Returns the integer value associated with the ASCII code \p c, in
+  the base \p base positional number system, if there is such an
+  association; returns \f$-1\f$ otherwise.
+*/
+inline int
+get_digit(char c, unsigned int base = 10) {
+  unsigned int n;
+  switch (c) {
+  case '0': n = 0; break;
+  case '1': n = 1; break;
+  case '2': n = 2; break;
+  case '3': n = 3; break;
+  case '4': n = 4; break;
+  case '5': n = 5; break;
+  case '6': n = 6; break;
+  case '7': n = 7; break;
+  case '8': n = 8; break;
+  case '9': n = 9; break;
+  case 'a': case 'A': n = 10; break;
+  case 'b': case 'B': n = 11; break;
+  case 'c': case 'C': n = 12; break;
+  case 'd': case 'D': n = 13; break;
+  case 'e': case 'E': n = 14; break;
+  case 'f': case 'F': n = 15; break;
+  case 'g': case 'G': n = 16; break;
+  case 'h': case 'H': n = 17; break;
+  case 'i': case 'I': n = 18; break;
+  case 'j': case 'J': n = 19; break;
+  case 'k': case 'K': n = 20; break;
+  case 'l': case 'L': n = 21; break;
+  case 'm': case 'M': n = 22; break;
+  case 'n': case 'N': n = 23; break;
+  case 'o': case 'O': n = 24; break;
+  case 'p': case 'P': n = 25; break;
+  case 'q': case 'Q': n = 26; break;
+  case 'r': case 'R': n = 27; break;
+  case 's': case 'S': n = 28; break;
+  case 't': case 'T': n = 29; break;
+  case 'u': case 'U': n = 30; break;
+  case 'v': case 'V': n = 31; break;
+  case 'w': case 'W': n = 32; break;
+  case 'x': case 'X': n = 33; break;
+  case 'y': case 'Y': n = 34; break;
+  case 'z': case 'Z': n = 35; break;
+  default:
+    return -1;
+  }
+  if (n >= base)
+    return -1;
+  return static_cast<int>(n);
+}
+
+/*! \brief
+  Adds the number represented (in the modulus-and-sign representation)
+  by \p b_neg and \p b_mod to the number represented by \p a_neg and
+  \p a_mod, assigning the result to the latter.  Returns
+  <CODE>false</CODE> is the result cannot be represented; returns
+  <CODE>true</CODE> otherwise.
+*/
+inline bool
+sum_sign(bool& a_neg, unsigned long& a_mod,
+         bool b_neg, unsigned long b_mod) {
+  if (a_neg == b_neg) {
+    if (a_mod > C_Integer<unsigned long>::max - b_mod)
+      return false;
+    a_mod += b_mod;
+  }
+  else if (a_mod >= b_mod)
+    a_mod -= b_mod;
+  else {
+    a_neg = !a_neg;
+    a_mod = b_mod - a_mod;
+  }
+  return true;
+}
+
+
+/*! \brief
+  Helper function for parse_number(): reads the numerator or
+  denominator part of a number from \p is into \p numer, returning the
+  appropriate Result value.
+*/
+Result
+parse_number_part(std::istream& is, number_struct& numer) {
+  enum anonymous_enum { BASE, INTEGER, FRACTIONAL, EXPONENT } state = BASE;
+  PPL_UNINITIALIZED(unsigned long, max_exp_div);
+  PPL_UNINITIALIZED(int, max_exp_rem);
+  bool empty_exponent = true;
+  bool empty_mantissa = true;
+  long exponent_offset = 0;
+  unsigned exponent_offset_scale = 1;
+  numer.base = 10;
+  numer.base_for_exponent = 10;
+  numer.neg_mantissa = false;
+  numer.neg_exponent = false;
+  numer.mantissa.erase();
+  numer.exponent = 0;
+  char c;
+  do {
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+  } while (is_space(c));
+  switch (c) {
+  case '-':
+    numer.neg_mantissa = true;
+    // Fall through.
+  case '+':
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+    if (c == 'i' || c == 'I')
+      goto inf;
+    if (c != '.')
+      break;
+    // Fall through.
+  case '.':
+    state = FRACTIONAL;
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+    break;
+  case 'n':
+  case 'N':
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+    if (c != 'a' && c != 'A')
+      goto unexpected;
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+    if (c != 'n' && c != 'N')
+      goto unexpected;
+    return V_NAN;
+  inf:
+  case 'i':
+  case 'I':
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+    if (c != 'n' && c != 'n')
+      goto unexpected;
+    if (!is.get(c))
+      return V_CVT_STR_UNK;
+    if (c != 'f' && c != 'F')
+      goto unexpected;
+    return numer.neg_mantissa ? V_EQ_MINUS_INFINITY : V_EQ_PLUS_INFINITY;
+  }
+  if (state != FRACTIONAL) {
+    if (get_digit(c, 10) < 0)
+      goto unexpected;
+    char d;
+    if (c == '0' && !is.get(d).fail()) {
+      if (d == 'x' || d == 'X') {
+        numer.base = 16;
+        numer.base_for_exponent = 16;
+        state = INTEGER;
+        if (!is.get(c))
+          return V_CVT_STR_UNK;
+      }
+      else
+        is.unget();
+    }
+  }
+  do {
+    switch (state) {
+    case BASE:
+      if (get_digit(c, 10) >= 0) {
+        if (c != '0' || !numer.mantissa.empty())
+          numer.mantissa += c;
+        empty_mantissa = false;
+        break;
+      }
+      if (c == '^') {
+        if (!is.get(c))
+          return V_CVT_STR_UNK;
+        if (c != '^')
+          goto unexpected;
+        numer.base = 0;
+        for (std::string::const_iterator
+               i = numer.mantissa.begin(); i != numer.mantissa.end(); ++i) {
+          numer.base = numer.base * 10 + static_cast<unsigned>(get_digit(*i, 10));
+          if (numer.base > 36)
+            goto unexpected;
+        }
+        if (numer.base < 2)
+          goto unexpected;
+        numer.base_for_exponent = numer.base;
+        numer.mantissa.erase();
+        empty_mantissa = true;
+        state = INTEGER;
+        break;
+      }
+      goto integer;
+    case INTEGER:
+      if (get_digit(c, numer.base) >= 0) {
+        if (c != '0' || !numer.mantissa.empty())
+          numer.mantissa += c;
+        empty_mantissa = false;
+        break;
+      }
+    integer:
+      if (c == '.') {
+        state = FRACTIONAL;
+        break;
+      }
+      goto fractional;
+    case FRACTIONAL:
+      if (get_digit(c, numer.base) >= 0) {
+        --exponent_offset;
+        if (c != '0' || !numer.mantissa.empty())
+          numer.mantissa += c;
+        empty_mantissa = false;
+        break;
+      }
+    fractional:
+      if (empty_mantissa)
+        goto unexpected;
+      if (c == 'e' || c == 'E')
+        goto exp;
+      if (c == 'p' || c == 'P') {
+        if (numer.base == 16) {
+          numer.base_for_exponent = 2;
+          exponent_offset_scale = 4;
+          goto exp;
+        }
+        else
+          goto unexpected;
+      }
+      if (c == '*') {
+        if (!is.get(c))
+          return V_CVT_STR_UNK;
+        if (c != '^')
+          goto unexpected;
+      exp:
+        state = EXPONENT;
+        PPL_ASSERT(numer.base >= 2);
+        const long l_max = C_Integer<long>::max;
+        max_exp_div = static_cast<unsigned long>(l_max) / numer.base;
+        max_exp_rem = static_cast<int>(l_max % static_cast<long>(numer.base));
+        if (!is.get(c))
+          return V_CVT_STR_UNK;
+        if (c == '-') {
+          numer.neg_exponent = true;
+          break;
+        }
+        if (c == '+')
+          break;
+        continue;
+      }
+      is.unget();
+      goto ok;
+    case EXPONENT:
+      const int d = get_digit(c, 10);
+      if (d >= 0) {
+        empty_exponent = false;
+        if (numer.exponent > max_exp_div
+            || (numer.exponent == max_exp_div && d > max_exp_rem))
+          return V_CVT_STR_UNK;
+        numer.exponent = 10 * numer.exponent + static_cast<unsigned long>(d);
+        break;
+      }
+      if (empty_exponent)
+        goto unexpected;
+      is.unget();
+      goto ok;
+    }
+    is.get(c);
+  } while (!is.fail());
+
+  if (empty_mantissa || is.bad())
+    return V_CVT_STR_UNK;
+
+ ok:
+  {
+    std::string::size_type n = numer.mantissa.size();
+    while (n > 0 && numer.mantissa[n - 1] == '0') {
+      --n;
+      ++exponent_offset;
+    }
+    numer.mantissa.erase(n);
+    bool neg;
+    if (exponent_offset < 0) {
+      neg = true;
+      exponent_offset = -exponent_offset;
+    }
+    else
+      neg = false;
+    sum_sign(numer.neg_exponent, numer.exponent,
+             neg, static_cast<unsigned long>(exponent_offset) * exponent_offset_scale);
+    return V_EQ;
+  }
+
+ unexpected:
+  is.unget();
+  return V_CVT_STR_UNK;
+}
+
+/*! \brief
+  Reads a number from \p is writing it into \p numer, the numerator,
+  and \p denom, the denominator; the appropriate Result value is
+  returned.
+*/
+Result
+parse_number(std::istream& is, number_struct& numer, number_struct& denom) {
+  // Read the numerator.
+  Result r = parse_number_part(is, numer);
+  if (r != V_EQ)
+    return r;
+  char c;
+  is.get(c);
+  if (is.bad())
+    return V_CVT_STR_UNK;
+  if (!is) {
+    denom.base = 0;
+    return r;
+  }
+  if (c != '/') {
+    is.unget();
+    denom.base = 0;
+    return r;
+  }
+  // Read the denominator.
+  r = parse_number_part(is, denom);
+  if (r != V_EQ)
+    return V_CVT_STR_UNK;
+  if (numer.base == denom.base
+      && numer.base_for_exponent == denom.base_for_exponent) {
+    if (sum_sign(numer.neg_exponent, numer.exponent,
+                 !denom.neg_exponent, denom.exponent)) {
+      if (numer.neg_exponent) {
+        denom.neg_exponent = false;
+        denom.exponent = numer.exponent;
+        numer.exponent = 0;
+      }
+      else
+        denom.exponent = 0;
+    }
+  }
+  return V_EQ;
+}
+
+
+Result
+input_mpq(mpq_class& to, std::istream& is) {
+  number_struct numer_struct;
+  number_struct denom_struct;
+  const Result r = parse_number(is, numer_struct, denom_struct);
+  if (r == V_CVT_STR_UNK) {
+    is.setstate(is.failbit);
+    return r;
+  }
+  is.clear(is.rdstate() & ~is.failbit);
+  if (r != V_EQ)
+    return r;
+  if (denom_struct.base != 0 && denom_struct.mantissa.empty())
+      return V_NAN;
+  if (numer_struct.mantissa.empty()) {
+    to = 0;
+    return V_EQ;
+  }
+  const mpz_ptr numer = to.get_num().get_mpz_t();
+  const mpz_ptr denom = to.get_den().get_mpz_t();
+  mpz_set_str(numer, numer_struct.mantissa.c_str(),
+              static_cast<int>(numer_struct.base));
+  if (denom_struct.base != 0) {
+    if (numer_struct.neg_mantissa != denom_struct.neg_mantissa)
+      mpz_neg(numer, numer);
+    mpz_set_str(denom, denom_struct.mantissa.c_str(),
+                static_cast<int>(denom_struct.base));
+    if (numer_struct.exponent != 0 || denom_struct.exponent != 0) {
+      // Multiply the exponents into the numerator and denominator.
+      mpz_t z;
+      mpz_init(z);
+      if (numer_struct.exponent != 0) {
+        mpz_ui_pow_ui(z,
+                      numer_struct.base_for_exponent, numer_struct.exponent);
+        if (numer_struct.neg_exponent)
+          mpz_mul(denom, denom, z);
+        else
+          mpz_mul(numer, numer, z);
+      }
+      if (denom_struct.exponent != 0) {
+        mpz_ui_pow_ui(z,
+                      denom_struct.base_for_exponent, denom_struct.exponent);
+        if (denom_struct.neg_exponent)
+          mpz_mul(numer, numer, z);
+        else
+          mpz_mul(denom, denom, z);
+      }
+      mpz_clear(z);
+    }
+  }
+  else {
+    if (numer_struct.neg_mantissa)
+      mpz_neg(numer, numer);
+    if (numer_struct.exponent != 0) {
+      if (numer_struct.neg_exponent) {
+        // Add the negative exponent as a denominator.
+        mpz_ui_pow_ui(denom,
+                      numer_struct.base_for_exponent, numer_struct.exponent);
+        goto end;
+      }
+      // Multiply the exponent into the numerator.
+      mpz_t z;
+      mpz_init(z);
+      mpz_ui_pow_ui(z,
+                    numer_struct.base_for_exponent, numer_struct.exponent);
+      mpz_mul(numer, numer, z);
+      mpz_clear(z);
+    }
+    mpz_set_ui(denom, 1);
+    return V_EQ;
+  }
+ end:
+  // GMP operators require rationals in canonical form.
+  to.canonicalize();
+  return V_EQ;
+}
+
+/* NOTE: q is overwritten! */
+std::string float_mpq_to_string(mpq_class& q) {
+  const mpz_ptr n = q.get_num().get_mpz_t();
+  const mpz_ptr d = q.get_den().get_mpz_t();
+  const unsigned long decimals = mpz_sizeinbase(d, 2) - 1;
+  if (decimals != 0) {
+    mpz_ui_pow_ui(d, 5, decimals);
+    mpz_mul(n, n, d);
+  }
+  size_t bufsize = mpz_sizeinbase(n, 10);
+  if (bufsize < decimals)
+    bufsize = decimals + 4;
+  else
+    bufsize += 3;
+  char buf[bufsize];
+  mpz_get_str(buf, 10, n);
+  if (decimals != 0) {
+    const size_t len = strlen(buf);
+    if (decimals < len) {
+      memmove(&buf[len - decimals + 1], &buf[len - decimals], decimals + 1);
+      buf[len - decimals] = '.';
+    }
+    else {
+      const size_t zeroes = decimals - len;
+      memmove(&buf[2 + zeroes], &buf[0], len + 1);
+      buf[0] = '0';
+      buf[1] = '.';
+      memset(&buf[2], '0', zeroes);
+    }
+  }
+  return buf;
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/checked_defs.hh b/src/checked_defs.hh
new file mode 100644
index 0000000..f011628
--- /dev/null
+++ b/src/checked_defs.hh
@@ -0,0 +1,716 @@
+/* Abstract checked arithmetic function container.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_defs_hh
+#define PPL_checked_defs_hh 1
+
+#include <cassert>
+#include <iostream>
+#include <gmpxx.h>
+#include "mp_std_bits_defs.hh"
+#include "Temp_defs.hh"
+#include "Rounding_Dir_defs.hh"
+#include "Numeric_Format_defs.hh"
+#include "Float_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+
+// It is a pity that function partial specialization is not permitted
+// by C++.  To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define PPL_FUNCTION_CLASS(name) name ## _function_struct
+
+#define PPL_DECLARE_FUN1_0_0(name, ret_type, qual, type)                \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg) {           \
+    return PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg); \
+  }
+
+#define PPL_DECLARE_FUN1_0_1(name, ret_type, qual, type, after1)        \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1) { \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, a1); \
+  }
+
+#define PPL_DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1, \
+                       PPL_U(after2) a2) {                              \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg,      \
+                                                              a1, a2);  \
+  }
+
+#define PPL_DECLARE_FUN1_0_3(name, ret_type, qual, type,                \
+                             after1, after2, after3)                    \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg,             \
+                       PPL_U(after1) a1, PPL_U(after2) a2,              \
+                       PPL_U(after3) a3) {                              \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg,      \
+                                                              a1, a2,   \
+                                                              a3);      \
+  }
+
+#define PPL_DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+                       PPL_U(after1) a1) {                              \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg,  \
+                                                              a1);      \
+  }
+
+#define PPL_DECLARE_FUN1_1_2(name, ret_type, before1, qual, type,       \
+                             after1, after2)                            \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+                       PPL_U(after1) a1, PPL_U(after2) a2) {            \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg,  \
+                                                              a1, a2);  \
+  }
+
+#define PPL_DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, \
+                             after1, after2)                            \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(before2) b2,     \
+                       PPL_U(qual) PPL_U(type)& arg,                    \
+                       PPL_U(after1) a1, PPL_U(after2) a2) {            \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, b2,   \
+                                                              arg,      \
+                                                              a1, a2);  \
+  }
+
+#define PPL_DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,          \
+                       PPL_U(qual2) PPL_U(type2)& arg2) {               \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2,                   \
+      type1, PPL_U(type2)>::function(arg1, arg2);                       \
+  }
+
+#define PPL_DECLARE_FUN2_0_1(name, ret_type, qual1, type1,      \
+                             qual2, type2, after1)              \
+  template <typename Policy1, typename Policy2,                 \
+            typename type1, typename type2>                     \
+  struct PPL_FUNCTION_CLASS(name);                              \
+  template <typename Policy1, typename Policy2,                 \
+            typename type1, typename type2>                     \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,  \
+                       PPL_U(qual2) PPL_U(type2)& arg2,         \
+                       PPL_U(after1) a1) {                      \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2,           \
+      type1, PPL_U(type2)>::function(arg1, arg2, a1);           \
+  }
+
+#define PPL_DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, \
+                             after1, after2)                            \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,          \
+                       PPL_U(qual2) PPL_U(type2)& arg2,                 \
+                       PPL_U(after1) a1, PPL_U(after2) a2) {            \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2,                   \
+      type1, PPL_U(type2)>::function(arg1, arg2, a1, a2);               \
+  }
+
+#define PPL_DECLARE_FUN3_0_1(name, ret_type, qual1, type1,              \
+                             qual2, type2, qual3, type3, after1)        \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename type1, typename type2, typename type3>             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename type1, typename type2, typename type3>             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,          \
+                       PPL_U(qual2) PPL_U(type2)& arg2,                 \
+                       PPL_U(qual3) PPL_U(type3)& arg3,                 \
+                       PPL_U(after1) a1) {                              \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3,          \
+      type1, type2, PPL_U(type3)>                                       \
+      ::function(arg1, arg2, arg3, a1);                                 \
+  }
+
+#define PPL_DECLARE_FUN5_0_1(name, ret_type,                            \
+                             qual1, type1, qual2, type2, qual3, type3,  \
+                             qual4, type4, qual5, type5,                \
+                             after1)                                    \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename Policy4,typename Policy5,                          \
+            typename type1, typename type2, typename type3,             \
+            typename type4, typename type5>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename Policy4,typename Policy5,                          \
+            typename type1, typename type2, typename type3,             \
+            typename type4, typename type5>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2) \
+                       PPL_U(type2)& arg2,                              \
+                       PPL_U(qual3) PPL_U(type3)& arg3, PPL_U(qual4)    \
+                       PPL_U(type4)& arg4,                              \
+                       PPL_U(qual5) PPL_U(type5)& arg5,                 \
+                       PPL_U(after1) a1) {                              \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3,          \
+      Policy4, Policy5,                                                 \
+      type1, type2,                                                     \
+      type3, type4,                                                     \
+      PPL_U(type5)>                                                     \
+      ::function(arg1, arg2, arg3, arg4, arg5, a1);                     \
+  }
+
+#define PPL_SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type)       \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg) {     \
+      return PPL_U(func)<Policy>(arg);                                  \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1) {                 \
+      return PPL_U(func)<Policy>(arg, a1);                              \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type,       \
+                                after1, after2)                         \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy>(arg, a1, a2);                          \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type,       \
+                                after1, after2, after3)                 \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1, PPL_U(after2) a2, \
+                                    PPL_U(after3) a3) {                 \
+      return PPL_U(func)<Policy>(arg, a1, a2, a3);                      \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_1_1(name, func, ret_type, before1,          \
+                                qual, type, after1)                     \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(before1) b1, PPL_U(qual)      \
+                                    PPL_U(type)& arg,                   \
+                                    PPL_U(after1) a1) {                 \
+      return PPL_U(func)<Policy>(b1, arg, a1);                          \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_1_2(name, func, ret_type, before1,          \
+                                qual, type, after1, after2)             \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(before1) b1, PPL_U(qual)      \
+                                    PPL_U(type)& arg,                   \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy>(b1, arg, a1, a2);                      \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, \
+                                qual, type, after1, after2)             \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(before1) b1, PPL_U(before2) b2, \
+                                    PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy>(b1, b2, arg, a1, a2);                  \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1,     \
+                                qual2, type2)                           \
+  template <typename Policy1, typename Policy2>                         \
+  struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1,              \
+                                  PPL_U(type2)> {                       \
+    static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1,    \
+                                    PPL_U(qual2) PPL_U(type2) &arg2) {  \
+      return PPL_U(func)<Policy1, Policy2>(arg1, arg2);                 \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1,     \
+                                qual2, type2, after1)                   \
+  template <typename Policy1, typename Policy2>                         \
+  struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1,              \
+                                  PPL_U(type2)> {                       \
+    static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1,    \
+                                    PPL_U(qual2) PPL_U(type2) &arg2,    \
+                                    PPL_U(after1) a1) {                 \
+      return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1);             \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1,     \
+                                qual2, type2, after1, after2)           \
+  template <typename Policy1, typename Policy2>                         \
+  struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1,              \
+                                  PPL_U(type2)> {                       \
+    static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1,    \
+                                    PPL_U(qual2) PPL_U(type2) &arg2,    \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1, a2);         \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1,     \
+                                qual2, type2, qual3, type3, after1)     \
+  template <typename Policy1, typename Policy2, typename Policy3>       \
+  struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3,           \
+                                   type1, type2,                        \
+                                   PPL_U(type3)> {                      \
+    static inline Result function(PPL_U(qual1) PPL_U(type1)& arg1,      \
+                                  PPL_U(qual2) PPL_U(type2) &arg2,      \
+                                  PPL_U(qual3) PPL_U(type3) &arg3,      \
+                                  PPL_U(after1) a1) {                   \
+      return PPL_U(func)<Policy1, Policy2, Policy3>(arg1, arg2, arg3,   \
+                                                    a1);                \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN5_0_1(name, func, ret_type,                   \
+                                qual1, type1, qual2, type2,             \
+                                qual3, type3,                           \
+                                qual4, type4, qual5, type5, after1)     \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename Policy4, typename Policy5>                         \
+  struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, Policy4,  \
+                                   Policy5,                             \
+                                   type1, type2,                        \
+                                   type3, type4,                        \
+                                   PPL_U(type5)> {                      \
+    static inline Result                                                \
+      function(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2)            \
+               PPL_U(type2) &arg2,                                      \
+               PPL_U(qual3) PPL_U(type3) &arg3, PPL_U(qual4)            \
+               PPL_U(type4) &arg4,                                      \
+               PPL_U(qual5) PPL_U(type5) &arg5, PPL_U(after1) a1) {     \
+      return PPL_U(func)<Policy1, Policy2, Policy3, Policy4,            \
+        Policy5>(arg1, arg2, arg3, arg4, arg5, a1);                     \
+    }                                                                   \
+  };
+
+// The `nonconst' macro helps readability of the sequel.
+#ifdef nonconst
+#define PPL_SAVED_nonconst nonconst
+#undef nonconst
+#endif
+#define nonconst
+
+#define PPL_SPECIALIZE_COPY(func, Type)                                 \
+  PPL_SPECIALIZE_FUN2_0_0(copy, func, void, nonconst, Type, const, Type)
+#define PPL_SPECIALIZE_SGN(func, From)                                  \
+  PPL_SPECIALIZE_FUN1_0_0(sgn, func, Result_Relation, const, From)
+#define PPL_SPECIALIZE_CMP(func, Type1, Type2)                          \
+  PPL_SPECIALIZE_FUN2_0_0(cmp, func, Result_Relation, const, Type1, const, Type2)
+#define PPL_SPECIALIZE_CLASSIFY(func, Type)                             \
+  PPL_SPECIALIZE_FUN1_0_3(classify, func, Result, const, Type, bool, bool, bool)
+#define PPL_SPECIALIZE_IS_NAN(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_0_0(is_nan, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_MINF(func, Type)                      \
+  PPL_SPECIALIZE_FUN1_0_0(is_minf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_PINF(func, Type)                      \
+  PPL_SPECIALIZE_FUN1_0_0(is_pinf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_INT(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_0_0(is_int, func, bool, const, Type)
+#define PPL_SPECIALIZE_ASSIGN_SPECIAL(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_0_2(assign_special, func, Result,                 \
+                          nonconst, Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT_SPECIAL(func, Type)                    \
+  PPL_SPECIALIZE_FUN1_0_2(construct_special, func, Result, nonconst,    \
+                          Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT(func, To, From)                        \
+  PPL_SPECIALIZE_FUN2_0_1(construct, func, Result, nonconst, To,        \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ASSIGN(func, To, From)                   \
+  PPL_SPECIALIZE_FUN2_0_1(assign, func, Result, nonconst, To,   \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_FLOOR(func, To, From)                    \
+  PPL_SPECIALIZE_FUN2_0_1(floor, func, Result, nonconst, To,    \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_CEIL(func, To, From)                     \
+  PPL_SPECIALIZE_FUN2_0_1(ceil, func, Result, nonconst, To,     \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_TRUNC(func, To, From)                    \
+  PPL_SPECIALIZE_FUN2_0_1(trunc, func, Result, nonconst, To,    \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_NEG(func, To, From)                      \
+  PPL_SPECIALIZE_FUN2_0_1(neg, func, Result, nonconst, To,      \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ABS(func, To, From)                      \
+  PPL_SPECIALIZE_FUN2_0_1(abs, func, Result, nonconst, To,      \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_SQRT(func, To, From)                     \
+  PPL_SPECIALIZE_FUN2_0_1(sqrt, func, Result, nonconst, To,     \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(add, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(sub, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(mul, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(div, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_REM(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(rem, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_IDIV(func, To, From1, From2)                     \
+  PPL_SPECIALIZE_FUN3_0_1(idiv, func, Result, nonconst, To,             \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(add_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(sub_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(mul_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(div_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SMOD_2EXP(func, To, From)                        \
+  PPL_SPECIALIZE_FUN2_0_2(smod_2exp, func, Result, nonconst, To,        \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_UMOD_2EXP(func, To, From)                        \
+  PPL_SPECIALIZE_FUN2_0_2(umod_2exp, func, Result, nonconst, To,        \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_MUL(func, To, From1, From2)                  \
+  PPL_SPECIALIZE_FUN3_0_1(add_mul, func, Result, nonconst, To,          \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_MUL(func, To, From1, From2)                  \
+  PPL_SPECIALIZE_FUN3_0_1(sub_mul, func, Result, nonconst, To,          \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCD(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(gcd, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCDEXT(func, To1, From1, From2, To2, To3)        \
+  PPL_SPECIALIZE_FUN5_0_1(gcdext, func, Result, nonconst, To1,          \
+                          nonconst, To2, nonconst, To3,                 \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_LCM(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(lcm, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_INPUT(func, Type)                        \
+  PPL_SPECIALIZE_FUN1_0_2(input, func, Result, nonconst, Type,  \
+                          std::istream&, Rounding_Dir)
+#define PPL_SPECIALIZE_OUTPUT(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_1_2(output, func, Result, std::ostream&,  \
+                          const, Type,                          \
+                          const Numeric_Format&, Rounding_Dir)
+
+
+PPL_DECLARE_FUN2_0_0(copy,
+                     void, nonconst, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_0(sgn,
+                     Result_Relation, const, From)
+PPL_DECLARE_FUN2_0_0(cmp,
+                     Result_Relation, const, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_3(classify,
+                     Result, const, Type, bool, bool, bool)
+PPL_DECLARE_FUN1_0_0(is_nan,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_minf,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_pinf,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_int,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_2(assign_special,
+                     Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(construct_special,
+                     Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(construct,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(assign,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(floor,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(ceil,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(trunc,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(neg,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(abs,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(sqrt,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(mul,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(div,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(rem,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(idiv,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(add_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(sub_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(mul_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(div_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(smod_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(umod_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add_mul,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub_mul,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(gcd,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN5_0_1(gcdext,
+                     Result, nonconst, To1, nonconst, To2, nonconst, To3,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(lcm,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(input,
+                     Result, nonconst, Type, std::istream&, Rounding_Dir)
+PPL_DECLARE_FUN1_1_2(output,
+                     Result, std::ostream&, const, Type,
+                     const Numeric_Format&, Rounding_Dir)
+
+#undef PPL_DECLARE_FUN1_0_0
+#undef PPL_DECLARE_FUN1_0_1
+#undef PPL_DECLARE_FUN1_0_2
+#undef PPL_DECLARE_FUN1_0_3
+#undef PPL_DECLARE_FUN1_1_1
+#undef PPL_DECLARE_FUN1_1_2
+#undef PPL_DECLARE_FUN1_2_2
+#undef PPL_DECLARE_FUN2_0_0
+#undef PPL_DECLARE_FUN2_0_1
+#undef PPL_DECLARE_FUN2_0_2
+#undef PPL_DECLARE_FUN3_0_1
+#undef PPL_DECLARE_FUN5_0_1
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+std::string float_mpq_to_string(mpq_class& q);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+  static const Result_Class vclass = VC_MINUS_INFINITY;
+};
+struct Plus_Infinity {
+  static const Result_Class vclass = VC_PLUS_INFINITY;
+};
+struct Not_A_Number {
+  static const Result_Class vclass = VC_NAN;
+};
+
+template <typename T>
+struct Is_Special : public False { };
+
+template <>
+struct Is_Special<Minus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Plus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Not_A_Number> : public True {};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Checked_Number_Transparent_Policy {
+  //! Do not check for overflowed result.
+  const_bool_nodef(check_overflow, false);
+
+  //! Do not check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Do not check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Do not check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Do not check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Do not check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Do not check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Do not check for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Handle not-a-number special value if \p T has it.
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+
+  //! Handle infinity special values if \p T have them.
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+
+  /*! \brief
+    The checked number can always be safely converted to the
+    underlying type \p T and vice-versa.
+  */
+  const_bool_nodef(convertible, true);
+
+  //! Do not honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, false);
+
+  //! Do not make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, false);
+
+  /*! \brief
+    For constructors, by default use the same rounding used by
+    underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+  /*! \brief
+    For overloaded operators (operator+(), operator-(), ...), by
+    default use the same rounding used by the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+  /*! \brief
+    For input functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For output functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For all other functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+#include "checked_inlines.hh"
+#include "checked_int_inlines.hh"
+#include "checked_float_inlines.hh"
+#include "checked_mpz_inlines.hh"
+#include "checked_mpq_inlines.hh"
+#include "checked_ext_inlines.hh"
+
+#undef nonconst
+#ifdef PPL_SAVED_nonconst
+#define nonconst PPL_SAVED_nonconst
+#undef PPL_SAVED_nonconst
+#endif
+
+#undef PPL_FUNCTION_CLASS
+#undef PPL_NAN
+
+#endif // !defined(PPL_checked_defs_hh)
diff --git a/src/checked_ext_inlines.hh b/src/checked_ext_inlines.hh
new file mode 100644
index 0000000..2f6a9b5
--- /dev/null
+++ b/src/checked_ext_inlines.hh
@@ -0,0 +1,923 @@
+/* Checked extended arithmetic functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_ext_defs_hh
+#define PPL_checked_ext_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T> struct FPU_Related : public False {};
+template <> struct FPU_Related<float> : public True {};
+template <> struct FPU_Related<double> : public True {};
+template <> struct FPU_Related<long double> : public True {};
+
+namespace Checked {
+
+template <typename T>
+inline bool
+handle_ext_natively(const T&) {
+  return FPU_Related<T>::value;
+}
+
+template <typename Policy, typename Type>
+inline bool
+ext_to_handle(const Type& x) {
+  return !handle_ext_natively(x)
+    && (Policy::has_infinity || Policy::has_nan);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_ext(const Type& x) {
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x))
+    return VR_EMPTY;
+  else if (is_minf<Policy>(x))
+    return VR_LT;
+  else if (is_pinf<Policy>(x))
+    return VR_GT;
+  else {
+  native:
+    return sgn<Policy>(x);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+construct_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return construct<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+assign_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return assign<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else {
+  native:
+    return neg<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+floor_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return floor<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+ceil_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return ceil<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+trunc_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return trunc<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return abs<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+      goto inf_add_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+    inf_add_inf:
+      return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+    minf:
+      return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+    pinf:
+      return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return add<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+      goto inf_sub_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+    inf_sub_inf:
+      return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_pinf<From2_Policy>(y)) {
+    minf:
+      return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+    }
+    else if (is_minf<From2_Policy>(y)) {
+    pinf:
+      return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return sub<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto pinf;
+    case VR_GT:
+      goto minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto minf;
+    case VR_GT:
+      goto pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+        goto pinf;
+      case VR_GT:
+        goto minf;
+      default:
+        goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      case VR_GT:
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      default:
+      inf_mul_zero:
+        PPL_ASSERT(To_Policy::check_inf_mul_zero);
+        return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+    native:
+      return mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_pinf;
+    case VR_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_minf;
+    case VR_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+        goto a_pinf;
+      case VR_GT:
+        goto a_minf;
+      default:
+        goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+      a_minf:
+        if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+          goto inf_add_inf;
+        else
+          goto minf;
+      case VR_GT:
+      a_pinf:
+        if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+        inf_add_inf:
+          return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+        }
+        else
+          goto pinf;
+      default:
+      inf_mul_zero:
+        PPL_ASSERT(To_Policy::check_inf_mul_zero);
+        return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      }
+    native:
+      return add_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_pinf;
+    case VR_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_minf;
+    case VR_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+        goto a_pinf;
+      case VR_GT:
+        goto a_minf;
+      default:
+        goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+      a_minf:
+        if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+          goto inf_sub_inf;
+        else
+          goto pinf;
+      case VR_GT:
+      a_pinf:
+        if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+        inf_sub_inf:
+          return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+        }
+        else
+          goto minf;
+      default:
+      inf_mul_zero:
+        PPL_ASSERT(To_Policy::check_inf_mul_zero);
+        return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      }
+    native:
+      return sub_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+        goto pinf;
+      case VR_GT:
+        goto minf;
+      default:
+        goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      case VR_GT:
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      default:
+      div_zero:
+        PPL_ASSERT(To_Policy::check_div_zero);
+        return assign_nan<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return div<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+        goto pinf;
+      case VR_GT:
+        goto minf;
+      default:
+        goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      case VR_GT:
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      default:
+      div_zero:
+        PPL_ASSERT(To_Policy::check_div_zero);
+        return assign_nan<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return idiv<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+                   || is_pinf<From1_Policy>(x))) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  else {
+    if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = x;
+      return V_EQ;
+    }
+    else {
+    native:
+      return rem<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+add_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return add_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+sub_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return sub_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+mul_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return mul_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+div_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return div_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+smod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+                   || is_pinf<From_Policy>(x))) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  else {
+  native:
+    return smod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+umod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+                   || is_pinf<From_Policy>(x))) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  else {
+  native:
+    return umod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return sqrt<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+    return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+  else
+    return gcd<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+          typename From1_Policy, typename From2_Policy,
+          typename To1, typename To2, typename To3,
+          typename From1, typename From2>
+inline Result
+gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+           Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To1_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+    s = 0;
+    t = y > 0 ? -1 : 1;
+    return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+  }
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+    s = x > 0 ? -1 : 1;
+    t = 0;
+    return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+  }
+  else
+    return gcdext<To1_Policy, To2_Policy, To3_Policy, From1_Policy, From2_Policy>(to, s, t, x, y, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+           || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else
+    return lcm<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline Result_Relation
+cmp_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return VR_EMPTY;
+  else if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y) ? VR_EQ : VR_LT;
+  else if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y) ? VR_EQ : VR_GT;
+  else {
+    if (is_minf<Policy2>(y))
+      return VR_GT;
+    if (is_pinf<Policy2>(y))
+      return VR_LT;
+  native:
+    return cmp<Policy1, Policy2>(x, y);
+  }
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+ native:
+  return lt_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+  return lt_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+ native:
+  return le_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+  return le_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y);
+  else if (is_minf<Policy2>(y) || is_pinf<Policy2>(y))
+    return false;
+ native:
+  return eq_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+  return !eq_ext<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+           const Numeric_Format& format, Rounding_Dir dir) {
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x)) {
+    os << "nan";
+    return V_NAN;
+  }
+  if (is_minf<Policy>(x)) {
+    os << "-inf";
+    return V_EQ;
+  }
+  if (is_pinf<Policy>(x)) {
+    os << "+inf";
+    return V_EQ;
+  }
+ native:
+  return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+  return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_ext_defs_hh)
diff --git a/src/checked_float_inlines.hh b/src/checked_float_inlines.hh
new file mode 100644
index 0000000..89946d4
--- /dev/null
+++ b/src/checked_float_inlines.hh
@@ -0,0 +1,1234 @@
+/* Specialized "checked" functions for native floating-point numbers.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_float_inlines_hh
+#define PPL_checked_float_inlines_hh 1
+
+#include "compiler.hh"
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+multiply_add(float x, float y, float z) {
+#if PPL_HAVE_DECL_FMAF && defined(FP_FAST_FMAF) \
+  && !defined(__alpha) && !defined(__FreeBSD__)
+  return fmaf(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline double
+multiply_add(double x, double y, double z) {
+#if PPL_HAVE_DECL_FMA && defined(FP_FAST_FMA) \
+  && !defined(__alpha) && !defined(__FreeBSD__)
+  return fma(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline long double
+multiply_add(long double x, long double y, long double z) {
+#if PPL_HAVE_DECL_FMAL && defined(FP_FAST_FMAL) \
+  && !defined(__alpha) && !defined(__FreeBSD__)
+  return fmal(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if PPL_HAVE_DECL_RINTF
+inline float
+round_to_integer(float x) {
+  return rintf(x);
+}
+#endif
+
+inline double
+round_to_integer(double x) {
+  return rint(x);
+}
+
+#if PPL_HAVE_DECL_RINTL
+inline long double
+round_to_integer(long double x) {
+  return rintl(x);
+}
+#elif !PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+// If proper long doubles are not provided, this is most likely
+// because long double and double are the same type: use rint().
+inline long double
+round_to_integer(long double x) {
+  return rint(x);
+}
+#elif defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// On Cygwin, we have proper long doubles but rintl() is not defined:
+// luckily, one machine instruction is enough to save the day.
+inline long double
+round_to_integer(long double x) {
+  long double i;
+  __asm__ ("frndint" : "=t" (i) : "0" (x));
+  return i;
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+  return round_direct(dir) || round_not_requested(dir);
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+  return round_inverse(dir);
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = a * b = 0.03
+//   c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+//   c_i = -c_i = 0.03
+//   c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline void
+limit_precision(const float& v) {
+  PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const double& v) {
+  PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const long double&) {
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+  Float<T> f(v);
+  if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan()))
+    return V_NAN;
+  if (inf) {
+    if (Policy::has_infinity) {
+      int sign_inf = f.u.binary.inf_sign();
+      if (sign_inf < 0)
+        return V_EQ_MINUS_INFINITY;
+      if (sign_inf > 0)
+        return V_EQ_PLUS_INFINITY;
+    }
+    else
+      PPL_ASSERT(f.u.binary.inf_sign() == 0);
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return V_LGE;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_nan, f.u.binary.is_nan());
+}
+
+template <typename Policy, typename T>
+inline bool
+is_inf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() != 0));
+}
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() < 0));
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() > 0));
+}
+
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+  return round_to_integer(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_special_float(T& v, Result_Class c, Rounding_Dir) {
+  PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+  switch (c) {
+  case VC_MINUS_INFINITY:
+    v = -HUGE_VAL;
+    return V_EQ_MINUS_INFINITY;
+  case VC_PLUS_INFINITY:
+    v = HUGE_VAL;
+    return V_EQ_PLUS_INFINITY;
+  case VC_NAN:
+    v = PPL_NAN;
+    return V_NAN;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN | V_UNREPRESENTABLE;
+  }
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+  Float<T> f(v);
+  PPL_ASSERT(!f.u.binary.is_nan());
+  PPL_ASSERT(f.u.binary.inf_sign() >= 0);
+  if (f.u.binary.zero_sign() > 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+  Float<T> f(v);
+  PPL_ASSERT(!f.u.binary.is_nan());
+  PPL_ASSERT(f.u.binary.inf_sign() <= 0);
+  if (f.u.binary.zero_sign() < 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (!f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    pred_float(to);
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    succ_float(to);
+    return V_LT;
+  }
+  return V_GT;
+}
+
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact
+      && !round_not_needed(dir) && round_strict_relation(dir))
+    fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact
+      && !round_not_needed(dir) && round_strict_relation(dir)) {
+    switch (fpu_check_inexact()) {
+    case 0:
+      return V_EQ;
+    case -1:
+      goto unknown;
+    case 1:
+      break;
+    }
+    switch (round_dir(dir)) {
+    case ROUND_DOWN:
+      return V_GT;
+    case ROUND_UP:
+      return V_LT;
+    default:
+      return V_NE;
+    }
+  }
+  else {
+  unknown:
+    switch (round_dir(dir)) {
+    case ROUND_DOWN:
+      return V_GE;
+    case ROUND_UP:
+      return V_LE;
+    default:
+      return V_LGE;
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else if (fpu_inverse_rounding(dir)) {
+    From tmp = -from;
+    to = tmp;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(from);
+    to = from;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) > sizeof(To))
+    return assign_float_float_inexact<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign_float_float_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+floor_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (fpu_direct_rounding(ROUND_DOWN))
+    to = round_to_integer(from);
+  else if (fpu_inverse_rounding(ROUND_DOWN)) {
+    to = round_to_integer(-from);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(ROUND_DOWN));
+    limit_precision(from);
+    to = round_to_integer(from);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+ceil_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (fpu_direct_rounding(ROUND_UP))
+    to = round_to_integer(from);
+  else if (fpu_inverse_rounding(ROUND_UP)) {
+    to = round_to_integer(-from);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(ROUND_UP));
+    limit_precision(from);
+    to = round_to_integer(from);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+trunc_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (from >= 0)
+    return floor<To_Policy, From_Policy>(to, from, dir);
+  else
+    return ceil<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_add_inf
+      && is_inf_float<From1_Policy>(x) && x == -y) {
+    return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x + y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = -x - y;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x + y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_sub_inf
+      && is_inf_float<From1_Policy>(x) && x == y) {
+    return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x - y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = y - x;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x - y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y))
+          ||
+          (y == 0 && is_inf_float<From1_Policy>(x)))) {
+    return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x * y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = x * -y;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x * y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_div_inf
+      && is_inf_float<From1_Policy>(x) && is_inf_float<From2_Policy>(y)) {
+    return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+  }
+  if (To_Policy::check_div_zero && y == 0) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x / y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = x / -y;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x / y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+idiv_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type temp;
+  // The inexact check is useless
+  dir = round_dir(dir);
+  Result r = div<To_Policy, From1_Policy, From2_Policy>(temp, x, y, dir);
+  if (result_class(r) != VC_NORMAL) {
+    to = temp;
+    return r;
+  }
+  Result r1 = trunc<To_Policy, To_Policy>(to, temp, ROUND_NOT_NEEDED);
+  PPL_ASSERT(r1 == V_EQ);
+  if (r == V_EQ || to != temp)
+    return r1;
+  // FIXME: Prove that it is impossible to return a strict relation
+  return (dir == ROUND_UP) ? V_LE : V_GE;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (To_Policy::check_inf_mod && is_inf_float<From1_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  if (To_Policy::check_div_zero && y == 0) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = std::fmod(x, y);
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return V_EQ;
+}
+
+struct Float_2exp {
+  const_bool_nodef(has_nan, false);
+  const_bool_nodef(has_infinity, false);
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    add<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    sub<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    mul<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    div<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  Type m = 1ULL << exp;
+  rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+  Type m2 = m / 2;
+  if (to < -m2)
+    return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+  else if (to >= m2)
+    return sub_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  Type m = 1ULL << exp;
+  rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+  if (to < 0)
+    return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  to = std::abs(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (To_Policy::check_sqrt_neg && from < 0) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = std::sqrt(from);
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(from);
+    to = std::sqrt(from);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_float(const Type x) {
+  if (x > 0)
+    return VR_GT;
+  if (x < 0)
+    return VR_LT;
+  if (x == 0)
+    return VR_EQ;
+  return VR_EMPTY;
+}
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_float(const Type x, const Type y) {
+  if (x > y)
+    return VR_GT;
+  if (x < y)
+    return VR_LT;
+  if (x == y)
+    return VR_EQ;
+  return VR_EMPTY;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    to = from;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof_to_bits(sizeof(From)) > Float<To>::Binary::MANTISSA_BITS)
+    return assign_float_int_inexact<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    {
+      Float<T> f;
+      f.u.binary.set_max(true);
+      to = f.value();
+      return V_LT_INF;
+    }
+  case ROUND_DOWN: // Fall through.
+  case ROUND_IGNORE:
+    to = -HUGE_VAL;
+    return V_GT_MINUS_INFINITY;
+  default:
+    PPL_UNREACHABLE;
+    return V_GT_MINUS_INFINITY;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_DOWN:
+    {
+      Float<T> f;
+      f.u.binary.set_max(false);
+      to = f.value();
+      return V_GT_SUP;
+    }
+  case ROUND_UP: // Fall through.
+  case ROUND_IGNORE:
+    to = HUGE_VAL;
+    return V_LT_PLUS_INFINITY;
+  default:
+    PPL_UNREACHABLE;
+    return V_LT_PLUS_INFINITY;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& from, Rounding_Dir dir) {
+  int sign = sgn(from);
+  if (sign == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  mpz_srcptr from_z = from.get_mpz_t();
+  size_t exponent = mpz_sizeinbase(from_z, 2) - 1;
+  if (exponent > size_t(Float<T>::Binary::EXPONENT_MAX)) {
+    if (sign < 0)
+      return set_neg_overflow_float<To_Policy>(to, dir);
+    else
+      return set_pos_overflow_float<To_Policy>(to, dir);
+  }
+  unsigned long zeroes = mpn_scan1(from_z->_mp_d, 0);
+  size_t meaningful_bits = exponent - zeroes;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  if (exponent > Float<T>::Binary::MANTISSA_BITS)
+    mpz_tdiv_q_2exp(mantissa,
+                    from_z,
+                    exponent - Float<T>::Binary::MANTISSA_BITS);
+  else
+    mpz_mul_2exp(mantissa, from_z, Float<T>::Binary::MANTISSA_BITS - exponent);
+  Float<T> f;
+  f.u.binary.build(sign < 0, mantissa, static_cast<long>(exponent));
+  mpz_clear(mantissa);
+  to = f.value();
+  if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+    if (sign < 0)
+      return round_lt_float<To_Policy>(to, dir);
+    else
+      return round_gt_float<To_Policy>(to, dir);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) {
+  const mpz_class& numer = from.get_num();
+  const mpz_class& denom = from.get_den();
+  if (denom == 1)
+    return assign_float_mpz<To_Policy, From_Policy>(to, numer, dir);
+  mpz_srcptr numer_z = numer.get_mpz_t();
+  mpz_srcptr denom_z = denom.get_mpz_t();
+  int sign = sgn(numer);
+  long exponent = static_cast<long>(mpz_sizeinbase(numer_z, 2))
+    - static_cast<long>(mpz_sizeinbase(denom_z, 2));
+  if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+    to = 0;
+  inexact:
+    if (sign < 0)
+      return round_lt_float<To_Policy>(to, dir);
+    else
+      return round_gt_float<To_Policy>(to, dir);
+  }
+  if (exponent > Float<T>::Binary::EXPONENT_MAX + 1) {
+  overflow:
+    if (sign < 0)
+      return set_neg_overflow_float<To_Policy>(to, dir);
+    else
+      return set_pos_overflow_float<To_Policy>(to, dir);
+  }
+  unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+  if (exponent < Float<T>::Binary::EXPONENT_MIN) {
+    long diff = Float<T>::Binary::EXPONENT_MIN - exponent;
+    needed_bits -= static_cast<unsigned int>(diff);
+  }
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  {
+    long shift = static_cast<long>(needed_bits) - exponent;
+    if (shift > 0) {
+      mpz_mul_2exp(mantissa, numer_z, static_cast<unsigned long>(shift));
+      numer_z = mantissa;
+    }
+    else if (shift < 0) {
+      shift = -shift;
+      mpz_mul_2exp(mantissa, denom_z, static_cast<unsigned long>(shift));
+      denom_z = mantissa;
+    }
+  }
+  mpz_t r;
+  mpz_init(r);
+  mpz_tdiv_qr(mantissa, r, numer_z, denom_z);
+  size_t bits = mpz_sizeinbase(mantissa, 2);
+  bool inexact = (mpz_sgn(r) != 0);
+  mpz_clear(r);
+  if (bits == needed_bits + 1) {
+    inexact = (inexact || mpz_odd_p(mantissa));
+    mpz_tdiv_q_2exp(mantissa, mantissa, 1);
+  }
+  else
+    --exponent;
+  if (exponent > Float<T>::Binary::EXPONENT_MAX) {
+    mpz_clear(mantissa);
+    goto overflow;
+  }
+  else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+    // Denormalized.
+    exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+  }
+  Float<T> f;
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (inexact)
+    goto inexact;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y))
+          ||
+          (y == 0 && is_inf_float<From1_Policy>(x)))) {
+    return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+  }
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = multiply_add(x, y, to);
+  else if (fpu_inverse_rounding(dir)) {
+    to = multiply_add(-x, y, -to);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    limit_precision(to);
+    to = multiply_add(x, y, to);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y))
+          ||
+          (y == 0 && is_inf_float<From1_Policy>(x)))) {
+    return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+  }
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = multiply_add(x, -y, to);
+  else if (fpu_inverse_rounding(dir)) {
+    to = multiply_add(x, y, -to);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    limit_precision(to);
+    to = multiply_add(x, -y, to);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename From>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const From from) {
+  to = from;
+}
+
+template <>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const long double from) {
+  to = 0;
+  if (from == 0.0L)
+    return;
+  mpz_class& num = to.get_num();
+  mpz_class& den = to.get_den();
+  int exp;
+  long double n = std::frexp(from, &exp);
+  bool neg = false;
+  if (n < 0.0L) {
+    neg = true;
+    n = -n;
+  }
+  const long double mult = static_cast<long double>(ULONG_MAX) + 1.0L;
+  const unsigned int bits = sizeof(unsigned long) * CHAR_BIT;
+  while (true) {
+    n *= mult;
+    exp -= bits;
+    const long double intpart = std::floor(n);
+    num += static_cast<unsigned long>(intpart);
+    n -= intpart;
+    if (n == 0.0L)
+      break;
+    num <<= bits;
+  }
+  if (exp < 0)
+    den <<= -exp;
+  else
+    num <<= exp;
+  if (neg)
+    to = -to;
+  to.canonicalize();
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+             Rounding_Dir) {
+  if (from == 0)
+    os << "0";
+  else if (is_minf<Policy>(from))
+    os << "-inf";
+  else if (is_pinf<Policy>(from))
+    os << "+inf";
+  else if (is_nan<Policy>(from))
+    os << "nan";
+  else {
+    mpq_class q;
+    assign_mpq_numeric_float(q, from);
+    std::string s = float_mpq_to_string(q);
+    os << s;
+  }
+  return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, double, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_CLASSIFY(classify_float, float)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, float)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, float)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, float)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, float)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, float, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, float, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, float)
+PPL_SPECIALIZE_IS_INT(is_int_float, float)
+PPL_SPECIALIZE_FLOOR(floor_float, float, float)
+PPL_SPECIALIZE_CEIL(ceil_float, float, float)
+PPL_SPECIALIZE_TRUNC(trunc_float, float, float)
+PPL_SPECIALIZE_NEG(neg_float, float, float)
+PPL_SPECIALIZE_ABS(abs_float, float, float)
+PPL_SPECIALIZE_ADD(add_float, float, float, float)
+PPL_SPECIALIZE_SUB(sub_float, float, float, float)
+PPL_SPECIALIZE_MUL(mul_float, float, float, float)
+PPL_SPECIALIZE_DIV(div_float, float, float, float)
+PPL_SPECIALIZE_REM(rem_float, float, float, float)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, float, float)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, float, float)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, float, float)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, float, float)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, float, float)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, float, float)
+PPL_SPECIALIZE_SQRT(sqrt_float, float, float)
+PPL_SPECIALIZE_GCD(gcd_exact, float, float, float)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, float, float, float, float, float)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, float, float, float)
+PPL_SPECIALIZE_SGN(sgn_float, float)
+PPL_SPECIALIZE_CMP(cmp_float, float, float)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, float, float, float)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, float, float, float)
+PPL_SPECIALIZE_INPUT(input_generic, float)
+PPL_SPECIALIZE_OUTPUT(output_float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, double)
+PPL_SPECIALIZE_IS_INT(is_int_float, double)
+PPL_SPECIALIZE_FLOOR(floor_float, double, double)
+PPL_SPECIALIZE_CEIL(ceil_float, double, double)
+PPL_SPECIALIZE_TRUNC(trunc_float, double, double)
+PPL_SPECIALIZE_NEG(neg_float, double, double)
+PPL_SPECIALIZE_ABS(abs_float, double, double)
+PPL_SPECIALIZE_ADD(add_float, double, double, double)
+PPL_SPECIALIZE_SUB(sub_float, double, double, double)
+PPL_SPECIALIZE_MUL(mul_float, double, double, double)
+PPL_SPECIALIZE_DIV(div_float, double, double, double)
+PPL_SPECIALIZE_REM(rem_float, double, double, double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, double, double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, double, double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, double, double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, double, double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, double, double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, double, double)
+PPL_SPECIALIZE_SQRT(sqrt_float, double, double)
+PPL_SPECIALIZE_GCD(gcd_exact, double, double, double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, double, double, double, double, double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, double, double, double)
+PPL_SPECIALIZE_SGN(sgn_float, double)
+PPL_SPECIALIZE_CMP(cmp_float, double, double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, double, double, double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, double, double, double)
+PPL_SPECIALIZE_INPUT(input_generic, double)
+PPL_SPECIALIZE_OUTPUT(output_float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, long double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, long double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, long double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, long double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, long double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, long double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, long double)
+PPL_SPECIALIZE_IS_INT(is_int_float, long double)
+PPL_SPECIALIZE_FLOOR(floor_float, long double, long double)
+PPL_SPECIALIZE_CEIL(ceil_float, long double, long double)
+PPL_SPECIALIZE_TRUNC(trunc_float, long double, long double)
+PPL_SPECIALIZE_NEG(neg_float, long double, long double)
+PPL_SPECIALIZE_ABS(abs_float, long double, long double)
+PPL_SPECIALIZE_ADD(add_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB(sub_float, long double, long double, long double)
+PPL_SPECIALIZE_MUL(mul_float, long double, long double, long double)
+PPL_SPECIALIZE_DIV(div_float, long double, long double, long double)
+PPL_SPECIALIZE_REM(rem_float, long double, long double, long double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, long double, long double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, long double, long double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, long double, long double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, long double, long double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, long double, long double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, long double, long double)
+PPL_SPECIALIZE_SQRT(sqrt_float, long double, long double)
+PPL_SPECIALIZE_GCD(gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, long double, long double, long double,
+                  long double, long double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_SGN(sgn_float, long double)
+PPL_SPECIALIZE_CMP(cmp_float, long double, long double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_INPUT(input_generic, long double)
+PPL_SPECIALIZE_OUTPUT(output_float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_inlines.hh b/src/checked_inlines.hh
new file mode 100644
index 0000000..4537c9b
--- /dev/null
+++ b/src/checked_inlines.hh
@@ -0,0 +1,658 @@
+/* Abstract checked arithmetic functions: fall-backs.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_inlines_hh
+#define PPL_checked_inlines_hh 1
+
+#include "globals_types.hh"
+#include "meta_programming.hh"
+#include "C_Integer.hh"
+#include "assert.hh"
+
+/*! \brief
+  Performs the test <CODE>a < b</CODE> avoiding the warning about the
+  comparison being always false due to limited range of data type.
+  FIXME: we have not found a working solution. The GCC option
+  -Wno-type-limits suppresses the warning
+*/
+#define PPL_LT_SILENT(a, b) ((a) < (b))
+#define PPL_GT_SILENT(a, b) ((a) > (b))
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename T1, typename T2>
+struct Safe_Conversion : public False {
+};
+template <typename T>
+struct Safe_Conversion<T, T> : public True {
+};
+
+#define PPL_SAFE_CONVERSION(To, From)                        \
+  template <> struct Safe_Conversion<PPL_U(To), PPL_U(From)> \
+    : public True { }
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, signed char);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, unsigned char);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, signed char);
+PPL_SAFE_CONVERSION(signed int, signed short);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT
+PPL_SAFE_CONVERSION(signed int, unsigned short);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, signed char);
+PPL_SAFE_CONVERSION(signed long, signed short);
+PPL_SAFE_CONVERSION(signed long, signed int);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned int);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, signed char);
+PPL_SAFE_CONVERSION(signed long long, signed short);
+PPL_SAFE_CONVERSION(signed long long, signed int);
+PPL_SAFE_CONVERSION(signed long long, signed long);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned long);
+#endif
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned short, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned short, unsigned char);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned int, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned int, unsigned char);
+PPL_SAFE_CONVERSION(unsigned int, unsigned short);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long, unsigned int);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned int);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned long);
+
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, char);
+PPL_SAFE_CONVERSION(float, signed char);
+PPL_SAFE_CONVERSION(float, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed short);
+PPL_SAFE_CONVERSION(float, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed int);
+PPL_SAFE_CONVERSION(float, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long);
+PPL_SAFE_CONVERSION(float, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long long);
+PPL_SAFE_CONVERSION(float, unsigned long long);
+#endif
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, char);
+PPL_SAFE_CONVERSION(double, signed char);
+PPL_SAFE_CONVERSION(double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed short);
+PPL_SAFE_CONVERSION(double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed int);
+PPL_SAFE_CONVERSION(double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long);
+PPL_SAFE_CONVERSION(double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long long);
+PPL_SAFE_CONVERSION(double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(double, float);
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, char);
+PPL_SAFE_CONVERSION(long double, signed char);
+PPL_SAFE_CONVERSION(long double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed short);
+PPL_SAFE_CONVERSION(long double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed int);
+PPL_SAFE_CONVERSION(long double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long);
+PPL_SAFE_CONVERSION(long double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long long);
+PPL_SAFE_CONVERSION(long double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(long double, float);
+PPL_SAFE_CONVERSION(long double, double);
+
+PPL_SAFE_CONVERSION(mpz_class, char);
+PPL_SAFE_CONVERSION(mpz_class, signed char);
+PPL_SAFE_CONVERSION(mpz_class, signed short);
+PPL_SAFE_CONVERSION(mpz_class, signed int);
+PPL_SAFE_CONVERSION(mpz_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpz_class, unsigned char);
+PPL_SAFE_CONVERSION(mpz_class, unsigned short);
+PPL_SAFE_CONVERSION(mpz_class, unsigned int);
+PPL_SAFE_CONVERSION(mpz_class, unsigned long);
+// GMP's API does not support unsigned long long.
+
+PPL_SAFE_CONVERSION(mpq_class, char);
+PPL_SAFE_CONVERSION(mpq_class, signed char);
+PPL_SAFE_CONVERSION(mpq_class, signed short);
+PPL_SAFE_CONVERSION(mpq_class, signed int);
+PPL_SAFE_CONVERSION(mpq_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpq_class, unsigned char);
+PPL_SAFE_CONVERSION(mpq_class, unsigned short);
+PPL_SAFE_CONVERSION(mpq_class, unsigned int);
+PPL_SAFE_CONVERSION(mpq_class, unsigned long);
+// GMP's API does not support unsigned long long.
+PPL_SAFE_CONVERSION(mpq_class, float);
+PPL_SAFE_CONVERSION(mpq_class, double);
+// GMP's API does not support long double.
+
+#undef PPL_SAFE_CONVERSION
+
+template <typename Policy, typename Type>
+struct PPL_FUNCTION_CLASS(construct)<Policy, Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    new (&to) Type(from);
+    return V_EQ;
+  }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+struct PPL_FUNCTION_CLASS(construct) {
+  static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+    new (&to) To();
+    return assign<To_Policy, From_Policy>(to, from, dir);
+  }
+};
+
+template <typename To_Policy, typename To>
+struct PPL_FUNCTION_CLASS(construct_special) {
+  static inline Result function(To& to, Result_Class r, Rounding_Dir dir) {
+    new (&to) To();
+    return assign_special<To_Policy>(to, r, dir);
+  }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_exact(To& to, const From& from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline typename Enable_If<Is_Same<To_Policy, From_Policy>::value, void>::type
+copy_generic(Type& to, const Type& from) {
+  to = from;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+  if (from < 0)
+    return neg<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From>
+inline void
+gcd_exact_no_abs(To& to, const From& x, const From& y) {
+  To w_x = x;
+  To w_y = y;
+  To remainder;
+  while (w_y != 0) {
+    // The following is derived from the assumption that w_x % w_y
+    // is always representable. This is true for both native integers
+    // and IEC 559 floating point numbers.
+    rem<To_Policy, From1_Policy, From2_Policy>(remainder, w_x, w_y,
+                                               ROUND_NOT_NEEDED);
+    w_x = w_y;
+    w_y = remainder;
+  }
+  to = w_x;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(to, x, y);
+  return abs<To_Policy, To_Policy>(to, to, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+          typename From1_Policy, typename From2_Policy,
+          typename To1, typename To2, typename To3,
+          typename From1, typename From2>
+inline Result
+gcdext_exact(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+             Rounding_Dir dir) {
+  // In case this becomes a bottleneck, we may consider using the
+  // Stehle'-Zimmermann algorithm (see R. Crandall and C. Pomerance,
+  // Prime Numbers - A Computational Perspective, Second Edition,
+  // Springer, 2005).
+  if (y == 0) {
+    if (x == 0) {
+      s = 0;
+      t = 1;
+      return V_EQ;
+    }
+    else {
+      if (x < 0)
+        s = -1;
+      else
+        s = 1;
+      t = 0;
+      return abs<To1_Policy, From1_Policy>(to, x, dir);
+    }
+  }
+
+  s = 1;
+  t = 0;
+  bool negative_x = x < 0;
+  bool negative_y = y < 0;
+
+  Result r;
+  r = abs<To1_Policy, From1_Policy>(to, x, dir);
+  if (r != V_EQ)
+    return r;
+
+  From2 a_y;
+  r = abs<To1_Policy, From2_Policy>(a_y, y, dir);
+  if (r != V_EQ)
+    return r;
+
+  // If PPL_MATCH_GMP_GCDEXT is defined then s is favored when the absolute
+  // values of the given numbers are equal.  For instance if x and y
+  // are both 5 then s will be 1 and t will be 0, instead of the other
+  // way round.  This is to match the behavior of GMP.
+#define PPL_MATCH_GMP_GCDEXT 1
+#ifdef PPL_MATCH_GMP_GCDEXT
+  if (to == a_y)
+    goto sign_check;
+#endif
+
+  {
+    To2 v1 = 0;
+    To3 v2 = 1;
+    To1 v3 = static_cast<To1>(a_y);
+    while (true) {
+      To1 q = to / v3;
+      // Remainder, next candidate GCD.
+      To1 t3 = to - q*v3;
+      To2 t1 = s - static_cast<To2>(q)*v1;
+      To3 t2 = t - static_cast<To3>(q)*v2;
+      s = v1;
+      t = v2;
+      to = v3;
+      if (t3 == 0)
+        break;
+      v1 = t1;
+      v2 = t2;
+      v3 = t3;
+    }
+  }
+
+#ifdef PPL_MATCH_GMP_GCDEXT
+ sign_check:
+#endif
+  if (negative_x) {
+    r = neg<To2_Policy, To2_Policy>(s, s, dir);
+    if (r != V_EQ)
+      return r;
+  }
+  if (negative_y)
+    return neg<To3_Policy, To3_Policy>(t, t, dir);
+  return V_EQ;
+#undef PPL_MATCH_GMP_GCDEXT
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (x == 0 || y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  To a_x;
+  To a_y;
+  Result r;
+  r = abs<From1_Policy, From1_Policy>(a_x, x, dir);
+  if (r != V_EQ)
+    return r;
+  r = abs<From2_Policy, From2_Policy>(a_y, y, dir);
+  if (r != V_EQ)
+    return r;
+  To gcd;
+  gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(gcd, a_x, a_y);
+  // The following is derived from the assumption that a_x / gcd(a_x, a_y)
+  // is always representable. This is true for both native integers
+  // and IEC 559 floating point numbers.
+  div<To_Policy, From1_Policy, To_Policy>(to, a_x, gcd, ROUND_NOT_NEEDED);
+  return mul<To_Policy, To_Policy, From2_Policy>(to, to, a_y, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_generic(const Type& x) {
+  if (x > 0)
+    return VR_GT;
+  if (x == 0)
+    return VR_EQ;
+  return VR_LT;
+}
+
+template <typename T1, typename T2, typename Enable = void>
+struct Safe_Int_Comparison : public False {
+};
+
+template <typename T1, typename T2>
+struct Safe_Int_Comparison<T1, T2, typename Enable_If<(C_Integer<T1>::value && C_Integer<T2>::value)>::type>
+  : public Bool<(C_Integer<T1>::is_signed
+                 ? (C_Integer<T2>::is_signed
+                    || sizeof(T2) < sizeof(T1)
+                    || sizeof(T2) < sizeof(int))
+                 : (!C_Integer<T2>::is_signed
+                    || sizeof(T1) < sizeof(T2)
+                    || sizeof(T1) < sizeof(int)))> {
+};
+
+
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+                           || Safe_Conversion<T1, T2>::value
+                           || Safe_Conversion<T2, T1>::value), bool>::type
+lt(const T1& x, const T2& y) {
+  return x < y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+                           || Safe_Conversion<T1, T2>::value
+                           || Safe_Conversion<T2, T1>::value), bool>::type
+le(const T1& x, const T2& y) {
+  return x <= y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+                           || Safe_Conversion<T1, T2>::value
+                           || Safe_Conversion<T2, T1>::value), bool>::type
+eq(const T1& x, const T2& y) {
+  return x == y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+lt(const S& x, const U& y) {
+  return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) < y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+lt(const U& x, const S& y) {
+  return y >= 0 && x < static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+le(const S& x, const U& y) {
+  return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) <= y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+le(const U& x, const S& y) {
+  return y >= 0 && x <= static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+eq(const S& x, const U& y) {
+  return x >= 0 && static_cast<typename C_Integer<S>::other_type>(x) == y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+eq(const U& x, const S& y) {
+  return y >= 0 && x == static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+                           && !Safe_Conversion<T2, T1>::value
+                           && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+eq(const T1& x, const T2& y) {
+  PPL_DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_CHECK);
+  // FIXME: We can do this also without fpu inexact check using a
+  // conversion back and forth and then testing equality.  We should
+  // code this in checked_float_inlines.hh, probably it's faster also
+  // if fpu supports inexact check.
+  PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+  return r == V_EQ && x == tmp;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+                           && !Safe_Conversion<T2, T1>::value
+                           && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+lt(const T1& x, const T2& y) {
+  PPL_DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_UP);
+  if (!result_representable(r))
+    return true;
+  switch (result_relation(r)) {
+  case VR_EQ:
+  case VR_LT:
+  case VR_LE:
+    return x < tmp;
+  default:
+    return false;
+  }
+}
+
+template <typename T1, typename T2>
+inline typename
+Enable_If<(!Safe_Conversion<T1, T2>::value
+           && !Safe_Conversion<T2, T1>::value
+           && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+le(const T1& x, const T2& y) {
+  PPL_DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, (ROUND_UP | ROUND_STRICT_RELATION));
+  // FIXME: We can do this also without fpu inexact check using a
+  // conversion back and forth and then testing equality.  We should
+  // code this in checked_float_inlines.hh, probably it's faster also
+  // if fpu supports inexact check.
+  PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+  if (!result_representable(r))
+    return true;
+  switch (result_relation(r)) {
+  case VR_EQ:
+    return x <= tmp;
+  case VR_LT:
+    return x < tmp;
+  case VR_LE:
+  case VR_GE:
+  case VR_LGE:
+    // See comment above.
+    PPL_UNREACHABLE;
+    return false;
+  default:
+    return false;
+  }
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+lt_p(const Type1& x, const Type2& y) {
+  return lt(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+le_p(const Type1& x, const Type2& y) {
+  return le(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+eq_p(const Type1& x, const Type2& y) {
+  return eq(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline Result_Relation
+cmp_generic(const Type1& x, const Type2& y) {
+  if (lt(y, x))
+    return VR_GT;
+  if (lt(x, y))
+    return VR_LT;
+  return VR_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+assign_nan(Type& to, Result r) {
+  assign_special<Policy>(to, VC_NAN, ROUND_IGNORE);
+  return r;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+  PPL_DIRTY_TEMP(mpq_class, q);
+  Result r = input_mpq(q, is);
+  Result_Class c = result_class(r);
+  switch (c) {
+  case VC_MINUS_INFINITY:
+  case VC_PLUS_INFINITY:
+    return assign_special<Policy>(to, c, dir);
+  case VC_NAN:
+    return assign_nan<Policy>(to, r);
+  default:
+    break;
+  }
+  PPL_ASSERT(r == V_EQ);
+  return assign<Policy, void>(to, q, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_inlines_hh)
diff --git a/src/checked_int_inlines.hh b/src/checked_int_inlines.hh
new file mode 100644
index 0000000..3ebd1a3
--- /dev/null
+++ b/src/checked_int_inlines.hh
@@ -0,0 +1,1952 @@
+/* Specialized "checked" functions for native integer numbers.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_int_inlines_hh
+#define PPL_checked_int_inlines_hh 1
+
+#include "C_Integer.hh"
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+
+#if !PPL_HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !PPL_HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef PPL_HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+  static const Type plus_infinity = C_Integer<Type>::max;
+  static const Type minus_infinity = ((C_Integer<Type>::min >= 0)
+                                      ? (C_Integer<Type>::max - 1)
+                                      : C_Integer<Type>::min);
+  static const Type not_a_number
+  = ((C_Integer<Type>::min >= 0)
+     ? (C_Integer<Type>::max - 2 * (Policy::has_infinity ? 1 : 0))
+     : (C_Integer<Type>::min + (Policy::has_infinity ? 1 : 0)));
+  static const Type min
+  = (C_Integer<Type>::min
+     + ((C_Integer<Type>::min >= 0)
+        ? 0
+        : ((Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))));
+  static const Type max
+  = (C_Integer<Type>::max
+     - ((C_Integer<Type>::min >= 0)
+        ? (2 * (Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))
+        : (Policy::has_infinity ? 1 : 0)));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT_INF;
+  }
+  else {
+    if (Policy::has_infinity) {
+      to = Extended_Int<Policy, To>::minus_infinity;
+      return V_GT_MINUS_INFINITY;
+    }
+    return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT_SUP;
+  }
+  else {
+    if (Policy::has_infinity) {
+      to = Extended_Int<Policy, To>::plus_infinity;
+      return V_LT_PLUS_INFINITY;
+    }
+    return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    if (to == Extended_Int<Policy, To>::min) {
+      if (Policy::has_infinity) {
+        to = Extended_Int<Policy, To>::minus_infinity;
+        return V_GT_MINUS_INFINITY;
+      }
+      return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+    }
+    else {
+      --to;
+      return V_GT;
+    }
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    if (to == Extended_Int<Policy, To>::max) {
+      if (Policy::has_infinity) {
+        to = Extended_Int<Policy, To>::plus_infinity;
+        return V_LT_PLUS_INFINITY;
+      }
+      return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+    }
+    else {
+      ++to;
+      return V_LT;
+    }
+  }
+  return V_GT;
+}
+
+PPL_SPECIALIZE_COPY(copy_generic, char)
+PPL_SPECIALIZE_COPY(copy_generic, signed char)
+PPL_SPECIALIZE_COPY(copy_generic, signed short)
+PPL_SPECIALIZE_COPY(copy_generic, signed int)
+PPL_SPECIALIZE_COPY(copy_generic, signed long)
+PPL_SPECIALIZE_COPY(copy_generic, signed long long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned char)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned short)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned int)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+  if (Policy::has_nan
+      && (nan || sign)
+      && v == Extended_Int<Policy, Type>::not_a_number)
+    return V_NAN;
+  if (!inf && !sign)
+    return V_LGE;
+  if (Policy::has_infinity) {
+    if (v == Extended_Int<Policy, Type>::minus_infinity)
+      return inf ? V_EQ_MINUS_INFINITY : V_LT;
+    if (v == Extended_Int<Policy, Type>::plus_infinity)
+      return inf ? V_EQ_PLUS_INFINITY : V_GT;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_int, char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+  return Policy::has_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_int, char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+  return Policy::has_infinity
+    && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_int, char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+  return Policy::has_infinity
+    && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+  return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_int, char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed short)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed int)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned char)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned short)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned int)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+assign_special_int(Type& v, Result_Class c, Rounding_Dir dir) {
+  PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+  switch (c) {
+  case VC_NAN:
+    if (Policy::has_nan) {
+      v = Extended_Int<Policy, Type>::not_a_number;
+      return V_NAN;
+    }
+    return V_NAN | V_UNREPRESENTABLE;
+  case VC_MINUS_INFINITY:
+    if (Policy::has_infinity) {
+      v = Extended_Int<Policy, Type>::minus_infinity;
+      return V_EQ_MINUS_INFINITY;
+    }
+    if (round_up(dir)) {
+      v = Extended_Int<Policy, Type>::min;
+      return V_LT_INF;
+    }
+    return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+  case VC_PLUS_INFINITY:
+    if (Policy::has_infinity) {
+      v = Extended_Int<Policy, Type>::plus_infinity;
+      return V_EQ_PLUS_INFINITY;
+    }
+    if (round_down(dir)) {
+      v = Extended_Int<Policy, Type>::max;
+      return V_GT_SUP;
+    }
+    return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN | V_UNREPRESENTABLE;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+          && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
+              || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
+    if (CHECK_P(To_Policy::check_overflow,
+                PPL_LT_SILENT(from,
+                              static_cast<From>(Extended_Int<To_Policy, To>::min))))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    if (CHECK_P(To_Policy::check_overflow,
+                PPL_GT_SILENT(from,
+                              static_cast<From>(Extended_Int<To_Policy, To>::max))))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(To_Policy::check_overflow,
+                from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_overflow, from < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)) {
+    if (CHECK_P(To_Policy::check_overflow,
+                from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+          && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
+    if (CHECK_P(To_Policy::check_overflow,
+                PPL_GT_SILENT(from,
+                              static_cast<From>(Extended_Int<To_Policy, To>::max))))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+
+#define PPL_ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN_SIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Type, Type)
+#define PPL_ASSIGN_UNSIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Type, Type)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_SIGNED(char)
+#endif
+PPL_ASSIGN_SIGNED(signed char)
+PPL_ASSIGN_SIGNED(signed short)
+PPL_ASSIGN_SIGNED(signed int)
+PPL_ASSIGN_SIGNED(signed long)
+PPL_ASSIGN_SIGNED(signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_UNSIGNED(char)
+#endif
+PPL_ASSIGN_UNSIGNED(unsigned char)
+PPL_ASSIGN_UNSIGNED(unsigned short)
+PPL_ASSIGN_UNSIGNED(unsigned int)
+PPL_ASSIGN_UNSIGNED(unsigned long)
+PPL_ASSIGN_UNSIGNED(unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long long)
+#else
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, char)
+#endif
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+#if 0
+  // FIXME: this is correct but it is inefficient and breaks the build
+  // for the missing definition of static const members (a problem present
+  // also in other areas of the PPL).
+  if (CHECK_P(To_Policy::check_overflow, lt(from, Extended_Int<To_Policy, To>::min)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, !le(from, Extended_Int<To_Policy, To>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+#else
+  if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int<To_Policy, To>::min)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int<To_Policy, To>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+#endif
+  if (round_not_requested(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  From i_from = rint(from);
+  to = i_from;
+  if (from == i_from)
+    return V_EQ;
+  if (round_direct(ROUND_UP))
+    return round_lt_int<To_Policy>(to, dir);
+  if (round_direct(ROUND_DOWN))
+    return round_gt_int<To_Policy>(to, dir);
+  if (from < i_from)
+    return round_lt_int<To_Policy>(to, dir);
+  PPL_ASSERT(from > i_from);
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, float)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, long double)
+
+#undef PPL_ASSIGN_SIGNED
+#undef PPL_ASSIGN_UNSIGNED
+#undef PPL_ASSIGN2_SIGNED_SIGNED
+#undef PPL_ASSIGN2_UNSIGNED_UNSIGNED
+#undef PPL_ASSIGN2_UNSIGNED_SIGNED
+#undef PPL_ASSIGN2_SIGNED_UNSIGNED
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(signed long)) {
+    if (!To_Policy::check_overflow) {
+      to = from.get_si();
+      return V_EQ;
+    }
+    if (from.fits_slong_p()) {
+      signed long v = from.get_si();
+      if (PPL_LT_SILENT(v, (Extended_Int<To_Policy, To>::min)))
+        return set_neg_overflow_int<To_Policy>(to, dir);
+      if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+        return set_pos_overflow_int<To_Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0) {
+        to = 0;
+        return V_EQ;
+      }
+      To v;
+      mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+      if (v >= 0) {
+        if (::sgn(from) < 0)
+          return neg<To_Policy, To_Policy>(to, v, dir);
+        to = v;
+        return V_EQ;
+      }
+    }
+  }
+  return (::sgn(from) < 0)
+    ? set_neg_overflow_int<To_Policy>(to, dir)
+    : set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_overflow, ::sgn(from) < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (sizeof(To) <= sizeof(unsigned long)) {
+    if (!To_Policy::check_overflow) {
+      to = static_cast<To>(from.get_ui());
+      return V_EQ;
+    }
+    if (from.fits_ulong_p()) {
+      const unsigned long v = from.get_ui();
+      if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+        return set_pos_overflow_int<To_Policy>(to, dir);
+      to = static_cast<To>(v);
+      return V_EQ;
+    }
+  }
+  else {
+    const mpz_srcptr m = from.get_mpz_t();
+    const size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0)
+        to = 0;
+      else
+        mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+      return V_EQ;
+    }
+  }
+  return set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  PPL_DIRTY_TEMP(mpz_class, q);
+  mpz_ptr q_z = q.get_mpz_t();
+  if (round_not_requested(dir)) {
+    mpz_tdiv_q(q_z, n, d);
+    Result r = assign<To_Policy, void>(to, q, dir);
+    if (r != V_EQ)
+      return r;
+    return V_LGE;
+  }
+  mpz_t rem;
+  int sign;
+  mpz_init(rem);
+  mpz_tdiv_qr(q_z, rem, n, d);
+  sign = mpz_sgn(rem);
+  mpz_clear(rem);
+  Result r = assign<To_Policy, void>(to, q, dir);
+  if (r != V_EQ)
+    return r;
+  switch (sign) {
+  case -1:
+    return round_lt_int<To_Policy>(to, dir);
+  case 1:
+    return round_gt_int<To_Policy>(to, dir);
+  default:
+    return V_EQ;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long long, mpq_class)
+
+#if ~0 != -1
+#error "Only two's complement is supported"
+#endif
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architectures.
+//
+// Current guidelines:
+//   - avoid division where possible (larger type variant for mul)
+//   - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef int_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef int_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef uint_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef uint_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed short> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef int_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef int_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef uint_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef uint_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<signed int> {
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_neg l = x;
+  l = -l;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_add l = x;
+  l += y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_sub l = x;
+  l -= y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_mul l = x;
+  l *= y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+              (from < -Extended_Int<To_Policy, Type>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow, from != 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
+    if (y >= 0) {
+      if (x > Extended_Int<To_Policy, Type>::max - y)
+        return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else if (x < Extended_Int<To_Policy, Type>::min - y)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+  }
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+              (x > Extended_Int<To_Policy, Type>::max - y)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
+    if (y >= 0) {
+      if (x < Extended_Int<To_Policy, Type>::min + y)
+        return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+    else if (x > Extended_Int<To_Policy, Type>::max + y)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+              (x < Extended_Int<To_Policy, Type>::min + y)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  if (x >= 0) {
+    if (y > 0) {
+      if (x > Extended_Int<To_Policy, Type>::max / y)
+        return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else {
+      if (x > Extended_Int<To_Policy, Type>::min / y)
+        return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+  }
+  else {
+    if (y < 0) {
+      if (x < Extended_Int<To_Policy, Type>::max / y)
+        return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else {
+      if (x < Extended_Int<To_Policy, Type>::min / y)
+        return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+  }
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (x > Extended_Int<To_Policy, Type>::max / y)
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  if (round_not_requested(dir))
+    return V_LGE;
+  if (y == -1)
+    return V_EQ;
+  Type m = x % y;
+  if (m < 0)
+    return round_lt_int_no_overflow<To_Policy>(to, dir);
+  else if (m > 0)
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  if (round_not_requested(dir))
+    return V_GE;
+  Type m = x % y;
+  if (m == 0)
+    return V_EQ;
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+idiv_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+idiv_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+rem_signed_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = (y == -1) ? 0 : (x % y);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+rem_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type))) {
+    to = 0;
+    if (round_not_requested(dir))
+      return V_GE;
+    if (x == 0)
+      return V_EQ;
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  }
+  to = x >> exp;
+  if (round_not_requested(dir))
+    return V_GE;
+  if (x & ((Type(1) << exp) - 1))
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (x < 0) {
+    if (exp >= sizeof_to_bits(sizeof(Type))) {
+      to = 0;
+      if (round_not_requested(dir))
+        return V_LE;
+      return round_lt_int_no_overflow<To_Policy>(to, dir);
+    }
+    typedef typename C_Integer<Type>::other_type UType;
+    UType ux = x;
+    ux = -ux;
+    to = ~Type(~-(ux >> exp));
+    if (round_not_requested(dir))
+      return V_LE;
+    if (ux & ((UType(1) << exp) -1))
+      return round_lt_int_no_overflow<To_Policy>(to, dir);
+    return V_EQ;
+  }
+  else {
+    if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+      to = 0;
+      if (round_not_requested(dir))
+        return V_GE;
+      if (x == 0)
+        return V_EQ;
+      return round_gt_int_no_overflow<To_Policy>(to, dir);
+    }
+    to = x >> exp;
+    if (round_not_requested(dir))
+      return V_GE;
+    if (x & ((Type(1) << exp) - 1))
+      return round_gt_int_no_overflow<To_Policy>(to, dir);
+    else
+      return V_EQ;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x + (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  Type n = Type(1) << exp;
+  return add_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x + (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+    Type n = -2 * (Type(1) << (exp - 1));
+    return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+  else {
+    Type n = Type(1) << exp;
+    return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x - (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  Type n = Type(1) << exp;
+  return sub_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x - (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+    Type n = -2 * (Type(1) << (exp - 1));
+    return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+  else {
+    Type n = Type(1) << exp;
+    return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type))) {
+    if (x == 0) {
+      to = 0;
+      return V_EQ;
+    }
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  if (x > Extended_Int<To_Policy, Type>::max >> exp)
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x << exp;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (x < 0) {
+    if (!To_Policy::check_overflow) {
+      to = x * (Type(1) << exp);
+      return V_EQ;
+    }
+    if (exp >= sizeof_to_bits(sizeof(Type)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    typedef typename C_Integer<Type>::other_type UType;
+    UType mask = UType(-1) << (sizeof_to_bits(sizeof(Type)) - exp - 1);
+    UType ux = x;
+    if ((ux & mask) != mask)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    ux <<= exp;
+    Type n = ~(Type(~ux));
+    if (PPL_LT_SILENT(n, (Extended_Int<To_Policy, Type>::min)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    to = n;
+  }
+  else {
+    if (!To_Policy::check_overflow) {
+      to = x << exp;
+      return V_EQ;
+    }
+    if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+      if (x == 0) {
+        to = 0;
+        return V_EQ;
+      }
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    if (x > Extended_Int<To_Policy, Type>::max >> exp)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    to = x << exp;
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                       Rounding_Dir dir) {
+  if (exp > sizeof_to_bits(sizeof(Type)))
+    to = x;
+  else {
+    Type v = (exp == sizeof_to_bits(sizeof(Type)) ? x : (x & ((Type(1) << exp) - 1)));
+    if (v >= (Type(1) << (exp - 1)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    else
+      to = v;
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                     Rounding_Dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    to = x;
+  else {
+    Type m = Type(1) << (exp - 1);
+    to = (x & (m - 1)) - (x & m);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                       Rounding_Dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    to = x;
+  else
+    to = x & ((Type(1) << exp) - 1);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                     Rounding_Dir dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type))) {
+    if (x < 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    to = x;
+  }
+  else
+    to = x & ((Type(1) << exp) - 1);
+  return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrt_rem(Type& q, Type& r, const Type from) {
+  q = 0;
+  r = from;
+  Type t(1);
+  for (t <<= sizeof_to_bits(sizeof(Type)) - 2; t != 0; t >>= 2) {
+    Type s = q + t;
+    if (s <= r) {
+      r -= s;
+      q = s + t;
+    }
+    q >>= 1;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  Type rem;
+  isqrt_rem(to, rem, from);
+  if (round_not_requested(dir))
+    return V_GE;
+  if (rem == 0)
+    return V_EQ;
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  return sqrt_unsigned_int<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+  switch (result_overflow(r)) {
+  case 0:
+    return add<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+  case -1:
+    if (to <= 0)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case 1:
+    if (to >= 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN;
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+  switch (result_overflow(r)) {
+  case 0:
+    return sub<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+  case -1:
+    if (to >= 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case 1:
+    if (to <= 0)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN;
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+            const Numeric_Format&, Rounding_Dir) {
+  os << int(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_signed_int, signed char, signed char)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed short, signed short)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed int, signed int)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long, signed long)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD(add_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD(add_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_DIV(div_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_DIV(div_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_REM(rem_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_REM(rem_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(abs_generic, char, char)
+#endif
+PPL_SPECIALIZE_ABS(abs_generic, signed char, signed char)
+PPL_SPECIALIZE_ABS(abs_generic, signed short, signed short)
+PPL_SPECIALIZE_ABS(abs_generic, signed int, signed int)
+PPL_SPECIALIZE_ABS(abs_generic, signed long, signed long)
+PPL_SPECIALIZE_ABS(abs_generic, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCD(gcd_exact, char, char, char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCD(gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, char, char, char, char, char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed char, signed char, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed short, signed short, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed int, signed int, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long, signed long, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, char, char, char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SGN(sgn_generic, char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed short)
+PPL_SPECIALIZE_SGN(sgn_generic, signed int)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned char)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned short)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned int)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long long)
+
+PPL_SPECIALIZE_CMP(cmp_generic, char, char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed char, signed char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed short, signed short)
+PPL_SPECIALIZE_CMP(cmp_generic, signed int, signed int)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long, signed long)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long long, signed long long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned char, unsigned char)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned short, unsigned short)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned int, unsigned int)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long, unsigned long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, char, char, char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, char, char, char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_INPUT(input_generic, char)
+PPL_SPECIALIZE_INPUT(input_generic, signed char)
+PPL_SPECIALIZE_INPUT(input_generic, signed short)
+PPL_SPECIALIZE_INPUT(input_generic, signed int)
+PPL_SPECIALIZE_INPUT(input_generic, signed long)
+PPL_SPECIALIZE_INPUT(input_generic, signed long long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned char)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned short)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned int)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long long)
+
+PPL_SPECIALIZE_OUTPUT(output_char, char)
+PPL_SPECIALIZE_OUTPUT(output_char, signed char)
+PPL_SPECIALIZE_OUTPUT(output_int, signed short)
+PPL_SPECIALIZE_OUTPUT(output_int, signed int)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long long)
+PPL_SPECIALIZE_OUTPUT(output_char, unsigned char)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned short)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned int)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_mpq_inlines.hh b/src/checked_mpq_inlines.hh
new file mode 100644
index 0000000..fe8d3b4
--- /dev/null
+++ b/src/checked_mpq_inlines.hh
@@ -0,0 +1,542 @@
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_mpq_inlines_hh
+#define PPL_checked_mpq_inlines_hh 1
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+  if ((Policy::has_nan || Policy::has_infinity)
+      && ::sgn(v.get_den()) == 0) {
+    int s = ::sgn(v.get_num());
+    if (Policy::has_nan && (nan || sign) && s == 0)
+      return V_NAN;
+    if (!inf && !sign)
+      return V_LGE;
+    if (Policy::has_infinity) {
+      if (s < 0)
+        return inf ? V_EQ_MINUS_INFINITY : V_LT;
+      if (s > 0)
+        return inf ? V_EQ_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return static_cast<Result>(sgn<Policy>(v));
+  return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+  return Policy::has_nan
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) == 0;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+  return Policy::has_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) < 0;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+  return Policy::has_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) > 0;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+  if ((Policy::has_infinity || Policy::has_nan)
+      && ::sgn(v.get_den()) == 0)
+    return !(Policy::has_nan && ::sgn(v.get_num()) == 0);
+  else
+    return v.get_den() == 1;
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpq(mpq_class& v, Result_Class c, Rounding_Dir) {
+  switch (c) {
+  case VC_NAN:
+    if (Policy::has_nan) {
+      v.get_num() = 0;
+      v.get_den() = 0;
+      return V_NAN | V_UNREPRESENTABLE;
+    }
+    return V_NAN;
+  case VC_MINUS_INFINITY:
+    if (Policy::has_infinity) {
+      v.get_num() = -1;
+      v.get_den() = 0;
+      return V_EQ_MINUS_INFINITY;
+    }
+    return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+  case VC_PLUS_INFINITY:
+    if (Policy::has_infinity) {
+      v.get_num() = 1;
+      v.get_den() = 0;
+      return V_EQ_PLUS_INFINITY;
+    }
+    return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN | V_UNREPRESENTABLE;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpq, mpq_class)
+
+PPL_SPECIALIZE_COPY(copy_generic, mpq_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, mpz_class)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  assign_mpq_numeric_float(to, from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, long double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_num().get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_signed_int, mpq_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else {
+    mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+floor_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_fdiv_q(to.get_num().get_mpz_t(),
+             from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_FLOOR(floor_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+ceil_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_cdiv_q(to.get_num().get_mpz_t(),
+             from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_CEIL(ceil_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+trunc_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_tdiv_q(to.get_num().get_mpz_t(),
+             from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_TRUNC(trunc_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  return trunc<To_Policy, To_Policy>(to, to, dir);
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  PPL_DIRTY_TEMP(mpq_class, tmp);
+  tmp = x / y;
+  tmp.get_num() %= tmp.get_den();
+  to = tmp * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x + v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x - v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+  to.get_den() = x.get_den();
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  to.get_num() = x.get_num();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+              Rounding_Dir) {
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+  mpz_fdiv_q_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+  bool neg = to.get_num() >= to.get_den();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+  if (neg)
+    to.get_num() -= to.get_den();
+  mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+              Rounding_Dir) {
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+  mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+            Rounding_Dir) {
+  to += x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+            Rounding_Dir) {
+  to -= x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned irrational_precision;
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  if (from == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  bool gt1 = from.get_num() > from.get_den();
+  const mpz_class& from_a = gt1 ? from.get_num() : from.get_den();
+  const mpz_class& from_b = gt1 ? from.get_den() : from.get_num();
+  mpz_class& to_a = gt1 ? to.get_num() : to.get_den();
+  mpz_class& to_b = gt1 ? to.get_den() : to.get_num();
+  Rounding_Dir rdir = gt1 ? dir : inverse(dir);
+  mul_2exp<To_Policy, From_Policy>(to_a, from_a,
+                                   2*irrational_precision, ROUND_IGNORE);
+  Result r_div
+    = div<To_Policy, To_Policy, To_Policy>(to_a, to_a, from_b, rdir);
+  Result r_sqrt = sqrt<To_Policy, To_Policy>(to_a, to_a, rdir);
+  to_b = 1;
+  mul_2exp<To_Policy, To_Policy>(to_b, to_b,
+                                 irrational_precision, ROUND_IGNORE);
+  to.canonicalize();
+  return (r_div != V_EQ) ? r_div : r_sqrt;
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+  Result r = input_mpq(to, is);
+  Result_Class c = result_class(r);
+  switch (c) {
+  case VC_MINUS_INFINITY:
+  case VC_PLUS_INFINITY:
+    return assign_special<Policy>(to, c, dir);
+  case VC_NAN:
+    return assign_nan<Policy>(to, r);
+  default:
+    return r;
+  }
+}
+
+PPL_SPECIALIZE_INPUT(input_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+           const mpq_class& from,
+           const Numeric_Format&,
+           Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_OUTPUT(output_mpq, mpq_class)
+
+} // namespace Checked
+
+//! Returns the precision parameter used for irrational calculations.
+inline unsigned
+irrational_precision() {
+  return Checked::irrational_precision;
+}
+
+//! Sets the precision parameter used for irrational calculations.
+/*! The lesser between numerator and denominator is limited to 2**\p p.
+
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for irrational calculations to \p p.
+
+  \exception std::invalid_argument
+  Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_irrational_precision(const unsigned p) {
+  if (p <= INT_MAX)
+    Checked::irrational_precision = p;
+  else
+    throw std::invalid_argument("PPL::set_irrational_precision(p)"
+                                " with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_mpq_inlines_hh)
diff --git a/src/checked_mpz_inlines.hh b/src/checked_mpz_inlines.hh
new file mode 100644
index 0000000..4147994
--- /dev/null
+++ b/src/checked_mpz_inlines.hh
@@ -0,0 +1,645 @@
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_mpz_inlines_hh
+#define PPL_checked_mpz_inlines_hh 1
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+#ifdef PPL_HAVE_TYPEOF
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef typeof(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+  return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+  v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+  if (Policy::has_nan || Policy::has_infinity) {
+    mp_size_field_t s = get_mp_size(v);
+    if (Policy::has_nan
+        && (nan || sign)
+        && s == C_Integer<mp_size_field_t>::min + 1)
+      return V_NAN;
+    if (!inf && !sign)
+      return V_LGE;
+    if (Policy::has_infinity) {
+      if (s == C_Integer<mp_size_field_t>::min)
+        return inf ? V_EQ_MINUS_INFINITY : V_LT;
+      if (s == C_Integer<mp_size_field_t>::max)
+        return inf ? V_EQ_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return static_cast<Result>(sgn<Policy>(v));
+  return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+  return Policy::has_nan
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min + 1;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::max;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+  return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpz(mpz_class& v, Result_Class c, Rounding_Dir) {
+  switch (c) {
+  case VC_NAN:
+    if (Policy::has_nan)
+      set_mp_size(v, C_Integer<mp_size_field_t>::min + 1);
+    return V_NAN;
+  case VC_MINUS_INFINITY:
+    if (Policy::has_infinity) {
+      set_mp_size(v, C_Integer<mp_size_field_t>::min);
+      return V_EQ_MINUS_INFINITY;
+    }
+    return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+  case VC_PLUS_INFINITY:
+    if (Policy::has_infinity) {
+      set_mp_size(v, C_Integer<mp_size_field_t>::max);
+      return V_EQ_PLUS_INFINITY;
+    }
+    return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+  if (is_nan_mpz<From_Policy>(from))
+    PPL_ASSERT(To_Policy::has_nan);
+  else if (is_minf_mpz<From_Policy>(from) || is_pinf_mpz<From_Policy>(from))
+    PPL_ASSERT(To_Policy::has_infinity);
+  else {
+    to = from;
+    return;
+  }
+  set_mp_size(to, get_mp_size(from));
+}
+
+PPL_SPECIALIZE_COPY(copy_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    new (&to) mpz_class(from);
+    return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  if (round_not_requested(dir)) {
+    new (&to) mpz_class(from);
+    return V_LGE;
+  }
+  From n = rint(from);
+  new (&to) mpz_class(n);
+  if (from == n)
+    return V_EQ;
+  if (from < 0)
+    return round_lt_mpz<To_Policy>(to, dir);
+  else
+    return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+  }
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_signed_int, mpz_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else
+    mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  if (round_not_requested(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  From i_from = rint(from);
+  to = i_from;
+  if (from == i_from)
+    return V_EQ;
+  if (round_direct(ROUND_UP))
+    return round_lt_mpz<To_Policy>(to, dir);
+  if (round_direct(ROUND_DOWN))
+    return round_gt_mpz<To_Policy>(to, dir);
+  if (from < i_from)
+    return round_lt_mpz<To_Policy>(to, dir);
+  if (from > i_from)
+    return round_gt_mpz<To_Policy>(to, dir);
+  PPL_UNREACHABLE;
+  return V_NAN;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output<From_Policy>(ss, from, Numeric_Format(), dir);
+  PPL_DIRTY_TEMP(mpq_class, tmp);
+#ifndef NDEBUG
+  Result r =
+#endif
+    input_mpq(tmp, ss);
+  PPL_ASSERT(r == V_EQ);
+  return assign<To_Policy, From_Policy>(to, tmp, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (round_not_needed(dir)) {
+    to = from.get_num();
+    return V_LGE;
+  }
+  if (round_ignore(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  const mpz_srcptr n = from.get_num().get_mpz_t();
+  const mpz_srcptr d = from.get_den().get_mpz_t();
+  if (round_down(dir)) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+    return V_GE;
+  }
+  else {
+    PPL_ASSERT(round_up(dir));
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+    return V_LE;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_mpq, mpz_class, mpq_class)
+
+PPL_SPECIALIZE_FLOOR(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_CEIL(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_TRUNC(assign_exact, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+        Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  const mpz_srcptr n = x.get_mpz_t();
+  const mpz_srcptr d = y.get_mpz_t();
+  if (round_not_needed(dir)) {
+    mpz_divexact(to.get_mpz_t(), n, d);
+    return V_LGE;
+  }
+  if (round_ignore(dir)) {
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return V_LE;
+  }
+  if (round_down(dir)) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+    return V_GE;
+  }
+  else {
+    PPL_ASSERT(round_up(dir));
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+    return V_LE;
+  }
+}
+
+PPL_SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+        Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  mpz_tdiv_q(to.get_mpz_t(), n, d);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = x % y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x + v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x - v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir) {
+  mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir dir) {
+  const mpz_srcptr n = x.get_mpz_t();
+  if (round_not_requested(dir)) {
+    mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+    return V_LGE;
+  }
+  if (round_down(dir)) {
+    mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_GT;
+    return V_GE;
+  }
+  else {
+    PPL_ASSERT(round_up(dir));
+    mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_LT;
+    return V_LE;
+  }
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+              Rounding_Dir) {
+  if (mpz_tstbit(x.get_mpz_t(), exp - 1) != 0)
+    mpz_cdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  else
+    mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+              Rounding_Dir) {
+  mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+            Rounding_Dir) {
+  mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+            Rounding_Dir) {
+  mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_GCD(gcd_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcdext_mpz(mpz_class& to, mpz_class& s, mpz_class& t,
+           const mpz_class& x, const mpz_class& y,
+           Rounding_Dir) {
+  mpz_gcdext(to.get_mpz_t(), s.get_mpz_t(), t.get_mpz_t(),
+             x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_GCDEXT(gcdext_mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_LCM(lcm_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  if (round_not_requested(dir)) {
+    to = sqrt(from);
+    return V_GE;
+  }
+  PPL_DIRTY_TEMP(mpz_class, r);
+  mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+  if (r == 0)
+    return V_EQ;
+  return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_mp(const Type& x) {
+  const int sign = ::sgn(x);
+  return (sign > 0) ? VR_GT : ((sign < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_SGN(sgn_mp, mpz_class)
+PPL_SPECIALIZE_SGN(sgn_mp, mpq_class)
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_mp(const Type& x, const Type& y) {
+  int i = ::cmp(x, y);
+  return (i > 0) ? VR_GT : ((i < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class)
+PPL_SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+           Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_INPUT(input_generic, mpz_class)
+PPL_SPECIALIZE_OUTPUT(output_mpz, mpz_class)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_mpz_inlines_hh)
diff --git a/src/checked_numeric_limits.hh b/src/checked_numeric_limits.hh
new file mode 100644
index 0000000..b5f410c
--- /dev/null
+++ b/src/checked_numeric_limits.hh
@@ -0,0 +1,167 @@
+/* Specializations of std::numeric_limits for "checked" types.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_checked_numeric_limits_hh
+#define PPL_checked_numeric_limits_hh 1
+
+#include "Checked_Number_defs.hh"
+#include "checked_int_inlines.hh"
+#include <limits>
+
+namespace std {
+
+using namespace Parma_Polyhedra_Library;
+
+#define PPL_SPECIALIZE_LIMITS_INT(T)                                    \
+  /*! \brief Partial specialization of std::numeric_limits. */          \
+  template <typename Policy>                                            \
+  class numeric_limits<Checked_Number<PPL_U(T), Policy> >              \
+    : public numeric_limits<PPL_U(T)> {                                 \
+  private:                                                              \
+    typedef Checked_Number<PPL_U(T), Policy> Type;                      \
+                                                                        \
+  public:                                                               \
+    static const bool has_infinity = Policy::has_infinity;              \
+    static const bool has_quiet_NaN =  Policy::has_nan;                 \
+                                                                        \
+    static Type min() {                                                 \
+      Type v;                                                           \
+      v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::min;     \
+      return v;                                                         \
+    }                                                                   \
+                                                                        \
+    static Type max() {                                                 \
+      Type v;                                                           \
+      v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::max;     \
+      return v;                                                         \
+    }                                                                   \
+                                                                        \
+    static Type infinity() {                                            \
+      Type v;                                                           \
+      Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,  \
+                                      ROUND_IGNORE);                    \
+      return v;                                                         \
+    }                                                                   \
+                                                                        \
+    static Type quiet_NaN() {                                           \
+      Type v;                                                           \
+      Checked::assign_special<Policy>(v.raw_value(), VC_NAN,            \
+                                      ROUND_IGNORE);                    \
+      return v;                                                         \
+    }                                                                   \
+  };
+
+PPL_SPECIALIZE_LIMITS_INT(char)
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T)                                  \
+  /*! \brief Partial specialization of std::numeric_limits. */          \
+  template <typename Policy>                                            \
+  struct numeric_limits<Checked_Number<PPL_U(T), Policy> >              \
+    : public numeric_limits<PPL_U(T)> {                                 \
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpz_class, Policy> >
+  : public numeric_limits<mpz_class> {
+private:
+  typedef Checked_Number<mpz_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
+
+  static Type infinity() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+                                    ROUND_IGNORE);
+    return v;
+  }
+
+  static Type quiet_NaN() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+  typedef Checked_Number<mpq_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
+
+  static Type infinity() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+                                    ROUND_IGNORE);
+    return v;
+  }
+
+  static Type quiet_NaN() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+    return v;
+  }
+};
+
+} // namespace std
+
+#endif // !defined(PPL_checked_numeric_limits_hh)
diff --git a/src/compiler.hh b/src/compiler.hh
new file mode 100644
index 0000000..840620a
--- /dev/null
+++ b/src/compiler.hh
@@ -0,0 +1,224 @@
+/* C++ compiler related stuff.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_compiler_hh
+#define PPL_compiler_hh 1
+
+#include <cstddef>
+#include <climits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op macro that allows to avoid unused variable warnings from
+  the compiler.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_USED(v) (void)(v)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op function that force the compiler to store the argument and
+  to reread it from memory if needed (thus preventing CSE).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+PPL_CC_FLUSH(const T& x) {
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+  __asm__ __volatile__ ("" : "+m" (const_cast<T&>(x)));
+#else
+  // FIXME: is it possible to achieve the same effect in a portable way?
+  PPL_USED(x);
+#endif
+}
+
+#ifndef PPL_SUPPRESS_UNINIT_WARNINGS
+#define PPL_SUPPRESS_UNINIT_WARNINGS 1
+#endif
+
+#ifndef PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+#define PPL_SUPPRESS_UNINITIALIZED_WARNINGS 1
+#endif
+
+#if PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+template <typename T>
+struct Suppress_Uninitialized_Warnings_Type {
+  typedef T synonym;
+};
+
+#define PPL_UNINITIALIZED(type, name)                                   \
+  PPL_U(type) PPL_U(name)                                               \
+  = Suppress_Uninitialized_Warnings_Type<PPL_U(type)>::synonym ()
+#else
+#define PPL_UNINITIALIZED(type, name)           \
+  PPL_U(type) name
+#endif
+
+#define sizeof_to_bits(size)                    \
+  ((size) * static_cast<std::size_t>(CHAR_BIT))
+
+#if !defined(__GNUC__)
+
+inline unsigned int
+clz32(uint32_t w) {
+  unsigned int r = 31;
+  if ((w & 0xffff0000U) != 0) {
+    w >>= 16;
+    r -= 16;
+  }
+  if ((w & 0xff00U) != 0) {
+    w >>= 8;
+    r -= 8;
+  }
+  if ((w & 0xf0U) != 0) {
+    w >>= 4;
+    r -= 4;
+  }
+  if ((w & 0xcU) != 0) {
+    w >>= 2;
+    r -= 2;
+  }
+  if ((w & 0x2U) != 0)
+    r -= 1;
+  return r;
+}
+
+inline unsigned int
+clz64(uint64_t w) {
+  if ((w & 0xffffffff00000000ULL) == 0)
+    return clz32(static_cast<uint32_t>(w)) + 32;
+  else
+    return clz32(static_cast<uint32_t>(w >> 32));
+}
+
+inline unsigned int
+ctz32(uint32_t w) {
+  static const unsigned int mod37_table[] = {
+    32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
+    4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
+    5, 20, 8, 19, 18
+  };
+  return mod37_table[(w & -w) % 37];
+}
+
+inline unsigned int
+ctz64(uint64_t w) {
+  if ((w & 0x00000000ffffffffULL) == 0)
+    return ctz32(static_cast<uint32_t>(w >> 32)) + 32;
+  else
+    return ctz32(static_cast<uint32_t>(w));
+}
+
+#endif
+
+inline unsigned int
+clz(unsigned int u) {
+  assert(u != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_clz(u));
+#elif PPL_SIZEOF_INT == 4
+  return clz32(u);
+#elif PPL_SIZEOF_INT == 8
+  return clz64(u);
+#else
+  #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long ul) {
+  assert(ul != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_clzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+  return clz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+  return clz64(ul);
+#else
+  #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long long ull) {
+  assert(ull != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_clzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+  return clz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+  return clz64(ull);
+#else
+  #error "Unsupported unsigned long long size"
+#endif
+}
+
+
+inline unsigned int
+ctz(unsigned int u) {
+  assert(u != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_ctz(u));
+#elif PPL_SIZEOF_INT == 4
+  return ctz32(u);
+#elif PPL_SIZEOF_INT == 8
+  return ctz64(u);
+#else
+  #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long ul) {
+  assert(ul != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_ctzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+  return ctz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+  return ctz64(ul);
+#else
+  #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long long ull) {
+  assert(ull != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_ctzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+  return ctz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+  return ctz64(ull);
+#else
+  #error "Unsupported unsigned long long size"
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_compiler_hh)
diff --git a/src/distances_defs.hh b/src/distances_defs.hh
new file mode 100644
index 0000000..4803f8f
--- /dev/null
+++ b/src/distances_defs.hh
@@ -0,0 +1,54 @@
+/* Class declarations for several distances.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_distances_defs_hh
+#define PPL_distances_defs_hh 1
+
+#include "distances_types.hh"
+#include "Rounding_Dir_defs.hh"
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Rectilinear_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Euclidean_Distance_Specialization {
+  static void combine(Temp& running, Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp& running, Rounding_Dir dir);
+};
+
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::L_Infinity_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+#include "distances_inlines.hh"
+
+#endif // !defined(PPL_distances_defs_hh)
diff --git a/src/distances_inlines.hh b/src/distances_inlines.hh
new file mode 100644
index 0000000..279a345
--- /dev/null
+++ b/src/distances_inlines.hh
@@ -0,0 +1,113 @@
+/* Inline functions implementing distances.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_distances_inlines_hh
+#define PPL_distances_inlines_hh 1
+
+#include "Result_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+// A struct to work around the lack of partial specialization
+// of function templates in C++.
+template <typename To, typename From>
+struct maybe_assign_struct {
+  static inline Result
+  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+    // When `To' and `From' are different types, we make the conversion
+    // and use `tmp'.
+    top = &tmp;
+    return assign_r(tmp, from, dir);
+  }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+  static inline Result
+  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+    // When the types are the same, conversion is unnecessary.
+    top = &from;
+    return V_EQ;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Assigns to \p top a pointer to a location that holds the
+  conversion, according to \p dir, of \p from to type \p To.  When
+  necessary, and only when necessary, the variable \p tmp is used to
+  hold the result of conversion.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
+                                                   const Temp& current,
+                                                   Rounding_Dir dir) {
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
+                                                 Temp& current,
+                                                 Rounding_Dir dir) {
+  mul_assign_r(current, current, current, dir);
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
+                                                  Rounding_Dir dir) {
+  sqrt_assign_r(running, running, dir);
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
+                                                  const Temp& current,
+                                                  Rounding_Dir) {
+  if (current > running)
+    running = current;
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_distances_inlines_hh)
diff --git a/src/distances_types.hh b/src/distances_types.hh
new file mode 100644
index 0000000..f8d5892
--- /dev/null
+++ b/src/distances_types.hh
@@ -0,0 +1,29 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_distances_types_hh
+#define PPL_distances_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization;
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization;
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_distances_types_hh)
diff --git a/src/fpu-c99_inlines.hh b/src/fpu-c99_inlines.hh
new file mode 100644
index 0000000..388281f
--- /dev/null
+++ b/src/fpu-c99_inlines.hh
@@ -0,0 +1,100 @@
+/* C99 Floating point unit related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_c99_inlines_hh
+#define PPL_fpu_c99_inlines_hh 1
+
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+#include <stdexcept>
+
+#ifdef FE_TONEAREST
+#define PPL_FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define PPL_FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define PPL_FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define PPL_FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+  const int old = fegetround();
+  if (fesetround(PPL_FPU_DOWNWARD) != 0
+      || fesetround(PPL_FPU_UPWARD) != 0
+      || fesetround(old) != 0)
+    throw std::logic_error("PPL configuration error:"
+                           " PPL_CAN_CONTROL_FPU evaluates to true,"
+                           " but fesetround() returns nonzero.");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fegetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fesetround(dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  const fpu_rounding_control_word_type old
+    = static_cast<fpu_rounding_control_word_type>(fegetround());
+  fesetround(dir);
+  return old;
+}
+
+inline void
+fpu_reset_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+  feclearexcept(FE_INEXACT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+  return fetestexcept(FE_INEXACT) != 0 ? 1 : 0;
+#else
+  return -1;
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_FENV_H)
+
+#endif // !defined(PPL_fpu_c99_inlines_hh)
diff --git a/src/fpu-ia32.cc b/src/fpu-ia32.cc
new file mode 100644
index 0000000..9c2fad0
--- /dev/null
+++ b/src/fpu-ia32.cc
@@ -0,0 +1,75 @@
+/* IA-32 floating point unit non-inline related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+
+#if PPL_CAN_CONTROL_FPU && defined(PPL_FPMATH_MAY_USE_SSE) \
+  && defined(__i386__) \
+  && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+
+#include "fpu_defs.hh"
+#include <csetjmp>
+#include <csignal>
+// This inclusion is to work around a bug present in some versions
+// of GCC under mingw-w64.
+// See http://www.cs.unipr.it/pipermail/ppl-devel/2011-February/017342.html
+#include <cstddef>
+
+namespace {
+
+jmp_buf env;
+
+void
+illegal_instruction_catcher(int) {
+  longjmp(env, 1);
+}
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+bool have_sse_unit = true;
+
+void
+detect_sse_unit() {
+  void (*old)(int);
+  // Install our own signal handler for SIGILL.
+  old = signal(SIGILL, illegal_instruction_catcher);
+
+  if (setjmp(env)) {
+    // We will end up here if sse_get_control() raises SIGILL.
+    have_sse_unit = false;
+  }
+  else {
+    (void) sse_get_control();
+    // sse_get_control() did not raise SIGILL: we have an SSE unit.
+    have_sse_unit = true;
+  }
+
+  // Restore the previous signal handler for SIGILL.
+  signal(SIGILL, old);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // PPL_CAN_CONTROL_FPU && defined(PPL_FPMATH_MAY_USE_SSE) && defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
diff --git a/src/fpu-ia32_inlines.hh b/src/fpu-ia32_inlines.hh
new file mode 100644
index 0000000..acc87fa
--- /dev/null
+++ b/src/fpu-ia32_inlines.hh
@@ -0,0 +1,203 @@
+/* IA-32 floating point unit inline related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_ia32_inlines_hh
+#define PPL_fpu_ia32_inlines_hh 1
+
+#include <csetjmp>
+#include <csignal>
+
+#define FPU_INVALID       0x01
+#define FPU_DIVBYZERO     0x04
+#define FPU_OVERFLOW      0x08
+#define FPU_UNDERFLOW     0x10
+#define FPU_INEXACT       0x20
+
+#define FPU_ALL_EXCEPT \
+  (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+
+#define PPL_FPU_TONEAREST     0
+#define PPL_FPU_DOWNWARD      0x400
+#define PPL_FPU_UPWARD        0x800
+#define PPL_FPU_TOWARDZERO    0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define SSE_INEXACT       0x20
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+#define PPL_SSE_CONTROL_DEFAULT_BASE 0x1f80
+
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT \
+  (PPL_FPU_CONTROL_DEFAULT_BASE | PPL_FPU_UPWARD)
+#define PPL_SSE_CONTROL_DEFAULT \
+  (PPL_SSE_CONTROL_DEFAULT_BASE | (PPL_FPU_UPWARD << 3))
+
+namespace Parma_Polyhedra_Library {
+
+typedef struct {
+  unsigned short control_word;
+  unsigned short unused1;
+  unsigned short status_word;
+  unsigned short unused2;
+  unsigned short tags;
+  unsigned short unused3;
+  unsigned int eip;
+  unsigned short cs_selector;
+  unsigned int opcode:11;
+  unsigned int unused4:5;
+  unsigned int data_offset;
+  unsigned short data_selector;
+  unsigned short unused5;
+} ia32_fenv_t;
+
+inline int
+fpu_get_control() {
+  unsigned short cw;
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw) : : "memory");
+  return cw;
+}
+
+inline void
+fpu_set_control(int c) {
+  unsigned short cw = static_cast<unsigned short>(c);
+  __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw) : "memory");
+}
+
+inline int
+fpu_get_status() {
+  unsigned short sw;
+  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw) : : "memory");
+  return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+  /* There is no fldsw instruction */
+  ia32_fenv_t env;
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (env));
+  env.status_word = static_cast<unsigned short>(env.status_word & ~bits);
+  __asm__ __volatile__ ("fldenv %0" : : "m" (env) : "memory");
+}
+
+inline void
+fpu_clear_exceptions() {
+  __asm__ __volatile__ ("fnclex" : /* No outputs.  */ : : "memory");
+}
+
+#ifdef PPL_FPMATH_MAY_USE_SSE
+inline void
+sse_set_control(unsigned int cw) {
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&cw) : "memory");
+}
+
+inline unsigned int
+sse_get_control() {
+  unsigned int cw;
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory");
+  return cw;
+}
+#endif
+
+inline void
+fpu_initialize_control_functions() {
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern void detect_sse_unit();
+  detect_sse_unit();
+#endif
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fpu_get_control() & FPU_ROUNDING_MASK);
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+  return static_cast<fpu_rounding_control_word_type>(0);
+}
+
+inline void
+fpu_reset_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_clear_exceptions();
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  // NOTE: on entry to this function the current rounding mode
+  // has to be the default one.
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline int
+fpu_check_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+  if (fpu_get_status() & FPU_INEXACT)
+    return 1;
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit && (sse_get_control() & SSE_INEXACT))
+    return 1;
+#endif
+  return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_ia32_inlines_hh)
diff --git a/src/fpu-none_inlines.hh b/src/fpu-none_inlines.hh
new file mode 100644
index 0000000..97da109
--- /dev/null
+++ b/src/fpu-none_inlines.hh
@@ -0,0 +1,75 @@
+/* Null floating point unit related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_none_inlines_hh
+#define PPL_fpu_none_inlines_hh 1
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+  throw std::logic_error("PPL::fpu_initialize_control_functions():"
+                         " cannot control the FPU");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  throw std::logic_error("PPL::fpu_get_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int) {
+  throw std::logic_error("PPL::fpu_set_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline void
+fpu_reset_inexact() {
+  throw std::logic_error("PPL::fpu_reset_inexact():"
+                         " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int) {
+  throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline int
+fpu_check_inexact() {
+  throw std::logic_error("PPL::fpu_check_inexact():"
+                         " cannot control the FPU");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_none_inlines_hh)
diff --git a/src/fpu-sparc_inlines.hh b/src/fpu-sparc_inlines.hh
new file mode 100644
index 0000000..969a840
--- /dev/null
+++ b/src/fpu-sparc_inlines.hh
@@ -0,0 +1,77 @@
+/* SPARC floating point unit related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_sparc_inlines_hh
+#define PPL_fpu_sparc_inlines_hh 1
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define PPL_FPU_TONEAREST  ((int) FP_RN)
+#define PPL_FPU_UPWARD     ((int) FP_RP)
+#define PPL_FPU_DOWNWARD   ((int) FP_RM)
+#define PPL_FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fpgetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpsetround((fp_rnd) dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  return static_cast<fpu_rounding_control_word_type>(fpsetround((fp_rnd) dir));
+}
+
+inline void
+fpu_reset_inexact() {
+  fp_except except = fpgetmask();
+  except &= ~FP_X_IMP;
+  fpsetmask(except);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fpsetround((fp_rnd) w);
+}
+
+inline int
+fpu_check_inexact() {
+  return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_IEEEFP_H)
+
+#endif // !defined(PPL_fpu_sparc_inlines_hh)
diff --git a/src/fpu_defs.hh b/src/fpu_defs.hh
new file mode 100644
index 0000000..dce91e4
--- /dev/null
+++ b/src/fpu_defs.hh
@@ -0,0 +1,104 @@
+/* Floating point unit related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_fpu_defs_hh
+#define PPL_fpu_defs_hh 1
+
+#include "fpu_types.hh"
+#include "compiler.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Functions Controlling Floating Point Unit
+//@{
+
+//! Initializes the FPU control functions.
+void
+fpu_initialize_control_functions();
+
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
+
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir and returns the rounding
+  control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+  computation</EM> status, and returns the rounding control word
+  previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
+
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
+
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
+
+/*! \brief
+  Queries the <EM>inexact computation</EM> status.
+
+  Returns 0 if the computation was definitely exact, 1 if it was
+  definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
+
+//@} // Functions Controlling Floating Point Unit
+
+} // namespace Parma_Polyhedra_Library
+
+#if PPL_CAN_CONTROL_FPU
+
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+#include "fpu-ia32_inlines.hh"
+#elif defined(PPL_HAVE_IEEEFP_H)                                        \
+  && (defined(__sparc)                                                  \
+      || defined(sparc)                                                 \
+      || defined(__sparc__))
+#include "fpu-sparc_inlines.hh"
+#elif defined(PPL_HAVE_FENV_H)
+#include "fpu-c99_inlines.hh"
+#else
+#error "PPL_CAN_CONTROL_FPU evaluates to true: why?"
+#endif
+
+#else // !PPL_CAN_CONTROL_FPU
+
+#include "fpu-none_inlines.hh"
+
+#endif // !PPL_CAN_CONTROL_FPU
+
+#endif // !defined(PPL_fpu_defs_hh)
diff --git a/src/fpu_types.hh b/src/fpu_types.hh
new file mode 100644
index 0000000..e76c3a9
--- /dev/null
+++ b/src/fpu_types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_fpu_types_hh
+#define PPL_fpu_types_hh 1
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+enum fpu_rounding_direction_type {};
+enum fpu_rounding_control_word_type {};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_fpu_types_hh)
diff --git a/src/globals.cc b/src/globals.cc
new file mode 100644
index 0000000..a6f3517
--- /dev/null
+++ b/src/globals.cc
@@ -0,0 +1,59 @@
+/* Definitions of global objects.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "globals_defs.hh"
+#include "Constraint_defs.hh"
+#include "Generator_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+const Throwable* volatile abandon_expensive_computations = 0;
+
+// Initialize Weightwatch_Traits static data members.
+Weightwatch_Traits::Threshold Weightwatch_Traits::weight = 0;
+void (*Weightwatch_Traits::check_function)(void) = 0;
+
+#ifndef NDEBUG
+
+unsigned int In_Assert::count = 0;
+
+#endif
+
+
+dimension_type
+check_space_dimension_overflow(const dimension_type dim,
+                               const dimension_type max,
+                               const char* domain,
+                               const char* method,
+                               const char* reason) {
+  if (dim > max) {
+    std::ostringstream s;
+    s << domain << method << ":" << std::endl
+      << reason << ".";
+    throw std::length_error(s.str());
+  }
+  return dim;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/globals_defs.hh b/src/globals_defs.hh
new file mode 100644
index 0000000..d5907b2
--- /dev/null
+++ b/src/globals_defs.hh
@@ -0,0 +1,569 @@
+/* Declarations of global objects.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_globals_defs_hh
+#define PPL_globals_defs_hh 1
+
+#include "globals_types.hh"
+#include "C_Integer.hh"
+#include "meta_programming.hh"
+#include "Slow_Copy.hh"
+#include "Temp_defs.hh"
+#include <exception>
+#include <gmpxx.h>
+
+#ifndef PPL_PROFILE_ADD_WEIGHT
+#define PPL_PROFILE_ADD_WEIGHT 0
+#endif
+
+#if defined(NDEBUG) && PPL_PROFILE_ADD_WEIGHT
+#include "Weight_Profiler_defs.hh"
+#endif
+
+#if defined(NDEBUG)
+
+#if PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN() Weight_Profiler::begin()
+
+#define WEIGHT_ADD(delta)                                     \
+  do {                                                        \
+    static Weight_Profiler wp__(__FILE__, __LINE__, delta);   \
+    wp__.end();                                               \
+  } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor)                                   \
+  do {                                                                  \
+    static Weight_Profiler wp__(__FILE__, __LINE__, delta);             \
+    wp__.end(factor);                                                   \
+  } while (false)
+
+#else // !PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN()                          \
+  do {                                          \
+  } while (false)
+
+#define WEIGHT_ADD(delta)                       \
+  do {                                          \
+    Weightwatch_Traits::weight += (delta);      \
+  } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor)                   \
+  do {                                                  \
+    Weightwatch_Traits::weight += (delta)*(factor);     \
+  } while (false)
+
+#endif // !PPL_PROFILE_ADD_WEIGHT
+
+#else // !defined(NDEBUG)
+
+#define WEIGHT_BEGIN()
+
+#define WEIGHT_ADD(delta)                       \
+  do {                                          \
+    if (!In_Assert::asserting())                \
+      Weightwatch_Traits::weight += delta;      \
+  } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor)                   \
+  do {                                                  \
+    if (!In_Assert::asserting())                        \
+      Weightwatch_Traits::weight += delta * factor;     \
+  } while (false)
+
+#endif // !defined(NDEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the hash code for space dimension \p dim.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int32_t
+hash_code_from_dimension(dimension_type dim);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Make sure swap() is specialized when needed.
+
+  This will cause a compile-time error whenever a specialization for \p T
+  is beneficial but missing.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Slow_Copy<T>::value, void>::type
+swap(T&, T&) {
+  PPL_COMPILE_TIME_CHECK(!Slow_Copy<T>::value, "missing swap specialization");
+}
+
+/*! \brief
+  Declare a local variable named \p id, of type Coefficient, and containing
+  an unknown initial value.
+
+  Use of this macro to declare temporaries of type Coefficient results
+  in decreased memory allocation overhead and in better locality.
+*/
+#define PPL_DIRTY_TEMP_COEFFICIENT(id) \
+PPL_DIRTY_TEMP(Parma_Polyhedra_Library::Coefficient, id)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+  \return
+  The actual capacity to be allocated.
+
+  \param requested_size
+  The number of elements we need.
+
+  \param maximum_size
+  The maximum number of elements to be allocated. It is assumed
+  to be no less than \p requested_size.
+
+  Computes a capacity given a requested size.
+  Allows for speculative allocation aimed at reducing the number of
+  reallocations enough to guarantee amortized constant insertion time
+  for our vector-like data structures. In all cases, the speculative
+  allocation will not exceed \p maximum_size.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+compute_capacity(dimension_type requested_size,
+                 dimension_type maximum_size);
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Traits class for the deterministic timeout mechanism.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Weightwatch_Traits {
+  //! The type used to specify thresholds for computational weight.
+  typedef unsigned long long Threshold;
+
+  //! The type used to specify increments of computational weight.
+  typedef unsigned long long Delta;
+
+  //! Returns the current computational weight.
+  static const Threshold& get();
+
+  //! Compares the two weights \p a and \p b.
+  static bool less_than(const Threshold& a, const Threshold& b);
+
+  //! Computes a \c Delta value from \p unscaled and \p scale.
+  /*!
+    \return
+    \f$u \cdot 2^s\f$, where \f$u\f$ is the value of \p unscaled and
+    \f$s\f$ is the value of \p scale.
+
+    \param unscaled
+    The value of delta before scaling.
+
+    \param scale
+    The scaling to be applied to \p unscaled.
+  */
+  static Delta compute_delta(unsigned long unscaled, unsigned scale);
+
+  //! Sets \p threshold to be \p delta units bigger than the current weight.
+  static void from_delta(Threshold& threshold, const Delta& delta);
+
+  //! The current computational weight.
+  static Threshold weight;
+
+  /*! \brief
+    A pointer to the function that has to be called when checking
+    the reaching of thresholds.
+
+    The pointer can be null if no thresholds are set.
+  */
+  static void (*check_function)(void);
+};
+
+
+#ifndef NDEBUG
+
+class In_Assert {
+private:
+  //! Non zero during evaluation of PPL_ASSERT expression.
+  static unsigned int count;
+public:
+  In_Assert() {
+    ++count;
+  }
+  ~In_Assert() {
+    --count;
+  }
+  static bool asserting() {
+    return count != 0;
+  }
+};
+
+#endif
+
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+class Throwable {
+public:
+  //! Throws the user defined exception object.
+  virtual void throw_me() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Throwable();
+};
+
+/*! \brief
+  A pointer to an exception object.
+
+  \ingroup PPL_CXX_interface
+  This pointer, which is initialized to zero, is repeatedly checked
+  along any super-linear (i.e., computationally expensive) computation
+  path in the library.
+  When it is found nonzero the exception it points to is thrown.
+  In other words, making this pointer point to an exception (and
+  leaving it in this state) ensures that the library will return
+  control to the client application, possibly by throwing the given
+  exception, within a time that is a linear function of the size
+  of the representation of the biggest object (powerset of polyhedra,
+  polyhedron, system of constraints or generators) on which the library
+  is operating upon.
+
+  \note
+  The only sensible way to assign to this pointer is from within a
+  signal handler or from a parallel thread.  For this reason, the
+  library, apart from ensuring that the pointer is initially set to zero,
+  never assigns to it.  In particular, it does not zero it again when
+  the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the pointer abandon_expensive_computations is found
+  to be nonzero, the exception it points to is thrown.
+
+  \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to distinguish those constructors that recycle the data
+  structures of their arguments, instead of taking a copy.
+*/
+struct Recycle_Input {
+};
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#define PPL_OUTPUT_DECLARATIONS                                         \
+  /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+  void ascii_dump() const;                                              \
+  /*! \brief Writes to \p s an ASCII representation of \p *this. */     \
+  void ascii_dump(std::ostream& s) const;                               \
+  /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */    \
+  void print() const;
+
+#define PPL_OUTPUT_DEFINITIONS(class_name)                      \
+  void                                                          \
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {     \
+    ascii_dump(std::cerr);                                      \
+  }                                                             \
+                                                                \
+  void                                                          \
+  Parma_Polyhedra_Library::class_name::print() const {          \
+    using IO_Operators::operator<<;                             \
+    std::cerr << *this;                                         \
+  }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name)                   \
+  void                                                                  \
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {             \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  void                                                                  \
+  Parma_Polyhedra_Library::class_name::print() const {                  \
+    std::cerr << "No user level output operator defined "               \
+              << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix)      \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::ascii_dump() const {                             \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::print() const {                                  \
+    using IO_Operators::operator<<;                                     \
+    std::cerr << *this;                                                 \
+  }
+
+#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,           \
+                                                type_symbol2,           \
+                                                class_prefix)           \
+  template <typename type_symbol1, typename type_symbol2>               \
+  void                                                                  \
+  PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)>         \
+  ::ascii_dump() const {                                                \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  template <typename type_symbol1, typename type_symbol2>               \
+  void                                                                  \
+  PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)>         \
+  ::print() const {                                                     \
+    using IO_Operators::operator<<;                                     \
+    std::cerr << *this;                                                 \
+  }
+
+#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,           \
+                                                type_symbol2,           \
+                                                type_symbol3,           \
+                                                class_prefix)           \
+  template <typename type_symbol1, typename type_symbol2,               \
+            typename type_symbol3>                                      \
+  void                                                                  \
+  PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2,                \
+                      PPL_U(type_symbol3)>::ascii_dump()                \
+    const {                                                             \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+    template <typename type_symbol1, typename type_symbol2,             \
+              typename type_symbol3>                                    \
+    void                                                                \
+    PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2,              \
+                        PPL_U(type_symbol3)>::print()                   \
+      const {                                                           \
+      using IO_Operators::operator<<;                                   \
+      std::cerr << *this;                                               \
+    }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::ascii_dump() const {                                    \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::print() const {                                         \
+    std::cerr << "No user level output operator defined "               \
+              << "for " PPL_XSTR(class_prefix) << "." << std::endl;     \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if \p c is any kind of space character.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_space(char c);
+
+template <typename T, long long v, typename Enable = void>
+struct Fit : public False {
+};
+
+template <typename T, long long v>
+struct Fit<T, v, typename Enable_If<C_Integer<T>::value>::type>  {
+  enum {
+    value = (v >= static_cast<long long>(C_Integer<T>::min)
+             && v <= static_cast<long long>(C_Integer<T>::max))
+  };
+};
+
+template <typename T, T v>
+struct TConstant {
+  static const T value = v;
+};
+
+
+template <typename T, T v>
+const T TConstant<T, v>::value;
+
+template <typename T, long long v, bool prefer_signed = true,
+          typename Enable = void>
+struct Constant_ : public TConstant<T, v> {
+};
+
+//! \cond
+// Keep Doxygen off until it learns how to deal properly with `||'.
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+                 typename Enable_If<(Fit<typename C_Integer<T>::smaller_signed_type, v>::value
+                                     && (prefer_signed
+                                         || !Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_signed_type, v, prefer_signed> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+                 typename Enable_If<(Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value
+                                     && (!prefer_signed
+                                         || !Fit<typename C_Integer<T>::smaller_signed_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_unsigned_type, v, prefer_signed> {
+};
+
+//! \endcond
+
+template <long long v, bool prefer_signed = true>
+struct Constant : public Constant_<long long, v, prefer_signed> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Memory Size Inspection Functions
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the total size in bytes of the memory
+  occupied by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the size in bytes of the memory managed
+  by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@} // Memory Size Inspection Functions
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+
+template <typename T, typename Enable = void>
+struct Has_OK : public False { };
+
+template <typename T>
+struct Has_OK<T, typename Enable_If_Is<bool (T::*)() const, &T::OK>::type>
+  : public True {
+};
+
+template <typename T>
+inline typename Enable_If<Has_OK<T>::value, bool>::type
+f_OK(const T& to) {
+  return to.OK();
+}
+
+#define FOK(T) inline bool f_OK(const T&) { return true; }
+
+FOK(char)
+FOK(signed char)
+FOK(unsigned char)
+FOK(signed short)
+FOK(unsigned short)
+FOK(signed int)
+FOK(unsigned int)
+FOK(signed long)
+FOK(unsigned long)
+FOK(signed long long)
+FOK(unsigned long long)
+FOK(float)
+FOK(double)
+FOK(long double)
+FOK(mpz_class)
+FOK(mpq_class)
+
+void ascii_dump(std::ostream& s, Representation r);
+bool ascii_load(std::istream& s, Representation& r);
+
+dimension_type
+check_space_dimension_overflow(dimension_type dim,
+                               dimension_type max,
+                               const char* domain,
+                               const char* method,
+                               const char* reason);
+
+template <typename RA_Container>
+typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n);
+
+template <typename RA_Container>
+typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n);
+
+dimension_type
+least_significant_one_mask(dimension_type i);
+
+} // namespace Parma_Polyhedra_Library
+
+// By default, use sparse matrices both for MIP_Problem and PIP_Problem.
+#ifndef PPL_USE_SPARSE_MATRIX
+#define PPL_USE_SPARSE_MATRIX 1
+#endif
+
+#include "globals_inlines.hh"
+
+#endif // !defined(PPL_globals_defs_hh)
diff --git a/src/globals_inlines.hh b/src/globals_inlines.hh
new file mode 100644
index 0000000..7aabcf0
--- /dev/null
+++ b/src/globals_inlines.hh
@@ -0,0 +1,190 @@
+/* Implementation of global objects: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_globals_inlines_hh
+#define PPL_globals_inlines_hh 1
+
+#include "compiler.hh"
+#include <limits>
+#include <cassert>
+#include <istream>
+#include <ostream>
+#include <cctype>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+  return std::numeric_limits<dimension_type>::max();
+}
+
+inline int32_t
+hash_code_from_dimension(dimension_type dim) {
+  const dimension_type divisor = 1U << (32 - 1);
+  dim = dim % divisor;
+  return static_cast<int32_t>(dim);
+}
+
+inline const Weightwatch_Traits::Threshold&
+Weightwatch_Traits::get() {
+  return weight;
+}
+
+inline bool
+Weightwatch_Traits::less_than(const Threshold& a, const Threshold& b) {
+  return b - a < (1ULL << (sizeof_to_bits(sizeof(Threshold)) - 1));
+}
+
+inline Weightwatch_Traits::Delta
+Weightwatch_Traits::compute_delta(unsigned long unscaled, unsigned scale) {
+  if ((std::numeric_limits<Delta>::max() >> scale) < unscaled)
+    throw std::invalid_argument("PPL::Weightwatch_Traits::"
+                                "compute_delta(u, s):\n"
+                                "values of u and s cause wrap around.");
+  return static_cast<Delta>(unscaled) << scale;
+}
+
+inline void
+Weightwatch_Traits::from_delta(Threshold& threshold, const Delta& delta) {
+  threshold = weight + delta;
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+#ifndef NDEBUG
+  if (In_Assert::asserting())
+    return;
+#endif
+  if (Weightwatch_Traits::check_function != 0)
+    Weightwatch_Traits::check_function();
+  if (const Throwable* const p = abandon_expensive_computations)
+    p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+                 const dimension_type maximum_size) {
+  assert(requested_size <= maximum_size);
+  // Speculation factor 2.
+  return (requested_size < maximum_size/2)
+    ? (2*(requested_size + 1))
+    : maximum_size;
+  // Speculation factor 1.5.
+  // return (maximum_size - requested_size > requested_size/2)
+  //   ? requested_size + requested_size/2 + 1
+  //   : maximum_size;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&) {
+  return 0;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&) {
+  return sizeof(T);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+  return static_cast<memory_size_type>(x.get_mpz_t()[0]._mp_alloc)
+    * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpz_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+  return external_memory_in_bytes(x.get_num())
+    + external_memory_in_bytes(x.get_den());
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpq_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline void
+ascii_dump(std::ostream& s, Representation r) {
+  if (r == DENSE)
+    s << "DENSE";
+  else
+    s << "SPARSE";
+}
+
+inline bool
+ascii_load(std::istream& is, Representation& r) {
+  std::string s;
+  if (!(is >> s))
+    return false;
+
+  if (s == "DENSE")  {
+    r = DENSE;
+    return true;
+  }
+  if (s == "SPARSE")  {
+    r = SPARSE;
+    return true;
+  }
+  return false;
+}
+
+inline bool
+is_space(char c) {
+  return isspace(c) != 0;
+}
+
+template <typename RA_Container>
+inline typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n) {
+  typedef typename RA_Container::difference_type diff_t;
+  return cont.begin() + static_cast<diff_t>(n);
+}
+
+template <typename RA_Container>
+inline typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n) {
+  typedef typename RA_Container::difference_type diff_t;
+  return cont.begin() + static_cast<diff_t>(n);
+}
+
+inline dimension_type
+least_significant_one_mask(const dimension_type i) {
+  return i & (~i + 1U);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_globals_inlines_hh)
diff --git a/src/globals_types.hh b/src/globals_types.hh
new file mode 100644
index 0000000..687fa2d
--- /dev/null
+++ b/src/globals_types.hh
@@ -0,0 +1,214 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_globals_types_hh
+#define PPL_globals_types_hh 1
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+  //! The universe element, i.e., the whole vector space.
+  UNIVERSE,
+  //! The empty element, i.e., the empty set.
+  EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+// This must be kept in sync with Result
+enum Relation_Symbol {
+  //! \hideinitializer Equal to.
+  EQUAL = 1U,
+  //! \hideinitializer Less than.
+  LESS_THAN = 2U,
+  //! \hideinitializer Less than or equal to.
+  LESS_OR_EQUAL = LESS_THAN | EQUAL,
+  //! \hideinitializer Greater than.
+  GREATER_THAN = 4U,
+  //! \hideinitializer Greater than or equal to.
+  GREATER_OR_EQUAL = GREATER_THAN | EQUAL,
+  //! \hideinitializer Not equal to.
+  NOT_EQUAL = LESS_THAN | GREATER_THAN
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+  //! Worst-case polynomial complexity.
+  POLYNOMIAL_COMPLEXITY,
+  //! Worst-case exponential complexity but typically polynomial behavior.
+  SIMPLEX_COMPLEXITY,
+  //! Any complexity.
+  ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+  //! Minimization is requested.
+  MINIMIZATION,
+  //! Maximization is requested.
+  MAXIMIZATION
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Widths of bounded integer types.
+
+  See the section on
+  \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Width {
+  //! \hideinitializer 8 bits.
+  BITS_8 = 8,
+
+  //! \hideinitializer 16 bits.
+  BITS_16 = 16,
+
+  //! \hideinitializer 32 bits.
+  BITS_32 = 32,
+
+  //! \hideinitializer 64 bits.
+  BITS_64 = 64,
+
+  //! \hideinitializer 128 bits.
+  BITS_128 = 128
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Representation of bounded integer types.
+
+  See the section on
+  \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Representation {
+  //! Unsigned binary.
+  UNSIGNED,
+
+  /*! \brief
+    Signed binary where negative values are represented by the two's
+    complement of the absolute value.
+  */
+  SIGNED_2_COMPLEMENT
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Overflow behavior of bounded integer types.
+
+  See the section on
+  \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Overflow {
+  /*! \brief
+    On overflow, wrapping takes place.
+
+    This means that, for a \f$w\f$-bit bounded integer, the computation
+    happens modulo \f$2^w\f$.
+  */
+  OVERFLOW_WRAPS,
+
+  /*! \brief
+    On overflow, the result is undefined.
+
+    This simply means that the result of the operation resulting in an
+    overflow can take any value.
+
+    \note
+    Even though something more serious can happen in the system
+    being analyzed ---due to, e.g., C's undefined behavior---, here we
+    are only concerned with the results of arithmetic operations.
+    It is the responsibility of the analyzer to ensure that other
+    manifestations of undefined behavior are conservatively approximated.
+  */
+  OVERFLOW_UNDEFINED,
+
+  /*! \brief
+    Overflow is impossible.
+
+    This is for the analysis of languages where overflow is trapped
+    before it affects the state, for which, thus, any indication that
+    an overflow may have affected the state is necessarily due to
+    the imprecision of the analysis.
+  */
+  OVERFLOW_IMPOSSIBLE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Possible representations of coefficient sequences (i.e. linear expressions
+  and more complex objects containing linear expressions, e.g. Constraints,
+  Generators, etc.).
+*/
+enum Representation {
+  /*! \brief
+    Dense representation: the coefficient sequence is represented as a vector
+    of coefficients, including the zero coefficients.
+    If there are only a few nonzero coefficients, this representation is
+    faster and also uses a bit less memory.
+  */
+  DENSE,
+
+  /*! \brief
+    Sparse representation: only the nonzero coefficient are stored.
+    If there are many nonzero coefficients, this improves memory consumption
+    and run time (both because there is less data to process in O(n)
+    operations and because finding zeroes/nonzeroes is much faster since
+    zeroes are not stored at all, so any stored coefficient is nonzero).
+  */
+  SPARSE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Floating point formats known to the library.
+
+  The parameters of each format are defined by a specific struct
+  in file Float_defs.hh.  See the section on \ref floating_point
+  "Analysis of floating point computations" for more information.
+*/
+enum Floating_Point_Format {
+  //! IEEE 754 half precision, 16 bits (5 exponent, 10 mantissa).
+  IEEE754_HALF,
+
+  //! IEEE 754 single precision, 32 bits (8 exponent, 23 mantissa).
+  IEEE754_SINGLE,
+
+  //! IEEE 754 double precision, 64 bits (11 exponent, 52 mantissa).
+  IEEE754_DOUBLE,
+
+  //! IEEE 754 quad precision, 128 bits (15 exponent, 112 mantissa).
+  IEEE754_QUAD,
+
+  //! Intel double extended precision, 80 bits (15 exponent, 64 mantissa)
+  INTEL_DOUBLE_EXTENDED,
+
+  //! IBM single precision, 32 bits (7 exponent, 24 mantissa).
+  IBM_SINGLE,
+
+  //! IBM double precision, 64 bits (7 exponent, 56 mantissa).
+  IBM_DOUBLE
+};
+
+struct Weightwatch_Traits;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_globals_types_hh)
diff --git a/src/initializer.hh b/src/initializer.hh
new file mode 100644
index 0000000..f681040
--- /dev/null
+++ b/src/initializer.hh
@@ -0,0 +1,62 @@
+/* Nifty counter object for the initialization of the library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_initializer_hh
+#define PPL_initializer_hh 1
+
+#include "Init_defs.hh"
+
+#ifndef PPL_NO_AUTOMATIC_INITIALIZATION
+
+static Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+#else
+
+static Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p;
+
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Initializes the library.
+inline void
+initialize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  if (Parma_Polyhedra_Library_initializer_p == 0)
+    Parma_Polyhedra_Library_initializer_p = new Init();
+#endif
+}
+
+//! Finalizes the library.
+inline void
+finalize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  PPL_ASSERT(Parma_Polyhedra_Library_initializer_p != 0);
+  delete Parma_Polyhedra_Library_initializer_p;
+  Parma_Polyhedra_Library_initializer_p = 0;
+#endif
+}
+
+} //namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_initializer_hh)
diff --git a/src/intervals_defs.hh b/src/intervals_defs.hh
new file mode 100644
index 0000000..59574c4
--- /dev/null
+++ b/src/intervals_defs.hh
@@ -0,0 +1,473 @@
+/* Helper classes for intervals.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_intervals_defs_hh
+#define PPL_intervals_defs_hh 1
+
+#include "assert.hh"
+#include <cstdlib>
+
+#include "Checked_Number_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The result of an operation on intervals.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum I_Result {
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_EMPTY = 1U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may have only one value.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_SINGLETON = 2U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief \hideinitializer
+    Result may have more than one value, but it is not the domain universe.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_SOME = 4U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_UNIVERSE = 8U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_NOT_EMPTY = I_SINGLETON | I_SOME | I_UNIVERSE,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_ANY = I_EMPTY | I_NOT_EMPTY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_NOT_UNIVERSE = I_EMPTY | I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is neither empty nor the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_NOT_DEGENERATE = I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is definitely exact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_EXACT = 16,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is definitely inexact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_INEXACT = 32,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Operation has definitely changed the set.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_CHANGED = 64,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Operation has left the set definitely unchanged.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_UNCHANGED = 128,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Operation is undefined for some combination of values.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_SINGULARITIES = 256
+};
+
+inline I_Result
+operator|(I_Result a, I_Result b) {
+  return static_cast<I_Result>(static_cast<unsigned>(a)
+                               | static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator&(I_Result a, I_Result b) {
+  return static_cast<I_Result>(static_cast<unsigned>(a)
+                               & static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator-(I_Result a, I_Result b) {
+    return static_cast<I_Result>(static_cast<unsigned>(a)
+                                 & ~static_cast<unsigned>(b));
+}
+
+template <typename Criteria, typename T>
+struct Use_By_Ref;
+
+struct Use_Slow_Copy;
+template <typename T>
+struct Use_By_Ref<Use_Slow_Copy, T>
+  : public Bool<Slow_Copy<T>::value> {
+};
+
+struct By_Value;
+template <typename T>
+struct Use_By_Ref<By_Value, T>
+  : public False {
+};
+
+struct By_Ref;
+template <typename T>
+struct Use_By_Ref<By_Ref, T>
+  : public True {
+};
+
+template <typename T, typename Criteria = Use_Slow_Copy, typename Enable = void>
+class Val_Or_Ref;
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+                 typename Enable_If<!Use_By_Ref<Criteria, T>::value>::type> {
+  T value;
+public:
+  typedef T Arg_Type;
+  typedef T Return_Type;
+  Val_Or_Ref()
+    : value() {
+  }
+  explicit Val_Or_Ref(Arg_Type v, bool = false)
+    : value(v) {
+  }
+  Val_Or_Ref& operator=(Arg_Type v) {
+    value = v;
+    return *this;
+  }
+  void set(Arg_Type v, bool = false) {
+    value = v;
+  }
+  Return_Type get() const {
+    return value;
+  }
+  operator Return_Type () const {
+    return get();
+  }
+};
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+                 typename Enable_If<Use_By_Ref<Criteria, T>::value>::type> {
+  const T* ptr;
+public:
+  typedef T& Arg_Type;
+  typedef const T& Return_Type;
+  Val_Or_Ref()
+    : ptr(0) {
+  }
+  explicit Val_Or_Ref(Arg_Type v)
+    : ptr(&v) {
+  }
+  Val_Or_Ref(const T& v, bool)
+    : ptr(&v) {
+  }
+  Val_Or_Ref& operator=(Arg_Type v) {
+    ptr = &v;
+    return *this;
+  }
+  void set(Arg_Type v) {
+    ptr = &v;
+  }
+  void set(const T& v, bool) {
+    ptr = &v;
+  }
+  Return_Type get() const {
+    return *ptr;
+  }
+  operator Return_Type () const {
+    return get();
+  }
+};
+
+class I_Constraint_Base {
+};
+
+template <typename Derived>
+class I_Constraint_Common : public I_Constraint_Base {
+public:
+  template <typename T>
+  Result convert_real(T& to) const {
+    const Derived& c = static_cast<const Derived&>(*this);
+    Result r = c.rel();
+    switch (r) {
+    case V_EMPTY:
+    case V_LGE:
+      return r;
+    case V_LE:
+      r = assign_r(to, c.value(), (ROUND_UP | ROUND_STRICT_RELATION));
+      r = result_relation_class(r);
+      if (r == V_EQ)
+        return V_LE;
+      goto lt;
+    case V_LT:
+      r = assign_r(to, c.value(), ROUND_UP);
+      r = result_relation_class(r);
+    lt:
+      switch (r) {
+      case V_EMPTY:
+      case V_LT_PLUS_INFINITY:
+      case V_EQ_MINUS_INFINITY:
+        return r;
+      case V_LT:
+      case V_LE:
+      case V_EQ:
+        return V_LT;
+      default:
+        break;
+      }
+      break;
+    case V_GE:
+      r = assign_r(to, c.value(), (ROUND_DOWN | ROUND_STRICT_RELATION));
+      r = result_relation_class(r);
+      if (r == V_EQ)
+        return V_GE;
+      goto gt;
+    case V_GT:
+      r = assign_r(to, c.value(), ROUND_DOWN);
+      r = result_relation_class(r);
+    gt:
+      switch (r) {
+      case V_EMPTY:
+      case V_GT_MINUS_INFINITY:
+      case V_EQ_PLUS_INFINITY:
+        return r;
+      case V_LT:
+      case V_LE:
+      case V_EQ:
+        return V_GT;
+      default:
+        break;
+      }
+      break;
+    case V_EQ:
+      r = assign_r(to, c.value(), ROUND_CHECK);
+      r = result_relation_class(r);
+      PPL_ASSERT(r != V_LT && r != V_GT);
+      if (r == V_EQ)
+        return V_EQ;
+      else
+        return V_EMPTY;
+    case V_NE:
+      r = assign_r(to, c.value(), ROUND_CHECK);
+      r = result_relation_class(r);
+      if (r == V_EQ)
+        return V_NE;
+      else
+        return V_LGE;
+    default:
+      break;
+    }
+    PPL_UNREACHABLE;
+    return V_EMPTY;
+  }
+  template <typename T>
+  Result convert_real(T& to1, Result& rel2, T& to2) const {
+    const Derived& c = static_cast<const Derived&>(*this);
+    Result rel1;
+    if (c.rel() != V_EQ) {
+      rel2 = convert(to2);
+      return V_LGE;
+    }
+    rel2 = assign_r(to2, c.value(), ROUND_UP);
+    rel2 = result_relation_class(rel2);
+    switch (rel2) {
+    case V_EMPTY:
+    case V_EQ_MINUS_INFINITY:
+    case V_EQ:
+      return V_LGE;
+    default:
+      break;
+    }
+    rel1 = assign_r(to1, c.value(), ROUND_DOWN);
+    rel1 = result_relation_class(rel1);
+    switch (rel1) {
+    case V_EQ:
+      PPL_ASSERT(rel2 == V_LE);
+      goto eq;
+    case V_EQ_PLUS_INFINITY:
+    case V_EMPTY:
+      rel2 = rel1;
+      return V_LGE;
+    case V_GE:
+      if (rel2 == V_LE && to1 == to2) {
+      eq:
+        rel2 = V_EQ;
+        return V_LGE;
+      }
+      /* Fall through*/
+    case V_GT:
+    case V_GT_MINUS_INFINITY:
+      return rel1;
+    default:
+      PPL_UNREACHABLE;
+      return V_EMPTY;
+    }
+    switch (rel2) {
+    case V_LE:
+    case V_LT:
+    case V_LT_PLUS_INFINITY:
+      return rel1;
+    default:
+      PPL_UNREACHABLE;
+      return V_EMPTY;
+    }
+  }
+  template <typename T>
+  Result convert_integer(T& to) const {
+    Result rel = convert_real(to);
+    switch (rel) {
+    case V_LT:
+      if (is_integer(to)) {
+        rel = sub_assign_r(to, to, T(1), (ROUND_UP | ROUND_STRICT_RELATION));
+        rel = result_relation_class(rel);
+        return (rel == V_EQ) ? V_LE : rel;
+      }
+      /* Fall through */
+    case V_LE:
+      rel = floor_assign_r(to, to, ROUND_UP);
+      rel = result_relation_class(rel);
+      PPL_ASSERT(rel == V_EQ);
+      return V_LE;
+    case V_GT:
+      if (is_integer(to)) {
+        rel = add_assign_r(to, to, T(1), (ROUND_DOWN | ROUND_STRICT_RELATION));
+        rel = result_relation_class(rel);
+        return (rel == V_EQ) ? V_GE : rel;
+      }
+      /* Fall through */
+    case V_GE:
+      rel = ceil_assign_r(to, to, ROUND_DOWN);
+      rel = result_relation_class(rel);
+      PPL_ASSERT(rel == V_EQ);
+      return V_GE;
+    case V_EQ:
+      if (is_integer(to))
+        return V_EQ;
+      return V_EMPTY;
+    case V_NE:
+      if (is_integer(to))
+        return V_NE;
+      return V_LGE;
+    default:
+      return rel;
+    }
+  }
+};
+
+struct I_Constraint_Rel {
+  Result rel;
+  I_Constraint_Rel(Result r)
+    : rel(r) {
+    PPL_ASSERT(result_relation_class(r) == r);
+  }
+  I_Constraint_Rel(Relation_Symbol r)
+    : rel(static_cast<Result>(r)) {
+  }
+  operator Result() const {
+    return rel;
+  }
+};
+
+template <typename T, typename Val_Or_Ref_Criteria = Use_Slow_Copy,
+          bool extended = false>
+class I_Constraint
+  : public I_Constraint_Common<I_Constraint<T, Val_Or_Ref_Criteria,
+                                            extended> > {
+  typedef Val_Or_Ref<T, Val_Or_Ref_Criteria> Val_Ref;
+  typedef typename Val_Ref::Arg_Type Arg_Type;
+  typedef typename Val_Ref::Return_Type Return_Type;
+  Result rel_;
+  Val_Ref value_;
+public:
+  typedef T value_type;
+  explicit I_Constraint()
+    : rel_(V_LGE) {
+  }
+  I_Constraint(I_Constraint_Rel r, Arg_Type v)
+    : rel_(r), value_(v) {
+  }
+  I_Constraint(I_Constraint_Rel r, const T& v, bool force)
+    : rel_(r), value_(v, force) {
+  }
+  template <typename U>
+  I_Constraint(I_Constraint_Rel r, const U& v)
+    : rel_(r), value_(v) {
+  }
+  void set(I_Constraint_Rel r, Arg_Type v) {
+    rel_ =  r;
+    value_.set(v);
+  }
+  void set(I_Constraint_Rel r, const T& v, bool force) {
+    rel_ =  r;
+    value_.set(v, force);
+  }
+  template <typename U>
+  void set(I_Constraint_Rel r, const U& v) {
+    rel_ = r;
+    value_.set(v);
+  }
+  Return_Type value() const {
+    return value_;
+  }
+  Result rel() const {
+    return rel_;
+  }
+};
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v) {
+  return I_Constraint<T>(rel, v);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force) {
+  return I_Constraint<T>(rel, v, force);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, T& v) {
+  return I_Constraint<T>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, const Val_Or_Ref_Criteria&) {
+  return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force,
+             const Val_Or_Ref_Criteria&) {
+  return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v, force);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, T& v, const Val_Or_Ref_Criteria&) {
+  return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_intervals_defs_hh)
diff --git a/src/iterator_to_const_defs.hh b/src/iterator_to_const_defs.hh
new file mode 100644
index 0000000..74a889b
--- /dev/null
+++ b/src/iterator_to_const_defs.hh
@@ -0,0 +1,221 @@
+/* iterator_to_const and const_iterator_to_const class declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_iterator_to_const_hh
+#define PPL_iterator_to_const_hh 1
+
+#include "iterator_to_const_types.hh"
+#include "Powerset_types.hh"
+//#include "Ask_Tell_types.hh"
+#include <iterator>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This template class implements a bidirectional <EM>read-only</EM>
+  iterator on the sequence of objects <CODE>Container</CODE>.
+  By using this iterator class it is not possible to modify the objects
+  contained in <CODE>Container</CODE>; rather, object modification has
+  to be implemented by object replacement, i.e., by using the methods
+  provided by <CODE>Container</CODE> to remove/insert objects.
+  Such a policy (a modifiable container of read-only objects) allows
+  for a reliable enforcement of invariants (such as sortedness of the
+  objects in the sequence).
+
+  \note
+  For any developers' need, suitable friend declarations allow for
+  accessing the low-level iterators on the sequence of objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::iterator_to_const {
+private:
+  //! The type of the underlying mutable iterator.
+  typedef typename Container::iterator Base;
+
+  //! A shortcut for naming the const_iterator traits.
+  typedef typename
+  std::iterator_traits<typename Container::const_iterator> Traits;
+
+  //! A (mutable) iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level iterator.
+  iterator_to_const(const Base& b);
+
+  friend class const_iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+
+public:
+  // Same traits of the const_iterator, therefore
+  // forbidding the direct modification of sequence elements.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  iterator_to_const();
+
+  //! Copy constructor.
+  iterator_to_const(const iterator_to_const& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect access operator.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const iterator_to_const& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This class, besides implementing a read-only bidirectional iterator
+  on a read-only sequence of objects, ensures interoperability
+  with template class iterator_to_const.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::const_iterator_to_const {
+private:
+  //! The type of the underlying %const_iterator.
+  typedef typename Container::const_iterator Base;
+
+  //! A shortcut for naming traits.
+  typedef typename std::iterator_traits<Base> Traits;
+
+  //! A %const_iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level const_iterator.
+  const_iterator_to_const(const Base& b);
+
+  friend class iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+
+public:
+  // Same traits of the underlying const_iterator.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  const_iterator_to_const();
+
+  //! Copy constructor.
+  const_iterator_to_const(const const_iterator_to_const& y);
+
+  //! Constructs from the corresponding non-const iterator.
+  const_iterator_to_const(const iterator_to_const<Container>& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  const_iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  const_iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  const_iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  const_iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const const_iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const const_iterator_to_const& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is identical to \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator==(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is different from \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator!=(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "iterator_to_const_inlines.hh"
+
+#endif // !defined(PPL_iterator_to_const_hh)
diff --git a/src/iterator_to_const_inlines.hh b/src/iterator_to_const_inlines.hh
new file mode 100644
index 0000000..1eb5e6b
--- /dev/null
+++ b/src/iterator_to_const_inlines.hh
@@ -0,0 +1,202 @@
+/* iterator_to_const and const_iterator_to_const class implementations:
+   inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_iterator_to_const_inlines_hh
+#define PPL_iterator_to_const_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::reference
+iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::pointer
+iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator++(int) {
+  iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator--(int) {
+  iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator==(const iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator!=(const iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const const_iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::reference
+const_iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::pointer
+const_iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator++(int) {
+  const_iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator--(int) {
+  const_iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator==(const const_iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator!=(const const_iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const iterator_to_const<Container>& y)
+  : base(y.base) {
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator==(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y) {
+  return const_iterator_to_const<Container>(x).operator==(y);
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator!=(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_iterator_to_const_inlines_hh)
diff --git a/src/iterator_to_const_types.hh b/src/iterator_to_const_types.hh
new file mode 100644
index 0000000..4b335a2
--- /dev/null
+++ b/src/iterator_to_const_types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_iterator_to_const_types_hh
+#define PPL_iterator_to_const_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+class iterator_to_const;
+
+template <typename Container>
+class const_iterator_to_const;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_iterator_to_const_types_hh)
diff --git a/src/linearize.hh b/src/linearize.hh
new file mode 100644
index 0000000..a43ed21
--- /dev/null
+++ b/src/linearize.hh
@@ -0,0 +1,871 @@
+/* Linearization function implementation.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_linearize_hh
+#define PPL_linearize_hh 1
+
+#include "Concrete_Expression_defs.hh"
+#include "Float_defs.hh"
+#include "Linear_Form_defs.hh"
+#include "Box_defs.hh"
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  sum of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>ADD</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of sum floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+  forms such that:
+
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v \right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+  \f]
+
+  Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+  error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+add_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::ADD);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+    return false;
+
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+
+  result += linearized_second_operand;
+  linearized_second_operand.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  difference of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>SUB</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of difference floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+  operators on linear form such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \adifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,  we construct the interval linear form
+  \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  on \f$\cV\f$ as follows:
+  \f[
+  \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+  error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+sub_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::SUB);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+    return false;
+
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+
+  result -= linearized_second_operand;
+  linearized_second_operand.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  product of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>MUL</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of multiplication floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+  operators on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  i
+  \amlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \amifp i'\right)
+  + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left([a, b]
+  \amlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+  \aslf
+  \left([a, b]
+  \amlf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1].
+  \f].
+
+  Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+  \f]
+
+  Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}
+  \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+  of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+  and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+  <CODE>compute_absolute_error</CODE>.
+
+  Even though we intervalize the first operand in the above example, the
+  actual implementation utilizes an heuristics for choosing which of the two
+  operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+mul_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::MUL);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  /*
+    FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+    decide which of the two linear forms must be intervalized, as described
+    in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+    thesis "Weakly Relational Numerical Abstract Domains".
+    In this Section are also described other multiplication strategies, such
+    as All-Cases, Relative-Size Local, Simplification-Driven Global and
+    Homogeneity Global.
+  */
+
+  // Here we choose which of the two linear forms must be intervalized.
+
+  // true if we intervalize the first form, false if we intervalize the second.
+  bool intervalize_first;
+  FP_Linear_Form linearized_first_operand;
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store,
+                 linearized_first_operand))
+    return false;
+  FP_Interval_Type intervalized_first_operand;
+  if (!linearized_first_operand.intervalize(oracle, intervalized_first_operand))
+    return false;
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  if (!linearized_second_operand.intervalize(oracle,
+                                             intervalized_second_operand))
+    return false;
+
+  // FIXME: we are not sure that what we do here is policy-proof.
+  if (intervalized_first_operand.is_bounded()) {
+    if (intervalized_second_operand.is_bounded()) {
+      analyzer_format first_interval_size
+        = intervalized_first_operand.upper()
+        - intervalized_first_operand.lower();
+      analyzer_format second_interval_size
+        = intervalized_second_operand.upper()
+        - intervalized_second_operand.lower();
+      if (first_interval_size <= second_interval_size)
+        intervalize_first = true;
+      else
+        intervalize_first = false;
+    }
+    else
+      intervalize_first = true;
+  }
+  else {
+    if (intervalized_second_operand.is_bounded())
+      intervalize_first = false;
+    else
+      return false;
+  }
+
+  // Here we do the actual computation.
+  // For optimizing, we store the relative error directly into result.
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  if (intervalize_first) {
+    linearized_second_operand.relative_error(analyzed_format, result);
+    linearized_second_operand *= intervalized_first_operand;
+    result *= intervalized_first_operand;
+    result += linearized_second_operand;
+  }
+  else {
+    linearized_first_operand.relative_error(analyzed_format, result);
+    linearized_first_operand *= intervalized_second_operand;
+    result *= intervalized_second_operand;
+    result += linearized_first_operand;
+  }
+
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  division of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>DIV</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of division floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+  operator on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adivlf
+  i'
+  =
+  \left(i \adivifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+  \f]
+  Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,
+  we construct the interval linear form
+  \f$
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  \f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adivlf
+  [a, b]\right)
+  \aslf
+  \left(\varepsilon_{\mathbf{f}}\left(
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \adivlf
+  [a, b]\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1],
+  \f]
+  given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1} \oslash \iota\left(
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+  of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+  and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+  <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+div_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::DIV);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  if (!linearized_second_operand.intervalize(oracle,
+                                             intervalized_second_operand))
+    return false;
+
+  // Check if we may divide by zero.
+  if ((intervalized_second_operand.lower_is_boundary_infinity() ||
+       intervalized_second_operand.lower() <= 0) &&
+      (intervalized_second_operand.upper_is_boundary_infinity() ||
+       intervalized_second_operand.upper() >= 0))
+    return false;
+
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+    return false;
+
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result /= intervalized_second_operand;
+  rel_error /= intervalized_second_operand;
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a cast
+  floating point expression.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param cast_expr
+  The cast operator concrete expression to linearize.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+cast_linearize(const Cast_Operator<Target>& cast_expr,
+               const FP_Oracle<Target,FP_Interval_Type>& oracle,
+               const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+               Linear_Form<FP_Interval_Type>& result) {
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  Floating_Point_Format analyzed_format =
+    cast_expr.type().floating_point_format();
+  const Concrete_Expression<Target>* cast_arg = cast_expr.argument();
+  if (cast_arg->type().is_floating_point()) {
+    if (!linearize(*cast_arg, oracle, lf_store, result))
+      return false;
+    if (!is_less_precise_than(analyzed_format,
+                              cast_arg->type().floating_point_format()) ||
+        result == FP_Linear_Form(FP_Interval_Type(0)) ||
+        result == FP_Linear_Form(FP_Interval_Type(1)))
+      /*
+        FIXME: find a general way to check if the casted constant
+        is exactly representable in the less precise format.
+      */
+      /*
+        We are casting to a more precise format or casting
+        a definitely safe value: do not add errors.
+      */
+      return true;
+  }
+  else {
+    FP_Interval_Type expr_value;
+    if (!oracle.get_integer_expr_value(*cast_arg, expr_value))
+      return false;
+    result = FP_Linear_Form(expr_value);
+    if (is_less_precise_than(Float<analyzer_format>::Binary::floating_point_format, analyzed_format) ||
+        result == FP_Linear_Form(FP_Interval_Type(0)) ||
+        result == FP_Linear_Form(FP_Interval_Type(1)))
+      /*
+        FIXME: find a general way to check if the casted constant
+        is exactly representable in the less precise format.
+      */
+      /*
+        We are casting to a more precise format or casting
+        a definitely safe value: do not add errors.
+      */
+      return true;
+  }
+
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+//! Linearizes a floating point expression.
+/*! \relates Parma_Polyhedra_Library::Concrete_Expression
+  Makes \p result become a linear form that correctly approximates the
+  value of \p expr in the given composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param expr
+  The concrete expression to linearize.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  Becomes the linearized expression.
+
+  Formally, if \p expr represents the expression \f$e\f$ and
+  \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+  then \p result will become \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+  if the linearization succeeds.
+*/
+template <typename Target, typename FP_Interval_Type>
+bool
+linearize(const Concrete_Expression<Target>& expr,
+          const FP_Oracle<Target,FP_Interval_Type>& oracle,
+          const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+          Linear_Form<FP_Interval_Type>& result) {
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  PPL_ASSERT(expr.type().is_floating_point());
+  // Check that analyzer_format is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<analyzer_format>::is_exact,
+      "linearize<Target, FP_Interval_Type>:"
+      " FP_Interval_Type is not the type of an interval with floating point boundaries.");
+
+  switch(expr.kind()) {
+  case Integer_Constant<Target>::KIND:
+    PPL_UNREACHABLE;
+    break;
+  case Floating_Point_Constant<Target>::KIND:
+  {
+    const Floating_Point_Constant<Target>* fpc_expr =
+      expr.template as<Floating_Point_Constant>();
+    FP_Interval_Type constant_value;
+    if (!oracle.get_fp_constant_value(*fpc_expr, constant_value))
+      return false;
+    result = FP_Linear_Form(constant_value);
+    return true;
+  }
+  case Unary_Operator<Target>::KIND:
+  {
+    const Unary_Operator<Target>* uop_expr =
+      expr.template as<Unary_Operator>();
+    switch (uop_expr->unary_operator()) {
+    case Unary_Operator<Target>::UPLUS:
+      return linearize(*(uop_expr->argument()), oracle, lf_store, result);
+    case Unary_Operator<Target>::UMINUS:
+      if (!linearize(*(uop_expr->argument()), oracle, lf_store, result))
+        return false;
+
+      result.negate();
+      return true;
+    case Unary_Operator<Target>::BNOT:
+      throw std::runtime_error("PPL internal error: unimplemented");
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+    }
+    break;
+  }
+  case Binary_Operator<Target>::KIND:
+  {
+    const Binary_Operator<Target>* bop_expr =
+      expr.template as<Binary_Operator>();
+    switch (bop_expr->binary_operator()) {
+    case Binary_Operator<Target>::ADD:
+      return add_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::SUB:
+      return sub_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::MUL:
+      return mul_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::DIV:
+      return div_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::REM:
+    case Binary_Operator<Target>::BAND:
+    case Binary_Operator<Target>::BOR:
+    case Binary_Operator<Target>::BXOR:
+    case Binary_Operator<Target>::LSHIFT:
+    case Binary_Operator<Target>::RSHIFT:
+      // FIXME: can we do better?
+      return false;
+    default:
+      PPL_UNREACHABLE;
+      return false;
+    }
+    break;
+  }
+  case Approximable_Reference<Target>::KIND:
+  {
+    const Approximable_Reference<Target>* ref_expr =
+      expr.template as<Approximable_Reference>();
+    std::set<dimension_type> associated_dimensions;
+    if (!oracle.get_associated_dimensions(*ref_expr, associated_dimensions)
+        || associated_dimensions.empty())
+      /*
+        We were unable to find any associated space dimension:
+        linearization fails.
+      */
+      return false;
+
+    if (associated_dimensions.size() == 1) {
+      /* If a linear form associated to the only referenced
+         space dimension exists in lf_store, return that form.
+         Otherwise, return the simplest linear form. */
+      dimension_type variable_index = *associated_dimensions.begin();
+      PPL_ASSERT(variable_index != not_a_dimension());
+
+      typename FP_Linear_Form_Abstract_Store::const_iterator
+               variable_value = lf_store.find(variable_index);
+      if (variable_value == lf_store.end()) {
+        result = FP_Linear_Form(Variable(variable_index));
+        return true;
+      }
+
+      result = FP_Linear_Form(variable_value->second);
+      /* FIXME: do we really need to contemplate the possibility
+         that an unbounded linear form was saved into lf_store? */
+      return !result.overflows();
+    }
+
+    /*
+      Here associated_dimensions.size() > 1. Try to return the LUB
+      of all intervals associated to each space dimension.
+    */
+    PPL_ASSERT(associated_dimensions.size() > 1);
+    std::set<dimension_type>::const_iterator i = associated_dimensions.begin();
+    std::set<dimension_type>::const_iterator i_end =
+      associated_dimensions.end();
+    FP_Interval_Type lub(EMPTY);
+    for (; i != i_end; ++i) {
+      FP_Interval_Type curr_int;
+      PPL_ASSERT(*i != not_a_dimension());
+      if (!oracle.get_interval(*i, curr_int))
+        return false;
+
+      lub.join_assign(curr_int);
+    }
+
+    result = FP_Linear_Form(lub);
+    return !result.overflows();
+  }
+  case Cast_Operator<Target>::KIND:
+  {
+    const Cast_Operator<Target>* cast_expr =
+      expr.template as<Cast_Operator>();
+    return cast_linearize(*cast_expr, oracle, lf_store, result);
+  }
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  PPL_UNREACHABLE;
+  return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_linearize_hh)
diff --git a/src/math_utilities_defs.hh b/src/math_utilities_defs.hh
new file mode 100644
index 0000000..8b13404
--- /dev/null
+++ b/src/math_utilities_defs.hh
@@ -0,0 +1,110 @@
+/* Declarations of some math utility functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_math_utilities_defs_hh
+#define PPL_math_utilities_defs_hh 1
+
+#include "Coefficient_types.hh"
+#include "Checked_Number_defs.hh"
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+            Coefficient& numer, Coefficient& denom);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+             Coefficient_traits::const_reference x,
+             Coefficient_traits::const_reference y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+min_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+max_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is an even number.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \f$x = -y\f$.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+  divided by \f$g\f$ are assigned to \p n_x and \p n_y, respectively.
+
+  \note
+  \p x and \p n_x may be the same object and likewise for
+  \p y and \p n_y.  Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+           Coefficient_traits::const_reference y,
+           Coefficient& n_x, Coefficient& n_y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is in canonical form.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+is_canonical(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T
+low_bits_mask(unsigned n);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "math_utilities_inlines.hh"
+
+#endif // !defined(PPL_math_utilities_defs_hh)
diff --git a/src/math_utilities_inlines.hh b/src/math_utilities_inlines.hh
new file mode 100644
index 0000000..671bb6b
--- /dev/null
+++ b/src/math_utilities_inlines.hh
@@ -0,0 +1,120 @@
+/* Implementation of some math utility functions: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_math_utilities_inlines_hh
+#define PPL_math_utilities_inlines_hh 1
+
+#include "Coefficient_defs.hh"
+#include <limits>
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+           Coefficient_traits::const_reference y,
+           Coefficient& n_x, Coefficient& n_y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  gcd_assign(gcd, x, y);
+  exact_div_assign(n_x, x, gcd);
+  exact_div_assign(n_y, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+  PPL_ASSERT(n < unsigned(std::numeric_limits<T>::digits));
+  return ~((~static_cast<T>(0)) << n);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+            Coefficient& numer, Coefficient& denom) {
+  PPL_ASSERT(!is_not_a_number(from)
+         && !is_minus_infinity(from)
+         && !is_plus_infinity(from));
+  PPL_DIRTY_TEMP(mpq_class, q);
+  assign_r(q, from, ROUND_NOT_NEEDED);
+  numer = q.get_num();
+  denom = q.get_den();
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+             Coefficient_traits::const_reference x,
+             Coefficient_traits::const_reference y) {
+  PPL_DIRTY_TEMP(mpq_class, q_x);
+  PPL_DIRTY_TEMP(mpq_class, q_y);
+  // Note: this code assumes that a Coefficient is always convertible
+  // to an mpq_class without loss of precision.
+  assign_r(q_x, x, ROUND_NOT_NEEDED);
+  assign_r(q_y, y, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_y, ROUND_NOT_NEEDED);
+  assign_r(to, q_x, ROUND_UP);
+}
+
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+  if (x > y)
+    x = y;
+}
+
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+  if (x < y)
+    x = y;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x) {
+  T mod;
+  return umod_2exp_assign_r(mod, x, 1, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+    && mod == 0;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y) {
+  T negated_x;
+  return neg_assign_r(negated_x, x, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+    && negated_x == y;
+}
+
+inline bool
+is_canonical(const mpq_class& x) {
+  if (x.get_den() <= 0)
+    return false;
+  PPL_DIRTY_TEMP(mpq_class, temp);
+  temp = x;
+  temp.canonicalize();
+  return temp.get_num() == x.get_num();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_math_utilities_inlines_hh)
diff --git a/src/max_space_dimension.hh b/src/max_space_dimension.hh
new file mode 100644
index 0000000..80c727a
--- /dev/null
+++ b/src/max_space_dimension.hh
@@ -0,0 +1,77 @@
+/* Definition of functions yielding maximal space dimensions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_max_space_dimension_hh
+#define PPL_max_space_dimension_hh 1
+
+#include "Polyhedron_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+#include "Grid_defs.hh"
+#include "Rational_Box.hh"
+#include "BD_Shape_defs.hh"
+#include "Octagonal_Shape_defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+  // Note: we assume that the powerset and the ask-and-tell construction
+  // do not limit the space dimension more than their parameters.
+  static bool computed = false;
+  static dimension_type d = not_a_dimension();
+  if (!computed) {
+    d = Variable::max_space_dimension();
+    d = std::min(d, C_Polyhedron::max_space_dimension());
+    d = std::min(d, NNC_Polyhedron::max_space_dimension());
+    d = std::min(d, Grid::max_space_dimension());
+    // FIXME: what about all other boxes?
+    d = std::min(d, Rational_Box::max_space_dimension());
+    d = std::min(d, BD_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<float>::max_space_dimension());
+    d = std::min(d, BD_Shape<double>::max_space_dimension());
+    d = std::min(d, BD_Shape<long double>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpq_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<float>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<long double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpq_class>::max_space_dimension());
+    computed = true;
+  }
+  return d;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_max_space_dimension_hh)
diff --git a/src/meta_programming.hh b/src/meta_programming.hh
new file mode 100644
index 0000000..9a75fb3
--- /dev/null
+++ b/src/meta_programming.hh
@@ -0,0 +1,341 @@
+/* Metaprogramming utilities.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_meta_programming_hh
+#define PPL_meta_programming_hh 1
+
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>bool</CODE>, called \p name
+  and with value \p value.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_bool_nodef(name, value)           \
+  enum const_bool_value_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>int</CODE>, called \p name
+  and with value \p value.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_int_nodef(name, value) \
+  enum anonymous_enum_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  The value of the constant is accessible
+  by means of the syntax <CODE>name()</CODE>.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_value_nodef(type, name, value)    \
+  static type PPL_U(name)() {                   \
+    return (value);                             \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  A constant reference to the constant
+  is accessible by means of the syntax <CODE>name()</CODE>.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_ref_nodef(type, name, value)                              \
+  static const type& PPL_U(name)() {                                    \
+    static type PPL_U(name) = (value);                                       \
+    return (name);                                                      \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, so the class is declared but not defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Compile_Time_Check;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the specialized case with \p b equal to <CODE>true</CODE>,
+  so the class is declared and (trivially) defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Compile_Time_Check<true> {
+};
+
+#define PPL_COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix
+#define PPL_COMPILE_TIME_CHECK_AUX(e, suffix)                           \
+  enum anonymous_enum_compile_time_check_ ## suffix {                   \
+    /* If e evaluates to false, then the sizeof cannot be compiled. */  \
+    PPL_COMPILE_TIME_CHECK_NAME(suffix)                                 \
+      = sizeof(Parma_Polyhedra_Library::Compile_Time_Check<(e)>)        \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Produces a compilation error if the compile-time constant \p e does
+  not evaluate to <CODE>true</CODE>
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_COMPILE_TIME_CHECK(e, msg) PPL_COMPILE_TIME_CHECK_AUX(e, __LINE__)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to \p b.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Bool {
+  enum const_bool_value {
+    value = b
+  };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct True : public Bool<true> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>false</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct False : public Bool<false> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which \p T1 and \p T2 can be different.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T1, typename T2>
+struct Is_Same : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+  \ingroup PPL_CXX_interface
+  This is the specialization in which \p T1 and \p T2 are equal.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Same<T, T> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p Base is the same type as \p Derived
+  or \p Derived is a class derived from \p Base.
+
+  \ingroup PPL_CXX_interface
+  \note
+  Care must be taken to use this predicate with template classes.
+  Suppose we have
+  \code
+  template <typename T> struct B;
+  template <typename T> struct D : public B<T>;
+  \endcode
+  Of course, we cannot test if, for some type variable <CODE>U</CODE>, we have
+  <CODE>Is_Same_Or_Derived<B<U>, Type>:: const_bool_value:: value == true</CODE>.
+  But we can do as follows:
+  \code
+  struct B_Base {
+  };
+
+  template <typename T> struct B : public B_Base;
+  \endcode
+  This enables us to inquire
+  <CODE>Is_Same_Or_Derived<B_Base, Type>:: const_bool_value:: value</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Base, typename Derived>
+struct Is_Same_Or_Derived {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A class that is constructible from just anything.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct Any {
+    //! The universal constructor.
+    template <typename T>
+    Any(const T&);
+  };
+
+  //! Overloading with \p Base.
+  static char func(const Base&);
+
+  //! Overloading with \p Any.
+  static double func(Any);
+
+  //! A function obtaining a const reference to a \p Derived object.
+  static const Derived& derived_object();
+
+  PPL_COMPILE_TIME_CHECK(sizeof(char) != sizeof(double),
+                         "architecture with sizeof(char) == sizeof(double)"
+                         " (!?)");
+
+  enum const_bool_value {
+    /*!
+      Assuming <CODE>sizeof(char) != sizeof(double)</CODE>, the C++
+      overload resolution mechanism guarantees that <CODE>value</CODE>
+      evaluates to <CODE>true</CODE> if and only if <CODE>Base</CODE>
+      is the same type as <CODE>Derived</CODE> or <CODE>Derived</CODE>
+      is a class derived from <CODE>Base</CODE>.
+    */
+    value = (sizeof(func(derived_object())) == sizeof(char))
+  };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which the <CODE>type</CODE> member
+  is not present.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b, typename T = void>
+struct Enable_If {
+};
+
+template <typename Type, Type, typename T = void>
+struct Enable_If_Is {
+  typedef T type;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the specialization in which the <CODE>type</CODE> member
+  is present.
+
+  \note
+  Let <CODE>T</CODE>, <CODE>T1</CODE> and <CODE>T2</CODE> be any type
+  expressions and suppose we have some template function
+  <CODE>T f(T1, T2)</CODE>.  If we want to declare a specialization
+  that is enabled only if some compile-time checkable condition holds,
+  we simply declare the specialization by
+  \code
+  template ...
+  typename Enable_If<condition, T>::type
+  foo(T1 x, T2 y);
+  \endcode
+  For all the instantiations of the template parameters that cause
+  <CODE>condition</CODE> to evaluate to <CODE>false</CODE>,
+  the <CODE>Enable_If<condition, T>::type</CODE> member will not be defined.
+  Hence, for that instantiations, the specialization will not be eligible.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Enable_If<true, T> {
+  typedef T type;
+};
+
+template <typename T>
+struct Is_Native : public False {
+};
+
+template <> struct Is_Native<char> : public True { };
+template <> struct Is_Native<signed char> : public True { };
+template <> struct Is_Native<signed short> : public True { };
+template <> struct Is_Native<signed int> : public True { };
+template <> struct Is_Native<signed long> : public True { };
+template <> struct Is_Native<signed long long> : public True { };
+template <> struct Is_Native<unsigned char> : public True { };
+template <> struct Is_Native<unsigned short> : public True { };
+template <> struct Is_Native<unsigned int> : public True { };
+template <> struct Is_Native<unsigned long> : public True { };
+template <> struct Is_Native<unsigned long long> : public True { };
+
+#if PPL_SUPPORTED_FLOAT
+template <> struct Is_Native<float> : public True { };
+#endif
+#if PPL_SUPPORTED_DOUBLE
+template <> struct Is_Native<double> : public True { };
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <> struct Is_Native<long double> : public True { };
+#endif
+
+template <> struct Is_Native<mpz_class> : public True { };
+
+template <> struct Is_Native<mpq_class> : public True { };
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_meta_programming_hh)
diff --git a/src/mp_std_bits.cc b/src/mp_std_bits.cc
new file mode 100644
index 0000000..0ca7bdb
--- /dev/null
+++ b/src/mp_std_bits.cc
@@ -0,0 +1,78 @@
+/* Definitions of specializations of std::numeric_limits objects for
+   multi-precision types.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "mp_std_bits_defs.hh"
+
+#if __GNU_MP_VERSION < 5 \
+  || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+const bool std::numeric_limits<mpz_class>::is_specialized;
+const int std::numeric_limits<mpz_class>::digits;
+const int std::numeric_limits<mpz_class>::digits10;
+const bool std::numeric_limits<mpz_class>::is_signed;
+const bool std::numeric_limits<mpz_class>::is_integer;
+const bool std::numeric_limits<mpz_class>::is_exact;
+const int std::numeric_limits<mpz_class>::radix;
+const int std::numeric_limits<mpz_class>::min_exponent;
+const int std::numeric_limits<mpz_class>::min_exponent10;
+const int std::numeric_limits<mpz_class>::max_exponent;
+const int std::numeric_limits<mpz_class>::max_exponent10;
+const bool std::numeric_limits<mpz_class>::has_infinity;
+const bool std::numeric_limits<mpz_class>::has_quiet_NaN;
+const bool std::numeric_limits<mpz_class>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<mpz_class>::has_denorm;
+const bool std::numeric_limits<mpz_class>::has_denorm_loss;
+const bool std::numeric_limits<mpz_class>::is_iec559;
+const bool std::numeric_limits<mpz_class>::is_bounded;
+const bool std::numeric_limits<mpz_class>::is_modulo;
+const bool std::numeric_limits<mpz_class>::traps;
+const bool std::numeric_limits<mpz_class>::tinyness_before;
+const std::float_round_style std::numeric_limits<mpz_class>::round_style;
+
+const bool std::numeric_limits<mpq_class>::is_specialized;
+const int std::numeric_limits<mpq_class>::digits;
+const int std::numeric_limits<mpq_class>::digits10;
+const bool std::numeric_limits<mpq_class>::is_signed;
+const bool std::numeric_limits<mpq_class>::is_integer;
+const bool std::numeric_limits<mpq_class>::is_exact;
+const int std::numeric_limits<mpq_class>::radix;
+const int std::numeric_limits<mpq_class>::min_exponent;
+const int std::numeric_limits<mpq_class>::min_exponent10;
+const int std::numeric_limits<mpq_class>::max_exponent;
+const int std::numeric_limits<mpq_class>::max_exponent10;
+const bool std::numeric_limits<mpq_class>::has_infinity;
+const bool std::numeric_limits<mpq_class>::has_quiet_NaN;
+const bool std::numeric_limits<mpq_class>::has_signaling_NaN;
+const std::float_denorm_style std::numeric_limits<mpq_class>::has_denorm;
+const bool std::numeric_limits<mpq_class>::has_denorm_loss;
+const bool std::numeric_limits<mpq_class>::is_iec559;
+const bool std::numeric_limits<mpq_class>::is_bounded;
+const bool std::numeric_limits<mpq_class>::is_modulo;
+const bool std::numeric_limits<mpq_class>::traps;
+const bool std::numeric_limits<mpq_class>::tinyness_before;
+const std::float_round_style std::numeric_limits<mpq_class>::round_style;
+
+#endif // __GNU_MP_VERSION < 5
+       // || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
diff --git a/src/mp_std_bits_defs.hh b/src/mp_std_bits_defs.hh
new file mode 100644
index 0000000..19447b8
--- /dev/null
+++ b/src/mp_std_bits_defs.hh
@@ -0,0 +1,175 @@
+/* Declarations of specializations of std:: objects for
+   multi-precision types.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_mp_std_bits_defs_hh
+#define PPL_mp_std_bits_defs_hh 1
+
+#include <gmpxx.h>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpz_class& x, mpz_class& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpq_class& x, mpq_class& y);
+
+#if __GNU_MP_VERSION < 5 \
+  || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpz_class> {
+private:
+  typedef mpz_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = true;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(1);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpq_class> {
+private:
+  typedef mpq_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = false;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+#endif // __GNU_MP_VERSION < 5
+       // || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+#include "mp_std_bits_inlines.hh"
+
+#endif // !defined(PPL_mp_std_bits_defs_hh)
diff --git a/src/mp_std_bits_inlines.hh b/src/mp_std_bits_inlines.hh
new file mode 100644
index 0000000..90f1b24
--- /dev/null
+++ b/src/mp_std_bits_inlines.hh
@@ -0,0 +1,38 @@
+/* Definitions of specializations of std:: functions and methods for
+   multi-precision types.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_mp_std_bits_inlines_hh
+#define PPL_mp_std_bits_inlines_hh 1
+
+inline void
+swap(mpz_class& x, mpz_class& y) {
+  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+swap(mpq_class& x, mpq_class& y) {
+  mpq_swap(x.get_mpq_t(), y.get_mpq_t());
+}
+
+#endif // !defined(PPL_mp_std_bits_inlines_hh)
diff --git a/src/namespaces.hh b/src/namespaces.hh
new file mode 100644
index 0000000..7f0c45b
--- /dev/null
+++ b/src/namespaces.hh
@@ -0,0 +1,184 @@
+/* Documentation for used namespaces.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_namespaces_hh
+#define PPL_namespaces_hh 1
+
+//! The entire library is confined to this namespace.
+namespace Parma_Polyhedra_Library {
+
+//! All input/output operators are confined to this namespace.
+/*! \ingroup PPL_CXX_interface
+  This is done so that the library's input/output operators
+  do not interfere with those the user might want to define.
+  In fact, it is highly unlikely that any predefined I/O
+  operator will suit the needs of a client application.
+  On the other hand, those applications for which the PPL
+  I/O operator are enough can easily obtain access to them.
+  For example, a directive like
+  \code
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+  \endcode
+  would suffice for most uses.
+  In more complex situations, such as
+  \code
+    const Constraint_System& cs = ...;
+    copy(cs.begin(), cs.end(),
+         ostream_iterator<Constraint>(cout, "\n"));
+  \endcode
+  the Parma_Polyhedra_Library namespace must be suitably extended.
+  This can be done as follows:
+  \code
+    namespace Parma_Polyhedra_Library {
+      // Import all the output operators into the main PPL namespace.
+      using IO_Operators::operator<<;
+    }
+  \endcode
+*/
+namespace IO_Operators {
+} // namespace IO_Operators
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Types and functions implementing checked numbers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Checked {
+} // namespace Checked
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! %Implementation related data and functions.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Implementation {
+} // namespace Implementation
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to language interfaces.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the C language interface.
+/*! \ingroup PPL_C_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace C {
+
+} // namespace C
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Java language interface.
+/*! \ingroup PPL_Java_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Java {
+
+} // namespace Java
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the OCaml language interface.
+/*! \ingroup PPL_OCaml_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace OCaml {
+
+} // namespace OCaml
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Prolog language interfaces.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Prolog {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Ciao Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Ciao {
+
+} // namespace Ciao
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the GNU Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace GNU {
+
+} // namespace GNU
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SICStus language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SICStus {
+
+} // namespace SICStus
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SWI-Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SWI {
+
+} // namespace SWI
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the XSB language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace XSB {
+
+} // namespace XSB
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the YAP language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace YAP {
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The standard C++ namespace.
+/*! \ingroup PPL_CXX_interface
+  The Parma Polyhedra Library conforms to the C++ standard and,
+  in particular, as far as reserved names are concerned (17.4.3.1,
+  [lib.reserved.names]).  The PPL, however, defines several
+  template specializations for the standard library class template
+  <CODE>numeric_limits</CODE> (18.2.1, [lib.limits]).
+
+  \note
+  The PPL provides the specializations of the class template
+  <CODE>numeric_limits</CODE> not only for PPL-specific numeric types,
+  but also for the GMP types <CODE>mpz_class</CODE> and
+  <CODE>mpq_class</CODE>. These specializations will be removed
+  as soon as they will be provided by the C++ interface of GMP.
+*/
+namespace std {
+} // namespace std
+
+
+#endif // !defined(PPL_namespaces_hh)
diff --git a/src/ppl-config.cc.in b/src/ppl-config.cc.in
new file mode 100644
index 0000000..78c23bf
--- /dev/null
+++ b/src/ppl-config.cc.in
@@ -0,0 +1,734 @@
+/* A program to enquire about the configuration of the PPL  -*- C++ -*-
+   and of the applications using it.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl.hh"
+#include "BUGS.hh"
+#include "COPYING.hh"
+#include "CREDITS.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
+#error "PPL version 0.8 or following is required"
+#endif
+
+#include <cstdarg>
+#include <cstring>
+#include <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+
+#ifdef PPL_HAVE_GETOPT_H
+#include <getopt.h>
+
+// Try to accommodate non-GNU implementations of `getopt()'.
+#if !defined(no_argument) && defined(NO_ARG)
+#define no_argument NO_ARG
+#endif
+
+#if !defined(required_argument) && defined(REQUIRED_ARG)
+#define required_argument REQUIRED_ARG
+#endif
+
+#if !defined(optional_argument) && defined(OPTIONAL_ARG)
+#define optional_argument OPTIONAL_ARG
+#endif
+
+#endif // defined(PPL_HAVE_GETOPT_H)
+
+#ifdef PPL_HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+#include <unistd.h>
+#endif
+
+
+namespace {
+
+enum Format {
+  NO_FORMAT,
+  PLAIN,
+  MAKEFILE,
+  SH,
+  CSH
+};
+
+enum Interface {
+  NO_INTERFACE,
+  CXX,
+  C,
+  CIAO_PROLOG,
+  GNU_PROLOG,
+  SICSTUS_PROLOG,
+  SWI_PROLOG,
+  XSB_PROLOG,
+  YAP_PROLOG,
+  OCAML,
+  JAVA
+};
+
+Format required_format = NO_FORMAT;
+
+Interface required_interface = NO_INTERFACE;
+
+#define PPL_LICENSE "GNU GENERAL PUBLIC LICENSE, Version 3"
+
+std::string prefix;
+std::string exec_prefix;
+
+bool required_application = false;
+bool required_library = false;
+bool required_prefix = false;
+bool required_exec_prefix = false;
+bool required_configure_options = false;
+bool required_version = false;
+bool required_version_major = false;
+bool required_version_minor = false;
+bool required_version_revision = false;
+bool required_version_beta = false;
+bool required_banner = false;
+bool required_coefficients = false;
+bool required_includedir = false;
+bool required_bindir = false;
+bool required_libdir = false;
+bool required_cppflags = false;
+bool required_cflags = false;
+bool required_cxxflags = false;
+bool required_ldflags = false;
+bool required_license = false;
+bool required_copying = false;
+bool required_bugs = false;
+bool required_credits = false;
+
+unsigned num_required_items = 0;
+
+
+#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur"
+
+const char* program_name = 0;
+
+void
+fatal(const char* format, ...) __attribute__((__noreturn__));
+
+void
+fatal(const char* format, ...) {
+  va_list ap;
+  va_start(ap, format);
+  fprintf(stderr, "%s: ", program_name);
+  vfprintf(stderr, format, ap);
+  fprintf(stderr, "\n");
+  va_end(ap);
+  exit(1);
+}
+
+void
+internal_error() __attribute__((__noreturn__));
+
+void
+internal_error() {
+  fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+}
+
+inline char
+to_lower(char c) {
+  return
+    static_cast<char>(tolower(static_cast<int>(static_cast<unsigned char>(c))));
+}
+
+bool
+strcaseeq(const char* s1, const char* s2) {
+  while (*s1 != '\0') {
+    if (*s2 == '\0' || to_lower(*s1) != to_lower(*s2))
+      return false;
+    ++s1;
+    ++s2;
+  }
+  return *s2 == '\0';
+}
+
+void
+process_options(int argc, char* argv[]) {
+
+  bool exec_prefix_set = false;
+
+#ifdef PPL_HAVE_GETOPT_H
+struct option long_options[] = {
+  {"help",              no_argument,       0, 'h'},
+  {"format",            required_argument, 0, 'F'},
+  {"interface",         required_argument, 0, 'I'},
+  {"application",       no_argument,       0, 'A'},
+  {"library",           no_argument,       0, 'L'},
+  {"prefix",            optional_argument, 0, 'p'},
+  {"exec-prefix",       optional_argument, 0, 'e'},
+  {"configure-options", no_argument,       0, 'O'},
+  {"version",           no_argument,       0, 'V'},
+  {"version-major",     no_argument,       0, 'M'},
+  {"version-minor",     no_argument,       0, 'N'},
+  {"version-revision",  no_argument,       0, 'R'},
+  {"version-beta",      no_argument,       0, 'B'},
+  {"banner",            no_argument,       0, 'E'},
+  {"coefficients",      no_argument,       0, 'n'},
+  {"includedir",        no_argument,       0, 'i'},
+  {"bindir",            no_argument,       0, 'b'},
+  {"libdir",            no_argument,       0, 'l'},
+  {"cppflags",          no_argument,       0, 'P'},
+  {"cflags",            no_argument,       0, 'C'},
+  {"cxxflags",          no_argument,       0, 'X'},
+  {"ldflags",           no_argument,       0, 'D'},
+  {"license",           no_argument,       0, 'g'},
+  {"copying",           no_argument,       0, 'c'},
+  {"bugs",              no_argument,       0, 'u'},
+  {"credits",           no_argument,       0, 'r'},
+  {0, 0, 0, 0}
+};
+#endif
+
+  static const char* usage_string
+  = "Usage: %s [OPTION]...\n"
+"Displays information, in various formats, about an installation\n"
+"of the Parma Polyhedra Library.\n\n"
+"Options:\n"
+"  -h, --help               prints this help text to stdout\n"
+"  -FFMT, --format=FMT      sets the output format to FMT\n"
+"                           (one of `plain', `makefile', `sh' or `csh')\n"
+"  -IINT, --interface=INT   selects a library interface (one of `C++', `C',\n"
+"                           `Ciao-Prolog', `GNU-Prolog', `SICStus-Prolog',\n"
+"                           `SWI-Prolog', `XSB-Prolog', `YAP-Prolog',\n"
+"                           `OCaml' or `Java')\n"
+"  -A, --application        selects output for building an application\n"
+"  -L, --library            selects output for building a library\n"
+"  -p[PFX], --prefix[=PFX]  prints or sets library prefix information\n"
+"  -e[PFX], --exec-prefix[=PFX]\n"
+"                           prints or sets library exec-prefix information\n"
+"  -O, --configure-options  prints configuration options\n"
+"  -V, --version            prints version information\n"
+"  -M, --version-major      prints version major number\n"
+"  -N, --version-minor      prints version minor number\n"
+"  -R, --version-revision   prints version revision number\n"
+"  -B, --version-beta       prints version beta number\n"
+"  -E, --banner             prints library banner\n"
+"  -n, --coefficients       prints type of library coefficients\n"
+"  -i, --includedir         prints include files directory\n"
+"  -b, --bindir             prints binary executables directory\n"
+"  -l, --libdir             prints library files directory\n"
+"  -P, --cppflags           prints preprocessor flags\n"
+"  -C, --cflags             prints C compiler flags\n"
+"  -X, --cxxflags           prints C++ compiler flags\n"
+"  -D, --ldflags            prints linker flags\n"
+"  -g, --license            prints synthetic licensing information\n"
+"  -c, --copying            prints detailed licensing information\n"
+"  -u, --bugs               prints bug reporting information\n"
+"  -r, --credits            prints credits\n"
+#ifndef PPL_HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+"\n"
+"Report bugs to <ppl-devel at cs.unipr.it>.\n";
+
+  while (true) {
+#ifdef PPL_HAVE_GETOPT_H
+    int option_index = 0;
+    int c = getopt_long(argc, argv, OPTION_LETTERS, long_options,
+                        &option_index);
+#else
+    int c = getopt(argc, argv, OPTION_LETTERS);
+#endif
+
+    if (c == EOF)
+      break;
+
+    switch (c) {
+    case 0:
+      break;
+
+    case '?':
+    case 'h':
+      fprintf(stdout, usage_string, argv[0]);
+      exit(0);
+      break;
+
+      // --format
+    case 'F':
+      if (strcaseeq(optarg, "plain"))
+        required_format = PLAIN;
+      else if (strcaseeq(optarg, "makefile"))
+        required_format = MAKEFILE;
+      else if (strcaseeq(optarg, "sh"))
+        required_format = SH;
+      else if (strcaseeq(optarg, "csh"))
+        required_format = CSH;
+      else
+        fatal("invalid argument `%s' to --format: "
+              "must be `plain', `makefile', `sh' or `csh'",
+              optarg);
+      break;
+
+      // --interface
+    case 'I':
+      if (strcaseeq(optarg, "C++"))
+        required_interface = CXX;
+      else if (strcaseeq(optarg, "C"))
+        required_interface = C;
+      else if (strcaseeq(optarg, "Ciao-Prolog"))
+        required_interface = CIAO_PROLOG;
+      else if (strcaseeq(optarg, "GNU-Prolog"))
+        required_interface = GNU_PROLOG;
+      else if (strcaseeq(optarg, "SICStus-Prolog"))
+        required_interface = SICSTUS_PROLOG;
+      else if (strcaseeq(optarg, "SWI-Prolog"))
+        required_interface = SWI_PROLOG;
+      else if (strcaseeq(optarg, "XSB-Prolog"))
+        required_interface = XSB_PROLOG;
+      else if (strcaseeq(optarg, "YAP-Prolog"))
+        required_interface = YAP_PROLOG;
+      else if (strcaseeq(optarg, "OCaml"))
+        required_interface = OCAML;
+      else if (strcaseeq(optarg, "Java"))
+        required_interface = JAVA;
+      else
+        fatal("invalid argument `%s' to --interface: "
+              "must be `C++', `C', `Ciao-Prolog', `GNU-Prolog', "
+              "`SICStus-Prolog', `SWI-Prolog', `XSB-Prolog', `YAP-Prolog', "
+              "`OCaml' or `Java'",
+              optarg);
+      break;
+
+      // --application
+    case 'A':
+      required_application = true;
+      break;
+
+      // --library
+    case 'L':
+      required_library = true;
+      break;
+
+      // --prefix
+    case 'p':
+      if (optarg != 0) {
+        prefix = optarg;
+        if (!exec_prefix_set) {
+          exec_prefix = optarg;
+          exec_prefix_set = true;
+        }
+      }
+      else {
+        required_prefix = true;
+        ++num_required_items;
+      }
+      break;
+
+      // --exec_prefix
+    case 'e':
+      if (optarg != 0) {
+        exec_prefix = optarg;
+        exec_prefix_set = true;
+      }
+      else {
+        required_exec_prefix = true;
+        ++num_required_items;
+      }
+      break;
+
+      // --configure-options
+    case 'O':
+      required_configure_options = true;
+      ++num_required_items;
+      break;
+
+      // --version
+    case 'V':
+      required_version = true;
+      ++num_required_items;
+      break;
+
+      // --version-major
+    case 'M':
+      required_version_major = true;
+      ++num_required_items;
+      break;
+
+      // --version-minor
+    case 'N':
+      required_version_minor = true;
+      ++num_required_items;
+      break;
+
+      // --version-revision
+    case 'R':
+      required_version_revision = true;
+      ++num_required_items;
+      break;
+
+      // --version-beta
+    case 'B':
+      required_version_beta = true;
+      ++num_required_items;
+      break;
+
+      // --banner
+    case 'E':
+      required_banner = true;
+      ++num_required_items;
+      break;
+
+      // --coefficients
+    case 'n':
+      required_coefficients = true;
+      ++num_required_items;
+      break;
+
+      // --includedir
+    case 'i':
+      required_includedir = true;
+      ++num_required_items;
+      break;
+
+      // --bindir
+    case 'b':
+      required_bindir = true;
+      ++num_required_items;
+      break;
+
+      // --libdir
+    case 'l':
+      required_libdir = true;
+      ++num_required_items;
+      break;
+
+      // --cppflags
+    case 'P':
+      required_cppflags = true;
+      ++num_required_items;
+      break;
+
+      // --cflags
+    case 'C':
+      required_cflags = true;
+      ++num_required_items;
+      break;
+
+      // --cxxflags
+    case 'X':
+      required_cxxflags = true;
+      ++num_required_items;
+      break;
+
+      // --ldflags
+    case 'D':
+      required_ldflags = true;
+      ++num_required_items;
+      break;
+
+      // --license
+    case 'g':
+      required_license = true;
+      ++num_required_items;
+      break;
+
+      // --copying
+    case 'c':
+      required_copying = true;
+      ++num_required_items;
+      break;
+
+      // --bugs
+    case 'u':
+      required_bugs = true;
+      ++num_required_items;
+      break;
+
+      // --credits
+    case 'r':
+      required_credits = true;
+      ++num_required_items;
+      break;
+
+    default:
+      abort();
+    }
+  }
+
+  if (argc != optind)
+    // We have a spurious argument.
+    fatal("no arguments besides options are accepted");
+
+  if (required_application && required_library)
+    fatal("the --application and --library are mutually exclusive");
+
+  if (!required_application && !required_library)
+    required_application = true;
+
+  if (required_format == NO_FORMAT)
+    required_format = PLAIN;
+
+  if (required_interface == NO_INTERFACE)
+    required_interface = CXX;
+}
+
+void
+portray_name(const char* name) {
+  const char* variable_prefix = "PPL_";
+  switch (required_format) {
+  case PLAIN:
+    if (num_required_items > 1)
+      std::cout << variable_prefix << name << ": ";
+    break;
+  case MAKEFILE:
+    std::cout << variable_prefix << name << '=';
+    break;
+  case SH:
+    std::cout << "export " << variable_prefix << name << '=';
+    break;
+  case CSH:
+    std::cout << "setenv " << variable_prefix << name << ' ';
+    break;
+  default:
+    internal_error();
+  }
+}
+
+void
+portray(const char* const array[]) {
+  for (unsigned i = 0; array[i] != 0; ++i)
+    std::cout << array[i] << std::endl;
+}
+
+void
+portray(const char* string) {
+  std::cout << string;
+}
+
+void
+portray(long n) {
+  std::cout << n;
+}
+
+void
+portray(const char* name, const char* const array[]) {
+  portray_name(name);
+  portray(array);
+  std::cout << std::endl;
+}
+
+void
+portray(const char* name, const char* string) {
+  portray_name(name);
+  portray(string);
+  std::cout << std::endl;
+}
+
+void
+portray(const char* name, std::string s) {
+  portray(name, s.c_str());
+}
+
+void
+portray(const char* name, long n) {
+  portray_name(name);
+  portray(n);
+  std::cout << std::endl;
+}
+
+void
+replace(std::string& s,
+        const std::string& pattern, const std::string& replacement) {
+  std::string::size_type pos = 0;
+  while (true) {
+    pos = s.find(pattern, pos);
+    if (pos == std::string::npos)
+      break;
+    s.replace(pos, pattern.size(), replacement);
+    pos += replacement.length();
+  }
+}
+
+void
+replace_prefixes(std::string& s) {
+  static const std::string prefix_reference = "${prefix}";
+  static const std::string exec_prefix_reference = "${exec_prefix}";
+  replace(s, prefix_reference, prefix);
+  replace(s, exec_prefix_reference, exec_prefix);
+}
+
+void
+portray_with_prefixes(const char* name, std::string s) {
+  replace_prefixes(s);
+  portray(name, s);
+}
+
+} // namespace
+
+int
+main(int argc, char* argv[]) try {
+  program_name = argv[0];
+
+  if (strcmp(PPL_VERSION, PPL::version()) != 0)
+    fatal("was compiled with PPL version %s, but linked with version %s",
+          PPL_VERSION, PPL::version());
+
+  // Initialize prefixes.
+  prefix = "@prefix@";
+  exec_prefix = "@exec_prefix@";
+  replace_prefixes(prefix);
+  replace_prefixes(exec_prefix);
+
+  // Process command line options.
+  process_options(argc, argv);
+
+  if (required_prefix)
+    portray("PREFIX", prefix);
+
+  if (required_exec_prefix)
+    portray("EXEC_PREFIX", exec_prefix);
+
+  if (required_configure_options)
+    portray("CONFIGURE_OPTIONS", PPL_CONFIGURE_OPTIONS);
+
+  if (required_version)
+    portray("VERSION", PPL_VERSION);
+
+  if (required_version_major)
+    portray("VERSION_MAJOR", static_cast<long>(PPL_VERSION_MAJOR));
+
+  if (required_version_minor)
+    portray("VERSION_MINOR", static_cast<long>(PPL_VERSION_MINOR));
+
+  if (required_version_revision)
+    portray("VERSION_REVISION", static_cast<long>(PPL_VERSION_REVISION));
+
+  if (required_version_beta)
+    portray("VERSION_BETA", static_cast<long>(PPL_VERSION_BETA));
+
+  if (required_banner)
+    portray("BANNER", PPL::banner());
+
+  if (required_coefficients)
+    portray("COEFFICIENTS", "@coefficient_mnemonic@");
+
+  if (required_includedir)
+    portray_with_prefixes("INCLUDEDIR", "@includedir@");
+
+  if (required_bindir)
+    portray_with_prefixes("BINDIR", "@bindir@");
+
+  if (required_libdir)
+    portray_with_prefixes("LIBDIR", "@libdir@");
+
+  if (required_cppflags) {
+    if (required_application) {
+      std::string cppflags = "@CPPFLAGS@";
+      std::string s = "@includedir@";
+      replace_prefixes(s);
+      // `/usr/include' is the standard include directory:
+      // thus it needs not be specified.
+      if (s == "/usr/include")
+        s = cppflags;
+      else {
+        s = "-I" + s;
+        // Avoid duplicating the -I options.
+        if (cppflags.find(s) != std::string::npos)
+          s = "";
+        if (s.length() > 0 && strlen("@CPPFLAGS@") > 0)
+          s += ' ';
+        s += "@CPPFLAGS@";
+      }
+      if (s.length() > 0 && strlen("@extra_includes@") > 0)
+          s += ' ';
+      s += "@extra_includes@";
+      portray("CPPFLAGS", s);
+    }
+    else
+      portray("CPPFLAGS", "@CPPFLAGS@");
+  }
+
+  if (required_cflags)
+    portray("CFLAGS", "@CFLAGS@");
+
+  if (required_cxxflags)
+    portray("CXXFLAGS", "@CXXFLAGS@");
+
+  if (required_ldflags) {
+    std::string s = "@libdir@";
+    replace_prefixes(s);
+    const std::string ldflags = "@LDFLAGS@";
+    // `/usr/lib' is the standard library directory:
+    // thus it needs not be specified.
+    if (s == "/usr/lib")
+      s = ldflags;
+    else {
+      s = "-L" + s;
+      // Avoid duplicating the -L options.
+      if (ldflags.find(s) != std::string::npos)
+        s = "";
+      if (s.length() > 0 && ldflags.length() > 0)
+        s += ' ';
+      s += ldflags;
+    }
+    if (required_library) {
+      if (s.length() > 0 && strlen("@extra_libraries@") > 0)
+        s += ' ';
+      s += "@extra_libraries@";
+    }
+    else {
+      assert(required_application);
+      if (s.length() > 0)
+        s += ' ';
+      s += "-lppl";
+      if (required_interface == C)
+        s += " -lppl_c";
+      s += " -lgmpxx -lgmp";
+    }
+    portray("LDFLAGS", s);
+  }
+
+  if (required_license)
+    portray("LICENSE", PPL_LICENSE);
+
+  if (required_copying)
+    portray("COPYING", COPYING_array);
+
+  if (required_bugs)
+    portray("BUGS", BUGS_array);
+
+  if (required_credits)
+    portray("CREDITS", CREDITS_array);
+
+  return 0;
+}
+catch (const std::bad_alloc&) {
+  fatal("out of memory");
+  exit(1);
+}
+catch (const std::overflow_error& e) {
+  fatal("arithmetic overflow (%s)", e.what());
+  exit(1);
+}
+catch (...) {
+  internal_error();
+}
diff --git a/src/ppl.hh.dist b/src/ppl.hh.dist
new file mode 100644
index 0000000..17f03b5
--- /dev/null
+++ b/src/ppl.hh.dist
@@ -0,0 +1,107456 @@
+/* This is the header file of the Parma Polyhedra Library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG NDEBUG
+# undef NDEBUG
+#endif
+
+#ifdef __STDC_LIMIT_MACROS
+# define PPL_SAVE_STDC_LIMIT_MACROS __STDC_LIMIT_MACROS
+#endif
+
+/* Automatically generated from PPL source file ../ppl-config.h line 1. */
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+/* BEGIN ppl-config.h */
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+/* Unique (nonzero) code for the IEEE 754 Single Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_SINGLE 1
+
+/* Unique (nonzero) code for the IEEE 754 Double Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_DOUBLE 2
+
+/* Unique (nonzero) code for the IEEE 754 Quad Precision
+   floating point format.  */
+#define PPL_FLOAT_IEEE754_QUAD 3
+
+/* Unique (nonzero) code for the Intel Double-Extended
+   floating point format.  */
+#define PPL_FLOAT_INTEL_DOUBLE_EXTENDED 4
+
+
+/* Define if building universal (internal helper macro) */
+/* #undef AC_APPLE_UNIVERSAL_BUILD */
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#define PPL_HAVE_DECL_FFS 1
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#define PPL_HAVE_DECL_FMA 1
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_FMAF 1
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_FMAL 1
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_GETENV 1
+
+/* Define to 1 if you have the declaration of `getrusage', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_GETRUSAGE 1
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_RINTF 1
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_RINTL 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_RLIMIT_AS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_RLIMIT_DATA 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_RLIMIT_RSS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_RLIMIT_VMEM 0
+
+/* Define to 1 if you have the declaration of `setitimer', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_SETITIMER 1
+
+/* Define to 1 if you have the declaration of `setrlimit', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_SETRLIMIT 1
+
+/* Define to 1 if you have the declaration of `sigaction', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_SIGACTION 1
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_STRTOD 1
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+   */
+#define PPL_HAVE_DECL_STRTOF 1
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_STRTOLD 1
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_STRTOLL 1
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+   don't. */
+#define PPL_HAVE_DECL_STRTOULL 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define PPL_HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#define PPL_HAVE_FENV_H 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define PPL_HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the <glpk/glpk.h> header file. */
+/* #undef PPL_HAVE_GLPK_GLPK_H */
+
+/* Define to 1 if you have the <glpk.h> header file. */
+#define PPL_HAVE_GLPK_H 1
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+/* #undef PPL_HAVE_IEEEFP_H */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define PPL_HAVE_INTTYPES_H 1
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#define PPL_HAVE_INT_FAST16_T 1
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#define PPL_HAVE_INT_FAST32_T 1
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#define PPL_HAVE_INT_FAST64_T 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define PPL_HAVE_MEMORY_H 1
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#define PPL_HAVE_SIGINFO_T 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define PPL_HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define PPL_HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define PPL_HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define PPL_HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define PPL_HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define PPL_HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define PPL_HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define PPL_HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define PPL_HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `timeval'. */
+#define PPL_HAVE_TIMEVAL 1
+
+/* Define to 1 if typeof works with your compiler. */
+#define PPL_HAVE_TYPEOF 1
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#define PPL_HAVE_UINTPTR_T 1
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#define PPL_HAVE_UINT_FAST16_T 1
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#define PPL_HAVE_UINT_FAST32_T 1
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#define PPL_HAVE_UINT_FAST64_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define PPL_HAVE_UNISTD_H 1
+
+/* Define to 1 if `_mp_alloc' is a member of `__mpz_struct'. */
+#define PPL_HAVE___MPZ_STRUCT__MP_ALLOC 1
+
+/* Define to 1 if `_mp_d' is a member of `__mpz_struct'. */
+#define PPL_HAVE___MPZ_STRUCT__MP_D 1
+
+/* Define to 1 if `_mp_size' is a member of `__mpz_struct'. */
+#define PPL_HAVE___MPZ_STRUCT__MP_SIZE 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LT_OBJDIR ".libs/"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PPL_PACKAGE_BUGREPORT "ppl-devel at cs.unipr.it"
+
+/* Define to the full name of this package. */
+#define PPL_PACKAGE_NAME "the Parma Polyhedra Library"
+
+/* Define to the full name and version of this package. */
+#define PPL_PACKAGE_STRING "the Parma Polyhedra Library 1.1"
+
+/* Define to the one symbol short name of this package. */
+#define PPL_PACKAGE_TARNAME "ppl"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PPL_PACKAGE_VERSION "1.1"
+
+/* ABI-breaking extra assertions are enabled when this is defined. */
+/* #undef PPL_ABI_BREAKING_EXTRA_DEBUG */
+
+/* Not zero if the FPU can be controlled. */
+#define PPL_CAN_CONTROL_FPU 1
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+   */
+/* #undef PPL_CHECKED_INTEGERS */
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#define PPL_COEFFICIENT_BITS 0
+
+/* The integral type used to represent coefficients. */
+#define PPL_COEFFICIENT_TYPE mpz_class
+
+/* This contains the options with which `configure' was invoked. */
+#define PPL_CONFIGURE_OPTIONS " '--with-java=/usr/lib/jvm/java-7-openjdk-amd64'"
+
+/* The unique code of the binary format of C++ doubles, if supported;
+   undefined otherwise. */
+#define PPL_CXX_DOUBLE_BINARY_FORMAT PPL_FLOAT_IEEE754_DOUBLE
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#define PPL_CXX_FLOAT_BINARY_FORMAT PPL_FLOAT_IEEE754_SINGLE
+
+/* The unique code of the binary format of C++ long doubles, if supported;
+   undefined otherwise. */
+#define PPL_CXX_LONG_DOUBLE_BINARY_FORMAT PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+
+/* Not zero if the the plain char type is signed. */
+#define PPL_CXX_PLAIN_CHAR_IS_SIGNED 1
+
+/* Not zero if the C++ compiler provides long double numbers that have bigger
+   range or precision than double. */
+#define PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE 1
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#define PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK 1
+
+/* Not zero if the the IEEE inexact flag is supported in C++. */
+#define PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG 1
+
+/* Not zero if it is possible to limit memory using setrlimit(). */
+#define PPL_CXX_SUPPORTS_LIMITING_MEMORY 1
+
+/* Not zero if the C++ compiler supports zero_length arrays. */
+#define PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS 1
+
+/* Defined if floating point arithmetic may use the 387 unit. */
+#define PPL_FPMATH_MAY_USE_387 1
+
+/* Defined if floating point arithmetic may use the SSE instruction set. */
+#define PPL_FPMATH_MAY_USE_SSE 1
+
+/* Defined if GLPK provides glp_term_hook(). */
+#define PPL_GLPK_HAS_GLP_TERM_HOOK 1
+
+/* Defined if GLPK provides glp_term_out(). */
+#define PPL_GLPK_HAS_GLP_TERM_OUT 1
+
+/* Defined if GLPK provides lib_set_print_hook(). */
+/* #undef PPL_GLPK_HAS_LIB_SET_PRINT_HOOK */
+
+/* Defined if GLPK provides _glp_lib_print_hook(). */
+/* #undef PPL_GLPK_HAS__GLP_LIB_PRINT_HOOK */
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#define PPL_GMP_INTEGERS 1
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#define PPL_GMP_SUPPORTS_EXCEPTIONS 1
+
+/* Defined if the integral type to be used for coefficients is a native one.
+   */
+/* #undef PPL_NATIVE_INTEGERS */
+
+/* Assertions are disabled when this is defined. */
+#define PPL_NDEBUG 1
+
+/* Not zero if doubles are supported. */
+#define PPL_SUPPORTED_DOUBLE 1
+
+/* Not zero if floats are supported. */
+#define PPL_SUPPORTED_FLOAT 1
+
+/* Not zero if long doubles are supported. */
+#define PPL_SUPPORTED_LONG_DOUBLE 1
+
+/* The size of `char', as computed by sizeof. */
+#define PPL_SIZEOF_CHAR 1
+
+/* The size of `double', as computed by sizeof. */
+#define PPL_SIZEOF_DOUBLE 8
+
+/* The size of `float', as computed by sizeof. */
+#define PPL_SIZEOF_FLOAT 4
+
+/* The size of `fp', as computed by sizeof. */
+#define PPL_SIZEOF_FP 8
+
+/* The size of `int', as computed by sizeof. */
+#define PPL_SIZEOF_INT 4
+
+/* The size of `int*', as computed by sizeof. */
+#define PPL_SIZEOF_INTP 8
+
+/* The size of `long', as computed by sizeof. */
+#define PPL_SIZEOF_LONG 8
+
+/* The size of `long double', as computed by sizeof. */
+#define PPL_SIZEOF_LONG_DOUBLE 16
+
+/* The size of `long long', as computed by sizeof. */
+#define PPL_SIZEOF_LONG_LONG 8
+
+/* The size of `mp_limb_t', as computed by sizeof. */
+#define PPL_SIZEOF_MP_LIMB_T 8
+
+/* The size of `short', as computed by sizeof. */
+#define PPL_SIZEOF_SHORT 2
+
+/* The size of `size_t', as computed by sizeof. */
+#define PPL_SIZEOF_SIZE_T 8
+
+/* Define to 1 if you have the ANSI C header files. */
+#define PPL_STDC_HEADERS 1
+
+/* Define PPL_WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define PPL_WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef PPL_WORDS_BIGENDIAN
+/* #  undef PPL_WORDS_BIGENDIAN */
+# endif
+#endif
+
+/* When defined and libstdc++ is used, it is used in debug mode. */
+/* #undef _GLIBCXX_DEBUG */
+
+/* When defined and libstdc++ is used, it is used in pedantic debug mode. */
+/* #undef _GLIBCXX_DEBUG_PEDANTIC */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to __typeof__ if your compiler spells it that way. */
+/* #undef typeof */
+
+/* Define to the type of an unsigned integer type wide enough to hold a
+   pointer, if such a type exists, and if the system does not define it. */
+/* #undef uintptr_t */
+
+
+#if defined(PPL_NDEBUG) && !defined(NDEBUG)
+# define NDEBUG PPL_NDEBUG
+#endif
+
+/* In order for the definition of `int64_t' to be seen by Comeau C/C++,
+   we must make sure <stdint.h> is included before <sys/types.hh> is
+   (even indirectly) included.  Moreover we need to define
+   __STDC_LIMIT_MACROS before the first inclusion of <stdint.h>
+   in order to have the macros defined also in C++.  */
+
+#ifdef PPL_HAVE_STDINT_H
+# ifndef __STDC_LIMIT_MACROS
+#  define __STDC_LIMIT_MACROS 1
+# endif
+# include <stdint.h>
+#endif
+
+#ifdef PPL_HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#define PPL_U(x) x
+
+#endif /* !defined(PPL_ppl_config_h) */
+
+/* END ppl-config.h */
+
+/* Automatically generated from PPL source file ../src/version.hh line 1. */
+/* Declaration of macros and functions providing version  -*- C++ -*-
+   and licensing information.
+*/
+
+
+//! The major number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MAJOR 1
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR 1
+
+//! The revision number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_REVISION 0
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+  \ingroup PPL_CXX_interface
+*/
+#define PPL_VERSION_BETA 0
+
+//! A string containing the PPL version.
+/*! \ingroup PPL_CXX_interface
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "1.1"
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Library Version Control Functions
+//@{
+
+//! Returns the major number of the PPL version.
+unsigned
+version_major();
+
+//! Returns the minor number of the PPL version.
+unsigned
+version_minor();
+
+//! Returns the revision number of the PPL version.
+unsigned
+version_revision();
+
+//! Returns the beta number of the PPL version.
+unsigned
+version_beta();
+
+//! Returns a character string containing the PPL version.
+const char* version();
+
+//! Returns a character string containing the PPL banner.
+/*!
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+const char* banner();
+
+//@} // Library Version Control Functions
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/namespaces.hh line 1. */
+/* Documentation for used namespaces.
+*/
+
+
+//! The entire library is confined to this namespace.
+namespace Parma_Polyhedra_Library {
+
+//! All input/output operators are confined to this namespace.
+/*! \ingroup PPL_CXX_interface
+  This is done so that the library's input/output operators
+  do not interfere with those the user might want to define.
+  In fact, it is highly unlikely that any predefined I/O
+  operator will suit the needs of a client application.
+  On the other hand, those applications for which the PPL
+  I/O operator are enough can easily obtain access to them.
+  For example, a directive like
+  \code
+    using namespace Parma_Polyhedra_Library::IO_Operators;
+  \endcode
+  would suffice for most uses.
+  In more complex situations, such as
+  \code
+    const Constraint_System& cs = ...;
+    copy(cs.begin(), cs.end(),
+         ostream_iterator<Constraint>(cout, "\n"));
+  \endcode
+  the Parma_Polyhedra_Library namespace must be suitably extended.
+  This can be done as follows:
+  \code
+    namespace Parma_Polyhedra_Library {
+      // Import all the output operators into the main PPL namespace.
+      using IO_Operators::operator<<;
+    }
+  \endcode
+*/
+namespace IO_Operators {
+} // namespace IO_Operators
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Types and functions implementing checked numbers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Checked {
+} // namespace Checked
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! %Implementation related data and functions.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Implementation {
+} // namespace Implementation
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to language interfaces.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the C language interface.
+/*! \ingroup PPL_C_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace C {
+
+} // namespace C
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Java language interface.
+/*! \ingroup PPL_Java_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Java {
+
+} // namespace Java
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the OCaml language interface.
+/*! \ingroup PPL_OCaml_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace OCaml {
+
+} // namespace OCaml
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Prolog language interfaces.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Prolog {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the Ciao Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace Ciao {
+
+} // namespace Ciao
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the GNU Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace GNU {
+
+} // namespace GNU
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SICStus language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SICStus {
+
+} // namespace SICStus
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the SWI-Prolog language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace SWI {
+
+} // namespace SWI
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the XSB language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace XSB {
+
+} // namespace XSB
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Data and functions related to the YAP language interface.
+/*! \ingroup PPL_Prolog_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+namespace YAP {
+
+} // namespace YAP
+
+} // namespace Prolog
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The standard C++ namespace.
+/*! \ingroup PPL_CXX_interface
+  The Parma Polyhedra Library conforms to the C++ standard and,
+  in particular, as far as reserved names are concerned (17.4.3.1,
+  [lib.reserved.names]).  The PPL, however, defines several
+  template specializations for the standard library class template
+  <CODE>numeric_limits</CODE> (18.2.1, [lib.limits]).
+
+  \note
+  The PPL provides the specializations of the class template
+  <CODE>numeric_limits</CODE> not only for PPL-specific numeric types,
+  but also for the GMP types <CODE>mpz_class</CODE> and
+  <CODE>mpq_class</CODE>. These specializations will be removed
+  as soon as they will be provided by the C++ interface of GMP.
+*/
+namespace std {
+} // namespace std
+
+
+/* Automatically generated from PPL source file ../src/Interval_Info_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+class Interval_Info_Null;
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 1. */
+/* Specializations of std::numeric_limits for "checked" types.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_defs.hh line 1. */
+/* Checked_Number class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_types.hh line 1. */
+
+
+/* Automatically generated from PPL source file ../src/Coefficient_traits_template.hh line 1. */
+/* Coefficient_traits_template class declaration.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Coefficient>
+struct Coefficient_traits_template {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_types.hh line 17. */
+
+namespace Parma_Polyhedra_Library {
+
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_defs.hh line 1. */
+/* Abstract checked arithmetic function container.
+*/
+
+
+#include <cassert>
+#include <iostream>
+#include <gmpxx.h>
+/* Automatically generated from PPL source file ../src/mp_std_bits_defs.hh line 1. */
+/* Declarations of specializations of std:: objects for
+   multi-precision types.
+*/
+
+
+#include <gmpxx.h>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpz_class& x, mpz_class& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(mpq_class& x, mpq_class& y);
+
+#if __GNU_MP_VERSION < 5 \
+  || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpz_class> {
+private:
+  typedef mpz_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = true;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(1);
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+class numeric_limits<mpq_class> {
+private:
+  typedef mpq_class Type;
+
+public:
+  static const bool is_specialized = true;
+  static const int digits = 0;
+  static const int digits10 = 0;
+  static const bool is_signed = true;
+  static const bool is_integer = false;
+  static const bool is_exact = true;
+  static const int radix = 2;
+  static const int min_exponent = 0;
+  static const int min_exponent10 = 0;
+  static const int max_exponent = 0;
+  static const int max_exponent10 = 0;
+  static const bool has_infinity = false;
+  static const bool has_quiet_NaN =  false;
+  static const bool has_signaling_NaN = false;
+  static const float_denorm_style has_denorm = denorm_absent;
+  static const bool has_denorm_loss = false;
+  static const bool is_iec559 = false;
+  static const bool is_bounded = false;
+  static const bool is_modulo = false;
+  static const bool traps = false;
+  static const bool tinyness_before = false;
+  static const float_round_style round_style = round_toward_zero;
+
+  static Type min() {
+    return static_cast<Type>(0);
+  }
+
+  static Type max() {
+    return static_cast<Type>(0);
+  }
+
+  static Type epsilon() {
+    return static_cast<Type>(0);
+  }
+
+  static Type round_error() {
+    return static_cast<Type>(0);
+  }
+
+  static Type infinity() {
+    return static_cast<Type>(0);
+  }
+
+  static Type quiet_NaN() {
+    return static_cast<Type>(0);
+  }
+
+  static Type denorm_min() {
+    return static_cast<Type>(0);
+  }
+};
+
+} // namespace std
+
+#endif // __GNU_MP_VERSION < 5
+       // || (__GNU_MP_VERSION == 5 && __GNU_MP_VERSION_MINOR < 1)
+
+/* Automatically generated from PPL source file ../src/mp_std_bits_inlines.hh line 1. */
+/* Definitions of specializations of std:: functions and methods for
+   multi-precision types.
+*/
+
+
+inline void
+swap(mpz_class& x, mpz_class& y) {
+  mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+swap(mpq_class& x, mpq_class& y) {
+  mpq_swap(x.get_mpq_t(), y.get_mpq_t());
+}
+
+/* Automatically generated from PPL source file ../src/mp_std_bits_defs.hh line 174. */
+
+/* Automatically generated from PPL source file ../src/Temp_defs.hh line 1. */
+/* Temp_* classes declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/meta_programming.hh line 1. */
+/* Metaprogramming utilities.
+*/
+
+
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>bool</CODE>, called \p name
+  and with value \p value.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_bool_nodef(name, value)           \
+  enum const_bool_value_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type <CODE>int</CODE>, called \p name
+  and with value \p value.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_int_nodef(name, value) \
+  enum anonymous_enum_ ## name { PPL_U(name) = (value) }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  The value of the constant is accessible
+  by means of the syntax <CODE>name()</CODE>.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_value_nodef(type, name, value)    \
+  static type PPL_U(name)() {                   \
+    return (value);                             \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Declares a per-class constant of type \p type, called \p name
+  and with value \p value.  A constant reference to the constant
+  is accessible by means of the syntax <CODE>name()</CODE>.
+
+  \ingroup PPL_CXX_interface
+  Differently from static constants, \p name needs not (and cannot) be
+  defined (for static constants, the need for a further definition is
+  mandated by Section 9.4.2/4 of the C++ standard).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define const_ref_nodef(type, name, value)                              \
+  static const type& PPL_U(name)() {                                    \
+    static type PPL_U(name) = (value);                                       \
+    return (name);                                                      \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, so the class is declared but not defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Compile_Time_Check;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that is only defined if \p b evaluates to <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the specialized case with \p b equal to <CODE>true</CODE>,
+  so the class is declared and (trivially) defined.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Compile_Time_Check<true> {
+};
+
+#define PPL_COMPILE_TIME_CHECK_NAME(suffix) compile_time_check_ ## suffix
+#define PPL_COMPILE_TIME_CHECK_AUX(e, suffix)                           \
+  enum anonymous_enum_compile_time_check_ ## suffix {                   \
+    /* If e evaluates to false, then the sizeof cannot be compiled. */  \
+    PPL_COMPILE_TIME_CHECK_NAME(suffix)                                 \
+      = sizeof(Parma_Polyhedra_Library::Compile_Time_Check<(e)>)        \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Produces a compilation error if the compile-time constant \p e does
+  not evaluate to <CODE>true</CODE>
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_COMPILE_TIME_CHECK(e, msg) PPL_COMPILE_TIME_CHECK_AUX(e, __LINE__)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to \p b.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b>
+struct Bool {
+  enum const_bool_value {
+    value = b
+  };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct True : public Bool<true> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>false</CODE>.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct False : public Bool<false> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which \p T1 and \p T2 can be different.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T1, typename T2>
+struct Is_Same : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p T1 is the same type as \p T2.
+
+  \ingroup PPL_CXX_interface
+  This is the specialization in which \p T1 and \p T2 are equal.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Same<T, T> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class holding a constant called <CODE>value</CODE> that evaluates
+  to <CODE>true</CODE> if and only if \p Base is the same type as \p Derived
+  or \p Derived is a class derived from \p Base.
+
+  \ingroup PPL_CXX_interface
+  \note
+  Care must be taken to use this predicate with template classes.
+  Suppose we have
+  \code
+  template <typename T> struct B;
+  template <typename T> struct D : public B<T>;
+  \endcode
+  Of course, we cannot test if, for some type variable <CODE>U</CODE>, we have
+  <CODE>Is_Same_Or_Derived<B<U>, Type>:: const_bool_value:: value == true</CODE>.
+  But we can do as follows:
+  \code
+  struct B_Base {
+  };
+
+  template <typename T> struct B : public B_Base;
+  \endcode
+  This enables us to inquire
+  <CODE>Is_Same_Or_Derived<B_Base, Type>:: const_bool_value:: value</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Base, typename Derived>
+struct Is_Same_Or_Derived {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A class that is constructible from just anything.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct Any {
+    //! The universal constructor.
+    template <typename T>
+    Any(const T&);
+  };
+
+  //! Overloading with \p Base.
+  static char func(const Base&);
+
+  //! Overloading with \p Any.
+  static double func(Any);
+
+  //! A function obtaining a const reference to a \p Derived object.
+  static const Derived& derived_object();
+
+  PPL_COMPILE_TIME_CHECK(sizeof(char) != sizeof(double),
+                         "architecture with sizeof(char) == sizeof(double)"
+                         " (!?)");
+
+  enum const_bool_value {
+    /*!
+      Assuming <CODE>sizeof(char) != sizeof(double)</CODE>, the C++
+      overload resolution mechanism guarantees that <CODE>value</CODE>
+      evaluates to <CODE>true</CODE> if and only if <CODE>Base</CODE>
+      is the same type as <CODE>Derived</CODE> or <CODE>Derived</CODE>
+      is a class derived from <CODE>Base</CODE>.
+    */
+    value = (sizeof(func(derived_object())) == sizeof(char))
+  };
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the non-specialized case, in which the <CODE>type</CODE> member
+  is not present.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <bool b, typename T = void>
+struct Enable_If {
+};
+
+template <typename Type, Type, typename T = void>
+struct Enable_If_Is {
+  typedef T type;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  A class that provides a type member called <CODE>type</CODE> equivalent
+  to \p T if and only if \p b is <CODE>true</CODE>.
+
+  \ingroup PPL_CXX_interface
+  This is the specialization in which the <CODE>type</CODE> member
+  is present.
+
+  \note
+  Let <CODE>T</CODE>, <CODE>T1</CODE> and <CODE>T2</CODE> be any type
+  expressions and suppose we have some template function
+  <CODE>T f(T1, T2)</CODE>.  If we want to declare a specialization
+  that is enabled only if some compile-time checkable condition holds,
+  we simply declare the specialization by
+  \code
+  template ...
+  typename Enable_If<condition, T>::type
+  foo(T1 x, T2 y);
+  \endcode
+  For all the instantiations of the template parameters that cause
+  <CODE>condition</CODE> to evaluate to <CODE>false</CODE>,
+  the <CODE>Enable_If<condition, T>::type</CODE> member will not be defined.
+  Hence, for that instantiations, the specialization will not be eligible.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Enable_If<true, T> {
+  typedef T type;
+};
+
+template <typename T>
+struct Is_Native : public False {
+};
+
+template <> struct Is_Native<char> : public True { };
+template <> struct Is_Native<signed char> : public True { };
+template <> struct Is_Native<signed short> : public True { };
+template <> struct Is_Native<signed int> : public True { };
+template <> struct Is_Native<signed long> : public True { };
+template <> struct Is_Native<signed long long> : public True { };
+template <> struct Is_Native<unsigned char> : public True { };
+template <> struct Is_Native<unsigned short> : public True { };
+template <> struct Is_Native<unsigned int> : public True { };
+template <> struct Is_Native<unsigned long> : public True { };
+template <> struct Is_Native<unsigned long long> : public True { };
+
+#if PPL_SUPPORTED_FLOAT
+template <> struct Is_Native<float> : public True { };
+#endif
+#if PPL_SUPPORTED_DOUBLE
+template <> struct Is_Native<double> : public True { };
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <> struct Is_Native<long double> : public True { };
+#endif
+
+template <> struct Is_Native<mpz_class> : public True { };
+
+template <> struct Is_Native<mpq_class> : public True { };
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Slow_Copy.hh line 1. */
+/* Basic Slow_Copy classes declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Slow_Copy.hh line 28. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are not slow by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Slow_Copy : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpz_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpz_class> : public True {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  Copies are slow for mpq_class objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Slow_Copy<mpq_class> : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Temp_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A pool of temporary items of type \p T.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Item {
+public:
+  //! Obtains a reference to a temporary item.
+  static Temp_Item& obtain();
+
+  //! Releases the temporary item \p p.
+  static void release(Temp_Item& p);
+
+  //! Returns a reference to the encapsulated item.
+  T& item();
+
+private:
+  //! The encapsulated item.
+  T item_;
+
+  //! Pointer to the next item in the free list.
+  Temp_Item* next;
+
+  //! Head of the free list.
+  static Temp_Item* free_list_head;
+
+  //! Default constructor.
+  Temp_Item();
+
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Item(const Temp_Item&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Item& operator=(const Temp_Item&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An holder for a reference to a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Reference_Holder {
+public:
+  //! Constructs an holder holding a dirty temp.
+  Temp_Reference_Holder();
+
+  //! Destructor.
+  ~Temp_Reference_Holder();
+
+  //! Returns a reference to the held item.
+  T& item();
+
+private:
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Reference_Holder(const Temp_Reference_Holder&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Reference_Holder& operator=(const Temp_Reference_Holder&);
+
+  //! The held item, encapsulated.
+  Temp_Item<T>& held;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An (fake) holder for the value of a temporary object.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Temp_Value_Holder {
+public:
+  //! Constructs a fake holder.
+  Temp_Value_Holder();
+
+  //! Returns the value of the held item.
+  T& item();
+
+private:
+  //! Copy constructor: private and intentionally not implemented.
+  Temp_Value_Holder(const Temp_Value_Holder&);
+
+  //! Assignment operator: private and intentionally not implemented.
+  Temp_Value_Holder& operator=(const Temp_Value_Holder&);
+
+  //! The held item.
+  T item_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A structure for the efficient handling of temporaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+class Dirty_Temp;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with a free list.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<Slow_Copy<T>::value>::type>
+  : public Temp_Reference_Holder<T> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization for the handling of temporaries with local variables.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Dirty_Temp<T, typename Enable_If<!Slow_Copy<T>::value>::type>
+  : public Temp_Value_Holder<T> {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Temp_inlines.hh line 1. */
+/* Temp_* classes implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Temp_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Temp_Item<T>::Temp_Item()
+  : item_() {
+}
+
+template <typename T>
+inline T&
+Temp_Item<T>::item() {
+    return item_;
+}
+
+template <typename T>
+inline Temp_Item<T>&
+Temp_Item<T>::obtain() {
+  if (free_list_head != 0) {
+    Temp_Item* const p = free_list_head;
+    free_list_head = free_list_head->next;
+    return *p;
+  }
+  else
+    return *new Temp_Item();
+}
+
+template <typename T>
+inline void
+Temp_Item<T>::release(Temp_Item& p) {
+  p.next = free_list_head;
+  free_list_head = &p;
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::Temp_Reference_Holder()
+  : held(Temp_Item<T>::obtain()) {
+}
+
+template <typename T>
+inline
+Temp_Reference_Holder<T>::~Temp_Reference_Holder() {
+  Temp_Item<T>::release(held);
+}
+
+template <typename T>
+inline T&
+Temp_Reference_Holder<T>::item() {
+  return held.item();
+}
+
+template <typename T>
+inline
+Temp_Value_Holder<T>::Temp_Value_Holder() {
+}
+
+template <typename T>
+inline T&
+Temp_Value_Holder<T>::item() {
+  return item_;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#define PPL_DIRTY_TEMP(T, id)                                           \
+  Parma_Polyhedra_Library::Dirty_Temp<PPL_U(T)> holder_ ## id;          \
+  PPL_U(T)& PPL_U(id) = holder_ ## id.item()
+
+/* Automatically generated from PPL source file ../src/Temp_templates.hh line 1. */
+/* Temp_* classes implementation: non-inline template members.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Temp_Item<T>* Temp_Item<T>::free_list_head = 0;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Temp_defs.hh line 142. */
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_defs.hh line 1. */
+/* Declaration of Rounding_Dir and related functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Result_defs.hh line 1. */
+/* Result enum and supporting function declarations.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+enum Result_Class {
+  //! \hideinitializer Representable number result class.
+  VC_NORMAL = 0U << 4,
+
+  //! \hideinitializer Negative infinity result class.
+  VC_MINUS_INFINITY = 1U << 4,
+
+  //! \hideinitializer Positive infinity result class.
+  VC_PLUS_INFINITY = 2U << 4,
+
+  //! \hideinitializer Not a number result class.
+  VC_NAN = 3U << 4,
+
+  VC_MASK = VC_NAN
+};
+
+// This must be kept in sync with Relation_Symbol
+enum Result_Relation {
+  //! \hideinitializer No values satisfies the relation.
+  VR_EMPTY = 0U,
+
+  //! \hideinitializer Equal. This need to be accompanied by a value.
+  VR_EQ = 1U,
+
+  //! \hideinitializer Less than. This need to be accompanied by a value.
+  VR_LT = 2U,
+
+  //! \hideinitializer Greater than. This need to be accompanied by a value.
+  VR_GT = 4U,
+
+  //! \hideinitializer Not equal. This need to be accompanied by a value.
+  VR_NE = VR_LT | VR_GT,
+
+  //! \hideinitializer Less or equal. This need to be accompanied by a value.
+  VR_LE = VR_EQ | VR_LT,
+
+  //! \hideinitializer Greater or equal. This need to be accompanied by a value.
+  VR_GE = VR_EQ | VR_GT,
+
+  //! \hideinitializer All values satisfy the relation.
+  VR_LGE = VR_LT | VR_EQ | VR_GT,
+
+  VR_MASK = VR_LGE
+};
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+  //! \hideinitializer The exact result is not comparable.
+  V_EMPTY = VR_EMPTY,
+
+  //! \hideinitializer The computed result is exact.
+  V_EQ = static_cast<unsigned>(VR_EQ),
+
+  //! \hideinitializer The computed result is inexact and rounded up.
+  V_LT = static_cast<unsigned>(VR_LT),
+
+  //! \hideinitializer The computed result is inexact and rounded down.
+  V_GT = static_cast<unsigned>(VR_GT),
+
+  //! \hideinitializer The computed result is inexact.
+  V_NE = VR_NE,
+
+  //! \hideinitializer The computed result may be inexact and rounded up.
+  V_LE = VR_LE,
+
+  //! \hideinitializer The computed result may be inexact and rounded down.
+  V_GE = VR_GE,
+
+  //! \hideinitializer The computed result may be inexact.
+  V_LGE = VR_LGE,
+
+  //! \hideinitializer The exact result is a number out of finite bounds.
+  V_OVERFLOW = 1U << 6,
+
+  //! \hideinitializer A negative integer overflow occurred (rounding up).
+  V_LT_INF = V_LT | V_OVERFLOW,
+
+  //! \hideinitializer A positive integer overflow occurred (rounding down).
+  V_GT_SUP = V_GT | V_OVERFLOW,
+
+  //! \hideinitializer A positive integer overflow occurred (rounding up).
+  V_LT_PLUS_INFINITY = V_LT | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+  //! \hideinitializer A negative integer overflow occurred (rounding down).
+  V_GT_MINUS_INFINITY = V_GT | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+  //! \hideinitializer Negative infinity result.
+  V_EQ_MINUS_INFINITY = V_EQ | static_cast<unsigned>(VC_MINUS_INFINITY),
+
+  //! \hideinitializer Positive infinity result.
+  V_EQ_PLUS_INFINITY = V_EQ | static_cast<unsigned>(VC_PLUS_INFINITY),
+
+  //! \hideinitializer Not a number result.
+  V_NAN = static_cast<unsigned>(VC_NAN),
+
+  //! \hideinitializer Converting from unknown string.
+  V_CVT_STR_UNK = V_NAN | (1U << 8),
+
+  //! \hideinitializer Dividing by zero.
+  V_DIV_ZERO = V_NAN | (2U << 8),
+
+  //! \hideinitializer Adding two infinities having opposite signs.
+  V_INF_ADD_INF = V_NAN | (3U << 8),
+
+  //! \hideinitializer Dividing two infinities.
+  V_INF_DIV_INF = V_NAN | (4U << 8),
+
+  //! \hideinitializer Taking the modulus of an infinity.
+  V_INF_MOD = V_NAN | (5U << 8),
+
+  //! \hideinitializer Multiplying an infinity by zero.
+  V_INF_MUL_ZERO = V_NAN | (6U << 8),
+
+  //! \hideinitializer Subtracting two infinities having the same sign.
+  V_INF_SUB_INF = V_NAN | (7U << 8),
+
+  //! \hideinitializer Computing a remainder modulo zero.
+  V_MOD_ZERO = V_NAN | (8U << 8),
+
+  //! \hideinitializer Taking the square root of a negative number.
+  V_SQRT_NEG = V_NAN | (9U << 8),
+
+  //! \hideinitializer Unknown result due to intermediate negative overflow.
+  V_UNKNOWN_NEG_OVERFLOW = V_NAN | (10U << 8),
+
+  //! \hideinitializer Unknown result due to intermediate positive overflow.
+  V_UNKNOWN_POS_OVERFLOW = V_NAN | (11U << 8),
+
+  //! \hideinitializer The computed result is not representable.
+  V_UNREPRESENTABLE = 1U << 7
+
+};
+
+//! \name Functions Inspecting and/or Combining Result Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Result operator&(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator|(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface */
+Result operator-(Result x, Result y);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Extracts the value class part of \p r (representable number,
+  unrepresentable minus/plus infinity or nan).
+*/
+Result_Class result_class(Result r);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Extracts the relation part of \p r.
+*/
+Result_Relation result_relation(Result r);
+
+/*! \ingroup PPL_CXX_interface */
+Result result_relation_class(Result r);
+
+//@} // Functions Inspecting and/or Combining Result Values
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Result_inlines.hh line 1. */
+/* Result supporting functions implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/assert.hh line 1. */
+/* Implementation of PPL assert-like macros.
+*/
+
+
+// The PPL_UNREACHABLE_MSG macro flags a program point as unreachable.
+// Argument `msg__' is added to output when assertions are turned on.
+#if defined(NDEBUG)
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library::ppl_unreachable()
+#else
+#define PPL_UNREACHABLE_MSG(msg__) Parma_Polyhedra_Library:: \
+  ppl_unreachable_msg(msg__, __FILE__, __LINE__, __func__)
+#endif
+
+// The PPL_UNREACHABLE macro flags a program point as unreachable.
+#define PPL_UNREACHABLE PPL_UNREACHABLE_MSG("unreachable")
+
+// The PPL_ASSERTION_FAILED macro is used to output a message after
+// an assertion failure and then cause program termination.
+// (It is meant to be used only when assertions are turned on.)
+#define PPL_ASSERTION_FAILED(msg__) Parma_Polyhedra_Library:: \
+  ppl_assertion_failed(msg__, __FILE__, __LINE__, __func__)
+
+// Helper macro PPL_ASSERT_IMPL_: do not use it directly.
+#if defined(NDEBUG)
+#define PPL_ASSERT_IMPL_(cond__) ((void) 0)
+#else
+#define PPL_STRING_(s) #s
+#define PPL_ASSERT_IMPL_(cond__) \
+  ((cond__) ? (void) 0 : PPL_ASSERTION_FAILED(PPL_STRING_(cond__)))
+#endif
+
+
+// Non zero to detect use of PPL_ASSERT instead of PPL_ASSERT_HEAVY
+// Note: flag does not affect code built with NDEBUG defined.
+#define PPL_DEBUG_PPL_ASSERT 1
+
+// The PPL_ASSERT macro states that Boolean condition cond__ should hold.
+// This is meant to replace uses of C assert().
+#if defined(NDEBUG) || (!PPL_DEBUG_PPL_ASSERT)
+#define PPL_ASSERT(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+// Note: here we have assertions enabled and PPL_DEBUG_PPL_ASSERT is 1.
+// Check if the call to PPL_ASSERT should be replaced by PPL_ASSERT_HEAVY
+// (i.e., if the former may interfere with computational weights).
+#define PPL_ASSERT(cond__)                                        \
+  do {                                                            \
+    typedef Parma_Polyhedra_Library::Weightwatch_Traits W_Traits; \
+    W_Traits::Threshold old_weight__ = W_Traits::weight;          \
+    PPL_ASSERT_IMPL_(cond__);                                     \
+    PPL_ASSERT_IMPL_(old_weight__ == W_Traits::weight             \
+                     && ("PPL_ASSERT_HEAVY has to be used here" != 0)); \
+  } while (false)
+#endif // !defined(NDEBUG) && PPL_DEBUG_PPL_ASSERT
+
+
+// Macro PPL_ASSERT_HEAVY is meant to be used when the evaluation of
+// the assertion may change computational weights (via WEIGHT_ADD).
+#if defined(NDEBUG)
+#define PPL_ASSERT_HEAVY(cond__) PPL_ASSERT_IMPL_(cond__)
+#else
+#define PPL_ASSERT_HEAVY(cond__)                                \
+  do {                                                          \
+    Parma_Polyhedra_Library::In_Assert guard;                   \
+    PPL_ASSERT_IMPL_(cond__);                                   \
+  } while (false)
+#endif // !defined(NDEBUG)
+
+
+// Macro PPL_EXPECT (resp., PPL_EXPECT_HEAVY) should be used rather than
+// PPL_ASSERT (resp., PPL_ASSERT_HEAVY) when the condition is assumed to
+// hold but it is not under library control (typically, it depends on
+// user provided input).
+#define PPL_EXPECT(cond__) PPL_ASSERT(cond__)
+#define PPL_EXPECT_HEAVY(cond__) PPL_ASSERT_HEAVY(cond__)
+
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+#define PPL_WEAK_NORETURN __attribute__((weak, noreturn))
+#else
+#define PPL_WEAK_NORETURN __attribute__((noreturn))
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper function causing program termination by calling \c abort.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable() PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Helper function printing message on \c std::cerr and causing program
+  termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable_msg(const char* msg,
+                         const char* file, unsigned int line,
+                         const char* function) PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Helper function printing an assertion failure message on \c std::cerr
+  and causing program termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_assertion_failed(const char* assertion_text,
+                          const char* file, unsigned int line,
+                          const char* function) PPL_WEAK_NORETURN;
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns \c true if and only if \p x_copy contains \p y_copy.
+
+  \note
+  This is a helper function for debugging purposes, to be used in assertions.
+  The two arguments are meant to be passed by value, i.e., <em>copied</em>,
+  so that their representations will not be affected by the containment check.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool copy_contains(T x_copy, T y_copy) {
+  return x_copy.contains(y_copy);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Result_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator&(Result x, Result y) {
+  const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+  return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator|(Result x, Result y) {
+  const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+  return static_cast<Result>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+operator-(Result x, Result y) {
+  const Result y_neg = static_cast<Result>(~static_cast<unsigned>(y));
+  return x & y_neg;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Class
+result_class(Result r) {
+  const Result rc = r & static_cast<Result>(VC_MASK);
+  return static_cast<Result_Class>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result_Relation
+result_relation(Result r) {
+  const Result rc = r & static_cast<Result>(VR_MASK);
+  return static_cast<Result_Relation>(rc);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Result
+result_relation_class(Result r) {
+  return r & (static_cast<Result>(VR_MASK) | static_cast<Result>(VC_MASK));
+}
+
+inline int
+result_overflow(Result r) {
+  switch (result_class(r)) {
+  case VC_NORMAL:
+    switch (r) {
+    case V_LT_INF:
+      return -1;
+    case V_GT_SUP:
+      return 1;
+    default:
+      break;
+    }
+    break;
+  case VC_MINUS_INFINITY:
+    return -1;
+  case VC_PLUS_INFINITY:
+    return 1;
+  default:
+    break;
+  }
+  return 0;
+}
+
+inline bool
+result_representable(Result r) {
+  return (r & V_UNREPRESENTABLE) != V_UNREPRESENTABLE;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Result_defs.hh line 194. */
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 1. */
+/* Floating point unit related functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/fpu_types.hh line 1. */
+
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+enum fpu_rounding_direction_type {};
+enum fpu_rounding_control_word_type {};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/compiler.hh line 1. */
+/* C++ compiler related stuff.
+*/
+
+
+#include <cstddef>
+#include <climits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op macro that allows to avoid unused variable warnings from
+  the compiler.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_USED(v) (void)(v)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  No-op function that force the compiler to store the argument and
+  to reread it from memory if needed (thus preventing CSE).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+PPL_CC_FLUSH(const T& x) {
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+  __asm__ __volatile__ ("" : "+m" (const_cast<T&>(x)));
+#else
+  // FIXME: is it possible to achieve the same effect in a portable way?
+  PPL_USED(x);
+#endif
+}
+
+#ifndef PPL_SUPPRESS_UNINIT_WARNINGS
+#define PPL_SUPPRESS_UNINIT_WARNINGS 1
+#endif
+
+#ifndef PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+#define PPL_SUPPRESS_UNINITIALIZED_WARNINGS 1
+#endif
+
+#if PPL_SUPPRESS_UNINITIALIZED_WARNINGS
+template <typename T>
+struct Suppress_Uninitialized_Warnings_Type {
+  typedef T synonym;
+};
+
+#define PPL_UNINITIALIZED(type, name)                                   \
+  PPL_U(type) PPL_U(name)                                               \
+  = Suppress_Uninitialized_Warnings_Type<PPL_U(type)>::synonym ()
+#else
+#define PPL_UNINITIALIZED(type, name)           \
+  PPL_U(type) name
+#endif
+
+#define sizeof_to_bits(size)                    \
+  ((size) * static_cast<std::size_t>(CHAR_BIT))
+
+#if !defined(__GNUC__)
+
+inline unsigned int
+clz32(uint32_t w) {
+  unsigned int r = 31;
+  if ((w & 0xffff0000U) != 0) {
+    w >>= 16;
+    r -= 16;
+  }
+  if ((w & 0xff00U) != 0) {
+    w >>= 8;
+    r -= 8;
+  }
+  if ((w & 0xf0U) != 0) {
+    w >>= 4;
+    r -= 4;
+  }
+  if ((w & 0xcU) != 0) {
+    w >>= 2;
+    r -= 2;
+  }
+  if ((w & 0x2U) != 0)
+    r -= 1;
+  return r;
+}
+
+inline unsigned int
+clz64(uint64_t w) {
+  if ((w & 0xffffffff00000000ULL) == 0)
+    return clz32(static_cast<uint32_t>(w)) + 32;
+  else
+    return clz32(static_cast<uint32_t>(w >> 32));
+}
+
+inline unsigned int
+ctz32(uint32_t w) {
+  static const unsigned int mod37_table[] = {
+    32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
+    4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
+    5, 20, 8, 19, 18
+  };
+  return mod37_table[(w & -w) % 37];
+}
+
+inline unsigned int
+ctz64(uint64_t w) {
+  if ((w & 0x00000000ffffffffULL) == 0)
+    return ctz32(static_cast<uint32_t>(w >> 32)) + 32;
+  else
+    return ctz32(static_cast<uint32_t>(w));
+}
+
+#endif
+
+inline unsigned int
+clz(unsigned int u) {
+  assert(u != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_clz(u));
+#elif PPL_SIZEOF_INT == 4
+  return clz32(u);
+#elif PPL_SIZEOF_INT == 8
+  return clz64(u);
+#else
+  #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long ul) {
+  assert(ul != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_clzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+  return clz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+  return clz64(ul);
+#else
+  #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+clz(unsigned long long ull) {
+  assert(ull != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_clzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+  return clz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+  return clz64(ull);
+#else
+  #error "Unsupported unsigned long long size"
+#endif
+}
+
+
+inline unsigned int
+ctz(unsigned int u) {
+  assert(u != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_ctz(u));
+#elif PPL_SIZEOF_INT == 4
+  return ctz32(u);
+#elif PPL_SIZEOF_INT == 8
+  return ctz64(u);
+#else
+  #error "Unsupported unsigned int size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long ul) {
+  assert(ul != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_ctzl(ul));
+#elif PPL_SIZEOF_LONG == 4
+  return ctz32(ul);
+#elif PPL_SIZEOF_LONG == 8
+  return ctz64(ul);
+#else
+  #error "Unsupported unsigned long size"
+#endif
+}
+
+inline unsigned int
+ctz(unsigned long long ull) {
+  assert(ull != 0);
+#if defined(__GNUC__)
+  return static_cast<unsigned int>(__builtin_ctzll(ull));
+#elif PPL_SIZEOF_LONG_LONG == 4
+  return ctz32(ull);
+#elif PPL_SIZEOF_LONG_LONG == 8
+  return ctz64(ull);
+#else
+  #error "Unsupported unsigned long long size"
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Functions Controlling Floating Point Unit
+//@{
+
+//! Initializes the FPU control functions.
+void
+fpu_initialize_control_functions();
+
+//! Returns the current FPU rounding direction.
+fpu_rounding_direction_type
+fpu_get_rounding_direction();
+
+//! Sets the FPU rounding direction to \p dir.
+void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir and returns the rounding
+  control word previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir);
+
+/*! \brief
+  Sets the FPU rounding direction to \p dir, clears the <EM>inexact
+  computation</EM> status, and returns the rounding control word
+  previously in use.
+*/
+fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir);
+
+//! Restores the FPU rounding rounding control word to \p cw.
+void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w);
+
+//! Clears the <EM>inexact computation</EM> status.
+void
+fpu_reset_inexact();
+
+/*! \brief
+  Queries the <EM>inexact computation</EM> status.
+
+  Returns 0 if the computation was definitely exact, 1 if it was
+  definitely inexact, -1 if definite exactness information is unavailable.
+*/
+int
+fpu_check_inexact();
+
+//@} // Functions Controlling Floating Point Unit
+
+} // namespace Parma_Polyhedra_Library
+
+#if PPL_CAN_CONTROL_FPU
+
+#if defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+/* Automatically generated from PPL source file ../src/fpu-ia32_inlines.hh line 1. */
+/* IA-32 floating point unit inline related functions.
+*/
+
+
+#include <csetjmp>
+#include <csignal>
+
+#define FPU_INVALID       0x01
+#define FPU_DIVBYZERO     0x04
+#define FPU_OVERFLOW      0x08
+#define FPU_UNDERFLOW     0x10
+#define FPU_INEXACT       0x20
+
+#define FPU_ALL_EXCEPT \
+  (FPU_INEXACT | FPU_DIVBYZERO | FPU_UNDERFLOW | FPU_OVERFLOW | FPU_INVALID)
+
+#define PPL_FPU_TONEAREST     0
+#define PPL_FPU_DOWNWARD      0x400
+#define PPL_FPU_UPWARD        0x800
+#define PPL_FPU_TOWARDZERO    0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define SSE_INEXACT       0x20
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+#define PPL_SSE_CONTROL_DEFAULT_BASE 0x1f80
+
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT \
+  (PPL_FPU_CONTROL_DEFAULT_BASE | PPL_FPU_UPWARD)
+#define PPL_SSE_CONTROL_DEFAULT \
+  (PPL_SSE_CONTROL_DEFAULT_BASE | (PPL_FPU_UPWARD << 3))
+
+namespace Parma_Polyhedra_Library {
+
+typedef struct {
+  unsigned short control_word;
+  unsigned short unused1;
+  unsigned short status_word;
+  unsigned short unused2;
+  unsigned short tags;
+  unsigned short unused3;
+  unsigned int eip;
+  unsigned short cs_selector;
+  unsigned int opcode:11;
+  unsigned int unused4:5;
+  unsigned int data_offset;
+  unsigned short data_selector;
+  unsigned short unused5;
+} ia32_fenv_t;
+
+inline int
+fpu_get_control() {
+  unsigned short cw;
+  __asm__ __volatile__ ("fnstcw %0" : "=m" (*&cw) : : "memory");
+  return cw;
+}
+
+inline void
+fpu_set_control(int c) {
+  unsigned short cw = static_cast<unsigned short>(c);
+  __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw) : "memory");
+}
+
+inline int
+fpu_get_status() {
+  unsigned short sw;
+  __asm__ __volatile__ ("fnstsw %0" : "=a" (sw) : : "memory");
+  return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+  /* There is no fldsw instruction */
+  ia32_fenv_t env;
+  __asm__ __volatile__ ("fnstenv %0" : "=m" (env));
+  env.status_word = static_cast<unsigned short>(env.status_word & ~bits);
+  __asm__ __volatile__ ("fldenv %0" : : "m" (env) : "memory");
+}
+
+inline void
+fpu_clear_exceptions() {
+  __asm__ __volatile__ ("fnclex" : /* No outputs.  */ : : "memory");
+}
+
+#ifdef PPL_FPMATH_MAY_USE_SSE
+inline void
+sse_set_control(unsigned int cw) {
+  __asm__ __volatile__ ("ldmxcsr %0" : : "m" (*&cw) : "memory");
+}
+
+inline unsigned int
+sse_get_control() {
+  unsigned int cw;
+  __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory");
+  return cw;
+}
+#endif
+
+inline void
+fpu_initialize_control_functions() {
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern void detect_sse_unit();
+  detect_sse_unit();
+#endif
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fpu_get_control() & FPU_ROUNDING_MASK);
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT_BASE | (dir << 3));
+#endif
+  return static_cast<fpu_rounding_control_word_type>(0);
+}
+
+inline void
+fpu_reset_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_clear_exceptions();
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  // NOTE: on entry to this function the current rounding mode
+  // has to be the default one.
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+#ifdef PPL_FPMATH_MAY_USE_387
+  fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit)
+    sse_set_control(PPL_SSE_CONTROL_DEFAULT);
+#endif
+}
+
+inline int
+fpu_check_inexact() {
+#ifdef PPL_FPMATH_MAY_USE_387
+  if (fpu_get_status() & FPU_INEXACT)
+    return 1;
+#endif
+#ifdef PPL_FPMATH_MAY_USE_SSE
+  extern bool have_sse_unit;
+  if (have_sse_unit && (sse_get_control() & SSE_INEXACT))
+    return 1;
+#endif
+  return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 87. */
+#elif defined(PPL_HAVE_IEEEFP_H)                                        \
+  && (defined(__sparc)                                                  \
+      || defined(sparc)                                                 \
+      || defined(__sparc__))
+/* Automatically generated from PPL source file ../src/fpu-sparc_inlines.hh line 1. */
+/* SPARC floating point unit related functions.
+*/
+
+
+#ifdef PPL_HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define PPL_FPU_TONEAREST  ((int) FP_RN)
+#define PPL_FPU_UPWARD     ((int) FP_RP)
+#define PPL_FPU_DOWNWARD   ((int) FP_RM)
+#define PPL_FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fpgetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fpsetround((fp_rnd) dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  return static_cast<fpu_rounding_control_word_type>(fpsetround((fp_rnd) dir));
+}
+
+inline void
+fpu_reset_inexact() {
+  fp_except except = fpgetmask();
+  except &= ~FP_X_IMP;
+  fpsetmask(except);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fpsetround((fp_rnd) w);
+}
+
+inline int
+fpu_check_inexact() {
+  return (fpgetmask() & FP_X_IMP) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_IEEEFP_H)
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 92. */
+#elif defined(PPL_HAVE_FENV_H)
+/* Automatically generated from PPL source file ../src/fpu-c99_inlines.hh line 1. */
+/* C99 Floating point unit related functions.
+*/
+
+
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+#include <stdexcept>
+
+#ifdef FE_TONEAREST
+#define PPL_FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define PPL_FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define PPL_FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define PPL_FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+  const int old = fegetround();
+  if (fesetround(PPL_FPU_DOWNWARD) != 0
+      || fesetround(PPL_FPU_UPWARD) != 0
+      || fesetround(old) != 0)
+    throw std::logic_error("PPL configuration error:"
+                           " PPL_CAN_CONTROL_FPU evaluates to true,"
+                           " but fesetround() returns nonzero.");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  return static_cast<fpu_rounding_direction_type>(fegetround());
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+  fesetround(dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+  const fpu_rounding_control_word_type old
+    = static_cast<fpu_rounding_control_word_type>(fegetround());
+  fesetround(dir);
+  return old;
+}
+
+inline void
+fpu_reset_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+  feclearexcept(FE_INEXACT);
+#endif
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+  fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+  return fetestexcept(FE_INEXACT) != 0 ? 1 : 0;
+#else
+  return -1;
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_HAVE_FENV_H)
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 94. */
+#else
+#error "PPL_CAN_CONTROL_FPU evaluates to true: why?"
+#endif
+
+#else // !PPL_CAN_CONTROL_FPU
+
+/* Automatically generated from PPL source file ../src/fpu-none_inlines.hh line 1. */
+/* Null floating point unit related functions.
+*/
+
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+fpu_initialize_control_functions() {
+  throw std::logic_error("PPL::fpu_initialize_control_functions():"
+                         " cannot control the FPU");
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+  throw std::logic_error("PPL::fpu_get_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int) {
+  throw std::logic_error("PPL::fpu_set_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int) {
+  throw std::logic_error("PPL::fpu_save_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline void
+fpu_reset_inexact() {
+  throw std::logic_error("PPL::fpu_reset_inexact():"
+                         " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int) {
+  throw std::logic_error("PPL::fpu_restore_rounding_direction():"
+                         " cannot control the FPU");
+}
+
+inline int
+fpu_check_inexact() {
+  throw std::logic_error("PPL::fpu_check_inexact():"
+                         " cannot control the FPU");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/fpu_defs.hh line 101. */
+
+#endif // !PPL_CAN_CONTROL_FPU
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+  /*! \hideinitializer
+    Round toward \f$-\infty\f$.
+  */
+  ROUND_DOWN = 0U,
+
+  /*! \hideinitializer
+    Round toward \f$+\infty\f$.
+  */
+  ROUND_UP = 1U,
+
+  /*! \hideinitializer
+    Rounding is delegated to lower level. Result info is evaluated lazily.
+  */
+  ROUND_IGNORE = 6U,
+  ROUND_NATIVE = ROUND_IGNORE,
+
+  /*! \hideinitializer
+    Rounding is not needed: client code must ensure that the operation
+    result is exact and representable in the destination type.
+    Result info is evaluated lazily.
+  */
+  ROUND_NOT_NEEDED = 7U,
+
+  ROUND_DIRECT = ROUND_UP,
+  ROUND_INVERSE = ROUND_DOWN,
+
+  ROUND_DIR_MASK = 7U,
+
+  /*! \hideinitializer
+    The client code is willing to pay an extra price to know the exact
+    relation between the exact result and the computed one.
+   */
+  ROUND_STRICT_RELATION = 8U,
+
+  ROUND_CHECK = ROUND_DIRECT | ROUND_STRICT_RELATION
+};
+
+//! \name Functions Inspecting and/or Combining Rounding_Dir Values
+//@{
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator&(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir operator|(Rounding_Dir x, Rounding_Dir y);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Returns the inverse rounding mode of \p dir,
+  <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+Rounding_Dir round_dir(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_down(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_up(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_ignore(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_needed(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_not_requested(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_direct(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_inverse(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+bool round_strict_relation(Rounding_Dir dir);
+
+/*! \ingroup PPL_CXX_interface */
+fpu_rounding_direction_type round_fpu_dir(Rounding_Dir dir);
+
+//@} // Functions Inspecting and/or Combining Rounding_Dir Values
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_inlines.hh line 1. */
+/* Inline functions operating on enum Rounding_Dir values.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator&(Rounding_Dir x, Rounding_Dir y) {
+  const unsigned res = static_cast<unsigned>(x) & static_cast<unsigned>(y);
+  return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+operator|(Rounding_Dir x, Rounding_Dir y) {
+  const unsigned res = static_cast<unsigned>(x) | static_cast<unsigned>(y);
+  return static_cast<Rounding_Dir>(res);
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+round_dir(Rounding_Dir dir) {
+  return dir & ROUND_DIR_MASK;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_down(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DOWN;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_up(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_UP;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_ignore(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_IGNORE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_needed(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_not_requested(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_IGNORE || round_dir(dir) == ROUND_NOT_NEEDED;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_direct(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_DIRECT;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_inverse(Rounding_Dir dir) {
+  return round_dir(dir) == ROUND_INVERSE;
+}
+
+/*! \ingroup PPL_CXX_interface */
+inline bool
+round_strict_relation(Rounding_Dir dir) {
+  return (dir & ROUND_STRICT_RELATION) == ROUND_STRICT_RELATION;
+}
+
+#if PPL_CAN_CONTROL_FPU
+
+/*! \ingroup PPL_CXX_interface */
+inline fpu_rounding_direction_type
+round_fpu_dir(Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+  case ROUND_DOWN:
+    return static_cast<fpu_rounding_direction_type>(PPL_FPU_DOWNWARD);
+  case ROUND_IGNORE: // Fall through.
+  default:
+    PPL_UNREACHABLE;
+    return static_cast<fpu_rounding_direction_type>(PPL_FPU_UPWARD);
+  }
+}
+
+#undef PPL_FPU_DOWNWARD
+#undef PPL_FPU_TONEAREST
+#undef PPL_FPU_TOWARDZERO
+#undef PPL_FPU_UPWARD
+
+#endif
+
+/*! \ingroup PPL_CXX_interface */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    return ROUND_DOWN | (dir & ROUND_STRICT_RELATION);
+  case ROUND_DOWN:
+    return ROUND_UP | (dir & ROUND_STRICT_RELATION);
+  case ROUND_IGNORE:
+    return dir;
+  default:
+    PPL_UNREACHABLE;
+    return dir;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Rounding_Dir_defs.hh line 122. */
+
+
+/* Automatically generated from PPL source file ../src/Numeric_Format_defs.hh line 1. */
+/* Numeric format.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Numeric_Format_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Float_defs.hh line 1. */
+/* IEC 559 floating point format related functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/globals_types.hh line 1. */
+
+
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! An unsigned integral type for representing space dimensions.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t dimension_type;
+
+//! An unsigned integral type for representing memory size in bytes.
+/*! \ingroup PPL_CXX_interface */
+typedef size_t memory_size_type;
+
+//! Kinds of degenerate abstract elements.
+/*! \ingroup PPL_CXX_interface */
+enum Degenerate_Element {
+  //! The universe element, i.e., the whole vector space.
+  UNIVERSE,
+  //! The empty element, i.e., the empty set.
+  EMPTY
+};
+
+//! Relation symbols.
+/*! \ingroup PPL_CXX_interface */
+// This must be kept in sync with Result
+enum Relation_Symbol {
+  //! \hideinitializer Equal to.
+  EQUAL = 1U,
+  //! \hideinitializer Less than.
+  LESS_THAN = 2U,
+  //! \hideinitializer Less than or equal to.
+  LESS_OR_EQUAL = LESS_THAN | EQUAL,
+  //! \hideinitializer Greater than.
+  GREATER_THAN = 4U,
+  //! \hideinitializer Greater than or equal to.
+  GREATER_OR_EQUAL = GREATER_THAN | EQUAL,
+  //! \hideinitializer Not equal to.
+  NOT_EQUAL = LESS_THAN | GREATER_THAN
+};
+
+//! Complexity pseudo-classes.
+/*! \ingroup PPL_CXX_interface */
+enum Complexity_Class {
+  //! Worst-case polynomial complexity.
+  POLYNOMIAL_COMPLEXITY,
+  //! Worst-case exponential complexity but typically polynomial behavior.
+  SIMPLEX_COMPLEXITY,
+  //! Any complexity.
+  ANY_COMPLEXITY
+};
+
+//! Possible optimization modes.
+/*! \ingroup PPL_CXX_interface */
+enum Optimization_Mode {
+  //! Minimization is requested.
+  MINIMIZATION,
+  //! Maximization is requested.
+  MAXIMIZATION
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Widths of bounded integer types.
+
+  See the section on
+  \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Width {
+  //! \hideinitializer 8 bits.
+  BITS_8 = 8,
+
+  //! \hideinitializer 16 bits.
+  BITS_16 = 16,
+
+  //! \hideinitializer 32 bits.
+  BITS_32 = 32,
+
+  //! \hideinitializer 64 bits.
+  BITS_64 = 64,
+
+  //! \hideinitializer 128 bits.
+  BITS_128 = 128
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Representation of bounded integer types.
+
+  See the section on
+  \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Representation {
+  //! Unsigned binary.
+  UNSIGNED,
+
+  /*! \brief
+    Signed binary where negative values are represented by the two's
+    complement of the absolute value.
+  */
+  SIGNED_2_COMPLEMENT
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Overflow behavior of bounded integer types.
+
+  See the section on
+  \ref Approximating_Bounded_Integers "approximating bounded integers".
+*/
+enum Bounded_Integer_Type_Overflow {
+  /*! \brief
+    On overflow, wrapping takes place.
+
+    This means that, for a \f$w\f$-bit bounded integer, the computation
+    happens modulo \f$2^w\f$.
+  */
+  OVERFLOW_WRAPS,
+
+  /*! \brief
+    On overflow, the result is undefined.
+
+    This simply means that the result of the operation resulting in an
+    overflow can take any value.
+
+    \note
+    Even though something more serious can happen in the system
+    being analyzed ---due to, e.g., C's undefined behavior---, here we
+    are only concerned with the results of arithmetic operations.
+    It is the responsibility of the analyzer to ensure that other
+    manifestations of undefined behavior are conservatively approximated.
+  */
+  OVERFLOW_UNDEFINED,
+
+  /*! \brief
+    Overflow is impossible.
+
+    This is for the analysis of languages where overflow is trapped
+    before it affects the state, for which, thus, any indication that
+    an overflow may have affected the state is necessarily due to
+    the imprecision of the analysis.
+  */
+  OVERFLOW_IMPOSSIBLE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Possible representations of coefficient sequences (i.e. linear expressions
+  and more complex objects containing linear expressions, e.g. Constraints,
+  Generators, etc.).
+*/
+enum Representation {
+  /*! \brief
+    Dense representation: the coefficient sequence is represented as a vector
+    of coefficients, including the zero coefficients.
+    If there are only a few nonzero coefficients, this representation is
+    faster and also uses a bit less memory.
+  */
+  DENSE,
+
+  /*! \brief
+    Sparse representation: only the nonzero coefficient are stored.
+    If there are many nonzero coefficients, this improves memory consumption
+    and run time (both because there is less data to process in O(n)
+    operations and because finding zeroes/nonzeroes is much faster since
+    zeroes are not stored at all, so any stored coefficient is nonzero).
+  */
+  SPARSE
+};
+
+/*! \ingroup PPL_CXX_interface \brief
+  Floating point formats known to the library.
+
+  The parameters of each format are defined by a specific struct
+  in file Float_defs.hh.  See the section on \ref floating_point
+  "Analysis of floating point computations" for more information.
+*/
+enum Floating_Point_Format {
+  //! IEEE 754 half precision, 16 bits (5 exponent, 10 mantissa).
+  IEEE754_HALF,
+
+  //! IEEE 754 single precision, 32 bits (8 exponent, 23 mantissa).
+  IEEE754_SINGLE,
+
+  //! IEEE 754 double precision, 64 bits (11 exponent, 52 mantissa).
+  IEEE754_DOUBLE,
+
+  //! IEEE 754 quad precision, 128 bits (15 exponent, 112 mantissa).
+  IEEE754_QUAD,
+
+  //! Intel double extended precision, 80 bits (15 exponent, 64 mantissa)
+  INTEL_DOUBLE_EXTENDED,
+
+  //! IBM single precision, 32 bits (7 exponent, 24 mantissa).
+  IBM_SINGLE,
+
+  //! IBM double precision, 64 bits (7 exponent, 56 mantissa).
+  IBM_DOUBLE
+};
+
+struct Weightwatch_Traits;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+/*
+  NOTE: Doxygen seems to ignore documentation blocks attached to
+  template class declarations that are not provided with a definition.
+  This justifies (here below) the explicit use of Doxygen command \class.
+*/
+
+/*! \brief The base class of all concrete expressions.
+  \class Parma_Polyhedra_Library::Concrete_Expression
+*/
+template <typename Target>
+class Concrete_Expression;
+
+/*! \brief A binary operator applied to two concrete expressions.
+  \class Parma_Polyhedra_Library::Binary_Operator
+*/
+template <typename Target>
+class Binary_Operator;
+
+/*! \brief A unary operator applied to one concrete expression.
+  \class Parma_Polyhedra_Library::Unary_Operator
+*/
+template <typename Target>
+class Unary_Operator;
+
+/*! \brief A cast operator converting one concrete expression to some type.
+  \class Parma_Polyhedra_Library::Cast_Operator
+*/
+template <typename Target>
+class Cast_Operator;
+
+/*! \brief An integer constant concrete expression.
+  \class Parma_Polyhedra_Library::Integer_Constant
+*/
+template <typename Target>
+class Integer_Constant;
+
+/*! \brief A floating-point constant concrete expression.
+  \class Parma_Polyhedra_Library::Floating_Point_Constant
+*/
+template <typename Target>
+class Floating_Point_Constant;
+
+/*! \brief A concrete expression representing a reference to some approximable.
+  \class Parma_Polyhedra_Library::Approximable_Reference
+*/
+template <typename Target>
+class Approximable_Reference;
+
+class Concrete_Expression_Type;
+
+/*! \brief
+  Encodes the kind of concrete expression.
+
+  The values should be defined by the particular instance
+  and uniquely identify one of: Binary_Operator, Unary_Operator,
+  Cast_Operator, Integer_Constant, Floating_Point_Constant, or
+  Approximable_Reference.  For example, the Binary_Operator kind
+  integer constant should be defined by an instance as the member
+  <CODE>Binary_Operator\<T\>::%KIND</CODE>.
+*/
+typedef int Concrete_Expression_Kind;
+
+/*! \brief
+  Encodes a binary operator of concrete expressions.
+
+  The values should be uniquely defined by the particular instance and
+  named: ADD, SUB, MUL, DIV, REM, BAND, BOR, BXOR, LSHIFT, RSHIFT.
+*/
+typedef int Concrete_Expression_BOP;
+
+/*! \brief
+  Encodes a unary operator of concrete expressions.
+
+  The values should be uniquely defined by the particular instance and
+  named: PLUS, MINUS, BNOT.
+*/
+typedef int Concrete_Expression_UOP;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variable;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Form_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+class Linear_Form;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_defs.hh line 34. */
+#include <set>
+#include <cmath>
+#include <map>
+#include <gmp.h>
+
+#ifdef NAN
+#define PPL_NAN NAN
+#else
+#define PPL_NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_half {
+  uint16_t word;
+  static const uint16_t SGN_MASK = 0x8000U;
+  static const uint16_t EXP_MASK = 0xfc00U;
+  static const uint16_t WRD_MAX = 0x7bffU;
+  static const uint16_t POS_INF = 0x7c00U;
+  static const uint16_t NEG_INF = 0xfc00U;
+  static const uint16_t POS_ZERO = 0x0000U;
+  static const uint16_t NEG_ZERO = 0x8000U;
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 5;
+  static const unsigned int MANTISSA_BITS = 10;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_HALF;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_single {
+  uint32_t word;
+  static const uint32_t SGN_MASK = 0x80000000U;
+  static const uint32_t EXP_MASK = 0x7f800000U;
+  static const uint32_t WRD_MAX = 0x7f7fffffU;
+  static const uint32_t POS_INF = 0x7f800000U;
+  static const uint32_t NEG_INF = 0xff800000U;
+  static const uint32_t POS_ZERO = 0x00000000U;
+  static const uint32_t NEG_ZERO = 0x80000000U;
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 8;
+  static const unsigned int MANTISSA_BITS = 23;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_SINGLE;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef WORDS_BIGENDIAN
+#ifndef PPL_WORDS_BIGENDIAN
+#define PPL_WORDS_BIGENDIAN
+#endif
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_double {
+#ifdef PPL_WORDS_BIGENDIAN
+  uint32_t msp;
+  uint32_t lsp;
+#else
+  uint32_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x80000000U;
+  static const uint32_t MSP_POS_INF = 0x7ff00000U;
+  static const uint32_t MSP_NEG_INF = 0xfff00000U;
+  static const uint32_t MSP_POS_ZERO = 0x00000000U;
+  static const uint32_t MSP_NEG_ZERO = 0x80000000U;
+  static const uint32_t LSP_INF = 0;
+  static const uint32_t LSP_ZERO = 0;
+  static const uint32_t MSP_MAX = 0x7fefffffU;
+  static const uint32_t LSP_MAX = 0xffffffffU;
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 11;
+  static const unsigned int MANTISSA_BITS = 52;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_DOUBLE;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_single {
+  uint32_t word;
+  static const uint32_t SGN_MASK = 0x80000000U;
+  static const uint32_t EXP_MASK = 0x7f000000U;
+  static const uint32_t WRD_MAX = 0x7fffffffU;
+  static const uint32_t POS_INF = 0x7f000000U;
+  static const uint32_t NEG_INF = 0xff000000U;
+  static const uint32_t POS_ZERO = 0x00000000U;
+  static const uint32_t NEG_ZERO = 0x80000000U;
+  static const unsigned int BASE = 16;
+  static const unsigned int EXPONENT_BITS = 7;
+  static const unsigned int MANTISSA_BITS = 24;
+  static const int EXPONENT_BIAS = 64;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IBM_SINGLE;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ibm_double {
+  static const unsigned int BASE = 16;
+  static const unsigned int EXPONENT_BITS = 7;
+  static const unsigned int MANTISSA_BITS = 56;
+  static const int EXPONENT_BIAS = 64;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_intel_double_extended {
+#ifdef PPL_WORDS_BIGENDIAN
+  uint32_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint32_t msp;
+#endif
+  static const uint32_t MSP_SGN_MASK = 0x00008000U;
+  static const uint32_t MSP_POS_INF = 0x00007fffU;
+  static const uint32_t MSP_NEG_INF = 0x0000ffffU;
+  static const uint32_t MSP_POS_ZERO = 0x00000000U;
+  static const uint32_t MSP_NEG_ZERO = 0x00008000U;
+  static const uint64_t LSP_INF = static_cast<uint64_t>(0x8000000000000000ULL);
+  static const uint64_t LSP_ZERO = 0;
+  static const uint32_t MSP_MAX = 0x00007ffeU;
+  static const uint64_t LSP_DMAX = static_cast<uint64_t>(0x7fffffffffffffffULL);
+  static const uint64_t LSP_NMAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 63;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format =
+                                     INTEL_DOUBLE_EXTENDED;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct float_ieee754_quad {
+#ifdef PPL_WORDS_BIGENDIAN
+  uint64_t msp;
+  uint64_t lsp;
+#else
+  uint64_t lsp;
+  uint64_t msp;
+#endif
+  static const uint64_t MSP_SGN_MASK = static_cast<uint64_t>(0x8000000000000000ULL);
+  static const uint64_t MSP_POS_INF = static_cast<uint64_t>(0x7fff000000000000ULL);
+  static const uint64_t MSP_NEG_INF = static_cast<uint64_t>(0xffff000000000000ULL);
+  static const uint64_t MSP_POS_ZERO = static_cast<uint64_t>(0x0000000000000000ULL);
+  static const uint64_t MSP_NEG_ZERO = static_cast<uint64_t>(0x8000000000000000ULL);
+  static const uint64_t LSP_INF = 0;
+  static const uint64_t LSP_ZERO = 0;
+  static const uint64_t MSP_MAX = static_cast<uint64_t>(0x7ffeffffffffffffULL);
+  static const uint64_t LSP_MAX = static_cast<uint64_t>(0xffffffffffffffffULL);
+  static const unsigned int BASE = 2;
+  static const unsigned int EXPONENT_BITS = 15;
+  static const unsigned int MANTISSA_BITS = 112;
+  static const int EXPONENT_MAX = (1 << (EXPONENT_BITS - 1)) - 1;
+  static const int EXPONENT_BIAS = EXPONENT_MAX;
+  static const int EXPONENT_MIN = -EXPONENT_MAX + 1;
+  static const int EXPONENT_MIN_DENORM = EXPONENT_MIN
+                                        - static_cast<int>(MANTISSA_BITS);
+  static const Floating_Point_Format floating_point_format = IEEE754_QUAD;
+  int inf_sign() const;
+  bool is_nan() const;
+  int zero_sign() const;
+  bool sign_bit() const;
+  void negate();
+  void dec();
+  void inc();
+  void set_max(bool negative);
+  void build(bool negative, mpz_t mantissa, int exponent);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Float : public False { };
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> : public True {
+public:
+#if PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+  typedef float_ieee754_half Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+  typedef float_ieee754_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+  typedef float_ieee754_double Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+  typedef float_ibm_single Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+  typedef float_ieee754_quad Binary;
+#elif PPL_CXX_FLOAT_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+  typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_FLOAT_BINARY_FORMAT"
+#endif
+  union {
+    float number;
+    Binary binary;
+  } u;
+  Float();
+  Float(float v);
+  float value();
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> : public True {
+public:
+#if PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+  typedef float_ieee754_half Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+  typedef float_ieee754_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+  typedef float_ieee754_double Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+  typedef float_ibm_single Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+  typedef float_ieee754_quad Binary;
+#elif PPL_CXX_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+  typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_DOUBLE_BINARY_FORMAT"
+#endif
+  union {
+    double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(double v);
+  double value();
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> : public True {
+public:
+#if PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_HALF
+  typedef float_ieee754_half Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_SINGLE
+  typedef float_ieee754_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_DOUBLE
+  typedef float_ieee754_double Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IBM_SINGLE
+  typedef float_ibm_single Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_IEEE754_QUAD
+  typedef float_ieee754_quad Binary;
+#elif PPL_CXX_LONG_DOUBLE_BINARY_FORMAT == PPL_FLOAT_INTEL_DOUBLE_EXTENDED
+  typedef float_intel_double_extended Binary;
+#else
+#error "Invalid value for PPL_CXX_LONG_DOUBLE_BINARY_FORMAT"
+#endif
+  union {
+    long double number;
+    Binary binary;
+  } u;
+  Float();
+  Float(long double v);
+  long double value();
+};
+#endif
+
+// FIXME: is this the right place for this function?
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \p v is nonzero, returns the position of the most significant bit
+  in \p a.
+
+  The behavior is undefined if \p v is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+unsigned int msb_position(unsigned long long v);
+
+/*! \brief
+  An abstract class to be implemented by an external analyzer such
+  as ECLAIR in order to provide to the PPL the necessary information
+  for performing the analysis of floating point computations.
+
+  \par Template type parameters
+
+  - The class template parameter \p Target specifies the implementation
+  of Concrete_Expression to be used.
+  - The class template parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain. The interval bounds
+  should have a floating point type.
+*/
+template <typename Target, typename FP_Interval_Type>
+class FP_Oracle {
+public:
+  /*
+    FIXME: the const qualifiers on expressions may raise CLANG
+    compatibility issues. It may be necessary to omit them.
+  */
+
+  /*! \brief
+    Asks the external analyzer for an interval that correctly
+    approximates the floating point entity referenced by \p dim.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to find a correct
+    approximation, <CODE>false</CODE> otherwise.
+  */
+  virtual bool get_interval(dimension_type dim, FP_Interval_Type& result) const
+    = 0;
+
+  /*! \brief
+    Asks the external analyzer for an interval that correctly
+    approximates the value of floating point constant \p expr.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to find a correct
+    approximation, <CODE>false</CODE> otherwise.
+  */
+  virtual bool get_fp_constant_value(
+               const Floating_Point_Constant<Target>& expr,
+                     FP_Interval_Type& result) const = 0;
+
+  /*! \brief
+    Asks the external analyzer for an interval that correctly approximates
+    the value of \p expr, which must be of integer type.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to find a correct
+    approximation, <CODE>false</CODE> otherwise.
+  */
+  virtual bool get_integer_expr_value(const Concrete_Expression<Target>& expr,
+                                      FP_Interval_Type& result) const = 0;
+
+  /*! \brief
+    Asks the external analyzer for the possible space dimensions that
+    are associated to the approximable reference \p expr.
+    Result is stored into \p result.
+
+    \return <CODE>true</CODE> if the analyzer was able to return
+    the (possibly empty!) set, <CODE>false</CODE> otherwise.
+
+    The resulting set MUST NOT contain <CODE>not_a_dimension()</CODE>.
+  */
+  virtual bool get_associated_dimensions(
+          const Approximable_Reference<Target>& expr,
+          std::set<dimension_type>& result) const = 0;
+
+};
+
+/* FIXME: some of the following  documentation should probably be
+   under PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS */
+
+/*! \brief \relates Float
+  Returns <CODE>true</CODE> if and only if there is some floating point
+  number that is representable by \p f2 but not by \p f1.
+*/
+bool is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2);
+
+/*! \brief \relates Float
+  Computes the absolute error of floating point computations.
+
+  \par Template type parameters
+
+  - The class template parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain. The interval bounds
+  should have a floating point type.
+
+  \param analyzed_format The floating point format used by the analyzed
+  program.
+
+  \return The interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+  smallest non-zero positive number in the less precise floating point
+  format between the analyzer format and the analyzed format.
+*/
+template <typename FP_Interval_Type>
+const FP_Interval_Type&
+compute_absolute_error(Floating_Point_Format analyzed_format);
+
+/*! \brief \relates Linear_Form
+  Discards all linear forms containing variable \p var from the
+  linear form abstract store \p lf_store.
+*/
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+                             Linear_Form<FP_Interval_Type> >& lf_store,
+                    Variable var);
+
+/*! \brief \relates Linear_Form
+  Assigns the linear form \p lf to \p var in the linear form abstract
+  store \p lf_store, then discards all occurrences of \p var from it.
+*/
+template <typename FP_Interval_Type>
+void
+affine_form_image(std::map<dimension_type,
+                           Linear_Form<FP_Interval_Type> >& lf_store,
+                  Variable var,
+                  const Linear_Form<FP_Interval_Type>& lf);
+
+/*! \brief \relates Linear_Form
+  Discards from \p ls1 all linear forms but those that are associated
+  to the same variable in \p ls2.
+*/
+template <typename FP_Interval_Type>
+void
+upper_bound_assign(std::map<dimension_type,
+                            Linear_Form<FP_Interval_Type> >& ls1,
+                   const std::map<dimension_type,
+                                  Linear_Form<FP_Interval_Type> >& ls2);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_inlines.hh line 1. */
+/* IEC 559 floating point format related functions.
+*/
+
+
+#include <climits>
+/* Automatically generated from PPL source file ../src/Variable_defs.hh line 1. */
+/* Variable class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Init;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_defs.hh line 30. */
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variable */
+std::ostream&
+operator<<(std::ostream& s, const Variable v);
+
+} // namespace IO_Operators
+
+//! Defines a total ordering on variables.
+/*! \relates Variable */
+bool less(Variable v, Variable w);
+
+/*! \relates Variable */
+void
+swap(Variable& x, Variable& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A dimension of the vector space.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Variable represents a dimension of the space,
+  that is one of the Cartesian axes.
+  Variables are used as basic blocks in order to build
+  more complex linear expressions.
+  Each variable is identified by a non-negative integer,
+  representing the index of the corresponding Cartesian axis
+  (the first axis has index 0).
+  The space dimension of a variable is the dimension of the vector space
+  made by all the Cartesian axes having an index less than or equal to
+  that of the considered variable; thus, if a variable has index \f$i\f$,
+  its space dimension is \f$i+1\f$.
+
+  Note that the ``meaning'' of an object of the class Variable
+  is completely specified by the integer index provided to its
+  constructor:
+  be careful not to be mislead by C++ language variable names.
+  For instance, in the following example the linear expressions
+  <CODE>e1</CODE> and <CODE>e2</CODE> are equivalent,
+  since the two variables <CODE>x</CODE> and <CODE>z</CODE> denote
+  the same Cartesian axis.
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(0);
+  Linear_Expression e1 = x + y;
+  Linear_Expression e2 = y + z;
+  \endcode
+
+*/
+class Parma_Polyhedra_Library::Variable {
+
+public:
+  //! Builds the variable corresponding to the Cartesian axis of index \p i.
+  /*!
+    \exception std::length_error
+    Thrown if <CODE>i+1</CODE> exceeds
+    <CODE>Variable::max_space_dimension()</CODE>.
+  */
+  explicit Variable(dimension_type i);
+
+  //! Returns the index of the Cartesian axis associated to the variable.
+  dimension_type id() const;
+
+  //! Returns the maximum space dimension a Variable can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  /*!
+    The returned value is <CODE>id()+1</CODE>.
+  */
+  dimension_type space_dimension() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Type of output functions.
+  typedef void output_function_type(std::ostream& s, const Variable v);
+
+  //! The default output function.
+  static void default_output_function(std::ostream& s, const Variable v);
+
+  //! Sets the output function to be used for printing Variable objects.
+  static void set_output_function(output_function_type* p);
+
+  //! Returns the pointer to the current output function.
+  static output_function_type* get_output_function();
+
+  //! Binary predicate defining the total ordering on variables.
+  /*! \ingroup PPL_CXX_interface */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(Variable x, Variable y) const;
+  };
+
+  //! Swaps *this and v.
+  void m_swap(Variable& v);
+
+private:
+  //! The index of the Cartesian axis.
+  dimension_type varid;
+
+  // The initialization class needs to set the default output function.
+  friend class Init;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+                                                    const Variable v);
+
+  //! Pointer to the current output function.
+  static output_function_type* current_output_function;
+
+};
+
+/* Automatically generated from PPL source file ../src/Variable_inlines.hh line 1. */
+/* Variable class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 1. */
+/* Declarations of global objects.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Integer.hh line 1. */
+/* C integers info.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Integer.hh line 28. */
+#include <climits>
+
+// C99 defines LLONG_MIN, LLONG_MAX and ULLONG_MAX, but this part of
+// C99 is not yet included into the C++ standard.
+// GCC defines LONG_LONG_MIN, LONG_LONG_MAX and ULONG_LONG_MAX.
+// Some compilers (such as Comeau C++ up to and including version 4.3.3)
+// define nothing.  In this last case we make a reasonable guess.
+#ifndef LLONG_MIN
+#if defined(LONG_LONG_MIN)
+#define LLONG_MIN LONG_LONG_MIN
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MIN 0x8000000000000000LL
+#endif
+#endif
+
+#ifndef LLONG_MAX
+#if defined(LONG_LONG_MAX)
+#define LLONG_MAX LONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define LLONG_MAX 0x7fffffffffffffffLL
+#endif
+#endif
+
+#ifndef ULLONG_MAX
+#if defined(ULONG_LONG_MAX)
+#define ULLONG_MAX ULONG_LONG_MAX
+#elif PPL_SIZEOF_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+struct C_Integer : public False { };
+
+template <>
+struct C_Integer<char> : public True {
+  enum const_bool_value {
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+    is_signed = true
+#else
+    is_signed = false
+#endif
+  };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+  typedef unsigned char other_type;
+#else
+  typedef signed char other_type;
+#endif
+  static const char min = static_cast<char>(CHAR_MIN);
+  static const char max = static_cast<char>(CHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed char> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef unsigned char other_type;
+  static const signed char min = static_cast<signed char>(SCHAR_MIN);
+  static const signed char max = static_cast<signed char>(SCHAR_MAX);
+};
+
+template <>
+struct C_Integer<signed short> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef unsigned short other_type;
+  static const signed short min = static_cast<signed short>(SHRT_MIN);
+  static const signed short max = static_cast<signed short>(SHRT_MAX);
+};
+
+template <>
+struct C_Integer<signed int> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef unsigned int other_type;
+  static const signed int min = INT_MIN;
+  static const signed int max = INT_MAX;
+};
+
+template <>
+struct C_Integer<signed long> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef unsigned long other_type;
+  static const signed long min = LONG_MIN;
+  static const signed long max = LONG_MAX;
+};
+
+template <>
+struct C_Integer<signed long long> : public True {
+  enum const_bool_value {
+    is_signed = true
+  };
+  typedef signed long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef unsigned long long other_type;
+  static const signed long long min = LLONG_MIN;
+  static const signed long long max = LLONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned char> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef void smaller_type;
+  typedef void smaller_signed_type;
+  typedef void smaller_unsigned_type;
+  typedef signed char other_type;
+  static const unsigned char min = static_cast<unsigned char>(0U);
+  static const unsigned char max = static_cast<unsigned char>(UCHAR_MAX);
+};
+
+template <>
+struct C_Integer<unsigned short> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned char smaller_type;
+  typedef signed char smaller_signed_type;
+  typedef unsigned char smaller_unsigned_type;
+  typedef signed short other_type;
+  static const unsigned short min = static_cast<unsigned short>(0U);
+  static const unsigned short max = static_cast<unsigned short>(USHRT_MAX);
+};
+
+template <>
+struct C_Integer<unsigned int> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned short smaller_type;
+  typedef signed short smaller_signed_type;
+  typedef unsigned short smaller_unsigned_type;
+  typedef signed int other_type;
+  static const unsigned int min = 0U;
+  static const unsigned int max = UINT_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned int smaller_type;
+  typedef signed int smaller_signed_type;
+  typedef unsigned int smaller_unsigned_type;
+  typedef signed long other_type;
+  static const unsigned long min = 0UL;
+  static const unsigned long max = ULONG_MAX;
+};
+
+template <>
+struct C_Integer<unsigned long long> : public True {
+  enum const_bool_value {
+    is_signed = false
+  };
+  typedef unsigned long smaller_type;
+  typedef signed long smaller_signed_type;
+  typedef unsigned long smaller_unsigned_type;
+  typedef signed long long other_type;
+  static const unsigned long long min = 0ULL;
+  static const unsigned long long max = ULLONG_MAX;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 32. */
+#include <exception>
+#include <gmpxx.h>
+
+#ifndef PPL_PROFILE_ADD_WEIGHT
+#define PPL_PROFILE_ADD_WEIGHT 0
+#endif
+
+#if defined(NDEBUG) && PPL_PROFILE_ADD_WEIGHT
+/* Automatically generated from PPL source file ../src/Weight_Profiler_defs.hh line 1. */
+/* Weight_Profiler class declaration.
+*/
+
+#ifndef Weight_Profiler_defs_hh
+#define Weight_Profiler_defs_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+class Weight_Profiler {
+private:
+  enum { DISCARDED = 0, VALID = 1 };
+
+public:
+  Weight_Profiler(const char* file, int line,
+                  Weightwatch_Traits::Delta delta,
+                  double min_threshold = 0, double max_threshold = 0)
+    : file(file), line(line), delta(delta),
+      min_threshold(min_threshold), max_threshold(max_threshold) {
+    for (int i = 0; i < 2; ++i) {
+      stat[i].samples = 0;
+      stat[i].count = 0;
+      stat[i].sum = 0;
+      stat[i].squares_sum = 0;
+      stat[i].min = 0;
+      stat[i].max = 0;
+    }
+  }
+
+  ~Weight_Profiler() {
+    output_stats();
+  }
+
+  void output_stats();
+
+  static void begin() {
+#ifndef NDEBUG
+    int r = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+    assert(r >= 0);
+#else
+    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &stamp);
+#endif
+  }
+
+  void end(unsigned int factor = 1) {
+    Weightwatch_Traits::weight
+      += (Weightwatch_Traits::Threshold) delta * factor;
+    struct timespec start = stamp;
+    begin();
+    double elapsed;
+    if (stamp.tv_nsec >= start.tv_nsec) {
+      elapsed = (stamp.tv_nsec - start.tv_nsec)
+        + (stamp.tv_sec - start.tv_sec) * 1e9;
+    }
+    else {
+      elapsed = (1000000000 - start.tv_nsec + stamp.tv_nsec )
+        + (stamp.tv_sec - start.tv_sec - 1) * 1e9;
+    }
+    elapsed -= adjustment;
+    double elapsed1 = elapsed / factor;
+    int i = (elapsed1 < min_threshold
+             || (max_threshold > 0 && elapsed1 > max_threshold))
+      ? DISCARDED
+      : VALID;
+    ++stat[i].samples;
+    if (stat[i].count == 0)
+      stat[i].min = stat[i].max = elapsed1;
+    else if (stat[i].min > elapsed1)
+      stat[i].min = elapsed1;
+    else if (stat[i].max < elapsed1)
+      stat[i].max = elapsed1;
+    stat[i].sum += elapsed;
+    stat[i].squares_sum += elapsed * elapsed1;
+    stat[i].count += factor;
+  }
+
+  static double tune_adjustment();
+
+ private:
+  //! File of this profiling point.
+  const char *file;
+
+  //! Line of this profiling point.
+  int line;
+
+  //! Computational weight to be added at each iteration.
+  Weightwatch_Traits::Delta delta;
+
+  //! Times less than this value are discarded.
+  double min_threshold;
+
+  //! Times greater than this value are discarded.
+  double max_threshold;
+
+  //! Statistical data for samples (both DISCARDED and VALID)
+  struct {
+    //! Number of collected samples.
+    unsigned int samples;
+
+    /*! \brief
+      Number of collected iterations.
+
+      \note
+      Multiple iterations are possibly collected for each sample.
+    */
+    unsigned int count;
+
+    //! Sum of the measured times.
+    double sum;
+
+    //! Sum of the squares of the measured times (to compute variance).
+    double squares_sum;
+
+    //! Minimum measured time.
+    double min;
+
+    //! Maximum measured time.
+    double max;
+  } stat[2];
+
+  //! Holds the time corresponding to last time begin() was called.
+  static struct timespec stamp;
+
+  /*! \brief
+    Time quantity used to adjust the elapsed times so as not to take
+    into account the time spent by the measurement infrastructure.
+  */
+  static double adjustment;
+};
+
+}
+
+#endif // Weight_Profiler_defs_hh
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 41. */
+#endif
+
+#if defined(NDEBUG)
+
+#if PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN() Weight_Profiler::begin()
+
+#define WEIGHT_ADD(delta)                                     \
+  do {                                                        \
+    static Weight_Profiler wp__(__FILE__, __LINE__, delta);   \
+    wp__.end();                                               \
+  } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor)                                   \
+  do {                                                                  \
+    static Weight_Profiler wp__(__FILE__, __LINE__, delta);             \
+    wp__.end(factor);                                                   \
+  } while (false)
+
+#else // !PPL_PROFILE_ADD_WEIGHT
+
+#define WEIGHT_BEGIN()                          \
+  do {                                          \
+  } while (false)
+
+#define WEIGHT_ADD(delta)                       \
+  do {                                          \
+    Weightwatch_Traits::weight += (delta);      \
+  } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor)                   \
+  do {                                                  \
+    Weightwatch_Traits::weight += (delta)*(factor);     \
+  } while (false)
+
+#endif // !PPL_PROFILE_ADD_WEIGHT
+
+#else // !defined(NDEBUG)
+
+#define WEIGHT_BEGIN()
+
+#define WEIGHT_ADD(delta)                       \
+  do {                                          \
+    if (!In_Assert::asserting())                \
+      Weightwatch_Traits::weight += delta;      \
+  } while (false)
+
+#define WEIGHT_ADD_MUL(delta, factor)                   \
+  do {                                                  \
+    if (!In_Assert::asserting())                        \
+      Weightwatch_Traits::weight += delta * factor;     \
+  } while (false)
+
+#endif // !defined(NDEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns a value that does not designate a valid dimension.
+dimension_type
+not_a_dimension();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the hash code for space dimension \p dim.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int32_t
+hash_code_from_dimension(dimension_type dim);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Make sure swap() is specialized when needed.
+
+  This will cause a compile-time error whenever a specialization for \p T
+  is beneficial but missing.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Slow_Copy<T>::value, void>::type
+swap(T&, T&) {
+  PPL_COMPILE_TIME_CHECK(!Slow_Copy<T>::value, "missing swap specialization");
+}
+
+/*! \brief
+  Declare a local variable named \p id, of type Coefficient, and containing
+  an unknown initial value.
+
+  Use of this macro to declare temporaries of type Coefficient results
+  in decreased memory allocation overhead and in better locality.
+*/
+#define PPL_DIRTY_TEMP_COEFFICIENT(id) \
+PPL_DIRTY_TEMP(Parma_Polyhedra_Library::Coefficient, id)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Speculative allocation function.
+/*!
+  \return
+  The actual capacity to be allocated.
+
+  \param requested_size
+  The number of elements we need.
+
+  \param maximum_size
+  The maximum number of elements to be allocated. It is assumed
+  to be no less than \p requested_size.
+
+  Computes a capacity given a requested size.
+  Allows for speculative allocation aimed at reducing the number of
+  reallocations enough to guarantee amortized constant insertion time
+  for our vector-like data structures. In all cases, the speculative
+  allocation will not exceed \p maximum_size.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+compute_capacity(dimension_type requested_size,
+                 dimension_type maximum_size);
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Traits class for the deterministic timeout mechanism.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Weightwatch_Traits {
+  //! The type used to specify thresholds for computational weight.
+  typedef unsigned long long Threshold;
+
+  //! The type used to specify increments of computational weight.
+  typedef unsigned long long Delta;
+
+  //! Returns the current computational weight.
+  static const Threshold& get();
+
+  //! Compares the two weights \p a and \p b.
+  static bool less_than(const Threshold& a, const Threshold& b);
+
+  //! Computes a \c Delta value from \p unscaled and \p scale.
+  /*!
+    \return
+    \f$u \cdot 2^s\f$, where \f$u\f$ is the value of \p unscaled and
+    \f$s\f$ is the value of \p scale.
+
+    \param unscaled
+    The value of delta before scaling.
+
+    \param scale
+    The scaling to be applied to \p unscaled.
+  */
+  static Delta compute_delta(unsigned long unscaled, unsigned scale);
+
+  //! Sets \p threshold to be \p delta units bigger than the current weight.
+  static void from_delta(Threshold& threshold, const Delta& delta);
+
+  //! The current computational weight.
+  static Threshold weight;
+
+  /*! \brief
+    A pointer to the function that has to be called when checking
+    the reaching of thresholds.
+
+    The pointer can be null if no thresholds are set.
+  */
+  static void (*check_function)(void);
+};
+
+
+#ifndef NDEBUG
+
+class In_Assert {
+private:
+  //! Non zero during evaluation of PPL_ASSERT expression.
+  static unsigned int count;
+public:
+  In_Assert() {
+    ++count;
+  }
+  ~In_Assert() {
+    --count;
+  }
+  static bool asserting() {
+    return count != 0;
+  }
+};
+
+#endif
+
+
+//! User objects the PPL can throw.
+/*! \ingroup PPL_CXX_interface
+  This abstract base class should be instantiated by those users
+  willing to provide a polynomial upper bound to the time spent
+  by any invocation of a library operator.
+*/
+class Throwable {
+public:
+  //! Throws the user defined exception object.
+  virtual void throw_me() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Throwable();
+};
+
+/*! \brief
+  A pointer to an exception object.
+
+  \ingroup PPL_CXX_interface
+  This pointer, which is initialized to zero, is repeatedly checked
+  along any super-linear (i.e., computationally expensive) computation
+  path in the library.
+  When it is found nonzero the exception it points to is thrown.
+  In other words, making this pointer point to an exception (and
+  leaving it in this state) ensures that the library will return
+  control to the client application, possibly by throwing the given
+  exception, within a time that is a linear function of the size
+  of the representation of the biggest object (powerset of polyhedra,
+  polyhedron, system of constraints or generators) on which the library
+  is operating upon.
+
+  \note
+  The only sensible way to assign to this pointer is from within a
+  signal handler or from a parallel thread.  For this reason, the
+  library, apart from ensuring that the pointer is initially set to zero,
+  never assigns to it.  In particular, it does not zero it again when
+  the exception is thrown: it is the client's responsibility to do so.
+*/
+extern const Throwable* volatile abandon_expensive_computations;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the pointer abandon_expensive_computations is found
+  to be nonzero, the exception it points to is thrown.
+
+  \relates Throwable
+*/
+#endif
+void
+maybe_abandon();
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+  Tag class to distinguish those constructors that recycle the data
+  structures of their arguments, instead of taking a copy.
+*/
+struct Recycle_Input {
+};
+
+// Turn s into a string: PPL_STR(x + y) => "x + y".
+#define PPL_STR(s) #s
+// Turn the expansion of s into a string: PPL_XSTR(x) => "x expanded".
+#define PPL_XSTR(s) PPL_STR(s)
+
+#define PPL_OUTPUT_DECLARATIONS                                         \
+  /*! \brief Writes to \c std::cerr an ASCII representation of \p *this. */ \
+  void ascii_dump() const;                                              \
+  /*! \brief Writes to \p s an ASCII representation of \p *this. */     \
+  void ascii_dump(std::ostream& s) const;                               \
+  /*! \brief Prints \p *this to \c std::cerr using \c operator<<. */    \
+  void print() const;
+
+#define PPL_OUTPUT_DEFINITIONS(class_name)                      \
+  void                                                          \
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {     \
+    ascii_dump(std::cerr);                                      \
+  }                                                             \
+                                                                \
+  void                                                          \
+  Parma_Polyhedra_Library::class_name::print() const {          \
+    using IO_Operators::operator<<;                             \
+    std::cerr << *this;                                         \
+  }
+
+#define PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(class_name)                   \
+  void                                                                  \
+  Parma_Polyhedra_Library::class_name::ascii_dump() const {             \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  void                                                                  \
+  Parma_Polyhedra_Library::class_name::print() const {                  \
+    std::cerr << "No user level output operator defined "               \
+              << "for class " PPL_XSTR(class_name) << "." << std::endl; \
+  }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS(type_symbol, class_prefix)      \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::ascii_dump() const {                             \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::print() const {                                  \
+    using IO_Operators::operator<<;                                     \
+    std::cerr << *this;                                                 \
+  }
+
+#define PPL_OUTPUT_2_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,           \
+                                                type_symbol2,           \
+                                                class_prefix)           \
+  template <typename type_symbol1, typename type_symbol2>               \
+  void                                                                  \
+  PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)>         \
+  ::ascii_dump() const {                                                \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  template <typename type_symbol1, typename type_symbol2>               \
+  void                                                                  \
+  PPL_U(class_prefix)<PPL_U(type_symbol1), PPL_U(type_symbol2)>         \
+  ::print() const {                                                     \
+    using IO_Operators::operator<<;                                     \
+    std::cerr << *this;                                                 \
+  }
+
+#define PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(type_symbol1,           \
+                                                type_symbol2,           \
+                                                type_symbol3,           \
+                                                class_prefix)           \
+  template <typename type_symbol1, typename type_symbol2,               \
+            typename type_symbol3>                                      \
+  void                                                                  \
+  PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2,                \
+                      PPL_U(type_symbol3)>::ascii_dump()                \
+    const {                                                             \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+    template <typename type_symbol1, typename type_symbol2,             \
+              typename type_symbol3>                                    \
+    void                                                                \
+    PPL_U(class_prefix)<PPL_U(type_symbol1), type_symbol2,              \
+                        PPL_U(type_symbol3)>::print()                   \
+      const {                                                           \
+      using IO_Operators::operator<<;                                   \
+      std::cerr << *this;                                               \
+    }
+
+#define PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(type_symbol, class_prefix) \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::ascii_dump() const {                                    \
+    ascii_dump(std::cerr);                                              \
+  }                                                                     \
+                                                                        \
+  template <typename type_symbol>                                       \
+  void                                                                  \
+  class_prefix::print() const {                                         \
+    std::cerr << "No user level output operator defined "               \
+              << "for " PPL_XSTR(class_prefix) << "." << std::endl;     \
+  }
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if \p c is any kind of space character.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_space(char c);
+
+template <typename T, long long v, typename Enable = void>
+struct Fit : public False {
+};
+
+template <typename T, long long v>
+struct Fit<T, v, typename Enable_If<C_Integer<T>::value>::type>  {
+  enum {
+    value = (v >= static_cast<long long>(C_Integer<T>::min)
+             && v <= static_cast<long long>(C_Integer<T>::max))
+  };
+};
+
+template <typename T, T v>
+struct TConstant {
+  static const T value = v;
+};
+
+
+template <typename T, T v>
+const T TConstant<T, v>::value;
+
+template <typename T, long long v, bool prefer_signed = true,
+          typename Enable = void>
+struct Constant_ : public TConstant<T, v> {
+};
+
+//! \cond
+// Keep Doxygen off until it learns how to deal properly with `||'.
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+                 typename Enable_If<(Fit<typename C_Integer<T>::smaller_signed_type, v>::value
+                                     && (prefer_signed
+                                         || !Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_signed_type, v, prefer_signed> {
+};
+
+template <typename T, long long v, bool prefer_signed>
+struct Constant_<T, v, prefer_signed,
+                 typename Enable_If<(Fit<typename C_Integer<T>::smaller_unsigned_type, v>::value
+                                     && (!prefer_signed
+                                         || !Fit<typename C_Integer<T>::smaller_signed_type, v>::value))>::type>
+  : public Constant_<typename C_Integer<T>::smaller_unsigned_type, v, prefer_signed> {
+};
+
+//! \endcond
+
+template <long long v, bool prefer_signed = true>
+struct Constant : public Constant_<long long, v, prefer_signed> {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Memory Size Inspection Functions
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the total size in bytes of the memory
+  occupied by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  For native types, returns the size in bytes of the memory managed
+  by the type of the (unused) parameter, i.e., 0.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpz_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the total size in bytes of the memory occupied by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+total_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the size in bytes of the memory managed by \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+memory_size_type
+external_memory_in_bytes(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@} // Memory Size Inspection Functions
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+
+template <typename T, typename Enable = void>
+struct Has_OK : public False { };
+
+template <typename T>
+struct Has_OK<T, typename Enable_If_Is<bool (T::*)() const, &T::OK>::type>
+  : public True {
+};
+
+template <typename T>
+inline typename Enable_If<Has_OK<T>::value, bool>::type
+f_OK(const T& to) {
+  return to.OK();
+}
+
+#define FOK(T) inline bool f_OK(const T&) { return true; }
+
+FOK(char)
+FOK(signed char)
+FOK(unsigned char)
+FOK(signed short)
+FOK(unsigned short)
+FOK(signed int)
+FOK(unsigned int)
+FOK(signed long)
+FOK(unsigned long)
+FOK(signed long long)
+FOK(unsigned long long)
+FOK(float)
+FOK(double)
+FOK(long double)
+FOK(mpz_class)
+FOK(mpq_class)
+
+void ascii_dump(std::ostream& s, Representation r);
+bool ascii_load(std::istream& s, Representation& r);
+
+dimension_type
+check_space_dimension_overflow(dimension_type dim,
+                               dimension_type max,
+                               const char* domain,
+                               const char* method,
+                               const char* reason);
+
+template <typename RA_Container>
+typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n);
+
+template <typename RA_Container>
+typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n);
+
+dimension_type
+least_significant_one_mask(dimension_type i);
+
+} // namespace Parma_Polyhedra_Library
+
+// By default, use sparse matrices both for MIP_Problem and PIP_Problem.
+#ifndef PPL_USE_SPARSE_MATRIX
+#define PPL_USE_SPARSE_MATRIX 1
+#endif
+
+/* Automatically generated from PPL source file ../src/globals_inlines.hh line 1. */
+/* Implementation of global objects: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/globals_inlines.hh line 28. */
+#include <limits>
+#include <cassert>
+#include <istream>
+#include <ostream>
+#include <cctype>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+  return std::numeric_limits<dimension_type>::max();
+}
+
+inline int32_t
+hash_code_from_dimension(dimension_type dim) {
+  const dimension_type divisor = 1U << (32 - 1);
+  dim = dim % divisor;
+  return static_cast<int32_t>(dim);
+}
+
+inline const Weightwatch_Traits::Threshold&
+Weightwatch_Traits::get() {
+  return weight;
+}
+
+inline bool
+Weightwatch_Traits::less_than(const Threshold& a, const Threshold& b) {
+  return b - a < (1ULL << (sizeof_to_bits(sizeof(Threshold)) - 1));
+}
+
+inline Weightwatch_Traits::Delta
+Weightwatch_Traits::compute_delta(unsigned long unscaled, unsigned scale) {
+  if ((std::numeric_limits<Delta>::max() >> scale) < unscaled)
+    throw std::invalid_argument("PPL::Weightwatch_Traits::"
+                                "compute_delta(u, s):\n"
+                                "values of u and s cause wrap around.");
+  return static_cast<Delta>(unscaled) << scale;
+}
+
+inline void
+Weightwatch_Traits::from_delta(Threshold& threshold, const Delta& delta) {
+  threshold = weight + delta;
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+#ifndef NDEBUG
+  if (In_Assert::asserting())
+    return;
+#endif
+  if (Weightwatch_Traits::check_function != 0)
+    Weightwatch_Traits::check_function();
+  if (const Throwable* const p = abandon_expensive_computations)
+    p->throw_me();
+}
+
+inline dimension_type
+compute_capacity(const dimension_type requested_size,
+                 const dimension_type maximum_size) {
+  assert(requested_size <= maximum_size);
+  // Speculation factor 2.
+  return (requested_size < maximum_size/2)
+    ? (2*(requested_size + 1))
+    : maximum_size;
+  // Speculation factor 1.5.
+  // return (maximum_size - requested_size > requested_size/2)
+  //   ? requested_size + requested_size/2 + 1
+  //   : maximum_size;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+external_memory_in_bytes(const T&) {
+  return 0;
+}
+
+template <typename T>
+inline typename
+Enable_If<Is_Native<T>::value, memory_size_type>::type
+total_memory_in_bytes(const T&) {
+  return sizeof(T);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+  return static_cast<memory_size_type>(x.get_mpz_t()[0]._mp_alloc)
+    * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpz_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline memory_size_type
+external_memory_in_bytes(const mpq_class& x) {
+  return external_memory_in_bytes(x.get_num())
+    + external_memory_in_bytes(x.get_den());
+}
+
+inline memory_size_type
+total_memory_in_bytes(const mpq_class& x) {
+  return sizeof(x) + external_memory_in_bytes(x);
+}
+
+inline void
+ascii_dump(std::ostream& s, Representation r) {
+  if (r == DENSE)
+    s << "DENSE";
+  else
+    s << "SPARSE";
+}
+
+inline bool
+ascii_load(std::istream& is, Representation& r) {
+  std::string s;
+  if (!(is >> s))
+    return false;
+
+  if (s == "DENSE")  {
+    r = DENSE;
+    return true;
+  }
+  if (s == "SPARSE")  {
+    r = SPARSE;
+    return true;
+  }
+  return false;
+}
+
+inline bool
+is_space(char c) {
+  return isspace(c) != 0;
+}
+
+template <typename RA_Container>
+inline typename RA_Container::iterator
+nth_iter(RA_Container& cont, dimension_type n) {
+  typedef typename RA_Container::difference_type diff_t;
+  return cont.begin() + static_cast<diff_t>(n);
+}
+
+template <typename RA_Container>
+inline typename RA_Container::const_iterator
+nth_iter(const RA_Container& cont, dimension_type n) {
+  typedef typename RA_Container::difference_type diff_t;
+  return cont.begin() + static_cast<diff_t>(n);
+}
+
+inline dimension_type
+least_significant_one_mask(const dimension_type i) {
+  return i & (~i + 1U);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/globals_defs.hh line 568. */
+
+/* Automatically generated from PPL source file ../src/Variable_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Variable::max_space_dimension() {
+  return not_a_dimension() - 1;
+}
+
+inline
+Variable::Variable(dimension_type i)
+  : varid((i < max_space_dimension())
+          ? i
+          : (throw std::length_error("PPL::Variable::Variable(i):\n"
+                                     "i exceeds the maximum allowed "
+                                     "variable identifier."), i)) {
+}
+
+inline dimension_type
+Variable::id() const {
+  return varid;
+}
+
+inline dimension_type
+Variable::space_dimension() const {
+  return varid + 1;
+}
+
+inline memory_size_type
+Variable::external_memory_in_bytes() const {
+  return 0;
+}
+
+inline memory_size_type
+Variable::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Variable::set_output_function(output_function_type* p) {
+  current_output_function = p;
+}
+
+inline Variable::output_function_type*
+Variable::get_output_function() {
+  return current_output_function;
+}
+
+/*! \relates Variable */
+inline bool
+less(const Variable v, const Variable w) {
+  return v.id() < w.id();
+}
+
+inline bool
+Variable::Compare::operator()(const Variable x, const Variable y) const {
+  return less(x, y);
+}
+
+inline void
+Variable::m_swap(Variable& v) {
+  using std::swap;
+  swap(varid, v.varid);
+}
+
+inline void
+swap(Variable& x, Variable& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_defs.hh line 156. */
+
+/* Automatically generated from PPL source file ../src/Linear_Form_defs.hh line 1. */
+/* Linear_Form class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+class Box;
+
+class Box_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Form_defs.hh line 32. */
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Form */
+template <typename C>
+void swap(Linear_Form<C>& x, Linear_Form<C>& y);
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear form \p f1 + \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n + \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f + \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f);
+
+//! Returns the linear form - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f);
+
+//! Returns the linear form \p f1 - \p f2.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p v - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(Variable v, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p v.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p n - \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f - \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f);
+
+//! Returns the linear form \p f * \p n.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 + \p f2 and assigns it to \p e1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f + \p v and assigns it to \p f.
+/*! \relates Linear_Form
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f + \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f1 - \p f2 and assigns it to \p f1.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+
+//! Returns the linear form \p f - \p v and assigns it to \p f.
+/*! \relates Linear_Form
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Form::max_space_dimension()</CODE>.
+ */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, Variable v);
+
+//! Returns the linear form \p f - \p n and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p n * \p f and assigns it to \p f.
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n);
+
+//! Returns the linear form \p f / \p n and assigns it to \p f.
+/*!
+   \relates Linear_Form
+   Performs the division of a linear form by a scalar. It is up to the user to
+   ensure that division by 0 is not performed.
+*/
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Form */
+template <typename C>
+bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream& operator<<(std::ostream& s, const Linear_Form<C>& f);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear form with interval coefficients.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Form represents the interval linear form
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the inhomogeneous term.
+  The coefficients and the inhomogeneous term of the linear form
+  have the template parameter \p C as their type. \p C must be the
+  type of an Interval.
+
+  \par How to build a linear form.
+  A full set of functions is defined in order to provide a convenient
+  interface for building complex linear forms starting from simpler ones
+  and from objects of the classes Variable and \p C. Available operators
+  include binary addition and subtraction, as well as multiplication and
+  division by a coefficient.
+  The space dimension of a linear form is defined as
+  the highest variable dimension among variables that have a nonzero
+  coefficient in the linear form, or zero if no such variable exists.
+  The space dimension for each variable \f$x_i\f$ is given by \f$i + 1\f$.
+
+  \par Example
+  Given the type \p T of an Interval with floating point coefficients (though
+  any integral type may also be used), the following code builds the interval
+  linear form \f$lf = x_5 - x_2 + 1\f$ with space dimension 6:
+  \code
+  Variable x5(5);
+  Variable x2(2);
+  T x5_coefficient;
+  x5_coefficient.lower() = 2.0;
+  x5_coefficient.upper() = 3.0;
+  T inhomogeneous_term;
+  inhomogeneous_term.lower() = 4.0;
+  inhomogeneous_term.upper() = 8.0;
+  Linear_Form<T> lf(x2);
+  lf = -lf;
+  lf += Linear_Form<T>(x2);
+  Linear_Form<T> lf_x5(x5);
+  lf_x5 *= x5_coefficient;
+  lf += lf_x5;
+  \endcode
+  Note that \c lf_x5 is created with space dimension 6, while \c lf is
+  created with space dimension 0 and then extended first to space
+  dimension 2 when \c x2 is subtracted and finally to space dimension
+  6 when \c lf_x5 is added.
+*/
+template <typename C>
+class Parma_Polyhedra_Library::Linear_Form {
+public:
+  //! Default constructor: returns a copy of Linear_Form::zero().
+  Linear_Form();
+
+  //! Ordinary copy constructor.
+  Linear_Form(const Linear_Form& f);
+
+  //! Destructor.
+  ~Linear_Form();
+
+  //! Builds the linear form corresponding to the inhomogeneous term \p n.
+  explicit Linear_Form(const C& n);
+
+  //! Builds the linear form corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Form::max_space_dimension()</CODE>.
+  */
+  Linear_Form(Variable v);
+
+  //! Builds a linear form approximating the linear expression \p e.
+  Linear_Form(const Linear_Expression& e);
+
+  //! Returns the maximum space dimension a Linear_Form can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  const C& coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  const C& inhomogeneous_term() const;
+
+  //! Negates all the coefficients of \p *this.
+  void negate();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Linear_Form& y);
+
+  // Floating point analysis related methods.
+
+  /*! \brief
+    Verifies if the linear form overflows.
+
+    \return
+    Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+    <CODE>true</CODE> otherwise.
+
+    \p T must be the type of possibly unbounded quantities.
+  */
+  bool overflows() const;
+
+  /*! \brief
+    Computes the relative error associated to floating point computations
+    that operate on a quantity that is overapproximated by \p *this.
+
+    \param analyzed_format The floating point format used by the analyzed
+    program.
+    \param result Becomes the linear form corresponding to the relative
+    error committed.
+
+    This method makes <CODE>result</CODE> become a linear form
+    obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+    on the linear form. This function is defined as:
+    \f[
+    \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+    \defeq
+    (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+    +
+    \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+    \amifp
+    [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+    \f]
+    where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+    \f$\beta\f$ the base.
+
+    The result is undefined if \p T is not the type of an interval with
+    floating point boundaries.
+  */
+  void relative_error(Floating_Point_Format analyzed_format,
+                      Linear_Form& result) const;
+
+  /*! \brief
+    Makes \p result become an interval that overapproximates all the
+    possible values of \p *this.
+
+    \param oracle The FP_Oracle to be queried.
+    \param result The linear form that will store the result.
+
+    \return <CODE>true</CODE> if the operation was successful,
+    <CODE>false</CODE> otherwise (the possibility of failure
+    depends on the oracle's implementation).
+
+    \par Template type parameters
+
+    - The class template parameter \p Target specifies the implementation
+    of Concrete_Expression to be used.
+
+    This method makes <CODE>result</CODE> become
+    \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+    \f[
+    \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+    \defeq
+    i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+    \rho^{\#}(v)\right)
+    \f]
+    where \f$\rho^{\#}(v)\f$ is an interval (provided by the oracle)
+    that correctly approximates the value of \f$v\f$.
+
+    The result is undefined if \p C is not the type of an interval with
+    floating point boundaries.
+  */
+  template <typename Target>
+  bool intervalize(const FP_Oracle<Target,C>& oracle, C& result) const;
+
+private:
+  //! The generic coefficient equal to the singleton zero.
+  static C zero;
+
+  //! Type of the container vector.
+  typedef std::vector<C> vec_type;
+
+  //! The container vector.
+  vec_type vec;
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Form(const C& n).
+  */
+  Linear_Form(dimension_type sz, bool);
+
+  /*! \brief
+    Builds the linear form corresponding to the difference of
+    \p v and \p w.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p v or the one of \p w exceed
+    <CODE>Linear_Form::max_space_dimension()</CODE>.
+  */
+  Linear_Form(Variable v, Variable w);
+
+  //! Gives the number of generic coefficients currently in use.
+  dimension_type size() const;
+
+  //! Extends the vector of \p *this to size \p sz.
+  void extend(dimension_type sz);
+
+  //! Returns a reference to \p vec[i].
+  C& operator[](dimension_type i);
+
+  //! Returns a const reference to \p vec[i].
+  const C& operator[](dimension_type i) const;
+
+  friend Linear_Form<C>
+  operator+<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>
+  operator+<C>(const C& n, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator+<C>(const Linear_Form<C>& f, const C& n);
+  friend Linear_Form<C>
+  operator+<C>(Variable v, const Linear_Form<C>& f);
+
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f);
+
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>
+  operator-<C>(const C& n, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f, const C& n);
+  friend Linear_Form<C>
+  operator-<C>(Variable v, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator-<C>(const Linear_Form<C>& f, Variable v);
+
+  friend Linear_Form<C>
+  operator*<C>(const C& n, const Linear_Form<C>& f);
+  friend Linear_Form<C>
+  operator*<C>(const Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator+=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>&
+  operator+=<C>(Linear_Form<C>& f, Variable v);
+  friend Linear_Form<C>&
+  operator+=<C>(Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator-=<C>(Linear_Form<C>& f1, const Linear_Form<C>& f2);
+  friend Linear_Form<C>&
+  operator-=<C>(Linear_Form<C>& f, Variable v);
+  friend Linear_Form<C>&
+  operator-=<C>(Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator*=<C>(Linear_Form<C>& f, const C& n);
+
+  friend Linear_Form<C>&
+  operator/=<C>(Linear_Form<C>& f, const C& n);
+
+  friend bool
+  operator==<C>(const Linear_Form<C>& x, const Linear_Form<C>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<C>(std::ostream& s, const Linear_Form<C>& f);
+};
+
+/* Automatically generated from PPL source file ../src/Linear_Form_inlines.hh line 1. */
+/* Linear_Form class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Form_inlines.hh line 28. */
+#include <iostream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::max_space_dimension() {
+  return vec_type().max_size() - 1;
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form()
+  : vec(1, zero) {
+  vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(dimension_type sz, bool)
+  : vec(sz, zero) {
+  vec.reserve(compute_capacity(sz, vec_type().max_size()));
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const Linear_Form& f)
+  : vec(f.vec) {
+}
+
+template <typename C>
+inline
+Linear_Form<C>::~Linear_Form() {
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::size() const {
+  return vec.size();
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::extend(dimension_type sz) {
+  assert(sz > size());
+  vec.reserve(compute_capacity(sz, vec_type().max_size()));
+  vec.resize(sz, zero);
+}
+
+template <typename C>
+inline
+Linear_Form<C>::Linear_Form(const C& n)
+  : vec(1, n) {
+  vec.reserve(compute_capacity(1, vec_type().max_size()));
+}
+
+template <typename C>
+inline dimension_type
+Linear_Form<C>::space_dimension() const {
+  return size() - 1;
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return zero;
+  return vec[v.id()+1];
+}
+
+template <typename C>
+inline C&
+Linear_Form<C>::operator[](dimension_type i) {
+  assert(i < size());
+  return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::operator[](dimension_type i) const {
+  assert(i < size());
+  return vec[i];
+}
+
+template <typename C>
+inline const C&
+Linear_Form<C>::inhomogeneous_term() const {
+  return vec[0];
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f) {
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const C& n) {
+  return n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator+(const Linear_Form<C>& f, const Variable v) {
+  return v + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Linear_Form<C>& f, const C& n) {
+  return -n + f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator-(const Variable v, const Variable w) {
+  return Linear_Form<C>(v, w);
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>
+operator*(const Linear_Form<C>& f, const C& n) {
+  return n * f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const C& n) {
+  f[0] += n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const C& n) {
+  f[0] -= n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator!=(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+  return !(x == y);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::m_swap(Linear_Form& y) {
+  using std::swap;
+  swap(vec, y.vec);
+}
+
+template <typename C>
+inline void
+Linear_Form<C>::ascii_dump(std::ostream& s) const {
+  using namespace IO_Operators;
+  dimension_type space_dim = space_dimension();
+  s << space_dim << "\n";
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    const char separator = ' ';
+    s << vec[i] << separator;
+  }
+  s << "\n";
+}
+
+template <typename C>
+inline bool
+Linear_Form<C>::ascii_load(std::istream& s) {
+  using namespace IO_Operators;
+  dimension_type new_dim;
+  if (!(s >> new_dim))
+    return false;
+
+  vec.resize(new_dim + 1, zero);
+  for (dimension_type i = 0; i <= new_dim; ++i) {
+    if (!(s >> vec[i]))
+      return false;
+  }
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+inline bool
+Linear_Form<C>::overflows() const {
+  if (!inhomogeneous_term().is_bounded())
+    return true;
+
+  for (dimension_type i = space_dimension(); i-- > 0; ) {
+    if (!coefficient(Variable(i)).is_bounded())
+      return true;
+  }
+
+  return false;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline void
+swap(Linear_Form<C>& x, Linear_Form<C>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Form_defs.hh line 497. */
+// Linear_Form_templates.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Float_inlines.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_half::inf_sign() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_half::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_half::zero_sign() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_half::negate() {
+  word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_half::sign_bit() const {
+  return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_half::dec() {
+  --word;
+}
+
+inline void
+float_ieee754_half::inc() {
+  ++word;
+}
+
+inline void
+float_ieee754_half::set_max(bool negative) {
+  word = WRD_MAX;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_half::build(bool negative, mpz_t mantissa, int exponent) {
+  word = static_cast<uint16_t>(mpz_get_ui(mantissa)
+                               & ((1UL << MANTISSA_BITS) - 1));
+  if (negative)
+    word |= SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  word |= static_cast<uint16_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_single::inf_sign() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_single::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::zero_sign() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_single::negate() {
+  word ^= SGN_MASK;
+}
+
+inline bool
+float_ieee754_single::sign_bit() const {
+  return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_single::dec() {
+  --word;
+}
+
+inline void
+float_ieee754_single::inc() {
+  ++word;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+  word = WRD_MAX;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+  word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+                               & ((1UL << MANTISSA_BITS) - 1));
+  if (negative)
+    word |= SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::inf_sign() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_double::is_nan() const {
+  const uint32_t a = msp & ~MSP_SGN_MASK;
+  return a > MSP_POS_INF || (a == MSP_POS_INF && lsp != LSP_INF);
+}
+
+inline int
+float_ieee754_double::zero_sign() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_double::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_double::sign_bit() const {
+  return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_double::dec() {
+  if (lsp == 0) {
+    --msp;
+    lsp = LSP_MAX;
+  }
+  else
+    --lsp;
+}
+
+inline void
+float_ieee754_double::inc() {
+  if (lsp == LSP_MAX) {
+    ++msp;
+    lsp = 0;
+  }
+  else
+    ++lsp;
+}
+
+inline void
+float_ieee754_double::set_max(bool negative) {
+  msp = MSP_MAX;
+  lsp = LSP_MAX;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+  unsigned long m;
+#if ULONG_MAX == 0xffffffffUL
+  lsp = mpz_get_ui(mantissa);
+  mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+  m = mpz_get_ui(mantissa);
+#else
+  m = mpz_get_ui(mantissa);
+  lsp = static_cast<uint32_t>(m & LSP_MAX);
+  m >>= 32;
+#endif
+  msp = static_cast<uint32_t>(m & ((1UL << (MANTISSA_BITS - 32)) - 1));
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  msp |= static_cast<uint32_t>(exponent_repr) << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_ibm_single::inf_sign() const {
+  if (word == NEG_INF)
+    return -1;
+  if (word == POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ibm_single::is_nan() const {
+  return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ibm_single::zero_sign() const {
+  if (word == NEG_ZERO)
+    return -1;
+  if (word == POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ibm_single::negate() {
+  word ^= SGN_MASK;
+}
+
+inline bool
+float_ibm_single::sign_bit() const {
+  return (word & SGN_MASK) != 0;
+}
+
+inline void
+float_ibm_single::dec() {
+  --word;
+}
+
+inline void
+float_ibm_single::inc() {
+  ++word;
+}
+
+inline void
+float_ibm_single::set_max(bool negative) {
+  word = WRD_MAX;
+  if (negative)
+    word |= SGN_MASK;
+}
+
+inline void
+float_ibm_single::build(bool negative, mpz_t mantissa, int exponent) {
+  word = static_cast<uint32_t>(mpz_get_ui(mantissa)
+                               & ((1UL << MANTISSA_BITS) - 1));
+  if (negative)
+    word |= SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  word |= static_cast<uint32_t>(exponent_repr) << MANTISSA_BITS;
+}
+
+inline int
+float_intel_double_extended::inf_sign() const {
+  if (lsp != LSP_INF)
+    return 0;
+  const uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_INF)
+    return -1;
+  if (a == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_intel_double_extended::is_nan() const {
+  return (msp & MSP_POS_INF) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::zero_sign() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  const uint32_t a = msp & MSP_NEG_INF;
+  if (a == MSP_NEG_ZERO)
+    return -1;
+  if (a == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_intel_double_extended::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_intel_double_extended::sign_bit() const {
+  return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_intel_double_extended::dec() {
+  if ((lsp & LSP_DMAX) == 0) {
+    --msp;
+    lsp = ((msp & MSP_NEG_INF) == 0) ? LSP_DMAX : LSP_NMAX;
+  }
+  else
+    --lsp;
+}
+
+inline void
+float_intel_double_extended::inc() {
+  if ((lsp & LSP_DMAX) == LSP_DMAX) {
+    ++msp;
+    lsp = LSP_DMAX + 1;
+  }
+  else
+    ++lsp;
+}
+
+inline void
+float_intel_double_extended::set_max(bool negative) {
+  msp = MSP_MAX;
+  lsp = LSP_NMAX;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_intel_double_extended::build(bool negative,
+                                   mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+  mpz_export(&lsp, 0, -1, sizeof(lsp), 0, 0, mantissa);
+#else
+  lsp = mpz_get_ui(mantissa);
+#endif
+  msp = (negative ? MSP_SGN_MASK : 0);
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  msp |= static_cast<uint32_t>(exponent_repr);
+}
+
+inline int
+float_ieee754_quad::inf_sign() const {
+  if (lsp != LSP_INF)
+    return 0;
+  if (msp == MSP_NEG_INF)
+    return -1;
+  if (msp == MSP_POS_INF)
+    return 1;
+  return 0;
+}
+
+inline bool
+float_ieee754_quad::is_nan() const {
+  return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+    && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::zero_sign() const {
+  if (lsp != LSP_ZERO)
+    return 0;
+  if (msp == MSP_NEG_ZERO)
+    return -1;
+  if (msp == MSP_POS_ZERO)
+    return 1;
+  return 0;
+}
+
+inline void
+float_ieee754_quad::negate() {
+  msp ^= MSP_SGN_MASK;
+}
+
+inline bool
+float_ieee754_quad::sign_bit() const {
+  return (msp & MSP_SGN_MASK) != 0;
+}
+
+inline void
+float_ieee754_quad::dec() {
+  if (lsp == 0) {
+    --msp;
+    lsp = LSP_MAX;
+  }
+  else
+    --lsp;
+}
+
+inline void
+float_ieee754_quad::inc() {
+  if (lsp == LSP_MAX) {
+    ++msp;
+    lsp = 0;
+  }
+  else
+    ++lsp;
+}
+
+inline void
+float_ieee754_quad::set_max(bool negative) {
+  msp = MSP_MAX;
+  lsp = LSP_MAX;
+  if (negative)
+    msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_quad::build(bool negative, mpz_t mantissa, int exponent) {
+  uint64_t parts[2];
+  mpz_export(parts, 0, -1, sizeof(parts[0]), 0, 0, mantissa);
+  lsp = parts[0];
+  msp = parts[1];
+  msp &= ((static_cast<uint64_t>(1) << (MANTISSA_BITS - 64)) - 1);
+  if (negative)
+    msp |= MSP_SGN_MASK;
+  const int exponent_repr = exponent + EXPONENT_BIAS;
+  PPL_ASSERT(exponent_repr >= 0 && exponent_repr < (1 << EXPONENT_BITS));
+  msp |= static_cast<uint64_t>(exponent_repr) << (MANTISSA_BITS - 64);
+}
+
+inline bool
+is_less_precise_than(Floating_Point_Format f1, Floating_Point_Format f2) {
+  return f1 < f2;
+}
+
+inline unsigned int
+msb_position(unsigned long long v) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(v))) - 1U - clz(v);
+}
+
+template <typename FP_Interval_Type>
+inline void
+affine_form_image(std::map<dimension_type,
+                           Linear_Form<FP_Interval_Type> >& lf_store,
+                  const Variable var,
+                  const Linear_Form<FP_Interval_Type>& lf) {
+  // Assign the new linear form for var.
+  lf_store[var.id()] = lf;
+  // Now invalidate all linear forms in which var occurs.
+  discard_occurrences(lf_store, var);
+}
+
+#if PPL_SUPPORTED_FLOAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+  u.number = v;
+}
+
+inline float
+Float<float>::value() {
+  return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+  u.number = v;
+}
+
+inline double
+Float<double>::value() {
+  return u.number;
+}
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+inline
+Float<long double>::Float() {
+}
+
+inline
+Float<long double>::Float(long double v) {
+  u.number = v;
+}
+
+inline long double
+Float<long double>::value() {
+  return u.number;
+}
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_templates.hh line 1. */
+/* IEC 559 floating point format related functions:
+   non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Float_templates.hh line 30. */
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type>
+const FP_Interval_Type& compute_absolute_error(
+                        const Floating_Point_Format analyzed_format) {
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+
+  // FIXME: check if initializing caches with EMPTY is better.
+  static const FP_Interval_Type ZERO_INTERVAL = FP_Interval_Type(0);
+  // Cached results for each different analyzed format.
+  static FP_Interval_Type ieee754_half_result = ZERO_INTERVAL;
+  static FP_Interval_Type ieee754_single_result = ZERO_INTERVAL;
+  static FP_Interval_Type ieee754_double_result = ZERO_INTERVAL;
+  static FP_Interval_Type ibm_single_result = ZERO_INTERVAL;
+  static FP_Interval_Type ieee754_quad_result = ZERO_INTERVAL;
+  static FP_Interval_Type intel_double_extended_result = ZERO_INTERVAL;
+
+  FP_Interval_Type* to_compute = NULL;
+  // Get the necessary information on the analyzed's format.
+  unsigned int f_base;
+  int f_exponent_bias;
+  unsigned int f_mantissa_bits;
+  switch (analyzed_format) {
+    case IEEE754_HALF:
+      if (ieee754_half_result != ZERO_INTERVAL)
+        return ieee754_half_result;
+
+      to_compute = &ieee754_half_result;
+      f_base = float_ieee754_half::BASE;
+      f_exponent_bias = float_ieee754_half::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+      break;
+    case IEEE754_SINGLE:
+      if (ieee754_single_result != ZERO_INTERVAL)
+        return ieee754_single_result;
+
+      to_compute = &ieee754_single_result;
+      f_base = float_ieee754_single::BASE;
+      f_exponent_bias = float_ieee754_single::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+      break;
+    case IEEE754_DOUBLE:
+      if (ieee754_double_result != ZERO_INTERVAL)
+        return ieee754_double_result;
+
+      to_compute = &ieee754_double_result;
+      f_base = float_ieee754_double::BASE;
+      f_exponent_bias = float_ieee754_double::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+      break;
+    case IBM_SINGLE:
+      if (ibm_single_result != ZERO_INTERVAL)
+        return ibm_single_result;
+
+      to_compute = &ibm_single_result;
+      f_base = float_ibm_single::BASE;
+      f_exponent_bias = float_ibm_single::EXPONENT_BIAS;
+      f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+      break;
+    case IEEE754_QUAD:
+      if (ieee754_quad_result != ZERO_INTERVAL)
+        return ieee754_quad_result;
+
+      to_compute = &ieee754_quad_result;
+      f_base = float_ieee754_quad::BASE;
+      f_exponent_bias = float_ieee754_quad::EXPONENT_BIAS;
+      f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+      break;
+    case INTEL_DOUBLE_EXTENDED:
+      if (intel_double_extended_result != ZERO_INTERVAL)
+        return intel_double_extended_result;
+
+      to_compute = &intel_double_extended_result;
+      f_base = float_intel_double_extended::BASE;
+      f_exponent_bias = float_intel_double_extended::EXPONENT_BIAS;
+      f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+  }
+
+  PPL_ASSERT(to_compute != NULL);
+
+  // We assume that f_base is a power of 2.
+  analyzer_format omega;
+  int power = static_cast<int>(msb_position(f_base))
+    * ((1 - f_exponent_bias) - static_cast<int>(f_mantissa_bits));
+  omega = std::max(static_cast<analyzer_format>(ldexp(1.0, power)),
+                   std::numeric_limits<analyzer_format>::denorm_min());
+
+  to_compute->build(i_constraint(GREATER_OR_EQUAL, -omega),
+                    i_constraint(LESS_OR_EQUAL, omega));
+  return *to_compute;
+}
+
+template <typename FP_Interval_Type>
+void
+discard_occurrences(std::map<dimension_type,
+                             Linear_Form<FP_Interval_Type> >& lf_store,
+                    Variable var) {
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+  for (Iter i = lf_store.begin(); i != lf_store.end(); ) {
+    if((i->second).coefficient(var) != 0)
+      i = lf_store.erase(i);
+    else
+      ++i;
+  }
+}
+
+/* FIXME: improve efficiency by adding the list of potentially conflicting
+   variables as an argument. */
+template <typename FP_Interval_Type>
+void upper_bound_assign(std::map<dimension_type,
+                                 Linear_Form<FP_Interval_Type> >& ls1,
+                        const std::map<dimension_type,
+                                       Linear_Form<FP_Interval_Type> >& ls2) {
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef typename std::map<dimension_type, FP_Linear_Form>::iterator Iter;
+  typedef typename std::map<dimension_type,
+                            FP_Linear_Form>::const_iterator Const_Iter;
+
+  Const_Iter i2_end = ls2.end();
+  for (Iter i1 = ls1.begin(), i1_end = ls1.end(); i1 != i1_end; ) {
+    Const_Iter i2 = ls2.find(i1->first);
+    if ((i2 == i2_end) || (i1->second != i2->second))
+      i1 = ls1.erase(i1);
+    else
+      ++i1;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Float_defs.hh line 522. */
+
+/* Automatically generated from PPL source file ../src/checked_defs.hh line 35. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+
+// It is a pity that function partial specialization is not permitted
+// by C++.  To (partly) overcome this limitation, we use class
+// encapsulated functions and partial specialization of containing
+// classes.
+
+#define PPL_FUNCTION_CLASS(name) name ## _function_struct
+
+#define PPL_DECLARE_FUN1_0_0(name, ret_type, qual, type)                \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg) {           \
+    return PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg); \
+  }
+
+#define PPL_DECLARE_FUN1_0_1(name, ret_type, qual, type, after1)        \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1) { \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg, a1); \
+  }
+
+#define PPL_DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg, PPL_U(after1) a1, \
+                       PPL_U(after2) a2) {                              \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg,      \
+                                                              a1, a2);  \
+  }
+
+#define PPL_DECLARE_FUN1_0_3(name, ret_type, qual, type,                \
+                             after1, after2, after3)                    \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual) PPL_U(type)& arg,             \
+                       PPL_U(after1) a1, PPL_U(after2) a2,              \
+                       PPL_U(after3) a3) {                              \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(arg,      \
+                                                              a1, a2,   \
+                                                              a3);      \
+  }
+
+#define PPL_DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+                       PPL_U(after1) a1) {                              \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg,  \
+                                                              a1);      \
+  }
+
+#define PPL_DECLARE_FUN1_1_2(name, ret_type, before1, qual, type,       \
+                             after1, after2)                            \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(qual) PPL_U(type)& arg, \
+                       PPL_U(after1) a1, PPL_U(after2) a2) {            \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, arg,  \
+                                                              a1, a2);  \
+  }
+
+#define PPL_DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, \
+                             after1, after2)                            \
+  template <typename Policy, typename type>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy, typename type>                             \
+  inline ret_type PPL_U(name)(PPL_U(before1) b1, PPL_U(before2) b2,     \
+                       PPL_U(qual) PPL_U(type)& arg,                    \
+                       PPL_U(after1) a1, PPL_U(after2) a2) {            \
+    return                                                              \
+      PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)>::function(b1, b2,   \
+                                                              arg,      \
+                                                              a1, a2);  \
+  }
+
+#define PPL_DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,          \
+                       PPL_U(qual2) PPL_U(type2)& arg2) {               \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2,                   \
+      type1, PPL_U(type2)>::function(arg1, arg2);                       \
+  }
+
+#define PPL_DECLARE_FUN2_0_1(name, ret_type, qual1, type1,      \
+                             qual2, type2, after1)              \
+  template <typename Policy1, typename Policy2,                 \
+            typename type1, typename type2>                     \
+  struct PPL_FUNCTION_CLASS(name);                              \
+  template <typename Policy1, typename Policy2,                 \
+            typename type1, typename type2>                     \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,  \
+                       PPL_U(qual2) PPL_U(type2)& arg2,         \
+                       PPL_U(after1) a1) {                      \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2,           \
+      type1, PPL_U(type2)>::function(arg1, arg2, a1);           \
+  }
+
+#define PPL_DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, \
+                             after1, after2)                            \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2,                         \
+            typename type1, typename type2>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,          \
+                       PPL_U(qual2) PPL_U(type2)& arg2,                 \
+                       PPL_U(after1) a1, PPL_U(after2) a2) {            \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2,                   \
+      type1, PPL_U(type2)>::function(arg1, arg2, a1, a2);               \
+  }
+
+#define PPL_DECLARE_FUN3_0_1(name, ret_type, qual1, type1,              \
+                             qual2, type2, qual3, type3, after1)        \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename type1, typename type2, typename type3>             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename type1, typename type2, typename type3>             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1,          \
+                       PPL_U(qual2) PPL_U(type2)& arg2,                 \
+                       PPL_U(qual3) PPL_U(type3)& arg3,                 \
+                       PPL_U(after1) a1) {                              \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3,          \
+      type1, type2, PPL_U(type3)>                                       \
+      ::function(arg1, arg2, arg3, a1);                                 \
+  }
+
+#define PPL_DECLARE_FUN5_0_1(name, ret_type,                            \
+                             qual1, type1, qual2, type2, qual3, type3,  \
+                             qual4, type4, qual5, type5,                \
+                             after1)                                    \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename Policy4,typename Policy5,                          \
+            typename type1, typename type2, typename type3,             \
+            typename type4, typename type5>                             \
+  struct PPL_FUNCTION_CLASS(name);                                      \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename Policy4,typename Policy5,                          \
+            typename type1, typename type2, typename type3,             \
+            typename type4, typename type5>                             \
+  inline ret_type PPL_U(name)(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2) \
+                       PPL_U(type2)& arg2,                              \
+                       PPL_U(qual3) PPL_U(type3)& arg3, PPL_U(qual4)    \
+                       PPL_U(type4)& arg4,                              \
+                       PPL_U(qual5) PPL_U(type5)& arg5,                 \
+                       PPL_U(after1) a1) {                              \
+    return PPL_FUNCTION_CLASS(name)<Policy1, Policy2, Policy3,          \
+      Policy4, Policy5,                                                 \
+      type1, type2,                                                     \
+      type3, type4,                                                     \
+      PPL_U(type5)>                                                     \
+      ::function(arg1, arg2, arg3, arg4, arg5, a1);                     \
+  }
+
+#define PPL_SPECIALIZE_FUN1_0_0(name, func, ret_type, qual, type)       \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg) {     \
+      return PPL_U(func)<Policy>(arg);                                  \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_0_1(name, func, ret_type, qual, type, after1) \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1) {                 \
+      return PPL_U(func)<Policy>(arg, a1);                              \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_0_2(name, func, ret_type, qual, type,       \
+                                after1, after2)                         \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy>(arg, a1, a2);                          \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_0_3(name, func, ret_type, qual, type,       \
+                                after1, after2, after3)                 \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1, PPL_U(after2) a2, \
+                                    PPL_U(after3) a3) {                 \
+      return PPL_U(func)<Policy>(arg, a1, a2, a3);                      \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_1_1(name, func, ret_type, before1,          \
+                                qual, type, after1)                     \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(before1) b1, PPL_U(qual)      \
+                                    PPL_U(type)& arg,                   \
+                                    PPL_U(after1) a1) {                 \
+      return PPL_U(func)<Policy>(b1, arg, a1);                          \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_1_2(name, func, ret_type, before1,          \
+                                qual, type, after1, after2)             \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(before1) b1, PPL_U(qual)      \
+                                    PPL_U(type)& arg,                   \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy>(b1, arg, a1, a2);                      \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN1_2_2(name, func, ret_type, before1, before2, \
+                                qual, type, after1, after2)             \
+  template <typename Policy>                                            \
+  struct PPL_FUNCTION_CLASS(name)<Policy, PPL_U(type)> {                \
+    static inline ret_type function(PPL_U(before1) b1, PPL_U(before2) b2, \
+                                    PPL_U(qual) PPL_U(type)& arg,       \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy>(b1, b2, arg, a1, a2);                  \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN2_0_0(name, func, ret_type, qual1, type1,     \
+                                qual2, type2)                           \
+  template <typename Policy1, typename Policy2>                         \
+  struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1,              \
+                                  PPL_U(type2)> {                       \
+    static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1,    \
+                                    PPL_U(qual2) PPL_U(type2) &arg2) {  \
+      return PPL_U(func)<Policy1, Policy2>(arg1, arg2);                 \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN2_0_1(name, func, ret_type, qual1, type1,     \
+                                qual2, type2, after1)                   \
+  template <typename Policy1, typename Policy2>                         \
+  struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1,              \
+                                  PPL_U(type2)> {                       \
+    static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1,    \
+                                    PPL_U(qual2) PPL_U(type2) &arg2,    \
+                                    PPL_U(after1) a1) {                 \
+      return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1);             \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN2_0_2(name, func, ret_type, qual1, type1,     \
+                                qual2, type2, after1, after2)           \
+  template <typename Policy1, typename Policy2>                         \
+  struct PPL_FUNCTION_CLASS(name)<Policy1, Policy2, type1,              \
+                                  PPL_U(type2)> {                       \
+    static inline ret_type function(PPL_U(qual1) PPL_U(type1)& arg1,    \
+                                    PPL_U(qual2) PPL_U(type2) &arg2,    \
+                                    PPL_U(after1) a1, PPL_U(after2) a2) \
+    {                                                                   \
+      return PPL_U(func)<Policy1, Policy2>(arg1, arg2, a1, a2);         \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN3_0_1(name, func, ret_type, qual1, type1,     \
+                                qual2, type2, qual3, type3, after1)     \
+  template <typename Policy1, typename Policy2, typename Policy3>       \
+  struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3,           \
+                                   type1, type2,                        \
+                                   PPL_U(type3)> {                      \
+    static inline Result function(PPL_U(qual1) PPL_U(type1)& arg1,      \
+                                  PPL_U(qual2) PPL_U(type2) &arg2,      \
+                                  PPL_U(qual3) PPL_U(type3) &arg3,      \
+                                  PPL_U(after1) a1) {                   \
+      return PPL_U(func)<Policy1, Policy2, Policy3>(arg1, arg2, arg3,   \
+                                                    a1);                \
+    }                                                                   \
+  };
+
+#define PPL_SPECIALIZE_FUN5_0_1(name, func, ret_type,                   \
+                                qual1, type1, qual2, type2,             \
+                                qual3, type3,                           \
+                                qual4, type4, qual5, type5, after1)     \
+  template <typename Policy1, typename Policy2, typename Policy3,       \
+            typename Policy4, typename Policy5>                         \
+  struct PPL_FUNCTION_CLASS(name) <Policy1, Policy2, Policy3, Policy4,  \
+                                   Policy5,                             \
+                                   type1, type2,                        \
+                                   type3, type4,                        \
+                                   PPL_U(type5)> {                      \
+    static inline Result                                                \
+      function(PPL_U(qual1) PPL_U(type1)& arg1, PPL_U(qual2)            \
+               PPL_U(type2) &arg2,                                      \
+               PPL_U(qual3) PPL_U(type3) &arg3, PPL_U(qual4)            \
+               PPL_U(type4) &arg4,                                      \
+               PPL_U(qual5) PPL_U(type5) &arg5, PPL_U(after1) a1) {     \
+      return PPL_U(func)<Policy1, Policy2, Policy3, Policy4,            \
+        Policy5>(arg1, arg2, arg3, arg4, arg5, a1);                     \
+    }                                                                   \
+  };
+
+// The `nonconst' macro helps readability of the sequel.
+#ifdef nonconst
+#define PPL_SAVED_nonconst nonconst
+#undef nonconst
+#endif
+#define nonconst
+
+#define PPL_SPECIALIZE_COPY(func, Type)                                 \
+  PPL_SPECIALIZE_FUN2_0_0(copy, func, void, nonconst, Type, const, Type)
+#define PPL_SPECIALIZE_SGN(func, From)                                  \
+  PPL_SPECIALIZE_FUN1_0_0(sgn, func, Result_Relation, const, From)
+#define PPL_SPECIALIZE_CMP(func, Type1, Type2)                          \
+  PPL_SPECIALIZE_FUN2_0_0(cmp, func, Result_Relation, const, Type1, const, Type2)
+#define PPL_SPECIALIZE_CLASSIFY(func, Type)                             \
+  PPL_SPECIALIZE_FUN1_0_3(classify, func, Result, const, Type, bool, bool, bool)
+#define PPL_SPECIALIZE_IS_NAN(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_0_0(is_nan, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_MINF(func, Type)                      \
+  PPL_SPECIALIZE_FUN1_0_0(is_minf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_PINF(func, Type)                      \
+  PPL_SPECIALIZE_FUN1_0_0(is_pinf, func, bool, const, Type)
+#define PPL_SPECIALIZE_IS_INT(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_0_0(is_int, func, bool, const, Type)
+#define PPL_SPECIALIZE_ASSIGN_SPECIAL(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_0_2(assign_special, func, Result,                 \
+                          nonconst, Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT_SPECIAL(func, Type)                    \
+  PPL_SPECIALIZE_FUN1_0_2(construct_special, func, Result, nonconst,    \
+                          Type, Result_Class, Rounding_Dir)
+#define PPL_SPECIALIZE_CONSTRUCT(func, To, From)                        \
+  PPL_SPECIALIZE_FUN2_0_1(construct, func, Result, nonconst, To,        \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ASSIGN(func, To, From)                   \
+  PPL_SPECIALIZE_FUN2_0_1(assign, func, Result, nonconst, To,   \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_FLOOR(func, To, From)                    \
+  PPL_SPECIALIZE_FUN2_0_1(floor, func, Result, nonconst, To,    \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_CEIL(func, To, From)                     \
+  PPL_SPECIALIZE_FUN2_0_1(ceil, func, Result, nonconst, To,     \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_TRUNC(func, To, From)                    \
+  PPL_SPECIALIZE_FUN2_0_1(trunc, func, Result, nonconst, To,    \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_NEG(func, To, From)                      \
+  PPL_SPECIALIZE_FUN2_0_1(neg, func, Result, nonconst, To,      \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ABS(func, To, From)                      \
+  PPL_SPECIALIZE_FUN2_0_1(abs, func, Result, nonconst, To,      \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_SQRT(func, To, From)                     \
+  PPL_SPECIALIZE_FUN2_0_1(sqrt, func, Result, nonconst, To,     \
+                          const, From, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(add, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(sub, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(mul, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(div, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_REM(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(rem, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_IDIV(func, To, From1, From2)                     \
+  PPL_SPECIALIZE_FUN3_0_1(idiv, func, Result, nonconst, To,             \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(add_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(sub_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_MUL_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(mul_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_DIV_2EXP(func, To, From)                         \
+  PPL_SPECIALIZE_FUN2_0_2(div_2exp, func, Result, nonconst, To,         \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_SMOD_2EXP(func, To, From)                        \
+  PPL_SPECIALIZE_FUN2_0_2(smod_2exp, func, Result, nonconst, To,        \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_UMOD_2EXP(func, To, From)                        \
+  PPL_SPECIALIZE_FUN2_0_2(umod_2exp, func, Result, nonconst, To,        \
+                          const, From, unsigned int, Rounding_Dir)
+#define PPL_SPECIALIZE_ADD_MUL(func, To, From1, From2)                  \
+  PPL_SPECIALIZE_FUN3_0_1(add_mul, func, Result, nonconst, To,          \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_SUB_MUL(func, To, From1, From2)                  \
+  PPL_SPECIALIZE_FUN3_0_1(sub_mul, func, Result, nonconst, To,          \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCD(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(gcd, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_GCDEXT(func, To1, From1, From2, To2, To3)        \
+  PPL_SPECIALIZE_FUN5_0_1(gcdext, func, Result, nonconst, To1,          \
+                          nonconst, To2, nonconst, To3,                 \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_LCM(func, To, From1, From2)                      \
+  PPL_SPECIALIZE_FUN3_0_1(lcm, func, Result, nonconst, To,              \
+                          const, From1, const, From2, Rounding_Dir)
+#define PPL_SPECIALIZE_INPUT(func, Type)                        \
+  PPL_SPECIALIZE_FUN1_0_2(input, func, Result, nonconst, Type,  \
+                          std::istream&, Rounding_Dir)
+#define PPL_SPECIALIZE_OUTPUT(func, Type)                       \
+  PPL_SPECIALIZE_FUN1_1_2(output, func, Result, std::ostream&,  \
+                          const, Type,                          \
+                          const Numeric_Format&, Rounding_Dir)
+
+
+PPL_DECLARE_FUN2_0_0(copy,
+                     void, nonconst, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_0(sgn,
+                     Result_Relation, const, From)
+PPL_DECLARE_FUN2_0_0(cmp,
+                     Result_Relation, const, Type1, const, Type2)
+PPL_DECLARE_FUN1_0_3(classify,
+                     Result, const, Type, bool, bool, bool)
+PPL_DECLARE_FUN1_0_0(is_nan,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_minf,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_pinf,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_0(is_int,
+                     bool, const, Type)
+PPL_DECLARE_FUN1_0_2(assign_special,
+                     Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(construct_special,
+                     Result, nonconst, Type, Result_Class, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(construct,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(assign,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(floor,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(ceil,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(trunc,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(neg,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(abs,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN2_0_1(sqrt,
+                     Result, nonconst, To, const, From, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(mul,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(div,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(rem,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(idiv,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(add_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(sub_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(mul_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(div_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(smod_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN2_0_2(umod_2exp,
+                     Result, nonconst, To,
+                     const, From, unsigned int, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(add_mul,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(sub_mul,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(gcd,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN5_0_1(gcdext,
+                     Result, nonconst, To1, nonconst, To2, nonconst, To3,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN3_0_1(lcm,
+                     Result, nonconst, To,
+                     const, From1, const, From2, Rounding_Dir)
+PPL_DECLARE_FUN1_0_2(input,
+                     Result, nonconst, Type, std::istream&, Rounding_Dir)
+PPL_DECLARE_FUN1_1_2(output,
+                     Result, std::ostream&, const, Type,
+                     const Numeric_Format&, Rounding_Dir)
+
+#undef PPL_DECLARE_FUN1_0_0
+#undef PPL_DECLARE_FUN1_0_1
+#undef PPL_DECLARE_FUN1_0_2
+#undef PPL_DECLARE_FUN1_0_3
+#undef PPL_DECLARE_FUN1_1_1
+#undef PPL_DECLARE_FUN1_1_2
+#undef PPL_DECLARE_FUN1_2_2
+#undef PPL_DECLARE_FUN2_0_0
+#undef PPL_DECLARE_FUN2_0_1
+#undef PPL_DECLARE_FUN2_0_2
+#undef PPL_DECLARE_FUN3_0_1
+#undef PPL_DECLARE_FUN5_0_1
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+std::string float_mpq_to_string(mpq_class& q);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+  static const Result_Class vclass = VC_MINUS_INFINITY;
+};
+struct Plus_Infinity {
+  static const Result_Class vclass = VC_PLUS_INFINITY;
+};
+struct Not_A_Number {
+  static const Result_Class vclass = VC_NAN;
+};
+
+template <typename T>
+struct Is_Special : public False { };
+
+template <>
+struct Is_Special<Minus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Plus_Infinity> : public True {};
+
+template <>
+struct Is_Special<Not_A_Number> : public True {};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Checked_Number_Transparent_Policy {
+  //! Do not check for overflowed result.
+  const_bool_nodef(check_overflow, false);
+
+  //! Do not check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Do not check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Do not check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Do not check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Do not check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Do not check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Do not check for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Handle not-a-number special value if \p T has it.
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+
+  //! Handle infinity special values if \p T have them.
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+
+  /*! \brief
+    The checked number can always be safely converted to the
+    underlying type \p T and vice-versa.
+  */
+  const_bool_nodef(convertible, true);
+
+  //! Do not honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, false);
+
+  //! Do not make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, false);
+
+  /*! \brief
+    For constructors, by default use the same rounding used by
+    underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+  /*! \brief
+    For overloaded operators (operator+(), operator-(), ...), by
+    default use the same rounding used by the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+  /*! \brief
+    For input functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For output functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For all other functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#define CHECK_P(cond, check) ((cond) ? (check) : (assert(!(check)), false))
+
+/* Automatically generated from PPL source file ../src/checked_inlines.hh line 1. */
+/* Abstract checked arithmetic functions: fall-backs.
+*/
+
+
+/* Automatically generated from PPL source file ../src/checked_inlines.hh line 31. */
+
+/*! \brief
+  Performs the test <CODE>a < b</CODE> avoiding the warning about the
+  comparison being always false due to limited range of data type.
+  FIXME: we have not found a working solution. The GCC option
+  -Wno-type-limits suppresses the warning
+*/
+#define PPL_LT_SILENT(a, b) ((a) < (b))
+#define PPL_GT_SILENT(a, b) ((a) > (b))
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename T1, typename T2>
+struct Safe_Conversion : public False {
+};
+template <typename T>
+struct Safe_Conversion<T, T> : public True {
+};
+
+#define PPL_SAFE_CONVERSION(To, From)                        \
+  template <> struct Safe_Conversion<PPL_U(To), PPL_U(From)> \
+    : public True { }
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, signed char);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_SHORT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed short, char);
+#endif
+PPL_SAFE_CONVERSION(signed short, unsigned char);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, signed char);
+PPL_SAFE_CONVERSION(signed int, signed short);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_INT
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed int, char);
+#endif
+PPL_SAFE_CONVERSION(signed int, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_INT
+PPL_SAFE_CONVERSION(signed int, unsigned short);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, signed char);
+PPL_SAFE_CONVERSION(signed long, signed short);
+PPL_SAFE_CONVERSION(signed long, signed int);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG
+PPL_SAFE_CONVERSION(signed long, unsigned int);
+#endif
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, signed char);
+PPL_SAFE_CONVERSION(signed long long, signed short);
+PPL_SAFE_CONVERSION(signed long long, signed int);
+PPL_SAFE_CONVERSION(signed long long, signed long);
+#if PPL_SIZEOF_CHAR < PPL_SIZEOF_LONG_LONG
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(signed long long, char);
+#endif
+PPL_SAFE_CONVERSION(signed long long, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned short);
+#endif
+#if PPL_SIZEOF_INT < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG < PPL_SIZEOF_LONG_LONG
+PPL_SAFE_CONVERSION(signed long long, unsigned long);
+#endif
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned short, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned short, unsigned char);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned int, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned int, unsigned char);
+PPL_SAFE_CONVERSION(unsigned int, unsigned short);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long, unsigned int);
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SAFE_CONVERSION(unsigned long long, char);
+#endif
+PPL_SAFE_CONVERSION(unsigned long long, unsigned char);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned short);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned int);
+PPL_SAFE_CONVERSION(unsigned long long, unsigned long);
+
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, char);
+PPL_SAFE_CONVERSION(float, signed char);
+PPL_SAFE_CONVERSION(float, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed short);
+PPL_SAFE_CONVERSION(float, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed int);
+PPL_SAFE_CONVERSION(float, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long);
+PPL_SAFE_CONVERSION(float, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_FLOAT - 2
+PPL_SAFE_CONVERSION(float, signed long long);
+PPL_SAFE_CONVERSION(float, unsigned long long);
+#endif
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, char);
+PPL_SAFE_CONVERSION(double, signed char);
+PPL_SAFE_CONVERSION(double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed short);
+PPL_SAFE_CONVERSION(double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed int);
+PPL_SAFE_CONVERSION(double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long);
+PPL_SAFE_CONVERSION(double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_DOUBLE - 4
+PPL_SAFE_CONVERSION(double, signed long long);
+PPL_SAFE_CONVERSION(double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(double, float);
+
+#if PPL_SIZEOF_CHAR <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, char);
+PPL_SAFE_CONVERSION(long double, signed char);
+PPL_SAFE_CONVERSION(long double, unsigned char);
+#endif
+#if PPL_SIZEOF_SHORT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed short);
+PPL_SAFE_CONVERSION(long double, unsigned short);
+#endif
+#if PPL_SIZEOF_INT <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed int);
+PPL_SAFE_CONVERSION(long double, unsigned int);
+#endif
+#if PPL_SIZEOF_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long);
+PPL_SAFE_CONVERSION(long double, unsigned long);
+#endif
+#if PPL_SIZEOF_LONG_LONG <= PPL_SIZEOF_LONG_DOUBLE - 4
+PPL_SAFE_CONVERSION(long double, signed long long);
+PPL_SAFE_CONVERSION(long double, unsigned long long);
+#endif
+PPL_SAFE_CONVERSION(long double, float);
+PPL_SAFE_CONVERSION(long double, double);
+
+PPL_SAFE_CONVERSION(mpz_class, char);
+PPL_SAFE_CONVERSION(mpz_class, signed char);
+PPL_SAFE_CONVERSION(mpz_class, signed short);
+PPL_SAFE_CONVERSION(mpz_class, signed int);
+PPL_SAFE_CONVERSION(mpz_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpz_class, unsigned char);
+PPL_SAFE_CONVERSION(mpz_class, unsigned short);
+PPL_SAFE_CONVERSION(mpz_class, unsigned int);
+PPL_SAFE_CONVERSION(mpz_class, unsigned long);
+// GMP's API does not support unsigned long long.
+
+PPL_SAFE_CONVERSION(mpq_class, char);
+PPL_SAFE_CONVERSION(mpq_class, signed char);
+PPL_SAFE_CONVERSION(mpq_class, signed short);
+PPL_SAFE_CONVERSION(mpq_class, signed int);
+PPL_SAFE_CONVERSION(mpq_class, signed long);
+// GMP's API does not support signed long long.
+PPL_SAFE_CONVERSION(mpq_class, unsigned char);
+PPL_SAFE_CONVERSION(mpq_class, unsigned short);
+PPL_SAFE_CONVERSION(mpq_class, unsigned int);
+PPL_SAFE_CONVERSION(mpq_class, unsigned long);
+// GMP's API does not support unsigned long long.
+PPL_SAFE_CONVERSION(mpq_class, float);
+PPL_SAFE_CONVERSION(mpq_class, double);
+// GMP's API does not support long double.
+
+#undef PPL_SAFE_CONVERSION
+
+template <typename Policy, typename Type>
+struct PPL_FUNCTION_CLASS(construct)<Policy, Policy, Type, Type> {
+  static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+    new (&to) Type(from);
+    return V_EQ;
+  }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+struct PPL_FUNCTION_CLASS(construct) {
+  static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+    new (&to) To();
+    return assign<To_Policy, From_Policy>(to, from, dir);
+  }
+};
+
+template <typename To_Policy, typename To>
+struct PPL_FUNCTION_CLASS(construct_special) {
+  static inline Result function(To& to, Result_Class r, Rounding_Dir dir) {
+    new (&to) To();
+    return assign_special<To_Policy>(to, r, dir);
+  }
+};
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_exact(To& to, const From& from, Rounding_Dir) {
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline typename Enable_If<Is_Same<To_Policy, From_Policy>::value, void>::type
+copy_generic(Type& to, const Type& from) {
+  to = from;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+  if (from < 0)
+    return neg<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From>
+inline void
+gcd_exact_no_abs(To& to, const From& x, const From& y) {
+  To w_x = x;
+  To w_y = y;
+  To remainder;
+  while (w_y != 0) {
+    // The following is derived from the assumption that w_x % w_y
+    // is always representable. This is true for both native integers
+    // and IEC 559 floating point numbers.
+    rem<To_Policy, From1_Policy, From2_Policy>(remainder, w_x, w_y,
+                                               ROUND_NOT_NEEDED);
+    w_x = w_y;
+    w_y = remainder;
+  }
+  to = w_x;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(to, x, y);
+  return abs<To_Policy, To_Policy>(to, to, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+          typename From1_Policy, typename From2_Policy,
+          typename To1, typename To2, typename To3,
+          typename From1, typename From2>
+inline Result
+gcdext_exact(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+             Rounding_Dir dir) {
+  // In case this becomes a bottleneck, we may consider using the
+  // Stehle'-Zimmermann algorithm (see R. Crandall and C. Pomerance,
+  // Prime Numbers - A Computational Perspective, Second Edition,
+  // Springer, 2005).
+  if (y == 0) {
+    if (x == 0) {
+      s = 0;
+      t = 1;
+      return V_EQ;
+    }
+    else {
+      if (x < 0)
+        s = -1;
+      else
+        s = 1;
+      t = 0;
+      return abs<To1_Policy, From1_Policy>(to, x, dir);
+    }
+  }
+
+  s = 1;
+  t = 0;
+  bool negative_x = x < 0;
+  bool negative_y = y < 0;
+
+  Result r;
+  r = abs<To1_Policy, From1_Policy>(to, x, dir);
+  if (r != V_EQ)
+    return r;
+
+  From2 a_y;
+  r = abs<To1_Policy, From2_Policy>(a_y, y, dir);
+  if (r != V_EQ)
+    return r;
+
+  // If PPL_MATCH_GMP_GCDEXT is defined then s is favored when the absolute
+  // values of the given numbers are equal.  For instance if x and y
+  // are both 5 then s will be 1 and t will be 0, instead of the other
+  // way round.  This is to match the behavior of GMP.
+#define PPL_MATCH_GMP_GCDEXT 1
+#ifdef PPL_MATCH_GMP_GCDEXT
+  if (to == a_y)
+    goto sign_check;
+#endif
+
+  {
+    To2 v1 = 0;
+    To3 v2 = 1;
+    To1 v3 = static_cast<To1>(a_y);
+    while (true) {
+      To1 q = to / v3;
+      // Remainder, next candidate GCD.
+      To1 t3 = to - q*v3;
+      To2 t1 = s - static_cast<To2>(q)*v1;
+      To3 t2 = t - static_cast<To3>(q)*v2;
+      s = v1;
+      t = v2;
+      to = v3;
+      if (t3 == 0)
+        break;
+      v1 = t1;
+      v2 = t2;
+      v3 = t3;
+    }
+  }
+
+#ifdef PPL_MATCH_GMP_GCDEXT
+ sign_check:
+#endif
+  if (negative_x) {
+    r = neg<To2_Policy, To2_Policy>(s, s, dir);
+    if (r != V_EQ)
+      return r;
+  }
+  if (negative_y)
+    return neg<To3_Policy, To3_Policy>(t, t, dir);
+  return V_EQ;
+#undef PPL_MATCH_GMP_GCDEXT
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+lcm_gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (x == 0 || y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  To a_x;
+  To a_y;
+  Result r;
+  r = abs<From1_Policy, From1_Policy>(a_x, x, dir);
+  if (r != V_EQ)
+    return r;
+  r = abs<From2_Policy, From2_Policy>(a_y, y, dir);
+  if (r != V_EQ)
+    return r;
+  To gcd;
+  gcd_exact_no_abs<To_Policy, From1_Policy, From2_Policy>(gcd, a_x, a_y);
+  // The following is derived from the assumption that a_x / gcd(a_x, a_y)
+  // is always representable. This is true for both native integers
+  // and IEC 559 floating point numbers.
+  div<To_Policy, From1_Policy, To_Policy>(to, a_x, gcd, ROUND_NOT_NEEDED);
+  return mul<To_Policy, To_Policy, From2_Policy>(to, to, a_y, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_generic(const Type& x) {
+  if (x > 0)
+    return VR_GT;
+  if (x == 0)
+    return VR_EQ;
+  return VR_LT;
+}
+
+template <typename T1, typename T2, typename Enable = void>
+struct Safe_Int_Comparison : public False {
+};
+
+template <typename T1, typename T2>
+struct Safe_Int_Comparison<T1, T2, typename Enable_If<(C_Integer<T1>::value && C_Integer<T2>::value)>::type>
+  : public Bool<(C_Integer<T1>::is_signed
+                 ? (C_Integer<T2>::is_signed
+                    || sizeof(T2) < sizeof(T1)
+                    || sizeof(T2) < sizeof(int))
+                 : (!C_Integer<T2>::is_signed
+                    || sizeof(T1) < sizeof(T2)
+                    || sizeof(T1) < sizeof(int)))> {
+};
+
+
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+                           || Safe_Conversion<T1, T2>::value
+                           || Safe_Conversion<T2, T1>::value), bool>::type
+lt(const T1& x, const T2& y) {
+  return x < y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+                           || Safe_Conversion<T1, T2>::value
+                           || Safe_Conversion<T2, T1>::value), bool>::type
+le(const T1& x, const T2& y) {
+  return x <= y;
+}
+template <typename T1, typename T2>
+inline typename Enable_If<(Safe_Int_Comparison<T1, T2>::value
+                           || Safe_Conversion<T1, T2>::value
+                           || Safe_Conversion<T2, T1>::value), bool>::type
+eq(const T1& x, const T2& y) {
+  return x == y;
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+lt(const S& x, const U& y) {
+  return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) < y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+lt(const U& x, const S& y) {
+  return y >= 0 && x < static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+le(const S& x, const U& y) {
+  return x < 0 || static_cast<typename C_Integer<S>::other_type>(x) <= y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+le(const U& x, const S& y) {
+  return y >= 0 && x <= static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename S, typename U>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+eq(const S& x, const U& y) {
+  return x >= 0 && static_cast<typename C_Integer<S>::other_type>(x) == y;
+}
+
+template <typename U, typename S>
+inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
+                           && C_Integer<U>::value
+                           && C_Integer<S>::is_signed), bool>::type
+eq(const U& x, const S& y) {
+  return y >= 0 && x == static_cast<typename C_Integer<S>::other_type>(y);
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+                           && !Safe_Conversion<T2, T1>::value
+                           && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+eq(const T1& x, const T2& y) {
+  PPL_DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_CHECK);
+  // FIXME: We can do this also without fpu inexact check using a
+  // conversion back and forth and then testing equality.  We should
+  // code this in checked_float_inlines.hh, probably it's faster also
+  // if fpu supports inexact check.
+  PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+  return r == V_EQ && x == tmp;
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
+                           && !Safe_Conversion<T2, T1>::value
+                           && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+lt(const T1& x, const T2& y) {
+  PPL_DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, ROUND_UP);
+  if (!result_representable(r))
+    return true;
+  switch (result_relation(r)) {
+  case VR_EQ:
+  case VR_LT:
+  case VR_LE:
+    return x < tmp;
+  default:
+    return false;
+  }
+}
+
+template <typename T1, typename T2>
+inline typename
+Enable_If<(!Safe_Conversion<T1, T2>::value
+           && !Safe_Conversion<T2, T1>::value
+           && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
+le(const T1& x, const T2& y) {
+  PPL_DIRTY_TEMP(T1, tmp);
+  Result r = assign_r(tmp, y, (ROUND_UP | ROUND_STRICT_RELATION));
+  // FIXME: We can do this also without fpu inexact check using a
+  // conversion back and forth and then testing equality.  We should
+  // code this in checked_float_inlines.hh, probably it's faster also
+  // if fpu supports inexact check.
+  PPL_ASSERT(r != V_LE && r != V_GE && r != V_LGE);
+  if (!result_representable(r))
+    return true;
+  switch (result_relation(r)) {
+  case VR_EQ:
+    return x <= tmp;
+  case VR_LT:
+    return x < tmp;
+  case VR_LE:
+  case VR_GE:
+  case VR_LGE:
+    // See comment above.
+    PPL_UNREACHABLE;
+    return false;
+  default:
+    return false;
+  }
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+lt_p(const Type1& x, const Type2& y) {
+  return lt(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+le_p(const Type1& x, const Type2& y) {
+  return le(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+eq_p(const Type1& x, const Type2& y) {
+  return eq(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline Result_Relation
+cmp_generic(const Type1& x, const Type2& y) {
+  if (lt(y, x))
+    return VR_GT;
+  if (lt(x, y))
+    return VR_LT;
+  return VR_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+assign_nan(Type& to, Result r) {
+  assign_special<Policy>(to, VC_NAN, ROUND_IGNORE);
+  return r;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+  PPL_DIRTY_TEMP(mpq_class, q);
+  Result r = input_mpq(q, is);
+  Result_Class c = result_class(r);
+  switch (c) {
+  case VC_MINUS_INFINITY:
+  case VC_PLUS_INFINITY:
+    return assign_special<Policy>(to, c, dir);
+  case VC_NAN:
+    return assign_nan<Policy>(to, r);
+  default:
+    break;
+  }
+  PPL_ASSERT(r == V_EQ);
+  return assign<Policy, void>(to, q, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_int_inlines.hh line 1. */
+/* Specialized "checked" functions for native integer numbers.
+*/
+
+
+/* Automatically generated from PPL source file ../src/checked_int_inlines.hh line 28. */
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+
+#if !PPL_HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !PPL_HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef PPL_HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef PPL_HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+  static const Type plus_infinity = C_Integer<Type>::max;
+  static const Type minus_infinity = ((C_Integer<Type>::min >= 0)
+                                      ? (C_Integer<Type>::max - 1)
+                                      : C_Integer<Type>::min);
+  static const Type not_a_number
+  = ((C_Integer<Type>::min >= 0)
+     ? (C_Integer<Type>::max - 2 * (Policy::has_infinity ? 1 : 0))
+     : (C_Integer<Type>::min + (Policy::has_infinity ? 1 : 0)));
+  static const Type min
+  = (C_Integer<Type>::min
+     + ((C_Integer<Type>::min >= 0)
+        ? 0
+        : ((Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))));
+  static const Type max
+  = (C_Integer<Type>::max
+     - ((C_Integer<Type>::min >= 0)
+        ? (2 * (Policy::has_infinity ? 1 : 0) + (Policy::has_nan ? 1 : 0))
+        : (Policy::has_infinity ? 1 : 0)));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    to = Extended_Int<Policy, To>::min;
+    return V_LT_INF;
+  }
+  else {
+    if (Policy::has_infinity) {
+      to = Extended_Int<Policy, To>::minus_infinity;
+      return V_GT_MINUS_INFINITY;
+    }
+    return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    to = Extended_Int<Policy, To>::max;
+    return V_GT_SUP;
+  }
+  else {
+    if (Policy::has_infinity) {
+      to = Extended_Int<Policy, To>::plus_infinity;
+      return V_LT_PLUS_INFINITY;
+    }
+    return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+  }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int_no_overflow(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    if (to == Extended_Int<Policy, To>::min) {
+      if (Policy::has_infinity) {
+        to = Extended_Int<Policy, To>::minus_infinity;
+        return V_GT_MINUS_INFINITY;
+      }
+      return V_GT_MINUS_INFINITY | V_UNREPRESENTABLE;
+    }
+    else {
+      --to;
+      return V_GT;
+    }
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    if (to == Extended_Int<Policy, To>::max) {
+      if (Policy::has_infinity) {
+        to = Extended_Int<Policy, To>::plus_infinity;
+        return V_LT_PLUS_INFINITY;
+      }
+      return V_LT_PLUS_INFINITY | V_UNREPRESENTABLE;
+    }
+    else {
+      ++to;
+      return V_LT;
+    }
+  }
+  return V_GT;
+}
+
+PPL_SPECIALIZE_COPY(copy_generic, char)
+PPL_SPECIALIZE_COPY(copy_generic, signed char)
+PPL_SPECIALIZE_COPY(copy_generic, signed short)
+PPL_SPECIALIZE_COPY(copy_generic, signed int)
+PPL_SPECIALIZE_COPY(copy_generic, signed long)
+PPL_SPECIALIZE_COPY(copy_generic, signed long long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned char)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned short)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned int)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long)
+PPL_SPECIALIZE_COPY(copy_generic, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+classify_int(const Type v, bool nan, bool inf, bool sign) {
+  if (Policy::has_nan
+      && (nan || sign)
+      && v == Extended_Int<Policy, Type>::not_a_number)
+    return V_NAN;
+  if (!inf && !sign)
+    return V_LGE;
+  if (Policy::has_infinity) {
+    if (v == Extended_Int<Policy, Type>::minus_infinity)
+      return inf ? V_EQ_MINUS_INFINITY : V_LT;
+    if (v == Extended_Int<Policy, Type>::plus_infinity)
+      return inf ? V_EQ_PLUS_INFINITY : V_GT;
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_int, char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, signed long long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned char)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned short)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned int)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long)
+PPL_SPECIALIZE_CLASSIFY(classify_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+  return Policy::has_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_int, char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, signed long long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned char)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned short)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned int)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long)
+PPL_SPECIALIZE_IS_NAN(is_nan_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+  return Policy::has_infinity
+    && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_int, char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, signed long long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned char)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned short)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned int)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long)
+PPL_SPECIALIZE_IS_MINF(is_minf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+  return Policy::has_infinity
+    && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, signed long long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned char)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned short)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned int)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long)
+PPL_SPECIALIZE_IS_PINF(is_pinf_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+  return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_int, char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed char)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed short)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed int)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long)
+PPL_SPECIALIZE_IS_INT(is_int_int, signed long long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned char)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned short)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned int)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long)
+PPL_SPECIALIZE_IS_INT(is_int_int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+assign_special_int(Type& v, Result_Class c, Rounding_Dir dir) {
+  PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+  switch (c) {
+  case VC_NAN:
+    if (Policy::has_nan) {
+      v = Extended_Int<Policy, Type>::not_a_number;
+      return V_NAN;
+    }
+    return V_NAN | V_UNREPRESENTABLE;
+  case VC_MINUS_INFINITY:
+    if (Policy::has_infinity) {
+      v = Extended_Int<Policy, Type>::minus_infinity;
+      return V_EQ_MINUS_INFINITY;
+    }
+    if (round_up(dir)) {
+      v = Extended_Int<Policy, Type>::min;
+      return V_LT_INF;
+    }
+    return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+  case VC_PLUS_INFINITY:
+    if (Policy::has_infinity) {
+      v = Extended_Int<Policy, Type>::plus_infinity;
+      return V_EQ_PLUS_INFINITY;
+    }
+    if (round_down(dir)) {
+      v = Extended_Int<Policy, Type>::max;
+      return V_GT_SUP;
+    }
+    return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN | V_UNREPRESENTABLE;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, signed long long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned char)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned short)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned int)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_int, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+          && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
+              || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
+    if (CHECK_P(To_Policy::check_overflow,
+                PPL_LT_SILENT(from,
+                              static_cast<From>(Extended_Int<To_Policy, To>::min))))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    if (CHECK_P(To_Policy::check_overflow,
+                PPL_GT_SILENT(from,
+                              static_cast<From>(Extended_Int<To_Policy, To>::max))))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_signed_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(From)) {
+    if (CHECK_P(To_Policy::check_overflow,
+                from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_overflow, from < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (sizeof(To) < sizeof(From)) {
+    if (CHECK_P(To_Policy::check_overflow,
+                from > static_cast<From>(Extended_Int<To_Policy, To>::max)))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(To) < sizeof(From)
+      || (sizeof(To) == sizeof(From)
+          && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
+    if (CHECK_P(To_Policy::check_overflow,
+                PPL_GT_SILENT(from,
+                              static_cast<From>(Extended_Int<To_Policy, To>::max))))
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = static_cast<To>(from);
+  return V_EQ;
+}
+
+
+#define PPL_ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Larger, Smaller)
+
+#define PPL_ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_unsigned_int, Smaller, Larger) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_signed_int, Larger, Smaller)
+
+#define PPL_ASSIGN_SIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_signed_int, Type, Type)
+#define PPL_ASSIGN_UNSIGNED(Type) \
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_unsigned_int, Type, Type)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_SIGNED(char)
+#endif
+PPL_ASSIGN_SIGNED(signed char)
+PPL_ASSIGN_SIGNED(signed short)
+PPL_ASSIGN_SIGNED(signed int)
+PPL_ASSIGN_SIGNED(signed long)
+PPL_ASSIGN_SIGNED(signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN_UNSIGNED(char)
+#endif
+PPL_ASSIGN_UNSIGNED(unsigned char)
+PPL_ASSIGN_UNSIGNED(unsigned short)
+PPL_ASSIGN_UNSIGNED(unsigned int)
+PPL_ASSIGN_UNSIGNED(unsigned long)
+PPL_ASSIGN_UNSIGNED(unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+PPL_ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(char, unsigned long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+PPL_ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(char, signed long long)
+#endif
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+PPL_ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(char, unsigned long long)
+#else
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, char)
+#endif
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+PPL_ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+#if 0
+  // FIXME: this is correct but it is inefficient and breaks the build
+  // for the missing definition of static const members (a problem present
+  // also in other areas of the PPL).
+  if (CHECK_P(To_Policy::check_overflow, lt(from, Extended_Int<To_Policy, To>::min)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, !le(from, Extended_Int<To_Policy, To>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+#else
+  if (CHECK_P(To_Policy::check_overflow, (from < Extended_Int<To_Policy, To>::min)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (CHECK_P(To_Policy::check_overflow, (from > Extended_Int<To_Policy, To>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+#endif
+  if (round_not_requested(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  From i_from = rint(from);
+  to = i_from;
+  if (from == i_from)
+    return V_EQ;
+  if (round_direct(ROUND_UP))
+    return round_lt_int<To_Policy>(to, dir);
+  if (round_direct(ROUND_DOWN))
+    return round_gt_int<To_Policy>(to, dir);
+  if (from < i_from)
+    return round_lt_int<To_Policy>(to, dir);
+  PPL_ASSERT(from > i_from);
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, float)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, float)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_int_float, char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, signed long long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned char, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned short, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned int, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long, long double)
+PPL_SPECIALIZE_ASSIGN(assign_int_float, unsigned long long, long double)
+
+#undef PPL_ASSIGN_SIGNED
+#undef PPL_ASSIGN_UNSIGNED
+#undef PPL_ASSIGN2_SIGNED_SIGNED
+#undef PPL_ASSIGN2_UNSIGNED_UNSIGNED
+#undef PPL_ASSIGN2_UNSIGNED_SIGNED
+#undef PPL_ASSIGN2_SIGNED_UNSIGNED
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (sizeof(To) <= sizeof(signed long)) {
+    if (!To_Policy::check_overflow) {
+      to = from.get_si();
+      return V_EQ;
+    }
+    if (from.fits_slong_p()) {
+      signed long v = from.get_si();
+      if (PPL_LT_SILENT(v, (Extended_Int<To_Policy, To>::min)))
+        return set_neg_overflow_int<To_Policy>(to, dir);
+      if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+        return set_pos_overflow_int<To_Policy>(to, dir);
+      to = v;
+      return V_EQ;
+    }
+  }
+  else {
+    mpz_srcptr m = from.get_mpz_t();
+    size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0) {
+        to = 0;
+        return V_EQ;
+      }
+      To v;
+      mpz_export(&v, 0, -1, sizeof(To), 0, 0, m);
+      if (v >= 0) {
+        if (::sgn(from) < 0)
+          return neg<To_Policy, To_Policy>(to, v, dir);
+        to = v;
+        return V_EQ;
+      }
+    }
+  }
+  return (::sgn(from) < 0)
+    ? set_neg_overflow_int<To_Policy>(to, dir)
+    : set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_signed_int_mpz, signed long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_overflow, ::sgn(from) < 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (sizeof(To) <= sizeof(unsigned long)) {
+    if (!To_Policy::check_overflow) {
+      to = static_cast<To>(from.get_ui());
+      return V_EQ;
+    }
+    if (from.fits_ulong_p()) {
+      const unsigned long v = from.get_ui();
+      if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
+        return set_pos_overflow_int<To_Policy>(to, dir);
+      to = static_cast<To>(v);
+      return V_EQ;
+    }
+  }
+  else {
+    const mpz_srcptr m = from.get_mpz_t();
+    const size_t sz = mpz_size(m);
+    if (sz <= sizeof(To) / sizeof(mp_limb_t)) {
+      if (sz == 0)
+        to = 0;
+      else
+        mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+      return V_EQ;
+    }
+  }
+  return set_pos_overflow_int<To_Policy>(to, dir);
+}
+
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, char, mpz_class)
+#endif
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned char, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned short, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned int, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename To>
+inline Result
+assign_int_mpq(To& to, const mpq_class& from, Rounding_Dir dir) {
+  mpz_srcptr n = from.get_num().get_mpz_t();
+  mpz_srcptr d = from.get_den().get_mpz_t();
+  PPL_DIRTY_TEMP(mpz_class, q);
+  mpz_ptr q_z = q.get_mpz_t();
+  if (round_not_requested(dir)) {
+    mpz_tdiv_q(q_z, n, d);
+    Result r = assign<To_Policy, void>(to, q, dir);
+    if (r != V_EQ)
+      return r;
+    return V_LGE;
+  }
+  mpz_t rem;
+  int sign;
+  mpz_init(rem);
+  mpz_tdiv_qr(q_z, rem, n, d);
+  sign = mpz_sgn(rem);
+  mpz_clear(rem);
+  Result r = assign<To_Policy, void>(to, q, dir);
+  if (r != V_EQ)
+    return r;
+  switch (sign) {
+  case -1:
+    return round_lt_int<To_Policy>(to, dir);
+  case 1:
+    return round_gt_int<To_Policy>(to, dir);
+  default:
+    return V_EQ;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, signed long long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned char, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned short, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned int, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_int_mpq, unsigned long long, mpq_class)
+
+#if ~0 != -1
+#error "Only two's complement is supported"
+#endif
+
+#if UCHAR_MAX == 0xff
+#define CHAR_BITS 8
+#else
+#error "Unexpected max for unsigned char"
+#endif
+
+#if USHRT_MAX == 0xffff
+#define SHRT_BITS 16
+#else
+#error "Unexpected max for unsigned short"
+#endif
+
+#if UINT_MAX == 0xffffffff
+#define INT_BITS 32
+#else
+#error "Unexpected max for unsigned int"
+#endif
+
+#if ULONG_MAX == 0xffffffffUL
+#define LONG_BITS 32
+#elif ULONG_MAX == 0xffffffffffffffffULL
+#define LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long"
+#endif
+
+#if ULLONG_MAX == 0xffffffffffffffffULL
+#define LONG_LONG_BITS 64
+#else
+#error "Unexpected max for unsigned long long"
+#endif
+
+
+template <typename T>
+struct Larger;
+
+// The following may be tuned for performance on specific architectures.
+//
+// Current guidelines:
+//   - avoid division where possible (larger type variant for mul)
+//   - use larger type variant for types smaller than architecture bit size
+
+template <>
+struct Larger<char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef int_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef int_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef int_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned char> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast16_t type_for_neg;
+  typedef uint_fast16_t type_for_add;
+  typedef int_fast16_t type_for_sub;
+  typedef uint_fast16_t type_for_mul;
+};
+
+template <>
+struct Larger<signed short> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef int_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef int_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned short> {
+  const_bool_nodef(use_for_neg, true);
+  const_bool_nodef(use_for_add, true);
+  const_bool_nodef(use_for_sub, true);
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast32_t type_for_neg;
+  typedef uint_fast32_t type_for_add;
+  typedef int_fast32_t type_for_sub;
+  typedef uint_fast32_t type_for_mul;
+};
+
+template <>
+struct Larger<signed int> {
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned int> {
+  const_bool_nodef(use_for_neg, (LONG_BITS == 64));
+  const_bool_nodef(use_for_add, (LONG_BITS == 64));
+  const_bool_nodef(use_for_sub, (LONG_BITS == 64));
+  const_bool_nodef(use_for_mul, true);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, (LONG_BITS == 32));
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<signed long long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef int_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef int_fast64_t type_for_mul;
+};
+
+template <>
+struct Larger<unsigned long long> {
+  const_bool_nodef(use_for_neg, false);
+  const_bool_nodef(use_for_add, false);
+  const_bool_nodef(use_for_sub, false);
+  const_bool_nodef(use_for_mul, false);
+  typedef int_fast64_t type_for_neg;
+  typedef uint_fast64_t type_for_add;
+  typedef int_fast64_t type_for_sub;
+  typedef uint_fast64_t type_for_mul;
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_int_larger(Type& to, const Type x, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_neg l = x;
+  l = -l;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_add l = x;
+  l += y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_sub l = x;
+  l -= y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_int_larger(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  typename Larger<Type>::type_for_mul l = x;
+  l *= y;
+  return assign<To_Policy, To_Policy>(to, l, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+              (from < -Extended_Int<To_Policy, Type>::max)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_neg)
+    return neg_int_larger<To_Policy, From_Policy>(to, from, dir);
+  if (CHECK_P(To_Policy::check_overflow, from != 0))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
+    if (y >= 0) {
+      if (x > Extended_Int<To_Policy, Type>::max - y)
+        return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else if (x < Extended_Int<To_Policy, Type>::min - y)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+  }
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_add)
+    return add_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+              (x > Extended_Int<To_Policy, Type>::max - y)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x + y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (To_Policy::check_overflow) {
+    if (y >= 0) {
+      if (x < Extended_Int<To_Policy, Type>::min + y)
+        return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+    else if (x > Extended_Int<To_Policy, Type>::max + y)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_sub)
+    return sub_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (CHECK_P(To_Policy::check_overflow,
+              (x < Extended_Int<To_Policy, Type>::min + y)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  to = x - y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  if (x >= 0) {
+    if (y > 0) {
+      if (x > Extended_Int<To_Policy, Type>::max / y)
+        return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else {
+      if (x > Extended_Int<To_Policy, Type>::min / y)
+        return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+  }
+  else {
+    if (y < 0) {
+      if (x < Extended_Int<To_Policy, Type>::max / y)
+        return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    else {
+      if (x < Extended_Int<To_Policy, Type>::min / y)
+        return set_neg_overflow_int<To_Policy>(to, dir);
+    }
+  }
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_overflow && Larger<Type>::use_for_mul)
+    return mul_int_larger<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+  if (!To_Policy::check_overflow) {
+    to = x * y;
+    return V_EQ;
+  }
+  if (y == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  if (x > Extended_Int<To_Policy, Type>::max / y)
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x * y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  if (round_not_requested(dir))
+    return V_LGE;
+  if (y == -1)
+    return V_EQ;
+  Type m = x % y;
+  if (m < 0)
+    return round_lt_int_no_overflow<To_Policy>(to, dir);
+  else if (m > 0)
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  if (round_not_requested(dir))
+    return V_GE;
+  Type m = x % y;
+  if (m == 0)
+    return V_EQ;
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+idiv_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  if (To_Policy::check_overflow && y == -1)
+    return neg_signed_int<To_Policy, From1_Policy>(to, x, dir);
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+idiv_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+rem_signed_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = (y == -1) ? 0 : (x % y);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+rem_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, y == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = x % y;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type))) {
+    to = 0;
+    if (round_not_requested(dir))
+      return V_GE;
+    if (x == 0)
+      return V_EQ;
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  }
+  to = x >> exp;
+  if (round_not_requested(dir))
+    return V_GE;
+  if (x & ((Type(1) << exp) - 1))
+    return round_gt_int_no_overflow<To_Policy>(to, dir);
+  else
+    return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (x < 0) {
+    if (exp >= sizeof_to_bits(sizeof(Type))) {
+      to = 0;
+      if (round_not_requested(dir))
+        return V_LE;
+      return round_lt_int_no_overflow<To_Policy>(to, dir);
+    }
+    typedef typename C_Integer<Type>::other_type UType;
+    UType ux = x;
+    ux = -ux;
+    to = ~Type(~-(ux >> exp));
+    if (round_not_requested(dir))
+      return V_LE;
+    if (ux & ((UType(1) << exp) -1))
+      return round_lt_int_no_overflow<To_Policy>(to, dir);
+    return V_EQ;
+  }
+  else {
+    if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+      to = 0;
+      if (round_not_requested(dir))
+        return V_GE;
+      if (x == 0)
+        return V_EQ;
+      return round_gt_int_no_overflow<To_Policy>(to, dir);
+    }
+    to = x >> exp;
+    if (round_not_requested(dir))
+      return V_GE;
+    if (x & ((Type(1) << exp) - 1))
+      return round_gt_int_no_overflow<To_Policy>(to, dir);
+    else
+      return V_EQ;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x + (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  Type n = Type(1) << exp;
+  return add_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x + (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+    Type n = -2 * (Type(1) << (exp - 1));
+    return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+  else {
+    Type n = Type(1) << exp;
+    return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x - (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  Type n = Type(1) << exp;
+  return sub_unsigned_int<To_Policy, From_Policy, void>(to, x, n, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x - (Type(1) << exp);
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    return set_neg_overflow_int<To_Policy>(to, dir);
+  if (exp == sizeof_to_bits(sizeof(Type)) - 1) {
+    Type n = -2 * (Type(1) << (exp - 1));
+    return add_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+  else {
+    Type n = Type(1) << exp;
+    return sub_signed_int<To_Policy, From_Policy, void>(to, x, n, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                      Rounding_Dir dir) {
+  if (!To_Policy::check_overflow) {
+    to = x << exp;
+    return V_EQ;
+  }
+  if (exp >= sizeof_to_bits(sizeof(Type))) {
+    if (x == 0) {
+      to = 0;
+      return V_EQ;
+    }
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  }
+  if (x > Extended_Int<To_Policy, Type>::max >> exp)
+    return set_pos_overflow_int<To_Policy>(to, dir);
+  to = x << exp;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                    Rounding_Dir dir) {
+  if (x < 0) {
+    if (!To_Policy::check_overflow) {
+      to = x * (Type(1) << exp);
+      return V_EQ;
+    }
+    if (exp >= sizeof_to_bits(sizeof(Type)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    typedef typename C_Integer<Type>::other_type UType;
+    UType mask = UType(-1) << (sizeof_to_bits(sizeof(Type)) - exp - 1);
+    UType ux = x;
+    if ((ux & mask) != mask)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    ux <<= exp;
+    Type n = ~(Type(~ux));
+    if (PPL_LT_SILENT(n, (Extended_Int<To_Policy, Type>::min)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    to = n;
+  }
+  else {
+    if (!To_Policy::check_overflow) {
+      to = x << exp;
+      return V_EQ;
+    }
+    if (exp >= sizeof_to_bits(sizeof(Type)) - 1) {
+      if (x == 0) {
+        to = 0;
+        return V_EQ;
+      }
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    }
+    if (x > Extended_Int<To_Policy, Type>::max >> exp)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    to = x << exp;
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                       Rounding_Dir dir) {
+  if (exp > sizeof_to_bits(sizeof(Type)))
+    to = x;
+  else {
+    Type v = (exp == sizeof_to_bits(sizeof(Type)) ? x : (x & ((Type(1) << exp) - 1)));
+    if (v >= (Type(1) << (exp - 1)))
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    else
+      to = v;
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                     Rounding_Dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    to = x;
+  else {
+    Type m = Type(1) << (exp - 1);
+    to = (x & (m - 1)) - (x & m);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
+                       Rounding_Dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type)))
+    to = x;
+  else
+    to = x & ((Type(1) << exp) - 1);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_signed_int(Type& to, const Type x, unsigned int exp,
+                     Rounding_Dir dir) {
+  if (exp >= sizeof_to_bits(sizeof(Type))) {
+    if (x < 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    to = x;
+  }
+  else
+    to = x & ((Type(1) << exp) - 1);
+  return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrt_rem(Type& q, Type& r, const Type from) {
+  q = 0;
+  r = from;
+  Type t(1);
+  for (t <<= sizeof_to_bits(sizeof(Type)) - 2; t != 0; t >>= 2) {
+    Type s = q + t;
+    if (s <= r) {
+      r -= s;
+      q = s + t;
+    }
+    q >>= 1;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+  Type rem;
+  isqrt_rem(to, rem, from);
+  if (round_not_requested(dir))
+    return V_GE;
+  if (rem == 0)
+    return V_EQ;
+  return round_gt_int<To_Policy>(to, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  return sqrt_unsigned_int<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+  switch (result_overflow(r)) {
+  case 0:
+    return add<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+  case -1:
+    if (to <= 0)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case 1:
+    if (to >= 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN;
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type z;
+  Result r = mul<To_Policy, From1_Policy, From2_Policy>(z, x, y, dir);
+  switch (result_overflow(r)) {
+  case 0:
+    return sub<To_Policy, To_Policy, To_Policy>(to, to, z, dir);
+  case -1:
+    if (to >= 0)
+      return set_pos_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+  case 1:
+    if (to <= 0)
+      return set_neg_overflow_int<To_Policy>(to, dir);
+    return assign_nan<To_Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN;
+  }
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_char(std::ostream& os, Type& from,
+            const Numeric_Format&, Rounding_Dir) {
+  os << int(from);
+  return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_int(std::ostream& os, Type& from, const Numeric_Format&, Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_FLOOR(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_FLOOR(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_CEIL(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_CEIL(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed char, signed char)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed short, signed short)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed int, signed int)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long, signed long)
+PPL_SPECIALIZE_TRUNC(assign_signed_int_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_TRUNC(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_signed_int, signed char, signed char)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed short, signed short)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed int, signed int)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long, signed long)
+PPL_SPECIALIZE_NEG(neg_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_NEG(neg_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_NEG(neg_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD(add_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD(add_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD(add_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD(add_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD(add_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB(sub_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB(sub_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB(sub_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_MUL(mul_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL(mul_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL(mul_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_DIV(div_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_DIV(div_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_DIV(div_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV(div_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV(div_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_IDIV(idiv_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_IDIV(idiv_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_signed_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_signed_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_REM(rem_signed_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_REM(rem_signed_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_REM(rem_signed_int, signed long long, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_REM(rem_unsigned_int, char, char, char)
+#endif
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_REM(rem_unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed char, signed char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed short, signed short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed int, signed int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long, signed long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed char, signed char)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed short, signed short)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed int, signed int)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long, signed long)
+PPL_SPECIALIZE_SQRT(sqrt_signed_int, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_SQRT(sqrt_unsigned_int, unsigned long long, unsigned long long)
+
+#if PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(abs_generic, char, char)
+#endif
+PPL_SPECIALIZE_ABS(abs_generic, signed char, signed char)
+PPL_SPECIALIZE_ABS(abs_generic, signed short, signed short)
+PPL_SPECIALIZE_ABS(abs_generic, signed int, signed int)
+PPL_SPECIALIZE_ABS(abs_generic, signed long, signed long)
+PPL_SPECIALIZE_ABS(abs_generic, signed long long, signed long long)
+#if !PPL_CXX_PLAIN_CHAR_IS_SIGNED
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, char, char)
+#endif
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned char, unsigned char)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned short, unsigned short)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long, unsigned long)
+PPL_SPECIALIZE_ABS(assign_unsigned_int_unsigned_int, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCD(gcd_exact, char, char, char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCD(gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCD(gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCD(gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCD(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, char, char, char, char, char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed char, signed char, signed char, signed char, signed char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed short, signed short, signed short, signed short, signed short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed int, signed int, signed int, signed int, signed int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long, signed long, signed long, signed long, signed long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, char, char, char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed char, signed char, signed char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed short, signed short, signed short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed int, signed int, signed int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long, signed long, signed long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SGN(sgn_generic, char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed char)
+PPL_SPECIALIZE_SGN(sgn_generic, signed short)
+PPL_SPECIALIZE_SGN(sgn_generic, signed int)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long)
+PPL_SPECIALIZE_SGN(sgn_generic, signed long long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned char)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned short)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned int)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long)
+PPL_SPECIALIZE_SGN(sgn_generic, unsigned long long)
+
+PPL_SPECIALIZE_CMP(cmp_generic, char, char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed char, signed char)
+PPL_SPECIALIZE_CMP(cmp_generic, signed short, signed short)
+PPL_SPECIALIZE_CMP(cmp_generic, signed int, signed int)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long, signed long)
+PPL_SPECIALIZE_CMP(cmp_generic, signed long long, signed long long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned char, unsigned char)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned short, unsigned short)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned int, unsigned int)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long, unsigned long)
+PPL_SPECIALIZE_CMP(cmp_generic, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, char, char, char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_ADD_MUL(add_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, char, char, char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed char, signed char, signed char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed short, signed short, signed short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed int, signed int, signed int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long, signed long, signed long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, signed long long, signed long long, signed long long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned char, unsigned char, unsigned char)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned short, unsigned short, unsigned short)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned int, unsigned int, unsigned int)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long, unsigned long, unsigned long)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_int, unsigned long long, unsigned long long, unsigned long long)
+
+PPL_SPECIALIZE_INPUT(input_generic, char)
+PPL_SPECIALIZE_INPUT(input_generic, signed char)
+PPL_SPECIALIZE_INPUT(input_generic, signed short)
+PPL_SPECIALIZE_INPUT(input_generic, signed int)
+PPL_SPECIALIZE_INPUT(input_generic, signed long)
+PPL_SPECIALIZE_INPUT(input_generic, signed long long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned char)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned short)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned int)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long)
+PPL_SPECIALIZE_INPUT(input_generic, unsigned long long)
+
+PPL_SPECIALIZE_OUTPUT(output_char, char)
+PPL_SPECIALIZE_OUTPUT(output_char, signed char)
+PPL_SPECIALIZE_OUTPUT(output_int, signed short)
+PPL_SPECIALIZE_OUTPUT(output_int, signed int)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long)
+PPL_SPECIALIZE_OUTPUT(output_int, signed long long)
+PPL_SPECIALIZE_OUTPUT(output_char, unsigned char)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned short)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned int)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long)
+PPL_SPECIALIZE_OUTPUT(output_int, unsigned long long)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_float_inlines.hh line 1. */
+/* Specialized "checked" functions for native floating-point numbers.
+*/
+
+
+/* Automatically generated from PPL source file ../src/checked_float_inlines.hh line 28. */
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+multiply_add(float x, float y, float z) {
+#if PPL_HAVE_DECL_FMAF && defined(FP_FAST_FMAF) \
+  && !defined(__alpha) && !defined(__FreeBSD__)
+  return fmaf(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline double
+multiply_add(double x, double y, double z) {
+#if PPL_HAVE_DECL_FMA && defined(FP_FAST_FMA) \
+  && !defined(__alpha) && !defined(__FreeBSD__)
+  return fma(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+inline long double
+multiply_add(long double x, long double y, long double z) {
+#if PPL_HAVE_DECL_FMAL && defined(FP_FAST_FMAL) \
+  && !defined(__alpha) && !defined(__FreeBSD__)
+  return fmal(x, y, z);
+#else
+  return x*y + z;
+#endif
+}
+
+#if PPL_HAVE_DECL_RINTF
+inline float
+round_to_integer(float x) {
+  return rintf(x);
+}
+#endif
+
+inline double
+round_to_integer(double x) {
+  return rint(x);
+}
+
+#if PPL_HAVE_DECL_RINTL
+inline long double
+round_to_integer(long double x) {
+  return rintl(x);
+}
+#elif !PPL_CXX_PROVIDES_PROPER_LONG_DOUBLE
+// If proper long doubles are not provided, this is most likely
+// because long double and double are the same type: use rint().
+inline long double
+round_to_integer(long double x) {
+  return rint(x);
+}
+#elif defined(__i386__) && (defined(__GNUC__) || defined(__INTEL_COMPILER))
+// On Cygwin, we have proper long doubles but rintl() is not defined:
+// luckily, one machine instruction is enough to save the day.
+inline long double
+round_to_integer(long double x) {
+  long double i;
+  __asm__ ("frndint" : "=t" (i) : "0" (x));
+  return i;
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+  return round_direct(dir) || round_not_requested(dir);
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+  return round_inverse(dir);
+}
+
+// The FPU mode is "round down".
+//
+// The result of the rounded down multiplication is thus computed directly.
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = a * b = 0.03
+//   c = c_i = 0.0
+//
+// To obtain the result of the rounded up multiplication
+// we do -(-a * b).
+//
+//   a = 0.3
+//   b = 0.1
+//   c_i = -a * b = -0.03
+//
+// Here c_i should be forced to lose excess precision, otherwise the
+// FPU will truncate using the rounding mode in force, which is "round down".
+//
+//   c_i = -c_i = 0.03
+//   c = c_i = 0.0
+//
+// Wrong result: we should have obtained c = 0.1.
+
+inline void
+limit_precision(const float& v) {
+  PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const double& v) {
+  PPL_CC_FLUSH(v);
+}
+
+inline void
+limit_precision(const long double&) {
+}
+
+template <typename Policy, typename T>
+inline Result
+classify_float(const T v, bool nan, bool inf, bool sign) {
+  Float<T> f(v);
+  if ((nan || sign) && CHECK_P(Policy::has_nan, f.u.binary.is_nan()))
+    return V_NAN;
+  if (inf) {
+    if (Policy::has_infinity) {
+      int sign_inf = f.u.binary.inf_sign();
+      if (sign_inf < 0)
+        return V_EQ_MINUS_INFINITY;
+      if (sign_inf > 0)
+        return V_EQ_PLUS_INFINITY;
+    }
+    else
+      PPL_ASSERT(f.u.binary.inf_sign() == 0);
+  }
+  if (sign) {
+    if (v < 0)
+      return V_LT;
+    if (v > 0)
+      return V_GT;
+    return V_EQ;
+  }
+  return V_LGE;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_nan, f.u.binary.is_nan());
+}
+
+template <typename Policy, typename T>
+inline bool
+is_inf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() != 0));
+}
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() < 0));
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+  Float<T> f(v);
+  return CHECK_P(Policy::has_infinity, (f.u.binary.inf_sign() > 0));
+}
+
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+  return round_to_integer(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_special_float(T& v, Result_Class c, Rounding_Dir) {
+  PPL_ASSERT(c == VC_MINUS_INFINITY || c == VC_PLUS_INFINITY || c == VC_NAN);
+  switch (c) {
+  case VC_MINUS_INFINITY:
+    v = -HUGE_VAL;
+    return V_EQ_MINUS_INFINITY;
+  case VC_PLUS_INFINITY:
+    v = HUGE_VAL;
+    return V_EQ_PLUS_INFINITY;
+  case VC_NAN:
+    v = PPL_NAN;
+    return V_NAN;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN | V_UNREPRESENTABLE;
+  }
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+  Float<T> f(v);
+  PPL_ASSERT(!f.u.binary.is_nan());
+  PPL_ASSERT(f.u.binary.inf_sign() >= 0);
+  if (f.u.binary.zero_sign() > 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename T>
+inline void
+succ_float(T& v) {
+  Float<T> f(v);
+  PPL_ASSERT(!f.u.binary.is_nan());
+  PPL_ASSERT(f.u.binary.inf_sign() <= 0);
+  if (f.u.binary.zero_sign() < 0) {
+    f.u.binary.negate();
+    f.u.binary.inc();
+  }
+  else if (!f.u.binary.sign_bit()) {
+    f.u.binary.inc();
+  }
+  else {
+    f.u.binary.dec();
+  }
+  v = f.value();
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_float(To& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    pred_float(to);
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_float(To& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    succ_float(to);
+    return V_LT;
+  }
+  return V_GT;
+}
+
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact
+      && !round_not_needed(dir) && round_strict_relation(dir))
+    fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+  if (Policy::fpu_check_inexact
+      && !round_not_needed(dir) && round_strict_relation(dir)) {
+    switch (fpu_check_inexact()) {
+    case 0:
+      return V_EQ;
+    case -1:
+      goto unknown;
+    case 1:
+      break;
+    }
+    switch (round_dir(dir)) {
+    case ROUND_DOWN:
+      return V_GT;
+    case ROUND_UP:
+      return V_LT;
+    default:
+      return V_NE;
+    }
+  }
+  else {
+  unknown:
+    switch (round_dir(dir)) {
+    case ROUND_DOWN:
+      return V_GE;
+    case ROUND_UP:
+      return V_LE;
+    default:
+      return V_LGE;
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  to = from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else if (fpu_inverse_rounding(dir)) {
+    From tmp = -from;
+    to = tmp;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(from);
+    to = from;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof(From) > sizeof(To))
+    return assign_float_float_inexact<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign_float_float_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+floor_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (fpu_direct_rounding(ROUND_DOWN))
+    to = round_to_integer(from);
+  else if (fpu_inverse_rounding(ROUND_DOWN)) {
+    to = round_to_integer(-from);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(ROUND_DOWN));
+    limit_precision(from);
+    to = round_to_integer(from);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+ceil_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (fpu_direct_rounding(ROUND_UP))
+    to = round_to_integer(from);
+  else if (fpu_inverse_rounding(ROUND_UP)) {
+    to = round_to_integer(-from);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(ROUND_UP));
+    limit_precision(from);
+    to = round_to_integer(from);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+trunc_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (from >= 0)
+    return floor<To_Policy, From_Policy>(to, from, dir);
+  else
+    return ceil<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  to = -from;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_add_inf
+      && is_inf_float<From1_Policy>(x) && x == -y) {
+    return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x + y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = -x - y;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x + y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_sub_inf
+      && is_inf_float<From1_Policy>(x) && x == y) {
+    return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x - y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = y - x;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x - y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y))
+          ||
+          (y == 0 && is_inf_float<From1_Policy>(x)))) {
+    return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x * y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = x * -y;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x * y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_div_inf
+      && is_inf_float<From1_Policy>(x) && is_inf_float<From2_Policy>(y)) {
+    return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+  }
+  if (To_Policy::check_div_zero && y == 0) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = x / y;
+  else if (fpu_inverse_rounding(dir)) {
+    to = x / -y;
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    to = x / y;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+idiv_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  Type temp;
+  // The inexact check is useless
+  dir = round_dir(dir);
+  Result r = div<To_Policy, From1_Policy, From2_Policy>(temp, x, y, dir);
+  if (result_class(r) != VC_NORMAL) {
+    to = temp;
+    return r;
+  }
+  Result r1 = trunc<To_Policy, To_Policy>(to, temp, ROUND_NOT_NEEDED);
+  PPL_ASSERT(r1 == V_EQ);
+  if (r == V_EQ || to != temp)
+    return r1;
+  // FIXME: Prove that it is impossible to return a strict relation
+  return (dir == ROUND_UP) ? V_LE : V_GE;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+  if (To_Policy::check_inf_mod && is_inf_float<From1_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  if (To_Policy::check_div_zero && y == 0) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = std::fmod(x, y);
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return V_EQ;
+}
+
+struct Float_2exp {
+  const_bool_nodef(has_nan, false);
+  const_bool_nodef(has_infinity, false);
+};
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+add_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    add<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sub_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    sub<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+mul_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    mul<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+div_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  return
+    div<To_Policy, From_Policy, Float_2exp>(to,
+                                            x,
+                                            Type(1ULL << exp),
+                                            dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+smod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  Type m = 1ULL << exp;
+  rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+  Type m2 = m / 2;
+  if (to < -m2)
+    return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+  else if (to >= m2)
+    return sub_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+umod_2exp_float(Type& to, const Type x, unsigned int exp, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (To_Policy::check_inf_mod && is_inf_float<From_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  PPL_ASSERT(exp < sizeof_to_bits(sizeof(unsigned long long)));
+  Type m = 1ULL << exp;
+  rem_float<To_Policy, From_Policy, Float_2exp>(to, x, m, ROUND_IGNORE);
+  if (to < 0)
+    return add_float<To_Policy, From_Policy, Float_2exp>(to, to, m, dir);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  to = std::abs(from);
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+  if (To_Policy::fpu_check_nan_result && is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (To_Policy::check_sqrt_neg && from < 0) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = std::sqrt(from);
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(from);
+    to = std::sqrt(from);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_float(const Type x) {
+  if (x > 0)
+    return VR_GT;
+  if (x < 0)
+    return VR_LT;
+  if (x == 0)
+    return VR_EQ;
+  return VR_EMPTY;
+}
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_float(const Type x, const Type y) {
+  if (x > y)
+    return VR_GT;
+  if (x < y)
+    return VR_LT;
+  if (x == y)
+    return VR_EQ;
+  return VR_EMPTY;
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = from;
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    to = from;
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From_Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+  if (sizeof_to_bits(sizeof(From)) > Float<To>::Binary::MANTISSA_BITS)
+    return assign_float_int_inexact<To_Policy, From_Policy>(to, from, dir);
+  else
+    return assign_exact<To_Policy, From_Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_UP:
+    {
+      Float<T> f;
+      f.u.binary.set_max(true);
+      to = f.value();
+      return V_LT_INF;
+    }
+  case ROUND_DOWN: // Fall through.
+  case ROUND_IGNORE:
+    to = -HUGE_VAL;
+    return V_GT_MINUS_INFINITY;
+  default:
+    PPL_UNREACHABLE;
+    return V_GT_MINUS_INFINITY;
+  }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+  switch (round_dir(dir)) {
+  case ROUND_DOWN:
+    {
+      Float<T> f;
+      f.u.binary.set_max(false);
+      to = f.value();
+      return V_GT_SUP;
+    }
+  case ROUND_UP: // Fall through.
+  case ROUND_IGNORE:
+    to = HUGE_VAL;
+    return V_LT_PLUS_INFINITY;
+  default:
+    PPL_UNREACHABLE;
+    return V_LT_PLUS_INFINITY;
+  }
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& from, Rounding_Dir dir) {
+  int sign = sgn(from);
+  if (sign == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  mpz_srcptr from_z = from.get_mpz_t();
+  size_t exponent = mpz_sizeinbase(from_z, 2) - 1;
+  if (exponent > size_t(Float<T>::Binary::EXPONENT_MAX)) {
+    if (sign < 0)
+      return set_neg_overflow_float<To_Policy>(to, dir);
+    else
+      return set_pos_overflow_float<To_Policy>(to, dir);
+  }
+  unsigned long zeroes = mpn_scan1(from_z->_mp_d, 0);
+  size_t meaningful_bits = exponent - zeroes;
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  if (exponent > Float<T>::Binary::MANTISSA_BITS)
+    mpz_tdiv_q_2exp(mantissa,
+                    from_z,
+                    exponent - Float<T>::Binary::MANTISSA_BITS);
+  else
+    mpz_mul_2exp(mantissa, from_z, Float<T>::Binary::MANTISSA_BITS - exponent);
+  Float<T> f;
+  f.u.binary.build(sign < 0, mantissa, static_cast<long>(exponent));
+  mpz_clear(mantissa);
+  to = f.value();
+  if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+    if (sign < 0)
+      return round_lt_float<To_Policy>(to, dir);
+    else
+      return round_gt_float<To_Policy>(to, dir);
+  }
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From_Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir) {
+  const mpz_class& numer = from.get_num();
+  const mpz_class& denom = from.get_den();
+  if (denom == 1)
+    return assign_float_mpz<To_Policy, From_Policy>(to, numer, dir);
+  mpz_srcptr numer_z = numer.get_mpz_t();
+  mpz_srcptr denom_z = denom.get_mpz_t();
+  int sign = sgn(numer);
+  long exponent = static_cast<long>(mpz_sizeinbase(numer_z, 2))
+    - static_cast<long>(mpz_sizeinbase(denom_z, 2));
+  if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+    to = 0;
+  inexact:
+    if (sign < 0)
+      return round_lt_float<To_Policy>(to, dir);
+    else
+      return round_gt_float<To_Policy>(to, dir);
+  }
+  if (exponent > Float<T>::Binary::EXPONENT_MAX + 1) {
+  overflow:
+    if (sign < 0)
+      return set_neg_overflow_float<To_Policy>(to, dir);
+    else
+      return set_pos_overflow_float<To_Policy>(to, dir);
+  }
+  unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+  if (exponent < Float<T>::Binary::EXPONENT_MIN) {
+    long diff = Float<T>::Binary::EXPONENT_MIN - exponent;
+    needed_bits -= static_cast<unsigned int>(diff);
+  }
+  mpz_t mantissa;
+  mpz_init(mantissa);
+  {
+    long shift = static_cast<long>(needed_bits) - exponent;
+    if (shift > 0) {
+      mpz_mul_2exp(mantissa, numer_z, static_cast<unsigned long>(shift));
+      numer_z = mantissa;
+    }
+    else if (shift < 0) {
+      shift = -shift;
+      mpz_mul_2exp(mantissa, denom_z, static_cast<unsigned long>(shift));
+      denom_z = mantissa;
+    }
+  }
+  mpz_t r;
+  mpz_init(r);
+  mpz_tdiv_qr(mantissa, r, numer_z, denom_z);
+  size_t bits = mpz_sizeinbase(mantissa, 2);
+  bool inexact = (mpz_sgn(r) != 0);
+  mpz_clear(r);
+  if (bits == needed_bits + 1) {
+    inexact = (inexact || mpz_odd_p(mantissa));
+    mpz_tdiv_q_2exp(mantissa, mantissa, 1);
+  }
+  else
+    --exponent;
+  if (exponent > Float<T>::Binary::EXPONENT_MAX) {
+    mpz_clear(mantissa);
+    goto overflow;
+  }
+  else if (exponent < Float<T>::Binary::EXPONENT_MIN - 1) {
+    // Denormalized.
+    exponent = Float<T>::Binary::EXPONENT_MIN - 1;
+  }
+  Float<T> f;
+  f.u.binary.build(sign < 0, mantissa, exponent);
+  mpz_clear(mantissa);
+  to = f.value();
+  if (inexact)
+    goto inexact;
+  return V_EQ;
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y))
+          ||
+          (y == 0 && is_inf_float<From1_Policy>(x)))) {
+    return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+  }
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = multiply_add(x, y, to);
+  else if (fpu_inverse_rounding(dir)) {
+    to = multiply_add(-x, y, -to);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    limit_precision(to);
+    to = multiply_add(x, y, to);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+  if (To_Policy::check_inf_mul_zero
+      && ((x == 0 && is_inf_float<From2_Policy>(y))
+          ||
+          (y == 0 && is_inf_float<From1_Policy>(x)))) {
+    return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+  }
+  // FIXME: missing check_inf_add_inf
+  prepare_inexact<To_Policy>(dir);
+  if (fpu_direct_rounding(dir))
+    to = multiply_add(x, -y, to);
+  else if (fpu_inverse_rounding(dir)) {
+    to = multiply_add(x, y, -to);
+    limit_precision(to);
+    to = -to;
+  }
+  else {
+    fpu_rounding_control_word_type old
+      = fpu_save_rounding_direction(round_fpu_dir(dir));
+    limit_precision(x);
+    limit_precision(y);
+    limit_precision(to);
+    to = multiply_add(x, -y, to);
+    limit_precision(to);
+    fpu_restore_rounding_direction(old);
+  }
+  if (To_Policy::fpu_check_nan_result && is_nan<To_Policy>(to))
+    return V_NAN;
+  return result_relation<To_Policy>(dir);
+}
+
+template <typename From>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const From from) {
+  to = from;
+}
+
+template <>
+inline void
+assign_mpq_numeric_float(mpq_class& to, const long double from) {
+  to = 0;
+  if (from == 0.0L)
+    return;
+  mpz_class& num = to.get_num();
+  mpz_class& den = to.get_den();
+  int exp;
+  long double n = std::frexp(from, &exp);
+  bool neg = false;
+  if (n < 0.0L) {
+    neg = true;
+    n = -n;
+  }
+  const long double mult = static_cast<long double>(ULONG_MAX) + 1.0L;
+  const unsigned int bits = sizeof(unsigned long) * CHAR_BIT;
+  while (true) {
+    n *= mult;
+    exp -= bits;
+    const long double intpart = std::floor(n);
+    num += static_cast<unsigned long>(intpart);
+    n -= intpart;
+    if (n == 0.0L)
+      break;
+    num <<= bits;
+  }
+  if (exp < 0)
+    den <<= -exp;
+  else
+    num <<= exp;
+  if (neg)
+    to = -to;
+  to.canonicalize();
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_float(std::ostream& os, const Type from, const Numeric_Format&,
+             Rounding_Dir) {
+  if (from == 0)
+    os << "0";
+  else if (is_minf<Policy>(from))
+    os << "-inf";
+  else if (is_pinf<Policy>(from))
+    os << "+inf";
+  else if (is_nan<Policy>(from))
+    os << "nan";
+  else {
+    mpq_class q;
+    assign_mpq_numeric_float(q, from);
+    std::string s = float_mpq_to_string(q);
+    os << s;
+  }
+  return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float, double, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_ASSIGN(assign_float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_CLASSIFY(classify_float, float)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, float)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, float)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, float)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, float)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, float, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, float, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, float, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, float)
+PPL_SPECIALIZE_IS_INT(is_int_float, float)
+PPL_SPECIALIZE_FLOOR(floor_float, float, float)
+PPL_SPECIALIZE_CEIL(ceil_float, float, float)
+PPL_SPECIALIZE_TRUNC(trunc_float, float, float)
+PPL_SPECIALIZE_NEG(neg_float, float, float)
+PPL_SPECIALIZE_ABS(abs_float, float, float)
+PPL_SPECIALIZE_ADD(add_float, float, float, float)
+PPL_SPECIALIZE_SUB(sub_float, float, float, float)
+PPL_SPECIALIZE_MUL(mul_float, float, float, float)
+PPL_SPECIALIZE_DIV(div_float, float, float, float)
+PPL_SPECIALIZE_REM(rem_float, float, float, float)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, float, float)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, float, float)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, float, float)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, float, float)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, float, float)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, float, float)
+PPL_SPECIALIZE_SQRT(sqrt_float, float, float)
+PPL_SPECIALIZE_GCD(gcd_exact, float, float, float)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, float, float, float, float, float)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, float, float, float)
+PPL_SPECIALIZE_SGN(sgn_float, float)
+PPL_SPECIALIZE_CMP(cmp_float, float, float)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, float, float, float)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, float, float, float)
+PPL_SPECIALIZE_INPUT(input_generic, float)
+PPL_SPECIALIZE_OUTPUT(output_float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, double)
+PPL_SPECIALIZE_IS_INT(is_int_float, double)
+PPL_SPECIALIZE_FLOOR(floor_float, double, double)
+PPL_SPECIALIZE_CEIL(ceil_float, double, double)
+PPL_SPECIALIZE_TRUNC(trunc_float, double, double)
+PPL_SPECIALIZE_NEG(neg_float, double, double)
+PPL_SPECIALIZE_ABS(abs_float, double, double)
+PPL_SPECIALIZE_ADD(add_float, double, double, double)
+PPL_SPECIALIZE_SUB(sub_float, double, double, double)
+PPL_SPECIALIZE_MUL(mul_float, double, double, double)
+PPL_SPECIALIZE_DIV(div_float, double, double, double)
+PPL_SPECIALIZE_REM(rem_float, double, double, double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, double, double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, double, double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, double, double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, double, double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, double, double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, double, double)
+PPL_SPECIALIZE_SQRT(sqrt_float, double, double)
+PPL_SPECIALIZE_GCD(gcd_exact, double, double, double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, double, double, double, double, double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, double, double, double)
+PPL_SPECIALIZE_SGN(sgn_float, double)
+PPL_SPECIALIZE_CMP(cmp_float, double, double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, double, double, double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, double, double, double)
+PPL_SPECIALIZE_INPUT(input_generic, double)
+PPL_SPECIALIZE_OUTPUT(output_float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_CLASSIFY(classify_float, long double)
+PPL_SPECIALIZE_IS_NAN(is_nan_float, long double)
+PPL_SPECIALIZE_IS_MINF(is_minf_float, long double)
+PPL_SPECIALIZE_IS_PINF(is_pinf_float, long double)
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_float, long double)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, signed long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long)
+PPL_SPECIALIZE_ASSIGN(assign_float_int, long double, unsigned long long)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpz, long double, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_float_mpq, long double, mpq_class)
+PPL_SPECIALIZE_COPY(copy_generic, long double)
+PPL_SPECIALIZE_IS_INT(is_int_float, long double)
+PPL_SPECIALIZE_FLOOR(floor_float, long double, long double)
+PPL_SPECIALIZE_CEIL(ceil_float, long double, long double)
+PPL_SPECIALIZE_TRUNC(trunc_float, long double, long double)
+PPL_SPECIALIZE_NEG(neg_float, long double, long double)
+PPL_SPECIALIZE_ABS(abs_float, long double, long double)
+PPL_SPECIALIZE_ADD(add_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB(sub_float, long double, long double, long double)
+PPL_SPECIALIZE_MUL(mul_float, long double, long double, long double)
+PPL_SPECIALIZE_DIV(div_float, long double, long double, long double)
+PPL_SPECIALIZE_REM(rem_float, long double, long double, long double)
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_float, long double, long double)
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_float, long double, long double)
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_float, long double, long double)
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_float, long double, long double)
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_float, long double, long double)
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_float, long double, long double)
+PPL_SPECIALIZE_SQRT(sqrt_float, long double, long double)
+PPL_SPECIALIZE_GCD(gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_GCDEXT(gcdext_exact, long double, long double, long double,
+                  long double, long double)
+PPL_SPECIALIZE_LCM(lcm_gcd_exact, long double, long double, long double)
+PPL_SPECIALIZE_SGN(sgn_float, long double)
+PPL_SPECIALIZE_CMP(cmp_float, long double, long double)
+PPL_SPECIALIZE_ADD_MUL(add_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_SUB_MUL(sub_mul_float, long double, long double, long double)
+PPL_SPECIALIZE_INPUT(input_generic, long double)
+PPL_SPECIALIZE_OUTPUT(output_float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_mpz_inlines.hh line 1. */
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+*/
+
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (round_down(dir)) {
+    --to;
+    return V_GT;
+  }
+  return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+  if (round_up(dir)) {
+    ++to;
+    return V_LT;
+  }
+  return V_GT;
+}
+
+#ifdef PPL_HAVE_TYPEOF
+//! Type of the _mp_size field of GMP's __mpz_struct.
+typedef typeof(__mpz_struct()._mp_size) mp_size_field_t;
+#else
+//! This is assumed to be the type of the _mp_size field of GMP's __mpz_struct.
+typedef int mp_size_field_t;
+#endif
+
+inline mp_size_field_t
+get_mp_size(const mpz_class &v) {
+  return v.get_mpz_t()->_mp_size;
+}
+
+inline void
+set_mp_size(mpz_class &v, mp_size_field_t size) {
+  v.get_mpz_t()->_mp_size = size;
+}
+
+template <typename Policy>
+inline Result
+classify_mpz(const mpz_class& v, bool nan, bool inf, bool sign) {
+  if (Policy::has_nan || Policy::has_infinity) {
+    mp_size_field_t s = get_mp_size(v);
+    if (Policy::has_nan
+        && (nan || sign)
+        && s == C_Integer<mp_size_field_t>::min + 1)
+      return V_NAN;
+    if (!inf && !sign)
+      return V_LGE;
+    if (Policy::has_infinity) {
+      if (s == C_Integer<mp_size_field_t>::min)
+        return inf ? V_EQ_MINUS_INFINITY : V_LT;
+      if (s == C_Integer<mp_size_field_t>::max)
+        return inf ? V_EQ_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return static_cast<Result>(sgn<Policy>(v));
+  return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+  return Policy::has_nan
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min + 1;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::min;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+  return Policy::has_infinity
+    && get_mp_size(v) == C_Integer<mp_size_field_t>::max;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+  return !is_nan<Policy>(v);
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpz(mpz_class& v, Result_Class c, Rounding_Dir) {
+  switch (c) {
+  case VC_NAN:
+    if (Policy::has_nan)
+      set_mp_size(v, C_Integer<mp_size_field_t>::min + 1);
+    return V_NAN;
+  case VC_MINUS_INFINITY:
+    if (Policy::has_infinity) {
+      set_mp_size(v, C_Integer<mp_size_field_t>::min);
+      return V_EQ_MINUS_INFINITY;
+    }
+    return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+  case VC_PLUS_INFINITY:
+    if (Policy::has_infinity) {
+      set_mp_size(v, C_Integer<mp_size_field_t>::max);
+      return V_EQ_PLUS_INFINITY;
+    }
+    return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+  if (is_nan_mpz<From_Policy>(from))
+    PPL_ASSERT(To_Policy::has_nan);
+  else if (is_minf_mpz<From_Policy>(from) || is_pinf_mpz<From_Policy>(from))
+    PPL_ASSERT(To_Policy::has_infinity);
+  else {
+    to = from;
+    return;
+  }
+  set_mp_size(to, get_mp_size(from));
+}
+
+PPL_SPECIALIZE_COPY(copy_mpz, mpz_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+    new (&to) mpz_class(from);
+    return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_base, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpz_float(mpz_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  if (round_not_requested(dir)) {
+    new (&to) mpz_class(from);
+    return V_LGE;
+  }
+  From n = rint(from);
+  new (&to) mpz_class(n);
+  if (from == n)
+    return V_EQ;
+  if (from < 0)
+    return round_lt_mpz<To_Policy>(to, dir);
+  else
+    return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpz_float, mpz_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpz_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_signed_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+  }
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_signed_int, mpz_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_unsigned_int(mpz_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else
+    mpz_import(to.get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  if (round_not_requested(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  From i_from = rint(from);
+  to = i_from;
+  if (from == i_from)
+    return V_EQ;
+  if (round_direct(ROUND_UP))
+    return round_lt_mpz<To_Policy>(to, dir);
+  if (round_direct(ROUND_DOWN))
+    return round_gt_mpz<To_Policy>(to, dir);
+  if (from < i_from)
+    return round_lt_mpz<To_Policy>(to, dir);
+  if (from > i_from)
+    return round_gt_mpz<To_Policy>(to, dir);
+  PPL_UNREACHABLE;
+  return V_NAN;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpz_float, mpz_class, double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpz_long_double(mpz_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  // FIXME: this is an incredibly inefficient implementation!
+  std::stringstream ss;
+  output<From_Policy>(ss, from, Numeric_Format(), dir);
+  PPL_DIRTY_TEMP(mpq_class, tmp);
+#ifndef NDEBUG
+  Result r =
+#endif
+    input_mpq(tmp, ss);
+  PPL_ASSERT(r == V_EQ);
+  return assign<To_Policy, From_Policy>(to, tmp, dir);
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_long_double, mpz_class, long double)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (round_not_needed(dir)) {
+    to = from.get_num();
+    return V_LGE;
+  }
+  if (round_ignore(dir)) {
+    to = from;
+    return V_LGE;
+  }
+  const mpz_srcptr n = from.get_num().get_mpz_t();
+  const mpz_srcptr d = from.get_den().get_mpz_t();
+  if (round_down(dir)) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+    return V_GE;
+  }
+  else {
+    PPL_ASSERT(round_up(dir));
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+    return V_LE;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpz_mpq, mpz_class, mpq_class)
+
+PPL_SPECIALIZE_FLOOR(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_CEIL(assign_exact, mpz_class, mpz_class)
+PPL_SPECIALIZE_TRUNC(assign_exact, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  mpz_neg(to.get_mpz_t(), from.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+        Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  const mpz_srcptr n = x.get_mpz_t();
+  const mpz_srcptr d = y.get_mpz_t();
+  if (round_not_needed(dir)) {
+    mpz_divexact(to.get_mpz_t(), n, d);
+    return V_LGE;
+  }
+  if (round_ignore(dir)) {
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    return V_LE;
+  }
+  if (round_down(dir)) {
+    mpz_fdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_GT;
+    return V_GE;
+  }
+  else {
+    PPL_ASSERT(round_up(dir));
+    mpz_cdiv_q(to.get_mpz_t(), n, d);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_p(n, d) != 0) ? V_EQ : V_LT;
+    return V_LE;
+  }
+}
+
+PPL_SPECIALIZE_DIV(div_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+        Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  mpz_srcptr n = x.get_mpz_t();
+  mpz_srcptr d = y.get_mpz_t();
+  mpz_tdiv_q(to.get_mpz_t(), n, d);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, ::sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  to = x % y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x + v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x - v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir) {
+  mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+             Rounding_Dir dir) {
+  const mpz_srcptr n = x.get_mpz_t();
+  if (round_not_requested(dir)) {
+    mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+    return V_LGE;
+  }
+  if (round_down(dir)) {
+    mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_GT;
+    return V_GE;
+  }
+  else {
+    PPL_ASSERT(round_up(dir));
+    mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+    if (round_strict_relation(dir))
+      return (mpz_divisible_2exp_p(n, exp) != 0) ? V_EQ : V_LT;
+    return V_LE;
+  }
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+              Rounding_Dir) {
+  if (mpz_tstbit(x.get_mpz_t(), exp - 1) != 0)
+    mpz_cdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  else
+    mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpz(mpz_class& to, const mpz_class& x, unsigned int exp,
+              Rounding_Dir) {
+  mpz_fdiv_r_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpz, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+            Rounding_Dir) {
+  mpz_addmul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+            Rounding_Dir) {
+  mpz_submul(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcd_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_gcd(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_GCD(gcd_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+gcdext_mpz(mpz_class& to, mpz_class& s, mpz_class& t,
+           const mpz_class& x, const mpz_class& y,
+           Rounding_Dir) {
+  mpz_gcdext(to.get_mpz_t(), s.get_mpz_t(), t.get_mpz_t(),
+             x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_GCDEXT(gcdext_mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+lcm_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+  mpz_lcm(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_LCM(lcm_mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  if (round_not_requested(dir)) {
+    to = sqrt(from);
+    return V_GE;
+  }
+  PPL_DIRTY_TEMP(mpz_class, r);
+  mpz_sqrtrem(to.get_mpz_t(), r.get_mpz_t(), from.get_mpz_t());
+  if (r == 0)
+    return V_EQ;
+  return round_gt_mpz<To_Policy>(to, dir);
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_mp(const Type& x) {
+  const int sign = ::sgn(x);
+  return (sign > 0) ? VR_GT : ((sign < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_SGN(sgn_mp, mpz_class)
+PPL_SPECIALIZE_SGN(sgn_mp, mpq_class)
+
+template <typename Policy1, typename Policy2, typename Type>
+inline Result_Relation
+cmp_mp(const Type& x, const Type& y) {
+  int i = ::cmp(x, y);
+  return (i > 0) ? VR_GT : ((i < 0) ? VR_LT : VR_EQ);
+}
+
+PPL_SPECIALIZE_CMP(cmp_mp, mpz_class, mpz_class)
+PPL_SPECIALIZE_CMP(cmp_mp, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpz(std::ostream& os, const mpz_class& from, const Numeric_Format&,
+           Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_INPUT(input_generic, mpz_class)
+PPL_SPECIALIZE_OUTPUT(output_mpz, mpz_class)
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_mpq_inlines.hh line 1. */
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+*/
+
+
+#include <sstream>
+#include <climits>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+classify_mpq(const mpq_class& v, bool nan, bool inf, bool sign) {
+  if ((Policy::has_nan || Policy::has_infinity)
+      && ::sgn(v.get_den()) == 0) {
+    int s = ::sgn(v.get_num());
+    if (Policy::has_nan && (nan || sign) && s == 0)
+      return V_NAN;
+    if (!inf && !sign)
+      return V_LGE;
+    if (Policy::has_infinity) {
+      if (s < 0)
+        return inf ? V_EQ_MINUS_INFINITY : V_LT;
+      if (s > 0)
+        return inf ? V_EQ_PLUS_INFINITY : V_GT;
+    }
+  }
+  if (sign)
+    return static_cast<Result>(sgn<Policy>(v));
+  return V_LGE;
+}
+
+PPL_SPECIALIZE_CLASSIFY(classify_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+  return Policy::has_nan
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) == 0;
+}
+
+PPL_SPECIALIZE_IS_NAN(is_nan_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+  return Policy::has_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) < 0;
+}
+
+PPL_SPECIALIZE_IS_MINF(is_minf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+  return Policy::has_infinity
+    && ::sgn(v.get_den()) == 0
+    && ::sgn(v.get_num()) > 0;
+}
+
+PPL_SPECIALIZE_IS_PINF(is_pinf_mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+  if ((Policy::has_infinity || Policy::has_nan)
+      && ::sgn(v.get_den()) == 0)
+    return !(Policy::has_nan && ::sgn(v.get_num()) == 0);
+  else
+    return v.get_den() == 1;
+}
+
+PPL_SPECIALIZE_IS_INT(is_int_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+assign_special_mpq(mpq_class& v, Result_Class c, Rounding_Dir) {
+  switch (c) {
+  case VC_NAN:
+    if (Policy::has_nan) {
+      v.get_num() = 0;
+      v.get_den() = 0;
+      return V_NAN | V_UNREPRESENTABLE;
+    }
+    return V_NAN;
+  case VC_MINUS_INFINITY:
+    if (Policy::has_infinity) {
+      v.get_num() = -1;
+      v.get_den() = 0;
+      return V_EQ_MINUS_INFINITY;
+    }
+    return V_EQ_MINUS_INFINITY | V_UNREPRESENTABLE;
+  case VC_PLUS_INFINITY:
+    if (Policy::has_infinity) {
+      v.get_num() = 1;
+      v.get_den() = 0;
+      return V_EQ_PLUS_INFINITY;
+    }
+    return V_EQ_PLUS_INFINITY | V_UNREPRESENTABLE;
+  default:
+    PPL_UNREACHABLE;
+    return V_NAN | V_UNREPRESENTABLE;
+  }
+}
+
+PPL_SPECIALIZE_ASSIGN_SPECIAL(assign_special_mpq, mpq_class)
+
+PPL_SPECIALIZE_COPY(copy_generic, mpq_class)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, mpz_class)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, signed long)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned char)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned short)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned int)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_base, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+construct_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  new (&to) mpq_class(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_CONSTRUCT(construct_mpq_float, mpq_class, double)
+
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpq_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, mpz_class)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, signed long)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned char)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned short)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned int)
+PPL_SPECIALIZE_ASSIGN(assign_exact, mpq_class, unsigned long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_float(mpq_class& to, const From& from, Rounding_Dir dir) {
+  if (is_nan<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(from))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  assign_mpq_numeric_float(to, from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, float)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, double)
+PPL_SPECIALIZE_ASSIGN(assign_mpq_float, mpq_class, long double)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_signed_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(signed long))
+    to = static_cast<signed long>(from);
+  else {
+    mpz_ptr m = to.get_num().get_mpz_t();
+    if (from >= 0)
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &from);
+    else {
+      From n = -from;
+      mpz_import(m, 1, 1, sizeof(From), 0, 0, &n);
+      mpz_neg(m, m);
+    }
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_signed_int, mpq_class, signed long long)
+
+template <typename To_Policy, typename From_Policy, typename From>
+inline Result
+assign_mpq_unsigned_int(mpq_class& to, const From from, Rounding_Dir) {
+  if (sizeof(From) <= sizeof(unsigned long))
+    to = static_cast<unsigned long>(from);
+  else {
+    mpz_import(to.get_num().get_mpz_t(), 1, 1, sizeof(From), 0, 0, &from);
+    to.get_den() = 1;
+  }
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ASSIGN(assign_mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+floor_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_fdiv_q(to.get_num().get_mpz_t(),
+             from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_FLOOR(floor_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+ceil_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_cdiv_q(to.get_num().get_mpz_t(),
+             from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_CEIL(ceil_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+trunc_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpz_tdiv_q(to.get_num().get_mpz_t(),
+             from.get_num().get_mpz_t(), from.get_den().get_mpz_t());
+  to.get_den() = 1;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_TRUNC(trunc_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+neg_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  mpq_neg(to.get_mpq_t(), from.get_mpq_t());
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_NEG(neg_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x + y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD(add_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x - y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB(sub_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  to = x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL(mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV(div_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+idiv_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_DIV_ZERO);
+  }
+  to = x / y;
+  return trunc<To_Policy, To_Policy>(to, to, dir);
+}
+
+PPL_SPECIALIZE_IDIV(idiv_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+  if (CHECK_P(To_Policy::check_div_zero, sgn(y) == 0)) {
+    return assign_nan<To_Policy>(to, V_MOD_ZERO);
+  }
+  PPL_DIRTY_TEMP(mpq_class, tmp);
+  tmp = x / y;
+  tmp.get_num() %= tmp.get_den();
+  to = tmp * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_REM(rem_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+add_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x + v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_2EXP(add_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sub_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  PPL_DIRTY_TEMP(mpz_class, v);
+  v = 1;
+  mpz_mul_2exp(v.get_mpz_t(), v.get_mpz_t(), exp);
+  to = x - v;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_2EXP(sub_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+mul_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  mpz_mul_2exp(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), exp);
+  to.get_den() = x.get_den();
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_MUL_2EXP(mul_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+div_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+             Rounding_Dir) {
+  to.get_num() = x.get_num();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_DIV_2EXP(div_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+smod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+              Rounding_Dir) {
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+  mpz_fdiv_q_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+  bool neg = to.get_num() >= to.get_den();
+  mpz_mul_2exp(to.get_den().get_mpz_t(), to.get_den().get_mpz_t(), 1);
+  if (neg)
+    to.get_num() -= to.get_den();
+  mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SMOD_2EXP(smod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+umod_2exp_mpq(mpq_class& to, const mpq_class& x, unsigned int exp,
+              Rounding_Dir) {
+  mpz_mul_2exp(to.get_den().get_mpz_t(), x.get_den().get_mpz_t(), exp);
+  mpz_fdiv_r(to.get_num().get_mpz_t(), x.get_num().get_mpz_t(), to.get_den().get_mpz_t());
+  mpz_mul_2exp(to.get_num().get_mpz_t(), to.get_num().get_mpz_t(), exp);
+  to.canonicalize();
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_UMOD_2EXP(umod_2exp_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+  to = abs(from);
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ABS(abs_mpq, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+add_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+            Rounding_Dir) {
+  to += x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_ADD_MUL(add_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy>
+inline Result
+sub_mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y,
+            Rounding_Dir) {
+  to -= x * y;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_SUB_MUL(sub_mul_mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned irrational_precision;
+
+template <typename To_Policy, typename From_Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+  if (CHECK_P(To_Policy::check_sqrt_neg, from < 0)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  if (from == 0) {
+    to = 0;
+    return V_EQ;
+  }
+  bool gt1 = from.get_num() > from.get_den();
+  const mpz_class& from_a = gt1 ? from.get_num() : from.get_den();
+  const mpz_class& from_b = gt1 ? from.get_den() : from.get_num();
+  mpz_class& to_a = gt1 ? to.get_num() : to.get_den();
+  mpz_class& to_b = gt1 ? to.get_den() : to.get_num();
+  Rounding_Dir rdir = gt1 ? dir : inverse(dir);
+  mul_2exp<To_Policy, From_Policy>(to_a, from_a,
+                                   2*irrational_precision, ROUND_IGNORE);
+  Result r_div
+    = div<To_Policy, To_Policy, To_Policy>(to_a, to_a, from_b, rdir);
+  Result r_sqrt = sqrt<To_Policy, To_Policy>(to_a, to_a, rdir);
+  to_b = 1;
+  mul_2exp<To_Policy, To_Policy>(to_b, to_b,
+                                 irrational_precision, ROUND_IGNORE);
+  to.canonicalize();
+  return (r_div != V_EQ) ? r_div : r_sqrt;
+}
+
+PPL_SPECIALIZE_SQRT(sqrt_mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+input_mpq(mpq_class& to, std::istream& is, Rounding_Dir dir) {
+  Result r = input_mpq(to, is);
+  Result_Class c = result_class(r);
+  switch (c) {
+  case VC_MINUS_INFINITY:
+  case VC_PLUS_INFINITY:
+    return assign_special<Policy>(to, c, dir);
+  case VC_NAN:
+    return assign_nan<Policy>(to, r);
+  default:
+    return r;
+  }
+}
+
+PPL_SPECIALIZE_INPUT(input_mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+           const mpq_class& from,
+           const Numeric_Format&,
+           Rounding_Dir) {
+  os << from;
+  return V_EQ;
+}
+
+PPL_SPECIALIZE_OUTPUT(output_mpq, mpq_class)
+
+} // namespace Checked
+
+//! Returns the precision parameter used for irrational calculations.
+inline unsigned
+irrational_precision() {
+  return Checked::irrational_precision;
+}
+
+//! Sets the precision parameter used for irrational calculations.
+/*! The lesser between numerator and denominator is limited to 2**\p p.
+
+  If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+  precision parameter used for irrational calculations to \p p.
+
+  \exception std::invalid_argument
+  Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_irrational_precision(const unsigned p) {
+  if (p <= INT_MAX)
+    Checked::irrational_precision = p;
+  else
+    throw std::invalid_argument("PPL::set_irrational_precision(p)"
+                                " with p > INT_MAX");
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_ext_inlines.hh line 1. */
+/* Checked extended arithmetic functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T> struct FPU_Related : public False {};
+template <> struct FPU_Related<float> : public True {};
+template <> struct FPU_Related<double> : public True {};
+template <> struct FPU_Related<long double> : public True {};
+
+namespace Checked {
+
+template <typename T>
+inline bool
+handle_ext_natively(const T&) {
+  return FPU_Related<T>::value;
+}
+
+template <typename Policy, typename Type>
+inline bool
+ext_to_handle(const Type& x) {
+  return !handle_ext_natively(x)
+    && (Policy::has_infinity || Policy::has_nan);
+}
+
+template <typename Policy, typename Type>
+inline Result_Relation
+sgn_ext(const Type& x) {
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x))
+    return VR_EMPTY;
+  else if (is_minf<Policy>(x))
+    return VR_LT;
+  else if (is_pinf<Policy>(x))
+    return VR_GT;
+  else {
+  native:
+    return sgn<Policy>(x);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+construct_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return construct_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return construct_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return construct_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return construct<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+assign_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return assign<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+neg_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else {
+  native:
+    return neg<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+floor_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return floor<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+ceil_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return ceil<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+trunc_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return trunc<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+abs_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return abs<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+add_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<From2_Policy>(y)))
+      goto inf_add_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<From2_Policy>(y))) {
+    inf_add_inf:
+      return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+    minf:
+      return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+    pinf:
+      return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return add<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+sub_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<From2_Policy>(y)))
+      goto inf_sub_inf;
+    else
+      goto minf;
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<From2_Policy>(y))) {
+    inf_sub_inf:
+      return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+    }
+    else
+      goto pinf;
+  }
+  else {
+    if (is_pinf<From2_Policy>(y)) {
+    minf:
+      return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+    }
+    else if (is_minf<From2_Policy>(y)) {
+    pinf:
+      return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+    }
+    else {
+    native:
+      return sub<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto pinf;
+    case VR_GT:
+      goto minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto minf;
+    case VR_GT:
+      goto pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+        goto pinf;
+      case VR_GT:
+        goto minf;
+      default:
+        goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      case VR_GT:
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      default:
+      inf_mul_zero:
+        PPL_ASSERT(To_Policy::check_inf_mul_zero);
+        return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+    native:
+      return mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+add_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_pinf;
+    case VR_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_minf;
+    case VR_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+        goto a_pinf;
+      case VR_GT:
+        goto a_minf;
+      default:
+        goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+      a_minf:
+        if (CHECK_P(To_Policy::check_inf_add_inf, is_pinf<To_Policy>(to)))
+          goto inf_add_inf;
+        else
+          goto minf;
+      case VR_GT:
+      a_pinf:
+        if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+        inf_add_inf:
+          return assign_nan<To_Policy>(to, V_INF_ADD_INF);
+        }
+        else
+          goto pinf;
+      default:
+      inf_mul_zero:
+        PPL_ASSERT(To_Policy::check_inf_mul_zero);
+        return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      }
+    native:
+      return add_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+sub_mul_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<To_Policy>(to)
+      && !ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<To_Policy>(to)
+      || is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_pinf;
+    case VR_GT:
+      goto a_minf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    switch (sgn_ext<From2_Policy>(y)) {
+    case VR_LT:
+      goto a_minf;
+    case VR_GT:
+      goto a_pinf;
+    default:
+      goto inf_mul_zero;
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+        goto a_pinf;
+      case VR_GT:
+        goto a_minf;
+      default:
+        goto inf_mul_zero;
+      }
+    }
+    else if (is_pinf<From2_Policy>(y)) {
+      switch (sgn<From1_Policy>(x)) {
+      case VR_LT:
+      a_minf:
+        if (CHECK_P(To_Policy::check_inf_sub_inf, is_minf<To_Policy>(to)))
+          goto inf_sub_inf;
+        else
+          goto pinf;
+      case VR_GT:
+      a_pinf:
+        if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+        inf_sub_inf:
+          return assign_nan<To_Policy>(to, V_INF_SUB_INF);
+        }
+        else
+          goto minf;
+      default:
+      inf_mul_zero:
+        PPL_ASSERT(To_Policy::check_inf_mul_zero);
+        return assign_nan<To_Policy>(to, V_INF_MUL_ZERO);
+      }
+    }
+    else {
+      if (is_minf<To_Policy>(to)) {
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      }
+      if (is_pinf<To_Policy>(to)) {
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      }
+    native:
+      return sub_mul<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+div_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+        goto pinf;
+      case VR_GT:
+        goto minf;
+      default:
+        goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      case VR_GT:
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      default:
+      div_zero:
+        PPL_ASSERT(To_Policy::check_div_zero);
+        return assign_nan<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return div<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+idiv_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  if (is_minf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y)))
+      goto inf_div_inf;
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+        goto pinf;
+      case VR_GT:
+        goto minf;
+      default:
+        goto div_zero;
+      }
+    }
+  }
+  else if (is_pinf<From1_Policy>(x)) {
+    if (CHECK_P(To_Policy::check_inf_div_inf, is_minf<From2_Policy>(y)
+                || is_pinf<From2_Policy>(y))) {
+    inf_div_inf:
+      return assign_nan<To_Policy>(to, V_INF_DIV_INF);
+    }
+    else {
+      switch (sgn<From2_Policy>(y)) {
+      case VR_LT:
+      minf:
+        return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+      case VR_GT:
+      pinf:
+        return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+      default:
+      div_zero:
+        PPL_ASSERT(To_Policy::check_div_zero);
+        return assign_nan<To_Policy>(to, V_DIV_ZERO);
+      }
+    }
+  }
+  else {
+    if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = 0;
+      return V_EQ;
+    }
+    else {
+    native:
+      return idiv<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+rem_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (!ext_to_handle<From1_Policy>(x) && !ext_to_handle<From2_Policy>(y))
+    goto native;
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+                   || is_pinf<From1_Policy>(x))) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  else {
+    if (is_minf<From1_Policy>(y) || is_pinf<From2_Policy>(y)) {
+      to = x;
+      return V_EQ;
+    }
+    else {
+    native:
+      return rem<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+    }
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+add_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return add_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+sub_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return sub_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+mul_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return mul_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+div_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_MINUS_INFINITY, dir);
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return div_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+smod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+                   || is_pinf<From_Policy>(x))) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  else {
+  native:
+    return smod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+umod_2exp_ext(To& to, const From& x, unsigned int exp, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From_Policy>(x)
+                   || is_pinf<From_Policy>(x))) {
+    return assign_nan<To_Policy>(to, V_INF_MOD);
+  }
+  else {
+  native:
+    return umod_2exp<To_Policy, From_Policy>(to, x, exp, dir);
+  }
+}
+
+template <typename To_Policy, typename From_Policy,
+          typename To, typename From>
+inline Result
+sqrt_ext(To& to, const From& x, Rounding_Dir dir) {
+  if (!ext_to_handle<From_Policy>(x))
+    goto native;
+  if (is_nan<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From_Policy>(x)) {
+    return assign_nan<To_Policy>(to, V_SQRT_NEG);
+  }
+  else if (is_pinf<From_Policy>(x))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else {
+  native:
+    return sqrt<To_Policy, From_Policy>(to, x, dir);
+  }
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+gcd_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x))
+    return abs_ext<To_Policy, From2_Policy>(to, y, dir);
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return abs_ext<To_Policy, From1_Policy>(to, x, dir);
+  else
+    return gcd<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename To2_Policy, typename To3_Policy,
+          typename From1_Policy, typename From2_Policy,
+          typename To1, typename To2, typename To3,
+          typename From1, typename From2>
+inline Result
+gcdext_ext(To1& to, To2& s, To3& t, const From1& x, const From2& y,
+           Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To1_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)) {
+    s = 0;
+    t = y > 0 ? -1 : 1;
+    return abs_ext<To1_Policy, From2_Policy>(to, y, dir);
+  }
+  else if (is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y)) {
+    s = x > 0 ? -1 : 1;
+    t = 0;
+    return abs_ext<To1_Policy, From1_Policy>(to, x, dir);
+  }
+  else
+    return gcdext<To1_Policy, To2_Policy, To3_Policy, From1_Policy, From2_Policy>(to, s, t, x, y, dir);
+}
+
+template <typename To_Policy, typename From1_Policy, typename From2_Policy,
+          typename To, typename From1, typename From2>
+inline Result
+lcm_ext(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+  if (is_nan<From1_Policy>(x) || is_nan<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_NAN, ROUND_IGNORE);
+  else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+           || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+    return assign_special<To_Policy>(to, VC_PLUS_INFINITY, dir);
+  else
+    return lcm<To_Policy, From1_Policy, From2_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline Result_Relation
+cmp_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return VR_EMPTY;
+  else if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y) ? VR_EQ : VR_LT;
+  else if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y) ? VR_EQ : VR_GT;
+  else {
+    if (is_minf<Policy2>(y))
+      return VR_GT;
+    if (is_pinf<Policy2>(y))
+      return VR_LT;
+  native:
+    return cmp<Policy1, Policy2>(x, y);
+  }
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+ native:
+  return lt_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+  return lt_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+    return true;
+  if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+    return false;
+ native:
+  return le_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+  return le_ext<Policy1, Policy2>(y, x);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+  if (!ext_to_handle<Policy1>(x) && !ext_to_handle<Policy2>(y))
+    goto native;
+  if (is_nan<Policy1>(x) || is_nan<Policy2>(y))
+    return false;
+  if (is_minf<Policy1>(x))
+    return is_minf<Policy2>(y);
+  if (is_pinf<Policy1>(x))
+    return is_pinf<Policy2>(y);
+  else if (is_minf<Policy2>(y) || is_pinf<Policy2>(y))
+    return false;
+ native:
+  return eq_p<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy1, typename Policy2,
+          typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+  return !eq_ext<Policy1, Policy2>(x, y);
+}
+
+template <typename Policy, typename Type>
+inline Result
+output_ext(std::ostream& os, const Type& x,
+           const Numeric_Format& format, Rounding_Dir dir) {
+  if (!ext_to_handle<Policy>(x))
+    goto native;
+  if (is_nan<Policy>(x)) {
+    os << "nan";
+    return V_NAN;
+  }
+  if (is_minf<Policy>(x)) {
+    os << "-inf";
+    return V_EQ;
+  }
+  if (is_pinf<Policy>(x)) {
+    os << "+inf";
+    return V_EQ;
+  }
+ native:
+  return output<Policy>(os, x, format, dir);
+}
+
+template <typename To_Policy, typename To>
+inline Result
+input_ext(To& to, std::istream& is, Rounding_Dir dir) {
+  return input<To_Policy>(to, is, dir);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/checked_defs.hh line 706. */
+
+#undef nonconst
+#ifdef PPL_SAVED_nonconst
+#define nonconst PPL_SAVED_nonconst
+#undef PPL_SAVED_nonconst
+#endif
+
+#undef PPL_FUNCTION_CLASS
+#undef PPL_NAN
+
+/* Automatically generated from PPL source file ../src/Checked_Number_defs.hh line 31. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+
+  // `convertible' is intentionally not defined: the compile time
+  // error on conversions is the expected behavior.
+
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(fpu_check_nan_result, true);
+
+  // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+  // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+  // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+  // ROUND_DEFAULT_INPUT is intentionally not defined.
+  // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Check_Overflow_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, std::numeric_limits<T>::has_quiet_NaN);
+  const_bool_nodef(has_infinity, std::numeric_limits<T>::has_infinity);
+  const_bool_nodef(convertible, true);
+  const_bool_nodef(fpu_check_inexact, true);
+  const_bool_nodef(fpu_check_nan_result, true);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_From_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_From_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Checked_Number_Transparent_Policy<T> Policy;
+  static const T& raw_value(const T& v) {
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_From_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static const T& raw_value(const Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Native_Checked_To_Wrapper;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Native_Checked_To_Wrapper<T, typename Enable_If<Is_Native<T>::value>::type> {
+  typedef Check_Overflow_Policy<T> Policy;
+  static T& raw_value(T& v) {
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Native_Checked_To_Wrapper<Checked_Number<T, P> > {
+  typedef P Policy;
+  static T& raw_value(Checked_Number<T, P>& v) {
+    return v.raw_value();
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Checked : public False { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Is_Checked<Checked_Number<T, P> > : public True { };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Is_Native_Or_Checked
+  : public Bool<Is_Native<T>::value || Is_Checked<T>::value> { };
+
+//! A wrapper for numeric types implementing a given policy.
+/*! \ingroup PPL_CXX_interface
+  The wrapper and related functions implement an interface which is common
+  to all kinds of coefficient types, therefore allowing for a uniform
+  coding style. This class also implements the policy encoded by the
+  second template parameter. The default policy is to perform the detection
+  of overflow errors.
+*/
+template <typename T, typename Policy>
+class Checked_Number {
+public:
+
+  //! \name Constructors
+  //@{
+
+  //! Default constructor.
+  Checked_Number();
+
+  //! Copy constructor.
+  Checked_Number(const Checked_Number& y);
+
+  //! Direct initialization from a Checked_Number and rounding mode.
+  template <typename From, typename From_Policy>
+  Checked_Number(const Checked_Number<From, From_Policy>& y, Rounding_Dir dir);
+
+  //! Direct initialization from a plain char and rounding mode.
+  Checked_Number(char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed char and rounding mode.
+  Checked_Number(signed char y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed short and rounding mode.
+  Checked_Number(signed short y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed int and rounding mode.
+  Checked_Number(signed int y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long and rounding mode.
+  Checked_Number(signed long y, Rounding_Dir dir);
+
+  //! Direct initialization from a signed long long and rounding mode.
+  Checked_Number(signed long long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned char and rounding mode.
+  Checked_Number(unsigned char y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned short and rounding mode.
+  Checked_Number(unsigned short y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned int and rounding mode.
+  Checked_Number(unsigned int y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long and rounding mode.
+  Checked_Number(unsigned long y, Rounding_Dir dir);
+
+  //! Direct initialization from an unsigned long long and rounding mode.
+  Checked_Number(unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+  //! Direct initialization from a float and rounding mode.
+  Checked_Number(float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+  //! Direct initialization from a double and rounding mode.
+  Checked_Number(double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+  //! Direct initialization from a long double and rounding mode.
+  Checked_Number(long double y, Rounding_Dir dir);
+#endif
+
+  //! Direct initialization from a rational and rounding mode.
+  Checked_Number(const mpq_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from an unbounded integer and rounding mode.
+  Checked_Number(const mpz_class& y, Rounding_Dir dir);
+
+  //! Direct initialization from a C string and rounding mode.
+  Checked_Number(const char* y, Rounding_Dir dir);
+
+  //! Direct initialization from special and rounding mode.
+  template <typename From>
+  Checked_Number(const From&, Rounding_Dir dir, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+  //! Direct initialization from a Checked_Number, default rounding mode.
+  template <typename From, typename From_Policy>
+  explicit Checked_Number(const Checked_Number<From, From_Policy>& y);
+
+  //! Direct initialization from a plain char, default rounding mode.
+  Checked_Number(char y);
+
+  //! Direct initialization from a signed char, default rounding mode.
+  Checked_Number(signed char y);
+
+  //! Direct initialization from a signed short, default rounding mode.
+  Checked_Number(signed short y);
+
+  //! Direct initialization from a signed int, default rounding mode.
+  Checked_Number(signed int y);
+
+  //! Direct initialization from a signed long, default rounding mode.
+  Checked_Number(signed long y);
+
+  //! Direct initialization from a signed long long, default rounding mode.
+  Checked_Number(signed long long y);
+
+  //! Direct initialization from an unsigned char, default rounding mode.
+  Checked_Number(unsigned char y);
+
+  //! Direct initialization from an unsigned short, default rounding mode.
+  Checked_Number(unsigned short y);
+
+  //! Direct initialization from an unsigned int, default rounding mode.
+  Checked_Number(unsigned int y);
+
+  //! Direct initialization from an unsigned long, default rounding mode.
+  Checked_Number(unsigned long y);
+
+  //! Direct initialization from an unsigned long long, default rounding mode.
+  Checked_Number(unsigned long long y);
+
+  //! Direct initialization from a float, default rounding mode.
+  Checked_Number(float y);
+
+  //! Direct initialization from a double, default rounding mode.
+  Checked_Number(double y);
+
+  //! Direct initialization from a long double, default rounding mode.
+  Checked_Number(long double y);
+
+  //! Direct initialization from a rational, default rounding mode.
+  Checked_Number(const mpq_class& y);
+
+  //! Direct initialization from an unbounded integer, default rounding mode.
+  Checked_Number(const mpz_class& y);
+
+  //! Direct initialization from a C string, default rounding mode.
+  Checked_Number(const char* y);
+
+  //! Direct initialization from special, default rounding mode
+  template <typename From>
+  Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type ignored = false);
+
+
+  //@} // Constructors
+
+  //! \name Accessors and Conversions
+  //@{
+
+  //! Conversion operator: returns a copy of the underlying numeric value.
+  operator T() const;
+
+  //! Returns a reference to the underlying numeric value.
+  T& raw_value();
+
+  //! Returns a const reference to the underlying numeric value.
+  const T& raw_value() const;
+
+  //@} // Accessors and Conversions
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Classifies *this.
+  /*!
+    Returns the appropriate Result characterizing:
+    - whether \p *this is NaN,
+      if \p nan is <CODE>true</CODE>;
+    - whether \p *this is a (positive or negative) infinity,
+      if \p inf is <CODE>true</CODE>;
+    - the sign of \p *this,
+      if \p sign is <CODE>true</CODE>.
+  */
+  Result classify(bool nan = true, bool inf = true, bool sign = true) const;
+
+  //! \name Assignment Operators
+  //@{
+
+  //! Assignment operator.
+  Checked_Number& operator=(const Checked_Number& y);
+
+  //! Assignment operator.
+  template <typename From>
+  Checked_Number& operator=(const From& y);
+
+  //! Add and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator+=(const Checked_Number<T, From_Policy>& y);
+
+  //! Add and assign operator.
+  Checked_Number& operator+=(const T& y);
+
+  //! Add and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator+=(const From& y);
+
+  //! Subtract and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator-=(const Checked_Number<T, From_Policy>& y);
+
+  //! Subtract and assign operator.
+  Checked_Number& operator-=(const T& y);
+
+  //! Subtract and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator-=(const From& y);
+
+  //! Multiply and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator*=(const Checked_Number<T, From_Policy>& y);
+
+  //! Multiply and assign operator.
+  Checked_Number& operator*=(const T& y);
+
+  //! Multiply and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator*=(const From& y);
+
+  //! Divide and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator/=(const Checked_Number<T, From_Policy>& y);
+
+  //! Divide and assign operator.
+  Checked_Number& operator/=(const T& y);
+
+  //! Divide and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>&>::type
+  operator/=(const From& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From_Policy>
+  Checked_Number& operator%=(const Checked_Number<T, From_Policy>& y);
+
+  //! Compute remainder and assign operator.
+  Checked_Number& operator%=(const T& y);
+
+  //! Compute remainder and assign operator.
+  template <typename From>
+  typename Enable_If<Is_Native_Or_Checked<From>::value,
+                     Checked_Number<T, Policy>& >::type
+  operator%=(const From& y);
+
+  //@} // Assignment Operators
+
+
+  //! \name Increment and Decrement Operators
+  //@{
+
+  //! Pre-increment operator.
+  Checked_Number& operator++();
+
+  //! Post-increment operator.
+  Checked_Number  operator++(int);
+
+  //! Pre-decrement operator.
+  Checked_Number& operator--();
+
+  //! Post-decrement operator.
+  Checked_Number  operator--(int);
+
+  //@} // Increment and Decrement Operators
+
+private:
+  //! The underlying numeric value.
+  T v;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename P>
+struct Slow_Copy<Checked_Number<T, P> > : public Bool<Slow_Copy<T>::value> {};
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x);
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename From>
+typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From& x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir);
+
+/*! \relates Checked_Number */
+template <typename To, typename To_Policy>
+typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define PPL_DECLARE_FUNC1_A(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_A(assign_r)
+PPL_DECLARE_FUNC1_A(floor_assign_r)
+PPL_DECLARE_FUNC1_A(ceil_assign_r)
+PPL_DECLARE_FUNC1_A(trunc_assign_r)
+PPL_DECLARE_FUNC1_A(neg_assign_r)
+PPL_DECLARE_FUNC1_A(abs_assign_r)
+PPL_DECLARE_FUNC1_A(sqrt_assign_r)
+
+#undef PPL_DECLARE_FUNC1_A
+
+#define PPL_DECLARE_FUNC1_B(name) \
+template <typename To, typename From> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From>::value, \
+                   Result>::type \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC1_B(add_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(sub_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(mul_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(div_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(smod_2exp_assign_r)
+PPL_DECLARE_FUNC1_B(umod_2exp_assign_r)
+
+#undef PPL_DECLARE_FUNC1_B
+
+#define PPL_DECLARE_FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+                   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+PPL_DECLARE_FUNC2(add_assign_r)
+PPL_DECLARE_FUNC2(sub_assign_r)
+PPL_DECLARE_FUNC2(mul_assign_r)
+PPL_DECLARE_FUNC2(div_assign_r)
+PPL_DECLARE_FUNC2(idiv_assign_r)
+PPL_DECLARE_FUNC2(rem_assign_r)
+PPL_DECLARE_FUNC2(gcd_assign_r)
+PPL_DECLARE_FUNC2(lcm_assign_r)
+PPL_DECLARE_FUNC2(add_mul_assign_r)
+PPL_DECLARE_FUNC2(sub_mul_assign_r)
+
+#undef PPL_DECLARE_FUNC2
+
+#define PPL_DECLARE_FUNC4(name) \
+template <typename To1, typename To2, typename To3, \
+          typename From1, typename From2> \
+typename Enable_If<Is_Native_Or_Checked<To1>::value \
+                   && Is_Native_Or_Checked<To2>::value \
+                   && Is_Native_Or_Checked<To3>::value \
+                   && Is_Native_Or_Checked<From1>::value \
+                   && Is_Native_Or_Checked<From2>::value, \
+                   Result>::type \
+ PPL_U(name)(To1& to, To2& s, To3& t,     \
+     const From1& x, const From2& y, \
+     Rounding_Dir dir);
+
+PPL_DECLARE_FUNC4(gcdext_assign_r)
+
+#undef PPL_DECLARE_FUNC4
+
+//! \name Accessor Functions
+//@{
+
+//@} // Accessor Functions
+
+//! \name Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x);
+
+//@} // Memory Size Inspection Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Unary plus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x);
+
+//! Unary minus operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x largest integral value not greater than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+floor_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x smallest integral value not less than \p x.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x smallest integral value not less than \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+ceil_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Round \p x to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the value of \p y rounded to the nearest integer not larger in absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+trunc_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+abs_assign(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+add_mul_assign(Checked_Number<T, Policy>& x,
+               const Checked_Number<T, Policy>& y,
+               const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+sub_mul_assign(Checked_Number<T, Policy>& x,
+               const Checked_Number<T, Policy>& y,
+               const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcd_assign(Checked_Number<T, Policy>& x,
+           const Checked_Number<T, Policy>& y,
+           const Checked_Number<T, Policy>& z);
+
+/*! \brief
+  Assigns to \p x the greatest common divisor of \p y and \p z,
+  setting \p s and \p t such that s*y + t*z = x = gcd(y, z).
+*/
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+gcdext_assign(Checked_Number<T, Policy>& x,
+              Checked_Number<T, Policy>& s,
+              Checked_Number<T, Policy>& t,
+              const Checked_Number<T, Policy>& y,
+              const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+lcm_assign(Checked_Number<T, Policy>& x,
+           const Checked_Number<T, Policy>& y,
+           const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+mul_2exp_assign(Checked_Number<T, Policy>& x,
+                const Checked_Number<T, Policy>& y,
+                unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+div_2exp_assign(Checked_Number<T, Policy>& x,
+                const Checked_Number<T, Policy>& y,
+                unsigned int exp);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates Checked_Number
+  The behavior is undefined if \p z does not divide \p y.
+*/
+template <typename T, typename Policy>
+void
+exact_div_assign(Checked_Number<T, Policy>& x,
+                 const Checked_Number<T, Policy>& y,
+                 const Checked_Number<T, Policy>& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void sqrt_assign(Checked_Number<T, Policy>& x,
+                 const Checked_Number<T, Policy>& y);
+
+//@} // Arithmetic Operators
+
+
+//! \name Relational Operators and Comparison Functions
+//@{
+
+//! Equality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator==(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+equal(const T1& x, const T2& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator!=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+not_equal(const T1& x, const T2& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator>=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+greater_or_equal(const T1& x, const T2& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator>(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+greater_than(const T1& x, const T2& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator<=(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+less_or_equal(const T1& x, const T2& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline
+typename Enable_If<Is_Native_Or_Checked<T1>::value
+                   && Is_Native_Or_Checked<T2>::value
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value),
+                   bool>::type
+operator<(const T1& x, const T2& y);
+
+/*! \relates Checked_Number */
+template <typename T1, typename T2>
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value
+                          && Is_Native_Or_Checked<T2>::value,
+                          bool>::type
+less_than(const T1& x, const T2& y);
+
+/*! \brief
+  Returns \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether the value
+  of \p x is negative, zero or positive, respectively.
+
+  \relates Checked_Number
+*/
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type \
+sgn(const From& x);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates Checked_Number
+*/
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os,
+       const T& x,
+       const Numeric_Format& format,
+       Rounding_Dir dir);
+
+//! Output operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x);
+
+//! Ascii dump for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t);
+
+//! Input function.
+/*!
+  \relates Checked_Number
+
+  \param is
+  Input stream to read from;
+
+  \param x
+  Number (possibly extended) to assign to in case of successful reading;
+
+  \param dir
+  Rounding mode to be applied.
+
+  \return
+  Result of the input operation.  Success, success with imprecision,
+  overflow, parsing error: all possibilities are taken into account,
+  checked for, and properly reported.
+
+  This function attempts reading a (possibly extended) number from the given
+  stream \p is, possibly rounding as specified by \p dir, assigning the result
+  to \p x upon success, and returning the appropriate Result.
+
+  The input syntax allows the specification of:
+  - plain base-10 integer numbers as <CODE>34976098</CODE>,
+    <CODE>-77</CODE> and <CODE>+13</CODE>;
+  - base-10 integer numbers in scientific notation as <CODE>15e2</CODE>
+    and <CODE>15*^2</CODE> (both meaning \f$15 \cdot 10^2 = 1500\f$),
+    <CODE>9200e-2</CODE> and <CODE>-18*^+11111111111111111</CODE>;
+  - base-10 rational numbers in fraction notation as
+    <CODE>15/3</CODE> and <CODE>15/-3</CODE>;
+  - base-10 rational numbers in fraction/scientific notation as
+    <CODE>15/30e-1</CODE> (meaning \f$5\f$) and <CODE>15*^-3/29e2</CODE>
+    (meaning \f$3/580000\f$);
+  - base-10 rational numbers in floating point notation as
+    <CODE>71.3</CODE> (meaning \f$713/10\f$) and
+    <CODE>-0.123456</CODE> (meaning \f$-1929/15625\f$);
+  - base-10 rational numbers in floating point scientific notation as
+    <CODE>2.2e-1</CODE> (meaning \f$11/50\f$) and <CODE>-2.20001*^+3</CODE>
+    (meaning \f$-220001/100\f$);
+  - integers and rationals (in fractional, floating point and scientific
+    notations) specified by using Mathematica-style bases, in the range
+    from 2 to 36, as
+    <CODE>2^^11</CODE> (meaning \f$3\f$),
+    <CODE>36^^z</CODE> (meaning \f$35\f$),
+    <CODE>36^^xyz</CODE> (meaning \f$44027\f$),
+    <CODE>2^^11.1</CODE> (meaning \f$7/2\f$),
+    <CODE>10^^2e3</CODE> (meaning \f$2000\f$),
+    <CODE>8^^2e3</CODE> (meaning \f$1024\f$),
+    <CODE>8^^2.1e3</CODE> (meaning \f$1088\f$),
+    <CODE>8^^20402543.120347e7</CODE> (meaning \f$9073863231288\f$),
+    <CODE>8^^2.1</CODE> (meaning \f$17/8\f$);
+    note that the base and the exponent are always written as plain
+    base-10 integer numbers; also, when an ambiguity may arise, the
+    character <CODE>e</CODE> is interpreted as a digit, so that
+    <CODE>16^^1e2</CODE> (meaning \f$482\f$) is different from
+    <CODE>16^^1*^2</CODE> (meaning \f$256\f$);
+  - the C-style hexadecimal prefix <CODE>0x</CODE> is interpreted as
+    the Mathematica-style prefix <CODE>16^^</CODE>;
+  - the C-style binary exponent indicator <CODE>p</CODE> can only be used
+    when base 16 has been specified; if used, the exponent will be
+    applied to base 2 (instead of base 16, as is the case when the
+    indicator <CODE>e</CODE> is used);
+  - special values like <CODE>inf</CODE> and <CODE>+inf</CODE>
+    (meaning \f$+\infty\f$), <CODE>-inf</CODE> (meaning \f$-\infty\f$),
+    and <CODE>nan</CODE> (meaning "not a number").
+
+  The rationale behind the accepted syntax can be summarized as follows:
+  - if the syntax is accepted by Mathematica, then this function
+    accepts it with the same semantics;
+  - if the syntax is acceptable as standard C++ integer or floating point
+    literal (except for octal notation and type suffixes, which are not
+    supported), then this function accepts it with the same semantics;
+  - natural extensions of the above are accepted with the natural
+    extensions of the semantics;
+  - special values are accepted.
+
+  Valid syntax is more formally and completely specified by the
+  following grammar, with the additional provisos that everything is
+  <EM>case insensitive</EM>, that the syntactic category
+  <CODE>BDIGIT</CODE> is further restricted by the current base
+  and that for all bases above 14, any <CODE>e</CODE> is always
+  interpreted as a digit and never as a delimiter for the exponent part
+  (if such a delimiter is desired, it has to be written as <CODE>*^</CODE>).
+
+\code
+number  : NAN                                   INF     : 'inf'
+        | SIGN INF                                      ;
+        | INF
+        | num                                   NAN     : 'nan'
+        | num DIV num                                   ;
+        ;
+                                                SIGN    : '-'
+num     : u_num                                         | '+'
+        | SIGN u_num                                    ;
+
+u_num   : u_num1                                EXP     : 'e'
+        | HEX u_num1                                    | 'p'
+        | base BASE u_num1                              | '*^'
+        ;                                               ;
+                                                POINT   : '.'
+u_num1  : mantissa                                      ;
+        | mantissa EXP exponent
+        ;                                       DIV     : '/'
+                                                        ;
+mantissa: bdigits
+        | POINT bdigits                         MINUS   : '-'
+        | bdigits POINT                                 ;
+        | bdigits POINT bdigits
+        ;                                       PLUS    : '+'
+                                                ;
+exponent: SIGN digits
+        | digits                                HEX     : '0x'
+        ;                                       ;
+
+bdigits : BDIGIT                                BASE    : '^^'
+        | bdigits BDIGIT                                ;
+        ;
+                                                DIGIT   : '0' .. '9'
+digits  : DIGIT                                         ;
+        | digits DIGIT
+        ;                                       BDIGIT  : '0' .. '9'
+                                                        | 'a' .. 'z'
+                                                        ;
+\endcode
+*/
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//! Ascii load for native or checked.
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::ostream& s, T& t);
+
+//@} // Input-Output Operators
+
+void throw_result_exception(Result r);
+
+template <typename T>
+T
+plus_infinity();
+
+template <typename T>
+T
+minus_infinity();
+
+template <typename T>
+T
+not_a_number();
+
+//! Swaps \p x with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+template <typename T, typename Policy>
+struct FPU_Related<Checked_Number<T, Policy> > : public FPU_Related<T> {};
+
+template <typename T>
+void maybe_reset_fpu_inexact();
+
+template <typename T>
+int maybe_check_fpu_inexact();
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_inlines.hh line 1. */
+/* Checked_Number class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_inlines.hh line 28. */
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+#ifndef NDEBUG
+#define DEBUG_ROUND_NOT_NEEDED
+#endif
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    return ROUND_CHECK;
+#endif
+  }
+  return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+  if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+    PPL_ASSERT(result_relation(r) == VR_EQ);
+#endif
+    return r;
+  }
+  return r;
+}
+
+
+template <typename T>
+inline void
+Checked_Number_Transparent_Policy<T>::handle_result(Result) {
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+  if (result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number()
+ : v(0) {
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Checked_Number& y) {
+  // TODO: avoid default construction of value member.
+  Checked::copy<Policy, Policy>(v, y.raw_value());
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y,
+                 Rounding_Dir dir) {
+  // TODO: avoid default construction of value member.
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+                                     (v,
+                                      y.raw_value(),
+                                      rounding_dir(dir)),
+                                     dir)
+                        );
+}
+
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const Checked_Number<From, From_Policy>& y) {
+  // TODO: avoid default construction of value member.
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_ext<Policy, From_Policy>
+                                     (v,
+                                      y.raw_value(),
+                                      rounding_dir(dir)),
+                                     dir));
+}
+
+// TODO: avoid default construction of value member.
+#define PPL_DEFINE_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type y, Rounding_Dir dir) { \
+  Policy::handle_result                                                 \
+    (check_result(Checked::assign_ext<Policy,                           \
+                                      Checked_Number_Transparent_Policy<PPL_U(type)> > \
+                  (v, y, rounding_dir(dir)),                            \
+                  dir));                                                \
+}                                                                       \
+template <typename T, typename Policy>                                  \
+inline                                                                  \
+Checked_Number<T, Policy>::Checked_Number(const type y) {               \
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;                 \
+  Policy::handle_result                                                 \
+    (check_result(Checked::assign_ext<Policy,                           \
+                                      Checked_Number_Transparent_Policy<PPL_U(type)> > \
+                  (v, y, rounding_dir(dir)),                            \
+                  dir));                                                \
+}
+
+PPL_DEFINE_CTOR(char)
+PPL_DEFINE_CTOR(signed char)
+PPL_DEFINE_CTOR(signed short)
+PPL_DEFINE_CTOR(signed int)
+PPL_DEFINE_CTOR(signed long)
+PPL_DEFINE_CTOR(signed long long)
+PPL_DEFINE_CTOR(unsigned char)
+PPL_DEFINE_CTOR(unsigned short)
+PPL_DEFINE_CTOR(unsigned int)
+PPL_DEFINE_CTOR(unsigned long)
+PPL_DEFINE_CTOR(unsigned long long)
+#if PPL_SUPPORTED_FLOAT
+PPL_DEFINE_CTOR(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_DEFINE_CTOR(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_DEFINE_CTOR(long double)
+#endif
+PPL_DEFINE_CTOR(mpq_class&)
+PPL_DEFINE_CTOR(mpz_class&)
+
+#undef PPL_DEFINE_CTOR
+
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y, Rounding_Dir dir) {
+  std::istringstream s(y);
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+                                                            s,
+                                                            rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* y) {
+  std::istringstream s(y);
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::input<Policy>(v,
+                                                            s,
+                                                            rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>
+::Checked_Number(const From&,
+                 Rounding_Dir dir,
+                 typename Enable_If<Is_Special<From>::value, bool>::type) {
+  Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+                                                                     From::vclass,
+                                                                     rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename T, typename Policy>
+template <typename From>
+inline
+Checked_Number<T, Policy>::Checked_Number(const From&, typename Enable_If<Is_Special<From>::value, bool>::type) {
+  Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR;
+  Policy::handle_result(check_result(Checked::assign_special<Policy>(v,
+                                                            From::vclass,
+                                                            rounding_dir(dir)),
+                                     dir));
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value
+                          && Is_Special<From>::value, Result>::type
+assign_r(To& to, const From&, Rounding_Dir dir) {
+  return check_result(Checked::assign_special<typename Native_Checked_To_Wrapper<To>
+                      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+                                From::vclass,
+                                rounding_dir(dir)),
+                      dir);
+}
+
+template <typename To, typename From>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value && Is_Special<From>::value, Result>::type
+construct(To& to, const From&, Rounding_Dir dir) {
+  return check_result(Checked::construct_special<typename Native_Checked_To_Wrapper<To>
+                      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+                                From::vclass,
+                                rounding_dir(dir)),
+                      dir);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_minus_infinity(const T& x) {
+  return Checked::is_minf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_plus_infinity(const T& x) {
+  return Checked::is_pinf<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, int>::type
+infinity_sign(const T& x) {
+  return is_minus_infinity(x) ? -1 : (is_plus_infinity(x) ? 1 : 0);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_not_a_number(const T& x) {
+  return Checked::is_nan<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_integer(const T& x) {
+  return Checked::is_int<typename Native_Checked_From_Wrapper<T>
+    ::Policy>(Native_Checked_From_Wrapper<T>::raw_value(x));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::operator T() const {
+  if (Policy::convertible)
+    return v;
+}
+
+template <typename T, typename Policy>
+inline T&
+Checked_Number<T, Policy>::raw_value() {
+  return v;
+}
+
+template <typename T, typename Policy>
+inline const T&
+Checked_Number<T, Policy>::raw_value() const {
+  return v;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline const T&
+raw_value(const Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline T&
+raw_value(Checked_Number<T, Policy>& x) {
+  return x.raw_value();
+}
+
+template <typename T, typename Policy>
+inline bool
+Checked_Number<T, Policy>::OK() const {
+  return true;
+}
+
+template <typename T, typename Policy>
+inline Result
+Checked_Number<T, Policy>::classify(bool nan, bool inf, bool sign) const {
+  return Checked::classify<Policy>(v, nan, inf, sign);
+}
+
+template <typename T, typename Policy>
+inline bool
+is_not_a_number(const Checked_Number<T, Policy>& x) {
+  return Checked::is_nan<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_minus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_minf<Policy>(x.raw_value());
+}
+
+template <typename T, typename Policy>
+inline bool
+is_plus_infinity(const Checked_Number<T, Policy>& x) {
+  return Checked::is_pinf<Policy>(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+total_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return total_memory_in_bytes(x.raw_value());
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline memory_size_type
+external_memory_in_bytes(const Checked_Number<T, Policy>& x) {
+  return external_memory_in_bytes(x.raw_value());
+}
+
+
+/*! \relates Checked_Number */
+template <typename To>
+inline typename Enable_If<Is_Native_Or_Checked<To>::value, Result>::type
+assign_r(To& to, const char* x, Rounding_Dir dir) {
+  std::istringstream s(x);
+  return check_result(Checked::input<typename Native_Checked_To_Wrapper<To>
+                      ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to),
+                                s,
+                                rounding_dir(dir)),
+                      dir);
+}
+
+#define PPL_DEFINE_FUNC1_A(name, func) \
+template <typename To, typename From>                                   \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type                                 \
+ PPL_U(name)(To& to, const From& x, Rounding_Dir dir) {                 \
+  return                                                                \
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>   \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From>             \
+                 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+                           Native_Checked_From_Wrapper<From>::raw_value(x), \
+                           rounding_dir(dir)), dir);                    \
+}
+
+PPL_DEFINE_FUNC1_A(construct, construct_ext)
+PPL_DEFINE_FUNC1_A(assign_r, assign_ext)
+PPL_DEFINE_FUNC1_A(floor_assign_r, floor_ext)
+PPL_DEFINE_FUNC1_A(ceil_assign_r, ceil_ext)
+PPL_DEFINE_FUNC1_A(trunc_assign_r, trunc_ext)
+PPL_DEFINE_FUNC1_A(neg_assign_r, neg_ext)
+PPL_DEFINE_FUNC1_A(abs_assign_r, abs_ext)
+PPL_DEFINE_FUNC1_A(sqrt_assign_r, sqrt_ext)
+
+#undef PPL_DEFINE_FUNC1_A
+
+#define PPL_DEFINE_FUNC1_B(name, func) \
+template <typename To, typename From>                                   \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From>::value,         \
+                          Result>::type                                 \
+ PPL_U(name)(To& to, const From& x, unsigned int exp, Rounding_Dir dir) { \
+  return                                                                \
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>   \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From>             \
+                 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+                           Native_Checked_From_Wrapper<From>::raw_value(x), \
+                           exp,                                         \
+                           rounding_dir(dir)),                          \
+                 dir);                                                  \
+}
+
+PPL_DEFINE_FUNC1_B(add_2exp_assign_r, add_2exp_ext)
+PPL_DEFINE_FUNC1_B(sub_2exp_assign_r, sub_2exp_ext)
+PPL_DEFINE_FUNC1_B(mul_2exp_assign_r, mul_2exp_ext)
+PPL_DEFINE_FUNC1_B(div_2exp_assign_r, div_2exp_ext)
+PPL_DEFINE_FUNC1_B(smod_2exp_assign_r, smod_2exp_ext)
+PPL_DEFINE_FUNC1_B(umod_2exp_assign_r, umod_2exp_ext)
+
+#undef PPL_DEFINE_FUNC1_B
+
+#define PPL_DEFINE_FUNC2(name, func) \
+template <typename To, typename From1, typename From2>                  \
+inline typename Enable_If<Is_Native_Or_Checked<To>::value               \
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type                                 \
+ PPL_U(name)(To& to, const From1& x, const From2& y, Rounding_Dir dir) { \
+  return                                                                \
+    check_result(Checked::func<typename Native_Checked_To_Wrapper<To>   \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From1>            \
+                 ::Policy,                                              \
+                 typename Native_Checked_From_Wrapper<From2>            \
+                 ::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), \
+                           Native_Checked_From_Wrapper<From1>::raw_value(x), \
+                           Native_Checked_From_Wrapper<From2>::raw_value(y), \
+                           rounding_dir(dir)),                          \
+                 dir);                                                  \
+}
+
+PPL_DEFINE_FUNC2(add_assign_r, add_ext)
+PPL_DEFINE_FUNC2(sub_assign_r, sub_ext)
+PPL_DEFINE_FUNC2(mul_assign_r, mul_ext)
+PPL_DEFINE_FUNC2(div_assign_r, div_ext)
+PPL_DEFINE_FUNC2(idiv_assign_r, idiv_ext)
+PPL_DEFINE_FUNC2(rem_assign_r, rem_ext)
+PPL_DEFINE_FUNC2(gcd_assign_r, gcd_ext)
+PPL_DEFINE_FUNC2(lcm_assign_r, lcm_ext)
+PPL_DEFINE_FUNC2(add_mul_assign_r, add_mul_ext)
+PPL_DEFINE_FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef PPL_DEFINE_FUNC2
+
+#define PPL_DEFINE_FUNC4(name, func)                                    \
+template <typename To1,                                                 \
+          typename To2,                                                 \
+          typename To3,                                                 \
+          typename From1,                                               \
+          typename From2>                                               \
+inline typename Enable_If<Is_Native_Or_Checked<To1>::value              \
+                          && Is_Native_Or_Checked<To2>::value           \
+                          && Is_Native_Or_Checked<To3>::value           \
+                          && Is_Native_Or_Checked<From1>::value         \
+                          && Is_Native_Or_Checked<From2>::value,        \
+                          Result>::type                                 \
+ PPL_U(name)(To1& to, To2& s, To3& t, const From1& x, const From2& y,   \
+     Rounding_Dir dir) {                                                \
+  return                                                                \
+    check_result                                                        \
+    (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy,     \
+                   typename Native_Checked_To_Wrapper<To2>::Policy,     \
+                   typename Native_Checked_To_Wrapper<To3>::Policy,     \
+                   typename Native_Checked_From_Wrapper<From1>::Policy, \
+                   typename Native_Checked_From_Wrapper<From2>::Policy> \
+     (Native_Checked_To_Wrapper<To1>::raw_value(to),                    \
+      Native_Checked_To_Wrapper<To2>::raw_value(s),                     \
+      Native_Checked_To_Wrapper<To3>::raw_value(t),                     \
+      Native_Checked_From_Wrapper<From1>::raw_value(x),                 \
+      Native_Checked_From_Wrapper<From2>::raw_value(y),                 \
+      rounding_dir(dir)),                                               \
+     dir);                                                              \
+}
+
+PPL_DEFINE_FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef PPL_DEFINE_PPL_DEFINE_FUNC4
+
+#define PPL_DEFINE_INCREMENT(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f() { \
+  Policy::handle_result((fun)(*this, *this, T(1),             \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+Checked_Number<T, Policy>::f(int) {\
+  T r = v;\
+  Policy::handle_result((fun)(*this, *this, T(1),             \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r;\
+}
+
+PPL_DEFINE_INCREMENT(operator ++, add_assign_r)
+PPL_DEFINE_INCREMENT(operator --, sub_assign_r)
+
+#undef PPL_DEFINE_INCREMENT
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+  Checked::copy<Policy, Policy>(v, y.raw_value());
+  return *this;
+}
+template <typename T, typename Policy>
+template <typename From>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const From& y) {
+  Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+  return *this;
+}
+
+#define PPL_DEFINE_BINARY_OP_ASSIGN(f, fun) \
+template <typename T, typename Policy> \
+template <typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<T, From_Policy>& y) { \
+  Policy::handle_result((fun)(*this, *this, y,                          \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const T& y) { \
+  Policy::handle_result((fun)(*this, *this, y,                \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, \
+                          Checked_Number<T, Policy>& >::type \
+Checked_Number<T, Policy>::f(const From& y) { \
+  Checked_Number<T, Policy> cy(y); \
+  Policy::handle_result((fun)(*this, *this, cy,               \
+                            Policy::ROUND_DEFAULT_OPERATOR)); \
+  return *this; \
+}
+
+PPL_DEFINE_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+PPL_DEFINE_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP_ASSIGN
+
+#define PPL_DEFINE_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+ PPL_U(f)(const Checked_Number<T, Policy>& x,   \
+         const Checked_Number<T, Policy>& y) {  \
+  Checked_Number<T, Policy> r; \
+  Policy::handle_result((fun)(r, x, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename Type, typename T, typename Policy>   \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Type& x, const Checked_Number<T, Policy>& y) {          \
+  Checked_Number<T, Policy> r(x); \
+  Policy::handle_result((fun)(r, r, y, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+} \
+template <typename T, typename Policy, typename Type>   \
+inline \
+typename Enable_If<Is_Native<Type>::value, Checked_Number<T, Policy> >::type \
+ PPL_U(f)(const Checked_Number<T, Policy>& x, const Type& y) {          \
+  Checked_Number<T, Policy> r(y); \
+  Policy::handle_result((fun)(r, x, r, Policy::ROUND_DEFAULT_OPERATOR)); \
+  return r; \
+}
+
+PPL_DEFINE_BINARY_OP(operator +, add_assign_r)
+PPL_DEFINE_BINARY_OP(operator -, sub_assign_r)
+PPL_DEFINE_BINARY_OP(operator *, mul_assign_r)
+PPL_DEFINE_BINARY_OP(operator /, div_assign_r)
+PPL_DEFINE_BINARY_OP(operator %, rem_assign_r)
+
+#undef PPL_DEFINE_BINARY_OP
+
+#define PPL_DEFINE_COMPARE_OP(f, fun)                                   \
+template <typename T1, typename T2>                                     \
+inline                                                                  \
+typename Enable_If<Is_Native_Or_Checked<T1>::value                      \
+                   && Is_Native_Or_Checked<T2>::value                   \
+                   && (Is_Checked<T1>::value || Is_Checked<T2>::value), \
+                   bool>::type                                          \
+ PPL_U(f)(const T1& x, const T2& y) {                                   \
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+                      typename Native_Checked_From_Wrapper<T2>::Policy> \
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),                     \
+     Native_Checked_From_Wrapper<T2>::raw_value(y));                    \
+}
+
+PPL_DEFINE_COMPARE_OP(operator ==, eq_ext)
+PPL_DEFINE_COMPARE_OP(operator !=, ne_ext)
+PPL_DEFINE_COMPARE_OP(operator >=, ge_ext)
+PPL_DEFINE_COMPARE_OP(operator >, gt_ext)
+PPL_DEFINE_COMPARE_OP(operator <=, le_ext)
+PPL_DEFINE_COMPARE_OP(operator <, lt_ext)
+
+#undef PPL_DEFINE_COMPARE_OP
+
+#define PPL_DEFINE_COMPARE(f, fun)                                      \
+template <typename T1, typename T2>                                     \
+inline typename Enable_If<Is_Native_Or_Checked<T1>::value               \
+                          && Is_Native_Or_Checked<T2>::value,           \
+                          bool>::type                                   \
+ PPL_U(f)(const T1& x, const T2& y) {                                   \
+  return Checked::fun<typename Native_Checked_From_Wrapper<T1>::Policy, \
+                      typename Native_Checked_From_Wrapper<T2>::Policy> \
+    (Native_Checked_From_Wrapper<T1>::raw_value(x),                     \
+     Native_Checked_From_Wrapper<T2>::raw_value(y));                    \
+}
+
+PPL_DEFINE_COMPARE(equal, eq_ext)
+PPL_DEFINE_COMPARE(not_equal, ne_ext)
+PPL_DEFINE_COMPARE(greater_or_equal, ge_ext)
+PPL_DEFINE_COMPARE(greater_than, gt_ext)
+PPL_DEFINE_COMPARE(less_or_equal, le_ext)
+PPL_DEFINE_COMPARE(less_than, lt_ext)
+
+#undef PPL_DEFINE_COMPARE
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator+(const Checked_Number<T, Policy>& x) {
+  return x;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>
+operator-(const Checked_Number<T, Policy>& x) {
+  Checked_Number<T, Policy> r;
+  Policy::handle_result(neg_assign_r(r, x, Policy::ROUND_DEFAULT_OPERATOR));
+  return r;
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x) {                               \
+  Policy::handle_result((fun)(x, x, Policy::ROUND_DEFAULT_FUNCTION));   \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+  Policy::handle_result((fun)(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+ PPL_U(f)(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+  const Checked_Number<T, Policy>& z) { \
+  Policy::handle_result((fun)(x, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define PPL_DEFINE_ASSIGN_FUN5_5(f, fun)                                        \
+template <typename T, typename Policy>                                  \
+inline void                                                             \
+ PPL_U(f)(Checked_Number<T, Policy>& x,                                 \
+  Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t,           \
+  const Checked_Number<T, Policy>& y,                                   \
+  const Checked_Number<T, Policy>& z) {                                 \
+  Policy::handle_result((fun)(x, s, t, y, z, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(floor_assign, floor_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(floor_assign, floor_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(ceil_assign, ceil_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(ceil_assign, ceil_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(trunc_assign, trunc_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(trunc_assign, trunc_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN2_1(abs_assign, abs_assign_r)
+PPL_DEFINE_ASSIGN_FUN2_2(abs_assign, abs_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(rem_assign, rem_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+PPL_DEFINE_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef PPL_DEFINE_ASSIGN_FUN2_1
+#undef PPL_DEFINE_ASSIGN_FUN2_2
+#undef PPL_DEFINE_ASSIGN_FUN3_2
+#undef PPL_DEFINE_ASSIGN_FUN3_3
+#undef PPL_DEFINE_ASSIGN_FUN5_5
+
+#define PPL_DEFINE_ASSIGN_2EXP(f, fun)                                  \
+template <typename T, typename Policy>                                  \
+inline void                                                             \
+ PPL_U(f)(Checked_Number<T, Policy>& x,                                 \
+          const Checked_Number<T, Policy>& y, unsigned int exp) {       \
+  Policy::handle_result((fun)(x, y, exp, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+PPL_DEFINE_ASSIGN_2EXP(mul_2exp_assign, mul_2exp_assign_r)
+PPL_DEFINE_ASSIGN_2EXP(div_2exp_assign, div_2exp_assign_r)
+
+template <typename T, typename Policy>
+inline void
+exact_div_assign(Checked_Number<T, Policy>& x,
+                 const Checked_Number<T, Policy>& y,
+                 const Checked_Number<T, Policy>& z) {
+  Policy::handle_result(div_assign_r(x, y, z, ROUND_NOT_NEEDED));
+}
+
+/*! \relates Checked_Number */
+template <typename From>
+inline typename Enable_If<Is_Native_Or_Checked<From>::value, int>::type
+sgn(const From& x) {
+  Result_Relation r = Checked::sgn_ext<typename Native_Checked_From_Wrapper<From>::Policy>(Native_Checked_From_Wrapper<From>::raw_value(x));
+  switch (r) {
+  case VR_LT:
+    return -1;
+  case VR_EQ:
+    return 0;
+  case VR_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename From1, typename From2>
+inline typename Enable_If<Is_Native_Or_Checked<From1>::value
+                          && Is_Native_Or_Checked<From2>::value,
+                          int>::type
+cmp(const From1& x, const From2& y) {
+  Result_Relation r
+    = Checked::cmp_ext<typename Native_Checked_From_Wrapper<From1>::Policy,
+                       typename Native_Checked_From_Wrapper<From2>::Policy>
+                 (Native_Checked_From_Wrapper<From1>::raw_value(x),
+                  Native_Checked_From_Wrapper<From2>::raw_value(y));
+  switch (r) {
+  case VR_LT:
+    return -1;
+  case VR_EQ:
+    return 0;
+  case VR_GT:
+    return 1;
+  default:
+    throw(0);
+  }
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+output(std::ostream& os, const T& x,
+       const Numeric_Format& format, Rounding_Dir dir) {
+  return check_result(Checked::output_ext<typename Native_Checked_From_Wrapper<T>::Policy>
+                      (os,
+                       Native_Checked_From_Wrapper<T>::raw_value(x),
+                       format,
+                       rounding_dir(dir)),
+                      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::ostream&
+operator<<(std::ostream& os, const Checked_Number<T, Policy>& x) {
+  Policy::handle_result(output(os, x, Numeric_Format(), ROUND_IGNORE));
+  return os;
+}
+
+/*! \relates Checked_Number */
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, Result>::type
+input(T& x, std::istream& is, Rounding_Dir dir) {
+  return check_result(Checked::input_ext<typename Native_Checked_To_Wrapper<T>::Policy>
+                      (Native_Checked_To_Wrapper<T>::raw_value(x),
+                       is,
+                       rounding_dir(dir)),
+                      dir);
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline std::istream& operator>>(std::istream& is,
+                                Checked_Number<T, Policy>& x) {
+  Result r = input(x, is, Policy::ROUND_DEFAULT_INPUT);
+  if (r == V_CVT_STR_UNK)
+    is.setstate(std::ios::failbit);
+  else
+    Policy::handle_result(r);
+  return is;
+}
+
+template <typename T>
+inline T
+plus_infinity() {
+  return PLUS_INFINITY;
+}
+
+template <typename T>
+inline T
+minus_infinity() {
+  return MINUS_INFINITY;
+}
+
+template <typename T>
+inline T
+not_a_number() {
+  return NOT_A_NUMBER;
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+  using std::swap;
+  swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T>
+inline void
+maybe_reset_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_reset_inexact();
+}
+
+template <typename T>
+inline int
+maybe_check_fpu_inexact() {
+  if (FPU_Related<T>::value)
+    return fpu_check_inexact();
+  else
+    return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_templates.hh line 1. */
+/* Checked_Number class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Checked_Number_templates.hh line 28. */
+#include <iomanip>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+ascii_dump(std::ostream& s, const T& t) {
+  if (std::numeric_limits<T>::is_exact)
+    // An exact data type: pretty printer is accurate.
+    s << t;
+  else {
+    // An inexact data type (probably floating point):
+    // first dump its hexadecimal representation ...
+    const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+                                                std::ios::basefield);
+    const unsigned char* p = reinterpret_cast<const unsigned char*>(&t);
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      s << std::setw(2) << std::setfill('0') << static_cast<unsigned>(p[i]);
+    }
+    s.flags(old_flags);
+    // ... and then pretty print it for readability.
+    s << " (" << t << ")";
+  }
+}
+
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+ascii_load(std::istream& s, T& t) {
+  if (std::numeric_limits<T>::is_exact) {
+    // An exact data type: input from pretty printed version is accurate.
+    s >> t;
+    return !s.fail();
+  }
+  else {
+    // An inexact data type (probably floating point):
+    // first load its hexadecimal representation ...
+    std::string str;
+    if (!(s >> str) || str.size() != 2*sizeof(T))
+      return false;
+    unsigned char* p = reinterpret_cast<unsigned char*>(&t);
+    // CHECKME: any (portable) simpler way?
+    for (unsigned i = 0; i < sizeof(T); ++i) {
+      unsigned byte_value = 0;
+      for (unsigned j = 0; j < 2; ++j) {
+        byte_value <<= 4;
+        unsigned half_byte_value;
+        // Interpret single hex character.
+        switch (str[2*i + j]) {
+        case '0':
+          half_byte_value = 0;
+          break;
+        case '1':
+          half_byte_value = 1;
+          break;
+        case '2':
+          half_byte_value = 2;
+          break;
+        case '3':
+          half_byte_value = 3;
+          break;
+        case '4':
+          half_byte_value = 4;
+          break;
+        case '5':
+          half_byte_value = 5;
+          break;
+        case '6':
+          half_byte_value = 6;
+          break;
+        case '7':
+          half_byte_value = 7;
+          break;
+        case '8':
+          half_byte_value = 8;
+          break;
+        case '9':
+          half_byte_value = 9;
+          break;
+        case 'A':
+        case 'a':
+          half_byte_value = 10;
+          break;
+        case 'B':
+        case 'b':
+          half_byte_value = 11;
+          break;
+        case 'C':
+        case 'c':
+          half_byte_value = 12;
+          break;
+        case 'D':
+        case 'd':
+          half_byte_value = 13;
+          break;
+        case 'E':
+        case 'e':
+          half_byte_value = 14;
+          break;
+        case 'F':
+        case 'f':
+          half_byte_value = 15;
+          break;
+        default:
+          return false;
+        }
+        byte_value += half_byte_value;
+      }
+      PPL_ASSERT(byte_value <= 255);
+      p[i] = static_cast<unsigned char>(byte_value);
+    }
+    // ... then read and discard pretty printed value.
+    if (!(s >> str))
+      return false;
+    const std::string::size_type sz = str.size();
+    return sz > 2 && str[0] == '(' && str[sz-1] == ')';
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Checked_Number_defs.hh line 1067. */
+
+/* Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 29. */
+#include <limits>
+
+namespace std {
+
+using namespace Parma_Polyhedra_Library;
+
+#define PPL_SPECIALIZE_LIMITS_INT(T)                                    \
+  /*! \brief Partial specialization of std::numeric_limits. */          \
+  template <typename Policy>                                            \
+  class numeric_limits<Checked_Number<PPL_U(T), Policy> >              \
+    : public numeric_limits<PPL_U(T)> {                                 \
+  private:                                                              \
+    typedef Checked_Number<PPL_U(T), Policy> Type;                      \
+                                                                        \
+  public:                                                               \
+    static const bool has_infinity = Policy::has_infinity;              \
+    static const bool has_quiet_NaN =  Policy::has_nan;                 \
+                                                                        \
+    static Type min() {                                                 \
+      Type v;                                                           \
+      v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::min;     \
+      return v;                                                         \
+    }                                                                   \
+                                                                        \
+    static Type max() {                                                 \
+      Type v;                                                           \
+      v.raw_value() = Checked::Extended_Int<Policy, PPL_U(T)>::max;     \
+      return v;                                                         \
+    }                                                                   \
+                                                                        \
+    static Type infinity() {                                            \
+      Type v;                                                           \
+      Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,  \
+                                      ROUND_IGNORE);                    \
+      return v;                                                         \
+    }                                                                   \
+                                                                        \
+    static Type quiet_NaN() {                                           \
+      Type v;                                                           \
+      Checked::assign_special<Policy>(v.raw_value(), VC_NAN,            \
+                                      ROUND_IGNORE);                    \
+      return v;                                                         \
+    }                                                                   \
+  };
+
+PPL_SPECIALIZE_LIMITS_INT(char)
+
+PPL_SPECIALIZE_LIMITS_INT(signed char)
+PPL_SPECIALIZE_LIMITS_INT(signed short)
+PPL_SPECIALIZE_LIMITS_INT(signed int)
+PPL_SPECIALIZE_LIMITS_INT(signed long)
+PPL_SPECIALIZE_LIMITS_INT(signed long long)
+
+PPL_SPECIALIZE_LIMITS_INT(unsigned char)
+PPL_SPECIALIZE_LIMITS_INT(unsigned short)
+PPL_SPECIALIZE_LIMITS_INT(unsigned int)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long)
+PPL_SPECIALIZE_LIMITS_INT(unsigned long long)
+
+#undef PPL_SPECIALIZE_LIMITS_INT
+
+#define PPL_SPECIALIZE_LIMITS_FLOAT(T)                                  \
+  /*! \brief Partial specialization of std::numeric_limits. */          \
+  template <typename Policy>                                            \
+  struct numeric_limits<Checked_Number<PPL_U(T), Policy> >              \
+    : public numeric_limits<PPL_U(T)> {                                 \
+};
+
+#if PPL_SUPPORTED_FLOAT
+PPL_SPECIALIZE_LIMITS_FLOAT(float)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(double)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+PPL_SPECIALIZE_LIMITS_FLOAT(long double)
+#endif
+
+#undef PPL_SPECIALIZE_LIMITS_FLOAT
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpz_class, Policy> >
+  : public numeric_limits<mpz_class> {
+private:
+  typedef Checked_Number<mpz_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
+
+  static Type infinity() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+                                    ROUND_IGNORE);
+    return v;
+  }
+
+  static Type quiet_NaN() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+    return v;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+class
+numeric_limits<Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+  typedef Checked_Number<mpq_class, Policy> Type;
+
+public:
+  static const bool has_infinity = Policy::has_infinity;
+  static const bool has_quiet_NaN =  Policy::has_nan;
+
+  static Type infinity() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_PLUS_INFINITY,
+                                    ROUND_IGNORE);
+    return v;
+  }
+
+  static Type quiet_NaN() {
+    Type v;
+    Checked::assign_special<Policy>(v.raw_value(), VC_NAN, ROUND_IGNORE);
+    return v;
+  }
+};
+
+} // namespace std
+
+/* Automatically generated from PPL source file ../src/stdiobuf_defs.hh line 1. */
+/* stdiobuf class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/stdiobuf_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class stdiobuf;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/stdiobuf_defs.hh line 28. */
+#include <cstdio>
+#include <streambuf>
+
+class Parma_Polyhedra_Library::stdiobuf
+  : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+  //! Constructor.
+  stdiobuf(FILE* file);
+
+protected:
+  /*! \brief
+    Gets a character in case of underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type underflow();
+
+  /*! \brief
+    In case of underflow, gets a character and advances the next pointer.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type uflow();
+
+  /*! \brief
+    Gets a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+  /*! \brief
+    Puts character back in case of backup underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+  */
+  virtual int_type pbackfail(int_type c = traits_type::eof());
+
+  /*! \brief
+    Writes a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+  /*! \brief
+    Writes a character in case of overflow.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual int_type overflow(int_type c);
+
+  /*! \brief
+    Synchronizes the stream buffer.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+  */
+  virtual int sync();
+
+private:
+  //! Character type of the streambuf.
+  typedef char char_type;
+
+  //! Traits type of the streambuf.
+  typedef std::char_traits<char_type> traits_type;
+
+  //! Integer type of the streambuf.
+  typedef traits_type::int_type int_type;
+
+  //! The encapsulated stdio file.
+  FILE* fp;
+
+  //! Buffer for the last character read.
+  int_type unget_char_buf;
+};
+
+/* Automatically generated from PPL source file ../src/stdiobuf_inlines.hh line 1. */
+/* stdiobuf class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+stdiobuf::stdiobuf(FILE* file)
+  : fp(file), unget_char_buf(traits_type::eof()) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/stdiobuf_defs.hh line 110. */
+
+/* Automatically generated from PPL source file ../src/c_streambuf_defs.hh line 1. */
+/* c_streambuf class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/c_streambuf_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class c_streambuf;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/c_streambuf_defs.hh line 28. */
+#include <streambuf>
+#include <cstddef>
+
+class Parma_Polyhedra_Library::c_streambuf
+  : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+  //! Constructor.
+  c_streambuf();
+
+  //! Destructor.
+  virtual ~c_streambuf();
+
+protected:
+  /*! \brief
+    Gets a character in case of underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type underflow();
+
+  /*! \brief
+    In case of underflow, gets a character and advances the next pointer.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type uflow();
+
+  /*! \brief
+    Gets a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+  /*! \brief
+    Puts character back in case of backup underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+  */
+  virtual int_type pbackfail(int_type c = traits_type::eof());
+
+  /*! \brief
+    Writes a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+  /*! \brief
+    Writes a character in case of overflow.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual int_type overflow(int_type c);
+
+  /*! \brief
+    Synchronizes the stream buffer.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+  */
+  virtual int sync();
+
+private:
+  //! Character type of the streambuf.
+  typedef char char_type;
+
+  //! Traits type of the streambuf.
+  typedef std::char_traits<char_type> traits_type;
+
+  //! Integer type of the streambuf.
+  typedef traits_type::int_type int_type;
+
+  //! Buffer for the last character read.
+  int_type unget_char_buf;
+
+  //! Buffer for next character
+  int_type next_char_buf;
+
+  virtual size_t cb_read(char *, size_t) {
+    return 0;
+  }
+  virtual size_t cb_write(const char *, size_t) {
+    return 0;
+  }
+  virtual int cb_sync() {
+    return 0;
+  }
+  virtual int cb_flush() {
+    return 0;
+  }
+};
+
+/* Automatically generated from PPL source file ../src/c_streambuf_inlines.hh line 1. */
+/* c_streambuf class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+c_streambuf::c_streambuf()
+  : unget_char_buf(traits_type::eof()), next_char_buf(traits_type::eof()) {
+}
+
+inline
+c_streambuf::~c_streambuf() {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/c_streambuf_defs.hh line 126. */
+
+/* Automatically generated from PPL source file ../src/Integer_Interval.hh line 1. */
+/* Integer_Interval class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Interval_defs.hh line 1. */
+/* Declarations for the Interval class and its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/assign_or_swap.hh line 1. */
+/* The assign_or_swap() utility functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Has_Assign_Or_Swap.hh line 1. */
+/* Has_Assign_Or_Swap classes declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Has_Assign_Or_Swap.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is not present by default.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Enable = void>
+struct Has_Assign_Or_Swap : public False {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  The assign_or_swap() method is present if it is present (!).
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+struct Has_Assign_Or_Swap<T,
+                          typename Enable_If_Is<void (T::*)(T& x),
+                                                &T::assign_or_swap>::type>
+  : public True {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/assign_or_swap.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is an assign_or_swap() method, use it.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<Has_Assign_Or_Swap<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to.assign_or_swap(from);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() method but copies are not slow, copy.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && !Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  to = from;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface
+  If there is no assign_or_swap() and copies are slow, delegate to swap().
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline typename Enable_If<!Has_Assign_Or_Swap<T>::value
+                          && Slow_Copy<T>::value, void>::type
+assign_or_swap(T& to, T& from) {
+  using std::swap;
+  swap(to, from);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/intervals_defs.hh line 1. */
+/* Helper classes for intervals.
+*/
+
+
+/* Automatically generated from PPL source file ../src/intervals_defs.hh line 28. */
+#include <cstdlib>
+
+/* Automatically generated from PPL source file ../src/intervals_defs.hh line 31. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The result of an operation on intervals.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum I_Result {
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_EMPTY = 1U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may have only one value.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_SINGLETON = 2U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief \hideinitializer
+    Result may have more than one value, but it is not the domain universe.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_SOME = 4U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_UNIVERSE = 8U,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_NOT_EMPTY = I_SINGLETON | I_SOME | I_UNIVERSE,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_ANY = I_EMPTY | I_NOT_EMPTY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result may be empty or not empty.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_NOT_UNIVERSE = I_EMPTY | I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is neither empty nor the domain universe.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_NOT_DEGENERATE = I_SINGLETON | I_SOME,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is definitely exact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_EXACT = 16,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Result is definitely inexact.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_INEXACT = 32,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Operation has definitely changed the set.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_CHANGED = 64,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Operation has left the set definitely unchanged.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_UNCHANGED = 128,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \hideinitializer Operation is undefined for some combination of values.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  I_SINGULARITIES = 256
+};
+
+inline I_Result
+operator|(I_Result a, I_Result b) {
+  return static_cast<I_Result>(static_cast<unsigned>(a)
+                               | static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator&(I_Result a, I_Result b) {
+  return static_cast<I_Result>(static_cast<unsigned>(a)
+                               & static_cast<unsigned>(b));
+}
+
+inline I_Result
+operator-(I_Result a, I_Result b) {
+    return static_cast<I_Result>(static_cast<unsigned>(a)
+                                 & ~static_cast<unsigned>(b));
+}
+
+template <typename Criteria, typename T>
+struct Use_By_Ref;
+
+struct Use_Slow_Copy;
+template <typename T>
+struct Use_By_Ref<Use_Slow_Copy, T>
+  : public Bool<Slow_Copy<T>::value> {
+};
+
+struct By_Value;
+template <typename T>
+struct Use_By_Ref<By_Value, T>
+  : public False {
+};
+
+struct By_Ref;
+template <typename T>
+struct Use_By_Ref<By_Ref, T>
+  : public True {
+};
+
+template <typename T, typename Criteria = Use_Slow_Copy, typename Enable = void>
+class Val_Or_Ref;
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+                 typename Enable_If<!Use_By_Ref<Criteria, T>::value>::type> {
+  T value;
+public:
+  typedef T Arg_Type;
+  typedef T Return_Type;
+  Val_Or_Ref()
+    : value() {
+  }
+  explicit Val_Or_Ref(Arg_Type v, bool = false)
+    : value(v) {
+  }
+  Val_Or_Ref& operator=(Arg_Type v) {
+    value = v;
+    return *this;
+  }
+  void set(Arg_Type v, bool = false) {
+    value = v;
+  }
+  Return_Type get() const {
+    return value;
+  }
+  operator Return_Type () const {
+    return get();
+  }
+};
+
+template <typename T, typename Criteria>
+class Val_Or_Ref<T, Criteria,
+                 typename Enable_If<Use_By_Ref<Criteria, T>::value>::type> {
+  const T* ptr;
+public:
+  typedef T& Arg_Type;
+  typedef const T& Return_Type;
+  Val_Or_Ref()
+    : ptr(0) {
+  }
+  explicit Val_Or_Ref(Arg_Type v)
+    : ptr(&v) {
+  }
+  Val_Or_Ref(const T& v, bool)
+    : ptr(&v) {
+  }
+  Val_Or_Ref& operator=(Arg_Type v) {
+    ptr = &v;
+    return *this;
+  }
+  void set(Arg_Type v) {
+    ptr = &v;
+  }
+  void set(const T& v, bool) {
+    ptr = &v;
+  }
+  Return_Type get() const {
+    return *ptr;
+  }
+  operator Return_Type () const {
+    return get();
+  }
+};
+
+class I_Constraint_Base {
+};
+
+template <typename Derived>
+class I_Constraint_Common : public I_Constraint_Base {
+public:
+  template <typename T>
+  Result convert_real(T& to) const {
+    const Derived& c = static_cast<const Derived&>(*this);
+    Result r = c.rel();
+    switch (r) {
+    case V_EMPTY:
+    case V_LGE:
+      return r;
+    case V_LE:
+      r = assign_r(to, c.value(), (ROUND_UP | ROUND_STRICT_RELATION));
+      r = result_relation_class(r);
+      if (r == V_EQ)
+        return V_LE;
+      goto lt;
+    case V_LT:
+      r = assign_r(to, c.value(), ROUND_UP);
+      r = result_relation_class(r);
+    lt:
+      switch (r) {
+      case V_EMPTY:
+      case V_LT_PLUS_INFINITY:
+      case V_EQ_MINUS_INFINITY:
+        return r;
+      case V_LT:
+      case V_LE:
+      case V_EQ:
+        return V_LT;
+      default:
+        break;
+      }
+      break;
+    case V_GE:
+      r = assign_r(to, c.value(), (ROUND_DOWN | ROUND_STRICT_RELATION));
+      r = result_relation_class(r);
+      if (r == V_EQ)
+        return V_GE;
+      goto gt;
+    case V_GT:
+      r = assign_r(to, c.value(), ROUND_DOWN);
+      r = result_relation_class(r);
+    gt:
+      switch (r) {
+      case V_EMPTY:
+      case V_GT_MINUS_INFINITY:
+      case V_EQ_PLUS_INFINITY:
+        return r;
+      case V_LT:
+      case V_LE:
+      case V_EQ:
+        return V_GT;
+      default:
+        break;
+      }
+      break;
+    case V_EQ:
+      r = assign_r(to, c.value(), ROUND_CHECK);
+      r = result_relation_class(r);
+      PPL_ASSERT(r != V_LT && r != V_GT);
+      if (r == V_EQ)
+        return V_EQ;
+      else
+        return V_EMPTY;
+    case V_NE:
+      r = assign_r(to, c.value(), ROUND_CHECK);
+      r = result_relation_class(r);
+      if (r == V_EQ)
+        return V_NE;
+      else
+        return V_LGE;
+    default:
+      break;
+    }
+    PPL_UNREACHABLE;
+    return V_EMPTY;
+  }
+  template <typename T>
+  Result convert_real(T& to1, Result& rel2, T& to2) const {
+    const Derived& c = static_cast<const Derived&>(*this);
+    Result rel1;
+    if (c.rel() != V_EQ) {
+      rel2 = convert(to2);
+      return V_LGE;
+    }
+    rel2 = assign_r(to2, c.value(), ROUND_UP);
+    rel2 = result_relation_class(rel2);
+    switch (rel2) {
+    case V_EMPTY:
+    case V_EQ_MINUS_INFINITY:
+    case V_EQ:
+      return V_LGE;
+    default:
+      break;
+    }
+    rel1 = assign_r(to1, c.value(), ROUND_DOWN);
+    rel1 = result_relation_class(rel1);
+    switch (rel1) {
+    case V_EQ:
+      PPL_ASSERT(rel2 == V_LE);
+      goto eq;
+    case V_EQ_PLUS_INFINITY:
+    case V_EMPTY:
+      rel2 = rel1;
+      return V_LGE;
+    case V_GE:
+      if (rel2 == V_LE && to1 == to2) {
+      eq:
+        rel2 = V_EQ;
+        return V_LGE;
+      }
+      /* Fall through*/
+    case V_GT:
+    case V_GT_MINUS_INFINITY:
+      return rel1;
+    default:
+      PPL_UNREACHABLE;
+      return V_EMPTY;
+    }
+    switch (rel2) {
+    case V_LE:
+    case V_LT:
+    case V_LT_PLUS_INFINITY:
+      return rel1;
+    default:
+      PPL_UNREACHABLE;
+      return V_EMPTY;
+    }
+  }
+  template <typename T>
+  Result convert_integer(T& to) const {
+    Result rel = convert_real(to);
+    switch (rel) {
+    case V_LT:
+      if (is_integer(to)) {
+        rel = sub_assign_r(to, to, T(1), (ROUND_UP | ROUND_STRICT_RELATION));
+        rel = result_relation_class(rel);
+        return (rel == V_EQ) ? V_LE : rel;
+      }
+      /* Fall through */
+    case V_LE:
+      rel = floor_assign_r(to, to, ROUND_UP);
+      rel = result_relation_class(rel);
+      PPL_ASSERT(rel == V_EQ);
+      return V_LE;
+    case V_GT:
+      if (is_integer(to)) {
+        rel = add_assign_r(to, to, T(1), (ROUND_DOWN | ROUND_STRICT_RELATION));
+        rel = result_relation_class(rel);
+        return (rel == V_EQ) ? V_GE : rel;
+      }
+      /* Fall through */
+    case V_GE:
+      rel = ceil_assign_r(to, to, ROUND_DOWN);
+      rel = result_relation_class(rel);
+      PPL_ASSERT(rel == V_EQ);
+      return V_GE;
+    case V_EQ:
+      if (is_integer(to))
+        return V_EQ;
+      return V_EMPTY;
+    case V_NE:
+      if (is_integer(to))
+        return V_NE;
+      return V_LGE;
+    default:
+      return rel;
+    }
+  }
+};
+
+struct I_Constraint_Rel {
+  Result rel;
+  I_Constraint_Rel(Result r)
+    : rel(r) {
+    PPL_ASSERT(result_relation_class(r) == r);
+  }
+  I_Constraint_Rel(Relation_Symbol r)
+    : rel(static_cast<Result>(r)) {
+  }
+  operator Result() const {
+    return rel;
+  }
+};
+
+template <typename T, typename Val_Or_Ref_Criteria = Use_Slow_Copy,
+          bool extended = false>
+class I_Constraint
+  : public I_Constraint_Common<I_Constraint<T, Val_Or_Ref_Criteria,
+                                            extended> > {
+  typedef Val_Or_Ref<T, Val_Or_Ref_Criteria> Val_Ref;
+  typedef typename Val_Ref::Arg_Type Arg_Type;
+  typedef typename Val_Ref::Return_Type Return_Type;
+  Result rel_;
+  Val_Ref value_;
+public:
+  typedef T value_type;
+  explicit I_Constraint()
+    : rel_(V_LGE) {
+  }
+  I_Constraint(I_Constraint_Rel r, Arg_Type v)
+    : rel_(r), value_(v) {
+  }
+  I_Constraint(I_Constraint_Rel r, const T& v, bool force)
+    : rel_(r), value_(v, force) {
+  }
+  template <typename U>
+  I_Constraint(I_Constraint_Rel r, const U& v)
+    : rel_(r), value_(v) {
+  }
+  void set(I_Constraint_Rel r, Arg_Type v) {
+    rel_ =  r;
+    value_.set(v);
+  }
+  void set(I_Constraint_Rel r, const T& v, bool force) {
+    rel_ =  r;
+    value_.set(v, force);
+  }
+  template <typename U>
+  void set(I_Constraint_Rel r, const U& v) {
+    rel_ = r;
+    value_.set(v);
+  }
+  Return_Type value() const {
+    return value_;
+  }
+  Result rel() const {
+    return rel_;
+  }
+};
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v) {
+  return I_Constraint<T>(rel, v);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force) {
+  return I_Constraint<T>(rel, v, force);
+}
+
+template <typename T>
+inline I_Constraint<T>
+i_constraint(I_Constraint_Rel rel, T& v) {
+  return I_Constraint<T>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, const Val_Or_Ref_Criteria&) {
+  return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, const T& v, bool force,
+             const Val_Or_Ref_Criteria&) {
+  return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v, force);
+}
+
+template <typename T, typename Val_Or_Ref_Criteria>
+inline I_Constraint<T, Val_Or_Ref_Criteria>
+i_constraint(I_Constraint_Rel rel, T& v, const Val_Or_Ref_Criteria&) {
+  return I_Constraint<T, Val_Or_Ref_Criteria>(rel, v);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_Info_defs.hh line 1. */
+/* Interval_Info class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Boundary_defs.hh line 1. */
+/* Interval boundary functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Boundary_defs.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Boundary_NS {
+
+struct Property {
+  enum Type {
+    SPECIAL_,
+    OPEN_,
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+static const Property SPECIAL(Property::SPECIAL_);
+static const Property OPEN(Property::OPEN_);
+
+enum Boundary_Type {
+  LOWER = ROUND_DOWN,
+  UPPER = ROUND_UP
+};
+
+inline Rounding_Dir
+round_dir_check(Boundary_Type t, bool check = false) {
+  if (check)
+    return static_cast<Rounding_Dir>(t) | ROUND_STRICT_RELATION;
+  else
+    return static_cast<Rounding_Dir>(t);
+}
+
+template <typename T, typename Info>
+inline Result
+special_set_boundary_infinity(Boundary_Type type, T&, Info& info) {
+  PPL_ASSERT(Info::store_special);
+  info.set_boundary_property(type, SPECIAL);
+  return V_EQ;
+}
+
+template <typename T, typename Info>
+inline bool
+special_is_open(Boundary_Type, const T&, const Info&) {
+  return !Info::may_contain_infinity;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::store_special && !Info::may_contain_infinity
+      && normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_open(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_open)
+    return info.get_boundary_property(type, OPEN);
+  else
+    return !Info::may_contain_infinity
+      && is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline Result
+set_unbounded(Boundary_Type type, T& x, Info& info) {
+  PPL_COMPILE_TIME_CHECK(Info::store_special
+                         || std::numeric_limits<T>::is_bounded
+                         || std::numeric_limits<T>::has_infinity,
+                         "unbounded is not representable");
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, ROUND_UP);
+  else
+    r = assign_r(x, PLUS_INFINITY, ROUND_DOWN);
+  if (result_relation(r) == VR_EQ && !Info::may_contain_infinity)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_minus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  if (open) {
+    PPL_ASSERT(type == LOWER);
+  }
+  else {
+    PPL_ASSERT(Info::may_contain_infinity);
+  }
+  Result r;
+  if (Info::store_special) {
+    PPL_ASSERT(type == LOWER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else {
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+    PPL_ASSERT(result_representable(r));
+  }
+  if (open || result_relation(r) != VR_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_plus_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  if (open) {
+    PPL_ASSERT(type == UPPER);
+  }
+  else {
+    PPL_ASSERT(Info::may_contain_infinity);
+  }
+  Result r;
+  if (Info::store_special) {
+    PPL_ASSERT(type == UPPER);
+    r = special_set_boundary_infinity(type, x, info);
+  }
+  else {
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+    PPL_ASSERT(result_representable(r));
+  }
+  if (open || result_relation(r) != VR_EQ)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline Result
+set_boundary_infinity(Boundary_Type type, T& x, Info& info, bool open = false) {
+  PPL_ASSERT(open || Info::may_contain_infinity);
+  Result r;
+  if (Info::store_special)
+    r = special_set_boundary_infinity(type, x, info);
+  else if (type == LOWER)
+    r = assign_r(x, MINUS_INFINITY, round_dir_check(type));
+  else
+    r = assign_r(x, PLUS_INFINITY, round_dir_check(type));
+  PPL_ASSERT(result_representable(r));
+  if (open)
+    info.set_boundary_property(type, OPEN);
+  return r;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_inf(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special && type == LOWER)
+    return info.get_boundary_property(type, SPECIAL);
+  else if (std::numeric_limits<T>::has_infinity)
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+  else if (std::numeric_limits<T>::is_bounded)
+    return x == std::numeric_limits<T>::min();
+  else
+    return false;
+}
+
+template <typename T, typename Info>
+inline bool
+is_domain_sup(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special && type == UPPER)
+    return info.get_boundary_property(type, SPECIAL);
+  else if (std::numeric_limits<T>::has_infinity)
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+  else if (std::numeric_limits<T>::is_bounded)
+      return x == std::numeric_limits<T>::max();
+  else
+    return false;
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_boundary_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (!std::numeric_limits<T>::has_infinity)
+    return false;
+  if (type == LOWER)
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (Info::store_special)
+    return info.get_boundary_property(type, SPECIAL);
+  else
+    return normal_is_boundary_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+normal_is_reverse_infinity(Boundary_Type type, const T& x, const Info&) {
+  if (!Info::may_contain_infinity)
+    return false;
+  else if (type == LOWER)
+    return Parma_Polyhedra_Library::is_plus_infinity(x);
+  else
+    return Parma_Polyhedra_Library::is_minus_infinity(x);
+}
+
+template <typename T, typename Info>
+inline bool
+is_minus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == LOWER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_plus_infinity(Boundary_Type type, const T& x, const Info& info) {
+  if (type == UPPER) {
+    if (Info::store_special)
+      return info.get_boundary_property(type, SPECIAL);
+    else
+      return normal_is_boundary_infinity(type, x, info);
+  }
+  else
+    return !Info::store_special && normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline bool
+is_reverse_infinity(Boundary_Type type, const T& x, const Info& info) {
+  return normal_is_reverse_infinity(type, x, info);
+}
+
+template <typename T, typename Info>
+inline int
+infinity_sign(Boundary_Type type, const T& x, const Info& info) {
+  if (is_boundary_infinity(type, x, info))
+    return (type == LOWER) ? -1 : 1;
+  else if (is_reverse_infinity(type, x, info))
+    return (type == UPPER) ? -1 : 1;
+  else
+    return 0;
+}
+
+template <typename T, typename Info>
+inline bool
+is_boundary_infinity_closed(Boundary_Type type, const T& x, const Info& info) {
+  return Info::may_contain_infinity
+    && !info.get_boundary_property(type, OPEN)
+    && is_boundary_infinity(type, x, info);
+}
+
+template <typename Info>
+inline bool
+boundary_infinity_is_open(Boundary_Type type, const Info& info) {
+  return !Info::may_contain_infinity
+    || info.get_boundary_property(type, OPEN);
+}
+
+template <typename T, typename Info>
+inline int
+sgn_b(Boundary_Type type, const T& x, const Info& info) {
+  if (info.get_boundary_property(type, SPECIAL))
+    return (type == LOWER) ? -1 : 1;
+  else
+    // The following Parma_Polyhedra_Library:: qualification is to work
+    // around a bug of GCC 4.0.x.
+    return Parma_Polyhedra_Library::sgn(x);
+}
+
+template <typename T, typename Info>
+inline int
+sgn(Boundary_Type type, const T& x, const Info& info) {
+  int sign = sgn_b(type, x, info);
+  if (x == 0 && info.get_boundary_property(type, OPEN))
+    return (type == LOWER) ? -1 : 1;
+  else
+    return sign;
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+eq(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (type1 == type2) {
+    if (is_open(type1, x1, info1)
+        != is_open(type2, x2, info2))
+      return false;
+  }
+  else if (is_open(type1, x1, info1)
+           || is_open(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1))
+    return is_minus_infinity(type2, x2, info2);
+  else if (is_plus_infinity(type1, x1, info1))
+    return is_plus_infinity(type2, x2, info2);
+  else if (is_minus_infinity(type2, x2, info2)
+           || is_plus_infinity(type2, x2, info2))
+    return false;
+  else
+    return equal(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+lt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (is_open(type1, x1, info1)) {
+    if (type1 == UPPER
+        && (type2 == LOWER
+            || !is_open(type2, x2, info2)))
+      goto le;
+  }
+  else if (type2 == LOWER
+           && is_open(type2, x2, info2)) {
+  le:
+    if (is_minus_infinity(type1, x1, info1)
+        || is_plus_infinity(type2, x2, info2))
+      return true;
+    if (is_plus_infinity(type1, x1, info1)
+        || is_minus_infinity(type2, x2, info2))
+      return false;
+    else
+      return less_or_equal(x1, x2);
+  }
+  if (is_plus_infinity(type1, x1, info1)
+      || is_minus_infinity(type2, x2, info2))
+    return false;
+  if (is_minus_infinity(type1, x1, info1)
+      || is_plus_infinity(type2, x2, info2))
+    return true;
+  else
+    return less_than(x1, x2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+gt(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return lt(type2, x2, info2, type1, x1, info1);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+le(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !gt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T1, typename Info1, typename T2, typename Info2>
+inline bool
+ge(Boundary_Type type1, const T1& x1, const Info1& info1,
+   Boundary_Type type2, const T2& x2, const Info2& info2) {
+  return !lt(type1, x1, info1, type2, x2, info2);
+}
+
+template <typename T, typename Info>
+inline Result
+adjust_boundary(Boundary_Type type, T& x, Info& info,
+                bool open, Result r) {
+  r = result_relation_class(r);
+  if (type == LOWER) {
+    switch (r) {
+    case V_GT_MINUS_INFINITY:
+      open = true;
+      /* Fall through */
+    case V_EQ_MINUS_INFINITY:
+      if (!Info::store_special)
+        return r;
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_GT:
+      open = true;
+      /* Fall through */
+    case V_GE:
+    case V_EQ:
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return r;
+    default:
+      PPL_UNREACHABLE;
+      return V_NAN;
+    }
+  }
+  else {
+    switch (r) {
+    case V_LT_PLUS_INFINITY:
+      open = true;
+      /* Fall through */
+    case V_EQ_PLUS_INFINITY:
+      if (!Info::store_special)
+        return r;
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return special_set_boundary_infinity(type, x, info);
+    case V_LT:
+      open = true;
+      /* Fall through */
+    case V_LE:
+    case V_EQ:
+      if (open)
+        info.set_boundary_property(type, OPEN);
+      return r;
+    default:
+      PPL_UNREACHABLE;
+      return V_NAN;
+    }
+  }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+complement(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  PPL_ASSERT(to_type != type);
+  bool should_shrink;
+  if (info.get_boundary_property(type, SPECIAL)) {
+    should_shrink = !special_is_open(type, x, info);
+    if (type == LOWER)
+      return set_minus_infinity(to_type, to, to_info, should_shrink);
+    else
+      return set_plus_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = !normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+assign(Boundary_Type to_type, To& to, To_Info& to_info,
+       Boundary_Type type, const T& x, const Info& info,
+       bool should_shrink = false) {
+  PPL_ASSERT(to_type == type);
+  if (info.get_boundary_property(type, SPECIAL)) {
+    should_shrink = (should_shrink || special_is_open(type, x, info));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (should_shrink || normal_is_open(type, x, info));
+  const bool check
+    = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  const Result r = assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  if (lt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+min_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (lt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  if (gt(type, x, info, to_type, to, to_info)) {
+    to_info.clear_boundary_properties(to_type);
+    return assign(to_type, to, to_info, type, x, info);
+  }
+  return V_EQ;
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+max_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  if (gt(type1, x1, info1, type2, x2, info2))
+    return assign(to_type, to, to_info, type1, x1, info1);
+  else
+    return assign(to_type, to, to_info, type2, x2, info2);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+neg_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type, const T& x, const Info& info) {
+  PPL_ASSERT(to_type != type);
+  bool should_shrink;
+  if (info.get_boundary_property(type, SPECIAL)) {
+    should_shrink = special_is_open(type, x, info);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = neg_assign_r(to, x, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+add_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  PPL_ASSERT(type1 == type2);
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = (boundary_infinity_is_open(type1, info1)
+                     && !is_boundary_infinity_closed(type2, x2, info2));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = (boundary_infinity_is_open(type2, info2)
+                     && !is_boundary_infinity_closed(type1, x1, info1));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  // FIXME: extended handling is not needed
+  Result r = add_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+sub_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  PPL_ASSERT(type1 != type2);
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = (boundary_infinity_is_open(type1, info1)
+                     && !is_boundary_infinity_closed(type2, x2, info2));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = (boundary_infinity_is_open(type2, info2)
+                     && !is_boundary_infinity_closed(type1, x1, info1));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  // FIXME: extended handling is not needed
+  Result r = sub_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = (boundary_infinity_is_open(type1, info1)
+                     && !is_boundary_infinity_closed(type2, x2, info2));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = (boundary_infinity_is_open(type2, info2)
+                     && !is_boundary_infinity_closed(type1, x1, info1));
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = mul_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info>
+inline Result
+set_zero(Boundary_Type to_type, To& to, To_Info& to_info, bool should_shrink) {
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = assign_r(to, Constant<0>::value, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+mul_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+             Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+             Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  bool should_shrink;
+  if (x1s != 0) {
+    if (x2s != 0)
+      return mul_assign(to_type, to, to_info,
+                        type1, x1, info1,
+                        type2, x2, info2);
+    else
+      should_shrink = info2.get_boundary_property(type2, OPEN);
+  }
+  else {
+    should_shrink = (info1.get_boundary_property(type1, OPEN)
+                     && (x2s != 0 || info2.get_boundary_property(type2, OPEN)));
+  }
+  return set_zero(to_type, to, to_info, should_shrink);
+}
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+           Boundary_Type type1, const T1& x1, const Info1& info1,
+           Boundary_Type type2, const T2& x2, const Info2& info2) {
+  bool should_shrink;
+  if (is_boundary_infinity(type1, x1, info1)) {
+    should_shrink = boundary_infinity_is_open(type1, info1);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  else if (is_boundary_infinity(type2, x2, info2)) {
+    should_shrink = boundary_infinity_is_open(type2, info2);
+    return set_zero(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = (normal_is_open(type1, x1, info1)
+                   || normal_is_open(type2, x2, info2));
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  PPL_ASSERT(x1 != Constant<0>::value && x2 != Constant<0>::value);
+  // FIXME: extended handling is not needed
+  Result r = div_assign_r(to, x1, x2, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+
+template <typename To, typename To_Info, typename T1, typename Info1, typename T2, typename Info2>
+inline Result
+div_assign_z(Boundary_Type to_type, To& to, To_Info& to_info,
+             Boundary_Type type1, const T1& x1, const Info1& info1, int x1s,
+             Boundary_Type type2, const T2& x2, const Info2& info2, int x2s) {
+  if (x1s != 0) {
+    if (x2s != 0)
+      return div_assign(to_type, to, to_info,
+                        type1, x1, info1,
+                        type2, x2, info2);
+    else {
+      return set_boundary_infinity(to_type, to, to_info, true);
+    }
+  }
+  else {
+    bool should_shrink = info1.get_boundary_property(type1, OPEN)
+      && !is_boundary_infinity_closed(type2, x2, info2);
+    return set_zero(to_type, to, to_info, should_shrink);
+  }
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+umod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+                 Boundary_Type type, const T& x, const Info& info,
+                 unsigned int exp) {
+  PPL_ASSERT(to_type == type);
+  bool should_shrink;
+  if (is_boundary_infinity(type, x, info)) {
+    should_shrink = boundary_infinity_is_open(type, info);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = umod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+template <typename To, typename To_Info, typename T, typename Info>
+inline Result
+smod_2exp_assign(Boundary_Type to_type, To& to, To_Info& to_info,
+                 Boundary_Type type, const T& x, const Info& info,
+                 unsigned int exp) {
+  PPL_ASSERT(to_type == type);
+  bool should_shrink;
+  if (is_boundary_infinity(type, x, info)) {
+    should_shrink = boundary_infinity_is_open(type, info);
+    return set_boundary_infinity(to_type, to, to_info, should_shrink);
+  }
+  should_shrink = normal_is_open(type, x, info);
+  bool check = (To_Info::check_inexact || (!should_shrink && To_Info::store_open));
+  Result r = smod_2exp_assign_r(to, x, exp, round_dir_check(to_type, check));
+  return adjust_boundary(to_type, to, to_info, should_shrink, r);
+}
+
+} // namespace Boundary_NS
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_Info_defs.hh line 28. */
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Interval_NS {
+
+struct Property {
+  enum Type {
+    CARDINALITY_0_,
+    CARDINALITY_1_,
+    CARDINALITY_IS_
+  };
+  typedef bool Value;
+  static const Value default_value = true;
+  static const Value unsupported_value = false;
+  Property(Type t)
+    : type(t) {
+  }
+  Type type;
+};
+
+const Property CARDINALITY_0(Property::CARDINALITY_0_);
+const Property CARDINALITY_1(Property::CARDINALITY_1_);
+const Property CARDINALITY_IS(Property::CARDINALITY_IS_);
+
+template <typename T>
+inline void
+reset_bits(T& bits) {
+  bits = 0;
+}
+
+template <typename T>
+inline void
+reset_bit(T& bits, unsigned int bit) {
+  bits &= ~(static_cast<T>(1) << bit);
+}
+
+template <typename T>
+inline void
+set_bit(T& bits, unsigned int bit, bool value) {
+  if (value)
+    bits |= static_cast<T>(1) << bit;
+  else
+    reset_bit(bits, bit);
+}
+
+template <typename T>
+inline bool
+get_bit(const T& bits, unsigned int bit) {
+  return (bits & (static_cast<T>(1) << bit)) != 0;
+}
+
+template <typename T>
+inline void
+set_bits(T& bits, unsigned int start, unsigned int len, T value) {
+  bits &= ~(((static_cast<T>(1) << len) - 1) << start);
+  bits |= value << start;
+}
+
+template <typename T>
+inline T
+get_bits(T& bits, unsigned int start, unsigned int len) {
+  return (bits >> start) & ((static_cast<T>(1) << len) - 1);
+}
+
+} // namespace Interval_NS
+
+using namespace Interval_NS;
+using namespace Boundary_NS;
+
+
+template <typename Policy>
+class Interval_Info_Null {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, false);
+  const_bool_nodef(cache_singleton, false);
+  Interval_Info_Null() {
+  }
+  void clear() {
+  }
+  void clear_boundary_properties(Boundary_Type) {
+  }
+
+  template <typename Property>
+  void set_boundary_property(Boundary_Type, const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_boundary_property(Boundary_Type, const Property&) const {
+    return Property::unsupported_value;
+  }
+  template <typename Property>
+  void set_interval_property(const Property&, typename Property::Value = Property::default_value) {
+  }
+  template <typename Property>
+  typename Property::Value get_interval_property(const Property&) const {
+    return Property::unsupported_value;
+  }
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Interval_Info_Null& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+};
+
+template <typename Policy>
+class Interval_Info_Null_Open : public Interval_Info_Null<Policy> {
+public:
+  const_bool_nodef(store_open, true);
+  Interval_Info_Null_Open(bool o)
+    : open(o) {
+  }
+  bool get_boundary_property(Boundary_Type,
+                             const Boundary_NS::Property& p) const {
+    if (p.type == Boundary_NS::Property::OPEN_)
+      return open;
+    else
+      return Boundary_NS::Property::unsupported_value;
+  }
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+private:
+  bool open;
+};
+
+
+template <typename T, typename Policy>
+class Interval_Info_Bitset {
+public:
+  const_bool_nodef(may_be_empty, Policy::may_be_empty);
+  const_bool_nodef(may_contain_infinity, Policy::may_contain_infinity);
+  const_bool_nodef(check_inexact, Policy::check_inexact);
+  const_bool_nodef(store_special, Policy::store_special);
+  const_bool_nodef(store_open, Policy::store_open);
+  const_bool_nodef(cache_empty, Policy::cache_empty);
+  const_bool_nodef(cache_singleton, Policy::cache_singleton);
+  const_int_nodef(lower_special_bit, Policy::next_bit);
+  const_int_nodef(lower_open_bit, lower_special_bit + (store_special ? 1 : 0));
+  const_int_nodef(upper_special_bit, lower_open_bit + (store_open ? 1 : 0));
+  const_int_nodef(upper_open_bit, upper_special_bit + (store_special ? 1 : 0));
+  const_int_nodef(cardinality_is_bit, upper_open_bit + (store_open ? 1 : 0));
+  const_int_nodef(cardinality_0_bit, cardinality_is_bit
+                  + ((cache_empty || cache_singleton) ? 1 : 0));
+  const_int_nodef(cardinality_1_bit, cardinality_0_bit + (cache_empty ? 1 : 0));
+  const_int_nodef(next_bit, cardinality_1_bit + (cache_singleton ? 1 : 0));
+
+  Interval_Info_Bitset() {
+    // FIXME: would we have speed benefits with uninitialized info?
+    // (Dirty_Temp)
+    clear();
+  }
+
+  void clear() {
+    reset_bits(bitset);
+  }
+  void clear_boundary_properties(Boundary_Type t) {
+    set_boundary_property(t, SPECIAL, false);
+    set_boundary_property(t, OPEN, false);
+  }
+  void set_boundary_property(Boundary_Type t,
+                             const Boundary_NS::Property& p,
+                             bool value = true) {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (store_special) {
+        if (t == LOWER)
+          set_bit(bitset, lower_special_bit, value);
+        else
+          set_bit(bitset, upper_special_bit, value);
+      }
+      break;
+    case Boundary_NS::Property::OPEN_:
+      if (store_open) {
+        if (t == LOWER)
+          set_bit(bitset, lower_open_bit, value);
+        else
+          set_bit(bitset, upper_open_bit, value);
+      }
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_boundary_property(Boundary_Type t, const Boundary_NS::Property& p) const {
+    switch (p.type) {
+    case Boundary_NS::Property::SPECIAL_:
+      if (!store_special)
+        return false;
+      if (t == LOWER)
+        return get_bit(bitset, lower_special_bit);
+      else
+        return get_bit(bitset, upper_special_bit);
+    case Boundary_NS::Property::OPEN_:
+      if (!store_open)
+        return false;
+      else if (t == LOWER)
+        return get_bit(bitset, lower_open_bit);
+      else
+        return get_bit(bitset, upper_open_bit);
+    default:
+      return false;
+    }
+  }
+  void set_interval_property(const Interval_NS::Property& p, bool value = true) {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      if (cache_empty)
+        set_bit(bitset, cardinality_0_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_1_:
+      if (cache_singleton)
+        set_bit(bitset, cardinality_1_bit, value);
+      break;
+    case Interval_NS::Property::CARDINALITY_IS_:
+      if (cache_empty || cache_singleton)
+        set_bit(bitset, cardinality_is_bit, value);
+      break;
+    default:
+      break;
+    }
+  }
+  bool get_interval_property(Interval_NS::Property p) const {
+    switch (p.type) {
+    case Interval_NS::Property::CARDINALITY_0_:
+      return cache_empty && get_bit(bitset, cardinality_0_bit);
+    case Interval_NS::Property::CARDINALITY_1_:
+      return cache_singleton && get_bit(bitset, cardinality_1_bit);
+    case Interval_NS::Property::CARDINALITY_IS_:
+      return (cache_empty || cache_singleton)
+        && get_bit(bitset, cardinality_is_bit);
+    default:
+      return false;
+    }
+  }
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Interval_Info_Bitset& y);
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+protected:
+  T bitset;
+};
+
+}
+
+/* Automatically generated from PPL source file ../src/Interval_Info_inlines.hh line 1. */
+/* Interval_Info class implementation: inline functions.
+*/
+
+
+#include <iomanip>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::m_swap(Interval_Info_Null<Policy>&) {
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null<Policy>::ascii_dump(std::ostream&) const {
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null<Policy>::ascii_load(std::istream&) {
+  return true;
+}
+
+template <typename Policy>
+inline void
+Interval_Info_Null_Open<Policy>::ascii_dump(std::ostream& s) const {
+  s << (open ? "open" : "closed");
+}
+
+template <typename Policy>
+inline bool
+Interval_Info_Null_Open<Policy>::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str))
+    return false;
+  if (str == "open") {
+    open = true;
+    return true;
+  }
+  if (str == "closed") {
+    open = false;
+    return true;
+  }
+  return false;
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::m_swap(Interval_Info_Bitset<T, Policy>& y) {
+  using std::swap;
+  swap(bitset, y.bitset);
+}
+
+template <typename T, typename Policy>
+inline void
+Interval_Info_Bitset<T, Policy>::ascii_dump(std::ostream& s) const {
+  const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+                                              std::ios::basefield);
+  s << bitset;
+  s.flags(old_flags);
+}
+
+template <typename T, typename Policy>
+inline bool
+Interval_Info_Bitset<T, Policy>::ascii_load(std::istream& s) {
+  const std::ios::fmtflags old_flags = s.setf(std::ios::hex,
+                                              std::ios::basefield);
+  s >> bitset;
+  s.flags(old_flags);
+  return !s.fail();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Null */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+inline void
+swap(Interval_Info_Null<Policy>& x, Interval_Info_Null<Policy>& y) {
+  x.m_swap(y);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Interval_Info_Bitset */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T, typename Policy>
+inline void
+swap(Interval_Info_Bitset<T, Policy>& x, Interval_Info_Bitset<T, Policy>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_Info_defs.hh line 284. */
+
+/* Automatically generated from PPL source file ../src/Interval_defs.hh line 33. */
+#include <iosfwd>
+
+// Temporary!
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+enum Ternary { T_YES, T_NO, T_MAYBE };
+
+inline I_Result
+combine(Result l, Result u) {
+  const unsigned res
+    = static_cast<unsigned>(l) | (static_cast<unsigned>(u) << 6);
+  return static_cast<I_Result>(res);
+}
+
+struct Interval_Base {
+};
+
+using namespace Boundary_NS;
+using namespace Interval_NS;
+
+template <typename T, typename Enable = void>
+struct Is_Singleton : public Is_Native_Or_Checked<T> {};
+
+template <typename T>
+struct Is_Interval : public Is_Same_Or_Derived<Interval_Base, T> {};
+
+//! A generic, not necessarily closed, possibly restricted interval.
+/*! \ingroup PPL_CXX_interface
+  The class template type parameter \p Boundary represents the type
+  of the interval boundaries, and can be chosen, among other possibilities,
+  within one of the following number families:
+
+  - a bounded precision native integer type (that is,
+    from <CODE>signed char</CODE> to <CODE>long long</CODE>
+    and from <CODE>int8_t</CODE> to <CODE>int64_t</CODE>);
+  - a bounded precision floating point type (<CODE>float</CODE>,
+    <CODE>double</CODE> or <CODE>long double</CODE>);
+  - an unbounded integer or rational type, as provided by the C++ interface
+    of GMP (<CODE>mpz_class</CODE> or <CODE>mpq_class</CODE>).
+
+  The class template type parameter \p Info allows to control a number
+  of features of the class, among which:
+
+  - the ability to support open as well as closed boundaries;
+  - the ability to represent empty intervals in addition to nonempty ones;
+  - the ability to represent intervals of extended number families
+    that contain positive and negative infinities;
+*/
+template <typename Boundary, typename Info>
+class Interval : public Interval_Base, private Info {
+private:
+  PPL_COMPILE_TIME_CHECK(!Info::store_special
+                         || !std::numeric_limits<Boundary>::has_infinity,
+                         "store_special is meaningless"
+                         " when boundary type may contains infinity");
+  Info& w_info() const {
+    return const_cast<Interval&>(*this);
+  }
+
+public:
+  typedef Boundary boundary_type;
+  typedef Info info_type;
+
+  typedef Interval_NS::Property Property;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator=(const T& x) {
+    assign(x);
+    return *this;
+  }
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator+=(const T& x) {
+    add_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator-=(const T& x) {
+    sub_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator*=(const T& x) {
+    mul_assign(*this, x);
+    return *this;
+  }
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type
+  operator/=(const T& x) {
+    div_assign(*this, x);
+    return *this;
+  }
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Interval& y);
+
+  Info& info() {
+    return *this;
+  }
+
+  const Info& info() const {
+    return *this;
+  }
+
+  Boundary& lower() {
+    return lower_;
+  }
+
+  const Boundary& lower() const {
+    return lower_;
+  }
+
+  Boundary& upper() {
+    return upper_;
+  }
+
+  const Boundary& upper() const {
+    return upper_;
+  }
+
+  I_Constraint<boundary_type> lower_constraint() const {
+    PPL_ASSERT(!is_empty());
+    if (info().get_boundary_property(LOWER, SPECIAL))
+      return I_Constraint<boundary_type>();
+    return i_constraint(lower_is_open() ? GREATER_THAN : GREATER_OR_EQUAL,
+                        lower(), true);
+  }
+  I_Constraint<boundary_type> upper_constraint() const {
+    PPL_ASSERT(!is_empty());
+    if (info().get_boundary_property(UPPER, SPECIAL))
+      return I_Constraint<boundary_type>();
+    return i_constraint(upper_is_open() ? LESS_THAN : LESS_OR_EQUAL,
+                        upper(), true);
+  }
+
+  bool is_empty() const {
+    return lt(UPPER, upper(), info(), LOWER, lower(), info());
+  }
+
+  bool check_empty(I_Result r) const {
+    return (r & I_ANY) == I_EMPTY
+      || ((r & I_ANY) != I_NOT_EMPTY && is_empty());
+  }
+
+  bool is_singleton() const {
+    return eq(LOWER, lower(), info(), UPPER, upper(), info());
+  }
+
+  bool lower_is_open() const {
+    PPL_ASSERT(OK());
+    return is_open(LOWER, lower(), info());
+  }
+
+  bool upper_is_open() const {
+    PPL_ASSERT(OK());
+    return is_open(UPPER, upper(), info());
+  }
+
+  bool lower_is_boundary_infinity() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_boundary_infinity(LOWER, lower(), info());
+  }
+
+  bool upper_is_boundary_infinity() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_boundary_infinity(UPPER, upper(), info());
+  }
+
+  bool lower_is_domain_inf() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_domain_inf(LOWER, lower(), info());
+  }
+
+  bool upper_is_domain_sup() const {
+    PPL_ASSERT(OK());
+    return Boundary_NS::is_domain_sup(UPPER, upper(), info());
+  }
+
+  bool is_bounded() const {
+    PPL_ASSERT(OK());
+    return !lower_is_boundary_infinity() && !upper_is_boundary_infinity();
+  }
+
+  bool is_universe() const {
+    PPL_ASSERT(OK());
+    return lower_is_domain_inf() && upper_is_domain_sup();
+  }
+
+  I_Result lower_extend() {
+    info().clear_boundary_properties(LOWER);
+    set_unbounded(LOWER, lower(), info());
+    return I_ANY;
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  lower_extend(const C& c);
+
+  I_Result upper_extend() {
+    info().clear_boundary_properties(UPPER);
+    set_unbounded(UPPER, upper(), info());
+    return I_ANY;
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  upper_extend(const C& c);
+
+  I_Result build() {
+    return assign(UNIVERSE);
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  build(const C& c) {
+    Relation_Symbol rs;
+    switch (c.rel()) {
+    case V_LGE:
+    case V_GT_MINUS_INFINITY:
+    case V_LT_PLUS_INFINITY:
+      return assign(UNIVERSE);
+    default:
+      return assign(EMPTY);
+    case V_LT:
+    case V_LE:
+    case V_GT:
+    case V_GE:
+    case V_EQ:
+    case V_NE:
+      assign(UNIVERSE);
+      rs = static_cast<Relation_Symbol>(c.rel());
+      return refine_existential(rs, c.value());
+    }
+  }
+
+  template <typename C1, typename C2>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C1>::value
+                     &&
+                     Is_Same_Or_Derived<I_Constraint_Base, C2>::value,
+                     I_Result>::type
+  build(const C1& c1, const C2& c2) {
+    switch (c1.rel()) {
+    case V_LGE:
+      return build(c2);
+    case V_NAN:
+      return assign(EMPTY);
+    default:
+      break;
+    }
+    switch (c2.rel()) {
+    case V_LGE:
+      return build(c1);
+    case V_NAN:
+      return assign(EMPTY);
+    default:
+      break;
+    }
+    build(c1);
+    const I_Result r = add_constraint(c2);
+    return r - (I_CHANGED | I_UNCHANGED);
+  }
+
+  template <typename C>
+  typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+  add_constraint(const C& c) {
+    Interval x;
+    x.build(c);
+    return intersect_assign(x);
+  }
+
+  I_Result assign(Degenerate_Element e) {
+    I_Result r;
+    info().clear();
+    switch (e) {
+    case EMPTY:
+      lower_ = 1;
+      upper_ = 0;
+      r = I_EMPTY | I_EXACT;
+      break;
+    case UNIVERSE:
+      set_unbounded(LOWER, lower(), info());
+      set_unbounded(UPPER, upper(), info());
+      r = I_UNIVERSE | I_EXACT;
+      break;
+    default:
+      PPL_UNREACHABLE;
+      r = I_EMPTY;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return r;
+  }
+
+  template <typename From>
+  typename Enable_If<Is_Special<From>::value, I_Result>::type
+  assign(const From&) {
+    info().clear();
+    Result rl;
+    Result ru;
+    switch (From::vclass) {
+    case VC_MINUS_INFINITY:
+      rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+      ru = Boundary_NS::set_minus_infinity(UPPER, upper(), info());
+      break;
+    case VC_PLUS_INFINITY:
+      rl = Boundary_NS::set_plus_infinity(LOWER, lower(), info());
+      ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+      break;
+    default:
+      PPL_UNREACHABLE;
+      rl = V_NAN;
+      ru = V_NAN;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return combine(rl, ru);
+  }
+
+  I_Result set_infinities() {
+    info().clear();
+    Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info());
+    Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info());
+    PPL_ASSERT(OK());
+    return combine(rl, ru);
+  }
+
+  static bool is_always_topologically_closed() {
+    return !Info::store_open;
+  }
+
+  bool is_topologically_closed() const {
+    PPL_ASSERT(OK());
+    return is_always_topologically_closed()
+      || is_empty()
+      || ((lower_is_boundary_infinity() || !lower_is_open())
+          && (upper_is_boundary_infinity() || !upper_is_open()));
+  }
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign() {
+    if (!Info::store_open || is_empty())
+      return;
+    if (lower_is_open() && !lower_is_boundary_infinity())
+      info().set_boundary_property(LOWER, OPEN, false);
+    if (upper_is_open() && !upper_is_boundary_infinity())
+      info().set_boundary_property(UPPER, OPEN, false);
+  }
+
+  void remove_inf() {
+    PPL_ASSERT(!is_empty());
+    if (!Info::store_open)
+      return;
+    info().set_boundary_property(LOWER, OPEN, true);
+  }
+
+  void remove_sup() {
+    PPL_ASSERT(!is_empty());
+    if (!Info::store_open)
+      return;
+    info().set_boundary_property(UPPER, OPEN, true);
+  }
+
+  int infinity_sign() const {
+    PPL_ASSERT(OK());
+    if (is_reverse_infinity(LOWER, lower(), info()))
+      return 1;
+    else if (is_reverse_infinity(UPPER, upper(), info()))
+      return -1;
+    else
+      return 0;
+  }
+
+  bool contains_integer_point() const {
+    PPL_ASSERT(OK());
+    if (is_empty())
+      return false;
+    if (!is_bounded())
+      return true;
+    Boundary l;
+    if (lower_is_open()) {
+      add_assign_r(l, lower(), Boundary(1), ROUND_DOWN);
+      floor_assign_r(l, l, ROUND_DOWN);
+    }
+    else
+      ceil_assign_r(l, lower(), ROUND_DOWN);
+    Boundary u;
+    if (upper_is_open()) {
+      sub_assign_r(u, upper(), Boundary(1), ROUND_UP);
+      ceil_assign_r(u, u, ROUND_UP);
+    }
+    else
+      floor_assign_r(u, upper(), ROUND_UP);
+    return u >= l;
+  }
+
+  void drop_some_non_integer_points() {
+    if (is_empty())
+      return;
+    if (lower_is_open() && !lower_is_boundary_infinity()) {
+      add_assign_r(lower(), lower(), Boundary(1), ROUND_DOWN);
+      floor_assign_r(lower(), lower(), ROUND_DOWN);
+      info().set_boundary_property(LOWER, OPEN, false);
+    }
+    else
+      ceil_assign_r(lower(), lower(), ROUND_DOWN);
+    if (upper_is_open() && !upper_is_boundary_infinity()) {
+      sub_assign_r(upper(), upper(), Boundary(1), ROUND_UP);
+      ceil_assign_r(upper(), upper(), ROUND_UP);
+      info().set_boundary_property(UPPER, OPEN, false);
+    }
+    else
+      floor_assign_r(upper(), upper(), ROUND_UP);
+  }
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type
+  wrap_assign(Bounded_Integer_Type_Width w,
+              Bounded_Integer_Type_Representation r,
+              const From& refinement) {
+    if (is_empty())
+      return I_EMPTY;
+    if (lower_is_boundary_infinity() || upper_is_boundary_infinity())
+      return assign(refinement);
+    PPL_DIRTY_TEMP(Boundary, u);
+    Result result = sub_2exp_assign_r(u, upper(), w, ROUND_UP);
+    if (result_overflow(result) == 0 && u > lower())
+      return assign(refinement);
+    info().clear();
+    switch (r) {
+    case UNSIGNED:
+      umod_2exp_assign(LOWER, lower(), info(),
+                       LOWER, lower(), info(), w);
+      umod_2exp_assign(UPPER, upper(), info(),
+                       UPPER, upper(), info(), w);
+      break;
+    case SIGNED_2_COMPLEMENT:
+      smod_2exp_assign(LOWER, lower(), info(),
+                       LOWER, lower(), info(), w);
+      smod_2exp_assign(UPPER, upper(), info(),
+                       UPPER, upper(), info(), w);
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+    }
+    if (le(LOWER, lower(), info(), UPPER, upper(), info()))
+      return intersect_assign(refinement);
+    PPL_DIRTY_TEMP(Interval, tmp);
+    tmp.info().clear();
+    Boundary_NS::assign(LOWER, tmp.lower(), tmp.info(),
+                        LOWER, lower(), info());
+    set_unbounded(UPPER, tmp.upper(), tmp.info());
+    tmp.intersect_assign(refinement);
+    lower_extend();
+    intersect_assign(refinement);
+    return join_assign(tmp);
+  }
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  void ascii_dump(std::ostream& s) const;
+  bool ascii_load(std::istream& s);
+
+  bool OK() const {
+    if (!Info::may_be_empty && is_empty()) {
+#ifndef NDEBUG
+      std::cerr << "The interval is unexpectedly empty.\n";
+#endif
+      return false;
+    }
+
+    if (is_open(LOWER, lower(), info())) {
+      if (is_plus_infinity(LOWER, lower(), info())) {
+#ifndef NDEBUG
+        std::cerr << "The lower boundary is +inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+             && (is_minus_infinity(LOWER, lower(), info())
+                 || is_plus_infinity(LOWER, lower(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The lower boundary is unexpectedly infinity.\n";
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(LOWER, SPECIAL)) {
+      if (is_not_a_number(lower())) {
+#ifndef NDEBUG
+        std::cerr << "The lower boundary is not a number.\n";
+#endif
+        return false;
+      }
+    }
+
+    if (is_open(UPPER, upper(), info())) {
+      if (is_minus_infinity(UPPER, upper(), info())) {
+#ifndef NDEBUG
+        std::cerr << "The upper boundary is -inf open.\n";
+#endif
+      }
+    }
+    else if (!Info::may_contain_infinity
+             && (is_minus_infinity(UPPER, upper(), info())
+                 || is_plus_infinity(UPPER, upper(), info()))) {
+#ifndef NDEBUG
+      std::cerr << "The upper boundary is unexpectedly infinity."
+                << std::endl;
+#endif
+      return false;
+    }
+    if (!info().get_boundary_property(UPPER, SPECIAL)) {
+      if (is_not_a_number(upper())) {
+#ifndef NDEBUG
+        std::cerr << "The upper boundary is not a number.\n";
+#endif
+        return false;
+      }
+    }
+
+    // Everything OK.
+    return true;
+  }
+
+  Interval() {
+  }
+
+  template <typename T>
+  explicit Interval(const T& x) {
+    assign(x);
+  }
+
+  /*! \brief
+    Builds the smallest interval containing the number whose textual
+    representation is contained in \p s.
+  */
+  explicit Interval(const char* s);
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  strictly_contains(const T& y) const;
+
+  template <typename T>
+  typename Enable_If<Is_Singleton<T>::value
+                     || Is_Interval<T>::value, bool>::type
+  is_disjoint_from(const T& y) const;
+
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  assign(const From& x);
+
+  template <typename Type>
+  typename Enable_If<Is_Singleton<Type>::value
+                     || Is_Interval<Type>::value, bool>::type
+  can_be_exactly_joined_to(const Type& x) const;
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  join_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  join_assign(const From1& x, const From2& y);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  intersect_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  intersect_assign(const From1& x, const From2& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p *this and \p x.
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  difference_assign(const From& x);
+
+  /*! \brief
+    Assigns to \p *this the smallest interval containing the set-theoretic
+    difference of \p x and \p y.
+  */
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value
+                       || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value
+                          || Is_Interval<From2>::value)), I_Result>::type
+  difference_assign(const From1& x, const From2& y);
+
+  /*! \brief
+    Assigns to \p *this the largest interval contained in the set-theoretic
+    difference of \p *this and \p x.
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  lower_approximation_difference_assign(const From& x);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+
+    \return
+    \c false if and only if the meet of \p *this and \p y is empty.
+  */
+  template <typename From>
+  typename Enable_If<Is_Interval<From>::value, bool>::type
+  simplify_using_context_assign(const From& y);
+
+  /*! \brief
+    Assigns to \p *this an interval having empty intersection with \p y.
+    The assigned interval should be as large as possible.
+  */
+  template <typename From>
+  typename Enable_If<Is_Interval<From>::value, void>::type
+  empty_intersection_assign(const From& y);
+
+  /*! \brief
+    Refines \p to according to the existential relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \exists b \in \mathtt{x} \st a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  refine_existential(Relation_Symbol rel, const From& x);
+
+  /*! \brief
+    Refines \p to so that it satisfies the universal relation \p rel with \p x.
+
+    The \p to interval is restricted to become, upon successful exit,
+    the smallest interval of its type that contains the set
+    \f[
+      \{\,
+        a \in \mathtt{to}
+      \mid
+        \forall b \in \mathtt{x} \itc a \mathrel{\mathtt{rel}} b
+      \,\}.
+    \f]
+    \return
+    ???
+  */
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  refine_universal(Relation_Symbol rel, const From& x);
+
+  template <typename From>
+  typename Enable_If<Is_Singleton<From>::value
+                     || Is_Interval<From>::value, I_Result>::type
+  neg_assign(const From& x);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  add_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  sub_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  mul_assign(const From1& x, const From2& y);
+
+  template <typename From1, typename From2>
+  typename Enable_If<((Is_Singleton<From1>::value || Is_Interval<From1>::value)
+                      && (Is_Singleton<From2>::value || Is_Interval<From2>::value)), I_Result>::type
+  div_assign(const From1& x, const From2& y);
+
+  template <typename From, typename Iterator>
+  typename Enable_If<Is_Interval<From>::value, void>::type
+  CC76_widening_assign(const From& y, Iterator first, Iterator last);
+
+private:
+  Boundary lower_;
+  Boundary upper_;
+};
+
+//! Swaps \p x with \p y.
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+void swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_inlines.hh line 1. */
+/* Inline functions for the Interval class and its constituents.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::external_memory_in_bytes() const {
+  return Parma_Polyhedra_Library::external_memory_in_bytes(lower())
+    + Parma_Polyhedra_Library::external_memory_in_bytes(upper());
+}
+
+template <typename Boundary, typename Info>
+inline memory_size_type
+Interval<Boundary, Info>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::m_swap(Interval<Boundary, Info>& y) {
+  using std::swap;
+  swap(lower(), y.lower());
+  swap(upper(), y.upper());
+  swap(info(), y.info());
+}
+
+template <typename Boundary, typename Info>
+inline bool
+f_is_empty(const Interval<Boundary, Info>& x) {
+  return x.is_empty();
+}
+template <typename Boundary, typename Info>
+inline bool
+f_is_singleton(const Interval<Boundary, Info>& x) {
+  return x.is_singleton();
+}
+template <typename Boundary, typename Info>
+inline int
+infinity_sign(const Interval<Boundary, Info>& x) {
+  return x.infinity_sign();
+}
+
+namespace Interval_NS {
+
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_lower(const Interval<Boundary, Info>& x) {
+  return x.lower();
+}
+template <typename Boundary, typename Info>
+inline const Boundary&
+f_upper(const Interval<Boundary, Info>& x) {
+  return x.upper();
+}
+template <typename Boundary, typename Info>
+inline const Info&
+f_info(const Interval<Boundary, Info>& x) {
+  return x.info();
+}
+
+struct Scalar_As_Interval_Policy {
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, true);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Null<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info;
+
+const Scalar_As_Interval_Info SCALAR_INFO;
+
+typedef Interval_Info_Null_Open<Scalar_As_Interval_Policy>
+Scalar_As_Interval_Info_Open;
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_lower(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, const T&>::type
+f_upper(const T& x) {
+  return x;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+                          const Scalar_As_Interval_Info&>::type
+f_info(const T&) {
+  return SCALAR_INFO;
+}
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value,
+                          Scalar_As_Interval_Info_Open>::type
+f_info(const T&, bool open) {
+  return Scalar_As_Interval_Info_Open(open);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_empty(const T& x) {
+  return is_not_a_number(x);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value, bool>::type
+f_is_singleton(const T& x) {
+  return !f_is_empty(x);
+}
+
+} // namespace Interval_NS
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+is_singleton_integer(const T& x) {
+  return is_singleton(x) && is_integer(f_lower(x));
+}
+
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+check_empty_arg(const T& x) {
+  if (f_info(x).may_be_empty)
+    return f_is_empty(x);
+  else {
+    PPL_ASSERT(!f_is_empty(x));
+    return false;
+  }
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+                            || Is_Interval<T1>::value)
+                           && (Is_Singleton<T2>::value
+                               || Is_Interval<T2>::value)
+                           && (Is_Interval<T1>::value
+                               || Is_Interval<T2>::value)),
+                          bool>::type
+operator==(const T1& x, const T2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x))
+    return check_empty_arg(y);
+  else if (check_empty_arg(y))
+    return false;
+  return eq(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y))
+    && eq(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename T1, typename T2>
+inline typename Enable_If<((Is_Singleton<T1>::value
+                            || Is_Interval<T1>::value)
+                           && (Is_Singleton<T2>::value
+                               || Is_Interval<T2>::value)
+                           && (Is_Interval<T1>::value
+                               || Is_Interval<T2>::value)),
+                          bool>::type
+operator!=(const T1& x, const T2& y) {
+  return !(x == y);
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::contains(const T& y) const {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(y))
+    return true;
+  if (check_empty_arg(*this))
+    return false;
+  return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+    && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::strictly_contains(const T& y) const {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(y))
+    return !check_empty_arg(*this);
+  if (check_empty_arg(*this))
+    return false;
+  return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+          && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)))
+    || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y))
+        && gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)));
+}
+
+template <typename Boundary, typename Info>
+template <typename T>
+inline typename Enable_If<Is_Singleton<T>::value
+                          || Is_Interval<T>::value, bool>::type
+Interval<Boundary, Info>::is_disjoint_from(const T& y) const {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(*this) || check_empty_arg(y))
+    return true;
+  return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))
+    || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  const Result rl = Boundary_NS::assign(LOWER, lower(), to_info,
+                                        LOWER, f_lower(x), f_info(x));
+  const Result ru = Boundary_NS::assign(UPPER, upper(), to_info,
+                                        UPPER, f_upper(x), f_info(x));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(*this))
+    return assign(x);
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  Result rl;
+  Result ru;
+  rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::join_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x))
+    return assign(y);
+  if (check_empty_arg(y))
+    return assign(x);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  rl = min_assign(LOWER, lower(), to_info,
+                  LOWER, f_lower(x), f_info(x),
+                  LOWER, f_lower(y), f_info(y));
+  ru = max_assign(UPPER, upper(), to_info,
+                  UPPER, f_upper(x), f_info(x),
+                  UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename Boundary, typename Info>
+template <typename Type>
+inline typename Enable_If<Is_Singleton<Type>::value
+                          || Is_Interval<Type>::value, bool>::type
+Interval<Boundary, Info>::can_be_exactly_joined_to(const Type& x) const {
+  PPL_DIRTY_TEMP(Boundary, b);
+  if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) {
+    b = lower();
+    return eq(LOWER, b, info(), UPPER, f_upper(x), f_info(x));
+  }
+  else if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))) {
+    b = upper();
+    return eq(UPPER, b, info(), LOWER, f_lower(x), f_info(x));
+  }
+  return true;
+}
+
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  PPL_ASSERT(OK());
+  return I_ANY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::intersect_assign(const From1& x,
+                                                 const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  max_assign(LOWER, lower(), to_info,
+             LOWER, f_lower(x), f_info(x),
+             LOWER, f_lower(y), f_info(y));
+  min_assign(UPPER, upper(), to_info,
+             UPPER, f_upper(x), f_info(x),
+             UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return I_NOT_EMPTY;
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))
+      || gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+    return combine(V_EQ, V_EQ);
+  bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x));
+  bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+  Result rl = V_EQ;
+  Result ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else {
+      info().clear_boundary_properties(LOWER);
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x));
+    }
+  }
+  else if (nu) {
+    info().clear_boundary_properties(UPPER);
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x));
+  }
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::difference_assign(const From1& x,
+                                                  const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y))
+      || gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y)))
+    return assign(x);
+  bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y));
+  bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y));
+  Result rl = V_EQ;
+  Result ru = V_EQ;
+  if (nl) {
+    if (nu)
+      return assign(EMPTY);
+    else {
+      rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y));
+      ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x));
+    }
+  }
+  else if (nu) {
+    ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::assign(LOWER, lower(), info(),
+                             LOWER, f_lower(x), f_info(x));
+  }
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>
+::refine_existential(Relation_Symbol rel, const From& x) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Boundary_NS::assign(UPPER, upper(), info(),
+                          UPPER, f_upper(x), f_info(x), true);
+      return I_ANY;
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Boundary_NS::assign(UPPER, upper(), info(),
+                          UPPER, f_upper(x), f_info(x));
+      return I_ANY;
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Boundary_NS::assign(LOWER, lower(), info(),
+                          LOWER, f_lower(x), f_info(x), true);
+      return I_ANY;
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Boundary_NS::assign(LOWER, lower(), info(),
+                          LOWER, f_lower(x), f_info(x));
+      return I_ANY;
+    }
+  case EQUAL:
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (!f_is_singleton(x))
+        return combine(V_EQ, V_EQ);
+      if (check_empty_arg(*this))
+        return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        remove_inf();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        remove_sup();
+      return I_ANY;
+    }
+  default:
+    PPL_UNREACHABLE;
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::refine_universal(Relation_Symbol rel,
+                                                 const From& x) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return combine(V_EQ, V_EQ);
+  switch (rel) {
+  case LESS_THAN:
+    {
+      if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+                                      LOWER, f_lower(x), SCALAR_INFO,
+                                      !is_open(LOWER, f_lower(x), f_info(x)));
+      PPL_USED(ru);
+      return I_ANY;
+    }
+  case LESS_OR_EQUAL:
+    {
+      if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(UPPER);
+      Result ru = Boundary_NS::assign(UPPER, upper(), info(),
+                                      LOWER, f_lower(x), SCALAR_INFO);
+      PPL_USED(ru);
+      return I_ANY;
+    }
+  case GREATER_THAN:
+    {
+      if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+                                      UPPER, f_upper(x), SCALAR_INFO,
+                                      !is_open(UPPER, f_upper(x), f_info(x)));
+      PPL_USED(rl);
+      return I_ANY;
+    }
+  case GREATER_OR_EQUAL:
+    {
+      if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)))
+        return combine(V_EQ, V_EQ);
+      info().clear_boundary_properties(LOWER);
+      Result rl = Boundary_NS::assign(LOWER, lower(), info(),
+                                      UPPER, f_upper(x), SCALAR_INFO);
+      PPL_USED(rl);
+      return I_ANY;
+    }
+  case EQUAL:
+    if (!f_is_singleton(x))
+      return assign(EMPTY);
+    return intersect_assign(x);
+  case NOT_EQUAL:
+    {
+      if (check_empty_arg(*this))
+        return I_EMPTY;
+      if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)))
+        remove_inf();
+      if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)))
+        remove_sup();
+      return I_ANY;
+    }
+  default:
+    PPL_UNREACHABLE;
+    return I_EMPTY;
+  }
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From>
+inline typename Enable_If<Is_Singleton<From>::value
+                          || Is_Interval<From>::value, I_Result>::type
+Interval<To_Boundary, To_Info>::neg_assign(const From& x) {
+  PPL_ASSERT(f_OK(x));
+  if (check_empty_arg(x))
+    return assign(EMPTY);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x));
+  ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::add_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  if (inf_sign != 0) {
+    if (Parma_Polyhedra_Library::infinity_sign(y) == -inf_sign)
+      return assign(EMPTY);
+  }
+  else
+    inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+  if (inf_sign < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf_sign > 0)
+    return assign(PLUS_INFINITY);
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info,
+                                      LOWER, f_lower(x), f_info(x),
+                                      LOWER, f_lower(y), f_info(y));
+  Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info,
+                                      UPPER, f_upper(x), f_info(x),
+                                      UPPER, f_upper(y), f_info(y));
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::sub_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  if (inf_sign != 0) {
+    if (Parma_Polyhedra_Library::infinity_sign(y) == inf_sign)
+      return assign(EMPTY);
+  }
+  else
+    inf_sign = -Parma_Polyhedra_Library::infinity_sign(y);
+  if (inf_sign < 0)
+    return assign(MINUS_INFINITY);
+  else if (inf_sign > 0)
+    return assign(PLUS_INFINITY);
+
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+  rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info,
+                               LOWER, f_lower(x), f_info(x),
+                               UPPER, f_upper(y), f_info(y));
+  ru = Boundary_NS::sub_assign(UPPER, upper(), to_info,
+                               UPPER, f_upper(x), f_info(x),
+                               LOWER, f_lower(y), f_info(y));
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+/**
++---------+-----------+-----------+-----------------+
+|    *    |  yl > 0   |  yu < 0   |  yl < 0, yu > 0 |
++---------+-----------+-----------+-----------------+
+| xl > 0  |xl*yl,xu*yu|xu*yl,xl*yu|   xu*yl,xu*yu   |
++---------+-----------+-----------+-----------------+
+| xu < 0  |xl*yu,xu*yl|xu*yu,xl*yl|   xl*yu,xl*yl   |
++---------+-----------+-----------+-----------------+
+|xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),|
+|         |           |           |max(xl*yl,xu*yu) |
++---------+-----------+-----------+-----------------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::mul_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  int ls;
+  int us;
+  if (inf_sign != 0) {
+    ls = yls;
+    us = yus;
+    goto inf;
+  }
+  else {
+    inf_sign = Parma_Polyhedra_Library::infinity_sign(y);
+    if (inf_sign != 0) {
+      ls = xls;
+      us = xus;
+    inf:
+      if (ls == 0 && us == 0)
+        return assign(EMPTY);
+      if (ls == -us)
+        return set_infinities();
+      if (ls < 0 || us < 0)
+        inf_sign = -inf_sign;
+      if (inf_sign < 0)
+        return assign(MINUS_INFINITY);
+      else
+        return assign(PLUS_INFINITY);
+    }
+  }
+
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+
+  if (xls >= 0) {
+    if (yls >= 0) {
+      // 0 <= xl <= xu, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else if (yus <= 0) {
+      // 0 <= xl <= xu, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      // 0 <= xl <= xu, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else if (xus <= 0) {
+    if (yls >= 0) {
+      // xl <= xu <= 0, 0 <= yl <= yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (yus <= 0) {
+      // xl <= xu <= 0, yl <= yu <= 0
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else {
+      // xl <= xu <= 0, yl < 0 < yu
+      rl = mul_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = mul_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yls >= 0) {
+    // xl < 0 < xu, 0 <= yl <= yu
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+                      LOWER, f_lower(x), f_info(x), xls,
+                      UPPER, f_upper(y), f_info(y), yus);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+                      UPPER, f_upper(x), f_info(x), xus,
+                      UPPER, f_upper(y), f_info(y), yus);
+  }
+  else if (yus <= 0) {
+    // xl < 0 < xu, yl <= yu <= 0
+    rl = mul_assign_z(LOWER, to_lower, to_info,
+                      UPPER, f_upper(x), f_info(x), xus,
+                      LOWER, f_lower(y), f_info(y), yls);
+    ru = mul_assign_z(UPPER, upper(), to_info,
+                      LOWER, f_lower(x), f_info(x), xls,
+                      LOWER, f_lower(y), f_info(y), yls);
+  }
+  else {
+    // xl < 0 < xu, yl < 0 < yu
+    PPL_DIRTY_TEMP(To_Boundary, tmp);
+    PPL_DIRTY_TEMP(To_Info, tmp_info);
+    tmp_info.clear();
+    Result tmp_r;
+    tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info,
+                                    UPPER, f_upper(x), f_info(x),
+                                    LOWER, f_lower(y), f_info(y));
+    rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info,
+                                 LOWER, f_lower(x), f_info(x),
+                                 UPPER, f_upper(y), f_info(y));
+    if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) {
+      to_lower = tmp;
+      rl = tmp_r;
+    }
+    tmp_info.clear();
+    tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info,
+                                    UPPER, f_upper(x), f_info(x),
+                                    UPPER, f_upper(y), f_info(y));
+    ru = Boundary_NS::mul_assign(UPPER, upper(), to_info,
+                                 LOWER, f_lower(x), f_info(x),
+                                 LOWER, f_lower(y), f_info(y));
+    if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) {
+      upper() = tmp;
+      ru = tmp_r;
+    }
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+/**
++-----------+-----------+-----------+
+|     /     |  yu < 0   |  yl > 0   |
++-----------+-----------+-----------+
+|   xu<=0   |xu/yl,xl/yu|xl/yl,xu/yu|
++-----------+-----------+-----------+
+|xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl|
++-----------+-----------+-----------+
+|   xl>=0   |xu/yu,xl/yl|xl/yu,xu/yl|
++-----------+-----------+-----------+
+**/
+template <typename To_Boundary, typename To_Info>
+template <typename From1, typename From2>
+inline typename Enable_If<((Is_Singleton<From1>::value
+                            || Is_Interval<From1>::value)
+                           && (Is_Singleton<From2>::value
+                               || Is_Interval<From2>::value)), I_Result>::type
+Interval<To_Boundary, To_Info>::div_assign(const From1& x, const From2& y) {
+  PPL_ASSERT(f_OK(x));
+  PPL_ASSERT(f_OK(y));
+  if (check_empty_arg(x) || check_empty_arg(y))
+    return assign(EMPTY);
+  int yls = sgn_b(LOWER, f_lower(y), f_info(y));
+  int yus = (yls > 0) ? 1 : sgn_b(UPPER, f_upper(y), f_info(y));
+  if (yls == 0 && yus == 0)
+    return assign(EMPTY);
+  int inf_sign = Parma_Polyhedra_Library::infinity_sign(x);
+  if (inf_sign != 0) {
+    if (Parma_Polyhedra_Library::infinity_sign(y) != 0)
+      return assign(EMPTY);
+    if (yls == -yus)
+      return set_infinities();
+    if (yls < 0 || yus < 0)
+    inf_sign = -inf_sign;
+    if (inf_sign < 0)
+      return assign(MINUS_INFINITY);
+    else
+      return assign(PLUS_INFINITY);
+  }
+  int xls = sgn_b(LOWER, f_lower(x), f_info(x));
+  int xus = (xls > 0) ? 1 : sgn_b(UPPER, f_upper(x), f_info(x));
+
+  PPL_DIRTY_TEMP(To_Info, to_info);
+  to_info.clear();
+  Result rl;
+  Result ru;
+  PPL_DIRTY_TEMP(To_Boundary, to_lower);
+  if (yls >= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+  }
+  else if (yus <= 0) {
+    if (xls >= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        LOWER, f_lower(y), f_info(y), yls);
+    }
+    else if (xus <= 0) {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        LOWER, f_lower(y), f_info(y), yls);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+    else {
+      rl = div_assign_z(LOWER, to_lower, to_info,
+                        UPPER, f_upper(x), f_info(x), xus,
+                        UPPER, f_upper(y), f_info(y), yus);
+      ru = div_assign_z(UPPER, upper(), to_info,
+                        LOWER, f_lower(x), f_info(x), xls,
+                        UPPER, f_upper(y), f_info(y), yus);
+    }
+  }
+  else {
+    return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES);
+  }
+  assign_or_swap(lower(), to_lower);
+  assign_or_swap(info(), to_info);
+  PPL_ASSERT(OK());
+  return combine(rl, ru);
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator+(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator+(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.add_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator-(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator-(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.sub_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator*(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator*(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.mul_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const Interval<B, Info>& x, const T& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info, typename T>
+inline typename Enable_If<Is_Singleton<T>::value, Interval<B, Info> >::type
+operator/(const T& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename B, typename Info>
+inline Interval<B, Info>
+operator/(const Interval<B, Info>& x, const Interval<B, Info>& y) {
+  Interval<B, Info> z;
+  z.div_assign(x, y);
+  return z;
+}
+
+template <typename Boundary, typename Info>
+inline std::ostream&
+operator<<(std::ostream& os, const Interval<Boundary, Info>& x) {
+  if (check_empty_arg(x))
+    return os << "[]";
+  if (x.is_singleton()) {
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+    return os;
+  }
+  os << (x.lower_is_open() ? "(" : "[");
+  if (x.info().get_boundary_property(LOWER, SPECIAL))
+    os << "-inf";
+  else
+    output(os, x.lower(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << ", ";
+  if (x.info().get_boundary_property(UPPER, SPECIAL))
+    os << "+inf";
+  else
+    output(os, x.upper(), Numeric_Format(), ROUND_NOT_NEEDED);
+  os << (x.upper_is_open() ? ")" : "]");
+  return os;
+}
+
+template <typename Boundary, typename Info>
+inline void
+Interval<Boundary, Info>::ascii_dump(std::ostream& s) const {
+  using Parma_Polyhedra_Library::ascii_dump;
+  s << "info ";
+  info().ascii_dump(s);
+  s << " lower ";
+  ascii_dump(s, lower());
+  s << " upper ";
+  ascii_dump(s, upper());
+  s << '\n';
+}
+
+template <typename Boundary, typename Info>
+inline bool
+Interval<Boundary, Info>::ascii_load(std::istream& s) {
+  using Parma_Polyhedra_Library::ascii_load;
+  std::string str;
+  if (!(s >> str) || str != "info")
+    return false;
+  if (!info().ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "lower")
+    return false;
+  if (!ascii_load(s, lower()))
+    return false;
+  if (!(s >> str) || str != "upper")
+    return false;
+  if (!ascii_load(s, upper()))
+    return false;
+  PPL_ASSERT(OK());
+  return true;
+}
+
+/*! \brief
+  Helper class to select the appropriate numerical type to perform
+  boundary computations so as to reduce the chances of overflow without
+  incurring too much overhead.
+*/
+template <typename Interval_Boundary_Type> struct Select_Temp_Boundary_Type;
+
+template <typename Interval_Boundary_Type>
+struct Select_Temp_Boundary_Type {
+  typedef Interval_Boundary_Type type;
+};
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+struct Select_Temp_Boundary_Type<float> {
+  typedef double type;
+};
+#endif
+
+template <>
+struct Select_Temp_Boundary_Type<char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned char> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned short> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned int> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<signed long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long> {
+  typedef signed long long type;
+};
+
+template <>
+struct Select_Temp_Boundary_Type<unsigned long long> {
+  typedef signed long long type;
+};
+
+/*! \relates Interval */
+template <typename Boundary, typename Info>
+inline void
+swap(Interval<Boundary, Info>& x, Interval<Boundary, Info>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_templates.hh line 1. */
+/* Interval class implementation: non-inline template functions.
+*/
+
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::lower_extend(const C& c) {
+  PPL_ASSERT(OK());
+  bool open;
+  switch (c.rel()) {
+  case V_LGE:
+    return lower_extend();
+  case V_NAN:
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  case V_GT:
+    open = true;
+    break;
+  case V_GE: // Fall through.
+  case V_EQ:
+    open = false;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  }
+  min_assign(LOWER, lower(), info(), LOWER, c.value(), f_info(c.value(), open));
+  PPL_ASSERT(OK());
+  return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename C>
+typename Enable_If<Is_Same_Or_Derived<I_Constraint_Base, C>::value, I_Result>::type
+Interval<Boundary, Info>::upper_extend(const C& c) {
+  PPL_ASSERT(OK());
+  bool open;
+  switch (c.rel()) {
+  case V_LGE:
+    return lower_extend();
+  case V_NAN:
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  case V_LT:
+    open = true;
+    break;
+  case V_LE: // Fall through.
+  case V_EQ:
+    open = false;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    return I_NOT_EMPTY | I_EXACT | I_UNCHANGED;
+  }
+  max_assign(UPPER, upper(), info(), UPPER, c.value(), f_info(c.value(), open));
+  PPL_ASSERT(OK());
+  return I_ANY;
+}
+
+template <typename Boundary, typename Info>
+template <typename From, typename Iterator>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::CC76_widening_assign(const From& y,
+                                               Iterator first,
+                                               Iterator last) {
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_ASSERT(contains(y));
+  Interval<Boundary, Info>& x = *this;
+
+  // Upper bound.
+  if (!x.upper_is_boundary_infinity()) {
+    Boundary& x_ub = x.upper();
+    const Boundary& y_ub = y.upper();
+    PPL_ASSERT(!y.upper_is_boundary_infinity() && y_ub <= x_ub);
+    if (y_ub < x_ub) {
+      Iterator k = std::lower_bound(first, last, x_ub);
+      if (k != last) {
+        if (x_ub < *k)
+          x_ub = *k;
+      }
+      else
+        x.upper_extend();
+    }
+  }
+
+  // Lower bound.
+  if (!x.lower_is_boundary_infinity()) {
+    Boundary& x_lb = x.lower();
+    const Boundary& y_lb = y.lower();
+    PPL_ASSERT(!y.lower_is_boundary_infinity() && y_lb >= x_lb);
+    if (y_lb > x_lb) {
+      Iterator k = std::lower_bound(first, last, x_lb);
+      if (k != last) {
+        if (x_lb < *k) {
+          if (k != first)
+            x_lb = *--k;
+          else
+            x.lower_extend();
+        }
+      }
+      else {
+        if (k != first)
+          x_lb = *--k;
+        else
+          x.lower_extend();
+      }
+    }
+  }
+}
+
+template <typename Boundary, typename Info>
+Interval<Boundary, Info>::Interval(const char* s) {
+  // Get the lower bound.
+  Boundary lower_bound;
+  Result lower_r = assign_r(lower_bound, s, ROUND_DOWN);
+  if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN) {
+    throw std::invalid_argument("PPL::Interval(const char* s)"
+                                " with s invalid");
+  }
+  lower_r = result_relation_class(lower_r);
+
+  // Get the upper bound.
+  Boundary upper_bound;
+  Result upper_r = assign_r(upper_bound, s, ROUND_UP);
+  PPL_ASSERT(upper_r != V_CVT_STR_UNK && upper_r != V_NAN);
+  upper_r = result_relation_class(upper_r);
+
+  // Build the interval.
+  bool lower_open = false;
+  bool upper_open = false;
+  bool lower_boundary_infinity = false;
+  bool upper_boundary_infinity = false;
+  switch (lower_r) {
+  case V_EQ: // Fall through.
+  case V_GE:
+    break;
+  case V_GT:
+    lower_open = true;
+    break;
+  case V_GT_MINUS_INFINITY:
+    lower_open = true;
+    // Fall through.
+  case V_EQ_MINUS_INFINITY:
+    lower_boundary_infinity = true;
+    break;
+  case V_EQ_PLUS_INFINITY: // Fall through.
+  case V_LT_PLUS_INFINITY:
+    if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+      assign(UNIVERSE);
+    else
+      assign(EMPTY);
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+  switch (upper_r) {
+  case V_EQ: // Fall through.
+  case V_LE:
+    break;
+  case V_LT:
+    upper_open = true;
+    break;
+  case V_EQ_MINUS_INFINITY: // Fall through.
+  case V_GT_MINUS_INFINITY:
+    if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+      assign(UNIVERSE);
+    else
+      assign(EMPTY);
+    break;
+  case V_LT_PLUS_INFINITY:
+    upper_open = true;
+    // Fall through.
+  case V_EQ_PLUS_INFINITY:
+    upper_boundary_infinity = true;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  if (!lower_boundary_infinity
+      && !upper_boundary_infinity
+      && (lower_bound > upper_bound
+          || (lower_open && lower_bound == upper_bound)))
+    assign(EMPTY);
+  else {
+    if (lower_boundary_infinity)
+      set_minus_infinity(LOWER, lower(), info(), lower_open);
+    else
+      Boundary_NS::assign(LOWER, lower(), info(),
+                          LOWER, lower_bound, SCALAR_INFO, lower_open);
+    if (upper_boundary_infinity)
+      set_plus_infinity(UPPER, upper(), info(), upper_open);
+    else
+      Boundary_NS::assign(UPPER, upper(), info(),
+                          UPPER, upper_bound, SCALAR_INFO, upper_open);
+  }
+}
+
+
+template <typename Boundary, typename Info>
+inline std::istream&
+operator>>(std::istream& is, Interval<Boundary, Info>& x) {
+  Boundary lower_bound;
+  Boundary upper_bound;
+  bool lower_boundary_infinity = false;
+  bool upper_boundary_infinity = false;
+  bool lower_open = false;
+  bool upper_open = false;
+  Result lower_r;
+  Result upper_r;
+
+  // Eat leading white space.
+  char c;
+  do {
+    if (!is.get(c))
+      goto fail;
+  } while (is_space(c));
+
+  // Get the opening parenthesis and handle the empty interval case.
+  if (c == '(')
+    lower_open = true;
+  else if (c == '[') {
+    if (!is.get(c))
+      goto fail;
+    if (c == ']') {
+      // Empty interval.
+      x.assign(EMPTY);
+      return is;
+    }
+    else
+      is.unget();
+  }
+  else
+    goto unexpected;
+
+  // Get the lower bound.
+  lower_r = input(lower_bound, is, ROUND_DOWN);
+  if (lower_r == V_CVT_STR_UNK || lower_r == V_NAN)
+    goto fail;
+  lower_r = result_relation_class(lower_r);
+
+  // Match the comma separating the lower and upper bounds.
+  do {
+    if (!is.get(c))
+      goto fail;
+  } while (is_space(c));
+  if (c != ',')
+    goto unexpected;
+
+  // Get the upper bound.
+  upper_r = input(upper_bound, is, ROUND_UP);
+  if (upper_r == V_CVT_STR_UNK || upper_r == V_NAN)
+    goto fail;
+  upper_r = result_relation_class(upper_r);
+
+  // Get the closing parenthesis.
+  do {
+    if (!is.get(c))
+      goto fail;
+  } while (is_space(c));
+  if (c == ')')
+    upper_open = true;
+  else if (c != ']') {
+  unexpected:
+    is.unget();
+  fail:
+    is.setstate(std::ios::failbit);
+    return is;
+  }
+
+  // Build interval.
+  switch (lower_r) {
+  case V_EQ: // Fall through.
+  case V_GE:
+    break;
+  case V_GT:
+    lower_open = true;
+    break;
+  case V_GT_MINUS_INFINITY:
+    lower_open = true;
+    // Fall through.
+  case V_EQ_MINUS_INFINITY:
+    lower_boundary_infinity = true;
+    break;
+  case V_EQ_PLUS_INFINITY: // Fall through.
+  case V_LT_PLUS_INFINITY:
+    if (upper_r == V_EQ_PLUS_INFINITY || upper_r == V_LT_PLUS_INFINITY)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+  switch (upper_r) {
+  case V_EQ: // Fall through.
+  case V_LE:
+    break;
+  case V_LT:
+    upper_open = true;
+    break;
+  case V_GT_MINUS_INFINITY:
+    upper_open = true;
+    // Fall through.
+  case V_EQ_MINUS_INFINITY:
+    if (lower_r == V_EQ_MINUS_INFINITY || lower_r == V_GT_MINUS_INFINITY)
+      x.assign(UNIVERSE);
+    else
+      x.assign(EMPTY);
+    return is;
+  case V_EQ_PLUS_INFINITY: // Fall through.
+  case V_LT_PLUS_INFINITY:
+    upper_boundary_infinity = true;
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  if (!lower_boundary_infinity
+      && !upper_boundary_infinity
+      && (lower_bound > upper_bound
+          || (lower_open && lower_bound == upper_bound)))
+    x.assign(EMPTY);
+  else {
+    if (lower_boundary_infinity)
+      set_minus_infinity(LOWER, x.lower(), x.info(), lower_open);
+    else
+      assign(LOWER, x.lower(), x.info(),
+             LOWER, lower_bound, SCALAR_INFO, lower_open);
+    if (upper_boundary_infinity)
+      set_plus_infinity(UPPER, x.upper(), x.info(), upper_open);
+    else
+      assign(UPPER, x.upper(), x.info(),
+             UPPER, upper_bound, SCALAR_INFO, upper_open);
+  }
+  return is;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, bool>::type
+Interval<Boundary, Info>::simplify_using_context_assign(const From& y) {
+  // FIXME: the following code wrongly assumes that intervals are closed
+  if (lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y))) {
+    lower_extend();
+    return false;
+  }
+  if (gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y))) {
+    upper_extend();
+    return false;
+  }
+  // Weakening the upper bound.
+  if (!upper_is_boundary_infinity() && !y.upper_is_boundary_infinity()
+      && y.upper() <= upper())
+    upper_extend();
+  // Weakening the lower bound.
+  if (!lower_is_boundary_infinity() && !y.lower_is_boundary_infinity()
+      && y.lower() >= lower())
+    lower_extend();
+  return true;
+}
+
+template <typename Boundary, typename Info>
+template <typename From>
+typename Enable_If<Is_Interval<From>::value, void>::type
+Interval<Boundary, Info>::empty_intersection_assign(const From&) {
+  // FIXME: write me.
+  assign(EMPTY);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Interval_defs.hh line 762. */
+
+/* Automatically generated from PPL source file ../src/Integer_Interval.hh line 28. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Integer_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int, Integer_Interval_Info_Policy> Integer_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with integral, necessarily closed boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpz_class, Integer_Interval_Info> Integer_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/initializer.hh line 1. */
+/* Nifty counter object for the initialization of the library.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_defs.hh line 1. */
+/* Init class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Sets the FPU rounding mode so that the PPL abstractions based on
+  floating point numbers work correctly.
+
+  This is performed automatically at initialization-time.  Calling
+  this function is needed only if restore_pre_PPL_rounding() has been
+  previously called.
+*/
+void set_rounding_for_PPL();
+
+/*! \brief
+  Sets the FPU rounding mode as it was before initialization of the PPL.
+
+  This is important if the application uses floating-point computations
+  outside the PPL.  It is crucial when the application uses functions
+  from a mathematical library that are not guaranteed to work correctly
+  under all rounding modes.
+
+  After calling this function it is absolutely necessary to call
+  set_rounding_for_PPL() before using any PPL abstractions based on
+  floating point numbers.
+  This is performed automatically at finalization-time.
+*/
+void restore_pre_PPL_rounding();
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Class for initialization and finalization.
+/*! \ingroup PPL_CXX_interface
+  <EM>Nifty Counter</EM> initialization class,
+  ensuring that the library is initialized only once
+  and before its first use.
+  A count of the number of translation units using the library
+  is maintained. A static object of Init type will be declared
+  by each translation unit using the library.  As a result,
+  only one of them will initialize and properly finalize
+  the library.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Init {
+public:
+  //! Initializes the PPL.
+  Init();
+
+  //! Finalizes the PPL.
+  ~Init();
+
+private:
+  /*! \brief
+    Default precision parameter used for irrational calculations.
+
+    The default is chosen to have a precision greater than most
+    precise IEC 559 floating point (112 bits of mantissa).
+  */
+  static const unsigned DEFAULT_IRRATIONAL_PRECISION = 128U;
+
+  //! Count the number of objects created.
+  static unsigned int count;
+  static fpu_rounding_direction_type old_rounding_direction;
+
+  friend void set_rounding_for_PPL();
+  friend void restore_pre_PPL_rounding();
+};
+
+/* Automatically generated from PPL source file ../src/Init_inlines.hh line 1. */
+/* Init class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Init_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+set_rounding_for_PPL() {
+#if PPL_CAN_CONTROL_FPU
+    fpu_set_rounding_direction(round_fpu_dir(ROUND_DIRECT));
+#endif
+}
+
+inline void
+restore_pre_PPL_rounding() {
+#if PPL_CAN_CONTROL_FPU
+  fpu_set_rounding_direction(Init::old_rounding_direction);
+#endif
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Init_defs.hh line 98. */
+
+
+/* Automatically generated from PPL source file ../src/initializer.hh line 28. */
+
+#ifndef PPL_NO_AUTOMATIC_INITIALIZATION
+
+static Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+#else
+
+static Parma_Polyhedra_Library::Init* Parma_Polyhedra_Library_initializer_p;
+
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Initializes the library.
+inline void
+initialize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  if (Parma_Polyhedra_Library_initializer_p == 0)
+    Parma_Polyhedra_Library_initializer_p = new Init();
+#endif
+}
+
+//! Finalizes the library.
+inline void
+finalize() {
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+  PPL_ASSERT(Parma_Polyhedra_Library_initializer_p != 0);
+  delete Parma_Polyhedra_Library_initializer_p;
+  Parma_Polyhedra_Library_initializer_p = 0;
+#endif
+}
+
+} //namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 1. */
+/* Linear_Expression_Impl class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_Expression_Impl;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 1. */
+/* Coefficient class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Coefficient_types.hh line 1. */
+
+
+/* Automatically generated from PPL source file ../src/Coefficient_types.hh line 17. */
+
+#ifdef PPL_GMP_INTEGERS
+/* Automatically generated from PPL source file ../src/GMP_Integer_types.hh line 1. */
+
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_types.hh line 17. */
+#include <gmpxx.h>
+/* Automatically generated from PPL source file ../src/GMP_Integer_types.hh line 19. */
+
+namespace Parma_Polyhedra_Library {
+
+/*! \class Parma_Polyhedra_Library::GMP_Integer
+  \brief
+  Unbounded integers as provided by the GMP library.
+
+  \ingroup PPL_CXX_interface
+  GMP_Integer is an alias for the <CODE>mpz_class</CODE> type
+  defined in the C++ interface of the GMP library.
+  For more information, see <CODE>http://gmplib.org/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <>
+struct Coefficient_traits_template<GMP_Integer> {
+  //! The type used for references to const unbounded integers.
+  typedef const GMP_Integer& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_types.hh line 20. */
+#endif
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! A policy for checked bounded integer coefficients.
+/*! \ingroup PPL_CXX_interface */
+struct Bounded_Integer_Coefficient_Policy {
+  //! Check for overflowed result.
+  const_bool_nodef(check_overflow, true);
+
+  //! Do not check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Do not check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Do not check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Do not check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Do not check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Do not check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Do not checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Do not handle not-a-number special value.
+  const_bool_nodef(has_nan, false);
+
+  //! Do not handle infinity special values.
+  const_bool_nodef(has_infinity, false);
+
+  /*! \brief
+    The checked number can always be safely converted to the
+    underlying type \p T and vice-versa.
+  */
+  const_bool_nodef(convertible, true);
+
+  //! Do not honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, false);
+
+  //! Do not make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, true);
+
+  /*! \brief
+    For constructors, by default use the same rounding used by
+    underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+
+  /*! \brief
+    For overloaded operators (operator+(), operator-(), ...), by
+    default use the same rounding used by the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+
+  /*! \brief
+    For input functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For output functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+
+  /*! \brief
+    For all other functions, by default use the same rounding used by
+    the underlying type.
+  */
+  static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int8_t, Policy> > {
+  //! The type used for references to const 8 bit checked integers.
+  typedef Checked_Number<int8_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 16 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int16_t, Policy> > {
+  //! The type used for references to const 16 bit checked integers.
+  typedef Checked_Number<int16_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 32 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int32_t, Policy> > {
+  //! The type used for references to const 32 bit checked integers.
+  typedef Checked_Number<int32_t, Policy> const_reference;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 64 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Policy>
+struct Coefficient_traits_template<Checked_Number<int64_t, Policy> > {
+  //! The type used for references to const 64 bit checked integers.
+  typedef const Checked_Number<int64_t, Policy>& const_reference;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+//! An alias for easily naming the type of PPL coefficients.
+/*! \ingroup PPL_CXX_interface
+  Objects of type Coefficient are used to implement the integral valued
+  coefficients occurring in linear expressions, constraints, generators,
+  intervals, bounding boxes and so on.  Depending on the chosen
+  configuration options (see file <CODE>README.configure</CODE>),
+  a Coefficient may actually be:
+    - The GMP_Integer type, which in turn is an alias for the
+      <CODE>mpz_class</CODE> type implemented by the C++ interface
+      of the GMP library (this is the default configuration).
+    - An instance of the Checked_Number class template: with the policy
+      Bounded_Integer_Coefficient_Policy, this implements overflow
+      detection on top of a native integral type (available template
+      instances include checked integers having 8, 16, 32 or 64 bits);
+      with the Checked_Number_Transparent_Policy, this is a wrapper
+      for native integral types with no overflow detection
+      (available template instances are as above).
+*/
+typedef PPL_COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 28. */
+#include <iosfwd>
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 33. */
+#endif
+
+#ifdef PPL_GMP_INTEGERS
+/* Automatically generated from PPL source file ../src/GMP_Integer_defs.hh line 1. */
+/* GMP_Integer class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_defs.hh line 29. */
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying integer value.
+/*! \relates GMP_Integer */
+const mpz_class& raw_value(const GMP_Integer& x);
+
+//! Returns a reference to the underlying integer value.
+/*! \relates GMP_Integer */
+mpz_class& raw_value(GMP_Integer& x);
+
+//@} // Accessor Functions
+
+//! \name Arithmetic Operators
+//@{
+
+//! Assigns to \p x its negation.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x);
+
+//! Assigns to \p x the negation of \p y.
+/*! \relates GMP_Integer */
+void neg_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x its absolute value.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x);
+
+//! Assigns to \p x the absolute value of \p y.
+/*! \relates GMP_Integer */
+void abs_assign(GMP_Integer& x, const GMP_Integer& y);
+
+//! Assigns to \p x the remainder of the division of \p y by \p z.
+/*! \relates GMP_Integer */
+void rem_assign(GMP_Integer& x,
+                const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the greatest common divisor of \p y and \p z.
+/*! \relates GMP_Integer */
+void gcd_assign(GMP_Integer& x,
+                const GMP_Integer& y, const GMP_Integer& z);
+
+//! Extended GCD.
+/*! \relates GMP_Integer
+  Assigns to \p x the greatest common divisor of \p y and \p z, and to
+  \p s and \p t the values such that \p y * \p s + \p z * \p t = \p x.
+*/
+void gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+                   const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the least common multiple of \p y and \p z.
+/*! \relates GMP_Integer */
+void lcm_assign(GMP_Integer& x,
+                const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x + y * z</CODE>.
+/*! \relates GMP_Integer */
+void add_mul_assign(GMP_Integer& x,
+                    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value <CODE>x - y * z</CODE>.
+/*! \relates GMP_Integer */
+void sub_mul_assign(GMP_Integer& x,
+                    const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the value \f$ y \cdot 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+//! Assigns to \p x the value \f$ y / 2^\mathtt{exp} \f$.
+/*! \relates GMP_Integer */
+void div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp);
+
+/*! \brief
+  If \p z divides \p y, assigns to \p x the quotient of the integer
+  division of \p y and \p z.
+
+  \relates GMP_Integer
+  The behavior is undefined if \p z does not divide \p y.
+*/
+void exact_div_assign(GMP_Integer& x,
+                      const GMP_Integer& y, const GMP_Integer& z);
+
+//! Assigns to \p x the integer square root of \p y.
+/*! \relates GMP_Integer */
+void sqrt_assign(GMP_Integer& x, const GMP_Integer& y);
+
+/*! \brief
+  Returns a negative, zero or positive value depending on whether
+  \p x is lower than, equal to or greater than \p y, respectively.
+
+  \relates GMP_Integer
+*/
+int cmp(const GMP_Integer& x, const GMP_Integer& y);
+
+//@} // Arithmetic Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_inlines.hh line 1. */
+/* GMP_Integer class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+neg_assign(GMP_Integer& x) {
+  mpz_neg(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+neg_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_neg(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x) {
+  mpz_abs(x.get_mpz_t(), x.get_mpz_t());
+}
+
+inline void
+abs_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_abs(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline void
+gcd_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcd(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+rem_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_tdiv_r(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+gcdext_assign(GMP_Integer& x, GMP_Integer& s, GMP_Integer& t,
+              const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_gcdext(x.get_mpz_t(),
+             s.get_mpz_t(), t.get_mpz_t(),
+             y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+lcm_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_lcm(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+add_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_addmul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sub_mul_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  mpz_submul(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+mul_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+  mpz_mul_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+div_2exp_assign(GMP_Integer& x, const GMP_Integer& y, unsigned int exp) {
+  mpz_tdiv_q_2exp(x.get_mpz_t(), y.get_mpz_t(), exp);
+}
+
+inline void
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+  PPL_ASSERT(y % z == 0);
+  mpz_divexact(x.get_mpz_t(), y.get_mpz_t(), z.get_mpz_t());
+}
+
+inline void
+sqrt_assign(GMP_Integer& x, const GMP_Integer& y) {
+  mpz_sqrt(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline int
+cmp(const GMP_Integer& x, const GMP_Integer& y) {
+  return mpz_cmp(x.get_mpz_t(), y.get_mpz_t());
+}
+
+inline const mpz_class&
+raw_value(const GMP_Integer& x) {
+  return x;
+}
+
+inline mpz_class&
+raw_value(GMP_Integer& x) {
+  return x;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/GMP_Integer_defs.hh line 133. */
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 37. */
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Initializes the Coefficient constants.
+#endif
+void Coefficient_constants_initialize();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Finalizes the Coefficient constants.
+#endif
+void Coefficient_constants_finalize();
+
+//! Returns a const reference to a Coefficient with value 0.
+Coefficient_traits::const_reference Coefficient_zero();
+
+//! Returns a const reference to a Coefficient with value 1.
+Coefficient_traits::const_reference Coefficient_one();
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_inlines.hh line 1. */
+/* Coefficient class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_CHECKED_INTEGERS
+inline void
+Bounded_Integer_Coefficient_Policy::handle_result(Result r) {
+  // Note that the input functions can return VC_NAN.
+  if (result_overflow(r) || result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+#endif // PPL_CHECKED_INTEGERS
+
+
+#if defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient zero(0);
+  return zero;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  // FIXME: is there a way to avoid this static variable?
+  static Coefficient one(1);
+  return one;
+}
+#endif // defined(PPL_CHECKED_INTEGERS) || defined(PPL_NATIVE_INTEGERS)
+
+#ifdef PPL_GMP_INTEGERS
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+  extern const Coefficient* Coefficient_zero_p;
+  return *Coefficient_zero_p;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+  extern const Coefficient* Coefficient_one_p;
+  PPL_ASSERT(*Coefficient_one_p != 0);
+  return *Coefficient_one_p;
+}
+#endif // PPL_GMP_INTEGERS
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Coefficient_defs.hh line 60. */
+
+/* Automatically generated from PPL source file ../src/Variables_Set_defs.hh line 1. */
+/* Variables_Set class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variables_Set_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variables_Set_defs.hh line 30. */
+#include <iosfwd>
+#include <set>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Variables_Set */
+std::ostream&
+operator<<(std::ostream& s, const Variables_Set& vs);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! An std::set of variables' indexes.
+class Parma_Polyhedra_Library::Variables_Set
+  : public std::set<dimension_type> {
+private:
+  typedef std::set<dimension_type> Base;
+
+public:
+  //! Builds the empty set of variable indexes.
+  Variables_Set();
+
+  //! Builds the singleton set of indexes containing <CODE>v.id()</CODE>;
+  explicit Variables_Set(const Variable v);
+
+  /*! \brief
+    Builds the set of variables's indexes in the range from
+    <CODE>v.id()</CODE> to <CODE>w.id()</CODE>.
+
+    If <CODE>v.id() <= w.id()</CODE>, this constructor builds the
+    set of variables' indexes
+    <CODE>v.id()</CODE>, <CODE>v.id()+1</CODE>, ..., <CODE>w.id()</CODE>.
+    The empty set is built otherwise.
+  */
+  Variables_Set(const Variable v, const Variable w);
+
+  //! Returns the maximum space dimension a Variables_Set can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns the dimension of the smallest vector space enclosing all
+    the variables whose indexes are in the set.
+  */
+  dimension_type space_dimension() const;
+
+  //! Inserts the index of variable \p v into the set.
+  void insert(Variable v);
+
+  // The `insert' method above overloads (instead of hiding) the
+  // other `insert' method of std::set.
+  using Base::insert;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+};
+
+/* Automatically generated from PPL source file ../src/Variables_Set_inlines.hh line 1. */
+/* Variables_Set class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variables_Set_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Variables_Set::Variables_Set()
+  : Base() {
+}
+
+inline void
+Variables_Set::insert(const Variable v) {
+  insert(v.id());
+}
+
+inline
+Variables_Set::Variables_Set(const Variable v)
+  : Base() {
+  insert(v);
+}
+
+inline dimension_type
+Variables_Set::max_space_dimension() {
+  return Variable::max_space_dimension();
+}
+
+inline dimension_type
+Variables_Set::space_dimension() const {
+  reverse_iterator i = rbegin();
+  return (i == rend()) ? 0 : (*i + 1);
+}
+
+inline memory_size_type
+Variables_Set::external_memory_in_bytes() const {
+  // We assume sets are implemented by means of red-black trees that
+  // require to store the color (we assume an enum) and three pointers
+  // to the parent, left and right child, respectively.
+  enum color { red, black };
+  return size() * (sizeof(color) + 3*sizeof(void*) + sizeof(dimension_type));
+}
+
+inline memory_size_type
+Variables_Set::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variables_Set_defs.hh line 106. */
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 1. */
+/* Dense_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Dense_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Dense_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 30. */
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Sparse_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 33. */
+#include <memory>
+#include <vector>
+#include <limits>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Dense_Row {
+public:
+  class iterator;
+  class const_iterator;
+
+  //! Constructs an empty row.
+  Dense_Row();
+
+  explicit Dense_Row(const Sparse_Row& row);
+
+  //! Tight constructor: resizing may require reallocation.
+  /*!
+    Constructs a row with size and capacity \p sz.
+  */
+  Dense_Row(dimension_type sz);
+
+  //! Sizing constructor with capacity.
+  /*!
+    \param sz
+    The size of the row that will be constructed;
+
+    \param capacity
+    The capacity of the row that will be constructed;
+
+    The row that is constructed has storage for \p capacity elements,
+    \p sz of which are default-constructed now.
+  */
+  Dense_Row(dimension_type sz, dimension_type capacity);
+
+  //! Ordinary copy constructor.
+  Dense_Row(const Dense_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Dense_Row(const Dense_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Dense_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity from a Sparse_Row.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Dense_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~Dense_Row();
+
+  //! Assignment operator.
+  Dense_Row& operator=(const Dense_Row& y);
+
+  //! Assignment operator.
+  Dense_Row& operator=(const Sparse_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Dense_Row& y);
+
+  //! Resizes the row to \p sz.
+  void resize(dimension_type sz);
+
+  //! Resizes the row to \p sz, with capacity \p capacity.
+  void resize(dimension_type sz, dimension_type capacity);
+
+  //! Resets all the elements of this row.
+  void clear();
+
+  //! Adds \p n zeroes before index \p i.
+  /*!
+    \param n
+    The number of zeroes that will be added to the row.
+
+    \param i
+    The index of the element before which the zeroes will be added.
+
+    Existing elements with index greater than or equal to \p i are shifted
+    to the right by \p n positions. The size is increased by \p n.
+
+    Existing iterators are invalidated.
+  */
+  void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns the size() of the largest possible Dense_Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  Coefficient& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  Coefficient_traits::const_reference operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of
+    the row and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  //! Swaps the i-th element with the j-th element.
+  //! Provided for compatibility with Sparse_Row
+  void swap_coefficients(dimension_type i, dimension_type j);
+
+  //! Swaps the element pointed to by i with the element pointed to by j.
+  //! Provided for compatibility with Sparse_Row
+  void swap_coefficients(iterator i, iterator j);
+
+  iterator begin();
+  const_iterator begin() const;
+
+  iterator end();
+  const_iterator end() const;
+
+  //! Resets the i-th element to 0.
+  //! Provided for compatibility with Sparse_Row
+  void reset(dimension_type i);
+
+  //! Resets the elements [first,last) to 0.
+  //! Provided for compatibility with Sparse_Row
+  void reset(dimension_type first, dimension_type last);
+
+  //! Resets the element pointed to by itr to 0.
+  //! Provided for compatibility with Sparse_Row.
+  iterator reset(iterator itr);
+
+  //! Gets the i-th element.
+  //! Provided for compatibility with Sparse_Row.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator find(dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator find(dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator find(iterator itr, dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator find(const_iterator itr, dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator lower_bound(dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator lower_bound(dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator lower_bound(iterator itr, dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(dimension_type i);
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(iterator itr, dimension_type i,
+                       Coefficient_traits::const_reference x);
+
+  //! Provided for compatibility with Sparse_Row.
+  iterator insert(iterator itr, dimension_type i);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when c1 is zero.
+
+    This method takes \f$O(n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_second
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_first(const Dense_Row& y,
+                           const Func1& f, const Func2& g);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, 0) must do nothing, for every c1.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_second(const Dense_Row& y,
+                            const Func1& g, const Func2& h);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine_needs_second
+  */
+  template <typename Func1, typename Func2, typename Func3>
+  void combine(const Dense_Row& y,
+               const Func1& f, const Func2& g, const Func3& h);
+
+  //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+  //! each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param coeff1
+    The coefficient used for elements of *this.
+    It must not be 0.
+
+    \param coeff2
+    The coefficient used for elements of y.
+    It must not be 0.
+
+    This method takes \f$O(n)\f$ time.
+
+    \see combine_needs_first
+    \see combine_needs_second
+    \see combine
+  */
+  void linear_combine(const Dense_Row& y,
+                      Coefficient_traits::const_reference coeff1,
+                      Coefficient_traits::const_reference coeff2);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  /*!
+    This method detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+    order to save some work.
+
+    coeff1 and coeff2 must not be 0.
+  */
+  void linear_combine(const Dense_Row& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Checks if all the invariants are satisfied and that the actual
+    size matches the value provided as argument.
+  */
+  bool OK(dimension_type row_size) const;
+
+private:
+  void init(const Sparse_Row& row);
+
+  void destroy();
+
+  struct Impl {
+
+    Impl();
+
+    ~Impl();
+
+    //! The number of coefficients in the row.
+    dimension_type size;
+
+    //! The capacity of the row.
+    dimension_type capacity;
+
+    //! The allocator used to allocate/deallocate vec.
+    std::allocator<Coefficient> coeff_allocator;
+
+    //! The vector of coefficients.
+    //! An empty vector may be stored as NULL instead of using a valid pointer.
+    Coefficient* vec;
+  };
+
+  Impl impl;
+
+  //! Returns the capacity of the row.
+  dimension_type capacity() const;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::iterator {
+public:
+
+  typedef std::bidirectional_iterator_tag iterator_category;
+  typedef Coefficient value_type;
+  typedef ptrdiff_t difference_type;
+  typedef value_type* pointer;
+  typedef value_type& reference;
+
+  iterator();
+  iterator(Dense_Row& row1, dimension_type i1);
+
+  Coefficient& operator*();
+  Coefficient_traits::const_reference operator*() const;
+
+  //! Returns the index of the element pointed to by \c *this.
+  /*!
+    If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+    equivalent to *itr.
+
+    \returns the index of the element pointed to by \c *this.
+  */
+  dimension_type index() const;
+
+  iterator& operator++();
+  iterator operator++(int);
+
+  iterator& operator--();
+  iterator operator--(int);
+
+  bool operator==(const iterator& x) const;
+  bool operator!=(const iterator& x) const;
+
+  operator const_iterator() const;
+
+  bool OK() const;
+
+private:
+  Dense_Row* row;
+  dimension_type i;
+};
+
+class Parma_Polyhedra_Library::Dense_Row::const_iterator {
+public:
+
+  typedef const Coefficient value_type;
+  typedef ptrdiff_t difference_type;
+  typedef value_type* pointer;
+  typedef Coefficient_traits::const_reference reference;
+
+  const_iterator();
+  const_iterator(const Dense_Row& row1, dimension_type i1);
+
+  Coefficient_traits::const_reference operator*() const;
+
+  //! Returns the index of the element pointed to by \c *this.
+  /*!
+    If itr is a valid iterator for row, <CODE>row[itr.index()]</CODE> is
+    equivalent to *itr.
+
+    \returns the index of the element pointed to by \c *this.
+  */
+  dimension_type index() const;
+
+  const_iterator& operator++();
+  const_iterator operator++(int);
+
+  const_iterator& operator--();
+  const_iterator operator--(int);
+
+  bool operator==(const const_iterator& x) const;
+  bool operator!=(const const_iterator& x) const;
+
+  bool OK() const;
+
+private:
+  const Dense_Row* row;
+  dimension_type i;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Dense_Row& x, Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void iter_swap(std::vector<Dense_Row>::iterator x,
+               std::vector<Dense_Row>::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Dense_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Dense_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_inlines.hh line 1. */
+/* Dense_Row class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Dense_Row_inlines.hh line 28. */
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Dense_Row::Impl::Impl()
+  : size(0), capacity(0), coeff_allocator(), vec(0) {
+}
+
+inline
+Dense_Row::Impl::~Impl() {
+  while (size != 0) {
+    --size;
+    vec[size].~Coefficient();
+  }
+  coeff_allocator.deallocate(vec, capacity);
+}
+
+inline dimension_type
+Dense_Row::max_size() {
+  return std::numeric_limits<size_t>::max() / sizeof(Coefficient);
+}
+
+inline dimension_type
+Dense_Row::size() const {
+  return impl.size;
+}
+
+inline dimension_type
+Dense_Row::capacity() const {
+  return impl.capacity;
+}
+
+inline
+Dense_Row::Dense_Row()
+  : impl() {
+
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz,
+                     const dimension_type capacity)
+  : impl() {
+
+  resize(sz, capacity);
+
+  PPL_ASSERT(size() == sz);
+  PPL_ASSERT(impl.capacity == capacity);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const dimension_type sz)
+  : impl() {
+
+  resize(sz);
+
+  PPL_ASSERT(size() == sz);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y)
+  : impl() {
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  if (y.impl.vec != 0) {
+    impl.capacity = y.capacity();
+    impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+    while (impl.size != y.size()) {
+      new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+      ++impl.size;
+    }
+  }
+  PPL_ASSERT(size() == y.size());
+  PPL_ASSERT(capacity() == y.capacity());
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+                     const dimension_type capacity)
+  : impl() {
+  PPL_ASSERT(y.size() <= capacity);
+  PPL_ASSERT(capacity <= max_size());
+
+  impl.capacity = capacity;
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+  if (y.impl.vec != 0) {
+    while (impl.size != y.size()) {
+      new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+      ++impl.size;
+    }
+  }
+
+  PPL_ASSERT(size() == y.size());
+  PPL_ASSERT(impl.capacity == capacity);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::Dense_Row(const Dense_Row& y,
+                     const dimension_type sz,
+                     const dimension_type capacity)
+  : impl() {
+  PPL_ASSERT(sz <= capacity);
+  PPL_ASSERT(capacity <= max_size());
+  PPL_ASSERT(capacity != 0);
+
+  impl.capacity = capacity;
+  impl.coeff_allocator = y.impl.coeff_allocator;
+  impl.vec = impl.coeff_allocator.allocate(impl.capacity);
+
+  const dimension_type n = std::min(sz, y.size());
+  while (impl.size != n) {
+    new (&impl.vec[impl.size]) Coefficient(y[impl.size]);
+    ++impl.size;
+  }
+  while (impl.size != sz) {
+    new (&impl.vec[impl.size]) Coefficient();
+    ++impl.size;
+  }
+
+  PPL_ASSERT(size() == sz);
+  PPL_ASSERT(impl.capacity == capacity);
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::~Dense_Row() {
+  // The `impl' field will be destroyed automatically.
+}
+
+inline void
+Dense_Row::destroy() {
+  resize(0);
+  impl.coeff_allocator.deallocate(impl.vec, impl.capacity);
+}
+
+inline void
+Dense_Row::m_swap(Dense_Row& y) {
+  using std::swap;
+  swap(impl.size, y.impl.size);
+  swap(impl.capacity, y.impl.capacity);
+  swap(impl.coeff_allocator, y.impl.coeff_allocator);
+  swap(impl.vec, y.impl.vec);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(y.OK());
+}
+
+inline Dense_Row&
+Dense_Row::operator=(const Dense_Row& y) {
+
+  if (this != &y && size() == y.size()) {
+    // Avoid reallocation.
+
+    for (dimension_type i = size(); i-- > 0; )
+      (*this)[i] = y[i];
+
+    return *this;
+  }
+
+  Dense_Row x(y);
+  swap(*this, x);
+
+  return *this;
+}
+
+inline Coefficient&
+Dense_Row::operator[](const dimension_type k) {
+  PPL_ASSERT(impl.vec != 0);
+  PPL_ASSERT(k < size());
+  return impl.vec[k];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::operator[](const dimension_type k) const {
+  PPL_ASSERT(impl.vec != 0);
+  PPL_ASSERT(k < size());
+  return impl.vec[k];
+}
+
+inline void
+Dense_Row::swap_coefficients(dimension_type i, dimension_type j) {
+  std::swap((*this)[i], (*this)[j]);
+}
+
+inline void
+Dense_Row::swap_coefficients(iterator i, iterator j) {
+  std::swap(*i, *j);
+}
+
+inline void
+Dense_Row::reset(dimension_type i) {
+  (*this)[i] = 0;
+}
+
+inline Dense_Row::iterator
+Dense_Row::reset(iterator itr) {
+  *itr = 0;
+  ++itr;
+  return itr;
+}
+
+inline Dense_Row::iterator
+Dense_Row::begin() {
+  return iterator(*this, 0);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::begin() const {
+  return const_iterator(*this, 0);
+}
+
+inline Dense_Row::iterator
+Dense_Row::end() {
+  return iterator(*this, size());
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::end() const {
+  return const_iterator(*this, size());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::get(dimension_type i) const {
+  return (*this)[i];
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(dimension_type i) {
+  return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(dimension_type i) const {
+  return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::find(iterator itr, dimension_type i) {
+  (void)itr;
+  return iterator(*this, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::find(const_iterator itr, dimension_type i) const {
+  (void)itr;
+  return const_iterator(*this, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(dimension_type i) {
+  return find(i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(dimension_type i) const {
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::lower_bound(iterator itr, dimension_type i) {
+  return find(itr, i);
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::lower_bound(const_iterator itr, dimension_type i) const {
+  return find(itr, i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i,
+                  Coefficient_traits::const_reference x) {
+  (*this)[i] = x;
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(dimension_type i) {
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i,
+                  Coefficient_traits::const_reference x) {
+  (void)itr;
+  (*this)[i] = x;
+  return find(i);
+}
+
+inline Dense_Row::iterator
+Dense_Row::insert(iterator itr, dimension_type i) {
+  (void)itr;
+  return find(i);
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Dense_Row::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+/*! \relates Dense_Row */
+inline bool
+operator!=(const Dense_Row& x, const Dense_Row& y) {
+  return !(x == y);
+}
+
+
+inline
+Dense_Row::iterator::iterator()
+  : row(NULL), i(0) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::iterator::iterator(Dense_Row& row1,dimension_type i1)
+  : row(&row1), i(i1) {
+  PPL_ASSERT(OK());
+}
+
+inline Coefficient&
+Dense_Row::iterator::operator*() {
+  PPL_ASSERT(i < row->size());
+  return (*row)[i];
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::iterator::operator*() const {
+  PPL_ASSERT(i < row->size());
+  return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::iterator::index() const {
+  return i;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator++() {
+  PPL_ASSERT(i < row->size());
+  ++i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator++(int) {
+  iterator tmp(*this);
+  ++(*this);
+  return tmp;
+}
+
+inline Dense_Row::iterator&
+Dense_Row::iterator::operator--() {
+  PPL_ASSERT(i > 0);
+  --i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::iterator
+Dense_Row::iterator::operator--(int) {
+  iterator tmp(*this);
+  --(*this);
+  return tmp;
+}
+
+inline bool
+Dense_Row::iterator::operator==(const iterator& x) const {
+  return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::iterator::operator!=(const iterator& x) const {
+  return !(*this == x);
+}
+
+inline
+Dense_Row::iterator::operator const_iterator() const {
+  return const_iterator(*row, i);
+}
+
+inline bool
+Dense_Row::iterator::OK() const {
+  if (row == NULL)
+    return true;
+  // i can be equal to row.size() for past-the-end iterators
+  return (i <= row->size());
+}
+
+
+inline
+Dense_Row::const_iterator::const_iterator()
+  : row(NULL), i(0) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Dense_Row::const_iterator::const_iterator(const Dense_Row& row1,
+                                          dimension_type i1)
+  : row(&row1), i(i1) {
+  PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+Dense_Row::const_iterator::operator*() const {
+  PPL_ASSERT(i < row->size());
+  return (*row)[i];
+}
+
+inline dimension_type
+Dense_Row::const_iterator::index() const {
+  return i;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator++() {
+  PPL_ASSERT(i < row->size());
+  ++i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator++(int) {
+  const_iterator tmp(*this);
+  ++(*this);
+  return tmp;
+}
+
+inline Dense_Row::const_iterator&
+Dense_Row::const_iterator::operator--() {
+  PPL_ASSERT(i > 0);
+  --i;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline Dense_Row::const_iterator
+Dense_Row::const_iterator::operator--(int) {
+  const_iterator tmp(*this);
+  --(*this);
+  return tmp;
+}
+
+inline bool
+Dense_Row::const_iterator::operator==(const const_iterator& x) const {
+  return (row == x.row) && (i == x.i);
+}
+
+inline bool
+Dense_Row::const_iterator::operator!=(const const_iterator& x) const {
+  return !(*this == x);
+}
+
+inline bool
+Dense_Row::const_iterator::OK() const {
+  if (row == NULL)
+    return true;
+  // i can be equal to row.size() for past-the-end iterators
+  return (i <= row->size());
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+               Coefficient_traits::const_reference coeff1,
+               Coefficient_traits::const_reference coeff2) {
+  x.linear_combine(y, coeff1, coeff2);
+}
+
+inline void
+linear_combine(Dense_Row& x, const Dense_Row& y,
+               Coefficient_traits::const_reference c1,
+               Coefficient_traits::const_reference c2,
+               dimension_type start, dimension_type end) {
+  x.linear_combine(y, c1, c2, start, end);
+}
+
+/*! \relates Dense_Row */
+inline void
+swap(Dense_Row& x, Dense_Row& y) {
+  x.m_swap(y);
+}
+
+/*! \relates Dense_Row */
+inline void
+iter_swap(std::vector<Dense_Row>::iterator x,
+          std::vector<Dense_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_templates.hh line 1. */
+/* Dense_Row class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_first(const Dense_Row& y, const Func1& /* f */,
+                               const Func2& g) {
+  for (dimension_type i = size(); i-- > 0; )
+    g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2>
+void
+Dense_Row::combine_needs_second(const Dense_Row& y, const Func1& g,
+                                const Func2& /* h */) {
+  for (dimension_type i = size(); i-- > 0; )
+    g((*this)[i], y[i]);
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Dense_Row::combine(const Dense_Row& y, const Func1& /* f */, const Func2& g,
+                   const Func3& /* h */) {
+  for (dimension_type i = size(); i-- > 0; )
+    g((*this)[i], y[i]);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Dense_Row_defs.hh line 560. */
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 1. */
+/* Sparse_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 1. */
+/* CO_Tree class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/CO_Tree_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class CO_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 30. */
+#include <memory>
+
+#ifndef PPL_CO_TREE_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+  \brief
+  Enables extra debugging information for class CO_Tree.
+
+  \ingroup PPL_CXX_interface
+  When <CODE>PPL_CO_TREE_EXTRA_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+  each CO_Tree iterator and const_iterator carries a pointer to the associated
+  tree; this enables extra consistency checks to be performed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_CO_TREE_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_CO_TREE_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_CO_TREE_EXTRA_DEBUG)
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A cache-oblivious binary search tree of pairs.
+/*! \ingroup PPL_CXX_interface
+  This class implements a binary search tree with keys of dimension_type type
+  and data of Coefficient type, laid out in a dynamically-sized array.
+
+  The array-based layout saves calls to new/delete (to insert \f$n\f$ elements
+  only \f$O(\log n)\f$ allocations are performed) and, more importantly, is
+  much more cache-friendly than a standard (pointer-based) tree, because the
+  elements are stored sequentially in memory (leaving some holes to allow
+  fast insertion of new elements).
+  The downside of this representation is that all iterators are invalidated
+  when an element is added or removed, because the array could have been
+  enlarged or shrunk. This is partially addressed by providing references to
+  internal end iterators that are updated when needed.
+
+  B-trees are cache-friendly too, but the cache size is fixed (usually at
+  compile-time). This raises two problems: firstly the cache size must be
+  known in advance and those data structures do not perform well with other
+  cache sizes and, secondly, even if the cache size is known, the
+  optimizations target only one level of cache. This kind of data structures
+  are called cache aware. This implementation, instead, is cache oblivious:
+  it performs well with every cache size, and thus exploits all of the
+  available caches.
+
+  Assuming \p n is the number of elements in the tree and \p B is the number
+  of (dimension_type, Coefficient) pairs that fit in a cache line, the
+  time and cache misses complexities are the following:
+
+  - Insertions/Queries/Deletions: \f$O(\log^2 n)\f$ time,
+                                  \f$O(\log \frac{n}{B}))\f$ cache misses.
+  - Tree traversal from begin() to end(), using an %iterator: \f$O(n)\f$ time,
+         \f$O(\frac{n}{B})\f$  cache misses.
+  - Queries with a hint: \f$O(\log k)\f$ time and \f$O(\log \frac{k}{B})\f$
+    cache misses, where k is the distance between the given %iterator and the
+    searched element (or the position where it would have been).
+
+  The binary search tree is embedded in a (slightly bigger) complete tree,
+  that is enlarged and shrunk when needed. The complete tree is laid out
+  in an in-order DFS layout in two arrays: one for the keys and one for the
+  associated data.
+  The indexes and values are stored in different arrays to reduce
+  cache-misses during key queries.
+
+  The tree can store up to \f$(-(dimension_type)1)/100\f$ elements.
+  This limit allows faster density computations, but can be removed if needed.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class CO_Tree {
+
+public:
+  class const_iterator;
+  class iterator;
+
+private:
+  //! This is used for node heights and depths in the tree.
+  typedef unsigned height_t;
+
+  PPL_COMPILE_TIME_CHECK(C_Integer<height_t>::max
+                         >= sizeof_to_bits(sizeof(dimension_type)),
+                         "height_t is too small to store depths.");
+
+  class tree_iterator;
+
+  // This must be declared here, because it is a friend of const_iterator.
+  //! Returns the index of the current element in the DFS layout of the
+  //! complete tree.
+  /*!
+    \return the index of the current element in the DFS layout of the complete
+            tree.
+
+    \param itr the iterator that points to the desired element.
+  */
+  dimension_type dfs_index(const_iterator itr) const;
+
+  // This must be declared here, because it is a friend of iterator.
+  //! Returns the index of the current element in the DFS layout of the
+  //! complete tree.
+  /*!
+    \return the index of the current element in the DFS layout of the complete
+            tree.
+
+    \param itr the iterator that points to the desired element.
+  */
+  dimension_type dfs_index(iterator itr) const;
+
+public:
+
+  //! The type of the data elements associated with keys.
+  /*!
+    If this is changed, occurrences of Coefficient_zero() in the CO_Tree
+    implementation have to be replaced with constants of the correct type.
+  */
+  typedef Coefficient data_type;
+  typedef Coefficient_traits::const_reference data_type_const_reference;
+
+  //! A const %iterator on the tree elements, ordered by key.
+  /*!
+    Iterator increment and decrement operations are \f$O(1)\f$ time.
+    These iterators are invalidated by operations that add or remove elements
+    from the tree.
+  */
+  class const_iterator {
+  private:
+  public:
+
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef const data_type value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef data_type_const_reference reference;
+
+    //! Constructs an invalid const_iterator.
+    /*!
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit const_iterator();
+
+    //! Constructs an %iterator pointing to the first element of the tree.
+    /*!
+      \param tree
+      The tree that the new %iterator will point to.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit const_iterator(const CO_Tree& tree);
+
+    //! Constructs a const_iterator pointing to the i-th node of the tree.
+    /*!
+      \param tree
+      The tree that the new %iterator will point to.
+
+      \param i
+      The index of the element in \p tree to which the %iterator will point
+      to.
+
+      The i-th node must be a node with a value or end().
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const CO_Tree& tree, dimension_type i);
+
+    //! The copy constructor.
+    /*!
+      \param itr
+      The %iterator that will be copied.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const const_iterator& itr);
+
+    //! Converts an iterator into a const_iterator.
+    /*!
+      \param itr
+      The iterator that will be converted into a const_iterator.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const iterator& itr);
+
+    //! Swaps itr with *this.
+    /*!
+      \param itr
+      The %iterator that will be swapped with *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    void m_swap(const_iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator=(const const_iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator=(const iterator& itr);
+
+    //! Navigates to the next element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator++();
+
+    //! Navigates to the previous element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator--();
+
+    //! Navigates to the next element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator operator++(int);
+
+    //! Navigates to the previous element.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator operator--(int);
+
+    //! Returns the current element.
+    data_type_const_reference operator*() const;
+
+    //! Returns the index of the element pointed to by \c *this.
+    /*!
+      \returns the index of the element pointed to by \c *this.
+    */
+    dimension_type index() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const const_iterator& x) const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const const_iterator& x) const;
+
+  private:
+    //! Checks the internal invariants, in debug mode only.
+    bool OK() const;
+
+    //! A pointer to the corresponding element of the tree's indexes[] array.
+    const dimension_type* current_index;
+
+    //! A pointer to the corresponding element of the tree's data[] array.
+    const data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+    //! A pointer to the corresponding tree, used for debug purposes only.
+    const CO_Tree* tree;
+#endif
+
+    friend dimension_type CO_Tree::dfs_index(const_iterator itr) const;
+  };
+
+  //! An %iterator on the tree elements, ordered by key.
+  /*!
+    Iterator increment and decrement operations are \f$O(1)\f$ time.
+    These iterators are invalidated by operations that add or remove elements
+    from the tree.
+  */
+  class iterator {
+  public:
+
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef data_type value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef value_type& reference;
+
+    //! Constructs an invalid iterator.
+    /*!
+      This constructor takes \f$O(1)\f$ time.
+    */
+    iterator();
+
+    //! Constructs an %iterator pointing to first element of the tree.
+    /*!
+      \param tree
+      The tree to which the new %iterator will point to.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit iterator(CO_Tree& tree);
+
+    //! Constructs an %iterator pointing to the i-th node.
+    /*!
+      \param tree
+      The tree to which the new %iterator will point to.
+
+      \param i
+      The index of the element in \p tree to which the new %iterator will
+      point to.
+
+      The i-th node must be a node with a value or end().
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    iterator(CO_Tree& tree, dimension_type i);
+
+    //! The constructor from a tree_iterator.
+    /*!
+      \param itr
+      The tree_iterator that will be converted into an iterator.
+
+      This is meant for use by CO_Tree only.
+      This is not private to avoid the friend declaration.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit iterator(const tree_iterator& itr);
+
+    //! The copy constructor.
+    /*!
+      \param itr
+      The %iterator that will be copied.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    iterator(const iterator& itr);
+
+    //! Swaps itr with *this.
+    /*!
+      \param itr
+      The %iterator that will be swapped with *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    void m_swap(iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator=(const iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator=(const tree_iterator& itr);
+
+    //! Navigates to the next element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator++();
+
+    //! Navigates to the previous element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator& operator--();
+
+    //! Navigates to the next element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator operator++(int);
+
+    //! Navigates to the previous element in the tree.
+    /*!
+      This method takes \f$O(1)\f$ time.
+    */
+    iterator operator--(int);
+
+    //! Returns the current element.
+    data_type& operator*();
+
+    //! Returns the current element.
+    data_type_const_reference operator*() const;
+
+    //! Returns the index of the element pointed to by \c *this.
+    /*!
+      \returns the index of the element pointed to by \c *this.
+    */
+    dimension_type index() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const iterator& x) const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const iterator& x) const;
+
+  private:
+    //! Checks the internal invariants, in debug mode only.
+    bool OK() const;
+
+    //! A pointer to the corresponding element of the tree's indexes[] array.
+    const dimension_type* current_index;
+
+    //! A pointer to the corresponding element of the tree's data[] array.
+    data_type* current_data;
+
+#if PPL_CO_TREE_EXTRA_DEBUG
+    //! A pointer to the corresponding tree, used for debug purposes only.
+    CO_Tree* tree;
+#endif
+
+    friend const_iterator& const_iterator::operator=(const iterator&);
+    friend dimension_type CO_Tree::dfs_index(iterator itr) const;
+  };
+
+  //! Constructs an empty tree.
+  /*!
+    This constructor takes \f$O(1)\f$ time.
+  */
+  CO_Tree();
+
+  //! The copy constructor.
+  /*!
+    \param y
+    The tree that will be copied.
+
+    This constructor takes \f$O(n)\f$ time.
+  */
+  CO_Tree(const CO_Tree& y);
+
+  //! A constructor from a sequence of \p n elements.
+  /*!
+    \param i
+    An iterator that points to the first element of the sequence.
+
+    \param n
+    The number of elements in the [i, i_end) sequence.
+
+    i must be an input iterator on a sequence of data_type elements,
+    sorted by index.
+    Objects of Iterator type must have an index() method that returns the
+    index with which the element pointed to by the iterator must be inserted.
+
+    This constructor takes \f$O(n)\f$ time, so it is more efficient than
+    the construction of an empty tree followed by n insertions, that would
+    take \f$O(n*\log^2 n)\f$ time.
+  */
+  template <typename Iterator>
+  CO_Tree(Iterator i, dimension_type n);
+
+  //! The assignment operator.
+  /*!
+    \param y
+    The tree that will be assigned to *this.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  CO_Tree& operator=(const CO_Tree& y);
+
+  //! Removes all elements from the tree.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  void clear();
+
+  //! The destructor.
+  /*!
+    This destructor takes \f$O(n)\f$ time.
+  */
+  ~CO_Tree();
+
+  //! Returns \p true if the tree has no elements.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool empty() const;
+
+  //! Returns the number of elements stored in the tree.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type size() const;
+
+  //! Returns the size() of the largest possible CO_Tree.
+  static dimension_type max_size();
+
+  //! Dumps the tree to stdout, for debugging purposes.
+  void dump_tree() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  dimension_type external_memory_in_bytes() const;
+
+  //! Inserts an element in the tree.
+  /*!
+    \returns
+    An %iterator that points to the inserted pair.
+
+    \param key
+    The key that will be inserted into the tree, associated with the default
+    data.
+
+    If such a pair already exists, an %iterator pointing to that pair is
+    returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator insert(dimension_type key);
+
+  //! Inserts an element in the tree.
+  /*!
+    \returns
+    An %iterator that points to the inserted element.
+
+    \param key
+    The key that will be inserted into the tree..
+
+    \param data
+    The data that will be inserted into the tree.
+
+    If an element with the specified key already exists, its associated data
+    is set to \p data and an %iterator pointing to that pair is returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.amortized
+  */
+  iterator insert(dimension_type key, data_type_const_reference data);
+
+  //! Inserts an element in the tree.
+  /*!
+    \return
+    An %iterator that points to the inserted element.
+
+    \param itr
+    The %iterator used as hint
+
+    \param key
+    The key that will be inserted into the tree, associated with the default
+    data.
+
+    This will be faster if \p itr points near to the place where the new
+    element will be inserted (or where is already stored).
+    However, the value of \p itr does not affect the result of this
+    method, as long it is a valid %iterator for this tree. \p itr may even be
+    end().
+
+    If an element with the specified key already exists, an %iterator pointing
+    to that pair is returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator insert(iterator itr, dimension_type key);
+
+  //! Inserts an element in the tree.
+  /*!
+    \return
+    An iterator that points to the inserted element.
+
+    \param itr
+    The iterator used as hint
+
+    \param key
+    The key that will be inserted into the tree.
+
+    \param data
+    The data that will be inserted into the tree.
+
+    This will be faster if \p itr points near to the place where the new
+    element will be inserted (or where is already stored).
+    However, the value of \p itr does not affect the result of this
+    method, as long it is a valid iterator for this tree. \p itr may even be
+    end().
+
+    If an element with the specified key already exists, its associated data
+    is set to \p data and an iterator pointing to that pair is returned.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists,
+    and \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator insert(iterator itr, dimension_type key,
+                  data_type_const_reference data);
+
+  //! Erases the element with key \p key from the tree.
+  /*!
+    This operation invalidates existing iterators.
+
+    \returns an iterator to the next element (or end() if there are no
+             elements with key greater than \p key ).
+
+    \param key
+    The key of the element that will be erased from the tree.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists,
+    and \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator erase(dimension_type key);
+
+  //! Erases the element pointed to by \p itr from the tree.
+  /*!
+    This operation invalidates existing iterators.
+
+    \returns an iterator to the next element (or end() if there are no
+             elements with key greater than \p key ).
+
+    \param itr
+    An iterator pointing to the element that will be erased from the tree.
+
+    This method takes \f$O(\log n)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  iterator erase(iterator itr);
+
+  /*!
+    \brief Removes the element with key \p key (if it exists) and decrements
+           by 1 all elements' keys that were greater than \p key.
+
+    \param key
+    The key of the element that will be erased from the tree.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k+\log^2 n)\f$ expected time, where k is the number
+    of elements with keys greater than \p key.
+  */
+  void erase_element_and_shift_left(dimension_type key);
+
+  //! Adds \p n to all keys greater than or equal to \p key.
+  /*!
+    \param key
+    The key of the first element whose key will be increased.
+
+    \param n
+    Specifies how much the keys will be increased.
+
+    This method takes \f$O(k+\log n)\f$ expected time, where k is the number
+    of elements with keys greater than or equal to \p key.
+  */
+  void increase_keys_from(dimension_type key, dimension_type n);
+
+  //! Sets to \p i the key of *itr. Assumes that i<=itr.index() and that there
+  //! are no elements with keys in [i,itr.index()).
+  /*!
+    All existing iterators remain valid.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void fast_shift(dimension_type i, iterator itr);
+
+  //! Swaps x with *this.
+  /*!
+    \param x
+    The tree that will be swapped with *this.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void m_swap(CO_Tree& x);
+
+  //! Returns an iterator that points at the first element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator begin();
+
+  //! Returns an iterator that points after the last element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is updated at each operation that modifies the structure.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const iterator& end();
+
+  //! Equivalent to cbegin().
+  const_iterator begin() const;
+
+  //! Equivalent to cend().
+  const const_iterator& end() const;
+
+  //! Returns a const_iterator that points at the first element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator cbegin() const;
+
+  //! Returns a const_iterator that points after the last element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is updated at each operation that modifies the structure.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const const_iterator& cend() const;
+
+  //! Searches an element with key \p key using bisection.
+  /*!
+    \param key
+    The key that will be searched for.
+
+    If the element is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  iterator bisect(dimension_type key);
+
+  //! Searches an element with key \p key using bisection.
+  /*!
+    \param key
+    The key that will be searched for.
+
+    If the element is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  const_iterator bisect(dimension_type key) const;
+
+  //! Searches an element with key \p key in [first, last] using bisection.
+  /*!
+    \param first
+    An %iterator pointing to the first element in the range.
+    It must not be end().
+
+    \param last
+    An %iterator pointing to the last element in the range.
+    Note that this is included in the search.
+    It must not be end().
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the specified key is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log(last - first + 1))\f$ time.
+  */
+  iterator bisect_in(iterator first, iterator last, dimension_type key);
+
+  //! Searches an element with key \p key in [first, last] using bisection.
+  /*!
+    \param first
+    An %iterator pointing to the first element in the range.
+    It must not be end().
+
+    \param last
+    An %iterator pointing to the last element in the range.
+    Note that this is included in the search.
+    It must not be end().
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the specified key is found, an %iterator pointing to that element is
+    returned; otherwise, the returned %iterator refers to the immediately
+    preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    This method takes \f$O(\log(last - first + 1))\f$ time.
+  */
+  const_iterator bisect_in(const_iterator first, const_iterator last,
+                           dimension_type key) const;
+
+  //! Searches an element with key \p key near \p hint.
+  /*!
+    \param hint
+    An %iterator used as a hint.
+
+    \param key
+    The key that will be searched for.
+
+    If the element is found, the returned %iterator points to that element;
+    otherwise, it points to the immediately preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this tree. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time. If the distance between the
+    returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+  */
+  iterator bisect_near(iterator hint, dimension_type key);
+
+  //! Searches an element with key \p key near \p hint.
+  /*!
+    \param hint
+    An %iterator used as a hint.
+
+    \param key
+    The key that will be searched for.
+
+    If the element is found, the returned %iterator points to that element;
+    otherwise, it points to the immediately preceding or succeeding value.
+    If the tree is empty, end() is returned.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this tree. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time. If the distance between the
+    returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+  */
+  const_iterator bisect_near(const_iterator hint, dimension_type key) const;
+
+private:
+
+  //! Searches an element with key \p key in [first, last] using bisection.
+  /*!
+    \param first
+    The index of the first element in the range.
+    It must be the index of an element with a value.
+
+    \param last
+    The index of the last element in the range.
+    It must be the index of an element with a value.
+    Note that this is included in the search.
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the element is found, the index of that element is returned; otherwise,
+    the returned index refers to the immediately preceding or succeeding
+    value.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  dimension_type bisect_in(dimension_type first, dimension_type last,
+                           dimension_type key) const;
+
+  //! Searches an element with key \p key near \p hint.
+  /*!
+    \param hint
+    An index used as a hint.
+    It must be the index of an element with a value.
+
+    \param key
+    The key that will be searched for.
+
+    \return
+    If the element is found, the index of that element is returned; otherwise,
+    the returned index refers to the immediately preceding or succeeding
+    value.
+
+    This uses a binary progression and then a bisection, so this method is
+    \f$O(\log n)\f$, and it is \f$O(1)\f$ if the distance between the returned
+    position and \p hint is \f$O(1)\f$.
+
+    This method takes \f$O(\log n)\f$ time. If the distance between the
+    returned position and \p hint is \f$O(1)\f$ it takes \f$O(1)\f$ time.
+  */
+  dimension_type bisect_near(dimension_type hint, dimension_type key) const;
+
+  //! Inserts an element in the tree.
+  /*!
+    If there is already an element with key \p key in the tree, its
+    associated data is set to \p data.
+
+    This operation invalidates existing iterators.
+
+    \return
+    An %iterator that points to the inserted element.
+
+    \param key
+    The key that will be inserted into the tree.
+
+    \param data
+    The data that will be associated with \p key.
+
+    \param itr
+    It must point to the element in the tree with key \p key or, if no such
+    element exists, it must point to the node that would be his parent.
+
+    This method takes \f$O(1)\f$ time if the element already exists, and
+    \f$O(\log^2 n)\f$ amortized time otherwise.
+  */
+  tree_iterator insert_precise(dimension_type key,
+                               data_type_const_reference data,
+                               tree_iterator itr);
+
+  //! Helper for \c insert_precise.
+  /*!
+    This helper method takes the same arguments as \c insert_precise,
+    but besides assuming that \p itr is a correct hint, it also assumes
+    that \p key and \p data are not in the tree; namely, a proper
+    insertion has to be done and the insertion can not invalidate \p data.
+  */
+  tree_iterator insert_precise_aux(dimension_type key,
+                                   data_type_const_reference data,
+                                   tree_iterator itr);
+
+  //! Inserts an element in the tree.
+  /*!
+
+    \param key
+    The key that will be inserted into the tree.
+
+    \param data
+    The data that will be associated with \p key.
+
+    The tree must be empty.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void insert_in_empty_tree(dimension_type key,
+                            data_type_const_reference data);
+
+  //! Erases from the tree the element pointed to by \p itr .
+  /*!
+    This operation invalidates existing iterators.
+
+    \returns
+    An %iterator to the next element (or end() if there are no elements with
+    key greater than \p key ).
+
+    \param itr
+    An %iterator pointing to the element that will be erased.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator erase(tree_iterator itr);
+
+  //! Initializes a tree with reserved size at least \p n .
+  /*!
+    \param n
+    A lower bound on the tree's desired reserved size.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void init(dimension_type n);
+
+  //! Deallocates the tree's dynamic arrays.
+  /*!
+    After this call, the tree fields are uninitialized, so init() must be
+    called again before using the tree.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void destroy();
+
+  //! Checks the internal invariants, but not the densities.
+  bool structure_OK() const;
+
+  //! Checks the internal invariants.
+  bool OK() const;
+
+  //! Returns the floor of the base-2 logarithm of \p n .
+  /*!
+    \param n
+    It must be greater than zero.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  static unsigned integer_log2(dimension_type n);
+
+  //! Compares the fractions numer/denom with ratio/100.
+  /*!
+    \returns Returns true if the fraction numer/denom is less
+    than the fraction ratio/100.
+
+    \param ratio
+    It must be less than or equal to 100.
+
+    \param numer
+    The numerator of the fraction.
+
+    \param denom
+    The denominator of the fraction.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  static bool is_less_than_ratio(dimension_type numer, dimension_type denom,
+                                 dimension_type ratio);
+
+  //! Compares the fractions numer/denom with ratio/100.
+  /*!
+    \returns
+    Returns true if the fraction numer/denom is greater than the fraction
+    ratio/100.
+
+    \param ratio
+    It must be less than or equal to 100.
+
+    \param numer
+    The numerator of the fraction.
+
+    \param denom
+    The denominator of the fraction.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  static bool is_greater_than_ratio(dimension_type numer, dimension_type denom,
+                                    dimension_type ratio);
+
+  //! Dumps the subtree rooted at \p itr to stdout, for debugging purposes.
+  /*!
+    \param itr
+    A tree_iterator pointing to the root of the desired subtree.
+  */
+  static void dump_subtree(tree_iterator itr);
+
+  //! Increases the tree's reserved size.
+  /*!
+    This is called when the density is about to exceed the maximum density
+    (specified by max_density_percent).
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void rebuild_bigger_tree();
+
+  //! Decreases the tree's reserved size.
+  /*!
+    This is called when the density is about to become less than the minimum
+    allowed density (specified by min_density_percent).
+
+    \p reserved_size must be greater than 3 (otherwise the tree can just be
+    cleared).
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void rebuild_smaller_tree();
+
+  //! Re-initializes the cached iterators.
+  /*!
+    This method must be called when the indexes[] and data[] vector are
+    reallocated.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void refresh_cached_iterators();
+
+  //! Rebalances the tree.
+  /*!
+    For insertions, it adds the pair (key, value) in the process.
+
+    This operation invalidates existing iterators that point to nodes in the
+    rebalanced subtree.
+
+    \returns an %iterator pointing to the root of the subtree that was
+             rebalanced.
+
+    \param itr
+    It points to the node where the new element has to be inserted or where an
+    element has just been deleted.
+
+    \param key
+    The index that will be inserted in the tree (for insertions only).
+
+    \param value
+    The value that will be inserted in the tree (for insertions only).
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  tree_iterator rebalance(tree_iterator itr, dimension_type key,
+                          data_type_const_reference value);
+
+  //! Moves all elements of a subtree to the rightmost end.
+  /*!
+    \returns
+    The index of the rightmost unused node in the subtree after the process.
+
+    \param last_in_subtree
+    It is the index of the last element in the subtree.
+
+    \param subtree_size
+    It is the number of valid elements in the subtree.
+    It must be greater than zero.
+
+    \param key
+    The key that may be added to the tree if add_element is \c true.
+
+    \param value
+    The value that may be added to the tree if add_element is \c true.
+
+    \param add_element
+    If it is true, it tries to add an element with key \p key and value
+    \p value in the process (but it may not).
+
+    This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+  */
+  dimension_type compact_elements_in_the_rightmost_end(
+    dimension_type last_in_subtree, dimension_type subtree_size,
+    dimension_type key, data_type_const_reference value,
+    bool add_element);
+
+  //! Redistributes the elements in the subtree rooted at \p root_index.
+  /*!
+    The subtree's elements must be compacted to the rightmost end.
+
+    \param root_index
+    The index of the subtree's root node.
+
+    \param subtree_size
+    It is the number of used elements in the subtree.
+    It must be greater than zero.
+
+    \param last_used
+    It points to the leftmost element with a value in the subtree.
+
+    \param add_element
+    If it is true, this method adds an element with the specified key and
+    value in the process.
+
+    \param key
+    The key that will be added to the tree if \p add_element is \c true.
+
+    \param value
+    The data that will be added to the tree if \p add_element is \c true.
+
+    This method takes \f$O(k)\f$ time, where k is \p subtree_size.
+  */
+  void redistribute_elements_in_subtree(dimension_type root_index,
+                                        dimension_type subtree_size,
+                                        dimension_type last_used,
+                                        dimension_type key,
+                                        data_type_const_reference value,
+                                        bool add_element);
+
+  //! Moves all data in the tree \p tree into *this.
+  /*!
+    \param tree
+    The tree from which the element will be moved into *this.
+
+    *this must be empty and big enough to contain all of tree's data without
+    exceeding max_density.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void move_data_from(CO_Tree& tree);
+
+  //! Copies all data in the tree \p tree into *this.
+  /*!
+    \param tree
+    The tree from which the element will be copied into *this.
+
+    *this must be empty and must have the same reserved size of \p tree.
+    this->OK() may return false before this method is called, but
+    this->structure_OK() must return true.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void copy_data_from(const CO_Tree& tree);
+
+  //! Counts the number of used elements in the subtree rooted at itr.
+  /*!
+    \param itr
+    An %iterator pointing to the root of the desired subtree.
+
+    This method takes \f$O(k)\f$ time, where k is the number of elements in
+    the subtree.
+  */
+  static dimension_type count_used_in_subtree(tree_iterator itr);
+
+  //! Moves the value of \p from in \p to .
+  /*!
+    \param from
+    It must be a valid value.
+
+    \param to
+    It must be a non-constructed chunk of memory.
+
+    After the move, \p from becomes a non-constructed chunk of memory and
+    \p to gets the value previously stored by \p from.
+
+    The implementation of this method assumes that data_type values do not
+    keep pointers to themselves nor to their fields.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  static void move_data_element(data_type& to, data_type& from);
+
+  //! The maximum density of used nodes.
+  /*!
+    This must be greater than or equal to 50 and lower than 100.
+  */
+  static const dimension_type max_density_percent = 91;
+
+  //! The minimum density of used nodes.
+  /*!
+    Must be strictly lower than the half of max_density_percent.
+  */
+  static const dimension_type min_density_percent = 38;
+
+  //! The minimum density at the leaves' depth.
+  /*!
+    Must be greater than zero and strictly lower than min_density_percent.
+
+    Increasing the value is safe but leads to time inefficiencies
+    (measured against ppl_lpsol on 24 August 2010), because it forces trees to
+    be more balanced, increasing the cost of rebalancing.
+  */
+  static const dimension_type min_leaf_density_percent = 1;
+
+  //! An index used as a marker for unused nodes in the tree.
+  /*!
+    This must not be used as a key.
+  */
+  static const dimension_type unused_index = C_Integer<dimension_type>::max;
+
+  //! The %iterator returned by end().
+  /*!
+    It is updated when needed, to keep it valid.
+  */
+  iterator cached_end;
+
+  //! The %iterator returned by the const version of end().
+  /*!
+    It is updated when needed, to keep it valid.
+  */
+  const_iterator cached_const_end;
+
+  //! The depth of the leaves in the complete tree.
+  height_t max_depth;
+
+  //! The vector that contains the keys in the tree.
+  /*!
+    If an element of this vector is \p unused_index , it means that that
+    element and the corresponding element of data[] are not used.
+
+    Its size is reserved_size + 2, because the first and the last elements
+    are used as markers for iterators.
+  */
+  dimension_type* indexes;
+
+  //! The allocator used to allocate/deallocate data.
+  std::allocator<data_type> data_allocator;
+
+  //! The vector that contains the data of the keys in the tree.
+  /*!
+    If index[i] is \p unused_index, data[i] is unused.
+    Otherwise, data[i] contains the data associated to the indexes[i] key.
+
+    Its size is reserved_size + 1, because the first element is not used (to
+    allow using the same index in both indexes[] and data[] instead of
+    adding 1 to access data[]).
+  */
+  data_type* data;
+
+  //! The number of nodes in the complete tree.
+  /*!
+    It is one less than a power of 2.
+    If this is 0, data and indexes are set to NULL.
+  */
+  dimension_type reserved_size;
+
+  //! The number of values stored in the tree.
+  dimension_type size_;
+};
+
+class CO_Tree::tree_iterator {
+
+public:
+
+  /*!
+    \brief Constructs a tree_iterator pointing at the root node of the
+           specified tree
+
+    \param tree
+    The tree to which the new %iterator will point to.
+    It must not be empty.
+  */
+  explicit tree_iterator(CO_Tree& tree);
+
+  //! Constructs a tree_iterator pointing at the specified node of the tree.
+  /*!
+    \param tree
+    The tree to which the new %iterator will point to.
+    It must not be empty.
+
+    \param i
+    The index of the element in \p tree to which the new %iterator will point
+    to.
+  */
+  tree_iterator(CO_Tree& tree, dimension_type i);
+
+  //! Constructs a tree_iterator from an iterator.
+  /*!
+    \param itr
+    The iterator that will be converted into a tree_iterator.
+    It must not be end().
+
+    \param tree
+    The tree to which the new %iterator will point to.
+    It must not be empty.
+  */
+  tree_iterator(const iterator& itr, CO_Tree& tree);
+
+  //! The assignment operator.
+  /*!
+    \param itr
+    The %iterator that will be assigned into *this.
+  */
+  tree_iterator& operator=(const tree_iterator& itr);
+
+  //! The assignment operator from an iterator.
+  /*!
+    \param itr
+    The iterator that will be assigned into *this.
+  */
+  tree_iterator& operator=(const iterator& itr);
+
+  //! Compares *this with \p itr.
+  /*!
+    \param itr
+    The %iterator that will compared with *this.
+  */
+  bool operator==(const tree_iterator& itr) const;
+
+  //! Compares *this with \p itr.
+  /*!
+    \param itr
+    The %iterator that will compared with *this.
+  */
+  bool operator!=(const tree_iterator& itr) const;
+
+  //! Makes the %iterator point to the root of \p tree.
+  /*!
+    The values of all fields (beside tree) are overwritten.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_root();
+
+  //! Makes the %iterator point to the left child of the current node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_left_child();
+
+  //! Makes the %iterator point to the right child of the current node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_right_child();
+
+  //! Makes the %iterator point to the parent of the current node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  void get_parent();
+
+  /*!
+    \brief Searches for an element with key \p key in the subtree rooted at
+           \p *this.
+
+    \param key
+    The searched for key.
+
+    After this method, *this points to the found node (if it exists) or to
+    the node that would be his parent (otherwise).
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  void go_down_searching_key(dimension_type key);
+
+  /*!
+    \brief Follows left children with a value, until it arrives at a leaf or at
+           a node with no value.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void follow_left_children_with_value();
+
+  /*!
+    \brief Follows right children with a value, until it arrives at a leaf or at
+           a node with no value.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void follow_right_children_with_value();
+
+  //! Returns true if the pointed node is the root node.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool is_root() const;
+
+  //! Returns true if the pointed node has a parent and is its right child.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool is_right_child() const;
+
+  //! Returns true if the pointed node is a leaf of the complete tree.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  bool is_leaf() const;
+
+  //! Returns the key and value of the current node.
+  data_type& operator*();
+
+  //! Returns the key and value of the current node.
+  Coefficient_traits::const_reference operator*() const;
+
+  //! Returns a reference to the index of the element pointed to by \c *this.
+  /*!
+    \returns a reference to the index of the element pointed to by \c *this.
+  */
+  dimension_type& index();
+
+  //! Returns the index of the element pointed to by \c *this.
+  /*!
+    \returns the index of the element pointed to by \c *this.
+  */
+  dimension_type index() const;
+
+  //! Returns the index of the node pointed to by \c *this.
+  /*!
+    \returns the key of the node pointed to by \c *this, or unused_index if
+             the current node does not contain a valid element.
+  */
+  dimension_type key() const;
+
+  //! The tree containing the element pointed to by this %iterator.
+  CO_Tree& tree;
+
+  /*!
+    \brief Returns the index of the current node in the DFS layout of the
+           complete tree.
+  */
+  dimension_type dfs_index() const;
+
+  /*!
+    \brief Returns 2^h, with h the height of the current node in the tree,
+           counting from 0.
+
+    Thus leaves have offset 1.
+    This is faster than depth(), so it is useful to compare node depths.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type get_offset() const;
+
+  //! Returns the depth of the current node in the complete tree.
+  /*!
+    This method takes \f$O(\log n)\f$ time.
+  */
+  height_t depth() const;
+
+private:
+  //! Checks the internal invariant.
+  bool OK() const;
+
+  //! The index of the current node in the DFS layout of the complete tree.
+  dimension_type i;
+
+  /*!
+    \brief This is 2^h, with h the height of the current node in the tree,
+           counting from 0.
+
+    Thus leaves have offset 1.
+    This is equal to (i & -i), and is only stored to increase performance.
+  */
+  dimension_type offset;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree& x, CO_Tree& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::const_iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates CO_Tree::iterator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(CO_Tree::iterator& x, CO_Tree::iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_inlines.hh line 1. */
+/* CO_Tree class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+CO_Tree::dfs_index(const_iterator itr) const {
+  PPL_ASSERT(itr.current_index != 0);
+  PPL_ASSERT(itr.current_index >= indexes + 1);
+  PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+  const ptrdiff_t index = itr.current_index - indexes;
+  return static_cast<dimension_type>(index);
+}
+
+inline dimension_type
+CO_Tree::dfs_index(iterator itr) const {
+  PPL_ASSERT(itr.current_index != 0);
+  PPL_ASSERT(itr.current_index >= indexes + 1);
+  PPL_ASSERT(itr.current_index <= indexes + reserved_size);
+  const ptrdiff_t index = itr.current_index - indexes;
+  return static_cast<dimension_type>(index);
+}
+
+inline
+CO_Tree::CO_Tree() {
+  init(0);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::CO_Tree(const CO_Tree& y) {
+  PPL_ASSERT(y.OK());
+  data_allocator = y.data_allocator;
+  init(y.reserved_size);
+  copy_data_from(y);
+}
+
+inline CO_Tree&
+CO_Tree::operator=(const CO_Tree& y) {
+  if (this != &y) {
+    destroy();
+    data_allocator = y.data_allocator;
+    init(y.reserved_size);
+    copy_data_from(y);
+  }
+  return *this;
+}
+
+inline void
+CO_Tree::clear() {
+  *this = CO_Tree();
+}
+
+inline
+CO_Tree::~CO_Tree() {
+
+  destroy();
+}
+
+inline bool
+CO_Tree::empty() const {
+  return size_ == 0;
+}
+
+inline dimension_type
+CO_Tree::size() const {
+  return size_;
+}
+
+inline dimension_type
+CO_Tree::max_size() {
+  return C_Integer<dimension_type>::max/100;
+}
+
+inline void
+CO_Tree::dump_tree() const {
+  if (empty())
+    std::cout << "(empty tree)" << std::endl;
+  else
+    dump_subtree(tree_iterator(*const_cast<CO_Tree*>(this)));
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(const dimension_type key) {
+  if (empty())
+    return insert(key, Coefficient_zero());
+  else {
+    tree_iterator itr(*this);
+    itr.go_down_searching_key(key);
+    if (itr.index() == key)
+      return iterator(itr);
+    else
+      return iterator(insert_precise(key, Coefficient_zero(), itr));
+  }
+}
+
+inline CO_Tree::iterator
+CO_Tree::insert(dimension_type key, data_type_const_reference data1) {
+  if (empty()) {
+    insert_in_empty_tree(key, data1);
+    tree_iterator itr(*this);
+    PPL_ASSERT(itr.index() != unused_index);
+    return iterator(itr);
+  }
+  else {
+    tree_iterator itr(*this);
+    itr.go_down_searching_key(key);
+    return iterator(insert_precise(key, data1, itr));
+  }
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(dimension_type key) {
+  PPL_ASSERT(key != unused_index);
+
+  if (empty())
+    return end();
+
+  tree_iterator itr(*this);
+  itr.go_down_searching_key(key);
+
+  if (itr.index() == key)
+    return erase(itr);
+
+  iterator result(itr);
+  if (result.index() < key)
+    ++result;
+
+  PPL_ASSERT(result == end() || result.index() > key);
+#ifndef NDEBUG
+  iterator last = end();
+  --last;
+  PPL_ASSERT((result == end()) == (last.index() < key));
+#endif
+
+  return result;
+}
+
+inline CO_Tree::iterator
+CO_Tree::erase(iterator itr) {
+  PPL_ASSERT(itr != end());
+  return erase(tree_iterator(itr, *this));
+}
+
+inline void
+CO_Tree::m_swap(CO_Tree& x) {
+  using std::swap;
+  swap(max_depth, x.max_depth);
+  swap(indexes, x.indexes);
+  swap(data_allocator, x.data_allocator);
+  swap(data, x.data);
+  swap(reserved_size, x.reserved_size);
+  swap(size_, x.size_);
+  // Cached iterators have been invalidated by the swap,
+  // they must be refreshed here.
+  refresh_cached_iterators();
+  x.refresh_cached_iterators();
+  PPL_ASSERT(structure_OK());
+  PPL_ASSERT(x.structure_OK());
+}
+
+inline CO_Tree::iterator
+CO_Tree::begin() {
+  return iterator(*this);
+}
+
+inline const CO_Tree::iterator&
+CO_Tree::end() {
+  return cached_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::begin() const {
+  return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::end() const {
+  return cached_const_end;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::cbegin() const {
+  return const_iterator(*this);
+}
+
+inline const CO_Tree::const_iterator&
+CO_Tree::cend() const {
+  return cached_const_end;
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect(dimension_type key) {
+  if (empty())
+    return end();
+  iterator last = end();
+  --last;
+  return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect(dimension_type key) const {
+  if (empty())
+    return end();
+  const_iterator last = end();
+  --last;
+  return bisect_in(begin(), last, key);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_in(iterator first, iterator last, dimension_type key) {
+  PPL_ASSERT(first != end());
+  PPL_ASSERT(last != end());
+  const dimension_type index
+    = bisect_in(dfs_index(first), dfs_index(last), key);
+  return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_in(const_iterator first, const_iterator last,
+                   dimension_type key) const {
+  PPL_ASSERT(first != end());
+  PPL_ASSERT(last != end());
+  const dimension_type index
+    = bisect_in(dfs_index(first), dfs_index(last), key);
+  return const_iterator(*this, index);
+}
+
+inline CO_Tree::iterator
+CO_Tree::bisect_near(iterator hint, dimension_type key) {
+  if (hint == end())
+    return bisect(key);
+  const dimension_type index
+    = bisect_near(dfs_index(hint), key);
+  return iterator(*this, index);
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::bisect_near(const_iterator hint, dimension_type key) const {
+  if (hint == end())
+    return bisect(key);
+  const dimension_type index = bisect_near(dfs_index(hint), key);
+  return const_iterator(*this, index);
+}
+
+inline void
+CO_Tree::fast_shift(dimension_type i, iterator itr) {
+  PPL_ASSERT(itr != end());
+  PPL_ASSERT(i <= itr.index());
+  indexes[dfs_index(itr)] = i;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::insert_in_empty_tree(dimension_type key,
+                              data_type_const_reference data1) {
+  PPL_ASSERT(empty());
+  rebuild_bigger_tree();
+  tree_iterator itr(*this);
+  PPL_ASSERT(itr.index() == unused_index);
+  new (&(*itr)) data_type(data1);
+  // Set the index afterwards, so that if the constructor above throws
+  // the tree's structure is consistent.
+  itr.index() = key;
+  ++size_;
+
+  PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::is_less_than_ratio(dimension_type numer, dimension_type denom,
+                            dimension_type ratio) {
+  PPL_ASSERT(ratio <= 100);
+  // If these are true, no overflows are possible.
+  PPL_ASSERT(denom <= unused_index/100);
+  PPL_ASSERT(numer <= unused_index/100);
+  return 100*numer < ratio*denom;
+}
+
+inline bool
+CO_Tree::is_greater_than_ratio(dimension_type numer, dimension_type denom,
+                               dimension_type ratio) {
+  PPL_ASSERT(ratio <= 100);
+  // If these are true, no overflows are possible.
+  PPL_ASSERT(denom <= unused_index/100);
+  PPL_ASSERT(numer <= unused_index/100);
+  return 100*numer > ratio*denom;
+}
+
+inline void
+CO_Tree::rebuild_smaller_tree() {
+  PPL_ASSERT(reserved_size > 3);
+  CO_Tree new_tree;
+  new_tree.init(reserved_size / 2);
+  new_tree.move_data_from(*this);
+  m_swap(new_tree);
+  PPL_ASSERT(new_tree.structure_OK());
+  PPL_ASSERT(structure_OK());
+}
+
+inline void
+CO_Tree::refresh_cached_iterators() {
+  cached_end = iterator(*this, reserved_size + 1);
+  cached_const_end = const_iterator(*this, reserved_size + 1);
+}
+
+inline void
+CO_Tree::move_data_element(data_type& to, data_type& from) {
+  // The following code is equivalent (but slower):
+  //
+  // <CODE>
+  //   new (&to) data_type(from);
+  //   from.~data_type();
+  // </CODE>
+  std::memcpy(&to, &from, sizeof(data_type));
+}
+
+
+inline
+CO_Tree::const_iterator::const_iterator()
+  : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = 0;
+#endif
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1)
+  : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  if (!tree1.empty())
+    while (*current_index == unused_index) {
+      ++current_index;
+      ++current_data;
+    }
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const CO_Tree& tree1,
+                                        dimension_type i)
+  : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  PPL_ASSERT(i != 0);
+  PPL_ASSERT(i <= tree1.reserved_size + 1);
+  PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const const_iterator& itr2) {
+  (*this) = itr2;
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::const_iterator::const_iterator(const iterator& itr2) {
+  (*this) = itr2;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::const_iterator::m_swap(const_iterator& itr) {
+  using std::swap;
+  swap(current_data, itr.current_data);
+  swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  swap(tree, itr.tree);
+#endif
+  PPL_ASSERT(OK());
+  PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const const_iterator& itr2) {
+  current_index = itr2.current_index;
+  current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = itr2.tree;
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator=(const iterator& itr2) {
+  current_index = itr2.current_index;
+  current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = itr2.tree;
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator++() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  ++current_index;
+  ++current_data;
+  while (*current_index == unused_index) {
+    ++current_index;
+    ++current_data;
+  }
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator&
+CO_Tree::const_iterator::operator--() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  --current_index;
+  --current_data;
+  while (*current_index == unused_index) {
+    --current_index;
+    --current_data;
+  }
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator++(int) {
+  const_iterator itr(*this);
+  ++(*this);
+  return itr;
+}
+
+inline CO_Tree::const_iterator
+CO_Tree::const_iterator::operator--(int) {
+  const_iterator itr(*this);
+  --(*this);
+  return itr;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::const_iterator::operator*() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_data;
+}
+
+inline dimension_type
+CO_Tree::const_iterator::index() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_index;
+}
+
+inline bool
+CO_Tree::const_iterator::operator==(const const_iterator& x) const {
+  PPL_ASSERT((current_index == x.current_index)
+             == (current_data == x.current_data));
+  PPL_ASSERT(OK());
+  return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::const_iterator::operator!=(const const_iterator& x) const {
+  return !(*this == x);
+}
+
+
+inline
+CO_Tree::iterator::iterator()
+  : current_index(0), current_data(0) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = 0;
+#endif
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1)
+  : current_index(&(tree1.indexes[1])), current_data(&(tree1.data[1])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  if (!tree1.empty())
+    while (*current_index == unused_index) {
+      ++current_index;
+      ++current_data;
+    }
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(CO_Tree& tree1, dimension_type i)
+  : current_index(&(tree1.indexes[i])), current_data(&(tree1.data[i])) {
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &tree1;
+#endif
+  PPL_ASSERT(i != 0);
+  PPL_ASSERT(i <= tree1.reserved_size + 1);
+  PPL_ASSERT(tree1.empty() || tree1.indexes[i] != unused_index);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const tree_iterator& itr) {
+  *this = itr;
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::iterator::iterator(const iterator& itr2) {
+  (*this) = itr2;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::iterator::m_swap(iterator& itr) {
+  using std::swap;
+  swap(current_data, itr.current_data);
+  swap(current_index, itr.current_index);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  swap(tree, itr.tree);
+#endif
+  PPL_ASSERT(OK());
+  PPL_ASSERT(itr.OK());
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const tree_iterator& itr) {
+  current_index = &(itr.tree.indexes[itr.dfs_index()]);
+  current_data = &(itr.tree.data[itr.dfs_index()]);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = &(itr.tree);
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator=(const iterator& itr2) {
+  current_index = itr2.current_index;
+  current_data = itr2.current_data;
+#if PPL_CO_TREE_EXTRA_DEBUG
+  tree = itr2.tree;
+#endif
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator++() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  ++current_index;
+  ++current_data;
+  while (*current_index == unused_index) {
+    ++current_index;
+    ++current_data;
+  }
+
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator&
+CO_Tree::iterator::operator--() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  --current_index;
+  --current_data;
+  while (*current_index == unused_index) {
+    --current_index;
+    --current_data;
+  }
+
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator++(int) {
+  iterator itr(*this);
+  ++(*this);
+  return itr;
+}
+
+inline CO_Tree::iterator
+CO_Tree::iterator::operator--(int) {
+  iterator itr(*this);
+  --(*this);
+  return itr;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::iterator::operator*() {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_data;
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::iterator::operator*() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_data;
+}
+
+inline dimension_type
+CO_Tree::iterator::index() const {
+  PPL_ASSERT(current_index != 0);
+  PPL_ASSERT(current_data != 0);
+  PPL_ASSERT(OK());
+#if PPL_CO_TREE_EXTRA_DEBUG
+  PPL_ASSERT(current_index != &(tree->indexes[tree->reserved_size + 1]));
+#endif
+  return *current_index;
+}
+
+inline bool
+CO_Tree::iterator::operator==(const iterator& x) const {
+  PPL_ASSERT((current_index == x.current_index)
+             == (current_data == x.current_data));
+  PPL_ASSERT(OK());
+  return (current_index == x.current_index);
+}
+
+inline bool
+CO_Tree::iterator::operator!=(const iterator& x) const {
+  return !(*this == x);
+}
+
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1)
+  : tree(tree1) {
+  PPL_ASSERT(tree.reserved_size != 0);
+  get_root();
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(CO_Tree& tree1, dimension_type i1)
+  : tree(tree1) {
+  PPL_ASSERT(tree.reserved_size != 0);
+  PPL_ASSERT(i1 <= tree.reserved_size + 1);
+  i = i1;
+  offset = least_significant_one_mask(i);
+  PPL_ASSERT(OK());
+}
+
+inline
+CO_Tree::tree_iterator::tree_iterator(const iterator& itr, CO_Tree& tree1)
+  : tree(tree1) {
+  PPL_ASSERT(tree.reserved_size != 0);
+  *this = itr;
+  PPL_ASSERT(OK());
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const tree_iterator& itr) {
+  PPL_ASSERT(&tree == &(itr.tree));
+  i = itr.i;
+  offset = itr.offset;
+  return *this;
+}
+
+inline CO_Tree::tree_iterator&
+CO_Tree::tree_iterator::operator=(const iterator& itr) {
+  PPL_ASSERT(itr != tree.end());
+  i = tree.dfs_index(itr);
+  offset = least_significant_one_mask(i);
+  return *this;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator==(const tree_iterator& itr) const {
+  return i == itr.i;
+}
+
+inline bool
+CO_Tree::tree_iterator::operator!=(const tree_iterator& itr) const {
+  return !(*this == itr);
+}
+
+inline void
+CO_Tree::tree_iterator::get_root() {
+  i = tree.reserved_size / 2 + 1;
+  offset = i;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_left_child() {
+  PPL_ASSERT(offset != 0);
+  PPL_ASSERT(offset != 1);
+  offset /= 2;
+  i -= offset;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_right_child() {
+  PPL_ASSERT(offset != 0);
+  PPL_ASSERT(offset != 1);
+  offset /= 2;
+  i += offset;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::get_parent() {
+  PPL_ASSERT(!is_root());
+  PPL_ASSERT(offset != 0);
+  i &= ~offset;
+  offset *= 2;
+  i |= offset;
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_left_children_with_value() {
+  PPL_ASSERT(index() != unused_index);
+  const dimension_type* p = tree.indexes;
+  p += i;
+  p -= (offset - 1);
+  while (*p == unused_index)
+    ++p;
+  const ptrdiff_t distance = p - tree.indexes;
+  PPL_ASSERT(distance >= 0);
+  i = static_cast<dimension_type>(distance);
+  offset = least_significant_one_mask(i);
+  PPL_ASSERT(OK());
+}
+
+inline void
+CO_Tree::tree_iterator::follow_right_children_with_value() {
+  PPL_ASSERT(index() != unused_index);
+  const dimension_type* p = tree.indexes;
+  p += i;
+  p += (offset - 1);
+  while (*p == unused_index)
+    --p;
+  const ptrdiff_t distance = p - tree.indexes;
+  PPL_ASSERT(distance >= 0);
+  i = static_cast<dimension_type>(distance);
+  offset = least_significant_one_mask(i);
+  PPL_ASSERT(OK());
+}
+
+inline bool
+CO_Tree::tree_iterator::is_root() const {
+  // This is implied by OK(), it is here for reference only.
+  PPL_ASSERT(offset <= (tree.reserved_size / 2 + 1));
+  return offset == (tree.reserved_size / 2 + 1);
+}
+
+inline bool
+CO_Tree::tree_iterator::is_right_child() const {
+  if (is_root())
+    return false;
+  return (i & (2*offset)) != 0;
+}
+
+inline bool
+CO_Tree::tree_iterator::is_leaf() const {
+  return offset == 1;
+}
+
+inline CO_Tree::data_type&
+CO_Tree::tree_iterator::operator*() {
+  return tree.data[i];
+}
+
+inline Coefficient_traits::const_reference
+CO_Tree::tree_iterator::operator*() const {
+  return tree.data[i];
+}
+
+inline dimension_type&
+CO_Tree::tree_iterator::index() {
+  return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::index() const {
+  return tree.indexes[i];
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::dfs_index() const {
+  return i;
+}
+
+inline dimension_type
+CO_Tree::tree_iterator::get_offset() const {
+  return offset;
+}
+
+inline CO_Tree::height_t
+CO_Tree::tree_iterator::depth() const {
+  return integer_log2((tree.reserved_size + 1) / offset);
+}
+
+inline void
+swap(CO_Tree& x, CO_Tree& y) {
+  x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::const_iterator& x, CO_Tree::const_iterator& y) {
+  x.m_swap(y);
+}
+
+inline void
+swap(CO_Tree::iterator& x, CO_Tree::iterator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_templates.hh line 1. */
+/* CO_Tree class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Iterator>
+CO_Tree::CO_Tree(Iterator i, dimension_type n) {
+
+  if (n == 0) {
+    init(0);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  const dimension_type new_max_depth = integer_log2(n) + 1;
+  reserved_size = (static_cast<dimension_type>(1) << new_max_depth) - 1;
+
+  if (is_greater_than_ratio(n, reserved_size, max_density_percent)
+      && reserved_size != 3)
+    reserved_size = reserved_size*2 + 1;
+
+  init(reserved_size);
+
+  tree_iterator root(*this);
+
+  // This is static and with static allocation, to improve performance.
+  // sizeof_to_bits(sizeof(dimension_type)) is the maximum k such that
+  // 2^k-1 is a dimension_type, so it is the maximum tree height.
+  // For each node level, the stack may contain up to 4 elements: two elements
+  // with operation 0, one element with operation 2 and one element
+  // with operation 3. An additional element with operation 1 can be at the
+  // top of the tree.
+  static std::pair<dimension_type, signed char>
+    stack[4U * sizeof_to_bits(sizeof(dimension_type)) + 1U];
+
+  dimension_type stack_first_empty = 0;
+
+  // A pair (n, operation) in the stack means:
+  //
+  // * Go to the parent, if operation is 0.
+  // * Go to the left child, then fill the current tree with n elements, if
+  //   operation is 1.
+  // * Go to the right child, then fill the current tree with n elements, if
+  //   operation is 2.
+  // * Fill the current tree with n elements, if operation is 3.
+
+  stack[0].first = n;
+  stack[0].second = 3;
+  ++stack_first_empty;
+
+  while (stack_first_empty != 0) {
+
+    // Implement
+    //
+    // <CODE>
+    //   top_n         = stack.top().first;
+    //   top_operation = stack.top().second;
+    // </CODE>
+    const dimension_type top_n = stack[stack_first_empty - 1].first;
+    const signed char top_operation = stack[stack_first_empty - 1].second;
+
+    switch (top_operation) {
+
+    case 0:
+      root.get_parent();
+      --stack_first_empty;
+      continue;
+
+    case 1:
+      root.get_left_child();
+      break;
+
+    case 2:
+      root.get_right_child();
+      break;
+#ifndef NDEBUG
+    case 3:
+      break;
+
+    default:
+      // We should not be here
+      PPL_UNREACHABLE;
+#endif
+    }
+
+    // We now visit the current tree
+
+    if (top_n == 0) {
+      --stack_first_empty;
+    }
+    else {
+      if (top_n == 1) {
+        PPL_ASSERT(root.index() == unused_index);
+        root.index() = i.index();
+        new (&(*root)) data_type(*i);
+        ++i;
+        --stack_first_empty;
+      }
+      else {
+        PPL_ASSERT(stack_first_empty + 3 < sizeof(stack)/sizeof(stack[0]));
+
+        const dimension_type half = (top_n + 1) / 2;
+        stack[stack_first_empty - 1].second = 0;
+        stack[stack_first_empty    ] = std::make_pair(top_n - half, 2);
+        stack[stack_first_empty + 1] = std::make_pair(1, 3);
+        stack[stack_first_empty + 2].second = 0;
+        stack[stack_first_empty + 3] = std::make_pair(half - 1, 1);
+        stack_first_empty += 4;
+      }
+    }
+  }
+  size_ = n;
+  PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/CO_Tree_defs.hh line 1558. */
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sparse sequence of coefficients.
+/*! \ingroup PPL_CXX_interface
+  This class is implemented using a CO_Tree. See the documentation of CO_Tree
+  for details on the implementation and the performance.
+
+  This class is a drop-in replacement of Dense_Row, meaning that code
+  using Dense_Row can be ported to Sparse_Row changing only the type.
+  The resulting code will work, but probably needs more CPU and memory (it
+  does not exploit the sparse representation yet).
+
+  To take advantage of the sparse representation, the client code must then be
+  modified to use methods which can have a faster implementation on sparse
+  data structures.
+
+  The main changes are the replacement of calls to operator[] with calls to
+  find(), lower_bound() or insert(), using hint iterators when possible.
+  Sequential scanning of rows should probably be implemented using iterators
+  rather than indexes, to improve performance.
+  reset() should be called to zero elements.
+
+  \see Sparse_Matrix
+  \see CO_Tree
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Sparse_Row {
+
+public:
+
+  //! An %iterator on the row elements
+  /*!
+    This %iterator skips non-stored zeroes.
+    \see CO_Tree::iterator
+  */
+  typedef CO_Tree::iterator iterator;
+
+  //! A const %iterator on the row elements
+  /*!
+    This %iterator skips non-stored zeroes.
+    \see CO_Tree::const_iterator
+  */
+  typedef CO_Tree::const_iterator const_iterator;
+
+  //! Constructs a row with the specified size.
+  /*!
+    \param n
+    The size for the new row.
+
+    The row will contain only non-stored zeroes.
+
+    This constructor takes \f$O(1)\f$ time.
+  */
+  explicit Sparse_Row(dimension_type n = 0);
+
+  //! Constructs a row with the specified size.
+  /*!
+    \param n
+    The size for the new row.
+
+    \param capacity
+    It is ignored. This parameter is needed for compatibility with Dense_Row.
+
+    The row will contain only non-stored zeroes.
+
+    This constructor takes \f$O(1)\f$ time.
+  */
+  Sparse_Row(dimension_type n, dimension_type capacity);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to
+    the size of \p y.
+  */
+  Sparse_Row(const Sparse_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Constructor from a Dense_Row.
+  /*!
+    \param row
+    The row that will be copied into *this.
+
+    This constructor takes \f$O(n)\f$ time. Note that constructing of a row of
+    zeroes and then inserting n elements costs \f$O(n*\log^2 n)\f$ time.
+  */
+  explicit Sparse_Row(const Dense_Row& row);
+
+  //! Copy constructor from a Dense_Row with specified size and capacity.
+  /*!
+    It is assumed that \p sz is less than or equal to \p capacity.
+  */
+  Sparse_Row(const Dense_Row& y, dimension_type sz, dimension_type capacity);
+
+  Sparse_Row& operator=(const Dense_Row& row);
+
+  //! Swaps *this and x.
+  /*!
+    \param x
+    The row that will be swapped with *this.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void m_swap(Sparse_Row& x);
+
+  //! Returns the size of the row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type size() const;
+
+  //! Returns the number of elements explicitly stored in the row.
+  /*!
+    This is equivalent to std::distance(begin(), end()), but it's much faster.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type num_stored_elements() const;
+
+  //! Resizes the row to the specified size.
+  /*!
+    \param n
+    The new size for the row.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time when shrinking the
+    row and removing the trailing k elements.
+    It takes \f$O(1)\f$ time when enlarging the row.
+  */
+  void resize(dimension_type n);
+
+  //! Resizes the row to size \p n.
+  /*!
+    \param n
+    The new size for the row.
+
+    This method, with this signature, is needed for compatibility with
+    Dense_Row.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void expand_within_capacity(dimension_type n);
+
+  //! Resizes the row to size \p n.
+  /*!
+    \param n
+    The new size for the row.
+
+    This method, with this signature, is needed for compatibility with
+    Dense_Row.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time where k is the number
+    of removed elements.
+  */
+  void shrink(dimension_type n);
+
+  /*!
+    \brief Deletes the i-th element from the row, shifting the next elements
+           to the left.
+
+    \param i
+    The index of the element that will be deleted.
+
+    The size of the row is decreased by 1.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k+\log^2 n)\f$ amortized time, where k is the
+    number of elements with index greater than i.
+  */
+  void delete_element_and_shift(dimension_type i);
+
+  //! Adds \p n zeroes before index \p i.
+  /*!
+    \param n
+    The number of non-stored zeroes that will be added to the row.
+
+    \param i
+    The index of the element before which the zeroes will be added.
+
+    Existing elements with index greater than or equal to \p i are shifted to
+    the right by \p n positions. The size is increased by \p n.
+
+    Existing iterators are not invalidated, but are shifted to the right
+    by \p n if they pointed at or after index \p i (i.e., they point to
+    the same, possibly shifted, values as before).
+
+    This method takes \f$O(k + \log m)\f$ expected time, where \f$k\f$ is
+    the number of elements with index greater than or equal to \p i and
+    \f$m\f$ the number of stored elements.
+  */
+  void add_zeroes_and_shift(dimension_type n, dimension_type i);
+
+  //! Returns an %iterator that points at the first stored element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator begin();
+
+  //! Returns an %iterator that points after the last stored element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is kept valid.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const iterator& end();
+
+  //! Equivalent to <CODE>cbegin()</CODE>.
+  const_iterator begin() const;
+
+  //! Equivalent to <CODE>cend()</CODE>.
+  const const_iterator& end() const;
+
+  //! Returns an %iterator that points at the first element.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator cbegin() const;
+
+  //! Returns an %iterator that points after the last element.
+  /*!
+    This method always returns a reference to the same internal %iterator,
+    that is updated at each operation that modifies the structure.
+    Client code can keep a const reference to that %iterator instead of
+    keep updating a local %iterator.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const const_iterator& cend() const;
+
+  //! Returns the size() of the largest possible Sparse_Row.
+  static dimension_type max_size();
+
+  //! Resets all the elements of this row.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  void clear();
+
+  //! Gets a reference to the i-th element.
+  /*!
+    \param i
+    The index of the desired element.
+
+    For read-only access it's better to use get(), that avoids allocating
+    space for zeroes.
+
+    If possible, use the insert(), find() or lower_bound() methods with
+    a hint instead of this, to improve performance.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log n)\f$ amortized time when there is already an
+    element with index \p i, and \f$O(\log^2 n)\f$ otherwise.
+  */
+  Coefficient& operator[](dimension_type i);
+
+  //! Equivalent to <CODE>get(i)</CODE>, provided for convenience.
+  /*!
+    This method takes \f$O(\log n)\f$ time.
+  */
+  Coefficient_traits::const_reference operator[](dimension_type i) const;
+
+  //! Gets the i-th element in the sequence.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use the insert(), find() or lower_bound() methods with
+    a hint instead of this, to improve performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  iterator find(dimension_type i);
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  iterator find(iterator itr, dimension_type i);
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  const_iterator find(dimension_type i) const;
+
+  //! Looks for an element with index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  const_iterator find(const_iterator itr, dimension_type i) const;
+
+  //! Lower bound of index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  iterator lower_bound(dimension_type i);
+
+  //! Lower bound of index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  iterator lower_bound(iterator itr, dimension_type i);
+
+  //! Lower bound of index i.
+  /*!
+
+    \param i
+    The index of the desired element.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    If possible, use the find() method that takes a hint %iterator, to improve
+    performance.
+
+    This method takes \f$O(\log n)\f$ time.
+  */
+  const_iterator lower_bound(dimension_type i) const;
+
+  //! Lower bound of index i.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr.
+
+    \returns an %iterator to the first element with index greater than or
+             equal to i.
+             If there are no such elements, returns end().
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This method takes \f$O(\log n)\f$ time.
+    If the distance between \p itr and the searched position is \f$O(1)\f$,
+    this method takes \f$O(1)\f$ time.
+  */
+  const_iterator lower_bound(const_iterator itr, dimension_type i) const;
+
+  //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param x
+    The value that will be associated to the element.
+
+    If possible, use versions of this method that take a hint, to improve
+    performance.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator insert(dimension_type i, Coefficient_traits::const_reference x);
+
+  //! Equivalent to <CODE>(*this)[i] = x; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param x
+    The value that will be associated to the element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr, even faster than <CODE>(*this)[i] = x</CODE>.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+    between \p itr and the searched position is \f$O(1)\f$ and the row already
+    contains an element with this index, this method takes \f$O(1)\f$ time.
+  */
+  iterator insert(iterator itr, dimension_type i,
+                  Coefficient_traits::const_reference x);
+
+  //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    If possible, use versions of this method that take a hint, to improve
+    performance.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator insert(dimension_type i);
+
+  //! Equivalent to <CODE>(*this)[i]; find(i)</CODE>, but faster.
+  /*!
+    \param i
+    The index of the desired element.
+
+    \param itr
+    It is used as a hint. This method will be faster if the searched element
+    is near to \p itr, even faster than <CODE>(*this)[i]</CODE>.
+
+    The value of \p itr does not affect the result of this method, as long it
+    is a valid %iterator for this row. \p itr may even be end().
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time. If the distance
+    between \p itr and the searched position is \f$O(1)\f$ and the row already
+    contains an element with this index, this method takes \f$O(1)\f$ time.
+  */
+  iterator insert(iterator itr, dimension_type i);
+
+  //! Swaps the i-th element with the j-th element.
+  /*!
+    \param i
+    The index of an element.
+
+    \param j
+    The index of another element.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  void swap_coefficients(dimension_type i, dimension_type j);
+
+  //! Equivalent to swap(i,itr.index()), but it assumes that
+  //! lower_bound(i)==itr.
+  /*!
+    Iterators that pointed to the itr.index()-th element remain valid
+    but now point to the i-th element. Other iterators are unaffected.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void fast_swap(dimension_type i, iterator itr);
+
+  //! Swaps the element pointed to by i with the element pointed to by j.
+  /*!
+    \param i
+    An %iterator pointing to an element.
+
+    \param j
+    An %iterator pointing to another element.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void swap_coefficients(iterator i, iterator j);
+
+  //! Resets to zero the value pointed to by i.
+  /*!
+    \param i
+    An %iterator pointing to the element that will be reset (not stored
+    anymore).
+
+    By calling this method instead of getting a reference to the value and
+    setting it to zero, the element will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  iterator reset(iterator i);
+
+  //! Resets to zero the values in the range [first,last).
+  /*!
+    \param first
+    An %iterator pointing to the first element to reset.
+
+    \param last
+    An %iterator pointing after the last element to reset.
+
+    By calling this method instead of getting a reference to the values and
+    setting them to zero, the elements will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+    number of elements in [first,last).
+  */
+  iterator reset(iterator first, iterator last);
+
+  //! Resets to zero the i-th element.
+  /*!
+    \param i
+    The index of the element to reset.
+
+    By calling this method instead of getting a reference to the value and
+    setting it to zero, the element will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\log^2 n)\f$ amortized time.
+  */
+  void reset(dimension_type i);
+
+  //! Resets to zero the elements with index greater than or equal to i.
+  /*!
+    \param i
+    The index of the first element to reset.
+
+    By calling this method instead of getting a reference to the values and
+    setting them to zero, the elements will no longer be stored.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(k*\log^2 n)\f$ amortized time, where k is the
+    number of elements with index greater than or equal to i.
+  */
+  void reset_after(dimension_type i);
+
+  //! Normalizes the modulo of coefficients so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the elements of the row
+    and normalizes them by the GCD itself.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  void normalize();
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when c1 is zero.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_second
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_first(const Sparse_Row& y,
+                           const Func1& f, const Func2& g);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, 0) must do nothing, for every c1.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine
+  */
+  template <typename Func1, typename Func2>
+  void combine_needs_second(const Sparse_Row& y,
+                            const Func1& g, const Func2& h);
+
+  //! Calls g(x[i],y[i]), for each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param f
+    A functor that should take a Coefficient&.
+    f(c1) must be equivalent to g(c1, 0).
+
+    \param g
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    g(c1, c2) must do nothing when both c1 and c2 are zero.
+
+    \param h
+    A functor that should take a Coefficient& and a
+    Coefficient_traits::const_reference.
+    h(c1, c2) must be equivalent to g(c1, c2) when c1 is zero.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary, assuming the requested
+    properties hold.
+
+    \see combine_needs_first
+    \see combine_needs_second
+  */
+  template <typename Func1, typename Func2, typename Func3>
+  void combine(const Sparse_Row& y,
+               const Func1& f, const Func2& g, const Func3& h);
+
+  //! Executes <CODE>(*this)[i] = (*this)[i]*coeff1 + y[i]*coeff2</CODE>, for
+  //! each i.
+  /*!
+    \param y
+    The row that will be combined with *this.
+
+    \param coeff1
+    The coefficient used for elements of *this.
+    This must not be 0.
+
+    \param coeff2
+    The coefficient used for elements of y.
+    This must not be 0.
+
+    This method takes \f$O(n*\log^2 n)\f$ time.
+
+    \note
+    The functors will only be called when necessary.
+    This method can be implemented in user code, too. It is provided for
+    convenience only.
+
+    \see combine_needs_first
+    \see combine_needs_second
+    \see combine
+  */
+  void linear_combine(const Sparse_Row& y,
+                      Coefficient_traits::const_reference coeff1,
+                      Coefficient_traits::const_reference coeff2);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  /*!
+    This method, unlike the other linear_combine() method, detects when
+    coeff1==1 and/or coeff2==1 or coeff2==-1 in order to save some work.
+  */
+  void linear_combine(const Sparse_Row& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! Loads the row from an ASCII representation generated using ascii_dump().
+  /*!
+    \param s
+    The stream from which the ASCII representation will be loaded.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method is provided for compatibility with Dense_Row.
+
+    This method takes \f$O(n)\f$ time.
+
+    \param capacity
+    This parameter is ignored.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method takes \f$O(n)\f$ time.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method is provided for compatibility with Dense_Row.
+
+    This method takes \f$O(n)\f$ time.
+
+    \param capacity
+    This parameter is ignored.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks the invariant.
+  bool OK() const;
+
+  //! Checks the invariant.
+  /*!
+    This method is provided for compatibility with Dense_Row.
+
+    \param capacity
+    This parameter is ignored.
+  */
+  bool OK(dimension_type capacity) const;
+
+private:
+  //! The tree used to store the elements.
+  CO_Tree tree;
+
+  //! The size of the row.
+  /*!
+    The elements contained in this row have indexes that are less than size_.
+  */
+  dimension_type size_;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+          Parma_Polyhedra_Library::Sparse_Row& y);
+
+void swap(Parma_Polyhedra_Library::Sparse_Row& x,
+          Parma_Polyhedra_Library::Dense_Row& y);
+
+void swap(Parma_Polyhedra_Library::Dense_Row& x,
+          Parma_Polyhedra_Library::Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Sparse_Row& x, const Sparse_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Sparse_Row& x, const Sparse_Row& y);
+
+bool operator==(const Dense_Row& x, const Sparse_Row& y);
+bool operator!=(const Dense_Row& x, const Sparse_Row& y);
+
+bool operator==(const Sparse_Row& x, const Dense_Row& y);
+bool operator!=(const Sparse_Row& x, const Dense_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+  This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+  order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Dense_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+  This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+  order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Dense_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference coeff1,
+                    Coefficient_traits::const_reference coeff2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Equivalent to <CODE>x[i] = x[i] * c1 + y[i] * c2</CODE>,
+//! for each i in [start, end).
+/*! \relates Sparse_Row
+  This function detects when coeff1==1 and/or coeff2==1 or coeff2==-1 in
+  order to save some work.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void linear_combine(Sparse_Row& x, const Sparse_Row& y,
+                    Coefficient_traits::const_reference c1,
+                    Coefficient_traits::const_reference c2,
+                    dimension_type start, dimension_type end);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_inlines.hh line 1. */
+/* Sparse_Row class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n)
+  : size_(n) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(dimension_type n, dimension_type)
+  : size_(n) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type)
+  : tree(y.tree), size_(y.size_) {
+}
+
+inline
+Sparse_Row::Sparse_Row(const Sparse_Row& y, dimension_type sz, dimension_type)
+  : tree(y.begin(),
+         std::distance(y.begin(), y.lower_bound(std::min(y.size(), sz)))),
+    size_(sz) {
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::m_swap(Sparse_Row& x) {
+  using std::swap;
+  swap(tree, x.tree);
+  swap(size_, x.size_);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(x.OK());
+}
+
+inline dimension_type
+Sparse_Row::size() const {
+  return size_;
+}
+
+inline dimension_type
+Sparse_Row::num_stored_elements() const {
+  return tree.size();
+}
+
+inline void
+Sparse_Row::resize(dimension_type n) {
+  if (n < size_)
+    reset_after(n);
+  size_ = n;
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::shrink(dimension_type n) {
+  PPL_ASSERT(size() >= n);
+  resize(n);
+}
+
+inline void
+Sparse_Row::expand_within_capacity(dimension_type n) {
+  PPL_ASSERT(size() <= n);
+  resize(n);
+}
+
+inline void
+Sparse_Row::delete_element_and_shift(dimension_type i) {
+  PPL_ASSERT(i < size_);
+  tree.erase_element_and_shift_left(i);
+  --size_;
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::add_zeroes_and_shift(dimension_type n, dimension_type i) {
+  PPL_ASSERT(i <= size_);
+  tree.increase_keys_from(i, n);
+  size_ += n;
+  PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::begin() {
+  return tree.begin();
+}
+
+inline const Sparse_Row::iterator&
+Sparse_Row::end() {
+  return tree.end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::begin() const {
+  return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::end() const {
+  return tree.cend();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::cbegin() const {
+  return tree.cbegin();
+}
+
+inline const Sparse_Row::const_iterator&
+Sparse_Row::cend() const {
+  return tree.cend();
+}
+
+inline dimension_type
+Sparse_Row::max_size() {
+  return CO_Tree::max_size();
+}
+
+inline void
+Sparse_Row::clear() {
+  tree.clear();
+}
+
+inline Coefficient&
+Sparse_Row::operator[](dimension_type i) {
+  PPL_ASSERT(i < size_);
+  iterator itr = insert(i);
+  return *itr;
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::operator[](dimension_type i) const {
+  return get(i);
+}
+
+inline Coefficient_traits::const_reference
+Sparse_Row::get(dimension_type i) const {
+  PPL_ASSERT(i < size_);
+  if (tree.empty())
+    return Coefficient_zero();
+  const_iterator itr = find(i);
+  if (itr != end())
+    return *itr;
+  else
+    return Coefficient_zero();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(dimension_type i) {
+  PPL_ASSERT(i < size());
+
+  iterator itr = tree.bisect(i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::find(iterator hint, dimension_type i) {
+  PPL_ASSERT(i < size());
+
+  iterator itr = tree.bisect_near(hint, i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(dimension_type i) const {
+  PPL_ASSERT(i < size());
+
+  const_iterator itr = tree.bisect(i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::find(const_iterator hint, dimension_type i) const {
+  PPL_ASSERT(i < size());
+
+  const_iterator itr = tree.bisect_near(hint, i);
+
+  if (itr != end() && itr.index() == i)
+    return itr;
+
+  return end();
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(dimension_type i) {
+  PPL_ASSERT(i <= size());
+
+  iterator itr = tree.bisect(i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::lower_bound(iterator hint, dimension_type i) {
+  PPL_ASSERT(i <= size());
+
+  iterator itr = tree.bisect_near(hint, i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(dimension_type i) const {
+  PPL_ASSERT(i <= size());
+
+  const_iterator itr = tree.bisect(i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::const_iterator
+Sparse_Row::lower_bound(const_iterator hint, dimension_type i) const {
+  PPL_ASSERT(i <= size());
+
+  const_iterator itr = tree.bisect_near(hint, i);
+
+  if (itr == end())
+    return end();
+
+  if (itr.index() < i)
+    ++itr;
+
+  PPL_ASSERT(itr == end() || itr.index() >= i);
+
+  return itr;
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i, Coefficient_traits::const_reference x) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i,
+                   Coefficient_traits::const_reference x) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(itr, i, x);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(dimension_type i) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(i);
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::insert(iterator itr, dimension_type i) {
+  PPL_ASSERT(i < size_);
+  return tree.insert(itr, i);
+}
+
+inline void
+Sparse_Row::swap_coefficients(iterator i, iterator j) {
+  PPL_ASSERT(i != end());
+  PPL_ASSERT(j != end());
+  using std::swap;
+  swap(*i, *j);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Sparse_Row::fast_swap(dimension_type i, iterator itr) {
+  PPL_ASSERT(lower_bound(i) == itr);
+  PPL_ASSERT(itr != end());
+  tree.fast_shift(i, itr);
+  PPL_ASSERT(OK());
+}
+
+inline Sparse_Row::iterator
+Sparse_Row::reset(iterator i) {
+  iterator res = tree.erase(i);
+  PPL_ASSERT(OK());
+  return res;
+}
+
+inline void
+Sparse_Row::reset(dimension_type i) {
+  PPL_ASSERT(i < size());
+
+  tree.erase(i);
+  PPL_ASSERT(OK());
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes() const {
+  return tree.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::external_memory_in_bytes(dimension_type /* capacity */) const {
+  return external_memory_in_bytes();
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline memory_size_type
+Sparse_Row::total_memory_in_bytes(dimension_type /* capacity */) const {
+  return total_memory_in_bytes();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Sparse_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline void
+swap(Sparse_Row& x, Sparse_Row& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_templates.hh line 1. */
+/* Sparse_Row class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_first(const Sparse_Row& y,
+                                const Func1& f, const Func2& g) {
+  if (this == &y) {
+    for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+      g(*i, *i);
+  }
+  else {
+    iterator i = begin();
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset().
+    const iterator& i_end = end();
+    const_iterator j = y.begin();
+    const_iterator j_end = y.end();
+    while (i != i_end && j != j_end)
+      if (i.index() == j.index()) {
+        g(*i, *j);
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          f(*i);
+          if (*i == 0)
+            i = reset(i);
+          else
+            ++i;
+        }
+        else
+          j = y.lower_bound(j, i.index());
+    while (i != i_end) {
+      f(*i);
+      if (*i == 0)
+        i = reset(i);
+      else
+        ++i;
+    }
+  }
+}
+
+template <typename Func1, typename Func2>
+void
+Sparse_Row::combine_needs_second(const Sparse_Row& y,
+                                 const Func1& g,
+                                 const Func2& /* h */) {
+  iterator i = begin();
+  for (const_iterator j = y.begin(), j_end = y.end(); j != j_end; ++j) {
+    i = insert(i, j.index());
+    g(*i, *j);
+    if (*i == 0)
+      i = reset(i);
+  }
+}
+
+template <typename Func1, typename Func2, typename Func3>
+void
+Sparse_Row::combine(const Sparse_Row& y, const Func1& f,
+                    const Func2& g, const Func3& h) {
+  if (this == &y) {
+    for (iterator i = begin(), i_end = end(); i != i_end; ++i)
+      g(*i, *i);
+  }
+  else {
+    iterator i = begin();
+    // This is a const reference to an internal iterator, that is kept valid.
+    // If we just stored a copy, that would be invalidated by the calls to
+    // reset() and insert().
+    const iterator& i_end = end();
+    const_iterator j = y.begin();
+    const_iterator j_end = y.end();
+    while (i != i_end && j != j_end) {
+      if (i.index() == j.index()) {
+        g(*i, *j);
+        if (*i == 0)
+          i = reset(i);
+        else
+          ++i;
+        ++j;
+      }
+      else
+        if (i.index() < j.index()) {
+          f(*i);
+          if (*i == 0)
+            i = reset(i);
+          else
+            ++i;
+        }
+        else {
+          PPL_ASSERT(i.index() > j.index());
+          i = insert(i, j.index());
+          h(*i, *j);
+          if (*i == 0)
+            i = reset(i);
+          else
+            ++i;
+          ++j;
+        }
+    }
+    PPL_ASSERT(i == i_end || j == j_end);
+    while (i != i_end) {
+      f(*i);
+      if (*i == 0)
+        i = reset(i);
+      else
+        ++i;
+    }
+    while (j != j_end) {
+      i = insert(i, j.index());
+      h(*i, *j);
+      if (*i == 0)
+        i = reset(i);
+      ++j;
+    }
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sparse_Row_defs.hh line 929. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 33. */
+#include <cstddef>
+/* Automatically generated from PPL source file ../src/Linear_Expression_Interface_defs.hh line 1. */
+/* Linear_Expression_Interface class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Interface_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression_Interface;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Interface_defs.hh line 33. */
+#include <vector>
+#include <set>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of a class implementing Linear_Expression_Interface
+  represents a linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Linear_Expression_Interface {
+public:
+  virtual ~Linear_Expression_Interface();
+
+  virtual bool OK() const = 0;
+
+  //! Returns the current representation of this linear expression.
+  virtual Representation representation() const = 0;
+
+  //! An interface for const iterators on the expression (homogeneous)
+  //! coefficients that are nonzero.
+  /*!
+    These iterators are invalidated by operations that modify the expression.
+  */
+  class const_iterator_interface {
+  public:
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef const Coefficient value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef Coefficient_traits::const_reference reference;
+
+    //! Returns a copy of *this.
+    //! This returns a pointer to dynamic-allocated memory. The caller has the
+    //! duty to free the memory when it's not needed anymore.
+    virtual const_iterator_interface* clone() const = 0;
+
+    virtual ~const_iterator_interface();
+
+    //! Navigates to the next nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator++() = 0;
+
+    //! Navigates to the previous nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator--() = 0;
+
+    //! Returns the current element.
+    virtual reference operator*() const = 0;
+
+    //! Returns the variable of the coefficient pointed to by \c *this.
+    /*!
+      \returns the variable of the coefficient pointed to by \c *this.
+    */
+    virtual Variable variable() const = 0;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    virtual bool operator==(const const_iterator_interface& x) const = 0;
+  };
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* begin() const = 0;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* end() const = 0;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  //! Returns (a pointer to) an iterator that points to the first nonzero
+  //! coefficient of a variable greater than or equal to v, or at end if no
+  //! such coefficient exists.
+  virtual const_iterator_interface* lower_bound(Variable v) const = 0;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  virtual dimension_type space_dimension() const = 0;
+
+  //! Sets the dimension of the vector space enclosing \p *this to \p n .
+  virtual void set_space_dimension(dimension_type n) = 0;
+
+  //! Returns the coefficient of \p v in \p *this.
+  virtual Coefficient_traits::const_reference
+  coefficient(Variable v) const = 0;
+
+  //! Sets the coefficient of \p v in \p *this to \p n.
+  virtual void
+  set_coefficient(Variable v, Coefficient_traits::const_reference n) = 0;
+
+  //! Returns the inhomogeneous term of \p *this.
+  virtual Coefficient_traits::const_reference inhomogeneous_term() const = 0;
+
+  //! Sets the inhomogeneous term of \p *this to \p n.
+  virtual void
+  set_inhomogeneous_term(Coefficient_traits::const_reference n) = 0;
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void
+  linear_combine(const Linear_Expression_Interface& y, Variable v) = 0;
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! \p *this and \p y have the same space dimension.
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2) = 0;
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2) = 0;
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  virtual void swap_space_dimensions(Variable v1, Variable v2) = 0;
+
+  //! Removes all the specified dimensions from the expression.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  virtual void remove_space_dimensions(const Variables_Set& vars) = 0;
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  virtual void shift_space_dimensions(Variable v, dimension_type n) = 0;
+
+  //! Permutes the space dimensions of the expression.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  virtual void
+  permute_space_dimensions(const std::vector<Variable>& cycle) = 0;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+  virtual bool is_zero() const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  virtual bool all_homogeneous_terms_are_zero() const = 0;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  virtual memory_size_type total_memory_in_bytes() const = 0;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const = 0;
+
+  //! Writes to \p s an ASCII representation of \p *this.
+  virtual void ascii_dump(std::ostream& s) const = 0;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  virtual bool ascii_load(std::istream& s) = 0;
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  virtual bool is_equal_to(const Linear_Expression_Interface& x) const = 0;
+
+  //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+  //! so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the coefficients
+    and the inhomogeneous term and normalizes them by the GCD itself.
+  */
+  virtual void normalize() = 0;
+
+  //! Ensures that the first nonzero homogeneous coefficient is positive,
+  //! by negating the row if necessary.
+  virtual void sign_normalize() = 0;
+
+  /*! \brief
+    Negates the elements from index \p first (included)
+    to index \p last (excluded).
+  */
+  virtual void negate(dimension_type first, dimension_type last) = 0;
+
+  virtual Linear_Expression_Interface&
+  operator+=(Coefficient_traits::const_reference n) = 0;
+  virtual Linear_Expression_Interface&
+  operator-=(Coefficient_traits::const_reference n) = 0;
+
+  //! The basic comparison function.
+  /*! \relates Linear_Expression_Interface
+
+    \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+            is greater. The absolute value of the result is 1 if the difference
+            is only in the inhomogeneous terms, 2 otherwise
+
+    The order is a lexicographic. It starts comparing the variables'
+    coefficient, starting from Variable(0), and at the end it compares
+    the inhomogeneous terms.
+  */
+  virtual int compare(const Linear_Expression_Interface& y) const = 0;
+
+  virtual Linear_Expression_Interface&
+  operator+=(const Linear_Expression_Interface& e2) = 0;
+  virtual Linear_Expression_Interface&
+  operator+=(const Variable v) = 0;
+  virtual Linear_Expression_Interface&
+  operator-=(const Linear_Expression_Interface& e2) = 0;
+  virtual Linear_Expression_Interface&
+  operator-=(const Variable v) = 0;
+  virtual Linear_Expression_Interface&
+  operator*=(Coefficient_traits::const_reference n) = 0;
+  virtual Linear_Expression_Interface&
+  operator/=(Coefficient_traits::const_reference n) = 0;
+
+  virtual void negate() = 0;
+
+  virtual Linear_Expression_Interface&
+  add_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+  virtual Linear_Expression_Interface&
+  sub_mul_assign(Coefficient_traits::const_reference n, const Variable v) = 0;
+
+  virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2) = 0;
+
+  virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2) = 0;
+
+  virtual void print(std::ostream& s) const = 0;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars[i] is \f$0\f$.
+  */
+  virtual bool all_zeroes(const Variables_Set& vars) const = 0;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+                                      Variable first, Variable last) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the i-th coefficient.
+  virtual Coefficient_traits::const_reference get(dimension_type i) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the i-th coefficient to n.
+  virtual void set(dimension_type i, Coefficient_traits::const_reference n) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+    [start, end).
+  */
+  virtual bool all_zeroes(dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  virtual dimension_type
+  num_zeroes(dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are 0 returns 0.
+  */
+  virtual Coefficient gcd(dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  virtual void exact_div_assign(Coefficient_traits::const_reference c,
+                                dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+  virtual void mul_assign(Coefficient_traits::const_reference n,
+                          dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void
+  linear_combine(const Linear_Expression_Interface& y, dimension_type i) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2,
+                              dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2,
+                                  dimension_type start, dimension_type end) = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element, or 0 if there are no
+  //! nonzero elements.
+  virtual dimension_type last_nonzero() const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  virtual dimension_type
+  last_nonzero(dimension_type first, dimension_type last) const = 0;
+
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  virtual dimension_type
+  first_nonzero(dimension_type first, dimension_type last) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+    \f$0\f$, disregarding coefficients of variables in \p vars.
+  */
+  virtual bool
+  all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  virtual void
+  scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Interface& y,
+                        dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Computes the sign of the sum of (*this)[i]*y[i],
+  //! for each i in [start,end).
+  virtual int
+  scalar_product_sign(const Linear_Expression_Interface& y,
+                      dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Removes from the set x all the indexes of nonzero elements of *this.
+  virtual void
+  has_a_free_dimension_helper(std::set<dimension_type>& x) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           Coefficient_traits::const_reference c1,
+                           Coefficient_traits::const_reference c2,
+                           dimension_type start, dimension_type end) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Dense_Row& row) const = 0;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Sparse_Row& row) const = 0;
+};
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 35. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression_Impl represents the linear
+  expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression_Impl e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression_Impl e1 = 4*x;
+  Linear_Expression_Impl e2 = 2*y;
+  Linear_Expression_Impl e3 = z;
+  Linear_Expression_Impl e = Linear_Expression_Impl(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_Expression_Impl
+  : public Linear_Expression_Interface {
+public:
+  //! Default constructor: returns a copy of Linear_Expression_Impl::zero().
+  Linear_Expression_Impl();
+
+  //! Ordinary copy constructor.
+  Linear_Expression_Impl(const Linear_Expression_Impl& e);
+
+  //! Copy constructor for other row types.
+  template <typename Row2>
+  Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e);
+
+  //! Copy constructor from any implementation of Linear_Expression_Interface.
+  Linear_Expression_Impl(const Linear_Expression_Interface& e);
+
+  //! Destructor.
+  virtual ~Linear_Expression_Impl();
+
+  //! Checks if all the invariants are satisfied.
+  virtual bool OK() const;
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression_Impl(Coefficient_traits::const_reference n);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression_Impl::max_space_dimension()</CODE>.
+  */
+  Linear_Expression_Impl(Variable v);
+
+  //! Returns the current representation of this linear expression.
+  virtual Representation representation() const;
+
+  //! An interface for const iterators on the expression (homogeneous)
+  //! coefficients that are nonzero.
+  /*!
+    These iterators are invalidated by operations that modify the expression.
+  */
+  class const_iterator: public const_iterator_interface {
+  public:
+    explicit const_iterator(const Row& row, dimension_type i);
+
+    //! Returns a copy of *this.
+    //! This returns a pointer to dynamic-allocated memory. The caller has the
+    //! duty to free the memory when it's not needed anymore.
+    virtual const_iterator_interface* clone() const;
+
+    //! Navigates to the next nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator++();
+
+    //! Navigates to the previous nonzero coefficient.
+    //! Note that this method does *not* return a reference, to increase
+    //! efficiency since it's virtual.
+    virtual void operator--();
+
+    //! Returns the current element.
+    virtual reference operator*() const;
+
+    //! Returns the variable of the coefficient pointed to by \c *this.
+    /*!
+      \returns the variable of the coefficient pointed to by \c *this.
+    */
+    virtual Variable variable() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    virtual bool operator==(const const_iterator_interface& x) const;
+
+  private:
+
+    void skip_zeroes_forward();
+    void skip_zeroes_backward();
+
+    const Row* row;
+    typename Row::const_iterator itr;
+  };
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* begin() const;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  virtual const_iterator_interface* end() const;
+
+  //! This returns a pointer to dynamic-allocated memory. The caller has the
+  //! duty to free the memory when it's not needed anymore.
+  //! Returns (a pointer to) an iterator that points to the first nonzero
+  //! coefficient of a variable greater than or equal to v, or at end if no
+  //! such coefficient exists.
+  virtual const_iterator_interface* lower_bound(Variable v) const;
+
+  //! Returns the maximum space dimension a Linear_Expression_Impl can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  virtual dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to \p n .
+  virtual void set_space_dimension(dimension_type n);
+
+  //! Returns the coefficient of \p v in \p *this.
+  virtual Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Sets the coefficient of \p v in \p *this to \p n.
+  virtual void set_coefficient(Variable v,
+                               Coefficient_traits::const_reference n);
+
+  //! Returns the inhomogeneous term of \p *this.
+  virtual Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Sets the inhomogeneous term of \p *this to \p n.
+  virtual void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void linear_combine(const Linear_Expression_Interface& y, Variable v);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! \p *this and \p y have the same space dimension.
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  virtual void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the expression.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  virtual void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  virtual void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the expression.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  virtual void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+  virtual bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  virtual bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  virtual memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const;
+
+  //! Writes to \p s an ASCII representation of \p *this.
+  virtual void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  virtual bool ascii_load(std::istream& s);
+
+  //! Copy constructor with a specified space dimension.
+  Linear_Expression_Impl(const Linear_Expression_Interface& e,
+                         dimension_type space_dim);
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  virtual bool is_equal_to(const Linear_Expression_Interface& x) const;
+
+  //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+  //! so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the coefficients
+    and the inhomogeneous term and normalizes them by the GCD itself.
+  */
+  virtual void normalize();
+
+  //! Ensures that the first nonzero homogeneous coefficient is positive,
+  //! by negating the row if necessary.
+  virtual void sign_normalize();
+
+  /*! \brief
+    Negates the elements from index \p first (included)
+    to index \p last (excluded).
+  */
+  virtual void negate(dimension_type first, dimension_type last);
+
+  virtual Linear_Expression_Impl&
+  operator+=(Coefficient_traits::const_reference n);
+  virtual Linear_Expression_Impl&
+  operator-=(Coefficient_traits::const_reference n);
+
+  //! The basic comparison function.
+  /*! \relates Linear_Expression_Impl
+
+    \returns
+    -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+    is greater. The absolute value of the result is 1 if the difference
+    is only in the inhomogeneous terms, 2 otherwise.
+
+    The order is a lexicographic. It starts comparing the variables'
+    coefficient, starting from Variable(0), and at the end it compares
+    the inhomogeneous terms.
+  */
+  virtual int compare(const Linear_Expression_Interface& y) const;
+
+  virtual Linear_Expression_Impl&
+  operator+=(const Linear_Expression_Interface& e2);
+  virtual Linear_Expression_Impl& operator+=(const Variable v);
+  virtual Linear_Expression_Impl&
+  operator-=(const Linear_Expression_Interface& e2);
+  virtual Linear_Expression_Impl& operator-=(const Variable v);
+  virtual Linear_Expression_Impl&
+  operator*=(Coefficient_traits::const_reference n);
+  virtual Linear_Expression_Impl&
+  operator/=(Coefficient_traits::const_reference n);
+
+  virtual void negate();
+
+  virtual Linear_Expression_Impl&
+  add_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+  virtual Linear_Expression_Impl&
+  sub_mul_assign(Coefficient_traits::const_reference n, const Variable v);
+
+  virtual void add_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2);
+
+  virtual void sub_mul_assign(Coefficient_traits::const_reference factor,
+                              const Linear_Expression_Interface& e2);
+
+  virtual void print(std::ostream& s) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars[i] is \f$0\f$.
+  */
+  virtual bool all_zeroes(const Variables_Set& vars) const;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  virtual bool have_a_common_variable(const Linear_Expression_Interface& x,
+                                      Variable first, Variable last) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the i-th coefficient.
+  virtual Coefficient_traits::const_reference get(dimension_type i) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the i-th coefficient to n.
+  virtual void set(dimension_type i, Coefficient_traits::const_reference n);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+    [start, end).
+  */
+  virtual bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  virtual dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are 0 returns 0.
+  */
+  virtual Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  virtual void exact_div_assign(Coefficient_traits::const_reference c,
+                                dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+  virtual void mul_assign(Coefficient_traits::const_reference n,
+                          dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  virtual void
+  linear_combine(const Linear_Expression_Interface& y, dimension_type i);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  virtual void linear_combine(const Linear_Expression_Interface& y,
+                              Coefficient_traits::const_reference c1,
+                              Coefficient_traits::const_reference c2,
+                              dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  virtual void linear_combine_lax(const Linear_Expression_Interface& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2,
+                                  dimension_type start, dimension_type end);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element, or 0 if there are no
+  //! nonzero elements.
+  virtual dimension_type last_nonzero() const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  /*! \brief
+    Returns <CODE>true</CODE> if each coefficient in [start,end) is *not* in
+    \f$0\f$, disregarding coefficients of variables in \p vars.
+  */
+  virtual bool
+  all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  virtual void
+  scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Interface& y,
+                        dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Computes the sign of the sum of (*this)[i]*y[i], for each i in [start,end).
+  virtual int
+  scalar_product_sign(const Linear_Expression_Interface& y,
+                      dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  virtual dimension_type
+  first_nonzero(dimension_type first, dimension_type last) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  virtual dimension_type
+  last_nonzero(dimension_type first, dimension_type last) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Removes from the set x all the indexes of nonzero elements of *this.
+  virtual void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  virtual bool is_equal_to(const Linear_Expression_Interface& x,
+                           Coefficient_traits::const_reference c1,
+                           Coefficient_traits::const_reference c2,
+                           dimension_type start, dimension_type end) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Dense_Row& row) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets `row' to a copy of the row that implements *this.
+  virtual void get_row(Sparse_Row& row) const;
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with the constructor
+    Linear_Expression_Impl(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression_Impl(dimension_type space_dim, bool);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y, Variable v);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! \p *this and \p y have the same space dimension.
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  template <typename Row2>
+  void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2);
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  template <typename Row2>
+  bool is_equal_to(const Linear_Expression_Impl<Row2>& x) const;
+
+  template <typename Row2>
+  Linear_Expression_Impl& operator+=(const Linear_Expression_Impl<Row2>& e2);
+  template <typename Row2>
+  Linear_Expression_Impl& operator-=(const Linear_Expression_Impl<Row2>& e2);
+
+  template <typename Row2>
+  Linear_Expression_Impl&
+  sub_mul_assign(Coefficient_traits::const_reference n,
+                 const Linear_Expression_Impl<Row2>& y,
+                 dimension_type start, dimension_type end);
+
+  template <typename Row2>
+  void add_mul_assign(Coefficient_traits::const_reference factor,
+                      const Linear_Expression_Impl<Row2>& e2);
+
+  template <typename Row2>
+  void sub_mul_assign(Coefficient_traits::const_reference factor,
+                      const Linear_Expression_Impl<Row2>& e2);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end).
+  template <typename Row2>
+  void linear_combine(const Linear_Expression_Impl<Row2>& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  template <typename Row2>
+  void linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2,
+                          dimension_type start, dimension_type end);
+
+  //! The basic comparison function.
+  /*! \relates Linear_Expression_Impl
+
+    \returns
+    -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+    is greater. The absolute value of the result is 1 if the difference
+    is only in the inhomogeneous terms, 2 otherwise.
+
+    The order is a lexicographic. It starts comparing the variables'
+    coefficient, starting from Variable(0), and at the end it compares
+    the inhomogeneous terms.
+  */
+  template <typename Row2>
+  int compare(const Linear_Expression_Impl<Row2>& y) const;
+
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  template <typename Row2>
+  void
+  scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Impl<Row2>& y,
+                        dimension_type start, dimension_type end) const;
+
+  //! Computes the sign of the sum of (*this)[i]*y[i],
+  //! for each i in [start,end).
+  template <typename Row2>
+  int scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+                          dimension_type start, dimension_type end) const;
+
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  template <typename Row2>
+  bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  template <typename Row2>
+  bool is_equal_to(const Linear_Expression_Impl<Row2>& x,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  template <typename Row2>
+  bool have_a_common_variable(const Linear_Expression_Impl<Row2>& x,
+                              Variable first, Variable last) const;
+
+private:
+
+  void construct(const Linear_Expression_Interface& e);
+  void construct(const Linear_Expression_Interface& e,
+                 dimension_type space_dim);
+
+  template <typename Row2>
+  void construct(const Linear_Expression_Impl<Row2>& e);
+  template <typename Row2>
+  void construct(const Linear_Expression_Impl<Row2>& e,
+                 dimension_type space_dim);
+
+  Row row;
+
+  template <typename Row2>
+  friend class Linear_Expression_Impl;
+
+}; // class Parma_Polyhedra_Library::Linear_Expression_Impl
+
+
+namespace Parma_Polyhedra_Library {
+
+// NOTE: declaring explicit specializations.
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::OK() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::OK() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_homogeneous_terms_are_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::all_zeroes(dimension_type start,
+                                              dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+                                               dimension_type end) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes(const Variables_Set& vars) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes(const Variables_Set& vars) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+Coefficient
+Linear_Expression_Impl<Dense_Row>::gcd(dimension_type start,
+                                       dimension_type end) const;
+template <>
+Coefficient
+Linear_Expression_Impl<Sparse_Row>::gcd(dimension_type start,
+                                        dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+                         Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+                         Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Dense_Row>& y,
+                         Variable first, Variable last) const;
+template <>
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>
+::have_a_common_variable(const Linear_Expression_Impl<Sparse_Row>& y,
+                         Variable first, Variable last) const;
+
+template <>
+bool
+Linear_Expression_Impl<Dense_Row>::is_zero() const;
+template <>
+bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::last_nonzero() const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const;
+
+template <>
+dimension_type
+Linear_Expression_Impl<Dense_Row>::num_zeroes(dimension_type start,
+                                              dimension_type end) const;
+template <>
+dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+                                               dimension_type end) const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>
+::remove_space_dimensions(const Variables_Set& vars);
+
+template <>
+Representation
+Linear_Expression_Impl<Dense_Row>::representation() const;
+template <>
+Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const;
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_backward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_backward();
+
+template <>
+void
+Linear_Expression_Impl<Dense_Row>::const_iterator::skip_zeroes_forward();
+template <>
+void
+Linear_Expression_Impl<Sparse_Row>::const_iterator::skip_zeroes_forward();
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_inlines.hh line 1. */
+/* Linear_Expression_Impl class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/math_utilities_defs.hh line 1. */
+/* Declarations of some math utility functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/math_utilities_defs.hh line 29. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+            Coefficient& numer, Coefficient& denom);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+             Coefficient_traits::const_reference x,
+             Coefficient_traits::const_reference y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+min_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename N>
+void
+max_assign(N& x, const N& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is an even number.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \f$x = -y\f$.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If \f$g\f$ is the GCD of \p x and \p y, the values of \p x and \p y
+  divided by \f$g\f$ are assigned to \p n_x and \p n_y, respectively.
+
+  \note
+  \p x and \p n_x may be the same object and likewise for
+  \p y and \p n_y.  Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+           Coefficient_traits::const_reference y,
+           Coefficient& n_x, Coefficient& n_y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is in canonical form.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool
+is_canonical(const mpq_class& x);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns a mask for the lowest \p n bits,
+#endif
+template <typename T>
+T
+low_bits_mask(unsigned n);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/math_utilities_inlines.hh line 1. */
+/* Implementation of some math utility functions: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/math_utilities_inlines.hh line 28. */
+#include <limits>
+/* Automatically generated from PPL source file ../src/math_utilities_inlines.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+           Coefficient_traits::const_reference y,
+           Coefficient& n_x, Coefficient& n_y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(gcd);
+  gcd_assign(gcd, x, y);
+  exact_div_assign(n_x, x, gcd);
+  exact_div_assign(n_y, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+  PPL_ASSERT(n < unsigned(std::numeric_limits<T>::digits));
+  return ~((~static_cast<T>(0)) << n);
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+numer_denom(const T& from,
+            Coefficient& numer, Coefficient& denom) {
+  PPL_ASSERT(!is_not_a_number(from)
+         && !is_minus_infinity(from)
+         && !is_plus_infinity(from));
+  PPL_DIRTY_TEMP(mpq_class, q);
+  assign_r(q, from, ROUND_NOT_NEEDED);
+  numer = q.get_num();
+  denom = q.get_den();
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, void>::type
+div_round_up(T& to,
+             Coefficient_traits::const_reference x,
+             Coefficient_traits::const_reference y) {
+  PPL_DIRTY_TEMP(mpq_class, q_x);
+  PPL_DIRTY_TEMP(mpq_class, q_y);
+  // Note: this code assumes that a Coefficient is always convertible
+  // to an mpq_class without loss of precision.
+  assign_r(q_x, x, ROUND_NOT_NEEDED);
+  assign_r(q_y, y, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_y, ROUND_NOT_NEEDED);
+  assign_r(to, q_x, ROUND_UP);
+}
+
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+  if (x > y)
+    x = y;
+}
+
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+  if (x < y)
+    x = y;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_even(const T& x) {
+  T mod;
+  return umod_2exp_assign_r(mod, x, 1, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+    && mod == 0;
+}
+
+template <typename T>
+inline typename Enable_If<Is_Native_Or_Checked<T>::value, bool>::type
+is_additive_inverse(const T& x, const T& y) {
+  T negated_x;
+  return neg_assign_r(negated_x, x, ROUND_DIRECT | ROUND_STRICT_RELATION) == V_EQ
+    && negated_x == y;
+}
+
+inline bool
+is_canonical(const mpq_class& x) {
+  if (x.get_den() <= 0)
+    return false;
+  PPL_DIRTY_TEMP(mpq_class, temp);
+  temp = x;
+  temp.canonicalize();
+  return temp.get_num() == x.get_num();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/math_utilities_defs.hh line 109. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::max_space_dimension() {
+  return Row::max_size() - 1;
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::Linear_Expression_Impl()
+  : row(1) {
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(dimension_type space_dim, bool)
+  : row(space_dim + 1) {
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>::~Linear_Expression_Impl() {
+}
+
+template <typename Row>
+inline
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(Coefficient_traits::const_reference n)
+  : row(1) {
+  if (n != 0)
+    row.insert(0, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_Expression_Impl<Row>::space_dimension() const {
+  return row.size() - 1;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::set_space_dimension(dimension_type n) {
+  row.resize(n + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::coefficient(Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    return Coefficient_zero();
+  return row.get(v.id() + 1);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  const dimension_type i = v.space_dimension();
+  if (n == 0)
+    row.reset(i);
+  else
+    row.insert(i, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::inhomogeneous_term() const {
+  return row.get(0);
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+  if (n == 0)
+    row.reset(0);
+  else
+    row.insert(0, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::swap_space_dimensions(Variable v1, Variable v2) {
+  row.swap_coefficients(v1.space_dimension(), v2.space_dimension());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::shift_space_dimensions(Variable v,
+                                                    dimension_type n) {
+  row.add_zeroes_and_shift(n, v.space_dimension());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::external_memory_in_bytes() const {
+  return row.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_Expression_Impl<Row>::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(Coefficient_traits::const_reference n) {
+  typename Row::iterator itr = row.insert(0);
+  (*itr) += n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+template <typename Row>
+inline Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(Coefficient_traits::const_reference n) {
+  typename Row::iterator itr = row.insert(0);
+  (*itr) -= n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+template <typename Row>
+inline void
+Linear_Expression_Impl<Row>::normalize() {
+  row.normalize();
+  PPL_ASSERT(OK());
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::is_zero() const {
+  return row.num_stored_elements() == 0;
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_homogeneous_terms_are_zero() const {
+  return row.lower_bound(1) == row.end();
+}
+
+template <>
+inline bool
+Linear_Expression_Impl<Sparse_Row>::all_zeroes(dimension_type start,
+                                               dimension_type end) const {
+  return row.lower_bound(start) == row.lower_bound(end);
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::num_zeroes(dimension_type start,
+                                               dimension_type end) const {
+  PPL_ASSERT(start <= end);
+  return (end - start)
+    - std::distance(row.lower_bound(start), row.lower_bound(end));
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>::last_nonzero() const {
+  if (row.num_stored_elements() == 0)
+    return 0;
+  Sparse_Row::const_iterator i = row.end();
+  --i;
+  return i.index();
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::first_nonzero(dimension_type first, dimension_type last) const {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  Sparse_Row::const_iterator i = row.lower_bound(first);
+
+  if (i != row.end() && i.index() < last)
+    return i.index();
+  else
+    return last;
+}
+
+template <>
+inline dimension_type
+Linear_Expression_Impl<Sparse_Row>
+::last_nonzero(dimension_type first, dimension_type last) const {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  Sparse_Row::const_iterator itr1 = row.lower_bound(first);
+  Sparse_Row::const_iterator itr2 = row.lower_bound(last);
+
+  if (itr1 == itr2)
+    return last;
+
+  --itr2;
+  return itr2.index();
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Dense_Row>::representation() const {
+  return DENSE;
+}
+
+template <>
+inline Representation
+Linear_Expression_Impl<Sparse_Row>::representation() const {
+  return SPARSE;
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_forward() {
+  // Nothing to do.
+}
+
+template <>
+inline void
+Linear_Expression_Impl<Sparse_Row>::const_iterator
+::skip_zeroes_backward() {
+  // Nothing to do.
+}
+
+namespace IO_Operators {
+
+template <typename Row>
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression_Impl<Row>& e) {
+  e.print(s);
+  return s;
+}
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_templates.hh line 1. */
+/* Linear_Expression_Impl class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_templates.hh line 29. */
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 1. */
+/* Constraint class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Congruence_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+/* Automatically generated from PPL source file ../src/Polyhedron_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Octagonal_Shape;
+
+class Octagonal_Shape_Helper;
+
+}
+
+/* Automatically generated from PPL source file ../src/Grid_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 35. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 1. */
+/* Linear_Expression class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Generator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator;
+
+}
+
+/* Automatically generated from PPL source file ../src/Linear_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Linear_System;
+
+template <typename Row>
+class Linear_System_With_Bit_Matrix_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+class Constraint_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the PIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum PIP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_PIP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_PIP_PROBLEM
+};
+
+class PIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Scalar_Products;
+class Topology_Adjusted_Scalar_Product_Sign;
+class Topology_Adjusted_Scalar_Product_Assign;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the MIP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum MIP_Problem_Status {
+  //! The problem is unfeasible.
+  UNFEASIBLE_MIP_PROBLEM,
+  //! The problem is unbounded.
+  UNBOUNDED_MIP_PROBLEM,
+  //! The problem has an optimal solution.
+  OPTIMIZED_MIP_PROBLEM
+};
+
+class MIP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+class BD_Shape_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 47. */
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_defs.hh line 1. */
+/* Expression_Adapter class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Expression_Adapter_Base;
+
+template <typename T>
+class Expression_Adapter;
+
+template <typename T>
+class Expression_Adapter_Transparent;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Adapters' base type (for template meta-programming).
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Expression_Adapter_Base {
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression objects.
+/*!
+  The adapters are meant to provide read-only, customized access to the
+  Linear_Expression members in Constraint, Generator, Congruence and
+  Grid_Generator objects. They typically implement the user-level view
+  of these expressions.
+
+  \note
+  A few methods implement low-level access routines and will take
+  bare indexes as arguments (rather than Variable objects):
+  when such a bare index \c i is zero, the inhomogeneous term is meant;
+  when the bare index \c i is greater than zero, the coefficient of the
+  variable having id <CODE>i - 1</CODE> is meant.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter
+  : public Expression_Adapter_Base {
+public:
+  //! The type of this object.
+  typedef Expression_Adapter<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename T::const_reference inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename T::raw_type raw_type;
+
+  //! Returns an adapter after one-level unwrapping.
+  inner_type inner() const;
+
+  //! The type of const iterators on coefficients.
+  typedef typename raw_type::const_iterator const_iterator;
+
+  //! Returns the current representation of \p *this.
+  Representation representation() const;
+
+  //! Iterator pointing to the first nonzero variable coefficient.
+  const_iterator begin() const;
+
+  //! Iterator pointing after the last nonzero variable coefficient.
+  const_iterator end() const;
+
+  //! Iterator pointing to the first nonzero variable coefficient
+  //! of a variable bigger than or equal to \p v.
+  const_iterator lower_bound(Variable v) const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+  bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are zero.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief Returns \p true if \p *this is equal to \p y.
+
+    Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+  */
+  template <typename Expression>
+  bool is_equal_to(const Expression& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars is zero.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+  //! Returns the \p i -th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Returns the coefficient of variable \p v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is zero,
+    for each i in [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  //! Returns the number of zero coefficient in [start, end).
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end).
+    Returns zero if all the coefficients in the range are zero.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  //! Returns the index of the last nonzero element, or zero if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last),
+  //! or \p last if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there
+  //! are no nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+  //! for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+  //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Sparse_Row& row) const;
+
+  //! Returns \c true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both \p *this and \p y.
+  template <typename Expression>
+  bool have_a_common_variable(const Expression& y,
+                              Variable first, Variable last) const;
+
+protected:
+  //! Constructor.
+  explicit Expression_Adapter(const raw_type& expr);
+  //! The raw, completely unwrapped object subject to adaptation.
+  const raw_type& raw_;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A transparent adapter for Linear_Expression objects.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Adapter_Transparent
+  : public Expression_Adapter<T> {
+  typedef Expression_Adapter<T> base_type;
+public:
+  //! The type of this object.
+  typedef Expression_Adapter_Transparent<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename base_type::inner_type inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename base_type::raw_type raw_type;
+
+  //! The type of const iterators on coefficients.
+  typedef typename base_type::const_iterator const_iterator;
+
+  //! Constructor.
+  explicit Expression_Adapter_Transparent(const raw_type& expr);
+};
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_inlines.hh line 1. */
+/* Expression_Adapter class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Adapter<T>::Expression_Adapter(const raw_type& expr)
+  : raw_(expr) {
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::inner_type
+Expression_Adapter<T>::inner() const {
+  return inner_type(raw_);
+}
+
+template <typename T>
+inline Representation
+Expression_Adapter<T>::representation() const {
+  return inner().representation();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::begin() const {
+  return inner().begin();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::end() const {
+  return inner().end();
+}
+
+template <typename T>
+inline typename Expression_Adapter<T>::const_iterator
+Expression_Adapter<T>::lower_bound(Variable v) const {
+  return inner().lower_bound(v);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::space_dimension() const {
+  return inner().space_dimension();
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::coefficient(Variable v) const {
+  return inner().coefficient(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::inhomogeneous_term() const {
+  return inner().inhomogeneous_term();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::is_zero() const {
+  return inner().is_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_homogeneous_terms_are_zero() const {
+  return inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>::is_equal_to(const Expression& y) const {
+  return inner().is_equal_to(y);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes(const Variables_Set& vars) const {
+  return inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(dimension_type i) const {
+  return inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Adapter<T>::get(Variable v) const {
+  return inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>::all_zeroes(dimension_type start,
+                                  dimension_type end) const {
+  return inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::num_zeroes(dimension_type start,
+                                  dimension_type end) const {
+  return inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Adapter<T>::gcd(dimension_type start,
+                           dimension_type end) const {
+  return inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero() const {
+  return inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::last_nonzero(dimension_type first,
+                                    dimension_type last) const {
+  return inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Adapter<T>::first_nonzero(dimension_type first,
+                                     dimension_type last) const {
+  return inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Adapter<T>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  return inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+              dimension_type start, dimension_type end) const {
+  return inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::is_equal_to(const Expression& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  return inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Dense_Row& row) const {
+  inner().get_row(row);
+}
+
+template <typename T>
+inline void
+Expression_Adapter<T>::get_row(Sparse_Row& row) const {
+  inner().get_row(row);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Adapter<T>
+::have_a_common_variable(const Expression& y,
+                         Variable first, Variable last) const {
+  return inner().have_a_common_variable(y, first, last);
+}
+
+template <typename T>
+inline
+Expression_Adapter_Transparent<T>
+::Expression_Adapter_Transparent(const raw_type& expr)
+  : base_type(expr) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Adapter_defs.hh line 215. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Inhomo;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Expression_Hide_Last;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 51. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 54. */
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the linear expression \p e1 + \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v + \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, Variable w);
+
+//! Returns the linear expression \p v + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n + \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator+(const Linear_Expression& e);
+
+//! Returns the linear expression - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e);
+
+//! Returns the linear expression \p e1 - \p e2.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p v - \p w.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, Variable w);
+
+//! Returns the linear expression \p v - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Variable v, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p v.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p n - \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e - \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the linear expression \p e * \p n.
+/*! \relates Linear_Expression */
+Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 + \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e + \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator+=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e + \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p e1 - \p e2 and assigns it to \p e1.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p v and assigns it to \p e.
+/*! \relates Linear_Expression
+  \exception std::length_error
+  Thrown if the space dimension of \p v exceeds
+  <CODE>Linear_Expression::max_space_dimension()</CODE>.
+ */
+Linear_Expression&
+operator-=(Linear_Expression& e, Variable v);
+
+//! Returns the linear expression \p e - \p n and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n * \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the linear expression \p n / \p e and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Assigns to \p e its own negation.
+/*! \relates Linear_Expression */
+void
+neg_assign(Linear_Expression& e);
+
+//! Returns the linear expression \p e + \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+               Coefficient_traits::const_reference n, Variable v);
+
+//! Sums \p e2 multiplied by \p factor into \p e1.
+/*! \relates Linear_Expression */
+void add_mul_assign(Linear_Expression& e1,
+                    Coefficient_traits::const_reference factor,
+                    const Linear_Expression& e2);
+
+//! Subtracts \p e2 multiplied by \p factor from \p e1.
+/*! \relates Linear_Expression */
+void sub_mul_assign(Linear_Expression& e1,
+                    Coefficient_traits::const_reference factor,
+                    const Linear_Expression& e2);
+
+//! Returns the linear expression \p e - \p n * \p v and assigns it to \p e.
+/*! \relates Linear_Expression */
+Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+               Coefficient_traits::const_reference n, Variable v);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Expression
+
+  \returns -1 or -2 if x is less than y, 0 if they are equal and 1 or 2 is y
+           is greater. The absolute value of the result is 1 if the difference
+           is only in the inhomogeneous terms, 2 otherwise
+
+  The order is a lexicographic. It starts comparing the variables' coefficient,
+  starting from Variable(0), and at the end it compares the inhomogeneous
+  terms.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Linear_Expression& x, const Linear_Expression& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream& operator<<(std::ostream& s, const Linear_Expression& e);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! A linear expression.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Linear_Expression represents the linear expression
+  \f[
+    \sum_{i=0}^{n-1} a_i x_i + b
+  \f]
+  where \f$n\f$ is the dimension of the vector space,
+  each \f$a_i\f$ is the integer coefficient
+  of the \f$i\f$-th variable \f$x_i\f$
+  and \f$b\f$ is the integer for the inhomogeneous term.
+
+  \par How to build a linear expression.
+
+  Linear expressions are the basic blocks for defining
+  both constraints (i.e., linear equalities or inequalities)
+  and generators (i.e., lines, rays, points and closure points).
+  A full set of functions is defined to provide a convenient interface
+  for building complex linear expressions starting from simpler ones
+  and from objects of the classes Variable and Coefficient:
+  available operators include unary negation,
+  binary addition and subtraction,
+  as well as multiplication by a Coefficient.
+  The space dimension of a linear expression is defined as the maximum
+  space dimension of the arguments used to build it:
+  in particular, the space dimension of a Variable <CODE>x</CODE>
+  is defined as <CODE>x.id()+1</CODE>,
+  whereas all the objects of the class Coefficient have space dimension zero.
+
+  \par Example
+  The following code builds the linear expression \f$4x - 2y - z + 14\f$,
+  having space dimension \f$3\f$:
+  \code
+  Linear_Expression e = 4*x - 2*y - z + 14;
+  \endcode
+  Another way to build the same linear expression is:
+  \code
+  Linear_Expression e1 = 4*x;
+  Linear_Expression e2 = 2*y;
+  Linear_Expression e3 = z;
+  Linear_Expression e = Linear_Expression(14);
+  e += e1 - e2 - e3;
+  \endcode
+  Note that \p e1, \p e2 and \p e3 have space dimension 1, 2 and 3,
+  respectively; also, in the fourth line of code, \p e is created
+  with space dimension zero and then extended to space dimension 3
+  in the fifth line.
+*/
+class Parma_Polyhedra_Library::Linear_Expression {
+public:
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: returns a copy of Linear_Expression::zero().
+  explicit Linear_Expression(Representation r = default_representation);
+
+  /*! \brief Ordinary copy constructor.
+    \note
+    The new expression will have the same representation as \p e
+    (not necessarily the default_representation).
+  */
+  Linear_Expression(const Linear_Expression& e);
+
+  //! Copy constructor that takes also a Representation.
+  Linear_Expression(const Linear_Expression& e, Representation r);
+
+  // Queried by expression adapters.
+  typedef const Linear_Expression& const_reference;
+  typedef Linear_Expression raw_type;
+
+  /*! \brief Copy constructor from a linear expression adapter.
+    \note
+    The new expression will have the same representation as \p e
+    (not necessarily the default_representation).
+  */
+  template <typename LE_Adapter>
+  explicit
+  Linear_Expression(const LE_Adapter& e,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  /*! \brief Copy constructor from a linear expression adapter that takes a
+    Representation.
+  */
+  template <typename LE_Adapter>
+  Linear_Expression(const LE_Adapter& e, Representation r,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  /*! \brief
+    Copy constructor from a linear expression adapter that takes a
+    space dimension.
+    \note
+    The new expression will have the same representation as \p e
+    (not necessarily default_representation).
+  */
+  template <typename LE_Adapter>
+  explicit
+  Linear_Expression(const LE_Adapter& e, dimension_type space_dim,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  /*! \brief
+    Copy constructor from a linear expression adapter that takes a
+    space dimension and a Representation.
+  */
+  template <typename LE_Adapter>
+  Linear_Expression(const LE_Adapter& e,
+                    dimension_type space_dim, Representation r,
+                    typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type = 0);
+
+  //! Assignment operator.
+  Linear_Expression& operator=(const Linear_Expression& e);
+
+  //! Destructor.
+  ~Linear_Expression();
+
+  /*! \brief
+    Builds the linear expression corresponding
+    to the inhomogeneous term \p n.
+  */
+  explicit Linear_Expression(Coefficient_traits::const_reference n,
+                             Representation r = default_representation);
+
+  //! Builds the linear expression corresponding to the variable \p v.
+  /*!
+    \exception std::length_error
+    Thrown if the space dimension of \p v exceeds
+    <CODE>Linear_Expression::max_space_dimension()</CODE>.
+  */
+  Linear_Expression(Variable v, Representation r = default_representation);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! A const %iterator on the expression (homogeneous) coefficient that are
+  //! nonzero.
+  /*!
+    These iterators are invalidated by operations that modify the expression.
+  */
+  class const_iterator {
+  private:
+  public:
+    typedef std::bidirectional_iterator_tag iterator_category;
+    typedef const Coefficient value_type;
+    typedef ptrdiff_t difference_type;
+    typedef value_type* pointer;
+    typedef Coefficient_traits::const_reference reference;
+
+    //! Constructs an invalid const_iterator.
+    /*!
+      This constructor takes \f$O(1)\f$ time.
+    */
+    explicit const_iterator();
+
+    //! The copy constructor.
+    /*!
+      \param itr
+      The %iterator that will be copied.
+
+      This constructor takes \f$O(1)\f$ time.
+    */
+    const_iterator(const const_iterator& itr);
+
+    ~const_iterator();
+
+    //! Swaps itr with *this.
+    /*!
+      \param itr
+      The %iterator that will be swapped with *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    void m_swap(const_iterator& itr);
+
+    //! Assigns \p itr to *this .
+    /*!
+      \param itr
+      The %iterator that will be assigned into *this.
+
+      This method takes \f$O(1)\f$ time.
+    */
+    const_iterator& operator=(const const_iterator& itr);
+
+    //! Navigates to the next nonzero coefficient.
+    /*!
+      This method takes \f$O(n)\f$ time for dense expressions, and
+      \f$O(1)\f$ time for sparse expressions.
+    */
+    const_iterator& operator++();
+
+    //! Navigates to the previous nonzero coefficient.
+    /*!
+      This method takes \f$O(n)\f$ time for dense expressions, and
+      \f$O(1)\f$ time for sparse expressions.
+    */
+    const_iterator& operator--();
+
+    //! Returns the current element.
+    reference operator*() const;
+
+    //! Returns the variable of the coefficient pointed to by \c *this.
+    /*!
+      \returns the variable of the coefficient pointed to by \c *this.
+    */
+    Variable variable() const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const const_iterator& x) const;
+
+    //! Compares \p *this with x .
+    /*!
+      \param x
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const const_iterator& x) const;
+
+  private:
+    //! Constructor from a const_iterator_interface*.
+    //! The new object takes ownership of the dynamic object.
+    const_iterator(Linear_Expression_Interface::const_iterator_interface* itr);
+
+    Linear_Expression_Interface::const_iterator_interface* itr;
+
+    friend class Linear_Expression;
+  };
+
+  //! Returns an iterator that points to the first nonzero coefficient in the
+  //! expression.
+  const_iterator begin() const;
+
+  //! Returns an iterator that points to the last nonzero coefficient in the
+  //! expression.
+  const_iterator end() const;
+
+  //! Returns an iterator that points to the first nonzero coefficient of a
+  //! variable bigger than or equal to v.
+  const_iterator lower_bound(Variable v) const;
+
+  //! Returns the maximum space dimension a Linear_Expression can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to \p n .
+  void set_space_dimension(dimension_type n);
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Sets the coefficient of \p v in \p *this to \p n.
+  void set_coefficient(Variable v,
+                       Coefficient_traits::const_reference n);
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Sets the inhomogeneous term of \p *this to \p n.
+  void set_inhomogeneous_term(Coefficient_traits::const_reference n);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param v
+    The variable whose coefficient has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the coefficient of variable \p v equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  void linear_combine(const Linear_Expression& y, Variable v);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>, but assumes that
+  //! c1 and c2 are not 0.
+  void linear_combine(const Linear_Expression& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2);
+
+  //! Equivalent to <CODE>*this = *this * c1 + y * c2</CODE>.
+  //! c1 and c2 may be 0.
+  void linear_combine_lax(const Linear_Expression& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the expression.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the expression.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is \f$0\f$.
+  bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the (zero-dimension space) constant 0.
+  static const Linear_Expression& zero();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Linear_Expression& y);
+
+  //! Copy constructor with a specified space dimension.
+  Linear_Expression(const Linear_Expression& e, dimension_type space_dim);
+
+  //! Copy constructor with a specified space dimension and representation.
+  Linear_Expression(const Linear_Expression& e, dimension_type space_dim,
+                    Representation r);
+
+  //! Returns \p true if *this is equal to \p x.
+  //! Note that (*this == x) has a completely different meaning.
+  bool is_equal_to(const Linear_Expression& x) const;
+
+  //! Normalizes the modulo of the coefficients and of the inhomogeneous term
+  //! so that they are mutually prime.
+  /*!
+    Computes the Greatest Common Divisor (GCD) among the coefficients
+    and the inhomogeneous term and normalizes them by the GCD itself.
+  */
+  void normalize();
+
+  //! Ensures that the first nonzero homogeneous coefficient is positive,
+  //! by negating the row if necessary.
+  void sign_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars[i] is \f$0\f$.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the (zero-dimension space) constant 0.
+  */
+  static const Linear_Expression* zero_p;
+
+  Linear_Expression_Interface* impl;
+
+  //! Implementation sizing constructor.
+  /*!
+    The bool parameter is just to avoid problems with
+    the constructor Linear_Expression(Coefficient_traits::const_reference n).
+  */
+  Linear_Expression(dimension_type space_dim, bool,
+                    Representation r = default_representation);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the i-th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the i-th coefficient to n.
+  void set(dimension_type i, Coefficient_traits::const_reference n);
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Returns the coefficient of v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  // NOTE: This method is public, but it's not exposed in Linear_Expression,
+  // so that it can be used internally in the PPL, by friends of
+  // Linear_Expression.
+  //! Sets the coefficient of v to n.
+  void set(Variable v, Coefficient_traits::const_reference n);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is \f$0\f$, for each i in
+    [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are 0 returns 0.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  void exact_div_assign(Coefficient_traits::const_reference c,
+                        dimension_type start, dimension_type end);
+
+  //! Linearly combines \p *this with \p y so that the coefficient of \p v
+  //! is 0.
+  /*!
+    \param y
+    The expression that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting expression to \p *this.
+
+    \p *this and \p y must have the same space dimension.
+  */
+  void linear_combine(const Linear_Expression& y, dimension_type i);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). It assumes that c1 and c2 are nonzero.
+  void linear_combine(const Linear_Expression& y,
+                      Coefficient_traits::const_reference c1,
+                      Coefficient_traits::const_reference c2,
+                      dimension_type start, dimension_type end);
+
+  //! Equivalent to <CODE>(*this)[i] = (*this)[i] * c1 + y[i] * c2</CODE>,
+  //! for each i in [start, end). c1 and c2 may be zero.
+  void linear_combine_lax(const Linear_Expression& y,
+                          Coefficient_traits::const_reference c1,
+                          Coefficient_traits::const_reference c2,
+                          dimension_type start, dimension_type end);
+
+  //! Equivalent to <CODE>(*this)[i] *= n</CODE>, for each i in [start, end).
+  void mul_assign(Coefficient_traits::const_reference n,
+                  dimension_type start, dimension_type end);
+
+  //! Returns the index of the last nonzero element, or 0 if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Sets results to the sum of (*this)[i]*y[i], for each i.
+  void scalar_product_assign(Coefficient& result,
+                             const Linear_Expression& y) const;
+
+  //! Sets results to the sum of (*this)[i]*y[i], for each i in [start,end).
+  void scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+                             dimension_type start, dimension_type end) const;
+
+  //! Computes the sign of the sum of (*this)[i]*y[i], for each i.
+  int scalar_product_sign(const Linear_Expression& y) const;
+
+  //! Computes the sign of the sum of (*this)[i]*y[i],
+  //! for each i in [start,end).
+  int scalar_product_sign(const Linear_Expression& y,
+                          dimension_type start, dimension_type end) const;
+
+  //! Removes from the set x all the indexes of nonzero elements of *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \p true if (*this)[i] is equal to x[i], for each i in [start,end).
+  bool is_equal_to(const Linear_Expression& x,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \p true if (*this)[i]*c1 is equal to x[i]*c2, for each i in
+  //! [start,end).
+  bool is_equal_to(const Linear_Expression& x,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets `row' to a copy of the row that implements *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets `row' to a copy of the row that implements *this.
+  void get_row(Sparse_Row& row) const;
+
+  //! Returns true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both *this and x.
+  bool have_a_common_variable(const Linear_Expression& x,
+                              Variable first, Variable last) const;
+
+  /*! \brief
+    Negates the elements from index \p first (included)
+    to index \p last (excluded).
+  */
+  void negate(dimension_type first, dimension_type last);
+
+  template <typename Row>
+  friend class Linear_Expression_Impl;
+
+  // NOTE: The following classes are friends of Linear_Expression in order
+  // to access its private methods.
+  // Since they are *not* friend of Linear_Expression_Impl, they can only
+  // access its public methods so they cannot break the class invariant of
+  // Linear_Expression_Impl.
+  friend class Grid;
+  friend class Congruence;
+  friend class Polyhedron;
+  friend class PIP_Tree_Node;
+  friend class Grid_Generator;
+  friend class Generator;
+  friend class Constraint;
+  friend class Constraint_System;
+  friend class PIP_Problem;
+  friend class BHRZ03_Certificate;
+  friend class Scalar_Products;
+  friend class MIP_Problem;
+  friend class Box_Helpers;
+  friend class Congruence_System;
+  friend class BD_Shape_Helpers;
+  friend class Octagonal_Shape_Helper;
+  friend class Termination_Helpers;
+  template <typename T>
+  friend class BD_Shape;
+  template <typename T>
+  friend class Octagonal_Shape;
+  template <typename T>
+  friend class Linear_System;
+  template <typename T>
+  friend class Box;
+  template <typename T>
+  friend class Expression_Adapter;
+  template <typename T>
+  friend class Expression_Hide_Inhomo;
+  template <typename T>
+  friend class Expression_Hide_Last;
+
+  friend Linear_Expression
+  operator+(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression
+  operator+(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator+(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Linear_Expression
+  operator+(Variable v, const Linear_Expression& e);
+  friend Linear_Expression
+  operator+(Variable v, Variable w);
+
+  friend Linear_Expression
+  operator-(const Linear_Expression& e);
+
+  friend Linear_Expression
+  operator-(const Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression
+  operator-(Variable v, Variable w);
+  friend Linear_Expression
+  operator-(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator-(const Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Linear_Expression
+  operator-(Variable v, const Linear_Expression& e);
+  friend Linear_Expression
+  operator-(const Linear_Expression& e, Variable v);
+
+  friend Linear_Expression
+  operator*(Coefficient_traits::const_reference n, const Linear_Expression& e);
+  friend Linear_Expression
+  operator*(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e, Variable v);
+  friend Linear_Expression&
+  operator+=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e1, const Linear_Expression& e2);
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e, Variable v);
+  friend Linear_Expression&
+  operator-=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Linear_Expression&
+  operator*=(Linear_Expression& e, Coefficient_traits::const_reference n);
+  friend Linear_Expression&
+  operator/=(Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend void
+  neg_assign(Linear_Expression& e);
+
+  friend Linear_Expression&
+  add_mul_assign(Linear_Expression& e,
+                 Coefficient_traits::const_reference n, Variable v);
+  friend Linear_Expression&
+  sub_mul_assign(Linear_Expression& e,
+                 Coefficient_traits::const_reference n, Variable v);
+
+  friend void
+  add_mul_assign(Linear_Expression& e1,
+                 Coefficient_traits::const_reference factor,
+                 const Linear_Expression& e2);
+  friend void
+  sub_mul_assign(Linear_Expression& e1,
+                 Coefficient_traits::const_reference factor,
+                 const Linear_Expression& e2);
+
+  friend int
+  compare(const Linear_Expression& x, const Linear_Expression& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<(std::ostream& s, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression */
+void swap(Linear_Expression& x, Linear_Expression& y);
+
+//! Swaps \p x with \p y.
+/*! \relates Linear_Expression::const_iterator */
+void swap(Linear_Expression::const_iterator& x,
+          Linear_Expression::const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_inlines.hh line 1. */
+/* Linear_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline Linear_Expression&
+Linear_Expression::operator=(const Linear_Expression& e) {
+  Linear_Expression tmp = e;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+  delete impl;
+}
+
+inline Representation
+Linear_Expression::representation() const {
+  return impl->representation();
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+  return impl->space_dimension();
+}
+
+inline void
+Linear_Expression::set_space_dimension(dimension_type n) {
+  impl->set_space_dimension(n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+  return impl->coefficient(v);
+}
+
+inline void
+Linear_Expression
+::set_coefficient(Variable v, Coefficient_traits::const_reference n) {
+  impl->set_coefficient(v, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+  return impl->inhomogeneous_term();
+}
+
+inline void
+Linear_Expression
+::set_inhomogeneous_term(Coefficient_traits::const_reference n) {
+  impl->set_inhomogeneous_term(n);
+}
+
+inline void
+Linear_Expression::swap_space_dimensions(Variable v1, Variable v2) {
+  impl->swap_space_dimensions(v1, v2);
+}
+
+inline void
+Linear_Expression::shift_space_dimensions(Variable v, dimension_type n) {
+  impl->shift_space_dimensions(v, n);
+}
+
+inline bool
+Linear_Expression::is_zero() const {
+  return impl->is_zero();
+}
+
+inline bool
+Linear_Expression::all_homogeneous_terms_are_zero() const {
+  return impl->all_homogeneous_terms_are_zero();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+  PPL_ASSERT(zero_p != 0);
+  return *zero_p;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+  return impl->total_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e) {
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression x = e;
+  x += n;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+  Linear_Expression x = e;
+  x += v;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression x = e;
+  x -= n;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > Linear_Expression::max_space_dimension())
+    throw std::length_error("Linear_Expression "
+                            "PPL::operator+(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  if (v_space_dim >= w_space_dim) {
+    Linear_Expression e(v);
+    e -= w;
+    return e;
+  }
+  else {
+    Linear_Expression e(w.space_dimension(), true);
+    e -= w;
+    e += v;
+    return e;
+  }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression x = e;
+  x *= n;
+  return x;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl += n;
+  return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl -= n;
+  return e;
+}
+
+inline void
+Linear_Expression::m_swap(Linear_Expression& y) {
+  using std::swap;
+  swap(impl, y.impl);
+}
+
+inline void
+Linear_Expression::normalize() {
+  impl->normalize();
+}
+
+inline void
+Linear_Expression::ascii_dump(std::ostream& s) const {
+  impl->ascii_dump(s);
+}
+
+inline bool
+Linear_Expression::ascii_load(std::istream& s) {
+  return impl->ascii_load(s);
+}
+
+inline void
+Linear_Expression::remove_space_dimensions(const Variables_Set& vars) {
+  impl->remove_space_dimensions(vars);
+}
+
+inline void
+Linear_Expression::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  impl->permute_space_dimensions(cycle);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
+  if (e1.space_dimension() >= e2.space_dimension()) {
+    Linear_Expression e = e1;
+    e += e2;
+    return e;
+  }
+  else {
+    Linear_Expression e = e2;
+    e += e1;
+    return e;
+  }
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+  return e + v;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator+(Coefficient_traits::const_reference n,
+               const Linear_Expression& e) {
+  return e + n;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > Linear_Expression::max_space_dimension())
+    throw std::length_error("Linear_Expression "
+                            "PPL::operator+(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  if (v_space_dim >= w_space_dim) {
+    Linear_Expression e(v);
+    e += w;
+    return e;
+  }
+  else {
+    Linear_Expression e(w);
+    e += v;
+    return e;
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e) {
+  Linear_Expression r(e);
+  neg_assign(r);
+  return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
+  if (e1.space_dimension() >= e2.space_dimension()) {
+    Linear_Expression e = e1;
+    e -= e2;
+    return e;
+  }
+  else {
+    Linear_Expression e = e2;
+    neg_assign(e);
+    e += e1;
+    return e;
+  }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+  Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+  result.negate(0, e.space_dimension() + 1);
+  result += v;
+  return result;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+  Linear_Expression result(e, std::max(v.space_dimension(), e.space_dimension()));
+  result -= v;
+  return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator-(Coefficient_traits::const_reference n,
+               const Linear_Expression& e) {
+  Linear_Expression result(e);
+  neg_assign(result);
+  result += n;
+  return result;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression
+operator*(Coefficient_traits::const_reference n,
+               const Linear_Expression& e) {
+  return e * n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e1, const Linear_Expression& e2) {
+  *e1.impl += *e2.impl;
+  return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, const Variable v) {
+  *e.impl += v;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e1, const Linear_Expression& e2) {
+  *e1.impl -= *e2.impl;
+  return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, const Variable v) {
+  *e.impl -= v;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl *= n;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+operator/=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+  *e.impl /= n;
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+neg_assign(Linear_Expression& e) {
+  e.impl->negate();
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+add_mul_assign(Linear_Expression& e,
+               Coefficient_traits::const_reference n,
+               const Variable v) {
+  e.impl->add_mul_assign(n, v);
+  return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline Linear_Expression&
+sub_mul_assign(Linear_Expression& e,
+                    Coefficient_traits::const_reference n,
+                    const Variable v) {
+  e.impl->sub_mul_assign(n, v);
+  return e;
+}
+
+inline void
+add_mul_assign(Linear_Expression& e1,
+               Coefficient_traits::const_reference factor,
+               const Linear_Expression& e2) {
+  e1.impl->add_mul_assign(factor, *e2.impl);
+}
+
+inline void
+sub_mul_assign(Linear_Expression& e1,
+                    Coefficient_traits::const_reference factor,
+                    const Linear_Expression& e2) {
+  e1.impl->sub_mul_assign(factor, *e2.impl);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(dimension_type i) const {
+  return impl->get(i);
+}
+
+inline void
+Linear_Expression::set(dimension_type i,
+                       Coefficient_traits::const_reference n) {
+  impl->set(i, n);
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::get(Variable v) const {
+  return impl->get(v.space_dimension());
+}
+
+inline void
+Linear_Expression::set(Variable v,
+                       Coefficient_traits::const_reference n) {
+  impl->set(v.space_dimension(), n);
+}
+
+inline bool
+Linear_Expression::all_zeroes(dimension_type start, dimension_type end) const {
+  return impl->all_zeroes(start, end);
+}
+
+inline dimension_type
+Linear_Expression::num_zeroes(dimension_type start, dimension_type end) const {
+  return impl->num_zeroes(start, end);
+}
+
+inline Coefficient
+Linear_Expression::gcd(dimension_type start, dimension_type end) const {
+  return impl->gcd(start, end);
+}
+
+inline void
+Linear_Expression
+::exact_div_assign(Coefficient_traits::const_reference c,
+                   dimension_type start, dimension_type end) {
+  impl->exact_div_assign(c, start, end);
+}
+
+inline void
+Linear_Expression
+::mul_assign(Coefficient_traits::const_reference c,
+             dimension_type start, dimension_type end) {
+  impl->mul_assign(c, start, end);
+}
+
+inline void
+Linear_Expression::sign_normalize() {
+  impl->sign_normalize();
+}
+
+inline void
+Linear_Expression::negate(dimension_type first, dimension_type last) {
+  impl->negate(first, last);
+}
+
+inline bool
+Linear_Expression::all_zeroes(const Variables_Set& vars) const {
+  return impl->all_zeroes(vars);
+}
+
+inline bool
+Linear_Expression::all_zeroes_except(const Variables_Set& vars,
+                                     dimension_type start,
+                                     dimension_type end) const {
+  return impl->all_zeroes_except(vars, start, end);
+}
+
+inline dimension_type
+Linear_Expression::last_nonzero() const {
+  return impl->last_nonzero();
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y) const {
+  scalar_product_assign(result, y, 0, space_dimension() + 1);
+}
+
+inline void
+Linear_Expression
+::scalar_product_assign(Coefficient& result, const Linear_Expression& y,
+                        dimension_type start, dimension_type end) const {
+  impl->scalar_product_assign(result, *(y.impl), start, end);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y) const {
+  return scalar_product_sign(y, 0, space_dimension() + 1);
+}
+
+inline int
+Linear_Expression
+::scalar_product_sign(const Linear_Expression& y,
+                      dimension_type start, dimension_type end) const {
+  return impl->scalar_product_sign(*(y.impl), start, end);
+}
+
+inline dimension_type
+Linear_Expression
+::first_nonzero(dimension_type first, dimension_type last) const {
+  return impl->first_nonzero(first, last);
+}
+
+inline dimension_type
+Linear_Expression
+::last_nonzero(dimension_type first, dimension_type last) const {
+  return impl->last_nonzero(first, last);
+}
+
+inline void
+Linear_Expression
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  return impl->has_a_free_dimension_helper(x);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+              dimension_type start, dimension_type end) const {
+  return impl->is_equal_to(*(x.impl), start, end);
+}
+
+inline bool
+Linear_Expression
+::is_equal_to(const Linear_Expression& x,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  return impl->is_equal_to(*(x.impl), c1, c2, start, end);
+}
+
+inline void
+Linear_Expression
+::get_row(Dense_Row& row) const {
+  return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::get_row(Sparse_Row& row) const {
+  return impl->get_row(row);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y, dimension_type i) {
+  impl->linear_combine(*y.impl, i);
+}
+
+inline void
+Linear_Expression
+::linear_combine(const Linear_Expression& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2) {
+  impl->linear_combine(*y.impl, c1, c2);
+}
+
+inline void
+Linear_Expression
+::linear_combine_lax(const Linear_Expression& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2) {
+  impl->linear_combine_lax(*y.impl, c1, c2);
+}
+
+inline int
+compare(const Linear_Expression& x, const Linear_Expression& y) {
+  return x.impl->compare(*y.impl);
+}
+
+inline bool
+Linear_Expression::is_equal_to(const Linear_Expression& x) const {
+  return impl->is_equal_to(*x.impl);
+}
+
+inline void
+Linear_Expression::linear_combine(const Linear_Expression& y,
+                                  Coefficient_traits::const_reference c1,
+                                  Coefficient_traits::const_reference c2,
+                                  dimension_type start,
+                                  dimension_type end) {
+  impl->linear_combine(*y.impl, c1, c2, start, end);
+}
+
+inline void
+Linear_Expression::linear_combine_lax(const Linear_Expression& y,
+                                      Coefficient_traits::const_reference c1,
+                                      Coefficient_traits::const_reference c2,
+                                      dimension_type start,
+                                      dimension_type end) {
+  impl->linear_combine_lax(*y.impl, c1, c2, start, end);
+}
+
+inline bool
+Linear_Expression
+::have_a_common_variable(const Linear_Expression& x,
+                         Variable first, Variable last) const {
+  return impl->have_a_common_variable(*(x.impl), first, last);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator()
+  : itr(NULL) {
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(const const_iterator& x)
+  : itr(x.itr->clone()) {
+}
+
+inline
+Linear_Expression::const_iterator
+::~const_iterator() {
+  // Note that this does nothing if itr==NULL.
+  delete itr;
+}
+
+inline void
+Linear_Expression::const_iterator::m_swap(const_iterator& x) {
+  using std::swap;
+  swap(itr, x.itr);
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator=(const const_iterator& itr) {
+  const_iterator tmp = itr;
+  using std::swap;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator++() {
+  PPL_ASSERT(itr != NULL);
+  ++(*itr);
+  return *this;
+}
+
+inline Linear_Expression::const_iterator&
+Linear_Expression::const_iterator
+::operator--() {
+  PPL_ASSERT(itr != NULL);
+  --(*itr);
+  return *this;
+}
+
+inline Linear_Expression::const_iterator::reference
+Linear_Expression::const_iterator
+::operator*() const {
+  PPL_ASSERT(itr != NULL);
+  return *(*itr);
+}
+
+inline Variable
+Linear_Expression::const_iterator
+::variable() const {
+  PPL_ASSERT(itr != NULL);
+  return itr->variable();
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator==(const const_iterator& x) const {
+  PPL_ASSERT(itr != NULL);
+  PPL_ASSERT(x.itr != NULL);
+  return *itr == *(x.itr);
+}
+
+inline bool
+Linear_Expression::const_iterator
+::operator!=(const const_iterator& x) const {
+  return !(*this == x);
+}
+
+inline
+Linear_Expression::const_iterator
+::const_iterator(Linear_Expression_Interface::const_iterator_interface* itr)
+  : itr(itr) {
+  PPL_ASSERT(itr != NULL);
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::begin() const {
+  return const_iterator(impl->begin());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::end() const {
+  return const_iterator(impl->end());
+}
+
+inline Linear_Expression::const_iterator
+Linear_Expression
+::lower_bound(Variable v) const {
+  return const_iterator(impl->lower_bound(v));
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(e.representation());
+  tmp.set_space_dimension(e.space_dimension());
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  for (typename LE_Adapter::const_iterator i = e.begin(),
+         i_end = e.end(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     Representation r,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(r);
+  tmp.set_space_dimension(e.space_dimension());
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  for (typename LE_Adapter::const_iterator i = e.begin(),
+         i_end = e.end(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     dimension_type space_dim,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(e.representation());
+  tmp.set_space_dimension(space_dim);
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  typedef typename LE_Adapter::const_iterator itr_t;
+  itr_t i_end;
+  if (space_dim <= e.space_dimension())
+    i_end = e.lower_bound(Variable(space_dim));
+  else
+    i_end = e.end();
+  for (itr_t i = e.begin(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+template <typename LE_Adapter>
+inline
+Linear_Expression::Linear_Expression(const LE_Adapter& e,
+                                     dimension_type space_dim,
+                                     Representation r,
+                                     typename Enable_If<Is_Same_Or_Derived<Expression_Adapter_Base, LE_Adapter>::value, void*>::type)
+  : impl(NULL) {
+  Linear_Expression tmp(r);
+  tmp.set_space_dimension(space_dim);
+  tmp.set_inhomogeneous_term(e.inhomogeneous_term());
+  typedef typename LE_Adapter::const_iterator itr_t;
+  itr_t i_end;
+  if (space_dim <= e.space_dimension())
+    i_end = e.lower_bound(Variable(space_dim));
+  else
+    i_end = e.end();
+  for (itr_t i = e.begin(); i != i_end; ++i)
+    add_mul_assign(tmp, *i, i.variable());
+  using std::swap;
+  swap(impl, tmp.impl);
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline std::ostream&
+operator<<(std::ostream& s, const Linear_Expression& e) {
+  e.impl->print(s);
+  return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Linear_Expression& x, Linear_Expression& y) {
+  x.m_swap(y);
+}
+
+/*! \relates Linear_Expression::const_iterator */
+inline void
+swap(Linear_Expression::const_iterator& x,
+     Linear_Expression::const_iterator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_defs.hh line 927. */
+
+/* Automatically generated from PPL source file ../src/Topology_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+enum Topology {
+  NECESSARILY_CLOSED = 0,
+  NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 1. */
+/* Expression_Hide_Last class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An adapter for Linear_Expression that maybe hides the last coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Last
+  : public Expression_Adapter<T> {
+  typedef Expression_Adapter<T> base_type;
+public:
+  //! The type of this object.
+  typedef Expression_Hide_Last<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename base_type::inner_type inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename base_type::raw_type raw_type;
+
+  //! The type of const iterators on coefficients.
+  typedef typename base_type::const_iterator const_iterator;
+
+  //! Constructor.
+  explicit Expression_Hide_Last(const raw_type& expr, bool hide_last);
+
+  //! Iterator pointing after the last nonzero variable coefficient.
+  const_iterator end() const;
+
+  //! Iterator pointing to the first nonzero variable coefficient
+  //! of a variable bigger than or equal to \p v.
+  const_iterator lower_bound(Variable v) const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+  bool is_zero() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous
+    terms of \p *this are zero.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  /*! \brief Returns \p true if \p *this is equal to \p y.
+
+    Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+  */
+  template <typename Expression>
+  bool is_equal_to(const Expression& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars is zero.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+  //! Returns the \p i -th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Returns the coefficient of variable \p v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is zero,
+    for each i in [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  //! Returns the number of zero coefficient in [start, end).
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end).
+    Returns zero if all the coefficients in the range are zero.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  //! Returns the index of the last nonzero element, or zero if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last),
+  //! or \p last if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there are no
+  //! nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+  //! for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+  //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Sparse_Row& row) const;
+
+  //! Returns \c true if there is a variable in [first,last) whose coefficient
+  //! is nonzero in both \p *this and \p y.
+  template <typename Expression>
+  bool have_a_common_variable(const Expression& y,
+                              Variable first, Variable last) const;
+
+private:
+  //! Whether or not the last coefficient is hidden.
+  const bool hide_last_;
+};
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_inlines.hh line 1. */
+/* Expression_Hide_Last class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Expression_Hide_Last<T>::Expression_Hide_Last(const raw_type& expr,
+                                              const bool hide_last)
+  : base_type(expr), hide_last_(hide_last) {
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::space_dimension() const {
+  dimension_type dim = this->inner().space_dimension();
+  if (hide_last_) {
+    PPL_ASSERT(dim > 0);
+    --dim;
+  }
+  return dim;
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::end() const {
+  if (hide_last_) {
+    return this->inner().lower_bound(Variable(space_dimension()));
+  }
+  else {
+    return this->inner().end();
+  }
+}
+
+template <typename T>
+inline typename Expression_Hide_Last<T>::const_iterator
+Expression_Hide_Last<T>::lower_bound(Variable v) const {
+  PPL_ASSERT(v.space_dimension() <= space_dimension() + 1);
+  return this->inner().lower_bound(v);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::coefficient(Variable v) const {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  return this->inner().coefficient(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::is_zero() const {
+  return this->inner().all_zeroes(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_homogeneous_terms_are_zero() const {
+  return this->inner().all_zeroes(1, space_dimension() + 1);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y) const {
+  const dimension_type x_dim = space_dimension();
+  const dimension_type y_dim = y.space_dimension();
+  if (x_dim != y_dim)
+    return false;
+  return is_equal_to(y, 0, x_dim + 1);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(const Variables_Set& vars) const {
+  PPL_ASSERT(vars.space_dimension() <= space_dimension());
+  return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(dimension_type i) const {
+  PPL_ASSERT(i <= space_dimension());
+  return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Last<T>::get(Variable v) const {
+  PPL_ASSERT(v.space_dimension() <= space_dimension());
+  return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>::all_zeroes(dimension_type start,
+                                    dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::num_zeroes(dimension_type start,
+                                    dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().num_zeroes(start, end);
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Last<T>::gcd(dimension_type start,
+                             dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero() const {
+  return this->inner().last_nonzero(0, space_dimension() + 1);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::last_nonzero(dimension_type first,
+                                      dimension_type last) const {
+  PPL_ASSERT(last <= space_dimension() + 1);
+  return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Last<T>::first_nonzero(dimension_type first,
+                                       dimension_type last) const {
+  PPL_ASSERT(last <= space_dimension() + 1);
+  return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Last<T>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& x) const {
+  if (x.empty())
+    return;
+  PPL_ASSERT(*(--x.end()) <= space_dimension());
+  this->inner().has_a_free_dimension_helper(x);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+              dimension_type start, dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  PPL_ASSERT(end <= y.space_dimension() + 1);
+  return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::is_equal_to(const Expression& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  PPL_ASSERT(end <= space_dimension() + 1);
+  PPL_ASSERT(end <= y.space_dimension() + 1);
+  return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Dense_Row& row) const {
+  this->inner().get_row(row);
+  if (hide_last_) {
+    PPL_ASSERT(row.size() != 0);
+    row.resize(row.size() - 1);
+  }
+}
+
+template <typename T>
+inline void
+Expression_Hide_Last<T>::get_row(Sparse_Row& row) const {
+  this->inner().get_row(row);
+  if (hide_last_) {
+    PPL_ASSERT(row.size() != 0);
+    row.resize(row.size() - 1);
+  }
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Last<T>
+::have_a_common_variable(const Expression& y,
+                         Variable first, Variable last) const {
+  PPL_ASSERT(last.space_dimension() <= space_dimension() + 1);
+  PPL_ASSERT(last.space_dimension() <= y.space_dimension() + 1);
+  return this->inner().have_a_common_variable(y, first, last);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Last_defs.hh line 164. */
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 40. */
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the constraint \p e1 \< \p e2.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \< \p v2.
+/*! \relates Constraint */
+Constraint
+operator<(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \< \p n.
+/*! \relates Constraint */
+Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \< \p e.
+/*! \relates Constraint */
+Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \> \p e2.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \> \p v2.
+/*! \relates Constraint */
+Constraint
+operator>(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \> \p n.
+/*! \relates Constraint */
+Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \> \p e.
+/*! \relates Constraint */
+Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 = \p v2.
+/*! \relates Constraint */
+Constraint
+operator==(Variable v1, Variable v2);
+
+//! Returns the constraint \p e = \p n.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n = \p e.
+/*! \relates Constraint */
+Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \<= \p e2.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \<= \p v2.
+/*! \relates Constraint */
+Constraint
+operator<=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \<= \p n.
+/*! \relates Constraint */
+Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \<= \p e.
+/*! \relates Constraint */
+Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+//! Returns the constraint \p e1 \>= \p e2.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the constraint \p v1 \>= \p v2.
+/*! \relates Constraint */
+Constraint
+operator>=(Variable v1, Variable v2);
+
+//! Returns the constraint \p e \>= \p n.
+/*! \relates Constraint */
+Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns the constraint \p n \>= \p e.
+/*! \relates Constraint */
+Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Constraint
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Constraint& x, const Constraint& y);
+
+}
+
+//! A linear equality or inequality.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Constraint is either:
+  - an equality: \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$;
+  - a non-strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b \geq 0\f$; or
+  - a strict inequality: \f$\sum_{i=0}^{n-1} a_i x_i + b > 0\f$;
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$
+  and \f$b\f$ is the integer inhomogeneous term.
+
+  \par How to build a constraint
+  Constraints are typically built by applying a relation symbol
+  to a pair of linear expressions.
+  Available relation symbols are equality (<CODE>==</CODE>),
+  non-strict inequalities (<CODE>\>=</CODE> and <CODE>\<=</CODE>) and
+  strict inequalities (<CODE>\<</CODE> and <CODE>\></CODE>).
+  The space dimension of a constraint is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality constraint
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Constraint eq_c(3*x + 5*y - z == 0);
+  \endcode
+  The following code builds the (non-strict) inequality constraint
+  \f$4x \geq 2y - 13\f$, having space dimension \f$2\f$:
+  \code
+  Constraint ineq_c(4*x >= 2*y - 13);
+  \endcode
+  The corresponding strict inequality constraint
+  \f$4x > 2y - 13\f$ is obtained as follows:
+  \code
+  Constraint strict_ineq_c(4*x > 2*y - 13);
+  \endcode
+  An unsatisfiable constraint on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Constraint false_c = Constraint::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Constraint false_c1(Linear_Expression::zero() == 1);
+  Constraint false_c2(Linear_Expression::zero() >= 1);
+  Constraint false_c3(Linear_Expression::zero() > 0);
+  \endcode
+  In contrast, the following code defines an unsatisfiable constraint
+  having space dimension \f$3\f$:
+  \code
+  Constraint false_c(0*z == 1);
+  \endcode
+
+  \par How to inspect a constraint
+  Several methods are provided to examine a constraint and extract
+  all the encoded information: its space dimension, its type
+  (equality, non-strict inequality, strict inequality) and
+  the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access each single
+  coefficient of a constraint. Given an inequality constraint
+  (in this case \f$x - 5y + 3z \leq 4\f$), we construct a new constraint
+  corresponding to its complement (thus, in this case we want to obtain
+  the strict inequality constraint \f$x - 5y + 3z > 4\f$).
+  \code
+  Constraint c1(x - 5*y + 3*z <= 4);
+  cout << "Constraint c1: " << c1 << endl;
+  if (c1.is_equality())
+    cout << "Constraint c1 is not an inequality." << endl;
+  else {
+    Linear_Expression e;
+    for (dimension_type i = c1.space_dimension(); i-- > 0; )
+      e += c1.coefficient(Variable(i)) * Variable(i);
+    e += c1.inhomogeneous_term();
+    Constraint c2 = c1.is_strict_inequality() ? (e <= 0) : (e < 0);
+    cout << "Complement c2: " << c2 << endl;
+  }
+  \endcode
+  The actual output is the following:
+  \code
+  Constraint c1: -A + 5*B - 3*C >= -4
+  Complement c2: A - 5*B + 3*C > 4
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  constraint considered.
+*/
+class Parma_Polyhedra_Library::Constraint {
+public:
+
+  //! The constraint type.
+  enum Type {
+    /*! The constraint is an equality. */
+    EQUALITY,
+    /*! The constraint is a non-strict inequality. */
+    NONSTRICT_INEQUALITY,
+    /*! The constraint is a strict inequality. */
+    STRICT_INEQUALITY
+  };
+
+  //! The representation used for new Constraints.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Constructs the \f$0<=0\f$ constraint.
+  explicit Constraint(Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note The new Constraint will have the same representation as `c',
+          not default_representation, so that they are indistinguishable.
+  */
+  Constraint(const Constraint& c);
+
+  //! Copy constructor with given size.
+  /*!
+    \note The new Constraint will have the same representation as `c',
+          not default_representation, so that they are indistinguishable.
+  */
+  Constraint(const Constraint& c, dimension_type space_dim);
+
+  //! Copy constructor with given representation.
+  Constraint(const Constraint& c, Representation r);
+
+  //! Copy constructor with given size and representation.
+  Constraint(const Constraint& c, dimension_type space_dim,
+             Representation r);
+
+  //! Copy-constructs from equality congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p cg is a proper congruence.
+  */
+  explicit Constraint(const Congruence& cg,
+                      Representation r = default_representation);
+
+  //! Destructor.
+  ~Constraint();
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Assignment operator.
+  Constraint& operator=(const Constraint& c);
+
+  //! Returns the maximum space dimension a Constraint can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the constraint.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+
+    Always returns \p true. The return value is needed for compatibility with
+    the Generator class.
+  */
+  bool remove_space_dimensions(const Variables_Set& vars);
+
+  //! Permutes the space dimensions of the constraint.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Returns the constraint type of \p *this.
+  Type type() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an equality constraint.
+  */
+  bool is_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is an inequality constraint (either strict or non-strict).
+  */
+  bool is_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a non-strict inequality constraint.
+  */
+  bool is_nonstrict_inequality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a strict inequality constraint.
+  */
+  bool is_strict_inequality() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! The unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  static const Constraint& zero_dim_false();
+
+  /*! \brief
+    The true (zero-dimension space) constraint \f$0 \leq 1\f$,
+    also known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint& zero_dim_positivity();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is a tautology (i.e., an always true constraint).
+
+    A tautology can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 = 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b \geq 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b > 0\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false constraint).
+
+    An inconsistent constraint can have either one of the following forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b = 0\f$,
+      where \f$b \neq 0\f$; or
+    - a non-strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b \geq 0\f$,
+      where \f$b < 0\f$; or
+    - a strict inequality: \f$\sum_{i=0}^{n-1} 0 x_i + b > 0\f$,
+      where \f$b \leq 0\f$.
+  */
+  bool is_inconsistent() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent constraints.
+
+    Constraints having different space dimensions are not equivalent.
+    Note that constraints having different types may nonetheless be
+    equivalent, if they both are tautologies or inconsistent.
+  */
+  bool is_equivalent_to(const Constraint& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  /*!
+    This is faster than is_equivalent_to(), but it may return `false' even
+    for equivalent constraints.
+  */
+  bool is_equal_to(const Constraint& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Constraint& y);
+
+  //! Returns the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  static const Constraint& epsilon_geq_zero();
+
+  /*! \brief
+    The zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint& epsilon_leq_one();
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Hide_Last<Linear_Expression> expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+private:
+
+  //! The possible kinds of Constraint objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+  Linear_Expression expr;
+
+  Kind kind_;
+
+  Topology topology_;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the unsatisfiable (zero-dimension space) constraint \f$0 = 1\f$.
+  */
+  static const Constraint* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) constraint \f$0 \leq 1\f$, also
+    known as <EM>positivity constraint</EM>.
+  */
+  static const Constraint* zero_dim_positivity_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \geq 0\f$.
+  */
+  static const Constraint* epsilon_geq_zero_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the zero-dimension space constraint \f$\epsilon \leq 1\f$
+    (used to implement NNC polyhedra).
+  */
+  static const Constraint* epsilon_leq_one_p;
+
+  //! Constructs the \f$0<0\f$ constraint.
+  Constraint(dimension_type space_dim, Kind kind, Topology topology,
+             Representation r = default_representation);
+
+  /*! \brief
+    Builds a constraint of kind \p kind and topology \p topology,
+    stealing the coefficients from \p e.
+
+    \note The new Constraint will have the same representation as `e'.
+  */
+  Constraint(Linear_Expression& e, Kind kind, Topology topology);
+
+  /*! \brief
+    Builds a constraint of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+
+    \note The new Constraint will have the same representation as `e'.
+  */
+  Constraint(Linear_Expression& e, Type type, Topology topology);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+
+  // TODO: Consider setting the epsilon dimension in this method.
+  //! Sets to \p x the topological kind of \p *this row.
+  void set_topology(Topology x);
+
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+  //@} // Flags coercion methods
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid objects.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* name_var,
+                               Variable v) const;
+
+  //! Returns the epsilon coefficient. The constraint must be NNC.
+  Coefficient_traits::const_reference epsilon_coefficient() const;
+
+  //! Sets the epsilon coefficient to \p n. The constraint must be NNC.
+  void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Sets the constraint type to <CODE>EQUALITY</CODE>.
+  void set_is_equality();
+
+  //! Sets the constraint to be an inequality.
+  /*!
+    Whether the constraint type will become <CODE>NONSTRICT_INEQUALITY</CODE>
+    or <CODE>STRICT_INEQUALITY</CODE> depends on the topology and the value
+    of the low-level coefficients of the constraint.
+  */
+  void set_is_inequality();
+
+  //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+  /*!
+    \param y
+    The Constraint that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting Constraint to \p *this and normalizes it.
+  */
+  void linear_combine(const Constraint& y, dimension_type i);
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Constraint objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Constraint::normalize() and Constraint::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  /*! \brief
+    Builds a new copy of the zero-dimension space constraint
+    \f$\epsilon \geq 0\f$ (used to implement NNC polyhedra).
+  */
+  static Constraint construct_epsilon_geq_zero();
+
+  friend int
+  compare(const Constraint& x, const Constraint& y);
+
+  friend class Linear_System<Constraint>;
+  friend class Constraint_System;
+  friend class Polyhedron;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+  friend class Termination_Helpers;
+  friend class Grid;
+  template <typename T>
+  friend class Octagonal_Shape;
+
+  friend Constraint
+  operator<(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator<(Variable v1, Variable v2);
+
+  friend Constraint
+  operator<(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator<(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator>(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator>(Variable v1, Variable v2);
+
+  friend Constraint
+  operator>(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator>(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator==(Variable v1, Variable v2);
+
+  friend Constraint
+  operator==(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator==(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator<=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator<=(Variable v1, Variable v2);
+
+  friend Constraint
+  operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+
+  friend Constraint
+  operator>=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+  friend Constraint
+  operator>=(Variable v1, Variable v2);
+
+  friend Constraint
+  operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+  friend Constraint
+  operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint& c);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream& operator<<(std::ostream& s, const Constraint::Type& t);
+
+} // namespace IO_Operators
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator==(const Constraint& x, const Constraint& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Constraint */
+bool
+operator!=(const Constraint& x, const Constraint& y);
+
+/*! \relates Constraint */
+void swap(Constraint& x, Constraint& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_inlines.hh line 1. */
+/* Constraint class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Constraint::is_necessarily_closed() const {
+  return (topology_ == NECESSARILY_CLOSED);
+}
+
+inline bool
+Constraint::is_not_necessarily_closed() const {
+  return !is_necessarily_closed();
+}
+
+inline Constraint::expr_type
+Constraint::expression() const {
+  return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+  return expression().space_dimension();
+}
+
+inline void
+Constraint::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Constraint::is_line_or_equality() const {
+  return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Constraint::is_ray_or_point_or_inequality() const {
+  return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Constraint::topology() const {
+  return topology_;
+}
+
+inline void
+Constraint::set_is_line_or_equality() {
+  kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Constraint::set_is_ray_or_point_or_inequality() {
+  kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Constraint::set_topology(Topology x) {
+  if (topology() == x)
+    return;
+  if (topology() == NECESSARILY_CLOSED) {
+    // Add a column for the epsilon dimension.
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  }
+  else {
+    PPL_ASSERT(expr.space_dimension() != 0);
+    expr.set_space_dimension(expr.space_dimension() - 1);
+  }
+  topology_ = x;
+}
+
+inline void
+Constraint::mark_as_necessarily_closed() {
+  PPL_ASSERT(is_not_necessarily_closed());
+  topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::mark_as_not_necessarily_closed() {
+  PPL_ASSERT(is_necessarily_closed());
+  topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Constraint::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Constraint::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Constraint::Constraint(Representation r)
+  : expr(r),
+    kind_(RAY_OR_POINT_OR_INEQUALITY),
+    topology_(NECESSARILY_CLOSED) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(dimension_type space_dim, Kind kind, Topology topology,
+                       Representation r)
+  : expr(r),
+    kind_(kind),
+    topology_(topology) {
+  expr.set_space_dimension(space_dim + 1);
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Kind kind, Topology topology)
+  : kind_(kind),
+    topology_(topology) {
+  PPL_ASSERT(kind != RAY_OR_POINT_OR_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    // Add the epsilon dimension.
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  strong_normalize();
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology)
+  : topology_(topology) {
+  PPL_ASSERT(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  if (type == EQUALITY)
+    kind_ = LINE_OR_EQUALITY;
+  else
+    kind_ = RAY_OR_POINT_OR_INEQUALITY;
+  strong_normalize();
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+  : expr(c.expr),
+    kind_(c.kind_),
+    topology_(c.topology_) {
+  // NOTE: This does not call PPL_ASSERT(OK()) because this is called by OK().
+}
+
+inline
+Constraint::Constraint(const Constraint& c, Representation r)
+  : expr(c.expr, r),
+    kind_(c.kind_),
+    topology_(c.topology_) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim)
+  : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+    kind_(c.kind_), topology_(c.topology_) {
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type space_dim,
+                       Representation r)
+  : expr(c.expr, c.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+    kind_(c.kind_), topology_(c.topology_) {
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+  Constraint tmp = c;
+  swap(*this, tmp);
+
+  return *this;
+}
+
+inline Representation
+Constraint::representation() const {
+  return expr.representation();
+}
+
+inline void
+Constraint::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+  return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Constraint::set_space_dimension_no_ok(dimension_type space_dim) {
+  const dimension_type old_expr_space_dim = expr.space_dimension();
+  if (topology() == NECESSARILY_CLOSED) {
+    expr.set_space_dimension(space_dim);
+  }
+  else {
+    const dimension_type old_space_dim = space_dimension();
+    if (space_dim > old_space_dim) {
+      expr.set_space_dimension(space_dim + 1);
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+    }
+    else {
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+      expr.set_space_dimension(space_dim + 1);
+    }
+  }
+  PPL_ASSERT(space_dimension() == space_dim);
+  if (expr.space_dimension() < old_expr_space_dim)
+    strong_normalize();
+}
+
+inline void
+Constraint::set_space_dimension(dimension_type space_dim) {
+  set_space_dimension_no_ok(space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline bool
+Constraint::remove_space_dimensions(const Variables_Set& vars) {
+  expr.remove_space_dimensions(vars);
+  return true;
+}
+
+inline bool
+Constraint::is_equality() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Constraint::is_inequality() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline Constraint::Type
+Constraint::type() const {
+  if (is_equality())
+    return EQUALITY;
+  if (is_necessarily_closed())
+    return NONSTRICT_INEQUALITY;
+  if (epsilon_coefficient() < 0)
+    return STRICT_INEQUALITY;
+  else
+    return NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_nonstrict_inequality() const {
+  return type() == NONSTRICT_INEQUALITY;
+}
+
+inline bool
+Constraint::is_strict_inequality() const {
+  return type() == STRICT_INEQUALITY;
+}
+
+inline void
+Constraint::set_is_equality() {
+  set_is_line_or_equality();
+}
+
+inline void
+Constraint::set_is_inequality() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Constraint::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+  return expr.inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Constraint::strong_normalize() {
+  expr.normalize();
+  sign_normalize();
+}
+
+/*! \relates Constraint */
+inline bool
+operator==(const Constraint& x, const Constraint& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline bool
+operator!=(const Constraint& x, const Constraint& y) {
+  return !x.is_equivalent_to(y);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff(e1,
+                         std::max(e1.space_dimension(), e2.space_dimension()),
+                         Constraint::default_representation);
+  diff -= e2;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Variable v1, Variable v2) {
+  if (v1.space_dimension() > v2.space_dimension())
+    swap(v1, v2);
+  PPL_ASSERT(v1.space_dimension() <= v2.space_dimension());
+
+  Linear_Expression diff(v1, Constraint::default_representation);
+  diff -= v2;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff(e1,
+                         std::max(e1.space_dimension(), e2.space_dimension()),
+                         Constraint::default_representation);
+  diff -= e2;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Variable v1, const Variable v2) {
+  Linear_Expression diff(Constraint::default_representation);
+  diff.set_space_dimension(std::max(v1.space_dimension(),
+                                    v2.space_dimension()));
+  diff += v1;
+  diff -= v2;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+  Linear_Expression diff(e1, Constraint::default_representation);
+  diff -= e2;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  // NOTE: this also enforces normalization.
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Variable v1, const Variable v2) {
+  Linear_Expression diff(Constraint::default_representation);
+  diff.set_space_dimension(std::max(v1.space_dimension(),
+                                    v2.space_dimension()));
+  diff += v1;
+  diff -= v2;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  neg_assign(diff);
+  diff += n;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  neg_assign(diff);
+  diff += n;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  neg_assign(diff);
+  diff += n;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  // NOTE: this also enforces normalization.
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  diff -= n;
+  return Constraint(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  diff -= n;
+  return Constraint(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  Linear_Expression diff(e, Constraint::default_representation);
+  diff -= n;
+  Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+
+  // NOTE: this also enforces normalization.
+  c.set_epsilon_coefficient(-1);
+  PPL_ASSERT(c.OK());
+
+  return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 >= e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Variable v1, const Variable v2) {
+  return v2 >= v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e >= n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n >= e;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return e2 > e1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Variable v1, const Variable v2) {
+  return v2 > v1;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+  return e > n;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return n > e;
+}
+
+inline const Constraint&
+Constraint::zero_dim_false() {
+  PPL_ASSERT(zero_dim_false_p != 0);
+  return *zero_dim_false_p;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+  PPL_ASSERT(zero_dim_positivity_p != 0);
+  return *zero_dim_positivity_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+  PPL_ASSERT(epsilon_geq_zero_p != 0);
+  return *epsilon_geq_zero_p;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+  PPL_ASSERT(epsilon_leq_one_p != 0);
+  return *epsilon_leq_one_p;
+}
+
+inline void
+Constraint::m_swap(Constraint& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(kind_, y.kind_);
+  swap(topology_, y.topology_);
+}
+
+inline Coefficient_traits::const_reference
+Constraint::epsilon_coefficient() const {
+  PPL_ASSERT(is_not_necessarily_closed());
+  return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+inline void
+Constraint::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+  PPL_ASSERT(is_not_necessarily_closed());
+  expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+/*! \relates Constraint */
+inline void
+swap(Constraint& x, Constraint& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constraint_defs.hh line 835. */
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 1. */
+/* Generator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+class Generator_System_const_iterator;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Generator_System;
+
+}
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 38. */
+
+/* Automatically generated from PPL source file ../src/distances_defs.hh line 1. */
+/* Class declarations for several distances.
+*/
+
+
+/* Automatically generated from PPL source file ../src/distances_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization;
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization;
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/distances_defs.hh line 29. */
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Rectilinear_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::Euclidean_Distance_Specialization {
+  static void combine(Temp& running, Temp& current, Rounding_Dir dir);
+
+  static void finalize(Temp& running, Rounding_Dir dir);
+};
+
+
+template <typename Temp>
+struct Parma_Polyhedra_Library::L_Infinity_Distance_Specialization {
+  static void combine(Temp& running, const Temp& current, Rounding_Dir);
+
+  static void finalize(Temp&, Rounding_Dir);
+};
+
+/* Automatically generated from PPL source file ../src/distances_inlines.hh line 1. */
+/* Inline functions implementing distances.
+*/
+
+
+/* Automatically generated from PPL source file ../src/distances_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+// A struct to work around the lack of partial specialization
+// of function templates in C++.
+template <typename To, typename From>
+struct maybe_assign_struct {
+  static inline Result
+  function(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+    // When `To' and `From' are different types, we make the conversion
+    // and use `tmp'.
+    top = &tmp;
+    return assign_r(tmp, from, dir);
+  }
+};
+
+template <typename Type>
+struct maybe_assign_struct<Type, Type> {
+  static inline Result
+  function(const Type*& top, Type&, const Type& from, Rounding_Dir) {
+    // When the types are the same, conversion is unnecessary.
+    top = &from;
+    return V_EQ;
+  }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Assigns to \p top a pointer to a location that holds the
+  conversion, according to \p dir, of \p from to type \p To.  When
+  necessary, and only when necessary, the variable \p tmp is used to
+  hold the result of conversion.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename To, typename From>
+inline Result
+maybe_assign(const To*& top, To& tmp, const From& from, Rounding_Dir dir) {
+  return maybe_assign_struct<To, From>::function(top, tmp, from, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::combine(Temp& running,
+                                                   const Temp& current,
+                                                   Rounding_Dir dir) {
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Rectilinear_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::combine(Temp& running,
+                                                 Temp& current,
+                                                 Rounding_Dir dir) {
+  mul_assign_r(current, current, current, dir);
+  add_assign_r(running, running, current, dir);
+}
+
+template <typename Temp>
+inline void
+Euclidean_Distance_Specialization<Temp>::finalize(Temp& running,
+                                                  Rounding_Dir dir) {
+  sqrt_assign_r(running, running, dir);
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::combine(Temp& running,
+                                                  const Temp& current,
+                                                  Rounding_Dir) {
+  if (current > running)
+    running = current;
+}
+
+template <typename Temp>
+inline void
+L_Infinity_Distance_Specialization<Temp>::finalize(Temp&, Rounding_Dir) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/distances_defs.hh line 53. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 1. */
+/* Expression_Hide_Inhomo class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 32. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  An adapter for Linear_Expression that hides the inhomogeneous term.
+
+  The methods of this class always pretend that the value of the
+  inhomogeneous term is zero.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::Expression_Hide_Inhomo
+  : public Expression_Adapter<T> {
+  typedef Expression_Adapter<T> base_type;
+public:
+  //! The type of this object.
+  typedef Expression_Hide_Inhomo<T> const_reference;
+  //! The type obtained by one-level unwrapping.
+  typedef typename base_type::inner_type inner_type;
+  //! The raw, completely unwrapped type.
+  typedef typename base_type::raw_type raw_type;
+
+  //! Constructor.
+  explicit Expression_Hide_Inhomo(const raw_type& expr);
+
+public:
+  //! The type of const iterators on coefficients.
+  typedef typename base_type::const_iterator const_iterator;
+
+  //! Returns the constant zero.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is zero.
+  bool is_zero() const;
+
+  /*! \brief Returns \p true if \p *this is equal to \p y.
+
+    Note that <CODE>(*this == y)</CODE> has a completely different meaning.
+  */
+  template <typename Expression>
+  bool is_equal_to(const Expression& y) const;
+
+  //! Returns the i-th coefficient.
+  Coefficient_traits::const_reference get(dimension_type i) const;
+
+  //! Returns the coefficient of v.
+  Coefficient_traits::const_reference get(Variable v) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the coefficient of each variable in
+    \p vars is zero.
+  */
+  bool all_zeroes(const Variables_Set& vars) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if (*this)[i] is zero,
+    for each i in [start, end).
+  */
+  bool all_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the number of zero coefficient in [start, end).
+  */
+  dimension_type num_zeroes(dimension_type start, dimension_type end) const;
+
+  /*! \brief
+    Returns the gcd of the nonzero coefficients in [start,end). If all the
+    coefficients in this range are zero, returns zero.
+  */
+  Coefficient gcd(dimension_type start, dimension_type end) const;
+
+  //! Returns the index of the last nonzero element, or zero if there are no
+  //! nonzero elements.
+  dimension_type last_nonzero() const;
+
+  //! Returns the index of the last nonzero element in [first,last), or last
+  //! if there are no nonzero elements.
+  dimension_type last_nonzero(dimension_type first, dimension_type last) const;
+
+  //! Returns the index of the first nonzero element, or \p last if there
+  //! are no nonzero elements, considering only elements in [first,last).
+  dimension_type first_nonzero(dimension_type first, dimension_type last) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if all coefficients in [start,end),
+    except those corresponding to variables in \p vars, are zero.
+  */
+  bool all_zeroes_except(const Variables_Set& vars,
+                         dimension_type start, dimension_type end) const;
+
+  //! Removes from set \p x all the indexes of nonzero elements in \p *this.
+  void has_a_free_dimension_helper(std::set<dimension_type>& x) const;
+
+  //! Returns \c true if <CODE>(*this)[i]</CODE> is equal to <CODE>y[i]</CODE>,
+  //! for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   dimension_type start, dimension_type end) const;
+
+  //! Returns \c true if <CODE>(*this)[i]*c1</CODE> is equal to
+  //! <CODE>y[i]*c2</CODE>, for each i in [start,end).
+  template <typename Expression>
+  bool is_equal_to(const Expression& y,
+                   Coefficient_traits::const_reference c1,
+                   Coefficient_traits::const_reference c2,
+                   dimension_type start, dimension_type end) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Dense_Row& row) const;
+
+  //! Sets \p row to a copy of the row as adapted by \p *this.
+  void get_row(Sparse_Row& row) const;
+};
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_inlines.hh line 1. */
+/* Expression_Hide_Inhomo class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Expression_Hide_Inhomo<T>::Expression_Hide_Inhomo(const raw_type& expr)
+  : base_type(expr) {
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::inhomogeneous_term() const {
+  // Pretend it is zero.
+  return Coefficient_zero();
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::is_zero() const {
+  // Don't check the inhomogeneous_term (i.e., pretend it is zero).
+  return this->inner().all_homogeneous_terms_are_zero();
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y) const {
+  const dimension_type x_dim = this->space_dimension();
+  const dimension_type y_dim = y.space_dimension();
+  if (x_dim != y_dim)
+    return false;
+  if (y.inhomogeneous_term() != 0)
+    return false;
+  // Note that the inhomogeneous term is not compared.
+  return this->inner().is_equal_to(y, 1, x_dim + 1);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(dimension_type i) const {
+  if (i == 0)
+    return Coefficient_zero();
+  else
+    return this->inner().get(i);
+}
+
+template <typename T>
+inline Coefficient_traits::const_reference
+Expression_Hide_Inhomo<T>::get(Variable v) const {
+  return this->inner().get(v);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes(const Variables_Set& vars) const {
+  return this->inner().all_zeroes(vars);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>::all_zeroes(dimension_type start,
+                                      dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().all_zeroes(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::num_zeroes(dimension_type start,
+                                      dimension_type end) const {
+  if (start == end)
+    return 0;
+  dimension_type nz = 0;
+  if (start == 0) {
+    ++start;
+    ++nz;
+  }
+  nz += this->inner().num_zeroes(start, end);
+  return nz;
+}
+
+template <typename T>
+inline Coefficient
+Expression_Hide_Inhomo<T>::gcd(dimension_type start,
+                               dimension_type end) const {
+  if (start == end)
+    return Coefficient_zero();
+  if (start == 0)
+    ++start;
+  return this->inner().gcd(start, end);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero() const {
+  return this->inner().last_nonzero();
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::last_nonzero(dimension_type first,
+                                        dimension_type last) const {
+  if (first == last)
+    return last;
+  if (first == 0)
+    ++first;
+  return this->inner().last_nonzero(first, last);
+}
+
+template <typename T>
+inline dimension_type
+Expression_Hide_Inhomo<T>::first_nonzero(dimension_type first,
+                                         dimension_type last) const {
+  if (first == last)
+    return last;
+  if (first == 0)
+    ++first;
+  return this->inner().first_nonzero(first, last);
+}
+
+template <typename T>
+inline bool
+Expression_Hide_Inhomo<T>
+::all_zeroes_except(const Variables_Set& vars,
+                    dimension_type start, dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().all_zeroes_except(vars, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>
+::has_a_free_dimension_helper(std::set<dimension_type>& y) const {
+  bool had_0 = (y.count(0) == 1);
+  this->inner().has_a_free_dimension_helper(y);
+  if (had_0)
+    y.insert(0);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+              dimension_type start, dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().is_equal_to(y, start, end);
+}
+
+template <typename T>
+template <typename Expression>
+inline bool
+Expression_Hide_Inhomo<T>
+::is_equal_to(const Expression& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  if (start == end)
+    return true;
+  if (start == 0)
+    ++start;
+  return this->inner().is_equal_to(y, c1, c2, start, end);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Dense_Row& row) const {
+  this->inner().get_row(row);
+  row.reset(0);
+}
+
+template <typename T>
+inline void
+Expression_Hide_Inhomo<T>::get_row(Sparse_Row& row) const {
+  this->inner().get_row(row);
+  row.reset(0);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Expression_Hide_Inhomo_defs.hh line 146. */
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 46. */
+
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Generator
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Generator& x, const Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Generator */
+void swap(Generator& x, Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A line, ray, point or closure point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Generator is one of the following:
+
+  - a line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a ray \f$\vect{r} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a closure point
+    \f$\vect{c} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for points and closure points, \f$d > 0\f$ is the divisor.
+
+  \par A note on terminology.
+  As observed in Section \ref representation, there are cases when,
+  in order to represent a polyhedron \f$\cP\f$ using the generator system
+  \f$\cG = (L, R, P, C)\f$, we need to include in the finite set
+  \f$P\f$ even points of \f$\cP\f$ that are <EM>not</EM> vertices
+  of \f$\cP\f$.
+  This situation is even more frequent when working with NNC polyhedra
+  and it is the reason why we prefer to use the word `point'
+  where other libraries use the word `vertex'.
+
+  \par How to build a generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>line</CODE>, <CODE>ray</CODE>, <CODE>point</CODE>
+  or <CODE>closure_point</CODE>) to a linear expression,
+  representing a direction in the space;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining points and closure points, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Generator l = line(x - y - z);
+  \endcode
+  As mentioned above, the constant term of the linear expression
+  is not relevant. Thus, the following code has the same effect:
+  \code
+  Generator l = line(x - y - z + 15);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Generator l = line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds a ray with the same direction as the
+  line in Example 1:
+  \code
+  Generator r = ray(x - y - z);
+  \endcode
+  As is the case for lines, when specifying a ray the constant term
+  of the linear expression is not relevant; also, an exception is thrown
+  when trying to build a ray from the origin of the space.
+
+  \par Example 3
+  The following code builds the point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Generator p = point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Generator p = point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Generator origin3 = point(0*x + 0*y + 0*z);
+  Generator origin3_alt = point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Generator origin2 = point(0*y);
+  \endcode
+  The following two lines of code both define the only point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Generator origin0 = Generator::zero_dim_point();
+  Generator origin0_alt = point();
+  \endcode
+
+  \par Example 4
+  The point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>point</CODE> (the divisor):
+  \code
+  Generator p = point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be usefully exploited to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the point
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Generator q = point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Closure points are specified in the same way we defined points,
+  but invoking their specific constructor function.
+  For instance, the closure point
+  \f$\vect{c} = (1, 0, 2)^\transpose \in \Rset^3\f$ is defined by
+  \code
+  Generator c = closure_point(1*x + 0*y + 2*z);
+  \endcode
+  For the particular case of the (only) closure point
+  having space dimension zero, we can use any of the following:
+  \code
+  Generator closure_origin0 = Generator::zero_dim_closure_point();
+  Generator closure_origin0_alt = closure_point();
+  \endcode
+
+  \par How to inspect a generator
+  Several methods are provided to examine a generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a generator.
+  If <CODE>g1</CODE> is a point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the closure point <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Generator g2 = closure_point(e, g1.divisor());
+    cout << "Closure point g2: " << g2 << endl;
+  }
+  else
+    cout << "Generator g1 is not a point." << endl;
+  \endcode
+  Therefore, for the point
+  \code
+  Generator g1 = point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Point g1: p((2*A - B + 3*C)/2)
+  Closure point g2: cp((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with (closure) points, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor of the (closure) point is 1.
+*/
+class Parma_Polyhedra_Library::Generator {
+public:
+
+  //! The representation used for new Generators.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator line(const Linear_Expression& e,
+                        Representation r = default_representation);
+
+  //! Returns the ray of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Generator ray(const Linear_Expression& e,
+                       Representation r = default_representation);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator point(const Linear_Expression& e
+                         = Linear_Expression::zero(),
+                         Coefficient_traits::const_reference d
+                         = Coefficient_one(),
+                         Representation r = default_representation);
+
+  //! Returns the origin.
+  static Generator point(Representation r);
+
+  //! Returns the point at \p e.
+  static Generator point(const Linear_Expression& e,
+                         Representation r);
+
+  //! Constructs the point at the origin.
+  explicit Generator(Representation r = default_representation);
+
+  //! Returns the closure point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Generator
+  closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+                Coefficient_traits::const_reference d = Coefficient_one(),
+                Representation r = default_representation);
+
+  //! Returns the closure point at the origin.
+  static Generator
+  closure_point(Representation r);
+
+  //! Returns the closure point at \p e.
+  static Generator
+  closure_point(const Linear_Expression& e, Representation r);
+
+  //! Ordinary copy constructor.
+  //! The representation of the new Generator will be the same as g.
+  Generator(const Generator& g);
+
+  //! Copy constructor with given representation.
+  Generator(const Generator& g, Representation r);
+
+  //! Copy constructor with given space dimension.
+  //! The representation of the new Generator will be the same as g.
+  Generator(const Generator& g, dimension_type space_dim);
+
+  //! Copy constructor with given representation and space dimension.
+  Generator(const Generator& g, dimension_type space_dim, Representation r);
+
+  //! Destructor.
+  ~Generator();
+
+  //! Assignment operator.
+  Generator& operator=(const Generator& g);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the generator.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+
+    If all dimensions with nonzero coefficients are removed from a ray or a
+    line, it is changed into a point and this method returns \p false .
+    Otherwise, it returns \p true .
+  */
+  bool remove_space_dimensions(const Variables_Set& vars);
+
+  //! Permutes the space dimensions of the generator.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a line. */
+    LINE,
+    /*! The generator is a ray. */
+    RAY,
+    /*! The generator is a point. */
+    POINT,
+    /*! The generator is a closure point. */
+    CLOSURE_POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a ray.
+  bool is_ray() const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line or a ray.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_line_or_ray() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a closure point.
+  bool is_closure_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! If \p *this is either a point or a closure point, returns its divisor.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is neither a point nor a closure point.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Generator& zero_dim_point();
+
+  /*! \brief
+    Returns, as a closure point,
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator& zero_dim_closure_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Generator& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  /*!
+    This is faster than is_equivalent_to(), but it may return `false' even
+    for equivalent generators.
+  */
+  bool is_equal_to(const Generator& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Generator& y);
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+  expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+private:
+  //! The possible kinds of Generator objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+  //! The linear expression encoding \p *this.
+  Linear_Expression expr;
+
+  //! The kind of \p *this.
+  Kind kind_;
+
+  //! The topology of \p *this.
+  Topology topology_;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Generator* zero_dim_point_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$, as a closure point.
+  */
+  static const Generator* zero_dim_closure_point_p;
+
+  /*! \brief
+    Builds a generator of type \p type and topology \p topology,
+    stealing the coefficients from \p e.
+
+    If the topology is NNC, the last dimension of \p e is used as the epsilon
+    coefficient.
+  */
+  Generator(Linear_Expression& e, Type type, Topology topology);
+
+  Generator(Linear_Expression& e, Kind kind, Topology topology);
+
+  Generator(dimension_type space_dim, Kind kind, Topology topology,
+            Representation r = default_representation);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+
+  //! Sets to \p x the topological kind of \p *this row.
+  void set_topology(Topology x);
+
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+  //@} // Flags coercion methods
+
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The row topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The row topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+  /*!
+    \param y
+    The Generator that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting Generator to \p *this and normalizes it.
+  */
+  void linear_combine(const Generator& y, dimension_type i);
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid objects.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* v_name,
+                               Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception
+    containing the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+  bool is_ray_or_point() const;
+
+  //! Sets the Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_ray_or_point();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the closure point
+    \p *this has the same \e coordinates of the point \p p.
+
+    It is \e assumed that \p *this is a closure point, \p p is a point
+    and both topologies and space dimensions agree.
+  */
+  bool is_matching_closure_point(const Generator& p) const;
+
+  //! Returns the epsilon coefficient. The generator must be NNC.
+  Coefficient_traits::const_reference epsilon_coefficient() const;
+
+  //! Sets the epsilon coefficient to \p n. The generator must be NNC.
+  void set_epsilon_coefficient(Coefficient_traits::const_reference n);
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Generator objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Generator::normalize() and Generator::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  /*! \brief
+    A print function, with fancy, more human-friendly output.
+
+    This is used by operator<<().
+  */
+  void fancy_print(std::ostream& s) const;
+
+  friend class Expression_Adapter<Generator>;
+  friend class Linear_System<Generator>;
+  friend class Parma_Polyhedra_Library::Scalar_Products;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+  friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Assign;
+  friend class Parma_Polyhedra_Library::Generator_System;
+  friend class Parma_Polyhedra_Library::Generator_System_const_iterator;
+  // FIXME: the following friend declaration should be avoided.
+  friend class Parma_Polyhedra_Library::Polyhedron;
+  // This is for access to Linear_Expression in `insert'.
+  friend class Parma_Polyhedra_Library::Grid_Generator_System;
+  friend class Parma_Polyhedra_Library::MIP_Problem;
+  friend class Parma_Polyhedra_Library::Grid;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+                                                    const Generator& g);
+
+  friend int
+  compare(const Generator& x, const Generator& y);
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator::line(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e,
+               Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::ray(const Linear_Expression& e, Representation r).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e,
+              Representation r = Generator::default_representation);
+
+/*! \brief
+  Shorthand for
+  Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+      Coefficient_traits::const_reference d = Coefficient_one(),
+      Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::point(Representation r).
+/*! \relates Generator */
+Generator
+point(Representation r);
+
+/*! \brief
+  Shorthand for
+  Generator::point(const Linear_Expression& e, Representation r).
+
+  \relates Generator
+*/
+Generator
+point(const Linear_Expression& e, Representation r);
+
+/*! \brief
+  Shorthand for
+  Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+              Coefficient_traits::const_reference d = Coefficient_one(),
+              Representation r = Generator::default_representation);
+
+//! Shorthand for Generator::closure_point(Representation r).
+/*! \relates Generator */
+Generator
+closure_point(Representation r);
+
+/*! \brief
+  Shorthand for
+  Generator::closure_point(const Linear_Expression& e, Representation r).
+
+  \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Generator */
+bool operator==(const Generator& x, const Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Generator */
+bool operator!=(const Generator& x, const Generator& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Generator
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Generator& x,
+                                 const Generator& y,
+                                 Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Generator
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Generator& x,
+                               const Generator& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Generator
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+
+  \note
+  Distances are \e only defined between generators that are points and/or
+  closure points; for rays or lines, \c false is returned.
+*/
+template <typename Temp, typename To>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Generator& x,
+                                const Generator& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Generator_inlines.hh line 1. */
+/* Generator class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Generator::is_necessarily_closed() const {
+  return (topology() == NECESSARILY_CLOSED);
+}
+
+inline bool
+Generator::is_not_necessarily_closed() const {
+  return (topology() == NOT_NECESSARILY_CLOSED);
+}
+
+inline Generator::expr_type
+Generator::expression() const {
+  return expr_type(expr, is_not_necessarily_closed());
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+  return expression().space_dimension();
+}
+
+inline bool
+Generator::is_line_or_equality() const {
+  return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Generator::is_ray_or_point_or_inequality() const {
+  return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Generator::topology() const {
+  return topology_;
+}
+
+inline void
+Generator::set_is_line_or_equality() {
+  kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Generator::set_is_ray_or_point_or_inequality() {
+  kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Generator::set_topology(Topology x) {
+  if (topology() == x)
+    return;
+  if (topology() == NECESSARILY_CLOSED) {
+    // Add a column for the epsilon dimension.
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  }
+  else {
+    PPL_ASSERT(expr.space_dimension() > 0);
+    expr.set_space_dimension(expr.space_dimension() - 1);
+  }
+  topology_ = x;
+}
+
+inline void
+Generator::mark_as_necessarily_closed() {
+  PPL_ASSERT(is_not_necessarily_closed());
+  topology_ = NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::mark_as_not_necessarily_closed() {
+  PPL_ASSERT(is_necessarily_closed());
+  topology_ = NOT_NECESSARILY_CLOSED;
+}
+
+inline void
+Generator::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Generator::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Generator::Generator(Representation r)
+  : expr(r),
+    kind_(RAY_OR_POINT_OR_INEQUALITY),
+    topology_(NECESSARILY_CLOSED) {
+  expr.set_inhomogeneous_term(Coefficient_one());
+  PPL_ASSERT(space_dimension() == 0);
+  PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(dimension_type space_dim, Kind kind, Topology topology,
+                     Representation r)
+  : expr(r),
+    kind_(kind),
+    topology_(topology) {
+  if (is_necessarily_closed())
+    expr.set_space_dimension(space_dim);
+  else
+    expr.set_space_dimension(space_dim + 1);
+  PPL_ASSERT(space_dimension() == space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology)
+  : topology_(topology) {
+  PPL_ASSERT(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  if (type == LINE)
+    kind_ = LINE_OR_EQUALITY;
+  else
+    kind_ = RAY_OR_POINT_OR_INEQUALITY;
+  strong_normalize();
+}
+
+inline
+Generator::Generator(Linear_Expression& e, Kind kind, Topology topology)
+  : kind_(kind),
+    topology_(topology) {
+  swap(expr, e);
+  if (topology == NOT_NECESSARILY_CLOSED)
+    expr.set_space_dimension(expr.space_dimension() + 1);
+  strong_normalize();
+}
+
+inline
+Generator::Generator(const Generator& g)
+  : expr(g.expr),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+}
+
+inline
+Generator::Generator(const Generator& g, Representation r)
+  : expr(g.expr, r),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+  // This does not assert OK() because it's called by OK().
+  PPL_ASSERT(OK());
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim)
+  : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1)),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type space_dim,
+                     Representation r)
+  : expr(g.expr, g.is_necessarily_closed() ? space_dim : (space_dim + 1), r),
+    kind_(g.kind_),
+    topology_(g.topology_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+  Generator tmp = g;
+  swap(*this, tmp);
+
+  return *this;
+}
+
+inline Representation
+Generator::representation() const {
+  return expr.representation();
+}
+
+inline void
+Generator::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+  return Linear_Expression::max_space_dimension();
+}
+
+inline void
+Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+  const dimension_type old_expr_space_dim = expr.space_dimension();
+  if (topology() == NECESSARILY_CLOSED) {
+    expr.set_space_dimension(space_dim);
+  }
+  else {
+    const dimension_type old_space_dim = space_dimension();
+    if (space_dim > old_space_dim) {
+      expr.set_space_dimension(space_dim + 1);
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+    }
+    else {
+      expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+      expr.set_space_dimension(space_dim + 1);
+    }
+  }
+  PPL_ASSERT(space_dimension() == space_dim);
+  if (expr.space_dimension() < old_expr_space_dim)
+    strong_normalize();
+}
+
+inline void
+Generator::set_space_dimension(dimension_type space_dim) {
+  set_space_dimension_no_ok(space_dim);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Generator::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline bool
+Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Generator::is_ray_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline bool
+Generator::is_line_or_ray() const {
+  return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Generator::is_ray() const {
+  return is_ray_or_point() && is_line_or_ray();
+}
+
+inline Generator::Type
+Generator::type() const {
+  if (is_line())
+    return LINE;
+  if (is_line_or_ray())
+    return RAY;
+  if (is_necessarily_closed())
+    return POINT;
+  else {
+    // Checking the value of the epsilon coefficient.
+    if (epsilon_coefficient() == 0)
+      return CLOSURE_POINT;
+    else
+      return POINT;
+  }
+}
+
+inline bool
+Generator::is_point() const {
+  return type() == POINT;
+}
+
+inline bool
+Generator::is_closure_point() const {
+  return type() == CLOSURE_POINT;
+}
+
+inline void
+Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Generator::set_is_ray_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Coefficient_traits::const_reference
+Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+  Coefficient_traits::const_reference d = expr.inhomogeneous_term();
+  if (!is_ray_or_point() || d == 0)
+    throw_invalid_argument("divisor()",
+                           "*this is neither a point nor a closure point");
+  return d;
+}
+
+inline Coefficient_traits::const_reference
+Generator::epsilon_coefficient() const {
+  PPL_ASSERT(is_not_necessarily_closed());
+  return expr.coefficient(Variable(expr.space_dimension() - 1));
+}
+
+
+inline void
+Generator::set_epsilon_coefficient(Coefficient_traits::const_reference n) {
+  PPL_ASSERT(is_not_necessarily_closed());
+  expr.set_coefficient(Variable(expr.space_dimension() - 1), n);
+}
+
+
+inline memory_size_type
+Generator::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Generator::strong_normalize() {
+  expr.normalize();
+  sign_normalize();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+  PPL_ASSERT(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+  PPL_ASSERT(zero_dim_closure_point_p != 0);
+  return *zero_dim_closure_point_p;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e, Representation r) {
+  return Generator::line(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e, Representation r) {
+  return Generator::ray(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d,
+      Representation r) {
+  return Generator::point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(Representation r) {
+  return Generator::point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Representation r) {
+  return Generator::point(e, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+              Coefficient_traits::const_reference d,
+              Representation r) {
+  return Generator::closure_point(e, d, r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(Representation r) {
+  return Generator::closure_point(r);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+              Representation r) {
+  return Generator::closure_point(e, r);
+}
+
+/*! \relates Generator */
+inline bool
+operator==(const Generator& x, const Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Generator */
+inline bool
+operator!=(const Generator& x, const Generator& y) {
+  return !x.is_equivalent_to(y);
+}
+
+inline void
+Generator::ascii_dump(std::ostream& s) const {
+
+  expr.ascii_dump(s);
+
+  s << " ";
+  
+  switch (type()) {
+  case Generator::LINE:
+    s << "L ";
+    break;
+  case Generator::RAY:
+    s << "R ";
+    break;
+  case Generator::POINT:
+    s << "P ";
+    break;
+  case Generator::CLOSURE_POINT:
+    s << "C ";
+    break;
+  }
+  if (is_necessarily_closed())
+    s << "(C)";
+  else
+    s << "(NNC)";
+  s << "\n";
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+  std::string str;
+
+  expr.ascii_load(s);
+
+  if (!(s >> str))
+    return false;
+  if (str == "L")
+    set_is_line();
+  else if (str == "R" || str == "P" || str == "C")
+    set_is_ray_or_point();
+  else
+    return false;
+
+  std::string str2;
+
+  if (!(s >> str2))
+    return false;
+  if (str2 == "(C)") {
+    if (is_not_necessarily_closed())
+      // TODO: Avoid using the mark_as_*() methods if possible.
+      mark_as_necessarily_closed();
+  }
+  else {
+    if (str2 == "(NNC)") {
+      if (is_necessarily_closed())
+        // TODO: Avoid using the mark_as_*() methods if possible.
+        mark_as_not_necessarily_closed();
+    }
+    else
+      return false;
+  }
+
+  // Checking for equality of actual and declared types.
+  switch (type()) {
+  case Generator::LINE:
+    if (str != "L")
+      return false;
+    break;
+  case Generator::RAY:
+    if (str != "R")
+      return false;
+    break;
+  case Generator::POINT:
+    if (str != "P")
+      return false;
+    break;
+  case Generator::CLOSURE_POINT:
+    if (str != "C")
+      return false;
+    break;
+  }
+
+  return true;
+}
+
+inline void
+Generator::m_swap(Generator& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(kind_, y.kind_);
+  swap(topology_, y.topology_);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Generator */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const Generator& x,
+                    const Generator& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0,
+                    Temp& tmp1,
+                    Temp& tmp2) {
+  // Generator kind compatibility check: we only compute distances
+  // between (closure) points.
+  if (x.is_line_or_ray() || y.is_line_or_ray())
+    return false;
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // All zero-dim generators have distance zero.
+  if (x_space_dim == 0) {
+    assign_r(r, 0, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  PPL_DIRTY_TEMP(mpq_class, x_coord);
+  PPL_DIRTY_TEMP(mpq_class, y_coord);
+  PPL_DIRTY_TEMP(mpq_class, x_div);
+  PPL_DIRTY_TEMP(mpq_class, y_div);
+  assign_r(x_div, x.divisor(), ROUND_NOT_NEEDED);
+  assign_r(y_div, y.divisor(), ROUND_NOT_NEEDED);
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  // TODO: This loop can be optimized more, if needed.
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    assign_r(x_coord, x.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(x_coord, x_coord, x_div, ROUND_NOT_NEEDED);
+    assign_r(y_coord, y.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    div_assign_r(y_coord, y_coord, y_div, ROUND_NOT_NEEDED);
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+
+    if (x_coord > y_coord) {
+      maybe_assign(tmp1p, tmp1, x_coord, dir);
+      maybe_assign(tmp2p, tmp2, y_coord, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_coord, dir);
+      maybe_assign(tmp2p, tmp2, x_coord, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    PPL_ASSERT(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Generator& x,
+                            const Generator& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Generator& x,
+                            const Generator& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Generator& x,
+                            const Generator& y,
+                            const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Generator& x,
+                          const Generator& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Generator& x,
+                          const Generator& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Generator& x,
+                          const Generator& y,
+                          const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Generator& x,
+                           const Generator& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename Temp, typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Generator& x,
+                           const Generator& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Generator */
+template <typename To>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Generator& x,
+                           const Generator& y,
+                           const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To>(r, x, y, dir);
+}
+
+/*! \relates Generator */
+inline void
+swap(Generator& x, Generator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Generator_defs.hh line 1032. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 1. */
+/* Grid_Generator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 29. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 33. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 39. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 41. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Grid_Generator
+  \return
+  The returned absolute value can be \f$0\f$, \f$1\f$ or \f$2\f$.
+
+  \param x
+  A row of coefficients;
+
+  \param y
+  Another row.
+
+  Compares \p x and \p y, where \p x and \p y may be of different size,
+  in which case the "missing" coefficients are assumed to be zero.
+  The comparison is such that:
+  -# equalities are smaller than inequalities;
+  -# lines are smaller than points and rays;
+  -# the ordering is lexicographic;
+  -# the positions compared are, in decreasing order of significance,
+     1, 2, ..., \p size(), 0;
+  -# the result is negative, zero, or positive if x is smaller than,
+     equal to, or greater than y, respectively;
+  -# when \p x and \p y are different, the absolute value of the
+     result is 1 if the difference is due to the coefficient in
+     position 0; it is 2 otherwise.
+
+  When \p x and \p y represent the hyper-planes associated
+  to two equality or inequality constraints, the coefficient
+  at 0 is the known term.
+  In this case, the return value can be characterized as follows:
+  - -2, if \p x is smaller than \p y and they are \e not parallel;
+  - -1, if \p x is smaller than \p y and they \e are parallel;
+  -  0, if \p x and y are equal;
+  - +1, if \p y is smaller than \p x and they \e are parallel;
+  - +2, if \p y is smaller than \p x and they are \e not parallel.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Grid_Generator& x, const Grid_Generator& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator */
+void swap(Grid_Generator& x, Grid_Generator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A grid line, parameter or grid point.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid_Generator is one of the following:
+
+  - a grid_line \f$\vect{l} = (a_0, \ldots, a_{n-1})^\transpose\f$;
+
+  - a parameter
+    \f$\vect{q} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  - a grid_point
+    \f$\vect{p} = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$;
+
+  where \f$n\f$ is the dimension of the space
+  and, for grid_points and parameters, \f$d > 0\f$ is the divisor.
+
+  \par How to build a grid generator.
+  Each type of generator is built by applying the corresponding
+  function (<CODE>grid_line</CODE>, <CODE>parameter</CODE>
+  or <CODE>grid_point</CODE>) to a linear expression;
+  the space dimension of the generator is defined as the space dimension
+  of the corresponding linear expression.
+  Linear expressions used to define a generator should be homogeneous
+  (any constant term will be simply ignored).
+  When defining grid points and parameters, an optional Coefficient argument
+  can be used as a common <EM>divisor</EM> for all the coefficients
+  occurring in the provided linear expression;
+  the default value for this argument is 1.
+
+  \par
+  In all the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a grid line with direction \f$x-y-z\f$
+  and having space dimension \f$3\f$:
+  \code
+  Grid_Generator l = grid_line(x - y - z);
+  \endcode
+  By definition, the origin of the space is not a line, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator l = grid_line(0*x);
+  \endcode
+
+  \par Example 2
+  The following code builds the parameter as the vector
+  \f$\vect{p} = (1, -1, -1)^\transpose \in \Rset^3\f$
+  which has the same direction as the line in Example 1:
+  \code
+  Grid_Generator q = parameter(x - y - z);
+  \endcode
+  Note that, unlike lines, for parameters, the length as well
+  as the direction of the vector represented by the code is significant.
+  Thus \p q is \e not the same as the parameter \p q1 defined by
+  \code
+  Grid_Generator q1 = parameter(2x - 2y - 2z);
+  \endcode
+  By definition, the origin of the space is not a parameter, so that
+  the following code throws an exception:
+  \code
+  Grid_Generator q = parameter(0*x);
+  \endcode
+
+  \par Example 3
+  The following code builds the grid point
+  \f$\vect{p} = (1, 0, 2)^\transpose \in \Rset^3\f$:
+  \code
+  Grid_Generator p = grid_point(1*x + 0*y + 2*z);
+  \endcode
+  The same effect can be obtained by using the following code:
+  \code
+  Grid_Generator p = grid_point(x + 2*z);
+  \endcode
+  Similarly, the origin \f$\vect{0} \in \Rset^3\f$ can be defined
+  using either one of the following lines of code:
+  \code
+  Grid_Generator origin3 = grid_point(0*x + 0*y + 0*z);
+  Grid_Generator origin3_alt = grid_point(0*z);
+  \endcode
+  Note however that the following code would have defined
+  a different point, namely \f$\vect{0} \in \Rset^2\f$:
+  \code
+  Grid_Generator origin2 = grid_point(0*y);
+  \endcode
+  The following two lines of code both define the only grid point
+  having space dimension zero, namely \f$\vect{0} \in \Rset^0\f$.
+  In the second case we exploit the fact that the first argument
+  of the function <CODE>point</CODE> is optional.
+  \code
+  Grid_Generator origin0 = Generator::zero_dim_point();
+  Grid_Generator origin0_alt = grid_point();
+  \endcode
+
+  \par Example 4
+  The grid point \f$\vect{p}\f$ specified in Example 3 above
+  can also be obtained with the following code,
+  where we provide a non-default value for the second argument
+  of the function <CODE>grid_point</CODE> (the divisor):
+  \code
+  Grid_Generator p = grid_point(2*x + 0*y + 4*z, 2);
+  \endcode
+  Obviously, the divisor can be used to specify
+  points having some non-integer (but rational) coordinates.
+  For instance, the grid point
+  \f$\vect{p1} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be specified by the following code:
+  \code
+  Grid_Generator p1 = grid_point(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par Example 5
+  Parameters, like grid points can have a divisor.
+  For instance, the parameter
+  \f$\vect{q} = (1, 0, 2)^\transpose \in \Rset^3\f$ can be defined:
+  \code
+  Grid_Generator q = parameter(2*x + 0*y + 4*z, 2);
+  \endcode
+  Also, the divisor can be used to specify
+  parameters having some non-integer (but rational) coordinates.
+  For instance, the parameter
+  \f$\vect{q} = (-1.5, 3.2, 2.1)^\transpose \in \Rset^3\f$
+  can be defined:
+  \code
+  Grid_Generator q = parameter(-15*x + 32*y + 21*z, 10);
+  \endcode
+  If a zero divisor is provided, an exception is thrown.
+
+  \par How to inspect a grid generator
+  Several methods are provided to examine a grid generator and extract
+  all the encoded information: its space dimension, its type and
+  the value of its integer coefficients and the value of the denominator.
+
+  \par Example 6
+  The following code shows how it is possible to access each single
+  coefficient of a grid generator.
+  If <CODE>g1</CODE> is a grid point having coordinates
+  \f$(a_0, \ldots, a_{n-1})^\transpose\f$,
+  we construct the parameter <CODE>g2</CODE> having coordinates
+  \f$(a_0, 2 a_1, \ldots, (i+1)a_i, \ldots, n a_{n-1})^\transpose\f$.
+  \code
+  if (g1.is_point()) {
+    cout << "Grid point g1: " << g1 << endl;
+    Linear_Expression e;
+    for (dimension_type i = g1.space_dimension(); i-- > 0; )
+      e += (i + 1) * g1.coefficient(Variable(i)) * Variable(i);
+    Grid_Generator g2 = parameter(e, g1.divisor());
+    cout << "Parameter g2: " << g2 << endl;
+  }
+  else
+    cout << "Grid generator g1 is not a grid point." << endl;
+  \endcode
+  Therefore, for the grid point
+  \code
+  Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+  \endcode
+  we would obtain the following output:
+  \code
+  Grid point g1: p((2*A - B + 3*C)/2)
+  Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+  \endcode
+  When working with grid points and parameters, be careful not to confuse
+  the notion of <EM>coefficient</EM> with the notion of <EM>coordinate</EM>:
+  these are equivalent only when the divisor is 1.
+*/
+class Parma_Polyhedra_Library::Grid_Generator {
+public:
+
+  //! The possible kinds of Grid_Generator objects.
+  enum Kind {
+    LINE_OR_EQUALITY = 0,
+    RAY_OR_POINT_OR_INEQUALITY = 1
+  };
+
+  //! The representation used for new Grid_Generators.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Returns the line of direction \p e.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the homogeneous part of \p e represents the origin of
+    the vector space.
+  */
+  static Grid_Generator grid_line(const Linear_Expression& e,
+                                  Representation r = default_representation);
+
+  //! Returns the parameter of direction \p e and size \p e/d, with the same
+  //! representation as e.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator parameter(const Linear_Expression& e
+                                  = Linear_Expression::zero(),
+                                  Coefficient_traits::const_reference d
+                                  = Coefficient_one(),
+                                  Representation r = default_representation);
+
+  // TODO: Improve the documentation of this method.
+  //! Returns the parameter of direction and size \p Linear_Expression::zero() .
+  static Grid_Generator parameter(Representation r);
+
+  //! Returns the parameter of direction and size \p e .
+  static Grid_Generator parameter(const Linear_Expression& e,
+                                  Representation r);
+
+  //! Returns the point at \p e / \p d.
+  /*!
+    Both \p e and \p d are optional arguments, with default values
+    Linear_Expression::zero() and Coefficient_one(), respectively.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+  */
+  static Grid_Generator grid_point(const Linear_Expression& e
+                                   = Linear_Expression::zero(),
+                                   Coefficient_traits::const_reference d
+                                   = Coefficient_one(),
+                                   Representation r = default_representation);
+
+  //! Returns the point at \p e .
+  static Grid_Generator grid_point(Representation r);
+
+  //! Returns the point at \p e .
+  static Grid_Generator grid_point(const Linear_Expression& e,
+                                   Representation r);
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  explicit Grid_Generator(Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  //! The new Grid_Generator will have the same representation as g.
+  Grid_Generator(const Grid_Generator& g);
+
+  //! Copy constructor with specified representation.
+  Grid_Generator(const Grid_Generator& g, Representation r);
+
+  //! Copy constructor with specified space dimension.
+  //! The new Grid_Generator will have the same representation as g.
+  Grid_Generator(const Grid_Generator& g, dimension_type space_dim);
+
+  //! Copy constructor with specified space dimension and representation.
+  Grid_Generator(const Grid_Generator& g, dimension_type space_dim,
+                 Representation r);
+
+  //! Destructor.
+  ~Grid_Generator();
+
+  //! Assignment operator.
+  Grid_Generator& operator=(const Grid_Generator& g);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Grid_Generator can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Removes all the specified dimensions from the grid generator.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+
+    Always returns \p true. The return value is needed for compatibility with
+    the Generator class.
+  */
+  bool remove_space_dimensions(const Variables_Set& vars);
+
+  //! Permutes the space dimensions of the grid generator.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! The generator type.
+  enum Type {
+    /*! The generator is a grid line. */
+    LINE,
+    /*! The generator is a parameter. */
+    PARAMETER,
+    /*! The generator is a grid point. */
+    POINT
+  };
+
+  //! Returns the generator type of \p *this.
+  Type type() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a line.
+  bool is_line() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a parameter.
+  bool is_parameter() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a line or
+    a parameter.
+  */
+  bool is_line_or_parameter() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a point.
+  bool is_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row represents a
+    parameter or a point.
+  */
+  bool is_parameter_or_point() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the index of \p v is greater than or equal to the
+    space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the divisor of \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  Coefficient_traits::const_reference divisor() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the origin of the zero-dimensional space \f$\Rset^0\f$.
+  static const Grid_Generator& zero_dim_point();
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    equivalent generators.
+
+    Generators having different space dimensions are not equivalent.
+  */
+  bool is_equivalent_to(const Grid_Generator& y) const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  /*!
+    This is faster than is_equivalent_to(), but it may return `false' even
+    for equivalent generators.
+  */
+  bool is_equal_to(const Grid_Generator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the homogeneous terms
+    of \p *this are \f$0\f$.
+  */
+  bool all_homogeneous_terms_are_zero() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Grid_Generator& y);
+
+  /*! \brief
+    Scales \p *this to be represented with a divisor of \p d (if
+    \*this is a parameter or point). Does nothing at all on lines.
+
+    It is assumed that \p d is a multiple of the current divisor
+    and different from zero. The behavior is undefined if the assumption
+    does not hold.
+  */
+  void scale_to_divisor(Coefficient_traits::const_reference d);
+
+  //! Sets the divisor of \p *this to \p d.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this is a line.
+  */
+  void set_divisor(Coefficient_traits::const_reference d);
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Hide_Last<Expression_Hide_Inhomo<Linear_Expression> >
+  expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+private:
+  Linear_Expression expr;
+
+  Kind kind_;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the origin of the zero-dimensional space \f$\Rset^0\f$.
+  */
+  static const Grid_Generator* zero_dim_point_p;
+
+  //! Constructs a Grid_Generator with the specified space dimension, kind
+  //! and topology.
+  Grid_Generator(dimension_type space_dim, Kind kind, Topology topology,
+                 Representation r = default_representation);
+
+  // TODO: Avoid reducing the space dimension.
+  /*! \brief
+    Constructs a grid generator of type \p t from linear expression \p e,
+    stealing the underlying data structures from \p e.
+
+    The last column in \p e becomes the parameter divisor column of
+    the new Grid_Generator.
+
+    \note The new Grid_Generator will have the same representation as `e'.
+  */
+  Grid_Generator(Linear_Expression& e, Type t);
+
+  //! Sets the dimension of the vector space enclosing \p *this to
+  //! \p space_dim .
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid objects.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p gg in
+    dimension \p dim.
+  */
+  bool is_equal_at_dimension(dimension_type dim,
+                             const Grid_Generator& gg) const;
+
+  /*! \brief
+    A print function, with fancy, more human-friendly output.
+
+    This is used by operator<<().
+  */
+  void fancy_print(std::ostream& s) const;
+
+  //! Converts the Grid_Generator into a parameter.
+  void set_is_parameter();
+
+  //! Sets the Grid_Generator kind to <CODE>LINE_OR_EQUALITY</CODE>.
+  void set_is_line();
+
+  //! Sets the Grid_Generator kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+  void set_is_parameter_or_point();
+
+  //! \name Flags inspection methods
+  //@{
+  //! Returns the topological kind of \p *this.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is not necessarily closed.
+  */
+  bool is_not_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the topology
+    of \p *this row is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a line or an equality.
+  */
+  bool is_line_or_equality() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this row
+    represents a ray, a point or an inequality.
+  */
+  bool is_ray_or_point_or_inequality() const;
+  //@} // Flags inspection methods
+
+  //! \name Flags coercion methods
+  //@{
+
+  //! Sets to \p x the topological kind of \p *this row.
+  void set_topology(Topology x);
+
+  //! Sets to \p NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_necessarily_closed();
+
+  //! Sets to \p NOT_NECESSARILY_CLOSED the topological kind of \p *this row.
+  void set_not_necessarily_closed();
+
+  //! Sets to \p LINE_OR_EQUALITY the kind of \p *this row.
+  void set_is_line_or_equality();
+
+  //! Sets to \p RAY_OR_POINT_OR_INEQUALITY the kind of \p *this row.
+  void set_is_ray_or_point_or_inequality();
+  //@} // Flags coercion methods
+
+  /*! \brief
+    Normalizes the sign of the coefficients so that the first non-zero
+    (homogeneous) coefficient of a line-or-equality is positive.
+  */
+  void sign_normalize();
+
+  /*! \brief
+    Strong normalization: ensures that different Grid_Generator objects
+    represent different hyperplanes or hyperspaces.
+
+    Applies both Grid_Generator::normalize() and Grid_Generator::sign_normalize().
+  */
+  void strong_normalize();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the coefficients are
+    strongly normalized.
+  */
+  bool check_strong_normalized() const;
+
+  //! Linearly combines \p *this with \p y so that i-th coefficient is 0.
+  /*!
+    \param y
+    The Grid_Generator that will be combined with \p *this object;
+
+    \param i
+    The index of the coefficient that has to become \f$0\f$.
+
+    Computes a linear combination of \p *this and \p y having
+    the i-th coefficient equal to \f$0\f$. Then it assigns
+    the resulting Grid_Generator to \p *this and normalizes it.
+  */
+  void linear_combine(const Grid_Generator& y, dimension_type i);
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* name_var,
+                               const Variable v) const;
+
+  /*! \brief
+    Throw a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* reason) const;
+
+  friend std::ostream&
+  IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g);
+
+  friend int
+  compare(const Grid_Generator& x, const Grid_Generator& y);
+
+  friend class Expression_Adapter<Grid_Generator>;
+  friend class Grid_Generator_System;
+  friend class Grid;
+  friend class Linear_System<Grid_Generator>;
+  friend class Scalar_Products;
+  friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::grid_line(const Linear_Expression& e, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+grid_line(const Linear_Expression& e,
+          Representation r = Grid_Generator::default_representation);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::parameter(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+          Coefficient_traits::const_reference d = Coefficient_one(),
+          Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::parameter(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(Representation r);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::parameter(const Linear_Expression& e, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+parameter(const Linear_Expression& e, Representation r);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::grid_point(const Linear_Expression& e, Coefficient_traits::const_reference d, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+           Coefficient_traits::const_reference d = Coefficient_one(),
+           Representation r = Grid_Generator::default_representation);
+
+//! Shorthand for Grid_Generator::grid_point(Representation r).
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(Representation r);
+
+/*! \brief
+  Shorthand for
+  Grid_Generator::grid_point(const Linear_Expression& e, Representation r).
+
+  \relates Grid_Generator
+*/
+Grid_Generator
+grid_point(const Linear_Expression& e, Representation r);
+
+//! Returns <CODE>true</CODE> if and only if \p x is equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator==(const Grid_Generator& x, const Grid_Generator& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is not equivalent to \p y.
+/*! \relates Grid_Generator */
+bool operator!=(const Grid_Generator& x, const Grid_Generator& y);
+
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator::Type& t);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_inlines.hh line 1. */
+/* Grid Generator class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid_Generator::is_necessarily_closed() const {
+  return true;
+}
+
+inline bool
+Grid_Generator::is_not_necessarily_closed() const {
+  return false;
+}
+
+inline bool
+Grid_Generator::is_line_or_equality() const {
+  return (kind_ == LINE_OR_EQUALITY);
+}
+
+inline bool
+Grid_Generator::is_ray_or_point_or_inequality() const {
+  return (kind_ == RAY_OR_POINT_OR_INEQUALITY);
+}
+
+inline Topology
+Grid_Generator::topology() const {
+  return NECESSARILY_CLOSED;
+}
+
+inline void
+Grid_Generator::set_is_line_or_equality() {
+  kind_ = LINE_OR_EQUALITY;
+}
+
+inline void
+Grid_Generator::set_is_ray_or_point_or_inequality() {
+  kind_ = RAY_OR_POINT_OR_INEQUALITY;
+}
+
+inline void
+Grid_Generator::set_topology(Topology x) {
+  PPL_USED(x);
+  PPL_ASSERT(x == NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+inline void
+Grid_Generator::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+inline
+Grid_Generator::Grid_Generator(Linear_Expression& e, Type type) {
+  swap(expr, e);
+  if (type == LINE)
+    kind_ = LINE_OR_EQUALITY;
+  else
+    kind_ = RAY_OR_POINT_OR_INEQUALITY;
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(Representation r)
+  : expr(Coefficient_one(), r),
+    kind_(RAY_OR_POINT_OR_INEQUALITY) {
+  expr.set_space_dimension(1);
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g)
+  : expr(g.expr),
+    kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g, Representation r)
+  : expr(g.expr, r),
+    kind_(g.kind_) {
+}
+
+inline
+Grid_Generator::Grid_Generator(dimension_type space_dim, Kind kind,
+                               Topology topology, Representation r)
+  : expr(r),
+    kind_(kind) {
+  PPL_USED(topology);
+  PPL_ASSERT(topology == NECESSARILY_CLOSED);
+  expr.set_space_dimension(space_dim + 1);
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+                               dimension_type space_dim)
+  : expr(g.expr, space_dim + 1),
+    kind_(g.kind_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::Grid_Generator(const Grid_Generator& g,
+                               dimension_type space_dim, Representation r)
+  : expr(g.expr, space_dim + 1, r),
+    kind_(g.kind_) {
+  PPL_ASSERT(OK());
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline
+Grid_Generator::~Grid_Generator() {
+}
+
+inline Grid_Generator::expr_type
+Grid_Generator::expression() const {
+  return expr_type(expr, true);
+}
+
+inline Representation
+Grid_Generator::representation() const {
+  return expr.representation();
+}
+
+inline void
+Grid_Generator::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator::max_space_dimension() {
+  return Linear_Expression::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+  return expression().space_dimension();
+}
+
+inline void
+Grid_Generator::set_space_dimension(dimension_type space_dim) {
+  const dimension_type old_space_dim = space_dimension();
+  if (space_dim > old_space_dim) {
+    expr.set_space_dimension(space_dim + 1);
+    expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+  }
+  else {
+    expr.swap_space_dimensions(Variable(space_dim), Variable(old_space_dim));
+    expr.set_space_dimension(space_dim + 1);
+  }
+  PPL_ASSERT(space_dimension() == space_dim);
+}
+
+inline void
+Grid_Generator::set_space_dimension_no_ok(dimension_type space_dim) {
+  set_space_dimension(space_dim);
+}
+
+inline void
+Grid_Generator::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+  if (is_line())
+    return LINE;
+  return is_point() ? POINT : PARAMETER;
+}
+
+inline bool
+Grid_Generator::is_line() const {
+  return is_line_or_equality();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+  return is_parameter_or_point() && is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+  return expr.inhomogeneous_term() == 0;
+}
+
+inline bool
+Grid_Generator::is_point() const {
+  return !is_line_or_parameter();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+  return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_divisor(Coefficient_traits::const_reference d) {
+  PPL_ASSERT(!is_line());
+  if (is_line_or_parameter())
+    expr.set_coefficient(Variable(space_dimension()), d);
+  else
+    expr.set_inhomogeneous_term(d);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::divisor() const {
+  if (is_line())
+    throw_invalid_argument("divisor()", "*this is a line");
+  if (is_line_or_parameter())
+    return expr.coefficient(Variable(space_dimension()));
+  else
+    return expr.inhomogeneous_term();
+}
+
+inline bool
+Grid_Generator::is_equal_at_dimension(dimension_type dim,
+                                      const Grid_Generator& y) const {
+  const Grid_Generator& x = *this;
+  return x.expr.get(dim) * y.divisor() == y.expr.get(dim) * x.divisor();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+  set_is_line_or_equality();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+  set_is_ray_or_point_or_inequality();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+  Grid_Generator tmp = g;
+  swap(*this, tmp);
+
+  return *this;
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes();
+}
+
+inline const Grid_Generator&
+Grid_Generator::zero_dim_point() {
+  PPL_ASSERT(zero_dim_point_p != 0);
+  return *zero_dim_point_p;
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+  PPL_ASSERT(!is_parameter());
+  expr.normalize();
+  sign_normalize();
+}
+
+inline void
+Grid_Generator::m_swap(Grid_Generator& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(kind_, y.kind_);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator==(const Grid_Generator& x, const Grid_Generator& y) {
+  return x.is_equivalent_to(y);
+}
+
+/*! \relates Grid_Generator */
+inline bool
+operator!=(const Grid_Generator& x, const Grid_Generator& y) {
+  return !(x == y);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_line(const Linear_Expression& e, Representation r) {
+  return Grid_Generator::grid_line(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+          Coefficient_traits::const_reference d, Representation r) {
+  return Grid_Generator::parameter(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(Representation r) {
+  return Grid_Generator::parameter(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e, Representation r) {
+  return Grid_Generator::parameter(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+           Coefficient_traits::const_reference d, Representation r) {
+  return Grid_Generator::grid_point(e, d, r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(Representation r) {
+  return Grid_Generator::grid_point(r);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e, Representation r) {
+  return Grid_Generator::grid_point(e, r);
+}
+
+/*! \relates Grid_Generator */
+inline void
+swap(Grid_Generator& x, Grid_Generator& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_defs.hh line 795. */
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 1. */
+/* Congruence class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 31. */
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 37. */
+
+#include <iosfwd>
+#include <vector>
+
+// These are declared here because they are friend of Congruence.
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator==(const Congruence& x, const Congruence& y);
+
+//! Returns <CODE>false</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence */
+bool
+operator!=(const Congruence& x, const Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A linear congruence.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Congruence is a congruence:
+  - \f$\cg = \sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod m\f$
+
+  where \f$n\f$ is the dimension of the space,
+  \f$a_i\f$ is the integer coefficient of variable \f$x_i\f$,
+  \f$b\f$ is the integer inhomogeneous term and \f$m\f$ is the integer modulus;
+  if \f$m = 0\f$, then \f$\cg\f$ represents the equality congruence
+  \f$\sum_{i=0}^{n-1} a_i x_i + b = 0\f$
+  and, if \f$m \neq 0\f$, then the congruence \f$\cg\f$ is
+  said to be a proper congruence.
+
+  \par How to build a congruence
+  Congruences \f$\pmod{1}\f$ are typically built by
+  applying the congruence symbol `<CODE>\%=</CODE>'
+  to a pair of linear expressions.
+  Congruences with modulus \p m
+  are typically constructed by building a congruence \f$\pmod{1}\f$
+  using the given pair of linear expressions
+  and then adding the modulus \p m
+  using the modulus symbol is `<CODE>/</CODE>'.
+
+  The space dimension of a congruence is defined as the maximum
+  space dimension of the arguments of its constructor.
+
+  \par
+  In the following examples it is assumed that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE>
+  are defined as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds the equality congruence
+  \f$3x + 5y - z = 0\f$, having space dimension \f$3\f$:
+  \code
+  Congruence eq_cg((3*x + 5*y - z %= 0) / 0);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{1}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod1_cg(4*x %= 2*y - 13);
+  \endcode
+  The following code builds the congruence
+  \f$4x = 2y - 13 \pmod{2}\f$, having space dimension \f$2\f$:
+  \code
+  Congruence mod2_cg((4*x %= 2*y - 13) / 2);
+  \endcode
+  An unsatisfiable congruence on the zero-dimension space \f$\Rset^0\f$
+  can be specified as follows:
+  \code
+  Congruence false_cg = Congruence::zero_dim_false();
+  \endcode
+  Equivalent, but more involved ways are the following:
+  \code
+  Congruence false_cg1((Linear_Expression::zero() %= 1) / 0);
+  Congruence false_cg2((Linear_Expression::zero() %= 1) / 2);
+  \endcode
+  In contrast, the following code defines an unsatisfiable congruence
+  having space dimension \f$3\f$:
+  \code
+  Congruence false_cg3((0*z %= 1) / 0);
+  \endcode
+
+  \par How to inspect a congruence
+  Several methods are provided to examine a congruence and extract
+  all the encoded information: its space dimension, its modulus
+  and the value of its integer coefficients.
+
+  \par Example 2
+  The following code shows how it is possible to access the modulus
+  as well as each of the coefficients.
+  Given a congruence with linear expression \p e and modulus \p m
+  (in this case \f$x - 5y + 3z = 4 \pmod{5}\f$), we construct a new
+  congruence with the same modulus \p m but where the linear
+  expression is \f$2 e\f$ (\f$2x - 10y + 6z = 8 \pmod{5}\f$).
+  \code
+  Congruence cg1((x - 5*y + 3*z %= 4) / 5);
+  cout << "Congruence cg1: " << cg1 << endl;
+  const Coefficient& m = cg1.modulus();
+  if (m == 0)
+    cout << "Congruence cg1 is an equality." << endl;
+  else {
+    Linear_Expression e;
+    for (dimension_type i = cg1.space_dimension(); i-- > 0; )
+      e += 2 * cg1.coefficient(Variable(i)) * Variable(i);
+      e += 2 * cg1.inhomogeneous_term();
+    Congruence cg2((e %= 0) / m);
+    cout << "Congruence cg2: " << cg2 << endl;
+  }
+  \endcode
+  The actual output could be the following:
+  \code
+  Congruence cg1: A - 5*B + 3*C %= 4 / 5
+  Congruence cg2: 2*A - 10*B + 6*C %= 8 / 5
+  \endcode
+  Note that, in general, the particular output obtained can be
+  syntactically different from the (semantically equivalent)
+  congruence considered.
+*/
+class Parma_Polyhedra_Library::Congruence {
+public:
+
+  //! The representation used for new Congruences.
+  /*!
+    \note The copy constructor and the copy constructor with specified size
+          use the representation of the original object, so that it is
+          indistinguishable from the original object.
+  */
+  static const Representation default_representation = SPARSE;
+
+  //! Constructs the 0 = 0 congruence with space dimension \p 0 .
+  explicit Congruence(Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note The new Congruence will have the same representation as `cg',
+          not default_representation, so that they are indistinguishable.
+  */
+  Congruence(const Congruence& cg);
+
+  //! Copy constructor with specified representation.
+  Congruence(const Congruence& cg, Representation r);
+
+  //! Copy-constructs (modulo 0) from equality constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p c is an inequality.
+  */
+  explicit Congruence(const Constraint& c,
+                      Representation r = default_representation);
+
+  //! Destructor.
+  ~Congruence();
+
+  //! Assignment operator.
+  Congruence& operator=(const Congruence& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Congruence can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  void permute_space_dimensions(const std::vector<Variable>& cycles);
+
+  //! The type of the (adapted) internal expression.
+  typedef Expression_Adapter_Transparent<Linear_Expression> expr_type;
+  //! Partial read access to the (adapted) internal expression.
+  expr_type expression() const;
+
+  //! Returns the coefficient of \p v in \p *this.
+  /*!
+    \exception std::invalid_argument thrown if the index of \p v
+    is greater than or equal to the space dimension of \p *this.
+  */
+  Coefficient_traits::const_reference coefficient(Variable v) const;
+
+  //! Returns the inhomogeneous term of \p *this.
+  Coefficient_traits::const_reference inhomogeneous_term() const;
+
+  //! Returns a const reference to the modulus of \p *this.
+  Coefficient_traits::const_reference modulus() const;
+
+  //! Sets the modulus of \p *this to \p m .
+  //! If \p m is 0, the congruence becomes an equality.
+  void set_modulus(Coefficient_traits::const_reference m);
+
+  //! Multiplies all the coefficients, including the modulus, by \p factor .
+  void scale(Coefficient_traits::const_reference factor);
+
+  // TODO: Document this.
+  void affine_preimage(Variable v,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator);
+
+  //! Multiplies \p k into the modulus of \p *this.
+  /*!
+    If called with \p *this representing the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then it returns with *this representing
+    the congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  */
+  Congruence&
+  operator/=(Coefficient_traits::const_reference k);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a tautology
+    (i.e., an always true congruence).
+
+    A tautological congruence has one the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + 0 == 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b = 0 \pmod{m}\f$.
+  */
+  bool is_tautological() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this is inconsistent (i.e., an always false congruence).
+
+    An inconsistent congruence has one of the following two forms:
+    - an equality: \f$\sum_{i=0}^{n-1} 0 x_i + b == 0\f$
+      where \f$b \neq 0\f$; or
+    - a proper congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+      where \f$b \neq 0 \pmod{m}\f$.
+  */
+  bool is_inconsistent() const;
+
+  //! Returns <CODE>true</CODE> if the modulus is greater than zero.
+  /*!
+    A congruence with a modulus of 0 is a linear equality.
+  */
+  bool is_proper_congruence() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is an equality.
+  /*!
+    A modulus of zero denotes a linear equality.
+  */
+  bool is_equality() const;
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns a reference to the true (zero-dimension space) congruence
+    \f$0 = 1 \pmod{1}\f$, also known as the <EM>integrality
+    congruence</EM>.
+  */
+  static const Congruence& zero_dim_integrality();
+
+  /*! \brief
+    Returns a reference to the false (zero-dimension space) congruence
+    \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence& zero_dim_false();
+
+  //! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e1, const Linear_Expression& e2,
+         Representation r = default_representation);
+
+  //! Returns the congruence \f$e = n \pmod{1}\f$.
+  static Congruence
+  create(const Linear_Expression& e, Coefficient_traits::const_reference n,
+         Representation r = default_representation);
+
+  //! Returns the congruence \f$n = e \pmod{1}\f$.
+  static Congruence
+  create(Coefficient_traits::const_reference n, const Linear_Expression& e,
+         Representation r = default_representation);
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Congruence& y);
+
+  //! Copy-constructs with the specified space dimension.
+  /*!
+    \note The new Congruence will have the same representation as `cg',
+          not default_representation, for consistency with the copy
+          constructor.
+  */
+  Congruence(const Congruence& cg, dimension_type new_space_dimension);
+
+  //! Copy-constructs with the specified space dimension and representation.
+  Congruence(const Congruence& cg, dimension_type new_space_dimension,
+             Representation r);
+
+  //! Copy-constructs from a constraint, with the specified space dimension
+  //! and (optional) representation.
+  Congruence(const Constraint& cg, dimension_type new_space_dimension,
+             Representation r = default_representation);
+
+  //! Constructs from Linear_Expression \p le, using modulus \p m.
+  /*!
+    Builds a congruence with modulus \p m, stealing the coefficients
+    from \p le.
+
+    \note The new Congruence will have the same representation as `le'.
+
+    \param le
+    The Linear_Expression holding the coefficients.
+
+    \param m
+    The modulus for the congruence, which must be zero or greater.
+  */
+  Congruence(Linear_Expression& le,
+             Coefficient_traits::const_reference m, Recycle_Input);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Sets the space dimension by \p n , adding or removing coefficients as
+  //! needed.
+  void set_space_dimension(dimension_type n);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Normalizes the signs.
+  /*!
+    The signs of the coefficients and the inhomogeneous term are
+    normalized, leaving the first non-zero homogeneous coefficient
+    positive.
+  */
+  void sign_normalize();
+
+  //! Normalizes signs and the inhomogeneous term.
+  /*!
+    Applies sign_normalize, then reduces the inhomogeneous term to the
+    smallest possible positive number.
+  */
+  void normalize();
+
+  //! Calls normalize, then divides out common factors.
+  /*!
+    Strongly normalized Congruences have equivalent semantics if and
+    only if they have the same syntax (as output by operator<<).
+  */
+  void strong_normalize();
+
+private:
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the false (zero-dimension space) congruence \f$0 = 1 \pmod{0}\f$.
+  */
+  static const Congruence* zero_dim_false_p;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the true (zero-dimension space) congruence \f$0 = 1 \pmod{1}\f$,
+    also known as the <EM>integrality congruence</EM>.
+  */
+  static const Congruence* zero_dim_integrality_p;
+
+  Linear_Expression expr;
+
+  Coefficient modulus_;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+    dimension \p v.
+  */
+  bool is_equal_at_dimension(Variable v,
+                             const Congruence& cg) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    error message \p message.
+  */
+  void
+  throw_invalid_argument(const char* method, const char* message) const;
+
+  /*! \brief
+    Throws a <CODE>std::invalid_argument</CODE> exception containing
+    the appropriate error message.
+  */
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* v_name,
+                               Variable v) const;
+
+  friend bool
+  operator==(const Congruence& x, const Congruence& y);
+
+  friend bool
+  operator!=(const Congruence& x, const Congruence& y);
+
+  friend class Scalar_Products;
+  friend class Grid;
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+} // namespace IO_Operators
+
+//! Returns the congruence \f$e1 = e2 \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \f$e = n \pmod{1}\f$.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! Returns a copy of \p cg, multiplying \p k into the copy's modulus.
+/*!
+    If \p cg represents the congruence \f$ e_1 = e_2
+    \pmod{m}\f$, then the result represents the
+    congruence \f$ e_1 = e_2 \pmod{mk}\f$.
+  \relates Congruence
+*/
+Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m);
+
+/*! \relates Congruence */
+void
+swap(Congruence& x, Congruence& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_inlines.hh line 1. */
+/* Congruence class implementation: inline functions.
+*/
+
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(Representation r)
+  : expr(r) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg)
+  : expr(cg.expr), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg, Representation r)
+  : expr(cg.expr, r), modulus_(cg.modulus_) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+                       dimension_type new_space_dimension)
+  : expr(cg.expr, new_space_dimension), modulus_(cg.modulus_) {
+  PPL_ASSERT(OK());
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+                       dimension_type new_space_dimension,
+                       Representation r)
+  : expr(cg.expr, new_space_dimension, r), modulus_(cg.modulus_) {
+  PPL_ASSERT(OK());
+}
+
+inline Representation
+Congruence::representation() const {
+  return expr.representation();
+}
+
+inline void
+Congruence::set_representation(Representation r) {
+  expr.set_representation(r);
+}
+
+inline Congruence::expr_type
+Congruence::expression() const {
+  return expr_type(expr);
+}
+
+inline void
+Congruence::set_space_dimension(dimension_type n) {
+  expr.set_space_dimension(n);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Congruence::shift_space_dimensions(Variable v, dimension_type n) {
+  expr.shift_space_dimensions(v, n);
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+                       Coefficient_traits::const_reference m,
+                       Recycle_Input)
+  : modulus_(m) {
+  PPL_ASSERT(m >= 0);
+  swap(expr, le);
+
+  PPL_ASSERT(OK());
+}
+
+inline Congruence
+Congruence::create(const Linear_Expression& e,
+                   Coefficient_traits::const_reference n,
+                   Representation r) {
+  Linear_Expression diff(e, r);
+  diff -= n;
+  const Congruence cg(diff, 1, Recycle_Input());
+  return cg;
+}
+
+inline Congruence
+Congruence::create(Coefficient_traits::const_reference n,
+                   const Linear_Expression& e,
+                   Representation r) {
+  Linear_Expression diff(e, r);
+  diff -= n;
+  const Congruence cg(diff, 1, Recycle_Input());
+  return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+  return Congruence::create(e1, e2);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+  return Congruence::create(e, n);
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg, Coefficient_traits::const_reference k) {
+  Congruence ret = cg;
+  ret /= k;
+  return ret;
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+  return *zero_dim_integrality_p;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+  return *zero_dim_false_p;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& y) {
+  Congruence tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c, Coefficient_traits::const_reference m) {
+  Congruence ret(c);
+  ret /= m;
+  return ret;
+}
+
+inline Congruence&
+Congruence::operator/=(Coefficient_traits::const_reference k) {
+  if (k >= 0)
+    modulus_ *= k;
+  else
+    modulus_ *= -k;
+  return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+  if (x.space_dimension() != y.space_dimension())
+    return false;
+  Congruence x_temp(x);
+  Congruence y_temp(y);
+  x_temp.strong_normalize();
+  y_temp.strong_normalize();
+  return x_temp.expr.is_equal_to(y_temp.expr)
+    && x_temp.modulus() == y_temp.modulus();
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+  return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+  return Linear_Expression::max_space_dimension();
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+  return expr.space_dimension();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::coefficient(const Variable v) const {
+  if (v.space_dimension() > space_dimension())
+    throw_dimension_incompatible("coefficient(v)", "v", v);
+  return expr.coefficient(v);
+}
+
+inline void
+Congruence::permute_space_dimensions(const std::vector<Variable>& cycles) {
+  expr.permute_space_dimensions(cycles);
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+  return expr.inhomogeneous_term();
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+  return modulus_;
+}
+
+inline void
+Congruence::set_modulus(Coefficient_traits::const_reference m) {
+  modulus_ = m;
+  PPL_ASSERT(OK());
+}
+
+inline bool
+Congruence::is_proper_congruence() const {
+  return modulus() > 0;
+}
+
+inline bool
+Congruence::is_equality() const {
+  return modulus() == 0;
+}
+
+inline bool
+Congruence::is_equal_at_dimension(Variable v,
+                                  const Congruence& cg) const {
+  return coefficient(v) * cg.modulus() == cg.coefficient(v) * modulus();
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+  return expr.external_memory_in_bytes()
+         + Parma_Polyhedra_Library::external_memory_in_bytes(modulus_);
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Congruence::m_swap(Congruence& y) {
+  using std::swap;
+  swap(expr, y.expr);
+  swap(modulus_, y.modulus_);
+}
+
+inline void
+Congruence::swap_space_dimensions(Variable v1, Variable v2) {
+  expr.swap_space_dimensions(v1, v2);
+}
+
+/*! \relates Congruence */
+inline void
+swap(Congruence& x, Congruence& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_defs.hh line 505. */
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_templates.hh line 34. */
+#include <stdexcept>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl& e) {
+  construct(e);
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Impl<Row2>& e) {
+  construct(e);
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+    construct(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+    construct(*p);
+  }
+  else {
+    // Add implementations for other derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>
+::Linear_Expression_Impl(const Linear_Expression_Interface& e,
+                         dimension_type space_dim) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&e)) {
+    construct(*p, space_dim);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&e)) {
+    construct(*p, space_dim);
+  }
+  else {
+    // Add implementations for other derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, Variable i) {
+  PPL_ASSERT(space_dimension() == y.space_dimension());
+  PPL_ASSERT(i.space_dimension() <= space_dimension());
+  linear_combine(y, i.space_dimension());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y, dimension_type i) {
+  const Linear_Expression_Impl& x = *this;
+  PPL_ASSERT(i < x.space_dimension() + 1);
+  PPL_ASSERT(x.space_dimension() == y.space_dimension());
+  Coefficient_traits::const_reference x_i = x.row.get(i);
+  Coefficient_traits::const_reference y_i = y.row.get(i);
+  PPL_ASSERT(x_i != 0);
+  PPL_ASSERT(y_i != 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_x_v);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_y_v);
+  normalize2(x_i, y_i, normalized_x_v, normalized_y_v);
+  neg_assign(normalized_x_v);
+  linear_combine(y, normalized_y_v, normalized_x_v);
+  // We cannot use x_i here because it may have been invalidated by
+  // linear_combine().
+  assert(x.row.get(i) == 0);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2) {
+  PPL_ASSERT(c1 != 0);
+  PPL_ASSERT(c2 != 0);
+  if (space_dimension() < y.space_dimension())
+    set_space_dimension(y.space_dimension());
+  linear_combine(y, c1, c2, 0, y.space_dimension() + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2) {
+  if (space_dimension() < y.space_dimension())
+    set_space_dimension(y.space_dimension());
+  linear_combine_lax(y, c1, c2, 0, y.space_dimension() + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Impl<Row2>& y) const {
+  const Linear_Expression_Impl& x = *this;
+  // Compare all the coefficients of the row starting from position 1.
+  // NOTE: x and y may be of different size.
+  typename Row::const_iterator i = x.row.lower_bound(1);
+  typename Row::const_iterator i_end = x.row.end();
+  typename Row2::const_iterator j = y.row.lower_bound(1);
+  typename Row2::const_iterator j_end = y.row.end();
+  while (i != i_end && j != j_end) {
+    if (i.index() < j.index()) {
+      const int s = sgn(*i);
+      if (s != 0)
+        return 2*s;
+      ++i;
+      continue;
+    }
+    if (i.index() > j.index()) {
+      const int s = sgn(*j);
+      if (s != 0)
+        return -2*s;
+      ++j;
+      continue;
+    }
+    PPL_ASSERT(i.index() == j.index());
+    const int s = cmp(*i, *j);
+    if (s < 0)
+      return -2;
+    if (s > 0)
+      return 2;
+    PPL_ASSERT(s == 0);
+    ++i;
+    ++j;
+  }
+  for ( ; i != i_end; ++i) {
+    const int s = sgn(*i);
+    if (s != 0)
+      return 2*s;
+  }
+  for ( ; j != j_end; ++j) {
+    const int s = sgn(*j);
+    if (s != 0)
+      return -2*s;
+  }
+
+  // If all the coefficients in `x' equal all the coefficients in `y'
+  // (starting from position 1) we compare coefficients in position 0,
+  // i.e., inhomogeneous terms.
+  const int comp = cmp(x.row.get(0), y.row.get(0));
+  if (comp > 0)
+    return 1;
+  if (comp < 0)
+    return -1;
+  PPL_ASSERT(comp == 0);
+
+  // `x' and `y' are equal.
+  return 0;
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::Linear_Expression_Impl(const Variable v) {
+  if (v.space_dimension() > max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl::"
+                            "Linear_Expression_Impl(v):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  set_space_dimension(v.space_dimension());
+  (*this) += v;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& x) const {
+  return row == x.row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Dense_Row& row) const {
+  row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::get_row(Sparse_Row& row) const {
+  row = this->row;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  const dimension_type n = cycle.size();
+  if (n < 2)
+    return;
+
+  if (n == 2) {
+    row.swap_coefficients(cycle[0].space_dimension(),
+                          cycle[1].space_dimension());
+  }
+  else {
+    PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+    tmp = row.get(cycle.back().space_dimension());
+    for (dimension_type i = n - 1; i-- > 0; )
+      row.swap_coefficients(cycle[i + 1].space_dimension(),
+                            cycle[i].space_dimension());
+    if (tmp == 0)
+      row.reset(cycle[0].space_dimension());
+    else {
+      using std::swap;
+      swap(tmp, row[cycle[0].space_dimension()]);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Linear_Expression_Impl<Row2>& e) {
+  linear_combine(e, Coefficient_one(), Coefficient_one());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator+=(const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "operator+=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  typename Row::iterator itr = row.insert(v_space_dim);
+  ++(*itr);
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+template <typename Row2>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Linear_Expression_Impl<Row2>& e2) {
+  linear_combine(e2, Coefficient_one(), -1);
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator-=(const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "operator-=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  typename Row::iterator itr = row.insert(v_space_dim);
+  --(*itr);
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator*=(Coefficient_traits::const_reference n) {
+  if (n == 0) {
+    row.clear();
+    PPL_ASSERT(OK());
+    return *this;
+  }
+  for (typename Row::iterator i = row.begin(),
+         i_end = row.end(); i != i_end; ++i)
+    (*i) *= n;
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::operator/=(Coefficient_traits::const_reference n) {
+  typename Row::iterator i = row.begin();
+  const typename Row::iterator& i_end = row.end();
+  while (i != i_end) {
+    (*i) /= n;
+    if (*i == 0)
+      i = row.reset(i);
+    else
+      ++i;
+  }
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate() {
+  for (typename Row::iterator i = row.begin(),
+         i_end = row.end(); i != i_end; ++i)
+    neg_assign(*i);
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>::add_mul_assign(Coefficient_traits::const_reference n,
+                                            const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "add_mul_assign(e, n, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  if (n == 0)
+    return *this;
+  typename Row::iterator itr = row.insert(v_space_dim);
+  (*itr) += n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression_Impl */
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference n,
+                 const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Expression_Impl<Row>::max_space_dimension())
+    throw std::length_error("Linear_Expression_Impl& "
+                            "sub_mul_assign(e, n, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (space_dimension() < v_space_dim)
+    set_space_dimension(v_space_dim);
+  if (n == 0)
+    return *this;
+  typename Row::iterator itr = row.insert(v_space_dim);
+  (*itr) -= n;
+  if (*itr == 0)
+    row.reset(itr);
+  PPL_ASSERT(OK());
+  return *this;
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Impl<Row2>& y) {
+  if (factor != 0)
+    linear_combine(y, Coefficient_one(), factor);
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Impl<Row2>& y) {
+  if (factor != 0)
+    linear_combine(y, Coefficient_one(), -factor);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::print(std::ostream& s) const {
+  PPL_DIRTY_TEMP_COEFFICIENT(ev);
+  bool first = true;
+  for (typename Row::const_iterator i = row.lower_bound(1), i_end = row.end();
+       i != i_end; ++i) {
+    ev = *i;
+    if (ev == 0)
+      continue;
+    if (!first) {
+      if (ev > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(ev);
+      }
+    }
+    else
+      first = false;
+    if (ev == -1)
+      s << "-";
+    else if (ev != 1)
+      s << ev << "*";
+    IO_Operators::operator<<(s, Variable(i.index() - 1));
+  }
+  // Inhomogeneous term.
+  PPL_DIRTY_TEMP_COEFFICIENT(it);
+  it = row[0];
+  if (it != 0) {
+    if (!first) {
+      if (it > 0)
+        s << " + ";
+      else {
+        s << " - ";
+        neg_assign(it);
+      }
+    }
+    else
+      first = false;
+    s << it;
+  }
+
+  if (first)
+    // The null linear expression.
+    s << Coefficient_zero();
+}
+
+template <typename Row>
+Coefficient_traits::const_reference
+Linear_Expression_Impl<Row>::get(dimension_type i) const {
+  return row.get(i);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::set(dimension_type i, Coefficient_traits::const_reference n) {
+  if (n == 0)
+    row.reset(i);
+  else
+    row.insert(i, n);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::exact_div_assign(Coefficient_traits::const_reference c,
+                   dimension_type start, dimension_type end) {
+  // NOTE: Since all coefficients in [start,end) are multiple of c,
+  // each of the resulting coefficients will be nonzero iff the initial
+  // coefficient was.
+  for (typename Row::iterator i = row.lower_bound(start),
+         i_end = row.lower_bound(end); i != i_end; ++i)
+    Parma_Polyhedra_Library::exact_div_assign(*i, *i, c);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::mul_assign(Coefficient_traits::const_reference c,
+                   dimension_type start, dimension_type end) {
+  if (c == 0) {
+    typename Row::iterator i = row.lower_bound(start);
+    const typename Row::iterator& i_end = row.end();
+    while (i != i_end && i.index() < end)
+      i = row.reset(i);
+  }
+  else {
+    for (typename Row::iterator
+      i = row.lower_bound(start), i_end = row.lower_bound(end); i != i_end; ++i)
+      (*i) *= c;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Impl<Row2>& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2,
+                 dimension_type start, dimension_type end) {
+  Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Impl<Row2>& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2,
+                     dimension_type start, dimension_type end) {
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= row.size());
+  PPL_ASSERT(end <= y.row.size());
+  if (c1 == 0) {
+    if (c2 == 0) {
+      PPL_ASSERT(c1 == 0);
+      PPL_ASSERT(c2 == 0);
+      typename Row::iterator i = row.lower_bound(start);
+      const typename Row::iterator& i_end = row.end();
+      while (i != i_end && i.index() < end)
+        i = row.reset(i);
+    }
+    else {
+      PPL_ASSERT(c1 == 0);
+      PPL_ASSERT(c2 != 0);
+
+      typename Row::iterator i = row.lower_bound(start);
+      const typename Row::iterator& i_end = row.end();
+      typename Row2::const_iterator j = y.row.lower_bound(start);
+      typename Row2::const_iterator j_last = y.row.lower_bound(end);
+
+      while (i != i_end && i.index() < end && j != j_last) {
+        if (i.index() < j.index()) {
+          i = row.reset(i);
+          continue;
+        }
+        if (i.index() > j.index()) {
+          i = row.insert(i, j.index(), *j);
+          (*i) *= c2;
+          ++i;
+          ++j;
+          continue;
+        }
+        PPL_ASSERT(i.index() == j.index());
+        (*i) = (*j);
+        (*i) *= c2;
+        ++i;
+        ++j;
+      }
+      while (i != i_end && i.index() < end)
+        i = row.reset(i);
+      while (j != j_last) {
+        i = row.insert(i, j.index(), *j);
+        (*i) *= c2;
+        // No need to increment i here.
+        ++j;
+      }
+    }
+  }
+  else {
+    if (c2 == 0) {
+      PPL_ASSERT(c1 != 0);
+      PPL_ASSERT(c2 == 0);
+      for (typename Row::iterator i = row.lower_bound(start),
+             i_end = row.lower_bound(end); i != i_end; ++i)
+        (*i) *= c1;
+    }
+    else {
+      PPL_ASSERT(c1 != 0);
+      PPL_ASSERT(c2 != 0);
+      Parma_Polyhedra_Library::linear_combine(row, y.row, c1, c2, start, end);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::sign_normalize() {
+  typename Row::iterator i = row.lower_bound(1);
+  typename Row::iterator i_end = row.end();
+
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      break;
+
+  if (i != i_end && *i < 0) {
+    for ( ; i != i_end; ++i)
+      neg_assign(*i);
+    // Negate the first coefficient, too.
+    typename Row::iterator first = row.begin();
+    if (first != row.end() && first.index() == 0)
+      neg_assign(*first);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::negate(dimension_type first, dimension_type last) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= row.size());
+  typename Row::iterator i = row.lower_bound(first);
+  typename Row::iterator i_end = row.lower_bound(last);
+  for ( ; i != i_end; ++i)
+    neg_assign(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e) {
+  row = e.row;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Impl<Row2>& e,
+                                       dimension_type space_dim) {
+  Row x(e.row, space_dim + 1, space_dim + 1);
+  swap(row, x);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+template <typename Row2>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Impl<Row2>& y,
+                        dimension_type start, dimension_type end) const {
+  const Linear_Expression_Impl<Row>& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.row.size());
+  PPL_ASSERT(end <= y.row.size());
+  result = 0;
+  typename Row ::const_iterator x_i = x.row.lower_bound(start);
+  typename Row ::const_iterator x_end = x.row.lower_bound(end);
+  typename Row2::const_iterator y_i = y.row.lower_bound(start);
+  typename Row2::const_iterator y_end = y.row.lower_bound(end);
+  while (x_i != x_end && y_i != y_end) {
+    if (x_i.index() == y_i.index()) {
+      Parma_Polyhedra_Library::add_mul_assign(result, *x_i, *y_i);
+      ++x_i;
+      ++y_i;
+    }
+    else {
+      if (x_i.index() < y_i.index()) {
+        PPL_ASSERT(y.row.get(x_i.index()) == 0);
+        // (*x_i) * 0 == 0, nothing to do.
+        ++x_i;
+      }
+      else {
+        PPL_ASSERT(x.row.get(y_i.index()) == 0);
+        // 0 * (*y_i) == 0, nothing to do.
+        ++y_i;
+      }
+    }
+  }
+  // In the remaining positions (if any) at most one row is nonzero, so
+  // there's nothing left to do.
+}
+
+template <typename Row>
+template <typename Row2>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Impl<Row2>& y,
+                      dimension_type start, dimension_type end) const {
+  PPL_DIRTY_TEMP_COEFFICIENT(result);
+  scalar_product_assign(result, y, start, end);
+  return sgn(result);
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+              dimension_type start, dimension_type end) const {
+  const Linear_Expression_Impl<Row>& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.row.size());
+  PPL_ASSERT(end <= y.row.size());
+
+  typename Row::const_iterator i = x.row.lower_bound(start);
+  typename Row::const_iterator i_end = x.row.lower_bound(end);
+  typename Row2::const_iterator j = y.row.lower_bound(start);
+  typename Row2::const_iterator j_end = y.row.lower_bound(end);
+  while (i != i_end && j != j_end) {
+    if (i.index() == j.index()) {
+      if (*i != *j)
+        return false;
+      ++i;
+      ++j;
+    }
+    else {
+      if (i.index() < j.index()) {
+        if (*i != 0)
+          return false;
+        ++i;
+      }
+      else {
+        PPL_ASSERT(i.index() > j.index());
+        if (*j != 0)
+          return false;
+        ++j;
+      }
+    }
+  }
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      return false;
+  for ( ; j != j_end; ++j)
+    if (*j != 0)
+      return false;
+  return true;
+}
+
+template <typename Row>
+template <typename Row2>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Impl<Row2>& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  const Linear_Expression_Impl<Row>& x = *this;
+  PPL_ASSERT(start <= end);
+  PPL_ASSERT(end <= x.row.size());
+  PPL_ASSERT(end <= y.row.size());
+
+  // Deal with trivial cases.
+  if (c1 == 0) {
+    if (c2 == 0)
+      return true;
+    else
+      return y.all_zeroes(start, end);
+  }
+  if (c2 == 0)
+    return x.all_zeroes(start, end);
+
+  PPL_ASSERT(c1 != 0);
+  PPL_ASSERT(c2 != 0);
+  typename Row::const_iterator i = x.row.lower_bound(start);
+  typename Row::const_iterator i_end = x.row.lower_bound(end);
+  typename Row2::const_iterator j = y.row.lower_bound(start);
+  typename Row2::const_iterator j_end = y.row.lower_bound(end);
+  while (i != i_end && j != j_end) {
+    if (i.index() == j.index()) {
+      if ((*i) * c1 != (*j) * c2)
+        return false;
+      ++i;
+      ++j;
+    }
+    else {
+      if (i.index() < j.index()) {
+        if (*i != 0)
+          return false;
+        ++i;
+      }
+      else {
+        PPL_ASSERT(i.index() > j.index());
+        if (*j != 0)
+          return false;
+        ++j;
+      }
+    }
+  }
+  for ( ; i != i_end; ++i)
+    if (*i != 0)
+      return false;
+  for ( ; j != j_end; ++j)
+    if (*j != 0)
+      return false;
+  return true;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, Variable v) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, v);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, v);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, c1, c2);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, c1, c2);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return is_equal_to(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return is_equal_to(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator+=(const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return operator+=(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return operator+=(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return *this;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>&
+Linear_Expression_Impl<Row>
+::operator-=(const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return operator-=(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return operator-=(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return *this;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::add_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    add_mul_assign(factor, *p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    add_mul_assign(factor, *p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::sub_mul_assign(Coefficient_traits::const_reference factor,
+                 const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    sub_mul_assign(factor, *p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    sub_mul_assign(factor, *p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y, dimension_type i) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, i);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, i);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine(const Linear_Expression_Interface& y,
+                 Coefficient_traits::const_reference c1,
+                 Coefficient_traits::const_reference c2,
+                 dimension_type start, dimension_type end) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine(*p, c1, c2, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine(*p, c1, c2, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::linear_combine_lax(const Linear_Expression_Interface& y,
+                     Coefficient_traits::const_reference c1,
+                     Coefficient_traits::const_reference c2,
+                     dimension_type start, dimension_type end) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    linear_combine_lax(*p, c1, c2, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::compare(const Linear_Expression_Interface& y) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return compare(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return compare(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return 0;
+  }
+}
+
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return construct(*p);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return construct(*p);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::construct(const Linear_Expression_Interface& y,
+                                       dimension_type space_dim) {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return construct(*p, space_dim);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return construct(*p, space_dim);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>
+::scalar_product_assign(Coefficient& result,
+                        const Linear_Expression_Interface& y,
+                        dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    scalar_product_assign(result, *p, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    scalar_product_assign(result, *p, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename Row>
+int
+Linear_Expression_Impl<Row>
+::scalar_product_sign(const Linear_Expression_Interface& y,
+                      dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return scalar_product_sign(*p, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return scalar_product_sign(*p, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return 0;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+              dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return is_equal_to(*p, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return is_equal_to(*p, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::is_equal_to(const Linear_Expression_Interface& y,
+              Coefficient_traits::const_reference c1,
+              Coefficient_traits::const_reference c2,
+              dimension_type start, dimension_type end) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return is_equal_to(*p, c1, c2, start, end);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return is_equal_to(*p, c1, c2, start, end);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>
+::have_a_common_variable(const Linear_Expression_Interface& y,
+                         Variable first, Variable last) const {
+  typedef const Linear_Expression_Impl<Dense_Row>* Dense_Ptr;
+  typedef const Linear_Expression_Impl<Sparse_Row>* Sparse_Ptr;
+  if (const Dense_Ptr p = dynamic_cast<Dense_Ptr>(&y)) {
+    return have_a_common_variable(*p, first, last);
+  }
+  else if (const Sparse_Ptr p = dynamic_cast<Sparse_Ptr>(&y)) {
+    return have_a_common_variable(*p, first, last);
+  }
+  else {
+    // Add implementations for new derived classes here.
+    PPL_UNREACHABLE;
+    return false;
+  }
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::begin() const {
+  return new const_iterator(row, 1);
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::end() const {
+  return new const_iterator(row, row.size());
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::lower_bound(Variable v) const {
+  return new const_iterator(row, v.space_dimension());
+}
+
+template <typename Row>
+Linear_Expression_Impl<Row>::const_iterator
+::const_iterator(const Row& row1, dimension_type i)
+  : row(&row1), itr(row1.lower_bound(i)) {
+  skip_zeroes_forward();
+}
+
+template <typename Row>
+Linear_Expression_Interface::const_iterator_interface*
+Linear_Expression_Impl<Row>::const_iterator
+::clone() const {
+  return new const_iterator(*this);
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator++() {
+  ++itr;
+  skip_zeroes_forward();
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::const_iterator
+::operator--() {
+  --itr;
+  skip_zeroes_backward();
+}
+
+template <typename Row>
+typename Linear_Expression_Impl<Row>::const_iterator::reference
+Linear_Expression_Impl<Row>::const_iterator
+::operator*() const {
+  return *itr;
+}
+
+template <typename Row>
+Variable
+Linear_Expression_Impl<Row>::const_iterator
+::variable() const {
+  const dimension_type i = itr.index();
+  PPL_ASSERT(i != 0);
+  return Variable(i - 1);
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::const_iterator
+::operator==(const const_iterator_interface& x) const {
+  const const_iterator* const p = dynamic_cast<const const_iterator*>(&x);
+  // Comparing iterators belonging to different rows is forbidden.
+  PPL_ASSERT(p != 0);
+  PPL_ASSERT(row == p->row);
+  return itr == p->itr;
+}
+
+template <typename Row>
+void
+Linear_Expression_Impl<Row>::ascii_dump(std::ostream& s) const {
+  s << "size " << (space_dimension() + 1) << " ";
+  for (dimension_type i = 0; i < row.size(); ++i) {
+    s << row.get(i);
+    if (i != row.size() - 1)
+      s << ' ';
+  }
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str))
+    return false;
+  if (str != "size")
+    return false;
+
+  dimension_type new_size;
+  if (!(s >> new_size))
+    return false;
+
+  row.resize(0);
+  row.resize(new_size);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(c);
+
+  for (dimension_type j = 0; j < new_size; ++j) {
+    if (!(s >> c))
+      return false;
+    if (c != 0)
+      row.insert(j, c);
+  }
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename Row>
+bool
+Linear_Expression_Impl<Row>::OK() const {
+  return row.OK();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_Expression_Impl_defs.hh line 905. */
+
+/* Automatically generated from PPL source file ../src/Linear_Form_templates.hh line 1. */
+/* Linear_Form class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 1. */
+/* Box class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Con_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Gen_Relation;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+class Smash_Reduction;
+
+template <typename D1, typename D2>
+class Constraints_Reduction;
+
+template <typename D1, typename D2>
+class Congruences_Reduction;
+
+template <typename D1, typename D2>
+class Shape_Preserving_Reduction;
+
+template <typename D1, typename D2>
+class No_Reduction;
+
+template <typename D1, typename D2, typename R>
+class Partially_Reduced_Product;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 50. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+struct Interval_Base;
+
+//! Swaps \p x with \p y.
+/*! \relates Box */
+template <typename ITV>
+void swap(Box<ITV>& x, Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename ITV>
+bool operator==(const Box<ITV>& x, const Box<ITV>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same box.
+/*! \relates Box
+  Note that \p x and \p y may be dimension-incompatible boxes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename ITV>
+bool operator!=(const Box<ITV>& x, const Box<ITV>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream& operator<<(std::ostream& s, const Box<ITV>& box);
+
+} // namespace IO_Operators
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Box
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Box
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Box
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename ITV>
+bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box
+  Helper function for computing distances.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+          typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const Box<ITV>& x, const Box<ITV>& y,
+                    Rounding_Dir dir,
+                    Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A not necessarily closed, iso-oriented hyperrectangle.
+/*! \ingroup PPL_CXX_interface
+  A Box object represents the smash product of \f$n\f$
+  not necessarily closed and possibly unbounded intervals
+  represented by objects of class \p ITV,
+  where \f$n\f$ is the space dimension of the box.
+
+  An <EM>interval constraint</EM> (resp., <EM>interval congruence</EM>)
+  is a syntactic constraint (resp., congruence) that only mentions
+  a single space dimension.
+
+  The Box domain <EM>optimally supports</EM>:
+    - tautological and inconsistent constraints and congruences;
+    - the interval constraints that are optimally supported by
+      the template argument class \c ITV;
+    - the interval congruences that are optimally supported by
+      the template argument class \c ITV.
+
+  Depending on the method, using a constraint or congruence that is not
+  optimally supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  The user interface for the Box domain is meant to be as similar
+  as possible to the one developed for the polyhedron class C_Polyhedron.
+*/
+template <typename ITV>
+class Parma_Polyhedra_Library::Box {
+public:
+  //! The type of intervals used to implement the box.
+  typedef ITV interval_type;
+
+  //! Returns the maximum space dimension that a Box can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain does not recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty box of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the box;
+
+    \param kind
+    Specifies whether the universe or the empty box has to be built.
+  */
+  explicit Box(dimension_type num_dimensions = 0,
+               Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Box(const Box& y,
+      Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename Other_ITV>
+  explicit Box(const Box<Other_ITV>& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box from the system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref intervals "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+  */
+  explicit Box(const Constraint_System& cs);
+
+  //! Builds a box recycling a system of constraints \p cs.
+  /*!
+    The box inherits the space dimension of \p cs.
+
+    \param cs
+    A system of constraints: constraints that are not
+    \ref intervals "interval constraints"
+    are ignored (even though they may have contributed
+    to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a box from the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Box(const Generator_System& gs);
+
+  //! Builds a box recycling the system of generators \p gs.
+  /*!
+    Builds the smallest box containing the polyhedron defined by \p gs.
+    The box inherits the space dimension of \p gs.
+
+    \param gs
+    The generator system describing the polyhedron to be approximated.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  Box(const Generator_System& gs, Recycle_Input dummy);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they may have contributed to the space dimension).
+  */
+  explicit Box(const Congruence_System& cgs);
+
+  /*!
+    Builds the smallest box containing the grid defined by a
+    system of congruences \p cgs, recycling \p cgs.
+    The box inherits the space dimension of \p cgs.
+
+    \param cgs
+    A system of congruences: congruences that are not
+    non-relational equality constraints are ignored
+    (though they will contribute to the space dimension).
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  Box(const Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds a box containing the BDS \p bds.
+  /*!
+    Builds the smallest box containing \p bds using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const BD_Shape<T>& bds,
+               Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the octagonal shape \p oct.
+  /*!
+    Builds the smallest box containing \p oct using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  template <typename T>
+  explicit Box(const Octagonal_Shape<T>& oct,
+               Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the polyhedron \p ph.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the built box is the
+    smallest one containing \p ph.
+  */
+  explicit Box(const Polyhedron& ph,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a box containing the grid \p gr.
+  /*!
+    Builds the smallest box containing \p gr using a polynomial algorithm.
+    The \p complexity argument is ignored.
+  */
+  explicit Box(const Grid& gr,
+               Complexity_Class complexity = POLYNOMIAL_COMPLEXITY);
+
+  //! Builds a box containing the partially reduced product \p dp.
+  /*!
+    Builds a box containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+  */
+  template <typename D1, typename D2, typename R>
+  explicit Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Box& operator=(const Box& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void m_swap(Box& y);
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Box
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty box.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe box.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded box.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool contains(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Box& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Box
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Box
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    defining \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is not optimally supported by the Box domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the box domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints to be added. They may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the box domain.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+    \param cg
+    The congruence to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    or \p cg is not optimally supported by the box domain.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the box domain.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the box domain.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+    The constraints to be used for refinement.
+    To avoid termination problems, each constraint in \p cs
+    will be used for a single refinement step.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \note
+    The user is warned that the accuracy of this refinement operator
+    depends on the order of evaluation of the constraints in \p cs,
+    which is in general unpredictable. If a fine control on such an
+    order is needed, the user should consider calling the method
+    <code>refine_with_constraint(const Constraint& c)</code> inside
+    an appropriate looping construct.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the constraint \p c for constraint propagation on \p *this.
+
+    \param c
+    The constraint to be used for constraint propagation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void propagate_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraints in \p cs for constraint propagation on \p *this.
+
+    \param cs
+    The constraints to be used for constraint propagation.
+
+    \param max_iterations
+    The maximum number of propagation steps for each constraint in
+    \p cs.  If zero (the default), the number of propagation steps
+    will be unbounded, possibly resulting in an infinite loop.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    This method may lead to non-termination if \p max_iterations is 0.
+  */
+  void propagate_constraints(const Constraint_System& cs,
+                             dimension_type max_iterations = 0);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest box containing the union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Box& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Box& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*! \brief
+    Assigns to \p *this the \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point boundaries that
+    defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+    is not a dimension of \p *this.
+
+    This function is used in abstract interpretation to model an assignment
+    of a value that is correctly overapproximated by \p lf to the
+    floating point variable represented by \p var.
+  */
+  void affine_form_image(Variable var,
+                         const Linear_Form<ITV>& lf);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Box& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system.  When non-null,
+    the pointed-to constraint system is assumed to represent the
+    conditional or looping construct guard with respect to which
+    wrapping is performed.  Since wrapping requires the computation
+    of upper bounds and due to non-distributivity of constraint
+    refinement over upper bounds, passing a constraint system in this
+    way can be more precise than refining the result of the wrapping
+    operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter which is ignored for the Box domain.
+
+    \param wrap_individually
+    A precision parameter which is ignored for the Box domain.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename T>
+  typename Enable_If<Is_Same<T, Box>::value
+                     && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                     void>::type
+  CC76_widening_assign(const T& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop-point.
+
+    \param last
+    An iterator that points one past the last stop-point.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename T, typename Iterator>
+  typename Enable_If<Is_Same<T, Box>::value
+                     && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                     void>::type
+  CC76_widening_assign(const T& y,
+                       Iterator first, Iterator last);
+
+  //! Same as CC76_widening_assign(y, tp).
+  void widening_assign(const Box& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A box that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened box.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Box& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A Box that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  template <typename T>
+  typename Enable_If<Is_Same<T, Box>::value
+                     && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                     void>::type
+  CC76_narrowing_assign(const T& y);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old box into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    box, which is defined by a system of interval constraints in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the box and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new box, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the box \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the box
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Seeing a box as a set of tuples (its points),
+    assigns to \p *this all the tuples that can be obtained by concatenating,
+    in the order given, a tuple of \p *this with a tuple of \p y.
+
+    Let \f$B \sseq \Rset^n\f$ and \f$D \sseq \Rset^m\f$ be the boxes
+    corresponding, on entry, to \p *this and \p y, respectively.
+    Upon successful completion, \p *this will represent the box
+    \f$R \sseq \Rset^{n+m}\f$ such that
+    \f[
+      R \defeq
+          \Bigl\{\,
+            (x_1, \ldots, x_n, y_1, \ldots, y_m)^\transpose
+          \Bigm|
+            (x_1, \ldots, x_n)^\transpose \in B,
+            (y_1, \ldots, y_m)^\transpose \in D
+          \,\Bigl\}.
+    \f]
+    Another way of seeing it is as follows: first increases the space
+    dimension of \p *this by adding \p y.space_dimension() new
+    dimensions; then adds to the system of constraints of \p *this a
+    renamed-apart version of the constraints of \p y.
+  */
+  void concatenate_assign(const Box& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  /*! \brief
+    Returns a reference the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  const ITV& get_interval(Variable var) const;
+
+  /*! \brief
+    Sets to \p i the interval that bounds \p var.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void set_interval(Variable var, const ITV& i);
+
+  /*! \brief
+    If the space dimension of \p var is unbounded below, return
+    <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+    \p n, \p d and \p closed accordingly.
+
+    \note
+    It is assumed that <CODE>*this</CODE> is a non-empty box
+    having space dimension greater than or equal to that of \p var.
+    An undefined behavior is obtained if this assumption is not met.
+    \if Include_Implementation_Details
+    To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+    (having space dimension greater than or equal to that of \p var)
+    such that <CODE>!marked_empty()</CODE> holds, then the method can be
+    called without incurring in undefined behavior: it will return
+    <EM>unspecified</EM> boundary values that, if queried systematically
+    on all space dimensions, will encode the box emptiness.
+    \endif
+
+    Let \f$I\f$ be the interval corresponding to variable \p var
+    in the non-empty box <CODE>*this</CODE>.
+    If \f$I\f$ is not bounded from below, simply return <CODE>false</CODE>
+    (leaving all other parameters unchanged).
+    Otherwise, set \p n, \p d and \p closed as follows:
+     - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+       that the fraction \f$n/d\f$ corresponds to the greatest lower bound
+       of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+       that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+       and if \f$n\f$ is zero then \f$d\f$ is one;
+     - \p closed is set to <CODE>true</CODE> if and only if the lower
+       boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+  */
+  bool has_lower_bound(Variable var,
+                       Coefficient& n, Coefficient& d, bool& closed) const;
+
+  /*! \brief
+    If the space dimension of \p var is unbounded above, return
+    <CODE>false</CODE>. Otherwise return <CODE>true</CODE> and set
+    \p n, \p d and \p closed accordingly.
+
+    \note
+    It is assumed that <CODE>*this</CODE> is a non-empty box
+    having space dimension greater than or equal to that of \p var.
+    An undefined behavior is obtained if this assumption is not met.
+    \if Include_Implementation_Details
+    To be more precise, if <CODE>*this</CODE> is an <EM>empty</EM> box
+    (having space dimension greater than or equal to that of \p var)
+    such that <CODE>!marked_empty()</CODE> holds, then the method can be
+    called without incurring in undefined behavior: it will return
+    <EM>unspecified</EM> boundary values that, if queried systematically
+    on all space dimensions, will encode the box emptiness.
+    \endif
+
+    Let \f$I\f$ be the interval corresponding to variable \p var
+    in the non-empty box <CODE>*this</CODE>.
+    If \f$I\f$ is not bounded from above, simply return <CODE>false</CODE>
+    (leaving all other parameters unchanged).
+    Otherwise, set \p n, \p d and \p closed as follows:
+     - \p n and \p d are assigned the integers \f$n\f$ and \f$d\f$ such
+       that the fraction \f$n/d\f$ corresponds to the least upper bound
+       of \f$I\f$. The fraction \f$n/d\f$ is in canonical form, meaning
+       that \f$n\f$ and \f$d\f$ have no common factors, \f$d\f$ is positive,
+       and if \f$n\f$ is zero then \f$d\f$ is one;
+     - \p closed is set to <CODE>true</CODE> if and only if the upper
+       boundary of \f$I\f$ is closed (i.e., it is included in the interval).
+  */
+  bool has_upper_bound(Variable var,
+                       Coefficient& n, Coefficient& d, bool& closed) const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences approximating \p *this.
+  Congruence_System congruences() const;
+
+  //! Returns a minimized system of congruences approximating \p *this.
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If <CODE>x</CODE> and <CODE>y</CODE> are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool ascii_load(std::istream& s);
+
+private:
+  template <typename Other_ITV>
+  friend class Parma_Polyhedra_Library::Box;
+
+  friend bool
+  operator==<ITV>(const Box<ITV>& x, const Box<ITV>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library
+  ::IO_Operators::operator<<<>(std::ostream& s, const Box<ITV>& box);
+
+  template <typename Specialization, typename Temp, typename To, typename I>
+  friend bool Parma_Polyhedra_Library::l_m_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Box<I>& x, const Box<I>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+  //! The type of sequence used to implement the box.
+  typedef std::vector<ITV> Sequence;
+
+  /*! \brief
+    The type of intervals used by inner computations when trying to limit
+    the cumulative effect of approximation errors.
+  */
+  typedef ITV Tmp_Interval_Type;
+
+  //! A sequence of intervals, one for each dimension of the vector space.
+  Sequence seq;
+
+#define PPL_IN_Box_CLASS
+/* Automatically generated from PPL source file ../src/Box_Status_idefs.hh line 1. */
+/* Box<ITV>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Box_CLASS
+#error "Do not include Box_Status_idefs.hh directly; use Box_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Box<ITV> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>empty up-to-date</EM>: the empty flag is meaningful;
+  - <EM>empty</EM>: the box is the empty set.
+  - <EM>universe</EM>: the box is universe \f$n\f$-dimensional vector space
+     \f$\Rset^n\f$.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>empty up-to-date</EM> and <EM>empty</EM> excludes <EM>universe</EM>.
+*/
+class Status;
+
+class Status {
+public:
+  //! By default Status is the empty set of assertion.
+  Status();
+
+  //! Ordinary copy constructor.
+  Status(const Status& y);
+
+  //! Copy constructor from a box of different type.
+  template <typename Other_ITV>
+  Status(const typename Box<Other_ITV>::Status& y);
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_empty_up_to_date() const;
+  void reset_empty_up_to_date();
+  void set_empty_up_to_date();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_universe() const;
+  void reset_universe();
+  void set_universe();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t NONE             = 0U;
+  static const flags_t EMPTY_UP_TO_DATE = 1U << 0;
+  static const flags_t EMPTY            = 1U << 1;
+  static const flags_t UNIVERSE         = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 1768. */
+#undef PPL_IN_Box_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the box is known to be empty.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+public:
+  //! Causes the box to become empty, i.e., to represent the empty set.
+  void set_empty();
+
+private:
+  //! Marks \p *this as definitely not empty.
+  void set_nonempty();
+
+  //! Asserts the validity of the empty flag of \p *this.
+  void set_empty_up_to_date();
+
+  //! Invalidates empty flag of \p *this.
+  void reset_empty_up_to_date();
+
+  /*! \brief
+    Checks the hard way whether \p *this is an empty box:
+    returns <CODE>true</CODE> if and only if it is so.
+  */
+  bool check_empty() const;
+
+   /*! \brief
+     Returns a reference the interval that bounds
+     the box on the <CODE>k</CODE>-th space dimension.
+   */
+  const ITV& operator[](dimension_type k) const;
+
+  /*! \brief
+    WRITE ME.
+  */
+  static I_Result
+  refine_interval_no_check(ITV& itv,
+                           Constraint::Type type,
+                           Coefficient_traits::const_reference numer,
+                           Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void
+  add_interval_constraint_no_check(dimension_type var_id,
+                                   Constraint::Type type,
+                                   Coefficient_traits::const_reference numer,
+                                   Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_constraints_no_check(const Constraint_System& cs);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_congruence_no_check(const Congruence& cg);
+
+  /*! \brief
+    WRITE ME.
+  */
+  void add_congruences_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for the refinement.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the constraints in \p cs to refine \p *this.
+
+    \param cs
+    The constraints to be used for the refinement.
+    To avoid termination problems, each constraint in \p cs
+    will be used for a single refinement step.
+
+    \warning
+    If \p cs and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint_System& cs);
+
+  /*! \brief
+    Uses the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be added.
+    Nontrivial proper congruences are ignored.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  /*! \brief
+    Uses the congruences in \p cgs to refine \p *this.
+
+    \param cgs
+    The congruences to be added.
+    Nontrivial proper congruences are ignored.
+
+    \warning
+    If \p cgs and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence_System& cgs);
+
+  /*! \brief
+    Propagates the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be propagated.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+
+    \warning
+    This method may lead to non-termination.
+
+    \if Include_Implementation_Details
+
+    For any expression \f$e\f$, we denote by
+    \f$\left\uparrow e \right\uparrow\f$ (resp., \f$\left\downarrow e
+    \right\downarrow\f$) the result of any computation that is
+    guaranteed to yield an upper (resp., lower) approximation of
+    \f$e\f$.  So there exists \f$\epsilon \in \Rset\f$ with
+    \f$\epsilon \geq 0\f$ such that
+    \f$\left\uparrow e \right\uparrow = e + \epsilon\f$.
+    If \f$\epsilon = 0\f$ we say that the computation of
+    \f$\left\uparrow e \right\uparrow\f$ is <EM>exact</EM>;
+    we say it is <EM>inexact</EM> otherwise.
+    Similarly for \f$\left\downarrow e \right\downarrow\f$.
+
+    Consider a constraint of the general form
+    \f[
+      z + \sum_{i \in I}{a_ix_i} \relsym 0,
+    \f]
+    where \f$z \in \Zset\f$, \f$I\f$ is a set of indices,
+    \f$a_i \in \Zset\f$ with \f$a_i \neq 0\f$ for each \f$i \in I\f$, and
+    \f$\mathord{\relsym} \in \{ \mathord{\geq}, \mathord{>}, \mathord{=} \}\f$.
+    The set \f$I\f$ is subdivided into the disjoint sets \f$P\f$ and \f$N\f$
+    such that, for each \f$i \in I\f$, \f$a_i > 0\f$ if \f$i \in P\f$ and
+    \f$a_i < 0\f$ if \f$i \in N\f$.
+    Suppose that, for each \f$i \in P \union N\f$ a variation interval
+    \f$\chi_i \sseq \Rset\f$ is known for \f$x_i\f$ and that the infimum
+    and the supremum of \f$\chi_i\f$ are denoted, respectively,
+    by \f$\chi_i^\mathrm{l}\f$ and \f$\chi_i^\mathrm{u}\f$, where
+    \f$\chi_i^\mathrm{l}, \chi_i^\mathrm{u} \in \Rset \union \{ -\infty, +\infty \}\f$.
+
+    For each \f$k \in P\f$, we have
+    \f[
+      x_k
+        \relsym
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_ix_i}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_ix_i}
+            \Biggr).
+    \f]
+    Thus, if \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P \setdiff \{ k \}\f$,
+    we have
+    \f[
+      x_k
+        \geq
+          \Biggl\downarrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{l}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+            \Biggr)
+          \Biggr\downarrow
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N\f$ and
+    \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$P \setdiff \{ k \}\f$,
+    \f[
+      x_k
+        \leq
+          \Biggl\uparrow
+          \frac{1}{a_k}
+            \Biggl(
+              - z
+              - \sum_{i \in N}{a_i\chi_i^\mathrm{u}}
+              - \sum_{\genfrac{}{}{0pt}{}
+                              {\scriptstyle i \in P}
+                              {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+            \Biggr)
+          \Biggl\uparrow.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in N\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in P \setdiff \{ k \}\f$, or if the computation is inexact.
+
+    For each \f$k \in N\f$, we have
+    \f[
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_ix_i}
+          - \sum_{i \in P}{a_ix_i}
+        \Biggr)
+          \relsym
+            x_k.
+    \f]
+    Thus, if
+    \f$\chi_i^\mathrm{l} \in \Rset\f$
+    for each \f$i \in N \setdiff \{ k \}\f$ and
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in P\f$,
+    we have
+    \f[
+      \Biggl\uparrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{l}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{u}}
+        \Biggr)
+      \Biggl\uparrow
+        \geq
+          x_k
+    \f]
+    and, if \f$\mathord{\relsym} \in \{ \mathord{=} \}\f$,
+    \f$\chi_i^\mathrm{u} \in \Rset\f$ for each \f$i \in N \setdiff \{ k \}\f$
+    and \f$\chi_i^\mathrm{l} \in \Rset\f$ for each \f$i \in P\f$,
+    \f[
+      \Biggl\downarrow
+      \frac{1}{a_k}
+        \Biggl(
+          - z
+          - \sum_{\genfrac{}{}{0pt}{}
+                          {\scriptstyle i \in N}
+                          {\scriptstyle i \neq k}}{a_i\chi_i^\mathrm{u}}
+          - \sum_{i \in P}{a_i\chi_i^\mathrm{l}}
+        \Biggr)
+      \Biggl\downarrow
+        \leq
+          x_k.
+    \f]
+    In the first inequality, the relation is strict if
+    \f$\mathord{\relsym} \in \{ \mathord{>} \}\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    In the second inequality, the relation is strict if
+    \f$\chi_i^\mathrm{l} \notin \chi_i\f$ for some \f$i \in P\f$, or if
+    \f$\chi_i^\mathrm{u} \notin \chi_i\f$ for some
+    \f$i \in N \setdiff \{ k \}\f$, or if the computation is inexact.
+    \endif
+  */
+  void propagate_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    Propagates the constraints in \p cs to refine \p *this.
+
+    \param  cs
+    The constraints to be propagated.
+
+    \param max_iterations
+    The maximum number of propagation steps for each constraint in \p cs.
+    If zero, the number of propagation steps will be unbounded, possibly
+    resulting in an infinite loop.
+
+    \warning
+    If \p cs and \p *this are dimension-incompatible,
+    the behavior is undefined.
+
+    \warning
+    This method may lead to non-termination if \p max_iterations is 0.
+  */
+  void propagate_constraints_no_check(const Constraint_System& cs,
+                                      dimension_type max_iterations);
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p *this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  /*! \brief
+    Adds to \p limiting_box the interval constraints in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_box(const Constraint_System& cs,
+                        Box& limiting_box) const;
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const Box& y) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint_System& cs) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence_System& cgs) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+
+  template <typename C>
+  void throw_dimension_incompatible(const char* method,
+                                    const char* lf_name,
+                                    const Linear_Form<C>& lf) const;
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& le);
+
+  static void throw_invalid_argument(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns the relations holding between an interval and
+  an interval constraint.
+
+  \param i
+  The interval;
+
+  \param constraint_type
+  The constraint type;
+
+  \param numer
+  The numerator of the constraint bound;
+
+  \param denom
+  The denominator of the constraint bound
+
+  The interval constraint has the form
+  <CODE>denom * Variable(0) relsym numer</CODE>
+  where relsym is  <CODE>==</CODE>,  <CODE>></CODE> or  <CODE>>=</CODE>
+  depending on the <CODE>constraint_type</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+                  const Constraint::Type constraint_type,
+                  Coefficient_traits::const_reference numer,
+                  Coefficient_traits::const_reference denom = 1);
+
+class Box_Helpers {
+public:
+  // This is declared here so that Linear_Expression needs to be friend of
+  // Box_Helpers only, and doesn't need to be friend of this, too.
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Decodes the constraint \p c as an interval constraint.
+  /*! \relates Box
+    \return
+    <CODE>true</CODE> if the constraint \p c is an
+    \ref intervals "interval constraint";
+    <CODE>false</CODE> otherwise.
+
+    \param c
+    The constraint to be decoded.
+
+    \param c_num_vars
+    If <CODE>true</CODE> is returned, then it will be set to the number
+    of variables having a non-zero coefficient. The only legal values
+    will therefore be 0 and 1.
+
+    \param c_only_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the index of the only variable having
+    a non-zero coefficient in \p c.
+  */
+  #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  static bool extract_interval_constraint(const Constraint& c,
+                                          dimension_type& c_num_vars,
+                                          dimension_type& c_only_var);
+
+  // This is declared here so that Linear_Expression needs to be friend of
+  // Box_Helpers only, and doesn't need to be friend of this, too.
+  static bool extract_interval_congruence(const Congruence& cg,
+                                          dimension_type& cg_num_vars,
+                                          dimension_type& cg_only_var);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_Status_inlines.hh line 1. */
+/* Box<ITV>::Status class implementation: inline functions.
+*/
+
+
+#include <string>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status(const Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Status::Status(const typename Box<Other_ITV>::Status& y)
+  : flags(y.flags) {
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Status::Status()
+  : flags(NONE) {
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty_up_to_date() const {
+  return test_any(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty_up_to_date() {
+  reset(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty_up_to_date() {
+  set(EMPTY_UP_TO_DATE);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_empty() {
+  set(EMPTY);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::Status::test_universe() const {
+  return test_any(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::reset_universe() {
+  reset(UNIVERSE);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::Status::set_universe() {
+  set(UNIVERSE);
+}
+
+template <typename ITV>
+bool
+Box<ITV>::Status::OK() const {
+  if (test_empty_up_to_date()
+      && test_empty()
+      && test_universe()) {
+#ifndef NDEBUG
+    std::cerr
+      << "The status asserts emptiness and universality at the same time."
+      << std::endl;
+#endif
+    return false;
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Boxes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string empty_up_to_date = "EUP";
+const std::string empty = "EM";
+const std::string universe = "UN";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Box::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+template <typename ITV>
+void
+Box<ITV>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Boxes;
+  s << (test_empty_up_to_date() ? yes : no) << empty_up_to_date << separator
+    << (test_empty() ? yes : no) << empty << separator
+    << (test_universe() ? yes : no) << universe << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(ITV, Box<ITV>::Status)
+
+template <typename ITV>
+bool
+Box<ITV>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Boxes;
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, Implementation::Boxes::empty_up_to_date, positive))
+    return false;
+  if (positive)
+    set_empty_up_to_date();
+
+  if (!get_field(s, Implementation::Boxes::empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, universe, positive))
+    return false;
+  if (positive)
+    set_universe();
+  else
+    reset_universe();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_inlines.hh line 1. */
+/* Box class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 1. */
+/* Constraint_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 1. */
+/* Linear_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 1. */
+/* Swapping_Vector class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class Swapping_Vector;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 29. */
+
+#include <vector>
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A wrapper for std::vector that calls a swap() method instead of copying
+//! elements, when possible.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Swapping_Vector {
+
+public:
+  typedef typename std::vector<T>::const_iterator const_iterator;
+  typedef typename std::vector<T>::iterator iterator;
+  typedef typename std::vector<T>::size_type size_type;
+
+  Swapping_Vector();
+  explicit Swapping_Vector(dimension_type new_size);
+  Swapping_Vector(dimension_type new_size, const T& x);
+
+  void clear();
+  void reserve(dimension_type new_capacity);
+  void resize(dimension_type new_size);
+  void resize(dimension_type new_size, const T& x);
+
+  dimension_type size() const;
+  dimension_type capacity() const;
+  bool empty() const;
+
+  void m_swap(Swapping_Vector& v);
+
+  T& operator[](dimension_type i);
+  const T& operator[](dimension_type i) const;
+
+  T& back();
+  const T& back() const;
+
+  void push_back(const T& x);
+  void pop_back();
+
+  iterator begin();
+  iterator end();
+  const_iterator begin() const;
+  const_iterator end() const;
+
+  iterator erase(iterator itr);
+  iterator erase(iterator first, iterator last);
+
+  // This is defined only if T has an external_memory_in_bytes() method.
+  memory_size_type external_memory_in_bytes() const;
+
+  dimension_type max_num_rows();
+
+private:
+  std::vector<T> impl;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Swapping_Vector */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(Swapping_Vector<T>& x, Swapping_Vector<T>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_inlines.hh line 1. */
+/* Swapping_Vector class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector()
+  : impl() {
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type i)
+  : impl() {
+  // NOTE: This is not the same as constructing impl as `impl(i)', because
+  // this implementation calls compute_capacity().
+  resize(i);
+}
+
+template <typename T>
+inline
+Swapping_Vector<T>::Swapping_Vector(dimension_type new_size, const T& x)
+  : impl() {
+  resize(new_size, x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::clear() {
+  impl.clear();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::reserve(dimension_type new_capacity) {
+  if (impl.capacity() < new_capacity) {
+    // Reallocation will take place.
+    std::vector<T> new_impl;
+
+    new_impl.reserve(compute_capacity(new_capacity, max_num_rows()));
+    new_impl.resize(impl.size());
+
+    using std::swap;
+
+    // Steal the old elements.
+    for (dimension_type i = impl.size(); i-- > 0; )
+      swap(new_impl[i], impl[i]);
+
+    // Put the new vector into place.
+    swap(impl, new_impl);
+  }
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size) {
+  reserve(new_size);
+  impl.resize(new_size);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::resize(dimension_type new_size, const T& x) {
+  reserve(new_size);
+  impl.resize(new_size, x);
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::size() const {
+  return impl.size();
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::capacity() const {
+  return impl.capacity();
+}
+
+template <typename T>
+inline bool
+Swapping_Vector<T>::empty() const {
+  return impl.empty();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::m_swap(Swapping_Vector& v) {
+  using std::swap;
+  swap(impl, v.impl);
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::operator[](dimension_type i) {
+  return impl[i];
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::operator[](dimension_type i) const {
+  return impl[i];
+}
+
+template <typename T>
+inline T&
+Swapping_Vector<T>::back() {
+  return impl.back();
+}
+
+template <typename T>
+inline const T&
+Swapping_Vector<T>::back() const {
+  return impl.back();
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::push_back(const T& x) {
+  reserve(size() + 1);
+  impl.push_back(x);
+}
+
+template <typename T>
+inline void
+Swapping_Vector<T>::pop_back() {
+  impl.pop_back();
+}
+
+template <typename T>
+inline memory_size_type
+Swapping_Vector<T>::external_memory_in_bytes() const {
+  // Estimate the size of vector.
+  memory_size_type n = impl.capacity() * sizeof(T);
+  for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+    n += i->external_memory_in_bytes();
+  return n;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::begin() {
+  return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::end() {
+  return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::begin() const {
+  return impl.begin();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::const_iterator
+Swapping_Vector<T>::end() const {
+  return impl.end();
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator itr) {
+  PPL_ASSERT(itr >= begin());
+  PPL_ASSERT(itr < end());
+  const dimension_type old_i = itr - begin();
+  dimension_type i = old_i;
+  ++i;
+  while (i != size())
+    swap(impl[i-1], impl[i]);
+  impl.pop_back();
+  return begin() + old_i;
+}
+
+template <typename T>
+inline typename Swapping_Vector<T>::iterator
+Swapping_Vector<T>::erase(iterator first, iterator last) {
+  PPL_ASSERT(begin() <= first);
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= end());
+  const iterator old_first = first;
+  typedef typename std::iterator_traits<iterator>::difference_type diff_t;
+  const diff_t k = last - first;
+  const dimension_type n = static_cast<dimension_type>(end() - last);
+  using std::swap;
+  for (dimension_type i = 0; i < n; ++i, ++first)
+    swap(*first, *(first + k));
+  impl.erase(end() - k, end());
+  return old_first;
+}
+
+template <typename T>
+inline dimension_type
+Swapping_Vector<T>::max_num_rows() {
+  return impl.max_size();
+}
+
+template <typename T>
+inline void
+swap(Swapping_Vector<T>& vec1, Swapping_Vector<T>& vec2) {
+  vec1.m_swap(vec2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Swapping_Vector_defs.hh line 97. */
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 33. */
+
+/* Automatically generated from PPL source file ../src/Bit_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bit_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 39. */
+
+// TODO: Check how much of this description is still true.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for systems of constraints and generators.
+/*! \ingroup PPL_CXX_interface
+  An object of this class represents either a constraint system
+  or a generator system. Each Linear_System object can be viewed
+  as a finite sequence of strong-normalized Row objects,
+  where each Row implements a constraint or a generator.
+  Linear systems are characterized by the matrix of coefficients,
+  also encoding the number, size and capacity of Row objects,
+  as well as a few additional information, including:
+   - the topological kind of (all) the rows;
+   - an indication of whether or not some of the rows in the Linear_System
+     are <EM>pending</EM>, meaning that they still have to undergo
+     an (unspecified) elaboration; if there are pending rows, then these
+     form a proper suffix of the overall sequence of rows;
+   - a Boolean flag that, when <CODE>true</CODE>, ensures that the
+     non-pending prefix of the sequence of rows is sorted.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Linear_System {
+public:
+
+  // NOTE: `iterator' is actually a const_iterator.
+  typedef typename Swapping_Vector<Row>::const_iterator iterator;
+  typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+  //! Builds an empty linear system with specified topology.
+  /*!
+    Rows size and capacity are initialized to \f$0\f$.
+  */
+  Linear_System(Topology topol, Representation r);
+
+  //! Builds a system with specified topology and dimensions.
+  /*!
+    \param topol
+    The topology of the system that will be created;
+
+    \param space_dim
+    The number of space dimensions of the system that will be created.
+
+    \param r
+    The representation for system's rows.
+
+    Creates a \p n_rows \f$\times\f$ \p space_dim system whose
+    coefficients are all zero and with the given topology.
+  */
+  Linear_System(Topology topol, dimension_type space_dim, Representation r);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A tag class.
+  /*! \ingroup PPL_CXX_interface
+    Tag class to differentiate the Linear_System copy constructor that
+    copies pending rows as pending from the one that transforms
+    pending rows into non-pending ones.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  struct With_Pending {
+  };
+
+  //! Copy constructor: pending rows are transformed into non-pending ones.
+  Linear_System(const Linear_System& y);
+
+  //! Copy constructor with specified representation. Pending rows are
+  //! transformed into non-pending ones.
+  Linear_System(const Linear_System& y, Representation r);
+
+  //! Full copy constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, With_Pending);
+
+  //! Full copy constructor: pending rows are copied as pending.
+  Linear_System(const Linear_System& y, Representation r, With_Pending);
+
+  //! Assignment operator: pending rows are transformed into non-pending ones.
+  Linear_System& operator=(const Linear_System& y);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Linear_System& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Linear_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Linear_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the rows in the system.
+  /*!
+    The computation of the space dimension correctly ignores
+    the column encoding the inhomogeneous terms of constraint
+    (resp., the divisors of generators);
+    if the system topology is <CODE>NOT_NECESSARILY_CLOSED</CODE>,
+    also the column of the \f$\epsilon\f$-dimension coefficients
+    will be ignored.
+  */
+  dimension_type space_dimension() const;
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+  */
+  void remove_row(dimension_type i, bool keep_sorted = false);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(num_rows()).
+
+    Otherwise, this method just swaps the rows with the last ones and then
+    removes them, so it costs O(last - first).
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                  bool keep_sorted = false);
+
+  // TODO: Consider removing this.
+  //! Removes the specified rows. The row ordering of remaining rows is
+  //! preserved.
+  /*!
+    \param indexes specifies a list of row indexes.
+                   It must be sorted.
+  */
+  void remove_rows(const std::vector<dimension_type>& indexes);
+
+  // TODO: Consider making this private.
+  //! Removes all the specified dimensions from the system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  // TODO: Consider making this private.
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    space dimensions must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! \name Subscript operators
+  //@{
+  //! Returns a const reference to the \p k-th row of the system.
+  const Row& operator[](dimension_type k) const;
+  //@} // Subscript operators
+
+  iterator begin();
+  iterator end();
+  const_iterator begin() const;
+  const_iterator end() const;
+
+  bool has_no_rows() const;
+  dimension_type num_rows() const;
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  //! Sign-normalizes the system.
+  void sign_normalize();
+
+  //! \name Accessors
+  //@{
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+  //@} // Accessors
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  //! Sets the system topology to \p t .
+  void set_topology(Topology t);
+
+  //! Sets the system topology to <CODE>NECESSARILY_CLOSED</CODE>.
+  void set_necessarily_closed();
+
+  //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  void set_not_necessarily_closed();
+
+  // TODO: Consider removing this, or making it private.
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  // TODO: Consider removing this, or making it private.
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Adds \p n rows and space dimensions to the system.
+  /*!
+    \param n
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_universe_rows_and_space_dimensions(dimension_type n);
+
+  /*! \brief
+    Adds a copy of \p r to the system,
+    automatically resizing the system or the row's copy, if needed.
+  */
+  void insert(const Row& r);
+
+  /*! \brief
+    Adds a copy of the given row to the pending part of the system,
+    automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(const Row& r);
+
+  /*! \brief
+    Adds \p r to the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+  */
+  void insert(Row& r, Recycle_Input);
+
+  /*! \brief
+    Adds the given row to the pending part of the system, stealing its
+    contents and automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(Row& r, Recycle_Input);
+
+  //! Adds to \p *this a copy of  the rows of \p y.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(const Linear_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void insert_pending(const Linear_System& r);
+
+  //! Adds to \p *this a the rows of `y', stealing them from `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(Linear_System& r, Recycle_Input);
+
+  //! Adds the rows of `y' to the pending part of `*this', stealing them from
+  //! `y'.
+  void insert_pending(Linear_System& r, Recycle_Input);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Sorts the rows (in growing order) form \p first_row to
+    \p last_row and eliminates duplicated ones.
+  */
+  void sort_rows(dimension_type first_row, dimension_type last_row);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Linear_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most space dimensions.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as to
+    simplify the linear system.
+  */
+  void simplify();
+
+  //! Clears the system deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Reads into a Linear_System object the information produced by the
+    output of ascii_dump(std::ostream&) const.  The specialized methods
+    provided by Constraint_System and Generator_System take care of
+    properly reading the contents of the system.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! The vector that contains the rows.
+  /*!
+    \note This is public for convenience. Clients that modify if must preserve
+          the class invariant.
+  */
+  Swapping_Vector<Row> rows;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void remove_row_no_ok(dimension_type i, bool keep_sorted = false);
+
+  /*! \brief
+    Adds \p r to the pending part of the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void insert_pending_no_ok(Row& r, Recycle_Input);
+
+  /*! \brief
+    Adds \p r to the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void insert_no_ok(Row& r, Recycle_Input);
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  /*!
+    This method is for internal use, it does *not* assert OK() at the end,
+    so it can be used for invalid systems.
+  */
+  void set_space_dimension_no_ok(dimension_type space_dim);
+
+  //! Swaps the [first,last) row interval with the
+  //! [first + offset, last + offset) interval.
+  /*!
+    These intervals may not be disjunct.
+
+    Sorting of these intervals is *not* preserved.
+
+    Either both intervals contain only not-pending rows, or they both
+    contain pending rows.
+  */
+  void swap_row_intervals(dimension_type first, dimension_type last,
+                          dimension_type offset);
+
+  //! The space dimension of each row. All rows must have this number of
+  //! space dimensions.
+  dimension_type space_dimension_;
+
+  //! The topological kind of the rows in the system. All rows must have this
+  //! topology.
+  Topology row_topology;
+
+  //! The index of the first pending row.
+  dimension_type index_first_pending;
+
+  /*! \brief
+    <CODE>true</CODE> if rows are sorted in the ascending order as defined by
+    <CODE>bool compare(const Row&, const Row&)</CODE>.
+    If <CODE>false</CODE> may not be sorted.
+  */
+  bool sorted;
+
+  Representation representation_;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  struct Row_Less_Than {
+    bool operator()(const Row& x, const Row& y) const;
+  };
+
+  //! Comparison predicate (used when implementing the unique algorithm).
+  struct Unique_Compare {
+    Unique_Compare(const Swapping_Vector<Row>& cont,
+                   dimension_type base = 0);
+
+    bool operator()(dimension_type i, dimension_type j) const;
+
+    const Swapping_Vector<Row>& container;
+    const dimension_type base_index;
+  };
+
+  friend class Polyhedron;
+  friend class Generator_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Parma_Polyhedra_Library::Linear_System<Row>& x,
+          Parma_Polyhedra_Library::Linear_System<Row>& y);
+
+} // namespace std
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_inlines.hh line 1. */
+/* Linear_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Row_defs.hh line 1. */
+/* Bit_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Row_defs.hh line 29. */
+#include <iosfwd>
+#include <gmpxx.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Row */
+void swap(Bit_Row& x, Bit_Row& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void
+iter_swap(std::vector<Bit_Row>::iterator x,
+          std::vector<Bit_Row>::iterator y);
+
+// Put them in the namespace here to declare them friends later.
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Bit_Row
+  Compares \p x with \p y starting from the least significant bits.
+  The ordering is total and has the following property: if \p x and \p y
+  are two rows seen as sets of naturals, if \p x is a strict subset
+  of \p y, then \p x comes before \p y.
+
+  Returns
+  - -1 if \p x comes before \p y in the ordering;
+  -  0 if \p x and \p y are equal;
+  -  1 if \p x comes after \p y in the ordering.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+int compare(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Set-theoretic inclusion test: sets \p strict_subset to a Boolean
+  indicating whether the inclusion is strict or not.
+
+  \relates Bit_Row
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+                     bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Bit_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row in a matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Row {
+public:
+  //! Default constructor.
+  Bit_Row();
+
+  //! Copy constructor.
+  Bit_Row(const Bit_Row& y);
+
+  //! Set-union constructor.
+  /*!
+    Constructs an object containing the set-union of \p y and \p z.
+  */
+  Bit_Row(const Bit_Row& y, const Bit_Row& z);
+
+  //! Destructor.
+  ~Bit_Row();
+
+  //! Assignment operator.
+  Bit_Row& operator=(const Bit_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Bit_Row& y);
+
+  //! Returns the truth value corresponding to the bit in position \p k.
+  bool operator[](unsigned long k) const;
+
+  //! Sets the bit in position \p k.
+  void set(unsigned long k);
+
+  //! Sets bits up to position \p k (excluded).
+  void set_until(unsigned long k);
+
+  //! Clears the bit in position \p k.
+  void clear(unsigned long k);
+
+  //! Clears bits from position \p k (included) onward.
+  void clear_from(unsigned long k);
+
+  //! Clears all the bits of the row.
+  void clear();
+
+  //! Assigns to \p *this the set-theoretic union of \p x and \p y.
+  void union_assign(const Bit_Row& x, const Bit_Row& y);
+
+  //! Assigns to \p *this the set-theoretic intersection of \p x and \p y.
+  void intersection_assign(const Bit_Row& x, const Bit_Row& y);
+
+  //! Assigns to \p *this the set-theoretic difference of \p x and \p y.
+  void difference_assign(const Bit_Row& x, const Bit_Row& y);
+
+
+  friend int compare(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator==(const Bit_Row& x, const Bit_Row& y);
+  friend bool operator!=(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y);
+  friend bool subset_or_equal(const Bit_Row& x, const Bit_Row& y,
+                              bool& strict_subset);
+  friend bool strict_subset(const Bit_Row& x, const Bit_Row& y);
+
+  //! Returns the index of the first set bit or ULONG_MAX if no bit is set.
+  unsigned long first() const;
+
+  /*! \brief
+    Returns the index of the first set bit after \p position
+    or ULONG_MAX if no bit after \p position is set.
+  */
+  unsigned long next(unsigned long position) const;
+
+  //! Returns the index of the last set bit or ULONG_MAX if no bit is set.
+  unsigned long last() const;
+
+  /*! \brief
+    Returns the index of the first set bit before \p position
+    or ULONG_MAX if no bits before \p position is set.
+  */
+  unsigned long prev(unsigned long position) const;
+
+  //! Returns the number of set bits in the row.
+  unsigned long count_ones() const;
+
+  //! Returns <CODE>true</CODE> if no bit is set in the row.
+  bool empty() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied
+  bool OK() const;
+
+private:
+  //! Bit-vector representing the row.
+  mpz_t vec;
+
+  //! Assigns to \p *this the union of \p y and \p z.
+  /*!
+    The size of \p y must be be less than or equal to the size of \p z.
+    Upon entry, \p vec must have allocated enough space to contain the result.
+  */
+  void union_helper(const Bit_Row& y, const Bit_Row& z);
+};
+
+/* Automatically generated from PPL source file ../src/Bit_Row_inlines.hh line 1. */
+/* Bit_Row class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Row_inlines.hh line 30. */
+
+// For the declaration of ffs(3).
+#if defined(PPL_HAVE_STRINGS_H)
+# include <strings.h>
+#elif defined(PPL_HAVE_STRING_H)
+# include <string.h>
+#endif
+
+#define PPL_BITS_PER_GMP_LIMB sizeof_to_bits(PPL_SIZEOF_MP_LIMB_T)
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Row::Bit_Row() {
+  mpz_init(vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y) {
+  mpz_init_set(vec, y.vec);
+}
+
+inline
+Bit_Row::Bit_Row(const Bit_Row& y, const Bit_Row& z) {
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  const mp_size_t z_size = z.vec->_mp_size;
+  PPL_ASSERT(z_size >= 0);
+  if (y_size < z_size) {
+    PPL_ASSERT(static_cast<unsigned long>(z_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_init2(vec, static_cast<unsigned long>(z_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(y, z);
+  }
+  else {
+    PPL_ASSERT(static_cast<unsigned long>(y_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_init2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(z, y);
+  }
+}
+
+inline
+Bit_Row::~Bit_Row() {
+  mpz_clear(vec);
+}
+
+inline Bit_Row&
+Bit_Row::operator=(const Bit_Row& y) {
+  mpz_set(vec, y.vec);
+  return *this;
+}
+
+inline void
+Bit_Row::set(const unsigned long k) {
+  mpz_setbit(vec, k);
+}
+
+inline void
+Bit_Row::clear(const unsigned long k) {
+  mpz_clrbit(vec, k);
+}
+
+inline void
+Bit_Row::clear_from(const unsigned long k) {
+  mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Bit_Row::count_ones() const {
+  const mp_size_t x_size = vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  return (x_size == 0) ? 0 : mpn_popcount(vec->_mp_d, x_size);
+}
+
+inline bool
+Bit_Row::empty() const {
+  return mpz_sgn(vec) == 0;
+}
+
+inline void
+Bit_Row::m_swap(Bit_Row& y) {
+  mpz_swap(vec, y.vec);
+}
+
+inline void
+Bit_Row::clear() {
+  mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Bit_Row::external_memory_in_bytes() const {
+  return static_cast<memory_size_type>(vec[0]._mp_alloc) * PPL_SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Bit_Row::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline void
+Bit_Row::union_assign(const Bit_Row& x, const Bit_Row& y) {
+  const mp_size_t x_size = x.vec->_mp_size;
+  PPL_ASSERT(x_size >= 0);
+  const mp_size_t y_size = y.vec->_mp_size;
+  PPL_ASSERT(y_size >= 0);
+  if (x_size < y_size) {
+    PPL_ASSERT(static_cast<unsigned long>(y_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_realloc2(vec, static_cast<unsigned long>(y_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(x, y);
+  }
+  else {
+    PPL_ASSERT(static_cast<unsigned long>(x_size)
+               <= C_Integer<unsigned long>::max / PPL_BITS_PER_GMP_LIMB);
+    mpz_realloc2(vec, static_cast<unsigned long>(x_size) * PPL_BITS_PER_GMP_LIMB);
+    union_helper(y, x);
+  }
+}
+
+inline void
+Bit_Row::intersection_assign(const Bit_Row& x, const Bit_Row& y) {
+  mpz_and(vec, x.vec, y.vec);
+}
+
+inline void
+Bit_Row::difference_assign(const Bit_Row& x, const Bit_Row& y) {
+  PPL_DIRTY_TEMP(mpz_class, complement_y);
+  mpz_com(complement_y.get_mpz_t(), y.vec);
+  mpz_and(vec, x.vec, complement_y.get_mpz_t());
+}
+
+namespace Implementation {
+
+/*! \brief
+  Assuming \p u is nonzero, returns the index of the first set bit in \p u.
+*/
+inline unsigned int
+first_one(unsigned int u) {
+  return ctz(u);
+}
+
+/*! \brief
+  Assuming \p ul is nonzero, returns the index of the first set bit in
+  \p ul.
+*/
+inline unsigned int
+first_one(unsigned long ul) {
+  return ctz(ul);
+}
+
+/*! \brief
+  Assuming \p ull is nonzero, returns the index of the first set bit in
+  \p ull.
+*/
+inline unsigned int
+first_one(unsigned long long ull) {
+  return ctz(ull);
+}
+
+/*! \brief
+  Assuming \p u is nonzero, returns the index of the last set bit in \p u.
+*/
+inline unsigned int
+last_one(unsigned int u) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(u)))
+    - 1U - clz(u);
+}
+
+/*! \brief
+  Assuming \p ul is nonzero, returns the index of the last set bit in
+  \p ul.
+*/
+inline unsigned int
+last_one(unsigned long ul) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(ul)))
+    - 1U - clz(ul);
+}
+
+/*! \brief
+  Assuming \p ull is nonzero, returns the index of the last set bit in
+  \p ull.
+*/
+inline unsigned int
+last_one(unsigned long long ull) {
+  return static_cast<unsigned int>(sizeof_to_bits(sizeof(ull)))
+    - 1U - clz(ull);
+}
+
+} // namespace Implementation
+
+/*! \relates Bit_Row */
+inline void
+swap(Bit_Row& x, Bit_Row& y) {
+  x.m_swap(y);
+}
+
+/*! \relates Bit_Row */
+inline void
+iter_swap(std::vector<Bit_Row>::iterator x,
+          std::vector<Bit_Row>::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Row_defs.hh line 213. */
+
+/* Automatically generated from PPL source file ../src/Linear_System_inlines.hh line 29. */
+
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::external_memory_in_bytes() const {
+  return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+inline memory_size_type
+Linear_System<Row>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_sorted() const {
+  // The flag `sorted' does not really reflect the sortedness status
+  // of a system (if `sorted' evaluates to `false' nothing is known).
+  // This assertion is used to ensure that the system
+  // is actually sorted when `sorted' value is 'true'.
+  PPL_ASSERT(!sorted || check_sorted());
+  return sorted;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_sorted(const bool b) {
+  sorted = b;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol, Representation r)
+  : rows(),
+    space_dimension_(0),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true),
+    representation_(r) {
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(Topology topol,
+                                  dimension_type space_dim,
+                                  Representation r)
+  : rows(),
+    space_dimension_(0),
+    row_topology(topol),
+    index_first_pending(0),
+    sorted(true),
+    representation_(r) {
+  set_space_dimension(space_dim);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::first_pending_row() const {
+  return index_first_pending;
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_pending_rows() const {
+  PPL_ASSERT(num_rows() >= first_pending_row());
+  return num_rows() - first_pending_row();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::unset_pending_rows() {
+  index_first_pending = num_rows();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_index_first_pending_row(const dimension_type i) {
+  index_first_pending = i;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y)
+  : rows(y.rows),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    representation_(y.representation_) {
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  unset_pending_rows();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r)
+  : rows(),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    representation_(r) {
+  rows.resize(y.num_rows());
+  for (dimension_type i = 0; i < y.num_rows(); ++i) {
+    // Create the copies with the right representation.
+    Row row(y.rows[i], r);
+    swap(rows[i], row);
+  }
+  // Previously pending rows may violate sortedness.
+  sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+  unset_pending_rows();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, With_Pending)
+  : rows(y.rows),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted),
+    representation_(y.representation_) {
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Linear_System(const Linear_System& y, Representation r,
+                                  With_Pending)
+  : rows(),
+    space_dimension_(y.space_dimension_),
+    row_topology(y.row_topology),
+    index_first_pending(y.index_first_pending),
+    sorted(y.sorted),
+    representation_(r) {
+  rows.resize(y.num_rows());
+  for (dimension_type i = 0; i < y.num_rows(); ++i) {
+    // Create the copies with the right representation.
+    Row row(y.rows[i], r);
+    swap(rows[i], row);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline Linear_System<Row>&
+Linear_System<Row>::operator=(const Linear_System& y) {
+  // NOTE: Pending rows are transformed into non-pending ones.
+  Linear_System<Row> tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::assign_with_pending(const Linear_System& y) {
+  Linear_System<Row> tmp(y, With_Pending());
+  swap(*this, tmp);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::m_swap(Linear_System& y) {
+  using std::swap;
+  swap(rows, y.rows);
+  swap(space_dimension_, y.space_dimension_);
+  swap(row_topology, y.row_topology);
+  swap(index_first_pending, y.index_first_pending);
+  swap(sorted, y.sorted);
+  swap(representation_, y.representation_);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(y.OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::clear() {
+  // Note: do NOT modify the value of `row_topology' and `representation'.
+  rows.clear();
+  index_first_pending = 0;
+  sorted = true;
+  space_dimension_ = 0;
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_necessarily_closed() {
+  PPL_ASSERT(topology() == NOT_NECESSARILY_CLOSED);
+  row_topology = NECESSARILY_CLOSED;
+  ++space_dimension_;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].mark_as_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::mark_as_not_necessarily_closed() {
+  PPL_ASSERT(topology() == NECESSARILY_CLOSED);
+  PPL_ASSERT(space_dimension() > 0);
+  row_topology = NOT_NECESSARILY_CLOSED;
+  --space_dimension_;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].mark_as_not_necessarily_closed();
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_topology(Topology t) {
+  if (topology() == t)
+    return;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].set_topology(t);
+  row_topology = t;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_necessarily_closed() {
+  set_topology(NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_not_necessarily_closed() {
+  set_topology(NOT_NECESSARILY_CLOSED);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::is_necessarily_closed() const {
+  return row_topology == NECESSARILY_CLOSED;
+}
+
+template <typename Row>
+inline const Row&
+Linear_System<Row>::operator[](const dimension_type k) const {
+  return rows[k];
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::begin() {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::iterator
+Linear_System<Row>::end() {
+  return rows.end();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::begin() const {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Linear_System<Row>::const_iterator
+Linear_System<Row>::end() const {
+  return rows.end();
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::has_no_rows() const {
+  return rows.empty();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::num_rows() const {
+  return rows.size();
+}
+
+template <typename Row>
+inline Topology
+Linear_System<Row>::topology() const {
+  return row_topology;
+}
+
+template <typename Row>
+inline Representation
+Linear_System<Row>::representation() const {
+  return representation_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_representation(Representation r) {
+  representation_ = r;
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].set_representation(r);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::max_space_dimension() {
+  return Row::max_space_dimension();
+}
+
+template <typename Row>
+inline dimension_type
+Linear_System<Row>::space_dimension() const {
+  return space_dimension_;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension_no_ok(dimension_type space_dim) {
+  for (dimension_type i = rows.size(); i-- > 0; )
+    rows[i].set_space_dimension_no_ok(space_dim);
+  space_dimension_ = space_dim;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::set_space_dimension(dimension_type space_dim) {
+  set_space_dimension_no_ok(space_dim);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row_no_ok(const dimension_type i,
+                                     const bool keep_sorted) {
+  PPL_ASSERT(i < num_rows());
+  const bool was_pending = (i >= index_first_pending);
+
+  if (sorted && keep_sorted && !was_pending) {
+    for (dimension_type j = i + 1; j < rows.size(); ++j)
+      swap(rows[j], rows[j-1]);
+    rows.pop_back();
+  }
+  else {
+    if (!was_pending)
+      sorted = false;
+    const bool last_row_is_pending = (num_rows() - 1 >= index_first_pending);
+    if (was_pending == last_row_is_pending)
+      // Either both rows are pending or both rows are not pending.
+      swap(rows[i], rows.back());
+    else {
+      // Pending rows are stored after the non-pending ones.
+      PPL_ASSERT(!was_pending);
+      PPL_ASSERT(last_row_is_pending);
+
+      // Swap the row with the last non-pending row.
+      swap(rows[i], rows[index_first_pending - 1]);
+
+      // Now the (non-pending) row that has to be deleted is between the
+      // non-pending and the pending rows.
+      swap(rows[i], rows.back());
+    }
+    rows.pop_back();
+  }
+  if (!was_pending)
+    // A non-pending row has been removed.
+    --index_first_pending;
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_row(const dimension_type i, bool keep_sorted) {
+  remove_row_no_ok(i, keep_sorted);
+  PPL_ASSERT(OK());
+}
+
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(dimension_type first,
+                                dimension_type last,
+                                bool keep_sorted) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last <= num_rows());
+  const dimension_type n = last - first;
+
+  if (n == 0)
+    return;
+
+  // All the rows that have to be removed must have the same (pending or
+  // non-pending) status.
+  PPL_ASSERT(first >= index_first_pending || last <= index_first_pending);
+
+  const bool were_pending = (first >= index_first_pending);
+
+  // Move the rows in [first,last) at the end of the system.
+  if (sorted && keep_sorted && !were_pending) {
+    // Preserve the row ordering.
+    for (dimension_type i = last; i < rows.size(); ++i)
+      swap(rows[i], rows[i - n]);
+
+    rows.resize(rows.size() - n);
+
+    // `n' non-pending rows have been removed.
+    index_first_pending -= n;
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // We can ignore the row ordering, but we must not mix pending and
+  // non-pending rows.
+
+  const dimension_type offset = rows.size() - n - first;
+  // We want to swap the rows in [first, last) and
+  // [first + offset, last + offset) (note that these intervals may not be
+  // disjunct).
+
+  if (index_first_pending == num_rows()) {
+    // There are no pending rows.
+    PPL_ASSERT(!were_pending);
+
+    swap_row_intervals(first, last, offset);
+
+    rows.resize(rows.size() - n);
+
+    // `n' non-pending rows have been removed.
+    index_first_pending -= n;
+  }
+  else {
+    // There are some pending rows in [first + offset, last + offset).
+    if (were_pending) {
+      // Both intervals contain only pending rows, because the second
+      // interval is after the first.
+
+      swap_row_intervals(first, last, offset);
+
+      rows.resize(rows.size() - n);
+
+      // `n' non-pending rows have been removed.
+      index_first_pending -= n;
+    }
+    else {
+      PPL_ASSERT(rows.size() - n < index_first_pending);
+      PPL_ASSERT(rows.size() > index_first_pending);
+      PPL_ASSERT(!were_pending);
+      // In the [size() - n, size()) interval there are some non-pending
+      // rows and some pending ones. Be careful not to mix them.
+
+      PPL_ASSERT(index_first_pending >= last);
+      swap_row_intervals(first, last, index_first_pending - last);
+
+      // Mark the rows that must be deleted as pending.
+      index_first_pending -= n;
+      first = index_first_pending;
+      last = first + n;
+
+      // Move them at the end of the system.
+      swap_row_intervals(first, last, num_rows() - last);
+
+      // Actually remove the rows.
+      rows.resize(rows.size() - n);
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::swap_row_intervals(dimension_type first,
+                                       dimension_type last,
+                                       dimension_type offset) {
+  PPL_ASSERT(first <= last);
+  PPL_ASSERT(last + offset <= num_rows());
+#ifndef NDEBUG
+  if (first < last) {
+    bool first_interval_has_pending_rows = (last > index_first_pending);
+    bool second_interval_has_pending_rows = (last + offset > index_first_pending);
+    bool first_interval_has_not_pending_rows = (first < index_first_pending);
+    bool second_interval_has_not_pending_rows = (first + offset < index_first_pending);
+    PPL_ASSERT(first_interval_has_not_pending_rows
+               == !first_interval_has_pending_rows);
+    PPL_ASSERT(second_interval_has_not_pending_rows
+               == !second_interval_has_pending_rows);
+    PPL_ASSERT(first_interval_has_pending_rows
+               == second_interval_has_pending_rows);
+  }
+#endif
+  if (first + offset < last) {
+    // The intervals are not disjunct, make them so.
+    const dimension_type k = last - first - offset;
+    last -= k;
+    offset += k;
+  }
+
+  if (first == last)
+    // Nothing to do.
+    return;
+
+  for (dimension_type i = first; i < last; ++i)
+    swap(rows[i], rows[i + offset]);
+
+  if (first < index_first_pending)
+    // The swaps involved not pending rows, so they may not be sorted anymore.
+    set_sorted(false);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_rows(const std::vector<dimension_type>& indexes) {
+#ifndef NDEBUG
+  {
+    // Check that `indexes' is sorted.
+    std::vector<dimension_type> sorted_indexes = indexes;
+    std::sort(sorted_indexes.begin(), sorted_indexes.end());
+    PPL_ASSERT(indexes == sorted_indexes);
+
+    // Check that the last index (if any) is lower than num_rows().
+    // This guarantees that all indexes are in [0, num_rows()).
+    if (!indexes.empty())
+      PPL_ASSERT(indexes.back() < num_rows());
+  }
+#endif
+
+  if (indexes.empty())
+    return;
+
+  const dimension_type rows_size = rows.size();
+  typedef std::vector<dimension_type>::const_iterator itr_t;
+
+  // `i' and last_unused_row' start with the value `indexes[0]' instead
+  // of `0', because the loop would just increment `last_unused_row' in the
+  // preceding iterations.
+  dimension_type last_unused_row = indexes[0];
+  dimension_type i = indexes[0];
+  itr_t itr = indexes.begin();
+  itr_t itr_end = indexes.end();
+  while (itr != itr_end) {
+    // i <= *itr < rows_size
+    PPL_ASSERT(i < rows_size);
+    if (*itr == i) {
+      // The current row has to be removed, don't increment last_unused_row.
+      ++itr;
+    }
+    else {
+      // The current row must not be removed, swap it after the last used row.
+      swap(rows[last_unused_row], rows[i]);
+      ++last_unused_row;
+    }
+    ++i;
+  }
+
+  // Move up the remaining rows, if any.
+  for ( ; i < rows_size; ++i) {
+    swap(rows[last_unused_row], rows[i]);
+    ++last_unused_row;
+  }
+
+  PPL_ASSERT(last_unused_row == num_rows() - indexes.size());
+
+  // The rows that have to be removed are now at the end of the system, just
+  // remove them.
+  rows.resize(last_unused_row);
+
+  // Adjust index_first_pending.
+  if (indexes[0] >= index_first_pending) {
+    // Removing pending rows only.
+  }
+  else {
+    if (indexes.back() < index_first_pending) {
+      // Removing non-pending rows only.
+      index_first_pending -= indexes.size();
+    }
+    else {
+      // Removing some pending and some non-pending rows, count the
+      // non-pending rows that must be removed.
+      // This exploits the fact that `indexes' is sorted by using binary
+      // search.
+      itr_t j = std::lower_bound(indexes.begin(), indexes.end(),
+                                 index_first_pending);
+      std::iterator_traits<itr_t>::difference_type
+        non_pending = j - indexes.begin();
+      index_first_pending -= static_cast<dimension_type>(non_pending);
+    }
+  }
+
+  // NOTE: This method does *not* call set_sorted(false), because it preserves
+  // the relative row ordering.
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>::remove_trailing_rows(const dimension_type n) {
+  PPL_ASSERT(rows.size() >= n);
+  rows.resize(rows.size() - n);
+  if (first_pending_row() > rows.size())
+    index_first_pending = rows.size();
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  for (dimension_type i = num_rows(); i-- > 0; )
+    rows[i].permute_space_dimensions(cycle);
+  sorted = false;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Linear_System<Row>
+::swap_space_dimensions(Variable v1, Variable v2) {
+  PPL_ASSERT(v1.space_dimension() <= space_dimension());
+  PPL_ASSERT(v2.space_dimension() <= space_dimension());
+  for (dimension_type k = num_rows(); k-- > 0; )
+    rows[k].swap_space_dimensions(v1, v2);
+  sorted = false;
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline bool
+operator!=(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+  return !(x == y);
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Row_Less_Than::operator()(const Row& x,
+                                              const Row& y) const {
+  return compare(x, y) < 0;
+}
+
+template <typename Row>
+inline
+Linear_System<Row>::Unique_Compare
+::Unique_Compare(const Swapping_Vector<Row>& cont,
+                 dimension_type base)
+  : container(cont), base_index(base) {
+}
+
+template <typename Row>
+inline bool
+Linear_System<Row>::Unique_Compare
+::operator()(dimension_type i, dimension_type j) const {
+  return container[base_index + i].is_equal_to(container[base_index + j]);
+}
+
+/*! \relates Linear_System */
+template <typename Row>
+inline void
+swap(Linear_System<Row>& x, Linear_System<Row>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_templates.hh line 1. */
+/* Linear_System class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_defs.hh line 1. */
+/* Bit_Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_defs.hh line 30. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates Bit_Matrix */
+void swap(Bit_Matrix& x, Bit_Matrix& y);
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix of bits.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Bit_Matrix {
+public:
+  //! Default constructor.
+  Bit_Matrix();
+
+  //! Construct a bit matrix with \p n_rows rows and \p n_columns columns.
+  Bit_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+  //! Copy constructor.
+  Bit_Matrix(const Bit_Matrix& y);
+
+  //! Destructor.
+  ~Bit_Matrix();
+
+  //! Assignment operator.
+  Bit_Matrix& operator=(const Bit_Matrix& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Bit_Matrix& y);
+
+  //! Subscript operator.
+  Bit_Row& operator[](dimension_type k);
+
+  //! Constant subscript operator.
+  const Bit_Row& operator[](dimension_type k) const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  //! Transposes the matrix.
+  void transpose();
+
+  //! Makes \p *this a transposed copy of \p y.
+  void transpose_assign(const Bit_Matrix& y);
+
+  //! Returns the maximum number of rows of a Bit_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the number of columns of \p *this.
+  dimension_type num_columns() const;
+
+  //! Returns the number of rows of \p *this.
+  dimension_type num_rows() const;
+
+  //! Sorts the rows and removes duplicates.
+  void sort_rows();
+
+  //! Looks for \p row in \p *this, which is assumed to be sorted.
+  /*!
+    \return
+    <CODE>true</CODE> if \p row belongs to \p *this, false otherwise.
+
+    \param row
+    The row that will be searched for in the matrix.
+
+    Given a sorted bit matrix (this ensures better efficiency),
+    tells whether it contains the given row.
+  */
+  bool sorted_contains(const Bit_Row& row) const;
+
+  //! Adds \p row to \p *this.
+  /*!
+    \param row
+    The row whose implementation will be recycled.
+
+    The only thing that can be done with \p row upon return is destruction.
+  */
+  void add_recycled_row(Bit_Row& row);
+
+  //! Removes the last \p n rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Removes the last \p n columns.
+  /*!
+    The last \p n columns of the matrix are all made of zeros.
+    If such an assumption is not met, the behavior is undefined.
+  */
+  void remove_trailing_columns(dimension_type n);
+
+  //! Resizes the matrix copying the old contents.
+  void resize(dimension_type new_n_rows, dimension_type new_n_columns);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+#ifndef NDEBUG
+  //! Checks whether \p *this is sorted. It does NOT check for duplicates.
+  bool check_sorted() const;
+#endif
+
+private:
+  //! Contains the rows of the matrix.
+  std::vector<Bit_Row> rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  //! Ordering predicate (used when implementing the sort algorithm).
+  /*! \ingroup PPL_CXX_interface */
+  struct Bit_Row_Less_Than {
+    bool operator()(const Bit_Row& x, const Bit_Row& y) const;
+  };
+
+  template <typename Row>
+  friend class Parma_Polyhedra_Library::Linear_System;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Bit_Matrix& x, const Bit_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equal.
+/*! \relates Bit_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Bit_Matrix& x, const Bit_Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_inlines.hh line 1. */
+/* Bit_Matrix class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Bit_Matrix_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bit_Matrix::Bit_Matrix()
+  : rows(),
+    row_size(0) {
+}
+
+inline dimension_type
+Bit_Matrix::max_num_rows() {
+  return std::vector<Bit_Row>().max_size();
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const dimension_type n_rows,
+                       const dimension_type n_columns)
+  : rows(n_rows),
+    row_size(n_columns) {
+}
+
+inline
+Bit_Matrix::Bit_Matrix(const Bit_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size) {
+}
+
+inline
+Bit_Matrix::~Bit_Matrix() {
+}
+
+inline void
+Bit_Matrix::remove_trailing_rows(const dimension_type n) {
+  // The number of rows to be erased cannot be greater
+  // than the actual number of the rows of the matrix.
+  PPL_ASSERT(n <= rows.size());
+  if (n != 0)
+    rows.resize(rows.size() - n);
+  PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::remove_trailing_columns(const dimension_type n) {
+  // The number of columns to be erased cannot be greater
+  // than the actual number of the columns of the matrix.
+  PPL_ASSERT(n <= row_size);
+  row_size -= n;
+  PPL_ASSERT(OK());
+}
+
+inline void
+Bit_Matrix::m_swap(Bit_Matrix& y) {
+  using std::swap;
+  swap(row_size, y.row_size);
+  swap(rows, y.rows);
+}
+
+inline Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+inline const Bit_Row&
+Bit_Matrix::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+inline dimension_type
+Bit_Matrix::num_columns() const {
+  return row_size;
+}
+
+inline dimension_type
+Bit_Matrix::num_rows() const {
+  return rows.size();
+}
+
+inline void
+Bit_Matrix::clear() {
+  // Clear `rows' and minimize its capacity.
+  std::vector<Bit_Row> tmp;
+  using std::swap;
+  swap(tmp, rows);
+  row_size = 0;
+}
+
+inline memory_size_type
+Bit_Matrix::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Bit_Matrix::Bit_Row_Less_Than::
+operator()(const Bit_Row& x, const Bit_Row& y) const {
+  return compare(x, y) < 0;
+}
+
+inline bool
+Bit_Matrix::sorted_contains(const Bit_Row& row) const {
+  PPL_ASSERT(check_sorted());
+  return std::binary_search(rows.begin(), rows.end(), row,
+                            Bit_Row_Less_Than());
+}
+
+/*! \relates Bit_Matrix */
+inline bool
+operator!=(const Bit_Matrix& x, const Bit_Matrix& y) {
+  return !(x == y);
+}
+
+/*! \relates Bit_Matrix */
+inline void
+swap(Bit_Matrix& x, Bit_Matrix& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Bit_Matrix_defs.hh line 186. */
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_defs.hh line 1. */
+/* Scalar_Products class definition.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_defs.hh line 34. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class implementing various scalar product functions.
+/*! \ingroup PPL_CXX_interface
+  When computing the scalar product of (Linear_Expression or Constraint or
+  Generator) objects <CODE>x</CODE> and <CODE>y</CODE>, it is assumed
+  that the space dimension of the first object <CODE>x</CODE> is less
+  than or equal to the space dimension of the second object <CODE>y</CODE>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Scalar_Products {
+public:
+  //! Computes the scalar product of \p x and \p y and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Linear_Expression& x, const Linear_Expression& y);
+
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z, const Constraint& c, const Generator& g);
+
+  //! Computes the scalar product of \p g and \p c and assigns it to \p z.
+  static void assign(Coefficient& z, const Generator& g, const Constraint& c);
+
+  //! Computes the scalar product of \p c and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Constraint& c, const Grid_Generator& gg);
+
+  //! Computes the scalar product of \p g and \p cg and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Grid_Generator& gg, const Congruence& cg);
+
+  //! Computes the scalar product of \p cg and \p g and assigns it to \p z.
+  static void assign(Coefficient& z,
+                     const Congruence& cg, const Grid_Generator& gg);
+
+  //! Returns the sign of the scalar product between \p x and \p y.
+  static int sign(const Linear_Expression& x, const Linear_Expression& y);
+
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Generator& g);
+
+  //! Returns the sign of the scalar product between \p g and \p c.
+  static int sign(const Generator& g, const Constraint& c);
+
+  //! Returns the sign of the scalar product between \p c and \p g.
+  static int sign(const Constraint& c, const Grid_Generator& g);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+                             const Linear_Expression& x,
+                             const Linear_Expression& y);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+                             const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Computes the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored,
+    and assigns the result to \p z.
+  */
+  static void reduced_assign(Coefficient& z,
+                             const Generator& g, const Constraint& c);
+
+  //! \brief
+  //! Computes the \e reduced scalar product of \p g and \p cg,
+  //! where the \f$\epsilon\f$ coefficient of \p g is ignored,
+  //! and assigns the result to \p z.
+  static void reduced_assign(Coefficient& z,
+                             const Grid_Generator& gg, const Congruence& cg);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p x and \p y,
+    where the \f$\epsilon\f$ coefficient of \p x is ignored.
+  */
+  static int reduced_sign(const Linear_Expression& x,
+                          const Linear_Expression& y);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p c and \p g,
+    where the \f$\epsilon\f$ coefficient of \p c is ignored.
+  */
+  static int reduced_sign(const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Returns the sign of the \e reduced scalar product of \p g and \p c,
+    where the \f$\epsilon\f$ coefficient of \p g is ignored.
+  */
+  static int reduced_sign(const Generator& g, const Constraint& c);
+
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+                                 const Linear_Expression& x,
+                                 const Linear_Expression& y);
+  /*! \brief
+    Computes the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored,
+    and assigns the result to \p z.
+  */
+  static void homogeneous_assign(Coefficient& z,
+                                 const Linear_Expression& e,
+                                 const Generator& g);
+
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p gg and \p c,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+                                 const Grid_Generator& gg,
+                                 const Constraint& c);
+
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p g and \p cg,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+                                 const Grid_Generator& gg,
+                                 const Congruence& cg);
+
+  //! \brief
+  //! Computes the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  //! and assigns the result to \p z.
+  static void homogeneous_assign(Coefficient& z,
+                                 const Linear_Expression& e,
+                                 const Grid_Generator& g);
+
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p x and \p y,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Expression& x,
+                              const Linear_Expression& y);
+
+  /*! \brief
+    Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+    where the inhomogeneous terms are ignored.
+  */
+  static int homogeneous_sign(const Linear_Expression& e, const Generator& g);
+
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p e and \p g,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Linear_Expression& e,
+                              const Grid_Generator& g);
+
+  //! \brief
+  //! Returns the sign of the \e homogeneous scalar product of \p g and \p c,
+  //! where the inhomogeneous terms are ignored,
+  static int homogeneous_sign(const Grid_Generator& g, const Constraint& c);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign {
+public:
+  //! Constructs the function object according to the topology of \p c.
+  Topology_Adjusted_Scalar_Product_Sign(const Constraint& c);
+
+  //! Constructs the function object according to the topology of \p g.
+  Topology_Adjusted_Scalar_Product_Sign(const Generator& g);
+
+  //! Computes the (topology adjusted) scalar product sign of \p c and \p g.
+  int operator()(const Constraint&, const Generator&) const;
+
+  //! Computes the (topology adjusted) scalar product sign of \p g and \p c.
+  int operator()(const Generator&, const Constraint&) const;
+
+private:
+  //! The type of the scalar product sign function pointer.
+  typedef int (* const SPS_type)(const Linear_Expression&,
+                                 const Linear_Expression&);
+
+  //! The scalar product sign function pointer.
+  SPS_type sps_fp;
+};
+
+// NOTE: Scalar_Products_inlines.hh is NOT included here, to avoid cyclic
+// include dependencies.
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_inlines.hh line 1. */
+/* Scalar_Products class implementation (inline functions).
+*/
+
+
+/* Automatically generated from PPL source file ../src/Scalar_Products_inlines.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+Scalar_Products::sign(const Linear_Expression& x, const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Expression& x,
+                              const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  reduced_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& x,
+                                  const Linear_Expression& y) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  homogeneous_assign(z, x, y);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+  return sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+  return sign(g.expr, c.expr);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Grid_Generator& g) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  assign(z, c, g);
+  return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+  // The reduced scalar product is only defined if the topology of `c' is
+  // NNC.
+  PPL_ASSERT(!c.is_necessarily_closed());
+  return reduced_sign(c.expr, g.expr);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+  // The reduced scalar product is only defined if the topology of `g' is
+  // NNC.
+  PPL_ASSERT(!c.is_necessarily_closed());
+  return reduced_sign(g.expr, c.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+                                    const Linear_Expression& e,
+                                    const Generator& g) {
+  homogeneous_assign(z, e, g.expr);
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+                                    const Linear_Expression& e,
+                                    const Grid_Generator& g) {
+  homogeneous_assign(z, e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+                                  const Generator& g) {
+  return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+                                  const Grid_Generator& g) {
+  return homogeneous_sign(e, g.expr);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Grid_Generator& g,
+                                  const Constraint& c) {
+  PPL_DIRTY_TEMP_COEFFICIENT(z);
+  homogeneous_assign(z, g, c);
+  return sgn(z);
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Constraint& c)
+  : sps_fp(c.is_necessarily_closed()
+           ? static_cast<SPS_type>(&Scalar_Products::sign)
+           : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline
+Topology_Adjusted_Scalar_Product_Sign
+::Topology_Adjusted_Scalar_Product_Sign(const Generator& g)
+  : sps_fp(g.is_necessarily_closed()
+           ? static_cast<SPS_type>(&Scalar_Products::sign)
+           : static_cast<SPS_type>(&Scalar_Products::reduced_sign)) {
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Constraint& c,
+                                                  const Generator& g) const {
+  PPL_ASSERT(c.space_dimension() <= g.space_dimension());
+  PPL_ASSERT(sps_fp == (c.is_necessarily_closed()
+                    ? static_cast<SPS_type>(&Scalar_Products::sign)
+                    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(c.expr, g.expr);
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+                                                  const Constraint& c) const {
+  PPL_ASSERT(g.space_dimension() <= c.space_dimension());
+  PPL_ASSERT(sps_fp == (g.is_necessarily_closed()
+                    ? static_cast<SPS_type>(&Scalar_Products::sign)
+                    : static_cast<SPS_type>(&Scalar_Products::reduced_sign)));
+  return sps_fp(g.expr, c.expr);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_templates.hh line 31. */
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <deque>
+
+/* Automatically generated from PPL source file ../src/swapping_sort_templates.hh line 1. */
+/* Sorting objects for which copies cost more than swaps.
+*/
+
+
+#include <vector>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename RA_Container, typename Compare>
+struct Indirect_Sort_Compare {
+  typedef typename RA_Container::size_type size_type;
+
+  Indirect_Sort_Compare(const RA_Container& cont,
+                        size_type base = 0,
+                        Compare comp = Compare())
+    : container(cont), base_index(base), compare(comp) {
+  }
+
+  bool operator()(size_type i, size_type j) const {
+    return compare(container[base_index + i], container[base_index + j]);
+  }
+
+  const RA_Container& container;
+  const size_type base_index;
+  const Compare compare;
+}; // struct Indirect_Sort_Compare
+
+template <typename RA_Container>
+struct Indirect_Unique_Compare {
+  typedef typename RA_Container::size_type size_type;
+
+  Indirect_Unique_Compare(const RA_Container& cont, size_type base = 0)
+    : container(cont), base_index(base) {
+  }
+
+  bool operator()(size_type i, size_type j) const {
+    return container[base_index + i] == container[base_index + j];
+  }
+
+  const RA_Container& container;
+  const size_type base_index;
+}; // struct Indirect_Unique_Compare
+
+template <typename RA_Container>
+struct Indirect_Swapper {
+  typedef typename RA_Container::size_type size_type;
+
+  Indirect_Swapper(RA_Container& cont, size_type base = 0)
+    : container(cont), base_index(base) {
+  }
+
+  void operator()(size_type i, size_type j) const {
+    using std::swap;
+    swap(container[base_index + i], container[base_index + j]);
+  }
+
+  RA_Container& container;
+  const size_type base_index;
+}; // struct Indirect_Swapper
+
+template <typename RA_Container1, typename RA_Container2>
+struct Indirect_Swapper2 {
+  typedef typename RA_Container1::size_type size_type;
+
+  Indirect_Swapper2(RA_Container1& cont1, RA_Container2& cont2)
+    : container1(cont1), container2(cont2) {
+  }
+
+  void operator()(size_type i, size_type j) const {
+    using std::swap;
+    swap(container1[i], container1[j]);
+    swap(container2[i], container2[j]);
+  }
+
+  RA_Container1& container1;
+  RA_Container2& container2;
+}; // struct Indirect_Swapper2
+
+template <typename Sort_Comparer, typename Unique_Comparer, typename Swapper>
+typename Sort_Comparer::size_type
+indirect_sort_and_unique(typename Sort_Comparer::size_type num_elems,
+                         Sort_Comparer sort_cmp,
+                         Unique_Comparer unique_cmp,
+                         Swapper indirect_swap) {
+  typedef typename Sort_Comparer::size_type index_type;
+  // `iv' is a vector of indices for the portion of rows to be sorted.
+  PPL_ASSERT(num_elems >= 2);
+  std::vector<index_type> iv;
+  iv.reserve(num_elems);
+  for (index_type i = 0, i_end = num_elems; i != i_end; ++i)
+    iv.push_back(i);
+
+  typedef typename std::vector<index_type>::iterator Iter;
+  const Iter iv_begin = iv.begin();
+  Iter iv_end = iv.end();
+
+  // Sort `iv' by comparing the rows indexed by its elements.
+  std::sort(iv_begin, iv_end, sort_cmp);
+
+  // Swap the indexed rows according to `iv':
+  // for each index `i', the element that should be placed in
+  // position dst = i is the one placed in position src = iv[i].
+  for (index_type i = num_elems; i-- > 0; ) {
+    if (i != iv[i]) {
+      index_type dst = i;
+      index_type src = iv[i];
+      do {
+        indirect_swap(src, dst);
+        iv[dst] = dst;
+        dst = src;
+        src = iv[dst];
+      } while (i != src);
+      iv[dst] = dst;
+    }
+  }
+
+  // Restore `iv' indices to 0 .. num_elems-1 for the call to unique.
+  for (index_type i = num_elems; i-- > 0; )
+    iv[i] = i;
+
+  // Unique `iv' by comparing the rows indexed by its elements.
+  iv_end = std::unique(iv_begin, iv_end, unique_cmp);
+
+  const index_type num_sorted = static_cast<index_type>(iv_end - iv_begin);
+  const index_type num_duplicates = num_elems - num_sorted;
+  if (num_duplicates == 0)
+    return 0;
+
+  // There were duplicates: swap the rows according to `iv'.
+  index_type dst = 0;
+  while (dst < num_sorted && dst == iv[dst])
+    ++dst;
+  if (dst == num_sorted)
+    return num_duplicates;
+  do {
+    const index_type src = iv[dst];
+    indirect_swap(src, dst);
+    ++dst;
+  }
+  while (dst < num_sorted);
+  return num_duplicates;
+}
+
+template <typename Iter>
+Iter
+swapping_unique(Iter first, Iter last) {
+  return swapping_unique(first, last, std::iter_swap<Iter, Iter>);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_templates.hh line 37. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::num_lines_or_equalities() const {
+  PPL_ASSERT(num_pending_rows() == 0);
+  const Linear_System& x = *this;
+  dimension_type n = 0;
+  for (dimension_type i = num_rows(); i-- > 0; )
+    if (x[i].is_line_or_equality())
+      ++n;
+  return n;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::merge_rows_assign(const Linear_System& y) {
+  PPL_ASSERT(space_dimension() >= y.space_dimension());
+  // Both systems have to be sorted and have no pending rows.
+  PPL_ASSERT(check_sorted() && y.check_sorted());
+  PPL_ASSERT(num_pending_rows() == 0 && y.num_pending_rows() == 0);
+
+  Linear_System& x = *this;
+
+  // A temporary vector...
+  Swapping_Vector<Row> tmp;
+  // ... with enough capacity not to require any reallocations.
+  tmp.reserve(compute_capacity(x.rows.size() + y.rows.size(),
+                               tmp.max_num_rows()));
+
+  dimension_type xi = 0;
+  const dimension_type x_num_rows = x.num_rows();
+  dimension_type yi = 0;
+  const dimension_type y_num_rows = y.num_rows();
+
+  while (xi < x_num_rows && yi < y_num_rows) {
+    const int comp = compare(x[xi], y[yi]);
+    if (comp <= 0) {
+      // Elements that can be taken from `x' are actually _stolen_ from `x'
+      tmp.resize(tmp.size() + 1);
+      swap(tmp.back(), x.rows[xi++]);
+      tmp.back().set_representation(representation());
+      if (comp == 0)
+        // A duplicate element.
+        ++yi;
+    }
+    else {
+      // (comp > 0)
+      tmp.resize(tmp.size() + 1);
+      Row copy(y[yi++], space_dimension(), representation());
+      swap(tmp.back(), copy);
+    }
+  }
+  // Insert what is left.
+  if (xi < x_num_rows)
+    while (xi < x_num_rows) {
+      tmp.resize(tmp.size() + 1);
+      swap(tmp.back(), x.rows[xi++]);
+      tmp.back().set_representation(representation());
+    }
+  else
+    while (yi < y_num_rows) {
+      tmp.resize(tmp.size() + 1);
+      Row copy(y[yi++], space_dimension(), representation());
+      swap(tmp.back(), copy);
+    }
+
+  // We get the result matrix and let the old one be destroyed.
+  swap(tmp, rows);
+  // There are no pending rows.
+  unset_pending_rows();
+  PPL_ASSERT(check_sorted());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::ascii_dump(std::ostream& s) const {
+  // Prints the topology, the number of rows, the number of columns
+  // and the sorted flag.  The specialized methods provided by
+  // Constraint_System and Generator_System take care of properly
+  // printing the contents of the system.
+  s << "topology " << (is_necessarily_closed()
+                       ? "NECESSARILY_CLOSED"
+                       : "NOT_NECESSARILY_CLOSED")
+    << "\n"
+    << num_rows() << " x " << space_dimension() << " ";
+  Parma_Polyhedra_Library::ascii_dump(s, representation());
+  s << " " << (sorted ? "(sorted)" : "(not_sorted)")
+    << "\n"
+    << "index_first_pending " << first_pending_row()
+    << "\n";
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Linear_System<Row>)
+
+template <typename Row>
+bool
+Linear_System<Row>::ascii_load(std::istream& s) {
+  std::string str;
+  if (!(s >> str) || str != "topology")
+    return false;
+  if (!(s >> str))
+    return false;
+
+  clear();
+
+  Topology t;
+  if (str == "NECESSARILY_CLOSED")
+    t = NECESSARILY_CLOSED;
+  else {
+    if (str != "NOT_NECESSARILY_CLOSED")
+      return false;
+    t = NOT_NECESSARILY_CLOSED;
+  }
+
+  set_topology(t);
+
+  dimension_type nrows;
+  dimension_type space_dims;
+  if (!(s >> nrows))
+    return false;
+  if (!(s >> str) || str != "x")
+    return false;
+  if (!(s >> space_dims))
+    return false;
+
+  space_dimension_ = space_dims;
+
+  if (!Parma_Polyhedra_Library::ascii_load(s, representation_))
+    return false;
+
+  if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+    return false;
+  const bool sortedness = (str == "(sorted)");
+  dimension_type index;
+  if (!(s >> str) || str != "index_first_pending")
+    return false;
+  if (!(s >> index))
+    return false;
+
+  Row row;
+  for (dimension_type i = 0; i < nrows; ++i) {
+    if (!row.ascii_load(s))
+      return false;
+    insert(row, Recycle_Input());
+  }
+  index_first_pending = index;
+  sorted = sortedness;
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Row& r) {
+  Row tmp(r, representation());
+  insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Row& r, Recycle_Input) {
+  insert_no_ok(r, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_no_ok(Row& r, Recycle_Input) {
+  PPL_ASSERT(topology() == r.topology());
+  // This method is only used when the system has no pending rows.
+  PPL_ASSERT(num_pending_rows() == 0);
+
+  const bool was_sorted = is_sorted();
+
+  insert_pending_no_ok(r, Recycle_Input());
+
+  if (was_sorted) {
+    const dimension_type nrows = num_rows();
+    // The added row may have caused the system to be not sorted anymore.
+    if (nrows > 1) {
+      // If the system is not empty and the inserted row is the
+      // greatest one, the system is set to be sorted.
+      // If it is not the greatest one then the system is no longer sorted.
+      sorted = (compare(rows[nrows-2], rows[nrows-1]) <= 0);
+    }
+    else
+      // A system having only one row is sorted.
+      sorted = true;
+  }
+
+  unset_pending_rows();
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending_no_ok(Row& r, Recycle_Input) {
+  // TODO: A Grid_Generator_System may contain non-normalized lines that
+  // represent parameters, so this check is disabled. Consider re-enabling it
+  // when it's possibile.
+#if 0
+  // The added row must be strongly normalized and have the same
+  // number of elements as the existing rows of the system.
+  PPL_ASSERT(r.check_strong_normalized());
+#endif
+
+  PPL_ASSERT(r.topology() == topology());
+
+  r.set_representation(representation());
+
+  if (space_dimension() < r.space_dimension())
+    set_space_dimension_no_ok(r.space_dimension());
+  else
+    r.set_space_dimension_no_ok(space_dimension());
+
+  rows.resize(rows.size() + 1);
+  swap(rows.back(), r);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Row& r) {
+  Row tmp(r, representation());
+  insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Row& r, Recycle_Input) {
+  insert_pending_no_ok(r, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(const Linear_System& y) {
+  Linear_System tmp(y, representation(), With_Pending());
+  insert_pending(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert_pending(Linear_System& y, Recycle_Input) {
+  Linear_System& x = *this;
+  PPL_ASSERT(x.space_dimension() == y.space_dimension());
+
+  // Steal the rows of `y'.
+  // This loop must use an increasing index (instead of a decreasing one) to
+  // preserve the row ordering.
+  for (dimension_type i = 0; i < y.num_rows(); ++i)
+    x.insert_pending(y.rows[i], Recycle_Input());
+
+  y.clear();
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(const Linear_System& y) {
+  Linear_System tmp(y, representation(), With_Pending());
+  insert(tmp, Recycle_Input());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::insert(Linear_System& y, Recycle_Input) {
+  PPL_ASSERT(num_pending_rows() == 0);
+
+  // Adding no rows is a no-op.
+  if (y.has_no_rows())
+    return;
+
+  // Check if sortedness is preserved.
+  if (is_sorted()) {
+    if (!y.is_sorted() || y.num_pending_rows() > 0)
+      sorted = false;
+    else {
+      // `y' is sorted and has no pending rows.
+      const dimension_type n_rows = num_rows();
+      if (n_rows > 0)
+        sorted = (compare(rows[n_rows-1], y[0]) <= 0);
+    }
+  }
+
+  // Add the rows of `y' as if they were pending.
+  insert_pending(y, Recycle_Input());
+
+  // TODO: May y have pending rows? Should they remain pending?
+
+  // There are no pending_rows.
+  unset_pending_rows();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::remove_space_dimensions(const Variables_Set& vars) {
+  // Dimension-compatibility assertion.
+  PPL_ASSERT(space_dimension() >= vars.space_dimension());
+
+  // The removal of no dimensions from any system is a no-op.  This
+  // case also captures the only legal removal of dimensions from a
+  // 0-dim system.
+  if (vars.empty())
+    return;
+
+  // NOTE: num_rows() is *not* constant, because it may be decreased by
+  // remove_row_no_ok().
+  for (dimension_type i = 0; i < num_rows(); ) {
+    const bool valid = rows[i].remove_space_dimensions(vars);
+    if (!valid) {
+      // Remove the current row.
+      // We can't call remove_row(i) here, because the system is not OK as
+      // some rows already have the new space dimension and others still have
+      // the old one.
+      remove_row_no_ok(i, false);
+    }
+    else
+      ++i;
+  }
+
+  space_dimension_ -= vars.size();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::shift_space_dimensions(Variable v, dimension_type n) {
+  // NOTE: v.id() may be equal to the space dimension of the system
+  // (when no space dimension need to be shifted).
+  PPL_ASSERT(v.id() <= space_dimension());
+  for (dimension_type i = rows.size(); i-- > 0; )
+    rows[i].shift_space_dimensions(v, n);
+  space_dimension_ += n;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows() {
+  // We sort the non-pending rows only.
+  sort_rows(0, first_pending_row());
+  sorted = true;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_rows(const dimension_type first_row,
+                              const dimension_type last_row) {
+  PPL_ASSERT(first_row <= last_row && last_row <= num_rows());
+  // We cannot mix pending and non-pending rows.
+  PPL_ASSERT(first_row >= first_pending_row()
+             || last_row <= first_pending_row());
+
+  const bool sorting_pending = (first_row >= first_pending_row());
+  const dimension_type old_num_pending = num_pending_rows();
+
+  const dimension_type num_elems = last_row - first_row;
+  if (num_elems < 2)
+    return;
+
+  // Build the function objects implementing indirect sort comparison,
+  // indirect unique comparison and indirect swap operation.
+  using namespace Implementation;
+  typedef Swapping_Vector<Row> Cont;
+  typedef Indirect_Sort_Compare<Cont, Row_Less_Than> Sort_Compare;
+  typedef Indirect_Swapper<Cont> Swapper;
+  const dimension_type num_duplicates
+    = indirect_sort_and_unique(num_elems,
+                               Sort_Compare(rows, first_row),
+                               Unique_Compare(rows, first_row),
+                               Swapper(rows, first_row));
+
+  if (num_duplicates > 0) {
+    typedef typename Cont::iterator Iter;
+    typedef typename std::iterator_traits<Iter>::difference_type diff_t;
+    Iter last = rows.begin() + static_cast<diff_t>(last_row);
+    Iter first = last - + static_cast<diff_t>(num_duplicates);
+    rows.erase(first, last);
+  }
+
+  if (sorting_pending) {
+    PPL_ASSERT(old_num_pending >= num_duplicates);
+    index_first_pending = num_rows() - (old_num_pending - num_duplicates);
+  }
+  else {
+    index_first_pending = num_rows() - old_num_pending;
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::strong_normalize() {
+  const dimension_type nrows = rows.size();
+  // We strongly normalize also the pending rows.
+  for (dimension_type i = nrows; i-- > 0; )
+    rows[i].strong_normalize();
+  sorted = (nrows <= 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sign_normalize() {
+  const dimension_type nrows = rows.size();
+  // We sign-normalize also the pending rows.
+  for (dimension_type i = nrows; i-- > 0; )
+    rows[i].sign_normalize();
+  sorted = (nrows <= 1);
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+template <typename Row>
+bool
+operator==(const Linear_System<Row>& x, const Linear_System<Row>& y) {
+  if (x.space_dimension() != y.space_dimension())
+    return false;
+  const dimension_type x_num_rows = x.num_rows();
+  const dimension_type y_num_rows = y.num_rows();
+  if (x_num_rows != y_num_rows)
+    return false;
+  if (x.first_pending_row() != y.first_pending_row())
+    return false;
+  // TODO: Check if the following comment is up to date.
+  // Notice that calling operator==(const Swapping_Vector<Row>&,
+  //                                const Swapping_Vector<Row>&)
+  // would be wrong here, as equality of the type fields would
+  // not be checked.
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_and_remove_with_sat(Bit_Matrix& sat) {
+  // We can only sort the non-pending part of the system.
+  PPL_ASSERT(first_pending_row() == sat.num_rows());
+  if (first_pending_row() <= 1) {
+    set_sorted(true);
+    return;
+  }
+
+  const dimension_type num_elems = sat.num_rows();
+  // Build the function objects implementing indirect sort comparison,
+  // indirect unique comparison and indirect swap operation.
+  typedef Swapping_Vector<Row> Cont;
+  const Implementation::Indirect_Sort_Compare<Cont, Row_Less_Than>
+    sort_cmp(rows);
+  const Unique_Compare unique_cmp(rows);
+  const Implementation::Indirect_Swapper2<Cont, Bit_Matrix> swapper(rows, sat);
+
+  const dimension_type num_duplicates
+    = Implementation::indirect_sort_and_unique(num_elems, sort_cmp,
+                                               unique_cmp, swapper);
+
+  const dimension_type new_first_pending_row
+    = first_pending_row() - num_duplicates;
+
+  if (num_pending_rows() > 0) {
+    // In this case, we must put the duplicates after the pending rows.
+    const dimension_type n_rows = num_rows() - 1;
+    for (dimension_type i = 0; i < num_duplicates; ++i)
+      swap(rows[new_first_pending_row + i], rows[n_rows - i]);
+  }
+
+  // Erasing the duplicated rows...
+  rows.resize(rows.size() - num_duplicates);
+  index_first_pending = new_first_pending_row;
+  // ... and the corresponding rows of the saturation matrix.
+  sat.remove_trailing_rows(num_duplicates);
+
+  // Now the system is sorted.
+  sorted = true;
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+dimension_type
+Linear_System<Row>::gauss(const dimension_type n_lines_or_equalities) {
+  // This method is only applied to a linear system having no pending rows and
+  // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+  // before the rays or points or inequalities.
+  PPL_ASSERT(num_pending_rows() == 0);
+  PPL_ASSERT(n_lines_or_equalities == num_lines_or_equalities());
+#ifndef NDEBUG
+  for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+    PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+  dimension_type rank = 0;
+  // Will keep track of the variations on the system of equalities.
+  bool changed = false;
+  // TODO: Don't use the number of columns.
+  const dimension_type num_cols
+    = is_necessarily_closed() ? space_dimension() + 1 : space_dimension() + 2;
+  // TODO: Consider exploiting the row (possible) sparseness of rows in the
+  // following loop, if needed. It would probably make it more cache-efficient
+  // for dense rows, too.
+  for (dimension_type j = num_cols; j-- > 0; )
+    for (dimension_type i = rank; i < n_lines_or_equalities; ++i) {
+      // Search for the first row having a non-zero coefficient
+      // (the pivot) in the j-th column.
+      if ((*this)[i].expr.get(j) == 0)
+        continue;
+      // Pivot found: if needed, swap rows so that this one becomes
+      // the rank-th row in the linear system.
+      if (i > rank) {
+        swap(rows[i], rows[rank]);
+        // After swapping the system is no longer sorted.
+        changed = true;
+      }
+      // Combine the row containing the pivot with all the lines or
+      // equalities following it, so that all the elements on the j-th
+      // column in these rows become 0.
+      for (dimension_type k = i + 1; k < n_lines_or_equalities; ++k) {
+        if (rows[k].expr.get(Variable(j - 1)) != 0) {
+          rows[k].linear_combine(rows[rank], j);
+          changed = true;
+        }
+      }
+      // Already dealt with the rank-th row.
+      ++rank;
+      // Consider another column index `j'.
+      break;
+    }
+  if (changed)
+    sorted = false;
+
+  PPL_ASSERT(OK());
+  return rank;
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::back_substitute(const dimension_type n_lines_or_equalities) {
+  // This method is only applied to a system having no pending rows and
+  // exactly `n_lines_or_equalities' lines or equalities, all of which occur
+  // before the first ray or point or inequality.
+  PPL_ASSERT(num_pending_rows() == 0);
+  PPL_ASSERT(n_lines_or_equalities <= num_lines_or_equalities());
+#ifndef NDEBUG
+  for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+    PPL_ASSERT((*this)[i].is_line_or_equality());
+#endif
+
+  const dimension_type nrows = num_rows();
+  // Trying to keep sortedness.
+  bool still_sorted = is_sorted();
+  // This deque of Booleans will be used to flag those rows that,
+  // before exiting, need to be re-checked for sortedness.
+  std::deque<bool> check_for_sortedness;
+  if (still_sorted)
+    check_for_sortedness.insert(check_for_sortedness.end(), nrows, false);
+
+  for (dimension_type k = n_lines_or_equalities; k-- > 0; ) {
+    // For each line or equality, starting from the last one,
+    // looks for the last non-zero element.
+    // `j' will be the index of such a element.
+    Row& row_k = rows[k];
+    const dimension_type j = row_k.expr.last_nonzero();
+    // TODO: Check this.
+    PPL_ASSERT(j != 0);
+
+    // Go through the equalities above `row_k'.
+    for (dimension_type i = k; i-- > 0; ) {
+      Row& row_i = rows[i];
+      if (row_i.expr.get(Variable(j - 1)) != 0) {
+        // Combine linearly `row_i' with `row_k'
+        // so that `row_i[j]' becomes zero.
+        row_i.linear_combine(row_k, j);
+        if (still_sorted) {
+          // Trying to keep sortedness: remember which rows
+          // have to be re-checked for sortedness at the end.
+          if (i > 0)
+            check_for_sortedness[i-1] = true;
+          check_for_sortedness[i] = true;
+        }
+      }
+    }
+
+    // Due to strong normalization during previous iterations,
+    // the pivot coefficient `row_k[j]' may now be negative.
+    // Since an inequality (or ray or point) cannot be multiplied
+    // by a negative factor, the coefficient of the pivot must be
+    // forced to be positive.
+    const bool have_to_negate = (row_k.expr.get(Variable(j - 1)) < 0);
+    if (have_to_negate)
+      neg_assign(row_k.expr);
+
+    // NOTE: Here row_k will *not* be ok if we have negated it.
+
+    // Note: we do not mark index `k' in `check_for_sortedness',
+    // because we will later negate back the row.
+
+    // Go through all the other rows of the system.
+    for (dimension_type i = n_lines_or_equalities; i < nrows; ++i) {
+      Row& row_i = rows[i];
+      if (row_i.expr.get(Variable(j - 1)) != 0) {
+        // Combine linearly the `row_i' with `row_k'
+        // so that `row_i[j]' becomes zero.
+        row_i.linear_combine(row_k, j);
+        if (still_sorted) {
+          // Trying to keep sortedness: remember which rows
+          // have to be re-checked for sortedness at the end.
+          if (i > n_lines_or_equalities)
+            check_for_sortedness[i-1] = true;
+          check_for_sortedness[i] = true;
+        }
+      }
+    }
+    if (have_to_negate)
+      // Negate `row_k' to restore strong-normalization.
+      neg_assign(row_k.expr);
+
+    PPL_ASSERT(row_k.OK());
+  }
+
+  // Trying to keep sortedness.
+  for (dimension_type i = 0; still_sorted && i+1 < nrows; ++i)
+    if (check_for_sortedness[i])
+      // Have to check sortedness of `(*this)[i]' with respect to `(*this)[i+1]'.
+      still_sorted = (compare((*this)[i], (*this)[i+1]) <= 0);
+
+  // Set the sortedness flag.
+  sorted = still_sorted;
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>::simplify() {
+  // This method is only applied to a system having no pending rows.
+  PPL_ASSERT(num_pending_rows() == 0);
+
+  // Partially sort the linear system so that all lines/equalities come first.
+  const dimension_type old_nrows = num_rows();
+  dimension_type nrows = old_nrows;
+  dimension_type n_lines_or_equalities = 0;
+  for (dimension_type i = 0; i < nrows; ++i)
+    if ((*this)[i].is_line_or_equality()) {
+      if (n_lines_or_equalities < i) {
+        swap(rows[i], rows[n_lines_or_equalities]);
+        // The system was not sorted.
+        PPL_ASSERT(!sorted);
+      }
+      ++n_lines_or_equalities;
+    }
+  // Apply Gaussian elimination to the subsystem of lines/equalities.
+  const dimension_type rank = gauss(n_lines_or_equalities);
+  // Eliminate any redundant line/equality that has been detected.
+  if (rank < n_lines_or_equalities) {
+    const dimension_type
+      n_rays_or_points_or_inequalities = nrows - n_lines_or_equalities;
+    const dimension_type
+      num_swaps = std::min(n_lines_or_equalities - rank,
+                           n_rays_or_points_or_inequalities);
+    for (dimension_type i = num_swaps; i-- > 0; )
+      swap(rows[--nrows], rows[rank + i]);
+    remove_trailing_rows(old_nrows - nrows);
+    if (n_rays_or_points_or_inequalities > num_swaps)
+      set_sorted(false);
+    unset_pending_rows();
+    n_lines_or_equalities = rank;
+  }
+  // Apply back-substitution to the system of rays/points/inequalities.
+  back_substitute(n_lines_or_equalities);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Linear_System<Row>
+::add_universe_rows_and_space_dimensions(const dimension_type n) {
+  PPL_ASSERT(n > 0);
+  const bool was_sorted = is_sorted();
+  const dimension_type old_n_rows = num_rows();
+  const dimension_type old_space_dim
+    = is_necessarily_closed() ? space_dimension() : space_dimension() + 1;
+  set_space_dimension(space_dimension() + n);
+  rows.resize(rows.size() + n);
+  // The old system is moved to the bottom.
+  for (dimension_type i = old_n_rows; i-- > 0; )
+    swap(rows[i], rows[i + n]);
+  for (dimension_type i = n, c = old_space_dim; i-- > 0; ) {
+    // The top right-hand sub-system (i.e., the system made of new
+    // rows and columns) is set to the specular image of the identity
+    // matrix.
+    if (Variable(c).space_dimension() <= space_dimension()) {
+      // Variable(c) is a user variable.
+      Linear_Expression le(representation());
+      le.set_space_dimension(space_dimension());
+      le += Variable(c);
+      Row r(le, Row::LINE_OR_EQUALITY, row_topology);
+      swap(r, rows[i]);
+    }
+    else {
+      // Variable(c) is the epsilon dimension.
+      PPL_ASSERT(row_topology == NOT_NECESSARILY_CLOSED);
+      Linear_Expression le(Variable(c), representation());
+      Row r(le, Row::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+      r.mark_as_not_necessarily_closed();
+      swap(r, rows[i]);
+      // Note: `r' is strongly normalized.
+    }
+    ++c;
+  }
+  // If the old system was empty, the last row added is either
+  // a positivity constraint or a point.
+  if (was_sorted)
+    sorted = (compare(rows[n-1], rows[n]) <= 0);
+
+  // If the system is not necessarily closed, move the epsilon coefficients to
+  // the last column.
+  if (!is_necessarily_closed()) {
+    // Try to preserve sortedness of `gen_sys'.
+    PPL_ASSERT(old_space_dim != 0);
+    if (!is_sorted()) {
+      for (dimension_type i = n; i-- > 0; ) {
+        rows[i].expr.swap_space_dimensions(Variable(old_space_dim - 1),
+                                           Variable(old_space_dim - 1 + n));
+        PPL_ASSERT(rows[i].OK());
+      }
+    }
+    else {
+      dimension_type old_eps_index = old_space_dim - 1;
+      // The upper-right corner of `rows' contains the J matrix:
+      // swap coefficients to preserve sortedness.
+      for (dimension_type i = n; i-- > 0; ++old_eps_index) {
+        rows[i].expr.swap_space_dimensions(Variable(old_eps_index),
+                                           Variable(old_eps_index + 1));
+        PPL_ASSERT(rows[i].OK());
+      }
+
+      sorted = true;
+    }
+  }
+  // NOTE: this already checks for OK().
+  set_index_first_pending_row(index_first_pending + n);
+}
+
+template <typename Row>
+void
+Linear_System<Row>::sort_pending_and_remove_duplicates() {
+  PPL_ASSERT(num_pending_rows() > 0);
+  PPL_ASSERT(is_sorted());
+
+  // The non-pending part of the system is already sorted.
+  // Now sorting the pending part..
+  const dimension_type first_pending = first_pending_row();
+  sort_rows(first_pending, num_rows());
+  // Recompute the number of rows, because we may have removed
+  // some rows occurring more than once in the pending part.
+  const dimension_type old_num_rows = num_rows();
+  dimension_type num_rows = old_num_rows;
+
+  dimension_type k1 = 0;
+  dimension_type k2 = first_pending;
+  dimension_type num_duplicates = 0;
+  // In order to erase them, put at the end of the system
+  // those pending rows that also occur in the non-pending part.
+  while (k1 < first_pending && k2 < num_rows) {
+    const int cmp = compare(rows[k1], rows[k2]);
+    if (cmp == 0) {
+      // We found the same row.
+      ++num_duplicates;
+      --num_rows;
+      // By initial sortedness, we can increment index `k1'.
+      ++k1;
+      // Do not increment `k2'; instead, swap there the next pending row.
+      if (k2 < num_rows)
+        swap(rows[k2], rows[k2 + num_duplicates]);
+    }
+    else if (cmp < 0)
+      // By initial sortedness, we can increment `k1'.
+      ++k1;
+    else {
+      // Here `cmp > 0'.
+      // Increment `k2' and, if we already found any duplicate,
+      // swap the next pending row in position `k2'.
+      ++k2;
+      if (num_duplicates > 0 && k2 < num_rows)
+        swap(rows[k2], rows[k2 + num_duplicates]);
+    }
+  }
+  // If needed, swap any duplicates found past the pending rows
+  // that has not been considered yet; then erase the duplicates.
+  if (num_duplicates > 0) {
+    if (k2 < num_rows)
+      for (++k2; k2 < num_rows; ++k2)
+        swap(rows[k2], rows[k2 + num_duplicates]);
+    rows.resize(num_rows);
+  }
+  sorted = true;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::check_sorted() const {
+  for (dimension_type i = first_pending_row(); i-- > 1; )
+    if (compare(rows[i], rows[i-1]) < 0)
+      return false;
+  return true;
+}
+
+template <typename Row>
+bool
+Linear_System<Row>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  for (dimension_type i = rows.size(); i-- > 0; ) {
+    if (rows[i].representation() != representation()) {
+#ifndef NDEBUG
+      cerr << "Linear_System has a row with the wrong representation!"
+           << endl;
+#endif
+      return false;
+    }
+    if (rows[i].space_dimension() != space_dimension()) {
+#ifndef NDEBUG
+      cerr << "Linear_System has a row with the wrong number of space dimensions!"
+           << endl;
+#endif
+      return false;
+    }
+  }
+
+  for (dimension_type i = rows.size(); i-- > 0; )
+    if (rows[i].topology() != topology()) {
+#ifndef NDEBUG
+      cerr << "Linear_System has a row with the wrong topology!"
+           << endl;
+#endif
+      return false;
+    }
+
+  // `index_first_pending' must be less than or equal to `num_rows()'.
+  if (first_pending_row() > num_rows()) {
+#ifndef NDEBUG
+    cerr << "Linear_System has a negative number of pending rows!"
+         << endl;
+#endif
+    return false;
+  }
+
+  // Check for topology mismatches.
+  const dimension_type n_rows = num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i)
+    if (topology() != rows[i].topology()) {
+#ifndef NDEBUG
+      cerr << "Topology mismatch between the system "
+           << "and one of its rows!"
+           << endl;
+#endif
+      return false;
+    }
+
+  if (sorted && !check_sorted()) {
+#ifndef NDEBUG
+    cerr << "The system declares itself to be sorted but it is not!"
+         << endl;
+#endif
+    return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Linear_System_defs.hh line 581. */
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 31. */
+
+/* Automatically generated from PPL source file ../src/Constraint_System_defs.hh line 38. */
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Constraint_System
+  Writes <CODE>true</CODE> if \p cs is empty.  Otherwise, writes on
+  \p s the constraints of \p cs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Constraint_System& cs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Constraint_System& x, const Constraint_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Constraint_System& x, const Constraint_System& y);
+
+/*! \relates Constraint_System */
+void
+swap(Constraint_System& x, Constraint_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of constraints.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Constraint_System is a system of constraints,
+    i.e., a multiset of objects of the class Constraint.
+    When inserting constraints in a system, space dimensions are
+    automatically adjusted so that all the constraints in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of constraints corresponding to
+    a square in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+    \endcode
+    Note that:
+    the constraint system is created with space dimension zero;
+    the first and third constraint insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding four strict inequalities to the constraint system
+    of the previous example, we can remove just the four
+    vertices from the square defined above.
+    \code
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 6);
+  cs.insert(x - y < 3);
+  cs.insert(y - x < 3);
+    \endcode
+
+    \par Example 3
+    The following code builds a system of constraints corresponding to
+    a half-strip in \f$\Rset^2\f$:
+    \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+    \endcode
+
+    \note
+    After inserting a multiset of constraints in a constraint system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> constraint system
+    will be available, where original constraints may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other constraints), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Constraint_System {
+public:
+  typedef Constraint row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of constraints.
+  explicit Constraint_System(Representation r = default_representation);
+
+  //! Builds the singleton system containing only constraint \p c.
+  explicit Constraint_System(const Constraint& c,
+                             Representation r = default_representation);
+
+  //! Builds a system containing copies of any equalities in \p cgs.
+  explicit Constraint_System(const Congruence_System& cgs,
+                             Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note The copy will have the same representation as `cs', to make it
+          indistinguishable from `cs'.
+  */
+  Constraint_System(const Constraint_System& cs);
+
+  //! Copy constructor with specified representation.
+  Constraint_System(const Constraint_System& cs, Representation r);
+
+  //! Destructor.
+  ~Constraint_System();
+
+  //! Assignment operator.
+  Constraint_System& operator=(const Constraint_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Constraint_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more equality constraints.
+  */
+  bool has_equalities() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more strict inequality constraints.
+  */
+  bool has_strict_inequalities() const;
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Constraint& c);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System& zero_dim_empty();
+
+  typedef Constraint_System_const_iterator const_iterator;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no constraints.
+  bool empty() const;
+
+  /*! \brief
+    Removes all the constraints from the constraint system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Returns the const_iterator pointing to the first constraint,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Constraint_System& y);
+
+private:
+  Linear_System<Constraint> sys;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Constraint::zero_dim_false().
+  */
+  static const Constraint_System* zero_dim_empty_p;
+
+  friend class Constraint_System_const_iterator;
+
+  friend bool operator==(const Constraint_System& x,
+                         const Constraint_System& y);
+
+  //! Builds an empty system of constraints having the specified topology.
+  explicit Constraint_System(Topology topol,
+                             Representation r = default_representation);
+
+  /*! \brief
+    Builds a system of constraints on a \p space_dim dimensional space. If
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+    dimension is added.
+  */
+  Constraint_System(Topology topol, dimension_type space_dim,
+                    Representation r = default_representation);
+
+  //! Returns the number of equality constraints.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of inequality constraints.
+  dimension_type num_inequalities() const;
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as
+    to provide a partial simplification of the system of constraints.
+
+    It is assumed that the system has no pending constraints.
+  */
+  void simplify();
+
+  /*! \brief
+    Adjusts \p *this so that it matches \p new_topology and
+    \p new_space_dim (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains strict inequalities.
+  */
+  bool adjust_topology_and_space_dimension(Topology new_topology,
+                                           dimension_type new_space_dim);
+
+  //! Returns a constant reference to the \p k- th constraint of the system.
+  const Constraint& operator[](dimension_type k) const;
+
+  //! Returns <CODE>true</CODE> if \p g satisfies all the constraints.
+  bool satisfies_all_constraints(const Generator& g) const;
+
+  //! Substitutes a given column of coefficients by a given affine expression.
+  /*!
+    \param v
+    The variable to which the affine transformation is substituted.
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations
+    (see Section \ref Images_and_Preimages_of_Affine_Transfer_Relations)
+    having any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p
+    denominator that will be used as denominator of the affine
+    transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation substitutes the matrix of constraints
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(Variable v,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator);
+
+  /*! \brief
+    Inserts in \p *this a copy of the constraint \p c,
+    increasing the number of space dimensions if needed.
+    It is a pending constraint.
+  */
+  void insert_pending(const Constraint& c);
+
+  //! Adds low-level constraints to the constraint system.
+  void add_low_level_constraints();
+
+  //! Returns the system topology.
+  Topology topology() const;
+
+  dimension_type num_rows() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+  */
+  void remove_row(dimension_type i, bool keep_sorted = false);
+
+  //! Removes the specified rows. The row ordering of remaining rows is
+  //! preserved.
+  /*!
+    \param indexes specifies a list of row indexes.
+                   It must be sorted.
+  */
+  void remove_rows(const std::vector<dimension_type>& indexes);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(num_rows()).
+
+    Otherwise, this method just swaps the rows with the last ones and then
+    removes them, so it costs O(last - first).
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                   bool keep_sorted = false);
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Removes all the specified dimensions from the constraint system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  bool has_no_rows() const;
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Adds the given row to the pending part of the system, stealing its
+    contents and automatically resizing the system or the row, if needed.
+  */
+  void insert_pending(Constraint& r, Recycle_Input);
+
+  //! Adds the rows of `y' to the pending part of `*this', stealing them from
+  //! `y'.
+  void insert_pending(Constraint_System& r, Recycle_Input);
+
+  /*! \brief
+    Adds \p r to the system, stealing its contents and
+    automatically resizing the system or the row, if needed.
+  */
+  void insert(Constraint& r, Recycle_Input);
+
+  //! Adds to \p *this a the rows of `y', stealing them from `y'.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(Constraint_System& r, Recycle_Input);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void insert_pending(const Constraint_System& r);
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Constraint_System& y);
+
+  //! Adds to \p *this a copy of  the rows of \p y.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(const Constraint_System& y);
+
+  //! Marks the epsilon dimension as a standard dimension.
+  /*!
+    The system topology is changed to <CODE>NOT_NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is increased by 1.
+  */
+  void mark_as_necessarily_closed();
+
+  //! Marks the last dimension as the epsilon dimension.
+  /*!
+    The system topology is changed to <CODE>NECESSARILY_CLOSED</CODE>, and
+    the number of space dimensions is decreased by 1.
+  */
+  void mark_as_not_necessarily_closed();
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Constraint_System& y);
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Adds \p n rows and space dimensions to the system.
+  /*!
+    \param n
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_universe_rows_and_space_dimensions(dimension_type n);
+
+  friend class Polyhedron;
+  friend class Termination_Helpers;
+};
+
+//! An iterator over a system of constraints.
+/*! \ingroup PPL_CXX_interface
+  A const_iterator is used to provide read-only access
+  to each constraint contained in a Constraint_System object.
+
+  \par Example
+  The following code prints the system of constraints
+  defining the polyhedron <CODE>ph</CODE>:
+  \code
+const Constraint_System& cs = ph.constraints();
+for (Constraint_System::const_iterator i = cs.begin(),
+        cs_end = cs.end(); i != cs_end; ++i)
+  cout << *i << endl;
+  \endcode
+*/
+// NOTE: This is not an inner class of Constraint_System, so Constraint can
+// declare that this class is his friend without including this file
+// (the .types.hh file suffices).
+class Parma_Polyhedra_Library::Constraint_System_const_iterator
+  : public std::iterator<std::forward_iterator_tag,
+                         Constraint,
+                         ptrdiff_t,
+                         const Constraint*,
+                         const Constraint&> {
+public:
+  //! Default constructor.
+  Constraint_System_const_iterator();
+
+  //! Ordinary copy constructor.
+  Constraint_System_const_iterator(const Constraint_System_const_iterator& y);
+
+  //! Destructor.
+  ~Constraint_System_const_iterator();
+
+  //! Assignment operator.
+  Constraint_System_const_iterator&
+  operator=(const Constraint_System_const_iterator& y);
+
+  //! Dereference operator.
+  const Constraint& operator*() const;
+
+  //! Indirect member selector.
+  const Constraint* operator->() const;
+
+  //! Prefix increment operator.
+  Constraint_System_const_iterator& operator++();
+
+  //! Postfix increment operator.
+  Constraint_System_const_iterator operator++(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const Constraint_System_const_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const Constraint_System_const_iterator& y) const;
+
+private:
+  friend class Constraint_System;
+
+  //! The const iterator over the matrix of constraints.
+  Linear_System<Constraint>::const_iterator i;
+
+  //! A const pointer to the matrix of constraints.
+  const Linear_System<Constraint>* csp;
+
+  //! Constructor.
+  Constraint_System_const_iterator(const Linear_System<Constraint>
+                                   ::const_iterator& iter,
+                                   const Constraint_System& cs);
+
+  //! \p *this skips to the next non-trivial constraint.
+  void skip_forward();
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper returning number of constraints in system.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+dimension_type
+num_constraints(const Constraint_System& cs);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+// Constraint_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Constraint_System_inlines.hh line 1. */
+/* Constraint_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constraint_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System(Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c, Representation r)
+  : sys(c.topology(), r) {
+  sys.insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+  : sys(cs.sys) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs,
+                                     Representation r)
+  : sys(cs.sys, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol, Representation r)
+  : sys(topol, r) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+                                     const dimension_type space_dim,
+                                     Representation r)
+  : sys(topol, space_dim, r) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+  Constraint_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+  return sys[k];
+}
+
+inline Representation
+Constraint_System::representation() const {
+  return sys.representation();
+}
+
+inline void
+Constraint_System::set_representation(Representation r) {
+  sys.set_representation(r);
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+  return Linear_System<Constraint>::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+  return sys.space_dimension();
+}
+
+inline void
+Constraint_System::set_space_dimension(dimension_type space_dim) {
+  return sys.set_space_dimension(space_dim);
+}
+
+inline void
+Constraint_System::clear() {
+  sys.clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+  PPL_ASSERT(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Constraint_System_const_iterator::Constraint_System_const_iterator(const Constraint_System_const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System_const_iterator::~Constraint_System_const_iterator() {
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator=(const Constraint_System_const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Constraint&
+Constraint_System_const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Constraint*
+Constraint_System_const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Constraint_System_const_iterator&
+Constraint_System_const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System_const_iterator::operator++(int) {
+  const Constraint_System_const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Constraint_System_const_iterator::operator==(const Constraint_System_const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Constraint_System_const_iterator::operator!=(const Constraint_System_const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Constraint_System_const_iterator::
+Constraint_System_const_iterator(const Linear_System<Constraint>::const_iterator& iter,
+               const Constraint_System& cs)
+  : i(iter), csp(&cs.sys) {
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::begin() const {
+  const_iterator i(sys.begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Constraint_System_const_iterator
+Constraint_System::end() const {
+  const Constraint_System_const_iterator i(sys.end(), *this);
+  return i;
+}
+
+inline bool
+Constraint_System::empty() const {
+  return begin() == end();
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+  if (sys.is_necessarily_closed())
+    // The positivity constraint.
+    insert(Constraint::zero_dim_positivity());
+  else {
+    // Add the epsilon constraints.
+    insert(Constraint::epsilon_leq_one());
+    insert(Constraint::epsilon_geq_zero());
+  }
+}
+
+inline void
+Constraint_System::m_swap(Constraint_System& y) {
+  swap(sys, y.sys);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+  return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Constraint_System::simplify() {
+  sys.simplify();
+}
+
+inline Topology
+Constraint_System::topology() const {
+  return sys.topology();
+}
+
+inline dimension_type
+Constraint_System::num_rows() const {
+  return sys.num_rows();
+}
+
+inline bool
+Constraint_System::is_necessarily_closed() const {
+  return sys.is_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::num_pending_rows() const {
+  return sys.num_pending_rows();
+}
+
+inline dimension_type
+Constraint_System::first_pending_row() const {
+  return sys.first_pending_row();
+}
+
+inline bool
+Constraint_System::is_sorted() const {
+  return sys.is_sorted();
+}
+
+inline void
+Constraint_System::unset_pending_rows() {
+  sys.unset_pending_rows();
+}
+
+inline void
+Constraint_System::set_index_first_pending_row(dimension_type i) {
+  sys.set_index_first_pending_row(i);
+}
+
+inline void
+Constraint_System::set_sorted(bool b) {
+  sys.set_sorted(b);
+}
+
+inline void
+Constraint_System::remove_row(dimension_type i, bool keep_sorted) {
+  sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(dimension_type first, dimension_type last,
+                               bool keep_sorted) {
+  sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Constraint_System::remove_rows(const std::vector<dimension_type>& indexes) {
+  sys.remove_rows(indexes);
+}
+
+inline void
+Constraint_System::remove_trailing_rows(dimension_type n) {
+  sys.remove_trailing_rows(n);
+}
+
+inline void
+Constraint_System
+::remove_space_dimensions(const Variables_Set& vars) {
+  sys.remove_space_dimensions(vars);
+}
+
+inline void
+Constraint_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+  sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Constraint_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Constraint_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+  sys.swap_space_dimensions(v1, v2);
+}
+
+inline bool
+Constraint_System::has_no_rows() const {
+  return sys.has_no_rows();
+}
+
+inline void
+Constraint_System::strong_normalize() {
+  sys.strong_normalize();
+}
+
+inline void
+Constraint_System::sort_rows() {
+  sys.sort_rows();
+}
+
+inline void
+Constraint_System::insert_pending(Constraint_System& r, Recycle_Input) {
+  sys.insert_pending(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert(Constraint_System& r, Recycle_Input) {
+  sys.insert(r.sys, Recycle_Input());
+}
+
+inline void
+Constraint_System::insert_pending(const Constraint_System& r) {
+  sys.insert_pending(r.sys);
+}
+
+inline void
+Constraint_System::merge_rows_assign(const Constraint_System& y) {
+  sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Constraint_System::insert(const Constraint_System& y) {
+  sys.insert(y.sys);
+}
+
+inline void
+Constraint_System::mark_as_necessarily_closed() {
+  sys.mark_as_necessarily_closed();
+}
+
+inline void
+Constraint_System::mark_as_not_necessarily_closed() {
+  sys.mark_as_not_necessarily_closed();
+}
+
+inline dimension_type
+Constraint_System::gauss(dimension_type n_lines_or_equalities) {
+  return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::back_substitute(dimension_type n_lines_or_equalities) {
+  sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Constraint_System::assign_with_pending(const Constraint_System& y) {
+  sys.assign_with_pending(y.sys);
+}
+
+inline void
+Constraint_System::sort_pending_and_remove_duplicates() {
+  sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Constraint_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+  sys.sort_and_remove_with_sat(sat);
+}
+
+inline bool
+Constraint_System::check_sorted() const {
+  return sys.check_sorted();
+}
+
+inline dimension_type
+Constraint_System::num_lines_or_equalities() const {
+  return sys.num_lines_or_equalities();
+}
+
+inline void
+Constraint_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+  sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline bool
+operator==(const Constraint_System& x, const Constraint_System& y) {
+  return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Constraint_System& x, const Constraint_System& y) {
+  return !(x == y);
+}
+
+/*! \relates Constraint_System */
+inline void
+swap(Constraint_System& x, Constraint_System& y) {
+  x.m_swap(y);
+}
+
+namespace Implementation {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+num_constraints(const Constraint_System& cs) {
+  return static_cast<dimension_type>(std::distance(cs.begin(), cs.end()));
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Congruence_System_defs.hh line 1. */
+/* Congruence_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Congruence_System_defs.hh line 35. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+}
+
+//! A system of congruences.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Congruence_System is a system of congruences,
+    i.e., a multiset of objects of the class Congruence.
+    When inserting congruences in a system, space dimensions are
+    automatically adjusted so that all the congruences in the system
+    are defined on the same vector space.
+
+    \par
+    In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code builds a system of congruences corresponding to
+    an integer grid in \f$\Rset^2\f$:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert(y %= 0);
+    \endcode
+    Note that:
+    the congruence system is created with space dimension zero;
+    the first and second congruence insertions increase the space
+    dimension to \f$1\f$ and \f$2\f$, respectively.
+
+    \par Example 2
+    By adding to the congruence system of the previous example,
+    the congruence \f$x + y = 1 \pmod{2}\f$:
+    \code
+  cgs.insert((x + y %= 1) / 2);
+    \endcode
+    we obtain the grid containing just those integral
+    points where the sum of the \p x and \p y values is odd.
+
+    \par Example 3
+    The following code builds a system of congruences corresponding to
+    the grid in \f$\Zset^2\f$ containing just the integral points on
+    the \p x axis:
+    \code
+  Congruence_System cgs;
+  cgs.insert(x %= 0);
+  cgs.insert((y %= 0) / 0);
+    \endcode
+
+    \note
+    After inserting a multiset of congruences in a congruence system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> congruence system
+    will be available, where original congruences may have been
+    reordered, removed (if they are trivial, duplicate or
+    implied by other congruences), linearly combined, etc.
+*/
+class Parma_Polyhedra_Library::Congruence_System {
+public:
+
+  typedef Congruence row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of congruences.
+  explicit Congruence_System(Representation r = default_representation);
+
+  //! Builds an empty (i.e. zero rows) system of dimension \p d.
+  explicit Congruence_System(dimension_type d,
+                             Representation r = default_representation);
+
+  //! Builds the singleton system containing only congruence \p cg.
+  explicit Congruence_System(const Congruence& cg,
+                             Representation r = default_representation);
+
+  /*! \brief
+    If \p c represents the constraint \f$ e_1 = e_2 \f$, builds the
+    singleton system containing only constraint \f$ e_1 = e_2
+    \pmod{0}\f$.
+
+    \exception std::invalid_argument
+    Thrown if \p c is not an equality constraint.
+  */
+  explicit Congruence_System(const Constraint& c,
+                             Representation r = default_representation);
+
+  //! Builds a system containing copies of any equalities in \p cs.
+  explicit Congruence_System(const Constraint_System& cs,
+                             Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  /*!
+    \note
+    The new Congruence_System will have the same Representation as `cgs'
+    so that it's indistinguishable from `cgs'.
+  */
+  Congruence_System(const Congruence_System& cgs);
+
+  //! Copy constructor with specified representation.
+  Congruence_System(const Congruence_System& cgs, Representation r);
+
+  //! Destructor.
+  ~Congruence_System();
+
+  //! Assignment operator.
+  Congruence_System& operator=(const Congruence_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Congruence_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is exactly equal
+    to \p y.
+  */
+  bool is_equal_to(const Congruence_System& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more linear equalities.
+  */
+  bool has_linear_equalities() const;
+
+  //! Removes all the congruences and sets the space dimension to 0.
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruence \p cg, increasing the
+    number of space dimensions if needed.
+
+    The copy of \p cg will be strongly normalized after being
+    inserted.
+  */
+  void insert(const Congruence& cg);
+
+  /*! \brief
+    Inserts in \p *this the congruence \p cg, stealing its contents and
+    increasing the number of space dimensions if needed.
+
+    \p cg will be strongly normalized.
+  */
+  void insert(Congruence& cg, Recycle_Input);
+
+  /*! \brief
+    Inserts in \p *this a copy of the equality constraint \p c, seen
+    as a modulo 0 congruence, increasing the number of space
+    dimensions if needed.
+
+    The modulo 0 congruence will be strongly normalized after being
+    inserted.
+
+    \exception std::invalid_argument
+    Thrown if \p c is a relational constraint.
+  */
+  void insert(const Constraint& c);
+
+  // TODO: Consider adding a insert(cg, Recycle_Input).
+
+  /*! \brief
+    Inserts in \p *this a copy of the congruences in \p y,
+    increasing the number of space dimensions if needed.
+
+    The inserted copies will be strongly normalized.
+  */
+  void insert(const Congruence_System& y);
+
+  /*! \brief
+    Inserts into \p *this the congruences in \p cgs, increasing the
+    number of space dimensions if needed.
+  */
+  void insert(Congruence_System& cgs, Recycle_Input);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  //! Returns the system containing only Congruence::zero_dim_false().
+  static const Congruence_System& zero_dim_empty();
+
+  //! An iterator over a system of congruences.
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each congruence contained in an object of Congruence_System.
+
+    \par Example
+    The following code prints the system of congruences
+    defining the grid <CODE>gr</CODE>:
+    \code
+  const Congruence_System& cgs = gr.congruences();
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    cout << *i << endl;
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+                           Congruence,
+                           ptrdiff_t,
+                           const Congruence*,
+                           const Congruence&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Congruence& operator*() const;
+
+    //! Indirect member selector.
+    const Congruence* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Congruence_System;
+
+    //! The const iterator over the vector of congruences.
+    Swapping_Vector<Congruence>::const_iterator i;
+
+    //! A const pointer to the vector of congruences.
+    const Swapping_Vector<Congruence>* csp;
+
+    //! Constructor.
+    const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+                   const Congruence_System& cgs);
+
+    //! \p *this skips to the next non-trivial congruence.
+    void skip_forward();
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no congruences.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first congruence, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*!
+    Returns <CODE>true</CODE> if and only if all rows have space dimension
+    space_dimension_, each row in the system is a valid Congruence and the
+    space dimension is consistent with the number of congruences.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns the number of equalities.
+  dimension_type num_equalities() const;
+
+  //! Returns the number of proper congruences.
+  dimension_type num_proper_congruences() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Congruence_System& y);
+
+  /*! \brief
+    Adds \p dims rows and \p dims space dimensions to the matrix,
+    initializing the added rows as in the unit congruence system.
+
+    \param dims
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims) \times
+    (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{A} \genfrac{}{}{0pt}{}{B}{A}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{0}{1} \genfrac{}{}{0pt}{}{1}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_unit_rows_and_space_dimensions(dimension_type dims);
+
+  //! Permutes the space dimensions of the system.
+  /*!
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  //! Sets the number of space dimensions to \p new_space_dim.
+  /*!
+    If \p new_space_dim is lower than the current space dimension, the
+    coefficients referring to the removed space dimensions are lost.
+  */
+  bool set_space_dimension(dimension_type new_space_dim);
+
+  // Note: the following method is protected to allow tests/Grid/congruences2
+  // to call it using a derived class.
+protected:
+  //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+  bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+  //! Returns the number of rows in the system.
+  dimension_type num_rows() const;
+
+  //! Returns \c true if num_rows()==0.
+  bool has_no_rows() const;
+
+  //! Returns a constant reference to the \p k- th congruence of the system.
+  const Congruence& operator[](dimension_type k) const;
+
+  //! Adjusts all expressions to have the same moduli.
+  void normalize_moduli();
+
+  /*! \brief
+    Substitutes a given column of coefficients by a given affine
+    expression.
+
+    \param v
+    Index of the column to which the affine transformation is
+    substituted;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations) to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its default value
+    is 1.
+
+    The affine transformation substitutes the matrix of congruences
+    by a new matrix whose elements \f${a'}_{ij}\f$ are built from
+    the old one \f$a_{ij}\f$ as follows:
+    \f[
+      {a'}_{ij} =
+        \begin{cases}
+          a_{ij} * \mathrm{denominator} + a_{iv} * \mathrm{expr}[j]
+            \quad \text{for } j \neq v; \\
+          \mathrm{expr}[v] * a_{iv}
+            \quad \text{for } j = v.
+        \end{cases}
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_preimage(Variable v,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator);
+
+  // TODO: Consider making this private.
+  /*! \brief
+    Concatenates copies of the congruences from \p y onto \p *this.
+
+    \param y
+    The congruence system to append to \p this.  The number of rows in
+    \p y must be strictly positive.
+
+    The matrix for the new system of congruences is obtained by
+    leaving the old system in the upper left-hand side and placing the
+    congruences of \p y in the lower right-hand side, and padding
+    with zeroes.
+  */
+  void concatenate(const Congruence_System& y);
+
+  /*! \brief
+    Inserts in \p *this the congruence \p cg, stealing its contents and
+    increasing the number of space dimensions if needed.
+
+    This method inserts \p cg in the given form, instead of first strong
+    normalizing \p cg as \ref insert would do.
+  */
+  void insert_verbatim(Congruence& cg, Recycle_Input);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    If \p keep_sorted is <CODE>true</CODE>, the ordering of the remaining rows
+    will be preserved.
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                   bool keep_sorted);
+
+  void remove_trailing_rows(dimension_type n);
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Congruence::zero_dim_false().
+  */
+  static const Congruence_System* zero_dim_empty_p;
+
+  Swapping_Vector<Congruence> rows;
+
+  dimension_type space_dimension_;
+
+  Representation representation_;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if any of the dimensions in
+    \p *this is free of constraint.
+
+    Any equality or proper congruence affecting a dimension constrains
+    that dimension.
+
+    This method assumes the system is in minimal form.
+  */
+  bool has_a_free_dimension() const;
+
+  friend class Grid;
+
+  friend bool
+  operator==(const Congruence_System& x, const Congruence_System& y);
+};
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Congruence_System
+  Writes <CODE>true</CODE> if \p cgs is empty.  Otherwise, writes on
+  \p s the congruences of \p cgs, all in one row and separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+} // namespace IO_Operators
+
+/*! \relates Congruence_System */
+void
+swap(Congruence_System& x, Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Congruence_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Congruence_System_inlines.hh line 1. */
+/* Congruence_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Congruence_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+  return rows[k];
+}
+
+inline dimension_type
+Congruence_System::num_rows() const {
+  return rows.size();
+}
+
+inline bool
+Congruence_System::has_no_rows() const {
+  return num_rows() == 0;
+}
+
+inline void
+Congruence_System::remove_trailing_rows(dimension_type n) {
+  PPL_ASSERT(num_rows() >= n);
+  rows.resize(num_rows() - n);
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+  Congruence tmp = cg;
+  insert(tmp, Recycle_Input());
+}
+
+inline void
+Congruence_System::insert(Congruence& cg, Recycle_Input) {
+  PPL_ASSERT(cg.OK());
+  cg.strong_normalize();
+  PPL_ASSERT(cg.OK());
+  insert_verbatim(cg, Recycle_Input());
+  PPL_ASSERT(OK());
+}
+
+inline
+Congruence_System::Congruence_System(Representation r)
+  : rows(),
+    space_dimension_(0),
+    representation_(r) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg, Representation r)
+  : rows(),
+    space_dimension_(0),
+    representation_(r) {
+  insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c, Representation r)
+  : rows(),
+    space_dimension_(0),
+    representation_(r) {
+  insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs)
+  : rows(cgs.rows),
+    space_dimension_(cgs.space_dimension_),
+    representation_(cgs.representation_) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cgs,
+                                     Representation r)
+  : rows(cgs.rows),
+    space_dimension_(cgs.space_dimension_),
+    representation_(r) {
+  if (cgs.representation() != r) {
+    for (dimension_type i = 0; i < num_rows(); ++i)
+      rows[i].set_representation(representation());
+  }
+}
+
+inline
+Congruence_System::Congruence_System(const dimension_type d, Representation r)
+  : rows(),
+    space_dimension_(d),
+    representation_(r) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+  Congruence_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Representation
+Congruence_System::representation() const {
+  return representation_;
+}
+
+inline void
+Congruence_System::set_representation(Representation r) {
+  if (representation_ == r)
+    return;
+  representation_ = r;
+  for (dimension_type i = 0; i < num_rows(); ++i)
+    rows[i].set_representation(r);
+  PPL_ASSERT(OK());
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+  return Congruence::max_space_dimension();
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+  return space_dimension_;
+}
+
+inline void
+Congruence_System::clear() {
+  rows.clear();
+  space_dimension_ = 0;
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+  PPL_ASSERT(zero_dim_empty_p != 0);
+  return *zero_dim_empty_p;
+}
+
+inline
+Congruence_System::const_iterator::const_iterator()
+  : i(), csp(0) {
+}
+
+inline
+Congruence_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i), csp(y.csp) {
+}
+
+inline
+Congruence_System::const_iterator::~const_iterator() {
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  csp = y.csp;
+  return *this;
+}
+
+inline const Congruence&
+Congruence_System::const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Congruence_System::const_iterator&
+Congruence_System::const_iterator::operator++() {
+  ++i;
+  skip_forward();
+  return *this;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Congruence_System::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Congruence_System::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Congruence_System::const_iterator::
+const_iterator(const Swapping_Vector<Congruence>::const_iterator& iter,
+               const Congruence_System& cgs)
+  : i(iter), csp(&cgs.rows) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+  const_iterator i(rows.begin(), *this);
+  i.skip_forward();
+  return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+  const const_iterator i(rows.end(), *this);
+  return i;
+}
+
+inline bool
+Congruence_System::empty() const {
+  return begin() == end();
+}
+
+inline void
+Congruence_System::m_swap(Congruence_System& y) {
+  using std::swap;
+  swap(rows, y.rows);
+  swap(space_dimension_, y.space_dimension_);
+  swap(representation_, y.representation_);
+  PPL_ASSERT(OK());
+  PPL_ASSERT(y.OK());
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+  return rows.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+  return rows.external_memory_in_bytes() + sizeof(*this);
+}
+
+/*! \relates Congruence_System */
+inline void
+swap(Congruence_System& x, Congruence_System& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_inlines.hh line 33. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline bool
+Box<ITV>::marked_empty() const {
+  return status.test_empty_up_to_date() && status.test_empty();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty() {
+  status.set_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_nonempty() {
+  status.reset_empty();
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_empty_up_to_date() {
+  status.set_empty_up_to_date();
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::reset_empty_up_to_date() {
+  return status.reset_empty_up_to_date();
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Box& y, Complexity_Class)
+  : seq(y.seq), status(y.status) {
+}
+
+template <typename ITV>
+inline Box<ITV>&
+Box<ITV>::operator=(const Box& y) {
+  seq = y.seq;
+  status = y.status;
+  return *this;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::m_swap(Box& y) {
+  Box& x = *this;
+  using std::swap;
+  swap(x.seq, y.seq);
+  swap(x.status, y.status);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cs);
+  this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Generator_System& gs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(gs);
+  this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs, Recycle_Input) {
+  // Recycling is useless: just delegate.
+  Box<ITV> tmp(cgs);
+  this->m_swap(tmp);
+}
+
+template <typename ITV>
+inline memory_size_type
+Box<ITV>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::space_dimension() const {
+  return seq.size();
+}
+
+template <typename ITV>
+inline dimension_type
+Box<ITV>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return Sequence().max_size() - 1;
+}
+
+template <typename ITV>
+inline int32_t
+Box<ITV>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < seq.size());
+  return seq[k];
+}
+
+template <typename ITV>
+inline const ITV&
+Box<ITV>::get_interval(const Variable var) const {
+  if (space_dimension() < var.space_dimension())
+    throw_dimension_incompatible("get_interval(v)", "v", var);
+
+  if (is_empty()) {
+    static ITV empty_interval(EMPTY);
+    return empty_interval;
+  }
+
+  return seq[var.id()];
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::set_interval(const Variable var, const ITV& i) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < var.space_dimension())
+    throw_dimension_incompatible("set_interval(v, i)", "v", var);
+
+  if (is_empty() && space_dim >= 2)
+    // If the box is empty, and has dimension >= 2, setting only one
+    // interval will not make it non-empty.
+    return;
+
+  seq[var.id()] = i;
+  reset_empty_up_to_date();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::is_empty() const {
+  return marked_empty() || check_empty();
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+                   Coefficient& sup_n, Coefficient& sup_d,
+                   bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::maximize(const Linear_Expression& expr,
+                   Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                   Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+                   Coefficient& inf_n, Coefficient& inf_d,
+                   bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::minimize(const Linear_Expression& expr,
+                   Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                   Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::strictly_contains(const Box& y) const {
+  const Box& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::expand_space_dimension(const Variable var,
+                                 const dimension_type m) {
+  const dimension_type space_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting Box should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_invalid_argument("expand_dimension(v, m)",
+                           "adding m new space dimensions exceeds "
+                           "the maximum allowed space dimension");
+
+  // To expand the space dimension corresponding to variable `var',
+  // we append to the box `m' copies of the corresponding interval.
+  seq.insert(seq.end(), m, seq[var.id()]);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline bool
+operator!=(const Box<ITV>& x, const Box<ITV>& y) {
+  return !(x == y);
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_lower_bound(const Variable var,
+                          Coefficient& n, Coefficient& d, bool& closed) const {
+  // NOTE: assertion !is_empty() would be wrong;
+  // see the calls in method Box<ITV>::constraints().
+  PPL_ASSERT(!marked_empty());
+  const dimension_type k = var.id();
+  PPL_ASSERT(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.lower_is_boundary_infinity())
+    return false;
+
+  closed = !seq_k.lower_is_open();
+
+  PPL_DIRTY_TEMP(mpq_class, lr);
+  assign_r(lr, seq_k.lower(), ROUND_NOT_NEEDED);
+  n = lr.get_num();
+  d = lr.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::has_upper_bound(const Variable var,
+                          Coefficient& n, Coefficient& d, bool& closed) const {
+  // NOTE: assertion !is_empty() would be wrong;
+  // see the calls in method Box<ITV>::constraints().
+  PPL_ASSERT(!marked_empty());
+  const dimension_type k = var.id();
+  PPL_ASSERT(k < seq.size());
+  const ITV& seq_k = seq[k];
+
+  if (seq_k.upper_is_boundary_infinity())
+    return false;
+
+  closed = !seq_k.upper_is_open();
+
+  PPL_DIRTY_TEMP(mpq_class, ur);
+  assign_r(ur, seq_k.upper(), ROUND_NOT_NEEDED);
+  n = ur.get_num();
+  d = ur.get_den();
+
+  return true;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  add_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_constraints(cs)", cs);
+
+  add_constraints_no_check(cs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  add_congruence_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_congruences(const Congruence_System& cgs) {
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", cgs);
+  add_congruences_no_check(cgs);
+}
+
+template <typename T>
+inline void
+Box<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+template <typename T>
+inline bool
+Box<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Box<T>::widening_assign(const Box& y, unsigned* tp) {
+  CC76_widening_assign(y, tp);
+}
+
+template <typename ITV>
+inline Congruence_System
+Box<ITV>::minimized_congruences() const {
+  // Only equalities can be congruences and these are already minimized.
+  return congruences();
+}
+
+template <typename ITV>
+inline I_Result
+Box<ITV>
+::refine_interval_no_check(ITV& itv,
+                           const Constraint::Type type,
+                           Coefficient_traits::const_reference numer,
+                           Coefficient_traits::const_reference denom) {
+  PPL_ASSERT(denom != 0);
+  // The interval constraint is of the form
+  // `var + numer / denom rel 0',
+  // where `rel' is either the relation `==', `>=', or `>'.
+  // For the purpose of refining the interval, this is
+  // (morally) turned into `var rel -numer/denom'.
+  PPL_DIRTY_TEMP(mpq_class, q);
+  assign_r(q.get_num(), numer, ROUND_NOT_NEEDED);
+  assign_r(q.get_den(), denom, ROUND_NOT_NEEDED);
+  q.canonicalize();
+  // Turn `numer/denom' into `-numer/denom'.
+  q = -q;
+
+  Relation_Symbol rel_sym;
+  switch (type) {
+  case Constraint::EQUALITY:
+    rel_sym = EQUAL;
+    break;
+  case Constraint::NONSTRICT_INEQUALITY:
+    rel_sym = (denom > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    break;
+  case Constraint::STRICT_INEQUALITY:
+    rel_sym = (denom > 0) ? GREATER_THAN : LESS_THAN;
+    break;
+  default:
+    // Silence compiler warning.
+    PPL_UNREACHABLE;
+    return I_ANY;
+  }
+  I_Result res = itv.add_constraint(i_constraint(rel_sym, q));
+  PPL_ASSERT(itv.OK());
+  return res;
+}
+
+template <typename ITV>
+inline void
+Box<ITV>
+::add_interval_constraint_no_check(const dimension_type var_id,
+                                   const Constraint::Type type,
+                                   Coefficient_traits::const_reference numer,
+                                   Coefficient_traits::const_reference denom) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(var_id < space_dimension());
+  PPL_ASSERT(denom != 0);
+  refine_interval_no_check(seq[var_id], type, numer, denom);
+  // FIXME: do check the value returned and set `empty' and
+  // `empty_up_to_date' as appropriate.
+  // This has to be done after reimplementation of intervals.
+  reset_empty_up_to_date();
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_constraints(cs)", cs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cg);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_congruences(cgs)", cgs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  refine_no_check(cgs);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("propagate_constraint(c)", c);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  propagate_constraint_no_check(c);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::propagate_constraints(const Constraint_System& cs,
+                                const dimension_type max_iterations) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_dimension_incompatible("propagate_constraints(cs)", cs);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  propagate_constraints_no_check(cs, max_iterations);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::unconstrain(const Variable var) {
+  const dimension_type var_id = var.id();
+  // Dimension-compatibility check.
+  if (space_dimension() < var_id + 1)
+    throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for `var' before cylindrification.
+  ITV& seq_var = seq[var_id];
+  if (seq_var.is_empty())
+    set_empty();
+  else
+    seq_var.assign(UNIVERSE);
+
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Box<ITV>& x,
+                            const Box<ITV>& y,
+                            const Rounding_Dir dir) {
+  // FIXME: the following qualification is only to work around a bug
+  // in the Intel C/C++ compiler version 10.1.x.
+  return Parma_Polyhedra_Library
+    ::rectilinear_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Box<ITV>& x,
+                          const Box<ITV>& y,
+                          const Rounding_Dir dir) {
+  // FIXME: the following qualification is only to work around a bug
+  // in the Intel C/C++ compiler version 10.1.x.
+  return Parma_Polyhedra_Library
+    ::euclidean_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >
+    (r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename Temp, typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Box */
+template <typename To, typename ITV>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Box<ITV>& x,
+                           const Box<ITV>& y,
+                           const Rounding_Dir dir) {
+  // FIXME: the following qualification is only to work around a bug
+  // in the Intel C/C++ compiler version 10.1.x.
+  return Parma_Polyhedra_Library
+    ::l_infinity_distance_assign<To, To, ITV>(r, x, y, dir);
+}
+
+/*! \relates Box */
+template <typename ITV>
+inline void
+swap(Box<ITV>& x, Box<ITV>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_templates.hh line 1. */
+/* Box class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_defs.hh line 1. */
+/* Generator_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_defs.hh line 1. */
+/* Poly_Con_Relation class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_defs.hh line 29. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Con_Relation */
+bool operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Con_Relation */
+Poly_Con_Relation operator&&(const Poly_Con_Relation& x,
+                             const Poly_Con_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Con_Relation
+*/
+Poly_Con_Relation operator-(const Poly_Con_Relation& x,
+                            const Poly_Con_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Con_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a constraint.
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a constraint.
+*/
+class Parma_Polyhedra_Library::Poly_Con_Relation {
+private:
+  //! Poly_Con_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING             = 0U;
+  static const flags_t IS_DISJOINT         = 1U << 0;
+  static const flags_t STRICTLY_INTERSECTS = 1U << 1;
+  static const flags_t IS_INCLUDED         = 1U << 2;
+  static const flags_t SATURATES           = 1U << 3;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = IS_DISJOINT
+  | STRICTLY_INTERSECTS
+  | IS_INCLUDED
+  | SATURATES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Con_Relation(flags_t mask);
+
+  friend bool
+  operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+  friend bool
+  operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend Poly_Con_Relation
+  operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Con_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some language
+    interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Con_Relation nothing();
+
+  /*! \brief
+    The polyhedron and the set of points satisfying
+    the constraint are disjoint.
+  */
+  static Poly_Con_Relation is_disjoint();
+
+  /*! \brief
+    The polyhedron intersects the set of points satisfying
+    the constraint, but it is not included in it.
+  */
+  static Poly_Con_Relation strictly_intersects();
+
+  /*! \brief
+    The polyhedron is included in the set of points satisfying
+    the constraint.
+  */
+  static Poly_Con_Relation is_included();
+
+  /*! \brief
+    The polyhedron is included in the set of points saturating
+    the constraint.
+  */
+  static Poly_Con_Relation saturates();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Con_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_inlines.hh line 1. */
+/* Poly_Con_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Con_Relation::Poly_Con_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Con_Relation::flags_t
+Poly_Con_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::nothing() {
+  return Poly_Con_Relation(NOTHING);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_disjoint() {
+  return Poly_Con_Relation(IS_DISJOINT);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::strictly_intersects() {
+  return Poly_Con_Relation(STRICTLY_INTERSECTS);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::is_included() {
+  return Poly_Con_Relation(IS_INCLUDED);
+}
+
+inline Poly_Con_Relation
+Poly_Con_Relation::saturates() {
+  return Poly_Con_Relation(SATURATES);
+}
+
+inline bool
+Poly_Con_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Con_Relation::implies(const Poly_Con_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator==(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline bool
+operator!=(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator&&(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Con_Relation */
+inline Poly_Con_Relation
+operator-(const Poly_Con_Relation& x, const Poly_Con_Relation& y) {
+  return Poly_Con_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Con_Relation_defs.hh line 165. */
+
+/* Automatically generated from PPL source file ../src/Generator_System_defs.hh line 35. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Generator_System& gs);
+
+} // namespace IO_Operators
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator==(const Generator_System& x, const Generator_System& y);
+
+// TODO: Consider removing this.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Generator_System */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool operator!=(const Generator_System& x, const Generator_System& y);
+
+/*! \relates Generator_System */
+void
+swap(Generator_System& x, Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Generator_System is a system of generators,
+    i.e., a multiset of objects of the class Generator
+    (lines, rays, points and closure points).
+    When inserting generators in a system, space dimensions are automatically
+    adjusted so that all the generators in the system are defined
+    on the same vector space.
+    A system of generators which is meant to define a non-empty
+    polyhedron must include at least one point: the reason is that
+    lines, rays and closure points need a supporting point
+    (lines and rays only specify directions while closure points only
+    specify points in the topological closure of the NNC polyhedron).
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty polyhedron, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a ray having the same direction as
+    the positive part of the \f$x\f$ axis in \f$\Rset^2\f$:
+    \code
+  Generator_System gs;
+  gs.insert(ray(x + 0*y));
+    \endcode
+    To define a system of generators indeed corresponding to the set
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \geq 0
+      \,\bigr\},
+    \f]
+    one just has to add the origin:
+    \code
+  gs.insert(point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having four points
+    and corresponding to a square in \f$\Rset^2\f$
+    (the same as Example 1 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+    \endcode
+
+    \par Example 4
+    By using closure points, we can define the \e kernel
+    (i.e., the largest open set included in a given set)
+    of the square defined in the previous example.
+    Note that a supporting point is needed and, for that purpose,
+    any inner point could be considered.
+    \code
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(closure_point(0*x + 0*y));
+  gs.insert(closure_point(0*x + 3*y));
+  gs.insert(closure_point(3*x + 0*y));
+  gs.insert(closure_point(3*x + 3*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having two points
+    and a ray, corresponding to a half-strip in \f$\Rset^2\f$
+    (the same as Example 2 for the system of constraints):
+    \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 1*y));
+  gs.insert(ray(x - y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Generator_System {
+public:
+  typedef Generator row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of generators.
+  Generator_System(Representation r = default_representation);
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Generator_System(const Generator& g,
+                            Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  //! The new Generator_System will have the same representation as `gs'.
+  Generator_System(const Generator_System& gs);
+
+  //! Copy constructor with specified representation.
+  Generator_System(const Generator_System& gs, Representation r);
+
+  //! Destructor.
+  ~Generator_System();
+
+  //! Assignment operator.
+  Generator_System& operator=(const Generator_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Sets the space dimension of the rows in the system to \p space_dim .
+  void set_space_dimension(dimension_type space_dim);
+
+  /*! \brief
+    Removes all the generators from the generator system
+    and sets its space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+  */
+  void insert(const Generator& g);
+
+  /*! \brief
+    Inserts in \p *this the generator \p g, stealing its contents and
+    increasing the number of space dimensions if needed.
+  */
+  void insert(Generator& g, Recycle_Input);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System& zero_dim_univ();
+
+  typedef Generator_System_const_iterator const_iterator;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Generator_System& y);
+
+private:
+
+  bool has_no_rows() const;
+
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  //! Swaps the coefficients of the variables \p v1 and \p v2 .
+  void swap_space_dimensions(Variable v1, Variable v2);
+
+  dimension_type num_rows() const;
+
+  //! Adds \p n rows and space dimensions to the system.
+  /*!
+    \param n
+    The number of rows and space dimensions to be added: must be strictly
+    positive.
+
+    Turns the system \f$M \in \Rset^r \times \Rset^c\f$ into
+    the system \f$N \in \Rset^{r+n} \times \Rset^{c+n}\f$
+    such that
+    \f$N = \bigl(\genfrac{}{}{0pt}{}{0}{M}\genfrac{}{}{0pt}{}{J}{o}\bigr)\f$,
+    where \f$J\f$ is the specular image
+    of the \f$n \times n\f$ identity matrix.
+  */
+  void add_universe_rows_and_space_dimensions(dimension_type n);
+
+  Topology topology() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  //! Returns the value of the sortedness flag.
+  bool is_sorted() const;
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    the system topology is <CODE>NECESSARILY_CLOSED</CODE>.
+  */
+  bool is_necessarily_closed() const;
+
+  //! Full assignment operator: pending rows are copied as pending.
+  void assign_with_pending(const Generator_System& y);
+
+  //! Returns the number of rows that are in the pending part of the system.
+  dimension_type num_pending_rows() const;
+
+  /*! \brief
+    Sorts the pending rows and eliminates those that also occur
+    in the non-pending part of the system.
+  */
+  void sort_pending_and_remove_duplicates();
+
+  /*! \brief
+    Sorts the system, removing duplicates, keeping the saturation
+    matrix consistent.
+
+    \param sat
+    Bit matrix with rows corresponding to the rows of \p *this.
+  */
+  void sort_and_remove_with_sat(Bit_Matrix& sat);
+
+  /*! \brief
+    Sorts the non-pending rows (in growing order) and eliminates
+    duplicated ones.
+  */
+  void sort_rows();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is sorted,
+    without checking for duplicates.
+  */
+  bool check_sorted() const;
+
+  /*! \brief
+    Returns the number of rows in the system
+    that represent either lines or equalities.
+  */
+  dimension_type num_lines_or_equalities() const;
+
+  //! Makes the system shrink by removing its i-th row.
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(n).
+
+    Otherwise, this method just swaps the i-th row with the last and then
+    removes it, so it costs O(1).
+  */
+  void remove_row(dimension_type i, bool keep_sorted = false);
+
+  //! Makes the system shrink by removing the rows in [first,last).
+  /*!
+    When \p keep_sorted is \p true and the system is sorted, sortedness will
+    be preserved, but this method costs O(num_rows()).
+
+    Otherwise, this method just swaps the rows with the last ones and then
+    removes them, so it costs O(last - first).
+  */
+  void remove_rows(dimension_type first, dimension_type last,
+                   bool keep_sorted = false);
+
+  //! Removes the specified rows. The row ordering of remaining rows is
+  //! preserved.
+  /*!
+    \param indexes specifies a list of row indexes.
+                   It must be sorted.
+  */
+  void remove_rows(const std::vector<dimension_type>& indexes);
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  //! Minimizes the subsystem of equations contained in \p *this.
+  /*!
+    This method works only on the equalities of the system:
+    the system is required to be partially sorted, so that
+    all the equalities are grouped at its top; it is assumed that
+    the number of equalities is exactly \p n_lines_or_equalities.
+    The method finds a minimal system for the equalities and
+    returns its rank, i.e., the number of linearly independent equalities.
+    The result is an upper triangular subsystem of equalities:
+    for each equality, the pivot is chosen starting from
+    the right-most columns.
+  */
+  dimension_type gauss(dimension_type n_lines_or_equalities);
+
+  /*! \brief
+    Back-substitutes the coefficients to reduce
+    the complexity of the system.
+
+    Takes an upper triangular system having \p n_lines_or_equalities rows.
+    For each row, starting from the one having the minimum number of
+    coefficients different from zero, computes the expression of an element
+    as a function of the remaining ones and then substitutes this expression
+    in all the other rows.
+  */
+  void back_substitute(dimension_type n_lines_or_equalities);
+
+  //! Strongly normalizes the system.
+  void strong_normalize();
+
+  /*! \brief
+    Assigns to \p *this the result of merging its rows with
+    those of \p y, obtaining a sorted system.
+
+    Duplicated rows will occur only once in the result.
+    On entry, both systems are assumed to be sorted and have
+    no pending rows.
+  */
+  void merge_rows_assign(const Generator_System& y);
+
+  //! Adds to \p *this a copy of  the rows of \p y.
+  /*!
+    It is assumed that \p *this has no pending rows.
+  */
+  void insert(const Generator_System& y);
+
+  //! Adds a copy of the rows of `y' to the pending part of `*this'.
+  void insert_pending(const Generator_System& r);
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Generator::zero_dim_point().
+  */
+  static const Generator_System* zero_dim_univ_p;
+
+  friend class Generator_System_const_iterator;
+
+  //! Builds an empty system of generators having the specified topology.
+  explicit Generator_System(Topology topol,
+                            Representation r = default_representation);
+
+  /*! \brief
+    Builds a system of rays/points on a \p space_dim dimensional space. If
+    \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE> the \f$\epsilon\f$
+    dimension is added.
+  */
+  Generator_System(Topology topol, dimension_type space_dim,
+                   Representation r = default_representation);
+
+  /*! \brief
+    Adjusts \p *this so that it matches the \p new_topology and
+    \p new_space_dim (adding or removing columns if needed).
+    Returns <CODE>false</CODE> if and only if \p topol is
+    equal to <CODE>NECESSARILY_CLOSED</CODE> and \p *this
+    contains closure points.
+  */
+  bool adjust_topology_and_space_dimension(Topology new_topology,
+                                           dimension_type new_space_dim);
+
+  /*! \brief
+    For each unmatched closure point in \p *this, adds the
+    corresponding point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more points.
+  */
+  bool has_points() const;
+
+  /*! \brief
+    For each unmatched point in \p *this, adds the corresponding
+    closure point.
+
+    It is assumed that the topology of \p *this
+    is <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+  */
+  void add_corresponding_closure_points();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains one or more closure points.
+
+    Note: the check for the presence of closure points is
+    done under the point of view of the user. Namely, we scan
+    the generator system using high-level iterators, so that
+    closure points that are matching the corresponding points
+    will be disregarded.
+  */
+  bool has_closure_points() const;
+
+  //! Converts this generator system into a non-necessarily closed generator
+  //! system.
+  void convert_into_non_necessarily_closed();
+
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Generator& operator[](dimension_type k) const;
+
+  /*! \brief
+    Returns the relations holding between the generator system
+    and the constraint \p c.
+  */
+  Parma_Polyhedra_Library::Poly_Con_Relation
+  relation_with(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  bool satisfied_by_all_generators(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> holds.
+  */
+  bool satisfied_by_all_generators_C(const Constraint& c) const;
+
+  //! Returns <CODE>true</CODE> if all the generators satisfy \p c.
+  /*!
+    It is assumed that <CODE>c.is_necessarily_closed()</CODE> does not hold.
+  */
+  bool satisfied_by_all_generators_NNC(const Constraint& c) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    The variable to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation.
+
+    We want to allow affine transformations (see the Introduction) having
+    any rational coefficients. Since the coefficients of the
+    constraints are integers we must also provide an integer \p denominator
+    that will be used as denominator of the affine transformation.
+    The denominator is required to be a positive integer.
+
+    The affine transformation assigns to each element of the column containing
+    the coefficients of v the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(Variable v,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator);
+
+  //! Returns the number of lines of the system.
+  dimension_type num_lines() const;
+
+  //! Returns the number of rays of the system.
+  dimension_type num_rays() const;
+
+  //! Removes all the invalid lines and rays.
+  /*!
+    The invalid lines and rays are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_rays();
+
+  /*! \brief
+    Applies Gaussian elimination and back-substitution so as
+    to provide a partial simplification of the system of generators.
+
+    It is assumed that the system has no pending generators.
+  */
+  void simplify();
+
+  /*! \brief
+    Inserts in \p *this a copy of the generator \p g,
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(const Generator& g);
+
+  /*! \brief
+    Inserts in \p *this the generator \p g, stealing its contents and
+    increasing the number of space dimensions if needed.
+    It is a pending generator.
+  */
+  void insert_pending(Generator& g, Recycle_Input);
+
+  Linear_System<Generator> sys;
+
+  friend bool
+  operator==(const Generator_System& x, const Generator_System& y);
+
+  friend class Polyhedron;
+};
+
+//! An iterator over a system of generators
+/*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the polyhedron <CODE>ph</CODE>:
+    \code
+const Generator_System& gs = ph.generators();
+for (Generator_System::const_iterator i = gs.begin(),
+        gs_end = gs.end(); i != gs_end; ++i)
+  cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+const Generator_System& gs = ph.generators();
+copy(gs.begin(), gs.end(), ostream_iterator<Generator>(cout, "\n"));
+    \endcode
+*/
+class Parma_Polyhedra_Library::Generator_System_const_iterator
+  : public std::iterator<std::forward_iterator_tag,
+        Generator,
+        ptrdiff_t,
+        const Generator*,
+        const Generator&> {
+public:
+  //! Default constructor.
+  Generator_System_const_iterator();
+
+  //! Ordinary copy constructor.
+  Generator_System_const_iterator(const Generator_System_const_iterator& y);
+
+  //! Destructor.
+  ~Generator_System_const_iterator();
+
+  //! Assignment operator.
+  Generator_System_const_iterator& operator=(const Generator_System_const_iterator& y);
+
+  //! Dereference operator.
+  const Generator& operator*() const;
+
+  //! Indirect member selector.
+  const Generator* operator->() const;
+
+  //! Prefix increment operator.
+  Generator_System_const_iterator& operator++();
+
+  //! Postfix increment operator.
+  Generator_System_const_iterator operator++(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const Generator_System_const_iterator& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const Generator_System_const_iterator& y) const;
+
+private:
+  friend class Generator_System;
+
+  //! The const iterator over the Linear_System.
+  Linear_System<Generator>::const_iterator i;
+
+  //! A const pointer to the Linear_System.
+  const Linear_System<Generator>* gsp;
+
+  //! Constructor.
+  Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+      const Generator_System& gsys);
+
+  /*! \brief
+    \p *this skips to the next generator, skipping those
+    closure points that are immediately followed by a matching point.
+  */
+  void skip_forward();
+};
+
+// Generator_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Generator_System_inlines.hh line 1. */
+/* Generator_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Generator_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System(Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g, Representation r)
+  : sys(g.topology(), r) {
+  sys.insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+  : sys(gs.sys) {
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs,
+                                   Representation r)
+  : sys(gs.sys, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol, Representation r)
+  : sys(topol, r) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+                                   const dimension_type space_dim,
+                                   Representation r)
+  : sys(topol, space_dim, r) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+  Generator_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Representation
+Generator_System::representation() const {
+  return sys.representation();
+}
+
+inline void
+Generator_System::set_representation(Representation r) {
+  sys.set_representation(r);
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+  return Linear_System<Generator>::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+  return sys.space_dimension();
+}
+
+inline void
+Generator_System::set_space_dimension(dimension_type space_dim) {
+  const dimension_type old_space_dim = space_dimension();
+  sys.set_space_dimension_no_ok(space_dim);
+
+  if (space_dim < old_space_dim)
+    // We may have invalid lines and rays now.
+    remove_invalid_lines_and_rays();
+
+#ifndef NDEBUG
+  for (dimension_type i = 0; i < sys.num_rows(); ++i)
+    PPL_ASSERT(sys[i].OK());
+#endif
+  PPL_ASSERT(sys.OK());
+  PPL_ASSERT(OK());
+}
+
+inline void
+Generator_System::clear() {
+  sys.clear();
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+  return sys[k];
+}
+
+inline void
+Generator_System
+::remove_space_dimensions(const Variables_Set& vars) {
+  sys.remove_space_dimensions(vars);
+}
+
+inline void
+Generator_System
+::shift_space_dimensions(Variable v, dimension_type n) {
+  sys.shift_space_dimensions(v, n);
+}
+
+inline void
+Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  sys.permute_space_dimensions(cycle);
+}
+
+inline void
+Generator_System
+::swap_space_dimensions(Variable v1, Variable v2) {
+  sys.swap_space_dimensions(v1, v2);
+}
+
+inline dimension_type
+Generator_System::num_rows() const {
+  return sys.num_rows();
+}
+
+inline void
+Generator_System::add_universe_rows_and_space_dimensions(dimension_type n) {
+  sys.add_universe_rows_and_space_dimensions(n);
+}
+
+inline Topology
+Generator_System::topology() const {
+  return sys.topology();
+}
+
+inline dimension_type
+Generator_System::first_pending_row() const {
+  return sys.first_pending_row();
+}
+
+inline void
+Generator_System::unset_pending_rows() {
+  sys.unset_pending_rows();
+}
+
+inline void
+Generator_System::set_sorted(bool b) {
+  sys.set_sorted(b);
+}
+
+inline bool
+Generator_System::is_sorted() const {
+  return sys.is_sorted();
+}
+
+inline void
+Generator_System::set_index_first_pending_row(dimension_type i) {
+  sys.set_index_first_pending_row(i);
+}
+
+inline bool
+Generator_System::is_necessarily_closed() const {
+  return sys.is_necessarily_closed();
+}
+
+inline void
+Generator_System::assign_with_pending(const Generator_System& y) {
+  sys.assign_with_pending(y.sys);
+}
+
+inline dimension_type
+Generator_System::num_pending_rows() const {
+  return sys.num_pending_rows();
+}
+
+inline void
+Generator_System::sort_pending_and_remove_duplicates() {
+  return sys.sort_pending_and_remove_duplicates();
+}
+
+inline void
+Generator_System::sort_and_remove_with_sat(Bit_Matrix& sat) {
+  sys.sort_and_remove_with_sat(sat);
+}
+
+inline void
+Generator_System::sort_rows() {
+  sys.sort_rows();
+}
+
+inline bool
+Generator_System::check_sorted() const {
+  return sys.check_sorted();
+}
+
+inline dimension_type
+Generator_System::num_lines_or_equalities() const {
+  return sys.num_lines_or_equalities();
+}
+
+inline void
+Generator_System::remove_row(dimension_type i, bool keep_sorted) {
+  sys.remove_row(i, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(dimension_type first, dimension_type last,
+                              bool keep_sorted) {
+  sys.remove_rows(first, last, keep_sorted);
+}
+
+inline void
+Generator_System::remove_rows(const std::vector<dimension_type>& indexes) {
+  sys.remove_rows(indexes);
+}
+
+inline void
+Generator_System::remove_trailing_rows(dimension_type n) {
+  sys.remove_trailing_rows(n);
+}
+
+inline dimension_type
+Generator_System::gauss(dimension_type n_lines_or_equalities) {
+  return sys.gauss(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::back_substitute(dimension_type n_lines_or_equalities) {
+  sys.back_substitute(n_lines_or_equalities);
+}
+
+inline void
+Generator_System::strong_normalize() {
+  sys.strong_normalize();
+}
+
+inline void
+Generator_System::merge_rows_assign(const Generator_System& y) {
+  sys.merge_rows_assign(y.sys);
+}
+
+inline void
+Generator_System::insert(const Generator_System& y) {
+  sys.insert(y.sys);
+}
+
+inline void
+Generator_System::insert_pending(const Generator_System& r) {
+  sys.insert_pending(r.sys);
+}
+
+inline bool
+operator==(const Generator_System& x, const Generator_System& y) {
+  return x.sys == y.sys;
+}
+
+inline bool
+operator!=(const Generator_System& x, const Generator_System& y) {
+  return !(x == y);
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator()
+  : i(), gsp(0) {
+}
+
+inline
+Generator_System_const_iterator::Generator_System_const_iterator(const Generator_System_const_iterator& y)
+  : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System_const_iterator::~Generator_System_const_iterator() {
+}
+
+inline
+Generator_System_const_iterator&
+Generator_System_const_iterator::operator=(const Generator_System_const_iterator& y) {
+  i = y.i;
+  gsp = y.gsp;
+  return *this;
+}
+
+inline const Generator&
+Generator_System_const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Generator*
+Generator_System_const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Generator_System_const_iterator&
+Generator_System_const_iterator::operator++() {
+  ++i;
+  if (!gsp->is_necessarily_closed())
+    skip_forward();
+  return *this;
+}
+
+inline Generator_System_const_iterator
+Generator_System_const_iterator::operator++(int) {
+  const Generator_System_const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Generator_System_const_iterator::operator==(const Generator_System_const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Generator_System_const_iterator::operator!=(const Generator_System_const_iterator& y) const {
+  return i != y.i;
+}
+
+inline
+Generator_System_const_iterator::
+Generator_System_const_iterator(const Linear_System<Generator>::const_iterator& iter,
+                                const Generator_System& gs)
+  : i(iter), gsp(&gs.sys) {
+}
+
+inline bool
+Generator_System::empty() const {
+  return sys.has_no_rows();
+}
+
+inline bool
+Generator_System::has_no_rows() const {
+  return sys.has_no_rows();
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+  const_iterator i(sys.begin(), *this);
+  if (!sys.is_necessarily_closed())
+    i.skip_forward();
+  return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+  const const_iterator i(sys.end(), *this);
+  return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+  PPL_ASSERT(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
+}
+
+inline void
+Generator_System::m_swap(Generator_System& y) {
+  swap(sys, y.sys);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+  return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline void
+Generator_System::simplify() {
+  sys.simplify();
+  remove_invalid_lines_and_rays();
+}
+
+/*! \relates Generator_System */
+inline void
+swap(Generator_System& x, Generator_System& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_defs.hh line 1. */
+/* Poly_Gen_Relation class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_defs.hh line 29. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! True if and only if \p x and \p y are logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! True if and only if \p x and \p y are not logically equivalent.
+/*! \relates Poly_Gen_Relation */
+bool operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+//! Yields the logical conjunction of \p x and \p y.
+/*! \relates Poly_Gen_Relation */
+Poly_Gen_Relation operator&&(const Poly_Gen_Relation& x,
+                             const Poly_Gen_Relation& y);
+
+/*! \brief
+  Yields the assertion with all the conjuncts of \p x
+  that are not in \p y.
+
+  \relates Poly_Gen_Relation
+*/
+Poly_Gen_Relation operator-(const Poly_Gen_Relation& x,
+                            const Poly_Gen_Relation& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Poly_Gen_Relation */
+std::ostream& operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The relation between a polyhedron and a generator
+/*! \ingroup PPL_CXX_interface
+  This class implements conjunctions of assertions on the relation
+  between a polyhedron and a generator.
+*/
+class Parma_Polyhedra_Library::Poly_Gen_Relation {
+private:
+  //! Poly_Gen_Relation is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t NOTHING  = 0U;
+  static const flags_t SUBSUMES = 1U << 0;
+  //@} // Bit-masks for the individual assertions
+
+  //! All assertions together.
+  static const flags_t EVERYTHING
+  = SUBSUMES;
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! True if and only if the conjunction \p x implies the conjunction \p y.
+  static bool implies(flags_t x, flags_t y);
+
+  //! Construct from a bit-mask.
+  Poly_Gen_Relation(flags_t mask);
+
+  friend bool
+  operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+  friend bool
+  operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend Poly_Gen_Relation
+  operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::
+  IO_Operators::operator<<(std::ostream& s, const Poly_Gen_Relation& r);
+
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Access the internal flags: this is needed for some language
+    interfaces.
+  */
+#endif
+  flags_t get_flags() const;
+
+public:
+  //! The assertion that says nothing.
+  static Poly_Gen_Relation nothing();
+
+  //! Adding the generator would not change the polyhedron.
+  static Poly_Gen_Relation subsumes();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! True if and only if \p *this implies \p y.
+  bool implies(const Poly_Gen_Relation& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_inlines.hh line 1. */
+/* Poly_Gen_Relation class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Poly_Gen_Relation::Poly_Gen_Relation(flags_t mask)
+  : flags(mask) {
+}
+
+inline Poly_Gen_Relation::flags_t
+Poly_Gen_Relation::get_flags() const {
+  return flags;
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::nothing() {
+  return Poly_Gen_Relation(NOTHING);
+}
+
+inline Poly_Gen_Relation
+Poly_Gen_Relation::subsumes() {
+  return Poly_Gen_Relation(SUBSUMES);
+}
+
+inline bool
+Poly_Gen_Relation::implies(flags_t x, flags_t y) {
+  return (x & y) == y;
+}
+
+inline bool
+Poly_Gen_Relation::implies(const Poly_Gen_Relation& y) const {
+  return implies(flags, y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator==(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags == y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline bool
+operator!=(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return x.flags != y.flags;
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator&&(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags | y.flags);
+}
+
+/*! \relates Poly_Gen_Relation */
+inline Poly_Gen_Relation
+operator-(const Poly_Gen_Relation& x, const Poly_Gen_Relation& y) {
+  return Poly_Gen_Relation(x.flags & ~y.flags);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Poly_Gen_Relation_defs.hh line 138. */
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 1. */
+/* Polyhedron class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class H79_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 51. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Polyhedron
+  Writes a textual representation of \p ph on \p s:
+  <CODE>false</CODE> is written if \p ph is an empty polyhedron;
+  <CODE>true</CODE> is written if \p ph is a universe polyhedron;
+  a minimized system of constraints defining \p ph is written otherwise,
+  all constraints in one row separated by ", ".
+*/
+std::ostream&
+operator<<(std::ostream& s, const Polyhedron& ph);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Polyhedron */
+void swap(Polyhedron& x, Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are the same polyhedron.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if
+  \p x and \p y are different polyhedra.
+
+  \relates Polyhedron
+  Note that \p x and \p y may be topology- and/or dimension-incompatible
+  polyhedra: in those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Polyhedron& x, const Polyhedron& y);
+
+namespace Interfaces {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Returns \c true if and only if
+  <code>ph.topology() == NECESSARILY_CLOSED</code>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+bool is_necessarily_closed_for_interfaces(const Polyhedron& ph);
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The base class for convex polyhedra.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Polyhedron represents a convex polyhedron
+  in the vector space \f$\Rset^n\f$.
+
+  A polyhedron can be specified as either a finite system of constraints
+  or a finite system of generators (see Section \ref representation)
+  and it is always possible to obtain either representation.
+  That is, if we know the system of constraints, we can obtain
+  from this the system of generators that define the same polyhedron
+  and vice versa.
+  These systems can contain redundant members: in this case we say
+  that they are not in the minimal form.
+
+  Two key attributes of any polyhedron are its topological kind
+  (recording whether it is a C_Polyhedron or an NNC_Polyhedron object)
+  and its space dimension (the dimension \f$n \in \Nset\f$ of
+  the enclosing vector space):
+
+  - all polyhedra, the empty ones included, are endowed with
+    a specific topology and space dimension;
+  - most operations working on a polyhedron and another object
+    (i.e., another polyhedron, a constraint or generator,
+    a set of variables, etc.) will throw an exception if
+    the polyhedron and the object are not both topology-compatible
+    and dimension-compatible (see Section \ref representation);
+  - the topology of a polyhedron cannot be changed;
+    rather, there are constructors for each of the two derived classes
+    that will build a new polyhedron with the topology of that class
+    from another polyhedron from either class and any topology;
+  - the only ways in which the space dimension of a polyhedron can
+    be changed are:
+    - <EM>explicit</EM> calls to operators provided for that purpose;
+    - standard copy, assignment and swap operators.
+
+  Note that four different polyhedra can be defined on
+  the zero-dimension space:
+  the empty polyhedron, either closed or NNC,
+  and the universe polyhedron \f$R^0\f$, again either closed or NNC.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a polyhedron corresponding to
+  a square in \f$\Rset^2\f$, given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  cs.insert(y >= 0);
+  cs.insert(y <= 3);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from a system of generators specifying
+  the four vertices of the square:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds an unbounded polyhedron
+  corresponding to a half-strip in \f$\Rset^2\f$,
+  given as a system of constraints:
+  \code
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x - y <= 0);
+  cs.insert(x - y + 1 >= 0);
+  C_Polyhedron ph(cs);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the system of generators specifying
+  the two vertices of the polyhedron and one ray:
+  \code
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + y));
+  gs.insert(ray(x - y));
+  C_Polyhedron ph(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds the polyhedron corresponding to
+  a half-plane by adding a single constraint
+  to the universe polyhedron in \f$\Rset^2\f$:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(y >= 0);
+  \endcode
+  The following code builds the same polyhedron as above,
+  but starting from the empty polyhedron in the space \f$\Rset^2\f$
+  and inserting the appropriate generators
+  (a point, a ray and a line).
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(ray(y));
+  ph.add_generator(line(x));
+  \endcode
+  Note that, although the above polyhedron has no vertices, we must add
+  one point, because otherwise the result of the Minkowski's sum
+  would be an empty polyhedron.
+  To avoid subtle errors related to the minimization process,
+  it is required that the first generator inserted in an empty
+  polyhedron is a point (otherwise, an exception is thrown).
+
+  \par Example 4
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe polyhedron in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality constraint,
+  thus obtaining the polyhedron corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting polyhedron is
+  \f[
+    \bigl\{\,
+      (2, y)^\transpose \in \Rset^2
+    \bigm|
+      y \in \Rset
+    \,\bigr\}.
+  \f]
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  C_Polyhedron ph(1);
+  ph.add_constraint(x == 2);
+  ph.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting polyhedron is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(0*x + 0*y));
+  ph.add_generator(point(0*x + 3*y));
+  ph.add_generator(point(3*x + 0*y));
+  ph.add_generator(point(3*x + 3*y));
+  Linear_Expression expr = x + 4;
+  ph.affine_image(x, expr);
+  \endcode
+  In this example the starting polyhedron is a square in
+  \f$\Rset^2\f$, the considered variable is \f$x\f$ and the affine
+  expression is \f$x+4\f$.  The resulting polyhedron is the same
+  square translated to the right.  Moreover, if the affine
+  transformation for the same variable \p x is \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a diagonal of the square.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y >= 0);
+  ph.add_constraint(y <= 3);
+  Linear_Expression expr = x + 4;
+  ph.affine_preimage(x, expr);
+  \endcode
+  In this example the starting polyhedron, \p var and the affine
+  expression and the denominator are the same as in Example 6,
+  while the resulting polyhedron is again the same square,
+  but translated to the left.
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting polyhedron is a parallelogram with the height equal to
+  the side of the square and the oblique sides parallel to the line
+  \f$x+y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting polyhedron is a line that corresponds to the \f$y\f$ axis.
+
+  \par Example 8
+  For this example we use also the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Generator_System gs;
+  gs.insert(point(3*x + y + 0*z + 2*w));
+  C_Polyhedron ph(gs);
+  Variables_Set vars;
+  vars.insert(y);
+  vars.insert(z);
+  ph.remove_space_dimensions(vars);
+  \endcode
+  The starting polyhedron is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting polyhedron is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> vars1;
+  vars1.insert(y);
+  ph.remove_space_dimensions(vars1);
+  set<Variable> vars2;
+  vars2.insert(z);
+  ph.remove_space_dimensions(vars2);
+  \endcode
+  In this case, the result is the polyhedron
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p vars2
+  we are actually removing variable \f$w\f$ of the original polyhedron.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Polyhedron {
+public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
+
+  //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns \c true indicating that this domain has methods that
+    can recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
+protected:
+  //! Builds a polyhedron having the specified properties.
+  /*!
+    \param topol
+    The topology of the polyhedron;
+
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the polyhedron;
+
+    \param kind
+    Specifies whether the universe or the empty polyhedron has to be built.
+  */
+  Polyhedron(Topology topol,
+             dimension_type num_dimensions,
+             Degenerate_Element kind);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Polyhedron(const Polyhedron& y,
+             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, const Constraint_System& cs);
+
+  //! Builds a polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p cs is incompatible with \p topol.
+  */
+  Polyhedron(Topology topol, Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, const Generator_System& gs);
+
+  //! Builds a polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the topology of \p gs is incompatible with \p topol,
+    or if the system of generators is not empty but has no points.
+  */
+  Polyhedron(Topology topol, Generator_System& gs, Recycle_Input dummy);
+
+  //! Builds a polyhedron from a box.
+  /*!
+    This will use an algorithm whose complexity is polynomial and build
+    the smallest polyhedron with topology \p topol containing \p box.
+
+    \param topol
+    The topology of the polyhedron;
+
+    \param box
+    The box representing the polyhedron to be built;
+
+    \param complexity
+    This argument is ignored.
+  */
+  template <typename Interval>
+  Polyhedron(Topology topol, const Box<Interval>& box,
+             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Polyhedron& operator=(const Polyhedron& y);
+
+public:
+  //! \name Member Functions that Do Not Modify the Polyhedron
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints.
+  const Constraint_System& constraints() const;
+
+  //! Returns the system of constraints, with no redundant constraint.
+  const Constraint_System& minimized_constraints() const;
+
+  //! Returns the system of generators.
+  const Generator_System& generators() const;
+
+  //! Returns the system of generators, with no redundant generator.
+  const Generator_System& minimized_generators() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a system of (equality) congruences satisfied by \p *this,
+    with no redundant congruences and having the same affine dimension
+    as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns the relations holding between the polyhedron \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty polyhedron.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a universe polyhedron.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded polyhedron.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Polyhedron& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Polyhedron
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Polyhedron
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param c
+    The constraint that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of generator \p g to the system of generators
+    of \p *this (without minimizing the result).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are topology-incompatible or
+    dimension-incompatible, or if \p *this is an empty polyhedron and
+    \p g is not a point.
+  */
+  void add_generator(const Generator& g);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to \p *this,
+    if \p cg can be exactly represented by a polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    of if \p cg is a proper congruence which is neither a tautology,
+    nor a contradiction.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the system
+    of constraints of \p *this (without minimizing the result).
+
+    \param cs
+    Contains the constraints that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this (without minimizing the result).
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system
+    of generators of \p *this (without minimizing the result).
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+  */
+  void add_generators(const Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators
+    of \p *this (without minimizing the result).
+
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are topology-incompatible or
+    dimension-incompatible, or if \p *this is empty and the system of
+    generators \p gs is not empty, but has no points.
+
+    \warning
+    The only assumption that can be made on \p gs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_generators(Generator_System& gs);
+
+  /*! \brief
+    Adds a copy of the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds the congruences in \p cgs to \p *this,
+    if all the congruences can be exactly represented by a polyhedron.
+
+    \param cgs
+    The congruences to be added. Its elements may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    of if there exists in \p cgs a proper congruence which is
+    neither a tautology, nor a contradiction
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine \p *this.
+
+    \param cs
+    Contains the constraints used to refine the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine \p *this.
+
+    \param cgs
+    Contains the congruences used to refine the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Refines \p *this with the constraint expressed by \p left \f$<\f$
+    \p right if \p is_strict is set, with the constraint \p left \f$\leq\f$
+    \p right otherwise.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is on the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is on the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param is_strict
+    True if the comparison is strict.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void refine_with_linear_form_inequality(
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+  bool is_strict = false);
+
+  /*! \brief
+    Refines \p *this with the constraint expressed by \p left \f$\relsym\f$
+    \p right, where \f$\relsym\f$ is the relation symbol specified by
+    \p relsym..
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is on the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is on the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param relsym
+    The relation symbol.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    \exception std::runtime_error
+    Thrown if \p relsym is not a valid relation symbol.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void generalized_refine_with_linear_form_inequality(
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+  Relation_Symbol relsym);
+
+  //! Refines \p store with the constraints defining \p *this.
+  /*!
+    \param store
+    The interval floating point abstract store to refine.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void refine_fp_interval_abstract_store(
+       Box< Interval<FP_Format, Interval_Info> >& store)
+       const;
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void intersection_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the poly-hull of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_hull_assign(const Polyhedron& y);
+
+  //! Same as poly_hull_assign(y).
+  void upper_bound_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this
+    the \ref Convex_Polyhedral_Difference "poly-difference"
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void poly_difference_assign(const Polyhedron& y);
+
+  //! Same as poly_difference_assign(y).
+  void difference_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a polyhedron, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If constraints are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of constraints)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+             + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    In other words, if \f$R\f$ is a \f$m_1 \times n\f$ matrix representing
+    the rays of the polyhedron, \f$V\f$ is a \f$m_2 \times n\f$
+    matrix representing the points of the polyhedron and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            \vect{x} = \vect{\lambda} R + \vect{\mu} V,
+            \vect{\lambda} \in \Rset^{m_1}_+,
+            \vect{\mu} \in \Rset^{m_2}_+,
+            \sum_{i = 0}^{m_2 - 1} \mu_i = 1
+          \,\bigr\}
+    \f]
+    and \f$T\f$ is the affine transformation to apply to \f$P\f$, then
+    the resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             (x_0, \ldots, T(x_0, \ldots, x_{n-1}),
+                     \ldots, x_{n-1})^\mathrm{T}
+           \bigm|
+             (x_0, \ldots, x_{n-1})^\mathrm{T} \in P
+           \,\bigr\}.
+    \f]
+
+    Affine transformations are, for example:
+    - translations
+    - rotations
+    - symmetries.
+    \endif
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*!
+    Assigns to \p *this the
+    \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point boundaries that
+    defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var is
+    not a space dimension of \p *this.
+
+    This function is used in abstract interpretation to model an assignment
+    of a value that is correctly overapproximated by \p lf to the
+    floating point variable represented by \p var.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void affine_form_image(Variable var,
+  const Linear_Form<Interval <FP_Format, Interval_Info> >& lf);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering constraints of a polyhedron, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only constraints remain
+    up-to-date.
+
+    In other words, if \f$A\f$ is a \f$m \times n\f$ matrix representing
+    the constraints of the polyhedron, \f$T\f$ is the affine transformation
+    to apply to \f$P\f$ and
+    \f[
+      P = \bigl\{\,
+            \vect{x} = (x_0, \ldots, x_{n-1})^\mathrm{T}
+          \bigm|
+            A\vect{x} \geq \vect{0}
+          \,\bigr\}.
+    \f]
+    The resulting polyhedron is
+    \f[
+      P' = \bigl\{\,
+             \vect{x} = (x_0, \ldots, x_{n-1}))^\mathrm{T}
+           \bigm|
+             A'\vect{x} \geq \vect{0}
+           \,\bigr\},
+    \f]
+    where \f$A'\f$ is defined as follows:
+    \f[
+      {a'}_{ij}
+        = \begin{cases}
+            a_{ij} * \mathrm{denominator} + a_{i\mathrm{var}}*\mathrm{expr}[j]
+              \quad \mathrm{for } j \neq \mathrm{var}; \\
+            \mathrm{expr}[\mathrm{var}] * a_{i\mathrm{var}},
+              \quad \text{for } j = \mathrm{var}.
+          \end{cases}
+    \f]
+    \endif
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void time_elapse_assign(const Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this (the best approximation of) the result of
+    computing the
+    \ref Positive_Time_Elapse_Operator "positive time-elapse"
+    between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign(const Polyhedron& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHRZ03_widening "BHRZ03-widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void BHRZ03_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref limited_extrapolation "limited extrapolation"
+    between \p *this and \p y using the \ref BHRZ03_widening
+    "BHRZ03-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_BHRZ03_extrapolation_assign(const Polyhedron& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref bounded_extrapolation "bounded extrapolation"
+    between \p *this and \p y using the \ref BHRZ03_widening
+    "BHRZ03-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79_widening" between \p *this and \p y.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  void H79_widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const Polyhedron& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref limited_extrapolation "limited extrapolation"
+    between \p *this and \p y using the \ref H79_widening
+    "H79-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const Polyhedron& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref bounded_extrapolation "bounded extrapolation"
+    between \p *this and \p y using the \ref H79_widening
+    "H79-widening" operator.
+
+    \param y
+    A polyhedron that <EM>must</EM> be contained in \p *this;
+
+    \param cs
+    The system of constraints used to improve the widened polyhedron;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void bounded_H79_extrapolation_assign(const Polyhedron& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old polyhedron
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are not constrained.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions to the polyhedron
+    and does not embed it in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new polyhedron, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the polyhedron \f$\cP \sseq \Rset^2\f$
+    and adding a third space dimension, the result will be the polyhedron
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cP
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Polyhedron& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that
+    the resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each space dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the polyhedron.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Polyhedron();
+
+  /*! \brief
+    Swaps \p *this with polyhedron \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible.
+  */
+  void m_swap(Polyhedron& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+  static const Representation default_con_sys_repr = DENSE;
+  static const Representation default_gen_sys_repr = DENSE;
+
+  //! The system of constraints.
+  Constraint_System con_sys;
+
+  //! The system of generators.
+  Generator_System gen_sys;
+
+  //! The saturation matrix having constraints on its columns.
+  Bit_Matrix sat_c;
+
+  //! The saturation matrix having generators on its columns.
+  Bit_Matrix sat_g;
+
+#define PPL_IN_Polyhedron_CLASS
+/* Automatically generated from PPL source file ../src/Ph_Status_idefs.hh line 1. */
+/* Polyhedron::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Polyhedron_CLASS
+#error "Do not include Ph_Status_idefs.hh directly; use Polyhedron_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a polyhedron.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>constraints pending</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, which is
+    split in two non-empty subsets: the already processed constraints,
+    which are in minimal form, and the pending constraints, which
+    still have to be processed and may thus be inconsistent or
+    contain redundancies;
+  - <EM>generators pending</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, which is
+    split in two non-empty subsets: the already processed generators,
+    which are in minimal form, and the pending generators, which still
+    have to be processed and may thus contain redundancies;
+  - <EM>constraints up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of constraints, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the polyhedron is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending constraints;
+  - <EM>constraints minimized</EM>: the non-pending part of the system
+    of constraints attached to the polyhedron is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the polyhedron is in minimal form;
+  - <EM>constraints' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending generators and
+    columns indexed by non-pending constraints correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+  - <EM>generators' saturation matrix up-to-date</EM>: the attached
+    saturation matrix having rows indexed by non-pending constraints and
+    columns indexed by non-pending generators correctly expresses
+    the saturation relation between the attached non-pending constraints
+    and generators;
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>constraints pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>constraints pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>constraints minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>constraints minimized</EM> implies <EM>constraints up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>constraints' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>constraints up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bit-masks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 2043. */
+#undef PPL_IN_Polyhedron_CLASS
+
+  //! The status flags to keep track of the polyhedron's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  //! Returns the topological kind of the polyhedron.
+  Topology topology() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the polyhedron
+    is necessarily closed.
+  */
+  bool is_necessarily_closed() const;
+
+  friend bool
+  Parma_Polyhedra_Library::Interfaces
+  ::is_necessarily_closed_for_interfaces(const Polyhedron&);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of constraints
+    of \p *this.
+
+    \param c The constraint to be added. If it is dimension-incompatible
+    with \p *this, the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the polyhedron is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is up-to-date.
+  bool constraints_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of constraints is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant constraints.
+  */
+  bool constraints_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  /*!
+    Note that only \em weak minimization is entailed, so that
+    an NNC polyhedron may still have \f$\epsilon\f$-redundant generators.
+  */
+  bool generators_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if there are pending constraints.
+  bool has_pending_constraints() const;
+
+  //! Returns <CODE>true</CODE> if there are pending generators.
+  bool has_pending_generators() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if there are
+    either pending constraints or pending generators.
+  */
+  bool has_something_pending() const;
+
+  //! Returns <CODE>true</CODE> if the polyhedron can have something pending.
+  bool can_have_something_pending() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_c
+    is up-to-date.
+  */
+  bool sat_c_is_up_to_date() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the saturation matrix \p sat_g
+    is up-to-date.
+  */
+  bool sat_g_is_up_to_date() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the polyhedron is empty,
+    clearing all corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that constraints are up-to-date.
+  void set_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are minimized.
+  void set_constraints_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //! Sets \p status to express that constraints are pending.
+  void set_constraints_pending();
+
+  //! Sets \p status to express that generators are pending.
+  void set_generators_pending();
+
+  //! Sets \p status to express that \p sat_c is up-to-date.
+  void set_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is up-to-date.
+  void set_sat_g_up_to_date();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the polyhedron is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that constraints are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_constraints_up_to_date();
+
+  //! Sets \p status to express that generators are no longer up-to-date.
+  /*!
+    This also implies that they are neither minimized
+    and both saturation matrices are no longer meaningful.
+  */
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that constraints are no longer minimized.
+  void clear_constraints_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //! Sets \p status to express that there are no longer pending constraints.
+  void clear_pending_constraints();
+
+  //! Sets \p status to express that there are no longer pending generators.
+  void clear_pending_generators();
+
+  //! Sets \p status to express that \p sat_c is no longer up-to-date.
+  void clear_sat_c_up_to_date();
+
+  //! Sets \p status to express that \p sat_g is no longer up-to-date.
+  void clear_sat_g_up_to_date();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name The Handling of Pending Rows
+  //@{
+
+  /*! \brief
+    Processes the pending rows of either description of the polyhedron
+    and obtains a minimized polyhedron.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool process_pending() const;
+
+  //! Processes the pending constraints and obtains a minimized polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some pending constraints.
+  */
+  bool process_pending_constraints() const;
+
+  //! Processes the pending generators and obtains a minimized polyhedron.
+  /*!
+    It is assumed that the polyhedron does have some pending generators.
+  */
+  void process_pending_generators() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a constraint system without pending rows.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  void remove_pending_to_obtain_constraints() const;
+
+  /*! \brief
+    Lazily integrates the pending descriptions of the polyhedron
+    to obtain a generator system without pending rows.
+
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    It is assumed that the polyhedron does have some constraints or
+    generators pending.
+  */
+  bool remove_pending_to_obtain_generators() const;
+
+  //@} // The Handling of Pending Rows
+
+  //! \name Updating and Sorting Matrices
+  //@{
+
+  //! Updates constraints starting from generators and minimizes them.
+  /*!
+    The resulting system of constraints is only partially sorted:
+    the equalities are in the upper part of the matrix,
+    while the inequalities in the lower part.
+  */
+  void update_constraints() const;
+
+  //! Updates generators starting from constraints and minimizes them.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    The resulting system of generators is only partially sorted:
+    the lines are in the upper part of the matrix,
+    while rays and points are in the lower part.
+    It is illegal to call this method when the Status field
+    already declares the polyhedron to be empty.
+  */
+  bool update_generators() const;
+
+  //! Updates \p sat_c using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_c to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_c[i][j] = 0,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] = 0; \\
+        sat\_c[i][j] = 1,
+          \quad \text{if } G[i] \cdot C^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_c() const;
+
+  //! Updates \p sat_g using the updated constraints and generators.
+  /*!
+    It is assumed that constraints and generators are up-to-date
+    and minimized and that the Status field does not already flag
+    \p sat_g to be up-to-date.
+    The values of the saturation matrix are computed as follows:
+    \f[
+      \begin{cases}
+        sat\_g[i][j] = 0,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] = 0; \\
+        sat\_g[i][j] = 1,
+          \quad \text{if } C[i] \cdot G^\mathrm{T}[j] > 0.
+      \end{cases}
+    \f]
+  */
+  void update_sat_g() const;
+
+  //! Sorts the matrix of constraints keeping status consistency.
+  /*!
+    It is assumed that constraints are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_g is kept consistent with the sorted matrix
+    of constraints.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints() const;
+
+  //! Sorts the matrix of generators keeping status consistency.
+  /*!
+    It is assumed that generators are up-to-date.
+    If at least one of the saturation matrices is up-to-date,
+    then \p sat_c is kept consistent with the sorted matrix
+    of generators.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators() const;
+
+  //! Sorts the matrix of constraints and updates \p sat_c.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the constraints does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_constraints_with_sat_c() const;
+
+  //! Sorts the matrix of generators and updates \p sat_g.
+  /*!
+    It is assumed that both constraints and generators
+    are up-to-date and minimized.
+    The method is declared \p const because reordering
+    the generators does not modify the polyhedron
+    from a \e logical point of view.
+  */
+  void obtain_sorted_generators_with_sat_g() const;
+
+  //@} // Updating and Sorting Matrices
+
+  //! \name Weak and Strong Minimization of Descriptions
+  //@{
+
+  //! Applies (weak) minimization to both the constraints and generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+
+    Minimization is not attempted if the Status field already declares
+    both systems to be minimized.
+  */
+  bool minimize() const;
+
+  //! Applies strong minimization to the constraints of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_constraints() const;
+
+  //! Applies strong minimization to the generators of an NNC polyhedron.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty polyhedron.
+  */
+  bool strongly_minimize_generators() const;
+
+  //! If constraints are up-to-date, obtain a simplified copy of them.
+  Constraint_System simplified_constraints() const;
+
+  //@} // Weak and Strong Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between polyhedra.
+  Three_Valued_Boolean quick_equivalence_test(const Polyhedron& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Polyhedron& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  /*! \brief
+    Copies to \p cs_selection the constraints of \p y corresponding
+    to the definition of the CH78-widening of \p *this and \p y.
+  */
+  void select_CH78_constraints(const Polyhedron& y,
+                               Constraint_System& cs_selection) const;
+
+  /*! \brief
+    Splits the constraints of `x' into two subsets, depending on whether
+    or not they are selected to compute the \ref H79_widening "H79-widening"
+    of \p *this and \p y.
+  */
+  void select_H79_constraints(const Polyhedron& y,
+                              Constraint_System& cs_selected,
+                              Constraint_System& cs_not_selected) const;
+
+  bool BHRZ03_combining_constraints(const Polyhedron& y,
+                                    const BHRZ03_Certificate& y_cert,
+                                    const Polyhedron& H79,
+                                    const Constraint_System& x_minus_H79_cs);
+
+  bool BHRZ03_evolving_points(const Polyhedron& y,
+                              const BHRZ03_Certificate& y_cert,
+                              const Polyhedron& H79);
+
+  bool BHRZ03_evolving_rays(const Polyhedron& y,
+                            const BHRZ03_Certificate& y_cert,
+                            const Polyhedron& H79);
+
+  static void modify_according_to_evolution(Linear_Expression& ray,
+                                            const Linear_Expression& x,
+                                            const Linear_Expression& y);
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given linear systems.
+  /*!
+    \param sys1
+    The linear system to which columns are added;
+
+    \param sys2
+    The linear system to which rows and columns are added;
+
+    \param sat1
+    The saturation matrix whose columns are indexed by the rows of
+    \p sys1. On entry it is up-to-date;
+
+    \param sat2
+    The saturation matrix whose columns are indexed by the rows of \p
+    sys2;
+
+    \param add_dim
+    The number of space dimensions to add.
+
+    Adds new space dimensions to the vector space modifying the linear
+    systems and saturation matrices.
+    This function is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE> and
+    <CODE>add_space_dimensions_and_project()</CODE>, passing the
+    linear system of constraints and that of generators (and the
+    corresponding saturation matrices) in different order (see those
+    methods for details).
+  */
+  template <typename Linear_System1, typename Linear_System2>
+  static void add_space_dimensions(Linear_System1& sys1,
+                                   Linear_System2& sys2,
+                                   Bit_Matrix& sat1,
+                                   Bit_Matrix& sat2,
+                                   dimension_type add_dim);
+
+  //! \name Minimization-Related Static Member Functions
+  //@{
+
+  //! Builds and simplifies constraints from generators (or vice versa).
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  template <typename Source_Linear_System, typename Dest_Linear_System>
+  static bool minimize(bool con_to_gen,
+                       Source_Linear_System& source,
+                       Dest_Linear_System& dest,
+                       Bit_Matrix& sat);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  template <typename Source_Linear_System1, typename Source_Linear_System2,
+            typename Dest_Linear_System>
+  static bool add_and_minimize(bool con_to_gen,
+                               Source_Linear_System1& source1,
+                               Dest_Linear_System& dest,
+                               Bit_Matrix& sat,
+                               const Source_Linear_System2& source2);
+
+  /*! \brief
+    Adds given constraints and builds minimized corresponding generators
+    or vice versa. The given constraints are in \p source.
+  */
+  // Detailed Doxygen comment to be found in file minimize.cc.
+  template <typename Source_Linear_System, typename Dest_Linear_System>
+  static bool add_and_minimize(bool con_to_gen,
+                               Source_Linear_System& source,
+                               Dest_Linear_System& dest,
+                               Bit_Matrix& sat);
+
+  //! Performs the conversion from constraints to generators and vice versa.
+  // Detailed Doxygen comment to be found in file conversion.cc.
+  template <typename Source_Linear_System, typename Dest_Linear_System>
+  static dimension_type conversion(Source_Linear_System& source,
+                                   dimension_type start,
+                                   Dest_Linear_System& dest,
+                                   Bit_Matrix& sat,
+                                   dimension_type num_lines_or_equalities);
+
+  /*! \brief
+    Uses Gauss' elimination method to simplify the result of
+    <CODE>conversion()</CODE>.
+  */
+  // Detailed Doxygen comment to be found in file simplify.cc.
+  template <typename Linear_System1>
+  static dimension_type simplify(Linear_System1& sys, Bit_Matrix& sat);
+
+  //@} // Minimization-Related Static Member Functions
+
+  /*! \brief
+    Pointer to an array used by simplify().
+
+    Holds (between class initialization and finalization) a pointer to
+    an array, allocated with operator new[](), of
+    simplify_num_saturators_size elements.
+  */
+  static dimension_type* simplify_num_saturators_p;
+
+  /*! \brief
+    Dimension of an array used by simplify().
+
+    Holds (between class initialization and finalization) the size of the
+    array pointed to by simplify_num_saturators_p.
+  */
+  static size_t simplify_num_saturators_size;
+
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+  template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename T> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  friend class Parma_Polyhedra_Library::Grid;
+  friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+  friend class Parma_Polyhedra_Library::H79_Certificate;
+
+protected:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and \c true is returned, otherwise \c false is returned.
+
+    Current implementation is based on (a variant of) Algorithm 8.1 in
+      A. Bemporad, K. Fukuda, and F. D. Torrisi
+      <em>Convexity Recognition of the Union of Polyhedra</em>
+      Technical Report AUT00-13, ETH Zurich, 2000
+
+    \note
+    It is assumed that \p *this and \p y are topologically closed
+    and dimension-compatible;
+    if the assumption does not hold, the behavior is undefined.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool BFT00_poly_hull_assign_if_exact(const Polyhedron& y);
+
+  bool BHZ09_poly_hull_assign_if_exact(const Polyhedron& y);
+  bool BHZ09_C_poly_hull_assign_if_exact(const Polyhedron& y);
+  bool BHZ09_NNC_poly_hull_assign_if_exact(const Polyhedron& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \name Exception Throwers
+  //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+  void throw_invalid_argument(const char* method, const char* reason) const;
+
+  void throw_topology_incompatible(const char* method,
+                                   const char* ph_name,
+                                   const Polyhedron& ph) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* c_name,
+                                   const Constraint& c) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* g_name,
+                                   const Generator& g) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* cs_name,
+                                   const Constraint_System& cs) const;
+  void throw_topology_incompatible(const char* method,
+                                   const char* gs_name,
+                                   const Generator_System& gs) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* other_name,
+                                    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* ph_name,
+                                    const Polyhedron& ph) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* c_name,
+                                    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* g_name,
+                                    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cg_name,
+                                    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cs_name,
+                                    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* gs_name,
+                                    const Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cgs_name,
+                                    const Congruence_System& cgs) const;
+  template <typename C>
+  void throw_dimension_incompatible(const char* method,
+                                    const char* lf_name,
+                                    const Linear_Form<C>& lf) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* var_name,
+                                    Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_space_dim) const;
+
+  // Note: the following three methods need to be static, because they
+  // can be called inside constructors (before actually constructing the
+  // polyhedron object).
+  static dimension_type
+  check_space_dimension_overflow(dimension_type dim, dimension_type max,
+                                 const Topology topol,
+                                 const char* method, const char* reason);
+
+  static dimension_type
+  check_space_dimension_overflow(dimension_type dim, const Topology topol,
+                                 const char* method, const char* reason);
+
+  template <typename Object>
+  static Object&
+  check_obj_space_dimension_overflow(Object& input, Topology topol,
+                                     const char* method, const char* reason);
+
+  void throw_invalid_generator(const char* method,
+                               const char* g_name) const;
+
+  void throw_invalid_generators(const char* method,
+                                const char* gs_name) const;
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p *vars_p.
+
+    \param vars_p
+    When nonzero, points with non-integer coordinates for the
+    variables/space-dimensions contained in \p *vars_p can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set* vars_p,
+                                    Complexity_Class complexity);
+
+  //! Helper function that overapproximates an interval linear form.
+  /*!
+    \param lf
+    The linear form on intervals with floating point boundaries to approximate.
+    ALL of its coefficients MUST be bounded.
+
+    \param lf_dimension
+    Must be the space dimension of \p lf.
+
+    \param result
+    Used to store the result.
+
+    This function makes \p result become a linear form that is a correct
+    approximation of \p lf under the constraints specified by \p *this.
+    The resulting linear form has the property that all of its variable
+    coefficients have a non-significant upper bound and can thus be
+    considered as singletons.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  void overapproximate_linear_form(
+  const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+  const dimension_type lf_dimension,
+  Linear_Form<Interval <FP_Format, Interval_Info> >& result);
+
+  /*! \brief
+    Helper function that makes \p result become a Linear_Expression obtained
+    by normalizing the denominators in \p lf.
+
+    \param lf
+    The linear form on intervals with floating point boundaries to normalize.
+    It should be the result of an application of static method
+    <CODE>overapproximate_linear_form</CODE>.
+
+    \param lf_dimension
+    Must be the space dimension of \p lf.
+
+    \param result
+    Used to store the result.
+
+    This function ignores the upper bound of intervals in \p lf,
+    so that in fact \p result can be seen as \p lf multiplied by a proper
+    normalization constant.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  static void convert_to_integer_expression(
+              const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+              const dimension_type lf_dimension,
+              Linear_Expression& result);
+
+  //! Normalization helper function.
+  /*!
+    \param lf
+    The linear form on intervals with floating point boundaries to normalize.
+    It should be the result of an application of static method
+    <CODE>overapproximate_linear_form</CODE>.
+
+    \param lf_dimension
+    Must be the space dimension of \p lf.
+
+    \param res
+    Stores the normalized linear form, except its inhomogeneous term.
+
+    \param res_low_coeff
+    Stores the lower boundary of the inhomogeneous term of the result.
+
+    \param res_hi_coeff
+    Stores the higher boundary of the inhomogeneous term of the result.
+
+    \param denominator
+    Becomes the common denominator of \p res_low_coeff, \p res_hi_coeff
+    and all coefficients in \p res.
+
+    Results are obtained by normalizing denominators in \p lf, ignoring
+    the upper bounds of variable coefficients in \p lf.
+  */
+  template <typename FP_Format, typename Interval_Info>
+  static void
+  convert_to_integer_expressions(const Linear_Form<Interval<FP_Format,
+                                                            Interval_Info> >&
+                                 lf,
+                                 const dimension_type lf_dimension,
+                                 Linear_Expression& res,
+                                 Coefficient& res_low_coeff,
+                                 Coefficient& res_hi_coeff,
+                                 Coefficient& denominator);
+
+  template <typename Linear_System1, typename Row2>
+  static bool
+  add_to_system_and_check_independence(Linear_System1& eq_sys,
+                                       const Row2& eq);
+
+  /*! \brief
+    Assuming \p *this is NNC, assigns to \p *this the result of the
+    "positive time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign_impl(const Polyhedron& y);
+};
+
+/* Automatically generated from PPL source file ../src/Ph_Status_inlines.hh line 1. */
+/* Polyhedron::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Polyhedron::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Polyhedron::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Polyhedron::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Polyhedron::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+inline void
+Polyhedron::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Polyhedron::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Polyhedron::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Polyhedron::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Polyhedron::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Polyhedron::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Polyhedron::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Polyhedron::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Polyhedron::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Polyhedron::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Polyhedron::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Polyhedron::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Polyhedron::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Polyhedron::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Polyhedron::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Polyhedron::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Polyhedron::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_inlines.hh line 1. */
+/* Polyhedron class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_inlines.hh line 29. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Polyhedron::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Polyhedron::space_dimension() const {
+  return space_dim;
+}
+
+inline int32_t
+Polyhedron::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+inline dimension_type
+Polyhedron::max_space_dimension() {
+  using std::min;
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return min(std::numeric_limits<dimension_type>::max() - 1,
+             min(Constraint_System::max_space_dimension(),
+                 Generator_System::max_space_dimension()
+                 )
+             );
+}
+
+inline Topology
+Polyhedron::topology() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.topology();
+}
+
+inline bool
+Polyhedron::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+inline bool
+Polyhedron::is_necessarily_closed() const {
+  // We can check either one of the two matrices.
+  // (`con_sys' is slightly better, since it is placed at offset 0.)
+  return con_sys.is_necessarily_closed();
+}
+
+inline void
+Polyhedron::upper_bound_assign(const Polyhedron& y) {
+  poly_hull_assign(y);
+}
+
+inline void
+Polyhedron::difference_assign(const Polyhedron& y) {
+  poly_difference_assign(y);
+}
+
+inline void
+Polyhedron::widening_assign(const Polyhedron& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
+
+inline
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::m_swap(Polyhedron& y) {
+  if (topology() != y.topology())
+    throw_topology_incompatible("swap(y)", "y", y);
+  using std::swap;
+  swap(con_sys, y.con_sys);
+  swap(gen_sys, y.gen_sys);
+  swap(sat_c, y.sat_c);
+  swap(sat_g, y.sat_g);
+  swap(status, y.status);
+  swap(space_dim, y.space_dim);
+}
+
+/*! \relates Polyhedron */
+inline void
+swap(Polyhedron& x, Polyhedron& y) {
+  x.m_swap(y);
+}
+
+inline bool
+Polyhedron::can_recycle_constraint_systems() {
+  return true;
+}
+
+inline bool
+Polyhedron::can_recycle_congruence_systems() {
+  return false;
+}
+
+inline bool
+Polyhedron::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Polyhedron::constraints_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Polyhedron::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Polyhedron::constraints_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Polyhedron::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline bool
+Polyhedron::sat_c_is_up_to_date() const {
+  return status.test_sat_c_up_to_date();
+}
+
+inline bool
+Polyhedron::sat_g_is_up_to_date() const {
+  return status.test_sat_g_up_to_date();
+}
+
+inline bool
+Polyhedron::has_pending_constraints() const {
+  return status.test_c_pending();
+}
+
+inline bool
+Polyhedron::has_pending_generators() const {
+  return status.test_g_pending();
+}
+
+inline bool
+Polyhedron::has_something_pending() const {
+  return status.test_c_pending() || status.test_g_pending();
+}
+
+inline bool
+Polyhedron::can_have_something_pending() const {
+  return constraints_are_minimized()
+    && generators_are_minimized()
+    && (sat_c_is_up_to_date() || sat_g_is_up_to_date());
+}
+
+inline bool
+Polyhedron::is_empty() const {
+  if (marked_empty())
+    return true;
+  // Try a fast-fail test: if generators are up-to-date and
+  // there are no pending constraints, then the generator system
+  // (since it is well formed) contains a point.
+  if (generators_are_up_to_date() && !has_pending_constraints())
+    return false;
+  return !minimize();
+}
+
+inline void
+Polyhedron::set_constraints_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Polyhedron::set_constraints_minimized() {
+  set_constraints_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Polyhedron::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Polyhedron::set_constraints_pending() {
+  status.set_c_pending();
+}
+
+inline void
+Polyhedron::set_generators_pending() {
+  status.set_g_pending();
+}
+
+inline void
+Polyhedron::set_sat_c_up_to_date() {
+  status.set_sat_c_up_to_date();
+}
+
+inline void
+Polyhedron::set_sat_g_up_to_date() {
+  status.set_sat_g_up_to_date();
+}
+
+inline void
+Polyhedron::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Polyhedron::clear_constraints_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Polyhedron::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Polyhedron::clear_pending_constraints() {
+  status.reset_c_pending();
+}
+
+inline void
+Polyhedron::clear_pending_generators() {
+  status.reset_g_pending();
+}
+
+inline void
+Polyhedron::clear_sat_c_up_to_date() {
+  status.reset_sat_c_up_to_date();
+  // Can get rid of sat_c here.
+}
+
+inline void
+Polyhedron::clear_sat_g_up_to_date() {
+  status.reset_sat_g_up_to_date();
+  // Can get rid of sat_g here.
+}
+
+inline void
+Polyhedron::clear_constraints_up_to_date() {
+  clear_pending_constraints();
+  clear_constraints_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Polyhedron::clear_generators_up_to_date() {
+  clear_pending_generators();
+  clear_generators_minimized();
+  clear_sat_c_up_to_date();
+  clear_sat_g_up_to_date();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline bool
+Polyhedron::process_pending() const {
+  PPL_ASSERT(space_dim > 0 && !marked_empty());
+  PPL_ASSERT(has_something_pending());
+
+  if (has_pending_constraints())
+    return process_pending_constraints();
+
+  PPL_ASSERT(has_pending_generators());
+  process_pending_generators();
+  return true;
+}
+
+inline bool
+Polyhedron::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+inline bool
+Polyhedron::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+                     Coefficient& sup_n, Coefficient& sup_d,
+                     bool& maximum) const {
+  Generator g(point());
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::maximize(const Linear_Expression& expr,
+                     Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                     Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+                     Coefficient& inf_n, Coefficient& inf_d,
+                     bool& minimum) const {
+  Generator g(point());
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline bool
+Polyhedron::minimize(const Linear_Expression& expr,
+                     Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                     Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+inline Constraint_System
+Polyhedron::simplified_constraints() const {
+  PPL_ASSERT(constraints_are_up_to_date());
+  Constraint_System cs(con_sys);
+  if (cs.num_pending_rows() > 0)
+    cs.unset_pending_rows();
+  if (has_pending_constraints() || !constraints_are_minimized())
+    cs.simplify();
+  return cs;
+}
+
+inline Congruence_System
+Polyhedron::congruences() const {
+  return Congruence_System(minimized_constraints());
+}
+
+inline Congruence_System
+Polyhedron::minimized_congruences() const {
+  return Congruence_System(minimized_constraints());
+}
+
+inline void
+Polyhedron::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::generalized_refine_with_linear_form_inequality(
+            const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+            const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+            const Relation_Symbol relsym) {
+  switch (relsym) {
+  case EQUAL:
+    // TODO: see if we can handle this case more efficiently.
+    refine_with_linear_form_inequality(left, right, false);
+    refine_with_linear_form_inequality(right, left, false);
+    break;
+  case LESS_THAN:
+    refine_with_linear_form_inequality(left, right, true);
+    break;
+  case LESS_OR_EQUAL:
+    refine_with_linear_form_inequality(left, right, false);
+    break;
+  case GREATER_THAN:
+    refine_with_linear_form_inequality(right, left, true);
+    break;
+  case GREATER_OR_EQUAL:
+    refine_with_linear_form_inequality(right, left, false);
+    break;
+  case NOT_EQUAL:
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+}
+
+template <typename FP_Format, typename Interval_Info>
+inline void
+Polyhedron::
+refine_fp_interval_abstract_store(
+       Box< Interval<FP_Format, Interval_Info> >& store) const {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                     "Polyhedron::refine_fp_interval_abstract_store:"
+                     " T not a floating point type.");
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Polyhedron */
+inline bool
+operator!=(const Polyhedron& x, const Polyhedron& y) {
+  return !(x == y);
+}
+
+inline bool
+Polyhedron::strictly_contains(const Polyhedron& y) const {
+  const Polyhedron& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(Complexity_Class complexity) {
+  const Variables_Set* const p_vs = 0;
+  drop_some_non_integer_points(p_vs, complexity);
+}
+
+inline void
+Polyhedron::drop_some_non_integer_points(const Variables_Set& vars,
+                                         Complexity_Class complexity) {
+  drop_some_non_integer_points(&vars, complexity);
+}
+
+
+namespace Interfaces {
+
+inline bool
+is_necessarily_closed_for_interfaces(const Polyhedron& ph) {
+  return ph.is_necessarily_closed();
+}
+
+} // namespace Interfaces
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_templates.hh line 1. */
+/* Polyhedron class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_defs.hh line 1. */
+/* MIP_Problem class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Matrix_defs.hh line 1. */
+/* Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Matrix_defs.hh line 31. */
+#include <ostream>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A sparse matrix of Coefficient.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+class Parma_Polyhedra_Library::Matrix {
+
+public:
+  typedef typename Swapping_Vector<Row>::iterator iterator;
+  typedef typename Swapping_Vector<Row>::const_iterator const_iterator;
+
+  //! Returns the maximum number of rows of a Sparse_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns of a Sparse_Matrix.
+  static dimension_type max_num_columns();
+
+  /*!
+    \brief Constructs a square matrix with the given size, filled with
+           unstored zeroes.
+
+    \param n
+    The size of the new square matrix.
+
+    This method takes \f$O(n)\f$ time.
+  */
+  explicit Matrix(dimension_type n = 0);
+
+  /*!
+    \brief Constructs a matrix with the given dimensions, filled with unstored
+           zeroes.
+
+    \param num_rows
+    The number of rows in the new matrix.
+
+    \param num_columns
+    The number of columns in the new matrix.
+
+    This method takes \f$O(n)\f$ time, where n is \p num_rows.
+  */
+  Matrix(dimension_type num_rows, dimension_type num_columns);
+
+  //! Swaps (*this) with x.
+  /*!
+
+    \param x
+    The matrix that will be swapped with *this.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  void m_swap(Matrix& x);
+
+  //! Returns the number of rows in the matrix.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type num_rows() const;
+
+  //! Returns the number of columns in the matrix.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  dimension_type num_columns() const;
+
+  // TODO: Check if this can be removed.
+  //! Returns the capacity of the row vector.
+  dimension_type capacity() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no rows.
+  /*!
+    \note
+    The unusual naming for this method is \em intentional:
+    we do not want it to be named \c empty because this would cause
+    an error prone name clash with the corresponding methods in derived
+    classes Constraint_System and Congruence_System (which have a
+    different semantics).
+  */
+  bool has_no_rows() const;
+
+  //! Equivalent to resize(n, n).
+  void resize(dimension_type n);
+
+  // TODO: Check if this can become private.
+  //! Reserves space for at least \p n rows.
+  void reserve_rows(dimension_type n);
+
+  //! Resizes this matrix to the specified dimensions.
+  /*!
+
+    \param num_rows
+    The desired numer of rows.
+
+    \param num_columns
+    The desired numer of columns.
+
+    New rows and columns will contain non-stored zeroes.
+
+    This operation invalidates existing iterators.
+
+    Adding n rows takes \f$O(n)\f$ amortized time.
+
+    Adding n columns takes \f$O(r)\f$ time, where r is \p num_rows.
+
+    Removing n rows takes \f$O(n+k)\f$ amortized time, where k is the total
+    number of elements stored in the removed rows.
+
+    Removing n columns takes \f$O(\sum_{j=1}^{r} (k_j*\log^2 n_j))\f$ time,
+    where r is the number of rows, \f$k_j\f$ is the number of elements stored
+    in the columns of the j-th row that must be removed and \f$n_j\f$ is the
+    total number of elements stored in the j-th row.
+    A weaker (but simpler) bound is \f$O(r+k*\log^2 c)\f$, where r is the
+    number of rows, k is the number of elements that have to be removed and c
+    is the number of columns.
+  */
+  void resize(dimension_type num_rows, dimension_type num_columns);
+
+  //! Adds \p n rows and \p m columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    \param m
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times (c+m)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{M}{0} \genfrac{}{}{0pt}{}{0}{0}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+
+    This method takes \f$O(r)\f$ time, where r is the number of the matrix's
+    rows after the operation.
+  */
+  void add_zero_rows_and_columns(dimension_type n, dimension_type m);
+
+  //! Adds to the matrix \p n rows of zeroes.
+  /*!
+    \param n
+    The number of rows to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+n) \times c\f$ matrix \f$\genfrac{(}{)}{0pt}{}{M}{0}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+
+    This method takes \f$O(k)\f$ amortized time, where k is the number of the
+    new rows.
+  */
+  void add_zero_rows(dimension_type n);
+
+  //! Adds a copy of the row \p x at the end of the matrix.
+  /*!
+
+    \param x
+    The row that will be appended to the matrix.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(n)\f$ amortized time, where n is the numer of
+    elements stored in \p x.
+  */
+  void add_row(const Row& x);
+
+  //! Adds the row \p y to the matrix.
+  /*!
+    \param y
+    The row to be added: it must have the same size and capacity as
+    \p *this. It is not declared <CODE>const</CODE> because its
+    data-structures will recycled to build the new matrix row.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$(r+1) \times c\f$ matrix
+    \f$\genfrac{(}{)}{0pt}{}{M}{y}\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_recycled_row(Row& y);
+
+  /*! \brief
+    Removes from the matrix the last \p n rows.
+
+    \param n
+    The number of row that will be removed.
+
+    It is equivalent to num_rows() - n, num_columns()).
+
+    This method takes \f$O(n+k)\f$ amortized time, where k is the total number
+    of elements stored in the removed rows and n is the number of removed
+    rows.
+  */
+  void remove_trailing_rows(dimension_type n);
+
+  void remove_rows(iterator first, iterator last);
+
+  //! Permutes the columns of the matrix.
+  /*!
+    This method may be slow for some Row types, and should be avoided if
+    possible.
+
+    \param cycles
+    A vector representing the non-trivial cycles of the permutation
+    according to which the columns must be rearranged.
+
+    The \p cycles vector contains, one after the other, the
+    non-trivial cycles (i.e., the cycles of length greater than one)
+    of a permutation of \e non-zero column indexes.  Each cycle is
+    terminated by zero.  For example, assuming the matrix has 7
+    columns, the permutation \f$ \{ 1 \mapsto 3, 2 \mapsto 4,
+    3 \mapsto 6, 4 \mapsto 2, 5 \mapsto 5, 6 \mapsto 1 \}\f$ can be
+    represented by the non-trivial cycles \f$(1 3 6)(2 4)\f$ that, in
+    turn can be represented by a vector of 6 elements containing 1, 3,
+    6, 0, 2, 4, 0.
+
+    This method takes \f$O(k*\sum_{j=1}^{r} \log^2 n_j)\f$ expected time,
+    where k is the size of the \p cycles vector, r the number of rows and
+    \f$n_j\f$ the number of elements stored in row j.
+    A weaker (but simpler) bound is \f$O(k*r*\log^2 c)\f$, where k is the size
+    of the \p cycles vector, r is the number of rows and c is the number of
+    columns.
+
+    \note
+    The first column of the matrix, having index zero, is never involved
+    in a permutation.
+  */
+  void permute_columns(const std::vector<dimension_type>& cycles);
+
+  //! Swaps the columns having indexes \p i and \p j.
+  void swap_columns(dimension_type i,  dimension_type j);
+
+  //! Adds \p n columns of zeroes to the matrix.
+  /*!
+    \param n
+    The number of columns to be added: must be strictly positive.
+
+    Turns the \f$r \times c\f$ matrix \f$M\f$ into
+    the \f$r \times (c+n)\f$ matrix \f$(M \, 0)\f$.
+
+    This method takes \f$O(r)\f$ amortized time, where r is the numer of the
+    matrix's rows.
+  */
+  void add_zero_columns(dimension_type n);
+
+  //! Adds \p n columns of non-stored zeroes to the matrix before column i.
+  /*!
+
+    \param n
+    The numer of columns that will be added.
+
+    \param i
+    The index of the column before which the new columns will be added.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\sum_{j=1}^{r} (k_j+\log n_j))\f$ time, where r is
+    the number of rows, \f$k_j\f$ is the number of elements stored in the
+    columns of the j-th row that must be shifted and \f$n_j\f$ is the number
+    of elements stored in the j-th row.
+    A weaker (but simpler) bound is \f$O(k+r*\log c)\f$ time, where k is the
+    number of elements that must be shifted, r is the number of the rows and c
+    is the number of the columns.
+  */
+  void add_zero_columns(dimension_type n, dimension_type i);
+
+  //! Removes the i-th from the matrix, shifting other columns to the left.
+  /*!
+
+    \param i
+    The index of the column that will be removed.
+
+    This operation invalidates existing iterators on rows' elements.
+
+    This method takes \f$O(k + \sum_{j=1}^{r} (\log^2 n_j))\f$ amortized time,
+    where k is the number of elements stored with column index greater than i,
+    r the number of rows in this matrix and \f$n_j\f$ the number of elements
+    stored in row j.
+    A weaker (but simpler) bound is \f$O(r*(c-i+\log^2 c))\f$, where r is the
+    number of rows, c is the number of columns and i is the parameter passed
+    to this method.
+  */
+  void remove_column(dimension_type i);
+
+  //! Shrinks the matrix by removing its \p n trailing columns.
+  /*!
+
+    \param n
+    The number of trailing columns that will be removed.
+
+    This operation invalidates existing iterators.
+
+    This method takes \f$O(\sum_{j=1}^r (k_j*\log n_j))\f$ amortized time,
+    where r is the number of rows, \f$k_j\f$ is the number of elements that
+    have to be removed from row j and \f$n_j\f$ is the total number of
+    elements stored in row j.
+    A weaker (but simpler) bound is \f$O(r*n*\log c)\f$, where r is the number
+    of rows, c the number of columns and n the parameter passed to this
+    method.
+  */
+  void remove_trailing_columns(dimension_type n);
+
+  //! Equivalent to resize(0,0).
+  void clear();
+
+  //! Returns an %iterator pointing to the first row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator begin();
+
+  //! Returns an %iterator pointing after the last row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  iterator end();
+
+  //! Returns an %iterator pointing to the first row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator begin() const;
+
+  //! Returns an %iterator pointing after the last row.
+  /*!
+    This method takes \f$O(1)\f$ time.
+  */
+  const_iterator end() const;
+
+  //! Returns a reference to the i-th row.
+  /*!
+    \param i
+    The index of the desired row.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  Row& operator[](dimension_type i);
+
+  //! Returns a const reference to the i-th row.
+  /*!
+    \param i
+    The index of the desired row.
+
+    This method takes \f$O(1)\f$ time.
+  */
+  const Row& operator[](dimension_type i) const;
+
+  //! Loads the row from an ASCII representation generated using ascii_dump().
+  /*!
+    \param s
+    The stream from which read the ASCII representation.
+
+    This method takes \f$O(n*\log n)\f$ time.
+  */
+  bool ascii_load(std::istream& s);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  /*!
+    This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+    number of elements stored in the matrix.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  /*!
+    This method is \f$O(r+k)\f$, where r is the number of rows and k is the
+    number of elements stored in the matrix.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The vector that stores the matrix's elements.
+  Swapping_Vector<Row> rows;
+
+  //! The number of columns in this matrix.
+  dimension_type num_columns_;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+void swap(Matrix<Row>& x, Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator==(const Matrix<Row>& x, const Matrix<Row>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Row>
+bool operator!=(const Matrix<Row>& x, const Matrix<Row>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Matrix_inlines.hh line 1. */
+/* Matrix class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_rows() {
+  return std::vector<Row>().max_size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::max_num_columns() {
+  return Row::max_size();
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::m_swap(Matrix& x) {
+  using std::swap;
+  swap(rows, x.rows);
+  swap(num_columns_, x.num_columns_);
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_rows() const {
+  return rows.size();
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::num_columns() const {
+  return num_columns_;
+}
+
+template <typename Row>
+inline dimension_type
+Matrix<Row>::capacity() const {
+  return rows.capacity();
+}
+
+template <typename Row>
+inline bool
+Matrix<Row>::has_no_rows() const {
+  return num_rows() == 0;
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::resize(dimension_type n) {
+  resize(n, n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::reserve_rows(dimension_type requested_capacity) {
+
+  rows.reserve(requested_capacity);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows_and_columns(dimension_type n, dimension_type m) {
+  resize(num_rows() + n, num_columns() + m);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_rows(dimension_type n) {
+  resize(num_rows() + n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_row(const Row& x) {
+  // TODO: Optimize this.
+  Row row(x);
+  add_zero_rows(1);
+  // Now x may have been invalidated, if it was a row of this matrix.
+  swap(rows.back(), row);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_recycled_row(Row& x) {
+  add_zero_rows(1);
+  swap(rows.back(), x);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_rows(dimension_type n) {
+  resize(num_rows() - n, num_columns());
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_rows(iterator first, iterator last) {
+  rows.erase(first, last);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::add_zero_columns(dimension_type n) {
+  resize(num_rows(), num_columns() + n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::remove_trailing_columns(dimension_type n) {
+  PPL_ASSERT(n <= num_columns());
+  resize(num_rows(), num_columns() - n);
+}
+
+template <typename Row>
+inline void
+Matrix<Row>::clear() {
+  resize(0, 0);
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::begin() {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::iterator
+Matrix<Row>::end() {
+  return rows.end();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::begin() const {
+  return rows.begin();
+}
+
+template <typename Row>
+inline typename Matrix<Row>::const_iterator
+Matrix<Row>::end() const {
+  return rows.end();
+}
+
+template <typename Row>
+inline Row&
+Matrix<Row>::operator[](dimension_type i) {
+  PPL_ASSERT(i < rows.size());
+  return rows[i];
+}
+
+template <typename Row>
+inline const Row&
+Matrix<Row>::operator[](dimension_type i) const {
+  PPL_ASSERT(i < rows.size());
+  return rows[i];
+}
+
+template <typename Row>
+inline memory_size_type
+Matrix<Row>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename Row>
+inline void
+swap(Matrix<Row>& x, Matrix<Row>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Matrix_templates.hh line 1. */
+/* Matrix class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type n)
+  : rows(n), num_columns_(n) {
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].resize(num_columns_);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+Matrix<Row>::Matrix(dimension_type num_rows, dimension_type num_columns)
+  : rows(num_rows), num_columns_(num_columns) {
+  for (dimension_type i = 0; i < rows.size(); ++i)
+    rows[i].resize(num_columns_);
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::resize(dimension_type num_rows, dimension_type num_columns) {
+  const dimension_type old_num_rows = rows.size();
+  rows.resize(num_rows);
+  if (old_num_rows < num_rows) {
+    for (dimension_type i = old_num_rows; i < num_rows; ++i)
+      rows[i].resize(num_columns);
+    if (num_columns_ != num_columns) {
+      num_columns_ = num_columns;
+      for (dimension_type i = 0; i < old_num_rows; ++i)
+        rows[i].resize(num_columns);
+    }
+  }
+  else
+    if (num_columns_ != num_columns) {
+      num_columns_ = num_columns;
+      for (dimension_type i = 0; i < num_rows; ++i)
+        rows[i].resize(num_columns);
+    }
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::permute_columns(const std::vector<dimension_type>& cycles) {
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+  const dimension_type n = cycles.size();
+  PPL_ASSERT(cycles[n - 1] == 0);
+  for (dimension_type k = num_rows(); k-- > 0; ) {
+    Row& rows_k = (*this)[k];
+    for (dimension_type i = 0, j = 0; i < n; i = ++j) {
+      // Make `j' be the index of the next cycle terminator.
+      while (cycles[j] != 0)
+        ++j;
+      // Cycles of length less than 2 are not allowed.
+      PPL_ASSERT(j - i >= 2);
+      if (j - i == 2)
+        // For cycles of length 2 no temporary is needed, just a swap.
+        rows_k.swap_coefficients(cycles[i], cycles[i + 1]);
+      else {
+        // Longer cycles need a temporary.
+        tmp = rows_k.get(cycles[j - 1]);
+        for (dimension_type l = (j - 1); l > i; --l)
+          rows_k.swap_coefficients(cycles[l-1], cycles[l]);
+        if (tmp == 0)
+          rows_k.reset(cycles[i]);
+        else {
+          using std::swap;
+          swap(tmp, rows_k[cycles[i]]);
+        }
+      }
+    }
+  }
+}
+
+template <typename Row>
+void
+Matrix<Row>::swap_columns(dimension_type i, dimension_type j) {
+  for (dimension_type k = num_rows(); k-- > 0; )
+    (*this)[k].swap_coefficients(i, j);
+}
+
+template <typename Row>
+void
+Matrix<Row>::add_zero_columns(dimension_type n, dimension_type i) {
+  for (dimension_type j = rows.size(); j-- > 0; )
+    rows[j].add_zeroes_and_shift(n, i);
+  num_columns_ += n;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::remove_column(dimension_type i) {
+  for (dimension_type j = rows.size(); j-- > 0; )
+    rows[j].delete_element_and_shift(i);
+  --num_columns_;
+  PPL_ASSERT(OK());
+}
+
+template <typename Row>
+void
+Matrix<Row>::ascii_dump(std::ostream& s) const {
+  s << num_rows() << " x ";
+  s << num_columns() << "\n";
+  for (const_iterator i = begin(), i_end = end(); i !=i_end; ++i)
+    i->ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(Row, Matrix<Row>)
+
+template <typename Row>
+bool
+Matrix<Row>::ascii_load(std::istream& s) {
+  std::string str;
+  dimension_type new_num_rows;
+  dimension_type new_num_cols;
+  if (!(s >> new_num_rows))
+    return false;
+  if (!(s >> str) || str != "x")
+    return false;
+  if (!(s >> new_num_cols))
+    return false;
+
+  for (iterator i = rows.begin(), i_end = rows.end(); i != i_end; ++i)
+    i->clear();
+
+  resize(new_num_rows, new_num_cols);
+
+  for (dimension_type row = 0; row < new_num_rows; ++row)
+    if (!rows[row].ascii_load(s))
+      return false;
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename Row>
+memory_size_type
+Matrix<Row>::external_memory_in_bytes() const {
+  return rows.external_memory_in_bytes();
+}
+
+template <typename Row>
+bool
+Matrix<Row>::OK() const {
+  for (const_iterator i = begin(), i_end = end(); i != i_end; ++i)
+    if (i->size() != num_columns_)
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator==(const Matrix<Row>& x, const Matrix<Row>& y) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  if (x.num_columns() != y.num_columns())
+    return false;
+  for (dimension_type i = x.num_rows(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+template <typename Row>
+bool
+operator!=(const Matrix<Row>& x, const Matrix<Row>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Matrix_defs.hh line 436. */
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_defs.hh line 37. */
+#include <vector>
+#include <deque>
+#include <iterator>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::MIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const MIP_Problem& mip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates MIP_Problem */
+void swap(MIP_Problem& x, MIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Mixed Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+  An object of this class encodes a mixed integer (linear) programming
+  problem.
+  The MIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the feasible region, by means of a finite set of linear equality
+     and non-strict inequality constraints;
+   - the subset of the unknown variables that range over the integers
+     (the other variables implicitly ranging over the reals);
+   - the objective function, described by a Linear_Expression;
+   - the optimization mode (either maximization or minimization).
+
+  The class provides support for the (incremental) solution of the
+  MIP problem based on variations of the revised simplex method and
+  on branch-and-bound techniques. The result of the resolution
+  process is expressed in terms of an enumeration, encoding the
+  feasibility and the unboundedness of the optimization problem.
+  The class supports simple feasibility tests (i.e., no optimization),
+  as well as the extraction of an optimal (resp., feasible) point,
+  provided the MIP_Problem is optimizable (resp., feasible).
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given MIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of constraints,
+  the change of objective function and the change of optimization mode.
+*/
+class Parma_Polyhedra_Library::MIP_Problem {
+public:
+  //! Builds a trivial MIP problem.
+  /*!
+    A trivial MIP problem requires to maximize the objective function
+    \f$0\f$ on a vector space under no constraints at all:
+    the origin of the vector space is an optimal solution.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this
+    (optional argument with default value \f$0\f$).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+  explicit MIP_Problem(dimension_type dim = 0);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode;
+    those dimensions whose indices occur in \p int_vars are
+    constrained to take an integer value.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param int_vars
+    The set of variables' indexes that are constrained to take integer values.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality,
+    if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) or the space dimension
+    of the integer variable set is strictly greater than \p dim.
+  */
+  template <typename In>
+  MIP_Problem(dimension_type dim,
+              In first, In last,
+              const Variables_Set& int_vars,
+              const Linear_Expression& obj = Linear_Expression::zero(),
+              Optimization_Mode mode = MAXIMIZATION);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$,
+    the objective function \p obj and optimization mode \p mode.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if a constraint in the sequence is a strict inequality
+    or if the space dimension of a constraint (resp., of the
+    objective function or of the integer variables) is strictly
+    greater than \p dim.
+  */
+  template <typename In>
+  MIP_Problem(dimension_type dim,
+              In first, In last,
+              const Linear_Expression& obj = Linear_Expression::zero(),
+              Optimization_Mode mode = MAXIMIZATION);
+
+  /*! \brief
+    Builds an MIP problem having space dimension \p dim from the constraint
+    system \p cs, the objective function \p obj and optimization mode \p mode.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this.
+
+    \param cs
+    The constraint system defining the feasible region.
+
+    \param obj
+    The objective function (optional argument with default value \f$0\f$).
+
+    \param mode
+    The optimization mode (optional argument with default value
+    <CODE>MAXIMIZATION</CODE>).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system contains any strict inequality
+    or if the space dimension of the constraint system (resp., the
+    objective function) is strictly greater than \p dim.
+  */
+  MIP_Problem(dimension_type dim,
+              const Constraint_System& cs,
+              const Linear_Expression& obj = Linear_Expression::zero(),
+              Optimization_Mode mode = MAXIMIZATION);
+
+  //! Ordinary copy constructor.
+  MIP_Problem(const MIP_Problem& y);
+
+  //! Destructor.
+  ~MIP_Problem();
+
+  //! Assignment operator.
+  MIP_Problem& operator=(const MIP_Problem& y);
+
+  //! Returns the maximum space dimension an MIP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the MIP problem.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a set containing all the variables' indexes constrained
+    to be integral.
+  */
+  const Variables_Set& integer_space_dimensions() const;
+
+private:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint*> Constraint_Sequence;
+
+public:
+  //! A read-only iterator on the constraints defining the feasible region.
+  class const_iterator {
+  private:
+    typedef Constraint_Sequence::const_iterator Base;
+    typedef std::iterator_traits<Base> Base_Traits;
+  public:
+    typedef Base_Traits::iterator_category iterator_category;
+    typedef Base_Traits::difference_type difference_type;
+    typedef const Constraint value_type;
+    typedef const Constraint* pointer;
+    typedef const Constraint& reference;
+
+    //! Iterator difference: computes distances.
+    difference_type operator-(const const_iterator& y) const;
+
+    //! Prefix increment.
+    const_iterator& operator++();
+
+    //! Prefix decrement.
+    const_iterator& operator--();
+
+    //! Postfix increment.
+    const_iterator operator++(int);
+
+    //! Postfix decrement.
+    const_iterator operator--(int);
+
+    //! Moves iterator forward of \p n positions.
+    const_iterator& operator+=(difference_type n);
+
+    //! Moves iterator backward of \p n positions.
+    const_iterator& operator-=(difference_type n);
+
+    //! Returns an iterator \p n positions forward.
+    const_iterator operator+(difference_type n) const;
+
+    //! Returns an iterator \p n positions backward.
+    const_iterator operator-(difference_type n) const;
+
+    //! Returns a reference to the "pointed" object.
+    reference operator*() const;
+
+    //! Returns the address of the "pointed" object.
+    pointer operator->() const;
+
+    //! Compares \p *this with y.
+    /*!
+      \param y
+      The %iterator that will be compared with *this.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    //! Compares \p *this with y.
+    /*!
+      \param y
+      The %iterator that will be compared with *this.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    //! Constructor from a Base iterator.
+    explicit const_iterator(Base base);
+
+    //! The Base iterator on the Constraint_Sequence.
+    Base itr;
+
+    friend class MIP_Problem;
+  };
+
+  /*! \brief
+    Returns a read-only iterator to the first constraint defining
+    the feasible region.
+  */
+  const_iterator constraints_begin() const;
+
+  /*! \brief
+    Returns a past-the-end read-only iterator to the sequence of
+    constraints defining the feasible region.
+  */
+  const_iterator constraints_end() const;
+
+  //! Returns the objective function.
+  const Linear_Expression& objective_function() const;
+
+  //! Returns the optimization mode.
+  Optimization_Mode optimization_mode() const;
+
+  //! Resets \p *this to be equal to the trivial MIP problem.
+  /*!
+    The space dimension is reset to \f$0\f$.
+  */
+  void clear();
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the old MIP problem
+    in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new MIP problem; they are initially unconstrained.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Sets the variables whose indexes are in set \p i_vars to be
+    integer space dimensions.
+
+    \exception std::invalid_argument
+    Thrown if some index in \p i_vars does not correspond to
+    a space dimension in \p *this.
+  */
+  void add_to_integer_space_dimensions(const Variables_Set& i_vars);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint \p c is a strict inequality or if its space
+    dimension is strictly greater than the space dimension of \p *this.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the MIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains any strict inequality
+    or if its space dimension is strictly greater than the space dimension
+    of \p *this.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Sets the objective function to \p obj.
+  /*!
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p obj is strictly greater than
+    the space dimension of \p *this.
+  */
+  void set_objective_function(const Linear_Expression& obj);
+
+  //! Sets the optimization mode to \p mode.
+  void set_optimization_mode(Optimization_Mode mode);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if the MIP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the MIP problem.
+  /*!
+    \return
+    An MIP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible, unbounded or optimized problem).
+  */
+  MIP_Problem_Status solve() const;
+
+  /*! \brief
+    Sets \p num and \p denom so that
+    \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the result of
+    evaluating the objective function on \p evaluating_point.
+
+    \param evaluating_point
+    The point on which the objective function will be evaluated.
+
+    \param numer
+    On exit will contain the numerator of the evaluated value.
+
+    \param denom
+    On exit will contain the denominator of the evaluated value.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p evaluating_point are dimension-incompatible
+    or if the generator \p evaluating_point is not a point.
+  */
+  void evaluate_objective_function(const Generator& evaluating_point,
+                                   Coefficient& numer,
+                                   Coefficient& denom) const;
+
+  //! Returns a feasible point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if the MIP problem is not satisfiable.
+  */
+  const Generator& feasible_point() const;
+
+  //! Returns an optimal point for \p *this, if it exists.
+  /*!
+    \exception std::domain_error
+    Thrown if \p *this does not not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  const Generator& optimizing_point() const;
+
+  /*! \brief
+    Sets \p numer and \p denom so that
+    \f$\frac{\mathtt{numer}}{\mathtt{denom}}\f$ is the solution of the
+    optimization problem.
+
+    \exception std::domain_error
+    Thrown if \p *this does not not have an optimizing point, i.e.,
+    if the MIP problem is unbounded or not satisfiable.
+  */
+  void optimal_value(Coefficient& numer, Coefficient& denom) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(MIP_Problem& y);
+
+  //! Names of MIP problems' control parameters.
+  enum Control_Parameter_Name {
+    //! The pricing rule.
+    PRICING
+  };
+
+  //! Possible values for MIP problem's control parameters.
+  enum Control_Parameter_Value {
+    //! Steepest edge pricing method, using floating points (default).
+    PRICING_STEEPEST_EDGE_FLOAT,
+    //! Steepest edge pricing method, using Coefficient.
+    PRICING_STEEPEST_EDGE_EXACT,
+    //! Textbook pricing method.
+    PRICING_TEXTBOOK
+  };
+
+  //! Returns the value of the control parameter \p name.
+  Control_Parameter_Value
+  get_control_parameter(Control_Parameter_Name name) const;
+
+  //! Sets control parameter \p value.
+  void set_control_parameter(Control_Parameter_Value value);
+
+private:
+  //! The dimension of the vector space.
+  dimension_type external_space_dim;
+
+  /*! \brief
+    The space dimension of the current (partial) solution of the
+    MIP problem; it may be smaller than \p external_space_dim.
+  */
+  dimension_type internal_space_dim;
+
+#if PPL_USE_SPARSE_MATRIX
+  typedef Sparse_Row Row;
+#else
+  typedef Dense_Row Row;
+#endif
+
+  //! The matrix encoding the current feasible region in tableau form.
+  Matrix<Row> tableau;
+
+  typedef Row working_cost_type;
+
+  //! The working cost function.
+  working_cost_type working_cost;
+
+  //! A map between the variables of `input_cs' and `tableau'.
+  /*!
+    Contains all the pairs (i, j) such that mapping[i].first encodes the index
+    of the column in the tableau where input_cs[i] is stored; if
+    mapping[i].second is not a zero, it encodes the split part of the tableau
+    of input_cs[i].
+    The "positive" one is represented by mapping[i].first and the "negative"
+    one is represented by mapping[i].second.
+  */
+  std::vector<std::pair<dimension_type, dimension_type> > mapping;
+
+  //! The current basic solution.
+  std::vector<dimension_type> base;
+
+  //! An enumerated type describing the internal status of the MIP problem.
+  enum Status {
+    //! The MIP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The MIP problem is satisfiable; a feasible solution has been computed.
+    SATISFIABLE,
+    //! The MIP problem is unbounded; a feasible solution has been computed.
+    UNBOUNDED,
+    //! The MIP problem is optimized; an optimal solution has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the MIP problem has been changed by adding
+      new space dimensions or new constraints; a feasible solution for
+      the old feasible region is still available.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the MIP problem.
+  Status status;
+
+  // TODO: merge `status', `initialized', `pricing' and (maybe) `opt_mode'
+  // into a single bitset status word, so as to save space and allow
+  // for other control parameters.
+
+  //! The pricing method in use.
+  Control_Parameter_Value pricing;
+
+  /*! \brief
+    A Boolean encoding whether or not internal data structures have
+    already been properly sized and populated: useful to allow for
+    deeper checks in method OK().
+  */
+  bool initialized;
+
+  //! The sequence of constraints describing the feasible region.
+  std::vector<Constraint*> input_cs;
+
+  /*! \brief
+    The number of constraints that are inherited from our parent
+    in the recursion tree built when solving via branch-and-bound.
+
+    The first \c inherited_constraints elements in \c input_cs point to
+    the inherited constraints, whose resources are owned by our ancestors.
+    The resources of the other elements in \c input_cs are owned by \c *this
+    and should be appropriately released on destruction.
+  */
+  dimension_type inherited_constraints;
+
+  //! The first index of `input_cs' containing a pending constraint.
+  dimension_type first_pending_constraint;
+
+  //! The objective function to be optimized.
+  Linear_Expression input_obj_function;
+
+  //! The optimization mode requested.
+  Optimization_Mode opt_mode;
+
+  //! The last successfully computed feasible or optimizing point.
+  Generator last_generator;
+
+  /*! \brief
+    A set containing all the indexes of variables that are constrained
+    to have an integer value.
+  */
+  Variables_Set i_variables;
+
+  //! A helper class to temporarily relax a MIP problem using RAII.
+  struct RAII_Temporary_Real_Relaxation {
+    MIP_Problem& lp;
+    Variables_Set i_vars;
+
+    RAII_Temporary_Real_Relaxation(MIP_Problem& mip)
+      : lp(mip), i_vars() {
+      // Turn mip into an LP problem (saving i_variables in i_vars).
+      using std::swap;
+      swap(i_vars, lp.i_variables);
+    }
+
+    ~RAII_Temporary_Real_Relaxation() {
+      // Restore the original set of integer variables.
+      using std::swap;
+      swap(i_vars, lp.i_variables);
+    }
+  };
+  friend struct RAII_Temporary_Real_Relaxation;
+
+  //! A tag type to distinguish normal vs. inheriting copy constructor.
+  struct Inherit_Constraints {};
+
+  //! Copy constructor inheriting constraints.
+  MIP_Problem(const MIP_Problem& y, Inherit_Constraints);
+
+  //! Helper method: implements exception safe addition.
+  void add_constraint_helper(const Constraint& c);
+
+  //! Processes the pending constraints of \p *this.
+  void process_pending_constraints();
+
+  /*! \brief
+    Optimizes the MIP problem using the second phase of the
+    primal simplex algorithm.
+  */
+  void second_phase();
+
+  /*! \brief
+    Assigns to \p this->tableau a simplex tableau representing the
+    MIP problem, inserting into \p this->mapping the information
+    that is required to recover the original MIP problem.
+
+    \return
+    <CODE>UNFEASIBLE_MIP_PROBLEM</CODE> if the constraint system contains
+    any trivially unfeasible constraint (tableau was not computed);
+    <CODE>UNBOUNDED_MIP_PROBLEM</CODE> if the problem is trivially unbounded
+    (the computed tableau contains no constraints);
+    <CODE>OPTIMIZED_MIP_PROBLEM></CODE> if the problem is neither trivially
+    unfeasible nor trivially unbounded (the tableau was computed
+    successfully).
+  */
+  MIP_Problem_Status
+  compute_tableau(std::vector<dimension_type>& worked_out_row);
+
+  /*! \brief
+    Parses the pending constraints to gather information on
+    how to resize the tableau.
+
+    \note
+    All of the method parameters are output parameters; their value
+    is only meaningful when the function exit returning value \c true.
+
+    \return
+    \c false if a trivially false constraint is detected, \c true otherwise.
+
+    \param additional_tableau_rows
+    On exit, this will store the number of rows that have to be added
+    to the original tableau.
+
+    \param additional_slack_variables
+    This will store the number of slack variables that have to be added
+    to the original tableau.
+
+    \param is_tableau_constraint
+    This container of Boolean flags is initially empty. On exit, it size
+    will be equal to the number of pending constraints in \c input_cs.
+    For each pending constraint index \c i, the corresponding element
+    of this container (having index <CODE>i - first_pending_constraint</CODE>)
+    will be set to \c true if and only if the constraint has to be included
+    in the tableau.
+
+    \param is_satisfied_inequality
+    This container of Boolean flags is initially empty. On exit, its size
+    will be equal to the number of pending constraints in \c input_cs.
+    For each pending constraint index \c i, the corresponding element
+    of this container (having index <CODE>i - first_pending_constraint</CODE>)
+    will be set to \c true if and only if it is an inequality and it
+    is already satisfied by \c last_generator (hence it does not require
+    the introduction of an artificial variable).
+
+    \param is_nonnegative_variable
+    This container of Boolean flags is initially empty.
+    On exit, it size is equal to \c external_space_dim.
+    For each variable (index), the corresponding element of this container
+    is \c true if the variable is known to be nonnegative (and hence should
+    not be split into a positive and a negative part).
+
+    \param is_remergeable_variable
+    This container of Boolean flags is initially empty.
+    On exit, it size is equal to \c internal_space_dim.
+    For each variable (index), the corresponding element of this container
+    is \c true if the variable was previously split into positive and
+    negative parts that can now be merged back, since it is known
+    that the variable is nonnegative.
+  */
+  bool parse_constraints(dimension_type& additional_tableau_rows,
+                         dimension_type& additional_slack_variables,
+                         std::deque<bool>& is_tableau_constraint,
+                         std::deque<bool>& is_satisfied_inequality,
+                         std::deque<bool>& is_nonnegative_variable,
+                         std::deque<bool>& is_remergeable_variable) const;
+
+  /*! \brief
+    Computes the row index of the variable exiting the base
+    of the MIP problem. Implemented with anti-cycling rule.
+
+    \return
+    The row index of the variable exiting the base.
+
+    \param entering_var_index
+    The column index of the variable entering the base.
+  */
+  dimension_type
+  get_exiting_base_index(dimension_type entering_var_index) const;
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The row that will be combined with \p y object.
+
+    \param y
+    The row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Row to \p x and normalizes it.
+  */
+  static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+  // TODO: Remove this when the sparse working cost has been tested enough.
+#if PPL_USE_SPARSE_MATRIX
+
+  //! Linearly combines \p x with \p y so that <CODE>*this[k]</CODE> is 0.
+  /*!
+    \param x
+    The row that will be combined with \p y object.
+
+    \param y
+    The row that will be combined with \p x object.
+
+    \param k
+    The position of \p *this that have to be \f$0\f$.
+
+    Computes a linear combination of \p x and \p y having
+    the element of index \p k equal to \f$0\f$. Then it assigns
+    the resulting Dense_Row to \p x and normalizes it.
+  */
+  static void linear_combine(Dense_Row& x, const Sparse_Row& y,
+                             const dimension_type k);
+
+#endif // defined(PPL_USE_SPARSE_MATRIX)
+
+  static bool is_unbounded_obj_function(
+    const Linear_Expression& obj_function,
+    const std::vector<std::pair<dimension_type, dimension_type> >& mapping,
+    Optimization_Mode optimization_mode);
+
+  /*! \brief
+    Performs the pivoting operation on the tableau.
+
+    \param entering_var_index
+    The index of the variable entering the base.
+
+    \param exiting_base_index
+    The index of the row exiting the base.
+  */
+  void pivot(dimension_type entering_var_index,
+             dimension_type exiting_base_index);
+
+  /*! \brief
+    Computes the column index of the variable entering the base,
+    using the textbook algorithm with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base.
+    If no such variable exists, optimality was achieved
+    and <CODE>0</CODE> is returned.
+  */
+  dimension_type textbook_entering_index() const;
+
+  /*! \brief
+    Computes the column index of the variable entering the base,
+    using an exact steepest-edge algorithm with anti-cycling rule.
+
+    \return
+    The column index of the variable that enters the base.
+    If no such variable exists, optimality was achieved
+    and <CODE>0</CODE> is returned.
+
+    To compute the entering_index, the steepest edge algorithm chooses
+    the index `j' such that \f$\frac{d_{j}}{\|\Delta x^{j} \|}\f$ is the
+    largest in absolute value, where
+    \f[
+      \|\Delta x^{j} \|
+        = \left(
+            1+\sum_{i=1}^{m} \alpha_{ij}^2
+          \right)^{\frac{1}{2}}.
+    \f]
+    Recall that, due to the exact integer implementation of the algorithm,
+    our tableau does not contain the ``real'' \f$\alpha\f$ values, but these
+    can be computed dividing the value of the coefficient by the value of
+    the variable in base. Obviously the result may not be an integer, so
+    we will proceed in another way: we compute the lcm of all the variables
+    in base to get the good ``weight'' of each Coefficient of the tableau.
+  */
+  dimension_type steepest_edge_exact_entering_index() const;
+
+  /*! \brief
+    Same as steepest_edge_exact_entering_index,
+    but using floating points.
+
+    \note
+    Due to rounding errors, the index of the variable entering the base
+    of the MIP problem is not predictable across different architectures.
+    Hence, the overall simplex computation may differ in the path taken
+    to reach the optimum. Anyway, the exact final result will be computed
+    for the MIP_Problem.
+  */
+  dimension_type steepest_edge_float_entering_index() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+
+    \note
+    Uses an exact pricing method (either textbook or exact steepest edge),
+    so that the result is deterministic across different architectures.
+  */
+  bool compute_simplex_using_exact_pricing();
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and if only the algorithm successfully
+    computed a feasible solution.
+
+    \note
+    Uses a floating point implementation of the steepest edge pricing
+    method, so that the result is correct, but not deterministic across
+    different architectures.
+  */
+  bool compute_simplex_using_steepest_edge_float();
+
+  /*! \brief
+    Drop unnecessary artificial variables from the tableau and get ready
+    for the second phase of the simplex algorithm.
+
+    \note
+    The two parameters denote a STL-like half-open range.
+    It is assumed that \p begin_artificials is strictly greater than 0
+    and smaller than \p end_artificials.
+
+    \param begin_artificials
+    The start of the tableau column index range for artificial variables.
+
+    \param end_artificials
+    The end of the tableau column index range for artificial variables.
+    Note that column index end_artificial is \e excluded from the range.
+  */
+  void erase_artificials(dimension_type begin_artificials,
+                         dimension_type end_artificials);
+
+  bool is_in_base(dimension_type var_index,
+                  dimension_type& row_index) const;
+
+  /*! \brief
+    Computes a valid generator that satisfies all the constraints of the
+    Linear Programming problem associated to \p *this.
+  */
+  void compute_generator() const;
+
+  /*! \brief
+    Merges back the positive and negative part of a (previously split)
+    variable after detecting a corresponding nonnegativity constraint.
+
+    \return
+    If the negative part of \p var_index was in base, the index of
+    the corresponding tableau row (which has become non-feasible);
+    otherwise \c not_a_dimension().
+
+    \param var_index
+    The index of the variable that has to be merged.
+  */
+  dimension_type merge_split_variable(dimension_type var_index);
+
+  //! Returns <CODE>true</CODE> if and only if \p c is satisfied by \p g.
+  static bool is_satisfied(const Constraint& c, const Generator& g);
+
+  //! Returns <CODE>true</CODE> if and only if \p c is saturated by \p g.
+  static bool is_saturated(const Constraint& c, const Generator& g);
+
+  /*! \brief
+    Returns a status that encodes the solution of the MIP problem.
+
+    \param have_incumbent_solution
+    It is used to store if the solving process has found a provisional
+    optimum point.
+
+    \param incumbent_solution_value
+    Encodes the evaluated value of the provisional optimum point found.
+
+    \param incumbent_solution_point
+    If the method returns `OPTIMIZED', this will contain the optimality point.
+
+    \param mip
+    The problem that has to be solved.
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+  */
+  static MIP_Problem_Status solve_mip(bool& have_incumbent_solution,
+                                      mpq_class& incumbent_solution_value,
+                                      Generator& incumbent_solution_point,
+                                      MIP_Problem& mip,
+                                      const Variables_Set& i_vars);
+
+  /*! \brief
+    Returns \c true if and if only the LP problem is satisfiable.
+  */
+  bool is_lp_satisfiable() const;
+
+  /*! \brief
+    Returns \c true if and if only the MIP problem \p mip is satisfiable
+    when variables in \p i_vars can only take integral values.
+
+    \param mip
+    The MIP problem. This is assumed to have no integral space dimension
+    (so that it is a pure LP problem).
+
+    \param i_vars
+    The variables that are constrained to take integral values.
+
+    \param p
+    If \c true is returned, it will encode a feasible point.
+  */
+  static bool is_mip_satisfiable(MIP_Problem& mip,
+                                 const Variables_Set& i_vars,
+                                 Generator& p);
+
+  /*! \brief
+    Returns \c true if and if only \c mip.last_generator satisfies all the
+    integrality conditions implicitly stated using by \p i_vars.
+
+    \param mip
+    The MIP problem. This is assumed to have no integral space dimension
+    (so that it is a pure LP problem).
+
+    \param i_vars
+    The variables that are constrained to take an integer value.
+
+    \param branching_index
+    If \c false is returned, this will encode the non-integral variable
+    index on which the `branch and bound' algorithm should be applied.
+  */
+  static bool choose_branching_variable(const MIP_Problem& mip,
+                                        const Variables_Set& i_vars,
+                                        dimension_type& branching_index);
+};
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_inlines.hh line 1. */
+/* MIP_Problem class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+MIP_Problem::max_space_dimension() {
+  return Constraint::max_space_dimension();
+}
+
+inline dimension_type
+MIP_Problem::space_dimension() const {
+  return external_space_dim;
+}
+
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    tableau(y.tableau),
+    working_cost(y.working_cost),
+    mapping(y.mapping),
+    base(y.base),
+    status(y.status),
+    pricing(y.pricing),
+    initialized(y.initialized),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(),
+    input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode),
+    last_generator(y.last_generator),
+    i_variables(y.i_variables) {
+  input_cs.reserve(y.input_cs.size());
+  for (Constraint_Sequence::const_iterator i = y.input_cs.begin(),
+         i_end = y.input_cs.end(); i != i_end; ++i)
+    add_constraint_helper(*(*i));
+  PPL_ASSERT(OK());
+}
+
+inline
+MIP_Problem::MIP_Problem(const MIP_Problem& y, Inherit_Constraints)
+  : external_space_dim(y.external_space_dim),
+    internal_space_dim(y.internal_space_dim),
+    tableau(y.tableau),
+    working_cost(y.working_cost),
+    mapping(y.mapping),
+    base(y.base),
+    status(y.status),
+    pricing(y.pricing),
+    initialized(y.initialized),
+    input_cs(y.input_cs),
+    // NOTE: The constraints are inherited, NOT copied!
+    inherited_constraints(y.input_cs.size()),
+    first_pending_constraint(y.first_pending_constraint),
+    input_obj_function(y.input_obj_function),
+    opt_mode(y.opt_mode),
+    last_generator(y.last_generator),
+    i_variables(y.i_variables) {
+  PPL_ASSERT(OK());
+}
+
+inline void
+MIP_Problem::add_constraint_helper(const Constraint& c) {
+  // For exception safety, reserve space for the new element.
+  const dimension_type size = input_cs.size();
+  if (size == input_cs.capacity()) {
+    const dimension_type max_size = input_cs.max_size();
+    if (size == max_size)
+      throw std::length_error("MIP_Problem::add_constraint(): "
+                              "too many constraints");
+    // Use an exponential grow policy to avoid too many reallocations.
+    input_cs.reserve(compute_capacity(size + 1, max_size));
+  }
+
+  // This operation does not throw, because the space for the new element
+  // has already been reserved: hence the new-ed Constraint is safe.
+  input_cs.push_back(new Constraint(c));
+}
+
+inline
+MIP_Problem::~MIP_Problem() {
+  // NOTE: do NOT delete inherited constraints; they are owned
+  // (and will eventually be deleted) by ancestors.
+  for (Constraint_Sequence::const_iterator
+         i = nth_iter(input_cs, inherited_constraints),
+         i_end = input_cs.end(); i != i_end; ++i)
+    delete *i;
+}
+
+
+inline void
+MIP_Problem::set_optimization_mode(const Optimization_Mode mode) {
+  if (opt_mode != mode) {
+    opt_mode = mode;
+    if (status == UNBOUNDED || status == OPTIMIZED)
+      status = SATISFIABLE;
+    PPL_ASSERT(OK());
+  }
+}
+
+inline const Linear_Expression&
+MIP_Problem::objective_function() const {
+  return input_obj_function;
+}
+
+inline Optimization_Mode
+MIP_Problem::optimization_mode() const {
+  return opt_mode;
+}
+
+inline void
+MIP_Problem::optimal_value(Coefficient& numer, Coefficient& denom) const {
+  const Generator& g = optimizing_point();
+  evaluate_objective_function(g, numer, denom);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_begin() const {
+  return const_iterator(input_cs.begin());
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::constraints_end() const {
+  return const_iterator(input_cs.end());
+}
+
+inline const Variables_Set&
+MIP_Problem::integer_space_dimensions() const {
+  return i_variables;
+}
+
+inline MIP_Problem::Control_Parameter_Value
+MIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+  PPL_USED(name);
+  PPL_ASSERT(name == PRICING);
+  return pricing;
+}
+
+inline void
+MIP_Problem::set_control_parameter(Control_Parameter_Value value) {
+  pricing = value;
+}
+
+inline void
+MIP_Problem::m_swap(MIP_Problem& y) {
+  using std::swap;
+  swap(external_space_dim, y.external_space_dim);
+  swap(internal_space_dim, y.internal_space_dim);
+  swap(tableau, y.tableau);
+  swap(working_cost, y.working_cost);
+  swap(mapping, y.mapping);
+  swap(initialized, y.initialized);
+  swap(base, y.base);
+  swap(status, y.status);
+  swap(pricing, y.pricing);
+  swap(input_cs, y.input_cs);
+  swap(inherited_constraints, y.inherited_constraints);
+  swap(first_pending_constraint, y.first_pending_constraint);
+  swap(input_obj_function, y.input_obj_function);
+  swap(opt_mode, y.opt_mode);
+  swap(last_generator, y.last_generator);
+  swap(i_variables, y.i_variables);
+}
+
+inline MIP_Problem&
+MIP_Problem::operator=(const MIP_Problem& y) {
+  MIP_Problem tmp(y);
+  m_swap(tmp);
+  return *this;
+}
+
+inline void
+MIP_Problem::clear() {
+  MIP_Problem tmp;
+  m_swap(tmp);
+}
+
+
+inline memory_size_type
+MIP_Problem::external_memory_in_bytes() const {
+  memory_size_type n
+    = working_cost.external_memory_in_bytes()
+    + tableau.external_memory_in_bytes()
+    + input_obj_function.external_memory_in_bytes()
+    + last_generator.external_memory_in_bytes();
+
+  // Adding the external memory for `input_cs'.
+  // NOTE: disregard inherited constraints, as they are owned by ancestors.
+  n += input_cs.capacity() * sizeof(Constraint*);
+  for (Constraint_Sequence::const_iterator
+         i = nth_iter(input_cs, inherited_constraints),
+         i_end = input_cs.end(); i != i_end; ++i)
+    n += ((*i)->total_memory_in_bytes());
+
+  // Adding the external memory for `base'.
+  n += base.capacity() * sizeof(dimension_type);
+  // Adding the external memory for `mapping'.
+  n += mapping.capacity() * sizeof(std::pair<dimension_type, dimension_type>);
+  return n;
+}
+
+inline memory_size_type
+MIP_Problem::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+MIP_Problem::const_iterator::const_iterator(Base base)
+  : itr(base) {
+}
+
+inline MIP_Problem::const_iterator::difference_type
+MIP_Problem::const_iterator::operator-(const const_iterator& y) const {
+  return itr - y.itr;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator++() {
+  ++itr;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator--() {
+  --itr;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator++(int) {
+  const_iterator x = *this;
+  operator++();
+  return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator--(int) {
+  const_iterator x = *this;
+  operator--();
+  return x;
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator+(difference_type n) const {
+  return const_iterator(itr + n);
+}
+
+inline MIP_Problem::const_iterator
+MIP_Problem::const_iterator::operator-(difference_type n) const {
+  return const_iterator(itr - n);
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator+=(difference_type n) {
+  itr += n;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator&
+MIP_Problem::const_iterator::operator-=(difference_type n) {
+  itr -= n;
+  return *this;
+}
+
+inline MIP_Problem::const_iterator::reference
+MIP_Problem::const_iterator::operator*() const {
+  return *(*itr);
+}
+
+inline MIP_Problem::const_iterator::pointer
+MIP_Problem::const_iterator::operator->() const {
+  return *itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator==(const const_iterator& y) const {
+  return itr == y.itr;
+}
+
+inline bool
+MIP_Problem::const_iterator::operator!=(const const_iterator& y) const {
+  return itr != y.itr;
+}
+
+/*! \relates MIP_Problem */
+inline void
+swap(MIP_Problem& x, MIP_Problem& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_templates.hh line 1. */
+/* MIP_Problem class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_templates.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+MIP_Problem::MIP_Problem(const dimension_type dim,
+                         In first, In last,
+                         const Variables_Set& int_vars,
+                         const Linear_Expression& obj,
+                         const Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    pricing(PRICING_STEEPEST_EDGE_FLOAT),
+    initialized(false),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables(int_vars) {
+  // Check that integer Variables_Set does not exceed the space dimension
+  // of the problem.
+  if (i_variables.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem"
+      << "(dim, first, last, int_vars, obj, mode):\n"
+      << "dim == "<< external_space_dim << " and int_vars.space_dimension() =="
+      << " " << i_variables.space_dimension() << " are dimension"
+      "incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem:: MIP_Problem(dim, first, "
+                            "last, int_vars, obj, mode):\n"
+                            "dim exceeds the maximum allowed"
+                            "space dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+      << "int_vars, obj, mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds d == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraints.
+  try {
+    for (In i = first; i != last; ++i) {
+      if (i->is_strict_inequality())
+        throw std::invalid_argument("PPL::MIP_Problem::"
+                                    "MIP_Problem(dim, first, last, int_vars,"
+                                    "obj, mode):\nrange [first, last) contains"
+                                    "a strict inequality constraint.");
+      if (i->space_dimension() > dim) {
+        std::ostringstream s;
+        s << "PPL::MIP_Problem::"
+          << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+          << "range [first, last) contains a constraint having space"
+          << "dimension  == " << i->space_dimension() << " that exceeds"
+          "this->space_dimension == " << dim << ".";
+        throw std::invalid_argument(s.str());
+      }
+      add_constraint_helper(*i);
+    }
+  } catch (...) {
+    // Delete the allocated constraints, to avoid memory leaks.
+
+    for (Constraint_Sequence::const_iterator
+          i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+      delete *i;
+
+    throw;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename In>
+MIP_Problem::MIP_Problem(dimension_type dim,
+                         In first, In last,
+                         const Linear_Expression& obj,
+                         Optimization_Mode mode)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    tableau(),
+    working_cost(0),
+    mapping(),
+    base(),
+    status(PARTIALLY_SATISFIABLE),
+    pricing(PRICING_STEEPEST_EDGE_FLOAT),
+    initialized(false),
+    input_cs(),
+    inherited_constraints(0),
+    first_pending_constraint(0),
+    input_obj_function(obj),
+    opt_mode(mode),
+    last_generator(point()),
+    i_variables() {
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::MIP_Problem::"
+                            "MIP_Problem(dim, first, last, obj, mode):\n"
+                            "dim exceeds the maximum allowed space "
+                            "dimension.");
+  // Check the objective function.
+  if (obj.space_dimension() > dim) {
+    std::ostringstream s;
+    s << "PPL::MIP_Problem::MIP_Problem(dim, first, last,"
+      << " obj, mode):\n"
+      << "obj.space_dimension() == "<< obj.space_dimension()
+      << " exceeds d == "<< dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // Check the constraints.
+  try {
+    for (In i = first; i != last; ++i) {
+      if (i->is_strict_inequality())
+        throw std::invalid_argument("PPL::MIP_Problem::"
+                                    "MIP_Problem(dim, first, last, obj, mode):"
+                                    "\n"
+                                    "range [first, last) contains a strict "
+                                    "inequality constraint.");
+      if (i->space_dimension() > dim) {
+        std::ostringstream s;
+        s << "PPL::MIP_Problem::"
+          << "MIP_Problem(dim, first, last, obj, mode):\n"
+          << "range [first, last) contains a constraint having space"
+          << "dimension" << " == " << i->space_dimension() << " that exceeds"
+          "this->space_dimension == " << dim << ".";
+        throw std::invalid_argument(s.str());
+      }
+      add_constraint_helper(*i);
+    }
+  } catch (...) {
+    // Delete the allocated constraints, to avoid memory leaks.
+
+    for (Constraint_Sequence::const_iterator
+          i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+      delete *i;
+
+    throw;
+  }
+  PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/MIP_Problem_defs.hh line 974. */
+
+/* Automatically generated from PPL source file ../src/Polyhedron_templates.hh line 31. */
+// For static method overflows.
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Floating_Point_Expression class and its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_defs.hh line 31. */
+#include <cmath>
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \ingroup PPL_CXX_Interface \brief
+  A floating point expression on a given format.
+
+  This class represents a concrete <EM>floating point expression</EM>. This
+  includes constants, floating point variables, binary and unary
+  arithmetic operators.
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain. The interval bounds
+  should have a floating point type.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+  This parameter must be a struct similar to the ones defined in file
+  Float_defs.hh, even though it is sufficient to define the three
+  fields BASE, MANTISSA_BITS and EXPONENT_BIAS.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Floating_Point_Expression {
+
+public:
+
+  //! Alias for a linear form with template argument \p FP_Interval_Type.
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  //! Alias for a map that associates a variable index to an interval.
+  /*! \brief
+    Alias for a Box storing lower and upper bounds for floating point
+    variables.
+
+    The type a linear form abstract store associating each variable with an
+    interval that correctly approximates its value.
+  */
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+
+  //! Alias for a map that associates a variable index to a linear form.
+  /*!
+    The type a linear form abstract store associating each variable with a
+    linear form that correctly approximates its value.
+  */
+  typedef std::map<dimension_type, FP_Linear_Form>
+          FP_Linear_Form_Abstract_Store;
+
+  //! The floating point format used by the analyzer.
+  typedef typename FP_Interval_Type::boundary_type boundary_type;
+
+  //! The interval policy used by \p FP_Interval_Type.
+  typedef typename FP_Interval_Type::info_type info_type;
+
+  //! Destructor.
+  virtual ~Floating_Point_Expression();
+
+  //! Linearizes a floating point expression.
+  /*! \brief
+    Makes \p result become a linear form that correctly approximates the
+    value of the floating point expression in the given composite
+    abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result Becomes the linearized expression.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Formally, if \p *this represents the expression \f$e\f$,
+    \p int_store represents the interval abstract store \f$\rho^{\#}\f$ and
+    \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+    then \p result will become
+    \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+    if the linearization succeeds.
+
+    All variables occurring in the floating point expression MUST have
+    an associated interval in \p int_store.
+    If this precondition is not met, calling the method causes an
+    undefined behavior.
+  */
+  virtual bool linearize(const FP_Interval_Abstract_Store& int_store,
+                         const FP_Linear_Form_Abstract_Store& lf_store,
+                         FP_Linear_Form& result) const = 0;
+
+  /*! \brief
+    Absolute error.
+
+    Represents the interval \f$[-\omega, \omega]\f$ where \f$\omega\f$ is the
+    smallest non-zero positive number in the less precise floating point
+    format between the analyzer format and the analyzed format.
+
+  */
+  static FP_Interval_Type absolute_error;
+
+  // FIXME: this may not be the best place for them.
+  /*! \brief
+    Verifies if a given linear form overflows.
+    \param lf The linear form to verify.
+    \return
+    Returns <CODE>false</CODE> if all coefficients in \p lf are bounded,
+    <CODE>true</CODE> otherwise.
+  */
+  static bool overflows(const FP_Linear_Form& lf);
+
+  /*! \brief
+    Computes the relative error of a given linear form.
+
+    Static helper method that is used by <CODE>linearize</CODE>
+    to account for the relative errors on \p lf.
+    \param lf The linear form used to compute the relative error.
+    \param result Becomes the linear form corresponding to a relative
+    error committed on \p lf.
+
+    This method makes <CODE>result</CODE> become a linear form
+    obtained by evaluating the function \f$\varepsilon_{\mathbf{f}}(l)\f$
+    on the linear form \p lf. This function is defined
+    such as:
+    \f[
+    \varepsilon_{\mathbf{f}}\left([a, b]+\sum_{v \in \cV}[a_{v}, b_{v}]v\right)
+    \defeq
+    (\textrm{max}(|a|, |b|) \amifp [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])
+    +
+    \sum_{v \in \cV}(\textrm{max}(|a_{v}|,|b_{v}|)
+    \amifp
+    [-\beta^{-\textrm{p}}, \beta^{-\textrm{p}}])v
+    \f]
+    where p is the fraction size in bits for the format \f$\mathbf{f}\f$ and
+    \f$\beta\f$ the base.
+  */
+  static void relative_error(const FP_Linear_Form& lf,
+                             FP_Linear_Form& result);
+
+  /*! \brief
+    Makes \p result become an interval that overapproximates all the
+    possible values of \p lf in the interval abstract store \p store.
+
+    \param lf The linear form to aproximate.
+    \param store The abstract store.
+    \param result The linear form that will be modified.
+
+    This method makes <CODE>result</CODE> become
+    \f$\iota(lf)\rho^{\#}\f$, that is an interval defined as:
+    \f[
+    \iota\left(i + \sum_{v \in \cV}i_{v}v\right)\rho^{\#}
+    \defeq
+    i \asifp \left(\bigoplus_{v \in \cV}{}^{\#}i_{v} \amifp
+    \rho^{\#}(v)\right)
+    \f]
+  */
+  static void intervalize(const FP_Linear_Form& lf,
+                          const FP_Interval_Abstract_Store& store,
+                          FP_Interval_Type& result);
+
+private:
+
+  /*! \brief
+    Computes the absolute error.
+
+    Static helper method that is used to compute the value of the public
+    static field <CODE>absolute_error</CODE>.
+
+    \return The interval \f$[-\omega, \omega]\f$ corresponding to the value
+    of <CODE>absolute_error</CODE>
+  */
+  static FP_Interval_Type compute_absolute_error();
+
+}; // class Floating_Point_Expression
+
+
+template <typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::absolute_error = compute_absolute_error();
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_inlines.hh line 1. */
+/* Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::overflows(const FP_Linear_Form& lf) {
+  if (!lf.inhomogeneous_term().is_bounded())
+    return true;
+
+  dimension_type dimension = lf.space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    if (!lf.coefficient(Variable(i)).is_bounded())
+      return true;
+  }
+
+  return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_templates.hh line 1. */
+/* Floating_Point_Expression class implementation:
+   non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_templates.hh line 29. */
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::relative_error(const FP_Linear_Form& lf, FP_Linear_Form& result) {
+
+  FP_Interval_Type error_propagator;
+  boundary_type lb = -pow(FP_Format::BASE,
+  -static_cast<typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::boundary_type>(FP_Format::MANTISSA_BITS));
+  error_propagator.build(i_constraint(GREATER_OR_EQUAL, lb),
+                         i_constraint(LESS_OR_EQUAL, -lb));
+
+  // Handle the inhomogeneous term.
+  const FP_Interval_Type* current_term = &lf.inhomogeneous_term();
+  assert(current_term->is_bounded());
+
+  FP_Interval_Type
+    current_multiplier(std::max(std::abs(current_term->lower()),
+                                std::abs(current_term->upper())));
+  FP_Linear_Form current_result_term(current_multiplier);
+  current_result_term *= error_propagator;
+  result = FP_Linear_Form(current_result_term);
+
+  // Handle the other terms.
+  dimension_type dimension = lf.space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    current_term = &lf.coefficient(Variable(i));
+    assert(current_term->is_bounded());
+    current_multiplier
+      = FP_Interval_Type(std::max(std::abs(current_term->lower()),
+                                  std::abs(current_term->upper())));
+    current_result_term = FP_Linear_Form(Variable(i));
+    current_result_term *= current_multiplier;
+    current_result_term *= error_propagator;
+    result += current_result_term;
+  }
+
+  return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+void
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::intervalize(const FP_Linear_Form& lf,
+              const FP_Interval_Abstract_Store& store,
+              FP_Interval_Type& result) {
+  result = FP_Interval_Type(lf.inhomogeneous_term());
+  dimension_type dimension = lf.space_dimension();
+  assert(dimension <= store.space_dimension());
+  for (dimension_type i = 0; i < dimension; ++i) {
+    FP_Interval_Type current_addend = lf.coefficient(Variable(i));
+    const FP_Interval_Type& curr_int = store.get_interval(Variable(i));
+    current_addend *= curr_int;
+    result += current_addend;
+  }
+
+  return;
+}
+
+template<typename FP_Interval_Type, typename FP_Format>
+FP_Interval_Type
+Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::compute_absolute_error() {
+  typedef typename Floating_Point_Expression<FP_Interval_Type, FP_Format>
+    ::boundary_type Boundary;
+  boundary_type omega;
+  omega = std::max(pow(static_cast<Boundary>(FP_Format::BASE),
+                       static_cast<Boundary>(1 - FP_Format::EXPONENT_BIAS
+                                             - FP_Format::MANTISSA_BITS)),
+                   std::numeric_limits<Boundary>::denorm_min());
+  FP_Interval_Type result;
+  result.build(i_constraint(GREATER_OR_EQUAL, -omega),
+               i_constraint(LESS_OR_EQUAL, omega));
+  return result;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Floating_Point_Expression_defs.hh line 211. */
+
+/* Automatically generated from PPL source file ../src/Polyhedron_templates.hh line 33. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Polyhedron::Polyhedron(Topology topol,
+                       const Box<Interval>& box,
+                       Complexity_Class)
+  : con_sys(topol, default_con_sys_repr),
+    gen_sys(topol, default_gen_sys_repr),
+    sat_c(),
+    sat_g() {
+  // Initialize the space dimension as indicated by the box.
+  space_dim = box.space_dimension();
+
+  // Check for emptiness.
+  if (box.is_empty()) {
+    set_empty();
+    return;
+  }
+
+  // Zero-dim universe polyhedron.
+  if (space_dim == 0) {
+    set_zero_dim_univ();
+    return;
+  }
+
+  // Properly set the space dimension of `con_sys'.
+  con_sys.set_space_dimension(space_dim);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+  if (topol == NECESSARILY_CLOSED) {
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      const Variable v_k = Variable(k);
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * v_k == l_n);
+      }
+      else {
+        if (l_bounded)
+          // Add the constraint `l_d*v_k >= l_n'.
+          con_sys.insert(l_d * v_k >= l_n);
+        if (u_bounded)
+          // Add the constraint `u_d*v_k <= u_n'.
+          con_sys.insert(u_d * v_k <= u_n);
+      }
+    }
+  }
+  else {
+    // topol == NOT_NECESSARILY_CLOSED
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      const Variable v_k = Variable(k);
+      // See if we have a valid lower bound.
+      bool l_closed = false;
+      bool l_bounded = box.has_lower_bound(v_k, l_n, l_d, l_closed);
+      // See if we have a valid upper bound.
+      bool u_closed = false;
+      bool u_bounded = box.has_upper_bound(v_k, u_n, u_d, u_closed);
+
+      // See if we have an implicit equality constraint.
+      if (l_bounded && u_bounded
+          && l_closed && u_closed
+          && l_n == u_n && l_d == u_d) {
+        // Add the constraint `l_d*v_k == l_n'.
+        con_sys.insert(l_d * v_k == l_n);
+      }
+      else {
+        // Check if a lower bound constraint is required.
+        if (l_bounded) {
+          if (l_closed)
+            // Add the constraint `l_d*v_k >= l_n'.
+            con_sys.insert(l_d * v_k >= l_n);
+          else
+            // Add the constraint `l_d*v_k > l_n'.
+            con_sys.insert(l_d * v_k > l_n);
+        }
+        // Check if an upper bound constraint is required.
+        if (u_bounded) {
+          if (u_closed)
+            // Add the constraint `u_d*v_k <= u_n'.
+            con_sys.insert(u_d * v_k <= u_n);
+          else
+            // Add the constraint `u_d*v_k < u_n'.
+            con_sys.insert(u_d * v_k < u_n);
+        }
+      }
+    }
+  }
+
+  // Adding the low-level constraints.
+  con_sys.add_low_level_constraints();
+
+  // Constraints are up-to-date.
+  set_constraints_up_to_date();
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename Partial_Function>
+void
+Polyhedron::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the polyhedron becomes zero_dimensional.
+    if (marked_empty()
+        || (has_pending_constraints()
+            && !remove_pending_to_obtain_generators())
+        || (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty polyhedron.
+      space_dim = 0;
+      con_sys.clear();
+    }
+    else
+      // Removing all dimensions from a non-empty polyhedron.
+      set_zero_dim_univ();
+
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  const dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    std::vector<Variable> cycle;
+    cycle.reserve(space_dim);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (visited[i])
+        continue;
+
+      dimension_type j = i;
+      do {
+        visited[j] = true;
+        // The following initialization is only to make the compiler happy.
+        dimension_type k = 0;
+        if (!pfunc.maps(j, k))
+          throw_invalid_argument("map_space_dimensions(pfunc)",
+                                 " pfunc is inconsistent");
+        if (k == j)
+          break;
+
+        cycle.push_back(Variable(j));
+        // Go along the cycle.
+        j = k;
+      } while (!visited[j]);
+
+      // End of cycle.
+
+      // Permute all that is up-to-date.  Notice that the contents of
+      // the saturation matrices is unaffected by the permutation of
+      // columns: they remain valid, if they were so.
+      if (constraints_are_up_to_date())
+        con_sys.permute_space_dimensions(cycle);
+
+      if (generators_are_up_to_date())
+        gen_sys.permute_space_dimensions(cycle);
+
+      cycle.clear();
+    }
+
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  // If there are pending constraints, using `generators()' we process them.
+  const Generator_System& old_gensys = generators();
+
+  if (old_gensys.has_no_rows()) {
+    // The polyhedron is empty.
+    Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+    m_swap(new_polyhedron);
+    PPL_ASSERT_HEAVY(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Generator_System new_gensys;
+  for (Generator_System::const_iterator i = old_gensys.begin(),
+         old_gensys_end = old_gensys.end(); i != old_gensys_end; ++i) {
+    const Generator& old_g = *i;
+    const Generator::expr_type old_e = old_g.expression();
+    Linear_Expression expr;
+    expr.set_space_dimension(new_space_dimension);
+    bool all_zeroes = true;
+    for (Generator::expr_type::const_iterator j = old_e.begin(),
+          j_end = old_e.end(); j != j_end; ++j) {
+      const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+      if (mapped_id != not_a_dimension()) {
+        add_mul_assign(expr, *j, Variable(mapped_id));
+        all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Generator::LINE:
+      if (!all_zeroes)
+        new_gensys.insert(line(expr));
+      break;
+    case Generator::RAY:
+      if (!all_zeroes)
+        new_gensys.insert(ray(expr));
+      break;
+    case Generator::POINT:
+      // A point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(point(expr, old_g.divisor()));
+      break;
+    case Generator::CLOSURE_POINT:
+      // A closure point in the origin has all zero homogeneous coefficients.
+      new_gensys.insert(closure_point(expr, old_g.divisor()));
+      break;
+    }
+  }
+  Polyhedron new_polyhedron(topology(), new_gensys);
+  m_swap(new_polyhedron);
+  PPL_ASSERT_HEAVY(OK(true));
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::refine_with_linear_form_inequality(
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& left,
+  const Linear_Form< Interval<FP_Format, Interval_Info> >& right,
+  const bool is_strict) {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                         "Polyhedron::refine_with_linear_form_inequality:"
+                         " FP_Format not a floating point type.");
+
+  // Dimension compatibility checks.
+  // The dimensions of left and right should not be greater than the
+  // dimension of *this.
+  const dimension_type left_space_dim = left.space_dimension();
+  if (space_dim < left_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(l1, l2, s)", "l1", left);
+
+  const dimension_type right_space_dim = right.space_dimension();
+  if (space_dim < right_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(l1, l2, s)", "l2", right);
+
+  // We assume that the analyzer will not refine an unreachable test.
+  PPL_ASSERT(!marked_empty());
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(left))
+    return;
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(right))
+    return;
+
+  // Overapproximate left - right.
+  FP_Linear_Form left_minus_right(left);
+  left_minus_right -= right;
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(left_minus_right))
+    return;
+
+  dimension_type lf_space_dim = left_minus_right.space_dimension();
+  FP_Linear_Form lf_approx;
+  overapproximate_linear_form(left_minus_right, lf_space_dim, lf_approx);
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(lf_approx))
+    return;
+
+  // Normalize left - right.
+  Linear_Expression lf_approx_le;
+  convert_to_integer_expression(lf_approx, lf_space_dim, lf_approx_le);
+
+  // Finally, do the refinement.
+  if (!is_strict || is_necessarily_closed())
+    refine_with_constraint(lf_approx_le <= 0);
+  else
+    refine_with_constraint(lf_approx_le < 0);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::affine_form_image(const Variable var,
+const Linear_Form<Interval <FP_Format, Interval_Info> >& lf) {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                         "Polyhedron::affine_form_image:"
+                         " FP_Format not a floating point type.");
+
+  // Dimension compatibility checks.
+  // The dimension of lf should not be greater than the dimension of *this.
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(v, l, s)", "l", lf);
+
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_form_image(v, l, s)", "v", var);
+
+  // We assume that the analyzer will not perform an unreachable assignment.
+  PPL_ASSERT(!marked_empty());
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(lf)) {
+    *this = Polyhedron(topology(), space_dim, UNIVERSE);
+    return;
+  }
+
+  // Overapproximate lf.
+  FP_Linear_Form lf_approx;
+  overapproximate_linear_form(lf, lf_space_dim, lf_approx);
+
+  if (Floating_Point_Expression<FP_Interval_Type, float_ieee754_single>::
+      overflows(lf_approx)) {
+    *this = Polyhedron(topology(), space_dim, UNIVERSE);
+    return;
+  }
+
+  // Normalize lf.
+  Linear_Expression lf_approx_le;
+  PPL_DIRTY_TEMP_COEFFICIENT(lo_coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(hi_coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(denominator);
+  convert_to_integer_expressions(lf_approx, lf_space_dim, lf_approx_le,
+                                 lo_coeff, hi_coeff, denominator);
+
+  // Finally, do the assignment.
+  bounded_affine_image(var, lf_approx_le + lo_coeff, lf_approx_le + hi_coeff,
+                       denominator);
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::overapproximate_linear_form
+(const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+ const dimension_type lf_dimension,
+ Linear_Form<Interval <FP_Format, Interval_Info> >& result) {
+
+  // Check that FP_Format is indeed a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<FP_Format>::is_exact,
+                         "Polyhedron::overapproximate_linear_form:"
+                         " FP_Format not a floating point type.");
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+
+  // Build a Box from the Polyhedron so that we can extract upper and
+  // lower bounds of variables easily.
+  Box<FP_Interval_Type> box(*this);
+
+  result = FP_Linear_Form(lf.inhomogeneous_term());
+  // FIXME: this may not be policy-neutral.
+  const FP_Interval_Type aux_divisor1(static_cast<FP_Format>(0.5));
+  FP_Interval_Type aux_divisor2(aux_divisor1);
+  aux_divisor2.lower() = static_cast<FP_Format>(-0.5);
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    Variable curr_var(i);
+    const FP_Interval_Type& curr_coeff = lf.coefficient(curr_var);
+    PPL_ASSERT(curr_coeff.is_bounded());
+    FP_Format curr_lb = curr_coeff.lower();
+    FP_Format curr_ub = curr_coeff.upper();
+    if (curr_lb != 0 || curr_ub != 0) {
+      const FP_Interval_Type& curr_int = box.get_interval(curr_var);
+      FP_Interval_Type curr_addend(curr_ub - curr_lb);
+      curr_addend *= aux_divisor2;
+      curr_addend *= curr_int;
+      result += curr_addend;
+      curr_addend = FP_Interval_Type(curr_lb + curr_ub);
+      curr_addend *= aux_divisor1;
+      FP_Linear_Form curr_addend_lf(curr_var);
+      curr_addend_lf *= curr_addend;
+      result += curr_addend_lf;
+    }
+  }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expression(
+                const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+                const dimension_type lf_dimension,
+                Linear_Expression& result) {
+  result = Linear_Expression();
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  std::vector<Coefficient> numerators(lf_dimension+1);
+  std::vector<Coefficient> denominators(lf_dimension+1);
+
+  // Convert each floating point number to a pair <numerator, denominator>
+  // and compute the lcm of all denominators.
+  PPL_DIRTY_TEMP_COEFFICIENT(lcm);
+  lcm = 1;
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+  // FIXME: are these checks numerator[i] != 0 really necessary?
+  numer_denom(b.lower(), numerators[lf_dimension],
+                         denominators[lf_dimension]);
+  if (numerators[lf_dimension] != 0)
+      lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+    numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+    if (numerators[i] != 0)
+      lcm_assign(lcm, lcm, denominators[i]);
+  }
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    if (numerators[i] != 0) {
+      exact_div_assign(denominators[i], lcm, denominators[i]);
+      numerators[i] *= denominators[i];
+      result += numerators[i] * Variable(i);
+    }
+  }
+
+  if (numerators[lf_dimension] != 0) {
+    exact_div_assign(denominators[lf_dimension],
+                     lcm, denominators[lf_dimension]);
+    numerators[lf_dimension] *= denominators[lf_dimension];
+    result += numerators[lf_dimension];
+  }
+}
+
+template <typename FP_Format, typename Interval_Info>
+void
+Polyhedron::convert_to_integer_expressions(
+                const Linear_Form<Interval <FP_Format, Interval_Info> >& lf,
+                const dimension_type lf_dimension, Linear_Expression& res,
+                Coefficient& res_low_coeff, Coefficient& res_hi_coeff,
+                Coefficient& denominator) {
+  res = Linear_Expression();
+
+  typedef Interval<FP_Format, Interval_Info> FP_Interval_Type;
+  std::vector<Coefficient> numerators(lf_dimension+2);
+  std::vector<Coefficient> denominators(lf_dimension+2);
+
+  // Convert each floating point number to a pair <numerator, denominator>
+  // and compute the lcm of all denominators.
+  Coefficient& lcm = denominator;
+  lcm = 1;
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+  numer_denom(b.lower(), numerators[lf_dimension], denominators[lf_dimension]);
+  // FIXME: are these checks numerator[i] != 0 really necessary?
+  if (numerators[lf_dimension] != 0)
+      lcm_assign(lcm, lcm, denominators[lf_dimension]);
+
+  numer_denom(b.upper(), numerators[lf_dimension+1],
+                         denominators[lf_dimension+1]);
+  if (numerators[lf_dimension+1] != 0)
+      lcm_assign(lcm, lcm, denominators[lf_dimension+1]);
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    const FP_Interval_Type& curr_int = lf.coefficient(Variable(i));
+    numer_denom(curr_int.lower(), numerators[i], denominators[i]);
+    if (numerators[i] != 0)
+      lcm_assign(lcm, lcm, denominators[i]);
+  }
+
+  for (dimension_type i = 0; i < lf_dimension; ++i) {
+    if (numerators[i] != 0) {
+      exact_div_assign(denominators[i], lcm, denominators[i]);
+      numerators[i] *= denominators[i];
+      res += numerators[i] * Variable(i);
+    }
+  }
+
+  if (numerators[lf_dimension] != 0) {
+    exact_div_assign(denominators[lf_dimension],
+                     lcm, denominators[lf_dimension]);
+    numerators[lf_dimension] *= denominators[lf_dimension];
+    res_low_coeff = numerators[lf_dimension];
+  }
+  else
+    res_low_coeff = Coefficient(0);
+
+  if (numerators[lf_dimension+1] != 0) {
+    exact_div_assign(denominators[lf_dimension+1],
+                     lcm, denominators[lf_dimension+1]);
+    numerators[lf_dimension+1] *= denominators[lf_dimension+1];
+    res_hi_coeff = numerators[lf_dimension+1];
+  }
+  else
+    res_hi_coeff = Coefficient(0);
+}
+
+template <typename C>
+void
+Polyhedron::throw_dimension_incompatible(const char* method,
+                                         const char* lf_name,
+                                         const Linear_Form<C>& lf) const {
+  throw_dimension_incompatible(method, lf_name, lf.space_dimension());
+}
+
+template <typename Input>
+Input&
+Polyhedron::check_obj_space_dimension_overflow(Input& input,
+                                               const Topology topol,
+                                               const char* method,
+                                               const char* reason) {
+  check_space_dimension_overflow(input.space_dimension(),
+                                 max_space_dimension(),
+                                 topol, method, reason);
+  return input;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_chdims_templates.hh line 1. */
+/* Polyhedron class implementation (non-inline template operators that
+   may change the dimension of the vector space).
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Linear_System1, typename Linear_System2>
+void
+Polyhedron::add_space_dimensions(Linear_System1& sys1,
+                                 Linear_System2& sys2,
+                                 Bit_Matrix& sat1,
+                                 Bit_Matrix& sat2,
+                                 dimension_type add_dim) {
+
+  typedef typename Linear_System2::row_type sys2_row_type;
+
+  PPL_ASSERT(sys1.topology() == sys2.topology());
+  PPL_ASSERT(sys1.space_dimension() == sys2.space_dimension());
+  PPL_ASSERT(add_dim != 0);
+
+  sys1.set_space_dimension(sys1.space_dimension() + add_dim);
+  sys2.add_universe_rows_and_space_dimensions(add_dim);
+
+  // The resulting saturation matrix will be as follows:
+  // from row    0    to      add_dim-1       : only zeroes
+  //          add_dim     add_dim+num_rows-1  : old saturation matrix
+
+  // In fact all the old generators saturate all the new constraints
+  // because the polyhedron has not been embedded in the new space.
+  sat1.resize(sat1.num_rows() + add_dim, sat1.num_columns());
+  // The old matrix is moved to the end of the new matrix.
+  for (dimension_type i = sat1.num_rows() - add_dim; i-- > 0; )
+    swap(sat1[i], sat1[i+add_dim]);
+  // Computes the "sat_c", too.
+  sat2.transpose_assign(sat1);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_conversion_templates.hh line 1. */
+/* Polyhedron class implementation: conversion().
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_conversion_templates.hh line 34. */
+
+#include <cstddef>
+#include <climits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+  \return
+  The number of lines of the polyhedron or the number of equality
+  constraints in the result of conversion.
+
+  \param source
+  The system to use to convert \p dest: it may be modified;
+
+  \param start
+  The index of \p source row from which conversion begin;
+
+  \param dest
+  The result of the conversion;
+
+  \param sat
+  The saturation matrix telling us, for each row in \p source, which
+  are the rows of \p dest that satisfy but do not saturate it;
+
+  \param num_lines_or_equalities
+  The number of rows in the system \p dest that are either lines of
+  the polyhedron (when \p dest is a system of generators) or equality
+  constraints (when \p dest is a system of constraints).
+
+  \if Include_Implementation_Details
+
+  For simplicity, all the following comments assume we are converting a
+  constraint system \p source to a generator system \p dest;
+  the comments for the symmetric case can be obtained by duality.
+
+  If some of the constraints in \p source are redundant, they will be removed.
+  This is why the \p source is not declared to be a constant parameter.
+
+  If \p start is 0, then \p source is a sorted system; also, \p dest is
+  a generator system corresponding to an empty constraint system.
+  If otherwise \p start is greater than 0, then the two sub-systems of
+  \p source made by the non-pending rows and the pending rows, respectively,
+  are both sorted; also, \p dest is the generator system corresponding to
+  the non-pending constraints of \p source.
+
+  Independently from the value of \p start, \p dest has lines from index 0
+  to index \p num_lines_or_equalities - 1 and rays/points from index
+  \p num_lines_or_equalities to the last of its rows.
+
+  Note that here the rows of \p sat are indexed by rows of \p dest
+  and its columns are indexed by rows of \p source.
+
+  We know that polyhedra can be represented by both a system of
+  constraints or a system of generators (points, rays and lines)
+  (see Section \ref representation).
+  When we have both descriptions for a polyhedron \f$P\f$
+  we have what is called a <EM>double description</EM>
+  (or <EM>DD pair</EM>) for \f$P\f$.
+
+  Here, the <EM>representation system</EM> refers to the system \f$C\f$
+  whose rows represent the constraints that characterize \f$P\f$
+  and the <EM>generating system</EM>, the system \f$G\f$ whose rows
+  represent the generators of \f$P\f$.
+  We say that a pair \f$(C, G)\f$ of (real) systems is
+  a <EM>double description pair</EM> if
+  \f[
+    C\vect{x} \geq \vect{0}
+      \quad\iff\quad
+        \exists \vect{\lambda} \geq \vect{0} \mathrel{.}
+        \vect{x} = G\vect{\lambda}.
+  \f]
+
+  The term "double description" is quite natural in the sense that
+  such a pair contains two different description of the same object.
+  In fact, if we refer to the cone representation of a polyhedron \f$P\f$
+  and we call \f$C\f$ and \f$G\f$ the systems of constraints and
+  rays respectively, we have
+  \f[
+    P = \{\, \vect{x} \in \Rset^n \mid C\vect{x} \geq \vect{0}\, \}
+      = \{\, \vect{x} \in \Rset^n \mid \vect{x} = G\vect{\lambda}
+      \text{ for some } \vect{\lambda} \geq \vect{0}\, \}.
+  \f]
+
+  Because of the theorem of Minkowski (see Section \ref prelims),
+  we can say that, given a \f$m \times n\f$ representation system
+  \f$C\f$ such that
+  \f$\mathop{\mathrm{rank}}(C) = n = \mathit{dimension of the whole space}\f$
+  for a non-empty polyhedron \f$P\f$,
+  it is always possible to find a generating system \f$G\f$ for \f$P\f$
+  such that \f$(C, G)\f$ is a DD pair.
+  Conversely, Weyl's theorem ensures that, for each generating system
+  \f$G\f$, it is possible to find a representation system \f$C\f$
+  such that \f$(C, G)\f$ is a DD pair.
+
+  For efficiency reasons, our representation of polyhedra makes use
+  of a double description.
+  We are thus left with two problems:
+    -# given \f$C\f$ find \f$G\f$ such that \f$(C, G)\f$ is a DD pair;
+    -# given \f$G\f$ find \f$C\f$ such that \f$(C, G)\f$ is a DD pair.
+
+  Using Farkas' Lemma we can prove that these two problems are
+  computationally equivalent (i.e., linear-time reducible to each other).
+  Farkas' Lemma establishes a fundamental property of vectors in
+  \f$\Rset^n\f$ that, in a sense, captures the essence of duality.
+  Consider a matrix \f$A \in \Rset^{m \times n}\f$ and let
+  \f$\{ \vect{a}_1, \ldots, \vect{a}_m \}\f$ be its set of row vectors.
+  Consider also another vector \f$\vect{c} \in \Rset^n\f$ such that,
+  whenever a vector \f$\vect{y} \in \Rset^n\f$ has a non-negative projection
+  on the \f$\vect{a}_i\f$'s, it also has a non-negative projection
+  on \f$\vect{c}\f$.
+  The lemma states that \f$\vect{c}\f$ has this property if and only if
+  it is in the cone generated by the \f$\vect{a}_i\f$'s.
+  Formally, the lemma states the equivalence of the two following
+  assertions:
+    -# \f$
+         \forall \vect{y}
+           \mathrel{:} (A\vect{y} \geq 0 \implies
+           \langle \vect{y},\vect{c} \rangle \geq 0)
+       \f$;
+    -# \f$
+         \exists \vect{\lambda} \geq \vect{0}
+           \mathrel{.} \vect{c}^\mathrm{T} = \vect{\lambda}^\mathrm{T}A
+       \f$.
+
+  With this result we can prove that \f$(C, G)\f$ is a DD pair
+  if and only if \f$(G^\mathrm{T}, C^\mathrm{T})\f$ is a DD pair.
+
+  Suppose \f$(C, G)\f$ is a DD pair.
+  Thus, for each \f$x\f$ of the appropriate dimension,
+  \f$C\vect{x} \geq \vect{0}\f$ if and only if
+  \f$\exists \lambda \geq 0 \mathrel{.} \vect{x} = G\vect{\lambda}\f$,
+  which is of course equivalent to
+  \f$
+    \exists \vect{\lambda} \geq \vect{0}
+      \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+  \f$.
+
+  First, we assume that \f$\vect{z}\f$ is such that
+  \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+  and we will show that
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+  Let \f$\vect{x}\f$ be such that \f$C\vect{x} \geq \vect{0}\f$.
+  Since \f$(C, G)\f$ is a DD pair, this is equivalent to
+  \f$
+    \exists \vect{\lambda} \geq \vect{0}
+      \mathrel{.} \vect{x}^\mathrm{T} = \vect{\lambda}^\mathrm{T}G^\mathrm{T}
+  \f$,
+  which, by Farkas' Lemma is equivalent to
+  \f$
+    \forall \vect{y} \mathrel{:} (G^\mathrm{T}\vect{y} \geq \vect{0} \implies
+                                 \langle \vect{y}, \vect{x} \rangle \geq 0)
+  \f$.
+  Taking \f$\vect{y} = \vect{z}\f$ and recalling our assumption that
+  \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$
+  we can conclude that \f$\langle \vect{z}, \vect{x} \rangle \geq 0\f$,
+  that is equivalent to \f$\langle \vect{x}, \vect{z} \rangle \geq 0\f$.
+  We have thus established that
+  \f$
+    \forall \vect{x} \mathrel{:} (C\vect{x} \geq \vect{0} \implies
+    \langle \vect{x}, \vect{z} \rangle \geq 0)
+  \f$.
+  By Farkas' Lemma, this is equivalent to
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T} C\f$,
+  which is equivalent to what we wanted to prove, that is,
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$.
+
+  In order to prove the reverse implication, the following observation
+  turns out to be useful:
+  when \f$(C, G)\f$ is a DD pair, \f$CG \geq 0\f$.
+  In fact,
+  let \f$\vect{e}_j\f$ be the vector whose components are all \f$0\f$
+  apart from the \f$j\f$-th one, which is \f$1\f$.
+  Clearly \f$\vect{e}_j \geq \vect{0}\f$ and, taking
+  \f$\vect{\lambda} = \vect{e}_j\f$ and
+  \f$\vect{x} = G\vect{\lambda} = G \vect{e}_j\f$, we have
+  \f$C\vect{x} = C(G \vect{e}_j) = (CG)\vect{e}_j \geq \vect{0}\f$,
+  since \f$(C, G)\f$ is a DD pair.
+  Thus, as \f$(CG)\vect{e}_j\f$ is the \f$j\f$-th column of \f$CG\f$
+  and since the choice of \f$j\f$ was arbitrary, \f$CG \geq \vect{0}\f$.
+
+  We now assume that \f$\vect{z}\f$ is such that
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z} = C^\mathrm{T}\vect{\mu}\f$
+  and we will prove that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$.
+  By Farkas' Lemma, the assumption
+  \f$\exists \vect{\mu} \geq \vect{0} \mathrel{.}
+  \vect{z}^\mathrm{T} = \vect{\mu}^\mathrm{T}C\f$,
+  is equivalent to
+  \f$\forall \vect{y} \mathrel{:} (C\vect{y} \geq \vect{0}
+  \implies \langle \vect{y}, \vect{z} \rangle \geq 0)\f$.
+  If we take \f$\vect{y} = G\vect{e}_j\f$ then \f$C\vect{y}
+                 = CG\vect{e}_j \geq 0\f$,
+  since \f$CG \geq \vect{0}\f$.
+  So
+  \f$
+    \langle \vect{y}, \vect{z} \rangle
+      = (\vect{e}_j^\mathrm{T}G^\mathrm{T}) \vect{z}
+      = \vect{e}_j^\mathrm{T}(G^\mathrm{T} \vect{z})
+      \geq 0
+  \f$,
+  that is, the \f$j\f$-th component of \f$G^\mathrm{T}\vect{z}\f$
+  is non-negative. The arbitrary choice of \f$j\f$ allows us to conclude
+  that \f$G^\mathrm{T}\vect{z} \geq \vect{0}\f$, as required.
+
+  In view of this result, the following exposition assumes, for clarity,
+  that the conversion being performed is from constraints to generators.
+  Thus, even if the roles of \p source and \p dest can be interchanged,
+  in the sequel we assume the \p source system will contain the constraints
+  that represent the polyhedron and the \p dest system will contain
+  the generator that generates it.
+
+  There are some observations that are useful to understand this function:
+
+  Observation 1: Let \f$A\f$ be a system of constraints that generate
+  the polyhedron \f$P\f$ and \f$\vect{c}\f$ a new constraint that must
+  be added. Suppose that there is a line \f$\vect{z}\f$ that does not
+  saturate the constraint \f$\vect{c}\f$. If we combine the old lines
+  and rays that do not saturate \f$\vect{c}\f$ (except \f$\vect{z}\f$)
+  with \f$\vect{z}\f$ such that the new ones saturate \f$\vect{c}\f$,
+  the new lines and rays also saturate the constraints  saturated by
+  the old lines and rays.
+
+  In fact, if \f$\vect{y}_1\f$ is the old generator that does not saturate
+  \f$\vect{c}\f$, \f$\vect{y}_2\f$ is the new one such that
+  \f[
+    \vect{y}_2 = \lambda \vect{y}_1 + \mu \vect{z}
+  \f]
+  and \f$\vect{c}_1\f$ is a previous constraint that \f$\vect{y}_1\f$
+  and \f$\vect{z}\f$ saturates, we can see
+  \f[
+    \langle \vect{c}_1, \vect{y}_2 \rangle
+    = \langle \vect{c}_1, (\lambda \vect{y}_1 + \mu \vect{z}) \rangle
+    = \lambda \langle \vect{c}_1, \vect{y}_1 \rangle
+       + \mu \langle \vect{c}_1, \vect{z} \rangle
+       = 0 + \mu \langle \vect{c}_1, \vect{z} \rangle
+       = \mu \langle \vect{c}_1, \vect{z} \rangle
+  \f]
+  and
+  \f[
+    \mu \langle \vect{c}_1, \vect{z} \rangle = 0.
+  \f]
+
+  Proposition 1: Let \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ be distinct
+  rays of \f$P\f$.
+  Then the following statements are equivalent:
+  a) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are adjacent extreme rays
+     (see Section \ref prelims);
+  b) \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are extreme rays and the
+     rank of the system composed by the constraints saturated by both
+     \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is equal to
+     \f$d - 2\f$, where \f$d\f$ is the rank of the system of constraints.
+
+  In fact, let \f$F\f$ be the system of generators that saturate the
+  constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$.
+  If b) holds, the set \f$F\f$ is 2-dimensional and \f$\vect{r}_1\f$ and
+  \f$\vect{r}_2\f$ generate this set. So, every generator
+  \f$\vect{x}\f$ of \f$F\f$ can be built as a combination of
+  \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$, i.e.
+  \f[
+    \vect{x} = \lambda \vect{r}_1 + \mu \vect{r}_2.
+  \f]
+  This combination is non-negative because there exists at least a
+  constraint \f$c\f$ saturated by \f$\vect{r}_1\f$ and not
+  \f$\vect{r}_2\f$ (or vice versa) (because they are distinct) for which
+  \f[
+    \langle \vect{c}, \vect{x} \rangle \geq 0
+  \f]
+  and
+  \f[
+    \langle \vect{c}, \vect{x} \rangle
+    = \lambda \langle \vect{c}, \vect{r}_1 \rangle
+                           (or = \mu \langle \vect{c}, \vect{r}_2 \rangle).
+  \f]
+  So, there is no other extreme ray in \f$F\f$ and a) holds.
+  Otherwise, if b) does not hold, the rank of the system generated by
+  the constraints saturated by both \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$
+  is equal to \f$d - k\f$, with \p k \>= 3, the set \f$F\f$ is
+  \p k -dimensional and at least \p k extreme rays are necessary
+  to generate \f$F\f$.
+  So, \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent and
+  a) does not hold.
+
+  Proposition 2: When we build the new system of generators starting from
+  a system \f$A\f$ of constraints of \f$P\f$, if \f$\vect{c}\f$ is the
+  constraint to add to \f$A\f$ and all lines of \f$P\f$ saturate
+  \f$\vect{c}\f$, the new set of rays is the union of those rays that
+  saturate, of those that satisfy and of a set \f$\overline Q\f$ of
+  rays such that each of them
+  -# lies on the hyper-plane represented by the k-th constraint,
+  -# is a positive combination of two adjacent rays \f$\vect{r}_1\f$ and
+     \f$\vect{r}_2\f$ such that the first one satisfies the constraint and
+     the other does not satisfy it.
+  If the adjacency property is not taken in account, the new set of
+  rays is not irredundant, in general.
+
+  In fact, if \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ are not adjacent,
+  the rank of the system composed by the constraints saturated by both
+  \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$ is different from \f$d - 2\f$
+  (see the previous proposition) or neither \f$\vect{r}_1\f$ nor
+  \f$\vect{r}_2\f$ are extreme rays. Since the new ray \f$\vect{r}\f$
+  is a combination of \f$\vect{r}_1\f$ and \f$\vect{r}_2\f$,
+  it saturates the same constraints saturated by both \f$\vect{r}_1\f$ and
+  \f$\vect{r}_2\f$.
+  If the rank is less than \f$d - 2\f$, the rank of
+  the system composed by \f$\vect{c}\f$ (that is saturated by \f$\vect{r}\f$)
+  and by the constraints of \f$A\f$ saturated by \f$\vect{r}\f$  is less
+  than \f$d - 1\f$. It means that \f$r\f$ is redundant (see
+  Section \ref prelims).
+  If neither \f$\vect{r}_1\f$ nor \f$\vect{r}_2\f$ are extreme rays,
+  they belong to a 2-dimensional face containing exactly two extreme rays
+  of \f$P\f$.
+  These two adjacent rays build a ray equal to \f$\vect{r}\f$ and so
+  \f$\vect{r}\f$ is redundant.
+
+  \endif
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+dimension_type
+Polyhedron::conversion(Source_Linear_System& source,
+                       const dimension_type start,
+                       Dest_Linear_System& dest,
+                       Bit_Matrix& sat,
+                       dimension_type num_lines_or_equalities) {
+  typedef typename Dest_Linear_System::row_type dest_row_type;
+  typedef typename Source_Linear_System::row_type source_row_type;
+
+  // Constraints and generators must have the same dimension,
+  // otherwise the scalar products below will bomb.
+  PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+  const dimension_type source_space_dim = source.space_dimension();
+  const dimension_type source_num_rows = source.num_rows();
+  const dimension_type source_num_columns = source_space_dim
+    + (source.is_necessarily_closed() ? 1U : 2U);
+
+
+  dimension_type dest_num_rows = dest.num_rows();
+  // The rows removed from `dest' will be placed in this vector, so they
+  // can be recycled if needed.
+  std::vector<dest_row_type> recyclable_dest_rows;
+
+  using std::swap;
+
+  // By construction, the number of columns of `sat' is the same as
+  // the number of rows of `source'; also, the number of rows of `sat'
+  // is the same as the number of rows of `dest'.
+  PPL_ASSERT(source_num_rows == sat.num_columns());
+  PPL_ASSERT(dest_num_rows == sat.num_rows());
+
+  // If `start > 0', then we are converting the pending constraints.
+  PPL_ASSERT(start == 0 || start == source.first_pending_row());
+
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(normalized_sp_o);
+
+  bool dest_sorted = dest.is_sorted();
+  const dimension_type dest_first_pending_row = dest.first_pending_row();
+
+  // This will contain the row indexes of the redundant rows of `source'.
+  std::vector<dimension_type> redundant_source_rows;
+
+  // Converting the sub-system of `source' having rows with indexes
+  // from `start' to the last one (i.e., `source_num_rows' - 1).
+  for (dimension_type k = start; k < source_num_rows; ++k) {
+    const source_row_type& source_k = source[k];
+
+    // `scalar_prod[i]' will contain the scalar product of the
+    // constraint `source_k' and the generator `dest_rows[i]'.  This
+    // product is 0 if and only if the generator saturates the
+    // constraint.
+    PPL_DIRTY_TEMP(std::vector<Coefficient>, scalar_prod);
+    if (dest_num_rows > scalar_prod.size()) {
+      scalar_prod.insert(scalar_prod.end(),
+                         dest_num_rows - scalar_prod.size(),
+                         Coefficient_zero());
+    }
+    // `index_non_zero' will indicate the first generator in `dest_rows'
+    // that does not saturate the constraint `source_k'.
+    dimension_type index_non_zero = 0;
+    for ( ; index_non_zero < dest_num_rows; ++index_non_zero) {
+      WEIGHT_BEGIN();
+      Scalar_Products::assign(scalar_prod[index_non_zero],
+                              source_k,
+                              dest.sys.rows[index_non_zero]);
+      WEIGHT_ADD_MUL(17, source_space_dim);
+      if (scalar_prod[index_non_zero] != 0)
+        // The generator does not saturate the constraint.
+        break;
+      // Check if the client has requested abandoning all expensive
+      // computations.  If so, the exception specified by the client
+      // is thrown now.
+      maybe_abandon();
+    }
+    for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) {
+      WEIGHT_BEGIN();
+      Scalar_Products::assign(scalar_prod[i], source_k, dest.sys.rows[i]);
+      WEIGHT_ADD_MUL(25, source_space_dim);
+      // Check if the client has requested abandoning all expensive
+      // computations.  If so, the exception specified by the client
+      // is thrown now.
+      maybe_abandon();
+    }
+
+    // We first treat the case when `index_non_zero' is less than
+    // `num_lines_or_equalities', i.e., when the generator that
+    // does not saturate the constraint `source_k' is a line.
+    // The other case (described later) is when all the lines
+    // in `dest_rows' (i.e., all the rows having indexes less than
+    // `num_lines_or_equalities') do saturate the constraint.
+
+    if (index_non_zero < num_lines_or_equalities) {
+      // Since the generator `dest_rows[index_non_zero]' does not saturate
+      // the constraint `source_k', it can no longer be a line
+      // (see saturation rule in Section \ref prelims).
+      // Therefore, we first transform it to a ray.
+      dest.sys.rows[index_non_zero].set_is_ray_or_point_or_inequality();
+      // Of the two possible choices, we select the ray satisfying
+      // the constraint (namely, the ray whose scalar product
+      // with the constraint gives a positive result).
+      if (scalar_prod[index_non_zero] < 0) {
+        // The ray `dest_rows[index_non_zero]' lies on the wrong half-space:
+        // we change it to have the opposite direction.
+        neg_assign(scalar_prod[index_non_zero]);
+        neg_assign(dest.sys.rows[index_non_zero].expr);
+        // The modified row may still not be OK(), so don't assert OK here.
+        // They are all checked at the end of this function.
+      }
+      // Having changed a line to a ray, we set `dest_rows' to be a
+      // non-sorted system, we decrement the number of lines of `dest_rows'
+      // and, if necessary, we move the new ray below all the remaining lines.
+      dest_sorted = false;
+      --num_lines_or_equalities;
+      if (index_non_zero != num_lines_or_equalities) {
+        swap(dest.sys.rows[index_non_zero],
+             dest.sys.rows[num_lines_or_equalities]);
+        swap(scalar_prod[index_non_zero],
+             scalar_prod[num_lines_or_equalities]);
+      }
+      const dest_row_type& dest_nle = dest.sys.rows[num_lines_or_equalities];
+
+      // Computing the new lineality space.
+      // Since each line must lie on the hyper-plane corresponding to
+      // the constraint `source_k', the scalar product between
+      // the line and the constraint must be 0.
+      // This property already holds for the lines having indexes
+      // between 0 and `index_non_zero' - 1.
+      // We have to consider the remaining lines, having indexes
+      // between `index_non_zero' and `num_lines_or_equalities' - 1.
+      // Each line that does not saturate the constraint has to be
+      // linearly combined with generator `dest_nle' so that the
+      // resulting new line saturates the constraint.
+      // Note that, by Observation 1 above, the resulting new line
+      // will still saturate all the constraints that were saturated by
+      // the old line.
+
+      Coefficient& scalar_prod_nle = scalar_prod[num_lines_or_equalities];
+      PPL_ASSERT(scalar_prod_nle != 0);
+      for (dimension_type
+             i = index_non_zero; i < num_lines_or_equalities; ++i) {
+        if (scalar_prod[i] != 0) {
+          // The following fragment optimizes the computation of
+          //
+          // <CODE>
+          //   Coefficient scale = scalar_prod[i];
+          //   scale.gcd_assign(scalar_prod_nle);
+          //   Coefficient normalized_sp_i = scalar_prod[i] / scale;
+          //   Coefficient normalized_sp_n = scalar_prod_nle / scale;
+          //   for (dimension_type c = dest_num_columns; c-- > 0; ) {
+          //     dest[i][c] *= normalized_sp_n;
+          //     dest[i][c] -= normalized_sp_i * dest_nle[c];
+          //   }
+          // </CODE>
+          normalize2(scalar_prod[i],
+                     scalar_prod_nle,
+                     normalized_sp_i,
+                     normalized_sp_o);
+          dest_row_type& dest_i = dest.sys.rows[i];
+          neg_assign(normalized_sp_i);
+          dest_i.expr.linear_combine(dest_nle.expr,
+                                     normalized_sp_o, normalized_sp_i);
+          dest_i.strong_normalize();
+          // The modified row may still not be OK(), so don't assert OK here.
+          // They are all checked at the end of this function.
+          scalar_prod[i] = 0;
+          // dest_sorted has already been set to false.
+        }
+      }
+
+      // Computing the new pointed cone.
+      // Similarly to what we have done during the computation of
+      // the lineality space, we consider all the remaining rays
+      // (having indexes strictly greater than `num_lines_or_equalities')
+      // that do not saturate the constraint `source_k'. These rays
+      // are positively combined with the ray `dest_nle' so that the
+      // resulting new rays saturate the constraint.
+      for (dimension_type
+             i = num_lines_or_equalities + 1; i < dest_num_rows; ++i) {
+        if (scalar_prod[i] != 0) {
+          // The following fragment optimizes the computation of
+          //
+          // <CODE>
+          //   Coefficient scale = scalar_prod[i];
+          //   scale.gcd_assign(scalar_prod_nle);
+          //   Coefficient normalized_sp_i = scalar_prod[i] / scale;
+          //   Coefficient normalized_sp_n = scalar_prod_nle / scale;
+          //   for (dimension_type c = dest_num_columns; c-- > 0; ) {
+          //     dest[i][c] *= normalized_sp_n;
+          //     dest[i][c] -= normalized_sp_i * dest_nle[c];
+          //   }
+          // </CODE>
+          normalize2(scalar_prod[i],
+                     scalar_prod_nle,
+                     normalized_sp_i,
+                     normalized_sp_o);
+          dest_row_type& dest_i = dest.sys.rows[i];
+          WEIGHT_BEGIN();
+          neg_assign(normalized_sp_i);
+          dest_i.expr.linear_combine(dest_nle.expr,
+                                     normalized_sp_o, normalized_sp_i);
+          dest_i.strong_normalize();
+          // The modified row may still not be OK(), so don't assert OK here.
+          // They are all checked at the end of this function.
+          scalar_prod[i] = 0;
+          // `dest_sorted' has already been set to false.
+          WEIGHT_ADD_MUL(41, source_space_dim);
+        }
+        // Check if the client has requested abandoning all expensive
+        // computations.  If so, the exception specified by the client
+        // is thrown now.
+        maybe_abandon();
+      }
+      // Since the `scalar_prod_nle' is positive (by construction), it
+      // does not saturate the constraint `source_k'.  Therefore, if
+      // the constraint is an inequality, we set to 1 the
+      // corresponding element of `sat' ...
+      Bit_Row& sat_nle = sat[num_lines_or_equalities];
+      if (source_k.is_ray_or_point_or_inequality())
+        sat_nle.set(k - redundant_source_rows.size());
+      // ... otherwise, the constraint is an equality which is
+      // violated by the generator `dest_nle': the generator has to be
+      // removed from `dest_rows'.
+      else {
+        --dest_num_rows;
+        swap(dest.sys.rows[num_lines_or_equalities],
+             dest.sys.rows[dest_num_rows]);
+        recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+        swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+        dest.sys.rows.pop_back();
+        PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+
+        swap(scalar_prod_nle, scalar_prod[dest_num_rows]);
+        swap(sat_nle, sat[dest_num_rows]);
+        // dest_sorted has already been set to false.
+      }
+    }
+    // Here we have `index_non_zero' >= `num_lines_or_equalities',
+    // so that all the lines in `dest_rows' saturate the constraint `source_k'.
+    else {
+      // First, we reorder the generators in `dest_rows' as follows:
+      // -# all the lines should have indexes between 0 and
+      //    `num_lines_or_equalities' - 1 (this already holds);
+      // -# all the rays that saturate the constraint should have
+      //    indexes between `num_lines_or_equalities' and
+      //    `lines_or_equal_bound' - 1; these rays form the set Q=.
+      // -# all the rays that have a positive scalar product with the
+      //    constraint should have indexes between `lines_or_equal_bound'
+      //    and `sup_bound' - 1; these rays form the set Q+.
+      // -# all the rays that have a negative scalar product with the
+      //    constraint should have indexes between `sup_bound' and
+      //    `dest_num_rows' - 1; these rays form the set Q-.
+      dimension_type lines_or_equal_bound = num_lines_or_equalities;
+      dimension_type inf_bound = dest_num_rows;
+      // While we find saturating generators, we simply increment
+      // `lines_or_equal_bound'.
+      while (inf_bound > lines_or_equal_bound
+             && scalar_prod[lines_or_equal_bound] == 0)
+        ++lines_or_equal_bound;
+      dimension_type sup_bound = lines_or_equal_bound;
+      while (inf_bound > sup_bound) {
+        const int sp_sign = sgn(scalar_prod[sup_bound]);
+        if (sp_sign == 0) {
+          // This generator has to be moved in Q=.
+          swap(dest.sys.rows[sup_bound], dest.sys.rows[lines_or_equal_bound]);
+          swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]);
+          swap(sat[sup_bound], sat[lines_or_equal_bound]);
+          ++lines_or_equal_bound;
+          ++sup_bound;
+          dest_sorted = false;
+        }
+        else if (sp_sign < 0) {
+          // This generator has to be moved in Q-.
+          --inf_bound;
+          swap(dest.sys.rows[sup_bound], dest.sys.rows[inf_bound]);
+          swap(sat[sup_bound], sat[inf_bound]);
+          swap(scalar_prod[sup_bound], scalar_prod[inf_bound]);
+          dest_sorted = false;
+        }
+        else
+          // sp_sign > 0: this generator has to be moved in Q+.
+          ++sup_bound;
+      }
+
+      if (sup_bound == dest_num_rows) {
+        // Here the set Q- is empty.
+        // If the constraint is an inequality, then all the generators
+        // in Q= and Q+ satisfy the constraint. The constraint is redundant
+        // and it can be safely removed from the constraint system.
+        // This is why the `source' parameter is not declared `const'.
+        if (source_k.is_ray_or_point_or_inequality()) {
+          redundant_source_rows.push_back(k);
+        }
+        else {
+          // The constraint is an equality, so that all the generators
+          // in Q+ violate it. Since the set Q- is empty, we can simply
+          // remove from `dest_rows' all the generators of Q+.
+          PPL_ASSERT(dest_num_rows >= lines_or_equal_bound);
+          while (dest_num_rows != lines_or_equal_bound) {
+            recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+            swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+            dest.sys.rows.pop_back();
+            --dest_num_rows;
+          }
+          PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+        }
+      }
+      else {
+        // The set Q- is not empty, i.e., at least one generator
+        // violates the constraint `source_k'.
+        // We have to further distinguish two cases:
+        if (sup_bound == num_lines_or_equalities) {
+          // The set Q+ is empty, so that all generators that satisfy
+          // the constraint also saturate it.
+          // We can simply remove from `dest_rows' all the generators in Q-.
+          PPL_ASSERT(dest_num_rows >= sup_bound);
+          while (dest_num_rows != sup_bound) {
+            recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+            swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+            dest.sys.rows.pop_back();
+            --dest_num_rows;
+          }
+          PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+        }
+        else {
+          // The sets Q+ and Q- are both non-empty.
+          // The generators of the new pointed cone are all those satisfying
+          // the constraint `source_k' plus a set of new rays enjoying
+          // the following properties:
+          // -# they lie on the hyper-plane represented by the constraint
+          // -# they are obtained as a positive combination of two
+          //    adjacent rays, the first taken from Q+ and the second
+          //    taken from Q-.
+
+          // The adjacency property is necessary to have an irredundant
+          // set of new rays (see proposition 2).
+          const dimension_type bound = dest_num_rows;
+
+          // In the following loop,
+          // `i' runs through the generators in the set Q+ and
+          // `j' runs through the generators in the set Q-.
+          for (dimension_type i = lines_or_equal_bound; i < sup_bound; ++i) {
+            for(dimension_type j = sup_bound; j < bound; ++j) {
+              // Checking if generators `dest_rows[i]' and `dest_rows[j]' are
+              // adjacent.
+              // If there exist another generator that saturates
+              // all the constraints saturated by both `dest_rows[i]' and
+              // `dest_rows[j]', then they are NOT adjacent.
+              PPL_ASSERT(sat[i].last() == C_Integer<unsigned long>::max
+                         || sat[i].last() < k);
+              PPL_ASSERT(sat[j].last() == C_Integer<unsigned long>::max
+                         || sat[j].last() < k);
+
+              // Being the union of `sat[i]' and `sat[j]',
+              // `new_satrow' corresponds to a ray that saturates all the
+              // constraints saturated by both `dest_rows[i]' and
+              // `dest_rows[j]'.
+              Bit_Row new_satrow(sat[i], sat[j]);
+
+              // Compute the number of common saturators.
+              // NOTE: this number has to be less than `k' because
+              // we are treating the `k'-th constraint.
+              const dimension_type num_common_satur
+                = k - redundant_source_rows.size() - new_satrow.count_ones();
+
+              // Even before actually creating the new ray as a
+              // positive combination of `dest_rows[i]' and `dest_rows[j]',
+              // we exploit saturation information to check if
+              // it can be an extremal ray. To this end, we refer
+              // to the definition of a minimal proper face
+              // (see comments in Polyhedron_defs.hh):
+              // an extremal ray saturates at least `n' - `t' - 1
+              // constraints, where `n' is the dimension of the space
+              // and `t' is the dimension of the lineality space.
+              // Since `n == source_num_columns - 1' and
+              // `t == num_lines_or_equalities', we obtain that
+              // an extremal ray saturates at least
+              // `source_num_columns - num_lines_or_equalities - 2'
+              // constraints.
+              if (num_common_satur
+                  >= source_num_columns - num_lines_or_equalities - 2) {
+                // The minimal proper face rule is satisfied.
+                // Now we actually check for redundancy by computing
+                // adjacency information.
+                bool redundant = false;
+                WEIGHT_BEGIN();
+                for (dimension_type
+                       l = num_lines_or_equalities; l < bound; ++l)
+                  if (l != i && l != j
+                      && subset_or_equal(sat[l], new_satrow)) {
+                    // Found another generator saturating all the
+                    // constraints saturated by both `dest_rows[i]' and
+                    // `dest_rows[j]'.
+                    redundant = true;
+                    break;
+                  }
+                PPL_ASSERT(bound >= num_lines_or_equalities);
+                WEIGHT_ADD_MUL(15, bound - num_lines_or_equalities);
+                if (!redundant) {
+                  // Adding the new ray to `dest_rows' and the corresponding
+                  // saturation row to `sat'.
+                  dest_row_type new_row;
+                  if (recyclable_dest_rows.empty()) {
+                    sat.add_recycled_row(new_satrow);
+                  }
+                  else {
+                    swap(new_row, recyclable_dest_rows.back());
+                    recyclable_dest_rows.pop_back();
+                    new_row.set_space_dimension_no_ok(source_space_dim);
+                    swap(sat[dest_num_rows], new_satrow);
+                  }
+
+                  // The following fragment optimizes the computation of
+                  //
+                  // <CODE>
+                  //   Coefficient scale = scalar_prod[i];
+                  //   scale.gcd_assign(scalar_prod[j]);
+                  //   Coefficient normalized_sp_i = scalar_prod[i] / scale;
+                  //   Coefficient normalized_sp_j = scalar_prod[j] / scale;
+                  //   for (dimension_type c = dest_num_columns; c-- > 0; ) {
+                  //     new_row[c] = normalized_sp_i * dest[j][c];
+                  //     new_row[c] -= normalized_sp_j * dest[i][c];
+                  //   }
+                  // </CODE>
+                  normalize2(scalar_prod[i],
+                             scalar_prod[j],
+                             normalized_sp_i,
+                             normalized_sp_o);
+                  WEIGHT_BEGIN();
+
+                  neg_assign(normalized_sp_o);
+                  new_row = dest.sys.rows[j];
+                  // TODO: Check if the following assertions hold.
+                  PPL_ASSERT(normalized_sp_i != 0);
+                  PPL_ASSERT(normalized_sp_o != 0);
+                  new_row.expr.linear_combine(dest.sys.rows[i].expr,
+                                              normalized_sp_i, normalized_sp_o);
+
+                  WEIGHT_ADD_MUL(86, source_space_dim);
+                  new_row.strong_normalize();
+                  // Don't assert new_row.OK() here, because it may fail if
+                  // the parameter `dest' contained a row that wasn't ok.
+                  // Since we added a new generator to `dest_rows',
+                  // we also add a new element to `scalar_prod';
+                  // by construction, the new ray lies on the hyper-plane
+                  // represented by the constraint `source_k'.
+                  // Thus, the added scalar product is 0.
+                  PPL_ASSERT(scalar_prod.size() >= dest_num_rows);
+                  if (scalar_prod.size() <= dest_num_rows)
+                    scalar_prod.push_back(Coefficient_zero());
+                  else
+                    scalar_prod[dest_num_rows] = Coefficient_zero();
+
+                  dest.sys.rows.resize(dest.sys.rows.size() + 1);
+                  swap(dest.sys.rows.back(), new_row);
+                  // Increment the number of generators.
+                  ++dest_num_rows;
+                } // if (!redundant)
+              }
+            }
+            // Check if the client has requested abandoning all expensive
+            // computations.  If so, the exception specified by the client
+            // is thrown now.
+            maybe_abandon();
+          }
+          // Now we substitute the rays in Q- (i.e., the rays violating
+          // the constraint) with the newly added rays.
+          dimension_type j;
+          if (source_k.is_ray_or_point_or_inequality()) {
+            // The constraint is an inequality:
+            // the violating generators are those in Q-.
+            j = sup_bound;
+            // For all the generators in Q+, set to 1 the corresponding
+            // entry for the constraint `source_k' in the saturation matrix.
+
+            // After the removal of redundant rows in `source', the k-th
+            // row will have index `new_k'.
+            const dimension_type new_k = k - redundant_source_rows.size();
+            for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l)
+              sat[l].set(new_k);
+          }
+          else
+            // The constraint is an equality:
+            // the violating generators are those in the union of Q+ and Q-.
+            j = lines_or_equal_bound;
+
+          // Swapping the newly added rays
+          // (index `i' running through `dest_num_rows - 1' down-to `bound')
+          // with the generators violating the constraint
+          // (index `j' running through `j' up-to `bound - 1').
+          dimension_type i = dest_num_rows;
+          while (j < bound && i > bound) {
+            --i;
+            swap(dest.sys.rows[i], dest.sys.rows[j]);
+            swap(scalar_prod[i], scalar_prod[j]);
+            swap(sat[i], sat[j]);
+            ++j;
+            dest_sorted = false;
+          }
+          // Setting the number of generators in `dest':
+          // - if the number of generators violating the constraint
+          //   is less than or equal to the number of the newly added
+          //   generators, we assign `i' to `dest_num_rows' because
+          //   all generators above this index are significant;
+          // - otherwise, we assign `j' to `dest_num_rows' because
+          //   all generators below index `j-1' violates the constraint.
+          const dimension_type new_num_rows = (j == bound) ? i : j;
+          PPL_ASSERT(dest_num_rows >= new_num_rows);
+          while (dest_num_rows != new_num_rows) {
+            recyclable_dest_rows.resize(recyclable_dest_rows.size() + 1);
+            swap(dest.sys.rows.back(), recyclable_dest_rows.back());
+            dest.sys.rows.pop_back();
+            --dest_num_rows;
+          }
+          PPL_ASSERT(dest_num_rows == dest.sys.rows.size());
+        }
+      }
+    }
+  }
+
+  // We may have identified some redundant constraints in `source',
+  // which have been swapped at the end of the system.
+  if (redundant_source_rows.size() > 0) {
+    source.remove_rows(redundant_source_rows);
+    sat.remove_trailing_columns(redundant_source_rows.size());
+  }
+
+  // If `start == 0', then `source' was sorted and remained so.
+  // If otherwise `start > 0', then the two sub-system made by the
+  // non-pending rows and the pending rows, respectively, were both sorted.
+  // Thus, the overall system is sorted if and only if either
+  // `start == source_num_rows' (i.e., the second sub-system is empty)
+  // or the row ordering holds for the two rows at the boundary between
+  // the two sub-systems.
+  if (start > 0 && start < source.num_rows())
+    source.set_sorted(compare(source[start - 1], source[start]) <= 0);
+  // There are no longer pending constraints in `source'.
+  source.unset_pending_rows();
+
+  // We may have identified some redundant rays in `dest_rows',
+  // which have been swapped into recyclable_dest_rows.
+  if (!recyclable_dest_rows.empty()) {
+    const dimension_type num_removed_rows = recyclable_dest_rows.size();
+    sat.remove_trailing_rows(num_removed_rows);
+  }
+  if (dest_sorted)
+    // If the non-pending generators in `dest' are still declared to be
+    // sorted, then we have to also check for the sortedness of the
+    // pending generators.
+    for (dimension_type i = dest_first_pending_row; i < dest_num_rows; ++i)
+      if (compare(dest.sys.rows[i - 1], dest.sys.rows[i]) > 0) {
+        dest_sorted = false;
+        break;
+      }
+
+#ifndef NDEBUG
+  // The previous code can modify the rows' fields, exploiting the friendness.
+  // Check that all rows are OK now.
+  for (dimension_type i = dest.num_rows(); i-- > 0; )
+    PPL_ASSERT(dest.sys.rows[i].OK());
+#endif
+
+  dest.sys.index_first_pending = dest.num_rows();
+  dest.set_sorted(dest_sorted);
+  PPL_ASSERT(dest.sys.OK());
+
+  return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_minimize_templates.hh line 1. */
+/* Polyhedron class implementation: minimize() and add_and_minimize().
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_minimize_templates.hh line 29. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+  \return
+  <CODE>true</CODE> if the polyhedron is empty, <CODE>false</CODE>
+  otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source represents the constraints,
+  <CODE>false</CODE> otherwise;
+
+  \param source
+  The given system, which is not empty;
+
+  \param dest
+  The system to build and minimize;
+
+  \param sat
+  The saturation matrix.
+
+  \p dest is not <CODE>const</CODE> because it will be built (and then
+  modified) during minimize(). Also, \p sat and \p source are
+  not <CODE>const</CODE> because the former will be built during
+  \p dest creation and the latter will maybe be sorted and modified by
+  <CODE>conversion()</CODE> and <CODE>simplify()</CODE>.
+
+  \p sat has the generators on its columns and the constraints on its rows
+  if \p con_to_gen is <CODE>true</CODE>, otherwise it has the generators on
+  its rows and the constraints on its columns.
+
+  Given \p source, this function builds (by means of
+  <CODE>conversion()</CODE>) \p dest and then simplifies (invoking
+  <CODE>simplify()</CODE>) \p source, erasing redundant rows.
+  For the sequel we assume that \p source is the system of constraints
+  and \p dest is the system of generators.
+  This will simplify the description of the function; the dual case is
+  similar.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::minimize(const bool con_to_gen,
+                     Source_Linear_System& source,
+                     Dest_Linear_System& dest,
+                     Bit_Matrix& sat) {
+
+  typedef typename Dest_Linear_System::row_type dest_row_type;
+
+  // Topologies have to agree.
+  PPL_ASSERT(source.topology() == dest.topology());
+  // `source' cannot be empty: even if it is an empty constraint system,
+  // representing the universe polyhedron, homogenization has added
+  // the positive constraint. It also cannot be an empty generator system,
+  // since this function is always called starting from a non-empty
+  // polyhedron.
+  PPL_ASSERT(!source.has_no_rows());
+
+  // Sort the source system, if necessary.
+  if (!source.is_sorted())
+    source.sort_rows();
+
+  // Initialization of the system of generators `dest'.
+  // The algorithm works incrementally and we haven't seen any
+  // constraint yet: as a consequence, `dest' should describe
+  // the universe polyhedron of the appropriate dimension.
+  // To this end, we initialize it to the identity matrix of dimension
+  // `source.num_columns()': the rows represent the lines corresponding
+  // to the canonical basis of the vector space.
+  dimension_type dest_num_rows
+    = source.topology() == NECESSARILY_CLOSED ? source.space_dimension() + 1
+                                              : source.space_dimension() + 2;
+
+  dest.clear();
+  dest.set_space_dimension(source.space_dimension());
+
+  // Initialize `dest' to the identity matrix.
+  for (dimension_type i = 0; i < dest_num_rows; ++i) {
+    Linear_Expression expr;
+    expr.set_space_dimension(dest_num_rows - 1);
+    if (i == 0)
+      expr += 1;
+    else
+      expr += Variable(i - 1);
+    dest_row_type dest_i(expr, dest_row_type::LINE_OR_EQUALITY, NECESSARILY_CLOSED);
+    if (dest.topology() == NOT_NECESSARILY_CLOSED)
+      dest_i.mark_as_not_necessarily_closed();
+    dest.sys.insert_no_ok(dest_i, Recycle_Input());
+  }
+  // The identity matrix `dest' is not sorted (see the sorting rules
+  // in Constrant.cc and Generator.cc).
+  dest.set_sorted(false);
+
+  // NOTE: the system `dest', as it is now, is not a _legal_ system of
+  //       generators, because in the first row we have a line with a
+  //       non-zero divisor (which should only happen for
+  //       points). However, this is NOT a problem, because `source'
+  //       necessarily contains the positivity constraint (or a
+  //       combination of it with another constraint) which will
+  //       restore things as they should be.
+
+
+  // Building a saturation matrix and initializing it by setting
+  // all of its elements to zero. This matrix will be modified together
+  // with `dest' during the conversion.
+  // NOTE: since we haven't seen any constraint yet, the relevant
+  //       portion of `tmp_sat' is the sub-matrix consisting of
+  //       the first 0 columns: thus the relevant portion correctly
+  //       characterizes the initial saturation information.
+  Bit_Matrix tmp_sat(dest_num_rows, source.num_rows());
+
+  // By invoking the function conversion(), we populate `dest' with
+  // the generators characterizing the polyhedron described by all
+  // the constraints in `source'.
+  // The `start' parameter is zero (we haven't seen any constraint yet)
+  // and the 5th parameter (representing the number of lines in `dest'),
+  // by construction, is equal to `dest_num_rows'.
+  const dimension_type num_lines_or_equalities
+    = conversion(source, 0U, dest, tmp_sat, dest_num_rows);
+  // conversion() may have modified the number of rows in `dest'.
+  dest_num_rows = dest.num_rows();
+
+#ifndef NDEBUG
+  for (dimension_type i = dest.num_rows(); i-- > 0; )
+    PPL_ASSERT(dest[i].OK());
+#endif
+
+  // Checking if the generators in `dest' represent an empty polyhedron:
+  // the polyhedron is empty if there are no points
+  // (because rays, lines and closure points need a supporting point).
+  // Points can be detected by looking at:
+  // - the divisor, for necessarily closed polyhedra;
+  // - the epsilon coordinate, for NNC polyhedra.
+  dimension_type first_point;
+  if (dest.is_necessarily_closed()) {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.inhomogeneous_term() > 0)
+        break;
+  }
+  else {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+        break;
+  }
+
+  if (first_point == dest_num_rows)
+    if (con_to_gen)
+      // No point has been found: the polyhedron is empty.
+      return true;
+    else {
+      // Here `con_to_gen' is false: `dest' is a system of constraints.
+      // In this case the condition `first_point == dest_num_rows'
+      // actually means that all the constraints in `dest' have their
+      // inhomogeneous term equal to 0.
+      // This is an ILLEGAL situation, because it implies that
+      // the constraint system `dest' lacks the positivity constraint
+      // and no linear combination of the constraints in `dest'
+      // can reintroduce the positivity constraint.
+      PPL_UNREACHABLE;
+      return false;
+    }
+  else {
+    // A point has been found: the polyhedron is not empty.
+    // Now invoking simplify() to remove all the redundant constraints
+    // from the system `source'.
+    // Since the saturation matrix `tmp_sat' returned by conversion()
+    // has rows indexed by generators (the rows of `dest') and columns
+    // indexed by constraints (the rows of `source'), we have to
+    // transpose it to obtain the saturation matrix needed by simplify().
+    sat.transpose_assign(tmp_sat);
+    simplify(source, sat);
+    return false;
+  }
+}
+
+
+/*!
+  \return
+  <CODE>true</CODE> if the obtained polyhedron is empty,
+  <CODE>false</CODE> otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source1 and \p source2 are system of
+  constraints, <CODE>false</CODE> otherwise;
+
+  \param source1
+  The first element of the given DD pair;
+
+  \param dest
+  The second element of the given DD pair;
+
+  \param sat
+  The saturation matrix that bind \p source1 to \p dest;
+
+  \param source2
+  The new system of generators or constraints.
+
+  It is assumed that \p source1 and \p source2 are sorted and have
+  no pending rows. It is also assumed that \p dest has no pending rows.
+  On entry, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of \p source1.
+  On exit, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of the system obtained
+  by merging \p source1 and \p source2.
+
+  Let us suppose we want to add some constraints to a given system of
+  constraints \p source1. This method, given a minimized double description
+  pair (\p source1, \p dest) and a system of new constraints \p source2,
+  modifies \p source1 by adding to it the constraints of \p source2 that
+  are not in \p source1. Then, by invoking
+  <CODE>add_and_minimize(bool, Linear_System_Class&, Linear_System_Class&, Bit_Matrix&)</CODE>,
+  processes the added constraints obtaining a new DD pair.
+
+  This method treats also the dual case, i.e., adding new generators to
+  a previous system of generators. In this case \p source1 contains the
+  old generators, \p source2 the new ones and \p dest is the system
+  of constraints in the given minimized DD pair.
+
+  Since \p source2 contains the constraints (or the generators) that
+  will be added to \p source1, it is constant: it will not be modified.
+*/
+template <typename Source_Linear_System1, typename Source_Linear_System2,
+          typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+                             Source_Linear_System1& source1,
+                             Dest_Linear_System& dest,
+                             Bit_Matrix& sat,
+                             const Source_Linear_System2& source2) {
+  // `source1' and `source2' cannot be empty.
+  PPL_ASSERT(!source1.has_no_rows() && !source2.has_no_rows());
+  // `source1' and `source2' must have the same number of columns
+  // to be merged.
+  PPL_ASSERT(source1.num_columns() == source2.num_columns());
+  // `source1' and `source2' are fully sorted.
+  PPL_ASSERT(source1.is_sorted() && source1.num_pending_rows() == 0);
+  PPL_ASSERT(source2.is_sorted() && source2.num_pending_rows() == 0);
+  PPL_ASSERT(dest.num_pending_rows() == 0);
+
+  const dimension_type old_source1_num_rows = source1.num_rows();
+  // `k1' and `k2' run through the rows of `source1' and `source2', resp.
+  dimension_type k1 = 0;
+  dimension_type k2 = 0;
+  dimension_type source2_num_rows = source2.num_rows();
+  while (k1 < old_source1_num_rows && k2 < source2_num_rows) {
+    // Add to `source1' the constraints from `source2', as pending rows.
+    // We exploit the property that initially both `source1' and `source2'
+    // are sorted and index `k1' only scans the non-pending rows of `source1',
+    // so that it is not influenced by the pending rows appended to it.
+    // This way no duplicate (i.e., trivially redundant) constraint
+    // is introduced in `source1'.
+    const int cmp = compare(source1[k1], source2[k2]);
+    if (cmp == 0) {
+      // We found the same row: there is no need to add `source2[k2]'.
+      ++k2;
+      // By sortedness, since `k1 < old_source1_num_rows',
+      // we can increment index `k1' too.
+      ++k1;
+    }
+    else if (cmp < 0)
+      // By sortedness, we can increment `k1'.
+      ++k1;
+    else {
+      // Here `cmp > 0'.
+      // By sortedness, `source2[k2]' cannot be in `source1'.
+      // We add it as a pending row of `source1' (sortedness unaffected).
+      source1.add_pending_row(source2[k2]);
+      // We can increment `k2'.
+      ++k2;
+    }
+  }
+  // Have we scanned all the rows in `source2'?
+  if (k2 < source2_num_rows)
+    // By sortedness, all the rows in `source2' having indexes
+    // greater than or equal to `k2' were not in `source1'.
+    // We add them as pending rows of 'source1' (sortedness not affected).
+    for ( ; k2 < source2_num_rows; ++k2)
+      source1.add_pending_row(source2[k2]);
+
+  if (source1.num_pending_rows() == 0)
+    // No row was appended to `source1', because all the constraints
+    // in `source2' were already in `source1'.
+    // There is nothing left to do ...
+    return false;
+
+  return add_and_minimize(con_to_gen, source1, dest, sat);
+}
+
+/*!
+  \return
+  <CODE>true</CODE> if the obtained polyhedron is empty,
+  <CODE>false</CODE> otherwise.
+
+  \param con_to_gen
+  <CODE>true</CODE> if \p source is a system of constraints,
+  <CODE>false</CODE> otherwise;
+
+  \param source
+  The first element of the given DD pair. It also contains the pending
+  rows to be processed;
+
+  \param dest
+  The second element of the given DD pair. It cannot have pending rows;
+
+  \param sat
+  The saturation matrix that bind the upper part of \p source to \p dest.
+
+  On entry, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the non-pending rows of \p source.
+  On exit, the rows of \p sat are indexed by the rows of \p dest
+  and its columns are indexed by the rows of \p source.
+
+  Let us suppose that \p source is a system of constraints.
+  This method assumes that the non-pending part of \p source and
+  system \p dest form a double description pair in minimal form and
+  will build a new DD pair in minimal form by processing the pending
+  constraints in \p source. To this end, it will call
+  <CODE>conversion()</CODE>) and <CODE>simplify</CODE>.
+
+  This method treats also the dual case, i.e., processing pending
+  generators. In this case \p source contains generators and \p dest
+  is the system of constraints corresponding to the non-pending part
+  of \p source.
+*/
+template <typename Source_Linear_System, typename Dest_Linear_System>
+bool
+Polyhedron::add_and_minimize(const bool con_to_gen,
+                             Source_Linear_System& source,
+                             Dest_Linear_System& dest,
+                             Bit_Matrix& sat) {
+  PPL_ASSERT(source.num_pending_rows() > 0);
+  PPL_ASSERT(source.space_dimension() == dest.space_dimension());
+  PPL_ASSERT(source.is_sorted());
+
+  // First, pad the saturation matrix with new columns (of zeroes)
+  // to accommodate for the pending rows of `source'.
+  sat.resize(dest.num_rows(), source.num_rows());
+
+  // Incrementally compute the new system of generators.
+  // Parameter `start' is set to the index of the first pending constraint.
+  const dimension_type num_lines_or_equalities
+    = conversion(source, source.first_pending_row(),
+                 dest, sat,
+                 dest.num_lines_or_equalities());
+
+  // conversion() may have modified the number of rows in `dest'.
+  const dimension_type dest_num_rows = dest.num_rows();
+
+  // Checking if the generators in `dest' represent an empty polyhedron:
+  // the polyhedron is empty if there are no points
+  // (because rays, lines and closure points need a supporting point).
+  // Points can be detected by looking at:
+  // - the divisor, for necessarily closed polyhedra;
+  // - the epsilon coordinate, for NNC polyhedra.
+  dimension_type first_point;
+  if (dest.is_necessarily_closed()) {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.inhomogeneous_term() > 0)
+        break;
+  }
+  else {
+    for (first_point = num_lines_or_equalities;
+        first_point < dest_num_rows;
+        ++first_point)
+      if (dest[first_point].expr.get(Variable(dest.space_dimension())) > 0)
+        break;
+  }
+
+  if (first_point == dest_num_rows)
+    if (con_to_gen)
+      // No point has been found: the polyhedron is empty.
+      return true;
+    else {
+      // Here `con_to_gen' is false: `dest' is a system of constraints.
+      // In this case the condition `first_point == dest_num_rows'
+      // actually means that all the constraints in `dest' have their
+      // inhomogeneous term equal to 0.
+      // This is an ILLEGAL situation, because it implies that
+      // the constraint system `dest' lacks the positivity constraint
+      // and no linear combination of the constraints in `dest'
+      // can reintroduce the positivity constraint.
+      PPL_UNREACHABLE;
+      return false;
+    }
+  else {
+    // A point has been found: the polyhedron is not empty.
+    // Now invoking `simplify()' to remove all the redundant constraints
+    // from the system `source'.
+    // Since the saturation matrix `sat' returned by `conversion()'
+    // has rows indexed by generators (the rows of `dest') and columns
+    // indexed by constraints (the rows of `source'), we have to
+    // transpose it to obtain the saturation matrix needed by `simplify()'.
+    sat.transpose();
+    simplify(source, sat);
+    // Transposing back.
+    sat.transpose();
+    return false;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_simplify_templates.hh line 1. */
+/* Polyhedron class implementation: simplify().
+*/
+
+
+/* Automatically generated from PPL source file ../src/Polyhedron_simplify_templates.hh line 29. */
+#include <cstddef>
+#include <limits>
+
+namespace Parma_Polyhedra_Library {
+
+/*!
+  \return
+  The rank of \p sys.
+
+  \param sys
+  The system to simplify: it will be modified;
+
+  \param sat
+  The saturation matrix corresponding to \p sys.
+
+  \p sys may be modified by swapping some of its rows and by possibly
+  removing some of them, if they turn out to be redundant.
+
+  If \p sys is a system of constraints, then the rows of \p sat are
+  indexed by constraints and its columns are indexed by generators;
+  otherwise, if \p sys is a system of generators, then the rows of
+  \p sat are indexed by generators and its columns by constraints.
+
+  Given a system of constraints or a system of generators, this function
+  simplifies it using Gauss' elimination method (to remove redundant
+  equalities/lines), deleting redundant inequalities/rays/points and
+  making back-substitution.
+  The explanation that follows assumes that \p sys is a system of
+  constraints. For the case when \p sys is a system of generators,
+  a similar explanation can be obtain by applying duality.
+
+  The explanation relies on the notion of <EM>redundancy</EM>.
+  (See the Introduction.)
+
+  First we make some observations that can help the reader
+  in understanding the function:
+
+  Proposition: An inequality that is saturated by all the generators
+  can be transformed to an equality.
+
+  In fact, by combining any number of generators that saturate the
+  constraints, we obtain a generator that saturates the constraints too:
+  \f[
+    \langle \vect{c}, \vect{r}_1 \rangle = 0 \land
+    \langle \vect{c}, \vect{r}_2 \rangle = 0
+    \Rightarrow
+    \langle \vect{c}, (\lambda_1 \vect{r}_1 + \lambda_2 \vect{r}_2) \rangle =
+    \lambda_1 \langle \vect{c}, \vect{r}_1 \rangle
+    + \lambda_2 \langle \vect{c}, \vect{r}_2 \rangle
+    = 0,
+  \f]
+  where \f$\lambda_1, \lambda_2\f$ can be any real number.
+*/
+template <typename Linear_System1>
+dimension_type
+Polyhedron::simplify(Linear_System1& sys, Bit_Matrix& sat) {
+
+  typedef typename Linear_System1::row_type sys_row_type;
+
+  dimension_type num_rows = sys.num_rows();
+  const dimension_type num_cols_sat = sat.num_columns();
+
+  using std::swap;
+
+  // Looking for the first inequality in `sys'.
+  dimension_type num_lines_or_equalities = 0;
+  while (num_lines_or_equalities < num_rows
+         && sys[num_lines_or_equalities].is_line_or_equality())
+    ++num_lines_or_equalities;
+
+  // `num_saturators[i]' will contain the number of generators
+  // that saturate the constraint `sys[i]'.
+  if (num_rows > simplify_num_saturators_size) {
+    delete [] simplify_num_saturators_p;
+    simplify_num_saturators_p = 0;
+    simplify_num_saturators_size = 0;
+    const size_t max_size
+      = std::numeric_limits<size_t>::max() / sizeof(dimension_type);
+    const size_t new_size = compute_capacity(num_rows, max_size);
+    simplify_num_saturators_p = new dimension_type[new_size];
+    simplify_num_saturators_size = new_size;
+  }
+  dimension_type* const num_saturators = simplify_num_saturators_p;
+
+  bool sys_sorted = sys.is_sorted();
+
+  // Computing the number of saturators for each inequality,
+  // possibly identifying and swapping those that happen to be
+  // equalities (see Proposition above).
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i) {
+    if (sat[i].empty()) {
+      // The constraint `sys_rows[i]' is saturated by all the generators.
+      // Thus, either it is already an equality or it can be transformed
+      // to an equality (see Proposition above).
+      sys.sys.rows[i].set_is_line_or_equality();
+      // Note: simple normalization already holds.
+      sys.sys.rows[i].sign_normalize();
+      // We also move it just after all the other equalities,
+      // so that system `sys_rows' keeps its partial sortedness.
+      if (i != num_lines_or_equalities) {
+        sys.sys.rows[i].m_swap(sys.sys.rows[num_lines_or_equalities]);
+        swap(sat[i], sat[num_lines_or_equalities]);
+        swap(num_saturators[i], num_saturators[num_lines_or_equalities]);
+      }
+      ++num_lines_or_equalities;
+      // `sys' is no longer sorted.
+      sys_sorted = false;
+    }
+    else
+      // There exists a generator which does not saturate `sys[i]',
+      // so that `sys[i]' is indeed an inequality.
+      // We store the number of its saturators.
+      num_saturators[i] = num_cols_sat - sat[i].count_ones();
+  }
+
+  sys.set_sorted(sys_sorted);
+  PPL_ASSERT(sys.OK());
+
+  // At this point, all the equalities of `sys' (included those
+  // inequalities that we just transformed to equalities) have
+  // indexes between 0 and `num_lines_or_equalities' - 1,
+  // which is the property needed by method gauss().
+  // We can simplify the system of equalities, obtaining the rank
+  // of `sys' as result.
+  const dimension_type rank = sys.gauss(num_lines_or_equalities);
+
+  // Now the irredundant equalities of `sys' have indexes from 0
+  // to `rank' - 1, whereas the equalities having indexes from `rank'
+  // to `num_lines_or_equalities' - 1 are all redundant.
+  // (The inequalities in `sys' have been left untouched.)
+  // The rows containing equalities are not sorted.
+
+  if (rank < num_lines_or_equalities) {
+    // We identified some redundant equalities.
+    // Moving them at the bottom of `sys':
+    // - index `redundant' runs through the redundant equalities
+    // - index `erasing' identifies the first row that should
+    //   be erased after this loop.
+    // Note that we exit the loop either because we have removed all
+    // redundant equalities or because we have moved all the
+    // inequalities.
+    for (dimension_type redundant = rank,
+           erasing = num_rows;
+         redundant < num_lines_or_equalities
+           && erasing > num_lines_or_equalities;
+         ) {
+      --erasing;
+      sys.remove_row(redundant);
+      swap(sat[redundant], sat[erasing]);
+      swap(num_saturators[redundant], num_saturators[erasing]);
+      ++redundant;
+    }
+    // Adjusting the value of `num_rows' to the number of meaningful
+    // rows of `sys': `num_lines_or_equalities' - `rank' is the number of
+    // redundant equalities moved to the bottom of `sys', which are
+    // no longer meaningful.
+    num_rows -= num_lines_or_equalities - rank;
+
+    // If the above loop exited because it moved all inequalities, it may not
+    // have removed all the rendundant rows.
+    sys.remove_trailing_rows(sys.num_rows() - num_rows);
+
+    PPL_ASSERT(sys.num_rows() == num_rows);
+
+    sat.remove_trailing_rows(num_lines_or_equalities - rank);
+
+    // Adjusting the value of `num_lines_or_equalities'.
+    num_lines_or_equalities = rank;
+  }
+
+  const dimension_type old_num_rows = sys.num_rows();
+
+  // Now we use the definition of redundancy (given in the Introduction)
+  // to remove redundant inequalities.
+
+  // First we check the saturation rule, which provides a necessary
+  // condition for an inequality to be irredundant (i.e., it provides
+  // a sufficient condition for identifying redundant inequalities).
+  // Let
+  //
+  //   num_saturators[i] = num_sat_lines[i] + num_sat_rays_or_points[i],
+  //   dim_lin_space = num_irredundant_lines,
+  //   dim_ray_space
+  //     = dim_vector_space - num_irredundant_equalities - dim_lin_space
+  //     = num_columns - 1 - num_lines_or_equalities - dim_lin_space,
+  //   min_sat_rays_or_points = dim_ray_space.
+  //
+  // An inequality saturated by less than `dim_ray_space' _rays/points_
+  // is redundant. Thus we have the implication
+  //
+  //   (num_saturators[i] - num_sat_lines[i] < dim_ray_space)
+  //      ==>
+  //        redundant(sys[i]).
+  //
+  // Moreover, since every line saturates all inequalities, we also have
+  //     dim_lin_space = num_sat_lines[i]
+  // so that we can rewrite the condition above as follows:
+  //
+  //   (num_saturators[i] < num_columns - num_lines_or_equalities - 1)
+  //      ==>
+  //        redundant(sys[i]).
+  //
+  const dimension_type sys_num_columns
+    = sys.topology() == NECESSARILY_CLOSED ? sys.space_dimension() + 1
+                                           : sys.space_dimension() + 2;
+  const dimension_type min_saturators
+    = sys_num_columns - num_lines_or_equalities - 1;
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+    if (num_saturators[i] < min_saturators) {
+      // The inequality `sys[i]' is redundant.
+      --num_rows;
+      sys.remove_row(i);
+      swap(sat[i], sat[num_rows]);
+      swap(num_saturators[i], num_saturators[num_rows]);
+    }
+    else
+      ++i;
+  }
+
+  // Now we check the independence rule.
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ) {
+    bool redundant = false;
+    // NOTE: in the inner loop, index `j' runs through _all_ the
+    // inequalities and we do not test if `sat[i]' is strictly
+    // contained into `sat[j]'.  Experimentation has shown that this
+    // is faster than having `j' only run through the indexes greater
+    // than `i' and also doing the test `strict_subset(sat[i],
+    // sat[k])'.
+    for (dimension_type j = num_lines_or_equalities; j < num_rows; ) {
+      if (i == j)
+        // We want to compare different rows of `sys'.
+        ++j;
+      else {
+        // Let us recall that each generator lies on a facet of the
+        // polyhedron (see the Introduction).
+        // Given two constraints `c_1' and `c_2', if there are `m'
+        // generators lying on the hyper-plane corresponding to `c_1',
+        // the same `m' generators lie on the hyper-plane
+        // corresponding to `c_2', too, and there is another one lying
+        // on the latter but not on the former, then `c_2' is more
+        // restrictive than `c_1', i.e., `c_1' is redundant.
+        bool strict_subset;
+        if (subset_or_equal(sat[j], sat[i], strict_subset))
+          if (strict_subset) {
+            // All the saturators of the inequality `sys[i]' are
+            // saturators of the inequality `sys[j]' too,
+            // and there exists at least one saturator of `sys[j]'
+            // which is not a saturator of `sys[i]'.
+            // It follows that inequality `sys[i]' is redundant.
+            redundant = true;
+            break;
+          }
+          else {
+            // We have `sat[j] == sat[i]'.  Hence inequalities
+            // `sys[i]' and `sys[j]' are saturated by the same set of
+            // generators. Then we can remove either one of the two
+            // inequalities: we remove `sys[j]'.
+            --num_rows;
+            sys.remove_row(j);
+            PPL_ASSERT(sys.num_rows() == num_rows);
+            swap(sat[j], sat[num_rows]);
+            swap(num_saturators[j], num_saturators[num_rows]);
+          }
+        else
+          // If we reach this point then we know that `sat[i]' does
+          // not contain (and is different from) `sat[j]', so that
+          // `sys[i]' is not made redundant by inequality `sys[j]'.
+          ++j;
+      }
+    }
+    if (redundant) {
+      // The inequality `sys[i]' is redundant.
+      --num_rows;
+      sys.remove_row(i);
+      PPL_ASSERT(sys.num_rows() == num_rows);
+      swap(sat[i], sat[num_rows]);
+      swap(num_saturators[i], num_saturators[num_rows]);
+    }
+    else
+      // The inequality `sys[i]' is not redundant.
+      ++i;
+  }
+
+  // Here we physically remove the `sat' rows corresponding to the redundant
+  // inequalities previously removed from `sys'.
+  sat.remove_trailing_rows(old_num_rows - num_rows);
+
+  // At this point the first `num_lines_or_equalities' rows of 'sys'
+  // represent the irredundant equalities, while the remaining rows
+  // (i.e., those having indexes from `num_lines_or_equalities' to
+  // `num_rows' - 1) represent the irredundant inequalities.
+#ifndef NDEBUG
+  // Check if the flag is set (that of the equalities is already set).
+  for (dimension_type i = num_lines_or_equalities; i < num_rows; ++i)
+    PPL_ASSERT(sys[i].is_ray_or_point_or_inequality());
+#endif
+
+  // Finally, since now the sub-system (of `sys') of the irredundant
+  // equalities is in triangular form, we back substitute each
+  // variables with the expression obtained considering the equalities
+  // starting from the last one.
+  sys.back_substitute(num_lines_or_equalities);
+
+  // The returned value is the number of irredundant equalities i.e.,
+  // the rank of the sub-system of `sys' containing only equalities.
+  // (See the Introduction for definition of lineality space dimension.)
+  return num_lines_or_equalities;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Polyhedron_defs.hh line 2862. */
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 1. */
+/* Grid class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_defs.hh line 1. */
+/* Grid_Generator_System class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_defs.hh line 33. */
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid_Generator_System
+  Writes <CODE>false</CODE> if \p gs is empty.  Otherwise, writes on
+  \p s the generators of \p gs, all in one row and separated by ", ".
+*/
+std::ostream& operator<<(std::ostream& s, const Grid_Generator_System& gs);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid_Generator_System */
+void swap(Grid_Generator_System& x, Grid_Generator_System& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates Grid_Generator_System */
+bool operator==(const Grid_Generator_System& x,
+                const Grid_Generator_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A system of grid generators.
+/*! \ingroup PPL_CXX_interface
+    An object of the class Grid_Generator_System is a system of
+    grid generators, i.e., a multiset of objects of the class
+    Grid_Generator (lines, parameters and points).
+    When inserting generators in a system, space dimensions are
+    automatically adjusted so that all the generators in the system
+    are defined on the same vector space.
+    A system of grid generators which is meant to define a non-empty
+    grid must include at least one point: the reason is that
+    lines and parameters need a supporting point
+    (lines only specify directions while parameters only
+    specify direction and distance.
+
+    \par
+     In all the examples it is assumed that variables
+    <CODE>x</CODE> and <CODE>y</CODE> are defined as follows:
+    \code
+  Variable x(0);
+  Variable y(1);
+    \endcode
+
+    \par Example 1
+    The following code defines the line having the same direction
+    as the \f$x\f$ axis (i.e., the first Cartesian axis)
+    in \f$\Rset^2\f$:
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_line(x + 0*y));
+    \endcode
+    As said above, this system of generators corresponds to
+    an empty grid, because the line has no supporting point.
+    To define a system of generators that does correspond to
+    the \f$x\f$ axis, we can add the following code which
+    inserts the origin of the space as a point:
+    \code
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+    Since space dimensions are automatically adjusted, the following
+    code obtains the same effect:
+    \code
+  gs.insert(grid_point(0*x));
+    \endcode
+    In contrast, if we had added the following code, we would have
+    defined a line parallel to the \f$x\f$ axis through
+    the point \f$(0, 1)^\transpose \in \Rset^2\f$.
+    \code
+  gs.insert(grid_point(0*x + 1*y));
+    \endcode
+
+    \par Example 2
+    The following code builds a system of generators corresponding
+    to the grid consisting of all the integral points on the \f$x\f$ axes;
+    that is, all points satisfying the congruence relation
+    \f[
+      \bigl\{\,
+        (x, 0)^\transpose \in \Rset^2
+      \bigm|
+        x \pmod{1}\ 0
+      \,\bigr\},
+    \f]
+    \code
+  Grid_Generator_System gs;
+  gs.insert(parameter(x + 0*y));
+  gs.insert(grid_point(0*x + 0*y));
+    \endcode
+
+    \par Example 3
+    The following code builds a system of generators having three points
+    corresponding to a non-relational grid consisting of all points
+    whose coordinates are integer multiple of 3.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 3*y));
+  gs.insert(grid_point(3*x + 0*y));
+    \endcode
+
+    \par Example 4
+    By using parameters instead of two of the points we
+    can define the same grid as that defined in the previous example.
+    Note that there has to be at least one point and, for this purpose,
+    any point in the grid could be considered.
+    Thus the following code builds two identical grids from the
+    grid generator systems \p gs and \p gs1.
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(0*x + 3*y));
+  gs.insert(parameter(3*x + 0*y));
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(3*x + 3*y));
+  gs1.insert(parameter(0*x + 3*y));
+  gs1.insert(parameter(3*x + 0*y));
+    \endcode
+
+    \par Example 5
+    The following code builds a system of generators having one point and
+    a parameter corresponding to all the integral points that
+    lie on \f$x + y = 2\f$ in \f$\Rset^2\f$
+    \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(1*x + 1*y));
+  gs.insert(parameter(1*x - 1*y));
+    \endcode
+
+    \note
+    After inserting a multiset of generators in a grid generator system,
+    there are no guarantees that an <EM>exact</EM> copy of them
+    can be retrieved:
+    in general, only an <EM>equivalent</EM> grid generator system
+    will be available, where original generators may have been
+    reordered, removed (if they are duplicate or redundant), etc.
+*/
+class Parma_Polyhedra_Library::Grid_Generator_System {
+public:
+  typedef Grid_Generator row_type;
+
+  static const Representation default_representation = SPARSE;
+
+  //! Default constructor: builds an empty system of generators.
+  explicit Grid_Generator_System(Representation r = default_representation);
+
+  //! Builds the singleton system containing only generator \p g.
+  explicit Grid_Generator_System(const Grid_Generator& g,
+                                 Representation r = default_representation);
+
+  //! Builds an empty system of generators of dimension \p dim.
+  explicit Grid_Generator_System(dimension_type dim,
+                                 Representation r = default_representation);
+
+  //! Ordinary copy constructor.
+  //! The new Grid_Generator_System will have the same representation as `gs'.
+  Grid_Generator_System(const Grid_Generator_System& gs);
+
+  //! Copy constructor with specified representation.
+  Grid_Generator_System(const Grid_Generator_System& gs, Representation r);
+
+  //! Destructor.
+  ~Grid_Generator_System();
+
+  //! Assignment operator.
+  Grid_Generator_System& operator=(const Grid_Generator_System& y);
+
+  //! Returns the current representation of *this.
+  Representation representation() const;
+
+  //! Converts *this to the specified representation.
+  void set_representation(Representation r);
+
+  //! Returns the maximum space dimension a Grid_Generator_System can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Removes all the generators from the generator system and sets its
+    space dimension to 0.
+  */
+  void clear();
+
+  /*! \brief
+    Inserts into \p *this a copy of the generator \p g, increasing the
+    number of space dimensions if needed.
+
+    If \p g is an all-zero parameter then the only action is to ensure
+    that the space dimension of \p *this is at least the space
+    dimension of \p g.
+  */
+  void insert(const Grid_Generator& g);
+
+  /*! \brief
+    Inserts into \p *this the generator \p g, increasing the number of
+    space dimensions if needed.
+  */
+  void insert(Grid_Generator& g, Recycle_Input);
+
+  /*! \brief
+    Inserts into \p *this the generators in \p gs, increasing the
+    number of space dimensions if needed.
+  */
+  void insert(Grid_Generator_System& gs, Recycle_Input);
+
+  //! Initializes the class.
+  static void initialize();
+
+  //! Finalizes the class.
+  static void finalize();
+
+  /*! \brief
+    Returns the singleton system containing only
+    Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System& zero_dim_univ();
+
+  //! An iterator over a system of grid generators
+  /*! \ingroup PPL_CXX_interface
+    A const_iterator is used to provide read-only access
+    to each generator contained in an object of Grid_Generator_System.
+
+    \par Example
+    The following code prints the system of generators
+    of the grid <CODE>gr</CODE>:
+    \code
+  const Grid_Generator_System& ggs = gr.generators();
+  for (Grid_Generator_System::const_iterator i = ggs.begin(),
+        ggs_end = ggs.end(); i != ggs_end; ++i)
+    cout << *i << endl;
+    \endcode
+    The same effect can be obtained more concisely by using
+    more features of the STL:
+    \code
+  const Grid_Generator_System& ggs = gr.generators();
+  copy(ggs.begin(), ggs.end(), ostream_iterator<Grid_Generator>(cout, "\n"));
+    \endcode
+  */
+  class const_iterator
+    : public std::iterator<std::forward_iterator_tag,
+                           Grid_Generator,
+                           ptrdiff_t,
+                           const Grid_Generator*,
+                           const Grid_Generator&> {
+  public:
+    //! Default constructor.
+    const_iterator();
+
+    //! Ordinary copy constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Destructor.
+    ~const_iterator();
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    const Grid_Generator& operator*() const;
+
+    //! Indirect member selector.
+    const Grid_Generator* operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this and \p y are
+      different.
+    */
+    bool operator!=(const const_iterator& y) const;
+
+  private:
+    friend class Grid_Generator_System;
+
+    Linear_System<Grid_Generator>::const_iterator i;
+
+    //! Copy constructor from Linear_System< Grid_Generator>::const_iterator.
+    const_iterator(const Linear_System<Grid_Generator>::const_iterator& y);
+  };
+
+  //! Returns <CODE>true</CODE> if and only if \p *this has no generators.
+  bool empty() const;
+
+  /*! \brief
+    Returns the const_iterator pointing to the first generator, if \p
+    *this is not empty; otherwise, returns the past-the-end
+    const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  //! Returns the number of rows (generators) in the system.
+  dimension_type num_rows() const;
+
+  //! Returns the number of parameters in the system.
+  dimension_type num_parameters() const;
+
+  //! Returns the number of lines in the system.
+  dimension_type num_lines() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this contains one or
+    more points.
+  */
+  bool has_points() const;
+
+  //! Returns <CODE>true</CODE> if \p *this is identical to \p y.
+  bool is_equal_to(const Grid_Generator_System& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+
+    Resizes the matrix of generators using the numbers of rows and columns
+    read from \p s, then initializes the coordinates of each generator
+    and its type reading the contents from \p s.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Grid_Generator_System& y);
+
+private:
+  //! Returns a constant reference to the \p k- th generator of the system.
+  const Grid_Generator& operator[](dimension_type k) const;
+
+  //! Assigns to a given variable an affine expression.
+  /*!
+    \param v
+    The variable to which the affine transformation is assigned;
+
+    \param expr
+    The numerator of the affine transformation:
+    \f$\sum_{i = 0}^{n - 1} a_i x_i + b\f$;
+
+    \param denominator
+    The denominator of the affine transformation;
+
+    We allow affine transformations (see the Section \ref
+    rational_grid_operations)to have rational
+    coefficients. Since the coefficients of linear expressions are
+    integers we also provide an integer \p denominator that will
+    be used as denominator of the affine transformation.  The
+    denominator is required to be a positive integer and its
+    default value is 1.
+
+    The affine transformation assigns to every variable \p v, in every
+    column, the follow expression:
+    \f[
+      \frac{\sum_{i = 0}^{n - 1} a_i x_i + b}
+           {\mathrm{denominator}}.
+    \f]
+
+    \p expr is a constant parameter and unaltered by this computation.
+  */
+  void affine_image(Variable v,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator);
+
+  //! Sets the sortedness flag of the system to \p b.
+  void set_sorted(bool b);
+
+  /*! \brief
+    Adds \p dims rows and \p dims columns of zeroes to the matrix,
+    initializing the added rows as in the universe system.
+
+    \param dims
+    The number of rows and columns to be added: must be strictly
+    positive.
+
+    Turns the \f$r \times c\f$ matrix \f$A\f$ into the \f$(r+dims)
+    \times (c+dims)\f$ matrix
+    \f$\bigl(\genfrac{}{}{0pt}{}{A}{0} \genfrac{}{}{0pt}{}{0}{B}\bigr)\f$
+    where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+    \f$\bigl(\genfrac{}{}{0pt}{}{1}{0} \genfrac{}{}{0pt}{}{0}{1}\bigr)\f$.
+    The matrix is expanded avoiding reallocation whenever possible.
+  */
+  void add_universe_rows_and_columns(dimension_type dims);
+
+  //! Resizes the system to the specified space dimension.
+  void set_space_dimension(dimension_type space_dim);
+
+  //! Removes all the specified dimensions from the generator system.
+  /*!
+    The space dimension of the variable with the highest space
+    dimension in \p vars must be at most the space dimension
+    of \p this.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  //! Shift by \p n positions the coefficients of variables, starting from
+  //! the coefficient of \p v. This increases the space dimension by \p n.
+  void shift_space_dimensions(Variable v, dimension_type n);
+
+  //! Sets the index to indicate that the system has no pending rows.
+  void unset_pending_rows();
+
+  //! Permutes the space dimensions of the matrix.
+  /*
+    \param cycle
+    A vector representing a cycle of the permutation according to which the
+    columns must be rearranged.
+
+    The \p cycle vector represents a cycle of a permutation of space
+    dimensions.
+    For example, the permutation
+    \f$ \{ x_1 \mapsto x_2, x_2 \mapsto x_3, x_3 \mapsto x_1 \}\f$ can be
+    represented by the vector containing \f$ x_1, x_2, x_3 \f$.
+  */
+  void permute_space_dimensions(const std::vector<Variable>& cycle);
+
+  bool has_no_rows() const;
+
+  //! Makes the system shrink by removing its \p n trailing rows.
+  void remove_trailing_rows(dimension_type n);
+
+  void insert_verbatim(const Grid_Generator& g);
+
+  //! Returns the system topology.
+  Topology topology() const;
+
+  //! Returns the index of the first pending row.
+  dimension_type first_pending_row() const;
+
+  Linear_System<Grid_Generator> sys;
+
+  /*! \brief
+    Holds (between class initialization and finalization) a pointer to
+    the singleton system containing only Grid_Generator::zero_dim_point().
+  */
+  static const Grid_Generator_System* zero_dim_univ_p;
+
+  friend bool
+  operator==(const Grid_Generator_System& x, const Grid_Generator_System& y);
+
+  //! Sets the index of the first pending row to \p i.
+  void set_index_first_pending_row(dimension_type i);
+
+  //! Removes all the invalid lines and parameters.
+  /*!
+    The invalid lines and parameters are those with all
+    the homogeneous terms set to zero.
+  */
+  void remove_invalid_lines_and_parameters();
+
+  friend class Polyhedron;
+  friend class Grid;
+};
+
+// Grid_Generator_System_inlines.hh is not included here on purpose.
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_inlines.hh line 1. */
+/* Grid_Generator_System class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Generator_System_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+  sys.set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+  sys.unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+  sys.set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System
+::permute_space_dimensions(const std::vector<Variable>& cycle) {
+  return sys.permute_space_dimensions(cycle);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System& y) const {
+  return (sys == y.sys);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+  sys.set_sorted(false);
+  PPL_ASSERT(space_dimension() == 0);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+  : sys(gs.sys) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs,
+                                             Representation r)
+  : sys(gs.sys, r) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim,
+                                             Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+  sys.set_space_dimension(dim);
+  sys.set_sorted(false);
+  PPL_ASSERT(space_dimension() == dim);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g,
+                                             Representation r)
+  : sys(NECESSARILY_CLOSED, r) {
+  sys.insert(g);
+  sys.set_sorted(false);
+}
+
+inline
+Grid_Generator_System::~Grid_Generator_System() {
+}
+
+inline Grid_Generator_System&
+Grid_Generator_System::operator=(const Grid_Generator_System& y) {
+  Grid_Generator_System tmp = y;
+  swap(*this, tmp);
+  return *this;
+}
+
+inline Representation
+Grid_Generator_System::representation() const {
+  return sys.representation();
+}
+
+inline void
+Grid_Generator_System::set_representation(Representation r) {
+  sys.set_representation(r);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+  // Grid generators use an extra column for the parameter divisor.
+  return Linear_System<Grid_Generator>::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+  return sys.space_dimension();
+}
+
+inline const Grid_Generator_System&
+Grid_Generator_System::zero_dim_univ() {
+  PPL_ASSERT(zero_dim_univ_p != 0);
+  return *zero_dim_univ_p;
+}
+
+inline void
+Grid_Generator_System::clear() {
+  sys.clear();
+  sys.set_sorted(false);
+  sys.unset_pending_rows();
+  PPL_ASSERT(space_dimension() == 0);
+}
+
+inline void
+Grid_Generator_System::m_swap(Grid_Generator_System& y) {
+  swap(sys, y.sys);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+  return sys.external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+  return external_memory_in_bytes() + sizeof(*this);
+}
+
+inline dimension_type
+Grid_Generator_System::num_rows() const {
+  return sys.num_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+  : i() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+  return *i;
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+  return i.operator->();
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::const_iterator::operator++(int) {
+  const const_iterator tmp = *this;
+  operator++();
+  return tmp;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+  return i != y.i;
+}
+
+inline bool
+Grid_Generator_System::empty() const {
+  return sys.has_no_rows();
+}
+
+inline
+Grid_Generator_System::const_iterator
+::const_iterator(const Linear_System<Grid_Generator>::const_iterator& y)
+  : i(y) {
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+  return static_cast<Grid_Generator_System::const_iterator>(sys.begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+  return static_cast<Grid_Generator_System::const_iterator>(sys.end());
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+  return sys[k];
+}
+
+inline bool
+Grid_Generator_System::has_no_rows() const {
+  return sys.has_no_rows();
+}
+
+inline void
+Grid_Generator_System::remove_trailing_rows(dimension_type n) {
+  sys.remove_trailing_rows(n);
+}
+
+inline void
+Grid_Generator_System::insert_verbatim(const Grid_Generator& g) {
+  sys.insert(g);
+}
+
+inline Topology
+Grid_Generator_System::topology() const {
+  return sys.topology();
+}
+
+inline dimension_type
+Grid_Generator_System::first_pending_row() const {
+  return sys.first_pending_row();
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+           const Grid_Generator_System& y) {
+  return x.is_equal_to(y);
+}
+
+/*! \relates Grid_Generator_System */
+inline void
+swap(Grid_Generator_System& x, Grid_Generator_System& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 47. */
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Grid
+  Writes a textual representation of \p gr on \p s: <CODE>false</CODE>
+  is written if \p gr is an empty grid; <CODE>true</CODE> is written
+  if \p gr is a universe grid; a minimized system of congruences
+  defining \p gr is written otherwise, all congruences in one row
+  separated by ", "s.
+*/
+std::ostream&
+operator<<(std::ostream& s, const Grid& gr);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Grid */
+void swap(Grid& x, Grid& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  grid.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+bool operator==(const Grid& x, const Grid& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  grids.
+
+  \relates Grid
+  Note that \p x and \p y may be dimension-incompatible grids: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+bool operator!=(const Grid& x, const Grid& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! A grid.
+/*! \ingroup PPL_CXX_interface
+  An object of the class Grid represents a rational grid.
+
+  The domain of grids <EM>optimally supports</EM>:
+    - all (proper and non-proper) congruences;
+    - tautological and inconsistent constraints;
+    - linear equality constraints (i.e., non-proper congruences).
+
+  Depending on the method, using a constraint that is not optimally
+  supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  The domain of grids support a concept of double description similar
+  to the one developed for polyhedra: hence, a grid can be specified
+  as either a finite system of congruences or a finite system of
+  generators (see Section \ref sect_rational_grids) and it is always
+  possible to obtain either representation.
+  That is, if we know the system of congruences, we can obtain
+  from this a system of generators that define the same grid
+  and vice versa.
+  These systems can contain redundant members, or they can be in the
+  minimal form.
+
+  A key attribute of any grid is its space dimension (the dimension
+  \f$n \in \Nset\f$ of the enclosing vector space):
+
+  - all grids, the empty ones included, are endowed with a space
+    dimension;
+  - most operations working on a grid and another object (another
+    grid, a congruence, a generator, a set of variables, etc.) will
+    throw an exception if the grid and the object are not
+    dimension-compatible (see Section \ref Grid_Space_Dimensions);
+  - the only ways in which the space dimension of a grid can be
+    changed are with <EM>explicit</EM> calls to operators provided for
+    that purpose, and with standard copy, assignment and swap
+    operators.
+
+  Note that two different grids can be defined on the zero-dimension
+  space: the empty grid and the universe grid \f$R^0\f$.
+
+  \par
+  In all the examples it is assumed that variables
+  <CODE>x</CODE> and <CODE>y</CODE> are defined (where they are
+  used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a grid corresponding to the even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying three of the points:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_point(0*x + 2*y));
+  gs.insert(grid_point(2*x + 0*y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 2
+  The following code builds a grid corresponding to a line in
+  \f$\Rset^2\f$ by adding a single congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a line:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(grid_line(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 3
+  The following code builds a grid corresponding to the integral
+  points on the line \f$x = y\f$ in \f$\Rset^2\f$ constructed
+  by adding an equality and congruence to the universe grid:
+  \code
+  Congruence_System cgs;
+  cgs.insert(x - y == 0);
+  cgs.insert(x %= 0);
+  Grid gr(cgs);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from a system of generators specifying a point and a parameter:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*x + 0*y));
+  gs.insert(parameter(x + y));
+  Grid gr(gs);
+  \endcode
+
+  \par Example 4
+  The following code builds the grid corresponding to a plane by
+  creating the universe grid in \f$\Rset^2\f$:
+  \code
+  Grid gr(2);
+  \endcode
+  The following code builds the same grid as above, but starting
+  from the empty grid in \f$\Rset^2\f$ and inserting the appropriate
+  generators (a point, and two lines).
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_line(x));
+  gr.add_grid_generator(grid_line(y));
+  \endcode
+  Note that a generator system must contain a point when describing
+  a grid.  To ensure that this is always the case it is required
+  that the first generator inserted in an empty grid is a point
+  (otherwise, an exception is thrown).
+
+  \par Example 5
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_embed</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_embed(1);
+  \endcode
+  We build the universe grid in the 1-dimension space \f$\Rset\f$.
+  Then we add a single equality congruence,
+  thus obtaining the grid corresponding to the singleton set
+  \f$\{ 2 \} \sseq \Rset\f$.
+  After the last line of code, the resulting grid is
+  \f[
+  \bigl\{\,
+  (2, y)^\transpose \in \Rset^2
+  \bigm|
+  y \in \Rset
+  \,\bigr\}.
+  \f]
+
+  \par Example 6
+  The following code shows the use of the function
+  <CODE>add_space_dimensions_and_project</CODE>:
+  \code
+  Grid gr(1);
+  gr.add_congruence(x == 2);
+  gr.add_space_dimensions_and_project(1);
+  \endcode
+  The first two lines of code are the same as in Example 4 for
+  <CODE>add_space_dimensions_and_embed</CODE>.
+  After the last line of code, the resulting grid is
+  the singleton set
+  \f$\bigl\{ (2, 0)^\transpose \bigr\} \sseq \Rset^2\f$.
+
+  \par Example 7
+  The following code shows the use of the function
+  <CODE>affine_image</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_image(x, expr);
+  \endcode
+  In this example the starting grid is all the pairs of \f$x\f$ and
+  \f$y\f$ in \f$\Rset^2\f$ where \f$x\f$ is an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2.  The considered variable
+  is \f$x\f$ and the affine expression is \f$x+3\f$.  The resulting
+  grid is the given grid translated 3 integers to the right (all the
+  pairs \f$(x, y)\f$ where \f$x\f$ is -1 plus an integer multiple of 4
+  and \f$y\f$ is an integer multiple of 2).
+  Moreover, if the affine transformation for the same variable \p x
+  is instead \f$x+y\f$:
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is every second integral point along the \f$x=y\f$
+  line, with this line of points repeated at every fourth integral value
+  along the \f$x\f$ axis.
+  Instead, if we do not use an invertible transformation for the
+  same variable; for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every second point along the \f$x=y\f$ line.
+
+  \par Example 8
+  The following code shows the use of the function
+  <CODE>affine_preimage</CODE>:
+  \code
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(0*x + 0*y));
+  gr.add_grid_generator(grid_point(4*x + 0*y));
+  gr.add_grid_generator(grid_point(0*x + 2*y));
+  Linear_Expression expr = x + 3;
+  gr.affine_preimage(x, expr);
+  \endcode
+  In this example the starting grid, \p var and the affine
+  expression and the denominator are the same as in Example 6, while
+  the resulting grid is similar but translated 3 integers to the
+  left (all the pairs \f$(x, y)\f$
+  where \f$x\f$ is -3 plus an integer multiple of 4 and
+  \f$y\f$ is an integer multiple of 2)..
+  Moreover, if the affine transformation for \p x is \f$x+y\f$
+  \code
+  Linear_Expression expr = x + y;
+  \endcode
+  the resulting grid is a similar grid to the result in Example 6,
+  only the grid is slanted along \f$x=-y\f$.
+  Instead, if we do not use an invertible transformation for the same
+  variable \p x, for example, the affine expression \f$y\f$:
+  \code
+  Linear_Expression expr = y;
+  \endcode
+  the resulting grid is every fourth line parallel to the \f$x\f$
+  axis.
+
+  \par Example 9
+  For this example we also use the variables:
+  \code
+  Variable z(2);
+  Variable w(3);
+  \endcode
+  The following code shows the use of the function
+  <CODE>remove_space_dimensions</CODE>:
+  \code
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*x + y +0*z + 2*w));
+  Grid gr(gs);
+  Variables_Set vars;
+  vars.insert(y);
+  vars.insert(z);
+  gr.remove_space_dimensions(vars);
+  \endcode
+  The starting grid is the singleton set
+  \f$\bigl\{ (3, 1, 0, 2)^\transpose \bigr\} \sseq \Rset^4\f$, while
+  the resulting grid is
+  \f$\bigl\{ (3, 2)^\transpose \bigr\} \sseq \Rset^2\f$.
+  Be careful when removing space dimensions <EM>incrementally</EM>:
+  since dimensions are automatically renamed after each application
+  of the <CODE>remove_space_dimensions</CODE> operator, unexpected
+  results can be obtained.
+  For instance, by using the following code we would obtain
+  a different result:
+  \code
+  set<Variable> vars1;
+  vars1.insert(y);
+  gr.remove_space_dimensions(vars1);
+  set<Variable> vars2;
+  vars2.insert(z);
+  gr.remove_space_dimensions(vars2);
+  \endcode
+  In this case, the result is the grid
+  \f$\bigl\{(3, 0)^\transpose \bigr\} \sseq \Rset^2\f$:
+  when removing the set of dimensions \p vars2
+  we are actually removing variable \f$w\f$ of the original grid.
+  For the same reason, the operator \p remove_space_dimensions
+  is not idempotent: removing twice the same non-empty set of dimensions
+  is never the same as removing them just once.
+*/
+
+class Parma_Polyhedra_Library::Grid {
+public:
+  //! The numeric type of coefficients.
+  typedef Coefficient coefficient_type;
+
+  //! Returns the maximum space dimension all kinds of Grid can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
+  /*! \brief
+    Returns true indicating that this domain has methods that
+    can recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  //! Builds a grid having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    Specifies whether the universe or the empty grid has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(dimension_type num_dimensions = 0,
+                Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a grid, copying a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Congruence_System& cgs);
+
+  //! Builds a grid, recycling a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  Grid(Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds a grid, copying a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains inequality constraints.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Constraint_System& cs);
+
+  //! Builds a grid, recycling a system of constraints.
+  /*!
+    The grid inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the constraint system \p cs contains inequality constraints.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  Grid(Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a grid, copying a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param ggs
+    The system of generators defining the grid.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Grid_Generator_System& ggs);
+
+  //! Builds a grid, recycling a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param ggs
+    The system of generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+  */
+  Grid(Grid_Generator_System& ggs, Recycle_Input dummy);
+
+  //! Builds a grid out of a box.
+  /*!
+    The grid inherits the space dimension of the box.
+    The built grid is the most precise grid that includes the box.
+
+    \param box
+    The box representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Grid(const Box<Interval>& box,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a grid out of a bounded-difference shape.
+  /*!
+    The grid inherits the space dimension of the BDS.
+    The built grid is the most precise grid that includes the BDS.
+
+    \param bd
+    The BDS representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Grid(const BD_Shape<U>& bd,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a grid out of an octagonal shape.
+  /*!
+    The grid inherits the space dimension of the octagonal shape.
+    The built grid is the most precise grid that includes the octagonal shape.
+
+    \param os
+    The octagonal shape representing the grid to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Grid(const Octagonal_Shape<U>& os,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Builds a grid from a polyhedron using algorithms whose complexity
+    does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the grid built is the
+    smallest one containing \p ph.
+
+    The grid inherits the space dimension of polyhedron.
+
+    \param ph
+    The polyhedron.
+
+    \param complexity
+    The complexity class.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Grid(const Polyhedron& ph,
+                Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Grid(const Grid& y,
+       Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Grid& operator=(const Grid& y);
+
+  //! \name Member Functions that Do Not Modify the Grid
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns
+    the \ref Grid_Affine_Dimension "affine dimension" of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  /*! \brief
+    Returns a system of equality constraints satisfied by \p *this
+    with the same affine dimension as \p *this.
+  */
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Returns a minimal system of equality constraints satisfied by
+    \p *this with the same affine dimension as \p *this.
+  */
+  Constraint_System minimized_constraints() const;
+
+  //! Returns the system of congruences.
+  const Congruence_System& congruences() const;
+
+  //! Returns the system of congruences in minimal form.
+  const Congruence_System& minimized_congruences() const;
+
+  //! Returns the system of generators.
+  const Grid_Generator_System& grid_generators() const;
+
+  //! Returns the minimized system of generators.
+  const Grid_Generator_System& minimized_grid_generators() const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Grid_Generator& g) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  // FIXME: see the comment for Poly_Con_Relation above.
+  Poly_Gen_Relation
+  relation_with(const Generator& g) const;
+
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  // FIXME: Poly_Con_Relation seems to encode exactly what we want
+  // here.  We must find a new name for that class.  Temporarily,
+  // we keep using it without changing the name.
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns \c true if and only if \p *this is an empty grid.
+  bool is_empty() const;
+
+  //! Returns \c true if and only if \p *this is a universe grid.
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a
+    topologically closed subset of the vector space.
+
+    A grid is always topologically closed.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  /*!
+    A grid is discrete if it can be defined by a generator system which
+    contains only points and parameters.  This includes the empty grid
+    and any grid in dimension zero.
+  */
+  bool is_discrete() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is bounded.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+    Always <CODE>true</CODE> when \p this bounds \p expr.  Present for
+    interface compatibility with class Polyhedron, where closure
+    points can result in a value of false;
+
+    \param point
+    When maximization succeeds, will be assigned a point where \p expr
+    reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p point are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the is the infimum value can be reached in \p
+    this.  Always <CODE>true</CODE> when \p this bounds \p expr.
+    Present for interface compatibility with class Polyhedron, where
+    closure points can result in a value of false;
+
+    \param point
+    When minimization succeeds, will be assigned a point where \p expr
+    reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& point) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+    is defined, in which case the frequency and the value for \p expr
+    that is closest to zero are computed.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    The numerator of the maximum frequency of \p expr;
+
+    \param freq_d
+    The denominator of the maximum frequency of \p expr;
+
+    \param val_n
+    The numerator of them value of \p expr at a point in the grid
+    that is closest to zero;
+
+    \param val_d
+    The denominator of a value of \p expr at a point in the grid
+    that is closest to zero;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or frequency is undefined with respect to \p expr,
+    then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Grid& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this strictly
+    contains \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Grid& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  /*!
+    \return
+    <CODE>true</CODE> if and only if \p *this satisfies all the
+    invariants and either \p check_not_empty is <CODE>false</CODE> or
+    \p *this is not empty.
+
+    \param check_not_empty
+    <CODE>true</CODE> if and only if, in addition to checking the
+    invariants, \p *this must be checked to be not empty.
+
+    The check is performed so as to intrude as little as possible.  If
+    the library has been compiled with run-time assertions enabled,
+    error messages are written on <CODE>std::cerr</CODE> in case
+    invariants are violated. This is useful for the purpose of
+    debugging the library.
+  */
+  bool OK(bool check_not_empty = false) const;
+
+  //@} // Member Functions that Do Not Modify the Grid
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Grid
+  //@{
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds a copy of grid generator \p g to the system of generators of
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible,
+    or if \p *this is an empty grid and \p g is not a point.
+  */
+  void add_grid_generator(const Grid_Generator& g);
+
+  //! Adds a copy of each congruence in \p cgs to \p *this.
+  /*!
+    \param cgs
+    Contains the congruences that will be added to the system of
+    congruences of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this a congruence equivalent to constraint \p c.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible
+    or if constraint \p c is not optimally supported by the grid domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+    \param cs
+    The constraints to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible
+    or if \p cs contains a constraint which is not optimally supported
+    by the grid domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this congruences equivalent to the constraints in \p cs.
+
+    \param cs
+    The constraints to be added. They may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible
+    or if \p cs contains a constraint which is not optimally supported
+    by the grid domain.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  //! Uses a copy of the congruence \p cg to refine \p *this.
+  /*!
+    \param cg
+    The congruence used.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+ //! Uses a copy of the congruences in \p cgs to refine \p *this.
+  /*!
+    \param cgs
+    The congruences used.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  //! Uses a copy of the constraint \p c to refine \p *this.
+  /*!
+
+    \param c
+    The constraint used. If it is not an equality, it will be ignored
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Uses a copy of the constraints in \p cs to refine \p *this.
+  /*!
+    \param cs
+    The constraints used. Constraints that are not equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds a copy of the generators in \p gs to the system of generators
+    of \p *this.
+
+    \param gs
+    Contains the generators that will be added to the system of
+    generators of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible, or if
+    \p *this is empty and the system of generators \p gs is not empty,
+    but has no points.
+  */
+  void add_grid_generators(const Grid_Generator_System& gs);
+
+  /*! \brief
+    Adds the generators in \p gs to the system of generators of \p
+    *this.
+
+    \param gs
+    The generator system to be added to \p *this.  The generators in
+    \p gs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p gs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p gs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_grid_generators(Grid_Generator_System& gs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Assigns to \p *this the intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the least upper bound of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Grid& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact it is assigned to \p
+    *this and <CODE>true</CODE> is returned, otherwise
+    <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Convex_Polyhedral_Difference "grid-difference"
+    of \p *this and \p y.
+
+    The grid difference between grids x and y is the smallest grid
+    containing all the points from x and y that are only in x.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Grid& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering the generators of a grid, the
+    affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{\mathrm{denominator}}
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If congruences are up-to-date, it uses the specialized function
+    affine_preimage() (for the system of congruences)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e., \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+             + \sum_{i \neq var} a_i x_i + b,
+       \f]
+       so that the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+             - \sum_{i \neq j} a_i x_i - b.
+       \f]
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only generators remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref Grid_Affine_Transformation
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+
+    \if Include_Implementation_Details
+
+    When considering congruences of a grid, the affine transformation
+    \f[
+      \frac{\sum_{i=0}^{n-1} a_i x_i + b}{denominator},
+    \f]
+    is assigned to \p var where \p expr is
+    \f$\sum_{i=0}^{n-1} a_i x_i + b\f$
+    (\f$b\f$ is the inhomogeneous term).
+
+    If generators are up-to-date, then the specialized function
+    affine_image() is used (for the system of generators)
+    and inverse transformation to reach the same result.
+    To obtain the inverse transformation, we use the following observation.
+
+    Observation:
+    -# The affine transformation is invertible if the coefficient
+       of \p var in this transformation (i.e. \f$a_\mathrm{var}\f$)
+       is different from zero.
+    -# If the transformation is invertible, then we can write
+       \f[
+         \mathrm{denominator} * {x'}_\mathrm{var}
+           = \sum_{i = 0}^{n - 1} a_i x_i + b
+           = a_\mathrm{var} x_\mathrm{var}
+               + \sum_{i \neq \mathrm{var}} a_i x_i + b,
+       \f],
+       the inverse transformation is
+       \f[
+         a_\mathrm{var} x_\mathrm{var}
+           = \mathrm{denominator} * {x'}_\mathrm{var}
+               - \sum_{i \neq j} a_i x_i - b.
+       \f].
+
+    Then, if the transformation is invertible, all the entities that
+    were up-to-date remain up-to-date. Otherwise only congruences remain
+    up-to-date.
+
+    \endif
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void
+  generalized_affine_image(Variable var,
+                           Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator
+                           = Coefficient_one(),
+                           Coefficient_traits::const_reference modulus
+                           = Coefficient_zero());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{var}' = \frac{\mathrm{expr}}{\mathrm{denominator}}
+    \pmod{\mathrm{modulus}}\f$.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+    Optional argument with an automatic value of one;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p
+    *this.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one(),
+                              Coefficient_traits::const_reference modulus
+                              = Coefficient_zero());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to
+    the \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void
+  generalized_affine_image(const Linear_Expression& lhs,
+                           Relation_Symbol relsym,
+                           const Linear_Expression& rhs,
+                           Coefficient_traits::const_reference modulus
+                           = Coefficient_zero());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Grid_Generalized_Image "generalized affine relation"
+    \f$\mathrm{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol where EQUAL is the symbol for a congruence
+    relation;
+
+    \param rhs
+    The right hand side affine expression;
+
+    \param modulus
+    The modulus of the congruence lhs %= rhs.  A modulus of zero
+    indicates lhs == rhs.  Optional argument with an automatic value
+    of zero.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p
+    rhs.
+  */
+  void
+  generalized_affine_preimage(const Linear_Expression& lhs,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& rhs,
+                              Coefficient_traits::const_reference modulus
+                              = Coefficient_zero());
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Time_Elapse
+    "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Grid& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system.
+    This argument is for compatibility with wrap_assign()
+    for the other domains and only checked for dimension-compatibility.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator".
+    This argument is for compatibility with wrap_assign()
+    for the other domains and is ignored.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually.
+    As wrapping dimensions collectively does not improve the precision,
+    this argument is ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars or with <CODE>*cs_p</CODE>.
+
+    \warning
+    It is assumed that variables in \p Vars represent integers.  Thus,
+    where the extra cost is negligible, the integrality of these
+    variables is enforced; possibly causing a non-integral grid to
+    become empty.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping all points with non-integer
+    coordinates.
+
+    \param complexity
+    This argument is ignored as the algorithm used has polynomial
+    complexity.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping all points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    This argument is ignored as the algorithm used has polynomial
+    complexity.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using congruence systems.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void congruence_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y using generator systems.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void generator_widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Grid_Widening
+    "Grid widening" between \p *this and \p y.
+
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Grid& y, unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the congruence variant of
+    \ref Grid_Widening "Grid widening" computation by also enforcing
+    those congruences in \p cgs that are satisfied by all the points
+    of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+  */
+  void limited_congruence_extrapolation_assign(const Grid& y,
+                                               const Congruence_System& cgs,
+                                               unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the generator variant of the
+    \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+  */
+  void limited_generator_extrapolation_assign(const Grid& y,
+                                              const Congruence_System& cgs,
+                                              unsigned* tp = NULL);
+
+  /*! \brief
+    Improves the result of the \ref Grid_Widening "Grid widening"
+    computation by also enforcing those congruences in \p cgs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A grid that <EM>must</EM> be contained in \p *this;
+
+    \param cgs
+    The system of congruences used to improve the widened grid;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Grid_Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cgs are dimension-incompatible.
+  */
+  void limited_extrapolation_assign(const Grid& y,
+                                    const Congruence_System& cgs,
+                                    unsigned* tp = NULL);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+    \p m new space dimensions and embeds the old grid in the new
+    vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables which are the new dimensions can have any
+    value.  For instance, when starting from the grid \f$\cL \sseq
+    \Rset^2\f$ and adding a third space dimension, the result will be
+    the grid
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    \ref Adding_New_Dimensions_to_the_Vector_Space "Adds"
+    \p m new space dimensions to the grid and does not embed it
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new grid, which is characterized by a system of congruences
+    in which the variables running through the new dimensions are all
+    constrained to be equal to 0.  For instance, when starting from
+    the grid \f$\cL \sseq \Rset^2\f$ and adding a third space
+    dimension, the result will be the grid
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cL
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation" of
+    \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Grid& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have \ref Removing_Dimensions_from_the_Vector_Space
+    "dimension \p new_dimension."
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing the grid.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.  Also
+    thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==(const Grid& x, const Grid& y);
+
+  friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Grid();
+
+  /*! \brief
+    Swaps \p *this with grid \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void m_swap(Grid& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+private:
+
+  //! The system of congruences.
+  Congruence_System con_sys;
+
+  //! The system of generators.
+  Grid_Generator_System gen_sys;
+
+#define PPL_IN_Grid_CLASS
+/* Automatically generated from PPL source file ../src/Grid_Status_idefs.hh line 1. */
+/* Grid::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Grid_CLASS
+#error "Do not include Grid_Status_idefs.hh directly; use Grid_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a grid.
+/*!
+  The assertions supported that are in use are:
+  - <EM>zero-dim universe</EM>: the grid is the zero-dimension
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the grid is the empty set;
+  - <EM>congruences up-to-date</EM>: the grid is correctly
+    characterized by the attached system of congruences, modulo the
+    processing of pending generators;
+  - <EM>generators up-to-date</EM>: the grid is correctly
+    characterized by the attached system of generators, modulo the
+    processing of pending congruences;
+  - <EM>congruences minimized</EM>: the non-pending part of the system
+    of congruences attached to the grid is in minimal form;
+  - <EM>generators minimized</EM>: the non-pending part of the system
+    of generators attached to the grid is in minimal form.
+
+  Other supported assertions are:
+  - <EM>congruences pending</EM>
+  - <EM>generators pending</EM>
+  - <EM>congruences' saturation matrix up-to-date</EM>
+  - <EM>generators' saturation matrix up-to-date</EM>.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>congruences pending</EM> and <EM>generators pending</EM>
+    are mutually exclusive;
+  - <EM>congruences pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>generators pending</EM> implies both <EM>congruences minimized</EM>
+    and <EM>generators minimized</EM>;
+  - <EM>congruences minimized</EM> implies <EM>congruences up-to-date</EM>;
+  - <EM>generators minimized</EM> implies <EM>generators up-to-date</EM>;
+  - <EM>congruences' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>;
+  - <EM>generators' saturation matrix up-to-date</EM> implies both
+    <EM>congruences up-to-date</EM> and <EM>generators up-to-date</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_c_up_to_date() const;
+  void reset_c_up_to_date();
+  void set_c_up_to_date();
+
+  bool test_g_up_to_date() const;
+  void reset_g_up_to_date();
+  void set_g_up_to_date();
+
+  bool test_c_minimized() const;
+  void reset_c_minimized();
+  void set_c_minimized();
+
+  bool test_g_minimized() const;
+  void reset_g_minimized();
+  void set_g_minimized();
+
+  bool test_sat_c_up_to_date() const;
+  void reset_sat_c_up_to_date();
+  void set_sat_c_up_to_date();
+
+  bool test_sat_g_up_to_date() const;
+  void reset_sat_g_up_to_date();
+  void set_sat_g_up_to_date();
+
+  bool test_c_pending() const;
+  void reset_c_pending();
+  void set_c_pending();
+
+  bool test_g_pending() const;
+  void reset_g_pending();
+  void set_g_pending();
+  //@} // Test, remove or add an individual assertion from the conjunction
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions
+  //@{
+  static const flags_t ZERO_DIM_UNIV    = 0U;
+  static const flags_t EMPTY            = 1U << 0;
+  static const flags_t C_UP_TO_DATE     = 1U << 1;
+  static const flags_t G_UP_TO_DATE     = 1U << 2;
+  static const flags_t C_MINIMIZED      = 1U << 3;
+  static const flags_t G_MINIMIZED      = 1U << 4;
+  static const flags_t SAT_C_UP_TO_DATE = 1U << 5;
+  static const flags_t SAT_G_UP_TO_DATE = 1U << 6;
+  static const flags_t CS_PENDING       = 1U << 7;
+  static const flags_t GS_PENDING       = 1U << 8;
+  //@} // Bitmasks for the individual assertions
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 1977. */
+#undef PPL_IN_Grid_CLASS
+
+  //! The status flags to keep track of the grid's internal state.
+  Status status;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  enum Dimension_Kind {
+    PARAMETER = 0,
+    LINE = 1,
+    GEN_VIRTUAL = 2,
+    PROPER_CONGRUENCE = PARAMETER,
+    CON_VIRTUAL = LINE,
+    EQUALITY = GEN_VIRTUAL
+  };
+
+  typedef std::vector<Dimension_Kind> Dimension_Kinds;
+
+  // The type of row associated with each dimension.  If the virtual
+  // rows existed then the reduced systems would be square and upper
+  // or lower triangular, and the rows in each would have the types
+  // given in this vector.  As the congruence system is reduced to an
+  // upside-down lower triangular form the ordering of the congruence
+  // types is last to first.
+  Dimension_Kinds dim_kinds;
+
+  //! Builds a grid universe or empty grid.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the grid;
+
+    \param kind
+    specifies whether the universe or the empty grid has to be built.
+  */
+  void construct(dimension_type num_dimensions, Degenerate_Element kind);
+
+  //! Builds a grid from a system of congruences.
+  /*!
+    The grid inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the grid. Its data-structures
+    may be recycled to build the grid.
+  */
+  void construct(Congruence_System& cgs);
+
+  //! Builds a grid from a system of grid generators.
+  /*!
+    The grid inherits the space dimension of the generator system.
+
+    \param ggs
+    The system of grid generators defining the grid.  Its data-structures
+    may be recycled to build the grid.
+  */
+  void construct(Grid_Generator_System& ggs);
+
+  //! \name Private Verifiers: Verify if Individual Flags are Set
+  //@{
+
+  //! Returns <CODE>true</CODE> if the grid is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is up-to-date.
+  bool congruences_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is up-to-date.
+  bool generators_are_up_to_date() const;
+
+  //! Returns <CODE>true</CODE> if the system of congruences is minimized.
+  bool congruences_are_minimized() const;
+
+  //! Returns <CODE>true</CODE> if the system of generators is minimized.
+  bool generators_are_minimized() const;
+
+  //@} // Private Verifiers: Verify if Individual Flags are Set
+
+  //! \name State Flag Setters: Set Only the Specified Flags
+  //@{
+
+  /*! \brief
+    Sets \p status to express that the grid is the universe
+    0-dimension vector space, clearing all corresponding matrices.
+  */
+  void set_zero_dim_univ();
+
+  /*! \brief
+    Sets \p status to express that the grid is empty, clearing all
+    corresponding matrices.
+  */
+  void set_empty();
+
+  //! Sets \p status to express that congruences are up-to-date.
+  void set_congruences_up_to_date();
+
+  //! Sets \p status to express that generators are up-to-date.
+  void set_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are minimized.
+  void set_congruences_minimized();
+
+  //! Sets \p status to express that generators are minimized.
+  void set_generators_minimized();
+
+  //@} // State Flag Setters: Set Only the Specified Flags
+
+  //! \name State Flag Cleaners: Clear Only the Specified Flag
+  //@{
+
+  //! Clears the \p status flag indicating that the grid is empty.
+  void clear_empty();
+
+  //! Sets \p status to express that congruences are out of date.
+  void clear_congruences_up_to_date();
+
+  //! Sets \p status to express that generators are out of date.
+  void clear_generators_up_to_date();
+
+  //! Sets \p status to express that congruences are no longer minimized.
+  void clear_congruences_minimized();
+
+  //! Sets \p status to express that generators are no longer minimized.
+  void clear_generators_minimized();
+
+  //@} // State Flag Cleaners: Clear Only the Specified Flag
+
+  //! \name Updating Matrices
+  //@{
+
+  //! Updates and minimizes the congruences from the generators.
+  void update_congruences() const;
+
+  //! Updates and minimizes the generators from the congruences.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    It is illegal to call this method when the Status field already
+    declares the grid to be empty.
+  */
+  bool update_generators() const;
+
+  //@} // Updating Matrices
+
+  //! \name Minimization of Descriptions
+  //@{
+
+  //! Minimizes both the congruences and the generators.
+  /*!
+    \return
+    <CODE>false</CODE> if and only if \p *this turns out to be an
+    empty grid.
+
+    Minimization is performed on each system only if the minimized
+    Status field is clear.
+  */
+  bool minimize() const;
+
+  //@} // Minimization of Descriptions
+
+  enum Three_Valued_Boolean {
+    TVB_TRUE,
+    TVB_FALSE,
+    TVB_DONT_KNOW
+  };
+
+  //! Polynomial but incomplete equivalence test between grids.
+  Three_Valued_Boolean quick_equivalence_test(const Grid& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is included in \p y.
+  bool is_included_in(const Grid& y) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "bounded_from_above(e)".  Passed to throw_dimension_incompatible,
+    as the first argument.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, const char* method_call) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param method_call
+    The call description of the public parent method, for example
+    "maximize(e)".  Passed to throw_dimension_incompatible, as the
+    first argument;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr in \p
+    *this can actually be reached (which is always the case);
+
+    \param point
+    When maximization or minimization succeeds, will be assigned the
+    point where \p expr reaches the extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               const char* method_call,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator* point = NULL) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \ref Grid_Frequency "frequency" for \p *this with respect to \p expr
+    is defined, in which case the frequency and the value for \p expr
+    that is closest to zero are computed.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    The numerator of the maximum frequency of \p expr;
+
+    \param freq_d
+    The denominator of the maximum frequency of \p expr;
+
+    \param val_n
+    The numerator of a value of \p expr at a point in the grid
+    that is closest to zero;
+
+    \param val_d
+    The denominator of a value of \p expr at a point in the grid
+    that is closest to zero;
+
+    If \p *this is empty or frequency is undefined with respect to \p expr,
+    then <CODE>false</CODE> is returned and \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+
+    \warning
+    If \p expr and \p *this are dimension-incompatible,
+    the grid generator system is not minimized or \p *this is
+    empty, then the behavior is undefined.
+  */
+  bool frequency_no_check(const Linear_Expression& expr,
+                Coefficient& freq_n, Coefficient& freq_d,
+                Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+  */
+  bool bounds_no_check(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Adds the congruence \p cg to \p *this.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the grid generator system is not minimized or \p *this is
+    empty, then the behavior is undefined.
+  */
+  void add_congruence_no_check(const Congruence& cg);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if c is a non-trivial inequality constraint.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void add_constraint_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added.
+    Non-trivial inequalities are ignored.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  //! \name Widening- and Extrapolation-Related Functions
+  //@{
+
+  //! Copies a widened selection of congruences from \p y to \p selected_cgs.
+  void select_wider_congruences(const Grid& y,
+                                Congruence_System& selected_cgs) const;
+
+  //! Copies widened generators from \p y to \p widened_ggs.
+  void select_wider_generators(const Grid& y,
+                               Grid_Generator_System& widened_ggs) const;
+
+  //@} // Widening- and Extrapolation-Related Functions
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param cgs
+    A congruence system, to which columns are added;
+
+    \param gs
+    A generator system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_embed()</CODE>.
+  */
+  void add_space_dimensions(Congruence_System& cgs,
+                            Grid_Generator_System& gs,
+                            dimension_type dims);
+
+  //! Adds new space dimensions to the given systems.
+  /*!
+    \param gs
+    A generator system, to which columns are added;
+
+    \param cgs
+    A congruence system, to which rows and columns are added;
+
+    \param dims
+    The number of space dimensions to add.
+
+    This method is invoked only by
+    <CODE>add_space_dimensions_and_project()</CODE>.
+  */
+  void add_space_dimensions(Grid_Generator_System& gs,
+                            Congruence_System& cgs,
+                            dimension_type dims);
+
+  //! \name Minimization-related Static Member Functions
+  //@{
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
+
+    \param divisor
+    A reference to the initial value of the divisor.  The resulting
+    value of this object is the new system divisor.
+
+    \param first_point
+    If \p first_point has a value other than NULL then it is taken as
+    the first point in \p sys, and it is assumed that any following
+    points have the same divisor as \p first_point.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys,
+                     Coefficient& divisor,
+                     const Grid_Generator* first_point = NULL);
+
+  //! Normalizes the divisors in \p sys.
+  /*!
+    Converts \p sys to an equivalent system in which the divisors are
+    of equal value.
+
+    \param sys
+    The generator system to be normalized.  It must have at least one
+    row.
+  */
+  static void
+  normalize_divisors(Grid_Generator_System& sys);
+
+  //! Normalize all the divisors in \p sys and \p gen_sys.
+  /*!
+    Modify \p sys and \p gen_sys to use the same single divisor value
+    for all generators, leaving each system representing the grid it
+    represented originally.
+
+    \param sys
+    The first of the generator systems to be normalized.
+
+    \param gen_sys
+    The second of the generator systems to be normalized.  This system
+    must have at least one row and the divisors of the generators in
+    this system must be equal.
+
+    \exception std::runtime_error
+    Thrown if all rows in \p gen_sys are lines and/or parameters.
+  */
+  static void normalize_divisors(Grid_Generator_System& sys,
+                                 Grid_Generator_System& gen_sys);
+
+  /*! \brief
+    Converts generator system \p dest to be equivalent to congruence
+    system \p source.
+  */
+  static void conversion(Congruence_System& source,
+                         Grid_Generator_System& dest,
+                         Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    Converts congruence system \p dest to be equivalent to generator
+    system \p source.
+  */
+  static void conversion(Grid_Generator_System& source,
+                         Congruence_System& dest,
+                         Dimension_Kinds& dim_kinds);
+
+  //! Converts \p cgs to upper triangular (i.e. minimized) form.
+  /*!
+    Returns <CODE>true</CODE> if \p cgs represents the empty set,
+    otherwise returns <CODE>false</CODE>.
+  */
+  static bool simplify(Congruence_System& cgs,
+                       Dimension_Kinds& dim_kinds);
+
+  //! Converts \p gs to lower triangular (i.e. minimized) form.
+  /*!
+    Expects \p gs to contain at least one point.
+  */
+  static void simplify(Grid_Generator_System& ggs,
+                       Dimension_Kinds& dim_kinds);
+
+  //! Reduces the line \p row using the line \p pivot.
+  /*!
+    Uses the line \p pivot to change the representation of the line
+    \p row so that the element at index \p column of \p row is zero.
+  */
+  // A member of Grid for access to Matrix<Dense_Row>::rows.
+  static void reduce_line_with_line(Grid_Generator& row,
+                                    Grid_Generator& pivot,
+                                    dimension_type column);
+
+  //! Reduces the equality \p row using the equality \p pivot.
+  /*!
+    Uses the equality \p pivot to change the representation of the
+    equality \p row so that the element at index \p column of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix<Dense_Row>::rows.
+  static void reduce_equality_with_equality(Congruence& row,
+                                            const Congruence& pivot,
+                                            dimension_type column);
+
+  //! Reduces \p row using \p pivot.
+  /*!
+    Uses the point, parameter or proper congruence at \p pivot to
+    change the representation of the point, parameter or proper
+    congruence at \p row so that the element at index \p column of \p row
+    is zero.  Only elements from index \p start to index \p end are
+    modified (i.e. it is assumed that all other elements are zero).
+    This means that \p col must be in [start,end).
+
+    NOTE: This may invalidate the rows, since it messes with the divisors.
+    Client code has to fix that (if needed) and assert OK().
+  */
+  // Part of Grid for access to Matrix<Dense_Row>::rows.
+  template <typename R>
+  static void reduce_pc_with_pc(R& row,
+                                R& pivot,
+                                dimension_type column,
+                                dimension_type start,
+                                dimension_type end);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the line \p pivot to change the representation of the
+    parameter \p row such that the element at index \p column of \p row
+    is zero.
+  */
+  // This takes a parameter with type Swapping_Vector<Grid_Generator> (instead
+  // of Grid_Generator_System) to simplify the implementation of `simplify()'.
+  // NOTE: This may invalidate `row' and the rows in `sys'. Client code must
+  // fix/check this.
+  static void reduce_parameter_with_line(Grid_Generator& row,
+                                         const Grid_Generator& pivot,
+                                         dimension_type column,
+                                         Swapping_Vector<Grid_Generator>& sys,
+                                         dimension_type num_columns);
+
+  //! Reduce \p row using \p pivot.
+  /*!
+    Use the equality \p pivot to change the representation of the
+    congruence \p row such that element at index \p column of \p row
+    is zero.
+  */
+  // A member of Grid for access to Matrix<Dense_Row>::rows.
+  // This takes a parameter with type Swapping_Vector<Congruence> (instead of
+  // Congruence_System) to simplify the implementation of `conversion()'.
+  static void reduce_congruence_with_equality(Congruence& row,
+                                              const Congruence& pivot,
+                                              dimension_type column,
+                                              Swapping_Vector<Congruence>& sys);
+
+  //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+  /*!
+    Required when converting (or simplifying) a congruence or generator
+    system to "strong minimal form"; informally, strong minimal form means
+    that, not only is the system in minimal form (ie a triangular matrix),
+    but also the absolute values of the coefficients of the proper congruences
+    and parameters are minimal. As a simple example, the set of congruences
+    \f$\{3x \equiv_3 0, 4x + y \equiv_3 1\}\f$,
+    (which is in minimal form) is equivalent to the set
+    \f$\{3x \equiv_3 0, x + y \equiv_3 1\}\f$
+    (which is in strong minimal form).
+
+    \param sys
+    The generator or congruence system to be reduced to strong minimal form.
+
+    \param dim
+    Column to be reduced.
+
+    \param pivot_index
+    Index of last row to be reduced.
+
+    \param start
+    Index of first column to be changed.
+
+    \param end
+    Index of last column to be changed.
+
+    \param sys_dim_kinds
+    Dimension kinds of the elements of \p sys.
+
+    \param generators
+    Flag indicating whether \p sys is a congruence or generator system
+  */
+  template <typename M>
+  // This takes a parameter with type `Swapping_Vector<M::row_type>'
+  // instead of `M' to simplify the implementation of simplify().
+  // NOTE: This may invalidate the rows in `sys'. Client code must
+  // fix/check this.
+  static void reduce_reduced(Swapping_Vector<typename M::row_type>& sys,
+                             dimension_type dim,
+                             dimension_type pivot_index,
+                             dimension_type start, dimension_type end,
+                             const Dimension_Kinds& sys_dim_kinds,
+                             bool generators = true);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Matrix<Dense_Row>::rows and cgs::operator[].
+  // The type of `dest' is Swapping_Vector<Congruence> instead of
+  // Congruence_System to simplify the implementation of conversion().
+  static void multiply_grid(const Coefficient& multiplier,
+                            Congruence& cg,
+                            Swapping_Vector<Congruence>& dest,
+                            dimension_type num_rows);
+
+  //! Multiply the elements of \p dest by \p multiplier.
+  // A member of Grid for access to Grid_Generator::operator[].
+  // The type of `dest' is Swapping_Vector<Grid_Generator> instead of
+  // Grid_Generator_System to simplify the implementation of conversion().
+  // NOTE: This does not check whether the rows are OK(). Client code
+  // should do that.
+  static void multiply_grid(const Coefficient& multiplier,
+                            Grid_Generator& gen,
+                            Swapping_Vector<Grid_Generator>& dest,
+                            dimension_type num_rows);
+
+  /*! \brief
+    If \p sys is lower triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool lower_triangular(const Congruence_System& sys,
+                               const Dimension_Kinds& dim_kinds);
+
+  /*! \brief
+    If \p sys is upper triangular return <CODE>true</CODE>, else
+    return <CODE>false</CODE>.
+  */
+  static bool upper_triangular(const Grid_Generator_System& sys,
+                               const Dimension_Kinds& dim_kinds);
+
+#ifndef NDEBUG
+  //! Checks that trailing rows contain only zero terms.
+  /*!
+    If all columns contain zero in the rows of \p system from row
+    index \p first to row index \p last then return <code>true</code>,
+    else return <code>false</code>.  \p row_size gives the number of
+    columns in each row.
+
+    This method is only used in assertions in the simplify methods.
+  */
+  template <typename M, typename R>
+  static bool rows_are_zero(M& system,
+                            dimension_type first,
+                            dimension_type last,
+                            dimension_type row_size);
+#endif
+
+  //@} // Minimization-Related Static Member Functions
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! \name Exception Throwers
+  //@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+protected:
+  void throw_dimension_incompatible(const char* method,
+                                    const char* other_name,
+                                    dimension_type other_dim) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* gr_name,
+                                    const Grid& gr) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cg_name,
+                                    const Congruence& cg) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* c_name,
+                                    const Constraint& c) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* g_name,
+                                    const Grid_Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* g_name,
+                                    const Generator& g) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cgs_name,
+                                    const Congruence_System& cgs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* cs_name,
+                                    const Constraint_System& cs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* gs_name,
+                                    const Grid_Generator_System& gs) const;
+  void throw_dimension_incompatible(const char* method,
+                                    const char* var_name,
+                                    Variable var) const;
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_space_dim) const;
+
+  static void throw_invalid_argument(const char* method,
+                                     const char* reason);
+  static void throw_invalid_constraint(const char* method,
+                                       const char* c_name);
+  static void throw_invalid_constraints(const char* method,
+                                        const char* cs_name);
+  static void throw_invalid_generator(const char* method,
+                                      const char* g_name);
+  static void throw_invalid_generators(const char* method,
+                                       const char* gs_name);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //@} // Exception Throwers
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+};
+
+/* Automatically generated from PPL source file ../src/Grid_Status_inlines.hh line 1. */
+/* Grid::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+inline
+Grid::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+inline bool
+Grid::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+inline bool
+Grid::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+inline void
+Grid::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+inline void
+Grid::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+inline bool
+Grid::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+inline void
+Grid::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+inline void
+Grid::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+inline bool
+Grid::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+inline void
+Grid::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+inline void
+Grid::Status::set_empty() {
+  flags = EMPTY;
+}
+
+inline bool
+Grid::Status::test_c_up_to_date() const {
+  return test_any(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_c_up_to_date() {
+  reset(C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_c_up_to_date() {
+  set(C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_g_up_to_date() const {
+  return test_any(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_g_up_to_date() {
+  reset(G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_g_up_to_date() {
+  set(G_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_c_minimized() const {
+  return test_any(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_c_minimized() {
+  reset(C_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_c_minimized() {
+  set(C_MINIMIZED);
+}
+
+inline bool
+Grid::Status::test_g_minimized() const {
+  return test_any(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::reset_g_minimized() {
+  reset(G_MINIMIZED);
+}
+
+inline void
+Grid::Status::set_g_minimized() {
+  set(G_MINIMIZED);
+}
+
+
+inline bool
+Grid::Status::test_c_pending() const {
+  return test_any(CS_PENDING);
+}
+
+inline void
+Grid::Status::reset_c_pending() {
+  reset(CS_PENDING);
+}
+
+inline void
+Grid::Status::set_c_pending() {
+  set(CS_PENDING);
+}
+
+inline bool
+Grid::Status::test_g_pending() const {
+  return test_any(GS_PENDING);
+}
+
+inline void
+Grid::Status::reset_g_pending() {
+  reset(GS_PENDING);
+}
+
+inline void
+Grid::Status::set_g_pending() {
+  set(GS_PENDING);
+}
+
+
+inline bool
+Grid::Status::test_sat_c_up_to_date() const {
+  return test_any(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_c_up_to_date() {
+  reset(SAT_C_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_c_up_to_date() {
+  set(SAT_C_UP_TO_DATE);
+}
+
+inline bool
+Grid::Status::test_sat_g_up_to_date() const {
+  return test_any(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::reset_sat_g_up_to_date() {
+  reset(SAT_G_UP_TO_DATE);
+}
+
+inline void
+Grid::Status::set_sat_g_up_to_date() {
+  set(SAT_G_UP_TO_DATE);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_inlines.hh line 1. */
+/* Grid class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_inlines.hh line 30. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline bool
+Grid::marked_empty() const {
+  return status.test_empty();
+}
+
+inline bool
+Grid::congruences_are_up_to_date() const {
+  return status.test_c_up_to_date();
+}
+
+inline bool
+Grid::generators_are_up_to_date() const {
+  return status.test_g_up_to_date();
+}
+
+inline bool
+Grid::congruences_are_minimized() const {
+  return status.test_c_minimized();
+}
+
+inline bool
+Grid::generators_are_minimized() const {
+  return status.test_g_minimized();
+}
+
+inline void
+Grid::set_generators_up_to_date() {
+  status.set_g_up_to_date();
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+  status.set_c_up_to_date();
+}
+
+inline void
+Grid::set_congruences_minimized() {
+  set_congruences_up_to_date();
+  status.set_c_minimized();
+}
+
+inline void
+Grid::set_generators_minimized() {
+  set_generators_up_to_date();
+  status.set_g_minimized();
+}
+
+inline void
+Grid::clear_empty() {
+  status.reset_empty();
+}
+
+inline void
+Grid::clear_congruences_minimized() {
+  status.reset_c_minimized();
+}
+
+inline void
+Grid::clear_generators_minimized() {
+  status.reset_g_minimized();
+}
+
+inline void
+Grid::clear_congruences_up_to_date() {
+  clear_congruences_minimized();
+  status.reset_c_up_to_date();
+  // Can get rid of con_sys here.
+}
+
+inline void
+Grid::clear_generators_up_to_date() {
+  clear_generators_minimized();
+  status.reset_g_up_to_date();
+  // Can get rid of gen_sys here.
+}
+
+inline dimension_type
+Grid::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(std::numeric_limits<dimension_type>::max() - 1,
+                  std::min(Congruence_System::max_space_dimension(),
+                           Grid_Generator_System::max_space_dimension()
+                           )
+                  );
+}
+
+inline
+Grid::Grid(dimension_type num_dimensions,
+           const Degenerate_Element kind)
+  : con_sys(),
+    gen_sys(check_space_dimension_overflow(num_dimensions,
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(n, k)",
+                                           "n exceeds the maximum "
+                                           "allowed space dimension")) {
+  construct(num_dimensions, kind);
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid::Grid(const Congruence_System& cgs)
+  : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(cgs)",
+                                           "the space dimension of cgs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(cgs.space_dimension()) {
+  Congruence_System cgs_copy(cgs);
+  construct(cgs_copy);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs, Recycle_Input)
+  : con_sys(check_space_dimension_overflow(cgs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(cgs, recycle)",
+                                           "the space dimension of cgs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(cgs.space_dimension()) {
+  construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& ggs)
+  : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(ggs)",
+                                           "the space dimension of ggs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(ggs.space_dimension()) {
+  Grid_Generator_System ggs_copy(ggs);
+  construct(ggs_copy);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& ggs, Recycle_Input)
+  : con_sys(check_space_dimension_overflow(ggs.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(ggs, recycle)",
+                                           "the space dimension of ggs "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(ggs.space_dimension()) {
+  construct(ggs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const BD_Shape<U>& bd, Complexity_Class)
+  : con_sys(check_space_dimension_overflow(bd.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(bd)",
+                                           "the space dimension of bd "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(bd.space_dimension()) {
+  Congruence_System cgs = bd.congruences();
+  construct(cgs);
+}
+
+template <typename U>
+inline
+Grid::Grid(const Octagonal_Shape<U>& os, Complexity_Class)
+  : con_sys(check_space_dimension_overflow(os.space_dimension(),
+                                           max_space_dimension(),
+                                           "PPL::Grid::",
+                                           "Grid(os)",
+                                           "the space dimension of os "
+                                           "exceeds the maximum allowed "
+                                           "space dimension")),
+    gen_sys(os.space_dimension()) {
+  Congruence_System cgs = os.congruences();
+  construct(cgs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+  return space_dim;
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline int32_t
+Grid::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+inline Constraint_System
+Grid::constraints() const {
+  return Constraint_System(congruences());
+}
+
+inline Constraint_System
+Grid::minimized_constraints() const {
+  return Constraint_System(minimized_congruences());
+}
+
+inline void
+Grid::m_swap(Grid& y) {
+  using std::swap;
+  swap(con_sys, y.con_sys);
+  swap(gen_sys, y.gen_sys);
+  swap(status, y.status);
+  swap(space_dim, y.space_dim);
+  swap(dim_kinds, y.dim_kinds);
+}
+
+inline void
+Grid::add_congruence(const Congruence& cg) {
+  // Dimension-compatibility check.
+  if (space_dim < cg.space_dimension())
+    throw_dimension_incompatible("add_congruence(cg)", "cg", cg);
+
+  if (!marked_empty())
+    add_congruence_no_check(cg);
+}
+
+inline void
+Grid::add_congruences(const Congruence_System& cgs) {
+  // TODO: this is just an executable specification.
+  // Space dimension compatibility check.
+  if (space_dim < cgs.space_dimension())
+    throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+
+  if (!marked_empty()) {
+    Congruence_System cgs_copy = cgs;
+    add_recycled_congruences(cgs_copy);
+  }
+}
+
+inline void
+Grid::refine_with_congruence(const Congruence& cg) {
+  add_congruence(cg);
+}
+
+inline void
+Grid::refine_with_congruences(const Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+inline bool
+Grid::can_recycle_constraint_systems() {
+  return true;
+}
+
+inline bool
+Grid::can_recycle_congruence_systems() {
+  return true;
+}
+
+inline void
+Grid::add_constraint(const Constraint& c) {
+  // Space dimension compatibility check.
+  if (space_dim < c.space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", "c", c);
+  if (!marked_empty())
+    add_constraint_no_check(c);
+}
+
+inline void
+Grid::add_recycled_constraints(Constraint_System& cs) {
+  // TODO: really recycle the constraints.
+  add_constraints(cs);
+}
+
+inline bool
+Grid::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_above(e)");
+}
+
+inline bool
+Grid::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, "bounds_from_below(e)");
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+               Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum);
+}
+
+inline bool
+Grid::maximize(const Linear_Expression& expr,
+               Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+               Generator& point) const {
+  return max_min(expr, "maximize(e, ...)", sup_n, sup_d, maximum, &point);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+               Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum);
+}
+
+inline bool
+Grid::minimize(const Linear_Expression& expr,
+               Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+               Generator& point) const {
+  return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+inline void
+Grid::normalize_divisors(Grid_Generator_System& sys) {
+  PPL_DIRTY_TEMP_COEFFICIENT(divisor);
+  divisor = 1;
+  normalize_divisors(sys, divisor);
+}
+
+/*! \relates Grid */
+inline bool
+operator!=(const Grid& x, const Grid& y) {
+  return !(x == y);
+}
+
+inline bool
+Grid::strictly_contains(const Grid& y) const {
+  const Grid& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+inline void
+Grid::topological_closure_assign() {
+}
+
+/*! \relates Grid */
+inline void
+swap(Grid& x, Grid& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_templates.hh line 1. */
+/* Grid class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_templates.hh line 30. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Interval>
+Grid::Grid(const Box<Interval>& box, Complexity_Class)
+  : con_sys(),
+    gen_sys() {
+  space_dim = check_space_dimension_overflow(box.space_dimension(),
+                                             max_space_dimension(),
+                                             "PPL::Grid::",
+                                             "Grid(box, from_bounding_box)",
+                                             "the space dimension of box "
+                                             "exceeds the maximum allowed "
+                                             "space dimension");
+
+  if (box.is_empty()) {
+    // Empty grid.
+    set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (space_dim == 0)
+    set_zero_dim_univ();
+  else {
+    // Initialize the space dimension as indicated by the box.
+    con_sys.set_space_dimension(space_dim);
+    gen_sys.set_space_dimension(space_dim);
+    // Add congruences and generators according to `box'.
+    PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+    PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+    PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+    PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+    gen_sys.insert(grid_point());
+    for (dimension_type k = space_dim; k-- > 0; ) {
+      const Variable v_k = Variable(k);
+      bool closed = false;
+      // TODO: Consider producing the system(s) in minimized form.
+      if (box.has_lower_bound(v_k, l_n, l_d, closed)) {
+        if (box.has_upper_bound(v_k, u_n, u_d, closed))
+          if (l_n * u_d == u_n * l_d) {
+            // A point interval sets dimension k of every point to a
+            // single value.
+            con_sys.insert(l_d * v_k == l_n);
+
+            // This is declared here because it may be invalidated
+            // by the call to gen_sys.insert() at the end of the loop.
+            Grid_Generator& point = gen_sys.sys.rows[0];
+
+            // Scale the point to use as divisor the lcm of the
+            // divisors of the existing point and the lower bound.
+            const Coefficient& point_divisor = point.divisor();
+            gcd_assign(u_n, l_d, point_divisor);
+            // `u_n' now holds the gcd.
+            exact_div_assign(u_n, point_divisor, u_n);
+            if (l_d < 0)
+              neg_assign(u_n);
+            // l_d * u_n == abs(l_d * (point_divisor / gcd(l_d, point_divisor)))
+            point.scale_to_divisor(l_d * u_n);
+            // Set dimension k of the point to the lower bound.
+            if (l_d < 0)
+              neg_assign(u_n);
+            // point[k + 1] = l_n * point_divisor / gcd(l_d, point_divisor)
+            point.expr.set(Variable(k), l_n * u_n);
+            PPL_ASSERT(point.OK());
+
+            PPL_ASSERT(gen_sys.sys.OK());
+
+            continue;
+          }
+      }
+      // A universe interval allows any value in dimension k.
+      gen_sys.insert(grid_line(v_k));
+    }
+    set_congruences_up_to_date();
+    set_generators_up_to_date();
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename Partial_Function>
+void
+Grid::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the grid becomes zero_dimensional.
+    if (marked_empty()
+        || (!generators_are_up_to_date() && !update_generators())) {
+      // Removing all dimensions from the empty grid.
+      space_dim = 0;
+      set_empty();
+    }
+    else
+      // Removing all dimensions from a non-empty grid.
+      set_zero_dim_univ();
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  dimension_type new_space_dimension = pfunc.max_in_codomain() + 1;
+
+  if (new_space_dimension == space_dim) {
+    // The partial function `pfunc' is indeed total and thus specifies
+    // a permutation, that is, a renaming of the dimensions.  For
+    // maximum efficiency, we will simply permute the columns of the
+    // constraint system and/or the generator system.
+
+    std::vector<Variable> cycle;
+    cycle.reserve(space_dim);
+
+    // Used to mark elements as soon as they are inserted in a cycle.
+    std::deque<bool> visited(space_dim);
+
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      if (!visited[i]) {
+        dimension_type j = i;
+        do {
+          visited[j] = true;
+          // The following initialization is only to make the compiler happy.
+          dimension_type k = 0;
+          if (!pfunc.maps(j, k))
+            throw_invalid_argument("map_space_dimensions(pfunc)",
+                                   " pfunc is inconsistent");
+          if (k == j)
+            break;
+
+          cycle.push_back(Variable(j));
+          // Go along the cycle.
+          j = k;
+        } while (!visited[j]);
+
+        // End of cycle.
+
+        // Avoid calling clear_*_minimized() if cycle.size() is less than 2,
+        // to improve efficiency.
+        if (cycle.size() >= 2) {
+          // Permute all that is up-to-date.
+          if (congruences_are_up_to_date()) {
+            con_sys.permute_space_dimensions(cycle);
+            clear_congruences_minimized();
+          }
+
+          if (generators_are_up_to_date()) {
+            gen_sys.permute_space_dimensions(cycle);
+            clear_generators_minimized();
+          }
+        }
+
+        cycle.clear();
+      }
+    }
+
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // If control gets here, then `pfunc' is not a permutation and some
+  // dimensions must be projected away.
+
+  const Grid_Generator_System& old_gensys = grid_generators();
+
+  if (old_gensys.has_no_rows()) {
+    // The grid is empty.
+    Grid new_grid(new_space_dimension, EMPTY);
+    m_swap(new_grid);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Make a local copy of the partial function.
+  std::vector<dimension_type> pfunc_maps(space_dim, not_a_dimension());
+  for (dimension_type j = space_dim; j-- > 0; ) {
+    dimension_type pfunc_j;
+    if (pfunc.maps(j, pfunc_j))
+      pfunc_maps[j] = pfunc_j;
+  }
+
+  Grid_Generator_System new_gensys;
+  // Set sortedness, for the assertion met via gs::insert.
+  new_gensys.set_sorted(false);
+  // Get the divisor of the first point.
+  Grid_Generator_System::const_iterator i;
+  Grid_Generator_System::const_iterator old_gensys_end = old_gensys.end();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i)
+    if (i->is_point())
+      break;
+  PPL_ASSERT(i != old_gensys_end);
+  const Coefficient& system_divisor = i->divisor();
+  for (i = old_gensys.begin(); i != old_gensys_end; ++i) {
+    const Grid_Generator& old_g = *i;
+    const Grid_Generator::expr_type old_g_e = old_g.expression();
+    Linear_Expression expr;
+    expr.set_space_dimension(new_space_dimension);
+    bool all_zeroes = true;
+    for (Grid_Generator::expr_type::const_iterator j = old_g_e.begin(),
+          j_end = old_g_e.end(); j != j_end; ++j) {
+      const dimension_type mapped_id = pfunc_maps[j.variable().id()];
+      if (mapped_id != not_a_dimension()) {
+        add_mul_assign(expr, *j, Variable(mapped_id));
+        all_zeroes = false;
+      }
+    }
+    switch (old_g.type()) {
+    case Grid_Generator::LINE:
+      if (!all_zeroes)
+        new_gensys.insert(grid_line(expr));
+      break;
+    case Grid_Generator::PARAMETER:
+      if (!all_zeroes)
+        new_gensys.insert(parameter(expr, system_divisor));
+      break;
+    case Grid_Generator::POINT:
+      new_gensys.insert(grid_point(expr, old_g.divisor()));
+      break;
+    }
+  }
+
+  Grid new_grid(new_gensys);
+  m_swap(new_grid);
+
+  PPL_ASSERT(OK(true));
+}
+
+// Needed for converting the congruence or grid_generator system
+// to "strong minimal form".
+template <typename M>
+void
+Grid::reduce_reduced(Swapping_Vector<typename M::row_type>& rows,
+                     const dimension_type dim,
+                     const dimension_type pivot_index,
+                     const dimension_type start,
+                     const dimension_type end,
+                     const Dimension_Kinds& sys_dim_kinds,
+                     const bool generators) {
+  // TODO: Remove this.
+  typedef typename M::row_type M_row_type;
+
+  const M_row_type& pivot = rows[pivot_index];
+  const Coefficient& pivot_dim = pivot.expr.get(dim);
+
+  if (pivot_dim == 0)
+    return;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(pivot_dim_half);
+  pivot_dim_half = (pivot_dim + 1) / 2;
+  const Dimension_Kind row_kind = sys_dim_kinds[dim];
+  const bool row_is_line_or_equality
+    = (row_kind == (generators ? LINE : EQUALITY));
+
+  PPL_DIRTY_TEMP_COEFFICIENT(num_rows_to_subtract);
+  PPL_DIRTY_TEMP_COEFFICIENT(row_dim_remainder);
+  for (dimension_type kinds_index = dim,
+         row_index = pivot_index; row_index-- > 0; ) {
+    if (generators) {
+      --kinds_index;
+      // Move over any virtual rows.
+      while (sys_dim_kinds[kinds_index] == GEN_VIRTUAL)
+        --kinds_index;
+    }
+    else {
+      ++kinds_index;
+      // Move over any virtual rows.
+      while (sys_dim_kinds[kinds_index] == CON_VIRTUAL)
+        ++kinds_index;
+    }
+
+    // row_kind CONGRUENCE is included as PARAMETER
+    if (row_is_line_or_equality
+        || (row_kind == PARAMETER
+            && sys_dim_kinds[kinds_index] == PARAMETER)) {
+      M_row_type& row = rows[row_index];
+
+      const Coefficient& row_dim = row.expr.get(dim);
+      // num_rows_to_subtract may be positive or negative.
+      num_rows_to_subtract = row_dim / pivot_dim;
+
+      // Ensure that after subtracting num_rows_to_subtract * r_dim
+      // from row_dim, -pivot_dim_half < row_dim <= pivot_dim_half.
+      // E.g., if pivot[dim] = 9, then after this reduction
+      // -5 < row_dim <= 5.
+      row_dim_remainder = row_dim % pivot_dim;
+      if (row_dim_remainder < 0) {
+        if (row_dim_remainder <= -pivot_dim_half)
+          --num_rows_to_subtract;
+      }
+      else if (row_dim_remainder > 0 && row_dim_remainder > pivot_dim_half)
+        ++num_rows_to_subtract;
+
+      // Subtract num_rows_to_subtract copies of pivot from row i.  Only the
+      // entries from dim need to be subtracted, as the preceding
+      // entries are all zero.
+      // If num_rows_to_subtract is negative, these copies of pivot are
+      // added to row i.
+      if (num_rows_to_subtract != 0)
+        row.expr.linear_combine(pivot.expr,
+                                Coefficient_one(), -num_rows_to_subtract,
+                                start, end + 1);
+    }
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_defs.hh line 2664. */
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 1. */
+/* BD_Shape class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_defs.hh line 1. */
+/* DB_Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Row_defs.hh line 1. */
+/* DB_Row class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Row_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class DB_Row_Impl_Handler;
+
+template <typename T>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_defs.hh line 1. */
+/* Ptr_Iterator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+class Ptr_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_defs.hh line 28. */
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename P, typename Q>
+bool operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+bool operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P, typename Q>
+typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y);
+
+template<typename P>
+Ptr_Iterator<P> operator+(typename Ptr_Iterator<P>::difference_type m,
+                          const Ptr_Iterator<P>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A class to define STL const and non-const iterators from pointer types.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename P>
+class Parma_Polyhedra_Library::Implementation::Ptr_Iterator
+  : public std::iterator<typename std::iterator_traits<P>::iterator_category,
+                         typename std::iterator_traits<P>::value_type,
+                         typename std::iterator_traits<P>::difference_type,
+                         typename std::iterator_traits<P>::pointer,
+                         typename std::iterator_traits<P>::reference> {
+public:
+  typedef typename std::iterator_traits<P>::difference_type difference_type;
+  typedef typename std::iterator_traits<P>::reference reference;
+  typedef typename std::iterator_traits<P>::pointer pointer;
+
+  //! Default constructor: no guarantees.
+  Ptr_Iterator();
+
+  //! Construct an iterator pointing at \p q.
+  explicit Ptr_Iterator(const P& q);
+
+  /*! \brief
+    Copy constructor allowing the construction of a const_iterator
+    from a non-const iterator.
+  */
+  template<typename Q>
+  Ptr_Iterator(const Ptr_Iterator<Q>& q);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Subscript operator.
+  reference operator[](const difference_type m) const;
+
+  //! Prefix increment operator.
+  Ptr_Iterator& operator++();
+
+  //! Postfix increment operator.
+  Ptr_Iterator operator++(int);
+
+  //! Prefix decrement operator
+  Ptr_Iterator& operator--();
+
+  //! Postfix decrement operator.
+  Ptr_Iterator operator--(int);
+
+  //! Assignment-increment operator.
+  Ptr_Iterator& operator+=(const difference_type m);
+
+  //! Assignment-decrement operator.
+  Ptr_Iterator& operator-=(const difference_type m);
+
+  //! Returns the difference between \p *this and \p y.
+  difference_type operator-(const Ptr_Iterator& y) const;
+
+  //! Returns the sum of \p *this and \p m.
+  Ptr_Iterator operator+(const difference_type m) const;
+
+  //! Returns the difference of \p *this and \p m.
+  Ptr_Iterator operator-(const difference_type m) const;
+
+private:
+  //! The base pointer implementing the iterator.
+  P p;
+
+  //! Returns the hidden pointer.
+  const P& base() const;
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template <typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend bool Parma_Polyhedra_Library::Implementation::
+  operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  template<typename Q, typename R>
+  friend typename Ptr_Iterator<Q>::difference_type
+  Parma_Polyhedra_Library::Implementation::
+  operator-(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+  friend Ptr_Iterator<P>
+  Parma_Polyhedra_Library::Implementation::
+  operator+<>(typename Ptr_Iterator<P>::difference_type m,
+              const Ptr_Iterator<P>& y);
+};
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_inlines.hh line 1. */
+/* Ptr_Iterator class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename P>
+inline const P&
+Ptr_Iterator<P>::base() const {
+  return p;
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator()
+  : p(P()) {
+}
+
+template <typename P>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const P& q)
+  : p(q) {
+}
+
+template <typename P>
+template <typename Q>
+inline
+Ptr_Iterator<P>::Ptr_Iterator(const Ptr_Iterator<Q>& q)
+  : p(q.base()) {
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator*() const {
+  return *p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::pointer
+Ptr_Iterator<P>::operator->() const {
+  return p;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::reference
+Ptr_Iterator<P>::operator[](const difference_type m) const {
+  return p[m];
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator++() {
+  ++p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator++(int) {
+  return Ptr_Iterator(p++);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator--() {
+  --p;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator--(int) {
+  return Ptr_Iterator(p--);
+}
+
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator+=(const difference_type m) {
+  p += m;
+  return *this;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>&
+Ptr_Iterator<P>::operator-=(const difference_type m) {
+  p -= m;
+  return *this;
+}
+
+template <typename P>
+inline typename Ptr_Iterator<P>::difference_type
+Ptr_Iterator<P>::operator-(const Ptr_Iterator& y) const {
+  return p - y.p;
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator+(const difference_type m) const {
+  return Ptr_Iterator(p + m);
+}
+
+template <typename P>
+inline Ptr_Iterator<P>
+Ptr_Iterator<P>::operator-(const difference_type m) const {
+  return Ptr_Iterator(p - m);
+}
+
+template<typename P, typename Q>
+inline bool
+operator==(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() == y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator!=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() != y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() < y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator<=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() <= y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() > y.base();
+}
+
+template<typename P, typename Q>
+inline bool
+operator>=(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() >= y.base();
+}
+
+template<typename P, typename Q>
+inline typename Ptr_Iterator<P>::difference_type
+operator-(const Ptr_Iterator<P>& x, const Ptr_Iterator<Q>& y) {
+  return x.base() - y.base();
+}
+
+template<typename P>
+inline Ptr_Iterator<P>
+operator+(typename Ptr_Iterator<P>::difference_type m,
+          const Ptr_Iterator<P>& y) {
+  return Ptr_Iterator<P>(m + y.base());
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Ptr_Iterator_defs.hh line 171. */
+
+/* Automatically generated from PPL source file ../src/DB_Row_defs.hh line 30. */
+#include <cstddef>
+#include <vector>
+
+#ifndef PPL_DB_ROW_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When PPL_DB_ROW_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each instance
+  of the class DB_Row carries its own capacity; this enables extra
+  consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_DB_ROW_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_DB_ROW_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_DB_ROW_EXTRA_DEBUG)
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual DB_Row implementation.
+/*! \ingroup PPL_CXX_interface
+  Exception-safety is the only responsibility of this class: it has
+  to ensure that its \p impl member is correctly deallocated.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler {
+public:
+  //! Default constructor.
+  DB_Row_Impl_Handler();
+
+  //! Destructor.
+  ~DB_Row_Impl_Handler();
+
+  class Impl;
+
+  //! A pointer to the actual implementation.
+  Impl* impl;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  //! The capacity of \p impl (only available during debugging).
+  dimension_type capacity_;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+private:
+  //! Private and unimplemented: copy construction is not allowed.
+  DB_Row_Impl_Handler(const DB_Row_Impl_Handler&);
+
+  //! Private and unimplemented: copy assignment is not allowed.
+  DB_Row_Impl_Handler& operator=(const DB_Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the single rows of matrices.
+/*! \ingroup PPL_CXX_interface
+  The class template DB_Row<T> allows for the efficient representation of
+  the single rows of a DB_Matrix. It contains elements of type T stored
+  as a vector. The class T is a family of extended numbers that
+  must provide representation for
+  \f$ -\infty \f$, \f$0\f$,\f$ +\infty \f$ (and, consequently for <EM>nan</EM>,
+  <EM>not a number</EM>, since this arises as the ``result'' of
+  undefined sums like \f$ +\infty + (-\infty) \f$).
+
+  The class T must provide the following methods:
+
+  \code
+    T()
+  \endcode
+  is the default constructor: no assumption is made on the particular
+  object constructed, provided <CODE>T().OK()</CODE> gives <CODE>true</CODE>
+  (see below).
+  \code
+    ~T()
+  \endcode
+  is the destructor.
+  \code
+    bool is_nan() const
+  \endcode
+  returns <CODE>true</CODE> if and only \p *this represents
+  the  <EM>not a number</EM> value.
+  \code
+    bool OK() const
+  \endcode
+  returns <CODE>true</CODE> if and only if \p *this satisfies all
+  its invariants.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row : private DB_Row_Impl_Handler<T> {
+public:
+  //! Pre-constructs a row: construction must be completed by construct().
+  DB_Row();
+
+  //! \name Post-constructors.
+  //@{
+  //! Constructs properly a default-constructed element.
+  /*!
+    Builds a row with size \p sz and minimum capacity.
+  */
+  void construct(dimension_type sz);
+
+  //! Constructs properly a default-constructed element.
+  /*!
+    \param sz
+    The size of the row that will be constructed.
+
+    \param capacity
+    The minimum capacity of the row that will be constructed.
+
+    The row that we are constructing has a minimum capacity of
+    (i.e., it can contain at least) \p elements, \p sz of which
+    will be constructed now.
+  */
+  void construct(dimension_type sz, dimension_type capacity);
+
+  //! Constructs properly a conservative approximation of \p y.
+  /*!
+    \param y
+    A row containing the elements whose upward approximations will
+    be used to properly construct \p *this.
+
+    \param capacity
+    The capacity of the constructed row.
+
+    It is assumed that \p capacity is greater than or equal to the
+    size of \p y.
+  */
+  template <typename U>
+  void construct_upward_approximation(const DB_Row<U>& y,
+                                      dimension_type capacity);
+
+  //@}
+
+  //! Tight constructor: resizing will require reallocation.
+  DB_Row(dimension_type sz);
+
+  //! Sizing constructor with capacity.
+  DB_Row(dimension_type sz, dimension_type capacity);
+
+  //! Ordinary copy constructor.
+  DB_Row(const DB_Row& y);
+
+  //! Copy constructor with specified capacity.
+  /*!
+    It is assumed that \p capacity is greater than or equal to \p y size.
+  */
+  DB_Row(const DB_Row& y, dimension_type capacity);
+
+  //! Copy constructor with specified size and capacity.
+  /*!
+    It is assumed that \p sz is greater than or equal to the size of \p y
+    and, of course, that \p sz is less than or equal to \p capacity.
+    Any new position is initialized to \f$+\infty\f$.
+  */
+  DB_Row(const DB_Row& y, dimension_type sz, dimension_type capacity);
+
+  //! Destructor.
+  ~DB_Row();
+
+  //! Assignment operator.
+  DB_Row& operator=(const DB_Row& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(DB_Row& y);
+
+  //! Assigns the implementation of \p y to \p *this.
+  void assign(DB_Row& y);
+
+  /*! \brief
+    Allocates memory for a default constructed DB_Row object,
+    allowing for \p capacity coefficients at most.
+
+    It is assumed that no allocation has been performed before
+    (otherwise, a memory leak will occur).
+    After execution, the size of the DB_Row object is zero.
+  */
+  void allocate(dimension_type capacity);
+
+  //! Expands the row to size \p new_size.
+  /*!
+    Adds new positions to the implementation of the row
+    obtaining a new row with size \p new_size.
+    It is assumed that \p new_size is between the current size
+    and capacity of the row. The new positions are initialized
+    to \f$+\infty\f$.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    Destroys elements of the row implementation
+    from position \p new_size to the end.
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Returns the size() of the largest possible DB_Row.
+  static dimension_type max_size();
+
+  //! Gives the number of coefficients currently in use.
+  dimension_type size() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of the row indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of the row indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+  //! A (non const) random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<T*> iterator;
+
+  //! A const random access iterator to access the row's elements.
+  typedef Implementation::Ptr_Iterator<const T*> const_iterator;
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns the const iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const iterator.
+  const_iterator end() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns the total size in bytes of the memory occupied by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  /*! \brief
+    Returns the size in bytes of the memory managed by \p *this,
+    provided the capacity of \p *this is given by \p capacity.
+  */
+  memory_size_type external_memory_in_bytes(dimension_type capacity) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::DB_Row;
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const DB_Row& y);
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  //! Returns the capacity of the row (only available during debugging).
+  dimension_type capacity() const;
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Row<T>& x, DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps objects referred by \p x and \p y.
+/*! \relates DB_Row */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+               typename std::vector<DB_Row<T> >::iterator y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+/*! \relates DB_Row */
+template <typename T>
+bool operator==(const DB_Row<T>& x, const DB_Row<T>& y);
+
+/*! \relates DB_Row */
+template <typename T>
+bool operator!=(const DB_Row<T>& x, const DB_Row<T>& y);
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//@}
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The real implementation of a DB_Row object.
+/*! \ingroup PPL_CXX_interface
+  The class DB_Row_Impl_Handler::Impl provides the implementation of
+  DB_Row objects and, in particular, of the corresponding memory
+  allocation functions.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Row_Impl_Handler<T>::Impl {
+public:
+  //! \name Custom allocator and deallocator.
+  //@{
+
+  /*! \brief
+    Allocates a chunk of memory able to contain \p capacity T objects
+    beyond the specified \p fixed_size and returns a pointer to the new
+    allocated memory.
+  */
+  static void* operator new(size_t fixed_size, dimension_type capacity);
+
+  //! Uses the standard delete operator to free the memory \p p points to.
+  static void operator delete(void* p);
+
+  /*! \brief
+    Placement version: uses the standard operator delete to free
+    the memory \p p points to.
+  */
+  static void operator delete(void* p, dimension_type capacity);
+  //@}
+
+  //! Default constructor.
+  Impl();
+
+  //! Destructor.
+  /*!
+    Uses <CODE>shrink()</CODE> method with argument \f$0\f$
+    to delete all the row elements.
+  */
+  ~Impl();
+
+  //! Expands the row to size \p new_size.
+  /*!
+    It is assumed that \p new_size is between the current size and capacity.
+  */
+  void expand_within_capacity(dimension_type new_size);
+
+  //! Shrinks the row by erasing elements at the end.
+  /*!
+    It is assumed that \p new_size is not greater than the current size.
+  */
+  void shrink(dimension_type new_size);
+
+  //! Exception-safe copy construction mechanism for coefficients.
+  void copy_construct_coefficients(const Impl& y);
+
+  /*! \brief
+    Exception-safe upward approximation construction mechanism
+    for coefficients.
+  */
+  template <typename U>
+  void construct_upward_approximation(const U& y);
+
+  //! Returns the size() of the largest possible Impl.
+  static dimension_type max_size();
+
+  //! \name Size accessors.
+  //@{
+  //! Returns the actual size of \p this.
+  dimension_type size() const;
+
+  //! Sets to \p new_sz the actual size of \p *this.
+  void set_size(dimension_type new_sz);
+
+  //! Increments the size of \p *this by 1.
+  void bump_size();
+  //@}
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the element of \p *this indexed by \p k.
+  T& operator[](dimension_type k);
+
+  //! Returns a constant reference to the element of \p *this indexed by \p k.
+  const T& operator[](dimension_type k) const;
+  //@}
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes(dimension_type capacity) const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+private:
+  friend class DB_Row<T>;
+
+  //! The number of coefficients in the row.
+  dimension_type size_;
+
+  //! The vector of coefficients.
+  T vec_[
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+          0
+#else
+          1
+#endif
+  ];
+
+  //! Private and unimplemented: copy construction is not allowed.
+  Impl(const Impl& y);
+
+  //! Private and unimplemented: assignment is not allowed.
+  Impl& operator=(const Impl&);
+
+  //! Exception-safe copy construction mechanism.
+  void copy_construct(const Impl& y);
+};
+
+/* Automatically generated from PPL source file ../src/DB_Row_inlines.hh line 1. */
+/* DB_Row class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Row_inlines.hh line 29. */
+#include <cstddef>
+#include <limits>
+#include <algorithm>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void*
+DB_Row_Impl_Handler<T>::Impl::operator new(const size_t fixed_size,
+                                           const dimension_type capacity) {
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+  PPL_ASSERT(capacity >= 1);
+  return ::operator new(fixed_size + (capacity-1)*sizeof(T));
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::operator delete(void* p, dimension_type) {
+  ::operator delete(p);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl
+::total_memory_in_bytes(dimension_type capacity) const {
+  return
+    sizeof(*this)
+    + capacity*sizeof(T)
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+    - 1*sizeof(T)
+#endif
+    + external_memory_in_bytes();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row_Impl_Handler<T>::Impl::total_memory_in_bytes() const {
+  // In general, this is a lower bound, as the capacity of *this
+  // may be strictly greater than `size_'
+  return total_memory_in_bytes(size_);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+  return std::numeric_limits<size_t>::max() / sizeof(T);
+}
+
+template <typename T>
+inline dimension_type
+DB_Row_Impl_Handler<T>::Impl::size() const {
+  return size_;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::set_size(const dimension_type new_sz) {
+  size_ = new_sz;
+}
+
+template <typename T>
+inline void
+DB_Row_Impl_Handler<T>::Impl::bump_size() {
+  ++size_;
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::Impl()
+  : size_(0) {
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::Impl::~Impl() {
+  shrink(0);
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::DB_Row_Impl_Handler()
+  : impl(0) {
+#if PPL_DB_ROW_EXTRA_DEBUG
+  capacity_ = 0;
+#endif
+}
+
+template <typename T>
+inline
+DB_Row_Impl_Handler<T>::~DB_Row_Impl_Handler() {
+  delete impl;
+}
+
+template <typename T>
+inline T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) {
+  PPL_ASSERT(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < size());
+  return vec_[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::max_size() {
+  return DB_Row_Impl_Handler<T>::Impl::max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Row<T>::size() const {
+  return this->impl->size();
+}
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+  return this->capacity_;
+}
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row()
+  : DB_Row_Impl_Handler<T>() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::allocate(
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+               const
+#endif
+               dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(capacity <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (capacity == 0)
+    ++capacity;
+#endif
+  PPL_ASSERT(x.impl == 0);
+  x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if PPL_DB_ROW_EXTRA_DEBUG
+  PPL_ASSERT(x.capacity_ == 0);
+  x.capacity_ = capacity;
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::expand_within_capacity(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(x.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  PPL_ASSERT(new_size <= x.capacity_);
+#endif
+  x.impl->expand_within_capacity(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::copy_construct_coefficients(const DB_Row& y) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(x.impl && y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  PPL_ASSERT(y.size() <= x.capacity_);
+#endif
+  x.impl->copy_construct_coefficients(*(y.impl));
+}
+
+template <typename T>
+template <typename U>
+inline void
+DB_Row<T>::construct_upward_approximation(const DB_Row<U>& y,
+                                          const dimension_type capacity) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  PPL_ASSERT(y.impl);
+  x.impl->construct_upward_approximation(*(y.impl));
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz,
+                     const dimension_type capacity) {
+  PPL_ASSERT(sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::construct(const dimension_type sz) {
+  construct(sz, sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz,
+                  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  construct(sz, capacity);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const dimension_type sz) {
+  construct(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y)
+  : DB_Row_Impl_Handler<T>() {
+  if (y.impl != 0) {
+    allocate(compute_capacity(y.size(), max_size()));
+    copy_construct_coefficients(y);
+  }
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+                  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  PPL_ASSERT(y.impl);
+  PPL_ASSERT(y.size() <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+}
+
+template <typename T>
+inline
+DB_Row<T>::DB_Row(const DB_Row& y,
+                  const dimension_type sz,
+                  const dimension_type capacity)
+  : DB_Row_Impl_Handler<T>() {
+  PPL_ASSERT(y.impl);
+  PPL_ASSERT(y.size() <= sz && sz <= capacity && capacity <= max_size());
+  allocate(capacity);
+  copy_construct_coefficients(y);
+  expand_within_capacity(sz);
+}
+
+template <typename T>
+inline
+DB_Row<T>::~DB_Row() {
+}
+
+template <typename T>
+inline void
+DB_Row<T>::shrink(const dimension_type new_size) {
+  DB_Row<T>& x = *this;
+  PPL_ASSERT(x.impl);
+  x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::m_swap(DB_Row& y) {
+  using std::swap;
+  DB_Row<T>& x = *this;
+  swap(x.impl, y.impl);
+#if PPL_DB_ROW_EXTRA_DEBUG
+  swap(x.capacity_, y.capacity_);
+#endif
+}
+
+template <typename T>
+inline void
+DB_Row<T>::assign(DB_Row& y) {
+  DB_Row<T>& x = *this;
+  x.impl = y.impl;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+  DB_Row tmp(y);
+  m_swap(tmp);
+  return *this;
+}
+
+template <typename T>
+inline T&
+DB_Row<T>::operator[](const dimension_type k) {
+  DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row<T>::operator[](const dimension_type k) const {
+  const DB_Row<T>& x = *this;
+  return (*x.impl)[k];
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::iterator
+DB_Row<T>::end() {
+  DB_Row<T>& x = *this;
+  return iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::begin() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_);
+}
+
+template <typename T>
+inline typename DB_Row<T>::const_iterator
+DB_Row<T>::end() const {
+  const DB_Row<T>& x = *this;
+  return const_iterator(x.impl->vec_ + x.impl->size_);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes(dimension_type capacity) const {
+  const DB_Row<T>& x = *this;
+  return x.impl->total_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes(dimension_type capacity) const {
+  return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::external_memory_in_bytes() const {
+  const DB_Row<T>& x = *this;
+#if PPL_DB_ROW_EXTRA_DEBUG
+  return x.impl->total_memory_in_bytes(x.capacity_);
+#else
+  return x.impl->total_memory_in_bytes();
+#endif
+}
+
+template <typename T>
+inline memory_size_type
+DB_Row<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+  return !(x == y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+swap(DB_Row<T>& x, DB_Row<T>& y) {
+  x.m_swap(y);
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<DB_Row<T> >::iterator x,
+          typename std::vector<DB_Row<T> >::iterator y) {
+  swap(*x, *y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Row_templates.hh line 1. */
+/* DB_Row class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Row_templates.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+template <typename U>
+void
+DB_Row_Impl_Handler<T>::Impl::construct_upward_approximation(const U& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    construct(vec_[i], y[i], ROUND_UP);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (y_size > 0) {
+    assign_r(vec_[0], y[0], ROUND_UP);
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      construct(vec_[i], y[i], ROUND_UP);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+  PPL_ASSERT(size() <= new_size && new_size <= max_size());
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (size() == 0 && new_size > 0) {
+    // vec_[0] is already constructed: we just need to assign +infinity.
+    assign_r(vec_[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    bump_size();
+  }
+#endif
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = size(); i < new_size; ++i) {
+    new (&vec_[i]) T(PLUS_INFINITY, ROUND_NOT_NEEDED);
+    bump_size();
+  }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+  const dimension_type old_size = size();
+  PPL_ASSERT(new_size <= old_size);
+  // Since ~T() does not throw exceptions, nothing here does.
+  set_size(new_size);
+#if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  // Make sure we do not try to destroy vec_[0].
+  if (new_size == 0)
+    ++new_size;
+#endif
+  // We assume construction was done "forward".
+  // We thus perform destruction "backward".
+  for (dimension_type i = old_size; i-- > new_size; )
+    vec_[i].~T();
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::copy_construct_coefficients(const Impl& y) {
+  const dimension_type y_size = y.size();
+#if PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < y_size; ++i) {
+    new (&vec_[i]) T(y.vec_[i]);
+    bump_size();
+  }
+#else // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (y_size > 0) {
+    vec_[0] = y.vec_[0];
+    bump_size();
+    // Construct in direct order: will destroy in reverse order.
+    for (dimension_type i = 1; i < y_size; ++i) {
+      new (&vec_[i]) T(y.vec_[i]);
+      bump_size();
+    }
+  }
+#endif // PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+}
+
+template <typename T>
+memory_size_type
+DB_Row_Impl_Handler<T>::Impl::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += Parma_Polyhedra_Library::external_memory_in_bytes(vec_[i]);
+  return n;
+}
+
+template <typename T>
+bool
+DB_Row<T>::OK(const dimension_type row_size,
+              const dimension_type
+#if PPL_DB_ROW_EXTRA_DEBUG
+              row_capacity
+#endif
+              ) const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  const DB_Row<T>& x = *this;
+  bool is_broken = false;
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+# if !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (x.capacity_ == 0) {
+    cerr << "Illegal row capacity: is 0, should be at least 1"
+         << endl;
+    is_broken = true;
+  }
+  else if (x.capacity_ == 1 && row_capacity == 0)
+    // This is fine.
+    ;
+  else
+# endif // !PPL_CXX_SUPPORTS_ZERO_LENGTH_ARRAYS
+  if (x.capacity_ != row_capacity) {
+    cerr << "DB_Row capacity mismatch: is " << x.capacity_
+         << ", should be " << row_capacity << "."
+         << endl;
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+  if (x.size() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Row size mismatch: is " << x.size()
+         << ", should be " << row_size << "."
+         << endl;
+#endif
+    is_broken = true;
+  }
+
+#if PPL_DB_ROW_EXTRA_DEBUG
+  if (x.capacity_ < x.size()) {
+#ifndef NDEBUG
+    cerr << "DB_Row is completely broken: capacity is " << x.capacity_
+         << ", size is " << x.size() << "."
+         << endl;
+#endif
+    is_broken = true;
+  }
+#endif // PPL_DB_ROW_EXTRA_DEBUG
+
+  for (dimension_type i = x.size(); i-- > 0; ) {
+    const T& element = x[i];
+    // Not OK is bad.
+    if (!element.OK()) {
+      is_broken = true;
+      break;
+    }
+    // In addition, nans should never occur.
+    if (is_not_a_number(element)) {
+#ifndef NDEBUG
+      cerr << "Not-a-number found in DB_Row."
+           << endl;
+#endif
+      is_broken = true;
+      break;
+    }
+  }
+
+  return !is_broken;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+bool
+operator==(const DB_Row<T>& x, const DB_Row<T>& y) {
+  if (x.size() != y.size())
+    return false;
+  for (dimension_type i = x.size(); i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Row_defs.hh line 469. */
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_defs.hh line 32. */
+#include <vector>
+#include <cstddef>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const DB_Matrix<T>& c);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for the square matrices.
+/*! \ingroup PPL_CXX_interface
+  The template class DB_Matrix<T> allows for the representation of
+  a square matrix of T objects.
+  Each DB_Matrix<T> object can be viewed as a multiset of DB_Row<T>.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+class Parma_Polyhedra_Library::DB_Matrix {
+public:
+  //! Returns the maximum number of rows a DB_Matrix can handle.
+  static dimension_type max_num_rows();
+
+  //! Returns the maximum number of columns a DB_Matrix can handle.
+  static dimension_type max_num_columns();
+
+  //! Builds an empty matrix.
+  /*!
+    DB_Rows' size and capacity are initialized to \f$0\f$.
+  */
+  DB_Matrix();
+
+  //! Builds a square matrix having the specified dimension.
+  explicit DB_Matrix(dimension_type n_rows);
+
+  //! Copy constructor.
+  DB_Matrix(const DB_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit DB_Matrix(const DB_Matrix<U>& y);
+
+  //! Destructor.
+  ~DB_Matrix();
+
+  //! Assignment operator.
+  DB_Matrix& operator=(const DB_Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A read-only iterator over the rows of the matrix.
+  /*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  class const_iterator {
+  private:
+    typedef typename std::vector<DB_Row<T> >::const_iterator Iter;
+    //! The const iterator on the rows' vector \p rows.
+    Iter i;
+
+  public:
+    typedef std::forward_iterator_tag iterator_category;
+    typedef typename std::iterator_traits<Iter>::value_type value_type;
+    typedef typename std::iterator_traits<Iter>::difference_type
+    difference_type;
+    typedef typename std::iterator_traits<Iter>::pointer pointer;
+    typedef typename std::iterator_traits<Iter>::reference reference;
+
+    //! Default constructor.
+    const_iterator();
+
+    /*! \brief
+      Builds a const iterator on the matrix starting from
+      an iterator \p b on the elements of the vector \p rows.
+    */
+    explicit const_iterator(const Iter& b);
+
+    //! Ordinary copy constructor.
+    const_iterator(const const_iterator& y);
+
+    //! Assignment operator.
+    const_iterator& operator=(const const_iterator& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    const_iterator& operator++();
+
+    //! Postfix increment operator.
+    const_iterator operator++(int);
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are identical.
+    */
+    bool operator==(const const_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if
+      \p *this and \p y are different.
+    */
+    bool operator!=(const const_iterator& y) const;
+  };
+
+  /*! \brief
+    Returns the const_iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+private:
+  template <typename U> friend class DB_Matrix;
+
+  //! The rows of the matrix.
+  std::vector<DB_Row<T> > rows;
+
+  //! Size of the initialized part of each row.
+  dimension_type row_size;
+
+  /*! \brief
+    Capacity allocated for each row, i.e., number of
+    <CODE>long</CODE> objects that each row can contain.
+  */
+  dimension_type row_capacity;
+
+public:
+  //! Swaps \p *this with \p y.
+  void m_swap(DB_Matrix& y);
+
+  //! Makes the matrix grow by adding more rows and more columns.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created.
+    The contents of the old matrix are copied in the upper, left-hand
+    corner of the new matrix, which is then assigned to \p *this.
+  */
+  void grow(dimension_type new_n_rows);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_n_rows
+    The number of rows and columns of the resized matrix.
+
+    A new matrix, with the specified dimension, is created without copying
+    the content of the old matrix and assigned to \p *this.
+  */
+  void resize_no_copy(dimension_type new_n_rows);
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  DB_Row<T>& operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const DB_Row<T>& operator[](dimension_type k) const;
+  //@}
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(DB_Matrix<T>& x, DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const DB_Matrix<T>& x,
+                                 const DB_Matrix<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const DB_Matrix<T>& x,
+                               const DB_Matrix<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates DB_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const DB_Matrix<T>& x,
+                                const DB_Matrix<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_inlines.hh line 1. */
+/* DB_Matrix class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_inlines.hh line 31. */
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::m_swap(DB_Matrix& y) {
+  using std::swap;
+  swap(rows, y.rows);
+  swap(row_size, y.row_size);
+  swap(row_capacity, y.row_capacity);
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_rows() {
+  return std::vector<DB_Row<T> >().max_size();
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::max_num_columns() {
+  return DB_Row<T>::max_size();
+}
+
+template <typename T>
+inline memory_size_type
+DB_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator()
+  : i(Iter()) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const Iter& b)
+  : i(b) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::const_iterator::const_iterator(const const_iterator& y)
+  : i(y.i) {
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator=(const const_iterator& y) {
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::reference
+DB_Matrix<T>::const_iterator::operator*() const {
+  return *i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator::pointer
+DB_Matrix<T>::const_iterator::operator->() const {
+  return &*i;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator&
+DB_Matrix<T>::const_iterator::operator++() {
+  ++i;
+  return *this;
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::const_iterator::operator++(int) {
+  return const_iterator(i++);
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator==(const const_iterator& y) const {
+  return i == y.i;
+}
+
+template <typename T>
+inline bool
+DB_Matrix<T>::const_iterator::operator!=(const const_iterator& y) const {
+  return !operator==(y);
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::begin() const {
+  return const_iterator(rows.begin());
+}
+
+template <typename T>
+inline typename DB_Matrix<T>::const_iterator
+DB_Matrix<T>::end() const {
+  return const_iterator(rows.end());
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix()
+  : rows(),
+    row_size(0),
+    row_capacity(0) {
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::~DB_Matrix() {
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+  PPL_ASSERT(k < rows.size());
+  return rows[k];
+}
+
+template <typename T>
+inline dimension_type
+DB_Matrix<T>::num_rows() const {
+  return rows.size();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+DB_Matrix<T>::DB_Matrix(const DB_Matrix& y)
+  : rows(y.rows),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+template <typename T>
+inline DB_Matrix<T>&
+DB_Matrix<T>::operator=(const DB_Matrix& y) {
+  // Without the following guard against auto-assignments we would
+  // recompute the row capacity based on row size, possibly without
+  // actually increasing the capacity of the rows.  This would lead to
+  // an inconsistent state.
+  if (this != &y) {
+    // The following assignment may do nothing on auto-assignments...
+    rows = y.rows;
+    row_size = y.row_size;
+    // ... hence the following assignment must not be done on
+    // auto-assignments.
+    row_capacity = compute_capacity(y.row_size, max_num_columns());
+  }
+  return *this;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const DB_Matrix<T>& x,
+                    const DB_Matrix<T>& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0,
+                    Temp& tmp1,
+                    Temp& tmp2) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_num_rows; i-- > 0; ) {
+    const DB_Row<T>& x_i = x[i];
+    const DB_Row<T>& y_i = y[i];
+    for (dimension_type j = x_num_rows; j-- > 0; ) {
+      const T& x_i_j = x_i[j];
+      const T& y_i_j = y_i[j];
+      if (is_plus_infinity(x_i_j)) {
+        if (is_plus_infinity(y_i_j))
+          continue;
+        else {
+        pinf:
+          assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+          return true;
+        }
+      }
+      else if (is_plus_infinity(y_i_j))
+        goto pinf;
+
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i_j > y_i_j) {
+        maybe_assign(tmp1p, tmp1, x_i_j, dir);
+        maybe_assign(tmp2p, tmp2, y_i_j, inverse(dir));
+      }
+      else {
+        maybe_assign(tmp1p, tmp1, y_i_j, dir);
+        maybe_assign(tmp2p, tmp2, x_i_j, inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      PPL_ASSERT(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const DB_Matrix<T>& x,
+                            const DB_Matrix<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+                                                                    dir,
+                                                                    tmp0,
+                                                                    tmp1,
+                                                                    tmp2);
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const DB_Matrix<T>& x,
+                          const DB_Matrix<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+                                                                  dir,
+                                                                  tmp0,
+                                                                  tmp1,
+                                                                  tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const DB_Matrix<T>& x,
+                           const DB_Matrix<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+                                                                   dir,
+                                                                   tmp0,
+                                                                   tmp1,
+                                                                   tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline void
+swap(DB_Matrix<T>& x, DB_Matrix<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_templates.hh line 1. */
+/* DB_Matrix class implementation: non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+DB_Matrix<T>::DB_Matrix(const dimension_type n_rows)
+  : rows(n_rows),
+    row_size(n_rows),
+    row_capacity(compute_capacity(n_rows, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0; i < n_rows; ++i)
+    rows[i].construct(n_rows, row_capacity);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+DB_Matrix<T>::DB_Matrix(const DB_Matrix<U>& y)
+  : rows(y.rows.size()),
+    row_size(y.row_size),
+    row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+  // Construct in direct order: will destroy in reverse order.
+  for (dimension_type i = 0, n_rows = rows.size(); i < n_rows; ++i)
+    rows[i].construct_upward_approximation(y[i], row_capacity);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+  const dimension_type old_n_rows = rows.size();
+  PPL_ASSERT(new_n_rows >= old_n_rows);
+
+  if (new_n_rows > old_n_rows) {
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+        // Reallocation will take place.
+        std::vector<DB_Row<T> > new_rows;
+        new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+        new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+        // Construct the new rows.
+        dimension_type i = new_n_rows;
+        while (i-- > old_n_rows)
+          new_rows[i].construct(new_n_rows, row_capacity);
+        // Steal the old rows.
+        ++i;
+        while (i-- > 0)
+          swap(new_rows[i], rows[i]);
+        // Put the new vector into place.
+        using std::swap;
+        swap(rows, new_rows);
+      }
+      else {
+        // Reallocation will NOT take place.
+        rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+        for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+          rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows.
+      DB_Matrix new_matrix;
+      new_matrix.rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+      new_matrix.rows.insert(new_matrix.rows.end(), new_n_rows, DB_Row<T>());
+      // Construct the new rows.
+      new_matrix.row_size = new_n_rows;
+      new_matrix.row_capacity = compute_capacity(new_n_rows,
+                                                 max_num_columns());
+      dimension_type i = new_n_rows;
+      while (i-- > old_n_rows)
+        new_matrix.rows[i].construct(new_matrix.row_size,
+                                     new_matrix.row_capacity);
+      // Copy the old rows.
+      ++i;
+      while (i-- > 0) {
+        // FIXME: copying may be unnecessarily costly.
+        DB_Row<T> new_row(rows[i],
+                          new_matrix.row_size,
+                          new_matrix.row_capacity);
+        swap(new_matrix.rows[i], new_row);
+      }
+      // Put the new vector into place.
+      m_swap(new_matrix);
+      return;
+    }
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+        rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+        = compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+        // FIXME: copying may be unnecessarily costly.
+        DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+        swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+    // Rows have grown or shrunk.
+    row_size = new_n_rows;
+  }
+}
+
+template <typename T>
+void
+DB_Matrix<T>::resize_no_copy(const dimension_type new_n_rows) {
+  dimension_type old_n_rows = rows.size();
+
+  if (new_n_rows > old_n_rows) {
+    // Rows will be inserted.
+    if (new_n_rows <= row_capacity) {
+      // We can recycle the old rows.
+      if (rows.capacity() < new_n_rows) {
+        // Reallocation (of vector `rows') will take place.
+        std::vector<DB_Row<T> > new_rows;
+        new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+        new_rows.insert(new_rows.end(), new_n_rows, DB_Row<T>());
+        // Construct the new rows (be careful: each new row must have
+        // the same capacity as each one of the old rows).
+        dimension_type i = new_n_rows;
+        while (i-- > old_n_rows)
+          new_rows[i].construct(new_n_rows, row_capacity);
+        // Steal the old rows.
+        ++i;
+        while (i-- > 0)
+          swap(new_rows[i], rows[i]);
+        // Put the new vector into place.
+        using std::swap;
+        swap(rows, new_rows);
+      }
+      else {
+        // Reallocation (of vector `rows') will NOT take place.
+        rows.insert(rows.end(), new_n_rows - old_n_rows, DB_Row<T>());
+        // Be careful: each new row must have
+        // the same capacity as each one of the old rows.
+        for (dimension_type i = new_n_rows; i-- > old_n_rows; )
+          rows[i].construct(new_n_rows, row_capacity);
+      }
+    }
+    else {
+      // We cannot even recycle the old rows: allocate a new matrix and swap.
+      DB_Matrix new_matrix(new_n_rows);
+      m_swap(new_matrix);
+      return;
+    }
+  }
+  else if (new_n_rows < old_n_rows) {
+    // Drop some rows.
+    rows.resize(new_n_rows);
+    // Shrink the existing rows.
+    for (dimension_type i = new_n_rows; i-- > 0; )
+      rows[i].shrink(new_n_rows);
+    old_n_rows = new_n_rows;
+  }
+  // Here we have the right number of rows.
+  if (new_n_rows > row_size) {
+    // We need more columns.
+    if (new_n_rows <= row_capacity)
+      // But we have enough capacity: we resize existing rows.
+      for (dimension_type i = old_n_rows; i-- > 0; )
+        rows[i].expand_within_capacity(new_n_rows);
+    else {
+      // Capacity exhausted: we must reallocate the rows and
+      // make sure all the rows have the same capacity.
+      const dimension_type new_row_capacity
+        = compute_capacity(new_n_rows, max_num_columns());
+      for (dimension_type i = old_n_rows; i-- > 0; ) {
+        DB_Row<T> new_row(new_n_rows, new_row_capacity);
+        swap(rows[i], new_row);
+      }
+      row_capacity = new_row_capacity;
+    }
+  }
+  // DB_Rows have grown or shrunk.
+  row_size = new_n_rows;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const DB_Matrix<T>& x = *this;
+  const char separator = ' ';
+  const dimension_type nrows = x.num_rows();
+  s << nrows << separator << "\n";
+  for (dimension_type i = 0; i < nrows;  ++i) {
+    for (dimension_type j = 0; j < nrows; ++j) {
+      using namespace IO_Operators;
+      s << x[i][j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, DB_Matrix<T>)
+
+template <typename T>
+bool
+DB_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type nrows;
+  if (!(s >> nrows))
+    return false;
+  resize_no_copy(nrows);
+  DB_Matrix& x = *this;
+  for (dimension_type i = 0; i < nrows;  ++i)
+    for (dimension_type j = 0; j < nrows; ++j) {
+      Result r = input(x[i][j], s, ROUND_CHECK);
+      if (result_relation(r) != VR_EQ || is_minus_infinity(x[i][j]))
+        return false;
+    }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool
+operator==(const DB_Matrix<T>& x, const DB_Matrix<T>& y) {
+  const dimension_type x_num_rows = x.num_rows();
+  if (x_num_rows != y.num_rows())
+    return false;
+  for (dimension_type i = x_num_rows; i-- > 0; )
+    if (x[i] != y[i])
+      return false;
+  return true;
+}
+
+template <typename T>
+memory_size_type
+DB_Matrix<T>::external_memory_in_bytes() const {
+  memory_size_type n = rows.capacity() * sizeof(DB_Row<T>);
+  for (dimension_type i = num_rows(); i-- > 0; )
+    n += rows[i].external_memory_in_bytes(row_capacity);
+  return n;
+}
+
+template <typename T>
+bool
+DB_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+
+  // The matrix must be square.
+  if (num_rows() != row_size) {
+#ifndef NDEBUG
+    cerr << "DB_Matrix has fewer columns than rows:\n"
+         << "row_size is " << row_size
+         << ", num_rows() is " << num_rows() << "!"
+         << endl;
+#endif
+    return false;
+  }
+
+  const DB_Matrix& x = *this;
+  const dimension_type n_rows = x.num_rows();
+  for (dimension_type i = 0; i < n_rows; ++i) {
+    if (!x[i].OK(row_size, row_capacity))
+      return false;
+  }
+
+  // All checks passed.
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const DB_Matrix<T>& c) {
+  const dimension_type n = c.num_rows();
+  for (dimension_type i = 0; i < n; ++i) {
+    for (dimension_type j = 0; j < n; ++j)
+      s << c[i][j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/DB_Matrix_defs.hh line 324. */
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_defs.hh line 1. */
+/* Coefficient types of weakly-relational domains: declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_defs.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+  The production policy for checked numbers used in weakly-relational
+  domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct WRD_Extended_Number_Policy {
+  //! Check for overflowed result.
+  const_bool_nodef(check_overflow, true);
+
+  //! Do not check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, false);
+
+  //! Do not check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, false);
+
+  //! Do not check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, false);
+
+  //! Do not check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, false);
+
+  //! Do not check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, false);
+
+  //! Do not check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, false);
+
+  //! Do not checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, false);
+
+  //! Handle not-a-number special value.
+  const_bool_nodef(has_nan, true);
+
+  //! Handle infinity special values.
+  const_bool_nodef(has_infinity, true);
+
+  // `convertible' is intentionally not defined: the compile time
+  // error on conversions is the expected behavior.
+
+  //! Honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, true);
+
+  //! Do not make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, false);
+
+  // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+  // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+  // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+  // ROUND_DEFAULT_INPUT is intentionally not defined.
+  // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface \brief
+  The debugging policy for checked numbers used in weakly-relational
+  domains.
+ */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+struct Debug_WRD_Extended_Number_Policy {
+  //! Check for overflowed result.
+  const_bool_nodef(check_overflow, true);
+
+  //! Check for attempts to add infinities with different sign.
+  const_bool_nodef(check_inf_add_inf, true);
+
+  //! Check for attempts to subtract infinities with same sign.
+  const_bool_nodef(check_inf_sub_inf, true);
+
+  //! Check for attempts to multiply infinities by zero.
+  const_bool_nodef(check_inf_mul_zero, true);
+
+  //! Check for attempts to divide by zero.
+  const_bool_nodef(check_div_zero, true);
+
+  //! Check for attempts to divide infinities.
+  const_bool_nodef(check_inf_div_inf, true);
+
+  //! Check for attempts to compute remainder of infinities.
+  const_bool_nodef(check_inf_mod, true);
+
+  //! Checks for attempts to take the square root of a negative number.
+  const_bool_nodef(check_sqrt_neg, true);
+
+  //! Handle not-a-number special value.
+  const_bool_nodef(has_nan, true);
+
+  //! Handle infinity special values.
+  const_bool_nodef(has_infinity, true);
+
+  // `convertible' is intentionally not defined: the compile time
+  // error on conversions is the expected behavior.
+
+  //! Honor requests to check for FPU inexact results.
+  const_bool_nodef(fpu_check_inexact, true);
+
+  //! Make extra checks to detect FPU NaN results.
+  const_bool_nodef(fpu_check_nan_result, true);
+
+  // ROUND_DEFAULT_CONSTRUCTOR is intentionally not defined.
+  // ROUND_DEFAULT_OPERATOR is intentionally not defined.
+  // ROUND_DEFAULT_FUNCTION is intentionally not defined.
+  // ROUND_DEFAULT_INPUT is intentionally not defined.
+  // ROUND_DEFAULT_OUTPUT is intentionally not defined.
+
+  /*! \brief
+    Handles \p r: called by all constructors, operators and functions that
+    do not return a Result value.
+  */
+  static void handle_result(Result r);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_inlines.hh line 1. */
+/* Coefficient types of weakly-relational domains: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline void
+WRD_Extended_Number_Policy::handle_result(Result r) {
+  if (result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+
+inline void
+Debug_WRD_Extended_Number_Policy::handle_result(Result r) {
+  if (result_class(r) == VC_NAN)
+    throw_result_exception(r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/WRD_coefficient_types_defs.hh line 152. */
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 52. */
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::BD_Shape
+  Writes a textual representation of \p bds on \p s:
+  <CODE>false</CODE> is written if \p bds is an empty polyhedron;
+  <CODE>true</CODE> is written if \p bds is the universe polyhedron;
+  a system of constraints defining \p bds is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const BD_Shape<T>& bds);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates BD_Shape */
+template <typename T>
+void swap(BD_Shape<T>& x, BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are the same BDS.
+/*! \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not the same BDS.
+/*! \relates BD_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const BD_Shape<T>& x,
+                                 const BD_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const BD_Shape<T>& x,
+                               const BD_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates BD_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const BD_Shape<T>& x,
+                                const BD_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class BD_Shape_Helpers {
+public:
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Decodes the constraint \p c as a bounded difference.
+  /*! \relates BD_Shape
+    \return
+    <CODE>true</CODE> if the constraint \p c is a
+    \ref Bounded_Difference_Shapes "bounded difference";
+    <CODE>false</CODE> otherwise.
+
+    \param c
+    The constraint to be decoded.
+
+    \param c_num_vars
+    If <CODE>true</CODE> is returned, then it will be set to the number
+    of variables having a non-zero coefficient. The only legal values
+    will therefore be 0, 1 and 2.
+
+    \param c_first_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the index of the first variable having
+    a non-zero coefficient in \p c.
+
+    \param c_second_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+    then it will be set to the index of the second variable having
+    a non-zero coefficient in \p c. If \p c_num_vars is set to 1, this must be
+    0.
+
+    \param c_coeff
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the value of the first non-zero coefficient
+    in \p c.
+  */
+  #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  static bool extract_bounded_difference(const Constraint& c,
+                                         dimension_type& c_num_vars,
+                                         dimension_type& c_first_var,
+                                         dimension_type& c_second_var,
+                                         Coefficient& c_coeff);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+/*! \relates BD_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void compute_leader_indices(const std::vector<dimension_type>& predecessor,
+                            std::vector<dimension_type>& indices);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A bounded difference shape.
+/*! \ingroup PPL_CXX_interface
+  The class template BD_Shape<T> allows for the efficient representation
+  of a restricted kind of <EM>topologically closed</EM> convex polyhedra
+  called <EM>bounded difference shapes</EM> (BDSs, for short).
+  The name comes from the fact that the closed affine half-spaces that
+  characterize the polyhedron can be expressed by constraints of the form
+  \f$\pm x_i \leq k\f$ or \f$x_i - x_j \leq k\f$, where the inhomogeneous
+  term \f$k\f$ is a rational number.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  bounded differences. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for BDSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.
+
+  The domain of BD shapes <EM>optimally supports</EM>:
+    - tautological and inconsistent constraints and congruences;
+    - bounded difference constraints;
+    - non-proper congruences (i.e., equalities) that are expressible
+      as bounded-difference constraints.
+
+  Depending on the method, using a constraint or congruence that is not
+  optimally supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  A constraint is a bounded difference if it has the form
+    \f[
+      a_i x_i - a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above bounded difference Constraint object
+  will be mapped into a \e correct and \e optimal approximation that,
+  depending on the expressive power of the chosen template argument \p T,
+  may loose some precision. Also note that strict constraints are not
+  bounded differences.
+
+  For instance, a Constraint object encoding \f$3x - 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x - y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x - y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x - y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, depending from the context, a Constraint object
+  encoding \f$3x - y \leq 1\f$ will be either upward approximated
+  (e.g., by safely ignoring it) or it will cause an exception.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  <CODE>x</CODE>, <CODE>y</CODE> and <CODE>z</CODE> are defined
+  (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds a BDS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    BD_Shape<T> bd(cs);
+  \endcode
+  Since only those constraints having the syntactic form of a
+  <EM>bounded difference</EM> are optimally supported, the following code
+  will throw an exception (caused by constraints 7, 8 and 9):
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 1);
+    cs.insert(y >= 0);
+    cs.insert(y <= 1);
+    cs.insert(z >= 0);
+    cs.insert(z <= 1);
+    cs.insert(x + y <= 0);      // 7
+    cs.insert(x - z + x >= 0);  // 8
+    cs.insert(3*z - y <= 1);    // 9
+    BD_Shape<T> bd(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::BD_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining a BDS.
+  */
+#ifndef NDEBUG
+  typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+  typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+  //! The numeric base type upon which bounded differences are built.
+  typedef T coefficient_type_base;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining a BDS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that a BDS can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle constraints.
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns \c false indicating that this domain cannot recycle congruences.
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds a universe or empty BDS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the BDS;
+
+    \param kind
+    Specifies whether the universe or the empty BDS has to be built.
+  */
+  explicit BD_Shape(dimension_type num_dimensions = 0,
+                    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  BD_Shape(const BD_Shape& y,
+           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename U>
+  explicit BD_Shape(const BD_Shape<U>& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS from the system of constraints \p cs.
+  /*!
+    The BDS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of BD constraints.
+
+    \exception std::invalid_argument
+    Thrown if \p cs contains a constraint which is not optimally supported
+    by the BD shape domain.
+  */
+  explicit BD_Shape(const Constraint_System& cs);
+
+  //! Builds a BDS from a system of congruences.
+  /*!
+    The BDS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences.
+
+    \exception std::invalid_argument
+    Thrown if \p cgs contains congruences which are not optimally
+    supported by the BD shape domain.
+  */
+  explicit BD_Shape(const Congruence_System& cgs);
+
+  //! Builds a BDS from the system of generators \p gs.
+  /*!
+    Builds the smallest BDS containing the polyhedron defined by \p gs.
+    The BDS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit BD_Shape(const Generator_System& gs);
+
+  //! Builds a BDS from the polyhedron \p ph.
+  /*!
+    Builds a BDS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the BDS built is the
+    smallest one containing \p ph.
+  */
+  explicit BD_Shape(const Polyhedron& ph,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS out of a box.
+  /*!
+    The BDS inherits the space dimension of the box.
+    The built BDS is the most precise BDS that includes the box.
+
+    \param box
+    The box representing the BDS to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit BD_Shape(const Box<Interval>& box,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS out of a grid.
+  /*!
+    The BDS inherits the space dimension of the grid.
+    The built BDS is the most precise BDS that includes the grid.
+
+    \param grid
+    The grid used to build the BDS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit BD_Shape(const Grid& grid,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a BDS from an octagonal shape.
+  /*!
+    The BDS inherits the space dimension of the octagonal shape.
+    The built BDS is the most precise BDS that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the BDS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit BD_Shape(const Octagonal_Shape<U>& os,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  BD_Shape& operator=(const BD_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with \p y
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  void m_swap(BD_Shape& y);
+
+  //! Destructor.
+  ~BD_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the BD_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const BD_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const BD_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const BD_Shape& y) const;
+
+  //! Returns the relations holding between \p *this and the constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and the congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and the generator \p g.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty BDS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe BDS.
+  bool is_universe() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a bounded BDS.
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this satisfies
+    all its invariants.
+  */
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the BD_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the BD_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is not optimally supported by the BD shape domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of congruence \p cg to the system of congruences of \p *this.
+
+    \param cg
+    The congruence to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    or \p cg is not optimally supported by the BD shape domain.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of bounded differences
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the BD shape domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this.
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the BD shape domain.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the BD shape domain.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    Contains the congruences that will be added to the system of
+    constraints of \p *this. Its elements may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the BD shape domain.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of bounded differences
+    defining \p *this.
+
+    \param c
+    The constraint. If it is not a bounded difference, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    bounded differences  of \p *this.
+
+    \param cg
+    The congruence. If it is not a bounded difference equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    bounded differences defining \p *this.
+
+    \param  cs
+    The constraint system to be used. Constraints that are not bounded
+    differences are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    bounded differences defining \p *this.
+
+    \param  cgs
+    The congruence system to be used. Congruences that are not bounded
+    difference equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Refines the system of BD_Shape constraints defining \p *this using
+    the constraint expressed by \p left \f$\leq\f$ \p right.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void refine_with_linear_form_inequality(
+                   const Linear_Form<Interval<T, Interval_Info> >& left,
+                   const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Refines the system of BD_Shape constraints defining \p *this using
+    the constraint expressed by \p left \f$\relsym\f$ \p right, where
+    \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param relsym
+    The relation symbol.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    \exception std::runtime_error
+    Thrown if \p relsym is not a valid relation symbol.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void generalized_refine_with_linear_form_inequality(
+                   const Linear_Form<Interval<T, Interval_Info> >& left,
+                   const Linear_Form<Interval<T, Interval_Info> >& right,
+                   Relation_Symbol relsym);
+
+  //! Applies to \p dest the interval constraints embedded in \p *this.
+  /*!
+    \param dest
+    The object to which the constraints will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest.
+
+    The template type parameter U must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the space dimension of the object.
+    \code
+      void set_empty()
+    \endcode
+    sets the object to an empty object.
+    \code
+      bool restrict_lower(dimension_type dim, const T& lb)
+    \endcode
+    restricts the object by applying the lower bound \p lb to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+    \code
+      bool restrict_upper(dimension_type dim, const T& ub)
+    \endcode
+    restricts the object by applying the upper bound \p ub to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+  */
+  template <typename U>
+  void export_interval_constraints(U& dest) const;
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BDS containing the union
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const BD_Shape& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    If the \e integer upper bound of \p *this and \p y is exact,
+    it is assigned to \p *this and <CODE>true</CODE> is returned;
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    The integer upper bound of two rational BDS is the smallest rational
+    BDS containing all the integral points of the two arguments.
+    This method requires that the coefficient type parameter \c T is
+    an integral type.
+  */
+  bool integer_upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest BD shape containing
+    the set difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const BD_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*! \brief
+    Assigns to \p *this the \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point coefficients that
+    defines the affine expression. ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+    is not a dimension of \p *this.
+  */
+  template <typename Interval_Info>
+  void affine_form_image(Variable var,
+                        const Linear_Form<Interval<T, Interval_Info> >& lf);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const BD_Shape& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator referencing the first stop-point.
+
+    \param last
+    An iterator referencing one past the last stop-point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const BD_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" of \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of restoring in \p y the constraints
+    of \p *this that were lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    A BDS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    As was the case for widening operators, the argument \p y is meant to
+    denote the value computed in the previous iteration step, whereas
+    \p *this denotes the value computed in the current iteration step
+    (in the <EM>decreasing</EM> iteration sequence). Hence, the call
+    <CODE>x.CC76_narrowing_assign(y)</CODE> will assign to \p x
+    the result of the computation \f$\mathtt{y} \Delta \mathtt{x}\f$.
+  */
+  void CC76_narrowing_assign(const BD_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const BD_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref H79_widening "H79-widening" between \p *this and \p y.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void H79_widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  //! Same as H79_widening_assign(y, tp).
+  void widening_assign(const BD_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref H79_widening "H79-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    A BDS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened BDS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible.
+  */
+  void limited_H79_extrapolation_assign(const BD_Shape& y,
+                                        const Constraint_System& cs,
+                                        unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old BDS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new
+    BDS, which is defined by a system of bounded differences in which the
+    variables running through the new dimensions are unconstrained.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the BDS and does not embed it in
+    the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the
+    new BDS, which is defined by a system of bounded differences in
+    which the variables running through the new dimensions are all
+    constrained to be equal to 0.
+    For instance, when starting from the BDS \f$\cB \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the BDS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cB
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const BD_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty co-domain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the co-domain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //! Refines \p store with the constraints defining \p *this.
+  /*!
+    \param store
+    The interval floating point abstract store to refine.
+  */
+  template <typename Interval_Info>
+  void refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+                                         store) const;
+
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  friend bool operator==<T>(const BD_Shape<T>& x, const BD_Shape<T>& y);
+
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const BD_Shape<U>& x, const BD_Shape<U>& y, const Rounding_Dir dir,
+   Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::BD_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! The matrix representing the system of bounded differences.
+  DB_Matrix<N> dbm;
+
+#define PPL_IN_BD_Shape_CLASS
+/* Automatically generated from PPL source file ../src/BDS_Status_idefs.hh line 1. */
+/* BD_Shape<T>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_BD_Shape_CLASS
+#error "Do not include BDS_Status_idefs.hh directly; use BD_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a BD_Shape<T> object.
+/*! \ingroup PPL_CXX_interface
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the BDS is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the BDS is the empty set;
+  - <EM>shortest-path closed</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences, so that all the constraints are
+    as tight as possible;
+  - <EM>shortest-path reduced</EM>: the BDS is represented by a shortest-path
+    closed system of bounded differences and each constraint in such a system
+    is marked as being either redundant or non-redundant.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion;
+  - <EM>shortest-path reduced</EM> implies <EM>shortest-path closed</EM>.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_shortest_path_closed() const;
+  void reset_shortest_path_closed();
+  void set_shortest_path_closed();
+
+  bool test_shortest_path_reduced() const;
+  void reset_shortest_path_reduced();
+  void set_shortest_path_reduced();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bit-masks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV         = 0U;
+  static const flags_t EMPTY                 = 1U << 0;
+  static const flags_t SHORTEST_PATH_CLOSED  = 1U << 1;
+  static const flags_t SHORTEST_PATH_REDUCED = 1U << 2;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bit-mask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+};
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 1941. */
+#undef PPL_IN_BD_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! A matrix indicating which constraints are redundant.
+  Bit_Matrix redundancy_dbm;
+
+  //! Returns <CODE>true</CODE> if the BDS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the BDS is known to be empty.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path closed.
+  */
+  bool marked_shortest_path_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if the system of bounded differences
+    is known to be shortest-path reduced.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that <CODE>this->dbm</CODE> is not shortest-path reduced.
+  */
+  bool marked_shortest_path_reduced() const;
+
+  //! Turns \p *this into an empty BDS.
+  void set_empty();
+
+  //! Turns \p *this into an zero-dimensional universe BDS.
+  void set_zero_dim_univ();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_closed();
+
+  //! Marks \p *this as shortest-path closed.
+  void set_shortest_path_reduced();
+
+  //! Marks \p *this as possibly not shortest-path closed.
+  void reset_shortest_path_closed();
+
+  //! Marks \p *this as possibly not shortest-path reduced.
+  void reset_shortest_path_reduced();
+
+  //! Assigns to <CODE>this->dbm</CODE> its shortest-path closure.
+  void shortest_path_closure_assign() const;
+
+  /*! \brief
+    Assigns to <CODE>this->dbm</CODE> its shortest-path closure and
+    records into <CODE>this->redundancy_dbm</CODE> which of the entries
+    in <CODE>this->dbm</CODE> are redundant.
+  */
+  void shortest_path_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if <CODE>this->dbm</CODE>
+    is shortest-path closed and <CODE>this->redundancy_dbm</CODE>
+    correctly flags the redundant entries in <CODE>this->dbm</CODE>.
+  */
+  bool is_shortest_path_reduced() const;
+
+  /*! \brief
+    Incrementally computes shortest-path closure, assuming that only
+    constraints affecting variable \p var need to be considered.
+
+    \note
+    It is assumed that \c *this, which was shortest-path closed,
+    has only been modified by adding constraints affecting variable
+    \p var. If this assumption is not satisfied, i.e., if a non-redundant
+    constraint not affecting variable \p var has been added, the behavior
+    is undefined.
+  */
+  void incremental_shortest_path_closure_assign(Variable var) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p point are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact it is assigned
+    to \p *this and \c true is returned, otherwise \c false is returned.
+
+    Current implementation is based on a variant of Algorithm 4.1 in
+      A. Bemporad, K. Fukuda, and F. D. Torrisi
+      <em>Convexity Recognition of the Union of Polyhedra</em>
+      Technical Report AUT00-13, ETH Zurich, 2000
+    tailored to the special case of BD shapes.
+
+    \note
+    It is assumed that \p *this and \p y are dimension-compatible;
+    if the assumption does not hold, the behavior is undefined.
+  */
+  bool BFT00_upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact it is assigned
+    to \p *this and \c true is returned, otherwise \c false is returned.
+
+    Implementation for the rational (resp., integer) case is based on
+    Theorem 5.2 (resp. Theorem 5.3) of \ref BHZ09b "[BHZ09b]".
+    The Boolean template parameter \c integer_upper_bound allows for
+    choosing between the rational and integer upper bound algorithms.
+
+    \note
+    It is assumed that \p *this and \p y are dimension-compatible;
+    if the assumption does not hold, the behavior is undefined.
+
+    \note
+    The integer case is only enabled if T is an integer data type.
+  */
+  template <bool integer_upper_bound>
+  bool BHZ09_upper_bound_assign_if_exact(const BD_Shape& y);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added. Non BD constraints are ignored.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be added.
+    Nontrivial proper congruences are ignored.
+    Non BD equalities are ignored.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j, const N& k);
+
+  //! Adds the constraint <CODE>dbm[i][j] \<= numer/denom</CODE>.
+  void add_dbm_constraint(dimension_type i, dimension_type j,
+                          Coefficient_traits::const_reference numer,
+                          Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    Adds to the BDS the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var, Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
+
+  //! Removes all the constraints on row/column \p v.
+  void forget_all_dbm_constraints(dimension_type v);
+  //! Removes all binary constraints on row/column \p v.
+  void forget_binary_dbm_constraints(dimension_type v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>v - u \<= c</CODE>,
+    starting from \p ub_v which is an upper bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>v - u \<= ub_v - lb_u</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the upper bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero. In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+  */
+  void deduce_v_minus_u_bounds(dimension_type v,
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_denom,
+                               const N& ub_v);
+
+  /*! \brief
+    Auxiliary function for \ref affine_form_relation "affine form image" that
+    handle the general case: \f$l = c\f$
+  */
+  template <typename Interval_Info>
+  void inhomogeneous_affine_form_image(const dimension_type& var_id,
+                                       const Interval<T, Interval_Info>& b);
+
+  /*! \brief
+    Auxiliary function for \ref affine_form_relation "affine form
+    image" that handle the general case: \f$l = ax + c\f$
+  */
+  template <typename Interval_Info>
+  void one_variable_affine_form_image
+  (const dimension_type& var_id,
+   const Interval<T, Interval_Info>& b,
+   const Interval<T, Interval_Info>& w_coeff,
+   const dimension_type& w_id,
+   const dimension_type& space_dim);
+
+  /*! \brief
+    Auxiliary function for \ref affine_form_relation "affine form image" that
+    handle the general case: \f$l = ax + by + c\f$
+  */
+  template <typename Interval_Info>
+  void two_variables_affine_form_image
+  (const dimension_type& var_id,
+   const Linear_Form<Interval<T,Interval_Info> >& lf,
+   const dimension_type& space_dim);
+
+  /*! \brief
+    Auxiliary function for refine with linear form that handle
+    the general case: \f$l = ax + c\f$
+  */
+  template <typename Interval_Info>
+  void left_inhomogeneous_refine
+  (const dimension_type& right_t,
+   const dimension_type& right_w_id,
+   const Linear_Form<Interval<T, Interval_Info> >& left,
+   const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Auxiliary function for refine with linear form that handle
+    the general case: \f$ax + b = cy + d\f$
+  */
+  template <typename Interval_Info>
+  void left_one_var_refine
+  (const dimension_type& left_w_id,
+   const dimension_type& right_t,
+   const dimension_type& right_w_id,
+   const Linear_Form<Interval<T, Interval_Info> >& left,
+   const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Auxiliary function for refine with linear form that handle
+    the general case.
+  */
+  template <typename Interval_Info>
+  void general_refine(const dimension_type& left_w_id,
+                      const dimension_type& right_w_id,
+                      const Linear_Form<Interval<T, Interval_Info> >& left,
+                      const Linear_Form<Interval<T, Interval_Info> >& right);
+
+  template <typename Interval_Info>
+  void linear_form_upper_bound(const Linear_Form<Interval<T, Interval_Info> >&
+                               lf,
+                               N& result) const;
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each dbm index \p u (less than or equal to \p last_v and different
+    from \p v), deduce constraints of the form <CODE>u - v \<= c</CODE>,
+    starting from \p minus_lb_v which is a lower bound for \p v.
+
+    The shortest-path closure is able to deduce the constraint
+    <CODE>u - v \<= ub_u - lb_v</CODE>. We can be more precise if variable
+    \p u played an active role in the computation of the lower bound for
+    \p v, i.e., if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> is greater than zero.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>u - v \<= lb_u - lb_v</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>u - v \<= (q*lb_u + (1-q)*ub_u) - lb_v</CODE>.
+  */
+  void deduce_u_minus_v_bounds(dimension_type v,
+                               dimension_type last_v,
+                               const Linear_Expression& sc_expr,
+                               Coefficient_traits::const_reference sc_denom,
+                               const N& minus_lb_v);
+
+  /*! \brief
+    Adds to \p limiting_shape the bounded differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_shape(const Constraint_System& cs,
+                          BD_Shape& limiting_shape) const;
+
+  //! Compute the (zero-equivalence classes) predecessor relation.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_predecessors(std::vector<dimension_type>& predecessor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the BDS is not empty and shortest-path closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+  void drop_some_non_integer_points_helper(N& elem);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const BD_Shape<T>& c);
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const BD_Shape& y) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+
+  template<typename Interval_Info>
+  void
+  throw_dimension_incompatible(const char* method,
+                               const char* lf_name,
+                               const Linear_Form<Interval<T, Interval_Info> >&
+                               lf) const;
+
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& le);
+
+  static void throw_invalid_argument(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+/* Automatically generated from PPL source file ../src/BDS_Status_inlines.hh line 1. */
+/* BD_Shape<T>::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+BD_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_closed() const {
+  return test_any(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_closed() {
+  // A system is reduced only if it is also closed.
+  reset(SHORTEST_PATH_CLOSED | SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_closed() {
+  set(SHORTEST_PATH_CLOSED);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::Status::test_shortest_path_reduced() const {
+  return test_any(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::reset_shortest_path_reduced() {
+  reset(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::Status::set_shortest_path_reduced() {
+  PPL_ASSERT(test_shortest_path_closed());
+  set(SHORTEST_PATH_REDUCED);
+}
+
+template <typename T>
+bool
+BD_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Shortest-path reduction implies shortest-path closure.
+  if (test_shortest_path_reduced()) {
+    if (test_shortest_path_closed())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The shortest-path reduction flag should also imply "
+                << "the closure flag."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace BD_Shapes {
+
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string sp_closed = "SPC";
+const std::string sp_reduced = "SPR";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace BD_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+void
+BD_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::BD_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ << separator
+    << (test_empty() ? yes : no) << empty << separator
+    << separator
+    << (test_shortest_path_closed() ? yes : no) << sp_closed << separator
+    << (test_shortest_path_reduced() ? yes : no) << sp_reduced << separator;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS_ASCII_ONLY(T, BD_Shape<T>::Status)
+
+template <typename T>
+bool
+BD_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::BD_Shapes;
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, sp_closed, positive))
+    return false;
+  if (positive)
+    set_shortest_path_closed();
+  else
+    reset_shortest_path_closed();
+
+  if (!get_field(s, sp_reduced, positive))
+    return false;
+  if (positive)
+    set_shortest_path_reduced();
+  else
+    reset_shortest_path_reduced();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_inlines.hh line 1. */
+/* BD_Shape class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_defs.hh line 1. */
+/* C_Polyhedron class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class C_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class NNC_Polyhedron;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_defs.hh line 33. */
+
+//! A closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class C_Polyhedron represents a
+    <EM>topologically closed</EM> convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    When building a closed polyhedron starting from
+    a system of constraints, an exception is thrown if the system
+    contains a <EM>strict inequality</EM> constraint.
+    Similarly, an exception is thrown when building a closed polyhedron
+    starting from a system of generators containing a <EM>closure point</EM>.
+
+    \note
+    Such an exception will be obtained even if the system of
+    constraints (resp., generators) actually defines
+    a topologically closed subset of the vector space, i.e.,
+    even if all the strict inequalities (resp., closure points)
+    in the system happen to be redundant with respect to the
+    system obtained by removing all the strict inequality constraints
+    (resp., all the closure points).
+    In contrast, when building a closed polyhedron starting from
+    an object of the class NNC_Polyhedron,
+    the precise topological closure test will be performed.
+*/
+
+class Parma_Polyhedra_Library::C_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty C polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the C polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty C polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe C polyhedron is built.
+  */
+  explicit C_Polyhedron(dimension_type num_dimensions = 0,
+                        Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a C polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  explicit C_Polyhedron(const Constraint_System& cs);
+
+  //! Builds a C polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of constraints contains strict inequalities.
+  */
+  C_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds a C polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  explicit C_Polyhedron(const Generator_System& gs);
+
+  //! Builds a C polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points,
+    or if it contains closure points.
+  */
+  C_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+  //! Builds a C polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.
+  */
+  explicit C_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds a C polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  C_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+  /*! \brief
+    Builds a C polyhedron representing the topological closure
+    of the NNC polyhedron \p y.
+
+    \param y
+    The NNC polyhedron to be used;
+
+    \param complexity
+    This argument is ignored.
+  */
+  explicit C_Polyhedron(const NNC_Polyhedron& y,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a box.
+  /*!
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
+    The algorithm used has polynomial complexity.
+
+    \param box
+    The box representing the polyhedron to be approximated;
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Interval>
+  explicit C_Polyhedron(const Box<Interval>& box,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BDS and is
+    the most precise that includes the BDS.
+
+    \param bd
+    The BDS used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit C_Polyhedron(const BD_Shape<U>& bd,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit C_Polyhedron(const Octagonal_Shape<U>& os,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a C polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
+
+    \param grid
+    The grid used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit C_Polyhedron(const Grid& grid,
+                        Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  C_Polyhedron(const C_Polyhedron& y,
+               Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  C_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Assigns to \p *this the topological closure of the NNC polyhedron \p y.
+  C_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Destructor.
+  ~C_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const C_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const C_Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest C polyhedron containing the
+    result of computing the
+    \ref Positive_Time_Elapse_Operator "positive time-elapse"
+    between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_inlines.hh line 1. */
+/* C_Polyhedron class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(dimension_type num_dimensions,
+                           Degenerate_Element kind)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(num_dimensions,
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(n, k)",
+                                              "n exceeds the maximum "
+                                              "allowed space dimension"),
+               kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(cs)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(cs, recycle)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(gs)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs, Recycle_Input)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(gs, recycle)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+C_Polyhedron::C_Polyhedron(const Box<Interval>& box, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(box, NECESSARILY_CLOSED,
+                                                  "C_Polyhedron(box)",
+                                                  "the space dimension of box "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(bd.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(bd)",
+                                              "the space dimension of bd "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+C_Polyhedron::C_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NECESSARILY_CLOSED,
+               check_space_dimension_overflow(os.space_dimension(),
+                                              NECESSARILY_CLOSED,
+                                              "C_Polyhedron(os)",
+                                              "the space dimension of os "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(os.constraints());
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y, Complexity_Class)
+  : Polyhedron(y) {
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const C_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline C_Polyhedron&
+C_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  C_Polyhedron c_y(y);
+  m_swap(c_y);
+  return *this;
+}
+
+inline bool
+C_Polyhedron::upper_bound_assign_if_exact(const C_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/C_Polyhedron_defs.hh line 290. */
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 1. */
+/* Octagonal_Shape class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_defs.hh line 1. */
+/* OR_Matrix class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class OR_Matrix;
+
+}
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_defs.hh line 31. */
+#include <cstddef>
+#include <iosfwd>
+
+#ifndef PPL_OR_MATRIX_EXTRA_DEBUG
+#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  When PPL_OR_MATRIX_EXTRA_DEBUG evaluates to <CODE>true</CODE>, each
+  instance of the class OR_Matrix::Pseudo_Row carries its own size;
+  this enables extra consistency checks to be performed.
+  \ingroup PPL_CXX_interface
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 1
+#else // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#define PPL_OR_MATRIX_EXTRA_DEBUG 0
+#endif // !defined(PPL_ABI_BREAKING_EXTRA_DEBUG)
+#endif // !defined(PPL_OR_MATRIX_EXTRA_DEBUG)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are identical.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const OR_Matrix<T>& m);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A matrix representing octagonal constraints.
+/*!
+  An OR_Matrix object is a DB_Row object that allows
+  the representation of a \em pseudo-triangular matrix,
+  like the following:
+
+<PRE>
+         _ _
+   0    |_|_|
+   1    |_|_|_ _
+   2    |_|_|_|_|
+   3    |_|_|_|_|_ _
+   4    |_|_|_|_|_|_|
+   5    |_|_|_|_|_|_|
+         . . .
+         _ _ _ _ _ _       _
+ 2n-2   |_|_|_|_|_|_| ... |_|
+ 2n-1   |_|_|_|_|_|_| ... |_|
+         0 1 2 3 4 5  ... 2n-1
+
+</PRE>
+
+  It is characterized by parameter n that defines the structure,
+  and such that there are 2*n rows (and 2*n columns).
+  It provides row_iterators for the access to the rows
+  and element_iterators for the access to the elements.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+
+template <typename T>
+class Parma_Polyhedra_Library::OR_Matrix {
+private:
+  /*! \brief
+    An object that behaves like a matrix's row with respect to
+    the subscript operators.
+  */
+  template <typename U>
+  class Pseudo_Row {
+  public:
+    /*! \brief
+      Copy constructor allowing the construction of a const pseudo-row
+      from a non-const pseudo-row.
+      Ordinary copy constructor.
+    */
+    template <typename V>
+    Pseudo_Row(const Pseudo_Row<V>& y);
+
+    //! Destructor.
+    ~Pseudo_Row();
+
+    //! Subscript operator.
+    U& operator[](dimension_type k) const;
+
+    //! Default constructor: creates an invalid object that has to be assigned.
+    Pseudo_Row();
+
+    //! Assignment operator.
+    Pseudo_Row& operator=(const Pseudo_Row& y);
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+  private:
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  public:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Private constructor for a Pseudo_Row with size \p s beginning at \p y.
+    Pseudo_Row(U& y, dimension_type s);
+
+#else // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Private constructor for a Pseudo_Row beginning at \p y.
+    explicit Pseudo_Row(U& y);
+
+#endif // !PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! Holds a reference to the beginning of this row.
+    U* first;
+
+#if !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)
+#else
+  // Work around a bug of GCC 4.0.x (and, likely, previous versions).
+  private:
+#endif
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+    //! The size of the row.
+    dimension_type size_;
+
+    //! Returns the size of the row.
+    dimension_type size() const;
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+    // FIXME: the EDG-based compilers (such as Comeau and Intel)
+    // are here in wild disagreement with GCC: what is a legal friend
+    // declaration for one, is illegal for the others.
+#ifdef __EDG__
+    template <typename V> template<typename W>
+    friend class OR_Matrix<V>::Pseudo_Row;
+    template <typename V> template<typename W>
+    friend class OR_Matrix<V>::any_row_iterator;
+#else
+    template <typename V> friend class Pseudo_Row;
+    template <typename V> friend class any_row_iterator;
+#endif
+
+    friend class OR_Matrix;
+  }; // class Pseudo_Row
+
+public:
+  //! A (non const) reference to a matrix's row.
+  typedef Pseudo_Row<T> row_reference_type;
+
+  //! A const reference to a matrix's row.
+  typedef Pseudo_Row<const T> const_row_reference_type;
+
+private:
+  /*! \brief
+    A template class to derive both OR_Matrix::iterator
+    and OR_Matrix::const_iterator.
+  */
+  template <typename U>
+  class any_row_iterator {
+  public:
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Pseudo_Row<U> value_type;
+    typedef long difference_type;
+    typedef const Pseudo_Row<U>* pointer;
+    typedef const Pseudo_Row<U>& reference;
+
+    //! Constructor to build past-the-end objects.
+    any_row_iterator(dimension_type n_rows);
+
+    /*! \brief
+      Builds an iterator pointing at the beginning of an OR_Matrix whose
+      first element is \p base;
+    */
+    explicit any_row_iterator(U& base);
+
+    /*! \brief
+      Copy constructor allowing the construction of a const_iterator
+      from a non-const iterator.
+    */
+    template <typename V>
+    any_row_iterator(const any_row_iterator<V>& y);
+
+    /*! \brief
+      Assignment operator allowing the assignment of a non-const iterator
+      to a const_iterator.
+    */
+    template <typename V>
+    any_row_iterator& operator=(const any_row_iterator<V>& y);
+
+    //! Dereference operator.
+    reference operator*() const;
+
+    //! Indirect member selector.
+    pointer operator->() const;
+
+    //! Prefix increment operator.
+    any_row_iterator& operator++();
+
+    //! Postfix increment operator.
+    any_row_iterator operator++(int);
+
+    //! Prefix decrement operator.
+    any_row_iterator& operator--();
+
+    //! Postfix decrement operator.
+    any_row_iterator operator--(int);
+
+    //! Subscript operator.
+    reference operator[](difference_type m) const;
+
+    //! Assignment-increment operator.
+    any_row_iterator& operator+=(difference_type m);
+
+    //! Assignment-increment operator for \p m of unsigned type.
+    template <typename Unsigned>
+    typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator&>::type
+    operator+=(Unsigned m);
+
+    //! Assignment-decrement operator.
+    any_row_iterator& operator-=(difference_type m);
+
+    //! Returns the difference between \p *this and \p y.
+    difference_type operator-(const any_row_iterator& y) const;
+
+    //! Returns the sum of \p *this and \p m.
+    any_row_iterator operator+(difference_type m) const;
+
+    //! Returns the sum of \p *this and \p m, for \p m of unsigned type.
+    template <typename Unsigned>
+    typename Enable_If<(static_cast<Unsigned>(-1) > 0), any_row_iterator>::type
+    operator+(Unsigned m) const;
+
+    //! Returns the difference of \p *this and \p m.
+    any_row_iterator operator-(difference_type m) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is equal to \p y.
+    bool operator==(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this
+      is different from \p y.
+    */
+    bool operator!=(const any_row_iterator& y) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is less than \p y.
+    bool operator<(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is less than
+      or equal to \p y.
+    */
+    bool operator<=(const any_row_iterator& y) const;
+
+    //! Returns <CODE>true</CODE> if and only if \p *this is greater than \p y.
+    bool operator>(const any_row_iterator& y) const;
+
+    /*! \brief
+      Returns <CODE>true</CODE> if and only if \p *this is greater than
+      or equal to \p y.
+    */
+    bool operator>=(const any_row_iterator& y) const;
+
+    dimension_type row_size() const;
+
+    dimension_type index() const;
+
+  private:
+    //! Represents the beginning of a row.
+    Pseudo_Row<U> value;
+
+    //! External index.
+    dimension_type e;
+
+    //! Internal index: <CODE>i = (e+1)*(e+1)/2</CODE>.
+    dimension_type i;
+
+    // FIXME: the EDG-based compilers (such as Comeau and Intel)
+    // are here in wild disagreement with GCC: what is a legal friend
+    // declaration for one, is illegal for the others.
+#ifdef __EDG__
+    template <typename V> template<typename W>
+    friend class OR_Matrix<V>::any_row_iterator;
+#else
+    template <typename V> friend class any_row_iterator;
+#endif
+  }; // class any_row_iterator
+
+public:
+  //! A (non const) row iterator.
+  typedef any_row_iterator<T> row_iterator;
+
+  //! A const row iterator.
+  typedef any_row_iterator<const T> const_row_iterator;
+
+  //! A (non const) element iterator.
+  typedef typename DB_Row<T>::iterator element_iterator;
+
+  //! A const element iterator.
+  typedef typename DB_Row<T>::const_iterator const_element_iterator;
+
+public:
+  //! Returns the maximum number of rows of a OR_Matrix.
+  static dimension_type max_num_rows();
+
+  //! Builds a matrix with specified dimensions.
+  /*!
+    \param num_dimensions
+    The space dimension of the matrix that will be created.
+
+    This constructor creates a matrix with \p 2*num_dimensions rows.
+    Each element is initialized to plus infinity.
+  */
+  OR_Matrix(dimension_type num_dimensions);
+
+  //! Copy constructor.
+  OR_Matrix(const OR_Matrix& y);
+
+  //! Constructs a conservative approximation of \p y.
+  template <typename U>
+  explicit OR_Matrix(const OR_Matrix<U>& y);
+
+  //! Destructor.
+  ~OR_Matrix();
+
+  //! Assignment operator.
+  OR_Matrix& operator=(const OR_Matrix& y);
+
+private:
+  template <typename U> friend class OR_Matrix;
+
+  //! Contains the rows of the matrix.
+  /*!
+    A DB_Row which contains the rows of the OR_Matrix
+    inserting each successive row to the end of the vec.
+    To contain all the elements of OR_Matrix the size of the DB_Row
+    is 2*n*(n+1), where the n is the characteristic parameter of
+    OR_Matrix.
+  */
+  DB_Row<T> vec;
+
+  //! Contains the dimension of the space of the matrix.
+  dimension_type space_dim;
+
+  //! Contains the capacity of \p vec.
+  dimension_type vec_capacity;
+
+  //! Private and not implemented: default construction is not allowed.
+  OR_Matrix();
+
+  /*! \brief
+    Returns the index into <CODE>vec</CODE> of the first element
+    of the row of index \p k.
+  */
+  static dimension_type row_first_element_index(dimension_type k);
+
+public:
+  //! Returns the size of the row of index \p k.
+  static dimension_type row_size(dimension_type k);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(OR_Matrix& y);
+
+  //! Makes the matrix grow by adding more space dimensions.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Adds new rows of right dimension to the end if
+    there is enough capacity; otherwise, creates a new matrix,
+    with the specified dimension, copying the old elements
+    in the upper part of the new matrix, which is
+    then assigned to \p *this.
+    Each new element is initialized to plus infinity.
+  */
+  void grow(dimension_type new_dim);
+
+  //! Makes the matrix shrink by removing the last space dimensions.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    Erases from matrix to the end the rows with index
+    greater than 2*new_dim-1.
+  */
+  void shrink(dimension_type new_dim);
+
+  //! Resizes the matrix without worrying about the old contents.
+  /*!
+    \param new_dim
+    The new dimension of the resized matrix.
+
+    If the new dimension is greater than the old one, it adds new rows
+    of right dimension to the end if there is enough capacity; otherwise,
+    it creates a new matrix, with the specified dimension, which is
+    then assigned to \p *this.
+    If the new dimension is less than the old one, it erase from the matrix
+    the rows having index greater than 2*new_dim-1
+  */
+  void resize_no_copy(dimension_type new_dim);
+
+  //! Returns the space-dimension of the matrix.
+  dimension_type space_dimension() const;
+
+  //! Returns the number of rows in the matrix.
+  dimension_type num_rows() const;
+
+  //! \name Subscript operators.
+  //@{
+  //! Returns a reference to the \p k-th row of the matrix.
+  row_reference_type operator[](dimension_type k);
+
+  //! Returns a constant reference to the \p k-th row of the matrix.
+  const_row_reference_type operator[](dimension_type k) const;
+  //@}
+
+
+  /*! \brief
+    Returns an iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  row_iterator row_begin();
+
+  //! Returns the past-the-end const_iterator.
+  row_iterator row_end();
+
+  /*! \brief
+    Returns a const row iterator pointing to the first row,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_row_iterator row_begin() const;
+
+  //! Returns the past-the-end const row iterator.
+  const_row_iterator row_end() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  element_iterator element_begin();
+
+  //! Returns the past-the-end const_iterator.
+  element_iterator element_end();
+
+  /*! \brief
+    Returns a const element iterator pointing to the first element,
+    if \p *this is not empty;
+    otherwise, returns the past-the-end const_iterator.
+  */
+  const_element_iterator element_begin() const;
+
+  //! Returns the past-the-end const element iterator.
+  const_element_iterator element_end() const;
+
+  //! Clears the matrix deallocating all its rows.
+  void clear();
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  friend bool operator==<T>(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Swaps \p x with \p y.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+void swap(OR_Matrix<T>& x, OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+bool operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const OR_Matrix<T>& x,
+                                 const OR_Matrix<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the Euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const OR_Matrix<T>& x,
+                               const OR_Matrix<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates OR_Matrix
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into to \p r
+  and returns <CODE>true</CODE>;  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const OR_Matrix<T>& x,
+                                 const OR_Matrix<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_inlines.hh line 1. */
+/* OR_Matrix class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_inlines.hh line 33. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_first_element_index(const dimension_type k) {
+  return ((k + 1)*(k + 1))/2;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::row_size(const dimension_type k) {
+  return k + 2 - k % 2;
+}
+
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::Pseudo_Row<U>::size() const {
+  return size_;
+}
+
+#endif // PPL_OR_MATRIX_EXTRA_DEBUG
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row()
+  : first(0)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(0)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(U& y
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+                , dimension_type s
+#endif
+                )
+  : first(&y)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  , size_(s)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::Pseudo_Row(const Pseudo_Row<V>& y)
+  : first(y.first)
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    , size_(y.size_)
+#endif
+{
+}
+
+template <typename T>
+template <typename U>
+inline OR_Matrix<T>::Pseudo_Row<U>&
+OR_Matrix<T>::Pseudo_Row<U>::operator=(const Pseudo_Row& y) {
+  first = y.first;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  size_ = y.size_;
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::Pseudo_Row<U>::~Pseudo_Row() {
+}
+
+template <typename T>
+template <typename U>
+inline U&
+OR_Matrix<T>::Pseudo_Row<U>::operator[](const dimension_type k) const {
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  PPL_ASSERT(k < size_);
+#endif
+  return *(first + k);
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const dimension_type n_rows)
+  : value(),
+    e(n_rows)
+    // Field `i' is intentionally not initialized here.
+{
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  // Turn `value' into a valid object.
+  value.size_ = OR_Matrix::row_size(e);
+#endif
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::any_row_iterator<U>::any_row_iterator(U& base)
+  :  value(base
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+           , OR_Matrix<T>::row_size(0)
+#endif
+           ),
+     e(0),
+     i(0) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline
+OR_Matrix<T>::any_row_iterator<U>
+::any_row_iterator(const any_row_iterator<V>& y)
+  : value(y.value),
+    e(y.e),
+    i(y.i) {
+}
+
+template <typename T>
+template <typename U>
+template <typename V>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator=(const any_row_iterator<V>& y) {
+  value = y.value;
+  e = y.e;
+  i = y.i;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::reference
+OR_Matrix<T>::any_row_iterator<U>::operator*() const {
+  return value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::pointer
+OR_Matrix<T>::any_row_iterator<U>::operator->() const {
+  return &value;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator++() {
+  ++e;
+  dimension_type increment = e;
+  if (e % 2 != 0)
+    ++increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  else {
+    value.size_ += 2;
+  }
+#endif
+  i += increment;
+  value.first += increment;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator++(int) {
+  any_row_iterator old = *this;
+  ++(*this);
+  return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator--() {
+  dimension_type decrement = e + 1;
+  --e;
+  if (e % 2 != 0) {
+    ++decrement;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+    value.size_ -= 2;
+#endif
+  }
+  i -= decrement;
+  value.first -= decrement;
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator--(int) {
+  any_row_iterator old = *this;
+  --(*this);
+  return old;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator+=(const difference_type m) {
+  difference_type e_dt = static_cast<difference_type>(e);
+  difference_type i_dt = static_cast<difference_type>(i);
+  difference_type increment = m + (m * m) / 2 + m * e_dt;
+  if (e_dt % 2 == 0 && m % 2 != 0)
+    ++increment;
+  e_dt += m;
+  i_dt += increment;
+  e = static_cast<dimension_type>(e_dt);
+  i = static_cast<dimension_type>(i_dt);
+  value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  difference_type value_size_dt = static_cast<difference_type>(value.size_);
+  value_size_dt += (m - m % 2);
+  value.size_ = static_cast<dimension_type>(value_size_dt);
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+            typename OR_Matrix<T>::template any_row_iterator<U>& >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+=(Unsigned m) {
+  dimension_type n = m;
+  dimension_type increment = n + (n*n)/2 + n*e;
+  if (e % 2 == 0 && n % 2 != 0)
+    ++increment;
+  e += n;
+  i += increment;
+  value.first += increment;
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+  value.size_ = value.size_ + n - n % 2;
+#endif
+  return *this;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>&
+OR_Matrix<T>::any_row_iterator<U>::operator-=(difference_type m) {
+  return *this += -m;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>::difference_type
+OR_Matrix<T>::any_row_iterator<U>::operator-(const any_row_iterator& y) const {
+  return e - y.e;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator+(difference_type m) const {
+  any_row_iterator r = *this;
+  r += m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+template <typename Unsigned>
+inline typename
+Enable_If<(static_cast<Unsigned>(-1) > 0),
+            typename OR_Matrix<T>::template any_row_iterator<U> >::type
+OR_Matrix<T>::any_row_iterator<U>::operator+(Unsigned m) const {
+  any_row_iterator r = *this;
+  r += m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+inline typename OR_Matrix<T>::template any_row_iterator<U>
+OR_Matrix<T>::any_row_iterator<U>::operator-(const difference_type m) const {
+  any_row_iterator r = *this;
+  r -= m;
+  return r;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator==(const any_row_iterator& y) const {
+  return e == y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator!=(const any_row_iterator& y) const {
+  return e != y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator<(const any_row_iterator& y) const {
+  return e < y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator<=(const any_row_iterator& y) const {
+  return e <= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>::operator>(const any_row_iterator& y) const {
+  return e > y.e;
+}
+
+template <typename T>
+template <typename U>
+inline bool
+OR_Matrix<T>::any_row_iterator<U>
+::operator>=(const any_row_iterator& y) const {
+  return e >= y.e;
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::row_size() const {
+  return OR_Matrix::row_size(e);
+}
+
+template <typename T>
+template <typename U>
+inline dimension_type
+OR_Matrix<T>::any_row_iterator<U>::index() const {
+  return e;
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_begin() {
+  return num_rows() == 0 ? row_iterator(0) : row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_iterator
+OR_Matrix<T>::row_end() {
+  return row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_begin() const {
+  return num_rows() == 0 ? const_row_iterator(0) : const_row_iterator(vec[0]);
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_iterator
+OR_Matrix<T>::row_end() const {
+  return const_row_iterator(num_rows());
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_begin() {
+  return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::element_iterator
+OR_Matrix<T>::element_end() {
+  return vec.end();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_begin() const {
+  return vec.begin();
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_element_iterator
+OR_Matrix<T>::element_end() const {
+  return vec.end();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::m_swap(OR_Matrix& y) {
+  using std::swap;
+  swap(vec, y.vec);
+  swap(space_dim, y.space_dim);
+  swap(vec_capacity, y.vec_capacity);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the integer square root of \p x.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+isqrt(dimension_type x) {
+  dimension_type r = 0;
+  const dimension_type FIRST_BIT_MASK = 0x40000000U;
+  for (dimension_type t = FIRST_BIT_MASK; t != 0; t >>= 2) {
+    const dimension_type s = r + t;
+    if (s <= x) {
+      x -= s;
+      r = s + t;
+    }
+    r >>= 1;
+  }
+  return r;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::max_num_rows() {
+  // Compute the maximum number of rows that are contained in a DB_Row
+  // that allocates a pseudo-triangular matrix.
+  const dimension_type k = isqrt(2*DB_Row<T>::max_size() + 1);
+  return (k - 1) - (k - 1) % 2;
+}
+
+template <typename T>
+inline memory_size_type
+OR_Matrix<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const dimension_type num_dimensions)
+  : vec(2*num_dimensions*(num_dimensions + 1)),
+    space_dim(num_dimensions),
+    vec_capacity(vec.size()) {
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::~OR_Matrix() {
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) {
+  return row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+                            , row_size(k)
+#endif
+                            );
+}
+
+template <typename T>
+inline typename OR_Matrix<T>::const_row_reference_type
+OR_Matrix<T>::operator[](dimension_type k) const {
+  return const_row_reference_type(vec[row_first_element_index(k)]
+#if PPL_OR_MATRIX_EXTRA_DEBUG
+                                  , row_size(k)
+#endif
+                                  );
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename T>
+inline dimension_type
+OR_Matrix<T>::num_rows() const {
+  return 2*space_dimension();
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::clear() {
+  OR_Matrix<T>(0).m_swap(*this);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator==(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return x.space_dim == y.space_dim && x.vec == y.vec;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+inline bool
+operator!=(const OR_Matrix<T>& x, const OR_Matrix<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix& y)
+  : vec(y.vec),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size(),
+                                  DB_Row<T>::max_size())) {
+}
+
+template <typename T>
+template <typename U>
+inline
+OR_Matrix<T>::OR_Matrix(const OR_Matrix<U>& y)
+  : vec(),
+    space_dim(y.space_dim),
+    vec_capacity(compute_capacity(y.vec.size(),
+                                  DB_Row<T>::max_size())) {
+  vec.construct_upward_approximation(y.vec, vec_capacity);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline OR_Matrix<T>&
+OR_Matrix<T>::operator=(const OR_Matrix& y) {
+  vec = y.vec;
+  space_dim = y.space_dim;
+  vec_capacity = compute_capacity(y.vec.size(), DB_Row<T>::max_size());
+  return *this;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::grow(const dimension_type new_dim) {
+  PPL_ASSERT(new_dim >= space_dim);
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      element_iterator j = new_matrix.element_begin();
+      for (element_iterator i = element_begin(),
+             mend = element_end(); i != mend; ++i, ++j)
+        assign_or_swap(*j, *i);
+      m_swap(new_matrix);
+    }
+  }
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::shrink(const dimension_type new_dim) {
+  PPL_ASSERT(new_dim <= space_dim);
+  const dimension_type new_size = 2*new_dim*(new_dim + 1);
+  vec.shrink(new_size);
+  space_dim = new_dim;
+}
+
+template <typename T>
+inline void
+OR_Matrix<T>::resize_no_copy(const dimension_type new_dim) {
+  if (new_dim > space_dim) {
+    const dimension_type new_size = 2*new_dim*(new_dim + 1);
+    if (new_size <= vec_capacity) {
+      // We can recycle the old vec.
+      vec.expand_within_capacity(new_size);
+      space_dim = new_dim;
+    }
+    else {
+      // We cannot recycle the old vec.
+      OR_Matrix<T> new_matrix(new_dim);
+      m_swap(new_matrix);
+    }
+  }
+  else if (new_dim < space_dim)
+    shrink(new_dim);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization, typename Temp, typename To, typename T>
+inline bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const OR_Matrix<T>& x,
+                    const OR_Matrix<T>& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0,
+                    Temp& tmp1,
+                    Temp& tmp2) {
+  if (x.num_rows() != y.num_rows())
+    return false;
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (typename OR_Matrix<T>::const_element_iterator
+         i = x.element_begin(), j = y.element_begin(),
+         mat_end = x.element_end(); i != mat_end; ++i, ++j) {
+    const T& x_i = *i;
+    const T& y_i = *j;
+    if (is_plus_infinity(x_i)) {
+      if (is_plus_infinity(y_i))
+        continue;
+      else {
+      pinf:
+        assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+        return true;
+      }
+    }
+    else if (is_plus_infinity(y_i))
+      goto pinf;
+
+    const Temp* tmp1p;
+    const Temp* tmp2p;
+    if (x_i > y_i) {
+      maybe_assign(tmp1p, tmp1, x_i, dir);
+      maybe_assign(tmp2p, tmp2, y_i, inverse(dir));
+    }
+    else {
+      maybe_assign(tmp1p, tmp1, y_i, dir);
+      maybe_assign(tmp2p, tmp2, x_i, inverse(dir));
+    }
+    sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+    PPL_ASSERT(sgn(tmp1) >= 0);
+    Specialization::combine(tmp0, tmp1, dir);
+  }
+
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const OR_Matrix<T>& x,
+                            const OR_Matrix<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  return
+    l_m_distance_assign<Rectilinear_Distance_Specialization<Temp> >(r, x, y,
+                                                                    dir,
+                                                                    tmp0,
+                                                                    tmp1,
+                                                                    tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const OR_Matrix<T>& x,
+                          const OR_Matrix<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  return
+    l_m_distance_assign<Euclidean_Distance_Specialization<Temp> >(r, x, y,
+                                                                  dir,
+                                                                  tmp0,
+                                                                  tmp1,
+                                                                  tmp2);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const OR_Matrix<T>& x,
+                           const OR_Matrix<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  return
+    l_m_distance_assign<L_Infinity_Distance_Specialization<Temp> >(r, x, y,
+                                                                   dir,
+                                                                   tmp0,
+                                                                   tmp1,
+                                                                   tmp2);
+}
+
+/*! \relates OR_Matrix */
+template <typename T>
+inline void
+swap(OR_Matrix<T>& x, OR_Matrix<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_templates.hh line 1. */
+/* OR_Matrix class implementation: non-inline template functions.
+*/
+
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+memory_size_type
+OR_Matrix<T>::external_memory_in_bytes() const{
+  return vec.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+OR_Matrix<T>::OK() const {
+#ifndef NDEBUG
+  using std::endl;
+  using std::cerr;
+#endif
+  // The right number of cells should be in use.
+  const dimension_type dim = space_dimension();
+  if (vec.size() != 2*dim*(dim + 1)) {
+#ifndef NDEBUG
+    cerr << "OR_Matrix has a wrong number of cells:\n"
+         << "vec.size() is " << vec.size()
+         << ", expected size is " << (2*dim*(dim+1)) << "!\n";
+#endif
+    return false;
+  }
+
+  // The underlying DB_Row should be OK.
+  if (!vec.OK(vec.size(), vec_capacity))
+    return false;
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+OR_Matrix<T>::ascii_dump(std::ostream& s) const {
+  const OR_Matrix<T>& x = *this;
+  const char separator = ' ';
+  dimension_type space = x.space_dimension();
+  s << space << separator << "\n";
+  for (const_row_iterator i = x.row_begin(),
+         x_row_end = x.row_end(); i != x_row_end; ++i) {
+    const_row_reference_type r = *i;
+    dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      using namespace IO_Operators;
+      s << r[j] << separator;
+    }
+    s << "\n";
+  }
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, OR_Matrix<T>)
+
+template <typename T>
+bool
+OR_Matrix<T>::ascii_load(std::istream& s) {
+  dimension_type space;
+  if (!(s >> space))
+    return false;
+  resize_no_copy(space);
+  for (row_iterator i = row_begin(),
+         this_row_end = row_end(); i != this_row_end; ++i) {
+    row_reference_type r_i = *i;
+    const dimension_type rs = i.row_size();
+    for (dimension_type j = 0; j < rs; ++j) {
+      Result r = input(r_i[j], s, ROUND_CHECK);
+      if (result_relation(r) != VR_EQ || is_minus_infinity(r_i[j]))
+        return false;
+    }
+  }
+  PPL_ASSERT(OK());
+  return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::OR_Matrix */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const OR_Matrix<T>& m) {
+  for (typename OR_Matrix<T>::const_row_iterator m_iter = m.row_begin(),
+         m_end = m.row_end(); m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<T>::const_row_reference_type r_m = *m_iter;
+    const dimension_type mr_size = m_iter.row_size();
+    for (dimension_type j = 0; j < mr_size; ++j)
+      s << r_m[j] << " ";
+    s << "\n";
+  }
+  return s;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/OR_Matrix_defs.hh line 609. */
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 50. */
+#include <vector>
+#include <cstddef>
+#include <climits>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape
+  Writes a textual representation of \p oct on \p s:
+  <CODE>false</CODE> is written if \p oct is an empty polyhedron;
+  <CODE>true</CODE> is written if \p oct is a universe polyhedron;
+  a system of constraints defining \p oct is written otherwise,
+  all constraints separated by ", ".
+*/
+template <typename T>
+std::ostream&
+operator<<(std::ostream& s, const Octagonal_Shape<T>& oct);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Octagonal_Shape */
+template <typename T>
+void swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same octagon.
+
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>false</CODE> is returned.
+*/
+template <typename T>
+bool operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different shapes.
+
+  \relates Octagonal_Shape
+  Note that \p x and \p y may be dimension-incompatible shapes:
+  in this case, the value <CODE>true</CODE> is returned.
+*/
+template <typename T>
+bool operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir);
+
+//! Computes the rectilinear (or Manhattan) distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the rectilinear distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                 const Octagonal_Shape<T>& x,
+                                 const Octagonal_Shape<T>& y,
+                                 Rounding_Dir dir,
+                                 Temp& tmp0,
+                                 Temp& tmp1,
+                                 Temp& tmp2);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir);
+
+//! Computes the euclidean distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the euclidean distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                               const Octagonal_Shape<T>& x,
+                               const Octagonal_Shape<T>& y,
+                               Rounding_Dir dir,
+                               Temp& tmp0,
+                               Temp& tmp1,
+                               Temp& tmp2);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<To, Extended_Number_Policy\></CODE>.
+*/
+template <typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using variables of type
+  <CODE>Checked_Number\<Temp, Extended_Number_Policy\></CODE>.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir);
+
+//! Computes the \f$L_\infty\f$ distance between \p x and \p y.
+/*! \relates Octagonal_Shape
+  If the \f$L_\infty\f$ distance between \p x and \p y is defined,
+  stores an approximation of it into \p r and returns <CODE>true</CODE>;
+  returns <CODE>false</CODE> otherwise.
+
+  The direction of the approximation is specified by \p dir.
+
+  All computations are performed using the temporary variables
+  \p tmp0, \p tmp1 and \p tmp2.
+*/
+template <typename Temp, typename To, typename T>
+bool l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                                const Octagonal_Shape<T>& x,
+                                const Octagonal_Shape<T>& y,
+                                Rounding_Dir dir,
+                                Temp& tmp0,
+                                Temp& tmp1,
+                                Temp& tmp2);
+
+// This class contains some helper functions that need to be friends of
+// Linear_Expression.
+class Octagonal_Shape_Helper {
+public:
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Decodes the constraint \p c as an octagonal difference.
+  /*! \relates Octagonal_Shape
+    \return
+    <CODE>true</CODE> if the constraint \p c is an octagonal difference;
+    <CODE>false</CODE> otherwise.
+
+    \param c
+    The constraint to be decoded.
+
+    \param c_space_dim
+    The space dimension of the constraint \p c (it is <EM>assumed</EM>
+    to match the actual space dimension of \p c).
+
+    \param c_num_vars
+    If <CODE>true</CODE> is returned, then it will be set to the number
+    of variables having a non-zero coefficient. The only legal values
+    will therefore be 0, 1 and 2.
+
+    \param c_first_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the index of the first variable having
+    a non-zero coefficient in \p c.
+
+    \param c_second_var
+    If <CODE>true</CODE> is returned and if \p c_num_vars is set to 2,
+    then it will be set to the index of the second variable having
+    a non-zero coefficient in \p c.
+
+    \param c_coeff
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the value of the first non-zero coefficient
+    in \p c.
+
+    \param c_term
+    If <CODE>true</CODE> is returned and if \p c_num_vars is not set to 0,
+    then it will be set to the right value of the inhomogeneous term
+    of \p c.
+  */
+  #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  static bool extract_octagonal_difference(const Constraint& c,
+                                           dimension_type c_space_dim,
+                                           dimension_type& c_num_vars,
+                                           dimension_type& c_first_var,
+                                           dimension_type& c_second_var,
+                                           Coefficient& c_coeff,
+                                           Coefficient& c_term);
+};
+
+} // namespace Parma_Polyhedra_Library
+
+//! An octagonal shape.
+/*! \ingroup PPL_CXX_interface
+  The class template Octagonal_Shape<T> allows for the efficient
+  representation of a restricted kind of <EM>topologically closed</EM>
+  convex polyhedra called <EM>octagonal shapes</EM> (OSs, for short).
+  The name comes from the fact that, in a vector space of dimension 2,
+  bounded OSs are polygons with at most eight sides.
+  The closed affine half-spaces that characterize the OS can be expressed
+  by constraints of the form
+  \f[
+    ax_i + bx_j \leq k
+  \f]
+  where \f$a, b \in \{-1, 0, 1\}\f$ and \f$k\f$ is a rational number,
+  which are called <EM>octagonal constraints</EM>.
+
+  Based on the class template type parameter \p T, a family of extended
+  numbers is built and used to approximate the inhomogeneous term of
+  octagonal constraints. These extended numbers provide a representation
+  for the value \f$+\infty\f$, as well as <EM>rounding-aware</EM>
+  implementations for several arithmetic functions.
+  The value of the type parameter \p T may be one of the following:
+    - a bounded precision integer type (e.g., \c int32_t or \c int64_t);
+    - a bounded precision floating point type (e.g., \c float or \c double);
+    - an unbounded integer or rational type, as provided by GMP
+      (i.e., \c mpz_class or \c mpq_class).
+
+  The user interface for OSs is meant to be as similar as possible to
+  the one developed for the polyhedron class C_Polyhedron.
+
+  The OS domain <EM>optimally supports</EM>:
+    - tautological and inconsistent constraints and congruences;
+    - octagonal constraints;
+    - non-proper congruences (i.e., equalities) that are expressible
+      as octagonal constraints.
+
+  Depending on the method, using a constraint or congruence that is not
+  optimally supported by the domain will either raise an exception or
+  result in a (possibly non-optimal) upward approximation.
+
+  A constraint is octagonal if it has the form
+    \f[
+      \pm a_i x_i \pm a_j x_j \relsym b
+    \f]
+  where \f$\mathord{\relsym} \in \{ \leq, =, \geq \}\f$ and
+  \f$a_i\f$, \f$a_j\f$, \f$b\f$ are integer coefficients such that
+  \f$a_i = 0\f$, or \f$a_j = 0\f$, or \f$a_i = a_j\f$.
+  The user is warned that the above octagonal Constraint object
+  will be mapped into a \e correct and \e optimal approximation that,
+  depending on the expressive power of the chosen template argument \p T,
+  may loose some precision.
+  Also note that strict constraints are not octagonal.
+
+  For instance, a Constraint object encoding \f$3x + 3y \leq 1\f$ will be
+  approximated by:
+    - \f$x + y \leq 1\f$,
+      if \p T is a (bounded or unbounded) integer type;
+    - \f$x + y \leq \frac{1}{3}\f$,
+      if \p T is the unbounded rational type \c mpq_class;
+    - \f$x + y \leq k\f$, where \f$k > \frac{1}{3}\f$,
+      if \p T is a floating point type (having no exact representation
+      for \f$\frac{1}{3}\f$).
+
+  On the other hand, depending from the context, a Constraint object
+  encoding \f$3x - y \leq 1\f$ will be either upward approximated
+  (e.g., by safely ignoring it) or it will cause an exception.
+
+  In the following examples it is assumed that the type argument \p T
+  is one of the possible instances listed above and that variables
+  \c x, \c y and \c z are defined (where they are used) as follows:
+  \code
+    Variable x(0);
+    Variable y(1);
+    Variable z(2);
+  \endcode
+
+  \par Example 1
+  The following code builds an OS corresponding to a cube in \f$\Rset^3\f$,
+  given as a system of constraints:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+  In contrast, the following code will raise an exception,
+  since constraints 7, 8, and 9 are not octagonal:
+  \code
+    Constraint_System cs;
+    cs.insert(x >= 0);
+    cs.insert(x <= 3);
+    cs.insert(y >= 0);
+    cs.insert(y <= 3);
+    cs.insert(z >= 0);
+    cs.insert(z <= 3);
+    cs.insert(x - 3*y <= 5);    // (7)
+    cs.insert(x - y + z <= 5);  // (8)
+    cs.insert(x + y + z <= 5);  // (9)
+    Octagonal_Shape<T> oct(cs);
+  \endcode
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Octagonal_Shape {
+private:
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of
+    the inequalities defining an OS.
+  */
+#ifndef NDEBUG
+  typedef Checked_Number<T, Debug_WRD_Extended_Number_Policy> N;
+#else
+  typedef Checked_Number<T, WRD_Extended_Number_Policy> N;
+#endif
+
+public:
+
+  //! The numeric base type upon which OSs are built.
+  typedef T coefficient_type_base;
+
+  /*! \brief
+    The (extended) numeric type of the inhomogeneous term of the
+    inequalities defining an OS.
+  */
+  typedef N coefficient_type;
+
+  //! Returns the maximum space dimension that an OS can handle.
+  static dimension_type max_space_dimension();
+
+  /*! \brief
+    Returns false indicating that this domain cannot recycle constraints
+  */
+  static bool can_recycle_constraint_systems();
+
+  /*! \brief
+    Returns false indicating that this domain cannot recycle congruences
+  */
+  static bool can_recycle_congruence_systems();
+
+  //! \name Constructors, Assignment, Swap and Destructor
+  //@{
+
+  //! Builds an universe or empty OS of the specified space dimension.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the OS;
+
+    \param kind
+    Specifies whether the universe or the empty OS has to be built.
+  */
+  explicit Octagonal_Shape(dimension_type num_dimensions = 0,
+                           Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Octagonal_Shape(const Octagonal_Shape& y,
+                  Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const Octagonal_Shape<U>& y,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS from the system of constraints \p cs.
+  /*!
+    The OS inherits the space dimension of \p cs.
+
+    \param cs
+    A system of octagonal constraints.
+
+    \exception std::invalid_argument
+    Thrown if \p cs contains a constraint which is not optimally supported
+    by the Octagonal shape domain.
+  */
+  explicit Octagonal_Shape(const Constraint_System& cs);
+
+  //! Builds an OS from a system of congruences.
+  /*!
+    The OS inherits the space dimension of \p cgs
+
+    \param cgs
+    A system of congruences.
+
+    \exception std::invalid_argument
+    Thrown if \p cgs contains a congruence which is not optimally supported
+    by the Octagonal shape domain.
+  */
+  explicit Octagonal_Shape(const Congruence_System& cgs);
+
+  //! Builds an OS from the system of generators \p gs.
+  /*!
+    Builds the smallest OS containing the polyhedron defined by \p gs.
+    The OS inherits the space dimension of \p gs.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit Octagonal_Shape(const Generator_System& gs);
+
+  //! Builds an OS from the polyhedron \p ph.
+  /*!
+    Builds an OS containing \p ph using algorithms whose complexity
+    does not exceed the one specified by \p complexity.  If
+    \p complexity is \p ANY_COMPLEXITY, then the OS built is the
+    smallest one containing \p ph.
+  */
+  explicit Octagonal_Shape(const Polyhedron& ph,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS out of a box.
+  /*!
+    The OS inherits the space dimension of the box.
+    The built OS is the most precise OS that includes the box.
+
+    \param box
+    The box representing the OS to be built.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Octagonal_Shape(const Box<Interval>& box,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS that approximates a grid.
+  /*!
+    The OS inherits the space dimension of the grid.
+    The built OS is the most precise OS that includes the grid.
+
+    \param grid
+    The grid used to build the OS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p grid exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Octagonal_Shape(const Grid& grid,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an OS from a BD shape.
+  /*!
+    The OS inherits the space dimension of the BD shape.
+    The built OS is the most precise OS that includes the BD shape.
+
+    \param bd
+    The BD shape used to build the OS.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  explicit Octagonal_Shape(const BD_Shape<U>& bd,
+                           Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  Octagonal_Shape& operator=(const Octagonal_Shape& y);
+
+  /*! \brief
+    Swaps \p *this with octagon \p y.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  void m_swap(Octagonal_Shape& y);
+
+  //! Destructor.
+  ~Octagonal_Shape();
+
+  //@} Constructors, Assignment, Swap and Destructor
+
+  //! \name Member Functions that Do Not Modify the Octagonal_Shape
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns \f$0\f$, if \p *this is empty; otherwise, returns the
+    \ref Affine_Independence_and_Affine_Dimension "affine dimension"
+    of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns the system of constraints defining \p *this.
+  Constraint_System constraints() const;
+
+  //! Returns a minimized system of constraints defining \p *this.
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of (equality) congruences satisfied by \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a minimal system of (equality) congruences
+    satisfied by \p *this with the same affine dimension as \p *this.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Octagonal_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this strictly contains \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Octagonal_Shape& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Octagonal_Shape& y) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the congruence \p cg.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns the relations holding between \p *this and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is an empty OS.
+  bool is_empty() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is a universe OS.
+  bool is_universe() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a bounded OS.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is a topologically closed subset of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains (at least) an integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there exist a
+    unique value \p val such that \p *this
+    saturates the equality <CODE>expr = val</CODE>.
+
+    \param expr
+    The linear expression for which the frequency is needed;
+
+    \param freq_n
+    If <CODE>true</CODE> is returned, the value is set to \f$0\f$;
+    Present for interface compatibility with class Grid, where
+    the \ref Grid_Frequency "frequency" can have a non-zero value;
+
+    \param freq_d
+    If <CODE>true</CODE> is returned, the value is set to \f$1\f$;
+
+    \param val_n
+    The numerator of \p val;
+
+    \param val_d
+    The denominator of \p val;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If <CODE>false</CODE> is returned, then \p freq_n, \p freq_d,
+    \p val_n and \p val_d are left untouched.
+  */
+  bool frequency(const Linear_Expression& expr,
+                 Coefficient& freq_n, Coefficient& freq_d,
+                 Coefficient& val_n, Coefficient& val_d) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} Member Functions that Do Not Modify the Octagonal_Shape
+
+  //! \name Space-Dimension Preserving Member Functions that May Modify the Octagonal_Shape
+  //@{
+
+  /*! \brief
+    Adds a copy of constraint \p c to the system of constraints
+    defining \p *this.
+
+    \param c
+    The constraint to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible,
+    or \p c is not optimally supported by the OS domain.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    defining \p *this.
+
+    \param  cs
+    The constraints that will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the OS domain.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Adds the constraints in \p cs to the system of constraints
+    of \p *this.
+
+    \param cs
+    The constraint system to be added to \p *this.  The constraints in
+    \p cs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible,
+    or \p cs contains a constraint which is not optimally supported
+    by the OS domain.
+
+    \warning
+    The only assumption that can be made on \p cs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Adds to \p *this a constraint equivalent to the congruence \p cg.
+
+    \param cg
+    The congruence to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible,
+    or \p cg is not optimally supported by the OS domain.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruences to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the OS domain.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Adds to \p *this constraints equivalent to the congruences in \p cgs.
+
+    \param cgs
+    The congruence system to be added to \p *this.  The congruences in
+    \p cgs may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible,
+    or \p cgs contains a congruence which is not optimally supported
+    by the OS domain.
+
+    \warning
+    The only assumption that can be made on \p cgs upon successful or
+    exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  /*! \brief
+    Uses a copy of constraint \p c to refine the system of octagonal
+    constraints defining \p *this.
+
+    \param c
+    The constraint. If it is not a octagonal constraint, it will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  /*! \brief
+    Uses a copy of congruence \p cg to refine the system of
+    octagonal constraints  of \p *this.
+
+    \param cg
+    The congruence. If it is not a octagonal equality, it
+    will be ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  /*! \brief
+    Uses a copy of the constraints in \p cs to refine the system of
+    octagonal constraints defining \p *this.
+
+    \param  cs
+    The constraint system to be used. Constraints that are not octagonal
+    are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Uses a copy of the congruences in \p cgs to refine the system of
+    octagonal constraints defining \p *this.
+
+    \param  cgs
+    The congruence system to be used. Congruences that are not octagonal
+    equalities are ignored.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Refines the system of octagonal constraints defining \p *this using
+    the constraint expressed by \p left \f$\leq\f$ \p right.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void refine_with_linear_form_inequality(
+                   const Linear_Form< Interval<T, Interval_Info> >& left,
+                   const Linear_Form< Interval<T, Interval_Info> >& right);
+
+  /*! \brief
+    Refines the system of octagonal constraints defining \p *this using
+    the constraint expressed by \p left \f$\relsym\f$ \p right, where
+    \f$\relsym\f$ is the relation symbol specified by \p relsym.
+
+    \param left
+    The linear form on intervals with floating point boundaries that
+    is at the left of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param right
+    The linear form on intervals with floating point boundaries that
+    is at the right of the comparison operator. All of its coefficients
+    MUST be bounded.
+
+    \param relsym
+    The relation symbol.
+
+    \exception std::invalid_argument
+    Thrown if \p left (or \p right) is dimension-incompatible with \p *this.
+
+    \exception std::runtime_error
+    Thrown if \p relsym is not a valid relation symbol.
+
+    This function is used in abstract interpretation to model a filter
+    that is generated by a comparison of two expressions that are correctly
+    approximated by \p left and \p right respectively.
+  */
+  template <typename Interval_Info>
+  void generalized_refine_with_linear_form_inequality(
+                   const Linear_Form< Interval<T, Interval_Info> >& left,
+                   const Linear_Form< Interval<T, Interval_Info> >& right,
+                   Relation_Symbol relsym);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest OS that contains
+    the convex union of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    If the upper bound of \p *this and \p y is exact, it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    Implementation is based on Theorem 6.3 of \ref BHZ09b "[BHZ09b]".
+  */
+  bool upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+  /*! \brief
+    If the \e integer upper bound of \p *this and \p y is exact,
+    it is assigned to \p *this and <CODE>true</CODE> is returned;
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \note
+    This operator is only available when the class template parameter
+    \c T is bound to an integer data type.
+
+    \note
+    The integer upper bound of two rational OS is the smallest
+    rational OS containing all the integral points in the two arguments.
+    In general, the result is \e not an upper bound for the two input
+    arguments, as it may cut away non-integral portions of the two
+    rational shapes.
+
+    Implementation is based on Theorem 6.8 of \ref BHZ09b "[BHZ09b]".
+  */
+  bool integer_upper_bound_assign_if_exact(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the smallest octagon containing
+    the set difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference  denominator
+                    = Coefficient_one());
+
+  // FIXME: To be completed.
+  /*! \brief
+    Assigns to \p *this the \ref affine_form_relation "affine form image"
+    of \p *this under the function mapping variable \p var into the
+    affine expression(s) specified by \p lf.
+
+    \param var
+    The variable to which the affine expression is assigned.
+
+    \param lf
+    The linear form on intervals with floating point boundaries that
+    defines the affine expression(s). ALL of its coefficients MUST be bounded.
+
+    \exception std::invalid_argument
+    Thrown if \p lf and \p *this are dimension-incompatible or if \p var
+    is not a dimension of \p *this.
+
+    This function is used in abstract interpretation to model an assignment
+    of a value that is correctly overapproximated by \p lf to the
+    floating point variable represented by \p var.
+  */
+  template <typename Interval_Info>
+  void affine_form_image(Variable var,
+                        const Linear_Form< Interval<T, Interval_Info> >& lf);
+
+  /*! \brief
+    Assigns to \p *this the \ref affine_relation "affine preimage"
+    of \p *this under the function mapping variable \p var into the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted.
+
+    \param expr
+    The numerator of the affine expression.
+
+    \param denominator
+    The denominator of the affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                       = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension of \p *this
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine transfer function"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression.
+
+    \param relsym
+    The relation symbol.
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+    /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+/*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine transfer function.
+
+    \param relsym
+    The relation symbol.
+
+    \param expr
+    The numerator of the right hand side affine expression.
+
+    \param denominator
+    The denominator of the right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this
+    are dimension-incompatible or if \p var is not a dimension
+    of \p *this or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(Variable var,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& expr,
+                                   Coefficient_traits::const_reference
+                                   denominator = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p relsym is a strict relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+         \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_extrapolation_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref CC76_extrapolation "CC76-extrapolation" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param first
+    An iterator that points to the first stop_point.
+
+    \param last
+    An iterator that points to the last stop_point.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  template <typename Iterator>
+  void CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                 Iterator first, Iterator last,
+                                 unsigned* tp = 0);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref BHMZ05_widening "BHMZ05-widening" between \p *this and \p y.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void BHMZ05_widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  //! Same as BHMZ05_widening_assign(y, tp).
+  void widening_assign(const Octagonal_Shape& y, unsigned* tp = 0);
+
+  /*! \brief
+    Improves the result of the \ref BHMZ05_widening "BHMZ05-widening"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened OS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if there is in \p cs a strict inequality.
+  */
+  void limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                           const Constraint_System& cs,
+                                           unsigned* tp = 0);
+
+  /*! \brief
+    Restores from \p y the constraints of \p *this, lost by
+    \ref CC76_extrapolation "CC76-extrapolation" applications.
+
+    \param y
+    An OS that <EM>must</EM> contain \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void CC76_narrowing_assign(const Octagonal_Shape& y);
+
+  /*! \brief
+    Improves the result of the \ref CC76_extrapolation "CC76-extrapolation"
+    computation by also enforcing those constraints in \p cs that are
+    satisfied by all the points of \p *this.
+
+    \param y
+    An OS that <EM>must</EM> be contained in \p *this.
+
+    \param cs
+    The system of constraints used to improve the widened OS.
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this, \p y and \p cs are dimension-incompatible or
+    if \p cs contains a strict inequality.
+  */
+  void limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                         const Constraint_System& cs,
+                                         unsigned* tp = 0);
+
+  //@} Space-Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  //! Adds \p m new dimensions and embeds the old OS into the new space.
+  /*!
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes in the new OS,
+    which is characterized by a system of constraints in which the variables
+    running through the new dimensions are not constrained.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, z)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the OS
+    and does not embed it in the new space.
+
+    \param m
+    The number of dimensions to add.
+
+    The new dimensions will be those having the highest indexes
+    in the new OS, which is characterized by a system
+    of constraints in which the variables running through
+    the new dimensions are all constrained to be equal to 0.
+    For instance, when starting from the OS \f$\cO \sseq \Rset^2\f$
+    and adding a third dimension, the result will be the OS
+    \f[
+      \bigl\{\,
+        (x, y, 0)^\transpose \in \Rset^3
+      \bigm|
+        (x, y)^\transpose \in \cO
+      \,\bigr\}.
+    \f]
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Octagonal_Shape& y);
+
+  //! Removes all the specified dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the dimensions to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the Variable
+    objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimension is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    \param pfunc
+    The partial function specifying the destiny of each dimension.
+
+    The template type parameter Partial_Function must provide
+    the following methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain
+    of the partial function.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.
+    If \f$f\f$ is undefined in \f$k\f$, then <CODE>false</CODE> is
+    returned.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in the
+    \ref Mapping_the_Dimensions_of_the_Vector_Space "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref expand_space_dimension "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.
+    Also thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are \ref fold_space_dimensions "folded"
+    into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //! Applies to \p dest the interval constraints embedded in \p *this.
+  /*!
+    \param dest
+    The object to which the constraints will be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest.
+
+    The template type parameter U must provide the following methods.
+    \code
+      dimension_type space_dimension() const
+    \endcode
+    returns the space dimension of the object.
+    \code
+      void set_empty()
+    \endcode
+    sets the object to an empty object.
+    \code
+      bool restrict_lower(dimension_type dim, const T& lb)
+    \endcode
+    restricts the object by applying the lower bound \p lb to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+    \code
+      bool restrict_upper(dimension_type dim, const T& ub)
+    \endcode
+    restricts the object by applying the upper bound \p ub to the space
+    dimension \p dim and returns <CODE>false</CODE> if and only if the
+    object becomes empty.
+  */
+  template <typename U>
+  void export_interval_constraints(U& dest) const;
+
+  //! Refines \p store with the constraints defining \p *this.
+  /*!
+    \param store
+    The interval floating point abstract store to refine.
+  */
+  template <typename Interval_Info>
+  void refine_fp_interval_abstract_store(
+                          Box< Interval<T, Interval_Info> >& store) const;
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  friend bool
+  operator==<T>(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y);
+
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::rectilinear_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::euclidean_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+  template <typename Temp, typename To, typename U>
+  friend bool Parma_Polyhedra_Library::l_infinity_distance_assign
+  (Checked_Number<To, Extended_Number_Policy>& r,
+   const Octagonal_Shape<U>& x, const Octagonal_Shape<U>& y,
+   const Rounding_Dir dir, Temp& tmp0, Temp& tmp1, Temp& tmp2);
+
+private:
+  template <typename U> friend class Parma_Polyhedra_Library::Octagonal_Shape;
+  template <typename Interval> friend class Parma_Polyhedra_Library::Box;
+
+  //! The matrix that represents the octagonal shape.
+  OR_Matrix<N> matrix;
+
+  //! Dimension of the space of the octagonal shape.
+  dimension_type space_dim;
+
+  // Please, do not move the following include directive:
+  // `Og_Status_idefs.hh' must be included exactly at this point.
+  // And please do not remove the space separating `#' from `include':
+  // this ensures that the directive will not be moved during the
+  // procedure that automatically creates the library's include file
+  // (see `Makefile.am' in the `src' directory).
+#define PPL_IN_Octagonal_Shape_CLASS
+/* Automatically generated from PPL source file ../src/Og_Status_idefs.hh line 1. */
+/* Octagonal_Shape<T>::Status class declaration.
+*/
+
+
+#ifndef PPL_IN_Octagonal_Shape_CLASS
+#error "Do not include Og_Status_idefs.hh directly; use Octagonal_Shape_defs.hh instead"
+#endif
+
+//! A conjunctive assertion about a Octagonal_Shape<T> object.
+/*!
+  The assertions supported are:
+  - <EM>zero-dim universe</EM>: the polyhedron is the zero-dimensional
+    vector space \f$\Rset^0 = \{\cdot\}\f$;
+  - <EM>empty</EM>: the polyhedron is the empty set;
+  - <EM>strongly closed</EM>: the Octagonal_Shape object is strongly
+    closed, so that all the constraints are as tight as possible.
+
+  Not all the conjunctions of these elementary assertions constitute
+  a legal Status.  In fact:
+  - <EM>zero-dim universe</EM> excludes any other assertion;
+  - <EM>empty</EM>: excludes any other assertion.
+*/
+class Status {
+public:
+  //! By default Status is the <EM>zero-dim universe</EM> assertion.
+  Status();
+
+  //! \name Test, remove or add an individual assertion from the conjunction.
+  //@{
+  bool test_zero_dim_univ() const;
+  void reset_zero_dim_univ();
+  void set_zero_dim_univ();
+
+  bool test_empty() const;
+  void reset_empty();
+  void set_empty();
+
+  bool test_strongly_closed() const;
+  void reset_strongly_closed();
+  void set_strongly_closed();
+  //@}
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  /*! \brief
+    Writes to \p s an ASCII representation of the internal
+    representation of \p *this.
+  */
+  void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  //! Status is implemented by means of a finite bitset.
+  typedef unsigned int flags_t;
+
+  //! \name Bitmasks for the individual assertions.
+  //@{
+  static const flags_t ZERO_DIM_UNIV   = 0U;
+  static const flags_t EMPTY           = 1U << 0;
+  static const flags_t STRONGLY_CLOSED = 1U << 1;
+  //@}
+
+  //! This holds the current bitset.
+  flags_t flags;
+
+  //! Construct from a bitmask.
+  Status(flags_t mask);
+
+  //! Check whether <EM>all</EM> bits in \p mask are set.
+  bool test_all(flags_t mask) const;
+
+  //! Check whether <EM>at least one</EM> bit in \p mask is set.
+  bool test_any(flags_t mask) const;
+
+  //! Set the bits in \p mask.
+  void set(flags_t mask);
+
+  //! Reset the bits in \p mask.
+  void reset(flags_t mask);
+
+};
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 1923. */
+#undef PPL_IN_Octagonal_Shape_CLASS
+
+  //! The status flags to keep track of the internal state.
+  Status status;
+
+  //! Returns <CODE>true</CODE> if the OS is the zero-dimensional universe.
+  bool marked_zero_dim_univ() const;
+
+  //! Returns <CODE>true</CODE> if the OS is known to be empty.
+  /*!
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \p *this is non-empty.
+  */
+  bool marked_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \c this->matrix is known to be
+    strongly closed.
+
+    The return value <CODE>false</CODE> does not necessarily
+    implies that \c this->matrix is not strongly closed.
+  */
+  bool marked_strongly_closed() const;
+
+  //! Turns \p *this into a zero-dimensional universe OS.
+  void set_zero_dim_univ();
+
+  //! Turns \p *this into an empty OS.
+  void set_empty();
+
+  //! Marks \p *this as strongly closed.
+  void set_strongly_closed();
+
+  //! Marks \p *this as possibly not strongly closed.
+  void reset_strongly_closed();
+
+  N& matrix_at(dimension_type i, dimension_type j);
+  const N& matrix_at(dimension_type i, dimension_type j) const;
+
+  /*! \brief
+    Returns an upper bound for \p lf according to the constraints
+    embedded in \p *this.
+
+    \p lf must be a linear form on intervals with floating point coefficients.
+    If all coefficients in \p lf are bounded, then \p result will become a
+    correct overapproximation of the value of \p lf when variables in
+    \p lf satisfy the constraints expressed by \p *this. Otherwise the
+    behavior of the method is undefined.
+  */
+  template <typename Interval_Info>
+  void linear_form_upper_bound(
+                   const Linear_Form< Interval<T, Interval_Info> >& lf,
+                   N& result) const;
+
+  // FIXME: this function is currently not used. Consider removing it.
+  static void interval_coefficient_upper_bound(const N& var_ub,
+                                               const N& minus_var_ub,
+                                               const N& int_ub, const N& int_lb,
+                                               N& result);
+
+  /*! \brief
+    Uses the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be added. Non-octagonal constraints are ignored.
+
+    \warning
+    If \p c and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Constraint& c);
+
+  /*! \brief
+    Uses the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be added.
+    Nontrivial proper congruences are ignored.
+    Non-octagonal equalities are ignored.
+
+    \warning
+    If \p cg and \p *this are dimension-incompatible,
+    the behavior is undefined.
+  */
+  void refine_no_check(const Congruence& cg);
+
+  //! Adds the constraint <CODE>matrix[i][j] <= k</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                const N& k);
+
+  //! Adds the constraint <CODE>matrix[i][j] <= numer/denom</CODE>.
+  void add_octagonal_constraint(dimension_type i,
+                                dimension_type j,
+                                Coefficient_traits::const_reference numer,
+                                Coefficient_traits::const_reference denom);
+
+  /*! \brief
+    Adds to the Octagonal_Shape the constraint
+    \f$\mathrm{var} \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$.
+
+    Note that the coefficient of \p var in \p expr is null.
+  */
+  void refine(Variable var,
+              Relation_Symbol relsym,
+              const Linear_Expression& expr,
+              Coefficient_traits::const_reference denominator
+              = Coefficient_one());
+
+  //! Removes all the constraints on variable \p v_id.
+  void forget_all_octagonal_constraints(dimension_type v_id);
+
+  //! Removes all binary constraints on variable \p v_id.
+  void forget_binary_octagonal_constraints(dimension_type v_id);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>v - u \<= k</CODE> and <CODE>v + u \<= k</CODE>,
+    starting from \p ub_v, which is an upper bound for \c v
+    computed according to \p sc_expr and \p sc_denom.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>v - u \<= ub_v - lb_u</CODE> and <CODE>v + u \<= ub_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of the upper bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>v - u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>v - u \<= ub_v - ub_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>v - u \<= ub_v - (q*ub_u + (1-q)*lb_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>v + u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>v + u \<= ub_v + lb_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>v + u \<= ub_v + ((-q)*lb_u + (1+q)*ub_u)</CODE>.
+  */
+  void deduce_v_pm_u_bounds(dimension_type v_id,
+                            dimension_type last_id,
+                            const Linear_Expression& sc_expr,
+                            Coefficient_traits::const_reference sc_denom,
+                            const N& ub_v);
+
+  //! An helper function for the computation of affine relations.
+  /*!
+    For each variable index \c u_id (less than or equal to \p last_id
+    and different from \p v_id), deduce constraints of the form
+    <CODE>-v + u \<= k</CODE> and <CODE>-v - u \<= k</CODE>,
+    starting from \p minus_lb_v, which is the negation of a lower bound
+    for \c v computed according to \p sc_expr and \p sc_denom.
+
+    Strong-closure will be able to deduce the constraints
+    <CODE>-v - u \<= -lb_v - lb_u</CODE> and
+    <CODE>-v + u \<= -lb_v + ub_u</CODE>.
+    We can be more precise if variable \c u played an active role in the
+    computation of (the negation of) the lower bound for \c v.
+
+    Namely, if the corresponding coefficient
+    <CODE>q == sc_expr[u]/sc_denom</CODE> of \c u in \p sc_expr
+    is greater than zero, we can improve the bound for <CODE>-v + u</CODE>.
+    In particular:
+      - if <CODE>q \>= 1</CODE>, then <CODE>-v + u \<= -lb_v + lb_u</CODE>;
+      - if <CODE>0 \< q \< 1</CODE>, then
+        <CODE>-v + u \<= -lb_v + (q*lb_u + (1-q)*ub_u)</CODE>.
+
+    Conversely, if \c q is less than zero, we can improve the bound for
+    <CODE>-v - u</CODE>. In particular:
+      - if <CODE>q \<= -1</CODE>, then <CODE>-v - u \<= -lb_v - ub_u</CODE>;
+      - if <CODE>-1 \< q \< 0</CODE>, then
+        <CODE>-v - u \<= -lb_v - ((-q)*ub_u + (1+q)*lb_u)</CODE>.
+  */
+  void deduce_minus_v_pm_u_bounds(dimension_type v_id,
+                                  dimension_type last_id,
+                                  const Linear_Expression& sc_expr,
+                                  Coefficient_traits::const_reference sc_denom,
+                                  const N& minus_lb_v);
+
+  /*! \brief
+    Adds to \p limiting_octagon the octagonal differences in \p cs
+    that are satisfied by \p *this.
+  */
+  void get_limiting_octagon(const Constraint_System& cs,
+                            Octagonal_Shape& limiting_octagon) const;
+  //! Compute the (zero-equivalence classes) successor relation.
+  /*!
+    It is assumed that the octagon is not empty and strongly closed.
+  */
+  void compute_successors(std::vector<dimension_type>& successor) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& successor,
+                       std::vector<dimension_type>& no_sing_leaders,
+                       bool& exist_sing_class,
+                       dimension_type& sing_leader) const;
+
+  //! Compute the leaders of zero-equivalence classes.
+  /*!
+    It is assumed that the OS is not empty and strongly closed.
+  */
+  void compute_leaders(std::vector<dimension_type>& leaders) const;
+
+  /*! \brief
+    Stores into \p non_redundant information about the matrix entries
+    that are non-redundant (i.e., they will occur in the strongly
+    reduced matrix).
+
+    It is assumed that the OS is not empty and strongly closed;
+    moreover, argument \p non_redundant is assumed to be empty.
+  */
+  void non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const;
+
+  //! Removes the redundant constraints from \c this->matrix.
+  void strong_reduction_assign() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \c this->matrix
+    is strongly reduced.
+  */
+  bool is_strongly_reduced() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if in the octagon taken two at a time
+    unary constraints, there is also the constraint that represent their sum.
+  */
+  bool is_strong_coherent() const;
+
+  bool tight_coherence_would_make_empty() const;
+
+  //! Assigns to \c this->matrix its strong closure.
+  /*!
+    Strong closure is a necessary condition for the precision and/or
+    the correctness of many methods. It explicitly records into \c matrix
+    those constraints that are implicitly obtainable by the other ones,
+    therefore obtaining a canonical representation for the OS.
+  */
+  void strong_closure_assign() const;
+
+  //! Applies the strong-coherence step to \c this->matrix.
+  void strong_coherence_assign();
+
+  //! Assigns to \c this->matrix its tight closure.
+  /*!
+    \note
+    This is \e not marked as a <code>const</code> method,
+    as it may modify the rational-valued geometric shape by cutting away
+    non-integral points. The method is only available if the template
+    parameter \c T is bound to an integer data type.
+  */
+  void tight_closure_assign();
+
+  /*! \brief
+    Incrementally computes strong closure, assuming that only
+    constraints affecting variable \p var need to be considered.
+
+    \note
+    It is assumed that \c *this, which was strongly closed, has only been
+    modified by adding constraints affecting variable \p var. If this
+    assumption is not satisfied, i.e., if a non-redundant constraint not
+    affecting variable \p var has been added, the behavior is undefined.
+    Worst-case complexity is \f$O(n^2)\f$.
+  */
+  void incremental_strong_closure_assign(Variable var) const;
+
+  //! Checks if and how \p expr is bounded in \p *this.
+  /*!
+    Returns <CODE>true</CODE> if and only if \p from_above is
+    <CODE>true</CODE> and \p expr is bounded from above in \p *this,
+    or \p from_above is <CODE>false</CODE> and \p expr is bounded
+    from below in \p *this.
+
+    \param expr
+    The linear expression to test;
+
+    \param from_above
+    <CODE>true</CODE> if and only if the boundedness of interest is
+    "from above".
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds(const Linear_Expression& expr, bool from_above) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d and
+    \p included are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included) const;
+
+  //! Maximizes or minimizes \p expr subject to \p *this.
+  /*!
+    \param expr
+    The linear expression to be maximized or minimized subject to \p
+    *this;
+
+    \param maximize
+    <CODE>true</CODE> if maximization is what is wanted;
+
+    \param ext_n
+    The numerator of the extremum value;
+
+    \param ext_d
+    The denominator of the extremum value;
+
+    \param included
+    <CODE>true</CODE> if and only if the extremum of \p expr can
+    actually be reached in \p * this;
+
+    \param g
+    When maximization or minimization succeeds, will be assigned
+    a point or closure point where \p expr reaches the
+    corresponding extremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded in the appropriate
+    direction, <CODE>false</CODE> is returned and \p ext_n, \p ext_d,
+    \p included and \p g are left untouched.
+  */
+  bool max_min(const Linear_Expression& expr,
+               bool maximize,
+               Coefficient& ext_n, Coefficient& ext_d, bool& included,
+               Generator& g) const;
+
+  void drop_some_non_integer_points_helper(N& elem);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators
+  ::operator<<<>(std::ostream& s, const Octagonal_Shape<T>& c);
+
+  //! \name Exception Throwers
+  //@{
+  void throw_dimension_incompatible(const char* method,
+                                    const Octagonal_Shape& y) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    dimension_type required_dim) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Constraint& c) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Congruence& cg) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const Generator& g) const;
+
+  void throw_dimension_incompatible(const char* method,
+                                    const char* le_name,
+                                    const Linear_Expression& le) const;
+
+  template <typename C>
+  void throw_dimension_incompatible(const char* method,
+                                    const char* lf_name,
+                                    const Linear_Form<C>& lf) const;
+
+  static void throw_constraint_incompatible(const char* method);
+
+  static void throw_expression_too_complex(const char* method,
+                                           const Linear_Expression& le);
+
+  static void throw_invalid_argument(const char* method, const char* reason);
+  //@} // Exception Throwers
+};
+
+/* Automatically generated from PPL source file ../src/Og_Status_inlines.hh line 1. */
+/* Octagonal_Shape<T>::Status class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status(flags_t mask)
+  : flags(mask) {
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Status::Status()
+  : flags(ZERO_DIM_UNIV) {
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_all(flags_t mask) const {
+  return (flags & mask) == mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_any(flags_t mask) const {
+  return (flags & mask) != 0;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set(flags_t mask) {
+  flags |= mask;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset(flags_t mask) {
+  flags &= ~mask;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_zero_dim_univ() const {
+  return flags == ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_zero_dim_univ() {
+  // This is a no-op if the current status is not zero-dim.
+  if (flags == ZERO_DIM_UNIV)
+    // In the zero-dim space, if it is not the universe it is empty.
+    flags = EMPTY;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_zero_dim_univ() {
+  // Zero-dim universe is incompatible with anything else.
+  flags = ZERO_DIM_UNIV;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_empty() const {
+  return test_any(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_empty() {
+  reset(EMPTY);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_empty() {
+  flags = EMPTY;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::test_strongly_closed() const {
+  return test_any(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::reset_strongly_closed() {
+  reset(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::set_strongly_closed() {
+  set(STRONGLY_CLOSED);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::OK() const {
+  if (test_zero_dim_univ())
+    // Zero-dim universe is OK.
+    return true;
+
+  if (test_empty()) {
+    Status copy = *this;
+    copy.reset_empty();
+    if (copy.test_zero_dim_univ())
+      return true;
+    else {
+#ifndef NDEBUG
+      std::cerr << "The empty flag is incompatible with any other one."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // Any other case is OK.
+  return true;
+}
+
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+// These are the keywords that indicate the individual assertions.
+const std::string zero_dim_univ = "ZE";
+const std::string empty = "EM";
+const std::string strong_closed = "SC";
+const char yes = '+';
+const char no = '-';
+const char separator = ' ';
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape::Status
+  Reads a keyword and its associated on/off flag from \p s.
+  Returns <CODE>true</CODE> if the operation is successful,
+  returns <CODE>false</CODE> otherwise.
+  When successful, \p positive is set to <CODE>true</CODE> if the flag
+  is on; it is set to <CODE>false</CODE> otherwise.
+*/
+inline bool
+get_field(std::istream& s, const std::string& keyword, bool& positive) {
+  std::string str;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != keyword)
+    return false;
+  positive = (str[0] == yes);
+  return true;
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::Status::ascii_dump(std::ostream& s) const {
+  using namespace Implementation::Octagonal_Shapes;
+  s << (test_zero_dim_univ() ? yes : no) << zero_dim_univ
+    << separator
+    << (test_empty() ? yes : no) << empty
+    << separator
+    << separator
+    << (test_strongly_closed() ? yes : no) << strong_closed
+    << separator;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::Status::ascii_load(std::istream& s) {
+  using namespace Implementation::Octagonal_Shapes;
+  PPL_UNINITIALIZED(bool, positive);
+
+  if (!get_field(s, zero_dim_univ, positive))
+    return false;
+  if (positive)
+    set_zero_dim_univ();
+
+  if (!get_field(s, empty, positive))
+    return false;
+  if (positive)
+    set_empty();
+
+  if (!get_field(s, strong_closed, positive))
+    return false;
+  if (positive)
+    set_strongly_closed();
+  else
+    reset_strongly_closed();
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_inlines.hh line 1. */
+/* Octagonal_Shape class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/wrap_assign.hh line 1. */
+/* Generic implementation of the wrap_assign() function.
+*/
+
+
+/* Automatically generated from PPL source file ../src/wrap_assign.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+struct Wrap_Dim_Translations {
+  Variable var;
+  Coefficient first_quadrant;
+  Coefficient last_quadrant;
+  Wrap_Dim_Translations(Variable v,
+                        Coefficient_traits::const_reference f,
+                        Coefficient_traits::const_reference l)
+    : var(v), first_quadrant(f), last_quadrant(l) {
+  }
+};
+
+typedef std::vector<Wrap_Dim_Translations> Wrap_Translations;
+
+template <typename PSET>
+void
+wrap_assign_ind(PSET& pointset,
+                Variables_Set& vars,
+                Wrap_Translations::const_iterator first,
+                Wrap_Translations::const_iterator end,
+                Bounded_Integer_Type_Width w,
+                Coefficient_traits::const_reference min_value,
+                Coefficient_traits::const_reference max_value,
+                const Constraint_System& cs,
+                Coefficient& tmp1,
+                Coefficient& tmp2) {
+  const dimension_type space_dim = pointset.space_dimension();
+  for (Wrap_Translations::const_iterator i = first; i != end; ++i) {
+    const Wrap_Dim_Translations& wrap_dim_translations = *i;
+    const Variable x(wrap_dim_translations.var);
+    const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+    const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+    Coefficient& quadrant = tmp1;
+    Coefficient& shift = tmp2;
+    PSET hull(space_dim, EMPTY);
+    for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+      PSET p(pointset);
+      if (quadrant != 0) {
+        mul_2exp_assign(shift, quadrant, w);
+        p.affine_image(x, x - shift, 1);
+      }
+      // `x' has just been wrapped.
+      vars.erase(x.id());
+
+      // Refine `p' with all the constraints in `cs' not depending
+      // on variables in `vars'.
+      if (vars.empty())
+        p.refine_with_constraints(cs);
+      else {
+        for (Constraint_System::const_iterator j = cs.begin(),
+               cs_end = cs.end(); j != cs_end; ++j)
+          if (j->expression().all_zeroes(vars))
+            // `*j' does not depend on variables in `vars'.
+            p.refine_with_constraint(*j);
+      }
+      p.refine_with_constraint(min_value <= x);
+      p.refine_with_constraint(x <= max_value);
+      hull.upper_bound_assign(p);
+    }
+    pointset.m_swap(hull);
+  }
+}
+
+template <typename PSET>
+void
+wrap_assign_col(PSET& dest,
+                const PSET& src,
+                const Variables_Set& vars,
+                Wrap_Translations::const_iterator first,
+                Wrap_Translations::const_iterator end,
+                Bounded_Integer_Type_Width w,
+                Coefficient_traits::const_reference min_value,
+                Coefficient_traits::const_reference max_value,
+                const Constraint_System* cs_p,
+                Coefficient& tmp) {
+  if (first == end) {
+    PSET p(src);
+    if (cs_p != 0)
+      p.refine_with_constraints(*cs_p);
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vars_end = vars.end(); i != vars_end; ++i) {
+      const Variable x(*i);
+      p.refine_with_constraint(min_value <= x);
+      p.refine_with_constraint(x <= max_value);
+    }
+    dest.upper_bound_assign(p);
+  }
+  else {
+    const Wrap_Dim_Translations& wrap_dim_translations = *first;
+    const Variable x(wrap_dim_translations.var);
+    const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+    const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+    Coefficient& shift = tmp;
+    PPL_DIRTY_TEMP_COEFFICIENT(quadrant);
+    for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+      if (quadrant != 0) {
+        mul_2exp_assign(shift, quadrant, w);
+        PSET p(src);
+        p.affine_image(x, x - shift, 1);
+        wrap_assign_col(dest, p, vars, first+1, end, w, min_value, max_value,
+                        cs_p, tmp);
+      }
+      else
+        wrap_assign_col(dest, src, vars, first+1, end, w, min_value, max_value,
+                        cs_p, tmp);
+    }
+  }
+}
+
+template <typename PSET>
+void
+wrap_assign(PSET& pointset,
+            const Variables_Set& vars,
+            const Bounded_Integer_Type_Width w,
+            const Bounded_Integer_Type_Representation r,
+            const Bounded_Integer_Type_Overflow o,
+            const Constraint_System* cs_p,
+            const unsigned complexity_threshold,
+            const bool wrap_individually,
+            const char* class_name) {
+  // We must have cs_p->space_dimension() <= vars.space_dimension()
+  //         and  vars.space_dimension() <= pointset.space_dimension().
+
+  // Dimension-compatibility check of `*cs_p', if any.
+  if (cs_p != 0) {
+    const dimension_type vars_space_dim = vars.space_dimension();
+    if (cs_p->space_dimension() > vars_space_dim) {
+      std::ostringstream s;
+      s << "PPL::" << class_name << "::wrap_assign(..., cs_p, ...):"
+        << std::endl
+        << "vars.space_dimension() == " << vars_space_dim
+        << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+      throw std::invalid_argument(s.str());
+    }
+
+#ifndef NDEBUG
+    // Check that all variables upon which `*cs_p' depends are in `vars'.
+    // An assertion is violated otherwise.
+    const Constraint_System cs = *cs_p;
+    const dimension_type cs_space_dim = cs.space_dimension();
+    Variables_Set::const_iterator vars_end = vars.end();
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i) {
+      const Constraint& c = *i;
+      for (dimension_type d = cs_space_dim; d-- > 0; ) {
+        PPL_ASSERT(c.coefficient(Variable(d)) == 0
+                   || vars.find(d) != vars_end);
+      }
+    }
+#endif
+  }
+
+  // Wrapping no variable only requires refining with *cs_p, if any.
+  if (vars.empty()) {
+    if (cs_p != 0)
+      pointset.refine_with_constraints(*cs_p);
+    return;
+  }
+
+  // Dimension-compatibility check of `vars'.
+  const dimension_type space_dim = pointset.space_dimension();
+  if (vars.space_dimension() > space_dim) {
+    std::ostringstream s;
+    s << "PPL::" << class_name << "::wrap_assign(vs, ...):" << std::endl
+      << "this->space_dimension() == " << space_dim
+      << ", required space dimension == " << vars.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Wrapping an empty polyhedron is a no-op.
+  if (pointset.is_empty())
+    return;
+
+  // Set `min_value' and `max_value' to the minimum and maximum values
+  // a variable of width `w' and signedness `s' can take.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  if (r == UNSIGNED) {
+    min_value = 0;
+    mul_2exp_assign(max_value, Coefficient_one(), w);
+    --max_value;
+  }
+  else {
+    PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+    mul_2exp_assign(max_value, Coefficient_one(), w-1);
+    neg_assign(min_value, max_value);
+    --max_value;
+  }
+
+  // If we are wrapping variables collectively, the ranges for the
+  // required translations are saved in `translations' instead of being
+  // immediately applied.
+  Wrap_Translations translations;
+
+  // Dimensions subject to translation are added to this set if we are
+  // wrapping collectively or if `cs_p' is non null.
+  Variables_Set dimensions_to_be_translated;
+
+  // This will contain a lower bound to the number of abstractions
+  // to be joined in order to obtain the collective wrapping result.
+  // As soon as this exceeds `complexity_threshold', counting will be
+  // interrupted and the full range will be the result of wrapping
+  // any dimension that is not fully contained in quadrant 0.
+  unsigned collective_wrap_complexity = 1;
+
+  // This flag signals that the maximum complexity for collective
+  // wrapping as been exceeded.
+  bool collective_wrap_too_complex = false;
+
+  if (!wrap_individually) {
+    translations.reserve(space_dim);
+  }
+
+  // We use `full_range_bounds' to delay conversions whenever
+  // this delay does not negatively affect precision.
+  Constraint_System full_range_bounds;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+  for (Variables_Set::const_iterator i = vars.begin(),
+         vars_end = vars.end(); i != vars_end; ++i) {
+
+    const Variable x(*i);
+
+    bool extremum;
+
+    if (!pointset.minimize(x, l_n, l_d, extremum)) {
+    set_full_range:
+      pointset.unconstrain(x);
+      full_range_bounds.insert(min_value <= x);
+      full_range_bounds.insert(x <= max_value);
+      continue;
+    }
+
+    if (!pointset.maximize(x, u_n, u_d, extremum))
+      goto set_full_range;
+
+    div_assign_r(l_n, l_n, l_d, ROUND_DOWN);
+    div_assign_r(u_n, u_n, u_d, ROUND_DOWN);
+    l_n -= min_value;
+    u_n -= min_value;
+    div_2exp_assign_r(l_n, l_n, w, ROUND_DOWN);
+    div_2exp_assign_r(u_n, u_n, w, ROUND_DOWN);
+    Coefficient& first_quadrant = l_n;
+    const Coefficient& last_quadrant = u_n;
+
+    // Special case: this variable does not need wrapping.
+    if (first_quadrant == 0 && last_quadrant == 0)
+      continue;
+
+    // If overflow is impossible, try not to add useless constraints.
+    if (o == OVERFLOW_IMPOSSIBLE) {
+      if (first_quadrant < 0)
+        full_range_bounds.insert(min_value <= x);
+      if (last_quadrant > 0)
+        full_range_bounds.insert(x <= max_value);
+      continue;
+    }
+
+    if (o == OVERFLOW_UNDEFINED || collective_wrap_too_complex)
+      goto set_full_range;
+
+    Coefficient& quadrants = u_d;
+    quadrants = last_quadrant - first_quadrant + 1;
+
+    PPL_UNINITIALIZED(unsigned, extension);
+    Result res = assign_r(extension, quadrants, ROUND_IGNORE);
+    if (result_overflow(res) != 0 || extension > complexity_threshold)
+      goto set_full_range;
+
+    if (!wrap_individually && !collective_wrap_too_complex) {
+      res = mul_assign_r(collective_wrap_complexity,
+                         collective_wrap_complexity, extension, ROUND_IGNORE);
+      if (result_overflow(res) != 0
+          || collective_wrap_complexity > complexity_threshold)
+        collective_wrap_too_complex = true;
+      if (collective_wrap_too_complex) {
+        // Set all the dimensions in `translations' to full range.
+        for (Wrap_Translations::const_iterator j = translations.begin(),
+               translations_end = translations.end();
+             j != translations_end;
+             ++j) {
+          const Variable y(j->var);
+          pointset.unconstrain(y);
+          full_range_bounds.insert(min_value <= y);
+          full_range_bounds.insert(y <= max_value);
+        }
+      }
+    }
+
+    if (wrap_individually && cs_p == 0) {
+      Coefficient& quadrant = first_quadrant;
+      // Temporary variable holding the shifts to be applied in order
+      // to implement the translations.
+      Coefficient& shift = l_d;
+      PSET hull(space_dim, EMPTY);
+      for ( ; quadrant <= last_quadrant; ++quadrant) {
+        PSET p(pointset);
+        if (quadrant != 0) {
+          mul_2exp_assign(shift, quadrant, w);
+          p.affine_image(x, x - shift, 1);
+        }
+        p.refine_with_constraint(min_value <= x);
+        p.refine_with_constraint(x <= max_value);
+        hull.upper_bound_assign(p);
+      }
+      pointset.m_swap(hull);
+    }
+    else if (wrap_individually || !collective_wrap_too_complex) {
+      PPL_ASSERT(!wrap_individually || cs_p != 0);
+      dimensions_to_be_translated.insert(x);
+      translations
+        .push_back(Wrap_Dim_Translations(x, first_quadrant, last_quadrant));
+    }
+  }
+
+  if (!translations.empty()) {
+    if (wrap_individually) {
+      PPL_ASSERT(cs_p != 0);
+      wrap_assign_ind(pointset, dimensions_to_be_translated,
+                      translations.begin(), translations.end(),
+                      w, min_value, max_value, *cs_p, l_n, l_d);
+    }
+    else {
+      PSET hull(space_dim, EMPTY);
+      wrap_assign_col(hull, pointset, dimensions_to_be_translated,
+                      translations.begin(), translations.end(),
+                      w, min_value, max_value, cs_p, l_n);
+      pointset.m_swap(hull);
+    }
+  }
+
+  if (cs_p != 0)
+    pointset.refine_with_constraints(*cs_p);
+  pointset.refine_with_constraints(full_range_bounds);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_inlines.hh line 36. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Octagonal_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns the index coherent to \p i.
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+inline dimension_type
+coherent_index(const dimension_type i) {
+  return (i % 2 != 0) ? (i-1) : (i+1);
+}
+
+} // namespace Octagonal_Shapes
+
+} // namespace Implementation
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::max_space_dimension() {
+  return OR_Matrix<N>::max_num_rows()/2;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_strongly_closed() const {
+  return status.test_strongly_closed();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_empty() {
+  status.set_empty();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::set_strongly_closed() {
+  status.set_strongly_closed();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::reset_strongly_closed() {
+  status.reset_strongly_closed();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const dimension_type num_dimensions,
+                                    const Degenerate_Element kind)
+  : matrix(num_dimensions), space_dim(num_dimensions), status() {
+  if (kind == EMPTY)
+    set_empty();
+  else if (num_dimensions > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape& y, Complexity_Class)
+  : matrix(y.matrix), space_dim(y.space_dim), status(y.status) {
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Octagonal_Shape<U>& y,
+                                    Complexity_Class)
+  // For maximum precision, enforce shortest-path closure
+  // before copying the DB matrix.
+  : matrix((y.strong_closure_assign(), y.matrix)),
+    space_dim(y.space_dim),
+    status() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Constraint_System& cs)
+  : matrix(cs.space_dimension()),
+    space_dim(cs.space_dimension()),
+    status() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_constraints(cs);
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Congruence_System& cgs)
+  : matrix(cgs.space_dimension()),
+    space_dim(cgs.space_dimension()),
+    status() {
+  if (cgs.space_dimension() > 0)
+    // A (non zero-dim) universe octagon is strongly closed.
+    set_strongly_closed();
+  add_congruences(cgs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Box<Interval>& box,
+                                    Complexity_Class)
+  : matrix(box.space_dimension()),
+    space_dim(box.space_dimension()),
+    status() {
+  // Check for emptiness for maximum precision.
+  if (box.is_empty())
+    set_empty();
+  else if (box.space_dimension() > 0) {
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+    refine_with_constraints(box.constraints());
+  }
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const Grid& grid,
+                                    Complexity_Class)
+  : matrix(grid.space_dimension()),
+    space_dim(grid.space_dimension()),
+    status() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+  // Taking minimized congruences ensures maximum precision.
+  refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+Octagonal_Shape<T>::Octagonal_Shape(const BD_Shape<U>& bd,
+                                    Complexity_Class)
+  : matrix(bd.space_dimension()),
+    space_dim(bd.space_dimension()),
+    status() {
+  // Check for emptiness for maximum precision.
+  if (bd.is_empty())
+    set_empty();
+  else if (bd.space_dimension() > 0) {
+    // A (non zero-dim) universe OS is strongly closed.
+    set_strongly_closed();
+    refine_with_constraints(bd.constraints());
+  }
+}
+
+template <typename T>
+inline Congruence_System
+Octagonal_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
+
+template <typename T>
+inline Octagonal_Shape<T>&
+Octagonal_Shape<T>::operator=(const Octagonal_Shape& y) {
+  matrix = y.matrix;
+  space_dim = y.space_dim;
+  status = y.status;
+  return *this;
+}
+
+template <typename T>
+inline
+Octagonal_Shape<T>::~Octagonal_Shape() {
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::m_swap(Octagonal_Shape& y) {
+  using std::swap;
+  swap(matrix, y.matrix);
+  swap(space_dim, y.space_dim);
+  swap(status, y.status);
+}
+
+template <typename T>
+inline dimension_type
+Octagonal_Shape<T>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_empty() const {
+  strong_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+                             Coefficient& sup_n, Coefficient& sup_d,
+                             bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::maximize(const Linear_Expression& expr,
+                             Coefficient& sup_n, Coefficient& sup_d,
+                             bool& maximum,
+                             Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+                             Coefficient& inf_n, Coefficient& inf_d,
+                             bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::minimize(const Linear_Expression& expr,
+                             Coefficient& inf_n, Coefficient& inf_d,
+                             bool& minimum,
+                             Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::is_topologically_closed() const {
+  return true;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator==(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  if (x.space_dim != y.space_dim)
+    // Dimension-incompatible OSs are different.
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
+
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+  // If one of two octagons is empty, then they are equal if and only if
+  // the other octagon is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Strong closure is a canonical form.
+  return x.matrix == y.matrix;
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline bool
+operator!=(const Octagonal_Shape<T>& x, const Octagonal_Shape<T>& y) {
+  return !(x == y);
+}
+
+template <typename T>
+inline const typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+                              const dimension_type j) const {
+  PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+  using namespace Implementation::Octagonal_Shapes;
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline typename Octagonal_Shape<T>::coefficient_type&
+Octagonal_Shape<T>::matrix_at(const dimension_type i,
+                              const dimension_type j) {
+  PPL_ASSERT(i < matrix.num_rows() && j < matrix.num_rows());
+  using namespace Implementation::Octagonal_Shapes;
+  return (j < matrix.row_size(i))
+    ? matrix[i][j]
+    : matrix[coherent_index(j)][coherent_index(i)];
+}
+
+template <typename T>
+inline Constraint_System
+Octagonal_Shape<T>::minimized_constraints() const {
+  strong_reduction_assign();
+  return constraints();
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_octagonal_constraint(const dimension_type i,
+                                             const dimension_type j,
+                                             const N& k) {
+  // Private method: the caller has to ensure the following.
+#ifndef NDEBUG
+  PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  PPL_ASSERT(j < m_i.row_size());
+#endif
+  N& r_i_j = matrix[i][j];
+  if (r_i_j > k) {
+    r_i_j = k;
+    if (marked_strongly_closed())
+      reset_strongly_closed();
+  }
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::add_octagonal_constraint(const dimension_type i,
+                           const dimension_type j,
+                           Coefficient_traits::const_reference numer,
+                           Coefficient_traits::const_reference denom) {
+#ifndef NDEBUG
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(i < 2*space_dim && j < 2*space_dim && i != j);
+  typename OR_Matrix<N>::row_iterator m_i = matrix.row_begin() + i;
+  PPL_ASSERT(j < m_i.row_size());
+  PPL_ASSERT(denom != 0);
+#endif
+  PPL_DIRTY_TEMP(N, k);
+  div_round_up(k, numer, denom);
+  add_octagonal_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+         i_end = cs.end(); i != i_end; ++i)
+    add_constraint(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    add_congruence(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraint(const Constraint& c) {
+  // Dimension-compatibility check.
+  if (c.space_dimension() > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  if (!marked_empty())
+    refine_no_check(c);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_constraints(cs)",
+                           "cs and *this are space-dimension incompatible");
+
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  if (!marked_empty())
+    refine_no_check(cg);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_congruences(cgs)",
+                           "cgs and *this are space-dimension incompatible");
+
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::refine_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  if (cg.is_proper_congruence()) {
+    if (cg.is_inconsistent())
+      set_empty();
+    // Other proper congruences are just ignored.
+    return;
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check.
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimension(nd)",
+                                 new_dimension);
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from an octagon in a 0-dim space.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  strong_closure_assign();
+  matrix.shrink(new_dimension);
+  // When we remove all dimensions from a non-empty octagon,
+  // we obtain the zero-dimensional universe octagon.
+  if (new_dimension == 0 && !marked_empty())
+    set_zero_dim_univ();
+  space_dim = new_dimension;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::wrap_assign(const Variables_Set& vars,
+                                Bounded_Integer_Type_Width w,
+                                Bounded_Integer_Type_Representation r,
+                                Bounded_Integer_Type_Overflow o,
+                                const Constraint_System* cs_p,
+                                unsigned complexity_threshold,
+                                bool wrap_individually) {
+  Implementation::wrap_assign(*this,
+                              vars, w, r, o, cs_p,
+                              complexity_threshold, wrap_individually,
+                              "Octagonal_Shape");
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::widening_assign(const Octagonal_Shape& y, unsigned* tp) {
+  BHMZ05_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                              unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+                            stop_points,
+                            stop_points
+                            + sizeof(stop_points)/sizeof(stop_points[0]),
+                            tp);
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::time_elapse_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // Compute time-elapse on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.time_elapse_assign(ph_y);
+  Octagonal_Shape<T> x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+Octagonal_Shape<T>::strictly_contains(const Octagonal_Shape& y) const {
+  const Octagonal_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::generalized_refine_with_linear_form_inequality(
+                    const Linear_Form< Interval<T, Interval_Info> >& left,
+                    const Linear_Form< Interval<T, Interval_Info> >& right,
+                    const Relation_Symbol relsym) {
+  switch (relsym) {
+  case EQUAL:
+    // TODO: see if we can handle this case more efficiently.
+    refine_with_linear_form_inequality(left, right);
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case LESS_THAN:
+  case LESS_OR_EQUAL:
+    refine_with_linear_form_inequality(left, right);
+    break;
+  case GREATER_THAN:
+  case GREATER_OR_EQUAL:
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case NOT_EQUAL:
+    break;
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+Octagonal_Shape<T>::
+refine_fp_interval_abstract_store(
+          Box< Interval<T, Interval_Info> >& store) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::refine_fp_interval_abstract_store:"
+                     " T not a floating point type.");
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  store.intersection_assign(Box<FP_Interval_Type>(*this));
+
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Octagonal_Shape<T>& x,
+                            const Octagonal_Shape<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return rectilinear_distance_assign(r, x.matrix, y.matrix, dir,
+                                     tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Octagonal_Shape<T>& x,
+                            const Octagonal_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const Octagonal_Shape<T>& x,
+                            const Octagonal_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Octagonal_Shape<T>& x,
+                          const Octagonal_Shape<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return euclidean_distance_assign(r, x.matrix, y.matrix, dir,
+                                   tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Octagonal_Shape<T>& x,
+                          const Octagonal_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const Octagonal_Shape<T>& x,
+                          const Octagonal_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Octagonal_Shape<T>& x,
+                           const Octagonal_Shape<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  // Dimension-compatibility check.
+  if (x.space_dim != y.space_dim)
+    return false;
+
+  // Zero-dim OSs are equal if and only if they are both empty or universe.
+  if (x.space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires strong closure.
+  x.strong_closure_assign();
+  y.strong_closure_assign();
+
+  // If one of two OSs is empty, then they are equal if and only if
+  // the other OS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return l_infinity_distance_assign(r, x.matrix, y.matrix, dir,
+                                    tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Octagonal_Shape<T>& x,
+                           const Octagonal_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates Octagonal_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const Octagonal_Shape<T>& x,
+                           const Octagonal_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline memory_size_type
+Octagonal_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+Octagonal_Shape<T>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+inline void
+Octagonal_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+  if (!is_integer(elem)) {
+#ifndef NDEBUG
+    Result r =
+#endif
+    floor_assign_r(elem, elem, ROUND_DOWN);
+    PPL_ASSERT(r == V_EQ);
+    reset_strongly_closed();
+  }
+}
+
+/*! \relates Octagonal_Shape */
+template <typename T>
+inline void
+swap(Octagonal_Shape<T>& x, Octagonal_Shape<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_templates.hh line 1. */
+/* Octagonal_Shape class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_templates.hh line 35. */
+#include <vector>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Polyhedron& ph,
+                                    const Complexity_Class complexity)
+  : matrix(0), space_dim(0), status() {
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = Octagonal_Shape(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = Octagonal_Shape(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  PPL_ASSERT(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = Octagonal_Shape(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our OSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality()) {
+          Linear_Expression expr(c.expression());
+          lp.add_constraint(expr >= 0);
+        }
+        else
+          lp.add_constraint(c);
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = Octagonal_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Start with a universe OS that will be refined by the simplex.
+    *this = Octagonal_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    PPL_DIRTY_TEMP_COEFFICIENT(numer);
+    PPL_DIRTY_TEMP_COEFFICIENT(denom);
+    for (dimension_type i = 0; i < num_dimensions; ++i) {
+      Variable x(i);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        numer *= 2;
+        div_round_up(matrix[2*i + 1][2*i], numer, denom);
+      }
+      // Evaluate optimal upper bounds for `x + y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(x + y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(matrix[2*i + 1][2*j], numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(((i < j) ?
+                        matrix[2*j][2*i]
+                        : matrix[2*i + 1][2*j + 1]),
+                       numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `y - x <= ub'.
+      for (dimension_type j = 0; j < num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(((i < j)
+                        ? matrix[2*j][2*i]
+                        : matrix[2*i + 1][2*j + 1]),
+                       numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `-x - y <= ub'.
+      for (dimension_type j = 0; j < i; ++j) {
+        Variable y(j);
+        lp.set_objective_function(-x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(matrix[2*i][2*j + 1], numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        numer *= 2;
+        div_round_up(matrix[2*i][2*i + 1], numer, denom);
+      }
+    }
+    set_strongly_closed();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+  *this = Octagonal_Shape(num_dimensions, UNIVERSE);
+  refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+Octagonal_Shape<T>::Octagonal_Shape(const Generator_System& gs)
+  : matrix(gs.space_dimension()),
+    space_dim(gs.space_dimension()),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty polyhedron.
+    set_empty();
+    return;
+  }
+
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typename OR_Matrix<N>::row_iterator mat_begin = matrix.row_begin();
+
+  PPL_DIRTY_TEMP(N, tmp);
+  bool mat_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!mat_initialized) {
+        // When handling the first (closure) point, we initialize the matrix.
+        mat_initialized = true;
+        const Coefficient& d = g.divisor();
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the hyperplanes passing in the point
+            // and having the octagonal gradient.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplanes: X_i - X_j = P_i - P_j.
+            div_round_up(x_i[dj], g_j - g_i, d);
+            div_round_up(x_ii[dj + 1], g_i - g_j, d);
+            // Hyperplanes: X_i + X_j = P_i + P_j.
+            div_round_up(x_i[dj + 1], -g_j - g_i, d);
+            div_round_up(x_ii[dj], g_i + g_j, d);
+          }
+          // Hyperplanes: X_i = P_i.
+          div_round_up(x_i[di + 1], -g_i - g_i, d);
+          div_round_up(x_ii[di], g_i + g_i, d);
+        }
+      }
+      else {
+        // This is not the first point: the matrix already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any point the straight lines passing in the point
+            // and having the octagonal gradient; compute maxima values.
+            // Let be P = [P_1, P_2, ..., P_n] point.
+            // Hyperplane: X_i - X_j = max (P_i - P_j, const).
+            div_round_up(tmp, g_j - g_i, d);
+            max_assign(x_i[dj], tmp);
+            div_round_up(tmp, g_i - g_j, d);
+            max_assign(x_ii[dj + 1], tmp);
+            // Hyperplane: X_i + X_j = max (P_i + P_j, const).
+            div_round_up(tmp, -g_j - g_i, d);
+            max_assign(x_i[dj + 1], tmp);
+            div_round_up(tmp, g_i + g_j, d);
+            max_assign(x_ii[dj], tmp);
+          }
+          // Hyperplane: X_i = max (P_i, const).
+          div_round_up(tmp, -g_i - g_i, d);
+          max_assign(x_i[di + 1], tmp);
+          div_round_up(tmp, g_i + g_i, d);
+          max_assign(x_ii[di], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw_invalid_argument("Octagonal_Shape(gs)",
+                           "the non-empty generator system gs "
+                           "contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator k = gs_begin; k != gs_end; ++k) {
+    const Generator& g = *k;
+    switch (g.type()) {
+    case Generator::LINE:
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any line the right limit.
+            if (g_i != g_j) {
+              // Hyperplane: X_i - X_j <=/>= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            if (g_i != -g_j) {
+              // Hyperplane: X_i + X_j <=/>= +Inf.
+              assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          if (g_i != 0) {
+            // Hyperplane: X_i <=/>= +Inf.
+            assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+        }
+      break;
+    case Generator::RAY:
+        // TODO: This can be optimized more, if needed, exploiting the
+        // (possible) sparseness of g. Also consider if OR_Matrix should be
+        // sparse, too.
+        for (dimension_type i = 0; i < space_dim; ++i) {
+          const Coefficient& g_i = g.coefficient(Variable(i));
+          const dimension_type di = 2*i;
+          row_reference x_i = *(mat_begin + di);
+          row_reference x_ii = *(mat_begin + (di + 1));
+          for (dimension_type j = 0; j < i; ++j) {
+            const Coefficient& g_j = g.coefficient(Variable(j));
+            const dimension_type dj = 2*j;
+            // Set for any ray the right limit in the case
+            // of the binary constraints.
+            if (g_i < g_j)
+              // Hyperplane: X_i - X_j >= +Inf.
+              assign_r(x_i[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > g_j)
+              // Hyperplane: X_i - X_j <= +Inf.
+              assign_r(x_ii[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i < -g_j)
+              // Hyperplane: X_i + X_j >= +Inf.
+              assign_r(x_i[dj + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            if (g_i > -g_j)
+              // Hyperplane: X_i + X_j <= +Inf.
+              assign_r(x_ii[dj], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          }
+          // Case: unary constraints.
+          if (g_i < 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_i[di + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+          if (g_i > 0)
+            // Hyperplane: X_i  = +Inf.
+            assign_r(x_ii[di], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        }
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  // Get rid of strict inequalities.
+  if (c.is_strict_inequality()) {
+    if (c.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    if (c.is_tautological())
+      return;
+    // Nontrivial strict inequalities are not allowed.
+    throw_invalid_argument("add_constraint(c)",
+                           "strict inequalities are not allowed");
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  // Constraints that are not octagonal differences are not allowed.
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c_space_dim, num_vars,
+                                   i, j, coeff, term))
+    throw_invalid_argument("add_constraint(c)",
+                           "c is not an octagonal constraint");
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint (not a strict inequality).
+    if (c.inhomogeneous_term() < 0
+        || (c.is_equality() && c.inhomogeneous_term() != 0))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i % 2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    using namespace Implementation::Octagonal_Shapes;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
+
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dimension() < cg_space_dim)
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  // Handle the case of proper congruences first.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_tautological())
+      return;
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    // Non-trivial and proper congruences are not allowed.
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is a non-trivial, proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  add_constraint(c);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::refine_with_linear_form_inequality(
+                    const Linear_Form< Interval<T, Interval_Info> >& left,
+                    const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+                     " T not a floating point type.");
+
+  // We assume that the analyzer will not try to apply an unreachable filter.
+  PPL_ASSERT(!marked_empty());
+
+  // Dimension-compatibility checks.
+  // The dimensions of `left' and `right' should not be greater than the
+  // dimension of `*this'.
+  const dimension_type left_space_dim = left.space_dimension();
+  if (space_dim < left_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "left", left);
+
+  const dimension_type right_space_dim = right.space_dimension();
+  if (space_dim < right_space_dim)
+    throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "right", right);
+
+  // Number of non-zero coefficients in `left': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type left_t = 0;
+  // Variable-index of the last non-zero coefficient in `left', if any.
+  dimension_type left_w_id = 0;
+  // Number of non-zero coefficients in `right': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type right_t = 0;
+  // Variable-index of the last non-zero coefficient in `right', if any.
+  dimension_type right_w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `left'.
+  for (dimension_type i = left_space_dim; i-- > 0; )
+    if (left.coefficient(Variable(i)) != 0) {
+      if (left_t++ == 1)
+        break;
+      else
+        left_w_id = i;
+    }
+
+  // Get information about the number of non-zero coefficients in `right'.
+  for (dimension_type i = right_space_dim; i-- > 0; )
+    if (right.coefficient(Variable(i)) != 0) {
+      if (right_t++ == 1)
+        break;
+      else
+        right_w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  // FIXME: there is plenty of duplicate code in the following lines. We could
+  // shorten it at the expense of a bit of efficiency.
+
+  if (left_t == 0) {
+    if (right_t == 0) {
+      // The constraint involves constants only. Ignore it: it is up to
+      // the analyzer to handle it.
+      PPL_ASSERT(OK());
+      return;
+    }
+
+    if (right_t == 1) {
+      // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+      // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+      if (right_w_coeff == 1) {
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_right, n_right + 1, b_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      if (right_w_coeff == -1) {
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(b_plus_minus_a_minus, b_plus_minus_a_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_right + 1, n_right, b_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+  else if (left_t == 1) {
+    if (right_t == 0) {
+      // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+      // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+                              left.coefficient(Variable(left_w_id));
+      if (left_w_coeff == 1) {
+        const dimension_type n_left = left_w_id * 2;
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      if (left_w_coeff == -1) {
+        const dimension_type n_left = left_w_id * 2;
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        mul_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                          ROUND_UP);
+        add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+
+    if (right_t == 1) {
+      // The constraint has the form
+      // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+      // Reduce it to the constraint +/-x +/-y <= c+ - a-
+      // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+                              left.coefficient(Variable(left_w_id));
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+      bool is_left_coeff_one = (left_w_coeff == 1);
+      bool is_left_coeff_minus_one = (left_w_coeff == -1);
+      bool is_right_coeff_one = (right_w_coeff == 1);
+      bool is_right_coeff_minus_one = (right_w_coeff == -1);
+      if (left_w_id == right_w_id) {
+        if ((is_left_coeff_one && is_right_coeff_one)
+            || (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+          // Here we have an identity or a constants-only constraint.
+          PPL_ASSERT(OK());
+          return;
+        }
+        if (is_left_coeff_one && is_right_coeff_minus_one) {
+          // We fall back to a previous case
+          // (but we do not need to multiply the result by two).
+          const dimension_type n_left = left_w_id * 2;
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          add_octagonal_constraint(n_left + 1, n_left, a_plus_minus_b_minus);
+          PPL_ASSERT(OK());
+          return;
+        }
+        if (is_left_coeff_minus_one && is_right_coeff_one) {
+          // We fall back to a previous case
+          // (but we do not need to multiply the result by two).
+          const dimension_type n_left = left_w_id * 2;
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          add_octagonal_constraint(n_left, n_left + 1, a_plus_minus_b_minus);
+          PPL_ASSERT(OK());
+          return;
+        }
+      }
+      else if (is_left_coeff_one && is_right_coeff_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right, n_left, c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left + 1, n_right + 1,
+                                   c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+      if (is_left_coeff_one && is_right_coeff_minus_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right + 1, n_left, c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left + 1, n_right, c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+      if (is_left_coeff_minus_one && is_right_coeff_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right, n_left + 1, c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left, n_right + 1, c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+      if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+        const dimension_type n_left = left_w_id * 2;
+        const dimension_type n_right = right_w_id * 2;
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        if (left_w_id < right_w_id)
+          add_octagonal_constraint(n_right + 1, n_left + 1,
+                                   c_plus_minus_a_minus);
+        else
+          add_octagonal_constraint(n_left, n_right, c_plus_minus_a_minus);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+
+  // FIRST, update the binary constraints for each pair of DIFFERENT variables
+  // in `left' and `right'.
+
+  // Declare temporaries outside of the loop.
+  PPL_DIRTY_TEMP(N, low_coeff);
+  PPL_DIRTY_TEMP(N, high_coeff);
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  Linear_Form<FP_Interval_Type> right_minus_left(right);
+  right_minus_left -= left;
+
+  dimension_type max_w_id = std::max(left_w_id, right_w_id);
+  for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+    for (dimension_type second_v = first_v + 1;
+         second_v <= max_w_id; ++second_v) {
+      const FP_Interval_Type& lfv_coefficient =
+                        left.coefficient(Variable(first_v));
+      const FP_Interval_Type& lsv_coefficient =
+                        left.coefficient(Variable(second_v));
+      const FP_Interval_Type& rfv_coefficient =
+                        right.coefficient(Variable(first_v));
+      const FP_Interval_Type& rsv_coefficient =
+                        right.coefficient(Variable(second_v));
+      // We update the constraints only when both variables appear in at
+      // least one argument.
+      bool do_update = false;
+      assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0) {
+        assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0)
+          do_update = true;
+        else {
+          assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+        }
+      }
+      else {
+        assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0) {
+          assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+          else {
+            assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+            assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+            if (low_coeff != 0 || high_coeff != 0)
+              do_update = true;
+          }
+        }
+      }
+
+      if (do_update) {
+        Variable first(first_v);
+        Variable second(second_v);
+        dimension_type n_first_var = first_v * 2;
+        dimension_type n_second_var = second_v * 2;
+        linear_form_upper_bound(right_minus_left - first + second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var + 1, n_first_var + 1,
+                                 upper_bound);
+        linear_form_upper_bound(right_minus_left + first + second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var + 1, n_first_var, upper_bound);
+        linear_form_upper_bound(right_minus_left - first - second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var, n_first_var + 1, upper_bound);
+        linear_form_upper_bound(right_minus_left + first - second,
+                                upper_bound);
+        add_octagonal_constraint(n_second_var, n_first_var, upper_bound);
+      }
+    }
+  }
+
+  // Finally, update the unary constraints.
+  for (dimension_type v = 0; v <= max_w_id; ++v) {
+    const FP_Interval_Type& lv_coefficient =
+                        left.coefficient(Variable(v));
+    const FP_Interval_Type& rv_coefficient =
+                        right.coefficient(Variable(v));
+    // We update the constraints only if v appears in at least one of the
+    // two arguments.
+    bool do_update = false;
+    assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (low_coeff != 0 || high_coeff != 0)
+      do_update = true;
+    else {
+      assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0)
+        do_update = true;
+    }
+
+    if (do_update) {
+      Variable var(v);
+      dimension_type n_var = 2 * v;
+      /*
+        VERY DIRTY trick: since we need to keep the old unary constraints
+        while computing the new ones, we momentarily keep the new coefficients
+        in the main diagonal of the matrix. They will be moved later.
+      */
+      linear_form_upper_bound(right_minus_left + var, upper_bound);
+      mul_2exp_assign_r(matrix[n_var + 1][n_var + 1], upper_bound, 1,
+                        ROUND_UP);
+      linear_form_upper_bound(right_minus_left - var, upper_bound);
+      mul_2exp_assign_r(matrix[n_var][n_var], upper_bound, 1,
+                        ROUND_UP);
+    }
+  }
+
+  /*
+    Now move the newly computed coefficients from the main diagonal to
+    their proper place, and restore +infinity on the diagonal.
+  */
+  row_iterator m_ite = matrix.row_begin();
+  row_iterator m_end = matrix.row_end();
+  for (dimension_type i = 0; m_ite != m_end; i += 2) {
+    row_reference upper = *m_ite;
+    N& ul = upper[i];
+    add_octagonal_constraint(i, i + 1, ul);
+    assign_r(ul, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    ++m_ite;
+    row_reference lower = *m_ite;
+    N& lr = lower[i + 1];
+    add_octagonal_constraint(i + 1, i, lr);
+    assign_r(lr, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    ++m_ite;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  const dimension_type c_space_dim = c.space_dimension();
+  PPL_ASSERT(c_space_dim <= space_dim);
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  // Constraints that are not octagonal differences are ignored.
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c_space_dim, num_vars,
+                                   i, j, coeff, term))
+    return;
+
+  if (num_vars == 0) {
+    const Coefficient& c_inhomo = c.inhomogeneous_term();
+    // Dealing with a trivial constraint (maybe a strict inequality).
+    if (c_inhomo < 0
+        || (c_inhomo != 0 && c.is_equality())
+        || (c_inhomo == 0 && c.is_strict_inequality()))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of constraint.
+  typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::row_reference_type m_i = *i_iter;
+  N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  bool is_oct_changed = false;
+  // Compute the bound for `m_i_j', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, term, coeff);
+  if (m_i_j > d) {
+    m_i_j = d;
+    is_oct_changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Select the cell to be modified for the ">=" part of constraint.
+    if (i % 2 == 0)
+      ++i_iter;
+    else
+      --i_iter;
+
+    typename OR_Matrix<N>::row_reference_type m_ci = *i_iter;
+    using namespace Implementation::Octagonal_Shapes;
+    dimension_type cj = coherent_index(j);
+    N& m_ci_cj = m_ci[cj];
+    // Also compute the bound for `m_ci_cj', rounding towards plus infinity.
+    neg_assign(term);
+    div_round_up(d, term, coeff);
+    if (m_ci_cj > d) {
+      m_ci_cj = d;
+      is_oct_changed = true;
+    }
+  }
+
+  // This method does not preserve closure.
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+dimension_type
+Octagonal_Shape<T>::affine_dimension() const {
+  const dimension_type n_rows = matrix.num_rows();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (n_rows == 0)
+    return 0;
+
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `leaders' is used to represent non-singular
+  // equivalence classes:
+  // `leaders[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class).
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  // Due to the splitting of variables, the affine dimension is the
+  // number of non-singular positive zero-equivalence classes.
+  dimension_type affine_dim = 0;
+  for (dimension_type i = 0; i < n_rows; i += 2)
+    // Note: disregard the singular equivalence class.
+    if (leaders[i] == i && leaders[i + 1] == i + 1)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+Octagonal_Shape<T>::minimized_congruences() const {
+  // Strong closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  strong_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+    return cgs;
+  }
+
+  if (marked_empty()) {
+    cgs.insert(Congruence::zero_dim_false());
+    return cgs;
+  }
+
+  // The vector `leaders' is used to represent equivalence classes:
+  // `leaders[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class).
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  for (dimension_type i = 0, i_end = 2*space_dim; i != i_end; i += 2) {
+    const dimension_type lead_i = leaders[i];
+    if (i == lead_i) {
+      if (leaders[i + 1] == i)
+        // `i' is the leader of the singular equivalence class.
+        goto singular;
+      else
+        // `i' is the leader of a non-singular equivalence class.
+        continue;
+    }
+    else {
+      // `i' is not a leader.
+      if (leaders[i + 1] == lead_i)
+        // `i' belongs to the singular equivalence class.
+        goto singular;
+      else
+        // `i' does not belong to the singular equivalence class.
+        goto non_singular;
+    }
+
+  singular:
+    // `i' belongs to the singular equivalence class:
+    // we have a unary equality constraint.
+    {
+      const Variable x(i/2);
+      const N& c_ii_i = matrix[i + 1][i];
+#ifndef NDEBUG
+      const N& c_i_ii = matrix[i][i + 1];
+      PPL_ASSERT(is_additive_inverse(c_i_ii, c_ii_i));
+#endif
+      numer_denom(c_ii_i, numer, denom);
+      denom *= 2;
+      cgs.insert(denom*x == numer);
+    }
+    continue;
+
+  non_singular:
+    // `i' does not belong to the singular equivalence class.
+    // we have a binary equality constraint.
+    {
+      const N& c_i_li = matrix[i][lead_i];
+#ifndef NDEBUG
+      using namespace Implementation::Octagonal_Shapes;
+      const N& c_ii_lii = matrix[i + 1][coherent_index(lead_i)];
+      PPL_ASSERT(is_additive_inverse(c_ii_lii, c_i_li));
+#endif
+      const Variable x(lead_i/2);
+      const Variable y(i/2);
+      numer_denom(c_i_li, numer, denom);
+      if (lead_i % 2 == 0)
+        cgs.insert(denom*x - denom*y == numer);
+      else
+        cgs.insert(denom*x + denom*y + numer == 0);
+    }
+    continue;
+  }
+  return cgs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::concatenate_assign(const Octagonal_Shape& y) {
+  // If `y' is an empty 0-dim space octagon, let `*this' become empty.
+  // If `y' is an universal 0-dim space octagon, we simply return.
+  if (y.space_dim == 0) {
+    if (y.marked_empty())
+      set_empty();
+    return;
+  }
+
+  // If `*this' is an empty 0-dim space octagon, then it is sufficient
+  // to adjust the dimension of the vector space.
+  if (space_dim == 0 && marked_empty()) {
+    add_space_dimensions_and_embed(y.space_dim);
+    return;
+  }
+
+  // This is the old number of rows in the matrix. It is equal to
+  // the first index of columns to change.
+  dimension_type old_num_rows = matrix.num_rows();
+  // First we increase the space dimension of `*this' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new octagon is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // (where they are at the present) and placing the constraints of `y' in the
+  // lower right-hand side.
+  add_space_dimensions_and_embed(y.space_dim);
+  typename OR_Matrix<N>::const_element_iterator
+    y_it = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::row_iterator
+         i = matrix.row_begin() + old_num_rows,
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::row_reference_type r = *i;
+    dimension_type rs_i = i.row_size();
+    for (dimension_type j = old_num_rows; j < rs_i; ++j, ++y_it)
+      r[j] = *y_it;
+  }
+
+  // The concatenation does not preserve the closure.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("contains(y)", y);
+
+  if (space_dim == 0) {
+    // The zero-dimensional empty octagon only contains another
+    // zero-dimensional empty octagon.
+    // The zero-dimensional universe octagon contains any other
+    // zero-dimensional octagon.
+    return marked_empty() ? y.marked_empty() : true;
+  }
+
+  // `y' needs to be transitively closed.
+  y.strong_closure_assign();
+  // An empty octagon is in any other dimension-compatible octagons.
+  if (y.marked_empty())
+    return true;
+
+  // If `*this' is empty it can not contain `y' (which is not empty).
+  if (is_empty())
+    return false;
+
+  // `*this' contains `y' if and only if every element of `*this'
+  // is greater than or equal to the correspondent one of `y'.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), j = y.matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end; ++i, ++j)
+    if (*i < *j)
+      return false;
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_disjoint_from(const Octagonal_Shape& y) const {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If one Octagonal_Shape is empty, the Octagonal_Shapes are disjoint.
+  strong_closure_assign();
+  if (marked_empty())
+    return true;
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return true;
+
+  // Two Octagonal_Shapes are disjoint if and only if their
+  // intersection is empty, i.e., if and only if there exists a
+  // variable such that the upper bound of the constraint on that
+  // variable in the first Octagonal_Shape is strictly less than the
+  // lower bound of the corresponding constraint in the second
+  // Octagonal_Shape or vice versa.
+
+  const dimension_type n_rows = matrix.num_rows();
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+
+  const row_iterator y_begin = y.matrix.row_begin();
+
+  PPL_DIRTY_TEMP(N, neg_y_ci_cj);
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    row_reference m_i = *i_iter;
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      row_reference m_cj = *(m_begin + cj);
+      const N& m_i_j = (j < rs_i) ? m_i[j] : m_cj[ci];
+      row_reference y_ci = *(y_begin + ci);
+      row_reference y_j = *(y_begin + j);
+      const N& y_ci_cj = (j < rs_i) ? y_ci[cj] : y_j[i];
+      neg_assign_r(neg_y_ci_cj, y_ci_cj, ROUND_UP);
+      if (m_i_j < neg_y_ci_cj)
+        return true;
+    }
+  }
+  return false;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_universe() const {
+  // An empty octagon is not universe.
+  if (marked_empty())
+    return false;
+
+  // If the octagon is non-empty and zero-dimensional,
+  // then it is necessarily the universe octagon.
+  if (space_dim == 0)
+    return true;
+
+  // An universe octagon can only contains trivial  constraints.
+  for (typename OR_Matrix<N>::const_element_iterator
+         i = matrix.element_begin(), matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i)
+    if (!is_plus_infinity(*i))
+      return false;
+
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_bounded() const {
+  strong_closure_assign();
+  // A zero-dimensional or empty octagon is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  // A bounded octagon never can contains trivial constraints.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    const dimension_type i_index = i.index();
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (i_index != j)
+        if (is_plus_infinity(x_i[j]))
+          return false;
+  }
+
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::contains_integer_point() const {
+  // Force strong closure.
+  if (is_empty())
+    return false;
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
+
+  // A strongly closed and consistent Octagonal_Shape defined by
+  // integer constraints can only be empty due to tight coherence.
+  if (std::numeric_limits<T>::is_integer)
+    return !tight_coherence_would_make_empty();
+
+  // Build an integer Octagonal_Shape oct_z with bounds at least as
+  // tight as those in *this and then recheck for emptiness, also
+  // exploiting tight-coherence.
+  Octagonal_Shape<mpz_class> oct_z(space_dim);
+  oct_z.reset_strongly_closed();
+
+  typedef Octagonal_Shape<mpz_class>::N Z;
+  bool all_integers = true;
+  typename OR_Matrix<N>::const_element_iterator x_i = matrix.element_begin();
+  for (typename OR_Matrix<Z>::element_iterator
+         z_i = oct_z.matrix.element_begin(),
+         z_end = oct_z.matrix.element_end(); z_i != z_end; ++z_i, ++x_i) {
+    const N& d = *x_i;
+    if (is_plus_infinity(d))
+      continue;
+    if (is_integer(d))
+      assign_r(*z_i, d, ROUND_NOT_NEEDED);
+    else {
+      all_integers = false;
+      assign_r(*z_i, d, ROUND_DOWN);
+    }
+  }
+  // Restore strong closure.
+  if (all_integers)
+    // oct_z unchanged, so it is still strongly closed.
+    oct_z.set_strongly_closed();
+  else {
+    // oct_z changed: recompute strong closure.
+    oct_z.strong_closure_assign();
+    if (oct_z.marked_empty())
+      return false;
+  }
+  return !oct_z.tight_coherence_would_make_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::frequency(const Linear_Expression& expr,
+                              Coefficient& freq_n, Coefficient& freq_d,
+                              Coefficient& val_n, Coefficient& val_d) const {
+  dimension_type space_dim = space_dimension();
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Check if `expr' has a constant value.
+  // If it is constant, set the frequency `freq_n' to 0
+  // and return true. Otherwise the values for \p expr
+  // are not discrete so return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 0 and the value is the inhomogeneous term.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  strong_closure_assign();
+  // For an empty Octagonal shape, we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The Octagonal shape has at least 1 dimension and is not empty.
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff_j);
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  Linear_Expression le = expr;
+  // Boolean to keep track of a variable `v' in expression `le'.
+  // If we can replace `v' by an expression using variables other
+  // than `v' and are already in `le', then this is set to true.
+  bool constant_v = false;
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+  val_denom = 1;
+
+  for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+    constant_v = false;
+    dimension_type i = i_iter.index();
+    const Variable v(i/2);
+    coeff = le.coefficient(v);
+    if (coeff == 0) {
+      constant_v = true;
+      continue;
+    }
+    // We check the unary constraints.
+    row_reference m_i = *i_iter;
+    row_reference m_ii = *(i_iter + 1);
+    const N& m_i_ii = m_i[i + 1];
+    const N& m_ii_i = m_ii[i];
+    if ((!is_plus_infinity(m_i_ii) && !is_plus_infinity(m_ii_i))
+        && (is_additive_inverse(m_i_ii, m_ii_i))) {
+      // If `v' is constant, replace it in `le' by the value.
+      numer_denom(m_i_ii, numer, denom);
+      denom *= 2;
+      le -= coeff*v;
+      le *= denom;
+      le -= numer*coeff;
+      val_denom *= denom;
+      constant_v = true;
+      continue;
+    }
+    // Check the octagonal constraints between `v' and the other dimensions
+    // that have non-zero coefficient in `le'.
+    else {
+      PPL_ASSERT(!constant_v);
+      using namespace Implementation::Octagonal_Shapes;
+      const dimension_type ci = coherent_index(i);
+      for (row_iterator j_iter = i_iter; j_iter != m_end; j_iter += 2) {
+        dimension_type j = j_iter.index();
+        const Variable vj(j/2);
+        coeff_j = le.coefficient(vj);
+        if (coeff_j == 0)
+          // The coefficient in `le' is 0, so do nothing.
+          continue;
+        const dimension_type cj = coherent_index(j);
+        const dimension_type cjj = coherent_index(j + 1);
+
+        row_reference m_j = *(m_begin + j);
+        row_reference m_cj = *(m_begin + cj);
+        const N& m_j_i = m_j[i];
+        const N& m_i_j = m_cj[ci];
+        if ((!is_plus_infinity(m_i_j) && !is_plus_infinity(m_j_i))
+            && (is_additive_inverse(m_i_j, m_j_i))) {
+          // The coefficient for `vj' in `le' is not 0
+          // and the constraint with `v' is an equality.
+          // So apply this equality to eliminate `v' in `le'.
+          numer_denom(m_i_j, numer, denom);
+          le -= coeff*v;
+          le += coeff*vj;
+          le *= denom;
+          le -= numer*coeff;
+          val_denom *= denom;
+          constant_v = true;
+          break;
+        }
+
+        m_j = *(m_begin + (j + 1));
+        m_cj = *(m_begin + cjj);
+        const N& m_j_i1 = m_j[i];
+        const N& m_i_j1 = m_cj[ci];
+        if ((!is_plus_infinity(m_i_j1) && !is_plus_infinity(m_j_i1))
+            && (is_additive_inverse(m_i_j1, m_j_i1))) {
+          // The coefficient for `vj' in `le' is not 0
+          // and the constraint with `v' is an equality.
+          // So apply this equality to eliminate `v' in `le'.
+          numer_denom(m_i_j1, numer, denom);
+          le -= coeff*v;
+          le -= coeff*vj;
+          le *= denom;
+          le -= numer*coeff;
+          val_denom *= denom;
+          constant_v = true;
+          break;
+        }
+      }
+      if (!constant_v)
+        // The expression `expr' is not constant.
+        return false;
+    }
+  }
+  if (!constant_v)
+    // The expression `expr' is not constant.
+    return false;
+
+  // The expression 'expr' is constant.
+  freq_n = 0;
+  freq_d = 1;
+
+  // Reduce `val_n' and `val_d'.
+  normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the octagonal shape.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  // An octagon known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
+
+  // Check whether `var' is syntactically constrained.
+  const dimension_type n_v = 2*(var_space_dim - 1);
+  typename OR_Matrix<N>::const_row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::const_row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::const_row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    if (!is_plus_infinity(r_v[h]) || !is_plus_infinity(r_cv[h]))
+      return true;
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::const_row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::const_row_reference_type r = *m_iter;
+    if (!is_plus_infinity(r[n_v]) || !is_plus_infinity(r[n_v + 1]))
+      return true;
+  }
+
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strong_coherent() const {
+  // This method is only used by method OK() so as to check if a
+  // strongly closed matrix is also strong-coherent, as it must be.
+  const dimension_type num_rows = matrix.num_rows();
+
+  // Allocated here once and for all.
+  PPL_DIRTY_TEMP(N, semi_sum);
+  // The strong-coherence is: for every indexes i and j (and i != j)
+  // matrix[i][j] <= (matrix[i][ci] + matrix[cj][j])/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  for (dimension_type i = num_rows; i-- > 0; ) {
+    typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    using namespace Implementation::Octagonal_Shapes;
+    const N& m_i_ci = m_i[coherent_index(i)];
+    for (dimension_type j = matrix.row_size(i); j-- > 0; )
+      // Note: on the main diagonal only PLUS_INFINITY can occur.
+      if (i != j) {
+        const N& m_cj_j = matrix[coherent_index(j)][j];
+        if (!is_plus_infinity(m_i_ci)
+            && !is_plus_infinity(m_cj_j)) {
+          // Compute (m_i_ci + m_cj_j)/2 into `semi_sum',
+          // rounding the result towards plus infinity.
+          add_assign_r(semi_sum, m_i_ci, m_cj_j, ROUND_UP);
+          div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+          if (m_i[j] > semi_sum)
+            return false;
+        }
+      }
+  }
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::is_strongly_reduced() const {
+  // This method is only used in assertions: efficiency is not a must.
+
+  // An empty octagon is already transitively reduced.
+  if (marked_empty())
+    return true;
+
+  Octagonal_Shape x = *this;
+  // The matrix representing an OS is strongly reduced if, by removing
+  // any constraint, the resulting matrix describes a different OS.
+  for (typename OR_Matrix<N>::const_row_iterator iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); iter != matrix_row_end; ++iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *iter;
+    const dimension_type i = iter.index();
+    for (dimension_type j = iter.row_size(); j-- > 0; ) {
+      if (!is_plus_infinity(m_i[j])) {
+        Octagonal_Shape x_copy = *this;
+        assign_r(x_copy.matrix[i][j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (x == x_copy)
+          return false;
+      }
+    }
+  }
+  // The octagon is just reduced.
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::bounds(const Linear_Expression& expr,
+                           const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+  strong_closure_assign();
+
+  // A zero-dimensional or empty octagon bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
+
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (from_above) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  if (Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                   i, j, coeff, term)) {
+    if (num_vars == 0)
+      return true;
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    return !is_plus_infinity(m_i[j]);
+  }
+  else {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode mode_bounds =
+      from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The constraint `c' is used to check if `expr' is an octagonal difference
+  // and, in this case, to select the cell.
+  const Constraint& c = (maximize) ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c.space_dimension(), num_vars,
+                                   i, j, coeff, term)) {
+    // `c' is not an octagonal constraint: use the MIP solver.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // `c' is an octagonal constraint.
+    if (num_vars == 0) {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+
+    // Select the cell to be checked.
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    PPL_DIRTY_TEMP(N, d);
+    if (!is_plus_infinity(m_i[j])) {
+      const Coefficient& b = expr.inhomogeneous_term();
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of a variable
+      // of `expr'.
+      PPL_DIRTY_TEMP(N, coeff_expr);
+      const Coefficient& coeff_i = expr.coefficient(Variable(i/2));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+        neg_assign(minus_coeff_i, coeff_i);
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      if (num_vars == 1) {
+        PPL_DIRTY_TEMP(N, m_i_j);
+        div_2exp_assign_r(m_i_j, m_i[j], 1, ROUND_UP);
+        add_mul_assign_r(d, coeff_expr, m_i_j, ROUND_UP);
+      }
+      else
+        add_mul_assign_r(d, coeff_expr, m_i[j], ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
+
+    // The `expr' is unbounded.
+    return false;
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::max_min(const Linear_Expression& expr,
+                            const bool maximize,
+                            Coefficient& ext_n, Coefficient& ext_d,
+                            bool& included, Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim octagons first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  strong_closure_assign();
+  // For an empty OS we simply return false.
+  if (marked_empty())
+    return false;
+  if (!is_universe()) {
+    // We use MIP_Problems to handle constraints that are not
+    // octagonal difference.
+    Optimization_Mode max_min = (maximize) ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      g = mip.optimizing_point();
+      mip.evaluate_objective_function(g, ext_n, ext_d);
+      included = true;
+      return true;
+    }
+  }
+  // The `expr' is unbounded.
+  return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Congruence& cg) const {
+  dimension_type cg_space_dim = cg.space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  // If the congruence is an equality,
+  // find the relation with the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    return relation_with(c);
+  }
+
+  strong_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  // Find the lower bound for a hyperplane with direction
+  // defined by the congruence.
+  Linear_Expression le(cg.expression());
+  PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+  bool min_included;
+  bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+  // If there is no lower bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  // TODO: Consider adding a max_and_min() method, performing both
+  // maximization and minimization so as to possibly exploit
+  // incrementality of the MIP solver.
+
+  // Find the upper bound for a hyperplane with direction
+  // defined by the congruence.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+  bool max_included;
+  bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+  // If there is no upper bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_above)
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is above the lower bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  min_value = min_numer / min_denom;
+  const Coefficient& modulus = cg.modulus();
+  signed_distance = min_value % modulus;
+  min_value -= signed_distance;
+  if (min_value * min_denom < min_numer)
+    min_value += modulus;
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is below the upper bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  max_value = max_numer / max_denom;
+  signed_distance = max_value % modulus;
+  max_value += signed_distance;
+  if (max_value * max_denom > max_numer)
+    max_value -= modulus;
+
+  // If the upper bound value is less than the lower bound value,
+  // then there is an empty intersection with the congruence;
+  // otherwise it will strictly intersect.
+  if (max_value < min_value)
+    return Poly_Con_Relation::is_disjoint();
+  else
+    return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Con_Relation
+Octagonal_Shape<T>::relation_with(const Constraint& c) const {
+  dimension_type c_space_dim = c.space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  // The closure needs to make explicit the implicit constraints.
+  strong_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    // Trivially false zero-dimensional constraint.
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+
+    // Trivially true zero-dimensional constraint.
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(c_term);
+  if (!Octagonal_Shape_Helper
+    ::extract_octagonal_difference(c, c_space_dim, num_vars,
+                                   i, j, coeff, c_term)) {
+    // Constraints that are not octagonal differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le;
+    le.set_space_dimension(c.space_dimension());
+    le.linear_combine(c.expr, Coefficient_one(), Coefficient_one(),
+                      1, c_space_dim + 1);
+
+    PPL_DIRTY_TEMP(Coefficient, max_numer);
+    PPL_DIRTY_TEMP(Coefficient, max_denom);
+    bool max_included;
+    PPL_DIRTY_TEMP(Coefficient, min_numer);
+    PPL_DIRTY_TEMP(Coefficient, min_denom);
+    bool min_included;
+    bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+    bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(min_numer)) {
+      case 1:
+        if (c.is_equality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return Poly_Con_Relation::strictly_intersects();
+        return Poly_Con_Relation::is_included();
+      case -1:
+        return Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        switch (sgn(min_numer)) {
+        case 1:
+          if (c.is_equality())
+            return Poly_Con_Relation::is_disjoint();
+          return Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::strictly_intersects();
+          return Poly_Con_Relation::is_included();
+        case -1:
+          return Poly_Con_Relation::strictly_intersects();
+        }
+        PPL_UNREACHABLE;
+        break;
+      case 0:
+        if (min_numer == 0) {
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
+
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of constraint.
+  typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+  typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+  const N& m_i_j = m_i[j];
+  // Set `coeff' to the absolute value of itself.
+  if (coeff < 0)
+    neg_assign(coeff);
+
+  // Select the cell to be checked for the ">=" part of constraint.
+  // Select the right row of the cell.
+  if (i % 2 == 0)
+    ++i_iter;
+  else
+    --i_iter;
+  typename OR_Matrix<N>::const_row_reference_type m_ci = *i_iter;
+  using namespace Implementation::Octagonal_Shapes;
+  const N& m_ci_cj = m_ci[coherent_index(j)];
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  // The following variables of mpq_class type are used to be precise
+  // when the octagon is defined by integer constraints.
+  PPL_DIRTY_TEMP(mpq_class, q_x);
+  PPL_DIRTY_TEMP(mpq_class, q_y);
+  PPL_DIRTY_TEMP(mpq_class, d);
+  PPL_DIRTY_TEMP(mpq_class, d1);
+  PPL_DIRTY_TEMP(mpq_class, c_denom);
+  PPL_DIRTY_TEMP(mpq_class, q_denom);
+  assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c_term, ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(m_i_j)) {
+    if (!is_plus_infinity(m_ci_cj)) {
+      // `*this' is in the following form:
+      // `-m_ci_cj <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-m_ci_cj > d' (`-m_ci_cj >= d' if c is a strict inequality),
+      // i.e., if `m_ci_cj < d1' (`m_ci_cj <= d1'
+      // if c is a strict inequality).
+      numer_denom(m_ci_cj, numer, denom);
+      assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
+
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
+
+  // Here `m_i_j' is not plus-infinity.
+  numer_denom(m_i_j, numer, denom);
+  assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(m_ci_cj)) {
+    numer_denom(m_ci_cj, numer, denom);
+    assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `m_ci_cj < d1' (`m_ci_cj <= d1' if `c' is a strict inequality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
+
+  // Here `m_ci_cj' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `m_i_j < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
+
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+Octagonal_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The closure needs to make explicit the implicit constraints and if the
+  // octagon is empty.
+  strong_closure_assign();
+
+  // The empty octagon cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe octagon in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
+
+  // The relation between the octagon and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the octagon.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the octagon.
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP_COEFFICIENT(product);
+
+  // We find in `*this' all the constraints.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    row_reference m_i = *i_iter;
+    row_reference m_ii = *(i_iter + 1);
+    const N& m_i_ii = m_i[i + 1];
+    const N& m_ii_i = m_ii[i];
+    // We have the unary constraints.
+    const Variable x(i/2);
+    const Coefficient& g_coeff_x
+      = (x.space_dimension() > g_space_dim)
+      ? Coefficient_zero()
+      : g.coefficient(x);
+    if (is_additive_inverse(m_i_ii, m_ii_i)) {
+      // The constraint has form ax = b.
+      // To satisfy the constraint it is necessary that the scalar product
+      // is not zero. The scalar product has the form
+      // 'denom * g_coeff_x - numer * g.divisor()'.
+      numer_denom(m_ii_i, numer, denom);
+      denom *= 2;
+      product = denom * g_coeff_x;
+      // Note that if the generator `g' is a line or a ray,
+      // its divisor is zero.
+      if (!is_line_or_ray) {
+        neg_assign(numer);
+        add_mul_assign(product, numer, g.divisor());
+      }
+      if (product != 0)
+        return Poly_Gen_Relation::nothing();
+    }
+    // We have 0, 1 or 2 inequality constraints.
+    else {
+      if (!is_plus_infinity(m_i_ii)) {
+        // The constraint has form -ax <= b.
+        // If the generator is a line it's necessary to check if
+        // the scalar product is not zero, if it is positive otherwise.
+        numer_denom(m_i_ii, numer, denom);
+        denom *= -2;
+        product = denom * g_coeff_x;
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer, g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form
+          // '-denom * g.coeff_x - numer * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+      if (!is_plus_infinity(m_ii_i)) {
+        // The constraint has form ax <= b.
+        numer_denom(m_ii_i, numer, denom);
+        denom *= 2;
+        product = denom * g_coeff_x;
+         // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer , g.divisor());
+        }
+        if (is_line && product != 0)
+          return Poly_Gen_Relation::nothing();
+        else
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive and the scalar
+          // product has the form
+          // 'denom * g_coeff_x - numer * g.divisor()'.
+          if (product > 0)
+            return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+
+  // We have the binary constraints.
+  for (row_iterator i_iter = m_begin ; i_iter != m_end; i_iter += 2) {
+    dimension_type i = i_iter.index();
+    row_reference m_i = *i_iter;
+    row_reference m_ii = *(i_iter + 1);
+    for (dimension_type j = 0; j < i; j += 2) {
+      const N& m_i_j = m_i[j];
+      const N& m_ii_jj = m_ii[j + 1];
+      const N& m_ii_j = m_ii[j];
+      const N& m_i_jj = m_i[j + 1];
+      const Variable x(j/2);
+      const Variable y(i/2);
+      const Coefficient& g_coeff_x
+        = (x.space_dimension() > g_space_dim)
+        ? Coefficient_zero()
+        : g.coefficient(x);
+      const Coefficient& g_coeff_y
+        = (y.space_dimension() > g_space_dim)
+        ? Coefficient_zero()
+        : g.coefficient(y);
+
+      const bool difference_is_equality = is_additive_inverse(m_ii_jj, m_i_j);
+      if (difference_is_equality) {
+        // The constraint has form a*x - a*y = b.
+        // The scalar product has the form
+        // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_i_j, numer, denom);
+        product = denom * g_coeff_x;
+        neg_assign(denom);
+        add_mul_assign(product, denom, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_j)) {
+          // The constraint has form a*x - a*y <= b.
+          // The scalar product has the form
+          // 'denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_j, numer, denom);
+          product = denom * g_coeff_x;
+          neg_assign(denom);
+          add_mul_assign(product, denom, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_jj)) {
+          // The constraint has form -a*x + a*y <= b.
+          // The scalar product has the form
+          // '-denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_jj, numer, denom);
+          product = denom * g_coeff_y;
+          neg_assign(denom);
+          add_mul_assign(product, denom, g_coeff_x);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+
+      const bool sum_is_equality = is_additive_inverse(m_i_jj, m_ii_j);
+      if (sum_is_equality) {
+        // The constraint has form a*x + a*y = b.
+        // The scalar product has the form
+        // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+        // To satisfy the constraint it's necessary that the scalar product
+        // is not zero.
+        numer_denom(m_ii_j, numer, denom);
+        product = denom * g_coeff_x;
+        add_mul_assign(product, denom, g_coeff_y);
+        // Note that if the generator `g' is a line or a ray,
+        // its divisor is zero.
+        if (!is_line_or_ray) {
+          neg_assign(numer);
+          add_mul_assign(product, numer, g.divisor());
+        }
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        if (!is_plus_infinity(m_i_jj)) {
+          // The constraint has form -a*x - a*y <= b.
+          // The scalar product has the form
+          // '-denom * coeff_x - denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_i_jj, numer, denom);
+          neg_assign(denom);
+          product = denom * g_coeff_x;
+          add_mul_assign(product, denom, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+        if (!is_plus_infinity(m_ii_j)) {
+          // The constraint has form a*x + a*y <= b.
+          // The scalar product has the form
+          // 'denom * coeff_x + denom * coeff_y - numer * g.divisor()'.
+          // If the generator is not a line it's necessary to check
+          // that the scalar product sign is not positive.
+          numer_denom(m_ii_j, numer, denom);
+          product = denom * g_coeff_x;
+          add_mul_assign(product, denom, g_coeff_y);
+          // Note that if the generator `g' is a line or a ray,
+          // its divisor is zero.
+          if (!is_line_or_ray) {
+            neg_assign(numer);
+            add_mul_assign(product, numer, g.divisor());
+          }
+          if (is_line && product != 0)
+            return Poly_Gen_Relation::nothing();
+          else if (product > 0)
+            return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
+  // If this point is reached the constraint 'g' satisfies
+  // all the constraints in the octagon.
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_closure_assign() const {
+  // Do something only if necessary (zero-dim implies strong closure).
+  if (marked_empty() || marked_strongly_closed() || space_dim == 0)
+    return;
+
+  // Even though the octagon will not change, its internal representation
+  // is going to be modified by the closure algorithm.
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  const dimension_type n_rows = x.matrix.num_rows();
+  const row_iterator m_begin = x.matrix.row_begin();
+  const row_iterator m_end = x.matrix.row_end();
+
+  // Fill the main diagonal with zeros.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
+
+  // This algorithm is given by two steps: the first one is a simple
+  // adaptation of the `shortest-path closure' using the Floyd-Warshall
+  // algorithm; the second one is the `strong-coherence' algorithm.
+  // It is important to note that after the strong-coherence,
+  // the octagon is still shortest-path closed and hence, strongly closed.
+
+  // Recall that, given an index `h', we indicate with `ch' the coherent
+  // index, i.e., the index such that:
+  //   ch = h + 1, if h is an even number;
+  //   ch = h - 1, if h is an odd number.
+
+  typename OR_Matrix<N>::element_iterator iter_ij;
+  std::vector<N> vec_k(n_rows);
+  std::vector<N> vec_ck(n_rows);
+  PPL_DIRTY_TEMP(N, sum1);
+  PPL_DIRTY_TEMP(N, sum2);
+  row_reference x_k;
+  row_reference x_ck;
+  row_reference x_i;
+  row_reference x_ci;
+
+  // Since the index `j' of the inner loop will go from 0 up to `i',
+  // the three nested loops have to be executed twice.
+  for (int twice = 0; twice < 2; ++twice) {
+
+    row_iterator x_k_iter = m_begin;
+    row_iterator x_i_iter = m_begin;
+    for (dimension_type k = 0; k < n_rows; k += 2) {
+      const dimension_type ck = k + 1;
+      // Re-initialize the element iterator.
+      iter_ij = x.matrix.element_begin();
+      // Compute the row references `x_k' and `x_ck'.
+      x_k  = *x_k_iter;
+      ++x_k_iter;
+      x_ck = *x_k_iter;
+      ++x_k_iter;
+
+      for (dimension_type i = 0; i <= k; i += 2) {
+        const dimension_type ci = i + 1;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_k[i];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_k[ci];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ck[i];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_ck[ci];
+      }
+      x_i_iter = x_k_iter;
+      for (dimension_type i = k + 2; i < n_rows; i += 2) {
+        const dimension_type ci = i + 1;
+        x_i = *x_i_iter;
+        ++x_i_iter;
+        x_ci = *x_i_iter;
+        ++x_i_iter;
+        // Storing x_k_i == x_ci_ck.
+        vec_k[i] = x_ci[ck];
+        // Storing x_k_ci == x_i_ck.
+        vec_k[ci] = x_i[ck];
+        // Storing x_ck_i == x_ci_k.
+        vec_ck[i] = x_ci[k];
+        // Storing x_ck_ci == x_i_k.
+        vec_ck[ci] = x_i[k];
+      }
+
+      for (dimension_type i = 0; i < n_rows; ++i) {
+        using namespace Implementation::Octagonal_Shapes;
+        const dimension_type ci = coherent_index(i);
+        const N& vec_k_ci = vec_k[ci];
+        const N& vec_ck_ci = vec_ck[ci];
+        // Unfolding two iterations on `j': this ensures that
+        // the loop exit condition `j <= i' is OK.
+        for (dimension_type j = 0; j <= i; ) {
+          // First iteration: compute
+          //
+          // <CODE>
+          //   sum1 = x_i_k + x_k_j == x_ck_ci + x_k_j;
+          //   sum2 = x_i_ck + x_ck_j == x_k_ci + x_ck_j;
+          // </CODE>
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the first iteration: loop index control.
+          ++j;
+          ++iter_ij;
+          // Second iteration: ditto.
+          add_assign_r(sum1, vec_ck_ci, vec_k[j], ROUND_UP);
+          add_assign_r(sum2, vec_k_ci, vec_ck[j], ROUND_UP);
+          min_assign(sum1, sum2);
+          min_assign(*iter_ij, sum1);
+          // Exiting the second iteration: loop index control.
+          ++j;
+          ++iter_ij;
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value in the main diagonal.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      PPL_ASSERT(sgn(x_i_i) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // Step 2: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_coherence_assign() {
+  // The strong-coherence is: for every indexes i and j
+  // m_i_j <= (m_i_ci + m_cj_j)/2
+  // where ci = i + 1, if i is even number or
+  //       ci = i - 1, if i is odd.
+  // Ditto for cj.
+  PPL_DIRTY_TEMP(N, semi_sum);
+  for (typename OR_Matrix<N>::row_iterator i_iter = matrix.row_begin(),
+         i_end = matrix.row_end(); i_iter != i_end; ++i_iter) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i_iter;
+    const dimension_type i = i_iter.index();
+    using namespace Implementation::Octagonal_Shapes;
+    const N& x_i_ci = x_i[coherent_index(i)];
+    // Avoid to do unnecessary sums.
+    if (!is_plus_infinity(x_i_ci))
+      for (dimension_type j = 0, rs_i = i_iter.row_size(); j < rs_i; ++j)
+        if (i != j) {
+          const N& x_cj_j = matrix[coherent_index(j)][j];
+          if (!is_plus_infinity(x_cj_j)) {
+            add_assign_r(semi_sum, x_i_ci, x_cj_j, ROUND_UP);
+            div_2exp_assign_r(semi_sum, semi_sum, 1, ROUND_UP);
+            min_assign(x_i[j], semi_sum);
+          }
+        }
+  }
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::tight_coherence_would_make_empty() const {
+  PPL_ASSERT(std::numeric_limits<N>::is_integer);
+  PPL_ASSERT(marked_strongly_closed());
+  const dimension_type space_dim = space_dimension();
+  for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+    const dimension_type ci = i + 1;
+    const N& mat_i_ci = matrix[i][ci];
+    if (!is_plus_infinity(mat_i_ci)
+        // Check for oddness of `mat_i_ci'.
+        && !is_even(mat_i_ci)
+        // Check for zero-equivalence of `i' and `ci'.
+        && is_additive_inverse(mat_i_ci, matrix[ci][i]))
+      return true;
+  }
+  return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::tight_closure_assign() {
+  PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+                         "Octagonal_Shape<T>::tight_closure_assign():"
+                         " T in not an integer datatype.");
+  // FIXME: this is just an executable specification.
+  // (The following call could be replaced by shortest-path closure.)
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+  if (tight_coherence_would_make_empty())
+    set_empty();
+  else {
+    // Tighten the unary constraints.
+    PPL_DIRTY_TEMP(N, temp_one);
+    assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+    const dimension_type space_dim = space_dimension();
+    for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+      const dimension_type ci = i + 1;
+      N& mat_i_ci = matrix[i][ci];
+      if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci))
+        sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+      N& mat_ci_i = matrix[ci][i];
+      if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i))
+        sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+    }
+    // Propagate tightened unary constraints.
+    strong_coherence_assign();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::incremental_strong_closure_assign(const Variable var) const {
+  // `var' should be one of the dimensions of the octagon.
+  if (var.id() >= space_dim)
+    throw_dimension_incompatible("incremental_strong_closure_assign(v)",
+                                 var.id());
+
+  // Do something only if necessary.
+  if (marked_empty() || marked_strongly_closed())
+    return;
+
+  Octagonal_Shape& x = const_cast<Octagonal_Shape<T>&>(*this);
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  const row_iterator m_begin = x.matrix.row_begin();
+  const row_iterator m_end = x.matrix.row_end();
+
+  // Fill the main diagonal with zeros.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    PPL_ASSERT(is_plus_infinity((*i)[i.index()]));
+    assign_r((*i)[i.index()], 0, ROUND_NOT_NEEDED);
+  }
+
+  // Using the incremental Floyd-Warshall algorithm.
+  // Step 1: Improve all constraints on variable `var'.
+  const dimension_type v = 2*var.id();
+  const dimension_type cv = v + 1;
+  row_iterator v_iter = m_begin + v;
+  row_iterator cv_iter = v_iter + 1;
+  row_reference x_v = *v_iter;
+  row_reference x_cv = *cv_iter;
+  const dimension_type rs_v = v_iter.row_size();
+  const dimension_type n_rows = x.matrix.num_rows();
+  PPL_DIRTY_TEMP(N, sum);
+  using namespace Implementation::Octagonal_Shapes;
+  for (row_iterator k_iter = m_begin; k_iter != m_end; ++k_iter) {
+    const dimension_type k = k_iter.index();
+    const dimension_type ck = coherent_index(k);
+    const dimension_type rs_k = k_iter.row_size();
+    row_reference x_k = *k_iter;
+    row_reference x_ck = (k % 2 != 0) ? *(k_iter-1) : *(k_iter + 1);
+
+    for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+      const dimension_type i = i_iter.index();
+      const dimension_type ci = coherent_index(i);
+      const dimension_type rs_i = i_iter.row_size();
+      row_reference x_i = *i_iter;
+      row_reference x_ci = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+
+      const N& x_i_k = (k < rs_i) ? x_i[k] : x_ck[ci];
+      if (!is_plus_infinity(x_i_k)) {
+        const N& x_k_v = (v < rs_k) ? x_k[v] : x_cv[ck];
+        if (!is_plus_infinity(x_k_v)) {
+          add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+          N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+          min_assign(x_i_v, sum);
+        }
+        const N& x_k_cv = (cv < rs_k) ? x_k[cv] : x_v[ck];
+        if (!is_plus_infinity(x_k_cv)) {
+          add_assign_r(sum, x_i_k, x_k_cv, ROUND_UP);
+          N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+          min_assign(x_i_cv, sum);
+        }
+      }
+      const N& x_k_i = (i < rs_k) ? x_k[i] : x_ci[ck];
+      if (!is_plus_infinity(x_k_i)) {
+        const N& x_v_k = (k < rs_v) ? x_v[k] : x_ck[cv];
+        if (!is_plus_infinity(x_v_k)) {
+          N& x_v_i = (i < rs_v) ? x_v[i] : x_ci[cv];
+          add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+          min_assign(x_v_i, sum);
+        }
+        const N& x_cv_k = (k < rs_v) ? x_cv[k] : x_ck[v];
+        if (!is_plus_infinity(x_cv_k)) {
+          N& x_cv_i = (i < rs_v) ? x_cv[i] : x_ci[v];
+          add_assign_r(sum, x_cv_k, x_k_i, ROUND_UP);
+          min_assign(x_cv_i, sum);
+        }
+      }
+
+    }
+  }
+
+  // Step 2: improve the other bounds by using the precise bounds
+  // for the constraints on `var'.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ++i_iter) {
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = coherent_index(i);
+    const dimension_type rs_i = i_iter.row_size();
+    row_reference x_i = *i_iter;
+    const N& x_i_v = (v < rs_i) ? x_i[v] : x_cv[ci];
+    // TODO: see if it is possible to optimize this inner loop
+    // by splitting it into several parts, so as to avoid
+    // conditional expressions.
+    for (dimension_type j = 0; j < n_rows; ++j) {
+      const dimension_type cj = coherent_index(j);
+      row_reference x_cj = *(m_begin + cj);
+      N& x_i_j = (j < rs_i) ? x_i[j] : x_cj[ci];
+      if (!is_plus_infinity(x_i_v)) {
+        const N& x_v_j = (j < rs_v) ? x_v[j] : x_cj[cv];
+        if (!is_plus_infinity(x_v_j)) {
+          add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+      const N& x_i_cv = (cv < rs_i) ? x_i[cv] : x_v[ci];
+      if (!is_plus_infinity(x_i_cv)) {
+        const N& x_cv_j = (j < rs_v) ? x_cv[j] : x_cj[v];
+        if (!is_plus_infinity(x_cv_j)) {
+          add_assign_r(sum, x_i_cv, x_cv_j, ROUND_UP);
+          min_assign(x_i_j, sum);
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the octagon is empty if and only if there is a
+  // negative value on the main diagonal.
+  for (row_iterator i = m_begin; i != m_end; ++i) {
+    N& x_i_i = (*i)[i.index()];
+    if (sgn(x_i_i) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      // Restore PLUS_INFINITY on the main diagonal.
+      PPL_ASSERT(sgn(x_i_i) == 0);
+      assign_r(x_i_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // Step 3: we enforce the strong coherence.
+  x.strong_coherence_assign();
+  // The octagon is not empty and it is now strongly closed.
+  x.set_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_successors(std::vector<dimension_type>& successor) const {
+  PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(successor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `successor' is used to indicate which variable
+  // immediately follows a given one in the corresponding equivalence class.
+  const dimension_type successor_size = matrix.num_rows();
+  // Initially, each variable is successor of its own zero-equivalence class.
+  successor.reserve(successor_size);
+  for (dimension_type i = 0; i < successor_size; ++i)
+    successor.push_back(i);
+  // Now compute actual successors.
+  for (dimension_type i = successor_size; i-- > 0; )  {
+    typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin() + i;
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    typename OR_Matrix<N>::const_row_reference_type m_ci
+      = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+    for (dimension_type j = 0; j < i; ++j) {
+      // FIXME: what is the following, commented-out for?
+    //for (dimension_type j = i; j-- > 0; ) {
+      using namespace Implementation::Octagonal_Shapes;
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as successor the variable having the greatest index.
+        successor[j] = i;
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& leaders) const {
+  PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(leaders.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `leaders' is used to indicate the smallest variable
+  // that belongs to the corresponding equivalence class.
+  const dimension_type leader_size = matrix.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  leaders.reserve(leader_size);
+  for (dimension_type i = 0; i < leader_size; ++i)
+    leaders.push_back(i);
+  // Now compute actual leaders.
+  for (typename OR_Matrix<N>::const_row_iterator i_iter = matrix.row_begin(),
+         matrix_row_end = matrix.row_end();
+       i_iter != matrix_row_end; ++i_iter) {
+    typename OR_Matrix<N>::const_row_reference_type m_i = *i_iter;
+    dimension_type i = i_iter.index();
+    typename OR_Matrix<N>::const_row_reference_type m_ci
+      = (i % 2 != 0) ? *(i_iter-1) : *(i_iter + 1);
+    for (dimension_type j = 0; j < i; ++j) {
+      using namespace Implementation::Octagonal_Shapes;
+      dimension_type cj = coherent_index(j);
+      if (is_additive_inverse(m_ci[cj], m_i[j]))
+        // Choose as leader the variable having the smaller index.
+        leaders[i] = leaders[j];
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::compute_leaders(std::vector<dimension_type>& successor,
+                  std::vector<dimension_type>& no_sing_leaders,
+                  bool& exist_sing_class,
+                  dimension_type& sing_leader) const {
+  PPL_ASSERT(!marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(no_sing_leaders.size() == 0);
+  dimension_type successor_size = successor.size();
+  std::deque<bool> dealt_with(successor_size, false);
+  for (dimension_type i = 0; i < successor_size; ++i) {
+    dimension_type next_i = successor[i];
+    if (!dealt_with[i]) {
+      // The index is a leader.
+      // Now check if it is a leader of a singular class or not.
+      using namespace Implementation::Octagonal_Shapes;
+      if (next_i == coherent_index(i)) {
+        exist_sing_class = true;
+        sing_leader = i;
+      }
+      else
+        no_sing_leaders.push_back(i);
+    }
+    // The following index is not a leader.
+    dealt_with[next_i] = true;
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::strong_reduction_assign() const {
+  // Zero-dimensional octagonal shapes are necessarily reduced.
+  if (space_dim == 0)
+    return;
+  strong_closure_assign();
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Detect non-redundant constraints.
+  std::vector<Bit_Row> non_red;
+  non_redundant_matrix_entries(non_red);
+
+  // Throw away redundant constraints.
+  Octagonal_Shape<T>& x = const_cast<Octagonal_Shape<T>&>(*this);
+#ifndef NDEBUG
+  const Octagonal_Shape x_copy_before(x);
+#endif
+  typename OR_Matrix<N>::element_iterator x_i = x.matrix.element_begin();
+  for (dimension_type i = 0; i < 2 * space_dim; ++i) {
+    const Bit_Row& non_red_i = non_red[i];
+    for (dimension_type j = 0,
+           j_end = OR_Matrix<N>::row_size(i); j < j_end; ++j, ++x_i) {
+      if (!non_red_i[j])
+        assign_r(*x_i, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+  x.reset_strongly_closed();
+#ifndef NDEBUG
+  const Octagonal_Shape x_copy_after(x);
+  PPL_ASSERT(x_copy_before == x_copy_after);
+  PPL_ASSERT(x.is_strongly_reduced());
+  PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::non_redundant_matrix_entries(std::vector<Bit_Row>& non_redundant) const {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(space_dim > 0 && !marked_empty() && marked_strongly_closed());
+  PPL_ASSERT(non_redundant.empty());
+
+  // Initialize `non_redundant' as if it was an OR_Matrix of booleans
+  // (initially set to false).
+  non_redundant.resize(2*space_dim);
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is strongly
+  // closed, this happens if and only if matrix[i][j] == -matrix[ci][cj].
+  std::vector<dimension_type> no_sing_leaders;
+  dimension_type sing_leader = 0;
+  bool exist_sing_class = false;
+  std::vector<dimension_type> successor;
+  compute_successors(successor);
+  compute_leaders(successor, no_sing_leaders, exist_sing_class, sing_leader);
+  const dimension_type num_no_sing_leaders = no_sing_leaders.size();
+
+
+  // Step 2: flag redundant constraints in `redundancy'.
+  // Go through non-singular leaders first.
+  for (dimension_type li = 0; li < num_no_sing_leaders; ++li) {
+    const dimension_type i = no_sing_leaders[li];
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type ci = coherent_index(i);
+    typename OR_Matrix<N>::const_row_reference_type
+      m_i = *(matrix.row_begin() + i);
+    if (i % 2 == 0) {
+      // Each positive equivalence class must have a single 0-cycle
+      // connecting all equivalent variables in increasing order.
+      // Note: by coherence assumption, the variables in the
+      // corresponding negative equivalence class are
+      // automatically connected.
+      if (i != successor[i]) {
+        dimension_type j = i;
+        dimension_type next_j = successor[j];
+        while (j != next_j) {
+          non_redundant[next_j].set(j);
+          j = next_j;
+          next_j = successor[j];
+        }
+        const dimension_type cj = coherent_index(j);
+        non_redundant[cj].set(ci);
+      }
+    }
+
+    dimension_type rs_li = (li % 2 != 0) ? li : (li + 1);
+    // Check if the constraint is redundant.
+    PPL_DIRTY_TEMP(N, tmp);
+    for (dimension_type lj = 0 ; lj <= rs_li; ++lj) {
+      const dimension_type j = no_sing_leaders[lj];
+      const dimension_type cj = coherent_index(j);
+      const N& m_i_j = m_i[j];
+      const N& m_i_ci = m_i[ci];
+      bool to_add = true;
+      // Control if the constraint is redundant by strong-coherence,
+      // that is:
+      // m_i_j >= (m_i_ci + m_cj_j)/2,   where j != ci.
+      if (j != ci) {
+        add_assign_r(tmp, m_i_ci, matrix[cj][j], ROUND_UP);
+        div_2exp_assign_r(tmp, tmp, 1, ROUND_UP);
+        if (m_i_j >= tmp)
+          // The constraint is redundant.
+          continue;
+      }
+      // Control if the constraint is redundant by strong closure, that is
+      // if there is a path from i to j (i = i_0, ... , i_n = j), such that
+      // m_i_j = sum_{k=0}^{n-1} m_{i_k}_{i_(k + 1)}.
+      // Since the octagon is already strongly closed, the above relation
+      // is reduced to three case, in accordance with k, i, j inter-depend:
+      // exit k such that
+      // 1.) m_i_j >= m_i_k   + m_cj_ck,   if k < j < i; or
+      // 2.) m_i_j >= m_i_k   + m_k,_j,    if j < k < i; or
+      // 3.) m_i_j >= m_ck_ci + m_k_j,     if j < i < k.
+      // Note: `i > j'.
+      for (dimension_type lk = 0; lk < num_no_sing_leaders; ++lk) {
+        const dimension_type k = no_sing_leaders[lk];
+        if (k != i && k != j) {
+          dimension_type ck = coherent_index(k);
+          if (k < j)
+            // Case 1.
+            add_assign_r(tmp, m_i[k], matrix[cj][ck], ROUND_UP);
+          else if (k < i)
+            // Case 2.
+            add_assign_r(tmp, m_i[k], matrix[k][j], ROUND_UP);
+          else
+            // Case 3.
+            add_assign_r(tmp, matrix[ck][ci], matrix[k][j], ROUND_UP);
+
+          // Checks if the constraint is redundant.
+          if (m_i_j >= tmp) {
+            to_add = false;
+            break;
+          }
+        }
+      }
+
+      if (to_add)
+        // The constraint is not redundant.
+        non_redundant[i].set(j);
+    }
+  }
+
+  // If there exist a singular equivalence class, then it must have a
+  // single 0-cycle connecting all the positive and negative equivalent
+  // variables.
+  // Note: the singular class is not connected with the other classes.
+  if (exist_sing_class) {
+    non_redundant[sing_leader].set(sing_leader + 1);
+    if (successor[sing_leader + 1] != sing_leader + 1) {
+      dimension_type j = sing_leader;
+      dimension_type next_j = successor[j + 1];
+      while (next_j != j + 1) {
+        non_redundant[next_j].set(j);
+        j = next_j;
+        next_j = successor[j + 1];
+      }
+      non_redundant[j + 1].set(j);
+    }
+    else
+      non_redundant[sing_leader + 1].set(sing_leader);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::upper_bound_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+  // The hull of an octagon `x' with an empty octagon is `x'.
+  y.strong_closure_assign();
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The oct-hull is obtained by computing maxima.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end; ++i, ++j)
+    max_assign(*i, *j);
+
+  // The result is still closed.
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::difference_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("difference_assign(y)", y);
+
+  Octagonal_Shape& x = *this;
+
+  // Being lazy here is only harmful.
+  // We close.
+  x.strong_closure_assign();
+  // The difference of an empty octagon and of an octagon `p' is empty.
+  if (x.marked_empty())
+    return;
+  // The difference of a octagon `p' and an empty octagon is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both octagons are zero-dimensional,
+  // then at this point they are necessarily universe octagons,
+  // so that their difference is empty.
+  if (x.space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  Octagonal_Shape new_oct(space_dim, EMPTY);
+  // We take a constraint of the octagon y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementary constraints with the octagon x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the octagon `x' is included the octagon defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty octagon, and as we would obtain
+    // a result that is less precise than the difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    Octagonal_Shape z = x;
+    const Linear_Expression e(c.expression());
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_oct.upper_bound_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_oct.upper_bound_assign(z);
+    }
+  }
+  *this = new_oct;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::simplify_using_context_assign(const Octagonal_Shape& y) {
+  Octagonal_Shape& x = *this;
+  const dimension_type dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (dim != y.space_dimension())
+    throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+  // Filter away the zero-dimensional case.
+  if (dim == 0) {
+    if (y.marked_empty()) {
+      x.set_zero_dim_univ();
+      return false;
+    }
+    else
+      return !x.marked_empty();
+  }
+
+  // Filter away the case where `x' contains `y'
+  // (this subsumes the case when `y' is empty).
+  if (x.contains(y)) {
+    Octagonal_Shape<T> res(dim, UNIVERSE);
+    x.m_swap(res);
+    return false;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator Row_Iter;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_CIter;
+  typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+  typedef typename OR_Matrix<N>::const_element_iterator Elem_CIter;
+
+  // Filter away the case where `x' is empty.
+  x.strong_closure_assign();
+  if (x.marked_empty()) {
+    // Search for a constraint of `y' that is not a tautology.
+    dimension_type i;
+    dimension_type j;
+    // Prefer unary constraints.
+    for (i = 0; i < 2*dim; i += 2) {
+      // FIXME: if N is a float or bounded integer type, then
+      // we also need to check that we are actually able to construct
+      // a constraint inconsistent with respect to this one.
+      // Use something like !is_maximal()?
+      if (!is_plus_infinity(y.matrix_at(i, i + 1))) {
+        j = i + 1;
+        goto found;
+      }
+      // Use something like !is_maximal()?
+      if (!is_plus_infinity(y.matrix_at(i + 1, i))) {
+        j = i;
+        ++i;
+        goto found;
+      }
+    }
+    // Then search binary constraints.
+    // TODO: use better iteration scheme.
+    for (i = 2; i < 2*dim; ++i)
+      for (j = 0; j < i; ++j) {
+        // Use something like !is_maximal()?
+        if (!is_plus_infinity(y.matrix_at(i, j)))
+          goto found;
+      }
+
+    // Not found: we were not able to build a constraint contradicting
+    // one of the constraints in `y': `x' cannot be enlarged.
+    return false;
+
+  found:
+    // Found: build a new OS contradicting the constraint found.
+    PPL_ASSERT(i < dim && j < dim && i != j);
+    Octagonal_Shape<T> res(dim, UNIVERSE);
+    // FIXME: compute a proper contradicting constraint.
+    PPL_DIRTY_TEMP(N, tmp);
+    assign_r(tmp, 1, ROUND_UP);
+    add_assign_r(tmp, tmp, y.matrix_at(i, j), ROUND_UP);
+    // CHECKME: round down is really meant.
+    neg_assign_r(res.matrix_at(j, i), tmp, ROUND_DOWN);
+    PPL_ASSERT(!is_plus_infinity(res.matrix_at(j, i)));
+    x.m_swap(res);
+    return false;
+  }
+
+  // Here `x' and `y' are not empty and strongly closed;
+  // also, `x' does not contain `y'.
+  // Let `target' be the intersection of `x' and `y'.
+  Octagonal_Shape<T> target = x;
+  target.intersection_assign(y);
+  const bool bool_result = !target.is_empty();
+
+  // Compute redundancy information for x and ...
+  // TODO: provide a nicer data structure for redundancy.
+  std::vector<Bit_Row> x_non_redundant;
+  x.non_redundant_matrix_entries(x_non_redundant);
+  // ... count the non-redundant constraints.
+  dimension_type x_num_non_redundant = 0;
+  for (size_t i = x_non_redundant.size(); i-- > 0 ; )
+    x_num_non_redundant += x_non_redundant[i].count_ones();
+  PPL_ASSERT(x_num_non_redundant > 0);
+
+  // Let `yy' be a copy of `y': we will keep adding to `yy'
+  // the non-redundant constraints of `x',
+  // stopping as soon as `yy' becomes equal to `target'.
+  Octagonal_Shape<T> yy = y;
+
+  // The constraints added to `yy' will be recorded in `res' ...
+  Octagonal_Shape<T> res(dim, UNIVERSE);
+  // ... and we will count them too.
+  dimension_type res_num_non_redundant = 0;
+
+  // Compute leader information for `x'.
+  std::vector<dimension_type> x_leaders;
+  x.compute_leaders(x_leaders);
+
+  // First go through the unary equality constraints.
+  // Find the leader of the singular equivalence class (it is even!).
+  dimension_type sing_leader;
+  for (sing_leader = 0; sing_leader < 2*dim; sing_leader += 2) {
+    if (sing_leader == x_leaders[sing_leader]) {
+      const N& x_s_ss = x.matrix_at(sing_leader, sing_leader + 1);
+      const N& x_ss_s = x.matrix_at(sing_leader + 1, sing_leader);
+      if (is_additive_inverse(x_s_ss, x_ss_s))
+        // Singular leader found.
+        break;
+    }
+  }
+
+  // Unary equalities have `sing_leader' as a leader.
+  for (dimension_type i = sing_leader; i < 2*dim; i += 2) {
+    if (x_leaders[i] != sing_leader)
+      continue;
+    // Found a unary equality constraint:
+    // see if any of the two inequalities have to be added.
+    const N& x_i_ii = x.matrix_at(i, i + 1);
+    N& yy_i_ii = yy.matrix_at(i, i + 1);
+    if (x_i_ii < yy_i_ii) {
+      // The \leq inequality is not implied by context.
+      res.matrix_at(i, i + 1) = x_i_ii;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_i_ii = x_i_ii;
+      yy.reset_strongly_closed();
+    }
+    const N& x_ii_i = x.matrix_at(i + 1, i);
+    N& yy_ii_i = yy.matrix_at(i + 1, i);
+    if (x_ii_i < yy_ii_i) {
+      // The \geq inequality is not implied by context.
+      res.matrix_at(i + 1, i) = x_ii_i;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_ii_i = x_ii_i;
+      yy.reset_strongly_closed();
+    }
+    // Restore strong closure, if it was lost.
+    if (!yy.marked_strongly_closed()) {
+      Variable var_i(i/2);
+      yy.incremental_strong_closure_assign(var_i);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_strongly_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Go through the binary equality constraints.
+  for (dimension_type i = 0; i < 2*dim; ++i) {
+    const dimension_type j = x_leaders[i];
+    if (j == i || j == sing_leader)
+      continue;
+    const N& x_i_j = x.matrix_at(i, j);
+    PPL_ASSERT(!is_plus_infinity(x_i_j));
+    N& yy_i_j = yy.matrix_at(i, j);
+    if (x_i_j < yy_i_j) {
+      res.matrix_at(i, j) = x_i_j;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_i_j = x_i_j;
+      yy.reset_strongly_closed();
+    }
+    const N& x_j_i = x.matrix_at(j, i);
+    N& yy_j_i = yy.matrix_at(j, i);
+    PPL_ASSERT(!is_plus_infinity(x_j_i));
+    if (x_j_i < yy_j_i) {
+      res.matrix_at(j, i) = x_j_i;
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_j_i = x_j_i;
+      yy.reset_strongly_closed();
+    }
+    // Restore strong closure, if it was lost.
+    if (!yy.marked_strongly_closed()) {
+      Variable var_j(j/2);
+      yy.incremental_strong_closure_assign(var_j);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_strongly_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Finally go through the (proper) inequality constraints:
+  // both indices i and j should be leaders.
+  // FIXME: improve iteration scheme (are we doing twice the work?)
+  for (dimension_type i = 0; i < 2*dim; ++i) {
+    if (i != x_leaders[i])
+      continue;
+    const Bit_Row& x_non_redundant_i = x_non_redundant[i];
+    for (dimension_type j = 0; j < 2*dim; ++j) {
+      if (j != x_leaders[j])
+        continue;
+      if (i >= j) {
+        if (!x_non_redundant_i[j])
+          continue;
+      }
+      else if (!x_non_redundant[j][i])
+        continue;
+      N& yy_i_j = yy.matrix_at(i, j);
+      const N& x_i_j = x.matrix_at(i, j);
+      if (x_i_j < yy_i_j) {
+        res.matrix_at(i, j) = x_i_j;
+        ++res_num_non_redundant;
+        // Tighten context `yy' using the newly added constraint.
+        yy_i_j = x_i_j;
+        yy.reset_strongly_closed();
+        Variable var(i/2);
+        yy.incremental_strong_closure_assign(var);
+        if (target.contains(yy)) {
+          // Target reached: swap `x' and `res' if needed.
+          if (res_num_non_redundant < x_num_non_redundant) {
+            res.reset_strongly_closed();
+            x.m_swap(res);
+          }
+          return bool_result;
+        }
+      }
+    }
+  }
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return false;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_embed(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type new_dim = space_dim + m;
+  const bool was_zero_dim_univ = !marked_empty() && space_dim == 0;
+
+  // To embed an n-dimension space octagon in a (n + m)-dimension space,
+  // we just add `m' variables in the matrix of constraints.
+  matrix.grow(new_dim);
+  space_dim = new_dim;
+  // If `*this' was the zero-dim space universe octagon,
+  // then we can set the strongly closure flag.
+  if (was_zero_dim_univ)
+    set_strongly_closed();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::add_space_dimensions_and_project(dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type n = matrix.num_rows();
+
+  // To project an n-dimension space OS in a (space_dim + m)-dimension space,
+  // we just add `m' columns and rows in the matrix of constraints.
+  add_space_dimensions_and_embed(m);
+  // We insert 0 where it needs.
+  // Attention: now num_rows of matrix is update!
+  for (typename OR_Matrix<N>::row_iterator i = matrix.row_begin() + n,
+         matrix_row_end =  matrix.row_end(); i != matrix_row_end; i += 2) {
+    typename OR_Matrix<N>::row_reference_type x_i = *i;
+    typename OR_Matrix<N>::row_reference_type x_ci = *(i + 1);
+    const dimension_type ind = i.index();
+    assign_r(x_i[ind + 1], 0, ROUND_NOT_NEEDED);
+    assign_r(x_ci[ind], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any octagon is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a octagon in a 0-dim space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  const dimension_type new_space_dim = space_dim - vars.size();
+
+  strong_closure_assign();
+  // When removing _all_ dimensions from an octagon,
+  // we obtain the zero-dimensional octagon.
+  if (new_space_dim == 0) {
+    matrix.shrink(0);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    space_dim = 0;
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // We consider each variable and we check if it has to be removed.
+  // If it has to be removed, we pass to the next one, then we will
+  // overwrite its representation in the matrix.
+  typedef typename OR_Matrix<N>::element_iterator Elem_Iter;
+  typedef typename std::iterator_traits<Elem_Iter>::difference_type diff_t;
+
+  dimension_type first = *vars.begin();
+  const dimension_type first_size = 2 * first * (first + 1);
+  Elem_Iter iter = matrix.element_begin() + static_cast<diff_t>(first_size);
+
+  for (dimension_type i = first + 1; i < space_dim; ++i) {
+    if (vars.count(i) == 0) {
+      typename OR_Matrix<N>::row_iterator row_iter = matrix.row_begin() + 2*i;
+      typename OR_Matrix<N>::row_reference_type row_ref = *row_iter;
+      typename OR_Matrix<N>::row_reference_type row_ref1 = *(++row_iter);
+      // Beware: first we shift the cells corresponding to the first
+      // row of variable(j), then we shift the cells corresponding to the
+      // second row. We recall that every variable is represented
+      // in the `matrix' by two rows and two columns.
+      for (dimension_type j = 0; j <= i; ++j)
+        if (vars.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref[2*j]);
+          assign_or_swap(*(iter++), row_ref[2*j + 1]);
+        }
+      for (dimension_type j = 0; j <= i; ++j)
+        if (vars.count(j) == 0) {
+          assign_or_swap(*(iter++), row_ref1[2*j]);
+          assign_or_swap(*(iter++), row_ref1[2*j + 1]);
+        }
+    }
+  }
+  // Update the space dimension.
+  matrix.shrink(new_space_dim);
+  space_dim = new_space_dim;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+Octagonal_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the octagon becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    strong_closure_assign();
+
+  // If the octagon is empty, then it is sufficient to adjust
+  // the space dimension of the octagon.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // We create a new matrix with the new space dimension.
+  OR_Matrix<N> x(new_space_dim);
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  row_iterator m_begin = x.row_begin();
+
+  for (row_iterator i_iter = matrix.row_begin(), i_end = matrix.row_end();
+       i_iter != i_end; i_iter += 2) {
+    dimension_type new_i;
+    dimension_type i = i_iter.index()/2;
+    // We copy and place in the position into `x' the only cells of
+    // the `matrix' that refer to both mapped variables,
+    // the variable `i' and `j'.
+    if (pfunc.maps(i, new_i)) {
+      row_reference r_i = *i_iter;
+      row_reference r_ii = *(i_iter + 1);
+      dimension_type double_new_i = 2*new_i;
+      row_iterator x_iter = m_begin + double_new_i;
+      row_reference x_i = *x_iter;
+      row_reference x_ii = *(x_iter + 1);
+      for (dimension_type j = 0; j <= i; ++j) {
+        dimension_type new_j;
+        // If also the second variable is mapped, we work.
+        if (pfunc.maps(j, new_j)) {
+          dimension_type dj = 2*j;
+          dimension_type double_new_j = 2*new_j;
+          // Mapped the constraints, exchanging the indexes.
+          // Attention: our matrix is pseudo-triangular.
+          // If new_j > new_i, we must consider, as rows, the rows of
+          // the variable new_j, and not of new_i ones.
+          if (new_i >= new_j) {
+            assign_or_swap(x_i[double_new_j], r_i[dj]);
+            assign_or_swap(x_ii[double_new_j], r_ii[dj]);
+            assign_or_swap(x_ii[double_new_j + 1], r_ii[dj + 1]);
+            assign_or_swap(x_i[double_new_j + 1], r_i[dj + 1]);
+          }
+          else {
+            row_iterator x_j_iter = m_begin + double_new_j;
+            row_reference x_j = *x_j_iter;
+            row_reference x_jj = *(x_j_iter + 1);
+            assign_or_swap(x_jj[double_new_i + 1], r_i[dj]);
+            assign_or_swap(x_jj[double_new_i], r_ii[dj]);
+            assign_or_swap(x_j[double_new_i + 1], r_i[dj + 1]);
+            assign_or_swap(x_j[double_new_i], r_ii[dj + 1]);
+          }
+
+        }
+      }
+    }
+  }
+
+  using std::swap;
+  swap(matrix, x);
+  space_dim = new_space_dim;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::intersection_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two octagons is empty, the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+  // If both octagons are zero-dimensional,then at this point
+  // they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two octagons we compare the constraints
+  // and we choose the less values.
+  bool changed = false;
+
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+    const N& y_elem = *j;
+    if (y_elem < elem) {
+      elem = y_elem;
+      changed = true;
+    }
+  }
+
+  // This method not preserve the closure.
+  if (changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+Octagonal_Shape<T>::CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                              Iterator first, Iterator last,
+                                              unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If both octagons are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  strong_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.strong_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    const N& y_elem = *j;
+    N& elem = *i;
+    if (y_elem < elem) {
+      Iterator k = std::lower_bound(first, last, elem);
+      if (k != last) {
+        if (elem < *k)
+          assign_r(elem, *k, ROUND_UP);
+      }
+      else
+        assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::get_limiting_octagon(const Constraint_System& cs,
+                       Octagonal_Shape& limiting_octagon) const {
+  const dimension_type cs_space_dim = cs.space_dimension();
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(cs_space_dim <= space_dim);
+
+  strong_closure_assign();
+  bool is_oct_changed = false;
+
+  // Allocate temporaries outside of the loop.
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(term);
+  PPL_DIRTY_TEMP(N, d);
+
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not octagonal differences are ignored.
+    if (!Octagonal_Shape_Helper
+      ::extract_octagonal_difference(c, cs_space_dim, num_vars, i, j,
+                                     coeff, term))
+      continue;
+
+    typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+    typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+    typedef typename OR_Matrix<N>::row_iterator row_iterator;
+    typedef typename OR_Matrix<N>::row_reference_type row_reference;
+    Row_iterator m_begin = matrix.row_begin();
+    // Select the cell to be modified for the "<=" part of the constraint.
+    Row_iterator i_iter = m_begin + i;
+    Row_reference m_i = *i_iter;
+    OR_Matrix<N>& lo_mat = limiting_octagon.matrix;
+    row_iterator lo_iter = lo_mat.row_begin() + i;
+    row_reference lo_m_i = *lo_iter;
+    N& lo_m_i_j = lo_m_i[j];
+    if (coeff < 0)
+      neg_assign(coeff);
+    // Compute the bound for `m_i_j', rounding towards plus infinity.
+    div_round_up(d, term, coeff);
+    if (m_i[j] <= d)
+      if (c.is_inequality()) {
+        if (lo_m_i_j > d) {
+          lo_m_i_j = d;
+          is_oct_changed = true;
+        }
+        else {
+          // Select the right row of the cell.
+          if (i % 2 == 0) {
+            ++i_iter;
+            ++lo_iter;
+          }
+          else {
+            --i_iter;
+            --lo_iter;
+          }
+          Row_reference m_ci = *i_iter;
+          row_reference lo_m_ci = *lo_iter;
+          // Select the right column of the cell.
+          using namespace Implementation::Octagonal_Shapes;
+          dimension_type cj = coherent_index(j);
+          N& lo_m_ci_cj = lo_m_ci[cj];
+          neg_assign(term);
+          div_round_up(d, term, coeff);
+          if (m_ci[cj] <= d && lo_m_ci_cj > d) {
+            lo_m_ci_cj = d;
+            is_oct_changed = true;
+          }
+        }
+      }
+  }
+  // In general, adding a constraint does not preserve the strongly
+  // closure of the octagon.
+  if (is_oct_changed && limiting_octagon.marked_strongly_closed())
+    limiting_octagon.reset_strongly_closed();
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_CC76_extrapolation_assign(const Octagonal_Shape& y,
+                                    const Constraint_System& cs,
+                                    unsigned* tp) {
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::BHMZ05_widening_assign(const Octagonal_Shape& y,
+                                           unsigned* tp) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  PPL_ASSERT(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Octagonal_Shape x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  PPL_ASSERT(marked_strongly_closed() && y.marked_strongly_closed());
+  // Minimize `y'.
+  y.strong_reduction_assign();
+
+  // Extrapolate unstable bounds.
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+       matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    N& elem = *i;
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+    if (*j != elem)
+      assign_r(elem, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::limited_BHMZ05_extrapolation_assign(const Octagonal_Shape& y,
+                                      const Constraint_System& cs,
+                                      unsigned* tp) {
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two octagons.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_constraint_incompatible("limited_CH78_extrapolation_assign(y, cs)");
+
+  // The limited BHMZ05-extrapolation between two octagons in a
+  // zero-dimensional space is a octagon in a zero-dimensional
+  // space, too.
+  if (space_dim == 0)
+    return;
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  Octagonal_Shape limiting_octagon(space_dim, UNIVERSE);
+  get_limiting_octagon(cs, limiting_octagon);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_octagon);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::CC76_narrowing_assign(const Octagonal_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dim)
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+  // Assume `*this' is contained in or equal to `y'.
+  PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+  // If both octagons are zero-dimensional, since `*this' contains `y',
+  // we simply return '*this'.
+  if (space_dim == 0)
+    return;
+
+  y.strong_closure_assign();
+  // If `y' is empty, since `y' contains `*this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  strong_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // We consider a constraint of `*this', if its value is `plus_infinity',
+  // we take the value of the corresponding constraint of `y'.
+  bool is_oct_changed = false;
+  typename OR_Matrix<N>::const_element_iterator j = y.matrix.element_begin();
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         matrix_element_end = matrix.element_end();
+       i != matrix_element_end;
+       ++i, ++j) {
+    if (!is_plus_infinity(*i)
+        && !is_plus_infinity(*j)
+        && *i != *j) {
+      *i = *j;
+      is_oct_changed = true;
+    }
+  }
+
+  if (is_oct_changed && marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_v_pm_u_bounds(const dimension_type v_id,
+                       const dimension_type last_id,
+                       const Linear_Expression& sc_expr,
+                       Coefficient_traits::const_reference sc_denom,
+                       const N& ub_v) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(ub_v));
+
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_cv = matrix[n_v + 1];
+
+  // Speculatively allocate temporaries out of the loop.
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, minus_q);
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(mpq_class, lb_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+      u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+    const dimension_type u_id = u.variable().id();
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = *u;
+
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `v - u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_denom) {
+        // Here q >= 1: deducing `v - u <= ub_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_cu_u / 2.
+        div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+        N& m_v_minus_u = (n_v < n_u) ? matrix[n_u][n_v] : m_cv[n_u + 1];
+        sub_assign_r(m_v_minus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u + 1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v - u' is
+          // computed as `ub_v - (q * ub_u + (1-q) * lb_u)',
+          // i.e., `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+          assign_r(minus_lb_u, m_u_cu, ROUND_NOT_NEEDED);
+          div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+          N& m_v_minus_u = (n_v < n_u) ? m_u[n_v] : m_cv[n_u + 1];
+          add_assign_r(m_v_minus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(expr_u < 0);
+      // If `expr_u' is negative, we can improve `v + u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_denom) {
+        // Here q <= -1: Deducing `v + u <= ub_v + lb_u'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `ub_v'.
+        // Let half = m_u_cu / 2.
+        div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+        N& m_v_plus_u = (n_v < n_u) ? matrix[n_u + 1][n_v] : m_cv[n_u];
+        sub_assign_r(m_v_plus_u, ub_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `v + u' is
+          // computed as `ub_v + ((-q) * lb_u + (1 + q) * ub_u)',
+          // i.e., `ub_v + ub_u + (-q) * (lb_u - ub_u)'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(minus_q, minus_expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(minus_q, minus_q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(lb_u, lb_u, 1, ROUND_NOT_NEEDED);
+          neg_assign_r(lb_u, lb_u, ROUND_NOT_NEEDED);
+          // Compute `lb_u - ub_u'.
+          sub_assign_r(lb_u, lb_u, ub_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u + (-q) * (lb_u - ub_u)'.
+          add_mul_assign_r(ub_u, minus_q, lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `v + u <= ub_v + ((-q) * lb_u + (1 + q) * ub_u)'.
+          N& m_v_plus_u = (n_v < n_u) ? m_cu[n_v] : m_cv[n_u];
+          add_assign_r(m_v_plus_u, ub_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::deduce_minus_v_pm_u_bounds(const dimension_type v_id,
+                             const dimension_type last_id,
+                             const Linear_Expression& sc_expr,
+                             Coefficient_traits::const_reference sc_denom,
+                             const N& minus_lb_v) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+
+  // No need to consider indices greater than `last_id'.
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_reference_type m_v = matrix[n_v];
+
+  // Speculatively allocate temporaries out of the loop.
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_expr_u);
+
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+      u_end = sc_expr.lower_bound(Variable(last_id + 1)); u != u_end; ++u) {
+    const dimension_type u_id = u.variable().id();
+    // Skip the case when `u_id == v_id'.
+    if (u_id == v_id)
+      continue;
+    const Coefficient& expr_u = *u;
+
+    const dimension_type n_u = u_id*2;
+    // If `expr_u' is positive, we can improve `-v + u'.
+    if (expr_u > 0) {
+      if (expr_u >= sc_denom) {
+        // Here q >= 1: deducing `-v + u <= lb_u - lb_v',
+        // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+        // We avoid to check if `lb_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_u_cu / 2.
+        div_2exp_assign_r(half, matrix[n_u][n_u + 1], 1, ROUND_UP);
+        N& m_u_minus_v = (n_v < n_u) ? matrix[n_u + 1][n_v + 1] : m_v[n_u];
+        sub_assign_r(m_u_minus_v, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here 0 < q < 1.
+        typename OR_Matrix<N>::row_reference_type m_cu = matrix[n_u + 1];
+        const N& m_cu_u = m_cu[n_u];
+        if (!is_plus_infinity(m_cu_u)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `u - v' is
+          // computed as `(q * lb_u + (1-q) * ub_u) - lb_v',
+          // i.e., `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+          assign_r(ub_u, m_cu[n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, matrix[n_u][n_u + 1], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(minus_lb_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `ub_u - q * (ub_u - lb_u)'.
+          sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, ub_u, ROUND_UP);
+          // Deducing `u - v <= -lb_v - (q * lb_u + (1-q) * ub_u)'.
+          N& m_u_minus_v = (n_v < n_u) ? m_cu[n_v + 1] : m_v[n_u];
+          add_assign_r(m_u_minus_v, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(expr_u < 0);
+      // If `expr_u' is negative, we can improve `-v - u'.
+      neg_assign(minus_expr_u, expr_u);
+      if (minus_expr_u >= sc_denom) {
+        // Here q <= -1: Deducing `-v - u <= -lb_v - ub_u'.
+        // We avoid to check if `ub_u' is plus infinity, because
+        // it is used for the computation of `lb_v'.
+        // Let half = m_cu_u / 2.
+        div_2exp_assign_r(half, matrix[n_u + 1][n_u], 1, ROUND_UP);
+        N& m_minus_v_minus_u = (n_v < n_u)
+          ? matrix[n_u][n_v + 1]
+          : m_v[n_u + 1];
+        sub_assign_r(m_minus_v_minus_u, minus_lb_v, half, ROUND_UP);
+      }
+      else {
+        // Here -1 < q < 0.
+        typename OR_Matrix<N>::row_reference_type m_u = matrix[n_u];
+        const N& m_u_cu = m_u[n_u + 1];
+        if (!is_plus_infinity(m_u_cu)) {
+          // Let `ub_u' and `lb_u' be the known upper and lower bound
+          // for `u', respectively. The upper bound for `-v - u' is
+          // computed as `-lb_v - ((-q)*ub_u + (1 + q)*lb_u)',
+          // i.e., `minus_lb_v - lb_u + q*(ub_u - lb_u)'.
+          assign_r(ub_u, matrix[n_u + 1][n_u], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(ub_u, ub_u, 1, ROUND_NOT_NEEDED);
+          assign_r(q, expr_u, ROUND_NOT_NEEDED);
+          div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+          assign_r(minus_lb_u, m_u[n_u + 1], ROUND_NOT_NEEDED);
+          div_2exp_assign_r(minus_lb_u, minus_lb_u, 1, ROUND_NOT_NEEDED);
+          // Compute `ub_u - lb_u'.
+          add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+          // Compute `-lb_u + q*(ub_u - lb_u)'.
+          add_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+          assign_r(up_approx, minus_lb_u, ROUND_UP);
+          // Deducing `-v - u <= -lb_v - ((-q) * ub_u + (1 + q) * lb_u)'.
+          N& m_minus_v_minus_u = (n_v < n_u) ? m_u[n_v + 1] : m_v[n_u + 1];
+          add_assign_r(m_minus_v_minus_u, minus_lb_v, up_approx, ROUND_UP);
+        }
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_all_octagonal_constraints(const dimension_type v_id) {
+  PPL_ASSERT(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type h = m_iter.row_size(); h-- > 0; ) {
+    assign_r(r_v[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[h], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::forget_binary_octagonal_constraints(const dimension_type v_id) {
+  PPL_ASSERT(v_id < space_dim);
+  const dimension_type n_v = 2*v_id;
+  typename OR_Matrix<N>::row_iterator m_iter = matrix.row_begin() + n_v;
+  typename OR_Matrix<N>::row_reference_type r_v = *m_iter;
+  typename OR_Matrix<N>::row_reference_type r_cv = *(++m_iter);
+  for (dimension_type k = n_v; k-- > 0; ) {
+    assign_r(r_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+  ++m_iter;
+  for (typename OR_Matrix<N>::row_iterator m_end = matrix.row_end();
+       m_iter != m_end; ++m_iter) {
+    typename OR_Matrix<N>::row_reference_type r = *m_iter;
+    assign_r(r[n_v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(r[n_v + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type var_id = var.id();
+  if (space_dimension() < var_id + 1)
+    throw_dimension_incompatible("unconstrain(var)", var_id + 1);
+
+  // Enforce strong closure for precision.
+  strong_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  forget_all_octagonal_constraints(var_id);
+  // Strong closure is preserved.
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Enforce strong closure for precision.
+  strong_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+    forget_all_octagonal_constraints(*vsi);
+  // Strong closure is preserved.
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::refine(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  PPL_ASSERT(denominator != 0);
+  PPL_ASSERT(space_dim >= expr.space_dimension());
+  const dimension_type var_id = var.id();
+  PPL_ASSERT(var_id <= space_dim);
+  PPL_ASSERT(expr.coefficient(var) == 0);
+  PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+
+  // Variable index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*j + b, where `j != v';
+  // - If t == 2, then `expr' is of the general form.
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const dimension_type n_var = 2*var_id;
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  // Since we are only able to record octagonal differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.coefficient(Variable(w_id)) != denominator
+      && expr.coefficient(Variable(w_id)) != minus_denom)
+    t = 2;
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+      add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  else if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    const dimension_type n_w = 2*w_id;
+    switch (relsym) {
+    case EQUAL:
+      if (w_coeff == denominator)
+        // Add the new constraint `var - w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w, n_var, b, denominator);
+          add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+        }
+        else {
+          add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+          add_octagonal_constraint(n_var, n_w, b, minus_denom);
+        }
+      else
+        // Add the new constraint `var + w = b/denominator'.
+        if (var_id < w_id) {
+          add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+          add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+        }
+        else {
+          add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+          add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+        }
+      break;
+    case LESS_OR_EQUAL:
+      {
+        PPL_DIRTY_TEMP(N, d);
+        div_round_up(d, b, denominator);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraints `v - w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var, d);
+          else
+            add_octagonal_constraint(n_var + 1, n_w + 1, d);
+        }
+        else if (w_coeff == minus_denom) {
+          // Add the new constraints `v + w <= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w + 1, n_var, d);
+          else
+            add_octagonal_constraint(n_var + 1, n_w, d);
+        }
+        break;
+      }
+
+    case GREATER_OR_EQUAL:
+      {
+        PPL_DIRTY_TEMP(N, d);
+        div_round_up(d, b, minus_denom);
+        // Note that: `w_id != v', so that `expr' is of the form
+        // w_coeff * w + b, with `w_id != v'.
+        if (w_coeff == denominator) {
+          // Add the new constraint `v - w >= b/denominator',
+          // i.e.,  `-v + w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w + 1, n_var + 1, d);
+          else
+            add_octagonal_constraint(n_var, n_w, d);
+        }
+        else if (w_coeff == minus_denom) {
+          // Add the new constraints `v + w >= b/denominator',
+          // i.e.,  `-v - w <= -b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var + 1, d);
+          else
+            add_octagonal_constraint(n_var, n_w + 1, d);
+        }
+        break;
+      }
+
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  else {
+    // Here t == 2, so that
+    // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2.
+    const bool is_sc = (denominator > 0);
+    PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+    neg_assign(minus_b, b);
+    const Coefficient& sc_b = is_sc ? b : minus_b;
+    const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+    const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+    const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+    // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+    // when `denominator' is negative. Do not use it unless you are sure
+    // it has been correctly assigned.
+    Linear_Expression minus_expr;
+    if (!is_sc)
+      minus_expr = -expr;
+    const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+    PPL_DIRTY_TEMP(N, sum);
+    // Index of variable that is unbounded in `this'.
+    PPL_UNINITIALIZED(dimension_type, pinf_index);
+    // Number of unbounded variables found.
+    dimension_type pinf_count = 0;
+
+    switch (relsym) {
+    case EQUAL:
+      {
+        PPL_DIRTY_TEMP(N, neg_sum);
+        // Index of variable that is unbounded in `this'.
+        PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+        // Number of unbounded variables found.
+        dimension_type neg_pinf_count = 0;
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+        assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        PPL_DIRTY_TEMP(N, coeff_i);
+        PPL_DIRTY_TEMP(N, half);
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+        PPL_DIRTY_TEMP(N, minus_coeff_i);
+        // Note: indices above `w' can be disregarded, as they all have
+        // a zero coefficient in `sc_expr'.
+        for (Row_iterator m_iter = m_begin,
+               m_iter_end = m_begin + (2 * w_id + 2);
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          Row_reference m_i = *m_iter;
+          ++m_iter;
+          Row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i > 0) {
+            assign_r(coeff_i, sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i + 1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+          else if (sign_i < 0) {
+            neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+            assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+            // Approximating `sc_expr'.
+            if (pinf_count <= 1) {
+              const N& double_approx_minus_i = m_i[n_i + 1];
+              if (!is_plus_infinity(double_approx_minus_i)) {
+                // Let half = double_approx_minus_i / 2.
+                div_2exp_assign_r(half, double_approx_minus_i, 1, ROUND_UP);
+                add_mul_assign_r(sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++pinf_count;
+                pinf_index = id;
+              }
+            }
+            // Approximating `-sc_expr'.
+            if (neg_pinf_count <= 1) {
+              const N& double_approx_i = m_ci[n_i];
+              if (!is_plus_infinity(double_approx_i)) {
+                // Let half = double_approx_i / 2.
+                div_2exp_assign_r(half, double_approx_i, 1, ROUND_UP);
+                add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+              }
+              else {
+                ++neg_pinf_count;
+                neg_pinf_index = id;
+              }
+            }
+          }
+        }
+        // Return immediately if no approximation could be computed.
+        if (pinf_count > 1 && neg_pinf_count > 1) {
+          PPL_ASSERT(OK());
+          return;
+        }
+
+        // In the following, strong closure will be definitely lost.
+        reset_strongly_closed();
+
+        // Exploit the upper approximation, if possible.
+        if (pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_denom != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_denom' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_denom'
+            // and negating again the result.
+            PPL_DIRTY_TEMP(N, down_sc_denom);
+            assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+            neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+            div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+          }
+          // Add the upper bound constraint, if meaningful.
+          if (pinf_count == 0) {
+            // Add the constraint `v <= sum'.
+            PPL_DIRTY_TEMP(N, double_sum);
+            mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+            matrix[n_var + 1][n_var] = double_sum;
+            // Deduce constraints of the form `v +/- u', where `u != v'.
+            deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+          }
+          else
+            // Here `pinf_count == 1'.
+            if (pinf_index != var_id) {
+              const Coefficient& ppi
+                = sc_expr.coefficient(Variable(pinf_index));
+              if (ppi == sc_denom)
+                // Add the constraint `v - pinf_index <= sum'.
+                if (var_id < pinf_index)
+                  matrix[2*pinf_index][n_var] = sum;
+                else
+                  matrix[n_var + 1][2*pinf_index + 1] = sum;
+              else
+                if (ppi == minus_sc_denom) {
+                  // Add the constraint `v + pinf_index <= sum'.
+                  if (var_id < pinf_index)
+                    matrix[2*pinf_index + 1][n_var] = sum;
+                  else
+                    matrix[n_var + 1][2*pinf_index] = sum;
+                }
+            }
+        }
+
+        // Exploit the lower approximation, if possible.
+        if (neg_pinf_count <= 1) {
+          // Compute quotient (if needed).
+          if (sc_denom != 1) {
+            // Before computing quotients, the denominator should be
+            // approximated towards zero. Since `sc_denom' is known to be
+            // positive, this amounts to rounding downwards, which is
+            // achieved as usual by rounding upwards `minus_sc_denom'
+            // and negating again the result.
+            PPL_DIRTY_TEMP(N, down_sc_denom);
+            assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+            neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+            div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+          }
+          // Add the lower bound constraint, if meaningful.
+          if (neg_pinf_count == 0) {
+            // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+            PPL_DIRTY_TEMP(N, double_neg_sum);
+            mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+            matrix[n_var][n_var + 1] = double_neg_sum;
+            // Deduce constraints of the form `-v +/- u', where `u != v'.
+            deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom,
+                                       neg_sum);
+          }
+          else
+            // Here `neg_pinf_count == 1'.
+            if (neg_pinf_index != var_id) {
+              const Coefficient& npi
+                = sc_expr.coefficient(Variable(neg_pinf_index));
+              if (npi == sc_denom)
+                // Add the constraint `v - neg_pinf_index >= -neg_sum',
+                // i.e., `neg_pinf_index - v <= neg_sum'.
+                if (neg_pinf_index < var_id)
+                  matrix[n_var][2*neg_pinf_index] = neg_sum;
+                else
+                  matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+              else
+                if (npi == minus_sc_denom) {
+                  // Add the constraint `v + neg_pinf_index >= -neg_sum',
+                  // i.e., `-neg_pinf_index - v <= neg_sum'.
+                  if (neg_pinf_index < var_id)
+                    matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+                  else
+                    matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+                }
+            }
+        }
+        break;
+      }
+
+    case LESS_OR_EQUAL:
+      {
+        // Compute an upper approximation for `expr' into `sum',
+        // taking into account the sign of `denominator'.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `sc_expr'.
+        PPL_DIRTY_TEMP(N, coeff_i);
+        PPL_DIRTY_TEMP(N, approx_i);
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+        // Note: indices above `w_id' can be disregarded, as they all have
+        // a zero coefficient in `expr'.
+        for (row_iterator m_iter = m_begin,
+               m_iter_end = m_begin + (2 * w_id + 2);
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          row_reference m_i = *m_iter;
+          ++m_iter;
+          row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_denom != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_denom' is known to be
+          // positive, this amounts to rounding downwards, which is achieved
+          // by rounding upwards `minus_sc-denom' and negating again the result.
+          PPL_DIRTY_TEMP(N, down_sc_denom);
+          assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+          neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          PPL_DIRTY_TEMP(N, double_sum);
+          mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+          add_octagonal_constraint(n_var + 1, n_var, double_sum);
+          // Deduce constraints of the form `v +/- u', where `u != v'.
+          deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              add_octagonal_constraint(pinf_ind, n_var, sum);
+            else
+              add_octagonal_constraint(n_var + 1, pinf_ind + 1, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+              else
+                add_octagonal_constraint(n_var + 1, pinf_ind, sum);
+            }
+          }
+        }
+        break;
+      }
+
+    case GREATER_OR_EQUAL:
+      {
+        // Compute an upper approximation for `-sc_expr' into `sum'.
+        // Note: approximating `-sc_expr' from above and then negating the
+        // result is the same as approximating `sc_expr' from below.
+
+        // Approximate the inhomogeneous term.
+        assign_r(sum, minus_sc_b, ROUND_UP);
+
+        // Approximate the homogeneous part of `-sc_expr'.
+        PPL_DIRTY_TEMP(N, coeff_i);
+        PPL_DIRTY_TEMP(N, approx_i);
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+        for (row_iterator m_iter = m_begin,
+               m_iter_end = m_begin + (2 * w_id + 2);
+             m_iter != m_iter_end; ) {
+          const dimension_type n_i = m_iter.index();
+          const dimension_type id = n_i/2;
+          row_reference m_i = *m_iter;
+          ++m_iter;
+          row_reference m_ci = *m_iter;
+          ++m_iter;
+          const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+          const int sign_i = sgn(sc_i);
+          if (sign_i == 0)
+            continue;
+          // Choose carefully: we are approximating `-sc_expr'.
+          const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+          if (is_plus_infinity(double_approx_i)) {
+            if (++pinf_count > 1)
+              break;
+            pinf_index = id;
+            continue;
+          }
+          if (sign_i > 0)
+            assign_r(coeff_i, sc_i, ROUND_UP);
+          else {
+            neg_assign(minus_sc_i, sc_i);
+            assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          }
+          div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+        }
+
+        // Divide by the (sign corrected) denominator (if needed).
+        if (sc_denom != 1) {
+          // Before computing the quotient, the denominator should be
+          // approximated towards zero. Since `sc_denom' is known to be
+          // positive, this amounts to rounding downwards, which is
+          // achieved by rounding upwards `minus_sc_denom' and
+          // negating again the result.
+          PPL_DIRTY_TEMP(N, down_sc_denom);
+          assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+          neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+          div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+        }
+
+        if (pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          PPL_DIRTY_TEMP(N, double_sum);
+          mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+          add_octagonal_constraint(n_var, n_var + 1, double_sum);
+          // Deduce constraints of the form `-v +/- u', where `u != v'.
+          deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom,
+                                     sum);
+        }
+        else if (pinf_count == 1) {
+          dimension_type pinf_ind = 2*pinf_index;
+          if (expr.coefficient(Variable(pinf_index)) == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              add_octagonal_constraint(n_var, pinf_ind, sum);
+            else
+              add_octagonal_constraint(pinf_ind + 1, n_var, sum);
+          }
+          else {
+            if (expr.coefficient(Variable(pinf_index)) == minus_denom) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                add_octagonal_constraint(n_var, pinf_ind + 1, sum);
+              else
+                add_octagonal_constraint(pinf_ind, n_var + 1, sum);
+            }
+          }
+        }
+        break;
+      }
+
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_image(const Variable var,
+                                 const Linear_Expression& expr,
+                                 Coefficient_traits::const_reference
+                                 denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_image(v, e, d)", var_id + 1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+  using std::swap;
+
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    // Add the constraint `var == b/denominator'.
+    add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+    add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_denom) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Here `expr' is of the form: +/- denominator * v + b.
+        const bool sign_symmetry = (w_coeff != denominator);
+        if (!sign_symmetry && b == 0)
+          // The transformation is the identity function.
+          return;
+        // Translate all the constraints on `var' adding or
+        // subtracting the value `b/denominator'.
+        PPL_DIRTY_TEMP(N, d);
+        div_round_up(d, b, denominator);
+        PPL_DIRTY_TEMP(N, minus_d);
+        div_round_up(minus_d, b, minus_denom);
+        if (sign_symmetry)
+          swap(d, minus_d);
+        const row_iterator m_begin = matrix.row_begin();
+        const row_iterator m_end = matrix.row_end();
+        row_iterator m_iter = m_begin + n_var;
+        row_reference m_v = *m_iter;
+        ++m_iter;
+        row_reference m_cv = *m_iter;
+        ++m_iter;
+        // NOTE: delay update of unary constraints on `var'.
+        for (dimension_type j = n_var; j-- > 0; ) {
+          N& m_v_j = m_v[j];
+          add_assign_r(m_v_j, m_v_j, minus_d, ROUND_UP);
+          N& m_cv_j = m_cv[j];
+          add_assign_r(m_cv_j, m_cv_j, d, ROUND_UP);
+          if (sign_symmetry)
+            swap(m_v_j, m_cv_j);
+        }
+        for ( ; m_iter != m_end; ++m_iter) {
+          row_reference m_i = *m_iter;
+          N& m_i_v = m_i[n_var];
+          add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+          N& m_i_cv = m_i[n_var + 1];
+          add_assign_r(m_i_cv, m_i_cv, minus_d, ROUND_UP);
+          if (sign_symmetry)
+            swap(m_i_v, m_i_cv);
+        }
+        // Now update unary constraints on var.
+        mul_2exp_assign_r(d, d, 1, ROUND_UP);
+        N& m_cv_v = m_cv[n_var];
+        add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+        mul_2exp_assign_r(minus_d, minus_d, 1, ROUND_UP);
+        N& m_v_cv = m_v[n_var + 1];
+        add_assign_r(m_v_cv, m_v_cv, minus_d, ROUND_UP);
+        if (sign_symmetry)
+          swap(m_cv_v, m_v_cv);
+        // Note: strong closure is preserved.
+      }
+      else {
+        // Here `w != var', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w = b/denominator'.
+        if (w_coeff == denominator) {
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w, n_var, b, denominator);
+            add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+            add_octagonal_constraint(n_var, n_w, b, minus_denom);
+          }
+        }
+        else {
+          // Add the new constraint `var + w = b/denominator'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+            add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+            add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+          }
+        }
+        incremental_strong_closure_assign(var);
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, pos_sum);
+  PPL_DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+  PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP(N, minus_coeff_i);
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  const row_iterator m_begin = matrix.row_begin();
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i + 1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i + 1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(pos_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = id;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
+
+  // Remove all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      PPL_DIRTY_TEMP(N, double_pos_sum);
+      mul_2exp_assign_r(double_pos_sum, pos_sum, 1, ROUND_UP);
+      matrix[n_var + 1][n_var] = double_pos_sum;
+      // Deduce constraints of the form `v +/- u', where `u != v'.
+      deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != var_id) {
+        const Coefficient& ppi = sc_expr.coefficient(Variable(pos_pinf_index));
+        if (ppi == sc_denom)
+          // Add the constraint `v - pos_pinf_index <= pos_sum'.
+          if (var_id < pos_pinf_index)
+            matrix[2*pos_pinf_index][n_var] = pos_sum;
+          else
+            matrix[n_var + 1][2*pos_pinf_index + 1] = pos_sum;
+        else
+          if (ppi == minus_sc_denom) {
+            // Add the constraint `v + pos_pinf_index <= pos_sum'.
+            if (var_id < pos_pinf_index)
+              matrix[2*pos_pinf_index + 1][n_var] = pos_sum;
+            else
+              matrix[n_var + 1][2*pos_pinf_index] = pos_sum;
+          }
+      }
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      PPL_DIRTY_TEMP(N, double_neg_sum);
+      mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+      matrix[n_var][n_var + 1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_denom)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+        else
+          if (npi == minus_sc_denom) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+          }
+      }
+  }
+
+  incremental_strong_closure_assign(var);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::affine_form_image(const Variable var,
+                    const Linear_Form< Interval<T, Interval_Info> >& lf) {
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+    "Octagonal_Shape<T>::affine_form_image(Variable, Linear_Form):"
+    " T is not a floating point type.");
+
+  // Dimension-compatibility checks.
+  // The dimension of `lf' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(v, l)", "l", lf);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_form_image(v, l)", var.id() + 1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lf': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `lf', if any.
+  dimension_type w_id = 0;
+
+  // Get information about the number of non-zero coefficients in `lf'.
+  for (dimension_type i = lf_space_dim; i-- > 0; )
+    if (lf.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i;
+    }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  using std::swap;
+
+  const dimension_type n_var = 2*var_id;
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `lf':
+  // - If t == 0, then lf == [lb, ub];
+  // - If t == 1, then lf == a*w + [lb, ub], where `w' can be `v' or another
+  //   variable;
+  // - If t == 2, the `lf' is of the general form.
+
+  PPL_DIRTY_TEMP(N, b_ub);
+  assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, b_mlb);
+  neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+  if (t == 0) {
+    // Case 1: lf = [lb, ub].
+    forget_all_octagonal_constraints(var_id);
+    mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+    mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+    // Add the constraint `var >= lb && var <= ub'.
+    add_octagonal_constraint(n_var + 1, n_var, b_ub);
+    add_octagonal_constraint(n_var, n_var + 1, b_mlb);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // True if `b' is in [0, 0].
+  bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `lf'.
+    const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id));
+    // True if `w_coeff' is in [1, 1].
+    bool is_w_coeff_one = (w_coeff == 1);
+    // True if `w_coeff' is in [-1, -1].
+    bool is_w_coeff_minus_one = (w_coeff == -1);
+    if (is_w_coeff_one || is_w_coeff_minus_one) {
+      // Case 2: lf = w_coeff*w + b, with w_coeff = [+/-1, +/-1].
+      if (w_id == var_id) {
+        // Here lf = w_coeff*v + b, with w_coeff = [+/-1, +/-1].
+        if (is_w_coeff_one && is_b_zero)
+          // The transformation is the identity function.
+          return;
+        // Translate all the constraints on `var' by adding the value
+        // `b_ub' or subtracting the value `b_lb'.
+        if (is_w_coeff_minus_one)
+          swap(b_ub, b_mlb);
+        const row_iterator m_begin = matrix.row_begin();
+        const row_iterator m_end = matrix.row_end();
+        row_iterator m_iter = m_begin + n_var;
+        row_reference m_v = *m_iter;
+        ++m_iter;
+        row_reference m_cv = *m_iter;
+        ++m_iter;
+        // NOTE: delay update of unary constraints on `var'.
+        for (dimension_type j = n_var; j-- > 0; ) {
+          N& m_v_j = m_v[j];
+          add_assign_r(m_v_j, m_v_j, b_mlb, ROUND_UP);
+          N& m_cv_j = m_cv[j];
+          add_assign_r(m_cv_j, m_cv_j, b_ub, ROUND_UP);
+          if (is_w_coeff_minus_one)
+            swap(m_v_j, m_cv_j);
+        }
+        for ( ; m_iter != m_end; ++m_iter) {
+          row_reference m_i = *m_iter;
+          N& m_i_v = m_i[n_var];
+          add_assign_r(m_i_v, m_i_v, b_ub, ROUND_UP);
+          N& m_i_cv = m_i[n_var + 1];
+          add_assign_r(m_i_cv, m_i_cv, b_mlb, ROUND_UP);
+          if (is_w_coeff_minus_one)
+            swap(m_i_v, m_i_cv);
+        }
+        // Now update unary constraints on var.
+        mul_2exp_assign_r(b_ub, b_ub, 1, ROUND_UP);
+        N& m_cv_v = m_cv[n_var];
+        add_assign_r(m_cv_v, m_cv_v, b_ub, ROUND_UP);
+        mul_2exp_assign_r(b_mlb, b_mlb, 1, ROUND_UP);
+        N& m_v_cv = m_v[n_var + 1];
+        add_assign_r(m_v_cv, m_v_cv, b_mlb, ROUND_UP);
+        if (is_w_coeff_minus_one)
+          swap(m_cv_v, m_v_cv);
+        // Note: strong closure is preserved.
+      }
+      else {
+        // Here `w != var', so that `lf' is of the form
+        // [+/-1, +/-1] * w + b.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        const dimension_type n_w = 2*w_id;
+        if (is_w_coeff_one)
+          // Add the new constraints `var - w >= b_lb'
+          // `and var - w <= b_ub'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w, n_var, b_ub);
+            add_octagonal_constraint(n_w + 1, n_var + 1, b_mlb);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w + 1, b_ub);
+            add_octagonal_constraint(n_var, n_w, b_mlb);
+          }
+        else
+          // Add the new constraints `var + w >= b_lb'
+          // `and var + w <= b_ub'.
+          if (var_id < w_id) {
+            add_octagonal_constraint(n_w + 1, n_var, b_ub);
+            add_octagonal_constraint(n_w, n_var + 1, b_mlb);
+          }
+          else {
+            add_octagonal_constraint(n_var + 1, n_w, b_ub);
+            add_octagonal_constraint(n_var, n_w + 1, b_mlb);
+          }
+        incremental_strong_closure_assign(var);
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+  // or t == 1, expr == i*w + b, but i <> [+/-1, +/-1].
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  Linear_Form<FP_Interval_Type> minus_lf(lf);
+  minus_lf.negate();
+
+  // Declare temporaries outside the loop.
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  row_iterator m_iter = matrix.row_begin();
+  m_iter += n_var;
+  row_reference var_ite = *m_iter;
+  ++m_iter;
+  row_reference var_cv_ite = *m_iter;
+  ++m_iter;
+  row_iterator m_end = matrix.row_end();
+
+  // Update binary constraints on var FIRST.
+  for (dimension_type curr_var = var_id,
+         n_curr_var = n_var - 2; curr_var-- > 0; ) {
+    Variable current(curr_var);
+    linear_form_upper_bound(lf + current, upper_bound);
+    assign_r(var_cv_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(var_cv_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(var_ite[n_curr_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf - current, upper_bound);
+    assign_r(var_ite[n_curr_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    n_curr_var -= 2;
+  }
+  for (dimension_type curr_var = var_id + 1; m_iter != m_end; ++m_iter) {
+    row_reference m_v_ite = *m_iter;
+    ++m_iter;
+    row_reference m_cv_ite = *m_iter;
+    Variable current(curr_var);
+    linear_form_upper_bound(lf + current, upper_bound);
+    assign_r(m_cv_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(m_v_ite[n_var], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(m_cv_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf - current, upper_bound);
+    assign_r(m_v_ite[n_var + 1], upper_bound, ROUND_NOT_NEEDED);
+    ++curr_var;
+  }
+
+  // Finally, update unary constraints on var.
+  PPL_DIRTY_TEMP(N, lf_ub);
+  linear_form_upper_bound(lf, lf_ub);
+  PPL_DIRTY_TEMP(N, minus_lf_ub);
+  linear_form_upper_bound(minus_lf, minus_lf_ub);
+  mul_2exp_assign_r(lf_ub, lf_ub, 1, ROUND_UP);
+  assign_r(matrix[n_var + 1][n_var], lf_ub, ROUND_NOT_NEEDED);
+  mul_2exp_assign_r(minus_lf_ub, minus_lf_ub, 1, ROUND_UP);
+  assign_r(matrix[n_var][n_var + 1], minus_lf_ub, ROUND_NOT_NEEDED);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+Octagonal_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+                        N& result) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::linear_form_upper_bound:"
+                     " T not a floating point type.");
+
+  const dimension_type lf_space_dimension = lf.space_dimension();
+  PPL_ASSERT(lf_space_dimension <= space_dim);
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  PPL_DIRTY_TEMP(N, curr_lb);
+  PPL_DIRTY_TEMP(N, curr_ub);
+  PPL_DIRTY_TEMP(N, curr_var_ub);
+  PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+  PPL_DIRTY_TEMP(N, first_comparison_term);
+  PPL_DIRTY_TEMP(N, second_comparison_term);
+
+  PPL_DIRTY_TEMP(N, negator);
+
+  assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+  for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+       ++curr_var) {
+    const FP_Interval_Type& curr_coefficient =
+                            lf.coefficient(Variable(curr_var));
+    assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (curr_lb != 0 || curr_ub != 0) {
+      assign_r(curr_var_ub, matrix[n_var + 1][n_var], ROUND_NOT_NEEDED);
+      div_2exp_assign_r(curr_var_ub, curr_var_ub, 1, ROUND_UP);
+      neg_assign_r(curr_minus_var_ub, matrix[n_var][n_var + 1],
+                   ROUND_NOT_NEEDED);
+      div_2exp_assign_r(curr_minus_var_ub, curr_minus_var_ub, 1, ROUND_DOWN);
+      // Optimize the most common case: curr = +/-[1, 1].
+      if (curr_lb == 1 && curr_ub == 1) {
+        add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+                     ROUND_UP);
+      }
+      else if (curr_lb == -1 && curr_ub == -1) {
+        neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+                     ROUND_NOT_NEEDED);
+        add_assign_r(result, result, negator, ROUND_UP);
+      }
+      else {
+        // Next addend will be the maximum of four quantities.
+        assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+                         ROUND_UP);
+        add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+
+        add_assign_r(result, result, first_comparison_term, ROUND_UP);
+      }
+    }
+
+    n_var += 2;
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::
+interval_coefficient_upper_bound(const N& var_ub, const N& minus_var_ub,
+                                 const N& int_ub, const N& int_lb,
+                                 N& result) {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "Octagonal_Shape<T>::interval_coefficient_upper_bound:"
+                     " T not a floating point type.");
+
+  // NOTE: we store the first comparison term directly into result.
+  PPL_DIRTY_TEMP(N, second_comparison_term);
+  PPL_DIRTY_TEMP(N, third_comparison_term);
+  PPL_DIRTY_TEMP(N, fourth_comparison_term);
+
+  assign_r(result, 0, ROUND_NOT_NEEDED);
+  assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+  assign_r(third_comparison_term, 0, ROUND_NOT_NEEDED);
+  assign_r(fourth_comparison_term, 0, ROUND_NOT_NEEDED);
+
+  add_mul_assign_r(result, var_ub, int_ub, ROUND_UP);
+  add_mul_assign_r(second_comparison_term, minus_var_ub, int_ub, ROUND_UP);
+  add_mul_assign_r(third_comparison_term, var_ub, int_lb, ROUND_UP);
+  add_mul_assign_r(fourth_comparison_term, minus_var_ub, int_lb, ROUND_UP);
+
+  assign_r(result, std::max(result, second_comparison_term), ROUND_NOT_NEEDED);
+  assign_r(result, std::max(result, third_comparison_term), ROUND_NOT_NEEDED);
+  assign_r(result, std::max(result, fourth_comparison_term), ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::affine_preimage(const Variable var,
+                                    const Linear_Expression& expr,
+                                    Coefficient_traits::const_reference
+                                    denominator) {
+
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var_id + 1);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == -denominator) {
+      // Case 2: expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, w_coeff);
+      }
+      else {
+        // `expr == w_coeff*w + b', where `w != var'.
+        // Remove all constraints on `var'.
+        forget_all_octagonal_constraints(var_id);
+        PPL_ASSERT(OK());
+      }
+      return;
+    }
+  }
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& coeff_v = expr.coefficient(var);
+  if (coeff_v != 0) {
+    if (coeff_v > 0) {
+      // The transformation is invertible.
+      Linear_Expression inverse = ((coeff_v + denominator)*var);
+      inverse -= expr;
+      affine_image(var, inverse, coeff_v);
+    }
+    else {
+      // The transformation is invertible.
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_v);
+      neg_assign(minus_coeff_v, coeff_v);
+      Linear_Expression inverse = ((minus_coeff_v - denominator)*var);
+      inverse += expr;
+      affine_image(var, inverse, minus_coeff_v);
+    }
+  }
+  else {
+    // The transformation is not invertible: all constraints on `var' are lost.
+    forget_all_octagonal_constraints(var_id);
+    PPL_ASSERT(OK());
+  }
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression&  expr ,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)", "e",
+                                 expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var_id + 1);
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `expr', if any.
+  dimension_type w_id = expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = expr.inhomogeneous_term();
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: expr = b.
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    // Remove all constraints on `var'.
+    forget_all_octagonal_constraints(var_id);
+    // Strong closure is lost.
+    reset_strongly_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_octagonal_constraint(n_var + 1, n_var, two_b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= n/denominator',
+      // i.e., `-var <= -b/denominator'.
+      add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `expr'.
+    const Coefficient& w_coeff = expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_denom) {
+      // Case 2: expr == w_coeff*w + b, with w_coeff == +/- denominator.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        {
+          PPL_DIRTY_TEMP(N, d);
+          div_round_up(d, b, denominator);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate all the constraints of the form `v - w <= cost'
+              // into the constraint `v - w <= cost + b/denominator';
+              // forget each constraint `w - v <= cost1'.
+              row_iterator m_iter = m_begin + n_var;
+              row_reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var + 1];
+              ++m_iter;
+              row_reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ; m_iter != m_end; ++m_iter) {
+                row_reference m_i = *m_iter;
+                N& m_i_v = m_i[n_var];
+                add_assign_r(m_i_v, m_i_v, d, ROUND_UP);
+                assign_r(m_i[n_var + 1], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                assign_r(m_v[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_cv[k], m_cv[k], d, ROUND_UP);
+              }
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(m_cv_v, m_cv_v, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_v_cv = matrix[n_var][n_var + 1];
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(matrix[n_var + 1][n_var], m_v_cv, d, ROUND_UP);
+              assign_r(m_v_cv, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is the form
+            // +/- denominator*w + b.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            if (w_coeff == denominator) {
+              // Add the new constraint `v - w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var + 1, n_w + 1, b, denominator);
+            }
+            else {
+              // Add the new constraint `v + w <= b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w + 1, n_var, b, denominator);
+              else
+                add_octagonal_constraint(n_var + 1, n_w, b, denominator);
+            }
+          }
+          break;
+        }
+
+      case GREATER_OR_EQUAL:
+        {
+          PPL_DIRTY_TEMP(N, d);
+          div_round_up(d, b, minus_denom);
+          if (w_id == var_id) {
+            // Here `expr' is of the form: +/- denominator * v + b.
+            // Strong closure is not preserved.
+            reset_strongly_closed();
+            if (w_coeff == denominator) {
+              // Translate each constraint `w - v <= cost'
+              // into the constraint `w - v <= cost - b/denominator';
+              // forget each constraint `v - w <= cost1'.
+              row_iterator m_iter = m_begin + n_var;
+              row_reference m_v = *m_iter;
+              N& m_v_cv = m_v[n_var + 1];
+              ++m_iter;
+              row_reference m_cv = *m_iter;
+              N& m_cv_v = m_cv[n_var];
+              ++m_iter;
+              // NOTE: delay update of m_v_cv and m_cv_v.
+              for ( ; m_iter != m_end; ++m_iter) {
+                row_reference m_i = *m_iter;
+                assign_r(m_i[n_var], PLUS_INFINITY, ROUND_NOT_NEEDED);
+                add_assign_r(m_i[n_var + 1], m_i[n_var + 1], d, ROUND_UP);
+              }
+              for (dimension_type k = n_var; k-- > 0; ) {
+                add_assign_r(m_v[k], m_v[k], d, ROUND_UP);
+                assign_r(m_cv[k], PLUS_INFINITY, ROUND_NOT_NEEDED);
+              }
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(m_v_cv, m_v_cv, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+            else {
+              // Here `w_coeff == -denominator'.
+              // `expr' is of the form: -a*var + b.
+              N& m_cv_v = matrix[n_var + 1][n_var];
+              mul_2exp_assign_r(d, d, 1, ROUND_UP);
+              add_assign_r(matrix[n_var][n_var + 1], m_cv_v, d, ROUND_UP);
+              assign_r(m_cv_v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+              forget_binary_octagonal_constraints(var_id);
+            }
+          }
+          else {
+            // Here `w != v', so that `expr' is of the form
+            // +/-denominator * w + b, with `w != v'.
+            // Remove all constraints on `v'.
+            forget_all_octagonal_constraints(var_id);
+            const dimension_type n_w = 2*w_id;
+            // We have got an expression of the following form:
+            // var1 + n, with `var1' != `var'.
+            // We remove all constraints of the form `var (+/- var1) >= const'
+            // and we add the new constraint `var +/- var1 >= n/denominator'.
+            if (w_coeff == denominator) {
+              // Add the new constraint `var - w >= b/denominator',
+              // i.e., `w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+              else
+                add_octagonal_constraint(n_var, n_w, b, minus_denom);
+            }
+            else {
+              // Add the new constraint `var + w >= b/denominator',
+              // i.e., `-w - var <= -b/denominator'.
+              if (var_id < w_id)
+                add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+              else
+                add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+            }
+          }
+          break;
+        }
+
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->matrix'.
+  PPL_UNINITIALIZED(dimension_type, pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    {
+      // Compute an upper approximation for `sc_expr' into `sum'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      // Approximate the homogeneous part of `sc_expr'.
+      PPL_DIRTY_TEMP(N, coeff_i);
+      PPL_DIRTY_TEMP(N, approx_i);
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_ci[n_i] : m_i[n_i + 1];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+      // Remove all constraints on `v'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_denom != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_denom' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_denom' and negating again the result.
+        PPL_DIRTY_TEMP(N, down_sc_denom);
+        assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+        neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+        // Add the constraint `v <= pos_sum'.
+        PPL_DIRTY_TEMP(N, double_sum);
+        mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+        matrix[n_var + 1][n_var] = double_sum;
+        // Deduce constraints of the form `v +/- u', where `u != v'.
+        deduce_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator ) {
+            // Add the constraint `v - pinf_index <= sum'.
+            if (var_id < pinf_index)
+              matrix[2*pinf_index][n_var] = sum;
+            else
+              matrix[n_var + 1][2*pinf_index + 1] = sum;
+          }
+          else {
+            if (pi == minus_denom) {
+              // Add the constraint `v + pinf_index <= sum'.
+              if (var_id < pinf_index)
+                matrix[2*pinf_index + 1][n_var] = sum;
+              else
+                matrix[n_var + 1][2*pinf_index] = sum;
+            }
+          }
+        }
+      break;
+    }
+
+  case GREATER_OR_EQUAL:
+    {
+      // Compute an upper approximation for `-sc_expr' into `sum'.
+      // Note: approximating `-sc_expr' from above and then negating the
+      // result is the same as approximating `sc_expr' from below.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, minus_sc_b, ROUND_UP);
+      PPL_DIRTY_TEMP(N, coeff_i);
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+      PPL_DIRTY_TEMP(N, approx_i);
+      // Approximate the homogeneous part of `-sc_expr'.
+      for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+           m_iter != m_iter_end; ) {
+        const dimension_type n_i = m_iter.index();
+        const dimension_type id = n_i/2;
+        Row_reference m_i = *m_iter;
+        ++m_iter;
+        Row_reference m_ci = *m_iter;
+        ++m_iter;
+        const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+        const int sign_i = sgn(sc_i);
+        if (sign_i == 0)
+          continue;
+        // Choose carefully: we are approximating `-sc_expr'.
+        const N& double_approx_i = (sign_i > 0) ? m_i[n_i + 1] : m_ci[n_i];
+        if (is_plus_infinity(double_approx_i)) {
+          if (++pinf_count > 1)
+            break;
+          pinf_index = id;
+          continue;
+        }
+        if (sign_i > 0)
+          assign_r(coeff_i, sc_i, ROUND_UP);
+        else {
+          neg_assign(minus_sc_i, sc_i);
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+        }
+        div_2exp_assign_r(approx_i, double_approx_i, 1, ROUND_UP);
+        add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+      }
+
+      // Remove all constraints on `var'.
+      forget_all_octagonal_constraints(var_id);
+      reset_strongly_closed();
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1) {
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      // Divide by the (sign corrected) denominator (if needed).
+      if (sc_denom != 1) {
+        // Before computing the quotient, the denominator should be
+        // approximated towards zero. Since `sc_denom' is known to be
+        // positive, this amounts to rounding downwards, which is
+        // achieved as usual by rounding upwards
+        // `minus_sc_denom' and negating again the result.
+        PPL_DIRTY_TEMP(N, down_sc_denom);
+        assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+        neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+        div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+      }
+
+      if (pinf_count == 0) {
+        // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+        PPL_DIRTY_TEMP(N, double_sum);
+        mul_2exp_assign_r(double_sum, sum, 1, ROUND_UP);
+        matrix[n_var][n_var + 1] = double_sum;
+        // Deduce constraints of the form `-v +/- u', where `u != v'.
+        deduce_minus_v_pm_u_bounds(var_id, pinf_index, sc_expr, sc_denom, sum);
+      }
+      else if (pinf_count == 1)
+        if (pinf_index != var_id) {
+          const Coefficient& pi = expr.coefficient(Variable(pinf_index));
+          if (pi == denominator) {
+            // Add the constraint `v - pinf_index >= -sum',
+            // i.e., `pinf_index - v <= sum'.
+            if (pinf_index < var_id)
+              matrix[n_var][2*pinf_index] = sum;
+            else
+              matrix[2*pinf_index + 1][n_var + 1] = sum;
+          }
+          else {
+            if (pi == minus_denom) {
+              // Add the constraint `v + pinf_index >= -sum',
+              // i.e., `-pinf_index - v <= sum'.
+              if (pinf_index < var_id)
+                matrix[n_var][2*pinf_index + 1] = sum;
+              else
+                matrix[2*pinf_index][n_var + 1] = sum;
+            }
+          }
+        }
+      break;
+    }
+
+  default:
+    // We already dealt with the other cases.
+    PPL_UNREACHABLE;
+    break;
+  }
+  incremental_strong_closure_assign(var);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                             const Relation_Symbol relsym,
+                                             const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    --j_lhs;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is an octagonal difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs' or
+    // `rhs == a*v + a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not an octagonal difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, denom);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not an octagonal constraint.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // an octagonal difference (since it has 3 variables at least).
+      // Thus, the method refine_no_check() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= new_var);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_image(const Variable var,
+                                         const Linear_Expression& lb_expr,
+                                         const Linear_Expression& ub_expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 var_id + 1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lb_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Variable-index of the last non-zero coefficient in `lb_expr', if any.
+  dimension_type w_id = lb_expr.last_nonzero();
+
+  if (w_id != 0) {
+    ++t;
+    if (!lb_expr.all_zeroes(1, w_id))
+      ++t;
+    --w_id;
+  }
+
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const dimension_type n_var = 2*var_id;
+  const Coefficient& b = lb_expr.inhomogeneous_term();
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign_r(minus_denom, denominator, ROUND_NOT_NEEDED);
+
+  // `w' is the variable with index `w_id'.
+  // Now we know the form of `lb_expr':
+  // - If t == 0, then lb_expr == b, with `b' a constant;
+  // - If t == 1, then lb_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `lb_expr' is of the general form.
+
+  if (t == 0) {
+    // Case 1: lb_expr == b.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    PPL_DIRTY_TEMP_COEFFICIENT(two_b);
+    two_b = 2*b;
+    // Add the constraint `var >= b/denominator'.
+    add_octagonal_constraint(n_var, n_var + 1, two_b, minus_denom);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // The one and only non-zero homogeneous coefficient in `lb_expr'.
+    const Coefficient& w_coeff = lb_expr.coefficient(Variable(w_id));
+    if (w_coeff == denominator || w_coeff == minus_denom) {
+      // Case 2: lb_expr = w_coeff*w + b, with w_coeff = +/- denominator.
+      if (w_id == var_id) {
+        // Here `var' occurs in `lb_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var(space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `lb_expr'.
+        // Here `lb_expr' is of the form: +/- denominator * v + b.
+        affine_image(new_var, lb_expr, denominator);
+        // Enforce the strong closure for precision.
+        strong_closure_assign();
+        PPL_ASSERT(!marked_empty());
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Now apply the affine lower bound, as recorded in `new_var'
+        refine_no_check(var >= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(space_dim-1);
+        return;
+      }
+      else {
+        // Apply the affine upper bound.
+        generalized_affine_image(var,
+                                 LESS_OR_EQUAL,
+                                 ub_expr,
+                                 denominator);
+        // Here `w != var', so that `lb_expr' is of the form
+        // +/-denominator * w + b.
+        const dimension_type n_w = 2*w_id;
+        // Add the new constraint `var - w >= b/denominator'.
+        if (w_coeff == denominator)
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w + 1, n_var + 1, b, minus_denom);
+          else
+            add_octagonal_constraint(n_var, n_w, b, minus_denom);
+        else {
+          // Add the new constraint `var + w >= b/denominator'.
+          if (var_id < w_id)
+            add_octagonal_constraint(n_w, n_var + 1, b, minus_denom);
+          else
+            add_octagonal_constraint(n_var, n_w + 1, b, minus_denom);
+        }
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign_r(minus_b, b, ROUND_NOT_NEEDED);
+
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -lb_expr;
+  const Linear_Expression& sc_expr = is_sc ? lb_expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->matrix'.
+  PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP(N, minus_coeff_i);
+  PPL_DIRTY_TEMP(N, half);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Row_iterator m_iter = m_begin, m_iter_end = m_begin + (2 * w_id + 2);
+       m_iter != m_iter_end; ) {
+    const dimension_type n_i = m_iter.index();
+    const dimension_type id = n_i/2;
+    Row_reference m_i = *m_iter;
+    ++m_iter;
+    Row_reference m_ci = *m_iter;
+    ++m_iter;
+    const Coefficient& sc_i = sc_expr.coefficient(Variable(id));
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_minus_i = m_i[n_i + 1];
+        if (!is_plus_infinity(double_up_approx_minus_i)) {
+          // Let half = double_up_approx_minus_i / 2.
+          div_2exp_assign_r(half, double_up_approx_minus_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+    else if (sign_i < 0) {
+      neg_assign_r(minus_sc_i, sc_i, ROUND_NOT_NEEDED);
+      assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& double_up_approx_i = m_ci[n_i];
+        if (!is_plus_infinity(double_up_approx_i)) {
+          // Let half = double_up_approx_i / 2.
+          div_2exp_assign_r(half, double_up_approx_i, 1, ROUND_UP);
+          add_mul_assign_r(neg_sum, minus_coeff_i, half, ROUND_UP);
+        }
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = id;
+        }
+      }
+    }
+  }
+
+  // Apply the affine upper bound.
+  generalized_affine_image(var,
+                           LESS_OR_EQUAL,
+                           ub_expr,
+                           denominator);
+
+  // Return immediately if no approximation could be computed.
+  if (neg_pinf_count > 1) {
+    return;
+  }
+
+  // In the following, strong closure will be definitely lost.
+  reset_strongly_closed();
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      PPL_DIRTY_TEMP(N, double_neg_sum);
+      mul_2exp_assign_r(double_neg_sum, neg_sum, 1, ROUND_UP);
+      matrix[n_var][n_var + 1] = double_neg_sum;
+      // Deduce constraints of the form `-v +/- u', where `u != v'.
+      deduce_minus_v_pm_u_bounds(var_id, w_id, sc_expr, sc_denom, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != var_id) {
+        const Coefficient& npi = sc_expr.coefficient(Variable(neg_pinf_index));
+        if (npi == sc_denom)
+          // Add the constraint `v - neg_pinf_index >= -neg_sum',
+          // i.e., `neg_pinf_index - v <= neg_sum'.
+          if (neg_pinf_index < var_id)
+            matrix[n_var][2*neg_pinf_index] = neg_sum;
+          else
+            matrix[2*neg_pinf_index + 1][n_var + 1] = neg_sum;
+        else
+          if (npi == minus_sc_denom) {
+            // Add the constraint `v + neg_pinf_index >= -neg_sum',
+            // i.e., `-neg_pinf_index - v <= neg_sum'.
+            if (neg_pinf_index < var_id)
+              matrix[n_var][2*neg_pinf_index + 1] = neg_sum;
+            else
+              matrix[2*neg_pinf_index][n_var + 1] = neg_sum;
+          }
+      }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference
+                              denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var_id + 1);
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // The image of an empty octagon is empty too.
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+    neg_assign(inverse_denom, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the Octagonal_Shape by adding the constraint induced
+  // by the affine relation.
+  refine(var, relsym, expr, denominator);
+
+  // If the shrunk OS is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `var'.
+  forget_all_octagonal_constraints(var_id);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for octagons.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty.
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    j_lhs--;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  // If all variables have a zero coefficient, then `lhs' is a constant:
+  // in this case, preimage and image happen to be the same.
+  if (t_lhs == 0) {
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, denom);
+  }
+
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT an octagonal difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+
+      // Any image of an empty octagon is empty.
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not an octagonal difference.
+      affine_image(new_var, lhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce strong closure for precision.
+      strong_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; ) {
+        dimension_type lhs_vars_i = lhs_vars[i].id();
+        forget_all_octagonal_constraints(lhs_vars_i);
+      }
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == v + b_rhs' or `rhs == -v + b_rhs' or `rhs == b_rhs',
+      // one of the following constraints will be added, because they
+      // are octagonal differences.
+      // Else the following constraints are NOT octagonal differences,
+      // so the method refine_no_check() will ignore them.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(new_var <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::bounded_affine_preimage(const Variable var,
+                                            const Linear_Expression& lb_expr,
+                                            const Linear_Expression& ub_expr,
+                                            Coefficient_traits::const_reference
+                                            denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // `var' should be one of the dimensions of the octagon.
+  const dimension_type var_id = var.id();
+  if (space_dim < var_id + 1)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 var_id + 1);
+
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  strong_closure_assign();
+  // The image of an empty octagon is empty too.
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
+  }
+
+  const Coefficient& expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (expr_v + denominator)*var;
+  PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+  neg_assign(inverse_denom, expr_v);
+  affine_image(new_var, lb_inverse, inverse_denom);
+  strong_closure_assign();
+  PPL_ASSERT(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(inverse_denom))
+    refine_no_check(var >= new_var) ;
+  else
+    refine_no_check(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim-1);
+}
+
+template <typename T>
+Constraint_System
+Octagonal_Shape<T>::constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  row_iterator m_begin = matrix.row_begin();
+  row_iterator m_end = matrix.row_end();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(a);
+  PPL_DIRTY_TEMP_COEFFICIENT(b);
+
+  // Go through all the unary constraints in `matrix'.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable x(i/2);
+    const N& c_i_ii = (*i_iter)[i + 1];
+    ++i_iter;
+    const N& c_ii_i = (*i_iter)[i];
+    ++i_iter;
+    // Go through unary constraints.
+    if (is_additive_inverse(c_i_ii, c_ii_i)) {
+      // We have a unary equality constraint.
+      numer_denom(c_ii_i, b, a);
+      a *= 2;
+      cs.insert(a*x == b);
+    }
+    else {
+      // We have 0, 1 or 2 inequality constraints.
+      if (!is_plus_infinity(c_i_ii)) {
+        numer_denom(c_i_ii, b, a);
+        a *= 2;
+        cs.insert(-a*x <= b);
+      }
+      if (!is_plus_infinity(c_ii_i)) {
+        numer_denom(c_ii_i, b, a);
+        a *= 2;
+        cs.insert(a*x <= b);
+      }
+    }
+  }
+  //  Go through all the binary constraints in `matrix'.
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    row_reference r_i = *i_iter;
+    ++i_iter;
+    row_reference r_ii = *i_iter;
+    ++i_iter;
+    const Variable y(i/2);
+    for (dimension_type j = 0; j < i; j += 2) {
+      const N& c_i_j = r_i[j];
+      const N& c_ii_jj = r_ii[j + 1];
+      const Variable x(j/2);
+      if (is_additive_inverse(c_ii_jj, c_i_j)) {
+        // We have an equality constraint of the form a*x - a*y = b.
+        numer_denom(c_i_j, b, a);
+        cs.insert(a*x - a*y == b);
+      }
+      else {
+        // We have 0, 1 or 2 inequality constraints.
+        if (!is_plus_infinity(c_i_j)) {
+          numer_denom(c_i_j, b, a);
+          cs.insert(a*x - a*y <= b);
+        }
+        if (!is_plus_infinity(c_ii_jj)) {
+          numer_denom(c_ii_jj, b, a);
+          cs.insert(a*y - a*x <= b);
+        }
+      }
+
+      const N& c_ii_j = r_ii[j];
+      const N& c_i_jj = r_i[j + 1];
+      if (is_additive_inverse(c_i_jj, c_ii_j)) {
+        // We have an equality constraint of the form a*x + a*y = b.
+        numer_denom(c_ii_j, b, a);
+        cs.insert(a*x + a*y == b);
+      }
+      else {
+        // We have 0, 1 or 2 inequality constraints.
+        if (!is_plus_infinity(c_i_jj)) {
+          numer_denom(c_i_jj, b, a);
+          cs.insert(-a*x - a*y <= b);
+        }
+        if (!is_plus_infinity(c_ii_j)) {
+          numer_denom(c_ii_j, b, a);
+          cs.insert(a*x + a*y <= b);
+        }
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  // `var' should be one of the dimensions of the vector space.
+  const dimension_type var_id = var.id();
+  if (var_id + 1 > space_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", var_id + 1);
+
+  // The space dimension of the resulting octagon should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dim)
+    throw_invalid_argument("expand_dimension(v, m)",
+                           "adding m new space dimensions exceeds "
+                           "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Keep track of the dimension before adding the new ones.
+  const dimension_type old_num_rows = matrix.num_rows();
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  typedef typename OR_Matrix<N>::const_row_iterator Row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type Row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+  const row_iterator m_end = matrix.row_end();
+  const dimension_type n_var = 2*var_id;
+  Row_iterator v_iter = m_begin + n_var;
+  Row_reference m_v = *v_iter;
+  Row_reference m_cv = *(v_iter + 1);
+
+  for (row_iterator i_iter = m_begin + old_num_rows; i_iter != m_end;
+       i_iter += 2) {
+    row_reference m_i = *i_iter;
+    row_reference m_ci = *(i_iter + 1);
+    const dimension_type i = i_iter.index();
+    const dimension_type ci = i + 1;
+    m_i[ci] = m_v[n_var + 1];
+    m_ci[i] = m_cv[n_var];
+    for (dimension_type j = 0; j < n_var; ++j) {
+      m_i[j] = m_v[j];
+      m_ci[j] = m_cv[j];
+    }
+    for (dimension_type j = n_var + 2; j < old_num_rows; ++j) {
+      row_iterator j_iter = m_begin + j;
+      row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+      m_i[j] = m_cj[n_var + 1];
+      m_ci[j] = m_cj[n_var];
+    }
+  }
+  // In general, adding a constraint does not preserve the strong closure
+  // of the octagon.
+  if (marked_strongly_closed())
+    reset_strongly_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+                                          Variable dest) {
+  // `dest' should be one of the dimensions of the octagon.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the octagon.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  // Recompute the elements of the row and the column corresponding
+  // to variable `dest' by taking the join of their value with the
+  // value of the corresponding elements in the row and column of the
+  // variable `vars'.
+  typedef typename OR_Matrix<N>::row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+
+  const row_iterator m_begin = matrix.row_begin();
+
+  strong_closure_assign();
+  const dimension_type n_rows = matrix.num_rows();
+  const dimension_type n_dest = 2*dest.id();
+  row_iterator v_iter = m_begin + n_dest;
+  row_reference m_v = *v_iter;
+  row_reference m_cv = *(v_iter + 1);
+  for (Variables_Set::const_iterator i = vars.begin(),
+         vs_end = vars.end(); i != vs_end; ++i) {
+    const dimension_type tbf_id = *i;
+    const dimension_type tbf_var = 2*tbf_id;
+    row_iterator tbf_iter = m_begin + tbf_var;
+    row_reference m_tbf = *tbf_iter;
+    row_reference m_ctbf = *(tbf_iter + 1);
+    max_assign(m_v[n_dest + 1], m_tbf[tbf_var + 1]);
+    max_assign(m_cv[n_dest], m_ctbf[tbf_var]);
+
+    const dimension_type min_id = std::min(n_dest, tbf_var);
+    const dimension_type max_id = std::max(n_dest, tbf_var);
+
+    using namespace Implementation::Octagonal_Shapes;
+    for (dimension_type j = 0; j < min_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      max_assign(m_v[j], m_tbf[j]);
+      max_assign(m_cv[j], m_ctbf[j]);
+      max_assign(m_cv[cj], m_ctbf[cj]);
+      max_assign(m_v[cj], m_tbf[cj]);
+    }
+    for (dimension_type j = min_id + 2; j < max_id; ++j) {
+      const dimension_type cj = coherent_index(j);
+      row_iterator j_iter = m_begin + j;
+      row_reference m_j = *j_iter;
+      row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+      if (n_dest == min_id) {
+        max_assign(m_cj[n_dest + 1], m_tbf[j]);
+        max_assign(m_cj[n_dest], m_ctbf[j]);
+        max_assign(m_j[n_dest], m_ctbf[cj]);
+        max_assign(m_j[n_dest + 1], m_tbf[cj]);
+      }
+      else {
+        max_assign(m_v[j], m_cj[tbf_var + 1]);
+        max_assign(m_cv[j], m_cj[tbf_var]);
+        max_assign(m_cv[cj], m_j[tbf_var]);
+        max_assign(m_v[cj], m_j[tbf_var + 1]);
+      }
+    }
+    for (dimension_type j = max_id + 2; j < n_rows; ++j) {
+      row_iterator j_iter = m_begin + j;
+      row_reference m_j = *j_iter;
+      row_reference m_cj = (j % 2 != 0) ? *(j_iter-1) : *(j_iter + 1);
+      max_assign(m_cj[n_dest + 1], m_cj[tbf_var + 1]);
+      max_assign(m_cj[n_dest], m_cj[tbf_var]);
+      max_assign(m_j[n_dest], m_j[tbf_var]);
+      max_assign(m_j[n_dest + 1], m_j[tbf_var + 1]);
+    }
+  }
+  remove_space_dimensions(vars);
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+  // FIXME, CHECKME: what about inexact computations?
+
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const Octagonal_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+  PPL_ASSERT(x.marked_strongly_closed());
+  PPL_ASSERT(y.marked_strongly_closed());
+  // Pre-compute the upper bound of `x' and `y'.
+  Octagonal_Shape<T> ub(x);
+  ub.upper_bound_assign(y);
+
+  // Compute redundancy information for x and y.
+  // TODO: provide a nicer data structure for redundancy.
+  std::vector<Bit_Row> x_non_red;
+  x.non_redundant_matrix_entries(x_non_red);
+  std::vector<Bit_Row> y_non_red;
+  y.non_redundant_matrix_entries(y_non_red);
+
+  PPL_DIRTY_TEMP(N, lhs);
+  PPL_DIRTY_TEMP(N, lhs_copy);
+  PPL_DIRTY_TEMP(N, rhs);
+  PPL_DIRTY_TEMP(N, temp_zero);
+  assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+  const dimension_type n_rows = x.matrix.num_rows();
+  const row_iterator x_m_begin = x.matrix.row_begin();
+  const row_iterator y_m_begin = y.matrix.row_begin();
+  const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    const Bit_Row& x_non_red_i = x_non_red[i];
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type ci = coherent_index(i);
+    const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+    row_reference x_i = *(x_m_begin + i);
+    row_reference y_i = *(y_m_begin + i);
+    row_reference ub_i = *(ub_m_begin + i);
+    const N& ub_i_ci = ub_i[ci];
+    for (dimension_type j = row_size_i; j-- > 0; ) {
+      // Check redundancy of x_i_j.
+      if (!x_non_red_i[j])
+        continue;
+      const N& x_i_j = x_i[j];
+      // Check 1st condition in BHZ09 theorem.
+      if (x_i_j >= y_i[j])
+        continue;
+      const dimension_type cj = coherent_index(j);
+      const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+      row_reference ub_cj = *(ub_m_begin + cj);
+      const N& ub_cj_j = ub_cj[j];
+      for (dimension_type k = 0; k < n_rows; ++k) {
+        const Bit_Row& y_non_red_k = y_non_red[k];
+        const dimension_type ck = coherent_index(k);
+        const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+        row_reference x_k = *(x_m_begin + k);
+        row_reference y_k = *(y_m_begin + k);
+        row_reference ub_k = *(ub_m_begin + k);
+        const N& ub_k_ck = ub_k[ck];
+        // Be careful: for each index h, the diagonal element m[h][h]
+        // is (by convention) +infty in our implementation; however,
+        // BHZ09 theorem assumes that it is equal to 0.
+        const N& ub_k_j
+          = (k == j)
+          ? temp_zero
+          : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+        const N& ub_i_ck
+          = (i == ck)
+          ? temp_zero
+          : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+        for (dimension_type ell = row_size_k; ell-- > 0; ) {
+          // Check redundancy of y_k_ell.
+          if (!y_non_red_k[ell])
+            continue;
+          const N& y_k_ell = y_k[ell];
+          // Check 2nd condition in BHZ09 theorem.
+          if (y_k_ell >= x_k[ell])
+            continue;
+          const dimension_type cell = coherent_index(ell);
+          row_reference ub_cell = *(ub_m_begin + cell);
+          const N& ub_i_ell
+            = (i == ell)
+            ? temp_zero
+            : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+          const N& ub_cj_ell
+            = (cj == ell)
+            ? temp_zero
+            : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+          // Check 3rd condition in BHZ09 theorem.
+          add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+          add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 4th condition in BHZ09 theorem.
+          add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 5th condition in BHZ09 theorem.
+          assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+          add_assign_r(lhs, lhs_copy, x_i_j, ROUND_UP);
+          add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_cj_j, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 6th condition in BHZ09 theorem.
+          add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_i_ci, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 7th condition of BHZ09 theorem.
+          add_assign_r(lhs, lhs_copy, y_k_ell, ROUND_UP);
+          add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_k_ck, ROUND_UP);
+          if (lhs >= rhs)
+            continue;
+          // Check 8th (last) condition in BHZ09 theorem.
+          add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_UP);
+          add_assign_r(rhs, rhs, ub_cell[ell], ROUND_UP);
+          if (lhs < rhs)
+            // All 8 conditions are satisfied:
+            // upper bound is not exact.
+            return false;
+        }
+      }
+    }
+  }
+
+  // The upper bound of x and y is indeed exact.
+  m_swap(ub);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>
+::integer_upper_bound_assign_if_exact(const Octagonal_Shape& y) {
+  PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+                         "Octagonal_Shape<T>::"
+                         "integer_upper_bound_assign_if_exact(y):"
+                         " T in not an integer datatype.");
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const Octagonal_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+
+  // If `x' or `y' is (known to) contain no integral point,
+  // then the integer upper bound can be computed exactly by tight closure.
+  if (x.marked_empty()) {
+    *this = y;
+    tight_closure_assign();
+    return true;
+  }
+  else if (y.marked_empty()) {
+    tight_closure_assign();
+    return true;
+  }
+  else if (x.is_empty() || x.tight_coherence_would_make_empty()) {
+    *this = y;
+    tight_closure_assign();
+    return true;
+  }
+  else if (y.is_empty() || y.tight_coherence_would_make_empty()) {
+    tight_closure_assign();
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty (and Z-consistent).
+  PPL_ASSERT(x.marked_strongly_closed());
+  PPL_ASSERT(y.marked_strongly_closed());
+  // Pre-compute the integer upper bound of `x' and `y':
+  // have to take copies, since tight closure might modify the rational shape.
+  Octagonal_Shape<T> tx(x);
+  tx.tight_closure_assign();
+  Octagonal_Shape<T> ty(y);
+  ty.tight_closure_assign();
+  Octagonal_Shape<T> ub(tx);
+  ub.upper_bound_assign(ty);
+
+  // Compute redundancy information for tx and ty.
+  // TODO: provide a nicer data structure for redundancy.
+  // NOTE: there is no need to identify all redundancies, since this is
+  // an optimization; hence we reuse the strong-reduction helper methods.
+  std::vector<Bit_Row> tx_non_red;
+  tx.non_redundant_matrix_entries(tx_non_red);
+  std::vector<Bit_Row> ty_non_red;
+  ty.non_redundant_matrix_entries(ty_non_red);
+
+  PPL_DIRTY_TEMP(N, lhs_i_j);
+  PPL_DIRTY_TEMP(N, lhs_k_ell);
+  PPL_DIRTY_TEMP(N, lhs);
+  PPL_DIRTY_TEMP(N, lhs_copy);
+  PPL_DIRTY_TEMP(N, rhs);
+  PPL_DIRTY_TEMP(N, temp_zero);
+  assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, temp_one);
+  assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, temp_two);
+  assign_r(temp_two, 2, ROUND_NOT_NEEDED);
+
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+  const dimension_type n_rows = tx.matrix.num_rows();
+  const row_iterator tx_m_begin = tx.matrix.row_begin();
+  const row_iterator ty_m_begin = ty.matrix.row_begin();
+  const row_iterator ub_m_begin = ub.matrix.row_begin();
+
+  for (dimension_type i = n_rows; i-- > 0; ) {
+    const Bit_Row& tx_non_red_i = tx_non_red[i];
+    using namespace Implementation::Octagonal_Shapes;
+    const dimension_type ci = coherent_index(i);
+    const dimension_type row_size_i = OR_Matrix<N>::row_size(i);
+    row_reference tx_i = *(tx_m_begin + i);
+    row_reference ty_i = *(ty_m_begin + i);
+    row_reference ub_i = *(ub_m_begin + i);
+    const N& ub_i_ci = ub_i[ci];
+    for (dimension_type j = row_size_i; j-- > 0; ) {
+      // Check redundancy of tx_i_j.
+      if (!tx_non_red_i[j])
+        continue;
+      const N& tx_i_j = tx_i[j];
+      const dimension_type cj = coherent_index(j);
+      const N& eps_i_j = (i == cj) ? temp_two : temp_one;
+      // Check condition 1a in BHZ09 Theorem 6.8.
+      add_assign_r(lhs_i_j, tx_i_j, eps_i_j, ROUND_NOT_NEEDED);
+      if (lhs_i_j > ty_i[j])
+        continue;
+      const dimension_type row_size_cj = OR_Matrix<N>::row_size(cj);
+      row_reference ub_cj = *(ub_m_begin + cj);
+      const N& ub_cj_j = ub_cj[j];
+      for (dimension_type k = 0; k < n_rows; ++k) {
+        const Bit_Row& ty_non_red_k = ty_non_red[k];
+        const dimension_type ck = coherent_index(k);
+        const dimension_type row_size_k = OR_Matrix<N>::row_size(k);
+        row_reference tx_k = *(tx_m_begin + k);
+        row_reference ty_k = *(ty_m_begin + k);
+        row_reference ub_k = *(ub_m_begin + k);
+        const N& ub_k_ck = ub_k[ck];
+        // Be careful: for each index h, the diagonal element m[h][h]
+        // is (by convention) +infty in our implementation; however,
+        // BHZ09 theorem assumes that it is equal to 0.
+        const N& ub_k_j
+          = (k == j)
+          ? temp_zero
+          : ((j < row_size_k) ? ub_k[j] : ub_cj[ck]);
+        const N& ub_i_ck
+          = (i == ck)
+          ? temp_zero
+          : ((ck < row_size_i) ? ub_i[ck] : ub_k[ci]);
+
+        for (dimension_type ell = row_size_k; ell-- > 0; ) {
+          // Check redundancy of y_k_ell.
+          if (!ty_non_red_k[ell])
+            continue;
+          const N& ty_k_ell = ty_k[ell];
+          const dimension_type cell = coherent_index(ell);
+          const N& eps_k_ell = (k == cell) ? temp_two : temp_one;
+          // Check condition 1b in BHZ09 Theorem 6.8.
+          add_assign_r(lhs_k_ell, ty_k_ell, eps_k_ell, ROUND_NOT_NEEDED);
+          if (lhs_k_ell > tx_k[ell])
+            continue;
+          row_reference ub_cell = *(ub_m_begin + cell);
+          const N& ub_i_ell
+            = (i == ell)
+            ? temp_zero
+            : ((ell < row_size_i) ? ub_i[ell] : ub_cell[ci]);
+          const N& ub_cj_ell
+            = (cj == ell)
+            ? temp_zero
+            : ((ell < row_size_cj) ? ub_cj[ell] : ub_cell[j]);
+          // Check condition 2a in BHZ09 Theorem 6.8.
+          add_assign_r(lhs, lhs_i_j, lhs_k_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 2b in BHZ09 Theorem 6.8.
+          add_assign_r(rhs, ub_i_ck, ub_cj_ell, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 3a in BHZ09 Theorem 6.8.
+          assign_r(lhs_copy, lhs, ROUND_NOT_NEEDED);
+          add_assign_r(lhs, lhs, lhs_i_j, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, ub_i_ell, ub_i_ck, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_cj_j, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 3b in BHZ09 Theorem 6.8.
+          add_assign_r(rhs, ub_k_j, ub_cj_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_i_ci, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 4a in BHZ09 Theorem 6.8.
+          add_assign_r(lhs, lhs_copy, lhs_k_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, ub_i_ell, ub_cj_ell, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_k_ck, ROUND_NOT_NEEDED);
+          if (lhs > rhs)
+            continue;
+          // Check condition 4b in BHZ09 Theorem 6.8.
+          add_assign_r(rhs, ub_k_j, ub_i_ck, ROUND_NOT_NEEDED);
+          add_assign_r(rhs, rhs, ub_cell[ell], ROUND_NOT_NEEDED);
+          if (lhs <= rhs)
+            // All 8 conditions are satisfied:
+            // integer upper bound is not exact.
+            return false;
+        }
+      }
+    }
+  }
+
+  // The upper bound of x and y is indeed exact.
+  m_swap(ub);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+  if (std::numeric_limits<T>::is_integer)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  strong_closure_assign();
+  if (space_dim == 0 || marked_empty())
+    return;
+
+  for (typename OR_Matrix<N>::element_iterator i = matrix.element_begin(),
+         i_end = matrix.element_end(); i != i_end; ++i)
+    drop_some_non_integer_points_helper(*i);
+
+  // Unary constraints should have an even integer boundary.
+  PPL_DIRTY_TEMP(N, temp_one);
+  assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+  for (dimension_type i = 0; i < 2*space_dim; i += 2) {
+    const dimension_type ci = i + 1;
+    N& mat_i_ci = matrix[i][ci];
+    if (!is_plus_infinity(mat_i_ci) && !is_even(mat_i_ci)) {
+      sub_assign_r(mat_i_ci, mat_i_ci, temp_one, ROUND_UP);
+      reset_strongly_closed();
+    }
+    N& mat_ci_i = matrix[ci][i];
+    if (!is_plus_infinity(mat_ci_i) && !is_even(mat_ci_i)) {
+      sub_assign_r(mat_ci_i, mat_ci_i, temp_one, ROUND_UP);
+      reset_strongly_closed();
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::drop_some_non_integer_points(const Variables_Set& vars,
+                               Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+    return;
+
+  strong_closure_assign();
+  if (marked_empty())
+    return;
+
+  PPL_DIRTY_TEMP(N, temp_one);
+  assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+  const Variables_Set::const_iterator v_begin = vars.begin();
+  const Variables_Set::const_iterator v_end = vars.end();
+  PPL_ASSERT(v_begin != v_end);
+  typedef typename OR_Matrix<N>::row_reference_type row_reference;
+  for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+    const dimension_type i = 2 * (*v_i);
+    const dimension_type ci = i + 1;
+    row_reference m_i = matrix[i];
+    row_reference m_ci = matrix[ci];
+
+    // Unary constraints: should be even integers.
+    N& m_i_ci = m_i[ci];
+    if (!is_plus_infinity(m_i_ci)) {
+      drop_some_non_integer_points_helper(m_i_ci);
+      if (!is_even(m_i_ci)) {
+        sub_assign_r(m_i_ci, m_i_ci, temp_one, ROUND_UP);
+        reset_strongly_closed();
+      }
+    }
+    N& m_ci_i = m_ci[i];
+    if (!is_plus_infinity(m_ci_i)) {
+      drop_some_non_integer_points_helper(m_ci_i);
+      if (!is_even(m_ci_i)) {
+        sub_assign_r(m_ci_i, m_ci_i, temp_one, ROUND_UP);
+        reset_strongly_closed();
+      }
+    }
+
+    // Binary constraints (note: only consider j < i).
+    for (Variables_Set::const_iterator v_j = v_begin; v_j != v_i; ++v_j) {
+      const dimension_type j = 2 * (*v_j);
+      const dimension_type cj = j + 1;
+      drop_some_non_integer_points_helper(m_i[j]);
+      drop_some_non_integer_points_helper(m_i[cj]);
+      drop_some_non_integer_points_helper(m_ci[j]);
+      drop_some_non_integer_points_helper(m_ci[cj]);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename U>
+void
+Octagonal_Shape<T>
+::export_interval_constraints(U& dest) const {
+  if (space_dim > dest.space_dimension())
+    throw std::invalid_argument(
+               "Octagonal_Shape<T>::export_interval_constraints");
+
+  strong_closure_assign();
+
+  if (marked_empty()) {
+    dest.set_empty();
+    return;
+  }
+
+  PPL_DIRTY_TEMP(N, lb);
+  PPL_DIRTY_TEMP(N, ub);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    const dimension_type ii = 2*i;
+    const dimension_type cii = ii + 1;
+
+    // Set the upper bound.
+    const N& twice_ub = matrix[cii][ii];
+    if (!is_plus_infinity(twice_ub)) {
+      assign_r(ub, twice_ub, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(ub, ub, 1, ROUND_UP);
+      // FIXME: passing a raw value may not be general enough.
+      if (!dest.restrict_upper(i, ub.raw_value()))
+        return;
+    }
+
+    // Set the lower bound.
+    const N& twice_lb = matrix[ii][cii];
+    if (!is_plus_infinity(twice_lb)) {
+      assign_r(lb, twice_lb, ROUND_NOT_NEEDED);
+      neg_assign_r(lb, lb, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(lb, lb, 1, ROUND_DOWN);
+      // FIXME: passing a raw value may not be general enough.
+      if (!dest.restrict_lower(i, lb.raw_value()))
+        return;
+    }
+  }
+
+}
+
+/*! \relates Parma_Polyhedra_Library::Octagonal_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Octagonal_Shape<T>& oct) {
+  // Handle special cases first.
+  if (oct.marked_empty()) {
+    s << "false";
+    return s;
+  }
+  if (oct.is_universe()) {
+    s << "true";
+    return s;
+  }
+
+  typedef typename Octagonal_Shape<T>::coefficient_type N;
+  typedef typename OR_Matrix<N>::const_row_iterator row_iterator;
+  typedef typename OR_Matrix<N>::const_row_reference_type row_reference;
+
+  // Records whether or not we still have to print the first constraint.
+  bool first = true;
+
+  row_iterator m_begin = oct.matrix.row_begin();
+  row_iterator m_end = oct.matrix.row_end();
+
+  // Temporaries.
+  PPL_DIRTY_TEMP(N, negation);
+  PPL_DIRTY_TEMP(N, half);
+  // Go through all the unary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i(i/2);
+    const N& c_i_ii = (*i_iter)[i + 1];
+    ++i_iter;
+    const N& c_ii_i = (*i_iter)[i];
+    ++i_iter;
+    // Check whether or not it is an equality constraint.
+    if (is_additive_inverse(c_i_ii, c_ii_i)) {
+      // It is an equality.
+      PPL_ASSERT(!is_plus_infinity(c_i_ii) && !is_plus_infinity(c_ii_i));
+      if (first)
+        first = false;
+      else
+        s << ", ";
+      // If the value bound can NOT be divided by 2 exactly,
+      // then we output the constraint `2*v_i = bound'.
+      if (div_2exp_assign_r(half, c_ii_i, 1,
+                            ROUND_UP | ROUND_STRICT_RELATION)
+          == V_EQ)
+        s << v_i << " = " << half;
+      else
+        s << "2*" << v_i << " = " << c_ii_i;
+    }
+    else {
+      // We will print unary non-strict inequalities, if any.
+      if (!is_plus_infinity(c_i_ii)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        neg_assign_r(negation, c_i_ii, ROUND_NOT_NEEDED);
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i >= negation'.
+        if (div_2exp_assign_r(half, negation, 1,
+                              ROUND_UP | ROUND_STRICT_RELATION)
+            == V_EQ)
+          s << v_i << " >= " << half;
+        else
+          s << "2*" << v_i << " >= " << negation;
+      }
+      if (!is_plus_infinity(c_ii_i)) {
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        // If the value bound can NOT be divided by 2 exactly,
+        // then we output the constraint `2*v_i <= bound'.
+        if (div_2exp_assign_r(half, c_ii_i, 1,
+                              ROUND_UP | ROUND_STRICT_RELATION)
+            == V_EQ)
+          s << v_i << " <= " << half;
+        else
+          s << "2*" << v_i << " <= " << c_ii_i;
+      }
+    }
+  }
+
+  // Go through all the binary constraints.
+  // (Note: loop iterator is incremented in the loop body.)
+  for (row_iterator i_iter = m_begin; i_iter != m_end; ) {
+    const dimension_type i = i_iter.index();
+    const Variable v_i(i/2);
+    row_reference r_i = *i_iter;
+    ++i_iter;
+    row_reference r_ii = *i_iter;
+    ++i_iter;
+
+    for (dimension_type j = 0; j < i; j += 2) {
+      const Variable v_j(j/2);
+      // Print binary differences.
+      const N& c_ii_jj = r_ii[j + 1];
+      const N& c_i_j = r_i[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(c_ii_jj, c_i_j)) {
+        // It is an equality.
+        PPL_ASSERT(!is_plus_infinity(c_i_j) && !is_plus_infinity(c_ii_jj));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        if (sgn(c_i_j) >= 0)
+          s << v_j << " - " << v_i << " = " << c_i_j;
+        else
+          s << v_i << " - " << v_j << " = " << c_ii_jj;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(c_i_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(c_i_j) >= 0)
+            s << v_j << " - " << v_i << " <= " << c_i_j;
+          else {
+            neg_assign_r(negation, c_i_j, ROUND_DOWN);
+            s << v_i << " - " << v_j << " >= " << negation;
+          }
+        }
+        if (!is_plus_infinity(c_ii_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          if (sgn(c_ii_jj) >= 0)
+            s << v_i << " - " << v_j << " <= " << c_ii_jj;
+          else {
+            neg_assign_r(negation, c_ii_jj, ROUND_DOWN);
+            s << v_j << " - " << v_i << " >= " << negation;
+          }
+        }
+      }
+      // Print binary sums.
+      const N& c_i_jj = r_i[j + 1];
+      const N& c_ii_j = r_ii[j];
+      // Check whether or not it is an equality constraint.
+      if (is_additive_inverse(c_i_jj, c_ii_j)) {
+        // It is an equality.
+        PPL_ASSERT(!is_plus_infinity(c_i_jj) && !is_plus_infinity(c_ii_j));
+        if (first)
+          first = false;
+        else
+          s << ", ";
+        s << v_j << " + " << v_i << " = " << c_ii_j;
+      }
+      else {
+        // We will print non-strict inequalities, if any.
+        if (!is_plus_infinity(c_i_jj)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          neg_assign_r(negation, c_i_jj, ROUND_DOWN);
+          s << v_j << " + " << v_i << " >= " << negation;
+        }
+        if (!is_plus_infinity(c_ii_j)) {
+          if (first)
+            first = false;
+          else
+            s << ", ";
+          s << v_j << " + " << v_i << " <= " << c_ii_j;
+        }
+      }
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::ascii_dump(std::ostream& s) const {
+  s << "space_dim "
+    << space_dim
+    << "\n";
+  status.ascii_dump(s);
+  s << "\n";
+  matrix.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, Octagonal_Shape<T>)
+
+template <typename T>
+bool
+Octagonal_Shape<T>::ascii_load(std::istream& s) {
+  std::string str;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> space_dim))
+    return false;
+
+  if (!status.ascii_load(s))
+    return false;
+
+  if (!matrix.ascii_load(s))
+    return false;
+
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+memory_size_type
+Octagonal_Shape<T>::external_memory_in_bytes() const {
+  return matrix.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+Octagonal_Shape<T>::OK() const {
+  // Check whether the matrix is well-formed.
+  if (!matrix.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // All empty octagons are OK.
+  if (marked_empty())
+    return true;
+
+  // 0-dim universe octagon is OK.
+  if (space_dim == 0)
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         matrix_row_end = matrix.row_end(); i != matrix_row_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type x_i = *i;
+    for (dimension_type j = i.row_size(); j-- > 0; )
+      if (is_minus_infinity(x_i[j])) {
+#ifndef NDEBUG
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        std::cerr << "Octagonal_Shape::"
+                  << "matrix[" << i.index() << "][" << j << "] = "
+                  << x_i[j] << "!"
+                  << std::endl;
+#endif
+        return false;
+      }
+  }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (typename OR_Matrix<N>::const_row_iterator i = matrix.row_begin(),
+         m_end = matrix.row_end(); i != m_end; ++i) {
+    typename OR_Matrix<N>::const_row_reference_type r = *i;
+    const N& m_i_i = r[i.index()];
+    if (!is_plus_infinity(m_i_i)) {
+#ifndef NDEBUG
+      const dimension_type j = i.index();
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "Octagonal_Shape::matrix[" << j << "][" << j << "] = "
+                << m_i_i << "!  (+inf was expected.)\n";
+#endif
+      return false;
+    }
+  }
+
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise strong closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the closure information is legal.
+    if (marked_strongly_closed()) {
+      Octagonal_Shape x = *this;
+      x.reset_strongly_closed();
+      x.strong_closure_assign();
+      if (x.matrix != matrix) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is marked as strongly closed "
+                  << "but it is not!\n";
+#endif
+        return false;
+      }
+    }
+
+    // A closed octagon must be strong-coherent.
+    if (marked_strongly_closed())
+      if (!is_strong_coherent()) {
+#ifndef NDEBUG
+        std::cerr << "Octagonal_Shape is not strong-coherent!\n";
+#endif
+        return false;
+      }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const Octagonal_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_dimension_incompatible(const char* method,
+                                                 const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_expression_too_complex(const char* method,
+                                                 const Linear_Expression& le) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << le << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const char* le_name,
+                               const Linear_Expression& le) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << le_name << "->space_dimension() == "
+    << le.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template <typename C>
+void
+Octagonal_Shape<T>
+::throw_dimension_incompatible(const char* method,
+                               const char* lf_name,
+                               const Linear_Form<C>& lf) const {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << lf_name << "->space_dimension() == "
+    << lf.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+Octagonal_Shape<T>::throw_invalid_argument(const char* method,
+                                           const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Octagonal_Shape::" << method << ":\n"
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Octagonal_Shape_defs.hh line 2323. */
+
+/* Automatically generated from PPL source file ../src/BD_Shape_inlines.hh line 38. */
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::max_space_dimension() {
+  // One dimension is reserved to have a value of type dimension_type
+  // that does not represent a legal dimension.
+  return std::min(DB_Matrix<N>::max_num_rows() - 1,
+                  DB_Matrix<N>::max_num_columns() - 1);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_zero_dim_univ() const {
+  return status.test_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_empty() const {
+  return status.test_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_closed() const {
+  return status.test_shortest_path_closed();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::marked_shortest_path_reduced() const {
+  return status.test_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+  status.set_zero_dim_univ();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+  status.set_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_closed() {
+  status.set_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_shortest_path_reduced() {
+  status.set_shortest_path_reduced();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_closed() {
+  status.reset_shortest_path_closed();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::reset_shortest_path_reduced() {
+  status.reset_shortest_path_reduced();
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const dimension_type num_dimensions,
+                      const Degenerate_Element kind)
+  : dbm(num_dimensions + 1), status(), redundancy_dbm() {
+  if (kind == EMPTY)
+    set_empty();
+  else {
+    if (num_dimensions > 0)
+      // A (non zero-dim) universe BDS is closed.
+      set_shortest_path_closed();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y, Complexity_Class)
+  : dbm(y.dbm), status(y.status), redundancy_dbm() {
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape<U>& y, Complexity_Class)
+  // For maximum precision, enforce shortest-path closure
+  // before copying the DB matrix.
+  : dbm((y.shortest_path_closure_assign(), y.dbm)),
+    status(),
+    redundancy_dbm() {
+  // TODO: handle flags properly, possibly taking special cases into account.
+  if (y.marked_empty())
+    set_empty();
+  else if (y.marked_zero_dim_univ())
+    set_zero_dim_univ();
+}
+
+template <typename T>
+inline Congruence_System
+BD_Shape<T>::congruences() const {
+  return minimized_congruences();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    add_constraint(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_constraints(Constraint_System& cs) {
+  add_constraints(cs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_congruences(const Congruence_System& cgs) {
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    add_congruence(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_recycled_congruences(Congruence_System& cgs) {
+  add_congruences(cgs);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraint(const Constraint& c) {
+  const dimension_type c_space_dim = c.space_dimension();
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_constraint(c)", c);
+
+  if (!marked_empty())
+    refine_no_check(c);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_constraints(const Constraint_System& cs) {
+  // Dimension-compatibility check.
+  if (cs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_constraints(cs)",
+                           "cs and *this are space-dimension incompatible");
+
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_with_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dimension())
+    throw_dimension_incompatible("refine_with_congruence(cg)", cg);
+
+  if (!marked_empty())
+    refine_no_check(cg);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_with_congruences(const Congruence_System& cgs) {
+  // Dimension-compatibility check.
+  if (cgs.space_dimension() > space_dimension())
+    throw_invalid_argument("refine_with_congruences(cgs)",
+                           "cgs and *this are space-dimension incompatible");
+
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::refine_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  if (cg.is_proper_congruence()) {
+    if (cg.is_inconsistent())
+      set_empty();
+    // Other proper congruences are just ignored.
+    return;
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  refine_no_check(c);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_constraint_systems() {
+  return false;
+}
+
+
+template <typename T>
+inline bool
+BD_Shape<T>::can_recycle_congruence_systems() {
+  return false;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Constraint_System& cs)
+  : dbm(cs.space_dimension() + 1), status(), redundancy_dbm() {
+  if (cs.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  add_constraints(cs);
+}
+
+template <typename T>
+template <typename Interval>
+inline
+BD_Shape<T>::BD_Shape(const Box<Interval>& box,
+                      Complexity_Class)
+  : dbm(box.space_dimension() + 1), status(), redundancy_dbm() {
+  // Check emptiness for maximum precision.
+  if (box.is_empty())
+    set_empty();
+  else if (box.space_dimension() > 0) {
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+    refine_with_constraints(box.constraints());
+  }
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const Grid& grid,
+                      Complexity_Class)
+  : dbm(grid.space_dimension() + 1), status(), redundancy_dbm() {
+  if (grid.space_dimension() > 0)
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+  // Taking minimized congruences ensures maximum precision.
+  refine_with_congruences(grid.minimized_congruences());
+}
+
+template <typename T>
+template <typename U>
+inline
+BD_Shape<T>::BD_Shape(const Octagonal_Shape<U>& os,
+                      Complexity_Class)
+  : dbm(os.space_dimension() + 1), status(), redundancy_dbm() {
+  // Check for emptiness for maximum precision.
+  if (os.is_empty())
+    set_empty();
+  else if (os.space_dimension() > 0) {
+    // A (non zero-dim) universe BDS is shortest-path closed.
+    set_shortest_path_closed();
+    refine_with_constraints(os.constraints());
+    // After refining, shortest-path closure is possibly lost
+    // (even when `os' was strongly closed: recall that U
+    // is possibly different from T).
+  }
+}
+
+template <typename T>
+inline BD_Shape<T>&
+BD_Shape<T>::operator=(const BD_Shape& y) {
+  dbm = y.dbm;
+  status = y.status;
+  if (y.marked_shortest_path_reduced())
+    redundancy_dbm = y.redundancy_dbm;
+  return *this;
+}
+
+template <typename T>
+inline
+BD_Shape<T>::~BD_Shape() {
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::m_swap(BD_Shape& y) {
+  using std::swap;
+  swap(dbm, y.dbm);
+  swap(status, y.status);
+  swap(redundancy_dbm, y.redundancy_dbm);
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::space_dimension() const {
+  return dbm.num_rows() - 1;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_empty() const {
+  shortest_path_closure_assign();
+  return marked_empty();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_above(const Linear_Expression& expr) const {
+  return bounds(expr, true);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bounds_from_below(const Linear_Expression& expr) const {
+  return bounds(expr, false);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+                      Coefficient& sup_n, Coefficient& sup_d,
+                      bool& maximum) const {
+  return max_min(expr, true, sup_n, sup_d, maximum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::maximize(const Linear_Expression& expr,
+                      Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                      Generator& g) const {
+  return max_min(expr, true, sup_n, sup_d, maximum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+                      Coefficient& inf_n, Coefficient& inf_d,
+                      bool& minimum) const {
+  return max_min(expr, false, inf_n, inf_d, minimum);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::minimize(const Linear_Expression& expr,
+                      Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                      Generator& g) const {
+  return max_min(expr, false, inf_n, inf_d, minimum, g);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_topologically_closed() const {
+  return true;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::is_discrete() const {
+  return affine_dimension() == 0;
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::topological_closure_assign() {
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator==(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty())
+      return y.marked_empty();
+    else
+      return !y.marked_empty();
+  }
+
+  // The exact equivalence test requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal
+  // if and only if the other BDS is empty too.
+  if (x.marked_empty())
+    return y.marked_empty();
+  if (y.marked_empty())
+    return false;
+  // Check for syntactic equivalence of the two (shortest-path closed)
+  // systems of bounded differences.
+  return x.dbm == y.dbm;
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline bool
+operator!=(const BD_Shape<T>& x, const BD_Shape<T>& y) {
+  return !(x == y);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const BD_Shape<T>& x,
+                            const BD_Shape<T>& y,
+                            const Rounding_Dir dir,
+                            Temp& tmp0,
+                            Temp& tmp1,
+                            Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return rectilinear_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const BD_Shape<T>& x,
+                            const BD_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return rectilinear_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+rectilinear_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                            const BD_Shape<T>& x,
+                            const BD_Shape<T>& y,
+                            const Rounding_Dir dir) {
+  return rectilinear_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const BD_Shape<T>& x,
+                          const BD_Shape<T>& y,
+                          const Rounding_Dir dir,
+                          Temp& tmp0,
+                          Temp& tmp1,
+                          Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return euclidean_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const BD_Shape<T>& x,
+                          const BD_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return euclidean_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+euclidean_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                          const BD_Shape<T>& x,
+                          const BD_Shape<T>& y,
+                          const Rounding_Dir dir) {
+  return euclidean_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const BD_Shape<T>& x,
+                           const BD_Shape<T>& y,
+                           const Rounding_Dir dir,
+                           Temp& tmp0,
+                           Temp& tmp1,
+                           Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim BDSs are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires shortest-path closure.
+  x.shortest_path_closure_assign();
+  y.shortest_path_closure_assign();
+
+  // If one of two BDSs is empty, then they are equal if and only if
+  // the other BDS is empty too.
+  if (x.marked_empty() ||  y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  return l_infinity_distance_assign(r, x.dbm, y.dbm, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename Temp, typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const BD_Shape<T>& x,
+                           const BD_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  typedef Checked_Number<Temp, Extended_Number_Policy> Checked_Temp;
+  PPL_DIRTY_TEMP(Checked_Temp, tmp0);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp1);
+  PPL_DIRTY_TEMP(Checked_Temp, tmp2);
+  return l_infinity_distance_assign(r, x, y, dir, tmp0, tmp1, tmp2);
+}
+
+/*! \relates BD_Shape */
+template <typename To, typename T>
+inline bool
+l_infinity_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                           const BD_Shape<T>& x,
+                           const BD_Shape<T>& y,
+                           const Rounding_Dir dir) {
+  return l_infinity_distance_assign<To, To, T>(r, x, y, dir);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+                                const dimension_type j,
+                                const N& k) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+  N& dbm_ij = dbm[i][j];
+  if (dbm_ij > k) {
+    dbm_ij = k;
+    if (marked_shortest_path_closed())
+      reset_shortest_path_closed();
+  }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+                                const dimension_type j,
+                                Coefficient_traits::const_reference numer,
+                                Coefficient_traits::const_reference denom) {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(i <= space_dimension() && j <= space_dimension() && i != j);
+  PPL_ASSERT(denom != 0);
+  PPL_DIRTY_TEMP(N, k);
+  div_round_up(k, numer, denom);
+  add_dbm_constraint(i, j, k);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::time_elapse_assign(const BD_Shape& y) {
+  // Dimension-compatibility check.
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("time_elapse_assign(y)", y);
+  // Compute time-elapse on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.time_elapse_assign(ph_y);
+  BD_Shape<T> x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::strictly_contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  return x.contains(y) && !y.contains(x);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+#if 0
+  return BFT00_upper_bound_assign_if_exact(y);
+#else
+  const bool integer_upper_bound = false;
+  return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+#endif
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::integer_upper_bound_assign_if_exact(const BD_Shape& y) {
+  PPL_COMPILE_TIME_CHECK(std::numeric_limits<T>::is_integer,
+                         "BD_Shape<T>::integer_upper_bound_assign_if_exact(y):"
+                         " T in not an integer datatype.");
+  if (space_dimension() != y.space_dimension())
+    throw_dimension_incompatible("integer_upper_bound_assign_if_exact(y)", y);
+  const bool integer_upper_bound = true;
+  return BHZ09_upper_bound_assign_if_exact<integer_upper_bound>(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>
+::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  const dimension_type space_dim = space_dimension();
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+                                 new_dimension);
+
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space BDS.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Shortest-path closure is necessary as in remove_space_dimensions().
+  shortest_path_closure_assign();
+  dbm.resize_no_copy(new_dimension + 1);
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether or not reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // If we removed _all_ dimensions from a non-empty BDS,
+  // the zero-dim universe BDS has been obtained.
+  if (new_dimension == 0 && !marked_empty())
+    set_zero_dim_univ();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::wrap_assign(const Variables_Set& vars,
+                         Bounded_Integer_Type_Width w,
+                         Bounded_Integer_Type_Representation r,
+                         Bounded_Integer_Type_Overflow o,
+                         const Constraint_System* cs_p,
+                         unsigned complexity_threshold,
+                         bool wrap_individually) {
+  Implementation::wrap_assign(*this,
+                              vars, w, r, o, cs_p,
+                              complexity_threshold, wrap_individually,
+                              "BD_Shape");
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y, unsigned* tp) {
+  static N stop_points[] = {
+    N(-2, ROUND_UP),
+    N(-1, ROUND_UP),
+    N( 0, ROUND_UP),
+    N( 1, ROUND_UP),
+    N( 2, ROUND_UP)
+  };
+  CC76_extrapolation_assign(y,
+                            stop_points,
+                            stop_points
+                            + sizeof(stop_points)/sizeof(stop_points[0]),
+                            tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::H79_widening_assign(const BD_Shape& y, unsigned* tp) {
+  // Compute the H79 widening on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.H79_widening_assign(ph_y, tp);
+  BD_Shape x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::widening_assign(const BD_Shape& y, unsigned* tp) {
+  H79_widening_assign(y, tp);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+                                              const Constraint_System& cs,
+                                              unsigned* tp) {
+  // Compute the limited H79 extrapolation on polyhedra.
+  // TODO: provide a direct implementation.
+  C_Polyhedron ph_x(constraints());
+  C_Polyhedron ph_y(y.constraints());
+  ph_x.limited_H79_extrapolation_assign(ph_y, cs, tp);
+  BD_Shape x(ph_x);
+  m_swap(x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+inline memory_size_type
+BD_Shape<T>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename T>
+inline int32_t
+BD_Shape<T>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>::generalized_refine_with_linear_form_inequality(
+             const Linear_Form<Interval<T, Interval_Info> >& left,
+             const Linear_Form<Interval<T, Interval_Info> >& right,
+             const Relation_Symbol relsym) {
+  switch (relsym) {
+  case EQUAL:
+    // TODO: see if we can handle this case more efficiently.
+    refine_with_linear_form_inequality(left, right);
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case LESS_THAN:
+  case LESS_OR_EQUAL:
+    refine_with_linear_form_inequality(left, right);
+    break;
+  case GREATER_THAN:
+  case GREATER_OR_EQUAL:
+    refine_with_linear_form_inequality(right, left);
+    break;
+  case NOT_EQUAL:
+    break;
+  default:
+    PPL_UNREACHABLE;
+  }
+}
+
+template <typename T>
+template <typename Interval_Info>
+inline void
+BD_Shape<T>
+::refine_fp_interval_abstract_store(Box<Interval<T, Interval_Info> >&
+                                    store) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "BD_Shape<T>::refine_fp_interval_abstract_store:"
+                     " T not a floating point type.");
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  store.intersection_assign(Box<FP_Interval_Type>(*this));
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::drop_some_non_integer_points_helper(N& elem) {
+  if (!is_integer(elem)) {
+    Result r = floor_assign_r(elem, elem, ROUND_DOWN);
+    PPL_USED(r);
+    PPL_ASSERT(r == V_EQ);
+    reset_shortest_path_closed();
+  }
+}
+
+/*! \relates BD_Shape */
+template <typename T>
+inline void
+swap(BD_Shape<T>& x, BD_Shape<T>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_templates.hh line 1. */
+/* BD_Shape class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/BD_Shape_templates.hh line 40. */
+#include <vector>
+#include <deque>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Congruence_System& cgs)
+  : dbm(cgs.space_dimension() + 1),
+    status(),
+    redundancy_dbm() {
+  add_congruences(cgs);
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Generator_System& gs)
+  : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty BD shape.
+    set_empty();
+    return;
+  }
+
+  const dimension_type space_dim = space_dimension();
+  DB_Row<N>& dbm_0 = dbm[0];
+  PPL_DIRTY_TEMP(N, tmp);
+
+  bool dbm_initialized = false;
+  bool point_seen = false;
+  // Going through all the points and closure points.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::POINT:
+      point_seen = true;
+      // Intentionally fall through.
+    case Generator::CLOSURE_POINT:
+      if (!dbm_initialized) {
+        // When handling the first (closure) point, we initialize the DBM.
+        dbm_initialized = true;
+        const Coefficient& d = g.divisor();
+        // TODO: Check if the following loop can be optimized used
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.expression().get(Variable(i - 1));
+          DB_Row<N>& dbm_i = dbm[i];
+          for (dimension_type j = space_dim; j > 0; --j)
+            if (i != j) {
+              const Coefficient& g_j = g.expression().get(Variable(j - 1));
+              div_round_up(dbm_i[j], g_j - g_i, d);
+            }
+          div_round_up(dbm_i[0], -g_i, d);
+        }
+        for (dimension_type j = space_dim; j > 0; --j) {
+          const Coefficient& g_j = g.expression().get(Variable(j - 1));
+          div_round_up(dbm_0[j], g_j, d);
+        }
+        // Note: no need to initialize the first element of the main diagonal.
+      }
+      else {
+        // This is not the first point: the DBM already contains
+        // valid values and we must compute maxima.
+        const Coefficient& d = g.divisor();
+        // TODO: Check if the following loop can be optimized used
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i > 0; --i) {
+          const Coefficient& g_i = g.expression().get(Variable(i - 1));
+          DB_Row<N>& dbm_i = dbm[i];
+          // The loop correctly handles the case when i == j.
+          for (dimension_type j = space_dim; j > 0; --j) {
+            const Coefficient& g_j = g.expression().get(Variable(j - 1));
+            div_round_up(tmp, g_j - g_i, d);
+            max_assign(dbm_i[j], tmp);
+          }
+          div_round_up(tmp, -g_i, d);
+          max_assign(dbm_i[0], tmp);
+        }
+        for (dimension_type j = space_dim; j > 0; --j) {
+          const Coefficient& g_j = g.expression().get(Variable(j - 1));
+          div_round_up(tmp, g_j, d);
+          max_assign(dbm_0[j], tmp);
+        }
+      }
+      break;
+    default:
+      // Lines and rays temporarily ignored.
+      break;
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw_invalid_argument("BD_Shape(gs)",
+                           "the non-empty generator system gs "
+                           "contains no points.");
+
+  // Going through all the lines and rays.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      // TODO: Check if the following loop can be optimized used
+      // Generator::expr_type::const_iterator.
+      for (dimension_type i = space_dim; i > 0; --i) {
+        const Coefficient& g_i = g.expression().get(Variable(i - 1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i != g.expression().get(Variable(j - 1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i != 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+            i_end = g.expression().end(); i != i_end; ++i)
+        assign_r(dbm_0[i.variable().space_dimension()],
+                 PLUS_INFINITY, ROUND_NOT_NEEDED);
+      break;
+    case Generator::RAY:
+      // TODO: Check if the following loop can be optimized used
+      // Generator::expr_type::const_iterator.
+      for (dimension_type i = space_dim; i > 0; --i) {
+        const Coefficient& g_i = g.expression().get(Variable(i - 1));
+        DB_Row<N>& dbm_i = dbm[i];
+        // The loop correctly handles the case when i == j.
+        for (dimension_type j = space_dim; j > 0; --j)
+          if (g_i < g.expression().get(Variable(j - 1)))
+            assign_r(dbm_i[j], PLUS_INFINITY, ROUND_NOT_NEEDED);
+        if (g_i < 0)
+          assign_r(dbm_i[0], PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+            i_end = g.expression().end(); i != i_end; ++i)
+        if (*i > 0)
+          assign_r(dbm_0[i.variable().space_dimension()],
+                   PLUS_INFINITY, ROUND_NOT_NEEDED);
+      break;
+    default:
+      // Points and closure points already dealt with.
+      break;
+    }
+  }
+  set_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+  : dbm(), status(), redundancy_dbm() {
+  const dimension_type num_dimensions = ph.space_dimension();
+
+  if (ph.marked_empty()) {
+    *this = BD_Shape<T>(num_dimensions, EMPTY);
+    return;
+  }
+
+  if (num_dimensions == 0) {
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+    return;
+  }
+
+  // Build from generators when we do not care about complexity
+  // or when the process has polynomial complexity.
+  if (complexity == ANY_COMPLEXITY
+      || (!ph.has_pending_constraints() && ph.generators_are_up_to_date())) {
+    *this = BD_Shape<T>(ph.generators());
+    return;
+  }
+
+  // We cannot afford exponential complexity, we do not have a complete set
+  // of generators for the polyhedron, and the polyhedron is not trivially
+  // empty or zero-dimensional.  Constraints, however, are up to date.
+  PPL_ASSERT(ph.constraints_are_up_to_date());
+
+  if (!ph.has_something_pending() && ph.constraints_are_minimized()) {
+    // If the constraint system of the polyhedron is minimized,
+    // the test `is_universe()' has polynomial complexity.
+    if (ph.is_universe()) {
+      *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+      return;
+    }
+  }
+
+  // See if there is at least one inconsistent constraint in `ph.con_sys'.
+  for (Constraint_System::const_iterator i = ph.con_sys.begin(),
+         cs_end = ph.con_sys.end(); i != cs_end; ++i)
+    if (i->is_inconsistent()) {
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+  // If `complexity' allows it, use simplex to derive the exact (modulo
+  // the fact that our BDSs are topologically closed) variable bounds.
+  if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(num_dimensions);
+    lp.set_optimization_mode(MAXIMIZATION);
+
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality()) {
+          Linear_Expression expr(c.expression());
+          lp.add_constraint(expr >= 0);
+        }
+        else
+          lp.add_constraint(c);
+      }
+
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      *this = BD_Shape<T>(num_dimensions, EMPTY);
+      return;
+    }
+
+    // Start with a universe BDS that will be refined by the simplex.
+    *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+    // Get all the upper bounds.
+    Generator g(point());
+    PPL_DIRTY_TEMP_COEFFICIENT(numer);
+    PPL_DIRTY_TEMP_COEFFICIENT(denom);
+    for (dimension_type i = 1; i <= num_dimensions; ++i) {
+      Variable x(i-1);
+      // Evaluate optimal upper bound for `x <= ub'.
+      lp.set_objective_function(x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        div_round_up(dbm[0][i], numer, denom);
+      }
+      // Evaluate optimal upper bound for `x - y <= ub'.
+      for (dimension_type j = 1; j <= num_dimensions; ++j) {
+        if (i == j)
+          continue;
+        Variable y(j-1);
+        lp.set_objective_function(x - y);
+        if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+          g = lp.optimizing_point();
+          lp.evaluate_objective_function(g, numer, denom);
+          div_round_up(dbm[j][i], numer, denom);
+        }
+      }
+      // Evaluate optimal upper bound for `-x <= ub'.
+      lp.set_objective_function(-x);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, numer, denom);
+        div_round_up(dbm[i][0], numer, denom);
+      }
+    }
+    set_shortest_path_closed();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Extract easy-to-find bounds from constraints.
+  PPL_ASSERT(complexity == POLYNOMIAL_COMPLEXITY);
+  *this = BD_Shape<T>(num_dimensions, UNIVERSE);
+  refine_with_constraints(ph.constraints());
+}
+
+template <typename T>
+dimension_type
+BD_Shape<T>::affine_dimension() const {
+  const dimension_type space_dim = space_dimension();
+  // A zero-space-dim shape always has affine dimension zero.
+  if (space_dim == 0)
+    return 0;
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return 0;
+
+  // The vector `predecessor' is used to represent equivalence classes:
+  // `predecessor[i] == i' if and only if `i' is the leader of its
+  // equivalence class (i.e., the minimum index in the class).
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+
+  // Due to the fictitious variable `0', the affine dimension is one
+  // less the number of equivalence classes.
+  dimension_type affine_dim = 0;
+  // Note: disregard the first equivalence class.
+  for (dimension_type i = 1; i <= space_dim; ++i)
+    if (predecessor[i] == i)
+      ++affine_dim;
+
+  return affine_dim;
+}
+
+template <typename T>
+Congruence_System
+BD_Shape<T>::minimized_congruences() const {
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) equalities.
+  shortest_path_closure_assign();
+
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+    return cgs;
+  }
+
+  if (marked_empty()) {
+    cgs.insert(Congruence::zero_dim_false());
+    return cgs;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+  // Compute leader information.
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+
+  // Go through the non-leaders to generate equality constraints.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    const dimension_type leader = leaders[i];
+    if (i != leader) {
+      // Generate the constraint relating `i' and its leader.
+      if (leader == 0) {
+        // A unary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+        numer_denom(dbm_0[i], numer, denom);
+        cgs.insert(denom*Variable(i-1) == numer);
+      }
+      else {
+        // A binary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+        numer_denom(dbm[i][leader], numer, denom);
+        cgs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+      }
+    }
+  }
+  return cgs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+  // Dimension-compatibility check.
+  if (c.space_dimension() > space_dimension())
+    throw_dimension_incompatible("add_constraint(c)", c);
+
+  // Get rid of strict inequalities.
+  if (c.is_strict_inequality()) {
+    if (c.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    if (c.is_tautological())
+      return;
+    // Nontrivial strict inequalities are not allowed.
+    throw_invalid_argument("add_constraint(c)",
+                           "strict inequalities are not allowed");
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Constraints that are not bounded differences are not allowed.
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+    throw_invalid_argument("add_constraint(c)",
+                           "c is not a bounded difference constraint");
+
+  const Coefficient& inhomo = c.inhomogeneous_term();
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint (not a strict inequality).
+    if (inhomo < 0
+        || (inhomo != 0 && c.is_equality()))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  if (negative)
+    neg_assign(coeff);
+
+  bool changed = false;
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  // Compute the bound for `x', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, inhomo, coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    N& y = negative ? dbm[j][i] : dbm[i][j];
+    // Also compute the bound for `y', rounding towards plus infinity.
+    PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+    neg_assign(minus_c_term, inhomo);
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_congruence(const Congruence& cg) {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  // Dimension-compatibility check:
+  // the dimension of `cg' can not be greater than space_dim.
+  if (space_dimension() < cg_space_dim)
+    throw_dimension_incompatible("add_congruence(cg)", cg);
+
+  // Handle the case of proper congruences first.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_tautological())
+      return;
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    // Non-trivial and proper congruences are not allowed.
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is a non-trivial, proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  add_constraint(c);
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(!marked_empty());
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Constraints that are not bounded differences are ignored.
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff))
+    return;
+
+  const Coefficient& inhomo = c.inhomogeneous_term();
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint (might be a strict inequality).
+    if (inhomo < 0
+        || (c.is_equality() && inhomo != 0)
+        || (c.is_strict_inequality() && inhomo == 0))
+      set_empty();
+    return;
+  }
+
+  // Select the cell to be modified for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  N& x = negative ? dbm[i][j] : dbm[j][i];
+  N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+
+  bool changed = false;
+  // Compute the bound for `x', rounding towards plus infinity.
+  PPL_DIRTY_TEMP(N, d);
+  div_round_up(d, inhomo, coeff);
+  if (x > d) {
+    x = d;
+    changed = true;
+  }
+
+  if (c.is_equality()) {
+    // Also compute the bound for `y', rounding towards plus infinity.
+    PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+    neg_assign(minus_c_term, inhomo);
+    div_round_up(d, minus_c_term, coeff);
+    if (y > d) {
+      y = d;
+      changed = true;
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::concatenate_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
+
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is an empty 0-dim space bounded difference shape,
+  // let `*this' become empty.
+  if (y_space_dim == 0 && y.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // If `x' is an empty 0-dim space BDS, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x_space_dim == 0 && marked_empty()) {
+    dbm.grow(y_space_dim + 1);
+    PPL_ASSERT(OK());
+    return;
+  }
+  // First we increase the space dimension of `x' by adding
+  // `y.space_dimension()' new dimensions.
+  // The matrix for the new system of constraints is obtained
+  // by leaving the old system of constraints in the upper left-hand side
+  // and placing the constraints of `y' in the lower right-hand side,
+  // except the constraints as `y(i) >= cost' or `y(i) <= cost', that are
+  // placed in the right position on the new matrix.
+  add_space_dimensions_and_embed(y_space_dim);
+  const dimension_type new_space_dim = x_space_dim + y_space_dim;
+  for (dimension_type i = x_space_dim + 1; i <= new_space_dim; ++i) {
+    DB_Row<N>& dbm_i = dbm[i];
+    dbm_i[0] = y.dbm[i - x_space_dim][0];
+    dbm[0][i] = y.dbm[0][i - x_space_dim];
+    for (dimension_type j = x_space_dim + 1; j <= new_space_dim; ++j)
+      dbm_i[j] = y.dbm[i - x_space_dim][j - x_space_dim];
+  }
+
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains(const BD_Shape& y) const {
+  const BD_Shape<T>& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    throw_dimension_incompatible("contains(y)", y);
+
+  if (x_space_dim == 0) {
+    // The zero-dimensional empty shape only contains another
+    // zero-dimensional empty shape.
+    // The zero-dimensional universe shape contains any other
+    // zero-dimensional shape.
+    return marked_empty() ? y.marked_empty() : true;
+  }
+
+  /*
+    The `y' bounded difference shape must be closed.  As an example,
+    consider the case where in `*this' we have the constraints
+
+    x1 - x2 <= 1,
+    x1      <= 3,
+    x2      <= 2,
+
+    and in `y' the constraints are
+
+    x1 - x2 <= 0,
+    x2      <= 1.
+
+    Without closure the (erroneous) analysis of the inhomogeneous terms
+    would conclude containment does not hold.  Closing `y' results into
+    the "discovery" of the implicit constraint
+
+    x1      <= 1,
+
+    at which point the inhomogeneous terms can be examined to determine
+    that containment does hold.
+  */
+  y.shortest_path_closure_assign();
+  // An empty shape is contained in any other dimension-compatible shapes.
+  if (y.marked_empty())
+    return true;
+
+  // If `x' is empty it can not contain `y' (which is not empty).
+  if (x.is_empty())
+    return false;
+
+  // `*this' contains `y' if and only if every cell of `dbm'
+  // is greater than or equal to the correspondent one of `y.dbm'.
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; )
+      if (x_dbm_i[j] < y_dbm_i[j])
+        return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_disjoint_from(const BD_Shape& y) const {
+  const dimension_type space_dim = space_dimension();
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If one of the two bounded difference shape is empty,
+  // then the two bounded difference shape are disjoint.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return true;
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return true;
+
+  // Two BDSs are disjoint when their intersection is empty.
+  // That is if and only if there exists at least a bounded difference
+  // such that the upper bound of the bounded difference in the first
+  // BD_Shape is strictly less than the lower bound of
+  // the corresponding bounded difference in the second BD_Shape
+  // or vice versa.
+  // For example: let be
+  // in `*this':    -a_j_i <= v_j - v_i <= a_i_j;
+  // and in `y':    -b_j_i <= v_j - v_i <= b_i_j;
+  // `*this' and `y' are disjoint if
+  // 1.) a_i_j < -b_j_i or
+  // 2.) b_i_j < -a_j_i.
+  PPL_DIRTY_TEMP(N, tmp);
+  for (dimension_type i = space_dim+1; i-- > 0; ) {
+    const DB_Row<N>& x_i = dbm[i];
+    for (dimension_type j = space_dim+1; j-- > 0; ) {
+      neg_assign_r(tmp, y.dbm[j][i], ROUND_UP);
+      if (x_i[j] < tmp)
+        return true;
+    }
+  }
+
+  return false;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_universe() const {
+  if (marked_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  // If the BDS is non-empty and zero-dimensional,
+  // then it is necessarily the universe BDS.
+  if (space_dim == 0)
+    return true;
+
+  // A bounded difference shape defining the universe BDS can only
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (!is_plus_infinity(dbm_i[j]))
+        return false;
+  }
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_bounded() const {
+  shortest_path_closure_assign();
+  const dimension_type space_dim = space_dimension();
+  // A zero-dimensional or empty BDS is bounded.
+  if (marked_empty() || space_dim == 0)
+    return true;
+
+  // A bounded difference shape defining the bounded BDS never can
+  // contain trivial constraints.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (i != j)
+        if (is_plus_infinity(dbm_i[j]))
+          return false;
+  }
+
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::contains_integer_point() const {
+  // Force shortest-path closure.
+  if (is_empty())
+    return false;
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return true;
+
+  // A non-empty BD_Shape defined by integer constraints
+  // necessarily contains an integer point.
+  if (std::numeric_limits<T>::is_integer)
+    return true;
+
+  // Build an integer BD_Shape z with bounds at least as tight as
+  // those in *this and then recheck for emptiness.
+  BD_Shape<mpz_class> bds_z(space_dim);
+  typedef BD_Shape<mpz_class>::N Z;
+  bds_z.reset_shortest_path_closed();
+  PPL_DIRTY_TEMP(N, tmp);
+  bool all_integers = true;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<Z>& z_i = bds_z.dbm[i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      const N& dbm_i_j = dbm_i[j];
+      if (is_plus_infinity(dbm_i_j))
+        continue;
+      if (is_integer(dbm_i_j))
+        assign_r(z_i[j], dbm_i_j, ROUND_NOT_NEEDED);
+      else {
+        all_integers = false;
+        Z& z_i_j = z_i[j];
+        // Copy dbm_i_j into z_i_j, but rounding downwards.
+        neg_assign_r(tmp, dbm_i_j, ROUND_NOT_NEEDED);
+        assign_r(z_i_j, tmp, ROUND_UP);
+        neg_assign_r(z_i_j, z_i_j, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  return all_integers || !bds_z.is_empty();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::frequency(const Linear_Expression& expr,
+                       Coefficient& freq_n, Coefficient& freq_d,
+                       Coefficient& val_n, Coefficient& val_d) const {
+  dimension_type space_dim = space_dimension();
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Check if `expr' has a constant value.
+  // If it is constant, set the frequency `freq_n' to 0
+  // and return true. Otherwise the values for \p expr
+  // are not discrete so return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 0 and the value is the inhomogeneous term.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BD shape, we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The BD shape has at least 1 dimension and is not empty.
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP(N, tmp);
+  Linear_Expression le = expr;
+  // Boolean to keep track of a variable `v' in expression `le'.
+  // If we can replace `v' by an expression using variables other
+  // than `v' and are already in `le', then this is set to true.
+
+  PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+  val_denom = 1;
+
+  // TODO: This loop can be optimized more, if needed, exploiting the
+  // (possible) sparseness of le.
+  for (dimension_type i = dbm.num_rows(); i-- > 1; ) {
+    const Variable v(i-1);
+    coeff = le.coefficient(v);
+    if (coeff == 0)
+      continue;
+
+    const DB_Row<N>& dbm_i = dbm[i];
+    // Check if `v' is constant in the BD shape.
+    assign_r(tmp, dbm_i[0], ROUND_NOT_NEEDED);
+    if (is_additive_inverse(dbm[0][i], tmp)) {
+      // If `v' is constant, replace it in `le' by the value.
+      numer_denom(tmp, numer, denom);
+      sub_mul_assign(le, coeff, v);
+      le *= denom;
+      le -= numer*coeff;
+      val_denom *= denom;
+      continue;
+    }
+    // Check the bounded differences with the other dimensions that
+    // have non-zero coefficient in `le'.
+    else {
+      bool constant_v = false;
+      for (Linear_Expression::const_iterator j = le.begin(),
+            j_end = le.lower_bound(Variable(i - 1)); j != j_end; ++j) {
+        const Variable vj = j.variable();
+        const dimension_type j_dim = vj.space_dimension();
+        assign_r(tmp, dbm_i[j_dim], ROUND_NOT_NEEDED);
+        if (is_additive_inverse(dbm[j_dim][i], tmp)) {
+          // The coefficient for `vj' in `le' is not 0
+          // and the difference with `v' in the BD shape is constant.
+          // So apply this equality to eliminate `v' in `le'.
+          numer_denom(tmp, numer, denom);
+          // Modifying le invalidates the iterators, but it's not a problem
+          // since we are going to exit the loop.
+          sub_mul_assign(le, coeff, v);
+          add_mul_assign(le, coeff, vj);
+          le *= denom;
+          le -= numer*coeff;
+          val_denom *= denom;
+          constant_v = true;
+          break;
+        }
+      }
+      if (!constant_v)
+        // The expression `expr' is not constant.
+        return false;
+    }
+  }
+
+  // The expression `expr' is constant.
+  freq_n = 0;
+  freq_d = 1;
+
+  // Reduce `val_n' and `val_d'.
+  normalize2(le.inhomogeneous_term(), val_denom, val_n, val_d);
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::constrains(const Variable var) const {
+  // `var' should be one of the dimensions of the BD shape.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  shortest_path_closure_assign();
+  // A BD shape known to be empty constrains all variables.
+  // (Note: do not force emptiness check _yet_)
+  if (marked_empty())
+    return true;
+
+  // Check whether `var' is syntactically constrained.
+  const DB_Row<N>& dbm_v = dbm[var_space_dim];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    if (!is_plus_infinity(dbm_v[i])
+        || !is_plus_infinity(dbm[i][var_space_dim]))
+      return true;
+  }
+
+  // `var' is not syntactically constrained:
+  // now force an emptiness check.
+  return is_empty();
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+  PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+  PPL_ASSERT(predecessor.size() == 0);
+  // Variables are ordered according to their index.
+  // The vector `predecessor' is used to indicate which variable
+  // immediately precedes a given one in the corresponding equivalence class.
+  // The `leader' of an equivalence class is the element having minimum
+  // index: leaders are their own predecessors.
+  const dimension_type predecessor_size = dbm.num_rows();
+  // Initially, each variable is leader of its own zero-equivalence class.
+  predecessor.reserve(predecessor_size);
+  for (dimension_type i = 0; i < predecessor_size; ++i)
+    predecessor.push_back(i);
+  // Now compute actual predecessors.
+  for (dimension_type i = predecessor_size; i-- > 1; )
+    if (i == predecessor[i]) {
+      const DB_Row<N>& dbm_i = dbm[i];
+      for (dimension_type j = i; j-- > 0; )
+        if (j == predecessor[j]
+            && is_additive_inverse(dbm[j][i], dbm_i[j])) {
+          // Choose as predecessor the variable having the smaller index.
+          predecessor[i] = j;
+          break;
+        }
+    }
+}
+
+template <typename T>
+void
+BD_Shape<T>::compute_leaders(std::vector<dimension_type>& leaders) const {
+  PPL_ASSERT(!marked_empty() && marked_shortest_path_closed());
+  PPL_ASSERT(leaders.size() == 0);
+  // Compute predecessor information.
+  compute_predecessors(leaders);
+  // Flatten the predecessor chains so as to obtain leaders.
+  PPL_ASSERT(leaders[0] == 0);
+  for (dimension_type i = 1, l_size = leaders.size(); i != l_size; ++i) {
+    const dimension_type leaders_i = leaders[i];
+    PPL_ASSERT(leaders_i <= i);
+    if (leaders_i != i) {
+      const dimension_type leaders_leaders_i = leaders[leaders_i];
+      PPL_ASSERT(leaders_leaders_i == leaders[leaders_leaders_i]);
+      leaders[i] = leaders_leaders_i;
+    }
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::is_shortest_path_reduced() const {
+  // If the BDS is empty, it is also reduced.
+  if (marked_empty())
+    return true;
+
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return true;
+
+  // A shortest-path reduced dbm is just a dbm with an indication of
+  // those constraints that are redundant. If there is no indication
+  // of the redundant constraints, then it cannot be reduced.
+  if (!marked_shortest_path_reduced())
+    return false;
+
+  const BD_Shape x_copy = *this;
+  x_copy.shortest_path_closure_assign();
+  // If we just discovered emptiness, it cannot be reduced.
+  if (x_copy.marked_empty())
+    return false;
+
+  // The vector `leader' is used to indicate which variables are equivalent.
+  std::vector<dimension_type> leader(space_dim + 1);
+
+  // We store the leader.
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    leader[i] = i;
+
+  // Step 1: we store really the leader with the corrected value.
+  // We search for the equivalent or zero-equivalent variables.
+  // The variable(i-1) and variable(j-1) are equivalent if and only if
+  // m_i_j == -(m_j_i).
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    const DB_Row<N>& x_copy_dbm_i = x_copy.dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j)
+      if (is_additive_inverse(x_copy.dbm[j][i], x_copy_dbm_i[j]))
+        // Two equivalent variables have got the same leader
+        // (the smaller variable).
+        leader[j] = leader[i];
+  }
+
+  // Step 2: we check if there are redundant constraints in the zero_cycle
+  // free bounded difference shape, considering only the leaders.
+  // A constraint `c' is redundant, when there are two constraints such that
+  // their sum is the same constraint with the inhomogeneous term
+  // less than or equal to the `c' one.
+  PPL_DIRTY_TEMP(N, c);
+  for (dimension_type k = 0; k <= space_dim; ++k)
+    if (leader[k] == k) {
+      const DB_Row<N>& x_k = x_copy.dbm[k];
+      for (dimension_type i = 0; i <= space_dim; ++i)
+        if (leader[i] == i) {
+          const DB_Row<N>& x_i = x_copy.dbm[i];
+          const Bit_Row& redundancy_i = redundancy_dbm[i];
+          const N& x_i_k = x_i[k];
+          for (dimension_type j = 0; j <= space_dim; ++j)
+            if (leader[j] == j) {
+              const N& x_i_j = x_i[j];
+              if (!is_plus_infinity(x_i_j)) {
+                add_assign_r(c, x_i_k, x_k[j], ROUND_UP);
+                if (x_i_j >= c && !redundancy_i[j])
+                  return false;
+              }
+            }
+        }
+    }
+
+  // The vector `var_conn' is used to check if there is a single cycle
+  // that connected all zero-equivalent variables between them.
+  // The value `space_dim + 1' is used to indicate that the equivalence
+  // class contains a single variable.
+  std::vector<dimension_type> var_conn(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    var_conn[i] = space_dim + 1;
+
+  // Step 3: we store really the `var_conn' with the right value, putting
+  // the variable with the selected variable is connected:
+  // we check the row of each variable:
+  // a- each leader could be connected with only zero-equivalent one,
+  // b- each non-leader with only another zero-equivalent one.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    // It count with how many variables the selected variable is
+    // connected.
+    dimension_type t = 0;
+    dimension_type leader_i = leader[i];
+    // Case a: leader.
+    if (leader_i == i) {
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        dimension_type leader_j = leader[j];
+        // Only the connectedness with equivalent variables
+        // is considered.
+        if (j != leader_j)
+          if (!redundancy_dbm[i][j]) {
+            if (t == 1)
+              // Two non-leaders cannot be connected with the same leader.
+              return false;
+            else
+              if (leader_j != i)
+                // The variables are not in the same equivalence class.
+                return false;
+              else {
+                ++t;
+                var_conn[i] = j;
+              }
+          }
+      }
+    }
+    // Case b: non-leader.
+    else {
+      for (dimension_type j = 0; j <= space_dim; ++j) {
+        if (!redundancy_dbm[i][j]) {
+          dimension_type leader_j = leader[j];
+          if (leader_i != leader_j)
+            // The variables are not in the same equivalence class.
+            return false;
+          else {
+            if (t == 1)
+              // The variables cannot be connected with the same leader.
+              return false;
+            else {
+              ++t;
+              var_conn[i] = j;
+            }
+          }
+          // A non-leader must be connected with
+          // another variable.
+          if (t == 0)
+            return false;
+        }
+      }
+    }
+  }
+
+  // The vector `just_checked' is used to check if
+  // a variable is already checked.
+  std::vector<bool> just_checked(space_dim + 1);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    just_checked[i] = false;
+
+  // Step 4: we check if there are single cycles that
+  // connected all the zero-equivalent variables between them.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    // We do not re-check the already considered single cycles.
+    if (!just_checked[i]) {
+      dimension_type v_con = var_conn[i];
+      // We consider only the equivalence classes with
+      // 2 or plus variables.
+      if (v_con != space_dim + 1) {
+        // There is a single cycle if taken a variable,
+        // we return to this same variable.
+        while (v_con != i) {
+          just_checked[v_con] = true;
+          v_con = var_conn[v_con];
+          // If we re-pass to an already considered variable,
+          // then we haven't a single cycle.
+          if (just_checked[v_con])
+            return false;
+        }
+      }
+    }
+    just_checked[i] = true;
+  }
+
+  // The system bounded differences is just reduced.
+  return true;
+}
+
+template <typename T>
+bool
+BD_Shape<T>::bounds(const Linear_Expression& expr,
+                    const bool from_above) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+
+  shortest_path_closure_assign();
+  // A zero-dimensional or empty BDS bounds everything.
+  if (space_dim == 0 || marked_empty())
+    return true;
+
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = from_above ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Check if `c' is a BD constraint.
+  if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+    if (num_vars == 0)
+      // Dealing with a trivial constraint.
+      return true;
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    return !is_plus_infinity(x);
+  }
+  else {
+    // Not a DB constraint: use the MIP solver.
+    Optimization_Mode mode_bounds
+      = from_above ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_bounds);
+    // Problem is known to be feasible.
+    return mip.solve() == OPTIMIZED_MIP_PROBLEM;
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
+
+  // The constraint `c' is used to check if `expr' is a difference
+  // bounded and, in this case, to select the cell.
+  const Constraint& c = maximize ? expr <= 0 : expr >= 0;
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  // Check if `c' is a BD constraint.
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+    Optimization_Mode mode_max_min
+      = maximize ? MAXIMIZATION : MINIMIZATION;
+    MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+    if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+      mip.optimal_value(ext_n, ext_d);
+      included = true;
+      return true;
+    }
+    else
+      // Here`expr' is unbounded in `*this'.
+      return false;
+  }
+  else {
+    // Here `expr' is a bounded difference.
+    if (num_vars == 0) {
+      // Dealing with a trivial expression.
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+
+    // Select the cell to be checked.
+    const N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+    if (!is_plus_infinity(x)) {
+      // Compute the maximize/minimize of `expr'.
+      PPL_DIRTY_TEMP(N, d);
+      const Coefficient& b = expr.inhomogeneous_term();
+      PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+      neg_assign(minus_b, b);
+      const Coefficient& sc_b = maximize ? b : minus_b;
+      assign_r(d, sc_b, ROUND_UP);
+      // Set `coeff_expr' to the absolute value of coefficient of
+      // a variable in `expr'.
+      PPL_DIRTY_TEMP(N, coeff_expr);
+      PPL_ASSERT(i != 0);
+      const Coefficient& coeff_i = expr.get(Variable(i - 1));
+      const int sign_i = sgn(coeff_i);
+      if (sign_i > 0)
+        assign_r(coeff_expr, coeff_i, ROUND_UP);
+      else {
+        PPL_DIRTY_TEMP_COEFFICIENT(minus_coeff_i);
+        neg_assign(minus_coeff_i, coeff_i);
+        assign_r(coeff_expr, minus_coeff_i, ROUND_UP);
+      }
+      // Approximating the maximum/minimum of `expr'.
+      add_mul_assign_r(d, coeff_expr, x, ROUND_UP);
+      numer_denom(d, ext_n, ext_d);
+      if (!maximize)
+        neg_assign(ext_n);
+      included = true;
+      return true;
+    }
+
+    // `expr' is unbounded.
+    return false;
+  }
+}
+
+template <typename T>
+bool
+BD_Shape<T>::max_min(const Linear_Expression& expr,
+                     const bool maximize,
+                     Coefficient& ext_n, Coefficient& ext_d,
+                     bool& included,
+                     Generator& g) const {
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim BDS first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      g = point();
+      return true;
+    }
+  }
+
+  shortest_path_closure_assign();
+  // For an empty BDS we simply return false.
+  if (marked_empty())
+    return false;
+
+  Optimization_Mode mode_max_min
+    = maximize ? MAXIMIZATION : MINIMIZATION;
+  MIP_Problem mip(space_dim, constraints(), expr, mode_max_min);
+  if (mip.solve() == OPTIMIZED_MIP_PROBLEM) {
+    g = mip.optimizing_point();
+    mip.evaluate_objective_function(g, ext_n, ext_d);
+    included = true;
+    return true;
+  }
+  // Here `expr' is unbounded in `*this'.
+  return false;
+}
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Congruence& cg) const {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg.space_dimension() > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  // If the congruence is an equality, find the relation with
+  // the equivalent equality constraint.
+  if (cg.is_equality()) {
+    Constraint c(cg);
+    return relation_with(c);
+  }
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  // Find the lower bound for a hyperplane with direction
+  // defined by the congruence.
+  Linear_Expression le = Linear_Expression(cg.expression());
+  PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+  bool min_included;
+  bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+
+  // If there is no lower bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_below)
+    return Poly_Con_Relation::strictly_intersects();
+
+  // TODO: Consider adding a max_and_min() method, performing both
+  // maximization and minimization so as to possibly exploit
+  // incrementality of the MIP solver.
+
+  // Find the upper bound for a hyperplane with direction
+  // defined by the congruence.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+  bool max_included;
+  bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+
+  // If there is no upper bound, then some of the hyperplanes defined by
+  // the congruence will strictly intersect the shape.
+  if (!bounded_above)
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(signed_distance);
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is above the lower bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  min_value = min_numer / min_denom;
+  const Coefficient& modulus = cg.modulus();
+  signed_distance = min_value % modulus;
+  min_value -= signed_distance;
+  if (min_value * min_denom < min_numer)
+    min_value += modulus;
+
+  // Find the position value for the hyperplane that satisfies the congruence
+  // and is below the upper bound for the shape.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  max_value = max_numer / max_denom;
+  signed_distance = max_value % modulus;
+  max_value += signed_distance;
+  if (max_value * max_denom > max_numer)
+    max_value -= modulus;
+
+  // If the upper bound value is less than the lower bound value,
+  // then there is an empty intersection with the congruence;
+  // otherwise it will strictly intersect.
+  if (max_value < min_value)
+    return Poly_Con_Relation::is_disjoint();
+  else
+    return Poly_Con_Relation::strictly_intersects();
+}
+
+
+template <typename T>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  shortest_path_closure_assign();
+
+  if (marked_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type num_vars = 0;
+  dimension_type i = 0;
+  dimension_type j = 0;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  if (!BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+    // Constraints that are not bounded differences.
+    // Use maximize() and minimize() to do much of the work.
+
+    // Find the linear expression for the constraint and use that to
+    // find if the expression is bounded from above or below and if it
+    // is, find the maximum and minimum values.
+    Linear_Expression le(c.expression());
+    le.set_inhomogeneous_term(Coefficient_zero());
+
+    PPL_DIRTY_TEMP(Coefficient, max_numer);
+    PPL_DIRTY_TEMP(Coefficient, max_denom);
+    bool max_included;
+    PPL_DIRTY_TEMP(Coefficient, min_numer);
+    PPL_DIRTY_TEMP(Coefficient, min_denom);
+    bool min_included;
+    bool bounded_above = maximize(le, max_numer, max_denom, max_included);
+    bool bounded_below = minimize(le, min_numer, min_denom, min_included);
+    if (!bounded_above) {
+      if (!bounded_below)
+        return Poly_Con_Relation::strictly_intersects();
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(min_numer)) {
+      case 1:
+        if (c.is_equality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (c.is_strict_inequality() || c.is_equality())
+          return Poly_Con_Relation::strictly_intersects();
+        return Poly_Con_Relation::is_included();
+      case -1:
+        return Poly_Con_Relation::strictly_intersects();
+      }
+    }
+    if (!bounded_below) {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      max_numer += c.inhomogeneous_term() * max_denom;
+      min_numer += c.inhomogeneous_term() * min_denom;
+      switch (sgn(max_numer)) {
+      case 1:
+        switch (sgn(min_numer)) {
+        case 1:
+          if (c.is_equality())
+            return Poly_Con_Relation::is_disjoint();
+          return Poly_Con_Relation::is_included();
+        case 0:
+          if (c.is_equality())
+            return Poly_Con_Relation::strictly_intersects();
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::strictly_intersects();
+          return Poly_Con_Relation::is_included();
+        case -1:
+          return Poly_Con_Relation::strictly_intersects();
+        }
+        PPL_UNREACHABLE;
+        break;
+      case 0:
+        if (min_numer == 0) {
+          if (c.is_strict_inequality())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        }
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::is_disjoint();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+  }
+
+  // Constraints that are bounded differences.
+  if (num_vars == 0) {
+    // Dealing with a trivial constraint.
+    switch (sgn(c.inhomogeneous_term())) {
+    case -1:
+      return Poly_Con_Relation::is_disjoint();
+    case 0:
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    case 1:
+      if (c.is_equality())
+        return Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::is_included();
+    }
+  }
+
+  // Select the cell to be checked for the "<=" part of the constraint,
+  // and set `coeff' to the absolute value of itself.
+  const bool negative = (coeff < 0);
+  const N& x = negative ? dbm[i][j] : dbm[j][i];
+  const N& y = negative ? dbm[j][i] : dbm[i][j];
+  if (negative)
+    neg_assign(coeff);
+  // Deduce the relation/s of the constraint `c' of the form
+  // `coeff*v - coeff*u </<=/== c.inhomogeneous_term()'
+  // with the respectively constraints in `*this'
+  // `-y <= v - u <= x'.
+  // Let `d == c.inhomogeneous_term()/coeff'
+  // and `d1 == -c.inhomogeneous_term()/coeff'.
+  // The following variables of mpq_class type are used to be precise
+  // when the bds is defined by integer constraints.
+  PPL_DIRTY_TEMP(mpq_class, q_x);
+  PPL_DIRTY_TEMP(mpq_class, q_y);
+  PPL_DIRTY_TEMP(mpq_class, d);
+  PPL_DIRTY_TEMP(mpq_class, d1);
+  PPL_DIRTY_TEMP(mpq_class, c_denom);
+  PPL_DIRTY_TEMP(mpq_class, q_denom);
+  assign_r(c_denom, coeff, ROUND_NOT_NEEDED);
+  assign_r(d, c.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  neg_assign_r(d1, d, ROUND_NOT_NEEDED);
+  div_assign_r(d, d, c_denom, ROUND_NOT_NEEDED);
+  div_assign_r(d1, d1, c_denom, ROUND_NOT_NEEDED);
+
+  if (is_plus_infinity(x)) {
+    if (!is_plus_infinity(y)) {
+      // `*this' is in the following form:
+      // `-y <= v - u'.
+      // In this case `*this' is disjoint from `c' if
+      // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+      // `y < d1' (`y <= d1' if c is a strict equality).
+      PPL_DIRTY_TEMP_COEFFICIENT(numer);
+      PPL_DIRTY_TEMP_COEFFICIENT(denom);
+      numer_denom(y, numer, denom);
+      assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+      assign_r(q_y, numer, ROUND_NOT_NEEDED);
+      div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+      if (q_y < d1)
+        return Poly_Con_Relation::is_disjoint();
+      if (q_y == d1 && c.is_strict_inequality())
+        return Poly_Con_Relation::is_disjoint();
+    }
+
+    // In all other cases `*this' intersects `c'.
+    return Poly_Con_Relation::strictly_intersects();
+  }
+
+  // Here `x' is not plus-infinity.
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  numer_denom(x, numer, denom);
+  assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+  assign_r(q_x, numer, ROUND_NOT_NEEDED);
+  div_assign_r(q_x, q_x, q_denom, ROUND_NOT_NEEDED);
+
+  if (!is_plus_infinity(y)) {
+    numer_denom(y, numer, denom);
+    assign_r(q_denom, denom, ROUND_NOT_NEEDED);
+    assign_r(q_y, numer, ROUND_NOT_NEEDED);
+    div_assign_r(q_y, q_y, q_denom, ROUND_NOT_NEEDED);
+    if (q_x == d && q_y == d1) {
+      if (c.is_strict_inequality())
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_disjoint();
+      else
+        return Poly_Con_Relation::saturates()
+          && Poly_Con_Relation::is_included();
+    }
+    // `*this' is disjoint from `c' when
+    // `-y > d' (`-y >= d' if c is a strict equality), i.e. if
+    // `y < d1' (`y <= d1' if c is a strict equality).
+    if (q_y < d1)
+      return Poly_Con_Relation::is_disjoint();
+    if (q_y == d1 && c.is_strict_inequality())
+      return Poly_Con_Relation::is_disjoint();
+  }
+
+  // Here `y' can be also plus-infinity.
+  // If `c' is an equality, `*this' is disjoint from `c' if
+  // `x < d'.
+  if (d > q_x) {
+    if (c.is_equality())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::is_included();
+  }
+
+  if (d == q_x && c.is_nonstrict_inequality())
+    return Poly_Con_Relation::is_included();
+
+  // In all other cases `*this' intersects `c'.
+  return Poly_Con_Relation::strictly_intersects();
+}
+
+template <typename T>
+Poly_Gen_Relation
+BD_Shape<T>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  shortest_path_closure_assign();
+  // The empty BDS cannot subsume a generator.
+  if (marked_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe BDS in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  const bool is_line = g.is_line();
+  const bool is_line_or_ray = g.is_line_or_ray();
+
+  // The relation between the BDS and the given generator is obtained
+  // checking if the generator satisfies all the constraints in the BDS.
+  // To check if the generator satisfies all the constraints it's enough
+  // studying the sign of the scalar product between the generator and
+  // all the constraints in the BDS.
+
+  // Allocation of temporaries done once and for all.
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP_COEFFICIENT(product);
+  // We find in `*this' all the constraints.
+  // TODO: This loop can be optimized more, if needed.
+  for (dimension_type i = 0; i <= space_dim; ++i) {
+    const Coefficient& g_coeff_y = (i > g_space_dim || i == 0)
+      ? Coefficient_zero() : g.coefficient(Variable(i-1));
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Coefficient& g_coeff_x = (j > g_space_dim)
+        ? Coefficient_zero() : g.coefficient(Variable(j-1));
+      const N& dbm_ij = dbm_i[j];
+      const N& dbm_ji = dbm[j][i];
+      if (is_additive_inverse(dbm_ji, dbm_ij)) {
+        // We have one equality constraint: denom*x - denom*y = numer.
+        // Compute the scalar product.
+        numer_denom(dbm_ij, numer, denom);
+        product = g_coeff_y;
+        product -= g_coeff_x;
+        product *= denom;
+        if (!is_line_or_ray)
+          add_mul_assign(product, numer, g.divisor());
+        if (product != 0)
+          return Poly_Gen_Relation::nothing();
+      }
+      else {
+        // We have 0, 1 or 2 binary inequality constraint/s.
+        if (!is_plus_infinity(dbm_ij)) {
+          // We have the binary inequality constraint:
+          // denom*x - denom*y <= numer.
+          // Compute the scalar product.
+          numer_denom(dbm_ij, numer, denom);
+          product = g_coeff_y;
+          product -= g_coeff_x;
+          product *= denom;
+          if (!is_line_or_ray)
+            add_mul_assign(product, numer, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+
+        if (!is_plus_infinity(dbm_ji)) {
+          // We have the binary inequality constraint: denom*y - denom*x <= b.
+          // Compute the scalar product.
+          numer_denom(dbm_ji, numer, denom);
+          product = 0;
+          add_mul_assign(product, denom, g_coeff_x);
+          add_mul_assign(product, -denom, g_coeff_y);
+          if (!is_line_or_ray)
+            add_mul_assign(product, numer, g.divisor());
+          if (is_line) {
+            if (product != 0)
+              // Lines must saturate all constraints.
+              return Poly_Gen_Relation::nothing();
+          }
+          else
+            // `g' is either a ray, a point or a closure point.
+            if (product < 0)
+              return Poly_Gen_Relation::nothing();
+        }
+      }
+    }
+  }
+
+  // The generator satisfies all the constraints.
+  return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  // Zero-dimensional BDSs are necessarily shortest-path closed.
+  if (num_dimensions == 0)
+    return;
+
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape<T>&>(*this);
+
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
+
+  PPL_DIRTY_TEMP(N, sum);
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    const DB_Row<N>& x_dbm_k = x.dbm[k];
+    for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+      DB_Row<N>& x_dbm_i = x.dbm[i];
+      const N& x_dbm_i_k = x_dbm_i[k];
+      if (!is_plus_infinity(x_dbm_i_k))
+        for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+          const N& x_dbm_k_j = x_dbm_k[j];
+          if (!is_plus_infinity(x_dbm_k_j)) {
+            // Rounding upward for correctness.
+            add_assign_r(sum, x_dbm_i_k, x_dbm_k_j, ROUND_UP);
+            min_assign(x_dbm_i[j], sum);
+          }
+        }
+    }
+  }
+
+  // Check for emptiness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (sgn(x_dbm_hh) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      PPL_ASSERT(sgn(x_dbm_hh) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // The BDS is not empty and it is now shortest-path closed.
+  x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::incremental_shortest_path_closure_assign(Variable var) const {
+  // Do something only if necessary.
+  if (marked_empty() || marked_shortest_path_closed())
+    return;
+  const dimension_type num_dimensions = space_dimension();
+  PPL_ASSERT(var.id() < num_dimensions);
+
+  // Even though the BDS will not change, its internal representation
+  // is going to be modified by the incremental Floyd-Warshall algorithm.
+  BD_Shape& x = const_cast<BD_Shape&>(*this);
+
+  // Fill the main diagonal with zeros.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    PPL_ASSERT(is_plus_infinity(x.dbm[h][h]));
+    assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+  }
+
+  // Using the incremental Floyd-Warshall algorithm.
+  PPL_DIRTY_TEMP(N, sum);
+  const dimension_type v = var.id() + 1;
+  DB_Row<N>& x_v = x.dbm[v];
+  // Step 1: Improve all constraints on variable `var'.
+  for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+    DB_Row<N>& x_k = x.dbm[k];
+    const N& x_v_k = x_v[k];
+    const N& x_k_v = x_k[v];
+    const bool x_v_k_finite = !is_plus_infinity(x_v_k);
+    const bool x_k_v_finite = !is_plus_infinity(x_k_v);
+    // Specialize inner loop based on finiteness info.
+    if (x_v_k_finite) {
+      if (x_k_v_finite) {
+        // Here both x_v_k and x_k_v are finite.
+        for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+          DB_Row<N>& x_i = x.dbm[i];
+          const N& x_i_k = x_i[k];
+          if (!is_plus_infinity(x_i_k)) {
+            add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+            min_assign(x_i[v], sum);
+          }
+          const N& x_k_i = x_k[i];
+          if (!is_plus_infinity(x_k_i)) {
+            add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+            min_assign(x_v[i], sum);
+          }
+        }
+      }
+      else {
+        // Here x_v_k is finite, but x_k_v is not.
+        for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+          const N& x_k_i = x_k[i];
+          if (!is_plus_infinity(x_k_i)) {
+            add_assign_r(sum, x_v_k, x_k_i, ROUND_UP);
+            min_assign(x_v[i], sum);
+          }
+        }
+      }
+    }
+    else if (x_k_v_finite) {
+      // Here x_v_k is infinite, but x_k_v is finite.
+      for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+        DB_Row<N>& x_i = x.dbm[i];
+        const N& x_i_k = x_i[k];
+        if (!is_plus_infinity(x_i_k)) {
+          add_assign_r(sum, x_i_k, x_k_v, ROUND_UP);
+          min_assign(x_i[v], sum);
+        }
+      }
+    }
+    else
+      // Here both x_v_k and x_k_v are infinite.
+      continue;
+  }
+
+  // Step 2: improve the other bounds by using the precise bounds
+  // for the constraints on `var'.
+  for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+    DB_Row<N>& x_i = x.dbm[i];
+    const N& x_i_v = x_i[v];
+    if (!is_plus_infinity(x_i_v)) {
+      for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+        const N& x_v_j = x_v[j];
+        if (!is_plus_infinity(x_v_j)) {
+          add_assign_r(sum, x_i_v, x_v_j, ROUND_UP);
+          min_assign(x_i[j], sum);
+        }
+      }
+    }
+  }
+
+  // Check for emptiness: the BDS is empty if and only if there is a
+  // negative value on the main diagonal of `dbm'.
+  for (dimension_type h = num_dimensions + 1; h-- > 0; ) {
+    N& x_dbm_hh = x.dbm[h][h];
+    if (sgn(x_dbm_hh) < 0) {
+      x.set_empty();
+      return;
+    }
+    else {
+      PPL_ASSERT(sgn(x_dbm_hh) == 0);
+      // Restore PLUS_INFINITY on the main diagonal.
+      assign_r(x_dbm_hh, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+
+  // The BDS is not empty and it is now shortest-path closed.
+  x.set_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_reduction_assign() const {
+  // Do something only if necessary.
+  if (marked_shortest_path_reduced())
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  // Zero-dimensional BDSs are necessarily reduced.
+  if (space_dim == 0)
+    return;
+
+  // First find the tightest constraints for this BDS.
+  shortest_path_closure_assign();
+
+  // If `*this' is empty, then there is nothing to reduce.
+  if (marked_empty())
+    return;
+
+  // Step 1: compute zero-equivalence classes.
+  // Variables corresponding to indices `i' and `j' are zero-equivalent
+  // if they lie on a zero-weight loop; since the matrix is shortest-path
+  // closed, this happens if and only if dbm[i][j] == -dbm[j][i].
+  std::vector<dimension_type> predecessor;
+  compute_predecessors(predecessor);
+  std::vector<dimension_type> leaders;
+  compute_leader_indices(predecessor, leaders);
+  const dimension_type num_leaders = leaders.size();
+
+  Bit_Matrix redundancy(space_dim + 1, space_dim + 1);
+  // Init all constraints to be redundant.
+  // TODO: provide an appropriate method to set multiple bits.
+  Bit_Row& red_0 = redundancy[0];
+  for (dimension_type j = space_dim + 1; j-- > 0; )
+    red_0.set(j);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    redundancy[i] = red_0;
+
+  // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+  // subsystem of bounded differences having only leaders as variables.
+  PPL_DIRTY_TEMP(N, c);
+  for (dimension_type l_i = 0; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leaders[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    Bit_Row& redundancy_i = redundancy[i];
+    for (dimension_type l_j = 0; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leaders[l_j];
+      if (redundancy_i[j]) {
+        const N& dbm_i_j = dbm_i[j];
+        redundancy_i.clear(j);
+        for (dimension_type l_k = 0; l_k < num_leaders; ++l_k) {
+          const dimension_type k = leaders[l_k];
+          add_assign_r(c, dbm_i[k], dbm[k][j], ROUND_UP);
+          if (dbm_i_j >= c) {
+            redundancy_i.set(j);
+            break;
+          }
+        }
+      }
+    }
+  }
+
+  // Step 3: flag non-redundant constraints in zero-equivalence classes.
+  // Each equivalence class must have a single 0-cycle connecting
+  // all the equivalent variables in increasing order.
+  std::deque<bool> dealt_with(space_dim + 1, false);
+  for (dimension_type i = space_dim + 1; i-- > 0; )
+    // We only need to deal with non-singleton zero-equivalence classes
+    // that haven't already been dealt with.
+    if (i != predecessor[i] && !dealt_with[i]) {
+      dimension_type j = i;
+      while (true) {
+        const dimension_type predecessor_j = predecessor[j];
+        if (j == predecessor_j) {
+          // We finally found the leader of `i'.
+          PPL_ASSERT(redundancy[i][j]);
+          redundancy[i].clear(j);
+          // Here we dealt with `j' (i.e., `predecessor_j'), but it is useless
+          // to update `dealt_with' because `j' is a leader.
+          break;
+        }
+        // We haven't found the leader of `i' yet.
+        PPL_ASSERT(redundancy[predecessor_j][j]);
+        redundancy[predecessor_j].clear(j);
+        dealt_with[predecessor_j] = true;
+        j = predecessor_j;
+      }
+    }
+
+  // Even though shortest-path reduction is not going to change the BDS,
+  // it might change its internal representation.
+  BD_Shape<T>& x = const_cast<BD_Shape<T>&>(*this);
+  using std::swap;
+  swap(x.redundancy_dbm, redundancy);
+  x.set_shortest_path_reduced();
+
+  PPL_ASSERT(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+  // The upper bound of a BD shape `bd' with an empty shape is `bd'.
+  y.shortest_path_closure_assign();
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  if (marked_empty()) {
+    *this = y;
+    return;
+  }
+
+  // The bds-hull consists in constructing `*this' with the maximum
+  // elements selected from `*this' and `y'.
+  PPL_ASSERT(space_dim == 0 || marked_shortest_path_closed());
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij < y_dbm_ij)
+        dbm_ij = y_dbm_ij;
+    }
+  }
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::BFT00_upper_bound_assign_if_exact(const BD_Shape& y) {
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const BD_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x_space_dim == y.space_dimension());
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+  // Implementation based on Algorithm 4.1 (page 6) in [BemporadFT00TR],
+  // tailored to the special case of BD shapes.
+
+  Variable epsilon(x_space_dim);
+  Linear_Expression zero_expr;
+  zero_expr.set_space_dimension(x_space_dim + 1);
+  Linear_Expression db_expr;
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+  // Step 1: compute the constraint system for the envelope env(x,y)
+  // and put into x_cs_removed and y_cs_removed those non-redundant
+  // constraints that are not in the constraint system for env(x,y).
+  // While at it, also add the additional space dimension (epsilon).
+  Constraint_System env_cs;
+  Constraint_System x_cs_removed;
+  Constraint_System y_cs_removed;
+  x.shortest_path_reduction_assign();
+  y.shortest_path_reduction_assign();
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const Bit_Row& x_red_i = x.redundancy_dbm[i];
+    const Bit_Row& y_red_i = y.redundancy_dbm[i];
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+      if (x_red_i[j] && y_red_i[j])
+        continue;
+      if (!x_red_i[j]) {
+        const N& x_dbm_ij = x_dbm_i[j];
+        PPL_ASSERT(!is_plus_infinity(x_dbm_ij));
+        numer_denom(x_dbm_ij, numer, denom);
+        // Build skeleton DB constraint (having the right space dimension).
+        db_expr = zero_expr;
+        if (i > 0)
+          db_expr += Variable(i-1);
+        if (j > 0)
+          db_expr -= Variable(j-1);
+        if (denom != 1)
+          db_expr *= denom;
+        db_expr += numer;
+        if (x_dbm_ij >= y_dbm_i[j])
+          env_cs.insert(db_expr >= 0);
+        else {
+          db_expr += epsilon;
+          x_cs_removed.insert(db_expr == 0);
+        }
+      }
+      if (!y_red_i[j]) {
+        const N& y_dbm_ij = y_dbm_i[j];
+        const N& x_dbm_ij = x_dbm_i[j];
+        PPL_ASSERT(!is_plus_infinity(y_dbm_ij));
+        numer_denom(y_dbm_ij, numer, denom);
+        // Build skeleton DB constraint (having the right space dimension).
+        db_expr = zero_expr;
+        if (i > 0)
+          db_expr += Variable(i-1);
+        if (j > 0)
+          db_expr -= Variable(j-1);
+        if (denom != 1)
+          db_expr *= denom;
+        db_expr += numer;
+        if (y_dbm_ij >= x_dbm_ij) {
+          // Check if same constraint was added when considering x_dbm_ij.
+          if (!x_red_i[j] && x_dbm_ij == y_dbm_ij)
+            continue;
+          env_cs.insert(db_expr >= 0);
+        }
+        else {
+          db_expr += epsilon;
+          y_cs_removed.insert(db_expr == 0);
+        }
+      }
+    }
+  }
+
+  if (x_cs_removed.empty())
+    // No constraint of x was removed: y is included in x.
+    return true;
+  if (y_cs_removed.empty()) {
+    // No constraint of y was removed: x is included in y.
+    *this = y;
+    return true;
+  }
+
+  // In preparation to Step 4: build the common part of LP problems,
+  // i.e., the constraints corresponding to env(x,y),
+  // where the additional space dimension (epsilon) has to be maximized.
+  MIP_Problem env_lp(x_space_dim + 1, env_cs, epsilon, MAXIMIZATION);
+  // Pre-solve `env_lp' to later exploit incrementality.
+  env_lp.solve();
+  PPL_ASSERT(env_lp.solve() != UNFEASIBLE_MIP_PROBLEM);
+
+  // Implementing loop in Steps 3-6.
+  for (Constraint_System::const_iterator i = x_cs_removed.begin(),
+         i_end = x_cs_removed.end(); i != i_end; ++i) {
+    MIP_Problem lp_i(env_lp);
+    lp_i.add_constraint(*i);
+    // Pre-solve to exploit incrementality.
+    if (lp_i.solve() == UNFEASIBLE_MIP_PROBLEM)
+      continue;
+    for (Constraint_System::const_iterator j = y_cs_removed.begin(),
+           j_end = y_cs_removed.end(); j != j_end; ++j) {
+      MIP_Problem lp_ij(lp_i);
+      lp_ij.add_constraint(*j);
+      // Solve and check for a positive optimal value.
+      switch (lp_ij.solve()) {
+      case UNFEASIBLE_MIP_PROBLEM:
+        // CHECKME: is the following actually impossible?
+        PPL_UNREACHABLE;
+        return false;
+      case UNBOUNDED_MIP_PROBLEM:
+        return false;
+      case OPTIMIZED_MIP_PROBLEM:
+        lp_ij.optimal_value(numer, denom);
+        if (numer > 0)
+          return false;
+        break;
+      }
+    }
+  }
+
+  // The upper bound of x and y is indeed exact.
+  upper_bound_assign(y);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+template <bool integer_upper_bound>
+bool
+BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(const BD_Shape& y) {
+  PPL_COMPILE_TIME_CHECK(!integer_upper_bound
+                         || std::numeric_limits<T>::is_integer,
+                         "BD_Shape<T>::BHZ09_upper_bound_assign_if_exact(y):"
+                         " instantiating for integer upper bound,"
+                         " but T in not an integer datatype.");
+
+  // FIXME, CHECKME: what about inexact computations?
+  // Declare a const reference to *this (to avoid accidental modifications).
+  const BD_Shape& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Private method: the caller must ensure the following.
+  PPL_ASSERT(x_space_dim == y.space_dimension());
+
+  // The zero-dim case is trivial.
+  if (x_space_dim == 0) {
+    upper_bound_assign(y);
+    return true;
+  }
+  // If `x' or `y' is (known to be) empty, the upper bound is exact.
+  if (x.marked_empty()) {
+    *this = y;
+    return true;
+  }
+  else if (y.is_empty())
+    return true;
+  else if (x.is_empty()) {
+    *this = y;
+    return true;
+  }
+
+  // Here both `x' and `y' are known to be non-empty.
+  x.shortest_path_reduction_assign();
+  y.shortest_path_reduction_assign();
+  PPL_ASSERT(x.marked_shortest_path_closed());
+  PPL_ASSERT(y.marked_shortest_path_closed());
+  // Pre-compute the upper bound of `x' and `y'.
+  BD_Shape<T> ub(x);
+  ub.upper_bound_assign(y);
+
+  PPL_DIRTY_TEMP(N, lhs);
+  PPL_DIRTY_TEMP(N, rhs);
+  PPL_DIRTY_TEMP(N, temp_zero);
+  assign_r(temp_zero, 0, ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, temp_one);
+  if (integer_upper_bound)
+    assign_r(temp_one, 1, ROUND_NOT_NEEDED);
+
+  for (dimension_type i = x_space_dim + 1; i-- > 0; ) {
+    const DB_Row<N>& x_i = x.dbm[i];
+    const Bit_Row& x_red_i = x.redundancy_dbm[i];
+    const DB_Row<N>& y_i = y.dbm[i];
+    const DB_Row<N>& ub_i = ub.dbm[i];
+    for (dimension_type j = x_space_dim + 1; j-- > 0; ) {
+      // Check redundancy of x_i_j.
+      if (x_red_i[j])
+        continue;
+      // By non-redundancy, we know that i != j.
+      PPL_ASSERT(i != j);
+      const N& x_i_j = x_i[j];
+      if (x_i_j < y_i[j]) {
+        for (dimension_type k = x_space_dim + 1; k-- > 0; ) {
+          const DB_Row<N>& x_k = x.dbm[k];
+          const DB_Row<N>& y_k = y.dbm[k];
+          const Bit_Row& y_red_k = y.redundancy_dbm[k];
+          const DB_Row<N>& ub_k = ub.dbm[k];
+          const N& ub_k_j = (k == j) ? temp_zero : ub_k[j];
+          for (dimension_type ell = x_space_dim + 1; ell-- > 0; ) {
+            // Check redundancy of y_k_ell.
+            if (y_red_k[ell])
+              continue;
+            // By non-redundancy, we know that k != ell.
+            PPL_ASSERT(k != ell);
+            const N& y_k_ell = y_k[ell];
+            if (y_k_ell < x_k[ell]) {
+              // The first condition in BHZ09 theorem holds;
+              // now check for the second condition.
+              add_assign_r(lhs, x_i_j, y_k_ell, ROUND_UP);
+              const N& ub_i_ell = (i == ell) ? temp_zero : ub_i[ell];
+              add_assign_r(rhs, ub_i_ell, ub_k_j, ROUND_UP);
+              if (integer_upper_bound) {
+                // Note: adding 1 rather than 2 (as in Theorem 5.3)
+                // so as to later test for < rather than <=.
+                add_assign_r(lhs, lhs, temp_one, ROUND_NOT_NEEDED);
+              }
+              // Testing for < in both the rational and integer case.
+              if (lhs < rhs)
+                return false;
+            }
+          }
+        }
+      }
+    }
+  }
+  // The upper bound of x and y is indeed exact.
+  m_swap(ub);
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("difference_assign(y)", y);
+
+  BD_Shape new_bd_shape(space_dim, EMPTY);
+
+  BD_Shape& x = *this;
+
+  x.shortest_path_closure_assign();
+  // The difference of an empty bounded difference shape
+  // and of a bounded difference shape `p' is empty.
+  if (x.marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // The difference of a bounded difference shape `p'
+  // and an empty bounded difference shape is `p'.
+  if (y.marked_empty())
+    return;
+
+  // If both bounded difference shapes are zero-dimensional,
+  // then at this point they are necessarily universe system of
+  // bounded differences, so that their difference is empty.
+  if (space_dim == 0) {
+    x.set_empty();
+    return;
+  }
+
+  // TODO: This is just an executable specification.
+  //       Have to find a more efficient method.
+  if (y.contains(x)) {
+    x.set_empty();
+    return;
+  }
+
+  // We take a constraint of the system y at the time and we
+  // consider its complementary. Then we intersect the union
+  // of these complementary constraints with the system x.
+  const Constraint_System& y_cs = y.constraints();
+  for (Constraint_System::const_iterator i = y_cs.begin(),
+         y_cs_end = y_cs.end(); i != y_cs_end; ++i) {
+    const Constraint& c = *i;
+    // If the bounded difference shape `x' is included
+    // in the bounded difference shape defined by `c',
+    // then `c' _must_ be skipped, as adding its complement to `x'
+    // would result in the empty bounded difference shape,
+    // and as we would obtain a result that is less precise
+    // than the bds-difference.
+    if (x.relation_with(c).implies(Poly_Con_Relation::is_included()))
+      continue;
+    BD_Shape z = x;
+    const Linear_Expression e(c.expression());
+    z.add_constraint(e <= 0);
+    if (!z.is_empty())
+      new_bd_shape.upper_bound_assign(z);
+    if (c.is_equality()) {
+      z = x;
+      z.add_constraint(e >= 0);
+      if (!z.is_empty())
+        new_bd_shape.upper_bound_assign(z);
+    }
+  }
+  *this = new_bd_shape;
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+bool
+BD_Shape<T>::simplify_using_context_assign(const BD_Shape& y) {
+  BD_Shape& x = *this;
+  const dimension_type dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (dim != y.space_dimension())
+    throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+  // Filter away the zero-dimensional case.
+  if (dim == 0) {
+    if (y.marked_empty()) {
+      x.set_zero_dim_univ();
+      return false;
+    }
+    else
+      return !x.marked_empty();
+  }
+
+  // Filter away the case where `x' contains `y'
+  // (this subsumes the case when `y' is empty).
+  y.shortest_path_closure_assign();
+  if (x.contains(y)) {
+    BD_Shape<T> res(dim, UNIVERSE);
+    x.m_swap(res);
+    return false;
+  }
+
+  // Filter away the case where `x' is empty.
+  x.shortest_path_closure_assign();
+  if (x.marked_empty()) {
+    // Search for a constraint of `y' that is not a tautology.
+    dimension_type i;
+    dimension_type j;
+    // Prefer unary constraints.
+    i = 0;
+    const DB_Row<N>& y_dbm_0 = y.dbm[0];
+    for (j = 1; j <= dim; ++j) {
+      if (!is_plus_infinity(y_dbm_0[j]))
+        // FIXME: if N is a float or bounded integer type, then
+        // we also need to check that we are actually able to construct
+        // a constraint inconsistent with respect to this one.
+        goto found;
+    }
+    j = 0;
+    for (i = 1; i <= dim; ++i) {
+      if (!is_plus_infinity(y.dbm[i][0]))
+        // FIXME: if N is a float or bounded integer type, then
+        // we also need to check that we are actually able to construct
+        // a constraint inconsistent with respect to this one.
+        goto found;
+    }
+    // Then search binary constraints.
+    for (i = 1; i <= dim; ++i) {
+      const DB_Row<N>& y_dbm_i = y.dbm[i];
+      for (j = 1; j <= dim; ++j)
+        if (!is_plus_infinity(y_dbm_i[j]))
+          // FIXME: if N is a float or bounded integer type, then
+          // we also need to check that we are actually able to construct
+          // a constraint inconsistent with respect to this one.
+          goto found;
+    }
+    // Not found: we were not able to build a constraint contradicting
+    // one of the constraints in `y': `x' cannot be enlarged.
+    return false;
+
+  found:
+    // Found: build a new BDS contradicting the constraint found.
+    PPL_ASSERT(i <= dim && j <= dim && (i > 0 || j > 0));
+    BD_Shape<T> res(dim, UNIVERSE);
+    PPL_DIRTY_TEMP(N, tmp);
+    assign_r(tmp, 1, ROUND_UP);
+    add_assign_r(tmp, tmp, y.dbm[i][j], ROUND_UP);
+    PPL_ASSERT(!is_plus_infinity(tmp));
+    // CHECKME: round down is really meant.
+    neg_assign_r(res.dbm[j][i], tmp, ROUND_DOWN);
+    x.m_swap(res);
+    return false;
+  }
+
+  // Here `x' and `y' are not empty and shortest-path closed;
+  // also, `x' does not contain `y'.
+  // Let `target' be the intersection of `x' and `y'.
+  BD_Shape<T> target = x;
+  target.intersection_assign(y);
+  const bool bool_result = !target.is_empty();
+
+  // Compute a reduced dbm for `x' and ...
+  x.shortest_path_reduction_assign();
+  // ... count the non-redundant constraints.
+  dimension_type x_num_non_redundant = (dim+1)*(dim+1);
+  for (dimension_type i = dim + 1; i-- > 0; )
+    x_num_non_redundant -= x.redundancy_dbm[i].count_ones();
+  PPL_ASSERT(x_num_non_redundant > 0);
+
+  // Let `yy' be a copy of `y': we will keep adding to `yy'
+  // the non-redundant constraints of `x',
+  // stopping as soon as `yy' becomes equal to `target'.
+  BD_Shape<T> yy = y;
+
+  // The constraints added to `yy' will be recorded in `res' ...
+  BD_Shape<T> res(dim, UNIVERSE);
+  // ... and we will count them too.
+  dimension_type res_num_non_redundant = 0;
+
+  // Compute leader information for `x'.
+  std::vector<dimension_type> x_leaders;
+  x.compute_leaders(x_leaders);
+
+  // First go through the unary equality constraints.
+  const DB_Row<N>& x_dbm_0 = x.dbm[0];
+  DB_Row<N>& yy_dbm_0 = yy.dbm[0];
+  DB_Row<N>& res_dbm_0 = res.dbm[0];
+  for (dimension_type j = 1; j <= dim; ++j) {
+    // Unary equality constraints are encoded in entries dbm_0j and dbm_j0
+    // provided index j has special variable index 0 as its leader.
+    if (x_leaders[j] != 0)
+      continue;
+    PPL_ASSERT(!is_plus_infinity(x_dbm_0[j]));
+    if (x_dbm_0[j] < yy_dbm_0[j]) {
+      res_dbm_0[j] = x_dbm_0[j];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy_dbm_0[j] = x_dbm_0[j];
+      yy.reset_shortest_path_closed();
+    }
+    PPL_ASSERT(!is_plus_infinity(x.dbm[j][0]));
+    if (x.dbm[j][0] < yy.dbm[j][0]) {
+      res.dbm[j][0] = x.dbm[j][0];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy.dbm[j][0] = x.dbm[j][0];
+      yy.reset_shortest_path_closed();
+    }
+    // Restore shortest-path closure, if it was lost.
+    if (!yy.marked_shortest_path_closed()) {
+      Variable var_j(j-1);
+      yy.incremental_shortest_path_closure_assign(var_j);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_shortest_path_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Go through the binary equality constraints.
+  // Note: no need to consider the case i == 1.
+  for (dimension_type i = 2; i <= dim; ++i) {
+    const dimension_type j = x_leaders[i];
+    if (j == i || j == 0)
+      continue;
+    PPL_ASSERT(!is_plus_infinity(x.dbm[i][j]));
+    if (x.dbm[i][j] < yy.dbm[i][j]) {
+      res.dbm[i][j] = x.dbm[i][j];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy.dbm[i][j] = x.dbm[i][j];
+      yy.reset_shortest_path_closed();
+    }
+    PPL_ASSERT(!is_plus_infinity(x.dbm[j][i]));
+    if (x.dbm[j][i] < yy.dbm[j][i]) {
+      res.dbm[j][i] = x.dbm[j][i];
+      ++res_num_non_redundant;
+      // Tighten context `yy' using the newly added constraint.
+      yy.dbm[j][i] = x.dbm[j][i];
+      yy.reset_shortest_path_closed();
+    }
+    // Restore shortest-path closure, if it was lost.
+    if (!yy.marked_shortest_path_closed()) {
+      Variable var_j(j-1);
+      yy.incremental_shortest_path_closure_assign(var_j);
+      if (target.contains(yy)) {
+        // Target reached: swap `x' and `res' if needed.
+        if (res_num_non_redundant < x_num_non_redundant) {
+          res.reset_shortest_path_closed();
+          x.m_swap(res);
+        }
+        return bool_result;
+      }
+    }
+  }
+
+  // Finally go through the (proper) inequality constraints:
+  // both indices i and j should be leaders.
+  for (dimension_type i = 0; i <= dim; ++i) {
+    if (i != x_leaders[i])
+      continue;
+    const DB_Row<N>& x_dbm_i = x.dbm[i];
+    const Bit_Row& x_redundancy_dbm_i = x.redundancy_dbm[i];
+    DB_Row<N>& yy_dbm_i = yy.dbm[i];
+    DB_Row<N>& res_dbm_i = res.dbm[i];
+    for (dimension_type j = 0; j <= dim; ++j) {
+      if (j != x_leaders[j] || x_redundancy_dbm_i[j])
+        continue;
+      N& yy_dbm_ij = yy_dbm_i[j];
+      const N& x_dbm_ij = x_dbm_i[j];
+      if (x_dbm_ij < yy_dbm_ij) {
+        res_dbm_i[j] = x_dbm_ij;
+        ++res_num_non_redundant;
+        // Tighten context `yy' using the newly added constraint.
+        yy_dbm_ij = x_dbm_ij;
+        yy.reset_shortest_path_closed();
+        PPL_ASSERT(i > 0 || j > 0);
+        Variable var(((i > 0) ? i : j) - 1);
+        yy.incremental_shortest_path_closure_assign(var);
+        if (target.contains(yy)) {
+          // Target reached: swap `x' and `res' if needed.
+          if (res_num_non_redundant < x_num_non_redundant) {
+            res.reset_shortest_path_closed();
+            x.m_swap(res);
+          }
+          return bool_result;
+        }
+      }
+    }
+  }
+  // This point should be unreachable.
+  PPL_UNREACHABLE;
+  return false;
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  const dimension_type new_space_dim = space_dim + m;
+  const bool was_zero_dim_univ = (!marked_empty() && space_dim == 0);
+
+  // To embed an n-dimension space BDS in a (n+m)-dimension space,
+  // we just add `m' rows and columns in the bounded difference shape,
+  // initialized to PLUS_INFINITY.
+  dbm.grow(new_space_dim + 1);
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // If `*this' was the zero-dim space universe BDS,
+  // the we can set the shortest-path closure flag.
+  if (was_zero_dim_univ)
+    set_shortest_path_closed();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+
+  // If `*this' was zero-dimensional, then we add `m' rows and columns.
+  // If it also was non-empty, then we zero all the added elements
+  // and set the flag for shortest-path closure.
+  if (space_dim == 0) {
+    dbm.grow(m + 1);
+    if (!marked_empty()) {
+      for (dimension_type i = m + 1; i-- > 0; ) {
+        DB_Row<N>& dbm_i = dbm[i];
+        for (dimension_type j = m + 1; j-- > 0; )
+          if (i != j)
+            assign_r(dbm_i[j], 0, ROUND_NOT_NEEDED);
+      }
+      set_shortest_path_closed();
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // To project an n-dimension space bounded difference shape
+  // in a (n+m)-dimension space, we add `m' rows and columns.
+  // In the first row and column of the matrix we add `zero' from
+  // the (n+1)-th position to the end.
+  const dimension_type new_space_dim = space_dim + m;
+  dbm.grow(new_space_dim + 1);
+
+  // Bottom of the matrix and first row.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim + 1; i <= new_space_dim; ++i) {
+    assign_r(dbm[i][0], 0, ROUND_NOT_NEEDED);
+    assign_r(dbm_0[i], 0, ROUND_NOT_NEEDED);
+  }
+
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any BDS is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a BDS in a 0-dim space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  const dimension_type old_space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (old_space_dim < min_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)", min_space_dim);
+
+  // Shortest-path closure is necessary to keep precision.
+  shortest_path_closure_assign();
+
+  // When removing _all_ dimensions from a BDS, we obtain the
+  // zero-dimensional BDS.
+  const dimension_type new_space_dim = old_space_dim - vars.size();
+  if (new_space_dim == 0) {
+    dbm.resize_no_copy(1);
+    if (!marked_empty())
+      // We set the zero_dim_univ flag.
+      set_zero_dim_univ();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Handle the case of an empty BD_Shape.
+  if (marked_empty()) {
+    dbm.resize_no_copy(new_space_dim + 1);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // Shortest-path closure is maintained.
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // For each variable to remove, we fill the corresponding column and
+  // row by shifting respectively left and above those
+  // columns and rows, that will not be removed.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  dimension_type dst = *vsi + 1;
+  dimension_type src = dst + 1;
+  for (++vsi; vsi != vsi_end; ++vsi) {
+    const dimension_type vsi_next = *vsi + 1;
+    // All other columns and rows are moved respectively to the left
+    // and above.
+    while (src < vsi_next) {
+      using std::swap;
+      swap(dbm[dst], dbm[src]);
+      for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+        DB_Row<N>& dbm_i = dbm[i];
+        assign_or_swap(dbm_i[dst], dbm_i[src]);
+      }
+      ++dst;
+      ++src;
+    }
+    ++src;
+  }
+
+  // Moving the remaining rows and columns.
+  while (src <= old_space_dim) {
+    using std::swap;
+    swap(dbm[dst], dbm[src]);
+    for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+      DB_Row<N>& dbm_i = dbm[i];
+      assign_or_swap(dbm_i[dst], dbm_i[src]);
+    }
+    ++src;
+    ++dst;
+  }
+
+  // Update the space dimension.
+  dbm.resize_no_copy(new_space_dim + 1);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Partial_Function>
+void
+BD_Shape<T>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  // TODO: this implementation is just an executable specification.
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the BDS becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If we are going to actually reduce the space dimension,
+  // then shortest-path closure is required to keep precision.
+  if (new_space_dim < space_dim)
+    shortest_path_closure_assign();
+
+  // If the BDS is empty, then it is sufficient to adjust the
+  // space dimension of the bounded difference shape.
+  if (marked_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // Shortest-path closure is maintained (if it was holding).
+  // TODO: see whether reduction can be (efficiently!) maintained too.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  // We create a new matrix with the new space dimension.
+  DB_Matrix<N> x(new_space_dim+1);
+  // First of all we must map the unary constraints, because
+  // there is the fictitious variable `zero', that can't be mapped
+  // at all.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& x_0 = x[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    dimension_type new_j;
+    if (pfunc.maps(j - 1, new_j)) {
+      assign_or_swap(x_0[new_j + 1], dbm_0[j]);
+      assign_or_swap(x[new_j + 1][0], dbm[j][0]);
+    }
+  }
+  // Now we map the binary constraints, exchanging the indexes.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i - 1, new_i)) {
+      DB_Row<N>& dbm_i = dbm[i];
+      ++new_i;
+      DB_Row<N>& x_new_i = x[new_i];
+      for (dimension_type j = i+1; j <= space_dim; ++j) {
+        dimension_type new_j;
+        if (pfunc.maps(j - 1, new_j)) {
+          ++new_j;
+          assign_or_swap(x_new_i[new_j], dbm_i[j]);
+          assign_or_swap(x[new_j][new_i], dbm[j][i]);
+        }
+      }
+    }
+  }
+
+  using std::swap;
+  swap(dbm, x);
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::intersection_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two bounded difference shapes is empty,
+  // the intersection is empty.
+  if (marked_empty())
+    return;
+  if (y.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // If both bounded difference shapes are zero-dimensional,
+  // then at this point they are necessarily non-empty,
+  // so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // To intersect two bounded difference shapes we compare
+  // the constraints and we choose the less values.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (dbm_ij > y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
+      }
+    }
+  }
+
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Iterator>
+void
+BD_Shape<T>::CC76_extrapolation_assign(const BD_Shape& y,
+                                       Iterator first, Iterator last,
+                                       unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_extrapolation_assign(y)", y);
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If both bounded difference shapes are zero-dimensional,
+  // since `*this' contains `y', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  shortest_path_closure_assign();
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  y.shortest_path_closure_assign();
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.CC76_extrapolation_assign(y, first, last, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Compare each constraint in `y' to the corresponding one in `*this'.
+  // The constraint in `*this' is kept as is if it is stronger than or
+  // equal to the constraint in `y'; otherwise, the inhomogeneous term
+  // of the constraint in `*this' is further compared with elements taken
+  // from a sorted container (the stop-points, provided by the user), and
+  // is replaced by the first entry, if any, which is greater than or equal
+  // to the inhomogeneous term. If no such entry exists, the constraint
+  // is removed altogether.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (y_dbm_ij < dbm_ij) {
+        Iterator k = std::lower_bound(first, last, dbm_ij);
+        if (k != last) {
+          if (dbm_ij < *k)
+            assign_r(dbm_ij, *k, ROUND_UP);
+        }
+        else
+          assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+      }
+    }
+  }
+  reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+                                BD_Shape& limiting_shape) const {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+  shortest_path_closure_assign();
+  bool changed = false;
+  PPL_DIRTY_TEMP_COEFFICIENT(coeff);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_c_term);
+  PPL_DIRTY_TEMP(N, d);
+  PPL_DIRTY_TEMP(N, d1);
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type num_vars = 0;
+    dimension_type i = 0;
+    dimension_type j = 0;
+    // Constraints that are not bounded differences are ignored.
+    if (BD_Shape_Helpers::extract_bounded_difference(c, num_vars, i, j, coeff)) {
+      // Select the cell to be modified for the "<=" part of the constraint,
+      // and set `coeff' to the absolute value of itself.
+      const bool negative = (coeff < 0);
+      const N& x = negative ? dbm[i][j] : dbm[j][i];
+      const N& y = negative ? dbm[j][i] : dbm[i][j];
+      DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+      if (negative)
+        neg_assign(coeff);
+      // Compute the bound for `x', rounding towards plus infinity.
+      div_round_up(d, c.inhomogeneous_term(), coeff);
+      if (x <= d) {
+        if (c.is_inequality()) {
+          N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+          if (ls_x > d) {
+            ls_x = d;
+            changed = true;
+          }
+        }
+        else {
+          // Compute the bound for `y', rounding towards plus infinity.
+          neg_assign(minus_c_term, c.inhomogeneous_term());
+          div_round_up(d1, minus_c_term, coeff);
+          if (y <= d1) {
+            N& ls_x = negative ? ls_dbm[i][j] : ls_dbm[j][i];
+            N& ls_y = negative ? ls_dbm[j][i] : ls_dbm[i][j];
+            if ((ls_x >= d && ls_y > d1) || (ls_x > d && ls_y >= d1)) {
+              ls_x = d;
+              ls_y = d1;
+              changed = true;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure of the bounded difference shape.
+  if (changed && limiting_shape.marked_shortest_path_closed())
+    limiting_shape.reset_shortest_path_closed();
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_CC76_extrapolation_assign(const BD_Shape& y,
+                                               const Constraint_System& cs,
+                                               unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+                           "cs is space_dimension incompatible");
+
+  // Strict inequalities not allowed.
+  if (cs.has_strict_inequalities())
+    throw_invalid_argument("limited_CC76_extrapolation_assign(y, cs)",
+                           "cs has strict inequalities");
+
+  // The limited CC76-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  CC76_extrapolation_assign(y, tp);
+  intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::BHMZ05_widening_assign(const BD_Shape& y, unsigned* tp) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("BHMZ05_widening_assign(y)", y);
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // Compute the affine dimension of `y'.
+  const dimension_type y_affine_dim = y.affine_dimension();
+  // If the affine dimension of `y' is zero, then either `y' is
+  // zero-dimensional, or it is empty, or it is a singleton.
+  // In all cases, due to the inclusion hypothesis, the result is `*this'.
+  if (y_affine_dim == 0)
+    return;
+
+  // If the affine dimension has changed, due to the inclusion hypothesis,
+  // the result is `*this'.
+  const dimension_type x_affine_dim = affine_dimension();
+  PPL_ASSERT(x_affine_dim >= y_affine_dim);
+  if (x_affine_dim != y_affine_dim)
+    return;
+
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    BD_Shape<T> x_tmp(*this);
+    x_tmp.BHMZ05_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!contains(x_tmp))
+      --(*tp);
+    return;
+  }
+
+  // Here no token is available.
+  PPL_ASSERT(marked_shortest_path_closed() && y.marked_shortest_path_closed());
+  // Minimize `y'.
+  y.shortest_path_reduction_assign();
+
+  // Extrapolate unstable bounds, taking into account redundancy in `y'.
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    const Bit_Row& y_redundancy_i = y.redundancy_dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      // Note: in the following line the use of `!=' (as opposed to
+      // the use of `<' that would seem -but is not- equivalent) is
+      // intentional.
+      if (y_redundancy_i[j] || y_dbm_i[j] != dbm_ij)
+        assign_r(dbm_ij, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    }
+  }
+  // NOTE: this will also reset the shortest-path reduction flag,
+  // even though the dbm is still in reduced form. However, the
+  // current implementation invariant requires that any reduced dbm
+  // is closed too.
+  reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::limited_BHMZ05_extrapolation_assign(const BD_Shape& y,
+                                                 const Constraint_System& cs,
+                                                 unsigned* tp) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_BHMZ05_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two systems
+  // of bounded differences.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+                           "cs is space-dimension incompatible");
+
+  // Strict inequalities are not allowed.
+  if (cs.has_strict_inequalities())
+    throw_invalid_argument("limited_BHMZ05_extrapolation_assign(y, cs)",
+                           "cs has strict inequalities");
+
+  // The limited BHMZ05-extrapolation between two systems of bounded
+  // differences in a zero-dimensional space is a system of bounded
+  // differences in a zero-dimensional space, too.
+  if (space_dim == 0)
+    return;
+
+  // We assume that `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  BD_Shape<T> limiting_shape(space_dim, UNIVERSE);
+  get_limiting_shape(cs, limiting_shape);
+  BHMZ05_widening_assign(y, tp);
+  intersection_assign(limiting_shape);
+}
+
+template <typename T>
+void
+BD_Shape<T>::CC76_narrowing_assign(const BD_Shape& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+  // We assume that `*this' is contained in or equal to `y'.
+  PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+  // If both bounded difference shapes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  y.shortest_path_closure_assign();
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.marked_empty())
+    return;
+  shortest_path_closure_assign();
+  // If `*this' is empty, we return.
+  if (marked_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  bool changed = false;
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const DB_Row<N>& y_dbm_i = y.dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; ) {
+      N& dbm_ij = dbm_i[j];
+      const N& y_dbm_ij = y_dbm_i[j];
+      if (!is_plus_infinity(dbm_ij)
+          && !is_plus_infinity(y_dbm_ij)
+          && dbm_ij != y_dbm_ij) {
+        dbm_ij = y_dbm_ij;
+        changed = true;
+      }
+    }
+  }
+  if (changed && marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_v_minus_u_bounds(const dimension_type v,
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_denom,
+                          const N& ub_v) {
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(ub_v));
+  // Deduce constraints of the form `v - u', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `v - u <= ub_v - lb_u'. We can be more precise if variable `u'
+  // played an active role in the computation of the upper bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/denom' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `v - u <= ub_v - ub_u';
+  // if `0 < q < 1', then `v - u <= ub_v - (q*ub_u + (1-q)*lb_u)'.
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+        u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+    const dimension_type u_dim = u.variable().space_dimension();
+    if (u_dim == v)
+      continue;
+    const Coefficient& expr_u = *u;
+    if (expr_u < 0)
+      continue;
+    PPL_ASSERT(expr_u > 0);
+    if (expr_u >= sc_denom)
+      // Deducing `v - u <= ub_v - ub_u'.
+      sub_assign_r(dbm[u_dim][v], ub_v, dbm_0[u_dim], ROUND_UP);
+    else {
+      DB_Row<N>& dbm_u = dbm[u_dim];
+      const N& dbm_u0 = dbm_u[0];
+      if (!is_plus_infinity(dbm_u0)) {
+        // Let `ub_u' and `lb_u' be the known upper and lower bound
+        // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+        // rational coefficient of `u' in `sc_expr/sc_denom',
+        // the upper bound for `v - u' is computed as
+        // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+        // `ub_v + (-lb_u) - q * (ub_u + (-lb_u))'.
+        assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+        assign_r(q, expr_u, ROUND_NOT_NEEDED);
+        div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+        assign_r(ub_u, dbm_0[u_dim], ROUND_NOT_NEEDED);
+        // Compute `ub_u - lb_u'.
+        add_assign_r(ub_u, ub_u, minus_lb_u, ROUND_NOT_NEEDED);
+        // Compute `(-lb_u) - q * (ub_u - lb_u)'.
+        sub_mul_assign_r(minus_lb_u, q, ub_u, ROUND_NOT_NEEDED);
+        assign_r(up_approx, minus_lb_u, ROUND_UP);
+        // Deducing `v - u <= ub_v - (q * ub_u + (1-q) * lb_u)'.
+        add_assign_r(dbm_u[v], ub_v, up_approx, ROUND_UP);
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::deduce_u_minus_v_bounds(const dimension_type v,
+                          const dimension_type last_v,
+                          const Linear_Expression& sc_expr,
+                          Coefficient_traits::const_reference sc_denom,
+                          const N& minus_lb_v) {
+  PPL_ASSERT(sc_denom > 0);
+  PPL_ASSERT(!is_plus_infinity(minus_lb_v));
+  // Deduce constraints of the form `u - v', where `u != v'.
+  // Note: the shortest-path closure is able to deduce the constraint
+  // `u - v <= ub_u - lb_v'. We can be more precise if variable `u'
+  // played an active role in the computation of the lower bound for `v',
+  // i.e., if the corresponding coefficient `q == expr_u/denom' is
+  // greater than zero. In particular:
+  // if `q >= 1',    then `u - v <= lb_u - lb_v';
+  // if `0 < q < 1', then `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+  PPL_DIRTY_TEMP(mpq_class, mpq_sc_denom);
+  assign_r(mpq_sc_denom, sc_denom, ROUND_NOT_NEEDED);
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(mpq_class, ub_u);
+  PPL_DIRTY_TEMP(mpq_class, q);
+  PPL_DIRTY_TEMP(mpq_class, minus_lb_u);
+  PPL_DIRTY_TEMP(N, up_approx);
+  // No need to consider indices greater than `last_v'.
+  for (Linear_Expression::const_iterator u = sc_expr.begin(),
+        u_end = sc_expr.lower_bound(Variable(last_v)); u != u_end; ++u) {
+    const Variable u_var = u.variable();
+    const dimension_type u_dim = u_var.space_dimension();
+    if (u_var.space_dimension() == v)
+      continue;
+    const Coefficient& expr_u = *u;
+    if (expr_u < 0)
+      continue;
+    PPL_ASSERT(expr_u > 0);
+    if (expr_u >= sc_denom)
+      // Deducing `u - v <= lb_u - lb_v',
+      // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+      sub_assign_r(dbm_v[u_dim], minus_lb_v, dbm[u_dim][0], ROUND_UP);
+    else {
+      const N& dbm_0u = dbm_0[u_dim];
+      if (!is_plus_infinity(dbm_0u)) {
+        // Let `ub_u' and `lb_u' be the known upper and lower bound
+        // for `u', respectively. Letting `q = expr_u/sc_denom' be the
+        // rational coefficient of `u' in `sc_expr/sc_denom',
+        // the upper bound for `u - v' is computed as
+        // `(q * lb_u + (1-q) * ub_u) - lb_v', i.e.,
+        // `ub_u - q * (ub_u + (-lb_u)) + minus_lb_v'.
+        assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+        assign_r(q, expr_u, ROUND_NOT_NEEDED);
+        div_assign_r(q, q, mpq_sc_denom, ROUND_NOT_NEEDED);
+        assign_r(minus_lb_u, dbm[u_dim][0], ROUND_NOT_NEEDED);
+        // Compute `ub_u - lb_u'.
+        add_assign_r(minus_lb_u, minus_lb_u, ub_u, ROUND_NOT_NEEDED);
+        // Compute `ub_u - q * (ub_u - lb_u)'.
+        sub_mul_assign_r(ub_u, q, minus_lb_u, ROUND_NOT_NEEDED);
+        assign_r(up_approx, ub_u, ROUND_UP);
+        // Deducing `u - v <= (q*lb_u + (1-q)*ub_u) - lb_v'.
+        add_assign_r(dbm_v[u_dim], up_approx, minus_lb_v, ROUND_UP);
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+  PPL_ASSERT(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+  PPL_ASSERT(0 < v && v <= dbm.num_rows());
+  DB_Row<N>& dbm_v = dbm[v];
+  for (dimension_type i = dbm.num_rows()-1; i > 0; --i) {
+    assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+    assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variable var) {
+  // Dimension-compatibility check.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("unconstrain(var)", var_space_dim);
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  forget_all_dbm_constraints(var_space_dim);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case captures the only legal cylindrification in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // Shortest-path closure is necessary to detect emptiness
+  // and all (possibly implicit) constraints.
+  shortest_path_closure_assign();
+
+  // If the shape is empty, this is a no-op.
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi)
+    forget_all_dbm_constraints(*vsi + 1);
+  // Shortest-path closure is preserved, but not reduction.
+  reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::refine(const Variable var,
+                    const Relation_Symbol relsym,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator) {
+  PPL_ASSERT(denominator != 0);
+  PPL_ASSERT(space_dimension() >= expr.space_dimension());
+  const dimension_type v = var.id() + 1;
+  PPL_ASSERT(v <= space_dimension());
+  PPL_ASSERT(expr.coefficient(var) == 0);
+  PPL_ASSERT(relsym != LESS_THAN && relsym != GREATER_THAN);
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Since we are only able to record bounded differences, we can
+  // precisely deal with the case of a single variable only if its
+  // coefficient (taking into account the denominator) is 1.
+  // If this is not the case, we fall back to the general case
+  // so as to over-approximate the constraint.
+  if (t == 1 && expr.get(Variable(w - 1)) != denominator)
+    t = 2;
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w != v' and `a == denominator';
+  // - If t == 2, the `expr' is of the general form.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    switch (relsym) {
+    case EQUAL:
+      // Add the constraint `var == b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      add_dbm_constraint(v, 0, b, minus_denom);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    return;
+  }
+
+  if (t == 1) {
+    // Case 2: expr == a*w + b, w != v, a == denominator.
+    PPL_ASSERT(expr.get(Variable(w - 1)) == denominator);
+    PPL_DIRTY_TEMP(N, d);
+    switch (relsym) {
+    case EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_denom);
+      add_dbm_constraint(v, w, d);
+      break;
+    case LESS_OR_EQUAL:
+      // Add the new constraint `v - w <= b/denominator'.
+      div_round_up(d, b, denominator);
+      add_dbm_constraint(w, v, d);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the new constraint `v - w >= b/denominator',
+      // i.e., `w - v <= -b/denominator'.
+      div_round_up(d, b, minus_denom);
+      add_dbm_constraint(v, w, d);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    return;
+  }
+
+  // Here t == 2, so that either
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2, or
+  // expr == a*w + b, w != v and a != denominator.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  // Speculative allocation of temporaries that are used in most
+  // of the computational traces starting from this point (also loops).
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  PPL_DIRTY_TEMP(N, coeff_i);
+
+  switch (relsym) {
+  case EQUAL:
+    {
+      PPL_DIRTY_TEMP(N, neg_sum);
+      // Indices of the variables that are unbounded in `this->dbm'.
+      PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+      // Number of unbounded variables found.
+      dimension_type neg_pinf_count = 0;
+
+      // Compute an upper approximation for `expr' into `sum',
+      // taking into account the sign of `denominator'.
+
+      // Approximate the inhomogeneous term.
+      assign_r(sum, sc_b, ROUND_UP);
+      assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+      // Approximate the homogeneous part of `sc_expr'.
+      // Note: indices above `w' can be disregarded, as they all have
+      // a zero coefficient in `expr'.
+      for (Linear_Expression::const_iterator i = sc_expr.begin(),
+            i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+        const dimension_type i_dim = i.variable().space_dimension();
+        const Coefficient& sc_i = *i;
+        const int sign_i = sgn(sc_i);
+        PPL_ASSERT(sign_i != 0);
+        if (sign_i > 0) {
+          assign_r(coeff_i, sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_i = dbm_0[i_dim];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i_dim;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i_dim][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i_dim;
+            }
+          }
+        }
+        else {
+          PPL_ASSERT(sign_i < 0);
+          neg_assign(minus_sc_i, sc_i);
+          // Note: using temporary named `coeff_i' to store -coeff_i.
+          assign_r(coeff_i, minus_sc_i, ROUND_UP);
+          // Approximating `sc_expr'.
+          if (pinf_count <= 1) {
+            const N& approx_minus_i = dbm[i_dim][0];
+            if (!is_plus_infinity(approx_minus_i))
+              add_mul_assign_r(sum, coeff_i, approx_minus_i, ROUND_UP);
+            else {
+              ++pinf_count;
+              pinf_index = i_dim;
+            }
+          }
+          // Approximating `-sc_expr'.
+          if (neg_pinf_count <= 1) {
+            const N& approx_i = dbm_0[i_dim];
+            if (!is_plus_infinity(approx_i))
+              add_mul_assign_r(neg_sum, coeff_i, approx_i, ROUND_UP);
+            else {
+              ++neg_pinf_count;
+              neg_pinf_index = i_dim;
+            }
+          }
+        }
+      }
+      // Return immediately if no approximation could be computed.
+      if (pinf_count > 1 && neg_pinf_count > 1) {
+        PPL_ASSERT(OK());
+        return;
+      }
+
+      // In the following, shortest-path closure will be definitely lost.
+      reset_shortest_path_closed();
+
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+
+      // Exploit the upper approximation, if possible.
+      if (pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_denom != 1)
+          div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+        // Add the upper bound constraint, if meaningful.
+        if (pinf_count == 0) {
+          // Add the constraint `v <= sum'.
+          dbm[0][v] = sum;
+          // Deduce constraints of the form `v - u', where `u != v'.
+          deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+        }
+        else
+          // Here `pinf_count == 1'.
+          if (pinf_index != v
+              && sc_expr.get(Variable(pinf_index - 1)) == sc_denom)
+            // Add the constraint `v - pinf_index <= sum'.
+            dbm[pinf_index][v] = sum;
+      }
+
+      // Exploit the lower approximation, if possible.
+      if (neg_pinf_count <= 1) {
+        // Compute quotient (if needed).
+        if (down_sc_denom != 1)
+          div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+        // Add the lower bound constraint, if meaningful.
+        if (neg_pinf_count == 0) {
+          // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+          DB_Row<N>& dbm_v = dbm[v];
+          dbm_v[0] = neg_sum;
+          // Deduce constraints of the form `u - v', where `u != v'.
+          deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+        }
+        else
+          // Here `neg_pinf_count == 1'.
+          if (neg_pinf_index != v
+              && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+            // Add the constraint `v - neg_pinf_index >= -neg_sum',
+            // i.e., `neg_pinf_index - v <= neg_sum'.
+            dbm[v][neg_pinf_index] = neg_sum;
+      }
+    }
+    break;
+
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `expr' into `sum',
+    // taking into account the sign of `denominator'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `expr'.
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+          i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const dimension_type i_dim = i.variable().space_dimension();
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_denom' is known to be
+      // positive, this amounts to rounding downwards, which is achieved
+      // by rounding upwards `minus_sc - denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+    break;
+
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+          i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const dimension_type i_dim = i.variable().space_dimension();
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be
+      // approximated towards zero. Since `sc_denom' is known to be positive,
+      // this amounts to rounding downwards, which is achieved by rounding
+      // upwards `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v
+          && expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Add the constraint `var == b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    add_dbm_constraint(v, 0, b, minus_denom);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.get(Variable(w - 1));
+    if (a == denominator || a == minus_denom) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // `expr' is of the form: a*v + b.
+        if (a == denominator) {
+          if (b == 0)
+            // The transformation is the identity function.
+            return;
+          else {
+            // Translate all the constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            PPL_DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_denom);
+            DB_Row<N>& dbm_v = dbm[v];
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, c, ROUND_UP);
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+            }
+            // Both shortest-path closure and reduction are preserved.
+          }
+        }
+        else {
+          // Here `a == -denominator'.
+          // Remove the binary constraints on `var'.
+          forget_binary_dbm_constraints(v);
+          // Swap the unary constraints on `var'.
+          using std::swap;
+          swap(dbm[v][0], dbm[0][v]);
+          // Shortest-path closure is not preserved.
+          reset_shortest_path_closed();
+          if (b != 0) {
+            // Translate the unary constraints on `var',
+            // adding or subtracting the value `b/denominator'.
+            PPL_DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_denom);
+            N& dbm_v0 = dbm[v][0];
+            add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            N& dbm_0v = dbm[0][v];
+            add_assign_r(dbm_0v, dbm_0v, d, ROUND_UP);
+          }
+        }
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+          add_dbm_constraint(v, w, b, minus_denom);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+          const N& dbm_0w = dbm[0][w];
+          if (!is_plus_infinity(dbm_0w)) {
+            // Add the constraint `v >= b/denominator - upper_w'.
+            PPL_DIRTY_TEMP(N, c);
+            div_round_up(c, b, minus_denom);
+            add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `expr' and `-expr'
+  // into `pos_sum' and `neg_sum', respectively, taking into account
+  // the sign of `denominator'.
+  // Note: approximating `-expr' from above and then negating the
+  // result is the same as approximating `expr' from below.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, pos_sum);
+  PPL_DIRTY_TEMP(N, neg_sum);
+  // Indices of the variables that are unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+  PPL_UNINITIALIZED(dimension_type, neg_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+  dimension_type neg_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+  assign_r(neg_sum, minus_sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+    const Coefficient& sc_i = *i;
+    const dimension_type i_dim = i.variable().space_dimension();
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i_dim];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i_dim][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i_dim;
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(sign_i < 0);
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i_dim][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+      // Approximating `-sc_expr'.
+      if (neg_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i_dim];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(neg_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++neg_pinf_count;
+          neg_pinf_index = i_dim;
+        }
+      }
+    }
+  }
+
+  // Remove all constraints on 'v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
+
+  // Exploit the lower approximation, if possible.
+  if (neg_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(neg_sum, neg_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the lower bound constraint, if meaningful.
+    if (neg_pinf_count == 0) {
+      // Add the constraint `v >= -neg_sum', i.e., `-v <= neg_sum'.
+      DB_Row<N>& dbm_v = dbm[v];
+      dbm_v[0] = neg_sum;
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, neg_sum);
+    }
+    else
+      // Here `neg_pinf_count == 1'.
+      if (neg_pinf_index != v
+          && sc_expr.get(Variable(neg_pinf_index - 1)) == sc_denom)
+        // Add the constraint `v - neg_pinf_index >= -neg_sum',
+        // i.e., `neg_pinf_index - v <= neg_sum'.
+        dbm[v][neg_pinf_index] = neg_sum;
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::affine_form_image(const Variable var,
+                    const Linear_Form< Interval<T, Interval_Info> >& lf) {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                    "BD_Shape<T>::affine_form_image(Variable, Linear_Form):"
+                    " T not a floating point type.");
+
+  // Dimension-compatibility checks.
+  // The dimension of `lf' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(var_id, l)", "l", lf);
+
+  // `var' should be one of the dimensions of the shape.
+  const dimension_type var_id = var.id() + 1;
+  if (space_dim < var_id)
+    throw_dimension_incompatible("affine_form_image(var_id, l)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lf': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `lf', if any.
+  dimension_type w_id = 0;
+  // Get information about the number of non-zero coefficients in `lf'.
+  for (dimension_type i = lf_space_dim; i-- > 0; )
+    if (lf.coefficient(Variable(i)) != 0) {
+      if (t++ == 1)
+        break;
+      else
+        w_id = i + 1;
+    }
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  const FP_Interval_Type& b = lf.inhomogeneous_term();
+
+  // Now we know the form of `lf':
+  // - If t == 0, then lf == b, with `b' a constant;
+  // - If t == 1, then lf == a*w + b, where `w' can be `v' or another
+  //   variable;
+  // - If t == 2, the linear form 'lf' is of the general form.
+
+  if (t == 0) {
+    inhomogeneous_affine_form_image(var_id, b);
+    PPL_ASSERT(OK());
+    return;
+  }
+  else if (t == 1) {
+    const FP_Interval_Type& w_coeff = lf.coefficient(Variable(w_id - 1));
+    if (w_coeff == 1 || w_coeff == -1) {
+      one_variable_affine_form_image(var_id, b, w_coeff, w_id, space_dim);
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+  two_variables_affine_form_image(var_id, lf, space_dim);
+  PPL_ASSERT(OK());
+}
+
+// Case 1: var = b, where b = [-b_mlb, b_ub]
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::inhomogeneous_affine_form_image(const dimension_type& var_id,
+                                  const Interval<T, Interval_Info>& b) {
+  PPL_DIRTY_TEMP(N, b_ub);
+  assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, b_mlb);
+  neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+  // Remove all constraints on `var'.
+  forget_all_dbm_constraints(var_id);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+    // Add the constraint `var >= lb && var <= ub'.
+    add_dbm_constraint(0, var_id, b_ub);
+    add_dbm_constraint(var_id, 0, b_mlb);
+    return;
+}
+
+// case 2: var = (+/-1) * w + [-b_mlb, b_ub], where `w' can be `var'
+// or another variable.
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::one_variable_affine_form_image(const dimension_type& var_id,
+                            const Interval<T, Interval_Info>& b,
+                            const Interval<T, Interval_Info>& w_coeff,
+                            const dimension_type& w_id,
+                            const dimension_type& space_dim) {
+
+  PPL_DIRTY_TEMP(N, b_ub);
+  assign_r(b_ub, b.upper(), ROUND_NOT_NEEDED);
+  PPL_DIRTY_TEMP(N, b_mlb);
+  neg_assign_r(b_mlb, b.lower(), ROUND_NOT_NEEDED);
+
+  // True if `w_coeff' is in [1, 1].
+  bool is_w_coeff_one = (w_coeff == 1);
+
+  if (w_id == var_id) {
+    // True if `b' is in [b_mlb, b_ub] and that is [0, 0].
+    bool is_b_zero = (b_mlb == 0 && b_ub == 0);
+    // Here `lf' is of the form: [+/-1, +/-1] * v + b.
+    if (is_w_coeff_one) {
+      if (is_b_zero)
+        // The transformation is the identity function.
+        return;
+      else {
+        // Translate all the constraints on `var' by adding the value
+        // `b_ub' or subtracting the value `b_mlb'.
+        DB_Row<N>& dbm_v = dbm[var_id];
+        for (dimension_type i = space_dim + 1; i-- > 0; ) {
+          N& dbm_vi = dbm_v[i];
+          add_assign_r(dbm_vi, dbm_vi, b_mlb, ROUND_UP);
+          N& dbm_iv = dbm[i][var_id];
+          add_assign_r(dbm_iv, dbm_iv, b_ub, ROUND_UP);
+        }
+        // Both shortest-path closure and reduction are preserved.
+      }
+    }
+    else {
+      // Here `w_coeff = [-1, -1].
+      // Remove the binary constraints on `var'.
+      forget_binary_dbm_constraints(var_id);
+      using std::swap;
+      swap(dbm[var_id][0], dbm[0][var_id]);
+      // Shortest-path closure is not preserved.
+      reset_shortest_path_closed();
+      if (!is_b_zero) {
+        // Translate the unary constraints on `var' by adding the value
+        // `b_ub' or subtracting the value `b_mlb'.
+        N& dbm_v0 = dbm[var_id][0];
+        add_assign_r(dbm_v0, dbm_v0, b_mlb, ROUND_UP);
+        N& dbm_0v = dbm[0][var_id];
+        add_assign_r(dbm_0v, dbm_0v, b_ub, ROUND_UP);
+      }
+    }
+  }
+  else {
+    // Here `w != var', so that `lf' is of the form
+    // [+/-1, +/-1] * w + b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(var_id);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    if (is_w_coeff_one) {
+      // Add the new constraints `var - w >= b_mlb'
+      // `and var - w <= b_ub'.
+      add_dbm_constraint(w_id, var_id, b_ub);
+      add_dbm_constraint(var_id, w_id, b_mlb);
+    }
+    else {
+      // We have to add the constraint `v + w == b', over-approximating it
+      // by computing lower and upper bounds for `w'.
+      const N& mlb_w = dbm[w_id][0];
+      if (!is_plus_infinity(mlb_w)) {
+        // Add the constraint `v <= ub - lb_w'.
+        add_assign_r(dbm[0][var_id], b_ub, mlb_w, ROUND_UP);
+        reset_shortest_path_closed();
+      }
+      const N& ub_w = dbm[0][w_id];
+      if (!is_plus_infinity(ub_w)) {
+        // Add the constraint `v >= lb - ub_w'.
+        add_assign_r(dbm[var_id][0], ub_w, b_mlb, ROUND_UP);
+        reset_shortest_path_closed();
+      }
+    }
+  }
+  return;
+}
+
+// General case.
+// Either t == 2, so that
+// lf == i_1*x_1 + i_2*x_2 + ... + i_n*x_n + b, where n >= 2,
+// or t == 1, lf == i*w + b, but i <> [+/-1, +/-1].
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>
+::two_variables_affine_form_image(const dimension_type& var_id,
+           const Linear_Form< Interval<T, Interval_Info> >& lf,
+                             const dimension_type& space_dim) {
+  // Shortest-path closure is maintained, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+
+  reset_shortest_path_closed();
+
+  Linear_Form< Interval<T, Interval_Info> > minus_lf(lf);
+  minus_lf.negate();
+
+  // Declare temporaries outside the loop.
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  // Update binary constraints on var FIRST.
+  for (dimension_type curr_var = 1; curr_var < var_id; ++curr_var) {
+    Variable current(curr_var - 1);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+  }
+  for (dimension_type curr_var = var_id + 1; curr_var <= space_dim;
+                                                      ++curr_var) {
+    Variable current(curr_var - 1);
+    linear_form_upper_bound(lf - current, upper_bound);
+    assign_r(dbm[curr_var][var_id], upper_bound, ROUND_NOT_NEEDED);
+    linear_form_upper_bound(minus_lf + current, upper_bound);
+    assign_r(dbm[var_id][curr_var], upper_bound, ROUND_NOT_NEEDED);
+  }
+  // Finally, update unary constraints on var.
+  PPL_DIRTY_TEMP(N, lf_ub);
+  linear_form_upper_bound(lf, lf_ub);
+  PPL_DIRTY_TEMP(N, minus_lf_ub);
+  linear_form_upper_bound(minus_lf, minus_lf_ub);
+  assign_r(dbm[0][var_id], lf_ub, ROUND_NOT_NEEDED);
+  assign_r(dbm[var_id][0], minus_lf_ub, ROUND_NOT_NEEDED);
+}
+
+template <typename T>
+template <typename Interval_Info>
+void BD_Shape<T>::refine_with_linear_form_inequality(
+                   const Linear_Form< Interval<T, Interval_Info> >& left,
+                   const Linear_Form< Interval<T, Interval_Info> >& right) {
+    // Check that T is a floating point type.
+    PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                    "Octagonal_Shape<T>::refine_with_linear_form_inequality:"
+                    " T not a floating point type.");
+
+    //We assume that the analyzer will not try to apply an unreachable filter.
+    PPL_ASSERT(!marked_empty());
+
+    // Dimension-compatibility checks.
+    // The dimensions of `left' and `right' should not be greater than the
+    // dimension of `*this'.
+    const dimension_type left_space_dim = left.space_dimension();
+    const dimension_type space_dim = space_dimension();
+    if (space_dim < left_space_dim)
+      throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "left", left);
+
+    const dimension_type right_space_dim = right.space_dimension();
+    if (space_dim < right_space_dim)
+      throw_dimension_incompatible(
+          "refine_with_linear_form_inequality(left, right)", "right", right);
+
+  // Number of non-zero coefficients in `left': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type left_t = 0;
+  // Variable-index of the last non-zero coefficient in `left', if any.
+  dimension_type left_w_id = 0;
+  // Number of non-zero coefficients in `right': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type right_t = 0;
+  // Variable-index of the last non-zero coefficient in `right', if any.
+  dimension_type right_w_id = 0;
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  // Get information about the number of non-zero coefficients in `left'.
+  for (dimension_type i = left_space_dim; i-- > 0; )
+    if (left.coefficient(Variable(i)) != 0) {
+      if (left_t++ == 1)
+        break;
+      else
+        left_w_id = i;
+    }
+
+  // Get information about the number of non-zero coefficients in `right'.
+  for (dimension_type i = right_space_dim; i-- > 0; )
+    if (right.coefficient(Variable(i)) != 0) {
+      if (right_t++ == 1)
+        break;
+      else
+        right_w_id = i;
+    }
+
+  const FP_Interval_Type& left_w_coeff =
+          left.coefficient(Variable(left_w_id));
+  const FP_Interval_Type& right_w_coeff =
+          right.coefficient(Variable(right_w_id));
+
+  if (left_t == 0) {
+    if (right_t == 0) {
+      // The constraint involves constants only. Ignore it: it is up to
+      // the analyzer to handle it.
+      PPL_ASSERT(OK());
+      return;
+    }
+    else if (right_w_coeff == 1 || right_w_coeff == -1) {
+      left_inhomogeneous_refine(right_t, right_w_id, left, right);
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+  else if (left_t == 1) {
+    if (left_w_coeff == 1 || left_w_coeff == -1) {
+      if (right_t == 0 || (right_w_coeff == 1 || right_w_coeff == -1)) {
+        left_one_var_refine(left_w_id, right_t, right_w_id, left, right);
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  general_refine(left_w_id, right_w_id, left, right);
+  PPL_ASSERT(OK());
+} // end of refine_with_linear_form_inequality
+
+template <typename T>
+template <typename U>
+void
+BD_Shape<T>
+::export_interval_constraints(U& dest) const {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim > dest.space_dimension())
+    throw std::invalid_argument(
+               "BD_Shape<T>::export_interval_constraints");
+
+  // Expose all the interval constraints.
+  shortest_path_closure_assign();
+
+  if (marked_empty()) {
+    dest.set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  PPL_DIRTY_TEMP(N, tmp);
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    // Set the upper bound.
+    const N& u = dbm_0[i+1];
+    if (!is_plus_infinity(u))
+      if (!dest.restrict_upper(i, u.raw_value()))
+        return;
+
+    // Set the lower bound.
+    const N& negated_l = dbm[i+1][0];
+    if (!is_plus_infinity(negated_l)) {
+      neg_assign_r(tmp, negated_l, ROUND_DOWN);
+      if (!dest.restrict_lower(i, tmp.raw_value()))
+        return;
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::left_inhomogeneous_refine(const dimension_type& right_t,
+                                       const dimension_type& right_w_id,
+                    const Linear_Form< Interval<T, Interval_Info> >& left,
+                    const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  if (right_t == 1) {
+    // The constraint has the form [a-, a+] <= [b-, b+] + [c-, c+] * x.
+    // Reduce it to the constraint +/-x <= b+ - a- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+      if (right_w_coeff == 1) {
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(right_w_id+1, 0, b_plus_minus_a_minus);
+        return;
+      }
+
+      if (right_w_coeff == -1) {
+        PPL_DIRTY_TEMP(N, b_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_b = right.inhomogeneous_term();
+        sub_assign_r(b_plus_minus_a_minus, right_b.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(0, right_w_id+1, b_plus_minus_a_minus);
+        return;
+      }
+    }
+} // end of left_inhomogeneous_refine
+
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::left_one_var_refine(const dimension_type& left_w_id,
+                      const dimension_type& right_t,
+                      const dimension_type& right_w_id,
+                const Linear_Form< Interval<T, Interval_Info> >& left,
+                const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+    if (right_t == 0) {
+      // The constraint has the form [b-, b+] + [c-, c+] * x <= [a-, a+]
+      // Reduce it to the constraint +/-x <= a+ - b- if [c-, c+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+        left.coefficient(Variable(left_w_id));
+
+      if (left_w_coeff == 1) {
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(0, left_w_id+1, a_plus_minus_b_minus);
+        return;
+      }
+
+      if (left_w_coeff == -1) {
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(left_w_id+1, 0, a_plus_minus_b_minus);
+        return;
+      }
+    }
+    else if (right_t == 1) {
+      // The constraint has the form
+      // [a-, a+] + [b-, b+] * x <= [c-, c+] + [d-, d+] * y.
+      // Reduce it to the constraint +/-x +/-y <= c+ - a-
+      // if [b-, b+] = +/-[1, 1] and [d-, d+] = +/-[1, 1].
+      const FP_Interval_Type& left_w_coeff =
+                              left.coefficient(Variable(left_w_id));
+
+      const FP_Interval_Type& right_w_coeff =
+                              right.coefficient(Variable(right_w_id));
+
+      bool is_left_coeff_one = (left_w_coeff == 1);
+      bool is_left_coeff_minus_one = (left_w_coeff == -1);
+      bool is_right_coeff_one = (right_w_coeff == 1);
+      bool is_right_coeff_minus_one = (right_w_coeff == -1);
+      if (left_w_id == right_w_id) {
+        if ((is_left_coeff_one && is_right_coeff_one)
+            ||
+            (is_left_coeff_minus_one && is_right_coeff_minus_one)) {
+          // Here we have an identity or a constants-only constraint.
+          return;
+        }
+        if (is_left_coeff_one && is_right_coeff_minus_one) {
+          // We fall back to a previous case.
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                            ROUND_UP);
+          add_dbm_constraint(0, left_w_id + 1, a_plus_minus_b_minus);
+          return;
+        }
+        if (is_left_coeff_minus_one && is_right_coeff_one) {
+          // We fall back to a previous case.
+          PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+          const FP_Interval_Type& left_b = left.inhomogeneous_term();
+          const FP_Interval_Type& right_a = right.inhomogeneous_term();
+          sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+          div_2exp_assign_r(a_plus_minus_b_minus, a_plus_minus_b_minus, 1,
+                            ROUND_UP);
+          add_dbm_constraint(right_w_id + 1, 0, a_plus_minus_b_minus);
+          return;
+        }
+      }
+      else if (is_left_coeff_minus_one && is_right_coeff_one) {
+        // over-approximate (if is it possible) the inequality
+        // -B + [b1, b2] <= A + [a1, a2] by adding the constraints
+        // -B <= upper_bound(A) + (a2 - b1) and
+        // -A <= upper_bound(B) + (a2 - b1)
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+        PPL_DIRTY_TEMP(N, ub);
+        ub = dbm[0][right_w_id + 1];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(left_w_id + 1, 0, ub);
+        }
+        ub = dbm[0][left_w_id + 1];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(right_w_id + 1, 0, ub);
+        }
+        return;
+      }
+      if (is_left_coeff_one && is_right_coeff_minus_one) {
+        // over-approximate (if is it possible) the inequality
+        // B + [b1, b2] <= -A + [a1, a2] by adding the constraints
+        // B <= upper_bound(-A) + (a2 - b1) and
+        // A <= upper_bound(-B) + (a2 - b1)
+        PPL_DIRTY_TEMP(N, a_plus_minus_b_minus);
+        const FP_Interval_Type& left_b = left.inhomogeneous_term();
+        const FP_Interval_Type& right_a = right.inhomogeneous_term();
+        sub_assign_r(a_plus_minus_b_minus, right_a.upper(), left_b.lower(),
+                       ROUND_UP);
+        PPL_DIRTY_TEMP(N, ub);
+        ub = dbm[right_w_id + 1][0];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(0, left_w_id + 1, ub);
+        }
+        ub = dbm[left_w_id + 1][0];
+        if (!is_plus_infinity(ub)) {
+          add_assign_r(ub, ub, a_plus_minus_b_minus, ROUND_UP);
+          add_dbm_constraint(0, right_w_id + 1, ub);
+        }
+            return;
+      }
+      if (is_left_coeff_one && is_right_coeff_one) {
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(right_w_id+1, left_w_id+1, c_plus_minus_a_minus);
+        return;
+      }
+      if (is_left_coeff_minus_one && is_right_coeff_minus_one) {
+        PPL_DIRTY_TEMP(N, c_plus_minus_a_minus);
+        const FP_Interval_Type& left_a = left.inhomogeneous_term();
+        const FP_Interval_Type& right_c = right.inhomogeneous_term();
+        sub_assign_r(c_plus_minus_a_minus, right_c.upper(), left_a.lower(),
+                     ROUND_UP);
+        add_dbm_constraint(left_w_id+1, right_w_id+1, c_plus_minus_a_minus);
+        return;
+      }
+    }
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>
+::general_refine(const dimension_type& left_w_id,
+                 const dimension_type& right_w_id,
+                 const Linear_Form< Interval<T, Interval_Info> >& left,
+                 const Linear_Form< Interval<T, Interval_Info> >& right) {
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+  Linear_Form<FP_Interval_Type> right_minus_left(right);
+  right_minus_left -= left;
+
+  // Declare temporaries outside of the loop.
+  PPL_DIRTY_TEMP(N, low_coeff);
+  PPL_DIRTY_TEMP(N, high_coeff);
+  PPL_DIRTY_TEMP(N, upper_bound);
+
+  dimension_type max_w_id = std::max(left_w_id, right_w_id);
+
+  for (dimension_type first_v = 0; first_v < max_w_id; ++first_v) {
+    for (dimension_type second_v = first_v+1;
+         second_v <= max_w_id; ++second_v) {
+      const FP_Interval_Type& lfv_coefficient =
+        left.coefficient(Variable(first_v));
+      const FP_Interval_Type& lsv_coefficient =
+        left.coefficient(Variable(second_v));
+      const FP_Interval_Type& rfv_coefficient =
+        right.coefficient(Variable(first_v));
+      const FP_Interval_Type& rsv_coefficient =
+        right.coefficient(Variable(second_v));
+      // We update the constraints only when both variables appear in at
+      // least one argument.
+      bool do_update = false;
+      assign_r(low_coeff, lfv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, lfv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0) {
+        assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0)
+          do_update = true;
+        else {
+          assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+        }
+      }
+      else {
+        assign_r(low_coeff, rfv_coefficient.lower(), ROUND_NOT_NEEDED);
+        assign_r(high_coeff, rfv_coefficient.upper(), ROUND_NOT_NEEDED);
+        if (low_coeff != 0 || high_coeff != 0) {
+          assign_r(low_coeff, lsv_coefficient.lower(), ROUND_NOT_NEEDED);
+          assign_r(high_coeff, lsv_coefficient.upper(), ROUND_NOT_NEEDED);
+          if (low_coeff != 0 || high_coeff != 0)
+            do_update = true;
+          else {
+            assign_r(low_coeff, rsv_coefficient.lower(), ROUND_NOT_NEEDED);
+            assign_r(high_coeff, rsv_coefficient.upper(), ROUND_NOT_NEEDED);
+            if (low_coeff != 0 || high_coeff != 0)
+              do_update = true;
+          }
+        }
+      }
+
+      if (do_update) {
+        Variable first(first_v);
+        Variable second(second_v);
+        dimension_type n_first_var = first_v +1 ;
+        dimension_type n_second_var = second_v + 1;
+        linear_form_upper_bound(right_minus_left - first + second,
+                                upper_bound);
+        add_dbm_constraint(n_first_var, n_second_var, upper_bound);
+        linear_form_upper_bound(right_minus_left + first - second,
+                                upper_bound);
+        add_dbm_constraint(n_second_var, n_first_var, upper_bound);
+      }
+    }
+  }
+
+  // Finally, update the unary constraints.
+  for (dimension_type v = 0; v < max_w_id; ++v) {
+    const FP_Interval_Type& lv_coefficient =
+      left.coefficient(Variable(v));
+    const FP_Interval_Type& rv_coefficient =
+      right.coefficient(Variable(v));
+    // We update the constraints only if v appears in at least one of the
+    // two arguments.
+    bool do_update = false;
+    assign_r(low_coeff, lv_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(high_coeff, lv_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (low_coeff != 0 || high_coeff != 0)
+      do_update = true;
+    else {
+      assign_r(low_coeff, rv_coefficient.lower(), ROUND_NOT_NEEDED);
+      assign_r(high_coeff, rv_coefficient.upper(), ROUND_NOT_NEEDED);
+      if (low_coeff != 0 || high_coeff != 0)
+        do_update = true;
+    }
+
+    if (do_update) {
+      Variable var(v);
+      dimension_type n_var = v + 1;
+      linear_form_upper_bound(right_minus_left + var, upper_bound);
+      add_dbm_constraint(0, n_var, upper_bound);
+      linear_form_upper_bound(right_minus_left - var, upper_bound);
+      add_dbm_constraint(n_var, 0, upper_bound);
+    }
+  }
+
+}
+
+template <typename T>
+template <typename Interval_Info>
+void
+BD_Shape<T>::
+linear_form_upper_bound(const Linear_Form< Interval<T, Interval_Info> >& lf,
+                        N& result) const {
+
+  // Check that T is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<T>::is_exact,
+                     "BD_Shape<T>::linear_form_upper_bound:"
+                     " T not a floating point type.");
+
+  const dimension_type lf_space_dimension = lf.space_dimension();
+  PPL_ASSERT(lf_space_dimension <= space_dimension());
+
+  typedef Interval<T, Interval_Info> FP_Interval_Type;
+
+  PPL_DIRTY_TEMP(N, curr_lb);
+  PPL_DIRTY_TEMP(N, curr_ub);
+  PPL_DIRTY_TEMP(N, curr_var_ub);
+  PPL_DIRTY_TEMP(N, curr_minus_var_ub);
+
+  PPL_DIRTY_TEMP(N, first_comparison_term);
+  PPL_DIRTY_TEMP(N, second_comparison_term);
+
+  PPL_DIRTY_TEMP(N, negator);
+
+  assign_r(result, lf.inhomogeneous_term().upper(), ROUND_NOT_NEEDED);
+
+  for (dimension_type curr_var = 0, n_var = 0; curr_var < lf_space_dimension;
+       ++curr_var) {
+    n_var = curr_var + 1;
+    const FP_Interval_Type&
+      curr_coefficient = lf.coefficient(Variable(curr_var));
+    assign_r(curr_lb, curr_coefficient.lower(), ROUND_NOT_NEEDED);
+    assign_r(curr_ub, curr_coefficient.upper(), ROUND_NOT_NEEDED);
+    if (curr_lb != 0 || curr_ub != 0) {
+      assign_r(curr_var_ub, dbm[0][n_var], ROUND_NOT_NEEDED);
+      neg_assign_r(curr_minus_var_ub, dbm[n_var][0], ROUND_NOT_NEEDED);
+      // Optimize the most commons cases: curr = +/-[1, 1].
+      if (curr_lb == 1 && curr_ub == 1) {
+        add_assign_r(result, result, std::max(curr_var_ub, curr_minus_var_ub),
+                     ROUND_UP);
+      }
+      else if (curr_lb == -1 && curr_ub == -1) {
+        neg_assign_r(negator, std::min(curr_var_ub, curr_minus_var_ub),
+                     ROUND_NOT_NEEDED);
+        add_assign_r(result, result, negator, ROUND_UP);
+      }
+      else {
+        // Next addend will be the maximum of four quantities.
+        assign_r(first_comparison_term, 0, ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(first_comparison_term, curr_var_ub, curr_ub,
+                         ROUND_UP);
+        add_mul_assign_r(second_comparison_term, curr_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_ub,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+        assign_r(second_comparison_term, 0, ROUND_NOT_NEEDED);
+        add_mul_assign_r(second_comparison_term, curr_minus_var_ub, curr_lb,
+                         ROUND_UP);
+        assign_r(first_comparison_term, std::max(first_comparison_term,
+                                                 second_comparison_term),
+                 ROUND_NOT_NEEDED);
+
+        add_assign_r(result, result, first_comparison_term, ROUND_UP);
+      }
+    }
+  }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_preimage(const Variable var,
+                             const Linear_Expression& expr,
+                             Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+
+  // `var' should be one of the dimensions of
+  // the bounded difference shapes.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", var.id());
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type j = expr.last_nonzero();
+
+  if (j != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, j))
+      ++t;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr = b, with `b' a constant;
+  // - If t == 1, then expr = a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t > 1, the `expr' is of the general form.
+  if (t == 0) {
+    // Case 1: expr = n; remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.get(Variable(j - 1));
+    if (a == denominator || a == -denominator) {
+      // Case 2: expr = a*w + b, with a = +/- denominator.
+      if (j == var.space_dimension())
+        // Apply affine_image() on the inverse of this transformation.
+        affine_image(var, denominator*var - b, a);
+      else {
+        // `expr == a*w + b', where `w != v'.
+        // Remove all constraints on `var'.
+        forget_all_dbm_constraints(v);
+        // Shortest-path closure is preserved, but not reduction.
+        if (marked_shortest_path_reduced())
+          reset_shortest_path_reduced();
+        PPL_ASSERT(OK());
+      }
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr = a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t = 1, expr = a*w + b, but a <> +/- denominator.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    // The transformation is invertible.
+    Linear_Expression inverse((expr_v + denominator)*var);
+    inverse -= expr;
+    affine_image(var, inverse, expr_v);
+  }
+  else {
+    // Transformation not invertible: all constraints on `var' are lost.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > bds_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (bds_space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (bds_space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = ub_expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `ub_expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `ub_expr', if any.
+  dimension_type w = ub_expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!ub_expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Now we know the form of `ub_expr':
+  // - If t == 0, then ub_expr == b, with `b' a constant;
+  // - If t == 1, then ub_expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `ub_expr' is of the general form.
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: ub_expr == b.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    // Add the constraint `var <= b/denominator'.
+    add_dbm_constraint(0, v, b, denominator);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `ub_expr'.
+    const Coefficient& a = ub_expr.get(Variable(w - 1));
+    if (a == denominator || a == minus_denom) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      if (w == v) {
+        // Here `var' occurs in `ub_expr'.
+        // To ease the computation, we add an additional dimension.
+        const Variable new_var(bds_space_dim);
+        add_space_dimensions_and_embed(1);
+        // Constrain the new dimension to be equal to `ub_expr'.
+        affine_image(new_var, ub_expr, denominator);
+        // NOTE: enforce shortest-path closure for precision.
+        shortest_path_closure_assign();
+        PPL_ASSERT(!marked_empty());
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        // Now apply the affine upper bound, as recorded in `new_var'.
+        add_constraint(var <= new_var);
+        // Remove the temporarily added dimension.
+        remove_higher_space_dimensions(bds_space_dim);
+        return;
+      }
+      else {
+        // Here `w != v', so that `expr' is of the form
+        // +/-denominator * w + b.
+        // Apply the affine lower bound.
+        generalized_affine_image(var,
+                                 GREATER_OR_EQUAL,
+                                 lb_expr,
+                                 denominator);
+        if (a == denominator) {
+          // Add the new constraint `v - w == b/denominator'.
+          add_dbm_constraint(w, v, b, denominator);
+        }
+        else {
+          // Here a == -denominator, so that we should be adding
+          // the constraint `v + w == b/denominator'.
+          // Approximate it by computing lower and upper bounds for `w'.
+          const N& dbm_w0 = dbm[w][0];
+          if (!is_plus_infinity(dbm_w0)) {
+            // Add the constraint `v <= b/denominator - lower_w'.
+            PPL_DIRTY_TEMP(N, d);
+            div_round_up(d, b, denominator);
+            add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+            reset_shortest_path_closed();
+          }
+        }
+        PPL_ASSERT(OK());
+        return;
+      }
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // ub_expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, ub_expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `var' and add back
+  // constraints providing upper and lower bounds for `var'.
+
+  // Compute upper approximations for `ub_expr' into `pos_sum'
+  // taking into account the sign of `denominator'.
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -ub_expr;
+  const Linear_Expression& sc_expr = is_sc ? ub_expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, pos_sum);
+  // Index of the variable that are unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pos_pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pos_pinf_count = 0;
+
+  // Approximate the inhomogeneous term.
+  assign_r(pos_sum, sc_b, ROUND_UP);
+
+  // Approximate the homogeneous part of `sc_expr'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  // Speculative allocation of temporaries to be used in the following loop.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+  // Note: indices above `w' can be disregarded, as they all have
+  // a zero coefficient in `sc_expr'.
+  for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+    const Coefficient& sc_i = *i;
+    const dimension_type i_dim = i.variable().space_dimension();
+    const int sign_i = sgn(sc_i);
+    if (sign_i > 0) {
+      assign_r(coeff_i, sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_i = dbm_0[i_dim];
+        if (!is_plus_infinity(up_approx_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+    }
+    else {
+      PPL_ASSERT(sign_i < 0);
+      neg_assign(minus_sc_i, sc_i);
+      // Note: using temporary named `coeff_i' to store -coeff_i.
+      assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      // Approximating `sc_expr'.
+      if (pos_pinf_count <= 1) {
+        const N& up_approx_minus_i = dbm[i_dim][0];
+        if (!is_plus_infinity(up_approx_minus_i))
+          add_mul_assign_r(pos_sum, coeff_i, up_approx_minus_i, ROUND_UP);
+        else {
+          ++pos_pinf_count;
+          pos_pinf_index = i_dim;
+        }
+      }
+    }
+  }
+  // Apply the affine lower bound.
+  generalized_affine_image(var,
+                           GREATER_OR_EQUAL,
+                           lb_expr,
+                           denominator);
+  // Return immediately if no approximation could be computed.
+  if (pos_pinf_count > 1) {
+    return;
+  }
+
+  // In the following, shortest-path closure will be definitely lost.
+  reset_shortest_path_closed();
+
+  // Exploit the upper approximation, if possible.
+  if (pos_pinf_count <= 1) {
+    // Compute quotient (if needed).
+    if (sc_denom != 1) {
+      // Before computing quotients, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(pos_sum, pos_sum, down_sc_denom, ROUND_UP);
+    }
+    // Add the upper bound constraint, if meaningful.
+    if (pos_pinf_count == 0) {
+      // Add the constraint `v <= pos_sum'.
+      dbm[0][v] = pos_sum;
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, pos_sum);
+    }
+    else
+      // Here `pos_pinf_count == 1'.
+      if (pos_pinf_index != v
+          && sc_expr.get(Variable(pos_pinf_index - 1)) == sc_denom)
+        // Add the constraint `v - pos_pinf_index <= pos_sum'.
+        dbm[pos_pinf_index][v] = pos_sum;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the BD_Shape.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  if (ub_expr.coefficient(var) == 0) {
+    refine(var, LESS_OR_EQUAL, ub_expr, denominator);
+    generalized_affine_preimage(var, GREATER_OR_EQUAL,
+                                lb_expr, denominator);
+    return;
+  }
+  if (lb_expr.coefficient(var) == 0) {
+    refine(var, GREATER_OR_EQUAL, lb_expr, denominator);
+    generalized_affine_preimage(var, LESS_OR_EQUAL,
+                                ub_expr, denominator);
+    return;
+  }
+
+  const Coefficient& lb_expr_v = lb_expr.coefficient(var);
+  // Here `var' occurs in `lb_expr' and `ub_expr'.
+  // To ease the computation, we add an additional dimension.
+  const Variable new_var(space_dim);
+  add_space_dimensions_and_embed(1);
+  const Linear_Expression lb_inverse
+    = lb_expr - (lb_expr_v + denominator)*var;
+  PPL_DIRTY_TEMP_COEFFICIENT(lb_inverse_denom);
+  neg_assign(lb_inverse_denom, lb_expr_v);
+  affine_image(new_var, lb_inverse, lb_inverse_denom);
+  shortest_path_closure_assign();
+  PPL_ASSERT(!marked_empty());
+  generalized_affine_preimage(var, LESS_OR_EQUAL,
+                              ub_expr, denominator);
+  if (sgn(denominator) == sgn(lb_inverse_denom))
+    add_constraint(var >= new_var);
+  else
+    add_constraint(var <= new_var);
+  // Remove the temporarily added dimension.
+  remove_higher_space_dimensions(space_dim);
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Variable var,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& expr,
+                                      Coefficient_traits::const_reference
+                                      denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine image computation.
+    affine_image(var, expr, denominator);
+    return;
+  }
+
+  // The image of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Coefficient& b = expr.inhomogeneous_term();
+  // Number of non-zero coefficients in `expr': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t = 0;
+  // Index of the last non-zero coefficient in `expr', if any.
+  dimension_type w = expr.last_nonzero();
+
+  if (w != 0) {
+    ++t;
+    if (!expr.all_zeroes(1, w))
+      ++t;
+  }
+
+  // Now we know the form of `expr':
+  // - If t == 0, then expr == b, with `b' a constant;
+  // - If t == 1, then expr == a*w + b, where `w' can be `v' or another
+  //   variable; in this second case we have to check whether `a' is
+  //   equal to `denominator' or `-denominator', since otherwise we have
+  //   to fall back on the general form;
+  // - If t == 2, the `expr' is of the general form.
+  DB_Row<N>& dbm_0 = dbm[0];
+  DB_Row<N>& dbm_v = dbm[v];
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_denom);
+  neg_assign(minus_denom, denominator);
+
+  if (t == 0) {
+    // Case 1: expr == b.
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Both shortest-path closure and reduction are lost.
+    reset_shortest_path_closed();
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      // Add the constraint `var <= b/denominator'.
+      add_dbm_constraint(0, v, b, denominator);
+      break;
+    case GREATER_OR_EQUAL:
+      // Add the constraint `var >= b/denominator',
+      // i.e., `-var <= -b/denominator',
+      add_dbm_constraint(v, 0, b, minus_denom);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  if (t == 1) {
+    // Value of the one and only non-zero coefficient in `expr'.
+    const Coefficient& a = expr.get(Variable(w - 1));
+    if (a == denominator || a == minus_denom) {
+      // Case 2: expr == a*w + b, with a == +/- denominator.
+      PPL_DIRTY_TEMP(N, d);
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        div_round_up(d, b, denominator);
+        if (w == v) {
+          // `expr' is of the form: a*v + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `v - w <= dbm_wv'
+            // into the constraint `v - w <= dbm_wv + b/denominator';
+            // forget each constraint `w - v <= dbm_vw'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_iv = dbm[i][v];
+              add_assign_r(dbm_iv, dbm_iv, d, ROUND_UP);
+              assign_r(dbm_v[i], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_v0 + b/denominator'.
+            N& dbm_v0 = dbm_v[0];
+            add_assign_r(dbm_0[v], dbm_v0, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_v0, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w <= b/denominator'.
+            add_dbm_constraint(w, v, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v <= b/denominator - w'.
+            // Approximate it by computing a lower bound for `w'.
+            const N& dbm_w0 = dbm[w][0];
+            if (!is_plus_infinity(dbm_w0)) {
+              // Add the constraint `v <= b/denominator - lb_w'.
+              add_assign_r(dbm_0[v], d, dbm_w0, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
+
+      case GREATER_OR_EQUAL:
+        div_round_up(d, b, minus_denom);
+        if (w == v) {
+          // `expr' is of the form: a*w + b.
+          // Shortest-path closure and reduction are not preserved.
+          reset_shortest_path_closed();
+          if (a == denominator) {
+            // Translate each constraint `w - v <= dbm_vw'
+            // into the constraint `w - v <= dbm_vw - b/denominator';
+            // forget each constraint `v - w <= dbm_wv'.
+            for (dimension_type i = space_dim + 1; i-- > 0; ) {
+              N& dbm_vi = dbm_v[i];
+              add_assign_r(dbm_vi, dbm_vi, d, ROUND_UP);
+              assign_r(dbm[i][v], PLUS_INFINITY, ROUND_NOT_NEEDED);
+            }
+          }
+          else {
+            // Here `a == -denominator'.
+            // Translate the constraint `0 - v <= dbm_v0'
+            // into the constraint `0 - v <= dbm_0v - b/denominator'.
+            N& dbm_0v = dbm_0[v];
+            add_assign_r(dbm_v[0], dbm_0v, d, ROUND_UP);
+            // Forget all the other constraints on `v'.
+            assign_r(dbm_0v, PLUS_INFINITY, ROUND_NOT_NEEDED);
+            forget_binary_dbm_constraints(v);
+          }
+        }
+        else {
+          // Here `w != v', so that `expr' is of the form
+          // +/-denominator * w + b, with `w != v'.
+          // Remove all constraints on `v'.
+          forget_all_dbm_constraints(v);
+          // Shortest-path closure is preserved, but not reduction.
+          if (marked_shortest_path_reduced())
+            reset_shortest_path_reduced();
+          if (a == denominator)
+            // Add the new constraint `v - w >= b/denominator',
+            // i.e., `w - v <= -b/denominator'.
+            add_dbm_constraint(v, w, d);
+          else {
+            // Here a == -denominator, so that we should be adding
+            // the constraint `v >= -w + b/denominator',
+            // i.e., `-v <= w - b/denominator'.
+            // Approximate it by computing an upper bound for `w'.
+            const N& dbm_0w = dbm_0[w];
+            if (!is_plus_infinity(dbm_0w)) {
+              // Add the constraint `-v <= ub_w - b/denominator'.
+              add_assign_r(dbm_v[0], dbm_0w, d, ROUND_UP);
+              // Shortest-path closure is not preserved.
+              reset_shortest_path_closed();
+            }
+          }
+        }
+        break;
+
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  // General case.
+  // Either t == 2, so that
+  // expr == a_1*x_1 + a_2*x_2 + ... + a_n*x_n + b, where n >= 2,
+  // or t == 1, expr == a*w + b, but a <> +/- denominator.
+  // We will remove all the constraints on `v' and add back
+  // a constraint providing an upper or a lower bound for `v'
+  // (depending on `relsym').
+  const bool is_sc = (denominator > 0);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_b);
+  neg_assign(minus_b, b);
+  const Coefficient& sc_b = is_sc ? b : minus_b;
+  const Coefficient& minus_sc_b = is_sc ? minus_b : b;
+  const Coefficient& sc_denom = is_sc ? denominator : minus_denom;
+  const Coefficient& minus_sc_denom = is_sc ? minus_denom : denominator;
+  // NOTE: here, for optimization purposes, `minus_expr' is only assigned
+  // when `denominator' is negative. Do not use it unless you are sure
+  // it has been correctly assigned.
+  Linear_Expression minus_expr;
+  if (!is_sc)
+    minus_expr = -expr;
+  const Linear_Expression& sc_expr = is_sc ? expr : minus_expr;
+
+  PPL_DIRTY_TEMP(N, sum);
+  // Index of variable that is unbounded in `this->dbm'.
+  PPL_UNINITIALIZED(dimension_type, pinf_index);
+  // Number of unbounded variables found.
+  dimension_type pinf_count = 0;
+
+  // Speculative allocation of temporaries to be used in the following loops.
+  PPL_DIRTY_TEMP(N, coeff_i);
+  PPL_DIRTY_TEMP_COEFFICIENT(minus_sc_i);
+
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    // Compute an upper approximation for `sc_expr' into `sum'.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `sc_expr'.
+    // Note: indices above `w' can be disregarded, as they all have
+    // a zero coefficient in `sc_expr'.
+    PPL_ASSERT(w != 0);
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const dimension_type i_dim = i.variable().space_dimension();
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      // Choose carefully: we are approximating `sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm_0[i_dim] : dbm[i_dim][0];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `v'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      PPL_ASSERT(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v <= sum'.
+      add_dbm_constraint(0, v, sum);
+      // Deduce constraints of the form `v - u', where `u != v'.
+      deduce_v_minus_u_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index <= sum'.
+        add_dbm_constraint(pinf_index, v, sum);
+    break;
+
+  case GREATER_OR_EQUAL:
+    // Compute an upper approximation for `-sc_expr' into `sum'.
+    // Note: approximating `-sc_expr' from above and then negating the
+    // result is the same as approximating `sc_expr' from below.
+
+    // Approximate the inhomogeneous term.
+    assign_r(sum, minus_sc_b, ROUND_UP);
+    // Approximate the homogeneous part of `-sc_expr'.
+    for (Linear_Expression::const_iterator i = sc_expr.begin(),
+        i_end = sc_expr.lower_bound(Variable(w)); i != i_end; ++i) {
+      const Coefficient& sc_i = *i;
+      const int sign_i = sgn(sc_i);
+      PPL_ASSERT(sign_i != 0);
+      const dimension_type i_dim = i.variable().space_dimension();
+      // Choose carefully: we are approximating `-sc_expr'.
+      const N& approx_i = (sign_i > 0) ? dbm[i_dim][0] : dbm_0[i_dim];
+      if (is_plus_infinity(approx_i)) {
+        if (++pinf_count > 1)
+          break;
+        pinf_index = i_dim;
+        continue;
+      }
+      if (sign_i > 0)
+        assign_r(coeff_i, sc_i, ROUND_UP);
+      else {
+        neg_assign(minus_sc_i, sc_i);
+        assign_r(coeff_i, minus_sc_i, ROUND_UP);
+      }
+      add_mul_assign_r(sum, coeff_i, approx_i, ROUND_UP);
+    }
+
+    // Remove all constraints on `var'.
+    forget_all_dbm_constraints(v);
+    // Shortest-path closure is preserved, but not reduction.
+    if (marked_shortest_path_reduced())
+      reset_shortest_path_reduced();
+    // Return immediately if no approximation could be computed.
+    if (pinf_count > 1) {
+      PPL_ASSERT(OK());
+      return;
+    }
+
+    // Divide by the (sign corrected) denominator (if needed).
+    if (sc_denom != 1) {
+      // Before computing the quotient, the denominator should be approximated
+      // towards zero. Since `sc_denom' is known to be positive, this amounts to
+      // rounding downwards, which is achieved as usual by rounding upwards
+      // `minus_sc_denom' and negating again the result.
+      PPL_DIRTY_TEMP(N, down_sc_denom);
+      assign_r(down_sc_denom, minus_sc_denom, ROUND_UP);
+      neg_assign_r(down_sc_denom, down_sc_denom, ROUND_UP);
+      div_assign_r(sum, sum, down_sc_denom, ROUND_UP);
+    }
+
+    if (pinf_count == 0) {
+      // Add the constraint `v >= -sum', i.e., `-v <= sum'.
+      add_dbm_constraint(v, 0, sum);
+      // Deduce constraints of the form `u - v', where `u != v'.
+      deduce_u_minus_v_bounds(v, w, sc_expr, sc_denom, sum);
+    }
+    else if (pinf_count == 1)
+      if (pinf_index != v && expr.get(Variable(pinf_index - 1)) == denominator)
+        // Add the constraint `v - pinf_index >= -sum',
+        // i.e., `pinf_index - v <= sum'.
+        add_dbm_constraint(v, pinf_index, sum);
+    break;
+
+  default:
+    // We already dealt with the other cases.
+    PPL_UNREACHABLE;
+    break;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_image(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // The image of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    --j_lhs;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In principle, it is sufficient to add the constraint `lhs relsym rhs'.
+    // Note that this constraint is a bounded difference if `t_rhs <= 1'
+    // or `t_rhs > 1' and `rhs == a*v - a*w + b_rhs'. If `rhs' is of a
+    // more general form, it will be simply ignored.
+    // TODO: if it is not a bounded difference, should we compute
+    // approximations for this constraint?
+    switch (relsym) {
+    case LESS_OR_EQUAL:
+      refine_no_check(lhs <= rhs);
+      break;
+    case EQUAL:
+      refine_no_check(lhs == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_no_check(lhs >= rhs);
+      break;
+    default:
+      // We already dealt with the other cases.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine images for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_image(v, new_relsym, expr, denom);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+    }
+    else {
+      // Some variables in `lhs' also occur in `rhs'.
+
+#if 1 // Simplified computation (see the TODO note below).
+
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+
+#else // Currently unnecessarily complex computation.
+
+      // More accurate computation that is worth doing only if
+      // the following TODO note is accurately dealt with.
+
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `rhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, rhs);
+      // Existentially quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // TODO: each one of the following constraints is definitely NOT
+      // a bounded differences (since it has 3 variables at least).
+      // Thus, the method refine_no_check() will simply ignore it.
+      // Should we compute approximations for this constraint?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= new_var);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == new_var);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= new_var);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Variable var,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "d == 0");
+
+  // Dimension-compatibility checks.
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+
+  // `var' should be one of the dimensions of the BDS.
+  const dimension_type v = var.id() + 1;
+  if (v > space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 var.id());
+
+  // The relation symbol cannot be a strict relation symbol.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  if (relsym == EQUAL) {
+    // The relation symbol is "=":
+    // this is just an affine preimage computation.
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // The preimage of an empty BDS is empty too.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& expr_v = expr.coefficient(var);
+  if (expr_v != 0) {
+    const Relation_Symbol reversed_relsym = (relsym == LESS_OR_EQUAL)
+      ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+    const Linear_Expression inverse
+      = expr - (expr_v + denominator)*var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denom);
+    neg_assign(inverse_denom, expr_v);
+    const Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denom)) ? relsym : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse, inverse_denom);
+    return;
+  }
+
+  refine(var, relsym, expr, denominator);
+  // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+  if (is_empty())
+    return;
+  // ...  otherwise, since the relation was not invertible,
+  // we just forget all constraints on `v'.
+  forget_all_dbm_constraints(v);
+  // Shortest-path closure is preserved, but not reduction.
+  if (marked_shortest_path_reduced())
+    reset_shortest_path_reduced();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                         const Relation_Symbol relsym,
+                                         const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type bds_space_dim = space_dimension();
+  const dimension_type lhs_space_dim = lhs.space_dimension();
+  if (bds_space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e1", lhs);
+
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (bds_space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(e1, r, e2)",
+                                 "e2", rhs);
+
+  // Strict relation symbols are not admitted for BDSs.
+  if (relsym == LESS_THAN || relsym == GREATER_THAN)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is a strict relation symbol");
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // The preimage of an empty BDS is empty.
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  // Number of non-zero coefficients in `lhs': will be set to
+  // 0, 1, or 2, the latter value meaning any value greater than 1.
+  dimension_type t_lhs = 0;
+  // Index of the last non-zero coefficient in `lhs', if any.
+  dimension_type j_lhs = lhs.last_nonzero();
+
+  if (j_lhs != 0) {
+    ++t_lhs;
+    if (!lhs.all_zeroes(1, j_lhs))
+      ++t_lhs;
+    --j_lhs;
+  }
+
+  const Coefficient& b_lhs = lhs.inhomogeneous_term();
+
+  if (t_lhs == 0) {
+    // `lhs' is a constant.
+    // In this case, preimage and image happen to be the same.
+    generalized_affine_image(lhs, relsym, rhs);
+    return;
+  }
+  else if (t_lhs == 1) {
+    // Here `lhs == a_lhs * v + b_lhs'.
+    // Independently from the form of `rhs', we can exploit the
+    // method computing generalized affine preimages for a single variable.
+    Variable v(j_lhs);
+    // Compute a sign-corrected relation symbol.
+    const Coefficient& denom = lhs.coefficient(v);
+    Relation_Symbol new_relsym = relsym;
+    if (denom < 0) {
+      if (relsym == LESS_OR_EQUAL)
+        new_relsym = GREATER_OR_EQUAL;
+      else if (relsym == GREATER_OR_EQUAL)
+        new_relsym = LESS_OR_EQUAL;
+    }
+    Linear_Expression expr = rhs - b_lhs;
+    generalized_affine_preimage(v, new_relsym, expr, denom);
+  }
+  else {
+    // Here `lhs' is of the general form, having at least two variables.
+    // Compute the set of variables occurring in `lhs'.
+    std::vector<Variable> lhs_vars;
+    for (Linear_Expression::const_iterator i = lhs.begin(), i_end = lhs.end();
+          i != i_end; ++i)
+      lhs_vars.push_back(i.variable());
+
+    const dimension_type num_common_dims = std::min(lhs_space_dim, rhs_space_dim);
+    if (!lhs.have_a_common_variable(rhs, Variable(0), Variable(num_common_dims))) {
+      // `lhs' and `rhs' variables are disjoint.
+
+      // Constrain the left hand side expression so that it is related to
+      // the right hand side expression as dictated by `relsym'.
+      // TODO: if the following constraint is NOT a bounded difference,
+      // it will be simply ignored. Should we compute approximations for it?
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(lhs <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(lhs == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(lhs >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+
+      // If the shrunk BD_Shape is empty, its preimage is empty too; ...
+      if (is_empty())
+        return;
+      // Existentially quantify all variables in the lhs.
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+    }
+    else {
+
+      // Some variables in `lhs' also occur in `rhs'.
+      // To ease the computation, we add an additional dimension.
+      const Variable new_var(bds_space_dim);
+      add_space_dimensions_and_embed(1);
+      // Constrain the new dimension to be equal to `lhs'.
+      // NOTE: calling affine_image() instead of refine_no_check()
+      // ensures some approximation is tried even when the constraint
+      // is not a bounded difference.
+      affine_image(new_var, lhs);
+      // Existentiallly quantify all variables in the lhs.
+      // NOTE: enforce shortest-path closure for precision.
+      shortest_path_closure_assign();
+      PPL_ASSERT(!marked_empty());
+      for (dimension_type i = lhs_vars.size(); i-- > 0; )
+        forget_all_dbm_constraints(lhs_vars[i].id() + 1);
+      // Constrain the new dimension so that it is related to
+      // the left hand side as dictated by `relsym'.
+      // Note: if `rhs == a_rhs*v + b_rhs' where `a_rhs' is in {0, 1},
+      // then one of the following constraints will be added,
+      // since it is a bounded difference. Else the method
+      // refine_no_check() will ignore it, because the
+      // constraint is NOT a bounded difference.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        refine_no_check(new_var <= rhs);
+        break;
+      case EQUAL:
+        refine_no_check(new_var == rhs);
+        break;
+      case GREATER_OR_EQUAL:
+        refine_no_check(new_var >= rhs);
+        break;
+      default:
+        // We already dealt with the other cases.
+        PPL_UNREACHABLE;
+        break;
+      }
+      // Remove the temporarily added dimension.
+      remove_higher_space_dimensions(bds_space_dim);
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  if (marked_shortest_path_reduced()) {
+    // Disregard redundant constraints.
+    cs = minimized_constraints();
+    return cs;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(a);
+  PPL_DIRTY_TEMP_COEFFICIENT(b);
+  // Go through all the unary constraints in `dbm'.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type j = 1; j <= space_dim; ++j) {
+    const Variable x(j-1);
+    const N& dbm_0j = dbm_0[j];
+    const N& dbm_j0 = dbm[j][0];
+    if (is_additive_inverse(dbm_j0, dbm_0j)) {
+      // We have a unary equality constraint.
+      numer_denom(dbm_0j, b, a);
+      cs.insert(a*x == b);
+    }
+    else {
+      // We have 0, 1 or 2 unary inequality constraints.
+      if (!is_plus_infinity(dbm_0j)) {
+        numer_denom(dbm_0j, b, a);
+        cs.insert(a*x <= b);
+      }
+      if (!is_plus_infinity(dbm_j0)) {
+        numer_denom(dbm_j0, b, a);
+        cs.insert(-a*x <= b);
+      }
+    }
+  }
+
+  // Go through all the binary constraints in `dbm'.
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    const Variable y(i-1);
+    const DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = i + 1; j <= space_dim; ++j) {
+      const Variable x(j-1);
+      const N& dbm_ij = dbm_i[j];
+      const N& dbm_ji = dbm[j][i];
+      if (is_additive_inverse(dbm_ji, dbm_ij)) {
+        // We have a binary equality constraint.
+        numer_denom(dbm_ij, b, a);
+        cs.insert(a*x - a*y == b);
+      }
+      else {
+        // We have 0, 1 or 2 binary inequality constraints.
+        if (!is_plus_infinity(dbm_ij)) {
+          numer_denom(dbm_ij, b, a);
+          cs.insert(a*x - a*y <= b);
+        }
+        if (!is_plus_infinity(dbm_ji)) {
+          numer_denom(dbm_ji, b, a);
+          cs.insert(a*y - a*x <= b);
+        }
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::minimized_constraints() const {
+  shortest_path_reduction_assign();
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+
+  // Compute leader information.
+  std::vector<dimension_type> leaders;
+  compute_leaders(leaders);
+  std::vector<dimension_type> leader_indices;
+  compute_leader_indices(leaders, leader_indices);
+  const dimension_type num_leaders = leader_indices.size();
+
+  // Go through the non-leaders to generate equality constraints.
+  const DB_Row<N>& dbm_0 = dbm[0];
+  for (dimension_type i = 1; i <= space_dim; ++i) {
+    const dimension_type leader = leaders[i];
+    if (i != leader) {
+      // Generate the constraint relating `i' and its leader.
+      if (leader == 0) {
+        // A unary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm_0[i]));
+        numer_denom(dbm_0[i], numer, denom);
+        cs.insert(denom*Variable(i-1) == numer);
+      }
+      else {
+        // A binary equality has to be generated.
+        PPL_ASSERT(!is_plus_infinity(dbm[i][leader]));
+        numer_denom(dbm[i][leader], numer, denom);
+        cs.insert(denom*Variable(leader-1) - denom*Variable(i-1) == numer);
+      }
+    }
+  }
+
+  // Go through the leaders to generate inequality constraints.
+  // First generate all the unary inequalities.
+  const Bit_Row& red_0 = redundancy_dbm[0];
+  for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leader_indices[l_i];
+    if (!red_0[i]) {
+      numer_denom(dbm_0[i], numer, denom);
+      cs.insert(denom*Variable(i-1) <= numer);
+    }
+    if (!redundancy_dbm[i][0]) {
+      numer_denom(dbm[i][0], numer, denom);
+      cs.insert(-denom*Variable(i-1) <= numer);
+    }
+  }
+  // Then generate all the binary inequalities.
+  for (dimension_type l_i = 1; l_i < num_leaders; ++l_i) {
+    const dimension_type i = leader_indices[l_i];
+    const DB_Row<N>& dbm_i = dbm[i];
+    const Bit_Row& red_i = redundancy_dbm[i];
+    for (dimension_type l_j = l_i + 1; l_j < num_leaders; ++l_j) {
+      const dimension_type j = leader_indices[l_j];
+      if (!red_i[j]) {
+        numer_denom(dbm_i[j], numer, denom);
+        cs.insert(denom*Variable(j-1) - denom*Variable(i-1) <= numer);
+      }
+      if (!redundancy_dbm[j][i]) {
+        numer_denom(dbm[j][i], numer, denom);
+        cs.insert(denom*Variable(i-1) - denom*Variable(j-1) <= numer);
+      }
+    }
+  }
+  return cs;
+}
+
+template <typename T>
+void
+BD_Shape<T>::expand_space_dimension(Variable var, dimension_type m) {
+  dimension_type old_dim = space_dimension();
+  // `var' should be one of the dimensions of the vector space.
+  if (var.space_dimension() > old_dim)
+    throw_dimension_incompatible("expand_space_dimension(v, m)", "v", var);
+
+  // The space dimension of the resulting BDS should not
+  // overflow the maximum allowed space dimension.
+  if (m > max_space_dimension() - space_dimension())
+    throw_invalid_argument("expand_dimension(v, m)",
+                           "adding m new space dimensions exceeds "
+                           "the maximum allowed space dimension");
+
+  // Nothing to do, if no dimensions must be added.
+  if (m == 0)
+    return;
+
+  // Add the required new dimensions.
+  add_space_dimensions_and_embed(m);
+
+  // For each constraints involving variable `var', we add a
+  // similar constraint with the new variable substituted for
+  // variable `var'.
+  const dimension_type v_id = var.id() + 1;
+  const DB_Row<N>& dbm_v = dbm[v_id];
+  for (dimension_type i = old_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    const N& dbm_i_v = dbm[i][v_id];
+    const N& dbm_v_i = dbm_v[i];
+    for (dimension_type j = old_dim+1; j < old_dim+m+1; ++j) {
+      dbm_i[j] = dbm_i_v;
+      dbm[j][i] = dbm_v_i;
+    }
+  }
+  // In general, adding a constraint does not preserve the shortest-path
+  // closure or reduction of the bounded difference shape.
+  if (marked_shortest_path_closed())
+    reset_shortest_path_closed();
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::fold_space_dimensions(const Variables_Set& vars,
+                                   Variable dest) {
+  const dimension_type space_dim = space_dimension();
+  // `dest' should be one of the dimensions of the BDS.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the BDS.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  shortest_path_closure_assign();
+  if (!marked_empty()) {
+    // Recompute the elements of the row and the column corresponding
+    // to variable `dest' by taking the join of their value with the
+    // value of the corresponding elements in the row and column of the
+    // variable `vars'.
+    const dimension_type v_id = dest.id() + 1;
+    DB_Row<N>& dbm_v = dbm[v_id];
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vs_end = vars.end(); i != vs_end; ++i) {
+      const dimension_type to_be_folded_id = *i + 1;
+      const DB_Row<N>& dbm_to_be_folded_id = dbm[to_be_folded_id];
+      for (dimension_type j = space_dim + 1; j-- > 0; ) {
+        max_assign(dbm[j][v_id], dbm[j][to_be_folded_id]);
+        max_assign(dbm_v[j], dbm_to_be_folded_id[j]);
+      }
+    }
+  }
+  remove_space_dimensions(vars);
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(Complexity_Class) {
+  if (std::numeric_limits<T>::is_integer)
+    return;
+
+  const dimension_type space_dim = space_dimension();
+  shortest_path_closure_assign();
+  if (space_dim == 0 || marked_empty())
+    return;
+
+  for (dimension_type i = space_dim + 1; i-- > 0; ) {
+    DB_Row<N>& dbm_i = dbm[i];
+    for (dimension_type j = space_dim + 1; j-- > 0; )
+      if (i != j)
+        drop_some_non_integer_points_helper(dbm_i[j]);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::drop_some_non_integer_points(const Variables_Set& vars,
+                                          Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dim < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (std::numeric_limits<T>::is_integer || min_space_dim == 0)
+    return;
+
+  shortest_path_closure_assign();
+  if (marked_empty())
+    return;
+
+  const Variables_Set::const_iterator v_begin = vars.begin();
+  const Variables_Set::const_iterator v_end = vars.end();
+  PPL_ASSERT(v_begin != v_end);
+  // Unary constraints on a variable occurring in `vars'.
+  DB_Row<N>& dbm_0 = dbm[0];
+  for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+    const dimension_type i = *v_i + 1;
+    drop_some_non_integer_points_helper(dbm_0[i]);
+    drop_some_non_integer_points_helper(dbm[i][0]);
+  }
+
+  // Binary constraints where both variables occur in `vars'.
+  for (Variables_Set::const_iterator v_i = v_begin; v_i != v_end; ++v_i) {
+    const dimension_type i = *v_i + 1;
+    DB_Row<N>& dbm_i = dbm[i];
+    for (Variables_Set::const_iterator v_j = v_begin; v_j != v_end; ++v_j) {
+      const dimension_type j = *v_j + 1;
+      if (i != j)
+        drop_some_non_integer_points_helper(dbm_i[j]);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& bds) {
+  typedef typename BD_Shape<T>::coefficient_type N;
+  if (bds.is_universe())
+    s << "true";
+  else {
+    // We control empty bounded difference shape.
+    dimension_type n = bds.space_dimension();
+    if (bds.marked_empty())
+      s << "false";
+    else {
+      PPL_DIRTY_TEMP(N, v);
+      bool first = true;
+      for (dimension_type i = 0; i <= n; ++i)
+        for (dimension_type j = i + 1; j <= n; ++j) {
+          const N& c_i_j = bds.dbm[i][j];
+          const N& c_j_i = bds.dbm[j][i];
+          if (is_additive_inverse(c_j_i, c_i_j)) {
+            // We will print an equality.
+            if (first)
+              first = false;
+            else
+              s << ", ";
+            if (i == 0) {
+              // We have got a equality constraint with one variable.
+              s << Variable(j - 1);
+              s << " = " << c_i_j;
+            }
+            else {
+              // We have got a equality constraint with two variables.
+              if (sgn(c_i_j) >= 0) {
+                s << Variable(j - 1);
+                s << " - ";
+                s << Variable(i - 1);
+                s << " = " << c_i_j;
+              }
+              else {
+                s << Variable(i - 1);
+                s << " - ";
+                s << Variable(j - 1);
+                s << " = " << c_j_i;
+              }
+            }
+          }
+          else {
+            // We will print a non-strict inequality.
+            if (!is_plus_infinity(c_j_i)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with only one variable.
+                s << Variable(j - 1);
+                neg_assign_r(v, c_j_i, ROUND_DOWN);
+                s << " >= " << v;
+              }
+              else {
+                // We have got a constraint with two variables.
+                if (sgn(c_j_i) >= 0) {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  s << " <= " << c_j_i;
+                }
+                else {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  neg_assign_r(v, c_j_i, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+            if (!is_plus_infinity(c_i_j)) {
+              if (first)
+                first = false;
+              else
+                s << ", ";
+              if (i == 0) {
+                // We have got a constraint with only one variable.
+                s << Variable(j - 1);
+                s << " <= " << c_i_j;
+              }
+              else {
+                // We have got a constraint with two variables.
+                if (sgn(c_i_j) >= 0) {
+                  s << Variable(j - 1);
+                  s << " - ";
+                  s << Variable(i - 1);
+                  s << " <= " << c_i_j;
+                }
+                else {
+                  s << Variable(i - 1);
+                  s << " - ";
+                  s << Variable(j - 1);
+                  neg_assign_r(v, c_i_j, ROUND_DOWN);
+                  s << " >= " << v;
+                }
+              }
+            }
+          }
+        }
+    }
+  }
+  return s;
+}
+
+template <typename T>
+void
+BD_Shape<T>::ascii_dump(std::ostream& s) const {
+  status.ascii_dump(s);
+  s << "\n";
+  dbm.ascii_dump(s);
+  s << "\n";
+  redundancy_dbm.ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(T, BD_Shape<T>)
+
+template <typename T>
+bool
+BD_Shape<T>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+  if (!dbm.ascii_load(s))
+    return false;
+  if (!redundancy_dbm.ascii_load(s))
+    return false;
+  return true;
+}
+
+template <typename T>
+memory_size_type
+BD_Shape<T>::external_memory_in_bytes() const {
+  return dbm.external_memory_in_bytes()
+    + redundancy_dbm.external_memory_in_bytes();
+}
+
+template <typename T>
+bool
+BD_Shape<T>::OK() const {
+  // Check whether the difference-bound matrix is well-formed.
+  if (!dbm.OK())
+    return false;
+
+  // Check whether the status information is legal.
+  if (!status.OK())
+    return false;
+
+  // An empty BDS is OK.
+  if (marked_empty())
+    return true;
+
+  // MINUS_INFINITY cannot occur at all.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    for (dimension_type j = dbm.num_rows(); j-- > 0; )
+      if (is_minus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                  << dbm[i][j] << "!"
+                  << std::endl;
+#endif
+        return false;
+      }
+
+  // On the main diagonal only PLUS_INFINITY can occur.
+  for (dimension_type i = dbm.num_rows(); i-- > 0; )
+    if (!is_plus_infinity(dbm[i][i])) {
+#ifndef NDEBUG
+      using namespace Parma_Polyhedra_Library::IO_Operators;
+      std::cerr << "BD_Shape::dbm[" << i << "][" << i << "] = "
+                << dbm[i][i] << "!  (+inf was expected.)"
+                << std::endl;
+#endif
+      return false;
+    }
+
+  // Check whether the shortest-path closure information is legal.
+  if (marked_shortest_path_closed()) {
+    BD_Shape x = *this;
+    x.reset_shortest_path_closed();
+    x.shortest_path_closure_assign();
+    if (x.dbm != dbm) {
+#ifndef NDEBUG
+      std::cerr << "BD_Shape is marked as closed but it is not!"
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+
+  // The following tests might result in false alarms when using floating
+  // point coefficients: they are only meaningful if the coefficient type
+  // base is exact (since otherwise shortest-path closure is approximated).
+  if (std::numeric_limits<coefficient_type_base>::is_exact) {
+
+    // Check whether the shortest-path reduction information is legal.
+    if (marked_shortest_path_reduced()) {
+      // A non-redundant constraint cannot be equal to PLUS_INFINITY.
+      for (dimension_type i = dbm.num_rows(); i-- > 0; )
+        for (dimension_type j = dbm.num_rows(); j-- > 0; )
+          if (!redundancy_dbm[i][j] && is_plus_infinity(dbm[i][j])) {
+#ifndef NDEBUG
+            using namespace Parma_Polyhedra_Library::IO_Operators;
+            std::cerr << "BD_Shape::dbm[" << i << "][" << j << "] = "
+                      << dbm[i][j] << " is marked as non-redundant!"
+                      << std::endl;
+#endif
+            return false;
+          }
+
+      BD_Shape x = *this;
+      x.reset_shortest_path_reduced();
+      x.shortest_path_reduction_assign();
+      if (x.redundancy_dbm != redundancy_dbm) {
+#ifndef NDEBUG
+        std::cerr << "BD_Shape is marked as reduced but it is not!"
+                  << std::endl;
+#endif
+        return false;
+      }
+    }
+  }
+
+  // All checks passed.
+  return true;
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const BD_Shape& y) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+                                          const Linear_Expression& le) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << le << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const char* le_name,
+                                          const Linear_Expression& le) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << le_name << "->space_dimension() == "
+    << le.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+template<typename Interval_Info>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+                                          const char* lf_name,
+                                          const Linear_Form< Interval<T,
+                                          Interval_Info> >& lf) const {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << lf_name << "->space_dimension() == "
+    << lf.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_invalid_argument(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::BD_Shape::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::invalid_argument(s.str());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BD_Shape_defs.hh line 2370. */
+
+/* Automatically generated from PPL source file ../src/Rational_Interval.hh line 1. */
+/* Rational_Interval class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Rational_Interval.hh line 28. */
+#include <gmpxx.h>
+
+namespace Parma_Polyhedra_Library {
+
+struct Rational_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Rational_Interval_Info_Policy> Rational_Interval_Info;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An interval with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Interval<mpq_class, Rational_Interval_Info> Rational_Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_templates.hh line 42. */
+#include <vector>
+#include <map>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename ITV>
+inline
+Box<ITV>::Box(dimension_type num_dimensions, Degenerate_Element kind)
+  : seq(check_space_dimension_overflow(num_dimensions,
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(n, k)",
+                                       "n exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // In a box that is marked empty the intervals are completely
+  // meaningless: we exploit this by avoiding their initialization.
+  if (kind == UNIVERSE) {
+    for (dimension_type i = num_dimensions; i-- > 0; )
+      seq[i].assign(UNIVERSE);
+    set_empty_up_to_date();
+  }
+  else
+    set_empty();
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Constraint_System& cs)
+  : seq(check_space_dimension_overflow(cs.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(cs)",
+                                       "cs exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_constraints_no_check(cs);
+}
+
+template <typename ITV>
+inline
+Box<ITV>::Box(const Congruence_System& cgs)
+  : seq(check_space_dimension_overflow(cgs.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(cgs)",
+                                       "cgs exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // FIXME: check whether we can avoid the double initialization.
+  for (dimension_type i = cgs.space_dimension(); i-- > 0; )
+    seq[i].assign(UNIVERSE);
+  add_congruences_no_check(cgs);
+}
+
+template <typename ITV>
+template <typename Other_ITV>
+inline
+Box<ITV>::Box(const Box<Other_ITV>& y, Complexity_Class)
+  : seq(y.space_dimension()),
+    // FIXME: why the following does not work?
+    // status(y.status) {
+    status() {
+  // FIXME: remove when the above is fixed.
+  if (y.marked_empty())
+    set_empty();
+
+  if (!y.marked_empty())
+    for (dimension_type k = y.space_dimension(); k-- > 0; )
+      seq[k].assign(y.seq[k]);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Generator_System& gs)
+  : seq(check_space_dimension_overflow(gs.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(gs)",
+                                       "gs exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  const Generator_System::const_iterator gs_begin = gs.begin();
+  const Generator_System::const_iterator gs_end = gs.end();
+  if (gs_begin == gs_end) {
+    // An empty generator system defines the empty box.
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  PPL_DIRTY_TEMP(mpq_class, q);
+  bool point_seen = false;
+  // Going through all the points.
+  for (Generator_System::const_iterator
+         gs_i = gs_begin; gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    if (g.is_point()) {
+      const Coefficient& d = g.divisor();
+      if (point_seen) {
+        // This is not the first point: `seq' already contains valid values.
+        // TODO: If the variables in the expression that have coefficient 0
+        // have no effect on seq[i], this loop can be optimized using
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+          assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+          q.canonicalize();
+          PPL_DIRTY_TEMP(ITV, iq);
+          iq.build(i_constraint(EQUAL, q));
+          seq[i].join_assign(iq);
+        }
+      }
+      else {
+        // This is the first point seen: initialize `seq'.
+        point_seen = true;
+        // TODO: If the variables in the expression that have coefficient 0
+        // have no effect on seq[i], this loop can be optimized using
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+          assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+          q.canonicalize();
+          seq[i].build(i_constraint(EQUAL, q));
+        }
+      }
+    }
+  }
+
+  if (!point_seen)
+    // The generator system is not empty, but contains no points.
+    throw std::invalid_argument("PPL::Box<ITV>::Box(gs):\n"
+                                "the non-empty generator system gs "
+                                "contains no points.");
+
+  // Going through all the lines, rays and closure points.
+  for (Generator_System::const_iterator gs_i = gs_begin;
+       gs_i != gs_end; ++gs_i) {
+    const Generator& g = *gs_i;
+    switch (g.type()) {
+    case Generator::LINE:
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+              i_end = g.expression().end();
+              i != i_end; ++i)
+          seq[i.variable().id()].assign(UNIVERSE);
+      break;
+    case Generator::RAY:
+      for (Generator::expr_type::const_iterator i = g.expression().begin(),
+              i_end = g.expression().end();
+              i != i_end; ++i)
+        switch (sgn(*i)) {
+        case 1:
+          seq[i.variable().id()].upper_extend();
+          break;
+        case -1:
+          seq[i.variable().id()].lower_extend();
+          break;
+        default:
+          PPL_UNREACHABLE;
+          break;
+        }
+      break;
+    case Generator::CLOSURE_POINT:
+      {
+        const Coefficient& d = g.divisor();
+        // TODO: If the variables in the expression that have coefficient 0
+        // have no effect on seq[i], this loop can be optimized using
+        // Generator::expr_type::const_iterator.
+        for (dimension_type i = space_dim; i-- > 0; ) {
+          assign_r(q.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+          assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+          q.canonicalize();
+          ITV& seq_i = seq[i];
+          seq_i.lower_extend(i_constraint(GREATER_THAN, q));
+          seq_i.upper_extend(i_constraint(LESS_THAN, q));
+        }
+      }
+      break;
+    default:
+      // Points already dealt with.
+      break;
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const BD_Shape<T>& bds, Complexity_Class)
+  : seq(check_space_dimension_overflow(bds.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(bds)",
+                                       "bds exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // Expose all the interval constraints.
+  bds.shortest_path_closure_assign();
+  if (bds.marked_empty()) {
+    set_empty();
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  typedef typename BD_Shape<T>::coefficient_type Coeff;
+  PPL_DIRTY_TEMP(Coeff, tmp);
+  const DB_Row<Coeff>& dbm_0 = bds.dbm[0];
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    I_Constraint<Coeff> lower;
+    I_Constraint<Coeff> upper;
+    ITV& seq_i = seq[i];
+
+    // Set the upper bound.
+    const Coeff& u = dbm_0[i+1];
+    if (!is_plus_infinity(u))
+      upper.set(LESS_OR_EQUAL, u, true);
+
+    // Set the lower bound.
+    const Coeff& negated_l = bds.dbm[i+1][0];
+    if (!is_plus_infinity(negated_l)) {
+      neg_assign_r(tmp, negated_l, ROUND_DOWN);
+      lower.set(GREATER_OR_EQUAL, tmp);
+    }
+
+    seq_i.build(lower, upper);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+Box<ITV>::Box(const Octagonal_Shape<T>& oct, Complexity_Class)
+  : seq(check_space_dimension_overflow(oct.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(oct)",
+                                       "oct exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // Expose all the interval constraints.
+  oct.strong_closure_assign();
+  if (oct.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
+
+  PPL_DIRTY_TEMP(mpq_class, lower_bound);
+  PPL_DIRTY_TEMP(mpq_class, upper_bound);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    typedef typename Octagonal_Shape<T>::coefficient_type Coeff;
+    I_Constraint<mpq_class> lower;
+    I_Constraint<mpq_class> upper;
+    ITV& seq_i = seq[i];
+    const dimension_type ii = 2*i;
+    const dimension_type cii = ii + 1;
+
+    // Set the upper bound.
+    const Coeff& twice_ub = oct.matrix[cii][ii];
+    if (!is_plus_infinity(twice_ub)) {
+      assign_r(upper_bound, twice_ub, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(upper_bound, upper_bound, 1, ROUND_NOT_NEEDED);
+      upper.set(LESS_OR_EQUAL, upper_bound);
+    }
+
+    // Set the lower bound.
+    const Coeff& twice_lb = oct.matrix[ii][cii];
+    if (!is_plus_infinity(twice_lb)) {
+      assign_r(lower_bound, twice_lb, ROUND_NOT_NEEDED);
+      neg_assign_r(lower_bound, lower_bound, ROUND_NOT_NEEDED);
+      div_2exp_assign_r(lower_bound, lower_bound, 1, ROUND_NOT_NEEDED);
+      lower.set(GREATER_OR_EQUAL, lower_bound);
+    }
+    seq_i.build(lower, upper);
+  }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Polyhedron& ph, Complexity_Class complexity)
+  : seq(check_space_dimension_overflow(ph.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(ph)",
+                                       "ph exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  // We do not need to bother about `complexity' if:
+  // a) the polyhedron is already marked empty; or ...
+  if (ph.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // b) the polyhedron is zero-dimensional; or ...
+  const dimension_type space_dim = ph.space_dimension();
+  if (space_dim == 0)
+    return;
+
+  // c) the polyhedron is already described by a generator system.
+  if (ph.generators_are_up_to_date() && !ph.has_pending_constraints()) {
+    Box tmp(ph.generators());
+    m_swap(tmp);
+    return;
+  }
+
+  // Here generators are not up-to-date or there are pending constraints.
+  PPL_ASSERT(ph.constraints_are_up_to_date());
+
+  if (complexity == POLYNOMIAL_COMPLEXITY) {
+    // FIXME: is there a way to avoid this initialization?
+    for (dimension_type i = space_dim; i-- > 0; )
+      seq[i].assign(UNIVERSE);
+    // Get a simplified version of the constraints.
+    const Constraint_System cs = ph.simplified_constraints();
+    // Propagate easy-to-find bounds from the constraints,
+    // allowing for a limited number of iterations.
+    // FIXME: 20 is just a wild guess.
+    const dimension_type max_iterations = 20;
+    propagate_constraints_no_check(cs, max_iterations);
+  }
+  else if (complexity == SIMPLEX_COMPLEXITY) {
+    MIP_Problem lp(space_dim);
+    const Constraint_System& ph_cs = ph.constraints();
+    if (!ph_cs.has_strict_inequalities())
+      lp.add_constraints(ph_cs);
+    else
+      // Adding to `lp' a topologically closed version of `ph_cs'.
+      for (Constraint_System::const_iterator i = ph_cs.begin(),
+             ph_cs_end = ph_cs.end(); i != ph_cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_strict_inequality()) {
+          const Linear_Expression expr(c.expression());
+          lp.add_constraint(expr >= 0);
+        }
+        else
+          lp.add_constraint(c);
+      }
+    // Check for unsatisfiability.
+    if (!lp.is_satisfiable()) {
+      set_empty();
+      return;
+    }
+    // Get all the bounds for the space dimensions.
+    Generator g(point());
+    PPL_DIRTY_TEMP(mpq_class, lower_bound);
+    PPL_DIRTY_TEMP(mpq_class, upper_bound);
+    PPL_DIRTY_TEMP(Coefficient, bound_numer);
+    PPL_DIRTY_TEMP(Coefficient, bound_denom);
+    for (dimension_type i = space_dim; i-- > 0; ) {
+      I_Constraint<mpq_class> lower;
+      I_Constraint<mpq_class> upper;
+      ITV& seq_i = seq[i];
+      lp.set_objective_function(Variable(i));
+      // Evaluate upper bound.
+      lp.set_optimization_mode(MAXIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, bound_numer, bound_denom);
+        assign_r(upper_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+        assign_r(upper_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+        PPL_ASSERT(is_canonical(upper_bound));
+        upper.set(LESS_OR_EQUAL, upper_bound);
+      }
+      // Evaluate optimal lower bound.
+      lp.set_optimization_mode(MINIMIZATION);
+      if (lp.solve() == OPTIMIZED_MIP_PROBLEM) {
+        g = lp.optimizing_point();
+        lp.evaluate_objective_function(g, bound_numer, bound_denom);
+        assign_r(lower_bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+        assign_r(lower_bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+        PPL_ASSERT(is_canonical(lower_bound));
+        lower.set(GREATER_OR_EQUAL, lower_bound);
+      }
+      seq_i.build(lower, upper);
+    }
+  }
+  else {
+    PPL_ASSERT(complexity == ANY_COMPLEXITY);
+    if (ph.is_empty())
+      set_empty();
+    else {
+      Box tmp(ph.generators());
+      m_swap(tmp);
+    }
+  }
+}
+
+template <typename ITV>
+Box<ITV>::Box(const Grid& gr, Complexity_Class)
+  : seq(check_space_dimension_overflow(gr.space_dimension(),
+                                       max_space_dimension(),
+                                       "PPL::Box::",
+                                       "Box(gr)",
+                                       "gr exceeds the maximum "
+                                       "allowed space dimension")),
+    status() {
+
+  if (gr.marked_empty()) {
+    set_empty();
+    return;
+  }
+
+  // The empty flag will be meaningful, whatever happens from now on.
+  set_empty_up_to_date();
+
+  const dimension_type space_dim = gr.space_dimension();
+
+  if (space_dim == 0)
+    return;
+
+  if (!gr.generators_are_up_to_date() && !gr.update_generators()) {
+    // Updating found the grid empty.
+    set_empty();
+    return;
+  }
+
+  PPL_ASSERT(!gr.gen_sys.empty());
+
+  // For each dimension that is bounded by the grid, set both bounds
+  // of the interval to the value of the associated coefficient in a
+  // generator point.
+  PPL_DIRTY_TEMP(mpq_class, bound);
+  PPL_DIRTY_TEMP(Coefficient, bound_numer);
+  PPL_DIRTY_TEMP(Coefficient, bound_denom);
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& seq_i = seq[i];
+    Variable var(i);
+    bool max;
+    if (gr.maximize(var, bound_numer, bound_denom, max)) {
+      assign_r(bound.get_num(), bound_numer, ROUND_NOT_NEEDED);
+      assign_r(bound.get_den(), bound_denom, ROUND_NOT_NEEDED);
+      bound.canonicalize();
+      seq_i.build(i_constraint(EQUAL, bound));
+    }
+    else
+      seq_i.assign(UNIVERSE);
+  }
+}
+
+template <typename ITV>
+template <typename D1, typename D2, typename R>
+Box<ITV>::Box(const Partially_Reduced_Product<D1, D2, R>& dp,
+              Complexity_Class complexity)
+  : seq(), status() {
+  check_space_dimension_overflow(dp.space_dimension(),
+                                 max_space_dimension(),
+                                 "PPL::Box::",
+                                 "Box(dp)",
+                                 "dp exceeds the maximum "
+                                 "allowed space dimension");
+  Box tmp1(dp.domain1(), complexity);
+  Box tmp2(dp.domain2(), complexity);
+  tmp1.intersection_assign(tmp2);
+  m_swap(tmp1);
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_embed(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Box::",
+                                 "add_space_dimensions_and_embed(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+  // To embed an n-dimension space box in a (n+m)-dimension space,
+  // we just add `m' new universe elements to the sequence.
+  seq.insert(seq.end(), m, ITV(UNIVERSE));
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::add_space_dimensions_and_project(const dimension_type m) {
+  // Adding no dimensions is a no-op.
+  if (m == 0)
+    return;
+  check_space_dimension_overflow(m, max_space_dimension() - space_dimension(),
+                                 "PPL::Box::",
+                                 "add_space_dimensions_and_project(m)",
+                                 "adding m new space dimensions exceeds "
+                                 "the maximum allowed space dimension");
+  // Add `m' new zero elements to the sequence.
+  seq.insert(seq.end(), m, ITV(0));
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+operator==(const Box<ITV>& x, const Box<ITV>& y) {
+  const dimension_type x_space_dim = x.space_dimension();
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  if (x.is_empty())
+    return y.is_empty();
+
+  if (y.is_empty())
+    return x.is_empty();
+
+  for (dimension_type k = x_space_dim; k-- > 0; )
+    if (x.seq[k] != y.seq[k])
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::bounds(const Linear_Expression& expr, const bool from_above) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type expr_space_dim = expr.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((from_above
+                                  ? "bounds_from_above(e)"
+                                  : "bounds_from_below(e)"), "e", expr);
+  // A zero-dimensional or empty Box bounds everything.
+  if (space_dim == 0 || is_empty())
+    return true;
+
+  const int from_above_sign = from_above ? 1 : -1;
+  // TODO: This loop can be optimized more, if needed, exploiting the
+  // (possible) sparseness of expr.
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.end(); i != i_end; ++i) {
+    const Variable v = i.variable();
+    switch (sgn(*i) * from_above_sign) {
+    case 1:
+      if (seq[v.id()].upper_is_boundary_infinity())
+        return false;
+      break;
+    case 0:
+      PPL_UNREACHABLE;
+      break;
+    case -1:
+      if (seq[v.id()].lower_is_boundary_infinity())
+        return false;
+      break;
+    }
+  }
+  return true;
+}
+
+template <typename ITV>
+Poly_Con_Relation
+interval_relation(const ITV& i,
+                  const Constraint::Type constraint_type,
+                  Coefficient_traits::const_reference numer,
+                  Coefficient_traits::const_reference denom) {
+
+  if (i.is_universe())
+    return Poly_Con_Relation::strictly_intersects();
+
+  PPL_DIRTY_TEMP(mpq_class, bound);
+  assign_r(bound.get_num(), numer, ROUND_NOT_NEEDED);
+  assign_r(bound.get_den(), denom, ROUND_NOT_NEEDED);
+  bound.canonicalize();
+  neg_assign_r(bound, bound, ROUND_NOT_NEEDED);
+  const bool is_lower_bound = (denom > 0);
+
+  PPL_DIRTY_TEMP(mpq_class, bound_diff);
+  if (constraint_type == Constraint::EQUALITY) {
+    if (i.lower_is_boundary_infinity()) {
+      PPL_ASSERT(!i.upper_is_boundary_infinity());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        return i.upper_is_open()
+          ? Poly_Con_Relation::is_disjoint()
+          : Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::is_disjoint();
+      case 0:
+        if (i.lower_is_open())
+          return Poly_Con_Relation::is_disjoint();
+        if (i.is_singleton())
+          return Poly_Con_Relation::is_included()
+            && Poly_Con_Relation::saturates();
+        return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        if (i.upper_is_boundary_infinity())
+          return Poly_Con_Relation::strictly_intersects();
+        else {
+          assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+          sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+          switch (sgn(bound_diff)) {
+          case 1:
+            return Poly_Con_Relation::strictly_intersects();
+          case 0:
+            if (i.upper_is_open())
+              return Poly_Con_Relation::is_disjoint();
+            else
+              return Poly_Con_Relation::strictly_intersects();
+          case -1:
+            return Poly_Con_Relation::is_disjoint();
+          }
+        }
+      }
+    }
+  }
+
+  PPL_ASSERT(constraint_type != Constraint::EQUALITY);
+  if (is_lower_bound) {
+    if (i.lower_is_boundary_infinity()) {
+      PPL_ASSERT(!i.upper_is_boundary_infinity());
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::strictly_intersects();
+      case 0:
+        if (constraint_type == Constraint::STRICT_INEQUALITY
+            || i.upper_is_open())
+          return Poly_Con_Relation::is_disjoint();
+        else
+          return Poly_Con_Relation::strictly_intersects();
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      }
+    }
+    else {
+      assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case 1:
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+            || i.lower_is_open()) {
+          Poly_Con_Relation result = Poly_Con_Relation::is_included();
+          if (i.is_singleton())
+            result = result && Poly_Con_Relation::saturates();
+          return result;
+        }
+        else {
+          PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+                 && !i.lower_is_open());
+          if (i.is_singleton())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          else
+            return Poly_Con_Relation::strictly_intersects();
+        }
+      case -1:
+        if (i.upper_is_boundary_infinity())
+          return Poly_Con_Relation::strictly_intersects();
+        else {
+          assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+          sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+          switch (sgn(bound_diff)) {
+          case 1:
+            return Poly_Con_Relation::strictly_intersects();
+          case 0:
+            if (constraint_type == Constraint::STRICT_INEQUALITY
+                || i.upper_is_open())
+              return Poly_Con_Relation::is_disjoint();
+            else
+              return Poly_Con_Relation::strictly_intersects();
+          case -1:
+            return Poly_Con_Relation::is_disjoint();
+          }
+        }
+      }
+    }
+  }
+  else {
+    // `c' is an upper bound.
+    if (i.upper_is_boundary_infinity())
+      return Poly_Con_Relation::strictly_intersects();
+    else {
+      assign_r(bound_diff, i.upper(), ROUND_NOT_NEEDED);
+      sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+      switch (sgn(bound_diff)) {
+      case -1:
+        return Poly_Con_Relation::is_included();
+      case 0:
+        if (constraint_type == Constraint::NONSTRICT_INEQUALITY
+            || i.upper_is_open()) {
+          Poly_Con_Relation result = Poly_Con_Relation::is_included();
+          if (i.is_singleton())
+            result = result && Poly_Con_Relation::saturates();
+          return result;
+        }
+        else {
+          PPL_ASSERT(constraint_type == Constraint::STRICT_INEQUALITY
+                 && !i.upper_is_open());
+          if (i.is_singleton())
+            return Poly_Con_Relation::is_disjoint()
+              && Poly_Con_Relation::saturates();
+          else
+            return Poly_Con_Relation::strictly_intersects();
+        }
+      case 1:
+        if (i.lower_is_boundary_infinity())
+          return Poly_Con_Relation::strictly_intersects();
+        else {
+          assign_r(bound_diff, i.lower(), ROUND_NOT_NEEDED);
+          sub_assign_r(bound_diff, bound_diff, bound, ROUND_NOT_NEEDED);
+          switch (sgn(bound_diff)) {
+          case -1:
+            return Poly_Con_Relation::strictly_intersects();
+          case 0:
+            if (constraint_type == Constraint::STRICT_INEQUALITY
+                || i.lower_is_open())
+              return Poly_Con_Relation::is_disjoint();
+            else
+              return Poly_Con_Relation::strictly_intersects();
+          case 1:
+            return Poly_Con_Relation::is_disjoint();
+          }
+        }
+      }
+    }
+  }
+
+  // Quiet a compiler warning: this program point is unreachable.
+  PPL_UNREACHABLE;
+  return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Congruence& cg) const {
+  const dimension_type cg_space_dim = cg.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (cg_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(cg)", cg);
+
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if (cg.is_inconsistent())
+      return Poly_Con_Relation::is_disjoint();
+    else
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+  }
+
+  if (cg.is_equality()) {
+    const Constraint c(cg);
+    return relation_with(c);
+  }
+
+  PPL_DIRTY_TEMP(Rational_Interval, r);
+  PPL_DIRTY_TEMP(Rational_Interval, t);
+  PPL_DIRTY_TEMP(mpq_class, m);
+  r = 0;
+  for (Congruence::expr_type::const_iterator i = cg.expression().begin(),
+      i_end = cg.expression().end(); i != i_end; ++i) {
+    const Coefficient& cg_i = *i;
+    const Variable v = i.variable();
+    assign_r(m, cg_i, ROUND_NOT_NEEDED);
+    // FIXME: an add_mul_assign() method would come handy here.
+    t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+    t *= m;
+    r += t;
+  }
+
+  if (r.lower_is_boundary_infinity() || r.upper_is_boundary_infinity())
+    return Poly_Con_Relation::strictly_intersects();
+
+
+  // Find the value that satisfies the congruence and is
+  // nearest to the lower bound such that the point lies on or above it.
+
+  PPL_DIRTY_TEMP_COEFFICIENT(lower);
+  PPL_DIRTY_TEMP_COEFFICIENT(mod);
+  PPL_DIRTY_TEMP_COEFFICIENT(v);
+  mod = cg.modulus();
+  v = cg.inhomogeneous_term() % mod;
+  assign_r(lower, r.lower(), ROUND_DOWN);
+  v -= ((lower / mod) * mod);
+  if (v + lower > 0)
+    v -= mod;
+  return interval_relation(r, Constraint::EQUALITY, v);
+}
+
+template <typename ITV>
+Poly_Con_Relation
+Box<ITV>::relation_with(const Constraint& c) const {
+  const dimension_type c_space_dim = c.space_dimension();
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (c_space_dim > space_dim)
+    throw_dimension_incompatible("relation_with(c)", c);
+
+  if (is_empty())
+    return Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  if (space_dim == 0) {
+    if ((c.is_equality() && c.inhomogeneous_term() != 0)
+        || (c.is_inequality() && c.inhomogeneous_term() < 0))
+      return Poly_Con_Relation::is_disjoint();
+    else if (c.is_strict_inequality() && c.inhomogeneous_term() == 0)
+      // The constraint 0 > 0 implicitly defines the hyperplane 0 = 0;
+      // thus, the zero-dimensional point also saturates it.
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_disjoint();
+    else if (c.is_equality() || c.inhomogeneous_term() == 0)
+      return Poly_Con_Relation::saturates()
+        && Poly_Con_Relation::is_included();
+    else
+      // The zero-dimensional point saturates
+      // neither the positivity constraint 1 >= 0,
+      // nor the strict positivity constraint 1 > 0.
+      return Poly_Con_Relation::is_included();
+  }
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+
+  if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+    if (c_num_vars == 0)
+      // c is a trivial constraint.
+      switch (sgn(c.inhomogeneous_term())) {
+      case -1:
+        return Poly_Con_Relation::is_disjoint();
+      case 0:
+        if (c.is_strict_inequality())
+          return Poly_Con_Relation::saturates()
+            && Poly_Con_Relation::is_disjoint();
+        else
+          return Poly_Con_Relation::saturates()
+            && Poly_Con_Relation::is_included();
+      case 1:
+        return Poly_Con_Relation::is_included();
+      }
+    else {
+      // c is an interval constraint.
+      return interval_relation(seq[c_only_var],
+                               c.type(),
+                               c.inhomogeneous_term(),
+                               c.coefficient(Variable(c_only_var)));
+    }
+  else {
+    // Deal with a non-trivial and non-interval constraint.
+    PPL_DIRTY_TEMP(Rational_Interval, r);
+    PPL_DIRTY_TEMP(Rational_Interval, t);
+    PPL_DIRTY_TEMP(mpq_class, m);
+    r = 0;
+    const Constraint::expr_type& e = c.expression();
+    for (Constraint::expr_type::const_iterator i = e.begin(), i_end = e.end();
+          i != i_end; ++i) {
+      assign_r(m, *i, ROUND_NOT_NEEDED);
+      const Variable v = i.variable();
+      // FIXME: an add_mul_assign() method would come handy here.
+      t.build(seq[v.id()].lower_constraint(), seq[v.id()].upper_constraint());
+      t *= m;
+      r += t;
+    }
+    return interval_relation(r,
+                             c.type(),
+                             c.inhomogeneous_term());
+  }
+
+  // Quiet a compiler warning: this program point is unreachable.
+  PPL_UNREACHABLE;
+  return Poly_Con_Relation::nothing();
+}
+
+template <typename ITV>
+Poly_Gen_Relation
+Box<ITV>::relation_with(const Generator& g) const {
+  const dimension_type space_dim = space_dimension();
+  const dimension_type g_space_dim = g.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim < g_space_dim)
+    throw_dimension_incompatible("relation_with(g)", g);
+
+  // The empty box cannot subsume a generator.
+  if (is_empty())
+    return Poly_Gen_Relation::nothing();
+
+  // A universe box in a zero-dimensional space subsumes
+  // all the generators of a zero-dimensional space.
+  if (space_dim == 0)
+    return Poly_Gen_Relation::subsumes();
+
+  if (g.is_line_or_ray()) {
+    if (g.is_line()) {
+      const Generator::expr_type& e = g.expression();
+      for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+           i != i_end; ++i)
+        if (!seq[i.variable().id()].is_universe())
+          return Poly_Gen_Relation::nothing();
+      return Poly_Gen_Relation::subsumes();
+    }
+    else {
+      PPL_ASSERT(g.is_ray());
+      const Generator::expr_type& e = g.expression();
+      for (Generator::expr_type::const_iterator i = e.begin(), i_end = e.end();
+           i != i_end; ++i) {
+        const Variable v = i.variable();
+        switch (sgn(*i)) {
+        case 1:
+          if (!seq[v.id()].upper_is_boundary_infinity())
+            return Poly_Gen_Relation::nothing();
+          break;
+        case 0:
+          PPL_UNREACHABLE;
+          break;
+        case -1:
+          if (!seq[v.id()].lower_is_boundary_infinity())
+            return Poly_Gen_Relation::nothing();
+          break;
+        }
+      }
+      return Poly_Gen_Relation::subsumes();
+    }
+  }
+
+  // Here `g' is a point or closure point.
+  const Coefficient& g_divisor = g.divisor();
+  PPL_DIRTY_TEMP(mpq_class, g_coord);
+  PPL_DIRTY_TEMP(mpq_class, bound);
+  // TODO: If the variables in the expression that have coefficient 0
+  // have no effect on seq[i], this loop can be optimized using
+  // Generator::expr_type::const_iterator.
+  for (dimension_type i = g_space_dim; i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    if (seq_i.is_universe())
+      continue;
+    assign_r(g_coord.get_num(), g.coefficient(Variable(i)), ROUND_NOT_NEEDED);
+    assign_r(g_coord.get_den(), g_divisor, ROUND_NOT_NEEDED);
+    g_coord.canonicalize();
+    // Check lower bound.
+    if (!seq_i.lower_is_boundary_infinity()) {
+      assign_r(bound, seq_i.lower(), ROUND_NOT_NEEDED);
+      if (g_coord <= bound) {
+        if (seq_i.lower_is_open()) {
+          if (g.is_point() || g_coord != bound)
+            return Poly_Gen_Relation::nothing();
+        }
+        else if (g_coord != bound)
+          return Poly_Gen_Relation::nothing();
+      }
+    }
+    // Check upper bound.
+    if (!seq_i.upper_is_boundary_infinity()) {
+      assign_r(bound, seq_i.upper(), ROUND_NOT_NEEDED);
+      if (g_coord >= bound) {
+        if (seq_i.upper_is_open()) {
+          if (g.is_point() || g_coord != bound)
+            return Poly_Gen_Relation::nothing();
+        }
+        else if (g_coord != bound)
+          return Poly_Gen_Relation::nothing();
+      }
+    }
+  }
+  return Poly_Gen_Relation::subsumes();
+}
+
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included) const {
+  // `expr' should be dimension-compatible with `*this'.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible((maximize
+                                  ? "maximize(e, ...)"
+                                  : "minimize(e, ...)"), "e", expr);
+  // Deal with zero-dim Box first.
+  if (space_dim == 0) {
+    if (marked_empty())
+      return false;
+    else {
+      ext_n = expr.inhomogeneous_term();
+      ext_d = 1;
+      included = true;
+      return true;
+    }
+  }
+
+  // For an empty Box we simply return false.
+  if (is_empty())
+    return false;
+
+  PPL_DIRTY_TEMP(mpq_class, result);
+  assign_r(result, expr.inhomogeneous_term(), ROUND_NOT_NEEDED);
+  bool is_included = true;
+  const int maximize_sign = maximize ? 1 : -1;
+  PPL_DIRTY_TEMP(mpq_class, bound_i);
+  PPL_DIRTY_TEMP(mpq_class, expr_i);
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.end(); i != i_end; ++i) {
+    const ITV& seq_i = seq[i.variable().id()];
+    assign_r(expr_i, *i, ROUND_NOT_NEEDED);
+    switch (sgn(expr_i) * maximize_sign) {
+    case 1:
+      if (seq_i.upper_is_boundary_infinity())
+        return false;
+      assign_r(bound_i, seq_i.upper(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.upper_is_open())
+        is_included = false;
+      break;
+    case 0:
+      PPL_UNREACHABLE;
+      break;
+    case -1:
+      if (seq_i.lower_is_boundary_infinity())
+        return false;
+      assign_r(bound_i, seq_i.lower(), ROUND_NOT_NEEDED);
+      add_mul_assign_r(result, bound_i, expr_i, ROUND_NOT_NEEDED);
+      if (seq_i.lower_is_open())
+        is_included = false;
+      break;
+    }
+  }
+  // Extract output info.
+  PPL_ASSERT(is_canonical(result));
+  ext_n = result.get_num();
+  ext_d = result.get_den();
+  included = is_included;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::max_min(const Linear_Expression& expr,
+                  const bool maximize,
+                  Coefficient& ext_n, Coefficient& ext_d,
+                  bool& included,
+                  Generator& g) const {
+  if (!max_min(expr, maximize, ext_n, ext_d, included))
+    return false;
+
+  // Compute generator `g'.
+  Linear_Expression g_expr;
+  PPL_DIRTY_TEMP(Coefficient, g_divisor);
+  g_divisor = 1;
+  const int maximize_sign = maximize ? 1 : -1;
+  PPL_DIRTY_TEMP(mpq_class, g_coord);
+  PPL_DIRTY_TEMP(Coefficient, numer);
+  PPL_DIRTY_TEMP(Coefficient, denom);
+  PPL_DIRTY_TEMP(Coefficient, lcm);
+  PPL_DIRTY_TEMP(Coefficient, factor);
+  // TODO: Check if the following loop can be optimized to exploit the
+  // (possible) sparseness of expr.
+  for (dimension_type i = space_dimension(); i-- > 0; ) {
+    const ITV& seq_i = seq[i];
+    switch (sgn(expr.coefficient(Variable(i))) * maximize_sign) {
+    case 1:
+      assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+      break;
+    case 0:
+      // If 0 belongs to the interval, choose it
+      // (and directly proceed to the next iteration).
+      // FIXME: name qualification issue.
+      if (seq_i.contains(0))
+        continue;
+      if (!seq_i.lower_is_boundary_infinity())
+        if (seq_i.lower_is_open())
+          if (!seq_i.upper_is_boundary_infinity())
+            if (seq_i.upper_is_open()) {
+              // Bounded and open interval: compute middle point.
+              assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+              PPL_DIRTY_TEMP(mpq_class, q_seq_i_upper);
+              assign_r(q_seq_i_upper, seq_i.upper(), ROUND_NOT_NEEDED);
+              g_coord += q_seq_i_upper;
+              g_coord /= 2;
+            }
+            else
+              // The upper bound is in the interval.
+              assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+          else {
+            // Lower is open, upper is unbounded.
+            assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+            ++g_coord;
+          }
+        else
+          // The lower bound is in the interval.
+          assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      else {
+        // Lower is unbounded, hence upper is bounded
+        // (since we know that 0 does not belong to the interval).
+        PPL_ASSERT(!seq_i.upper_is_boundary_infinity());
+        assign_r(g_coord, seq_i.upper(), ROUND_NOT_NEEDED);
+        if (seq_i.upper_is_open())
+          --g_coord;
+      }
+      break;
+    case -1:
+      assign_r(g_coord, seq_i.lower(), ROUND_NOT_NEEDED);
+      break;
+    }
+    // Add g_coord * Variable(i) to the generator.
+    assign_r(denom, g_coord.get_den(), ROUND_NOT_NEEDED);
+    lcm_assign(lcm, g_divisor, denom);
+    exact_div_assign(factor, lcm, g_divisor);
+    g_expr *= factor;
+    exact_div_assign(factor, lcm, denom);
+    assign_r(numer, g_coord.get_num(), ROUND_NOT_NEEDED);
+    numer *= factor;
+    g_expr += numer * Variable(i);
+    g_divisor = lcm;
+  }
+  g = Generator::point(g_expr, g_divisor);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("contains(y)", y);
+
+  // If `y' is empty, then `x' contains `y'.
+  if (y.is_empty())
+    return true;
+
+  // If `x' is empty, then `x' cannot contain `y'.
+  if (x.is_empty())
+    return false;
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (!x.seq[k].contains(y.seq[k]))
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_disjoint_from(const Box& y) const {
+  const Box& x = *this;
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("is_disjoint_from(y)", y);
+
+  // If any of `x' or `y' is marked empty, then they are disjoint.
+  // Note: no need to use `is_empty', as the following loop is anyway correct.
+  if (x.marked_empty() || y.marked_empty())
+    return true;
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    // FIXME: fix this name qualification issue.
+    if (x.seq[k].is_disjoint_from(y.seq[k]))
+      return true;
+  return false;
+}
+
+template <typename ITV>
+inline bool
+Box<ITV>::upper_bound_assign_if_exact(const Box& y) {
+  Box& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("upper_bound_assign_if_exact(y)", y);
+
+  // The lub of a box with an empty box is equal to the first box.
+  if (y.is_empty())
+    return true;
+  if (x.is_empty()) {
+    x = y;
+    return true;
+  }
+
+  bool x_j_does_not_contain_y_j = false;
+  bool y_j_does_not_contain_x_j = false;
+
+  for (dimension_type i = x.seq.size(); i-- > 0; ) {
+    const ITV& x_seq_i = x.seq[i];
+    const ITV& y_seq_i = y.seq[i];
+
+    if (!x_seq_i.can_be_exactly_joined_to(y_seq_i))
+      return false;
+
+    // Note: the use of `y_i_does_not_contain_x_i' is needed
+    // because we want to temporarily preserve the old value
+    // of `y_j_does_not_contain_x_j'.
+    bool y_i_does_not_contain_x_i = !y_seq_i.contains(x_seq_i);
+    if (y_i_does_not_contain_x_i && x_j_does_not_contain_y_j)
+      return false;
+    if (!x_seq_i.contains(y_seq_i)) {
+      if (y_j_does_not_contain_x_j)
+        return false;
+      else
+        x_j_does_not_contain_y_j = true;
+    }
+    if (y_i_does_not_contain_x_i)
+      y_j_does_not_contain_x_j = true;
+  }
+
+  // The upper bound is exact: compute it into *this.
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    x.seq[k].join_assign(y.seq[k]);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::OK() const {
+  if (status.test_empty_up_to_date() && !status.test_empty()) {
+    Box tmp = *this;
+    tmp.reset_empty_up_to_date();
+    if (tmp.check_empty()) {
+#ifndef NDEBUG
+      std::cerr << "The box is empty, but it is marked as non-empty."
+                << std::endl;
+#endif // NDEBUG
+      return false;
+    }
+  }
+
+  // A box that is not marked empty must have meaningful intervals.
+  if (!marked_empty()) {
+    for (dimension_type k = seq.size(); k-- > 0; )
+      if (!seq[k].OK())
+        return false;
+  }
+
+  return true;
+}
+
+template <typename ITV>
+dimension_type
+Box<ITV>::affine_dimension() const {
+  dimension_type d = space_dimension();
+  // A zero-space-dim box always has affine dimension zero.
+  if (d == 0)
+    return 0;
+
+  // An empty box has affine dimension zero.
+  if (is_empty())
+    return 0;
+
+  for (dimension_type k = d; k-- > 0; )
+    if (seq[k].is_singleton())
+      --d;
+
+  return d;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::check_empty() const {
+  PPL_ASSERT(!marked_empty());
+  Box<ITV>& x = const_cast<Box<ITV>&>(*this);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (seq[k].is_empty()) {
+      x.set_empty();
+      return true;
+    }
+  x.set_nonempty();
+  return false;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_universe() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_universe())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_topologically_closed() const {
+  if (ITV::is_always_topologically_closed() || is_empty())
+    return true;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_topologically_closed())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_discrete() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_singleton())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::is_bounded() const {
+  if (is_empty())
+    return true;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].is_bounded())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::contains_integer_point() const {
+  if (marked_empty())
+    return false;
+  for (dimension_type k = seq.size(); k-- > 0; )
+    if (!seq[k].contains_integer_point())
+      return false;
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::frequency(const Linear_Expression& expr,
+                  Coefficient& freq_n, Coefficient& freq_d,
+                  Coefficient& val_n, Coefficient& val_d) const {
+  dimension_type space_dim = space_dimension();
+  // The dimension of `expr' must be at most the dimension of *this.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("frequency(e, ...)", "e", expr);
+
+  // Check if `expr' has a constant value.
+  // If it is constant, set the frequency `freq_n' to 0
+  // and return true. Otherwise the values for \p expr
+  // are not discrete so return false.
+
+  // Space dimension is 0: if empty, then return false;
+  // otherwise the frequency is 0 and the value is the inhomogeneous term.
+  if (space_dim == 0) {
+    if (is_empty())
+      return false;
+    freq_n = 0;
+    freq_d = 1;
+    val_n = expr.inhomogeneous_term();
+    val_d = 1;
+    return true;
+  }
+
+  // For an empty Box, we simply return false.
+  if (is_empty())
+    return false;
+
+  // The Box has at least 1 dimension and is not empty.
+  PPL_DIRTY_TEMP_COEFFICIENT(numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(denom);
+  PPL_DIRTY_TEMP(mpq_class, tmp);
+  Coefficient c = expr.inhomogeneous_term();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(val_denom);
+  val_denom = 1;
+
+  for (Linear_Expression::const_iterator i = expr.begin(), i_end = expr.end();
+       i != i_end; ++i) {
+    const ITV& seq_i = seq[i.variable().id()];
+    // Check if `v' is constant in the BD shape.
+    if (seq_i.is_singleton()) {
+      // If `v' is constant, replace it in `le' by the value.
+      assign_r(tmp, seq_i.lower(), ROUND_NOT_NEEDED);
+      numer = tmp.get_num();
+      denom = tmp.get_den();
+      c *= denom;
+      c += numer * val_denom * (*i);
+      val_denom *= denom;
+      continue;
+    }
+    // The expression `expr' is not constant.
+    return false;
+  }
+
+  // The expression `expr' is constant.
+  freq_n = 0;
+  freq_d = 1;
+
+  // Reduce `val_n' and `val_d'.
+  normalize2(c, val_denom, val_n, val_d);
+  return true;
+}
+
+template <typename ITV>
+bool
+Box<ITV>::constrains(Variable var) const {
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dimension() < var_space_dim)
+    throw_dimension_incompatible("constrains(v)", "v", var);
+
+  if (marked_empty() || !seq[var_space_dim-1].is_universe())
+    return true;
+  // Now force an emptiness check.
+  return is_empty();
+}
+
+template <typename ITV>
+void
+Box<ITV>::unconstrain(const Variables_Set& vars) {
+  // The cylindrification with respect to no dimensions is a no-op.
+  // This case also captures the only legal cylindrification
+  // of a box in a 0-dim space.
+  if (vars.empty())
+    return;
+
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("unconstrain(vs)", min_space_dim);
+
+  // If the box is already empty, there is nothing left to do.
+  if (marked_empty())
+    return;
+
+  // Here the box might still be empty (but we haven't detected it yet):
+  // check emptiness of the interval for each of the variables in
+  // `vars' before cylindrification.
+  for (Variables_Set::const_iterator vsi = vars.begin(),
+         vsi_end = vars.end(); vsi != vsi_end; ++vsi) {
+    ITV& seq_vsi = seq[*vsi];
+    if (!seq_vsi.is_empty())
+      seq_vsi.assign(UNIVERSE);
+    else {
+      set_empty();
+      break;
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::topological_closure_assign() {
+  if (ITV::is_always_topologically_closed() || is_empty())
+    return;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    seq[k].topological_closure_assign();
+}
+
+template <typename ITV>
+void
+Box<ITV>::wrap_assign(const Variables_Set& vars,
+                      Bounded_Integer_Type_Width w,
+                      Bounded_Integer_Type_Representation r,
+                      Bounded_Integer_Type_Overflow o,
+                      const Constraint_System* cs_p,
+                      unsigned complexity_threshold,
+                      bool wrap_individually) {
+#if 0 // Generic implementation commented out.
+  Implementation::wrap_assign(*this,
+                              vars, w, r, o, cs_p,
+                              complexity_threshold, wrap_individually,
+                              "Box");
+#else // Specialized implementation.
+  PPL_USED(wrap_individually);
+  PPL_USED(complexity_threshold);
+  Box& x = *this;
+
+  // Dimension-compatibility check for `*cs_p', if any.
+  const dimension_type vars_space_dim = vars.space_dimension();
+  if (cs_p != 0 && cs_p->space_dimension() > vars_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Box<ITV>::wrap_assign(vars, w, r, o, cs_p, ...):"
+      << std::endl
+      << "vars.space_dimension() == " << vars_space_dim
+      << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Wrapping no variable only requires refining with *cs_p, if any.
+  if (vars.empty()) {
+    if (cs_p != 0)
+      refine_with_constraints(*cs_p);
+    return;
+  }
+
+  // Dimension-compatibility check for `vars'.
+  const dimension_type space_dim = x.space_dimension();
+  if (space_dim < vars_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Box<ITV>::wrap_assign(vars, ...):"
+      << std::endl
+      << "this->space_dimension() == " << space_dim
+      << ", required space dimension == " << vars_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Wrapping an empty polyhedron is a no-op.
+  if (x.is_empty())
+    return;
+
+  // FIXME: temporarily (ab-) using Coefficient.
+  // Set `min_value' and `max_value' to the minimum and maximum values
+  // a variable of width `w' and signedness `s' can take.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  if (r == UNSIGNED) {
+    min_value = 0;
+    mul_2exp_assign(max_value, Coefficient_one(), w);
+    --max_value;
+  }
+  else {
+    PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+    mul_2exp_assign(max_value, Coefficient_one(), w-1);
+    neg_assign(min_value, max_value);
+    --max_value;
+  }
+
+  // FIXME: Build the (integer) quadrant interval.
+  PPL_DIRTY_TEMP(ITV, integer_quadrant_itv);
+  PPL_DIRTY_TEMP(ITV, rational_quadrant_itv);
+  {
+    I_Constraint<Coefficient> lower = i_constraint(GREATER_OR_EQUAL, min_value);
+    I_Constraint<Coefficient> upper = i_constraint(LESS_OR_EQUAL, max_value);
+    integer_quadrant_itv.build(lower, upper);
+    // The rational quadrant is only needed if overflow is undefined.
+    if (o == OVERFLOW_UNDEFINED) {
+      ++max_value;
+      upper = i_constraint(LESS_THAN, max_value);
+      rational_quadrant_itv.build(lower, upper);
+    }
+  }
+
+  const Variables_Set::const_iterator vs_end = vars.end();
+
+  if (cs_p == 0) {
+    // No constraint refinement is needed here.
+    switch (o) {
+    case OVERFLOW_WRAPS:
+      for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+        x.seq[*i].wrap_assign(w, r, integer_quadrant_itv);
+      reset_empty_up_to_date();
+      break;
+    case OVERFLOW_UNDEFINED:
+      for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+        ITV& x_seq_v = x.seq[*i];
+        if (!rational_quadrant_itv.contains(x_seq_v)) {
+          x_seq_v.assign(integer_quadrant_itv);
+        }
+      }
+      break;
+    case OVERFLOW_IMPOSSIBLE:
+      for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i)
+        x.seq[*i].intersect_assign(integer_quadrant_itv);
+      reset_empty_up_to_date();
+      break;
+    }
+    PPL_ASSERT(x.OK());
+    return;
+  }
+
+  PPL_ASSERT(cs_p != 0);
+  const Constraint_System& cs = *cs_p;
+  // A map associating interval constraints to variable indexes.
+  typedef std::map<dimension_type, std::vector<const Constraint*> > map_type;
+  map_type var_cs_map;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         i_end = cs.end(); i != i_end; ++i) {
+    const Constraint& c = *i;
+    dimension_type c_num_vars = 0;
+    dimension_type c_only_var = 0;
+    if (Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+      if (c_num_vars == 1) {
+        // An interval constraint on variable index `c_only_var'.
+        PPL_ASSERT(c_only_var < space_dim);
+        // We do care about c if c_only_var is going to be wrapped.
+        if (vars.find(c_only_var) != vs_end)
+          var_cs_map[c_only_var].push_back(&c);
+      }
+      else {
+        PPL_ASSERT(c_num_vars == 0);
+        // Note: tautologies have been filtered out by iterators.
+        PPL_ASSERT(c.is_inconsistent());
+        x.set_empty();
+        return;
+      }
+    }
+  }
+
+  PPL_DIRTY_TEMP(ITV, refinement_itv);
+  const map_type::const_iterator var_cs_map_end = var_cs_map.end();
+  // Loop through the variable indexes in `vars'.
+  for (Variables_Set::const_iterator i = vars.begin(); i != vs_end; ++i) {
+    const dimension_type v = *i;
+    refinement_itv = integer_quadrant_itv;
+    // Look for the refinement constraints for space dimension index `v'.
+    map_type::const_iterator var_cs_map_iter = var_cs_map.find(v);
+    if (var_cs_map_iter != var_cs_map_end) {
+      // Refine interval for variable `v'.
+      const map_type::mapped_type& var_cs = var_cs_map_iter->second;
+      for (dimension_type j = var_cs.size(); j-- > 0; ) {
+        const Constraint& c = *var_cs[j];
+        refine_interval_no_check(refinement_itv,
+                                 c.type(),
+                                 c.inhomogeneous_term(),
+                                 c.coefficient(Variable(v)));
+      }
+    }
+    // Wrap space dimension index `v'.
+    ITV& x_seq_v = x.seq[v];
+    switch (o) {
+    case OVERFLOW_WRAPS:
+      x_seq_v.wrap_assign(w, r, refinement_itv);
+      break;
+    case OVERFLOW_UNDEFINED:
+      if (!rational_quadrant_itv.contains(x_seq_v))
+        x_seq_v.assign(UNIVERSE);
+      break;
+    case OVERFLOW_IMPOSSIBLE:
+      x_seq_v.intersect_assign(refinement_itv);
+      break;
+    }
+  }
+  PPL_ASSERT(x.OK());
+#endif
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(Complexity_Class) {
+  if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+      && !ITV::info_type::store_open)
+    return;
+
+  if (marked_empty())
+    return;
+
+  for (dimension_type k = seq.size(); k-- > 0; )
+    seq[k].drop_some_non_integer_points();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::drop_some_non_integer_points(const Variables_Set& vars,
+                                       Complexity_Class) {
+  // Dimension-compatibility check.
+  const dimension_type min_space_dim = vars.space_dimension();
+  if (space_dimension() < min_space_dim)
+    throw_dimension_incompatible("drop_some_non_integer_points(vs, cmpl)",
+                                 min_space_dim);
+
+  if (std::numeric_limits<typename ITV::boundary_type>::is_integer
+      && !ITV::info_type::store_open)
+    return;
+
+  if (marked_empty())
+    return;
+
+  for (Variables_Set::const_iterator v_i = vars.begin(),
+         v_end = vars.end(); v_i != v_end; ++v_i)
+    seq[*v_i].drop_some_non_integer_points();
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::intersection_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("intersection_assign(y)", y);
+
+  // If one of the two boxes is empty, the intersection is empty.
+  if (x.marked_empty())
+    return;
+  if (y.marked_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  // If both boxes are zero-dimensional, then at this point they are
+  // necessarily non-empty, so that their intersection is non-empty too.
+  if (space_dim == 0)
+    return;
+
+  // FIXME: here we may conditionally exploit a capability of the
+  // underlying interval to eagerly detect empty results.
+  reset_empty_up_to_date();
+
+  for (dimension_type k = space_dim; k-- > 0; )
+    x.seq[k].intersect_assign(y.seq[k]);
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::upper_bound_assign(const Box& y) {
+  Box& x = *this;
+
+  // Dimension-compatibility check.
+  if (x.space_dimension() != y.space_dimension())
+    x.throw_dimension_incompatible("upper_bound_assign(y)", y);
+
+  // The lub of a box with an empty box is equal to the first box.
+  if (y.is_empty())
+    return;
+  if (x.is_empty()) {
+    x = y;
+    return;
+  }
+
+  for (dimension_type k = x.seq.size(); k-- > 0; )
+    x.seq[k].join_assign(y.seq[k]);
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::concatenate_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+  const dimension_type y_space_dim = y.space_dimension();
+
+  // If `y' is marked empty, the result will be empty too.
+  if (y.marked_empty())
+    x.set_empty();
+
+  // If `y' is a 0-dim space box, there is nothing left to do.
+  if (y_space_dim == 0)
+    return;
+  // The resulting space dimension must be at most the maximum.
+  check_space_dimension_overflow(y.space_dimension(),
+                                 max_space_dimension() - space_dimension(),
+                                 "PPL::Box::",
+                                 "concatenate_assign(y)",
+                                 "concatenation exceeds the maximum "
+                                 "allowed space dimension");
+  // Here `y_space_dim > 0', so that a non-trivial concatenation will occur:
+  // make sure that reallocation will occur once at most.
+  x.seq.reserve(x_space_dim + y_space_dim);
+
+  // If `x' is marked empty, then it is sufficient to adjust
+  // the dimension of the vector space.
+  if (x.marked_empty()) {
+    x.seq.insert(x.seq.end(), y_space_dim, ITV(EMPTY));
+    PPL_ASSERT(x.OK());
+    return;
+  }
+
+  // Here neither `x' nor `y' are marked empty: concatenate them.
+  std::copy(y.seq.begin(), y.seq.end(),
+            std::back_insert_iterator<Sequence>(x.seq));
+  // Update the `empty_up_to_date' flag.
+  if (!y.status.test_empty_up_to_date())
+    reset_empty_up_to_date();
+
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::difference_assign(const Box& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("difference_assign(y)", y);
+
+  Box& x = *this;
+  if (x.is_empty() || y.is_empty())
+    return;
+
+  switch (space_dim) {
+  case 0:
+    // If `x' is zero-dimensional, then at this point both `x' and `y'
+    // are the universe box, so that their difference is empty.
+    x.set_empty();
+    break;
+
+  case 1:
+    x.seq[0].difference_assign(y.seq[0]);
+    if (x.seq[0].is_empty())
+      x.set_empty();
+    break;
+
+  default:
+    {
+      dimension_type index_non_contained = space_dim;
+      dimension_type number_non_contained = 0;
+      for (dimension_type i = space_dim; i-- > 0; )
+        if (!y.seq[i].contains(x.seq[i])) {
+          if (++number_non_contained == 1)
+            index_non_contained = i;
+          else
+            break;
+        }
+
+      switch (number_non_contained) {
+      case 0:
+        // `y' covers `x': the difference is empty.
+        x.set_empty();
+        break;
+      case 1:
+        x.seq[index_non_contained]
+          .difference_assign(y.seq[index_non_contained]);
+        if (x.seq[index_non_contained].is_empty())
+          x.set_empty();
+        break;
+      default:
+        // Nothing to do: the difference is `x'.
+        break;
+      }
+    }
+    break;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+bool
+Box<ITV>::simplify_using_context_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type num_dims = x.space_dimension();
+  // Dimension-compatibility check.
+  if (num_dims != y.space_dimension())
+    x.throw_dimension_incompatible("simplify_using_context_assign(y)", y);
+
+  // Filter away the zero-dimensional case.
+  if (num_dims == 0) {
+    if (y.marked_empty()) {
+      x.set_nonempty();
+      return false;
+    }
+    else
+      return !x.marked_empty();
+  }
+
+  // Filter away the case when `y' is empty.
+  if (y.is_empty()) {
+    for (dimension_type i = num_dims; i-- > 0; )
+      x.seq[i].assign(UNIVERSE);
+    x.set_nonempty();
+    return false;
+  }
+
+  if (x.is_empty()) {
+    // Find in `y' a non-universe interval, if any.
+    for (dimension_type i = 0; i < num_dims; ++i) {
+      if (y.seq[i].is_universe())
+        x.seq[i].assign(UNIVERSE);
+      else {
+        // Set x.seq[i] so as to contradict y.seq[i], if possible.
+        ITV& seq_i = x.seq[i];
+        seq_i.empty_intersection_assign(y.seq[i]);
+        if (seq_i.is_empty()) {
+          // We were not able to assign to `seq_i' a non-empty interval:
+          // reset `seq_i' to the universe interval and keep searching.
+          seq_i.assign(UNIVERSE);
+          continue;
+        }
+        // We assigned to `seq_i' a non-empty interval:
+        // set the other intervals to universe and return.
+        for (++i; i < num_dims; ++i)
+          x.seq[i].assign(UNIVERSE);
+        x.set_nonempty();
+        PPL_ASSERT(x.OK());
+        return false;
+      }
+    }
+    // All intervals in `y' are universe or could not be contradicted:
+    // simplification can leave the empty box `x' as is.
+    PPL_ASSERT(x.OK() && x.is_empty());
+    return false;
+  }
+
+  // Loop index `i' is intentionally going upwards.
+  for (dimension_type i = 0; i < num_dims; ++i) {
+    if (!x.seq[i].simplify_using_context_assign(y.seq[i])) {
+      PPL_ASSERT(!x.seq[i].is_empty());
+      // The intersection of `x' and `y' is empty due to the i-th interval:
+      // reset other intervals to UNIVERSE.
+      for (dimension_type j = num_dims; j-- > i; )
+        x.seq[j].assign(UNIVERSE);
+      for (dimension_type j = i; j-- > 0; )
+        x.seq[j].assign(UNIVERSE);
+      PPL_ASSERT(x.OK());
+      return false;
+    }
+  }
+  PPL_ASSERT(x.OK());
+  return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::time_elapse_assign(const Box& y) {
+  Box& x = *this;
+  const dimension_type x_space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    x.throw_dimension_incompatible("time_elapse_assign(y)", y);
+
+  // Dealing with the zero-dimensional case.
+  if (x_space_dim == 0) {
+    if (y.marked_empty())
+      x.set_empty();
+    return;
+  }
+
+  // If either one of `x' or `y' is empty, the result is empty too.
+  // Note: if possible, avoid cost of checking for emptiness.
+  if (x.marked_empty() || y.marked_empty()
+      || x.is_empty() || y.is_empty()) {
+    x.set_empty();
+    return;
+  }
+
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    ITV& x_seq_i = x.seq[i];
+    const ITV& y_seq_i = y.seq[i];
+    if (!x_seq_i.lower_is_boundary_infinity())
+      if (y_seq_i.lower_is_boundary_infinity() || y_seq_i.lower() < 0)
+        x_seq_i.lower_extend();
+    if (!x_seq_i.upper_is_boundary_infinity())
+      if (y_seq_i.upper_is_boundary_infinity() || y_seq_i.upper() > 0)
+        x_seq_i.upper_extend();
+  }
+  PPL_ASSERT(x.OK());
+}
+
+template <typename ITV>
+inline void
+Box<ITV>::remove_space_dimensions(const Variables_Set& vars) {
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // space dimensions from a box in a zero-dimensional space.
+  if (vars.empty()) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  const dimension_type old_space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  const dimension_type vsi_space_dim = vars.space_dimension();
+  if (old_space_dim < vsi_space_dim)
+    throw_dimension_incompatible("remove_space_dimensions(vs)",
+                                 vsi_space_dim);
+
+  const dimension_type new_space_dim = old_space_dim - vars.size();
+
+  // If the box is empty (this must be detected), then resizing is all
+  // what is needed.  If it is not empty and we are removing _all_ the
+  // dimensions then, again, resizing suffices.
+  if (is_empty() || new_space_dim == 0) {
+    seq.resize(new_space_dim);
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  // For each variable to be removed, we fill the corresponding interval
+  // by shifting left those intervals that will not be removed.
+  Variables_Set::const_iterator vsi = vars.begin();
+  Variables_Set::const_iterator vsi_end = vars.end();
+  dimension_type dst = *vsi;
+  dimension_type src = dst + 1;
+  for (++vsi; vsi != vsi_end; ++vsi) {
+    const dimension_type vsi_next = *vsi;
+    // All intervals in between are moved to the left.
+    while (src < vsi_next)
+      swap(seq[dst++], seq[src++]);
+    ++src;
+  }
+  // Moving the remaining intervals.
+  while (src < old_space_dim)
+    swap(seq[dst++], seq[src++]);
+
+  PPL_ASSERT(dst == new_space_dim);
+  seq.resize(new_space_dim);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::remove_higher_space_dimensions(const dimension_type new_dimension) {
+  // Dimension-compatibility check: the variable having
+  // maximum index is the one occurring last in the set.
+  const dimension_type space_dim = space_dimension();
+  if (new_dimension > space_dim)
+    throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+                                 new_dimension);
+
+  // The removal of no dimensions from any box is a no-op.
+  // Note that this case also captures the only legal removal of
+  // dimensions from a zero-dim space box.
+  if (new_dimension == space_dim) {
+    PPL_ASSERT(OK());
+    return;
+  }
+
+  seq.resize(new_dimension);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename Partial_Function>
+void
+Box<ITV>::map_space_dimensions(const Partial_Function& pfunc) {
+  const dimension_type space_dim = space_dimension();
+  if (space_dim == 0)
+    return;
+
+  if (pfunc.has_empty_codomain()) {
+    // All dimensions vanish: the box becomes zero_dimensional.
+    remove_higher_space_dimensions(0);
+    return;
+  }
+
+  const dimension_type new_space_dim = pfunc.max_in_codomain() + 1;
+  // If the box is empty, then simply adjust the space dimension.
+  if (is_empty()) {
+    remove_higher_space_dimensions(new_space_dim);
+    return;
+  }
+
+  // We create a new Box with the new space dimension.
+  Box<ITV> tmp(new_space_dim);
+  // Map the intervals, exchanging the indexes.
+  for (dimension_type i = 0; i < space_dim; ++i) {
+    dimension_type new_i;
+    if (pfunc.maps(i, new_i))
+      swap(seq[i], tmp.seq[new_i]);
+  }
+  m_swap(tmp);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::fold_space_dimensions(const Variables_Set& vars,
+                                const Variable dest) {
+  const dimension_type space_dim = space_dimension();
+  // `dest' should be one of the dimensions of the box.
+  if (dest.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)", "v", dest);
+
+  // The folding of no dimensions is a no-op.
+  if (vars.empty())
+    return;
+
+  // All variables in `vars' should be dimensions of the box.
+  if (vars.space_dimension() > space_dim)
+    throw_dimension_incompatible("fold_space_dimensions(vs, v)",
+                                 vars.space_dimension());
+
+  // Moreover, `dest.id()' should not occur in `vars'.
+  if (vars.find(dest.id()) != vars.end())
+    throw_invalid_argument("fold_space_dimensions(vs, v)",
+                           "v should not occur in vs");
+
+  // Note: the check for emptiness is needed for correctness.
+  if (!is_empty()) {
+    // Join the interval corresponding to variable `dest' with the intervals
+    // corresponding to the variables in `vars'.
+    ITV& seq_v = seq[dest.id()];
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vs_end = vars.end(); i != vs_end; ++i)
+      seq_v.join_assign(seq[*i]);
+  }
+  remove_space_dimensions(vars);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraint_no_check(const Constraint& c) {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+  // Throw an exception if c is not an interval constraints.
+  if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+    throw_invalid_argument("add_constraint(c)",
+                           "c is not an interval constraint");
+
+  // Throw an exception if c is a nontrivial strict constraint
+  // and ITV does not support open boundaries.
+  if (c.is_strict_inequality() && c_num_vars != 0
+      && ITV::is_always_topologically_closed())
+    throw_invalid_argument("add_constraint(c)",
+                           "c is a nontrivial strict constraint");
+
+  // Avoid doing useless work if the box is known to be empty.
+  if (marked_empty())
+    return;
+
+  const Coefficient& n = c.inhomogeneous_term();
+  if (c_num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (n < 0
+        || (c.is_equality() && n != 0)
+        || (c.is_strict_inequality() && n == 0))
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(c_num_vars == 1);
+  const Coefficient& d = c.coefficient(Variable(c_only_var));
+  add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_constraints_no_check(const Constraint_System& cs) {
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+  // Note: even when the box is known to be empty, we need to go
+  // through all the constraints to fulfill the method's contract
+  // for what concerns exception throwing.
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    add_constraint_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruence_no_check(const Congruence& cg) {
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  // Set aside the case of proper congruences.
+  if (cg.is_proper_congruence()) {
+    if (cg.is_inconsistent()) {
+      set_empty();
+      return;
+    }
+    else if (cg.is_tautological())
+      return;
+    else
+      throw_invalid_argument("add_congruence(cg)",
+                             "cg is a nontrivial proper congruence");
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  dimension_type cg_num_vars = 0;
+  dimension_type cg_only_var = 0;
+  // Throw an exception if c is not an interval congruence.
+  if (!Box_Helpers::extract_interval_congruence(cg, cg_num_vars, cg_only_var))
+    throw_invalid_argument("add_congruence(cg)",
+                           "cg is not an interval congruence");
+
+  // Avoid doing useless work if the box is known to be empty.
+  if (marked_empty())
+    return;
+
+  const Coefficient& n = cg.inhomogeneous_term();
+  if (cg_num_vars == 0) {
+    // Dealing with a trivial equality congruence.
+    if (n != 0)
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(cg_num_vars == 1);
+  const Coefficient& d = cg.coefficient(Variable(cg_only_var));
+  add_interval_constraint_no_check(cg_only_var, Constraint::EQUALITY, n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::add_congruences_no_check(const Congruence_System& cgs) {
+  PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+  // Note: even when the box is known to be empty, we need to go
+  // through all the congruences to fulfill the method's contract
+  // for what concerns exception throwing.
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    add_congruence_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint& c) {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+  PPL_ASSERT(!marked_empty());
+
+  dimension_type c_num_vars = 0;
+  dimension_type c_only_var = 0;
+  // Non-interval constraints are approximated.
+  if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var)) {
+    propagate_constraint_no_check(c);
+    return;
+  }
+
+  const Coefficient& n = c.inhomogeneous_term();
+  if (c_num_vars == 0) {
+    // Dealing with a trivial constraint.
+    if (n < 0
+        || (c.is_equality() && n != 0)
+        || (c.is_strict_inequality() && n == 0))
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(c_num_vars == 1);
+  const Coefficient& d = c.coefficient(Variable(c_only_var));
+  add_interval_constraint_no_check(c_only_var, c.type(), n, d);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Constraint_System& cs) {
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); !marked_empty() && i != cs_end; ++i)
+    refine_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence& cg) {
+  PPL_ASSERT(!marked_empty());
+
+  PPL_ASSERT(cg.space_dimension() <= space_dimension());
+
+  if (cg.is_proper_congruence()) {
+    // A proper congruences is also an interval constraint
+    // if and only if it is trivial.
+    if (cg.is_inconsistent())
+      set_empty();
+    return;
+  }
+
+  PPL_ASSERT(cg.is_equality());
+  Constraint c(cg);
+  refine_no_check(c);
+}
+
+template <typename ITV>
+void
+Box<ITV>::refine_no_check(const Congruence_System& cgs) {
+  PPL_ASSERT(cgs.space_dimension() <= space_dimension());
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); !marked_empty() && i != cgs_end; ++i)
+    refine_no_check(*i);
+  PPL_ASSERT(OK());
+}
+
+#if 1 // Alternative implementations for propagate_constraint_no_check.
+namespace Implementation {
+
+namespace Boxes {
+
+inline bool
+propagate_constraint_check_result(Result r, Ternary& open) {
+  r = result_relation_class(r);
+  switch (r) {
+  case V_GT_MINUS_INFINITY:
+  case V_LT_PLUS_INFINITY:
+    return true;
+  case V_LT:
+  case V_GT:
+    open = T_YES;
+    return false;
+  case V_LE:
+  case V_GE:
+    if (open == T_NO)
+      open = T_MAYBE;
+    return false;
+  case V_EQ:
+    return false;
+  default:
+    PPL_UNREACHABLE;
+    return true;
+  }
+}
+
+} // namespace Boxes
+
+} // namespace Implementation
+
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+  using namespace Implementation::Boxes;
+
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  typedef
+    typename Select_Temp_Boundary_Type<typename ITV::boundary_type>::type
+    Temp_Boundary_Type;
+
+  const dimension_type c_space_dim = c.space_dimension();
+  const Constraint::Type c_type = c.type();
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+
+  // Find a space dimension having a non-zero coefficient (if any).
+  const dimension_type last_k
+    = c.expression().last_nonzero(1, c_space_dim + 1);
+  if (last_k == c_space_dim + 1) {
+    // Constraint c is trivial: check if it is inconsistent.
+    if (c_inhomogeneous_term < 0
+        || (c_inhomogeneous_term == 0
+            && c_type != Constraint::NONSTRICT_INEQUALITY))
+      set_empty();
+    return;
+  }
+
+  // Here constraint c is non-trivial.
+  PPL_ASSERT(last_k <= c_space_dim);
+  Temp_Boundary_Type t_bound;
+  Temp_Boundary_Type t_a;
+  Temp_Boundary_Type t_x;
+  Ternary open;
+  const Constraint::expr_type c_e = c.expression();
+  for (Constraint::expr_type::const_iterator k = c_e.begin(),
+         k_end = c_e.lower_bound(Variable(last_k)); k != k_end; ++k) {
+    const Coefficient& a_k = *k;
+    const Variable k_var = k.variable();
+    const int sgn_a_k = sgn(a_k);
+    if (sgn_a_k == 0)
+      continue;
+    Result r;
+    if (sgn_a_k > 0) {
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+        maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(last_k)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.lower_is_boundary_infinity())
+            goto maybe_refine_upper_1;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.upper_is_boundary_infinity())
+            goto maybe_refine_upper_1;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_1;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_1;
+
+      // Refine the lower bound of `seq[k]' with `t_bound'.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      {
+        const Relation_Symbol rel
+          = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+        seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      }
+      reset_empty_up_to_date();
+    maybe_refine_upper_1:
+      if (c_type != Constraint::EQUALITY)
+        continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.upper_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.lower_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      const Relation_Symbol rel
+        = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+      seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      reset_empty_up_to_date();
+    }
+    else {
+      PPL_ASSERT(sgn_a_k < 0);
+      open = (c_type == Constraint::STRICT_INEQUALITY) ? T_YES : T_NO;
+      if (open == T_NO)
+        maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+      r = neg_assign_r(t_bound, t_bound, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.lower_is_boundary_infinity())
+            goto maybe_refine_upper_2;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.upper_is_boundary_infinity())
+            goto maybe_refine_upper_2;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto maybe_refine_upper_2;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto maybe_refine_upper_2;
+
+      // Refine the upper bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      {
+        const Relation_Symbol rel
+          = (open == T_YES) ? LESS_THAN : LESS_OR_EQUAL;
+        seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      }
+      reset_empty_up_to_date();
+    maybe_refine_upper_2:
+      if (c_type != Constraint::EQUALITY)
+        continue;
+      open = T_NO;
+      maybe_reset_fpu_inexact<Temp_Boundary_Type>();
+      r = assign_r(t_bound, c_inhomogeneous_term, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = neg_assign_r(t_bound, t_bound, ROUND_UP);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      for (Constraint::expr_type::const_iterator i = c_e.begin(),
+            i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+        const Variable i_var = i.variable();
+        if (i_var.id() == k_var.id())
+          continue;
+        const Coefficient& a_i = *i;
+        const int sgn_a_i = sgn(a_i);
+        ITV& x_i = seq[i_var.id()];
+        if (sgn_a_i < 0) {
+          if (x_i.upper_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.upper(), ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.upper_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+        else {
+          PPL_ASSERT(sgn_a_i > 0);
+          if (x_i.lower_is_boundary_infinity())
+            goto next_k;
+          r = assign_r(t_a, a_i, ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          r = assign_r(t_x, x_i.lower(), ROUND_DOWN);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+          if (x_i.lower_is_open())
+            open = T_YES;
+          r = sub_mul_assign_r(t_bound, t_a, t_x, ROUND_UP);
+          if (propagate_constraint_check_result(r, open))
+            goto next_k;
+        }
+      }
+      r = assign_r(t_a, a_k, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+      r = div_assign_r(t_bound, t_bound, t_a, ROUND_DOWN);
+      if (propagate_constraint_check_result(r, open))
+        goto next_k;
+
+      // Refine the lower bound of seq[k] with t_bound.
+      if (open == T_MAYBE
+          && maybe_check_fpu_inexact<Temp_Boundary_Type>() == 1)
+        open = T_YES;
+      const Relation_Symbol rel
+        = (open == T_YES) ? GREATER_THAN : GREATER_OR_EQUAL;
+      seq[k_var.id()].add_constraint(i_constraint(rel, t_bound));
+      reset_empty_up_to_date();
+    }
+  next_k:
+    ;
+  }
+}
+
+#else // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>::propagate_constraint_no_check(const Constraint& c) {
+  PPL_ASSERT(c.space_dimension() <= space_dimension());
+
+  dimension_type c_space_dim = c.space_dimension();
+  ITV k[c_space_dim];
+  ITV p[c_space_dim];
+  for (Constraint::expr_type::const_iterator i = c_e.begin(),
+        i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+    const Variable i_var = i.variable();
+    k[i_var.id()] = *i;
+    ITV& p_i = p[i_var.id()];
+    p_i = seq[i_var.id()];
+    p_i.mul_assign(p_i, k[i_var.id()]);
+  }
+  const Coefficient& inhomogeneous_term = c.inhomogeneous_term();
+  for (Constraint::expr_type::const_iterator i = c_e.begin(),
+        i_end = c_e.lower_bound(Variable(c_space_dim)); i != i_end; ++i) {
+    const Variable i_var = i.variable();
+    int sgn_coefficient_i = sgn(*i);
+    ITV q(inhomogeneous_term);
+    for (Constraint::expr_type::const_iterator j = c_e.begin(),
+          j_end = c_e.lower_bound(Variable(c_space_dim)); j != j_end; ++j) {
+      const Variable j_var = j.variable();
+      if (i_var == j_var)
+        continue;
+      q.add_assign(q, p[j_var.id()]);
+    }
+    q.div_assign(q, k[i_var.id()]);
+    q.neg_assign(q);
+    Relation_Symbol rel;
+    switch (c.type()) {
+    case Constraint::EQUALITY:
+      rel = EQUAL;
+      break;
+    case Constraint::NONSTRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_OR_EQUAL : LESS_OR_EQUAL;
+      break;
+    case Constraint::STRICT_INEQUALITY:
+      rel = (sgn_coefficient_i > 0) ? GREATER_THAN : LESS_THAN;
+      break;
+    }
+    seq[i_var.id()].add_constraint(i_constraint(rel, q));
+    // FIXME: could/should we exploit the return value of add_constraint
+    //        in case it is available?
+    // FIXME: should we instead be lazy and do not even bother about
+    //        the possibility the interval becomes empty apart from setting
+    //        empty_up_to_date = false?
+    if (seq[i_var.id()].is_empty()) {
+      set_empty();
+      break;
+    }
+  }
+
+  PPL_ASSERT(OK());
+}
+
+#endif // Alternative implementations for propagate_constraint_no_check.
+
+template <typename ITV>
+void
+Box<ITV>
+::propagate_constraints_no_check(const Constraint_System& cs,
+                                 const dimension_type max_iterations) {
+  const dimension_type space_dim = space_dimension();
+  PPL_ASSERT(cs.space_dimension() <= space_dim);
+
+  const Constraint_System::const_iterator cs_begin = cs.begin();
+  const Constraint_System::const_iterator cs_end = cs.end();
+  const dimension_type propagation_weight
+    = Implementation::num_constraints(cs) * space_dim;
+
+  Sequence copy;
+  bool changed;
+  dimension_type num_iterations = 0;
+  do {
+    WEIGHT_BEGIN();
+    ++num_iterations;
+    copy = seq;
+    for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i)
+      propagate_constraint_no_check(*i);
+
+    WEIGHT_ADD_MUL(40, propagation_weight);
+    // Check if the client has requested abandoning all expensive
+    // computations.  If so, the exception specified by the client
+    // is thrown now.
+    maybe_abandon();
+
+    // NOTE: if max_iterations == 0 (i.e., no iteration limit is set)
+    // the following test will anyway trigger on wrap around.
+    if (num_iterations == max_iterations)
+      break;
+
+    changed = (copy != seq);
+  } while (changed);
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_image(const Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_image(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  Tmp_Interval_Type expr_value;
+  Tmp_Interval_Type temp0;
+  Tmp_Interval_Type temp1;
+  expr_value.assign(expr.inhomogeneous_term());
+  for (Linear_Expression::const_iterator i = expr.begin(),
+          i_end = expr.end(); i != i_end; ++i) {
+    temp0.assign(*i);
+    temp1.assign(seq[i.variable().id()]);
+    temp0.mul_assign(temp0, temp1);
+    expr_value.add_assign(expr_value, temp0);
+  }
+  if (denominator != 1) {
+    temp0.assign(denominator);
+    expr_value.div_assign(expr_value, temp0);
+  }
+  seq[var.id()].assign(expr_value);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_form_image(const Variable var,
+                            const Linear_Form<ITV>& lf) {
+
+  // Check that ITV has a floating point boundary type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<typename ITV::boundary_type>
+            ::is_exact, "Box<ITV>::affine_form_image(Variable, Linear_Form):"
+                        "ITV has not a floating point boundary type.");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  const dimension_type lf_space_dim = lf.space_dimension();
+  if (space_dim < lf_space_dim)
+    throw_dimension_incompatible("affine_form_image(var, lf)", "lf", lf);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_form_image(var, lf)", "var", var);
+
+  if (is_empty())
+    return;
+
+  // Intervalization of 'lf'.
+  ITV result = lf.inhomogeneous_term();
+  for (dimension_type i = 0; i < lf_space_dim; ++i) {
+    ITV current_addend = lf.coefficient(Variable(i));
+    const ITV& curr_int = seq[i];
+    current_addend *= curr_int;
+    result += current_addend;
+  }
+
+  seq[var.id()].assign(result);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::affine_preimage(const Variable var,
+                          const Linear_Expression& expr,
+                          Coefficient_traits::const_reference
+                          denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("affine_preimage(v, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type x_space_dim = space_dimension();
+  const dimension_type expr_space_dim = expr.space_dimension();
+  if (x_space_dim < expr_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "e", expr);
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x_space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_preimage(v, e, d)", "v", var);
+
+  if (is_empty())
+    return;
+
+  const Coefficient& expr_v = expr.coefficient(var);
+  const bool invertible = (expr_v != 0);
+  if (!invertible) {
+    Tmp_Interval_Type expr_value;
+    Tmp_Interval_Type temp0;
+    Tmp_Interval_Type temp1;
+    expr_value.assign(expr.inhomogeneous_term());
+    for (Linear_Expression::const_iterator i = expr.begin(),
+            i_end = expr.end(); i != i_end; ++i) {
+      temp0.assign(*i);
+      temp1.assign(seq[i.variable().id()]);
+      temp0.mul_assign(temp0, temp1);
+      expr_value.add_assign(expr_value, temp0);
+    }
+    if (denominator != 1) {
+      temp0.assign(denominator);
+      expr_value.div_assign(expr_value, temp0);
+    }
+    ITV& x_seq_v = seq[var.id()];
+    expr_value.intersect_assign(x_seq_v);
+    if (expr_value.is_empty())
+      set_empty();
+    else
+      x_seq_v.assign(UNIVERSE);
+  }
+  else {
+    // The affine transformation is invertible.
+    // CHECKME: for efficiency, would it be meaningful to avoid
+    // the computation of inverse by partially evaluating the call
+    // to affine_image?
+    Linear_Expression inverse;
+    inverse -= expr;
+    inverse += (expr_v + denominator) * var;
+    affine_image(var, inverse, expr_v);
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_image(const Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_image(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_image(v, lb, ub, d)",
+                                 "ub", ub_expr);
+    // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("affine_image(v, e, d)", "v", var);
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
+
+  // Add the constraint implied by the `lb_expr' and `ub_expr'.
+  if (denominator > 0)
+    refine_with_constraint(lb_expr <= ub_expr);
+  else
+    refine_with_constraint(lb_expr >= ub_expr);
+
+  // Check whether `var' occurs in `lb_expr' and/or `ub_expr'.
+  if (lb_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `ub_expr'.
+    generalized_affine_image(var,
+                             LESS_OR_EQUAL,
+                             ub_expr,
+                             denominator);
+    if (denominator > 0)
+      refine_with_constraint(lb_expr <= denominator*var);
+    else
+      refine_with_constraint(denominator*var <= lb_expr);
+  }
+  else if (ub_expr.coefficient(var) == 0) {
+    // Here `var' can only occur in `lb_expr'.
+    generalized_affine_image(var,
+                             GREATER_OR_EQUAL,
+                             lb_expr,
+                             denominator);
+    if (denominator > 0)
+      refine_with_constraint(denominator*var <= ub_expr);
+    else
+      refine_with_constraint(ub_expr <= denominator*var);
+  }
+  else {
+    // Here `var' occurs in both `lb_expr' and `ub_expr'.  As boxes
+    // can only use the non-relational constraints, we find the
+    // maximum/minimum values `ub_expr' and `lb_expr' obtain with the
+    // box and use these instead of the `ub-expr' and `lb-expr'.
+    PPL_DIRTY_TEMP(Coefficient, max_numer);
+    PPL_DIRTY_TEMP(Coefficient, max_denom);
+    bool max_included;
+    PPL_DIRTY_TEMP(Coefficient, min_numer);
+    PPL_DIRTY_TEMP(Coefficient, min_denom);
+    bool min_included;
+    ITV& seq_v = seq[var.id()];
+    if (maximize(ub_expr, max_numer, max_denom, max_included)) {
+      if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+        // The `ub_expr' has a maximum value and the `lb_expr'
+        // has a minimum value for the box.
+        // Set the bounds for `var' using the minimum for `lb_expr'.
+        min_denom *= denominator;
+        PPL_DIRTY_TEMP(mpq_class, q1);
+        PPL_DIRTY_TEMP(mpq_class, q2);
+        assign_r(q1.get_num(), min_numer, ROUND_NOT_NEEDED);
+        assign_r(q1.get_den(), min_denom, ROUND_NOT_NEEDED);
+        q1.canonicalize();
+        // Now make the maximum of lb_expr the upper bound.  If the
+        // maximum is not at a box point, then inequality is strict.
+        max_denom *= denominator;
+        assign_r(q2.get_num(), max_numer, ROUND_NOT_NEEDED);
+        assign_r(q2.get_den(), max_denom, ROUND_NOT_NEEDED);
+        q2.canonicalize();
+
+        if (denominator > 0) {
+          Relation_Symbol gr = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          Relation_Symbol lr = max_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_v.build(i_constraint(gr, q1), i_constraint(lr, q2));
+        }
+        else {
+          Relation_Symbol gr = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          Relation_Symbol lr = min_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_v.build(i_constraint(gr, q2), i_constraint(lr, q1));
+        }
+      }
+      else {
+        // The `ub_expr' has a maximum value but the `lb_expr'
+        // has no minimum value for the box.
+        // Set the bounds for `var' using the maximum for `lb_expr'.
+        PPL_DIRTY_TEMP(mpq_class, q);
+        max_denom *= denominator;
+        assign_r(q.get_num(), max_numer, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), max_denom, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        Relation_Symbol rel = (denominator > 0)
+          ? (max_included ? LESS_OR_EQUAL : LESS_THAN)
+          : (max_included ? GREATER_OR_EQUAL : GREATER_THAN);
+        seq_v.build(i_constraint(rel, q));
+      }
+    }
+    else if (minimize(lb_expr, min_numer, min_denom, min_included)) {
+        // The `ub_expr' has no maximum value but the `lb_expr'
+        // has a minimum value for the box.
+        // Set the bounds for `var' using the minimum for `lb_expr'.
+        min_denom *= denominator;
+        PPL_DIRTY_TEMP(mpq_class, q);
+        assign_r(q.get_num(), min_numer, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), min_denom, ROUND_NOT_NEEDED);
+        q.canonicalize();
+
+        Relation_Symbol rel = (denominator > 0)
+          ? (min_included ? GREATER_OR_EQUAL : GREATER_THAN)
+          : (min_included ? LESS_OR_EQUAL : LESS_THAN);
+        seq_v.build(i_constraint(rel, q));
+    }
+    else {
+      // The `ub_expr' has no maximum value and the `lb_expr'
+      // has no minimum value for the box.
+      // So we set the bounds to be unbounded.
+      seq_v.assign(UNIVERSE);
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::bounded_affine_preimage(const Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  const dimension_type space_dim = space_dimension();
+  if (denominator == 0)
+    throw_invalid_argument("bounded_affine_preimage(v, lb, ub, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  // `var' should be one of the dimensions of the polyhedron.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "v", var);
+  // The dimension of `lb_expr' and `ub_expr' should not be
+  // greater than the dimension of `*this'.
+  const dimension_type lb_space_dim = lb_expr.space_dimension();
+  if (space_dim < lb_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "lb", lb_expr);
+  const dimension_type ub_space_dim = ub_expr.space_dimension();
+  if (space_dim < ub_space_dim)
+    throw_dimension_incompatible("bounded_affine_preimage(v, lb, ub, d)",
+                                 "ub", ub_expr);
+
+  // Any preimage of an empty polyhedron is empty.
+  if (marked_empty())
+    return;
+
+  const bool negative_denom = (denominator < 0);
+  const Coefficient& lb_var_coeff = lb_expr.coefficient(var);
+  const Coefficient& ub_var_coeff = ub_expr.coefficient(var);
+
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // independent of `var', then impose it now.
+  if (lb_var_coeff == ub_var_coeff) {
+    if (negative_denom)
+      refine_with_constraint(lb_expr >= ub_expr);
+    else
+      refine_with_constraint(lb_expr <= ub_expr);
+  }
+
+  ITV& seq_var = seq[var.id()];
+  if (!seq_var.is_universe()) {
+    // We want to work with a positive denominator,
+    // so the sign and its (unsigned) value are separated.
+    PPL_DIRTY_TEMP_COEFFICIENT(pos_denominator);
+    pos_denominator = denominator;
+    if (negative_denom)
+      neg_assign(pos_denominator, pos_denominator);
+    // Store all the information about the upper and lower bounds
+    // for `var' before making this interval unbounded.
+    bool open_lower = seq_var.lower_is_open();
+    bool unbounded_lower = seq_var.lower_is_boundary_infinity();
+    PPL_DIRTY_TEMP(mpq_class, q_seq_var_lower);
+    PPL_DIRTY_TEMP(Coefficient, numer_lower);
+    PPL_DIRTY_TEMP(Coefficient, denom_lower);
+    if (!unbounded_lower) {
+      assign_r(q_seq_var_lower, seq_var.lower(), ROUND_NOT_NEEDED);
+      assign_r(numer_lower, q_seq_var_lower.get_num(), ROUND_NOT_NEEDED);
+      assign_r(denom_lower, q_seq_var_lower.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(denom_lower, denom_lower);
+      numer_lower *= pos_denominator;
+      seq_var.lower_extend();
+    }
+    bool open_upper = seq_var.upper_is_open();
+    bool unbounded_upper = seq_var.upper_is_boundary_infinity();
+    PPL_DIRTY_TEMP(mpq_class, q_seq_var_upper);
+    PPL_DIRTY_TEMP(Coefficient, numer_upper);
+    PPL_DIRTY_TEMP(Coefficient, denom_upper);
+    if (!unbounded_upper) {
+      assign_r(q_seq_var_upper, seq_var.upper(), ROUND_NOT_NEEDED);
+      assign_r(numer_upper, q_seq_var_upper.get_num(), ROUND_NOT_NEEDED);
+      assign_r(denom_upper, q_seq_var_upper.get_den(), ROUND_NOT_NEEDED);
+      if (negative_denom)
+        neg_assign(denom_upper, denom_upper);
+      numer_upper *= pos_denominator;
+      seq_var.upper_extend();
+    }
+
+    if (!unbounded_lower) {
+      // `lb_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the lower bound for `var',
+      // and adding the lower bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_lb_expr(ub_expr);
+      revised_lb_expr -= ub_var_coeff * var;
+      PPL_DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, denom_lower);
+      revised_lb_expr *= d;
+      revised_lb_expr += numer_lower;
+
+      // Find the minimum value for the revised lower bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      PPL_DIRTY_TEMP(Coefficient, denom);
+      if (minimize(revised_lb_expr, numer_lower, denom, included)) {
+        denom_lower *= (denom * ub_var_coeff);
+        PPL_DIRTY_TEMP(mpq_class, q);
+        assign_r(q.get_num(), numer_lower, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), denom_lower, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        if (!included)
+          open_lower = true;
+        Relation_Symbol rel;
+        if ((ub_var_coeff >= 0) ? !negative_denom : negative_denom)
+          rel = open_lower ? GREATER_THAN : GREATER_OR_EQUAL;
+        else
+          rel = open_lower ? LESS_THAN : LESS_OR_EQUAL;
+        seq_var.add_constraint(i_constraint(rel, q));
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+
+    if (!unbounded_upper) {
+      // `ub_expr' is revised by removing the `var' component,
+      // multiplying by `-' denominator of the upper bound for `var',
+      // and adding the upper bound for `var' to the inhomogeneous term.
+      Linear_Expression revised_ub_expr(lb_expr);
+      revised_ub_expr -= lb_var_coeff * var;
+      PPL_DIRTY_TEMP(Coefficient, d);
+      neg_assign(d, denom_upper);
+      revised_ub_expr *= d;
+      revised_ub_expr += numer_upper;
+
+      // Find the maximum value for the revised upper bound expression
+      // and use this to refine the appropriate bound.
+      bool included;
+      PPL_DIRTY_TEMP(Coefficient, denom);
+      if (maximize(revised_ub_expr, numer_upper, denom, included)) {
+        denom_upper *= (denom * lb_var_coeff);
+        PPL_DIRTY_TEMP(mpq_class, q);
+        assign_r(q.get_num(), numer_upper, ROUND_NOT_NEEDED);
+        assign_r(q.get_den(), denom_upper, ROUND_NOT_NEEDED);
+        q.canonicalize();
+        if (!included)
+          open_upper = true;
+        Relation_Symbol rel;
+        if ((lb_var_coeff >= 0) ? !negative_denom : negative_denom)
+          rel = open_upper ? LESS_THAN : LESS_OR_EQUAL;
+        else
+          rel = open_upper ? GREATER_THAN : GREATER_OR_EQUAL;
+        seq_var.add_constraint(i_constraint(rel, q));
+        if (seq_var.is_empty()) {
+          set_empty();
+          return;
+        }
+      }
+    }
+  }
+
+  // If the implied constraint between `ub_expr and `lb_expr' is
+  // dependent on `var', then impose on the new box.
+  if (lb_var_coeff != ub_var_coeff) {
+    if (denominator > 0)
+      refine_with_constraint(lb_expr <= ub_expr);
+    else
+      refine_with_constraint(lb_expr >= ub_expr);
+  }
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)", "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(v, r, e, d)",
+                                 "v", var);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  // First compute the affine image.
+  affine_image(var, expr, denominator);
+
+  if (relsym == EQUAL)
+    // The affine relation is indeed an affine function.
+    return;
+
+  // Any image of an empty box is empty.
+  if (is_empty())
+    return;
+
+  ITV& seq_var = seq[var.id()];
+  switch (relsym) {
+  case LESS_OR_EQUAL:
+    seq_var.lower_extend();
+    break;
+  case LESS_THAN:
+    seq_var.lower_extend();
+    if (!seq_var.upper_is_boundary_infinity())
+      seq_var.remove_sup();
+    break;
+  case GREATER_OR_EQUAL:
+    seq_var.upper_extend();
+    break;
+  case GREATER_THAN:
+    seq_var.upper_extend();
+    if (!seq_var.lower_is_boundary_infinity())
+      seq_var.remove_inf();
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_preimage(const Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator)
+{
+  // The denominator cannot be zero.
+  if (denominator == 0)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "d == 0");
+
+  // Dimension-compatibility checks.
+  const dimension_type space_dim = space_dimension();
+  // The dimension of `expr' should not be greater than the dimension
+  // of `*this'.
+  if (space_dim < expr.space_dimension())
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "e", expr);
+  // `var' should be one of the dimensions of the box.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (space_dim < var_space_dim)
+    throw_dimension_incompatible("generalized_affine_preimage(v, r, e, d)",
+                                 "v", var);
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_preimage(v, r, e, d)",
+                           "r is the disequality relation symbol");
+
+  // Check whether the affine relation is indeed an affine function.
+  if (relsym == EQUAL) {
+    affine_preimage(var, expr, denominator);
+    return;
+  }
+
+  // Compute the reversed relation symbol to simplify later coding.
+  Relation_Symbol reversed_relsym;
+  switch (relsym) {
+  case LESS_THAN:
+    reversed_relsym = GREATER_THAN;
+    break;
+  case LESS_OR_EQUAL:
+    reversed_relsym = GREATER_OR_EQUAL;
+    break;
+  case GREATER_OR_EQUAL:
+    reversed_relsym = LESS_OR_EQUAL;
+    break;
+  case GREATER_THAN:
+    reversed_relsym = LESS_THAN;
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  // Check whether the preimage of this affine relation can be easily
+  // computed as the image of its inverse relation.
+  const Coefficient& var_coefficient = expr.coefficient(var);
+  if (var_coefficient != 0) {
+    Linear_Expression inverse_expr
+      = expr - (denominator + var_coefficient) * var;
+    PPL_DIRTY_TEMP_COEFFICIENT(inverse_denominator);
+    neg_assign(inverse_denominator, var_coefficient);
+    Relation_Symbol inverse_relsym
+      = (sgn(denominator) == sgn(inverse_denominator))
+      ? relsym
+      : reversed_relsym;
+    generalized_affine_image(var, inverse_relsym, inverse_expr,
+                             inverse_denominator);
+    return;
+  }
+
+  // Here `var_coefficient == 0', so that the preimage cannot
+  // be easily computed by inverting the affine relation.
+  // Shrink the box by adding the constraint induced
+  // by the affine relation.
+  // First, compute the maximum and minimum value reached by
+  // `denominator*var' on the box as we need to use non-relational
+  // expressions.
+  PPL_DIRTY_TEMP(Coefficient, max_numer);
+  PPL_DIRTY_TEMP(Coefficient, max_denom);
+  bool max_included;
+  bool bound_above = maximize(denominator*var, max_numer, max_denom, max_included);
+  PPL_DIRTY_TEMP(Coefficient, min_numer);
+  PPL_DIRTY_TEMP(Coefficient, min_denom);
+  bool min_included;
+  bool bound_below = minimize(denominator*var, min_numer, min_denom, min_included);
+  // Use the correct relation symbol
+  const Relation_Symbol corrected_relsym
+    = (denominator > 0) ? relsym : reversed_relsym;
+  // Revise the expression to take into account the denominator of the
+  // maximum/minimum value for `var'.
+  Linear_Expression revised_expr;
+  PPL_DIRTY_TEMP_COEFFICIENT(d);
+  if (corrected_relsym == LESS_THAN || corrected_relsym == LESS_OR_EQUAL) {
+    if (bound_below) {
+      revised_expr = expr;
+      revised_expr.set_inhomogeneous_term(Coefficient_zero());
+      revised_expr *= d;
+    }
+  }
+  else {
+    if (bound_above) {
+      revised_expr = expr;
+      revised_expr.set_inhomogeneous_term(Coefficient_zero());
+      revised_expr *= max_denom;
+    }
+  }
+
+  switch (corrected_relsym) {
+  case LESS_THAN:
+    if (bound_below)
+      refine_with_constraint(min_numer < revised_expr);
+    break;
+  case LESS_OR_EQUAL:
+    if (bound_below)
+      (min_included)
+        ? refine_with_constraint(min_numer <= revised_expr)
+        : refine_with_constraint(min_numer < revised_expr);
+    break;
+  case GREATER_OR_EQUAL:
+    if (bound_above)
+      (max_included)
+        ? refine_with_constraint(max_numer >= revised_expr)
+        : refine_with_constraint(max_numer > revised_expr);
+    break;
+  case GREATER_THAN:
+    if (bound_above)
+      refine_with_constraint(max_numer > revised_expr);
+    break;
+  default:
+    // The EQUAL and NOT_EQUAL cases have been already dealt with.
+    PPL_UNREACHABLE;
+    break;
+  }
+  // If the shrunk box is empty, its preimage is empty too.
+  if (is_empty())
+    return;
+  ITV& seq_v = seq[var.id()];
+  seq_v.assign(UNIVERSE);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
+
+  // Compute the maximum and minimum value reached by the rhs on the box.
+  PPL_DIRTY_TEMP(Coefficient, max_numer);
+  PPL_DIRTY_TEMP(Coefficient, max_denom);
+  bool max_included;
+  bool max_rhs = maximize(rhs, max_numer, max_denom, max_included);
+  PPL_DIRTY_TEMP(Coefficient, min_numer);
+  PPL_DIRTY_TEMP(Coefficient, min_denom);
+  bool min_included;
+  bool min_rhs = minimize(rhs, min_numer, min_denom, min_included);
+
+  // Check whether there is 0, 1 or more than one variable in the lhs
+  // and record the variable with the highest dimension; set the box
+  // intervals to be unbounded for all other dimensions with non-zero
+  // coefficients in the lhs.
+  bool has_var = false;
+  dimension_type has_var_id = lhs.last_nonzero();
+
+  if (has_var_id != 0) {
+    has_var = true;
+    --has_var_id;
+    dimension_type other_var = lhs.first_nonzero(1, has_var_id + 1);
+    --other_var;
+    if (other_var != has_var_id) {
+      // There is more than one dimension with non-zero coefficient, so
+      // we cannot have any information about the dimensions in the lhs.
+      ITV& seq_var = seq[has_var_id];
+      seq_var.assign(UNIVERSE);
+      // Since all but the highest dimension with non-zero coefficient
+      // in the lhs have been set unbounded, it remains to set the
+      // highest dimension in the lhs unbounded.
+      ITV& seq_i = seq[other_var];
+      seq_i.assign(UNIVERSE);
+      PPL_ASSERT(OK());
+      return;
+    }
+  }
+
+  if (has_var) {
+    // There is exactly one dimension with non-zero coefficient.
+    ITV& seq_var = seq[has_var_id];
+
+    // Compute the new bounds for this dimension defined by the rhs
+    // expression.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    const Coefficient& coeff = lhs.coefficient(Variable(has_var_id));
+    PPL_DIRTY_TEMP(mpq_class, q_max);
+    PPL_DIRTY_TEMP(mpq_class, q_min);
+    if (max_rhs) {
+      max_numer -= inhomo * max_denom;
+      max_denom *= coeff;
+      assign_r(q_max.get_num(), max_numer, ROUND_NOT_NEEDED);
+      assign_r(q_max.get_den(), max_denom, ROUND_NOT_NEEDED);
+      q_max.canonicalize();
+    }
+    if (min_rhs) {
+      min_numer -= inhomo * min_denom;
+      min_denom *= coeff;
+      assign_r(q_min.get_num(), min_numer, ROUND_NOT_NEEDED);
+      assign_r(q_min.get_den(), min_denom, ROUND_NOT_NEEDED);
+      q_min.canonicalize();
+    }
+
+    // The choice as to which bounds should be set depends on the sign
+    // of the coefficient of the dimension `has_var_id' in the lhs.
+    if (coeff > 0)
+      // The coefficient of the dimension in the lhs is positive.
+      switch (relsym) {
+      case LESS_OR_EQUAL:
+        if (max_rhs) {
+          Relation_Symbol rel = max_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_var.build(i_constraint(rel, q_max));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case LESS_THAN:
+        if (max_rhs)
+          seq_var.build(i_constraint(LESS_THAN, q_max));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case EQUAL:
+        {
+          I_Constraint<mpq_class> l;
+          I_Constraint<mpq_class> u;
+          if (max_rhs)
+            u.set(max_included ? LESS_OR_EQUAL : LESS_THAN, q_max);
+          if (min_rhs)
+            l.set(min_included ? GREATER_OR_EQUAL : GREATER_THAN, q_min);
+          seq_var.build(l, u);
+          break;
+        }
+      case GREATER_OR_EQUAL:
+        if (min_rhs) {
+          Relation_Symbol rel = min_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          seq_var.build(i_constraint(rel, q_min));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case GREATER_THAN:
+        if (min_rhs)
+          seq_var.build(i_constraint(GREATER_THAN, q_min));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        PPL_UNREACHABLE;
+        break;
+      }
+    else
+      // The coefficient of the dimension in the lhs is negative.
+      switch (relsym) {
+      case GREATER_OR_EQUAL:
+        if (min_rhs) {
+          Relation_Symbol rel = min_included ? LESS_OR_EQUAL : LESS_THAN;
+          seq_var.build(i_constraint(rel, q_min));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case GREATER_THAN:
+        if (min_rhs)
+          seq_var.build(i_constraint(LESS_THAN, q_min));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case EQUAL:
+        {
+          I_Constraint<mpq_class> l;
+          I_Constraint<mpq_class> u;
+          if (max_rhs)
+            l.set(max_included ? GREATER_OR_EQUAL : GREATER_THAN, q_max);
+          if (min_rhs)
+            u.set(min_included ? LESS_OR_EQUAL : LESS_THAN, q_min);
+          seq_var.build(l, u);
+          break;
+        }
+      case LESS_OR_EQUAL:
+        if (max_rhs) {
+          Relation_Symbol rel = max_included ? GREATER_OR_EQUAL : GREATER_THAN;
+          seq_var.build(i_constraint(rel, q_max));
+        }
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      case LESS_THAN:
+        if (max_rhs)
+          seq_var.build(i_constraint(GREATER_THAN, q_max));
+        else
+          seq_var.assign(UNIVERSE);
+        break;
+      default:
+        // The NOT_EQUAL case has been already dealt with.
+        PPL_UNREACHABLE;
+        break;
+      }
+  }
+
+  else {
+    // The lhs is a constant value, so we just need to add the
+    // appropriate constraint.
+    const Coefficient& inhomo = lhs.inhomogeneous_term();
+    switch (relsym) {
+    case LESS_THAN:
+      refine_with_constraint(inhomo < rhs);
+      break;
+    case LESS_OR_EQUAL:
+      refine_with_constraint(inhomo <= rhs);
+      break;
+    case EQUAL:
+      refine_with_constraint(inhomo == rhs);
+      break;
+    case GREATER_OR_EQUAL:
+      refine_with_constraint(inhomo >= rhs);
+      break;
+    case GREATER_THAN:
+      refine_with_constraint(inhomo > rhs);
+      break;
+    default:
+      // The NOT_EQUAL case has been already dealt with.
+      PPL_UNREACHABLE;
+      break;
+    }
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+void
+Box<ITV>::generalized_affine_preimage(const Linear_Expression& lhs,
+                                      const Relation_Symbol relsym,
+                                      const Linear_Expression& rhs) {
+  // Dimension-compatibility checks.
+  // The dimension of `lhs' should not be greater than the dimension
+  // of `*this'.
+  dimension_type lhs_space_dim = lhs.space_dimension();
+  const dimension_type space_dim = space_dimension();
+  if (space_dim < lhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e1", lhs);
+  // The dimension of `rhs' should not be greater than the dimension
+  // of `*this'.
+  const dimension_type rhs_space_dim = rhs.space_dimension();
+  if (space_dim < rhs_space_dim)
+    throw_dimension_incompatible("generalized_affine_image(e1, r, e2)",
+                                 "e2", rhs);
+
+  // The relation symbol cannot be a disequality.
+  if (relsym == NOT_EQUAL)
+    throw_invalid_argument("generalized_affine_image(e1, r, e2)",
+                           "r is the disequality relation symbol");
+
+  // Any image of an empty box is empty.
+  if (marked_empty())
+    return;
+
+  // For any dimension occurring in the lhs, swap and change the sign
+  // of this component for the rhs and lhs.  Then use these in a call
+  // to generalized_affine_image/3.
+  Linear_Expression revised_lhs = lhs;
+  Linear_Expression revised_rhs = rhs;
+  for (Linear_Expression::const_iterator i = lhs.begin(),
+         i_end = lhs.end(); i != i_end; ++i) {
+    const Variable var = i.variable();
+    PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+    tmp = *i;
+    tmp += rhs.coefficient(var);
+    sub_mul_assign(revised_rhs, tmp, var);
+    sub_mul_assign(revised_lhs, tmp, var);
+  }
+  generalized_affine_image(revised_lhs, relsym, revised_rhs);
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T, typename Iterator>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+                   && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                   void>::type
+Box<ITV>::CC76_widening_assign(const T& y, Iterator first, Iterator last) {
+  if (y.is_empty())
+    return;
+
+  for (dimension_type i = seq.size(); i-- > 0; )
+    seq[i].CC76_widening_assign(y.seq[i], first, last);
+
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+                   && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                   void>::type
+Box<ITV>::CC76_widening_assign(const T& y, unsigned* tp) {
+  static typename ITV::boundary_type stop_points[] = {
+    typename ITV::boundary_type(-2),
+    typename ITV::boundary_type(-1),
+    typename ITV::boundary_type(0),
+    typename ITV::boundary_type(1),
+    typename ITV::boundary_type(2)
+  };
+
+  Box& x = *this;
+  // If there are tokens available, work on a temporary copy.
+  if (tp != 0 && *tp > 0) {
+    Box<ITV> x_tmp(x);
+    x_tmp.CC76_widening_assign(y, 0);
+    // If the widening was not precise, use one of the available tokens.
+    if (!x.contains(x_tmp))
+      --(*tp);
+    return;
+  }
+  x.CC76_widening_assign(y,
+                         stop_points,
+                         stop_points
+                         + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+template <typename ITV>
+void
+Box<ITV>::get_limiting_box(const Constraint_System& cs,
+                           Box& limiting_box) const {
+  // Private method: the caller has to ensure the following.
+  PPL_ASSERT(cs.space_dimension() <= space_dimension());
+
+  for (Constraint_System::const_iterator cs_i = cs.begin(),
+         cs_end = cs.end(); cs_i != cs_end; ++cs_i) {
+    const Constraint& c = *cs_i;
+    dimension_type c_num_vars = 0;
+    dimension_type c_only_var = 0;
+    // Constraints that are not interval constraints are ignored.
+    if (!Box_Helpers::extract_interval_constraint(c, c_num_vars, c_only_var))
+      continue;
+    // Trivial constraints are ignored.
+    if (c_num_vars != 0) {
+      // c is a non-trivial interval constraint.
+      // add interval constraint to limiting box
+      const Coefficient& n = c.inhomogeneous_term();
+      const Coefficient& d = c.coefficient(Variable(c_only_var));
+      if (interval_relation(seq[c_only_var], c.type(), n, d)
+          == Poly_Con_Relation::is_included())
+        limiting_box.add_interval_constraint_no_check(c_only_var, c.type(),
+                                                      n, d);
+    }
+  }
+}
+
+template <typename ITV>
+void
+Box<ITV>::limited_CC76_extrapolation_assign(const Box& y,
+                                            const Constraint_System& cs,
+                                            unsigned* tp) {
+  Box& x = *this;
+  const dimension_type space_dim = x.space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("limited_CC76_extrapolation_assign(y, cs)",
+                                 y);
+  // `cs' must be dimension-compatible with the two boxes.
+  const dimension_type cs_space_dim = cs.space_dimension();
+  if (space_dim < cs_space_dim)
+    throw_constraint_incompatible("limited_CC76_extrapolation_assign(y, cs)");
+
+  // The limited CC76-extrapolation between two boxes in a
+  // zero-dimensional space is also a zero-dimensional box
+  if (space_dim == 0)
+    return;
+
+  // Assume `y' is contained in or equal to `*this'.
+  PPL_EXPECT_HEAVY(copy_contains(*this, y));
+
+  // If `*this' is empty, since `*this' contains `y', `y' is empty too.
+  if (marked_empty())
+    return;
+  // If `y' is empty, we return.
+  if (y.marked_empty())
+    return;
+
+  // Build a limiting box using all the constraints in cs
+  // that are satisfied by *this.
+  Box limiting_box(space_dim, UNIVERSE);
+  get_limiting_box(cs, limiting_box);
+
+  x.CC76_widening_assign(y, tp);
+
+  // Intersect the widened box with the limiting box.
+  intersection_assign(limiting_box);
+}
+
+template <typename ITV>
+template <typename T>
+typename Enable_If<Is_Same<T, Box<ITV> >::value
+                   && Is_Same_Or_Derived<Interval_Base, ITV>::value,
+                   void>::type
+Box<ITV>::CC76_narrowing_assign(const T& y) {
+  const dimension_type space_dim = space_dimension();
+
+  // Dimension-compatibility check.
+  if (space_dim != y.space_dimension())
+    throw_dimension_incompatible("CC76_narrowing_assign(y)", y);
+
+  // Assume `*this' is contained in or equal to `y'.
+  PPL_EXPECT_HEAVY(copy_contains(y, *this));
+
+  // If both boxes are zero-dimensional,
+  // since `y' contains `*this', we simply return `*this'.
+  if (space_dim == 0)
+    return;
+
+  // If `y' is empty, since `y' contains `this', `*this' is empty too.
+  if (y.is_empty())
+    return;
+  // If `*this' is empty, we return.
+  if (is_empty())
+    return;
+
+  // Replace each constraint in `*this' by the corresponding constraint
+  // in `y' if the corresponding inhomogeneous terms are both finite.
+  for (dimension_type i = space_dim; i-- > 0; ) {
+    ITV& x_i = seq[i];
+    const ITV& y_i = y.seq[i];
+    if (!x_i.lower_is_boundary_infinity()
+        && !y_i.lower_is_boundary_infinity()
+        && x_i.lower() != y_i.lower())
+      x_i.lower() = y_i.lower();
+    if (!x_i.upper_is_boundary_infinity()
+        && !y_i.upper_is_boundary_infinity()
+        && x_i.upper() != y_i.upper())
+      x_i.upper() = y_i.upper();
+  }
+  PPL_ASSERT(OK());
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  if (marked_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  for (dimension_type k = 0; k < space_dim; ++k) {
+    const Variable v_k = Variable(k);
+    PPL_DIRTY_TEMP(Coefficient, n);
+    PPL_DIRTY_TEMP(Coefficient, d);
+    bool closed = false;
+    if (has_lower_bound(v_k, n, d, closed)) {
+      if (closed)
+        cs.insert(d * v_k >= n);
+      else
+        cs.insert(d * v_k > n);
+    }
+    if (has_upper_bound(v_k, n, d, closed)) {
+      if (closed)
+        cs.insert(d * v_k <= n);
+      else
+        cs.insert(d * v_k < n);
+    }
+  }
+  return cs;
+}
+
+template <typename ITV>
+Constraint_System
+Box<ITV>::minimized_constraints() const {
+  const dimension_type space_dim = space_dimension();
+  Constraint_System cs;
+  cs.set_space_dimension(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cs = Constraint_System::zero_dim_empty();
+    return cs;
+  }
+
+  // Make sure emptiness is detected.
+  if (is_empty()) {
+    cs.insert(Constraint::zero_dim_false());
+    return cs;
+  }
+
+  for (dimension_type k = 0; k < space_dim; ++k) {
+    const Variable v_k = Variable(k);
+    PPL_DIRTY_TEMP(Coefficient, n);
+    PPL_DIRTY_TEMP(Coefficient, d);
+    bool closed = false;
+    if (has_lower_bound(v_k, n, d, closed)) {
+      if (closed)
+        // Make sure equality constraints are detected.
+        if (seq[k].is_singleton()) {
+          cs.insert(d * v_k == n);
+          continue;
+        }
+        else
+          cs.insert(d * v_k >= n);
+      else
+        cs.insert(d * v_k > n);
+    }
+    if (has_upper_bound(v_k, n, d, closed)) {
+      if (closed)
+        cs.insert(d * v_k <= n);
+      else
+        cs.insert(d * v_k < n);
+    }
+  }
+  return cs;
+}
+
+template <typename ITV>
+Congruence_System
+Box<ITV>::congruences() const {
+  const dimension_type space_dim = space_dimension();
+  Congruence_System cgs(space_dim);
+
+  if (space_dim == 0) {
+    if (marked_empty())
+      cgs = Congruence_System::zero_dim_empty();
+    return cgs;
+  }
+
+  // Make sure emptiness is detected.
+  if (is_empty()) {
+    cgs.insert(Congruence::zero_dim_false());
+    return cgs;
+  }
+
+  for (dimension_type k = 0; k < space_dim; ++k) {
+    const Variable v_k = Variable(k);
+    PPL_DIRTY_TEMP(Coefficient, n);
+    PPL_DIRTY_TEMP(Coefficient, d);
+    bool closed = false;
+    if (has_lower_bound(v_k, n, d, closed) && closed)
+      // Make sure equality congruences are detected.
+      if (seq[k].is_singleton())
+        cgs.insert((d * v_k %= n) / 0);
+  }
+  return cgs;
+}
+
+template <typename ITV>
+memory_size_type
+Box<ITV>::external_memory_in_bytes() const {
+  memory_size_type n = seq.capacity() * sizeof(ITV);
+  for (dimension_type k = seq.size(); k-- > 0; )
+    n += seq[k].external_memory_in_bytes();
+  return n;
+}
+
+/*! \relates Parma_Polyhedra_Library::Box */
+template <typename ITV>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Box<ITV>& box) {
+  if (box.is_empty())
+    s << "false";
+  else if (box.is_universe())
+    s << "true";
+  else
+    for (dimension_type k = 0,
+           space_dim = box.space_dimension(); k < space_dim; ) {
+      s << Variable(k) << " in " << box[k];
+      ++k;
+      if (k < space_dim)
+        s << ", ";
+      else
+        break;
+    }
+  return s;
+}
+
+template <typename ITV>
+void
+Box<ITV>::ascii_dump(std::ostream& s) const {
+  const char separator = ' ';
+  status.ascii_dump(s);
+  const dimension_type space_dim = space_dimension();
+  s << "space_dim" << separator << space_dim;
+  s << "\n";
+  for (dimension_type i = 0; i < space_dim;  ++i)
+    seq[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(ITV, Box<ITV>)
+
+template <typename ITV>
+bool
+Box<ITV>::ascii_load(std::istream& s) {
+  if (!status.ascii_load(s))
+    return false;
+
+  std::string str;
+  dimension_type space_dim;
+  if (!(s >> str) || str != "space_dim")
+    return false;
+  if (!(s >> space_dim))
+    return false;
+
+  seq.clear();
+  ITV seq_i;
+  for (dimension_type i = 0; i < space_dim;  ++i) {
+    if (seq_i.ascii_load(s))
+      seq.push_back(seq_i);
+    else
+      return false;
+  }
+
+  // Check invariants.
+  PPL_ASSERT(OK());
+  return true;
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Box& y) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << this->space_dimension()
+    << ", y->space_dimension() == " << y.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>
+::throw_dimension_incompatible(const char* method,
+                               dimension_type required_dim) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", required dimension == " << required_dim << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint& c) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", c->space_dimension == " << c.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence& cg) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cg->space_dimension == " << cg.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Constraint_System& cs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cs->space_dimension == " << cs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Congruence_System& cgs) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", cgs->space_dimension == " << cgs.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const Generator& g) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", g->space_dimension == " << g.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_constraint_incompatible(const char* method) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "the constraint is incompatible.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_expression_too_complex(const char* method,
+                                       const Linear_Expression& le) {
+  using namespace IO_Operators;
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << le << " is too complex.";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const char* le_name,
+                                       const Linear_Expression& le) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << le_name << "->space_dimension() == "
+    << le.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+template <typename C>
+void
+Box<ITV>::throw_dimension_incompatible(const char* method,
+                                       const char* lf_name,
+                                       const Linear_Form<C>& lf) const {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":\n"
+    << "this->space_dimension() == " << space_dimension()
+    << ", " << lf_name << "->space_dimension() == "
+    << lf.space_dimension() << ".";
+  throw std::invalid_argument(s.str());
+}
+
+template <typename ITV>
+void
+Box<ITV>::throw_invalid_argument(const char* method, const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Box::" << method << ":" << std::endl
+    << reason;
+  throw std::invalid_argument(s.str());
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Box */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Specialization,
+          typename Temp, typename To, typename ITV>
+bool
+l_m_distance_assign(Checked_Number<To, Extended_Number_Policy>& r,
+                    const Box<ITV>& x, const Box<ITV>& y,
+                    const Rounding_Dir dir,
+                    Temp& tmp0, Temp& tmp1, Temp& tmp2) {
+  const dimension_type x_space_dim = x.space_dimension();
+  // Dimension-compatibility check.
+  if (x_space_dim != y.space_dimension())
+    return false;
+
+  // Zero-dim boxes are equal if and only if they are both empty or universe.
+  if (x_space_dim == 0) {
+    if (x.marked_empty() == y.marked_empty())
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+    else
+      assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+    return true;
+  }
+
+  // The distance computation requires a check for emptiness.
+  (void) x.is_empty();
+  (void) y.is_empty();
+  // If one of two boxes is empty, then they are equal if and only if
+  // the other box is empty too.
+  if (x.marked_empty() || y.marked_empty()) {
+    if (x.marked_empty() == y.marked_empty()) {
+      assign_r(r, 0, ROUND_NOT_NEEDED);
+      return true;
+    }
+    else
+      goto pinf;
+  }
+
+  assign_r(tmp0, 0, ROUND_NOT_NEEDED);
+  for (dimension_type i = x_space_dim; i-- > 0; ) {
+    const ITV& x_i = x.seq[i];
+    const ITV& y_i = y.seq[i];
+    // Dealing with the lower bounds.
+    if (x_i.lower_is_boundary_infinity()) {
+      if (!y_i.lower_is_boundary_infinity())
+        goto pinf;
+    }
+    else if (y_i.lower_is_boundary_infinity())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.lower() > y_i.lower()) {
+        maybe_assign(tmp1p, tmp1, x_i.lower(), dir);
+        maybe_assign(tmp2p, tmp2, y_i.lower(), inverse(dir));
+      }
+      else {
+        maybe_assign(tmp1p, tmp1, y_i.lower(), dir);
+        maybe_assign(tmp2p, tmp2, x_i.lower(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      PPL_ASSERT(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+    // Dealing with the lower bounds.
+    if (x_i.upper_is_boundary_infinity())
+      if (y_i.upper_is_boundary_infinity())
+        continue;
+      else
+        goto pinf;
+    else if (y_i.upper_is_boundary_infinity())
+      goto pinf;
+    else {
+      const Temp* tmp1p;
+      const Temp* tmp2p;
+      if (x_i.upper() > y_i.upper()) {
+        maybe_assign(tmp1p, tmp1, x_i.upper(), dir);
+        maybe_assign(tmp2p, tmp2, y_i.upper(), inverse(dir));
+      }
+      else {
+        maybe_assign(tmp1p, tmp1, y_i.upper(), dir);
+        maybe_assign(tmp2p, tmp2, x_i.upper(), inverse(dir));
+      }
+      sub_assign_r(tmp1, *tmp1p, *tmp2p, dir);
+      PPL_ASSERT(sgn(tmp1) >= 0);
+      Specialization::combine(tmp0, tmp1, dir);
+    }
+  }
+  Specialization::finalize(tmp0, dir);
+  assign_r(r, tmp0, dir);
+  return true;
+
+ pinf:
+  assign_r(r, PLUS_INFINITY, ROUND_NOT_NEEDED);
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Box_defs.hh line 2285. */
+
+/* Automatically generated from PPL source file ../src/Linear_Form_templates.hh line 30. */
+#include <stdexcept>
+#include <iostream>
+#include <cmath>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v)
+  : vec() {
+  const dimension_type space_dim = v.space_dimension();
+  if (space_dim > max_space_dimension())
+    throw std::length_error("Linear_Form<C>::"
+                            "Linear_Form(v):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+  vec.resize(space_dim+1, zero);
+  vec[v.space_dimension()] = C(typename C::boundary_type(1));
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Variable v, const Variable w)
+  : vec() {
+  const dimension_type v_space_dim = v.space_dimension();
+  const dimension_type w_space_dim = w.space_dimension();
+  const dimension_type space_dim = std::max(v_space_dim, w_space_dim);
+  if (space_dim > max_space_dimension())
+    throw std::length_error("Linear_Form<C>::"
+                            "Linear_Form(v, w):\n"
+                            "v or w exceed the maximum allowed "
+                            "space dimension.");
+  vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+  vec.resize(space_dim+1, zero);
+  if (v_space_dim != w_space_dim) {
+    vec[v_space_dim] = C(typename C::boundary_type(1));
+    vec[w_space_dim] = C(typename C::boundary_type(-1));
+  }
+}
+
+template <typename C>
+Linear_Form<C>::Linear_Form(const Linear_Expression& e)
+  : vec() {
+  const dimension_type space_dim = e.space_dimension();
+  if (space_dim > max_space_dimension())
+    throw std::length_error("Linear_Form<C>::"
+                            "Linear_Form(e):\n"
+                            "e exceeds the maximum allowed "
+                            "space dimension.");
+  vec.reserve(compute_capacity(space_dim+1, vec_type().max_size()));
+  vec.resize(space_dim+1);
+  for (dimension_type i = space_dim; i-- > 0; )
+    vec[i+1] = e.coefficient(Variable(i));
+  vec[0] = e.inhomogeneous_term();
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  dimension_type min_size;
+  dimension_type max_size;
+  const Linear_Form<C>* p_e_max;
+  if (f1_size > f2_size) {
+    min_size = f2_size;
+    max_size = f1_size;
+    p_e_max = &f1;
+  }
+  else {
+    min_size = f1_size;
+    max_size = f2_size;
+    p_e_max = &f2;
+  }
+
+  Linear_Form<C> r(max_size, false);
+  dimension_type i = max_size;
+  while (i > min_size) {
+    --i;
+    r[i] = p_e_max->vec[i];
+  }
+  while (i > 0) {
+    --i;
+    r[i] = f1[i];
+    r[i] += f2[i];
+  }
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const Variable v, const Linear_Form<C>& f) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form "
+                            "operator+(v, f):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  Linear_Form<C> r(f);
+  if (v_space_dim > f.space_dimension())
+    r.extend(v_space_dim+1);
+  r[v_space_dim] += C(typename C::boundary_type(1));
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator+(const C& n, const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  r[0] += n;
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i].neg_assign(r[i]);
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  if (f1_size > f2_size) {
+    Linear_Form<C> r(f1_size, false);
+    dimension_type i = f1_size;
+    while (i > f2_size) {
+      --i;
+      r[i] = f1[i];
+    }
+    while (i > 0) {
+      --i;
+      r[i] = f1[i];
+      r[i] -= f2[i];
+    }
+    return r;
+  }
+  else {
+    Linear_Form<C> r(f2_size, false);
+    dimension_type i = f2_size;
+    while (i > f1_size) {
+      --i;
+      r[i].neg_assign(f2[i]);
+    }
+    while (i > 0) {
+      --i;
+      r[i] = f1[i];
+      r[i] -= f2[i];
+    }
+    return r;
+  }
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Variable v, const Linear_Form<C>& f) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form "
+                            "operator-(v, e):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  Linear_Form<C> r(f);
+  if (v_space_dim > f.space_dimension())
+    r.extend(v_space_dim+1);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i].neg_assign(r[i]);
+  r[v_space_dim] += C(typename C::boundary_type(1));
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const Linear_Form<C>& f, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form "
+                            "operator-(e, v):\n"
+                            "v exceeds the maximum allowed "
+                            "space dimension.");
+  Linear_Form<C> r(f);
+  if (v_space_dim > f.space_dimension())
+    r.extend(v_space_dim+1);
+  r[v_space_dim] -= C(typename C::boundary_type(1));
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator-(const C& n, const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i].neg_assign(r[i]);
+  r[0] += n;
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>
+operator*(const C& n, const Linear_Form<C>& f) {
+  Linear_Form<C> r(f);
+  for (dimension_type i = f.size(); i-- > 0; )
+    r[i] *= n;
+  return r;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  if (f1_size < f2_size)
+    f1.extend(f2_size);
+  for (dimension_type i = f2_size; i-- > 0; )
+    f1[i] += f2[i];
+  return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator+=(Linear_Form<C>& f, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form<C>& "
+                            "operator+=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (v_space_dim > f.space_dimension())
+    f.extend(v_space_dim+1);
+  f[v_space_dim] += C(typename C::boundary_type(1));
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f1, const Linear_Form<C>& f2) {
+  dimension_type f1_size = f1.size();
+  dimension_type f2_size = f2.size();
+  if (f1_size < f2_size)
+    f1.extend(f2_size);
+  for (dimension_type i = f2_size; i-- > 0; )
+    f1[i] -= f2[i];
+  return f1;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator-=(Linear_Form<C>& f, const Variable v) {
+  const dimension_type v_space_dim = v.space_dimension();
+  if (v_space_dim > Linear_Form<C>::max_space_dimension())
+    throw std::length_error("Linear_Form<C>& "
+                            "operator-=(e, v):\n"
+                            "v exceeds the maximum allowed space dimension.");
+  if (v_space_dim > f.space_dimension())
+    f.extend(v_space_dim+1);
+  f[v_space_dim] -= C(typename C::boundary_type(1));
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator*=(Linear_Form<C>& f, const C& n) {
+  dimension_type f_size = f.size();
+  for (dimension_type i = f_size; i-- > 0; )
+    f[i] *= n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+Linear_Form<C>&
+operator/=(Linear_Form<C>& f, const C& n) {
+  dimension_type f_size = f.size();
+  for (dimension_type i = f_size; i-- > 0; )
+    f[i] /= n;
+  return f;
+}
+
+/*! \relates Linear_Form */
+template <typename C>
+inline bool
+operator==(const Linear_Form<C>& x, const Linear_Form<C>& y) {
+  const dimension_type x_size = x.size();
+  const dimension_type y_size = y.size();
+  if (x_size >= y_size) {
+    for (dimension_type i = y_size; i-- > 0; )
+      if (x[i] != y[i])
+        return false;
+
+    for (dimension_type i = x_size; --i >= y_size; )
+      if (x[i] != x.zero)
+        return false;
+
+  }
+  else {
+    for (dimension_type i = x_size; i-- > 0; )
+      if (x[i] != y[i])
+        return false;
+
+    for (dimension_type i = y_size; --i >= x_size; )
+      if (y[i] != x.zero)
+        return false;
+
+  }
+
+  return true;
+}
+
+template <typename C>
+void
+Linear_Form<C>::negate() {
+  for (dimension_type i = vec.size(); i-- > 0; )
+    vec[i].neg_assign(vec[i]);
+  return;
+}
+
+template <typename C>
+inline memory_size_type
+Linear_Form<C>::external_memory_in_bytes() const {
+  memory_size_type n = 0;
+  for (dimension_type i = size(); i-- > 0; )
+    n += vec[i].external_memory_in_bytes();
+  n += vec.capacity()*sizeof(C);
+  return n;
+}
+
+template <typename C>
+bool
+Linear_Form<C>::OK() const {
+  for (dimension_type i = size(); i-- > 0; )
+    if (!vec[i].OK())
+      return false;
+  return true;
+}
+
+// Floating point analysis related methods.
+template <typename C>
+void
+Linear_Form<C>::relative_error(
+                const Floating_Point_Format analyzed_format,
+                Linear_Form& result) const {
+  typedef typename C::boundary_type analyzer_format;
+
+  // Get the necessary information on the analyzed's format.
+  unsigned int f_base;
+  unsigned int f_mantissa_bits;
+  switch (analyzed_format) {
+    case IEEE754_HALF:
+      f_base = float_ieee754_half::BASE;
+      f_mantissa_bits = float_ieee754_half::MANTISSA_BITS;
+      break;
+    case IEEE754_SINGLE:
+      f_base = float_ieee754_single::BASE;
+      f_mantissa_bits = float_ieee754_single::MANTISSA_BITS;
+      break;
+    case IEEE754_DOUBLE:
+      f_base = float_ieee754_double::BASE;
+      f_mantissa_bits = float_ieee754_double::MANTISSA_BITS;
+      break;
+    case IBM_SINGLE:
+      f_base = float_ibm_single::BASE;
+      f_mantissa_bits = float_ibm_single::MANTISSA_BITS;
+      break;
+    case IEEE754_QUAD:
+      f_base = float_ieee754_quad::BASE;
+      f_mantissa_bits = float_ieee754_quad::MANTISSA_BITS;
+      break;
+    case INTEL_DOUBLE_EXTENDED:
+      f_base = float_intel_double_extended::BASE;
+      f_mantissa_bits = float_intel_double_extended::MANTISSA_BITS;
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+  }
+
+  C error_propagator;
+  // We assume that f_base is a power of 2.
+  unsigned int u_power = msb_position(f_base) * f_mantissa_bits;
+  int neg_power = -static_cast<int>(u_power);
+  analyzer_format lb = static_cast<analyzer_format>(ldexp(1.0, neg_power));
+
+  error_propagator.build(i_constraint(GREATER_OR_EQUAL, -lb),
+                         i_constraint(LESS_OR_EQUAL, lb));
+
+  // Handle the inhomogeneous term.
+  const C* current_term = &inhomogeneous_term();
+  assert(current_term->is_bounded());
+
+  C current_multiplier(std::max(std::abs(current_term->lower()),
+                                std::abs(current_term->upper())));
+  Linear_Form current_result_term(current_multiplier);
+  current_result_term *= error_propagator;
+  result = Linear_Form(current_result_term);
+
+  // Handle the other terms.
+  dimension_type dimension = space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    current_term = &coefficient(Variable(i));
+    assert(current_term->is_bounded());
+    current_multiplier = C(std::max(std::abs(current_term->lower()),
+                                    std::abs(current_term->upper())));
+    current_result_term = Linear_Form(Variable(i));
+    current_result_term *= current_multiplier;
+    current_result_term *= error_propagator;
+    result += current_result_term;
+  }
+
+  return;
+}
+
+template <typename C>
+template <typename Target>
+bool
+Linear_Form<C>::intervalize(const FP_Oracle<Target,C>& oracle,
+                            C& result) const {
+  result = C(inhomogeneous_term());
+  dimension_type dimension = space_dimension();
+  for (dimension_type i = 0; i < dimension; ++i) {
+    C current_addend = coefficient(Variable(i));
+    C curr_int;
+    if (!oracle.get_interval(i, curr_int))
+      return false;
+    current_addend *= curr_int;
+    result += current_addend;
+  }
+
+  return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Form */
+template <typename C>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const Linear_Form<C>& f) {
+  const dimension_type num_variables = f.space_dimension();
+  bool first = true;
+  for (dimension_type v = 0; v < num_variables; ++v) {
+    const C& fv = f[v+1];
+    if (fv != typename C::boundary_type(0)) {
+      if (first) {
+        if (fv == typename C::boundary_type(-1))
+          s << "-";
+        else if (fv != typename C::boundary_type(1))
+          s << fv << "*";
+        first = false;
+      }
+      else {
+        if (fv == typename C::boundary_type(-1))
+          s << " - ";
+        else {
+          s << " + ";
+          if (fv != typename C::boundary_type(1))
+            s << fv << "*";
+        }
+      }
+      s << Variable(v);
+    }
+  }
+  // Inhomogeneous term.
+  const C& it = f[0];
+  if (it != 0) {
+    if (!first)
+        s << " + ";
+    else
+      first = false;
+    s << it;
+  }
+
+  if (first)
+    // The null linear form.
+    s << Linear_Form<C>::zero;
+  return s;
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(C, Linear_Form<C>)
+
+template <typename C>
+C Linear_Form<C>::zero(typename C::boundary_type(0));
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/linearize.hh line 1. */
+/* Linearization function implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_defs.hh line 1. */
+/* Concrete_Expression class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_defs.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+//! The type of a concrete expression.
+class Concrete_Expression_Type {
+public:
+  /*! \brief
+    Returns the bounded integer type corresponding to \p width,
+    \p representation and \p overflow.
+  */
+  static Concrete_Expression_Type
+  bounded_integer(Bounded_Integer_Type_Width width,
+                  Bounded_Integer_Type_Representation representation,
+                  Bounded_Integer_Type_Overflow overflow);
+
+  /*! \brief
+    Returns the floating point type corresponding to \p format.
+  */
+  static Concrete_Expression_Type
+  floating_point(Floating_Point_Format format);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a bounded
+    integer type.
+  */
+  bool is_bounded_integer() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is a floating
+    point type.
+  */
+  bool is_floating_point() const;
+
+  /*! \brief
+    Returns the width in bits of the bounded integer type encoded by
+    \p *this.
+
+    The behavior is undefined if \p *this does not encode a bounded
+    integer type.
+  */
+  Bounded_Integer_Type_Width bounded_integer_type_width() const;
+
+  /*! \brief
+    Returns the representation of the bounded integer type encoded by
+    \p *this.
+
+    The behavior is undefined if \p *this does not encode a bounded
+    integer type.
+  */
+  Bounded_Integer_Type_Representation
+  bounded_integer_type_representation() const;
+
+  /*! \brief
+    Returns the overflow behavior of the bounded integer type encoded by
+    \p *this.
+
+    The behavior is undefined if \p *this does not encode a bounded
+    integer type.
+  */
+  Bounded_Integer_Type_Overflow
+  bounded_integer_type_overflow() const;
+
+  /*! \brief
+    Returns the format of the floating point type encoded by \p *this.
+
+    The behavior is undefined if \p *this does not encode a floating
+    point type.
+  */
+  Floating_Point_Format floating_point_format() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! A 32-bit word encoding the type.
+  struct Implementation {
+    bool bounded_integer:1;
+    unsigned int bounded_integer_type_width:23;
+    unsigned int bounded_integer_type_representation:2;
+    unsigned int bounded_integer_type_overflow:2;
+    unsigned int floating_point_format:4;
+  };
+
+  //! Constructor from \p implementation.
+  Concrete_Expression_Type(Implementation implementation);
+
+  //! The encoding of \p *this.
+  Implementation impl;
+};
+
+//! Base class for all concrete expressions.
+template <typename Target>
+class Concrete_Expression_Common {
+public:
+  //! Returns the type of \* this.
+  Concrete_Expression_Type type() const;
+
+  //! Returns the kind of \* this.
+  Concrete_Expression_Kind kind() const;
+
+  //! Tests if \p *this has the same kind as <CODE>Derived\<Target\></CODE>.
+  template <template <typename T> class Derived>
+  bool is() const;
+
+  /*! \brief
+    Returns a pointer to \p *this converted to type
+    <CODE>Derived\<Target\>*</CODE>.
+  */
+  template <template <typename T> class Derived>
+  Derived<Target>* as();
+
+  /*! \brief
+    Returns a pointer to \p *this converted to type
+    <CODE>const Derived\<Target\>*</CODE>.
+  */
+  template <template <typename T> class Derived>
+  const Derived<Target>* as() const;
+
+};
+
+//! Base class for binary operator applied to two concrete expressions.
+template <typename Target>
+class Binary_Operator_Common {
+public:
+  //! Returns a constant identifying the operator of \p *this.
+  Concrete_Expression_BOP binary_operator() const;
+
+  //! Returns the left-hand side of \p *this.
+  const Concrete_Expression<Target>* left_hand_side() const;
+
+  //! Returns the right-hand side of \p *this.
+  const Concrete_Expression<Target>* right_hand_side() const;
+};
+
+//! Base class for unary operator applied to one concrete expression.
+template <typename Target>
+class Unary_Operator_Common {
+public:
+  //! Returns a constant identifying the operator of \p *this.
+  Concrete_Expression_UOP unary_operator() const;
+
+  //! Returns the argument \p *this.
+  const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for cast operator concrete expressions.
+template <typename Target>
+class Cast_Operator_Common {
+  //! Returns the casted expression.
+  const Concrete_Expression<Target>* argument() const;
+};
+
+//! Base class for integer constant concrete expressions.
+template <typename Target>
+class Integer_Constant_Common {
+};
+
+//! Base class for floating-point constant concrete expression.
+template <typename Target>
+class Floating_Point_Constant_Common {
+};
+
+//! Base class for references to some approximable.
+template <typename Target>
+class Approximable_Reference_Common {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_inlines.hh line 1. */
+/* Concrete_Expression class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Concrete_Expression_Type
+::Concrete_Expression_Type(Implementation implementation)
+  : impl(implementation) {
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::bounded_integer(const Bounded_Integer_Type_Width width,
+                  const Bounded_Integer_Type_Representation representation,
+                  const Bounded_Integer_Type_Overflow overflow) {
+  Implementation impl;
+  impl.bounded_integer = true;
+  impl.bounded_integer_type_width = width;
+  impl.bounded_integer_type_representation = representation;
+  impl.bounded_integer_type_overflow = overflow;
+  // Arbitrary choice to ensure determinism.
+  impl.floating_point_format = IEEE754_HALF;
+  return Concrete_Expression_Type(impl);
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression_Type
+::floating_point(const Floating_Point_Format format) {
+  Implementation impl;
+  impl.bounded_integer = false;
+  impl.floating_point_format = format;
+  // Arbitrary choices to ensure determinism.
+  impl.bounded_integer_type_width = BITS_128;
+  impl.bounded_integer_type_representation =  SIGNED_2_COMPLEMENT;
+  impl.bounded_integer_type_overflow = OVERFLOW_IMPOSSIBLE;
+  return Concrete_Expression_Type(impl);
+}
+
+inline bool
+Concrete_Expression_Type::is_bounded_integer() const {
+  return impl.bounded_integer;
+}
+
+inline bool
+Concrete_Expression_Type::is_floating_point() const {
+  return !impl.bounded_integer;
+}
+
+inline Bounded_Integer_Type_Width
+Concrete_Expression_Type::bounded_integer_type_width() const {
+  const unsigned int u = impl.bounded_integer_type_width;
+  return static_cast<Bounded_Integer_Type_Width>(u);
+}
+
+inline Bounded_Integer_Type_Representation
+Concrete_Expression_Type::bounded_integer_type_representation() const {
+  const unsigned int u = impl.bounded_integer_type_representation;
+  return static_cast<Bounded_Integer_Type_Representation>(u);
+}
+
+inline Bounded_Integer_Type_Overflow
+Concrete_Expression_Type::bounded_integer_type_overflow() const {
+  const unsigned int u = impl.bounded_integer_type_overflow;
+  return static_cast<Bounded_Integer_Type_Overflow>(u);
+}
+
+inline Floating_Point_Format
+Concrete_Expression_Type::floating_point_format() const {
+  const unsigned int u = impl.floating_point_format;
+  return static_cast<Floating_Point_Format>(u);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline bool
+Concrete_Expression_Common<Target>::is() const {
+  return static_cast<const Concrete_Expression<Target>*>(this)->kind() ==
+         Derived<Target>::KIND;
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline Derived<Target>*
+Concrete_Expression_Common<Target>::as() {
+  PPL_ASSERT(is<Derived>());
+  return static_cast<Derived<Target>*>(this);
+}
+
+template <typename Target>
+template <template <typename T> class Derived>
+inline const Derived<Target>*
+Concrete_Expression_Common<Target>::as() const {
+  PPL_ASSERT(is<Derived>());
+  return static_cast<const Derived<Target>*>(this);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Concrete_Expression_defs.hh line 200. */
+
+/* Automatically generated from PPL source file ../src/linearize.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  sum of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>ADD</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of sum floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+  forms such that:
+
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v \right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+  \f]
+
+  Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+  error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+add_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::ADD);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+    return false;
+
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+
+  result += linearized_second_operand;
+  linearized_second_operand.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  difference of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>SUB</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of difference floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+  operators on linear form such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \adifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,  we construct the interval linear form
+  \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  on \f$\cV\f$ as follows:
+  \f[
+  \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form) and \f$mf_{\mathbf{f}}\f$ is a rounding
+  error computed by function <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+sub_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::SUB);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+    return false;
+
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+
+  result -= linearized_second_operand;
+  linearized_second_operand.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  product of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>MUL</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of multiplication floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+  operators on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  i
+  \amlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \amifp i'\right)
+  + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left([a, b]
+  \amlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+  \aslf
+  \left([a, b]
+  \amlf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1].
+  \f].
+
+  Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+  \f]
+
+  Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}
+  \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+  of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+  and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+  <CODE>compute_absolute_error</CODE>.
+
+  Even though we intervalize the first operand in the above example, the
+  actual implementation utilizes an heuristics for choosing which of the two
+  operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+mul_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::MUL);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  /*
+    FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+    decide which of the two linear forms must be intervalized, as described
+    in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+    thesis "Weakly Relational Numerical Abstract Domains".
+    In this Section are also described other multiplication strategies, such
+    as All-Cases, Relative-Size Local, Simplification-Driven Global and
+    Homogeneity Global.
+  */
+
+  // Here we choose which of the two linear forms must be intervalized.
+
+  // true if we intervalize the first form, false if we intervalize the second.
+  bool intervalize_first;
+  FP_Linear_Form linearized_first_operand;
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store,
+                 linearized_first_operand))
+    return false;
+  FP_Interval_Type intervalized_first_operand;
+  if (!linearized_first_operand.intervalize(oracle, intervalized_first_operand))
+    return false;
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  if (!linearized_second_operand.intervalize(oracle,
+                                             intervalized_second_operand))
+    return false;
+
+  // FIXME: we are not sure that what we do here is policy-proof.
+  if (intervalized_first_operand.is_bounded()) {
+    if (intervalized_second_operand.is_bounded()) {
+      analyzer_format first_interval_size
+        = intervalized_first_operand.upper()
+        - intervalized_first_operand.lower();
+      analyzer_format second_interval_size
+        = intervalized_second_operand.upper()
+        - intervalized_second_operand.lower();
+      if (first_interval_size <= second_interval_size)
+        intervalize_first = true;
+      else
+        intervalize_first = false;
+    }
+    else
+      intervalize_first = true;
+  }
+  else {
+    if (intervalized_second_operand.is_bounded())
+      intervalize_first = false;
+    else
+      return false;
+  }
+
+  // Here we do the actual computation.
+  // For optimizing, we store the relative error directly into result.
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  if (intervalize_first) {
+    linearized_second_operand.relative_error(analyzed_format, result);
+    linearized_second_operand *= intervalized_first_operand;
+    result *= intervalized_first_operand;
+    result += linearized_second_operand;
+  }
+  else {
+    linearized_first_operand.relative_error(analyzed_format, result);
+    linearized_first_operand *= intervalized_second_operand;
+    result *= intervalized_second_operand;
+    result += linearized_first_operand;
+  }
+
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a
+  division of floating point expressions.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param bop_expr
+  The binary operator concrete expression to linearize.
+  Its binary operator type must be <CODE>DIV</CODE>.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+
+  \par Linearization of division floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+  operator on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adivlf
+  i'
+  =
+  \left(i \adivifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+  \f]
+  Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,
+  we construct the interval linear form
+  \f$
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  \f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adivlf
+  [a, b]\right)
+  \aslf
+  \left(\varepsilon_{\mathbf{f}}\left(
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \adivlf
+  [a, b]\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1],
+  \f]
+  given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1} \oslash \iota\left(
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the relative error
+  associated to \f$l\f$ (see method <CODE>relative_error</CODE> of
+  class Linear_Form), \f$\iota(l)\rho^{\#}\f$ is the intervalization
+  of \f$l\f$ (see method <CODE>intervalize</CODE> of class Linear_Form),
+  and \f$mf_{\mathbf{f}}\f$ is a rounding error computed by function
+  <CODE>compute_absolute_error</CODE>.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+div_linearize(const Binary_Operator<Target>& bop_expr,
+              const FP_Oracle<Target,FP_Interval_Type>& oracle,
+              const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+              Linear_Form<FP_Interval_Type>& result) {
+  PPL_ASSERT(bop_expr.binary_operator() == Binary_Operator<Target>::DIV);
+
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  FP_Linear_Form linearized_second_operand;
+  if (!linearize(*(bop_expr.right_hand_side()), oracle, lf_store,
+                 linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  if (!linearized_second_operand.intervalize(oracle,
+                                             intervalized_second_operand))
+    return false;
+
+  // Check if we may divide by zero.
+  if ((intervalized_second_operand.lower_is_boundary_infinity() ||
+       intervalized_second_operand.lower() <= 0) &&
+      (intervalized_second_operand.upper_is_boundary_infinity() ||
+       intervalized_second_operand.upper() >= 0))
+    return false;
+
+  if (!linearize(*(bop_expr.left_hand_side()), oracle, lf_store, result))
+    return false;
+
+  Floating_Point_Format analyzed_format =
+    bop_expr.type().floating_point_format();
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result /= intervalized_second_operand;
+  rel_error /= intervalized_second_operand;
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+/*! \brief \relates Parma_Polyhedra_Library::Concrete_Expression
+  Helper function used by <CODE>linearize</CODE> to linearize a cast
+  floating point expression.
+
+  Makes \p result become the linearization of \p *this in the given
+  composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param cast_expr
+  The cast operator concrete expression to linearize.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  The modified linear form.
+*/
+template <typename Target, typename FP_Interval_Type>
+static bool
+cast_linearize(const Cast_Operator<Target>& cast_expr,
+               const FP_Oracle<Target,FP_Interval_Type>& oracle,
+               const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+               Linear_Form<FP_Interval_Type>& result) {
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  Floating_Point_Format analyzed_format =
+    cast_expr.type().floating_point_format();
+  const Concrete_Expression<Target>* cast_arg = cast_expr.argument();
+  if (cast_arg->type().is_floating_point()) {
+    if (!linearize(*cast_arg, oracle, lf_store, result))
+      return false;
+    if (!is_less_precise_than(analyzed_format,
+                              cast_arg->type().floating_point_format()) ||
+        result == FP_Linear_Form(FP_Interval_Type(0)) ||
+        result == FP_Linear_Form(FP_Interval_Type(1)))
+      /*
+        FIXME: find a general way to check if the casted constant
+        is exactly representable in the less precise format.
+      */
+      /*
+        We are casting to a more precise format or casting
+        a definitely safe value: do not add errors.
+      */
+      return true;
+  }
+  else {
+    FP_Interval_Type expr_value;
+    if (!oracle.get_integer_expr_value(*cast_arg, expr_value))
+      return false;
+    result = FP_Linear_Form(expr_value);
+    if (is_less_precise_than(Float<analyzer_format>::Binary::floating_point_format, analyzed_format) ||
+        result == FP_Linear_Form(FP_Interval_Type(0)) ||
+        result == FP_Linear_Form(FP_Interval_Type(1)))
+      /*
+        FIXME: find a general way to check if the casted constant
+        is exactly representable in the less precise format.
+      */
+      /*
+        We are casting to a more precise format or casting
+        a definitely safe value: do not add errors.
+      */
+      return true;
+  }
+
+  FP_Linear_Form rel_error;
+  result.relative_error(analyzed_format, rel_error);
+  result += rel_error;
+  FP_Interval_Type absolute_error =
+                   compute_absolute_error<FP_Interval_Type>(analyzed_format);
+  result += absolute_error;
+  return !result.overflows();
+}
+
+//! Linearizes a floating point expression.
+/*! \relates Parma_Polyhedra_Library::Concrete_Expression
+  Makes \p result become a linear form that correctly approximates the
+  value of \p expr in the given composite abstract store.
+
+  \tparam Target
+  A type template parameter specifying the instantiation of
+  Concrete_Expression to be used.
+
+  \tparam FP_Interval_Type
+  A type template parameter for the intervals used in the abstract domain.
+  The interval bounds should have a floating point type.
+
+  \return
+  <CODE>true</CODE> if the linearization succeeded,
+  <CODE>false</CODE> otherwise.
+
+  \param expr
+  The concrete expression to linearize.
+
+  \param oracle
+  The FP_Oracle to be queried.
+
+  \param lf_store
+  The linear form abstract store.
+
+  \param result
+  Becomes the linearized expression.
+
+  Formally, if \p expr represents the expression \f$e\f$ and
+  \p lf_store represents the linear form abstract store \f$\rho^{\#}_l\f$,
+  then \p result will become \f$\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}\f$
+  if the linearization succeeds.
+*/
+template <typename Target, typename FP_Interval_Type>
+bool
+linearize(const Concrete_Expression<Target>& expr,
+          const FP_Oracle<Target,FP_Interval_Type>& oracle,
+          const std::map<dimension_type, Linear_Form<FP_Interval_Type> >& lf_store,
+          Linear_Form<FP_Interval_Type>& result) {
+  typedef typename FP_Interval_Type::boundary_type analyzer_format;
+  typedef Linear_Form<FP_Interval_Type> FP_Linear_Form;
+  typedef Box<FP_Interval_Type> FP_Interval_Abstract_Store;
+  typedef std::map<dimension_type, FP_Linear_Form> FP_Linear_Form_Abstract_Store;
+
+  PPL_ASSERT(expr.type().is_floating_point());
+  // Check that analyzer_format is a floating point type.
+  PPL_COMPILE_TIME_CHECK(!std::numeric_limits<analyzer_format>::is_exact,
+      "linearize<Target, FP_Interval_Type>:"
+      " FP_Interval_Type is not the type of an interval with floating point boundaries.");
+
+  switch(expr.kind()) {
+  case Integer_Constant<Target>::KIND:
+    PPL_UNREACHABLE;
+    break;
+  case Floating_Point_Constant<Target>::KIND:
+  {
+    const Floating_Point_Constant<Target>* fpc_expr =
+      expr.template as<Floating_Point_Constant>();
+    FP_Interval_Type constant_value;
+    if (!oracle.get_fp_constant_value(*fpc_expr, constant_value))
+      return false;
+    result = FP_Linear_Form(constant_value);
+    return true;
+  }
+  case Unary_Operator<Target>::KIND:
+  {
+    const Unary_Operator<Target>* uop_expr =
+      expr.template as<Unary_Operator>();
+    switch (uop_expr->unary_operator()) {
+    case Unary_Operator<Target>::UPLUS:
+      return linearize(*(uop_expr->argument()), oracle, lf_store, result);
+    case Unary_Operator<Target>::UMINUS:
+      if (!linearize(*(uop_expr->argument()), oracle, lf_store, result))
+        return false;
+
+      result.negate();
+      return true;
+    case Unary_Operator<Target>::BNOT:
+      throw std::runtime_error("PPL internal error: unimplemented");
+      break;
+    default:
+      PPL_UNREACHABLE;
+      break;
+    }
+    break;
+  }
+  case Binary_Operator<Target>::KIND:
+  {
+    const Binary_Operator<Target>* bop_expr =
+      expr.template as<Binary_Operator>();
+    switch (bop_expr->binary_operator()) {
+    case Binary_Operator<Target>::ADD:
+      return add_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::SUB:
+      return sub_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::MUL:
+      return mul_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::DIV:
+      return div_linearize(*bop_expr, oracle, lf_store, result);
+    case Binary_Operator<Target>::REM:
+    case Binary_Operator<Target>::BAND:
+    case Binary_Operator<Target>::BOR:
+    case Binary_Operator<Target>::BXOR:
+    case Binary_Operator<Target>::LSHIFT:
+    case Binary_Operator<Target>::RSHIFT:
+      // FIXME: can we do better?
+      return false;
+    default:
+      PPL_UNREACHABLE;
+      return false;
+    }
+    break;
+  }
+  case Approximable_Reference<Target>::KIND:
+  {
+    const Approximable_Reference<Target>* ref_expr =
+      expr.template as<Approximable_Reference>();
+    std::set<dimension_type> associated_dimensions;
+    if (!oracle.get_associated_dimensions(*ref_expr, associated_dimensions)
+        || associated_dimensions.empty())
+      /*
+        We were unable to find any associated space dimension:
+        linearization fails.
+      */
+      return false;
+
+    if (associated_dimensions.size() == 1) {
+      /* If a linear form associated to the only referenced
+         space dimension exists in lf_store, return that form.
+         Otherwise, return the simplest linear form. */
+      dimension_type variable_index = *associated_dimensions.begin();
+      PPL_ASSERT(variable_index != not_a_dimension());
+
+      typename FP_Linear_Form_Abstract_Store::const_iterator
+               variable_value = lf_store.find(variable_index);
+      if (variable_value == lf_store.end()) {
+        result = FP_Linear_Form(Variable(variable_index));
+        return true;
+      }
+
+      result = FP_Linear_Form(variable_value->second);
+      /* FIXME: do we really need to contemplate the possibility
+         that an unbounded linear form was saved into lf_store? */
+      return !result.overflows();
+    }
+
+    /*
+      Here associated_dimensions.size() > 1. Try to return the LUB
+      of all intervals associated to each space dimension.
+    */
+    PPL_ASSERT(associated_dimensions.size() > 1);
+    std::set<dimension_type>::const_iterator i = associated_dimensions.begin();
+    std::set<dimension_type>::const_iterator i_end =
+      associated_dimensions.end();
+    FP_Interval_Type lub(EMPTY);
+    for (; i != i_end; ++i) {
+      FP_Interval_Type curr_int;
+      PPL_ASSERT(*i != not_a_dimension());
+      if (!oracle.get_interval(*i, curr_int))
+        return false;
+
+      lub.join_assign(curr_int);
+    }
+
+    result = FP_Linear_Form(lub);
+    return !result.overflows();
+  }
+  case Cast_Operator<Target>::KIND:
+  {
+    const Cast_Operator<Target>* cast_expr =
+      expr.template as<Cast_Operator>();
+    return cast_linearize(*cast_expr, oracle, lf_store, result);
+  }
+  default:
+    PPL_UNREACHABLE;
+    break;
+  }
+
+  PPL_UNREACHABLE;
+  return false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 1. */
+/* PIP_Tree_Node class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class PIP_Tree_Node;
+class PIP_Solution_Node;
+class PIP_Decision_Node;
+
+typedef const PIP_Tree_Node* PIP_Tree;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 1. */
+/* PIP_Problem class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 35. */
+#include <vector>
+#include <deque>
+#include <iosfwd>
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 40. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Problem */
+std::ostream&
+operator<<(std::ostream& s, const PIP_Problem& pip);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Problem */
+void swap(PIP_Problem& x, PIP_Problem& y);
+
+} // namespace Parma_Polyhedra_Library
+
+//! A Parametric Integer (linear) Programming problem.
+/*! \ingroup PPL_CXX_interface
+  An object of this class encodes a parametric integer (linear)
+  programming problem. The PIP problem is specified by providing:
+   - the dimension of the vector space;
+   - the subset of those dimensions of the vector space that are
+     interpreted as integer parameters (the other space dimensions
+     are interpreted as non-parameter integer variables);
+   - a finite set of linear equality and (strict or non-strict)
+     inequality constraints involving variables and/or parameters;
+     these constraints are used to define:
+       - the <EM>feasible region</EM>, if they involve one or more
+         problem variable (and maybe some parameters);
+       - the <EM>initial context</EM>, if they only involve the
+         parameters;
+   - optionally, the so-called <EM>big parameter</EM>,
+     i.e., a problem parameter to be considered arbitrarily big.
+
+  Note that all problem variables and problem parameters are assumed
+  to take non-negative integer values, so that there is no need
+  to specify non-negativity constraints.
+
+  The class provides support for the (incremental) solution of the
+  PIP problem based on variations of the revised simplex method and
+  on Gomory cut generation techniques.
+
+  The solution for a PIP problem is the lexicographic minimum of the
+  integer points of the feasible region, expressed in terms of the
+  parameters. As the problem to be solved only involves non-negative
+  variables and parameters, the problem will always be either unfeasible
+  or optimizable.
+
+  As the feasibility and the solution value of a PIP problem depend on the
+  values of the parameters, the solution is a binary decision tree,
+  dividing the context parameter set into subsets.
+  The tree nodes are of two kinds:
+   - \e Decision nodes.
+     These are internal tree nodes encoding one or more linear tests
+     on the parameters; if all the tests are satisfied, then the solution
+     is the node's \e true child; otherwise, the solution is the node's
+     \e false child;
+   - \e Solution nodes.
+     These are leaf nodes in the tree, encoding the solution of the problem
+     in the current context subset, where each variable is defined in terms
+     of a linear expression of the parameters.
+     Solution nodes also optionally embed a set of parameter constraints:
+     if all these constraints are satisfied, the solution is described by
+     the node, otherwise the problem has no solution.
+
+  It may happen that a decision node has no \e false child. This means
+  that there is no solution if at least one of the corresponding
+  constraints is not satisfied. Decision nodes having two or more linear
+  tests on the parameters cannot have a \e false child. Decision nodes
+  always have a \e true child.
+
+  Both kinds of tree nodes may also contain the definition of extra
+  parameters which are artificially introduced by the solver to enforce
+  an integral solution. Such artificial parameters are defined by
+  the integer division of a linear expression on the parameters
+  by an integer coefficient.
+
+  By exploiting the incremental nature of the solver, it is possible
+  to reuse part of the computational work already done when solving
+  variants of a given PIP_Problem: currently, incremental resolution
+  supports the addition of space dimensions, the addition of parameters
+  and the addition of constraints.
+
+  \par Example problem
+  An example PIP problem can be defined the following:
+  \code
+  3*j >= -2*i+8
+  j <= 4*i - 4
+  i <= n
+  j <= m
+  \endcode
+  where \c i and \c j are the problem variables
+  and \c n and \c m are the problem parameters.
+  This problem can be optimized; the resulting solution tree may be
+  represented as follows:
+  \verbatim
+  if 7*n >= 10 then
+    if 7*m >= 12 then
+      {i = 2 ; j = 2}
+    else
+      Parameter P = (m) div 2
+      if 2*n + 3*m >= 8 then
+        {i = -m - P + 4 ; j = m}
+      else
+        _|_
+  else
+    _|_
+  \endverbatim
+  The solution tree starts with a decision node depending on the
+  context constraint <code>7*n >= 10</code>.
+  If this constraint is satisfied by the values assigned to the
+  problem parameters, then the (textually first) \c then branch is taken,
+  reaching the \e true child of the root node (which in this case
+  is another decision node); otherwise, the (textually last) \c else
+  branch is taken, for which there is no corresponding \e false child.
+  \par
+  The \f$\perp\f$ notation, also called \e bottom, denotes the
+  lexicographic minimum of an empty set of solutions,
+  here meaning the corresponding subproblem is unfeasible.
+  \par
+  Notice that a tree node may introduce new (non-problem) parameters,
+  as is the case for parameter \c P in the (textually first) \c else
+  branch above. These \e artificial parameters are only meaningful
+  inside the subtree where they are defined and are used to define
+  the parametric values of the problem variables in solution nodes
+  (e.g., the <CODE>{i,j}</CODE> vector in the textually third \c then branch).
+
+  \par Context restriction
+  The above solution is correct in an unrestricted initial context,
+  meaning all possible values are allowed for the parameters. If we
+  restrict the context with the following parameter inequalities:
+  \code
+  m >= n
+  n >= 5
+  \endcode
+  then the resulting optimizing tree will be a simple solution node:
+  \verbatim
+  {i = 2 ; j = 2}
+  \endverbatim
+
+  \par Creating the PIP_Problem object
+  The PIP_Problem object corresponding to the above example can be
+  created as follows:
+  \code
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  \endcode
+  If you want to restrict the initial context, simply add the parameter
+  constraints the same way as for normal constraints.
+  \code
+  cs.insert(m >= n);
+  cs.insert(n >= 5);
+  \endcode
+
+  \par Solving the problem
+  Once the PIP_Problem object has been created, you can start the
+  resolution of the problem by calling the solve() method:
+  \code
+  PIP_Problem_Status status = pip.solve();
+  \endcode
+  where the returned \c status indicates if the problem has been optimized
+  or if it is unfeasible for any possible configuration of the parameter
+  values. The resolution process is also started if an attempt is made
+  to get its solution, as follows:
+  \code
+  const PIP_Tree_Node* node = pip.solution();
+  \endcode
+  In this case, an unfeasible problem will result in an empty solution
+  tree, i.e., assigning a null pointer to \c node.
+
+  \par Printing the solution tree
+  A previously computed solution tree may be printed as follows:
+  \code
+  pip.print_solution(std::cout);
+  \endcode
+  This will produce the following output (note: variables and parameters
+  are printed according to the default output function; see
+  <code>Variable::set_output_function</code>):
+  \verbatim
+  if 7*C >= 10 then
+    if 7*D >= 12 then
+      {2 ; 2}
+    else
+      Parameter E = (D) div 2
+      if 2*C + 3*D >= 8 then
+        {-D - E + 4 ; D}
+      else
+        _|_
+  else
+    _|_
+  \endverbatim
+
+  \par Spanning the solution tree
+  A parameter assignment for a PIP problem binds each of the problem
+  parameters to a non-negative integer value. After fixing a parameter
+  assignment, the ``spanning'' of the PIP problem solution tree refers
+  to the process whereby the solution tree is navigated, starting from
+  the root node: the value of artificial parameters is computed according
+  to the parameter assignment and the node's constraints are evaluated,
+  thereby descending in either the true or the false subtree of decision
+  nodes and eventually reaching a solution node or a bottom node.
+  If a solution node is found, each of the problem variables is provided
+  with a parametric expression, which can be evaluated to a fixed value
+  using the given parameter assignment and the computed values for
+  artificial parameters.
+  \par
+  The coding of the spanning process can be done as follows.
+  First, the root of the PIP solution tree is retrieved:
+  \code
+  const PIP_Tree_Node* node = pip.solution();
+  \endcode
+  If \c node represents an unfeasible solution (i.e., \f$\perp\f$),
+  its value will be \c 0. For a non-null tree node, the virtual methods
+  \c PIP_Tree_Node::as_decision() and \c PIP_Tree_Node::as_solution()
+  can be used to check whether the node is a decision or a solution node:
+  \code
+  const PIP_Solution_Node* sol = node->as_solution();
+  if (sol != 0) {
+    // The node is a solution node
+    ...
+  }
+  else {
+    // The node is a decision node
+    const PIP_Decision_Node* dec = node->as_decision();
+    ...
+  }
+  \endcode
+  \par
+  The true (resp., false) child node of a Decision Node may be accessed by
+  using method \c PIP_Decision_Node::child_node(bool), passing \c true
+  (resp., \c false) as the input argument.
+
+  \par Artificial parameters
+  A PIP_Tree_Node::Artificial_Parameter object represents the result
+  of the integer division of a Linear_Expression (on the other
+  parameters, including the previously-defined artificials)
+  by an integer denominator (a Coefficient object).
+  The dimensions of the artificial parameters (if any) in a tree node
+  have consecutive indices starting from <code>dim+1</code>, where the value
+  of \c dim is computed as follows:
+   - for the tree root node, \c dim is the space dimension of the PIP_Problem;
+   - for any other node of the tree, it is recursively obtained by adding
+     the value of \c dim computed for the parent node to the number of
+     artificial parameters defined in the parent node.
+  \par
+  Since the numbering of dimensions for artificial parameters follows
+  the rule above, the addition of new problem variables and/or new problem
+  parameters to an already solved PIP_Problem object (as done when
+  incrementally solving a problem) will result in the systematic
+  renumbering of all the existing artificial parameters.
+
+  \par Node constraints
+  All kind of tree nodes can contain context constraints.
+  Decision nodes always contain at least one of them.
+  The node's local constraint system can be obtained using method
+  PIP_Tree_Node::constraints.
+  These constraints only involve parameters, including both the problem
+  parameters and the artificial parameters that have been defined
+  in nodes occurring on the path from the root node to the current node.
+  The meaning of these constraints is as follows:
+   - On a decision node, if all tests in the constraints are true, then the
+     solution is the \e true child; otherwise it is the \e false child.
+   - On a solution node, if the (possibly empty) system of constraints
+     evaluates to true for a given parameter assignment, then the solution
+     is described by the node; otherwise the solution is \f$\perp\f$
+     (i.e., the problem is unfeasible for that parameter assignment).
+
+  \par Getting the optimal values for the variables
+  After spanning the solution tree using the given parameter assignment,
+  if a solution node has been reached, then it is possible to retrieve
+  the parametric expression for each of the problem variables using
+  method PIP_Solution_Node::parametric_values. The retrieved expression
+  will be defined in terms of all the parameters (problem parameters
+  and artificial parameters defined along the path).
+
+  \par Solving maximization problems
+  You can solve a lexicographic maximization problem by reformulating its
+  constraints using variable substitution. Proceed the following steps:
+   - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+     which we will call \f$M\f$.
+   - Reformulate each of the maximization problem constraints by
+     substituting each \f$x_i\f$ variable with an expression of the form
+     \f$M-x'_i\f$, where the \f$x'_i\f$ variables are positive variables to
+     be minimized.
+   - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+   - In the solution expressions, the values of the \f$x'\f$ variables will
+     be expressed in the form: \f$x'_i = M-x_i\f$. To get back the value of
+     the expression of each \f$x_i\f$ variable, just apply the
+     formula: \f$x_i = M-x'_i\f$.
+  \par
+  Note that if the resulting expression of one of the \f$x'_i\f$ variables
+  is not in the \f$x'_i = M-x_i\f$ form, this means that the
+  sign-unrestricted problem is unbounded.
+  \par
+  You can choose to maximize only a subset of the variables while minimizing
+  the other variables. In that case, just apply the variable substitution
+  method on the variables you want to be maximized. The variable
+  optimization priority will still be in lexicographic order.
+
+  \par
+  \b Example: consider you want to find the lexicographic maximum of the
+  \f$(x,y)\f$ vector, under the constraints:
+    \f[\left\{\begin{array}{l}
+      y \geq 2x - 4\\
+      y \leq -x + p
+    \end{array}\right.\f]
+  \par
+  where \f$p\f$ is a parameter.
+  \par
+  After variable substitution, the constraints become:
+    \f[\left\{\begin{array}{l}
+      M - y \geq 2M - 2x - 4\\
+      M - y \leq -M + x + p
+    \end{array}\right.\f]
+  \par
+  The code for creating the corresponding problem object is the following:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable M(3);
+  Variables_Set params(p, M);
+  Constraint_System cs;
+  cs.insert(M - y >= 2*M - 2*x - 4);
+  cs.insert(M - y <= -M + x + p);
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_big_parameter_dimension(3);     // M is the big parameter
+  \endcode
+  Solving the problem provides the following solution:
+  \verbatim
+  Parameter E = (C + 1) div 3
+  {D - E - 1 ; -C + D + E + 1}
+  \endverbatim
+  Under the notations above, the solution is:
+  \f[ \left\{\begin{array}{l}
+    x' = M - \left\lfloor\frac{p+1}{3}\right\rfloor - 1 \\
+    y' = M - p + \left\lfloor\frac{p+1}{3}\right\rfloor + 1
+  \end{array}\right.
+  \f]
+  \par
+  Performing substitution again provides us with the values of the original
+  variables:
+  \f[ \left\{\begin{array}{l}
+    x = \left\lfloor\frac{p+1}{3}\right\rfloor + 1 \\
+    y = p - \left\lfloor\frac{p+1}{3}\right\rfloor - 1
+  \end{array}\right.
+  \f]
+
+  \par Allowing variables to be arbitrarily signed
+  You can deal with arbitrarily signed variables by reformulating the
+  constraints using variable substitution. Proceed the following steps:
+   - Create a big parameter (see PIP_Problem::set_big_parameter_dimension),
+     which we will call \f$M\f$.
+   - Reformulate each of the maximization problem constraints by
+     substituting each \f$x_i\f$ variable with an expression of the form
+     \f$x'_i-M\f$, where the \f$x'_i\f$ variables are positive.
+   - Solve the lexicographic minimum for the \f$x'\f$ variable vector.
+   - The solution expression can be read in the form:
+   - In the solution expressions, the values of the \f$x'\f$ variables will
+     be expressed in the form: \f$x'_i = x_i+M\f$. To get back the value of
+     the expression of each signed \f$x_i\f$ variable, just apply the
+     formula: \f$x_i = x'_i-M\f$.
+  \par
+  Note that if the resulting expression of one of the \f$x'_i\f$ variables
+  is not in the \f$x'_i = x_i+M\f$ form, this means that the
+  sign-unrestricted problem is unbounded.
+  \par
+  You can choose to define only a subset of the variables to be
+  sign-unrestricted. In that case, just apply the variable substitution
+  method on the variables you want to be sign-unrestricted.
+
+  \par
+  \b Example: consider you want to find the lexicographic minimum of the
+  \f$(x,y)\f$ vector, where the \f$x\f$ and \f$y\f$ variables are
+  sign-unrestricted, under the constraints:
+    \f[\left\{\begin{array}{l}
+      y \geq -2x - 4\\
+      2y \leq x + 2p
+    \end{array}\right.\f]
+  \par
+  where \f$p\f$ is a parameter.
+  \par
+  After variable substitution, the constraints become:
+    \f[\left\{\begin{array}{l}
+      y' - M \geq -2x' + 2M - 4\\
+      2y' - 2M \leq x' - M + 2p
+    \end{array}\right.\f]
+  \par
+  The code for creating the corresponding problem object is the following:
+  \code
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable M(3);
+  Variables_Set params(p, M);
+  Constraint_System cs;
+  cs.insert(y - M >= -2*x + 2*M - 4);
+  cs.insert(2*y - 2*M <= x - M + 2*p);
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_big_parameter_dimension(3);     // M is the big parameter
+  \endcode
+  \par
+  Solving the problem provides the following solution:
+  \verbatim
+  Parameter E = (2*C + 3) div 5
+  {D - E - 1 ; D + 2*E - 2}
+  \endverbatim
+  Under the notations above, the solution is:
+  \f[ \left\{\begin{array}{l}
+    x' = M - \left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+    y' = M + 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+  \end{array}\right.
+  \f]
+  \par
+  Performing substitution again provides us with the values of the original
+  variables:
+  \f[ \left\{\begin{array}{l}
+    x = -\left\lfloor\frac{2p+3}{5}\right\rfloor - 1 \\
+    y = 2\left\lfloor\frac{2p+3}{5}\right\rfloor - 2
+  \end{array}\right.
+  \f]
+
+  \par Allowing parameters to be arbitrarily signed
+  You can consider a parameter \f$p\f$ arbitrarily signed by replacing
+  \f$p\f$ with \f$p^+-p^-\f$, where both \f$p^+\f$ and \f$p^-\f$ are
+  positive parameters. To represent a set of arbitrarily signed parameters,
+  replace each parameter \f$p_i\f$ with \f$p^+_i-p^-\f$, where \f$-p^-\f$ is
+  the minimum negative value of all parameters.
+
+  \par Minimizing a linear cost function
+  Lexicographic solving can be used to find the parametric minimum of a
+  linear cost function.
+  \par
+  Suppose the variables are named \f$x_1, x_2, \dots, x_n\f$, and the
+  parameters \f$p_1, p_2, \dots, p_m\f$. You can minimize a linear cost
+  function \f$f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ by simply adding the
+  constraint \f$x_1 \geq f(x_2, \dots, x_n, p_1, \dots, p_m)\f$ to the
+  constraint system. As lexicographic minimization ensures \f$x_1\f$ is
+  minimized in priority, and because \f$x_1\f$ is forced by a constraint to
+  be superior or equal to the cost function, optimal solutions of the
+  problem necessarily ensure that the solution value of \f$x_1\f$ is the
+  optimal value of the cost function.
+*/
+class Parma_Polyhedra_Library::PIP_Problem {
+public:
+  //! Builds a trivial PIP problem.
+  /*!
+    A trivial PIP problem requires to compute the lexicographic minimum
+    on a vector space under no constraints and with no parameters:
+    due to the implicit non-negativity constraints, the origin of the
+    vector space is an optimal solution.
+
+    \param dim
+    The dimension of the vector space enclosing \p *this
+    (optional argument with default value \f$0\f$).
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+  */
+  explicit PIP_Problem(dimension_type dim = 0);
+
+  /*! \brief
+    Builds a PIP problem having space dimension \p dim
+    from the sequence of constraints in the range
+    \f$[\mathrm{first}, \mathrm{last})\f$;
+    those dimensions whose indices occur in \p p_vars are
+    interpreted as parameters.
+
+    \param dim
+    The dimension of the vector space (variables and parameters) enclosing
+    \p *this.
+
+    \param first
+    An input iterator to the start of the sequence of constraints.
+
+    \param last
+    A past-the-end input iterator to the sequence of constraints.
+
+    \param p_vars
+    The set of variables' indexes that are interpreted as parameters.
+
+    \exception std::length_error
+    Thrown if \p dim exceeds <CODE>max_space_dimension()</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if the space dimension of a constraint in the sequence
+    (resp., the parameter variables) is strictly greater than \p dim.
+  */
+  template <typename In>
+  PIP_Problem(dimension_type dim, In first, In last,
+              const Variables_Set& p_vars);
+
+  //! Ordinary copy-constructor.
+  PIP_Problem(const PIP_Problem& y);
+
+  //! Destructor.
+  ~PIP_Problem();
+
+  //! Assignment operator.
+  PIP_Problem& operator=(const PIP_Problem& y);
+
+  //! Returns the maximum space dimension a PIP_Problem can handle.
+  static dimension_type max_space_dimension();
+
+  //! Returns the space dimension of the PIP problem.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns a set containing all the variables' indexes representing
+    the parameters of the PIP problem.
+  */
+  const Variables_Set& parameter_space_dimensions() const;
+
+private:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint> Constraint_Sequence;
+
+public:
+  /*! \brief
+    A type alias for the read-only iterator on the constraints
+    defining the feasible region.
+  */
+  typedef Constraint_Sequence::const_iterator const_iterator;
+
+  /*! \brief
+    Returns a read-only iterator to the first constraint defining
+    the feasible region.
+  */
+  const_iterator constraints_begin() const;
+
+  /*! \brief
+    Returns a past-the-end read-only iterator to the sequence of
+    constraints defining the feasible region.
+  */
+  const_iterator constraints_end() const;
+
+  //! Resets \p *this to be equal to the trivial PIP problem.
+  /*!
+    The space dimension is reset to \f$0\f$.
+  */
+  void clear();
+
+  /*! \brief
+    Adds <CODE>m_vars + m_params</CODE> new space dimensions
+    and embeds the old PIP problem in the new vector space.
+
+    \param m_vars
+    The number of space dimensions to add that are interpreted as
+    PIP problem variables (i.e., non parameters). These are added
+    \e before adding the \p m_params parameters.
+
+    \param m_params
+    The number of space dimensions to add that are interpreted as
+    PIP problem parameters. These are added \e after having added the
+    \p m_vars problem variables.
+
+    \exception std::length_error
+    Thrown if adding <CODE>m_vars + m_params</CODE> new space
+    dimensions would cause the vector space to exceed dimension
+    <CODE>max_space_dimension()</CODE>.
+
+    The new space dimensions will be those having the highest indexes
+    in the new PIP problem; they are initially unconstrained.
+  */
+  void add_space_dimensions_and_embed(dimension_type m_vars,
+                                      dimension_type m_params);
+
+  /*! \brief
+    Sets the space dimensions whose indexes which are in set \p p_vars
+    to be parameter space dimensions.
+
+    \exception std::invalid_argument
+    Thrown if some index in \p p_vars does not correspond to
+    a space dimension in \p *this.
+  */
+  void add_to_parameter_space_dimensions(const Variables_Set& p_vars);
+
+  /*! \brief
+    Adds a copy of constraint \p c to the PIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the space dimension of \p c is strictly greater than
+    the space dimension of \p *this.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Adds a copy of the constraints in \p cs to the PIP problem.
+
+    \exception std::invalid_argument
+    Thrown if the space dimension of constraint system \p cs is strictly
+    greater than the space dimension of \p *this.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  //! Checks satisfiability of \p *this.
+  /*!
+    \return
+    \c true if and only if the PIP problem is satisfiable.
+  */
+  bool is_satisfiable() const;
+
+  //! Optimizes the PIP problem.
+  /*!
+    \return
+    A PIP_Problem_Status flag indicating the outcome of the optimization
+    attempt (unfeasible or optimized problem).
+  */
+  PIP_Problem_Status solve() const;
+
+  //! Returns a feasible solution for \p *this, if it exists.
+  /*!
+    A null pointer is returned for an unfeasible PIP problem.
+  */
+  PIP_Tree solution() const;
+
+  //! Returns an optimizing solution for \p *this, if it exists.
+  /*!
+    A null pointer is returned for an unfeasible PIP problem.
+  */
+  PIP_Tree optimizing_solution() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //! Prints on \p s the solution computed for \p *this.
+  /*!
+    \param s
+    The output stream.
+
+    \param indent
+    An indentation parameter (default value 0).
+
+    \exception std::logic_error
+    Thrown if trying to print the solution when the PIP problem
+    still has to be solved.
+  */
+  void print_solution(std::ostream& s, int indent = 0) const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(PIP_Problem& y);
+
+  //! Possible names for PIP_Problem control parameters.
+  enum Control_Parameter_Name {
+    //! Cutting strategy
+    CUTTING_STRATEGY,
+    //! Pivot row strategy
+    PIVOT_ROW_STRATEGY,
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    CONTROL_PARAMETER_NAME_SIZE
+  };
+
+  //! Possible values for PIP_Problem control parameters.
+  enum Control_Parameter_Value {
+    //! Choose the first non-integer row.
+    CUTTING_STRATEGY_FIRST,
+    //! Choose row which generates the deepest cut.
+    CUTTING_STRATEGY_DEEPEST,
+    //! Always generate all possible cuts.
+    CUTTING_STRATEGY_ALL,
+
+    //! Choose the first row with negative parameter sign.
+    PIVOT_ROW_STRATEGY_FIRST,
+    //! Choose a row that generates a lexicographically maximal pivot column.
+    PIVOT_ROW_STRATEGY_MAX_COLUMN,
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    //! Number of different enumeration values.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+    CONTROL_PARAMETER_VALUE_SIZE
+  };
+
+  //! Returns the value of control parameter \p name.
+  Control_Parameter_Value
+  get_control_parameter(Control_Parameter_Name name) const;
+
+  //! Sets control parameter \p value.
+  void set_control_parameter(Control_Parameter_Value value);
+
+  //! Sets the dimension for the big parameter to \p big_dim.
+  void set_big_parameter_dimension(dimension_type big_dim);
+
+  /*! \brief
+    Returns the space dimension for the big parameter.
+
+    If a big parameter was not set, returns \c not_a_dimension().
+  */
+  dimension_type get_big_parameter_dimension() const;
+
+private:
+  //! Initializes the control parameters with default values.
+  void control_parameters_init();
+
+  //! Copies the control parameters from problem object \p y.
+  void control_parameters_copy(const PIP_Problem& y);
+
+  //! The dimension of the vector space.
+  dimension_type external_space_dim;
+
+  /*! \brief
+    The space dimension of the current (partial) solution of the
+    PIP problem; it may be smaller than \p external_space_dim.
+  */
+  dimension_type internal_space_dim;
+
+  //! An enumerated type describing the internal status of the PIP problem.
+  enum Status {
+    //! The PIP problem is unsatisfiable.
+    UNSATISFIABLE,
+    //! The PIP problem is optimized; the solution tree has been computed.
+    OPTIMIZED,
+    /*! \brief
+      The feasible region of the PIP problem has been changed by adding
+      new variables, parameters or constraints; a feasible solution for
+      the old feasible region is still available.
+    */
+    PARTIALLY_SATISFIABLE
+  };
+
+  //! The internal state of the MIP problem.
+  Status status;
+
+  //! The current solution decision tree
+  PIP_Tree_Node* current_solution;
+
+  //! The sequence of constraints describing the feasible region.
+  Constraint_Sequence input_cs;
+
+  //! The first index of `input_cs' containing a pending constraint.
+  dimension_type first_pending_constraint;
+
+  /*! \brief
+    A set containing all the indices of space dimensions that are
+    interpreted as problem parameters.
+  */
+  Variables_Set parameters;
+
+#if PPL_USE_SPARSE_MATRIX
+  typedef Sparse_Row Row;
+#else
+  typedef Dense_Row Row;
+#endif
+
+  /*! \brief
+    The initial context
+
+    Contains problem constraints on parameters only
+  */
+  Matrix<Row> initial_context;
+
+  //! The control parameters for the problem object.
+  Control_Parameter_Value
+  control_parameters[CONTROL_PARAMETER_NAME_SIZE];
+
+  /*! \brief
+    The dimension for the big parameter, or \c not_a_dimension()
+    if not set.
+  */
+  dimension_type big_parameter_dimension;
+
+  friend class PIP_Solution_Node;
+};
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_inlines.hh line 1. */
+/* PIP_Problem class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+PIP_Problem::space_dimension() const {
+  return external_space_dim;
+}
+
+inline dimension_type
+PIP_Problem::max_space_dimension() {
+  return Constraint::max_space_dimension();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_begin() const {
+  return input_cs.begin();
+}
+
+inline PIP_Problem::const_iterator
+PIP_Problem::constraints_end() const {
+  return input_cs.end();
+}
+
+inline const Variables_Set&
+PIP_Problem::parameter_space_dimensions() const {
+  return parameters;
+}
+
+inline void
+PIP_Problem::m_swap(PIP_Problem& y) {
+  using std::swap;
+  swap(external_space_dim, y.external_space_dim);
+  swap(internal_space_dim, y.internal_space_dim);
+  swap(status, y.status);
+  swap(current_solution, y.current_solution);
+  swap(input_cs, y.input_cs);
+  swap(first_pending_constraint, y.first_pending_constraint);
+  swap(parameters, y.parameters);
+  swap(initial_context, y.initial_context);
+  for (dimension_type i = CONTROL_PARAMETER_NAME_SIZE; i-- > 0; )
+    swap(control_parameters[i], y.control_parameters[i]);
+  swap(big_parameter_dimension, y.big_parameter_dimension);
+}
+
+inline PIP_Problem&
+PIP_Problem::operator=(const PIP_Problem& y) {
+  PIP_Problem tmp(y);
+  m_swap(tmp);
+  return *this;
+}
+
+inline PIP_Problem::Control_Parameter_Value
+PIP_Problem::get_control_parameter(Control_Parameter_Name name) const {
+  PPL_ASSERT(name >= 0 && name < CONTROL_PARAMETER_NAME_SIZE);
+  return control_parameters[name];
+}
+
+inline dimension_type
+PIP_Problem::get_big_parameter_dimension() const {
+  return big_parameter_dimension;
+}
+
+/*! \relates PIP_Problem */
+inline void
+swap(PIP_Problem& x, PIP_Problem& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_templates.hh line 1. */
+/* PIP_Problem class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_templates.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename In>
+PIP_Problem::PIP_Problem(dimension_type dim,
+                         In first, In last,
+                         const Variables_Set& p_vars)
+  : external_space_dim(dim),
+    internal_space_dim(0),
+    status(PARTIALLY_SATISFIABLE),
+    current_solution(0),
+    input_cs(),
+    first_pending_constraint(0),
+    parameters(p_vars),
+    initial_context(),
+    big_parameter_dimension(not_a_dimension()) {
+  // Check that integer Variables_Set does not exceed the space dimension
+  // of the problem.
+  if (p_vars.space_dimension() > external_space_dim) {
+    std::ostringstream s;
+    s << "PPL::PIP_Problem::PIP_Problem(dim, first, last, p_vars):\n"
+      << "dim == " << external_space_dim
+      << " and p_vars.space_dimension() == "
+      << p_vars.space_dimension()
+      << " are dimension incompatible.";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Check for space dimension overflow.
+  if (dim > max_space_dimension())
+    throw std::length_error("PPL::PIP_Problem::"
+                            "PIP_Problem(dim, first, last, p_vars):\n"
+                            "dim exceeds the maximum allowed "
+                            "space dimension.");
+  // Check the constraints.
+  for (In i = first; i != last; ++i) {
+    if (i->space_dimension() > dim) {
+      std::ostringstream s;
+      s << "PPL::PIP_Problem::"
+        << "PIP_Problem(dim, first, last, p_vars):\n"
+        << "range [first, last) contains a constraint having space "
+        << "dimension == " << i->space_dimension()
+        << " that exceeds this->space_dimension == " << dim << ".";
+      throw std::invalid_argument(s.str());
+    }
+    input_cs.push_back(*i);
+  }
+  control_parameters_init();
+  PPL_ASSERT(OK());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Problem_defs.hh line 833. */
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 36. */
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 40. */
+
+namespace Parma_Polyhedra_Library {
+
+//! A node of the PIP solution tree.
+/*!
+  This is the base class for the nodes of the binary trees representing
+  the solutions of PIP problems. From this one, two classes are derived:
+    - PIP_Decision_Node, for the internal nodes of the tree;
+    - PIP_Solution_Node, for the leaves of the tree.
+*/
+class PIP_Tree_Node {
+protected:
+  //! Constructor: builds a node owned by \p *owner.
+  explicit PIP_Tree_Node(const PIP_Problem* owner);
+
+  //! Copy constructor.
+  PIP_Tree_Node(const PIP_Tree_Node& y);
+
+  //! Returns a pointer to the PIP_Problem owning object.
+  const PIP_Problem* get_owner() const;
+
+  //! Sets the pointer to the PIP_Problem owning object.
+  virtual void set_owner(const PIP_Problem* owner) = 0;
+
+  /*! \brief
+    Returns \c true if and only if all the nodes in the subtree
+    rooted in \p *this are owned by \p *owner.
+  */
+  virtual bool check_ownership(const PIP_Problem* owner) const = 0;
+
+public:
+#if PPL_USE_SPARSE_MATRIX
+  typedef Sparse_Row Row;
+#else
+  typedef Dense_Row Row;
+#endif
+
+  //! Returns a pointer to a dynamically-allocated copy of \p *this.
+  virtual PIP_Tree_Node* clone() const = 0;
+
+  //! Destructor.
+  virtual ~PIP_Tree_Node();
+
+  //! Returns \c true if and only if \p *this is well formed.
+  virtual bool OK() const = 0;
+
+  //! Returns \p this if \p *this is a solution node, 0 otherwise.
+  virtual const PIP_Solution_Node* as_solution() const = 0;
+
+  //! Returns \p this if \p *this is a decision node, 0 otherwise.
+  virtual const PIP_Decision_Node* as_decision() const = 0;
+
+  /*! \brief
+    Returns the system of parameter constraints controlling \p *this.
+
+    The indices in the constraints are the same as the original variables and
+    parameters. Coefficients in indices corresponding to variables always are
+    zero.
+  */
+  const Constraint_System& constraints() const;
+
+  class Artificial_Parameter;
+
+  //! A type alias for a sequence of Artificial_Parameter's.
+  typedef std::vector<Artificial_Parameter> Artificial_Parameter_Sequence;
+
+  //! Returns a const_iterator to the beginning of local artificial parameters.
+  Artificial_Parameter_Sequence::const_iterator art_parameter_begin() const;
+
+  //! Returns a const_iterator to the end of local artificial parameters.
+  Artificial_Parameter_Sequence::const_iterator art_parameter_end() const;
+
+  //! Returns the number of local artificial parameters.
+  dimension_type art_parameter_count() const;
+
+  //! Prints on \p s the tree rooted in \p *this.
+  /*!
+    \param s
+    The output stream.
+
+    \param indent
+    The amount of indentation.
+  */
+  void print(std::ostream& s, int indent = 0) const;
+
+  //! Dumps to \p s an ASCII representation of \p *this.
+  void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const = 0;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const = 0;
+
+protected:
+  //! A type alias for a sequence of constraints.
+  typedef std::vector<Constraint> Constraint_Sequence;
+
+  // Only PIP_Problem and PIP_Decision_Node are allowed to use the
+  // constructor and methods.
+  friend class PIP_Problem;
+  friend class PIP_Decision_Node;
+  friend class PIP_Solution_Node;
+
+  //! A pointer to the PIP_Problem object owning this node.
+  const PIP_Problem* owner_;
+
+  //! A pointer to the parent of \p *this, null if \p *this is the root.
+  const PIP_Decision_Node* parent_;
+
+  //! The local system of parameter constraints.
+  Constraint_System constraints_;
+
+  //! The local sequence of expressions for local artificial parameters.
+  Artificial_Parameter_Sequence artificial_parameters;
+
+  //! Returns a pointer to this node's parent.
+  const PIP_Decision_Node* parent() const;
+
+  //! Set this node's parent to \p *p.
+  void set_parent(const PIP_Decision_Node* p);
+
+  /*! \brief
+    Populates the parametric simplex tableau using external data.
+
+    \param pip
+    The PIP_Problem object containing this node.
+
+    \param external_space_dim
+    The number of all problem variables and problem parameters
+    (excluding artificial parameters).
+
+    \param first_pending_constraint
+    The first element in \p input_cs to be added to the tableau,
+    which already contains the previous elements.
+
+    \param input_cs
+    All the constraints of the PIP problem.
+
+    \param parameters
+    The set of indices of the problem parameters.
+  */
+  virtual void update_tableau(const PIP_Problem& pip,
+                              dimension_type external_space_dim,
+                              dimension_type first_pending_constraint,
+                              const Constraint_Sequence& input_cs,
+                              const Variables_Set& parameters) = 0;
+
+  /*! \brief
+    Executes a parametric simplex on the tableau, under specified context.
+
+    \return
+    The root of the PIP tree solution, or 0 if unfeasible.
+
+    \param pip
+    The PIP_Problem object containing this node.
+
+    \param check_feasible_context
+    Whether the resolution process should (re-)check feasibility of
+    context (since the initial context may have been modified).
+
+    \param context
+    The context, being a set of constraints on the parameters.
+
+    \param params
+    The local parameter set, including parent's artificial parameters.
+
+    \param space_dim
+    The space dimension of parent, including artificial parameters.
+
+    \param indent_level
+    The indentation level (for debugging output only).
+  */
+  virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+                               bool check_feasible_context,
+                               const Matrix<Row>& context,
+                               const Variables_Set& params,
+                               dimension_type space_dim,
+                               int indent_level) = 0;
+
+  //! Inserts a new parametric constraint in internal row format.
+  void add_constraint(const Row& row, const Variables_Set& parameters);
+
+  //! Merges parent's artificial parameters into \p *this.
+  void parent_merge();
+
+  //! Prints on \p s the tree rooted in \p *this.
+  /*!
+    \param s
+    The output stream.
+
+    \param indent
+    The amount of indentation.
+
+    \param pip_dim_is_param
+    A vector of Boolean flags telling which PIP problem dimensions are
+    problem parameters. The size of the vector is equal to the PIP
+    problem internal space dimension (i.e., no artificial parameters).
+
+    \param first_art_dim
+    The first space dimension corresponding to an artificial parameter
+    that was created in this node (if any).
+  */
+  virtual void print_tree(std::ostream& s,
+                          int indent,
+                          const std::vector<bool>& pip_dim_is_param,
+                          dimension_type first_art_dim) const = 0;
+
+  //! A helper function used when printing PIP trees.
+  static void
+  indent_and_print(std::ostream& s, int indent, const char* str);
+
+  /*! \brief
+    Checks whether a context matrix is satisfiable.
+
+    The satisfiability check is implemented by the revised dual simplex
+    algorithm on the context matrix. The algorithm ensures the feasible
+    solution is integer by applying a cut generation method when
+    intermediate non-integer solutions are found.
+  */
+  static bool compatibility_check(Matrix<Row>& s);
+
+  /*! \brief
+    Helper method: checks for satisfiability of the restricted context
+    obtained by adding \p row to \p context.
+  */
+  static bool compatibility_check(const Matrix<Row>& context, const Row& row);
+
+}; // class PIP_Tree_Node
+
+
+/*! \brief
+  Artificial parameters in PIP solution trees.
+
+  These parameters are built from a linear expression combining other
+  parameters (constant term included) divided by a positive integer
+  denominator. Coefficients at variables indices corresponding to
+  PIP problem variables are always zero.
+*/
+class PIP_Tree_Node::Artificial_Parameter
+  : public Linear_Expression {
+public:
+  //! Default constructor: builds a zero artificial parameter.
+  Artificial_Parameter();
+
+  //! Constructor.
+  /*!
+    Builds artificial parameter \f$\frac{\mathtt{expr}}{\mathtt{d}}\f$.
+
+    \param expr
+    The expression that, after normalization, will form the numerator of
+    the artificial parameter.
+
+    \param d
+    The integer constant that, after normalization, will form the
+    denominator of the artificial parameter.
+
+    \exception std::invalid_argument
+    Thrown if \p d is zero.
+
+    Normalization will ensure that the denominator is positive.
+  */
+  Artificial_Parameter(const Linear_Expression& expr,
+                       Coefficient_traits::const_reference d);
+
+  //! Copy constructor.
+  Artificial_Parameter(const Artificial_Parameter& y);
+
+  //! Returns the normalized (i.e., positive) denominator.
+  Coefficient_traits::const_reference denominator() const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Artificial_Parameter& y);
+
+  //! Returns \c true if and only if \p *this and \p y are equal.
+  /*!
+    Note that two artificial parameters having different space dimensions
+    are considered to be different.
+  */
+  bool operator==(const Artificial_Parameter& y) const;
+  //! Returns \c true if and only if \p *this and \p y are different.
+  bool operator!=(const Artificial_Parameter& y) const;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Returns \c true if and only if the parameter is well-formed.
+  bool OK() const;
+
+private:
+  //! The normalized (i.e., positive) denominator.
+  Coefficient denom;
+}; // class PIP_Tree_Node::Artificial_Parameter
+
+
+//! Swaps \p x with \p y.
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+     PIP_Tree_Node::Artificial_Parameter& y);
+
+
+//! A tree node representing part of the space of solutions.
+class PIP_Solution_Node : public PIP_Tree_Node {
+public:
+
+  //! Constructor: builds a solution node owned by \p *owner.
+  explicit PIP_Solution_Node(const PIP_Problem* owner);
+
+  //! Returns a pointer to a dynamically-allocated copy of \p *this.
+  virtual PIP_Tree_Node* clone() const;
+
+  //! Destructor.
+  virtual ~PIP_Solution_Node();
+
+  //! Returns \c true if and only if \p *this is well formed.
+  virtual bool OK() const;
+
+  //! Returns \p this.
+  virtual const PIP_Solution_Node* as_solution() const;
+
+  //! Returns 0, since \p this is not a decision node.
+  virtual const PIP_Decision_Node* as_decision() const;
+
+  /*! \brief
+    Returns a parametric expression for the values of problem variable \p var.
+
+    The returned linear expression may involve problem parameters
+    as well as artificial parameters.
+
+    \param var
+    The problem variable which is queried about.
+
+    \exception std::invalid_argument
+    Thrown if \p var is dimension-incompatible with the PIP_Problem
+    owning this solution node, or if \p var is a problem parameter.
+  */
+  const Linear_Expression& parametric_values(Variable var) const;
+
+  //! Dumps to \p os an ASCII representation of \p *this.
+  void ascii_dump(std::ostream& os) const;
+
+  /*! \brief
+    Loads from \p is an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& is);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+  //! The type for parametric simplex tableau.
+  struct Tableau {
+    //! The matrix of simplex coefficients.
+    Matrix<Row> s;
+    //! The matrix of parameter coefficients.
+    Matrix<Row> t;
+    //! A common denominator for all matrix elements
+    Coefficient denom;
+
+    //! Default constructor.
+    Tableau();
+    //! Copy constructor.
+    Tableau(const Tableau& y);
+    //! Destructor.
+    ~Tableau();
+
+    //! Tests whether the matrix is integer, i.e., the denominator is 1.
+    bool is_integer() const;
+
+    //! Multiplies all coefficients and denominator with ratio.
+    void scale(Coefficient_traits::const_reference ratio);
+
+    //! Normalizes the modulo of coefficients so that they are mutually prime.
+    /*!
+      Computes the Greatest Common Divisor (GCD) among the elements of
+      the matrices and normalizes them and the denominator by the GCD itself.
+    */
+    void normalize();
+
+    /*! \brief
+      Compares two pivot row and column pairs before pivoting.
+
+      The algorithm searches the first (ie, leftmost) column \f$k\f$ in
+      parameter matrix for which the \f$c=s_{*j}\frac{t_{ik}}{s_{ij}}\f$
+      and \f$c'=s_{*j'}\frac{t_{i'k}}{s_{i'j'}}\f$ columns are different,
+      where \f$s_{*j}\f$ denotes the \f$j\f$<sup>th</sup> column from the
+      \f$s\f$ matrix and \f$s_{*j'}\f$ is the \f$j'\f$<sup>th</sup> column
+      of \f$s\f$.
+
+      \f$c\f$ is the computed column that would be subtracted to column
+      \f$k\f$ in parameter matrix if pivoting is done using the \f$(i,j)\f$
+      row and column pair.
+      \f$c'\f$ is the computed column that would be subtracted to column
+      \f$k\f$ in parameter matrix if pivoting is done using the
+      \f$(i',j')\f$ row and column pair.
+
+      The test is true if the computed \f$-c\f$ column is lexicographically
+      bigger than the \f$-c'\f$ column. Due to the column ordering in the
+      parameter matrix of the tableau, leftmost search will enforce solution
+      increase with respect to the following priority order:
+       - the constant term
+       - the coefficients for the original parameters
+       - the coefficients for the oldest artificial parameters.
+
+      \return
+      \c true if pivot row and column pair \f$(i,j)\f$ is more
+      suitable for pivoting than the \f$(i',j')\f$ pair
+
+      \param mapping
+      The PIP_Solution_Node::mapping vector for the tableau.
+
+      \param basis
+      The PIP_Solution_Node::basis vector for the tableau.
+
+      \param row_0
+      The row number for the first pivot row and column pair to be compared.
+
+      \param col_0
+      The column number for the first pivot row and column pair to be
+      compared.
+
+      \param row_1
+      The row number for the second pivot row and column pair to be compared.
+
+      \param col_1
+      The column number for the second pivot row and column pair to be
+      compared.
+    */
+    bool is_better_pivot(const std::vector<dimension_type>& mapping,
+                         const std::vector<bool>& basis,
+                         const dimension_type row_0,
+                         const dimension_type col_0,
+                         const dimension_type row_1,
+                         const dimension_type col_1) const;
+
+    //! Returns the value of the denominator.
+    Coefficient_traits::const_reference denominator() const;
+
+    //! Dumps to \p os an ASCII representation of \p *this.
+    void ascii_dump(std::ostream& os) const;
+
+    /*! \brief
+      Loads from \p is an ASCII representation (as produced by
+      ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+      Returns \c true if successful, \c false otherwise.
+    */
+    bool ascii_load(std::istream& is);
+
+    //! Returns the size in bytes of the memory managed by \p *this.
+    /*!
+      \note
+      No need for a \c total_memory_in_bytes() method, since
+      class Tableau is a private inner class of PIP_Solution_Node.
+    */
+    memory_size_type external_memory_in_bytes() const;
+
+    //! Returns \c true if and only if \p *this is well formed.
+    bool OK() const;
+  }; // struct Tableau
+
+  //! The parametric simplex tableau.
+  Tableau tableau;
+
+  /*! \brief
+    A boolean vector for identifying the basic variables.
+
+    Variable identifiers are numbered from 0 to <CODE>n+m-1</CODE>, where \p n
+    is the number of columns in the simplex tableau corresponding to variables,
+    and \p m is the number of rows.
+
+    Indices from 0 to <CODE>n-1</CODE> correspond to the original variables.
+
+    Indices from \p n to <CODE>n+m-1</CODE> correspond to the slack variables
+    associated to the internal constraints, which do not strictly correspond
+    to original constraints, since these may have been transformed to fit the
+    standard form of the dual simplex.
+
+    The value for <CODE>basis[i]</CODE> is:
+     - \b true if variable \p i is basic,
+     - \b false if variable \p i is nonbasic.
+  */
+  std::vector<bool> basis;
+
+  /*! \brief
+    A mapping between the tableau rows/columns and the original variables.
+
+    The value of <CODE>mapping[i]</CODE> depends of the value of <CODE>basis[i]</CODE>.
+
+     - If <CODE>basis[i]</CODE> is \b true, <CODE>mapping[i]</CODE> encodes the column
+       index of variable \p i in the \p s matrix of the tableau.
+     - If <CODE>basis[i]</CODE> is \b false, <CODE>mapping[i]</CODE> encodes the row
+       index of variable \p i in the tableau.
+  */
+  std::vector<dimension_type> mapping;
+
+  /*! \brief
+    The variable identifiers associated to the rows of the simplex tableau.
+  */
+  std::vector<dimension_type> var_row;
+
+  /*! \brief
+    The variable identifiers associated to the columns of the simplex tableau.
+  */
+  std::vector<dimension_type> var_column;
+
+  /*! \brief
+    The variable number of the special inequality used for modeling
+    equality constraints.
+
+    The subset of equality constraints in a specific problem can be expressed
+    as: \f$f_i(x,p) = 0 ; 1 \leq i \leq n\f$. As the dual simplex standard form
+    requires constraints to be inequalities, the following constraints can be
+    modeled as follows:
+
+     - \f$f_i(x,p) \geq 0 ; 1 \leq i \leq n\f$
+
+     - \f$\sum\limits_{i=1}^n f_i(x,p) \leq 0\f$
+
+    The \p special_equality_row value stores the variable number of the
+    specific constraint which is used to model the latter sum of
+    constraints. If no such constraint exists, the value is set to \p 0.
+  */
+  dimension_type special_equality_row;
+
+  /*! \brief
+    The column index in the parametric part of the simplex tableau
+    corresponding to the big parameter; \c not_a_dimension() if not set.
+  */
+  dimension_type big_dimension;
+
+  //! The possible values for the sign of a parametric linear expression.
+  enum Row_Sign {
+    //! Not computed yet (default).
+    UNKNOWN,
+    //! All row coefficients are zero.
+    ZERO,
+    //! All nonzero row coefficients are positive.
+    POSITIVE,
+    //! All nonzero row coefficients are negative.
+    NEGATIVE,
+    //! The row contains both positive and negative coefficients.
+    MIXED
+  };
+
+  //! A cache for computed sign values of constraint parametric RHS.
+  std::vector<Row_Sign> sign;
+
+  //! Parametric values for the solution.
+  std::vector<Linear_Expression> solution;
+
+  //! An indicator for solution validity.
+  bool solution_valid;
+
+  //! Returns the sign of row \p x.
+  static Row_Sign row_sign(const Row& x,
+                           dimension_type big_dimension);
+
+protected:
+  //! Copy constructor.
+  PIP_Solution_Node(const PIP_Solution_Node& y);
+
+  //! A tag type to select the alternative copy constructor.
+  struct No_Constraints {};
+
+  //! Alternative copy constructor.
+  /*!
+    This constructor differs from the default copy constructor in that
+    it will not copy the constraint system, nor the artificial parameters.
+  */
+  PIP_Solution_Node(const PIP_Solution_Node& y, No_Constraints);
+
+  // PIP_Problem::ascii load() method needs access set_owner().
+  friend bool PIP_Problem::ascii_load(std::istream& s);
+
+  //! Sets the pointer to the PIP_Problem owning object.
+  virtual void set_owner(const PIP_Problem* owner);
+
+  /*! \brief
+    Returns \c true if and only if all the nodes in the subtree
+    rooted in \p *this is owned by \p *pip.
+  */
+  virtual bool check_ownership(const PIP_Problem* owner) const;
+
+  //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+  virtual void update_tableau(const PIP_Problem& pip,
+                              dimension_type external_space_dim,
+                              dimension_type first_pending_constraint,
+                              const Constraint_Sequence& input_cs,
+                              const Variables_Set& parameters);
+
+  /*! \brief
+    Update the solution values.
+
+    \param pip_dim_is_param
+    A vector of Boolean flags telling which PIP problem dimensions are
+    problem parameters. The size of the vector is equal to the PIP
+    problem internal space dimension (i.e., no artificial parameters).
+  */
+  void update_solution(const std::vector<bool>& pip_dim_is_param) const;
+
+  //! Helper method.
+  void update_solution() const;
+
+  //! Implements pure virtual method PIP_Tree_Node::solve.
+  virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+                               bool check_feasible_context,
+                               const Matrix<Row>& context,
+                               const Variables_Set& params,
+                               dimension_type space_dim,
+                               int indent_level);
+
+  /*! \brief
+    Generate a Gomory cut using non-integer tableau row \p index.
+
+    \param index
+    Row index in simplex tableau from which the cut is generated.
+
+    \param parameters
+    A std::set of the current parameter dimensions (including artificials);
+    to be updated if a new artificial parameter is to be created.
+
+    \param context
+    A set of linear inequalities on the parameters, in matrix form; to be
+    updated if a new artificial parameter is to be created.
+
+    \param space_dimension
+    The current space dimension, including variables and all parameters; to
+    be updated if an extra parameter is to be created.
+
+    \param indent_level
+    The indentation level (for debugging output only).
+  */
+  void generate_cut(dimension_type index, Variables_Set& parameters,
+                    Matrix<Row>& context, dimension_type& space_dimension,
+                    int indent_level);
+
+  //! Prints on \p s the tree rooted in \p *this.
+  virtual void print_tree(std::ostream& s, int indent,
+                          const std::vector<bool>& pip_dim_is_param,
+                          dimension_type first_art_dim) const;
+
+}; // class PIP_Solution_Node
+
+
+//! A tree node representing a decision in the space of solutions.
+class PIP_Decision_Node : public PIP_Tree_Node {
+public:
+  //! Returns a pointer to a dynamically-allocated copy of \p *this.
+  virtual PIP_Tree_Node* clone() const;
+
+  //! Destructor.
+  virtual ~PIP_Decision_Node();
+
+  //! Returns \c true if and only if \p *this is well formed.
+  virtual bool OK() const;
+
+  //! Returns \p this.
+  virtual const PIP_Decision_Node* as_decision() const;
+
+  //! Returns 0, since \p this is not a solution node.
+  virtual const PIP_Solution_Node* as_solution() const;
+
+  //! Returns a const pointer to the \p b (true or false) branch of \p *this.
+  const PIP_Tree_Node* child_node(bool b) const;
+
+  //! Returns a pointer to the \p b (true or false) branch of \p *this.
+  PIP_Tree_Node* child_node(bool b);
+
+  //! Dumps to \p s an ASCII representation of \p *this.
+  void ascii_dump(std::ostream& s) const;
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  virtual memory_size_type total_memory_in_bytes() const;
+  //! Returns the size in bytes of the memory managed by \p *this.
+  virtual memory_size_type external_memory_in_bytes() const;
+
+private:
+  // PIP_Solution_Node is allowed to use the constructor and methods.
+  friend class PIP_Solution_Node;
+
+  // PIP_Problem ascii load method needs access to private constructors.
+  friend bool PIP_Problem::ascii_load(std::istream& s);
+
+  //! Pointer to the "false" child of \p *this.
+  PIP_Tree_Node* false_child;
+
+  //! Pointer to the "true" child of \p *this.
+  PIP_Tree_Node* true_child;
+
+  /*! \brief
+    Builds a decision node having \p fcp and \p tcp as child.
+
+    The decision node will encode the structure
+    "if \c cs then \p tcp else \p fcp",
+    where the system of constraints \c cs is initially empty.
+
+    \param owner
+    Pointer to the owning PIP_Problem object; it may be null if and
+    only if both children are null.
+
+    \param fcp
+    Pointer to "false" child; it may be null.
+
+    \param tcp
+    Pointer to "true" child; it may be null.
+
+    \note
+    If any of \p fcp or \p tcp is not null, then \p owner is required
+    to be not null and equal to the owner of its non-null children;
+    otherwise the behavior is undefined.
+  */
+  explicit PIP_Decision_Node(const PIP_Problem* owner,
+                             PIP_Tree_Node* fcp,
+                             PIP_Tree_Node* tcp);
+
+  //! Sets the pointer to the PIP_Problem owning object.
+  virtual void set_owner(const PIP_Problem* owner);
+
+  /*! \brief
+    Returns \c true if and only if all the nodes in the subtree
+    rooted in \p *this is owned by \p *pip.
+  */
+  virtual bool check_ownership(const PIP_Problem* owner) const;
+
+protected:
+  //! Copy constructor.
+  PIP_Decision_Node(const PIP_Decision_Node& y);
+
+  //! Implements pure virtual method PIP_Tree_Node::update_tableau.
+  virtual void update_tableau(const PIP_Problem& pip,
+                              dimension_type external_space_dim,
+                              dimension_type first_pending_constraint,
+                              const Constraint_Sequence& input_cs,
+                              const Variables_Set& parameters);
+
+  //! Implements pure virtual method PIP_Tree_Node::solve.
+  virtual PIP_Tree_Node* solve(const PIP_Problem& pip,
+                               bool check_feasible_context,
+                               const Matrix<Row>& context,
+                               const Variables_Set& params,
+                               dimension_type space_dim,
+                               int indent_level);
+
+  //! Prints on \p s the tree rooted in \p *this.
+  virtual void print_tree(std::ostream& s, int indent,
+                          const std::vector<bool>& pip_dim_is_param,
+                          dimension_type first_art_dim) const;
+
+}; // class PIP_Decision_Node
+
+namespace IO_Operators {
+
+//! Output operator: prints the solution tree rooted in \p x.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node */
+std::ostream& operator<<(std::ostream& os, const PIP_Tree_Node& x);
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::PIP_Tree_Node::Artificial_Parameter */
+std::ostream& operator<<(std::ostream& os,
+                         const PIP_Tree_Node::Artificial_Parameter& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_inlines.hh line 1. */
+/* PIP_Tree related class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+PIP_Solution_Node::Tableau::Tableau()
+  : s(), t(), denom(1) {
+  PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::Tableau(const Tableau& y)
+  : s(y.s), t(y.t), denom(y.denom) {
+  PPL_ASSERT(OK());
+}
+
+inline
+PIP_Solution_Node::Tableau::~Tableau() {
+}
+
+inline bool
+PIP_Solution_Node::Tableau::is_integer() const {
+  return denom == 1;
+}
+
+inline Coefficient_traits::const_reference
+PIP_Solution_Node::Tableau::denominator() const {
+  return denom;
+}
+
+inline
+PIP_Tree_Node::~PIP_Tree_Node() {
+}
+
+inline void
+PIP_Tree_Node::set_parent(const PIP_Decision_Node* p) {
+  parent_ = p;
+}
+
+inline const PIP_Decision_Node*
+PIP_Tree_Node::parent() const {
+  return parent_;
+}
+
+inline const PIP_Problem*
+PIP_Tree_Node::get_owner() const {
+  return owner_;
+}
+
+inline const Constraint_System&
+PIP_Tree_Node::constraints() const {
+  return constraints_;
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_begin() const {
+  return artificial_parameters.begin();
+}
+
+inline PIP_Tree_Node::Artificial_Parameter_Sequence::const_iterator
+PIP_Tree_Node::art_parameter_end() const {
+  return artificial_parameters.end();
+}
+
+inline dimension_type
+PIP_Tree_Node::art_parameter_count() const {
+  return artificial_parameters.size();
+}
+
+inline
+const PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) const {
+  return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node*
+PIP_Decision_Node::child_node(bool b) {
+  return b ? true_child : false_child;
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter::Artificial_Parameter()
+  : Linear_Expression(), denom(1) {
+  PPL_ASSERT(OK());
+}
+
+inline
+PIP_Tree_Node::Artificial_Parameter
+::Artificial_Parameter(const Artificial_Parameter& y)
+  : Linear_Expression(y), denom(y.denom) {
+  PPL_ASSERT(OK());
+}
+
+inline Coefficient_traits::const_reference
+PIP_Tree_Node::Artificial_Parameter::denominator() const {
+  return denom;
+}
+
+inline void
+PIP_Tree_Node::Artificial_Parameter::m_swap(Artificial_Parameter& y) {
+  Linear_Expression::m_swap(y);
+  using std::swap;
+  swap(denom, y.denom);
+}
+
+/*! \relates PIP_Tree_Node::Artificial_Parameter */
+inline void
+swap(PIP_Tree_Node::Artificial_Parameter& x,
+     PIP_Tree_Node::Artificial_Parameter& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/PIP_Tree_defs.hh line 835. */
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_defs.hh line 1. */
+/* BHRZ03_Certificate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_defs.hh line 31. */
+#include <vector>
+
+//! The convergence certificate for the BHRZ03 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, BHRZ03_Certificate
+  can certify the convergence of both the BHRZ03 and the H79 widenings.
+*/
+class Parma_Polyhedra_Library::BHRZ03_Certificate {
+public:
+  //! Default constructor.
+  BHRZ03_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  BHRZ03_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  BHRZ03_Certificate(const BHRZ03_Certificate& y);
+
+  //! Destructor.
+  ~BHRZ03_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    BHRZ03 widening.
+  */
+  int compare(const BHRZ03_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for
+    polyhedron \p ph is strictly smaller than \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_stabilizing(const Polyhedron& ph) const;
+
+  //! A total ordering on BHRZ03 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on BHRZ03 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const BHRZ03_Certificate& x,
+                    const BHRZ03_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Dimension of the lineality space of the polyhedron.
+  dimension_type lin_space_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+  /*! \brief
+    Number of non-redundant points in a generator system
+    for the polyhedron.
+  */
+  dimension_type num_points;
+  /*! \brief
+    A vector containing, for each index `0 <= i < space_dim',
+    the number of non-redundant rays in a generator system of the
+    polyhedron having exactly `i' null coordinates.
+  */
+  std::vector<dimension_type> num_rays_null_coord;
+};
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_inlines.hh line 1. */
+/* BHRZ03_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate()
+  : affine_dim(0), lin_space_dim(0), num_constraints(0), num_points(1),
+    num_rays_null_coord() {
+  // This is the certificate for a zero-dim universe polyhedron.
+  PPL_ASSERT(OK());
+}
+
+inline
+BHRZ03_Certificate::BHRZ03_Certificate(const BHRZ03_Certificate& y)
+  : affine_dim(y.affine_dim), lin_space_dim(y.lin_space_dim),
+    num_constraints(y.num_constraints), num_points(y.num_points),
+    num_rays_null_coord(y.num_rays_null_coord) {
+}
+
+inline
+BHRZ03_Certificate::~BHRZ03_Certificate() {
+}
+
+inline bool
+BHRZ03_Certificate::is_stabilizing(const Polyhedron& ph) const {
+  return compare(ph) == 1;
+}
+
+inline bool
+BHRZ03_Certificate::Compare::operator()(const BHRZ03_Certificate& x,
+                                        const BHRZ03_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this LGO relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/BHRZ03_Certificate_defs.hh line 117. */
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_defs.hh line 1. */
+/* H79_Certificate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_defs.hh line 31. */
+#include <vector>
+
+//! A convergence certificate for the H79 widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+  \note
+  The convergence of the H79 widening can also be certified by
+  BHRZ03_Certificate.
+*/
+class Parma_Polyhedra_Library::H79_Certificate {
+public:
+  //! Default constructor.
+  H79_Certificate();
+
+  //! Constructor: computes the certificate for \p ph.
+  template <typename PH>
+  H79_Certificate(const PH& ph);
+
+  //! Constructor: computes the certificate for \p ph.
+  H79_Certificate(const Polyhedron& ph);
+
+  //! Copy constructor.
+  H79_Certificate(const H79_Certificate& y);
+
+  //! Destructor.
+  ~H79_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+
+    Compares \p *this with \p y, using a total ordering which is a
+    refinement of the limited growth ordering relation for the
+    H79 widening.
+  */
+  int compare(const H79_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  template <typename PH>
+  int compare(const PH& ph) const;
+
+  //! Compares \p *this with the certificate for polyhedron \p ph.
+  int compare(const Polyhedron& ph) const;
+
+  //! A total ordering on H79 certificates.
+  /*! \ingroup PPL_CXX_interface
+    This binary predicate defines a total ordering on H79 certificates
+    which is used when storing information about sets of polyhedra.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const H79_Certificate& x,
+                    const H79_Certificate& y) const;
+  };
+
+private:
+  //! Affine dimension of the polyhedron.
+  dimension_type affine_dim;
+  //! Cardinality of a non-redundant constraint system for the polyhedron.
+  dimension_type num_constraints;
+};
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_inlines.hh line 1. */
+/* H79_Certificate class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+H79_Certificate::H79_Certificate()
+  : affine_dim(0), num_constraints(0) {
+  // This is the certificate for a zero-dim universe polyhedron.
+}
+
+inline
+H79_Certificate::H79_Certificate(const H79_Certificate& y)
+  : affine_dim(y.affine_dim), num_constraints(y.num_constraints) {
+}
+
+inline
+H79_Certificate::~H79_Certificate() {
+}
+
+inline bool
+H79_Certificate::Compare::operator()(const H79_Certificate& x,
+                                     const H79_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this LGO relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+template <typename PH>
+inline
+H79_Certificate::H79_Certificate(const PH& ph)
+  : affine_dim(0), num_constraints(0) {
+  H79_Certificate cert(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+  affine_dim = cert.affine_dim;
+  num_constraints = cert.num_constraints;
+}
+
+template <typename PH>
+inline int
+H79_Certificate::compare(const PH& ph) const {
+  return this->compare(Polyhedron(NECESSARILY_CLOSED, ph.constraints()));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/H79_Certificate_defs.hh line 97. */
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 1. */
+/* Grid_Certificate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 32. */
+#include <vector>
+
+//! The convergence certificate for the Grid widening operator.
+/*! \ingroup PPL_CXX_interface
+  Convergence certificates are used to instantiate the BHZ03 framework
+  so as to define widening operators for the finite powerset domain.
+
+  \note
+  Each convergence certificate has to be used together with a
+  compatible widening operator. In particular, Grid_Certificate can
+  certify the Grid widening.
+*/
+class Parma_Polyhedra_Library::Grid_Certificate {
+public:
+  //! Default constructor.
+  Grid_Certificate();
+
+  //! Constructor: computes the certificate for \p gr.
+  Grid_Certificate(const Grid& gr);
+
+  //! Copy constructor.
+  Grid_Certificate(const Grid_Certificate& y);
+
+  //! Destructor.
+  ~Grid_Certificate();
+
+  //! The comparison function for certificates.
+  /*!
+    \return
+    \f$-1\f$, \f$0\f$ or \f$1\f$ depending on whether \p *this
+    is smaller than, equal to, or greater than \p y, respectively.
+  */
+  int compare(const Grid_Certificate& y) const;
+
+  //! Compares \p *this with the certificate for grid \p gr.
+  int compare(const Grid& gr) const;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the certificate for grid
+    \p gr is strictly smaller than \p *this.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool is_stabilizing(const Grid& gr) const;
+
+  //! A total ordering on Grid certificates.
+  /*!
+    This binary predicate defines a total ordering on Grid certificates
+    which is used when storing information about sets of grids.
+  */
+  struct Compare {
+    //! Returns <CODE>true</CODE> if and only if \p x comes before \p y.
+    bool operator()(const Grid_Certificate& x,
+                    const Grid_Certificate& y) const;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! Check if gathered information is meaningful.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  bool OK() const;
+
+private:
+  //! Number of a equalities in a minimized congruence system for the
+  //! grid.
+  dimension_type num_equalities;
+  //! Number of a proper congruences in a minimized congruence system
+  //! for the grid.
+  dimension_type num_proper_congruences;
+};
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_inlines.hh line 1. */
+/* Grid_Certificate class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Certificate::Grid_Certificate()
+  : num_equalities(0), num_proper_congruences(0) {
+  // This is the certificate for a zero-dim universe grid.
+  PPL_ASSERT(OK());
+}
+
+inline
+Grid_Certificate::Grid_Certificate(const Grid_Certificate& y)
+  : num_equalities(y.num_equalities),
+    num_proper_congruences(y.num_proper_congruences) {
+}
+
+inline
+Grid_Certificate::~Grid_Certificate() {
+}
+
+inline bool
+Grid_Certificate::is_stabilizing(const Grid& gr) const {
+  return compare(gr) == 1;
+}
+
+inline bool
+Grid_Certificate::Compare::operator()(const Grid_Certificate& x,
+                                      const Grid_Certificate& y) const {
+  // For an efficient evaluation of the multiset ordering based
+  // on this LGO relation, we want larger elements to come first.
+  return x.compare(y) == 1;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Grid_Certificate_defs.hh line 103. */
+
+/* Automatically generated from PPL source file ../src/Partial_Function_defs.hh line 1. */
+/* Partial_Function class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partial_Function_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partial_Function_defs.hh line 29. */
+#include <vector>
+#ifndef NDEBUG
+#include <set>
+#endif
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+class Partial_Function {
+public:
+  /*! \brief
+    Default constructor: builds a function with empty codomain
+    (i.e., always undefined).
+  */
+  Partial_Function();
+
+  /*! \brief
+    Returns \c true if and only if the represented partial function
+    has an empty codomain (i.e., it is always undefined).
+  */
+  bool has_empty_codomain() const;
+
+  /*! \brief
+    If the codomain is \e not empty, returns the maximum value in it.
+
+    \exception std::runtime_error
+    Thrown if called when \p *this has an empty codomain.
+  */
+  dimension_type max_in_codomain() const;
+
+  /*! \brief
+    If \p *this maps \p i to a value \c k, assigns \c k to \p j and
+    returns \c true; otherwise, \p j is unchanged and \c false is returned.
+  */
+  bool maps(dimension_type i, dimension_type& j) const;
+
+  void print(std::ostream& s) const;
+
+  /*! \brief
+    Modifies \p *this so that \p i is mapped to \p j.
+
+    \exception std::runtime_error
+    Thrown if \p *this is already mapping \p j.
+  */
+  void insert(dimension_type i, dimension_type j);
+
+private:
+  std::vector<dimension_type> vec;
+  dimension_type max;
+#ifndef NDEBUG
+  std::set<dimension_type> codomain;
+#endif
+}; // class Partial_Function
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partial_Function_inlines.hh line 1. */
+/* Partial_Function class implementation: inline functions.
+*/
+
+
+#include <stdexcept>
+/* Automatically generated from PPL source file ../src/Partial_Function_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Partial_Function::Partial_Function()
+  : max(0) {
+}
+
+inline bool
+Partial_Function::has_empty_codomain() const {
+  PPL_ASSERT(vec.empty() == codomain.empty());
+  return vec.empty();
+}
+
+inline dimension_type
+Partial_Function::max_in_codomain() const {
+  if (has_empty_codomain())
+    throw std::runtime_error("Partial_Function::max_in_codomain() called"
+                             " when has_empty_codomain()");
+  PPL_ASSERT(codomain.begin() != codomain.end()
+             && max == *codomain.rbegin());
+  return max;
+}
+
+inline void
+Partial_Function::insert(dimension_type i, dimension_type j) {
+#ifndef NDEBUG
+  // The partial function has to be an injective map.
+  std::pair<std::set<dimension_type>::iterator, bool> s = codomain.insert(j);
+  PPL_ASSERT(s.second);
+#endif // #ifndef NDEBUG
+
+  // Expand `vec' if needed.
+  const dimension_type sz = vec.size();
+  if (i >= sz)
+    vec.insert(vec.end(), i - sz + 1, not_a_dimension());
+
+  // We cannot remap the same index to another one.
+  PPL_ASSERT(i < vec.size() && vec[i] == not_a_dimension());
+  vec[i] = j;
+
+  // Maybe update `max'.
+  if (j > max)
+    max = j;
+  PPL_ASSERT(codomain.begin() != codomain.end()
+             && max == *codomain.rbegin());
+}
+
+inline bool
+Partial_Function::maps(dimension_type i, dimension_type& j) const {
+  if (i >= vec.size())
+    return false;
+  const dimension_type vec_i = vec[i];
+  if (vec_i == not_a_dimension())
+    return false;
+  j = vec_i;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partial_Function_defs.hh line 86. */
+
+/* Automatically generated from PPL source file ../src/Widening_Function_defs.hh line 1. */
+/* Widening_Function class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Widening_Function_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Widening_Function;
+
+template <typename PSET, typename CSYS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Widening_Function_defs.hh line 29. */
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+  //! The (parametric) type of a widening method.
+  typedef void (PSET::* Widening_Method)(const PSET&, unsigned*);
+
+  //! Explicit unary constructor.
+  explicit
+  Widening_Function(Widening_Method wm);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*wm)(y, tp)</CODE>, where \p wm is the widening
+    method stored at construction time.
+  */
+  void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+  //! The widening method.
+  Widening_Method w_method;
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a limited widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET, typename CSYS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+  //! The (parametric) type of a limited widening method.
+  typedef void (PSET::* Limited_Widening_Method)(const PSET&,
+                                                 const CSYS&,
+                                                 unsigned*);
+
+  //! Constructor.
+  /*!
+    \param lwm
+    The limited widening method.
+
+    \param cs
+    The constraint system limiting the widening.
+  */
+  Limited_Widening_Function(Limited_Widening_Method lwm,
+                            const CSYS& cs);
+
+  //! Function-application operator.
+  /*!
+    Computes <CODE>(x.*lwm)(y, cs, tp)</CODE>, where \p lwm and \p cs
+    are the limited widening method and the constraint system stored
+    at construction time.
+  */
+  void operator()(PSET& x, const PSET& y, unsigned* tp = 0) const;
+
+private:
+  //! The limited widening method.
+  Limited_Widening_Method lw_method;
+  //! A constant reference to the constraint system limiting the widening.
+  const CSYS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+  \relates Pointset_Powerset
+
+  \param wm
+  The widening method.
+*/
+template <typename PSET>
+Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+  \relates Pointset_Powerset
+
+  \param lwm
+  The limited widening method.
+
+  \param cs
+  The constraint system limiting the widening.
+*/
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+              const CSYS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Widening_Function_inlines.hh line 1. */
+/* Widening_Function class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Widening_Function_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+Widening_Function<PSET>::Widening_Function(Widening_Method wm)
+  : w_method(wm) {
+}
+
+template <typename PSET>
+inline void
+Widening_Function<PSET>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+  (x.*w_method)(y, tp);
+}
+
+template <typename PSET, typename CSYS>
+Limited_Widening_Function<PSET, CSYS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+                          const CSYS& cs)
+  : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PSET, typename CSYS>
+inline void
+Limited_Widening_Function<PSET, CSYS>::
+operator()(PSET& x, const PSET& y, unsigned* tp) const {
+  (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline Widening_Function<PSET>
+widen_fun_ref(void (PSET::* wm)(const PSET&, unsigned*)) {
+  return Widening_Function<PSET>(wm);
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET, typename CSYS>
+inline Limited_Widening_Function<PSET, CSYS>
+widen_fun_ref(void (PSET::* lwm)(const PSET&, const CSYS&, unsigned*),
+              const CSYS& cs) {
+  return Limited_Widening_Function<PSET, CSYS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+/* Automatically generated from PPL source file ../src/Widening_Function_defs.hh line 126. */
+
+/* Automatically generated from PPL source file ../src/max_space_dimension.hh line 1. */
+/* Definition of functions yielding maximal space dimensions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_defs.hh line 1. */
+/* NNC_Polyhedron class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_defs.hh line 31. */
+
+//! A not necessarily closed convex polyhedron.
+/*! \ingroup PPL_CXX_interface
+    An object of the class NNC_Polyhedron represents a
+    <EM>not necessarily closed</EM> (NNC) convex polyhedron
+    in the vector space \f$\Rset^n\f$.
+
+    \note
+    Since NNC polyhedra are a generalization of closed polyhedra,
+    any object of the class C_Polyhedron can be (explicitly) converted
+    into an object of the class NNC_Polyhedron.
+    The reason for defining two different classes is that objects of
+    the class C_Polyhedron are characterized by a more efficient
+    implementation, requiring less time and memory resources.
+*/
+class Parma_Polyhedra_Library::NNC_Polyhedron : public Polyhedron {
+public:
+  //! Builds either the universe or the empty NNC polyhedron.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the NNC polyhedron;
+
+    \param kind
+    Specifies whether a universe or an empty NNC polyhedron should be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space dimension.
+
+    Both parameters are optional:
+    by default, a 0-dimension space universe NNC polyhedron is built.
+  */
+  explicit NNC_Polyhedron(dimension_type num_dimensions = 0,
+                          Degenerate_Element kind = UNIVERSE);
+
+  //! Builds an NNC polyhedron from a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Constraint_System& cs);
+
+  //! Builds an NNC polyhedron recycling a system of constraints.
+  /*!
+    The polyhedron inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  NNC_Polyhedron(Constraint_System& cs, Recycle_Input dummy);
+
+  //! Builds an NNC polyhedron from a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  explicit NNC_Polyhedron(const Generator_System& gs);
+
+  //! Builds an NNC polyhedron recycling a system of generators.
+  /*!
+    The polyhedron inherits the space dimension of the generator system.
+
+    \param gs
+    The system of generators defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+
+    \exception std::invalid_argument
+    Thrown if the system of generators is not empty but has no points.
+  */
+  NNC_Polyhedron(Generator_System& gs, Recycle_Input dummy);
+
+  //! Builds an NNC polyhedron from a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+  */
+  explicit NNC_Polyhedron(const Congruence_System& cgs);
+
+  //! Builds an NNC polyhedron recycling a system of congruences.
+  /*!
+    The polyhedron inherits the space dimension of the congruence
+    system.
+
+    \param cgs
+    The system of congruences defining the polyhedron.  It is not
+    declared <CODE>const</CODE> because its data-structures may be
+    recycled to build the polyhedron.
+
+    \param dummy
+    A dummy tag to syntactically differentiate this one
+    from the other constructors.
+  */
+  NNC_Polyhedron(Congruence_System& cgs, Recycle_Input dummy);
+
+  //! Builds an NNC polyhedron from the C polyhedron \p y.
+  /*!
+    \param y
+    The C polyhedron to be used;
+
+    \param complexity
+    This argument is ignored.
+  */
+  explicit NNC_Polyhedron(const C_Polyhedron& y,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an NNC polyhedron out of a box.
+  /*!
+    The polyhedron inherits the space dimension of the box
+    and is the most precise that includes the box.
+
+    \param box
+    The box representing the polyhedron to be built;
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum allowed
+    space dimension.
+  */
+  template <typename Interval>
+  explicit NNC_Polyhedron(const Box<Interval>& box,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds an NNC polyhedron out of a grid.
+  /*!
+    The polyhedron inherits the space dimension of the grid
+    and is the most precise that includes the grid.
+
+    \param grid
+    The grid used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  explicit NNC_Polyhedron(const Grid& grid,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a NNC polyhedron out of a BD shape.
+  /*!
+    The polyhedron inherits the space dimension of the BD shape
+    and is the most precise that includes the BD shape.
+
+    \param bd
+    The BD shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const BD_Shape<U>& bd,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a NNC polyhedron out of an octagonal shape.
+  /*!
+    The polyhedron inherits the space dimension of the octagonal shape
+    and is the most precise that includes the octagonal shape.
+
+    \param os
+    The octagonal shape used to build the polyhedron.
+
+    \param complexity
+    This argument is ignored as the algorithm used has
+    polynomial complexity.
+  */
+  template <typename U>
+  explicit NNC_Polyhedron(const Octagonal_Shape<U>& os,
+                          Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  NNC_Polyhedron(const NNC_Polyhedron& y,
+                 Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.
+    (\p *this and \p y can be dimension-incompatible.)
+  */
+  NNC_Polyhedron& operator=(const NNC_Polyhedron& y);
+
+  //! Assigns to \p *this the C polyhedron \p y.
+  NNC_Polyhedron& operator=(const C_Polyhedron& y);
+
+  //! Destructor.
+  ~NNC_Polyhedron();
+
+  /*! \brief
+    If the poly-hull of \p *this and \p y is exact it is assigned
+    to \p *this and <CODE>true</CODE> is returned,
+    otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool poly_hull_assign_if_exact(const NNC_Polyhedron& y);
+
+  //! Same as poly_hull_assign_if_exact(y).
+  bool upper_bound_assign_if_exact(const NNC_Polyhedron& y);
+
+  /*! \brief
+    Assigns to \p *this (the best approximation of) the result of
+    computing the
+    \ref Positive_Time_Elapse_Operator "positive time-elapse"
+    between \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void positive_time_elapse_assign(const Polyhedron& y);
+};
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_inlines.hh line 1. */
+/* NNC_Polyhedron class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+                               Degenerate_Element kind)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(num_dimensions,
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(n, k)",
+                                              "n exceeds the maximum "
+                                              "allowed space dimension"),
+               kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(cs)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(cs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(cs, recycle)",
+                                                  "the space dimension of cs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(gs)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs, Recycle_Input)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(gs, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(gs, recycle)",
+                                                  "the space dimension of gs "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension"),
+               Recycle_Input()) {
+}
+
+template <typename Interval>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>& box, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_obj_space_dimension_overflow(box, NOT_NECESSARILY_CLOSED,
+                                                  "NNC_Polyhedron(box)",
+                                                  "the space dimension of box "
+                                                  "exceeds the maximum allowed "
+                                                  "space dimension")) {
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const BD_Shape<U>& bd, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(bd.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(bd)",
+                                              "the space dimension of bd "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(bd.constraints());
+}
+
+template <typename U>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Octagonal_Shape<U>& os, Complexity_Class)
+  : Polyhedron(NOT_NECESSARILY_CLOSED,
+               check_space_dimension_overflow(os.space_dimension(),
+                                              NOT_NECESSARILY_CLOSED,
+                                              "NNC_Polyhedron(os)",
+                                              "the space dimension of os "
+                                              "exceeds the maximum allowed "
+                                              "space dimension"),
+               UNIVERSE) {
+  add_constraints(os.constraints());
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y, Complexity_Class)
+  : Polyhedron(y) {
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const NNC_Polyhedron& y) {
+  Polyhedron::operator=(y);
+  return *this;
+}
+
+inline NNC_Polyhedron&
+NNC_Polyhedron::operator=(const C_Polyhedron& y) {
+  NNC_Polyhedron nnc_y(y);
+  m_swap(nnc_y);
+  return *this;
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+  return poly_hull_assign_if_exact(y);
+}
+
+inline void
+NNC_Polyhedron::positive_time_elapse_assign(const Polyhedron& y) {
+  Polyhedron::positive_time_elapse_assign_impl(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/NNC_Polyhedron_defs.hh line 266. */
+
+/* Automatically generated from PPL source file ../src/Rational_Box.hh line 1. */
+/* Rational_Box class declaration and implementation.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Rational_Box.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A box with rational, possibly open boundaries.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+typedef Box<Rational_Interval> Rational_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/max_space_dimension.hh line 34. */
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+  // Note: we assume that the powerset and the ask-and-tell construction
+  // do not limit the space dimension more than their parameters.
+  static bool computed = false;
+  static dimension_type d = not_a_dimension();
+  if (!computed) {
+    d = Variable::max_space_dimension();
+    d = std::min(d, C_Polyhedron::max_space_dimension());
+    d = std::min(d, NNC_Polyhedron::max_space_dimension());
+    d = std::min(d, Grid::max_space_dimension());
+    // FIXME: what about all other boxes?
+    d = std::min(d, Rational_Box::max_space_dimension());
+    d = std::min(d, BD_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, BD_Shape<float>::max_space_dimension());
+    d = std::min(d, BD_Shape<double>::max_space_dimension());
+    d = std::min(d, BD_Shape<long double>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, BD_Shape<mpq_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int8_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int16_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int32_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<int64_t>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<float>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<long double>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpz_class>::max_space_dimension());
+    d = std::min(d, Octagonal_Shape<mpq_class>::max_space_dimension());
+    computed = true;
+  }
+  return d;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/algorithms.hh line 1. */
+/* A collection of useful convex polyhedra algorithms: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_defs.hh line 1. */
+/* Pointset_Powerset class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Pointset_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_defs.hh line 1. */
+/* Partially_Reduced_Product class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_defs.hh line 49. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operator.
+/*!
+  \relates Parma_Polyhedra_Library::Partially_Reduced_Product
+  Writes a textual representation of \p dp on \p s.
+*/
+template <typename D1, typename D2, typename R>
+std::ostream&
+operator<<(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+} // namespace IO_Operators
+
+//! Swaps \p x with \p y.
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+void swap(Partially_Reduced_Product<D1, D2, R>& x,
+          Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are pairwise equal.
+
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>false</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+                const Partially_Reduced_Product<D1, D2, R>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the components of \p x and \p y
+  are not pairwise equal.
+
+  \relates Partially_Reduced_Product
+  Note that \p x and \p y may be dimension-incompatible: in
+  those cases, the value <CODE>true</CODE> is returned.
+*/
+template <typename D1, typename D2, typename R>
+bool operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+                const Partially_Reduced_Product<D1, D2, R>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+/*! \brief
+  This class provides the reduction method for the Smash_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class propagates emptiness between its components.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Smash_Reduction {
+public:
+  //! Default constructor.
+  Smash_Reduction();
+
+  /*! \brief
+    The smash reduction operator for propagating emptiness between the
+    domain elements \p d1 and \p d2.
+
+    If either of the the domain elements \p d1 or \p d2 is empty
+    then the other is also set empty.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Smash_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Constraints_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain. This class adds the constraints defining each of the component
+  domains to the other component.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Constraints_Reduction {
+public:
+  //! Default constructor.
+  Constraints_Reduction();
+
+  /*! \brief
+    The constraints reduction operator for sharing constraints between the
+    domains.
+
+    The minimized constraint system defining the domain element \p d1
+    is added to \p d2 and the minimized constraint system  defining \p d2
+    is added to \p d1.
+    In each case, the donor domain must provide a constraint system
+    in minimal form; this must define a polyhedron in which the
+    donor element is contained.
+    The recipient domain selects a subset of these constraints
+    that it can add to the recipient element.
+    For example: if the domain \p D1 is the Grid domain and \p D2
+    the NNC Polyhedron domain, then only the equality constraints are copied
+    from \p d1 to \p d2 and from \p d2 to \p d1.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Constraints_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Congruences_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain.
+
+  This class uses the minimized congruences defining each of the components.
+  For each of the congruences, it checks if the other component
+  intersects none, one or more than one hyperplane defined by the congruence
+  and adds equalities or emptiness as appropriate; in more detail:
+  Letting the components be d1 and d2, then, for each congruence cg
+  representing d1:
+  - if more than one hyperplane defined by cg intersects
+    d2, then d1 and d2 are unchanged;
+  - if exactly one hyperplane intersects d2, then d1 and d2 are
+    refined with the corresponding equality ;
+  - otherwise, d1 and d2 are set to empty.
+  Unless d1 and d2 are already empty, the process is repeated where the
+  roles of d1 and d2 are reversed.
+  If d1 or d2 is empty, then the emptiness is propagated.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Congruences_Reduction {
+public:
+  //! Default constructor.
+  Congruences_Reduction();
+
+  /*! \brief
+    The congruences reduction operator for detect emptiness or any equalities
+    implied by each of the congruences defining one of the components
+    and the bounds of the other component. It is assumed that the
+    components are already constraints reduced.
+
+    The minimized congruence system defining the domain element \p d1
+    is used to check if \p d2 intersects none, one or more than one
+    of the hyperplanes defined by the congruences: if it intersects none,
+    then product is set empty; if it intersects one, then the equality
+    defining this hyperplane is added to both components; otherwise,
+    the product is unchanged.
+    In each case, the donor domain must provide a congruence system
+    in minimal form.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Congruences_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Shape_Preserving_Product
+  domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain.
+
+  This reduction method includes the congruences reduction.
+  This class uses the minimized constraints defining each of the components.
+  For each of the constraints, it checks the frequency and value for the same
+  linear expression in the other component. If the constraint does not satisfy
+  the implied congruence, the inhomogeneous term is adjusted so that it does.
+  Note that, unless the congruences reduction adds equalities, the
+  shapes of the domains are unaltered.
+
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::Shape_Preserving_Reduction {
+public:
+  //! Default constructor.
+  Shape_Preserving_Reduction();
+
+  /*! \brief
+    The congruences reduction operator for detect emptiness or any equalities
+    implied by each of the congruences defining one of the components
+    and the bounds of the other component. It is assumed that the
+    components are already constraints reduced.
+
+    The minimized congruence system defining the domain element \p d1
+    is used to check if \p d2 intersects none, one or more than one
+    of the hyperplanes defined by the congruences: if it intersects none,
+    then product is set empty; if it intersects one, then the equality
+    defining this hyperplane is added to both components; otherwise,
+    the product is unchanged.
+    In each case, the donor domain must provide a congruence system
+    in minimal form.
+
+    \param d1
+    A pointset domain element;
+
+    \param d2
+    A pointset domain element;
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~Shape_Preserving_Reduction();
+};
+
+/*! \brief
+  This class provides the reduction method for the Direct_Product domain.
+
+  \ingroup PPL_CXX_interface
+  The reduction classes are used to instantiate the Partially_Reduced_Product
+  domain template parameter \p R. This class does no reduction at all.
+*/
+template <typename D1, typename D2>
+class Parma_Polyhedra_Library::No_Reduction {
+public:
+  //! Default constructor.
+  No_Reduction();
+
+  /*! \brief
+    The null reduction operator.
+
+    The parameters \p d1 and \p d2 are ignored.
+  */
+  void product_reduce(D1& d1, D2& d2);
+
+  //! Destructor.
+  ~No_Reduction();
+};
+
+//! The partially reduced product of two abstractions.
+/*! \ingroup PPL_CXX_interface
+
+  \warning
+  At present, the supported instantiations for the
+  two domain templates \p D1 and \p D2 are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape\<T\></CODE>,
+  <CODE>BD_Shape\<T\></CODE>,
+  <CODE>Box\<T\></CODE>.
+
+  An object of the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE>
+  represents the (partially reduced) product of two pointset domains \p D1
+  and \p D2 where the form of any reduction is defined by the
+  reduction class \p R.
+
+  Suppose \f$D_1\f$ and \f$D_2\f$ are two abstract domains
+  with concretization functions:
+  \f$\fund{\gamma_1}{D_1}{\Rset^n}\f$ and
+  \f$\fund{\gamma_2}{D_2}{\Rset^n}\f$, respectively.
+
+  The partially reduced product \f$D = D_1 \times D_2\f$,
+  for any reduction class \p R, has a concretization
+  \f$\fund{\gamma}{D}{\Rset^n}\f$
+  where, if \f$d = (d_1, d_2) \in D\f$
+  \f[
+    \gamma(d) = \gamma_1(d_1) \inters \gamma_2(d_2).
+  \f]
+
+  The operations are defined to be the result of applying the corresponding
+  operations on each of the components provided the product is already reduced
+  by the reduction method defined by \p R.
+  In particular, if \p R is the <CODE>No_Reduction\<D1, D2\></CODE> class,
+  then the class <CODE>Partially_Reduced_Product\<D1, D2, R\></CODE> domain
+  is the direct product as defined in \ref CC79 "[CC79]".
+
+  How the results on the components are interpreted and
+  combined depend on the specific test.
+  For example, the test for emptiness will first make sure
+  the product is reduced (using the reduction method provided by \p R
+  if it is not already known to be reduced) and then test if either component
+  is empty; thus, if \p R defines no reduction between its components and
+  \f$d = (G, P) \in (\Gset \times \Pset)\f$
+  is a direct product in one dimension where \f$G\f$ denotes the set of
+  numbers that are integral multiples of 3 while \f$P\f$ denotes the
+  set of numbers between 1 and 2, then an operation that tests for
+  emptiness should return false.
+  However, the test for the universe returns true if and only if the
+  test <CODE>is_universe()</CODE> on both components returns true.
+
+  \par
+  In all the examples it is assumed that the template \c R is the
+  <CODE>No_Reduction\<D1, D2\></CODE> class and that variables
+  \c x and \c y are defined (where they are used) as follows:
+  \code
+  Variable x(0);
+  Variable y(1);
+  \endcode
+
+  \par Example 1
+  The following code builds a direct product of a Grid and NNC Polyhedron,
+  corresponding to the positive even integer
+  pairs in \f$\Rset^2\f$, given as a system of congruences:
+  \code
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 2);
+  cgs.insert((y %= 0) / 2);
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> >
+    dp(cgs);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  \endcode
+
+  \par Example 2
+  The following code builds the same product
+  in \f$\Rset^2\f$:
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(2);
+  dp.add_constraint(x >= 0);
+  dp.add_constraint(y >= 0);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((y %= 0) / 2);
+  \endcode
+
+  \par Example 3
+  The following code will write "dp is empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_congruence((x %= 1) / 2);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
+  else
+    cout << "dp is not empty." << endl;
+  \endcode
+
+  \par Example 4
+  The following code will write "dp is not empty":
+  \code
+  Partially_Reduced_Product<Grid, NNC_Polyhedron, No_Reduction<D1, D2> > dp(1);
+  dp.add_congruence((x %= 0) / 2);
+  dp.add_constraint(x >= 1);
+  dp.add_constraint(x <= 1);
+  if (dp.is_empty())
+    cout << "dp is empty." << endl;
+  else
+    cout << "dp is not empty." << endl;
+  \endcode
+*/
+
+template <typename D1, typename D2, typename R>
+class Parma_Polyhedra_Library::Partially_Reduced_Product {
+public:
+  /*! \brief
+    Returns the maximum space dimension this product
+    can handle.
+  */
+  static dimension_type max_space_dimension();
+
+  //! Builds an object having the specified properties.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the pair;
+
+    \param kind
+    Specifies whether a universe or an empty pair has to be built.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(dimension_type num_dimensions = 0,
+                                     Degenerate_Element kind = UNIVERSE);
+
+  //! Builds a pair, copying a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Congruence_System& cgs);
+
+  //! Builds a pair, recycling a system of congruences.
+  /*!
+    The pair inherits the space dimension of the congruence system.
+
+    \param cgs
+    The system of congruences to be approximates by the pair.
+    Its data-structures may be recycled to build the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(Congruence_System& cgs);
+
+  //! Builds a pair, copying a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if \p num_dimensions exceeds the maximum allowed space
+    dimension.
+  */
+  explicit Partially_Reduced_Product(const Constraint_System& cs);
+
+  //! Builds a pair, recycling a system of constraints.
+  /*!
+    The pair inherits the space dimension of the constraint system.
+
+    \param cs
+    The system of constraints to be approximated by the pair.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p cs exceeds the maximum allowed
+    space dimension.
+  */
+  explicit Partially_Reduced_Product(Constraint_System& cs);
+
+  //! Builds a product, from a C polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
+
+    \param ph
+    The polyhedron to be approximated by the product.
+
+    \param complexity
+    The complexity that will not be exceeded.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product, from an NNC polyhedron.
+  /*!
+    Builds a product containing \p ph using algorithms whose
+    complexity does not exceed the one specified by \p complexity.
+    If \p complexity is \p ANY_COMPLEXITY, then the built product is the
+    smallest one containing \p ph.
+    The product inherits the space dimension of the polyhedron.
+
+    \param ph
+    The polyhedron to be approximated by the product.
+
+    \param complexity
+    The complexity that will not be exceeded.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product, from a grid.
+  /*!
+    Builds a product containing \p gr.
+    The product inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be approximated by the product.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum allowed
+    space dimension.
+  */
+  explicit
+  Partially_Reduced_Product(const Grid& gr,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of a box.
+  /*!
+    Builds a product containing \p box.
+    The product inherits the space dimension of the box.
+
+    \param box
+    The box representing the pair to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  Partially_Reduced_Product(const Box<Interval>& box,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of a BD shape.
+  /*!
+    Builds a product containing \p bd.
+    The product inherits the space dimension of the BD shape.
+
+    \param bd
+    The BD shape representing the product to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bd exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const BD_Shape<U>& bd,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a product out of an octagonal shape.
+  /*!
+    Builds a product containing \p os.
+    The product inherits the space dimension of the octagonal shape.
+
+    \param os
+    The octagonal shape representing the product to be built.
+
+    \param complexity
+    The complexity is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename U>
+  Partially_Reduced_Product(const Octagonal_Shape<U>& os,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Ordinary copy constructor.
+  Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a conservative, upward approximation of \p y.
+  /*!
+    The complexity argument is ignored.
+  */
+  template <typename E1, typename E2, typename S>
+  explicit
+  Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    The assignment operator.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  Partially_Reduced_Product& operator=(const Partially_Reduced_Product& y);
+
+  //! \name Member Functions that Do Not Modify the Partially_Reduced_Product
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  /*! \brief
+    Returns the minimum \ref Affine_Independence_and_Affine_Dimension
+    "affine dimension"
+    (see also \ref Grid_Affine_Dimension "grid affine dimension")
+    of the components of \p *this.
+  */
+  dimension_type affine_dimension() const;
+
+  //! Returns a constant reference to the first of the pair.
+  const D1& domain1() const;
+
+  //! Returns a constant reference to the second of the pair.
+  const D2& domain2() const;
+
+  //! Returns a system of constraints which approximates \p *this.
+  Constraint_System constraints() const;
+
+  /*! \brief
+    Returns a system of constraints which approximates \p *this, in
+    reduced form.
+  */
+  Constraint_System minimized_constraints() const;
+
+  //! Returns a system of congruences which approximates \p *this.
+  Congruence_System congruences() const;
+
+  /*! \brief
+    Returns a system of congruences which approximates \p *this, in
+    reduced form.
+  */
+  Congruence_System minimized_congruences() const;
+
+  //! Returns the relations holding between \p *this and \p c.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+
+    Returns the Poly_Con_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r implies <CODE>is_included()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_included()</CODE>;
+    \p r implies <CODE>saturates()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>saturates()</CODE>;
+    \p r implies <CODE>is_disjoint()</CODE>
+    if and only if one or both of \p r1 and \p r2 imply
+    <CODE>is_disjoint()</CODE>;
+    and \p r implies <CODE>nothing()</CODE>
+    if and only if both \p r1 and \p r2 imply
+    <CODE>strictly_intersects()</CODE>.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  //! Returns the relations holding between \p *this and \p cg.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  //! Returns the relations holding between \p *this and \p g.
+  /*
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+
+    Returns the Poly_Gen_Relation \p r for \p *this:
+    suppose the first component returns \p r1 and the second \p r2,
+    then \p r = <CODE>subsumes()</CODE>
+    if and only if \p r1 = \p r2 = <CODE>subsumes()</CODE>;
+    and \p r = <CODE>nothing()</CODE>
+    if and only if one or both of \p r1 and \p r2 = <CODE>nothing()</CODE>;
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if either of the components
+    of \p *this are empty.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are the universe.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if both of the components
+    of \p *this are topologically closed subsets of the vector space.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y are
+    componentwise disjoint.
+
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are dimension-incompatible.
+  */
+  bool is_disjoint_from(const Partially_Reduced_Product& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is discrete.
+  */
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if a component of \p *this
+    is bounded.
+  */
+  bool is_bounded() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  bool constrains(Variable var) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_below.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p expr is bounded in \p *this.
+  /*!
+    This method is the same as bounds_from_above.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d and \p
+    maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from above in \p *this, in which case the
+    supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if the supremum value can be reached in \p this.
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded by \p *this,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below i \p *this, in which case the
+    infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty and
+    \p expr is bounded from below in \p *this, in which case the
+    infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if the infimum value can be reached in \p this.
+
+    \param g
+    When minimization succeeds, will be assigned the point or closure
+    point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p point are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    contains the corresponding component of \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool contains(const Partially_Reduced_Product& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each component of \p *this
+    strictly contains the corresponding component of \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool strictly_contains(const Partially_Reduced_Product& y) const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Partially_Reduced_Product
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Partially_Reduced_Product
+  //@{
+
+  //! Adds constraint \p c to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Adds a copy of congruence \p cg to \p *this.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are
+    dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Adds a copy of the congruences in \p cgs to \p *this.
+  /*!
+    \param cgs
+    The congruence system to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  //! Adds the congruences in \p cgs to *this.
+  /*!
+    \param cgs
+    The congruence system to be added that may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cgs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_congruences(Congruence_System& cgs);
+
+  //! Adds a copy of the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  //! Adds the constraint system in \p cs to \p *this.
+  /*!
+    \param cs
+    The constraint system to be added that may be recycled.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are dimension-incompatible.
+
+    \warning
+    The only assumption that can be made about \p cs upon successful
+    or exceptional return is that it can be safely destroyed.
+  */
+  void add_recycled_constraints(Constraint_System& cs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Assigns to \p *this the componentwise intersection of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void intersection_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void upper_bound_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an upper bound of \p *this and \p y
+    computed on the corresponding components.
+    If it is exact on each of the components of \p *this, <CODE>true</CODE>
+    is returned, otherwise <CODE>false</CODE> is returned.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this an approximation of the set-theoretic difference
+    of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Partially_Reduced_Product& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Single_Update_Affine_Functions
+    "affine image" of \p
+    *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                    = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the \ref  Single_Update_Affine_Functions
+    "affine preimage" of
+    \p *this under the function mapping variable \p var to the affine
+    expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is substituted;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this.
+  */
+  void affine_preimage(Variable var,
+                       const Linear_Expression& expr,
+                       Coefficient_traits::const_reference denominator
+                         = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym
+    (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+   (see also \ref Grid_Generalized_Image "generalized affine relation".)
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the \ref Time_Elapse_Operator
+    "time-elapse" between \p *this and \p y.
+    (See also \ref Grid_Time_Elapse "time-elapse".)
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void time_elapse_assign(const Partially_Reduced_Product& y);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  // TODO: Add a way to call other widenings.
+
+  // CHECKME: This may not be a real widening; it depends on the reduction
+  //          class R and the widening used.
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    "widening" between \p *this and \p y.
+
+    This widening uses either the congruence or generator systems
+    depending on which of the systems describing x and y
+    are up to date and minimized.
+
+    \param y
+    A product that <EM>must</EM> be contained in \p *this;
+
+    \param tp
+    An optional pointer to an unsigned variable storing the number of
+    available tokens (to be used when applying the
+    \ref Widening_with_Tokens "widening with tokens" delay technique).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void widening_assign(const Partially_Reduced_Product& y,
+                       unsigned* tp = NULL);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    Adds \p m new space dimensions and embeds the components
+    of \p *this in the new vector space.
+
+    \param m
+    The number of dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+ */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new space dimensions and does not embed the components
+    in the new vector space.
+
+    \param m
+    The number of space dimensions to add.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the
+    vector space to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  /*! \brief
+    Assigns to the first (resp., second) component of \p *this
+    the "concatenation" of the first (resp., second) components
+    of \p *this and \p y, taken in this order.
+    See also \ref Concatenating_Polyhedra.
+
+    \exception std::length_error
+    Thrown if the concatenation would cause the vector space
+    to exceed dimension <CODE>max_space_dimension()</CODE>.
+  */
+  void concatenate_assign(const Partially_Reduced_Product& y);
+
+  //! Removes all the specified dimensions from the vector space.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher dimensions of the vector space so that the
+    resulting space will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension of
+    \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a \ref Mapping_the_Dimensions_of_the_Vector_Space "partial function".
+
+    If \p pfunc maps only some of the dimensions of \p *this then the
+    rest will be projected away.
+
+    If the highest dimension mapped to by \p pfunc is higher than the
+    highest dimension in \p *this then the number of dimensions in \p
+    *this will be increased to the highest dimension mapped to by \p
+    pfunc.
+
+    \param pfunc
+    The partial function specifying the destiny of each space
+    dimension.
+
+    The template class <CODE>Partial_Function</CODE> must provide the following
+    methods.
+    \code
+      bool has_empty_codomain() const
+    \endcode
+    returns <CODE>true</CODE> if and only if the represented partial
+    function has an empty codomain (i.e., it is always undefined).
+    The <CODE>has_empty_codomain()</CODE> method will always be called
+    before the methods below.  However, if
+    <CODE>has_empty_codomain()</CODE> returns <CODE>true</CODE>, none
+    of the functions below will be called.
+    \code
+      dimension_type max_in_codomain() const
+    \endcode
+    returns the maximum value that belongs to the codomain of the
+    partial function.
+    The <CODE>max_in_codomain()</CODE> method is called at most once.
+    \code
+      bool maps(dimension_type i, dimension_type& j) const
+    \endcode
+    Let \f$f\f$ be the represented function and \f$k\f$ be the value
+    of \p i.  If \f$f\f$ is defined in \f$k\f$, then \f$f(k)\f$ is
+    assigned to \p j and <CODE>true</CODE> is returned.  If \f$f\f$ is
+    undefined in \f$k\f$, then <CODE>false</CODE> is returned.
+    This method is called at most \f$n\f$ times, where \f$n\f$ is the
+    dimension of the vector space enclosing \p *this.
+
+    The result is undefined if \p pfunc does not encode a partial
+    function with the properties described in
+    \ref Mapping_the_Dimensions_of_the_Vector_Space
+    "specification of the mapping operator".
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.  Also
+    thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+  friend bool operator==<>(const Partially_Reduced_Product<D1, D2, R>& x,
+                           const Partially_Reduced_Product<D1, D2, R>& y);
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::IO_Operators::
+  operator<<<>(std::ostream& s, const Partially_Reduced_Product<D1, D2, R>& dp);
+
+  //! \name Miscellaneous Member Functions
+  //@{
+
+  //! Destructor.
+  ~Partially_Reduced_Product();
+
+  /*! \brief
+    Swaps \p *this with product \p y.  (\p *this and \p y can be
+    dimension-incompatible.)
+  */
+  void m_swap(Partially_Reduced_Product& y);
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+  //! Returns the total size in bytes of the memory occupied by \p *this.
+  memory_size_type total_memory_in_bytes() const;
+
+  //! Returns the size in bytes of the memory managed by \p *this.
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //@} // Miscellaneous Member Functions
+
+  //! Reduce.
+  /*
+    \return
+    <CODE>true</CODE> if and only if either of the resulting component
+    is strictly contained in the respective original.
+  */
+  bool reduce() const;
+
+protected:
+  //! The type of the first component.
+  typedef D1 Domain1;
+
+  //! The type of the second component.
+  typedef D2 Domain2;
+
+  //! The first component.
+  D1 d1;
+
+  //! The second component.
+  D2 d2;
+
+protected:
+  //! Clears the reduced flag.
+  void clear_reduced_flag() const;
+
+  //! Sets the reduced flag.
+  void set_reduced_flag() const;
+
+  //! Return <CODE>true</CODE> if and only if the reduced flag is set.
+  bool is_reduced() const;
+
+  /*! \brief
+    Flag to record whether the components are reduced with respect
+    to each other and the reduction class.
+  */
+  bool reduced;
+
+private:
+  void throw_space_dimension_overflow(const char* method,
+                                      const char* reason);
+};
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+  This class is temporary and will be removed when template typedefs will
+  be supported in C++.
+
+  When template typedefs will be supported in C++, what now is verbosely
+  denoted by <CODE>Domain_Product\<Domain1, Domain2\>::%Direct_Product</CODE>
+  will simply be denoted by <CODE>Direct_Product\<Domain1, Domain2\></CODE>.
+*/
+template <typename D1, typename D2>
+class Domain_Product {
+public:
+  typedef Partially_Reduced_Product<D1, D2, No_Reduction<D1, D2> >
+  Direct_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Smash_Reduction<D1, D2> >
+  Smash_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Constraints_Reduction<D1, D2> >
+  Constraints_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Congruences_Reduction<D1, D2> >
+  Congruences_Product;
+
+  typedef Partially_Reduced_Product<D1, D2, Shape_Preserving_Reduction<D1, D2> >
+  Shape_Preserving_Product;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_inlines.hh line 1. */
+/* Partially_Reduced_Product class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_inlines.hh line 32. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::max_space_dimension() {
+  return (D1::max_space_dimension() < D2::max_space_dimension())
+    ? D1::max_space_dimension()
+    : D2::max_space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(dimension_type num_dimensions,
+                            const Degenerate_Element kind)
+  : d1(num_dimensions <= max_space_dimension()
+       ? num_dimensions
+       : (throw_space_dimension_overflow("Partially_Reduced_Product(n, k)",
+                                         "n exceeds the maximum "
+                                         "allowed space dimension"),
+          num_dimensions),
+       kind),
+    d2(num_dimensions, kind) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Congruence_System& cgs)
+  : d1(cgs), d2(cgs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Congruence_System& cgs)
+  : d1(const_cast<const Congruence_System&>(cgs)), d2(cgs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Constraint_System& cs)
+  : d1(cs), d2(cs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(Constraint_System& cs)
+  : d1(const_cast<const Constraint_System&>(cs)), d2(cs) {
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const C_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const NNC_Polyhedron& ph,
+                            Complexity_Class complexity)
+  : d1(ph, complexity), d2(ph, complexity) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Grid& gr, Complexity_Class)
+  : d1(gr), d2(gr) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Interval>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Box<Interval>& box, Complexity_Class)
+  : d1(box), d2(box) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const BD_Shape<U>& bd, Complexity_Class)
+  : d1(bd), d2(bd) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+template <typename U>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Octagonal_Shape<U>& os, Complexity_Class)
+  : d1(os), d2(os) {
+  set_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product& y,
+                            Complexity_Class)
+  : d1(y.d1), d2(y.d2) {
+  reduced = y.reduced;
+}
+
+template <typename D1, typename D2, typename R>
+template <typename E1, typename E2, typename S>
+inline
+Partially_Reduced_Product<D1, D2, R>
+::Partially_Reduced_Product(const Partially_Reduced_Product<E1, E2, S>& y,
+                            Complexity_Class complexity)
+  : d1(y.space_dimension()), d2(y.space_dimension()), reduced(false) {
+  Partially_Reduced_Product<D1, D2, R> pg1(y.domain1(), complexity);
+  Partially_Reduced_Product<D1, D2, R> pg2(y.domain2(), complexity);
+  pg1.intersection_assign(pg2);
+  m_swap(pg1);
+}
+
+template <typename D1, typename D2, typename R>
+inline
+Partially_Reduced_Product<D1, D2, R>::~Partially_Reduced_Product() {
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::external_memory_in_bytes() const {
+  return d1.external_memory_in_bytes() + d2.external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline memory_size_type
+Partially_Reduced_Product<D1, D2, R>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::space_dimension() const {
+  PPL_ASSERT(d1.space_dimension() == d2.space_dimension());
+  return d1.space_dimension();
+}
+
+template <typename D1, typename D2, typename R>
+inline dimension_type
+Partially_Reduced_Product<D1, D2, R>::affine_dimension() const {
+  reduce();
+  const dimension_type d1_dim = d1.affine_dimension();
+  const dimension_type d2_dim = d2.affine_dimension();
+  return std::min(d1_dim, d2_dim);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::unconstrain(const Variable var) {
+  reduce();
+  d1.unconstrain(var);
+  d2.unconstrain(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::unconstrain(const Variables_Set& vars) {
+  reduce();
+  d1.unconstrain(vars);
+  d2.unconstrain(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::intersection_assign(const Partially_Reduced_Product& y) {
+  d1.intersection_assign(y.d1);
+  d2.intersection_assign(y.d2);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::difference_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.difference_assign(y.d1);
+  d2.difference_assign(y.d2);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.upper_bound_assign(y.d1);
+  d2.upper_bound_assign(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::upper_bound_assign_if_exact(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  D1 d1_copy = d1;
+  bool ub_exact = d1_copy.upper_bound_assign_if_exact(y.d1);
+  if (!ub_exact)
+    return false;
+  ub_exact = d2.upper_bound_assign_if_exact(y.d2);
+  if (!ub_exact)
+    return false;
+  using std::swap;
+  swap(d1, d1_copy);
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_image(Variable var,
+               const Linear_Expression& expr,
+               Coefficient_traits::const_reference denominator) {
+  d1.affine_image(var, expr, denominator);
+  d2.affine_image(var, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::affine_preimage(Variable var,
+                  const Linear_Expression& expr,
+                  Coefficient_traits::const_reference denominator) {
+  d1.affine_preimage(var, expr, denominator);
+  d2.affine_preimage(var, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_image(var, relsym, expr, denominator);
+  d2.generalized_affine_image(var, relsym, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator) {
+  d1.generalized_affine_preimage(var, relsym, expr, denominator);
+  d2.generalized_affine_preimage(var, relsym, expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  d1.generalized_affine_image(lhs, relsym, rhs);
+  d2.generalized_affine_image(lhs, relsym, rhs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  d1.generalized_affine_preimage(lhs, relsym, rhs);
+  d2.generalized_affine_preimage(lhs, relsym, rhs);
+  clear_reduced_flag();
+}
+
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_image(var, lb_expr, ub_expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  d1.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  d2.bounded_affine_preimage(var, lb_expr, ub_expr, denominator);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::time_elapse_assign(const Partially_Reduced_Product& y) {
+  reduce();
+  y.reduce();
+  d1.time_elapse_assign(y.d1);
+  d2.time_elapse_assign(y.d2);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::topological_closure_assign() {
+  d1.topological_closure_assign();
+  d2.topological_closure_assign();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::m_swap(Partially_Reduced_Product& y) {
+  using std::swap;
+  swap(d1, y.d1);
+  swap(d2, y.d2);
+  swap(reduced, y.reduced);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_constraint(const Constraint& c) {
+  d1.add_constraint(c);
+  d2.add_constraint(c);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_constraint(const Constraint& c) {
+  d1.refine_with_constraint(c);
+  d2.refine_with_constraint(c);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::add_congruence(const Congruence& cg) {
+  d1.add_congruence(cg);
+  d2.add_congruence(cg);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::refine_with_congruence(const Congruence& cg) {
+  d1.refine_with_congruence(cg);
+  d2.refine_with_congruence(cg);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_constraints(const Constraint_System& cs) {
+  d1.add_constraints(cs);
+  d2.add_constraints(cs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_constraints(const Constraint_System& cs) {
+  d1.refine_with_constraints(cs);
+  d2.refine_with_constraints(cs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_congruences(const Congruence_System& cgs) {
+  d1.add_congruences(cgs);
+  d2.add_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::refine_with_congruences(const Congruence_System& cgs) {
+  d1.refine_with_congruences(cgs);
+  d2.refine_with_congruences(cgs);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+  reduce();
+  d1.drop_some_non_integer_points(complexity);
+  d2.drop_some_non_integer_points(complexity);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity) {
+  reduce();
+  d1.drop_some_non_integer_points(vars, complexity);
+  d2.drop_some_non_integer_points(vars, complexity);
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline Partially_Reduced_Product<D1, D2, R>&
+Partially_Reduced_Product<D1, D2, R>
+::operator=(const Partially_Reduced_Product& y) {
+  d1 = y.d1;
+  d2 = y.d2;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D1&
+Partially_Reduced_Product<D1, D2, R>::domain1() const {
+  reduce();
+  return d1;
+}
+
+template <typename D1, typename D2, typename R>
+inline const D2&
+Partially_Reduced_Product<D1, D2, R>::domain2() const {
+  reduce();
+  return d2;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_empty() const {
+  reduce();
+  return d1.is_empty() || d2.is_empty();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_universe() const {
+  return d1.is_universe() && d2.is_universe();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_topologically_closed() const {
+  reduce();
+  return d1.is_topologically_closed() && d2.is_topologically_closed();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::is_disjoint_from(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.is_disjoint_from(y.d1) || d2.is_disjoint_from(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_discrete() const {
+  reduce();
+  return d1.is_discrete() || d2.is_discrete();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_bounded() const {
+  reduce();
+  return d1.is_bounded() || d2.is_bounded();
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_above(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_above(expr) || d2.bounds_from_above(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::bounds_from_below(const Linear_Expression& expr) const {
+  reduce();
+  return d1.bounds_from_below(expr) || d2.bounds_from_below(expr);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::constrains(Variable var) const {
+  reduce();
+  return d1.constrains(var) || d2.constrains(var);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::widening_assign(const Partially_Reduced_Product& y,
+                  unsigned* tp) {
+  // FIXME(0.10.1): In general this is _NOT_ a widening since the reduction
+  //        may mean that the sequence does not satisfy the ascending
+  //        chain condition.
+  //        However, for the direct, smash and constraints product
+  //        it may be ok - but this still needs checking.
+  reduce();
+  y.reduce();
+  d1.widening_assign(y.d1, tp);
+  d2.widening_assign(y.d2, tp);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_embed(dimension_type m) {
+  d1.add_space_dimensions_and_embed(m);
+  d2.add_space_dimensions_and_embed(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::add_space_dimensions_and_project(dimension_type m) {
+  d1.add_space_dimensions_and_project(m);
+  d2.add_space_dimensions_and_project(m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::concatenate_assign(const Partially_Reduced_Product& y) {
+  d1.concatenate_assign(y.d1);
+  d2.concatenate_assign(y.d2);
+  if (!is_reduced() || !y.is_reduced())
+    clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_space_dimensions(const Variables_Set& vars) {
+  d1.remove_space_dimensions(vars);
+  d2.remove_space_dimensions(vars);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  d1.remove_higher_space_dimensions(new_dimension);
+  d2.remove_higher_space_dimensions(new_dimension);
+}
+
+template <typename D1, typename D2, typename R>
+template <typename Partial_Function>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::map_space_dimensions(const Partial_Function& pfunc) {
+  d1.map_space_dimensions(pfunc);
+  d2.map_space_dimensions(pfunc);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::expand_space_dimension(Variable var, dimension_type m) {
+  d1.expand_space_dimension(var, m);
+  d2.expand_space_dimension(var, m);
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>
+::fold_space_dimensions(const Variables_Set& vars,
+                        Variable dest) {
+  d1.fold_space_dimensions(vars, dest);
+  d2.fold_space_dimensions(vars, dest);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return d1.contains(y.d1) && d2.contains(y.d2);
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>
+::strictly_contains(const Partially_Reduced_Product& y) const {
+  reduce();
+  y.reduce();
+  return (d1.contains(y.d1) && d2.strictly_contains(y.d2))
+    || (d2.contains(y.d2) && d1.strictly_contains(y.d1));
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::reduce() const {
+  Partially_Reduced_Product& dp
+    = const_cast<Partially_Reduced_Product&>(*this);
+  if (dp.is_reduced())
+    return false;
+  R r;
+  r.product_reduce(dp.d1, dp.d2);
+  set_reduced_flag();
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::is_reduced() const {
+  return reduced;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::clear_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = false;
+}
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::set_reduced_flag() const {
+  const_cast<Partially_Reduced_Product&>(*this).reduced = true;
+}
+
+PPL_OUTPUT_3_PARAM_TEMPLATE_DEFINITIONS(D1, D2, R, Partially_Reduced_Product)
+
+template <typename D1, typename D2, typename R>
+inline void
+Partially_Reduced_Product<D1, D2, R>::ascii_dump(std::ostream& s) const {
+  const char yes = '+';
+  const char no = '-';
+  s << "Partially_Reduced_Product\n";
+  s << (reduced ? yes : no) << "reduced\n";
+  s << "Domain 1:\n";
+  d1.ascii_dump(s);
+  s << "Domain 2:\n";
+  d2.ascii_dump(s);
+}
+
+template <typename D1, typename D2, typename R>
+inline int32_t
+Partially_Reduced_Product<D1, D2, R>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator==(const Partially_Reduced_Product<D1, D2, R>& x,
+           const Partially_Reduced_Product<D1, D2, R>& y) {
+  x.reduce();
+  y.reduce();
+  return x.d1 == y.d1 && x.d2 == y.d2;
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline bool
+operator!=(const Partially_Reduced_Product<D1, D2, R>& x,
+           const Partially_Reduced_Product<D1, D2, R>& y) {
+  return !(x == y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline std::ostream&
+IO_Operators::operator<<(std::ostream& s,
+                         const Partially_Reduced_Product<D1, D2, R>& dp) {
+  return s << "Domain 1:\n"
+           << dp.d1
+           << "Domain 2:\n"
+           << dp.d2;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::No_Reduction() {
+}
+
+template <typename D1, typename D2>
+void No_Reduction<D1, D2>::product_reduce(D1&, D2&) {
+}
+
+template <typename D1, typename D2>
+inline
+No_Reduction<D1, D2>::~No_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Smash_Reduction<D1, D2>::~Smash_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Constraints_Reduction<D1, D2>::~Constraints_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Congruences_Reduction<D1, D2>::~Congruences_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::Shape_Preserving_Reduction() {
+}
+
+template <typename D1, typename D2>
+inline
+Shape_Preserving_Reduction<D1, D2>::~Shape_Preserving_Reduction() {
+}
+
+/*! \relates Partially_Reduced_Product */
+template <typename D1, typename D2, typename R>
+inline void
+swap(Partially_Reduced_Product<D1, D2, R>& x,
+     Partially_Reduced_Product<D1, D2, R>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_templates.hh line 1. */
+/* Partially_Reduced_Product class implementation:
+   non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_templates.hh line 31. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::throw_space_dimension_overflow(const char* method,
+                                 const char* reason) {
+  std::ostringstream s;
+  s << "PPL::Partially_Reduced_Product::" << method << ":" << std::endl
+    << reason << ".";
+  throw std::length_error(s.str());
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+         cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  return cs;
+}
+
+template <typename D1, typename D2, typename R>
+Constraint_System
+Partially_Reduced_Product<D1, D2, R>::minimized_constraints() const {
+  reduce();
+  Constraint_System cs = d2.constraints();
+  const Constraint_System& cs1 = d1.constraints();
+  for (Constraint_System::const_iterator i = cs1.begin(),
+         cs_end = cs1.end(); i != cs_end; ++i)
+    cs.insert(*i);
+  if (cs.has_strict_inequalities()) {
+    NNC_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+  else {
+    C_Polyhedron ph(cs);
+    return ph.minimized_constraints();
+  }
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+         cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  return cgs;
+}
+
+template <typename D1, typename D2, typename R>
+Congruence_System
+Partially_Reduced_Product<D1, D2, R>::minimized_congruences() const {
+  reduce();
+  Congruence_System cgs = d2.congruences();
+  const Congruence_System& cgs1 = d1.congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+         cgs_end = cgs1.end(); i != cgs_end; ++i)
+    cgs.insert(*i);
+  Grid gr(cgs);
+  return gr.minimized_congruences();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_constraints(Constraint_System& cs) {
+  if (d1.can_recycle_constraint_systems()) {
+    d2.refine_with_constraints(cs);
+    d1.add_recycled_constraints(cs);
+  }
+  else
+    if (d2.can_recycle_constraint_systems()) {
+      d1.refine_with_constraints(cs);
+      d2.add_recycled_constraints(cs);
+    }
+    else {
+      d1.add_constraints(cs);
+      d2.add_constraints(cs);
+    }
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+void
+Partially_Reduced_Product<D1, D2, R>
+::add_recycled_congruences(Congruence_System& cgs) {
+  if (d1.can_recycle_congruence_systems()) {
+    d2.refine_with_congruences(cgs);
+    d1.add_recycled_congruences(cgs);
+  }
+  else
+    if (d2.can_recycle_congruence_systems()) {
+      d1.refine_with_congruences(cgs);
+      d2.add_recycled_congruences(cgs);
+    }
+    else {
+      d1.add_congruences(cgs);
+      d2.add_congruences(cgs);
+    }
+  clear_reduced_flag();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Gen_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Generator& g) const {
+  reduce();
+  if (Poly_Gen_Relation::nothing() == d1.relation_with(g)
+      || Poly_Gen_Relation::nothing() == d2.relation_with(g))
+    return Poly_Gen_Relation::nothing();
+  else
+    return Poly_Gen_Relation::subsumes();
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Constraint& c) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(c);
+  Poly_Con_Relation relation2 = d2.relation_with(c);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+Poly_Con_Relation
+Partially_Reduced_Product<D1, D2, R>
+::relation_with(const Congruence& cg) const {
+  reduce();
+  Poly_Con_Relation relation1 = d1.relation_with(cg);
+  Poly_Con_Relation relation2 = d2.relation_with(cg);
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+
+  if (relation1.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  else if (relation2.implies(Poly_Con_Relation::is_included()))
+    result = result && Poly_Con_Relation::is_included();
+  if (relation1.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  else if (relation2.implies(Poly_Con_Relation::saturates()))
+    result = result && Poly_Con_Relation::saturates();
+  if (relation1.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+  else if (relation2.implies(Poly_Con_Relation::is_disjoint()))
+    result = result && Poly_Con_Relation::is_disjoint();
+
+  return result;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+           Coefficient& sup_n,
+           Coefficient& sup_d,
+           bool& maximum) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+  bool maximum1;
+  bool maximum2;
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+           Coefficient& inf_n,
+           Coefficient& inf_d,
+           bool& minimum) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+  PPL_ASSERT(reduced);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+  bool minimum1;
+  bool minimum2;
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::maximize(const Linear_Expression& expr,
+           Coefficient& sup_n,
+           Coefficient& sup_d,
+           bool& maximum,
+           Generator& g) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+  PPL_ASSERT(reduced);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(sup2_d);
+  bool maximum1;
+  bool maximum2;
+  Generator g1(point());
+  Generator g2(point());
+  bool r1 = d1.maximize(expr, sup1_n, sup1_d, maximum1, g1);
+  bool r2 = d2.maximize(expr, sup2_n, sup2_d, maximum2, g2);
+  // If neither is bounded from above, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from above, then use the values for d2.
+  if (!r1) {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    g = g2;
+    return true;
+  }
+  // If only d1 is bounded from above, then use the values for d1.
+  if (!r2) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    g = g1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from above, then use the minimum values.
+  if (sup2_d * sup1_n >= sup1_d * sup2_n) {
+    sup_n = sup1_n;
+    sup_d = sup1_d;
+    maximum = maximum1;
+    g = g1;
+  }
+  else {
+    sup_n = sup2_n;
+    sup_d = sup2_d;
+    maximum = maximum2;
+    g = g2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>
+::minimize(const Linear_Expression& expr,
+           Coefficient& inf_n,
+           Coefficient& inf_d,
+           bool& minimum,
+           Generator& g) const {
+  reduce();
+
+  if (is_empty())
+    return false;
+  PPL_ASSERT(reduced);
+
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf1_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(inf2_d);
+  bool minimum1;
+  bool minimum2;
+  Generator g1(point());
+  Generator g2(point());
+  bool r1 = d1.minimize(expr, inf1_n, inf1_d, minimum1, g1);
+  bool r2 = d2.minimize(expr, inf2_n, inf2_d, minimum2, g2);
+  // If neither is bounded from below, return false.
+  if (!r1 && !r2)
+    return false;
+  // If only d2 is bounded from below, then use the values for d2.
+  if (!r1) {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    g = g2;
+    return true;
+  }
+  // If only d1 is bounded from below, then use the values for d1.
+  if (!r2) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    g = g1;
+    return true;
+  }
+  // If both d1 and d2 are bounded from below, then use the minimum values.
+  if (inf2_d * inf1_n <= inf1_d * inf2_n) {
+    inf_n = inf1_n;
+    inf_d = inf1_d;
+    minimum = minimum1;
+    g = g1;
+  }
+  else {
+    inf_n = inf2_n;
+    inf_d = inf2_d;
+    minimum = minimum2;
+    g = g2;
+  }
+  return true;
+}
+
+template <typename D1, typename D2, typename R>
+inline bool
+Partially_Reduced_Product<D1, D2, R>::OK() const {
+  if (reduced) {
+    Partially_Reduced_Product<D1, D2, R> dp1 = *this;
+    Partially_Reduced_Product<D1, D2, R> dp2 = *this;
+    /* Force dp1 reduction */
+    dp1.clear_reduced_flag();
+    dp1.reduce();
+    if (dp1 != dp2)
+      return false;
+  }
+  return d1.OK() && d2.OK();
+}
+
+template <typename D1, typename D2, typename R>
+bool
+Partially_Reduced_Product<D1, D2, R>::ascii_load(std::istream& s) {
+  const char yes = '+';
+  const char no = '-';
+  std::string str;
+  if (!(s >> str) || str != "Partially_Reduced_Product")
+    return false;
+  if (!(s >> str)
+      || (str[0] != yes && str[0] != no)
+      || str.substr(1) != "reduced")
+    return false;
+  reduced = (str[0] == yes);
+  if (!(s >> str) || str != "Domain")
+    return false;
+  if (!(s >> str) || str != "1:")
+    return false;
+  if (!d1.ascii_load(s))
+    return false;
+  if (!(s >> str) || str != "Domain")
+    return false;
+  if (!(s >> str) || str != "2:")
+    return false;
+  return d2.ascii_load(s);
+}
+
+template <typename D1, typename D2>
+void Smash_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  using std::swap;
+  if (d2.is_empty()) {
+    if (!d1.is_empty()) {
+      D1 new_d1(d1.space_dimension(), EMPTY);
+      swap(d1, new_d1);
+    }
+  }
+  else if (d1.is_empty()) {
+    D2 new_d2(d2.space_dimension(), EMPTY);
+    swap(d2, new_d2);
+  }
+}
+
+template <typename D1, typename D2>
+void Constraints_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d1.is_empty() || d2.is_empty()) {
+    // If one of the components is empty, do the smash reduction and return.
+    Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+    sr.product_reduce(d1, d2);
+    return;
+  }
+  else {
+    using std::swap;
+    dimension_type space_dim = d1.space_dimension();
+    d1.refine_with_constraints(d2.minimized_constraints());
+    if (d1.is_empty()) {
+      D2 new_d2(space_dim, EMPTY);
+      swap(d2, new_d2);
+      return;
+    }
+    d2.refine_with_constraints(d1.minimized_constraints());
+    if (d2.is_empty()) {
+      D1 new_d1(space_dim, EMPTY);
+      swap(d1, new_d1);
+    }
+  }
+}
+
+/* Auxiliary procedure for the Congruences_Reduction() method.
+   If more than one hyperplane defined by congruence cg intersect
+   d2, then d1 and d2 are unchanged; if exactly one intersects d2, then
+   the corresponding equality is added to d1 and d2;
+   otherwise d1 and d2 are set empty. */
+template <typename D1, typename D2>
+bool shrink_to_congruence_no_check(D1& d1, D2& d2, const Congruence& cg) {
+  // It is assumed that cg is a proper congruence.
+  PPL_ASSERT(cg.modulus() != 0);
+  // It is assumed that cg is satisfied by all points in d1.
+  PPL_ASSERT(d1.relation_with(cg) == Poly_Con_Relation::is_included());
+
+  Linear_Expression e(cg.expression());
+
+  // Find the maximum and minimum bounds for the domain element d with the
+  // linear expression e.
+  PPL_DIRTY_TEMP_COEFFICIENT(max_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_denom);
+  bool max_included;
+  PPL_DIRTY_TEMP_COEFFICIENT(min_numer);
+  PPL_DIRTY_TEMP_COEFFICIENT(min_denom);
+  if (d2.maximize(e, max_numer, max_denom, max_included)) {
+    bool min_included;
+    if (d2.minimize(e, min_numer, min_denom, min_included)) {
+      // Adjust values to allow for the denominators max_denom and min_denom.
+      max_numer *= min_denom;
+      min_numer *= max_denom;
+      PPL_DIRTY_TEMP_COEFFICIENT(denom);
+      PPL_DIRTY_TEMP_COEFFICIENT(mod);
+      denom = max_denom * min_denom;
+      mod = cg.modulus() * denom;
+      // If the difference between the maximum and minimum bounds is more than
+      // twice the modulus, then there will be two neighboring hyperplanes
+      // defined by cg that are intersected by the domain element d;
+      // there is no possible reduction in this case.
+      PPL_DIRTY_TEMP_COEFFICIENT(mod2);
+      mod2 = 2 * mod;
+      if (max_numer - min_numer < mod2
+          || (max_numer - min_numer == mod2 && (!max_included || !min_included)))
+        {
+          PPL_DIRTY_TEMP_COEFFICIENT(shrink_amount);
+          PPL_DIRTY_TEMP_COEFFICIENT(max_decreased);
+          PPL_DIRTY_TEMP_COEFFICIENT(min_increased);
+          // Find the amount by which the maximum value may be decreased.
+          shrink_amount = max_numer % mod;
+          if (!max_included && shrink_amount == 0)
+            shrink_amount = mod;
+          if (shrink_amount < 0)
+            shrink_amount += mod;
+          max_decreased = max_numer - shrink_amount;
+          // Find the amount by which the minimum value may be increased.
+          shrink_amount = min_numer % mod;
+          if (!min_included && shrink_amount == 0)
+            shrink_amount = - mod;
+          if (shrink_amount > 0)
+            shrink_amount -= mod;
+          min_increased = min_numer - shrink_amount;
+          if (max_decreased == min_increased) {
+            // The domain element d2 intersects exactly one hyperplane
+            // defined by cg, so add the equality to d1 and d2.
+            Constraint new_c(denom * e == min_increased);
+            d1.refine_with_constraint(new_c);
+            d2.refine_with_constraint(new_c);
+            return true;
+          }
+          else {
+            if (max_decreased < min_increased) {
+              using std::swap;
+              // In this case, d intersects no hyperplanes defined by cg,
+              // so set d to empty and return false.
+              D1 new_d1(d1.space_dimension(), EMPTY);
+              swap(d1, new_d1);
+              D2 new_d2(d2.space_dimension(), EMPTY);
+              swap(d2, new_d2);
+              return false;
+            }
+          }
+        }
+    }
+  }
+  return true;
+}
+
+template <typename D1, typename D2>
+void
+Congruences_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  if (d1.is_empty() || d2.is_empty()) {
+    // If one of the components is empty, do the smash reduction and return.
+    Parma_Polyhedra_Library::Smash_Reduction<D1, D2> sr;
+    sr.product_reduce(d1, d2);
+    return;
+  }
+  // Use the congruences representing d1 to shrink both components.
+  const Congruence_System cgs1 = d1.minimized_congruences();
+  for (Congruence_System::const_iterator i = cgs1.begin(),
+         cgs_end = cgs1.end(); i != cgs_end; ++i) {
+    const Congruence& cg1 = *i;
+    if (cg1.is_equality())
+      d2.refine_with_congruence(cg1);
+    else
+      if (!Parma_Polyhedra_Library::
+          shrink_to_congruence_no_check(d1, d2, cg1))
+        // The product is empty.
+        return;
+  }
+  // Use the congruences representing d2 to shrink both components.
+  const Congruence_System cgs2 = d2.minimized_congruences();
+  for (Congruence_System::const_iterator i = cgs2.begin(),
+         cgs_end = cgs2.end(); i != cgs_end; ++i) {
+    const Congruence& cg2 = *i;
+    if (cg2.is_equality())
+      d1.refine_with_congruence(cg2);
+    else
+      if (!Parma_Polyhedra_Library::
+          shrink_to_congruence_no_check(d2, d1, cg2))
+        // The product is empty.
+        return;
+  }
+}
+
+template <typename D1, typename D2>
+void
+Shape_Preserving_Reduction<D1, D2>::product_reduce(D1& d1, D2& d2) {
+  // First do the congruences reduction.
+  Parma_Polyhedra_Library::Congruences_Reduction<D1, D2> cgr;
+  cgr.product_reduce(d1, d2);
+  if (d1.is_empty())
+    return;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(freq_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(freq_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(val_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(val_d);
+
+  // Use the constraints representing d2.
+  Constraint_System cs = d2.minimized_constraints();
+  Constraint_System refining_cs;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality())
+      continue;
+    // Check the frequency and value of the linear expression for
+    // the constraint `c'.
+    Linear_Expression le(c.expression());
+    if (!d1.frequency(le, freq_n, freq_d, val_n, val_d))
+      // Nothing to do.
+      continue;
+    if (val_n == 0)
+      // Nothing to do.
+      continue;
+    // Adjust the value of the inhomogeneous term to satisfy
+    // the implied congruence.
+    if (val_n < 0) {
+      val_n = val_n*freq_d + val_d*freq_n;
+      val_d *= freq_d;
+    }
+    le *= val_d;
+    le -= val_n;
+    refining_cs.insert(le >= 0);
+  }
+  d2.refine_with_constraints(refining_cs);
+
+  // Use the constraints representing d1.
+  cs = d1.minimized_constraints();
+  refining_cs.clear();
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality())
+      // Equalities already shared.
+      continue;
+    // Check the frequency and value of the linear expression for
+    // the constraint `c'.
+    Linear_Expression le(c.expression());
+    if (!d2.frequency(le, freq_n, freq_d, val_n, val_d))
+      // Nothing to do.
+      continue;
+    if (val_n == 0)
+      // Nothing to do.
+      continue;
+    // Adjust the value of the inhomogeneous term to satisfy
+    // the implied congruence.
+    if (val_n < 0) {
+      val_n = val_n*freq_d + val_d*freq_n;
+      val_d *= freq_d;
+    }
+    le *= val_d;
+    le -= val_n;
+    refining_cs.insert(le >= 0);
+  }
+  d1.refine_with_constraints(refining_cs);
+
+  // The reduction may have introduced additional equalities
+  // so these must be shared with the other component.
+  Parma_Polyhedra_Library::Constraints_Reduction<D1, D2> cr;
+  cr.product_reduce(d1, d2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Partially_Reduced_Product_defs.hh line 1688. */
+
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 1. */
+/* Determinate class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Determinate_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 32. */
+#include <iosfwd>
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 34. */
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Determinate */
+template <typename PSET>
+void swap(Determinate<PSET>& x, Determinate<PSET>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are the same
+  COW-wrapped pointset.
+
+  \relates Determinate
+*/
+template <typename PSET>
+bool operator==(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x and \p y are different
+  COW-wrapped pointsets.
+
+  \relates Determinate
+*/
+template <typename PSET>
+bool operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PSET>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \brief
+  A wrapper for PPL pointsets, providing them with a
+  <EM>determinate constraint system</EM> interface, as defined
+  in \ref Bag98 "[Bag98]".
+
+  The implementation uses a copy-on-write optimization, making the
+  class suitable for constructions, like the <EM>finite powerset</EM>
+  and <EM>ask-and-tell</EM> of \ref Bag98 "[Bag98]", that are likely
+  to perform many copies.
+
+  \ingroup PPL_CXX_interface
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Determinate {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Constructs a COW-wrapped object corresponding to the pointset \p pset.
+  */
+  Determinate(const PSET& pset);
+
+  /*! \brief
+    Constructs a COW-wrapped object corresponding to the pointset
+    defined by \p cs.
+  */
+  Determinate(const Constraint_System& cs);
+
+  /*! \brief
+    Constructs a COW-wrapped object corresponding to the pointset
+    defined by \p cgs.
+  */
+  Determinate(const Congruence_System& cgs);
+
+  //! Copy constructor.
+  Determinate(const Determinate& y);
+
+  //! Destructor.
+  ~Determinate();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Domain Element
+  //@{
+
+  //! Returns a const reference to the embedded pointset.
+  const PSET& pointset() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this embeds the universe
+    element \p PSET.
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this embeds the empty
+    element of \p PSET.
+  */
+  bool is_bottom() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this entails \p y.
+  bool definitely_entails(const Determinate& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this and \p y
+    are definitely equivalent.
+  */
+  bool is_definitely_equivalent_to(const Determinate& y) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*!
+    Returns <CODE>true</CODE> if and only if this domain
+    has a nontrivial weakening operator.
+  */
+  static bool has_nontrivial_weakening();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Domain Element
+
+
+  //! \name Member Functions that May Modify the Domain Element
+  //@{
+
+  //! Assigns to \p *this the upper bound of \p *this and \p y.
+  void upper_bound_assign(const Determinate& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Determinate& y);
+
+  //! Assigns to \p *this the result of weakening \p *this with \p y.
+  void weakening_assign(const Determinate& y);
+
+  /*! \brief
+    Assigns to \p *this the \ref Concatenating_Polyhedra "concatenation"
+    of \p *this and \p y, taken in this order.
+  */
+  void concatenate_assign(const Determinate& y);
+
+  //! Returns a reference to the embedded element.
+  PSET& pointset();
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    On return from this method, the representation of \p *this
+    is not shared by different Determinate objects.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  void mutate();
+
+  //! Assignment operator.
+  Determinate& operator=(const Determinate& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Determinate& y);
+
+  //@} // Member Functions that May Modify the Domain Element
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  //! A function adapter for the Determinate class.
+  /*! \ingroup PPL_CXX_interface
+    It lifts a Binary_Operator_Assign function object, taking arguments
+    of type PSET, producing the corresponding function object taking
+    arguments of type Determinate<PSET>.
+
+    The template parameter Binary_Operator_Assign is supposed to
+    implement an <EM>apply and assign</EM> function, i.e., a function
+    having signature <CODE>void foo(PSET& x, const PSET& y)</CODE> that
+    applies an operator to \c x and \c y and assigns the result to \c x.
+    For instance, such a function object is obtained by
+    <CODE>std::mem_fun_ref(&C_Polyhedron::intersection_assign)</CODE>.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  template <typename Binary_Operator_Assign>
+  class Binary_Operator_Assign_Lifter {
+  public:
+    //! Explicit unary constructor.
+    explicit
+    Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign);
+
+    //! Function-application operator.
+    void operator()(Determinate& x, const Determinate& y) const;
+
+  private:
+    //! The function object to be lifted.
+    Binary_Operator_Assign op_assign_;
+  };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Helper function returning a Binary_Operator_Assign_Lifter object,
+    also allowing for the deduction of template arguments.
+  */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+  template <typename Binary_Operator_Assign>
+  static Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+  lift_op_assign(Binary_Operator_Assign op_assign);
+
+private:
+  //! The possibly shared representation of a Determinate object.
+  /*! \ingroup PPL_CXX_interface
+    By adopting the <EM>copy-on-write</EM> technique, a single
+    representation of the base-level object may be shared by more than
+    one object of the class Determinate.
+  */
+  class Rep {
+  private:
+    /*! \brief
+      Count the number of references:
+      -   0: leaked, \p pset is non-const;
+      -   1: one reference, \p pset is non-const;
+      - > 1: more than one reference, \p pset is const.
+    */
+    mutable unsigned long references;
+
+    //! Private and unimplemented: assignment not allowed.
+    Rep& operator=(const Rep& y);
+
+    //! Private and unimplemented: copies not allowed.
+    Rep(const Rep& y);
+
+    //! Private and unimplemented: default construction not allowed.
+    Rep();
+
+  public:
+    //! The possibly shared, embedded pointset.
+    PSET pset;
+
+    /*! \brief
+      Builds a new representation by creating a pointset
+      of the specified kind, in the specified vector space.
+    */
+    Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+    //! Builds a new representation by copying the pointset \p p.
+    Rep(const PSET& p);
+
+    //! Builds a new representation by copying the constraints in \p cs.
+    Rep(const Constraint_System& cs);
+
+    //! Builds a new representation by copying the constraints in \p cgs.
+    Rep(const Congruence_System& cgs);
+
+    //! Destructor.
+    ~Rep();
+
+    //! Registers a new reference.
+    void new_reference() const;
+
+    /*! \brief
+      Unregisters one reference; returns <CODE>true</CODE> if and only if
+      the representation has become unreferenced.
+    */
+    bool del_reference() const;
+
+    //! True if and only if this representation is currently shared.
+    bool is_shared() const;
+
+    /*! \brief
+      Returns a lower bound to the total size in bytes of the memory
+      occupied by \p *this.
+    */
+    memory_size_type total_memory_in_bytes() const;
+
+    /*! \brief
+      Returns a lower bound to the size in bytes of the memory
+      managed by \p *this.
+    */
+    memory_size_type external_memory_in_bytes() const;
+  };
+
+  /*! \brief
+    A pointer to the possibly shared representation of
+    the base-level domain element.
+  */
+  Rep* prep;
+
+  friend bool
+  operator==<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+
+  friend bool
+  operator!=<PSET>(const Determinate<PSET>& x, const Determinate<PSET>& y);
+};
+
+/* Automatically generated from PPL source file ../src/Determinate_inlines.hh line 1. */
+/* Determinate class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Determinate_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(dimension_type num_dimensions,
+                          Degenerate_Element kind)
+  : references(0), pset(num_dimensions, kind) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const PSET& p)
+  : references(0), pset(p) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Constraint_System& cs)
+  : references(0), pset(cs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::Rep(const Congruence_System& cgs)
+  : references(0), pset(cgs) {
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Rep::~Rep() {
+  PPL_ASSERT(references == 0);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::Rep::new_reference() const {
+  ++references;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::del_reference() const {
+  return --references == 0;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::Rep::is_shared() const {
+  return references > 1;
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::external_memory_in_bytes() const {
+  return pset.external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::Rep::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const PSET& pset)
+  : prep(new Rep(pset)) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Constraint_System& cs)
+  : prep(new Rep(cs)) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Congruence_System& cgs)
+  : prep(new Rep(cgs)) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::Determinate(const Determinate& y)
+  : prep(y.prep) {
+  prep->new_reference();
+}
+
+template <typename PSET>
+inline
+Determinate<PSET>::~Determinate() {
+  if (prep->del_reference())
+    delete prep;
+}
+
+template <typename PSET>
+inline Determinate<PSET>&
+Determinate<PSET>::operator=(const Determinate& y) {
+  y.prep->new_reference();
+  if (prep->del_reference())
+    delete prep;
+  prep = y.prep;
+  return *this;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::m_swap(Determinate& y) {
+  using std::swap;
+  swap(prep, y.prep);
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::mutate() {
+  if (prep->is_shared()) {
+    Rep* const new_prep = new Rep(prep->pset);
+    (void) prep->del_reference();
+    new_prep->new_reference();
+    prep = new_prep;
+  }
+}
+
+template <typename PSET>
+inline const PSET&
+Determinate<PSET>::pointset() const {
+  return prep->pset;
+}
+
+template <typename PSET>
+inline PSET&
+Determinate<PSET>::pointset() {
+  mutate();
+  return prep->pset;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::upper_bound_assign(const Determinate& y) {
+  pointset().upper_bound_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::meet_assign(const Determinate& y) {
+  pointset().intersection_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::has_nontrivial_weakening() {
+  // FIXME: the following should be turned into a query to PSET.  This
+  // can be postponed until the time the ask-and-tell construction is
+  // revived.
+  return false;
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::weakening_assign(const Determinate& y) {
+  // FIXME: the following should be turned into a proper
+  // implementation.  This can be postponed until the time the
+  // ask-and-tell construction is revived.
+  pointset().difference_assign(y.pointset());
+}
+
+template <typename PSET>
+inline void
+Determinate<PSET>::concatenate_assign(const Determinate& y) {
+  pointset().concatenate_assign(y.pointset());
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::definitely_entails(const Determinate& y) const {
+  return prep == y.prep || y.prep->pset.contains(prep->pset);
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_definitely_equivalent_to(const Determinate& y) const {
+  return prep == y.prep || prep->pset == y.prep->pset;
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_top() const {
+  return prep->pset.is_universe();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::is_bottom() const {
+  return prep->pset.is_empty();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::external_memory_in_bytes() const {
+  return prep->total_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Determinate<PSET>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline bool
+Determinate<PSET>::OK() const {
+  return prep->pset.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PSET>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PSET>& x) {
+  s << x.pointset();
+  return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator==(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+  return x.prep == y.prep || x.prep->pset == y.prep->pset;
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline bool
+operator!=(const Determinate<PSET>& x, const Determinate<PSET>& y) {
+  return x.prep != y.prep && x.prep->pset != y.prep->pset;
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+  : op_assign_(op_assign) {
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+  op_assign_(x.pointset(), y.pointset());
+}
+
+template <typename PSET>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PSET>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PSET>::lift_op_assign(Binary_Operator_Assign op_assign) {
+  return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+/*! \relates Determinate */
+template <typename PSET>
+inline void
+swap(Determinate<PSET>& x, Determinate<PSET>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Determinate_defs.hh line 330. */
+
+/* Automatically generated from PPL source file ../src/Powerset_defs.hh line 1. */
+/* Powerset class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Powerset_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+class Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_defs.hh line 1. */
+/* iterator_to_const and const_iterator_to_const class declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+class iterator_to_const;
+
+template <typename Container>
+class const_iterator_to_const;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_defs.hh line 29. */
+//#include "Ask_Tell_types.hh"
+#include <iterator>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This template class implements a bidirectional <EM>read-only</EM>
+  iterator on the sequence of objects <CODE>Container</CODE>.
+  By using this iterator class it is not possible to modify the objects
+  contained in <CODE>Container</CODE>; rather, object modification has
+  to be implemented by object replacement, i.e., by using the methods
+  provided by <CODE>Container</CODE> to remove/insert objects.
+  Such a policy (a modifiable container of read-only objects) allows
+  for a reliable enforcement of invariants (such as sortedness of the
+  objects in the sequence).
+
+  \note
+  For any developers' need, suitable friend declarations allow for
+  accessing the low-level iterators on the sequence of objects.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::iterator_to_const {
+private:
+  //! The type of the underlying mutable iterator.
+  typedef typename Container::iterator Base;
+
+  //! A shortcut for naming the const_iterator traits.
+  typedef typename
+  std::iterator_traits<typename Container::const_iterator> Traits;
+
+  //! A (mutable) iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level iterator.
+  iterator_to_const(const Base& b);
+
+  friend class const_iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+
+public:
+  // Same traits of the const_iterator, therefore
+  // forbidding the direct modification of sequence elements.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  iterator_to_const();
+
+  //! Copy constructor.
+  iterator_to_const(const iterator_to_const& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect access operator.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const iterator_to_const& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on a sequence of read-only objects.
+/*! \ingroup PPL_CXX_interface
+  This class, besides implementing a read-only bidirectional iterator
+  on a read-only sequence of objects, ensures interoperability
+  with template class iterator_to_const.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+class Parma_Polyhedra_Library::const_iterator_to_const {
+private:
+  //! The type of the underlying %const_iterator.
+  typedef typename Container::const_iterator Base;
+
+  //! A shortcut for naming traits.
+  typedef typename std::iterator_traits<Base> Traits;
+
+  //! A %const_iterator on the sequence of elements.
+  Base base;
+
+  //! Constructs from the lower-level const_iterator.
+  const_iterator_to_const(const Base& b);
+
+  friend class iterator_to_const<Container>;
+  template <typename T> friend class Powerset;
+
+public:
+  // Same traits of the underlying const_iterator.
+  typedef typename Traits::iterator_category iterator_category;
+  typedef typename Traits::value_type value_type;
+  typedef typename Traits::difference_type difference_type;
+  typedef typename Traits::pointer pointer;
+  typedef typename Traits::reference reference;
+
+  //! Default constructor.
+  const_iterator_to_const();
+
+  //! Copy constructor.
+  const_iterator_to_const(const const_iterator_to_const& y);
+
+  //! Constructs from the corresponding non-const iterator.
+  const_iterator_to_const(const iterator_to_const<Container>& y);
+
+  //! Dereference operator.
+  reference operator*() const;
+
+  //! Indirect member selector.
+  pointer operator->() const;
+
+  //! Prefix increment operator.
+  const_iterator_to_const& operator++();
+
+  //! Postfix increment operator.
+  const_iterator_to_const operator++(int);
+
+  //! Prefix decrement operator.
+  const_iterator_to_const& operator--();
+
+  //! Postfix decrement operator.
+  const_iterator_to_const operator--(int);
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are identical.
+  */
+  bool operator==(const const_iterator_to_const& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if
+    \p *this and \p y are different.
+  */
+  bool operator!=(const const_iterator_to_const& y) const;
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is identical to \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator==(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Mixed comparison operator: returns <CODE>true</CODE> if and only
+  if (the const version of) \p x is different from \p y.
+
+  \relates const_iterator_to_const
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename Container>
+bool
+operator!=(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y);
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_inlines.hh line 1. */
+/* iterator_to_const and const_iterator_to_const class implementations:
+   inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+iterator_to_const<Container>::iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::reference
+iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename iterator_to_const<Container>::pointer
+iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator++(int) {
+  iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>&
+iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline iterator_to_const<Container>
+iterator_to_const<Container>::operator--(int) {
+  iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator==(const iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+iterator_to_const<Container>::operator!=(const iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const()
+  : base() {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const const_iterator_to_const& y)
+  : base(y.base) {
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>::const_iterator_to_const(const Base& b)
+  : base(b) {
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::reference
+const_iterator_to_const<Container>::operator*() const {
+  return *base;
+}
+
+template <typename Container>
+inline typename const_iterator_to_const<Container>::pointer
+const_iterator_to_const<Container>::operator->() const {
+  return &*base;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator++() {
+  ++base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator++(int) {
+  const_iterator_to_const tmp = *this;
+  operator++();
+  return tmp;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>&
+const_iterator_to_const<Container>::operator--() {
+  --base;
+  return *this;
+}
+
+template <typename Container>
+inline const_iterator_to_const<Container>
+const_iterator_to_const<Container>::operator--(int) {
+  const_iterator_to_const tmp = *this;
+  operator--();
+  return tmp;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator==(const const_iterator_to_const& y) const {
+  return base == y.base;
+}
+
+template <typename Container>
+inline bool
+const_iterator_to_const<Container>
+::operator!=(const const_iterator_to_const& y) const {
+  return !operator==(y);
+}
+
+template <typename Container>
+inline
+const_iterator_to_const<Container>
+::const_iterator_to_const(const iterator_to_const<Container>& y)
+  : base(y.base) {
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator==(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y) {
+  return const_iterator_to_const<Container>(x).operator==(y);
+}
+
+/*! \relates const_iterator_to_const */
+template <typename Container>
+inline bool
+operator!=(const iterator_to_const<Container>& x,
+           const const_iterator_to_const<Container>& y) {
+  return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/iterator_to_const_defs.hh line 220. */
+
+/* Automatically generated from PPL source file ../src/Powerset_defs.hh line 30. */
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Powerset */
+template <typename D>
+void swap(Powerset<D>& x, Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are not equivalent.
+/*! \relates Powerset */
+template <typename D>
+bool
+operator!=(const Powerset<D>& x, const Powerset<D>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+
+//! The powerset construction on a base-level domain.
+/*! \ingroup PPL_CXX_interface
+  This class offers a generic implementation of a
+  <EM>powerset</EM> domain as defined in Section \ref powerset.
+
+  Besides invoking the available methods on the disjuncts of a Powerset,
+  this class also provides bidirectional iterators that allow for a
+  direct inspection of these disjuncts. For a consistent handling of
+  Omega-reduction, all the iterators are <EM>read-only</EM>, meaning
+  that the disjuncts cannot be overwritten. Rather, by using the class
+  <CODE>iterator</CODE>, it is possible to drop one or more disjuncts
+  (possibly so as to later add back modified versions).  As an example
+  of iterator usage, the following template function drops from
+  powerset \p ps all the disjuncts that would have become redundant by
+  the addition of an external element \p d.
+
+  \code
+template <typename D>
+void
+drop_subsumed(Powerset<D>& ps, const D& d) {
+  for (typename Powerset<D>::iterator i = ps.begin(),
+         ps_end = ps.end(), i != ps_end; )
+    if (i->definitely_entails(d))
+      i = ps.drop_disjunct(i);
+    else
+      ++i;
+}
+  \endcode
+
+  The template class D must provide the following methods.
+  \code
+    memory_size_type total_memory_in_bytes() const
+  \endcode
+  Returns a lower bound on the total size in bytes of the memory
+  occupied by the instance of D.
+  \code
+    bool is_top() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the top
+  element of the domain.
+  \code
+    bool is_bottom() const
+  \endcode
+  Returns <CODE>true</CODE> if and only if the instance of D is the
+  bottom element of the domain.
+  \code
+    bool definitely_entails(const D& y) const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D definitely entails
+  <CODE>y</CODE>.  Returns <CODE>false</CODE> if the instance may not
+  entail <CODE>y</CODE> (i.e., if the instance does not entail
+  <CODE>y</CODE> or if entailment could not be decided).
+  \code
+    void upper_bound_assign(const D& y)
+  \endcode
+  Assigns to the instance of D an upper bound of the instance and
+  <CODE>y</CODE>.
+  \code
+    void meet_assign(const D& y)
+  \endcode
+  Assigns to the instance of D the meet of the instance and
+  <CODE>y</CODE>.
+  \code
+    bool OK() const
+  \endcode
+  Returns <CODE>true</CODE> if the instance of D is in a consistent
+  state, else returns <CODE>false</CODE>.
+
+  The following operators on the template class D must be defined.
+  \code
+    operator<<(std::ostream& s, const D& x)
+  \endcode
+  Writes a textual representation of the instance of D on
+  <CODE>s</CODE>.
+  \code
+    operator==(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are equivalent D's.
+  \code
+    operator!=(const D& x, const D& y)
+  \endcode
+  Returns <CODE>true</CODE> if and only if <CODE>x</CODE> and
+  <CODE>y</CODE> are different D's.
+*/
+template <typename D>
+class Parma_Polyhedra_Library::Powerset {
+public:
+  //! \name Constructors and Destructor
+  //@{
+
+  /*! \brief
+    Default constructor: builds the bottom of the powerset constraint
+    system (i.e., the empty powerset).
+  */
+  Powerset();
+
+  //! Copy constructor.
+  Powerset(const Powerset& y);
+
+  /*! \brief
+    If \p d is not bottom, builds a powerset containing only \p d.
+    Builds the empty powerset otherwise.
+  */
+  explicit Powerset(const D& d);
+
+  //! Destructor.
+  ~Powerset();
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Powerset Object
+  //@{
+
+  /*! \brief
+    Returns <CODE>true</CODE> if \p *this definitely entails \p y.
+    Returns <CODE>false</CODE> if \p *this may not entail \p y
+    (i.e., if \p *this does not entail \p y or if entailment could
+    not be decided).
+  */
+  bool definitely_entails(const Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the top
+    element of the powerset constraint system (i.e., it represents
+    the universe).
+  */
+  bool is_top() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is the bottom
+    element of the powerset constraint system (i.e., it represents
+    the empty set).
+  */
+  bool is_bottom() const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  //! Checks if all the invariants are satisfied.
+  // FIXME: document and perhaps use an enum instead of a bool.
+  bool OK(bool disallow_bottom = false) const;
+
+  //@} // Member Functions that Do Not Modify the Powerset Object
+
+protected:
+  //! A powerset is implemented as a sequence of elements.
+  /*!
+    The particular sequence employed must support efficient deletion
+    in any position and efficient back insertion.
+  */
+  typedef std::list<D> Sequence;
+
+  //! Alias for the low-level iterator on the disjuncts.
+  typedef typename Sequence::iterator Sequence_iterator;
+
+  //! Alias for the low-level %const_iterator on the disjuncts.
+  typedef typename Sequence::const_iterator Sequence_const_iterator;
+
+  //! The sequence container holding powerset's elements.
+  Sequence sequence;
+
+  //! If <CODE>true</CODE>, \p *this is Omega-reduced.
+  mutable bool reduced;
+
+public:
+  // Sequence manipulation types, accessors and modifiers
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::value_type value_type;
+
+  /*! \brief
+    Alias for a <EM>read-only</EM> bidirectional %iterator on the
+    disjuncts of a Powerset element.
+
+    By using this iterator type, the disjuncts cannot be overwritten,
+    but they can be removed using methods
+    <CODE>drop_disjunct(iterator position)</CODE> and
+    <CODE>drop_disjuncts(iterator first, iterator last)</CODE>,
+    while still ensuring a correct handling of Omega-reduction.
+  */
+  typedef iterator_to_const<Sequence> iterator;
+
+  //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+  typedef const_iterator_to_const<Sequence> const_iterator;
+
+  //! The reverse iterator type built from Powerset::iterator.
+  typedef std::reverse_iterator<iterator> reverse_iterator;
+
+  //! The reverse iterator type built from Powerset::const_iterator.
+  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+
+  //! \name Member Functions for the Direct Manipulation of Disjuncts
+  //@{
+
+  /*! \brief
+    Drops from the sequence of disjuncts in \p *this all the
+    non-maximal elements so that \p *this is non-redundant.
+
+    This method is declared <CODE>const</CODE> because, even though
+    Omega-reduction may change the syntactic representation of \p *this,
+    its semantics will be unchanged.
+  */
+  void omega_reduce() const;
+
+  //! Returns the number of disjuncts.
+  size_type size() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if there are no disjuncts in
+    \p *this.
+  */
+  bool empty() const;
+
+  /*! \brief
+    Returns an iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end iterator.
+  */
+  iterator begin();
+
+  //! Returns the past-the-end iterator.
+  iterator end();
+
+  /*! \brief
+    Returns a const_iterator pointing to the first disjunct, if \p *this
+    is not empty; otherwise, returns the past-the-end const_iterator.
+  */
+  const_iterator begin() const;
+
+  //! Returns the past-the-end const_iterator.
+  const_iterator end() const;
+
+  /*! \brief
+    Returns a reverse_iterator pointing to the last disjunct, if \p *this
+    is not empty; otherwise, returns the before-the-start reverse_iterator.
+  */
+  reverse_iterator rbegin();
+
+  //! Returns the before-the-start reverse_iterator.
+  reverse_iterator rend();
+
+  /*! \brief
+    Returns a const_reverse_iterator pointing to the last disjunct,
+    if \p *this is not empty; otherwise, returns the before-the-start
+    const_reverse_iterator.
+  */
+  const_reverse_iterator rbegin() const;
+
+  //! Returns the before-the-start const_reverse_iterator.
+  const_reverse_iterator rend() const;
+
+  //! Adds to \p *this the disjunct \p d.
+  void add_disjunct(const D& d);
+
+  /*! \brief
+    Drops the disjunct in \p *this pointed to by \p position, returning
+    an iterator to the disjunct following \p position.
+  */
+  iterator drop_disjunct(iterator position);
+
+  //! Drops all the disjuncts from \p first to \p last (excluded).
+  void drop_disjuncts(iterator first, iterator last);
+
+  //! Drops all the disjuncts, making \p *this an empty powerset.
+  void clear();
+
+  //@} // Member Functions for the Direct Manipulation of Disjuncts
+
+  //! \name Member Functions that May Modify the Powerset Object
+  //@{
+
+  //! The assignment operator.
+  Powerset& operator=(const Powerset& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Powerset& y);
+
+  //! Assigns to \p *this the least upper bound of \p *this and \p y.
+  void least_upper_bound_assign(const Powerset& y);
+
+  //! Assigns to \p *this an upper bound of \p *this and \p y.
+  /*!
+    The result will be the least upper bound of \p *this and \p y.
+  */
+  void upper_bound_assign(const Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the least upper bound of \p *this and \p y
+    and returns \c true.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  bool upper_bound_assign_if_exact(const Powerset& y);
+
+  //! Assigns to \p *this the meet of \p *this and \p y.
+  void meet_assign(const Powerset& y);
+
+  /*! \brief
+    If \p *this is not empty (i.e., it is not the bottom element),
+    it is reduced to a singleton obtained by computing an upper-bound
+    of all the disjuncts.
+  */
+  void collapse();
+
+  //@} // Member Functions that May Modify the Powerset element
+
+protected:
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this does not contain
+    non-maximal elements.
+  */
+  bool is_omega_reduced() const;
+
+  /*! \brief Upon return, \p *this will contain at most \p
+    max_disjuncts elements; the set of disjuncts in positions greater
+    than or equal to \p max_disjuncts, will be replaced at that
+    position by their upper-bound.
+  */
+  void collapse(unsigned max_disjuncts);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d,
+    assuming \p d is not the bottom element and ensuring
+    partial Omega-reduction.
+
+    If \p d is not the bottom element and is not Omega-redundant with
+    respect to elements in positions between \p first and \p last, all
+    elements in these positions that would be made Omega-redundant by the
+    addition of \p d are dropped and \p d is added to the reduced
+    sequence.
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
+  */
+  iterator add_non_bottom_disjunct_preserve_reduction(const D& d,
+                                                      iterator first,
+                                                      iterator last);
+
+  /*! \brief
+    Adds to \p *this the disjunct \p d, assuming \p d is not the
+    bottom element and preserving Omega-reduction.
+
+    If \p *this is reduced before an invocation of this method,
+    it will be reduced upon successful return from the method.
+  */
+  void add_non_bottom_disjunct_preserve_reduction(const D& d);
+
+  /*! \brief
+    Assigns to \p *this the result of applying \p op_assign pairwise
+    to the elements in \p *this and \p y.
+
+    The elements of the powerset result are obtained by applying
+    \p op_assign to each pair of elements whose components are drawn
+    from \p *this and \p y, respectively.
+  */
+  template <typename Binary_Operator_Assign>
+  void pairwise_apply_assign(const Powerset& y,
+                             Binary_Operator_Assign op_assign);
+
+private:
+  /*! \brief
+    Does the hard work of checking whether \p *this contains non-maximal
+    elements and returns <CODE>true</CODE> if and only if it does not.
+  */
+  bool check_omega_reduced() const;
+
+  /*! \brief
+    Replaces the disjunct \p *sink by an upper bound of itself and
+    all the disjuncts following it.
+  */
+  void collapse(Sequence_iterator sink);
+};
+
+/* Automatically generated from PPL source file ../src/Powerset_inlines.hh line 1. */
+/* Powerset class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Powerset_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::begin() {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::end() {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::begin() const {
+  return sequence.begin();
+}
+
+template <typename D>
+inline typename Powerset<D>::const_iterator
+Powerset<D>::end() const {
+  return sequence.end();
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rbegin() {
+  return reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::reverse_iterator
+Powerset<D>::rend() {
+  return reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rbegin() const {
+  return const_reverse_iterator(end());
+}
+
+template <typename D>
+inline typename Powerset<D>::const_reverse_iterator
+Powerset<D>::rend() const {
+  return const_reverse_iterator(begin());
+}
+
+template <typename D>
+inline typename Powerset<D>::size_type
+Powerset<D>::size() const {
+  return sequence.size();
+}
+
+template <typename D>
+inline bool
+Powerset<D>::empty() const {
+  return sequence.empty();
+}
+
+template <typename D>
+inline typename Powerset<D>::iterator
+Powerset<D>::drop_disjunct(iterator position) {
+  return sequence.erase(position.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::drop_disjuncts(iterator first, iterator last) {
+  sequence.erase(first.base, last.base);
+}
+
+template <typename D>
+inline void
+Powerset<D>::clear() {
+  sequence.clear();
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const Powerset& y)
+  : sequence(y.sequence), reduced(y.reduced) {
+}
+
+template <typename D>
+inline Powerset<D>&
+Powerset<D>::operator=(const Powerset& y) {
+  sequence = y.sequence;
+  reduced = y.reduced;
+  return *this;
+}
+
+template <typename D>
+inline void
+Powerset<D>::m_swap(Powerset& y) {
+  using std::swap;
+  swap(sequence, y.sequence);
+  swap(reduced, y.reduced);
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset()
+  : sequence(), reduced(true) {
+}
+
+template <typename D>
+inline
+Powerset<D>::Powerset(const D& d)
+  : sequence(), reduced(false) {
+  sequence.push_back(d);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d) {
+  // !d.is_bottom() is asserted by the callee.
+  add_non_bottom_disjunct_preserve_reduction(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+  sequence.push_back(d);
+  reduced = false;
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline
+bool operator!=(const Powerset<D>& x, const Powerset<D>& y) {
+  return !(x == y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_top() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  const_iterator xi = begin();
+  const_iterator x_end = end();
+  return xi != x_end && xi->is_top() && ++xi == x_end;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::is_bottom() const {
+  // Must perform omega-reduction for correctness.
+  omega_reduce();
+  return empty();
+}
+
+template <typename D>
+inline void
+Powerset<D>::collapse() {
+  if (!empty())
+    collapse(sequence.begin());
+}
+
+template <typename D>
+inline void
+Powerset<D>::meet_assign(const Powerset& y) {
+  pairwise_apply_assign(y, std::mem_fun_ref(&D::meet_assign));
+}
+
+template <typename D>
+inline void
+Powerset<D>::upper_bound_assign(const Powerset& y) {
+  least_upper_bound_assign(y);
+}
+
+template <typename D>
+inline bool
+Powerset<D>::upper_bound_assign_if_exact(const Powerset& y) {
+  least_upper_bound_assign(y);
+  return true;
+}
+
+template <typename D>
+inline memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Powerset */
+template <typename D>
+inline void
+swap(Powerset<D>& x, Powerset<D>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Powerset_templates.hh line 1. */
+/* Powerset class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Powerset_templates.hh line 28. */
+#include <algorithm>
+/* Automatically generated from PPL source file ../src/Powerset_templates.hh line 30. */
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+  PPL_ASSERT(sink != sequence.end());
+  D& d = *sink;
+  iterator x_sink = sink;
+  iterator next_x_sink = x_sink;
+  ++next_x_sink;
+  iterator x_end = end();
+  for (const_iterator xi = next_x_sink; xi != x_end; ++xi)
+    d.upper_bound_assign(*xi);
+  // Drop the surplus disjuncts.
+  drop_disjuncts(next_x_sink, x_end);
+
+  // Ensure omega-reduction.
+  for (iterator xi = begin(); xi != x_sink; )
+    if (xi->definitely_entails(d))
+      xi = drop_disjunct(xi);
+    else
+      ++xi;
+
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::omega_reduce() const {
+  if (reduced)
+    return;
+
+  Powerset& x = const_cast<Powerset&>(*this);
+  // First remove all bottom elements.
+  for (iterator xi = x.begin(), x_end = x.end(); xi != x_end; )
+    if (xi->is_bottom())
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+  // Then remove non-maximal elements.
+  for (iterator xi = x.begin(); xi != x.end(); ) {
+    const D& xv = *xi;
+    bool dropping_xi = false;
+    for (iterator yi = x.begin(); yi != x.end(); )
+      if (xi == yi)
+        ++yi;
+      else {
+        const D& yv = *yi;
+        if (yv.definitely_entails(xv))
+          yi = x.drop_disjunct(yi);
+        else if (xv.definitely_entails(yv)) {
+          dropping_xi = true;
+          break;
+        }
+        else
+          ++yi;
+      }
+    if (dropping_xi)
+      xi = x.drop_disjunct(xi);
+    else
+      ++xi;
+    if (abandon_expensive_computations != 0 && xi != x.end()) {
+      // Hurry up!
+      x.collapse(xi.base);
+      break;
+    }
+  }
+  reduced = true;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+  PPL_ASSERT(max_disjuncts > 0);
+  // Omega-reduce before counting the number of disjuncts.
+  omega_reduce();
+  size_type n = size();
+  if (n > max_disjuncts) {
+    // Let `i' point to the last disjunct that will survive.
+    iterator i = begin();
+    std::advance(i, max_disjuncts-1);
+    // This disjunct will be assigned an upper-bound of itself and of
+    // all the disjuncts that follow.
+    collapse(i.base);
+  }
+  PPL_ASSERT_HEAVY(OK());
+  PPL_ASSERT(is_omega_reduced());
+}
+
+template <typename D>
+bool
+Powerset<D>::check_omega_reduced() const {
+  for (const_iterator x_begin = begin(), x_end = end(),
+         xi = x_begin; xi != x_end; ++xi) {
+    const D& xv = *xi;
+    if (xv.is_bottom())
+      return false;
+    for (const_iterator yi = x_begin; yi != x_end; ++yi) {
+      if (xi == yi)
+        continue;
+      const D& yv = *yi;
+      if (xv.definitely_entails(yv) || yv.definitely_entails(xv))
+        return false;
+    }
+  }
+  return true;
+}
+
+template <typename D>
+bool
+Powerset<D>::is_omega_reduced() const {
+  if (!reduced && check_omega_reduced())
+    reduced = true;
+  return reduced;
+}
+
+template <typename D>
+typename Powerset<D>::iterator
+Powerset<D>::add_non_bottom_disjunct_preserve_reduction(const D& d,
+                                                        iterator first,
+                                                        iterator last) {
+  PPL_ASSERT_HEAVY(!d.is_bottom());
+  for (iterator xi = first; xi != last; ) {
+    const D& xv = *xi;
+    if (d.definitely_entails(xv))
+      return first;
+    else if (xv.definitely_entails(d)) {
+      if (xi == first)
+        ++first;
+      xi = drop_disjunct(xi);
+    }
+    else
+      ++xi;
+  }
+  sequence.push_back(d);
+  PPL_ASSERT_HEAVY(OK());
+  return first;
+}
+
+template <typename D>
+bool
+Powerset<D>::definitely_entails(const Powerset& y) const {
+  const Powerset<D>& x = *this;
+  bool found = true;
+  for (const_iterator xi = x.begin(),
+         x_end = x.end(); found && xi != x_end; ++xi) {
+    found = false;
+    for (const_iterator yi = y.begin(),
+           y_end = y.end(); !found && yi != y_end; ++yi)
+      found = (*xi).definitely_entails(*yi);
+  }
+  return found;
+}
+
+/*! \relates Powerset */
+template <typename D>
+bool
+operator==(const Powerset<D>& x, const Powerset<D>& y) {
+  x.omega_reduce();
+  y.omega_reduce();
+  if (x.size() != y.size())
+    return false;
+  // Take a copy of `y' and work with it.
+  Powerset<D> z = y;
+  for (typename Powerset<D>::const_iterator xi = x.begin(),
+         x_end = x.end(); xi != x_end; ++xi) {
+    typename Powerset<D>::iterator zi = z.begin();
+    typename Powerset<D>::iterator z_end = z.end();
+    zi = std::find(zi, z_end, *xi);
+    if (zi == z_end)
+      return false;
+    else
+      z.drop_disjunct(zi);
+  }
+  return true;
+}
+
+template <typename D>
+template <typename Binary_Operator_Assign>
+void
+Powerset<D>::pairwise_apply_assign(const Powerset& y,
+                                   Binary_Operator_Assign op_assign) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  Sequence new_sequence;
+  for (const_iterator xi = begin(), x_end = end(),
+         y_begin = y.begin(), y_end = y.end(); xi != x_end; ++xi)
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      D zi = *xi;
+      op_assign(zi, *yi);
+      if (!zi.is_bottom())
+        new_sequence.push_back(zi);
+    }
+  // Put the new sequence in place.
+  using std::swap;
+  swap(sequence, new_sequence);
+  reduced = false;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::least_upper_bound_assign(const Powerset& y) {
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  omega_reduce();
+  y.omega_reduce();
+  iterator old_begin = begin();
+  iterator old_end = end();
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    old_begin = add_non_bottom_disjunct_preserve_reduction(*i,
+                                                           old_begin,
+                                                           old_end);
+  PPL_ASSERT_HEAVY(OK());
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+std::ostream&
+operator<<(std::ostream& s, const Powerset<D>& x) {
+  if (x.is_bottom())
+    s << "false";
+  else if (x.is_top())
+    s << "true";
+  else
+    for (typename Powerset<D>::const_iterator i = x.begin(),
+           x_end = x.end(); i != x_end; ) {
+      s << "{ " << *i << " }";
+      ++i;
+      if (i != x_end)
+        s << ", ";
+    }
+  return s;
+}
+
+} // namespace IO_Operators
+
+template <typename D>
+memory_size_type
+Powerset<D>::external_memory_in_bytes() const {
+  memory_size_type bytes = 0;
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    bytes += xi->total_memory_in_bytes();
+    // We assume there is at least a forward and a backward link, and
+    // that the pointers implementing them are at least the size of
+    // pointers to `D'.
+    bytes += 2*sizeof(D*);
+  }
+  return bytes;
+}
+
+template <typename D>
+bool
+Powerset<D>::OK(const bool disallow_bottom) const {
+  for (const_iterator xi = begin(), x_end = end(); xi != x_end; ++xi) {
+    if (!xi->OK())
+      return false;
+    if (disallow_bottom && xi->is_bottom()) {
+#ifndef NDEBUG
+      std::cerr << "Bottom element in powerset!"
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+  if (reduced && !check_omega_reduced()) {
+#ifndef NDEBUG
+    std::cerr << "Powerset claims to be reduced, but it is not!"
+              << std::endl;
+#endif
+    return false;
+  }
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Powerset_defs.hh line 449. */
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_defs.hh line 44. */
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL pointset domains.
+/*! \ingroup PPL_CXX_interface
+  \warning
+  At present, the supported instantiations for the
+  disjunct domain template \p PSET are the simple pointset domains:
+  <CODE>C_Polyhedron</CODE>,
+  <CODE>NNC_Polyhedron</CODE>,
+  <CODE>Grid</CODE>,
+  <CODE>Octagonal_Shape\<T\></CODE>,
+  <CODE>BD_Shape\<T\></CODE>,
+  <CODE>Box\<T\></CODE>.
+*/
+template <typename PSET>
+class Parma_Polyhedra_Library::Pointset_Powerset
+  : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PSET> > {
+public:
+  typedef PSET element_type;
+
+private:
+  typedef Determinate<PSET> Det_PSET;
+  typedef Powerset<Det_PSET> Base;
+
+public:
+  //! Returns the maximum space dimension a Pointset_Powerset<PSET> can handle.
+  static dimension_type max_space_dimension();
+
+  //! \name Constructors
+  //@{
+
+  //! Builds a universe (top) or empty (bottom) Pointset_Powerset.
+  /*!
+    \param num_dimensions
+    The number of dimensions of the vector space enclosing the powerset;
+
+    \param kind
+    Specifies whether the universe or the empty powerset has to be built.
+  */
+  explicit
+  Pointset_Powerset(dimension_type num_dimensions = 0,
+                    Degenerate_Element kind = UNIVERSE);
+
+  //! Ordinary copy constructor.
+  /*!
+    The complexity argument is ignored.
+  */
+  Pointset_Powerset(const Pointset_Powerset& y,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Conversion constructor: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PSET</CODE>.
+
+    \param y
+    The powerset to be used to build the new powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+  */
+  template <typename QH>
+  explicit Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Creates a Pointset_Powerset from a product
+    This will be created as a single disjunct of type PSET that
+    approximates the product.
+  */
+  template <typename QH1, typename QH2, typename R>
+  explicit
+  Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                    Complexity_Class complexity = ANY_COMPLEXITY);
+
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of constraints \p cs.
+  */
+  explicit Pointset_Powerset(const Constraint_System& cs);
+
+  /*! \brief
+    Creates a Pointset_Powerset with a single disjunct approximating
+    the system of congruences \p cgs.
+  */
+  explicit Pointset_Powerset(const Congruence_System& cgs);
+
+
+  //! Builds a pointset_powerset out of a closed polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
+
+    \param ph
+    The closed polyhedron to be used to build the powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const C_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of an nnc polyhedron.
+  /*!
+    Builds a powerset that is either empty (if the polyhedron is found
+    to be empty) or contains a single disjunct approximating the
+    polyhedron; this must only use algorithms that do not exceed the
+    specified complexity.  The powerset inherits the space dimension
+    of the polyhedron.
+
+    \param ph
+    The closed polyhedron to be used to build the powerset.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p ph exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const NNC_Polyhedron& ph,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+
+  //! Builds a pointset_powerset out of a grid.
+  /*!
+    If the grid is nonempty, builds a powerset containing a single
+    disjunct approximating the grid. Builds the empty powerset
+    otherwise. The powerset inherits the space dimension of the grid.
+
+    \param gr
+    The grid to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p gr exceeds the maximum
+    allowed space dimension.
+  */
+  explicit Pointset_Powerset(const Grid& gr,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of an octagonal shape.
+  /*!
+    If the octagonal shape is nonempty, builds a powerset
+    containing a single disjunct approximating the octagonal
+    shape. Builds the empty powerset otherwise. The powerset
+    inherits the space dimension of the octagonal shape.
+
+    \param os
+    The octagonal shape to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p os exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const Octagonal_Shape<T>& os,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of a bd shape.
+  /*!
+    If the bd shape is nonempty, builds a powerset containing a
+    single disjunct approximating the bd shape. Builds the empty
+    powerset otherwise.  The powerset inherits the space dimension
+    of the bd shape.
+
+    \param bds
+    The bd shape to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p bds exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename T>
+  explicit Pointset_Powerset(const BD_Shape<T>& bds,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //! Builds a pointset_powerset out of a box.
+  /*!
+    If the box is nonempty, builds a powerset containing a single
+    disjunct approximating the box. Builds the empty powerset
+    otherwise.  The powerset inherits the space dimension of the box.
+
+    \param box
+    The box to be used to build the powerset.
+
+    \param complexity
+    This argument is ignored.
+
+    \exception std::length_error
+    Thrown if the space dimension of \p box exceeds the maximum
+    allowed space dimension.
+  */
+  template <typename Interval>
+  explicit Pointset_Powerset(const Box<Interval>& box,
+                             Complexity_Class complexity = ANY_COMPLEXITY);
+
+  //@} // Constructors and Destructor
+
+  //! \name Member Functions that Do Not Modify the Pointset_Powerset
+  //@{
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type space_dimension() const;
+
+  //! Returns the dimension of the vector space enclosing \p *this.
+  dimension_type affine_dimension() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is
+    an empty powerset.
+  */
+  bool is_empty() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    is the top element of the powerset lattice.
+  */
+  bool is_universe() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all the disjuncts
+    in \p *this are topologically closed.
+  */
+  bool is_topologically_closed() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if all elements in \p *this
+    are bounded.
+  */
+  bool is_bounded() const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this and \p y are disjoint.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p x and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool is_disjoint_from(const Pointset_Powerset& y) const;
+
+  //! Returns <CODE>true</CODE> if and only if \p *this is discrete.
+  bool is_discrete() const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p var is constrained in
+    \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+
+    \note
+    A variable is constrained if there exists a non-redundant disjunct
+    that is constraining the variable: this definition relies on the
+    powerset lattice structure and may be somewhat different from the
+    geometric intuition.
+    For instance, variable \f$x\f$ is constrained in the powerset
+    \f[
+      \mathit{ps} = \bigl\{ \{ x \geq 0 \}, \{ x \leq 0 \} \bigr\},
+    \f]
+    even though \f$\mathit{ps}\f$ is geometrically equal to the
+    whole vector space.
+  */
+  bool constrains(Variable var) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from above in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_above(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p expr is
+    bounded from below in \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+  */
+  bool bounds_from_below(const Linear_Expression& expr) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value is computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d
+    and \p maximum are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from above in \p *this, in which case
+    the supremum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be maximized subject to \p *this;
+
+    \param sup_n
+    The numerator of the supremum value;
+
+    \param sup_d
+    The denominator of the supremum value;
+
+    \param maximum
+    <CODE>true</CODE> if and only if the supremum is also the maximum value;
+
+    \param g
+    When maximization succeeds, will be assigned the point or
+    closure point where \p expr reaches its supremum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from above,
+    <CODE>false</CODE> is returned and \p sup_n, \p sup_d, \p maximum
+    and \p g are left untouched.
+  */
+  bool maximize(const Linear_Expression& expr,
+                Coefficient& sup_n, Coefficient& sup_d, bool& maximum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value is computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d
+    and \p minimum are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum) const;
+
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is not empty
+    and \p expr is bounded from below in \p *this, in which case
+    the infimum value and a point where \p expr reaches it are computed.
+
+    \param expr
+    The linear expression to be minimized subject to \p *this;
+
+    \param inf_n
+    The numerator of the infimum value;
+
+    \param inf_d
+    The denominator of the infimum value;
+
+    \param minimum
+    <CODE>true</CODE> if and only if the infimum is also the minimum value;
+
+    \param g
+    When minimization succeeds, will be assigned a point or
+    closure point where \p expr reaches its infimum value.
+
+    \exception std::invalid_argument
+    Thrown if \p expr and \p *this are dimension-incompatible.
+
+    If \p *this is empty or \p expr is not bounded from below,
+    <CODE>false</CODE> is returned and \p inf_n, \p inf_d, \p minimum
+    and \p g are left untouched.
+  */
+  bool minimize(const Linear_Expression& expr,
+                Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+                Generator& g) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this geometrically
+    covers \p y, i.e., if any point (in some element) of \p y is also
+    a point (of some element) of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_covers(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this is geometrically
+    equal to \p y, i.e., if (the elements of) \p *this and \p y
+    contain the same set of points.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    This may be <EM>really</EM> expensive!
+  */
+  bool geometrically_equals(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool contains(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if each disjunct
+      of \p y is strictly contained in a disjunct of \p *this.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool strictly_contains(const Pointset_Powerset& y) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if \p *this
+    contains at least one integer point.
+  */
+  bool contains_integer_point() const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the constraint \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Constraint& c) const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the generator \p g.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and generator \p g are dimension-incompatible.
+  */
+  Poly_Gen_Relation relation_with(const Generator& g) const;
+
+  /*! \brief
+    Returns the relations holding between the powerset \p *this
+    and the congruence \p c.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p c are dimension-incompatible.
+  */
+  Poly_Con_Relation relation_with(const Congruence& cg) const;
+
+  /*! \brief
+    Returns a lower bound to the total size in bytes of the memory
+    occupied by \p *this.
+  */
+  memory_size_type total_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a lower bound to the size in bytes of the memory
+    managed by \p *this.
+  */
+  memory_size_type external_memory_in_bytes() const;
+
+  /*! \brief
+    Returns a 32-bit hash code for \p *this.
+
+    If \p x and \p y are such that <CODE>x == y</CODE>,
+    then <CODE>x.hash_code() == y.hash_code()</CODE>.
+  */
+  int32_t hash_code() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+  //@} // Member Functions that Do Not Modify the Pointset_Powerset
+
+  //! \name Space Dimension Preserving Member Functions that May Modify the Pointset_Powerset
+  //@{
+
+  //! Adds to \p *this the disjunct \p ph.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and \p ph are dimension-incompatible.
+  */
+  void add_disjunct(const PSET& ph);
+
+  //! Intersects \p *this with constraint \p c.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and constraint \p c are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_constraint(const Constraint& c);
+
+  /*! \brief
+    Use the constraint \p c to refine \p *this.
+
+    \param c
+    The constraint to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p c are dimension-incompatible.
+  */
+  void refine_with_constraint(const Constraint& c);
+
+  //! Intersects \p *this with the constraints in \p cs.
+  /*!
+    \param cs
+    The constraints to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_constraints(const Constraint_System& cs);
+
+  /*! \brief
+    Use the constraints in \p cs to refine \p *this.
+
+    \param  cs
+     The constraints to be used for refinement.
+
+     \exception std::invalid_argument
+     Thrown if \p *this and \p cs are dimension-incompatible.
+  */
+  void refine_with_constraints(const Constraint_System& cs);
+
+  //! Intersects \p *this with congruence \p cg.
+  /*!
+    \exception std::invalid_argument
+    Thrown if \p *this and congruence \p cg are topology-incompatible
+    or dimension-incompatible.
+  */
+  void add_congruence(const Congruence& cg);
+
+  /*! \brief
+    Use the congruence \p cg to refine \p *this.
+
+    \param cg
+    The congruence to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cg are dimension-incompatible.
+  */
+  void refine_with_congruence(const Congruence& cg);
+
+  //! Intersects \p *this with the congruences in \p cgs.
+  /*!
+    \param cgs
+    The congruences to intersect with.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are topology-incompatible or
+    dimension-incompatible.
+  */
+  void add_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Use the congruences in \p cgs to refine \p *this.
+
+    \param  cgs
+    The congruences to be used for refinement.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p cgs are dimension-incompatible.
+  */
+  void refine_with_congruences(const Congruence_System& cgs);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to space dimension \p var, assigning the result to \p *this.
+
+    \param var
+    The space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p var is not a space dimension of \p *this.
+  */
+  void unconstrain(Variable var);
+
+  /*! \brief
+    Computes the \ref Cylindrification "cylindrification" of \p *this with
+    respect to the set of space dimensions \p vars,
+    assigning the result to \p *this.
+
+    \param vars
+    The set of space dimension that will be unconstrained.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void unconstrain(const Variables_Set& vars);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  /*! \brief
+    Possibly tightens \p *this by dropping some points with non-integer
+    coordinates for the space dimensions corresponding to \p vars.
+
+    \param vars
+    Points with non-integer coordinates for these variables/space-dimensions
+    can be discarded.
+
+    \param complexity
+    The maximal complexity of any algorithms used.
+
+    \note
+    Currently there is no optimality guarantee, not even if
+    \p complexity is <CODE>ANY_COMPLEXITY</CODE>.
+  */
+  void drop_some_non_integer_points(const Variables_Set& vars,
+                                    Complexity_Class complexity
+                                    = ANY_COMPLEXITY);
+
+  //! Assigns to \p *this its topological closure.
+  void topological_closure_assign();
+
+  //! Assigns to \p *this the intersection of \p *this and \p y.
+  /*!
+    The result is obtained by intersecting each disjunct in \p *this
+    with each disjunct in \p y and collecting all these intersections.
+  */
+  void intersection_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this an (a smallest)
+    over-approximation as a powerset of the disjunct domain of the
+    set-theoretical difference of \p *this and \p y.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+  */
+  void difference_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this a \ref Powerset_Meet_Preserving_Simplification
+    "meet-preserving simplification" of \p *this with respect to \p y.
+    If \c false is returned, then the intersection is empty.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are topology-incompatible or
+    dimension-incompatible.
+  */
+  bool simplify_using_context_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine image"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_image(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the
+    \ref Single_Update_Affine_Functions "affine preimage"
+    of \p *this under the function mapping variable \p var to the
+    affine expression specified by \p expr and \p denominator.
+
+    \param var
+    The variable to which the affine expression is assigned;
+
+    \param expr
+    The numerator of the affine expression;
+
+    \param denominator
+    The denominator of the affine expression (optional argument with
+    default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of
+    \p *this.
+  */
+  void affine_preimage(Variable var,
+                    const Linear_Expression& expr,
+                    Coefficient_traits::const_reference denominator
+                      = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(Variable var,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& expr,
+                                Coefficient_traits::const_reference denominator
+                                  = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{var}' \relsym \frac{\mathrm{expr}}{\mathrm{denominator}}\f$,
+    where \f$\mathord{\relsym}\f$ is the relation symbol encoded
+    by \p relsym.
+
+    \param var
+    The left hand side variable of the generalized affine relation;
+
+    \param relsym
+    The relation symbol;
+
+    \param expr
+    The numerator of the right hand side affine expression;
+
+    \param denominator
+    The denominator of the right hand side affine expression (optional
+    argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p expr and \p *this are
+    dimension-incompatible or if \p var is not a space dimension of \p *this
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void
+  generalized_affine_preimage(Variable var,
+                              Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference denominator
+                              = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_image(const Linear_Expression& lhs,
+                                Relation_Symbol relsym,
+                                const Linear_Expression& rhs);
+
+  /*! \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Generalized_Affine_Relations "generalized affine relation"
+    \f$\mathrm{lhs}' \relsym \mathrm{rhs}\f$, where
+    \f$\mathord{\relsym}\f$ is the relation symbol encoded by \p relsym.
+
+    \param lhs
+    The left hand side affine expression;
+
+    \param relsym
+    The relation symbol;
+
+    \param rhs
+    The right hand side affine expression.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p lhs or \p rhs
+    or if \p *this is a C_Polyhedron and \p relsym is a strict
+    relation symbol.
+  */
+  void generalized_affine_preimage(const Linear_Expression& lhs,
+                                   Relation_Symbol relsym,
+                                   const Linear_Expression& rhs);
+
+  /*!
+    \brief
+    Assigns to \p *this the image of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_image(Variable var,
+                            const Linear_Expression& lb_expr,
+                            const Linear_Expression& ub_expr,
+                            Coefficient_traits::const_reference denominator
+                            = Coefficient_one());
+
+  /*!
+    \brief
+    Assigns to \p *this the preimage of \p *this with respect to the
+    \ref Single_Update_Bounded_Affine_Relations "bounded affine relation"
+    \f$\frac{\mathrm{lb\_expr}}{\mathrm{denominator}}
+         \leq \mathrm{var}'
+           \leq \frac{\mathrm{ub\_expr}}{\mathrm{denominator}}\f$.
+
+    \param var
+    The variable updated by the affine relation;
+
+    \param lb_expr
+    The numerator of the lower bounding affine expression;
+
+    \param ub_expr
+    The numerator of the upper bounding affine expression;
+
+    \param denominator
+    The (common) denominator for the lower and upper bounding
+    affine expressions (optional argument with default value 1).
+
+    \exception std::invalid_argument
+    Thrown if \p denominator is zero or if \p lb_expr (resp., \p ub_expr)
+    and \p *this are dimension-incompatible or if \p var is not a space
+    dimension of \p *this.
+  */
+  void bounded_affine_preimage(Variable var,
+                               const Linear_Expression& lb_expr,
+                               const Linear_Expression& ub_expr,
+                               Coefficient_traits::const_reference denominator
+                               = Coefficient_one());
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref Time_Elapse_Operator "time-elapse" between \p *this and \p y.
+
+    The result is obtained by computing the pairwise
+    \ref Time_Elapse_Operator "time elapse" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void time_elapse_assign(const Pointset_Powerset& y);
+
+  /*! \brief
+    \ref Wrapping_Operator "Wraps" the specified dimensions of the
+    vector space.
+
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be wrapped.
+
+    \param w
+    The width of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param r
+    The representation of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param o
+    The overflow behavior of the bounded integer type corresponding to
+    all the dimensions to be wrapped.
+
+    \param cs_p
+    Possibly null pointer to a constraint system whose variables
+    are contained in \p vars.  If <CODE>*cs_p</CODE> depends on
+    variables not in \p vars, the behavior is undefined.
+    When non-null, the pointed-to constraint system is assumed to
+    represent the conditional or looping construct guard with respect
+    to which wrapping is performed.  Since wrapping requires the
+    computation of upper bounds and due to non-distributivity of
+    constraint refinement over upper bounds, passing a constraint
+    system in this way can be more precise than refining the result of
+    the wrapping operation with the constraints in <CODE>*cs_p</CODE>.
+
+    \param complexity_threshold
+    A precision parameter of the \ref Wrapping_Operator "wrapping operator":
+    higher values result in possibly improved precision.
+
+    \param wrap_individually
+    <CODE>true</CODE> if the dimensions should be wrapped individually
+    (something that results in much greater efficiency to the detriment of
+    precision).
+
+    \exception std::invalid_argument
+    Thrown if <CODE>*cs_p</CODE> is dimension-incompatible with
+    \p vars, or if \p *this is dimension-incompatible \p vars or with
+    <CODE>*cs_p</CODE>.
+  */
+  void wrap_assign(const Variables_Set& vars,
+                   Bounded_Integer_Type_Width w,
+                   Bounded_Integer_Type_Representation r,
+                   Bounded_Integer_Type_Overflow o,
+                   const Constraint_System* cs_p = 0,
+                   unsigned complexity_threshold = 16,
+                   bool wrap_individually = true);
+
+  /*! \brief
+    Assign to \p *this the result of (recursively) merging together
+    the pairs of disjuncts whose upper-bound is the same as their
+    set-theoretical union.
+
+    On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different disjuncts
+    in \p *this, we have \f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+  */
+  void pairwise_reduce();
+
+  /*! \brief
+    Assigns to \p *this the result of applying the
+    \ref pps_bgp99_extrapolation "BGP99 extrapolation operator"
+    to \p *this and \p y, using the widening function \p widen_fun
+    and the cardinality threshold \p max_disjuncts.
+
+    \param y
+    A powerset that <EM>must</EM> definitely entail \p *this;
+
+    \param widen_fun
+    The widening function to be used on polyhedra objects. It is obtained
+    from the corresponding widening method by using the helper function
+    Parma_Polyhedra_Library::widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>;
+
+    \param max_disjuncts
+    The maximum number of disjuncts occurring in the powerset \p *this
+    <EM>before</EM> starting the computation. If this number is exceeded,
+    some of the disjuncts in \p *this are collapsed (i.e., joined together).
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    For a description of the extrapolation operator,
+    see \ref BGP99 "[BGP99]" and \ref BHZ03b "[BHZ03b]".
+  */
+  template <typename Widening>
+  void BGP99_extrapolation_assign(const Pointset_Powerset& y,
+                                  Widening widen_fun,
+                                  unsigned max_disjuncts);
+
+  /*! \brief
+    Assigns to \p *this the result of computing the
+    \ref pps_certificate_widening "BHZ03-widening"
+    between \p *this and \p y, using the widening function \p widen_fun
+    certified by the convergence certificate \p Cert.
+
+    \param y
+    The finite powerset computed in the previous iteration step.
+    It <EM>must</EM> definitely entail \p *this;
+
+    \param widen_fun
+    The widening function to be used on disjuncts.
+    It is obtained from the corresponding widening method by using
+    the helper function widen_fun_ref. Legal values are, e.g.,
+    <CODE>widen_fun_ref(&Polyhedron::H79_widening_assign)</CODE> and
+    <CODE>widen_fun_ref(&Polyhedron::limited_H79_extrapolation_assign, cs)</CODE>.
+
+    \exception std::invalid_argument
+    Thrown if \p *this and \p y are dimension-incompatible.
+
+    \warning
+    In order to obtain a proper widening operator, the template parameter
+    \p Cert should be a finite convergence certificate for the base-level
+    widening function \p widen_fun; otherwise, an extrapolation operator is
+    obtained.
+    For a description of the methods that should be provided
+    by \p Cert, see BHRZ03_Certificate or H79_Certificate.
+  */
+  template <typename Cert, typename Widening>
+  void BHZ03_widening_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+  //@} // Space Dimension Preserving Member Functions that May Modify [...]
+
+  //! \name Member Functions that May Modify the Dimension of the Vector Space
+  //@{
+
+  /*! \brief
+    The assignment operator
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  Pointset_Powerset& operator=(const Pointset_Powerset& y);
+
+  /*! \brief
+    Conversion assignment: the type <CODE>QH</CODE> of the disjuncts
+    in the source powerset is different from <CODE>PSET</CODE>
+    (\p *this and \p y can be dimension-incompatible).
+  */
+  template <typename QH>
+  Pointset_Powerset& operator=(const Pointset_Powerset<QH>& y);
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Pointset_Powerset& y);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    and embeds each disjunct in \p *this in the new space.
+  */
+  void add_space_dimensions_and_embed(dimension_type m);
+
+  /*! \brief
+    Adds \p m new dimensions to the vector space containing \p *this
+    without embedding the disjuncts in \p *this in the new space.
+  */
+  void add_space_dimensions_and_project(dimension_type m);
+
+  //! Assigns to \p *this the concatenation of \p *this and \p y.
+  /*!
+    The result is obtained by computing the pairwise
+    \ref Concatenating_Polyhedra "concatenation" of each disjunct
+    in \p *this with each disjunct in \p y.
+  */
+  void concatenate_assign(const Pointset_Powerset& y);
+
+  //! Removes all the specified space dimensions.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be removed.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with one of the
+    Variable objects contained in \p vars.
+  */
+  void remove_space_dimensions(const Variables_Set& vars);
+
+  /*! \brief
+    Removes the higher space dimensions so that the resulting space
+    will have dimension \p new_dimension.
+
+    \exception std::invalid_argument
+    Thrown if \p new_dimensions is greater than the space dimension
+    of \p *this.
+  */
+  void remove_higher_space_dimensions(dimension_type new_dimension);
+
+  /*! \brief
+    Remaps the dimensions of the vector space according to
+    a partial function.
+
+    See also Polyhedron::map_space_dimensions.
+  */
+  template <typename Partial_Function>
+  void map_space_dimensions(const Partial_Function& pfunc);
+
+  //! Creates \p m copies of the space dimension corresponding to \p var.
+  /*!
+    \param var
+    The variable corresponding to the space dimension to be replicated;
+
+    \param m
+    The number of replicas to be created.
+
+    \exception std::invalid_argument
+    Thrown if \p var does not correspond to a dimension of the vector
+    space.
+
+    \exception std::length_error
+    Thrown if adding \p m new space dimensions would cause the vector
+    space to exceed dimension <CODE>max_space_dimension()</CODE>.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    and <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+    then the \f$k\f$-th space dimension is
+    \ref Expanding_One_Dimension_of_the_Vector_Space_to_Multiple_Dimensions
+    "expanded" to \p m new space dimensions
+    \f$n\f$, \f$n+1\f$, \f$\dots\f$, \f$n+m-1\f$.
+  */
+  void expand_space_dimension(Variable var, dimension_type m);
+
+  //! Folds the space dimensions in \p vars into \p dest.
+  /*!
+    \param vars
+    The set of Variable objects corresponding to the space dimensions
+    to be folded;
+
+    \param dest
+    The variable corresponding to the space dimension that is the
+    destination of the folding operation.
+
+    \exception std::invalid_argument
+    Thrown if \p *this is dimension-incompatible with \p dest or with
+    one of the Variable objects contained in \p vars.  Also
+    thrown if \p dest is contained in \p vars.
+
+    If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+    <CODE>dest</CODE> has space dimension \f$k \leq n\f$,
+    \p vars is a set of variables whose maximum space dimension
+    is also less than or equal to \f$n\f$, and \p dest is not a member
+    of \p vars, then the space dimensions corresponding to
+    variables in \p vars are
+    \ref Folding_Multiple_Dimensions_of_the_Vector_Space_into_One_Dimension
+    "folded" into the \f$k\f$-th space dimension.
+  */
+  void fold_space_dimensions(const Variables_Set& vars, Variable dest);
+
+  //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+public:
+  typedef typename Base::size_type size_type;
+  typedef typename Base::value_type value_type;
+  typedef typename Base::iterator iterator;
+  typedef typename Base::const_iterator const_iterator;
+  typedef typename Base::reverse_iterator reverse_iterator;
+  typedef typename Base::const_reverse_iterator const_reverse_iterator;
+
+  PPL_OUTPUT_DECLARATIONS
+
+  /*! \brief
+    Loads from \p s an ASCII representation (as produced by
+    ascii_dump(std::ostream&) const) and sets \p *this accordingly.
+    Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+  */
+  bool ascii_load(std::istream& s);
+
+private:
+  typedef typename Base::Sequence Sequence;
+  typedef typename Base::Sequence_iterator Sequence_iterator;
+  typedef typename Base::Sequence_const_iterator Sequence_const_iterator;
+
+  //! The number of dimensions of the enclosing vector space.
+  dimension_type space_dim;
+
+  /*! \brief
+    Assigns to \p dest a \ref Powerset_Meet_Preserving_Simplification
+    "powerset meet-preserving enlargement" of itself with respect to
+    \p *this.  If \c false is returned, then the intersection is empty.
+
+    \note
+    It is assumed that \p *this and \p dest are topology-compatible
+    and dimension-compatible.
+  */
+  bool intersection_preserving_enlarge_element(PSET& dest) const;
+
+  /*! \brief
+    Assigns to \p *this the result of applying the BGP99 heuristics
+    to \p *this and \p y, using the widening function \p widen_fun.
+  */
+  template <typename Widening>
+  void BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun);
+
+  //! Records in \p cert_ms the certificates for this set of disjuncts.
+  template <typename Cert>
+  void collect_certificates(std::map<Cert, size_type,
+                                     typename Cert::Compare>& cert_ms) const;
+
+  /*! \brief
+    Returns <CODE>true</CODE> if and only if the current set of disjuncts
+    is stabilizing with respect to the multiset of certificates \p y_cert_ms.
+  */
+  template <typename Cert>
+  bool is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                                                   typename Cert::Compare>&
+                                    y_cert_ms) const;
+
+  // FIXME: here it should be enough to befriend the template constructor
+  // template <typename QH>
+  // Pointset_Powerset(const Pointset_Powerset<QH>&),
+  // but, apparently, this cannot be done.
+  friend class Pointset_Powerset<NNC_Polyhedron>;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+void swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y);
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Pointset_Powerset
+  Let \p p and \p q be two polyhedra.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PSET, Pointset_Powerset\<NNC_Polyhedron\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p;
+  - the set-theoretical union of <CODE>r.first</CODE> with all the
+    elements of <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+
+  \if Include_Implementation_Details
+
+  See
+  <A HREF="http://bugseng.com/products/ppl/Documentation/bibliography#Srivastava93">
+  this paper</A> for more information about the implementation.
+  \endif
+*/
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the NNC polyhedra in \p ps contains the NNC polyhedron \p ph.
+
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+                  const Pointset_Powerset<NNC_Polyhedron>& ps);
+
+
+/*! \brief
+  Partitions the grid \p q with respect to grid \p p if and only if
+  such a partition is finite.
+
+  \relates Parma_Polyhedra_Library::Pointset_Powerset
+  Let \p p and \p q be two grids.
+  The function returns an object <CODE>r</CODE> of type
+  <CODE>std::pair\<PSET, Pointset_Powerset\<Grid\> \></CODE>
+  such that
+  - <CODE>r.first</CODE> is the intersection of \p p and \p q;
+  - If there is a finite partition of \p q with respect to \p p
+    the Boolean <CODE>finite_partition</CODE> is set to true and
+    <CODE>r.second</CODE> has the property that all its elements are
+    pairwise disjoint and disjoint from \p p and the set-theoretical
+    union of <CODE>r.first</CODE> with all the elements of
+    <CODE>r.second</CODE> gives \p q (i.e., <CODE>r</CODE>
+    is the representation of a partition of \p q).
+  - Otherwise the Boolean <CODE>finite_partition</CODE> is set to false
+    and the singleton set that contains \p q is stored in
+    <CODE>r.second</CODE>r.
+*/
+std::pair<Grid, Pointset_Powerset<Grid> >
+approximate_partition(const Grid& p, const Grid& q, bool& finite_partition);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the grids \p ps contains the grid \p g.
+
+  \relates Pointset_Powerset
+*/
+bool
+check_containment(const Grid& ph,
+                  const Pointset_Powerset<Grid>& ps);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if the union of
+  the objects in \p ps contains \p ph.
+
+  \relates Pointset_Powerset
+  \note
+  It is assumed that the template parameter PSET can be converted
+  without precision loss into an NNC_Polyhedron; otherwise,
+  an incorrect result might be obtained.
+*/
+template <typename PSET>
+bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps);
+
+// CHECKME: according to the Intel compiler, the declaration of the
+// following specialization (of the class template parameter) should come
+// before the declaration of the corresponding full specialization
+// (where the member template parameter is specialized too).
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<C_Polyhedron>& y,
+                    Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<Grid>& y,
+                    Complexity_Class);
+
+template <>
+template <>
+Pointset_Powerset<C_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<NNC_Polyhedron>& y,
+                    Complexity_Class);
+
+template <>
+void
+Pointset_Powerset<NNC_Polyhedron>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+void
+Pointset_Powerset<Grid>
+::difference_assign(const Pointset_Powerset& y);
+
+template <>
+bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+template <>
+bool
+Pointset_Powerset<Grid>
+::geometrically_covers(const Pointset_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_inlines.hh line 1. */
+/* Pointset_Powerset class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_inlines.hh line 35. */
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::space_dimension() const {
+  return space_dim;
+}
+
+template <typename PSET>
+inline dimension_type
+Pointset_Powerset<PSET>::max_space_dimension() {
+  return PSET::max_space_dimension();
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(dimension_type num_dimensions,
+                                           Degenerate_Element kind)
+  : Base(), space_dim(num_dimensions) {
+  Pointset_Powerset& x = *this;
+  if (kind == UNIVERSE)
+    x.sequence.push_back(Determinate<PSET>(PSET(num_dimensions, kind)));
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Pointset_Powerset& y,
+                                           Complexity_Class)
+  : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const C_Polyhedron& ph,
+                                           Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const NNC_Polyhedron& ph,
+                                           Complexity_Class complexity)
+  : Base(), space_dim(ph.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (ph.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PSET>(PSET(ph, complexity)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Grid& gr,
+                                           Complexity_Class)
+  : Base(), space_dim(gr.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!gr.is_empty()) {
+    x.sequence.push_back(Determinate<PSET>(PSET(gr)));
+  }
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename QH1, typename QH2, typename R>
+inline
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Partially_Reduced_Product<QH1, QH2, R>& prp,
+                    Complexity_Class complexity)
+  : Base(), space_dim(prp.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (complexity == ANY_COMPLEXITY) {
+    if (prp.is_empty())
+      return;
+  }
+  else
+    x.reduced = false;
+  x.sequence.push_back(Determinate<PSET>(PSET(prp, complexity)));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename Interval>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Box<Interval>& box,
+                                           Complexity_Class)
+  : Base(), space_dim(box.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!box.is_empty())
+    x.sequence.push_back(Determinate<PSET>(PSET(box)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const Octagonal_Shape<T>& os,
+                                           Complexity_Class)
+  : Base(), space_dim(os.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!os.is_empty())
+    x.sequence.push_back(Determinate<PSET>(PSET(os)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+template <typename T>
+Pointset_Powerset<PSET>::Pointset_Powerset(const BD_Shape<T>& bds,
+                                           Complexity_Class)
+  : Base(), space_dim(bds.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  if (!bds.is_empty())
+    x.sequence.push_back(Determinate<PSET>(PSET(bds)));
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Constraint_System& cs)
+  : Base(Determinate<PSET>(cs)), space_dim(cs.space_dimension()) {
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline
+Pointset_Powerset<PSET>::Pointset_Powerset(const Congruence_System& cgs)
+  : Base(Determinate<PSET>(cgs)), space_dim(cgs.space_dimension()) {
+  PPL_ASSERT_HEAVY(OK());
+}
+
+template <typename PSET>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::operator=(y);
+  x.space_dim = y.space_dim;
+  return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::m_swap(Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.Base::m_swap(y);
+  using std::swap;
+  swap(x.space_dim, y.space_dim);
+}
+
+template <typename PSET>
+template <typename QH>
+inline Pointset_Powerset<PSET>&
+Pointset_Powerset<PSET>::operator=(const Pointset_Powerset<QH>& y) {
+  Pointset_Powerset& x = *this;
+  Pointset_Powerset<PSET> ps(y);
+  swap(x, ps);
+  return x;
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::intersection_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y,
+     Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::intersection_assign)));
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>::time_elapse_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  x.pairwise_apply_assign
+    (y,
+     Det_PSET::lift_op_assign(std::mem_fun_ref(&PSET::time_elapse_assign)));
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_covers(const Pointset_Powerset& y) const {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy);
+}
+
+template <typename PSET>
+inline bool
+Pointset_Powerset<PSET>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  const Pointset_Powerset<NNC_Polyhedron> xx(*this);
+  const Pointset_Powerset<NNC_Polyhedron> yy(y);
+  return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Pointset_Powerset<Grid>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <>
+inline bool
+Pointset_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::external_memory_in_bytes() const {
+  return Base::external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline memory_size_type
+Pointset_Powerset<PSET>::total_memory_in_bytes() const {
+  return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PSET>
+inline int32_t
+Pointset_Powerset<PSET>::hash_code() const {
+  return hash_code_from_dimension(space_dimension());
+}
+
+template <typename PSET>
+inline void
+Pointset_Powerset<PSET>
+::difference_assign(const Pointset_Powerset& y) {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  Pointset_Powerset<NNC_Polyhedron> nnc_this(*this);
+  Pointset_Powerset<NNC_Polyhedron> nnc_y(y);
+  nnc_this.difference_assign(nnc_y);
+  *this = nnc_this;
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline bool
+check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps) {
+  // This code is only used when PSET is an abstraction of NNC_Polyhedron.
+  const NNC_Polyhedron ph_nnc = NNC_Polyhedron(ph.constraints());
+  const Pointset_Powerset<NNC_Polyhedron> ps_nnc(ps);
+  return check_containment(ph_nnc, ps_nnc);
+}
+
+/*! \relates Pointset_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+                  const Pointset_Powerset<C_Polyhedron>& ps) {
+  return check_containment(NNC_Polyhedron(ph),
+                           Pointset_Powerset<NNC_Polyhedron>(ps));
+}
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+inline void
+swap(Pointset_Powerset<PSET>& x, Pointset_Powerset<PSET>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_templates.hh line 1. */
+/* Pointset_Powerset class implementation: non-inline template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_templates.hh line 33. */
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_disjunct(const PSET& ph) {
+  Pointset_Powerset& x = *this;
+  if (x.space_dimension() != ph.space_dimension()) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PSET>::add_disjunct(ph):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "ph.space_dimension() == " << ph.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+  x.sequence.push_back(Determinate<PSET>(ph));
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <>
+template <typename QH>
+Pointset_Powerset<NNC_Polyhedron>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<NNC_Polyhedron>
+                         (NNC_Polyhedron(i->pointset(), complexity)));
+
+  // FIXME: If the domain elements can be represented _exactly_ as NNC
+  // polyhedra, then having x.reduced = y.reduced is correct. This is
+  // the case if the domains are both linear and convex which holds
+  // for all the currently supported instantiations except for
+  // Grids; for this reason the Grid specialization has a
+  // separate implementation.  For any non-linear or non-convex
+  // domains (e.g., a domain of Intervals with restrictions or a
+  // domain of circles) that may be supported in the future, the
+  // assignment x.reduced = y.reduced will be a bug.
+  x.reduced = y.reduced;
+
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename QH>
+Pointset_Powerset<PSET>
+::Pointset_Powerset(const Pointset_Powerset<QH>& y,
+                    Complexity_Class complexity)
+  : Base(), space_dim(y.space_dimension()) {
+  Pointset_Powerset& x = *this;
+  for (typename Pointset_Powerset<QH>::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    x.sequence.push_back(Determinate<PSET>(PSET(i->pointset(), complexity)));
+  // Note: this might be non-reduced even when `y' is known to be
+  // omega-reduced, because the constructor of PSET may have made
+  // different QH elements to become comparable.
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::concatenate_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+  // Ensure omega-reduction here, since what follows has quadratic complexity.
+  x.omega_reduce();
+  y.omega_reduce();
+  Pointset_Powerset<PSET> new_x(x.space_dim + y.space_dim, EMPTY);
+  for (const_iterator xi = x.begin(), x_end = x.end(),
+         y_begin = y.begin(), y_end = y.end(); xi != x_end; ) {
+    for (const_iterator yi = y_begin; yi != y_end; ++yi) {
+      Det_PSET zi = *xi;
+      zi.concatenate_assign(*yi);
+      PPL_ASSERT_HEAVY(!zi.is_bottom());
+      new_x.sequence.push_back(zi);
+    }
+    ++xi;
+    if ((abandon_expensive_computations != 0)
+        && (xi != x_end) && (y_begin != y_end)) {
+      // Hurry up!
+      PSET x_ph = xi->pointset();
+      for (++xi; xi != x_end; ++xi)
+        x_ph.upper_bound_assign(xi->pointset());
+      const_iterator yi = y_begin;
+      PSET y_ph = yi->pointset();
+      for (++yi; yi != y_end; ++yi)
+        y_ph.upper_bound_assign(yi->pointset());
+      x_ph.concatenate_assign(y_ph);
+      swap(x, new_x);
+      x.add_disjunct(x_ph);
+      PPL_ASSERT_HEAVY(x.OK());
+      return;
+    }
+  }
+  swap(x, new_x);
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_constraint(c);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraint(const Constraint& c) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_constraint(c);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_constraints(cs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_constraints(const Constraint_System& cs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_constraints(cs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruence(const Congruence& cg) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_congruence(cg);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruence(const Congruence& cg) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_congruence(cg);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_congruences(const Congruence_System& cgs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_congruences(cgs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::refine_with_congruences(const Congruence_System& cgs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().refine_with_congruences(cgs);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variable var) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().unconstrain(var);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::unconstrain(const Variables_Set& vars) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().unconstrain(vars);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_embed(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_space_dimensions_and_embed(m);
+  x.space_dim += m;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::add_space_dimensions_and_project(dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().add_space_dimensions_and_project(m);
+  x.space_dim += m;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::remove_space_dimensions(const Variables_Set& vars) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_removed = vars.size();
+  if (num_removed > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si) {
+      si->pointset().remove_space_dimensions(vars);
+      x.reduced = false;
+    }
+    x.space_dim -= num_removed;
+    PPL_ASSERT_HEAVY(x.OK());
+  }
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+  Pointset_Powerset& x = *this;
+  if (new_dimension < x.space_dim) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si) {
+      si->pointset().remove_higher_space_dimensions(new_dimension);
+      x.reduced = false;
+    }
+    x.space_dim = new_dimension;
+    PPL_ASSERT_HEAVY(x.OK());
+  }
+}
+
+template <typename PSET>
+template <typename Partial_Function>
+void
+Pointset_Powerset<PSET>::map_space_dimensions(const Partial_Function& pfunc) {
+  Pointset_Powerset& x = *this;
+  if (x.is_bottom()) {
+    dimension_type n = 0;
+    for (dimension_type i = x.space_dim; i-- > 0; ) {
+      dimension_type new_i;
+      if (pfunc.maps(i, new_i))
+        ++n;
+    }
+    x.space_dim = n;
+  }
+  else {
+    Sequence_iterator s_begin = x.sequence.begin();
+    for (Sequence_iterator si = s_begin,
+           s_end = x.sequence.end(); si != s_end; ++si)
+      si->pointset().map_space_dimensions(pfunc);
+    x.space_dim = s_begin->pointset().space_dimension();
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::expand_space_dimension(Variable var,
+                                                dimension_type m) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().expand_space_dimension(var, m);
+  x.space_dim += m;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::fold_space_dimensions(const Variables_Set& vars,
+                                               Variable dest) {
+  Pointset_Powerset& x = *this;
+  Variables_Set::size_type num_folded = vars.size();
+  if (num_folded > 0) {
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ++si)
+      si->pointset().fold_space_dimensions(vars, dest);
+  }
+  x.space_dim -= num_folded;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_image(Variable var,
+                                      const Linear_Expression& expr,
+                                      Coefficient_traits::const_reference
+                                      denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().affine_image(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::affine_preimage(Variable var,
+                                         const Linear_Expression& expr,
+                                         Coefficient_traits::const_reference
+                                         denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().affine_preimage(var, expr, denominator);
+    // Note that the underlying domain can apply conservative approximation:
+    // that is why it would not be correct to make the loss of reduction
+    // conditional on `var' and `expr'.
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(const Linear_Expression& lhs,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_image(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(const Linear_Expression& lhs,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& rhs) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_preimage(lhs, relsym, rhs);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_image(Variable var,
+                           const Relation_Symbol relsym,
+                           const Linear_Expression& expr,
+                           Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_image(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::generalized_affine_preimage(Variable var,
+                              const Relation_Symbol relsym,
+                              const Linear_Expression& expr,
+                              Coefficient_traits::const_reference
+                              denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().generalized_affine_preimage(var, relsym, expr, denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_image(Variable var,
+                       const Linear_Expression& lb_expr,
+                       const Linear_Expression& ub_expr,
+                       Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().bounded_affine_image(var, lb_expr, ub_expr, denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::bounded_affine_preimage(Variable var,
+                          const Linear_Expression& lb_expr,
+                          const Linear_Expression& ub_expr,
+                          Coefficient_traits::const_reference denominator) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    si->pointset().bounded_affine_preimage(var, lb_expr, ub_expr,
+                                          denominator);
+    x.reduced = false;
+  }
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+dimension_type
+Pointset_Powerset<PSET>::affine_dimension() const {
+  // The affine dimension of the powerset is the affine dimension of
+  // the smallest vector space in which it can be embedded.
+  const Pointset_Powerset& x = *this;
+  C_Polyhedron x_ph(space_dim, EMPTY);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    PSET pi(si->pointset());
+    if (!pi.is_empty()) {
+      C_Polyhedron phi(space_dim);
+      const Constraint_System& cs = pi.minimized_constraints();
+      for (Constraint_System::const_iterator i = cs.begin(),
+             cs_end = cs.end(); i != cs_end; ++i) {
+        const Constraint& c = *i;
+        if (c.is_equality())
+          phi.add_constraint(c);
+      }
+      x_ph.poly_hull_assign(phi);
+    }
+  }
+
+  return x_ph.affine_dimension();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_universe() const {
+  const Pointset_Powerset& x = *this;
+  // Exploit omega-reduction, if already computed.
+  if (x.is_omega_reduced())
+    return x.size() == 1 && x.begin()->pointset().is_universe();
+
+  // A powerset is universe iff one of its disjuncts is.
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->pointset().is_universe()) {
+      // Speculative omega-reduction, if it is worth.
+      if (x.size() > 1) {
+        Pointset_Powerset<PSET> universe(x.space_dimension(), UNIVERSE);
+        Pointset_Powerset& xx = const_cast<Pointset_Powerset&>(x);
+        swap(xx, universe);
+      }
+      return true;
+    }
+  return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_empty() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_empty())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_discrete() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_discrete())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_topologically_closed() const {
+  const Pointset_Powerset& x = *this;
+  // The powerset must be omega-reduced before checking
+  // topological closure.
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_topologically_closed())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_bounded() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().is_bounded())
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::constrains(Variable var) const {
+  const Pointset_Powerset& x = *this;
+  // `var' should be one of the dimensions of the powerset.
+  const dimension_type var_space_dim = var.space_dimension();
+  if (x.space_dimension() < var_space_dim) {
+    std::ostringstream s;
+    s << "PPL::Pointset_Powerset<PSET>::constrains(v):\n"
+      << "this->space_dimension() == " << x.space_dimension() << ", "
+      << "v.space_dimension() == " << var_space_dim << ".";
+    throw std::invalid_argument(s.str());
+  }
+  // omega_reduction needed, since a redundant disjunct may constrain var.
+  x.omega_reduce();
+  // An empty powerset constrains all variables.
+  if (x.is_empty())
+    return true;
+  for (const_iterator x_i = x.begin(), x_end = x.end(); x_i != x_end; ++x_i)
+    if (x_i->pointset().constrains(var))
+      return true;
+  return false;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::is_disjoint_from(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         x_s_end = x.sequence.end(); si != x_s_end; ++si) {
+    const PSET& pi = si->pointset();
+    for (Sequence_const_iterator sj = y.sequence.begin(),
+           y_s_end = y.sequence.end(); sj != y_s_end; ++sj) {
+      const PSET& pj = sj->pointset();
+      if (!pi.is_disjoint_from(pj))
+        return false;
+    }
+  }
+  return true;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(const Variables_Set& vars,
+                               Complexity_Class complexity) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().drop_some_non_integer_points(vars, complexity);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>
+::drop_some_non_integer_points(Complexity_Class complexity) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().drop_some_non_integer_points(complexity);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::topological_closure_assign() {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().topological_closure_assign();
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::intersection_preserving_enlarge_element(PSET& dest) const {
+  // FIXME: this is just an executable specification.
+  const Pointset_Powerset& context = *this;
+  PPL_ASSERT(context.space_dimension() == dest.space_dimension());
+  bool nonempty_intersection = false;
+  // TODO: maybe use a *sorted* constraint system?
+  PSET enlarged(context.space_dimension(), UNIVERSE);
+  for (Sequence_const_iterator si = context.sequence.begin(),
+         s_end = context.sequence.end(); si != s_end; ++si) {
+    PSET context_i(si->pointset());
+    context_i.intersection_assign(enlarged);
+    PSET enlarged_i(dest);
+    if (enlarged_i.simplify_using_context_assign(context_i))
+      nonempty_intersection = true;
+    // TODO: merge the sorted constraints of `enlarged' and `enlarged_i'?
+    enlarged.intersection_assign(enlarged_i);
+  }
+  swap(dest, enlarged);
+  return nonempty_intersection;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::simplify_using_context_assign(const Pointset_Powerset& y) {
+  Pointset_Powerset& x = *this;
+
+  // Omega reduction is required.
+  // TODO: check whether it would be more efficient to Omega-reduce x
+  // during the simplification process: when examining *si, we check
+  // if it has been made redundant by any of the elements preceding it
+  // (which have been already simplified).
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+  y.omega_reduce();
+  if (y.is_empty()) {
+    x = y;
+    return false;
+  }
+
+  if (y.size() == 1) {
+    // More efficient, special handling of the singleton context case.
+    const PSET& y_i = y.sequence.begin()->pointset();
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ) {
+      PSET& x_i = si->pointset();
+      if (x_i.simplify_using_context_assign(y_i))
+        ++si;
+      else
+        // Intersection is empty: drop the disjunct.
+        si = x.sequence.erase(si);
+    }
+  }
+  else {
+    // The context is not a singleton.
+    for (Sequence_iterator si = x.sequence.begin(),
+           s_end = x.sequence.end(); si != s_end; ) {
+      if (y.intersection_preserving_enlarge_element(si->pointset()))
+        ++si;
+      else
+        // Intersection with `*si' is empty: drop the disjunct.
+        si = x.sequence.erase(si);
+    }
+  }
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+  return !x.sequence.empty();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains(const Pointset_Powerset& y) const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+    const PSET& pi = si->pointset();
+    bool pi_is_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           x_s_end = x.sequence.end();
+         (sj != x_s_end && !pi_is_contained);
+         ++sj) {
+      const PSET& pj = sj->pointset();
+      if (pj.contains(pi))
+        pi_is_contained = true;
+    }
+    if (!pi_is_contained)
+      return false;
+  }
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::strictly_contains(const Pointset_Powerset& y) const {
+  /* omega reduction ensures that a disjunct of y cannot be strictly
+     contained in one disjunct and also contained but not strictly
+     contained in another disjunct of *this */
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = y.sequence.begin(),
+         y_s_end = y.sequence.end(); si != y_s_end; ++si) {
+    const PSET& pi = si->pointset();
+    bool pi_is_strictly_contained = false;
+    for (Sequence_const_iterator sj = x.sequence.begin(),
+           x_s_end = x.sequence.end();
+         (sj != x_s_end && !pi_is_strictly_contained); ++sj) {
+      const PSET& pj = sj->pointset();
+      if (pj.strictly_contains(pi))
+        pi_is_strictly_contained = true;
+    }
+    if (!pi_is_strictly_contained)
+      return false;
+  }
+  return true;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Congruence& cg) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in cg if every disjunct is included in cg */
+  bool is_included = true;
+  /* *this is disjoint with cg if every disjunct is disjoint with cg */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with cg if some disjunct strictly
+     intersects with cg */
+  bool is_strictly_intersecting = false;
+  /* *this saturates cg if some disjunct saturates cg and
+     every disjunct is either disjoint from cg or saturates cg */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->pointset().relation_with(cg);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
+}
+
+template <typename PSET>
+Poly_Con_Relation
+Pointset_Powerset<PSET>::relation_with(const Constraint& c) const {
+  const Pointset_Powerset& x = *this;
+
+  /* *this is included in c if every disjunct is included in c */
+  bool is_included = true;
+  /* *this is disjoint with c if every disjunct is disjoint with c */
+  bool is_disjoint = true;
+  /* *this strictly_intersects with c if some disjunct strictly
+     intersects with c */
+  bool is_strictly_intersecting = false;
+  /* *this saturates c if some disjunct saturates c and
+     every disjunct is either disjoint from c or saturates c */
+  bool saturates_once = false;
+  bool may_saturate = true;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Con_Relation relation_i = si->pointset().relation_with(c);
+    if (!relation_i.implies(Poly_Con_Relation::is_included()))
+      is_included = false;
+    if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      is_disjoint = false;
+    if (relation_i.implies(Poly_Con_Relation::strictly_intersects()))
+      is_strictly_intersecting = true;
+    if (relation_i.implies(Poly_Con_Relation::saturates()))
+      saturates_once = true;
+    else if (!relation_i.implies(Poly_Con_Relation::is_disjoint()))
+      may_saturate = false;
+  }
+
+  Poly_Con_Relation result = Poly_Con_Relation::nothing();
+  if (is_included)
+    result = result && Poly_Con_Relation::is_included();
+  if (is_disjoint)
+    result = result && Poly_Con_Relation::is_disjoint();
+  if (is_strictly_intersecting)
+    result = result && Poly_Con_Relation::strictly_intersects();
+  if (saturates_once && may_saturate)
+    result = result && Poly_Con_Relation::saturates();
+
+  return result;
+}
+
+template <typename PSET>
+Poly_Gen_Relation
+Pointset_Powerset<PSET>::relation_with(const Generator& g) const {
+  const Pointset_Powerset& x = *this;
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    Poly_Gen_Relation relation_i = si->pointset().relation_with(g);
+    if (relation_i.implies(Poly_Gen_Relation::subsumes()))
+      return Poly_Gen_Relation::subsumes();
+  }
+
+  return Poly_Gen_Relation::nothing();
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_above(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().bounds_from_above(expr))
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>
+::bounds_from_below(const Linear_Expression& expr) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (!si->pointset().bounds_from_below(expr))
+      return false;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+                                  Coefficient& sup_n,
+                                  Coefficient& sup_d,
+                                  bool& maximum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+  best_sup_n = 0;
+  best_sup_d = 1;
+  bool best_max = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+  iter_sup_n = 0;
+  iter_sup_d = 1;
+  bool iter_max = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().maximize(expr, iter_sup_n, iter_sup_d, iter_max))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_sup_n = iter_sup_n;
+        best_sup_d = iter_sup_d;
+        best_max = iter_max;
+      }
+      else {
+        tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+        if (tmp < 0) {
+          best_sup_n = iter_sup_n;
+          best_sup_d = iter_sup_d;
+          best_max = iter_max;
+        }
+        else if (tmp == 0)
+          best_max = (best_max || iter_max);
+      }
+  }
+  sup_n = best_sup_n;
+  sup_d = best_sup_d;
+  maximum = best_max;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::maximize(const Linear_Expression& expr,
+                                  Coefficient& sup_n,
+                                  Coefficient& sup_d,
+                                  bool& maximum,
+                                  Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_sup_d);
+  best_sup_n = 0;
+  best_sup_d = 1;
+  bool best_max = false;
+  Generator best_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_sup_d);
+  iter_sup_n = 0;
+  iter_sup_d = 1;
+  bool iter_max = false;
+  Generator iter_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().maximize(expr,
+                                 iter_sup_n, iter_sup_d, iter_max, iter_g))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_sup_n = iter_sup_n;
+        best_sup_d = iter_sup_d;
+        best_max = iter_max;
+        best_g = iter_g;
+      }
+      else {
+        tmp = (best_sup_n * iter_sup_d) - (iter_sup_n * best_sup_d);
+        if (tmp < 0) {
+          best_sup_n = iter_sup_n;
+          best_sup_d = iter_sup_d;
+          best_max = iter_max;
+          best_g = iter_g;
+        }
+        else if (tmp == 0) {
+          best_max = (best_max || iter_max);
+          best_g = iter_g;
+        }
+      }
+  }
+  sup_n = best_sup_n;
+  sup_d = best_sup_d;
+  maximum = best_max;
+  g = best_g;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+                                  Coefficient& inf_n,
+                                  Coefficient& inf_d,
+                                  bool& minimum) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+  best_inf_n = 0;
+  best_inf_d = 1;
+  bool best_min = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+  iter_inf_n = 0;
+  iter_inf_d = 1;
+  bool iter_min = false;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().minimize(expr, iter_inf_n, iter_inf_d, iter_min))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_inf_n = iter_inf_n;
+        best_inf_d = iter_inf_d;
+        best_min = iter_min;
+      }
+      else {
+        tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+        if (tmp > 0) {
+          best_inf_n = iter_inf_n;
+          best_inf_d = iter_inf_d;
+          best_min = iter_min;
+        }
+        else if (tmp == 0)
+          best_min = (best_min || iter_min);
+      }
+  }
+  inf_n = best_inf_n;
+  inf_d = best_inf_d;
+  minimum = best_min;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::minimize(const Linear_Expression& expr,
+                                  Coefficient& inf_n,
+                                  Coefficient& inf_d,
+                                  bool& minimum,
+                                  Generator& g) const {
+  const Pointset_Powerset& x = *this;
+  x.omega_reduce();
+  if (x.is_empty())
+    return false;
+
+  bool first = true;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(best_inf_d);
+  best_inf_n = 0;
+  best_inf_d = 1;
+  bool best_min = false;
+  Generator best_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(iter_inf_d);
+  iter_inf_n = 0;
+  iter_inf_d = 1;
+  bool iter_min = false;
+  Generator iter_g = point();
+
+  PPL_DIRTY_TEMP_COEFFICIENT(tmp);
+
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si) {
+    if (!si->pointset().minimize(expr,
+                                 iter_inf_n, iter_inf_d, iter_min, iter_g))
+      return false;
+    else
+      if (first) {
+        first = false;
+        best_inf_n = iter_inf_n;
+        best_inf_d = iter_inf_d;
+        best_min = iter_min;
+        best_g = iter_g;
+      }
+      else {
+        tmp = (best_inf_n * iter_inf_d) - (iter_inf_n * best_inf_d);
+        if (tmp > 0) {
+          best_inf_n = iter_inf_n;
+          best_inf_d = iter_inf_d;
+          best_min = iter_min;
+          best_g = iter_g;
+        }
+        else if (tmp == 0) {
+          best_min = (best_min || iter_min);
+          best_g = iter_g;
+        }
+      }
+  }
+  inf_n = best_inf_n;
+  inf_d = best_inf_d;
+  minimum = best_min;
+  g = best_g;
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::contains_integer_point() const {
+  const Pointset_Powerset& x = *this;
+  for (Sequence_const_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    if (si->pointset().contains_integer_point())
+      return true;
+  return false;
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::wrap_assign(const Variables_Set& vars,
+                                     Bounded_Integer_Type_Width w,
+                                     Bounded_Integer_Type_Representation r,
+                                     Bounded_Integer_Type_Overflow o,
+                                     const Constraint_System* cs_p,
+                                     unsigned complexity_threshold,
+                                     bool wrap_individually) {
+  Pointset_Powerset& x = *this;
+  for (Sequence_iterator si = x.sequence.begin(),
+         s_end = x.sequence.end(); si != s_end; ++si)
+    si->pointset().wrap_assign(vars, w, r, o, cs_p,
+                               complexity_threshold, wrap_individually);
+  x.reduced = false;
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::pairwise_reduce() {
+  Pointset_Powerset& x = *this;
+  // It is wise to omega-reduce before pairwise-reducing.
+  x.omega_reduce();
+
+  size_type n = x.size();
+  size_type deleted;
+  do {
+    Pointset_Powerset new_x(x.space_dim, EMPTY);
+    std::deque<bool> marked(n, false);
+    deleted = 0;
+    Sequence_iterator s_begin = x.sequence.begin();
+    Sequence_iterator s_end = x.sequence.end();
+    unsigned si_index = 0;
+    for (Sequence_iterator si = s_begin; si != s_end; ++si, ++si_index) {
+      if (marked[si_index])
+        continue;
+      PSET& pi = si->pointset();
+      Sequence_const_iterator sj = si;
+      unsigned sj_index = si_index;
+      for (++sj, ++sj_index; sj != s_end; ++sj, ++sj_index) {
+        if (marked[sj_index])
+          continue;
+        const PSET& pj = sj->pointset();
+        if (pi.upper_bound_assign_if_exact(pj)) {
+          marked[si_index] = true;
+          marked[sj_index] = true;
+          new_x.add_non_bottom_disjunct_preserve_reduction(pi);
+          ++deleted;
+          goto next;
+        }
+      }
+    next:
+      ;
+    }
+    iterator new_x_begin = new_x.begin();
+    iterator new_x_end = new_x.end();
+    unsigned xi_index = 0;
+    for (const_iterator xi = x.begin(),
+           x_end = x.end(); xi != x_end; ++xi, ++xi_index)
+      if (!marked[xi_index])
+        new_x_begin
+          = new_x.add_non_bottom_disjunct_preserve_reduction(*xi,
+                                                             new_x_begin,
+                                                             new_x_end);
+    using std::swap;
+    swap(x.sequence, new_x.sequence);
+    n -= deleted;
+  } while (deleted > 0);
+  PPL_ASSERT_HEAVY(x.OK());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_heuristics_assign(const Pointset_Powerset& y, Widening widen_fun) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PSET> x_copy = x;
+    const Pointset_Powerset<PSET> y_copy = y;
+    PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  size_type n = x.size();
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  std::deque<bool> marked(n, false);
+  const_iterator x_begin = x.begin();
+  const_iterator x_end = x.end();
+  unsigned i_index = 0;
+  for (const_iterator i = x_begin,
+         y_begin = y.begin(), y_end = y.end(); i != x_end; ++i, ++i_index)
+    for (const_iterator j = y_begin; j != y_end; ++j) {
+      const PSET& pi = i->pointset();
+      const PSET& pj = j->pointset();
+      if (pi.contains(pj)) {
+        PSET pi_copy = pi;
+        widen_fun(pi_copy, pj);
+        new_x.add_non_bottom_disjunct_preserve_reduction(pi_copy);
+        marked[i_index] = true;
+      }
+    }
+  iterator new_x_begin = new_x.begin();
+  iterator new_x_end = new_x.end();
+  i_index = 0;
+  for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+    if (!marked[i_index])
+      new_x_begin
+        = new_x.add_non_bottom_disjunct_preserve_reduction(*i,
+                                                           new_x_begin,
+                                                           new_x_end);
+  using std::swap;
+  swap(x.sequence, new_x.sequence);
+  PPL_ASSERT_HEAVY(x.OK());
+  PPL_ASSERT(x.is_omega_reduced());
+}
+
+template <typename PSET>
+template <typename Widening>
+void
+Pointset_Powerset<PSET>::
+BGP99_extrapolation_assign(const Pointset_Powerset& y,
+                           Widening widen_fun,
+                           unsigned max_disjuncts) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PSET> x_copy = x;
+    const Pointset_Powerset<PSET> y_copy = y;
+    PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  x.pairwise_reduce();
+  if (max_disjuncts != 0)
+    x.collapse(max_disjuncts);
+  x.BGP99_heuristics_assign(y, widen_fun);
+}
+
+template <typename PSET>
+template <typename Cert>
+void
+Pointset_Powerset<PSET>::
+collect_certificates(std::map<Cert, size_type,
+                     typename Cert::Compare>& cert_ms) const {
+  const Pointset_Powerset& x = *this;
+  PPL_ASSERT(x.is_omega_reduced());
+  PPL_ASSERT(cert_ms.size() == 0);
+  for (const_iterator i = x.begin(), end = x.end(); i != end; ++i) {
+    Cert ph_cert(i->pointset());
+    ++cert_ms[ph_cert];
+  }
+}
+
+template <typename PSET>
+template <typename Cert>
+bool
+Pointset_Powerset<PSET>::
+is_cert_multiset_stabilizing(const std::map<Cert, size_type,
+                             typename Cert::Compare>& y_cert_ms) const {
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset x_cert_ms;
+  collect_certificates(x_cert_ms);
+  typename Cert_Multiset::const_iterator xi = x_cert_ms.begin();
+  typename Cert_Multiset::const_iterator x_cert_ms_end = x_cert_ms.end();
+  typename Cert_Multiset::const_iterator yi = y_cert_ms.begin();
+  typename Cert_Multiset::const_iterator y_cert_ms_end = y_cert_ms.end();
+  while (xi != x_cert_ms_end && yi != y_cert_ms_end) {
+    const Cert& xi_cert = xi->first;
+    const Cert& yi_cert = yi->first;
+    switch (xi_cert.compare(yi_cert)) {
+    case 0:
+      // xi_cert == yi_cert: check the number of multiset occurrences.
+      {
+        const size_type& xi_count = xi->second;
+        const size_type& yi_count = yi->second;
+        if (xi_count == yi_count) {
+          // Same number of occurrences: compare the next pair.
+          ++xi;
+          ++yi;
+        }
+        else
+          // Different number of occurrences: can decide ordering.
+          return xi_count < yi_count;
+        break;
+      }
+    case 1:
+      // xi_cert > yi_cert: it is not stabilizing.
+      return false;
+
+    case -1:
+      // xi_cert < yi_cert: it is stabilizing.
+      return true;
+    }
+  }
+  // Here xi == x_cert_ms_end or yi == y_cert_ms_end.
+  // Stabilization is achieved if `y_cert_ms' still has other elements.
+  return yi != y_cert_ms_end;
+}
+
+template <typename PSET>
+template <typename Cert, typename Widening>
+void
+Pointset_Powerset<PSET>::BHZ03_widening_assign(const Pointset_Powerset& y,
+                                               Widening widen_fun) {
+  // `x' is the current iteration value.
+  Pointset_Powerset& x = *this;
+
+#ifndef NDEBUG
+  {
+    // We assume that `y' entails `x'.
+    const Pointset_Powerset<PSET> x_copy = x;
+    const Pointset_Powerset<PSET> y_copy = y;
+    PPL_ASSERT_HEAVY(y_copy.definitely_entails(x_copy));
+  }
+#endif
+
+  // First widening technique: do nothing.
+
+  // If `y' is the empty collection, do nothing.
+  PPL_ASSERT(x.size() > 0);
+  if (y.size() == 0)
+    return;
+
+  // Compute the poly-hull of `x'.
+  PSET x_hull(x.space_dim, EMPTY);
+  for (const_iterator i = x.begin(), x_end = x.end(); i != x_end; ++i)
+    x_hull.upper_bound_assign(i->pointset());
+
+  // Compute the poly-hull of `y'.
+  PSET y_hull(y.space_dim, EMPTY);
+  for (const_iterator i = y.begin(), y_end = y.end(); i != y_end; ++i)
+    y_hull.upper_bound_assign(i->pointset());
+  // Compute the certificate for `y_hull'.
+  const Cert y_hull_cert(y_hull);
+
+  // If the hull is stabilizing, do nothing.
+  int hull_stabilization = y_hull_cert.compare(x_hull);
+  if (hull_stabilization == 1)
+    return;
+
+  // Multiset ordering is only useful when `y' is not a singleton.
+  const bool y_is_not_a_singleton = y.size() > 1;
+
+  // The multiset certificate for `y':
+  // we want to be lazy about its computation.
+  typedef std::map<Cert, size_type, typename Cert::Compare> Cert_Multiset;
+  Cert_Multiset y_cert_ms;
+  bool y_cert_ms_computed = false;
+
+  if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // Collect the multiset certificate for `y'.
+    y.collect_certificates(y_cert_ms);
+    y_cert_ms_computed = true;
+    // If multiset ordering is stabilizing, do nothing.
+    if (x.is_cert_multiset_stabilizing(y_cert_ms))
+      return;
+  }
+
+  // Second widening technique: try the BGP99 powerset heuristics.
+  Pointset_Powerset<PSET> bgp99_heuristics = x;
+  bgp99_heuristics.BGP99_heuristics_assign(y, widen_fun);
+
+  // Compute the poly-hull of `bgp99_heuristics'.
+  PSET bgp99_heuristics_hull(x.space_dim, EMPTY);
+  for (const_iterator i = bgp99_heuristics.begin(),
+         b_h_end = bgp99_heuristics.end(); i != b_h_end; ++i)
+    bgp99_heuristics_hull.upper_bound_assign(i->pointset());
+
+  // Check for stabilization and, if successful,
+  // commit to the result of the extrapolation.
+  hull_stabilization = y_hull_cert.compare(bgp99_heuristics_hull);
+  if (hull_stabilization == 1) {
+    // The poly-hull is stabilizing.
+    swap(x, bgp99_heuristics);
+    return;
+  }
+  else if (hull_stabilization == 0 && y_is_not_a_singleton) {
+    // If not already done, compute multiset certificate for `y'.
+    if (!y_cert_ms_computed) {
+      y.collect_certificates(y_cert_ms);
+      y_cert_ms_computed = true;
+    }
+    if (bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      swap(x, bgp99_heuristics);
+      return;
+    }
+    // Third widening technique: pairwise-reduction on `bgp99_heuristics'.
+    // Note that pairwise-reduction does not affect the computation
+    // of the poly-hulls, so that we only have to check the multiset
+    // certificate relation.
+    Pointset_Powerset<PSET> reduced_bgp99_heuristics(bgp99_heuristics);
+    reduced_bgp99_heuristics.pairwise_reduce();
+    if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+      swap(x, reduced_bgp99_heuristics);
+      return;
+    }
+  }
+
+  // Fourth widening technique: this is applicable only when
+  // `y_hull' is a proper subset of `bgp99_heuristics_hull'.
+  if (bgp99_heuristics_hull.strictly_contains(y_hull)) {
+    // Compute (y_hull \widen bgp99_heuristics_hull).
+    PSET ph = bgp99_heuristics_hull;
+    widen_fun(ph, y_hull);
+    // Compute the difference between `ph' and `bgp99_heuristics_hull'.
+    ph.difference_assign(bgp99_heuristics_hull);
+    x.add_disjunct(ph);
+    return;
+  }
+
+  // Fall back to the computation of the poly-hull.
+  Pointset_Powerset<PSET> x_hull_singleton(x.space_dim, EMPTY);
+  x_hull_singleton.add_disjunct(x_hull);
+  swap(x, x_hull_singleton);
+}
+
+template <typename PSET>
+void
+Pointset_Powerset<PSET>::ascii_dump(std::ostream& s) const {
+  const Pointset_Powerset& x = *this;
+  s << "size " << x.size()
+    << "\nspace_dim " << x.space_dim
+    << "\n";
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi)
+    xi->pointset().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PSET, Pointset_Powerset<PSET>)
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::ascii_load(std::istream& s) {
+  Pointset_Powerset& x = *this;
+  std::string str;
+
+  if (!(s >> str) || str != "size")
+    return false;
+
+  size_type sz;
+
+  if (!(s >> sz))
+    return false;
+
+  if (!(s >> str) || str != "space_dim")
+    return false;
+
+  if (!(s >> x.space_dim))
+    return false;
+
+  Pointset_Powerset new_x(x.space_dim, EMPTY);
+  while (sz-- > 0) {
+    PSET ph;
+    if (!ph.ascii_load(s))
+      return false;
+    new_x.add_disjunct(ph);
+  }
+  swap(x, new_x);
+
+  // Check invariants.
+  PPL_ASSERT_HEAVY(x.OK());
+  return true;
+}
+
+template <typename PSET>
+bool
+Pointset_Powerset<PSET>::OK() const {
+  const Pointset_Powerset& x = *this;
+  for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+    const PSET& pi = xi->pointset();
+    if (pi.space_dimension() != x.space_dim) {
+#ifndef NDEBUG
+      std::cerr << "Space dimension mismatch: is " << pi.space_dimension()
+                << " in an element of the sequence,\nshould be "
+                << x.space_dim << "."
+                << std::endl;
+#endif
+      return false;
+    }
+  }
+  return x.Base::OK();
+}
+
+namespace Implementation {
+
+namespace Pointset_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p pset according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p pset and constraint \p c is stored
+  in \p pset, whereas the intersection of \p pset with the negation of \p c
+  is added as a new disjunct of the powerset \p r.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PSET>
+void
+linear_partition_aux(const Constraint& c,
+                     PSET& pset,
+                     Pointset_Powerset<NNC_Polyhedron>& r) {
+  const Linear_Expression le(c.expression());
+  const Constraint& neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+  NNC_Polyhedron nnc_ph_pset(pset);
+  nnc_ph_pset.add_constraint(neg_c);
+  if (!nnc_ph_pset.is_empty())
+    r.add_disjunct(nnc_ph_pset);
+  pset.add_constraint(c);
+}
+
+} // namespace Pointset_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Pointset_Powerset */
+template <typename PSET>
+std::pair<PSET, Pointset_Powerset<NNC_Polyhedron> >
+linear_partition(const PSET& p, const PSET& q) {
+  using Implementation::Pointset_Powersets::linear_partition_aux;
+
+  Pointset_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+  PSET pset = q;
+  const Constraint_System& p_constraints = p.constraints();
+  for (Constraint_System::const_iterator i = p_constraints.begin(),
+         p_constraints_end = p_constraints.end();
+       i != p_constraints_end;
+       ++i) {
+    const Constraint& c = *i;
+    if (c.is_equality()) {
+      const Linear_Expression le(c.expression());
+      linear_partition_aux(le <= 0, pset, r);
+      linear_partition_aux(le >= 0, pset, r);
+    }
+    else
+      linear_partition_aux(c, pset, r);
+  }
+  return std::make_pair(pset, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pointset_Powerset_defs.hh line 1448. */
+
+/* Automatically generated from PPL source file ../src/algorithms.hh line 29. */
+#include <utility>
+/* Automatically generated from PPL source file ../src/algorithms.hh line 31. */
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  If the poly-hull of \p p and \p q is exact it is assigned
+  to \p p and <CODE>true</CODE> is returned,
+  otherwise <CODE>false</CODE> is returned.
+
+  \relates Polyhedron
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Polyhedron */
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+  PH poly_hull = p;
+  NNC_Polyhedron nnc_p(p);
+  poly_hull.poly_hull_assign(q);
+  std::pair<PH, Pointset_Powerset<NNC_Polyhedron> >
+    partition = linear_partition(q, poly_hull);
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i)
+    // The polyhedral hull is exact if and only if all the elements
+    // of the partition of the polyhedral hull of `p' and `q' with
+    // respect to `q' are included in `p'
+    if (!nnc_p.contains(i->pointset()))
+      return false;
+  p = poly_hull;
+  return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 1. */
+/* Utilities for termination analysis: declarations.
+*/
+
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 28. */
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 33. */
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers {
+public:
+  static void
+  all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+                                  const Constraint_System& cs_after,
+                                  NNC_Polyhedron& mu_space);
+  static bool
+  one_affine_ranking_function_PR(const Constraint_System& cs_before,
+                                 const Constraint_System& cs_after,
+                                 Generator& mu);
+  static bool
+  one_affine_ranking_function_PR_original(const Constraint_System& cs,
+                                          Generator& mu);
+  static void
+  all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+                                           NNC_Polyhedron& mu_space);
+
+  template <typename PSET>
+  static void
+  assign_all_inequalities_approximation(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        Constraint_System& cs);
+}; // class Termination_Helpers
+
+//! \name Functions for the Synthesis of Linear Rankings
+//@{
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test using an improvement of the method by Mesnard and
+  Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then <CODE>true</CODE> is returned <EM>if and only if</EM>
+  the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test using an improvement of the method by Mesnard and
+  Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then <CODE>true</CODE> is returned
+  <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with witness ranking function using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \param mu
+  When <CODE>true</CODE> is returned, this is assigned a point
+  of space dimension \f$ n+1 \f$ encoding one (not further specified)
+  affine ranking function for the loop being analyzed.
+  The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+  of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+  respectively.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then <CODE>true</CODE> is returned <EM>if and only if</EM>
+  the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with witness ranking function using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \param mu
+  When <CODE>true</CODE> is returned, this is assigned a point
+  of space dimension \f$ n+1 \f$ encoding one (not further specified)
+  affine ranking function for the loop being analyzed.
+  The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+  of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+  respectively.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then <CODE>true</CODE> is returned
+  <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with ranking function space using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \param mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the affine ranking functions for the loops
+  that are precisely characterized by \p pset.
+  These ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p mu_space polyhedron.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions of \p mu_space
+  \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p mu_space is empty, it means that the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then \p mu_space is empty <EM>if and only if</EM>
+  the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with ranking function space using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \param mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the affine ranking functions for the loops
+  that are precisely characterized by \p pset.
+  These ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p mu_space polyhedron.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions of \p mu_space
+  \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p mu_space is empty, it means that the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then \p mu_space is empty <EM>if and only if</EM>
+  the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Computes the spaces of affine \e quasi ranking functions
+  using an improvement of the method by Mesnard and Serebrenik
+  \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \param decreasing_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the decreasing affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  \param bounded_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the lower bounded affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  These quasi-ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+  it means that the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then \p decreasing_mu_space (resp., \p bounded_mu_space) will be empty
+  <EM>if and only if</EM> there is no decreasing (resp., lower bounded)
+  affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Computes the spaces of affine \e quasi ranking functions
+  using an improvement of the method by Mesnard and Serebrenik
+  \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \param decreasing_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the decreasing affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  \param bounded_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the lower bounded affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  These ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+  it means that the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then \p decreasing_mu_space (resp., \p bounded_mu_space)
+  will be empty <EM>if and only if</EM> there is no decreasing
+  (resp., lower bounded) affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        C_Polyhedron& decreasing_mu_space,
+                                        C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like termination_test_MS() but using the method by Podelski and
+  Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like termination_test_MS_2() but using an alternative formalization
+  of the method by Podelski and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like one_affine_ranking_function_MS() but using the method by Podelski
+  and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like one_affine_ranking_function_MS_2() but using an alternative
+  formalization of the method by Podelski and Rybalchenko
+  \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like all_affine_ranking_functions_MS() but using the method by Podelski
+  and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset, NNC_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like all_affine_ranking_functions_MS_2() but using an alternative
+  formalization of the method by Podelski and Rybalchenko
+  \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  NNC_Polyhedron& mu_space);
+
+//@} // Functions for the Synthesis of Linear Rankings
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_templates.hh line 1. */
+/* Utilities for termination analysis: template functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/termination_templates.hh line 33. */
+
+#include <stdexcept>
+
+#define PRINT_DEBUG_INFO 0
+
+#if PRINT_DEBUG_INFO
+#include <iostream>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Termination {
+
+#if PRINT_DEBUG_INFO
+static dimension_type output_function_MS_n;
+static dimension_type output_function_MS_m;
+
+/* Encodes which object are we printing:
+
+   0 means input constraint system;
+   1 means first output constraint system;
+   2 means second output constraint system;
+   3 means only output constraint system
+     (i.e., when first and second are the same);
+   4 means mu space.
+*/
+static int output_function_MS_which = -1;
+
+/*
+  Debugging output function.  See the documentation of
+  fill_constraint_systems_MS() for the allocation of variable indices.
+*/
+inline void
+output_function_MS(std::ostream& s, const Variable v) {
+  dimension_type id = v.id();
+  switch (output_function_MS_which) {
+  case 0:
+    if (id < output_function_MS_n)
+      s << "x'" << id + 1;
+    else if (id < 2*output_function_MS_n)
+      s << "x" << id - output_function_MS_n + 1;
+    else
+      s << "WHAT?";
+    break;
+  case 1:
+    if (id < output_function_MS_n)
+      s << "mu" << id + 1;
+    else if (id == output_function_MS_n)
+      s << "WHAT?";
+    else if (id <= output_function_MS_n + output_function_MS_m)
+      s << "y" << id - output_function_MS_n;
+    else
+      s << "WHAT?";
+    break;
+  case 2:
+  case 4:
+    if (id < output_function_MS_n)
+      s << "mu" << id + 1;
+    else if (id == output_function_MS_n)
+      s << "mu0";
+    else if (output_function_MS_which == 2
+             && id <= output_function_MS_n + output_function_MS_m + 2)
+      s << "z" << id - output_function_MS_n;
+    else
+      s << "WHAT?";
+    break;
+  case 3:
+    if (id < output_function_MS_n)
+      s << "mu" << id + 1;
+    else if (id == output_function_MS_n)
+      s << "mu0";
+    else if (id <= output_function_MS_n + output_function_MS_m)
+      s << "y" << id - output_function_MS_n;
+    else if (id <= output_function_MS_n + 2*output_function_MS_m + 2)
+      s << "z" << id - (output_function_MS_n + output_function_MS_m);
+    else
+      s << "WHAT?";
+    break;
+  default:
+    abort();
+    break;
+  }
+}
+
+static dimension_type output_function_PR_s;
+static dimension_type output_function_PR_r;
+
+/*
+  Debugging output function.  See the documentation of
+  fill_constraint_system_PR() for the allocation of variable indices.
+*/
+inline void
+output_function_PR(std::ostream& s, const Variable v) {
+  dimension_type id = v.id();
+  if (id < output_function_PR_s)
+    s << "u3_" << id + 1;
+  else if (id < output_function_PR_s + output_function_PR_r)
+    s << "u2_" << id - output_function_PR_s + 1;
+  else if (id < output_function_PR_s + 2*output_function_PR_r)
+    s << "u1_" << id - (output_function_PR_s + output_function_PR_r) + 1;
+  else
+    s << "WHAT?";
+}
+#endif
+
+void
+assign_all_inequalities_approximation(const Constraint_System& cs_in,
+                                      Constraint_System& cs_out);
+
+template <typename PSET>
+inline void
+assign_all_inequalities_approximation(const PSET& pset,
+                                      Constraint_System& cs) {
+  assign_all_inequalities_approximation(pset.minimized_constraints(), cs);
+}
+
+template <>
+void
+assign_all_inequalities_approximation(const C_Polyhedron& ph,
+                                      Constraint_System& cs);
+
+bool
+termination_test_MS(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_MS(const Constraint_System& cs,
+                               Generator& mu);
+
+void
+all_affine_ranking_functions_MS(const Constraint_System& cs,
+                                C_Polyhedron& mu_space);
+
+void
+all_affine_quasi_ranking_functions_MS(const Constraint_System& cs,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space);
+
+bool
+termination_test_PR(const Constraint_System& cs_before,
+                    const Constraint_System& cs_after);
+
+bool
+one_affine_ranking_function_PR(const Constraint_System& cs_before,
+                               const Constraint_System& cs_after,
+                               Generator& mu);
+
+void
+all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+                                const Constraint_System& cs_after,
+                                NNC_Polyhedron& mu_space);
+
+bool
+termination_test_PR_original(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_PR_original(const Constraint_System& cs,
+                                        Generator& mu);
+
+void
+all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+                                         NNC_Polyhedron& mu_space);
+
+} // namespace Termination
+
+} // namespace Implementation
+
+template <typename PSET>
+void
+Termination_Helpers
+::assign_all_inequalities_approximation(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        Constraint_System& cs) {
+  Implementation::Termination
+    ::assign_all_inequalities_approximation(pset_before, cs);
+  cs.shift_space_dimensions(Variable(0), cs.space_dimension());
+  Constraint_System cs_after;
+  Implementation::Termination
+    ::assign_all_inequalities_approximation(pset_after, cs_after);
+  // FIXME: provide an "append" for constraint systems.
+  for (Constraint_System::const_iterator i = cs_after.begin(),
+         cs_after_end = cs_after.end(); i != cs_after_end; ++i)
+    cs.insert(*i);
+}
+
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::termination_test_MS(pset):\n"
+         "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::termination_test_MS_2(pset_before, pset_after):\n"
+         "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_MS(pset, mu):\n"
+         "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_MS_2(pset_before, pset_after, mu):\n"
+         "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_MS(pset, mu_space):\n"
+         "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset.is_empty()) {
+    mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  C_Polyhedron& mu_space) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_MS_2"
+      << "(pset_before, pset_after, mu_space):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset_before.is_empty()) {
+    mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::all_affine_quasi_ranking_functions_MS"
+      << "(pset, decr_space, bounded_space):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset.is_empty()) {
+    decreasing_mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+    bounded_mu_space = decreasing_mu_space;
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  all_affine_quasi_ranking_functions_MS(cs,
+                                        decreasing_mu_space,
+                                        bounded_mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        C_Polyhedron& decreasing_mu_space,
+                                        C_Polyhedron& bounded_mu_space) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::all_affine_quasi_ranking_functions_MS_2"
+      << "(pset_before, pset_after, decr_space, bounded_space):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset_before.is_empty()) {
+    decreasing_mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+    bounded_mu_space = decreasing_mu_space;
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  all_affine_quasi_ranking_functions_MS(cs,
+                                        decreasing_mu_space,
+                                        bounded_mu_space);
+}
+
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::termination_test_PR_2(pset_before, pset_after):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs_before;
+  Constraint_System cs_after;
+  assign_all_inequalities_approximation(pset_before, cs_before);
+  assign_all_inequalities_approximation(pset_after, cs_after);
+  return termination_test_PR(cs_before, cs_after);
+}
+
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::termination_test_PR(pset):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return termination_test_PR_original(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_PR_2"
+      << "(pset_before, pset_after, mu):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs_before;
+  Constraint_System cs_after;
+  assign_all_inequalities_approximation(pset_before, cs_before);
+  assign_all_inequalities_approximation(pset_after, cs_after);
+  return one_affine_ranking_function_PR(cs_before, cs_after, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_PR(pset, mu):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return one_affine_ranking_function_PR_original(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  NNC_Polyhedron& mu_space) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_MS_2"
+      << "(pset_before, pset_after, mu_space):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset_before.is_empty()) {
+    mu_space = NNC_Polyhedron(1 + before_space_dim);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs_before;
+  Constraint_System cs_after;
+  assign_all_inequalities_approximation(pset_before, cs_before);
+  assign_all_inequalities_approximation(pset_after, cs_after);
+  all_affine_ranking_functions_PR(cs_before, cs_after, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset,
+                                NNC_Polyhedron& mu_space) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_PR(pset, mu_space):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset.is_empty()) {
+    mu_space = NNC_Polyhedron(1 + space_dim/2);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  all_affine_ranking_functions_PR_original(cs, mu_space);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/termination_defs.hh line 501. */
+
+/* Automatically generated from PPL source file ../src/wrap_string.hh line 1. */
+/* Declaration of string wrapping function.
+*/
+
+
+/* Automatically generated from PPL source file ../src/wrap_string.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Utility function for the wrapping of lines of text.
+/*!
+  \param src_string
+  The source string holding the lines to wrap.
+
+  \param indent_depth
+  The indentation depth.
+
+  \param preferred_first_line_length
+  The preferred length for the first line of text.
+
+  \param preferred_line_length
+  The preferred length for all the lines but the first one.
+
+  \return
+  The wrapped string.
+*/
+std::string
+wrap_string(const std::string& src_string,
+            unsigned indent_depth,
+            unsigned preferred_first_line_length,
+            unsigned preferred_line_length);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Cast_Floating_Point_Expression class and
+   its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Cast_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Cast Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of floating-point cast expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+  forms such that:
+
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v \right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+  \f]
+
+  Given a floating point expression \f$e\f$ and a composite abstract store
+  \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right \rrbracket\f$,
+  we construct the interval linear form
+  \f$\linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}\f$ as follows:
+  \f[
+  \linexprenv{cast(e)}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Cast_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Builds a cast floating point expression with the value
+    expressed by \p expr.
+  */
+  Cast_Floating_Point_Expression(
+    Floating_Point_Expression<FP_Interval_Type, FP_Format>* const expr);
+
+  //! Destructor.
+  ~Cast_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    See the class description for an explanation of how \p result is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Cast_Floating_Point_Expression& y);
+
+private:
+
+  //! Pointer to the casted expression.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* expr;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Cast_Floating_Point_Expression(
+                          const Cast_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+  Cast_Floating_Point_Expression& operator=(
+                          const Cast_Floating_Point_Expression& y);
+
+}; // class Cast_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_inlines.hh line 1. */
+/* Cast_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Cast_Floating_Point_Expression(
+Floating_Point_Expression<FP_Interval_Type, FP_Format>* const e)
+  : expr(e) {
+  assert(e != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Cast_Floating_Point_Expression() {
+  delete expr;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Cast_Floating_Point_Expression& y) {
+  swap(expr, y.expr);
+}
+
+/*! \relates Cast_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_defs.hh line 181. */
+
+/* Automatically generated from PPL source file ../src/Cast_Floating_Point_Expression_templates.hh line 1. */
+/* Cast_Floating_Point_Expression class implementation:
+   non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Cast_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!expr->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Constant_Floating_Point_Expression class and
+   its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Constant_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Constant Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of floating-point constant expressions
+
+  The linearization of a constant floating point expression results in a
+  linear form consisting of only the inhomogeneous term
+  \f$[l, u]\f$, where \f$l\f$ and \f$u\f$ are the lower
+  and upper bounds of the constant value given to the class constructor.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Constant_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the constant floating point
+    expression from a \p lower_bound and an \p upper_bound of its
+    value in the concrete domain.
+  */
+  Constant_Floating_Point_Expression(const boundary_type lower_bound,
+                                     const boundary_type upper_bound);
+
+  /*! \brief
+    Builds a constant floating point expression with the value
+    expressed by the string \p str_value.
+  */
+  Constant_Floating_Point_Expression(const char* str_value);
+
+  //! Destructor.
+  ~Constant_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    See the class description for an explanation of how \p result is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Constant_Floating_Point_Expression& y);
+
+private:
+
+  FP_Interval_Type value;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Constant_Floating_Point_Expression(
+                          const Constant_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAIL
+  Constant_Floating_Point_Expression& operator=(
+                          const Constant_Floating_Point_Expression& y);
+
+}; // class Constant_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_inlines.hh line 1. */
+/* Constant_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const char* str_value)
+  : value(str_value) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Constant_Floating_Point_Expression(const boundary_type lb,
+                                   const boundary_type ub) {
+  assert(lb <= ub);
+  value.build(i_constraint(GREATER_OR_EQUAL, lb),
+              i_constraint(LESS_OR_EQUAL, ub));
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Constant_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Constant_Floating_Point_Expression& y) {
+  using std::swap;
+  swap(value, y.value);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+            const FP_Linear_Form_Abstract_Store&,
+            FP_Linear_Form& result) const {
+  result = FP_Linear_Form(value);
+  return true;
+}
+
+/*! \relates Constant_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Constant_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Constant_Floating_Point_Expression_defs.hh line 172. */
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Variable_Floating_Point_Expression class and
+   its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+#include <utility>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Variable_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Variable Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of floating-point variable expressions
+
+  Given a variable expression \f$v\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval
+  linear form \f$\linexprenv{v}{\rho^{\#}}{\rho^{\#}_l}\f$ as
+  \f$\rho^{\#}_l(v)\f$ if it is defined; otherwise we construct it as
+  \f$[-1, 1]v\f$.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Variable_Floating_Point_Expression
+: public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with a parameter: builds the variable floating point
+    expression corresponding to the variable having \p v_index as its index.
+  */
+  explicit Variable_Floating_Point_Expression(const dimension_type v_index);
+
+  //! Destructor.
+  ~Variable_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given abstract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that the variable in the expression MUST have an associated value
+    in \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result is
+    computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  /*! \brief
+    Assigns a linear form to the variable with the same index of
+    \p *this in a given linear form abstract store.
+
+    \param lf The linear form assigned to the variable.
+    \param lf_store The linear form abstract store.
+
+    Note that once \p lf is assigned to a variable, all the other entries
+    of \p lf_store which contain that variable are discarded.
+  */
+  void linear_form_assign(const FP_Linear_Form& lf,
+                                FP_Linear_Form_Abstract_Store& lf_store) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Variable_Floating_Point_Expression& y);
+
+private:
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Variable_Floating_Point_Expression(
+                          const Variable_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Variable_Floating_Point_Expression& operator=(
+                          const Variable_Floating_Point_Expression& y);
+
+  //! The index of the variable.
+  dimension_type variable_index;
+
+}; // class Variable_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_inlines.hh line 1. */
+/* Variable_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Variable_Floating_Point_Expression(const dimension_type v_index)
+  : variable_index(v_index) {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Variable_Floating_Point_Expression() {}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Variable_Floating_Point_Expression& y) {
+  using std::swap;
+  swap(variable_index, y.variable_index);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store&,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  typename FP_Linear_Form_Abstract_Store::const_iterator
+           variable_value = lf_store.find(variable_index);
+
+  if (variable_value == lf_store.end()) {
+    result = FP_Linear_Form(Variable(variable_index));
+    return true;
+  }
+
+  result = FP_Linear_Form(variable_value->second);
+  return !this->overflows(result);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linear_form_assign(const FP_Linear_Form& lf,
+                           FP_Linear_Form_Abstract_Store& lf_store) const {
+  for (typename FP_Linear_Form_Abstract_Store::iterator
+         i = lf_store.begin(); i != lf_store.end(); ) {
+    if ((i->second).coefficient(Variable(variable_index)) != 0)
+      i = lf_store.erase(i);
+    else
+      ++i;
+  }
+  lf_store[variable_index] = lf;
+  return;
+}
+
+/*! \relates Variable_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Variable_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Variable_Floating_Point_Expression_defs.hh line 186. */
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Sum_Floating_Point_Expression class and
+   its   constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Sum Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of sum floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms and \f$\aslf\f$ a sound abstract operator on linear
+  forms such that:
+
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v \right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v \right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v} \right)v.
+  \f]
+
+  Given an expression \f$e_{1} \oplus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oplus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Sum_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the sum floating point expression
+    corresponding to \p x \f$\oplus\f$ \p y.
+  */
+  Sum_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+  //! Destructor.
+  ~Sum_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Sum_Floating_Point_Expression(
+         const Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Sum_Floating_Point_Expression<FP_Interval_Type,
+            FP_Format>& e);
+
+
+}; // class Sum_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_inlines.hh line 1. */
+/* Sum_Floating_Point_Expression class implementation: inline
+   functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Sum_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+  : first_operand(x), second_operand(y) {
+  assert(x != 0);
+  assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Sum_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Sum_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_templates.hh line 1. */
+/* Sum_Floating_Point_Expression class implementation:
+   non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Sum_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!first_operand->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                                linearized_second_operand))
+    return false;
+  result += linearized_second_operand;
+  relative_error(linearized_second_operand, rel_error);
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Sum_Floating_Point_Expression_defs.hh line 212. */
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Difference_Floating_Point_Expression class and
+   its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Difference Floating Point Expression.
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of difference floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adlf\f$ two sound abstract
+  operators on linear form such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \adifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$e_{1} \ominus e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,  we construct the interval linear form
+  \f$\linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  on \f$\cV\f$ as follows:
+  \f[
+  \linexprenv{e_{1} \ominus e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1]
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$ and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Difference_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the difference floating point
+    expression corresponding to \p x \f$\ominus\f$ \p y.
+  */
+  Difference_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+  //! Destructor.
+  ~Difference_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Difference_Floating_Point_Expression<FP_Interval_Type,
+                                                   FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Difference_Floating_Point_Expression(
+         const Difference_Floating_Point_Expression<FP_Interval_Type,
+                                                    FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited asssignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Difference_Floating_Point_Expression<FP_Interval_Type,
+                                                       FP_Format>& e);
+
+
+}; // class Difference_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_inlines.hh line 1. */
+/* Difference_Floating_Point_Expression class implementation: inline
+   functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Difference_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+  : first_operand(x), second_operand(y){
+  assert(x != 0);
+  assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Difference_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Difference_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_templates.hh line 1. */
+/* Difference_Floating_Point_Expression class implementation:
+   non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Difference_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!first_operand->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result += rel_error;
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                      linearized_second_operand))
+    return false;
+  result -= linearized_second_operand;
+  relative_error(linearized_second_operand, rel_error);
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Difference_Floating_Point_Expression_defs.hh line 220. */
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Multiplication_Floating_Point_Expression class and
+   its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Multiplication Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of multiplication floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\amlf\f$ two sound abstract
+  operators on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  i
+  \amlf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \amifp i'\right)
+  + \sum_{v \in \cV}\left(i \amifp i'_{v}\right)v.
+  \f]
+  Given an expression \f$[a, b] \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{[a, b] \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left([a, b]
+  \amlf
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}\right)
+  \aslf
+  \left([a, b]
+  \amlf
+  \varepsilon_{\mathbf{f}}\left(\linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1].
+  \f].
+
+  Given an expression \f$e_{1} \otimes [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{[a, b] \otimes e_{1}}{\rho^{\#}}{\rho^{\#}_l}.
+  \f]
+
+  Given an expression \f$e_{1} \otimes e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{\iota\left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}
+  \otimes e_{2}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+  method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+  and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+
+  Even though we intervalize the first operand in the above example, the
+  actual implementation utilizes an heuristics for choosing which of the two
+  operands must be intervalized in order to obtain the most precise result.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Multiplication_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the multiplication floating point
+    expression corresponding to \p x \f$\otimes\f$ \p y.
+  */
+  Multiplication_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y);
+
+  //! Destructor.
+  ~Multiplication_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor.
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                         const FP_Linear_Form_Abstract_Store& lf_store,
+                       FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+                                                       FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Multiplication_Floating_Point_Expression(
+         const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+                                                        FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Multiplication_Floating_Point_Expression<FP_Interval_Type,
+            FP_Format>& e);
+
+
+}; // class Multiplication_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_inlines.hh line 1. */
+/* Multiplication_Floating_Point_Expression class implementation: inline
+   functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_inlines.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Multiplication_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const x,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const y)
+  : first_operand(x), second_operand(y) {
+  assert(x != 0);
+  assert(y != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Multiplication_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Multiplication_Floating_Point_Expression<FP_Interval_Type,
+                                                  FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Multiplication_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_templates.hh line 1. */
+/* Multiplication_Floating_Point_Expression class implementation:
+   non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Multiplication_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  /*
+    FIXME: We currently adopt the "Interval-Size Local" strategy in order to
+    decide which of the two linear forms must be intervalized, as described
+    in Section 6.2.4 ("Multiplication Strategies") of Antoine Mine's Ph.D.
+    thesis "Weakly Relational Numerical Abstract Domains".
+    In this Section are also described other multiplication strategies, such
+    as All-Cases, Relative-Size Local, Simplification-Driven Global and
+    Homogeneity Global.
+  */
+
+  // Here we choose which of the two linear forms must be intervalized.
+
+  // true if we intervalize the first form, false if we intervalize the second.
+  bool intervalize_first;
+  FP_Linear_Form linearized_first_operand;
+  if (!first_operand->linearize(int_store, lf_store,
+                               linearized_first_operand))
+    return false;
+  FP_Interval_Type intervalized_first_operand;
+  this->intervalize(linearized_first_operand, int_store,
+                    intervalized_first_operand);
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                                linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  this->intervalize(linearized_second_operand, int_store,
+                    intervalized_second_operand);
+
+  // FIXME: we are not sure that what we do here is policy-proof.
+  if (intervalized_first_operand.is_bounded()) {
+    if (intervalized_second_operand.is_bounded()) {
+      boundary_type first_interval_size
+        = intervalized_first_operand.upper()
+        - intervalized_first_operand.lower();
+      boundary_type second_interval_size
+        = intervalized_second_operand.upper()
+        - intervalized_second_operand.lower();
+      if (first_interval_size <= second_interval_size)
+        intervalize_first = true;
+      else
+        intervalize_first = false;
+    }
+    else
+      intervalize_first = true;
+  }
+  else {
+    if (intervalized_second_operand.is_bounded())
+      intervalize_first = false;
+    else
+      return false;
+  }
+
+  // Here we do the actual computation.
+  // For optimizing, we store the relative error directly into result.
+  if (intervalize_first) {
+    relative_error(linearized_second_operand, result);
+    linearized_second_operand *= intervalized_first_operand;
+    result *= intervalized_first_operand;
+    result += linearized_second_operand;
+  }
+  else {
+    relative_error(linearized_first_operand, result);
+    linearized_first_operand *= intervalized_second_operand;
+    result *= intervalized_second_operand;
+    result += linearized_first_operand;
+  }
+
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Multiplication_Floating_Point_Expression_defs.hh line 250. */
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Division_Floating_Point_Expression class and its
+   constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+void swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Division Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearizationd of division floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ and
+  \f$i' + \sum_{v \in \cV}i'_{v}v \f$
+  be two linear forms, \f$\aslf\f$ and \f$\adivlf\f$ two sound abstract
+  operator on linear forms such that:
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \aslf
+  \left(i' + \sum_{v \in \cV}i'_{v}v\right)
+  =
+  \left(i \asifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \asifp i'_{v}\right)v,
+  \f]
+  \f[
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  \adivlf
+  i'
+  =
+  \left(i \adivifp i'\right)
+  + \sum_{v \in \cV}\left(i_{v} \adivifp i'\right)v.
+  \f]
+  Given an expression \f$e_{1} \oslash [a, b]\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$,
+  we construct the interval linear form
+  \f$
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  \f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash [a, b]}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \left(\linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \adivlf
+  [a, b]\right)
+  \aslf
+  \left(\varepsilon_{\mathbf{f}}\left(
+  \linexprenv{e_{1}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)
+  \adivlf
+  [a, b]\right)
+  \aslf
+  mf_{\mathbf{f}}[-1, 1],
+  \f]
+  given an expression \f$e_{1} \oslash e_{2}\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{e_{1} \oslash e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \linexprenv{e_{1} \oslash \iota\left(
+  \linexprenv{e_{2}}{\rho^{\#}}{\rho^{\#}_l}
+  \right)\rho^{\#}}{\rho^{\#}}{\rho^{\#}_l},
+  \f]
+  where \f$\varepsilon_{\mathbf{f}}(l)\f$ is the linear form computed by
+  calling method <CODE>Floating_Point_Expression::relative_error</CODE>
+  on \f$l\f$, \f$\iota(l)\rho^{\#}\f$ is the linear form computed by calling
+  method <CODE>Floating_Point_Expression::intervalize</CODE> on \f$l\f$
+  and \f$\rho^{\#}\f$, and \f$mf_{\mathbf{f}}\f$ is a rounding error defined in
+  <CODE>Floating_Point_Expression::absolute_error</CODE>.
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Division_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+     Alias for the Linear_Form<FP_Interval_Type> from
+     Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+     Alias for the Box<FP_Interval_Type> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>
+  ::FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+     Alias for the std::map<dimension_type, FP_Linear_Form> from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::boundary_type from
+     Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+     Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with two parameters: builds the division floating point
+    expression corresponding to \p num \f$\oslash\f$ \p den.
+  */
+  Division_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den);
+
+  //! Destructor.
+  ~Division_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expressions represented
+    by \p first_operand and \p second_operand MUST have an associated value in
+    \p int_store. If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Division_Floating_Point_Expression<FP_Interval_Type,
+                                                 FP_Format>& y);
+
+private:
+
+  //! Pointer to the first operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* first_operand;
+  //! Pointer to the second operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* second_operand;
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Copy constructor: temporary inhibited.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Division_Floating_Point_Expression(
+         const Division_Floating_Point_Expression<FP_Interval_Type,
+                                                  FP_Format>& e);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Assignment operator: temporary inhibited.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>&
+  operator=(const Division_Floating_Point_Expression<FP_Interval_Type,
+            FP_Format>& e);
+
+}; // class Division_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_inlines.hh line 1. */
+/* Division_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::Division_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const num,
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const den)
+  : first_operand(num), second_operand(den) {
+  assert(num != 0);
+  assert(den != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::~Division_Floating_Point_Expression() {
+  delete first_operand;
+  delete second_operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  using std::swap;
+  swap(first_operand, y.first_operand);
+  swap(second_operand, y.second_operand);
+}
+
+/*! \relates Division_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_templates.hh line 1. */
+/* Division_Floating_Point_Expression class implementation:
+   non-inline template functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+bool Division_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  FP_Linear_Form linearized_second_operand;
+  if (!second_operand->linearize(int_store, lf_store,
+                                linearized_second_operand))
+    return false;
+  FP_Interval_Type intervalized_second_operand;
+  this->intervalize(linearized_second_operand, int_store,
+                    intervalized_second_operand);
+
+  // Check if we may divide by zero.
+  if (intervalized_second_operand.lower() <= 0
+      && intervalized_second_operand.upper() >= 0)
+    return false;
+
+  if (!first_operand->linearize(int_store, lf_store, result))
+    return false;
+  FP_Linear_Form rel_error;
+  relative_error(result, rel_error);
+  result /= intervalized_second_operand;
+  rel_error /= intervalized_second_operand;
+  result += rel_error;
+  result += this->absolute_error;
+  return !this->overflows(result);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Division_Floating_Point_Expression_defs.hh line 236. */
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_defs.hh line 1. */
+/* Declarations for the Opposite_Floating_Point_Expression class and
+   its constituents.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_defs.hh line 31. */
+#include <map>
+
+namespace Parma_Polyhedra_Library {
+
+//! Swaps \p x with \p y.
+/*! \relates Opposite_Floating_Point_Expression */
+template<typename FP_Interval_Type, typename FP_Format>
+void swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+          Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y);
+
+/*! \brief
+  A generic Opposite Floating Point Expression.
+
+  \ingroup PPL_CXX_interface
+
+  \par Template type parameters
+
+  - The class template type parameter \p FP_Interval_Type represents the type
+  of the intervals used in the abstract domain.
+  - The class template type parameter \p FP_Format represents the floating
+  point format used in the concrete domain.
+
+  \par Linearization of opposite floating-point expressions
+
+  Let \f$i + \sum_{v \in \cV}i_{v}v \f$ be an interval linear form and
+  let \f$\adlf\f$ be a sound unary operator on linear forms such that:
+
+  \f[
+  \adlf
+  \left(i + \sum_{v \in \cV}i_{v}v\right)
+  =
+  \left(\adifp i\right)
+  + \sum_{v \in \cV}\left(\adifp i_{v} \right)v,
+  \f]
+
+  Given a floating point expression \f$\ominus e\f$ and a composite
+  abstract store \f$\left \llbracket \rho^{\#}, \rho^{\#}_l \right
+  \rrbracket\f$, we construct the interval linear form
+  \f$\linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}\f$
+  as follows:
+  \f[
+  \linexprenv{\ominus e}{\rho^{\#}}{\rho^{\#}_l}
+  =
+  \adlf
+  \left(
+  \linexprenv{e}{\rho^{\#}}{\rho^{\#}_l}
+  \right).
+  \f]
+*/
+template <typename FP_Interval_Type, typename FP_Format>
+class Opposite_Floating_Point_Expression
+  : public Floating_Point_Expression<FP_Interval_Type, FP_Format> {
+
+public:
+
+  /*! \brief
+    Alias for the Linear_Form<FP_Interval_Type> from
+    Floating_Point_Expression
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form FP_Linear_Form;
+
+  /*! \brief
+    Alias for the std::map<dimension_type, FP_Interval_Type> from
+    Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Interval_Abstract_Store FP_Interval_Abstract_Store;
+
+  /*! \brief
+    Alias for the std::map<dimension_type, FP_Linear_Form> from
+    Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+  FP_Linear_Form_Abstract_Store FP_Linear_Form_Abstract_Store;
+
+  /*! \brief
+    Alias for the FP_Interval_Type::boundary_type from
+    Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::boundary_type
+  boundary_type;
+
+  /*! \brief
+    Alias for the FP_Interval_Type::info_type from Floating_Point_Expression.
+  */
+  typedef typename
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>::info_type info_type;
+
+  //! \name Constructors and Destructor
+  //@{
+  /*! \brief
+    Constructor with one parameter: builds the opposite floating point
+    expression \f$\ominus\f$ \p op.
+  */
+  explicit Opposite_Floating_Point_Expression(
+           Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op);
+
+  //! Destructor.
+  ~Opposite_Floating_Point_Expression();
+
+  //@} // Constructors and Destructor
+
+  /*! \brief
+    Linearizes the expression in a given astract store.
+
+    Makes \p result become the linearization of \p *this in the given
+    composite abstract store.
+
+    \param int_store The interval abstract store.
+    \param lf_store The linear form abstract store.
+    \param result The modified linear form.
+
+    \return <CODE>true</CODE> if the linearization succeeded,
+    <CODE>false</CODE> otherwise.
+
+    Note that all variables occuring in the expression represented
+    by \p operand MUST have an associated value in \p int_store.
+    If this precondition is not met, calling the method
+    causes an undefined behavior.
+
+    See the class description for a detailed explanation of how \p result
+    is computed.
+  */
+  bool linearize(const FP_Interval_Abstract_Store& int_store,
+                 const FP_Linear_Form_Abstract_Store& lf_store,
+                 FP_Linear_Form& result) const;
+
+  //! Swaps \p *this with \p y.
+  void m_swap(Opposite_Floating_Point_Expression& y);
+
+private:
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited copy constructor.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Opposite_Floating_Point_Expression(
+                          const Opposite_Floating_Point_Expression& y);
+
+  #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  /*! \brief
+    Inhibited assignment operator.
+  */
+  #endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+  Opposite_Floating_Point_Expression& operator=(
+                          const Opposite_Floating_Point_Expression& y);
+
+  //! Pointer to the operand.
+  Floating_Point_Expression<FP_Interval_Type, FP_Format>* operand;
+
+}; // class Opposite_Floating_Point_Expression
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_inlines.hh line 1. */
+/* Opposite_Floating_Point_Expression class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+Opposite_Floating_Point_Expression(
+         Floating_Point_Expression<FP_Interval_Type, FP_Format>* const op)
+  : operand(op)
+{
+  assert(op != 0);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>::
+~Opposite_Floating_Point_Expression() {
+  delete operand;
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::m_swap(Opposite_Floating_Point_Expression& y) {
+  using std::swap;
+  swap(operand, y.operand);
+}
+
+template <typename FP_Interval_Type, typename FP_Format>
+inline bool
+Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>
+::linearize(const FP_Interval_Abstract_Store& int_store,
+            const FP_Linear_Form_Abstract_Store& lf_store,
+            FP_Linear_Form& result) const {
+  if (!operand->linearize(int_store, lf_store, result))
+    return false;
+
+  result.negate();
+  return true;
+}
+
+/*! \relates Opposite_Floating_Point_Expression */
+template <typename FP_Interval_Type, typename FP_Format>
+inline void
+swap(Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& x,
+     Opposite_Floating_Point_Expression<FP_Interval_Type, FP_Format>& y) {
+  x.m_swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Opposite_Floating_Point_Expression_defs.hh line 192. */
+
+/* Automatically generated from PPL source file ../src/Watchdog_defs.hh line 1. */
+/* Watchdog and associated classes' declaration and inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Watchdog_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+class Watchdog;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Time_defs.hh line 1. */
+/* Time class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Time_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Time;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Time_defs.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+bool operator==(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+bool operator!=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is shorter than \p y.
+bool operator<(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is shorter than
+  or equal to \p y.
+*/
+bool operator<=(const Time& x, const Time& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x is longer than \p y.
+bool operator>(const Time& x, const Time& y);
+
+/*! \brief
+  Returns <CODE>true</CODE> if and only if \p x is longer than
+  or equal to \p y.
+*/
+bool operator>=(const Time& x, const Time& y);
+
+//! Returns the sum of \p x and \p y.
+Time operator+(const Time& x, const Time& y);
+
+/*! \brief
+  Returns the difference of \p x and \p y or the null interval,
+  if \p x is shorter than \p y.
+*/
+Time operator-(const Time& x, const Time& y);
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Time {
+public:
+  //! Zero seconds.
+  Time();
+
+  //! Constructor taking a number of centiseconds.
+  explicit Time(long centisecs);
+
+  //! Constructor with seconds and microseconds.
+  Time(long s, long m);
+
+  /*! \brief
+    Returns the number of whole seconds contained in the represented
+    time interval.
+  */
+  long seconds() const;
+
+  /*! \brief
+    Returns the number of microseconds that, when added to the number
+    of seconds returned by seconds(), give the represent time interval.
+  */
+  long microseconds() const;
+
+  //! Adds \p y to \p *this.
+  Time& operator+=(const Time& y);
+
+  /*! \brief
+    Subtracts \p y from \p *this; if \p *this is shorter than \p y,
+    \p *this is set to the null interval.
+  */
+  Time& operator-=(const Time& y);
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! Number of microseconds in a second.
+  static const long USECS_PER_SEC = 1000000L;
+
+  //! Number of centiseconds in a second.
+  static const long CSECS_PER_SEC = 100L;
+
+  //! Number of seconds.
+  long secs;
+
+  //! Number of microseconds.
+  long microsecs;
+};
+
+/* Automatically generated from PPL source file ../src/Time_inlines.hh line 1. */
+/* Time class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Time::Time()
+  : secs(0), microsecs(0) {
+  assert(OK());
+}
+
+inline
+Time::Time(long centisecs)
+  : secs(centisecs / CSECS_PER_SEC),
+    microsecs((centisecs % CSECS_PER_SEC) * (USECS_PER_SEC/CSECS_PER_SEC)) {
+  assert(OK());
+}
+
+inline
+Time::Time(long s, long m)
+  : secs(s),
+    microsecs(m) {
+  if (microsecs >= USECS_PER_SEC) {
+    secs += microsecs / USECS_PER_SEC;
+    microsecs %= USECS_PER_SEC;
+  }
+  assert(OK());
+}
+
+inline long
+Time::seconds() const {
+  return secs;
+}
+
+inline long
+Time::microseconds() const {
+  return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+  long r_secs = secs + y.secs;
+  long r_microsecs = microsecs + y.microsecs;
+  if (r_microsecs >= USECS_PER_SEC) {
+    ++r_secs;
+    r_microsecs %= USECS_PER_SEC;
+  }
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time&
+Time::operator-=(const Time& y) {
+  long r_secs = secs - y.secs;
+  long r_microsecs = microsecs - y.microsecs;
+  if (r_microsecs < 0) {
+    --r_secs;
+    r_microsecs += USECS_PER_SEC;
+  }
+  if (r_secs < 0) {
+    r_secs = 0;
+    r_microsecs = 0;
+  }
+  secs = r_secs;
+  microsecs = r_microsecs;
+  assert(OK());
+  return *this;
+}
+
+inline Time
+operator+(const Time& x, const Time& y) {
+  Time z = x;
+  z += y;
+  return z;
+}
+
+inline Time
+operator-(const Time& x, const Time& y) {
+  Time z = x;
+  z -= y;
+  return z;
+}
+
+inline bool
+operator==(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() == y.seconds() && y.microseconds() == y.microseconds();
+}
+
+inline bool
+operator!=(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return !(x == y);
+}
+
+inline bool
+operator<(const Time& x, const Time& y) {
+  assert(x.OK() && y.OK());
+  return x.seconds() < y.seconds()
+    || (x.seconds() == y.seconds() && x.microseconds() < y.microseconds());
+}
+
+inline bool
+operator<=(const Time& x, const Time& y) {
+  return x < y || x == y;
+}
+
+inline bool
+operator>(const Time& x, const Time& y) {
+  return y < x;
+}
+
+inline bool
+operator>=(const Time& x, const Time& y) {
+  return y <= x;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Time_defs.hh line 125. */
+
+/* Automatically generated from PPL source file ../src/Handler_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_List_defs.hh line 1. */
+/* Pending_List class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pending_List_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+class Pending_List;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_Element_defs.hh line 1. */
+/* Pending_Element class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Pending_Element_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <class Threshold>
+class Pending_Element;
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_defs.hh line 1. */
+/* Doubly_Linked_Object class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+class Doubly_Linked_Object;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_defs.hh line 30. */
+
+//! A (base) class for doubly linked objects.
+class Parma_Polyhedra_Library::Implementation::Doubly_Linked_Object {
+public:
+  //! Default constructor.
+  Doubly_Linked_Object();
+
+  //! Creates a chain element with forward link \p f and backward link \p b.
+  Doubly_Linked_Object(Doubly_Linked_Object* f, Doubly_Linked_Object* b);
+
+  //! Inserts \p y before \p *this.
+  void insert_before(Doubly_Linked_Object& y);
+
+  //! Inserts \p y after \p *this.
+  void insert_after(Doubly_Linked_Object& y);
+
+  //! Erases \p *this from the chain and returns a pointer to the next element.
+  Doubly_Linked_Object* erase();
+
+  //! Erases \p *this from the chain.
+  ~Doubly_Linked_Object();
+
+private:
+  //! Forward link.
+  Doubly_Linked_Object* next;
+
+  //! Backward link.
+  Doubly_Linked_Object* prev;
+
+  template <typename T> friend class EList;
+  template <typename T> friend class EList_Iterator;
+};
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_inlines.hh line 1. */
+/* Doubly_Linked_Object class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object() {
+}
+
+inline
+Doubly_Linked_Object::Doubly_Linked_Object(Doubly_Linked_Object* f,
+                                           Doubly_Linked_Object* b)
+  : next(f),
+    prev(b) {
+}
+
+inline void
+Doubly_Linked_Object::insert_before(Doubly_Linked_Object& y) {
+  y.next = this;
+  y.prev = prev;
+  prev->next = &y;
+  prev = &y;
+}
+
+inline void
+Doubly_Linked_Object::insert_after(Doubly_Linked_Object& y) {
+  y.next = next;
+  y.prev = this;
+  next->prev = &y;
+  next = &y;
+}
+
+inline Doubly_Linked_Object*
+Doubly_Linked_Object::erase() {
+  next->prev = prev;
+  prev->next = next;
+  return next;
+}
+
+inline
+Doubly_Linked_Object::~Doubly_Linked_Object() {
+  erase();
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Doubly_Linked_Object_defs.hh line 64. */
+
+/* Automatically generated from PPL source file ../src/Pending_Element_defs.hh line 30. */
+
+//! A class for pending watchdog events with embedded links.
+/*!
+  Each pending watchdog event is characterized by a deadline (a positive
+  time interval), an associated handler that will be invoked upon event
+  expiration, and a Boolean flag that indicates whether the event has already
+  expired or not.
+*/
+template <typename Threshold>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_Element
+  : public Doubly_Linked_Object {
+public:
+  //! Constructs an element with the given attributes.
+  Pending_Element(const Threshold& deadline,
+                  const Handler& handler,
+                  bool& expired_flag);
+
+  //! Modifies \p *this so that it has the given attributes.
+  void assign(const Threshold& deadline,
+              const Handler& handler,
+              bool& expired_flag);
+
+  //! Returns the deadline of the event.
+  const Threshold& deadline() const;
+
+  //! Returns the handler associated to the event.
+  const Handler& handler() const;
+
+  //! Returns a reference to the "event-expired" flag.
+  bool& expired_flag() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  //! The deadline of the event.
+  Threshold d;
+
+  //! A pointer to the handler associated to the event.
+  const Handler* p_h;
+
+  //! A pointer to a flag saying whether the event has already expired or not.
+  bool* p_f;
+};
+
+/* Automatically generated from PPL source file ../src/Pending_Element_inlines.hh line 1. */
+/* Pending_Element class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Threshold>
+inline bool
+Pending_Element<Threshold>::OK() const {
+  return true;
+}
+
+template <typename Threshold>
+inline
+Pending_Element<Threshold>::Pending_Element(const Threshold& deadline,
+                                            const Handler& handler,
+                                            bool& expired_flag)
+  : d(deadline), p_h(&handler), p_f(&expired_flag) {
+  assert(OK());
+}
+
+template <typename Threshold>
+inline void
+Pending_Element<Threshold>::assign(const Threshold& deadline,
+                                   const Handler& handler,
+                                   bool& expired_flag) {
+  d = deadline;
+  p_h = &handler;
+  p_f = &expired_flag;
+  assert(OK());
+}
+
+template <typename Threshold>
+inline const Threshold&
+Pending_Element<Threshold>::deadline() const {
+  return d;
+}
+
+template <typename Threshold>
+inline const Handler&
+Pending_Element<Threshold>::handler() const {
+  return *p_h;
+}
+
+template <typename Threshold>
+inline bool&
+Pending_Element<Threshold>::expired_flag() const {
+  return *p_f;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_Element_defs.hh line 76. */
+
+/* Automatically generated from PPL source file ../src/EList_defs.hh line 1. */
+/* EList class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_defs.hh line 1. */
+/* EList_Iterator class declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_defs.hh line 29. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+template <typename T>
+bool operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+template <typename T>
+bool operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y);
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList_Iterator {
+public:
+  //! Constructs an iterator pointing to nothing.
+  EList_Iterator();
+
+  //! Constructs an iterator pointing to \p p.
+  explicit EList_Iterator(Doubly_Linked_Object* p);
+
+  //! Changes \p *this so that it points to \p p.
+  EList_Iterator& operator=(Doubly_Linked_Object* p);
+
+  //! Indirect member selector.
+  T* operator->();
+
+  //! Dereference operator.
+  T& operator*();
+
+  //! Preincrement operator.
+  EList_Iterator& operator++();
+
+  //! Postincrement operator.
+  EList_Iterator operator++(int);
+
+  //! Predecrement operator.
+  EList_Iterator& operator--();
+
+  //! Postdecrement operator.
+  EList_Iterator operator--(int);
+
+private:
+  //! Embedded pointer.
+  Doubly_Linked_Object* ptr;
+
+  friend bool operator==<T>(const EList_Iterator& x, const EList_Iterator& y);
+
+  friend bool operator!=<T>(const EList_Iterator& x, const EList_Iterator& y);
+};
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_inlines.hh line 1. */
+/* EList_Iterator class implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_inlines.hh line 28. */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator() {
+}
+
+template <typename T>
+inline
+EList_Iterator<T>::EList_Iterator(Doubly_Linked_Object* p)
+  : ptr(p) {
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator=(Doubly_Linked_Object* p) {
+  ptr = p;
+  return *this;
+}
+
+template <typename T>
+inline T*
+EList_Iterator<T>::operator->() {
+  return static_cast<T*>(ptr);
+}
+
+template <typename T>
+inline T&
+EList_Iterator<T>::operator*() {
+  return *operator->();
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator++() {
+  ptr = ptr->next;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator++(int) {
+  EList_Iterator tmp = *this;
+  ++*this;
+  return tmp;
+}
+
+template <typename T>
+inline EList_Iterator<T>&
+EList_Iterator<T>::operator--() {
+  ptr = ptr->prev;
+  return *this;
+}
+
+template <typename T>
+inline EList_Iterator<T>
+EList_Iterator<T>::operator--(int) {
+  EList_Iterator tmp = *this;
+  --*this;
+  return tmp;
+}
+
+template <typename T>
+inline bool
+operator==(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr == y.ptr;
+}
+
+template <typename T>
+inline bool
+operator!=(const EList_Iterator<T>& x, const EList_Iterator<T>& y) {
+  return x.ptr != y.ptr;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_Iterator_defs.hh line 87. */
+
+/* Automatically generated from PPL source file ../src/EList_defs.hh line 30. */
+
+/*! \brief
+  A simple kind of embedded list (i.e., a doubly linked objects
+  where the links are embedded in the objects themselves).
+*/
+template <typename T>
+class Parma_Polyhedra_Library::Implementation::EList
+  : private Doubly_Linked_Object {
+public:
+  //! A const iterator to traverse the list.
+  typedef EList_Iterator<const T> const_iterator;
+
+  //! A non-const iterator to traverse the list.
+  typedef EList_Iterator<T> iterator;
+
+  //! Constructs an empty list.
+  EList();
+
+  //! Destructs the list and all the elements in it.
+  ~EList();
+
+  //! Pushes \p obj to the front of the list.
+  void push_front(T& obj);
+
+  //! Pushes \p obj to the back of the list.
+  void push_back(T& obj);
+
+  /*! \brief
+    Inserts \p obj just before \p position and returns an iterator
+    that points to the inserted object.
+  */
+  iterator insert(iterator position, T& obj);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  iterator erase(iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  iterator end();
+
+  //! Returns a const iterator pointing to the beginning of the list.
+  const_iterator begin() const;
+
+  //! Returns a const iterator pointing one past the last element in the list.
+  const_iterator end() const;
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+};
+
+/* Automatically generated from PPL source file ../src/EList_inlines.hh line 1. */
+/* EList class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename T>
+inline
+EList<T>::EList()
+  : Doubly_Linked_Object(this, this) {
+}
+
+template <typename T>
+inline void
+EList<T>::push_front(T& obj) {
+  next->insert_before(obj);
+}
+
+template <typename T>
+inline void
+EList<T>::push_back(T& obj) {
+  prev->insert_after(obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::insert(iterator position, T& obj) {
+  position->insert_before(obj);
+  return iterator(&obj);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::begin() {
+  return iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::end() {
+  return iterator(this);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::begin() const {
+  return const_iterator(next);
+}
+
+template <typename T>
+inline typename EList<T>::const_iterator
+EList<T>::end() const {
+  return const_iterator(const_cast<EList<T>*>(this));
+}
+
+template <typename T>
+inline bool
+EList<T>::empty() const {
+  return begin() == end();
+}
+
+template <typename T>
+inline typename EList<T>::iterator
+EList<T>::erase(iterator position) {
+  assert(!empty());
+  return iterator(position->erase());
+}
+
+template <typename T>
+inline
+EList<T>::~EList() {
+  // Erase and deallocate all the elements.
+  for (iterator i = begin(), lend = end(), next; i != lend; i = next) {
+    next = erase(i);
+    delete &*i;
+  }
+}
+
+template <typename T>
+inline bool
+EList<T>::OK() const {
+  for (const_iterator i = begin(), lend = end(); i != lend; ++i)
+    if (!i->OK())
+      return false;
+
+  return true;
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/EList_defs.hh line 89. */
+
+/* Automatically generated from PPL source file ../src/Pending_List_defs.hh line 31. */
+
+//! An ordered list for recording pending watchdog events.
+template <typename Traits>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Pending_List {
+public:
+  //! A non-const iterator to traverse the list.
+  typedef typename EList<Pending_Element<typename Traits::Threshold> >::iterator iterator;
+
+  //! A const iterator to traverse the list.
+  typedef typename EList<Pending_Element<typename Traits::Threshold> >::const_iterator const_iterator;
+
+  //! Constructs an empty list.
+  Pending_List();
+
+  //! Destructor.
+  ~Pending_List();
+
+  //! Inserts a new Pending_Element object with the given attributes.
+  iterator insert(const typename Traits::Threshold& deadline,
+                  const Handler& handler,
+                  bool& expired_flag);
+
+  /*! \brief
+    Removes the element pointed to by \p position, returning
+    an iterator pointing to the next element, if any, or end(), otherwise.
+  */
+  iterator erase(iterator position);
+
+  //! Returns <CODE>true</CODE> if and only if the list is empty.
+  bool empty() const;
+
+  //! Returns an iterator pointing to the beginning of the list.
+  iterator begin();
+
+  //! Returns an iterator pointing one past the last element in the list.
+  iterator end();
+
+  //! Checks if all the invariants are satisfied.
+  bool OK() const;
+
+private:
+  EList<Pending_Element<typename Traits::Threshold> > active_list;
+  EList<Pending_Element<typename Traits::Threshold> > free_list;
+};
+
+/* Automatically generated from PPL source file ../src/Pending_List_inlines.hh line 1. */
+/* Pending_List class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+inline
+Pending_List<Traits>::Pending_List()
+  : active_list(),
+    free_list() {
+  assert(OK());
+}
+
+template <typename Traits>
+inline
+Pending_List<Traits>::~Pending_List() {
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::begin() {
+  return active_list.begin();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::end() {
+  return active_list.end();
+}
+
+template <typename Traits>
+inline bool
+Pending_List<Traits>::empty() const {
+  return active_list.empty();
+}
+
+template <typename Traits>
+inline typename Pending_List<Traits>::iterator
+Pending_List<Traits>::erase(iterator position) {
+  assert(!empty());
+  iterator next = active_list.erase(position);
+  free_list.push_back(*position);
+  assert(OK());
+  return next;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_List_templates.hh line 1. */
+/* Pending_List class implementation.
+*/
+
+
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+template <typename Traits>
+typename Pending_List<Traits>::iterator
+Pending_List<Traits>::insert(const typename Traits::Threshold& deadline,
+                             const Handler& handler,
+                             bool& expired_flag) {
+  iterator position = active_list.begin();
+  for (iterator active_list_end = active_list.end();
+       position != active_list_end
+         && Traits::less_than(position->deadline(), deadline);
+       ++position)
+    ;
+  iterator pending_element_p;
+  // Only allocate a new element if the free list is empty.
+  if (free_list.empty())
+    pending_element_p
+      = new Pending_Element<typename Traits::Threshold>(deadline,
+                                                        handler,
+                                                        expired_flag);
+  else {
+    pending_element_p = free_list.begin();
+    free_list.erase(pending_element_p);
+    pending_element_p->assign(deadline, handler, expired_flag);
+  }
+  iterator r = active_list.insert(position, *pending_element_p);
+  assert(OK());
+  return r;
+}
+
+template <typename Traits>
+bool
+Pending_List<Traits>::OK() const {
+  if (!active_list.OK())
+    return false;
+
+  if (!free_list.OK())
+    return false;
+
+  const typename Traits::Threshold* old;
+  const_iterator i = active_list.begin();
+  old = &i->deadline();
+  ++i;
+  for (const_iterator active_list_end = active_list.end(); i != active_list_end; ++i) {
+    const typename Traits::Threshold& t = i->deadline();
+    if (Traits::less_than(t, *old)) {
+#ifndef NDEBUG
+      std::cerr << "The active list is not sorted!"
+                << std::endl;
+#endif
+      return false;
+    }
+    old = &t;
+  }
+  return true;
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Pending_List_defs.hh line 78. */
+
+/* Automatically generated from PPL source file ../src/Watchdog_defs.hh line 31. */
+#include <cassert>
+#include <functional>
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PPL_handle_timeout(int signum);
+
+struct Watchdog_Traits {
+  typedef Implementation::Watchdog::Time Threshold;
+  static bool less_than(const Threshold& a, const Threshold& b) {
+    return a < b;
+  }
+};
+
+//! A watchdog timer.
+class Watchdog {
+public:
+  template <typename Flag_Base, typename Flag>
+  Watchdog(long csecs, const Flag_Base* volatile& holder, Flag& flag);
+
+  /*! \brief
+    Constructor: if not reset, the watchdog will trigger after \p csecs
+    centiseconds, invoking handler \p function.
+  */
+  Watchdog(long csecs, void (* const function)());
+
+  //! Destructor.
+  ~Watchdog();
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+  //! Static class initialization.
+  static void initialize();
+  //! Static class finalization.
+  static void finalize();
+
+private:
+  //! Whether or not this watchdog has expired.
+  bool expired;
+
+  typedef Implementation::Watchdog::Pending_List<Watchdog_Traits>
+  WD_Pending_List;
+
+  typedef Implementation::Watchdog::Handler
+  WD_Handler;
+
+  const WD_Handler& handler;
+  WD_Pending_List::iterator pending_position;
+
+  // Private and not implemented: copy construction is not allowed.
+  Watchdog(const Watchdog&);
+  // Private and not implemented: copy assignment is not allowed.
+  Watchdog& operator=(const Watchdog&);
+
+  // Pass this to getitimer().
+  static itimerval current_timer_status;
+
+  //! Reads the timer value into \p time.
+  static void get_timer(Implementation::Watchdog::Time& time);
+
+  // Pass this to setitimer().
+  static itimerval signal_once;
+
+  // Last time value we set the timer to.
+  static Implementation::Watchdog::Time last_time_requested;
+
+  //! Sets the timer value to \p time.
+  static void set_timer(const Implementation::Watchdog::Time& time);
+
+  //! Stops the timer.
+  static void stop_timer();
+
+  //! Quick reschedule to avoid race conditions.
+  static void reschedule();
+
+  // Used by the above.
+  static Implementation::Watchdog::Time reschedule_time;
+
+  // Records the time elapsed since last fresh start.
+  static Implementation::Watchdog::Time time_so_far;
+
+  //! The ordered queue of pending watchdog events.
+  static WD_Pending_List pending;
+
+  //! The actual signal handler.
+  static void handle_timeout(int);
+
+  //! Handles the addition of a new watchdog event.
+  static WD_Pending_List::iterator
+  new_watchdog_event(long csecs,
+                     const WD_Handler& handler,
+                     bool& expired_flag);
+
+  //! Handles the removal of the watchdog event referred by \p position.
+  void remove_watchdog_event(WD_Pending_List::iterator position);
+
+  //! Whether the alarm clock is running.
+  static volatile bool alarm_clock_running;
+
+  //! Whether we are changing data that is also changed by the signal handler.
+  static volatile bool in_critical_section;
+
+  friend void PPL_handle_timeout(int signum);
+
+#endif // PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+};
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Watchdog_inlines.hh line 1. */
+/* Watchdog and associated classes' implementation: inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Handler_defs.hh line 1. */
+/* Handler and derived classes' declaration.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Handler_defs.hh line 28. */
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler {
+public:
+  //! Does the job.
+  virtual void act() const = 0;
+
+  //! Virtual destructor.
+  virtual ~Handler();
+};
+
+//! A kind of Handler that installs a flag onto a flag-holder.
+/*!
+  The template class <CODE>Handler_Flag\<Flag_Base, Flag\></CODE>
+  is an handler whose job is to install a flag onto an <EM>holder</EM>
+  for the flag.
+  The flag is of type \p Flag and the holder is a (volatile) pointer
+  to \p Flag_Base.  Installing the flag onto the holder means making
+  the holder point to the flag, so that it must be possible to assign
+  a value of type <CODE>Flag*</CODE> to an entity of type
+  <CODE>Flag_Base*</CODE>.
+  The class \p Flag must provide the method
+
+  \code
+    int priority() const
+  \endcode
+  returning an integer priority associated to the flag.
+
+  The handler will install its flag onto the holder only if the holder
+  is empty, namely, it is the null pointer, or if the holder holds a
+  flag of strictly lower priority.
+ */
+template <typename Flag_Base, typename Flag>
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Flag
+  : public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+  /*! \brief
+    Does its job: installs the flag onto the holder, if a flag with
+    an higher priority has not already been installed.
+  */
+  virtual void act() const;
+
+private:
+  // declare holder as reference to volatile pointer to const Flag_Base
+  const Flag_Base* volatile& h;
+  Flag& f;
+};
+
+//! A kind of Handler calling a given function.
+class Parma_Polyhedra_Library::Implementation::Watchdog::Handler_Function
+  : public Handler {
+public:
+  //! Constructor with a given function.
+  Handler_Function(void (* const function)());
+
+  //! Does its job: calls the embedded function.
+  virtual void act() const;
+
+private:
+  //! Pointer to the embedded function.
+  void (* const f)();
+};
+
+/* Automatically generated from PPL source file ../src/Handler_inlines.hh line 1. */
+/* Handler and derived classes' implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Watchdog {
+
+inline
+Handler::~Handler() {
+}
+
+template <typename Flag_Base, typename Flag>
+Handler_Flag<Flag_Base, Flag>::Handler_Flag(const Flag_Base* volatile& holder,
+                                            Flag& flag)
+  : h(holder), f(flag) {
+}
+
+template <typename Flag_Base, typename Flag>
+void
+Handler_Flag<Flag_Base, Flag>::act() const {
+  if (h == 0 || static_cast<const Flag&>(*h).priority() < f.priority())
+    h = &f;
+}
+
+inline
+Handler_Function::Handler_Function(void (* const function)())
+  : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+  (*f)();
+}
+
+} // namespace Watchdog
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Handler_defs.hh line 95. */
+
+/* Automatically generated from PPL source file ../src/Watchdog_inlines.hh line 28. */
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+#if PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long csecs,
+                   const Flag_Base* volatile& holder,
+                   Flag& flag)
+  : expired(false),
+    handler(*new
+            Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+                                                                    flag)) {
+  if (csecs == 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+                                " non-positive number of centiseconds");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(csecs, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(long csecs, void (* const function)())
+  : expired(false),
+    handler(*new Implementation::Watchdog::Handler_Function(function)) {
+  if (csecs == 0)
+    throw std::invalid_argument("Watchdog constructor called with a"
+                                " non-positive number of centiseconds");
+  in_critical_section = true;
+  pending_position = new_watchdog_event(csecs, handler, expired);
+  in_critical_section = false;
+}
+
+inline
+Watchdog::~Watchdog() {
+  if (!expired) {
+    in_critical_section = true;
+    remove_watchdog_event(pending_position);
+    in_critical_section = false;
+  }
+  delete &handler;
+}
+
+inline void
+Watchdog::reschedule() {
+  set_timer(reschedule_time);
+}
+
+#else // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(long /* csecs */,
+                   const Flag_Base* volatile& /* holder */,
+                   Flag& /* flag */) {
+  throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+                         " system does not provide setitimer()");
+}
+
+inline
+Watchdog::Watchdog(long /* csecs */, void (* /* function */)()) {
+  throw std::logic_error("PPL::Watchdog::Watchdog objects not supported:"
+                         " system does not provide setitimer()");
+}
+
+inline
+Watchdog::~Watchdog() {
+}
+
+#endif // !PPL_HAVE_DECL_SETITIMER !! !PPL_HAVE_DECL_SIGACTION
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Watchdog_defs.hh line 146. */
+
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_defs.hh line 1. */
+/* Threshold_Watcher and associated classes' declaration and inline functions.
+*/
+
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_types.hh line 1. */
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+class Threshold_Watcher;
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_defs.hh line 30. */
+#include <cassert>
+
+/*! \brief
+  A class of watchdogs controlling the exceeding of a threshold.
+
+  \tparam Traits
+  A class to set data types and functions for the threshold handling.
+  See \c Parma_Polyhedra_Library::Weightwatch_Traits for an example.
+*/
+template <typename Traits>
+class Parma_Polyhedra_Library::Threshold_Watcher {
+public:
+  template <typename Flag_Base, typename Flag>
+  Threshold_Watcher(const typename Traits::Delta& delta,
+                    const Flag_Base* volatile& holder,
+                    Flag& flag);
+
+  Threshold_Watcher(const typename Traits::Delta& delta,
+                    void (*function)());
+
+  ~Threshold_Watcher();
+
+private:
+  typedef Implementation::Watchdog::Pending_List<Traits> TW_Pending_List;
+  typedef Implementation::Watchdog::Handler TW_Handler;
+
+  bool expired;
+  const TW_Handler& handler;
+  typename TW_Pending_List::iterator pending_position;
+
+  // Just to prevent their use.
+  Threshold_Watcher(const Threshold_Watcher&);
+  Threshold_Watcher& operator=(const Threshold_Watcher&);
+
+  struct Initialize {
+    //! The ordered queue of pending thresholds.
+    TW_Pending_List pending;
+  };
+  static Initialize init;
+
+  // Handle the addition of a new threshold.
+  static typename TW_Pending_List::iterator
+  add_threshold(typename Traits::Threshold threshold,
+                const TW_Handler& handler,
+                bool& expired_flag);
+
+  // Handle the removal of a threshold.
+  static typename TW_Pending_List::iterator
+  remove_threshold(typename TW_Pending_List::iterator position);
+
+  //! Check threshold reaching.
+  static void check();
+
+}; // class Parma_Polyhedra_Library::Threshold_Watcher
+
+
+// Templatic initialization of static data member.
+template <typename Traits>
+typename
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::Initialize
+Parma_Polyhedra_Library::Threshold_Watcher<Traits>::init;
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_inlines.hh line 1. */
+/* Threshold_Watcher and associated classes' implementation: inline functions.
+*/
+
+
+#include <stdexcept>
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_inlines.hh line 30. */
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+template <typename Flag_Base, typename Flag>
+Threshold_Watcher<Traits>
+::Threshold_Watcher(const typename Traits::Delta& delta,
+                    const Flag_Base* volatile& holder,
+                    Flag& flag)
+  : expired(false),
+    handler(*new
+            Implementation::Watchdog::Handler_Flag<Flag_Base, Flag>(holder,
+                                                                    flag)) {
+  typename Traits::Threshold threshold;
+  Traits::from_delta(threshold, delta);
+  if (!Traits::less_than(Traits::get(), threshold))
+    throw std::invalid_argument("Threshold_Watcher constructor called with a"
+                                " threshold already reached");
+  pending_position = add_threshold(threshold, handler, expired);
+}
+
+template <typename Traits>
+inline
+Threshold_Watcher<Traits>::Threshold_Watcher(const typename Traits::Delta& delta, void (*function)())
+  : expired(false),
+    handler(*new Implementation::Watchdog::Handler_Function(function)) {
+  typename Traits::Threshold threshold;
+  Traits::from_delta(threshold, delta);
+  if (!Traits::less_than(Traits::get(), threshold))
+    throw std::invalid_argument("Threshold_Watcher constructor called with a"
+                                " threshold already reached");
+  pending_position = add_threshold(threshold, handler, expired);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_templates.hh line 1. */
+/* Threshold_Watcher and associated classes'.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>::add_threshold(typename Traits::Threshold threshold,
+                                         const TW_Handler& handler,
+                                         bool& expired_flag) {
+  Traits::check_function = Threshold_Watcher::check;
+  return init.pending.insert(threshold, handler, expired_flag);
+}
+
+template <typename Traits>
+typename Threshold_Watcher<Traits>::TW_Pending_List::iterator
+Threshold_Watcher<Traits>
+::remove_threshold(typename TW_Pending_List::iterator position) {
+  typename TW_Pending_List::iterator i = init.pending.erase(position);
+  if (init.pending.empty())
+    Traits::check_function = 0;
+  return i;
+}
+
+template <typename Traits>
+Threshold_Watcher<Traits>::~Threshold_Watcher() {
+  if (!expired)
+    remove_threshold(pending_position);
+  delete &handler;
+}
+
+template <typename Traits>
+void
+Threshold_Watcher<Traits>::check() {
+  typename TW_Pending_List::iterator i = init.pending.begin();
+  assert(i != init.pending.end());
+  const typename Traits::Threshold& current = Traits::get();
+  while (!Traits::less_than(current, i->deadline())) {
+    i->handler().act();
+    i->expired_flag() = true;
+    i = remove_threshold(i);
+    if (i == init.pending.end())
+      break;
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/* Automatically generated from PPL source file ../src/Threshold_Watcher_defs.hh line 94. */
+
+
+
+//! Defined to 1 if PPL::Watchdog objects are supported, to 0 otherwise.
+#define PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED \
+  (PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION)
+
+#undef PPL_SPECIALIZE_ABS
+#undef PPL_SPECIALIZE_ADD
+#undef PPL_SPECIALIZE_ADD_MUL
+#undef PPL_SPECIALIZE_ASSIGN
+#undef PPL_SPECIALIZE_ASSIGN_SPECIAL
+#undef PPL_SPECIALIZE_CEIL
+#undef PPL_SPECIALIZE_CLASSIFY
+#undef PPL_SPECIALIZE_CMP
+#undef PPL_SPECIALIZE_CONSTRUCT
+#undef PPL_SPECIALIZE_CONSTRUCT_SPECIAL
+#undef PPL_SPECIALIZE_COPY
+#undef PPL_SPECIALIZE_DIV
+#undef PPL_SPECIALIZE_DIV2EXP
+#undef PPL_SPECIALIZE_FLOOR
+#undef PPL_SPECIALIZE_FUN1_0_0
+#undef PPL_SPECIALIZE_FUN1_0_1
+#undef PPL_SPECIALIZE_FUN1_0_2
+#undef PPL_SPECIALIZE_FUN1_0_3
+#undef PPL_SPECIALIZE_FUN1_1_1
+#undef PPL_SPECIALIZE_FUN1_1_2
+#undef PPL_SPECIALIZE_FUN1_2_2
+#undef PPL_SPECIALIZE_FUN2_0_0
+#undef PPL_SPECIALIZE_FUN2_0_1
+#undef PPL_SPECIALIZE_FUN2_0_2
+#undef PPL_SPECIALIZE_FUN3_0_1
+#undef PPL_SPECIALIZE_FUN5_0_1
+#undef PPL_SPECIALIZE_GCD
+#undef PPL_SPECIALIZE_GCDEXT
+#undef PPL_SPECIALIZE_IDIV
+#undef PPL_SPECIALIZE_INPUT
+#undef PPL_SPECIALIZE_IS_INT
+#undef PPL_SPECIALIZE_IS_MINF
+#undef PPL_SPECIALIZE_IS_NAN
+#undef PPL_SPECIALIZE_IS_PINF
+#undef PPL_SPECIALIZE_LCM
+#undef PPL_SPECIALIZE_MUL
+#undef PPL_SPECIALIZE_MUL2EXP
+#undef PPL_SPECIALIZE_NEG
+#undef PPL_SPECIALIZE_OUTPUT
+#undef PPL_SPECIALIZE_REM
+#undef PPL_SPECIALIZE_SGN
+#undef PPL_SPECIALIZE_SQRT
+#undef PPL_SPECIALIZE_SUB
+#undef PPL_SPECIALIZE_SUB_MUL
+#undef PPL_SPECIALIZE_TRUNC
+
+#undef PPL_COMPILE_TIME_CHECK
+#undef PPL_COMPILE_TIME_CHECK_AUX
+#undef PPL_COMPILE_TIME_CHECK_NAME
+
+#ifdef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS
+#endif
+#ifdef PPL_SAVE_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS PPL_SAVE_STDC_LIMIT_MACROS
+# undef PPL_SAVE_STDC_LIMIT_MACROS
+#endif
+
+#ifdef PPL_SAVE_NDEBUG
+# ifndef NDEBUG
+#  define NDEBUG PPL_SAVE_NDEBUG
+# endif
+# undef PPL_SAVE_NDEBUG
+#else
+# ifdef NDEBUG
+#  undef NDEBUG
+# endif
+#endif
+// Must include <cassert> again in order to make the latest changes to
+// NDEBUG effective.
+#include <cassert>
+
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION
+#endif
+
+#endif // !defined(PPL_ppl_hh)
diff --git a/src/ppl_header.hh b/src/ppl_header.hh
new file mode 100644
index 0000000..ca25513
--- /dev/null
+++ b/src/ppl_header.hh
@@ -0,0 +1,121 @@
+/* This is the header file of the Parma Polyhedra Library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG NDEBUG
+# undef NDEBUG
+#endif
+
+#ifdef __STDC_LIMIT_MACROS
+# define PPL_SAVE_STDC_LIMIT_MACROS __STDC_LIMIT_MACROS
+#endif
+
+#include "ppl-config.h"
+#include "version.hh"
+#include "ppl_include_files.hh"
+
+//! Defined to 1 if PPL::Watchdog objects are supported, to 0 otherwise.
+#define PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED \
+  (PPL_HAVE_DECL_SETITIMER && PPL_HAVE_DECL_SIGACTION)
+
+#undef PPL_SPECIALIZE_ABS
+#undef PPL_SPECIALIZE_ADD
+#undef PPL_SPECIALIZE_ADD_MUL
+#undef PPL_SPECIALIZE_ASSIGN
+#undef PPL_SPECIALIZE_ASSIGN_SPECIAL
+#undef PPL_SPECIALIZE_CEIL
+#undef PPL_SPECIALIZE_CLASSIFY
+#undef PPL_SPECIALIZE_CMP
+#undef PPL_SPECIALIZE_CONSTRUCT
+#undef PPL_SPECIALIZE_CONSTRUCT_SPECIAL
+#undef PPL_SPECIALIZE_COPY
+#undef PPL_SPECIALIZE_DIV
+#undef PPL_SPECIALIZE_DIV2EXP
+#undef PPL_SPECIALIZE_FLOOR
+#undef PPL_SPECIALIZE_FUN1_0_0
+#undef PPL_SPECIALIZE_FUN1_0_1
+#undef PPL_SPECIALIZE_FUN1_0_2
+#undef PPL_SPECIALIZE_FUN1_0_3
+#undef PPL_SPECIALIZE_FUN1_1_1
+#undef PPL_SPECIALIZE_FUN1_1_2
+#undef PPL_SPECIALIZE_FUN1_2_2
+#undef PPL_SPECIALIZE_FUN2_0_0
+#undef PPL_SPECIALIZE_FUN2_0_1
+#undef PPL_SPECIALIZE_FUN2_0_2
+#undef PPL_SPECIALIZE_FUN3_0_1
+#undef PPL_SPECIALIZE_FUN5_0_1
+#undef PPL_SPECIALIZE_GCD
+#undef PPL_SPECIALIZE_GCDEXT
+#undef PPL_SPECIALIZE_IDIV
+#undef PPL_SPECIALIZE_INPUT
+#undef PPL_SPECIALIZE_IS_INT
+#undef PPL_SPECIALIZE_IS_MINF
+#undef PPL_SPECIALIZE_IS_NAN
+#undef PPL_SPECIALIZE_IS_PINF
+#undef PPL_SPECIALIZE_LCM
+#undef PPL_SPECIALIZE_MUL
+#undef PPL_SPECIALIZE_MUL2EXP
+#undef PPL_SPECIALIZE_NEG
+#undef PPL_SPECIALIZE_OUTPUT
+#undef PPL_SPECIALIZE_REM
+#undef PPL_SPECIALIZE_SGN
+#undef PPL_SPECIALIZE_SQRT
+#undef PPL_SPECIALIZE_SUB
+#undef PPL_SPECIALIZE_SUB_MUL
+#undef PPL_SPECIALIZE_TRUNC
+
+#undef PPL_COMPILE_TIME_CHECK
+#undef PPL_COMPILE_TIME_CHECK_AUX
+#undef PPL_COMPILE_TIME_CHECK_NAME
+
+#ifdef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS
+#endif
+#ifdef PPL_SAVE_STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS PPL_SAVE_STDC_LIMIT_MACROS
+# undef PPL_SAVE_STDC_LIMIT_MACROS
+#endif
+
+#ifdef PPL_SAVE_NDEBUG
+# ifndef NDEBUG
+#  define NDEBUG PPL_SAVE_NDEBUG
+# endif
+# undef PPL_SAVE_NDEBUG
+#else
+# ifdef NDEBUG
+#  undef NDEBUG
+# endif
+#endif
+// Must include <cassert> again in order to make the latest changes to
+// NDEBUG effective.
+#include <cassert>
+#include "assert.hh"
+
+#ifdef PPL_NO_AUTOMATIC_INITIALIZATION
+ #undef PPL_NO_AUTOMATIC_INITIALIZATION
+#endif
+
+#endif // !defined(PPL_ppl_hh)
diff --git a/src/stdiobuf.cc b/src/stdiobuf.cc
new file mode 100644
index 0000000..318c07b
--- /dev/null
+++ b/src/stdiobuf.cc
@@ -0,0 +1,84 @@
+/* stdiobuf class implementation (non-inline functions).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "stdiobuf_defs.hh"
+#include "globals_defs.hh"
+#include "assert.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+stdiobuf::int_type
+stdiobuf::uflow() {
+  unget_char_buf = getc(fp);
+  return unget_char_buf;
+}
+
+stdiobuf::int_type
+stdiobuf::underflow() {
+  const int_type c = getc(fp);
+  return ungetc(c, fp);
+}
+
+std::streamsize
+stdiobuf::xsgetn(char_type* s, std::streamsize n) {
+  PPL_ASSERT(n >= 0);
+  const size_t r = fread(s, 1, static_cast<size_t>(n), fp);
+  if (r > 0)
+    unget_char_buf = traits_type::to_int_type(s[r - 1]);
+  else
+    unget_char_buf = traits_type::eof();
+  return static_cast<std::streamsize>(r);
+}
+
+stdiobuf::int_type
+stdiobuf::pbackfail(int_type c) {
+  const int_type eof = traits_type::eof();
+  const int_type u = traits_type::eq_int_type(c, eof) ? unget_char_buf : c;
+  unget_char_buf = eof;
+  return traits_type::eq_int_type(u, eof) ? eof : ungetc(u, fp);
+}
+
+std::streamsize
+stdiobuf::xsputn(const char_type* s, std::streamsize n) {
+  PPL_ASSERT(n >= 0);
+  const size_t r = fwrite(s, 1, static_cast<size_t>(n), fp);
+  return static_cast<std::streamsize>(r);
+}
+
+stdiobuf::int_type
+stdiobuf::overflow(int_type c) {
+  const int_type eof = traits_type::eof();
+  if (traits_type::eq_int_type(c, eof))
+    return (fflush(fp) != 0) ? eof : traits_type::not_eof(c);
+  else
+    return putc(c, fp);
+}
+
+int
+stdiobuf::sync() {
+  return fflush(fp);
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/stdiobuf_defs.hh b/src/stdiobuf_defs.hh
new file mode 100644
index 0000000..103e480
--- /dev/null
+++ b/src/stdiobuf_defs.hh
@@ -0,0 +1,111 @@
+/* stdiobuf class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_stdiobuf_defs_hh
+#define PPL_stdiobuf_defs_hh 1
+
+#include "stdiobuf_types.hh"
+#include <cstdio>
+#include <streambuf>
+
+class Parma_Polyhedra_Library::stdiobuf
+  : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+  //! Constructor.
+  stdiobuf(FILE* file);
+
+protected:
+  /*! \brief
+    Gets a character in case of underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type underflow();
+
+  /*! \brief
+    In case of underflow, gets a character and advances the next pointer.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual int_type uflow();
+
+  /*! \brief
+    Gets a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+  */
+  virtual std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+  /*! \brief
+    Puts character back in case of backup underflow.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+  */
+  virtual int_type pbackfail(int_type c = traits_type::eof());
+
+  /*! \brief
+    Writes a sequence of characters.
+
+    \remarks
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+  /*! \brief
+    Writes a character in case of overflow.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+  */
+  virtual int_type overflow(int_type c);
+
+  /*! \brief
+    Synchronizes the stream buffer.
+
+    Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+  */
+  virtual int sync();
+
+private:
+  //! Character type of the streambuf.
+  typedef char char_type;
+
+  //! Traits type of the streambuf.
+  typedef std::char_traits<char_type> traits_type;
+
+  //! Integer type of the streambuf.
+  typedef traits_type::int_type int_type;
+
+  //! The encapsulated stdio file.
+  FILE* fp;
+
+  //! Buffer for the last character read.
+  int_type unget_char_buf;
+};
+
+#include "stdiobuf_inlines.hh"
+
+#endif // !defined(PPL_stdiobuf_defs_hh)
diff --git a/src/stdiobuf_inlines.hh b/src/stdiobuf_inlines.hh
new file mode 100644
index 0000000..53b8c44
--- /dev/null
+++ b/src/stdiobuf_inlines.hh
@@ -0,0 +1,36 @@
+/* stdiobuf class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_stdiobuf_inlines_hh
+#define PPL_stdiobuf_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+stdiobuf::stdiobuf(FILE* file)
+  : fp(file), unget_char_buf(traits_type::eof()) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_stdiobuf_inlines_hh)
diff --git a/src/stdiobuf_types.hh b/src/stdiobuf_types.hh
new file mode 100644
index 0000000..f028d2a
--- /dev/null
+++ b/src/stdiobuf_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_stdiobuf_types_hh
+#define PPL_stdiobuf_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class stdiobuf;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_stdiobuf_types_hh)
diff --git a/src/swapping_sort_templates.hh b/src/swapping_sort_templates.hh
new file mode 100644
index 0000000..6535621
--- /dev/null
+++ b/src/swapping_sort_templates.hh
@@ -0,0 +1,179 @@
+/* Sorting objects for which copies cost more than swaps.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_swapping_sort_templates_hh
+#define PPL_swapping_sort_templates_hh 1
+
+#include <vector>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template <typename RA_Container, typename Compare>
+struct Indirect_Sort_Compare {
+  typedef typename RA_Container::size_type size_type;
+
+  Indirect_Sort_Compare(const RA_Container& cont,
+                        size_type base = 0,
+                        Compare comp = Compare())
+    : container(cont), base_index(base), compare(comp) {
+  }
+
+  bool operator()(size_type i, size_type j) const {
+    return compare(container[base_index + i], container[base_index + j]);
+  }
+
+  const RA_Container& container;
+  const size_type base_index;
+  const Compare compare;
+}; // struct Indirect_Sort_Compare
+
+template <typename RA_Container>
+struct Indirect_Unique_Compare {
+  typedef typename RA_Container::size_type size_type;
+
+  Indirect_Unique_Compare(const RA_Container& cont, size_type base = 0)
+    : container(cont), base_index(base) {
+  }
+
+  bool operator()(size_type i, size_type j) const {
+    return container[base_index + i] == container[base_index + j];
+  }
+
+  const RA_Container& container;
+  const size_type base_index;
+}; // struct Indirect_Unique_Compare
+
+template <typename RA_Container>
+struct Indirect_Swapper {
+  typedef typename RA_Container::size_type size_type;
+
+  Indirect_Swapper(RA_Container& cont, size_type base = 0)
+    : container(cont), base_index(base) {
+  }
+
+  void operator()(size_type i, size_type j) const {
+    using std::swap;
+    swap(container[base_index + i], container[base_index + j]);
+  }
+
+  RA_Container& container;
+  const size_type base_index;
+}; // struct Indirect_Swapper
+
+template <typename RA_Container1, typename RA_Container2>
+struct Indirect_Swapper2 {
+  typedef typename RA_Container1::size_type size_type;
+
+  Indirect_Swapper2(RA_Container1& cont1, RA_Container2& cont2)
+    : container1(cont1), container2(cont2) {
+  }
+
+  void operator()(size_type i, size_type j) const {
+    using std::swap;
+    swap(container1[i], container1[j]);
+    swap(container2[i], container2[j]);
+  }
+
+  RA_Container1& container1;
+  RA_Container2& container2;
+}; // struct Indirect_Swapper2
+
+template <typename Sort_Comparer, typename Unique_Comparer, typename Swapper>
+typename Sort_Comparer::size_type
+indirect_sort_and_unique(typename Sort_Comparer::size_type num_elems,
+                         Sort_Comparer sort_cmp,
+                         Unique_Comparer unique_cmp,
+                         Swapper indirect_swap) {
+  typedef typename Sort_Comparer::size_type index_type;
+  // `iv' is a vector of indices for the portion of rows to be sorted.
+  PPL_ASSERT(num_elems >= 2);
+  std::vector<index_type> iv;
+  iv.reserve(num_elems);
+  for (index_type i = 0, i_end = num_elems; i != i_end; ++i)
+    iv.push_back(i);
+
+  typedef typename std::vector<index_type>::iterator Iter;
+  const Iter iv_begin = iv.begin();
+  Iter iv_end = iv.end();
+
+  // Sort `iv' by comparing the rows indexed by its elements.
+  std::sort(iv_begin, iv_end, sort_cmp);
+
+  // Swap the indexed rows according to `iv':
+  // for each index `i', the element that should be placed in
+  // position dst = i is the one placed in position src = iv[i].
+  for (index_type i = num_elems; i-- > 0; ) {
+    if (i != iv[i]) {
+      index_type dst = i;
+      index_type src = iv[i];
+      do {
+        indirect_swap(src, dst);
+        iv[dst] = dst;
+        dst = src;
+        src = iv[dst];
+      } while (i != src);
+      iv[dst] = dst;
+    }
+  }
+
+  // Restore `iv' indices to 0 .. num_elems-1 for the call to unique.
+  for (index_type i = num_elems; i-- > 0; )
+    iv[i] = i;
+
+  // Unique `iv' by comparing the rows indexed by its elements.
+  iv_end = std::unique(iv_begin, iv_end, unique_cmp);
+
+  const index_type num_sorted = static_cast<index_type>(iv_end - iv_begin);
+  const index_type num_duplicates = num_elems - num_sorted;
+  if (num_duplicates == 0)
+    return 0;
+
+  // There were duplicates: swap the rows according to `iv'.
+  index_type dst = 0;
+  while (dst < num_sorted && dst == iv[dst])
+    ++dst;
+  if (dst == num_sorted)
+    return num_duplicates;
+  do {
+    const index_type src = iv[dst];
+    indirect_swap(src, dst);
+    ++dst;
+  }
+  while (dst < num_sorted);
+  return num_duplicates;
+}
+
+template <typename Iter>
+Iter
+swapping_unique(Iter first, Iter last) {
+  return swapping_unique(first, last, std::iter_swap<Iter, Iter>);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_swapping_sort_templates_hh)
diff --git a/src/termination.cc b/src/termination.cc
new file mode 100644
index 0000000..18e7abd
--- /dev/null
+++ b/src/termination.cc
@@ -0,0 +1,935 @@
+/* Utilities for termination analysis: non-inline, non-template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "termination_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Termination {
+
+void
+assign_all_inequalities_approximation(const Constraint_System& cs_in,
+                                      Constraint_System& cs_out) {
+  if (cs_in.has_strict_inequalities() || cs_in.has_equalities()) {
+    // Here we have some strict inequality and/or equality constraints:
+    // translate them into non-strict inequality constraints.
+    for (Constraint_System::const_iterator i = cs_in.begin(),
+           i_end = cs_in.end(); i != i_end; ++i) {
+      const Constraint& c = *i;
+      if (c.is_equality()) {
+        // Insert the two corresponding opposing inequalities.
+        const Linear_Expression expr(c.expression());
+        cs_out.insert(expr >= 0);
+        cs_out.insert(expr <= 0);
+      }
+      else if (c.is_strict_inequality()) {
+        // Insert the non-strict approximation.
+        const Linear_Expression expr(c.expression());
+        cs_out.insert(expr >= 0);
+      }
+      else
+        // Insert as is.
+        cs_out.insert(c);
+    }
+  }
+  else
+    // No strict inequality and no equality constraints.
+    cs_out = cs_in;
+}
+
+template <>
+void
+assign_all_inequalities_approximation(const C_Polyhedron& ph,
+                                      Constraint_System& cs) {
+  const Constraint_System& ph_cs = ph.minimized_constraints();
+  if (ph_cs.has_equalities()) {
+    // Translate equalities into inequalities.
+    for (Constraint_System::const_iterator i = ph_cs.begin(),
+           i_end = ph_cs.end(); i != i_end; ++i) {
+      const Constraint& c = *i;
+      if (c.is_equality()) {
+        // Insert the two corresponding opposing inequalities.
+        const Linear_Expression expr(c.expression());
+        cs.insert(expr >= 0);
+        cs.insert(expr <= 0);
+      }
+      else
+        // Insert as is.
+        cs.insert(c);
+    }
+  }
+  else
+    // No equality constraints (and no strict inequalities).
+    cs = ph_cs;
+}
+
+/*! \brief
+  Fill the constraint system(s) for the application of the
+  Mesnard and Serebrenik improved termination tests.
+
+  \param cs
+  The input constraint system, where variables indices are allocated
+  as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$.
+  .
+  The system does not contain any equality.
+
+  \param cs_out1
+  The first output constraint system.
+
+  \param cs_out2
+  The second output constraint system, if any: it may be an alias
+  for \p cs_out1.
+
+  The allocation of variable indices in the output constraint
+  systems \p cs_out1 and \p cs_out2 is as follows,
+  where \f$m\f$ is the number of constraints in \p cs:
+  - \f$ \mu_1, \ldots, \mu_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$;
+  - \f$ \mu_0\f$ goes onto space dimension \f$ n \f$;
+  - \f$ y_1, \ldots, y_m \f$ go onto space dimensions
+    \f$ n+1, \ldots, n+m \f$;
+  .
+  if we use the same constraint system, that is
+  <CODE>&cs_out1 == &cs_out2</CODE>, then
+  - \f$ z_1, ..., z_m, z_{m+1}, z_{m+2} \f$ go onto space dimensions
+    \f$ n+m+1, ..., n+2*m+2 \f$;
+  .
+  otherwise
+  - \f$ z_1, ..., z_m, z_{m+1}, z_{m+2} \f$ go onto space dimensions
+    \f$ n+1, ..., n+m+2 \f$.
+*/
+void
+fill_constraint_systems_MS(const Constraint_System& cs,
+                           Constraint_System& cs_out1,
+                           Constraint_System& cs_out2) {
+  PPL_ASSERT(cs.space_dimension() % 2 == 0);
+  const dimension_type n = cs.space_dimension() / 2;
+  const dimension_type m = num_constraints(cs);
+
+#if PRINT_DEBUG_INFO
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+  Variable::set_output_function(output_function_MS);
+
+  output_function_MS_n = n;
+  output_function_MS_m = m;
+
+  std::cout << "*** cs ***" << std::endl;
+  output_function_MS_which = 0;
+  using namespace IO_Operators;
+  std::cout << cs << std::endl;
+#endif
+
+  const dimension_type y_begin = n+1;
+  const dimension_type z_begin = y_begin + ((&cs_out1 == &cs_out2) ? m : 0);
+
+  // Make sure linear expressions have the correct space dimension.
+  Linear_Expression y_le;
+  y_le.set_space_dimension(y_begin + m);
+  Linear_Expression z_le;
+  z_le.set_space_dimension(z_begin + m + 2);
+  std::vector<Linear_Expression> y_les(2*n, y_le);
+  std::vector<Linear_Expression> z_les(2*n + 1, z_le);
+
+  dimension_type y = y_begin;
+  dimension_type z = z_begin;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i) {
+    const Variable v_y(y);
+    const Variable v_z(z);
+    ++y;
+    ++z;
+    cs_out1.insert(v_y >= 0);
+    cs_out2.insert(v_z >= 0);
+    const Constraint& c_i = *i;
+    Coefficient_traits::const_reference b_i = c_i.inhomogeneous_term();
+    if (b_i != 0) {
+      // Note that b_i is to the left ot the relation sign, hence here
+      // we have -= and not += just to avoid negating b_i.
+      sub_mul_assign(y_le, b_i, v_y);
+      sub_mul_assign(z_le, b_i, v_z);
+    }
+    for (Constraint::expr_type::const_iterator j = c_i.expression().begin(),
+          j_end = c_i.expression().end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference a_i_j = *j;
+      const Variable v = j.variable();
+      add_mul_assign(y_les[v.id()], a_i_j, v_y);
+      add_mul_assign(z_les[v.id()], a_i_j, v_z);
+    }
+  }
+  z_le += Variable(z);
+  z_les[2*n] += Variable(z);
+  cs_out2.insert(Variable(z) >= 0);
+  ++z;
+  z_le -= Variable(z);
+  z_les[2*n] -= Variable(z);
+  cs_out2.insert(Variable(z) >= 0);
+  cs_out1.insert(y_le >= 1);
+  cs_out2.insert(z_le >= 0);
+  dimension_type j = 2*n;
+  while (j-- > n) {
+    cs_out1.insert(y_les[j] == Variable(j-n));
+    cs_out2.insert(z_les[j] == Variable(j-n));
+  }
+  ++j;
+  while (j-- > 0) {
+    cs_out1.insert(y_les[j] == -Variable(j));
+    cs_out2.insert(z_les[j] == 0);
+  }
+  cs_out2.insert(z_les[2*n] == Variable(n));
+
+#if PRINT_DEBUG_INFO
+  if (&cs_out1 == &cs_out2) {
+    std::cout << "*** cs_mip ***" << std::endl;
+    output_function_MS_which = 3;
+    using namespace IO_Operators;
+    std::cout << cs_mip << std::endl;
+  }
+  else {
+    std::cout << "*** cs_out1 ***" << std::endl;
+    output_function_MS_which = 1;
+    using namespace IO_Operators;
+    std::cout << cs_out1 << std::endl;
+
+    std::cout << "*** cs_out2 ***" << std::endl;
+    output_function_MS_which = 2;
+    using namespace IO_Operators;
+    std::cout << cs_out2 << std::endl;
+  }
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+}
+
+/*! \brief
+  Fill the constraint system(s) for the application of the
+  Podelski and Rybalchenko improved termination tests.
+
+  \param cs_before
+  The input constraint system describing the state <EM>before</EM>
+  the execution of the loop body, where variables indices are allocated
+  as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+  .
+  The system does not contain any equality.
+
+  \param cs_after
+  The input constraint system describing the state <EM>after</EM>
+  the execution of the loop body, where variables indices are allocated
+  as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$.
+  .
+  The system does not contain any equality.
+
+  \param cs_out
+  The output constraint system, where variables indices are allocated
+  as follows:
+  - \f$ u_3 \f$ goes onto space dimensions \f$ 0, \ldots, s-1 \f$;
+  - \f$ u_2 \f$ goes onto space dimensions \f$ s, \ldots, s+r-1 \f$;
+  - \f$ u_1 \f$ goes onto space dimensions \f$ s+r, \ldots, s+2r-1 \f$.
+
+  The improved Podelski-Rybalchenko method described in the paper
+  is based on a loop encoding of the form
+  \f[
+    \begin{pmatrix}
+      A_B  & \vect{0}    \\
+      A_C  & A'_C
+    \end{pmatrix}
+    \begin{pmatrix}
+     \vect{x} \\ \vect{x}'
+    \end{pmatrix}
+    \leq
+    \begin{pmatrix}
+     \vect{b}_B \\ \vect{b}_C
+    \end{pmatrix},
+  \f]
+  where
+  \f$ A_B \in \Qset^{r \times n} \f$,
+  \f$ A_C \in \Qset^{s \times n} \f$,
+  \f$ A'_C \in \Qset^{s \times n} \f$,
+  \f$ \vect{b}_B \in \Qset^r \f$,
+  \f$ \vect{b}_C \in \Qset^s \f$.
+  The corresponding system is:
+  \f[
+    \begin{aligned}
+      (\vect{v}_1-\vect{v}_2)^\transpose A_B
+        - \vect{v}_3^\transpose A_C
+          &= \vect{0}^\transpose, \\
+      \vect{v}_2^\transpose A_B
+        + \vect{v}_3^\transpose (A_C+A_C')
+          &= \vect{0}^\transpose, \\
+      \vect{v}_2 \vect{b}_B + \vect{v}_3 \vect{b}_C
+          &< 0,
+    \end{aligned}
+  \f]
+  where \f$ \vect{v}_1 \in \Qset_+^r \f$, \f$ \vect{v}_2 \in \Qset_+^r \f$,
+  \f$ \vect{v}_3 \in \Qset_+^s \f$.
+  The space of ranking functions is then spanned by
+  \f$ \vect{v}_3^\transpose A_C' \vect x \f$.
+
+  In contrast, our encoding is of the form
+  \f[
+    \begin{pmatrix}
+      \vect{0}    & E_B \\
+      E'_C & E_C
+    \end{pmatrix}
+    \begin{pmatrix}
+     \vect{x}' \\ \vect{x}
+    \end{pmatrix}
+    +
+    \begin{pmatrix}
+     \vect{d}_B \\ \vect{d}_C
+    \end{pmatrix}
+    \geq
+    \vect{0},
+  \f]
+  where \f$ {E}_B = -{A}_B \f$, \f$ {E}_C = -{A}_C \f$,
+  \f$ {E}'_C = -{A}'_C \f$, \f$ \vect{d}_B = \vect{b}_B \f$
+  and \f$ \vect{d}_C = \vect{b}_C \f$.
+  The corresponding system is:
+  \f[
+    \begin{aligned}
+      (\vect{u}_1-\vect{u}_2)^\transpose E_B
+        - \vect{u}_3^\transpose E_C
+          &= \vect{0}^\transpose, \\
+      \vect{u}_2^\transpose E_B
+        + \vect{u}_3^\transpose (E_C+E_C')
+          &= \vect{0}^\transpose, \\
+      \vect{u}_2 \vect{d}_B + \vect{u}_3 \vect{d}_C
+          &> 0,
+    \end{aligned}
+  \f]
+  where \f$ \vect{u}_1 \in \Qset_-^r \f$, \f$ \vect{u}_2 \in \Qset_-^r \f$,
+  \f$ \vect{u}_3 \in \Qset_-^s \f$.
+  The space of ranking functions is then spanned by
+  \f$ \vect{u}_3^\transpose E_C' \vect x \f$.
+
+  \param le_out
+  The expression to be minimized in the context of \p cs_out:
+  a value of \f$ -1 \f$ or less entails termination.
+*/
+void
+fill_constraint_system_PR(const Constraint_System& cs_before,
+                          const Constraint_System& cs_after,
+                          Constraint_System& cs_out,
+                          Linear_Expression& le_out) {
+  PPL_ASSERT(cs_after.space_dimension() % 2 == 0);
+  PPL_ASSERT(2*cs_before.space_dimension() == cs_after.space_dimension());
+  const dimension_type n = cs_before.space_dimension();
+  const dimension_type r = num_constraints(cs_before);
+  const dimension_type s = num_constraints(cs_after);
+  const dimension_type m = r + s;
+
+  // Make sure linear expressions are not reallocated multiple times.
+  if (m > 0)
+    le_out.set_space_dimension(m + r);
+  std::vector<Linear_Expression> les_eq(2*n, le_out);
+
+  dimension_type row_index = 0;
+  for (Constraint_System::const_iterator i = cs_before.begin(),
+         cs_before_end = cs_before.end();
+       i != cs_before_end;
+       ++i, ++row_index) {
+    const Variable u1_i(m + row_index);
+    const Variable u2_i(s + row_index);
+    const Constraint::expr_type e_i = i->expression();
+    for (Constraint::expr_type::const_iterator
+           j = e_i.begin(), j_end = e_i.end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference A_ij_B = *j;
+      const Variable v = j.variable();
+      // (u1 - u2) A_B, in the context of j-th constraint.
+      add_mul_assign(les_eq[v.id()], A_ij_B, u1_i);
+      sub_mul_assign(les_eq[v.id()], A_ij_B, u2_i);
+      // u2 A_B, in the context of (j+n)-th constraint.
+      add_mul_assign(les_eq[v.id() + n], A_ij_B, u2_i);
+    }
+    Coefficient_traits::const_reference b_B = e_i.inhomogeneous_term();
+    if (b_B != 0)
+      // u2 b_B, in the context of the strict inequality constraint.
+      add_mul_assign(le_out, b_B, u2_i);
+  }
+
+  row_index = 0;
+  for (Constraint_System::const_iterator i = cs_after.begin(),
+         cs_after_end = cs_after.end();
+       i != cs_after_end;
+       ++i, ++row_index) {
+    const Variable u3_i(row_index);
+    const Constraint::expr_type e_i = i->expression();
+    for (Constraint::expr_type::const_iterator
+           j = e_i.lower_bound(Variable(n)),
+           j_end = e_i.end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference A_ij_C = *j;
+      const Variable v = j.variable();
+      // - u3 A_C, in the context of the j-th constraint.
+      sub_mul_assign(les_eq[v.id() - n], A_ij_C, u3_i);
+      // u3 A_C, in the context of the (j+n)-th constraint.
+      add_mul_assign(les_eq[v.id()], A_ij_C, u3_i);
+    }
+    for (Constraint::expr_type::const_iterator j = e_i.begin(),
+           j_end = e_i.lower_bound(Variable(n)); j != j_end; ++j) {
+      Coefficient_traits::const_reference Ap_ij_C = *j;
+      // u3 Ap_C, in the context of the (j+n)-th constraint.
+      add_mul_assign(les_eq[j.variable().id() + n], Ap_ij_C, u3_i);
+    }
+    Coefficient_traits::const_reference b_C = e_i.inhomogeneous_term();
+    if (b_C != 0)
+      // u3 b_C, in the context of the strict inequality constraint.
+      add_mul_assign(le_out, b_C, u3_i);
+  }
+
+  // Add the nonnegativity constraints for u_1, u_2 and u_3.
+  for (dimension_type i = s + 2*r; i-- > 0; )
+    cs_out.insert(Variable(i) >= 0);
+
+  for (dimension_type j = 2*n; j-- > 0; )
+    cs_out.insert(les_eq[j] == 0);
+}
+
+void
+fill_constraint_system_PR_original(const Constraint_System& cs,
+                                   Constraint_System& cs_out,
+                                   Linear_Expression& le_out) {
+  PPL_ASSERT(cs.space_dimension() % 2 == 0);
+  const dimension_type n = cs.space_dimension() / 2;
+  const dimension_type m = num_constraints(cs);
+
+  // Make sure linear expressions are not reallocated multiple times.
+  if (m > 0)
+    le_out.set_space_dimension(2*m);
+  std::vector<Linear_Expression> les_eq(3*n, le_out);
+
+  dimension_type row_index = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i, ++row_index) {
+    const Constraint::expr_type e_i = i->expression();
+    const Variable lambda1_i(row_index);
+    const Variable lambda2_i(m + row_index);
+    for (Constraint::expr_type::const_iterator j = e_i.begin(),
+          j_end = e_i.lower_bound(Variable(n)); j != j_end; ++j) {
+      Coefficient_traits::const_reference Ap_ij = *j;
+      const Variable v = j.variable();
+      // lambda_1 A'
+      add_mul_assign(les_eq[v.id()], Ap_ij, lambda1_i);
+      // lambda_2 A'
+      add_mul_assign(les_eq[v.id()+n+n], Ap_ij, lambda2_i);
+    }
+    for (Constraint::expr_type::const_iterator
+           j = e_i.lower_bound(Variable(n)),
+           j_end = e_i.end(); j != j_end; ++j) {
+      Coefficient_traits::const_reference A_ij = *j;
+      const Variable v = j.variable();
+      // (lambda_1 - lambda_2) A
+      add_mul_assign(les_eq[v.id()], A_ij, lambda1_i);
+      sub_mul_assign(les_eq[v.id()], A_ij, lambda2_i);
+      // lambda_2 A
+      add_mul_assign(les_eq[v.id()+n], A_ij, lambda2_i);
+    }
+    Coefficient_traits::const_reference b = e_i.inhomogeneous_term();
+    if (b != 0)
+      // lambda2 b
+      add_mul_assign(le_out, b, lambda2_i);
+  }
+
+  // Add the non-negativity constraints for lambda_1 and lambda_2.
+  for (dimension_type i = 2*m; i-- > 0; )
+    cs_out.insert(Variable(i) >= 0);
+
+  for (dimension_type j = 3*n; j-- > 0; )
+    cs_out.insert(les_eq[j] == 0);
+}
+
+bool
+termination_test_MS(const Constraint_System& cs) {
+  Constraint_System cs_mip;
+  fill_constraint_systems_MS(cs, cs_mip, cs_mip);
+
+  const MIP_Problem mip = MIP_Problem(cs_mip.space_dimension(), cs_mip);
+  return mip.is_satisfiable();
+}
+
+bool
+one_affine_ranking_function_MS(const Constraint_System& cs, Generator& mu) {
+  Constraint_System cs_mip;
+  fill_constraint_systems_MS(cs, cs_mip, cs_mip);
+
+  const MIP_Problem mip = MIP_Problem(cs_mip.space_dimension(), cs_mip);
+  if (!mip.is_satisfiable())
+    return false;
+
+  const Generator fp = mip.feasible_point();
+  PPL_ASSERT(fp.is_point());
+  const dimension_type n = cs.space_dimension() / 2;
+  const Linear_Expression le(fp.expression(), n + 1);
+  mu = point(le, fp.divisor());
+  return true;
+}
+
+void
+all_affine_ranking_functions_MS(const Constraint_System& cs,
+                                C_Polyhedron& mu_space) {
+  Constraint_System cs_out1;
+  Constraint_System cs_out2;
+  fill_constraint_systems_MS(cs, cs_out1, cs_out2);
+
+  C_Polyhedron ph1(cs_out1);
+  C_Polyhedron ph2(cs_out2);
+  const dimension_type n = cs.space_dimension() / 2;
+  ph1.remove_higher_space_dimensions(n);
+  ph1.add_space_dimensions_and_embed(1);
+  ph2.remove_higher_space_dimensions(n+1);
+
+#if PRINT_DEBUG_INFO
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+  Variable::set_output_function(output_function_MS);
+
+  output_function_MS_n = n;
+  output_function_MS_m = num_constraints(cs);
+
+  std::cout << "*** ph1 projected ***" << std::endl;
+  output_function_MS_which = 4;
+  using namespace IO_Operators;
+  std::cout << ph1.minimized_constraints() << std::endl;
+
+  std::cout << "*** ph2 projected ***" << std::endl;
+  std::cout << ph2.minimized_constraints() << std::endl;
+#endif
+
+  ph1.intersection_assign(ph2);
+
+#if PRINT_DEBUG_INFO
+  std::cout << "*** intersection ***" << std::endl;
+  using namespace IO_Operators;
+  std::cout << ph1.minimized_constraints() << std::endl;
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+
+  mu_space.m_swap(ph1);
+}
+
+void
+all_affine_quasi_ranking_functions_MS(const Constraint_System& cs,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space) {
+  Constraint_System cs_out1;
+  Constraint_System cs_out2;
+  fill_constraint_systems_MS(cs, cs_out1, cs_out2);
+
+  C_Polyhedron ph1(cs_out1);
+  C_Polyhedron ph2(cs_out2);
+  const dimension_type n = cs.space_dimension() / 2;
+  ph1.remove_higher_space_dimensions(n);
+  ph1.add_space_dimensions_and_embed(1);
+  ph2.remove_higher_space_dimensions(n+1);
+
+#if PRINT_DEBUG_INFO
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+  Variable::set_output_function(output_function_MS);
+
+  output_function_MS_n = n;
+  output_function_MS_m = num_constraints(cs);
+
+  std::cout << "*** ph1 projected ***" << std::endl;
+  output_function_MS_which = 4;
+  using namespace IO_Operators;
+  std::cout << ph1.minimized_constraints() << std::endl;
+
+  std::cout << "*** ph2 projected ***" << std::endl;
+  std::cout << ph2.minimized_constraints() << std::endl;
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+
+  decreasing_mu_space.m_swap(ph1);
+  bounded_mu_space.m_swap(ph2);
+}
+
+bool
+termination_test_PR_original(const Constraint_System& cs) {
+  PPL_ASSERT(cs.space_dimension() % 2 == 0);
+
+  Constraint_System cs_mip;
+  Linear_Expression le_ineq;
+  fill_constraint_system_PR_original(cs, cs_mip, le_ineq);
+
+  // Turn minimization problem into satisfiability.
+  cs_mip.insert(le_ineq <= -1);
+
+  const MIP_Problem mip(cs_mip.space_dimension(), cs_mip);
+  return mip.is_satisfiable();
+}
+
+bool
+termination_test_PR(const Constraint_System& cs_before,
+                    const Constraint_System& cs_after) {
+  Constraint_System cs_mip;
+  Linear_Expression le_ineq;
+  fill_constraint_system_PR(cs_before, cs_after, cs_mip, le_ineq);
+
+#if PRINT_DEBUG_INFO
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+  Variable::set_output_function(output_function_PR);
+
+  output_function_PR_r = num_constraints(cs_before);
+  output_function_PR_s = num_constraints(cs_after);
+
+  std::cout << "*** cs_mip ***" << std::endl;
+  using namespace IO_Operators;
+  std::cout << cs_mip << std::endl;
+  std::cout << "*** le_ineq ***" << std::endl;
+  std::cout << le_ineq << std::endl;
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+
+  // Turn minimization problem into satisfiability.
+  cs_mip.insert(le_ineq <= -1);
+
+  const MIP_Problem mip(cs_mip.space_dimension(), cs_mip);
+  return mip.is_satisfiable();
+}
+
+bool
+one_affine_ranking_function_PR(const Constraint_System& cs_before,
+                               const Constraint_System& cs_after,
+                               Generator& mu) {
+  return Termination_Helpers
+    ::one_affine_ranking_function_PR(cs_before, cs_after, mu);
+}
+
+bool
+one_affine_ranking_function_PR_original(const Constraint_System& cs,
+                                        Generator& mu) {
+  return Termination_Helpers::one_affine_ranking_function_PR_original(cs, mu);
+}
+
+void
+all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+                                const Constraint_System& cs_after,
+                                NNC_Polyhedron& mu_space) {
+  Termination_Helpers::all_affine_ranking_functions_PR(cs_before, cs_after,
+                                                       mu_space);
+}
+
+void
+all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+                                         NNC_Polyhedron& mu_space) {
+  Termination_Helpers::all_affine_ranking_functions_PR_original(cs, mu_space);
+}
+
+} // namespace Termination
+
+} // namespace Implementation
+
+bool
+Termination_Helpers
+::one_affine_ranking_function_PR(const Constraint_System& cs_before,
+                                 const Constraint_System& cs_after,
+                                 Generator& mu) {
+  Constraint_System cs_mip;
+  Linear_Expression le_ineq;
+  Parma_Polyhedra_Library::Implementation::Termination
+    ::fill_constraint_system_PR(cs_before, cs_after, cs_mip, le_ineq);
+
+#if PRINT_DEBUG_INFO
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+  Variable::set_output_function(output_function_PR);
+
+  output_function_PR_r = num_constraints(cs_before);
+  output_function_PR_s = num_constraints(cs_after);
+
+  std::cout << "*** cs_mip ***" << std::endl;
+  using namespace IO_Operators;
+  std::cout << cs_mip << std::endl;
+  std::cout << "*** le_ineq ***" << std::endl;
+  std::cout << le_ineq << std::endl;
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+
+  // Turn minimization problem into satisfiability.
+  cs_mip.insert(le_ineq <= -1);
+
+  const MIP_Problem mip(cs_mip.space_dimension(), cs_mip);
+  if (!mip.is_satisfiable())
+    return false;
+
+  const Generator& fp = mip.feasible_point();
+  PPL_ASSERT(fp.is_point());
+
+  // u_3 corresponds to space dimensions 0, ..., s - 1.
+  const dimension_type n = cs_before.space_dimension();
+  // mu_0 is zero: properly set space dimension.
+  Linear_Expression le;
+  le.set_space_dimension(1 + n);
+  // Multiply u_3 by E'_C to obtain mu_1, ..., mu_n.
+  dimension_type row_index = 0;
+  for (Constraint_System::const_iterator i = cs_after.begin(),
+         cs_after_end = cs_after.end();
+       i != cs_after_end;
+       ++i, ++row_index) {
+    Coefficient_traits::const_reference
+      fp_i = fp.coefficient(Variable(row_index));
+    if (fp_i != 0)
+      le.linear_combine(i->expr, 1, -fp_i, 1, n + 1);
+  }
+  // Note that we can neglect the divisor of `fp' since it is positive.
+  mu = point(le);
+  return true;
+}
+
+bool
+Termination_Helpers
+::one_affine_ranking_function_PR_original(const Constraint_System& cs,
+                                          Generator& mu) {
+  PPL_ASSERT(cs.space_dimension() % 2 == 0);
+  const dimension_type n = cs.space_dimension() / 2;
+  const dimension_type m = Implementation::num_constraints(cs);
+
+  Constraint_System cs_mip;
+  Linear_Expression le_ineq;
+  Parma_Polyhedra_Library::Implementation::Termination
+    ::fill_constraint_system_PR_original(cs, cs_mip, le_ineq);
+
+#if PRINT_DEBUG_INFO
+  std::cout << "*** cs_mip ***" << std::endl;
+  using namespace IO_Operators;
+  std::cout << cs_mip << std::endl;
+  std::cout << "*** le_ineq ***" << std::endl;
+  std::cout << le_ineq << std::endl;
+#endif
+
+  // Turn minimization problem into satisfiability.
+  cs_mip.insert(le_ineq <= -1);
+
+  const MIP_Problem mip = MIP_Problem(cs_mip.space_dimension(), cs_mip);
+  if (!mip.is_satisfiable())
+    return false;
+
+  const Generator& fp = mip.feasible_point();
+  PPL_ASSERT(fp.is_point());
+  // mu_0 is zero: properly set space dimension.
+  Linear_Expression le;
+  le.set_space_dimension(1 + n);
+  // Multiply -lambda_2 by A' to obtain mu_1, ..., mu_n.
+  // lambda_2 corresponds to space dimensions m, ..., 2*m - 1.
+  dimension_type row_index = m;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i, ++row_index) {
+    const Variable lambda_2(row_index);
+    Coefficient_traits::const_reference fp_i = fp.coefficient(lambda_2);
+    if (fp_i != 0)
+      le.linear_combine(i->expr, 1, -fp_i, 1, n + 1);
+  }
+  // Note that we can neglect the divisor of `fp' since it is positive.
+  mu = point(le);
+  return true;
+}
+
+void
+Termination_Helpers
+::all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+                                  const Constraint_System& cs_after,
+                                  NNC_Polyhedron& mu_space) {
+  Constraint_System cs_eqs;
+  Linear_Expression le_ineq;
+  Parma_Polyhedra_Library::Implementation::Termination
+    ::fill_constraint_system_PR(cs_before, cs_after, cs_eqs, le_ineq);
+
+#if PRINT_DEBUG_INFO
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+  Variable::set_output_function(output_function_PR);
+
+  output_function_PR_r = num_constraints(cs_before);
+  output_function_PR_s = num_constraints(cs_after);
+
+  std::cout << "*** cs_eqs ***" << std::endl;
+  using namespace IO_Operators;
+  std::cout << cs_eqs << std::endl;
+  std::cout << "*** le_ineq ***" << std::endl;
+  std::cout << le_ineq << std::endl;
+#endif
+
+  NNC_Polyhedron ph(cs_eqs);
+  ph.add_constraint(le_ineq < 0);
+  // u_3 corresponds to space dimensions 0, ..., s - 1.
+  const dimension_type s = Implementation::num_constraints(cs_after);
+  ph.remove_higher_space_dimensions(s);
+
+#if PRINT_DEBUG_INFO
+  std::cout << "*** ph ***" << std::endl;
+  std::cout << ph << std::endl;
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+
+  const dimension_type n = cs_before.space_dimension();
+
+  const Generator_System& gs_in = ph.generators();
+  Generator_System gs_out;
+  Generator_System::const_iterator gs_in_it = gs_in.begin();
+  Generator_System::const_iterator gs_in_end = gs_in.end();
+  if (gs_in_it == gs_in_end)
+    // The system is unsatisfiable.
+    mu_space = NNC_Polyhedron(n + 1, EMPTY);
+  else {
+    for ( ; gs_in_it != gs_in_end; ++gs_in_it) {
+      const Generator& g = *gs_in_it;
+      Linear_Expression le;
+      le.set_space_dimension(n);
+      // Set le to the multiplication of Linear_Expression(g) by E'_C.
+      dimension_type row_index = 0;
+      for (Constraint_System::const_iterator i = cs_after.begin(),
+             cs_after_end = cs_after.end();
+           i != cs_after_end;
+           ++i, ++row_index) {
+        Coefficient_traits::const_reference
+          g_i = g.coefficient(Variable(row_index));
+        if (g_i != 0)
+          le.linear_combine(i->expr, 1, -g_i, 1, n + 1);
+      }
+
+      // Add to gs_out the transformed generator.
+      switch (g.type()) {
+      case Generator::LINE:
+        if (!le.all_homogeneous_terms_are_zero())
+          gs_out.insert(line(le));
+        break;
+      case Generator::RAY:
+        if (!le.all_homogeneous_terms_are_zero())
+          gs_out.insert(ray(le));
+        break;
+      case Generator::POINT:
+        gs_out.insert(point(le, g.divisor()));
+        break;
+      case Generator::CLOSURE_POINT:
+        gs_out.insert(closure_point(le, g.divisor()));
+        break;
+      }
+    }
+
+    mu_space = NNC_Polyhedron(gs_out);
+    // mu_0 is zero.
+    mu_space.add_space_dimensions_and_embed(1);
+  }
+}
+
+void
+Termination_Helpers
+::all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+                                           NNC_Polyhedron& mu_space) {
+  PPL_ASSERT(cs.space_dimension() % 2 == 0);
+  const dimension_type n = cs.space_dimension() / 2;
+  const dimension_type m = Implementation::num_constraints(cs);
+
+  if (m == 0) {
+    // If there are no constraints at all, we have non-termination,
+    // i.e., no affine ranking function at all.
+    mu_space = NNC_Polyhedron(n + 1, EMPTY);
+    return;
+  }
+
+  Constraint_System cs_eqs;
+  Linear_Expression le_ineq;
+  Parma_Polyhedra_Library::Implementation::Termination
+    ::fill_constraint_system_PR_original(cs, cs_eqs, le_ineq);
+
+  NNC_Polyhedron ph(cs_eqs);
+  ph.add_constraint(le_ineq < 0);
+  // lambda_2 corresponds to space dimensions m, ..., 2*m-1.
+  const Variables_Set lambda1(Variable(0), Variable(m-1));
+  ph.remove_space_dimensions(lambda1);
+
+#if PRINT_DEBUG_INFO
+  std::cout << "*** ph ***" << std::endl;
+  std::cout << ph << std::endl;
+
+  Variable::set_output_function(p_default_output_function);
+#endif
+
+  const Generator_System& gs_in = ph.generators();
+  Generator_System::const_iterator gs_in_it = gs_in.begin();
+  Generator_System::const_iterator gs_in_end = gs_in.end();
+  if (gs_in_it == gs_in_end)
+    // The system is unsatisfiable.
+    mu_space = NNC_Polyhedron(n + 1, EMPTY);
+  else {
+    Generator_System gs_out;
+    for ( ; gs_in_it != gs_in_end; ++gs_in_it) {
+      const Generator& g = *gs_in_it;
+      Linear_Expression le;
+      le.set_space_dimension(n);
+      // Set le to the multiplication of Linear_Expression(g) by E'_C.
+      dimension_type row_index = 0;
+      for (Constraint_System::const_iterator i = cs.begin(),
+             cs_end = cs.end(); i != cs_end; ++i, ++row_index) {
+        const Variable lambda2_i(row_index);
+        Coefficient_traits::const_reference g_i = g.coefficient(lambda2_i);
+        if (g_i != 0)
+          le.linear_combine(i->expr, 1, -g_i, 1, n + 1);
+      }
+
+      // Add to gs_out the transformed generator.
+      switch (g.type()) {
+      case Generator::LINE:
+        if (!le.all_homogeneous_terms_are_zero())
+          gs_out.insert(line(le));
+        break;
+      case Generator::RAY:
+        if (!le.all_homogeneous_terms_are_zero())
+          gs_out.insert(ray(le));
+        break;
+      case Generator::POINT:
+        gs_out.insert(point(le, g.divisor()));
+        break;
+      case Generator::CLOSURE_POINT:
+        gs_out.insert(closure_point(le, g.divisor()));
+        break;
+      }
+    }
+
+    mu_space = NNC_Polyhedron(gs_out);
+    // mu_0 is zero.
+    mu_space.add_space_dimensions_and_embed(1);
+  }
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/termination_defs.hh b/src/termination_defs.hh
new file mode 100644
index 0000000..e4334bf
--- /dev/null
+++ b/src/termination_defs.hh
@@ -0,0 +1,502 @@
+/* Utilities for termination analysis: declarations.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_termination_defs_hh
+#define PPL_termination_defs_hh 1
+
+#include "termination_types.hh"
+
+#include "Generator_types.hh"
+#include "C_Polyhedron_types.hh"
+#include "NNC_Polyhedron_types.hh"
+#include "Constraint_System_types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers {
+public:
+  static void
+  all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+                                  const Constraint_System& cs_after,
+                                  NNC_Polyhedron& mu_space);
+  static bool
+  one_affine_ranking_function_PR(const Constraint_System& cs_before,
+                                 const Constraint_System& cs_after,
+                                 Generator& mu);
+  static bool
+  one_affine_ranking_function_PR_original(const Constraint_System& cs,
+                                          Generator& mu);
+  static void
+  all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+                                           NNC_Polyhedron& mu_space);
+
+  template <typename PSET>
+  static void
+  assign_all_inequalities_approximation(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        Constraint_System& cs);
+}; // class Termination_Helpers
+
+//! \name Functions for the Synthesis of Linear Rankings
+//@{
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test using an improvement of the method by Mesnard and
+  Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then <CODE>true</CODE> is returned <EM>if and only if</EM>
+  the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test using an improvement of the method by Mesnard and
+  Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then <CODE>true</CODE> is returned
+  <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with witness ranking function using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \param mu
+  When <CODE>true</CODE> is returned, this is assigned a point
+  of space dimension \f$ n+1 \f$ encoding one (not further specified)
+  affine ranking function for the loop being analyzed.
+  The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+  of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+  respectively.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then <CODE>true</CODE> is returned <EM>if and only if</EM>
+  the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with witness ranking function using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \param mu
+  When <CODE>true</CODE> is returned, this is assigned a point
+  of space dimension \f$ n+1 \f$ encoding one (not further specified)
+  affine ranking function for the loop being analyzed.
+  The ranking function is of the form \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ are the coefficients
+  of \p mu corresponding to the space dimensions \f$ n, 0, \ldots, n-1 \f$,
+  respectively.
+
+  \return
+  <CODE>true</CODE> if any loop approximated by \p pset definitely
+  terminates; <CODE>false</CODE> if the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then <CODE>true</CODE> is returned
+  <EM>if and only if</EM> the loop terminates.
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with ranking function space using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \param mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the affine ranking functions for the loops
+  that are precisely characterized by \p pset.
+  These ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p mu_space polyhedron.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions of \p mu_space
+  \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p mu_space is empty, it means that the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then \p mu_space is empty <EM>if and only if</EM>
+  the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Termination test with ranking function space using an improvement
+  of the method by Mesnard and Serebrenik \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \param mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the affine ranking functions for the loops
+  that are precisely characterized by \p pset.
+  These ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p mu_space polyhedron.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions of \p mu_space
+  \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p mu_space is empty, it means that the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then \p mu_space is empty <EM>if and only if</EM>
+  the loop does <EM>not</EM> terminate.
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  C_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Computes the spaces of affine \e quasi ranking functions
+  using an improvement of the method by Mesnard and Serebrenik
+  \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset
+  A pointset approximating the behavior of a loop whose termination
+  is being analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+  .
+  where unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.
+
+  \param decreasing_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the decreasing affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  \param bounded_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the lower bounded affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  These quasi-ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+  it means that the test is inconclusive.
+  However, if \p pset <EM>precisely</EM> characterizes the effect
+  of the loop body onto the loop-relevant program variables,
+  then \p decreasing_mu_space (resp., \p bounded_mu_space) will be empty
+  <EM>if and only if</EM> there is no decreasing (resp., lower bounded)
+  affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Computes the spaces of affine \e quasi ranking functions
+  using an improvement of the method by Mesnard and Serebrenik
+  \ref BMPZ10 "[BMPZ10]".
+
+  \tparam PSET
+  Any pointset supported by the PPL that provides the
+  <CODE>minimized_constraints()</CODE> method.
+
+  \param pset_before
+  A pointset approximating the values of loop-relevant variables
+  <EM>before</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$.
+
+  \param pset_after
+  A pointset approximating the values of loop-relevant variables
+  <EM>after</EM> the update performed in the loop body that is being
+  analyzed.  The variables indices are allocated as follows:
+  - \f$ x'_1, \ldots, x'_n \f$ go onto space dimensions
+    \f$ 0, \ldots, n-1 \f$,
+  - \f$ x_1, \ldots, x_n \f$ go onto space dimensions
+    \f$ n, \ldots, 2n-1 \f$,
+
+  Note that unprimed variables represent the values of the loop-relevant
+  program variables before the update performed in the loop body,
+  and primed variables represent the values of those program variables
+  after the update.  Note also that unprimed variables are assigned
+  to different space dimensions in \p pset_before and \p pset_after.
+
+  \param decreasing_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the decreasing affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  \param bounded_mu_space
+  This is assigned a closed polyhedron of space dimension \f$ n+1 \f$
+  representing the space of all the lower bounded affine functions
+  for the loops that are precisely characterized by \p pset.
+
+  These ranking functions are of the form
+  \f$ \mu_0 + \sum_{i=1}^n \mu_i x_i \f$
+  where \f$ \mu_0, \mu_1, \ldots, \mu_n \f$ identify any point of the
+  \p decreasing_mu_space and \p bounded_mu_space polyhedrons.
+  The variables \f$ \mu_0, \mu_1, \ldots, \mu_n \f$
+  correspond to the space dimensions \f$ n, 0, \ldots, n-1 \f$, respectively.
+  When \p decreasing_mu_space (resp., \p bounded_mu_space) is empty,
+  it means that the test is inconclusive.
+  However, if \p pset_before and \p pset_after <EM>precisely</EM>
+  characterize the effect of the loop body onto the loop-relevant
+  program variables, then \p decreasing_mu_space (resp., \p bounded_mu_space)
+  will be empty <EM>if and only if</EM> there is no decreasing
+  (resp., lower bounded) affine function, so that the loop does not terminate.
+*/
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        C_Polyhedron& decreasing_mu_space,
+                                        C_Polyhedron& bounded_mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like termination_test_MS() but using the method by Podelski and
+  Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like termination_test_MS_2() but using an alternative formalization
+  of the method by Podelski and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like one_affine_ranking_function_MS() but using the method by Podelski
+  and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like one_affine_ranking_function_MS_2() but using an alternative
+  formalization of the method by Podelski and Rybalchenko
+  \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like all_affine_ranking_functions_MS() but using the method by Podelski
+  and Rybalchenko \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset, NNC_Polyhedron& mu_space);
+
+/*! \ingroup PPL_CXX_interface \brief
+  Like all_affine_ranking_functions_MS_2() but using an alternative
+  formalization of the method by Podelski and Rybalchenko
+  \ref BMPZ10 "[BMPZ10]".
+*/
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  NNC_Polyhedron& mu_space);
+
+//@} // Functions for the Synthesis of Linear Rankings
+
+} // namespace Parma_Polyhedra_Library
+
+#include "termination_templates.hh"
+
+#endif // !defined(PPL_termination_defs_hh)
diff --git a/src/termination_templates.hh b/src/termination_templates.hh
new file mode 100644
index 0000000..b106e52
--- /dev/null
+++ b/src/termination_templates.hh
@@ -0,0 +1,552 @@
+/* Utilities for termination analysis: template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_termination_templates_hh
+#define PPL_termination_templates_hh 1
+
+#include "globals_defs.hh"
+#include "Variable_defs.hh"
+#include "Generator_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "C_Polyhedron_defs.hh"
+#include "NNC_Polyhedron_defs.hh"
+
+#include <stdexcept>
+
+#define PRINT_DEBUG_INFO 0
+
+#if PRINT_DEBUG_INFO
+#include <iostream>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+namespace Termination {
+
+#if PRINT_DEBUG_INFO
+static dimension_type output_function_MS_n;
+static dimension_type output_function_MS_m;
+
+/* Encodes which object are we printing:
+
+   0 means input constraint system;
+   1 means first output constraint system;
+   2 means second output constraint system;
+   3 means only output constraint system
+     (i.e., when first and second are the same);
+   4 means mu space.
+*/
+static int output_function_MS_which = -1;
+
+/*
+  Debugging output function.  See the documentation of
+  fill_constraint_systems_MS() for the allocation of variable indices.
+*/
+inline void
+output_function_MS(std::ostream& s, const Variable v) {
+  dimension_type id = v.id();
+  switch (output_function_MS_which) {
+  case 0:
+    if (id < output_function_MS_n)
+      s << "x'" << id + 1;
+    else if (id < 2*output_function_MS_n)
+      s << "x" << id - output_function_MS_n + 1;
+    else
+      s << "WHAT?";
+    break;
+  case 1:
+    if (id < output_function_MS_n)
+      s << "mu" << id + 1;
+    else if (id == output_function_MS_n)
+      s << "WHAT?";
+    else if (id <= output_function_MS_n + output_function_MS_m)
+      s << "y" << id - output_function_MS_n;
+    else
+      s << "WHAT?";
+    break;
+  case 2:
+  case 4:
+    if (id < output_function_MS_n)
+      s << "mu" << id + 1;
+    else if (id == output_function_MS_n)
+      s << "mu0";
+    else if (output_function_MS_which == 2
+             && id <= output_function_MS_n + output_function_MS_m + 2)
+      s << "z" << id - output_function_MS_n;
+    else
+      s << "WHAT?";
+    break;
+  case 3:
+    if (id < output_function_MS_n)
+      s << "mu" << id + 1;
+    else if (id == output_function_MS_n)
+      s << "mu0";
+    else if (id <= output_function_MS_n + output_function_MS_m)
+      s << "y" << id - output_function_MS_n;
+    else if (id <= output_function_MS_n + 2*output_function_MS_m + 2)
+      s << "z" << id - (output_function_MS_n + output_function_MS_m);
+    else
+      s << "WHAT?";
+    break;
+  default:
+    abort();
+    break;
+  }
+}
+
+static dimension_type output_function_PR_s;
+static dimension_type output_function_PR_r;
+
+/*
+  Debugging output function.  See the documentation of
+  fill_constraint_system_PR() for the allocation of variable indices.
+*/
+inline void
+output_function_PR(std::ostream& s, const Variable v) {
+  dimension_type id = v.id();
+  if (id < output_function_PR_s)
+    s << "u3_" << id + 1;
+  else if (id < output_function_PR_s + output_function_PR_r)
+    s << "u2_" << id - output_function_PR_s + 1;
+  else if (id < output_function_PR_s + 2*output_function_PR_r)
+    s << "u1_" << id - (output_function_PR_s + output_function_PR_r) + 1;
+  else
+    s << "WHAT?";
+}
+#endif
+
+void
+assign_all_inequalities_approximation(const Constraint_System& cs_in,
+                                      Constraint_System& cs_out);
+
+template <typename PSET>
+inline void
+assign_all_inequalities_approximation(const PSET& pset,
+                                      Constraint_System& cs) {
+  assign_all_inequalities_approximation(pset.minimized_constraints(), cs);
+}
+
+template <>
+void
+assign_all_inequalities_approximation(const C_Polyhedron& ph,
+                                      Constraint_System& cs);
+
+bool
+termination_test_MS(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_MS(const Constraint_System& cs,
+                               Generator& mu);
+
+void
+all_affine_ranking_functions_MS(const Constraint_System& cs,
+                                C_Polyhedron& mu_space);
+
+void
+all_affine_quasi_ranking_functions_MS(const Constraint_System& cs,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space);
+
+bool
+termination_test_PR(const Constraint_System& cs_before,
+                    const Constraint_System& cs_after);
+
+bool
+one_affine_ranking_function_PR(const Constraint_System& cs_before,
+                               const Constraint_System& cs_after,
+                               Generator& mu);
+
+void
+all_affine_ranking_functions_PR(const Constraint_System& cs_before,
+                                const Constraint_System& cs_after,
+                                NNC_Polyhedron& mu_space);
+
+bool
+termination_test_PR_original(const Constraint_System& cs);
+
+bool
+one_affine_ranking_function_PR_original(const Constraint_System& cs,
+                                        Generator& mu);
+
+void
+all_affine_ranking_functions_PR_original(const Constraint_System& cs,
+                                         NNC_Polyhedron& mu_space);
+
+} // namespace Termination
+
+} // namespace Implementation
+
+template <typename PSET>
+void
+Termination_Helpers
+::assign_all_inequalities_approximation(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        Constraint_System& cs) {
+  Implementation::Termination
+    ::assign_all_inequalities_approximation(pset_before, cs);
+  cs.shift_space_dimensions(Variable(0), cs.space_dimension());
+  Constraint_System cs_after;
+  Implementation::Termination
+    ::assign_all_inequalities_approximation(pset_after, cs_after);
+  // FIXME: provide an "append" for constraint systems.
+  for (Constraint_System::const_iterator i = cs_after.begin(),
+         cs_after_end = cs_after.end(); i != cs_after_end; ++i)
+    cs.insert(*i);
+}
+
+template <typename PSET>
+bool
+termination_test_MS(const PSET& pset) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::termination_test_MS(pset):\n"
+         "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+termination_test_MS_2(const PSET& pset_before, const PSET& pset_after) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::termination_test_MS_2(pset_before, pset_after):\n"
+         "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  return termination_test_MS(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS(const PSET& pset, Generator& mu) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_MS(pset, mu):\n"
+         "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_MS_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_MS_2(pset_before, pset_after, mu):\n"
+         "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  return one_affine_ranking_function_MS(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS(const PSET& pset, C_Polyhedron& mu_space) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_MS(pset, mu_space):\n"
+         "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset.is_empty()) {
+    mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_MS_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  C_Polyhedron& mu_space) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_MS_2"
+      << "(pset_before, pset_after, mu_space):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset_before.is_empty()) {
+    mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  all_affine_ranking_functions_MS(cs, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS(const PSET& pset,
+                                      C_Polyhedron& decreasing_mu_space,
+                                      C_Polyhedron& bounded_mu_space) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::all_affine_quasi_ranking_functions_MS"
+      << "(pset, decr_space, bounded_space):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset.is_empty()) {
+    decreasing_mu_space = C_Polyhedron(1 + space_dim/2, UNIVERSE);
+    bounded_mu_space = decreasing_mu_space;
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  all_affine_quasi_ranking_functions_MS(cs,
+                                        decreasing_mu_space,
+                                        bounded_mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_quasi_ranking_functions_MS_2(const PSET& pset_before,
+                                        const PSET& pset_after,
+                                        C_Polyhedron& decreasing_mu_space,
+                                        C_Polyhedron& bounded_mu_space) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::all_affine_quasi_ranking_functions_MS_2"
+      << "(pset_before, pset_after, decr_space, bounded_space):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset_before.is_empty()) {
+    decreasing_mu_space = C_Polyhedron(1 + before_space_dim, UNIVERSE);
+    bounded_mu_space = decreasing_mu_space;
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  Termination_Helpers
+    ::assign_all_inequalities_approximation(pset_before, pset_after, cs);
+  all_affine_quasi_ranking_functions_MS(cs,
+                                        decreasing_mu_space,
+                                        bounded_mu_space);
+}
+
+template <typename PSET>
+bool
+termination_test_PR_2(const PSET& pset_before, const PSET& pset_after) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::termination_test_PR_2(pset_before, pset_after):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs_before;
+  Constraint_System cs_after;
+  assign_all_inequalities_approximation(pset_before, cs_before);
+  assign_all_inequalities_approximation(pset_after, cs_after);
+  return termination_test_PR(cs_before, cs_after);
+}
+
+template <typename PSET>
+bool
+termination_test_PR(const PSET& pset) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::termination_test_PR(pset):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return termination_test_PR_original(cs);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR_2(const PSET& pset_before,
+                                 const PSET& pset_after,
+                                 Generator& mu) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_PR_2"
+      << "(pset_before, pset_after, mu):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs_before;
+  Constraint_System cs_after;
+  assign_all_inequalities_approximation(pset_before, cs_before);
+  assign_all_inequalities_approximation(pset_after, cs_after);
+  return one_affine_ranking_function_PR(cs_before, cs_after, mu);
+}
+
+template <typename PSET>
+bool
+one_affine_ranking_function_PR(const PSET& pset, Generator& mu) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::one_affine_ranking_function_PR(pset, mu):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  return one_affine_ranking_function_PR_original(cs, mu);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR_2(const PSET& pset_before,
+                                  const PSET& pset_after,
+                                  NNC_Polyhedron& mu_space) {
+  const dimension_type before_space_dim = pset_before.space_dimension();
+  const dimension_type after_space_dim = pset_after.space_dimension();
+  if (after_space_dim != 2*before_space_dim) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_MS_2"
+      << "(pset_before, pset_after, mu_space):\n"
+      << "pset_before.space_dimension() == " << before_space_dim
+      << ", pset_after.space_dimension() == " << after_space_dim
+      << ";\nthe latter should be twice the former.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset_before.is_empty()) {
+    mu_space = NNC_Polyhedron(1 + before_space_dim);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs_before;
+  Constraint_System cs_after;
+  assign_all_inequalities_approximation(pset_before, cs_before);
+  assign_all_inequalities_approximation(pset_after, cs_after);
+  all_affine_ranking_functions_PR(cs_before, cs_after, mu_space);
+}
+
+template <typename PSET>
+void
+all_affine_ranking_functions_PR(const PSET& pset,
+                                NNC_Polyhedron& mu_space) {
+  const dimension_type space_dim = pset.space_dimension();
+  if (space_dim % 2 != 0) {
+    std::ostringstream s;
+    s << "PPL::all_affine_ranking_functions_PR(pset, mu_space):\n"
+      << "pset.space_dimension() == " << space_dim
+      << " is odd.";
+    throw std::invalid_argument(s.str());
+  }
+
+  if (pset.is_empty()) {
+    mu_space = NNC_Polyhedron(1 + space_dim/2);
+    return;
+  }
+
+  using namespace Implementation::Termination;
+  Constraint_System cs;
+  assign_all_inequalities_approximation(pset, cs);
+  all_affine_ranking_functions_PR_original(cs, mu_space);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_termination_templates_hh)
diff --git a/src/termination_types.hh b/src/termination_types.hh
new file mode 100644
index 0000000..314c0b9
--- /dev/null
+++ b/src/termination_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_termination_types_hh
+#define PPL_termination_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Termination_Helpers;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_termination_types_hh)
diff --git a/src/version.cc b/src/version.cc
new file mode 100644
index 0000000..3337409
--- /dev/null
+++ b/src/version.cc
@@ -0,0 +1,108 @@
+/* Definition of functions providing version and licensing information.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "version.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+const char version_string[] = PPL_PACKAGE_VERSION;
+
+const char banner_string[] =
+"This is "PPL_PACKAGE_NAME" (PPL) version "PPL_PACKAGE_VERSION".\n"
+"Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>\n"
+"Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)\n"
+"\n"
+"The PPL is free software; see the source for copying conditions.\n"
+"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
+"PARTICULAR PURPOSE.\n"
+"\n"
+#if defined(__COMO__)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Comeau C++ compiler version "xstr(__COMO_VERSION__)".\n"
+#elif defined(__INTEL_COMPILER)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Intel C++ compiler version "xstr(__INTEL_COMPILER)".\n"
+#elif defined(__GNUC__)
+"Compiled by the GNU C++ compiler version "__VERSION__".\n"
+#else
+"Compiled by an unknown compiler.\n"
+#endif
+"\n"
+"Report bugs to "PPL_PACKAGE_BUGREPORT"."
+"  For the most up-to-date information\n"
+"see the Parma Polyhedra Library site: http://bugseng.com/products/ppl/ .\n"
+"\n"
+"Contributors:\n"
+"Roberto Bagnara, Patricia M. Hill, Enea Zaffanella, Abramo Bagnara,\n"
+"Elisa Ricci, Andrea Cimino, Marco Poletti, Alessandro Zaccagnini,\n"
+"Roberto Amadini, Irene Bacchi, Fabio Biselli, Fabio Bossi,\n"
+"Danilo Bonardi, Sara Bonini, Katy Dobson, Giordano Fracasso,\n"
+"Francois Galea, Maximiliano Marchesi, Elena Mazzi, David Merchat,\n"
+"Matthew Mundell, Andrea Pescetti, Barbara Quartieri,\n"
+"Enric Rodriguez Carbonell, Angela Stazzone, Fabio Trabucchi,\n"
+"Claudio Trento, Tatiana Zolo.\n"
+"\n"
+"Special thanks to:\n"
+"Lucia Alessandrini, Frederic Besson, Tevfik Bultan, Manuel Carro,\n"
+"Marco Comini, Goran Frehse, Denis Gopan, Martin Guy, Bruno Haible,\n"
+"Bertrand Jeannet, Herve Le Verge, Francesco Logozzo, Kenneth MacKenzie,\n"
+"Costantino Medori, Fred Mesnard, Ken Mixter, Jose Morales, Sebastian Pop,\n"
+"Thomas Reps, Mooly Sagiv, Sriram Sankaranarayanan, Axel Simon,\n"
+"Fausto Spoto, Basile Starynkevitch, Pedro Vasconcelos, Ralf Wildenhues.";
+
+} // namespace
+
+unsigned
+PPL::version_major() {
+  return PPL_VERSION_MAJOR;
+}
+
+unsigned
+PPL::version_minor() {
+  return PPL_VERSION_MINOR;
+}
+
+unsigned
+PPL::version_revision() {
+  return PPL_VERSION_REVISION;
+}
+
+unsigned
+PPL::version_beta() {
+  return PPL_VERSION_BETA;
+}
+
+const char*
+PPL::version() {
+  return version_string;
+}
+
+const char*
+PPL::banner() {
+  return banner_string;
+}
diff --git a/src/version.hh.in b/src/version.hh.in
new file mode 100644
index 0000000..4d0fd20
--- /dev/null
+++ b/src/version.hh.in
@@ -0,0 +1,98 @@
+/* Declaration of macros and functions providing version  -*- C++ -*-
+   and licensing information.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_version_hh
+#define PPL_version_hh 1
+
+//! The major number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+//! The revision number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_REVISION @PPL_VERSION_REVISION@
+
+/*! \brief
+  The beta number of the PPL version.  This is zero for official
+  releases and nonzero for development snapshots.
+  \ingroup PPL_CXX_interface
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
+
+//! A string containing the PPL version.
+/*! \ingroup PPL_CXX_interface
+  Let <CODE>M</CODE> and <CODE>m</CODE> denote the numbers associated
+  to PPL_VERSION_MAJOR and PPL_VERSION_MINOR, respectively.  The
+  format of PPL_VERSION is <CODE>M "." m</CODE> if both
+  PPL_VERSION_REVISION (<CODE>r</CODE>) and PPL_VERSION_BETA
+  (<CODE>b</CODE>)are zero, <CODE>M "." m "pre" b</CODE> if
+  PPL_VERSION_REVISION is zero and PPL_VERSION_BETA is not zero,
+  <CODE>M "." m "." r</CODE> if PPL_VERSION_REVISION is not zero and
+  PPL_VERSION_BETA is zero, <CODE>M "." m "." r "pre" b</CODE> if
+  neither PPL_VERSION_REVISION nor PPL_VERSION_BETA are zero.
+*/
+#define PPL_VERSION "@VERSION@"
+
+namespace Parma_Polyhedra_Library {
+
+//! \name Library Version Control Functions
+//@{
+
+//! Returns the major number of the PPL version.
+unsigned
+version_major();
+
+//! Returns the minor number of the PPL version.
+unsigned
+version_minor();
+
+//! Returns the revision number of the PPL version.
+unsigned
+version_revision();
+
+//! Returns the beta number of the PPL version.
+unsigned
+version_beta();
+
+//! Returns a character string containing the PPL version.
+const char* version();
+
+//! Returns a character string containing the PPL banner.
+/*!
+  The banner provides information about the PPL version, the licensing,
+  the lack of any warranty whatsoever, the C++ compiler used to build
+  the library, where to report bugs and where to look for further
+  information.
+*/
+const char* banner();
+
+//@} // Library Version Control Functions
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_version_hh)
diff --git a/src/wrap_assign.hh b/src/wrap_assign.hh
new file mode 100644
index 0000000..d45f9d6
--- /dev/null
+++ b/src/wrap_assign.hh
@@ -0,0 +1,380 @@
+/* Generic implementation of the wrap_assign() function.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_wrap_assign_hh
+#define PPL_wrap_assign_hh 1
+
+#include "globals_defs.hh"
+#include "Coefficient_defs.hh"
+#include "Variable_defs.hh"
+#include "Constraint_System_defs.hh"
+#include "assert.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+struct Wrap_Dim_Translations {
+  Variable var;
+  Coefficient first_quadrant;
+  Coefficient last_quadrant;
+  Wrap_Dim_Translations(Variable v,
+                        Coefficient_traits::const_reference f,
+                        Coefficient_traits::const_reference l)
+    : var(v), first_quadrant(f), last_quadrant(l) {
+  }
+};
+
+typedef std::vector<Wrap_Dim_Translations> Wrap_Translations;
+
+template <typename PSET>
+void
+wrap_assign_ind(PSET& pointset,
+                Variables_Set& vars,
+                Wrap_Translations::const_iterator first,
+                Wrap_Translations::const_iterator end,
+                Bounded_Integer_Type_Width w,
+                Coefficient_traits::const_reference min_value,
+                Coefficient_traits::const_reference max_value,
+                const Constraint_System& cs,
+                Coefficient& tmp1,
+                Coefficient& tmp2) {
+  const dimension_type space_dim = pointset.space_dimension();
+  for (Wrap_Translations::const_iterator i = first; i != end; ++i) {
+    const Wrap_Dim_Translations& wrap_dim_translations = *i;
+    const Variable x(wrap_dim_translations.var);
+    const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+    const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+    Coefficient& quadrant = tmp1;
+    Coefficient& shift = tmp2;
+    PSET hull(space_dim, EMPTY);
+    for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+      PSET p(pointset);
+      if (quadrant != 0) {
+        mul_2exp_assign(shift, quadrant, w);
+        p.affine_image(x, x - shift, 1);
+      }
+      // `x' has just been wrapped.
+      vars.erase(x.id());
+
+      // Refine `p' with all the constraints in `cs' not depending
+      // on variables in `vars'.
+      if (vars.empty())
+        p.refine_with_constraints(cs);
+      else {
+        for (Constraint_System::const_iterator j = cs.begin(),
+               cs_end = cs.end(); j != cs_end; ++j)
+          if (j->expression().all_zeroes(vars))
+            // `*j' does not depend on variables in `vars'.
+            p.refine_with_constraint(*j);
+      }
+      p.refine_with_constraint(min_value <= x);
+      p.refine_with_constraint(x <= max_value);
+      hull.upper_bound_assign(p);
+    }
+    pointset.m_swap(hull);
+  }
+}
+
+template <typename PSET>
+void
+wrap_assign_col(PSET& dest,
+                const PSET& src,
+                const Variables_Set& vars,
+                Wrap_Translations::const_iterator first,
+                Wrap_Translations::const_iterator end,
+                Bounded_Integer_Type_Width w,
+                Coefficient_traits::const_reference min_value,
+                Coefficient_traits::const_reference max_value,
+                const Constraint_System* cs_p,
+                Coefficient& tmp) {
+  if (first == end) {
+    PSET p(src);
+    if (cs_p != 0)
+      p.refine_with_constraints(*cs_p);
+    for (Variables_Set::const_iterator i = vars.begin(),
+           vars_end = vars.end(); i != vars_end; ++i) {
+      const Variable x(*i);
+      p.refine_with_constraint(min_value <= x);
+      p.refine_with_constraint(x <= max_value);
+    }
+    dest.upper_bound_assign(p);
+  }
+  else {
+    const Wrap_Dim_Translations& wrap_dim_translations = *first;
+    const Variable x(wrap_dim_translations.var);
+    const Coefficient& first_quadrant = wrap_dim_translations.first_quadrant;
+    const Coefficient& last_quadrant = wrap_dim_translations.last_quadrant;
+    Coefficient& shift = tmp;
+    PPL_DIRTY_TEMP_COEFFICIENT(quadrant);
+    for (quadrant = first_quadrant; quadrant <= last_quadrant; ++quadrant) {
+      if (quadrant != 0) {
+        mul_2exp_assign(shift, quadrant, w);
+        PSET p(src);
+        p.affine_image(x, x - shift, 1);
+        wrap_assign_col(dest, p, vars, first+1, end, w, min_value, max_value,
+                        cs_p, tmp);
+      }
+      else
+        wrap_assign_col(dest, src, vars, first+1, end, w, min_value, max_value,
+                        cs_p, tmp);
+    }
+  }
+}
+
+template <typename PSET>
+void
+wrap_assign(PSET& pointset,
+            const Variables_Set& vars,
+            const Bounded_Integer_Type_Width w,
+            const Bounded_Integer_Type_Representation r,
+            const Bounded_Integer_Type_Overflow o,
+            const Constraint_System* cs_p,
+            const unsigned complexity_threshold,
+            const bool wrap_individually,
+            const char* class_name) {
+  // We must have cs_p->space_dimension() <= vars.space_dimension()
+  //         and  vars.space_dimension() <= pointset.space_dimension().
+
+  // Dimension-compatibility check of `*cs_p', if any.
+  if (cs_p != 0) {
+    const dimension_type vars_space_dim = vars.space_dimension();
+    if (cs_p->space_dimension() > vars_space_dim) {
+      std::ostringstream s;
+      s << "PPL::" << class_name << "::wrap_assign(..., cs_p, ...):"
+        << std::endl
+        << "vars.space_dimension() == " << vars_space_dim
+        << ", cs_p->space_dimension() == " << cs_p->space_dimension() << ".";
+      throw std::invalid_argument(s.str());
+    }
+
+#ifndef NDEBUG
+    // Check that all variables upon which `*cs_p' depends are in `vars'.
+    // An assertion is violated otherwise.
+    const Constraint_System cs = *cs_p;
+    const dimension_type cs_space_dim = cs.space_dimension();
+    Variables_Set::const_iterator vars_end = vars.end();
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i) {
+      const Constraint& c = *i;
+      for (dimension_type d = cs_space_dim; d-- > 0; ) {
+        PPL_ASSERT(c.coefficient(Variable(d)) == 0
+                   || vars.find(d) != vars_end);
+      }
+    }
+#endif
+  }
+
+  // Wrapping no variable only requires refining with *cs_p, if any.
+  if (vars.empty()) {
+    if (cs_p != 0)
+      pointset.refine_with_constraints(*cs_p);
+    return;
+  }
+
+  // Dimension-compatibility check of `vars'.
+  const dimension_type space_dim = pointset.space_dimension();
+  if (vars.space_dimension() > space_dim) {
+    std::ostringstream s;
+    s << "PPL::" << class_name << "::wrap_assign(vs, ...):" << std::endl
+      << "this->space_dimension() == " << space_dim
+      << ", required space dimension == " << vars.space_dimension() << ".";
+    throw std::invalid_argument(s.str());
+  }
+
+  // Wrapping an empty polyhedron is a no-op.
+  if (pointset.is_empty())
+    return;
+
+  // Set `min_value' and `max_value' to the minimum and maximum values
+  // a variable of width `w' and signedness `s' can take.
+  PPL_DIRTY_TEMP_COEFFICIENT(min_value);
+  PPL_DIRTY_TEMP_COEFFICIENT(max_value);
+  if (r == UNSIGNED) {
+    min_value = 0;
+    mul_2exp_assign(max_value, Coefficient_one(), w);
+    --max_value;
+  }
+  else {
+    PPL_ASSERT(r == SIGNED_2_COMPLEMENT);
+    mul_2exp_assign(max_value, Coefficient_one(), w-1);
+    neg_assign(min_value, max_value);
+    --max_value;
+  }
+
+  // If we are wrapping variables collectively, the ranges for the
+  // required translations are saved in `translations' instead of being
+  // immediately applied.
+  Wrap_Translations translations;
+
+  // Dimensions subject to translation are added to this set if we are
+  // wrapping collectively or if `cs_p' is non null.
+  Variables_Set dimensions_to_be_translated;
+
+  // This will contain a lower bound to the number of abstractions
+  // to be joined in order to obtain the collective wrapping result.
+  // As soon as this exceeds `complexity_threshold', counting will be
+  // interrupted and the full range will be the result of wrapping
+  // any dimension that is not fully contained in quadrant 0.
+  unsigned collective_wrap_complexity = 1;
+
+  // This flag signals that the maximum complexity for collective
+  // wrapping as been exceeded.
+  bool collective_wrap_too_complex = false;
+
+  if (!wrap_individually) {
+    translations.reserve(space_dim);
+  }
+
+  // We use `full_range_bounds' to delay conversions whenever
+  // this delay does not negatively affect precision.
+  Constraint_System full_range_bounds;
+
+  PPL_DIRTY_TEMP_COEFFICIENT(l_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(l_d);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_n);
+  PPL_DIRTY_TEMP_COEFFICIENT(u_d);
+
+  for (Variables_Set::const_iterator i = vars.begin(),
+         vars_end = vars.end(); i != vars_end; ++i) {
+
+    const Variable x(*i);
+
+    bool extremum;
+
+    if (!pointset.minimize(x, l_n, l_d, extremum)) {
+    set_full_range:
+      pointset.unconstrain(x);
+      full_range_bounds.insert(min_value <= x);
+      full_range_bounds.insert(x <= max_value);
+      continue;
+    }
+
+    if (!pointset.maximize(x, u_n, u_d, extremum))
+      goto set_full_range;
+
+    div_assign_r(l_n, l_n, l_d, ROUND_DOWN);
+    div_assign_r(u_n, u_n, u_d, ROUND_DOWN);
+    l_n -= min_value;
+    u_n -= min_value;
+    div_2exp_assign_r(l_n, l_n, w, ROUND_DOWN);
+    div_2exp_assign_r(u_n, u_n, w, ROUND_DOWN);
+    Coefficient& first_quadrant = l_n;
+    const Coefficient& last_quadrant = u_n;
+
+    // Special case: this variable does not need wrapping.
+    if (first_quadrant == 0 && last_quadrant == 0)
+      continue;
+
+    // If overflow is impossible, try not to add useless constraints.
+    if (o == OVERFLOW_IMPOSSIBLE) {
+      if (first_quadrant < 0)
+        full_range_bounds.insert(min_value <= x);
+      if (last_quadrant > 0)
+        full_range_bounds.insert(x <= max_value);
+      continue;
+    }
+
+    if (o == OVERFLOW_UNDEFINED || collective_wrap_too_complex)
+      goto set_full_range;
+
+    Coefficient& quadrants = u_d;
+    quadrants = last_quadrant - first_quadrant + 1;
+
+    PPL_UNINITIALIZED(unsigned, extension);
+    Result res = assign_r(extension, quadrants, ROUND_IGNORE);
+    if (result_overflow(res) != 0 || extension > complexity_threshold)
+      goto set_full_range;
+
+    if (!wrap_individually && !collective_wrap_too_complex) {
+      res = mul_assign_r(collective_wrap_complexity,
+                         collective_wrap_complexity, extension, ROUND_IGNORE);
+      if (result_overflow(res) != 0
+          || collective_wrap_complexity > complexity_threshold)
+        collective_wrap_too_complex = true;
+      if (collective_wrap_too_complex) {
+        // Set all the dimensions in `translations' to full range.
+        for (Wrap_Translations::const_iterator j = translations.begin(),
+               translations_end = translations.end();
+             j != translations_end;
+             ++j) {
+          const Variable y(j->var);
+          pointset.unconstrain(y);
+          full_range_bounds.insert(min_value <= y);
+          full_range_bounds.insert(y <= max_value);
+        }
+      }
+    }
+
+    if (wrap_individually && cs_p == 0) {
+      Coefficient& quadrant = first_quadrant;
+      // Temporary variable holding the shifts to be applied in order
+      // to implement the translations.
+      Coefficient& shift = l_d;
+      PSET hull(space_dim, EMPTY);
+      for ( ; quadrant <= last_quadrant; ++quadrant) {
+        PSET p(pointset);
+        if (quadrant != 0) {
+          mul_2exp_assign(shift, quadrant, w);
+          p.affine_image(x, x - shift, 1);
+        }
+        p.refine_with_constraint(min_value <= x);
+        p.refine_with_constraint(x <= max_value);
+        hull.upper_bound_assign(p);
+      }
+      pointset.m_swap(hull);
+    }
+    else if (wrap_individually || !collective_wrap_too_complex) {
+      PPL_ASSERT(!wrap_individually || cs_p != 0);
+      dimensions_to_be_translated.insert(x);
+      translations
+        .push_back(Wrap_Dim_Translations(x, first_quadrant, last_quadrant));
+    }
+  }
+
+  if (!translations.empty()) {
+    if (wrap_individually) {
+      PPL_ASSERT(cs_p != 0);
+      wrap_assign_ind(pointset, dimensions_to_be_translated,
+                      translations.begin(), translations.end(),
+                      w, min_value, max_value, *cs_p, l_n, l_d);
+    }
+    else {
+      PSET hull(space_dim, EMPTY);
+      wrap_assign_col(hull, pointset, dimensions_to_be_translated,
+                      translations.begin(), translations.end(),
+                      w, min_value, max_value, cs_p, l_n);
+      pointset.m_swap(hull);
+    }
+  }
+
+  if (cs_p != 0)
+    pointset.refine_with_constraints(*cs_p);
+  pointset.refine_with_constraints(full_range_bounds);
+}
+
+} // namespace Implementation
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_wrap_assign_hh)
diff --git a/src/wrap_string.cc b/src/wrap_string.cc
new file mode 100644
index 0000000..e789f3a
--- /dev/null
+++ b/src/wrap_string.cc
@@ -0,0 +1,95 @@
+/* String wrapping helper function.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "wrap_string.hh"
+#include "assert.hh"
+#include <cstdlib>
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+std::string
+wrap_string(const std::string& src_string,
+            const unsigned indent_depth,
+            const unsigned preferred_first_line_length,
+            const unsigned preferred_line_length) {
+  const unsigned npos = C_Integer<unsigned>::max;
+  std::string dst_string;
+  const char *src = src_string.c_str();
+  for (unsigned line = 0; ; ++line) {
+    const unsigned line_length = ((line == 0)
+                                  ? preferred_first_line_length
+                                  : preferred_line_length);
+    unsigned last_comma = npos;
+    unsigned last_space = npos;
+    unsigned split_pos = npos;
+    unsigned idx;
+    for (idx = 0; idx <= line_length; ++idx) {
+      if (src[idx] == '\0' || src[idx] == '\n') {
+        split_pos = idx;
+        break;
+      }
+      if (src[idx] == ',' && idx < line_length)
+        last_comma = idx;
+      if (is_space(src[idx]) && (idx == 0 || !is_space(src[idx-1])))
+        last_space = idx;
+    }
+    if (split_pos == npos) {
+      if (last_comma != npos)
+        split_pos = last_comma + 1;
+      else if (last_space != npos)
+        split_pos = last_space;
+      else {
+        for ( ; src[idx] != '\0'; ++idx) {
+          if (src[idx] == ',') {
+            ++idx;
+            break;
+          }
+          if (is_space(src[idx]))
+            break;
+        }
+        split_pos = idx;
+      }
+    }
+    PPL_ASSERT(split_pos != npos);
+    if (split_pos > 0 && line > 0 && indent_depth > 0)
+      dst_string.append(indent_depth, ' ');
+    dst_string.append(src, split_pos);
+    src += split_pos;
+    if (is_space(*src))
+      ++src;
+    while (*src == ' ')
+      ++src;
+    if (*src == '\0')
+      break;
+    dst_string.push_back('\n');
+  }
+  return dst_string;
+}
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/wrap_string.hh b/src/wrap_string.hh
new file mode 100644
index 0000000..fa278c7
--- /dev/null
+++ b/src/wrap_string.hh
@@ -0,0 +1,60 @@
+/* Declaration of string wrapping function.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_wrap_hh
+#define PPL_wrap_hh 1
+
+#include "globals_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Utility function for the wrapping of lines of text.
+/*!
+  \param src_string
+  The source string holding the lines to wrap.
+
+  \param indent_depth
+  The indentation depth.
+
+  \param preferred_first_line_length
+  The preferred length for the first line of text.
+
+  \param preferred_line_length
+  The preferred length for all the lines but the first one.
+
+  \return
+  The wrapped string.
+*/
+std::string
+wrap_string(const std::string& src_string,
+            unsigned indent_depth,
+            unsigned preferred_first_line_length,
+            unsigned preferred_line_length);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_wrap_hh)
diff --git a/test-driver b/test-driver
new file mode 100755
index 0000000..32bf39e
--- /dev/null
+++ b/test-driver
@@ -0,0 +1,127 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2012-06-27.10; # UTC
+
+# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+# TODO: better error handling in option parsing (in particular, ensure
+# TODO: $log_file, $trs_file and $test_name are defined).
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+  esac
+  shift
+done
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='' # Red.
+  grn='' # Green.
+  lgn='' # Light green.
+  blu='' # Blue.
+  mgn='' # Magenta.
+  std=''     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  estatus=1
+fi
+
+case $estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/tests/BD_Shape/Makefile.am b/tests/BD_Shape/Makefile.am
new file mode 100644
index 0000000..ee2de99
--- /dev/null
+++ b/tests/BD_Shape/Makefile.am
@@ -0,0 +1,319 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+check_PROGRAMS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhmz05widening1 \
+bhz03widening1 \
+bounded1 \
+bounds1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76extrapolation1 \
+closure1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+geomcovers1 \
+h79widening1 \
+integerupperboundifexact1 \
+intersection1 \
+limitedbhmz05extrapolation1 \
+limitedcc76extrapolation1 \
+limitedh79extrapolation1 \
+mapspacedims1 \
+max_min1 max_min2 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+relations1 relations2 relations3 relations4 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writebdshape1
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DBD_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCE=float
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCE=double
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCE=long_double
+endif
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+closure1_SOURCES = closure1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+
+wrap1_SOURCES = wrap1.cc
+
+writebdshape1_SOURCES = writebdshape1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
diff --git a/tests/BD_Shape/Makefile.in b/tests/BD_Shape/Makefile.in
new file mode 100644
index 0000000..540ae3f
--- /dev/null
+++ b/tests/BD_Shape/Makefile.in
@@ -0,0 +1,1868 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
+	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+	affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
+	ascii_dump_load1$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
+	bhmz05widening1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) bounds1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	cc76narrowing1$(EXEEXT) cc76extrapolation1$(EXEEXT) \
+	closure1$(EXEEXT) concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+	constrains1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+	discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+	dropsomenonintegerpoints1$(EXEEXT) empty1$(EXEEXT) \
+	equality1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgensys1$(EXEEXT) \
+	fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) fromspacedim1$(EXEEXT) \
+	generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) geomcovers1$(EXEEXT) \
+	h79widening1$(EXEEXT) integerupperboundifexact1$(EXEEXT) \
+	intersection1$(EXEEXT) limitedbhmz05extrapolation1$(EXEEXT) \
+	limitedcc76extrapolation1$(EXEEXT) \
+	limitedh79extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+	max_min1$(EXEEXT) max_min2$(EXEEXT) maxspacedim1$(EXEEXT) \
+	membytes1$(EXEEXT) minconstraints1$(EXEEXT) \
+	relations1$(EXEEXT) relations2$(EXEEXT) relations3$(EXEEXT) \
+	relations4$(EXEEXT) removespacedims1$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+	unconstrain1$(EXEEXT) universe1$(EXEEXT) upperbound1$(EXEEXT) \
+	upperboundifexact1$(EXEEXT) wrap1$(EXEEXT) \
+	writebdshape1$(EXEEXT)
+XFAIL_TESTS =
+subdir = tests/BD_Shape
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+	$(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhmz05widening1_OBJECTS = bhmz05widening1.$(OBJEXT)
+bhmz05widening1_OBJECTS = $(am_bhmz05widening1_OBJECTS)
+bhmz05widening1_LDADD = $(LDADD)
+bhmz05widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
+cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
+cc76extrapolation1_LDADD = $(LDADD)
+cc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_closure1_OBJECTS = closure1.$(OBJEXT)
+closure1_OBJECTS = $(am_closure1_OBJECTS)
+closure1_LDADD = $(LDADD)
+closure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS =  \
+	dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS =  \
+	$(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equality1_OBJECTS = equality1.$(OBJEXT)
+equality1_OBJECTS = $(am_equality1_OBJECTS)
+equality1_LDADD = $(LDADD)
+equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS =  \
+	generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS =  \
+	$(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_h79widening1_OBJECTS = h79widening1.$(OBJEXT)
+h79widening1_OBJECTS = $(am_h79widening1_OBJECTS)
+h79widening1_LDADD = $(LDADD)
+h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_integerupperboundifexact1_OBJECTS =  \
+	integerupperboundifexact1.$(OBJEXT)
+integerupperboundifexact1_OBJECTS =  \
+	$(am_integerupperboundifexact1_OBJECTS)
+integerupperboundifexact1_LDADD = $(LDADD)
+integerupperboundifexact1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedbhmz05extrapolation1_OBJECTS =  \
+	limitedbhmz05extrapolation1.$(OBJEXT)
+limitedbhmz05extrapolation1_OBJECTS =  \
+	$(am_limitedbhmz05extrapolation1_OBJECTS)
+limitedbhmz05extrapolation1_LDADD = $(LDADD)
+limitedbhmz05extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS =  \
+	limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS =  \
+	$(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedh79extrapolation1_OBJECTS =  \
+	limitedh79extrapolation1.$(OBJEXT)
+limitedh79extrapolation1_OBJECTS =  \
+	$(am_limitedh79extrapolation1_OBJECTS)
+limitedh79extrapolation1_LDADD = $(LDADD)
+limitedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min2_OBJECTS = max_min2.$(OBJEXT)
+max_min2_OBJECTS = $(am_max_min2_OBJECTS)
+max_min2_LDADD = $(LDADD)
+max_min2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations4_OBJECTS = relations4.$(OBJEXT)
+relations4_OBJECTS = $(am_relations4_OBJECTS)
+relations4_LDADD = $(LDADD)
+relations4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperboundifexact1_OBJECTS = upperboundifexact1.$(OBJEXT)
+upperboundifexact1_OBJECTS = $(am_upperboundifexact1_OBJECTS)
+upperboundifexact1_LDADD = $(LDADD)
+upperboundifexact1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writebdshape1_OBJECTS = writebdshape1.$(OBJEXT)
+writebdshape1_OBJECTS = $(am_writebdshape1_OBJECTS)
+writebdshape1_LDADD = $(LDADD)
+writebdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bhmz05widening1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(closure1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) \
+	$(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+	$(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+	$(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(geomcovers1_SOURCES) \
+	$(h79widening1_SOURCES) $(integerupperboundifexact1_SOURCES) \
+	$(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(relations4_SOURCES) $(removespacedims1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+	$(wrap1_SOURCES) $(writebdshape1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bhmz05widening1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(closure1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) \
+	$(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+	$(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+	$(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(geomcovers1_SOURCES) \
+	$(h79widening1_SOURCES) $(integerupperboundifexact1_SOURCES) \
+	$(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(relations4_SOURCES) $(removespacedims1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+	$(wrap1_SOURCES) $(writebdshape1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DBD_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCE = long_double
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+
+#
+# Sources for the tests
+#
+addconstraints1_SOURCES = addconstraints1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+closure1_SOURCES = closure1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+removespacedims1_SOURCES = removespacedims1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+wrap1_SOURCES = wrap1.cc
+writebdshape1_SOURCES = writebdshape1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/BD_Shape/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/BD_Shape/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) $(EXTRA_bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f bgp99extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) $(EXTRA_bhmz05widening1_DEPENDENCIES) 
+	@rm -f bhmz05widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) $(EXTRA_cc76extrapolation1_DEPENDENCIES) 
+	@rm -f cc76extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) $(EXTRA_cc76narrowing1_DEPENDENCIES) 
+	@rm -f cc76narrowing1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+
+closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) $(EXTRA_closure1_DEPENDENCIES) 
+	@rm -f closure1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES) 
+	@rm -f difference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES) 
+	@rm -f dropsomenonintegerpoints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) $(EXTRA_equality1_DEPENDENCIES) 
+	@rm -f equality1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES) 
+	@rm -f frequency1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) $(EXTRA_fromgensys1_DEPENDENCIES) 
+	@rm -f fromgensys1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) $(EXTRA_fromspacedim1_DEPENDENCIES) 
+	@rm -f fromspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage3_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) $(EXTRA_geomcovers1_DEPENDENCIES) 
+	@rm -f geomcovers1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) $(EXTRA_h79widening1_DEPENDENCIES) 
+	@rm -f h79widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+
+integerupperboundifexact1$(EXEEXT): $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_DEPENDENCIES) $(EXTRA_integerupperboundifexact1_DEPENDENCIES) 
+	@rm -f integerupperboundifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) $(EXTRA_limitedbhmz05extrapolation1_DEPENDENCIES) 
+	@rm -f limitedbhmz05extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) $(EXTRA_limitedcc76extrapolation1_DEPENDENCIES) 
+	@rm -f limitedcc76extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) $(EXTRA_limitedh79extrapolation1_DEPENDENCIES) 
+	@rm -f limitedh79extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) $(EXTRA_max_min2_DEPENDENCIES) 
+	@rm -f max_min2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) $(EXTRA_relations4_DEPENDENCIES) 
+	@rm -f relations4$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES) 
+	@rm -f upperbound1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) $(EXTRA_upperboundifexact1_DEPENDENCIES) 
+	@rm -f upperboundifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES) 
+	@rm -f wrap1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writebdshape1$(EXEEXT): $(writebdshape1_OBJECTS) $(writebdshape1_DEPENDENCIES) $(EXTRA_writebdshape1_DEPENDENCIES) 
+	@rm -f writebdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writebdshape1_OBJECTS) $(writebdshape1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/integerupperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhmz05extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebdshape1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/BD_Shape/addconstraints1.cc b/tests/BD_Shape/addconstraints1.cc
new file mode 100644
index 0000000..36c855c
--- /dev/null
+++ b/tests/BD_Shape/addconstraints1.cc
@@ -0,0 +1,182 @@
+/* Test BD_Shape::add_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 5);
+
+  TBD_Shape bds(2);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds.add_constraints(cs) ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.add_constraint(B - A <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::add_constraint: it is illegal
+    // to add a strict inequality.
+    bds.add_constraint(x <= 0);
+    bds.add_constraint(y < 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::add_constraint: it is illegal
+    // to add a constraint with bigger dimension.
+    bds.add_constraint(x <= 0);
+    bds.add_constraint(y - x + z >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(1);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::add_constraints(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    bds.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable y(1);
+
+  TBD_Shape bds(1);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::add_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    bds.add_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(1);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::add_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    bds.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/addspacedims1.cc b/tests/BD_Shape/addspacedims1.cc
new file mode 100644
index 0000000..b5a2bf6
--- /dev/null
+++ b/tests/BD_Shape/addspacedims1.cc
@@ -0,0 +1,334 @@
+/* Test BD_Shape::add_space_dimensions_and_embed():
+   we add two variables to a BD_Shape.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_embed(2);
+  bds.add_constraint(z <= 2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.add_space_dimensions_and_embed(2) "
+                    "and bds.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(1, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.add_space_dimensions_and_embed(2);
+  bds2.add_space_dimensions_and_embed(1);
+
+  bool ok = (bds1 == bds2);
+
+  print_constraints(bds1, "*** bds1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(bds2, "*** bds2.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_embed(3);
+
+  BD_Shape<mpq_class> known_result(3, UNIVERSE);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.add_space_dimension_and_embed(3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_project(4);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(C - B >= 9);
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_project(0);
+
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(0) ***");
+
+  bool ok = check_result(bds, known_result);
+
+  return ok;
+}
+
+bool
+test06() {
+  //Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_project(3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bds(10, UNIVERSE);
+
+  bds.remove_higher_space_dimensions(5);
+  bds.add_space_dimensions_and_embed(6);
+
+  return bds == TBD_Shape(11, UNIVERSE);
+}
+
+bool
+test08() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_project(2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(z == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(1, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.add_space_dimensions_and_project(2);
+  bds2.add_space_dimensions_and_project(1);
+
+  bool ok = (bds1 == bds2);
+
+  print_constraints(bds1, "*** bds1.add_space_dimensions_and_project(2) ***");
+  print_constraints(bds2, "*** bds2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TBD_Shape bds(0, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_project(3);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.add_space_dimension_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.add_space_dimensions_and_project(4);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(A <= 2);
+
+  TBD_Shape bds2(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.add_space_dimensions_and_project(0);
+  bds1.add_space_dimensions_and_embed(0);
+
+  bool ok = (bds1 == bds2);
+
+  print_constraints(bds1, "*** bds1.add_space_dimensions_and_project(0) ***");
+  print_constraints(bds2, "*** bds2.add_space_dimensions_and_embed(0) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 2);
+
+  TBD_Shape bds(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.minimized_constraints();
+  bds.add_space_dimensions_and_embed(3);
+  bds.add_constraint(z <= 2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(bds, known_result) ;
+
+  print_constraints(bds,
+                    "*** bds.add_space_dimensions_and_embed(2) "
+                    "and bds.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/BD_Shape/affinedimension1.cc b/tests/BD_Shape/affinedimension1.cc
new file mode 100644
index 0000000..5b06632
--- /dev/null
+++ b/tests/BD_Shape/affinedimension1.cc
@@ -0,0 +1,307 @@
+/* Test BD_Shape::affine_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y == 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+
+  bds.add_constraint(A == 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B - A <= -5);
+  bds.add_constraint(-B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(E == 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(7);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B == 2);
+  bds.add_constraint(B - A <= -6);
+
+  print_constraints(bds, "*** bds ***");
+
+  dimension_type affine_dim = bds.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `bds' "
+       << endl
+       << affine_dim
+       << endl;
+
+   bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test11() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  const dimension_type affine_dim = bds.affine_dimension();
+
+  print_constraints(bds, "*** bds ***");
+
+  return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
+
+
diff --git a/tests/BD_Shape/affineimage1.cc b/tests/BD_Shape/affineimage1.cc
new file mode 100644
index 0000000..eb9de6a
--- /dev/null
+++ b/tests/BD_Shape/affineimage1.cc
@@ -0,0 +1,443 @@
+/* Test BD_Shape::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, y);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, x + 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 7);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, x + 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, Linear_Expression(4));
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x == 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.affine_image(x, x);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, x) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(y, 2*x, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(y, 2*x, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(y, 3*x + 3, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(y, 3*x + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -2*x - 3*y + 1, -5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*x >= -4);
+  known_result.add_constraint(5*x <= 7);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(y - x <= 1);
+  known_result.add_constraint(5*x - 5*y <= 3);
+
+  bool ok = check_result(bds, known_result, "3.70e-7", "2.10e-7", "1.44e-7");
+
+  print_constraints(bds, "*** bds.affine_image(x, -2*x - 3*y + 1, -5) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z >= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(z, x + 2*y -3*z + 2, 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(2*z <= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(z, x + 2*y -3*z + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(B >= 1);
+  bds.add_constraint(C <= 0);
+  bds.add_constraint(D == 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(A, -B + 2*C + 1, -3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C <= 0);
+  known_result.add_constraint(D == 3);
+  known_result.add_constraint(3*B - 3*A <= 5);
+
+  bool ok = check_result(bds, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+  print_constraints(bds, "*** bds.affine_image(A, -B + 2*C + 1, -3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, 2*y + z + 2, 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, 2*y + z + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x - y >= 0);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x <= 2);
+
+  Linear_Expression coeff1 = x + 1;
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    bds.affine_image(x, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // BD_Shape::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    bds.affine_image(y, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 1);
+  bds.add_constraint(y >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // BD_Shape::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    bds.affine_image(y, x + z + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x - y >= 0);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x <= 2);
+
+  Linear_Expression coeff1 = 2*x + 1;
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    bds.affine_image(x, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/affineimage2.cc b/tests/BD_Shape/affineimage2.cc
new file mode 100644
index 0000000..07cfca4
--- /dev/null
+++ b/tests/BD_Shape/affineimage2.cc
@@ -0,0 +1,352 @@
+/* Test BD_Shape::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z >= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -x);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(z >= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, -x) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z >= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -z);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= -3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(z >= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, -z) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(x >= -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, -y + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -2*y + 1, -2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*x - 2*y == -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, -2*y + 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -2*y + 1, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*x <= -1);
+  known_result.add_constraint(2*x >= -3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, -2*y + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, 2*x + y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(x - y <= 3);
+  known_result.add_constraint(x - y >= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, 2*x + y + 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -2*x + y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(x - y <= 1);
+  known_result.add_constraint(x - y >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_image(x, -2*x + y + 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, 2*x - 3*y + 1, 5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*x <= 6);
+  known_result.add_constraint(x >= -1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(bds, known_result, "9.54e-8", "6.75e-8", "4.77e-8");
+
+  print_constraints(bds, "*** bds.affine_image(x, 2*x - 3*y + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, -2*x - 3*y + 1, 5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*x <= 4);
+  known_result.add_constraint(5*x >= -7);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(bds, known_result, "2.15e-7", "1.36e-7", "9.54e-8");
+
+  print_constraints(bds, "*** bds.affine_image(x, -2*x - 3*y + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, 2*x - 3*y + 1, -5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(5*x >= -6);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(5*x - 5*y <= 1);
+  known_result.add_constraint(5*x - 5*y >= -7);
+
+  bool ok = check_result(bds, known_result, "1.91e-7", "1.17e-7", "9.54e-8");
+
+  print_constraints(bds, "*** bds.affine_image(x, 2*x - 3*y + 1, -5) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(y >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(z <= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(x, y + 5*z, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*x <= 17);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(z <= 3);
+  known_result.add_constraint(x - y <= 5);
+  known_result.add_constraint(3*x - 3*z <= 8);
+
+  bool ok = check_result(bds, known_result, "1.12e-6", "6.56e-7", "4.77e-7");
+
+  print_constraints(bds, "*** bds.affine_image(x, y + 5*z, 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/affinepreimage1.cc b/tests/BD_Shape/affinepreimage1.cc
new file mode 100644
index 0000000..268cee8
--- /dev/null
+++ b/tests/BD_Shape/affinepreimage1.cc
@@ -0,0 +1,455 @@
+/* Test BD_Shape::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(x, y);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B - 3 >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, B-1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, B-1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 2*A + 2, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(B, Linear_Expression(3));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::affine_preimage(v, expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    bds.affine_preimage(x, x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::affine_preimage(v, expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.affine_preimage(y, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 2*A + 3*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 2*A + 3*C + 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, -3*A + C - 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, 3*A + C - 1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, 3*A + C - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(A, -3*A + C - 1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(A, -3*A + C - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A == 2);
+  bds.add_constraint(B == 0);
+  bds.add_constraint(C >= -3);
+  bds.add_constraint(D <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 2);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C >= -3);
+  known_result.add_constraint(5*D <= 14);
+
+  bool ok = check_result(bds, known_result, "7.63e-7", "3.82e-7", "1.91e-7");
+
+  print_constraints(bds, "*** bds.affine_preimage"
+                        "(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_preimage(B, -B);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, -B) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.affine_preimage(B, -B, -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, -B, -1) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(B <= 0);
+  bds.add_constraint(C >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 0);
+
+  bds.affine_preimage(B, -3*B + 6, 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.affine_preimage(B, -3*B + 6, 3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.affine_image(A, 2*A, 3);
+
+  BD_Shape<mpq_class> mpq_known_result(1);
+  mpq_known_result.add_constraint(3*A <= -2);
+
+  bool ok = check_result(bds, mpq_known_result,
+                         "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(bds, "*** bds.affine_image(A, 2*A, 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/ascii_dump_load1.cc b/tests/BD_Shape/ascii_dump_load1.cc
new file mode 100644
index 0000000..5161c4c
--- /dev/null
+++ b/tests/BD_Shape/ascii_dump_load1.cc
@@ -0,0 +1,247 @@
+/* Test BD_Shape::ascii_dump() and BD_Shape::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+
+  nout << "test01()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bds1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-EM");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+
+  nout << "test02()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 1);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bds1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "+ZE");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  nout << "test03()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bds1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-SPC");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+
+  nout << "test04()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bds1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "+inf");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+
+  nout << "test05()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bds1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "+inf");
+  do
+    f >> str;
+  while (str != "+inf");
+  f.seekp(0, ios_base::cur);
+  f << " 3 ";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bds2;
+  bool ok = !bds2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B >= 2);
+  bds1.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  bds1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBD_Shape bds2;
+  bds2.ascii_load(f);
+  close(f);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = (bds1 == bds2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/bgp99extrapolation1.cc b/tests/BD_Shape/bgp99extrapolation1.cc
new file mode 100644
index 0000000..e44b969
--- /dev/null
+++ b/tests/BD_Shape/bgp99extrapolation1.cc
@@ -0,0 +1,94 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  typedef Pointset_Powerset<TBD_Shape> BDS_Set;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(-A + B >= 2);
+  bds1.add_constraint(A - B >= -4);
+  bds1.add_constraint(A >= 0);
+  TBD_Shape bds2(2);
+  bds2.add_constraint(-A + B >= 3);
+  bds2.add_constraint(A - B >= -8);
+  bds2.add_constraint(A >= 1);
+  TBD_Shape bds3(2);
+  bds3.add_constraint(-A + B >= 4);
+  bds3.add_constraint(A - B >= -12);
+  bds3.add_constraint(A >= 2);
+  TBD_Shape bds4(2);
+  bds4.add_constraint(-A + B >= 6);
+  bds4.add_constraint(A - B >= -16);
+  bds4.add_constraint(A >= 3);
+
+  BDS_Set bdss1(2, EMPTY);
+  bdss1.add_disjunct(bds1);
+  bdss1.add_disjunct(bds2);
+  bdss1.add_disjunct(bds3);
+
+  BDS_Set bdss2(bdss1);
+  bdss1.add_disjunct(bds4);
+
+  using namespace IO_Operators;
+  nout << "*** bdss1 ***" << endl
+       << bdss1 << endl;
+  nout << "*** bdss2 ***" << endl
+       << bdss2 << endl;
+
+  TBD_Shape bds5(2);
+  bds5.add_constraint(-A + B >= 4);
+  bds5.add_constraint(A >= 2);
+  bds5.add_constraint(B >= 6);
+
+  BDS_Set known_result(2, EMPTY);
+  known_result.add_disjunct(bds1);
+  known_result.add_disjunct(bds2);
+  known_result.add_disjunct(bds5);
+
+  bdss1.BGP99_extrapolation_assign
+    (bdss2, widen_fun_ref(&TBD_Shape::H79_widening_assign), 3);
+
+  bool ok = bdss1.geometrically_equals(known_result);
+
+  nout
+    << "*** bdss1.BGP99_extrapolation_assign"
+    << "(bdss2, widen_fun_ref(&H79_widening_assign), 3) ***"
+    << endl
+    << bdss1 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/bhmz05widening1.cc b/tests/BD_Shape/bhmz05widening1.cc
new file mode 100644
index 0000000..b742e0d
--- /dev/null
+++ b/tests/BD_Shape/bhmz05widening1.cc
@@ -0,0 +1,344 @@
+/* Test BD_Shape::BHMZ05_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(x - y <= 2);
+  bds1.add_constraint(y - x <= 7);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(x <= 0);
+  bds2.add_constraint(y - x <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.BHMZ05_widening_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1;
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.BHMZ05_widening_assign(bds2);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.BHMZ05_widening_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds1(5);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(C >= 1);
+  bds1.add_constraint(D >= 0);
+  bds1.add_constraint(E >= 0);
+  bds1.add_constraint(C - D <= 76);
+  bds1.add_constraint(C - E <= 76);
+  bds1.add_constraint(E - D == 0);
+
+  TBD_Shape bds2(5);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(C >= 1);
+  bds2.add_constraint(D >= 0);
+  bds2.add_constraint(E >= 0);
+  bds2.add_constraint(C - D <= 75);
+  bds2.add_constraint(C - E <= 75);
+  bds2.add_constraint(E - D == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.BHMZ05_widening_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(E - D == 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B <= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(A - C <= 1);
+  bds2.add_constraint(C - B <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.BHMZ05_widening_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B <= 1);
+  bds1.add_constraint(A - B >= 2);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(A - B >= 2);
+  bds2.add_constraint(A - C <= 1);
+  bds2.add_constraint(C - B <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.BHMZ05_widening_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+  return ok;
+}
+
+TBD_Shape
+aux_test06(int i, Variable a, Variable b, Variable c) {
+  TBD_Shape bds(3);
+  if (i == 0) {
+    bds.add_constraint(0 <= a-b);
+    bds.add_constraint(     a-b <= 0);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
+  }
+  else {
+    bds.add_constraint(-i <= a-b);
+    bds.add_constraint(      a-b <= i);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
+    bds.add_constraint(-i <= a-c);
+    bds.add_constraint(      a-c <= i);
+  }
+
+  using namespace IO_Operators;
+  nout << "*** n_" << i << " ***" << endl
+       << bds << endl;
+
+  // Force closure.
+  (void) (bds == bds);
+  return bds;
+}
+
+bool
+test06() {
+  Variable a(0);
+  Variable b(1);
+  Variable c(2);
+  unsigned i = 0;
+  TBD_Shape m_i = aux_test06(i, a, b, c);
+  TBD_Shape m_i_next;
+  while (i < 100) {
+
+    using namespace IO_Operators;
+    nout << "*** m_" << i << " ***" << endl
+         << m_i << endl;
+
+    m_i_next = aux_test06(++i, a, b, c);
+    m_i_next.upper_bound_assign(m_i);
+    m_i_next.BHMZ05_widening_assign(m_i);
+    // Force closure.
+    (void) (m_i_next == m_i_next);
+    if (m_i == m_i_next) {
+      BD_Shape<mpq_class> known_result(3);
+      known_result.add_constraint(-1 <= b-c);
+      known_result.add_constraint(      b-c <= 1);
+
+      bool ok = (BD_Shape<mpq_class>(m_i) == known_result);
+
+      nout << "*** m_" << i << " (fixpoint) ***" << endl
+           << m_i << endl;
+      print_constraints(known_result, "*** known_result ***");
+
+      return ok;
+    }
+    m_i = m_i_next;
+  }
+
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B <= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(A - B >= 2);
+  bds2.add_constraint(A - C <= 1);
+  bds2.add_constraint(C - B <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.BHMZ05_widening_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.BHMZ05_widening_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+
+  TBD_Shape bds1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+
+  TBD_Shape bds2(cs2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds2);
+
+  bds2.BHMZ05_widening_assign(bds1);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2,
+                    "*** bds2.BHMZ05_widening_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TBD_Shape bds1(5);
+  TBD_Shape bds2(10);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::BHMZ05_widening_assign(bds1): it is illegal to apply
+    // the method to two polyhedra that are not dimensional
+    // compatible.
+    bds2.BHMZ05_widening_assign(bds1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/bhz03widening1.cc b/tests/BD_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..bdc1f10
--- /dev/null
+++ b/tests/BD_Shape/bhz03widening1.cc
@@ -0,0 +1,77 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  typedef Pointset_Powerset<TBD_Shape> PSet;
+
+  TBD_Shape p(2);
+  TBD_Shape q(2);
+  TBD_Shape r(2);
+  TBD_Shape s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  PSet P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  PSet Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  using namespace IO_Operators;
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  PSet old_P = P;
+  P.BHZ03_widening_assign<H79_Certificate>
+    (Q, widen_fun_ref(&TBD_Shape::H79_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/bounded1.cc b/tests/BD_Shape/bounded1.cc
new file mode 100644
index 0000000..205a00f
--- /dev/null
+++ b/tests/BD_Shape/bounded1.cc
@@ -0,0 +1,97 @@
+/* Test BD_Shape::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  // This is a non-bounded BDS.
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return !bds.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded BDS (it is a square);
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(y >= 2);
+  bds.add_constraint(x <= 4);
+  bds.add_constraint(y <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+bool
+test03() {
+  // This is a universal, zero-dimensional BDS.
+  TBD_Shape bds;
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+bool
+test04() {
+  // This is an empty, zero-dimensional BDS.
+  TBD_Shape bds;
+  bds.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+bool
+test05() {
+  // This is an empty BDS.
+  TBD_Shape bds(4, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  return bds.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/boundedaffineimage1.cc b/tests/BD_Shape/boundedaffineimage1.cc
new file mode 100644
index 0000000..f1b2ad5
--- /dev/null
+++ b/tests/BD_Shape/boundedaffineimage1.cc
@@ -0,0 +1,488 @@
+/* Test BD_Shape::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, y, y);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, y, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, x + 4, x + 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 7);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, x + 4, x + 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, Linear_Expression(4), Linear_Expression(4));
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x == 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, 4, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.bounded_affine_image(x, x, x);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(x, x, x) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, 2*x - 2, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(x, 2*x-2, 2*x-2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(y, 2*x, 2*x, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(y, 2*x, 2*x, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(y <= 2);
+  bds.add_constraint(y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+  known_result.add_constraint(x - y <= 1);
+  known_result.add_constraint(x - y >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(x, -2*x+y+1, -2*x+y+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A - B <= 0);
+  bds.add_constraint(B - C == 2);
+  bds.add_constraint(C - A <= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(B, Linear_Expression(-1), D + E);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(A - C == 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_image(B, -1, D + E) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(C, 3*D - E, 2*C + 1, 5);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(5*C <= 7);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(C, "
+                    "3*D - E, 2*C + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable F(5);
+
+  TBD_Shape bds(6);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(A >= -6);
+  bds.add_constraint(B == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(A, -A - 3, B - C + 6*D + F);
+
+  BD_Shape<mpq_class> known_result(6);
+  known_result.add_constraint(A >= -7);
+  known_result.add_constraint(B == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(A, "
+                    "-A - 3, B - C + 6*D + F) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(B, -B - 2, 7*D - E + 5, 3);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(B >= -1);
+  known_result.add_constraint(C - A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(B, "
+                    "-B - 2, 7*D - E + 5, 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_image(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C - A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_image(B, "
+                    "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the BDS's space dimension.
+    bds.bounded_affine_image(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the BDS's space dimension.
+    bds.bounded_affine_image(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    bds.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // BD_Shape::bounded_affine_image(v, lb_expr, ub_epxr, d): it is illegal to
+    // apply the method to a variable that is not in the space of
+    // the polyhedron.
+    bds.bounded_affine_image(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/BD_Shape/boundedaffinepreimage1.cc b/tests/BD_Shape/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..e0f39f9
--- /dev/null
+++ b/tests/BD_Shape/boundedaffinepreimage1.cc
@@ -0,0 +1,381 @@
+/* Test BD_Shape::bounded_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3));
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 7, 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7));
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, 7) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7),
+                              -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, 7, -1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(7),
+                              Linear_Expression(3), -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 7, 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(B - A <= 3);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), A+2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, A+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), -A+2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, -A+2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), B+5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, B+5) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*B <= 8);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(3), B-5, -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 3, B-5, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");;
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(B - A) <= 21);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 2, 4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 4);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(A - B >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+
+  bds.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, 2, "
+                    "4*A + 3*B - 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+
+  bds.bounded_affine_preimage(A, A, A);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.bounded_affine_preimage(A, A, A) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable C(2);
+
+  BD_Shape<mpz_class> bds(3);
+  bds.add_constraint(C == 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.bounded_affine_preimage(C, A, A, 5);
+
+  BD_Shape<mpz_class> known_result(3);
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.bounded_affine_preimage(C, A, A, 5) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/bounds1.cc b/tests/BD_Shape/bounds1.cc
new file mode 100644
index 0000000..63fea67
--- /dev/null
+++ b/tests/BD_Shape/bounds1.cc
@@ -0,0 +1,273 @@
+/* Test BD_Shape::bounds_from_below() and BD_Shape::bounds_from_above().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds1;
+  TBD_Shape bds2(2, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = bds1.bounds_from_above(Linear_Expression(3))
+    && bds2.bounds_from_below(A);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A + B) && bds.bounds_from_below(A + B);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A - B) && !bds.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A + B - C)
+    && !bds.bounds_from_below(A + B - C);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+  bds.add_constraint(E - D <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A + B - C + 2*E - 2*D)
+    && !bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A + B - C + 2*E - 2*D)
+    && bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(B - C <= -1);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(A + B - C + 2*E - 2*D)
+    && bds.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.bounds_from_above(Linear_Expression(3))
+    && bds.bounds_from_below(Linear_Expression(3));
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.bounds_from_below(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.bounds_from_above(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A - B) && !bds.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = !bds.bounds_from_above(A + B) && !bds.bounds_from_below(A + B);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/cc76extrapolation1.cc b/tests/BD_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..7e0c5c4
--- /dev/null
+++ b/tests/BD_Shape/cc76extrapolation1.cc
@@ -0,0 +1,489 @@
+/* Test BD_Shape::CC76_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(x - y <= 2);
+  bds1.add_constraint(y - x <= 7);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(x <= 0);
+  bds2.add_constraint(y - x <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds1(4);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 25);
+  bds1.add_constraint(C >= 0);
+  bds1.add_constraint(C <= 29);
+  bds1.add_constraint(D >= 0);
+  bds1.add_constraint(D <= 27);
+  bds1.add_constraint(B - A <= 25);
+  bds1.add_constraint(C - A <= 29);
+  bds1.add_constraint(D - A <= 27);
+  bds1.add_constraint(B - C <= 2);
+  bds1.add_constraint(C - B <= 6);
+  bds1.add_constraint(B - D <= 2);
+  bds1.add_constraint(D - B <= 4);
+  bds1.add_constraint(C - D <= 4);
+  bds1.add_constraint(D - C <= 4);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 26);
+  bds2.add_constraint(C >= 3);
+  bds2.add_constraint(C <= 29);
+  bds2.add_constraint(D >= 2);
+  bds2.add_constraint(D <= 28);
+  bds2.add_constraint(B - A <= 26);
+  bds2.add_constraint(C - A <= 29);
+  bds2.add_constraint(D - A <= 28);
+  bds2.add_constraint(B - C <= 0);
+  bds2.add_constraint(C - B <= 6);
+  bds2.add_constraint(B - D == 2);
+  bds2.add_constraint(C - D <= 4);
+  bds2.add_constraint(D - C <= 2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.upper_bound_assign(bds2);
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 26);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(B - A <= 26);
+  known_result.add_constraint(B - C <= 2);
+  known_result.add_constraint(B - D <= 2);
+  known_result.add_constraint(C - D <= 4);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds1(4);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 39);
+  bds1.add_constraint(C >= 0);
+  bds1.add_constraint(C <= 40);
+  bds1.add_constraint(D >= 0);
+  bds1.add_constraint(D <= 40);
+  bds1.add_constraint(B - A <= 39);
+  bds1.add_constraint(C - A <= 40);
+  bds1.add_constraint(D - A <= 40);
+  bds1.add_constraint(B - C <= 0);
+  bds1.add_constraint(C - B <= 1);
+  bds1.add_constraint(B - D <= 0);
+  bds1.add_constraint(D - B <= 2);
+  bds1.add_constraint(C - D <= 0);
+  bds1.add_constraint(D - C <= 1);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 38);
+  bds2.add_constraint(C >= 0);
+  bds2.add_constraint(C <= 39);
+  bds2.add_constraint(D >= 0);
+  bds2.add_constraint(D <= 40);
+  bds2.add_constraint(B - A <= 38);
+  bds2.add_constraint(C - A <= 39);
+  bds2.add_constraint(D - A <= 40);
+  bds2.add_constraint(B - C <= 0);
+  bds2.add_constraint(C - B <= 1);
+  bds2.add_constraint(B - D <= 0);
+  bds2.add_constraint(D - B <= 2);
+  bds2.add_constraint(C - D <= 0);
+  bds2.add_constraint(D - C <= 1);
+
+  // Force the closure of `bds1'.
+  (void) (bds1 == bds2);
+
+  BD_Shape<mpq_class> known_widening(4);
+  known_widening.add_constraint(A >= 0);
+  known_widening.add_constraint(B >= 0);
+  known_widening.add_constraint(C >= 0);
+  known_widening.add_constraint(D >= 0);
+  known_widening.add_constraint(D <= 40);
+  known_widening.add_constraint(D - A <= 40);
+  known_widening.add_constraint(B - C <= 0);
+  known_widening.add_constraint(C - B <= 1);
+  known_widening.add_constraint(B - D <= 0);
+  known_widening.add_constraint(D - B <= 2);
+  known_widening.add_constraint(C - D <= 0);
+  known_widening.add_constraint(D - C <= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  // Force the closure of `bds1'.
+  (void) (bds1 == bds2);
+
+  bool ok = (BD_Shape<mpq_class>(bds1) == known_widening);
+
+  print_constraints(bds1, "*** bds1.closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 2);
+  bds1.add_constraint(B - A <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= 0);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 1);
+  bds2.add_constraint(B - A <= 1);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+TBD_Shape
+aux_test05(int i, Variable a, Variable b, Variable c) {
+  TBD_Shape bds(3);
+  if (i == 0) {
+    bds.add_constraint(0 <= a-b);
+    bds.add_constraint(     a-b <= 0);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
+  }
+  else {
+    bds.add_constraint(-i <= a-b);
+    bds.add_constraint(      a-b <= i);
+    bds.add_constraint(-1 <= b-c);
+    bds.add_constraint(      b-c <= 1);
+    bds.add_constraint(-i <= a-c);
+    bds.add_constraint(      a-c <= i);
+  }
+
+  using namespace IO_Operators;
+  nout << "*** n_" << i << " ***" << endl
+       << bds << endl;
+
+  // Force closure.
+  (void) (bds == bds);
+  return bds;
+}
+
+bool
+test05() {
+  Variable a(0);
+  Variable b(1);
+  Variable c(2);
+  unsigned i = 0;
+  TBD_Shape m_i = aux_test05(i, a, b, c);
+  TBD_Shape m_i_next;
+  while (i < 100) {
+
+    using namespace IO_Operators;
+    nout << "*** m_" << i << " ***" << endl
+         << m_i << endl;
+
+    m_i_next = aux_test05(++i, a, b, c);
+    TBD_Shape::coefficient_type_base* no_stop_points = 0;
+    m_i_next.CC76_extrapolation_assign(m_i, no_stop_points, no_stop_points);
+    m_i_next.upper_bound_assign(m_i);
+    // Force closure.
+    (void) (m_i_next == m_i_next);
+    if (m_i == m_i_next) {
+
+      nout << "*** m_" << i << " (fixpoint) ***" << endl
+           << m_i << endl;
+
+      return false;
+    }
+    m_i = m_i_next;
+  }
+  return true;
+}
+
+bool
+test06() {
+  TBD_Shape bds1(0);
+
+  TBD_Shape bds2(0, EMPTY);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bds1(2, EMPTY);
+  TBD_Shape bds2(2, EMPTY);
+  BD_Shape<mpq_class> known_result(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.CC76_extrapolation_assign(bds1);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2,
+                    "*** bds2.CC76_extrapolation_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A - B >= 2);
+  bds1.add_constraint(B - C >= -1);
+  bds1.add_constraint(C - A >= -3);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A - B >= 2);
+  bds2.add_constraint(B - C >= 1);
+  bds2.add_constraint(C - A >= 3);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= 1);
+  bds2.add_constraint(B == -1);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(C <= 4);
+  bds1.add_constraint(B >= 2);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(C == 3);
+  bds2.add_constraint(A - C >= 0);
+  bds2.add_constraint(B - A >= 1);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C - B <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.CC76_extrapolation_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::CC76_extrapolation_assign(bds): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    bds2.CC76_extrapolation_assign(bds1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  TBD_Shape bds1(5);
+  TBD_Shape bds2(10);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::CC76_widening_assign(bds2): it is illegal to apply
+    // this method to two polyhedra that are not dimensional
+    // compatible.
+    bds2.CC76_extrapolation_assign(bds1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/cc76narrowing1.cc b/tests/BD_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..9783a85
--- /dev/null
+++ b/tests/BD_Shape/cc76narrowing1.cc
@@ -0,0 +1,217 @@
+/* Test BD_Shape::CC76_narrowing_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(y - x <= 7);
+  bds1.add_constraint(x - y <= 6);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(y - x <= 2);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(x <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.CC76_narrowing_assign(bds1);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y - x <= 7);
+  known_result.add_constraint(-x <= 3);
+  known_result.add_constraint(x - y <= 6);
+  known_result.add_constraint(-y <= 8);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(4);
+  bds1.add_constraint(z <= 1);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(-y <= 3);
+  bds2.add_constraint(-x <= 2);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y - x <= 4);
+  bds2.add_constraint(z <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.CC76_narrowing_assign(bds1);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(z <= 1);
+  known_result.add_constraint(-y <= 3);
+  known_result.add_constraint(y <= 7);
+  known_result.add_constraint(-x <= 2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(y - x <= 4);
+  known_result.add_constraint(x - y <= 6);
+  known_result.add_constraint(z - y <= 3);
+  known_result.add_constraint(z - x <= 2);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(3);
+
+  bds1.add_constraint(z <= 1);
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bds2.add_constraint(-y <= 3);
+  bds2.add_constraint(x >= 4);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y - x <= 4);
+  bds2.add_constraint(z <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.CC76_narrowing_assign(bds1);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(z <= 1);
+  bds1.add_constraint(z >= 3);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(-y <= 3);
+  bds2.add_constraint(x >= 4);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y - x <= 4);
+  bds2.add_constraint(z <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.CC76_narrowing_assign(bds1);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds1;
+  TBD_Shape bds2(0, EMPTY);
+  BD_Shape<mpq_class> known_result(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.CC76_narrowing_assign(bds1);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.CC76_narrowing_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable y(1);
+
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
+
+  Constraint_System cs;
+  cs.insert(y >= 6);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::CC76_narrowing_assign(bds2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    bds2.CC76_narrowing_assign(bds1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/closure1.cc b/tests/BD_Shape/closure1.cc
new file mode 100644
index 0000000..f86472f
--- /dev/null
+++ b/tests/BD_Shape/closure1.cc
@@ -0,0 +1,600 @@
+/* Test shortest path closure.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Edge {
+  unsigned int from;
+  unsigned int to;
+  unsigned long distance;
+};
+
+Edge hawaii[] = {
+  { 0, 1, 6191 },
+  { 1, 0, 6191 },
+  { 2, 3, 4147 },
+  { 3, 2, 4147 },
+  { 4, 5, 3884 },
+  { 5, 4, 3884 },
+  { 5, 6, 1609 },
+  { 6, 5, 1609 },
+  { 7, 0, 12521 },
+  { 0, 7, 12521 },
+  { 8, 1, 2872 },
+  { 1, 8, 2872 },
+  { 9, 10, 4036 },
+  { 10, 9, 4036 },
+  { 4, 11, 2959 },
+  { 11, 4, 2959 },
+  { 12, 13, 27415 },
+  { 13, 12, 27415 },
+  { 14, 15, 6068 },
+  { 15, 14, 6068 },
+  { 15, 16, 7337 },
+  { 16, 15, 7337 },
+  { 17, 18, 2894 },
+  { 18, 17, 2894 },
+  { 18, 19, 5425 },
+  { 19, 18, 5425 },
+  { 20, 21, 2265 },
+  { 21, 20, 2265 },
+  { 19, 20, 3008 },
+  { 20, 19, 3008 },
+  { 21, 12, 6654 },
+  { 12, 21, 6654 },
+  { 22, 23, 1563 },
+  { 23, 22, 1563 },
+  { 23, 24, 3470 },
+  { 24, 23, 3470 },
+  { 25, 26, 6536 },
+  { 26, 25, 6536 },
+  { 27, 28, 10373 },
+  { 28, 27, 10373 },
+  { 28, 29, 7866 },
+  { 29, 28, 7866 },
+  { 29, 30, 8961 },
+  { 30, 29, 8961 },
+  { 31, 32, 6954 },
+  { 32, 31, 6954 },
+  { 33, 34, 24135 },
+  { 34, 33, 24135 },
+  { 34, 35, 5943 },
+  { 35, 34, 5943 },
+  { 33, 36, 2389 },
+  { 36, 33, 2389 },
+  { 35, 37, 3374 },
+  { 37, 35, 3374 },
+  { 34, 38, 4494 },
+  { 38, 34, 4494 },
+  { 37, 38, 8295 },
+  { 38, 37, 8295 },
+  { 38, 39, 12091 },
+  { 39, 38, 12091 },
+  { 39, 40, 4356 },
+  { 40, 39, 4356 },
+  { 39, 30, 3986 },
+  { 30, 39, 3986 },
+  { 29, 41, 3937 },
+  { 41, 29, 3937 },
+  { 41, 28, 7159 },
+  { 28, 41, 7159 },
+  { 42, 43, 3887 },
+  { 43, 42, 3887 },
+  { 43, 44, 3685 },
+  { 44, 43, 3685 },
+  { 43, 45, 20903 },
+  { 45, 43, 20903 },
+  { 45, 46, 2226 },
+  { 46, 45, 2226 },
+  { 47, 44, 7487 },
+  { 44, 47, 7487 },
+  { 44, 48, 22511 },
+  { 48, 44, 22511 },
+  { 46, 48, 7280 },
+  { 48, 46, 7280 },
+  { 48, 49, 3112 },
+  { 49, 48, 3112 },
+  { 49, 50, 2530 },
+  { 50, 49, 2530 },
+  { 50, 51, 17408 },
+  { 51, 50, 17408 },
+  { 45, 52, 15249 },
+  { 52, 45, 15249 },
+  { 53, 54, 36470 },
+  { 54, 53, 36470 },
+  { 54, 49, 7694 },
+  { 49, 54, 7694 },
+  { 51, 55, 11400 },
+  { 55, 51, 11400 },
+  { 52, 46, 15473 },
+  { 46, 52, 15473 },
+  { 55, 56, 37433 },
+  { 56, 55, 37433 },
+  { 53, 57, 3855 },
+  { 57, 53, 3855 },
+  { 57, 58, 1508 },
+  { 58, 57, 1508 },
+  { 59, 60, 3574 },
+  { 60, 59, 3574 },
+  { 59, 53, 7377 },
+  { 53, 59, 7377 },
+  { 58, 60, 6801 },
+  { 60, 58, 6801 },
+  { 60, 61, 9191 },
+  { 61, 60, 9191 },
+  { 61, 62, 3940 },
+  { 62, 61, 3940 },
+  { 62, 63, 1941 },
+  { 63, 62, 1941 },
+  { 63, 64, 17861 },
+  { 64, 63, 17861 },
+  { 65, 66, 12138 },
+  { 66, 65, 12138 },
+  { 66, 67, 5764 },
+  { 67, 66, 5764 },
+  { 68, 62, 2365 },
+  { 62, 68, 2365 },
+  { 69, 70, 14756 },
+  { 70, 69, 14756 },
+  { 70, 71, 3931 },
+  { 71, 70, 3931 },
+  { 71, 72, 6955 },
+  { 72, 71, 6955 },
+  { 69, 73, 4265 },
+  { 73, 69, 4265 },
+  { 73, 56, 5278 },
+  { 56, 73, 5278 },
+  { 74, 75, 1088 },
+  { 75, 74, 1088 },
+  { 76, 77, 2549 },
+  { 77, 76, 2549 },
+  { 78, 79, 2029 },
+  { 79, 78, 2029 },
+  { 80, 81, 4607 },
+  { 81, 80, 4607 },
+  { 81, 82, 995 },
+  { 82, 81, 995 },
+  { 82, 83, 5708 },
+  { 83, 82, 5708 },
+  { 83, 84, 1015 },
+  { 84, 83, 1015 },
+  { 85, 86, 2592 },
+  { 86, 85, 2592 },
+  { 86, 75, 9272 },
+  { 75, 86, 9272 },
+  { 86, 87, 1549 },
+  { 87, 86, 1549 },
+  { 87, 88, 1155 },
+  { 88, 87, 1155 },
+  { 85, 84, 8375 },
+  { 84, 85, 8375 },
+  { 84, 89, 3022 },
+  { 89, 84, 3022 },
+  { 89, 90, 6455 },
+  { 90, 89, 6455 },
+  { 80, 91, 2912 },
+  { 91, 80, 2912 },
+  { 78, 92, 2087 },
+  { 92, 78, 2087 },
+  { 91, 76, 7736 },
+  { 76, 91, 7736 },
+  { 88, 85, 2143 },
+  { 85, 88, 2143 },
+  { 93, 8, 9507 },
+  { 8, 93, 9507 },
+  { 89, 88, 9385 },
+  { 88, 89, 9385 },
+  { 64, 65, 24795 },
+  { 65, 64, 24795 },
+  { 54, 94, 32035 },
+  { 94, 54, 32035 },
+  { 94, 56, 35025 },
+  { 56, 94, 35025 },
+  { 69, 95, 25243 },
+  { 95, 69, 25243 },
+  { 67, 96, 30757 },
+  { 96, 67, 30757 },
+  { 96, 97, 859 },
+  { 97, 96, 859 },
+  { 97, 95, 3230 },
+  { 95, 97, 3230 },
+  { 1, 9, 16155 },
+  { 9, 1, 16155 },
+  { 98, 51, 11706 },
+  { 51, 98, 11706 },
+  { 75, 99, 51590 },
+  { 99, 75, 51590 },
+  { 11, 100, 23417 },
+  { 100, 11, 23417 },
+  { 100, 101, 12368 },
+  { 101, 100, 12368 },
+  { 102, 103, 4846 },
+  { 103, 102, 4846 },
+  { 103, 104, 2901 },
+  { 104, 103, 2901 },
+  { 10, 104, 7849 },
+  { 104, 10, 7849 },
+  { 104, 2, 2147 },
+  { 2, 104, 2147 },
+  { 2, 102, 1761 },
+  { 102, 2, 1761 },
+  { 102, 4, 4444 },
+  { 4, 102, 4444 },
+  { 74, 105, 8183 },
+  { 105, 74, 8183 },
+  { 106, 107, 7075 },
+  { 107, 106, 7075 },
+  { 89, 107, 1178 },
+  { 107, 89, 1178 },
+  { 108, 81, 1312 },
+  { 81, 108, 1312 },
+  { 81, 109, 1793 },
+  { 109, 81, 1793 },
+  { 82, 108, 1001 },
+  { 108, 82, 1001 },
+  { 108, 80, 7421 },
+  { 80, 108, 7421 },
+  { 110, 92, 434 },
+  { 92, 110, 434 },
+  { 92, 79, 3285 },
+  { 79, 92, 3285 },
+  { 79, 99, 2706 },
+  { 99, 79, 2706 },
+  { 111, 78, 3052 },
+  { 78, 111, 3052 },
+  { 77, 111, 2036 },
+  { 111, 77, 2036 },
+  { 24, 25, 2634 },
+  { 25, 24, 2634 },
+  { 25, 21, 1832 },
+  { 21, 25, 1832 },
+  { 33, 112, 14461 },
+  { 112, 33, 14461 },
+  { 113, 114, 7998 },
+  { 114, 113, 7998 },
+  { 41, 115, 6937 },
+  { 115, 41, 6937 },
+  { 32, 116, 47595 },
+  { 116, 32, 47595 },
+  { 99, 117, 3887 },
+  { 117, 99, 3887 },
+  { 117, 118, 736 },
+  { 118, 117, 736 },
+  { 85, 83, 9281 },
+  { 83, 85, 9281 },
+  { 118, 80, 4823 },
+  { 80, 118, 4823 },
+  { 77, 119, 22341 },
+  { 119, 77, 22341 },
+  { 56, 120, 1612 },
+  { 120, 56, 1612 },
+  { 79, 121, 3258 },
+  { 121, 79, 3258 },
+  { 52, 57, 25357 },
+  { 57, 52, 25357 },
+  { 99, 121, 1646 },
+  { 121, 99, 1646 },
+  { 121, 76, 1359 },
+  { 76, 121, 1359 },
+  { 37, 27, 3890 },
+  { 27, 37, 3890 },
+  { 27, 31, 5066 },
+  { 31, 27, 5066 },
+  { 122, 123, 2556 },
+  { 123, 122, 2556 },
+  { 90, 122, 947 },
+  { 122, 90, 947 },
+  { 122, 124, 911 },
+  { 124, 122, 911 },
+  { 124, 125, 23829 },
+  { 125, 124, 23829 },
+  { 91, 119, 7911 },
+  { 119, 91, 7911 },
+};
+
+const mpq_class&
+perturbate(unsigned long a) {
+  static mpq_class q;
+  q = a;
+  q = (q*q)/(q-1);
+  return q;
+}
+
+template <typename T>
+void
+add_edges(BD_Shape<T>& bds, const Edge* edges, unsigned n) {
+  for (unsigned i = 0; i < n; ++i) {
+    const mpq_class& q = perturbate(edges[i].distance);
+    Coefficient a;
+    a = q.get_den();
+    Coefficient b;
+    b = q.get_num();
+
+    nout << "a = " << a << "; b = " << b << endl;
+
+    bds.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to)
+                      <= b);
+  }
+}
+
+bool
+test01() {
+  BD_Shape<mpq_class> qbds1(126);
+  add_edges(qbds1, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+  TBD_Shape tbds(126);
+  add_edges(tbds, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+  BD_Shape<mpq_class> qbds2(tbds);
+  if (!qbds2.contains(qbds1))
+    return false;
+
+  return true;
+}
+
+bool
+test02() {
+  // This test shows that the Floyd-Warshall algorithm does not compute
+  // the shortest path closure when using a floating point datatype.
+  // In particular, here it is shown that FW is not idempotent.
+  typedef TBD_Shape BDS;
+  typedef BDS::coefficient_type Coeff;
+
+  Coeff f_1, f_2, f_3, f_1_2, f_1_3;
+  assign_r(f_1, 1, ROUND_UP);
+  assign_r(f_2, 2, ROUND_DOWN);
+  assign_r(f_3, 3, ROUND_DOWN);
+  div_assign_r(f_1_2, f_1, f_2, ROUND_UP);
+  div_assign_r(f_1_3, f_1, f_3, ROUND_UP);
+
+  nout << "*** Possible up-approximations ***\n";
+  nout << "1/2 = " << f_1_2 << "\n";
+  nout << "1/3 = " << f_1_3 << "\n";
+
+  mpq_class q_1_2, q_1_3;
+  assign_r(q_1_2, f_1_2, ROUND_NOT_NEEDED);
+  assign_r(q_1_3, f_1_3, ROUND_NOT_NEEDED);
+
+  nout << "\n*** Corresponding mpq_class values ***\n";
+  nout << "up(1/2) = " << q_1_2 << "\n";
+  nout << "up(1/3) = " << q_1_3 << "\n\n";
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  BDS bds1(4);
+  Constraint_System cs;
+  Coefficient numer, denom;
+
+  numer = q_1_3.get_num();
+  denom = q_1_3.get_den();
+  cs.insert(denom*A - denom*B >= numer);
+  cs.insert(denom*B - denom*C >= -numer);
+
+  numer = q_1_2.get_num();
+  denom = q_1_2.get_den();
+  cs.insert(denom*C - denom*D >= -numer);
+
+  bds1.add_constraints(cs);
+
+  print_constraints(bds1.constraints(), "*** BEFORE FIRST Floyd-Warshall ***");
+  nout << "\n";
+
+  // Force application of Floyd-Warshall.
+  bds1.is_empty();
+
+  print_constraints(bds1.constraints(), "*** AFTER FIRST Floyd-Warshall ***");
+  nout << "\n";
+
+  // Copy constraints (so that the BDS is marked as not closed)
+  // and then force again application of Floyd-Warshall.
+  BDS bds2(bds1.constraints());
+  bds2.is_empty();
+
+  print_constraints(bds2.constraints(), "*** AFTER SECOND Floyd-Warshall ***");
+
+  bool coefficients_exact = std::numeric_limits<Coeff>::is_exact;
+  int coefficients_digits = std::numeric_limits<Coeff>::digits;
+
+  nout << " coefficients_exact = " <<  coefficients_exact << endl;
+  nout << "coefficients_digits = " << coefficients_digits << endl;
+
+  bool imprecise_coefficients
+    = !coefficients_exact && (coefficients_digits == 24
+                              || coefficients_digits == 64);
+  bool bds1_contains_bds2 = bds1.contains(bds2);
+  bool bds2_contains_bds1 = bds2.contains(bds1);
+
+  nout << " bds1_contains_bds2 = " <<  bds1_contains_bds2 << endl;
+  nout << " bds2_contains_bds1 = " <<  bds2_contains_bds1 << endl;
+
+  return bds1_contains_bds2
+    && ((bds2_contains_bds1 && !imprecise_coefficients)
+        || (!bds2_contains_bds1 && imprecise_coefficients));
+}
+
+bool
+test03() {
+
+  // Detect and systematically ignore overflows (which can only be
+  // due to configurations using bounded integer coefficients).
+  try {
+
+    // This test shows that the Floyd-Warshall algorithm does not compute
+    // the shortest path closure when using a floating point datatype.
+    // In particular, here it is shown that even two applications of FW
+    // are not enough to obtain idempotency.
+    typedef TBD_Shape BDS;
+    typedef BDS::coefficient_type Coeff;
+
+    Coeff f_1, f_2, f_3, f_5, f_7;
+    Coeff f_1_2, f_1_3, f_1_5, f_1_7;
+    assign_r(f_1, 1, ROUND_UP);
+    assign_r(f_2, 2, ROUND_DOWN);
+    assign_r(f_3, 3, ROUND_DOWN);
+    assign_r(f_5, 5, ROUND_DOWN);
+    assign_r(f_7, 7, ROUND_DOWN);
+    div_assign_r(f_1_2, f_1, f_2, ROUND_UP);
+    div_assign_r(f_1_3, f_1, f_3, ROUND_UP);
+    div_assign_r(f_1_5, f_1, f_5, ROUND_UP);
+    div_assign_r(f_1_7, f_1, f_7, ROUND_UP);
+
+    nout << "*** Possible up-approximations ***\n";
+    nout << "1/2 = " << f_1_2 << "\n";
+    nout << "1/3 = " << f_1_3 << "\n";
+    nout << "1/5 = " << f_1_5 << "\n";
+    nout << "1/7 = " << f_1_7 << "\n";
+
+    mpq_class q_1_2, q_1_3, q_1_5, q_1_7;
+    assign_r(q_1_2, f_1_2, ROUND_NOT_NEEDED);
+    assign_r(q_1_3, f_1_3, ROUND_NOT_NEEDED);
+    assign_r(q_1_5, f_1_5, ROUND_NOT_NEEDED);
+    assign_r(q_1_7, f_1_7, ROUND_NOT_NEEDED);
+
+    nout << "\n*** Corresponding mpq_class values ***\n";
+    nout << "1/2 = " << q_1_2 << "\n";
+    nout << "1/3 = " << q_1_3 << "\n";
+    nout << "1/5 = " << q_1_5 << "\n";
+    nout << "1/7 = " << q_1_7 << "\n\n";
+
+    Variable A(0);
+    Variable B(1);
+    Variable C(2);
+    Variable D(3);
+    Variable E(4);
+    Variable F(5);
+    Variable G(6);
+    Variable H(7);
+    Variable I(8);
+    Variable J(9);
+
+    Constraint_System cs;
+    Coefficient numer, denom;
+
+    numer = q_1_3.get_num();
+    denom = q_1_3.get_den();
+    cs.insert(denom*B - denom*A <= -numer);
+    cs.insert(denom*C - denom*B <= numer);
+    cs.insert(denom*G - denom*F <= -numer);
+    cs.insert(denom*H - denom*G <= numer);
+
+    numer = q_1_2.get_num();
+    denom = q_1_2.get_den();
+    cs.insert(denom*D - denom*C <= numer);
+
+    numer = q_1_5.get_num();
+    denom = q_1_5.get_den();
+    cs.insert(denom*J - denom*I <= numer);
+    cs.insert(denom*E - denom*D <= numer);
+    cs.insert(denom*I - denom*H <= numer);
+
+    numer = q_1_7.get_num();
+    denom = q_1_7.get_den();
+    cs.insert(denom*F - denom*E <= -numer);
+
+    BDS bds1(10);
+    bds1.add_constraints(cs);
+    print_constraints(bds1.constraints(),
+                      "*** BEFORE FIRST Floyd-Warshall ***");
+    nout << "\n";
+
+    // Force application of Floyd-Warshall.
+    bds1.is_empty();
+
+    print_constraints(bds1.constraints(),
+                      "*** AFTER FIRST Floyd-Warshall ***");
+    nout << "\n";
+
+    // Copy constraints (so that the BDS is marked as not closed)
+    // and then force again application of Floyd-Warshall.
+    BDS bds2(bds1.constraints());
+    bds2.is_empty();
+
+    print_constraints(bds2.constraints(),
+                      "*** AFTER SECOND Floyd-Warshall ***");
+    nout << "\n";
+
+    // Copy constraints (so that the BDS is marked as not closed)
+    // and then force once again application of Floyd-Warshall.
+    BDS bds3(bds2.constraints());
+    bds3.is_empty();
+
+    print_constraints(bds2.constraints(),
+                      "*** AFTER THIRD Floyd-Warshall ***");
+    nout << "\n";
+
+
+    bool coefficients_exact = std::numeric_limits<Coeff>::is_exact;
+    int coefficients_digits = std::numeric_limits<Coeff>::digits;
+
+    nout << " coefficients_exact = " <<  coefficients_exact << endl;
+    nout << "coefficients_digits = " << coefficients_digits << endl;
+
+    bool imprecise_coefficients_12
+      = !coefficients_exact;
+    // && (coefficients_digits == 24
+    //                          || coefficients_digits == 64);
+
+    bool bds1_contains_bds2 = bds1.contains(bds2);
+    bool bds2_contains_bds1 = bds2.contains(bds1);
+
+    nout << " bds1_contains_bds2 = " <<  bds1_contains_bds2 << endl;
+    nout << " bds2_contains_bds1 = " <<  bds2_contains_bds1 << endl;
+
+    bool ok = (bds1_contains_bds2
+               && ((bds2_contains_bds1 && !imprecise_coefficients_12)
+                   || (!bds2_contains_bds1 && imprecise_coefficients_12)));
+
+    bool imprecise_coefficients_23
+      = !coefficients_exact && coefficients_digits <= 24;
+
+    bool bds2_contains_bds3 = bds2.contains(bds3);
+    bool bds3_contains_bds2 = bds3.contains(bds2);
+
+    nout << " bds2_contains_bds3 = " <<  bds2_contains_bds3 << endl;
+    nout << " bds3_contains_bds2 = " <<  bds3_contains_bds2 << endl;
+
+    ok &= (bds2_contains_bds3
+           && ((bds3_contains_bds2 && !imprecise_coefficients_23)
+               || (!bds3_contains_bds2 && imprecise_coefficients_23)));
+    return ok;
+
+  }
+  catch (const std::overflow_error& e) {
+    // Systematically ignore overflows.
+    nout << "Ignoring arithmetic overflow: " << e.what() << endl;
+    return true;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F32(test01);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test02, TBD_Shape);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/BD_Shape/concatenate1.cc b/tests/BD_Shape/concatenate1.cc
new file mode 100644
index 0000000..8ea7dad
--- /dev/null
+++ b/tests/BD_Shape/concatenate1.cc
@@ -0,0 +1,204 @@
+/* Test BD_Shape::concatenate_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  // Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  // Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TBD_Shape bds1(6);
+  bds1.add_constraint(x2 - x3 <= 0);
+  bds1.add_constraint(x3 <= 2);
+  bds1.add_constraint(x6 - x5 <= 2);
+  bds1.add_constraint(x5 <= 3);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x2 - x3 <= 2);
+  bds2.add_constraint(x3 <= 7);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.concatenate_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 - x3 <= 0);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
+
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.concatenate_assign(bds1);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.concatenate_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x <= 0);
+  cs.insert(y == 3);
+  cs.insert(3*x - 3*y <= 5);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraints(cs);
+
+  TBD_Shape bds2(0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.concatenate_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(y == 3);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(C >= 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(A <= 1);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 2);
+  bds2.add_constraint(A - B <= 0);
+  bds2.add_constraint(B - A <= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.concatenate_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(E >= 0);
+  known_result.add_constraint(E <= 2);
+  known_result.add_constraint(D - E <= 0);
+  known_result.add_constraint(E - D <= 1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
+
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.concatenate_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.concatenate_assign(bds2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/congruences1.cc b/tests/BD_Shape/congruences1.cc
new file mode 100644
index 0000000..4aaac30
--- /dev/null
+++ b/tests/BD_Shape/congruences1.cc
@@ -0,0 +1,220 @@
+/* Test BD_Shape::congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds1(2);
+  bds1.add_congruence((0*A %= 1) / 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Constraint_System cs = bds1.minimized_constraints();
+
+  print_constraints(cs, "*** cs ***");
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1(3, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_congruence((x %= 1) / 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(3);
+  bds2.add_congruences(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBD_Shape bds1(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  print_constraints(bds1, "*** bds1 ***");
+  TBD_Shape bds2(cgs.space_dimension(), EMPTY);
+
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds1(0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_congruence((x %= 1) / 0);
+  bds.add_congruence((x %= 2) / 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds.space_dimension(), EMPTY);
+
+  Congruence_System cgs = bds.congruences();
+  TBD_Shape bds1(3);
+  bds1.add_congruences(bds.congruences());
+
+  bool ok = check_result(bds, bds1) && check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bds1(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(cgs.space_dimension(), EMPTY);
+  bds2.add_congruences(cgs);
+  bool b = !bds2.is_empty();
+
+  bool ok = !b && check_result(bds2, known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.refine_with_congruence((x %= 1) / 0);
+  bds1.refine_with_congruence((y %= 3) / 2);
+  bds1.refine_with_congruence((y - z %= 0) / 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Congruence_System cgs = bds1.congruences();
+  TBD_Shape bds2(3);
+  bds2.add_congruences(cgs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/BD_Shape/constrains1.cc b/tests/BD_Shape/constrains1.cc
new file mode 100644
index 0000000..091dd44
--- /dev/null
+++ b/tests/BD_Shape/constrains1.cc
@@ -0,0 +1,229 @@
+/* Test BD_Shape::constrains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)               \
+  if (!pred) {                                  \
+    nout << "!" #pred << endl;                  \
+    ok = false;                                 \
+  }
+
+#define TEST_PREDICATE_FALSE(pred)              \
+  if (pred) {                                   \
+    nout << #pred << endl;                      \
+    ok = false;                                 \
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TBD_Shape(2);
+  bds.add_constraint(A == B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TBD_Shape(2);
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds.add_constraint(A <= B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TBD_Shape bds(0);
+  bds.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) bds.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 0);
+  bds.unconstrain(A);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= A);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= B+1);
+  bds.add_constraint(A <= B);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= B);
+  bds.add_constraint(A <= B-1);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/constraints1.cc b/tests/BD_Shape/constraints1.cc
new file mode 100644
index 0000000..5e90c46
--- /dev/null
+++ b/tests/BD_Shape/constraints1.cc
@@ -0,0 +1,197 @@
+/* Test BD_Shape::constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bds1(0, EMPTY);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1(0, UNIVERSE);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B - C >= 1);
+  bds1.add_constraint(C - A <= 9);
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.contains(bds1);
+
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B - C == 1);
+  bds1.add_constraint(C - A <= 9);
+
+  Constraint_System cs = bds1.constraints();
+  TBD_Shape bds2(cs);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bool ok = check_result(bds2, known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+
+  TBD_Shape bds1(0);
+  bds1.add_constraint(Linear_Expression(1) == 0);
+
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.refine_with_constraint(A > 0);
+  bds.refine_with_constraint(B < 0);
+  bds.refine_with_constraint(2*B - 2*C < 1);
+  bds.refine_with_constraint(A - C > 2);
+  bds.refine_with_constraint(A + 2*D >= 5);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(2*B - 2*C <= 1);
+  known_result.add_constraint(A - C >= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs(A > 0);
+  cs.insert(2*B - 2*C <= 1);
+  cs.insert(A - 5*C > 4);
+
+  TBD_Shape bds(3);
+  bds.refine_with_constraints(cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(2*B - 2*C <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/contains1.cc b/tests/BD_Shape/contains1.cc
new file mode 100644
index 0000000..99514f9
--- /dev/null
+++ b/tests/BD_Shape/contains1.cc
@@ -0,0 +1,203 @@
+/* Test BD_Shape::contains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x - y <= 1);
+
+  // The BD_Shape is empty, because it has got a negative cycle.
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(y - z <= 2);
+  bds2.add_constraint(z - x <= -5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1;
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool ok = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x - y >= 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    bds1.contains(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(D >= 0);
+  cs.insert(C >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  TBD_Shape bds1(cs);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(cs);
+  bds2.add_constraint(A - B >= 0);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool contained = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(C <= 0);
+  bds1.add_constraint(B - C <= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A == 0);
+  bds2.add_constraint(C <= 0);
+  bds2.add_constraint(B - C <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool contained = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***" << endl;
+  nout << (!contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+bool
+test07() {
+  TBD_Shape bds1(3, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(3, UNIVERSE);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool contained = bds1.contains(bds2);
+
+  nout << "*** bds1.contains(bds2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/containsintegerpoint1.cc b/tests/BD_Shape/containsintegerpoint1.cc
new file mode 100644
index 0000000..66b3063
--- /dev/null
+++ b/tests/BD_Shape/containsintegerpoint1.cc
@@ -0,0 +1,138 @@
+/* Test BD_Shape::contains_integer_point().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  BD_Shape<mpz_class> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  BD_Shape<mpq_class> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  TBD_Shape bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  // NOTE: results depends on whether or not the rational constraints
+  // on y have been approximated as integral constraints.
+  typedef TBD_Shape::coefficient_type_base T;
+  return std::numeric_limits<T>::is_integer ? contains : !contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y - 3*z <= 2);
+  cs.insert(8*z - 8*y >= 7);
+
+  BD_Shape<mpq_class> bds(3);
+  bds.add_constraints(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool contains = bds.contains_integer_point();
+
+  nout << "bds.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/difference1.cc b/tests/BD_Shape/difference1.cc
new file mode 100644
index 0000000..7bdc0cf
--- /dev/null
+++ b/tests/BD_Shape/difference1.cc
@@ -0,0 +1,279 @@
+/* Test BD_Shape::difference_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(A <= -2);
+  bds1.add_constraint(B == 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A >= 0);
+  bds2.add_constraint(A <= 2);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** ph2 ***");
+
+  bds1.difference_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1;
+  TBD_Shape bds2;
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.difference_assign(bds2);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-4) >= 0);
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 2);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y <= 5);
+  bds1.add_constraint(y >= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(x >= 1);
+  bds2.add_constraint(y <= 4);
+  bds2.add_constraint(y >= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.difference_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 5);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(y - x >= 1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 8);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y <= 7);
+  bds1.add_constraint(y >= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(x >= 1);
+  bds2.add_constraint(y <= 0);
+  bds2.add_constraint(y >= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.difference_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 8);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y <= 7);
+  bds1.add_constraint(y >= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 9);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y <= 8);
+  bds2.add_constraint(y >= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.difference_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 8);
+  bds1.add_constraint(y <= 7);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(z <= 2);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x == 8);
+  bds2.add_constraint(y <= 2);
+  bds2.add_constraint(y >= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.difference_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 8);
+  known_result.add_constraint(y <= 7);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(B <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A >= 2);
+  bds2.add_constraint(A <= 4);
+  bds2.add_constraint(B >= 0);
+  bds2.add_constraint(B <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bds1.difference_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** after bds1.difference_assign(bds2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(5);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::difference_assign(bds2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    bds1.difference_assign(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/discrete1.cc b/tests/BD_Shape/discrete1.cc
new file mode 100644
index 0000000..a9a56e5
--- /dev/null
+++ b/tests/BD_Shape/discrete1.cc
@@ -0,0 +1,215 @@
+/* Test BD_Shape::is_discrete().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(x - y == 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+
+  bds.add_constraint(A == 5);
+  bds.add_constraint(A - B == 3);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(E - D == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B - A <= -5);
+  bds.add_constraint(-B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(E == 1);
+  bds.add_constraint(A - D == 8);
+  bds.add_constraint(B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return !ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(7);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B == 2);
+  bds.add_constraint(B - A <= -6);
+
+  print_constraints(bds, "*** bds ***");
+
+   bool ok = bds.is_discrete();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/BD_Shape/disjoint1.cc b/tests/BD_Shape/disjoint1.cc
new file mode 100644
index 0000000..0474325
--- /dev/null
+++ b/tests/BD_Shape/disjoint1.cc
@@ -0,0 +1,193 @@
+/* Test BD_Shape::is_disjoint_from(const BD_Shape& y).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(B == 0);
+  bds1.add_constraint(A >= 1);
+  bds1.add_constraint(A <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == 0);
+  bds2.add_constraint(B >= 1);
+  bds2.add_constraint(B <= 2);
+
+  bool ok = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(3);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A <= 3);
+  bds2.add_constraint(B - A <= -1);
+  bds2.add_constraint(B >= -5);
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return !disjoint;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+
+  Constraint_System cs1;
+  cs1.insert(x1 >= -4);
+  cs1.insert(x2 - x1 <= 0);
+  cs1.insert(x1 - x2 <= -5);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraints(cs1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(2*x1 >= 1);
+  cs2.insert(2*x1 <= 3);
+  cs2.insert(6*x2 <= 1);
+  cs2.insert(3*x2 >= -2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraints(cs2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  return disjoint;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= y);
+
+  TBD_Shape bds2(3);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::is_disjoint_from(bds2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    bds1.is_disjoint_from(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2, EMPTY);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A - B <= 5);
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return disjoint;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A >= 0);
+  bds1.add_constraint(B >= -4);
+
+  TBD_Shape bds2(2, EMPTY);
+
+  bool disjoint = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return disjoint;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A == 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == 1);
+
+  bool ok = bds1.is_disjoint_from(bds2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/dropsomenonintegerpoints1.cc b/tests/BD_Shape/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..f383155
--- /dev/null
+++ b/tests/BD_Shape/dropsomenonintegerpoints1.cc
@@ -0,0 +1,356 @@
+/* Test BD_Shape::drop_some_non_integer_points().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+
+  bds.add_constraint(2*A >= 1);
+  bds.add_constraint(2*B >= -1);
+  bds.add_constraint(2*A - 2*B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points();
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 1);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  BD_Shape<mpq_class> bds1;
+  BD_Shape<mpq_class> bds2(0, EMPTY);
+  BD_Shape<mpq_class> bds3(2, EMPTY);
+  BD_Shape<mpq_class> bds4(2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result1(bds1);
+  BD_Shape<mpq_class> known_result2(bds2);
+  BD_Shape<mpq_class> known_result3(bds3);
+  BD_Shape<mpq_class> known_result4(bds4);
+
+  bds1.drop_some_non_integer_points();
+  bds2.drop_some_non_integer_points();
+  bds3.drop_some_non_integer_points();
+  bds4.drop_some_non_integer_points();
+
+  bool ok = (bds1 == known_result1 && bds2 == known_result2
+             && bds3 == known_result3 && bds4 == known_result4);
+
+  print_constraints(bds1, "*** after bds1.drop_some_non_integer_points() ***");
+  print_constraints(bds2, "*** after bds2.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(A >= 0);
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points();
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A == B);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points();
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(2*A == 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points();
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(2*A <= 1);
+  bds.add_constraint(2*B <= -1);
+  bds.add_constraint(4*A - 4*B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points();
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= -1);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  BD_Shape<mpq_class> bds(2);
+
+  bds.add_constraint(2*A >= 1);
+  bds.add_constraint(2*B >= -1);
+  bds.add_constraint(2*A - 2*B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points(varset_A);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(2*B >= -1);
+  known_result.add_constraint(2*A - 2*B >= 1);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds,
+                    "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  BD_Shape<mpq_class> bds1(2, EMPTY);
+  BD_Shape<mpq_class> bds2(2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result1(bds1);
+  BD_Shape<mpq_class> known_result2(bds2);
+
+  bds1.drop_some_non_integer_points(varset_A);
+  bds2.drop_some_non_integer_points(varset_A);
+
+  bool ok = (bds1 == known_result1 && bds2 == known_result2);
+
+  print_constraints(bds1,
+                    "*** after bds1.drop_some_non_integer_points(varset_A) ***");
+  print_constraints(bds2,
+                    "*** after bds2.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(2*A - 2*B == 1);
+  bds.add_constraint(A >= 0);
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points(varset_A);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds,
+                    "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A == B);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points(varset_A);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds,
+                    "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_B;
+  varset_B.insert(B);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(2*A == 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points(varset_B);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds,
+                    "*** after bds.drop_some_non_integer_points(varset_B) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(2*A <= 1);
+  bds.add_constraint(2*B <= -1);
+  bds.add_constraint(4*A - 4*B <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.drop_some_non_integer_points(varset_A);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(2*B <= -1);
+  known_result.add_constraint(4*A - 4*B <= 7);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds,
+                    "*** after bds.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/empty1.cc b/tests/BD_Shape/empty1.cc
new file mode 100644
index 0000000..5990f0b
--- /dev/null
+++ b/tests/BD_Shape/empty1.cc
@@ -0,0 +1,207 @@
+/* Different ways of creating an empty BD_Shape.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(4);
+  TBD_Shape bds2(4);
+
+  bds1.add_constraint(-x <= 4);
+  bds1.add_constraint(y - x <= 0);
+  bds1.add_constraint(x - y <= -5);
+
+  bool empty = bds1.is_empty();
+
+  nout << "*** bds1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false ") << endl;
+
+  bds2.add_constraint(-x <= 4);
+  bds2.add_constraint(y - x <= 0);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(z - x <= 1);
+
+  bool empty1 = bds2.is_empty();
+
+  nout << "*** bds2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(4);
+  TBD_Shape bds2(4);
+
+  bds1.add_constraint(-x <= 2);
+  bds1.add_constraint(y - x <= -9);
+  bds1.add_constraint(x - y <= -7);
+
+  bool empty = bds1.is_empty();
+
+  print_constraints(bds1, "*** bds1 ***");
+  nout << "*** bds1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  bds2.add_constraint(-x <= 7);
+  bds2.add_constraint(y - x <= 1);
+  bds2.add_constraint(-y <= 2);
+  bds2.add_constraint(z - x <= 1);
+
+  bool empty1 = bds2.is_empty();
+
+  print_constraints(bds2, "*** bds2 ***");
+  nout << "*** bds2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  // Variable x6(5);
+
+  TBD_Shape bds1(6);
+  TBD_Shape bds2(6);
+
+  bds1.add_constraint(x1 <= 3);
+  bds1.add_constraint(x4 <= 3);
+  bds1.add_constraint(x2 - x1 <= 0);
+  bds1.add_constraint(x3 - x1 <= -2);
+  bds1.add_constraint(x5 - x1 <= 2);
+  bds1.add_constraint(-x2 <= 0);
+  bds1.add_constraint(x3 - x2 <= 5);
+  bds1.add_constraint(x4 - x3 <= -6);
+  bds1.add_constraint(x1 - x4 <= 5);
+  bds1.add_constraint(x5 - x4 <= 2);
+  bds1.add_constraint(-x5 <= -5);
+  bds1.add_constraint(x3 - x5 <= 7);
+
+  bool empty = bds1.is_empty();
+
+  nout << "*** bds1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  bds2.add_constraint(x1 <= 3);
+  bds2.add_constraint(x4 <= 3);
+  bds2.add_constraint(x2 - x1 <= 0);
+  bds2.add_constraint(x3 - x1 <= 2);
+  bds2.add_constraint(x5 - x1 <= 2);
+  bds2.add_constraint(-x2 <= 0);
+  bds2.add_constraint(x3 - x2 <= 5);
+  bds2.add_constraint(x4 - x3 <= 6);
+  bds2.add_constraint(x1 - x4 <= 5);
+  bds2.add_constraint(x5 - x4 <= 2);
+  bds2.add_constraint(-x5 <= 5);
+  bds2.add_constraint(x3 - x5 <= 7);
+
+  bool empty1 = bds2.is_empty();
+
+  nout << "*** bds2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return !empty1 && empty;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(A == 0);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(B - C >= 1);
+
+  bool empty = bds.is_empty();
+
+  print_constraints(bds, "*** bds ***");
+  nout << "*** bds.is_empty() ***"
+       << endl
+       << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBD_Shape bds(5);
+
+  Coefficient a;
+  if (std::numeric_limits<Coefficient>::is_bounded)
+    a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+  else
+    a = 1300000000;
+
+  bds.add_constraint(x1 - x2 <= -a);
+  bds.add_constraint(x2 - x3 <= -a);
+  bds.add_constraint(x3 - x4 <= a);
+  bds.add_constraint(x4 - x5 <= a);
+  bds.add_constraint(x5 - x1 <= a);
+
+  print_constraints(bds, "*** bds ***");
+
+  bool empty = bds.is_empty();
+
+  nout << "*** bds.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/equality1.cc b/tests/BD_Shape/equality1.cc
new file mode 100644
index 0000000..cd96684
--- /dev/null
+++ b/tests/BD_Shape/equality1.cc
@@ -0,0 +1,132 @@
+/* Test BD_Shape::operator==().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(2);
+
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
+
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(-y <= -2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool known_result = false;
+  bool ok = ((bds1 == bds2) == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2(0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool known_result = false;
+  bool ok = ((bds1 == bds2) == known_result);
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bds1(0);
+  TBD_Shape bds2(0, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool known_result = false;
+  bool ok = ((bds1 == bds2) == known_result);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A - B <= 1);
+  bds1.add_constraint(B - A <= -2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(B - A <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool known_result = false;
+  bool ok = ((bds1 == bds2) == known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A - B <= 1);
+  bds1.add_constraint(B - A <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A - B <= 1);
+  bds2.add_constraint(B - A <= -2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bool known_result = false;
+  bool ok = ((bds1 == bds2) == known_result);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/expandspacedim1.cc b/tests/BD_Shape/expandspacedim1.cc
new file mode 100644
index 0000000..3e286a0
--- /dev/null
+++ b/tests/BD_Shape/expandspacedim1.cc
@@ -0,0 +1,246 @@
+/* Test BD_Shape::expand_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds(3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+
+  TBD_Shape known_result(4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** After bds.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(3, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(B, 1);
+
+  TBD_Shape known_result(4, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 0);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2, EMPTY);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+
+  TBD_Shape known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+
+  TBD_Shape known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 2);
+
+  TBD_Shape known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(C == 1);
+  bds.add_constraint(A - B >= 1);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(A, 1);
+  bds.expand_space_dimension(C, 1);
+
+  TBD_Shape known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D - B >= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.expand_space_dimension(A, 1);"
+                    " bds.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2, EMPTY);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(A - B >= 1);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.expand_space_dimension(B, 1);
+
+  TBD_Shape known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/foldspacedims1.cc b/tests/BD_Shape/foldspacedims1.cc
new file mode 100644
index 0000000..36a3aa1
--- /dev/null
+++ b/tests/BD_Shape/foldspacedims1.cc
@@ -0,0 +1,338 @@
+/* Test BD_Shape::fold_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(3);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(3, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - C <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - C <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B >= 7);
+  bds.add_constraint(B <= 12);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 3);
+  bds.add_constraint(B >= 7);
+  bds.add_constraint(B <= 12);
+  bds.add_constraint(C == 15);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  bds.fold_space_dimensions(to_fold, C);
+
+  TBD_Shape known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A, B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(C - B <= 2);
+  bds.add_constraint(D >= 0);
+  bds.add_constraint(D - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  bds.fold_space_dimensions(to_fold, A);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {C, D} into A ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B == 0);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(C - B <= 2);
+  bds.add_constraint(D >= 0);
+  bds.add_constraint(D - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  bds.fold_space_dimensions(to_fold, C);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C >= 0);
+  bds.add_constraint(C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+
+  bds.fold_space_dimensions(to_fold, A);
+
+  TBD_Shape known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.OK();
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(1, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(1, EMPTY);
+
+  bds.add_space_dimensions_and_embed(1);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  bds.OK();
+
+  bds.fold_space_dimensions(to_fold, B);
+
+  TBD_Shape known_result(1, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/frequency1.cc b/tests/BD_Shape/frequency1.cc
new file mode 100644
index 0000000..ca980b2
--- /dev/null
+++ b/tests/BD_Shape/frequency1.cc
@@ -0,0 +1,279 @@
+/* Test BD_Shape::frequency().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty bd shape.
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds1(1);
+
+  TBD_Shape bds2(1, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (!bds1.frequency(A, num1, den1, valn1, vald1)
+             && !bds2.frequency(A, num2, den2, valn2, vald2));
+  print_constraints(bds1, "*** bds1 ***");
+  nout << "num1 " << num1 << ", den1 " << den1 << endl;
+  nout << "valn1 " << valn1 << ", vald1 " << vald1 << endl;
+  print_constraints(bds2, "*** bds2 ***");
+  nout << "num2 " << num2 << ", den2 " << den2 << endl;
+  nout << "valn2 " << valn2 << ", vald2 " << vald2 << endl;
+
+  return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+  TBD_Shape bds1(0);
+
+  TBD_Shape bds2(0, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  Linear_Expression three(3);
+  bool ok = (bds1.frequency(three, num1, den1, valn1, vald1)
+             && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+             && !bds2.frequency(three, num2, den2, valn2, vald2));
+  print_constraints(bds1, "*** bds1 ***");
+  nout << "num1 " << num1 << ", den1 " << den1 << endl;
+  nout << "valn1 " << valn1 << ", vald1 " << vald1 << endl;
+  print_constraints(bds2, "*** bds2 ***");
+  nout << "num2 " << num2 << ", den2 " << den2 << endl;
+  nout << "valn2 " << valn2 << ", vald2 " << vald2 << endl;
+
+  return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (bds.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!bds.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(A - B >= 5);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!bds.frequency(Linear_Expression(B), num, den, valn, vald));
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(B == 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (bds.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!bds.frequency(Linear_Expression(A - B), num, den, valn, vald));
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(2*A - 2*B == 2);
+  bds.add_constraint(3*C == 3);
+  bds.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (bds.frequency(Linear_Expression(A - B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 3 && vald == 1);
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(4*A - 4*B == 1);
+  bds.add_constraint(3*C == 1);
+  bds.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool discrete = bds.frequency(Linear_Expression(A - B),
+                                num, den, valn, vald);
+  // If the shape is based on an integral coefficient type, then
+  // approximations will induce non discreteness of the linear expression.
+  bool ok = std::numeric_limits<TBD_Shape::coefficient_type_base>::is_integer
+    ? (!discrete && num == 0 && den == 0 && valn == 0 && vald == 0)
+    : (discrete && num == 0 && den == 1 && valn == 1 && vald == 4);
+  print_constraints(bds, "*** bds ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+// Non-relational test of an empty bd_shape in 1-dimension.
+bool
+test10() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(A >= 1);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!bds.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/frombdshape1.cc b/tests/BD_Shape/frombdshape1.cc
new file mode 100644
index 0000000..982576d
--- /dev/null
+++ b/tests/BD_Shape/frombdshape1.cc
@@ -0,0 +1,147 @@
+/* Test BD_Shape copy construct, construction from other
+   BD shapes and assignment.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  TBD_Shape bds(bds1);
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  TBD_Shape bds = bds1;
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  TBD_Shape bds(1);
+  bds = bds1;
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TBD_Shape bds1(cs);
+
+  BD_Shape<mpq_class> bds(bds1);
+
+  BD_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  BD_Shape<mpq_class> bds_q(1, UNIVERSE);
+  bds_q.refine_with_constraint(3*A <= 1);
+  bds_q.refine_with_constraint(3*A >= 2);
+
+  print_constraints(bds_q, "*** bds_q ***");
+
+  BD_Shape<mpz_class> bds_z(bds_q);
+
+  BD_Shape<mpz_class> known_result(bds_q.space_dimension(), EMPTY);
+
+  bool ok = (check_result(bds_z, known_result));
+
+  print_constraints(bds_z, "*** bds_z ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/frombox1.cc b/tests/BD_Shape/frombox1.cc
new file mode 100644
index 0000000..9482023
--- /dev/null
+++ b/tests/BD_Shape/frombox1.cc
@@ -0,0 +1,375 @@
+/* Test BD_Shape::BD_Shape(const Box<Interval>&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+  Rational_Box box(2);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*B == 2);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(3*B == 2);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(B == -10);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(3*A == -2);
+  known_bds.add_constraint(B == -10);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+  print_constraints(known_bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Rational_Box box(3);
+  box.add_constraint(5*C == 15);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(3);
+  known_bds.add_constraint(5*C == 15);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+  Rational_Box box(0);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds;
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2, EMPTY);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Rational_Box box(4);
+  box.add_constraint(D == 4);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(4);
+  known_bds.add_constraint(D == 4);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Unit square.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(A >= 0);
+  known_bds.add_constraint(A <= 1);
+  known_bds.add_constraint(B >= 0);
+  known_bds.add_constraint(B <= 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(2*B == 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(A >= 0);
+  known_bds.add_constraint(2*B == 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(2*B == 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(7*A <= 3);
+  known_bds.add_constraint(2*B == 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(2*B <= 0);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2, EMPTY);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+  Rational_Box box(0);
+  box.set_empty();
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(0, EMPTY);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Rational_Box box(6);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(4*B == -11);
+  box.add_constraint(3*D == 18);
+  box.add_constraint(7*E == 15);
+  box.add_constraint(7*F == -15);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(6);
+  known_bds.add_constraint(3*A == -2);
+  known_bds.add_constraint(4*B == -11);
+  known_bds.add_constraint(3*D == 18);
+  known_bds.add_constraint(7*E == 15);
+  known_bds.add_constraint(7*F == -15);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(B >= 1);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(2);
+  known_bds.add_constraint(7*A == 3);
+  known_bds.add_constraint(2*B >= 1);
+  known_bds.add_constraint(B >= 1);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+
+  Rational_Box box(1);
+  box.add_constraint(A >= 5);
+  box.add_constraint(A <= -5);
+
+  TBD_Shape bds(box);
+
+  TBD_Shape known_bds(1, EMPTY);
+
+  bool ok = (bds == known_bds);
+
+  print_constraints(bds, "*** bds(box) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/fromgensys1.cc b/tests/BD_Shape/fromgensys1.cc
new file mode 100644
index 0000000..313dc09
--- /dev/null
+++ b/tests/BD_Shape/fromgensys1.cc
@@ -0,0 +1,156 @@
+/* Test BD_Shape::BD_Shape(const Generator_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Generator_System gs;
+  TBD_Shape bds(gs);
+
+  BD_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(closure_point(V));
+
+  try {
+    // It is illegal to build a BD_Shape starting from a non-empty
+    // generator system having no points.
+    TBD_Shape bds(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(ray(V));
+
+  try {
+    // It is illegal to build a BD_Shape starting from a non-empty
+    // generator system having no points.
+    TBD_Shape bds(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(ray(A + B));
+  gs.insert(point(1*A + 2*B + 3*C + 4*D));
+  gs.insert(point(2*A + 3*B + 4*C + 5*D));
+  TBD_Shape bds(gs);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 5);
+  known_result.add_constraint(A == B-1);
+  known_result.add_constraint(C == D-1);
+  known_result.add_constraint(C <= A+2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 2*C);
+  ph.add_constraint(C >= 3*D);
+  ph.add_constraint(D >= 4);
+  ph.add_constraint(A-D <= 50);
+
+  TBD_Shape bds(ph.generators());
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C <= 30);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 10);
+  known_result.add_constraint(B - A <= 0);
+  known_result.add_constraint(A - D <= 50);
+  known_result.add_constraint(B - C >= 12);
+  known_result.add_constraint(C - D <= 23);
+  known_result.add_constraint(C - D >= 8);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/BD_Shape/fromgrid1.cc b/tests/BD_Shape/fromgrid1.cc
new file mode 100644
index 0000000..3bbb65c
--- /dev/null
+++ b/tests/BD_Shape/fromgrid1.cc
@@ -0,0 +1,223 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x - y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x - y %= 0) / 0);
+  gr.add_congruence((y - z %= 0) / 0);
+  gr.add_congruence((z %= 0) / 1);
+
+  TBD_Shape bds(gr);
+
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+  known_bds.add_constraint(x - y == 0);
+  known_bds.add_constraint(y - z == 0);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+  Grid gr(2);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 3);
+  gr.add_congruence((y - z %= 2) / 5);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+  Grid gr(0);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds;
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(2, EMPTY);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x - y %= 1) / 0);
+  gr.add_congruence((y %= 0) / 0);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+  known_bds.add_constraint(x == 1);
+  known_bds.add_constraint(y == 0);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(0, EMPTY);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+  Grid gr(2);
+  Constraint_System cs = gr.constraints();
+
+  TBD_Shape bds(cs);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension());
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+// An empty grid, but not known to be so (yet).
+bool
+test09() {
+  Variable A(0);
+  Grid gr(1);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+
+  TBD_Shape bds(gr);
+
+  BD_Shape<mpq_class> known_bds(gr.space_dimension(), EMPTY);
+
+  bool ok = (check_result(bds, known_bds));
+
+  print_constraints(bds, "*** bds ***");
+  print_constraints(known_bds, "*** known_bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/fromoctagonalshape1.cc b/tests/BD_Shape/fromoctagonalshape1.cc
new file mode 100644
index 0000000..51ed504
--- /dev/null
+++ b/tests/BD_Shape/fromoctagonalshape1.cc
@@ -0,0 +1,81 @@
+/* Test BD_Shape::BD_Shape(const Octagonal_Shape&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os(cs);
+  os.add_constraint(A + B <= 5);
+  os.add_constraint(A + B >= -10);
+
+  TBD_Shape bds(os);
+
+  BD_Shape<mpq_class> known_result(cs);
+  known_result.add_constraint(2*A <= 23);
+  known_result.add_constraint(B >= -14);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= 10);
+  TOctagonal_Shape os(cs);
+
+  TBD_Shape bds(os);
+
+  BD_Shape<mpq_class> known_result(os.space_dimension(), EMPTY);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/frompolyhedron1.cc b/tests/BD_Shape/frompolyhedron1.cc
new file mode 100644
index 0000000..95c2cdd
--- /dev/null
+++ b/tests/BD_Shape/frompolyhedron1.cc
@@ -0,0 +1,65 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B <= 5);
+  cs.insert(A + 2*B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(3*A - 5*B <= 18);
+  C_Polyhedron ph(cs);
+
+  TBD_Shape bds1(ph, SIMPLEX_COMPLEXITY);
+  TBD_Shape bds2(ph, ANY_COMPLEXITY);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(11*A <= 61);
+  known_result.add_constraint(2*B <= 5);
+  known_result.add_constraint(5*B >= -18);
+  known_result.add_constraint(11*A - 11*B <= 64);
+
+  bool ok = (bds1 == bds2
+             && check_result(bds1, known_result,
+                             "7.50e-7", "4.89e-7", "4.34e-7"));
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/BD_Shape/fromspacedim1.cc b/tests/BD_Shape/fromspacedim1.cc
new file mode 100644
index 0000000..97aa7a4
--- /dev/null
+++ b/tests/BD_Shape/fromspacedim1.cc
@@ -0,0 +1,123 @@
+/* Test BD_Shape::BD_Shape(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bds(0, EMPTY);
+
+  bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  bool ok = (bds.OK() && bds.is_universe() && bds.space_dimension() == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBD_Shape bds(4, EMPTY);
+
+  bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBD_Shape bds(4, UNIVERSE);
+
+  bool ok = (bds.OK() && bds.is_universe() && bds.space_dimension() == 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= -1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(C >= 1);
+
+  bool ok = (bds.OK() && bds.is_empty() && bds.space_dimension() == 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(C >= 1);
+
+  bool ok = (bds.OK() && bds.space_dimension() == 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage1.cc b/tests/BD_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..9c533c3
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,591 @@
+/* Test BD_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A <= B);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B - A >= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image"
+                        "(B, GREATER_OR_EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(- y <= 1);
+  known_result.add_constraint(x - y >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(x, "
+                        "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(x - y <= 3);
+  bds.add_constraint(y <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(y, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y >= x - 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(y, "
+                        "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(A);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A <= B);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "GREATER_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A - B <= 0);
+  bds.add_constraint(B - C == 2);
+  bds.add_constraint(C - A <= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(A - C == 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(-B, "
+                        "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B <= 5);
+  known_result.add_constraint(C - A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(C, "
+                        "LESS_OR_EQUAL, A + 1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(A, LESS_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 4);
+  bds.add_constraint(y <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(3*x + 2, LESS_OR_EQUAL, 2*x - 3);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(3*x + 2, "
+                    "LESS_OR_EQUAL, 2*x - 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x - y <= 7);
+  bds.add_constraint(y >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+  known_result.add_constraint(3*x == 10);
+
+  bool ok = check_result(bds, known_result, "3.98e-7", "2.39e-7", "1.59e-7");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(2*B + 3*A,
+                               LESS_OR_EQUAL, Linear_Expression(1));
+
+  BD_Shape<mpq_class> known_result(2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(3*A + 2*B, "
+                         "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+  known_result.affine_image(A, 4*B + 5, 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(A + 2*B - 5, GREATER_OR_EQUAL, 3*B);
+
+  BD_Shape<mpq_class> known_result(2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(A + 2*B - 5, "
+                        "GREATER_OR_EQUAL, 3*B) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(2*B + C + 1, LESS_OR_EQUAL, A - 3*B + 2*C);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(2*B + C + 1, "
+                    "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(2*B + C + 1, GREATER_OR_EQUAL, A - 3*B + 2*C);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(2*B + C + 1, "
+                        "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(-2*A - B - 1,
+                              GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(-2*A - B - 1, "
+                        "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(-2*C + 3, LESS_OR_EQUAL, -3*B + 4);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(-2*C + 3, "
+                        "LESS_OR_EQUAL, -3*B + 4) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(Linear_Expression(3),
+                               GREATER_OR_EQUAL,
+                               Linear_Expression(4));
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(3, "
+                    "GREATER_OR_EQUAL, 4) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffineimage2.cc b/tests/BD_Shape/generalizedaffineimage2.cc
new file mode 100644
index 0000000..35bad23
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,518 @@
+/* Test BD_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 4);
+  bds.add_constraint(x >= -6);
+  bds.add_constraint(y == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(y, LESS_OR_EQUAL, -y + 1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(x >= -6);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(y, "
+                        "LESS_OR_EQUAL, -y + 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 4);
+  bds.add_constraint(x >= -6);
+  bds.add_constraint(y == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(x, GREATER_OR_EQUAL, -x - 3);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= -7);
+  known_result.add_constraint(y == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(x, "
+                        "GREATER_OR_EQUAL, -x - 3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(B, LESS_OR_EQUAL, 3*B + 1, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "LESS_OR_EQUAL, 3*B + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(A - B == 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(A, GREATER_OR_EQUAL, 2*A + 3, 2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(2*B - 2*A <= -3);
+
+  bool ok = check_result(bds, known_result, "7.63e-17", "3.82e-17", "1.91e-17");
+
+  print_constraints(bds, "*** bds.generalized_affine_image(A, "
+                        "GREATER_OR_EQUAL, 2*A + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(C, LESS_OR_EQUAL, 2*C + 1, 5);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(5*C <= 7);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(bds, "*** bds.generalized_affine_image(C, "
+                        "LESS_OR_EQUAL, 2*C + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+  known_result.affine_image(C, 5*C - 3, 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(C, "
+                        "EQUAL, 5*C - 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(B, GREATER_OR_EQUAL, -B - 2, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -1);
+  known_result.add_constraint(C - A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "GREATER_OR_EQUAL, -B - 2, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(B, LESS_OR_EQUAL, 4*A -2*C + 3, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C - A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "LESS_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A - B == 0);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(C - A <=2);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+
+  known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(B, "
+                        "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.generalized_affine_image(A, EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B - 3);
+  Linear_Expression e2(B + 1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 4);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_image(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B <= 9);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_image(B-3, EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    bds.generalized_affine_image(x, LESS_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    bds.generalized_affine_image(x, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    bds.generalized_affine_image(x, LESS_OR_EQUAL, x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the BDS's space dimension.
+    bds.generalized_affine_image(y, GREATER_OR_EQUAL, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the BDS.
+
+    bds.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the BDS.
+    bds.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage1.cc b/tests/BD_Shape/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..336e7d9
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,477 @@
+/* Test BD_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(4*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(-B >= 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(4*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(B >= 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(7*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(7*A == 1);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = check_result(bds, known_result, "2.13e-8", "1.25e-8", "8.52e-9");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(5*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*A == 1);
+  known_result.add_constraint(-B >= 2);
+
+  bool ok = check_result(bds, known_result, "2.69e-8", "1.72e-8", "1.20e-8");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 3);
+
+  bool ok = check_result(bds, known_result, "2.89e-7", "1.85e-7", "1.40e-7");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(B >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 5);
+
+  bool ok = check_result(bds, known_result, "5.27e-7", "3.53e-7", "2.59e-7");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 14);
+  known_result.add_constraint(3*B - 3*A <= 13);
+  known_result.add_constraint(3*B - 3*C <= 7);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(bds, known_result, "5.48e-6", "2.97e-6", "1.77e-6");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // If the Coefficient type is not wide enough, do nothing.
+  if (std::numeric_limits<Coefficient>::is_bounded
+      && (std::numeric_limits<Coefficient>::min() > -203
+          || std::numeric_limits<Coefficient>::max() < 629))
+    return true;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= -203);
+  known_result.add_constraint(60*A - 60*B >= 629);
+  known_result.add_constraint(20*C - 20*B >= 231);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bds, known_result, "4.48e-6", "2.36e-6", "1.36e-6");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(bds, known_result, "3.68e-7", "2.41e-7", "1.79e-7");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(12*B >= -35);
+  known_result.add_constraint(4*A - 4*B <= 13);
+  known_result.add_constraint(4*C - 4*B <= 21);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bds, known_result, "1.0e-5", "1.0e-5", "1.0e-5");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B <= 7);
+  bds.add_constraint(3*C <= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 35);
+  known_result.add_constraint(3*B - 3*A <= 34);
+  known_result.add_constraint(3*B - 3*C <= 28);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(bds, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B <= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= 27);
+  known_result.add_constraint(60*B - 60*A <= 61);
+  known_result.add_constraint(20*C - 20*B >= 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bds, known_result, "1.0e-5", "1.0e-5", "1.0e-5");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(3*A == 1);
+  bds.add_constraint(2*B >= 7);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bds, known_result, "4.26e-7", "2.44e-7", "1.79e-7");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage2.cc b/tests/BD_Shape/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..63f19a3
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,610 @@
+/* Test BD_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B >= 5);
+  bds.add_constraint(3*C <= 7);
+  bds.add_constraint(5*C >= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(bds, known_result, "3.66e-7", "2.28e-7", "1.59e-7");
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(2*A == 1);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(3*C <= 8);
+  bds.add_constraint(2*C >= 7);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds,  known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B, "
+                    "EQUAL, 3*A+2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  BD_Shape<mpq_class> bds(2);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(A, LESS_OR_EQUAL, B, 5);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B, 5) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 3);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(B + 3);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(B <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(B + C + 2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "GREATER_OR_EQUAL, B + C + 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(C + 2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B - A <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "GREATER_OR_EQUAL, C + 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(0);
+  Linear_Expression e2(1);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(0, "
+                    "GREATER_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(B + C);
+  Linear_Expression e2(3);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(A - B <= 2);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B + C, "
+                    "GREATER_OR_EQUAL, 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(B + C);
+  Linear_Expression e2(B + C);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(B - C <= 3);
+  bds.add_constraint(C <= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B + C, "
+                    "GREATER_OR_EQUAL, B + C) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(A);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A >= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B - A, "
+                    "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(2*A);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A >= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(B - A, "
+                    "EQUAL, 2*A) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(B - C);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(C >= -2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= -2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "LESS_OR_EQUAL, B - C) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + B);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 5);
+  bds.add_constraint(A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 5);
+  known_result.add_constraint(A <= 2);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, A + B) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 2*B + C);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(A <= 2);
+  bds.add_constraint(C <= 2);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A - B <= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(C, "
+                    "EQUAL, A + 2*B + C) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A - B);
+  Linear_Expression e2(10);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(A - B >= 11);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(A - B, "
+                    "LESS_OR_EQUAL, 10) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression e1(2*A - 2*C);
+  Linear_Expression e2(6);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(D - A <= 1);
+  bds.add_constraint(C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(D - B <= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(2*A - 2*C, "
+                    "LESS_OR_EQUAL, 6) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression e1(4*A - 2*B + 3*C);
+  Linear_Expression e2(1 + C);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(D - A <= 1);
+  bds.add_constraint(C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(4*A - 2*B + 3*C, "
+                    "EQUAL, 1 + C) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/generalizedaffinepreimage3.cc b/tests/BD_Shape/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..90b3388
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage3.cc
@@ -0,0 +1,174 @@
+/* Test BD_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression e1(3*B + C);
+  Linear_Expression e2(2*A);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 13);
+  bds.add_constraint(C <= 5);
+  bds.add_constraint(D <= 2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 9);
+  bds.add_constraint(C >= 3);
+  bds.add_constraint(D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.generalized_affine_preimage(e1, EQUAL, e2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(D <= 2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(D >= 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.generalized_affine_preimage(3*B + C, "
+                    "EQUAL, 2*A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the BDS.
+
+    bds.generalized_affine_preimage(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the BDS.
+    bds.generalized_affine_preimage(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a strict relation symbol.
+    bds.generalized_affine_preimage(A + B, GREATER_THAN, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a strict relation symbol.
+    bds.generalized_affine_preimage(B + C, LESS_THAN, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
+
diff --git a/tests/BD_Shape/geomcovers1.cc b/tests/BD_Shape/geomcovers1.cc
new file mode 100644
index 0000000..0a734f9
--- /dev/null
+++ b/tests/BD_Shape/geomcovers1.cc
@@ -0,0 +1,72 @@
+/* Test Pointset_Powerset<BD_Shape>::geometrically_covers().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  Constraint_System cs1, cs2, cs3, cs4;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 4);
+  cs2.insert(x >= 4);
+  cs2.insert(x <= 6);
+  cs3.insert(x >= 1);
+  cs3.insert(x <= 5);
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+  TBD_Shape bds3(cs3);
+
+  Pointset_Powerset<TBD_Shape> ps12(1, EMPTY);
+  ps12.add_disjunct(bds1);
+  ps12.add_disjunct(bds2);
+
+  Pointset_Powerset<TBD_Shape> ps3(1, EMPTY);
+  ps3.add_disjunct(bds3);
+
+  using namespace IO_Operators;
+  nout << "ps12 = " << ps12 << endl
+       << " ps3 = " << ps3 << endl;
+
+  if (ps12.geometrically_covers(ps3)) {
+
+    nout << "ps12 covers ps3." << endl;
+
+    return true;
+  }
+  else {
+
+    nout << "ps12 does not cover ps3." << endl;
+
+    return false;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/h79widening1.cc b/tests/BD_Shape/h79widening1.cc
new file mode 100644
index 0000000..da59149
--- /dev/null
+++ b/tests/BD_Shape/h79widening1.cc
@@ -0,0 +1,63 @@
+/* Test BD_Shape::H79_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 1);
+  bds1.add_constraint(x - y <= 2);
+  bds1.add_constraint(y - x <= 7);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y <= 2);
+  bds2.add_constraint(-x <= 3);
+  bds2.add_constraint(x <= 0);
+  bds2.add_constraint(y - x <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.H79_widening_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/integerupperboundifexact1.cc b/tests/BD_Shape/integerupperboundifexact1.cc
new file mode 100644
index 0000000..b222eab
--- /dev/null
+++ b/tests/BD_Shape/integerupperboundifexact1.cc
@@ -0,0 +1,388 @@
+/* Test BD_Shape::integer_upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  BD_Shape<mpz_class> bds_empty(0, EMPTY);
+  BD_Shape<mpz_class> bds_universe(0, UNIVERSE);
+
+  // Testing all combinations for 0-dim polyhedra.
+  bool ok = true;
+  BD_Shape<mpz_class> bds;
+
+  // empty, empty
+  bds = bds_empty;
+  ok &= bds.integer_upper_bound_assign_if_exact(bds_empty);
+  ok &= (bds == bds_empty);
+  print_constraints(bds, "*** empty union empty ***");
+
+  // empty, universe
+  bds = bds_empty;
+  ok &= bds.integer_upper_bound_assign_if_exact(bds_universe);
+  ok &= (bds == bds_universe);
+  print_constraints(bds, "*** empty union universe ***");
+
+  // universe, empty
+  bds = bds_universe;
+  ok &= bds.integer_upper_bound_assign_if_exact(bds_empty);
+  ok &= (bds == bds_universe);
+  print_constraints(bds, "*** universe union empty ***");
+
+  // universe, universe
+  bds = bds_universe;
+  ok &= bds.integer_upper_bound_assign_if_exact(bds_universe);
+  ok &= (bds == bds_universe);
+  print_constraints(bds, "*** universe union universe ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= -2);
+  bds1.add_constraint(x <= -1);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 1);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y >= 0);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(bds1);
+
+  bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= -2);
+  bds1.add_constraint(x <= 0);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y >= 0);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x == 0);
+  bds1.add_constraint(y == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y >= -2);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(bds2);
+
+  bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y >= 2);
+  bds2.add_constraint(y <= 4);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(bds1);
+
+  bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x == y);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x == 0);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(bds1);
+
+  bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= y);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(bds1);
+
+  bool ok = !bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= y);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x <= y);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(2, UNIVERSE);
+
+  bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  BD_Shape<mpz_class> bds(3, UNIVERSE);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(y >= 0);
+  bds.add_constraint(y <= 4);
+  bds.add_constraint(z >= 0);
+  bds.add_constraint(z <= 4);
+  bds.add_constraint(x - y <= 2);
+  bds.add_constraint(z - y <= 2);
+
+  BD_Shape<mpz_class> bds1(bds);
+  bds1.add_constraint(z <= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  BD_Shape<mpz_class> bds2(bds);
+  bds2.add_constraint(x - y <= 1);
+
+  bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+
+  ok &= (bds1 == bds);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // const dimension_type dim = 500;
+  const dimension_type dim = 50;
+  Constraint_System cs;
+  for (dimension_type i = 1; i < dim; ++i) {
+    Variable x(i);
+    cs.insert(x >= 0);
+    cs.insert(x <= 4);
+  }
+
+  Variable x(0);
+
+  BD_Shape<mpz_class> hypercube1(cs);
+  hypercube1.add_constraint(x >= 0);
+  hypercube1.add_constraint(x <= 4);
+
+  BD_Shape<mpz_class> hypercube2(cs);
+  hypercube2.add_constraint(x >= 2);
+  hypercube2.add_constraint(x <= 6);
+
+  BD_Shape<mpz_class> known_result(cs);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = hypercube1.integer_upper_bound_assign_if_exact(hypercube2);
+
+  ok &= (hypercube1 == known_result);
+
+  print_constraints(hypercube1, "*** hyp1 ***");
+  print_constraints(hypercube2, "*** hyp2 ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  BD_Shape<mpz_class> bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+  bds1.add_constraint(x - y <= 2);
+
+  BD_Shape<mpz_class> bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 3);
+  bds2.add_constraint(x <= 6);
+  bds2.add_constraint(y >= 0);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpz_class> known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = bds1.integer_upper_bound_assign_if_exact(bds2);
+
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.integer_upper_bound_assign_if_exact(bds2) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/intersection1.cc b/tests/BD_Shape/intersection1.cc
new file mode 100644
index 0000000..4a02ae5
--- /dev/null
+++ b/tests/BD_Shape/intersection1.cc
@@ -0,0 +1,365 @@
+/* Test BD_Shape::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x - y <= 4);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(-y <= -2);
+  bds2.add_constraint(x - y <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(x - y <= 4);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(4);
+  bds1.add_constraint(x - y <= 4);
+  bds1.add_constraint(x <= 3);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(x - y <= 5);
+  bds2.add_constraint(-y <= -2);
+  bds2.add_constraint(z - x <= 0);
+  bds2.add_constraint(y - z <= -1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x - y <= 4);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(z - x <= 0);
+  known_result.add_constraint(y - z <= -1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(-x <= -1);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(-y <= -1);
+  bds1.add_constraint(x - y <= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(-y <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-x <= -1);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(-y <= -1);
+  known_result.add_constraint(y - x <= -1);
+  known_result.add_constraint(x - y <= 1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(x >= 5);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(x - y <= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(x >= 5);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(x - y <= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds2.intersection_assign(bds1);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds2, known_result);
+
+  print_constraints(bds2, "*** bds2.intersection_assign(bds1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds1;
+  TBD_Shape bds2;
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds1(3);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds2);
+
+  bds1.intersection_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(y >= -5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds2);
+
+  bds1.intersection_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= y);
+
+  TBD_Shape bds2(3);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::intersection_assign(bds2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    bds1.intersection_assign(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  TBD_Shape bds1(7);
+  TBD_Shape bds2(15);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::intersection_assign(bds2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    bds1.intersection_assign(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  TBD_Shape bds1(3, EMPTY);
+  TBD_Shape bds2(3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  TBD_Shape bds1(3);
+  TBD_Shape bds2(3, EMPTY);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.intersection_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.intersection_assign(bds2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/limitedbhmz05extrapolation1.cc b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..9c33473
--- /dev/null
+++ b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,527 @@
+/* Test BD_Shape::limited_BHMZ05_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  Constraint_System cs2;
+  cs2.insert(x <= 0);
+  cs2.insert(y >= 5);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 3);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 3);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 2);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 3);
+  cs2.insert(x <= 2);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x + y <= 0);
+  cs.insert(x - y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+  BD_Shape<mpq_class> known_result(bds1);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds1;
+  TBD_Shape bds2;
+  Constraint_System cs;
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= 0);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+  cs.insert(x - y + z <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(z <= 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x == 0);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= -1);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x == 0);
+  cs.insert(y >= 0);
+  cs.insert(y <= 5);
+  cs.insert(x - y + z <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x == 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= 0);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+  cs.insert(2*x - 3*y <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(z <= 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  cs1.insert(z <= 0);
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+  cs2.insert(z <= 0);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+  cs.insert(x - y >= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_BHMZ05_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y - x <= 0);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(z <= 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_BHMZ05_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable y(1);
+
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bds2, cs): it is
+    // illegal to apply the method to two polyhedra that are not
+    // dimension-compatible.
+    bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::limited_BHMZ05_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
+    // has a strict-inequality.
+    bds2.limited_BHMZ05_extrapolation_assign(bds1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/BD_Shape/limitedcc76extrapolation1.cc b/tests/BD_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..ceb222c
--- /dev/null
+++ b/tests/BD_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,539 @@
+/* Test BD_Shape::limited_CC76_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bds1(0);
+  TBD_Shape bds2(0);
+  Constraint_System cs;
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A == -2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == -2);
+  bds2.add_constraint(B == 3);
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A == -2);
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(A - B + C <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A + B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(A - B <= 6);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(A >= 5);
+  bds1.add_constraint(B >= 1);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(A >= 3);
+  bds2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B >= 1);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= -2);
+  bds2.add_constraint(A >= 3);
+  bds2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBD_Shape bds1(4);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(B <= 6);
+  bds1.add_constraint(C - D == 5);
+
+  TBD_Shape bds2(4);
+  bds2.add_constraint(A <= 4);
+  bds2.add_constraint(C - D == 5);
+  bds2.add_constraint(B <= 5);
+
+  Constraint_System cs;
+  cs.insert(A == 4);
+  cs.insert(C - D == 5);
+  cs.insert(A - B <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(C - D == 5);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(cs2);
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 3);
+  known_result.add_constraint(y - x >= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3, EMPTY);
+  TBD_Shape bds2(3, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(x <= 1);
+  cs.insert(y >= 4);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+  cs1.insert(x - y >= 2);
+
+  TBD_Shape bds1(cs1);
+  TBD_Shape bds2(2, EMPTY);
+
+  Constraint_System cs2;
+  cs2.insert(x <= 0);
+  cs2.insert(y >= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+  print_constraints(cs2, "*** cs2 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.limited_CC76_extrapolation_assign(bds2, cs2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.limited_CC76_extrapolation_assign(bds2, cs2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable y(1);
+
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::limited_CC76_extrapolation_assign(bds2, cs): it is
+    // illegal to apply the method to two polyhedra that are not
+    // dimension-compatible.
+    bds2.limited_CC76_extrapolation_assign(bds1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::limited_CC76_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    bds2.limited_CC76_extrapolation_assign(bds1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x - y >= 0);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x - y >= 0);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::limited_CC76_extrapolation_assign(bds, cs): it is
+    // illegal to apply the method to a system of constraints that
+    // in which there is a strict inequality.
+    bds2.limited_CC76_extrapolation_assign(bds1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/BD_Shape/limitedh79extrapolation1.cc b/tests/BD_Shape/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..95836c2
--- /dev/null
+++ b/tests/BD_Shape/limitedh79extrapolation1.cc
@@ -0,0 +1,71 @@
+/* Test BD_Shape::limited_H79_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  TBD_Shape bds1(cs1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+
+  TBD_Shape bds2(cs2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(cs, "*** cs ***");
+
+  bds1.limited_H79_extrapolation_assign(bds2, cs);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 3);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.limited_H79_extrapolation_assign(bds2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/mapspacedims1.cc b/tests/BD_Shape/mapspacedims1.cc
new file mode 100644
index 0000000..84b1223
--- /dev/null
+++ b/tests/BD_Shape/mapspacedims1.cc
@@ -0,0 +1,293 @@
+/* Test BD_Shape::map_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  TBD_Shape bds(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result;
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  TBD_Shape bds(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBD_Shape bds(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+
+  TBD_Shape bds(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  cs = bds.minimized_constraints();
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y - x <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 2);
+
+  TBD_Shape bds(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(x <= 4);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 1);
+
+  TBD_Shape bds(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y - x <= 7);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x <= 1);
+  bds.add_constraint(y <= -1);
+  bds.add_constraint(y - x <= 3);
+
+  print_constraints(bds, "*** bds ***");
+  print_function(function, "*** function ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= -1);
+  known_result.add_constraint(y <= 1);
+  known_result.add_constraint(x - y <= 3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D == 0);
+  cs.insert(B - A == 0);
+  TBD_Shape bds(cs);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(1, 1);
+  function.insert(3, 0);
+
+  print_function(function, "*** function ***");
+  print_constraints(bds, "*** bds ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B - C == 0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBD_Shape bds(0);
+
+  print_constraints(bds, "*** bds ***");
+  print_function(function, "*** function ***");
+
+  bds.map_space_dimensions(function);
+
+  BD_Shape<mpq_class> known_result(0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/max_min1.cc b/tests/BD_Shape/max_min1.cc
new file mode 100644
index 0000000..283592b
--- /dev/null
+++ b/tests/BD_Shape/max_min1.cc
@@ -0,0 +1,781 @@
+/* Test BD_Shape::maximize(const Linear_Expression&, ...)
+   and BD_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !bds.maximize(x1-2*x2, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(x1-2*x2, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !bds.maximize(-10*x1-6*x2+4, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(-10*x1-6*x2+4, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  TBD_Shape bds(0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B);
+  bool ok = !bds.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 2 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A - B);
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C);
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(B - C <= 0);
+  bds.add_constraint(E - D <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = !bds.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(B - C <= -1);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = !bds.maximize(LE, num, den, included, g)
+    && ! bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B - C >= 0);
+  bds.add_constraint(E - D >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(Linear_Expression(3));
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(z);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::minimize(LE, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.minimize(LE, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(z);
+
+  try {
+    // This is an incorrect use of the method
+    // BD_Shape::maximize(LE, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BDS.
+    bds.maximize(LE, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A-2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A-2, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A+2, num, den, included)
+    && num == 7 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A+2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A+2, num, den, included)
+    && num == 2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A+2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A-2, num, den, included)
+    && num == -2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A-2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A - B - 2, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A - B - 2, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(A <= 5);
+  bds.add_constraint(B <= 3);
+  bds.add_constraint(B >= -5);
+  bds.add_constraint(A - B <= 6);
+  bds.add_constraint(B - A <= 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(A - B + 2, num, den, included)
+    && num == 8 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(A - B + 2, num, den, included)
+    && num == 0 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A + B + 2, num, den, included)
+    && num == 57 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A + B + 2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 100);
+  bds.add_constraint(B <= 55);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-A + B - 2, num, den, included)
+    && num == 53 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-A + B - 2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);;
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/max_min2.cc b/tests/BD_Shape/max_min2.cc
new file mode 100644
index 0000000..11001ca
--- /dev/null
+++ b/tests/BD_Shape/max_min2.cc
@@ -0,0 +1,440 @@
+/* Test BD_Shape::maximize(const Linear_Expression&, ...)
+   and BD_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(-5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(-5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= -1);
+  bds.add_constraint(A <= 1);
+  bds.add_constraint(B <= 1);
+  bds.add_constraint(B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = bds.maximize(5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(Linear_Expression(3));
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+  bool ok = !bds.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+
+  bool ok = bds.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !bds.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  BD_Shape<mpq_class> bds(1);
+  bds.add_constraint(5*A <= 2);
+  bds.add_constraint(5*A >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Linear_Expression LE(3*A);
+
+  bool ok = bds.maximize(LE, num, den, included)
+    && num == 6 && den == 5 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included)
+    && num == 3 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  BD_Shape<mpq_class> bds(1);
+  bds.add_constraint(5*A <= 2);
+  bds.add_constraint(3*A >= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Linear_Expression LE(-7*A);
+
+  bool ok = bds.maximize(LE, num, den, included)
+    && num == -7 && den == 3 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = bds.minimize(LE, num, den, included)
+    && num == -14 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(2*A >= 1);
+  bds.add_constraint(B >= 1);
+  bds.add_constraint(2*A <= 3);
+  bds.add_constraint(B <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + 4*B - 1);
+
+  Checked_Number<mpq_class, Extended_Number_Policy> divisor;
+  assign_r(divisor, 2, ROUND_NOT_NEEDED);
+  Checked_Number<mpq_class, Extended_Number_Policy> known_max_value;
+  assign_r(known_max_value, 33, ROUND_NOT_NEEDED);
+  div_assign_r(known_max_value, known_max_value, divisor, ROUND_NOT_NEEDED);
+  Generator known_max_location = point(3*A + 8*B, 2);
+
+  bool ok_max = bds.maximize(LE, num, den, included, g);
+  Checked_Number<mpq_class, Extended_Number_Policy> max_value;
+  assign_r(max_value, num, ROUND_NOT_NEEDED);
+  assign_r(divisor, den, ROUND_NOT_NEEDED);
+  div_assign_r(max_value, max_value, divisor, ROUND_NOT_NEEDED);
+  ok_max &= included && g.is_point()
+    && check_result(max_value, known_max_value, "0.5")
+    && check_result(g, known_max_location, "0.5", "0.5", "0.5");
+
+  nout << (included ? "maximum" : "supremum") << " = " << max_value;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  Checked_Number<mpq_class, Extended_Number_Policy> known_min_value;
+  assign_r(known_min_value, 7, ROUND_NOT_NEEDED);
+  assign_r(divisor, 2, ROUND_NOT_NEEDED);
+  div_assign_r(known_min_value, known_min_value, divisor, ROUND_NOT_NEEDED);
+  Generator known_min_location = point(A + 2*B, 2);
+
+  bool ok_min = bds.minimize(LE, num, den, included, g);
+  Checked_Number<mpq_class, Extended_Number_Policy> min_value;
+  assign_r(min_value, num, ROUND_NOT_NEEDED);
+  assign_r(divisor, den, ROUND_NOT_NEEDED);
+  div_assign_r(min_value, min_value, divisor, ROUND_NOT_NEEDED);
+  ok_min &= included && g.is_point()
+    && check_result(min_value, known_min_value, "0.5")
+    && check_result(g, known_min_location, "0.5", "0.5", "0.5");
+
+  nout << (included ? "minimum" : "infinum") << " = " << min_value;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok_max && ok_min;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/maxspacedim1.cc b/tests/BD_Shape/maxspacedim1.cc
new file mode 100644
index 0000000..c3cb1b6
--- /dev/null
+++ b/tests/BD_Shape/maxspacedim1.cc
@@ -0,0 +1,96 @@
+/* Test BD_Shape::max_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  nout << BD_Shape<signed char>::max_space_dimension() << " (signed char)"
+       << endl
+       << BD_Shape<short>::max_space_dimension() << " (short)"
+       << endl
+       << BD_Shape<int>::max_space_dimension() << " (int)"
+       << endl
+       << BD_Shape<long>::max_space_dimension() << " (long)"
+       << endl
+       << BD_Shape<long long>::max_space_dimension() << " (long long)"
+       << endl
+#if PPL_SUPPORTED_FLOAT
+       << BD_Shape<float>::max_space_dimension() << " (float)"
+       << endl
+#endif
+#if PPL_SUPPORTED_DOUBLE
+       << BD_Shape<double>::max_space_dimension() << " (double)"
+       << endl
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+       << BD_Shape<long double>::max_space_dimension() << " (long double)"
+       << endl
+#endif
+       << BD_Shape<mpz_class>::max_space_dimension() << " (mpz_class)"
+       << endl
+       << BD_Shape<mpq_class>::max_space_dimension() << " (mpq_class)"
+       << endl;
+
+  if (BD_Shape<signed char>::max_space_dimension()
+      < BD_Shape<short>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<short>::max_space_dimension()
+      < BD_Shape<int>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<int>::max_space_dimension()
+      < BD_Shape<long>::max_space_dimension())
+    return false;
+
+  if (BD_Shape<long>::max_space_dimension()
+      < BD_Shape<long long>::max_space_dimension())
+    return false;
+
+#if PPL_SUPPORTED_FLOAT && PPL_SUPPORTED_DOUBLE
+  if (BD_Shape<float>::max_space_dimension()
+      < BD_Shape<double>::max_space_dimension())
+    return false;
+#endif
+
+#if PPL_SUPPORTED_DOUBLE && PPL_SUPPORTED_LONG_DOUBLE
+  if (BD_Shape<double>::max_space_dimension()
+      < BD_Shape<long double>::max_space_dimension())
+    return false;
+#endif
+
+  if (2*BD_Shape<mpz_class>::max_space_dimension()
+      < BD_Shape<mpq_class>::max_space_dimension())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/membytes1.cc b/tests/BD_Shape/membytes1.cc
new file mode 100644
index 0000000..d43396b
--- /dev/null
+++ b/tests/BD_Shape/membytes1.cc
@@ -0,0 +1,241 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(TBD_Shape& bds, const Constraint& c) {
+  const memory_size_type bd_memory_before = bds.total_memory_in_bytes();
+  const memory_size_type c_memory = c.total_memory_in_bytes();
+  bds.add_constraint(c);
+  const memory_size_type bd_memory_after = bds.total_memory_in_bytes();
+
+  nout << bd_memory_before
+       << " + " << c_memory
+       << " -> " << bd_memory_after
+       << endl;
+}
+
+void
+minimize(TBD_Shape& bds) {
+  const memory_size_type bd_memory_before = bds.total_memory_in_bytes();
+  (void) bds.minimized_constraints();
+  const memory_size_type bd_memory_after = bds.total_memory_in_bytes();
+
+  nout << bd_memory_before
+       << " -m-> " << bd_memory_after
+       << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  using namespace test01_namespace;
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le -= 4*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 4;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding constraints to a bounded difference shape ***" << endl;
+
+  TBD_Shape bds(3);
+  add_constraint(bds, 2*x - 2*y >= 0);
+  add_constraint(bds, x - y - 1 <= 0);
+  add_constraint(bds, x >= 0);
+  minimize(bds);
+  add_constraint(bds, x + 1 >= 0);
+  add_constraint(bds, x - z - 1 >= 0);
+  add_constraint(bds, 2*x - 2*z + 7 >= 0);
+  minimize(bds);
+  add_constraint(bds, x - y + 5 >= 0);
+  add_constraint(bds, 2*x - 2*z + 13 >= 0);
+  add_constraint(bds, -2*x + 2*z + 1 >= 0);
+  add_constraint(bds, -x + y - 1 >= 0);
+  minimize(bds);
+  add_constraint(bds, -x + y + 7 >= 0);
+  add_constraint(bds, -4*x + 4*y - 4 >= 0);
+  add_constraint(bds, -2*x + 2*z - 5 >= 0);
+  add_constraint(bds, -x + 1 >= 0);
+  minimize(bds);
+  add_constraint(bds, -x + y + 5 >= 0);
+  minimize(bds);
+
+  const memory_size_type bd_total_size = bds.total_memory_in_bytes();
+  const memory_size_type bd_external_size = bds.external_memory_in_bytes();
+  const Constraint_System& cs = bds.constraints();
+  const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+  const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+
+  nout << endl;
+
+  nout << "*** Size of the user-visible polyhedra components ***"
+       << endl
+       << "bds.total_memory_in_bytes() = " << bd_total_size
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl
+       << "bds.external_memory_in_bytes() = " << bd_external_size
+       << endl
+       << "cs.external_memory_in_bytes() = " << cs_external_size
+       << endl << endl;
+
+  nout << "*** Size of a constraint system vs size of contained constraints"
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl;
+
+  memory_size_type cs_elements_size = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained constraints = " << cs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(4*x - 4*y + 14 >= 0);
+  bds.add_constraint(x - z + 2 >= 0);
+  bds.add_constraint(y - z - 5 >= 0);
+
+  const memory_size_type bd_total_size = bds.total_memory_in_bytes();
+  const memory_size_type bd_external_size = bds.external_memory_in_bytes();
+
+  Determinate<TBD_Shape> dbds(bds);
+
+  const memory_size_type dbd_total_size = dbds.total_memory_in_bytes();
+  const memory_size_type dbd_external_size = dbds.external_memory_in_bytes();
+
+  nout << "bds.total_memory_in_bytes() = " << bd_total_size
+       << endl
+       << "bds.external_memory_in_bytes() = " << bd_external_size
+       << endl
+       << "dbds.total_memory_in_bytes() = " << dbd_total_size
+       << endl
+       << "dbds.external_memory_in_bytes() = " << dbd_external_size
+       << endl;
+
+  Pointset_Powerset<TBD_Shape> pbds(bds);
+
+  TBD_Shape qbds(3);
+  qbds.add_constraint(x >= 0);
+  qbds.add_constraint(y >= 0);
+  qbds.add_constraint(z >= 0);
+  qbds.add_constraint(x <= 1);
+  qbds.add_constraint(y <= 1);
+  qbds.add_constraint(z <= 1);
+  Pointset_Powerset<TBD_Shape> pqbds(qbds);
+
+  Pointset_Powerset<TBD_Shape> prbds = pqbds;
+  prbds.difference_assign(pbds);
+
+  const memory_size_type pbd_total_size = pbds.total_memory_in_bytes();
+  const memory_size_type pbd_external_size = pbds.external_memory_in_bytes();
+  const memory_size_type pqbd_total_size = pqbds.total_memory_in_bytes();
+  const memory_size_type pqbd_external_size = pqbds.external_memory_in_bytes();
+  const memory_size_type prbd_total_size = prbds.total_memory_in_bytes();
+  const memory_size_type prbd_external_size = prbds.external_memory_in_bytes();
+
+  nout << "pbds.total_memory_in_bytes() = " << pbd_total_size
+       << endl
+       << "pbds.external_memory_in_bytes() = " << pbd_external_size
+       << endl
+       << "pqbds.total_memory_in_bytes() = " << pqbd_total_size
+       << endl
+       << "pqbds.external_memory_in_bytes() = " << pqbd_external_size
+       << endl
+       << "prbds.total_memory_in_bytes() = " << prbd_total_size
+       << endl
+       << "prbds.external_memory_in_bytes() = " << prbd_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/minconstraints1.cc b/tests/BD_Shape/minconstraints1.cc
new file mode 100644
index 0000000..08cb03d
--- /dev/null
+++ b/tests/BD_Shape/minconstraints1.cc
@@ -0,0 +1,95 @@
+/* Test BD_Shape<T>::minimized_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(A - B >= -2);
+  bds.add_constraint(A >= -3);
+  bds.add_constraint(A <= 1);
+
+  print_constraints(bds, "*** bds ***");
+
+  const Constraint_System cs = bds.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** bds.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_bds(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && ph_bds == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBD_Shape bds(0, UNIVERSE);
+
+  print_constraints(bds, "*** bds ***");
+
+  const Constraint_System cs = bds.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** bds.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  return num_constraints == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/BD_Shape/relations1.cc b/tests/BD_Shape/relations1.cc
new file mode 100644
index 0000000..4cf7b40
--- /dev/null
+++ b/tests/BD_Shape/relations1.cc
@@ -0,0 +1,471 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Poly_Con_Relation rel = bds.relation_with(A >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(y <= -1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(y <= 1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // Variable x(0);
+  // Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(z >= 1);
+
+  Constraint c(z >= 0);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 1);
+
+  Constraint c(x >= 1);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x == 1);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
+
+  Constraint c(x == 1);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x >= 3);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 3);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x <= 3);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
+
+  Constraint c(-x >= 2);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  // The zero-dim universe BDS.
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(0 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe BDS.
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(0 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // The zero-dim universe BDS.
+  TBD_Shape bds;
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 1);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x == 1);
+  bds.add_constraint(y <= 0);
+  bds.add_constraint(z >= 2);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(y >= 1);
+
+  Poly_Con_Relation rel = bds.relation_with(-y >= -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(-y >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(x - y <= 2);
+  bds.add_constraint(x - z >= -1);
+  bds.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = bds.relation_with(y > 3);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(y > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3);
+
+  bds.add_constraint(x - y <= 2);
+  bds.add_constraint(x - z >= -1);
+  bds.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = bds.relation_with(-y >= -4);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(A >= -2);
+
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) >= -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(0 >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // We verify that a generator is not subsumed by an empty BDS.
+  Variable x(0);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Generator g = point(x);
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // We verify that a zero-dimensional generator is subsumed
+  // by a zero-dimensional, universal BDS.
+  TBD_Shape bds;
+
+  Generator g = point();
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations2.cc b/tests/BD_Shape/relations2.cc
new file mode 100644
index 0000000..0ed503b
--- /dev/null
+++ b/tests/BD_Shape/relations2.cc
@@ -0,0 +1,445 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // The zero-dim universe BDS.
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) > 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // The zero-dim universe BDS.
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(0) > 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // The zero-dim universe BDS.
+  TBD_Shape bds(0);
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) > 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // An empty BDS.
+  TBD_Shape bds(1);
+  bds.add_constraint(Linear_Expression(0) >= 1);
+
+  Variable A(0);
+
+  Poly_Con_Relation rel = bds.relation_with(A > 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A > 0) = " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B == 3);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B > 3);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B <= 3);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B > 3);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A <= 1);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A > 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B > 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A > 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B - A > 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(1 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(B >= 2);
+
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) > 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(1 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A == 1);
+  bds.add_constraint(B >= 2);
+  bds.add_constraint(C <= 1);
+
+  Poly_Con_Relation rel = bds.relation_with(Linear_Expression(1) == 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(1 == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B >= 0);
+  bds.add_constraint(B >= 0);
+
+  Poly_Gen_Relation rel1 = bds.relation_with(point(B));
+  Poly_Gen_Relation rel2 = bds.relation_with(point(-B));
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(point(B)) == " << rel1 << endl;
+  nout << "bds.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = bds.relation_with(ray(-A));
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = bds.relation_with(line(A));
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = bds.relation_with(closure_point(A));
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(closure_point(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 2);
+  bds.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = bds.relation_with(ray(A + B));
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(ray(A + B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // The system of constraints of the BDS contains only
+  // an equality and the generator `g' is a point.
+  Variable A(0);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == 0);
+
+  Poly_Gen_Relation rel = bds.relation_with(point(2*A));
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - C - B <= 2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - C - B <= 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations3.cc b/tests/BD_Shape/relations3.cc
new file mode 100644
index 0000000..db5aae6
--- /dev/null
+++ b/tests/BD_Shape/relations3.cc
@@ -0,0 +1,464 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::relation_with(c):
+    // it is illegal to use a constraint that is
+    // dimensional incompatible with the BDS.
+    Poly_Con_Relation rel = bds.relation_with(C - B <= 2);
+    (void) rel;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - 2*B <= 2);
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  print_constraints(bds, "*** bds ***");
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::relation_with(c):
+    // it is illegal to use a generator that is
+    // dimensional incompatible with the BDS.
+    Poly_Gen_Relation rel = bds.relation_with(ray(C));
+    (void) rel;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A <= -2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A <= -2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A == -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included() &&
+    Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B <= -2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A <= -2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B == -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included() &&
+    Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A - B == -1);
+
+  Poly_Con_Relation rel = bds.relation_with(A - B == -2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  // A 1D empty BDS that is not in minimal form and the point is the origin.
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A <= 0);
+  bds.add_constraint(A >= 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A == 1);
+
+  Generator g = point(3*A, 2);
+  Poly_Gen_Relation rel = bds.relation_with(g);
+
+  print_constraints(bds, "*** bds ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  BD_Shape<mpz_class> bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 1);
+
+  Constraint c(2*A == 1);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 1);
+
+  Constraint c(Linear_Expression(1) == 0);
+  Poly_Con_Relation rel = bds.relation_with(c);
+
+  print_constraints(bds, "*** bds ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TBD_Shape bds(1);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(A <= 1);
+
+  Congruence cg((A %= 0) / 0);
+  Poly_Con_Relation rel = bds.relation_with(cg);
+
+  print_constraints(bds, "--- bds ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 1) / 10);
+  Poly_Con_Relation rel = bds.relation_with(cg);
+
+  print_constraints(bds, "--- bds ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "bds.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A >= 0);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B <= 2);
+  bds.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 10) / 11);
+  Poly_Con_Relation rel = bds.relation_with(cg);
+
+  print_constraints(bds, "--- bds ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "bds.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/BD_Shape/relations4.cc b/tests/BD_Shape/relations4.cc
new file mode 100644
index 0000000..4519c68
--- /dev/null
+++ b/tests/BD_Shape/relations4.cc
@@ -0,0 +1,436 @@
+/* Test BD_Shape::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B <= -1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= -1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B == 0);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B - 4*A >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B - 4*A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B + 4*A == 5);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B + 4*A == 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B + 4*A > 14);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B + 4*A > 14) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(B + 4*A >= 15);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(B + 4*A >= 15) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+  test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B == 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 1);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 3);
+  cs.insert(B <= 3);
+  cs.insert(B >= 3);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 6);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 6);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A + B >= 8);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A + B >= 8) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A - B == 3);
+  cs.insert(B == 1);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(A - 2*B > 2);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(A - 2*B > 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B <= 3);
+  cs.insert(A <= 1);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(2*A - B > 4);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(2*A - B > 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B >= 3);
+  cs.insert(A >= 1);
+  TBD_Shape bds(cs);
+
+  Poly_Con_Relation rel = bds.relation_with(2*A - B < 4);
+
+  print_constraints(bds, "*** bds ***");
+  using namespace IO_Operators;
+  nout << "bds.relation_with(2*A - B < 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/BD_Shape/removespacedims1.cc b/tests/BD_Shape/removespacedims1.cc
new file mode 100644
index 0000000..3972733
--- /dev/null
+++ b/tests/BD_Shape/removespacedims1.cc
@@ -0,0 +1,388 @@
+/* Remove some variables from the space.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TBD_Shape bds(6);
+  bds.add_constraint(x2 - x3 <= 0);
+  bds.add_constraint(x3 <= 2);
+  bds.add_constraint(x6 - x5 <= 2);
+  bds.add_constraint(x5 <= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x5);
+
+  bds.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x2 <= 2);
+  known_result.add_constraint(x4 <= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_space_dimensions({x3, x5}) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+
+  TBD_Shape bds(8);
+  bds.add_constraint(x7 - x3 <= 0);
+  bds.add_constraint(x1 <= 2);
+  bds.add_constraint(x4 - x8 <= 2);
+  bds.add_constraint(x5 <= 7);
+  bds.add_constraint(x2 <= 10);
+  bds.add_constraint(x6 - x8 <= 4);
+
+  print_constraints(bds, "*** bds ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x2);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+  to_be_removed.insert(x6);
+  to_be_removed.insert(x7);
+  to_be_removed.insert(x8);
+
+  bds.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(0);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds,
+                    "*** bds.remove_space_dimensions"
+                    "({x1, x2, x3, x4, x5, x6, x7, x8}) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= -2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+  bds.add_constraint(x4 >= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+
+  bds.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_space_dimensions({x1, x3, x4}) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x1 <= 2);
+  bds.add_constraint(x2 <= 10);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.remove_higher_space_dimensions(0);
+
+  BD_Shape<mpq_class> known_result(0, UNIVERSE);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= -2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+  bds.add_constraint(x4 >= 3);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.remove_higher_space_dimensions(1);
+
+  BD_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= 2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+  bds.add_constraint(x4 >= 3);
+  bds.add_constraint(x5 - x3 == 2);
+
+  print_constraints(bds, "*** bds ***");
+
+  bds.remove_higher_space_dimensions(3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 2);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 5);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TBD_Shape bds(3);
+  bds.add_constraint(x1 - x2 <=1);
+  bds.add_constraint(x2 - x3 <= 2);
+  bds.add_constraint(x3 - x1 <= 0);
+  bds.add_constraint(x2 >= 5);
+
+  print_constraints(bds, "*** bds ***");
+
+  BD_Shape<mpq_class> known_result(bds);
+
+  bds.remove_higher_space_dimensions(3);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TBD_Shape bds(5);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::remove_higher_dimensions(n): it is illegal to erase
+    // a variable that is not in the space of the polyhedron.
+    bds.remove_higher_space_dimensions(7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(y - z <= 2);
+  TBD_Shape bds(cs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  bds.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of method
+    // BD_Shape::remove_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    bds.remove_space_dimensions(to_be_removed);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x1 - x2 <= 1);
+  cs.insert(x2 - x3 <= 3);
+  cs.insert(x3 - x1 <= 0);
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 - x3 == 3);
+  TBD_Shape bds(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  cs = bds.minimized_constraints();
+  bds.remove_higher_space_dimensions(3);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 3);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x1 - x2 <= 1);
+  cs.insert(x2 - x3 <= 3);
+  cs.insert(x3 - x1 <= 0);
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 - x3 == 3);
+  TBD_Shape bds(cs);
+
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+
+  cs = bds.minimized_constraints();
+  bds.remove_space_dimensions(to_be_removed);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 - x2 <=1);
+  known_result.add_constraint(x2 - x3 <= 3);
+  known_result.add_constraint(x3 - x1 <= 0);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(bds, known_result);
+
+  print_constraints(bds, "*** bds.remove_space_dimensions({x4, x5}) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/run_tests b/tests/BD_Shape/run_tests
new file mode 100755
index 0000000..ad5730e
--- /dev/null
+++ b/tests/BD_Shape/run_tests
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+# Run the BD_Shape tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DBD_SHAPE_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/BD_Shape/simplifyusingcontext1.cc b/tests/BD_Shape/simplifyusingcontext1.cc
new file mode 100644
index 0000000..cbe21a7
--- /dev/null
+++ b/tests/BD_Shape/simplifyusingcontext1.cc
@@ -0,0 +1,306 @@
+/* Test BD_Shape::simplify_using_context_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(bds1);
+  bds2.affine_image(x, x + 6);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(x <= 2);
+
+  bool ok = !bds1.simplify_using_context_assign(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.simplify_using_context_assign(bds2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 2);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(bds1);
+  bds2.affine_image(x, x + 1);
+  bds2.affine_image(y, y + 6);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  // NOTE: this is the result computed when using the current heuristics.
+  // It turns out that the current heuristics is not smart enough to see
+  // that constraint y <= 2 is not really needed.
+  TBD_Shape known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = !bds1.simplify_using_context_assign(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.simplify_using_context_assign(bds2) ***");
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  TBD_Shape bds1(1);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 6);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(1);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 5);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape computed_result = bds1;
+
+  computed_result.simplify_using_context_assign(bds2);
+
+  TBD_Shape known_result(1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result,
+                    "*** bds1.simplify_using_context_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TBD_Shape bds1 = TBD_Shape(3, UNIVERSE);
+  bds1.add_constraint(i >= 1);
+  bds1.add_constraint(i <= 10);
+  bds1.add_constraint(j >= 1);
+  bds1.add_constraint(j <= 10);
+  bds1.add_constraint(k == 0);
+
+  TBD_Shape bds2 = TBD_Shape(3, UNIVERSE);
+  bds2.add_constraint(i >= 0);
+  bds2.add_constraint(i <= 2);
+  bds2.add_constraint(j >= 2);
+  bds2.add_constraint(j <= 9);
+  bds2.add_constraint(k == 0);
+
+  print_constraints(bds1, "=== bds1 ===");
+  print_constraints(bds2, "=== bds2 ===");
+
+  TBD_Shape known_result = TBD_Shape(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+
+  bds1.simplify_using_context_assign(bds2);
+
+  bool ok = (bds1 == known_result);
+
+  print_constraints(bds1, "=== bds1.simplify_using_context_assign(bds2) ===");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TBD_Shape bds1(3, UNIVERSE);
+  bds1.add_constraint(i == 1);
+  bds1.add_constraint(j + 1 == 0);
+  bds1.add_constraint(k == 3);
+
+  TBD_Shape bds2(3, UNIVERSE);
+  bds2.add_constraint(i == 1);
+  bds2.add_constraint(k >= 0);
+  bds2.add_constraint(k <= 3);
+
+  TBD_Shape known_result(3, UNIVERSE);
+  known_result.add_constraint(k >= 3);
+  known_result.add_constraint(j + 1 == 0);
+
+  bds1.simplify_using_context_assign(bds2);
+
+  bool ok = (bds1 == known_result);
+
+  print_constraints(bds1.minimized_constraints(),
+                    "=== bds1.simplify_using_context_assign(bds2) ===");
+  print_constraints(known_result.minimized_constraints(),
+                    "=== known_result ===");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBD_Shape bds1(3, UNIVERSE);
+  bds1.add_constraint(A == 0);
+  bds1.add_constraint(B == C);
+  bds1.add_constraint(B >= 2);
+  print_constraints(bds1, "\n=== bds1 ===");
+
+  TBD_Shape bds2(3, UNIVERSE);
+  bds2.add_constraint(A == 0);
+  bds2.add_constraint(C >= 2);
+  print_constraints(bds2, "\n=== bds2 ===");
+
+  bds1.simplify_using_context_assign(bds2);
+
+  TBD_Shape known_result(3, UNIVERSE);
+  known_result.add_constraint(B == C);
+
+  bool ok = (bds1 == known_result);
+
+  print_constraints(bds1, "\n=== bds1.simplify_using_context_assign(bds2) ===");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBD_Shape bds1(0, EMPTY);
+  TBD_Shape bds2;
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result = bds1;
+
+  bds1.simplify_using_context_assign(bds2);
+
+  bool ok = (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.simplify_using_context_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  TBD_Shape bds1(1);
+  TBD_Shape bds2(1);
+
+  bds2.add_constraint(A == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result = bds1;
+
+  bds1.simplify_using_context_assign(bds2);
+
+  bool ok = (bds1 == known_result);
+
+  print_constraints(bds1,
+                    "*** bds1.simplify_using_context_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TBD_Shape bds1(3, UNIVERSE);
+  bds1.add_constraint(i >= 1);
+  bds1.add_constraint(i <= 10);
+  bds1.add_constraint(j >= 1);
+  bds1.add_constraint(j <= 10);
+  bds1.add_constraint(k == 0);
+
+  TBD_Shape bds2(3, UNIVERSE);
+  bds2.add_constraint(i <= 25);
+  bds2.add_constraint(j <= 25);
+  bds2.add_constraint(k == 0);
+
+  TBD_Shape known_result(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+  known_result.add_constraint(i <= 10);
+  known_result.add_constraint(j >= 1);
+  known_result.add_constraint(j <= 10);
+
+  bds1.simplify_using_context_assign(bds2);
+
+  bool ok = (bds1 == known_result);
+
+  print_constraints(bds1);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/BD_Shape/timeelapse1.cc b/tests/BD_Shape/timeelapse1.cc
new file mode 100644
index 0000000..71e9e60
--- /dev/null
+++ b/tests/BD_Shape/timeelapse1.cc
@@ -0,0 +1,243 @@
+/* Test time_elapse_assign() for particular polyhedra.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bds1(2, EMPTY);
+  TBD_Shape bds2(2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  TBD_Shape bds3(2);
+  TBD_Shape bds4(2, EMPTY);
+
+  print_constraints(bds3, "*** bds3 ***");
+  print_constraints(bds4, "*** bds4 ***");
+
+  bds3.time_elapse_assign(bds4);
+
+  bool ok = (bds1.is_empty() && bds3.is_empty());
+
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+  print_constraints(bds3, "*** bds3_time_elapse_assign(bds4) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y >= 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x >= 2);
+  bds2.add_constraint(x <= 4);
+  bds2.add_constraint(y == 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= 1);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(y >= 1);
+  bds1.add_constraint(y <= 3);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(y == 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(y <= 5);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y <= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1_time_elapse_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 2);
+  bds1.add_constraint(x >= 1);
+  bds1.add_constraint(y <= 5);
+  bds1.add_constraint(y >= 10);
+  bds1.add_constraint(z >= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(x <= 9);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y <= 3);
+  bds2.add_constraint(y >= -1);
+  bds2.add_constraint(z >= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.time_elapse_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  TBD_Shape bds1(1);
+  bds1.add_constraint(x == 1);
+
+  TBD_Shape bds2(2);
+
+  try {
+    // This is an invalid use of the method
+    // BD_Shape::time_elapse_assign(bds2): it is illegal to apply the
+    // method to two polyhedra that are not dimension-compatible.
+    bds1.time_elapse_assign(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(x >= 1);
+  bds1.add_constraint(y <= 5);
+  bds1.add_constraint(y >= 1);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y <= 3);
+  bds2.add_constraint(y >= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.time_elapse_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.time_elapse_assign(bds2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/BD_Shape/unconstrain1.cc b/tests/BD_Shape/unconstrain1.cc
new file mode 100644
index 0000000..747a36e
--- /dev/null
+++ b/tests/BD_Shape/unconstrain1.cc
@@ -0,0 +1,251 @@
+/* Test BD_Shape::unconstrain().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+  print_constraints(bds, "*** bds ***");
+
+  bds.unconstrain(A);
+
+  TBD_Shape known_result(2, EMPTY);
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2, EMPTY);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs(A, B);
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(2, EMPTY);
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == B);
+  bds.add_constraint(B >= 0);
+  print_constraints(bds, "*** bds ***");
+
+  bds.unconstrain(B);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(A == B);
+  bds.add_constraint(B >= 0);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs(B);
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds(0, EMPTY);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs;
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(0, EMPTY);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBD_Shape bds(0);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs;
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    TBD_Shape bds(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    bds.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    TBD_Shape bds(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    bds.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBD_Shape bds(5);
+  bds.add_constraint(A - B == 9);
+  bds.add_constraint(A >= D + 2);
+  bds.add_constraint(C <= D);
+  bds.add_constraint(E <= B);
+  bds.add_constraint(E >= 0);
+  print_constraints(bds, "*** bds ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  bds.unconstrain(vs);
+
+  TBD_Shape known_result(5);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (bds == known_result);
+
+  print_constraints(bds, "*** after bds.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  try {
+    TBD_Shape bds(7);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    bds.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/BD_Shape/universe1.cc b/tests/BD_Shape/universe1.cc
new file mode 100644
index 0000000..1d4b9eb
--- /dev/null
+++ b/tests/BD_Shape/universe1.cc
@@ -0,0 +1,90 @@
+/* Test BD_Shape::is_universe().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(4);
+
+  bds.add_constraint(-x <= 4);
+  bds.add_constraint(y - x <= 0);
+  bds.add_constraint(x - y <= -5);
+
+  bool universe = bds.is_universe();
+
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test02() {
+  TBD_Shape bds(4);
+
+  bool universe = bds.is_universe();
+
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test03() {
+  TBD_Shape bds(0);
+
+  bool universe = bds.is_universe();
+
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test04() {
+  TBD_Shape bds(20, EMPTY);
+
+  bool universe = bds.is_universe();
+
+  nout << "*** bds.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/upperbound1.cc b/tests/BD_Shape/upperbound1.cc
new file mode 100644
index 0000000..05a8c15
--- /dev/null
+++ b/tests/BD_Shape/upperbound1.cc
@@ -0,0 +1,281 @@
+/* Test BD_Shape::upper_bound_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBD_Shape bds1(5);
+  bds1.add_constraint(x1 <= 5);
+  bds1.add_constraint(x2 <= -1);
+  bds1.add_constraint(x1 -x2 <= 10);
+
+  TBD_Shape bds2(5);
+  bds2.add_constraint(x1  <= 2);
+  bds2.add_constraint(x4 <= 7);
+  bds2.add_constraint(x1 - x2 <= 20);
+  bds2.add_constraint(x4 - x3 <= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.upper_bound_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(x1 <= 5);
+  known_result.add_constraint(x1 - x2 <= 20);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(3);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(-x <= -1);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(-y <= -1);
+  bds1.add_constraint(x - y <= 1);
+
+  TBD_Shape bds2(3);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(-y <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.upper_bound_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y >= -5);
+  known_result.add_constraint(x >= -4);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(x - y <= 8);
+  known_result.add_constraint(y - x <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x <= 4);
+  bds1.add_constraint(-x <= -1);
+  bds1.add_constraint(y <= 3);
+  bds1.add_constraint(-y <= -1);
+  bds1.add_constraint(x - y <= 1);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(y - x <= -1);
+  bds2.add_constraint(x <= 3);
+  bds2.add_constraint(x >= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  BD_Shape<mpq_class> known_result(bds1);
+
+  bds1.upper_bound_assign(bds2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 4);
+  bds1.add_constraint(A >= 1);
+  bds1.add_constraint(B <= 3);
+  bds1.add_constraint(-B <= -1);
+  bds1.add_constraint(A - B <= 1);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(B - A <= -1);
+  bds2.add_constraint(A <= 3);
+  bds2.add_constraint(-B <= 5);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.upper_bound_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= -5);
+  known_result.add_constraint(A >= -4);
+  known_result.add_constraint(B <= 3);
+  known_result.add_constraint(A - B <= 8);
+  known_result.add_constraint(B - A <= 2);
+
+  bool ok = check_result(bds1, known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBD_Shape bds1(12);
+  TBD_Shape bds2(5);
+
+  try {
+    // This is an incorrect use of method
+    // BD_Shape::upper_bound_assign(bds2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    bds1.upper_bound_assign(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(x >= y);
+
+  TBD_Shape bds2(3);
+
+  try {
+    // This is an invalid use of method
+    // BD_Shape::upper_bound_assign(bds2): it is illegal
+    // to apply the method to two polyhedra of different dimensions.
+    bds1.upper_bound_assign(bds2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBD_Shape bds1(1);
+  bds1.add_constraint(A <= 0);
+  bds1.add_constraint(A >= 1);
+
+  TBD_Shape bds2(1);
+  bds2.add_constraint(A <= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  bds1.upper_bound_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBD_Shape bds1(2);
+  bds1.add_constraint(A <= 0);
+  bds1.add_constraint(B >= 0);
+  bds1.add_constraint(A - B <= 0);
+
+  TBD_Shape bds2(2);
+  bds2.add_constraint(A <= 0);
+  bds2.add_constraint(A - B <= 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  (void) bds1.minimized_constraints();
+
+  bds1.upper_bound_assign(bds2);
+
+  BD_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(A - B <= 0);
+
+  bool ok = check_result(bds1, known_result) ;
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign(bds2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/BD_Shape/upperboundifexact1.cc b/tests/BD_Shape/upperboundifexact1.cc
new file mode 100644
index 0000000..cc90f37
--- /dev/null
+++ b/tests/BD_Shape/upperboundifexact1.cc
@@ -0,0 +1,376 @@
+/* Test BD_Shape::upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBD_Shape bds_empty(0, EMPTY);
+  TBD_Shape bds_universe(0, UNIVERSE);
+
+  // Testing all combinations for 0-dim polyhedra.
+  bool ok = true;
+  TBD_Shape bds;
+
+  // empty, empty
+  bds = bds_empty;
+  ok &= bds.upper_bound_assign_if_exact(bds_empty);
+  ok &= (bds == bds_empty);
+  print_constraints(bds, "*** empty union empty ***");
+
+  // empty, universe
+  bds = bds_empty;
+  ok &= bds.upper_bound_assign_if_exact(bds_universe);
+  ok &= (bds == bds_universe);
+  print_constraints(bds, "*** empty union universe ***");
+
+  // universe, empty
+  bds = bds_universe;
+  ok &= bds.upper_bound_assign_if_exact(bds_empty);
+  ok &= (bds == bds_universe);
+  print_constraints(bds, "*** universe union empty ***");
+
+  // universe, universe
+  bds = bds_universe;
+  ok &= bds.upper_bound_assign_if_exact(bds_universe);
+  ok &= (bds == bds_universe);
+  print_constraints(bds, "*** universe union universe ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= -2);
+  bds1.add_constraint(x <= -1);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 1);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y >= 0);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(bds1);
+
+  bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= -2);
+  bds1.add_constraint(x <= 0);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y >= 0);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x == 0);
+  bds1.add_constraint(y == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(x <= 2);
+  bds2.add_constraint(y >= -2);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(bds2);
+
+  bool ok = bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(y == 0);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+  bds2.add_constraint(y >= 2);
+  bds2.add_constraint(y <= 4);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(bds1);
+
+  bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x == y);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x == 0);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(bds1);
+
+  bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= y);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 0);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(bds1);
+
+  bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= y);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x <= y);
+
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(2, UNIVERSE);
+
+  bool ok = bds1.upper_bound_assign_if_exact(bds2);
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBD_Shape bds(3, UNIVERSE);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x <= 2);
+  bds.add_constraint(y >= 0);
+  bds.add_constraint(y <= 4);
+  bds.add_constraint(z >= 0);
+  bds.add_constraint(z <= 4);
+  bds.add_constraint(x - y <= 2);
+  bds.add_constraint(z - y <= 2);
+
+  TBD_Shape bds1(bds);
+  bds1.add_constraint(z <= 3);
+
+  print_constraints(bds1, "*** bds1 ***");
+
+  TBD_Shape bds2(bds);
+  bds2.add_constraint(x - y <= 1);
+
+  bool ok = bds1.upper_bound_assign_if_exact(bds2);
+
+  ok &= (bds1 == bds);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds1(2, UNIVERSE);
+  bds1.add_constraint(x >= 0);
+  bds1.add_constraint(x <= 3);
+  bds1.add_constraint(y >= 0);
+  bds1.add_constraint(y <= 2);
+  bds1.add_constraint(x - y <= 2);
+
+  TBD_Shape bds2(2, UNIVERSE);
+  bds2.add_constraint(x >= 3);
+  bds2.add_constraint(x <= 6);
+  bds2.add_constraint(y >= 0);
+  bds2.add_constraint(y <= 2);
+
+  print_constraints(bds1, "*** bds1 ***");
+  print_constraints(bds2, "*** bds2 ***");
+
+  TBD_Shape known_result(bds1);
+
+  bool ok = !bds1.upper_bound_assign_if_exact(bds2);
+
+  ok &= (bds1 == known_result);
+
+  print_constraints(bds1, "*** bds1.upper_bound_assign_if_exact(bds2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  // const dimension_type dim = 500;
+  const dimension_type dim = 50;
+  Constraint_System cs;
+  for (dimension_type i = 1; i < dim; ++i) {
+    Variable x(i);
+    cs.insert(x >= 0);
+    cs.insert(x <= 4);
+  }
+
+  Variable x(0);
+
+  TBD_Shape hypercube1(cs);
+  hypercube1.add_constraint(x >= 0);
+  hypercube1.add_constraint(x <= 4);
+
+  TBD_Shape hypercube2(cs);
+  hypercube2.add_constraint(x >= 2);
+  hypercube2.add_constraint(x <= 6);
+
+  TBD_Shape known_result(cs);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = hypercube1.upper_bound_assign_if_exact(hypercube2);
+
+  ok &= (hypercube1 == known_result);
+
+  print_constraints(hypercube1, "*** hyp1 ***");
+  print_constraints(hypercube2, "*** hyp2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/BD_Shape/wrap1.cc b/tests/BD_Shape/wrap1.cc
new file mode 100644
index 0000000..fdfcdf4
--- /dev/null
+++ b/tests/BD_Shape/wrap1.cc
@@ -0,0 +1,120 @@
+/* Test BD_Shape::wrap_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  TBD_Shape bd(2);
+  bd.refine_with_constraint(x >= 224);
+  bd.refine_with_constraint(x <= 260);
+  bd.refine_with_constraint(x-y >= 164);
+  bd.refine_with_constraint(x-y <= 168);
+
+  print_constraints(bd, "*** bd ***");
+
+  Variables_Set vars(x, y);
+
+  bd.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  TBD_Shape known_result(2);
+  typedef TBD_Shape::coefficient_type T;
+  if (!std::numeric_limits<T>::is_bounded
+      || (std::numeric_limits<T>::max() >= 260
+          && (std::numeric_limits<T>::is_iec559
+              || std::numeric_limits<T>::min() <= -260))) {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(x <= 255);
+    known_result.refine_with_constraint(y >= 56);
+    known_result.refine_with_constraint(y <= 96);
+    known_result.refine_with_constraint(x-y <= 168);
+    known_result.refine_with_constraint(y-x <= 92);
+  }
+  else {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(y >= 0);
+  }
+
+  bool ok = (bd == known_result);
+
+  print_constraints(bd, "*** bd.wrap_assign(...) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  TBD_Shape bd(2);
+  bd.refine_with_constraint(x >= 224);
+  bd.refine_with_constraint(x <= 260);
+  bd.refine_with_constraint(x-y >= 164);
+  bd.refine_with_constraint(x-y <= 168);
+
+  print_constraints(bd, "*** bd ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  bd.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  TBD_Shape known_result(2);
+  typedef TBD_Shape::coefficient_type_base T;
+  if (!std::numeric_limits<T>::is_bounded
+      || (std::numeric_limits<T>::max() >= 260
+          && (std::numeric_limits<T>::is_iec559
+              || std::numeric_limits<T>::min() <= -260))) {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(x <= 4);
+    known_result.refine_with_constraint(y >= 88);
+    known_result.refine_with_constraint(y-x >= 88);
+    known_result.refine_with_constraint(y-x <= 92);
+  }
+  else {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(y >= 0);
+    known_result.refine_with_constraint(+x-y <= 0);
+  }
+
+  bool ok = (bd == known_result);
+
+  print_constraints(bd, "*** bd.wrap_assign(...) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/BD_Shape/writebdshape1.cc b/tests/BD_Shape/writebdshape1.cc
new file mode 100644
index 0000000..bf04e8e
--- /dev/null
+++ b/tests/BD_Shape/writebdshape1.cc
@@ -0,0 +1,127 @@
+/* Test operator<<(ostream&, const BD_Shape&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  std::stringstream s;
+  using namespace IO_Operators;
+
+  TBD_Shape bds(3, UNIVERSE);
+
+  s << bds;
+  if (s.str() != "true")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(x <= 3);
+
+  s << bds;
+  if (s.str() != "A <= 3")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(x - y <= 4);
+
+  s << bds;
+  if (s.str() != "A <= 3, A - B <= 4")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(-y <= -2);
+
+  s << bds;
+  if (s.str() != "A <= 3, B >= 2, A - B <= 4")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  bds.add_constraint(x-z <= 0);
+
+  s << bds;
+  if (s.str() != "A <= 3, B >= 2, A - B <= 4, A - C <= 0")
+    return false;
+  print_constraints(bds, "*** bds ***");
+  s.str("");
+
+  return true;
+}
+
+bool
+test02() {
+  std::stringstream s;
+  using namespace IO_Operators;
+
+  TBD_Shape bds1(0, EMPTY);
+
+  s << bds1;
+  if (s.str() != "false")
+    return false;
+  print_constraints(bds1, "*** bds1 ***");
+  s.str("");
+
+  TBD_Shape bds2(0, UNIVERSE);
+
+  s << bds2;
+  if (s.str() != "true")
+    return false;
+  print_constraints(bds2, "*** bds2 ***");
+  s.str("");
+
+  TBD_Shape bds3(1, EMPTY);
+
+  s << bds3;
+  if (s.str() != "false")
+    return false;
+  print_constraints(bds3, "*** bds3 ***");
+  s.str("");
+
+  TBD_Shape bds4(1, UNIVERSE);
+
+  s << bds4;
+  if (s.str() != "true")
+    return false;
+  print_constraints(bds4, "*** bds4 ***");
+  s.str("");
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Box/Makefile.am b/tests/Box/Makefile.am
new file mode 100644
index 0000000..3009a5c
--- /dev/null
+++ b/tests/Box/Makefile.am
@@ -0,0 +1,330 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76widening \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+frompartiallyreducedproduct1 \
+frompolyhedron1 \
+frompolyhedron2 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 \
+geomcovers1 \
+intersection1 \
+interval1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+propagateconstraints1 propagateconstraints2 \
+relations1 relations2 relations3 relations4 \
+refinewithconstraint1 refinewithconstraint2 \
+refinewithconstraints1 \
+refinewithconstraints2 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+topclosed1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writebox1
+
+DERIVED_TESTS = \
+nnc_frompolyhedron1
+
+ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS)
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DBOX_INSTANCE=rt_r_oc
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCES=fl_r_oc
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCES=db_r_oc
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCES=ld_r_oc
+endif
+
+# NOTE: rt_r_oc must be the first in the list.
+INSTANCES = \
+rt_r_oc \
+$(LONG_DOUBLE_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(FLOAT_INSTANCES)
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76widening_SOURCES = cc76widening.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+frompolyhedron2_SOURCES = frompolyhedron2.cc
+
+frompartiallyreducedproduct1_SOURCES = frompartiallyreducedproduct1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+interval1_SOURCES = interval1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+max_min1_SOURCES = max_min1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+
+propagateconstraints1_SOURCES = propagateconstraints1.cc
+propagateconstraints2_SOURCES = propagateconstraints2.cc
+
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraint2_SOURCES = refinewithconstraint2.cc
+
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithconstraints2_SOURCES = refinewithconstraints2.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+
+wrap1_SOURCES = wrap1.cc
+
+writebox1_SOURCES = writebox1.cc
+
+
+#
+# Sources and compilation flags for the derived check programs
+#
+
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+
+nnc_frompolyhedron1_SOURCES = frompolyhedron1.cc
+nnc_frompolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+BUGS =
+
+check_PROGRAMS = $(ALL_TESTS) $(BUGS)
+
+EXTRA_DIST =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Box/Makefile.in b/tests/Box/Makefile.in
new file mode 100644
index 0000000..f37527b
--- /dev/null
+++ b/tests/Box/Makefile.in
@@ -0,0 +1,1957 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4)
+subdir = tests/Box
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+	$(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addconstraints1$(EXEEXT) addspacedims1$(EXEEXT) \
+	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+	affinepreimage1$(EXEEXT) ascii_dump_load1$(EXEEXT) \
+	bgp99extrapolation1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) boundedaffineimage1$(EXEEXT) \
+	boundedaffinepreimage1$(EXEEXT) cc76narrowing1$(EXEEXT) \
+	cc76widening$(EXEEXT) concatenate1$(EXEEXT) \
+	congruences1$(EXEEXT) constrains1$(EXEEXT) \
+	constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+	discrete1$(EXEEXT) disjoint1$(EXEEXT) empty1$(EXEEXT) \
+	equality1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgensys1$(EXEEXT) \
+	fromgrid1$(EXEEXT) frompartiallyreducedproduct1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) frompolyhedron2$(EXEEXT) \
+	fromspacedim1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) geomcovers1$(EXEEXT) \
+	intersection1$(EXEEXT) interval1$(EXEEXT) \
+	limitedcc76extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+	max_min1$(EXEEXT) maxspacedim1$(EXEEXT) membytes1$(EXEEXT) \
+	minconstraints1$(EXEEXT) propagateconstraints1$(EXEEXT) \
+	propagateconstraints2$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) relations4$(EXEEXT) \
+	refinewithconstraint1$(EXEEXT) refinewithconstraint2$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) \
+	refinewithconstraints2$(EXEEXT) refinewithcongruence1$(EXEEXT) \
+	refinewithcongruences1$(EXEEXT) removespacedims1$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+	topclosed1$(EXEEXT) unconstrain1$(EXEEXT) universe1$(EXEEXT) \
+	upperbound1$(EXEEXT) upperboundifexact1$(EXEEXT) \
+	wrap1$(EXEEXT) writebox1$(EXEEXT)
+am__EXEEXT_2 = nnc_frompolyhedron1$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+am__EXEEXT_4 =
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76widening_OBJECTS = cc76widening.$(OBJEXT)
+cc76widening_OBJECTS = $(am_cc76widening_OBJECTS)
+cc76widening_LDADD = $(LDADD)
+cc76widening_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equality1_OBJECTS = equality1.$(OBJEXT)
+equality1_OBJECTS = $(am_equality1_OBJECTS)
+equality1_LDADD = $(LDADD)
+equality1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompartiallyreducedproduct1_OBJECTS =  \
+	frompartiallyreducedproduct1.$(OBJEXT)
+frompartiallyreducedproduct1_OBJECTS =  \
+	$(am_frompartiallyreducedproduct1_OBJECTS)
+frompartiallyreducedproduct1_LDADD = $(LDADD)
+frompartiallyreducedproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron2_OBJECTS = frompolyhedron2.$(OBJEXT)
+frompolyhedron2_OBJECTS = $(am_frompolyhedron2_OBJECTS)
+frompolyhedron2_LDADD = $(LDADD)
+frompolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_interval1_OBJECTS = interval1.$(OBJEXT)
+interval1_OBJECTS = $(am_interval1_OBJECTS)
+interval1_LDADD = $(LDADD)
+interval1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS =  \
+	limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS =  \
+	$(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_frompolyhedron1_OBJECTS =  \
+	nnc_frompolyhedron1-frompolyhedron1.$(OBJEXT)
+nnc_frompolyhedron1_OBJECTS = $(am_nnc_frompolyhedron1_OBJECTS)
+nnc_frompolyhedron1_LDADD = $(LDADD)
+nnc_frompolyhedron1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_frompolyhedron1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_propagateconstraints1_OBJECTS = propagateconstraints1.$(OBJEXT)
+propagateconstraints1_OBJECTS = $(am_propagateconstraints1_OBJECTS)
+propagateconstraints1_LDADD = $(LDADD)
+propagateconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_propagateconstraints2_OBJECTS = propagateconstraints2.$(OBJEXT)
+propagateconstraints2_OBJECTS = $(am_propagateconstraints2_OBJECTS)
+propagateconstraints2_LDADD = $(LDADD)
+propagateconstraints2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruence1_OBJECTS = refinewithcongruence1.$(OBJEXT)
+refinewithcongruence1_OBJECTS = $(am_refinewithcongruence1_OBJECTS)
+refinewithcongruence1_LDADD = $(LDADD)
+refinewithcongruence1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraint1_OBJECTS = refinewithconstraint1.$(OBJEXT)
+refinewithconstraint1_OBJECTS = $(am_refinewithconstraint1_OBJECTS)
+refinewithconstraint1_LDADD = $(LDADD)
+refinewithconstraint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraint2_OBJECTS = refinewithconstraint2.$(OBJEXT)
+refinewithconstraint2_OBJECTS = $(am_refinewithconstraint2_OBJECTS)
+refinewithconstraint2_LDADD = $(LDADD)
+refinewithconstraint2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints2_OBJECTS = refinewithconstraints2.$(OBJEXT)
+refinewithconstraints2_OBJECTS = $(am_refinewithconstraints2_OBJECTS)
+refinewithconstraints2_LDADD = $(LDADD)
+refinewithconstraints2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations4_OBJECTS = relations4.$(OBJEXT)
+relations4_OBJECTS = $(am_relations4_OBJECTS)
+relations4_LDADD = $(LDADD)
+relations4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperboundifexact1_OBJECTS = upperboundifexact1.$(OBJEXT)
+upperboundifexact1_OBJECTS = $(am_upperboundifexact1_OBJECTS)
+upperboundifexact1_LDADD = $(LDADD)
+upperboundifexact1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writebox1_OBJECTS = writebox1.$(OBJEXT)
+writebox1_OBJECTS = $(am_writebox1_OBJECTS)
+writebox1_LDADD = $(LDADD)
+writebox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affinepreimage1_SOURCES) $(ascii_dump_load1_SOURCES) \
+	$(bgp99extrapolation1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(cc76widening_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) $(empty1_SOURCES) \
+	$(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+	$(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(frompartiallyreducedproduct1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(frompolyhedron2_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) $(geomcovers1_SOURCES) \
+	$(intersection1_SOURCES) $(interval1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(membytes1_SOURCES) $(minconstraints1_SOURCES) \
+	$(nnc_frompolyhedron1_SOURCES) \
+	$(propagateconstraints1_SOURCES) \
+	$(propagateconstraints2_SOURCES) \
+	$(refinewithcongruence1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraint2_SOURCES) \
+	$(refinewithconstraints1_SOURCES) \
+	$(refinewithconstraints2_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(relations4_SOURCES) $(removespacedims1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(unconstrain1_SOURCES) \
+	$(universe1_SOURCES) $(upperbound1_SOURCES) \
+	$(upperboundifexact1_SOURCES) $(wrap1_SOURCES) \
+	$(writebox1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affinepreimage1_SOURCES) $(ascii_dump_load1_SOURCES) \
+	$(bgp99extrapolation1_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(cc76widening_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) $(empty1_SOURCES) \
+	$(equality1_SOURCES) $(expandspacedim1_SOURCES) \
+	$(foldspacedims1_SOURCES) $(frequency1_SOURCES) \
+	$(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgensys1_SOURCES) $(fromgrid1_SOURCES) \
+	$(frompartiallyreducedproduct1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(frompolyhedron2_SOURCES) \
+	$(fromspacedim1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) $(geomcovers1_SOURCES) \
+	$(intersection1_SOURCES) $(interval1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(membytes1_SOURCES) $(minconstraints1_SOURCES) \
+	$(nnc_frompolyhedron1_SOURCES) \
+	$(propagateconstraints1_SOURCES) \
+	$(propagateconstraints2_SOURCES) \
+	$(refinewithcongruence1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraint2_SOURCES) \
+	$(refinewithconstraints1_SOURCES) \
+	$(refinewithconstraints2_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(relations4_SOURCES) $(removespacedims1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(unconstrain1_SOURCES) \
+	$(universe1_SOURCES) $(upperbound1_SOURCES) \
+	$(upperboundifexact1_SOURCES) $(wrap1_SOURCES) \
+	$(writebox1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addconstraints1 \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+ascii_dump_load1 \
+bgp99extrapolation1 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+cc76narrowing1 \
+cc76widening \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+empty1 \
+equality1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+frompartiallyreducedproduct1 \
+frompolyhedron1 \
+frompolyhedron2 \
+fromspacedim1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 \
+geomcovers1 \
+intersection1 \
+interval1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+propagateconstraints1 propagateconstraints2 \
+relations1 relations2 relations3 relations4 \
+refinewithconstraint1 refinewithconstraint2 \
+refinewithconstraints1 \
+refinewithconstraints2 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+topclosed1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writebox1
+
+DERIVED_TESTS = \
+nnc_frompolyhedron1
+
+ALL_TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS)
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DBOX_INSTANCE=rt_r_oc
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCES = fl_r_oc
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCES = db_r_oc
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCES = ld_r_oc
+
+# NOTE: rt_r_oc must be the first in the list.
+INSTANCES = \
+rt_r_oc \
+$(LONG_DOUBLE_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(FLOAT_INSTANCES)
+
+
+#
+# Sources for the tests
+#
+addconstraints1_SOURCES = addconstraints1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76widening_SOURCES = cc76widening.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+frompolyhedron2_SOURCES = frompolyhedron2.cc
+frompartiallyreducedproduct1_SOURCES = frompartiallyreducedproduct1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+geomcovers1_SOURCES = geomcovers1.cc
+intersection1_SOURCES = intersection1.cc
+interval1_SOURCES = interval1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+max_min1_SOURCES = max_min1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+relations4_SOURCES = relations4.cc
+propagateconstraints1_SOURCES = propagateconstraints1.cc
+propagateconstraints2_SOURCES = propagateconstraints2.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraint2_SOURCES = refinewithconstraint2.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithconstraints2_SOURCES = refinewithconstraints2.cc
+removespacedims1_SOURCES = removespacedims1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+wrap1_SOURCES = wrap1.cc
+writebox1_SOURCES = writebox1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+nnc_frompolyhedron1_SOURCES = frompolyhedron1.cc
+nnc_frompolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+BUGS = 
+EXTRA_DIST = 
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Box/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Box/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) $(EXTRA_bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f bgp99extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) $(EXTRA_cc76narrowing1_DEPENDENCIES) 
+	@rm -f cc76narrowing1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+
+cc76widening$(EXEEXT): $(cc76widening_OBJECTS) $(cc76widening_DEPENDENCIES) $(EXTRA_cc76widening_DEPENDENCIES) 
+	@rm -f cc76widening$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cc76widening_OBJECTS) $(cc76widening_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES) 
+	@rm -f difference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES) $(EXTRA_equality1_DEPENDENCIES) 
+	@rm -f equality1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES) 
+	@rm -f frequency1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) $(EXTRA_fromgensys1_DEPENDENCIES) 
+	@rm -f fromgensys1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+frompartiallyreducedproduct1$(EXEEXT): $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_DEPENDENCIES) $(EXTRA_frompartiallyreducedproduct1_DEPENDENCIES) 
+	@rm -f frompartiallyreducedproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompartiallyreducedproduct1_OBJECTS) $(frompartiallyreducedproduct1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+frompolyhedron2$(EXEEXT): $(frompolyhedron2_OBJECTS) $(frompolyhedron2_DEPENDENCIES) $(EXTRA_frompolyhedron2_DEPENDENCIES) 
+	@rm -f frompolyhedron2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron2_OBJECTS) $(frompolyhedron2_LDADD) $(LIBS)
+
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) $(EXTRA_fromspacedim1_DEPENDENCIES) 
+	@rm -f fromspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) $(EXTRA_geomcovers1_DEPENDENCIES) 
+	@rm -f geomcovers1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+interval1$(EXEEXT): $(interval1_OBJECTS) $(interval1_DEPENDENCIES) $(EXTRA_interval1_DEPENDENCIES) 
+	@rm -f interval1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(interval1_OBJECTS) $(interval1_LDADD) $(LIBS)
+
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) $(EXTRA_limitedcc76extrapolation1_DEPENDENCIES) 
+	@rm -f limitedcc76extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+nnc_frompolyhedron1$(EXEEXT): $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_DEPENDENCIES) $(EXTRA_nnc_frompolyhedron1_DEPENDENCIES) 
+	@rm -f nnc_frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_frompolyhedron1_LINK) $(nnc_frompolyhedron1_OBJECTS) $(nnc_frompolyhedron1_LDADD) $(LIBS)
+
+propagateconstraints1$(EXEEXT): $(propagateconstraints1_OBJECTS) $(propagateconstraints1_DEPENDENCIES) $(EXTRA_propagateconstraints1_DEPENDENCIES) 
+	@rm -f propagateconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(propagateconstraints1_OBJECTS) $(propagateconstraints1_LDADD) $(LIBS)
+
+propagateconstraints2$(EXEEXT): $(propagateconstraints2_OBJECTS) $(propagateconstraints2_DEPENDENCIES) $(EXTRA_propagateconstraints2_DEPENDENCIES) 
+	@rm -f propagateconstraints2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(propagateconstraints2_OBJECTS) $(propagateconstraints2_LDADD) $(LIBS)
+
+refinewithcongruence1$(EXEEXT): $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_DEPENDENCIES) $(EXTRA_refinewithcongruence1_DEPENDENCIES) 
+	@rm -f refinewithcongruence1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) $(EXTRA_refinewithconstraint1_DEPENDENCIES) 
+	@rm -f refinewithconstraint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS)
+
+refinewithconstraint2$(EXEEXT): $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_DEPENDENCIES) $(EXTRA_refinewithconstraint2_DEPENDENCIES) 
+	@rm -f refinewithconstraint2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraint2_OBJECTS) $(refinewithconstraint2_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+refinewithconstraints2$(EXEEXT): $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_DEPENDENCIES) $(EXTRA_refinewithconstraints2_DEPENDENCIES) 
+	@rm -f refinewithconstraints2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints2_OBJECTS) $(refinewithconstraints2_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+relations4$(EXEEXT): $(relations4_OBJECTS) $(relations4_DEPENDENCIES) $(EXTRA_relations4_DEPENDENCIES) 
+	@rm -f relations4$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations4_OBJECTS) $(relations4_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES) 
+	@rm -f upperbound1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) $(EXTRA_upperboundifexact1_DEPENDENCIES) 
+	@rm -f upperboundifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES) 
+	@rm -f wrap1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writebox1$(EXEEXT): $(writebox1_OBJECTS) $(writebox1_DEPENDENCIES) $(EXTRA_writebox1_DEPENDENCIES) 
+	@rm -f writebox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writebox1_OBJECTS) $(writebox1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76widening.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equality1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompartiallyreducedproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/interval1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/propagateconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/propagateconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebox1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+nnc_frompolyhedron1-frompolyhedron1.o: frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frompolyhedron1-frompolyhedron1.o -MD -MP -MF $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo -c -o nnc_frompolyhedron1-frompolyhedron1.o `test -f 'frompolyhedron1.cc' || echo '$(srcdir)/'`frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frompolyhedron1-frompolyhedron1.o `test -f 'frompolyhedron1.cc' || echo '$(srcdir)/'`frompolyhedron1.cc
+
+nnc_frompolyhedron1-frompolyhedron1.obj: frompolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frompolyhedron1-frompolyhedron1.obj -MD -MP -MF $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo -c -o nnc_frompolyhedron1-frompolyhedron1.obj `if test -f 'frompolyhedron1.cc'; then $(CYGPATH_W) 'frompolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/frompolyhedron1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Tpo $(DEPDIR)/nnc_frompolyhedron1-frompolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='frompolyhedron1.cc' object='nnc_frompolyhedron1-frompolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frompolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frompolyhedron1-frompolyhedron1.obj `if test -f 'frompolyhedron1.cc'; then $(CYGPATH_W) 'frompolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/frompolyhedron1.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Box/addconstraints1.cc b/tests/Box/addconstraints1.cc
new file mode 100644
index 0000000..0dfee27
--- /dev/null
+++ b/tests/Box/addconstraints1.cc
@@ -0,0 +1,290 @@
+/* Test Box::add_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(A >= 0);
+  cs.insert(B == 5);
+  cs.insert(B <= 7);
+
+  TBox box(2);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::add_constraint: it is illegal
+    // to add a constraint with bigger dimension.
+    box.add_constraint(x <= 0);
+    box.add_constraint(y - x + z >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_constraints(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    box.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    box.add_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    box.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.add_constraints(cs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.add_recycled_constraints(cs);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.add_recycled_constraints(cs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 4);
+
+  TBox box(2);
+  box.add_constraints(cs);
+  bool ok = box.is_empty();
+
+  Rational_Box known_result(2, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+  cs.insert(A + 3 <= 2);
+
+  TBox box(2);
+  box.add_recycled_constraints(cs);
+  bool ok = box.is_empty();
+
+  Rational_Box known_result(2, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Box/addspacedims1.cc b/tests/Box/addspacedims1.cc
new file mode 100644
index 0000000..0e7f489
--- /dev/null
+++ b/tests/Box/addspacedims1.cc
@@ -0,0 +1,333 @@
+/* Test Box::add_space_dimensions_and_embed():
+   we add two variables to a Box.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_embed(2);
+  box.add_constraint(z <= 2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.add_space_dimensions_and_embed(2) "
+                    "and box.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1(0, EMPTY);
+  TBox box2(1, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.add_space_dimensions_and_embed(2);
+  box2.add_space_dimensions_and_embed(1);
+
+  bool ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(box2, "*** box2.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box(0, UNIVERSE);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_embed(3);
+
+  Rational_Box known_result(3, UNIVERSE);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimension_and_embed(3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(4);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+
+  Rational_Box known_result(box);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(0);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(0) ***");
+
+  bool ok = check_result(box, known_result);
+
+  return ok;
+}
+
+bool
+test06() {
+  //Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(1);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(3);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBox box(10, UNIVERSE);
+
+  box.remove_higher_space_dimensions(5);
+  box.add_space_dimensions_and_embed(6);
+
+  return box == TBox(11, UNIVERSE);
+}
+
+bool
+test08() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBox box(2);
+  box.add_constraint(x <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(z == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TBox box1(0, EMPTY);
+  TBox box2(1, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.add_space_dimensions_and_project(2);
+  box2.add_space_dimensions_and_project(1);
+
+  bool ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1.add_space_dimensions_and_project(2) ***");
+  print_constraints(box2, "*** box2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TBox box(0, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(3);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimension_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  box.add_space_dimensions_and_project(4);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 2);
+
+  TBox box2(box1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.add_space_dimensions_and_project(0);
+  box1.add_space_dimensions_and_embed(0);
+
+  bool ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1.add_space_dimensions_and_project(0) ***");
+  print_constraints(box2, "*** box2.add_space_dimensions_and_embed(0) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  //Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 2);
+
+  TBox box(cs);
+
+  print_constraints(box, "*** box ***");
+
+  box.minimized_constraints();
+  box.add_space_dimensions_and_embed(3);
+  box.add_constraint(z <= 2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(box, known_result) ;
+
+  print_constraints(box,
+                    "*** box.add_space_dimensions_and_embed(2) "
+                    "and box.add_constraint(z <= 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Box/affinedimension1.cc b/tests/Box/affinedimension1.cc
new file mode 100644
index 0000000..cd5efe7
--- /dev/null
+++ b/tests/Box/affinedimension1.cc
@@ -0,0 +1,292 @@
+/* Test Box::affine_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of `box' is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A <= 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 5);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A == 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 4);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 3);
+  box.add_constraint(-B <= 2);
+  box.add_constraint(B <= -2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 1);
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A <= 1);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B == 0);
+  box.add_constraint(C == 7);
+  box.add_constraint(D <= 9);
+  box.add_constraint(-D <= -9);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A == 1);
+  box.add_constraint(E == 1);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 2);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(7, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  dimension_type affine_dim = box.affine_dimension();
+
+  nout << endl
+       << "The affine dimension is "
+       << affine_dim
+       << endl;
+
+   bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test11() {
+  TBox box(0, UNIVERSE);
+
+  const dimension_type affine_dim = box.affine_dimension();
+
+  print_constraints(box, "*** box ***");
+
+  return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
+
+
diff --git a/tests/Box/affineimage1.cc b/tests/Box/affineimage1.cc
new file mode 100644
index 0000000..cf91d94
--- /dev/null
+++ b/tests/Box/affineimage1.cc
@@ -0,0 +1,429 @@
+/* Test Box::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, B);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B <= 4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, B) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, A + 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A <= 6);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, A + 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, Linear_Expression(4));
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A == 4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.affine_image(A, A);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, A) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, 2*A - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, 2*A - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(B, 2*A, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(B, 2*A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(B, 3*A + 3, 3);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(B, 3*A + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B <= 2);
+  box.add_constraint(B >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, -2*A - 3*B + 1, -5);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(5*A >= -4);
+  known_result.add_constraint(5*A <= 7);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= -1);
+
+  bool ok = check_result(box, known_result, "1.08e-7", "9.62e-8", "9.54e-8");
+
+  print_constraints(box, "*** box.affine_image(A, -2*A - 3*B + 1, -5) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 2);
+  box.add_constraint(C >= 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(C, A + 2*B -3*C + 2, 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(2*C <= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(C, A + 2*B -3*C + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 2);
+  box.add_constraint(B >= 1);
+  box.add_constraint(C <= 0);
+  box.add_constraint(D == 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, -B + 2*C + 1, -3);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C <= 0);
+  known_result.add_constraint(D == 3);
+
+  bool ok = check_result(box, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+  print_constraints(box, "*** box.affine_image(A, -B + 2*C + 1, -3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_image(A, 2*B + C + 2, 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_image(A, 2*B + C + 2, 4) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 2);
+
+  Linear_Expression coeff1 = A + 1;
+
+  try {
+    // This is an incorrect use of method
+    // Box::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    box.affine_image(A, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(1);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    box.affine_image(B, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    box.affine_image(B, A + C + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 2);
+
+  Linear_Expression coeff1 = 2*A + 1;
+
+  try {
+    // This is an incorrect use of method
+    // Box::affine_image(v, expr, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    box.affine_image(A, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/affinepreimage1.cc b/tests/Box/affinepreimage1.cc
new file mode 100644
index 0000000..32bca96
--- /dev/null
+++ b/tests/Box/affinepreimage1.cc
@@ -0,0 +1,178 @@
+/* Test Box::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(x, y);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(A, B-1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(A, B-1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(A, 2*A + 2, 2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.affine_preimage(B, Linear_Expression(3));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.affine_preimage(B, 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::affine_preimage(v, expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    box.affine_preimage(x, x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::affine_preimage(v, expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the box.
+    box.affine_preimage(y, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/ascii_dump_load1.cc b/tests/Box/ascii_dump_load1.cc
new file mode 100644
index 0000000..704b472
--- /dev/null
+++ b/tests/Box/ascii_dump_load1.cc
@@ -0,0 +1,254 @@
+/* Test Box::ascii_dump() and Box::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-EUP");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 1);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-EM");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-UN");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= -10);
+  box.add_constraint(A <= 10);
+  box.add_constraint(B >= 3);
+  box.add_constraint(B <= 6);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "lower");
+  f.seekp(0, ios_base::cur);
+  f << "Z(";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = !box2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 2);
+  box1.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = box2.ascii_load(f);
+  close(f);
+
+  if (!ok) {
+    nout << "ascii_load() failed" << endl;
+    return false;
+  }
+
+  ok = (box1 == box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(3*C == 5);
+  TBox box1(cs);
+
+  print_constraints(box1, "*** box1(cs) ***");
+
+  TBox box1_copy(box1);
+
+  box1.difference_assign(box1_copy);
+
+  print_constraints(box1, "*** box1.difference_assign(box1_copy) ***");
+
+  box1.concatenate_assign(box1_copy);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box1_copy) ***");
+
+  nout << "box1.space_dimension() = " << box1.space_dimension() << endl;
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  box1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  TBox box2;
+  bool ok = box2.ascii_load(f);
+  close(f);
+
+  if (!ok) {
+    nout << "ascii_load() failed" << endl;
+    return false;
+  }
+
+  ok = (box1 == box2);
+
+  nout << "box2.space_dimension() = " << box2.space_dimension() << endl;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/bgp99extrapolation1.cc b/tests/Box/bgp99extrapolation1.cc
new file mode 100644
index 0000000..0022d4f
--- /dev/null
+++ b/tests/Box/bgp99extrapolation1.cc
@@ -0,0 +1,86 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  typedef Pointset_Powerset<TBox> Box_Set;
+
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  TBox box2(2);
+  box2.add_constraint(A >= 1);
+  TBox box3(2);
+  box3.add_constraint(A >= 2);
+  TBox box4(2);
+  box4.add_constraint(A >= 3);
+
+  Box_Set box_set1(2, EMPTY);
+  box_set1.add_disjunct(box1);
+  box_set1.add_disjunct(box2);
+  box_set1.add_disjunct(box3);
+
+  Box_Set box_set2(box_set1);
+  box_set1.add_disjunct(box4);
+
+  using namespace IO_Operators;
+  nout << "*** box_set1 ***" << endl
+       << box_set1 << endl;
+  nout << "*** box_set2 ***" << endl
+       << box_set2 << endl;
+
+  TBox box5(2);
+  box5.add_constraint(A >= 2);
+  box5.add_constraint(B >= 6);
+
+  Box_Set known_result(2, EMPTY);
+  known_result.add_disjunct(box1);
+  known_result.add_disjunct(box2);
+  known_result.add_disjunct(box5);
+
+  typedef void (TBox::*Widening_Member)(const TBox&, unsigned*);
+  Widening_Member wm = &TBox::CC76_widening_assign;
+  box_set1.BGP99_extrapolation_assign(box_set2, widen_fun_ref(wm), 3);
+
+  bool ok = box_set1.geometrically_equals(known_result);
+
+  nout
+    << "*** box_set1.BGP99_extrapolation_assign"
+    << "(box_set2, widen_fun_ref(&CC76_widening_assign), 3) ***"
+    << endl
+    << box_set1 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/bhz03widening1.cc b/tests/Box/bhz03widening1.cc
new file mode 100644
index 0000000..106ffc5
--- /dev/null
+++ b/tests/Box/bhz03widening1.cc
@@ -0,0 +1,79 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  typedef Pointset_Powerset<TBox> PSet;
+
+  TBox p(2);
+  TBox q(2);
+  TBox r(2);
+  TBox s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  PSet P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  PSet Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  using namespace IO_Operators;
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  PSet old_P = P;
+  typedef void (TBox::*Widening_Member)(const TBox&, unsigned*);
+  Widening_Member wm = &TBox::CC76_widening_assign;
+  // FIXME: provide a widening certificate for CC76.
+  P.BHZ03_widening_assign<H79_Certificate>(Q, widen_fun_ref(wm));
+
+  nout << "P.BHZ03(Q, CC76)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/bounded1.cc b/tests/Box/bounded1.cc
new file mode 100644
index 0000000..dabdf00
--- /dev/null
+++ b/tests/Box/bounded1.cc
@@ -0,0 +1,97 @@
+/* Test Box::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  // This is a non-bounded box.
+  TBox box(2);
+  box.add_constraint(x >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  return !box.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded box (it is a square);
+  TBox box(2);
+  box.add_constraint(x >= 2);
+  box.add_constraint(y >= 2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+bool
+test03() {
+  // This is a universal, zero-dimensional box.
+  TBox box;
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+bool
+test04() {
+  // This is an empty, zero-dimensional box.
+  TBox box;
+  box.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+bool
+test05() {
+  // This is an empty box.
+  TBox box(4, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  return box.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Box/boundedaffineimage1.cc b/tests/Box/boundedaffineimage1.cc
new file mode 100644
index 0000000..4ee40a2
--- /dev/null
+++ b/tests/Box/boundedaffineimage1.cc
@@ -0,0 +1,516 @@
+/* Test Box::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Affine image variable is neither expression, denominator 1.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, y, y);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(x, y, y) ***");
+
+  return ok;
+}
+
+// Affine image variable is in neither ub_expr nor lb_expr, negative
+// denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(B, "
+                        "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+// Affine image variable is in lb_expr but not ub_expr, negative denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(C, 3*D - E, 2*C + 1, -5);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(C, "
+                        "3*D - E, 2*C + 1, -5) ***");
+
+  return ok;
+}
+
+// Affine image variable is in ub_expr but not lb_expr, positive denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(B, -B - 2, 7*D - E + 5, 3);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(B, "
+                        "-B - 2, 7*D - E + 5, 3) ***");
+
+  return ok;
+}
+
+// Affine image variable is in ub_expr but not lb_expr, negative denominator.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable F(5);
+
+  TBox box(6);
+  box.add_constraint(A <= 4);
+  box.add_constraint(A >= -6);
+  box.add_constraint(B == 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(A, -A - 3, B - C + 6*D + F, -1);
+
+  Rational_Box known_result(6);
+  known_result.add_constraint(A >= -3);
+  known_result.add_constraint(B == 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(A, "
+                        "-A - 3, B - C + 6*D + F, -1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, -2*x+y+1, -2*x+y+1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, negative denominator.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+  ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(x >= -3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+  print_constraints(ph,
+                    "*** ph.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, lower is open.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x > 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x < 3);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y >= -1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum, negative denominator.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(3*x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  box.bounded_affine_image(x, x + 4, x + 4, -1);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(3*x >= -14);
+
+  bool ok = check_result(box, known_result, "3.18e-7", "3.18e-7", "3.18e-7");
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image("
+                    "x, x + 4, x + 4, -1) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value (which is open) but the lb_expr has no minimum.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(3*x < 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  box.bounded_affine_image(x, x + 4, x + 4);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(3*x < 14);
+
+  bool ok = check_result(box, known_result, "3.18e-7", "3.18e-7", "3.18e-7");
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, x + 4, x + 4) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is closed
+// and the affine image has a denominator > 1.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(y, 2*x, 2*x, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_image(y, 2*x, 2*x, 2) ***");
+
+  return ok;
+}
+
+// Affine image variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is not closed
+// and the affine image has a denominator > 1.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x < 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.bounded_affine_image(x, 2*x - 2, 2*x - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x < 1);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, 2*x-2, 2*x-2, 2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_image(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_image(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    box.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::bounded_affine_image(v, lb_expr, ub_epxr, d): it is illegal to
+    // apply the method to a variable that is not in the space of
+    // the polyhedron.
+    box.bounded_affine_image(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+
+  TBox box(1);
+
+  print_constraints(box, "*** box ***");
+  box.bounded_affine_image(x, 3*x, 3*x);
+
+  Rational_Box known_result(1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.bounded_affine_image(x, 3*x, 3*x) ***");
+
+  return ok;
+
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test09, TBox);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test10, TBox);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Box/boundedaffinepreimage1.cc b/tests/Box/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..ce740dc
--- /dev/null
+++ b/tests/Box/boundedaffinepreimage1.cc
@@ -0,0 +1,519 @@
+/* Test Box::bounded_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Affine image variable is neither expression, denominator 1.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(x, y, y+1);
+  ph.bounded_affine_preimage(x, y, y+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(x, y, y+1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph.bounded_affine_preimage("
+                    "x, y, y+1)) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in the lb_expr but not the ub_expr;
+// negative denominator.
+
+// Illustrates where, when the corresponding polyhedron (still with
+// non-relational constraints) is used to compute the
+// transformation, we get more precise results.  This is due to the
+// relational constraint obtained from comparing the lhs expression
+// with the rhs expression.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(B <= 0);
+  box.add_constraint(B >= -2);
+  box.add_constraint(C <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+  ph.bounded_affine_preimage(B, 3*E - 5*D + A - 3*B, 4*A -2*C + 3, -3);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(C <= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.bounded_affine_preimage(B, "
+                    "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph.bounded_affine_preimage(B, "
+                    "3*E - 5*D + A - 3*B, 4*A - 2*C + 3, -3)) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in lb_expr but not ub_expr, negative
+// denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C == 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(C, 3*D - E, 2*C + 1, -5);
+  ph.bounded_affine_preimage(C, 3*D - E, 2*C + 1, -5);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(C, "
+                    "3*D - E, 2*C + 1, -5) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage(C, "
+                    "3*D - E, 2*C + 1, -5) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in ub_expr but not lb_expr, positive
+// denominator and negative coefficient for the transformed variable.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 15);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(B, -B - 2, 7*D - E + 5, 3);
+  ph.bounded_affine_preimage(B, -B - 2, 7*D - E + 5, 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(B, "
+                    "-B - 2, 7*D - E + 5, 3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage(B, "
+                    "-B - 2, 7*D - E + 5, 3) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in ub_expr but not lb_expr, negative
+// denominator and negative coefficient for the transformed variable.
+bool
+test05() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A <= 4);
+  box.add_constraint(A >= -6);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(A, A - 3, A, -1);
+  ph.bounded_affine_preimage(A, A - 3, A, -1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.bounded_affine_preimage(A, "
+                    "A - 3, A, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage(A, "
+                    "A - 3, A, -1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, and negative coefficient for the
+// transformed variable.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.bounded_affine_preimage(x, -2*x + 1, -2*x + 2);
+  ph.bounded_affine_preimage(x, -2*x + 1, -2*x + 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -2*x+1, -2*x+2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -2*x+1, -2*x+2) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, negative denominator.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y <= 2);
+  box.add_constraint(y >= -1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, x + y, x + y, -1);
+  ph.bounded_affine_preimage(x, x + y, x + y, -1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr and
+// lb_expr are bounded by the box, lower bound is open.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(x > 0);
+  box.add_constraint(y <= 3);
+  box.add_constraint(y >= -8);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, -2*x + y, -2*x + 2*y + 1);
+  ph.bounded_affine_preimage(x, -2*x + y, -2*x + 2*y + 1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -2*x+y, -2*x+2*y+1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -2*x+y, -2*x+2*y+1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum, negative denominator.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(10*x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, x + 5, x + 4, -1);
+  ph.bounded_affine_preimage(x, x + 5, x + 4, -1);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "2.84e-07", "2.84e-07", "2.84e-07");
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, x + 5, x + 4, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, x + 5, x + 4, -1) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has
+// a maximum value (which is open) but the lb_expr has no minimum
+// Negative coefficient for the transformed variable and negative
+// denominator.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x < 2);
+  box.add_constraint(x > 0);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, -x + 5, -x + 4, -1);
+  ph.bounded_affine_preimage(x, -x + 5, -x + 4, -1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "x, -x + 5, x + 4, -1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, -x + 5, x + 4, -1) ***");
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is closed
+// and the affine preimage has a denominator > 1.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+  box.bounded_affine_preimage(y, 2*x, 2*x, 2);
+  ph.bounded_affine_preimage(y, 2*x, 2*x, 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.bounded_affine_preimage("
+                    "y, 2*x, 2*x, 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "y, 2*x, 2*x, 2) ***");
+
+  return ok;
+}
+
+// Affine preimage variable is in both expressions, the ub_expr has a
+// maximum value but the lb_expr has no minimum. Box is not closed
+// and the affine preimage has a denominator > 1.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x < 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+  box.bounded_affine_preimage(x, 2*x - 2, 5*x + 2, 2);
+  ph.bounded_affine_preimage(x, 2*x - 2, 5*x + 2, 2);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "3.98e-08", "3.98e-08", "3.98e-08");
+
+  print_constraints(box,
+                    "*** box .bounded_affine_preimage("
+                    "x, 2*x-2, 5*x+2, 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).bounded_affine_preimage("
+                    "x, 2*x-2, 5*x+2, 2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is
+    // illegal to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_preimage(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the box's space dimension.
+    box.bounded_affine_preimage(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_expr, d): it is illegal
+    // to apply it to a expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    box.bounded_affine_preimage(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+  box.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the method
+    // Box::bounded_affine_preimage(v, lb_expr, ub_epxr, d): it is illegal to
+    // apply the method to a variable that is not in the space of
+    // the polyhedron.
+    box.bounded_affine_preimage(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test09, TBox);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/cc76narrowing1.cc b/tests/Box/cc76narrowing1.cc
new file mode 100644
index 0000000..0d87fc1
--- /dev/null
+++ b/tests/Box/cc76narrowing1.cc
@@ -0,0 +1,207 @@
+/* Test Box::CC76_narrowing_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 1);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(-y <= 6);
+
+  TBox box2(3);
+  box2.add_constraint(-x <= 3);
+  box2.add_constraint(y <= 2);
+  box2.add_constraint(-y <= 5);
+  box2.add_constraint(x <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(-x <= 3);
+  known_result.add_constraint(-y <= 6);
+  known_result.add_constraint(y <= 7);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  box1.add_constraint(z <= 1);
+
+  TBox box2(4);
+  box2.add_constraint(-y <= 3);
+  box2.add_constraint(-x <= 2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(z <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(z <= 1);
+  known_result.add_constraint(-y <= 3);
+  known_result.add_constraint(-x <= 2);
+  known_result.add_constraint(x <= 3);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  TBox box2(3);
+
+  box1.add_constraint(z <= 1);
+  Rational_Box known_result(3, EMPTY);
+
+  box2.add_constraint(-y <= 3);
+  box2.add_constraint(x >= 4);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(z <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(z <= 1);
+  box1.add_constraint(z >= 3);
+
+  TBox box2(3);
+  box2.add_constraint(-y <= 3);
+  box2.add_constraint(x >= 4);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(z <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box1;
+  TBox box2(0, EMPTY);
+  Rational_Box known_result(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.CC76_narrowing_assign(box1);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.CC76_narrowing_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable y(1);
+
+  TBox box1(1);
+  TBox box2(2);
+
+  Constraint_System cs;
+  cs.insert(y >= 6);
+
+  try {
+    // This is an invalid use of the method
+    // Box::CC76_narrowing_assign(box2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    box2.CC76_narrowing_assign(box1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/cc76widening.cc b/tests/Box/cc76widening.cc
new file mode 100644
index 0000000..b125612
--- /dev/null
+++ b/tests/Box/cc76widening.cc
@@ -0,0 +1,120 @@
+/* Test Box::CC76_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(2);
+  box2.add_constraint(-x <= 3);
+  box2.add_constraint(x <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.CC76_widening_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(2);
+  box2.add_constraint(-x <= 3);
+  box2.add_constraint(x <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.widening_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  typedef TBox::interval_type::boundary_type tbt;
+  // No stop point indeed.
+  tbt stop_points;
+
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 1);
+  box1.add_constraint(x <= 4);
+
+  TBox box2(2);
+  box2.add_constraint(x >= 3);
+  box2.add_constraint(x <= 4);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.CC76_widening_assign(box2, &stop_points, &stop_points);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 4);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.CC76_widening_assign(box2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/concatenate1.cc b/tests/Box/concatenate1.cc
new file mode 100644
index 0000000..45e7aa8
--- /dev/null
+++ b/tests/Box/concatenate1.cc
@@ -0,0 +1,225 @@
+/* Test Box::concatenate_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  // Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  // Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TBox box1(6);
+  box1.add_constraint(x3 <= 2);
+  box1.add_constraint(x5 <= 3);
+
+  TBox box2(3);
+  box2.add_constraint(x3 <= 7);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(9);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 3);
+
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.concatenate_assign(box1);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.concatenate_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x <= 0);
+  cs.insert(y == 3);
+  cs.insert(3*x - 3*y <= 5);
+
+  TBox box1(2);
+  box1.refine_with_constraints(cs);
+
+  TBox box2(0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(y == 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(C >= 0);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 0);
+  box2.add_constraint(A <= 1);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(E >= 0);
+  known_result.add_constraint(E <= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 3);
+
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+/* Concatenate an empty box to a universe */
+/*
+   This shows a bug in either concatenate_assign() or OK()
+   When executing box1.concatenate_assign(box2),
+   the assertion `box1.OK()' fails.
+*/
+bool
+test06() {
+  Variable x(0);
+
+  TBox box1(1);
+
+  TBox box2(1);
+  box2.add_constraint(x <= 0);
+  box2.add_constraint(x >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.OK();
+  box2.OK();
+
+  box1.concatenate_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.concatenate_assign(box2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/congruences1.cc b/tests/Box/congruences1.cc
new file mode 100644
index 0000000..861779f
--- /dev/null
+++ b/tests/Box/congruences1.cc
@@ -0,0 +1,378 @@
+/* Test Box::Box(const Congruence_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe Box constructed from empty congruences
+bool
+test01() {
+  Congruence_System cgs;
+  TBox box(cgs);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from empty congruences and add_congruences()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence_System cgs;
+  cgs.insert(0*D %= 0);
+  TBox box(cgs);
+
+  Rational_Box known_result(4);
+  known_result.add_congruences(cgs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((C %= 7) / 0);
+
+  TBox box(cgs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(C == 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_recycled_congruences()
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+
+  TBox box(3);
+  box.add_recycled_congruences(cgs);
+  bool ok = !box.is_empty();
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences; congruences().
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 7) / 0);
+
+  TBox box(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  // This inconsistent equality is not ignored when refining.
+  cgs.insert((A + B %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(cgs.space_dimension(), UNIVERSE);
+  box.refine_with_congruences(cgs);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_congruences() for inconsistent equality congruences
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A %= 0) / 0);
+
+  TBox box(3);
+  box.add_congruences(cgs);
+  bool ok = box.is_empty();
+
+  Rational_Box known_result(3, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// add_congruence()
+bool
+test08() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_congruence((A %= 7) / 0);
+  bool ok = !box.is_empty();
+  box.add_congruence((A %= 2) / 0);
+  ok = ok && box.is_empty();
+
+  Rational_Box known_result(1, EMPTY);
+
+  ok = ok && check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Non-empty Box; minimized_congruences().
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((C %= 3) / 0);
+
+  TBox box(cgs);
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(C == 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Empty Box; minimized_congruences().
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A %= 0) / 0);
+
+  TBox box(3);
+  box.add_congruences(cgs);
+
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension universe; congruences()
+bool
+test11() {
+  TBox box(0);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension empty; congruences()
+bool
+test12() {
+  TBox box(0, EMPTY);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(2);
+
+  try {
+    box1.add_congruence((x %= 0) / 0);
+    // This is an invalid use of method
+    // Box::add_congruence: it is illegal
+    // to add a congruence with bigger dimension.
+    box1.add_congruence(y - x + z %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_congruences(cs): it is illegal to
+    // add a system of congruences that is dimensional incompatible
+    // with the box.
+    Congruence_System cgs;
+    cgs.insert(x - y %= 0);
+    box.add_congruences(cgs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::add_congruence(c): it is illegal to insert a
+    // congruence that contains a variable that is not in the space
+    // of the box.
+    box.add_congruence((y %= 0) / 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/constrains1.cc b/tests/Box/constrains1.cc
new file mode 100644
index 0000000..ce7bee4
--- /dev/null
+++ b/tests/Box/constrains1.cc
@@ -0,0 +1,188 @@
+/* Test Box::constrains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)               \
+  if (!pred) {                                  \
+    nout << "!" #pred << endl;                  \
+    ok = false;                                 \
+  }
+
+#define TEST_PREDICATE_FALSE(pred)              \
+  if (pred) {                                   \
+    nout << #pred << endl;                      \
+    ok = false;                                 \
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_FALSE(box.constrains(B));
+
+  box.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  box = TBox(2);
+  box.add_constraint(A == 2);
+  box.add_constraint(B == 4);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  box = TBox(2);
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_FALSE(box.constrains(B));
+
+  box.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_FALSE(box.constrains(B));
+
+  box.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  box.add_constraint(A <= 2);
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+  TEST_PREDICATE_TRUE(box.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TBox box(0);
+  box.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) box.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 0);
+  box.unconstrain(A);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(box.constrains(A));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(C >= 1);
+  box.add_constraint(C <= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(box.constrains(C));
+  TEST_PREDICATE_TRUE(box.constrains(B));
+  TEST_PREDICATE_TRUE(box.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/constraints1.cc b/tests/Box/constraints1.cc
new file mode 100644
index 0000000..49ae495
--- /dev/null
+++ b/tests/Box/constraints1.cc
@@ -0,0 +1,162 @@
+/* Test Box::constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box1(0, EMPTY);
+
+  Rational_Box known_result(box1);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1(0, UNIVERSE);
+
+  Rational_Box known_result(box1);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= 0);
+
+  Rational_Box known_result(box1);
+
+  box1.contains(box1);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= 0);
+
+  Constraint_System cs = box1.constraints();
+  TBox box2(cs);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(box1);
+
+  bool ok = check_result(box2, known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  Constraint_System cs(Linear_Expression(0) == -1);
+
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs);
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  Constraint_System cs(Linear_Expression(0) == -1);
+  cs.insert(A >= 0);
+
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/contains1.cc b/tests/Box/contains1.cc
new file mode 100644
index 0000000..0e09726
--- /dev/null
+++ b/tests/Box/contains1.cc
@@ -0,0 +1,177 @@
+/* Test Box::contains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 1);
+  box1.add_constraint(x >= 7);
+
+  // The Box is empty, because it has got a negative cycle.
+  TBox box2(3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = !box1.contains(box2);
+
+  nout << "*** !box1.contains(box2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1;
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box1(0, EMPTY);
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***"
+       << endl
+       << (ok ? "true" : "false")
+       << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+
+  TBox box2(2);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    box1.contains(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(D >= 0);
+  cs.insert(C >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  TBox box1(cs);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(cs);
+
+  print_constraints(box2, "*** box2 ***");
+
+  bool contained = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(C <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(3);
+  box2.add_constraint(A == 0);
+  box2.add_constraint(C <= 0);
+
+  print_constraints(box2, "*** box2 ***");
+
+  bool ok = box1.contains(box2);
+
+  nout << "*** box1.contains(box2) ***" << endl;
+  nout << (ok ? "true" : "false") << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/containsintegerpoint1.cc b/tests/Box/containsintegerpoint1.cc
new file mode 100644
index 0000000..bb87bda
--- /dev/null
+++ b/tests/Box/containsintegerpoint1.cc
@@ -0,0 +1,220 @@
+/* Test Box::contains_integer_point().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x < 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(8*z >= 7);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x < 1);
+
+  TBox box(1);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+  return !contains;
+}
+
+bool
+test05() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(2*x < 1);
+
+  TBox box(1);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= -7);
+
+  TBox box(1);
+  box.add_constraints(cs);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test07() {
+  TBox box(1);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test08() {
+  Variable x(0);
+
+  TBox box(1);
+  box.add_constraint(x >= 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test09() {
+  Variable x(0);
+
+  TBox box(1);
+  box.add_constraint(x > 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool contains = box.contains_integer_point();
+
+  nout << "box.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/difference1.cc b/tests/Box/difference1.cc
new file mode 100644
index 0000000..208ac5c
--- /dev/null
+++ b/tests/Box/difference1.cc
@@ -0,0 +1,514 @@
+/* Test Box::difference_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Difference of an empty with a non-empty box.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= -2);
+  print_constraints(box1, "*** box1 ***");
+  box1.add_constraint(B == 0);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 0);
+  box2.add_constraint(A <= 2);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Difference of a non-empty with an empty box.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 2);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** ph2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test03() {
+  TBox box1;
+  TBox box2;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.difference_assign(box2);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-4) >= 0);
+  Rational_Box known_result(cs);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Intersecting rectangles; difference leaves the original box unchanged.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y <= 5);
+  box1.add_constraint(y >= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(x >= 1);
+  box2.add_constraint(y <= 4);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 5);
+  known_result.add_constraint(y >= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Both are rectangles, second strictly included in first;
+// so the first box is unchanged.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 8);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(y >= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(x >= 1);
+  box2.add_constraint(y <= 0);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Both rectangles; original box unchanged.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 8);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(y >= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 9);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(y <= 8);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Unbounded boxes in 3D; original box is unchanged.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 8);
+  box1.add_constraint(y <= 7);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(z <= 2);
+
+  TBox box2(3);
+  box2.add_constraint(x == 8);
+  box2.add_constraint(y <= 2);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 8);
+  known_result.add_constraint(y <= 7);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(z <= 2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+// Both closed rectangles; the difference makes the first strictly smaller.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 2);
+  box2.add_constraint(A <= 4);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Both rectangles; difference removes an open section of the original box.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A > 2);
+  box2.add_constraint(A <= 8);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Both rectangles; difference removes a closed section of the original box.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 2);
+  box2.add_constraint(A <= 8);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= -2);
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** ph2 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+// Find difference of a rectangle and a boundary edge.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 0);
+  box1.add_constraint(B <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A == 4);
+  box2.add_constraint(B >= 0);
+  box2.add_constraint(B <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  box1.difference_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Different number of dimensions.
+bool
+test13() {
+  TBox box1(3);
+  TBox box2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Box::difference_assign(box2): it is impossible to apply
+    // this method to two boxes of different dimensions.
+    box1.difference_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Difference of 2 closed half spaces, where the second is
+// strictly contained in the first.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(3);
+  box1.refine_with_constraint(A >= 0);
+  TBox box2(3);
+  box2.refine_with_constraint(A >= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_box(3);
+  known_box.refine_with_constraint(A >= 0);
+  known_box.refine_with_constraint(A < 3);
+
+  bool ok = check_result(box1, known_box);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test15() {
+  Variable A(0);
+
+  TBox box1(1);
+  box1.refine_with_constraint(A == A);
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(1);
+  box2.refine_with_constraint(A == A);
+
+  print_constraints(box1, "*** box1 ***");
+
+  box1.difference_assign(box2);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** after box1.difference_assign(box2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/discrete1.cc b/tests/Box/discrete1.cc
new file mode 100644
index 0000000..f69b0b2
--- /dev/null
+++ b/tests/Box/discrete1.cc
@@ -0,0 +1,204 @@
+/* Test Box::is_discrete().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_discrete();
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A <= 5);
+  box.add_constraint(A == 3);
+  box.add_constraint(B == 0);
+  box.add_constraint(C <= 2);
+  box.add_constraint(D == -7);
+  box.add_constraint(E == 1);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_discrete();
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B <= -5);
+  box.add_constraint(A >= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_discrete();
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return !ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A == 1);
+  box.add_constraint(E == 1);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return !ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(7);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B == 2);
+  box.add_constraint(A >= 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_discrete();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/Box/disjoint1.cc b/tests/Box/disjoint1.cc
new file mode 100644
index 0000000..44861d2
--- /dev/null
+++ b/tests/Box/disjoint1.cc
@@ -0,0 +1,189 @@
+/* Test Box::is_disjoint_from(const Box& y).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(B == 0);
+  box1.add_constraint(A >= 1);
+  box1.add_constraint(A <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(A == 0);
+  box2.add_constraint(B >= 1);
+  box2.add_constraint(B <= 2);
+
+  bool ok = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(3);
+
+  TBox box2(3);
+  box2.add_constraint(A <= 3);
+  box2.add_constraint(B >= -5);
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return !disjoint;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+
+  Constraint_System cs1;
+  cs1.insert(x1 >= -4);
+
+  TBox box1(2);
+  box1.add_constraints(cs1);
+
+  print_constraints(box1, "*** box1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(2*x1 >= 1);
+  cs2.insert(2*x1 <= 3);
+  cs2.insert(6*x2 <= 1);
+  cs2.insert(3*x2 >= -2);
+
+  TBox box2(2);
+  box2.add_constraints(cs2);
+
+  print_constraints(box2, "*** box2 ***");
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  return !disjoint;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+
+  TBox box2(3);
+
+  try {
+    // This is an invalid use of method
+    // Box::is_disjoint_from(box2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    box1.is_disjoint_from(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2, EMPTY);
+
+  TBox box2(2);
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return disjoint;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 0);
+  box1.add_constraint(B >= -4);
+
+  TBox box2(2, EMPTY);
+
+  bool disjoint = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return disjoint;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TBox box1(2);
+  box1.add_constraint(A == 0);
+
+  TBox box2(2);
+  box2.add_constraint(A == 1);
+
+  bool ok = box1.is_disjoint_from(box2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Box/empty1.cc b/tests/Box/empty1.cc
new file mode 100644
index 0000000..dd60569
--- /dev/null
+++ b/tests/Box/empty1.cc
@@ -0,0 +1,226 @@
+/* Different ways of creating an empty Box.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  TBox box2(4);
+
+  box1.add_constraint(-x <= 4);
+  box1.add_constraint(y <= 0);
+  box1.add_constraint(z >= 0);
+  box1.add_constraint(y >= 5);
+
+  bool empty1 = box1.is_empty();
+
+  nout << "*** box1.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false ") << endl;
+
+  box2.add_constraint(-x <= 4);
+  box2.add_constraint(y <= 0);
+  box2.add_constraint(z >= 0);
+
+  bool empty2 = box2.is_empty();
+
+  nout << "*** box2.is_empty() ***" << endl;
+  nout << (empty2 ? "true" : "false") << endl;
+
+  return empty1 && !empty2;
+
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  TBox box2(4);
+
+  box1.add_constraint(-5*x <= 2);
+  box1.add_constraint(6*y <= -7);
+  box1.add_constraint(6*y >= -5);
+
+  bool empty1 = box1.is_empty();
+
+  print_constraints(box1, "*** box1 ***");
+  nout << "*** box1.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  box2.add_constraint(-5*x <= 7);
+  box2.add_constraint(6*y <= 1);
+  box2.add_constraint(-6*y <= 2);
+  box2.add_constraint(z <= 1);
+
+  bool empty2 = box2.is_empty();
+
+  print_constraints(box2, "*** box2 ***");
+  nout << "*** box2.is_empty() ***" << endl;
+  nout << (empty2 ? "true" : "false") << endl;
+
+  return empty1 && !empty2;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  // Variable x6(5);
+
+  TBox box1(6);
+  TBox box2(6);
+
+  box1.add_constraint(x1 <= 3);
+  box1.add_constraint(x4 <= 3);
+  box1.add_constraint(x2 <= 0);
+  box1.add_constraint(x3 <= -2);
+  box1.add_constraint(x5 <= 2);
+  box1.add_constraint(-x2 <= 0);
+  box1.add_constraint(x3 <= 5);
+  box1.add_constraint(x4 <= -6);
+  box1.add_constraint(x1 <= 5);
+  box1.add_constraint(3*x5 <= 2);
+  box1.add_constraint(-x5 <= -5);
+  box1.add_constraint(-x5 <= 7);
+
+  bool empty1 = box1.is_empty();
+
+  nout << "*** box1.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  box2.add_constraint(x1 <= 3);
+  box2.add_constraint(x4 <= 3);
+  box2.add_constraint(x2 <= 0);
+  box2.add_constraint(x3 <= 2);
+  box2.add_constraint(x5 <= 2);
+  box2.add_constraint(-x2 <= 0);
+  box2.add_constraint(x3 <= 5);
+  box2.add_constraint(x4 <= 6);
+  box2.add_constraint(x1 <= 5);
+  box2.add_constraint(x5 <= 2);
+  box2.add_constraint(-x5 <= 5);
+  box2.add_constraint(x3 <= 7);
+
+  bool empty2 = box2.is_empty();
+
+  nout << "*** box2.is_empty() ***" << endl;
+  nout << (empty2 ? "true" : "false") << endl;
+
+  return empty1 && !empty2;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+
+  box.add_constraint(A == 0);
+  box.add_constraint(C >= 0);
+  box.add_constraint(B >= 1);
+
+  bool empty = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+  nout << "*** box.is_empty() ***"
+       << endl
+       << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBox box(5);
+
+  Coefficient a;
+  if (std::numeric_limits<Coefficient>::is_bounded)
+    a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+  else
+    a = 1300000000;
+
+  box.add_constraint(2*x1 >= -a);
+  box.add_constraint(3*x2 >= -a);
+  box.add_constraint(5*x3 <= a);
+  box.add_constraint(7*x4 <= a);
+  box.add_constraint(11*x5 <= a);
+
+  print_constraints(box, "*** box ***");
+
+  bool empty = box.is_empty();
+
+  nout << "*** box.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(3*x >= 7);
+  box.add_constraint(3*x <= 7);
+  box.add_constraint(2*y > 1);
+  box.add_constraint(2*y <= 1);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
+
diff --git a/tests/Box/equality1.cc b/tests/Box/equality1.cc
new file mode 100644
index 0000000..df59182
--- /dev/null
+++ b/tests/Box/equality1.cc
@@ -0,0 +1,131 @@
+/* Test Box::operator==().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  TBox box2(2);
+
+  box1.add_constraint(x == 3);
+
+  box2.add_constraint(x == 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = false;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box1(0, EMPTY);
+  TBox box2(0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = false;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box1(0);
+  TBox box2(0, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = false;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A >= 7);
+  box1.add_constraint(B <= -2);
+  box1.add_constraint(A >= 9);
+
+  TBox box2(2);
+  box2.add_constraint(A >= 9);
+  box2.add_constraint(B <= -2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = true;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A <= 1);
+  box1.add_constraint(A >= 7);
+
+  TBox box2(2);
+  box2.add_constraint(B <= 5);
+  box2.add_constraint(B >= 10);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  bool known_result = true;
+  bool ok = ((box1 == box2) == known_result);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Box/expandspacedim1.cc b/tests/Box/expandspacedim1.cc
new file mode 100644
index 0000000..e11ad1a
--- /dev/null
+++ b/tests/Box/expandspacedim1.cc
@@ -0,0 +1,232 @@
+/* Test Box::expand_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBox box(3);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+
+  TBox known_result(4);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TBox box(3, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(B, 1);
+
+  TBox known_result(4, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 0);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2, EMPTY);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+
+  TBox known_result(3, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+
+  TBox known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 2);
+
+  TBox known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(C == 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(A, 1);
+  box.expand_space_dimension(C, 1);
+
+  TBox known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box,
+                    "*** box.expand_space_dimension(A, 1);"
+                    " box.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2, EMPTY);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.expand_space_dimension(B, 1);
+
+  TBox known_result(3, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/foldspacedims1.cc b/tests/Box/foldspacedims1.cc
new file mode 100644
index 0000000..a6cb5ba
--- /dev/null
+++ b/tests/Box/foldspacedims1.cc
@@ -0,0 +1,269 @@
+/* Test Box::fold_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(3, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(2, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(3);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B >= 7);
+  box.add_constraint(B <= 12);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  box.fold_space_dimensions(to_fold, B);
+
+  TBox known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B >= 7);
+  box.add_constraint(B <= 12);
+  box.add_constraint(C == 15);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  box.fold_space_dimensions(to_fold, C);
+
+  TBox known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {A, B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A >= 0);
+  box.add_constraint(C >= 0);
+  box.add_constraint(D >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  box.fold_space_dimensions(to_fold, A);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {C, D} into A ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B == 0);
+  box.add_constraint(C >= 0);
+  box.add_constraint(D >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  box.fold_space_dimensions(to_fold, C);
+
+  TBox known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= -1);
+  box.add_constraint(C >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+
+  box.fold_space_dimensions(to_fold, A);
+
+  TBox known_result(2, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/frequency1.cc b/tests/Box/frequency1.cc
new file mode 100644
index 0000000..7ab5a4e
--- /dev/null
+++ b/tests/Box/frequency1.cc
@@ -0,0 +1,231 @@
+/* Test Box::frequency().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty bd shape.
+bool
+test01() {
+  Variable A(0);
+
+  TBox box1(1);
+
+  TBox box2(1, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (!box1.frequency(A, num1, den1, valn1, vald1)
+             && !box2.frequency(A, num2, den2, valn2, vald2));
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+  TBox box1(0);
+
+  TBox box2(0, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (box1.frequency(Linear_Expression(3), num1, den1, valn1, vald1)
+             && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+             && !box2.frequency(Linear_Expression(3), num2, den2, valn2, vald2));
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A == 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (box.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!box.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B >= 5);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!box.frequency(Linear_Expression(B), num, den, valn, vald));
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B == 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (box.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == -1 && vald == 2);
+  print_constraints(box, "*** box ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!box.frequency(Linear_Expression(A - B), num, den, valn, vald));
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(2*B == -1);
+  box.add_constraint(2*C == 1);
+  box.add_constraint(B <= 4);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (box.frequency(Linear_Expression(A - B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 3 && vald == 1);
+  print_constraints(box, "*** box ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+// Non-relational test of an empty box in 1-dimension.
+bool
+test09() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A <= 0);
+  box.add_constraint(A >= 1);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!box.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/frombdshape1.cc b/tests/Box/frombdshape1.cc
new file mode 100644
index 0000000..9f28610
--- /dev/null
+++ b/tests/Box/frombdshape1.cc
@@ -0,0 +1,88 @@
+/* Test Box::Box(const BD_Shape&, Complexity_Class).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x <= 1);
+  bd.add_constraint(x - y <= 2);
+  bd.add_constraint(y - x <= 7);
+
+  print_constraints(bd, "*** bd ***");
+
+  TBox box(bd, SIMPLEX_COMPLEXITY);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bd(2);
+  bd.add_constraint(x - y <= 2);
+  bd.add_constraint(-x <= 3);
+  bd.add_constraint(x <= 0);
+  bd.add_constraint(y - x <= 2);
+
+  print_constraints(bd, "*** bd ***");
+
+  TBox box(bd, SIMPLEX_COMPLEXITY);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x >= -3);
+  known_result.add_constraint(x <= 0);
+  known_result.add_constraint(y >= -5);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/frombox1.cc b/tests/Box/frombox1.cc
new file mode 100644
index 0000000..742c36a
--- /dev/null
+++ b/tests/Box/frombox1.cc
@@ -0,0 +1,161 @@
+/* Test Box<Interval>::Box(const Box<Other_Interval>&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox src(0, EMPTY);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox src(0, UNIVERSE);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox src(24, EMPTY);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBox src(24, UNIVERSE);
+  TBox dst(src);
+
+  bool ok = (dst == src);
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  const int DIM = 10;
+  typedef Checked_Number<mpq_class, Checked_Number_Transparent_Policy<mpq_class> > Q;
+  Rational_Box src(DIM, UNIVERSE);
+  Q k;
+  Q a;
+  k = 2;
+  sqrt_assign(a, k);
+  Q y = a;
+  k = 1;
+  y -= k;
+  // Now y ~= sqrt(2) - 1.
+  k = -4;
+  a *= k;
+  k = 6;
+  a += k;
+  // Now a ~= 6 - 4*sqrt(2).
+  Q s;
+  Q m;
+  Q d;
+  for (int n = 0; n < DIM; ++n) {
+    s = y;
+    s *= s;
+    s *= s;
+    neg_assign(s, s);
+    // Now s ~= -y^4.
+    k = 1;
+    s += k;
+    sqrt_assign(s, s);
+    sqrt_assign(s, s);
+    // Now s ~= sqrt(sqrt(1-y^4)).
+    m = k;
+    m -= s;
+    // Now m ~= 1 - sqrt(sqrt(1-y^4)).
+    d = k;
+    d += s;
+    // Now d ~= 1 + sqrt(sqrt(1-y^4)).
+    y = m/d;
+    // Now y ~= (1 - sqrt(sqrt(1-y^4)))/(1 + sqrt(sqrt(1-y^4))).
+    s = y;
+    s += k;
+    s *= s;
+    s *= s;
+    // Now s ~= (1 + y)^4.
+    a *= s;
+    s = y;
+    s *= s;
+    s += y;
+    s += k;
+    s *= y;
+    // Now s ~= y*(1 + y + y^2).
+    k = 1ULL << (2*n+3);
+    s *= k;
+    a -= s;
+    m = 1;
+    m /= a;
+    Coefficient num;
+    Coefficient den;
+    numer_denom(m, num, den);
+    src.add_constraint(den*Variable(n) == num);
+  }
+
+  TBox dst(src);
+
+  bool ok = check_result(dst, src, "2.39e-6", "5.51e-7", "1.51e-7");
+
+  print_constraints(src, "*** src ***");
+  print_constraints(dst, "*** dst ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F64(test05);
+END_MAIN
diff --git a/tests/Box/fromgensys1.cc b/tests/Box/fromgensys1.cc
new file mode 100644
index 0000000..44df261
--- /dev/null
+++ b/tests/Box/fromgensys1.cc
@@ -0,0 +1,182 @@
+/* Test Box::Box(const Generator_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Generator_System gs;
+  TBox box(gs);
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(closure_point(V));
+
+  try {
+    // It is illegal to build a Box starting from a non-empty
+    // generator system having no points.
+    TBox box(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(ray(V));
+
+  try {
+    // It is illegal to build a Box starting from a non-empty
+    // generator system having no points.
+    TBox box(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(ray(A + B));
+  gs.insert(point(1*A + 2*B + 3*C + 4*D));
+  gs.insert(point(2*A + 3*B + 4*C + 5*D));
+  TBox box(gs);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 2*C);
+  ph.add_constraint(C >= 3*D);
+  ph.add_constraint(D >= 4);
+  ph.add_constraint(A-D <= 50);
+
+  TBox box(ph.generators());
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A >= 24);
+  known_result.add_constraint(A <= 60);
+  known_result.add_constraint(B >= 24);
+  known_result.add_constraint(B <= 60);
+  known_result.add_constraint(C >= 12);
+  known_result.add_constraint(C <= 30);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 10);
+
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph(4);
+  ph.add_constraint(A == 7);
+  ph.add_constraint(B < 3);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(C < 7);
+
+  TBox box(ph.generators());
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B < 3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C < 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/fromgrid1.cc b/tests/Box/fromgrid1.cc
new file mode 100644
index 0000000..3aea0f3
--- /dev/null
+++ b/tests/Box/fromgrid1.cc
@@ -0,0 +1,512 @@
+/* Test Box::Box(const Grid&, Complexity_Class).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Minimized rectilinear grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_point(3*A + B));
+  gr.add_grid_generator(grid_point(3*A + 3*B));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(2, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(  A +   B));
+  gr.add_grid_generator(grid_point(2*A + 3*B));
+  gr.add_grid_generator(grid_point(  A + 4*B));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(2, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point(  A + 2*B, 2));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(2, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Grid containing a line.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A + 2*B));
+  gr.add_grid_generator(grid_point(C, 2));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+  Grid gr(3, UNIVERSE);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(7*A == 16);
+  known_box.add_constraint(7*B == 6);
+  known_box.add_constraint(7*C == -6);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+  Grid gr1(3, EMPTY);
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3, EMPTY);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// A grid with redundant generators.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(2*A));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(C == 0);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A + 2*C %= 0) / 2);
+  gr.add_congruence((A %= 0) / 5);
+  gr.add_constraint(2*B == 3);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(2*B == 3);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Grid which is a single point.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(16*A + 14*B - 6*C, 7));
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3);
+  known_box.add_constraint(7*A == 16);
+  known_box.add_constraint(B == 2);
+  known_box.add_constraint(7*C == -6);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// An empty grid defined by congruences.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((A %= 1) / 2);
+
+  print_congruences(gr1, "*** gr1 before ***");
+
+  Rational_Box box1(gr1);
+
+  Rational_Box known_box(3, EMPTY);
+
+  bool ok = (box1 == known_box);
+
+  print_constraints(box1, "*** box1 ***");
+  print_congruences(gr1, "*** gr1 after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  if (ok) {
+    Grid gr2(box1);
+
+    print_congruences(gr2, "*** gr2 before ***");
+
+    Rational_Box box2(gr2);
+
+    ok = (box2 == known_box);
+
+    print_constraints(box2, "*** box2 ***");
+    print_congruences(gr2, "*** gr2 after ***");
+    print_constraints(known_box, "*** known_box ***");
+  }
+
+  return ok;
+}
+
+// Simple grid where all the points have the same value in one of the
+// dimensions (B).
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(C));
+  gr.add_grid_generator(grid_point(D));
+
+  print_generators(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(4);
+  known_box.add_constraint(B == 0);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Simple grid, with a divisor, such that the fractions for some
+// intervals (B and C) will be reduced before being assigned to the
+// intervals.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point(  A + 2*B + 4*C, 4));
+  gr.add_grid_generator(grid_point(2*A + 2*B + 4*C, 4));
+  gr.add_grid_generator(grid_point(  A + 2*B + 4*C + D, 4));
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(4, UNIVERSE);
+  known_box.add_constraint(2*B == 1);
+  known_box.add_constraint(C == 1);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test14() {
+  Grid gr(0, EMPTY);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(0, EMPTY);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test15() {
+  Grid gr(0, UNIVERSE);
+
+  print_congruences(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(0, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// Simple grid, with a divisor and 2 points.
+bool
+test16() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr before ***");
+
+  Rational_Box box(gr);
+
+  Rational_Box known_box(1, UNIVERSE);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_generators(gr, "*** gr after ***");
+  print_congruences(gr, "*** gr after ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/frompartiallyreducedproduct1.cc b/tests/Box/frompartiallyreducedproduct1.cc
new file mode 100644
index 0000000..2000dd1
--- /dev/null
+++ b/tests/Box/frompartiallyreducedproduct1.cc
@@ -0,0 +1,137 @@
+/* Test Box::Box(const Direct_Product<D1, D2>&, Complexity_Class).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+typedef Domain_Product<C_Polyhedron, Grid>::Direct_Product DProduct;
+typedef Domain_Product<C_Polyhedron, Grid>::Smash_Product SProduct;
+typedef Domain_Product<C_Polyhedron, Grid>::Constraints_Product CProduct;
+
+bool
+test01() {
+  Variable A(0);
+
+  DProduct dp(1);
+  dp.refine_with_constraint(A <= 4);
+  dp.refine_with_constraint(A >= 2);
+  dp.refine_with_congruence((A %= 1) / 5);
+
+  print_congruences(dp, "*** dp.congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  Rational_Box box(dp);
+
+  Rational_Box known_box(1);
+  known_box.refine_with_constraint(A >= 2);
+  known_box.refine_with_constraint(A <= 4);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  DProduct dp(1);
+  dp.refine_with_constraint(A <= 4);
+  dp.refine_with_constraint(A >= 2);
+  dp.refine_with_congruence((A %= 0) / 3);
+
+  Rational_Box box(dp);
+  box.refine_with_constraint(3*A >= 2);
+  box.refine_with_constraint(A <= 6);
+
+  print_congruences(dp, "*** dp.congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  Rational_Box known_box(1);
+  known_box.refine_with_constraint(A >= 2);
+  known_box.refine_with_constraint(A <= 4);
+
+  bool ok = (box == known_box);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  SProduct sp(1);
+  sp.refine_with_constraint(A >= 4);
+  sp.refine_with_constraint(A <= 2);
+  sp.refine_with_congruence((A %= 0) / 3);
+
+  Rational_Box box(sp);
+
+  print_congruences(sp, "*** sp.congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  CProduct cp(1);
+  cp.refine_with_constraint(A <= 4);
+  cp.refine_with_constraint(A >= 4);
+  cp.refine_with_congruence((A %= 0) / 3);
+
+  Rational_Box box(cp);
+
+  print_congruences(cp, "*** cp.congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  Rational_Box known_box(1, EMPTY);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/frompolyhedron1.cc b/tests/Box/frompolyhedron1.cc
new file mode 100644
index 0000000..eeb56fd
--- /dev/null
+++ b/tests/Box/frompolyhedron1.cc
@@ -0,0 +1,511 @@
+/* Test Box::Box(const Polyhedron&, Complexity_Class).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A non-bounded closed polyhedron consisting of the line x = y.
+// The bounding box is the xy plane - the universal polyhedron.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x - y >= 0);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2, UNIVERSE);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A non-bounded closed polyhedron in 2D consisting of a wedge bounded
+// by y >= 0 and x >= y.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= y);
+  ph.add_constraint(y >= 0);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x >= 0);
+  known_box.add_constraint(y >= 0);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded non-rectangular closed polyhedron in 2D.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(3*x >= -2);
+  known_box.add_constraint(x <= 4);
+  known_box.add_constraint(y >= -10);
+  known_box.add_constraint(y <= 4);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// An unbounded closed polyhedron in 4D but bounded in 2D.
+bool
+test04() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x + y >= 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+  ph.add_constraint(z >= 5);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(4);
+  known_box.add_constraint(3*x >= -2);
+  known_box.add_constraint(x <= 4);
+  known_box.add_constraint(y >= -10);
+  known_box.add_constraint(3*y <= 12);
+  known_box.add_constraint(3*z >= 15);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// This is the universal, 2-dimensional closed polyhedron.
+bool
+test05() {
+  C_Polyhedron ph(2);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2, UNIVERSE);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A zero-dimensional closed polyhedron.
+bool
+test06() {
+  C_Polyhedron ph;
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(0);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// An empty closed polyhedron in 2D.
+bool
+test07() {
+  C_Polyhedron ph(2, EMPTY);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(ph.space_dimension(), EMPTY);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded polyhedron that is a single point.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 2);
+  ph.add_constraint(y == 4);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x == 2);
+  known_box.add_constraint(y == 4);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A unit square closed polyhedron.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  C_Polyhedron ph(cs);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x >= 0);
+  known_box.add_constraint(x <= 1);
+  known_box.add_constraint(y >= 0);
+  known_box.add_constraint(y <= 1);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded rectangular closed polyhedron;
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 3);
+  ph.add_constraint(y <= 3);
+  ph.add_constraint(y >= 1);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  TBox known_box(2);
+  known_box.add_constraint(x >= 1);
+  known_box.add_constraint(x <= 3);
+  known_box.add_constraint(y <= 3);
+  known_box.add_constraint(y >= 1);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded polyhedron having redundant constraints.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 3);
+  ph.add_constraint(y == 1);
+  ph.add_constraint(x + y == 4);
+  ph.add_constraint(x - y == 2);
+  ph.add_constraint(3*x + y == 10);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 5);
+  ph.add_constraint(x + 2*y >= 5);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox known_box(2);
+  known_box.add_constraint(x == 3);
+  known_box.add_constraint(y == 1);
+
+  bool ok = (pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B <= 5);
+  cs.insert(A + 2*B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(3*A - 5*B <= 18);
+  C_Polyhedron ph(cs);
+
+  TBox sbox(ph, SIMPLEX_COMPLEXITY);
+  TBox nbox(ph, ANY_COMPLEXITY);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(11*A <= 61);
+  known_result.add_constraint(2*B <= 5);
+  known_result.add_constraint(5*B >= -18);
+
+  bool ok = (sbox == nbox
+             && check_result(sbox, known_result,
+                             "7.50e-7", "4.89e-7", "4.34e-7"));
+
+  print_constraints(sbox, "*** sbox ***");
+  print_constraints(nbox, "*** nbox ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  C_Polyhedron ph(1, EMPTY);
+
+  TBox box(ph);
+
+  TBox known_box(1, EMPTY);
+
+  bool ok (box == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(box, "*** box ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable X01(0);
+  Variable X02(1);
+  Variable X03(2);
+  Variable X04(3);
+  Variable X05(4);
+  Variable X06(5);
+  Variable X07(6);
+  Variable X08(7);
+  Variable X09(8);
+  Variable X10(9);
+  Variable X11(10);
+  Variable X12(11);
+  Variable X13(12);
+  Variable X14(13);
+  Variable X15(14);
+  Variable X16(15);
+  Variable X17(16);
+  Variable X18(17);
+  Variable X19(18);
+  Variable X20(19);
+  Variable X21(20);
+  Variable X22(21);
+  Variable X23(22);
+  Variable X24(23);
+  Variable X25(24);
+  Variable X26(25);
+  Variable X27(26);
+  Variable X28(27);
+  Variable X29(28);
+  Variable X30(29);
+  Variable X31(30);
+  Variable X32(31);
+  Variable X33(32);
+  Variable X34(33);
+  Variable X35(34);
+  Variable X36(35);
+  Variable X37(36);
+  Variable X38(37);
+  Variable X39(38);
+
+  Constraint_System cs;
+  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+  cs.insert(-X01 >= -80);
+  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+  cs.insert(Coefficient("2386907802506363")*X06
+            + Coefficient("2386907802506363")*X07
+            + Coefficient("1080863910568919")*X08
+            + Coefficient("7746191359077253")*X09
+            - X16 == 0);
+  cs.insert(-X06 + X10 >= -80);
+  cs.insert(-X07 + X11 >= 0);
+  cs.insert(-X08 + X12 >= 0);
+  cs.insert(-X09 + X13 >= 0);
+  cs.insert(X22 - X23 - X24 - X25 == 0);
+  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+  cs.insert(-X22 >= -500);
+  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+  cs.insert(Coefficient("7746191359077253")*X28
+            + Coefficient("7746191359077253")*X29
+            + Coefficient("3512807709348987")*X30
+            + Coefficient("3332663724254167")*X31
+            - X38 == 0);
+  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+  cs.insert(-X28 + X32 >= -500);
+  cs.insert(-X29 + X33 >= 0);
+  cs.insert(-X30 + X34 >= 0);
+  cs.insert(-X31 + X35 >= 0);
+  cs.insert(Coefficient("-2661627379775963")*X10
+            - Coefficient("2686397177726501")*X11
+            - Coefficient("5422333951354077")*X12
+            - Coefficient("5469621747441467")*X13
+            + X25
+            - Coefficient("2466846695892189")*X32
+            - Coefficient("4996743786567565")*X33
+            - Coefficient("5064297780978123")*X34
+            - Coefficient("641481471923585")*X35 >= 0);
+  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+  cs.insert(X15
+            - Coefficient("7854277750134145")*X28
+            - Coefficient("7782220156096217")*X29
+            - Coefficient("7782220156096217")*X30
+            - Coefficient("7710162562058289")*X31 >= 0);
+  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+  cs.insert(X21 >= 2);
+  cs.insert(-X16 - X38 >= -300);
+  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  C_Polyhedron ph(cs);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+  TBox sbox(ph, SIMPLEX_COMPLEXITY);
+  TBox nbox(ph, ANY_COMPLEXITY);
+
+  Rational_Box known_result(2);
+
+  bool ok = true;
+
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(sbox, "*** sbox ***");
+  print_constraints(nbox, "*** nbox ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST_F8(test12);
+  DO_TEST(test13);
+  DO_TEST_F64(test14);
+END_MAIN
diff --git a/tests/Box/frompolyhedron2.cc b/tests/Box/frompolyhedron2.cc
new file mode 100644
index 0000000..f88d563
--- /dev/null
+++ b/tests/Box/frompolyhedron2.cc
@@ -0,0 +1,131 @@
+/* Test Box::Box(const NNC_Polyhedron&, Complexity_Class).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// An unbounded NNC polyhedron in 4D but bounded in 2D
+// with strict inequality and closure points at the lower bound.
+bool
+test01() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  NNC_Polyhedron ph(4);
+  ph.add_constraint(3 * x + y > 2);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+  ph.add_constraint(z >= 5);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  // Same precision for both complexities.
+  TBox known_box(4);
+  known_box.add_constraint(3*x > -2);
+  known_box.add_constraint(x <= 4);
+  known_box.add_constraint(y > -10);
+  known_box.add_constraint(y <= 4);
+  known_box.add_constraint(z >= 5);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(3 * x + y >= 2);
+  ph.add_constraint(x < 4);
+  ph.add_constraint(y <= 4);
+
+  TBox pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox nbox(ph);
+
+  // Same precision for both complexities.
+  TBox known_box(2);
+  known_box.add_constraint(3*x >= -2);
+  known_box.add_constraint(x < 4);
+  known_box.add_constraint(y > -10);
+  known_box.add_constraint(y <= 4);
+
+  bool ok = (nbox == known_box && pbox == known_box);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nbox, "*** nbox ***");
+  print_constraints(pbox, "*** pbox ***");
+  print_constraints(known_box, "*** known_box ***");
+
+  return ok;
+}
+
+// An empty polyhedron in 2D defined using strict constraints.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(x > 0);
+  ph.add_constraint(x < 0);
+  ph.add_constraint(y > 0);
+  ph.add_constraint(y < 0);
+
+  Rational_Box pbox(ph, POLYNOMIAL_COMPLEXITY);
+
+  Rational_Box nbox(ph);
+
+  NNC_Polyhedron known_ph(2, EMPTY);
+  NNC_Polyhedron known_pph(pbox);
+  NNC_Polyhedron known_nph(nbox);
+
+  bool ok = (ph == known_ph && ph == known_nph && ph == known_ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_pph, "*** known_pph ***");
+  print_generators(known_nph, "*** known_nph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/fromspacedim1.cc b/tests/Box/fromspacedim1.cc
new file mode 100644
index 0000000..6aa0aee
--- /dev/null
+++ b/tests/Box/fromspacedim1.cc
@@ -0,0 +1,111 @@
+/* Test Box::Box(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box(0, EMPTY);
+
+  bool ok = (box.OK() && box.is_empty() && box.space_dimension() == 0);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box(0, UNIVERSE);
+
+  bool ok = (box.OK() && box.is_universe() && box.space_dimension() == 0);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TBox box(4, EMPTY);
+
+  bool ok = (box.OK() && box.is_empty() && box.space_dimension() == 4);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TBox box(4, UNIVERSE);
+
+  bool ok = (box.OK() && box.is_universe() && box.space_dimension() == 4);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  try {
+    TBox box(not_a_dimension(), EMPTY);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test06() {
+  try {
+    TBox box(not_a_dimension(), UNIVERSE);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/generalizedaffineimage1.cc b/tests/Box/generalizedaffineimage1.cc
new file mode 100644
index 0000000..7792965
--- /dev/null
+++ b/tests/Box/generalizedaffineimage1.cc
@@ -0,0 +1,605 @@
+/* Test Box::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B >= 2);
+
+  Rational_Box known_result(cs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image"
+                    "(B, GREATER_OR_EQUAL, A+2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x >= 2);
+  box.add_constraint(x <= 5);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(x, "
+                    "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x >= 2);
+  box.add_constraint(x <= 5);
+  box.add_constraint(y >= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(y, GREATER_THAN, 2*x - 2, -2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y > -4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(y, "
+                    "GREATER_THAN, 2*x - 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_THAN, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A < 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(A, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(A);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+  ph.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, A) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+  box.add_constraint(C >= -2);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+  ph.generalized_affine_image(-B, LESS_OR_EQUAL, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-B, "
+                    "LESS_OR_EQUAL, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** ph.generalized_affine_image(-B, "
+                    "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 1);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+  ph.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(C, "
+                    "LESS_OR_EQUAL, A + 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(C, "
+                    "LESS_OR_EQUAL, A + 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 4);
+  box.add_constraint(y <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(3*x + 2, GREATER_OR_EQUAL, 2*x - 3);
+  ph.generalized_affine_image(3*x + 2, GREATER_OR_EQUAL, 2*x - 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3*x + 2, "
+                    "GREATER_OR_EQUAL, 2*x - 3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*x + 2, "
+                    "GREATER_OR_EQUAL, 2*x - 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x <= 7);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+  ph.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "2.39e-7", "1.78e-7", "1.59e-7");
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "6, EQUAL, 3*x - 4) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(2*B + 3*A,
+                              LESS_OR_EQUAL, Linear_Expression(1));
+  ph.generalized_affine_image(2*B + 3*A,
+                              LESS_OR_EQUAL, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3*A + 2*B, "
+                    "LESS_OR_EQUAL, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*A + 2*B, "
+                    "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+  ph.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(2*B - 5, EQUAL, 3*B);
+  ph.generalized_affine_image(2*B - 5, EQUAL, 3*B);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(2*B - 5, "
+                    "EQUAL, 3*B) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "2*B - 5, EQUAL, 3*B) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(-4),
+                               LESS_OR_EQUAL, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(-4),
+                               LESS_OR_EQUAL, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-4, "
+                    "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-4, LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(2),
+                              GREATER_OR_EQUAL, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(2),
+                              GREATER_OR_EQUAL, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(2, "
+                    "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "2, GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 1);
+  box.add_constraint(B >= 2);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*A - B - 1,
+                              GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+  ph.generalized_affine_image(-2*A - B - 1,
+                              GREATER_OR_EQUAL, 3*A + B + 4*C - 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-2*A - B - 1, "
+                    "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-2*A - B - 1, GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*C + 3, GREATER_OR_EQUAL, -3*B + 4);
+  ph.generalized_affine_image(-2*C + 3, GREATER_OR_EQUAL, -3*B + 4);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-2*C + 3, "
+                    "GREATER_OR_EQUAL, -3*B + 4) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(-2*C + 3, "
+                    "GREATER_OR_EQUAL, -3*B + 4) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Box/generalizedaffineimage2.cc b/tests/Box/generalizedaffineimage2.cc
new file mode 100644
index 0000000..2270dd3
--- /dev/null
+++ b/tests/Box/generalizedaffineimage2.cc
@@ -0,0 +1,609 @@
+/* Test Box::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(B, GREATER_THAN, A+2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B > 2);
+
+  Rational_Box known_result(cs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image"
+                    "(B, GREATER_THAN, A+2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_THAN, B + 1);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image"
+                    "(A, LESS_THAN, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 5);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(x, GREATER_THAN, 2*x - 2, 2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(x, "
+                    "GREATER_THAN, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+  box.add_constraint(x >= 2);
+  box.add_constraint(x <= 5);
+  box.add_constraint(y >= 2);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(y, GREATER_THAN, 2*x - 2, -2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(y > -4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(y, "
+                    "GREATER_THAN, 2*x - 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, LESS_THAN, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A < 1);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(A, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(A, GREATER_THAN, Linear_Expression(1));
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A > 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.generalized_affine_image(A, "
+                        "GREATER_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A);
+  Linear_Expression e2(A);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, GREATER_THAN, e2);
+  ph.generalized_affine_image(e1, GREATER_THAN, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(A, "
+                    "GREATER_THAN, A) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(A, "
+                    "GREATER_THAN, A) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(B >= 0);
+  box.add_constraint(C >= -2);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(-B, LESS_THAN, Linear_Expression(1));
+  ph.generalized_affine_image(-B, LESS_THAN, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-B, "
+                    "LESS_THAN, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** ph.generalized_affine_image(-B, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C);
+  Linear_Expression e2(A + 1);
+
+  TBox box(3);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B <= 5);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(e1, LESS_THAN, e2);
+  ph.generalized_affine_image(e1, LESS_THAN, e2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(C, "
+                    "LESS_THAN, A + 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(C, "
+                    "LESS_THAN, A + 1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 4);
+  box.add_constraint(B <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(3*A + 2, GREATER_THAN, 2*A - 3);
+  ph.generalized_affine_image(3*A + 2, GREATER_THAN, 2*A - 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3*A + 2, "
+                    "GREATER_THAN, 2*A - 3) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*A + 2, "
+                    "GREATER_THAN, 2*A - 3) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(2*B + 3*A,
+                              LESS_THAN, Linear_Expression(1));
+  ph.generalized_affine_image(2*B + 3*A,
+                              LESS_THAN, Linear_Expression(1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(3*A + 2*B, "
+                    "LESS_THAN, 1) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(3*A + 2*B, "
+                    "LESS_THAN, 1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(-4),
+                               LESS_THAN, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(-4),
+                               LESS_THAN, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(-4, "
+                    "LESS_THAN, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-4, LESS_THAN, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(Linear_Expression(2),
+                              GREATER_THAN, A - 3*B + 2*C);
+  ph.generalized_affine_image(Linear_Expression(2),
+                              GREATER_THAN, A - 3*B + 2*C);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(2, "
+                    "GREATER_THAN, A - 3*B + 2*C) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "2, GREATER_THAN, A - 3*B + 2*C) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 1);
+  box.add_constraint(B >= 2);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*A - B - 1,
+                              GREATER_THAN, 3*A + B + 4*C - 2);
+  ph.generalized_affine_image(-2*A - B - 1,
+                              GREATER_THAN, 3*A + B + 4*C - 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(-2*A - B - 1, "
+                        "GREATER_THAN, 3*A + B + 4*C - 2) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image("
+                    "-2*A - B - 1, GREATER_THAN, 3*A + B + 4*C - 2) ***");
+
+  return ok;
+}
+
+bool
+  test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+  box.add_constraint(C <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_image(-2*C + 3, GREATER_THAN, -3*B + 4);
+  ph.generalized_affine_image(-2*C + 3, GREATER_THAN, -3*B + 4);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box, "*** box.generalized_affine_image(-2*C + 3, "
+                        "GREATER_THAN, -3*B + 4) ***");
+  print_constraints(Rational_Box(ph),
+                    "*** Rational_Box(ph).generalized_affine_image(-2*C + 3, "
+                        "GREATER_THAN, -3*B + 4) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.generalized_affine_image(Linear_Expression(3),
+                               GREATER_THAN,
+                               Linear_Expression(4));
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.generalized_affine_image(3, "
+                    "GREATER_THAN, 4) ***");
+
+  return ok;
+}
+
+bool
+  test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::generalized_affine_image(): it is illegal
+    // for either expression to have space dimension
+    // greater than the box's space dimension.
+    box.generalized_affine_image(B, EQUAL, C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::generalized_affine_image(): it is illegal
+    // for either expression to have space dimension
+    // greater than the box's space dimension.
+    box.generalized_affine_image(C + 1, GREATER_THAN, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B <= 1);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::generalized_affine_image(): it is illegal to apply it with
+    // the denominator equal to zero.
+    box.generalized_affine_image(C, GREATER_OR_EQUAL, B, 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/generalizedaffinepreimage1.cc b/tests/Box/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..816edcc
--- /dev/null
+++ b/tests/Box/generalizedaffinepreimage1.cc
@@ -0,0 +1,475 @@
+/*Test Box::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL,
+                                  Linear_Expression(-1));
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL,
+                                 Linear_Expression(-1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(4*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(4*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(2*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(5*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(5*A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph),
+                         "6.71e-8", "6.71e-8", "6.71e-8");
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 5);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(2*C <= 1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // If the Coefficient type is not wide enough, do nothing.
+  if (std::numeric_limits<Coefficient>::is_bounded
+      && (std::numeric_limits<Coefficient>::min() > -203
+          || std::numeric_limits<Coefficient>::max() < 629))
+    return true;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 7);
+  box.add_constraint(C >= 7);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(4*A == 1);
+  box.add_constraint(2*B >= 7);
+  box.add_constraint(5*C <= 7);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 7);
+  box.add_constraint(C >= 0);
+  box.add_constraint(C <= 1);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -2);
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B <= 4);
+  box.add_constraint(C <= 2);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+C+1, -2);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+C+1, -2);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+C+1, -2) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(2*B <= 3);
+  box.add_constraint(C <= 9);
+  box.add_constraint(C >= 7);
+
+  print_constraints(box, "*** box ***");
+  C_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-C+1, -3);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-C+1, -3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-C+1, -3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(2*B >= 7);
+  box.add_constraint(C <= 7);
+  box.add_constraint(5*C >= 7);
+
+  print_constraints(box, "*** box ***");
+  NNC_Polyhedron ph(box);
+
+  box.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  bool ok = check_result(box, Rational_Box(ph));
+
+  print_constraints(box,
+                    "*** box.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+  print_constraints(ph,
+                    "*** ph.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+DO_TEST(test01);
+DO_TEST(test02);
+DO_TEST(test03);
+DO_TEST(test04);
+DO_TEST(test05);
+DO_TEST_MAY_OVERFLOW_IF_INEXACT(test06, TBox);
+DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test07, TBox);
+DO_TEST(test08);
+DO_TEST(test09);
+DO_TEST(test10);
+DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test11, TBox);
+DO_TEST(test12);
+DO_TEST(test13);
+DO_TEST(test14);
+DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test15, TBox);
+END_MAIN
diff --git a/tests/Box/geomcovers1.cc b/tests/Box/geomcovers1.cc
new file mode 100644
index 0000000..8b95cc5
--- /dev/null
+++ b/tests/Box/geomcovers1.cc
@@ -0,0 +1,72 @@
+/* Test Pointset_Powerset<Box>::geometrically_covers().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  Constraint_System cs1, cs2, cs3, cs4;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 4);
+  cs2.insert(x >= 4);
+  cs2.insert(x <= 6);
+  cs3.insert(x >= 1);
+  cs3.insert(x <= 5);
+  TBox box1(cs1);
+  TBox box2(cs2);
+  TBox box3(cs3);
+
+  Pointset_Powerset<TBox> ps12(1, EMPTY);
+  ps12.add_disjunct(box1);
+  ps12.add_disjunct(box2);
+
+  Pointset_Powerset<TBox> ps3(1, EMPTY);
+  ps3.add_disjunct(box3);
+
+  using namespace IO_Operators;
+  nout << "ps12 = " << ps12 << endl
+       << " ps3 = " << ps3 << endl;
+
+  if (ps12.geometrically_covers(ps3)) {
+
+    nout << "ps12 covers ps3." << endl;
+
+    return true;
+  }
+  else {
+
+    nout << "ps12 does not cover ps3." << endl;
+
+    return false;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/intersection1.cc b/tests/Box/intersection1.cc
new file mode 100644
index 0000000..015e7a4
--- /dev/null
+++ b/tests/Box/intersection1.cc
@@ -0,0 +1,442 @@
+/* Test Box::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 3);
+
+  TBox box2(3);
+  box2.add_constraint(-y <= -2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(4);
+  box1.add_constraint(x <= 3);
+
+  TBox box2(4);
+  box2.add_constraint(-y <= -2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(4);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(-x <= -1);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(-y <= -1);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(-y <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-x <= -1);
+  known_result.add_constraint(y <= 3);
+  known_result.add_constraint(-y <= -1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(x >= 5);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(y >= 1);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(x >= 5);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(y >= 1);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box2.intersection_assign(box1);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2, "*** box2.intersection_assign(box1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box1;
+  TBox box2;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result;
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box2);
+
+  box1.intersection_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box1(3);
+  TBox box2(3);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= -5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box2);
+
+  box1.intersection_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+
+  TBox box2(3);
+
+  try {
+    // This is an invalid use of method
+    // Box::intersection_assign(box2): it is illegal
+    // to apply this method to two shapes having different dimensions.
+    box1.intersection_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  TBox box1(7);
+  TBox box2(15);
+
+  try {
+    // This is an invalid use of method
+    // Box::intersection_assign(box2): it is illegal
+    // to apply this method to two shapes having different dimensions.
+    box1.intersection_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  TBox box1(3, EMPTY);
+  TBox box2(3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result) ;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  TBox box1(3);
+  TBox box2(3, EMPTY);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.intersection_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result) ;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x > 0);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(1);
+  box2.add_constraint(x == 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  if (box1.is_empty())
+    return false;
+
+  box1.intersection_assign(box2);
+
+  TBox known_result(1, EMPTY);
+
+  bool ok = (known_result == box1) ;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x > 0);
+  box1.add_constraint(x <= 1);
+
+  TBox box2(1);
+  box2.add_constraint(x == 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  if (box1.is_empty())
+    return false;
+
+  box1.intersection_assign(box2);
+  bool non_empty = !box1.is_empty();
+
+  TBox known_result(1, EMPTY);
+
+  bool ok = (known_result == box1) && !non_empty;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(y <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x == 1);
+  box2.add_constraint(y >= 1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  if (box1.is_empty())
+    return false;
+
+  box1.intersection_assign(box2);
+  bool non_empty = !box1.is_empty();
+
+  TBox known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = (known_result == box1) && non_empty;
+
+  print_constraints(box1, "*** box1.intersection_assign(box2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/interval1.cc b/tests/Box/interval1.cc
new file mode 100644
index 0000000..5d8efbe
--- /dev/null
+++ b/tests/Box/interval1.cc
@@ -0,0 +1,224 @@
+/* Test Box::add_space_dimensions_and_embed():
+   we add two variables to a Box.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <complex>
+#include <cmath>
+#include <cstdio>
+
+namespace {
+
+template <typename F>
+struct My_Interval {
+
+  struct Floating_Point_Real_Interval_Info_Policy {
+    const_bool_nodef(store_special, false);
+    const_bool_nodef(store_open, true);
+    const_bool_nodef(cache_empty, true);
+    const_bool_nodef(cache_singleton, true);
+    const_bool_nodef(cache_normalized, false);
+    const_int_nodef(next_bit, 0);
+    const_bool_nodef(may_be_empty, false);
+    const_bool_nodef(may_contain_infinity, false);
+    const_bool_nodef(check_empty_result, false);
+    const_bool_nodef(check_inexact, false);
+  };
+
+  typedef Interval_Info_Bitset<unsigned int,
+                               Floating_Point_Real_Interval_Info_Policy>
+  Floating_Point_Real_Interval_Info;
+
+  typedef Interval<F, Floating_Point_Real_Interval_Info> interval_type;
+};
+
+template<typename F>
+bool
+test01() {
+  typename My_Interval<F>::interval_type x;
+  x = 2;
+  typename My_Interval<F>::interval_type two;
+  two = 2;
+  typename My_Interval<F>::interval_type y;
+
+  nout << "x = " << x << endl;
+
+  for (int i = 0; i <= 100; ++i) {
+    // Compute x = (x+(2/x))/2.
+    y = two;
+    y /= x;
+    x += y;
+    x /= two;
+    nout << "x = " << x << endl;
+  }
+
+  typename My_Interval<F>::interval_type z(F(1.41420757770538330078125));
+  z.join_assign(F(1.41421949863433837890625));
+
+  nout << "z = " << x << endl;
+
+  return !x.is_empty()
+#if PPL_CXX_SUPPORTS_IEEE_INEXACT_FLAG
+    && x.is_disjoint_from(F(1.41420757770538330078125))
+    && x.is_disjoint_from(F(1.41421949863433837890625))
+    && z.strictly_contains(x)
+#else
+    && x.is_topologically_closed()
+    && z.contains(x)
+#endif
+    && !x.contains_integer_point();
+}
+
+// Note: this function works both with interval and native floating
+// point types.
+template <typename N>
+void
+polynomial_evaluate(const std::vector<N>& P,
+                    const std::complex<N>& x,
+                    std::complex<N>& P_x) {
+  // Note: the coefficient of the leading term is implicitly 1.
+  P_x = std::complex<N>(N(1), N(0));
+  for (int i = P.size(); i >= 1; --i)
+    P_x = P_x*x + P[i-1];
+}
+
+// Note: this function works both with interval and native floating
+// point types.
+template <typename N>
+void
+solve(const std::vector<N>& P,
+      std::vector<std::complex<N> >& roots) {
+  const int degree = P.size();
+  if (degree < 1)
+    throw std::invalid_argument("the polynomial must have degree at least 1");
+
+  // Initial estimates are given by roots of unity.
+  std::vector<std::complex<N> > x(5);
+  double theta = 2*M_PI/degree;
+  for (int i = 0; i < degree; ++i) {
+    // Many libm implementations only work with round-to-nearest.
+    // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976
+    restore_pre_PPL_rounding();
+    N cos_i_theta = N(cos(i*theta));
+    N sin_i_theta = N(sin(i*theta));
+    set_rounding_for_PPL();
+
+    x[i] = std::complex<N>(cos_i_theta, sin_i_theta);
+  }
+
+  for (int iteration = 0; iteration < 50; ++iteration) {
+    for (int i = 0; i < degree; ++i)
+      nout << "x[" << i << "] = " << x[i] << endl;
+    for (int i = 0; i < degree; ++i) {
+      std::complex<N> P_x_i;
+      polynomial_evaluate(P, x[i], P_x_i);
+      std::complex<N> d(N(1), N(0));
+      for (int j = 0; j < degree; ++j)
+        if (i != j)
+          d *= (x[i] - x[j]);
+      P_x_i /= d;
+      x[i] -= P_x_i;
+    }
+  }
+  roots.resize(degree+1);
+  for (int i = 0; i < degree; ++i)
+    roots[i] = x[i];
+}
+
+template <typename N>
+bool test02() {
+  std::vector<N> P(4);
+  // x^4 + 5*x^3 + 7*x^2 + 134*x + 1
+  P[3] = 5;
+  P[2] = 7;
+  P[1] = 134;
+  P[0] = 1;
+  std::vector<std::complex<N> > roots;
+  solve(P, roots);
+  return true;
+}
+
+template <typename N>
+bool test03() {
+  std::vector<N> P(2);
+  // x^2 - 1
+  P[1] = 0;
+  P[0] = -1;
+  std::vector<std::complex<N> > roots;
+  solve(P, roots);
+  return true;
+}
+
+template <typename N>
+bool test04() {
+  std::vector<N> P(2);
+  // x^2 - 1
+  P[1] = 0;
+  P[0] = -1;
+  for (int d = 0; d <= 10; ++d) {
+    std::complex<N> P_x_i;
+    polynomial_evaluate(P,
+                        std::complex<N>(N(d), N(0)),
+                        P_x_i);
+    nout << d << " " << P_x_i << endl;
+  }
+  return true;
+}
+
+template<typename F>
+bool
+test05() {
+  typename My_Interval<F>::interval_type x("123.00123");
+  nout << "x = " << x << endl;
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+
+#if PPL_SUPPORTED_FLOAT
+  DO_TEST(test01<float>);
+  DO_TEST(test02<float>);
+  DO_TEST(test03<float>);
+  DO_TEST(test04<float>);
+  DO_TEST(test05<float>);
+#endif // PPL_SUPPORTED_FLOAT
+
+#if PPL_SUPPORTED_DOUBLE
+  DO_TEST(test01<double>);
+  DO_TEST(test02<double>);
+  DO_TEST(test03<double>);
+  DO_TEST(test04<double>);
+  DO_TEST(test05<double>);
+#endif // PPL_SUPPORTED_DOUBLE
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+  DO_TEST(test01<long double>);
+  DO_TEST(test02<long double>);
+  DO_TEST(test03<long double>);
+  DO_TEST(test04<long double>);
+  DO_TEST(test05<long double>);
+#endif // PPL_SUPPORTED_LONG_DOUBLE
+
+END_MAIN
diff --git a/tests/Box/limitedcc76extrapolation1.cc b/tests/Box/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..a15caab
--- /dev/null
+++ b/tests/Box/limitedcc76extrapolation1.cc
@@ -0,0 +1,317 @@
+/* Test Box::limited_CC76_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box1(0);
+  TBox box2(0);
+  Constraint_System cs;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.limited_CC76_extrapolation_assign(box2, cs);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1,
+                    "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A == -2);
+
+  TBox box2(2);
+  box2.add_constraint(A == -2);
+  box2.add_constraint(B == 3);
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(box1);
+
+  box1.limited_CC76_extrapolation_assign(box2, cs);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1,
+                    "*** box1.limited_CC76_extrapolation_assign(box2, cs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+  TBox box1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+  TBox box2(cs2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(cs, "*** cs ***");
+
+  box1.limited_CC76_extrapolation_assign(box2, cs);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1,
+                    "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(B >= 1);
+
+  TBox box2(3);
+  box2.add_constraint(A <= -2);
+  box2.add_constraint(B >= 4);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(A - B + C <= 6);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  box1.limited_CC76_extrapolation_assign(box2, cs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1,
+                    "*** box1.limited_CC76_extrapolation_assign(box2, cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+
+  TBox box1(cs1);
+  TBox box2(2, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(x <= 0);
+  cs.insert(y >= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(box1);
+
+  box1.limited_CC76_extrapolation_assign(box2, cs);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1,
+                    "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, EMPTY);
+  TBox box2(2, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(x <= 0);
+  cs.insert(y >= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(box1);
+
+  box1.limited_CC76_extrapolation_assign(box2, cs);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1,
+                    "*** box1.limited_CC76_extrapolation_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable y(1);
+
+  TBox box1(1);
+  TBox box2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Box::limited_CC76_extrapolation_assign(box2, cs): it is
+    // illegal to apply the method to two polyhedra that are not
+    // dimension-compatible.
+    box2.limited_CC76_extrapolation_assign(box1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // Box::limited_CC76_extrapolation_assign(box, cs): it is
+    // illegal to apply the method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    box2.limited_CC76_extrapolation_assign(box1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 2);
+
+  TBox box2(2);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(x < 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(box2);
+
+  box2.limited_CC76_extrapolation_assign(box1, cs);
+
+  bool ok = check_result(box2, known_result);
+
+  print_constraints(box2,
+                    "*** box2.limited_CC76_extrapolation_assign(box1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/mapspacedims1.cc b/tests/Box/mapspacedims1.cc
new file mode 100644
index 0000000..d194122
--- /dev/null
+++ b/tests/Box/mapspacedims1.cc
@@ -0,0 +1,280 @@
+/* Test Box::map_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  TBox box(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result;
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  TBox box(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBox box(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  cs = box.minimized_constraints();
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x == 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+
+  TBox box(3);
+  box.add_constraints(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBox box(2);
+  box.add_constraint(x <= 1);
+  box.add_constraint(y <= -1);
+
+  print_constraints(box, "*** box ***");
+  print_function(function, "*** function ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x <= -1);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D == 0);
+  TBox box(cs);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(1, 1);
+  function.insert(3, 0);
+
+  print_function(function, "*** function ***");
+  print_constraints(box, "*** box ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+  print_function(function, "*** function ***");
+
+  box.map_space_dimensions(function);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.map_space_dimension(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/max_min1.cc b/tests/Box/max_min1.cc
new file mode 100644
index 0000000..81eec69
--- /dev/null
+++ b/tests/Box/max_min1.cc
@@ -0,0 +1,762 @@
+/* Test Box::maximize(const Linear_Expression&, ...)
+   and Box::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !box.maximize(x1-2*x2, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(x1-2*x2, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = !box.maximize(-10*x1-6*x2+4, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(-10*x1-6*x2+4, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le;
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A + B);
+  bool ok = !box.maximize(le, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    && num == 2 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A - B);
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A <= 0);
+  box.add_constraint(B <= 0);
+  box.add_constraint(C >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A + B - C);
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(3*A == 1);
+  box.add_constraint(B < 5);
+  box.add_constraint(B > 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(12*A);
+  bool ok = box.maximize(le, num, den, included, g)
+      // FIXME: check the result for floating point computations.
+      //    && num == 4 && den == 1 && included
+      && g.is_point()
+      && g.divisor() != 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(3*A == 1);
+  box.add_constraint(B > 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(12*A);
+
+  bool ok = box.maximize(le, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    // FIXME: check the result for floating point computations.
+    //    && num == 4 && den == 1 && included
+    && g.is_point()
+    && g.divisor() != 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(A + B - C + 2*E - 2*D);
+  bool ok = !box.maximize(le, num, den, included, g)
+    && ! box.minimize(le, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(Linear_Expression(3));
+  bool ok = box.maximize(le, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(le, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(z);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::minimize(le, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BOXS.
+    box.minimize(le, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression le(z);
+
+  try {
+    // This is an incorrect use of the method
+    // Box::maximize(le, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the BOXS.
+    box.maximize(le, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A-2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A-2, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A+2, num, den, included)
+    && num == 7 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A+2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A+2, num, den, included)
+    && num == 2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A+2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A-2, num, den, included)
+    && num == -2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A-2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A - B - 2, num, den, included)
+    && num == 8 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A - B - 2, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 5);
+  box.add_constraint(B <= 3);
+  box.add_constraint(B >= -5);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(A - B + 2, num, den, included)
+    && num == 12 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(A - B + 2, num, den, included)
+    && num == 0 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A + B + 2, num, den, included)
+    && num == 57 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A + B + 2, num, den, included)
+    && num == -98 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 100);
+  box.add_constraint(B <= 55);
+  box.add_constraint(B >= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = box.maximize(-A + B - 2, num, den, included)
+    && num == 53 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = box.minimize(-A + B - 2, num, den, included)
+    && num == -102 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test07, TBox);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test08, TBox);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/maxspacedim1.cc b/tests/Box/maxspacedim1.cc
new file mode 100644
index 0000000..b194d6c
--- /dev/null
+++ b/tests/Box/maxspacedim1.cc
@@ -0,0 +1,59 @@
+/* Test Box::max_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  nout << Box<fl_r_oc>::max_space_dimension() << " (fl_r_oc)"
+       << endl
+       << Box<db_r_oc>::max_space_dimension() << " (db_r_oc)"
+       << endl
+       << Box<ld_r_oc>::max_space_dimension() << " (ld_r_oc)"
+       << endl
+       << Box<rt_r_oc>::max_space_dimension() << " (rt_r_oc)"
+       << endl;
+
+  if (Box<fl_r_oc>::max_space_dimension()
+      < Box<db_r_oc>::max_space_dimension())
+    return false;
+
+  if (Box<db_r_oc>::max_space_dimension()
+      < Box<ld_r_oc>::max_space_dimension())
+    return false;
+
+  // CHECKME: is this a valid assertion?
+  if (Box<ld_r_oc>::max_space_dimension()
+      < Box<rt_r_oc>::max_space_dimension())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/membytes1.cc b/tests/Box/membytes1.cc
new file mode 100644
index 0000000..a2a99c5
--- /dev/null
+++ b/tests/Box/membytes1.cc
@@ -0,0 +1,129 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <cmath>
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.refine_with_constraint(x >= 0);
+  box.refine_with_constraint(x < 7);
+  box.refine_with_constraint(z < 3);
+  box.refine_with_constraint(x - y - 1 <= 0);
+  box.refine_with_constraint(2*x - 2*y >= 0);
+  box.refine_with_constraint(4*x - 2*y - z + 2 >= 0);
+
+  using namespace IO_Operators;
+  nout << "box = " << box << endl;
+
+  const memory_size_type box_total_size = box.total_memory_in_bytes();
+  const memory_size_type box_external_size = box.external_memory_in_bytes();
+
+  nout << "box.total_memory_in_bytes() = " << box_total_size
+       << endl
+       << "box.external_memory_in_bytes() = " << box_external_size
+       << endl
+       << endl;
+
+  return true;
+}
+
+#if PPL_SUPPORTED_DOUBLE
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<TBox> pbox(2, EMPTY);
+  TBox box(2);
+
+  typedef TBox::interval_type interval_type;
+  typedef interval_type::boundary_type boundary_type;
+
+  interval_type ix;
+  interval_type iy;
+
+  for (double d = -M_PI; d <= M_PI; d += 0.01) {
+    ix.assign(EMPTY);
+    ix.join_assign(boundary_type(d-0.015));
+    ix.join_assign(boundary_type(d+0.015));
+
+    // Many libm implementations only work with round-to-nearest.
+    // See, e.g, http://sources.redhat.com/bugzilla/show_bug.cgi?id=3976
+    restore_pre_PPL_rounding();
+    boundary_type sdm = boundary_type(sin(d-0.015));
+    boundary_type sdp = boundary_type(sin(d-0.015));
+    set_rounding_for_PPL();
+
+    iy.assign(EMPTY);
+    iy.join_assign(sdm);
+    iy.join_assign(sdp);
+
+    box.set_interval(x, ix);
+    box.set_interval(y, iy);
+
+    pbox.add_disjunct(box);
+  }
+
+  using namespace IO_Operators;
+  nout << "pbox = " << pbox << endl;
+
+  nout << "pbox.total_memory_in_bytes() = "
+       << pbox.total_memory_in_bytes()
+       << endl
+       << "pbox.external_memory_in_bytes() = "
+       << pbox.external_memory_in_bytes()
+       << endl;
+
+  pbox.refine_with_constraint(x < y);
+
+  using namespace IO_Operators;
+  nout << "pbox = " << pbox << endl;
+
+  nout << "pbox.total_memory_in_bytes() = "
+       << pbox.total_memory_in_bytes()
+       << endl
+       << "pbox.external_memory_in_bytes() = "
+       << pbox.external_memory_in_bytes()
+       << endl;
+
+  return true;
+}
+
+#endif // PPL_SUPPORTED_DOUBLE
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+#if PPL_SUPPORTED_DOUBLE
+  DO_TEST(test02);
+#endif
+END_MAIN
diff --git a/tests/Box/minconstraints1.cc b/tests/Box/minconstraints1.cc
new file mode 100644
index 0000000..c21ac34
--- /dev/null
+++ b/tests/Box/minconstraints1.cc
@@ -0,0 +1,95 @@
+/* Test Box<T>::minimized_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+  box.add_constraint(A >= -3);
+  box.add_constraint(A <= 1);
+
+  print_constraints(box, "*** box ***");
+
+  const Constraint_System cs = box.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** box.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_box(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_box);
+
+  return ok;
+}
+
+bool
+test02() {
+  TBox box(0, UNIVERSE);
+
+  print_constraints(box, "*** box ***");
+
+  const Constraint_System cs = box.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** box.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  return num_constraints == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Box/propagateconstraints1.cc b/tests/Box/propagateconstraints1.cc
new file mode 100644
index 0000000..79a3d24
--- /dev/null
+++ b/tests/Box/propagateconstraints1.cc
@@ -0,0 +1,211 @@
+/* Test Box::propagate_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= A);
+  cs.insert(11*A < 127);
+  cs.insert(7*A - 15*B > 8);
+  cs.insert(3*B > 2*A);
+  cs.insert(A == B);
+
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(2);
+  box.propagate_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.propagate_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variable G1(32);
+  Variable H1(33);
+
+  Constraint_System cs;
+  cs.insert(A + C - Q == 130);
+  cs.insert(B + D - R == 190);
+  cs.insert(-450*A1 - 45*B1 >= -4);
+  cs.insert(-90*C1 - 9*D1 >= -8000);
+  cs.insert(-30*E1 - 3*F1 >= -3500);
+  cs.insert(-30*G1 - 3*H1 >= -3500);
+  cs.insert(-E - G >= -1000);
+  cs.insert(-F - H >= -1000);
+  cs.insert(E + I - 6*A1 == 0);
+  cs.insert(G + K - 6*E1 == 0);
+  cs.insert(F + J - 6*C1 == 0);
+  cs.insert(H + L - 6*G1 == 0);
+  cs.insert(A + W - A1 == 5);
+  cs.insert(B - W + X - C1 == 0);
+  cs.insert(C + Y - E1 == 2);
+  cs.insert(D - Y + Z - G1 == 0);
+  cs.insert(M + S + A1 - B1 == 6);
+  cs.insert(N - O - S + T + C1 - D1 == 0);
+  cs.insert(O + U + E1 - F1 == 4);
+  cs.insert(M - P + U - V - G1 + H1 == 0);
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+  cs.insert(E >= 0);
+  cs.insert(F >= 0);
+  cs.insert(G >= 0);
+  cs.insert(H >= 0);
+  cs.insert(I >= 0);
+  cs.insert(J >= 0);
+  cs.insert(K >= 0);
+  cs.insert(L >= 0);
+  cs.insert(M >= 0);
+  cs.insert(N >= 0);
+  cs.insert(O >= 0);
+  cs.insert(P >= 0);
+  cs.insert(Q >= 0);
+  cs.insert(R >= 0);
+  cs.insert(S >= 0);
+  cs.insert(T >= 0);
+  cs.insert(U >= 0);
+  cs.insert(V >= 0);
+  cs.insert(W >= 0);
+  cs.insert(X >= 0);
+  cs.insert(Y >= 0);
+  cs.insert(Z >= 0);
+  cs.insert(A1 >= 0);
+  cs.insert(B1 >= 0);
+  cs.insert(C1 >= 0);
+  cs.insert(D1 >= 0);
+  cs.insert(E1 >= 0);
+  cs.insert(F1 >= 0);
+  cs.insert(G1 >= 0);
+  cs.insert(H1 >= 0);
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs.space_dimension());
+  box.propagate_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.propagate_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  Constraint_System cs;
+  cs.insert(-A >= -20);
+  cs.insert(-B - C >= -20);
+  cs.insert(-D >= -20);
+  cs.insert(A + B - E - F == 0);
+  cs.insert(C + D - G - H == 0);
+  cs.insert(E >= 10);
+  cs.insert(F + G >= 20);
+  cs.insert(H >= 30);
+  cs.insert(A >= 0);
+  cs.insert(-A >= -30);
+  cs.insert(B >= 0);
+  cs.insert(-B >= -20);
+  cs.insert(C >= 0);
+  cs.insert(-C >= -10);
+  cs.insert(D >= 0);
+  cs.insert(-D >= -10);
+  cs.insert(E >= 0);
+  cs.insert(-E >= -10);
+  cs.insert(F >= 0);
+  cs.insert(-F >= -2);
+  cs.insert(G >= 0);
+  cs.insert(-G >= -20);
+  cs.insert(H >= 0);
+  cs.insert(-H >= -30);
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs.space_dimension());
+  box.propagate_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.propagate_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Box/propagateconstraints2.cc b/tests/Box/propagateconstraints2.cc
new file mode 100644
index 0000000..3a18d5f
--- /dev/null
+++ b/tests/Box/propagateconstraints2.cc
@@ -0,0 +1,454 @@
+/* Test Box::propagate_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Edge {
+  unsigned int from;
+  unsigned int to;
+  unsigned long distance;
+};
+
+Edge hawaii[] = {
+  { 0, 1, 6191 },
+  { 1, 0, 6191 },
+  { 2, 3, 4147 },
+  { 3, 2, 4147 },
+  { 4, 5, 3884 },
+  { 5, 4, 3884 },
+  { 5, 6, 1609 },
+  { 6, 5, 1609 },
+  { 7, 0, 12521 },
+  { 0, 7, 12521 },
+  { 8, 1, 2872 },
+  { 1, 8, 2872 },
+  { 9, 10, 4036 },
+  { 10, 9, 4036 },
+  { 4, 11, 2959 },
+  { 11, 4, 2959 },
+  { 12, 13, 27415 },
+  { 13, 12, 27415 },
+  { 14, 15, 6068 },
+  { 15, 14, 6068 },
+  { 15, 16, 7337 },
+  { 16, 15, 7337 },
+  { 17, 18, 2894 },
+  { 18, 17, 2894 },
+  { 18, 19, 5425 },
+  { 19, 18, 5425 },
+  { 20, 21, 2265 },
+  { 21, 20, 2265 },
+  { 19, 20, 3008 },
+  { 20, 19, 3008 },
+  { 21, 12, 6654 },
+  { 12, 21, 6654 },
+  { 22, 23, 1563 },
+  { 23, 22, 1563 },
+  { 23, 24, 3470 },
+  { 24, 23, 3470 },
+  { 25, 26, 6536 },
+  { 26, 25, 6536 },
+  { 27, 28, 10373 },
+  { 28, 27, 10373 },
+  { 28, 29, 7866 },
+  { 29, 28, 7866 },
+  { 29, 30, 8961 },
+  { 30, 29, 8961 },
+  { 31, 32, 6954 },
+  { 32, 31, 6954 },
+  { 33, 34, 24135 },
+  { 34, 33, 24135 },
+  { 34, 35, 5943 },
+  { 35, 34, 5943 },
+  { 33, 36, 2389 },
+  { 36, 33, 2389 },
+  { 35, 37, 3374 },
+  { 37, 35, 3374 },
+  { 34, 38, 4494 },
+  { 38, 34, 4494 },
+  { 37, 38, 8295 },
+  { 38, 37, 8295 },
+  { 38, 39, 12091 },
+  { 39, 38, 12091 },
+  { 39, 40, 4356 },
+  { 40, 39, 4356 },
+  { 39, 30, 3986 },
+  { 30, 39, 3986 },
+  { 29, 41, 3937 },
+  { 41, 29, 3937 },
+  { 41, 28, 7159 },
+  { 28, 41, 7159 },
+  { 42, 43, 3887 },
+  { 43, 42, 3887 },
+  { 43, 44, 3685 },
+  { 44, 43, 3685 },
+  { 43, 45, 20903 },
+  { 45, 43, 20903 },
+  { 45, 46, 2226 },
+  { 46, 45, 2226 },
+  { 47, 44, 7487 },
+  { 44, 47, 7487 },
+  { 44, 48, 22511 },
+  { 48, 44, 22511 },
+  { 46, 48, 7280 },
+  { 48, 46, 7280 },
+  { 48, 49, 3112 },
+  { 49, 48, 3112 },
+  { 49, 50, 2530 },
+  { 50, 49, 2530 },
+  { 50, 51, 17408 },
+  { 51, 50, 17408 },
+  { 45, 52, 15249 },
+  { 52, 45, 15249 },
+  { 53, 54, 36470 },
+  { 54, 53, 36470 },
+  { 54, 49, 7694 },
+  { 49, 54, 7694 },
+  { 51, 55, 11400 },
+  { 55, 51, 11400 },
+  { 52, 46, 15473 },
+  { 46, 52, 15473 },
+  { 55, 56, 37433 },
+  { 56, 55, 37433 },
+  { 53, 57, 3855 },
+  { 57, 53, 3855 },
+  { 57, 58, 1508 },
+  { 58, 57, 1508 },
+  { 59, 60, 3574 },
+  { 60, 59, 3574 },
+  { 59, 53, 7377 },
+  { 53, 59, 7377 },
+  { 58, 60, 6801 },
+  { 60, 58, 6801 },
+  { 60, 61, 9191 },
+  { 61, 60, 9191 },
+  { 61, 62, 3940 },
+  { 62, 61, 3940 },
+  { 62, 63, 1941 },
+  { 63, 62, 1941 },
+  { 63, 64, 17861 },
+  { 64, 63, 17861 },
+  { 65, 66, 12138 },
+  { 66, 65, 12138 },
+  { 66, 67, 5764 },
+  { 67, 66, 5764 },
+  { 68, 62, 2365 },
+  { 62, 68, 2365 },
+  { 69, 70, 14756 },
+  { 70, 69, 14756 },
+  { 70, 71, 3931 },
+  { 71, 70, 3931 },
+  { 71, 72, 6955 },
+  { 72, 71, 6955 },
+  { 69, 73, 4265 },
+  { 73, 69, 4265 },
+  { 73, 56, 5278 },
+  { 56, 73, 5278 },
+  { 74, 75, 1088 },
+  { 75, 74, 1088 },
+  { 76, 77, 2549 },
+  { 77, 76, 2549 },
+  { 78, 79, 2029 },
+  { 79, 78, 2029 },
+  { 80, 81, 4607 },
+  { 81, 80, 4607 },
+  { 81, 82, 995 },
+  { 82, 81, 995 },
+  { 82, 83, 5708 },
+  { 83, 82, 5708 },
+  { 83, 84, 1015 },
+  { 84, 83, 1015 },
+  { 85, 86, 2592 },
+  { 86, 85, 2592 },
+  { 86, 75, 9272 },
+  { 75, 86, 9272 },
+  { 86, 87, 1549 },
+  { 87, 86, 1549 },
+  { 87, 88, 1155 },
+  { 88, 87, 1155 },
+  { 85, 84, 8375 },
+  { 84, 85, 8375 },
+  { 84, 89, 3022 },
+  { 89, 84, 3022 },
+  { 89, 90, 6455 },
+  { 90, 89, 6455 },
+  { 80, 91, 2912 },
+  { 91, 80, 2912 },
+  { 78, 92, 2087 },
+  { 92, 78, 2087 },
+  { 91, 76, 7736 },
+  { 76, 91, 7736 },
+  { 88, 85, 2143 },
+  { 85, 88, 2143 },
+  { 93, 8, 9507 },
+  { 8, 93, 9507 },
+  { 89, 88, 9385 },
+  { 88, 89, 9385 },
+  { 64, 65, 24795 },
+  { 65, 64, 24795 },
+  { 54, 94, 32035 },
+  { 94, 54, 32035 },
+  { 94, 56, 35025 },
+  { 56, 94, 35025 },
+  { 69, 95, 25243 },
+  { 95, 69, 25243 },
+  { 67, 96, 30757 },
+  { 96, 67, 30757 },
+  { 96, 97, 859 },
+  { 97, 96, 859 },
+  { 97, 95, 3230 },
+  { 95, 97, 3230 },
+  { 1, 9, 16155 },
+  { 9, 1, 16155 },
+  { 98, 51, 11706 },
+  { 51, 98, 11706 },
+  { 75, 99, 51590 },
+  { 99, 75, 51590 },
+  { 11, 100, 23417 },
+  { 100, 11, 23417 },
+  { 100, 101, 12368 },
+  { 101, 100, 12368 },
+  { 102, 103, 4846 },
+  { 103, 102, 4846 },
+  { 103, 104, 2901 },
+  { 104, 103, 2901 },
+  { 10, 104, 7849 },
+  { 104, 10, 7849 },
+  { 104, 2, 2147 },
+  { 2, 104, 2147 },
+  { 2, 102, 1761 },
+  { 102, 2, 1761 },
+  { 102, 4, 4444 },
+  { 4, 102, 4444 },
+  { 74, 105, 8183 },
+  { 105, 74, 8183 },
+  { 106, 107, 7075 },
+  { 107, 106, 7075 },
+  { 89, 107, 1178 },
+  { 107, 89, 1178 },
+  { 108, 81, 1312 },
+  { 81, 108, 1312 },
+  { 81, 109, 1793 },
+  { 109, 81, 1793 },
+  { 82, 108, 1001 },
+  { 108, 82, 1001 },
+  { 108, 80, 7421 },
+  { 80, 108, 7421 },
+  { 110, 92, 434 },
+  { 92, 110, 434 },
+  { 92, 79, 3285 },
+  { 79, 92, 3285 },
+  { 79, 99, 2706 },
+  { 99, 79, 2706 },
+  { 111, 78, 3052 },
+  { 78, 111, 3052 },
+  { 77, 111, 2036 },
+  { 111, 77, 2036 },
+  { 24, 25, 2634 },
+  { 25, 24, 2634 },
+  { 25, 21, 1832 },
+  { 21, 25, 1832 },
+  { 33, 112, 14461 },
+  { 112, 33, 14461 },
+  { 113, 114, 7998 },
+  { 114, 113, 7998 },
+  { 41, 115, 6937 },
+  { 115, 41, 6937 },
+  { 32, 116, 47595 },
+  { 116, 32, 47595 },
+  { 99, 117, 3887 },
+  { 117, 99, 3887 },
+  { 117, 118, 736 },
+  { 118, 117, 736 },
+  { 85, 83, 9281 },
+  { 83, 85, 9281 },
+  { 118, 80, 4823 },
+  { 80, 118, 4823 },
+  { 77, 119, 22341 },
+  { 119, 77, 22341 },
+  { 56, 120, 1612 },
+  { 120, 56, 1612 },
+  { 79, 121, 3258 },
+  { 121, 79, 3258 },
+  { 52, 57, 25357 },
+  { 57, 52, 25357 },
+  { 99, 121, 1646 },
+  { 121, 99, 1646 },
+  { 121, 76, 1359 },
+  { 76, 121, 1359 },
+  { 37, 27, 3890 },
+  { 27, 37, 3890 },
+  { 27, 31, 5066 },
+  { 31, 27, 5066 },
+  { 122, 123, 2556 },
+  { 123, 122, 2556 },
+  { 90, 122, 947 },
+  { 122, 90, 947 },
+  { 122, 124, 911 },
+  { 124, 122, 911 },
+  { 124, 125, 23829 },
+  { 125, 124, 23829 },
+  { 91, 119, 7911 },
+  { 119, 91, 7911 },
+};
+
+Edge hawaii1[] = {
+  { 1, 0, 600 },
+  { 2, 1, 2872 },
+};
+
+Edge hawaii2[] = {
+  { 0, 1, 600 },
+  { 1, 2, 2872 },
+};
+
+const mpq_class&
+perturbate(unsigned long a) {
+  static mpq_class q;
+  q = a;
+  q = (q*q)/(q-1);
+  return q;
+}
+
+template <typename T>
+void
+propagate_edges(Box<T>& box, const Edge* edges, unsigned n) {
+  Constraint_System cs;
+  for (unsigned i = 0; i < n; ++i) {
+    const mpq_class& q = perturbate(edges[i].distance);
+    Coefficient a;
+    a = q.get_den();
+    Coefficient b;
+    b = q.get_num();
+
+    vnout << "a = " << a << "; b = " << b << endl;
+
+    cs.insert(a*Variable(edges[i].from) - a*Variable(edges[i].to) <= b);
+  }
+  box.propagate_constraints(cs);
+}
+
+} // namespace
+
+bool test01() {
+  Rational_Box qbox1(126);
+
+  qbox1.add_constraint(Variable(0) >= 100000);
+  qbox1.add_constraint(Variable(0) <= 100001);
+  qbox1.add_constraint(Variable(12) >= 110000);
+  qbox1.add_constraint(Variable(12) <= 110001);
+  qbox1.add_constraint(Variable(14) >= 120000);
+  qbox1.add_constraint(Variable(14) <= 120001);
+  qbox1.add_constraint(Variable(27) >= 130000);
+  qbox1.add_constraint(Variable(27) <= 130001);
+  qbox1.add_constraint(Variable(42) >= 140000);
+  qbox1.add_constraint(Variable(42) <= 140001);
+  qbox1.add_constraint(Variable(113) >= 150000);
+  qbox1.add_constraint(Variable(113) <= 150001);
+  qbox1.add_constraint(Variable(125) >= 200000);
+  qbox1.add_constraint(Variable(125) <= 200001);
+
+  Rational_Box qbox2(qbox1);
+
+  print_constraints(qbox1, "*** qbox1, qbox2 ***");
+
+  propagate_edges(qbox2, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+  print_constraints(qbox2, "*** qbox2.propagate_edges() ***");
+
+  TBox tbox(qbox1);
+
+  print_constraints(tbox, "*** tbox ***");
+
+  propagate_edges(tbox, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+  print_constraints(tbox, "*** tbox.propagate_edges() ***");
+
+#if PPL_SUPPORTED_DOUBLE
+  bool ok = check_result(tbox, qbox2, "18.36", "2.83", "2.79");
+#else
+  bool ok = check_result(tbox, qbox2, "30.96", "2.83", "2.79");
+#endif
+
+  return ok;
+}
+
+bool test02() {
+  Rational_Box qbox1(3);
+
+  qbox1.add_constraint(Variable(0) <= 0);
+
+  Rational_Box qbox2(qbox1);
+
+  print_constraints(qbox1, "*** qbox1, qbox2 ***");
+
+  propagate_edges(qbox2, hawaii1, sizeof(hawaii1)/sizeof(Edge));
+
+  print_constraints(qbox2, "*** qbox2.propagate_edges() ***");
+
+  TBox tbox(qbox1);
+
+  print_constraints(tbox, "*** tbox ***");
+
+  propagate_edges(tbox, hawaii1, sizeof(hawaii1)/sizeof(Edge));
+
+  print_constraints(tbox, "*** tbox.propagate_edges() ***");
+
+  bool ok = check_result(tbox, qbox2, "3.28", "2.83", "2.79");
+
+  return ok;
+}
+
+bool test03() {
+  Rational_Box qbox1(3);
+
+  qbox1.add_constraint(Variable(0) >= 0);
+
+  Rational_Box qbox2(qbox1);
+
+  print_constraints(qbox1, "*** qbox1, qbox2 ***");
+
+  propagate_edges(qbox2, hawaii2, sizeof(hawaii2)/sizeof(Edge));
+
+  print_constraints(qbox2, "*** qbox2.propagate_edges() ***");
+
+  TBox tbox(qbox1);
+
+  print_constraints(tbox, "*** tbox ***");
+
+  propagate_edges(tbox, hawaii2, sizeof(hawaii2)/sizeof(Edge));
+
+  print_constraints(tbox, "*** tbox.propagate_edges() ***");
+
+  bool ok = check_result(tbox, qbox2, "3.28", "2.83", "2.78");
+
+  return ok;
+}
+
+BEGIN_MAIN
+  DO_TEST_F32(test01);
+  DO_TEST_F16(test02);
+  DO_TEST_F16(test03);
+END_MAIN
diff --git a/tests/Box/refinewithcongruence1.cc b/tests/Box/refinewithcongruence1.cc
new file mode 100644
index 0000000..9def123
--- /dev/null
+++ b/tests/Box/refinewithcongruence1.cc
@@ -0,0 +1,197 @@
+/* Test Box::refine_with_congruences(const Congruence_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe Box, zero dimensions and trivial congruence.
+bool
+test01() {
+  Congruence cg(Linear_Expression(0) %= 1);
+  TBox box(0);
+  box.refine_with_congruence(cg);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Universe Box, 4 dimensions and refine with a proper congruence
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence cg(A + B %= 0);
+  TBox box(4);
+  box.refine_with_congruence(cg);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Universe Box in 3D and refine with an equality congruence.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence cg((A %= 7) / 0);
+
+  TBox box(3);
+  box.refine_with_congruence(cg);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box in 1D and refine with an inconsistent proper congruence.
+bool
+test04() {
+  Variable A(0);
+
+  Congruence cg((0*A %= 1) / 2);
+
+  TBox box(1);
+  box.refine_with_congruence(cg);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// refine_with_congruence()
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(A >= 0);
+  cs.insert(B <= 5);
+  cs.insert(B >= 0);
+  cs.insert(C <= 5);
+  cs.insert(C >= 0);
+  cs.insert(D <= 5);
+  cs.insert(D >= 0);
+  TBox box(cs);
+  box.refine_with_congruence((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+
+  Constraint_System known_cs;
+  known_cs.insert(A == 0);
+  known_cs.insert(B == 0);
+  known_cs.insert(C == 0);
+  known_cs.insert(D == 0);
+  Rational_Box known_result(known_cs);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::refine_with_congruence: it is illegal
+    // to refine with a congruence with bigger dimension.
+    box1.refine_with_congruence(x %= 0);
+    box1.refine_with_congruence(y - x + z %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_congruence(c): it is illegal to refine with a
+    // congruence that contains a variable that is not in the space
+    // of the box.
+    box.refine_with_congruence((y %= 0) / 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Box/refinewithcongruences1.cc b/tests/Box/refinewithcongruences1.cc
new file mode 100644
index 0000000..3f4a8d0
--- /dev/null
+++ b/tests/Box/refinewithcongruences1.cc
@@ -0,0 +1,388 @@
+/* Test Box::refine_with_congruences(const Congruence_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe Box constructed from empty congruences
+bool
+test01() {
+  Congruence_System cgs;
+  TBox box(cgs);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences and refine_with_congruences()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  cgs.insert((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+  TBox box(4);
+  box.refine_with_congruences(cgs);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((0*A %= 1) / 2);
+
+  TBox box(1);
+  box.refine_with_congruences(cgs);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences; congruences().
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box, "*** box ***");
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Box constructed from non-empty congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A + B %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// refine_with_congruence()
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TBox box(4);
+  box.refine_with_congruence((1*A + 2*B + 3*C + 4*D %= 0) / 0);
+  box.refine_with_congruence((2*A + 3*B + 4*C + 5*D %= 1) / 0);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box ***");
+
+  return ok;
+}
+
+// Non-empty box; congruences().
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert(B %= 3);
+  cgs.insert(B %= 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Non-empty Box; minimized_congruences().
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((C %= 3) / 5);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(A == 7);
+  known_result.add_constraint(B == 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Empty Box; minimized_congruences().
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 0);
+  cgs.insert((B %= 3) / 0);
+  cgs.insert((A %= 0) / 0);
+  cgs.insert(C %= 7);
+
+  TBox box(3);
+  box.refine_with_congruences(cgs);
+
+  TBox box1(box.minimized_congruences());
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension universe; congruences()
+bool
+test11() {
+  TBox box(0);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+// Zero dimension empty; congruences()
+bool
+test12() {
+  TBox box(0, EMPTY);
+  TBox box1(box.congruences());
+
+  Rational_Box known_result(0, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1(box.congruences()) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::refine_with_congruence: it is illegal
+    // to refine with a congruence with bigger dimension.
+    box1.refine_with_congruence(x %= 0);
+    box1.refine_with_congruence(y - x + z %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_congruences(cs): it is illegal to
+    // refine with a system of congruences that is dimensional incompatible
+    // with the box.
+    Congruence_System cgs;
+    cgs.insert(x - y %= 0);
+    box.refine_with_congruences(cgs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_congruence(c): it is illegal to refine with a
+    // congruence that contains a variable that is not in the space
+    // of the box.
+    box.refine_with_congruence((y %= 0) / 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Box/refinewithconstraint1.cc b/tests/Box/refinewithconstraint1.cc
new file mode 100644
index 0000000..50d9f0f
--- /dev/null
+++ b/tests/Box/refinewithconstraint1.cc
@@ -0,0 +1,151 @@
+/* Test Box::refine_with_constraint(const Constraint&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.refine_with_constraint(A >= 0);
+
+  print_constraints(box, "*** box.refine_with_constraint(A >= 0) ***");
+
+  box.refine_with_constraint(B >= A);
+
+  print_constraints(box, "*** box.refine_with_constraint(B >= A) ***");
+
+  box.refine_with_constraint(11*A < 127);
+
+  print_constraints(box, "*** box.refine_with_constraint(11*A < 127) ***");
+
+  box.refine_with_constraint(7*A - 15*B > 8);
+
+  print_constraints(box, "*** box.refine_with_constraint(7*A - 15*B > 8) ***");
+
+  box.refine_with_constraint(3*B > 2*A);
+
+  print_constraints(box, "*** box.refine_with_constraint(3*B > 2*A) ***");
+
+  box.refine_with_constraint(A == B);
+
+  print_constraints(box, "*** box.refine_with_constraint(A == B) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(7*A > 8);
+  known_result.add_constraint(55*A < 267);
+  known_result.add_constraint(7*B > 8);
+  known_result.add_constraint(55*B < 267);
+
+  bool ok = check_result(box, known_result, "2.33e-6", "1.55e-6", "1.10e-6");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= -2);
+  box.add_constraint(B <= 4);
+
+  print_constraints(box, "*** box ***");
+
+  box.refine_with_constraint(A - 2*B >= 0);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= -4);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.refine_with_constraint(A - 2*B >= 0) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  Constraint_System cs;
+
+  TBox box(1);
+  print_constraints(box, "*** box ***");
+
+  Constraint c(A == 1);
+  print_constraint(c, "*** c ***");
+
+  box.refine_with_constraint(c);
+
+  Rational_Box known_result(1);
+  known_result.add_constraint(A == 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.refine_with_constraint(c) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  TBox box(1);
+  print_constraints(box, "*** box ***");
+
+  Constraint c(Linear_Expression(1) <= 0);
+  print_constraint(c, "*** c ***");
+
+  box.refine_with_constraint(c);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.refine_with_constraint(c) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/refinewithconstraint2.cc b/tests/Box/refinewithconstraint2.cc
new file mode 100644
index 0000000..98934db
--- /dev/null
+++ b/tests/Box/refinewithconstraint2.cc
@@ -0,0 +1,79 @@
+/* Test Box::refine_with_constraint(const Constraint&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+struct Unsigned_Integer_Closed_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Unsigned_Integer_Closed_Interval_Info_Policy> Unsigned_Integer_Closed_Interval_Info;
+
+typedef Interval<unsigned long long, Unsigned_Integer_Closed_Interval_Info>
+Unsigned_Integer_Closed_Interval;
+
+typedef Box<Unsigned_Integer_Closed_Interval> UILL_Box;
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  UILL_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 1);
+
+  print_constraints(box, "*** box ***");
+
+  box.refine_with_constraint(A == B);
+
+  print_constraints(box, "*** box.refine_with_constraint(A == B) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Box/refinewithconstraints1.cc b/tests/Box/refinewithconstraints1.cc
new file mode 100644
index 0000000..2f2de64
--- /dev/null
+++ b/tests/Box/refinewithconstraints1.cc
@@ -0,0 +1,436 @@
+/* Test Box::refine_with_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if defined(__sun) || defined(__sun__)
+
+// Some versions of Solaris define R1 in /usr/include/ia32/sys/reg.h.
+// This conflicts with the use or R1 being made in this proram.
+# undef R1
+
+#endif // defined(__sun) || defined(__sun__)
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 5);
+
+  TBox box(2);
+  box.refine_with_constraints(cs);
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.refine_with_constraint(B - A <= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(2);
+
+  try {
+    // This is an invalid use of method
+    // Box::refine_with_constraint: it is illegal
+    // to add a constraint with bigger dimension.
+    box.refine_with_constraint(x <= 0);
+    box.refine_with_constraint(y - x + z >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_constraints(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    box.refine_with_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    box.refine_with_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(1);
+
+  try {
+    // This is an invalid use of the method
+    // Box::refine_with_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    box.refine_with_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 5);
+  cs.insert(B <= 5);
+
+  TBox box(2);
+  box.refine_with_constraints(cs);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.add_constraints(cs) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variable G1(32);
+  Variable H1(33);
+  Variable I1(34);
+  Variable J1(35);
+  Variable K1(36);
+  Variable L1(37);
+  Variable M1(38);
+  Variable N1(39);
+  Variable O1(40);
+  Variable P1(41);
+  Variable Q1(42);
+  Variable R1(43);
+  Variable S1(44);
+  Variable T1(45);
+  Variable U1(46);
+  Variable V1(47);
+  Variable W1(48);
+  Variable X1(49);
+  Variable Y1(50);
+  Variable Z1(51);
+  Variable A2(52);
+  Variable B2(53);
+  Variable C2(54);
+  Variable D2(55);
+  Variable E2(56);
+  Variable F2(57);
+  Variable G2(58);
+  Variable H2(59);
+  Variable I2(60);
+  Variable J2(61);
+  Variable K2(62);
+  Variable L2(63);
+  Variable M2(64);
+  Variable N2(65);
+  Variable O2(66);
+  Variable P2(67);
+  Variable Q2(68);
+  Variable R2(69);
+  Variable S2(70);
+  Variable T2(71);
+  Variable U2(72);
+  Variable V2(73);
+  Variable W2(74);
+  Variable X2(75);
+  Variable Y2(76);
+  Variable Z2(77);
+  Variable A3(78);
+  Variable B3(79);
+  Variable C3(80);
+  Variable D3(81);
+  Variable E3(82);
+  Variable F3(83);
+  Variable G3(84);
+  Variable H3(85);
+  Variable I3(86);
+  Variable J3(87);
+  Variable K3(88);
+
+  Constraint_System cs;
+  cs.insert(A + F - M1 - O1 - Q1 - S1 == 0);
+  cs.insert(S - U1 - D2 - P2 - V2 == 0);
+  cs.insert(B + G - U1 - X1 - A2 == 0);
+  cs.insert(T - M1 - H2 - R2 - Z2 == 0);
+  cs.insert(C + H - D2 - H2 - L2 == 0);
+  cs.insert(U - O1 - X1 - T2 - D3 == 0);
+  cs.insert(D - P2 - R2 - T2 == 0);
+  cs.insert(V - Q1 - A2 - L2 - H3 == 0);
+  cs.insert(E - V2 - Z2 - D3 - H3 == 0);
+  cs.insert(W - S1 == 0);
+  cs.insert(X - V1 - E2 - W2 == 0);
+  cs.insert(I - V1 - Y1 - B2 == 0);
+  cs.insert(Y - I2 - A3 == 0);
+  cs.insert(J - E2 - I2 - M2 == 0);
+  cs.insert(Z - Y1 - E3 == 0);
+  cs.insert(A1 - B2 - M2 - I3 == 0);
+  cs.insert(K - W2 - A3 - E3 - I3 == 0);
+  cs.insert(B1 == 0);
+  cs.insert(L - N1 - P1 - R1 - T1 == 0);
+  cs.insert(C1 - W1 - F2 - Q2 - X2 == 0);
+  cs.insert(M - W1 - Z1 - C2 == 0);
+  cs.insert(D1 - N1 - J2 - S2 - B3 == 0);
+  cs.insert(N - F2 - J2 - N2 == 0);
+  cs.insert(E1 - P1 - Z1 - U2 - F3 == 0);
+  cs.insert(O - Q2 - S2 - U2 == 0);
+  cs.insert(F1 - R1 - C2 - N2 - J3 == 0);
+  cs.insert(P - X2 - B3 - F3 - J3 == 0);
+  cs.insert(G1 - T1 == 0);
+  cs.insert(H1 - G2 - Y2 == 0);
+  cs.insert(I1 - K2 - C3 == 0);
+  cs.insert(Q - G2 - K2 - O2 == 0);
+  cs.insert(J1 - G3 == 0);
+  cs.insert(K1 - O2 - K3 == 0);
+  cs.insert(R - Y2 - C3 - G3 - K3 == 0);
+  cs.insert(L1 == 0);
+  cs.insert(A >= 0);
+  cs.insert(-A >= -100);
+  cs.insert(B >= 0);
+  cs.insert(-B >= -100);
+  cs.insert(C >= 0);
+  cs.insert(-C >= -90);
+  cs.insert(D >= 0);
+  cs.insert(-D >= -50);
+  cs.insert(E >= 0);
+  cs.insert(-E >= -10);
+  cs.insert(F >= 0);
+  cs.insert(-F >= -200);
+  cs.insert(G >= 0);
+  cs.insert(-G >= -100);
+  cs.insert(H >= 0);
+  cs.insert(I >= 0);
+  cs.insert(-I >= -25);
+  cs.insert(J >= 0);
+  cs.insert(-J >= -10);
+  cs.insert(K >= 0);
+  cs.insert(L >= 0);
+  cs.insert(-L >= -50);
+  cs.insert(M >= 0);
+  cs.insert(-M >= -40);
+  cs.insert(N >= 0);
+  cs.insert(-N >= -20);
+  cs.insert(O >= 0);
+  cs.insert(-O >= -5);
+  cs.insert(P >= 0);
+  cs.insert(Q >= 0);
+  cs.insert(-Q >= -30);
+  cs.insert(R >= 0);
+  cs.insert(S >= 100);
+  cs.insert(T >= 100);
+  cs.insert(U >= 90);
+  cs.insert(V >= 50);
+  cs.insert(W >= 10);
+  cs.insert(X >= 20);
+  cs.insert(Y >= 25);
+  cs.insert(Z >= 10);
+  cs.insert(A1 >= 15);
+  cs.insert(B1 >= 5);
+  cs.insert(C1 >= 50);
+  cs.insert(D1 >= 40);
+  cs.insert(E1 >= 20);
+  cs.insert(F1 >= 5);
+  cs.insert(G1 >= 15);
+  cs.insert(H1 >= 20);
+  cs.insert(I1 >= 25);
+  cs.insert(J1 >= 30);
+  cs.insert(K1 >= 20);
+  cs.insert(L1 >= 10);
+  cs.insert(M1 >= 0);
+  cs.insert(N1 >= 0);
+  cs.insert(O1 >= 0);
+  cs.insert(P1 >= 0);
+  cs.insert(Q1 >= 0);
+  cs.insert(R1 >= 0);
+  cs.insert(S1 >= 0);
+  cs.insert(T1 >= 0);
+  cs.insert(U1 >= 0);
+  cs.insert(V1 >= 0);
+  cs.insert(W1 >= 0);
+  cs.insert(X1 >= 0);
+  cs.insert(Y1 >= 0);
+  cs.insert(Z1 >= 0);
+  cs.insert(A2 >= 0);
+  cs.insert(B2 >= 0);
+  cs.insert(C2 >= 0);
+  cs.insert(D2 >= 0);
+  cs.insert(E2 >= 0);
+  cs.insert(F2 >= 0);
+  cs.insert(G2 >= 0);
+  cs.insert(H2 >= 0);
+  cs.insert(I2 >= 0);
+  cs.insert(J2 >= 0);
+  cs.insert(K2 >= 0);
+  cs.insert(L2 >= 0);
+  cs.insert(M2 >= 0);
+  cs.insert(N2 >= 0);
+  cs.insert(O2 >= 0);
+  cs.insert(P2 >= 0);
+  cs.insert(Q2 >= 0);
+  cs.insert(R2 >= 0);
+  cs.insert(S2 >= 0);
+  cs.insert(T2 >= 0);
+  cs.insert(U2 >= 0);
+  cs.insert(V2 >= 0);
+  cs.insert(W2 >= 0);
+  cs.insert(X2 >= 0);
+  cs.insert(Y2 >= 0);
+  cs.insert(Z2 >= 0);
+  cs.insert(A3 >= 0);
+  cs.insert(B3 >= 0);
+  cs.insert(C3 >= 0);
+  cs.insert(D3 >= 0);
+  cs.insert(E3 >= 0);
+  cs.insert(F3 >= 0);
+  cs.insert(G3 >= 0);
+  cs.insert(H3 >= 0);
+  cs.insert(I3 >= 0);
+  cs.insert(J3 >= 0);
+  cs.insert(K3 >= 0);
+  print_constraints(cs, "*** cs ***");
+
+  TBox box(cs.space_dimension());
+  box.refine_with_constraints(cs);
+
+  bool ok = box.is_empty();
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST_F8(test07);
+END_MAIN
diff --git a/tests/Box/refinewithconstraints2.cc b/tests/Box/refinewithconstraints2.cc
new file mode 100644
index 0000000..3e30eda
--- /dev/null
+++ b/tests/Box/refinewithconstraints2.cc
@@ -0,0 +1,447 @@
+/* Test Box::refine_with_constraints(const Constraint_System&) with
+   instances that may require a watchdog timer.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+namespace {
+
+class Timeout : virtual public std::exception,
+                public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "Timeout in refine1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  Timeout() {
+  }
+
+  ~Timeout() throw() {
+  }
+};
+
+Timeout t;
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= -5);
+  cs.insert(A <= 5);
+  cs.insert(A == B);
+  cs.insert(A == 2*B);
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+  print_constraints(known_result, "*** known_result ***");
+
+  TBox box(2);
+
+  bool ok = false;
+
+  typedef TBox::interval_type::boundary_type boundary_type;
+  if (std::numeric_limits<boundary_type>::is_exact
+      && !std::numeric_limits<boundary_type>::is_integer) {
+    // With interval boundaries made of rational numbers, this
+    // refinement instance does not terminate: we use a watchdog timer.
+    try {
+      // Set a 0.1 seconds timeout.
+      Parma_Polyhedra_Library::Watchdog
+        w(10, abandon_expensive_computations, t);
+
+      box.refine_with_constraints(cs);
+
+      // We should never get here.
+      abandon_expensive_computations = 0;
+      nout << "unexpected termination" << endl;
+      ok = false;
+    }
+    catch (const Timeout&) {
+      abandon_expensive_computations = 0;
+      nout << "timeout, as expected" << endl;
+
+      // The box will have been shrunk, nonetheless.
+      ok = check_result(box, known_result, "1.0e-6", "1.0e-6", "1.0e-6");
+    }
+    catch (...) {
+      abandon_expensive_computations = 0;
+      nout << "unexpected exception" << endl;
+      ok = false;
+    }
+  }
+  else {
+    // With interval boundaries other than rational numbers, this instance
+    // of refinement terminates rather quickly: no timer is necessary.
+    box.refine_with_constraints(cs);
+
+    ok = check_result(box, known_result, "5.61e-45", "2.81e-45", "1.41e-45");
+  }
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  std::stringstream ss;
+  ss.str("topology NECESSARILY_CLOSED\n"
+         "175 x 80 (not_sorted)\n"
+         "index_first_pending 175\n"
+         "0 -292733975779082240 -24769797950537728 -3602879701896397 -20266198323167232 -6755399441055744 -27021597764222976 -14861878770322636 -26120877838748876 0 49539595901075456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 -18014398509481984 -12249790986447750 0 -4863887597560136 -2161727821137838 -3422735716801577 -1261007895663739 -9007199254740992 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 18014398509481984 17293822569102704 0 17473966554197524 6485183463413514 6305039478318694 5224175567749775 11168927075878830 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 9007199254740992 9007199254740992 7025615418697974 9007199254740992 8556839292003942 8016407336719483 8736983277098762 8827055269646172 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 219325301852943168 189151184349560832 197933203622933312 220451201759785792 136459068709326032 213470622337361504 220451201759785792 217298682020626432 4728779608739021 -225179981368524800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 449909602774312576 396767127171340672 373348409109014144 451711042625260736 343624651568368832 435047724003989888 451711042625260736 441803123445045632 3152519739159347 -450359962737049600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 94237822202727632 89396452603304352 83992133050459744 106960491150049280 77236733609404000 94350412193411888 106960491150049280 90972712472884016 2589569785738035 -101330991615836160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 5981343255101440 5854679515581645 5671720780719718 6896136929411072 5404319552844595 6108006994621235 6896136929411072 5735052650479616 70368744177664 -6333186975989760 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 -292733975779082240 -24769797950537728 -3602879701896397 -6755399441055744 -12159718993900340 -26120877838748876 0 49539595901075456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 -18014398509481984 -10268207150404730 0 -2161727821137838 -2341871806232658 -8286623314361713 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 576460752303423488 576460752303423488 5764607523034235 207525870829232448 161409010644958592 386228704043293760 0 -288230376151711744 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 8827055269646172 8556839292003942 7115687411245384 9007199254740992 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 13707831365808948 11821949021847552 12370825226433332 8528691794332877 10963450342880052 13581167626289152 492581209243648 -12525636463624192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 224954801387156288 198383563585670336 186674204554507072 171812325784184416 183296504833979200 220901561722522816 4278419646001971 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 188475644405455264 178792905206608704 167984266100919488 154473467218808000 158977066846178496 181945424945768032 7656119366529843 -184647584722190336 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 382805968326492160 374699488997225280 362990129966061952 345876451382054080 333266372425416704 367043369630695424 8106479329266893 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -78812993478983680 -10696049115004928 -3039929748475085 -12159718993900340 -1688849860263936 -6980579422424269 -6755399441055744 -5066549580791808 -6192449487634432 -7318349394477056 0 12384898975268864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -18014398509481984 -12610078956637388 -2341871806232658 -17473966554197524 -2161727821137838 -3422735716801577 -3422735716801577 -4863887597560136 -12249790986447750 -8646911284551352 0 9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 7475975381435023 2522015791327478 9007199254740992 3242591731706757 3152519739159347 3152519739159347 8736983277098762 8646911284551352 5044031582654956 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7115687411245384 9007199254740992 8556839292003942 8016407336719483 8016407336719483 9007199254740992 9007199254740992 8736983277098762 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220226021778417248 200635363399355584 175415205486080832 190502264237771968 136459068709326032 215947602132415296 213470622337361504 220451201759785792 189151184349560832 217298682020626432 4278419646001971 -225179981368524800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 921436483760003456 828662331436171264 733186019335916800 807945773150267008 687249303136737664 879102647262720768 870095448007979776 903422085250521472 793534254342681344 874599047635350272 8106479329266893 -900719925474099200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 213470622337361504 174289305579238208 158977066846178496 188250464424086720 154473467218808000 192303704088720192 188700824386823776 213920982300098560 178792905206608704 185097944684927392 5404319552844595 -202661983231672320 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 898918485623150976 721476660304753408 666532744850833408 805243613373844736 691752902764108160 790832094566259072 781824895311518080 882705526964617216 749398977994450560 750299697919924608 8106479329266893 -810647932926689280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -78812993478983680 -10696049115004928 -3039929748475085 -12159718993900340 -6980579422424269 -7318349394477056 -1688849860263936 -6192449487634432 0 12384898975268864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -36028797018963968 -24499581972895500 -3242591731706757 -33506781227636492 -5404319552844595 -16212958658533786 -4323455642275676 -24499581972895500 0 18014398509481984 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18014398509481984 16212958658533786 6665327448508334 18014398509481984 8106479329266893 11349071060973650 6485183463413514 17293822569102704 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 8286623314361713 9007199254740992 8827055269646172 9007199254740992 8556839292003942 9007199254740992 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 220226021778417248 200635363399355584 175415205486080832 190502264237771968 215947602132415296 217298682020626432 136459068709326032 189151184349560832 8782019273372467 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 230359120940000864 207165582859042816 183296504833979200 201986443287566752 219775661815680192 218649761908837568 171812325784184416 198383563585670336 3152519739159347 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6670956948042547 5446540799351194 4968033338943078 5882827013252710 6009490752772506 5784310771403981 4827295850587750 5587278287706522 246290604621824 -5770237022568448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 449459242811575488 360738330152376704 333266372425416704 402621806686922368 395416047283129536 375149848959962304 345876451382054080 374699488997225280 5854679515581645 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -252201579132747776 -8106479329266893 -6305039478318694 -47738156050127256 -11258999068426240 -51791395714760704 -6755399441055744 -18915118434956084 -19365478397693132 0 45035996273704960 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -72057594037927936 0 0 -48999163945791000 0 -55484347409204512 -8646911284551352 -5764607523034235 -5044031582654956 0 36028797018963968 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18014398509481984 0 0 15672526703249326 0 16753390613818246 6485183463413514 5404319552844595 4863887597560136 0 -9007199254740992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 4863887597560136 9007199254740992 5854679515581645 9007199254740992 8556839292003942 8196551321814303 8106479329266893 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223828901480313664 197933203622933312 194105143939668384 224954801387156288 201761263306198208 179018085187977216 136459068709326032 224054081461682176 228332501107684160 3602879701896397 -227431781182210048 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 463870761619161088 412529725867137408 405323966463344640 452161402587997824 412980085829874496 383256328289229184 343624651568368832 449909602774312576 457115362178105344 3602879701896397 -454863562364420096 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6804657561980109 6199486362052198 6192449487634432 5685794529555251 5580241413288755 5643573283048653 4827295850587750 6164301989963366 6262818231812096 140737488355328 -6403555720167424 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 455764282289894208 414331165718085632 411178645978926272 367944089556169536 369745529407117696 388210287879336768 345876451382054080 400820366835974144 406224686388818752 3602879701896397 -409827566090715136 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -126100789566373888 -23869078025063628 -5629499534213120 -8106479329266893 -25895697857380352 -4503599627370496 -32876277279804620 -13735978863480012 -9457559217478042 0 24769797950537728 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -144115188075855872 -56204923349583792 0 -38911100780481088 -105204087295374784 0 -144115188075855872 -47558012065032440 -5764607523034235 0 72057594037927936 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 0 9007199254740992 8827055269646172 3422735716801577 9007199254740992 5854679515581645 3242591731706757 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7836263351624663 9007199254740992 9007199254740992 9007199254740992 9007199254740992 9007199254740992 8827055269646172 0 -8106479329266893 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110000420898524368 110563370851945680 98966601811466656 88720912659198768 88045372715093200 75322703767771552 84104723041144016 79601123413773520 110113010889208624 3715469692580659 -100205091708993536 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226531061256735936 220676381741154304 201085723362092640 186223844591770016 186223844591770016 160778506697126720 179693625132082784 170911605858710336 219550481834311680 3602879701896397 -200410183417987072 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106397541196627968 88495732677830240 86806882817566304 84555083003881056 87820192733724672 76110833702561376 87032062798934832 78362633516246624 96151852044360096 4728779608739021 -92323792361095168 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 443604563295993856 355784370562269184 357585810413217408 362539770003324928 376050568885436416 332365652499942592 373798769071751168 339121051940998336 388660647842073792 7656119366529843 -369295169444380672 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "7 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "7 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "31525197391593472 0 0 0 0 -4503599627370496 -4953959590107546 -5404319552844595 0 0 0 0 0 0 0 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "21 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "31525197391593472 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4503599627370496 -5404319552844595 -4953959590107546 0 0 0 0 0 0 0 0 0 0 -4953959590107546 0 -4503599627370496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 >=\n"
+         "10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 >=\n"
+         "17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 >=\n"
+         "58546795155816448 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -4503599627370496 -4953959590107546 -5404319552844595 0 0 0 0 0 0 0 0 0 0 -4953959590107546 0 0 0 0 0 0 0 0 0 0 0 -4953959590107546 -5404319552844595 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 >=\n"
+         "3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 >=\n"
+         "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 >=\n"
+         "1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "-15 0 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-15 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-20 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "-15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 =\n"
+         "1 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -126100789566373888 -23869078025063628 -5629499534213120 -8106479329266893 -25895697857380352 -4503599627370496 -32876277279804620 -9457559217478042 -9682739198846566 0 22517998136852480 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -144115188075855872 -56204923349583792 0 -38911100780481088 -105204087295374784 0 -144115188075855872 -5764607523034235 -10088063165309912 0 72057594037927936 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 0 9007199254740992 8827055269646172 3422735716801577 9007199254740992 3242591731706757 2431943798780068 0 -4503599627370496 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9007199254740992 9007199254740992 7836263351624663 9007199254740992 9007199254740992 9007199254740992 9007199254740992 8827055269646172 8106479329266893 0 -8106479329266893 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 110000420898524368 110563370851945680 98966601811466656 88720912659198768 88045372715093200 75322703767771552 84104723041144016 110113010889208624 114166250553842080 3715469692580659 -101330991615836160 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 226531061256735936 220676381741154304 201085723362092640 186223844591770016 186223844591770016 160778506697126720 179693625132082784 219550481834311680 228557681089052672 3602879701896397 -202661983231672320 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106397541196627968 88495732677830240 86806882817566304 84555083003881056 87820192733724672 76110833702561376 87032062798934832 96151852044360096 100205091708993536 4728779608739021 -93449692267937792 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 443604563295993856 355784370562269184 357585810413217408 362539770003324928 376050568885436416 332365652499942592 373798769071751168 388660647842073792 406224686388818752 7656119366529843 -373798769071751168 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 3 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 -1 =\n"
+         "0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 >=\n"
+         "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 >=\n");
+  Constraint_System cs;
+  cs.ascii_load(ss);
+  print_constraints(cs, "*** cs ***");
+
+  Rational_Box known_result(cs.space_dimension());
+  ss.str("+EUP -EM -UN space_dim 79\n"
+         "[0, 10314880348817334512601175099915806371166908797205087714999656461/4472327120746785297653956552193407232008520545204266972149396275]\n"
+         "[0, 13845204640026631030889305159390169337029989311711657705741484032/5852044125547558797457743823140996705204670473363875812631956685]\n"
+         "[0, 6922602320013315515444652579695084668514994655855828852870742016/4472327120746785297653956552193407232008520545204266972149396275]\n"
+         "[0, 1]\n"
+         "[0, 183286621582592395603923918336706397030221465067768516480006942467094251874476342276273313773966732258762031104/201947514318058825266405552296969018502505571136310660027103675348978638253530036293093560899136162654074928785]\n"
+         "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/288082953845409310261586095056492490791362249192985502452443896193756261634064606718440121711088142441174012160]\n"
+         "[2686500548319859668267236271679836106854450377612806461753177278269968849965950567943501971086918159087023381675088683299453183/778446170153986271646293722222758610239588615644139185506718044413398598788584196557239652607927138993387106707838558560137600, 31525197391593472/5404319552844595]\n"
+         "[808260464002815979451978388304660281069312131948424687841199686824624428575770834454261530624/151009237862627616327241484028267709860068350280703545777427164042459931581501950526059886939, 73859033888876134/5404319552844595]\n"
+         "[226618556208645903758643992043214159409275947657289604887186627910330909797925643152677900801504922848811608768/10961195840757945196265067281093921849892738542919421265335678633895419160365563327020735054453549917239687515, 79624855970192365478639383910721447943227661124538323699857998144/1170408825109511759491548764628199341040934094672775162526391337]\n"
+         "[15, 26541618656730788492879794636907149314409220374846107899952666048/1170408825109511759491548764628199341040934094672775162526391337]\n"
+         "[0, 8985486280088112100506563167484159198795208954754480462056795993/1170408825109511759491548764628199341040934094672775162526391337]\n"
+         "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/139580617693730330144431108207543093864914258318465321284436138492151206127797310314742739840929485352303263010]\n"
+         "[0, 303804758953955866721752289291478575769374180673152882292480754701942640399851473710715528744543627330227738410675228287069127359/114636083423731409790347440941157613447471749368242157860749224890585062371407435860707842957895607705984937192636439527142281664]\n"
+         "[0, 7]\n"
+         "[0, 7]\n"
+         "[0, 748667973775216965289800480279583789489744816759688735086770433008145914407394803991979991720232554703997362949/386268417790710553084111681668112997768232491914126126127983236005267549264797679992985537041321412971263426560]\n"
+         "[0, 3]\n"
+         "[0, 177573125946037698558604385378801413571089307288393133079217002458991879409204238029/17892588555239238988473154459237463544171166888738351339728888719297576255502553600]\n"
+         "[25839794736957542736653447787390098039029695261748271831543709793310100059819748166779436608293786761483582251489687769847889922549/3692318603621377070171731880846638790832352647482537903463700684578188218693428418242417440634684128553797348741645618454197176800, 60]\n"
+         "[15, 20]\n"
+         "[0, 72409676610081820024337606323284033316057667404425726484298112/61528739464365799250640879039394801804157129845741815314149415]\n"
+         "[0, 215364736487606238026344927308510412614242449964/134794645266934963747177709084220527189140255405]\n"
+         "[0, 2061072662362948098854568832072986384021826066051896235110957056/3670355764874540374735204645644094629677039803631891367408505105]\n"
+         "[0, 515268165590737024713642208018246596005456516512974058777739264/430701176250560594754486153275763612629099908920192707199045905]\n"
+         "[0, 3661200520289306046447863764244677014442121649388/8769571208077881580806264580025357648475702951979]\n"
+         "[0, 31525197391593472/5404319552844595]\n"
+         "[0, 15762598695796736/2476979795053773]\n"
+         "[0, 1]\n"
+         "[0, 915300130072326511611965941061169253610530412347/914192110113563926269710132379456852481344786795]\n"
+         "[100569907736012592200176731907593393653603286897200373375948598819289159112952295415766216387512943/146346253870074105858602763694412510197753270126660267092506527819743231998370774150586226021951840, 1423138307257267058304665020078992042801252847756788883057586059/184586218393097397751922637118184405412471389537225445942448245]\n"
+         "[14869667571313552605650378924578127204258391821680034719538033247871471932211925243936500890280188256699229259926555073134812416/718752927277209687656244167506910570008434195163317640707227921525181116141905353375202615336471652237552905414680120645944371, 21857749969521291174186682493347326296602048361498167335484176256/430701176250560594754486153275763612629099908920192707199045905]\n"
+         "[8570646096554564291866668301938830916818802465337146975839074062/1170408825109511759491548764628199341040934094672775162526391337, 21857749969521291174186682493347326296602048361498167335484176256/1292103528751681784263458459827290837887299726760578121597137715]\n"
+         "[0, 8797647701304867238000079012369780913937948508972739599385139620161632864004094691936722362939144743295396038778/1399148734839437673237156659726880257722168016620759104314518136891683218621465660068206424960522725506715274445]\n"
+         "[0, 2669624945007775364069874412248427045229215715349940210565159012362111738459851082209412940870318845779551526695718690690481550044170778794259142059204115616411333581967780864779/1708360668329758714025236540492916320511806002258624502201417631387139555375059087959692708852788041301919137087636450154229857124447755653498823376904941199764632073673925197824]\n"
+         "[0, 3]\n"
+         "[0, 3]\n"
+         "[0, 3]\n"
+         "[0, 4398823850652433619000039506184890456968974254486369799692569810080816432002047345968361181469572371647698019389/1157782275275578837083828258845188344809959076054449796563020342561686251725343246520483048742598889585601640032]\n"
+         "[0, 177573125946037698558604385378801413571089307288393133079217002458991879409204238029/17892588555239238988473154459237463544171166888738351339728888719297576255502553600]\n"
+         "[0, 4398823850652433619000039506184890456968974254486369799692569810080816432002047345968361181469572371647698019389/1052529341159617039636766879026295001378528414597855069798212223052291123121300381836309227297285312255918866432]\n"
+         "[0, 7]\n"
+         "[0, 1498223798318303919831024844733424211709929066732763569681630325246353050135890887826963426113547608433634486015043774792176591439896471154476282777/26847311172107165218056405640147044592053233844602064424295328321862465989246561483111745735713688610433228398430982602027530225437614337760952320]\n"
+         "[0, 499407932772767973277008281577808070569976355577587856560543441748784350045296962608987808704515869477878162005014591597392197146632157051492094259/26847311172107165218056405640147044592053233844602064424295328321862465989246561483111745735713688610433228398430982602027530225437614337760952320]\n"
+         "[0, 5]\n"
+         "[1088990638376279656349232564077841878585326883393145232156543106725860769701036461875975422248087277562164759965636299994676381419779389192434465452555574437/2258962538374806529068089961097446198274435865824587927247946112063701506797953147532001062632455227539779726419333176316008587778726957833593452101170626560, 7771524006488802993376382138936142531043834044589401854804790150420533543300059/4977137688523269900666388869765991278013084676989364557386155543450133944795744]\n"
+         "[0, 3/2]\n"
+         "[0, 3/2]\n"
+         "[1344731246397095180937221057427674208422663814958361282355618977488441268849128875802333363211497752676459590600393921949694634262748267846174416688274480521783/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400, 2926486520230784671697951406927216601955418993295/524827521561835640889301183905776373669342216192]\n"
+         "[0, 8098698173131643610422973994024390152024259063050436511914034781041627844575232/7928431521824465019198574989109348959534008394399277106209182654398428320014455]\n"
+         "[255625743144916938376557465993431512631549899985942527668219134605026453252022742017194652158692271084961998287730522703741817071443625417096646865856016016637/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880, 7170392166438080056989470254311656820039851912472813793909407744/2245971024645116171876361734571755974833113225752842920420057075]\n"
+         "[0, 226537011835850170920922349483199724532147106658753468864728245623542037610496/295286773686929687042241100901562780978972101417629942418684891714427504870407]\n"
+         "[0, 29273397577908224/2476979795053773]\n"
+         "[0, 58546795155816448/5404319552844595]\n"
+         "[4886121758410660121399898393468498287761348147836794297860689782559815498292668383511688347221116029983439921364194244223876464951616007309127944670355058347958525880280511104/161787872311589039754537174148841335581508847196926049073414475652896143384975252871620319949599560382345933056706166004377459069700243126385807323566214512647413320655096595, 60]\n"
+         "[19185326995483886226743054182167824240505411823442442486905223117672031508425218509427406136271309766838909450122/1399148734839437673237156659726880257722168016620759104314518136891683218621465660068206424960522725506715274445, 20]\n"
+         "[0, 538537423212680385284373989330528551512140313847671962569697057921440092965209437981361342634620164343644389826716557499329872961929701779022177574622920411231181548734688467653205269453086868420694127457409/216325670355300629343398793111970587004244916598977668851214602484751463124754806790692265920288849668696149072929310323627620010574599881816934452674152407689569704749716632512928181545672403224920682659840]\n"
+         "[0, 8530429548948577812392471568766864753432684932156578782588494538357728952510598196566154421789823375667005355303957367615430968404251800329750037977078972822217/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400]\n"
+         "[0, 10]\n"
+         "[0, 3/2]\n"
+         "[0, 12227674224491803626313043714346181343779060314673535520783949892529360855505503390416812664545409703371081188658346474560138706204060423720825144460158631811843/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880]\n"
+         "[0, 3/2]\n"
+         "[0, 1]\n"
+         "[0, 1]\n"
+         "[0, 5015518816216880836227562971795126288850074754377521725169510371984550419411570290926991422560225824756813804684469870576416363836800284814252084824351761391267887183715721855/939707401646611517828337186389124783204238566165786389129683484730581046324608742585765514020780418411169290173914166419503216856559045828015278273579257936090154907695639808]\n"
+         "[0, 60]\n"
+         "[103329071798316531709026909095463703501013053247478398826357779304145021771658399939262244128683394924564952448387225814185493208137888063349687824244782667478861/79269283303952994524846315029296066792799612173049976075893590468760030484709218718674284127122889338165671718089949371224177700480858989945121469063628471664640, 20]\n"
+         "[0, 5]\n"
+         "[0, 20]\n"
+         "[0, +inf)\n"
+         "[0, 8530429548948577812392471568766864753432684932156578782588494538357728952510598196566154421789823375667005355303957367615430968404251800329750037977078972822217/987516079534567299332969262619453896185534874711494006494411351584617022135972707236848778500132112834346494590435128956512560266700006817592445466535345334400]\n"
+         "[0, 10]\n"
+         "[0, 3/2]\n"
+         "[0, 12227674224491803626313043714346181343779060314673535520783949892529360855505503390416812664545409703371081188658346474560138706204060423720825144460158631811843/1468623525604320066434070727098777983107130613489350358641431650251104389265591309698118507847541408759534492581891411442809473326529888133873151920707605626880]\n"
+         "[0, 3/2]\n"
+         "[0, 1]\n"
+         "[0, 5015518816216880836227562971795126288850074754377521725169510371984550419411570290926991422560225824756813804684469870576416363836800284814252084824351761391267887183715721855/939707401646611517828337186389124783204238566165786389129683484730581046324608742585765514020780418411169290173914166419503216856559045828015278273579257936090154907695639808]\n"
+         "[0, 1003103763243376167245512594359025257770014950875504345033902074396910083882314058185398284512045164951362760936893974115283272767360056962850416964870352278253577436743144371/205027069450169761565873382712224453082020642139182002012346602023286123956967691684038960374515291662700700381411197137724083103996816374687476082968091232453611203577584512]\n"
+         "[0, +inf)\n"
+         "[0, +inf)\n");
+  known_result.ascii_load(ss);
+  print_constraints(known_result, "*** known_result ***");
+
+  TBox box(cs.space_dimension());
+
+  bool ok = false;
+
+  typedef TBox::interval_type::boundary_type boundary_type;
+  if (std::numeric_limits<boundary_type>::is_exact
+      && !std::numeric_limits<boundary_type>::is_integer) {
+    // With interval boundaries made of rational numbers, this
+    // refinement instance either does not terminate or terminates
+    // very slowly: we use a watchdog timer.
+    try {
+      // Set a 0.5 seconds timeout.
+      Parma_Polyhedra_Library::Watchdog
+        w(50, abandon_expensive_computations, t);
+
+      box.refine_with_constraints(cs);
+
+      // We should never get here.
+      abandon_expensive_computations = 0;
+      nout << "unexpected termination" << endl;
+      ok = false;
+    }
+    catch (const Timeout&) {
+      abandon_expensive_computations = 0;
+      nout << "timeout, as expected" << endl;
+
+      // The box will have been shrunk, but no bounds on the distances
+      // can be set: we check containment though.
+      ok = check_result(box, known_result, "+inf", "+inf", "+inf");
+    }
+    catch (...) {
+      abandon_expensive_computations = 0;
+      nout << "unexpected exception" << endl;
+      ok = false;
+    }
+  }
+  else {
+    // With interval boundaries other than rational numbers, this instance
+    // of refinement terminates: no timer is necessary.
+    box.refine_with_constraints(cs);
+
+    ok = check_result(box, known_result, "624", "158", "121");
+  }
+
+  print_constraints(box, "*** box.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+// Temporarily set to always fail: this is meant to be a test for
+// constraint propagation, rather than syntactical refinement.
+//  DO_TEST(test01);
+  DO_TEST_F(test01);
+  // Temporarily always failing.
+  // (Wait for ascii_dump/load to stabilize before correct/restore test.)
+  // DO_TEST_F32(test02);
+  DO_TEST_F(test02);
+END_MAIN
diff --git a/tests/Box/relations1.cc b/tests/Box/relations1.cc
new file mode 100644
index 0000000..af5a5a2
--- /dev/null
+++ b/tests/Box/relations1.cc
@@ -0,0 +1,465 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TBox box(2, EMPTY);
+
+  Poly_Con_Relation rel = box.relation_with(A >= 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(y <= -1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // Variable x(0);
+  Variable y(1);
+  // Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(y <= 1);
+
+  Constraint c(y >= 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // Variable x(0);
+  // Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(z >= 1);
+
+  Constraint c(z >= 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 1);
+
+  Constraint c(x >= 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x == 1);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x == 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x >= 3);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x <= 3);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x == 2);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x <= 3);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(-x >= 2);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // The zero-dim universe box.
+  TBox box;
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) >= 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable x(0);
+  // Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 1);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(x == 1);
+  box.add_constraint(y <= 0);
+  box.add_constraint(z >= 2);
+
+  Constraint c(x > 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  print_constraint(c, "*** c ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x == 0);
+  box.add_constraint(y >= 1);
+
+  Poly_Con_Relation rel = box.relation_with(-y >= -1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(-y >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = box.relation_with(y > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(y > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box(3);
+  box.add_constraint(y <= 3);
+
+  Poly_Con_Relation rel = box.relation_with(-y >= -4);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A <= 0);
+  box.add_constraint(A >= -2);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) >= -1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // We verify that a generator is not subsumed by an empty box.
+  Variable x(0);
+
+  TBox box(2, EMPTY);
+
+  Generator g = point(x);
+  Poly_Gen_Relation rel = box.relation_with(g);
+
+  print_constraints(box, "*** box ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(v(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // We verify that a zero-dimensional generator is subsumed
+  // by a zero-dimensional, universal box.
+  TBox box;
+
+  Generator g = point();
+  Poly_Gen_Relation rel = box.relation_with(g);
+
+  print_constraints(box, "*** box ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/relations2.cc b/tests/Box/relations2.cc
new file mode 100644
index 0000000..bd1833d
--- /dev/null
+++ b/tests/Box/relations2.cc
@@ -0,0 +1,442 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // The zero-dim universe BDS.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(0) > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // The zero-dim universe box.
+  TBox box(0);
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  // An empty box.
+  TBox box(1);
+  box.add_constraint(Linear_Expression(0) >= 1);
+
+  Variable A(0);
+
+  Poly_Con_Relation rel = box.relation_with(A > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 0) = " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A == 3);
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A <= 3);
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A <= 1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A - B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(B > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+
+  TBox box(1);
+  box.add_constraint(A >= 0);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) >= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 2);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B >= 2);
+  box.add_constraint(C <= 1);
+
+  Poly_Con_Relation rel = box.relation_with(Linear_Expression(1) == 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(1 == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel1 = box.relation_with(point(B));
+  Poly_Gen_Relation rel2 = box.relation_with(point(-B));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(point(B)) == " << rel1 << endl;
+  nout << "box.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = box.relation_with(ray(-A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = box.relation_with(line(A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = box.relation_with(closure_point(A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(closure_point(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 2);
+  box.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = box.relation_with(ray(A + B));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(ray(A + B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  // The system of constraints of the box contains only
+  // an equality and the generator `g' is a point.
+  Variable A(0);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+
+  Poly_Gen_Relation rel = box.relation_with(point(2*A));
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // The relation is on a variable (B) other than the first.
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(B >= 0);
+
+  Poly_Con_Relation rel = box.relation_with(B > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(B > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/relations3.cc b/tests/Box/relations3.cc
new file mode 100644
index 0000000..4a20c8a
--- /dev/null
+++ b/tests/Box/relations3.cc
@@ -0,0 +1,402 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A == 3);
+  TBox box(2);
+  box.add_constraints(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B > 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A <= 3);
+  TBox box(2);
+  box.add_constraints(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B >= 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == 7);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == 7) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == -1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A < 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B == 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B == 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B >= 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B <= 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B <= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 3);
+  cs.insert(B == 3);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B <= 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B <= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + 2*B > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + 2*B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A > 1);
+  cs.insert(B > 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B > 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B <= -1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(2*B - 3*A  > 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(2*B - 3*A  > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = box.relation_with(A - C - B <= 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A - C - B <= 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(1);
+  box.add_constraint(A >= 1);
+
+  Poly_Con_Relation rel = box.relation_with(A == 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A == 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(B >= 1);
+
+  Constraint c(A == 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "--- oc ---");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 4);
+  box.add_constraint(B >= 1);
+  box.add_constraint(B <= 4);
+
+  Constraint c(A == 1);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "--- oc ---");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Box/relations4.cc b/tests/Box/relations4.cc
new file mode 100644
index 0000000..342d2f3
--- /dev/null
+++ b/tests/Box/relations4.cc
@@ -0,0 +1,487 @@
+/* Test Box::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A == 3);
+  TBox box(2);
+  box.add_constraints(cs);
+
+  Poly_Con_Relation rel = box.relation_with(A + B %= 3);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + B %= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 2) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 2) / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= -7) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 7 / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A < 3);
+  cs.insert(A >= 0);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 6) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 6 / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 3);
+  cs.insert(B <= 3);
+  cs.insert(B >= 3);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 6);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 0) / 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+
+  TBox box(0);
+
+  Poly_Con_Relation rel = box.relation_with((Linear_Expression(1) %= 0) / 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((Linear_Expression(1) %= 0) / 2) == "
+       << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+
+  Poly_Con_Relation rel = box.relation_with(A - 2*B %= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(A + 2*B %= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A > 0);
+  cs.insert(3*A < 1);
+  cs.insert(B < 1);
+  cs.insert(2*B > 1);
+
+  TBox box(cs);
+
+  Poly_Con_Relation rel = box.relation_with(2*B - 3*A  %= 1);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(2*B - 3*A  %= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  // The zero-dim universe box.
+  TBox box(0);
+
+  Congruence c(Linear_Expression(0) == 0);
+  Poly_Con_Relation rel = box.relation_with(c);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 %= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 1);
+  box.add_constraint(B == 0);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 2);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A %= 2) / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 1);
+  box.add_constraint(A <= 2);
+  box.add_constraint(B >= 1);
+  box.add_constraint(B <= 2);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A %= 2) / 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A >= 4);
+  box.add_constraint(A <= 7);
+  box.add_constraint(B == 0);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 2) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 2) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B == 0);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    = Poly_Con_Relation::is_included() && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A - 2*B %= -9) / 8);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 4) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(A == 6);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 24) / 5);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(3*A >= 1);
+  box.add_constraint(7*A <= 20);
+  box.add_constraint(11*B >= 5);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 9);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 9) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box(3);
+  box.add_constraint(3*A >= 1);
+  box.add_constraint(7*A <= 20);
+  box.add_constraint(11*B >= 5);
+  box.add_constraint(B <= 3);
+
+  Poly_Con_Relation rel = box.relation_with((A + B %= 0) / 10);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with((A + B %= 1) / 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(1);
+  box.add_constraint(A >= 1);
+
+  try {
+    // This tests the space dimension exception..
+   Poly_Con_Relation rel = box.relation_with((A + B %= 1) / 9);
+   (void) rel;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test20() {
+  // The zero-dim empty box.
+  TBox box(0, EMPTY);
+  Poly_Con_Relation rel = box.relation_with((Linear_Expression(0) %= 1) / 0);
+
+  print_constraints(box, "*** box ***");
+  using namespace IO_Operators;
+  nout << "box.relation_with(0 %= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result
+    =  Poly_Con_Relation::saturates()
+      && Poly_Con_Relation::is_included()
+      && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Box/removespacedims1.cc b/tests/Box/removespacedims1.cc
new file mode 100644
index 0000000..4ebc992
--- /dev/null
+++ b/tests/Box/removespacedims1.cc
@@ -0,0 +1,356 @@
+/* Remove some variables from the space.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TBox box(6);
+  box.add_constraint(x3 <= 2);
+  box.add_constraint(x5 <= 3);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x5);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(4);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_space_dimensions({x3, x5}) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+
+  TBox box(8);
+  box.add_constraint(x1 <= 2);
+  box.add_constraint(x5 <= 7);
+  box.add_constraint(x2 <= 10);
+
+  print_constraints(box, "*** box ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x2);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+  to_be_removed.insert(x6);
+  to_be_removed.insert(x7);
+  to_be_removed.insert(x8);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(0);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.remove_space_dimensions"
+                    "({x1, x2, x3, x4, x5, x6, x7, x8}) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBox box(4);
+  box.add_constraint(x2 >= 5);
+  box.add_constraint(x4 >= 3);
+  box.add_constraint(x4 <= 0);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x1);
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x4);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box,
+                    "*** box.remove_space_dimensions({x1, x3, x4}) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TBox box(2);
+  box.add_constraint(x1 <= 2);
+  box.add_constraint(x2 <= 10);
+
+  print_constraints(box, "*** box ***");
+
+  box.remove_higher_space_dimensions(0);
+
+  Rational_Box known_result(0, UNIVERSE);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBox box(4);
+  box.add_constraint(x2 >= 5);
+  box.add_constraint(x2 <= 0);
+  box.add_constraint(x4 >= 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.remove_higher_space_dimensions(1);
+
+  Rational_Box known_result(1, EMPTY);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  TBox box(5);
+  box.add_constraint(x2 >= 5);
+  box.add_constraint(x4 >= 3);
+
+  print_constraints(box, "*** box ***");
+
+  box.remove_higher_space_dimensions(3);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x2 >= 5);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TBox box(3);
+  box.add_constraint(x2 >= 5);
+
+  print_constraints(box, "*** box ***");
+
+  Rational_Box known_result(box);
+
+  box.remove_higher_space_dimensions(3);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TBox box(5);
+
+  try {
+    // This is an invalid use of the method
+    // Box::remove_higher_dimensions(n): it is illegal to erase
+    // a variable that is not in the space of the polyhedron.
+    box.remove_higher_space_dimensions(7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(y - 0*z <= 2);
+  TBox box(cs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  box.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of method
+    // Box::remove_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    box.remove_space_dimensions(to_be_removed);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 == 3);
+  TBox box(cs);
+
+  print_constraints(box, "*** box ***");
+
+  cs = box.minimized_constraints();
+  box.remove_higher_space_dimensions(3);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+
+  Constraint_System cs;
+  cs.insert(x2 >= 6);
+  cs.insert(x4 >= 4);
+  cs.insert(x5 == 3);
+  TBox box(cs);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x4);
+  to_be_removed.insert(x5);
+
+  cs = box.minimized_constraints();
+  box.remove_space_dimensions(to_be_removed);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x2 >= 6);
+
+  bool ok = check_result(box, known_result);
+
+  print_constraints(box, "*** box.remove_space_dimensions({x4, x5}) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Box/run_tests b/tests/Box/run_tests
new file mode 100755
index 0000000..6a9c2b4
--- /dev/null
+++ b/tests/Box/run_tests
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+# Run the Box tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DBOX_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/Box/simplifyusingcontext1.cc b/tests/Box/simplifyusingcontext1.cc
new file mode 100644
index 0000000..83a2e53
--- /dev/null
+++ b/tests/Box/simplifyusingcontext1.cc
@@ -0,0 +1,306 @@
+/* Test Box::simplify_using_context_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(y >= 0);
+  box1.add_constraint(y <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(box1);
+  box2.affine_image(x, x + 6);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(2);
+  known_result.add_constraint(x <= 2);
+
+  bool ok = !box1.simplify_using_context_assign(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1,
+                    "*** box1.simplify_using_context_assign(box2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(y >= 0);
+  box1.add_constraint(y <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(box1);
+  box2.affine_image(x, x + 1);
+  box2.affine_image(y, y + 6);
+
+  print_constraints(box2, "*** box2 ***");
+
+  // NOTE: this is the result computed when using the current heuristics.
+  // It turns out that the current heuristics is not smart enough to see
+  // that constraint y <= 2 is not really needed.
+  TBox known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = !box1.simplify_using_context_assign(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1,
+                    "*** box1.simplify_using_context_assign(box2) ***");
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 6);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(1);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(x <= 5);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox computed_result = box1;
+
+  computed_result.simplify_using_context_assign(box2);
+
+  TBox known_result(1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result,
+                    "*** box1.simplify_using_context_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TBox box1 = TBox(3, UNIVERSE);
+  box1.add_constraint(i >= 1);
+  box1.add_constraint(i <= 10);
+  box1.add_constraint(j >= 1);
+  box1.add_constraint(j <= 10);
+  box1.add_constraint(k == 0);
+
+  TBox box2 = TBox(3, UNIVERSE);
+  box2.add_constraint(i >= 0);
+  box2.add_constraint(i <= 2);
+  box2.add_constraint(j >= 2);
+  box2.add_constraint(j <= 9);
+  box2.add_constraint(k == 0);
+
+  print_constraints(box1, "=== box1 ===");
+  print_constraints(box2, "=== box2 ===");
+
+  TBox known_result = TBox(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+
+  box1.simplify_using_context_assign(box2);
+
+  bool ok = (box1 == known_result);
+
+  print_constraints(box1, "=== box1.simplify_using_context_assign(box2) ===");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TBox box1(3, UNIVERSE);
+  box1.add_constraint(i == 1);
+  box1.add_constraint(j + 1 == 0);
+  box1.add_constraint(k == 3);
+
+  TBox box2(3, UNIVERSE);
+  box2.add_constraint(i == 1);
+  box2.add_constraint(k >= 0);
+  box2.add_constraint(k <= 3);
+
+  TBox known_result(3, UNIVERSE);
+  known_result.add_constraint(k >= 3);
+  known_result.add_constraint(j + 1 == 0);
+
+  box1.simplify_using_context_assign(box2);
+
+  bool ok = (box1 == known_result);
+
+  print_constraints(box1.minimized_constraints(),
+                    "=== box1.simplify_using_context_assign(box2) ===");
+  print_constraints(known_result.minimized_constraints(),
+                    "=== known_result ===");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TBox box1(3, UNIVERSE);
+  box1.add_constraint(A == 0);
+  box1.add_constraint(B >= 2);
+  box1.add_constraint(C >= 2);
+  print_constraints(box1, "\n=== box1 ===");
+
+  TBox box2(3, UNIVERSE);
+  box2.add_constraint(A == 0);
+  box2.add_constraint(C >= 2);
+  print_constraints(box2, "\n=== box2 ===");
+
+  box1.simplify_using_context_assign(box2);
+
+  TBox known_result(3, UNIVERSE);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = (box1 == known_result);
+
+  print_constraints(box1, "\n=== box1.simplify_using_context_assign(box2) ===");
+
+  return ok;
+}
+
+bool
+test07() {
+  TBox box1(0, EMPTY);
+  TBox box2;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result = box1;
+
+  box1.simplify_using_context_assign(box2);
+
+  bool ok = (box1 == known_result);
+
+  print_constraints(box1,
+                    "*** box1.simplify_using_context_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  TBox box1(1);
+  TBox box2(1);
+
+  box2.add_constraint(A == 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result = box1;
+
+  box1.simplify_using_context_assign(box2);
+
+  bool ok = (box1 == known_result);
+
+  print_constraints(box1,
+                    "*** box1.simplify_using_context_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TBox box1(3, UNIVERSE);
+  box1.add_constraint(i >= 1);
+  box1.add_constraint(i <= 10);
+  box1.add_constraint(j >= 1);
+  box1.add_constraint(j <= 10);
+  box1.add_constraint(k == 0);
+
+  TBox box2(3, UNIVERSE);
+  box2.add_constraint(i <= 25);
+  box2.add_constraint(j <= 25);
+  box2.add_constraint(k == 0);
+
+  TBox known_result(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+  known_result.add_constraint(i <= 10);
+  known_result.add_constraint(j >= 1);
+  known_result.add_constraint(j <= 10);
+
+  box1.simplify_using_context_assign(box2);
+
+  bool ok = (box1 == known_result);
+
+  print_constraints(box1);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F(test01);
+  DO_TEST_F(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/timeelapse1.cc b/tests/Box/timeelapse1.cc
new file mode 100644
index 0000000..06af25c
--- /dev/null
+++ b/tests/Box/timeelapse1.cc
@@ -0,0 +1,207 @@
+/* Test Box<Interval>::time_elapse_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box1(2, EMPTY);
+  TBox box2(2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  TBox box3(2);
+  TBox box4(2, EMPTY);
+
+  print_constraints(box3, "*** box3 ***");
+  print_constraints(box4, "*** box4 ***");
+
+  box3.time_elapse_assign(box4);
+
+  bool ok = (box1.is_empty() && box3.is_empty());
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+  print_constraints(box3, "*** box3_time_elapse_assign(box4) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y >= 0);
+
+  TBox box2(2);
+  box2.add_constraint(x >= 2);
+  box2.add_constraint(x <= 4);
+  box2.add_constraint(y == 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x >= 1);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(y <= 3);
+
+  TBox box2(2);
+  box2.add_constraint(y == 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 3);
+  box1.add_constraint(y <= 5);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 2);
+  box2.add_constraint(y <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1_time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 2);
+  box1.add_constraint(x >= 1);
+  box1.add_constraint(y <= 5);
+  box1.add_constraint(y >= 10);
+  box1.add_constraint(z >= 1);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 9);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(y <= 3);
+  box2.add_constraint(y >= -1);
+  box2.add_constraint(z >= 2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.time_elapse_assign(box2);
+
+  Rational_Box known_result(3, EMPTY);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.time_elapse_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  TBox box1(1);
+  box1.add_constraint(x == 1);
+
+  TBox box2(2);
+
+  try {
+    // This is an invalid use of the method Box::time_elapse_assign(box2):
+    // it is illegal to apply the method to two boxes that are not
+    // dimension-compatible.
+    box1.time_elapse_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Box/topclosed1.cc b/tests/Box/topclosed1.cc
new file mode 100644
index 0000000..9a32cb8
--- /dev/null
+++ b/tests/Box/topclosed1.cc
@@ -0,0 +1,206 @@
+/* Test Box::is_topologically_closed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+/* unbounded 2-dimensional box */
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(3);
+
+  box.add_constraint(x <= 2);
+  box.add_constraint(y <= 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* bounded 5-dimensional box */
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+
+  box.add_constraint(A <= 5);
+  box.add_constraint(A >= 3);
+  box.add_constraint(B == 0);
+  box.add_constraint(C <= 2);
+  box.add_constraint(C >= 1);
+  box.add_constraint(D == -7);
+  box.add_constraint(E == 1);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 0-dimensional universe box */
+bool
+test03() {
+  TBox box(0);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 2-dimensional empty box */
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A <= 3);
+  box.add_constraint(B <= -5);
+  box.add_constraint(A >= 3);
+  box.add_constraint(B > -5);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 2-dimensional empty box */
+bool
+test05() {
+  TBox box(2, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 2-dimensional universe box */
+bool
+test06() {
+  TBox box(2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 4-dimensional topologically open box */
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TBox box(4);
+  box.add_constraint(A < 1);
+  box.add_constraint(B <= 7);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = !box.is_topologically_closed();
+
+  return ok;
+}
+
+/* 0-dimensional empty box */
+bool
+test08() {
+
+  TBox box(0, EMPTY);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(A == 0);
+  box.add_constraint(B == 2);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(7);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B == 2);
+  box.add_constraint(A >= 6);
+
+  print_constraints(box, "*** box ***");
+
+  bool ok = box.is_topologically_closed();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
+
+
diff --git a/tests/Box/unconstrain1.cc b/tests/Box/unconstrain1.cc
new file mode 100644
index 0000000..00ac3ca
--- /dev/null
+++ b/tests/Box/unconstrain1.cc
@@ -0,0 +1,248 @@
+/* Test Box::unconstrain().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+  print_constraints(box, "*** box ***");
+
+  box.unconstrain(A);
+
+  TBox known_result(2, EMPTY);
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2, EMPTY);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs(A, B);
+  box.unconstrain(vs);
+
+  TBox known_result(2, EMPTY);
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  print_constraints(box, "*** box ***");
+
+  box.unconstrain(B);
+
+  TBox known_result(2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.add_constraint(B >= 0);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs(B);
+  box.unconstrain(vs);
+
+  TBox known_result(2);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box(0, EMPTY);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs;
+  box.unconstrain(vs);
+
+  TBox known_result(0, EMPTY);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TBox box(0);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs;
+  box.unconstrain(vs);
+
+  TBox known_result(0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    TBox box(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    box.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    TBox box(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    box.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TBox box(5);
+  box.add_constraint(A == 9);
+  box.add_constraint(E >= 0);
+  box.add_constraint(9 >= D + 2);
+  box.add_constraint(C <= 7);
+  box.add_constraint(0 <= B);
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  box.unconstrain(vs);
+
+  TBox known_result(5);
+  known_result.add_constraint(C <= 7);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** after box.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  try {
+    TBox box(128);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    box.unconstrain(Variable(128));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Box/universe1.cc b/tests/Box/universe1.cc
new file mode 100644
index 0000000..e169b3f
--- /dev/null
+++ b/tests/Box/universe1.cc
@@ -0,0 +1,87 @@
+/* Test Box::is_universe().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(4);
+  box.add_constraint(-x <= 4);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test02() {
+  TBox box(4);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test03() {
+  TBox box(0);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test04() {
+  TBox box(20, EMPTY);
+
+  bool universe = box.is_universe();
+
+  nout << "*** box.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Box/upperbound1.cc b/tests/Box/upperbound1.cc
new file mode 100644
index 0000000..f46b881
--- /dev/null
+++ b/tests/Box/upperbound1.cc
@@ -0,0 +1,251 @@
+/* Test Box::upper_bound_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TBox box1(5);
+  box1.add_constraint(x1 <= 5);
+  box1.add_constraint(x2 <= -1);
+
+  TBox box2(5);
+  box2.add_constraint(x1 <= 2);
+  box2.add_constraint(x4 <= 7);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.upper_bound_assign(box2);
+
+  Rational_Box known_result(5);
+  known_result.add_constraint(x1 <= 5);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(-x <= -1);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(-y <= -1);
+
+  TBox box2(3);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(-y <= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.upper_bound_assign(box2);
+
+  Rational_Box known_result(3);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y >= -5);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(-x <= -1);
+  box1.add_constraint(y <= 3);
+  box1.add_constraint(-y <= -1);
+
+  TBox box2(2);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(x >= 5);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  Rational_Box known_result(box1);
+
+  box1.upper_bound_assign(box2);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2);
+  box1.add_constraint(A <= 4);
+  box1.add_constraint(A >= 1);
+  box1.add_constraint(B <= 3);
+  box1.add_constraint(-B <= -1);
+
+  TBox box2(2);
+  box2.add_constraint(A <= 8);
+  box2.add_constraint(-B <= 5);
+  box2.add_constraint(B <= 0);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.upper_bound_assign(box2);
+
+  Rational_Box known_result(2);
+  known_result.add_constraint(A <= 8);
+  known_result.add_constraint(B >= -5);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TBox box1(12);
+  TBox box2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Box::upper_bound_assign(box2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    box1.upper_bound_assign(box2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TBox box1(1);
+  box1.add_constraint(A <= 0);
+  box1.add_constraint(A >= 1);
+
+  TBox box2(1);
+  box2.add_constraint(A <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.upper_bound_assign(box2);
+
+  Rational_Box known_result(1);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = check_result(box1, known_result) ;
+
+  print_constraints(box1, "*** box1.upper_bound_assign(box2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x1(0);
+
+  TBox box1(1);
+  box1.add_constraint(x1 <= 5);
+
+  TBox box2(1);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  box1.upper_bound_assign(box2);
+
+  return true;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(A == 0);
+  box1.add_constraint(B == 1);
+
+  TBox box2(box1);
+  box1.affine_image(B, Linear_Expression(4));
+
+  box2.add_constraint(A > 1);
+  box1.upper_bound_assign(box2);
+
+  TBox known_result(2, UNIVERSE);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 4);
+
+  bool ok = check_result(box1, known_result);
+
+  print_constraints(box1, "=== box1 ===");
+  print_constraints(box2, "=== known_result ===");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Box/upperboundifexact1.cc b/tests/Box/upperboundifexact1.cc
new file mode 100644
index 0000000..0022fd3
--- /dev/null
+++ b/tests/Box/upperboundifexact1.cc
@@ -0,0 +1,311 @@
+/* Test BD_Shape::upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TBox box_empty(0, EMPTY);
+  TBox box_universe(0, UNIVERSE);
+
+  // Testing all combinations for 0-dim polyhedra.
+  bool ok = true;
+  TBox box;
+
+  // empty, empty
+  box = box_empty;
+  ok &= box.upper_bound_assign_if_exact(box_empty);
+  ok &= (box == box_empty);
+  print_constraints(box, "*** empty union empty ***");
+
+  // empty, universe
+  box = box_empty;
+  ok &= box.upper_bound_assign_if_exact(box_universe);
+  ok &= (box == box_universe);
+  print_constraints(box, "*** empty union universe ***");
+
+  // universe, empty
+  box = box_universe;
+  ok &= box.upper_bound_assign_if_exact(box_empty);
+  ok &= (box == box_universe);
+  print_constraints(box, "*** universe union empty ***");
+
+  // universe, universe
+  box = box_universe;
+  ok &= box.upper_bound_assign_if_exact(box_universe);
+  ok &= (box == box_universe);
+  print_constraints(box, "*** universe union universe ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x >= -2);
+  box1.add_constraint(x <= -1);
+  box1.add_constraint(y >= 0);
+  box1.add_constraint(y <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(x >= 1);
+  box2.add_constraint(x <= 2);
+  box2.add_constraint(y >= 0);
+  box2.add_constraint(y <= 2);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(box1);
+
+  bool ok = !box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x >= -2);
+  box1.add_constraint(x <= 0);
+  box1.add_constraint(y >= 0);
+  box1.add_constraint(y <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(x <= 2);
+  box2.add_constraint(y >= 0);
+  box2.add_constraint(y <= 2);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x == 0);
+  box1.add_constraint(y == 0);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(x <= 2);
+  box2.add_constraint(y >= -2);
+  box2.add_constraint(y <= 2);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(box2);
+
+  bool ok = box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(y == 0);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(y >= 2);
+  box2.add_constraint(y <= 4);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(box1);
+
+  bool ok = !box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x == 0);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(y == 0);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(box1);
+
+  bool ok = !box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(y >= 0);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(y <= 5);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(2, UNIVERSE);
+
+  bool ok = box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 4);
+  box1.add_constraint(y >= 1);
+  box1.add_constraint(y <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(x >= 1);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= 0);
+  box2.add_constraint(y <= 4);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(box1);
+
+  bool ok = !box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(2, UNIVERSE);
+  box1.add_constraint(x >= 0);
+  box1.add_constraint(x <= 1);
+  box1.add_constraint(y >= 0);
+  box1.add_constraint(y <= 2);
+
+  print_constraints(box1, "*** box1 ***");
+
+  TBox box2(2, UNIVERSE);
+  box2.add_constraint(x >= 0);
+  box2.add_constraint(x <= 3);
+  box2.add_constraint(y >= 1);
+  box2.add_constraint(y <= 2);
+
+  print_constraints(box2, "*** box2 ***");
+
+  TBox known_result(box1);
+
+  bool ok = !box1.upper_bound_assign_if_exact(box2);
+  ok &= (box1 == known_result);
+
+  print_constraints(box1, "*** box1.upper_bound_assign_if_exact(box2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Box/wrap1.cc b/tests/Box/wrap1.cc
new file mode 100644
index 0000000..a579d0e
--- /dev/null
+++ b/tests/Box/wrap1.cc
@@ -0,0 +1,202 @@
+/* Test Box::wrap_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  TBox box(2);
+  box.add_constraint(100 <= x);
+  box.add_constraint(x <= 300);
+  box.add_constraint(-50 <= y);
+  box.add_constraint(y <= 50);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vars(x, y);
+
+  box.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  // FIXME.
+  TBox known_result(2);
+  known_result.refine_with_constraint(0 <= x);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(0 <= y);
+  known_result.refine_with_constraint(y <= 255);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  TBox box(2);
+  box.add_constraint(100 <= x);
+  box.add_constraint(x <= 300);
+  box.add_constraint(-50 <= y);
+  box.add_constraint(y <= 50);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x >= y);
+  cs.insert(y <= 75);
+
+  box.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  // FIXME.
+  TBox known_result(2);
+  known_result.refine_with_constraint(0 <= x);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(0 <= y);
+  known_result.refine_with_constraint(y <= 50);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  TBox box(2);
+  box.add_constraint(100 <= x);
+  box.add_constraint(x <= 300);
+  box.add_constraint(-50 <= y);
+  box.add_constraint(y <= 50);
+
+  print_constraints(box, "*** box ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 50);
+  cs.insert(x >= y);
+  cs.insert(y <= 75);
+
+  box.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  TBox known_result(2);
+  known_result.refine_with_constraint(0 <= x);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(0 <= y);
+  known_result.refine_with_constraint(y <= 50);
+
+  bool ok = (box == known_result);
+
+  print_constraints(box, "*** box.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  TBox box1(1);
+  box1.add_constraint(2*x == 511);
+
+  print_constraints(box1, "*** box ***");
+
+  Variables_Set vars(x);
+
+  // Making copies before affecting box1.
+  TBox box2(box1);
+  TBox box3(box1);
+
+  TBox good_enough_result(box1);
+  TBox precise_result(1, EMPTY);
+
+  box1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  box2.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+  box3.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+  // FIXME: Implementation can be more precise than expected.
+  bool ok = box1.contains(precise_result) && good_enough_result.contains(box1)
+    && box2.contains(precise_result) && good_enough_result.contains(box2)
+    && box3.contains(precise_result) && good_enough_result.contains(box3);
+
+  print_constraints(box1, "*** box.wrap_assign(..., OVERFLOW_WRAPS) ***");
+  print_constraints(box2, "*** box.wrap_assign(..., OVERFLOW_UNDEFINED) ***");
+  print_constraints(box3, "*** box.wrap_assign(..., OVERFLOW_IMPOSSIBLE) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  TBox box1(1);
+  box1.add_constraint(2*x == 18*256 + 511);
+
+  print_constraints(box1, "*** box ***");
+
+  Variables_Set vars(x);
+
+  // Making copies before affecting box1.
+  TBox box2(box1);
+  TBox box3(box1);
+
+  box1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  box2.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+  box3.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+  TBox known_result1(1, EMPTY);
+  TBox known_result2(1);
+  known_result2.add_constraint(x >= 0);
+  known_result2.add_constraint(x <= 255);
+  TBox known_result3(1, EMPTY);
+
+  bool ok = (box1 == known_result1)
+    && (box2 == known_result2)
+    && (box3 == known_result3);
+
+  print_constraints(box1, "*** box.wrap_assign(..., OVERFLOW_WRAPS) ***");
+  print_constraints(box2, "*** box.wrap_assign(..., OVERFLOW_UNDEFINED) ***");
+  print_constraints(box3, "*** box.wrap_assign(..., OVERFLOW_IMPOSSIBLE) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+  DO_TEST_F8(test03);
+  DO_TEST_F8(test04);
+  DO_TEST_F8(test05);
+END_MAIN
diff --git a/tests/Box/writebox1.cc b/tests/Box/writebox1.cc
new file mode 100644
index 0000000..a54a49e
--- /dev/null
+++ b/tests/Box/writebox1.cc
@@ -0,0 +1,76 @@
+/* Test operator<<(ostream&, const Box&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(3);
+  TBox box2(3);
+
+  box1.add_constraint(x <= 3);
+
+  box2.add_constraint(-y <= -2);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+
+  // FIXME!!!
+  return true;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box1(0, EMPTY);
+  TBox box2(3);
+  TBox box3(3);
+
+  box2.add_constraint(-y <= -2);
+
+  box3.add_constraint(x <= 0);
+  box3.add_constraint(-x <= -1);
+  box3.add_constraint(y <= 3);
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(box2, "*** box2 ***");
+  print_constraints(box3, "*** box3 ***");
+
+  // FIXME!!!
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/CO_Tree/Makefile.am b/tests/CO_Tree/Makefile.am
new file mode 100644
index 0000000..12048cc
--- /dev/null
+++ b/tests/CO_Tree/Makefile.am
@@ -0,0 +1,78 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+cotree1
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+cotree1_SOURCES = cotree1.cc
+
+check_PROGRAMS = \
+$(TESTS) \
+$(BUGS)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/CO_Tree/Makefile.in b/tests/CO_Tree/Makefile.in
new file mode 100644
index 0000000..58e3ea3
--- /dev/null
+++ b/tests/CO_Tree/Makefile.in
@@ -0,0 +1,1105 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = cotree1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/CO_Tree
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = cotree1$(EXEEXT)
+am__EXEEXT_2 =
+am_cotree1_OBJECTS = cotree1.$(OBJEXT)
+cotree1_OBJECTS = $(am_cotree1_OBJECTS)
+cotree1_LDADD = $(LDADD)
+cotree1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(cotree1_SOURCES)
+DIST_SOURCES = $(cotree1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS = 
+
+#
+# Sources for the tests
+#
+cotree1_SOURCES = cotree1.cc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/CO_Tree/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/CO_Tree/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+cotree1$(EXEEXT): $(cotree1_OBJECTS) $(cotree1_DEPENDENCIES) $(EXTRA_cotree1_DEPENDENCIES) 
+	@rm -f cotree1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cotree1_OBJECTS) $(cotree1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cotree1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+cotree1.log: cotree1$(EXEEXT)
+	@p='cotree1$(EXEEXT)'; \
+	b='cotree1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/CO_Tree/cotree1.cc b/tests/CO_Tree/cotree1.cc
new file mode 100644
index 0000000..c0a5361
--- /dev/null
+++ b/tests/CO_Tree/cotree1.cc
@@ -0,0 +1,2496 @@
+/* Test the CO_Tree class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_USE_SPARSE_MATRIX
+
+#include <vector>
+#include <algorithm>
+#include <set>
+
+namespace {
+
+bool
+test01() {
+
+  CO_Tree tree;
+
+  for (CO_Tree::iterator i = tree.begin(), i_end = tree.end(); i != i_end; ++i)
+    ;
+
+  return true;
+}
+
+bool
+test02() {
+
+  CO_Tree tree;
+
+  tree.insert(0, Coefficient_zero());
+  tree.insert(1, Coefficient_zero());
+  tree.insert(2, Coefficient_zero());
+  tree.insert(3, Coefficient_zero());
+  tree.insert(4, Coefficient_zero());
+
+  return true;
+}
+
+bool
+test03() {
+
+  // Sequential insertion, sequential erase.
+
+  CO_Tree tree;
+
+  for (unsigned n = 0; n < 500; ++n)
+    tree.insert(n, 0);
+
+  for (unsigned n = 0; n < 500; ++n)
+    tree.erase(n);
+
+  if (!tree.empty())
+    return false;
+
+  return true;
+}
+
+bool
+test04() {
+
+  // Sequential insertion, backwards erase.
+
+  CO_Tree tree;
+
+  for (unsigned n = 0; n < 500; ++n)
+    tree.insert(n, 0);
+
+  for (unsigned n = 500; n-- > 0; )
+    tree.erase(n);
+
+  if (!tree.empty())
+    return false;
+
+  return true;
+}
+
+bool
+test05() {
+
+  // Backwards insertion, sequential erase.
+
+  CO_Tree tree;
+
+  for (unsigned n = 500; n-- > 0; )
+    tree.insert(n, 0);
+
+  for (unsigned n = 0; n < 500; ++n)
+    tree.erase(n);
+
+  if (!tree.empty())
+    return false;
+
+  return true;
+}
+
+bool
+test06() {
+
+  // Backwards insertion, backwards erase.
+
+  CO_Tree tree;
+
+  for (unsigned n = 500; --n > 0; )
+    tree.insert(n, 0);
+
+  for (unsigned n = 500; --n > 0; )
+    tree.erase(n);
+
+  if (!tree.empty())
+    return false;
+
+  return true;
+}
+
+bool
+test07() {
+
+  // Sequential insertion, pseudo-random erase.
+
+  CO_Tree tree;
+
+  for (unsigned n = 0; n < 500; ++n)
+    tree.insert(n, 0);
+
+  tree.erase(110);
+  tree.erase(290);
+  tree.erase(11);
+  tree.erase(69);
+  tree.erase(209);
+  tree.erase(468);
+  tree.erase(17);
+  tree.erase(293);
+  tree.erase(164);
+  tree.erase(350);
+  tree.erase(115);
+  tree.erase(322);
+  tree.erase(361);
+  tree.erase(2);
+  tree.erase(446);
+  tree.erase(281);
+  tree.erase(400);
+  tree.erase(375);
+  tree.erase(153);
+  tree.erase(116);
+  tree.erase(143);
+  tree.erase(329);
+  tree.erase(420);
+  tree.erase(133);
+  tree.erase(363);
+  tree.erase(192);
+  tree.erase(27);
+  tree.erase(275);
+  tree.erase(104);
+  tree.erase(213);
+  tree.erase(352);
+  tree.erase(427);
+  tree.erase(273);
+  tree.erase(288);
+  tree.erase(396);
+  tree.erase(114);
+  tree.erase(341);
+  tree.erase(413);
+  tree.erase(201);
+  tree.erase(280);
+  tree.erase(66);
+  tree.erase(227);
+  tree.erase(406);
+  tree.erase(79);
+  tree.erase(259);
+  tree.erase(176);
+  tree.erase(106);
+  tree.erase(0);
+  tree.erase(328);
+  tree.erase(270);
+  tree.erase(449);
+  tree.erase(165);
+  tree.erase(163);
+  tree.erase(43);
+  tree.erase(391);
+  tree.erase(202);
+  tree.erase(49);
+  tree.erase(105);
+  tree.erase(149);
+  tree.erase(318);
+  tree.erase(387);
+  tree.erase(389);
+  tree.erase(141);
+  tree.erase(408);
+  tree.erase(486);
+  tree.erase(354);
+  tree.erase(8);
+  tree.erase(33);
+  tree.erase(421);
+  tree.erase(385);
+  tree.erase(25);
+  tree.erase(485);
+  tree.erase(196);
+  tree.erase(31);
+  tree.erase(82);
+  tree.erase(434);
+  tree.erase(423);
+  tree.erase(358);
+  tree.erase(255);
+  tree.erase(287);
+  tree.erase(23);
+  tree.erase(122);
+  tree.erase(489);
+  tree.erase(19);
+  tree.erase(126);
+  tree.erase(44);
+  tree.erase(120);
+  tree.erase(131);
+  tree.erase(332);
+  tree.erase(448);
+  tree.erase(238);
+  tree.erase(264);
+  tree.erase(454);
+  tree.erase(218);
+  tree.erase(157);
+  tree.erase(436);
+  tree.erase(225);
+  tree.erase(437);
+  tree.erase(443);
+  tree.erase(179);
+  tree.erase(265);
+  tree.erase(475);
+  tree.erase(180);
+  tree.erase(487);
+  tree.erase(339);
+  tree.erase(492);
+  tree.erase(395);
+  tree.erase(491);
+  tree.erase(223);
+  tree.erase(113);
+  tree.erase(92);
+  tree.erase(48);
+  tree.erase(61);
+  tree.erase(127);
+  tree.erase(190);
+  tree.erase(67);
+  tree.erase(484);
+  tree.erase(439);
+  tree.erase(355);
+  tree.erase(243);
+  tree.erase(392);
+  tree.erase(159);
+  tree.erase(74);
+  tree.erase(337);
+  tree.erase(151);
+  tree.erase(458);
+  tree.erase(480);
+  tree.erase(334);
+  tree.erase(419);
+  tree.erase(309);
+  tree.erase(301);
+  tree.erase(125);
+  tree.erase(407);
+  tree.erase(496);
+  tree.erase(187);
+  tree.erase(50);
+  tree.erase(368);
+  tree.erase(283);
+  tree.erase(244);
+  tree.erase(170);
+  tree.erase(118);
+  tree.erase(457);
+  tree.erase(181);
+  tree.erase(479);
+  tree.erase(401);
+  tree.erase(494);
+  tree.erase(99);
+  tree.erase(236);
+  tree.erase(240);
+  tree.erase(147);
+  tree.erase(233);
+  tree.erase(172);
+  tree.erase(266);
+  tree.erase(32);
+  tree.erase(210);
+  tree.erase(161);
+  tree.erase(156);
+  tree.erase(178);
+  tree.erase(221);
+  tree.erase(78);
+  tree.erase(85);
+  tree.erase(135);
+  tree.erase(145);
+  tree.erase(356);
+  tree.erase(397);
+  tree.erase(450);
+  tree.erase(276);
+  tree.erase(41);
+  tree.erase(414);
+  tree.erase(14);
+  tree.erase(22);
+  tree.erase(29);
+  tree.erase(34);
+  tree.erase(498);
+  tree.erase(250);
+  tree.erase(36);
+  tree.erase(320);
+  tree.erase(268);
+  tree.erase(195);
+  tree.erase(382);
+  tree.erase(441);
+  tree.erase(235);
+  tree.erase(346);
+  tree.erase(476);
+  tree.erase(217);
+  tree.erase(335);
+  tree.erase(121);
+  tree.erase(94);
+  tree.erase(278);
+  tree.erase(272);
+  tree.erase(207);
+  tree.erase(463);
+  tree.erase(150);
+  tree.erase(432);
+  tree.erase(410);
+  tree.erase(208);
+  tree.erase(70);
+  tree.erase(84);
+  tree.erase(186);
+  tree.erase(6);
+  tree.erase(224);
+  tree.erase(9);
+  tree.erase(60);
+  tree.erase(175);
+  tree.erase(430);
+  tree.erase(128);
+  tree.erase(129);
+  tree.erase(465);
+  tree.erase(459);
+  tree.erase(289);
+  tree.erase(261);
+  tree.erase(26);
+  tree.erase(461);
+  tree.erase(279);
+  tree.erase(245);
+  tree.erase(478);
+  tree.erase(403);
+  tree.erase(45);
+  tree.erase(359);
+  tree.erase(327);
+  tree.erase(393);
+  tree.erase(373);
+  tree.erase(304);
+  tree.erase(83);
+  tree.erase(160);
+  tree.erase(198);
+  tree.erase(103);
+  tree.erase(367);
+  tree.erase(76);
+  tree.erase(73);
+  tree.erase(167);
+  tree.erase(291);
+  tree.erase(215);
+  tree.erase(219);
+  tree.erase(119);
+  tree.erase(456);
+  tree.erase(197);
+  tree.erase(477);
+  tree.erase(222);
+  tree.erase(174);
+  tree.erase(451);
+  tree.erase(214);
+  tree.erase(112);
+  tree.erase(464);
+  tree.erase(262);
+  tree.erase(47);
+  tree.erase(347);
+  tree.erase(111);
+  tree.erase(148);
+  tree.erase(308);
+  tree.erase(340);
+  tree.erase(100);
+  tree.erase(130);
+  tree.erase(323);
+  tree.erase(312);
+  tree.erase(292);
+  tree.erase(35);
+  tree.erase(306);
+  tree.erase(58);
+  tree.erase(353);
+  tree.erase(452);
+  tree.erase(91);
+  tree.erase(319);
+  tree.erase(330);
+  tree.erase(473);
+  tree.erase(488);
+  tree.erase(134);
+  tree.erase(315);
+  tree.erase(253);
+  tree.erase(374);
+  tree.erase(384);
+  tree.erase(95);
+  tree.erase(370);
+  tree.erase(13);
+  tree.erase(183);
+  tree.erase(136);
+  tree.erase(313);
+  tree.erase(307);
+  tree.erase(239);
+  tree.erase(258);
+  tree.erase(405);
+  tree.erase(56);
+  tree.erase(228);
+  tree.erase(455);
+  tree.erase(317);
+  tree.erase(497);
+  tree.erase(102);
+  tree.erase(117);
+  tree.erase(68);
+  tree.erase(234);
+  tree.erase(51);
+  tree.erase(107);
+  tree.erase(349);
+  tree.erase(348);
+  tree.erase(416);
+  tree.erase(88);
+  tree.erase(89);
+  tree.erase(366);
+  tree.erase(109);
+  tree.erase(189);
+  tree.erase(333);
+  tree.erase(3);
+  tree.erase(394);
+  tree.erase(267);
+  tree.erase(269);
+  tree.erase(246);
+  tree.erase(152);
+  tree.erase(173);
+  tree.erase(438);
+  tree.erase(24);
+  tree.erase(15);
+  tree.erase(390);
+  tree.erase(284);
+  tree.erase(360);
+  tree.erase(371);
+  tree.erase(81);
+  tree.erase(65);
+  tree.erase(299);
+  tree.erase(132);
+  tree.erase(98);
+  tree.erase(303);
+  tree.erase(139);
+  tree.erase(453);
+  tree.erase(402);
+  tree.erase(20);
+  tree.erase(54);
+  tree.erase(499);
+  tree.erase(260);
+  tree.erase(285);
+  tree.erase(381);
+  tree.erase(357);
+  tree.erase(248);
+  tree.erase(362);
+  tree.erase(62);
+  tree.erase(203);
+  tree.erase(411);
+  tree.erase(444);
+  tree.erase(388);
+  tree.erase(10);
+  tree.erase(342);
+  tree.erase(229);
+  tree.erase(481);
+  tree.erase(369);
+  tree.erase(378);
+  tree.erase(38);
+  tree.erase(77);
+  tree.erase(415);
+  tree.erase(466);
+  tree.erase(404);
+  tree.erase(90);
+  tree.erase(101);
+  tree.erase(169);
+  tree.erase(435);
+  tree.erase(296);
+  tree.erase(282);
+  tree.erase(63);
+  tree.erase(52);
+  tree.erase(40);
+  tree.erase(231);
+  tree.erase(302);
+  tree.erase(18);
+  tree.erase(383);
+  tree.erase(194);
+  tree.erase(351);
+  tree.erase(254);
+  tree.erase(431);
+  tree.erase(199);
+  tree.erase(80);
+  tree.erase(300);
+  tree.erase(140);
+  tree.erase(324);
+  tree.erase(286);
+  tree.erase(188);
+  tree.erase(386);
+  tree.erase(344);
+  tree.erase(166);
+  tree.erase(4);
+  tree.erase(226);
+  tree.erase(316);
+  tree.erase(158);
+  tree.erase(447);
+  tree.erase(86);
+  tree.erase(398);
+  tree.erase(108);
+  tree.erase(230);
+  tree.erase(310);
+  tree.erase(495);
+  tree.erase(171);
+  tree.erase(380);
+  tree.erase(249);
+  tree.erase(433);
+  tree.erase(16);
+  tree.erase(470);
+  tree.erase(277);
+  tree.erase(21);
+  tree.erase(372);
+  tree.erase(252);
+  tree.erase(424);
+  tree.erase(144);
+  tree.erase(377);
+  tree.erase(59);
+  tree.erase(46);
+  tree.erase(55);
+  tree.erase(429);
+  tree.erase(474);
+  tree.erase(321);
+  tree.erase(399);
+  tree.erase(471);
+  tree.erase(237);
+  tree.erase(442);
+  tree.erase(97);
+  tree.erase(220);
+  tree.erase(445);
+  tree.erase(326);
+  tree.erase(37);
+  tree.erase(336);
+  tree.erase(343);
+  tree.erase(412);
+  tree.erase(409);
+  tree.erase(460);
+  tree.erase(57);
+  tree.erase(168);
+  tree.erase(295);
+  tree.erase(247);
+  tree.erase(482);
+  tree.erase(425);
+  tree.erase(256);
+  tree.erase(96);
+  tree.erase(53);
+  tree.erase(469);
+  tree.erase(162);
+  tree.erase(493);
+  tree.erase(294);
+  tree.erase(177);
+  tree.erase(212);
+  tree.erase(30);
+  tree.erase(5);
+  tree.erase(193);
+  tree.erase(483);
+  tree.erase(124);
+  tree.erase(87);
+  tree.erase(64);
+  tree.erase(490);
+  tree.erase(155);
+  tree.erase(422);
+  tree.erase(191);
+  tree.erase(75);
+  tree.erase(325);
+  tree.erase(1);
+  tree.erase(182);
+  tree.erase(28);
+  tree.erase(364);
+  tree.erase(42);
+  tree.erase(39);
+  tree.erase(376);
+  tree.erase(467);
+  tree.erase(426);
+  tree.erase(205);
+  tree.erase(365);
+  tree.erase(137);
+  tree.erase(297);
+  tree.erase(462);
+  tree.erase(241);
+  tree.erase(123);
+  tree.erase(206);
+  tree.erase(440);
+  tree.erase(216);
+  tree.erase(146);
+  tree.erase(142);
+  tree.erase(72);
+  tree.erase(379);
+  tree.erase(472);
+  tree.erase(305);
+  tree.erase(271);
+  tree.erase(298);
+  tree.erase(232);
+  tree.erase(242);
+  tree.erase(184);
+  tree.erase(138);
+  tree.erase(154);
+  tree.erase(200);
+  tree.erase(71);
+  tree.erase(211);
+  tree.erase(274);
+  tree.erase(263);
+  tree.erase(311);
+  tree.erase(428);
+  tree.erase(331);
+  tree.erase(7);
+  tree.erase(345);
+  tree.erase(185);
+  tree.erase(338);
+  tree.erase(251);
+  tree.erase(417);
+  tree.erase(12);
+  tree.erase(93);
+  tree.erase(204);
+  tree.erase(257);
+  tree.erase(418);
+  tree.erase(314);
+
+  if (!tree.empty())
+    return false;
+
+  return true;
+}
+
+bool test08() {
+
+  // Pseudo-random insertion, pseudo-random erase (in the same order).
+
+  CO_Tree tree;
+
+  tree.insert(110, 0);
+  tree.insert(290, 0);
+  tree.insert(11, 0);
+  tree.insert(69, 0);
+  tree.insert(209, 0);
+  tree.insert(468, 0);
+  tree.insert(17, 0);
+  tree.insert(293, 0);
+  tree.insert(164, 0);
+  tree.insert(350, 0);
+  tree.insert(115, 0);
+  tree.insert(322, 0);
+  tree.insert(361, 0);
+  tree.insert(2, 0);
+  tree.insert(446, 0);
+  tree.insert(281, 0);
+  tree.insert(400, 0);
+  tree.insert(375, 0);
+  tree.insert(153, 0);
+  tree.insert(116, 0);
+  tree.insert(143, 0);
+  tree.insert(329, 0);
+  tree.insert(420, 0);
+  tree.insert(133, 0);
+  tree.insert(363, 0);
+  tree.insert(192, 0);
+  tree.insert(27, 0);
+  tree.insert(275, 0);
+  tree.insert(104, 0);
+  tree.insert(213, 0);
+  tree.insert(352, 0);
+  tree.insert(427, 0);
+  tree.insert(273, 0);
+  tree.insert(288, 0);
+  tree.insert(396, 0);
+  tree.insert(114, 0);
+  tree.insert(341, 0);
+  tree.insert(413, 0);
+  tree.insert(201, 0);
+  tree.insert(280, 0);
+  tree.insert(66, 0);
+  tree.insert(227, 0);
+  tree.insert(406, 0);
+  tree.insert(79, 0);
+  tree.insert(259, 0);
+  tree.insert(176, 0);
+  tree.insert(106, 0);
+  tree.insert(0, 0);
+  tree.insert(328, 0);
+  tree.insert(270, 0);
+  tree.insert(449, 0);
+  tree.insert(165, 0);
+  tree.insert(163, 0);
+  tree.insert(43, 0);
+  tree.insert(391, 0);
+  tree.insert(202, 0);
+  tree.insert(49, 0);
+  tree.insert(105, 0);
+  tree.insert(149, 0);
+  tree.insert(318, 0);
+  tree.insert(387, 0);
+  tree.insert(389, 0);
+  tree.insert(141, 0);
+  tree.insert(408, 0);
+  tree.insert(486, 0);
+  tree.insert(354, 0);
+  tree.insert(8, 0);
+  tree.insert(33, 0);
+  tree.insert(421, 0);
+  tree.insert(385, 0);
+  tree.insert(25, 0);
+  tree.insert(485, 0);
+  tree.insert(196, 0);
+  tree.insert(31, 0);
+  tree.insert(82, 0);
+  tree.insert(434, 0);
+  tree.insert(423, 0);
+  tree.insert(358, 0);
+  tree.insert(255, 0);
+  tree.insert(287, 0);
+  tree.insert(23, 0);
+  tree.insert(122, 0);
+  tree.insert(489, 0);
+  tree.insert(19, 0);
+  tree.insert(126, 0);
+  tree.insert(44, 0);
+  tree.insert(120, 0);
+  tree.insert(131, 0);
+  tree.insert(332, 0);
+  tree.insert(448, 0);
+  tree.insert(238, 0);
+  tree.insert(264, 0);
+  tree.insert(454, 0);
+  tree.insert(218, 0);
+  tree.insert(157, 0);
+  tree.insert(436, 0);
+  tree.insert(225, 0);
+  tree.insert(437, 0);
+  tree.insert(443, 0);
+  tree.insert(179, 0);
+  tree.insert(265, 0);
+  tree.insert(475, 0);
+  tree.insert(180, 0);
+  tree.insert(487, 0);
+  tree.insert(339, 0);
+  tree.insert(492, 0);
+  tree.insert(395, 0);
+  tree.insert(491, 0);
+  tree.insert(223, 0);
+  tree.insert(113, 0);
+  tree.insert(92, 0);
+  tree.insert(48, 0);
+  tree.insert(61, 0);
+  tree.insert(127, 0);
+  tree.insert(190, 0);
+  tree.insert(67, 0);
+  tree.insert(484, 0);
+  tree.insert(439, 0);
+  tree.insert(355, 0);
+  tree.insert(243, 0);
+  tree.insert(392, 0);
+  tree.insert(159, 0);
+  tree.insert(74, 0);
+  tree.insert(337, 0);
+  tree.insert(151, 0);
+  tree.insert(458, 0);
+  tree.insert(480, 0);
+  tree.insert(334, 0);
+  tree.insert(419, 0);
+  tree.insert(309, 0);
+  tree.insert(301, 0);
+  tree.insert(125, 0);
+  tree.insert(407, 0);
+  tree.insert(496, 0);
+  tree.insert(187, 0);
+  tree.insert(50, 0);
+  tree.insert(368, 0);
+  tree.insert(283, 0);
+  tree.insert(244, 0);
+  tree.insert(170, 0);
+  tree.insert(118, 0);
+  tree.insert(457, 0);
+  tree.insert(181, 0);
+  tree.insert(479, 0);
+  tree.insert(401, 0);
+  tree.insert(494, 0);
+  tree.insert(99, 0);
+  tree.insert(236, 0);
+  tree.insert(240, 0);
+  tree.insert(147, 0);
+  tree.insert(233, 0);
+  tree.insert(172, 0);
+  tree.insert(266, 0);
+  tree.insert(32, 0);
+  tree.insert(210, 0);
+  tree.insert(161, 0);
+  tree.insert(156, 0);
+  tree.insert(178, 0);
+  tree.insert(221, 0);
+  tree.insert(78, 0);
+  tree.insert(85, 0);
+  tree.insert(135, 0);
+  tree.insert(145, 0);
+  tree.insert(356, 0);
+  tree.insert(397, 0);
+  tree.insert(450, 0);
+  tree.insert(276, 0);
+  tree.insert(41, 0);
+  tree.insert(414, 0);
+  tree.insert(14, 0);
+  tree.insert(22, 0);
+  tree.insert(29, 0);
+  tree.insert(34, 0);
+  tree.insert(498, 0);
+  tree.insert(250, 0);
+  tree.insert(36, 0);
+  tree.insert(320, 0);
+  tree.insert(268, 0);
+  tree.insert(195, 0);
+  tree.insert(382, 0);
+  tree.insert(441, 0);
+  tree.insert(235, 0);
+  tree.insert(346, 0);
+  tree.insert(476, 0);
+  tree.insert(217, 0);
+  tree.insert(335, 0);
+  tree.insert(121, 0);
+  tree.insert(94, 0);
+  tree.insert(278, 0);
+  tree.insert(272, 0);
+  tree.insert(207, 0);
+  tree.insert(463, 0);
+  tree.insert(150, 0);
+  tree.insert(432, 0);
+  tree.insert(410, 0);
+  tree.insert(208, 0);
+  tree.insert(70, 0);
+  tree.insert(84, 0);
+  tree.insert(186, 0);
+  tree.insert(6, 0);
+  tree.insert(224, 0);
+  tree.insert(9, 0);
+  tree.insert(60, 0);
+  tree.insert(175, 0);
+  tree.insert(430, 0);
+  tree.insert(128, 0);
+  tree.insert(129, 0);
+  tree.insert(465, 0);
+  tree.insert(459, 0);
+  tree.insert(289, 0);
+  tree.insert(261, 0);
+  tree.insert(26, 0);
+  tree.insert(461, 0);
+  tree.insert(279, 0);
+  tree.insert(245, 0);
+  tree.insert(478, 0);
+  tree.insert(403, 0);
+  tree.insert(45, 0);
+  tree.insert(359, 0);
+  tree.insert(327, 0);
+  tree.insert(393, 0);
+  tree.insert(373, 0);
+  tree.insert(304, 0);
+  tree.insert(83, 0);
+  tree.insert(160, 0);
+  tree.insert(198, 0);
+  tree.insert(103, 0);
+  tree.insert(367, 0);
+  tree.insert(76, 0);
+  tree.insert(73, 0);
+  tree.insert(167, 0);
+  tree.insert(291, 0);
+  tree.insert(215, 0);
+  tree.insert(219, 0);
+  tree.insert(119, 0);
+  tree.insert(456, 0);
+  tree.insert(197, 0);
+  tree.insert(477, 0);
+  tree.insert(222, 0);
+  tree.insert(174, 0);
+  tree.insert(451, 0);
+  tree.insert(214, 0);
+  tree.insert(112, 0);
+  tree.insert(464, 0);
+  tree.insert(262, 0);
+  tree.insert(47, 0);
+  tree.insert(347, 0);
+  tree.insert(111, 0);
+  tree.insert(148, 0);
+  tree.insert(308, 0);
+  tree.insert(340, 0);
+  tree.insert(100, 0);
+  tree.insert(130, 0);
+  tree.insert(323, 0);
+  tree.insert(312, 0);
+  tree.insert(292, 0);
+  tree.insert(35, 0);
+  tree.insert(306, 0);
+  tree.insert(58, 0);
+  tree.insert(353, 0);
+  tree.insert(452, 0);
+  tree.insert(91, 0);
+  tree.insert(319, 0);
+  tree.insert(330, 0);
+  tree.insert(473, 0);
+  tree.insert(488, 0);
+  tree.insert(134, 0);
+  tree.insert(315, 0);
+  tree.insert(253, 0);
+  tree.insert(374, 0);
+  tree.insert(384, 0);
+  tree.insert(95, 0);
+  tree.insert(370, 0);
+  tree.insert(13, 0);
+  tree.insert(183, 0);
+  tree.insert(136, 0);
+  tree.insert(313, 0);
+  tree.insert(307, 0);
+  tree.insert(239, 0);
+  tree.insert(258, 0);
+  tree.insert(405, 0);
+  tree.insert(56, 0);
+  tree.insert(228, 0);
+  tree.insert(455, 0);
+  tree.insert(317, 0);
+  tree.insert(497, 0);
+  tree.insert(102, 0);
+  tree.insert(117, 0);
+  tree.insert(68, 0);
+  tree.insert(234, 0);
+  tree.insert(51, 0);
+  tree.insert(107, 0);
+  tree.insert(349, 0);
+  tree.insert(348, 0);
+  tree.insert(416, 0);
+  tree.insert(88, 0);
+  tree.insert(89, 0);
+  tree.insert(366, 0);
+  tree.insert(109, 0);
+  tree.insert(189, 0);
+  tree.insert(333, 0);
+  tree.insert(3, 0);
+  tree.insert(394, 0);
+  tree.insert(267, 0);
+  tree.insert(269, 0);
+  tree.insert(246, 0);
+  tree.insert(152, 0);
+  tree.insert(173, 0);
+  tree.insert(438, 0);
+  tree.insert(24, 0);
+  tree.insert(15, 0);
+  tree.insert(390, 0);
+  tree.insert(284, 0);
+  tree.insert(360, 0);
+  tree.insert(371, 0);
+  tree.insert(81, 0);
+  tree.insert(65, 0);
+  tree.insert(299, 0);
+  tree.insert(132, 0);
+  tree.insert(98, 0);
+  tree.insert(303, 0);
+  tree.insert(139, 0);
+  tree.insert(453, 0);
+  tree.insert(402, 0);
+  tree.insert(20, 0);
+  tree.insert(54, 0);
+  tree.insert(499, 0);
+  tree.insert(260, 0);
+  tree.insert(285, 0);
+  tree.insert(381, 0);
+  tree.insert(357, 0);
+  tree.insert(248, 0);
+  tree.insert(362, 0);
+  tree.insert(62, 0);
+  tree.insert(203, 0);
+  tree.insert(411, 0);
+  tree.insert(444, 0);
+  tree.insert(388, 0);
+  tree.insert(10, 0);
+  tree.insert(342, 0);
+  tree.insert(229, 0);
+  tree.insert(481, 0);
+  tree.insert(369, 0);
+  tree.insert(378, 0);
+  tree.insert(38, 0);
+  tree.insert(77, 0);
+  tree.insert(415, 0);
+  tree.insert(466, 0);
+  tree.insert(404, 0);
+  tree.insert(90, 0);
+  tree.insert(101, 0);
+  tree.insert(169, 0);
+  tree.insert(435, 0);
+  tree.insert(296, 0);
+  tree.insert(282, 0);
+  tree.insert(63, 0);
+  tree.insert(52, 0);
+  tree.insert(40, 0);
+  tree.insert(231, 0);
+  tree.insert(302, 0);
+  tree.insert(18, 0);
+  tree.insert(383, 0);
+  tree.insert(194, 0);
+  tree.insert(351, 0);
+  tree.insert(254, 0);
+  tree.insert(431, 0);
+  tree.insert(199, 0);
+  tree.insert(80, 0);
+  tree.insert(300, 0);
+  tree.insert(140, 0);
+  tree.insert(324, 0);
+  tree.insert(286, 0);
+  tree.insert(188, 0);
+  tree.insert(386, 0);
+  tree.insert(344, 0);
+  tree.insert(166, 0);
+  tree.insert(4, 0);
+  tree.insert(226, 0);
+  tree.insert(316, 0);
+  tree.insert(158, 0);
+  tree.insert(447, 0);
+  tree.insert(86, 0);
+  tree.insert(398, 0);
+  tree.insert(108, 0);
+  tree.insert(230, 0);
+  tree.insert(310, 0);
+  tree.insert(495, 0);
+  tree.insert(171, 0);
+  tree.insert(380, 0);
+  tree.insert(249, 0);
+  tree.insert(433, 0);
+  tree.insert(16, 0);
+  tree.insert(470, 0);
+  tree.insert(277, 0);
+  tree.insert(21, 0);
+  tree.insert(372, 0);
+  tree.insert(252, 0);
+  tree.insert(424, 0);
+  tree.insert(144, 0);
+  tree.insert(377, 0);
+  tree.insert(59, 0);
+  tree.insert(46, 0);
+  tree.insert(55, 0);
+  tree.insert(429, 0);
+  tree.insert(474, 0);
+  tree.insert(321, 0);
+  tree.insert(399, 0);
+  tree.insert(471, 0);
+  tree.insert(237, 0);
+  tree.insert(442, 0);
+  tree.insert(97, 0);
+  tree.insert(220, 0);
+  tree.insert(445, 0);
+  tree.insert(326, 0);
+  tree.insert(37, 0);
+  tree.insert(336, 0);
+  tree.insert(343, 0);
+  tree.insert(412, 0);
+  tree.insert(409, 0);
+  tree.insert(460, 0);
+  tree.insert(57, 0);
+  tree.insert(168, 0);
+  tree.insert(295, 0);
+  tree.insert(247, 0);
+  tree.insert(482, 0);
+  tree.insert(425, 0);
+  tree.insert(256, 0);
+  tree.insert(96, 0);
+  tree.insert(53, 0);
+  tree.insert(469, 0);
+  tree.insert(162, 0);
+  tree.insert(493, 0);
+  tree.insert(294, 0);
+  tree.insert(177, 0);
+  tree.insert(212, 0);
+  tree.insert(30, 0);
+  tree.insert(5, 0);
+  tree.insert(193, 0);
+  tree.insert(483, 0);
+  tree.insert(124, 0);
+  tree.insert(87, 0);
+  tree.insert(64, 0);
+  tree.insert(490, 0);
+  tree.insert(155, 0);
+  tree.insert(422, 0);
+  tree.insert(191, 0);
+  tree.insert(75, 0);
+  tree.insert(325, 0);
+  tree.insert(1, 0);
+  tree.insert(182, 0);
+  tree.insert(28, 0);
+  tree.insert(364, 0);
+  tree.insert(42, 0);
+  tree.insert(39, 0);
+  tree.insert(376, 0);
+  tree.insert(467, 0);
+  tree.insert(426, 0);
+  tree.insert(205, 0);
+  tree.insert(365, 0);
+  tree.insert(137, 0);
+  tree.insert(297, 0);
+  tree.insert(462, 0);
+  tree.insert(241, 0);
+  tree.insert(123, 0);
+  tree.insert(206, 0);
+  tree.insert(440, 0);
+  tree.insert(216, 0);
+  tree.insert(146, 0);
+  tree.insert(142, 0);
+  tree.insert(72, 0);
+  tree.insert(379, 0);
+  tree.insert(472, 0);
+  tree.insert(305, 0);
+  tree.insert(271, 0);
+  tree.insert(298, 0);
+  tree.insert(232, 0);
+  tree.insert(242, 0);
+  tree.insert(184, 0);
+  tree.insert(138, 0);
+  tree.insert(154, 0);
+  tree.insert(200, 0);
+  tree.insert(71, 0);
+  tree.insert(211, 0);
+  tree.insert(274, 0);
+  tree.insert(263, 0);
+  tree.insert(311, 0);
+  tree.insert(428, 0);
+  tree.insert(331, 0);
+  tree.insert(7, 0);
+  tree.insert(345, 0);
+  tree.insert(185, 0);
+  tree.insert(338, 0);
+  tree.insert(251, 0);
+  tree.insert(417, 0);
+  tree.insert(12, 0);
+  tree.insert(93, 0);
+  tree.insert(204, 0);
+  tree.insert(257, 0);
+  tree.insert(418, 0);
+  tree.insert(314, 0);
+
+  tree.erase(110);
+  tree.erase(290);
+  tree.erase(11);
+  tree.erase(69);
+  tree.erase(209);
+  tree.erase(468);
+  tree.erase(17);
+  tree.erase(293);
+  tree.erase(164);
+  tree.erase(350);
+  tree.erase(115);
+  tree.erase(322);
+  tree.erase(361);
+  tree.erase(2);
+  tree.erase(446);
+  tree.erase(281);
+  tree.erase(400);
+  tree.erase(375);
+  tree.erase(153);
+  tree.erase(116);
+  tree.erase(143);
+  tree.erase(329);
+  tree.erase(420);
+  tree.erase(133);
+  tree.erase(363);
+  tree.erase(192);
+  tree.erase(27);
+  tree.erase(275);
+  tree.erase(104);
+  tree.erase(213);
+  tree.erase(352);
+  tree.erase(427);
+  tree.erase(273);
+  tree.erase(288);
+  tree.erase(396);
+  tree.erase(114);
+  tree.erase(341);
+  tree.erase(413);
+  tree.erase(201);
+  tree.erase(280);
+  tree.erase(66);
+  tree.erase(227);
+  tree.erase(406);
+  tree.erase(79);
+  tree.erase(259);
+  tree.erase(176);
+  tree.erase(106);
+  tree.erase(0);
+  tree.erase(328);
+  tree.erase(270);
+  tree.erase(449);
+  tree.erase(165);
+  tree.erase(163);
+  tree.erase(43);
+  tree.erase(391);
+  tree.erase(202);
+  tree.erase(49);
+  tree.erase(105);
+  tree.erase(149);
+  tree.erase(318);
+  tree.erase(387);
+  tree.erase(389);
+  tree.erase(141);
+  tree.erase(408);
+  tree.erase(486);
+  tree.erase(354);
+  tree.erase(8);
+  tree.erase(33);
+  tree.erase(421);
+  tree.erase(385);
+  tree.erase(25);
+  tree.erase(485);
+  tree.erase(196);
+  tree.erase(31);
+  tree.erase(82);
+  tree.erase(434);
+  tree.erase(423);
+  tree.erase(358);
+  tree.erase(255);
+  tree.erase(287);
+  tree.erase(23);
+  tree.erase(122);
+  tree.erase(489);
+  tree.erase(19);
+  tree.erase(126);
+  tree.erase(44);
+  tree.erase(120);
+  tree.erase(131);
+  tree.erase(332);
+  tree.erase(448);
+  tree.erase(238);
+  tree.erase(264);
+  tree.erase(454);
+  tree.erase(218);
+  tree.erase(157);
+  tree.erase(436);
+  tree.erase(225);
+  tree.erase(437);
+  tree.erase(443);
+  tree.erase(179);
+  tree.erase(265);
+  tree.erase(475);
+  tree.erase(180);
+  tree.erase(487);
+  tree.erase(339);
+  tree.erase(492);
+  tree.erase(395);
+  tree.erase(491);
+  tree.erase(223);
+  tree.erase(113);
+  tree.erase(92);
+  tree.erase(48);
+  tree.erase(61);
+  tree.erase(127);
+  tree.erase(190);
+  tree.erase(67);
+  tree.erase(484);
+  tree.erase(439);
+  tree.erase(355);
+  tree.erase(243);
+  tree.erase(392);
+  tree.erase(159);
+  tree.erase(74);
+  tree.erase(337);
+  tree.erase(151);
+  tree.erase(458);
+  tree.erase(480);
+  tree.erase(334);
+  tree.erase(419);
+  tree.erase(309);
+  tree.erase(301);
+  tree.erase(125);
+  tree.erase(407);
+  tree.erase(496);
+  tree.erase(187);
+  tree.erase(50);
+  tree.erase(368);
+  tree.erase(283);
+  tree.erase(244);
+  tree.erase(170);
+  tree.erase(118);
+  tree.erase(457);
+  tree.erase(181);
+  tree.erase(479);
+  tree.erase(401);
+  tree.erase(494);
+  tree.erase(99);
+  tree.erase(236);
+  tree.erase(240);
+  tree.erase(147);
+  tree.erase(233);
+  tree.erase(172);
+  tree.erase(266);
+  tree.erase(32);
+  tree.erase(210);
+  tree.erase(161);
+  tree.erase(156);
+  tree.erase(178);
+  tree.erase(221);
+  tree.erase(78);
+  tree.erase(85);
+  tree.erase(135);
+  tree.erase(145);
+  tree.erase(356);
+  tree.erase(397);
+  tree.erase(450);
+  tree.erase(276);
+  tree.erase(41);
+  tree.erase(414);
+  tree.erase(14);
+  tree.erase(22);
+  tree.erase(29);
+  tree.erase(34);
+  tree.erase(498);
+  tree.erase(250);
+  tree.erase(36);
+  tree.erase(320);
+  tree.erase(268);
+  tree.erase(195);
+  tree.erase(382);
+  tree.erase(441);
+  tree.erase(235);
+  tree.erase(346);
+  tree.erase(476);
+  tree.erase(217);
+  tree.erase(335);
+  tree.erase(121);
+  tree.erase(94);
+  tree.erase(278);
+  tree.erase(272);
+  tree.erase(207);
+  tree.erase(463);
+  tree.erase(150);
+  tree.erase(432);
+  tree.erase(410);
+  tree.erase(208);
+  tree.erase(70);
+  tree.erase(84);
+  tree.erase(186);
+  tree.erase(6);
+  tree.erase(224);
+  tree.erase(9);
+  tree.erase(60);
+  tree.erase(175);
+  tree.erase(430);
+  tree.erase(128);
+  tree.erase(129);
+  tree.erase(465);
+  tree.erase(459);
+  tree.erase(289);
+  tree.erase(261);
+  tree.erase(26);
+  tree.erase(461);
+  tree.erase(279);
+  tree.erase(245);
+  tree.erase(478);
+  tree.erase(403);
+  tree.erase(45);
+  tree.erase(359);
+  tree.erase(327);
+  tree.erase(393);
+  tree.erase(373);
+  tree.erase(304);
+  tree.erase(83);
+  tree.erase(160);
+  tree.erase(198);
+  tree.erase(103);
+  tree.erase(367);
+  tree.erase(76);
+  tree.erase(73);
+  tree.erase(167);
+  tree.erase(291);
+  tree.erase(215);
+  tree.erase(219);
+  tree.erase(119);
+  tree.erase(456);
+  tree.erase(197);
+  tree.erase(477);
+  tree.erase(222);
+  tree.erase(174);
+  tree.erase(451);
+  tree.erase(214);
+  tree.erase(112);
+  tree.erase(464);
+  tree.erase(262);
+  tree.erase(47);
+  tree.erase(347);
+  tree.erase(111);
+  tree.erase(148);
+  tree.erase(308);
+  tree.erase(340);
+  tree.erase(100);
+  tree.erase(130);
+  tree.erase(323);
+  tree.erase(312);
+  tree.erase(292);
+  tree.erase(35);
+  tree.erase(306);
+  tree.erase(58);
+  tree.erase(353);
+  tree.erase(452);
+  tree.erase(91);
+  tree.erase(319);
+  tree.erase(330);
+  tree.erase(473);
+  tree.erase(488);
+  tree.erase(134);
+  tree.erase(315);
+  tree.erase(253);
+  tree.erase(374);
+  tree.erase(384);
+  tree.erase(95);
+  tree.erase(370);
+  tree.erase(13);
+  tree.erase(183);
+  tree.erase(136);
+  tree.erase(313);
+  tree.erase(307);
+  tree.erase(239);
+  tree.erase(258);
+  tree.erase(405);
+  tree.erase(56);
+  tree.erase(228);
+  tree.erase(455);
+  tree.erase(317);
+  tree.erase(497);
+  tree.erase(102);
+  tree.erase(117);
+  tree.erase(68);
+  tree.erase(234);
+  tree.erase(51);
+  tree.erase(107);
+  tree.erase(349);
+  tree.erase(348);
+  tree.erase(416);
+  tree.erase(88);
+  tree.erase(89);
+  tree.erase(366);
+  tree.erase(109);
+  tree.erase(189);
+  tree.erase(333);
+  tree.erase(3);
+  tree.erase(394);
+  tree.erase(267);
+  tree.erase(269);
+  tree.erase(246);
+  tree.erase(152);
+  tree.erase(173);
+  tree.erase(438);
+  tree.erase(24);
+  tree.erase(15);
+  tree.erase(390);
+  tree.erase(284);
+  tree.erase(360);
+  tree.erase(371);
+  tree.erase(81);
+  tree.erase(65);
+  tree.erase(299);
+  tree.erase(132);
+  tree.erase(98);
+  tree.erase(303);
+  tree.erase(139);
+  tree.erase(453);
+  tree.erase(402);
+  tree.erase(20);
+  tree.erase(54);
+  tree.erase(499);
+  tree.erase(260);
+  tree.erase(285);
+  tree.erase(381);
+  tree.erase(357);
+  tree.erase(248);
+  tree.erase(362);
+  tree.erase(62);
+  tree.erase(203);
+  tree.erase(411);
+  tree.erase(444);
+  tree.erase(388);
+  tree.erase(10);
+  tree.erase(342);
+  tree.erase(229);
+  tree.erase(481);
+  tree.erase(369);
+  tree.erase(378);
+  tree.erase(38);
+  tree.erase(77);
+  tree.erase(415);
+  tree.erase(466);
+  tree.erase(404);
+  tree.erase(90);
+  tree.erase(101);
+  tree.erase(169);
+  tree.erase(435);
+  tree.erase(296);
+  tree.erase(282);
+  tree.erase(63);
+  tree.erase(52);
+  tree.erase(40);
+  tree.erase(231);
+  tree.erase(302);
+  tree.erase(18);
+  tree.erase(383);
+  tree.erase(194);
+  tree.erase(351);
+  tree.erase(254);
+  tree.erase(431);
+  tree.erase(199);
+  tree.erase(80);
+  tree.erase(300);
+  tree.erase(140);
+  tree.erase(324);
+  tree.erase(286);
+  tree.erase(188);
+  tree.erase(386);
+  tree.erase(344);
+  tree.erase(166);
+  tree.erase(4);
+  tree.erase(226);
+  tree.erase(316);
+  tree.erase(158);
+  tree.erase(447);
+  tree.erase(86);
+  tree.erase(398);
+  tree.erase(108);
+  tree.erase(230);
+  tree.erase(310);
+  tree.erase(495);
+  tree.erase(171);
+  tree.erase(380);
+  tree.erase(249);
+  tree.erase(433);
+  tree.erase(16);
+  tree.erase(470);
+  tree.erase(277);
+  tree.erase(21);
+  tree.erase(372);
+  tree.erase(252);
+  tree.erase(424);
+  tree.erase(144);
+  tree.erase(377);
+  tree.erase(59);
+  tree.erase(46);
+  tree.erase(55);
+  tree.erase(429);
+  tree.erase(474);
+  tree.erase(321);
+  tree.erase(399);
+  tree.erase(471);
+  tree.erase(237);
+  tree.erase(442);
+  tree.erase(97);
+  tree.erase(220);
+  tree.erase(445);
+  tree.erase(326);
+  tree.erase(37);
+  tree.erase(336);
+  tree.erase(343);
+  tree.erase(412);
+  tree.erase(409);
+  tree.erase(460);
+  tree.erase(57);
+  tree.erase(168);
+  tree.erase(295);
+  tree.erase(247);
+  tree.erase(482);
+  tree.erase(425);
+  tree.erase(256);
+  tree.erase(96);
+  tree.erase(53);
+  tree.erase(469);
+  tree.erase(162);
+  tree.erase(493);
+  tree.erase(294);
+  tree.erase(177);
+  tree.erase(212);
+  tree.erase(30);
+  tree.erase(5);
+  tree.erase(193);
+  tree.erase(483);
+  tree.erase(124);
+  tree.erase(87);
+  tree.erase(64);
+  tree.erase(490);
+  tree.erase(155);
+  tree.erase(422);
+  tree.erase(191);
+  tree.erase(75);
+  tree.erase(325);
+  tree.erase(1);
+  tree.erase(182);
+  tree.erase(28);
+  tree.erase(364);
+  tree.erase(42);
+  tree.erase(39);
+  tree.erase(376);
+  tree.erase(467);
+  tree.erase(426);
+  tree.erase(205);
+  tree.erase(365);
+  tree.erase(137);
+  tree.erase(297);
+  tree.erase(462);
+  tree.erase(241);
+  tree.erase(123);
+  tree.erase(206);
+  tree.erase(440);
+  tree.erase(216);
+  tree.erase(146);
+  tree.erase(142);
+  tree.erase(72);
+  tree.erase(379);
+  tree.erase(472);
+  tree.erase(305);
+  tree.erase(271);
+  tree.erase(298);
+  tree.erase(232);
+  tree.erase(242);
+  tree.erase(184);
+  tree.erase(138);
+  tree.erase(154);
+  tree.erase(200);
+  tree.erase(71);
+  tree.erase(211);
+  tree.erase(274);
+  tree.erase(263);
+  tree.erase(311);
+  tree.erase(428);
+  tree.erase(331);
+  tree.erase(7);
+  tree.erase(345);
+  tree.erase(185);
+  tree.erase(338);
+  tree.erase(251);
+  tree.erase(417);
+  tree.erase(12);
+  tree.erase(93);
+  tree.erase(204);
+  tree.erase(257);
+  tree.erase(418);
+  tree.erase(314);
+
+  if (!tree.empty())
+    return false;
+
+  return true;
+}
+
+bool
+test09() {
+
+  // Pseudo-random insertion and erases, pseudo-randomly interleaved.
+
+  CO_Tree tree;
+
+  tree.insert(172261, 5);
+  tree.insert(690360, 5);
+  tree.erase(228023);
+  tree.erase(81);
+  tree.erase(903190);
+  tree.erase(618996);
+  tree.erase(214677);
+  tree.insert(730690, 5);
+  tree.insert(764524, 5);
+  tree.erase(349614);
+  tree.insert(328205, 5);
+  tree.insert(726312, 5);
+  tree.insert(565100, 5);
+  tree.insert(602726, 5);
+  tree.insert(204916, 5);
+  tree.insert(325578, 5);
+  tree.erase(528946);
+  tree.insert(302647, 5);
+  tree.insert(799051, 5);
+  tree.insert(799631, 5);
+  tree.erase(830857);
+  tree.erase(541312);
+  tree.insert(439214, 5);
+  tree.erase(193512);
+  tree.insert(14412, 5);
+  tree.erase(909610);
+  tree.erase(966189);
+  tree.insert(806355, 5);
+  tree.erase(356620);
+  tree.erase(198987);
+  tree.insert(498338, 5);
+  tree.insert(487770, 5);
+  tree.insert(56856, 5);
+  tree.erase(300606);
+  tree.insert(125849, 5);
+  tree.erase(107205);
+  tree.erase(35217);
+  tree.insert(34945, 5);
+  tree.erase(436873);
+  tree.insert(710873, 5);
+  tree.erase(804289);
+  tree.erase(826607);
+  tree.insert(772757, 5);
+  tree.insert(334471, 5);
+  tree.erase(591100);
+  tree.erase(723618);
+  tree.insert(58025, 5);
+  tree.insert(633074, 5);
+  tree.erase(518157);
+  tree.erase(3493);
+  tree.insert(550270, 5);
+  tree.erase(633417);
+  tree.erase(275569);
+  tree.erase(92622);
+  tree.insert(413173, 5);
+  tree.erase(196431);
+  tree.insert(456682, 5);
+  tree.insert(504292, 5);
+  tree.erase(205057);
+  tree.erase(391521);
+  tree.erase(888574);
+  tree.erase(401947);
+  tree.erase(359231);
+  tree.erase(610537);
+  tree.insert(485054, 5);
+  tree.insert(554098, 5);
+  tree.erase(241081);
+  tree.insert(653516, 5);
+  tree.insert(372231, 5);
+  tree.erase(261796);
+  tree.insert(582338, 5);
+  tree.insert(519218, 5);
+  tree.erase(513970);
+  tree.insert(784812, 5);
+  tree.erase(894977);
+  tree.erase(31536);
+  tree.insert(324176, 5);
+  tree.erase(279207);
+  tree.erase(984857);
+  tree.insert(593499, 5);
+  tree.erase(20127);
+  tree.insert(505236, 5);
+  tree.insert(367818, 5);
+  tree.erase(810563);
+  tree.erase(421244);
+  tree.erase(41805);
+  tree.insert(563291, 5);
+  tree.erase(558955);
+  tree.insert(133589, 5);
+  tree.insert(828993, 5);
+  tree.insert(552805, 5);
+  tree.insert(844822, 5);
+  tree.insert(326717, 5);
+  tree.insert(593093, 5);
+  tree.insert(530126, 5);
+  tree.erase(781486);
+  tree.erase(850543);
+  tree.insert(327814, 5);
+  tree.erase(478179);
+  tree.erase(474762);
+  tree.erase(727088);
+  tree.erase(935710);
+  tree.insert(110294, 5);
+  tree.erase(400346);
+  tree.erase(871137);
+  tree.erase(305153);
+  tree.erase(122573);
+  tree.insert(300925, 5);
+  tree.erase(306710);
+  tree.insert(277217, 5);
+  tree.insert(596963, 5);
+  tree.erase(387090);
+  tree.insert(378130, 5);
+  tree.insert(698571, 5);
+  tree.erase(369633);
+  tree.erase(304789);
+  tree.erase(722604);
+  tree.erase(419805);
+  tree.insert(767868, 5);
+  tree.erase(109485);
+  tree.insert(82195, 5);
+  tree.erase(62949);
+  tree.insert(80967, 5);
+  tree.insert(686763, 5);
+  tree.erase(290596);
+  tree.erase(740865);
+  tree.insert(539036, 5);
+  tree.erase(367770);
+  tree.insert(359211, 5);
+  tree.insert(322532, 5);
+  tree.insert(272379, 5);
+  tree.erase(858270);
+  tree.insert(384172, 5);
+  tree.erase(344234);
+  tree.insert(647283, 5);
+  tree.insert(307398, 5);
+  tree.insert(901063, 5);
+  tree.erase(966950);
+  tree.insert(250573, 5);
+  tree.insert(886059, 5);
+  tree.insert(134047, 5);
+  tree.insert(945082, 5);
+  tree.erase(271232);
+  tree.insert(622954, 5);
+  tree.erase(411898);
+  tree.insert(875640, 5);
+  tree.insert(89159, 5);
+  tree.insert(679262, 5);
+  tree.erase(561041);
+  tree.insert(141723, 5);
+  tree.insert(26272, 5);
+  tree.insert(454154, 5);
+  tree.erase(335821);
+  tree.erase(909365);
+  tree.erase(591171);
+  tree.insert(160269, 5);
+  tree.insert(938701, 5);
+  tree.erase(914653);
+  tree.erase(450907);
+  tree.erase(356728);
+  tree.insert(515797, 5);
+  tree.insert(547084, 5);
+  tree.insert(515334, 5);
+  tree.insert(110991, 5);
+  tree.insert(798898, 5);
+  tree.erase(801052);
+  tree.erase(218189);
+  tree.erase(752506);
+  tree.insert(709016, 5);
+  tree.insert(173109, 5);
+  tree.erase(490000);
+  tree.insert(58109, 5);
+  tree.erase(955081);
+  tree.insert(671338, 5);
+  tree.erase(59426);
+  tree.erase(785147);
+  tree.erase(776787);
+  tree.erase(696532);
+  tree.insert(591281, 5);
+  tree.erase(884850);
+  tree.erase(576590);
+  tree.insert(215350, 5);
+  tree.erase(973813);
+  tree.erase(381494);
+  tree.erase(146081);
+  tree.erase(15720);
+  tree.erase(887982);
+  tree.erase(97487);
+  tree.erase(79296);
+  tree.erase(765404);
+  tree.insert(796892, 5);
+  tree.erase(230297);
+  tree.insert(399134, 5);
+  tree.erase(898506);
+  tree.erase(767057);
+  tree.insert(380595, 5);
+  tree.erase(501962);
+  tree.erase(687483);
+  tree.insert(80154, 5);
+  tree.erase(191309);
+  tree.erase(139932);
+  tree.insert(895021, 5);
+  tree.insert(313563, 5);
+  tree.insert(903682, 5);
+  tree.erase(277685);
+  tree.insert(564285, 5);
+  tree.insert(735990, 5);
+  tree.erase(197314);
+  tree.insert(754116, 5);
+  tree.insert(641892, 5);
+  tree.erase(395528);
+  tree.erase(897525);
+  tree.insert(651136, 5);
+  tree.insert(889618, 5);
+  tree.erase(170337);
+  tree.insert(506582, 5);
+  tree.erase(804310);
+  tree.erase(370888);
+  tree.erase(426815);
+  tree.insert(543437, 5);
+  tree.erase(460008);
+  tree.insert(811783, 5);
+  tree.insert(418657, 5);
+  tree.erase(363827);
+  tree.insert(621269, 5);
+  tree.erase(726651);
+  tree.erase(60910);
+  tree.insert(430639, 5);
+  tree.insert(241888, 5);
+  tree.insert(992393, 5);
+  tree.erase(433890);
+  tree.insert(755199, 5);
+  tree.insert(416931, 5);
+  tree.erase(388777);
+  tree.erase(400657);
+  tree.insert(580952, 5);
+  tree.erase(72641);
+  tree.erase(89368);
+  tree.insert(918184, 5);
+  tree.erase(696776);
+  tree.erase(975266);
+  tree.insert(588954, 5);
+  tree.insert(80308, 5);
+  tree.erase(297278);
+  tree.erase(372555);
+  tree.insert(250774, 5);
+  tree.erase(305000);
+  tree.erase(560997);
+  tree.erase(648412);
+  tree.erase(598382);
+  tree.erase(914693);
+  tree.insert(942439, 5);
+  tree.insert(88421, 5);
+  tree.erase(994985);
+  tree.erase(1354);
+  tree.erase(578762);
+  tree.insert(631541, 5);
+  tree.insert(561852, 5);
+  tree.insert(703662, 5);
+  tree.insert(550399, 5);
+  tree.erase(665154);
+  tree.erase(399015);
+  tree.insert(839851, 5);
+  tree.insert(724790, 5);
+  tree.erase(942491);
+  tree.insert(570037, 5);
+  tree.erase(18859);
+  tree.insert(360871, 5);
+  tree.insert(576987, 5);
+  tree.insert(146590, 5);
+  tree.erase(563970);
+  tree.insert(587665, 5);
+  tree.erase(893069);
+  tree.erase(907361);
+  tree.erase(41351);
+  tree.insert(189300, 5);
+  tree.insert(291638, 5);
+  tree.erase(709364);
+  tree.erase(581032);
+  tree.insert(136104, 5);
+  tree.erase(273679);
+  tree.erase(413412);
+  tree.insert(734969, 5);
+  tree.insert(916170, 5);
+  tree.insert(162844, 5);
+  tree.insert(406649, 5);
+  tree.insert(304465, 5);
+  tree.insert(922326, 5);
+  tree.insert(660183, 5);
+  tree.erase(826969);
+  tree.erase(320152);
+  tree.erase(924393);
+  tree.insert(637289, 5);
+  tree.erase(259631);
+  tree.erase(584264);
+  tree.erase(774548);
+  tree.erase(101877);
+  tree.erase(666833);
+  tree.insert(994949, 5);
+  tree.erase(665155);
+  tree.erase(678468);
+  tree.insert(400960, 5);
+  tree.erase(98823);
+  tree.insert(213171, 5);
+  tree.insert(185677, 5);
+  tree.insert(493245, 5);
+  tree.erase(572761);
+  tree.insert(150323, 5);
+  tree.insert(84100, 5);
+  tree.insert(461075, 5);
+  tree.insert(322042, 5);
+  tree.insert(42659, 5);
+  tree.erase(456289);
+  tree.insert(293469, 5);
+  tree.insert(841551, 5);
+  tree.insert(125383, 5);
+  tree.erase(63133);
+  tree.erase(19304);
+  tree.insert(365981, 5);
+  tree.erase(953666);
+  tree.erase(788967);
+  tree.insert(90192, 5);
+  tree.erase(380902);
+  tree.insert(88131, 5);
+  tree.insert(683174, 5);
+  tree.erase(649718);
+  tree.insert(301183, 5);
+  tree.erase(945487);
+  tree.insert(434573, 5);
+  tree.erase(725062);
+  tree.erase(713933);
+  tree.erase(312496);
+  tree.insert(893141, 5);
+  tree.erase(971726);
+  tree.insert(596980, 5);
+  tree.erase(843485);
+  tree.insert(372305, 5);
+  tree.insert(264029, 5);
+  tree.erase(206898);
+  tree.insert(734562, 5);
+  tree.insert(417719, 5);
+  tree.insert(411641, 5);
+  tree.insert(593010, 5);
+  tree.insert(992726, 5);
+  tree.erase(628789);
+  tree.insert(303708, 5);
+  tree.erase(600938);
+  tree.erase(152493);
+  tree.erase(980710);
+  tree.insert(785905, 5);
+  tree.insert(49613, 5);
+  tree.erase(963638);
+  tree.insert(79421, 5);
+  tree.erase(207829);
+  tree.erase(96180);
+  tree.erase(209095);
+  tree.erase(843024);
+  tree.insert(749154, 5);
+  tree.insert(10569, 5);
+  tree.insert(979969, 5);
+  tree.insert(492373, 5);
+  tree.insert(498433, 5);
+  tree.erase(932587);
+  tree.erase(620094);
+  tree.erase(291499);
+  tree.erase(7339);
+  tree.insert(551742, 5);
+  tree.insert(312086, 5);
+  tree.erase(231349);
+  tree.erase(950186);
+  tree.erase(495011);
+  tree.insert(874133, 5);
+  tree.erase(812722);
+  tree.erase(806773);
+  tree.erase(881519);
+  tree.insert(495354, 5);
+  tree.insert(103124, 5);
+  tree.erase(16259);
+  tree.erase(677418);
+  tree.erase(981712);
+  tree.erase(558705);
+  tree.insert(342733, 5);
+  tree.erase(992734);
+  tree.erase(774315);
+  tree.erase(691087);
+  tree.erase(100669);
+  tree.insert(916487, 5);
+  tree.insert(556837, 5);
+  tree.insert(598089, 5);
+  tree.insert(585205, 5);
+  tree.insert(666704, 5);
+  tree.erase(402557);
+  tree.erase(623403);
+  tree.insert(321892, 5);
+  tree.erase(571522);
+  tree.erase(302443);
+  tree.erase(325361);
+  tree.insert(273378, 5);
+  tree.erase(332700);
+  tree.erase(574882);
+  tree.erase(804899);
+  tree.erase(242589);
+  tree.insert(650353, 5);
+  tree.insert(966948, 5);
+  tree.insert(163036, 5);
+  tree.insert(277107, 5);
+  tree.insert(665417, 5);
+  tree.insert(115921, 5);
+  tree.insert(98480, 5);
+  tree.insert(105994, 5);
+  tree.insert(774123, 5);
+  tree.erase(832933);
+  tree.insert(86317, 5);
+  tree.insert(933931, 5);
+  tree.erase(186709);
+  tree.erase(959156);
+  tree.insert(217069, 5);
+  tree.erase(712995);
+  tree.insert(1171, 5);
+  tree.erase(148569);
+  tree.erase(264801);
+  tree.insert(26652, 5);
+  tree.erase(105340);
+  tree.erase(251743);
+  tree.insert(613091, 5);
+  tree.erase(906527);
+  tree.insert(798878, 5);
+  tree.insert(3050, 5);
+  tree.insert(362124, 5);
+  tree.erase(304213);
+  tree.insert(478499, 5);
+  tree.insert(56794, 5);
+  tree.insert(465115, 5);
+  tree.erase(79342);
+  tree.erase(482437);
+  tree.erase(663198);
+  tree.insert(169939, 5);
+  tree.insert(226513, 5);
+  tree.erase(865128);
+  tree.erase(511804);
+  tree.erase(352346);
+  tree.erase(898138);
+  tree.erase(190495);
+  tree.insert(36421, 5);
+  tree.insert(387226, 5);
+  tree.insert(134158, 5);
+  tree.erase(120356);
+  tree.insert(77645, 5);
+  tree.insert(993446, 5);
+  tree.erase(568111);
+  tree.erase(417603);
+  tree.erase(255825);
+  tree.insert(470216, 5);
+  tree.erase(379174);
+  tree.insert(960596, 5);
+  tree.insert(846267, 5);
+  tree.insert(342013, 5);
+  tree.erase(980519);
+  tree.insert(194650, 5);
+  tree.insert(117832, 5);
+  tree.insert(390279, 5);
+  tree.insert(963953, 5);
+  tree.erase(959295);
+  tree.insert(96107, 5);
+  tree.erase(714937);
+  tree.insert(944976, 5);
+  tree.insert(444584, 5);
+  tree.erase(720083);
+  tree.insert(199492, 5);
+  tree.erase(766496);
+  tree.insert(22939, 5);
+  tree.erase(505735);
+  tree.insert(389873, 5);
+  tree.insert(930164, 5);
+  tree.erase(52251);
+  tree.erase(682751);
+  tree.insert(816339, 5);
+  tree.insert(953165, 5);
+  tree.insert(688302, 5);
+  tree.erase(761079);
+  tree.erase(262547);
+  tree.erase(568484);
+  tree.erase(939561);
+  tree.erase(621931);
+  tree.erase(420528);
+  tree.erase(815494);
+  tree.erase(517543);
+  tree.erase(841123);
+  tree.insert(840187, 5);
+  tree.erase(524643);
+  tree.insert(851988, 5);
+  tree.insert(851320, 5);
+  tree.insert(854098, 5);
+  tree.insert(993018, 5);
+  tree.insert(886463, 5);
+  tree.insert(494695, 5);
+  tree.insert(976505, 5);
+  tree.erase(856142);
+  tree.insert(868098, 5);
+  tree.erase(571472);
+
+  return true;
+}
+
+bool
+test10() {
+
+  CO_Tree tree;
+
+  CO_Tree::iterator itr = tree.end();
+
+  itr = tree.insert(itr, 1, Coefficient(10));
+
+  itr = tree.end();
+
+  itr = tree.insert(itr, 2, 0);
+  itr = tree.insert(itr, 2, 0);
+  itr = tree.insert(itr, 4, 0);
+  itr = tree.insert(itr, 6, 0);
+  itr = tree.insert(itr, 8, 0);
+  itr = tree.insert(itr, 10, 0);
+  itr = tree.insert(itr, 12, 0);
+
+  if (itr.index() != 12)
+    return false;
+
+  --itr;
+  --itr;
+
+  itr = tree.insert(itr, 5, 0);
+  itr = tree.erase(itr);
+
+  if (itr.index() != 6)
+    return false;
+
+  itr = tree.insert(itr, 5, 0);
+  itr = tree.erase(itr);
+
+  if (itr.index() != 6)
+    return false;
+
+  return true;
+}
+
+bool
+test11() {
+
+  CO_Tree tree;
+
+  tree.insert(1, 10);
+
+  tree.erase_element_and_shift_left(1);
+
+  if (!tree.empty())
+    return false;
+
+  tree.increase_keys_from(1, 5);
+
+  if (!tree.empty())
+    return false;
+
+  tree.insert(1, 0);
+  tree.insert(2, 0);
+  tree.insert(3, 0);
+  tree.insert(4, 0);
+
+  tree.increase_keys_from(2, 5);
+
+  CO_Tree::iterator itr = tree.begin();
+
+  if (itr.index() != 1)
+    return false;
+
+  ++itr;
+
+  if (itr.index() != 7)
+    return false;
+
+  ++itr;
+
+  if (itr.index() != 8)
+    return false;
+
+  ++itr;
+
+  if (itr.index() != 9)
+    return false;
+
+  ++itr;
+
+  if (itr != tree.end())
+    return false;
+
+  return true;
+}
+
+bool
+test12() {
+
+  CO_Tree tree;
+
+  tree.insert(1, 10);
+  tree.insert(2, 10);
+  tree.insert(3, 10);
+
+  tree.clear();
+
+  if (!tree.empty())
+    return false;
+
+  if (tree.erase(1) != tree.end())
+    return false;
+
+  CO_Tree::iterator itr = tree.end();
+
+  if (tree.bisect_near(itr, 1) != tree.end())
+    return false;
+
+  CO_Tree::const_iterator citr = tree.cend();
+
+  if (tree.bisect_near(citr, 1) != tree.cend())
+    return false;
+
+  if (static_cast<const CO_Tree&>(tree).bisect(1) != tree.end())
+    return false;
+
+  return true;
+}
+
+bool
+test13() {
+
+  CO_Tree tree;
+
+  tree.insert(2, 10);
+  tree.insert(2, 10);
+  tree.insert(4, 10);
+  tree.insert(6, 10);
+  tree.insert(8, 10);
+  tree.insert(10, 10);
+  tree.insert(12, 10);
+  tree.insert(14, 10);
+
+  CO_Tree::iterator itr;
+
+  itr = tree.bisect(12);
+
+  if (itr.index() != 12)
+    return false;
+
+  itr = tree.bisect_near(itr, 4);
+
+  if (itr.index() != 4)
+    return false;
+
+  itr = tree.bisect(12);
+  itr = tree.bisect_near(itr, 10);
+
+  if (itr.index() != 10)
+    return false;
+
+  return true;
+}
+
+bool
+test14() {
+
+  // Iterating on an empty tree.
+
+  CO_Tree tree;
+
+  if (tree.begin() != tree.end())
+    return false;
+
+  if (tree.cbegin() != tree.cend())
+    return false;
+
+  tree.erase(1);
+  tree.bisect(1);
+  static_cast<const CO_Tree&>(tree).bisect(1);
+
+  return true;
+}
+
+bool
+test15() {
+
+  // Test iterator::swap(), const_iterator::swap(),
+  // iterator::operator*() and const_iterator::operator*().
+
+  CO_Tree tree;
+
+  tree.insert(1, 1);
+  tree.insert(2, 2);
+
+  CO_Tree::iterator itr1 = tree.bisect(1);
+  CO_Tree::iterator itr2 = tree.bisect(2);
+
+  swap(itr1, itr2);
+
+  if (itr2.index() != 1)
+    return false;
+
+  if (*itr2 != 1)
+    return false;
+
+  if (itr1.index() != 2)
+    return false;
+
+  if (*itr1 != 2)
+    return false;
+
+  CO_Tree::const_iterator itr3 = tree.bisect(1);
+  CO_Tree::const_iterator itr4 = tree.bisect(2);
+
+  swap(itr3, itr4);
+
+  if (itr4.index() != 1)
+    return false;
+
+  if (*itr4 != 1)
+    return false;
+
+  if (itr3.index() != 2)
+    return false;
+
+  if (*itr3 != 2)
+    return false;
+
+  return true;
+}
+
+bool
+test16() {
+
+  // Test iterators' and const_iterators' postfix increment and decrement
+  // operators.
+
+  CO_Tree tree;
+
+  tree.insert(1, 0);
+  tree.insert(2, 0);
+  tree.insert(3, 0);
+
+  CO_Tree::iterator itr = tree.bisect(1);
+
+  itr++;
+
+  if (itr.index() != 2)
+    return false;
+
+  itr++;
+
+  if (itr.index() != 3)
+    return false;
+
+  itr--;
+
+  if (itr.index() != 2)
+    return false;
+
+  itr--;
+
+  if (itr.index() != 1)
+    return false;
+
+  CO_Tree::const_iterator itr2 = tree.bisect(1);
+
+  itr2++;
+
+  if (itr2.index() != 2)
+    return false;
+
+  itr2++;
+
+  if (itr2.index() != 3)
+    return false;
+
+  itr2--;
+
+  if (itr2.index() != 2)
+    return false;
+
+  itr2--;
+
+  if (itr2.index() != 1)
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+// A fake test to avoid compiler warnings in BEGIN_MAIN.
+bool test01() {
+  return true;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
+#endif // !PPL_USE_SPARSE_MATRIX
diff --git a/tests/Concrete_Expression/C_Expr.cc b/tests/Concrete_Expression/C_Expr.cc
new file mode 100644
index 0000000..977b71b
--- /dev/null
+++ b/tests/Concrete_Expression/C_Expr.cc
@@ -0,0 +1,32 @@
+/* Definitions for the C_Expr class and its subclasses: non-inline,
+   non-template functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "C_Expr_defs.hh"
+
+int
+main() {
+  return 0;
+}
diff --git a/tests/Concrete_Expression/C_Expr_defs.hh b/tests/Concrete_Expression/C_Expr_defs.hh
new file mode 100644
index 0000000..a635a19
--- /dev/null
+++ b/tests/Concrete_Expression/C_Expr_defs.hh
@@ -0,0 +1,257 @@
+/* Declarations for the C_Expr class and its subclasses.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Expr_defs_hh
+#define PPL_C_Expr_defs_hh 1
+
+#include "Concrete_Expression_defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+struct C_Expr;
+
+enum C_Expr_Kind {
+  BOP,
+  UOP,
+  CAST,
+  INT_CON,
+  FP_CON,
+  APPROX_REF
+};
+
+//! Toy class for testing analysis of floating point computations.
+template <>
+class Concrete_Expression<C_Expr> : public Concrete_Expression_Common<C_Expr> {
+public:
+  //! Builds a concrete expression of the given kind.
+  Concrete_Expression<C_Expr>(Concrete_Expression_Type type, C_Expr_Kind KIND);
+
+  //! Returns the type of \* this.
+  Concrete_Expression_Type type() const;
+
+  //! Returns the kind of \* this.
+  Concrete_Expression_Kind kind() const;
+
+  //! The expression's type.
+  Concrete_Expression_Type expr_type;
+
+  //! The expression's kind.
+  C_Expr_Kind expr_kind;
+};
+
+template <>
+class Binary_Operator<C_Expr> : public Concrete_Expression<C_Expr>,
+                                public Binary_Operator_Common<C_Expr> {
+public:
+  //! Constructor from operator, lhs and rhs.
+  Binary_Operator<C_Expr>(Concrete_Expression_Type type,
+                          Concrete_Expression_BOP binary_operator,
+                          const Concrete_Expression<C_Expr>* left_hand_side,
+                          const Concrete_Expression<C_Expr>* right_hand_side);
+
+  //! Do-nothing destructor.
+  ~Binary_Operator<C_Expr>();
+
+  //! Returns the type of \p *this.
+  Concrete_Expression_Type type() const;
+
+  //! Returns the binary operator of \p *this.
+  Concrete_Expression_BOP binary_operator() const;
+
+  //! Returns the left-hand side of \p *this.
+  const Concrete_Expression<C_Expr>* left_hand_side() const;
+
+  //! Returns the right-hand side of \p *this.
+  const Concrete_Expression<C_Expr>* right_hand_side() const;
+
+  //! Constant identifying binary operator nodes.
+  enum Kind {
+    KIND = BOP
+  };
+
+  //! Constants encoding the different binary operators.
+  enum Operation {
+    ADD,
+    SUB,
+    MUL,
+    DIV,
+    REM,
+    BAND,
+    BOR,
+    BXOR,
+    LSHIFT,
+    RSHIFT
+  };
+
+  //! The operator of \p *this.
+  const Concrete_Expression_BOP bop;
+
+  //! The left-hand side of \p *this.
+  const Concrete_Expression<C_Expr>* lhs;
+
+  //! The right-hand side of \p *this.
+  const Concrete_Expression<C_Expr>* rhs;
+};
+
+template <>
+class Unary_Operator<C_Expr> : public Concrete_Expression<C_Expr>,
+                               public Unary_Operator_Common<C_Expr> {
+public:
+  //! Constructor from operator and argument.
+  Unary_Operator<C_Expr>(Concrete_Expression_Type type,
+                         Concrete_Expression_UOP unary_operator,
+                         const Concrete_Expression<C_Expr>* argument);
+
+  //! Do-nothing destructor.
+  ~Unary_Operator<C_Expr>();
+
+  //! Returns the type of \p *this.
+  Concrete_Expression_Type type() const;
+
+  //! Returns the unary operator of \p *this.
+  Concrete_Expression_UOP unary_operator() const;
+
+  //! Returns the argument of \p *this.
+  const Concrete_Expression<C_Expr>* argument() const;
+
+  //! Constant identifying unary operator nodes.
+  enum Kind {
+    KIND = UOP
+  };
+
+  //! Constants encoding the different unary operators.
+  enum Operation {
+    UPLUS,
+    UMINUS,
+    BNOT
+  };
+
+  //! The operator of \p *this.
+  const Concrete_Expression_UOP uop;
+
+  //! The argument of \p *this.
+  const Concrete_Expression<C_Expr>* arg;
+};
+
+template <>
+class Cast_Operator<C_Expr>
+  : public Concrete_Expression<C_Expr>,
+    public Cast_Operator_Common<C_Expr> {
+public:
+  //! Constructor from cast type and argument.
+  Cast_Operator<C_Expr>(Concrete_Expression_Type type,
+                        const Concrete_Expression<C_Expr>* ar);
+
+  //! Do-nothing destructor.
+  ~Cast_Operator<C_Expr>();
+
+  //! Returns the type of \p *this.
+  Concrete_Expression_Type type() const;
+
+  //! Returns the casted expression.
+  const Concrete_Expression<C_Expr>* argument() const;
+
+  //! Constant identifying cast nodes.
+  enum Kind { KIND = CAST };
+
+  //! The casted expression.
+  const Concrete_Expression<C_Expr>* arg;
+};
+
+template <>
+class Integer_Constant<C_Expr>
+  : public Concrete_Expression<C_Expr>,
+    public Integer_Constant_Common<C_Expr> {
+public:
+  //! Constructor from type and value.
+  Integer_Constant<C_Expr>(Concrete_Expression_Type type,
+                  const Integer_Interval& val);
+
+  //! Do-nothing destructor.
+  ~Integer_Constant<C_Expr>();
+
+  //! Returns the type of \p *this.
+  Concrete_Expression_Type type() const;
+
+  //! Constant identifying integer constant nodes.
+  enum Kind { KIND = INT_CON };
+
+  //! An interval in which the value of the constant falls.
+  Integer_Interval value;
+};
+
+template <>
+class Floating_Point_Constant<C_Expr>
+  : public Concrete_Expression<C_Expr>,
+    public Floating_Point_Constant_Common<C_Expr> {
+public:
+  //! Constructor from value.
+  Floating_Point_Constant<C_Expr>(const char* value_string,
+                                  unsigned int string_size);
+
+  //! Do-nothing destructor.
+  ~Floating_Point_Constant<C_Expr>();
+
+  //! Returns the type of \p *this.
+  Concrete_Expression_Type type() const;
+
+  //! Constant identifying floating constant nodes.
+  enum Kind { KIND = FP_CON };
+
+  //! The floating point constant as written.
+  char* value;
+};
+
+// The use of Integer_Interval here is for simplicity only.
+template <>
+class Approximable_Reference<C_Expr>
+  : public Concrete_Expression<C_Expr>,
+    public Approximable_Reference_Common<C_Expr> {
+public:
+  //! Builds a reference to the entity having the given index.
+  Approximable_Reference<C_Expr>(Concrete_Expression_Type type,
+                                 const Integer_Interval& val,
+                                 dimension_type index);
+
+  //! Do-nothing destructor.
+  ~Approximable_Reference<C_Expr>();
+
+  //! Returns the type of \p *this.
+  Concrete_Expression_Type type() const;
+
+  //! Constant identifying approximable reference nodes.
+  enum Kind { KIND = APPROX_REF };
+
+  //! An interval in which the referenced entity's value falls.
+  Integer_Interval value;
+
+  //! The set of possible indexes for the referenced entity.
+  std::set<dimension_type> dimensions;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "C_Expr_inlines.hh"
+//#include "C_Expr_templates.hh"
+
+#endif // !defined(PPL_C_Expr_defs_hh)
diff --git a/tests/Concrete_Expression/C_Expr_inlines.hh b/tests/Concrete_Expression/C_Expr_inlines.hh
new file mode 100644
index 0000000..c35f888
--- /dev/null
+++ b/tests/Concrete_Expression/C_Expr_inlines.hh
@@ -0,0 +1,187 @@
+/* Definitions for the C_Expr class and its subclasses: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_C_Expr_inlines_hh
+#define PPL_C_Expr_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Concrete_Expression<C_Expr>::
+Concrete_Expression(const Concrete_Expression_Type type,
+                    const C_Expr_Kind KIND)
+  : expr_type(type),
+    expr_kind(KIND) {
+}
+
+inline Concrete_Expression_Kind
+Concrete_Expression<C_Expr>::kind() const {
+  return expr_kind;
+}
+
+inline Concrete_Expression_Type
+Concrete_Expression<C_Expr>::type() const {
+  return expr_type;
+}
+
+inline
+Binary_Operator<C_Expr>
+::Binary_Operator(const Concrete_Expression_Type type,
+                  const Concrete_Expression_BOP binary_operator,
+                  const Concrete_Expression<C_Expr>* left_hand_side,
+                  const Concrete_Expression<C_Expr>* right_hand_side)
+  : Concrete_Expression<C_Expr>(type, BOP),
+    bop(binary_operator),
+    lhs(left_hand_side),
+    rhs(right_hand_side) {
+}
+
+inline
+Binary_Operator<C_Expr>::~Binary_Operator<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Binary_Operator<C_Expr>::type() const {
+  return expr_type;
+}
+
+inline Concrete_Expression_BOP
+Binary_Operator<C_Expr>::binary_operator() const {
+  return bop;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Binary_Operator<C_Expr>::left_hand_side() const {
+  return lhs;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Binary_Operator<C_Expr>::right_hand_side() const {
+  return rhs;
+}
+
+inline
+Unary_Operator<C_Expr>
+::Unary_Operator(const Concrete_Expression_Type type,
+                 const Concrete_Expression_UOP unary_operator,
+                 const Concrete_Expression<C_Expr>* argument)
+  : Concrete_Expression<C_Expr>(type, UOP),
+    uop(unary_operator),
+    arg(argument) {
+}
+
+inline
+Unary_Operator<C_Expr>::~Unary_Operator<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Unary_Operator<C_Expr>::type() const {
+  return expr_type;
+}
+
+inline Concrete_Expression_BOP
+Unary_Operator<C_Expr>::unary_operator() const {
+  return uop;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Unary_Operator<C_Expr>::argument() const {
+  return arg;
+}
+
+inline
+Cast_Operator<C_Expr>::
+Cast_Operator(const Concrete_Expression_Type type,
+              const Concrete_Expression<C_Expr>* ar)
+  : Concrete_Expression<C_Expr>(type, CAST),
+    arg(ar) {
+}
+
+inline
+Cast_Operator<C_Expr>::~Cast_Operator<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Cast_Operator<C_Expr>::type() const {
+  return expr_type;
+}
+
+inline const Concrete_Expression<C_Expr>*
+Cast_Operator<C_Expr>::argument() const {
+  return arg;
+}
+
+inline
+Integer_Constant<C_Expr>::
+Integer_Constant(Concrete_Expression_Type type,
+                 const Integer_Interval& val)
+  : Concrete_Expression<C_Expr>(type, INT_CON),
+    value(val) {
+}
+
+inline
+Integer_Constant<C_Expr>::~Integer_Constant<C_Expr>() {
+}
+
+inline
+Floating_Point_Constant<C_Expr>::
+Floating_Point_Constant(const char* value_string,
+                        const unsigned int string_size)
+  : Concrete_Expression<C_Expr>(Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT), FP_CON),
+    value(new char[string_size]) {
+  strcpy(value, value_string);
+}
+
+inline
+Floating_Point_Constant<C_Expr>::~Floating_Point_Constant<C_Expr>() {
+  delete[] value;
+}
+
+inline Concrete_Expression_Type
+Floating_Point_Constant<C_Expr>::type() const {
+  return expr_type;
+}
+
+inline
+Approximable_Reference<C_Expr>::
+Approximable_Reference(Concrete_Expression_Type type,
+                       const Integer_Interval& val,
+                       dimension_type index)
+  : Concrete_Expression<C_Expr>(type, APPROX_REF),
+    value(val),
+    dimensions() {
+  dimensions.insert(index);
+}
+
+inline
+Approximable_Reference<C_Expr>::~Approximable_Reference<C_Expr>() {
+}
+
+inline Concrete_Expression_Type
+Approximable_Reference<C_Expr>::type() const {
+  return expr_type;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_C_Expr_inlines_hh)
diff --git a/tests/Concrete_Expression/Makefile.am b/tests/Concrete_Expression/Makefile.am
new file mode 100644
index 0000000..0ba8e68
--- /dev/null
+++ b/tests/Concrete_Expression/Makefile.am
@@ -0,0 +1,181 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ALL_TESTS = \
+C_Expr \
+linearform1 \
+linearize \
+digitalfilters1 \
+bdshape1 \
+bdshape2 \
+octagonalshape1 \
+octagonalshape2 \
+polyhedron1 \
+polyhedron2
+
+BUGS =
+
+
+# There are platforms where no floating-point type is supported.
+if SUPPORTED_SOME_FLOATING_POINT_TYPE
+
+check_PROGRAMS = $(ALL_TESTS) $(BUGS)
+
+TESTS = run_tests.stamp
+
+endif SUPPORTED_SOME_FLOATING_POINT_TYPE
+
+
+# This will be overridden by the `run_tests' script.
+if SUPPORTED_FLOAT
+FLOAT_FLAGS = \
+-DANALYZER_FP_FORMAT=float -DANALYZED_FP_FORMAT=IEEE754_SINGLE
+else
+if SUPPORTED_DOUBLE
+DOUBLE_FLAGS = \
+-DANALYZER_FP_FORMAT=double -DANALYZED_FP_FORMAT=IEEE754_DOUBLE
+else
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_FLAGS = \
+-DANALYZER_FP_FORMAT=long_double -DANALYZED_FP_FORMAT=IEEE754_QUAD
+endif
+endif
+endif
+
+TEST_CPPFLAGS = $(FLOAT_FLAGS) $(DOUBLE_FLAGS) $(LONG_DOUBLE_FLAGS)
+
+dist_check_SCRIPTS = run_tests
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+# Do not change the ordering in what follows.
+# Analyzer format should be less precise or equal than analyzed format.
+if SUPPORTED_FLOAT
+FLOAT_INSTANCES= \
+float/IEEE754_SINGLE \
+float/IEEE754_DOUBLE \
+float/IEEE754_QUAD
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCES= \
+double/IEEE754_DOUBLE \
+double/IEEE754_QUAD
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCES= \
+long_double/IEEE754_QUAD
+endif
+
+# Do not change the ordering in what follows.
+INSTANCES = \
+$(FLOAT_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(LONG_DOUBLE_INSTANCES)
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+
+#
+# Sources for the tests
+#
+
+C_Expr_SOURCES = C_Expr_defs.hh C_Expr_inlines.hh C_Expr.cc
+
+bdshape1_SOURCES = bdshape1.cc
+
+bdshape2_SOURCES = bdshape2.cc
+
+digitalfilters1_SOURCES = digitalfilters1.cc
+
+linearform1_SOURCES = linearform1.cc
+
+linearize_SOURCES = linearize.cc
+
+octagonalshape1_SOURCES = octagonalshape1.cc
+
+octagonalshape2_SOURCES = octagonalshape2.cc
+
+polyhedron1_SOURCES = polyhedron1.cc
+
+polyhedron2_SOURCES = polyhedron2.cc
+
+
+CLEANFILES = \
+run_tests.stamp
+
+
+DISTCLEANFILES = \
+dirty_marker
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Concrete_Expression/Makefile.in b/tests/Concrete_Expression/Makefile.in
new file mode 100644
index 0000000..b2efd80
--- /dev/null
+++ b/tests/Concrete_Expression/Makefile.in
@@ -0,0 +1,1059 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@check_PROGRAMS =  \
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@	$(am__EXEEXT_1) \
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@	$(am__EXEEXT_2)
+XFAIL_TESTS =
+subdir = tests/Concrete_Expression
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+	$(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = C_Expr$(EXEEXT) linearform1$(EXEEXT) linearize$(EXEEXT) \
+	digitalfilters1$(EXEEXT) bdshape1$(EXEEXT) bdshape2$(EXEEXT) \
+	octagonalshape1$(EXEEXT) octagonalshape2$(EXEEXT) \
+	polyhedron1$(EXEEXT) polyhedron2$(EXEEXT)
+am__EXEEXT_2 =
+am_C_Expr_OBJECTS = C_Expr.$(OBJEXT)
+C_Expr_OBJECTS = $(am_C_Expr_OBJECTS)
+C_Expr_LDADD = $(LDADD)
+C_Expr_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_bdshape1_OBJECTS = bdshape1.$(OBJEXT)
+bdshape1_OBJECTS = $(am_bdshape1_OBJECTS)
+bdshape1_LDADD = $(LDADD)
+bdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bdshape2_OBJECTS = bdshape2.$(OBJEXT)
+bdshape2_OBJECTS = $(am_bdshape2_OBJECTS)
+bdshape2_LDADD = $(LDADD)
+bdshape2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_digitalfilters1_OBJECTS = digitalfilters1.$(OBJEXT)
+digitalfilters1_OBJECTS = $(am_digitalfilters1_OBJECTS)
+digitalfilters1_LDADD = $(LDADD)
+digitalfilters1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearform1_OBJECTS = linearform1.$(OBJEXT)
+linearform1_OBJECTS = $(am_linearform1_OBJECTS)
+linearform1_LDADD = $(LDADD)
+linearform1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearize_OBJECTS = linearize.$(OBJEXT)
+linearize_OBJECTS = $(am_linearize_OBJECTS)
+linearize_LDADD = $(LDADD)
+linearize_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_octagonalshape1_OBJECTS = octagonalshape1.$(OBJEXT)
+octagonalshape1_OBJECTS = $(am_octagonalshape1_OBJECTS)
+octagonalshape1_LDADD = $(LDADD)
+octagonalshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_octagonalshape2_OBJECTS = octagonalshape2.$(OBJEXT)
+octagonalshape2_OBJECTS = $(am_octagonalshape2_OBJECTS)
+octagonalshape2_LDADD = $(LDADD)
+octagonalshape2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhedron1_OBJECTS = polyhedron1.$(OBJEXT)
+polyhedron1_OBJECTS = $(am_polyhedron1_OBJECTS)
+polyhedron1_LDADD = $(LDADD)
+polyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhedron2_OBJECTS = polyhedron2.$(OBJEXT)
+polyhedron2_OBJECTS = $(am_polyhedron2_OBJECTS)
+polyhedron2_LDADD = $(LDADD)
+polyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(C_Expr_SOURCES) $(bdshape1_SOURCES) $(bdshape2_SOURCES) \
+	$(digitalfilters1_SOURCES) $(linearform1_SOURCES) \
+	$(linearize_SOURCES) $(octagonalshape1_SOURCES) \
+	$(octagonalshape2_SOURCES) $(polyhedron1_SOURCES) \
+	$(polyhedron2_SOURCES)
+DIST_SOURCES = $(C_Expr_SOURCES) $(bdshape1_SOURCES) \
+	$(bdshape2_SOURCES) $(digitalfilters1_SOURCES) \
+	$(linearform1_SOURCES) $(linearize_SOURCES) \
+	$(octagonalshape1_SOURCES) $(octagonalshape2_SOURCES) \
+	$(polyhedron1_SOURCES) $(polyhedron2_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ALL_TESTS = \
+C_Expr \
+linearform1 \
+linearize \
+digitalfilters1 \
+bdshape1 \
+bdshape2 \
+octagonalshape1 \
+octagonalshape2 \
+polyhedron1 \
+polyhedron2
+
+BUGS = 
+ at SUPPORTED_SOME_FLOATING_POINT_TYPE_TRUE@TESTS = run_tests.stamp
+
+# This will be overridden by the `run_tests' script.
+ at SUPPORTED_FLOAT_TRUE@FLOAT_FLAGS = \
+ at SUPPORTED_FLOAT_TRUE@-DANALYZER_FP_FORMAT=float -DANALYZED_FP_FORMAT=IEEE754_SINGLE
+
+ at SUPPORTED_DOUBLE_TRUE@@SUPPORTED_FLOAT_FALSE at DOUBLE_FLAGS = \
+ at SUPPORTED_DOUBLE_TRUE@@SUPPORTED_FLOAT_FALSE at -DANALYZER_FP_FORMAT=double -DANALYZED_FP_FORMAT=IEEE754_DOUBLE
+
+ at SUPPORTED_DOUBLE_FALSE@@SUPPORTED_FLOAT_FALSE@@SUPPORTED_LONG_DOUBLE_TRUE at LONG_DOUBLE_FLAGS = \
+ at SUPPORTED_DOUBLE_FALSE@@SUPPORTED_FLOAT_FALSE@@SUPPORTED_LONG_DOUBLE_TRUE at -DANALYZER_FP_FORMAT=long_double -DANALYZED_FP_FORMAT=IEEE754_QUAD
+
+TEST_CPPFLAGS = $(FLOAT_FLAGS) $(DOUBLE_FLAGS) $(LONG_DOUBLE_FLAGS)
+dist_check_SCRIPTS = run_tests
+
+# Do not change the ordering in what follows.
+# Analyzer format should be less precise or equal than analyzed format.
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCES = \
+ at SUPPORTED_FLOAT_TRUE@float/IEEE754_SINGLE \
+ at SUPPORTED_FLOAT_TRUE@float/IEEE754_DOUBLE \
+ at SUPPORTED_FLOAT_TRUE@float/IEEE754_QUAD
+
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCES = \
+ at SUPPORTED_DOUBLE_TRUE@double/IEEE754_DOUBLE \
+ at SUPPORTED_DOUBLE_TRUE@double/IEEE754_QUAD
+
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCES = \
+ at SUPPORTED_LONG_DOUBLE_TRUE@long_double/IEEE754_QUAD
+
+
+# Do not change the ordering in what follows.
+INSTANCES = \
+$(FLOAT_INSTANCES) \
+$(DOUBLE_INSTANCES) \
+$(LONG_DOUBLE_INSTANCES)
+
+
+#
+# Sources for the tests
+#
+C_Expr_SOURCES = C_Expr_defs.hh C_Expr_inlines.hh C_Expr.cc
+bdshape1_SOURCES = bdshape1.cc
+bdshape2_SOURCES = bdshape2.cc
+digitalfilters1_SOURCES = digitalfilters1.cc
+linearform1_SOURCES = linearform1.cc
+linearize_SOURCES = linearize.cc
+octagonalshape1_SOURCES = octagonalshape1.cc
+octagonalshape2_SOURCES = octagonalshape2.cc
+polyhedron1_SOURCES = polyhedron1.cc
+polyhedron2_SOURCES = polyhedron2.cc
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Concrete_Expression/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Concrete_Expression/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+C_Expr$(EXEEXT): $(C_Expr_OBJECTS) $(C_Expr_DEPENDENCIES) $(EXTRA_C_Expr_DEPENDENCIES) 
+	@rm -f C_Expr$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(C_Expr_OBJECTS) $(C_Expr_LDADD) $(LIBS)
+
+bdshape1$(EXEEXT): $(bdshape1_OBJECTS) $(bdshape1_DEPENDENCIES) $(EXTRA_bdshape1_DEPENDENCIES) 
+	@rm -f bdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bdshape1_OBJECTS) $(bdshape1_LDADD) $(LIBS)
+
+bdshape2$(EXEEXT): $(bdshape2_OBJECTS) $(bdshape2_DEPENDENCIES) $(EXTRA_bdshape2_DEPENDENCIES) 
+	@rm -f bdshape2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bdshape2_OBJECTS) $(bdshape2_LDADD) $(LIBS)
+
+digitalfilters1$(EXEEXT): $(digitalfilters1_OBJECTS) $(digitalfilters1_DEPENDENCIES) $(EXTRA_digitalfilters1_DEPENDENCIES) 
+	@rm -f digitalfilters1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(digitalfilters1_OBJECTS) $(digitalfilters1_LDADD) $(LIBS)
+
+linearform1$(EXEEXT): $(linearform1_OBJECTS) $(linearform1_DEPENDENCIES) $(EXTRA_linearform1_DEPENDENCIES) 
+	@rm -f linearform1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(linearform1_OBJECTS) $(linearform1_LDADD) $(LIBS)
+
+linearize$(EXEEXT): $(linearize_OBJECTS) $(linearize_DEPENDENCIES) $(EXTRA_linearize_DEPENDENCIES) 
+	@rm -f linearize$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(linearize_OBJECTS) $(linearize_LDADD) $(LIBS)
+
+octagonalshape1$(EXEEXT): $(octagonalshape1_OBJECTS) $(octagonalshape1_DEPENDENCIES) $(EXTRA_octagonalshape1_DEPENDENCIES) 
+	@rm -f octagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(octagonalshape1_OBJECTS) $(octagonalshape1_LDADD) $(LIBS)
+
+octagonalshape2$(EXEEXT): $(octagonalshape2_OBJECTS) $(octagonalshape2_DEPENDENCIES) $(EXTRA_octagonalshape2_DEPENDENCIES) 
+	@rm -f octagonalshape2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(octagonalshape2_OBJECTS) $(octagonalshape2_LDADD) $(LIBS)
+
+polyhedron1$(EXEEXT): $(polyhedron1_OBJECTS) $(polyhedron1_DEPENDENCIES) $(EXTRA_polyhedron1_DEPENDENCIES) 
+	@rm -f polyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polyhedron1_OBJECTS) $(polyhedron1_LDADD) $(LIBS)
+
+polyhedron2$(EXEEXT): $(polyhedron2_OBJECTS) $(polyhedron2_DEPENDENCIES) $(EXTRA_polyhedron2_DEPENDENCIES) 
+	@rm -f polyhedron2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polyhedron2_OBJECTS) $(polyhedron2_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/C_Expr.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshape2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/digitalfilters1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearform1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearize.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/octagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/octagonalshape2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhedron2.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Concrete_Expression/bdshape1.cc b/tests/Concrete_Expression/bdshape1.cc
new file mode 100644
index 0000000..f94e8d1
--- /dev/null
+++ b/tests/Concrete_Expression/bdshape1.cc
@@ -0,0 +1,335 @@
+/* Test BD_Shape::affine_form_image on interval linear forms.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests space_dimensions and trivial cases.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  FP_BD_Shape bd1(0);
+  bool ok1 = false;
+  FP_Linear_Form l(A);
+
+  try {
+      bd1.affine_form_image(A, l);
+  }
+  catch(std::invalid_argument e) {
+    nout << "bd1_space_dim < lf_space_dim" << endl;
+    ok1 = true;
+  }
+
+  bool ok2 = false;
+  FP_BD_Shape bd2(1);
+
+  try {
+    bd2.affine_form_image(B, l);
+  }
+  catch(std::invalid_argument e) {
+    nout << "space_dim < var_id + 1" << endl;
+    bd2.affine_form_image(A, l);
+    Constraint_System cs(A < A);
+    bd2.add_constraints(cs);
+    bd2.affine_form_image(A, l);
+    ok2 = true;
+  }
+
+  return ok1 && ok2;
+}
+
+
+// Tests affine_form_image(A, [-2, 1]).
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval free_term(-2);
+  free_term.join_assign(1);
+  FP_Linear_Form l(free_term);
+  bd1.affine_form_image(A, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(A, [-2, 1]) ***");
+
+  FP_BD_Shape known_result(2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(-A <= 2);
+  known_result.add_constraint(B <= 2);
+  print_constraints(bd1, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(A, [-1, -1]*A + [0.5, 2]).
+bool test03() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval free_term(static_cast<FP_Interval::boundary_type>(0.5));
+  free_term.join_assign(2);
+  FP_Linear_Form l(-A);
+  l += free_term;
+  bd1.affine_form_image(A, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(A, -A + [0.5, 2]) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(-2*A <= 3);
+  known_result.add_constraint(B <= 2);
+  print_constraints(known_result, "*** known_result ***");
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [1, 1]*B + [-1.5, 3.5]).
+bool test04() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval free_term(static_cast<FP_Interval::boundary_type>(-1.5));
+  free_term.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+  FP_Linear_Form l(B);
+  l += free_term;
+  bd1.affine_form_image(B, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(B, B + [-1.5, 3.5]) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(2*B <= 11);
+  known_result.add_constraint(-2*B + 2*A <= 9);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(A, [1, 1]*B + [-1, 0.5]).
+bool test05() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval free_term(-1);
+  free_term.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+  FP_Linear_Form l(B);
+  l += free_term;
+  bd1.affine_form_image(A, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(A, B + [-1, 0.5]) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(2*A <= 5);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B - A <= 1);
+  known_result.add_constraint(2*A - 2*B <= 1);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [1, 1]*A + [-3, 1]).
+bool test06() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval free_term(-3);
+  free_term.join_assign(1);
+  FP_Linear_Form l(A);
+  l += free_term;
+  bd1.affine_form_image(B, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(B, A + [-3, 1]) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 3);
+  known_result.add_constraint(B - A <= 1);
+  known_result.add_constraint(A - B <= 3);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [-1, -1]*A + [0, 4]).
+bool test07() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval free_term(0);
+  free_term.join_assign(4);
+  FP_Linear_Form l(-A);
+  l += free_term;
+  bd1.affine_form_image(B, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(B, -A + [0, 4]) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(-B <= 2);
+  known_result.add_constraint(A - B <= 4);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(A, [-1, -1]*B + [0, 2]).
+bool test08() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  bd1.add_constraint(B >= -10);
+  FP_Interval free_term(0);
+  free_term.join_assign(2);
+  FP_Linear_Form l(-B);
+  l += free_term;
+  bd1.affine_form_image(A, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(A, -B + [0, 2]) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(-A <= 2);
+  known_result.add_constraint(A <= 12);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B >= -10);
+  known_result.add_constraint(-A + B <= 4);
+  known_result.add_constraint(A - B <= 22);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [-0.5, 0.5]*A).
+bool test09() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Interval coeff(static_cast<FP_Interval::boundary_type>(-0.5));
+  coeff.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+  FP_Linear_Form l(A);
+  l *= coeff;
+  bd1.affine_form_image(B, l);
+  print_constraints(bd1, "*** bd1.affine_form_image(B, [-0.5, 0.5]*A) ***");
+
+  FP_BD_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(A - B <= 3);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(A, i + i0*A + i1*B) where
+// i = [0, 2], i0 = [1, 1] and i1 = [1, 2].
+bool test10() {
+
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A >= 0);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(B >= 0);
+  bd1.add_constraint(B <= 2);
+  bd1.add_constraint(A - B >= 0);
+  FP_Interval tmp(1);
+  FP_Linear_Form l(A);
+  l *= tmp;
+  tmp.lower() = 0;
+  tmp.upper() = 2;
+  l += tmp;
+  tmp.lower() = 1;
+  tmp.upper() = 2;
+  l += tmp * FP_Linear_Form(B);
+  bd1.affine_form_image(A,l);
+  print_constraints(bd1, "*** bd1.affine_form_image(A, i + i0*A + i1*B) ***");
+
+  FP_BD_Shape know_result(2);
+  know_result.add_constraint(A >= 0);
+  know_result.add_constraint(A <= 8);
+  know_result.add_constraint(B >= 0);
+  know_result.add_constraint(B <= 2);
+  know_result.add_constraint(A - B <= 6);
+  know_result.add_constraint(-A + B <= 0);
+  print_constraints(know_result, "*** know_result ***");
+
+  bool ok = (bd1 == know_result);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Concrete_Expression/bdshape2.cc b/tests/Concrete_Expression/bdshape2.cc
new file mode 100644
index 0000000..2f36e90
--- /dev/null
+++ b/tests/Concrete_Expression/bdshape2.cc
@@ -0,0 +1,571 @@
+/* Test BD_Shape::refine_wiht_linear_form_inequaity on interval linear forms.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests trivial cases.
+bool
+test01() {
+  Variable A(0);
+  FP_BD_Shape bd1(0);
+  bool ok1 = false;
+  FP_Linear_Form l1(A);
+  FP_Linear_Form l2;
+
+  try{
+    bd1.refine_with_linear_form_inequality(l1,l2);
+    std::cout <<"no eccezione" <<std::endl;
+  }
+  catch(std::invalid_argument e) {
+    ok1 = true;
+  }
+
+
+  bool ok2 = false;
+  try{
+    bd1.refine_with_linear_form_inequality(l2,l1);
+    std::cout <<"no eccezione" <<std::endl;
+  }
+  catch(std::invalid_argument e){
+    FP_BD_Shape bd2(1);
+    bd2.refine_with_linear_form_inequality(l1, l1);
+    bd2.refine_with_linear_form_inequality(-l1, l1);
+    bd2.refine_with_linear_form_inequality(l1, -l1);
+    FP_Interval tmp(0);
+    l1 -= A;
+    l1 += tmp;
+    l2 += tmp;
+    bd2.refine_with_linear_form_inequality(l1, l2);
+    ok2 = true;
+  }
+
+  return ok1 && ok2;
+}
+
+// Tests [-1, 2] <= [-4, -1] + A and [-4, -1] + A <= [-1, 2].
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(-1);
+  tmp.join_assign(2);
+  FP_Linear_Form l1(tmp);
+  FP_Linear_Form l2(A);
+  tmp.lower() = -4;
+  tmp.upper() = -1;
+  l2 += tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [-1, 2] <= [-4, -1] + A ***");
+
+  known_result.add_constraint(-A <= 0);
+  print_constraints(known_result, "*** known_result1 ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [-4, -1] + A <= [-1, 2] ***");
+
+  known_result.add_constraint(A <= 6);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [3.5, 6] <= [-2.5, 0] - A and [-2.5, 0] - A <= [3.5, 6].
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(bd1);
+  FP_Interval tmp(static_cast<FP_Interval::boundary_type>(3.5));
+  tmp.join_assign(6);
+  FP_Linear_Form l1(tmp);
+  FP_Linear_Form l2(-A);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(-2.5);
+  tmp.upper() = 0;
+  l2 += tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [3.5, 6] <= [-2.5, 0] - A ***");
+
+  known_result.add_constraint(2*A <= -7);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [-2.5, 0] - A <= [3.5, 6] ***");
+
+  known_result.add_constraint(2*(-A) <= 17);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [-0.5, 1] + A <= [2.5, 5] + B and [2.5, 5] + B <= [-0.5, 1] + A.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-0.5));
+  tmp.join_assign(1);
+  FP_Linear_Form l1(A);
+  l1 += tmp;
+  FP_Linear_Form l2(B);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(2.5);
+  tmp.upper() = 5;
+  l2 += tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [-0.5, 1] + A <= [2.5, 5] + B ***");
+
+  known_result.add_constraint(2*A - 2*B <= 11);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [2.5, 5] + B <= [-0.5, 1] + A ***");
+
+  known_result.add_constraint((2*B) - (2*A) <= -3);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [1, 3] + A <= [4, 4] - B and [4, 4] - B <= [1, 3] + A.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(4);
+  FP_Linear_Form l2(-B);
+  l2 += tmp;
+  FP_Linear_Form l1(A);
+  tmp.lower() = 1;
+  tmp.upper() = 3;
+  l1 += tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [1, 3] + A <= [4, 4] - B ***");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [4, 4] - B <= [1, 3] + A ***");
+
+  known_result.add_constraint(-A <= 1);
+  known_result.add_constraint(-B <= 1);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [1, 4] - A <= [-2, -2] + B and [-2, -2] + B <= [1, 4] - A.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(-2);
+  FP_Linear_Form l2(B);
+  l2 += tmp;
+  FP_Linear_Form l1(-A);
+  tmp.lower() = 1;
+  tmp.upper() = 4;
+  l1 += tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [1, 4] - A <= [-2, -2] + B ***");
+
+  known_result.add_constraint(-A <= -1);
+  known_result.add_constraint(-B <= -1);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [-2, -2] + B <= [1, 4] - A ***");
+
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [-3, -0.5] - A <= [-2, -1] - B and [-2, -1] - B <= [-3, -0.5] - A.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(-2);
+  tmp.join_assign(-1);
+  FP_Linear_Form l2(-B);
+  l2 += tmp;
+  FP_Linear_Form l1(-A);
+  tmp.lower() = -3;
+  tmp.upper() = static_cast<FP_Interval::boundary_type>(-0.5);
+  l1 += tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [-3, -0.5] - A <= [-2, -1] - B ***");
+
+  known_result.add_constraint(B - A <= 2);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [-2, -1] - B <= [-3, -0.5] - A ***");
+
+  known_result.add_constraint(-2*B + 2*A <= 3);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [1, 3] * B <= [-1.5, 0] * A.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(3);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(1);
+  tmp.join_assign(3);
+  FP_Linear_Form l1(B);
+  l1 *= tmp;
+  FP_Linear_Form l2(A);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(-1.5);
+  tmp.upper() = 0;
+  l2 *= tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [1, 3] * B <= [-1.5, 0] * A ***");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests [0.25, 0.5] * A + [-2, -1] * B <= [-7, -2]
+// and   [-7, -2] <= [0.25, 0.5] * A + [-2, -1] * B.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+
+  FP_Interval tmp(-7);
+  tmp.join_assign(-2);
+  FP_Linear_Form l2(tmp);
+  FP_Linear_Form l1(A);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(0.25);
+  tmp.upper() = static_cast<FP_Interval::boundary_type>(0.5);
+  l1 *= tmp;
+  tmp.lower() = -2;
+  tmp.upper() = -1;
+  l1 += tmp * FP_Linear_Form(B);
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [0.25, 0.5]*A + [-2, -1]*B <= [-7, -2] ***");
+
+  known_result.add_constraint(-2*B + 2*A <= 3);
+  known_result.add_constraint(2*A <= 7);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [-7, -2] <= [0.25, 0.5]*A + [-2, -1]*B ***");
+
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+}
+
+// Tests [-5, -1] * A <= [2, 3] * B + [0.5, 1].
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(2);
+  tmp.join_assign(3);
+  FP_Linear_Form l2(B);
+  l2 *= tmp;
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(0.5);
+  tmp.upper() = 1;
+  l2 += tmp;
+  FP_Linear_Form l1(A);
+  tmp.lower() = -5;
+  tmp.upper() = -1;
+  l1 *= tmp;
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** [-5, -1] * A <= [2, 3] * B + [0.5, 1] ***");
+
+  known_result.add_constraint(B - A <= 17);
+  known_result.add_constraint(-B + A <= 17);
+  known_result.add_constraint(A <= 19);
+  known_result.add_constraint(-A <= 15);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (bd1 == known_result);
+
+  return ok;
+}
+
+// Tests Octagonal_Shape<T>::refine_fp_interval_abstract_store.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-2.5));
+  tmp.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+  store.set_interval(A, tmp);
+  tmp.lower() = -4;
+  tmp.upper() = 4;
+  store.set_interval(B, tmp);
+  BD_Shape<ANALYZER_FP_FORMAT> bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(B <= 2);
+  bd1.add_constraint(-A <= 3);
+  bd1.add_constraint(2*(-B) <= 3);
+  bd1.refine_fp_interval_abstract_store(store);
+
+  tmp = store.get_interval(A);
+  nout << "*** store.get_interval(A) ***" << endl
+       << tmp << endl;
+
+  FP_Interval known_result1(static_cast<FP_Interval::boundary_type>(-2.5));
+  known_result1.join_assign(2);
+  nout << "*** known_result1 ***" << endl
+       << known_result1 << endl;
+
+  bool ok1 = (tmp == known_result1);
+
+  tmp = store.get_interval(B);
+  nout << "*** store.get_interval(B) ***" << endl
+       << tmp << endl;
+
+  FP_Interval known_result2(static_cast<FP_Interval::boundary_type>(-1.5));
+  known_result2.join_assign(2);
+  nout << "*** known_result2 ***" << endl
+       << known_result2 << endl;
+
+  bool ok2 = (tmp == known_result2);
+
+  return ok1 && ok2;
+}
+
+// Tests - A <= [-1, 0] and [0, 1] <= A.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(0);
+  tmp.join_assign(-1);
+  FP_Linear_Form l2(tmp);
+  FP_Linear_Form l1(-A);
+
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** - A <= [-1, 0]  ***");
+
+  known_result.add_constraint( - A <= 0);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** [0, 1] <= - A  ***");
+  known_result.add_constraint( A <= 1);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+}
+
+// Tests  A <= - B + [-1, 0] and - B + [-1, 0] <= A.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(0);
+  tmp.join_assign(-1);
+  FP_Linear_Form l2(-B);
+  FP_Linear_Form l1(A);
+   l2 += tmp;
+
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** A <= - B + [-1, 0]  ***");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** - B + [-1, 0] <= A  ***");
+  known_result.add_constraint(-A <= 3);
+  known_result.add_constraint(-B <= 3);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+}
+
+// Tests  A <= - A + [-1, 0] and - A + [0, 1] <= A.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_BD_Shape bd1(2);
+  bd1.add_constraint(A <= 2);
+  bd1.add_constraint(A - B <= 3);
+  bd1.add_constraint(B <= 2);
+  FP_BD_Shape known_result(bd1);
+  FP_Interval tmp(0);
+  tmp.join_assign(-1);
+  FP_Linear_Form l2(-A);
+  FP_Linear_Form l1(A);
+  l2 += tmp;
+
+  bd1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(bd1, "*** A <= - A + [-1, 0]  ***");
+
+  known_result.add_constraint(2*A <= 0);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (bd1 == known_result);
+
+  bd1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(bd1, "*** - A + [0, 1] <= A  ***");
+
+  known_result.add_constraint(2*(-A) <= 1);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok2 = (bd1 == known_result);
+
+  return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Concrete_Expression/digitalfilters1.cc b/tests/Concrete_Expression/digitalfilters1.cc
new file mode 100644
index 0000000..ef83d12
--- /dev/null
+++ b/tests/Concrete_Expression/digitalfilters1.cc
@@ -0,0 +1,1121 @@
+/* Test Rate Limiter on differents abstract domains.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "C_Expr_defs.hh"
+
+namespace {
+
+class Test_Oracle : public FP_Oracle<C_Expr,FP_Interval> {
+public:
+  Test_Oracle() : int_store(0) {}
+
+  Test_Oracle(FP_Interval_Abstract_Store init) : int_store(init) {}
+
+  bool get_interval(dimension_type dim, FP_Interval& result) const {
+    result = int_store.get_interval(Variable(dim));
+    return true;
+  }
+
+  bool get_fp_constant_value(const Floating_Point_Constant<C_Expr>& expr,
+                             FP_Interval& result) const {
+    result = FP_Interval((const char *)expr.value);
+    return true;
+  }
+
+  bool get_integer_expr_value(const Concrete_Expression<C_Expr>& expr,
+                              FP_Interval& result) const {
+    if (expr.kind() == INT_CON) {
+      const Integer_Constant<C_Expr>* ic_expr =
+        reinterpret_cast< const Integer_Constant<C_Expr>* >(&expr);
+      result = FP_Interval(ic_expr->value);
+    }
+    else {
+      const Approximable_Reference<C_Expr>* ar_expr =
+        reinterpret_cast< const Approximable_Reference<C_Expr>* >(&expr);
+      result = FP_Interval(ar_expr->value);
+    }
+
+    return true;
+  }
+
+  bool get_associated_dimensions(
+       const Approximable_Reference<C_Expr>& expr,
+       std::set<dimension_type>& result) const {
+    result = expr.dimensions;
+    return true;
+  }
+
+  FP_Interval_Abstract_Store int_store;
+};
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+Concrete_Expression_Type FP_Type
+= Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT);
+
+typedef Integer_Interval Int_Interval;
+
+/*
+This file tests a rate limiter that, given random input flows of floating
+point values X and D, bounded respectively by [-128, 128] and [0, 16],
+computes an output flow Y that tries to follow X while having a change rate
+limited by D. The pseudo-code of such rate limiter is the following:
+
+Y = 0;
+for (n = 0; n < N; ++n) {
+  X = [-128, 128];
+  D = [0, 16];
+  S = Y;
+  R = X - S;
+  Y = X;
+  if (R <= -D)
+    Y = S - D;
+  if (R >= D)
+    Y = S + D;
+}
+*/
+
+void
+set_M(Coefficient& M, int m) {
+  if (std::numeric_limits<Coefficient>::is_bounded) {
+    if (greater_than(std::numeric_limits<Coefficient>::min(),
+                     std::numeric_limits<ANALYZER_FP_FORMAT>::min())
+        || less_than(std::numeric_limits<Coefficient>::max(),
+                     std::numeric_limits<ANALYZER_FP_FORMAT>::max())) {
+      // This may still provoke an arithmetic overflow exception:
+      // no problem.
+      M = m;
+      return;
+    }
+  }
+  // Cannot provoke an overflow.
+  assign_r(M, m, ROUND_DOWN);
+}
+
+// Tests rate limiter using boxes and ignoring rounding errors.
+bool
+test01() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  FP_Interval_Abstract_Store abstract_store(5);
+  FP_Interval_Abstract_Store as_begin(5);
+  FP_Interval tmp(0);
+  unsigned short n = 0;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 144);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  // Y = 0;
+  abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+  do {
+
+    nout << "*** n = " << n << " ***" << endl;
+    as_begin = abstract_store;
+    print_constraints(abstract_store, "*** begin loop ***");
+
+    // X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+    // S = Y;
+    abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+    // R = X - S;
+    abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+    // Y = X;
+    abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+    // if (R <= -D) Y = S - D;
+    FP_Interval_Abstract_Store as_then(abstract_store);
+    as_then.refine_with_constraint(R <= -D);
+    as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+    abstract_store.refine_with_constraint(R > -D);
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+      "*** after if (R <= -D) Y = S - D; ***");
+
+    // if (R >= D)  Y = S + D;
+    as_then = abstract_store;
+    as_then.refine_with_constraint(R >= D);
+    as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+    abstract_store.refine_with_constraint(R < D);
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+      "*** after if (R >= D)  Y = S + D; ***");
+
+    abstract_store.upper_bound_assign(as_begin);
+    abstract_store.limited_CC76_extrapolation_assign(as_begin, cs);
+    print_constraints(abstract_store, "*** end loop ***");
+    ++n;
+
+  } while (as_begin != abstract_store);
+
+  FP_Interval y = abstract_store.get_interval(Y);
+  nout << "*** Y in " << y << " ***" << endl;
+  return !y.is_bounded();
+}
+
+// Tests rate limiter using bounded differences and ignoring rounding
+// errors.
+bool
+test02() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  FP_BD_Shape abstract_store(5);
+  FP_BD_Shape as_begin(5);
+  FP_Interval tmp(0);
+  unsigned short n = 0;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 144);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  // Y = 0;
+  abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+  do {
+
+    nout << "*** n = " << n << " ***" << endl;
+    as_begin = abstract_store;
+    print_constraints(abstract_store, "*** begin loop ***");
+
+    // X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+    // S = Y;
+    abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+    // R = X - S;
+    abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+    // Y = X;
+    abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+    // if (R <= -D) Y = S - D;
+    FP_BD_Shape as_then(abstract_store);
+    as_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                              -FP_Linear_Form(D));
+    as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+    abstract_store.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+                                                       FP_Linear_Form(R));
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+                      "*** after if (R <= -D) Y = S - D; ***");
+
+    // if (R >= D)  Y = S + D;
+    as_then = abstract_store;
+    as_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+                                               FP_Linear_Form(R));
+    as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+    abstract_store.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                                      FP_Linear_Form(D));
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+                      "*** after if (R >= D)  Y = S + D; ***");
+
+    abstract_store.upper_bound_assign(as_begin);
+    abstract_store.limited_BHMZ05_extrapolation_assign(as_begin, cs);
+    print_constraints(abstract_store, "*** end loop ***");
+    n++;
+
+  } while (as_begin != abstract_store);
+
+  tmp = (FP_Interval_Abstract_Store(abstract_store)).get_interval(Y);
+  nout << "*** Y in " << tmp << " ***" << endl;
+  return !tmp.is_bounded();
+}
+
+// Tests rate limiter using octagonal shapes and ignoring rounding
+// errors.
+bool
+test03() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  //FP_Interval_Abstract_Store abstract_store();
+  FP_Octagonal_Shape abstract_store(5, UNIVERSE);
+  FP_Octagonal_Shape as_begin(5, EMPTY);
+  FP_Interval tmp(0);
+  unsigned short n = 0;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 136);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  // Y = 0;
+  abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+  do {
+
+    nout << "*** n = " << n << " ***" << endl;
+    as_begin = abstract_store;
+    print_constraints(abstract_store, "*** begin loop ***");
+
+    //X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+    // S = Y;
+    abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+    // R = X - S;
+    abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+    // Y = X;
+    abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+    //if (R <= -D) Y = S - D;
+    FP_Octagonal_Shape as_then(abstract_store);
+    as_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                              -FP_Linear_Form(D));
+    as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+    abstract_store.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+                                                      FP_Linear_Form(R));
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+         "*** after if (R <= -D) Y = S - D; ***");
+
+    //if (R >= D)  Y = S + D;
+    as_then = abstract_store;
+    as_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+                                               FP_Linear_Form(R));
+    as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+    abstract_store.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                          FP_Linear_Form(D));
+
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+         "*** after (R >= D)  Y = S + D; ***");
+
+    abstract_store.upper_bound_assign(as_begin);
+    abstract_store.limited_BHMZ05_extrapolation_assign(as_begin, cs);
+    print_constraints(abstract_store, "*** end loop ***");
+    ++n;
+
+  } while (as_begin != abstract_store);
+
+  tmp = (FP_Interval_Abstract_Store(abstract_store)).get_interval(Y);
+  nout << "*** Y in " << tmp << " ***" << endl;
+  return (tmp.lower() == -136 && tmp.upper() == 136);
+}
+
+// Tests rate limiter using polyhedra and ignoring rounding errors.
+bool
+test04() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  NNC_Polyhedron abstract_store(5);
+  NNC_Polyhedron as_begin(5);
+  FP_Interval tmp(0);
+  unsigned short n = 0;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 128);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  // Y = 0;
+  abstract_store.affine_form_image(Y, FP_Linear_Form(tmp));
+
+  do {
+
+    nout << "*** n = " << n << " ***" << endl;
+    as_begin = abstract_store;
+    print_constraints(abstract_store, "*** begin loop ***");
+
+    // X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    abstract_store.affine_form_image(X, FP_Linear_Form(tmp));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    abstract_store.affine_form_image(D, FP_Linear_Form(tmp));
+
+    // S = Y;
+    abstract_store.affine_form_image(S, FP_Linear_Form(Y));
+
+    // R = X - S;
+    abstract_store.affine_form_image(R, FP_Linear_Form(X - S));
+
+    // Y = X;
+    abstract_store.affine_form_image(Y, FP_Linear_Form(X));
+
+    // if (R <= -D) Y = S - D;
+    NNC_Polyhedron as_then(abstract_store);
+    as_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                              -FP_Linear_Form(D));
+    as_then.affine_form_image(Y, FP_Linear_Form(S - D));
+
+    abstract_store.generalized_refine_with_linear_form_inequality(
+      -FP_Linear_Form(D), FP_Linear_Form(R), LESS_THAN);
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+         "*** after if (R <= -D) Y = S - D; ***");
+
+    // if (R >= D)  Y = S + D;
+    as_then = abstract_store;
+    as_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+                                               FP_Linear_Form(R));
+    as_then.affine_form_image(Y, FP_Linear_Form(S + D));
+
+    abstract_store.generalized_refine_with_linear_form_inequality(
+      FP_Linear_Form(R), FP_Linear_Form(D), LESS_THAN);
+    abstract_store.upper_bound_assign(as_then);
+    print_constraints(abstract_store,
+         "*** after if (R >= D)  Y = S + D; ***");
+
+    abstract_store.upper_bound_assign(as_begin);
+    abstract_store.limited_BHRZ03_extrapolation_assign(as_begin, cs);
+    print_constraints(abstract_store, "*** end loop ***");
+    ++n;
+
+  } while(as_begin != abstract_store);
+
+  tmp = (FP_Interval_Abstract_Store(abstract_store)).get_interval(Y);
+  nout << "*** Y in " << tmp << " ***" << endl;
+  return (tmp.lower() == -128 && tmp.upper() == 128);
+}
+
+
+// Tests rate limiter using bounded differences and linearization of
+// floating point expressions.
+// In order to improve the analysis, the interval domain is used
+// in parallel with bounded differences domain.
+bool
+test05() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  Test_Oracle oracle(FP_Interval_Abstract_Store(5));
+  Test_Oracle or_begin(FP_Interval_Abstract_Store (5));
+  FP_Linear_Form_Abstract_Store lf_abstract_store;
+  FP_BD_Shape bd(5);
+  FP_BD_Shape bd_begin(5);
+  unsigned short n = 0;
+  FP_Interval tmp(0);
+  FP_Linear_Form lx;
+  FP_Linear_Form ly;
+  FP_Linear_Form lr;
+  FP_Linear_Form lk;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 144);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  bool lin_success;
+
+  Floating_Point_Constant<C_Expr> con_y("0", 2);
+  // The constant floating point expression con_y is linearized into
+  // the interval linear form lk. If linearization succeeded, we model
+  // the assignment Y = 0, invoking affine_form_image method.
+  // In order to refine the analysis, all the transer function are
+  // performed in parallel in the interval domain and in the bounded
+  // differences domain.
+  // Then, we consider the intersection between these abstract domains.
+
+  lin_success = linearize(con_y, oracle, lf_abstract_store, lk);
+  oracle.int_store.affine_form_image(Y, FP_Linear_Form(tmp));
+  if (lin_success) {
+    bd.affine_form_image(Y, lk);
+  }
+  else {
+    bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+  }
+  oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+  // This loop iterate until a fixed point is reached.
+  do {
+
+    // Iteration no. n+1.
+    nout << "*** n = " << n << " ***" << endl;
+    bd_begin = bd;
+    or_begin.int_store = oracle.int_store;
+    print_constraints(oracle.int_store, "*** before loop ***");
+
+    // X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    oracle.int_store.affine_form_image(X, FP_Linear_Form(tmp));
+    bd.affine_form_image(X, FP_Linear_Form(tmp));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    oracle.int_store.affine_form_image(D, FP_Linear_Form(tmp));
+    bd.affine_form_image(D, FP_Linear_Form(tmp));    
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // S = Y;
+    Approximable_Reference<C_Expr> var_y(FP_Type, Int_Interval(mpz_class(0)),
+                                         Y.id());
+    lin_success = linearize(var_y, oracle, lf_abstract_store, ly);
+    oracle.int_store.affine_form_image(S, FP_Linear_Form(Y));
+    if (lin_success) {
+      bd.affine_form_image(S, ly);
+    }
+    else {
+      bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // R = X - S;
+    Approximable_Reference<C_Expr> px(FP_Type, Int_Interval(mpz_class(0)),
+                                      X.id());
+    Approximable_Reference<C_Expr> ps(FP_Type, Int_Interval(mpz_class(0)),
+                                      S.id());
+    Binary_Operator<C_Expr> x_dif_s(FP_Type, Binary_Operator<C_Expr>::SUB,
+                                    &px, &ps);
+    lin_success = linearize(x_dif_s, oracle, lf_abstract_store, lr);
+    oracle.int_store.affine_form_image(R, FP_Linear_Form(X - S));
+    if (lin_success) {
+      bd.affine_form_image(R, lr);
+    }
+    else {
+      bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // Y = X;
+    lin_success = linearize(px, oracle, lf_abstract_store, lx);
+    oracle.int_store.affine_form_image(Y, FP_Linear_Form(X));
+    if (lin_success) {
+      bd.affine_form_image(Y, lx);
+    }
+    else {
+      bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // if (R <= -D)
+    FP_BD_Shape bd_then(bd);
+    Test_Oracle or_then(oracle.int_store);
+    or_then.int_store.refine_with_constraint(R <= -D);
+    bd_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                               -FP_Linear_Form(D));
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+    // then Y = S - D;
+    Approximable_Reference<C_Expr> pd(FP_Type, Int_Interval(mpz_class(0)),
+                                      D.id());
+    Binary_Operator<C_Expr> s_dif_d(FP_Type, Binary_Operator<C_Expr>::SUB,
+                                    &ps, &pd);
+    lin_success = linearize(s_dif_d, or_then, lf_abstract_store, ly);
+    or_then.int_store.affine_form_image(Y, FP_Linear_Form(S - D));
+    if (lin_success) {
+      bd_then.affine_form_image(Y, ly);
+    }
+    else {
+      bd_then.intersection_assign(FP_BD_Shape(or_then.int_store));
+    }
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+    // else skip;
+    oracle.int_store.refine_with_constraint(R > -D);
+    bd.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+                                          FP_Linear_Form(R));
+    bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // LUB between then and else branches.
+    bd.upper_bound_assign(bd_then);
+    oracle.int_store.upper_bound_assign(or_then.int_store);
+    print_constraints(oracle.int_store,
+                      "*** after if (R <= -D) Y = S - D; ***");
+
+    // if (R >= D)
+    bd_then = bd;
+    or_then.int_store = oracle.int_store;
+    or_then.int_store.refine_with_constraint(R >= D);
+    bd_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+                                               FP_Linear_Form(R));
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+    // then Y = S + D;
+    Binary_Operator<C_Expr> s_sum_d(FP_Type, Binary_Operator<C_Expr>::ADD,
+                                    &ps, &pd);
+    lin_success = linearize(s_sum_d, or_then, lf_abstract_store, ly);
+    or_then.int_store.affine_form_image(Y, FP_Linear_Form(S + D));
+    if (lin_success) {
+      bd_then.affine_form_image(Y, ly);
+    }
+    else {
+      bd_then.intersection_assign(FP_BD_Shape(or_then.int_store));
+    }
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(bd_then));
+
+    // else skip;
+    bd.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                          FP_Linear_Form(D));
+    oracle.int_store.refine_with_constraint(R < D);
+    bd.intersection_assign(FP_BD_Shape(oracle.int_store));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(bd));
+
+    // LUB between then and else branches.
+    bd.upper_bound_assign(bd_then);
+    oracle.int_store.upper_bound_assign(or_then.int_store);
+    print_constraints(oracle.int_store,
+                      "*** after if (R >= D)  Y = S + D; ***");
+
+    // LUB between the actual abstract domains and the corresponding
+    // domains at the beginning of the loop.
+    bd.upper_bound_assign(bd_begin);
+    oracle.int_store.upper_bound_assign(or_begin.int_store);
+
+    // Limited extrapolation: we enforce the satisfaction
+    // of the constraint system cs = {Y <= M; Y >= -M}
+    bd.limited_BHMZ05_extrapolation_assign(bd_begin, cs);
+    oracle.int_store.limited_CC76_extrapolation_assign(or_begin.int_store, cs);
+    print_constraints(oracle.int_store, "*** end loop ***");
+    ++n;
+
+  } while(or_begin.int_store != oracle.int_store);
+
+  tmp = oracle.int_store.get_interval(Y);
+  nout << "*** Y in " << tmp << " ***" << endl;
+  return (tmp.lower() == -144 && tmp.upper() == 144);
+}
+
+// Tests rate limiter using octagonal shapes and linearization of
+// floating point expressions.
+// In order to improve the analysis, the interval domain is used
+// in parallel with octagons domain.
+bool
+test06() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  Test_Oracle oracle(FP_Interval_Abstract_Store(5));
+  Test_Oracle or_begin(FP_Interval_Abstract_Store(5));
+  FP_Linear_Form_Abstract_Store lf_abstract_store;
+  FP_Octagonal_Shape oc(5);
+  FP_Octagonal_Shape oc_begin(5);
+  unsigned short n = 0;
+  FP_Interval tmp(0);
+  FP_Linear_Form lx;
+  FP_Linear_Form ly;
+  FP_Linear_Form lr;
+  FP_Linear_Form lk;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 144);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  bool lin_success;
+
+  Floating_Point_Constant<C_Expr> con_y("0", 2);
+  // The constant floating point expression con_y is linearized into
+  // the interval linear form lk. If linearization succeeded, we model
+  // the assignment Y = 0, invoking affine_form_image method.
+  // In order to refine the analysis, all the transer function are
+  // performed in parallel in the interval domain and in the bounded
+  // differences domain.
+  // Then, we consider the intersection between these abstract domains.
+
+  lin_success = linearize(con_y, oracle, lf_abstract_store, lk);
+  oracle.int_store.affine_form_image(Y, FP_Linear_Form(tmp));
+  if (lin_success) {
+    oc.affine_form_image(Y, lk);
+  }
+  else {
+    oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+  }
+  oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+  // This loop iterates until a fixed point is reached.
+  do {
+
+    // Iteration no. n+1.
+    nout << "*** n = " << n << " ***" << endl;
+    oc_begin = oc;
+    or_begin.int_store = oracle.int_store;
+    print_constraints(oracle.int_store, "*** before loop ***");
+
+    // X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    oracle.int_store.affine_form_image(X, FP_Linear_Form(tmp));
+    oc.affine_form_image(X, FP_Linear_Form(tmp));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    oracle.int_store.affine_form_image(D, FP_Linear_Form(tmp));
+    oc.affine_form_image(D, FP_Linear_Form(tmp));    
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // S = Y;
+    Approximable_Reference<C_Expr> var_y(FP_Type, Int_Interval(mpz_class(0)),
+                                         Y.id());
+    lin_success = linearize(var_y, oracle, lf_abstract_store, ly);
+    oracle.int_store.affine_form_image(S, FP_Linear_Form(Y));
+    if (lin_success) {
+      oc.affine_form_image(S, ly);
+    }
+    else {
+      oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // R = X - S;
+    Approximable_Reference<C_Expr> px(FP_Type, Int_Interval(mpz_class(0)),
+                                      X.id());
+    Approximable_Reference<C_Expr> ps(FP_Type, Int_Interval(mpz_class(0)),
+                                      S.id());
+    Binary_Operator<C_Expr> x_dif_s(FP_Type, Binary_Operator<C_Expr>::SUB,
+                                    &px, &ps);
+    lin_success = linearize(x_dif_s, oracle, lf_abstract_store, lr);
+    oracle.int_store.affine_form_image(R, FP_Linear_Form(X - S));
+    if (lin_success) {
+      oc.affine_form_image(R, lr);
+    }
+    else {
+      oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // Y = X;
+    lin_success = linearize(px, oracle, lf_abstract_store, lx);
+    oracle.int_store.affine_form_image(Y, FP_Linear_Form(X));
+    if (lin_success) {
+      oc.affine_form_image(Y, lx);
+    }
+    else {
+      oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // if (R <= -D)
+    FP_Octagonal_Shape oc_then(oc);
+    Test_Oracle or_then(oracle.int_store);
+    or_then.int_store.refine_with_constraint(R <= -D);
+    oc_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                               -FP_Linear_Form(D));
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+    // then Y = S - D;
+    Approximable_Reference<C_Expr> pd(FP_Type, Int_Interval(mpz_class(0)),
+                                      D.id());
+    Binary_Operator<C_Expr> s_dif_d(FP_Type, Binary_Operator<C_Expr>::SUB,
+                                    &ps, &pd);
+    lin_success = linearize(s_dif_d, or_then, lf_abstract_store, ly);
+    or_then.int_store.affine_form_image(Y, FP_Linear_Form(S - D));
+    if (lin_success) {
+      oc_then.affine_form_image(Y, ly);
+    }
+    else {
+      oc_then.intersection_assign(FP_Octagonal_Shape(or_then.int_store));
+    }
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+    // else skip;
+    oracle.int_store.refine_with_constraint(R > -D);
+    oc.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+                                          FP_Linear_Form(R));
+    oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // LUB between then and else branches.
+    oc.upper_bound_assign(oc_then);
+    oracle.int_store.upper_bound_assign(or_then.int_store);
+    print_constraints(oracle.int_store,
+                      "*** after if (R <= -D) Y = S - D; ***");
+
+    // if (R >= D)
+    oc_then = oc;
+    or_then.int_store = oracle.int_store;
+    or_then.int_store.refine_with_constraint(R >= D);
+    oc_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+                                               FP_Linear_Form(R));
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+    // then Y = S + D;
+    Binary_Operator<C_Expr> s_sum_d(FP_Type, Binary_Operator<C_Expr>::ADD,
+                                    &ps, &pd);
+    lin_success = linearize(s_sum_d, or_then, lf_abstract_store, ly);
+    or_then.int_store.affine_form_image(Y, FP_Linear_Form(S + D));
+    if (lin_success) {
+      oc_then.affine_form_image(Y, ly);
+    }
+    else {
+      oc_then.intersection_assign(FP_Octagonal_Shape(or_then.int_store));
+    }
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(oc_then));
+
+    // else skip;
+    oc.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                          FP_Linear_Form(D));
+    oracle.int_store.refine_with_constraint(R < D);
+    oc.intersection_assign(FP_Octagonal_Shape(oracle.int_store));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(oc));
+
+    // LUB between then and else branches.
+    oc.upper_bound_assign(oc_then);
+    oracle.int_store.upper_bound_assign(or_then.int_store);
+    print_constraints(oracle.int_store,
+                      "*** after if (R >= D)  Y = S + D; ***");
+
+    // LUB between the actual abstract domains and the corresponding
+    // domains at the beginning of the loop.
+    oc.upper_bound_assign(oc_begin);
+    oracle.int_store.upper_bound_assign(or_begin.int_store);
+
+    // Limited extrapolation: we enforce the satisfaction
+    // of the constraint system cs = {Y <= M; Y >= -M}
+    oc.limited_BHMZ05_extrapolation_assign(oc_begin, cs);
+    oracle.int_store.limited_CC76_extrapolation_assign(or_begin.int_store, cs);
+    print_constraints(oracle.int_store, "*** end loop ***");
+    ++n;
+
+  } while(or_begin.int_store != oracle.int_store);
+
+  tmp = oracle.int_store.get_interval(Y);
+  nout << "*** Y in " << tmp << " ***" << endl;
+  return (tmp.lower() == -144 && tmp.upper() == 144);
+}
+
+// Tests rate limiter using polyhedra domain and linearization of
+// floating point expressions.
+// In order to improve the analysis, the interval domain is used
+// in parallel with poyhedra domain.
+bool
+test07() {
+  // Input signal.
+  Variable X(0);
+  // Maximum allowed for |R|.
+  Variable D(1);
+  // Output signal.
+  Variable Y(2);
+  // Last output.
+  Variable S(3);
+  // Actual rate.
+  Variable R(4);
+
+  Test_Oracle oracle(FP_Interval_Abstract_Store(5));
+  Test_Oracle or_begin(FP_Interval_Abstract_Store(5));
+  FP_Linear_Form_Abstract_Store lf_abstract_store;
+  NNC_Polyhedron ph(5);
+  NNC_Polyhedron ph_begin(5);
+  unsigned short n = 0;
+  FP_Interval tmp(0);
+  FP_Linear_Form lx;
+  FP_Linear_Form ly;
+  FP_Linear_Form lr;
+  FP_Linear_Form lk;
+
+  Constraint_System cs;
+  Coefficient M;
+  set_M(M, 144);
+  cs.insert(Y <= M);
+  cs.insert(Y >= -M);
+
+  bool lin_success;
+
+  Floating_Point_Constant<C_Expr> con_y("0", 2);
+  // The constant floating point expression con_y is linearized into
+  // the interval linear form lk. If linearization succeeded, we model
+  // the assignment Y = 0, invoking affine_form_image method.
+  // In order to refine the analysis, all the transer function are
+  // performed in parallel in the interval domain and in the bounded
+  // differences domain.
+  // Then, we consider the intersection between these abstract domains.
+
+  lin_success = linearize(con_y, oracle, lf_abstract_store, lk);
+  oracle.int_store.affine_form_image(Y, FP_Linear_Form(tmp));
+  if (lin_success) {
+    ph.affine_form_image(Y, lk);
+  }
+  else {
+    ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+  }
+  oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+  // This loop iterate until a fixed point is reached.
+  do {
+
+    // Iteration no. n+1.
+    nout << "*** n = " << n << " ***" << endl;
+    ph_begin = ph;
+    or_begin.int_store = oracle.int_store;
+    print_constraints(oracle.int_store, "*** before loop ***");
+
+    // X = [-128, 128];
+    tmp.lower() = -128;
+    tmp.upper() = 128;
+    oracle.int_store.affine_form_image(X, FP_Linear_Form(tmp));
+    ph.affine_form_image(X, FP_Linear_Form(tmp));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // D = [0, 16];
+    tmp.lower() = 0;
+    tmp.upper() = 16;
+    oracle.int_store.affine_form_image(D, FP_Linear_Form(tmp));
+    ph.affine_form_image(D, FP_Linear_Form(tmp));    
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // S = Y;
+    Approximable_Reference<C_Expr> var_y(FP_Type, Int_Interval(mpz_class(0)),
+                                         Y.id());
+    lin_success = linearize(var_y, oracle, lf_abstract_store, ly);
+    oracle.int_store.affine_form_image(S, FP_Linear_Form(Y));
+    if (lin_success) {
+      ph.affine_form_image(S, ly);
+    }
+    else {
+      ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // R = X - S;
+    Approximable_Reference<C_Expr> px(FP_Type, Int_Interval(mpz_class(0)),
+                                      X.id());
+    Approximable_Reference<C_Expr> ps(FP_Type, Int_Interval(mpz_class(0)),
+                                      S.id());
+    Binary_Operator<C_Expr> x_dif_s(FP_Type, Binary_Operator<C_Expr>::SUB,
+                                    &px, &ps);
+    lin_success = linearize(x_dif_s, oracle, lf_abstract_store, lr);
+    oracle.int_store.affine_form_image(R, FP_Linear_Form(X - S));
+    if (lin_success) {
+      ph.affine_form_image(R, lr);
+    }
+    else {
+      ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // Y = X;
+    lin_success = linearize(px, oracle, lf_abstract_store, lx);
+    oracle.int_store.affine_form_image(Y, FP_Linear_Form(X));
+    if (lin_success) {
+      ph.affine_form_image(Y, lx);
+    }
+    else {
+      ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+    }
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // if (R <= -D)
+    NNC_Polyhedron ph_then(ph);
+    Test_Oracle or_then(oracle.int_store);
+    or_then.int_store.refine_with_constraint(R <= -D);
+    ph_then.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                               -FP_Linear_Form(D));
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+    // then Y = S - D;
+    Approximable_Reference<C_Expr> pd(FP_Type, Int_Interval(mpz_class(0)),
+                                      D.id());
+    Binary_Operator<C_Expr> s_dif_d(FP_Type, Binary_Operator<C_Expr>::SUB,
+                                    &ps, &pd);
+    lin_success = linearize(s_dif_d, or_then, lf_abstract_store, ly);
+    or_then.int_store.affine_form_image(Y, FP_Linear_Form(S - D));
+    if (lin_success) {
+      ph_then.affine_form_image(Y, ly);
+    }
+    else {
+      ph_then.intersection_assign(NNC_Polyhedron(or_then.int_store));
+    }
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+    // else skip;
+    oracle.int_store.refine_with_constraint(R > -D);
+    ph.refine_with_linear_form_inequality(-FP_Linear_Form(D),
+                                          FP_Linear_Form(R));
+    ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // LUB between then and else branches.
+    ph.upper_bound_assign(ph_then);
+    oracle.int_store.upper_bound_assign(or_then.int_store);
+    print_constraints(oracle.int_store, "*** after if (R <= -D) Y = S - D; ***");
+
+    // if (R >= D)
+    ph_then = ph;
+    or_then.int_store = oracle.int_store;
+    or_then.int_store.refine_with_constraint(R >= D);
+    ph_then.refine_with_linear_form_inequality(FP_Linear_Form(D),
+                                               FP_Linear_Form(R));
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+    // then Y = S + D;
+    Binary_Operator<C_Expr> s_sum_d(FP_Type, Binary_Operator<C_Expr>::ADD,
+                                    &ps, &pd);
+    lin_success = linearize(s_sum_d, or_then, lf_abstract_store, ly);
+    or_then.int_store.affine_form_image(Y, FP_Linear_Form(S + D));
+    if (lin_success) {
+      ph_then.affine_form_image(Y, ly);
+    }
+    else {
+      ph_then.intersection_assign(NNC_Polyhedron(or_then.int_store));
+    }
+    or_then.int_store.intersection_assign(FP_Interval_Abstract_Store(ph_then));
+
+    // else skip;
+    ph.refine_with_linear_form_inequality(FP_Linear_Form(R),
+                                          FP_Linear_Form(D));
+    oracle.int_store.refine_with_constraint(R < D);
+    ph.intersection_assign(NNC_Polyhedron(oracle.int_store));
+    oracle.int_store.intersection_assign(FP_Interval_Abstract_Store(ph));
+
+    // LUB between then and else branches.
+    ph.upper_bound_assign(ph_then);
+    oracle.int_store.upper_bound_assign(or_then.int_store);
+    print_constraints(oracle.int_store,
+                      "*** after if (R >= D)  Y = S + D; ***");
+
+    // LUB between the actual abstract domains and the corresponding
+    // domains at the beginning of the loop.
+    ph.upper_bound_assign(ph_begin);
+    oracle.int_store.upper_bound_assign(or_begin.int_store);
+
+    // Limited extrapolation: we enforce the satisfaction
+    // of the constraint system cs = {Y <= M; Y >= -M}
+    ph.limited_BHRZ03_extrapolation_assign(ph_begin, cs);
+    oracle.int_store.limited_CC76_extrapolation_assign(or_begin.int_store, cs);
+    print_constraints(oracle.int_store, "*** end loop ***");
+    ++n;
+
+  } while(or_begin.int_store != oracle.int_store);
+
+  tmp = oracle.int_store.get_interval(Y);
+  nout << "*** Y in " << tmp << " ***" << endl;
+  return (tmp.lower() == -144 && tmp.upper() == 144);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+  DO_TEST_F8(test03);
+  DO_TEST_F64A(test04);
+
+#define COND_float  PPL_CPP_EQ(PPL_CPP_FP_FORMAT(ANALYZER_FP_FORMAT), 1)
+#define COND_double PPL_CPP_EQ(PPL_CPP_FP_FORMAT(ANALYZER_FP_FORMAT), 2)
+#define COND_float_or_double PPL_CPP_OR(COND_float, COND_double)
+#define PPL_CUSTOM_COND_32 \
+  PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 5), COND_float)
+#define PPL_CUSTOM_COND_64 \
+  PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 6), COND_float_or_double)
+#define PPL_CUSTOM_COND \
+  PPL_CPP_OR(COND_F64, PPL_CPP_OR(PPL_CUSTOM_COND_32, PPL_CUSTOM_COND_64))
+
+  COND_DO_TEST(PPL_CUSTOM_COND, test05);
+  COND_DO_TEST(PPL_CUSTOM_COND, test06);
+
+  DO_TEST_F64(test07);
+
+END_MAIN
diff --git a/tests/Concrete_Expression/linearform1.cc b/tests/Concrete_Expression/linearform1.cc
new file mode 100644
index 0000000..e6417c8
--- /dev/null
+++ b/tests/Concrete_Expression/linearform1.cc
@@ -0,0 +1,342 @@
+/* Testing Linear_Form on floating point intervals.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+// Test operator-=(FP_Linear_Form& f1, const FP_Linear_Form& f2):
+// in this case the dimension of f2 is strictly greater than
+// the dimension of f1.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Linear_Form f;
+  FP_Linear_Form f1 = A;
+  FP_Linear_Form f2 = B;
+
+  f1 += f.coefficient(A);
+  f1 -= f2;
+
+  FP_Linear_Form known_result = A - FP_Linear_Form(B);
+
+  bool ok = (f1 == known_result);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(15);
+  Variable B(0);
+
+  FP_Linear_Form f1 = A;
+  FP_Linear_Form f2 = B;
+
+  FP_Linear_Form known_result1 = f1 + f2;
+
+  bool ok1 = (FP_Linear_Form(A) + B == known_result1)
+    && (B + FP_Linear_Form(A) == known_result1)
+    && (A + FP_Linear_Form(B) == known_result1)
+    && (FP_Linear_Form(B) + A == known_result1)
+    && (FP_Linear_Form(B) + FP_Linear_Form(A) == known_result1);
+
+  nout << "*** known_result1 ***" << endl
+       << known_result1 << endl;
+
+  FP_Linear_Form known_result2 = f1 + f1;
+
+  bool ok2 = (FP_Linear_Form(A) + A == known_result2)
+    && (A + FP_Linear_Form(A) == known_result2)
+    && (A + FP_Linear_Form(A) == known_result2)
+    && (FP_Linear_Form(A) + A == known_result2)
+    && (FP_Linear_Form(A) + FP_Linear_Form(A) == known_result2);
+
+  nout << "*** known_result2 ***" << endl
+       << known_result2 << endl;
+
+  return ok1 && ok2;
+}
+
+bool
+test03() {
+  Variable A(15);
+  Variable B(10);
+
+  FP_Linear_Form f1 = A;
+  FP_Linear_Form f2 = B;
+
+  FP_Linear_Form known_result1 = f1 - f2;
+
+  bool ok1 = (FP_Linear_Form(A) - B == known_result1)
+    && (A - FP_Linear_Form(B) == known_result1)
+    && (FP_Linear_Form(A) - FP_Linear_Form(B) == known_result1);
+
+  nout << "*** known_result1 ***" << endl
+       << known_result1 << endl;
+
+  FP_Linear_Form known_result2 = f2 - f1;
+
+  bool ok2 = (FP_Linear_Form(B) - A == known_result2)
+    && (B - FP_Linear_Form(A) == known_result2)
+    && (FP_Linear_Form(B) - FP_Linear_Form(A) == known_result2);
+
+  nout << "*** known_result2 ***" << endl
+       << known_result2 << endl;
+
+  FP_Linear_Form known_result3 = f1 - f1;
+
+  bool ok3 = (FP_Linear_Form(A) - A == known_result3)
+    && (A - FP_Linear_Form(A) == known_result3)
+    && (FP_Linear_Form(A) - FP_Linear_Form(A) == known_result3);
+
+  nout << "*** known_result3 ***" << endl
+       << known_result3 << endl;
+
+  return ok1 && ok2 && ok3;
+}
+
+// Test operator+=(FP_Linear_Form& f1, const FP_Linear_Form& f2):
+// in this case the dimension of f2 is strictly greater than
+// the dimension of f1.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Linear_Form f1 = A;
+  FP_Linear_Form f2 = B;
+  f1 += f2;
+
+  FP_Linear_Form known_result = FP_Linear_Form(A) + B;
+
+  bool ok = (f1 == known_result);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+
+  return ok;
+}
+
+// Test operator+=(FP_Linear_Form& f, Variable v):
+// in this case the dimension of v is strictly greater than
+// the dimension of f.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Linear_Form f = A;
+  FP_Interval x(FP_Interval::boundary_type(2));
+  x /= FP_Interval(FP_Interval::boundary_type(3));
+  f *= x;
+
+  FP_Linear_Form known_result = f + B;
+
+  f += B;
+
+  bool ok = (f == known_result);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(16);
+  Variable D(120);
+
+  FP_Linear_Form f = A + 2*B + 16*C + 120*D;
+
+  FP_Linear_Form known_result = A;
+  known_result += FP_Interval(2) * FP_Linear_Form(B);
+  known_result += FP_Interval(16) * FP_Linear_Form(C);
+  known_result += FP_Interval(120) * FP_Linear_Form(D);
+
+  bool ok = (f == known_result);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+
+  return ok;
+}
+
+// Tests operator==(const Linear_Form<C>& x, const Linear_Form<C>& y).
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  FP_Linear_Form f1 = A;
+  FP_Linear_Form f2;
+  bool known_result = false;
+
+  bool result1 = (f1 == f2);
+
+  f2 += FP_Interval(FP_Interval::boundary_type(1));
+  bool result2 = (f1 == f2);
+
+  bool result3 = (f2 == f1);
+
+  f1 += FP_Interval(FP_Interval::boundary_type(1));
+  bool result4 = (f2 == f1);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+
+  return (known_result == (result1 || result2 || result3 || result4));
+}
+
+
+// Tests overflows of space dimension.
+bool
+test08() {
+  FP_Linear_Form f;
+  Variable A(f.max_space_dimension());
+
+  bool ok1 = false;
+  try {
+    f = FP_Linear_Form(A);
+  }
+  catch(std::length_error e) {
+      nout << "Overflow in Linear_Form(const Variable v)." << endl;
+      ok1 = true;
+  }
+
+  bool ok2 = false;
+  try {
+    f += A;
+  }
+  catch(std::length_error e) {
+      nout << "Overflow in operator+=(Linear_Form<C>& f, const Variable v)."
+           << endl;
+      ok2 = true;
+  }
+
+  bool ok3 = false;
+  try {
+    f -= A;
+  }
+  catch(std::length_error e) {
+      nout << "Overflow in operator-=(Linear_Form<C>& f, const Variable v)."
+           << endl;
+      Variable B(1);
+      Variable C(2);
+      FP_Linear_Form g(B);
+      g -= C;
+      ok3 = true;
+  }
+
+  FP_Linear_Form g;
+  bool ok4 = false;
+  try {
+    g = f - A;
+  }
+  catch(std::length_error e) {
+      nout << "Overflow in operator-(Linear_Form<C>& f, const Variable v)."
+           << endl;
+      ok4 = true;
+  }
+
+  bool ok5 = false;
+  try {
+    g = A - f;
+  }
+  catch(std::length_error e) {
+      nout << "Overflow in operator-(const Variable v, Linear_Form<C>& f)."
+           << endl;
+      ok5 = true;
+  }
+
+  bool ok6 = false;
+  try {
+    g = A + f;
+  }
+  catch(std::length_error e) {
+      nout << "Overflow in operator+(const Variable v, Linear_Form<C>& f)."
+           << endl;
+      ok6 = true;
+  }
+
+  return ok1 && ok2 && ok3 && ok4 && ok5 && ok6;
+}
+
+bool
+test09() {
+  Variable A(0);
+  FP_Linear_Form f;
+  bool ok1 = !f.overflows();
+  f += A;
+  bool ok2 = !f.overflows();
+  FP_Interval max(std::numeric_limits<ANALYZER_FP_FORMAT>::max());
+  f *= max;
+  f *= max;
+  bool ok3 = f.overflows();
+  return ok1 && ok2 && ok3;
+}
+
+bool
+test10() {
+  Variable x5(5);
+  Variable x2(2);
+  FP_Interval x5_coefficient;
+  x5_coefficient.lower() = FP_Interval::boundary_type(2);
+  x5_coefficient.upper() = FP_Interval::boundary_type(3);
+  FP_Interval inhomogeneous_term;
+  inhomogeneous_term.lower() = FP_Interval::boundary_type(4);
+  inhomogeneous_term.upper() = FP_Interval::boundary_type(8);
+  FP_Linear_Form lf(x2);
+  lf = -lf;
+  lf += FP_Linear_Form(x2);
+  FP_Linear_Form lx5(x5);
+  lx5 *= x5_coefficient;
+  lf += lx5;
+  return lf.space_dimension() == 6;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Concrete_Expression/linearize.cc b/tests/Concrete_Expression/linearize.cc
new file mode 100644
index 0000000..6b909b8
--- /dev/null
+++ b/tests/Concrete_Expression/linearize.cc
@@ -0,0 +1,326 @@
+/* Testing linearization algorithm ad its related functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "C_Expr_defs.hh"
+
+namespace {
+
+class Test_Oracle : public FP_Oracle<C_Expr,FP_Interval> {
+public:
+  Test_Oracle() : int_store(0) {}
+
+  Test_Oracle(FP_Interval_Abstract_Store init) : int_store(init) {}
+
+  bool get_interval(dimension_type dim, FP_Interval& result) const {
+    result = int_store.get_interval(Variable(dim));
+    return true;
+  }
+
+  bool get_fp_constant_value(const Floating_Point_Constant<C_Expr>& expr,
+                             FP_Interval& result) const {
+    result = FP_Interval((const char *)expr.value);
+    return true;
+  }
+
+  bool get_integer_expr_value(const Concrete_Expression<C_Expr>& expr,
+                              FP_Interval& result) const {
+    if (expr.kind() == INT_CON) {
+      const Integer_Constant<C_Expr>* ic_expr =
+        reinterpret_cast< const Integer_Constant<C_Expr>* >(&expr);
+      result = FP_Interval(ic_expr->value);
+    }
+    else {
+      const Approximable_Reference<C_Expr>* ar_expr =
+        reinterpret_cast< const Approximable_Reference<C_Expr>* >(&expr);
+      result = FP_Interval(ar_expr->value);
+    }
+
+    return true;
+  }
+
+  bool get_associated_dimensions(
+       const Approximable_Reference<C_Expr>& expr,
+       std::set<dimension_type>& result) const {
+    result = expr.dimensions;
+    return true;
+  }
+
+  FP_Interval_Abstract_Store int_store;
+};
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+Concrete_Expression_Type FP_Type =
+  Concrete_Expression_Type::floating_point(ANALYZED_FP_FORMAT);
+
+typedef Integer_Interval Int_Interval;
+
+// Tests division by zero.
+bool
+test01() {
+  Floating_Point_Constant<C_Expr> num("3", 2);
+  Floating_Point_Constant<C_Expr> den("0", 2);
+  Binary_Operator<C_Expr> div(FP_Type, Binary_Operator<C_Expr>::DIV, &num, &den);
+  FP_Linear_Form result;
+  if (!linearize(div, Test_Oracle(), FP_Linear_Form_Abstract_Store(),
+                 result)) {
+    nout << "*** Linearization failed due to division by zero. ***" << endl;
+    return true;
+  }
+  return false;
+}
+
+// Tests multiplication by zero.
+bool
+test02() {
+  Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+  oracle.int_store.set_interval(Variable(0), FP_Interval(0));
+  oracle.int_store.set_interval(Variable(1), FP_Interval(10));
+  Floating_Point_Constant<C_Expr> con("5.5", 4);
+  Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+  Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+  Binary_Operator<C_Expr> dif(FP_Type, Binary_Operator<C_Expr>::SUB, &var1, &con);
+  Binary_Operator<C_Expr> mul(FP_Type, Binary_Operator<C_Expr>::MUL, &dif, &var0);
+  FP_Linear_Form result;
+  if (!linearize(mul, oracle, FP_Linear_Form_Abstract_Store(), result))
+    return false;
+
+  FP_Linear_Form known_result(compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT));
+
+  nout << "*** result ***" << endl
+       << result << endl;
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+  bool ok = (result == known_result);
+
+  return ok;
+}
+
+// Tests linearization of variables in a given linear form abstract store.
+bool
+test03() {
+  FP_Linear_Form_Abstract_Store store;
+  Variable A(0);
+  FP_Linear_Form known_result = FP_Linear_Form(A);
+  store[0] = known_result;
+  Approximable_Reference<C_Expr> var(FP_Type, Int_Interval(mpz_class(0)), 0);
+  FP_Linear_Form result;
+  linearize(var, Test_Oracle(), store, result);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+  bool ok = (result == known_result);
+
+  return ok;
+}
+
+// Tests linearization of A + B.
+bool
+test04() {
+  FP_Interval tmp(0);
+  Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+  oracle.int_store.set_interval(Variable(0), tmp);
+  oracle.int_store.set_interval(Variable(1), tmp);
+  Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+  Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+  Binary_Operator<C_Expr> sum(FP_Type, Binary_Operator<C_Expr>::ADD,
+                              &var0, &var1);
+  FP_Linear_Form result;
+  linearize(sum, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+  Variable A(0);
+  Variable B(1);
+  FP_Linear_Form known_result = FP_Linear_Form(A);
+  FP_Linear_Form rel_err1;
+  known_result.relative_error(ANALYZED_FP_FORMAT, rel_err1);
+  known_result += rel_err1;
+  FP_Linear_Form lb = FP_Linear_Form(B);
+  known_result += lb;
+  FP_Linear_Form rel_err2;
+  lb.relative_error(ANALYZED_FP_FORMAT, rel_err2);
+  known_result += rel_err2;
+  known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+  bool ok = result == known_result;
+
+  return ok;
+}
+
+// Tests the linearization of A - B.
+bool
+test05() {
+  FP_Interval tmp(0);
+  Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+  oracle.int_store.set_interval(Variable(0), tmp);
+  oracle.int_store.set_interval(Variable(1), tmp);
+  Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+  Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+  Binary_Operator<C_Expr> dif(FP_Type, Binary_Operator<C_Expr>::SUB,
+                              &var0, &var1);
+  FP_Linear_Form result;
+  linearize(dif, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+  Variable A(0);
+  Variable B(1);
+  FP_Linear_Form known_result = FP_Linear_Form(A);
+  FP_Linear_Form rel_err1;
+  known_result.relative_error(ANALYZED_FP_FORMAT, rel_err1);
+  known_result += rel_err1;
+  FP_Linear_Form lb = FP_Linear_Form(B);
+  lb.negate();
+  known_result += lb;
+  FP_Linear_Form rel_err2;
+  lb.relative_error(ANALYZED_FP_FORMAT, rel_err2);
+  known_result += rel_err2;
+  known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+  bool ok = result == known_result;
+
+  return ok;
+}
+
+// Tests linearization of A * B where A in [0, 1] and B in [2, 2].
+bool
+test06() {
+  FP_Interval tmp(0);
+  tmp.join_assign(1);
+  Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+  oracle.int_store.set_interval(Variable(0), tmp);
+  oracle.int_store.set_interval(Variable(1), FP_Interval(2));
+  Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+  Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+  Binary_Operator<C_Expr> mul(FP_Type, Binary_Operator<C_Expr>::MUL,
+                              &var0, &var1);
+  FP_Linear_Form result;
+  linearize(mul, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+  Variable A(0);
+  FP_Interval coeff = FP_Interval(2);
+  FP_Linear_Form known_result = FP_Linear_Form(A);
+  FP_Linear_Form rel_err;
+  known_result.relative_error(ANALYZED_FP_FORMAT, rel_err);
+  known_result *= coeff;
+  known_result += coeff * rel_err;
+  known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+  bool ok = (result == known_result);
+
+  return ok;
+}
+
+// Tests the linearization of A / B where A = [0, 1] and B = [2, 2].
+bool
+test07() {
+  FP_Interval tmp(0);
+  tmp.join_assign(1);
+  Test_Oracle oracle(FP_Interval_Abstract_Store(2));
+  oracle.int_store.set_interval(Variable(0), tmp);
+  oracle.int_store.set_interval(Variable(1), FP_Interval(2));
+  Approximable_Reference<C_Expr> var0(FP_Type, Int_Interval(mpz_class(0)), 0);
+  Approximable_Reference<C_Expr> var1(FP_Type, Int_Interval(mpz_class(0)), 1);
+  Binary_Operator<C_Expr> div(FP_Type, Binary_Operator<C_Expr>::DIV,
+                              &var0, &var1);
+  FP_Linear_Form result;
+  linearize(div, oracle, FP_Linear_Form_Abstract_Store(), result);
+
+  Variable A(0);
+  FP_Interval coeff(FP_Interval::boundary_type(1 / 2.0));
+  FP_Linear_Form known_result(A);
+  FP_Linear_Form rel_err;
+  known_result.relative_error(ANALYZED_FP_FORMAT, rel_err);
+  known_result *= coeff;
+  known_result += rel_err * coeff;
+  known_result += compute_absolute_error<FP_Interval>(ANALYZED_FP_FORMAT);
+
+  bool ok = (result == known_result);
+
+  return ok;
+}
+
+// Tests linearization of cast expressions.
+bool
+test08() {
+  Int_Interval i(mpz_class(123456789));
+  Integer_Constant<C_Expr> ic_expr(Concrete_Expression_Type::bounded_integer(BITS_32, UNSIGNED, OVERFLOW_WRAPS), i);
+  Cast_Operator<C_Expr> cast(FP_Type, &ic_expr);
+  FP_Linear_Form result;
+  linearize(cast, Test_Oracle(),
+            FP_Linear_Form_Abstract_Store(), result);
+
+  Int_Interval approx(mpz_class(123456700));
+  approx.join_assign(mpz_class(123456850));
+  bool ok1 = approx.contains(result.inhomogeneous_term());
+
+  Approximable_Reference<C_Expr> var(Concrete_Expression_Type::bounded_integer(BITS_32, UNSIGNED, OVERFLOW_WRAPS), i, 0);
+  Cast_Operator<C_Expr> cast2(FP_Type, &var);
+  linearize(cast2, Test_Oracle(), FP_Linear_Form_Abstract_Store(), result);
+
+  bool ok2 = approx.contains(result.inhomogeneous_term());
+
+  return ok1 && ok2;
+}
+
+/*
+  Tests linearization of an approximable reference having more than
+  one associated index.
+*/
+bool
+test09() {
+  Test_Oracle oracle(FP_Interval_Abstract_Store(4));
+  oracle.int_store.set_interval(Variable(0), FP_Interval(0));
+  oracle.int_store.set_interval(Variable(1), FP_Interval(10));
+  oracle.int_store.set_interval(Variable(2), FP_Interval(20));
+  oracle.int_store.set_interval(Variable(3), FP_Interval(5));
+  Approximable_Reference<C_Expr> ref(FP_Type, Int_Interval(mpz_class(0)), 0);
+  ref.dimensions.insert(1);
+  ref.dimensions.insert(3);
+  FP_Linear_Form result;
+  if (!linearize(ref, oracle, FP_Linear_Form_Abstract_Store(), result))
+    return false;
+
+  FP_Interval known_int(FP_Interval(0));
+  known_int.join_assign(FP_Interval(10));
+  FP_Linear_Form known_result(known_int);
+
+  nout << "*** result ***" << endl
+       << result << endl;
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+  bool ok = (result == known_result);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Concrete_Expression/octagonalshape1.cc b/tests/Concrete_Expression/octagonalshape1.cc
new file mode 100644
index 0000000..e7e5a3b
--- /dev/null
+++ b/tests/Concrete_Expression/octagonalshape1.cc
@@ -0,0 +1,347 @@
+/* Test Octagonal_Shape::affine_form_image on interval linear forms.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests space_dimensions and trivial cases.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  FP_Octagonal_Shape oc1(0);
+  bool ok1 = false;
+  FP_Linear_Form l(A);
+
+  try {
+      oc1.affine_form_image(A, l);
+  }
+  catch(std::invalid_argument e) {
+    nout << "oc1_space_dim < lf_space_dim" << endl;
+    ok1 = true;
+  }
+
+  bool ok2 = false;
+  FP_Octagonal_Shape oc2(1);
+
+  try {
+    oc2.affine_form_image(B, l);
+  }
+  catch(std::invalid_argument e) {
+    nout << "space_dim < var_id + 1" << endl;
+    oc2.affine_form_image(A, l);
+    Constraint_System cs(A < A);
+    oc2.add_constraints(cs);
+    oc2.affine_form_image(A, l);
+    ok2 = true;
+  }
+
+  return ok1 && ok2;
+}
+
+// Tests affine_form_image(A, [-2, 1]).
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(-2);
+  free_term.join_assign(1);
+  FP_Linear_Form l(free_term);
+  oc1.affine_form_image(A, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(A, [-2, 1]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(A >= -2);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A <= 1);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+
+// Tests affine_form_image(A, [-1, -1]*A + [0.5, 2]).
+bool test03() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(static_cast<FP_Interval::boundary_type>(0.5));
+  free_term.join_assign(2);
+  FP_Linear_Form l(-A);
+  l += free_term;
+  print_constraints(oc1, "*** oc1 ***");
+  oc1.affine_form_image(A, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(A, -A + [0.5, 2]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(-2 * A <= 3);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(2*B - 2*A <= 7);
+  known_result.add_constraint(2*A + 2*B >= -5);
+  print_constraints(known_result, "*** known_result ***");
+  bool ok = (oc1 == known_result);
+
+  return ok;
+
+}
+
+
+// Tests affine_form_image(B, [1, 1]*B + [-1.5, 3.5]).
+bool test04() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(static_cast<FP_Interval::boundary_type>(-1.5));
+  free_term.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+  FP_Linear_Form l(B);
+  l += free_term;
+  oc1.affine_form_image(B, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(B, B + [-1.5, 3.5]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(2*B <= 11);
+  known_result.add_constraint(2*B + 2*A <= 15);
+  known_result.add_constraint(-2*B + 2*A <= 9);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(A, [1, 1]*B + [-2, 0.5]).
+bool test05() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(-2);
+  free_term.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+  FP_Linear_Form l(B);
+  l += free_term;
+  oc1.affine_form_image(A, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(A, B + [-2, 0.5]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(2*A <= 5);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(B - A <= 2);
+  known_result.add_constraint(2*A - 2*B <= 1);
+  known_result.add_constraint(2*A + 2*B <= 9);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [1, 1]*A + [-3, 1]).
+bool test06() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(-3);
+  free_term.join_assign(1);
+  FP_Linear_Form l(A);
+  l += free_term;
+  oc1.affine_form_image(B, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(B, A + [-3, 1]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 3);
+  known_result.add_constraint(B - A <= 1);
+  known_result.add_constraint(A - B <= 3);
+  known_result.add_constraint(A + B <= 5);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [-1, -1]*A + [0, 4]).
+bool test07() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(0);
+  free_term.join_assign(4);
+  FP_Linear_Form l(-A);
+  l += free_term;
+  oc1.affine_form_image(B, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(B, -A + [0, 4]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(-B <= 2);
+  known_result.add_constraint(-B - A <= 0);
+  known_result.add_constraint(A - B <= 4);
+  known_result.add_constraint(A + B <= 4);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(A, [-1, -1]*B + [0, 2]).
+bool test08() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval free_term(0);
+  free_term.join_assign(2);
+  FP_Linear_Form l(-B);
+  l += free_term;
+  oc1.affine_form_image(A, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(A, -B + [0, 2]) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(-A <= 2);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(-B - A <= 0);
+  known_result.add_constraint(-A + B <= 4);
+  known_result.add_constraint(A + B <= 2);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests affine_form_image(B, [-0.5, 0.5]*A).
+bool test09() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Interval coeff(static_cast<FP_Interval::boundary_type>(-0.5));
+  coeff.join_assign(static_cast<FP_Interval::boundary_type>(0.5));
+  FP_Linear_Form l(A);
+  l *= coeff;
+  oc1.affine_form_image(B, l);
+  print_constraints(oc1, "*** oc1.affine_form_image(B, [-0.5, 0.5]*A) ***");
+
+  FP_Octagonal_Shape known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(-B + A <= 3);
+  known_result.add_constraint(A + B <= 3);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+
+// Tests affine_form_image(A, i + i0*A + i1*B) where
+// i = [0, 2], i0 = [1, 1] and i1 = [1, 2].
+bool test10() {
+
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(B <= 2);
+  oc1.add_constraint(A - B >= 0);
+  FP_Interval tmp(1);
+  FP_Linear_Form l(A);
+  l *= tmp;
+  tmp.lower() = 0;
+  tmp.upper() = 2;
+  l += tmp;
+  tmp.lower() = 1;
+  tmp.upper() = 2;
+  l += tmp * FP_Linear_Form(B);
+  oc1.affine_form_image(A,l);
+  print_constraints(oc1, "*** oc1.affine_form_image(A, i + i0*A + i1*B) ***");
+
+  FP_Octagonal_Shape know_result(2);
+  know_result.add_constraint(A >= 0);
+  know_result.add_constraint(A <= 8);
+  know_result.add_constraint(B >= 0);
+  know_result.add_constraint(B <= 2);
+  know_result.add_constraint(A - B <= 6);
+  know_result.add_constraint(A + B <= 10);
+  know_result.add_constraint(-A + B <= 0);
+  know_result.add_constraint(-A - B <= 0);
+  print_constraints(know_result, "*** know_result ***");
+
+  bool ok = (oc1 == know_result);
+
+  return ok;
+}
+
+} //namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Concrete_Expression/octagonalshape2.cc b/tests/Concrete_Expression/octagonalshape2.cc
new file mode 100644
index 0000000..d00e9c1
--- /dev/null
+++ b/tests/Concrete_Expression/octagonalshape2.cc
@@ -0,0 +1,464 @@
+/* Test Octagonal_Shape::refine_fp_interval_abstract_store and
+   Octagonal_Shape::refine_with_linear_form_inequality.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests trivial cases.
+bool
+test01() {
+  Variable A(0);
+  FP_Octagonal_Shape oc1(0);
+  bool ok1 = false;
+  FP_Linear_Form l1(A);
+  FP_Linear_Form l2;
+  try {
+      oc1.refine_with_linear_form_inequality(l1, l2);
+  }
+  catch(std::invalid_argument e) {
+    nout << "space_dim < left_space_dim" << endl;
+    ok1 = true;
+  }
+
+  bool ok2 = false;
+  try {
+    oc1.refine_with_linear_form_inequality(l2, l1);
+  }
+  catch(std::invalid_argument e) {
+    nout << "space_dim < right_space_dim" << endl;
+    FP_Octagonal_Shape oc2(1);
+    oc2.refine_with_linear_form_inequality(l1, l1);
+    oc2.refine_with_linear_form_inequality(-l1, l1);
+    oc2.refine_with_linear_form_inequality(l1, -l1);
+    FP_Interval tmp(0);
+    l1 -= A;
+    l1 += tmp;
+    l2 += tmp;
+    oc2.refine_with_linear_form_inequality(l1, l2);
+    ok2 = true;
+  }
+
+  return ok1 && ok2;
+}
+
+// Tests [-1, 2] <= [-4, -1] + A and [-4, -1] + A <= [-1, 2].
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(-1);
+  tmp.join_assign(2);
+  FP_Linear_Form l1(tmp);
+  FP_Linear_Form l2(A);
+  tmp.lower() = -4;
+  tmp.upper() = -1;
+  l2 += tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [-1, 2] <= [-4, -1] + A ***");
+
+  known_result.add_constraint(-A <= 0);
+  print_constraints(known_result, "*** known_result1 ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [-4, -1] + A <= [-1, 2] ***");
+
+  known_result.add_constraint(A <= 6);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [3.5, 6] <= [-2.5, 0] - A and [-2.5, 0] - A <= [3.5, 6].
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(static_cast<FP_Interval::boundary_type>(3.5));
+  tmp.join_assign(6);
+  FP_Linear_Form l1(tmp);
+  FP_Linear_Form l2(-A);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(-2.5);
+  tmp.upper() = 0;
+  l2 += tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [3.5, 6] <= [-2.5, 0] - A ***");
+
+  known_result.add_constraint(2*A <= -7);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [-2.5, 0] - A <= [3.5, 6] ***");
+
+  known_result.add_constraint(2*A >= -17);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [-0.5, 1] + A <= [2.5, 5] + B and [2.5, 5] + B <= [-0.5, 1] + A.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-0.5));
+  tmp.join_assign(1);
+  FP_Linear_Form l1(A);
+  l1 += tmp;
+  FP_Linear_Form l2(B);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(2.5);
+  tmp.upper() = 5;
+  l2 += tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [-0.5, 1] + A <= [2.5, 5] + B ***");
+
+  known_result.add_constraint(2*A - 2*B <= 11);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [2.5, 5] + B <= [-0.5, 1] + A ***");
+
+  known_result.add_constraint(2*B - 2*A <= -3);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [1, 3] + A <= [4, 4] - B and [4, 4] - B <= [1, 3] + A.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(4);
+  FP_Linear_Form l2(-B);
+  l2 += tmp;
+  FP_Linear_Form l1(A);
+  tmp.lower() = 1;
+  tmp.upper() = 3;
+  l1 += tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [1, 3] + A <= [4, 4] - B ***");
+
+  known_result.add_constraint(A + B <= 3);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [4, 4] - B <= [1, 3] + A ***");
+
+  known_result.add_constraint(-B - A <= -1);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [1, 4] - A <= [-2, -2] + B and [-2, -2] + B <= [1, 4] - A.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(-2);
+  FP_Linear_Form l2(B);
+  l2 += tmp;
+  FP_Linear_Form l1(-A);
+  tmp.lower() = 1;
+  tmp.upper() = 4;
+  l1 += tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [1, 4] - A <= [-2, -2] + B ***");
+
+  known_result.add_constraint(-B - A <= -3);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [4, 4] - B <= [1, 3] + A ***");
+
+  known_result.add_constraint(-B - A <= -1);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [-3, -0.5] - A <= [-2, -1] - B and [-2, -1] - B <= [-3, -0.5] - A.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(-2);
+  tmp.join_assign(-1);
+  FP_Linear_Form l2(-B);
+  l2 += tmp;
+  FP_Linear_Form l1(-A);
+  tmp.lower() = -3;
+  tmp.upper() = static_cast<FP_Interval::boundary_type>(-0.5);
+  l1 += tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [-3, -0.5] - A <= [-2, -1] - B ***");
+
+  known_result.add_constraint(B - A <= 2);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [-2, -1] - B <= [-3, -0.5] - A ***");
+
+  known_result.add_constraint(-2*B + 2*A <= 3);
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+
+}
+
+// Tests [1, 3] * B <= [-1.5, 0] * A.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(1);
+  tmp.join_assign(3);
+  FP_Linear_Form l1(B);
+  l1 *= tmp;
+  FP_Linear_Form l2(A);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(-1.5);
+  tmp.upper() = 0;
+  l2 *= tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [1, 3] * B <= [-1.5, 0] * A ***");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests [0.25, 0.5] * A + [-2, -1] * B <= [-7, -2]
+// and   [-7, -2] <= [0.25, 0.5] * A + [-2, -1] * B.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+
+  FP_Interval tmp(-7);
+  tmp.join_assign(-2);
+  FP_Linear_Form l2(tmp);
+  FP_Linear_Form l1(A);
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(0.25);
+  tmp.upper() = static_cast<FP_Interval::boundary_type>(0.5);
+  l1 *= tmp;
+  tmp.lower() = -2;
+  tmp.upper() = -1;
+  l1 += tmp * FP_Linear_Form(B);
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [0.25, 0.5]*A + [-2, -1]*B <= [-7, -2] ***");
+
+  known_result.add_constraint(2*B + 2*A <= 11);
+  known_result.add_constraint(-2*B + 2*A <= 3);
+  known_result.add_constraint(2*A <= 7);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok1 = (oc1 == known_result);
+
+  oc1.refine_with_linear_form_inequality(l2, l1);
+  print_constraints(oc1, "*** [-7, -2] <= [0.25, 0.5]*A + [-2, -1]*B ***");
+
+  print_constraints(known_result, "*** known_result2 ***");
+
+  bool ok2 = (oc1 == known_result);
+
+  return ok1 && ok2;
+}
+
+// Tests [-5, -1] * A <= [2, 3] * B + [0.5, 1].
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  FP_Octagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= 3);
+  oc1.add_constraint(B <= 2);
+  FP_Octagonal_Shape known_result(oc1);
+  FP_Interval tmp(2);
+  tmp.join_assign(3);
+  FP_Linear_Form l2(B);
+  l2 *= tmp;
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(0.5);
+  tmp.upper() = 1;
+  l2 += tmp;
+  FP_Linear_Form l1(A);
+  tmp.lower() = -5;
+  tmp.upper() = -1;
+  l1 *= tmp;
+  oc1.refine_with_linear_form_inequality(l1, l2);
+  print_constraints(oc1, "*** [-5, -1] * A <= [2, 3] * B + [0.5, 1] ***");
+
+  known_result.add_constraint(B - A <= 17);
+  known_result.add_constraint(B + A <= 21);
+  known_result.add_constraint(-B - A <= 13);
+  known_result.add_constraint(-B + A <= 17);
+  known_result.add_constraint(A <= 19);
+  known_result.add_constraint(-A <= 15);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (oc1 == known_result);
+
+  return ok;
+}
+
+// Tests Octagonal_Shape<T>::refine_fp_interval_abstract_store.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(static_cast<FP_Interval::boundary_type>(-2.5));
+  tmp.join_assign(static_cast<FP_Interval::boundary_type>(3.5));
+  store.set_interval(A, tmp);
+  tmp.lower() = -4;
+  tmp.upper() = 4;
+  store.set_interval(B, tmp);
+  Octagonal_Shape<ANALYZER_FP_FORMAT> oc1(2);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(B <= 2);
+  oc1.add_constraint(A >= -3);
+  oc1.add_constraint(2*B >= -3);
+  oc1.refine_fp_interval_abstract_store(store);
+
+  tmp = store.get_interval(A);
+  nout << "*** store.get_interval(A) ***" << endl
+       << tmp << endl;
+
+  FP_Interval known_result1(static_cast<FP_Interval::boundary_type>(-2.5));
+  known_result1.join_assign(2);
+  nout << "*** known_result1 ***" << endl
+       << known_result1 << endl;
+
+  bool ok1 = (tmp == known_result1);
+
+  tmp = store.get_interval(B);
+  nout << "*** store.get_interval(B) ***" << endl
+       << tmp << endl;
+
+  FP_Interval known_result2(static_cast<FP_Interval::boundary_type>(-1.5));
+  known_result2.join_assign(2);
+  nout << "*** known_result2 ***" << endl
+       << known_result2 << endl;
+
+  bool ok2 = (tmp == known_result2);
+
+  return ok1 && ok2;
+}
+
+} //namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Concrete_Expression/polyhedron1.cc b/tests/Concrete_Expression/polyhedron1.cc
new file mode 100644
index 0000000..48efb2b
--- /dev/null
+++ b/tests/Concrete_Expression/polyhedron1.cc
@@ -0,0 +1,278 @@
+/* Test Polyhedron::affine_form_image on interval linear forms.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests ph.affine_form_image(B, 3).
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  FP_Interval_Abstract_Store store(3);
+  FP_Interval tmp(0);
+  store.set_interval(B, tmp);
+  tmp.lower() = -2;
+  tmp.upper() = 2;
+  store.set_interval(A, tmp);
+  tmp.lower() = -1;
+  tmp.upper() = 1;
+  store.set_interval(C, tmp);
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A == -2);
+  tmp = 3;
+  FP_Linear_Form l(tmp);
+
+  ph.affine_form_image(B, l);
+  print_constraints(ph, "*** ph.affine_form_image(B, 3) ***");
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(-2 * A + 3 * B));
+  print_constraints(known_result, "*** know_result ***");
+
+  bool ok = (ph == known_result);
+  return ok;
+}
+
+// Tests ph.affine_form_image(A, A + B + 1).
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(1);
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 3);
+  FP_Linear_Form l(A);
+  l += B;
+  l += tmp;
+  ph.affine_form_image(A, l);
+  print_constraints(ph, "*** ph.affine_form_image(A, A + B + 1) ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - 2*B - 1 >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B <= 4);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (ph == known_result);
+
+  return ok;
+}
+
+// Tests ph.affine_form_image(A, (A + 1) / 2).
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(FP_Interval::boundary_type(1 / 2.0));
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+  C_Polyhedron ph(gs);
+  FP_Linear_Form l(A);
+  l *= tmp;
+  l += tmp;
+  ph.affine_form_image(A, l);
+  print_constraints(ph, "*** ph.affine_form_image(A, (A + 1) / 2) ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(B >= 0);
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (ph == known_result);
+
+  return ok;
+}
+
+// Tests ph.affine_form_image(A, (B + 2) / (-3)).
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(-1);
+  tmp /= FP_Interval(3);
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A));
+  FP_Linear_Form l(B);
+  l *= tmp;
+  tmp += tmp;
+  l += tmp;
+  ph.affine_form_image(A, l);
+  print_constraints(ph, "*** ph.affine_form_image(A, (B + 2) / (-3)) ***");
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(-2*A, 3));
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (ph.contains(known_result));
+
+  return ok;
+}
+
+// Tests ph.affine_form_image(B, (A - B + 2) / (-3)).
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(2);
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(A <= 3);
+  ph.add_constraint(B >= 1);
+  ph.add_constraint(2*A >= B);
+  FP_Linear_Form l(A);
+  l += tmp;
+  l -= B;
+  l /= FP_Interval(-3);
+
+  ph.affine_form_image(B, l);
+  print_constraints(ph,
+    "*** ph.affine_form_image(B, (A - B + 2) / (-3)) ***");
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(2*A));
+  known_result.add_generator(point(2*A - B));
+  known_result.add_generator(point(9*A + B, 3));
+  known_result.add_generator(point(9*A - 4*B, 3));
+  print_constraints(known_result, "*** known_result ***");
+
+  bool ok = (ph.contains(known_result));
+
+  return ok;
+}
+
+// Tests ph.affine_form_image(A, (-A - 1) / (-1)).
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(-1);
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  FP_Linear_Form l(-A);
+  l += tmp;
+  l /= tmp;
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(B));
+  gs.insert(point(A + B));
+  C_Polyhedron ph(gs);
+  ph.affine_form_image(A, l);
+  print_constraints(ph,
+    "*** ph.affine_form_image(A, (-A - 1) / (-1)) ***");
+
+  Generator_System known_gs;
+  known_gs.insert(point(A));
+  known_gs.insert(point(2*A));
+  known_gs.insert(point(A + B));
+  known_gs.insert(point(2*A + B));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** known_result ***");
+
+  return ok;
+}
+
+// Tests affine_form_image on NNC_Polyhedron.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval_Abstract_Store store(2);
+  FP_Interval tmp(2);
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  FP_Linear_Form l(A);
+
+  NNC_Polyhedron p1(2);
+  p1.add_constraint(B == 0);
+  p1.add_constraint(-A > 0);
+
+  NNC_Polyhedron p2(2);
+  p2.add_constraint(B == 0);
+  p2.add_constraint(A >= 0);
+
+  p1.affine_form_image(B, l);
+  print_constraints(p1, "*** p1.affine_form_image(B, A) ***");
+  NNC_Polyhedron known_result1(2);
+  known_result1.add_constraint(A - B == 0);
+  known_result1.add_constraint(A < 0);
+  print_constraints(p1, "*** known_result1 ***");
+  bool ok1 = (p1 == known_result1);
+
+  l += tmp;
+  p2.affine_form_image(B, l);
+  print_constraints(p2, "*** p2.affine_form_image(B, A + 2) ***");
+  NNC_Polyhedron known_result2(2);
+  known_result2.add_constraint(A - B == -2);
+  known_result2.add_constraint(A >= 0);
+  print_constraints(p2, "*** known_result2 ***");
+  bool ok2 = (p2 == known_result2);
+
+  return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  if (sizeof(ANALYZER_FP_FORMAT) == 4) {
+    DO_TEST_F32A(test04);
+    DO_TEST_F64A(test05);
+  }
+  else if (sizeof(ANALYZER_FP_FORMAT) == 8) {
+    DO_TEST_F64A(test04);
+    DO_TEST_F64(test05);
+  }
+  else {
+    DO_TEST_F64(test04);
+    DO_TEST_F64(test05);
+  }
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Concrete_Expression/polyhedron2.cc b/tests/Concrete_Expression/polyhedron2.cc
new file mode 100644
index 0000000..9b4a65f
--- /dev/null
+++ b/tests/Concrete_Expression/polyhedron2.cc
@@ -0,0 +1,247 @@
+/* Test Polyhedron::refine_fp_interval_abstract_store,
+   Polyhedron::refine_with_linear_form_inequality and
+   Polyhedron::generalized_refine_with_linear_form_inequality.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests incompatible dimensions.
+bool
+test01() {
+  C_Polyhedron pol(1);
+  FP_Interval_Abstract_Store store(1);
+  store.set_interval(Variable(0), FP_Interval(0));
+  try {
+    FP_Linear_Form l1(Variable(3));
+    FP_Linear_Form l2;
+    pol.refine_with_linear_form_inequality(l1, l2);
+  }
+  catch (std::invalid_argument) {
+    try {
+      FP_Linear_Form l1;
+      FP_Linear_Form l2(Variable(3));
+      pol.refine_with_linear_form_inequality(l1, l2);
+    }
+    catch (std::invalid_argument) {
+      nout << "incompatible dimensions." << endl;
+      return true;
+    }
+  }
+
+  return false;
+}
+
+// Tests A <= [57, 57].
+bool
+test02() {
+  C_Polyhedron ph(1);
+  FP_Interval_Abstract_Store store(1);
+  store.set_interval(Variable(0), FP_Interval(static_cast<FP_Interval::boundary_type>(1.5)));
+  FP_Interval interval(57);
+  FP_Linear_Form lf1(Variable(0));
+  FP_Linear_Form lf2(interval);
+  ph.refine_with_linear_form_inequality(lf1, lf2);
+  print_constraints(ph, "*** A <= [57, 57] ***");
+  C_Polyhedron known_result(1);
+  known_result.refine_with_constraint(Variable(0) <= 57);
+  print_constraints(known_result, "*** known_result ***");
+
+  return ph == known_result;
+}
+
+// Tests -A <= 0 && A <= 2 && -A <= 1 && -B <= -1 && C = 0.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  FP_Interval_Abstract_Store store(3);
+  FP_Interval tmp(0);
+  store.set_interval(A, tmp);
+  store.set_interval(B, tmp);
+  store.set_interval(C, tmp);
+
+  C_Polyhedron ph(3);
+  ph.refine_with_linear_form_inequality(-FP_Linear_Form(A),
+                                 FP_Linear_Form(FP_Interval(0)));
+  ph.refine_with_linear_form_inequality(FP_Linear_Form(A),
+                                 FP_Linear_Form(FP_Interval(2)));
+  ph.refine_with_linear_form_inequality(-FP_Linear_Form(A),
+                                 FP_Linear_Form(FP_Interval(1)));
+  ph.refine_with_linear_form_inequality(-FP_Linear_Form(B),
+                                 FP_Linear_Form(FP_Interval(-1)));
+  ph.generalized_refine_with_linear_form_inequality(
+    FP_Linear_Form(C), FP_Linear_Form(tmp), EQUAL);
+  ph.generalized_refine_with_linear_form_inequality(
+    FP_Linear_Form(C), FP_Linear_Form(tmp), NOT_EQUAL);
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C == 0);
+  print_constraints(known_result, "*** known_result ***");
+
+  return ph == known_result;
+}
+
+// Tests -A <= -1/3 && A <= 2/3 && -B <= 0 && B <= 1/3
+// and refine_fp_interval_abstract_store.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval tmp0(0);
+  tmp0.join_assign(10);
+  FP_Interval_Abstract_Store store(2);
+  store.set_interval(A, tmp0);
+  store.set_interval(B, tmp0);
+  FP_Linear_Form la(A);
+  FP_Linear_Form lb(B);
+
+  FP_Interval tmp(2);
+  tmp /= FP_Interval(3);
+
+  C_Polyhedron ph(2);
+  ph.generalized_refine_with_linear_form_inequality(
+    FP_Linear_Form(tmp), la, GREATER_THAN);
+  tmp = -1;
+  tmp /= FP_Interval(3);
+  ph.generalized_refine_with_linear_form_inequality(
+    FP_Linear_Form(tmp), -la, GREATER_OR_EQUAL);
+  tmp = 1;
+  tmp /= FP_Interval(3);
+  ph.generalized_refine_with_linear_form_inequality(
+    lb, FP_Linear_Form(tmp), LESS_OR_EQUAL);
+  tmp = 0;
+  ph.generalized_refine_with_linear_form_inequality(
+    -lb, FP_Linear_Form(tmp), LESS_THAN);
+
+  C_Polyhedron known_result1(2);
+  known_result1.add_constraint(3*A >= 1);
+  known_result1.add_constraint(3*A <= 2);
+  known_result1.add_constraint(B >= 0);
+  known_result1.add_constraint(3*B <= 1);
+  print_constraints(known_result1, "*** known_result1 ***");
+
+  Box<FP_Interval> box(ph);
+  print_constraints(ph, "*** ph ***");
+  print_constraints(box, "*** box ***");
+
+  bool ok1 = ph.contains(known_result1);
+
+  ph.refine_fp_interval_abstract_store(store);
+  nout << "*** FP_Interval_Abstract_Store ***" << endl;
+
+  nout << "tmp0 = " << tmp0 << endl;
+
+  nout << "A = " << store.get_interval(A) << endl;
+  bool ok2 = tmp0.contains(store.get_interval(A));
+
+  nout << "B = " << store.get_interval(B) << endl;
+  bool ok3 = tmp0.contains(store.get_interval(B));
+
+  return ok1 && ok2 && ok3;
+
+}
+
+// Tests (2/3)*B + [-0.5, 0.5] >= (1/3)*A
+// where A = B = [-1, 1].
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  FP_Interval tmp0(-1);
+  tmp0.join_assign(1);
+  FP_Interval_Abstract_Store store(2);
+  store.set_interval(A, tmp0);
+  store.set_interval(B, tmp0);
+  FP_Interval tmp(1);
+  tmp /= FP_Interval(3);
+  FP_Linear_Form la(A);
+  la *= tmp;
+  FP_Linear_Form lb(B);
+  tmp += tmp;
+  lb *= tmp;
+  tmp.lower() = static_cast<FP_Interval::boundary_type>(-0.5);
+  tmp.upper() = static_cast<FP_Interval::boundary_type>(0.5);
+  lb += tmp;
+
+  NNC_Polyhedron ph(2);
+  FP_Linear_Form l(tmp0);
+  ph.affine_form_image(A, l);
+  ph.affine_form_image(B, l);
+  ph.generalized_refine_with_linear_form_inequality(
+    lb, la, GREATER_OR_EQUAL);
+  print_constraints(ph, "*** ph ***");
+
+  NNC_Polyhedron known_result1(2);
+  known_result1.add_constraint(2*A <= 4*B + 3);
+  known_result1.add_constraint(A >= -1);
+  known_result1.add_constraint(A <= 1);
+  known_result1.add_constraint(B >= -1);
+  known_result1.add_constraint(B <= 1);
+  print_constraints(known_result1, "*** known_result1 ***");
+
+  bool ok1 = ph.contains(known_result1);
+
+  ph.refine_fp_interval_abstract_store(store);
+  nout << "*** FP_Interval_Abstract_Store ***" << endl;
+
+  nout << "A = " << store.get_interval(A) << endl;
+  bool ok2 = tmp0.contains(store.get_interval(A));
+
+  nout << "B = " << store.get_interval(B) << endl;
+  bool ok3 = tmp0.contains(store.get_interval(B));
+
+  return ok1 && ok2 && ok3;
+
+  return ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  if (sizeof(ANALYZER_FP_FORMAT) == 4) {
+    DO_TEST_F32(test04);
+#ifdef NDEBUG
+    DO_TEST_F16(test05);
+#else
+    DO_TEST_F64A(test05);
+#endif
+  }
+  else if (sizeof(ANALYZER_FP_FORMAT) == 8) {
+    DO_TEST_F64(test04);
+    DO_TEST_F64A(test05);
+  }
+  else {
+    DO_TEST_F64(test04);
+    DO_TEST_F64(test05);
+  }
+END_MAIN
diff --git a/tests/Concrete_Expression/run_tests b/tests/Concrete_Expression/run_tests
new file mode 100755
index 0000000..2f4ce05
--- /dev/null
+++ b/tests/Concrete_Expression/run_tests
@@ -0,0 +1,56 @@
+#!/bin/sh
+
+# Run the Floating_Point_Expression tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  analyzer_fp_format=${instance%/*}
+  analyzed_fp_format=${instance#*/}
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DANALYZER_FP_FORMAT=$analyzer_fp_format -DANALYZED_FP_FORMAT=$analyzed_fp_format" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/Grid/Makefile.am b/tests/Grid/Makefile.am
new file mode 100644
index 0000000..82cec2f
--- /dev/null
+++ b/tests/Grid/Makefile.am
@@ -0,0 +1,310 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 \
+addgenerator1 \
+addgenerators1 \
+addspacedims1 \
+affinedim1 \
+affineimage1 affineimage2 \
+affinepreimage1 affinepreimage2 \
+approximatepartition1 \
+asciidumpload1 asciidumpload2 asciidumpload3 asciidumpload4 asciidumpload5 \
+asciidumpload6 \
+bhz03widening1 \
+bounded1 \
+bounds1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+certificate1 \
+concatenate1 \
+congruence1 \
+congruences1 \
+congruences2 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+discrete1 \
+disjoint1 \
+dropnonintegerpoints1 \
+equals1 \
+expandspacedim1 \
+foldspacedims1 \
+frequency1 \
+frombdshape1 \
+frombox1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+generalizedaffineimage1 generalizedaffineimage2 generalizedaffineimage3 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+generator1 \
+generators1 generators2 \
+grid1 grid2 grid3 \
+griddifference1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+limitedextrapolation1 limitedextrapolation2 limitedextrapolation3 \
+mapspacedims1 \
+maxmin1 \
+membytes1 \
+mingenerators1 \
+mincongruences1 \
+outputoperator1 outputoperator2 outputoperator3 \
+partition1 \
+powersetdifference1 \
+powersetgeometricallycovers1 \
+powersetgeometricallyequals1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+simplifyusingcontext1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+upperbound1 upperbound2 \
+widening1 widening2  widening3 \
+wrap1 \
+writecongruencesystem
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+addcongruence1_SOURCES = addcongruence1.cc
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraint1_SOURCES = addconstraint1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+addgenerator1_SOURCES = addgenerator1.cc
+
+addgenerators1_SOURCES = addgenerators1.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedim1_SOURCES = affinedim1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+approximatepartition1_SOURCES = approximatepartition1.cc
+
+asciidumpload1_SOURCES = asciidumpload1.cc
+asciidumpload2_SOURCES = asciidumpload2.cc
+asciidumpload3_SOURCES = asciidumpload3.cc
+asciidumpload4_SOURCES = asciidumpload4.cc
+asciidumpload5_SOURCES = asciidumpload5.cc
+asciidumpload6_SOURCES = asciidumpload6.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+certificate1_SOURCES = certificate1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruence1_SOURCES = congruence1.cc
+
+congruences1_SOURCES = congruences1.cc
+congruences2_SOURCES = congruences2.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropnonintegerpoints1_SOURCES = dropnonintegerpoints1.cc
+
+equals1_SOURCES = equals1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+
+generator1_SOURCES = generator1.cc
+
+generators1_SOURCES = generators1.cc
+generators2_SOURCES = generators2.cc
+
+grid1_SOURCES = grid1.cc
+grid2_SOURCES = grid2.cc
+grid3_SOURCES = grid3.cc
+
+griddifference1_SOURCES = griddifference1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+isempty1_SOURCES = isempty1.cc
+
+isuniverse1_SOURCES = isuniverse1.cc
+
+limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+limitedextrapolation2_SOURCES = limitedextrapolation2.cc
+limitedextrapolation3_SOURCES = limitedextrapolation3.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+mincongruences1_SOURCES = mincongruences1.cc
+
+mingenerators1_SOURCES = mingenerators1.cc
+
+outputoperator1_SOURCES = outputoperator1.cc
+outputoperator2_SOURCES = outputoperator2.cc
+outputoperator3_SOURCES = outputoperator3.cc
+
+partition1_SOURCES = partition1.cc
+
+powersetdifference1_SOURCES = powersetdifference1.cc
+powersetgeometricallycovers1_SOURCES = powersetgeometricallycovers1.cc
+powersetgeometricallyequals1_SOURCES = powersetgeometricallyequals1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+upperbound2_SOURCES = upperbound2.cc
+
+widening1_SOURCES = widening1.cc
+widening2_SOURCES = widening2.cc
+widening3_SOURCES = widening3.cc
+
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+
+wrap1_SOURCES = wrap1.cc
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+ascii_dump_load4.dat \
+ascii_dump_load5.dat \
+ascii_dump_load6.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Grid/Makefile.in b/tests/Grid/Makefile.in
new file mode 100644
index 0000000..3e7a75c
--- /dev/null
+++ b/tests/Grid/Makefile.in
@@ -0,0 +1,3108 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+	addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \
+	addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+	approximatepartition1$(EXEEXT) asciidumpload1$(EXEEXT) \
+	asciidumpload2$(EXEEXT) asciidumpload3$(EXEEXT) \
+	asciidumpload4$(EXEEXT) asciidumpload5$(EXEEXT) \
+	asciidumpload6$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) bounds1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+	congruence1$(EXEEXT) congruences1$(EXEEXT) \
+	congruences2$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+	disjoint1$(EXEEXT) dropnonintegerpoints1$(EXEEXT) \
+	equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+	generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffineimage3$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) generator1$(EXEEXT) \
+	generators1$(EXEEXT) generators2$(EXEEXT) grid1$(EXEEXT) \
+	grid2$(EXEEXT) grid3$(EXEEXT) griddifference1$(EXEEXT) \
+	intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+	limitedextrapolation1$(EXEEXT) limitedextrapolation2$(EXEEXT) \
+	limitedextrapolation3$(EXEEXT) mapspacedims1$(EXEEXT) \
+	maxmin1$(EXEEXT) membytes1$(EXEEXT) mingenerators1$(EXEEXT) \
+	mincongruences1$(EXEEXT) outputoperator1$(EXEEXT) \
+	outputoperator2$(EXEEXT) outputoperator3$(EXEEXT) \
+	partition1$(EXEEXT) powersetdifference1$(EXEEXT) \
+	powersetgeometricallycovers1$(EXEEXT) \
+	powersetgeometricallyequals1$(EXEEXT) \
+	refinewithcongruences1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+	topclosed1$(EXEEXT) topclosure1$(EXEEXT) unconstrain1$(EXEEXT) \
+	upperbound1$(EXEEXT) upperbound2$(EXEEXT) widening1$(EXEEXT) \
+	widening2$(EXEEXT) widening3$(EXEEXT) wrap1$(EXEEXT) \
+	writecongruencesystem$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Grid
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+	addgenerator1$(EXEEXT) addgenerators1$(EXEEXT) \
+	addspacedims1$(EXEEXT) affinedim1$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+	approximatepartition1$(EXEEXT) asciidumpload1$(EXEEXT) \
+	asciidumpload2$(EXEEXT) asciidumpload3$(EXEEXT) \
+	asciidumpload4$(EXEEXT) asciidumpload5$(EXEEXT) \
+	asciidumpload6$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bounded1$(EXEEXT) bounds1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+	congruence1$(EXEEXT) congruences1$(EXEEXT) \
+	congruences2$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) discrete1$(EXEEXT) \
+	disjoint1$(EXEEXT) dropnonintegerpoints1$(EXEEXT) \
+	equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frequency1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+	generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffineimage3$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) generator1$(EXEEXT) \
+	generators1$(EXEEXT) generators2$(EXEEXT) grid1$(EXEEXT) \
+	grid2$(EXEEXT) grid3$(EXEEXT) griddifference1$(EXEEXT) \
+	intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+	limitedextrapolation1$(EXEEXT) limitedextrapolation2$(EXEEXT) \
+	limitedextrapolation3$(EXEEXT) mapspacedims1$(EXEEXT) \
+	maxmin1$(EXEEXT) membytes1$(EXEEXT) mingenerators1$(EXEEXT) \
+	mincongruences1$(EXEEXT) outputoperator1$(EXEEXT) \
+	outputoperator2$(EXEEXT) outputoperator3$(EXEEXT) \
+	partition1$(EXEEXT) powersetdifference1$(EXEEXT) \
+	powersetgeometricallycovers1$(EXEEXT) \
+	powersetgeometricallyequals1$(EXEEXT) \
+	refinewithcongruences1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) timeelapse1$(EXEEXT) \
+	topclosed1$(EXEEXT) topclosure1$(EXEEXT) unconstrain1$(EXEEXT) \
+	upperbound1$(EXEEXT) upperbound2$(EXEEXT) widening1$(EXEEXT) \
+	widening2$(EXEEXT) widening3$(EXEEXT) wrap1$(EXEEXT) \
+	writecongruencesystem$(EXEEXT)
+am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
+addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
+addcongruence1_LDADD = $(LDADD)
+addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT)
+addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS)
+addconstraint1_LDADD = $(LDADD)
+addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT)
+addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS)
+addgenerator1_LDADD = $(LDADD)
+addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT)
+addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS)
+addgenerators1_LDADD = $(LDADD)
+addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedim1_OBJECTS = affinedim1.$(OBJEXT)
+affinedim1_OBJECTS = $(am_affinedim1_OBJECTS)
+affinedim1_LDADD = $(LDADD)
+affinedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_approximatepartition1_OBJECTS = approximatepartition1.$(OBJEXT)
+approximatepartition1_OBJECTS = $(am_approximatepartition1_OBJECTS)
+approximatepartition1_LDADD = $(LDADD)
+approximatepartition1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload1_OBJECTS = asciidumpload1.$(OBJEXT)
+asciidumpload1_OBJECTS = $(am_asciidumpload1_OBJECTS)
+asciidumpload1_LDADD = $(LDADD)
+asciidumpload1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload2_OBJECTS = asciidumpload2.$(OBJEXT)
+asciidumpload2_OBJECTS = $(am_asciidumpload2_OBJECTS)
+asciidumpload2_LDADD = $(LDADD)
+asciidumpload2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload3_OBJECTS = asciidumpload3.$(OBJEXT)
+asciidumpload3_OBJECTS = $(am_asciidumpload3_OBJECTS)
+asciidumpload3_LDADD = $(LDADD)
+asciidumpload3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload4_OBJECTS = asciidumpload4.$(OBJEXT)
+asciidumpload4_OBJECTS = $(am_asciidumpload4_OBJECTS)
+asciidumpload4_LDADD = $(LDADD)
+asciidumpload4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload5_OBJECTS = asciidumpload5.$(OBJEXT)
+asciidumpload5_OBJECTS = $(am_asciidumpload5_OBJECTS)
+asciidumpload5_LDADD = $(LDADD)
+asciidumpload5_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload6_OBJECTS = asciidumpload6.$(OBJEXT)
+asciidumpload6_OBJECTS = $(am_asciidumpload6_OBJECTS)
+asciidumpload6_LDADD = $(LDADD)
+asciidumpload6_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_certificate1_OBJECTS = certificate1.$(OBJEXT)
+certificate1_OBJECTS = $(am_certificate1_OBJECTS)
+certificate1_LDADD = $(LDADD)
+certificate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruence1_OBJECTS = congruence1.$(OBJEXT)
+congruence1_OBJECTS = $(am_congruence1_OBJECTS)
+congruence1_LDADD = $(LDADD)
+congruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences2_OBJECTS = congruences2.$(OBJEXT)
+congruences2_OBJECTS = $(am_congruences2_OBJECTS)
+congruences2_LDADD = $(LDADD)
+congruences2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dropnonintegerpoints1_OBJECTS = dropnonintegerpoints1.$(OBJEXT)
+dropnonintegerpoints1_OBJECTS = $(am_dropnonintegerpoints1_OBJECTS)
+dropnonintegerpoints1_LDADD = $(LDADD)
+dropnonintegerpoints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage3_OBJECTS =  \
+	generalizedaffineimage3.$(OBJEXT)
+generalizedaffineimage3_OBJECTS =  \
+	$(am_generalizedaffineimage3_OBJECTS)
+generalizedaffineimage3_LDADD = $(LDADD)
+generalizedaffineimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS =  \
+	generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS =  \
+	$(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generator1_OBJECTS = generator1.$(OBJEXT)
+generator1_OBJECTS = $(am_generator1_OBJECTS)
+generator1_LDADD = $(LDADD)
+generator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generators1_OBJECTS = generators1.$(OBJEXT)
+generators1_OBJECTS = $(am_generators1_OBJECTS)
+generators1_LDADD = $(LDADD)
+generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generators2_OBJECTS = generators2.$(OBJEXT)
+generators2_OBJECTS = $(am_generators2_OBJECTS)
+generators2_LDADD = $(LDADD)
+generators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_grid1_OBJECTS = grid1.$(OBJEXT)
+grid1_OBJECTS = $(am_grid1_OBJECTS)
+grid1_LDADD = $(LDADD)
+grid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_grid2_OBJECTS = grid2.$(OBJEXT)
+grid2_OBJECTS = $(am_grid2_OBJECTS)
+grid2_LDADD = $(LDADD)
+grid2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_grid3_OBJECTS = grid3.$(OBJEXT)
+grid3_OBJECTS = $(am_grid3_OBJECTS)
+grid3_LDADD = $(LDADD)
+grid3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_griddifference1_OBJECTS = griddifference1.$(OBJEXT)
+griddifference1_OBJECTS = $(am_griddifference1_OBJECTS)
+griddifference1_LDADD = $(LDADD)
+griddifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_isempty1_OBJECTS = isempty1.$(OBJEXT)
+isempty1_OBJECTS = $(am_isempty1_OBJECTS)
+isempty1_LDADD = $(LDADD)
+isempty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_isuniverse1_OBJECTS = isuniverse1.$(OBJEXT)
+isuniverse1_OBJECTS = $(am_isuniverse1_OBJECTS)
+isuniverse1_LDADD = $(LDADD)
+isuniverse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedextrapolation1_OBJECTS = limitedextrapolation1.$(OBJEXT)
+limitedextrapolation1_OBJECTS = $(am_limitedextrapolation1_OBJECTS)
+limitedextrapolation1_LDADD = $(LDADD)
+limitedextrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedextrapolation2_OBJECTS = limitedextrapolation2.$(OBJEXT)
+limitedextrapolation2_OBJECTS = $(am_limitedextrapolation2_OBJECTS)
+limitedextrapolation2_LDADD = $(LDADD)
+limitedextrapolation2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedextrapolation3_OBJECTS = limitedextrapolation3.$(OBJEXT)
+limitedextrapolation3_OBJECTS = $(am_limitedextrapolation3_OBJECTS)
+limitedextrapolation3_LDADD = $(LDADD)
+limitedextrapolation3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mincongruences1_OBJECTS = mincongruences1.$(OBJEXT)
+mincongruences1_OBJECTS = $(am_mincongruences1_OBJECTS)
+mincongruences1_LDADD = $(LDADD)
+mincongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT)
+mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS)
+mingenerators1_LDADD = $(LDADD)
+mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_outputoperator1_OBJECTS = outputoperator1.$(OBJEXT)
+outputoperator1_OBJECTS = $(am_outputoperator1_OBJECTS)
+outputoperator1_LDADD = $(LDADD)
+outputoperator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_outputoperator2_OBJECTS = outputoperator2.$(OBJEXT)
+outputoperator2_OBJECTS = $(am_outputoperator2_OBJECTS)
+outputoperator2_LDADD = $(LDADD)
+outputoperator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_outputoperator3_OBJECTS = outputoperator3.$(OBJEXT)
+outputoperator3_OBJECTS = $(am_outputoperator3_OBJECTS)
+outputoperator3_LDADD = $(LDADD)
+outputoperator3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_partition1_OBJECTS = partition1.$(OBJEXT)
+partition1_OBJECTS = $(am_partition1_OBJECTS)
+partition1_LDADD = $(LDADD)
+partition1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powersetdifference1_OBJECTS = powersetdifference1.$(OBJEXT)
+powersetdifference1_OBJECTS = $(am_powersetdifference1_OBJECTS)
+powersetdifference1_LDADD = $(LDADD)
+powersetdifference1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powersetgeometricallycovers1_OBJECTS =  \
+	powersetgeometricallycovers1.$(OBJEXT)
+powersetgeometricallycovers1_OBJECTS =  \
+	$(am_powersetgeometricallycovers1_OBJECTS)
+powersetgeometricallycovers1_LDADD = $(LDADD)
+powersetgeometricallycovers1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powersetgeometricallyequals1_OBJECTS =  \
+	powersetgeometricallyequals1.$(OBJEXT)
+powersetgeometricallyequals1_OBJECTS =  \
+	$(am_powersetgeometricallyequals1_OBJECTS)
+powersetgeometricallyequals1_LDADD = $(LDADD)
+powersetgeometricallyequals1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims2_OBJECTS = removespacedims2.$(OBJEXT)
+removespacedims2_OBJECTS = $(am_removespacedims2_OBJECTS)
+removespacedims2_LDADD = $(LDADD)
+removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound2_OBJECTS = upperbound2.$(OBJEXT)
+upperbound2_OBJECTS = $(am_upperbound2_OBJECTS)
+upperbound2_LDADD = $(LDADD)
+upperbound2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_widening1_OBJECTS = widening1.$(OBJEXT)
+widening1_OBJECTS = $(am_widening1_OBJECTS)
+widening1_LDADD = $(LDADD)
+widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_widening2_OBJECTS = widening2.$(OBJEXT)
+widening2_OBJECTS = $(am_widening2_OBJECTS)
+widening2_LDADD = $(LDADD)
+widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_widening3_OBJECTS = widening3.$(OBJEXT)
+widening3_OBJECTS = $(am_widening3_OBJECTS)
+widening3_LDADD = $(LDADD)
+widening3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writecongruencesystem_OBJECTS = writecongruencesystem.$(OBJEXT)
+writecongruencesystem_OBJECTS = $(am_writecongruencesystem_OBJECTS)
+writecongruencesystem_LDADD = $(LDADD)
+writecongruencesystem_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
+	$(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(approximatepartition1_SOURCES) $(asciidumpload1_SOURCES) \
+	$(asciidumpload2_SOURCES) $(asciidumpload3_SOURCES) \
+	$(asciidumpload4_SOURCES) $(asciidumpload5_SOURCES) \
+	$(asciidumpload6_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(certificate1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruence1_SOURCES) $(congruences1_SOURCES) \
+	$(congruences2_SOURCES) $(constraints1_SOURCES) \
+	$(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) \
+	$(dropnonintegerpoints1_SOURCES) $(equals1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(generator1_SOURCES) \
+	$(generators1_SOURCES) $(generators2_SOURCES) $(grid1_SOURCES) \
+	$(grid2_SOURCES) $(grid3_SOURCES) $(griddifference1_SOURCES) \
+	$(intersection1_SOURCES) $(isempty1_SOURCES) \
+	$(isuniverse1_SOURCES) $(limitedextrapolation1_SOURCES) \
+	$(limitedextrapolation2_SOURCES) \
+	$(limitedextrapolation3_SOURCES) $(mapspacedims1_SOURCES) \
+	$(maxmin1_SOURCES) $(membytes1_SOURCES) \
+	$(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+	$(outputoperator1_SOURCES) $(outputoperator2_SOURCES) \
+	$(outputoperator3_SOURCES) $(partition1_SOURCES) \
+	$(powersetdifference1_SOURCES) \
+	$(powersetgeometricallycovers1_SOURCES) \
+	$(powersetgeometricallyequals1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+	$(unconstrain1_SOURCES) $(upperbound1_SOURCES) \
+	$(upperbound2_SOURCES) $(widening1_SOURCES) \
+	$(widening2_SOURCES) $(widening3_SOURCES) $(wrap1_SOURCES) \
+	$(writecongruencesystem_SOURCES)
+DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addgenerator1_SOURCES) $(addgenerators1_SOURCES) \
+	$(addspacedims1_SOURCES) $(affinedim1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(approximatepartition1_SOURCES) $(asciidumpload1_SOURCES) \
+	$(asciidumpload2_SOURCES) $(asciidumpload3_SOURCES) \
+	$(asciidumpload4_SOURCES) $(asciidumpload5_SOURCES) \
+	$(asciidumpload6_SOURCES) $(bhz03widening1_SOURCES) \
+	$(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(certificate1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruence1_SOURCES) $(congruences1_SOURCES) \
+	$(congruences2_SOURCES) $(constraints1_SOURCES) \
+	$(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) \
+	$(dropnonintegerpoints1_SOURCES) $(equals1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) $(generator1_SOURCES) \
+	$(generators1_SOURCES) $(generators2_SOURCES) $(grid1_SOURCES) \
+	$(grid2_SOURCES) $(grid3_SOURCES) $(griddifference1_SOURCES) \
+	$(intersection1_SOURCES) $(isempty1_SOURCES) \
+	$(isuniverse1_SOURCES) $(limitedextrapolation1_SOURCES) \
+	$(limitedextrapolation2_SOURCES) \
+	$(limitedextrapolation3_SOURCES) $(mapspacedims1_SOURCES) \
+	$(maxmin1_SOURCES) $(membytes1_SOURCES) \
+	$(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+	$(outputoperator1_SOURCES) $(outputoperator2_SOURCES) \
+	$(outputoperator3_SOURCES) $(partition1_SOURCES) \
+	$(powersetdifference1_SOURCES) \
+	$(powersetgeometricallycovers1_SOURCES) \
+	$(powersetgeometricallyequals1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+	$(unconstrain1_SOURCES) $(upperbound1_SOURCES) \
+	$(upperbound2_SOURCES) $(widening1_SOURCES) \
+	$(widening2_SOURCES) $(widening3_SOURCES) $(wrap1_SOURCES) \
+	$(writecongruencesystem_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+addcongruence1_SOURCES = addcongruence1.cc
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraint1_SOURCES = addconstraint1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerators1_SOURCES = addgenerators1.cc
+addspacedims1_SOURCES = addspacedims1.cc
+affinedim1_SOURCES = affinedim1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+approximatepartition1_SOURCES = approximatepartition1.cc
+asciidumpload1_SOURCES = asciidumpload1.cc
+asciidumpload2_SOURCES = asciidumpload2.cc
+asciidumpload3_SOURCES = asciidumpload3.cc
+asciidumpload4_SOURCES = asciidumpload4.cc
+asciidumpload5_SOURCES = asciidumpload5.cc
+asciidumpload6_SOURCES = asciidumpload6.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+certificate1_SOURCES = certificate1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruence1_SOURCES = congruence1.cc
+congruences1_SOURCES = congruences1.cc
+congruences2_SOURCES = congruences2.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropnonintegerpoints1_SOURCES = dropnonintegerpoints1.cc
+equals1_SOURCES = equals1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generator1_SOURCES = generator1.cc
+generators1_SOURCES = generators1.cc
+generators2_SOURCES = generators2.cc
+grid1_SOURCES = grid1.cc
+grid2_SOURCES = grid2.cc
+grid3_SOURCES = grid3.cc
+griddifference1_SOURCES = griddifference1.cc
+intersection1_SOURCES = intersection1.cc
+isempty1_SOURCES = isempty1.cc
+isuniverse1_SOURCES = isuniverse1.cc
+limitedextrapolation1_SOURCES = limitedextrapolation1.cc
+limitedextrapolation2_SOURCES = limitedextrapolation2.cc
+limitedextrapolation3_SOURCES = limitedextrapolation3.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxmin1_SOURCES = maxmin1.cc
+membytes1_SOURCES = membytes1.cc
+mincongruences1_SOURCES = mincongruences1.cc
+mingenerators1_SOURCES = mingenerators1.cc
+outputoperator1_SOURCES = outputoperator1.cc
+outputoperator2_SOURCES = outputoperator2.cc
+outputoperator3_SOURCES = outputoperator3.cc
+partition1_SOURCES = partition1.cc
+powersetdifference1_SOURCES = powersetdifference1.cc
+powersetgeometricallycovers1_SOURCES = powersetgeometricallycovers1.cc
+powersetgeometricallyequals1_SOURCES = powersetgeometricallyequals1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperbound2_SOURCES = upperbound2.cc
+widening1_SOURCES = widening1.cc
+widening2_SOURCES = widening2.cc
+widening3_SOURCES = widening3.cc
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+wrap1_SOURCES = wrap1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+ascii_dump_load4.dat \
+ascii_dump_load5.dat \
+ascii_dump_load6.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Grid/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Grid/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) $(EXTRA_addcongruence1_DEPENDENCIES) 
+	@rm -f addcongruence1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES) 
+	@rm -f addcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) $(EXTRA_addconstraint1_DEPENDENCIES) 
+	@rm -f addconstraint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) $(EXTRA_addgenerator1_DEPENDENCIES) 
+	@rm -f addgenerator1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) $(EXTRA_addgenerators1_DEPENDENCIES) 
+	@rm -f addgenerators1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedim1$(EXEEXT): $(affinedim1_OBJECTS) $(affinedim1_DEPENDENCIES) $(EXTRA_affinedim1_DEPENDENCIES) 
+	@rm -f affinedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) $(EXTRA_affinepreimage2_DEPENDENCIES) 
+	@rm -f affinepreimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+
+approximatepartition1$(EXEEXT): $(approximatepartition1_OBJECTS) $(approximatepartition1_DEPENDENCIES) $(EXTRA_approximatepartition1_DEPENDENCIES) 
+	@rm -f approximatepartition1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(approximatepartition1_OBJECTS) $(approximatepartition1_LDADD) $(LIBS)
+
+asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) $(EXTRA_asciidumpload1_DEPENDENCIES) 
+	@rm -f asciidumpload1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+
+asciidumpload2$(EXEEXT): $(asciidumpload2_OBJECTS) $(asciidumpload2_DEPENDENCIES) $(EXTRA_asciidumpload2_DEPENDENCIES) 
+	@rm -f asciidumpload2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload2_OBJECTS) $(asciidumpload2_LDADD) $(LIBS)
+
+asciidumpload3$(EXEEXT): $(asciidumpload3_OBJECTS) $(asciidumpload3_DEPENDENCIES) $(EXTRA_asciidumpload3_DEPENDENCIES) 
+	@rm -f asciidumpload3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload3_OBJECTS) $(asciidumpload3_LDADD) $(LIBS)
+
+asciidumpload4$(EXEEXT): $(asciidumpload4_OBJECTS) $(asciidumpload4_DEPENDENCIES) $(EXTRA_asciidumpload4_DEPENDENCIES) 
+	@rm -f asciidumpload4$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload4_OBJECTS) $(asciidumpload4_LDADD) $(LIBS)
+
+asciidumpload5$(EXEEXT): $(asciidumpload5_OBJECTS) $(asciidumpload5_DEPENDENCIES) $(EXTRA_asciidumpload5_DEPENDENCIES) 
+	@rm -f asciidumpload5$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload5_OBJECTS) $(asciidumpload5_LDADD) $(LIBS)
+
+asciidumpload6$(EXEEXT): $(asciidumpload6_OBJECTS) $(asciidumpload6_DEPENDENCIES) $(EXTRA_asciidumpload6_DEPENDENCIES) 
+	@rm -f asciidumpload6$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload6_OBJECTS) $(asciidumpload6_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+certificate1$(EXEEXT): $(certificate1_OBJECTS) $(certificate1_DEPENDENCIES) $(EXTRA_certificate1_DEPENDENCIES) 
+	@rm -f certificate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruence1$(EXEEXT): $(congruence1_OBJECTS) $(congruence1_DEPENDENCIES) $(EXTRA_congruence1_DEPENDENCIES) 
+	@rm -f congruence1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+congruences2$(EXEEXT): $(congruences2_OBJECTS) $(congruences2_DEPENDENCIES) $(EXTRA_congruences2_DEPENDENCIES) 
+	@rm -f congruences2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences2_OBJECTS) $(congruences2_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropnonintegerpoints1$(EXEEXT): $(dropnonintegerpoints1_OBJECTS) $(dropnonintegerpoints1_DEPENDENCIES) $(EXTRA_dropnonintegerpoints1_DEPENDENCIES) 
+	@rm -f dropnonintegerpoints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dropnonintegerpoints1_OBJECTS) $(dropnonintegerpoints1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES) 
+	@rm -f equals1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES) 
+	@rm -f frequency1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) $(EXTRA_generalizedaffineimage3_DEPENDENCIES) 
+	@rm -f generalizedaffineimage3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage3_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+
+generator1$(EXEEXT): $(generator1_OBJECTS) $(generator1_DEPENDENCIES) $(EXTRA_generator1_DEPENDENCIES) 
+	@rm -f generator1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS)
+
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) $(EXTRA_generators1_DEPENDENCIES) 
+	@rm -f generators1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+
+generators2$(EXEEXT): $(generators2_OBJECTS) $(generators2_DEPENDENCIES) $(EXTRA_generators2_DEPENDENCIES) 
+	@rm -f generators2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generators2_OBJECTS) $(generators2_LDADD) $(LIBS)
+
+grid1$(EXEEXT): $(grid1_OBJECTS) $(grid1_DEPENDENCIES) $(EXTRA_grid1_DEPENDENCIES) 
+	@rm -f grid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS)
+
+grid2$(EXEEXT): $(grid2_OBJECTS) $(grid2_DEPENDENCIES) $(EXTRA_grid2_DEPENDENCIES) 
+	@rm -f grid2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS)
+
+grid3$(EXEEXT): $(grid3_OBJECTS) $(grid3_DEPENDENCIES) $(EXTRA_grid3_DEPENDENCIES) 
+	@rm -f grid3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS)
+
+griddifference1$(EXEEXT): $(griddifference1_OBJECTS) $(griddifference1_DEPENDENCIES) $(EXTRA_griddifference1_DEPENDENCIES) 
+	@rm -f griddifference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) $(EXTRA_isempty1_DEPENDENCIES) 
+	@rm -f isempty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+
+isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) $(EXTRA_isuniverse1_DEPENDENCIES) 
+	@rm -f isuniverse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+
+limitedextrapolation1$(EXEEXT): $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_DEPENDENCIES) $(EXTRA_limitedextrapolation1_DEPENDENCIES) 
+	@rm -f limitedextrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS)
+
+limitedextrapolation2$(EXEEXT): $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_DEPENDENCIES) $(EXTRA_limitedextrapolation2_DEPENDENCIES) 
+	@rm -f limitedextrapolation2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedextrapolation2_OBJECTS) $(limitedextrapolation2_LDADD) $(LIBS)
+
+limitedextrapolation3$(EXEEXT): $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_DEPENDENCIES) $(EXTRA_limitedextrapolation3_DEPENDENCIES) 
+	@rm -f limitedextrapolation3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedextrapolation3_OBJECTS) $(limitedextrapolation3_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) $(EXTRA_maxmin1_DEPENDENCIES) 
+	@rm -f maxmin1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+mincongruences1$(EXEEXT): $(mincongruences1_OBJECTS) $(mincongruences1_DEPENDENCIES) $(EXTRA_mincongruences1_DEPENDENCIES) 
+	@rm -f mincongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS)
+
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) $(EXTRA_mingenerators1_DEPENDENCIES) 
+	@rm -f mingenerators1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+
+outputoperator1$(EXEEXT): $(outputoperator1_OBJECTS) $(outputoperator1_DEPENDENCIES) $(EXTRA_outputoperator1_DEPENDENCIES) 
+	@rm -f outputoperator1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS)
+
+outputoperator2$(EXEEXT): $(outputoperator2_OBJECTS) $(outputoperator2_DEPENDENCIES) $(EXTRA_outputoperator2_DEPENDENCIES) 
+	@rm -f outputoperator2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(outputoperator2_OBJECTS) $(outputoperator2_LDADD) $(LIBS)
+
+outputoperator3$(EXEEXT): $(outputoperator3_OBJECTS) $(outputoperator3_DEPENDENCIES) $(EXTRA_outputoperator3_DEPENDENCIES) 
+	@rm -f outputoperator3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(outputoperator3_OBJECTS) $(outputoperator3_LDADD) $(LIBS)
+
+partition1$(EXEEXT): $(partition1_OBJECTS) $(partition1_DEPENDENCIES) $(EXTRA_partition1_DEPENDENCIES) 
+	@rm -f partition1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(partition1_OBJECTS) $(partition1_LDADD) $(LIBS)
+
+powersetdifference1$(EXEEXT): $(powersetdifference1_OBJECTS) $(powersetdifference1_DEPENDENCIES) $(EXTRA_powersetdifference1_DEPENDENCIES) 
+	@rm -f powersetdifference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(powersetdifference1_OBJECTS) $(powersetdifference1_LDADD) $(LIBS)
+
+powersetgeometricallycovers1$(EXEEXT): $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_DEPENDENCIES) $(EXTRA_powersetgeometricallycovers1_DEPENDENCIES) 
+	@rm -f powersetgeometricallycovers1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(powersetgeometricallycovers1_OBJECTS) $(powersetgeometricallycovers1_LDADD) $(LIBS)
+
+powersetgeometricallyequals1$(EXEEXT): $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_DEPENDENCIES) $(EXTRA_powersetgeometricallyequals1_DEPENDENCIES) 
+	@rm -f powersetgeometricallyequals1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(powersetgeometricallyequals1_OBJECTS) $(powersetgeometricallyequals1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) $(EXTRA_removespacedims2_DEPENDENCIES) 
+	@rm -f removespacedims2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) $(EXTRA_topclosure1_DEPENDENCIES) 
+	@rm -f topclosure1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES) 
+	@rm -f upperbound1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperbound2$(EXEEXT): $(upperbound2_OBJECTS) $(upperbound2_DEPENDENCIES) $(EXTRA_upperbound2_DEPENDENCIES) 
+	@rm -f upperbound2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound2_OBJECTS) $(upperbound2_LDADD) $(LIBS)
+
+widening1$(EXEEXT): $(widening1_OBJECTS) $(widening1_DEPENDENCIES) $(EXTRA_widening1_DEPENDENCIES) 
+	@rm -f widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS)
+
+widening2$(EXEEXT): $(widening2_OBJECTS) $(widening2_DEPENDENCIES) $(EXTRA_widening2_DEPENDENCIES) 
+	@rm -f widening2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(widening2_OBJECTS) $(widening2_LDADD) $(LIBS)
+
+widening3$(EXEEXT): $(widening3_OBJECTS) $(widening3_DEPENDENCIES) $(EXTRA_widening3_DEPENDENCIES) 
+	@rm -f widening3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(widening3_OBJECTS) $(widening3_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES) 
+	@rm -f wrap1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writecongruencesystem$(EXEEXT): $(writecongruencesystem_OBJECTS) $(writecongruencesystem_DEPENDENCIES) $(EXTRA_writecongruencesystem_DEPENDENCIES) 
+	@rm -f writecongruencesystem$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writecongruencesystem_OBJECTS) $(writecongruencesystem_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/approximatepartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload6.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/certificate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropnonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/grid3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/griddifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isempty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isuniverse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedextrapolation3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mincongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/outputoperator3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/partition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetgeometricallycovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powersetgeometricallyequals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/widening3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writecongruencesystem.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+addcongruence1.log: addcongruence1$(EXEEXT)
+	@p='addcongruence1$(EXEEXT)'; \
+	b='addcongruence1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addcongruences1.log: addcongruences1$(EXEEXT)
+	@p='addcongruences1$(EXEEXT)'; \
+	b='addcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraint1.log: addconstraint1$(EXEEXT)
+	@p='addconstraint1$(EXEEXT)'; \
+	b='addconstraint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints1.log: addconstraints1$(EXEEXT)
+	@p='addconstraints1$(EXEEXT)'; \
+	b='addconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerator1.log: addgenerator1$(EXEEXT)
+	@p='addgenerator1$(EXEEXT)'; \
+	b='addgenerator1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerators1.log: addgenerators1$(EXEEXT)
+	@p='addgenerators1$(EXEEXT)'; \
+	b='addgenerators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addspacedims1.log: addspacedims1$(EXEEXT)
+	@p='addspacedims1$(EXEEXT)'; \
+	b='addspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinedim1.log: affinedim1$(EXEEXT)
+	@p='affinedim1$(EXEEXT)'; \
+	b='affinedim1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+	@p='affineimage1$(EXEEXT)'; \
+	b='affineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage2.log: affineimage2$(EXEEXT)
+	@p='affineimage2$(EXEEXT)'; \
+	b='affineimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage1.log: affinepreimage1$(EXEEXT)
+	@p='affinepreimage1$(EXEEXT)'; \
+	b='affinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage2.log: affinepreimage2$(EXEEXT)
+	@p='affinepreimage2$(EXEEXT)'; \
+	b='affinepreimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+approximatepartition1.log: approximatepartition1$(EXEEXT)
+	@p='approximatepartition1$(EXEEXT)'; \
+	b='approximatepartition1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload1.log: asciidumpload1$(EXEEXT)
+	@p='asciidumpload1$(EXEEXT)'; \
+	b='asciidumpload1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload2.log: asciidumpload2$(EXEEXT)
+	@p='asciidumpload2$(EXEEXT)'; \
+	b='asciidumpload2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload3.log: asciidumpload3$(EXEEXT)
+	@p='asciidumpload3$(EXEEXT)'; \
+	b='asciidumpload3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload4.log: asciidumpload4$(EXEEXT)
+	@p='asciidumpload4$(EXEEXT)'; \
+	b='asciidumpload4'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload5.log: asciidumpload5$(EXEEXT)
+	@p='asciidumpload5$(EXEEXT)'; \
+	b='asciidumpload5'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload6.log: asciidumpload6$(EXEEXT)
+	@p='asciidumpload6$(EXEEXT)'; \
+	b='asciidumpload6'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bhz03widening1.log: bhz03widening1$(EXEEXT)
+	@p='bhz03widening1$(EXEEXT)'; \
+	b='bhz03widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+	@p='bounded1$(EXEEXT)'; \
+	b='bounded1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+	@p='bounds1$(EXEEXT)'; \
+	b='bounds1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffineimage1.log: boundedaffineimage1$(EXEEXT)
+	@p='boundedaffineimage1$(EXEEXT)'; \
+	b='boundedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffinepreimage1.log: boundedaffinepreimage1$(EXEEXT)
+	@p='boundedaffinepreimage1$(EXEEXT)'; \
+	b='boundedaffinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+certificate1.log: certificate1$(EXEEXT)
+	@p='certificate1$(EXEEXT)'; \
+	b='certificate1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+	@p='concatenate1$(EXEEXT)'; \
+	b='concatenate1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+congruence1.log: congruence1$(EXEEXT)
+	@p='congruence1$(EXEEXT)'; \
+	b='congruence1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences1.log: congruences1$(EXEEXT)
+	@p='congruences1$(EXEEXT)'; \
+	b='congruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences2.log: congruences2$(EXEEXT)
+	@p='congruences2$(EXEEXT)'; \
+	b='congruences2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+constraints1.log: constraints1$(EXEEXT)
+	@p='constraints1$(EXEEXT)'; \
+	b='constraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+	@p='contains1$(EXEEXT)'; \
+	b='contains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+containsintegerpoint1.log: containsintegerpoint1$(EXEEXT)
+	@p='containsintegerpoint1$(EXEEXT)'; \
+	b='containsintegerpoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+discrete1.log: discrete1$(EXEEXT)
+	@p='discrete1$(EXEEXT)'; \
+	b='discrete1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+	@p='disjoint1$(EXEEXT)'; \
+	b='disjoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+dropnonintegerpoints1.log: dropnonintegerpoints1$(EXEEXT)
+	@p='dropnonintegerpoints1$(EXEEXT)'; \
+	b='dropnonintegerpoints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+	@p='equals1$(EXEEXT)'; \
+	b='equals1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+expandspacedim1.log: expandspacedim1$(EXEEXT)
+	@p='expandspacedim1$(EXEEXT)'; \
+	b='expandspacedim1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+foldspacedims1.log: foldspacedims1$(EXEEXT)
+	@p='foldspacedims1$(EXEEXT)'; \
+	b='foldspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frequency1.log: frequency1$(EXEEXT)
+	@p='frequency1$(EXEEXT)'; \
+	b='frequency1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+	@p='frombdshape1$(EXEEXT)'; \
+	b='frombdshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+	@p='frombox1$(EXEEXT)'; \
+	b='frombox1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+	@p='fromgrid1$(EXEEXT)'; \
+	b='fromgrid1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+	@p='fromoctagonalshape1$(EXEEXT)'; \
+	b='fromoctagonalshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frompolyhedron1.log: frompolyhedron1$(EXEEXT)
+	@p='frompolyhedron1$(EXEEXT)'; \
+	b='frompolyhedron1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage1.log: generalizedaffineimage1$(EXEEXT)
+	@p='generalizedaffineimage1$(EXEEXT)'; \
+	b='generalizedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage2.log: generalizedaffineimage2$(EXEEXT)
+	@p='generalizedaffineimage2$(EXEEXT)'; \
+	b='generalizedaffineimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage3.log: generalizedaffineimage3$(EXEEXT)
+	@p='generalizedaffineimage3$(EXEEXT)'; \
+	b='generalizedaffineimage3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage1.log: generalizedaffinepreimage1$(EXEEXT)
+	@p='generalizedaffinepreimage1$(EXEEXT)'; \
+	b='generalizedaffinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage2.log: generalizedaffinepreimage2$(EXEEXT)
+	@p='generalizedaffinepreimage2$(EXEEXT)'; \
+	b='generalizedaffinepreimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage3.log: generalizedaffinepreimage3$(EXEEXT)
+	@p='generalizedaffinepreimage3$(EXEEXT)'; \
+	b='generalizedaffinepreimage3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generator1.log: generator1$(EXEEXT)
+	@p='generator1$(EXEEXT)'; \
+	b='generator1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generators1.log: generators1$(EXEEXT)
+	@p='generators1$(EXEEXT)'; \
+	b='generators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generators2.log: generators2$(EXEEXT)
+	@p='generators2$(EXEEXT)'; \
+	b='generators2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+grid1.log: grid1$(EXEEXT)
+	@p='grid1$(EXEEXT)'; \
+	b='grid1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+grid2.log: grid2$(EXEEXT)
+	@p='grid2$(EXEEXT)'; \
+	b='grid2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+grid3.log: grid3$(EXEEXT)
+	@p='grid3$(EXEEXT)'; \
+	b='grid3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+griddifference1.log: griddifference1$(EXEEXT)
+	@p='griddifference1$(EXEEXT)'; \
+	b='griddifference1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+	@p='intersection1$(EXEEXT)'; \
+	b='intersection1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+isempty1.log: isempty1$(EXEEXT)
+	@p='isempty1$(EXEEXT)'; \
+	b='isempty1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+isuniverse1.log: isuniverse1$(EXEEXT)
+	@p='isuniverse1$(EXEEXT)'; \
+	b='isuniverse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedextrapolation1.log: limitedextrapolation1$(EXEEXT)
+	@p='limitedextrapolation1$(EXEEXT)'; \
+	b='limitedextrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedextrapolation2.log: limitedextrapolation2$(EXEEXT)
+	@p='limitedextrapolation2$(EXEEXT)'; \
+	b='limitedextrapolation2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedextrapolation3.log: limitedextrapolation3$(EXEEXT)
+	@p='limitedextrapolation3$(EXEEXT)'; \
+	b='limitedextrapolation3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mapspacedims1.log: mapspacedims1$(EXEEXT)
+	@p='mapspacedims1$(EXEEXT)'; \
+	b='mapspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+maxmin1.log: maxmin1$(EXEEXT)
+	@p='maxmin1$(EXEEXT)'; \
+	b='maxmin1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+membytes1.log: membytes1$(EXEEXT)
+	@p='membytes1$(EXEEXT)'; \
+	b='membytes1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mingenerators1.log: mingenerators1$(EXEEXT)
+	@p='mingenerators1$(EXEEXT)'; \
+	b='mingenerators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mincongruences1.log: mincongruences1$(EXEEXT)
+	@p='mincongruences1$(EXEEXT)'; \
+	b='mincongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+outputoperator1.log: outputoperator1$(EXEEXT)
+	@p='outputoperator1$(EXEEXT)'; \
+	b='outputoperator1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+outputoperator2.log: outputoperator2$(EXEEXT)
+	@p='outputoperator2$(EXEEXT)'; \
+	b='outputoperator2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+outputoperator3.log: outputoperator3$(EXEEXT)
+	@p='outputoperator3$(EXEEXT)'; \
+	b='outputoperator3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+partition1.log: partition1$(EXEEXT)
+	@p='partition1$(EXEEXT)'; \
+	b='partition1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+powersetdifference1.log: powersetdifference1$(EXEEXT)
+	@p='powersetdifference1$(EXEEXT)'; \
+	b='powersetdifference1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+powersetgeometricallycovers1.log: powersetgeometricallycovers1$(EXEEXT)
+	@p='powersetgeometricallycovers1$(EXEEXT)'; \
+	b='powersetgeometricallycovers1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+powersetgeometricallyequals1.log: powersetgeometricallyequals1$(EXEEXT)
+	@p='powersetgeometricallyequals1$(EXEEXT)'; \
+	b='powersetgeometricallyequals1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruences1.log: refinewithcongruences1$(EXEEXT)
+	@p='refinewithcongruences1$(EXEEXT)'; \
+	b='refinewithcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraints1.log: refinewithconstraints1$(EXEEXT)
+	@p='refinewithconstraints1$(EXEEXT)'; \
+	b='refinewithconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations1.log: relations1$(EXEEXT)
+	@p='relations1$(EXEEXT)'; \
+	b='relations1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations2.log: relations2$(EXEEXT)
+	@p='relations2$(EXEEXT)'; \
+	b='relations2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations3.log: relations3$(EXEEXT)
+	@p='relations3$(EXEEXT)'; \
+	b='relations3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims1.log: removespacedims1$(EXEEXT)
+	@p='removespacedims1$(EXEEXT)'; \
+	b='removespacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims2.log: removespacedims2$(EXEEXT)
+	@p='removespacedims2$(EXEEXT)'; \
+	b='removespacedims2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simplifyusingcontext1.log: simplifyusingcontext1$(EXEEXT)
+	@p='simplifyusingcontext1$(EXEEXT)'; \
+	b='simplifyusingcontext1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse1.log: timeelapse1$(EXEEXT)
+	@p='timeelapse1$(EXEEXT)'; \
+	b='timeelapse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosed1.log: topclosed1$(EXEEXT)
+	@p='topclosed1$(EXEEXT)'; \
+	b='topclosed1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosure1.log: topclosure1$(EXEEXT)
+	@p='topclosure1$(EXEEXT)'; \
+	b='topclosure1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+unconstrain1.log: unconstrain1$(EXEEXT)
+	@p='unconstrain1$(EXEEXT)'; \
+	b='unconstrain1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound1.log: upperbound1$(EXEEXT)
+	@p='upperbound1$(EXEEXT)'; \
+	b='upperbound1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound2.log: upperbound2$(EXEEXT)
+	@p='upperbound2$(EXEEXT)'; \
+	b='upperbound2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+widening1.log: widening1$(EXEEXT)
+	@p='widening1$(EXEEXT)'; \
+	b='widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+widening2.log: widening2$(EXEEXT)
+	@p='widening2$(EXEEXT)'; \
+	b='widening2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+widening3.log: widening3$(EXEEXT)
+	@p='widening3$(EXEEXT)'; \
+	b='widening3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+wrap1.log: wrap1$(EXEEXT)
+	@p='wrap1$(EXEEXT)'; \
+	b='wrap1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writecongruencesystem.log: writecongruencesystem$(EXEEXT)
+	@p='writecongruencesystem$(EXEEXT)'; \
+	b='writecongruencesystem'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Grid/addcongruence1.cc b/tests/Grid/addcongruence1.cc
new file mode 100644
index 0000000..0afc774
--- /dev/null
+++ b/tests/Grid/addcongruence1.cc
@@ -0,0 +1,129 @@
+/* Test methods which add a single congruence to a grid.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// Many cases are covered in addgenerator1, in which the known grid is
+// always created with Grid::add_congruence.
+
+namespace {
+
+// Add to the universe grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((A + B %= 0) / 6);
+
+  print_congruences(gr, "*** gr.add_congruence((A + B %= 0) / 6) ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 6);
+
+  bool ok = (gr == known_gr) ;
+
+  print_congruences(gr,
+                    "*** gr.add_congruence((A + B %= 0) / 3) ***");
+
+  return ok;
+}
+
+// Add to an empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((A + B + C %= 0) / 3);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence((A + B + C %= 0) / 3) ***");
+
+  return ok;
+}
+
+// Add a congruence with less dimensions than the grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 7);
+  gr.add_congruence((A %= 0) / 7);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(7*A));
+  known_gr.add_grid_generator(parameter(7*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "***  gr.add_congruence((A %= 0) / 7) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+static bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.add_congruence(A + C %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/addcongruences1.cc b/tests/Grid/addcongruences1.cc
new file mode 100644
index 0000000..40365af
--- /dev/null
+++ b/tests/Grid/addcongruences1.cc
@@ -0,0 +1,332 @@
+/* Test methods which can add multiple congruences to a grid.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// add_congruences
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B == 0) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B == 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences(cgs) -- space dimension exception
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_congruences(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_recycled_congruences, empty grid.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences, add system of single trivial
+// congruence to zero dim grid.
+bool
+test05() {
+
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_integrality());
+
+  gr.add_recycled_congruences(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_congruences(cgs) -- space dimension exception
+bool
+test06() {
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert(B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_congruences(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_recycled_congruences, add to empty grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Congruence_System cgs;
+  cgs.insert(A + B == 0);
+
+  gr.add_recycled_congruences(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences, add empty system to grid
+// with minimized generators and up to date congruences.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr(2);
+
+  // Ensure both systems are up to date with only generators minimal.
+  gr.affine_image(A, 1*A);
+  gr.minimized_grid_generators();
+
+  print_congruences(gr, "*** gr ***");
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences, add empty system to grid
+// with up to date congruences and generators.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(2);
+
+  // Ensure both systems are just up to date.
+  gr.affine_image(A, 1*A);
+
+  print_congruences(gr, "*** gr ***");
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences, add congruence in 1D to
+// universe grid in 2D.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 7);
+
+  gr1.add_recycled_congruences(cgs);
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 7);
+  print_generators(gr2, "*** gr2 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruences, add empty system to grid
+// with minimized congruences and up to date generators.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(3*A));
+
+  // Ensure both systems are up to date with only congruences minimal.
+  gr.affine_image(A, 1*A);
+  gr.minimized_congruences();
+
+  print_congruences(gr, "*** gr ***");
+
+  Congruence_System cgs;
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/addconstraint1.cc b/tests/Grid/addconstraint1.cc
new file mode 100644
index 0000000..8fa2cb4
--- /dev/null
+++ b/tests/Grid/addconstraint1.cc
@@ -0,0 +1,241 @@
+/* Test adding single constraints to grids.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_constraint
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(A == 3);
+  print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 3) / 0);
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+  return ok;
+}
+
+// Add an NNC constraint with add_constraint.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B + 0*C == 0);
+
+  NNC_Polyhedron ph(cs);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(*ph.constraints().begin());
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B %= 0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_constraint(*ph.constraints().begin()) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(2*A == C);
+  print_congruences(gr, "*** gr.add_constraint(2*A == C) ***");
+  gr.add_constraint(D == 0);
+  print_congruences(gr, "*** gr.add_constraint(D == 0) ***");
+  gr.refine_with_constraint(B > 2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence((2*A %= C) / 0);
+  known_gr.add_congruence((D %= 0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraint(B > 2) ***");
+
+  return ok;
+}
+
+// add_congruence(c), adding equality
+bool
+test04() {
+  Variable D(3);
+
+  Grid gr(4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((D %= 4) / 0);
+
+  Grid known_gr(4);
+
+  known_gr.add_congruence((D %= 4) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence(D == 4) ***");
+
+  return ok;
+}
+
+// add_constraint - an inequality constraint.
+bool
+test05() {
+  Variable B(1);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraint(B >= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+
+// add_constraint - inconsistent equality
+// (so that no exception should be thrown).
+bool
+test06() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(0*A >= 3);
+  print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+
+  Grid known_gr(2, EMPTY);
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+  return ok;
+}
+
+// add_constraint - inconsistent equality
+// (so that no exception should be thrown).
+bool
+test07() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(Linear_Expression(1) <= 0);
+  print_congruences(gr, "*** gr.add_constraint(A == 3) ***");
+
+  Grid known_gr(2, EMPTY);
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraint(B >= 0) ***");
+
+  return ok;
+}
+
+// add_constraint -- space dimension exception
+bool
+test08() {
+  Variable B(1);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraint(B == 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_constraints(1 == 0) to an empty 0-dimensional grid
+bool
+test09() {
+
+  Grid gr(0, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraint(Linear_Expression(1) == 0);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/addconstraints1.cc b/tests/Grid/addconstraints1.cc
new file mode 100644
index 0000000..784634d
--- /dev/null
+++ b/tests/Grid/addconstraints1.cc
@@ -0,0 +1,347 @@
+/* Test adding constraints to a grid.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_constraints(1 == 0) to an empty 0-dimensional grid
+bool
+test01() {
+
+  Grid gr(0, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(1) == 0);
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_constraints
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B == 0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_constraints, resulting grid empty.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_constraints with inconsistency
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cs) ***");
+
+  return ok;
+}
+
+// add_constraints with inconsistency
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(1) >= 3);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_constraints(cs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cs) ***");
+
+  return ok;
+}
+
+// refine_with_constraints
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B >= 3);
+  cs.insert(0*B >= 7);
+
+  Grid gr(3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraints(cs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_recycled_constraints
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(2*C == 6*D);
+
+  Grid gr(4);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_constraints(cs);
+
+  Grid known_gr(4);
+  known_gr.add_congruence((C == 3*D) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_constraints(cs) ***");
+
+  return ok;
+}
+
+
+// add_recycled_constraints(cs) -- space dimension exception
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_constraints(cs) -- space dimension exception
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_recycled_constraints(cs) -- space dimension exception
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Construct a congruence system from a constraint system
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(2*C + A == 3);
+
+  Congruence_System cgs(cs);
+
+  Grid gr(3);
+  Grid gr1(3);
+
+  gr.add_constraints(cs);
+  gr1.add_congruences(cgs);
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+  print_congruences(gr1, "*** gr1.add_congruences(cgs) ***");
+  bool ok = (gr1 == gr);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B == 0) / 0);
+                          known_gr.add_congruence((2*C + A == 3) / 0);
+
+  ok &= (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_constraints(cs) ***");
+
+  return ok;
+}
+
+// add_constraints(cs) -- non-equality constraint in constraint system.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B == 0);
+  cs.insert(A + B >= 0);
+
+  Grid gr(1);
+
+  try {
+    gr.add_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/addgenerator1.cc b/tests/Grid/addgenerator1.cc
new file mode 100644
index 0000000..529ddfb
--- /dev/null
+++ b/tests/Grid/addgenerator1.cc
@@ -0,0 +1,330 @@
+/* Test Grid::add_grid_generator().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// grid1.cc also tests add_grid_generator.
+
+// One dimension.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point(-A));
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A == -1) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point(-A)) ***");
+
+  return ok;
+}
+
+// Two dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+  gr.add_grid_generator(grid_point(A + B));
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A == 1) / 0);
+  known_gr.add_congruence((B == 1) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point(A + B)) ***");
+
+  return ok;
+}
+
+// Add many generators to grid of two dimensions.
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A + 2*B));
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_line(A));
+
+  Grid known_gr(2);
+  known_gr.add_congruence(B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(...) ***");
+
+  return ok;
+}
+
+// Add generators where one has a divisor.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(7*A, 4));
+  gs.insert(grid_line(A - B));
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    gr.add_grid_generator(*i);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((4*A + 4*B == 7) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(*i) ***");
+
+  return ok;
+}
+
+// Add generators to a grid of a higher space dimension.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point(7*A, 3));
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point(7*A, 3)) ***");
+  gr.add_grid_generator(grid_line(A - B));
+
+  Grid known_gr(4);
+
+  known_gr.add_congruence((3*A + 3*B == 7) / 0);
+  known_gr.add_congruence((C == 0) / 0);
+  known_gr.add_congruence((D == 0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(grid_line(A - B)) ***");
+
+  return ok;
+}
+
+// Add a generator to a universe grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point(12*A + 7*D));
+
+  Grid known_gr(4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_grid_generator(grid_point(12*A + 7*D)) ***");
+
+  return ok;
+}
+
+// adding a generator with a divisor to a grid of many generators.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+
+  print_congruences(gr, "*** gr ***");
+
+  // Minimize the grid.
+
+  gr.add_grid_generator(grid_point(B, 3));
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(3*B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_grid_generator(grid_point(B, 3)) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.add_grid_generator(grid_point(A + C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Zero dimensions empty.
+bool
+test09() {
+  Grid gr(0, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point());
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point()) ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test10() {
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point());
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(grid_point()) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_grid_generator(grid_line(A));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Try add parameter to empty grid.
+bool
+test12() {
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_grid_generator(parameter());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Try add parameter to zero dimension empty grid.
+bool
+test13() {
+  Grid gr(0, EMPTY);
+
+  try {
+    gr.add_grid_generator(parameter());
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/addgenerators1.cc b/tests/Grid/addgenerators1.cc
new file mode 100644
index 0000000..e47a33f
--- /dev/null
+++ b/tests/Grid/addgenerators1.cc
@@ -0,0 +1,223 @@
+/* Test method which can add multiple generators to a grid.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// grid1.cc also tests add_grid_generators.
+
+// add_recycled_grid_generators -- space dimension exception.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B));
+
+  Grid gr(1);
+
+  try {
+    gr.add_recycled_grid_generators(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_recycled_grid_generators -- zero dimension universe.
+bool
+test02() {
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+
+  Grid gr(0);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_recycled_grid_generators(gs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_grid_generators -- zero dimension empty.
+bool
+test03() {
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+
+  Grid gr(0, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_recycled_grid_generators(gs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_grid_generators -- add system with a single parameter
+// generator to the empty grid.
+bool
+test04() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(A));
+
+  Grid gr(2, EMPTY);
+
+  try {
+    gr.add_recycled_grid_generators(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// add_recycled_grid_generators -- add an empty system.
+bool
+test05() {
+  Grid_Generator_System gs;
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.add_recycled_grid_generators(gs);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+                   "*** gr.add_recycled_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// add_grid_generators -- add a zero dimension universe system.
+bool
+test06() {
+  Grid gr(0);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.add_grid_generators(Grid_Generator_System::zero_dim_univ());
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+                   "*** gr.add_grid_generators(Grid_Generator_System::zero_dim_univ()) ***");
+
+  return ok;
+}
+
+// add_grid_generators -- add to a grid where the generator system of the
+// grid starts with a parameter (test point finding loop in
+// Grid::normalize_divisors(gs, gs)).
+bool
+test07() {
+  Variable A(0);
+
+  Grid_Generator_System gs1;
+  gs1.insert(parameter(2*A));
+  gs1.insert(grid_point());
+
+  Grid gr(gs1);
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point());
+  gs2.insert(parameter(A));
+
+  gr.add_grid_generators(gs2);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(A));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// add_recycled_grid_generators -- add to a zero
+// dimension universe grid.
+bool
+test08() {
+  Grid gr(0);
+
+  Grid_Generator_System gs2(grid_point());
+
+  gr.add_recycled_grid_generators(gs2);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_grid_generators(gs2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/addspacedims1.cc b/tests/Grid/addspacedims1.cc
new file mode 100644
index 0000000..d13203e
--- /dev/null
+++ b/tests/Grid/addspacedims1.cc
@@ -0,0 +1,532 @@
+/* Test Grid::add_space_dimensions_and_embed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// From congruences, adding to both congruences and generators.
+bool
+test01() {
+  Variable A(0);
+  Variable C(2);
+  Variable E(4);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*E %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// An empty grid.
+bool
+test02() {
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(3);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(3) ***");
+
+  return ok;
+}
+
+// A universe grid.
+bool
+test03() {
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(4);
+
+  Grid known_gr(5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(4) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + C));
+
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((C + 0*E %= 0) / 1);
+  known_cgs.insert((B == 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// From congruences, where dimensions are only added to the grid's
+// congruence system.
+bool
+test05() {
+  Variable A(0);
+  Variable C(2);
+  Variable E(4);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  // Add space dimensions directly after creating the grid, to ensure
+  // that only the congruences are up to date.
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*E %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test06() {
+  Grid gr(10);
+
+  try {
+    gr.add_space_dimensions_and_embed(Grid::max_space_dimension());
+  }
+  catch (const std::length_error& e) {
+    nout << "max_space_dimension_exceeded: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Zero dimension universe grid.
+bool
+test07() {
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(13);
+
+  Grid known_gr(13);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(13) ***");
+
+  return ok;
+}
+
+// Add to a grid which has minimized congruences.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  gr.minimized_congruences();
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// Add to a grid which has out of date congruences and minimized
+// generators.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(A));
+
+  gr.minimized_grid_generators();
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_embed(2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence(B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_embed(2) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((E %= 0) / 0);
+  known_cgs.insert((D %= 0) / 0);
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test11() {
+  Grid gr(2, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(3);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+// Universe grid, compared to congruences.
+bool
+test12() {
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(4);
+
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((B %= 0) / 0);
+  known_cgs.insert((C %= 0) / 0);
+  known_cgs.insert((D %= 0) / 0);
+  known_cgs.insert((E %= 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(4) ***");
+
+  return ok;
+}
+
+// Universe grid, compared to generators.
+bool
+test13() {
+  Grid gr(1);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(3);
+
+  Variable A(0);
+  Variable D(3);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_line(A + 0*D));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + B + C));
+
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A == 1);
+  known_cgs.insert(B - C == 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert(D == 0);
+  known_cgs.insert(E == 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// From generators, where dimensions are only added to the grid's
+// generator system.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + B + C));
+
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  // Add space dimensions directly after creating the grid, to ensure
+  // that only the generators are up to date.
+
+  gr.add_space_dimensions_and_project(2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((B - C %= 0) / 0);
+  known_cgs.insert((B %= 0) / 1);
+  known_cgs.insert((D %= 0) / 0);
+  known_cgs.insert((E %= 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test16() {
+  Grid gr(10);
+
+  try {
+    gr.add_space_dimensions_and_project(Grid::max_space_dimension());
+  }
+  catch (const std::length_error& e) {
+    nout << "max_space_dimension_exceeded: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+  Grid gr(0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(13);
+
+  Grid known_gr(13);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(13) ***");
+
+  return ok;
+}
+
+// Add to a grid which has minimized congruences.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  gr.minimized_congruences();
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Grid known_gr(4, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+// Add to a grid which has out of date congruences and minimized
+// generators.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A));
+
+  gr.minimized_grid_generators();
+
+  print_generators(gr, "*** gr ***");
+
+  gr.add_space_dimensions_and_project(2);
+
+  Grid known_gr(4);
+  known_gr.add_constraint(B == 0);
+  known_gr.add_constraint(C == 0);
+  known_gr.add_constraint(D == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/affinedim1.cc b/tests/Grid/affinedim1.cc
new file mode 100644
index 0000000..c9564be
--- /dev/null
+++ b/tests/Grid/affinedim1.cc
@@ -0,0 +1,322 @@
+/* Test Grid::affine_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.affine_dimension() == 0);
+
+  print_congruences(gr, "*** gr**");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.affine_dimension() == 0);
+
+  print_congruences(gr, "*** gr**");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.affine_dimension() == 0);
+
+  print_congruences(gr, "*** gr**");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 0
+    && gr_gs_needs_min.affine_dimension() == 0
+    && gr_cgs_needs_min.affine_dimension() == 0;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 1
+    && gr_gs_needs_min.affine_dimension() == 1
+    && gr_cgs_needs_min.affine_dimension() == 1;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_congruence((C == 0) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 1
+    && gr_gs_needs_min.affine_dimension() == 1
+    && gr_cgs_needs_min.affine_dimension() == 1;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 2
+    && gr_gs_needs_min.affine_dimension() == 2
+    && gr_cgs_needs_min.affine_dimension() == 2;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 2
+    && gr_gs_needs_min.affine_dimension() == 2
+    && gr_cgs_needs_min.affine_dimension() == 2;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 3
+    && gr_gs_needs_min.affine_dimension() == 3
+    && gr_cgs_needs_min.affine_dimension() == 3;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_congruence((A == 0) / 0);
+  gr_cgs_needs_min.add_congruence((D == 0) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.affine_dimension() == 2
+    && gr_gs_needs_min.affine_dimension() == 2
+    && gr_cgs_needs_min.affine_dimension() == 2;
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/affineimage1.cc b/tests/Grid/affineimage1.cc
new file mode 100644
index 0000000..8d0055e
--- /dev/null
+++ b/tests/Grid/affineimage1.cc
@@ -0,0 +1,390 @@
+/* Test Grid::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Variable to be updated does not occur in expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(B, A + 2, 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*B - 2*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(B, A + 2, 1) ***");
+
+  return ok;
+}
+
+// Variable to be updated occurs in expression.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A - B %= 0) / 0);
+  gr.add_congruence((A %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + B + 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(7*A + 3*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_image(A, A + B + 1) ***");
+
+  return ok;
+}
+
+// Denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 3) / 0);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 2);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*A + 2*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+// Invertible transformation with denominator, modulus and up-to-date
+// congruences.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 3) / 5);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(3*A + 2*B));
+  gr.add_grid_generator(grid_point(8*A + 2*B));
+  gr.add_grid_generator(grid_line(C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus
+// Congruences are up-to-date and minimized.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr = Grid(3);
+  gr.add_congruence((A %= 3) / 5);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are out-of-date.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(4*A));
+  known_gr.add_grid_generator(grid_point(7*A));
+  known_gr.add_grid_generator(grid_point(6*A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are up-to-date.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(4*A));
+  known_gr.add_grid_generator(grid_point(7*A));
+  known_gr.add_grid_generator(grid_point(6*A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are out-of-date.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, 2*A);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, 2*A) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are up-to-date.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr = Grid(1);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, 2*A);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, 2*A) ***");
+
+  return ok;
+}
+
+// The first example described at anchor grid_affine_transformation in
+// definitions.dox.
+// Congruences are out-of-date.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(3*B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, 3*A + 2*B + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(7*A + 3*B));
+  known_gr.add_grid_generator(grid_point(10*A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, 3*A + 2*B + 1) ***");
+
+  return ok;
+}
+
+// This example considers the case when the congruences are out-of-date.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(3*B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A + 3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_image(A, B) ***");
+
+  return ok;
+}
+
+// This example is as described at anchor grid_affine_transformation
+// in definitions.dox.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((A %= 0) / 3);
+  gr.add_congruence((B %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A + 3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/affineimage2.cc b/tests/Grid/affineimage2.cc
new file mode 100644
index 0000000..273b740
--- /dev/null
+++ b/tests/Grid/affineimage2.cc
@@ -0,0 +1,398 @@
+/* Test Grid::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Denominator, with generators having a variety of divisors.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A, 3));
+  gs.insert(grid_point(B, 2));
+
+  // The divisors are normalized on construction.
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  // All divisors should change, even when the coefficient of A is 0.
+  gr.affine_image(A, 2*A, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(2*A, 15));
+  known_gr.add_grid_generator(grid_point(5*B, 10));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_image(A, 2*A, 5) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_image(A, B + 2, -3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-2*A, 3));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_image(A, B + 2, -3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, 2*A + B + 1);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, 2*A + B + 1) ***");
+
+  return ok;
+}
+
+// Shift a rectilinear pointed grid along A.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + 3);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 3) / 4);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, A + 3) ***");
+
+  return ok;
+}
+
+// Slant a rectilinear pointed grid along A == B.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_image(A, A + B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 4);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, A + B) ***");
+
+  return ok;
+}
+
+// Compress a rectilinear pointed grid to a line of points.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.affine_image(A, B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B == 0) / 0);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_image(A, B) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_image(B, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_image(B, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_image(D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(2*A + 0*B));
+
+  print_congruences(gr, "*** gr ***");
+
+  Grid gr0 = gr;  // first grid (using trivial transformation)
+
+  Grid gr1 = gr;  // second grid - initial state
+
+  gr1.generalized_affine_image(B, EQUAL, 18*A + B, 1, 0);
+  gr1.generalized_affine_image(A, EQUAL, 15*A, 1, 0);
+                  // second grid - 1 pass through procedure
+
+  Grid gr2 = gr;  // third grid - initial state
+
+  gr2.affine_image(B, 282*A + B);
+  gr2.affine_image(A, 225*A);
+                  // third grid - 2 passes through procedure
+
+  gr.upper_bound_assign(gr1); // join of gr0 and gr1
+
+  print_congruences(gr, "*** gr.upper_bound_assign(gr1) ***");
+
+  gr.upper_bound_assign(gr2); // join of gr0, gr1 and gr2
+
+  Grid known_gr(2);
+
+  known_gr.add_congruence((A %= 2) / 28);
+  known_gr.add_congruence((B %= 0) / 12);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test11() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(A + 0*B));
+
+  Grid gr1(ggs);
+  Grid gr(2, EMPTY);
+
+  for(int j = 0; j < 4; j++) {
+    gr.add_grid_generators(ggs);
+
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, 3*A);
+      gr.affine_image(B, B + A);
+    }
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, 5*A);
+      gr.affine_image(B, B + A);
+    }
+    gr1.upper_bound_assign(gr);
+  }
+
+  gr.add_grid_generators(ggs);
+
+  bool ok = (gr == gr1);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr, "*** gr ***");
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl ESOP 2005 paper
+bool
+test12() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Coefficient* tem1 = new Coefficient("7654321");
+  Coefficient* tem2 = new Coefficient("69246289");
+  Coefficient* tem3 = new Coefficient("4294967296");
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(A));
+  ggs.insert(parameter(*tem3*A));
+  ggs.insert(parameter(*tem3*B));
+
+  Grid gr1(ggs);
+  Grid gr(2, EMPTY);
+
+  for(int j = 0; j < 3; j++) {
+    gr.add_grid_generators(ggs);
+
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, *tem1*A);
+      gr.affine_image(B, B + A);
+    }
+    for(int i = 0; i < j; i++) {
+      gr.affine_image(A, *tem2*A);
+      gr.affine_image(B, B + A);
+    }
+    gr1.upper_bound_assign(gr);
+  }
+
+  gr.add_grid_generators(ggs);
+
+  delete tem1; delete tem2; delete tem3;
+
+  bool ok = (gr == gr1);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr, "*** gr ***");
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST_F16(test10);
+  DO_TEST_F32(test11);
+  DO_TEST_F64(test12);
+END_MAIN
diff --git a/tests/Grid/affinepreimage1.cc b/tests/Grid/affinepreimage1.cc
new file mode 100644
index 0000000..2510b11
--- /dev/null
+++ b/tests/Grid/affinepreimage1.cc
@@ -0,0 +1,429 @@
+/* Test Grid::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// The first twelve tests mirror those in affineimage1.cc.
+
+// Grid defined by generators.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(2*B - 2*C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A + 2, 1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((C == -2) / 0);
+  known_gr.add_congruence((A ==  0) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(B, A + 2, 1) ***");
+
+  return ok;
+}
+
+// Grid defined by congruences.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 1) / 6);
+  gr.add_congruence((3*A - 6*B %= 3) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + B + 1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A - B %= 0) / 0);
+  known_gr.add_congruence((A %= 0) / 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, A + B + 1) ***");
+
+  return ok;
+}
+
+// Denominator.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_line(C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 3) / 0);
+  known_gr.add_congruence((B %= 2) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+// Invertible transformation with denominator, modulus and up-to-date
+// congruences.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 2) / 0);
+  gr.add_congruence((3*A %= 4) / 5);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 3);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 3) / 5);
+  known_gr.add_congruence((B %= 2) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+// Congruences are out-of-date.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(4*A + 6*B, 3));
+  gr.add_grid_generator(grid_point(9*A + 6*B, 3));
+  gr.add_grid_generator(grid_line(C));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*A + 2*B));
+  known_gr.add_grid_generator(grid_point(8*A + 2*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple invertible transformation with denominator and modulus.
+// Congruences are up-to-date.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr = Grid(3);
+  gr.add_congruence((3*A %= 4) / 5);
+  gr.add_congruence((B %= 2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 1, 3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*A + 2*B));
+  known_gr.add_grid_generator(grid_point(8*A + 2*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are out-of-date.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(4*A));
+  gr.add_grid_generator(grid_point(7*A));
+  gr.add_grid_generator(grid_point(6*A + B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// Invertible transformation which changes the modulus.
+// Congruences are up-to-date.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((A - 2*B %= 4) / 3);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 4);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 4) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are out-of-date.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 2*A);
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(A, 2*A) ***");
+
+  return ok;
+}
+
+// One dimension.
+// Congruences are up-to-date.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr = Grid(1);
+  gr.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 2*A);
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, 2*A) ***");
+
+  return ok;
+}
+
+// The first affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are out-of-date.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(7*A + 3*B));
+  gr.add_grid_generator(grid_point(10*A));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A));
+  known_gr.add_grid_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+
+  return ok;
+}
+
+// The first affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are up-to-date.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+
+  gr.add_congruence((3*A - 6*B %= 3) / 9);
+  gr.add_congruence((A - 2*B %= 1) / 9);
+  gr.add_congruence((B %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 3*A + 2*B + 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(3*A));
+  known_gr.add_grid_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, 3*A + 2*B + 1) ***");
+
+  return ok;
+}
+
+// The second affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are out-of-date.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(3*A + 3*B));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// The second affine_image example described at anchor
+// grid_affine_transformation in definitions.dox.
+// Congruences are up-to-date.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((A - B == 0) / 0);
+  gr.add_congruence((A %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_point(3*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/affinepreimage2.cc b/tests/Grid/affinepreimage2.cc
new file mode 100644
index 0000000..159450d
--- /dev/null
+++ b/tests/Grid/affinepreimage2.cc
@@ -0,0 +1,363 @@
+/* Test Grid::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Denominator, with generators having a variety of divisors.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(2*A, 15));
+  gs.insert(grid_point(5*B, 10));
+
+  // The divisors are normalized on construction.
+  Grid gr(gs);
+
+  print_generators(gr, "*** gr ***");
+
+  // All divisors should change, even when the coefficient of A is 0.
+  gr.affine_preimage(A, 2*A, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A, 3));
+  known_gr.add_grid_generator(grid_point(B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(A, 2*A, 5) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(-2*A, 3));
+
+  gr.affine_preimage(A, B + 2, -3);
+
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(A, B + 2, -3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, 11*A - B + 1);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, 11*A - B + 1) ***");
+
+  return ok;
+}
+
+// A negative coefficient of the variable to transform and a negative
+// denominator.
+// Congruences are out-of-date
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(5*A + 4*B, 7));
+
+  print_generators(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A - B, -1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(5*A + 9*B, 7));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.affine_preimage(B, A - B, -1) ***");
+
+  return ok;
+}
+
+// A negative coefficient of the variable to transform and a negative
+// denominator.
+// Congruences are up-to-date
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr = Grid(2);
+  gr.add_congruence((7*A == 5) / 0);
+  gr.add_congruence((7*B == 4) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A - B, -1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(5*A + 9*B, 7));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(B, A - B, -1) ***");
+
+  return ok;
+}
+
+// Shift a rectilinear pointed grid along A.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, A + 3);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= -3) / 4);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, A + 3) ***");
+
+  return ok;
+}
+
+// Slant a rectilinear pointed grid along A == -B.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.affine_preimage(A, A + B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 4);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, A + B) ***");
+
+  return ok;
+}
+
+// Expand a rectilinear pointed grid to a sequence of lines.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 4);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(A, B);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((B %= 0) / 4);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(A, B) ***");
+
+  return ok;
+}
+
+// Transform a grid into the empty grid.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A == 3) / 0);
+  gr.add_congruence((B == 0) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(B, A) ***");
+
+  return ok;
+}
+
+// Transform away the constraint on a dimension (B).
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A == 3) / 0);
+  gr.add_congruence((B == 3) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.affine_preimage(B, A);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A == 3) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.affine_preimage(B, A) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_preimage(B, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_preimage(B, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.affine_preimage(D, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/approximatepartition1.cc b/tests/Grid/approximatepartition1.cc
new file mode 100644
index 0000000..8843c98
--- /dev/null
+++ b/tests/Grid/approximatepartition1.cc
@@ -0,0 +1,103 @@
+/* Test approximate_partition().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  Grid q(2);
+  q.add_congruence((x %= 4) / 9);
+
+  nout << "q = " << q << endl;
+
+  bool finite_partition;
+
+  std::pair<Grid, Pointset_Powerset<Grid> >
+    result = approximate_partition(p, q, finite_partition);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  === p inters q === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  if (!finite_partition)
+    return false;
+
+  result = approximate_partition(q, p, finite_partition);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  === q inters p === " << endl << "  " << result.first << endl;
+  nout << "  ===    rest    === " << endl << "  " << result.second << endl;
+
+  return finite_partition;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  print_congruences(p, "*** p ***");
+
+  Grid q(2);
+  q.add_congruence((x %= 0) / 2);
+  q.add_congruence((y %= 0) / 1);
+
+  print_congruences(q, "*** q ***");
+
+  bool finite_partition;
+
+  std::pair<Grid, Pointset_Powerset<Grid> >
+    result = approximate_partition(q, p, finite_partition);
+
+  print_congruences(result.first,
+                    "*** result.first ***");
+
+  print_congruences(result.second,
+                    "*** result.second ***");
+
+  if (finite_partition)
+    return false;
+
+  Grid known_gr(p);
+
+  Pointset_Powerset<Grid>::iterator i = (result.second).begin();
+
+return i->pointset() == known_gr;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/asciidumpload1.cc b/tests/Grid/asciidumpload1.cc
new file mode 100644
index 0000000..a59b18f
--- /dev/null
+++ b/tests/Grid/asciidumpload1.cc
@@ -0,0 +1,633 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+#include <sstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+using std::stringstream;
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+  Grid gr1(1, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+  Grid gr1(3, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(3);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(3);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of same dimensions.
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(4);
+  gr2.add_congruence((3*A == 0) / 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of mixed dimensions.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  stringstream ss1;
+  gr1.ascii_dump(ss1);
+
+  gr1.ascii_dump(vnout);
+
+  Grid gr2(4);
+  gr2.add_congruence((3*A == 0) / 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  stringstream ss2;
+  gr2.ascii_dump(ss2);
+
+  gr2.ascii_dump(vnout);
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_err 2\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM +err +CM +GM  +CS +GS  -CP -GP  -SC -SG\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "err_sys (up-to-date)";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-err)";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test13() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "0 1 m 1\n"
+    << "1 0 m 1\n"
+    << "err_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test14() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-err)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test15() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test16() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test17() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x err\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test18() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n"
+    << "dimerrnsion_kinds 0 0\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test19() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n"
+    << "dimension_kinds 0\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test20() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 0 1 m 1\n"
+    << "size 3 1 0 m 1\n"
+    << "gen_sys (up-to-date)\n"
+    << "2 x 3\n"
+    << "size 3 1 0 0 P\n"
+    << "size 3 0 1 1 Q\n"
+    << "dimension_kinds 0 700\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test21() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS err  -CP -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test22() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  err -GP  -SC -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test23() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP err  -SC -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test24() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  err -SG\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Grid_Status::ascii_load failure.
+bool
+test25() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 1\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  -CP -GP  -SC err\n"
+    << "con_sys (up-to-date)\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr;
+  bool ok = !gr.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
+END_MAIN
diff --git a/tests/Grid/asciidumpload2.cc b/tests/Grid/asciidumpload2.cc
new file mode 100644
index 0000000..efd9717
--- /dev/null
+++ b/tests/Grid/asciidumpload2.cc
@@ -0,0 +1,495 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// ascii_load simple test of loading the result of ascii_dump()
+bool
+test01() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A - B %= 2) / 5);
+  gr1.add_congruence(B %= 0);
+
+  gr1.minimized_grid_generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 2) / 5);
+  gr1.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "space_dim");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-ZE");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "con_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "gen_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test09() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test10() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test11() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test12() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test13() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  bool ok = !gr2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// A grid with a virtual generator.
+bool
+test14() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A - B %= 2) / 5);
+  gr1.add_congruence(B %= 0);
+  gr1.add_congruence((C == 4) / 0);
+
+  gr1.minimized_grid_generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test15() {
+  const char* my_file = "ascii_dump_load2.dat";
+
+  Grid gr1(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test16() {
+  const char* my_file = "ascii_dump_load2.dat";
+
+  Grid gr1(0, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gr1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid gr2;
+  gr2.ascii_load(f);
+  close(f);
+
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/asciidumpload3.cc b/tests/Grid/asciidumpload3.cc
new file mode 100644
index 0000000..8faabbc
--- /dev/null
+++ b/tests/Grid/asciidumpload3.cc
@@ -0,0 +1,124 @@
+/* Test Congruence::ascii_dump() and Congruence::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Congruence cg1 = (A - B %= 2) / 5;
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  cg1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg2(B == 0);
+  cg2.ascii_load(f);
+  close(f);
+
+  bool ok = (cg1 == cg2);
+
+  print_congruence(cg1, "*** cg1 ***");
+  print_congruence(cg2, "*** cg2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "size 2 1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg(0*A %= 0);
+  bool ok = !cg.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "size 3 1 0 err 1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg(0*A %= 0);
+  bool ok = !cg.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "size 3 1 0 m\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence cg(0*A %= 0);
+  bool ok = !cg.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/asciidumpload4.cc b/tests/Grid/asciidumpload4.cc
new file mode 100644
index 0000000..bcc0d6a
--- /dev/null
+++ b/tests/Grid/asciidumpload4.cc
@@ -0,0 +1,145 @@
+/* Test Congruence_System ascii_dump() and ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1((A + B %= 2) / 3);
+  cgs1.insert(A == 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  cgs1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs2;
+  cgs2.ascii_load(f);
+  close(f);
+
+  bool ok = (cgs1 == cgs2);
+
+  print_congruences(cgs1, "*** cgs1 ***");
+  print_congruences(cgs2, "*** cgs2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "err x 3\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok = !cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok = !cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok = !cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load4.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x 3\n"
+    << "size 3 0 1 err 1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Congruence_System cgs(0*A %= 0);
+  bool ok = !cgs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload5.cc b/tests/Grid/asciidumpload5.cc
new file mode 100644
index 0000000..e9f571e
--- /dev/null
+++ b/tests/Grid/asciidumpload5.cc
@@ -0,0 +1,155 @@
+/* Test Grid_Generator ascii_dump() and ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator g1 = grid_point(A - B);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  g1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g2(grid_point(0*B));
+  g2.ascii_load(f);
+  close(f);
+
+  bool ok = (g1 == g2);
+
+  print_generator(g1, "*** g1 ***");
+  print_generator(g2, "*** g2 ***");
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test02() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "1\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g(grid_point(0*A));
+  bool ok = !g.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test03() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "1 0 3\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g(grid_point(0*A));
+  bool ok = !g.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// ascii_load failure.
+bool
+test04() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "1 0 1 err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g(grid_point(0*A));
+  bool ok = !g.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+// Load and dump a line.
+bool
+test05() {
+  const char* my_file = "ascii_dump_load5.dat";
+  Variable A(0);
+  Variable B(0);
+
+  Grid_Generator g1 = grid_line(2*A - B);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  g1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator g2(grid_point(0*B));
+  g2.ascii_load(f);
+  close(f);
+
+  bool ok = (g1 == g2);
+
+  print_generator(g1, "*** g1 ***");
+  print_generator(g2, "*** g2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/asciidumpload6.cc b/tests/Grid/asciidumpload6.cc
new file mode 100644
index 0000000..91a35d2
--- /dev/null
+++ b/tests/Grid/asciidumpload6.cc
@@ -0,0 +1,145 @@
+/* Test Generator_System ascii_dump() and ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+// Load the result of a dump.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs1(grid_point());
+  gs1.insert(parameter(A + B));
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  gs1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs2;
+  gs2.ascii_load(f);
+  close(f);
+
+  bool ok = (gs1 == gs2);
+
+  print_generators(gs1, "*** gs1 ***");
+  print_generators(gs2, "*** gs2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "err x 3\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok = !gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok = !gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok = !gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load6.dat";
+  Variable A(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "2 x 3\n"
+    << "1 0 0 err\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  Grid_Generator_System gs(grid_point(0*A));
+  bool ok = !gs.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/bhz03widening1.cc b/tests/Grid/bhz03widening1.cc
new file mode 100644
index 0000000..b451163
--- /dev/null
+++ b/tests/Grid/bhz03widening1.cc
@@ -0,0 +1,113 @@
+/* Test Pointset_Powerset<Grid>::BHZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef Pointset_Powerset<Grid> GSet;
+
+namespace {
+
+// Joins of grids in powersets shows that series is stabilizing.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  GSet grs1(2, EMPTY);
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence(B %= 0);
+  grs1.add_disjunct(gr1);
+
+  print_congruences<Grid>(grs1, "*** grs1 ***");
+
+  GSet grs2(2, EMPTY);
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  grs2.add_disjunct(gr2);
+
+  print_congruences<Grid>(grs2, "*** grs2 ***");
+
+  GSet known_grs = grs2;
+
+  grs2.BHZ03_widening_assign<Grid_Certificate>
+    (grs1, widen_fun_ref(&Grid::widening_assign));
+
+  bool ok = (grs2 == known_grs);
+
+  print_congruences<Grid>(grs1, "*** grs2.BHZ03_widening_assign<Grid_Certificate>(grs1, widen_fun_ref(&Grid::widening_assign) ***");
+
+  return ok;
+}
+
+// Widening falls back to a singleton join of the grids in the larger
+// grid set.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  GSet grs1(2, EMPTY);
+  Grid gr1(2);
+  gr1.add_congruence(A - B %= 0);
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  grs1.add_disjunct(gr1);
+  grs1.add_disjunct(gr2);
+
+  print_congruences<Grid>(grs1, "*** grs1 ***");
+
+  GSet grs2(2, EMPTY);
+  Grid gr3(2);
+  gr3.add_congruence(A - B %= 0);
+  Grid gr4(2);
+  gr4.add_congruence((A %= 0) / 2);
+  grs2.add_disjunct(gr3);
+  grs2.add_disjunct(gr4);
+
+  print_congruences<Grid>(grs2, "*** grs2 ***");
+
+  Grid known_gr = gr3;
+  known_gr.upper_bound_assign(gr4);
+
+  grs2.BHZ03_widening_assign<Grid_Certificate>
+    (grs1, widen_fun_ref(&Grid::widening_assign));
+
+  GSet known_grs(2, EMPTY);
+  known_grs.add_disjunct(known_gr);
+
+  bool ok = (grs2 == known_grs);
+
+  print_congruences<Grid>(grs1, "*** grs2.BHZ03_widening_assign<Grid_Certificate>(grs1, widen_fun_ref(&Grid::widening_assign) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/bounded1.cc b/tests/Grid/bounded1.cc
new file mode 100644
index 0000000..8e5a869
--- /dev/null
+++ b/tests/Grid/bounded1.cc
@@ -0,0 +1,392 @@
+/* Test Grid::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.is_bounded()
+    && gr_gs_needs_min.is_bounded()
+    && gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence((B == 2) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_congruence((C == 0) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((A == 3) / 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_congruence((A == 0) / 0);
+  gr_cgs_needs_min.add_congruence((D == 0) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = !gr_gs_min.is_bounded()
+    && !gr_gs_needs_min.is_bounded()
+    && !gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Point in 6D.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Grid gr_gs_min(6, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_gs_needs_min(6, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_cgs_needs_min(6);
+  gr_cgs_needs_min.add_congruence((A == 7) / 0);
+  gr_cgs_needs_min.add_congruence((B == -11) / 0);
+  gr_cgs_needs_min.add_congruence((C == 0) / 0);
+  gr_cgs_needs_min.add_congruence((D == 0) / 0);
+  gr_cgs_needs_min.add_congruence((E == 0) / 0);
+  gr_cgs_needs_min.add_congruence((F == 19) / 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = gr_gs_min.is_bounded()
+    && gr_gs_needs_min.is_bounded()
+    && gr_cgs_needs_min.is_bounded();
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// A single point, duplicated.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(3*A + 2*B));
+  gr.add_grid_generator(grid_point(3*A + 2*B));
+
+  bool ok = (gr.is_bounded());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// A parameter that comes first in the generator system.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(parameter(3*A + 2*B));
+  gs.insert(grid_point(3*A + 2*B));
+
+  Grid gr(gs);
+
+  bool ok = (!gr.is_bounded());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/boundedaffineimage1.cc b/tests/Grid/boundedaffineimage1.cc
new file mode 100644
index 0000000..5ab38ad
--- /dev/null
+++ b/tests/Grid/boundedaffineimage1.cc
@@ -0,0 +1,185 @@
+/* Test Grid::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Non-empty grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((B ==  0) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_image(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(-2*C));
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_image(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((A ==  1) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_image(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_image(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // any call with a denominator equal to zero is illegal.
+    Coefficient d = 0;
+    gr.bounded_affine_image(B, A - 7, B + 2, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the lower bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_image(A, B, A + 7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the upper bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_image(A, A + 7, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 1);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to bound a variable not occurring in the
+    // vector space embedding the grid.
+    gr.bounded_affine_image(B, A - 7, 2*A - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/boundedaffinepreimage1.cc b/tests/Grid/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..0307a89
--- /dev/null
+++ b/tests/Grid/boundedaffinepreimage1.cc
@@ -0,0 +1,185 @@
+/* Test Grid::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Non-empty grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((B ==  0) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_preimage(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(-2*C));
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_preimage(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A ==  0) / 0);
+  gr.add_congruence((A ==  1) / 0);
+  gr.add_congruence((C == -2) / 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.bounded_affine_preimage(A, 7-B, B+3);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.bounded_affine_preimage(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A - B %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // any call with a denominator equal to zero is illegal.
+    Coefficient d = 0;
+    gr.bounded_affine_preimage(B, A - 7, B + 2, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the lower bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_preimage(A, B, A + 7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the upper bounding expression
+    // that does not appear in the grid.
+    gr.bounded_affine_preimage(A, A + 7, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 1);
+
+  try {
+    // This is an incorrect use of function
+    // Grid::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to bound a variable not occurring in the
+    // vector space embedding the grid.
+    gr.bounded_affine_preimage(B, A - 7, 2*A - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/bounds1.cc b/tests/Grid/bounds1.cc
new file mode 100644
index 0000000..d024ad7
--- /dev/null
+++ b/tests/Grid/bounds1.cc
@@ -0,0 +1,459 @@
+/* Test Grid::bounds_from_above() and Grid::bounds_from_below().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.bounds_from_above(Linear_Expression(0))
+             && gr.bounds_from_below(Linear_Expression(0)));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.bounds_from_above(Linear_Expression(3))
+             && gr.bounds_from_below(Linear_Expression(3)));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.bounds_from_above(Linear_Expression(1))
+             && gr.bounds_from_below(Linear_Expression(1)));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 1);
+  gr_cgs_needs_min.add_constraint(3*B == 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = A + B;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Rectilinear line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !gr_gs_min.bounds_from_above(le)
+    && !gr_gs_min.bounds_from_below(le)
+    && !gr_gs_needs_min.bounds_from_above(le)
+    && !gr_gs_needs_min.bounds_from_below(le)
+    && !gr_cgs_needs_min.bounds_from_above(le)
+    && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Line.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(2*A + B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(2*A + B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A - 2*B == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A + B;
+  bool ok = !gr_gs_min.bounds_from_above(le)
+    && !gr_gs_min.bounds_from_below(le)
+    && !gr_gs_needs_min.bounds_from_above(le)
+    && !gr_gs_needs_min.bounds_from_below(le)
+    && !gr_cgs_needs_min.bounds_from_above(le)
+    && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// A line along expr in the grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(2*A - B == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A - B;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+
+// A parameter along expr in the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(2*A - B == 0);
+  gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A - B;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Two lines which combine to cover any line bounded by expr.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator(grid_line(B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+
+  Grid gr_cgs_needs_min(2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = A - B;
+  bool ok = !gr_gs_min.bounds_from_above(le)
+    && !gr_gs_min.bounds_from_below(le)
+    && !gr_gs_needs_min.bounds_from_above(le)
+    && !gr_gs_needs_min.bounds_from_below(le)
+    && !gr_cgs_needs_min.bounds_from_above(le)
+    && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// In three dimensions, lines and parameters which combine to include
+// expr.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator(grid_point(B + C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(B + C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(B - C == 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A + B - C;
+   bool ok = !gr_gs_min.bounds_from_above(le)
+     && !gr_gs_min.bounds_from_below(le)
+     && !gr_gs_needs_min.bounds_from_above(le)
+     && !gr_gs_needs_min.bounds_from_below(le)
+     && !gr_cgs_needs_min.bounds_from_above(le)
+     && !gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Grid which bounds a 3D expr.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_min.add_grid_generator(grid_line(A - 2*B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_needs_min.add_grid_generator(grid_line(A - 2*B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(2*A + B - 3*C == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A + B - 3*C;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Point in 6D.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Grid gr_gs_min(6, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_gs_needs_min(6, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+
+  Grid gr_cgs_needs_min(6);
+  gr_cgs_needs_min.add_constraint(A == 7);
+  gr_cgs_needs_min.add_constraint(B == -11);
+  gr_cgs_needs_min.add_constraint(C == 0);
+  gr_cgs_needs_min.add_constraint(D == 0);
+  gr_cgs_needs_min.add_constraint(E == 0);
+  gr_cgs_needs_min.add_constraint(F == 19);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+  bool ok = gr_gs_min.bounds_from_above(le)
+    && gr_gs_min.bounds_from_below(le)
+    && gr_gs_needs_min.bounds_from_above(le)
+    && gr_gs_needs_min.bounds_from_below(le)
+    && gr_cgs_needs_min.bounds_from_above(le)
+    && gr_cgs_needs_min.bounds_from_below(le);
+
+  print_congruences(gr_gs_min, "*** gr_gs_min **");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min **");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min **");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+
+  Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+  try {
+    gr.bounds_from_above(le);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The generator system is up-to-date but not minimized.
+bool
+test14() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr generators before ***");
+
+  bool ok = !gr.bounds_from_above(A) && !gr.bounds_from_below(A);
+  print_generators(gr, "*** gr generators after ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/certificate1.cc b/tests/Grid/certificate1.cc
new file mode 100644
index 0000000..2767649
--- /dev/null
+++ b/tests/Grid/certificate1.cc
@@ -0,0 +1,229 @@
+/* Test class Grid_Certificate.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Compare a grid to one that is more constrained (due to equalities).
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_constraint(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(3*B + A));
+  gr2.add_grid_generator(grid_point(3*B + A + C));
+
+  Grid_Certificate grc2(gr2);
+
+  bool ok = grc1.compare(grc2) == -1;
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is more constrained (due to proper
+// congruences).
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_constraint(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(3*B + A));
+  gr2.add_grid_generator(grid_point(3*B + A + C));
+
+  bool ok = grc1.compare(gr2) == -1;
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to an equally constrained one.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_constraint(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(3*B));
+  gr2.add_grid_generator(grid_line(A - C));
+  gr2.add_grid_generator(grid_point(3*B + A));
+
+  Grid_Certificate grc2(gr2);
+
+  bool ok = grc1.compare(grc2) == 0
+    && !grc1.is_stabilizing(gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is less constrained (due to equalities).
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*B + A));
+  gr1.add_grid_generator(grid_point(3*B + A + C));
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3);
+  gr2.add_congruence(A + C %= 0);
+  gr2.add_constraint(B == 3);
+
+  bool ok = grc1.compare(gr2) == 1
+    && grc1.is_stabilizing(gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is less constrained (due to proper
+// congruences).
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + C %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 3);
+  gr1.add_congruence(A %= 0);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3);
+  gr2.add_congruence((A + C %= 0) / 2);
+  gr2.add_congruence((B %= 0) / 3);
+
+  Grid_Certificate grc2(gr2);
+
+  Grid_Certificate::Compare cmp;
+
+  bool ok = cmp(grc1, grc2)
+    && grc1.is_stabilizing(gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare certificates for zero dimension universe grids.
+bool
+test06() {
+  Grid gr1(0);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(0);
+
+  Grid_Certificate grc2(gr2);
+
+  bool ok = (grc1.compare(grc2) == 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Compare a grid to one that is more constrained, where the minimized
+// generators are used for the comparison.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A + C %= 0);
+  gr1.add_constraint(B == 3);
+
+  Grid_Certificate grc1(gr1);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(3*B + A + C));
+  gr2.add_grid_generator(grid_point(3*B + A));
+
+  // Ensure up to date congruences and minimized generators.
+  gr2.affine_image(A, 1*A);
+  gr2.minimized_grid_generators();
+
+  bool ok = (grc1.compare(gr2) == -1);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/concatenate1.cc b/tests/Grid/concatenate1.cc
new file mode 100644
index 0000000..570b40f
--- /dev/null
+++ b/tests/Grid/concatenate1.cc
@@ -0,0 +1,341 @@
+/* Test Grid::concatenate_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// From congruences.
+bool
+test01() {
+  Variable B(1);
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+
+  Grid gr1(cgs);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  cgs.clear();
+  cgs.insert((A %= 1) / 2);
+
+  Grid gr2(cgs);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+  known_cgs.insert((B %= 1) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty.
+bool
+test02() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr2(cgs);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 0) / 2);
+
+  Grid gr1(cgs);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid a universe.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr1(1, UNIVERSE);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + C));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(gs);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(B));
+  known_gs.insert(grid_point(B + D));
+  known_gs.insert(grid_line(A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(A + C));
+
+  Grid gr1(gs);
+
+  print_generators(gr1, "*** gr1 ***");
+
+  gs.clear();
+  gs.insert(grid_point(0*B));
+  gs.insert(grid_point(B));
+
+  Grid gr2(gs);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((B == 0) / 0);
+  known_cgs.insert((C %= 0) / 1);
+  known_cgs.insert((D == 0) / 0);
+  known_cgs.insert((E %= 0) / 1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty via the congruence system.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((A %= 1) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty via the congruence system.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence((A %= 1) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(0, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.concatenate_assign(gr2);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.concatenate_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Grid gr1(7);
+
+  Grid gr2(1);
+  gr2.add_congruence(Congruence::zero_dim_integrality());
+  gr2.minimized_congruences();
+  gr2.ascii_dump();
+  // This needs to allocate a lot of memory, in order to create the
+  // integrality congruence.  The presence of the integrality
+  // congruence is required by the conversion.
+
+  gr2.add_space_dimensions_and_project(Grid::max_space_dimension() - 1);
+
+  try {
+    gr1.concatenate_assign(gr2);
+  }
+  catch (const std::length_error& e) {
+    nout << "max_space_dimension_exceeded: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  // DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/congruence1.cc b/tests/Grid/congruence1.cc
new file mode 100644
index 0000000..668c3cf
--- /dev/null
+++ b/tests/Grid/congruence1.cc
@@ -0,0 +1,459 @@
+/* Test class Congruence.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+class Test_Congruence : public Congruence {
+public:
+  Test_Congruence(Congruence cg) : Congruence(cg) {}
+  Test_Congruence(Constraint c) : Congruence(c) {}
+  void strong_normalize() { Congruence::strong_normalize(); }
+  void normalize() { Congruence::normalize(); }
+};
+
+// Negative inhomogeneous term.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 2*B + 3*C %= 5) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((A %= 5 - 3*C - 2*B) / 7);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Positive inhomogeneous term.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 2*B + 3*C %= -5) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((A %= -5 - 3*C - 2*B) / 7);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Common factors and reducible positive inhomogeneous term.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((16*A + 2*B + 8*C + 64 %= 0) / 4);
+  a.strong_normalize();
+
+  Test_Congruence b((16*A + 2*B %= - 64 - 8*C) / 4);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Negative first coefficient.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((- A + 2*B + 3*C %= 5) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((- A %= - 2*B + 5 - 3*C) / 7);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Constructed with only the %= operator.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence c(A + 4*B + 3*C %= 5);
+  Test_Congruence a(c);
+  //Test_Congruence a = (A + 4*B + 3*C %= 5);
+  //Test_Congruence a(A + 4*B + 3*C %= 5);
+  a.strong_normalize();
+
+  Test_Congruence b(A + 4*B %= 5 - 3*C);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Equality congruence (a modulus of 0).
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((3*A + 24*B + 3*C %= -19) / 0);
+  a.strong_normalize();
+
+  Test_Congruence b((3*A + 24*B %= -19 - 3*C) / 0);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Constructed from a Constraint with the `/' operator.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 4*B + 3*C == 17) / 3);
+  a.strong_normalize();
+
+  Test_Congruence b((A + 4*B == 17 - 3*C) / 3);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Constructed from a Constraint.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a(A + 4*B + 3*C == 17);
+  a.strong_normalize();
+
+  Test_Congruence b(A + 4*B == 17 - 3*C);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Set modulus with `/='.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a(A + 4*B + 3*C == 17);
+  a /= 3;
+  a.strong_normalize();
+
+  Test_Congruence b(A + 4*B == 17 - 3*C);
+  b /= 3;
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// is_tautological and is_inconsistent.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a(0*A + 0*B + 0*C %= 17);
+
+  bool ok = (a.is_tautological()) && (!a.is_inconsistent());
+
+  print_congruence(a,
+    "*** a(0*A + 0*B + 0*C %= 17) ***");
+
+  a = Test_Congruence((0*A + 0*B + 0*C %= 0) / 3);
+  ok &= a.is_tautological()
+    && !a.is_inconsistent();
+
+  a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4);
+  ok &= a.is_tautological()
+    && !a.is_inconsistent();
+
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4) ***");
+
+  a = Test_Congruence(0*A + 0*B %= 17);
+  a /= 0;
+  ok &= !a.is_tautological()
+    && a.is_inconsistent();
+
+  print_congruence(a,
+    "*** a = Test_Congruence(0*A + 0*B %= 17) ***");
+
+  a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0);
+  a.strong_normalize();
+  ok &= !a.is_tautological()
+    && a.is_inconsistent();
+
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 0*B + 3 %= 0) / 0) ***");
+
+  a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3);
+  a.strong_normalize();
+  ok &= !a.is_tautological()
+    && a.is_inconsistent();
+
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3) ***");
+
+  a = Test_Congruence((0*A + 1*B %= 1) / 3);
+  ok &= !a.is_tautological()
+    && !a.is_inconsistent();
+
+  print_congruence(a,
+    "*** a = Test_Congruence((0*A + 1*B %= 1) / 3) ***");
+
+  return ok;
+}
+
+// Negative moduli.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 4*B + 3*C %= -4) / -3);
+  a.strong_normalize();
+
+  Test_Congruence b((A + 4*B %= -1 - 3*C) / -3);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Negative modulus and negative first coefficient.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Test_Congruence a((-A + 4*B + 3*C + 17*D + 2*E %= -4) / -3);
+  a.strong_normalize();
+
+  Test_Congruence b((-A + 4*B %= - 3*C - 17*D - 2*E - 4) / -3);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Create from empty linear expression.
+bool
+test13() {
+  Linear_Expression le;
+  Test_Congruence a(le %= le);
+  a.strong_normalize();
+
+  Test_Congruence b(le %= 0);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Linear expressions on both sides.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A - 5 %= 2*B + 3*C) / 7);
+  a.strong_normalize();
+
+  Test_Congruence b((-A %= -5 - 3*C - 2*B) / 7);
+  b.strong_normalize();
+
+  bool ok = (a == b);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+
+  return ok;
+}
+
+// Try construct congruence from inequality constraint.
+bool
+test15() {
+  Variable A(0);
+  Variable C(2);
+
+  try {
+    Congruence cg(A + C > 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Try access the coefficient of a space dimension higher than that of
+// a congruence.
+bool
+test16() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence cg(A + C %= 0);
+
+  try {
+    cg.coefficient(Variable(3));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Check if the congruences are equivalent.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence a((A + 2*B + 3*C %= 5) / 7);
+
+  Test_Congruence b((A + 2*B + 3*C %= 12) / 7);
+
+  Test_Congruence c((2*A + 4*B + 6*C %= 10) / 14);
+
+  bool ok = (a == b);
+  ok &= (a == c);
+
+  Test_Congruence d((2*A + 4*B + 6*C %= 10) / 7);
+
+  ok &= (a != d);
+
+  print_congruence(a, "*** a ***");
+  print_congruence(b, "*** b ***");
+  print_congruence(c, "*** c ***");
+  print_congruence(d, "*** d ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/congruences1.cc b/tests/Grid/congruences1.cc
new file mode 100644
index 0000000..0a08531
--- /dev/null
+++ b/tests/Grid/congruences1.cc
@@ -0,0 +1,403 @@
+/* Test Grid::congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  print_congruences(cgs, "*** cgs ***");
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 7);
+  gr1.add_congruence((A %= 0) / 5);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// 3D rectilinear grid defined by generators.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_grid_generator(grid_point(10*B));
+  gr1.add_grid_generator(grid_point(10*A + 10*B));
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Get a reference to the congruences, empty the grid, use the
+// reference to create a new grid.
+bool
+test07() {
+  Grid gr1(3);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+
+  const Congruence_System& cgs = gr1.congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe congruences,
+// empty the grid, use the reference to create a new grid.
+bool
+test08() {
+  Grid gr1(0);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+
+  const Congruence_System& cgs = gr1.congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// add congruence systems to a congruence system with smaller space
+// dimension.
+// This test showed a bug in Congruence_System insert(), now corrected.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  Congruence_System cgs1;
+  cgs1.insert((A %= 0) / 2);
+  cgs.insert(cgs1);
+  cgs1.insert((A + B %= 0) / 2);
+  cgs.insert(cgs1, Recycle_Input());
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add congruence systems to a congruence system
+// with larger space dimension.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  Congruence_System cgs1;
+  cgs.insert((A + B %= 0) / 2);
+  cgs1.insert((A %= 0) / 2);
+  cgs.insert(cgs1);
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Test is_equal_to() for same congruence systems.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1;
+  cgs1.insert((A %= 0) / 2);
+  cgs1.insert((A + B %= 0) / 2);
+  Congruence_System cgs(cgs1);
+  bool ok = cgs.is_equal_to(cgs1);
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  return ok;
+}
+
+// Test is_equal_to() for congruence systems with different numbers
+// numbers of congruences.
+// This test showed a bug in Congruence_System is_equal_to(), now corrected.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1;
+  cgs1.insert((A %= 0) / 2);
+  cgs1.insert((A + B %= 0) / 2);
+  Congruence_System cgs(cgs1);
+  cgs1.insert((B %= 0) / 2);
+
+  bool ok = !cgs.is_equal_to(cgs1);
+  print_congruences(cgs, "*** cgs ***");
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  return ok;
+}
+
+// Test is_equal_to() for different congruence systems with the same
+// number of congruences.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs1;
+  Congruence_System cgs2;
+  cgs1.insert((A %= 0) / 2);
+  cgs1.insert((A + B %= 0) / 2);
+  cgs2.insert((B %= 0) / 2);
+  cgs2.insert((A + B %= 0) / 2);
+  bool ok = !cgs1.is_equal_to(cgs2);
+  print_congruences(cgs1, "*** cgs1 ***");
+  print_congruences(cgs2, "*** cgs2 ***");
+
+  return ok;
+}
+
+// Test has_linear_equalities() for congruence systems.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+  print_congruences(cgs, "*** cgs.insert((A + B %= 0) / 2) ***");
+  bool ok = !cgs.has_linear_equalities();
+
+  cgs.insert(A == 0);
+  print_congruences(cgs, "*** cgs.insert(A == 0) ***");
+  ok &= cgs.has_linear_equalities();
+
+  return ok;
+}
+
+// Test num_equalities() for congruence systems.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+  cgs.insert(A == 0);
+  print_congruences(cgs, "*** cgs ***");
+
+  bool ok = ((cgs.num_equalities() == 1)
+               && (cgs.num_proper_congruences() == 1));
+
+  return ok;
+}
+
+// Add to a non-empty congruence system a nonempty constraint system
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B == 0);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(B == 0);
+  known_cgs.insert(A %= 0);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  Grid gr(cgs);
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/congruences2.cc b/tests/Grid/congruences2.cc
new file mode 100644
index 0000000..8072568
--- /dev/null
+++ b/tests/Grid/congruences2.cc
@@ -0,0 +1,337 @@
+/* Test Congruence_System::satisfies_all_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+class Test_Congruence_System : public Congruence_System {
+public:
+  Test_Congruence_System() : Congruence_System() {}
+  Test_Congruence_System(Congruence_System cgs) : Congruence_System(cgs) {}
+  Test_Congruence_System(Congruence cg) : Congruence_System(cg) {}
+  bool
+  satisfies_all_congruences(const Grid_Generator& g) const {
+    return Congruence_System::satisfies_all_congruences(g);
+  }
+};
+
+// Public constructors.
+bool
+test01() {
+  Test_Congruence_System cgs0;
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  Test_Congruence_System cgs1(cgs0);
+
+  bool ok = (cgs1 == cgs0);
+
+  print_congruences(cgs1, "*** cgs1(cgs0) ***");
+
+  if (ok) {
+    Variable A(0);
+    Variable B(1);
+
+    Test_Congruence_System cgs2((A - 3*B %= 5) / 2);
+
+    ok &= !(cgs2 == cgs0) && !(cgs2 == cgs1);
+
+    print_congruences(cgs2, "*** cgs2((A - 3*B %= 5) / 2) ***");
+  };
+
+  return ok;
+}
+
+// operator=
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0;
+
+  Test_Congruence_System cgs1((A - 3*B + 21*C %= 5) / 2);
+
+  cgs0 = cgs1;
+
+  bool ok = (cgs0 == cgs1);
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  return ok;
+}
+
+// space_dimension
+bool
+test03() {
+  Variable A(3);
+  Variable B(7);
+  Variable C(4);
+
+  Test_Congruence_System cgs0((A - 3*B + 21*C %= 55) / 21);
+
+  bool ok = (cgs0.space_dimension() == 8);
+
+  print_congruences(cgs0, "*** cgs0((A - 3*B + 21*C %= 55) / 21) ***");
+
+  return ok;
+}
+
+// clear
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - 3*B %= 5) / 7);
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  cgs0.clear();
+
+  bool ok = (cgs0.space_dimension() == 0);
+
+  print_congruences(cgs0, "*** cgs0.clear() ***");
+
+  return ok;
+}
+
+// insert
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Test_Congruence_System cgs0((A - 3*B + C - 18*D %= 5) / 7);
+  cgs0.insert((A %= 0) / 3);
+  cgs0.insert((A + B %= 3) / 5);
+
+  dimension_type tem = cgs0.num_proper_congruences();
+  bool ok = (tem == 3);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+// num_[non_]equalities
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0((-A - B + 13*C %= 6) / 7);
+  cgs0.insert((A %= 0) / 0);
+  cgs0.insert((A + B %= 3) / 0);
+
+  dimension_type neqs = cgs0.num_equalities();
+  dimension_type npcgs = cgs0.num_proper_congruences();
+  bool ok = (neqs == 2 && npcgs == 1);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+// insert, including a row with all terms zero and an equality.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Test_Congruence_System cgs0(0*A + 0*B %= -1);
+  cgs0.insert((A + 0*B %= 1) / 0);
+  cgs0.insert(0*A + 1*B %= 1);
+
+  dimension_type neqs = cgs0.num_equalities();
+  dimension_type npcgs = cgs0.num_proper_congruences();
+  bool ok = (neqs == 1 && npcgs == 2);
+
+  print_congruences(cgs0, "*** cgs0.insert ***");
+
+  return ok;
+}
+
+/* If EXPECTED is true:
+     If G satisfies CGS, then return true, else print an error message
+     and return false.
+
+   And if EXPECTED is false:
+     If G satisfies CGS, then print an error message and return false,
+     else return true.
+*/
+bool
+satisfies(const Grid_Generator& g,
+          const Test_Congruence_System& cgs,
+          bool expected = true) {
+  if (cgs.satisfies_all_congruences(g) == expected)
+    return true;
+
+  nout << g << " should";
+  expected || nout << "fail to";
+  nout << " satisfy " << cgs << "." << endl
+       << "ASCII dump of " << g << ":" << endl;
+  g.ascii_dump(nout);
+  nout << "ASCII dump of " << cgs << ":" << endl;
+  cgs.ascii_dump(nout);
+
+  return false;
+}
+
+inline bool
+fails_to_satisfy(const Grid_Generator& g,
+                 const Congruence_System& cgs) {
+  return satisfies(g, cgs, false);
+}
+
+// Divisor of 1.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - B %= 0) / 7);
+  print_congruences(cgs0, "*** cgs0((A - B %= 0) / 7) ***");
+
+  // Points.
+
+  bool ok = (satisfies(grid_point(), cgs0));
+
+  ok &= (satisfies(grid_point(A + B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(A + 2*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(5*A + 2*B), cgs0));
+
+  ok &= (satisfies(grid_point(5*A - 2*B), cgs0));
+
+  // Parameters.
+
+  ok &= (satisfies(parameter(3*A + 3*B), cgs0));
+
+  ok &= (satisfies(parameter(0*A + 14*B), cgs0));
+
+  ok &= (satisfies(parameter(-A + 13*B), cgs0));
+
+  // Lines.
+
+  ok &= (satisfies(grid_line(13*A + 13*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(18*A + 14*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(14*A - 21*B), cgs0));
+
+  cgs0.insert((A %= 0) / 2);
+  ok &= (fails_to_satisfy(grid_line(3*A), cgs0));
+  print_congruences(cgs0,
+                    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+
+  return ok;
+}
+
+// Divisors greater than 1.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0((A - B %= 0) / 7);
+  print_congruences(cgs0,
+                    "*** cgs0((A - B %= 0) / 7) ***");
+
+  // Points.
+
+  bool ok = (satisfies(grid_point(A + B, 3), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(A + 2*B, 3), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(5*A + 2*B, 5), cgs0));
+
+  ok &= (fails_to_satisfy(grid_point(5*A - 2*B, 7), cgs0));
+
+  // Parameters.
+
+  ok &= (satisfies(parameter(3*A + 3*B, 4), cgs0));
+
+  ok &= (fails_to_satisfy(parameter(A + 14*B, 5), cgs0));
+
+  ok &= (satisfies(parameter(-A + 13*B, 2), cgs0));
+
+  // Lines.
+
+  ok &= (satisfies(grid_line(13*A + 13*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(18*A + 14*B), cgs0));
+
+  ok &= (fails_to_satisfy(grid_line(14*A - 21*B), cgs0));
+
+  cgs0.clear();
+  cgs0.insert((A %= 0) / 2);
+  ok &= (fails_to_satisfy(grid_line(3*A), cgs0));
+  print_congruences(cgs0,
+                    "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+
+  return ok;
+}
+
+// clear empty congruence system
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Test_Congruence_System cgs0;
+
+  print_congruences(cgs0, "*** cgs0 ***");
+
+  cgs0.clear();
+
+  bool ok = (cgs0.space_dimension() == 0);
+
+  print_congruences(cgs0, "*** cgs0.clear() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/constraints1.cc b/tests/Grid/constraints1.cc
new file mode 100644
index 0000000..1afa37f
--- /dev/null
+++ b/tests/Grid/constraints1.cc
@@ -0,0 +1,354 @@
+/* Test Grid::congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(7);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid known_gr(Constraint_System::zero_dim_empty());
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(0);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 7);
+  gr1.add_congruence((A %= 0) / 5);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 7);
+  gr2.add_congruence((A %= 0) / 5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Single point in 2D
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 0);
+  gr1.add_congruence((A %= 0) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Linear points in 2D
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 2);
+  gr1.add_congruence((A %= 0) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test08() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test09() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(7);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test10() {
+  Grid gr1(0, EMPTY);
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid known_gr(Constraint_System::zero_dim_empty());
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test11() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(0);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 7);
+  gr1.add_congruence((A %= 0) / 5);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 7);
+  gr2.add_congruence((A %= 0) / 5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Single point in 2D
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 0);
+  gr1.add_congruence((A %= 0) / 0);
+  gr1.add_congruence((B %= 3) / 0);
+  gr1.add_congruence((A - B %= -3) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Linear points in 2D
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A + B %= 3) / 2);
+  gr1.add_congruence((A %= 0) / 0);
+  gr1.add_congruence((3*A %= 0) / 0);
+
+  Grid known_gr = gr1;
+
+  Constraint_System cs = gr1.minimized_constraints();
+
+  Grid gr2(3);
+  gr2.add_constraints(cs);
+  gr2.add_congruence((A + B %= 3) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_constraints(cs, "*** cs ***");
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/contains1.cc b/tests/Grid/contains1.cc
new file mode 100644
index 0000000..ead6055
--- /dev/null
+++ b/tests/Grid/contains1.cc
@@ -0,0 +1,214 @@
+/* Test Grid::contains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid of points containing empty grid.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+
+  Grid gr1(gs);
+
+  Grid gr2(1, EMPTY);
+
+  bool ok = (gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Empty grid and grid of points.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+
+  Grid gr2(gs);
+
+  bool ok = (!gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  Grid gr2(4, EMPTY);
+
+  bool ok = (gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universes.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid gr2(0);
+
+  bool ok = (gr1.contains(gr2));
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Self containment.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B %= 0);
+  gr.add_congruence(C %= 0);
+
+  bool ok = (gr.contains(gr));
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// A grid strictly containing another.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A - B %= 0);
+  gr1.add_congruence(C %= 0);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_point(2*A + 2*B + 2*C));
+
+  bool ok = (gr1.contains(gr2));
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// test06, the other way round.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(2*A + 2*B + 2*C));
+
+  Grid gr2(3);
+  gr2.add_congruence(A - B %= 0);
+  gr2.add_congruence(C %= 0);
+
+  bool ok = (!gr1.contains(gr2));
+
+  print_generators(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// CHINA example that showed an error in cgs::is_included_in.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+
+  Grid gr2(1, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+
+  bool ok = !gr1.contains(gr2) && !gr2.contains(gr1);
+
+  print_generators(gr1, "*** gr1 ***");
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Space dimension exception
+bool
+test09() {
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+
+  Grid gr2(21, EMPTY);
+
+  try {
+    gr1.contains(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/containsintegerpoint1.cc b/tests/Grid/containsintegerpoint1.cc
new file mode 100644
index 0000000..7f89045
--- /dev/null
+++ b/tests/Grid/containsintegerpoint1.cc
@@ -0,0 +1,290 @@
+/* Test Grid::contains_integer_point().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <iostream>
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (!gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+
+  Grid gr(0, EMPTY);
+
+  bool ok = (!gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_constraint(B == 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.contains_integer_point())
+    && (gr_gs_needs_min.contains_integer_point())
+    && (gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(5*A == 3);
+  gr_cgs_needs_min.add_constraint(5*B == 2);
+
+  Grid gr_cgs_min(3);
+  gr_cgs_min.add_constraint(5*A == 3);
+  gr_cgs_min.add_constraint(5*B == 2);
+  // Minimize the congruences.
+  gr_cgs_min.minimized_congruences();
+
+  // Grids gr_gs_min, gr_gs_needs_min, gr_cgs_needs_min and gr_cgs_min
+  // are the same grids.
+
+  bool ok = (!gr_gs_min.contains_integer_point())
+    && (!gr_gs_needs_min.contains_integer_point())
+    && (!gr_cgs_needs_min.contains_integer_point())
+    && (!gr_cgs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+  print_congruences(gr_cgs_min, "*** gr_cgs_min ***");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B, 5));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 5));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B, 5));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(5*A == 3);
+  gr_cgs_needs_min.add_congruence(5*B %= 0);
+  gr_cgs_needs_min.add_constraint(C == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (!gr_gs_min.contains_integer_point())
+    && (!gr_gs_needs_min.contains_integer_point())
+    && (!gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B, 3));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B, 3));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 1);
+  gr_cgs_needs_min.add_congruence(3*B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.contains_integer_point())
+    && (gr_gs_needs_min.contains_integer_point())
+    && (gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.contains_integer_point())
+    && (gr_gs_needs_min.contains_integer_point())
+    && (gr_cgs_needs_min.contains_integer_point());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(3);
+  gr.add_constraint(A == 1);
+  gr.add_constraint(A == 2);
+
+  bool ok = (!gr.contains_integer_point());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(4*A %= 0);
+
+  Grid gr_copy = gr;
+
+  bool ok = (gr.contains_integer_point() && gr == gr_copy);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(gr_copy, "*** gr_copy ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/discrete1.cc b/tests/Grid/discrete1.cc
new file mode 100644
index 0000000..8cc08d1
--- /dev/null
+++ b/tests/Grid/discrete1.cc
@@ -0,0 +1,342 @@
+/* Test Grid::is_pointed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_constraint(B == 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_discrete())
+    && (gr_gs_needs_min.is_discrete())
+    && (gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_constraint(B == 2);
+
+  Grid gr_cgs_min(3);
+  gr_cgs_min.add_constraint(A == 3);
+  gr_cgs_min.add_constraint(B == 2);
+  // Minimize the congruences.
+  gr_cgs_min.minimized_congruences();
+
+  // Grids gr_gs_min, gr_gs_needs_min, gr_cgs_needs_min and gr_cgs_min
+  // are the same grids.
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete())
+    && (!gr_cgs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+  print_congruences(gr_cgs_min, "*** gr_cgs_min ***");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_constraint(C == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_discrete())
+    && (gr_gs_needs_min.is_discrete())
+    && (gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_discrete())
+    && (gr_gs_needs_min.is_discrete())
+    && (gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_constraint(A == 0);
+  gr_cgs_needs_min.add_constraint(D == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (!gr_gs_min.is_discrete())
+    && (!gr_gs_needs_min.is_discrete())
+    && (!gr_cgs_needs_min.is_discrete());
+
+  print_congruences(gr_gs_min, "*** gr_gs_min ***");
+  print_congruences(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(3);
+  gr.add_constraint(A == 1);
+  gr.add_constraint(A == 2);
+
+  bool ok = (gr.is_discrete());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/disjoint1.cc b/tests/Grid/disjoint1.cc
new file mode 100644
index 0000000..e279f89
--- /dev/null
+++ b/tests/Grid/disjoint1.cc
@@ -0,0 +1,255 @@
+/* Test Grid::is_disjoint_from().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Grid of points and empty grid.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+
+  Grid gr1(gs);
+
+  Grid gr2(1, EMPTY);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Empty grid and grid of points.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+
+  Grid gr2(gs);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  Grid gr2(4, EMPTY);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universes.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid gr2(0);
+
+  bool ok = (!gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Grid and itself.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A - B %= 0);
+  gr.add_congruence(C %= 0);
+
+  bool ok = (!gr.is_disjoint_from(gr));
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Two grids which alternate AB planes along C.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence(A - B %= 0);
+  gr1.add_congruence((C %= 0) / 2);
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C));
+  gr2.add_grid_generator(grid_line(A + B));
+  gr2.add_grid_generator(grid_point(C + B));
+  gr2.add_grid_generator(grid_point(3*C));
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// A sequence of points and a plane.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(A + B + C));
+  gr1.add_grid_generator(grid_point(3*A + 3*B + 3*C));
+
+  Grid gr2(3);
+  gr2.add_congruence(A - B %= 0);
+  gr2.add_constraint(C == 0);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// A line and a plane.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(A + B + C));
+  gr1.add_grid_generator(grid_line(3*A + 3*B + 3*C));
+
+  Grid gr2(3);
+  gr2.add_congruence(A - B %= 0);
+  gr2.add_constraint(C == 0);
+
+  bool ok = (!gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// CHINA contains example that showed an error in cgs::is_included_in.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.minimized_grid_generators();
+
+  Grid gr2(1, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.minimized_grid_generators();
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr2, "*** gr2 ***");
+  print_congruences(gr1, "*** gr1.is_disjoint_from(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test10() {
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+
+  Grid gr2(19, EMPTY);
+
+  try {
+    gr1.is_disjoint_from(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Both empty and both not in minimal form.
+bool
+test11() {
+  Variable A(0);
+  Grid gr1(1);
+  gr1.add_congruence((A %= 1) / 2);
+  gr1.add_congruence((A %= 0) / 2);
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr1.is_disjoint_from(gr2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/dropnonintegerpoints1.cc b/tests/Grid/dropnonintegerpoints1.cc
new file mode 100644
index 0000000..13fd988
--- /dev/null
+++ b/tests/Grid/dropnonintegerpoints1.cc
@@ -0,0 +1,323 @@
+/* Test Grid::drop_some_non_integer_points().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty grid.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(1);
+
+  Grid gr2(1, EMPTY);
+
+  gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+  Grid known_gr1(1);
+  known_gr1.add_congruence(A %= 0);
+  bool ok = (gr2.is_empty() && gr1 == known_gr1);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// 0-dimension grids.
+bool
+test02() {
+  Grid gr1(0);
+
+  Grid gr2(0, EMPTY);
+
+  gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+  bool ok = (gr2.is_empty() && gr1.is_universe());
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(1);
+  Grid gr2(1);
+  gr1.add_congruence(2*A %= 0);
+  gr2.add_congruence((A %= 1) / 2);
+  Grid known_gr1(1);
+  known_gr1.add_congruence(A %= 0);
+  Grid known_gr2(1);
+  known_gr2.add_congruence((A %= 1) / 2);
+
+  gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+  bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  Grid gr2(2);
+  gr1.add_congruence(2*A %= 0);
+  gr2.add_congruence((A %= 1) / 2);
+  Grid known_gr1(2);
+  Grid known_gr2(2);
+  known_gr1.add_congruence(A %= 0);
+  known_gr1.add_congruence(B %= 0);
+  known_gr2.add_congruence((A %= 1) / 2);
+  known_gr2.add_congruence(B %= 0);
+
+  gr1.drop_some_non_integer_points(ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(ANY_COMPLEXITY);
+  bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 1) / 2);
+  gr.add_congruence((B %= 1) / 2);
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 1) / 2);
+  known_gr.add_congruence((B %= 1) / 2);
+  gr.drop_some_non_integer_points(ANY_COMPLEXITY);
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point((-2*A - C + 2*D), 2));
+  gr.add_grid_generator(parameter(10*A, 2));
+  gr.add_grid_generator(grid_line(2*B + C));
+  gr.add_grid_generator(parameter(5*C, 2));
+  gr.add_grid_generator(parameter(10*D, 2));
+  Grid known_gr(gr);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(B %= 0);
+  known_gr.add_congruence(C %= 0);
+  known_gr.add_congruence(D %= 0);
+
+  gr.drop_some_non_integer_points(ANY_COMPLEXITY);
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe and empty grid with variable set A.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(1);
+
+  Grid gr2(1, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  Grid known_gr1(1);
+  known_gr1.add_congruence(A %= 0);
+  bool ok = (gr2.is_empty() && gr1 == known_gr1);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// 0-dimension grids with empty variable set.
+
+bool
+test08() {
+  Grid gr1(0);
+
+  Grid gr2(0, EMPTY);
+
+  Variables_Set vars;
+
+  gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  bool ok = (gr2.is_empty() && gr1.is_universe());
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Non-relational test with variable set A.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(1);
+  Grid gr2(1);
+  gr1.add_congruence(2*A %= 0);
+  gr2.add_congruence((A %= 1) / 2);
+  Grid known_gr1(1);
+  known_gr1.add_congruence(A %= 0);
+  Grid known_gr2(1);
+  known_gr2.add_congruence((A %= 1) / 2);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Non-relational test with variable set A.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  Grid gr2(2);
+  gr1.add_congruence(2*A %= 0);
+  gr2.add_congruence((A %= 1) / 2);
+  Grid known_gr1(2);
+  Grid known_gr2(2);
+  known_gr1.add_congruence(A %= 0);
+  known_gr2.add_congruence((A %= 1) / 2);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  gr2.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  bool ok = (gr1 == known_gr1 && gr2 == known_gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Non-relational test with variable set A.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((B %= 1) / 2);
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 1);
+  known_gr.add_congruence((B %= 1) / 2);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Relational test with variable set {A, C}.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point((-2*A - C + 2*D), 2));
+  gr.add_grid_generator(parameter(10*A, 2));
+  gr.add_grid_generator(grid_line(2*B + C));
+  gr.add_grid_generator(parameter(5*C, 2));
+  gr.add_grid_generator(parameter(10*D, 2));
+  Grid known_gr(gr);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(C %= 0);
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(C);
+
+  gr.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/equals1.cc b/tests/Grid/equals1.cc
new file mode 100644
index 0000000..535b760
--- /dev/null
+++ b/tests/Grid/equals1.cc
@@ -0,0 +1,286 @@
+/* Test operator==(const Grid&, const Grid&)
+   and operator!=(const Grid&, const Grid&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grids the same, gr defined by generators and known_gr by congruences.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(3*A));
+
+  Grid gr(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Grids the same, gr defined by congruences and known_gr by generators.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(A - B %= 0);
+  cgs.insert((C %= 0) / 7);
+
+  Grid gr(cgs);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_line(A + B));
+  gs.insert(grid_point(B));
+  gs.insert(grid_point(7*C));
+
+  Grid known_gr(gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Grids differ, gr defined by congruences and known_gr by generators.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(A - B %= 0);
+  cgs.insert((C %= 0) / 7);
+
+  Grid gr(cgs);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_line(A - B));
+  gs.insert(grid_point(B));
+  gs.insert(grid_point(7*C, 3));
+
+  Grid known_gr(gs);
+
+  bool ok = (gr != known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Grids differ by the affine dimension and are defined by points.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*A));
+  gs.insert(grid_point(1*A));
+
+  Grid gr(gs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A + 0*B));
+  known_gs.insert(grid_point(1*A + 0*B));
+  known_gs.insert(grid_point(0*A + 1*B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr != known_gr);
+
+  print_congruences(gr, "*** gr ***");
+  print_congruences(known_gr, "*** known_gr ***");
+
+  return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of equalities.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_constraint(A == 0);
+
+  gr1.minimized_congruences();
+
+  Grid gr2(3);
+  gr2.add_congruence(B %= 0);
+
+  gr2.minimized_congruences();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of generators.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+
+  gr1.minimized_grid_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_line(A));
+
+  gr2.minimized_grid_generators();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Where the equality of two grids is decided by comparing the number
+// of lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(B));
+
+  gr1.minimized_grid_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_line(A));
+
+  gr2.minimized_grid_generators();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// No equalities and no lines, number of congruences and generators
+// are the same. But the generators are different.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A));
+  gr1.add_grid_generator(parameter(B));
+  gr1.add_grid_generator(parameter(C));
+
+  gr1.minimized_grid_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(2*A));
+  gr2.add_grid_generator(parameter(2*B));
+  gr2.add_grid_generator(parameter(2*C));
+
+  gr2.minimized_grid_generators();
+
+  bool ok = (gr1 != gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// No equalities and no lines, number of congruences and generators
+// are the same. But the generators are syntactically the same.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A));
+  gr1.add_grid_generator(parameter(B));
+  gr1.add_grid_generator(parameter(C));
+
+  gr1.minimized_grid_generators();
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A));
+  gr2.add_grid_generator(parameter(B));
+  gr2.add_grid_generator(parameter(C));
+
+  gr2.minimized_grid_generators();
+
+  bool ok = (gr1 == gr2);
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/expandspacedim1.cc b/tests/Grid/expandspacedim1.cc
new file mode 100644
index 0000000..5272ee2
--- /dev/null
+++ b/tests/Grid/expandspacedim1.cc
@@ -0,0 +1,239 @@
+/* Test Grid::expand_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+
+  gr.expand_space_dimension(A, 1);
+
+  Grid known_gr(4);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr(3, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  gr.expand_space_dimension(B, 1);
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+// Trivial expansion.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(A + B %= 2);
+
+  gr.expand_space_dimension(A, 0);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(A + B %= 2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+// From generators, expanding one dimension.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(A + 2*B));
+  gr.add_grid_generator(grid_point());
+  print_generators(gr, "*** gr ***");
+
+  gr.expand_space_dimension(A, 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(A + 2*B));
+  known_gr.add_grid_generator(grid_point(C));
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// From congruences, expanding one dimension.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2);
+  gr.add_congruence((A + B %= 2) / 7);
+  print_generators(gr, "***  ***");
+
+  gr.expand_space_dimension(A, 1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A + B     %= 2) / 7);
+  known_gr.add_congruence((    B + C %= 2) / 7);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// From congruences, expanding two dimensions.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(2);
+  gr.add_congruence((A + 2*B %= 3) / 5);
+  print_generators(gr, "***  ***");
+
+  gr.expand_space_dimension(B, 2);
+
+  Grid known_gr(4);
+  known_gr.add_congruence((A + 2*B             %= 3) / 5);
+  known_gr.add_congruence((A       + 2*C       %= 3) / 5);
+  known_gr.add_congruence((A             + 2*D %= 3) / 5);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(B, 2) ***");
+
+  return ok;
+}
+
+// From congruences, with an equality.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid gr(3);
+  gr.add_constraint(2*C == 1);
+  gr.add_congruence(A - B %= 0);
+
+  gr.expand_space_dimension(A, 1);
+  gr.expand_space_dimension(C, 1);
+
+  Grid known_gr(5);
+  known_gr.add_constraint(2*C == 1);
+  known_gr.add_constraint(2*E == 1);
+  known_gr.add_congruence(A - B         %= 0);
+  known_gr.add_congruence(  - B + D     %= 0);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.expand_space_dimension(...) ***");
+
+  return ok;
+}
+
+// Variable of higher space dimension than grid.
+bool
+test08() {
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+
+  try {
+    gr.expand_space_dimension(B, 3);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Add more dimensions than are available.
+bool
+test09() {
+  Variable B(1);
+
+  Grid gr(10, EMPTY);
+
+  try {
+    gr.expand_space_dimension(B, Grid::max_space_dimension());
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/foldspacedims1.cc b/tests/Grid/foldspacedims1.cc
new file mode 100644
index 0000000..4564ef0
--- /dev/null
+++ b/tests/Grid/foldspacedims1.cc
@@ -0,0 +1,401 @@
+/* Test Grid::fold_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(3, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Trivial fold.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B + C %= 2) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Variables_Set to_fold;
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Simple fold from congruences.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 1);
+  gr.add_congruence((B %= 1) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 1);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Simple fold from generators.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(A + 2*B + 2*C));
+  gr.add_grid_generator(grid_point(A + 2*B + 4*C));
+  gr.add_grid_generator(grid_point(A + 6*B + 2*C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(C);
+
+  gr.fold_space_dimensions(to_fold, B);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(A + 2*B));
+  known_gr.add_grid_generator(grid_point(A + 4*B));
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, B) ***");
+
+  return ok;
+}
+
+// Folding several dimensions into a higher dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 2) / 3);
+  gr.add_congruence((B %= 8) / 9);
+  gr.add_congruence((C == 17) / 0);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 2) / 3);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// Folding dimensions into a lower dimension.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  gr.add_congruence((A - B %= 3) / 4);
+  gr.add_congruence((C %= 5) / 9);
+  gr.add_congruence((D %= 2) / 6);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  gr.fold_space_dimensions(to_fold, A);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, A) ***");
+
+  return ok;
+}
+
+// Folding dimensions into an intermediate dimension.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((B %= 0) / 9);
+  gr.add_congruence((C %= 0) / 6);
+  gr.add_congruence((D %= 0) / 12);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 0) / 3);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// Test folding dimensions of a relational grid into an intermediate
+// dimension.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4);
+  gr.add_congruence((A - B %= 0) / 9);
+  gr.add_congruence((C %= 0) / 6);
+  gr.add_congruence((D %= 0) / 12);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// One dimension.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence((A %= 3) / 7);
+  print_congruences(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  Variables_Set to_fold;
+
+  gr.fold_space_dimensions(to_fold, A);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, A) ***");
+
+  return ok;
+}
+
+// Test folding dimensions of a relational grid into an intermediate
+// dimension, where the resulting grid is smaller than the universe.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(A - B == 0);
+  gr.add_congruence(A %= 0);
+  gr.add_constraint(C == 0);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  gr.fold_space_dimensions(to_fold, C);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(B %= 0);
+
+  bool ok = (gr == known_gr);
+  print_congruences(gr, "*** gr.fold_space_dimensions(to_fold, C) ***");
+
+  return ok;
+}
+
+// Second parameter of greater dimension than grid.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  try {
+    gr.fold_space_dimensions(vars, B);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Highest variable in set of greater dimension than grid.
+bool
+test13() {
+  Variable B(1);
+
+  Grid gr(3, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  try {
+    gr.fold_space_dimensions(vars, B);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Dimension of highest variable in set greater than dimension of
+// grid.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  try {
+    gr.fold_space_dimensions(vars, A);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/frequency1.cc b/tests/Grid/frequency1.cc
new file mode 100644
index 0000000..a377192
--- /dev/null
+++ b/tests/Grid/frequency1.cc
@@ -0,0 +1,349 @@
+/* Test Grid::frequency().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty grid.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(1);
+
+  Grid gr2(1, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (!gr1.frequency(A, num1, den1, valn1, vald1)
+             && !gr2.frequency(A, num2, den2, valn2, vald2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// 0-dimension grids.
+bool
+test02() {
+  Grid gr1(0);
+
+  Grid gr2(0, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (gr1.frequency(Linear_Expression(0), num1, den1, valn1, vald1)
+             && num1 == 0 && den1 == 1 && valn1 == 0 && vald1 == 1
+             && !gr2.frequency(Linear_Expression(0), num2, den2, valn2, vald2));
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence(A %= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 1 && den == 1 && valn == 0 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!gr.frequency(Linear_Expression(B), num, den, valn, vald));
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+             && num == 1 && den == 1 && valn == 0 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 1) / 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(2*A + B), num, den, valn, vald)
+             && num == 2 && den == 1 && valn == 1 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 1) / 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(2*A + 3*B), num, den, valn, vald)
+             && num == 2 && den == 1 && valn == 1 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(3*A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(2*A + 3*B - 1),
+                          num, den, valn, vald)
+             && num == 2 && den == 3 && valn == -1 && vald == 3);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 1) / 2);
+  gr.add_congruence((B %= 1) / 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(3*A + 2*B + 5),
+                          num, den, valn, vald)
+             && num == 2 && den == 1 && valn == 0 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(4, EMPTY);
+  gr.add_grid_generator(grid_point((-2*A - C + 2*D), 2));
+  gr.add_grid_generator(parameter(10*A, 2));
+  gr.add_grid_generator(grid_line(2*B + C));
+  gr.add_grid_generator(parameter(5*C, 2));
+  gr.add_grid_generator(parameter(10*D, 2));
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(3*A - B + 2*C - 17),
+                          num, den, valn, vald)
+             && num == 5 && den == 1 && valn == -1 && vald == 1);
+
+  Grid known_gr(gr);
+  known_gr.add_congruence((3*A - B + 2*C - 17 %= -1) / 5);
+  print_congruences(gr, "*** gr ***");
+
+  return ok && (gr == known_gr);
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point((2*A - B), 4));
+  gr.add_grid_generator(parameter(B));
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(A),
+                          num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 1 && vald == 2);
+
+  Grid known_gr(gr);
+  known_gr.add_congruence((2*A %= 1) / 0);
+  print_congruences(gr, "*** gr ***");
+
+  return ok && (gr == known_gr);
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == 0);
+  gr.add_congruence(B %= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(B == 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 1);
+  gr.add_congruence((2*A - B %= 0) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (gr.frequency(Linear_Expression(B), num, den, valn, vald)
+             && num == 2 && den == 1 && valn == 0 && vald == 1);
+  print_congruences(gr, "*** gr ***");
+  nout << num << den;
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/frombdshape1.cc b/tests/Grid/frombdshape1.cc
new file mode 100644
index 0000000..72051cd
--- /dev/null
+++ b/tests/Grid/frombdshape1.cc
@@ -0,0 +1,77 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B == 5);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TBD_Shape bd(cs);
+
+  Grid gr(bd);
+
+  Grid known_result(2);
+
+  known_result.refine_with_constraints(cs);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A >= 5);
+  cs.insert(A <= -7);
+  TBD_Shape bd(cs);
+
+  Grid gr(bd);
+
+  Grid known_result(1, EMPTY);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/frombox1.cc b/tests/Grid/frombox1.cc
new file mode 100644
index 0000000..8f280ad
--- /dev/null
+++ b/tests/Grid/frombox1.cc
@@ -0,0 +1,77 @@
+/* Test Grid::Grid(const Box&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 5);
+  cs.insert(B <= 7);
+  TBox box(cs);
+
+  Grid gr(box);
+
+  Grid known_result(2);
+
+  known_result.refine_with_constraints(cs);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A >= 5);
+  cs.insert(A <= 5);
+  TBox box(cs);
+
+  Grid gr(box);
+
+  Grid known_result(1);
+  known_result.refine_with_constraint(A == 5);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/fromgrid1.cc b/tests/Grid/fromgrid1.cc
new file mode 100644
index 0000000..21272fc
--- /dev/null
+++ b/tests/Grid/fromgrid1.cc
@@ -0,0 +1,102 @@
+/* Test copy construction and assignment for grids.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Assignment for universe and empty grids of the first ten dimensions.
+
+bool
+test01() {
+  bool ok = true;
+  for (unsigned int dim = 0; dim < 10; ++dim) {
+
+    nout << "dimension: " << dim << endl;
+    // Universe.
+    Grid gr(dim);
+    print_congruences(gr, "*** gr ***");
+
+    Grid gr_copy(0);
+    gr_copy = gr;
+
+    Grid known_gr(dim);
+    ok &= (gr_copy == known_gr);
+    print_congruences(gr_copy, "*** gr_copy ***");
+
+    if (ok) {
+      // Empty.
+      gr = Grid(dim, EMPTY);
+      print_generators(gr, "*** gr ***");
+
+      Grid gr_copy(0);
+      gr_copy = gr;
+
+      Grid known_gr(dim, EMPTY);
+      ok &= (gr_copy == known_gr);
+      print_generators(gr_copy, "*** gr_copy ***");
+    }
+  };
+
+  return ok;
+}
+
+// Copy construct for universe and empty grids of the first ten dimensions.
+bool
+test02() {
+  bool ok = true;
+  for (unsigned int dim = 0; dim < 10; ++dim) {
+
+    nout << "dimension: " << dim << endl;
+    // Universe.
+    Grid gr(dim);
+    print_congruences(gr, "*** gr ***");
+
+    Grid gr_copy(gr);
+
+    Grid known_gr(dim);
+    ok &= (gr_copy == known_gr);
+    print_congruences(gr_copy, "*** gr_copy ***");
+
+    if (ok) {
+      // Empty.
+      gr = Grid(dim, EMPTY);
+      print_generators(gr, "*** gr ***");
+
+      Grid gr_copy(gr);
+
+      Grid known_gr(dim, EMPTY);
+      ok &= (gr_copy == known_gr);
+      print_generators(gr_copy, "*** gr_copy ***");
+    }
+  };
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/fromoctagonalshape1.cc b/tests/Grid/fromoctagonalshape1.cc
new file mode 100644
index 0000000..091ebda
--- /dev/null
+++ b/tests/Grid/fromoctagonalshape1.cc
@@ -0,0 +1,77 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B == 5);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TOctagonal_Shape os(cs);
+
+  Grid gr(os);
+
+  Grid known_result(2);
+
+  known_result.refine_with_constraints(cs);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A >= 5);
+  cs.insert(A <= -7);
+  TOctagonal_Shape bd(cs);
+
+  Grid gr(bd);
+
+  Grid known_result(1, EMPTY);
+
+  bool ok = gr == known_result;
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/frompolyhedron1.cc b/tests/Grid/frompolyhedron1.cc
new file mode 100644
index 0000000..e74d03a
--- /dev/null
+++ b/tests/Grid/frompolyhedron1.cc
@@ -0,0 +1,343 @@
+/* Test construction of grids from polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(ph) - non-empty polyhedron
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(C > 0);
+
+  NNC_Polyhedron ph(cs);
+  Grid gr(ph);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - empty polyhedron
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+  cs.insert(A >= 0);
+  cs.insert(B >= 1);
+  cs.insert(C > 0);
+
+  NNC_Polyhedron ph(cs);
+  Grid gr(ph);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - zero dimension universe polyhedron
+bool
+test03() {
+
+  NNC_Polyhedron ph(0);
+  Grid gr(ph);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - zero dimension empty polyhedron
+bool
+test04() {
+
+  NNC_Polyhedron ph(0, EMPTY);
+  Grid gr(ph);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - non-empty polyhedron constructed from generators
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B, 3));
+  cs.insert(ray(A - C));
+  cs.insert(point());
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(A - B + C == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from generators */
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B, 3));
+  cs.insert(line(A - C));
+  cs.insert(point(3 * C, 2));
+
+  C_Polyhedron ph(cs);
+
+  Grid gr(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  Grid known_gr(3);
+  known_gr.add_constraint(2*A + 7*B + 2*C == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  print_congruences(known_gr, "*** known_gr(ph) ***");
+  print_generators(known_gr, "*** known_gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - universe grid built from
+   non-universe C_polyhedron constructed from generators */
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B, 3));
+  cs.insert(point(3 * A, 2));
+  cs.insert(point(B, 7));
+  cs.insert(point(5 * C));
+
+  C_Polyhedron ph(cs);
+
+  Grid gr(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+// Grid(ph) - universe polyhedron
+bool
+test08() {
+
+  NNC_Polyhedron ph(5);
+  Grid gr(ph);
+
+  Grid known_gr(5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from generators; The complexity
+   limit allows the detection of implicit equalities from
+   any generator system*/
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System cs;
+  cs.insert(point(A + B));
+  cs.insert(line(A - C));
+  cs.insert(point(3 * C));
+
+  C_Polyhedron ph(cs);
+
+  Grid gr(ph, POLYNOMIAL_COMPLEXITY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Grid known_gr(3);
+  known_gr.add_constraint(A + 2*B + C == 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+  print_generators(gr, "*** gr(ph) ***");
+
+  print_congruences(known_gr, "*** known_gr(ph) ***");
+  print_generators(known_gr, "*** known_gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from constraints; The complexity
+   is unlimited so it is able to detect the implicit equality */
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph, ANY_COMPLEXITY);
+
+  Grid known_gr(2);
+  known_gr.add_constraint(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from constraints; The complexity
+   is limited to be polynomial so it is unable to detect the
+   implicit equality */
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph, POLYNOMIAL_COMPLEXITY);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+/* Grid(ph) - non-empty and non-universe grid built from
+   C_polyhedron constructed from constraints; The complexity
+   is limited to that of simplex so it is unable to detect the
+   implicit equality */
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(B <= 0);
+  cs.insert(A >= 0);
+
+  C_Polyhedron ph(cs);
+  Grid gr(ph, SIMPLEX_COMPLEXITY);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ph) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST_F8(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage1.cc b/tests/Grid/generalizedaffineimage1.cc
new file mode 100644
index 0000000..18105ed
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage1.cc
@@ -0,0 +1,556 @@
+/* Test Grid::generalized_affine_image(var, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 1, 0) ***");
+
+  return ok;
+}
+
+// Simplest expression, with denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 2, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, Linear_Expression::zero(), 2, 1) ***");
+
+  return ok;
+}
+
+// Simple expression.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, EQUAL, A + 1, 1, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A - B));
+  known_gr.add_grid_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, A + 1, 1, 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, EQUAL, A + 1, 2, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(B + A));
+  known_gr.add_grid_generator(grid_point(3*B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, A + 1, 2, 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, EQUAL, A + 1, 2, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(7*B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, A + 1, 2, 3) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, EQUAL, A + 2, -2, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-B));
+  known_gr.add_grid_generator(grid_point(-3*B + 2*A, 2));
+  known_gr.add_grid_generator(grid_point(-2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, A + 2, -2, 1) ***");
+
+  return ok;
+}
+
+// Negative modulus.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(B, EQUAL, A + 2, 1, -7);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*B));
+  known_gr.add_grid_generator(grid_point(A + 3*B));
+  known_gr.add_grid_generator(grid_point(9*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, EQUAL, A + 2, 1, -7) ***");
+
+  return ok;
+}
+
+// Expression of many variables.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 5);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + 3*B));
+  known_gr.add_grid_generator(grid_line(A + C));
+  known_gr.add_grid_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_grid_generator(grid_point(7*A));  // Transformation modulus.
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 5) ***");
+
+  return ok;
+}
+
+// Equality expression comparing
+// generalized_affine_image and affine_image
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 0);
+
+  Grid known_gr = Grid(3);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+  known_gr.affine_image(A, A - C + 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, EQUAL, A - C + 2, 1, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, EQUAL, A - 2*C + 3, 4, 7);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+                   "*** gr.generalized_affine_image(A, EQUAL, A - 2*C + 3, 4, 7) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, EQUAL, A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, EQUAL, A + 2, 0, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, EQUAL, D + 2, 1, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(D, EQUAL, A + 2, 1, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expressions having common variables.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_constraint(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B + C, EQUAL, 2*A - B - C, 5);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - B + C, EQUAL, 2*A - B - C, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables, where generalized_affine_image
+// must minimize the grid.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, EQUAL, 2*A - 2*B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - B, EQUAL, 2*A - 2*B, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*A - 2*B, EQUAL, A - B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((2*A - 2*B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(2*A - 2*B, EQUAL, A - B, 5) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_image(B + C, EQUAL, D + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_image(A + D, EQUAL, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage2.cc b/tests/Grid/generalizedaffineimage2.cc
new file mode 100644
index 0000000..cfc93e6
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage2.cc
@@ -0,0 +1,544 @@
+/* Test Grid::generalized_affine_image(lhs, rhs, modulus).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Tests 1 to 13 are equivalent to tests 1 to 13 in
+// generalizedaffineimage1.cc.
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*B, EQUAL, Linear_Expression::zero(), 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(1*B, Linear_Expression::zero(), 0) ***");
+
+  return ok;
+}
+
+// Simplest expression, with denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence(B %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, EQUAL, Linear_Expression::zero(), 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(2*B, Linear_Expression::zero()) ***");
+
+  return ok;
+}
+
+// Simple expression.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*B, EQUAL, A + 1, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A - B));
+  known_gr.add_grid_generator(grid_point(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(1*B, A + 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, EQUAL, A + 1, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(B, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, EQUAL, A + 1, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator and modulus.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(2*B, EQUAL, A + 1, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(2*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(2*B, A + 1, 3) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(-2*B, EQUAL, A + 2, 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-B, 2));
+  known_gr.add_grid_generator(grid_point(2*A + -3*B, 2));
+  known_gr.add_grid_generator(grid_point(-B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(-2*B, A + 2) ***");
+
+  return ok;
+}
+
+// Negative modulus.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*B, EQUAL, A + 2, -7);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*B));
+  known_gr.add_grid_generator(grid_point(A + 3*B));
+  known_gr.add_grid_generator(grid_point(9*B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(1*B, A + 2, -7) ***");
+
+  return ok;
+}
+
+// Expression of many variables.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, EQUAL, A - C + 2, 5);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + 3*B));
+  known_gr.add_grid_generator(grid_line(A + C));
+  known_gr.add_grid_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_grid_generator(grid_point(7*A));  // Transformation modulus.
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(1*A, A - C + 2, 5) ***");
+
+  return ok;
+}
+
+// Equality expression.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, EQUAL, A - C + 2, 0);
+
+  Grid known_gr = Grid(3);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+  known_gr.affine_image(A, A - C + 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(1*A, A - C + 2, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(4*A, EQUAL, A - 2*C + 3, 7);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, EQUAL, A + 2, 1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(1*A, EQUAL, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.generalized_affine_image(1*A, A + 2) ***");
+
+  return ok;
+}
+
+// Expressions both constants.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(Linear_Expression::zero(), EQUAL,
+                              Linear_Expression(1), 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, Linear_Expression(1), 1) ***");
+
+  return ok;
+}
+
+// Left hand side constant.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, A - B, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(5*A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(Linear_Expression::zero(), EQUAL, A - B, 5) ***");
+
+  return ok;
+}
+
+// Expressions with unique variables.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(A - B == 0);
+  gr.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, EQUAL, C, 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A + B));
+  known_gr.add_grid_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point(3*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - B, EQUAL, C, 1) ***");
+
+  return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, EQUAL, A);
+
+  Grid known_gr(2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - B, EQUAL, A) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 1);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A + 2*B, EQUAL, A - B, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(B, 2));
+  known_gr.add_grid_generator(grid_line(2*A - B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A + 2*B, EQUAL, A - B, 3) ***");
+
+  return ok;
+}
+
+// The equivalent of test1 from Polyhedron/generalizedaffineimage10.cc
+// (expressions with unique variables).
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(C == 0);
+  gr.add_constraint(A + 3*B == 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - C, EQUAL, B + 3, 0);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(A - C == B + 3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - C, EQUAL, B + 3, 0) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage3.cc b/tests/Grid/generalizedaffineimage3.cc
new file mode 100644
index 0000000..1d014ff
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage3.cc
@@ -0,0 +1,377 @@
+/* Test Grid::generalized_affine_image(var, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  gr.generalized_affine_image(B, LESS_OR_EQUAL, Linear_Expression::zero());
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(B, LESS_OR_EQUAL, Linear_Expression::zero()) ***");
+
+  return ok;
+}
+
+
+// Empty grid.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_generators(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, GREATER_OR_EQUAL, A - 2*C + 3, 4);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr,
+                   "*** gr.generalized_affine_image(A, GREATER_OR_EQUAL, A - 2*C + 3, 4) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, LESS_THAN, A + 2, 1, 0);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, LESS_THAN, A + 2, 1, 0) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(B, GREATER_OR_EQUAL, D + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(D, GREATER_OR_EQUAL, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The expression is not EQUAL and there is a non-zero modulus.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_image(A, GREATER_OR_EQUAL, A + 2, 1, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expressions having common variables.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_constraint(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B + C, GREATER_THAN, 2*A - B - C);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - B + C, GREATER_THAN, 2*A - B - C) ***");
+
+  return ok;
+}
+
+// Expressions where one variable is unaffected.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(A - B == 0);
+  gr.add_constraint(C == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A - B, GREATER_THAN, 2*A - 2*B, 0);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(C == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A - B, GREATER_THAN, 2*A - 2*B, 0) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_image(B + C, GREATER_THAN, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_image(A + D, GREATER_THAN, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Universe.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A, GREATER_THAN, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, GREATER_THAN , A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// The relation is not EQUAL and there is a non-zero modulus.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_image(A + D, GREATER_THAN, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty with congruences.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_image(A + B, LESS_THAN, A + 2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_image(A, LESS_THAN, A + 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage1.cc b/tests/Grid/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..f40e168
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage1.cc
@@ -0,0 +1,540 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence(B %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 0 ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 2);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 2) ***");
+
+  return ok;
+}
+
+// Simple expression, including positive modulus.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 3);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, Linear_Expression::zero(), 1, 3) ***");
+
+  return ok;
+}
+
+// Simple expression, including negative modulus.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, A + 1, 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 1, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    known_gr.add_grid_generator(grid_point());
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, EQUAL, A + 1, 1, -7);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 1, 1, -7) ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-3*A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    known_gr.add_grid_generator(grid_point(-A));
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, EQUAL, A + 1, 2, 3);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 1, 2, 3) ***");
+
+  return ok;
+}
+
+// Negative denominator.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2 = gr1;
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, A + 2, -2, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-2*A));
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 2, -2, 0) ***");
+
+  if (ok) {
+    print_congruences(gr2, "*** gr2 ***");
+
+    known_gr.add_grid_generator(grid_point());
+
+    // Congruence expression.
+    gr2.generalized_affine_preimage(B, EQUAL, A + 2, -2, 1);
+    ok = (gr2 == known_gr);
+  }
+
+  print_congruences(gr2, "*** gr2.generalized_affine_preimage(B, EQUAL, A + 2, -2, 1) ***");
+
+  return ok;
+}
+
+// Expression of many variables.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 5);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + 3*B));
+  known_gr.add_grid_generator(grid_line(3*A + C));
+  known_gr.add_grid_generator(grid_point(4*A));  // Original modulus.
+  known_gr.add_grid_generator(grid_point(7*A));  // Transformation modulus.
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 5) ***");
+
+  return ok;
+}
+
+// Equality expression.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((B %= 0) / 3);
+  gr.add_congruence((A - 2*C %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 0);
+
+  Grid known_gr = Grid(3);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A - 2*C %= 0) / 2);
+
+  known_gr.affine_preimage(A, A - C + 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, EQUAL, A - C + 2, 1, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, EQUAL, A - 2*C + 3, 4, 7);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, EQUAL, A - 2*C + 3, 4, 7) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, EQUAL, A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, EQUAL, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, EQUAL, D + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(D, EQUAL, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression with a 0 modulus, where the variable occurs in
+// the expression.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  // Equality expression.
+  gr.generalized_affine_preimage(B, EQUAL, A + B, 1, 0);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(2*B));
+  known_gr.add_grid_generator(parameter(A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(B, EQUAL, A + B, 1, 0) ***");
+
+  return ok;
+}
+
+// Expression with a negative modulus, where the variable occurs in
+// the expression.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(B, EQUAL, A + B, 1, -7);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(parameter(2*B));
+  known_gr.add_grid_generator(parameter(A + B));
+  known_gr.add_grid_generator(parameter(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(B, EQUAL, A + B, 1, -7) ***");
+
+  return ok;
+}
+
+// Test similar to test01 in
+// tests/Polyhedron/generalizedaffinepreimage2.cc
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A + B));
+  gr.add_grid_generator(grid_point(2*A));
+  gr.add_grid_generator(grid_point(2*A + 2*B));
+  gr.add_grid_generator(grid_point(3*A + B));
+
+  Grid known_gr(gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(B, EQUAL, B+2, 1, 5);
+
+  // A longer way of computing the generalized affine preimage below.
+  known_gr.add_space_dimensions_and_embed(1);
+  known_gr.add_congruence((B %= C+2) / 5);
+  Variables_Set vset;
+  vset.insert(B);
+  known_gr.remove_space_dimensions(vset);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A + 2*B, EQUAL, A - B, 3) ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage2.cc b/tests/Grid/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..d6f06c1
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage2.cc
@@ -0,0 +1,321 @@
+/* Test Grid::generalized_affine_preimage(lhs, rhs, modulus).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Expressions both constants.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL,
+                                 Linear_Expression(1), 1);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, Linear_Expression(1), 1) ***");
+
+  return ok;
+}
+
+// Left hand side constant.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence(A %= 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, A - B, 5);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A + B));
+  known_gr.add_grid_generator(grid_point(5*A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(Linear_Expression::zero(), EQUAL, A - B, 5) ***");
+
+  return ok;
+}
+
+// Expressions with unique variables.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(A - B == 0);
+  gr.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, EQUAL, C, 1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+  known_gr.add_grid_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_point(3*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, EQUAL, A, 0);
+
+  Grid known_gr(2);
+  known_gr.add_constraint(A == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A - B, EQUAL, A, 0) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 1);
+  gr.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A + 2*B, EQUAL, A - B, 3);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_constraint(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B + C, EQUAL, 2*A - B - C, 5);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A - B + C, EQUAL, 2*A - B - C, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((2*A - 2*B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B, 5) ***");
+
+  return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(2*A - 2*B, EQUAL, A - B, 5);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 5);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(2*A - 2*B, EQUAL, A - B, 5) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_preimage(B + C, EQUAL, D + 2, 1);
+ }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A + D, EQUAL, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expressions having common variables, with a negative modulus.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_constraint(A - B == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, EQUAL, C, -5);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((C %= 0) / 15);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A - B, EQUAL, C, -5) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/generalizedaffinepreimage3.cc b/tests/Grid/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..84722b5
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage3.cc
@@ -0,0 +1,462 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simplest expression.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence(B %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression::zero());
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression::zero() ***");
+
+  return ok;
+}
+
+// Simple expression, with denominator.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  // Equality expression.
+  gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(-3*A));
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_line(B));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.generalized_affine_preimage(B, EQUAL, A + 1, 2, 0) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(5, EMPTY);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, LESS_OR_EQUAL, A - 2*C + 3, 4);
+
+  Grid known_gr(5, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, LESS_OR_EQUAL, A - 2*C + 3, 4) ***");
+
+  return ok;
+}
+
+// Empty with congruences.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, LESS_THAN A + 2, 1) ***");
+
+  return ok;
+}
+
+// Universe.
+bool
+test05() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, LESS_THAN, A + 2, 1) ***");
+
+  return ok;
+}
+
+// Zero denominator.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, GREATER_OR_EQUAL, A + 2, 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Expression of a greater space dimension than the grid.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(B, GREATER_OR_EQUAL, D + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Variable of a greater space dimension than the grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(D, GREATER_OR_EQUAL, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The expression is not EQUAL and there is a non-zero modulus.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+  gr.add_congruence((A ==  0) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A, GREATER_OR_EQUAL, A + 2, 1, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// The variable occurs in the expression.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence(A %= 0);
+  gr.add_congruence((B %= 0) / 2);
+  gr.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  // Equality expression.
+  gr.generalized_affine_preimage(B, GREATER_THAN, A + B);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(2*B));
+  known_gr.add_grid_generator(parameter(A));
+  known_gr.add_grid_generator(parameter(3*C));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(B, GREATER_THAN, A + B) ***");
+
+  return ok;
+}
+
+// Expressions having common variables.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((C %= 0) / 3);
+  gr.add_constraint(A - 2*B == 1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B + C, GREATER_THAN, 2*A - B - C);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A - B + C, GREATER_THAN, 2*A - B - C) ***");
+
+  return ok;
+}
+
+// Expressions where one variable is unaffected.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(A - B == 0);
+  gr.add_constraint(C == 0);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A - B, GREATER_THAN, 2*A - 2*B, 0);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(C == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A - B, GREATER_THAN, 2*A - 2*B, 0) ***");
+
+  return ok;
+}
+
+// Right hand side expression of greater space dimension than the
+// grid.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence(C %= -2);
+
+  try {
+    gr.generalized_affine_preimage(B + C, GREATER_THAN, D + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Left hand side expression of space dimension greater than the grid.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A + D, GREATER_THAN, A + 2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Universe.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr(1);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A, GREATER_THAN, A + 2, 1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, GREATER_THAN , A + 2, 1, 1) ***");
+
+  return ok;
+}
+
+// The relation is not EQUAL and there is a non-zero modulus.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(3);
+  gr.add_congruence((C == -2) / 0);
+
+  try {
+    gr.generalized_affine_preimage(A + D, GREATER_THAN, A + 2, 1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty with congruences.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == 0);
+  gr.add_constraint(A == 3);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.generalized_affine_preimage(A + B, LESS_THAN, A + 2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.generalized_affine_preimage(A, LESS_THAN, A + 2) ***");
+
+  return ok;
+}
+
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/generator1.cc b/tests/Grid/generator1.cc
new file mode 100644
index 0000000..784e0cc
--- /dev/null
+++ b/tests/Grid/generator1.cc
@@ -0,0 +1,483 @@
+/* Test class Grid_Generator.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Point.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(A + 2*B + 3*C));
+
+  Grid_Generator b(grid_point(3*C + A + 2*B));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Point with divisor.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(A + 2*B + 3*C, 5));
+
+  Grid_Generator b(grid_point(15*C + 5*A + 10*B, 25));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Line.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_line(A + 2*B + 3*C));
+
+  Grid_Generator b(grid_line(15*C + 5*A + 10*B));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(A + 2*B + 3*C));
+
+  Grid_Generator b(parameter(2*B + 2*A - A + 3*C));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter with divisor.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(A + 2*B + 3*C, 4));
+
+  Grid_Generator b(parameter(6*B + 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Negative first coefficient.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(- A + 2*B + 3*C, 4));
+
+  Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Construction from Generator.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(- A + 2*B + 3*C, 4));
+
+  Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Construction from reference to Generator.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator g = grid_point(- A + 2*B + 3*C, 4);
+  Grid_Generator& g_ref = g;
+
+  Grid_Generator a(g_ref);
+
+  Grid_Generator b(grid_point(6*B - 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Create from empty linear expression.
+bool
+test09() {
+  Linear_Expression le;
+  Grid_Generator a(grid_point(le));
+
+  Grid_Generator b(grid_point(le));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter with negative divisor.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(-A - 2*B - 3*C, -4));
+
+  Grid_Generator b(parameter(6*B + 3*A + 9*C, 12));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Point with negative divisor.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(A + 2*B + 3*C, 5));
+
+  Grid_Generator b(grid_point(-15*C - 5*A - 10*B, -25));
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Parameter with zero divisor.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  try {
+    Grid_Generator a(parameter(-A - 2*B - 3*C, 0));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Point with zero divisor.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  try {
+    Grid_Generator a(grid_point(A + 2*B + 3*C, 0));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Line.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  try {
+    Grid_Generator a(grid_line(0*A + 0*B + 0*C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// is_equivalent_to() and is_equal_to(): generators have different types
+bool
+test15() {
+  Variable A(0);
+
+  Grid_Generator a(grid_point(A));
+  Grid_Generator b(grid_point(A, 2));
+  Grid_Generator c(parameter(A));
+  Grid_Generator d(grid_line(A));
+  Grid_Generator e(grid_point(2*A, 4));
+  Grid_Generator f(parameter(2*A, 2));
+
+  bool ok = (!c.is_equivalent_to(d));
+  ok &= (!a.is_equivalent_to(b));
+  ok &= (!c.is_equal_to(d));
+  ok &= (!a.is_equal_to(b));
+  ok &= (b.is_equal_to(e));
+  ok &= (!c.is_equal_to(f));
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+  print_generator(c, "*** c ***");
+  print_generator(d, "*** d ***");
+  print_generator(e, "*** e ***");
+  print_generator(f, "*** f ***");
+
+  return ok;
+}
+
+// is_equivalent_to(): generators have different space dimensions
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator a(grid_point(A));
+  Grid_Generator b(grid_point(B));
+  Grid_Generator c(parameter(A));
+  Grid_Generator d(parameter(B));
+  Grid_Generator e(grid_line(B));
+  Grid_Generator f(grid_line(A));
+
+  bool ok = (!a.is_equivalent_to(b));
+  ok &= (!c.is_equivalent_to(d));
+  ok &= (!e.is_equivalent_to(f));
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+  print_generator(c, "*** c ***");
+  print_generator(d, "*** d ***");
+  print_generator(e, "*** e ***");
+  print_generator(f, "*** f ***");
+
+  return ok;
+}
+
+// Getting coefficients of dimensions and rebuilding a generator from
+// them. This is based on Example 6 in Grid_Generator_defs.hh
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(grid_point(2*A - B + 3*C, 2));
+  print_generator(a, "*** a ***");
+
+  Linear_Expression e;
+
+  for (dimension_type i = a.space_dimension(); i-- > 0; )
+    e += (i + 1) * a.coefficient(Variable(i)) * Variable(i);
+  Grid_Generator b = parameter(e, 2);
+
+  Grid_Generator c(parameter(2*A - 2*B + 9*C, a.divisor()));
+
+  bool ok = (b.is_equivalent_to(c));
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Copy construction of a grid generator.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator a(parameter(A - 2*B + 3*C, -2));
+
+  Grid_Generator b(a);
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Method zero_dim_point.
+bool
+test19() {
+  Grid_Generator a(Grid_Generator::zero_dim_point());
+
+  Grid_Generator b(grid_point());
+
+  bool ok = (a == b);
+
+  print_generator(a, "*** a ***");
+  print_generator(b, "*** b ***");
+
+  return ok;
+}
+
+// Method `type'.
+bool
+test20() {
+  Variable C(2);
+
+  Grid_Generator::Type a = grid_point(2*C).type();
+
+  Grid_Generator::Type b = grid_point(3*C).type();
+
+  bool ok = (a == b);
+
+  nout << "*** a ***" << a << std::endl;
+  nout << "*** b ***" << b << std::endl;
+
+  return ok;
+}
+
+// Exception when trying to get the divisor of a line.
+bool
+test21() {
+  Variable C(2);
+
+  Grid_Generator a = grid_line(2*C);
+
+  print_generator(a, "*** a ***");
+
+  try {
+    a.divisor();
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test22() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  bool ok = (grid_point(A - B - 2*C) == grid_point(A - B - 2*C));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+END_MAIN
diff --git a/tests/Grid/generators1.cc b/tests/Grid/generators1.cc
new file mode 100644
index 0000000..07f8eab
--- /dev/null
+++ b/tests/Grid/generators1.cc
@@ -0,0 +1,471 @@
+/* Test Grid::generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(7, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(7);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(grid_point(7*B));
+  gr1.add_grid_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// 3D rectilinear grid defined by congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 10);
+  gr1.add_congruence((B %= 10) / 0);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Get a reference to the empty generators, add a point, use the
+// reference to create a new grid.
+bool
+test07() {
+  Grid gr1(3, EMPTY);
+
+  const Grid_Generator_System& gs = gr1.grid_generators();
+
+  // Add a point.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_grid_generator(grid_point());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe generators,
+// empty the grid, and then use the reference to create a new grid.
+bool
+test08() {
+  Grid gr1(0);
+
+  const Grid_Generator_System& gs = gr1.grid_generators();
+
+  // Empty the grid.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Empty grid, where updating the generators finds the grid empty.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(7);
+  gr1.add_constraint(A == 1);
+  gr1.add_constraint(A == 0);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Skew grid in 3D defined with generators with a non-integral parameter.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*B, 2));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(parameter(11*B, 2));
+  gr1.add_grid_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Grid defined with an integral point but non-integral parameter.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(parameter(11*B, 2));
+  gr1.add_grid_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// Grid defined with an integral point and parameter.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(parameter(11*B));
+  gr1.add_grid_generator(grid_line(C));
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+// inserted generator system has more space dimensions that
+// the old generator system.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A, 2));
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(5*A + 2*B, 3));
+  gs1.insert(parameter(11*C, 2));
+
+  gs.insert(gs1, Recycle_Input());
+
+  Grid gr(gs);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*A, 2));
+  known_gr.add_grid_generator(grid_point(5*A + 2*B, 3));
+  known_gr.add_grid_generator(parameter(11*C, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// test clear() for nonempty generator system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A, 2));
+  gs.insert(grid_point(5*A + 2*B, 3));
+  gs.insert(parameter(11*C, 2));
+
+  print_generators(gs, "*** gs ***");
+
+  gs.clear();
+
+  Grid gr(gs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+  nout << "gr.space_dimension = " << gr.space_dimension() << endl;
+
+  return ok;
+}
+
+// test clear() for empty generator system.
+// This test showed a bug in the code for clear() in
+// Grid_Generator_System_inlines.hh which is now corrected.
+bool
+test15() {
+  Grid_Generator_System gs;
+
+  print_generators(gs, "*** gs ***");
+
+  gs.clear();
+
+  Grid gr(gs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+  nout << "gr.space_dimension = " << gr.space_dimension() << endl;
+
+  return ok;
+}
+
+// space_dimension
+bool
+test16() {
+  Variable A(3);
+  Variable B(7);
+  Variable C(4);
+
+  Grid_Generator_System ggs(grid_point(A - 3*B + 21*C, 21));
+
+  bool ok = (ggs.space_dimension() == 8);
+
+  print_generators(ggs, "*** ggs ***");
+
+  return ok;
+}
+
+// Recycling_insert
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System ggs1;
+  ggs1.insert(parameter(11*B));
+  ggs1.insert(grid_line(C));
+  ggs1.insert(grid_point(3*B));
+
+  Grid_Generator_System ggs;
+  ggs.insert(ggs1, Recycle_Input());
+  print_generators(ggs, "*** ggs ***");
+
+  Grid gr(ggs);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*B));
+  known_gr.add_grid_generator(parameter(11*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(ggs} ***");
+
+  return ok;
+}
+
+// Comparing Systems with different space dimensions
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable E(4);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(3*B));
+  ggs.insert(grid_line(E));
+  print_generators(ggs, "*** ggs ***");
+
+  Grid gr(ggs);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(3*B));
+  known_gr.add_grid_generator(parameter(11*B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  bool ok = (gr != known_gr);
+
+  print_generators(gr, "*** gr(ggs} ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST_F8(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Grid/generators2.cc b/tests/Grid/generators2.cc
new file mode 100644
index 0000000..8a6e8a7
--- /dev/null
+++ b/tests/Grid/generators2.cc
@@ -0,0 +1,56 @@
+/* Test class Grid_Generator_System.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// recycling_insert(g) where the dimension of g is greater than the
+// generator system.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs(1);
+
+  Grid_Generator g = grid_point(A + B);
+
+  gs.insert(g, Recycle_Input());
+
+  print_generators(gs, "*** gs ***");
+
+  Grid_Generator_System known_gs(grid_point(A + B));
+
+  bool ok = (gs == known_gs);
+
+  print_generators(known_gs, "*** known_gs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/grid1.cc b/tests/Grid/grid1.cc
new file mode 100644
index 0000000..3f6f6f8
--- /dev/null
+++ b/tests/Grid/grid1.cc
@@ -0,0 +1,839 @@
+/* Test reduction and conversion of grids created from generators.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_grid_generator, one variable.
+bool
+test01() {
+  Variable A(0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generator(grid_point(2*A));
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr,
+                    "*** gr.add_grid_generator(grid_point(2*A)) ***");
+
+  return ok;
+}
+
+// add_grid_generator, two variables.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  Grid_Generator g(grid_point(A + 2*B));
+  gr.add_grid_generator(g);
+
+  Congruence_System known_cgs;
+  known_cgs.insert( 0*A + 0*B %= -1);
+  known_cgs.insert((  A + 0*B %=  1) / 0);
+  known_cgs.insert( 0*A + 1*B %=  1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generator(g) ***");
+
+  return ok;
+}
+
+// add_grid_generators
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_line(0*A +   B));
+  gs.insert(grid_point(3*A + 4*B));
+  gs.insert(grid_point(9*A + 0*B));
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_line(0*A +   B));
+  known_gs.insert(grid_point(3*A + 4*B));
+  known_gs.insert(grid_point(9*A + 0*B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(4*A -   B + 0*C, 3));
+  gs.insert(grid_line(2*A + 3*B + 0*C));
+  gs.insert(grid_point(4*A + 0*B + 0*C, 3));
+  gs.insert(grid_point(4*A -   B +   C, 3));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A + 0*B + 0*C %= -2) / 2);
+  known_cgs.insert((-9*A + 6*B + 0*C %= 14) / 2);
+  known_cgs.insert(( 0*A - 0*B + 6*C %=  0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+  gs.insert(grid_line( 3*A + 2*B - 4*C));
+  gs.insert(grid_line( 0*A + 0*B - 2*C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(0*A + 0*B + 0*C %= -1);
+  known_cgs.insert((-2*A + 3*B + 0*C %= 7) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 4*B +  3*C, 2));
+  gs.insert(grid_point( 2*A + 6*B -    C, 2));
+  gs.insert(grid_point(-1*A + 9*B +  7*C, 2));
+  gs.insert(grid_line( 0*A + 0*B -  2*C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((  0*A + 0*B + 0*C %=  15) / 15);
+  known_cgs.insert((-10*A + 0*B + 0*C %=   5) / 15);
+  known_cgs.insert((  4*A - 6*B + 0*C %= -14) / 15);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 4*B + 3*C, 2));
+  gs.insert(grid_line( 2*A +   B - 2*C));
+  gs.insert(grid_point(-1*A + 9*B + 7*C, 2));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A + 0*B + 0*C %= -10) / 10);
+  known_cgs.insert((-2*A + 4*B + 0*C %=   9) / 10);
+  known_cgs.insert(( 7*A - 4*B + 5*C %=  -4) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(2*A));
+  gs.insert(grid_point(A + B));
+  gs.insert(grid_point(A + C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(A %= 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert(C %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A +   B));
+  gs.insert(grid_point(A + 2*B));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 1) / 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert((C %= 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A +   B + 0*C));
+  gs.insert(grid_point(A + 2*B + 0*C));
+  gs.insert(grid_point(A +   B +   C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %=  1) / 0);
+  known_cgs.insert(B %= 0);
+  known_cgs.insert(C %= 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*A + 7*B + 0*C, 3));
+  gs.insert(grid_line(3*A + 2*B + 0*C));
+  gs.insert(grid_line(0*A + 0*B +   C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A + 0*B + 0*C %= -1) / 1);
+  known_cgs.insert((-2*A + 3*B + 0*C %=  7) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-1*A + 0*B + 3*C, 4));
+  gs.insert(grid_line( 3*A + 2*B + 0*C));
+  gs.insert(grid_line( 0*A + 0*B +   C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((-4*A + 6*B + 0*C %= 1) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// Empty grid, one dimension.
+bool
+test13() {
+  Grid gr(1, EMPTY);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(1, EMPTY) ***");
+
+  return ok;
+}
+
+// Empty grid, many dimensions.
+bool
+test14() {
+  Grid gr(112, EMPTY);
+
+  Grid known_gr(112, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(112, EMPTY) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( -A + 0*B + 3*C, 4));
+  gs.insert(grid_line(0*A + 2*B + 0*C));
+  gs.insert(grid_line(0*A + 4*B + 0*C));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((4*A + 0*B + 0*C %= -1) / 0);
+  known_cgs.insert((0*A + 0*B + 4*C %=  3) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(   A));
+  gs.insert(grid_point( 2*A +    B));
+  gs.insert(grid_point(12*A + 11*B));
+  gs.insert(grid_point(10*A + 12*B));
+  gs.insert(grid_point( 2*A + 33*B, 2));
+  gs.insert(grid_point( 4*A + 35*B, 2));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((C %= 0) / 0);
+  known_cgs.insert((-2*A + 2*B %= 1) / 3);
+  known_cgs.insert(( 3*A %= 0) / 3);
+  known_cgs.insert(( 0*A %= 3) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(4*A -   B + 0*C, 3));
+  gs.insert(grid_line(2*A + 3*B));
+  gs.insert(grid_point(4*A            , 3));
+  gs.insert(grid_point(4*A -   B +   C, 3));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((-9*A + 6*B + 0*C %= 0) / 2);
+  known_cgs.insert((             6*C %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// Universe grid, one dimension.
+bool
+test18() {
+  Grid gr(1);
+
+  Grid known_gr(1);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(1) ***");
+
+  return ok;
+}
+
+// Universe grid, many dimensions.
+bool
+test19() {
+  Grid gr(21);
+
+  Grid known_gr(21);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(21) ***");
+
+  return ok;
+}
+
+// Universe grid, zero dimensions.
+bool
+test20() {
+  Grid gr(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(0) ***");
+
+  return ok;
+}
+
+// Using large values for the coordinates
+bool
+test21() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-9933*A + 2000*B + 3953*C, 9113));
+  gs.insert(grid_point(    0*A +    0*B + 8888*C, 7302));
+  gs.insert(grid_point(   29*A +   23*B + 1111*C, 1010));
+  gs.insert(grid_point( 2394*A + 7273*B +    0*C,   30));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+
+  // Create coefficients with string constructors as they're too big
+  // for the long type.
+
+  // 37315344498526  0  0  0  congruence, modulus = 37315344498526
+  // 0  343455281759218112380  0  0  congruence, modulus = 37315344498526
+  // 0  -133815138923073144612  223892066991156  0  congruence, modulus = 37315344498526
+  // -22220  -31385495955559489171  93798931757298  18255  congruence, modulus = 37315344498526
+
+  Coefficient* tem1 = new Coefficient("37315344498526");
+  known_cgs.insert((     0*A +     0*B +     0*C %= -*tem1) / *tem1);
+
+  Coefficient* tem2 = new Coefficient("343455281759218112380");
+  known_cgs.insert(( *tem2*A +     0*B +     0*C %= 0) / *tem1);
+  delete tem2;
+
+  tem2 = new Coefficient("-133815138923073144612");
+  Coefficient* tem3 = new Coefficient("223892066991156");
+  known_cgs.insert(( *tem2*A + *tem3*B +     0*C %= 0) / *tem1);
+  delete tem2; delete tem3;
+
+  tem2 = new Coefficient("-31385495955559489171");
+  tem3 = new Coefficient("93798931757298");
+  known_cgs.insert(( *tem2*A + *tem3*B + 18255*C %= 22220) / *tem1);
+  delete tem1; delete tem2; delete tem3;
+
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  //print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// Using large values for the coefficients.
+bool
+test22() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(-93*A +   0*B +  39*C, 113));
+  gs.insert(grid_line( 29*A +  23*B + 111*C));
+  gs.insert(grid_point(117*A + 200*B +  88*C, 33));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((       0*A +       0*B +      0*C %=  280730) / 280730);
+  known_cgs.insert((  -85767*A +  108141*B +      0*C %=   70587) / 280730);
+  known_cgs.insert((-2309489*A + 1557137*B + 280730*C %= 1997619) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test23() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( 3*A +   B + 0*C, 4));
+  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert(( 0*A +  0*B +  0*C %= -40) / 40);
+  known_cgs.insert((20*A +  0*B +  0*C %=  15) / 40);
+  known_cgs.insert((-4*A + 32*B +  0*C %=   5) / 40);
+  known_cgs.insert(( 0*A +  0*B + 80*C %=   0) / 40);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test24() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point( 3*A +   B + 0*C, 4));
+  gs.insert(grid_point(11*A + 2*B + 0*C, 4));
+  gs.insert(grid_point( 3*A + 6*B + 0*C, 4));
+  gs.insert(grid_point( 3*A +   B + 2*C, 4));
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((20*A +  0*B        %= 15) / 40);
+  known_cgs.insert((-4*A + 32*B        %=  5) / 40);
+  known_cgs.insert((              80*C %=  0) / 40);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// add_grid_generators, with more rows than columns.
+bool
+test25() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(3*A + 7*B - 2*C + 3*D));
+  gs.insert(grid_point(0*A + 0*B +   C +   D));
+  gs.insert(grid_point(3*A + 4*B + 2*C + 0*D));
+  gs.insert(grid_point(3*A + 2*B +   C + 2*D));
+  gs.insert(grid_point(9*A + 0*B + 4*C +   D));
+
+  Grid gr(4, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((  9*A +   0*B +  0*C + 0*D %=   0) / 27);
+  known_cgs.insert((-18*A +  27*B +  0*C + 0*D %=   0) / 27);
+  known_cgs.insert((-90*A + 135*B + 27*C + 0*D %=  27) / 27);
+  known_cgs.insert((-17*A +  25*B +  6*C +   D %=   7) / 27);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test26() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(2*A + 0*B));
+  gs.insert(grid_point(30*A + 36*B));
+  gs.insert(grid_point(450*A + 564*B));
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.add_grid_generators(gs);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 2) / 28);
+  known_cgs.insert((B %= 0) / 12);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_grid_generators(gs) ***");
+
+  return ok;
+}
+
+// A generator system with only a line.
+bool
+test27() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_line(0*A + 2*B + 0*C));
+
+  try {
+    Grid gr(gs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// A generator system containing a parameter.
+bool
+test28() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*C));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(parameter(-C));
+
+  Grid gr(gs);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr(gs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST_F64(test21);
+  DO_TEST_F32(test22);
+  DO_TEST_F8(test23);
+  DO_TEST_F8(test24);
+  DO_TEST_F8(test25);
+  DO_TEST_F8(test26);
+  DO_TEST(test27);
+  DO_TEST(test28);
+END_MAIN
diff --git a/tests/Grid/grid2.cc b/tests/Grid/grid2.cc
new file mode 100644
index 0000000..1d22076
--- /dev/null
+++ b/tests/Grid/grid2.cc
@@ -0,0 +1,634 @@
+/* Test reduction and conversion of grids created from congruences.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_congruence, one dimension.
+bool
+test01() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+
+  Grid gr(cgs);
+
+  Congruence cg(A %= 0);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruence(cg);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A));
+  known_gs.insert(grid_point(2*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence(cg) ***");
+
+  return ok;
+}
+
+// add_congruence, two dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A - 3*B %= 4) / 5);
+
+  Grid gr(cgs);
+
+  Congruence cg((2*A - B %= 3) / 4);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruence(cg);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A - 15*B, 5));
+  known_gs.insert(grid_point(  A + 27*B, 5));
+  known_gs.insert(grid_point(0*A + 85*B, 5));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruence(cg) ***");
+
+  return ok;
+}
+
+// add_congruences, one dimension.
+bool
+test03() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 3);
+
+  Grid gr(1);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*A));
+  known_gs.insert(grid_point(3*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_congruences, one dimension with factors.
+bool
+test04() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 7) / 3);
+
+  Grid gr(1);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(1*A));
+  known_gs.insert(grid_point(4*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_congruences, two dimensions.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 0) / 3);
+
+  Grid gr(2);
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(3*A));
+  known_gs.insert(grid_point(3*B));
+  known_gs.insert(grid_line(A + B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(A + B %= 0);
+  cgs.insert(A + B + C %= 0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(A));
+  known_gs.insert(grid_point(B));
+  known_gs.insert(grid_point(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(  -A %= 64);
+  cgs.insert(-6*A +   B + 0*C %= -8);
+  cgs.insert( 3*A + 2*B +   C %= -4);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(A));
+  known_gs.insert(grid_point(B));
+  known_gs.insert(grid_point(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Adding a false equality.
+bool
+test08() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert((0*A %= -1) / 0);
+  cgs.insert((  A %= -1) / 2);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+ }
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A         %= 0) / 2);
+  cgs.insert((    B     %= 0) / 2);
+  cgs.insert((A + B + C %= 0) / 2);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(2*A));
+  known_gs.insert(grid_point(2*B));
+  known_gs.insert(grid_point(2*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*B +   C %= -2) / 5);
+  cgs.insert((    3*B       %=  0) / 5);
+  cgs.insert((      B       %=  0) / 5);
+  cgs.insert((          3*C %= -4) / 5);
+  cgs.insert((    3*B +   C %= -3) / 5);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(  A       - 3*C));
+  known_gs.insert(grid_point(6*A       - 3*C));
+  known_gs.insert(grid_point(  A + 5*B - 3*C));
+  known_gs.insert(grid_point(  A       + 2*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A           %= -2) / 5);
+  cgs.insert((      B + 2*C %=  0) / 5);
+  cgs.insert((    2*B + 3*C %= -3) / 5);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(-2*A -  3*B - 6*C, 3));
+  known_gs.insert(grid_point( 3*A -  3*B - 6*C, 3));
+  known_gs.insert(grid_point(-2*A + 12*B - 6*C, 3));
+  known_gs.insert(grid_point(-2*A -  3*B + 9*C, 3));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 1) / 0);
+  cgs.insert((B %= 1) / 0);
+  cgs.insert((C %= 1) / 0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(A + B + C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 1) / 0);
+  cgs.insert(B %= 1);
+  cgs.insert((C %= 1) / 0);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(A + C));
+  known_gs.insert(grid_point(A + B + C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// An empty grid constructed from congruences.
+bool
+test14() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((C %= 2) / 5);
+  cgs.insert((C %= 3) / 5);
+
+  Grid gr(3);
+  print_congruences(gr, "*** gr ***");
+  gr.add_congruences(cgs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Adding a congruence system with a capacity larger than the capacity
+// of the existing system.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert(B %= 2);
+
+  Grid gr(2);
+  gr.add_congruences(cgs1);
+
+  gr.add_space_dimensions_and_embed(1);
+  print_congruences(gr, "*** gr ***");
+
+  // gr.con_sys is likely to be expanded within capacity.
+
+  Congruence_System cgs2;
+  cgs2.insert(C %= 2);
+
+  // cgs2 is likely to now have more capacity than gr.con_sys does.
+
+  gr.add_congruences(cgs2);
+
+  Congruence_System cgs3;
+  cgs3.insert(B %= 2);
+  cgs3.insert(C %= 2);
+
+  Grid known_gr(cgs3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_congruences(cgs2) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+
+bool
+test16() {
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_false());
+
+  Grid gr(cgs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_integrality());
+
+  Grid gr(cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruence, add empty system to zero dimension
+// universe.
+bool
+test18() {
+  Grid gr(0);
+
+  Congruence_System cgs;
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+// add_recycled_congruence, zero dimension empty.
+bool
+test19() {
+  Grid gr(0);
+
+  Congruence_System cgs;
+  cgs.insert(Congruence::zero_dim_false());
+  print_congruences(gr, "*** gr ***");
+
+  gr.add_recycled_congruences(cgs);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.add_recycled_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A             %= -2) / 3);
+  cgs.insert((5*A + 9*B +   C %= -1) / 3);
+  cgs.insert((        B + 3*C %= -2) / 3);
+  cgs.insert((      2*B + 3*C %= -2) / 3);
+
+  Grid gr(3);
+
+  gr.add_congruences(cgs);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(-2*A + 0*B +  7*C, 3));
+  known_gs.insert(grid_point( 1*A + 0*B +    C, 3));
+  known_gs.insert(grid_point(-2*A + 9*B +  7*C, 3));
+  known_gs.insert(grid_point(-2*A + 0*B + 16*C, 3));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+// OK(true) and OK(false) test.
+bool
+test21() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((3*A %= 2) / 3);
+
+  Grid gr(3);
+
+  gr.add_congruences(cgs);
+
+  bool ok = (gr.OK(true) && gr.OK(false));
+  print_generators(gr, "*** gr.add_congruences(cgs) ***");
+
+  Grid gr1(1, EMPTY);
+
+  if (ok)
+    ok = (gr1.OK(false));
+  print_generators(gr1, "*** gr1(1, EMPTY) ***");
+
+  Grid gr2(0);
+
+  if (ok)
+    ok = (gr2.OK(true) && gr2.OK(false));
+  print_generators(gr2, "*** gr2(0) ***");
+
+  return ok;
+}
+
+// Non-zero dimension universe when there are two congruences.
+// This showed a bug in Grid_simplify which is now corrected.
+bool
+test22() {
+  Variable A(0);
+  Variable B(1);;
+
+  Congruence_System cgs1(0*A == 0);
+  cgs1.insert(0*B == 0);
+  print_congruences(cgs1, "*** cgs1 ***");
+
+  Grid gr(cgs1);
+  print_congruences(gr, "*** gr(cgs1) ***");
+
+  Grid known_gr(2);
+  print_congruences(known_gr, "*** known_gr ***");
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST_F8(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+END_MAIN
diff --git a/tests/Grid/grid3.cc b/tests/Grid/grid3.cc
new file mode 100644
index 0000000..673e6b5
--- /dev/null
+++ b/tests/Grid/grid3.cc
@@ -0,0 +1,275 @@
+/* Test construction of grids from constraints.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(cs)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B == 0);
+
+  Grid gr(cs);
+
+  Grid known_gr(2);
+  known_gr.add_constraint(B == 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  return ok;
+}
+
+
+// Building from an inequality exception.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+
+  cs.insert(A >= B);
+
+  try {
+    Grid gr(cs);
+   }
+  catch (const std::invalid_argument& e) {
+    nout << "cs contains an inequality constraint: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Grid(cs), cs empty and resulting grid universe.
+bool
+test03() {
+
+  Constraint_System cs;
+  print_constraints(cs, "*** cs ***");
+
+  Grid gr(cs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  return ok;
+}
+
+// Grid(const cs)
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(2*B == A);
+  cs.insert(0*C == 0);
+
+  const Constraint_System ccs = cs;
+
+  Grid gr(ccs);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(2*B == A);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(ccs) ***");
+
+  return ok;
+}
+
+// Grid(const cs), resulting grid empty.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(2*B == A);
+  cs.insert(2*B == 0);
+  cs.insert(A == 1);
+  cs.insert(C == 4);
+
+  const Congruence_System cgs(cs);
+
+  Grid gr(cgs);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr(cgs) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test06() {
+  try {
+    Grid gr(Constraint_System::max_space_dimension() + 1);
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Assignment of universe grid, zero dimensions.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  gr = Grid(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+  try {
+    Grid gr(Grid::max_space_dimension() + 1);
+  }
+  catch (const std::length_error& e) {
+    nout << "length_error: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Create grid from empty zero dimension constraint system.
+bool
+test09() {
+  Constraint_System cs(Constraint::zero_dim_false());
+
+  Grid gr(cs);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  Grid known_gr(0, EMPTY);
+
+  print_congruences(known_gr, "*** known_gr ***");
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
+// Create grid from universe zero dimension constraint system.
+bool
+test10() {
+  Constraint_System cs(Constraint::zero_dim_positivity());
+
+  Grid gr(cs);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  Grid known_gr(0);
+
+  print_congruences(known_gr, "*** known_gr ***");
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
+// Create grid from const empty zero dimension constraint system.
+bool
+test11() {
+  const Constraint_System cs(Constraint::zero_dim_false());
+
+  Grid gr(cs);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  Grid known_gr(0, EMPTY);
+
+  print_congruences(known_gr, "*** known_gr ***");
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
+// Create grid from const universe zero dimension constraint system.
+bool
+test12() {
+  const Constraint_System cs(Constraint::zero_dim_positivity());
+
+  Grid gr(cs);
+
+  print_congruences(gr, "*** gr(cs) ***");
+
+  Grid known_gr(0);
+
+  print_congruences(known_gr, "*** known_gr ***");
+
+  bool ok = (gr == known_gr);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/griddifference1.cc b/tests/Grid/griddifference1.cc
new file mode 100644
index 0000000..8555d4d
--- /dev/null
+++ b/tests/Grid/griddifference1.cc
@@ -0,0 +1,350 @@
+/* Test Grid::difference_assign() (a.k.a. Grid::difference_assign()).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grids.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence(A %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 2);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(1, EMPTY);
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(3*A));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test02() {
+  Grid gr1;
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2;
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// First contained in second.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A - B %= 0) / 3);
+  gr1.add_congruence((A %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence(B %= 0);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second contains single equality.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A - B %= 0) / 3);
+  gr1.add_congruence((A %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_constraint(A == 5);
+
+  Grid known_gr(gr1);
+
+  gr1.difference_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// First empty.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A + 2*B %= 0);
+
+  Grid gr2(2, EMPTY);
+
+  Grid known_gr(gr1);
+
+  gr1.difference_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second empty.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A + 2*B %= 0);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// More complex example, from generators.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(A - 2*C));
+  gr1.add_grid_generator(grid_point(3*B));
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(grid_point(A + 2*C));
+  gr2.add_grid_generator(grid_point(3*A));
+  gr2.add_grid_generator(grid_point(A + 3*B));
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(3);
+  known_gr.add_constraint(2*A + C == 0);
+  known_gr.add_congruence((B %= 0) / 3);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension grids.
+bool
+test08() {
+  Grid gr1(0);
+
+  Grid gr2(0);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// The smallest resulting grid is the first grid, even though the
+// first grid has more points than the second.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_line(A));
+  gr1.add_grid_generator(grid_point(B));
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((B %= 0) / 3);
+
+  Grid known_gr(gr1);
+
+  gr1.difference_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Simpler example where the resulting grid contains points.
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(grid_point(B));
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A - B %= 0) / 2);
+  gr2.add_congruence(A %= 0);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 1) / 2);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Where the 2-complements of more than one congruence are added to
+// the result.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_constraint(B == 0);
+  gr1.add_constraint(C == 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A + C %= 0) / 4);
+  gr2.add_congruence((A + B %= 0) / 4);
+
+  gr1.difference_assign(gr2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((A %= 2) / 4);
+  known_gr.add_constraint(B == 0);
+  known_gr.add_constraint(C == 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.difference_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+
+  Grid gr2(4);
+  gr2.add_constraint(A == 0);
+  gr2.add_constraint(B == 0);
+  gr2.add_constraint(C == 0);
+
+  try {
+    gr1.difference_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/intersection1.cc b/tests/Grid/intersection1.cc
new file mode 100644
index 0000000..691c415
--- /dev/null
+++ b/tests/Grid/intersection1.cc
@@ -0,0 +1,316 @@
+/* Test Grid::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grids, one dimensions.
+bool
+test01() {
+  Variable A(0);
+
+  Congruence_System cgs1;
+  cgs1.insert((A %= 1) / 2);
+
+  Congruence_System cgs2;
+  cgs2.insert((A %= 0) / 3);
+
+  Grid gr1(cgs1);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 3) / 6);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Simple grids, many dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert((A + 0*C %= 0) / 2);
+
+  Congruence_System cgs2;
+  cgs2.insert((B + 0*C %= 0) / 2);
+
+  Grid gr1(cgs1);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A + 0*C %= 0) / 2);
+  known_cgs.insert((B %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((B + 0*C %= 0) / 2);
+
+  Grid gr1(3, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((B + 0*C %= 0) / 2);
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(3, EMPTY);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid universe.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+  Grid gr1(3, UNIVERSE);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(cgs);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid universe.
+bool
+test06() {
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((2*B + 2*C %= 1) / 3);
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(3, UNIVERSE);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((2*B + 2*C %= 1) / 3);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension grids.
+
+bool
+test07() {
+  Congruence_System cgs;
+  Linear_Expression le;
+  cgs.insert((le %= le) / 1);   // (0 %= 0) / 1
+
+  Grid gr1(cgs);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(0, UNIVERSE);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Many dimensioned grids from generators.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A + C));
+  gs1.insert(grid_line(C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A));
+  gs2.insert(grid_point(A + B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generators(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.intersection_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((C == 0) / 0);
+  known_cgs.insert((A == 1) / 0);
+  known_cgs.insert((B == 0) / 0);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.intersection_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+
+  Grid gr2(3);
+
+  try {
+    gr1.intersection_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Both empty and both not in minimal form.
+bool
+test10() {
+  Variable A(0);
+  Grid gr1(1);
+  gr1.add_congruence((A %= 1) / 2);
+  gr1.add_congruence((A %= 0) / 2);
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((A %= 0) / 2);
+
+  gr1.intersection_assign(gr2);
+  bool ok = (gr1.is_empty());
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/isempty1.cc b/tests/Grid/isempty1.cc
new file mode 100644
index 0000000..8c52503
--- /dev/null
+++ b/tests/Grid/isempty1.cc
@@ -0,0 +1,294 @@
+/* Test Grid::is_empty().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension.
+bool
+test01() {
+  Grid gr(1, EMPTY);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Many dimensions.
+bool
+test02() {
+  Grid gr(6, EMPTY);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test03() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test04() {
+  Grid gr(0);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid.
+
+bool
+test05() {
+  Grid gr(2);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty grid of congruences.
+bool
+test07() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of generators.
+bool
+test08() {
+  Variable A(0);
+  Variable E(4);
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+
+  Grid gr(gs);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid of generators.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(C));
+  gs.insert(grid_line(D));
+  gs.insert(grid_line(E));
+
+  Grid gr(5);
+  gr.add_grid_generators(gs);
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized empty congruences.
+bool
+test11() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized universe congruences.
+
+bool
+test12() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe after remove_space_dimensions.
+bool
+test13() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr.remove_space_dimensions(vars);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty from a simple constraint.
+bool
+test14() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(0*C == 1);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+
+  bool ok = (gr.is_empty());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Grid/isuniverse1.cc b/tests/Grid/isuniverse1.cc
new file mode 100644
index 0000000..5a03998
--- /dev/null
+++ b/tests/Grid/isuniverse1.cc
@@ -0,0 +1,322 @@
+/* Test Grid::is_universe().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// One dimension.
+bool
+test01() {
+  Grid gr(1);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Many dimensions.
+
+bool
+test02() {
+  Grid gr(6);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+
+bool
+test04() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty grid.
+
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of congruences.
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid of congruences.
+
+bool
+test07() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 6) / 3);
+
+  Grid gr(cgs);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Grid of generators.
+
+bool
+test08() {
+  Variable A(0);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+
+  Grid gr(gs);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe grid of generators.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(A + 3*E));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(C));
+  gs.insert(grid_line(D));
+  gs.insert(grid_line(E));
+
+  Grid gr(gs);
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized congruences.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + B + C %= 0) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized universe congruences.
+bool
+test11() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 3) / 3);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Minimized universe congruences.
+bool
+test12() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Universe after remove_space_dimensions.
+
+bool
+test13() {
+  Variable A(0);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*C %= 4) / 2);
+
+  Grid gr(cgs);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  gr.remove_space_dimensions(vars);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Empty from a simple constraint.
+
+bool
+test14() {
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert(0*C == 0);
+
+  Grid gr(cgs);
+
+  // Minimize the congruences.
+  gr.minimized_congruences();
+
+  bool ok = (gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Congruences before minimization, where a point is required to
+// determine that the grid is a strict subset of the universe.
+
+bool
+test15() {
+  Variable A(0);
+
+  Congruence_System cgs;
+  cgs.insert(A == 3);
+
+  Grid gr(cgs);
+
+  bool ok = (!gr.is_universe());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation1.cc b/tests/Grid/limitedextrapolation1.cc
new file mode 100644
index 0000000..4dd0933
--- /dev/null
+++ b/tests/Grid/limitedextrapolation1.cc
@@ -0,0 +1,495 @@
+/* Test Grid::limited_congruence_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 3);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(B == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_constraint(A == 0);
+  gr2.add_congruence(B %= 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(B %= 0);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(C %= 0);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(A + 0*C %= 0);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test06() {
+  Variable E(4);
+
+  Grid gr1(5);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(5);
+
+  Congruence_System cgs(0*E %= 0);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B %= 0);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 6;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned int tokens = TOKENS;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr(2);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens);
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(
+     (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B == 0) / 27);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 9);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A - B == 0) / 3);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_line(A - 2*B));
+  gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_line(A - 2*B));
+  gr2.add_grid_generator(grid_line(A + C));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(5, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(parameter(B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(parameter(B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+
+  gr2.limited_congruence_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_congruence_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation2.cc b/tests/Grid/limitedextrapolation2.cc
new file mode 100644
index 0000000..59701ef
--- /dev/null
+++ b/tests/Grid/limitedextrapolation2.cc
@@ -0,0 +1,499 @@
+/* Test Grid::limited_generator_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// These tests are clones of tests in limitedextrapolation1.cc but
+// using the generator_widening_assign() instead of the
+// congruence_widening_assign().
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 3);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(B == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_constraint(A == 0);
+  gr2.add_congruence(B %= 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(B %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(C %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(A + 0*C %= 0);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test06() {
+  Variable E(4);
+
+  Grid gr1(5);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(5);
+
+  Congruence_System cgs(0*E %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B %= 0);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 6;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned int tokens = TOKENS;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr(2);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens);
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(
+     (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B == 0) / 27);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 9);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A - B == 0) / 3);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_line(A - 2*B));
+  gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_line(A - 2*B));
+  gr2.add_grid_generator(grid_line(A + C));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(5, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_generator_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(parameter(B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(parameter(B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_generator_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+
+  gr2.limited_generator_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_generator_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation3.cc b/tests/Grid/limitedextrapolation3.cc
new file mode 100644
index 0000000..eca8ec1
--- /dev/null
+++ b/tests/Grid/limitedextrapolation3.cc
@@ -0,0 +1,499 @@
+/* Test Grid::limited_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+// These tests are clones of tests in limitedextrapolation1.cc but
+// using the widening_assign() instead of the
+// congruence_widening_assign().
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs((A %= 0) / 3);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Equivalent of just widening.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(B == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_constraint(A == 0);
+  gr2.add_congruence(B %= 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(B %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep all congruences, including a limiting congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs(C %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(A + 0*C %= 0);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test06() {
+  Variable E(4);
+
+  Grid gr1(5);
+  print_congruences(gr1, "*** gr1 ***");
+  Grid gr2(5);
+
+  Congruence_System cgs(0*E %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Keeping many limiting congruences.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(B %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert(B %= 0);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 6;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr = gr2;
+
+  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// 0 tokens.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned int tokens = TOKENS;
+
+  Congruence_System cgs;
+  cgs.insert((A + 0*B %= 0) / 2);
+
+  Grid known_gr(2);
+
+  gr2.limited_extrapolation_assign(gr1, cgs, &tokens);
+
+  bool ok = (gr2 == known_gr) && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test10() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs(
+     (Linear_Expression::zero() %= Linear_Expression::zero()) / 4);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A %= 0);
+  gr1.add_congruence((A - B == 0) / 27);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 9);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert((A - B == 0) / 3);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// From generators, with a limiting equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_line(A - 2*B));
+  gr1.add_grid_generator(grid_point(C + 3*A + 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_line(A - 2*B));
+  gr2.add_grid_generator(grid_line(A + C));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+// Exception due to space dimensions of grids.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(5, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Exception due to space dimension of congruence system.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(A));
+  gr1.add_grid_generator(parameter(B, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  gr2.add_grid_generator(parameter(B, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+  cgs.insert(A - 0*C == 3);
+
+  try {
+    gr2.limited_extrapolation_assign(gr1, cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(A, 6));
+  print_generators(gr2, "*** gr2 ***");
+
+  Congruence_System cgs;
+
+  gr2.limited_extrapolation_assign(gr1, cgs);
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.limited_extrapolation_assign(gr1, cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/mapspacedims1.cc b/tests/Grid/mapspacedims1.cc
new file mode 100644
index 0000000..749ef8d
--- /dev/null
+++ b/tests/Grid/mapspacedims1.cc
@@ -0,0 +1,314 @@
+/* Test Grid::map_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid, empty mapping.
+bool
+test01() {
+  Partial_Function function;
+
+  Grid gr(3, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all dimensions.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(2, 0);
+  function.insert(1, 1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(2*C));
+  gs.insert(grid_point(4*C));
+  gs.insert(grid_point(A));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(2*A));
+  known_gs.insert(grid_point(4*A));
+  known_gs.insert(grid_point(C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all dimensions, with overlap.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(2, 0);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(2*A));
+  gs.insert(grid_line(A - C));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(2*B));
+  known_gs.insert(grid_line(B - A));
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping more dimensions than there are in the grid.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+  function.insert(3, 2);
+  function.insert(4, 1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(0*C));
+  Grid known_gr(known_gs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all dimensions to themselves.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(1, 1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(B));
+  gs.insert(grid_point(A + B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+  Grid known_gr(gr);
+
+  gr.map_space_dimensions(function);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping all additional dimensions (in the mapping) to themselves.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+  function.insert(2, 2);
+  function.insert(3, 3);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_point(2*B));
+  gs.insert(grid_point(A + 2*B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(4, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(B));
+  known_gr.add_grid_generator(grid_point(2*A));
+  known_gr.add_grid_generator(grid_point(2*A + B));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping new dimensions over existing ones.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+  function.insert(3, 2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(A + B));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_line(A));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// Mapping away a dimension in an empty grid.
+bool
+test08() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  Grid gr(3, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+// A minimized grid in which the point contains factors and the
+// divisor is greater than one.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(4*A, 2));
+  gr.add_grid_generator(grid_point(4*A + B, 2));
+
+  // Force minimization.
+  gr.minimized_grid_generators();
+  print_generators(gr, "*** gr ***");
+
+  gr.map_space_dimensions(function);
+
+  Grid known_gr(2, EMPTY);
+  known_gr.add_grid_generator(grid_point(4*B, 2));
+  known_gr.add_grid_generator(grid_point(4*B + A, 2));
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/maxmin1.cc b/tests/Grid/maxmin1.cc
new file mode 100644
index 0000000..14d00f5
--- /dev/null
+++ b/tests/Grid/maxmin1.cc
@@ -0,0 +1,519 @@
+/* Test Grid::maximize(const Linear_Expression&, ...)
+   and Grid::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <string>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+check_both(Grid& gr, const Linear_Expression& le,
+           const std::string grid_name) {
+  Generator ext_pnt(point());
+  bool dummy;
+  Coefficient ext_n, ext_d;
+
+  bool ok = (!gr.maximize(le, ext_n, ext_d, dummy, ext_pnt)
+             && !gr.minimize(le, ext_n, ext_d, dummy, ext_pnt));
+
+  if (!ok)
+    nout << grid_name << " bounded expr" << endl;
+
+  return ok;
+}
+
+bool
+check_minimize(Grid& gr, const Linear_Expression& le,
+               Coefficient_traits::const_reference expected_n,
+               Coefficient_traits::const_reference expected_d,
+               const Generator& expected_pnt,
+               const std::string grid_name) {
+  Generator inf_pnt(point());
+
+  bool dummy;
+  Coefficient inf_n, inf_d;
+
+  bool ok = (gr.minimize(le, inf_n, inf_d, dummy, inf_pnt)
+             && inf_n == expected_n
+             && inf_d == expected_d
+             && inf_pnt == expected_pnt);
+
+  if (!ok)
+    nout << "grid name " << grid_name << " min point " << inf_pnt
+         << " (expected " << expected_pnt << ")" << endl;
+
+  return ok;
+}
+
+bool
+check_maximize(Grid& gr, const Linear_Expression& le,
+               Coefficient_traits::const_reference expected_n,
+               Coefficient_traits::const_reference expected_d,
+               const Generator& expected_pnt,
+               const std::string grid_name) {
+  Generator sup_pnt(point());
+
+  bool dummy;
+  Coefficient sup_n, sup_d;
+
+  bool ok = (gr.maximize(le, sup_n, sup_d, dummy, sup_pnt)
+             && sup_n == expected_n
+             && sup_d == expected_d
+             && sup_pnt == expected_pnt);
+
+  if (!ok)
+    nout << "grid name " << grid_name << " max point " << sup_pnt
+         << " (expected " << expected_pnt << ")" << endl;
+
+  return ok;
+}
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  Coefficient extr_n, extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = (!gr.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt)
+             && !gr.minimize(Linear_Expression(0), extr_n, extr_d, dummy, pnt));
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Grid gr(0, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Linear_Expression le = Linear_Expression::zero();
+
+  return check_both(gr, le, "gr");
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Grid gr(0);
+  print_congruences(gr, "*** gr ***");
+
+  Linear_Expression le = Linear_Expression::zero();
+
+  Generator exp_pnt(point());
+
+  bool ok = check_maximize(gr, le, 0, 1, exp_pnt, "gr")
+    && check_minimize(gr, le, 0, 1, exp_pnt, "gr");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B, 3));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 1);
+  gr_cgs_needs_min.add_constraint(3*B == 2);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = A + B;
+
+  Generator exp_pnt(point(3*A + 2*B, 3));
+
+  bool ok = check_maximize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 5, 3, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(
+        gr_gs_needs_min, le, 5, 3, exp_pnt, "gr_gs_needs_min")
+    && check_minimize(gr_gs_needs_min, le, 5, 3, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+        gr_cgs_needs_min, le, 5, 3, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(gr_cgs_needs_min, le, 5, 3, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Rectilinear line.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Line.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(2*A + B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(2*A + B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A - 2*B == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A + B;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// A line along the equality `expr == 0'.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A + 2*B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A + 2*B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(2*A - B == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A - B;
+
+  Generator exp_pnt(point(0*B));
+
+  bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min")
+    && check_minimize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// A parameter along the equality `expr == 0'.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A + 2*B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A + 2*B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(2*A - B == 0);
+  gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A - B;
+
+  Generator exp_pnt(point(0*B));
+
+  bool ok = check_maximize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 0, 1, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min")
+    && check_minimize(gr_gs_needs_min, le, 0, 1, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 0, 1, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Two lines which combine to cover any (affine) line defined by expr.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator(grid_line(B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(2);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = A - B;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// In three dimensions, lines and parameters which combine to include
+// expr.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(A));
+  gr_gs_min.add_grid_generator(grid_point(B + C));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(B + C));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(B - C == 0);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A + B - C;
+
+  bool ok = check_both(gr_gs_min, le, "gr_gs_min")
+    && check_both(gr_gs_needs_min, le, "gr_gs_needs_min")
+    && check_both(gr_cgs_needs_min, le, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Grid which bounds a 3D expr.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_min.add_grid_generator(grid_line(A - 2*B));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(3*B + C));
+  gr_gs_needs_min.add_grid_generator(grid_line(A - 2*B));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(2*A + B - 3*C - 2 == 0);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = 2*A + B - 3*C;
+
+  Generator exp_pnt1(point(2*B + 0*C));
+
+  bool ok = check_maximize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 2, 1, exp_pnt1, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min")
+    &&check_minimize(gr_gs_needs_min, le, 2, 1, exp_pnt1, "gr_gs_needs_min");
+
+  Generator exp_pnt2(point(-2*C, 3));
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 2, 1, exp_pnt2, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Point in 6D.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Grid gr_gs_min(6, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+  Grid gr_gs_needs_min(6, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(7*A - 11*B + 19*F));
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+
+  Grid gr_cgs_needs_min(6);
+  gr_cgs_needs_min.add_constraint(A == 7);
+  gr_cgs_needs_min.add_constraint(B == -11);
+  gr_cgs_needs_min.add_constraint(C == 0);
+  gr_cgs_needs_min.add_constraint(D == 0);
+  gr_cgs_needs_min.add_constraint(E == 0);
+  gr_cgs_needs_min.add_constraint(F == 19);
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+  Generator exp_pnt(point(7*A - 11*B + 19*F));
+
+  bool ok = check_maximize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min")
+    && check_minimize(gr_gs_min, le, 99, 1, exp_pnt, "gr_gs_min");
+
+  ok &= check_maximize(gr_gs_needs_min, le, 99, 1, exp_pnt, "gr_gs_needs_min")
+    &&check_minimize(gr_gs_needs_min, le, 99, 1, exp_pnt, "gr_gs_needs_min");
+
+  ok &= check_maximize(
+          gr_cgs_needs_min, le, 99, 1, exp_pnt, "gr_cgs_needs_min")
+    && check_minimize(
+          gr_cgs_needs_min, le, 99, 1, exp_pnt, "gr_cgs_needs_min");
+
+  return ok;
+}
+
+// Unbounded grid in 1D where the generator system is up-to-date but
+// not minimized.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr generators before ***");
+
+  bool ok = check_both(gr, A, "gr");
+  print_generators(gr, "*** gr generators after ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Grid/membytes1.cc b/tests/Grid/membytes1.cc
new file mode 100644
index 0000000..98e456f
--- /dev/null
+++ b/tests/Grid/membytes1.cc
@@ -0,0 +1,277 @@
+/* Test Grid::total_memory_in_bytes() and
+   Grid::external_memory_in_bytes().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+add_congruence(Grid& gr, const Congruence& cg) {
+  const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+  const memory_size_type cg_memory = cg.total_memory_in_bytes();
+  gr.add_congruence(cg);
+  const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+  nout << gr_memory_before
+       << " + " << cg_memory
+       << " -> " << gr_memory_after
+       << endl;
+}
+
+void
+add_grid_generator(Grid& gr, const Grid_Generator& g) {
+  const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+  const memory_size_type g_memory = g.total_memory_in_bytes();
+  gr.add_grid_generator(g);
+  const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+  nout << gr_memory_before
+       << " + " << g_memory
+       << " -> " << gr_memory_after
+       << endl;
+}
+
+void
+minimize(Grid& gr) {
+  const memory_size_type gr_memory_before = gr.total_memory_in_bytes();
+  (void) gr.minimized_grid_generators();
+  const memory_size_type gr_memory_after = gr.total_memory_in_bytes();
+  nout << gr_memory_before
+       << " -m-> " << gr_memory_after
+       << endl;
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+  le += 2*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+  le += 4*z;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding congruences to a grid ***" << endl;
+
+  Grid gr1(3);
+  add_congruence(gr1, 4*x - 2*y - z + 14 %= 0);
+  add_congruence(gr1, 4*x + 2*y - z + 2 %= 0);
+  add_congruence(gr1, x + y - 1 %= 0);
+  add_congruence(gr1, x + y + 2*z - 5 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, x + 1 %= 0);
+  add_congruence(gr1, x + z - 1 %= 0);
+  add_congruence(gr1, 2*x + y -2*z + 7 %= 0);
+  add_congruence(gr1, x - y + 2*z + 1 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, x - y + 5 %= 0);
+  add_congruence(gr1, 2*x - y - 2*z + 13 %= 0);
+  add_congruence(gr1, -2*x - y + 2*z + 1 %= 0);
+  add_congruence(gr1, -x + y - 1 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, -x + y -2*z + 7 %= 0);
+  add_congruence(gr1, -4*x + 2*y + z - 4 %= 0);
+  add_congruence(gr1, -2*x + y + 2*z - 5 %= 0);
+  add_congruence(gr1, -x + 1 %= 0);
+  minimize(gr1);
+  add_congruence(gr1, -x - z + 5 %= 0);
+  add_congruence(gr1, -4*x - 2*y + z + 8 %= 0);
+  add_congruence(gr1, -x - y + 5 %= 0);
+  add_congruence(gr1, -x - y -2*z +13 %= 0);
+  minimize(gr1);
+
+  const memory_size_type gr1_total_size = gr1.total_memory_in_bytes();
+  const memory_size_type gr1_external_size = gr1.external_memory_in_bytes();
+  const Congruence_System& cgs = gr1.congruences();
+  const memory_size_type cgs_total_size = cgs.total_memory_in_bytes();
+  const memory_size_type cgs_external_size = cgs.external_memory_in_bytes();
+  const Grid_Generator_System& gs = gr1.grid_generators();
+  const memory_size_type gs_total_size = gs.total_memory_in_bytes();
+  const memory_size_type gs_external_size = gs.external_memory_in_bytes();
+
+  nout << endl
+       << "*** Size of the user-visible grid components ***"
+       << endl
+       << "gr1.total_memory_in_bytes() = " << gr1_total_size
+       << endl
+       << "cgs.total_memory_in_bytes() = " << cgs_total_size
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl
+       << "gr1.external_memory_in_bytes() = " << gr1_external_size
+       << endl
+       << "cgs.external_memory_in_bytes() = " << cgs_external_size
+       << endl
+       << "gs.external_memory_in_bytes() = " << gs_external_size
+       << endl << endl;
+
+  nout << "*** Adding generators to a grid ***" << endl;
+
+  Grid gr2(3, EMPTY);
+  unsigned n = 0;
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i) {
+    add_grid_generator(gr2, *i);
+    if (++n % 4 == 0)
+      minimize(gr2);
+  }
+
+  nout << endl
+       << "*** Size of a congruence system vs size of contained congruences"
+       << endl
+       << "cgs.total_memory_in_bytes() = " << cgs_total_size
+       << endl;
+
+  memory_size_type cgs_elements_size = 0;
+  for (Congruence_System::const_iterator i = cgs.begin(),
+         cgs_end = cgs.end(); i != cgs_end; ++i)
+    cgs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained congruences = " << cgs_elements_size
+       << endl << endl
+       << "*** Size of a generator system vs size of contained generators"
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl;
+
+  memory_size_type gs_elements_size = 0;
+  for (Grid_Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    gs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained generators = " << gs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr1(3);
+  gr1.refine_with_constraint(4*x - 2*y - z + 14 >= 0);
+  gr1.refine_with_constraint(4*x + 2*y - z + 2 >= 0);
+  gr1.refine_with_constraint(x + y - 1 >= 0);
+  gr1.refine_with_constraint(x + y + 2*z - 5 >= 0);
+
+  const memory_size_type gr1_total_size = gr1.total_memory_in_bytes();
+  const memory_size_type gr1_external_size = gr1.external_memory_in_bytes();
+
+  Determinate<Grid> dgr(gr1);
+
+  const memory_size_type dgr_total_size = dgr.total_memory_in_bytes();
+  const memory_size_type dgr_external_size = dgr.external_memory_in_bytes();
+
+  nout << "gr1.total_memory_in_bytes() = " << gr1_total_size
+       << endl
+       << "gr1.external_memory_in_bytes() = " << gr1_external_size
+       << endl
+       << "dgr.total_memory_in_bytes() = " << dgr_total_size
+       << endl
+       << "dgr.external_memory_in_bytes() = " << dgr_external_size
+       << endl;
+
+  Pointset_Powerset<Grid> pgr1(gr1);
+
+  Grid gr2(3);
+  gr2.refine_with_constraint(x >= 0);
+  gr2.refine_with_constraint(y >= 0);
+  gr2.refine_with_constraint(z >= 0);
+  gr2.refine_with_constraint(x <= 1);
+  gr2.refine_with_constraint(y <= 1);
+  gr2.refine_with_constraint(z <= 1);
+  Pointset_Powerset<Grid> pgr2(gr2);
+
+  Pointset_Powerset<Grid> p2gr2 = pgr2;
+  p2gr2.difference_assign(pgr1);
+
+  const memory_size_type pgr1_total_size = pgr1.total_memory_in_bytes();
+  const memory_size_type pgr1_external_size = pgr1.external_memory_in_bytes();
+  const memory_size_type pgr2_total_size = pgr2.total_memory_in_bytes();
+  const memory_size_type pgr2_external_size = pgr2.external_memory_in_bytes();
+  const memory_size_type p2gr2_total_size = p2gr2.total_memory_in_bytes();
+  const memory_size_type p2gr2_external_size = p2gr2.external_memory_in_bytes();
+
+  nout << "pgr1.total_memory_in_bytes() = " << pgr1_total_size
+       << endl
+       << "pgr1.external_memory_in_bytes() = " << pgr1_external_size
+       << endl
+       << "pgr2.total_memory_in_bytes() = " << pgr2_total_size
+       << endl
+       << "pgr2.external_memory_in_bytes() = " << pgr2_external_size
+       << endl
+       << "p2gr2.total_memory_in_bytes() = " << p2gr2_total_size
+       << endl
+       << "p2gr2.external_memory_in_bytes() = " << p2gr2_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/mincongruences1.cc b/tests/Grid/mincongruences1.cc
new file mode 100644
index 0000000..8a1d41d
--- /dev/null
+++ b/tests/Grid/mincongruences1.cc
@@ -0,0 +1,222 @@
+/* Test Grid::minimized_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(4, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test02() {
+  Grid gr1(6);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  gr1.OK();
+
+  print_congruences(gr1, "*** gr1(cgs) ***");
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  gr1.OK();
+
+  print_congruences(gr1, "*** gr1(cgs) ***");
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A - B %= 3) / 7);
+  gr1.add_congruence((A - B %= 3) / 14);
+  gr1.add_congruence((A %= 0) / 5);
+  gr1.add_congruence((A %= 0) / 10);
+
+  Grid known_gr = gr1;
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Get a reference to the minimized_congruences, empty the grid, use the
+// reference to create a new grid.
+bool
+test06() {
+  Grid gr1(3);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+  print_congruences(gr1, "*** gr1 ***");
+
+  const Congruence_System& cgs = gr1.minimized_congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe minimized_congruences,
+// empty the grid, use the reference to create a new grid.
+bool
+test07() {
+  Grid gr1(0);
+  gr1.add_congruence(Congruence::zero_dim_integrality());
+  print_congruences(gr1, "*** gr1 ***");
+
+  const Congruence_System& cgs = gr1.minimized_congruences();
+
+  // Empty the grid.  The idea is to check that `cgs' still refers to
+  // a congruence system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+
+  Grid known_gr = gr1;
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+// Empty grid, where minimizing the congruences finds the grid empty.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr1(4);
+  gr1.add_constraint(A == 1);
+  gr1.add_constraint(A == 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr(4, EMPTY);
+
+  Congruence_System cgs = gr1.minimized_congruences();
+
+  Grid gr2(cgs);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Grid/mingenerators1.cc b/tests/Grid/mingenerators1.cc
new file mode 100644
index 0000000..1c28e64
--- /dev/null
+++ b/tests/Grid/mingenerators1.cc
@@ -0,0 +1,241 @@
+/* Test Grid::minimized_grid_generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+  Grid gr1(17, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Universe grid.
+
+bool
+test02() {
+  Grid gr1(1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test03() {
+  Grid gr1(0, EMPTY);
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test04() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Skew grid in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*B));
+  gr1.add_grid_generator(grid_point(5*A + 2*B));
+  gr1.add_grid_generator(grid_point(10*A + B));
+  gr1.add_grid_generator(grid_point(7*B));
+  gr1.add_grid_generator(grid_point(3*B + 4*C));
+  gr1.add_grid_generator(grid_line(C));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// 3D rectilinear grid defined by congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 10);
+  gr1.add_congruence((B %= 10) / 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Get a reference to the empty generators, add a point, use the
+// reference to create a new grid.
+bool
+test07() {
+  Grid gr1(2, EMPTY);
+
+  const Grid_Generator_System& gs = gr1.minimized_grid_generators();
+
+  // Add a point.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_grid_generator(grid_point());
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// In zero dimensions get a reference to the universe generators,
+// empty the grid, and then use the reference to create a new grid.
+bool
+test08() {
+  Grid gr1(0);
+
+  const Grid_Generator_System& gs = gr1.minimized_grid_generators();
+
+  // Empty the grid.  The idea is to check that `gs' still refers to a
+  // generator system that matches the grid.
+  gr1.add_congruence(Congruence::zero_dim_false());
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+// Empty grid, where updating the generators finds the grid empty.
+bool
+test09() {
+  Variable C(2);
+
+  Grid gr1(4);
+  gr1.add_constraint(C == 4);
+  gr1.add_constraint(C == 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid known_gr = gr1;
+
+  Grid_Generator_System gs = gr1.minimized_grid_generators();
+
+  Grid gr2(gs);
+
+  bool ok = (known_gr == gr2);
+
+  print_generators(gr2, "*** gr2(gs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/outputoperator1.cc b/tests/Grid/outputoperator1.cc
new file mode 100644
index 0000000..5422174
--- /dev/null
+++ b/tests/Grid/outputoperator1.cc
@@ -0,0 +1,141 @@
+/* Test IO_Operators::operator<<(s, gr).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+  Grid gr1(1, EMPTY);
+
+  std::stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(1);
+
+  std::stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+  Grid gr1(3, EMPTY);
+
+  std::stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(3);
+
+  std::stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+  Grid gr1(4, EMPTY);
+
+  std::stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(3);
+
+  std::stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of same dimensions.
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
+
+  std::stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(4);
+  gr2.add_constraint(3*A == 0);
+
+  std::stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Grids of mixed dimensions.
+bool
+test05() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(3*A + C));
+  gr1.add_grid_generator(parameter(3*A));
+
+  std::stringstream ss1;
+  ss1 << gr1;
+
+  Grid gr2(4);
+  gr2.add_constraint(3*A == 0);
+
+  std::stringstream ss2;
+  ss2 << gr2;
+
+  bool ok = (ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Grid/outputoperator2.cc b/tests/Grid/outputoperator2.cc
new file mode 100644
index 0000000..9340008
--- /dev/null
+++ b/tests/Grid/outputoperator2.cc
@@ -0,0 +1,100 @@
+/* Test Grid_Generator IO operators.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Point.
+bool
+test01() {
+  std::stringstream ss1;
+  ss1 << grid_point();
+
+  std::stringstream ss2;
+  ss2 << Grid_Generator::zero_dim_point();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Point type.
+bool
+test02() {
+  std::stringstream ss1;
+  ss1 << grid_point().type();
+
+  std::stringstream ss2;
+  ss2 << Grid_Generator::zero_dim_point().type();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Parameter type.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  std::stringstream ss1;
+  ss1 << parameter(B).type();
+
+  std::stringstream ss2;
+  ss2 << parameter(A).type();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Line type.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  std::stringstream ss1;
+  ss1 << grid_line(2*A).type();
+
+  std::stringstream ss2;
+  ss2 << grid_line(3*A).type();
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Grid/outputoperator3.cc b/tests/Grid/outputoperator3.cc
new file mode 100644
index 0000000..b467c0e
--- /dev/null
+++ b/tests/Grid/outputoperator3.cc
@@ -0,0 +1,91 @@
+/* Test Grid_Generator_System IO operators.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Single point.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs1(grid_point(A + 7*B));
+
+  std::stringstream ss1;
+  ss1 << gs1;
+
+  print_generators(gs1, "*** gs1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A + 7*B));
+
+  std::stringstream ss2;
+  ss2 << gs2;
+
+  print_generators(gs2, "*** gs2 ***");
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+// Many generators.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1(grid_point(A + 7*B));
+  gs1.insert(parameter(2*C));
+
+  std::stringstream ss1;
+  ss1 << gs1;
+
+  print_generators(gs1, "*** gs1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(A + 7*B));
+  gs2.insert(parameter(2*C));
+
+  std::stringstream ss2;
+  ss2 << gs2;
+
+  print_generators(gs2, "*** gs2 ***");
+
+  bool ok = (!ss2.str().compare(ss1.str()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Grid/partition1.cc b/tests/Grid/partition1.cc
new file mode 100644
index 0000000..e5cbd3d
--- /dev/null
+++ b/tests/Grid/partition1.cc
@@ -0,0 +1,101 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions the grid \p qq according to the congruence \p c.
+/*! \relates Parma_Polyhedra_Library::Pointset_Powerset
+  On exit, the intersection of \p qq and congruence \p c is stored
+  in \p qq, whereas the intersection of \p qq with the negation of \p c
+  is added, as a set of new disjuncts, to the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+partition_aux(const Congruence& c,
+              Grid& qq,
+              Pointset_Powerset<Grid>& r) {
+  const Coefficient& c_modulus = c.modulus();
+  const Coefficient& c_inhomogeneous_term = c.inhomogeneous_term();
+  Linear_Expression le(c.expression());
+  le -= c_inhomogeneous_term;
+  PPL_DIRTY_TEMP_COEFFICIENT(n);
+  rem_assign(n, c_inhomogeneous_term, c_modulus);
+  PPL_DIRTY_TEMP_COEFFICIENT(i);
+  for (i = c_modulus; i-- > 0; )
+    if (i != n) {
+      Grid qqq(qq);
+      qqq.add_congruence((le+i %= 0) / c_modulus);
+      if (qqq.is_empty())
+        r.add_disjunct(qqq);
+    }
+  qq.add_congruence(c);
+}
+
+/*! \relates Pointset_Powerset */
+std::pair<Grid, Pointset_Powerset<Grid> >
+partition(const Grid& p, const Grid& q) {
+  Pointset_Powerset<Grid> r(p.space_dimension(), EMPTY);
+  Grid qq = q;
+  const Congruence_System& pcs = p.congruences();
+  for (Congruence_System::const_iterator i = pcs.begin(),
+         pcs_end = pcs.end(); i != pcs_end; ++i)
+    partition_aux(*i, qq, r);
+  return std::pair<Grid, Pointset_Powerset<Grid> >(qq, r);
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  Grid q(2);
+  q.add_congruence((x %= 4) / 9);
+
+  nout << "q = " << q << endl;
+
+  std::pair<Grid, Pointset_Powerset<Grid> >
+    result = partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  result = partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  return true;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/powersetdifference1.cc b/tests/Grid/powersetdifference1.cc
new file mode 100644
index 0000000..2aec297
--- /dev/null
+++ b/tests/Grid/powersetdifference1.cc
@@ -0,0 +1,315 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 1) / 3);
+  q.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+
+  Grid known_gr1(2);
+  known_gr1.add_congruence((x %= 0) / 1);
+  known_gr1.add_congruence((y %= 0) / 2);
+
+  Grid known_gr2(2);
+  known_gr2.add_congruence((x %= 2) / 3);
+  known_gr2.add_congruence((y %= 1) / 2);
+
+  Grid known_gr3(2);
+  known_gr3.add_congruence((x %= 0) / 3);
+  known_gr3.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> known_qs(2, EMPTY);
+  known_qs.add_disjunct(known_gr1);
+  known_qs.add_disjunct(known_gr2);
+  known_qs.add_disjunct(known_gr3);
+
+  bool ok = (ps == known_qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_constraint(x == 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((x %= 0) / 1);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return i->pointset() == known_gr;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_constraint(x == 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(x %= 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ps.begin() == ps.end();
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((x %= 0) / 1);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return i->pointset() == known_gr;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ps.begin() == ps.end();
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  Grid known_gr(p);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return i->pointset() == known_gr;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  Grid known_gr(p);
+
+  Pointset_Powerset<Grid>::iterator i = ps.begin();
+  return i->pointset() == known_gr;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+  p.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 1) / 3);
+  q.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+
+  Grid known_gr1(2);
+  known_gr1.add_congruence((x %= 0) / 1);
+  known_gr1.add_congruence((y %= 0) / 2);
+
+  Grid known_gr2(2);
+  known_gr2.add_congruence((x %= 2) / 3);
+  known_gr2.add_congruence((y %= 1) / 2);
+
+  Grid known_gr3(2);
+  known_gr3.add_congruence((x %= 0) / 3);
+  known_gr3.add_congruence((y %= 1) / 2);
+
+  Pointset_Powerset<Grid> known_qs(2, EMPTY);
+  known_qs.add_disjunct(known_gr1);
+  known_qs.add_disjunct(known_gr2);
+  known_qs.add_disjunct(known_gr3);
+
+  bool ok = (ps == known_qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_constraint(x == 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 0) / 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  ps.difference_assign(qs);
+  print_congruences(ps, "*** ps.difference(qs) ***");
+
+  return ps.is_empty();
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/powersetgeometricallycovers1.cc b/tests/Grid/powersetgeometricallycovers1.cc
new file mode 100644
index 0000000..8060451
--- /dev/null
+++ b/tests/Grid/powersetgeometricallycovers1.cc
@@ -0,0 +1,181 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence((x %= 1) / 3);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_constraint(x == 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p(2);
+  p.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_covers(qs) && !qs.geometrically_covers(ps);
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+
+  Grid q(2);
+  q.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_covers(qs) && qs.geometrically_covers(ps);
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+  Grid p3(2);
+  p3.add_congruence((x %= 2) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+  ps.add_disjunct(p3);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_covers(qs);
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+  Grid p3(2);
+  p3.add_congruence((x %= 2) / 3);
+  p3.add_congruence((y %= 2) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+  ps.add_disjunct(p3);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_covers(qs);
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Grid/powersetgeometricallyequals1.cc b/tests/Grid/powersetgeometricallyequals1.cc
new file mode 100644
index 0000000..3e2b5e1
--- /dev/null
+++ b/tests/Grid/powersetgeometricallyequals1.cc
@@ -0,0 +1,114 @@
+/* Test Pointset_Powerset<Grid>.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 2);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 2);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return ps.geometrically_equals(qs);
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_equals(qs);
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid p1(2);
+  p1.add_congruence((x %= 0) / 3);
+  Grid p2(2);
+  p2.add_congruence((x %= 1) / 3);
+  Grid p3(2);
+  p3.add_congruence((x %= 2) / 3);
+  p3.add_congruence((y %= 2) / 3);
+
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  ps.add_disjunct(p1);
+  ps.add_disjunct(p2);
+  ps.add_disjunct(p3);
+
+  Grid q(2);
+  q.add_congruence(x %= 0);
+  q.add_congruence((y %= 1) / 1);
+
+  Pointset_Powerset<Grid> qs(2, EMPTY);
+  qs.add_disjunct(q);
+
+  print_congruences(ps, "*** ps ***");
+  print_congruences(qs, "*** qs ***");
+
+  return !ps.geometrically_equals(qs);
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Grid/refinewithcongruences1.cc b/tests/Grid/refinewithcongruences1.cc
new file mode 100644
index 0000000..deed92e
--- /dev/null
+++ b/tests/Grid/refinewithcongruences1.cc
@@ -0,0 +1,211 @@
+/* Test refine_with_congruence() and refine_with_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// refine_with_congruence()
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B %= 1) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruence((A %= 0) / 2);
+  gr.refine_with_congruence((B %= 1) / 2);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_congruence() ***");
+
+  return ok;
+}
+
+// refine_with_congruences()
+bool
+test02() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B %= 4) / 2);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruences(cgs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+  known_gr.add_congruence((B %= 4) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.refine_with_congruence(A + C %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Space dimension exception.
+bool
+test04() {
+  Variable A(0);
+  Variable B(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B %= 4) / 2);
+
+  Grid gr(1);
+
+  try {
+    gr.refine_with_congruences(cgs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// refine_with_constraint()
+bool
+test05() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 1) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruence((B %= 2) / 0);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+  return ok;
+}
+
+// refine_with_constraints()
+bool
+test06() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((0*A %= 3) / 0);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruences(cgs);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_congruences(cs) ***");
+
+  return ok;
+}
+
+// refine_with_constraints()
+bool
+test07() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_congruence((Linear_Expression(1) %= 0) / 0);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/refinewithconstraints1.cc b/tests/Grid/refinewithconstraints1.cc
new file mode 100644
index 0000000..540ac5f
--- /dev/null
+++ b/tests/Grid/refinewithconstraints1.cc
@@ -0,0 +1,208 @@
+/* Test refine_with_constraint() and refine_with_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// refine_with_constraint()
+bool
+test01() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 2) / 0);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraint(A >= 2);
+  gr.refine_with_constraint(B == 2);
+
+  Grid known_gr(cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+  return ok;
+}
+
+// refine_with_constraints()
+bool
+test02() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 3);
+  cs.insert(2*B == 3);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraints(cs);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((2*B %= 3) / 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.refine_with_constraint(A + C >= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Space dimension exception.
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + C >= 0);
+
+  Grid gr(2);
+
+  try {
+    gr.refine_with_constraints(cs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// refine_with_constraint()
+bool
+test05() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 1) / 2);
+
+  Grid gr(cgs);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraint(B == 2);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraint() ***");
+
+  return ok;
+}
+
+// refine_with_constraints()
+bool
+test06() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(0*A >= 3);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraints(cs);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+// refine_with_constraints()
+bool
+test07() {
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+
+  print_congruences(gr, "*** gr ***");
+
+  gr.refine_with_constraint(Linear_Expression(1) <= 0);
+
+  Grid known_gr(2, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Grid/relations1.cc b/tests/Grid/relations1.cc
new file mode 100644
index 0000000..e325139
--- /dev/null
+++ b/tests/Grid/relations1.cc
@@ -0,0 +1,367 @@
+/* Test Grid::relation_with(g).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid and point.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr(2, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Universe and point.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_point(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and point.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(grid_point(A + B)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Equality and point.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_constraint(A == 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(grid_point(2*A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruences and points.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A - B %= 1) / 2);
+  gr.add_congruence((A %= 1) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::nothing()
+             && gr.relation_with(grid_point(-B)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruence and parameter.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(parameter(A, 2)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Congruence and line.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(grid_line(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test08() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.relation_with(grid_line(A + C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Zero dimension universe grid.
+bool
+test09() {
+  Grid gr(0);
+
+  bool ok = (gr.relation_with(grid_point()) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Empty grid and point.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(2, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(point(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Universe and point.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(point(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and point.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(point(A + B)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Equality and point.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_constraint(A == 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(point(2*A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruences and points.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A - B %= 1) / 2);
+  gr.add_congruence((A %= 1) / 3);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(point()) == Poly_Gen_Relation::nothing()
+             && gr.relation_with(point(-B)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruence and parameter.
+bool
+test15() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(ray(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Congruence and line.
+bool
+test16() {
+  Variable A(0);
+
+  Grid gr(2);
+  gr.add_congruence(2*A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(line(A)) == Poly_Gen_Relation::nothing());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test17() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(2);
+
+  try {
+    gr.relation_with(line(A + C));
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Zero dimension universe grid.
+bool
+test18() {
+  Grid gr(0);
+
+  bool ok = (gr.relation_with(point()) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and line.
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(line(A + B)) == Poly_Gen_Relation::nothing()
+       && gr.relation_with(line(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+// Lined grid and line.
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_point(B));
+  gs.insert(grid_line(A));
+
+  Grid gr(gs);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(closure_point(A + B)) == Poly_Gen_Relation::subsumes()
+       && gr.relation_with(closure_point(A)) == Poly_Gen_Relation::subsumes());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/relations2.cc b/tests/Grid/relations2.cc
new file mode 100644
index 0000000..991c17b
--- /dev/null
+++ b/tests/Grid/relations2.cc
@@ -0,0 +1,424 @@
+/* Test Grid::relation_with(cg).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A proper congruence and a disjoint point.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A - B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = gr.relation_with((A - B %= 1) / 2) == Poly_Con_Relation::is_disjoint();
+
+  return ok;
+}
+
+// A proper congruence and an included grid.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(4*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 2) == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// A proper congruence and an intersected grid.
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    =  (gr.relation_with((A + C %= 0) / 3)
+        == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// A line and equalities.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A + 0*B %= 0) / 0)
+         == Poly_Con_Relation::strictly_intersects()
+       && gr.relation_with((B + 0*B %= -2) / 0)
+         == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Inclusion of a point grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A + B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(A + 0*B %= 0) == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// Empty grid.
+
+bool
+test06() {
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with((B %= 0) / 2)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test07() {
+  Grid gr;
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (// Trivially false congruence.
+       gr.relation_with(Congruence::zero_dim_false())
+       == Poly_Con_Relation::is_disjoint()
+       // False congruence.
+       && gr.relation_with((Linear_Expression(5) %= 1) / 3)
+       == Poly_Con_Relation::is_disjoint()
+       // False equality.
+       && gr.relation_with((Linear_Expression(1) %= 0) / 0)
+       == Poly_Con_Relation::is_disjoint()
+       // Proper congruence.
+       && gr.relation_with(Linear_Expression(1) %= 1)
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::saturates())
+       // Proper congruence.
+       && gr.relation_with((Linear_Expression(5) %= 1) / 4)
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::saturates())
+       // Equality.
+       && gr.relation_with(Linear_Expression(1) %= 1)
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::saturates())
+       // Integrality congruence.
+       && gr.relation_with(Congruence::zero_dim_integrality())
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A + 5*B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((5*A - 2*B == 1) / 0)
+       == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test09() {
+  Variable A(0);
+  Variable D(3);
+
+  Grid gr(4);
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(A - 2*D %= 0)
+       == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Point with a divisor that is greater than zero.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 3) / 0)
+       == Poly_Con_Relation::is_disjoint()
+       && gr.relation_with((2*A %= 1) / 0)
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::saturates())
+       && gr.relation_with(2*A %= 1)
+       == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: separate spaces.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with((10*A %= 1) / 0)
+             == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: inclusion.
+bool
+test12() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((10*A %= 0) / 1)
+       == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: strict intersection.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with(A %= 0)
+       == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.relation_with(A + B %= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == 1);
+  gr.add_constraint(A == 2);
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((B %= 0) / 2)
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::is_disjoint()
+           && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test16() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 4)
+       == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation.
+bool
+test17() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(6*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 8)
+       == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation, with a parameter.
+bool
+test18() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(parameter(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 8)
+       == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// generators are not up-to-date and the grid is empty.
+bool
+test19() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((A %= 0) / 8)
+       == (Poly_Con_Relation::is_included()
+           && Poly_Con_Relation::is_disjoint()
+           && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Grid strictly intersects where the inhomogeneous term is non-zero.
+bool
+test20() {
+  Variable A(0);
+
+  Grid gr(1);
+  gr.add_congruence((A %= 0) / 1);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok
+    = (gr.relation_with((2*A %= 1) / 3)
+       == (Poly_Con_Relation::strictly_intersects()));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/relations3.cc b/tests/Grid/relations3.cc
new file mode 100644
index 0000000..5bc8244
--- /dev/null
+++ b/tests/Grid/relations3.cc
@@ -0,0 +1,487 @@
+/* Test Grid::relation_with(const Constraint&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// A point and an inequality.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A - B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = gr.relation_with(A - B >= 1) == Poly_Con_Relation::is_included();
+
+  return ok;
+}
+
+// A line.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_line(A));
+  print_generators(gr, "*** gr ***");
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+
+  bool ok = (gr.relation_with(A + 0*B == 0)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(B > -2)
+             == Poly_Con_Relation::is_included()
+             && gr.relation_with(B > 2)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(B >= 2)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(B < -2)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(B <= -2)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(B == -2)
+             == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Inclusion of a point grid.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(A + B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(B == 1)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Empty grid.
+
+bool
+test04() {
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(B == 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates())
+             && gr.relation_with(B > 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test05() {
+  Grid gr;
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (// False.
+             gr.relation_with(Linear_Expression(1) == 0)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(Linear_Expression(0) > 0)
+             == (Poly_Con_Relation::saturates()
+                 && Poly_Con_Relation::is_disjoint())
+             // True.
+             && gr.relation_with(Linear_Expression(1) == 1)
+             == (Poly_Con_Relation::saturates()
+                 && Poly_Con_Relation::is_included())
+             && gr.relation_with(Linear_Expression(0) >= 0)
+             == (Poly_Con_Relation::saturates()
+                 && Poly_Con_Relation::is_included())
+             // False.
+             && gr.relation_with(Linear_Expression(1) < 0)
+             == Poly_Con_Relation::is_disjoint()
+             // True.
+             && gr.relation_with(Linear_Expression(1) >= 0)
+             == Poly_Con_Relation::is_included());
+
+  return ok;
+}
+
+// A disjoint grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A + 5*B));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(5*A - 2*B == 1)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(5*A - 2*B > 1)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(5*A - 2*B >= 1)
+             == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Point with a divisor that is greater than zero.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(A, 2));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A == 3)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(2*A == 1)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates())
+             && gr.relation_with(2*A < 1)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(2*A >= 1)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: separate spaces.
+bool
+test08() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(10*A == 1)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(Linear_Expression(10) > 10)
+             == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: inclusion.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(Linear_Expression(10) == 10)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates())
+             && gr.relation_with(Linear_Expression(10) >= 10)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Grid with a divisor that is greater than zero: strict intersection.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(parameter(A, 5));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 0)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(A + B >= 0)
+             == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(1);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.relation_with(A + B >= 0);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == 1);
+  gr.add_constraint(A == 2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(B == 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates())
+             && gr.relation_with(B >= 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test13() {
+  Variable A(0);
+
+  Grid gr(1, EMPTY);
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A == 0)
+             == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(grid_point(6*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 0)
+             == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// Strict intersection, where generators require the relation_with(cg)
+// GCD calculation, with a parameter.
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(3*A));
+  gr.add_grid_generator(parameter(3*A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 0)
+             == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// generators are out of date and the grid is empty.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A %= 1) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B == 8)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates())
+             && gr.relation_with(A + B > 8)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// A simple example.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(parameter(A));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A > 1)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(A >= 1)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(A < 1)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(A <= 1)
+             == Poly_Con_Relation::strictly_intersects());
+
+  return ok;
+}
+
+// A grid in 3D.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  // Regularly spaced parallel lines along a slanted plane in 3D.
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point(A + B + C));
+  gr.add_grid_generator(grid_line(A - 2*B + 3*C));
+  gr.add_grid_generator(parameter(A - B, 3));
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(A + B + C == 0)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(A + B == 0)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(A == 0)
+             == Poly_Con_Relation::strictly_intersects()
+             && gr.relation_with(Linear_Expression(0) == 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test19() {
+  Grid gr(0, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (// False.
+             gr.relation_with(Linear_Expression(1) == 0)
+             == (Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates())
+             // True.
+             && gr.relation_with(Linear_Expression(1) == 1)
+             == (Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates())
+             // False.
+             && gr.relation_with(Linear_Expression(1) < 0)
+             == (Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates())
+             // True.
+             && gr.relation_with(Linear_Expression(1) >= 0)
+             == (Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::saturates()));
+
+  return ok;
+}
+
+// A variant of test06.
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(2*A + 5*B));
+  // Force minimization.
+  (void) gr.minimized_grid_generators();
+  print_generators(gr, "*** gr ***");
+
+  bool ok = (gr.relation_with(5*A - 2*B == 1)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(5*A - 2*B > 1)
+             == Poly_Con_Relation::is_disjoint()
+             && gr.relation_with(5*A - 2*B >= 1)
+             == Poly_Con_Relation::is_disjoint());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Grid/removespacedims1.cc b/tests/Grid/removespacedims1.cc
new file mode 100644
index 0000000..cf97d9e
--- /dev/null
+++ b/tests/Grid/removespacedims1.cc
@@ -0,0 +1,350 @@
+/* Test Grid::remove_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Testing remove_space_dimensions
+
+// Simple grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A - B == 0);
+  gr.add_congruence(A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Variable B(1);
+
+  Grid gr(4, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test03() {
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr(7, UNIVERSE);
+
+  Variables_Set vars;
+  vars.insert(C);
+  vars.insert(D);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(5, UNIVERSE);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(0*A));
+  ggs.insert(grid_point(2*A));
+  ggs.insert(grid_point(3*B));
+
+  Grid gr(ggs);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Variables_Set vars;
+  vars.insert(B);
+  vars.insert(D);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*C %= 0) / 3);
+  cgs.insert((B - E %= 0) / 2);
+
+  Grid gr(cgs);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_space_dimensions(vars);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point());
+  known_ggs.insert(grid_line(2*A - B));
+  known_ggs.insert(grid_point(3*B, 2));
+  known_ggs.insert(grid_line(C));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Variable set includes first dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(A - B == 0);
+  gr.add_congruence(A %= 0);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(C);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// The resulting grid contains a parameter that is all zeros.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// The resulting grid contains a line that is all zeros.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(parameter(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(C);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(A %= 0);
+  known_gr.add_congruence(B %= 0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Empty variable set.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+
+  Grid known_gr = gr;
+
+  gr.remove_space_dimensions(vars);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(B);
+  vars.insert(C);
+
+  gr.remove_space_dimensions(vars);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Variable B(1);
+
+  Grid gr(1, EMPTY);
+  print_congruences(gr, "*** gr ***");
+
+  Variables_Set vars;
+  vars.insert(B);
+
+  try {
+    gr.remove_space_dimensions(vars);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/removespacedims2.cc b/tests/Grid/removespacedims2.cc
new file mode 100644
index 0000000..b11f2be
--- /dev/null
+++ b/tests/Grid/removespacedims2.cc
@@ -0,0 +1,280 @@
+/* Test Grid::remove_higher_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// From congruences.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A + 2*C %= 0) / 3);
+
+  Grid gr(cgs);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point(0*B));
+  known_ggs.insert(grid_line(A));
+  known_ggs.insert(grid_line(B));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// Empty grid.
+bool
+test02() {
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Grid known_gr(1, EMPTY);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+// Universe grid.
+bool
+test03() {
+  Grid gr(7);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(3);
+
+  Grid known_gr(3);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid_Generator_System ggs;
+  ggs.insert(grid_point(0*A));
+  ggs.insert(grid_point(2*A));
+  ggs.insert(grid_point(3*B));
+
+  Grid gr(ggs);
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((A %= 0) / 2);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+// Resulting grid the same.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.remove_higher_space_dimensions(gr.space_dimension());
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions() ***");
+
+  return ok;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3, EMPTY);
+  gr.add_grid_generator(grid_point());
+  gr.add_grid_generator(grid_point(A));
+  gr.add_grid_generator(grid_point(B));
+  gr.add_grid_generator(grid_line(C));
+  print_generators(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(0);
+
+  Grid known_gr(0);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test07() {
+  Grid gr(1, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  try {
+    gr.remove_higher_space_dimensions(6);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// From congruences.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(B - C == 0);
+  gr.add_congruence(B %= 0);
+  gr.add_constraint(A == 4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point(4*A));
+  known_ggs.insert(parameter(B));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// From congruences.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_constraint(B - C == 0);
+  gr.add_congruence(B %= 0);
+  gr.add_constraint(A == 4);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(1);
+
+  Grid_Generator_System known_ggs;
+  known_ggs.insert(grid_point(4*A));
+
+  Grid known_gr(known_ggs);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+// Where the redundant row with the lowest dim_kinds entry is a
+// congruence or equality.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr(3);
+  gr.add_congruence((A %= 0) / 2);
+  gr.add_congruence((A - C %= 0) / 2);
+  print_congruences(gr, "*** gr ***");
+
+  gr.remove_higher_space_dimensions(2);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A %= 0) / 2);
+
+  bool ok = (gr == known_gr);
+
+  print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/simplifyusingcontext1.cc b/tests/Grid/simplifyusingcontext1.cc
new file mode 100644
index 0000000..0f0e13f
--- /dev/null
+++ b/tests/Grid/simplifyusingcontext1.cc
@@ -0,0 +1,501 @@
+/* Test Grid::simplify_using_context_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 0) / 2);
+  gr1.add_congruence((y %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(gr1);
+  gr2.affine_image(x, x + 6);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2, UNIVERSE);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 0) / 2);
+  gr1.add_congruence((y %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(gr1);
+  gr2.affine_image(x, x + 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2, UNIVERSE);
+  known_result.add_congruence((x %= 0) / 2);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 0) / 2);
+  gr1.add_congruence((y %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, UNIVERSE);
+  gr2.add_congruence((x %= 0) / 4);
+  gr2.add_congruence((y %= 0) / 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2, UNIVERSE);
+  known_result.add_congruence((y %= 0) / 2);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 0) / 0);
+  gr1.add_congruence((y %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, UNIVERSE);
+  gr2.add_congruence((x %= 0) / 4);
+  gr2.add_congruence((y %= 0) / 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2, UNIVERSE);
+  known_result.add_congruence((x %= 0) / 0);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x + y %= 0) / 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, UNIVERSE);
+  gr2.add_congruence((x %= 0) / 0);
+  gr2.add_congruence((y %= 0) / 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2, UNIVERSE);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 0) / 0);
+  gr1.add_congruence((y %= 0) / 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((x + y %= 0) / 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result1(2);
+  known_result1.add_congruence((x %= 0) / 0);
+  Grid known_result2(2);
+  known_result2.add_congruence((y %= 0) / 0);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result1 || gr1 == known_result2);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 0) / 1);
+  gr1.add_congruence((y %= 0) / 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((x + y %= 0) / 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result1(2);
+  known_result1.add_congruence((x %= 0) / 1);
+  Grid known_result2(2);
+  known_result2.add_congruence((y %= 0) / 1);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result1 || gr1 == known_result2);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((x + y %= 0) / 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2);
+  known_result.add_congruence((x + y %= 1) / 0);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((x + y %= 0) / 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2);
+  known_result.add_congruence((2*x + 2*y %= 1) / 0);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((x + y %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2);
+  known_result.add_congruence((x + y %= 1) / 0);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x + y %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(2);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((x + 2*z %= 2) / 4);
+  gr1.add_congruence((y + z %= 2) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((z %= 1) / 4);
+  gr2.add_congruence((y %= 1) / 4);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(3);
+  known_result.add_congruence((2*y - x %= 2) / 4);
+
+  Grid gr3(gr1);
+  gr3.intersection_assign(gr2);
+  print_congruences(gr3,
+                    "*** gr3.intersection_assign(gr2) ***");
+  Grid gr4(gr1);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+
+  gr4.intersection_assign(gr2);
+  print_congruences(gr4,
+                    "*** gr4.intersection_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((x - 2*y %= 2) / 4);
+  gr1.add_congruence((x + 2*z %= 1) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((2*z %= 1) / 2);
+  gr2.add_congruence((2*y %= 1) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(gr1);
+
+  Grid gr3(gr1);
+  gr3.intersection_assign(gr2);
+  print_congruences(gr3,
+                    "*** gr3.intersection_assign(gr2) ***");
+  Grid gr4(gr1);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+
+  gr4.intersection_assign(gr2);
+  print_congruences(gr4,
+                    "*** gr4.intersection_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test14() {
+
+  Grid gr1(0, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(0, UNIVERSE);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                   "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test15() {
+
+  Grid gr1(0, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(0, EMPTY);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test16() {
+
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(0);
+
+  bool ok = !gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+bool
+test17() {
+
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_result(0);
+
+  bool ok = gr1.simplify_using_context_assign(gr2);
+  ok &= (gr1 == known_result);
+
+  print_congruences(gr1,
+                    "*** gr1.simplify_using_context_assign(gr2) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Grid/timeelapse1.cc b/tests/Grid/timeelapse1.cc
new file mode 100644
index 0000000..5048665
--- /dev/null
+++ b/tests/Grid/timeelapse1.cc
@@ -0,0 +1,341 @@
+/* Test Grid::time_elapse_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Zero dimension.
+bool
+test01() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(0);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Zero dimension, second grid empty.
+bool
+test02() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(0, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(0, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// First grid empty.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(4, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4);
+  gr2.add_congruence(A %= 3);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid empty.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr1(4);
+  gr1.add_congruence(A %= 3);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid a single point at the origin.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A + 2*B %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(gr1);
+
+  gr1.time_elapse_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+
+// One dimension grids of equalities.
+bool
+test06() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_constraint(A == 1);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// One dimension grids with congruences.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 2);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 0) / 3);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence((A %= 2) / 3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Multi-dimension grids.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A - B %= 1) / 6);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_constraint(B == 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 1) / 2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Multi-dimension grids with denominators, in timeelapse2.
+
+// Multi-dimension grids from generators in sub-optimal form.
+bool
+test09() {
+  Variable A(0);
+  Variable D(3);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(2*A));
+  gr1.add_grid_generator(grid_point(4*A));
+  gr1.add_grid_generator(grid_point(D));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(A));
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(4, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A));
+  known_gr.add_grid_generator(grid_point(D));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// A grid of a single point, where the position of the second grid
+// causes the result to be more dense than the second grid.
+bool
+test10() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 2);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 3);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(1);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test11() {
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(19, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr1.time_elapse_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Multi-dimension grids with denominators.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_point(A + 2*B - 3*C, 3));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(3*A - B + 4*C, 7));
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.time_elapse_assign(gr2);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point());
+  known_gr.add_grid_generator(grid_point(A + 2*B - 3*C, 3));
+  known_gr.add_grid_generator(grid_point(3*A - B + 4*C, 7));
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.time_elapse_assign(gr2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST_F8(test12);
+END_MAIN
diff --git a/tests/Grid/topclosed1.cc b/tests/Grid/topclosed1.cc
new file mode 100644
index 0000000..8a0ef5c
--- /dev/null
+++ b/tests/Grid/topclosed1.cc
@@ -0,0 +1,337 @@
+/* Test Grid::is_topologically_closed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(7, EMPTY);
+
+  bool ok = (gr.is_topologically_closed());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+
+bool
+test02() {
+  Grid gr(0, EMPTY);
+
+  bool ok = (gr.is_topologically_closed());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+
+bool
+test03() {
+  Grid gr(0);
+
+  bool ok = (gr.is_topologically_closed());
+
+  print_congruences(gr, "*** gr ***");
+
+  return ok;
+}
+
+// Point.
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_constraint(B == 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Line.
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_constraint(B == 2);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+  gr_cgs_needs_min.add_constraint(C == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Rectilinear with lines.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 2*B));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_constraint(A == 3);
+  gr_cgs_needs_min.add_congruence(B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr_gs_min(2, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(2, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(2);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Skew with lines.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr_gs_min(3, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_point(A));
+  gr_gs_min.add_grid_generator(grid_line(C));
+  gr_gs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_gs_needs_min(3, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_point(A));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+  gr_gs_needs_min.add_grid_generator(grid_point(3*A + 3*B, 4));
+
+  Grid gr_cgs_needs_min(3);
+  gr_cgs_needs_min.add_congruence((4*B %= 0) / 3);
+  gr_cgs_needs_min.add_congruence(A - B %= 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Plane.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Grid gr_gs_min(4, EMPTY);
+  gr_gs_min.add_grid_generator(grid_point());
+  gr_gs_min.add_grid_generator(grid_line(B));
+  gr_gs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_gs_needs_min(4, EMPTY);
+  gr_gs_needs_min.add_grid_generator(grid_point());
+  gr_gs_needs_min.add_grid_generator(grid_line(B));
+  gr_gs_needs_min.add_grid_generator(grid_line(C));
+
+  Grid gr_cgs_needs_min(4);
+  gr_cgs_needs_min.add_constraint(A == 0);
+  gr_cgs_needs_min.add_constraint(D == 0);
+
+  // Grids gr_gs_min, gr_gs_needs_min and gr_cgs_needs_min are the
+  // same grids.
+
+  bool ok = (gr_gs_min.is_topologically_closed())
+    && (gr_gs_needs_min.is_topologically_closed())
+    && (gr_cgs_needs_min.is_topologically_closed());
+
+  print_generators(gr_gs_min, "*** gr_gs_min ***");
+  print_generators(gr_gs_needs_min, "*** gr_gs_needs_min ***");
+  print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+  return ok;
+}
+
+// Empty.
+bool
+test11() {
+  Variable A(0);
+
+  Grid gr(3);
+  gr.add_constraint(A == 1);
+  gr.add_constraint(A == 2);
+
+  print_congruences(gr, "*** gr ***");
+
+  bool ok = (gr.is_topologically_closed());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Grid/topclosure1.cc b/tests/Grid/topclosure1.cc
new file mode 100644
index 0000000..4c8f269
--- /dev/null
+++ b/tests/Grid/topclosure1.cc
@@ -0,0 +1,94 @@
+/* Test Grid::topological_closure_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Grid gr(6, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.topological_closure_assign();
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+  return ok;
+}
+
+// Universe
+bool
+test02() {
+  Grid gr(5);
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.topological_closure_assign();
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(0*C));
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(parameter(-C));
+
+  Grid gr(gs);
+  print_generators(gr, "*** gr ***");
+
+  Grid known_gr = gr;
+
+  gr.topological_closure_assign();
+
+  bool ok = (gr == known_gr);
+
+  print_generators(gr, "*** gr.topological_closure_assign() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Grid/unconstrain1.cc b/tests/Grid/unconstrain1.cc
new file mode 100644
index 0000000..dc3189a
--- /dev/null
+++ b/tests/Grid/unconstrain1.cc
@@ -0,0 +1,252 @@
+/* Test Grid::unconstrain().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  gr.unconstrain(A);
+
+  Grid known_result(2, EMPTY);
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs(A, B);
+  gr.unconstrain(vs);
+
+  Grid known_result(2, EMPTY);
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_constraint(A == B);
+  gr.add_congruence(B %= 0);
+  print_generators(gr, "*** gr ***");
+
+  gr.unconstrain(B);
+
+  Grid known_result(2);
+  known_result.add_congruence(A %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr(2);
+  gr.add_congruence((A %= B) / 0);
+  gr.add_congruence(B %= 0);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs(B);
+  gr.unconstrain(vs);
+
+  Grid known_result(2);
+  known_result.add_congruence(A %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Grid gr(0, EMPTY);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs;
+  gr.unconstrain(vs);
+
+  Grid known_result(0, EMPTY);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Grid gr(0);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs;
+  gr.unconstrain(vs);
+
+  Grid known_result(0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    Grid gr(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    gr.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    Grid gr(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    gr.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Grid gr(5);
+  gr.add_congruence((A + 3*B - 7 %= 9) / 0);
+  gr.add_congruence(A - 3*B - D + E %= 0);
+  gr.add_congruence(C %= D);
+  gr.add_congruence(E %= 2*B + D);
+  gr.add_congruence(E %= 0);
+  print_generators(gr, "*** gr ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  gr.unconstrain(vs);
+
+  Grid known_result(5);
+  known_result.add_congruence((2*C %= 0) / 1);
+  known_result.add_congruence(E %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_generators(gr, "*** after gr.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  try {
+    Grid gr(15);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    gr.unconstrain(Variable(15));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Grid/upperbound1.cc b/tests/Grid/upperbound1.cc
new file mode 100644
index 0000000..b3fae44
--- /dev/null
+++ b/tests/Grid/upperbound1.cc
@@ -0,0 +1,335 @@
+/* Test Grid::upper_bound_assign()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Two grids each with one point and two lines
+bool
+test01() {
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(C));
+  known_gs.insert(grid_point(B));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Two universe grids.
+bool
+test02() {
+  Grid gr1(3);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(3);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid known_gr(3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Second grid universe.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point());
+  gs.insert(grid_line(A));
+  gs.insert(grid_line(B));
+  gs.insert(grid_line(-C));
+
+  Grid gr2(gs);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid known_gr(3);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Inserting a parameter.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(0*C));
+  gs1.insert(grid_line(A));
+  gs1.insert(grid_line(B));
+
+  Grid gr1(gs1);
+
+  gr1.add_grid_generator(parameter(-C));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(0*C));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid known_gr(3);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Out-of-date generators in the first grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(B == 0);
+  gr1.add_constraint(C == 0);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(B + 0*C));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(B + 0*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Out-of-date generators in the second grid.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_constraint(A == 0);
+  gr2.add_constraint(B == 0);
+  gr2.add_constraint(C == 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point());
+  known_gs.insert(grid_point(B + 0*C));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+
+  Grid gr2(4);
+  gr2.add_constraint(A == 0);
+  gr2.add_constraint(B == 0);
+  gr2.add_constraint(C == 0);
+
+  try {
+    gr1.upper_bound_assign(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Out-of-date generators in the first grid, which is empty.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(B + 0*C));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr1.upper_bound_assign(gr2);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// Based on an example in a paper by Muller-Olm and Seidl in SAS 2005
+// Here there is an input and output version of each variable
+// A, B being input and A1, B1 the output.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // initial point
+  Grid gr0(4);
+  gr0.add_constraint(A == 2);
+  gr0.add_constraint(B == 0);
+
+  // a pass through the procedure may do nothing
+  Grid gr1(gr0);
+  gr1.add_constraint(A == C);
+  gr1.add_constraint(B == D);
+
+  // one non-trivial pass through procedure
+  Grid gr2(gr0);
+  gr2.add_constraint(15 * A == C);
+  gr2.add_constraint(18 * A + B == D);
+  // combine alternative paths 1 and 2
+  gr2.upper_bound_assign(gr1);
+
+  // two non-trivial passes through procedure
+  Grid gr3(gr0);
+  gr3.add_constraint(225 * A == C);
+  gr3.add_constraint(282 * A + B == D);
+  // combine alternative paths 1, 2 and 3
+  gr3.upper_bound_assign(gr2);
+
+  Variables_Set vars;
+  vars.insert(A);
+  vars.insert(B);
+
+  gr3.remove_space_dimensions(vars);
+
+  // as in paper
+  Grid known_gr(2);
+
+  known_gr.add_congruence((A %= 2) / 28);
+  known_gr.add_congruence((B %= 0) / 12);
+
+  bool ok = (gr3 == known_gr);
+
+  print_congruences(gr3, "*** gr3.remove_space_dimensions(vars) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/Grid/upperbound2.cc b/tests/Grid/upperbound2.cc
new file mode 100644
index 0000000..4054767
--- /dev/null
+++ b/tests/Grid/upperbound2.cc
@@ -0,0 +1,341 @@
+/* Test Grid::upper_bound_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A + 0*C));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(2*A + 0*C));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Grid_Generator_System known_gs;
+  known_gs.insert(grid_point(A + 0*C));
+  known_gs.insert(grid_point(2*A));
+
+  Grid known_gr(known_gs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign and upper_bound_assign_if_exact - Two empty grids.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(4, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(4, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(4, EMPTY);
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - First grid empty.
+bool
+test04() {
+  Variable A(0);
+
+  Grid gr1(4, EMPTY);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(2*A));
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Second grid empty.
+bool
+test05() {
+  Variable B(1);
+
+  Grid gr1(4, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(grid_line(B));
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Zero dimension universes.
+bool
+test06() {
+  Grid gr1(0);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(0);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - First included in second.
+bool
+test07() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_congruence((A %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Second included in first.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(A - B %= 0);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_constraint(A - B == 0);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Exact join.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((B %= 1) / 2);
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+  known_gr.add_congruence(A %= 0);
+
+  bool ok = (gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Two points (join adds more points).
+bool
+test10() {
+  Variable A(0);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(A));
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point(3*A, 5));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr1;
+
+  bool ok = (!gr1.upper_bound_assign_if_exact(gr2));
+
+  if (ok)
+    ok &= (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign_if_exact(gr2) ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact - Space dimension exception.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs;
+  gs.insert(grid_point(B + 0*C));
+
+  Grid gr1(gs);
+
+  Grid gr2(4);
+  gr2.add_constraint(A == 0);
+  gr2.add_constraint(B == 0);
+  gr2.add_constraint(C == 0);
+
+  try {
+    gr1.upper_bound_assign_if_exact(gr2);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// upper_bound_assign - Divisor normalization.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid_Generator_System gs1;
+  gs1.insert(grid_point(0*C));
+  gs1.insert(grid_line(A));
+  gs1.insert(grid_line(B));
+
+  Grid gr1(gs1);
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid_Generator_System gs2;
+  gs2.insert(grid_point());
+  gs2.insert(grid_point(C, 3));
+
+  Grid gr2(gs2);
+  print_generators(gr2, "*** gr2 ***");
+
+  gr1.upper_bound_assign(gr2);
+
+  Congruence_System known_cgs;
+  known_cgs.insert((3*C %= 0) / 1);
+
+  Grid known_gr(known_cgs);
+
+  bool ok = (gr1 == known_gr);
+
+  print_congruences(gr1, "*** gr1.upper_bound_assign(gr2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/widening1.cc b/tests/Grid/widening1.cc
new file mode 100644
index 0000000..2b93614
--- /dev/null
+++ b/tests/Grid/widening1.cc
@@ -0,0 +1,598 @@
+/* Test Grid::congruence_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.congruence_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Empty after minimization.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.congruence_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.congruence_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// An equality that becomes a congruence.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(B == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_constraint(A == 0);
+  gr2.add_congruence(B %= 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.congruence_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Keep all congruences.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence((A %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.congruence_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Keep some congruences.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence(C %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B %= 0) / 2);
+  known_gr.add_congruence(C %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Already minimized.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence((C %= 0) / 3);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((B %= 0) / 2);
+  gr2.add_congruence(C %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(3);
+  known_gr.add_congruence((B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both universe.
+bool
+test08() {
+  Grid gr1(5);
+  Grid gr2(5);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(5);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Widening when increasing to universe.
+bool
+test09() {
+  Variable A(0);
+
+  Grid gr1(4);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(4);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(4);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test10() {
+  using namespace IO_Operators;
+
+  Variable A(0);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.congruence_widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+  nout << "*** `tokens' should be 3 ***" << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test11() {
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// First case of Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(5*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(5*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(5*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Second case in Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(9*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(9*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(9*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// First case in Example 9 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Second case in Example 9 in Section 6 of [BagnaraDHMZ05TR]
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((3*A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Congruences and equalities.
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((A - B == 0) / 6);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A - B == 0) / 3);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B == 0) / 3);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// From generators.
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(3, EMPTY);
+  known_gr.add_grid_generator(grid_point(C, 3));
+  known_gr.add_grid_generator(grid_line(A - 2*B));
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+
+// Space dimension exception.
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr2.congruence_widening_assign(gr1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Minimizing the first congruence system finds the empty grid.
+bool
+test19() {
+  Variable A(0);
+
+  Grid gr1(3);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(3);
+  gr2.add_constraint(A == 0);
+  gr2.add_constraint(A == 1);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.congruence_widening_assign(gr1);
+
+  Grid known_gr(3, EMPTY);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.congruence_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/widening2.cc b/tests/Grid/widening2.cc
new file mode 100644
index 0000000..4f58f62
--- /dev/null
+++ b/tests/Grid/widening2.cc
@@ -0,0 +1,486 @@
+/* Test Grid::generator_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(grid_point(A));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Initially non-empty changing to the universe.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test03() {
+  Variable A(0);
+
+  Grid gr1(1, EMPTY);
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(1, EMPTY);
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// An extra affine dimension as a parameter.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point(B));
+  gr1.add_grid_generator(parameter(A));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point(B));
+  gr2.add_grid_generator(parameter(A));
+  gr2.add_grid_generator(parameter(A + B));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Widening does not change the grid.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(A, 2));
+  gr1.add_grid_generator(grid_point(B, 2));
+  gr1.add_grid_generator(grid_point(C));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(A, 2));
+  gr2.add_grid_generator(grid_point(B, 2));
+  gr2.add_grid_generator(grid_point(C));
+  gr2.add_grid_generator(grid_point(4*C + A, 4));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Widening adds a line.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(A, 2));
+  gr1.add_grid_generator(parameter(B));
+  gr1.add_grid_generator(parameter(C));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(3, EMPTY);
+  gr2.add_grid_generator(grid_point(A, 2));
+  gr2.add_grid_generator(parameter(B, 2));
+  gr2.add_grid_generator(parameter(C, 2));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+  known_gr.add_grid_generator(grid_line(B));
+  known_gr.add_grid_generator(grid_line(C));
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_generators(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// The next two tests are based on an example in [BagnaraDHMZ06a].
+// Widening should only be applied where the grid to be widened is in
+// strong minimal form.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+
+  gr2.generator_widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.generator_widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// This uses the same grids as before but with the given representation
+// not in strong minimal form.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((3*A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Token used.
+bool
+test09() {
+  using namespace IO_Operators;
+
+  Variable A(0);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+  nout << "*** `tokens' (which should be 3), are = *** " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Token not used.
+bool
+test10() {
+  //  using namespace IO_Operators;
+
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+  gr1.add_congruence((B %= 0) / 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence(B %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.generator_widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 4));
+
+  nout << "*** `tokens' (which should be 4), are = *** " << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test11() {
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// First case of Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(5*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(5*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(5*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Second case in Example 8 in Section 6 of [BagnaraDHMZ05TR].
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence(9*A + B %= 0);
+  gr1.add_congruence(22*A %= 0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(9*A + B %= 0);
+  gr2.add_congruence(44*A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+
+  Grid known_gr(2);
+  known_gr.add_congruence(9*A + B %= 0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr2.generator_widening_assign(gr1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Grid gr1(1);
+  gr1.add_congruence((A %= 1) / 2);
+  gr1.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1);
+  gr2.add_congruence((A %= 1) / 2);
+  gr2.add_congruence((A %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.generator_widening_assign(gr1);
+  bool ok = (gr1 == gr2);
+
+  print_congruences(gr1, "*** gr1 ***");
+  print_congruences(gr2, "*** gr2.generator_widening_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST_F8(test12);
+  DO_TEST_F8(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Grid/widening3.cc b/tests/Grid/widening3.cc
new file mode 100644
index 0000000..a1316bd
--- /dev/null
+++ b/tests/Grid/widening3.cc
@@ -0,0 +1,315 @@
+/* Test Grid::widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Initially empty.
+bool
+test01() {
+  Variable A(0);
+
+  Grid gr1(2, EMPTY);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Both empty.
+bool
+test02() {
+  Variable A(0);
+
+  Grid gr1(1);
+  gr1.add_constraint(A == 0);
+  gr1.add_constraint(A == 1);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(1, EMPTY);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Zero dimension.
+bool
+test03() {
+  Grid gr1(0);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  gr2.widening_assign(gr1);
+
+  Grid known_gr(0);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// The next set of tests use the widening example in fm06.
+
+// Both congruence systems are up-to-date.
+// Neither generator systems are up-to-date.
+// Should use the congruence widening..
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Initial grid - only the congruence system is up-to-date but not minimized.
+// Second grid - only the generator system is up-to-date but not minimized.
+// Should use the congruence widening..
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 2);
+  gr1.add_congruence((B %= 0) / 2);
+  gr1.add_congruence((A + B %= 0) / 2);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(2*A));
+  gr2.add_grid_generator(parameter(A + B));
+  gr2.add_grid_generator(parameter(3*A + B));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Initial grid - only the generator system is up-to-date but not minimized.
+// Second grid - only the congruence system is up-to-date but not minimized.
+// Should use the congruence widening..
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(2*A));
+  gr1.add_grid_generator(parameter(2*B));
+  gr1.add_grid_generator(parameter(2*A + 2*B));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+  gr2.add_congruence((A + B %= 0) / 2);
+  gr2.add_congruence((A + B %= 0));
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A + B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Neither congruence systems are up-to-date.
+// Should use the generator widening..
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Grid gr1(2, EMPTY);
+  gr1.add_grid_generator(grid_point());
+  gr1.add_grid_generator(parameter(2*A));
+  gr1.add_grid_generator(parameter(2*B));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(2, EMPTY);
+  gr2.add_grid_generator(grid_point());
+  gr2.add_grid_generator(parameter(2*A));
+  gr2.add_grid_generator(parameter(A + B));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  Grid known_gr(2);
+  known_gr.add_congruence((A - B %= 0) / 2);
+
+  gr2.widening_assign(gr1);
+
+  bool ok = (gr2 == known_gr);
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1) ***");
+
+  return ok;
+}
+
+// Tokens.
+bool
+test08() {
+  using namespace IO_Operators;
+
+  Variable A(0);
+
+  Grid gr1(2);
+  gr1.add_congruence((A %= 0) / 4);
+
+  print_congruences(gr1, "*** gr1 ***");
+
+  Grid gr2(2);
+  gr2.add_congruence(A %= 0);
+
+  print_congruences(gr2, "*** gr2 ***");
+
+  unsigned int tokens = 4;
+
+  Grid known_gr = gr2;
+
+  gr2.widening_assign(gr1, &tokens);
+
+  bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+  nout << "*** `tokens' which should be should be 3 are *** "
+       << tokens << endl;
+
+  print_congruences(gr2, "*** gr2.widening_assign(gr1, &tokens) ***");
+
+  return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Grid gr1(3, EMPTY);
+  gr1.add_grid_generator(grid_point(C, 3));
+  gr1.add_grid_generator(grid_point(C + A - 2*B, 3));
+
+  print_generators(gr1, "*** gr1 ***");
+
+  Grid gr2(4, EMPTY);
+  gr2.add_grid_generator(grid_point(C, 3));
+  gr2.add_grid_generator(grid_point(2*C + A - 2*B, 6));
+
+  print_generators(gr2, "*** gr2 ***");
+
+  try {
+    gr2.widening_assign(gr1);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Grid/wrap1.cc b/tests/Grid/wrap1.cc
new file mode 100644
index 0000000..dc8101e
--- /dev/null
+++ b/tests/Grid/wrap1.cc
@@ -0,0 +1,564 @@
+/* Test Grid::wrap_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Grid gr(2);
+  gr.add_congruence((x + 24 %= 8*y) / 2);
+  gr.add_congruence((y %= 1) / 3);
+
+  Variables_Set vars(x, y);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  Grid known_result(2);
+  known_result.add_congruence((x + 24 %= 8*y) / 2);
+  known_result.add_congruence((y %= 0) / 1);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence(x + 24 %= 8*y);
+  gr.add_congruence((y %= 1) / 2);
+
+  Variables_Set vars(x, y);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+  Grid known_result(3);
+  known_result.add_congruence(x %= 0);
+  known_result.add_congruence(y %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Grid gr(2);
+  gr.add_congruence((x + 24 %= 8*y) / 255);
+  gr.add_congruence(x %= 0);
+
+  Variables_Set vars(x, y);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+  Grid known_result(2);
+  known_result.add_congruence(x %= 0);
+  known_result.add_congruence((32*x + 3 %= y) / 255);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(4);
+  gr.add_congruence((x %= 255) / 0);
+
+  Variables_Set vars(x, w);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  Grid known_result(4);
+  known_result.add_congruence((x %= 255) / 0);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr1(4);
+  gr1.add_congruence((x %= 10) / 255);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_IMPOSSIBLE);
+
+  Grid known_result(4);
+  known_result.add_congruence((x %= 10) / 0);
+
+  bool ok = (gr1 == known_result && gr2 == known_result);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr1(4);
+  gr1.add_congruence((x %= 245) / 255);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_IMPOSSIBLE);
+
+  Grid known_result1(4);
+  known_result1.add_congruence((x %= 245) / 0);
+  Grid known_result2(4);
+  known_result2.add_congruence((x %= -10) / 0);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence(x + 24 %= 8*y);
+  gr.add_congruence((y %= 1) / 0);
+
+  Variables_Set vars(x, y);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+  Grid known_result(3);
+  known_result.add_congruence(x %= 0);
+  known_result.add_congruence((y %= 1) / 0);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+// Expression with a greater space dimension than the grid.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(3);
+  gr.add_congruence((z == -2) / 0);
+  gr.add_congruence((x ==  0) / 0);
+
+  Variables_Set vars(x, w);
+
+  try {
+    gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Constraint with a greater space dimension than the grid.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(3);
+  gr.add_congruence((z == -2) / 0);
+  gr.add_congruence((x ==  0) / 0);
+
+  Constraint_System pcs;
+  pcs.insert(x+y+z+w == 2);
+
+  Variables_Set vars(x, y);
+
+  try {
+    gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED, &pcs);
+  }
+  catch (const std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(4);
+  gr.add_congruence((x %= 1) / 2);
+
+  Constraint_System pcs;
+  pcs.insert(x+y+z+w == 2);
+
+  Variables_Set vars(x, w);
+
+  // The constraint system pcs will be ignored.
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &pcs);
+
+  Grid known_result(4);
+  known_result.add_congruence((x %= 1) / 2);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Grid gr(2);
+  gr.add_congruence((x %= 256) / 0);
+  gr.add_congruence(y %= 0);
+
+  Variables_Set vars(x);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+  Grid known_result(2);
+  known_result.add_congruence((x %= 0) / 1);
+  known_result.add_congruence(y %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Grid gr(2);
+  gr.add_congruence((x %= 256) / 0);
+  gr.add_congruence(y %= 0);
+
+  Variables_Set vars(x);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  Grid known_result(2);
+  known_result.add_congruence((x %= 0) / 0);
+  known_result.add_congruence(y %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Grid gr(2);
+  gr.add_congruence((x %= 25) / 0);
+  gr.add_congruence(y %= 0);
+
+  Variables_Set vars(x);
+
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+  Grid known_result(2);
+  known_result.add_congruence((x %= 25) / 0);
+  known_result.add_congruence(y %= 0);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 245) / 255);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+  Grid known_result1(2);
+  known_result1.add_congruence((x %= 0) / 1);
+  Grid known_result2(2);
+  known_result2.add_congruence((x %= 0) / 1);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((x %= 245) / 256);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+  Grid known_result1(2);
+  known_result1.add_congruence((x %= 245) / 0);
+  Grid known_result2(2);
+  known_result2.add_congruence((x %= -11) / 0);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((2*x %= 245) / 0);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+  Grid known_result1(2, EMPTY);
+  Grid known_result2(2, EMPTY);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((4*x %= 3) / 2);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+  Grid known_result1(2, EMPTY);
+  Grid known_result2(2, EMPTY);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((4*x %= 2) / 1);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_WRAPS);
+
+  Grid known_result1(2);
+  known_result1.add_congruence((x %= 0) / 1);
+  Grid known_result2(2);
+  known_result2.add_congruence((x %= 0) / 1);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr1(2);
+  gr1.add_congruence((2*x %= 245) / 0);
+  Grid gr2(gr1);
+
+  Variables_Set vars(x, y);
+
+  gr1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+  gr2.wrap_assign(vars, BITS_8, SIGNED_2_COMPLEMENT, OVERFLOW_UNDEFINED);
+
+  Grid known_result1(2, EMPTY);
+  Grid known_result2(2, EMPTY);
+
+  bool ok = (gr1 == known_result1 && gr2 == known_result2);
+
+  print_congruences(gr1, "*** gr1.wrap_assign(...) ***");
+  print_congruences(gr2, "*** gr2.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(4);
+  gr.add_congruence((x %= 1) / 2);
+
+  Constraint_System pcs;
+  pcs.insert(x+y == 2);
+
+  Variables_Set vars(x, w);
+
+  // The constraint system pcs will be ignored.
+  gr.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &pcs);
+
+  Grid known_result(4);
+  known_result.add_congruence((x %= 1) / 2);
+
+  bool ok = (gr == known_result);
+
+  print_congruences(gr, "*** gr.wrap_assign(...) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+  DO_TEST_F8(test03);
+  DO_TEST_F8(test04);
+  DO_TEST_F8(test05);
+  DO_TEST_F8(test06);
+  DO_TEST_F8(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST_F8(test10);
+  DO_TEST_F8(test11);
+  DO_TEST_F8(test12);
+  DO_TEST_F8(test13);
+  DO_TEST_F16(test14);
+  DO_TEST_F8(test15);
+  DO_TEST_F8(test16);
+  DO_TEST_F8(test17);
+  DO_TEST_F8(test18);
+  DO_TEST_F8(test19);
+  DO_TEST_F8(test20);
+END_MAIN
diff --git a/tests/Grid/writecongruencesystem.cc b/tests/Grid/writecongruencesystem.cc
new file mode 100644
index 0000000..422dfab
--- /dev/null
+++ b/tests/Grid/writecongruencesystem.cc
@@ -0,0 +1,63 @@
+/* Test operator<<(std::ostream&, const Congruence_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <sstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+
+  bool ok = (cgs.OK());
+
+  std::stringstream ss;
+  ss << cgs;
+  ok &= (!ss.str().compare("true"));
+
+  cgs.insert(A - 2*B %= 2);
+  cgs.insert(2*A %= 4);
+
+#define OUTPUT "A - 2*B = 0 (mod 1), 2*A = 0 (mod 1)"
+
+  ss.str("");
+  ss << cgs;
+  ok &= (!ss.str().compare(OUTPUT));
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/MIP_Problem/Makefile.am b/tests/MIP_Problem/Makefile.am
new file mode 100644
index 0000000..100f0bc
--- /dev/null
+++ b/tests/MIP_Problem/Makefile.am
@@ -0,0 +1,98 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+ascii_dump_load1 \
+exceptions1 \
+mipproblem1 \
+mipproblem2 \
+mipproblem3 \
+mipproblem4
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+
+mipproblem1_SOURCES = mipproblem1.cc
+
+mipproblem2_SOURCES = mipproblem2.cc
+
+mipproblem3_SOURCES = mipproblem3.cc
+
+mipproblem4_SOURCES = mipproblem4.cc
+
+check_PROGRAMS = \
+$(TESTS) \
+$(BUGS)
+
+EXTRA_DIST =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/MIP_Problem/Makefile.in b/tests/MIP_Problem/Makefile.in
new file mode 100644
index 0000000..46e50f6
--- /dev/null
+++ b/tests/MIP_Problem/Makefile.in
@@ -0,0 +1,1213 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+	mipproblem1$(EXEEXT) mipproblem2$(EXEEXT) mipproblem3$(EXEEXT) \
+	mipproblem4$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/MIP_Problem
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+	mipproblem1$(EXEEXT) mipproblem2$(EXEEXT) mipproblem3$(EXEEXT) \
+	mipproblem4$(EXEEXT)
+am__EXEEXT_2 =
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mipproblem1_OBJECTS = mipproblem1.$(OBJEXT)
+mipproblem1_OBJECTS = $(am_mipproblem1_OBJECTS)
+mipproblem1_LDADD = $(LDADD)
+mipproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mipproblem2_OBJECTS = mipproblem2.$(OBJEXT)
+mipproblem2_OBJECTS = $(am_mipproblem2_OBJECTS)
+mipproblem2_LDADD = $(LDADD)
+mipproblem2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mipproblem3_OBJECTS = mipproblem3.$(OBJEXT)
+mipproblem3_OBJECTS = $(am_mipproblem3_OBJECTS)
+mipproblem3_LDADD = $(LDADD)
+mipproblem3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mipproblem4_OBJECTS = mipproblem4.$(OBJEXT)
+mipproblem4_OBJECTS = $(am_mipproblem4_OBJECTS)
+mipproblem4_LDADD = $(LDADD)
+mipproblem4_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+	$(mipproblem1_SOURCES) $(mipproblem2_SOURCES) \
+	$(mipproblem3_SOURCES) $(mipproblem4_SOURCES)
+DIST_SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+	$(mipproblem1_SOURCES) $(mipproblem2_SOURCES) \
+	$(mipproblem3_SOURCES) $(mipproblem4_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS = 
+
+#
+# Sources for the tests
+#
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+exceptions1_SOURCES = exceptions1.cc
+mipproblem1_SOURCES = mipproblem1.cc
+mipproblem2_SOURCES = mipproblem2.cc
+mipproblem3_SOURCES = mipproblem3.cc
+mipproblem4_SOURCES = mipproblem4.cc
+EXTRA_DIST = 
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/MIP_Problem/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/MIP_Problem/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) $(EXTRA_exceptions1_DEPENDENCIES) 
+	@rm -f exceptions1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+
+mipproblem1$(EXEEXT): $(mipproblem1_OBJECTS) $(mipproblem1_DEPENDENCIES) $(EXTRA_mipproblem1_DEPENDENCIES) 
+	@rm -f mipproblem1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mipproblem1_OBJECTS) $(mipproblem1_LDADD) $(LIBS)
+
+mipproblem2$(EXEEXT): $(mipproblem2_OBJECTS) $(mipproblem2_DEPENDENCIES) $(EXTRA_mipproblem2_DEPENDENCIES) 
+	@rm -f mipproblem2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mipproblem2_OBJECTS) $(mipproblem2_LDADD) $(LIBS)
+
+mipproblem3$(EXEEXT): $(mipproblem3_OBJECTS) $(mipproblem3_DEPENDENCIES) $(EXTRA_mipproblem3_DEPENDENCIES) 
+	@rm -f mipproblem3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mipproblem3_OBJECTS) $(mipproblem3_LDADD) $(LIBS)
+
+mipproblem4$(EXEEXT): $(mipproblem4_OBJECTS) $(mipproblem4_DEPENDENCIES) $(EXTRA_mipproblem4_DEPENDENCIES) 
+	@rm -f mipproblem4$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mipproblem4_OBJECTS) $(mipproblem4_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mipproblem4.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+ascii_dump_load1.log: ascii_dump_load1$(EXEEXT)
+	@p='ascii_dump_load1$(EXEEXT)'; \
+	b='ascii_dump_load1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions1.log: exceptions1$(EXEEXT)
+	@p='exceptions1$(EXEEXT)'; \
+	b='exceptions1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem1.log: mipproblem1$(EXEEXT)
+	@p='mipproblem1$(EXEEXT)'; \
+	b='mipproblem1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem2.log: mipproblem2$(EXEEXT)
+	@p='mipproblem2$(EXEEXT)'; \
+	b='mipproblem2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem3.log: mipproblem3$(EXEEXT)
+	@p='mipproblem3$(EXEEXT)'; \
+	b='mipproblem3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mipproblem4.log: mipproblem4$(EXEEXT)
+	@p='mipproblem4$(EXEEXT)'; \
+	b='mipproblem4'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/MIP_Problem/ascii_dump_load1.cc b/tests/MIP_Problem/ascii_dump_load1.cc
new file mode 100644
index 0000000..f34a673
--- /dev/null
+++ b/tests/MIP_Problem/ascii_dump_load1.cc
@@ -0,0 +1,418 @@
+/* Test MIP_Problem::ascii_dump() and MIP_Problem::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 2);
+  cs.insert(B >= 0);
+
+  Linear_Expression cost(A + 2*B);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(10*A - B >= 11);
+  cs.insert(B >= 0);
+
+  Linear_Expression cost(17*A + 2*B);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  f.seekp(0);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = !mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(1);
+
+  Constraint_System cs;
+  cs.insert(15*A - C >= 11);
+  cs.insert(B >= 0);
+  cs.insert(C <= 11);
+
+  Linear_Expression cost(17*A + 2*B -2*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "opt_mode");
+  f.seekp(0, ios_base::cur);
+  f << " Q";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = !mip2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 10);
+  cs.insert(A <= 5);
+  cs.insert(C <= 11);
+
+  Linear_Expression cost(A + 2*B + 3*C);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 123);
+  cs.insert(A + 2*B + 11*C <= 5434);
+  cs.insert(C <= 11);
+
+  Linear_Expression cost(A - 11*B);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MINIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "base(");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = !mip2.ascii_load(f);
+  close(f);
+  return ok;
+}
+
+// Unfeasible problem, not solved.
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B >= 10);
+  cs.insert(B + C <= 15);
+
+  Linear_Expression cost(A + 2*B);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Unbounded problem, not solved.
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+
+  cs.insert(A >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + A <= 15);
+
+  Linear_Expression cost(1*C);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  MIP_Problem mip2;
+  open(f, my_file, ios_base::in);
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Problem with optimum, not solved.
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + C <= 15);
+  cs.insert(A <= 30);
+  cs.insert(B <= 50);
+
+  Linear_Expression cost(1*C + 2*B);
+
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) &&
+    mip1.optimizing_point() == mip2.optimizing_point();
+  close(f);
+  return ok;
+}
+
+// Unfeasible problem, solved.
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B >= 10);
+  cs.insert(B + C <= 15);
+
+  Linear_Expression cost(A + 2*B);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Unbounded problem, solved.
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+
+  cs.insert(A >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + A <= 15);
+
+  Linear_Expression cost(1*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  MIP_Problem mip2;
+  open(f, my_file, ios_base::in);
+  bool ok = mip2.ascii_load(f) && mip1.solve() == mip2.solve();
+  close(f);
+  return ok;
+}
+
+// Problem with optimum, solved.
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + C <= 15);
+  cs.insert(A <= 30);
+  cs.insert(B <= 50);
+
+  Linear_Expression cost(1*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.solve();
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) &&
+    mip1.optimizing_point() == mip2.optimizing_point();
+  close(f);
+  return ok;
+}
+
+// Problem with optimum and integer variables, solved.
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 2);
+  cs.insert(C >= 10);
+  cs.insert(B + C <= 15);
+  cs.insert(A <= 20);
+  cs.insert(B <= 40);
+
+  Linear_Expression cost(1*C);
+  MIP_Problem mip1(cs.space_dimension(), cs, cost, MAXIMIZATION);
+  mip1.add_to_integer_space_dimensions(Variables_Set(A,C));
+  mip1.solve();
+  fstream f;
+  open(f, my_file, ios_base::out);
+  mip1.ascii_dump(f);
+  close(f);
+  open(f, my_file, ios_base::in);
+  MIP_Problem mip2;
+  bool ok = mip2.ascii_load(f) &&
+    mip1.optimizing_point() == mip2.optimizing_point();
+  close(f);
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+  DO_TEST_F16(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/MIP_Problem/exceptions1.cc b/tests/MIP_Problem/exceptions1.cc
new file mode 100644
index 0000000..51aecdd
--- /dev/null
+++ b/tests/MIP_Problem/exceptions1.cc
@@ -0,0 +1,508 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A > -6);
+  MIP_Problem mip(cs.space_dimension());
+
+  try {
+    // This tries to build an invalid MIP_Problem object: the feasible
+    // region can not be defined using strict inequalities.
+    mip.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable A(0);
+  MIP_Problem mip;
+
+  try {
+    // This tries to build an invalid MIP_Problem object: the space dimension
+    // of the objective function can not be greater than the space dimension
+    // of the feasible region.
+    mip.set_objective_function(A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+
+  try {
+    // We cannot extract a feasible point from an unsatisfiable MIP_Problem.
+    Generator fp = mip.feasible_point();
+  }
+  catch (std::domain_error& e) {
+    nout << "domain_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+
+  try {
+    // We cannot extract an optimizing point from an unbounded MIP_Problem.
+    Generator fp = mip.optimizing_point();
+  }
+  catch (std::domain_error& e) {
+    nout << "domain_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+  Generator p = point(A + B);
+  Coefficient num;
+  Coefficient den;
+
+  try {
+    // This tries to evaluate the objective function on a space-dimension
+    // incompatible generator.
+    mip.evaluate_objective_function(p, num, den);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  MIP_Problem mip(cs.space_dimension(), cs, A, MAXIMIZATION);
+  Generator r = ray(A);
+  Coefficient num;
+  Coefficient den;
+
+  try {
+    // This tries to evaluate the objective function on a ray.
+    mip.evaluate_objective_function(r, num, den);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  try {
+    // This tries to overflow the maximum space dimension.
+    MIP_Problem mip(MIP_Problem::max_space_dimension() + 1);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test08() {
+  MIP_Problem mip(1);
+  try {
+    // This tries to overflow the maximum space dimension.
+    mip.add_space_dimensions_and_embed(MIP_Problem::max_space_dimension());
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to make the cost function incompatible with the MIP_Problem
+    // space dimension.
+    MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to overflow the maximum space dimension.
+    MIP_Problem mip(MIP_Problem::max_space_dimension() + 1,
+                    cs, cost, MAXIMIZATION);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(A < 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to build an MIP_Problem with strict inequalities.
+    MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // This tries to add Constraint that exceeds the MIP_Problem
+    // space dimension.
+    mip.add_constraint(C >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // This tries to add a strict inequality.
+    mip.add_constraint(B > 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  Constraint_System incompatible_cs;
+  incompatible_cs.insert(C >= 6);
+  incompatible_cs.insert(D <= 0);
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // Adds a Constraint_System that exceeds the space dimension of the
+    // MIP_Problem.
+    mip.add_constraints(incompatible_cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+  dimension_type cs_space_dimension = cs.space_dimension();
+
+  Linear_Expression cost(A + B);
+
+  Constraint_System incompatible_cs;
+  incompatible_cs.insert(A >= 10);
+  incompatible_cs.insert(B < 22 );
+
+  MIP_Problem mip(cs_space_dimension, cs, cost, MAXIMIZATION);
+  try {
+    // This tries to add Constraint_System that contains a strict inequality.
+    mip.add_constraints(incompatible_cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to overflow the maximum space dimension.
+    MIP_Problem mip(MIP_Problem::max_space_dimension() + 1,
+                    cs.begin(), cs.end(),
+                    A + B, MAXIMIZATION);
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to let exceed the objective function space dimension.
+    MIP_Problem mip(cs.space_dimension(),
+                    cs.begin(), cs.end(),
+                    A + B + C, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B < 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to build an MIP_Problem with strict inequalities..
+    MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(),
+                    A + B, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 6);
+  cs.insert(B <= 0);
+
+  Linear_Expression cost(A + B);
+
+  try {
+    // This tries to build an MIP_Problem with a wrong space dimension.
+    MIP_Problem mip(cs.space_dimension() - 1, cs.begin(), cs.end(),
+                    A + B, MAXIMIZATION);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem1.cc b/tests/MIP_Problem/mipproblem1.cc
new file mode 100644
index 0000000..099082e
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem1.cc
@@ -0,0 +1,1696 @@
+/* Test the MIP_Problem class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable X01(0);
+  Variable X02(1);
+  Variable X03(2);
+  Variable X04(3);
+  Variable X05(4);
+  Variable X06(5);
+  Variable X07(6);
+  Variable X08(7);
+  Variable X09(8);
+  Variable X10(9);
+  Variable X11(10);
+  Variable X12(11);
+  Variable X13(12);
+  Variable X14(13);
+  Variable X15(14);
+  Variable X16(15);
+  Variable X17(16);
+  Variable X18(17);
+  Variable X19(18);
+  Variable X20(19);
+  Variable X21(20);
+  Variable X22(21);
+  Variable X23(22);
+  Variable X24(23);
+  Variable X25(24);
+  Variable X26(25);
+  Variable X27(26);
+  Variable X28(27);
+  Variable X29(28);
+  Variable X30(29);
+  Variable X31(30);
+  Variable X32(31);
+  Variable X33(32);
+  Variable X34(33);
+  Variable X35(34);
+  Variable X36(35);
+  Variable X37(36);
+  Variable X38(37);
+  Variable X39(38);
+
+  Constraint_System cs;
+  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+  cs.insert(-X01 >= -80);
+  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+  cs.insert(Coefficient("2386907802506363")*X06
+            + Coefficient("2386907802506363")*X07
+            + Coefficient("1080863910568919")*X08
+            + Coefficient("7746191359077253")*X09
+            - X16 == 0);
+  cs.insert(-X06 + X10 >= -80);
+  cs.insert(-X07 + X11 >= 0);
+  cs.insert(-X08 + X12 >= 0);
+  cs.insert(-X09 + X13 >= 0);
+  cs.insert(X22 - X23 - X24 - X25 == 0);
+  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+  cs.insert(-X22 >= -500);
+  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+  cs.insert(Coefficient("7746191359077253")*X28
+            + Coefficient("7746191359077253")*X29
+            + Coefficient("3512807709348987")*X30
+            + Coefficient("3332663724254167")*X31
+            - X38 == 0);
+  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+  cs.insert(-X28 + X32 >= -500);
+  cs.insert(-X29 + X33 >= 0);
+  cs.insert(-X30 + X34 >= 0);
+  cs.insert(-X31 + X35 >= 0);
+  cs.insert(Coefficient("-2661627379775963")*X10
+            - Coefficient("2686397177726501")*X11
+            - Coefficient("5422333951354077")*X12
+            - Coefficient("5469621747441467")*X13
+            + X25
+            - Coefficient("2466846695892189")*X32
+            - Coefficient("4996743786567565")*X33
+            - Coefficient("5064297780978123")*X34
+            - Coefficient("641481471923585")*X35 >= 0);
+  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+  cs.insert(X15
+            - Coefficient("7854277750134145")*X28
+            - Coefficient("7782220156096217")*X29
+            - Coefficient("7782220156096217")*X30
+            - Coefficient("7710162562058289")*X31 >= 0);
+  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+  cs.insert(X21 >= 2);
+  cs.insert(-X16 - X38 >= -300);
+  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  // Cost function.
+  Linear_Expression cost(-10*X02 - 8*X14 - 15*X23 - 12*X36 + 250*X39);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  // Computed numerator and denominator.
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 11000;
+  Coefficient den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // The feasible / optimizing point.
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+
+  // Making mip unfeasible.
+  Constraint_System further_cs;
+  further_cs.insert(X05 >= 5);
+  further_cs.insert(X05 <= 3);
+  mip.add_constraints(further_cs);
+
+  return !mip.is_satisfiable();
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  // Cost function
+  Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A - B + C >= 24);
+  cs.insert(B <= 320);
+  cs.insert(A + B + 2*D == 23);
+  cs.insert(A + 2*B + E == 4112);
+  cs.insert(7*A + 5*B + F <= 200);
+  cs.insert(138*A + 2*G == 25);
+  cs.insert(23*A + 342*B - 34*H == 99);
+  for (dimension_type i = A.id(); i <= H.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+  if (pg != pg_kr)
+    return false;
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 1084869;
+  Coefficient den_kr = 76;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize using another objective function.
+  Linear_Expression new_cost = -51*A + 632*B;
+  mip.set_objective_function(new_cost);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 14536;
+  den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize after changing optimization mode.
+  mip.set_optimization_mode(MINIMIZATION);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(17100*A + 26174*B + 2274482*C
+                + 1063871*D + 388070456*E + 18627830*F + 0*H,
+                94392);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 3917467;
+  den_kr = 23598;
+
+  return num == num_kr && den == den_kr;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+            >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+            + Coefficient("3643488632714799")*B
+            - Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A +
+            Coefficient("3643488632714799")*B
+            + Coefficient("2251799813685248")*C >=
+            Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+            + Coefficient("4503599627370496")*B
+            + Coefficient("7286977274436797")*D
+            >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*D
+            >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+            + Coefficient("7286977274436797")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            + Coefficient("7286977274436797")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            - Coefficient("7286977274436797")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            - Coefficient("7286977274436797")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+            - Coefficient("1125899906842624")*B
+            + Coefficient("1821744319735099")*D
+            >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+            - Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*D
+            >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+            - Coefficient("3643488630462999")*B
+            + Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+            - Coefficient("1821744320860999")*B
+            - Coefficient("1125899906842624")*C
+            >= Coefficient("-9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("11790576924325290")*B
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("11790576924325290")*B
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("4503599627370496")*B
+            + Coefficient("11790576865778496")*C
+            >= Coefficient("-38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("11790576870282096")*C
+            >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+            + Coefficient("1125899906842624")*C
+            + Coefficient("2947644226577723")*D
+            >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+            + Coefficient("1125899906842624")*C
+            - Coefficient("2947644226577723")*
+            D >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            + Coefficient("2947644228829523")*D
+            >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            - Coefficient("2947644228829523")*D
+            >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+            - Coefficient("2251799813685248")*B
+            + Coefficient("5895288468918045")*C
+            >= Coefficient("-19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("5895288468918045")*C
+            >= Coefficient("-19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+            - Coefficient("11790576906310892")*B
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+            - Coefficient("5895288446400047")*B
+            - Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576753188506")*B
+            + Coefficient("7286977179861205")*C
+            >= Coefficient("-38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576766699304")*B
+            - Coefficient("7286977179861205")*C
+            >= Coefficient("-38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("7286977157343207")*B
+            + Coefficient("11790576712656108")*D
+            >= Coefficient("-38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+            + Coefficient("3643488592182402")*B
+            - Coefficient("5895288374342453")*D
+            >= Coefficient("-19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576753188506")*C
+            + Coefficient("7286977175357605")*D
+            >= Coefficient("-38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+            + Coefficient("5895288390105051")*C
+            - Coefficient("3643488594434202")*D
+            >= Coefficient("-19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("5895288421630249")*C
+            + Coefficient("3643488619204000")*D
+            >= Coefficient("-19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("11790576865778496")*C
+            - Coefficient("7286977247415199")*D
+            >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("7286977247415199")*B
+            + Coefficient("11790576888296494")*D
+            >= Coefficient("-38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("3643488639470198")*B
+            - Coefficient("5895288464414445")*D
+            >= Coefficient("-19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("5895288428385648")*B
+            + Coefficient("3643488630462999")*C
+            >= Coefficient("-19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("11790576843260498")*B
+            - Coefficient("7286977224897201")*C
+            >= Coefficient("-38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+            >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+            + Coefficient("2251799813685248")*C
+            + Coefficient("3643488630462999")*D
+            >= Coefficient("-19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+            + Coefficient("2251799813685248")*C
+            - Coefficient("3643488628211199")*D
+            >= Coefficient("-19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+            - Coefficient("4503599627370496")*C
+            + Coefficient("7286977269933197")*D
+            >= Coefficient("-38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+            - Coefficient("2251799813685248")*C
+            - Coefficient("3643488632714799")*D
+            >= Coefficient("-19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+            + Coefficient("11790576919821692")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+            + Coefficient("5895288486932443")*C
+            - Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+            - Coefficient("5895288446400047")*C
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+            - Coefficient("11790576937836090")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+            + Coefficient("7286977247415199")*C
+            + Coefficient("11790576883792894")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+            + Coefficient("7286977251918799")*C
+            - Coefficient("11790576883792894")*D
+            >= Coefficient("-38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+            - Coefficient("7286977229400801")*C
+            + Coefficient("11790576852267696")*D
+            >= Coefficient("-38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+            >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+            - Coefficient("7286977229400801")*C
+            - Coefficient("11790576852267696")*D
+            >= Coefficient("-38155108167840592"));
+  cs.insert(Coefficient("-2251799813685248")*D
+            >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+            >= Coefficient("-5895288446400047"));
+  cs.insert(Coefficient("-2251799813685248")*C
+            >= Coefficient("-5895288444148247"));
+  cs.insert(Coefficient("-1125899906842624")*B
+            + Coefficient("1821744321986899")*C
+            + Coefficient("2947644226577723")*D
+            >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("-3643488607945001")*B
+            + Coefficient("5895288414874849")*C
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-4503599627370496")*B
+            + Coefficient("7286977292451195")*C
+            - Coefficient("11790576906310892")*D
+            >= Coefficient("-38155108343480984"));
+  cs.insert(Coefficient("-7286977220393601")*B
+            + Coefficient("11790576829749698")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108086775800"));
+  cs.insert(Coefficient("-4503599627370496")*B
+            - Coefficient("7286977274436797")*C
+            + Coefficient("11790576901807292")*D
+            >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("-3643488605693201")*B
+            - Coefficient("5895288414874849")*C
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-1125899906842624")*B
+            - Coefficient("1821744319735099")*C
+            - Coefficient("2947644225451823")*D
+            >= Coefficient("-9538777079114846"));
+  cs.insert(Coefficient("-7286977220393601")*B
+            - Coefficient("11790576834253298")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108113797400"));
+  cs.insert(Coefficient("-5895288462162645")*B
+            + Coefficient("2251799813685248")*C
+            + Coefficient("3643488639470198")*D
+            >= Coefficient("-19077554144718892"));
+  cs.insert(Coefficient("-11790576924325290")*B
+            - Coefficient("4503599627370496")*C
+            + Coefficient("7286977292451195")*D
+            >= Coefficient("-38155108320962984"));
+  cs.insert(Coefficient("-5895288468918045")*B
+            + Coefficient("2251799813685248")*C
+            - Coefficient("3643488641721998")*D
+            >= Coefficient("-19077554160481492"));
+  cs.insert(Coefficient("-11790576928828890")*B
+            - Coefficient("4503599627370496")*C
+            - Coefficient("7286977292451195")*D
+            >= Coefficient("-38155108329970184"));
+  cs.insert(Coefficient("-281474976710656")*B
+            >= Coefficient("-736911053829681"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            + Coefficient("11790576658612912")*B
+            + Coefficient("7286977125818009")*C
+            >= Coefficient("-38155107627408640"));
+  cs.insert(Coefficient("-2251799813685248")*A
+            + Coefficient("5895288336061856")*B
+            - Coefficient("3643488560657205")*C
+            >= Coefficient("-19077553829466920"));
+  cs.insert(Coefficient("-2251799813685248")*A
+            + Coefficient("3643488535887407")*B
+            + Coefficient("5895288288774060")*D
+            >= Coefficient("-19077553683099932"));
+  cs.insert(Coefficient("-7286977274436797")*A
+            + Coefficient("11790576766699304")*B
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108032732608"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            + Coefficient("7286977098796411")*B
+            - Coefficient("11790576609073318")*D
+            >= Coefficient("-38155107483293448"));
+  cs.insert(Coefficient("-7286977301458395")*A
+            + Coefficient("11790576735174106")*B
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155107983193008"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            + Coefficient("11790576708152508")*C
+            + Coefficient("7286977148336007")*D
+            >= Coefficient("-38155107771523824"));
+  cs.insert(Coefficient("-281474976710656")*A
+            + Coefficient("281474976710656")*B
+            + Coefficient("281474976710656")*C
+            + Coefficient("281474976710656")*D
+            >= Coefficient("-1473822119481311"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("2947644178164027")*C
+            - Coefficient("1821744285958102")*D
+            >= Coefficient("-9538776941755056"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            + Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("11790576856771296")*C
+            + Coefficient("7286977247415199")*D
+            >= Coefficient("-38155108221883792"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            + Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-140737488355328")*A
+            - Coefficient("368455526774103")*C
+            - Coefficient("227718038700250")*D
+            >= Coefficient("-1192347131793131"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-3643488643973798")*A
+            + Coefficient("2251799813685248")*B
+            + Coefficient("5895288441896447")*C
+            >= Coefficient("-19077554158229692"));
+  cs.insert(Coefficient("-7286977296954795")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("11790576892800094")*C
+            >= Coefficient("-38155108352488176"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("7286977269933197")*B
+            + Coefficient("11790576924325290")*D
+            >= Coefficient("-38155108411034976"));
+  cs.insert(Coefficient("-3643488639470198")*A
+            + Coefficient("2251799813685248")*C
+            + Coefficient("5895288466666245")*D
+            >= Coefficient("-19077554219028288"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("7286977296954795")*B
+            - Coefficient("11790576955850488")*D
+            >= Coefficient("-38155108514617768"));
+  cs.insert(Coefficient("-7286977251918799")*A
+            + Coefficient("4503599627370496")*C
+            - Coefficient("11790576892800094")*D
+            >= Coefficient("-38155108311955784"));
+  cs.insert(Coefficient("-3643488655232797")*A
+            - Coefficient("2251799813685248")*C
+            + Coefficient("5895288480177044")*D
+            >= Coefficient("-19077554264064284"));
+  cs.insert(Coefficient("-1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            - Coefficient("2947644229955423")*D
+            >= Coefficient("-9538777099381044"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("11790576874785696")*B
+            + Coefficient("7286977269933197")*C
+            >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-7286977274436797")*A
+            - Coefficient("4503599627370496")*B
+            + Coefficient("11790576937836090")*C
+            >= Coefficient("-38155108424545776"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("11790576802728102")*B
+            - Coefficient("7286977197875603")*C
+            >= Coefficient("-38155108019221808"));
+  cs.insert(Coefficient("-3643488664239996")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("5895288493687843")*C
+            >= Coefficient("-19077554284330480"));
+  cs.insert(Coefficient("-562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644250784571"));
+  cs.insert(Coefficient("-281474976710656")*A
+            - Coefficient("281474976710656")*B
+            + Coefficient("281474976710656")*C
+            - Coefficient("281474976710656")*D
+            >= Coefficient("-1473822131021785"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            - Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            + Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            - Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288468918045"));
+  cs.insert(Coefficient("-3643488412038417")*A
+            - Coefficient("5895288318047457")*B
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077553665085532"));
+  cs.insert(Coefficient("-1821744199263809")*A
+            - Coefficient("2947644153394229")*B
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-9538776813402468"));
+  cs.insert(Coefficient("-5895288378846052")*A
+            + Coefficient("3643488632714799")*B
+            + Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554023121704"));
+  cs.insert(Coefficient("-11790576834253298")*A
+            + Coefficient("7286977314969193")*B
+            - Coefficient("4503599627370496")*C
+            >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-736911041726257")*A
+            + Coefficient("281474976710656")*B
+            + Coefficient("455436077400500")*D
+            >= Coefficient("-2384694241068264"));
+  cs.insert(Coefficient("-5895288347320855")*A
+            + Coefficient("2251799813685248")*B
+            - Coefficient("3643488616952200")*D
+            >= Coefficient("-19077553951064108"));
+  cs.insert(Coefficient("-2947644201807925")*A
+            + Coefficient("1821744319735099")*C
+            + Coefficient("1125899906842624")*D
+            >= Coefficient("-9538777048715548"));
+  cs.insert(Coefficient("-11790576820742500")*A
+            + Coefficient("7286977296954795")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108248905384"));
+  cs.insert(Coefficient("-11790576996382886")*A
+            - Coefficient("7286977251918799")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108523624968"));
+  cs.insert(Coefficient("-5895288507198642")*A
+            - Coefficient("3643488632714799")*C
+            - Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554291085880"));
+  cs.insert(Coefficient("-11790577113476476")*A
+            - Coefficient("4503599627370496")*B
+            + Coefficient("7286977319472793")*D
+            >= Coefficient("-38155108861394936"));
+  cs.insert(Coefficient("-5895288572500836")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("3643488652980997")*D
+            >= Coefficient("-19077554450963668"));
+  cs.insert(Coefficient("-5895288484680644")*A
+            - Coefficient("3643488607945001")*B
+            + Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554212272888"));
+  cs.insert(Coefficient("-2947644274991419")*A
+            - Coefficient("1821744320860999")*B
+            - Coefficient("1125899906842624")*C
+            >= Coefficient("-9538777190578936"));
+  cs.insert(Coefficient("-2251799813685248")*A
+            >= Coefficient("-5895288448651847"));
+
+  // Cost function
+  Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point obtained by simplex:\n";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "\nOptimum value = " << num << "/" << den << endl;
+
+  C_Polyhedron ph(cs);
+  Coefficient num1;
+  Coefficient den1;
+  bool maximum;
+  Generator pg1 = point();
+  ph.maximize(cost, num1, den1, maximum, pg1);
+
+  nout << "\nOptimizing point obtained by enumeration:\n";
+  print_generator(pg1);
+  nout << "\nOptimum value = " << num1 << "/" << den1 << endl;
+
+  return maximum && num == num1 && den == den1 && pg == pg1;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+
+  // Cost function
+  Linear_Expression cost(-26*A + 343*B + 1233*D - C + F);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A - B + C >= 24);
+  cs.insert(B <= 320);
+  cs.insert(A + B + 2*D == 23);
+  cs.insert(A + 2*B + E == 4112);
+  cs.insert(7*A + 5*B + F <= 200);
+  cs.insert(138*A + 2*G == 25);
+  cs.insert(23*A + 342*B - 34*H == 99);
+  for (dimension_type i = A.id(); i <= H.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  pg_kr = point(22*B + 1846*C + 863*D + 312468*E + 15090*F + 950*G + 0*H, 76);
+  if (pg != pg_kr)
+    return false;
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = 1084869;
+  Coefficient den_kr = 76;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize using another objective function.
+  Linear_Expression new_cost = -51*A + 632*B;
+  mip.set_objective_function(new_cost);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(782*B + 1598*C + 138244*E + 2890*F + 425*G + 7767*H, 34);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 14536;
+  den_kr = 1;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  // Reoptimize after changing optimization mode.
+  mip.set_optimization_mode(MINIMIZATION);
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  pg_kr = point(17100*A + 26174*B + 2274482*C
+                + 1063871*D + 388070456*E + 18627830*F + 0*H,
+                94392);
+  if (pg != pg_kr)
+    return false;
+
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  num_kr = 3917467;
+  den_kr = 23598;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+            >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+            + Coefficient("3643488632714799")*B
+            - Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A +
+            Coefficient("3643488632714799")*B
+            + Coefficient("2251799813685248")*C >=
+            Coefficient("-19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+            + Coefficient("4503599627370496")*B
+            + Coefficient("7286977274436797")*D
+            >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*D
+            >= Coefficient("-38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+            + Coefficient("7286977274436797")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            + Coefficient("7286977274436797")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            - Coefficient("7286977274436797")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            - Coefficient("7286977274436797")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+            - Coefficient("1125899906842624")*B
+            + Coefficient("1821744319735099")*D
+            >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+            - Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*D
+            >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+            - Coefficient("3643488630462999")*B
+            + Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+            - Coefficient("1821744320860999")*B
+            - Coefficient("1125899906842624")*C
+            >= Coefficient("-9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("11790576924325290")*B
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("11790576924325290")*B
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("4503599627370496")*B
+            + Coefficient("11790576865778496")*C
+            >= Coefficient("-38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("11790576870282096")*C
+            >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+            + Coefficient("1125899906842624")*C
+            + Coefficient("2947644226577723")*D
+            >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+            + Coefficient("1125899906842624")*C
+            - Coefficient("2947644226577723")*
+            D >= Coefficient("-9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            + Coefficient("2947644228829523")*D
+            >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            - Coefficient("2947644228829523")*D
+            >= Coefficient("-9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+            - Coefficient("2251799813685248")*B
+            + Coefficient("5895288468918045")*C
+            >= Coefficient("-19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("5895288468918045")*C
+            >= Coefficient("-19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+            - Coefficient("11790576906310892")*B
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+            - Coefficient("5895288446400047")*B
+            - Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576753188506")*B
+            + Coefficient("7286977179861205")*C
+            >= Coefficient("-38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576766699304")*B
+            - Coefficient("7286977179861205")*C
+            >= Coefficient("-38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("7286977157343207")*B
+            + Coefficient("11790576712656108")*D
+            >= Coefficient("-38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+            + Coefficient("3643488592182402")*B
+            - Coefficient("5895288374342453")*D
+            >= Coefficient("-19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576753188506")*C
+            + Coefficient("7286977175357605")*D
+            >= Coefficient("-38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+            + Coefficient("5895288390105051")*C
+            - Coefficient("3643488594434202")*D
+            >= Coefficient("-19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("5895288421630249")*C
+            + Coefficient("3643488619204000")*D
+            >= Coefficient("-19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("11790576865778496")*C
+            - Coefficient("7286977247415199")*D
+            >= Coefficient("-38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("7286977247415199")*B
+            + Coefficient("11790576888296494")*D
+            >= Coefficient("-38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("3643488639470198")*B
+            - Coefficient("5895288464414445")*D
+            >= Coefficient("-19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("5895288428385648")*B
+            + Coefficient("3643488630462999")*C
+            >= Coefficient("-19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("11790576843260498")*B
+            - Coefficient("7286977224897201")*C
+            >= Coefficient("-38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+            >= Coefficient("-2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+            + Coefficient("2251799813685248")*C
+            + Coefficient("3643488630462999")*D
+            >= Coefficient("-19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+            + Coefficient("2251799813685248")*C
+            - Coefficient("3643488628211199")*D
+            >= Coefficient("-19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+            - Coefficient("4503599627370496")*C
+            + Coefficient("7286977269933197")*D
+            >= Coefficient("-38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+            - Coefficient("2251799813685248")*C
+            - Coefficient("3643488632714799")*D
+            >= Coefficient("-19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+            + Coefficient("11790576919821692")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+            + Coefficient("5895288486932443")*C
+            - Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+            - Coefficient("5895288446400047")*C
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+            - Coefficient("11790576937836090")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+            + Coefficient("7286977247415199")*C
+            + Coefficient("11790576883792894")*D
+            >= Coefficient("-38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+            + Coefficient("7286977251918799")*C
+            - Coefficient("11790576883792894")*D
+            >= Coefficient("-38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+            - Coefficient("7286977229400801")*C
+            + Coefficient("11790576852267696")*D
+            >= Coefficient("-38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+            >= Coefficient("-2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+            - Coefficient("7286977229400801")*C
+            - Coefficient("11790576852267696")*D
+            >= Coefficient("-38155108167840592"));
+  cs.insert(Coefficient("-2251799813685248")*D
+            >= Coefficient("-5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+            >= Coefficient("-5895288446400047"));
+  cs.insert(Coefficient("-2251799813685248")*C
+            >= Coefficient("-5895288444148247"));
+  cs.insert(Coefficient("-1125899906842624")*B
+            + Coefficient("1821744321986899")*C
+            + Coefficient("2947644226577723")*D
+            >= Coefficient("-9538777088122044"));
+  cs.insert(Coefficient("-3643488607945001")*B
+            + Coefficient("5895288414874849")*C
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-4503599627370496")*B
+            + Coefficient("7286977292451195")*C
+            - Coefficient("11790576906310892")*D
+            >= Coefficient("-38155108343480984"));
+  cs.insert(Coefficient("-7286977220393601")*B
+            + Coefficient("11790576829749698")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108086775800"));
+  cs.insert(Coefficient("-4503599627370496")*B
+            - Coefficient("7286977274436797")*C
+            + Coefficient("11790576901807292")*D
+            >= Coefficient("-38155108325466584"));
+  cs.insert(Coefficient("-3643488605693201")*B
+            - Coefficient("5895288414874849")*C
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554059150500"));
+  cs.insert(Coefficient("-1125899906842624")*B
+            - Coefficient("1821744319735099")*C
+            - Coefficient("2947644225451823")*D
+            >= Coefficient("-9538777079114846"));
+  cs.insert(Coefficient("-7286977220393601")*B
+            - Coefficient("11790576834253298")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108113797400"));
+  cs.insert(Coefficient("-5895288462162645")*B
+            + Coefficient("2251799813685248")*C
+            + Coefficient("3643488639470198")*D
+            >= Coefficient("-19077554144718892"));
+  cs.insert(Coefficient("-11790576924325290")*B
+            - Coefficient("4503599627370496")*C
+            + Coefficient("7286977292451195")*D
+            >= Coefficient("-38155108320962984"));
+  cs.insert(Coefficient("-5895288468918045")*B
+            + Coefficient("2251799813685248")*C
+            - Coefficient("3643488641721998")*D
+            >= Coefficient("-19077554160481492"));
+  cs.insert(Coefficient("-11790576928828890")*B
+            - Coefficient("4503599627370496")*C
+            - Coefficient("7286977292451195")*D
+            >= Coefficient("-38155108329970184"));
+  cs.insert(Coefficient("-281474976710656")*B
+            >= Coefficient("-736911053829681"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            + Coefficient("11790576658612912")*B
+            + Coefficient("7286977125818009")*C
+            >= Coefficient("-38155107627408640"));
+  cs.insert(Coefficient("-2251799813685248")*A
+            + Coefficient("5895288336061856")*B
+            - Coefficient("3643488560657205")*C
+            >= Coefficient("-19077553829466920"));
+  cs.insert(Coefficient("-2251799813685248")*A
+            + Coefficient("3643488535887407")*B
+            + Coefficient("5895288288774060")*D
+            >= Coefficient("-19077553683099932"));
+  cs.insert(Coefficient("-7286977274436797")*A
+            + Coefficient("11790576766699304")*B
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108032732608"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            + Coefficient("7286977098796411")*B
+            - Coefficient("11790576609073318")*D
+            >= Coefficient("-38155107483293448"));
+  cs.insert(Coefficient("-7286977301458395")*A
+            + Coefficient("11790576735174106")*B
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155107983193008"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            + Coefficient("11790576708152508")*C
+            + Coefficient("7286977148336007")*D
+            >= Coefficient("-38155107771523824"));
+  cs.insert(Coefficient("-281474976710656")*A
+            + Coefficient("281474976710656")*B
+            + Coefficient("281474976710656")*C
+            + Coefficient("281474976710656")*D
+            >= Coefficient("-1473822119481311"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("2947644178164027")*C
+            - Coefficient("1821744285958102")*D
+            >= Coefficient("-9538776941755056"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            + Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("11790576856771296")*C
+            + Coefficient("7286977247415199")*D
+            >= Coefficient("-38155108221883792"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            + Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288471169845"));
+  cs.insert(Coefficient("-140737488355328")*A
+            - Coefficient("368455526774103")*C
+            - Coefficient("227718038700250")*D
+            >= Coefficient("-1192347131793131"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-3643488643973798")*A
+            + Coefficient("2251799813685248")*B
+            + Coefficient("5895288441896447")*C
+            >= Coefficient("-19077554158229692"));
+  cs.insert(Coefficient("-7286977296954795")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("11790576892800094")*C
+            >= Coefficient("-38155108352488176"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("7286977269933197")*B
+            + Coefficient("11790576924325290")*D
+            >= Coefficient("-38155108411034976"));
+  cs.insert(Coefficient("-3643488639470198")*A
+            + Coefficient("2251799813685248")*C
+            + Coefficient("5895288466666245")*D
+            >= Coefficient("-19077554219028288"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("7286977296954795")*B
+            - Coefficient("11790576955850488")*D
+            >= Coefficient("-38155108514617768"));
+  cs.insert(Coefficient("-7286977251918799")*A
+            + Coefficient("4503599627370496")*C
+            - Coefficient("11790576892800094")*D
+            >= Coefficient("-38155108311955784"));
+  cs.insert(Coefficient("-3643488655232797")*A
+            - Coefficient("2251799813685248")*C
+            + Coefficient("5895288480177044")*D
+            >= Coefficient("-19077554264064284"));
+  cs.insert(Coefficient("-1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            - Coefficient("2947644229955423")*D
+            >= Coefficient("-9538777099381044"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("11790576874785696")*B
+            + Coefficient("7286977269933197")*C
+            >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-7286977274436797")*A
+            - Coefficient("4503599627370496")*B
+            + Coefficient("11790576937836090")*C
+            >= Coefficient("-38155108424545776"));
+  cs.insert(Coefficient("-4503599627370496")*A
+            - Coefficient("11790576802728102")*B
+            - Coefficient("7286977197875603")*C
+            >= Coefficient("-38155108019221808"));
+  cs.insert(Coefficient("-3643488664239996")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("5895288493687843")*C
+            >= Coefficient("-19077554284330480"));
+  cs.insert(Coefficient("-562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= Coefficient("-2947644250784571"));
+  cs.insert(Coefficient("-281474976710656")*A
+            - Coefficient("281474976710656")*B
+            + Coefficient("281474976710656")*C
+            - Coefficient("281474976710656")*D
+            >= Coefficient("-1473822131021785"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            - Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            + Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288464414445"));
+  cs.insert(Coefficient("-1125899906842624")*A
+            - Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-5895288468918045"));
+  cs.insert(Coefficient("-3643488412038417")*A
+            - Coefficient("5895288318047457")*B
+            + Coefficient("2251799813685248")*D
+            >= Coefficient("-19077553665085532"));
+  cs.insert(Coefficient("-1821744199263809")*A
+            - Coefficient("2947644153394229")*B
+            - Coefficient("1125899906842624")*D
+            >= Coefficient("-9538776813402468"));
+  cs.insert(Coefficient("-5895288378846052")*A
+            + Coefficient("3643488632714799")*B
+            + Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554023121704"));
+  cs.insert(Coefficient("-11790576834253298")*A
+            + Coefficient("7286977314969193")*B
+            - Coefficient("4503599627370496")*C
+            >= Coefficient("-38155108302948584"));
+  cs.insert(Coefficient("-736911041726257")*A
+            + Coefficient("281474976710656")*B
+            + Coefficient("455436077400500")*D
+            >= Coefficient("-2384694241068264"));
+  cs.insert(Coefficient("-5895288347320855")*A
+            + Coefficient("2251799813685248")*B
+            - Coefficient("3643488616952200")*D
+            >= Coefficient("-19077553951064108"));
+  cs.insert(Coefficient("-2947644201807925")*A
+            + Coefficient("1821744319735099")*C
+            + Coefficient("1125899906842624")*D
+            >= Coefficient("-9538777048715548"));
+  cs.insert(Coefficient("-11790576820742500")*A
+            + Coefficient("7286977296954795")*C
+            - Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108248905384"));
+  cs.insert(Coefficient("-11790576996382886")*A
+            - Coefficient("7286977251918799")*C
+            + Coefficient("4503599627370496")*D
+            >= Coefficient("-38155108523624968"));
+  cs.insert(Coefficient("-5895288507198642")*A
+            - Coefficient("3643488632714799")*C
+            - Coefficient("2251799813685248")*D
+            >= Coefficient("-19077554291085880"));
+  cs.insert(Coefficient("-11790577113476476")*A
+            - Coefficient("4503599627370496")*B
+            + Coefficient("7286977319472793")*D
+            >= Coefficient("-38155108861394936"));
+  cs.insert(Coefficient("-5895288572500836")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("3643488652980997")*D
+            >= Coefficient("-19077554450963668"));
+  cs.insert(Coefficient("-5895288484680644")*A
+            - Coefficient("3643488607945001")*B
+            + Coefficient("2251799813685248")*C
+            >= Coefficient("-19077554212272888"));
+  cs.insert(Coefficient("-2947644274991419")*A
+            - Coefficient("1821744320860999")*B
+            - Coefficient("1125899906842624")*C
+            >= Coefficient("-9538777190578936"));
+  cs.insert(Coefficient("-2251799813685248")*A
+            >= Coefficient("-5895288448651847"));
+
+  // Cost function
+  Linear_Expression cost(10*A + 21*B + 31*C + 45*D);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+
+  return true;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression cost(A + B);
+  Constraint_System cs;
+  cs.insert(-A - B >= -8);
+  cs.insert(-A - 3*B >= -18);
+  cs.insert(-A + B >= -4);
+  cs.insert(A >= 0);
+  cs.insert(A <= 3);
+  cs.insert(B >= 0);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  const Coefficient num_kr = 8;
+  const Coefficient den_kr = 1;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(3*A + 5*B);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression cost(A + B);
+  Constraint_System cs;
+  cs.insert(-A - 3*B >= -4);
+  cs.insert(-5*A - B >= -5);
+  cs.insert(-3*A - 2*B >= -2);
+  cs.insert(A + 3*B >= -1);
+  cs.insert(2*A - B >= -2);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Coefficient num_kr = 8;
+  Coefficient den_kr = 7;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(-2*A + 10*B, 7);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 1;
+  den_kr = 1;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(B);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Linear_Expression cost(12*A + 6*B + 4*C + 3*D);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+  cs.insert(3008*A + 20980*B - 97775*C - 101225*D >= 0);
+  cs.insert(3985*A + 25643*B - 135871*C - 130580*D >= 0);
+  cs.insert(4324*A + 26978*B - 133655*C - 168473*D >= 0);
+  cs.insert(3534*A + 25361*B - 46243*C - 100407*D >= 0);
+  cs.insert(8836*A + 40796*B - 176661*C - 215616*D >= 0);
+  cs.insert(5376*A + 37562*B - 182576*C - 217615*D >= 0);
+  cs.insert(2491*A + 16544*B - 49440*C - 83639*D >= 0);
+  cs.insert(4775*A + 39122*B - 136701*C - 193393*D >= 0);
+  cs.insert(8046*A + 42958*B - 225138*C - 256575*D >= 0);
+  cs.insert(8554*A + 48955*B - 257370*C - 312877*D >= 0);
+  cs.insert(6147*A + 45514*B - 165274*C - 227099*D >= 0);
+  cs.insert(8366*A + 55140*B - 203989*C - 321623*D >= 0);
+  cs.insert(13479*A + 68037*B - 174270*C - 341743*D >= 0);
+  cs.insert(21808*A + 78302*B - 322990*C - 487539*D >= 0);
+  cs.insert(-8554*A - 48955*B >= -10000);
+  cs.insert(-257370*C - 312877*D >= -10000);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Coefficient num_kr = Coefficient("8231960000");
+  Coefficient den_kr = 581120267;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(679355000*A + 19925000*C + 0*D, 581120267);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = Coefficient("81926256268");
+  den_kr = Coefficient("6651564805");
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(Coefficient("6651564805")*A + 196469466*B + 232165453*C + 0*D,
+                Coefficient("6651564805"));
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 1646392;
+  den_kr = 135871;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(135871*A + 3985*C + 0*D, 135871);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable C to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(C));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 2335041;
+  den_kr = 193393;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(193393*A + 4775*D, 193393);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable D to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(D));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  num_kr = 12;
+  den_kr = 1;
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  pg_kr = point(A + 0*D);
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression cost(A + B + C);
+  Constraint_System cs;
+  cs.insert(A >= -1);
+  cs.insert(B >= -1);
+  cs.insert(C >= -1);
+  cs.insert(-A >= -1);
+  cs.insert(-B >= -1);
+  cs.insert(-C >= -1);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MAXIMIZATION);
+
+  Coefficient num_kr = 3;
+  Coefficient den_kr = 1;
+  Coefficient num;
+  Coefficient den;
+
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(A + B + C);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set variable C to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(C));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  return true;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A + B <= 1);
+  cs.insert(A + C <= 1);
+  cs.insert(B + C <= 1);
+
+  // All integer variables.
+  Variables_Set ivs(A, C);
+
+  // Cost function.
+  Linear_Expression cost(-2*A - 3*B - 4*C);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+                  MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+  DO_TEST_F32(test02);
+  DO_TEST_F64(test03);
+  DO_TEST_F32(test04);
+  DO_TEST_F64(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_F64(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem2.cc b/tests/MIP_Problem/mipproblem2.cc
new file mode 100644
index 0000000..73b74fa
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem2.cc
@@ -0,0 +1,176 @@
+/* Test the MIP_Problem class with instances that require a watchdog timer.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+class Timeout : virtual public std::exception,
+                public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "Timeout in refine1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  Timeout() {
+  }
+
+  ~Timeout() throw() {
+  }
+};
+
+Timeout t;
+
+bool test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression cost(10*A + 3*B);
+  Constraint_System cs;
+  cs.insert(A + B >= 0);
+  cs.insert(B >= 0);
+  cs.insert(B == 3);
+  cs.insert(2*C + 2*D == 9);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(), cs, cost, MINIMIZATION);
+  Coefficient num_kr = -21;
+  Coefficient den_kr = 1;
+  Coefficient num;
+  Coefficient den;
+  Generator pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point(-6*A + 6*B + 9*D, 2);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable A to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(A));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable B to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(B));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable C to be constrained to have an integer value.
+  mip.add_to_integer_space_dimensions(Variables_Set(C));
+  pg = mip.optimizing_point();
+  mip.evaluate_objective_function(pg, num, den);
+
+  nout << "Optimum value = " << num << "/" << den << endl;
+  if (num != num_kr || den != den_kr)
+    return false;
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  if (pg != pg_kr)
+    return false;
+
+  // Set Variable D to be constrained to have an integer value.
+  // This will cause branch-and-bound not to terminate any longer.
+  mip.add_to_integer_space_dimensions(Variables_Set(D));
+
+  try {
+    // Set a 2 seconds timeout.
+    Parma_Polyhedra_Library::Watchdog
+      w(200, abandon_expensive_computations, t);
+
+    pg = mip.optimizing_point();
+
+    // We should never get here.
+    abandon_expensive_computations = 0;
+    nout << "unexpected termination" << endl;
+    return false;
+  }
+  catch (const Timeout&) {
+    abandon_expensive_computations = 0;
+    nout << "timeout, as expected" << endl;
+    return true;
+  }
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  // If Watchdog objects are not supported, an std::logic_error exception
+  // will be thrown: this is normal.
+  catch (const std::logic_error& e) {
+    nout << "std::logic_error exception caught: \n" << e.what() << std::endl;
+    exit(0);
+  }
+#endif // !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  catch (const std::overflow_error& e) {
+    abandon_expensive_computations = 0;
+    if (std::numeric_limits<Coefficient>::is_integer
+        && std::numeric_limits<Coefficient>::is_bounded
+        && std::numeric_limits<Coefficient>::radix == 2
+        && std::numeric_limits<Coefficient>::digits == 7) {
+      // Overflow is OK with 8-bit coefficients.
+      nout << "arithmetic overflow (" << e.what() << "),"
+        " possible with 8-bit coefficients" << endl;
+      return true;
+    }
+    else
+      // Overflow errors should be propagated in all other cases.
+      throw;
+  }
+  catch (...) {
+    abandon_expensive_computations = 0;
+    nout << "unexpected exception" << endl;
+    return false;
+  }
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem3.cc b/tests/MIP_Problem/mipproblem3.cc
new file mode 100644
index 0000000..6b2d8a0
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem3.cc
@@ -0,0 +1,900 @@
+/* Test the MIP_Problem class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(-2*A - B >= -5);
+  cs.insert(4*A -4*B >= -5);
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+
+  // All integer variables.
+  Variables_Set ivs(A, B);
+
+  // Objective function.
+  Linear_Expression cost(A - 2*B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+                  MAXIMIZATION);
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  mip.set_optimization_mode(MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return true;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(Coefficient("-3152519739159347")*A
+            - Coefficient("4503599627370496")*B
+            >= Coefficient("-2837267765243412480"));
+  cs.insert(Coefficient("-14411518807585588")*A
+            - Coefficient("3602879701896397")*B
+            >= Coefficient("-19455550390240542720"));
+  cs.insert(Coefficient("6325070415853456823515479584966165845298645305129441198653167438357198111499854590373761990669910140474596183259900372230931523043306046152094168748148078435047419508642698792639590866940413010663742739952273283392562733857021646831815729864036236135650314266011211548510419206725953204130822734645187695728365866909171712")*A
+            >= Coefficient("134217729"));
+  cs.insert(B >= 20);
+  cs.insert(-B >= -500);
+
+  // Integer variables.
+  Variables_Set ivs(A);
+
+  // Cost function
+  Linear_Expression cost(-4*A - B);
+
+  MIP_Problem mip = MIP_Problem(cs.space_dimension(),
+                                cs.begin(), cs.end(),
+                                ivs,
+                                cost,
+                                MINIMIZATION);
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+
+  Coefficient num;
+  Coefficient den;
+  mip.evaluate_objective_function(pg, num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+
+  return true;
+}
+
+bool
+test03() {
+  MIP_Problem mip = MIP_Problem();
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  print_generator(pg);
+  Generator pg_kr = point();
+  if (pg != pg_kr)
+    return false;
+  return true;
+}
+
+bool
+test04() {
+  MIP_Problem mip = MIP_Problem();
+  mip.add_constraint(Linear_Expression::zero() <= 1);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  Generator pg_kr = point();
+  if (pg != pg_kr)
+    return false;
+  mip.add_constraint(Linear_Expression::zero() >= 1);
+  return !mip.is_satisfiable();
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 3);
+  cs.insert(B >= 0);
+  cs.insert(-A - B >= -8);
+  cs.insert(-A - 3*B >= -18);
+  cs.insert(-A + B >= -4);
+
+  // All integer variables.
+  Variables_Set ivs(A, B);
+
+  // Cost function.
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+                  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return pg == point(3*A + 5*B);
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(-A - 3*B >= -4);
+  cs.insert(-5*A - B >= -5);
+  cs.insert(-3*A - 2*B >= -2);
+  cs.insert(A + 3*B >= -1);
+  cs.insert(2*A - B >= -2);
+
+  // Cost function.
+  Linear_Expression cost(A + B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+                  MAXIMIZATION);
+  // Disallow floating point based steepest-edge pricing, so that
+  // predictable overflow behavior is obtained when configured
+  // to use checked 8-bit integers as coefficients.
+  mip.set_control_parameter(MIP_Problem::PRICING_STEEPEST_EDGE_EXACT);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  return pg == point(-2*A + 10*B, 7);
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A + B >= 0);
+  cs.insert(B >= 0);
+  cs.insert(B == 3);
+  cs.insert(2*C + 2*D == 9);
+
+  // Cost function.
+  Linear_Expression cost(10*A + 6*B);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+                  MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = -12;
+  Coefficient den_kr = 1;
+
+  return num == num_kr && den == den_kr;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(Coefficient("2251799813685248")*A
+            >= -Coefficient("5895288448651847"));
+  cs.insert(Coefficient("5895288437392848")*A
+            + Coefficient("3643488632714799")*B
+            - Coefficient("2251799813685248")*C
+            >= -Coefficient("19077554137963492"));
+  cs.insert(Coefficient("5895288437392848")*A
+            + Coefficient("3643488632714799")*B
+            + Coefficient("2251799813685248")*C
+            >= -Coefficient("19077554137963492"));
+  cs.insert(Coefficient("11790576874785696")*A
+            + Coefficient("4503599627370496")*B
+            + Coefficient("7286977274436797")*D
+            >= -Coefficient("38155108284934184"));
+  cs.insert(Coefficient("11790576874785696")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*D
+            >= -Coefficient("38155108284934184"));
+  cs.insert(Coefficient("11790576879289294")*A
+            + Coefficient("7286977274436797")*C
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            + Coefficient("7286977274436797")*C
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            - Coefficient("7286977274436797")*C
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("11790576879289294")*A
+            - Coefficient("7286977274436797")*C
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("2947644225451823")*A
+            - Coefficient("1125899906842624")*B
+            + Coefficient("1821744319735099")*D
+            >= -Coefficient("9538777088122044"));
+  cs.insert(Coefficient("11790576892800094")*A
+            - Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*D
+            >= -Coefficient("38155108325466584"));
+  cs.insert(Coefficient("5895288437392848")*A
+            - Coefficient("3643488630462999")*B
+            + Coefficient("2251799813685248")*C
+            >= -Coefficient("19077554133459892"));
+  cs.insert(Coefficient("2947644218696424")*A
+            - Coefficient("1821744320860999")*B
+            - Coefficient("1125899906842624")*C
+            >= -Coefficient("9538777072359446"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("11790576924325290")*B
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108379509776"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("11790576924325290")*B
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108379509776"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= -Coefficient("2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= -Coefficient("2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= -Coefficient("2947644225451823"));
+  cs.insert(Coefficient("562949953421312")*A
+            + Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= -Coefficient("2947644225451823"));
+  cs.insert(Coefficient("7286977269933197")*A
+            + Coefficient("4503599627370496")*B
+            + Coefficient("11790576865778496")*C
+            >= -Coefficient("38155108266919784"));
+  cs.insert(Coefficient("7286977251918799")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("11790576870282096")*C
+            >= -Coefficient("38155108244401792"));
+  cs.insert(Coefficient("1821744320860999")*A
+            + Coefficient("1125899906842624")*C
+            + Coefficient("2947644226577723")*D
+            >= -Coefficient("9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+            + Coefficient("1125899906842624")*C
+            - Coefficient("2947644226577723")*D
+            >= -Coefficient("9538777093751544"));
+  cs.insert(Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            + Coefficient("2947644228829523")*D
+            >= -Coefficient("9538777096003344"));
+  cs.insert(Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            - Coefficient("2947644228829523")*D
+            >= -Coefficient("9538777096003344"));
+  cs.insert(Coefficient("3643488664239996")*A
+            - Coefficient("2251799813685248")*B
+            + Coefficient("5895288468918045")*C
+            >= -Coefficient("19077554257308884"));
+  cs.insert(Coefficient("3643488652980997")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("5895288468918045")*C
+            >= -Coefficient("19077554232539084"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= -Coefficient("2947644226577723"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= -Coefficient("2947644229392473"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= -Coefficient("2947644227140673"));
+  cs.insert(Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            - Coefficient("562949953421312")*C
+            - Coefficient("562949953421312")*D
+            >= -Coefficient("2947644227703623"));
+  cs.insert(Coefficient("7286977314969193")*A
+            - Coefficient("11790576906310892")*B
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108447063768"));
+  cs.insert(Coefficient("3643488655232797")*A
+            - Coefficient("5895288446400047")*B
+            - Coefficient("2251799813685248")*D
+            >= -Coefficient("19077554203265688"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576753188506")*B
+            + Coefficient("7286977179861205")*C
+            >= -Coefficient("38155107920142616"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576766699304")*B
+            - Coefficient("7286977179861205")*C
+            >= -Coefficient("38155107965178608"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("7286977157343207")*B
+            + Coefficient("11790576712656108")*D
+            >= -Coefficient("38155107816559824"));
+  cs.insert(Coefficient("2251799813685248")*A
+            + Coefficient("3643488592182402")*B
+            - Coefficient("5895288374342453")*D
+            >= -Coefficient("19077553960071308"));
+  cs.insert(Coefficient("4503599627370496")*A
+            + Coefficient("11790576753188506")*C
+            + Coefficient("7286977175357605")*D
+            >= -Coefficient("38155107924646216"));
+  cs.insert(Coefficient("2251799813685248")*A
+            + Coefficient("5895288390105051")*C
+            - Coefficient("3643488594434202")*D
+            >= -Coefficient("19077553996100104"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("5895288421630249")*C
+            + Coefficient("3643488619204000")*D
+            >= -Coefficient("19077554088423896"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("11790576865778496")*C
+            - Coefficient("7286977247415199")*D
+            >= -Coefficient("38155108244401792"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("7286977247415199")*B
+            + Coefficient("11790576888296494")*D
+            >= -Coefficient("38155108307452184"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("3643488639470198")*B
+            - Coefficient("5895288464414445")*D
+            >= -Coefficient("19077554210021088"));
+  cs.insert(Coefficient("2251799813685248")*A
+            - Coefficient("5895288428385648")*B
+            + Coefficient("3643488630462999")*C
+            >= -Coefficient("19077554131208092"));
+  cs.insert(Coefficient("4503599627370496")*A
+            - Coefficient("11790576843260498")*B
+            - Coefficient("7286977224897201")*C
+            >= -Coefficient("38155108163336992"));
+  cs.insert(Coefficient("1125899906842624")*B
+            >= -Coefficient("2947644227703623"));
+  cs.insert(Coefficient("5895288459910846")*B
+            + Coefficient("2251799813685248")*C
+            + Coefficient("3643488630462999")*D
+            >= -Coefficient("19077554198762088"));
+  cs.insert(Coefficient("5895288457659046")*B
+            + Coefficient("2251799813685248")*C
+            - Coefficient("3643488628211199")*D
+            >= -Coefficient("19077554189754888"));
+  cs.insert(Coefficient("11790576915318092")*B
+            - Coefficient("4503599627370496")*C
+            + Coefficient("7286977269933197")*D
+            >= -Coefficient("38155108393020576"));
+  cs.insert(Coefficient("5895288457659046")*B
+            - Coefficient("2251799813685248")*C
+            - Coefficient("3643488632714799")*D
+            >= -Coefficient("19077554187503088"));
+  cs.insert(Coefficient("7286977292451195")*B
+            + Coefficient("11790576919821692")*C
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108433552976"));
+  cs.insert(Coefficient("3643488664239996")*B
+            + Coefficient("5895288486932443")*C
+            - Coefficient("2251799813685248")*D
+            >= -Coefficient("19077554304596680"));
+  cs.insert(Coefficient("3643488643973798")*B
+            - Coefficient("5895288446400047")*C
+            + Coefficient("2251799813685248")*D
+            >= -Coefficient("19077554180747688"));
+  cs.insert(Coefficient("7286977314969193")*B
+            - Coefficient("11790576937836090")*C
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108510114168"));
+  cs.insert(Coefficient("4503599627370496")*B
+            + Coefficient("7286977247415199")*C
+            + Coefficient("11790576883792894")*D
+            >= -Coefficient("38155108289437784"));
+  cs.insert(Coefficient("4503599627370496")*B
+            + Coefficient("7286977251918799")*C
+            - Coefficient("11790576883792894")*D
+            >= -Coefficient("38155108280430584"));
+  cs.insert(Coefficient("4503599627370496")*B
+            - Coefficient("7286977229400801")*C
+            + Coefficient("11790576852267696")*D
+            >= -Coefficient("38155108181351392"));
+  cs.insert(Coefficient("1125899906842624")*D
+            >= -Coefficient("2947644225451823"));
+  cs.insert(Coefficient("4503599627370496")*B
+            - Coefficient("7286977229400801")*C
+            - Coefficient("11790576852267696")*D
+            >= -Coefficient("38155108167840592"));
+  cs.insert(-Coefficient("2251799813685248")*D
+            >= -Coefficient("5895288448651847"));
+  cs.insert(Coefficient("2251799813685248")*C
+            >= -Coefficient("5895288446400047"));
+  cs.insert(-Coefficient("2251799813685248")*C
+            >= -Coefficient("5895288444148247"));
+  cs.insert(-Coefficient("1125899906842624")*B
+            + Coefficient("1821744321986899")*C
+            + Coefficient("2947644226577723")*D
+            >= -Coefficient("9538777088122044"));
+  cs.insert(-Coefficient("3643488607945001")*B
+            + Coefficient("5895288414874849")*C
+            + Coefficient("2251799813685248")*D
+            >= -Coefficient("19077554059150500"));
+  cs.insert(-Coefficient("4503599627370496")*B
+            + Coefficient("7286977292451195")*C
+            - Coefficient("11790576906310892")*D
+            >= -Coefficient("38155108343480984"));
+  cs.insert(-Coefficient("7286977220393601")*B
+            + Coefficient("11790576829749698")*C
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108086775800"));
+  cs.insert(-Coefficient("4503599627370496")*B
+            - Coefficient("7286977274436797")*C
+            + Coefficient("11790576901807292")*D
+            >= -Coefficient("38155108325466584"));
+  cs.insert(-Coefficient("3643488605693201")*B
+            - Coefficient("5895288414874849")*C
+            + Coefficient("2251799813685248")*D
+            >= -Coefficient("19077554059150500"));
+  cs.insert(-Coefficient("1125899906842624")*B
+            - Coefficient("1821744319735099")*C
+            - Coefficient("2947644225451823")*D
+            >= -Coefficient("9538777079114846"));
+  cs.insert(-Coefficient("7286977220393601")*B
+            - Coefficient("11790576834253298")*C
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108113797400"));
+  cs.insert(-Coefficient("5895288462162645")*B
+            + Coefficient("2251799813685248")*C
+            + Coefficient("3643488639470198")*D
+            >= -Coefficient("19077554144718892"));
+  cs.insert(-Coefficient("11790576924325290")*B
+            - Coefficient("4503599627370496")*C
+            + Coefficient("7286977292451195")*D
+            >= -Coefficient("38155108320962984"));
+  cs.insert(-Coefficient("5895288468918045")*B
+            + Coefficient("2251799813685248")*C
+            - Coefficient("3643488641721998")*D
+            >= -Coefficient("19077554160481492"));
+  cs.insert(-Coefficient("11790576928828890")*B
+            - Coefficient("4503599627370496")*C
+            - Coefficient("7286977292451195")*D
+            >= -Coefficient("38155108329970184"));
+  cs.insert(-Coefficient("281474976710656")*B
+            >= -Coefficient("736911053829681"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            + Coefficient("11790576658612912")*B
+            + Coefficient("7286977125818009")*C
+            >= -Coefficient("38155107627408640"));
+  cs.insert(-Coefficient("2251799813685248")*A
+            + Coefficient("5895288336061856")*B
+            - Coefficient("3643488560657205")*C
+            >= -Coefficient("19077553829466920"));
+  cs.insert(-Coefficient("2251799813685248")*A
+            + Coefficient("3643488535887407")*B
+            + Coefficient("5895288288774060")*D
+            >= -Coefficient("19077553683099932"));
+  cs.insert(-Coefficient("7286977274436797")*A
+            + Coefficient("11790576766699304")*B
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108032732608"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            + Coefficient("7286977098796411")*B
+            - Coefficient("11790576609073318")*D
+            >= -Coefficient("38155107483293448"));
+  cs.insert(-Coefficient("7286977301458395")*A
+            + Coefficient("11790576735174106")*B
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155107983193008"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            + Coefficient("11790576708152508")*C
+            + Coefficient("7286977148336007")*D
+            >= -Coefficient("38155107771523824"));
+  cs.insert(-Coefficient("281474976710656")*A
+            + Coefficient("281474976710656")*B
+            + Coefficient("281474976710656")*C
+            + Coefficient("281474976710656")*D
+            >= -Coefficient("1473822119481311"));
+  cs.insert(-Coefficient("1125899906842624")*A
+            + Coefficient("2947644178164027")*C
+            - Coefficient("1821744285958102")*D
+            >= -Coefficient("9538776941755056"));
+  cs.insert(-Coefficient("1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            + Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= -Coefficient("5895288471169845"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            - Coefficient("11790576856771296")*C
+            + Coefficient("7286977247415199")*D
+            >= -Coefficient("38155108221883792"));
+  cs.insert(-Coefficient("1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            + Coefficient("1125899906842624")*D
+            >= -Coefficient("5895288471169845"));
+  cs.insert(-Coefficient("140737488355328")*A
+            - Coefficient("368455526774103")*C
+            - Coefficient("227718038700250")*D
+            >= -Coefficient("1192347131793131"));
+  cs.insert(-Coefficient("1125899906842624")*A
+            + Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= -Coefficient("5895288464414445"));
+  cs.insert(-Coefficient("3643488643973798")*A
+            + Coefficient("2251799813685248")*B
+            + Coefficient("5895288441896447")*C
+            >= -Coefficient("19077554158229692"));
+  cs.insert(-Coefficient("7286977296954795")*A
+            + Coefficient("4503599627370496")*B
+            - Coefficient("11790576892800094")*C
+            >= -Coefficient("38155108352488176"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            - Coefficient("7286977269933197")*B
+            + Coefficient("11790576924325290")*D
+            >= -Coefficient("38155108411034976"));
+  cs.insert(-Coefficient("3643488639470198")*A
+            + Coefficient("2251799813685248")*C
+            + Coefficient("5895288466666245")*D
+            >= -Coefficient("19077554219028288"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            - Coefficient("7286977296954795")*B
+            - Coefficient("11790576955850488")*D
+            >= -Coefficient("38155108514617768"));
+  cs.insert(-Coefficient("7286977251918799")*A
+            + Coefficient("4503599627370496")*C
+            - Coefficient("11790576892800094")*D
+            >= -Coefficient("38155108311955784"));
+  cs.insert(-Coefficient("3643488655232797")*A
+            - Coefficient("2251799813685248")*C
+            + Coefficient("5895288480177044")*D
+            >= -Coefficient("19077554264064284"));
+  cs.insert(-Coefficient("1821744320860999")*A
+            - Coefficient("1125899906842624")*C
+            - Coefficient("2947644229955423")*D
+            >= -Coefficient("9538777099381044"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            - Coefficient("11790576874785696")*B
+            + Coefficient("7286977269933197")*C
+            >= -Coefficient("38155108302948584"));
+  cs.insert(-Coefficient("7286977274436797")*A
+            - Coefficient("4503599627370496")*B
+            + Coefficient("11790576937836090")*C
+            >= -Coefficient("38155108424545776"));
+  cs.insert(-Coefficient("4503599627370496")*A
+            - Coefficient("11790576802728102")*B
+            - Coefficient("7286977197875603")*C
+            >= -Coefficient("38155108019221808"));
+  cs.insert(-Coefficient("3643488664239996")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("5895288493687843")*C
+            >= -Coefficient("19077554284330480"));
+  cs.insert(-Coefficient("562949953421312")*A
+            - Coefficient("562949953421312")*B
+            + Coefficient("562949953421312")*C
+            + Coefficient("562949953421312")*D
+            >= -Coefficient("2947644250784571"));
+  cs.insert(-Coefficient("281474976710656")*A
+            - Coefficient("281474976710656")*B
+            + Coefficient("281474976710656")*C
+            - Coefficient("281474976710656")*D
+            >= -Coefficient("1473822131021785"));
+  cs.insert(-Coefficient("1125899906842624")*A
+            - Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            + Coefficient("1125899906842624")*D
+            >= -Coefficient("5895288464414445"));
+  cs.insert(-Coefficient("1125899906842624")*A
+            - Coefficient("1125899906842624")*B
+            - Coefficient("1125899906842624")*C
+            - Coefficient("1125899906842624")*D
+            >= -Coefficient("5895288468918045"));
+  cs.insert(-Coefficient("3643488412038417")*A
+            - Coefficient("5895288318047457")*B
+            + Coefficient("2251799813685248")*D
+            >= -Coefficient("19077553665085532"));
+  cs.insert(-Coefficient("1821744199263809")*A
+            - Coefficient("2947644153394229")*B
+            - Coefficient("1125899906842624")*D
+            >= -Coefficient("9538776813402468"));
+  cs.insert(-Coefficient("5895288378846052")*A
+            + Coefficient("3643488632714799")*B
+            + Coefficient("2251799813685248")*C
+            >= -Coefficient("19077554023121704"));
+  cs.insert(-Coefficient("11790576834253298")*A
+            + Coefficient("7286977314969193")*B
+            - Coefficient("4503599627370496")*C
+            >= -Coefficient("38155108302948584"));
+  cs.insert(-Coefficient("736911041726257")*A
+            + Coefficient("281474976710656")*B
+            + Coefficient("455436077400500")*D
+            >= -Coefficient("2384694241068264"));
+  cs.insert(-Coefficient("5895288347320855")*A
+            + Coefficient("2251799813685248")*B
+            - Coefficient("3643488616952200")*D
+            >= -Coefficient("19077553951064108"));
+  cs.insert(-Coefficient("2947644201807925")*A
+            + Coefficient("1821744319735099")*C
+            + Coefficient("1125899906842624")*D
+            >= -Coefficient("9538777048715548"));
+  cs.insert(-Coefficient("11790576820742500")*A
+            + Coefficient("7286977296954795")*C
+            - Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108248905384"));
+  cs.insert(-Coefficient("11790576996382886")*A
+            - Coefficient("7286977251918799")*C
+            + Coefficient("4503599627370496")*D
+            >= -Coefficient("38155108523624968"));
+  cs.insert(-Coefficient("5895288507198642")*A
+            - Coefficient("3643488632714799")*C
+            - Coefficient("2251799813685248")*D
+            >= -Coefficient("19077554291085880"));
+  cs.insert(-Coefficient("11790577113476476")*A
+            - Coefficient("4503599627370496")*B
+            + Coefficient("7286977319472793")*D
+            >= -Coefficient("38155108861394936"));
+  cs.insert(-Coefficient("5895288572500836")*A
+            - Coefficient("2251799813685248")*B
+            - Coefficient("3643488652980997")*D
+            >= -Coefficient("19077554450963668"));
+  cs.insert(-Coefficient("5895288484680644")*A
+            - Coefficient("3643488607945001")*B
+            + Coefficient("2251799813685248")*C
+            >= -Coefficient("19077554212272888"));
+  cs.insert(-Coefficient("2947644274991419")*A
+            - Coefficient("1821744320860999")*B
+            - Coefficient("1125899906842624")*C
+            >= -Coefficient("9538777190578936"));
+  cs.insert(-Coefficient("2251799813685248")*A
+            >= -Coefficient("5895288448651847"));
+
+  // Cost function.
+  Linear_Expression cost(A + B + C + D);
+
+  // All integer variables.
+  Variables_Set ivs(A, D);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), ivs, cost,
+                  MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = -5;
+  Coefficient den_kr = 1;
+
+  return pg == point(-A - 2*B - C - D)
+    && num == num_kr && den == den_kr;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  cs.insert(C >= 0);
+  cs.insert(D >= 0);
+  cs.insert(3008*A + 20980*B - 97775*C - 101225*D >= 0);
+  cs.insert(3985*A + 25643*B - 135871*C - 130580*D >= 0);
+  cs.insert(4324*A + 26978*B - 133655*C - 168473*D >= 0);
+  cs.insert(3534*A + 25361*B - 46243*C - 100407*D >= 0);
+  cs.insert(8836*A + 40796*B - 176661*C - 215616*D >= 0);
+  cs.insert(5376*A + 37562*B - 182576*C - 217615*D >= 0);
+  cs.insert(2491*A + 16544*B - 49440*C - 83639*D >= 0);
+  cs.insert(4775*A + 39122*B - 136701*C - 193393*D >= 0);
+  cs.insert(8046*A + 42958*B - 225138*C - 256575*D >= 0);
+  cs.insert(8554*A + 48955*B - 257370*C - 312877*D >= 0);
+  cs.insert(6147*A + 45514*B - 165274*C - 227099*D >= 0);
+  cs.insert(8366*A + 55140*B - 203989*C - 321623*D >= 0);
+  cs.insert(13479*A + 68037*B - 174270*C - 341743*D >= 0);
+  cs.insert(21808*A + 78302*B - 322990*C - 487539*D >= 0);
+  cs.insert(-8554*A - 48955*B >= -10000);
+  cs.insert(-257370*C - 312877*D >= -10000);
+
+  // Cost function.
+  Linear_Expression cost(12*A + 6*B + 4*C + 3*D);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+                  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Optimum value = " << num << "/" << den << endl;
+  Coefficient num_kr = Coefficient("8231960000");
+  Coefficient den_kr = 581120267;
+
+  return pg == point(679355000*A + 19925000*C + 0*D, 581120267)
+    && num == num_kr && den == den_kr;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+
+  // Feasible region.
+  Constraint_System cs;
+  cs.insert(Coefficient("-3152519739159347")*x1
+            - Coefficient("4503599627370496")*x2
+            >= Coefficient("-2837267765243412480"));
+  cs.insert(Coefficient("-14411518807585588")*x1
+            - Coefficient("3602879701896397")*x2
+            >= Coefficient("-19455550390240542720"));
+  cs.insert(Coefficient("25300281663413827294061918339864663381194581220517764794612669753428792445999418361495047962679640561898384733039601488923726092173224184608376674992592313740189678034570795170558363467761652042654970959809093133570250935428086587327262919456144944542601257064044846194041676826903812816523290938580750782913463467636686848")*x1
+            >= Coefficient("17591821432561"));
+  cs.insert(x2 >= 20);
+  cs.insert(-x2 >= -500);
+
+  // Cost function.
+  Linear_Expression cost(4*x1 + x2);
+
+  MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), cost,
+                  MAXIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  Generator pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  Coefficient num;
+  Coefficient den;
+  mip.optimal_value(num, den);
+  nout << "Maximum value = " << num << "/" << den << endl;
+
+  if (pg != point(Coefficient("2747195772696002560")*x1
+                  + Coefficient("63050394783186940")*x2,
+                  Coefficient("3152519739159347"))
+      || num != Coefficient("11051833485567197180")
+      || den != Coefficient("3152519739159347"))
+    return false;
+
+  mip.set_optimization_mode(MINIMIZATION);
+
+  if (mip.solve() != OPTIMIZED_MIP_PROBLEM)
+    return false;
+
+  pg = mip.optimizing_point();
+  nout << "Optimizing point = ";
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << pg << endl;
+
+  mip.optimal_value(num, den);
+  nout << "Minimum value = " << num << "/" << den << endl;
+
+  if (pg != point(Coefficient("17591821432561")*x1 + Coefficient("506005633268276545881238366797293267623891624410355295892253395068575848919988367229900959253592811237967694660792029778474521843464483692167533499851846274803793560691415903411167269355233040853099419196181862671405018708561731746545258389122898890852025141280896923880833536538076256330465818771615015658269269352733736960")*x2, Coefficient("2530028166341382729406191833986466338119458122051776479461266975342879244599941836 [...]
+      || num != Coefficient("126501408317069136470309591699323316905972906102588823973063348767143962229997091807475239813398202809491923665198007444618630460866120923041883374962961568700948390172853975852791817338808260213274854799045465667851254677140432936636314597280724722713006285320224230970208384134519064082616454692903753914567334930004866801")
+      || den != Coefficient("6325070415853456823515479584966165845298645305129441198653167438357198111499854590373761990669910140474596183259900372230931523043306046152094168748148078435047419508642698792639590866940413010663742739952273283392562733857021646831815729864036236135650314266011211548510419206725953204130822734645187695728365866909171712"))
+    return false;
+
+  return true;
+}
+
+}
+
+// namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F64(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST_F8(test06);
+  DO_TEST(test07);
+  DO_TEST_F64(test08);
+  DO_TEST_F64(test09);
+  DO_TEST_F64(test10);
+END_MAIN
diff --git a/tests/MIP_Problem/mipproblem4.cc b/tests/MIP_Problem/mipproblem4.cc
new file mode 100644
index 0000000..ead6d5e
--- /dev/null
+++ b/tests/MIP_Problem/mipproblem4.cc
@@ -0,0 +1,55 @@
+/* Test the MIP_Problem class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  MIP_Problem mip(0);
+  mip.is_satisfiable();
+  mip.set_optimization_mode(MINIMIZATION);
+  mip.solve();
+  return true;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  MIP_Problem mip(1);
+  Generator p1 = mip.optimizing_point();
+  bool ok1 = (p1 == point(0*A));
+  mip.add_space_dimensions_and_embed(1);
+  Generator p2 = mip.optimizing_point();
+  bool ok2 = (p2 == point(0*A + 0*B));
+  return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..065145f
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,59 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+SUBDIRS = \
+. \
+Concrete_Expression \
+CO_Tree \
+PIP_Problem \
+Powerset \
+Partially_Reduced_Product \
+Box \
+MIP_Problem \
+Octagonal_Shape \
+BD_Shape \
+Polyhedron \
+Grid \
+Watchdog
+
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
+
+check_LIBRARIES = libppl_tests.a
+
+libppl_tests_a_SOURCES = \
+files.hh \
+files.cc \
+ppl_test.cc
+
+LDADD = \
+$(top_builddir)/src/libppl.la \
+libppl_tests.a \
+ at extra_libraries@
+
+noinst_HEADERS = \
+ppl_test.hh \
+Random_Number_Generator_defs.hh \
+Random_Number_Generator_inlines.hh \
+Random_Number_Generator_types.hh
+
+EXTRA_DIST = valgrind_suppressions
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..b62176e
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,861 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = tests
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(noinst_HEADERS) README
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libppl_tests_a_AR = $(AR) $(ARFLAGS)
+libppl_tests_a_LIBADD =
+am_libppl_tests_a_OBJECTS = files.$(OBJEXT) ppl_test.$(OBJEXT)
+libppl_tests_a_OBJECTS = $(am_libppl_tests_a_OBJECTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_tests_a_SOURCES)
+DIST_SOURCES = $(libppl_tests_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+SUBDIRS = \
+. \
+Concrete_Expression \
+CO_Tree \
+PIP_Problem \
+Powerset \
+Partially_Reduced_Product \
+Box \
+MIP_Problem \
+Octagonal_Shape \
+BD_Shape \
+Polyhedron \
+Grid \
+Watchdog
+
+AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src @extra_includes@
+check_LIBRARIES = libppl_tests.a
+libppl_tests_a_SOURCES = \
+files.hh \
+files.cc \
+ppl_test.cc
+
+LDADD = \
+$(top_builddir)/src/libppl.la \
+libppl_tests.a \
+ at extra_libraries@
+
+noinst_HEADERS = \
+ppl_test.hh \
+Random_Number_Generator_defs.hh \
+Random_Number_Generator_inlines.hh \
+Random_Number_Generator_types.hh
+
+EXTRA_DIST = valgrind_suppressions
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkLIBRARIES:
+	-test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+
+libppl_tests.a: $(libppl_tests_a_OBJECTS) $(libppl_tests_a_DEPENDENCIES) $(EXTRA_libppl_tests_a_DEPENDENCIES) 
+	$(AM_V_at)-rm -f libppl_tests.a
+	$(AM_V_AR)$(libppl_tests_a_AR) libppl_tests.a $(libppl_tests_a_OBJECTS) $(libppl_tests_a_LIBADD)
+	$(AM_V_at)$(RANLIB) libppl_tests.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/files.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_test.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES)
+check: check-recursive
+all-am: Makefile $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-checkLIBRARIES clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+	check-am clean clean-checkLIBRARIES clean-generic \
+	clean-libtool cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Octagonal_Shape/Makefile.am b/tests/Octagonal_Shape/Makefile.am
new file mode 100644
index 0000000..927fc7e
--- /dev/null
+++ b/tests/Octagonal_Shape/Makefile.am
@@ -0,0 +1,319 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AUTOMAKE_OPTIONS = serial-tests
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+check_PROGRAMS = \
+addspacedims1 \
+affinedimension1 \
+affineimage1 \
+affineimage2 \
+affinepreimage1 \
+affinepreimage2 \
+ascii_dump_load1 \
+bhz03widening1 \
+bhmz05widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+bounds1 \
+cc76extrapolation1 \
+cc76narrowing1 \
+chinainit \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+empty1 \
+expandspacedim1 \
+frequency1 \
+foldspacedims1 \
+frombdshape1 \
+frombox1 \
+fromgensys1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedim1 \
+generalizedaffineimage1 \
+generalizedaffineimage2 \
+generalizedaffineimage3 \
+generalizedaffineimage4 \
+generalizedaffineimage5 \
+generalizedaffinepreimage1 \
+generalizedaffinepreimage2 \
+generalizedaffinepreimage3 \
+generalizedaffinepreimage4 \
+integerupperboundifexact1 \
+intersection1 \
+limitedbhmz05extrapolation1 \
+limitedcc76extrapolation1 \
+mapspacedims1 \
+max_min1 \
+max_min2 \
+maxspacedim1 \
+membytes1 \
+minconstraints1 \
+relatwithcons1 \
+relatwithcons2 \
+relatwithcons3 \
+relatwithgen1 \
+removespacedims1 \
+simplifyusingcontext1 \
+timeelapse1 \
+unconstrain1 \
+universe1 \
+upperbound1 \
+upperboundifexact1 \
+wrap1 \
+writeoctagon1
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS=-DOCTAGONAL_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = run_tests.stamp
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+XFAIL_TESTS =
+
+if SUPPORTED_FLOAT
+FLOAT_INSTANCE=float
+endif
+if SUPPORTED_DOUBLE
+DOUBLE_INSTANCE=double
+endif
+if SUPPORTED_LONG_DOUBLE
+LONG_DOUBLE_INSTANCE=long_double
+endif
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+#
+# Sources for the tests
+#
+
+addspacedims1_SOURCES = addspacedims1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+chinainit_SOURCES = chinainit.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+
+empty1_SOURCES = empty1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedim1_SOURCES = fromspacedim1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffineimage4_SOURCES = generalizedaffineimage4.cc
+generalizedaffineimage5_SOURCES = generalizedaffineimage5.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generalizedaffinepreimage4_SOURCES = generalizedaffinepreimage4.cc
+
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+
+membytes1_SOURCES = membytes1.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relatwithcons1_SOURCES = relatwithcons1.cc
+relatwithcons2_SOURCES = relatwithcons2.cc
+relatwithcons3_SOURCES = relatwithcons3.cc
+
+relatwithgen1_SOURCES = relatwithgen1.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+
+wrap1_SOURCES = wrap1.cc
+
+writeoctagon1_SOURCES = writeoctagon1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Octagonal_Shape/Makefile.in b/tests/Octagonal_Shape/Makefile.in
new file mode 100644
index 0000000..7ba226c
--- /dev/null
+++ b/tests/Octagonal_Shape/Makefile.in
@@ -0,0 +1,1870 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = addspacedims1$(EXEEXT) affinedimension1$(EXEEXT) \
+	affineimage1$(EXEEXT) affineimage2$(EXEEXT) \
+	affinepreimage1$(EXEEXT) affinepreimage2$(EXEEXT) \
+	ascii_dump_load1$(EXEEXT) bhz03widening1$(EXEEXT) \
+	bhmz05widening1$(EXEEXT) bounded1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	bounds1$(EXEEXT) cc76extrapolation1$(EXEEXT) \
+	cc76narrowing1$(EXEEXT) chinainit$(EXEEXT) \
+	concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+	constrains1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+	discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+	dropsomenonintegerpoints1$(EXEEXT) empty1$(EXEEXT) \
+	expandspacedim1$(EXEEXT) frequency1$(EXEEXT) \
+	foldspacedims1$(EXEEXT) frombdshape1$(EXEEXT) \
+	frombox1$(EXEEXT) fromgensys1$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+	fromspacedim1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffineimage3$(EXEEXT) \
+	generalizedaffineimage4$(EXEEXT) \
+	generalizedaffineimage5$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) \
+	generalizedaffinepreimage3$(EXEEXT) \
+	generalizedaffinepreimage4$(EXEEXT) \
+	integerupperboundifexact1$(EXEEXT) intersection1$(EXEEXT) \
+	limitedbhmz05extrapolation1$(EXEEXT) \
+	limitedcc76extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+	max_min1$(EXEEXT) max_min2$(EXEEXT) maxspacedim1$(EXEEXT) \
+	membytes1$(EXEEXT) minconstraints1$(EXEEXT) \
+	relatwithcons1$(EXEEXT) relatwithcons2$(EXEEXT) \
+	relatwithcons3$(EXEEXT) relatwithgen1$(EXEEXT) \
+	removespacedims1$(EXEEXT) simplifyusingcontext1$(EXEEXT) \
+	timeelapse1$(EXEEXT) unconstrain1$(EXEEXT) universe1$(EXEEXT) \
+	upperbound1$(EXEEXT) upperboundifexact1$(EXEEXT) \
+	wrap1$(EXEEXT) writeoctagon1$(EXEEXT)
+XFAIL_TESTS =
+subdir = tests/Octagonal_Shape
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_check_SCRIPTS) \
+	$(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage2_OBJECTS = affinepreimage2.$(OBJEXT)
+affinepreimage2_OBJECTS = $(am_affinepreimage2_OBJECTS)
+affinepreimage2_LDADD = $(LDADD)
+affinepreimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhmz05widening1_OBJECTS = bhmz05widening1.$(OBJEXT)
+bhmz05widening1_OBJECTS = $(am_bhmz05widening1_OBJECTS)
+bhmz05widening1_LDADD = $(LDADD)
+bhmz05widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76extrapolation1_OBJECTS = cc76extrapolation1.$(OBJEXT)
+cc76extrapolation1_OBJECTS = $(am_cc76extrapolation1_OBJECTS)
+cc76extrapolation1_LDADD = $(LDADD)
+cc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cc76narrowing1_OBJECTS = cc76narrowing1.$(OBJEXT)
+cc76narrowing1_OBJECTS = $(am_cc76narrowing1_OBJECTS)
+cc76narrowing1_LDADD = $(LDADD)
+cc76narrowing1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_chinainit_OBJECTS = chinainit.$(OBJEXT)
+chinainit_OBJECTS = $(am_chinainit_OBJECTS)
+chinainit_LDADD = $(LDADD)
+chinainit_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS =  \
+	dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS =  \
+	$(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgensys1_OBJECTS = fromgensys1.$(OBJEXT)
+fromgensys1_OBJECTS = $(am_fromgensys1_OBJECTS)
+fromgensys1_LDADD = $(LDADD)
+fromgensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedim1_OBJECTS = fromspacedim1.$(OBJEXT)
+fromspacedim1_OBJECTS = $(am_fromspacedim1_OBJECTS)
+fromspacedim1_LDADD = $(LDADD)
+fromspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage3_OBJECTS =  \
+	generalizedaffineimage3.$(OBJEXT)
+generalizedaffineimage3_OBJECTS =  \
+	$(am_generalizedaffineimage3_OBJECTS)
+generalizedaffineimage3_LDADD = $(LDADD)
+generalizedaffineimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage4_OBJECTS =  \
+	generalizedaffineimage4.$(OBJEXT)
+generalizedaffineimage4_OBJECTS =  \
+	$(am_generalizedaffineimage4_OBJECTS)
+generalizedaffineimage4_LDADD = $(LDADD)
+generalizedaffineimage4_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage5_OBJECTS =  \
+	generalizedaffineimage5.$(OBJEXT)
+generalizedaffineimage5_OBJECTS =  \
+	$(am_generalizedaffineimage5_OBJECTS)
+generalizedaffineimage5_LDADD = $(LDADD)
+generalizedaffineimage5_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage3_OBJECTS =  \
+	generalizedaffinepreimage3.$(OBJEXT)
+generalizedaffinepreimage3_OBJECTS =  \
+	$(am_generalizedaffinepreimage3_OBJECTS)
+generalizedaffinepreimage3_LDADD = $(LDADD)
+generalizedaffinepreimage3_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage4_OBJECTS =  \
+	generalizedaffinepreimage4.$(OBJEXT)
+generalizedaffinepreimage4_OBJECTS =  \
+	$(am_generalizedaffinepreimage4_OBJECTS)
+generalizedaffinepreimage4_LDADD = $(LDADD)
+generalizedaffinepreimage4_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_integerupperboundifexact1_OBJECTS =  \
+	integerupperboundifexact1.$(OBJEXT)
+integerupperboundifexact1_OBJECTS =  \
+	$(am_integerupperboundifexact1_OBJECTS)
+integerupperboundifexact1_LDADD = $(LDADD)
+integerupperboundifexact1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedbhmz05extrapolation1_OBJECTS =  \
+	limitedbhmz05extrapolation1.$(OBJEXT)
+limitedbhmz05extrapolation1_OBJECTS =  \
+	$(am_limitedbhmz05extrapolation1_OBJECTS)
+limitedbhmz05extrapolation1_LDADD = $(LDADD)
+limitedbhmz05extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedcc76extrapolation1_OBJECTS =  \
+	limitedcc76extrapolation1.$(OBJEXT)
+limitedcc76extrapolation1_OBJECTS =  \
+	$(am_limitedcc76extrapolation1_OBJECTS)
+limitedcc76extrapolation1_LDADD = $(LDADD)
+limitedcc76extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min2_OBJECTS = max_min2.$(OBJEXT)
+max_min2_OBJECTS = $(am_max_min2_OBJECTS)
+max_min2_LDADD = $(LDADD)
+max_min2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithcons1_OBJECTS = relatwithcons1.$(OBJEXT)
+relatwithcons1_OBJECTS = $(am_relatwithcons1_OBJECTS)
+relatwithcons1_LDADD = $(LDADD)
+relatwithcons1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithcons2_OBJECTS = relatwithcons2.$(OBJEXT)
+relatwithcons2_OBJECTS = $(am_relatwithcons2_OBJECTS)
+relatwithcons2_LDADD = $(LDADD)
+relatwithcons2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithcons3_OBJECTS = relatwithcons3.$(OBJEXT)
+relatwithcons3_OBJECTS = $(am_relatwithcons3_OBJECTS)
+relatwithcons3_LDADD = $(LDADD)
+relatwithcons3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relatwithgen1_OBJECTS = relatwithgen1.$(OBJEXT)
+relatwithgen1_OBJECTS = $(am_relatwithgen1_OBJECTS)
+relatwithgen1_LDADD = $(LDADD)
+relatwithgen1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperboundifexact1_OBJECTS = upperboundifexact1.$(OBJEXT)
+upperboundifexact1_OBJECTS = $(am_upperboundifexact1_OBJECTS)
+upperboundifexact1_LDADD = $(LDADD)
+upperboundifexact1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writeoctagon1_OBJECTS = writeoctagon1.$(OBJEXT)
+writeoctagon1_OBJECTS = $(am_writeoctagon1_OBJECTS)
+writeoctagon1_LDADD = $(LDADD)
+writeoctagon1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addspacedims1_SOURCES) $(affinedimension1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bhmz05widening1_SOURCES) \
+	$(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(chinainit_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) \
+	$(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(fromgensys1_SOURCES) \
+	$(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(fromspacedim1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
+	$(generalizedaffineimage4_SOURCES) \
+	$(generalizedaffineimage5_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) \
+	$(generalizedaffinepreimage4_SOURCES) \
+	$(integerupperboundifexact1_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(relatwithcons1_SOURCES) \
+	$(relatwithcons2_SOURCES) $(relatwithcons3_SOURCES) \
+	$(relatwithgen1_SOURCES) $(removespacedims1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+	$(wrap1_SOURCES) $(writeoctagon1_SOURCES)
+DIST_SOURCES = $(addspacedims1_SOURCES) $(affinedimension1_SOURCES) \
+	$(affineimage1_SOURCES) $(affineimage2_SOURCES) \
+	$(affinepreimage1_SOURCES) $(affinepreimage2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(bhmz05widening1_SOURCES) \
+	$(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) $(bounds1_SOURCES) \
+	$(cc76extrapolation1_SOURCES) $(cc76narrowing1_SOURCES) \
+	$(chinainit_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(containsintegerpoint1_SOURCES) $(difference1_SOURCES) \
+	$(discrete1_SOURCES) $(disjoint1_SOURCES) \
+	$(dropsomenonintegerpoints1_SOURCES) $(empty1_SOURCES) \
+	$(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+	$(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(fromgensys1_SOURCES) \
+	$(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(fromspacedim1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffineimage3_SOURCES) \
+	$(generalizedaffineimage4_SOURCES) \
+	$(generalizedaffineimage5_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) \
+	$(generalizedaffinepreimage3_SOURCES) \
+	$(generalizedaffinepreimage4_SOURCES) \
+	$(integerupperboundifexact1_SOURCES) $(intersection1_SOURCES) \
+	$(limitedbhmz05extrapolation1_SOURCES) \
+	$(limitedcc76extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(max_min1_SOURCES) $(max_min2_SOURCES) \
+	$(maxspacedim1_SOURCES) $(membytes1_SOURCES) \
+	$(minconstraints1_SOURCES) $(relatwithcons1_SOURCES) \
+	$(relatwithcons2_SOURCES) $(relatwithcons3_SOURCES) \
+	$(relatwithgen1_SOURCES) $(removespacedims1_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(timeelapse1_SOURCES) \
+	$(unconstrain1_SOURCES) $(universe1_SOURCES) \
+	$(upperbound1_SOURCES) $(upperboundifexact1_SOURCES) \
+	$(wrap1_SOURCES) $(writeoctagon1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AUTOMAKE_OPTIONS = serial-tests
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+$(TEST_CPPFLAGS) \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src \
+-I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+# This will be overridden by the `run_tests' script.
+TEST_CPPFLAGS = -DOCTAGONAL_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = run_tests.stamp
+ at SUPPORTED_FLOAT_TRUE@FLOAT_INSTANCE = float
+ at SUPPORTED_DOUBLE_TRUE@DOUBLE_INSTANCE = double
+ at SUPPORTED_LONG_DOUBLE_TRUE@LONG_DOUBLE_INSTANCE = long_double
+
+# NOTE: mpq_class must be the first in the list.
+INSTANCES = \
+mpq_class \
+$(FLOAT_INSTANCE) \
+$(DOUBLE_INSTANCE) \
+$(LONG_DOUBLE_INSTANCE) \
+mpz_class \
+int8_t \
+int16_t \
+int32_t \
+int64_t
+
+
+#
+# Sources for the tests
+#
+addspacedims1_SOURCES = addspacedims1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinepreimage2_SOURCES = affinepreimage2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+bounds1_SOURCES = bounds1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+chinainit_SOURCES = chinainit.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+empty1_SOURCES = empty1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedim1_SOURCES = fromspacedim1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffineimage3_SOURCES = generalizedaffineimage3.cc
+generalizedaffineimage4_SOURCES = generalizedaffineimage4.cc
+generalizedaffineimage5_SOURCES = generalizedaffineimage5.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generalizedaffinepreimage3_SOURCES = generalizedaffinepreimage3.cc
+generalizedaffinepreimage4_SOURCES = generalizedaffinepreimage4.cc
+integerupperboundifexact1_SOURCES = integerupperboundifexact1.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+max_min1_SOURCES = max_min1.cc
+max_min2_SOURCES = max_min2.cc
+membytes1_SOURCES = membytes1.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relatwithcons1_SOURCES = relatwithcons1.cc
+relatwithcons2_SOURCES = relatwithcons2.cc
+relatwithcons3_SOURCES = relatwithcons3.cc
+relatwithgen1_SOURCES = relatwithgen1.cc
+removespacedims1_SOURCES = removespacedims1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+upperboundifexact1_SOURCES = upperboundifexact1.cc
+wrap1_SOURCES = wrap1.cc
+writeoctagon1_SOURCES = writeoctagon1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+CLEANFILES = \
+run_tests.stamp
+
+DISTCLEANFILES = \
+dirty_marker
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Octagonal_Shape/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Octagonal_Shape/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES) $(EXTRA_affinepreimage2_DEPENDENCIES) 
+	@rm -f affinepreimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES) $(EXTRA_bhmz05widening1_DEPENDENCIES) 
+	@rm -f bhmz05widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES) $(EXTRA_cc76extrapolation1_DEPENDENCIES) 
+	@rm -f cc76extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES) $(EXTRA_cc76narrowing1_DEPENDENCIES) 
+	@rm -f cc76narrowing1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+
+chinainit$(EXEEXT): $(chinainit_OBJECTS) $(chinainit_DEPENDENCIES) $(EXTRA_chinainit_DEPENDENCIES) 
+	@rm -f chinainit$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(chinainit_OBJECTS) $(chinainit_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES) 
+	@rm -f difference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES) 
+	@rm -f dropsomenonintegerpoints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES) 
+	@rm -f frequency1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES) $(EXTRA_fromgensys1_DEPENDENCIES) 
+	@rm -f fromgensys1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromspacedim1$(EXEEXT): $(fromspacedim1_OBJECTS) $(fromspacedim1_DEPENDENCIES) $(EXTRA_fromspacedim1_DEPENDENCIES) 
+	@rm -f fromspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromspacedim1_OBJECTS) $(fromspacedim1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffineimage3$(EXEEXT): $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_DEPENDENCIES) $(EXTRA_generalizedaffineimage3_DEPENDENCIES) 
+	@rm -f generalizedaffineimage3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage3_OBJECTS) $(generalizedaffineimage3_LDADD) $(LIBS)
+
+generalizedaffineimage4$(EXEEXT): $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_DEPENDENCIES) $(EXTRA_generalizedaffineimage4_DEPENDENCIES) 
+	@rm -f generalizedaffineimage4$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage4_OBJECTS) $(generalizedaffineimage4_LDADD) $(LIBS)
+
+generalizedaffineimage5$(EXEEXT): $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_DEPENDENCIES) $(EXTRA_generalizedaffineimage5_DEPENDENCIES) 
+	@rm -f generalizedaffineimage5$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage5_OBJECTS) $(generalizedaffineimage5_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage3$(EXEEXT): $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage3_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage3_OBJECTS) $(generalizedaffinepreimage3_LDADD) $(LIBS)
+
+generalizedaffinepreimage4$(EXEEXT): $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage4_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage4$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage4_OBJECTS) $(generalizedaffinepreimage4_LDADD) $(LIBS)
+
+integerupperboundifexact1$(EXEEXT): $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_DEPENDENCIES) $(EXTRA_integerupperboundifexact1_DEPENDENCIES) 
+	@rm -f integerupperboundifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(integerupperboundifexact1_OBJECTS) $(integerupperboundifexact1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES) $(EXTRA_limitedbhmz05extrapolation1_DEPENDENCIES) 
+	@rm -f limitedbhmz05extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES) $(EXTRA_limitedcc76extrapolation1_DEPENDENCIES) 
+	@rm -f limitedcc76extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+max_min2$(EXEEXT): $(max_min2_OBJECTS) $(max_min2_DEPENDENCIES) $(EXTRA_max_min2_DEPENDENCIES) 
+	@rm -f max_min2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(max_min2_OBJECTS) $(max_min2_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+relatwithcons1$(EXEEXT): $(relatwithcons1_OBJECTS) $(relatwithcons1_DEPENDENCIES) $(EXTRA_relatwithcons1_DEPENDENCIES) 
+	@rm -f relatwithcons1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relatwithcons1_OBJECTS) $(relatwithcons1_LDADD) $(LIBS)
+
+relatwithcons2$(EXEEXT): $(relatwithcons2_OBJECTS) $(relatwithcons2_DEPENDENCIES) $(EXTRA_relatwithcons2_DEPENDENCIES) 
+	@rm -f relatwithcons2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relatwithcons2_OBJECTS) $(relatwithcons2_LDADD) $(LIBS)
+
+relatwithcons3$(EXEEXT): $(relatwithcons3_OBJECTS) $(relatwithcons3_DEPENDENCIES) $(EXTRA_relatwithcons3_DEPENDENCIES) 
+	@rm -f relatwithcons3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relatwithcons3_OBJECTS) $(relatwithcons3_LDADD) $(LIBS)
+
+relatwithgen1$(EXEEXT): $(relatwithgen1_OBJECTS) $(relatwithgen1_DEPENDENCIES) $(EXTRA_relatwithgen1_DEPENDENCIES) 
+	@rm -f relatwithgen1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relatwithgen1_OBJECTS) $(relatwithgen1_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES) 
+	@rm -f upperbound1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+upperboundifexact1$(EXEEXT): $(upperboundifexact1_OBJECTS) $(upperboundifexact1_DEPENDENCIES) $(EXTRA_upperboundifexact1_DEPENDENCIES) 
+	@rm -f upperboundifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperboundifexact1_OBJECTS) $(upperboundifexact1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES) 
+	@rm -f wrap1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+writeoctagon1$(EXEEXT): $(writeoctagon1_OBJECTS) $(writeoctagon1_DEPENDENCIES) $(EXTRA_writeoctagon1_DEPENDENCIES) 
+	@rm -f writeoctagon1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writeoctagon1_OBJECTS) $(writeoctagon1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhmz05widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cc76narrowing1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/chinainit.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage5.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage4.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/integerupperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhmz05extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedcc76extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithcons3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relatwithgen1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperboundifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeoctagon1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) \
+	  $(dist_check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+.PHONY: run_tests.stamp
+run_tests.stamp: run_tests
+	+MAKE="$(MAKE)" $(srcdir)/run_tests
+	echo "true" >run_tests.stamp
+	chmod +x run_tests.stamp
+
+print_check_PROGRAMS:
+	echo $(check_PROGRAMS)
+
+print_INSTANCES:
+	echo $(INSTANCES)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Octagonal_Shape/addspacedims1.cc b/tests/Octagonal_Shape/addspacedims1.cc
new file mode 100644
index 0000000..e002767
--- /dev/null
+++ b/tests/Octagonal_Shape/addspacedims1.cc
@@ -0,0 +1,235 @@
+/* Test Octagonal_Shape::add_space_dimensions_and_embed() and
+   Octagonal_Shape::add_space_dimensions_and_project().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+//   Variable y(1);
+//   Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(x <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.add_space_dimensions_and_embed(2);
+  oc.add_constraint(w <= 2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc,
+                    "*** oc.add_space_dimensions_and_embed(2) "
+                    "and oc.add_constraint(w <= 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(1, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_embed(2);
+  oc2.add_space_dimensions_and_embed(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_embed(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  //  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(x <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.add_space_dimensions_and_project(2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(z == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Constraint_System cs;
+  cs.insert(x >= 2);
+  cs.insert(y >= 2);
+  cs.insert(x <= 6);
+  cs.insert(y <= 6);
+
+  TOctagonal_Shape oc(cs);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.add_space_dimensions_and_project(2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(z == 0);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(x <= 6);
+  known_result.add_constraint(y <= 6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.add_space_dimensions_and_project(2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 2);
+
+  TOctagonal_Shape oc2(oc1);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_embed(0);
+  oc2.add_space_dimensions_and_project(0);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_embed(0) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(0) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(1, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_project(2);
+  oc2.add_space_dimensions_and_project(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TOctagonal_Shape oc1(0);
+  TOctagonal_Shape oc2(1);
+  oc2.add_constraint(A == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_project(2);
+  oc2.add_space_dimensions_and_project(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(1);
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(B == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.add_space_dimensions_and_project(2);
+  oc2.add_space_dimensions_and_project(1);
+
+  bool ok = (oc1 == oc2);
+
+  print_constraints(oc1, "*** oc1.add_space_dimensions_and_project(2) ***");
+  print_constraints(oc2, "*** oc2.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinedimension1.cc b/tests/Octagonal_Shape/affinedimension1.cc
new file mode 100644
index 0000000..dc93425
--- /dev/null
+++ b/tests/Octagonal_Shape/affinedimension1.cc
@@ -0,0 +1,306 @@
+/* Test Octagonal_Shape::affine_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(3);
+
+  oct.add_constraint(x <= 2);
+  oct.add_constraint(x - y == 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A <= 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A == 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 3);
+  oct.add_constraint(B - A <= -5);
+  oct.add_constraint(-B <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 3);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(E == 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 2);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+  bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(7);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B == 2);
+  oct.add_constraint(B - A <= -6);
+
+  print_constraints(oct, "*** oct ***");
+
+  dimension_type affine_dim = oct.affine_dimension();
+
+  nout << endl
+       << "The affine dimension of a system of `oct' is:"
+       << endl
+       << affine_dim
+       << endl;
+
+   bool ok = (affine_dim == 0);
+
+  return ok;
+}
+
+bool
+test11() {
+  TOctagonal_Shape oct(0, UNIVERSE);
+
+  const dimension_type affine_dim = oct.affine_dimension();
+
+  print_constraints(oct, "*** oct ***");
+
+  return affine_dim == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/affineimage1.cc b/tests/Octagonal_Shape/affineimage1.cc
new file mode 100644
index 0000000..4e4385a
--- /dev/null
+++ b/tests/Octagonal_Shape/affineimage1.cc
@@ -0,0 +1,542 @@
+/* Test Octagonal_Shape::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, y);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, -y);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x + y == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, -y) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, x + 4);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 7);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, x + 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, Linear_Expression(4));
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x == 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, 4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oc1);
+
+  oc1.affine_image(x, x);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, x) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, 2*x - 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, 2*x -2, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(y, 2*x, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(y, 2*x, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(y, 3*x + 3, 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y - x == 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(y, 3*x+ 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+   print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, 2*A +2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+
+  Linear_Expression coeff1 = x + 1;
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_image(v, e, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    oct.affine_image(y, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x + y >= 2);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    oct.affine_image(y, z - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    oct.affine_image(x, y - z + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_image(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space
+    // of the polyhedron.
+    oct.affine_image(z, y - x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B - A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, 2*A +2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A <= 3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(B - A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -2*A + 3, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A <= -1);
+  known_result.add_constraint(2*A >= -3);
+  known_result.add_constraint(B >= 4);
+  known_result.add_constraint(2*A + 2*B >= 7);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -2*A + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(x <= 2);
+  oc.add_constraint(x - y <= 3);
+  oc.add_constraint(y <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(y, 2*x - 4, -2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x + y == 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc1.affine_image(y, 2*x - 4, -2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 2);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.affine_image(y, y + 6);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 6);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.affine_image(y, y + 6) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 2);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.affine_image(y, -y + 6);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 4);
+  known_result.add_constraint(y <= 6);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.affine_image(y, -y + 6) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x + y == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_image(x, -x);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_image(x, y) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affineimage2.cc b/tests/Octagonal_Shape/affineimage2.cc
new file mode 100644
index 0000000..fc413ae
--- /dev/null
+++ b/tests/Octagonal_Shape/affineimage2.cc
@@ -0,0 +1,554 @@
+/* Test Octagonal_Shape::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C >= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, C + B, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(B - A <= -1);
+  known_result.add_constraint(C - A <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, C + B, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, C + B, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(A - B <= 1);
+  known_result.add_constraint(A - C >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, C + B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+  oc.add_constraint(A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -A, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(A <= -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -A, 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B <= 2);
+  oc.add_constraint(-A + B <= 1);
+  oc.add_constraint(A >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -A, 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(A <= -2);
+  known_result.add_constraint(-A + B <= 2);
+  known_result.add_constraint(A + B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + C <= 3);
+  oc.add_constraint(A <= 2);
+  oc.add_constraint(A >= 1);
+  oc.add_constraint(D >= 1);
+  oc.add_constraint(D <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -A + 2*D, 1);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(D >= 1);
+  known_result.add_constraint(D <= 2);
+  known_result.add_constraint(A <= 3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - D <= 1);
+  known_result.add_constraint(D - A <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -A + 2*D, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C <= 1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= -1);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -C - B, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -1);
+  known_result.add_constraint(2*A <= 3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(C >= -1);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B + A) >= -3);
+  known_result.add_constraint(2*(C + A) >= -1);
+  known_result.add_constraint(2*(B + A) <= 1);
+  known_result.add_constraint(2*(C + A) <= 3);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -C - B, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -B, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B + A >= -1);
+  known_result.add_constraint(B + A <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -B, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, B + 3, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(2*A <= 3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) >= 3);
+  known_result.add_constraint(2*(A - B) <= 5);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+  oc.add_constraint(A + B <= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, B + 1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= -1);
+  known_result.add_constraint(2*A <= 1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B + A) >= -3);
+  known_result.add_constraint(2*(B + A) <= -1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(B >= -2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(A, -B + 1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= -3);
+  known_result.add_constraint(2*A <= -1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) <= 1);
+  known_result.add_constraint(2*(B - A) <= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, -B + 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= 0);
+  oc.add_constraint(C <= 10);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, -A + C + 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(-A - B <= -1);
+  known_result.add_constraint(A + B <= 11);
+  known_result.add_constraint(B - C >= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, -A + C +1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(C <= 10);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, -A + C + 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 11);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(-A - B <= -1);
+  known_result.add_constraint(A + B <= 11);
+  known_result.add_constraint(B - C <= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, -A + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A - B >= 0);
+  oc.add_constraint(C - B <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C - A <= 10);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, -A + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(C <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(C - A <= 10);
+  known_result.add_constraint(B - A <= 11);
+  known_result.add_constraint(B - C >= 1);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, A + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(C <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1, -1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(C <= 10);
+  known_result.add_constraint(C - A <= 10);
+  known_result.add_constraint(A + B >= -11);
+  known_result.add_constraint(B + C <= -1);
+
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(B, A + C + 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C >= 1);
+  oc.add_constraint(A <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(A <= 10);
+  known_result.add_constraint(B - A >= 2);
+  known_result.add_constraint(B - C <= 11);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + C + 1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(C >= 1);
+  oc.add_constraint(A <= 10);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_image(B, A + C + 1, -1);
+  print_constraints(oc, "*** oc ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(A <= 10);
+  known_result.add_constraint(B + A <= -2);
+  known_result.add_constraint(B + C >= -11);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_image(A, B + C + 1, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinepreimage1.cc b/tests/Octagonal_Shape/affinepreimage1.cc
new file mode 100644
index 0000000..5fdd4fd
--- /dev/null
+++ b/tests/Octagonal_Shape/affinepreimage1.cc
@@ -0,0 +1,294 @@
+/* Test Octagonal_Shape::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 2);
+  oc1.add_constraint(x - y <= 3);
+  oc1.add_constraint(y <= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.affine_preimage(x, y);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.affine_preimage(x, y) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A - B - 3 >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, B - 1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, B-1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(A + B >= 2);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 2*A + 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 2*A + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, Linear_Expression(3));
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, B - 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x + y >= 0);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(z <= 2);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::affine_preimage(v, e, d): it is illegal to apply
+    // the method to a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    oct.affine_preimage(y, y + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 2);
+  oct.add_constraint(y <= 7);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::affine_preimage(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    oct.affine_preimage(x, z - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y >= 2);
+  oct.add_constraint(y <= 7);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::affine_preimage(v, expr, d): it is illegal to
+    // apply this method to a variable that is not in the space of
+    // the polyhedron.
+    oct.affine_preimage(z, x - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B <= -2);
+  oc.add_constraint(B - A >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, A + 3);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 3*A, 2);
+
+  Octagonal_Shape<mpq_class> mpq_known_result(3);
+  mpq_known_result.add_constraint(3*A <= -2);
+
+  bool ok = check_result(oc, mpq_known_result,
+                         "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 3*A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/affinepreimage2.cc b/tests/Octagonal_Shape/affinepreimage2.cc
new file mode 100644
index 0000000..e058320
--- /dev/null
+++ b/tests/Octagonal_Shape/affinepreimage2.cc
@@ -0,0 +1,426 @@
+/* Test Octagonal_Shape::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, B + C - 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B + C >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, B + C - 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, -B + C - 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(B - C <= -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, -B + C - 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, A - C + 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - A <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, A - C + 3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A >= 2);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, -A - C + 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(A + C <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, -A - C + 3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, B - C + 3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, B - C + 3) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, 2*B - C - 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(2*B >= 1);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = check_result(oc, known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 2*B - C - 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, 2*B - 2*C - 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 2*B - 2*C - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(B, 2*B - 2*C - 2, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B >= -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(B, 2*B - 2*C - 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(C, 4*B + 6*C + 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(6*C >= -2);
+
+  bool ok = check_result(oc, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oc, "*** oc.affine_preimage(C, 4*B + 6*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(C, 4*B + 6*C + 2, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(C, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 4*B + 6*C + 2, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, -2*A + 3*C + 2, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - A <= -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.affine_preimage(A, -2*A + 3*C + 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(B <= 0);
+  oc.add_constraint(C >= 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(A, 3*A + C - 1, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A <= -1);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(C >= 0);
+  bool ok = check_result(oc, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oc, "*** oc.affine_preimage(A, 3*A + C - 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(A == 2);
+  oc.add_constraint(B == 0);
+  oc.add_constraint(C >= -3);
+  oc.add_constraint(D <= 5);
+
+  print_constraints(oc, "*** oc ***");
+
+  oc.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A == 2);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C >= -3);
+  known_result.add_constraint(5*D <= 14);
+  bool ok = check_result(oc, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oc,
+                    "*** oc.affine_preimage(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/ascii_dump_load1.cc b/tests/Octagonal_Shape/ascii_dump_load1.cc
new file mode 100644
index 0000000..46076e9
--- /dev/null
+++ b/tests/Octagonal_Shape/ascii_dump_load1.cc
@@ -0,0 +1,331 @@
+/* Test Octagonal_Shape::ascii_dump() and Octagonal_Shape::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+namespace {
+
+const char* my_file = "ascii_dump_load1.dat";
+
+bool
+test01() {
+
+  nout << "test01()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A - B >= 2);
+  oc1.add_constraint(B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  oc2.ascii_load(f);
+  close(f);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool ok = (oc1 == oc2);
+
+  return ok;
+}
+
+bool
+test02() {
+
+  nout << "test02()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A - B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc1.ascii_dump(f);
+  f.seekp(0);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+
+  nout << "test03()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while (str != "-EM");
+  f.seekp(0, std::ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+
+  nout << "test04()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 1);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "+ZE");
+  f.seekp(0, std::ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+
+ nout << "test05()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 2);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "-SC");
+  f.seekp(0, std::ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+
+  nout << "test06()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 3);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "+inf");
+  f.seekp(0, std::ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+
+  nout << "test07()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 3);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while(str != "+inf");
+  do
+    f >> str;
+  while(str != "+inf");
+  f.seekp(0, std::ios_base::cur);
+  f << " 3 ";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+
+  nout << "test08()" << endl;
+
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  oc2.ascii_load(f);
+  close(f);
+
+  bool ok = (oc1 == oc2);
+
+  return ok;
+}
+
+bool
+test09() {
+
+  nout << "test09()" << endl;
+
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+
+  std::fstream f;
+  open(f, my_file, std::ios_base::out);
+  oc.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, std::ios_base::in | std::ios_base::out);
+  std::string str;
+  do
+    f >> str;
+  while (str != "space_dim");
+  f.seekp(0, std::ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, std::ios_base::in);
+  TOctagonal_Shape oc2;
+  bool ok = !oc2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bhmz05widening1.cc b/tests/Octagonal_Shape/bhmz05widening1.cc
new file mode 100644
index 0000000..7400712
--- /dev/null
+++ b/tests/Octagonal_Shape/bhmz05widening1.cc
@@ -0,0 +1,709 @@
+/* Test Octagonal_Shape::BHMZ05_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 1);
+  oc1.add_constraint(x - y <= 2);
+  oc1.add_constraint(y - x <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y <= 2);
+  oc2.add_constraint(-x <= 3);
+  oc2.add_constraint(x <= 0);
+  oc2.add_constraint(y - x <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc1;
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 1);
+  oc1.add_constraint(B >= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A - B >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(C >= 1);
+  oc1.add_constraint(D >= 0);
+  oc1.add_constraint(E >= 0);
+  oc1.add_constraint(C - D <= 76);
+  oc1.add_constraint(C - E <= 76);
+  oc1.add_constraint(E - D == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(C >= 1);
+  oc2.add_constraint(D >= 0);
+  oc2.add_constraint(E >= 0);
+  oc2.add_constraint(C - D <= 75);
+  oc2.add_constraint(C - E <= 75);
+  oc2.add_constraint(E - D == 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 1);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(E - D == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(B <= 39);
+  oc1.add_constraint(C >= 0);
+  oc1.add_constraint(C <= 40);
+  oc1.add_constraint(D >= 0);
+  oc1.add_constraint(D <= 40);
+  oc1.add_constraint(B - A <= 39);
+  oc1.add_constraint(C - A <= 40);
+  oc1.add_constraint(D - A <= 40);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - B <= 1);
+  oc1.add_constraint(B - D <= 0);
+  oc1.add_constraint(D - B <= 2);
+  oc1.add_constraint(C - D <= 0);
+  oc1.add_constraint(D - C <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(B <= 38);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(C <= 39);
+  oc2.add_constraint(D >= 0);
+  oc2.add_constraint(D <= 40);
+  oc2.add_constraint(B - A <= 38);
+  oc2.add_constraint(C - A <= 39);
+  oc2.add_constraint(D - A <= 40);
+  oc2.add_constraint(B - C <= 0);
+  oc2.add_constraint(C - B <= 1);
+  oc2.add_constraint(B - D <= 0);
+  oc2.add_constraint(D - B <= 2);
+  oc2.add_constraint(C - D <= 0);
+  oc2.add_constraint(D - C <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(B - C <= 0);
+  known_result.add_constraint(C - B <= 1);
+  known_result.add_constraint(C - D <= 0);
+  known_result.add_constraint(D - C <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(B <= 1);
+  oc1.add_constraint(C <= 7);
+  oc1.add_constraint(D >= 0);
+  oc1.add_constraint(A + B <= 10);
+  oc1.add_constraint(C - A <= 10);
+  oc1.add_constraint(D - A <= 10);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - B <= 1);
+  oc1.add_constraint(B - D <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(B <= 1);
+  oc2.add_constraint(C <= 7);
+  oc2.add_constraint(D >= 0);
+  oc2.add_constraint(A + B <= 9);
+  oc2.add_constraint(C - A <= 9);
+  oc2.add_constraint(D - A <= 10);
+  oc2.add_constraint(B - C <= 0);
+  oc2.add_constraint(C - B <= 1);
+  oc2.add_constraint(B - D <= 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C <= 7);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - A <= 10);
+  known_result.add_constraint(B - C <= 0);
+  known_result.add_constraint(C - B <= 1);
+  known_result.add_constraint(B - D <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A + B >= 9);
+  oc1.add_constraint(B + C >= 11);
+  oc1.add_constraint(C + D >= 12);
+  oc1.add_constraint(D + E >= 5);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A + B >= 10);
+  oc2.add_constraint(B + C >= 11);
+  oc2.add_constraint(C + D >= 12);
+  oc2.add_constraint(D + E >= 13);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(B + C >= 11);
+  known_result.add_constraint(C + D >= 12);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A - B <= 2);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - A <= -2);
+  oc1.add_constraint(A - D <= 2);
+  oc1.add_constraint(E - D <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A - B <= 2);
+  oc2.add_constraint(B - C <= 0);
+  oc2.add_constraint(C - A <= -2);
+  oc2.add_constraint(B - A <= 3);
+  oc2.add_constraint(A - D <= 1);
+  oc2.add_constraint(E - D <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(B - C <= 0);
+  known_result.add_constraint(C - A <= -2);
+  known_result.add_constraint(E - D <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A - B <= 2);
+  oc1.add_constraint(B - C <= 0);
+  oc1.add_constraint(C - A <= -2);
+  oc1.add_constraint(A - D <= 2);
+  oc1.add_constraint(E - D <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A - B <= 2);
+  oc2.add_constraint(B - A <= -7);
+  oc2.add_constraint(C - A == -2);
+  oc2.add_constraint(A - D <= 1);
+  oc2.add_constraint(E - D <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oc1);
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(B <= 0);
+  oc1.add_constraint(C <= -2);
+  oc1.add_constraint(D <= 2);
+  oc1.add_constraint(E <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(B <= -7);
+  oc2.add_constraint(C <= -2);
+  oc2.add_constraint(D <= 2);
+  oc2.add_constraint(E <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(C <= -2);
+  known_result.add_constraint(D <= 2);
+  known_result.add_constraint(E <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A + C <= -1);
+  oc1.add_constraint(A + D <= 1);
+  oc1.add_constraint(B <= 0);
+  oc1.add_constraint(C <= -3);
+  oc1.add_constraint(D <= 2);
+  oc1.add_constraint(E <= 4);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(A + D <= 1);
+  oc2.add_constraint(B <= -1);
+  oc2.add_constraint(C <= -3);
+  oc2.add_constraint(D <= 2);
+  oc2.add_constraint(E <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(A + D <= 1);
+  known_result.add_constraint(C <= -3);
+  known_result.add_constraint(D <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(C - A <= -1);
+  oc1.add_constraint(B <= 0);
+  oc1.add_constraint(C >= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+  TOctagonal_Shape oct2(cs2);
+
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct2.BHMZ05_widening_assign(oct1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2.BHMZ05_widening_assign(oct1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  TOctagonal_Shape oc1(5);
+  TOctagonal_Shape oc2(10);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::BHMZ05_widening_assign(oc2): it is illegal to apply
+    // this method to two polyhedra that are not dimensional
+    // compatible.
+    oc2.BHMZ05_widening_assign(oc1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  unsigned tokens = 6;
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 1);
+  oc1.add_constraint(B >= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A - B >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.BHMZ05_widening_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= 1);
+
+#undef TOKENS
+#define TOKENS 5
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens <<
+    endl;
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 1);
+  oc1.add_constraint(x - y <= 2);
+  oc1.add_constraint(y - x <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y <= 2);
+  oc2.add_constraint(-x <= 3);
+  oc2.add_constraint(x <= 0);
+  oc2.add_constraint(y - x <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned tokens = TOKENS;
+
+  oc1.BHMZ05_widening_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens <<
+    endl;
+
+  print_constraints(oc1, "*** oc1.BHMZ05_widening_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  unsigned tokens = 6;
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+  TOctagonal_Shape oct2(cs2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct2.BHMZ05_widening_assign(oct1, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+#undef TOKENS
+#define TOKENS 6
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens <<
+    endl;
+
+  print_constraints(oct2, "*** oct2.BHMZ05_widening_assign(oct1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+END_MAIN
+
+
diff --git a/tests/Octagonal_Shape/bhz03widening1.cc b/tests/Octagonal_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..7eac4a7
--- /dev/null
+++ b/tests/Octagonal_Shape/bhz03widening1.cc
@@ -0,0 +1,77 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  typedef Pointset_Powerset<TOctagonal_Shape> PSet;
+
+  TOctagonal_Shape p(2);
+  TOctagonal_Shape q(2);
+  TOctagonal_Shape r(2);
+  TOctagonal_Shape s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  PSet P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  PSet Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  using namespace IO_Operators;
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  PSet old_P = P;
+  P.BHZ03_widening_assign<H79_Certificate>
+    (Q, widen_fun_ref(&TOctagonal_Shape::BHMZ05_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bounded1.cc b/tests/Octagonal_Shape/bounded1.cc
new file mode 100644
index 0000000..7adf68f
--- /dev/null
+++ b/tests/Octagonal_Shape/bounded1.cc
@@ -0,0 +1,133 @@
+/* Test Octagonal_Shape::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  // This is a non-bounded OS.
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  return !oct.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded OS (it is a square);
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 2);
+  oct.add_constraint(y >= 2);
+  oct.add_constraint(x <= 4);
+  oct.add_constraint(y <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test03() {
+  // This is a universal, zero-dimensional OS.
+  TOctagonal_Shape oct;
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test04() {
+  // This is an empty, zero-dimensional OS.
+  TOctagonal_Shape oct;
+  oct.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test05() {
+  // This is an empty OS.
+  TOctagonal_Shape oct(4, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x + y >= 2);
+  oct.add_constraint(x - y >= 2);
+  oct.add_constraint(x + y <= 4);
+  oct.add_constraint(x - y <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x + y >= 2);
+  oct.add_constraint(x <= 1);
+  oct.add_constraint(x + y <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  return oct.is_bounded();
+}
+
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/boundedaffineimage1.cc b/tests/Octagonal_Shape/boundedaffineimage1.cc
new file mode 100644
index 0000000..cfa67be
--- /dev/null
+++ b/tests/Octagonal_Shape/boundedaffineimage1.cc
@@ -0,0 +1,602 @@
+/* Test Octagonal_Shape::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.bounded_affine_image(A, Linear_Expression(7), Linear_Expression(3));
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 7, 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 7);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, 7) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), Linear_Expression(7), -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, 7, -1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -7);
+  known_result.add_constraint(A <= -3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_image(A, Linear_Expression(7), Linear_Expression(3), -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 7, 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(A <= 6);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A - B <= 4);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, A+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), -A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, -A+2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  TOctagonal_Shape oct1 = oct;
+  TOctagonal_Shape oct2 = oct;
+
+
+  oct.bounded_affine_image(A, Linear_Expression(3), B+5);
+
+  oct1.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(3));
+  oct2.generalized_affine_image(A, LESS_OR_EQUAL, B+5);
+  oct1.intersection_assign(oct2);
+
+  bool ok = (oct == oct1);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, B+5) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A + B <= 5);
+
+  oct.bounded_affine_image(A, Linear_Expression(3), B-5, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 3, B-5, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(A <= 23);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A - B <= 19);
+
+  oct.bounded_affine_image(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 2, 4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(2*A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(2*(A + B) <= 5);
+
+  oct.bounded_affine_image(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 2, "
+                    "4*A + 3*B - 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -5);
+  known_result.add_constraint(A <= 23);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A - B <= 19);
+  known_result.add_constraint(B - A <= 5);
+
+  oct.bounded_affine_image(A, 4*A + 3*B - 5, 4*A + 3*B - 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 4*A + 3*B - 5, "
+                    "4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(C <= 5);
+  oct.add_constraint(C >= -1);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+  oct.add_constraint(A - C <= 3);
+  oct.add_constraint(B - C <= 7);
+  oct.add_constraint(A - C >= 1);
+  oct.add_constraint(B - C >= -8);
+
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  known_result.add_constraint(A <= 9);
+  known_result.add_constraint(A >= 4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(C <= 3);
+  known_result.add_constraint(C >= -1);
+  known_result.add_constraint(C - B <= 1);
+
+  oct.bounded_affine_image(A, 4*A + 4, Linear_Expression(9));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 4*A + 4, "
+                    "9) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(C <= 5);
+  oct.add_constraint(C >= -1);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+  oct.add_constraint(A - C <= 3);
+  oct.add_constraint(B - C <= 7);
+  oct.add_constraint(A - C >= 1);
+  oct.add_constraint(B - C >= -8);
+
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 9);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(C <= 3);
+  known_result.add_constraint(C >= -1);
+  known_result.add_constraint(A - C >= 0);
+  known_result.add_constraint(B - C >= -1);
+
+  oct.bounded_affine_image(A, 4*C + 3, Linear_Expression(9));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, 4*C + 3, "
+                    "9) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.bounded_affine_image(A, A, A);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_image(A, A, A) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_image(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_image(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    oct.bounded_affine_image(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::bounded_affine_image(v, lb_expr, ub_epxr, d):
+    // it is illegal to apply this method to a variable
+    // that is not in the space of the octagon.
+    oct.bounded_affine_image(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/boundedaffinepreimage1.cc b/tests/Octagonal_Shape/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..2b93086
--- /dev/null
+++ b/tests/Octagonal_Shape/boundedaffinepreimage1.cc
@@ -0,0 +1,573 @@
+/* Test Octagonal_Shape::bounded_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(7), Linear_Expression(3));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 7, 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, 7) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), Linear_Expression(7),
+                              -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, 7, -1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(7),
+                              Linear_Expression(3), -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 7, 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(B - A <= 3);
+  known_result.add_constraint(A + B >= 2);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, A+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), -A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, -A+2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(B <= 4);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), B+5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, B+5) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*B <= 7);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(3), B-5, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 3, B-5, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(B - A) <= 21);
+  known_result.add_constraint(4*(A + B) >= -5);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 2, "
+                    "4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A <= 5);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(A + B) <= 9);
+
+  oct.bounded_affine_preimage(A, Linear_Expression(2), 4*A + 3*B - 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 2, "
+                    "4*A + 3*B - 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -7);
+  known_result.add_constraint(4*A <= 9);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(A + B) <= 13);
+  known_result.add_constraint(4*(B - A) <= 23);
+
+  oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 4*A + 3*B - 5);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+                    "4*A + 3*B - 5) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.bounded_affine_preimage(A, A, A);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, A, A) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(4*A <= 9);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(4*B <= 11);
+  known_result.add_constraint(4*(A + B) <= 13);
+
+  oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 2*A - 5*B - 1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+                    "2*A - 5*B - 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(B <= 4);
+  oct.add_constraint(A - B <= 2);
+  oct.add_constraint(A - B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A >= -15);
+  known_result.add_constraint(2*A <= 21);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(4*(A + B) >= -3);
+  known_result.add_constraint(2*(A - B) <= 13);
+
+  oct.bounded_affine_preimage(A, 4*A + 3*B - 5, 2*A - 5*B - 1, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.bounded_affine_preimage(A, 4*A + 3*B - 5, "
+                    "2*A - 5*B - 1, -2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_preimage(y, x, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression having a
+    // space dimension greater than the OS's space dimension.
+    oct.bounded_affine_preimage(y, z, x);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_expr, d):
+    // it is illegal to apply this method to an expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    oct.bounded_affine_preimage(x, Linear_Expression(0), x + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::bounded_affine_preimage(v, lb_expr, ub_epxr, d):
+    // it is illegal to apply this method to a variable
+    // that is not in the space of the octagon.
+    oct.bounded_affine_preimage(y, x + 1, Linear_Expression(8));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/bounds1.cc b/tests/Octagonal_Shape/bounds1.cc
new file mode 100644
index 0000000..4109060
--- /dev/null
+++ b/tests/Octagonal_Shape/bounds1.cc
@@ -0,0 +1,312 @@
+/* Test OctagonalShape::bounds_from_below() and
+   Octagonal_Shape::bounds_from_above().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1;
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = oct1.bounds_from_above(Linear_Expression(3))
+    && oct2.bounds_from_below(A);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B) &&
+    oct.bounds_from_below(A + B);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A - B) &&
+    !oct.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A + B - C)
+    && !oct.bounds_from_below(A + B - C);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+  oct.add_constraint(E - D <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A + B - C + 2*E - 2*D)
+    && !oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B - C + 2*E - 2*D)
+    && oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(B - C <= -1);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(A + B - C + 2*E - 2*D)
+    && oct.bounds_from_below(A + B - C + 2*E - 2*D);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.bounds_from_above(Linear_Expression(3))
+    && oct.bounds_from_below(Linear_Expression(3));
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.bounds_from_below(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::bounds_from_below(expr): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.bounds_from_above(z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A - B) &&
+    !oct.bounds_from_below(A - B);
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B) &&
+    !oct.bounds_from_below(A + B);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(A + B + C) &&
+    !oct.bounds_from_below(A + B + C);
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = !oct.bounds_from_above(-A - B - C) &&
+    !oct.bounds_from_below(-A - B - C);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/cc76extrapolation1.cc b/tests/Octagonal_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..cc418a2
--- /dev/null
+++ b/tests/Octagonal_Shape/cc76extrapolation1.cc
@@ -0,0 +1,517 @@
+/* Test Octagonal_Shape::CC76_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x <= 1);
+  oct1.add_constraint(x - y <= 2);
+  oct1.add_constraint(y - x <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x - y <= 2);
+  oct2.add_constraint(-x <= 3);
+  oct2.add_constraint(x <= 0);
+  oct2.add_constraint(y - x <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A + B >= 0);
+  oc1.add_constraint(A - B <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A + B >= 2);
+  oc2.add_constraint(A - B <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_extrapolation_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A + B >= 0);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 3);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A + B >= 0);
+  oc1.add_constraint(A + C >= 0);
+  oc1.add_constraint(A - D <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(A >= 1);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(A + B >= 2);
+  oc2.add_constraint(A + C >= 3);
+  oc2.add_constraint(A - D <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_extrapolation_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(D >= -1);
+  known_result.add_constraint(A + C >= 0);
+  known_result.add_constraint(A - D <= 1);
+  known_result.add_constraint(C + D >= -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oct1(0);
+  TOctagonal_Shape oct2(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct1(2, EMPTY);
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A - B >= -2);
+  oct1.add_constraint(B - A >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A - B >= 2);
+  oct2.add_constraint(B - A >= 1);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A - B >= -2);
+  known_result.add_constraint(B - A >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= 1);
+  oct2.add_constraint(B == -1);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(C <= 4);
+  oct1.add_constraint(B >= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(C <= 3);
+  oct2.add_constraint(B >= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  typedef TOctagonal_Shape::coefficient_type_base ctb;
+  ctb stop_points[] = { ctb(-2), ctb(-1), ctb(0), ctb(1), ctb(2) };
+
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x <= 1);
+  oct1.add_constraint(x - y <= 2);
+  oct1.add_constraint(y - x <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x - y <= 2);
+  oct2.add_constraint(-x <= 3);
+  oct2.add_constraint(x <= 0);
+  oct2.add_constraint(y - x <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.CC76_extrapolation_assign(oct2,
+                                 stop_points,
+                                 stop_points
+                                 + sizeof(stop_points)/sizeof(stop_points[0]));
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(x - y <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oc1(5);
+  TOctagonal_Shape oc2(10);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::CC76_extrapolation_assign(oc2): it is illegal
+    // to apply this method to two polyhedra that are not dimensional
+    // compatible.
+    oc2.CC76_extrapolation_assign(oc1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  unsigned tokens = 6;
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A >= 1);
+  oc1.add_constraint(B >= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A >= 0);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(A - B >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= 1);
+
+#undef TOKENS
+#define TOKENS 6
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 1);
+  oc1.add_constraint(x - y <= 2);
+  oc1.add_constraint(y - x <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y <= 2);
+  oc2.add_constraint(-x <= 3);
+  oc2.add_constraint(x <= 0);
+  oc2.add_constraint(y - x <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+#undef TOKENS
+#define TOKENS 0
+
+  unsigned tokens = TOKENS;
+
+  oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x - y <= 2);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+  TOctagonal_Shape oct2(cs2);
+
+  unsigned tokens = 6;
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct2.CC76_extrapolation_assign(oct1, &tokens);
+
+#undef TOKENS
+#define TOKENS 6
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oct2, "*** oct2.CC76_extrapolation_assign(oct1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A >= 0);
+  oc1.add_constraint(A <= 3);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A + B >= 0);
+  oc1.add_constraint(A + C >= 0);
+  oc1.add_constraint(A - D <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraint(A >= 1);
+  oc2.add_constraint(A <= 2);
+  oc2.add_constraint(B >= 0);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(A + B >= 2);
+  oc2.add_constraint(A + C >= 3);
+  oc2.add_constraint(A - D <= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  unsigned tokens = 6;
+
+  oc1.CC76_extrapolation_assign(oc2, &tokens);
+
+#undef TOKENS
+#define TOKENS 5
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A + C >= 0);
+  known_result.add_constraint(A - D <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result)
+    && (tokens == TOKENS);
+
+  nout << "tokens: before " << TOKENS << ", after " << tokens << endl;
+
+  print_constraints(oc1, "*** oc1.CC76_extrapolation_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/cc76narrowing1.cc b/tests/Octagonal_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..dd4087f
--- /dev/null
+++ b/tests/Octagonal_Shape/cc76narrowing1.cc
@@ -0,0 +1,265 @@
+/* Test Octagonal_Shape::CC76_narrowing_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc1(3, EMPTY);
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(0);
+
+#if NOISY
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+#endif
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oc1(2);
+  TOctagonal_Shape oc2(2);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(0);
+  TOctagonal_Shape oc2(0);
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(B == 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(A <= 3);
+  oc2.add_constraint(A + B <= 5);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 3);
+  known_result.add_constraint(A + B <= 5);
+  known_result.add_constraint(A - B <= 0);
+  known_result.add_constraint(B == 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(-x <= 3);
+  oc1.add_constraint(y - x <= 2);
+  oc1.add_constraint(x - y <= 5);
+  oc1.add_constraint(x <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x <= 1);
+  oc2.add_constraint(y - x <= 7);
+  oc2.add_constraint(x - y <= 6);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y - x <= 7);
+  known_result.add_constraint(-x <= 3);
+  known_result.add_constraint(x - y <= 6);
+  known_result.add_constraint(-y <= 8);
+  known_result.add_constraint(y <= 8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable y(1);
+
+  TOctagonal_Shape oc1(1);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(y >= 6);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::CC76_narrowing_assign(oc2): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc2.CC76_narrowing_assign(oc1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= 3);
+  oc1.add_constraint(y - x <= 2);
+  oc1.add_constraint(x - y <= 5);
+  oc1.add_constraint(x <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x <= 1);
+  oc2.add_constraint(y - x <= 7);
+  oc2.add_constraint(x - y <= 6);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.CC76_narrowing_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.CC76_narrowing_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
+
+
diff --git a/tests/Octagonal_Shape/chinainit.cc b/tests/Octagonal_Shape/chinainit.cc
new file mode 100644
index 0000000..f0adb75
--- /dev/null
+++ b/tests/Octagonal_Shape/chinainit.cc
@@ -0,0 +1,76 @@
+/* Simulate the initialization phase of the China analyzer.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+TOctagonal_Shape
+init(dimension_type num_vars) {
+  TOctagonal_Shape oc(num_vars);
+  if (num_vars > 0) {
+    Constraint_System cs;
+    for (dimension_type i = num_vars; i-- > 0; )
+      cs.insert(Variable(i) >= 0);
+    oc = TOctagonal_Shape(cs);
+#if NOISY
+    print_constraints(oc, "*** oc ***");
+#endif
+  }
+  return oc;
+}
+
+bool
+test01(){
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+  function.insert(3, 2);
+  function.insert(5, 3);
+  function.insert(7, 4);
+  function.insert(9, 5);
+
+  print_function(function, "*** function ***");
+
+
+  TOctagonal_Shape known_result = init(6);
+
+  for (dimension_type i = 10; i < 50; ++i) {
+    TOctagonal_Shape oc = init(i);
+    oc.map_space_dimensions(function);
+    if (oc != known_result) {
+      print_constraints(oc, "*** oc ***");
+      print_constraints(known_result, "*** known_result ***");
+      return false;
+    }
+  }
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/concatenate1.cc b/tests/Octagonal_Shape/concatenate1.cc
new file mode 100644
index 0000000..aea79aa
--- /dev/null
+++ b/tests/Octagonal_Shape/concatenate1.cc
@@ -0,0 +1,283 @@
+/* Test Octagonal_Shape::concatenate_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 - x3 <= 0);
+  oc1.add_constraint(x3 <= 2);
+  oc1.add_constraint(x6 - x5 <= 2);
+  oc1.add_constraint(x5 <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x2 - x3 <= 2);
+  oc2.add_constraint(x3 <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 - x3 <= 0);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x - y <= 4);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc2.concatenate_assign(oc1);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+  print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x <= 3);
+  oc2.add_constraint(x - y <= 4);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc2.concatenate_assign(oc1);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+  print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 + x3 <= 1);
+  oc1.add_constraint(x3 <= 2);
+  oc1.add_constraint(x6 - x5 <= 2);
+  oc1.add_constraint(x5 <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x2 + x3 <= 77);
+  oc2.add_constraint(x3 <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 + x3 <= 1);
+  known_result.add_constraint(x3 <= 2);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 3);
+  known_result.add_constraint(x8 + x9 <= 77);
+  known_result.add_constraint(x9 <= 7);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(4);
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0);
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(A - B <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc2.concatenate_assign(oc1);
+
+  Octagonal_Shape<mpq_class> known_result(oc1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc2) == known_result);
+
+  print_constraints(oc2, "*** oc2.concatenate_assign(oc1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+  Variable x7(6);
+  Variable x8(7);
+  Variable x9(8);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 - x3 <= 1);
+  oc1.add_constraint(x3 <= 12);
+  oc1.add_constraint(x6 - x5 <= 2);
+  oc1.add_constraint(x5 <= 23);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x2 - x3 <= 2);
+  oc2.add_constraint(x3 <= 8);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.concatenate_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(9);
+  known_result.add_constraint(x2 - x3 <= 1);
+  known_result.add_constraint(x3 <= 12);
+  known_result.add_constraint(x6 - x5 <= 2);
+  known_result.add_constraint(x5 <= 23);
+  known_result.add_constraint(x8 - x9 <= 2);
+  known_result.add_constraint(x9 <= 8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.concatenate_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/congruences1.cc b/tests/Octagonal_Shape/congruences1.cc
new file mode 100644
index 0000000..e309700
--- /dev/null
+++ b/tests/Octagonal_Shape/congruences1.cc
@@ -0,0 +1,200 @@
+/* Test Octagonal_Shape::congruences(): we compute the system of
+   congruences of an octagon  that is defined by a system of
+   congruences that contains only a trivially false congruence.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_congruence((0*A %= 1) / 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.minimized_constraints();
+
+  print_constraints(cs, "*** cs ***");
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_congruence((x %= 1) / 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(3);
+  oct2.add_congruences(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oct1(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  print_constraints(oct1, "*** oct1 ***");
+  TOctagonal_Shape oct2(cgs.space_dimension(), EMPTY);
+
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct1(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.refine_with_congruence((x %= 1) / 0);
+  oct1.refine_with_congruence((y %= 3) / 2);
+  oct1.refine_with_congruence((y + z %= 0) / 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+  TOctagonal_Shape oct2(3);
+  oct2.refine_with_congruences(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.refine_with_congruence((x + y %= 3) / 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Congruence_System cgs = oct1.congruences();
+
+  TOctagonal_Shape oct2(2);
+  oct2.refine_with_congruences(cgs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/constrains1.cc b/tests/Octagonal_Shape/constrains1.cc
new file mode 100644
index 0000000..35217a9
--- /dev/null
+++ b/tests/Octagonal_Shape/constrains1.cc
@@ -0,0 +1,232 @@
+/* Test Octagonal_Shape::constrains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)               \
+  if (!pred) {                                  \
+    nout << "!" #pred << endl;                  \
+    ok = false;                                 \
+  }
+
+#define TEST_PREDICATE_FALSE(pred)              \
+  if (pred) {                                   \
+    nout << #pred << endl;                      \
+    ok = false;                                 \
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape bds(2);
+  bds.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TOctagonal_Shape(2);
+  bds.add_constraint(A == B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds = TOctagonal_Shape(2);
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  bds.add_constraint(A <= B);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape bds(0);
+  bds.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) bds.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape bds(2);
+  bds.add_constraint(B >= 0);
+  bds.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3);
+  bds.add_constraint(A == 0);
+  bds.add_constraint(B == 0);
+  bds.add_constraint(A + C == 0);
+  bds.unconstrain(A);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape bds(2);
+  bds.add_constraint(A >= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_FALSE(bds.constrains(B));
+
+  bds.add_constraint(B >= A);
+
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3);
+  bds.add_constraint(A >= B+1);
+  bds.add_constraint(A <= B);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape bds(3);
+  bds.add_constraint(A >= B);
+  bds.add_constraint(A <= B-1);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(bds.constrains(C));
+  TEST_PREDICATE_TRUE(bds.constrains(B));
+  TEST_PREDICATE_TRUE(bds.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/constraints1.cc b/tests/Octagonal_Shape/constraints1.cc
new file mode 100644
index 0000000..9c891b6
--- /dev/null
+++ b/tests/Octagonal_Shape/constraints1.cc
@@ -0,0 +1,376 @@
+/* Test Octagonal_Shape::constraints(): we compute the system of
+   constraints of an octagon  that is defined by a system of
+   constraints that contains only a trivially false constraint.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(0*A == 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x == 1);
+  oct1.add_constraint(y <= 3);
+  oct1.add_constraint(y - x >= 5);
+  oct1.add_constraint(z + x == 2);
+  oct1.add_constraint(z - y <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oct1(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs.space_dimension(), EMPTY);
+
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct1(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(B >= 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+
+  oct1.add_constraint(A == 0);
+  oct1.add_constraint(B >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+
+  oct1.add_constraint(A + B == 0);
+  oct1.add_constraint(B <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+
+  oct1.add_constraint(A - B == 0);
+  oct1.add_constraint(B <= 1);
+  oct1.add_constraint(C + A <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct1(5);
+  oct1.add_constraint(A == 1);
+  oct1.add_constraint(B + C == 1);
+  oct1.add_constraint(E - D == 1);
+  oct1.add_constraint(A + C <= 1);
+  oct1.add_constraint(B - D <= 1);
+  oct1.add_constraint(E + C >= -1);
+  oct1.add_constraint(A - D >= -1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+
+  oct1.add_constraint(A - B == 0);
+  oct1.add_constraint(B <= 1);
+  oct1.add_constraint(-C - A <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  Constraint_System cs = oct1.constraints();
+  TOctagonal_Shape oct2(cs);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test12() {
+
+  TOctagonal_Shape oct1(0);
+  oct1.add_constraint(Linear_Expression(1) == 0);
+
+  TOctagonal_Shape oct2(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(3);
+
+  oct.refine_with_constraint(A > 0);
+  oct.refine_with_constraint(B < 0);
+  oct.refine_with_constraint(A + B > 1);
+  oct.refine_with_constraint(A + 2*B > 1);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(A + B >= 1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A > 0);
+  cs.insert(B < 0);
+  cs.insert(A + B > 1);
+  cs.insert(A + 2*B > 1);
+
+  TOctagonal_Shape oct(3);
+  oct.refine_with_constraints(cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+  known_result.add_constraint(A + B >= 1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/contains1.cc b/tests/Octagonal_Shape/contains1.cc
new file mode 100644
index 0000000..ddc4df7
--- /dev/null
+++ b/tests/Octagonal_Shape/contains1.cc
@@ -0,0 +1,373 @@
+/* Test Octagonal_Shape::contains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc1;
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2;
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(C >= 0);
+  oc1.add_constraint(B + C >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(A == 0);
+  oc2.add_constraint(C >= 0);
+  oc2.add_constraint(B + C >= 1);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(D >= 0);
+  cs.insert(C >= 0);
+  cs.insert(B >= 0);
+  cs.insert(A >= 0);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(cs);
+  oc2.add_constraint(A + B >= 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs1;
+  cs1.insert(A + D >= 0);
+  cs1.insert(C >= 0);
+  cs1.insert(B >= 0);
+  cs1.insert(A == 0);
+  TOctagonal_Shape oc1(cs1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(D == 0);
+  cs2.insert(C == 0);
+  cs2.insert(B == 0);
+  cs2.insert(A == 0);
+  TOctagonal_Shape oc2(cs2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return contained;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(0);
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0, EMPTY);
+  print_constraints(oc2, "*** oc2 ***");
+
+  TOctagonal_Shape oc3(0);
+  print_constraints(oc3, "*** oc3 ***");
+
+  bool contained1 = oc1.contains(oc2);
+  bool contained2 = oc1.contains(oc3);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained1 ? "true" : "false") << endl;
+  nout << "*** oc1.contains(oc3) ***" << endl;
+  nout << (contained2 ? "true" : "false") << endl;
+
+  return contained1 && contained2;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs1;
+  cs1.insert(C + D == 0);
+  cs1.insert(A - B <= 0);
+  cs1.insert(A == 0);
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraints(cs1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Constraint_System cs2(cs1);
+  cs2.insert(D == 0);
+  TOctagonal_Shape oc2(4);
+  oc2.add_constraints(cs2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Constraint_System cs3(cs2);
+  cs3.insert(B == 0);
+  cs3.insert(B + C <= 0);
+  TOctagonal_Shape oc3(4);
+  oc3.add_constraints(cs3);
+
+  print_constraints(oc3, "*** oc3 ***");
+
+  bool contained1 = oc1.contains(oc2);
+  bool contained2 = oc1.contains(oc3);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained1 ? "true" : "false") << endl;
+  nout << "*** oc1.contains(oc3) ***" << endl;
+  nout << (contained2 ? "true" : "false") << endl;
+
+  return contained1 && contained2;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs1;
+  cs1.insert(A - B <= 0);
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraints(cs1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  Constraint_System cs2(cs1);
+  cs2.insert(D == 0);
+  cs2.insert(A - B <= 0);
+  cs2.insert(B - C <= 3);
+  cs2.insert(C - D <= -1);
+  cs2.insert(D - A <= -3);
+  TOctagonal_Shape oc2(4);
+
+  // The octagon oc2 is empty, since it has a negative cycle.
+  oc2.add_constraints(cs2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Constraint_System cs3(cs1);
+  cs3.insert(B <= 2);
+  cs3.insert(B >= 5);
+  TOctagonal_Shape oc3(4);
+
+  // The octagon oc3 is empty.
+  oc3.add_constraints(cs3);
+
+  print_constraints(oc3, "*** oc3 ***");
+
+  bool contained1 = oc1.contains(oc2);
+  bool contained2 = oc1.contains(oc3);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained1 ? "true" : "false") << endl;
+  nout << "*** oc1.contains(oc3) ***" << endl;
+  nout << (contained2 ? "true" : "false") << endl;
+
+  return contained1 && contained2;
+}
+
+bool
+test08() {
+  TOctagonal_Shape oc1(3, UNIVERSE);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+  bool strictly_contained = oc1.strictly_contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  nout << "*** oc1.strictly_contains(oc2) ***" << endl;
+  nout << (strictly_contained ? "true" : "false") << endl;
+
+  return contained && strictly_contained;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x - y >= 0);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc1.contains(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oc1(0, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (!contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(C <= 0);
+  oc1.add_constraint(B + C <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(A == 0);
+  oc2.add_constraint(C <= 0);
+  oc2.add_constraint(B + C <= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (!contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+bool
+test12() {
+  TOctagonal_Shape oc1(3, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3, UNIVERSE);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool contained = oc1.contains(oc2);
+
+  nout << "*** oc1.contains(oc2) ***" << endl;
+  nout << (contained ? "true" : "false") << endl;
+
+  return !contained;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/containsintegerpoint1.cc b/tests/Octagonal_Shape/containsintegerpoint1.cc
new file mode 100644
index 0000000..7e335a1
--- /dev/null
+++ b/tests/Octagonal_Shape/containsintegerpoint1.cc
@@ -0,0 +1,199 @@
+/* Test Octagonal_Shape::contains_integer_point().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  Octagonal_Shape<mpz_class> oct(2);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  Octagonal_Shape<mpq_class> oct(2);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  // NOTE: results depends on whether or not the rational constraints
+  // on y have been approximated as integral constraints.
+  typedef TOctagonal_Shape::coefficient_type_base T;
+  return std::numeric_limits<T>::is_integer ? contains : !contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y - 3*z <= 2);
+  cs.insert(8*z - 8*y >= 7);
+
+  Octagonal_Shape<mpq_class> oct(3);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(3*y - 3*x <= 2);
+  cs.insert(8*x - 8*y >= 7);
+
+  Octagonal_Shape<mpz_class> oct(2);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.add_constraint(x <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraints(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x);
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  oct.remove_space_dimensions(to_be_removed);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool contains = oct.contains_integer_point();
+
+  nout << "oct.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Octagonal_Shape/difference1.cc b/tests/Octagonal_Shape/difference1.cc
new file mode 100644
index 0000000..f406344
--- /dev/null
+++ b/tests/Octagonal_Shape/difference1.cc
@@ -0,0 +1,258 @@
+/* Test Octagonal_Shape::difference_assign(): if `oct1' is
+   contained in `oct2', the result of `oct1.difference_assign(oct2)'
+   is an empty octagon.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A <= -2);
+  oct1.add_constraint(B == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A >= 0);
+  oct2.add_constraint(A <= 2);
+  oct2.add_constraint(B >= 0);
+  oct2.add_constraint(B <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.difference_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.difference_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(0);
+  TOctagonal_Shape oct2(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.difference_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(1);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A <= 7);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(1);
+  oct2.add_constraint(A == 5);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.difference_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 7);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc1(3);
+  TOctagonal_Shape oc2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::difference_assign(oc2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    oc1.difference_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 0);
+  oct1.add_constraint(A >= -2);
+  oct1.add_constraint(B == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  oct1.difference_assign(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.difference_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oc1(4);
+  oc1.add_constraint(D == 0);
+  oc1.add_constraint(C == 0);
+  oc1.add_constraint(B == 0);
+  oc1.add_constraint(A == 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(4);
+  oc1.add_constraint(A + D >= 0);
+  oc1.add_constraint(C >= 0);
+  oc1.add_constraint(B >= 0);
+  oc1.add_constraint(A == 0);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(4, EMPTY);
+
+  oc1.difference_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.difference_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(B >= 0);
+  oct1.add_constraint(A + B <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A + B <= 10);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.difference_assign(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.difference_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A + B <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A + B >= 1);
+  oct2.add_constraint(A + B <= 10);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A + B <= 1);
+
+  oct1.difference_assign(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.difference_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/discrete1.cc b/tests/Octagonal_Shape/discrete1.cc
new file mode 100644
index 0000000..0ba31df
--- /dev/null
+++ b/tests/Octagonal_Shape/discrete1.cc
@@ -0,0 +1,213 @@
+/* Test Octagonal_Shape::is_discrete().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(3);
+
+  oct.add_constraint(x <= 2);
+  oct.add_constraint(x - y == 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A <= 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+
+  oct.add_constraint(A == 5);
+  oct.add_constraint(A - B == 3);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(E - D == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 3);
+  oct.add_constraint(B - A <= -5);
+  oct.add_constraint(-B <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oct(2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(E == 1);
+  oct.add_constraint(A - D == 8);
+  oct.add_constraint(B <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return !ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B == 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(7);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B == 2);
+  oct.add_constraint(B - A <= -6);
+
+  print_constraints(oct, "*** oct ***");
+
+  bool ok = oct.is_discrete();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/disjoint1.cc b/tests/Octagonal_Shape/disjoint1.cc
new file mode 100644
index 0000000..bd28dbe
--- /dev/null
+++ b/tests/Octagonal_Shape/disjoint1.cc
@@ -0,0 +1,190 @@
+/* Test Polyhedron::is_disjoint_from(const Octagonal_Shape& y).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(B == 0);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(A <= 2);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == 0);
+  oct2.add_constraint(B >= 1);
+  oct2.add_constraint(B <= 2);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A + B == 1);
+  oct1.add_constraint(A <= 1);
+  oct1.add_constraint(B <= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A + B <= 2);
+  oct2.add_constraint(A >= 0);
+  oct2.add_constraint(B >= 3);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A - B <= 5);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A + B));
+  gs1.insert(ray(B));
+
+  TOctagonal_Shape oct1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(A + B));
+  gs2.insert(ray(-B));
+
+  TOctagonal_Shape oct2(gs2);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return !disjoint;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(B >= -4);
+
+  TOctagonal_Shape oct2(2, EMPTY);
+
+  bool disjoint = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return disjoint;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= y);
+
+  TOctagonal_Shape oc2(3);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::is_disjoint_from(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.is_disjoint_from(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A == 0);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == 1);
+
+  bool ok = oct1.is_disjoint_from(oct2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/dropsomenonintegerpoints1.cc b/tests/Octagonal_Shape/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..7a12d83
--- /dev/null
+++ b/tests/Octagonal_Shape/dropsomenonintegerpoints1.cc
@@ -0,0 +1,358 @@
+/* Test Octagonal_Shape::drop_some_non_integer_points().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Octagonal_Shape<mpq_class> os(2);
+
+  os.add_constraint(2*A >= 1);
+  os.add_constraint(2*B >= -1);
+  os.add_constraint(2*A - 2*B >= 1);
+  os.add_constraint(4*A + 4*B >= 1);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points();
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(A + B >= 1);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Octagonal_Shape<mpq_class> os1;
+  Octagonal_Shape<mpq_class> os2(0, EMPTY);
+  Octagonal_Shape<mpq_class> os3(2, EMPTY);
+  Octagonal_Shape<mpq_class> os4(2);
+
+  print_constraints(os1, "*** os1 ***");
+  print_constraints(os2, "*** os2 ***");
+
+  Octagonal_Shape<mpq_class> known_result1(os1);
+  Octagonal_Shape<mpq_class> known_result2(os2);
+  Octagonal_Shape<mpq_class> known_result3(os3);
+  Octagonal_Shape<mpq_class> known_result4(os4);
+
+  os1.drop_some_non_integer_points();
+  os2.drop_some_non_integer_points();
+  os3.drop_some_non_integer_points();
+  os4.drop_some_non_integer_points();
+
+  bool ok = (os1 == known_result1 && os2 == known_result2
+             && os3 == known_result3 && os4 == known_result4);
+
+  print_constraints(os1, "*** after os1.drop_some_non_integer_points() ***");
+  print_constraints(os2, "*** after os2.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(A - B == 0);
+  os.add_constraint(A >= 0);
+
+  Octagonal_Shape<mpq_class> known_result(os);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points();
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(A >= 0);
+  os.add_constraint(A == B);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points();
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(2*A == 1);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points();
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(2*A <= 1);
+  os.add_constraint(2*B <= -1);
+  os.add_constraint(4*A - 4*B <= 7);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points();
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= -1);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  Octagonal_Shape<mpq_class> os(2);
+
+  os.add_constraint(2*A >= 1);
+  os.add_constraint(2*B >= -1);
+  os.add_constraint(2*A - 2*B >= 1);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points(varset_A);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(2*B >= -1);
+  known_result.add_constraint(2*A - 2*B >= 1);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os,
+                    "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  Octagonal_Shape<mpq_class> os1(2, EMPTY);
+  Octagonal_Shape<mpq_class> os2(2);
+
+  print_constraints(os1, "*** os1 ***");
+  print_constraints(os2, "*** os2 ***");
+
+  Octagonal_Shape<mpq_class> known_result1(os1);
+  Octagonal_Shape<mpq_class> known_result2(os2);
+
+  os1.drop_some_non_integer_points(varset_A);
+  os2.drop_some_non_integer_points(varset_A);
+
+  bool ok = (os1 == known_result1 && os2 == known_result2);
+
+  print_constraints(os1,
+                    "*** after os1.drop_some_non_integer_points(varset_A) ***");
+  print_constraints(os2,
+                    "*** after os2.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(2*A - 2*B == 1);
+  os.add_constraint(A >= 0);
+
+  Octagonal_Shape<mpq_class> known_result(os);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points(varset_A);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os,
+                    "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(A >= 0);
+  os.add_constraint(A == B);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points(varset_A);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os,
+                    "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_B;
+  varset_B.insert(B);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(2*A == 1);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points(varset_B);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os,
+                    "*** after os.drop_some_non_integer_points(varset_B) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variables_Set varset_A;
+  varset_A.insert(A);
+
+  Octagonal_Shape<mpq_class> os(2);
+  os.add_constraint(2*A <= 1);
+  os.add_constraint(2*B <= -1);
+  os.add_constraint(4*A - 4*B <= 7);
+
+  print_constraints(os, "*** os ***");
+
+  os.drop_some_non_integer_points(varset_A);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(2*B <= -1);
+  known_result.add_constraint(4*A - 4*B <= 7);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os,
+                    "*** after os.drop_some_non_integer_points(varset_A) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/empty1.cc b/tests/Octagonal_Shape/empty1.cc
new file mode 100644
index 0000000..a14832e
--- /dev/null
+++ b/tests/Octagonal_Shape/empty1.cc
@@ -0,0 +1,131 @@
+/* Test Octagonal_Shape::is_empty() .
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc1(2, EMPTY);
+
+  bool empty1 = oc1.is_empty();
+
+  nout << "*** oc1.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false ") << endl;
+
+  TOctagonal_Shape oc2(2, UNIVERSE);
+
+  bool empty2 = oc2.is_empty();
+
+  nout << "*** oc2.is_empty() ***" << endl;
+  nout << (empty2 ? "true" : "false") << endl;
+
+  return empty1 && !empty2;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+
+  oc.add_constraint(A == 0);
+  oc.add_constraint(C >= 0);
+  oc.add_constraint(B - C >= 1);
+
+  print_constraints(oc, "*** oc ***");
+
+  bool empty = oc.is_empty();
+
+  nout << "*** oc.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  return !empty;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oc1(5);
+  oc1.add_constraint(A <= 3);
+  oc1.add_constraint(D <= 3);
+  oc1.add_constraint(B - A <= 0);
+  oc1.add_constraint(C - A <= -2);
+  oc1.add_constraint(E - A <= 2);
+  oc1.add_constraint(-B <= 0);
+  oc1.add_constraint(C - B <= 5);
+  oc1.add_constraint(D - C <= -6);
+  oc1.add_constraint(A - D <= 5);
+  oc1.add_constraint(E - D <= 2);
+  oc1.add_constraint(-E <= -5);
+  oc1.add_constraint(C - E <= 7);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  bool empty = oc1.is_empty();
+
+  nout << "*** oc1.is_empty() ***" << endl;
+  nout << (empty ? "true" : "false") << endl;
+
+  TOctagonal_Shape oc2(5);
+  oc2.add_constraint(A <= 3);
+  oc2.add_constraint(D <= 3);
+  oc2.add_constraint(B - A <= 0);
+  oc2.add_constraint(C - A <= 2);
+  oc2.add_constraint(E - A <= 2);
+  oc2.add_constraint(-B <= 0);
+  oc2.add_constraint(C - B <= 5);
+  oc2.add_constraint(D - C <= 6);
+  oc2.add_constraint(A - D <= 5);
+  oc2.add_constraint(E - D <= 2);
+  oc2.add_constraint(-E <= 5);
+  oc2.add_constraint(C - E <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  bool empty1 = oc2.is_empty();
+
+  nout << "*** oc2.is_empty() ***" << endl;
+  nout << (empty1 ? "true" : "false") << endl;
+
+  return empty && !empty1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Octagonal_Shape/expandspacedim1.cc b/tests/Octagonal_Shape/expandspacedim1.cc
new file mode 100644
index 0000000..125371f
--- /dev/null
+++ b/tests/Octagonal_Shape/expandspacedim1.cc
@@ -0,0 +1,295 @@
+/* Test Octagonal_Shape::expand_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+
+  TOctagonal_Shape known_result(4);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** after oct1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(B, 1);
+
+  TOctagonal_Shape known_result(4, EMPTY);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 0);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+  oct1.add_constraint(B >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+
+  TOctagonal_Shape known_result(3, EMPTY);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+
+  TOctagonal_Shape known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 2);
+
+  TOctagonal_Shape known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D - B <= 2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A <= 1);
+  oct1.add_constraint(C == 1);
+  oct1.add_constraint(A - B >= 1);
+  oct1.add_constraint(B <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(A, 1);
+  oct1.expand_space_dimension(C, 1);
+
+  TOctagonal_Shape known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D - B >= 1);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.expand_space_dimension(A, 1);"
+                    " oct1.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+  oct1.add_constraint(A <= 2);
+  oct1.add_constraint(A - B >= 1);
+  oct1.add_constraint(B <= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.expand_space_dimension(B, 1);
+
+  TOctagonal_Shape known_result(3, EMPTY);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::expand_space_dimension(v, m):
+    // it is illegal to apply this method to a variable
+    // that is not in the space of the octagon.
+    oct.expand_space_dimension(y, 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::expand_space_dimension(v, m):
+    // it is illegal to apply this method when the maximum allowed space
+    // dimension would be exceeded.
+    oct.expand_space_dimension(x, 40000);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/foldspacedims1.cc b/tests/Octagonal_Shape/foldspacedims1.cc
new file mode 100644
index 0000000..9816cc5
--- /dev/null
+++ b/tests/Octagonal_Shape/foldspacedims1.cc
@@ -0,0 +1,442 @@
+/* Test Octagonal_Shape::fold_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - C <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - C <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(A <= 3);
+  oct1.add_constraint(B >= 7);
+  oct1.add_constraint(B <= 12);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A >= 1);
+  oct1.add_constraint(A <= 3);
+  oct1.add_constraint(B >= 7);
+  oct1.add_constraint(B <= 12);
+  oct1.add_constraint(C == 15);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  oct1.fold_space_dimensions(to_fold, C);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A, B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(4);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A - B <= 2);
+  oct1.add_constraint(C >= 0);
+  oct1.add_constraint(C - B <= 2);
+  oct1.add_constraint(D >= 0);
+  oct1.add_constraint(D - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  oct1.fold_space_dimensions(to_fold, A);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A - B <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {C, D} into A ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(4);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(B == 0);
+  oct1.add_constraint(A - B <= 2);
+  oct1.add_constraint(C >= 0);
+  oct1.add_constraint(C - B <= 2);
+  oct1.add_constraint(D >= 0);
+  oct1.add_constraint(D - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  oct1.fold_space_dimensions(to_fold, C);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A >= 0);
+  oct1.add_constraint(A <= -1);
+  oct1.add_constraint(A - B <= 2);
+  oct1.add_constraint(C >= 0);
+  oct1.add_constraint(C - B <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+
+  oct1.fold_space_dimensions(to_fold, A);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {B, D} into C ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  //  Variable G(6);
+
+  TOctagonal_Shape oc(5);
+  oc.add_constraint(A + D <= 2);
+  oc.add_constraint(B - E >= 2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(C);
+  to_be_folded.insert(D);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+    // it is illegal to fold a variable that is not in the space
+    // of the octagon.
+    oc.fold_space_dimensions(to_be_folded, F);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  // Variable D(3);
+  // Variable E(4);
+  Variable F(5);
+  // Variable G(6);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A + B <= 2);
+  oc.add_constraint(C - B >= 2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(C);
+
+  try {
+    to_be_folded.insert(F);
+    // This is an invalid use of the method
+    // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+    // it is illegal to insert in the set `to_be_folded' a variable
+    // that is not in the space of the octagon.
+    oc.fold_space_dimensions(to_be_folded, A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A + B <= 2);
+  oc.add_constraint(C - B >= 2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(C);
+
+  try {
+    to_be_folded.insert(A);
+    // This is an invalid use of the method
+    // Octagonal_Shape::fold_space_dimensions(to_be_folded, v):
+    // it is illegal to insert in the set `to_be_folded' the variable
+    // `var' that is not in the space of the octagon.
+    oc.fold_space_dimensions(to_be_folded, A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.OK();
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(1, EMPTY);
+
+  oct1.add_space_dimensions_and_embed(1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  oct1.OK();
+
+  oct1.fold_space_dimensions(to_fold, B);
+
+  Octagonal_Shape<mpq_class> known_result(1, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frequency1.cc b/tests/Octagonal_Shape/frequency1.cc
new file mode 100644
index 0000000..2959faf
--- /dev/null
+++ b/tests/Octagonal_Shape/frequency1.cc
@@ -0,0 +1,361 @@
+/* Test Octagonal_Shape::frequency().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty bd shape.
+bool
+test01() {
+  Variable A(0);
+
+  TOctagonal_Shape os1(1);
+
+  TOctagonal_Shape os2(1, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (!os1.frequency(A, num1, den1, valn1, vald1)
+             && !os2.frequency(A, num2, den2, valn2, vald2));
+  print_constraints(os1, "*** os1 ***");
+  print_constraints(os2, "*** os2 ***");
+
+  return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+  TOctagonal_Shape os1(0);
+
+  TOctagonal_Shape os2(0, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (os1.frequency(Linear_Expression(3), num1, den1, valn1, vald1)
+             && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+             && !os2.frequency(Linear_Expression(3), num2, den2, valn2, vald2));
+  print_constraints(os1, "*** os1 ***");
+  print_constraints(os2, "*** os2 ***");
+
+  return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape os(1);
+  os.add_constraint(A == 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!os.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A <= 0);
+  os.add_constraint(A - B >= 5);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!os.frequency(Linear_Expression(B), num, den, valn, vald));
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(2*A == 1);
+  os.add_constraint(B == 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == -1 && vald == 2);
+  print_constraints(os, "*** os ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A <= 1);
+  os.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!os.frequency(Linear_Expression(A - B), num, den, valn, vald));
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape os(3);
+  os.add_constraint(2*A - 2*B == 2);
+  os.add_constraint(2*C == 2);
+  os.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A - B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 3 && vald == 1);
+  print_constraints(os, "*** os ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape os(3);
+  os.add_constraint(2*A - 2*B == 2);
+  os.add_constraint(2*C == 2);
+  os.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A - B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 3 && vald == 1);
+  print_constraints(os, "*** os ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape os(3);
+  os.add_constraint(2*A + 2*B == 2);
+  os.add_constraint(2*C == 2);
+  os.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A + B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 3 && vald == 1);
+  print_constraints(os, "*** os ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape os(3);
+  os.add_constraint(2*A + 2*B == 2);
+  os.add_constraint(B - C == 2);
+  os.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A - B + 2*C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == -2 && vald == 1);
+  print_constraints(os, "*** os ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape os(3);
+  os.add_constraint(2*A - 2*B == 2);
+  os.add_constraint(B + C == 1);
+  os.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (os.frequency(Linear_Expression(A + B + 2*C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 4 && vald == 1);
+  print_constraints(os, "*** os ***");
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape os(3);
+  os.add_constraint(4*A - 4*B == 1);
+  os.add_constraint(3*C == 1);
+  os.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool discrete = os.frequency(Linear_Expression(A - B),
+                                num, den, valn, vald);
+  // If the shape is based on an integral coefficient type, then
+  // approximations will induce non discreteness of the linear expression.
+  bool ok
+    = std::numeric_limits<TOctagonal_Shape::coefficient_type_base>::is_integer
+      ? (!discrete && num == 0 && den == 0 && valn == 0 && vald == 0)
+      : (discrete && num == 0 && den == 1 && valn == 1 && vald == 4);
+  print_constraints(os, "*** os ***");
+  nout << "num " << num << ", den " << den << endl;
+  nout << "valn " << valn << ", vald " << vald << endl;
+
+  return ok;
+}
+
+// Test of an empty octagonal_shape in 1-dimension.
+bool
+test14() {
+  Variable A(0);
+
+  TOctagonal_Shape os(1);
+  os.add_constraint(A <= 0);
+  os.add_constraint(A >= 1);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!os.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test08, TOctagonal_Shape);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frombdshape1.cc b/tests/Octagonal_Shape/frombdshape1.cc
new file mode 100644
index 0000000..71eff8b
--- /dev/null
+++ b/tests/Octagonal_Shape/frombdshape1.cc
@@ -0,0 +1,55 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B <= 5);
+  cs.insert(A - B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TBD_Shape bd(cs);
+
+  TOctagonal_Shape os(bd);
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frombox1.cc b/tests/Octagonal_Shape/frombox1.cc
new file mode 100644
index 0000000..de330f3
--- /dev/null
+++ b/tests/Octagonal_Shape/frombox1.cc
@@ -0,0 +1,358 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const Box<Interval>&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+  Rational_Box box(2);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*B == 2);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(3*B == 2);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(B == -10);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(3*A == -2);
+  known_oct.add_constraint(B == -10);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+  print_constraints(known_oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Rational_Box box(3);
+  box.add_constraint(5*C == 15);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(3);
+  known_oct.add_constraint(5*C == 15);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+  Rational_Box box(0);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct;
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2, EMPTY);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A 4D box containing a single 3D space.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Rational_Box box(4);
+  box.add_constraint(D == 4);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(4);
+  known_oct.add_constraint(D == 4);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Unit square.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(A <= 1);
+  box.add_constraint(B >= 0);
+  box.add_constraint(B <= 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(A >= 0);
+  known_oct.add_constraint(A <= 1);
+  known_oct.add_constraint(B >= 0);
+  known_oct.add_constraint(B <= 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(A >= 0);
+  box.add_constraint(2*B == 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(A >= 0);
+  known_oct.add_constraint(2*B == 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A <= 3);
+  box.add_constraint(2*B == 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(7*A <= 3);
+  known_oct.add_constraint(2*B == 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(2*B <= 0);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(7*A == 3);
+  known_oct.add_constraint(2*B >= 1);
+  known_oct.add_constraint(2*B <= 0);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+  Rational_Box box(0);
+  box.set_empty();
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(0, EMPTY);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A box from a higher dimension.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Rational_Box box(6);
+  box.add_constraint(3*A == -2);
+  box.add_constraint(4*B == -11);
+  box.add_constraint(3*D == 18);
+  box.add_constraint(7*E == 15);
+  box.add_constraint(7*F == -15);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(6);
+  known_oct.add_constraint(3*A == -2);
+  known_oct.add_constraint(4*B == -11);
+  known_oct.add_constraint(3*D == 18);
+  known_oct.add_constraint(7*E == 15);
+  known_oct.add_constraint(7*F == -15);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+// A box having a dimension with an open bound, where
+// the open bound does not make the box empty.
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Rational_Box box(2);
+  box.add_constraint(7*A == 3);
+  box.add_constraint(2*B >= 1);
+  box.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct(box);
+
+  TOctagonal_Shape known_oct(2);
+  known_oct.add_constraint(7*A == 3);
+  known_oct.add_constraint(2*B >= 1);
+  known_oct.add_constraint(B >= 1);
+
+  bool ok = (oct == known_oct);
+
+  print_constraints(oct, "*** oct(box) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromgensys1.cc b/tests/Octagonal_Shape/fromgensys1.cc
new file mode 100644
index 0000000..3ed4315
--- /dev/null
+++ b/tests/Octagonal_Shape/fromgensys1.cc
@@ -0,0 +1,271 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const Generator_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Generator_System gs;
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(closure_point(V));
+
+  try {
+    // It is illegal to build a Octagonal_Shape starting from a non-empty
+    // generator system having no points.
+    TOctagonal_Shape oct(gs);
+
+    // It is an error if the exception is not thrown.
+    return false;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    return false;
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable V(10);
+
+  Generator_System gs;
+  gs.insert(ray(V));
+
+  try {
+    // It is illegal to build a Octagonal_Shape starting from a non-empty
+    // generator system having no points.
+    TOctagonal_Shape oct(gs);
+
+    // It is an error if the exception is not thrown.
+    return false;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+    return false;
+  }
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(ray(A + B));
+  gs.insert(point(1*A + 2*B + 3*C + 4*D));
+  gs.insert(point(2*A + 3*B + 4*C + 5*D));
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 5);
+  known_result.add_constraint(A == B-1);
+  known_result.add_constraint(C == D-1);
+  known_result.add_constraint(C <= A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 2*C);
+  ph.add_constraint(C >= 3*D);
+  ph.add_constraint(D >= 4);
+  ph.add_constraint(A-D <= 50);
+
+  TOctagonal_Shape oct(ph.generators());
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C <= 30);
+  known_result.add_constraint(D >= 4);
+  known_result.add_constraint(D <= 10);
+  known_result.add_constraint(B - A <= 0);
+  known_result.add_constraint(A - D <= 50);
+  known_result.add_constraint(B - C >= 12);
+  known_result.add_constraint(C - D <= 23);
+  known_result.add_constraint(C - D >= 8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(2*A + B));
+  gs.insert(ray(-3*A + D));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(-3*A + 4));
+  gs.insert(ray(-2*D - 4));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+  known_result.add_constraint(D <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(line(2*A + B));
+  gs.insert(line(-3*A + D));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(line(2*A + 4));
+  gs.insert(line(D - 3));
+
+  TOctagonal_Shape oct(gs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B == 0);
+  known_result.add_constraint(C == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromgrid1.cc b/tests/Octagonal_Shape/fromgrid1.cc
new file mode 100644
index 0000000..4ca9147
--- /dev/null
+++ b/tests/Octagonal_Shape/fromgrid1.cc
@@ -0,0 +1,202 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x + y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 0) / 0);
+  gr.add_congruence((y - z %= 0) / 0);
+  gr.add_congruence((z %= 0) / 1);
+
+  TOctagonal_Shape oct(gr);
+
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+  known_oct.add_constraint(x + y == 0);
+  known_oct.add_constraint(y - z == 0);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+  Grid gr(2);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 3);
+  gr.add_congruence((y - z %= 2) / 5);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+  Grid gr(0);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct;
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(2, EMPTY);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x - y %= 1) / 0);
+  gr.add_congruence((y %= 0) / 0);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+  known_oct.add_constraint(x == 1);
+  known_oct.add_constraint(y == 0);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  TOctagonal_Shape oct(gr);
+
+  Octagonal_Shape<mpq_class> known_oct(0, EMPTY);
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+  Grid gr(2);
+  Constraint_System cs = gr.constraints();
+
+  TOctagonal_Shape oct(cs);
+
+  Octagonal_Shape<mpq_class> known_oct(gr.space_dimension());
+
+  bool ok = (check_result(oct, known_oct));
+
+  print_constraints(oct, "*** oct ***");
+  print_constraints(known_oct, "*** known_oct ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromoctagonalshape1.cc b/tests/Octagonal_Shape/fromoctagonalshape1.cc
new file mode 100644
index 0000000..c9754ad
--- /dev/null
+++ b/tests/Octagonal_Shape/fromoctagonalshape1.cc
@@ -0,0 +1,133 @@
+/* Test Octagonal_Shape copy construct, construction from other
+   Octagonal shapes and assignment.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape bds1(cs);
+
+  TOctagonal_Shape bds(bds1);
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(bds, known_result));
+
+  print_constraints(bds, "*** bds ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os1(cs);
+
+  TOctagonal_Shape os = os1;
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os1(cs);
+
+  TOctagonal_Shape os(1);
+  os = os1;
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** os ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 18);
+  TOctagonal_Shape os1(cs);
+
+  Octagonal_Shape<mpq_class> os(os1);
+
+  Octagonal_Shape<mpq_class> known_result(cs);
+
+  bool ok = (check_result(os, known_result));
+
+  print_constraints(os, "*** bds ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Octagonal_Shape/frompolyhedron1.cc b/tests/Octagonal_Shape/frompolyhedron1.cc
new file mode 100644
index 0000000..c036e5e
--- /dev/null
+++ b/tests/Octagonal_Shape/frompolyhedron1.cc
@@ -0,0 +1,245 @@
+/* Test Octagonal_Shape::Octagonal_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B <= 5);
+  cs.insert(A + 2*B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(3*A - 5*B <= 18);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(11*A <= 61);
+  known_result.add_constraint(2*B <= 5);
+  known_result.add_constraint(5*B >= -18);
+  known_result.add_constraint(11*A - 11*B <= 64);
+  known_result.add_constraint(11*A + 11*B <= 58);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result,
+                             "1.21e-6", "5.76e-7", "3.91e-7"));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph(0, UNIVERSE);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+//   Variable A(0);
+//   Variable B(1);
+//   Variable C(2);
+//   Variable D(3);
+
+  C_Polyhedron ph(4, UNIVERSE);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(2*A - 3*B >= 4);
+  cs.insert(Linear_Expression(-3) >= 0);
+  cs.insert(Linear_Expression(7) == 0);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 4);
+  cs.insert(-C - D >= 0);
+  cs.insert(A + B - C == 0);
+  cs.insert(-A + B - C < 4);
+  cs.insert(A - B - C + D > 1);
+  NNC_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A >= -2);
+  known_result.add_constraint(4*B <= -5);
+  known_result.add_constraint(A - B >= 4);
+  known_result.add_constraint(4*(A - C) >= 5);
+  known_result.add_constraint(B + D <= 2);
+  known_result.add_constraint(B - C <= 2);
+  known_result.add_constraint(C + D <= 0);
+
+  bool ok = (oct1 == oct2
+             && check_result(oct1, known_result));
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(2*A - 3*B >= 4);
+  cs.insert(-3*A >= 0);
+  cs.insert(B + 2 == 0);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, POLYNOMIAL_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B == -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 4);
+  cs.insert(B >= 10);
+  cs.insert(B <= 0);
+  C_Polyhedron ph(cs);
+
+  TOctagonal_Shape oct1(ph, SIMPLEX_COMPLEXITY);
+  TOctagonal_Shape oct2(ph, ANY_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (oct1 == oct2
+             && Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/fromspacedim1.cc b/tests/Octagonal_Shape/fromspacedim1.cc
new file mode 100644
index 0000000..21ba78f
--- /dev/null
+++ b/tests/Octagonal_Shape/fromspacedim1.cc
@@ -0,0 +1,123 @@
+/* Test Octagonal_Shape::Octagonal_Shape(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc(0, EMPTY);
+
+  bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc(0, UNIVERSE);
+
+  bool ok = (oc.OK() && oc.is_universe() && oc.space_dimension() == 0);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oc(4, EMPTY);
+
+  bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 4);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc(4, UNIVERSE);
+
+  bool ok = (oc.OK() && oc.is_universe() && oc.space_dimension() == 4);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(A <= -1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C <= 2);
+  oc.add_constraint(C >= 1);
+
+  bool ok = (oc.OK() && oc.is_empty() && oc.space_dimension() == 4);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(A <= 1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B <= 1);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(C <= 2);
+  oc.add_constraint(C >= 1);
+
+  bool ok = (oc.OK() && oc.space_dimension() == 3);
+
+  print_constraints(oc, "*** oc ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage1.cc b/tests/Octagonal_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..860b721
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,604 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B <= 5);
+  oct.add_constraint(A <= B);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B - A >= 2);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image"
+                    "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x >= 2);
+  oct.add_constraint(x - y <= 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(- y <= 1);
+
+  oct.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(x,"
+                         "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x >= 2);
+  oct.add_constraint(x - y <= 3);
+  oct.add_constraint(y <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 5);
+  known_result.add_constraint(x - y <= 1);
+
+  oct.generalized_affine_image(y, GREATER_OR_EQUAL, 2*x - 2, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(y, "
+                         "GREATER_OR_EQUAL, 2*x - 2, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 4);
+  oct.add_constraint(x <= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2 , EMPTY);
+
+  oct.generalized_affine_image(y, LESS_OR_EQUAL, Linear_Expression(2));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(y, "
+                         "LESS_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  //  Variable y(1);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.generalized_affine_image(x, EQUAL, Linear_Expression(6));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(x, EQUAL, 6) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A <= 3);
+
+  oct.generalized_affine_image(A, LESS_OR_EQUAL, Linear_Expression(3));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A, "
+                         "LESS_OR_EQUAL, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(B, Linear_Expression(5));
+
+  oct.generalized_affine_image(B, EQUAL, Linear_Expression(5));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, EQUAL, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(A, GREATER_OR_EQUAL, Linear_Expression(2));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A, "
+                         "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C + A <= 3);
+  known_result.add_constraint(C + B <= 3);
+
+  oct.generalized_affine_image(C, LESS_OR_EQUAL, C + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                         "LESS_OR_EQUAL, C + 1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(C, C + 1);
+
+  oct.generalized_affine_image(C, EQUAL, C + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                    "EQUAL, C+1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B - A >= -2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C + A <= 2);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= C + 3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C + A <= 2);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, C + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, C + 3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(B, C + 3);
+
+  oct.generalized_affine_image(B, EQUAL, C + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, EQUAL, C+3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B <= 4);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, B + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B + C <= -3);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, C + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, C + 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(A + B <= -3);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, A + 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B - A >= 3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(A + B >= -3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 3, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage2.cc b/tests/Octagonal_Shape/generalizedaffineimage2.cc
new file mode 100644
index 0000000..5a470e1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,357 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Linear_Expression e1(x + 2);
+  Linear_Expression e2(x - 2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= 4);
+  oct.add_constraint(x <= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(x + 2, "
+                         "LESS_OR_EQUAL, x - 2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Linear_Expression e1(6);
+  Linear_Expression e2(x - 4);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(6, "
+                    "EQUAL, x-4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(B);
+  Linear_Expression e2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, 1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(A + 5);
+  Linear_Expression e2(4);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(A, Linear_Expression(-1));
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A+5, "
+                    "EQUAL, 4) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(2);
+  Linear_Expression e2(B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(A + B == 0);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2, "
+                         "GREATER_OR_EQUAL, B) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C + 1);
+  Linear_Expression e2(A - 3);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C <= -3);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A - C >= 4);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C + 1, "
+                         "LESS_OR_EQUAL, A - 3) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(C + 1);
+  Linear_Expression e2(A + 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(C, A + 1);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(C+1, EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(B - 1);
+  Linear_Expression e2(A - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B - A >= -1);
+  known_result.add_constraint(C + A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B - 1, "
+                         "GREATER_OR_EQUAL, A - 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(-C + 3);
+  Linear_Expression e2(-B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C >= B - 1);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C - A >= -1);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-C + 3, "
+                         "LESS_OR_EQUAL, -B + 4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Linear_Expression e1(-C + 3);
+  Linear_Expression e2(-B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.add_constraint(C <= B - 1);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C + A <= 1);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B + A <= 2);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-C + 3, "
+                         "GREATER_OR_EQUAL, -B + 4) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression e1(2);
+  Linear_Expression e2(B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A + B == 0);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2, "
+                         "LESS_OR_EQUAL, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage3.cc b/tests/Octagonal_Shape/generalizedaffineimage3.cc
new file mode 100644
index 0000000..7242b2b
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage3.cc
@@ -0,0 +1,593 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x <= 4);
+  oct.add_constraint(x >= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(x >= -6);
+  known_result.add_constraint(y <= 1);
+
+  oct.generalized_affine_image(y, LESS_OR_EQUAL, -y + 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(y, "
+                         "LESS_OR_EQUAL, -y + 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x <= 4);
+  oct.add_constraint(x >= -6);
+  oct.add_constraint(y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= -7);
+  known_result.add_constraint(y == 0);
+
+  oct.generalized_affine_image(x, GREATER_OR_EQUAL, -x - 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(x, "
+                    "GREATER_OR_EQUAL, -x - 3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 2);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, 3*B + 1, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, 3*B + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B >= -1);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, B - 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Linear_Expression expr(2*A + 3);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A + B == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(2*(-A - B) <= -3);
+
+  oct.generalized_affine_image(A, GREATER_OR_EQUAL, 2*A + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A, "
+                    "GREATER_OR_EQUAL, 2*A + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(C, LESS_OR_EQUAL, 2*C + 1, 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                         "LESS_OR_EQUAL, 2*C + 1, 5) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(C, 5*C - 3, 4);
+
+  oct.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(C, "
+                    "EQUAL, 5*C - 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -1);
+  known_result.add_constraint(C + A <= 2);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, -B - 2, 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "GREATER_OR_EQUAL, -B - 2, 3) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(C + A <= 2);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, 4*A - 2*C + 3, -3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "LESS_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(B, 2*A - 4*B + C + 3, 3);
+
+  oct.generalized_affine_image(B, EQUAL, 2*A - 4*B + C + 3, 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(B, "
+                         "EQUAL, 2*A - 4*B + C + 3, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x + y >= 0);
+  oct.add_constraint(y >= 0);
+  oct.add_constraint(z <= 2);
+  oct.add_constraint(z - x >= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::generalized_affine_image(v, e, d): it is illegal
+    // to apply the method to a linear expression
+    // with the denominator equal to zero.
+    Coefficient d = 0;
+    oct.generalized_affine_image(y, LESS_OR_EQUAL, y + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    oct.generalized_affine_image(x, LESS_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to use a strict relation symbol.
+    oct.generalized_affine_image(x, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply this method to an expression having space dimension
+    // greater than the octagon's space dimension.
+    oct.generalized_affine_image(y, GREATER_OR_EQUAL, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+    // to apply this method to a variable having space dimension
+    // greater than the octagon's space dimension.
+    oct.generalized_affine_image(z, GREATER_OR_EQUAL, y);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+  oct.add_constraint(1 >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_image(lhs, r, rhs): it is illegal
+    // to use a strict relation symbol.
+    oct.generalized_affine_image(y - 3, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(C + B >= -3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, C + 3, -1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, C + 3, -1) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(B - C >= 3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, C + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, C + 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage4.cc b/tests/Octagonal_Shape/generalizedaffineimage4.cc
new file mode 100644
index 0000000..bb11643
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage4.cc
@@ -0,0 +1,381 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Linear_Expression e1(3*x + 2);
+  Linear_Expression e2(2*x - 3);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x == 4);
+  oct.add_constraint(y <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y <= 0);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(3*x + 2, "
+                         "LESS_OR_EQUAL, 2*x - 3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Linear_Expression e1(6);
+  Linear_Expression e2(3*x - 4);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y <= 7);
+  oct.add_constraint(y >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(x, Linear_Expression(10), 3);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct, "*** oct.generalized_affine_image(6, "
+                    "EQUAL, 3*x - 4) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(2*B + 3*A);
+  Linear_Expression e2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(3*A + 2*B, "
+                         "LESS_OR_EQUAL, 1) ***");
+
+   return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-2*A + 5);
+  Linear_Expression e2(-4*B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.affine_image(A, 4*B + 5, 2);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-2*A + 5, "
+                    "EQUAL, -4*B) ***");
+
+   return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(A + 2*B - 5);
+  Linear_Expression e2(3*B);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 0);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A + 2*B - 5, "
+                         "GREATER_OR_EQUAL, 3*B) ***");
+
+   return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(2*B + C + 1);
+  Linear_Expression e2(A - 3*B + 2*C);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);;
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2*B + C + 1, "
+                         "LESS_OR_EQUAL, A - 3*B + 2*C) ***");
+
+   return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(2*B + C + 1);
+  Linear_Expression e2(A - 3*B + 2*C);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(2*B + C + 1, "
+                         "GREATER_OR_EQUAL, A - 3*B + 2*C) ***");
+
+   return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-2*A - B - 1);
+  Linear_Expression e2(3*A + B + 4*C - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-2*A - B - 1, "
+                         "GREATER_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+   return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-2*C + 3);
+  Linear_Expression e2(-3*B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(A - B == 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= 1);
+
+  oct.generalized_affine_image(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(-2*C + 3, "
+                         "LESS_OR_EQUAL, -3*B + 4) ***");
+
+   return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(3);
+  Linear_Expression e2(4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <=2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(3, "
+                         "GREATER_OR_EQUAL, 4) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - 2*C + 3);
+  Linear_Expression e2(-3*B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A - 2*C + 3, "
+                         "GREATER_OR_EQUAL, -3*B + 4) ***");
+
+   return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - 2*C + 3);
+  Linear_Expression e2(-3*B + 4);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A - B == 0);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + A <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_image(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct, "*** oct.generalized_affine_image(A - 2*C + 3, "
+                         "EQUAL, -3*B + 4) ***");
+
+   return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffineimage5.cc b/tests/Octagonal_Shape/generalizedaffineimage5.cc
new file mode 100644
index 0000000..c865a08
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffineimage5.cc
@@ -0,0 +1,344 @@
+/* Test Octagonal_Shape::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*B <= 5);
+  known_result.add_constraint(4*(A + B) <= 51);
+  known_result.add_constraint(4*(C + B) <= 1);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, -2*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, -2*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(B - C <= 12);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B - A) <= 9);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, 4*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, 4*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(2*(B + C) <= -5);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, A + 2*C + 3, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, A + 2*C + 3, -2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B + A) <= 9);
+
+  oct.generalized_affine_image(B, LESS_OR_EQUAL, -4*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "LESS_OR_EQUAL, -4*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B - A) >= -3);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, 4*A - 3*C + 3, 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, 4*A - 3*C + 3, 4) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(2*(B - C) >= 5);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A + 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A + 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C <= 2);
+  oct.add_constraint(B >= -1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(C >= -2);
+  known_result.add_constraint(4*(B + A) >= -9);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, 4*A - 3*C + 3, -4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, 4*A - 3*C + 3, -4) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 21);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 21);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(2*(B + C) >= 5);
+
+  oct.generalized_affine_image(B, GREATER_OR_EQUAL, A - 2*C + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_image(B, "
+                    "GREATER_OR_EQUAL, A - 2*C + 3, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage1.cc b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..dc3c7c1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,618 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, Linear_Expression(-1));
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(4*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(-B >= 4);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -B+1);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -B+1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(4*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(4*A == 1);
+  known_result.add_constraint(B >= 4);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, B+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(7*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, 2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(7*A == 1);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = check_result(oct, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(5*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(5*A == 1);
+  known_result.add_constraint(-B >= 2);
+
+  bool ok = check_result(oct, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, 3*A-2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 3);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, 3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(B >= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+1);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(-2*B >= 5);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 14);
+  known_result.add_constraint(3*B - 3*A <= 13);
+  known_result.add_constraint(3*B - 3*C <= 7);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  // If the Coefficient type is not wide enough, do nothing.
+  if (std::numeric_limits<Coefficient>::is_bounded
+      && (std::numeric_limits<Coefficient>::min() > -203
+          || std::numeric_limits<Coefficient>::max() < 629))
+    return true;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= -203);
+  known_result.add_constraint(60*A - 60*B >= 629);
+  known_result.add_constraint(60*A + 60*B <= -589);
+  known_result.add_constraint(20*C - 20*B >= 231);
+  known_result.add_constraint(4*C + 4*B <= -35);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3);
+
+  bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(12*B >= -35);
+  known_result.add_constraint(4*A - 4*B <= 13);
+  known_result.add_constraint(4*C - 4*B <= 21);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(oct, known_result, "1.16e-5", "5.04e-6", "3.50e-6");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B <= 7);
+  oct.add_constraint(3*C <= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*B <= 35);
+  known_result.add_constraint(3*B - 3*A <= 34);
+  known_result.add_constraint(3*B - 3*C <= 28);
+  known_result.add_constraint(3*C <= 7);
+
+  bool ok = check_result(oct, known_result, "7.39e-5", "4.07e-5", "2.55e-5");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -3*A-2*B+7*C+1, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B <= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(20*B <= 27);
+  known_result.add_constraint(60*B - 60*A <= 61);
+  known_result.add_constraint(60*A + 60*B <= 101);
+  known_result.add_constraint(20*C - 20*B >= 1);
+  known_result.add_constraint(4*C + 4*B <= 11);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  bool ok = check_result(oct, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(3*A == 1);
+  oct.add_constraint(2*B >= 7);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(3*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, 3*A-2*B-7*C+1, -3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B >= 5);
+  oct.add_constraint(3*C <= 7);
+  oct.add_constraint(5*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A == 1);
+  known_result.add_constraint(3*C <= 7);
+  known_result.add_constraint(5*C >= 7);
+
+  oct.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  bool ok = check_result(oct, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A == 1);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, Linear_Expression(-1));
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(2*A == 1);
+  oct.add_constraint(B <= 5);
+  oct.add_constraint(3*C <= 8);
+  oct.add_constraint(2*C >= 7);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oct.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "EQUAL, 3*A+2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 2);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B, 5);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B, 5) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 2);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 3, 2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 5);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 3, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage2.cc b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..e9ee9f1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,620 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x + y >= 0);
+  oct.add_constraint(y >= 0);
+  oct.add_constraint(z <= 2);
+  oct.add_constraint(z - x >= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, e, d):
+    // it is illegal to apply the method with denominator equal to zero.
+    Coefficient d = 0;
+    oct.generalized_affine_preimage(y, LESS_OR_EQUAL, y + 1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to use a strict relation symbol.
+    oct.generalized_affine_preimage(x, LESS_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to use a strict relation symbol.
+    oct.generalized_affine_preimage(x, GREATER_THAN, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to apply the method to an expression having
+    // space dimension greater than the octagon's space dimension.
+    oct.generalized_affine_preimage(y, GREATER_OR_EQUAL, z);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to use a variable in the 'expr' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+  }
+  catch (...) {
+    return false;
+  }
+  return true;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(v, r, expr, d):
+    // it is illegal to apply the method to a variable having space dimension
+    // greater than the octagon's space dimension.
+    oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B - A);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 4);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(2*B >= 3);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, -B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, -B + 3, 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, -B + 3, 5) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(2);
+  Linear_Expression e2(-B + 3);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B == 1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(2, "
+                    "GREATER_OR_EQUAL, -B + 3) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-3);
+  Linear_Expression e2(B + 12);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B >= -15);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(B - A >= 2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-3, "
+                    "LESS_OR_EQUAL, B + 12) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-3);
+  Linear_Expression e2(B + 12);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B == -15);
+  known_result.add_constraint(B - A >= 2);
+  known_result.add_constraint(B + A <= 0);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-3, "
+                    "EQUAL, B + 12) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(A - 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.generalized_affine_preimage(A, GREATER_OR_EQUAL, e2 + 1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - 1, "
+                    "GREATER_OR_EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-A - 1);
+  Linear_Expression e2(2*C + B - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B - A <= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(C + B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.generalized_affine_preimage(A, GREATER_OR_EQUAL,
+                                           2*C + B - 1, -1);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-A - 1, "
+                    "LESS_OR_EQUAL, 2*C + B - 2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(-A - 1);
+  Linear_Expression e2(D - 3*C - B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B + A <= 2);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(B - D >= 1);
+  oct.add_constraint(C <= 1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(oct);
+  known_result.generalized_affine_preimage(A, EQUAL, D - 3*C - B - 1, -1);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-A - 1, "
+                    "EQUAL, D - 3*C - B - 2) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(B - A - 1);
+  Linear_Expression e2(3*C - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B + A <= 2);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(C <= 1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(C >= -2);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A - 1, "
+                    "GREATER_OR_EQUAL, 3*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(B - A - 1);
+  Linear_Expression e2(B + 3*C - 2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B + A <= 2);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(C <= 1);
+  oct.add_constraint(C >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 1);
+  known_result.add_constraint(C >= -2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A - 1, "
+                    "LESS_OR_EQUAL, B + 3*C - 2) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(A);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(B <= 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 3);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A, "
+                    "GREATER_OR_EQUAL, A) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(B - A);
+  Linear_Expression e2(B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B <= 3);
+  oct.add_constraint(C <= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(C <= -1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B - A, "
+                    "GREATER_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(-C + B - 2);
+  Linear_Expression e2(B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B <= 3);
+  oct.add_constraint(C >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-C + B - 2, "
+                    "LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage3.cc b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc
new file mode 100644
index 0000000..410b6e9
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage3.cc
@@ -0,0 +1,618 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - C + B - 2);
+  Linear_Expression e2(A + B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(B <= 3);
+  oct.add_constraint(C >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - C + B - 2, "
+                    "LESS_OR_EQUAL, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_preimage(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the octagon.
+    oct.generalized_affine_preimage(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(C + B >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::generalized_affine_preimage(lhs, r, rhs):
+    // it is illegal to use a strict relation symbol.
+    oct.generalized_affine_preimage(B + C, LESS_THAN, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(2*A + 3*B - 1);
+  Linear_Expression e2(B - 1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -4);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(2*A + 3*B - 1, "
+                    "LESS_OR_EQUAL, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(A + B);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(A + B <= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + B, "
+                    "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A + B - 2*C + 2);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + B - 2*C + 2, "
+                    "LESS_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(A - B + 2);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= -1);
+  oct.add_constraint(D >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(C <= -1);
+  known_result.add_constraint(D >= 2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - B + 2, "
+                    "LESS_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(C - D - 5);
+  Linear_Expression e2(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= -1);
+  oct.add_constraint(D >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4, EMPTY);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C - D - 5, "
+                    "GREATER_OR_EQUAL, 3) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(C - D - 5);
+  Linear_Expression e2(-11);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= -1);
+  oct.add_constraint(D >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C - D - 5, "
+                    "GREATER_OR_EQUAL, -11) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-5);
+  Linear_Expression e2(-1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-5, "
+                    "GREATER_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-5);
+  Linear_Expression e2(-1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-5, "
+                    "LESS_OR_EQUAL, -1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= -4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, 2*B + 3, 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, 2*B + 3, 2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -5);
+  known_result.add_constraint(A <= 10);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(4*B <= 5);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, 2*B + 3, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, 2*B + 3, -2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -6);
+  known_result.add_constraint(A <= 5);
+
+  oct.generalized_affine_preimage(B, LESS_OR_EQUAL, -A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "LESS_OR_EQUAL, -A + 3) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A >= -6);
+  known_result.add_constraint(A <= 10);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, A + 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, A + 3) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, 2*B + 3, -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, 2*B + 3, -2) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(2*A >= -1);
+  known_result.add_constraint(A <= 10);
+
+  oct.generalized_affine_preimage(B, GREATER_OR_EQUAL, -A + 3);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(B, "
+                    "GREATER_OR_EQUAL, -A + 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/generalizedaffinepreimage4.cc b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc
new file mode 100644
index 0000000..0078fd1
--- /dev/null
+++ b/tests/Octagonal_Shape/generalizedaffinepreimage4.cc
@@ -0,0 +1,638 @@
+/* Test Octagonal_Shape::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 3*C + 2, 5);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 3*C + 2, 5) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+  oct.add_constraint(C >= -12);
+  oct.add_constraint(C - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(C >= -12);
+  known_result.add_constraint(C <= 14);
+
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B - 3*C + 2, 5);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B - 3*C + 2, 5) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C >= -31);
+  known_result.add_constraint(2*(B - C) <= 27);
+  known_result.add_constraint(2*(B + C) >= -35);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B + 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B + 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -31);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B - A) <= 27);
+  known_result.add_constraint(2*(B + A) >= -35);
+
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, B + 2*A + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C <= 31);
+  known_result.add_constraint(2*(C - B) <= 35);
+  known_result.add_constraint(2*(B + C) <= 27);
+
+  oct.generalized_affine_preimage(A, LESS_OR_EQUAL, B - 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "LESS_OR_EQUAL, B - 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A <= 9);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) <= 27);
+  known_result.add_constraint(2*(B + A) <= 5);
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A <= 19);
+  known_result.add_constraint(2*(A - B) <= 23);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(B <= -2);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -23);
+  known_result.add_constraint(2*(B - A) <= 19);
+  known_result.add_constraint(B <= -2);
+
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C <= 9);
+  known_result.add_constraint(2*(C - B) <= 13);
+  known_result.add_constraint(2*(B + C) <= 5);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B + 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B + 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A <= 17);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(A - B) <= 21);
+  known_result.add_constraint(2*(B + A) <= 45);
+
+
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, 2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, B + 2*A + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 10);
+  oct.add_constraint(A >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(2*C >= -17);
+  known_result.add_constraint(2*(B - C) <= 45);
+  known_result.add_constraint(2*(B + C) >= -21);
+
+  oct.generalized_affine_preimage(A, GREATER_OR_EQUAL, B - 2*C + 5, 2);
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A, "
+                    "GREATER_OR_EQUAL, B - 2*C + 5, 2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(2*A >= -39);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  known_result.add_constraint(2*(B - A) <= 67);
+  known_result.add_constraint(2*(B + A) >= -43);
+
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, B + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, B + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+  oct.generalized_affine_preimage(C, GREATER_OR_EQUAL, D + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "GREATER_OR_EQUAL, D + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(C <= 10);
+  oct.add_constraint(C >= -11);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - C <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 14);
+  known_result.add_constraint(B >= -2);
+
+  oct.generalized_affine_preimage(C, LESS_OR_EQUAL, D + 2*A + 5, -2);
+
+  bool ok = check_result(oct, known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(C, "
+                    "LESS_OR_EQUAL, D + 2*A + 5, -2) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Linear_Expression e1(A - C + B - 2);
+  Linear_Expression e2(A + B + 1);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B >= -2);
+  oct.add_constraint(B - A <= -4);
+  oct.add_constraint(B - C <= -4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oct.generalized_affine_preimage(e1, LESS_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A - C + B - 2, "
+                    "LESS_OR_EQUAL, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1(-B + 3);
+  Linear_Expression e2(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= -1);
+
+  oct.generalized_affine_preimage(e1, GREATER_OR_EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(-B + 3, "
+                    "GREATER_OR_EQUAL, 2) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(A + 2*C - 3*D + 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B - D >= 2);
+  oct.add_constraint(C + A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 1);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + 2*C - 3*D + 1, "
+                    "EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(3*D + 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B - D >= 2);
+  oct.add_constraint(C + A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(B - A >= 2);
+  known_result.add_constraint(C + A <= 1);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(3*D + 1, "
+                    "EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Linear_Expression e1(A + 2*B - 3*D + 1);
+  Linear_Expression e2(B - 2);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(B - A >= 2);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B - D >= 2);
+  oct.add_constraint(C + A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Octagonal_Shape<mpq_class> known_result(4);
+
+  oct.generalized_affine_preimage(e1, EQUAL, e2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct) == known_result);
+
+  print_constraints(oct,
+                    "*** oct.generalized_affine_preimage(A + 2*B - 3*D + 1, "
+                    "EQUAL, B - 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Octagonal_Shape/integerupperboundifexact1.cc b/tests/Octagonal_Shape/integerupperboundifexact1.cc
new file mode 100644
index 0000000..e0c8a8f
--- /dev/null
+++ b/tests/Octagonal_Shape/integerupperboundifexact1.cc
@@ -0,0 +1,462 @@
+/* Test Octagonal_Shape::integer_upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Octagonal_Shape<mpz_class> oct_empty(0, EMPTY);
+  Octagonal_Shape<mpz_class> oct_universe(0, UNIVERSE);
+
+  // Testing all combinations for 0-dim polyhedra.
+  bool ok = true;
+  Octagonal_Shape<mpz_class> oct;
+
+  // empty, empty
+  oct = oct_empty;
+  ok &= oct.integer_upper_bound_assign_if_exact(oct_empty);
+  ok &= (oct == oct_empty);
+  print_constraints(oct, "*** empty union empty ***");
+
+  // empty, universe
+  oct = oct_empty;
+  ok &= oct.integer_upper_bound_assign_if_exact(oct_universe);
+  ok &= (oct == oct_universe);
+  print_constraints(oct, "*** empty union universe ***");
+
+  // universe, empty
+  oct = oct_universe;
+  ok &= oct.integer_upper_bound_assign_if_exact(oct_empty);
+  ok &= (oct == oct_universe);
+  print_constraints(oct, "*** universe union empty ***");
+
+  // universe, universe
+  oct = oct_universe;
+  ok &= oct.integer_upper_bound_assign_if_exact(oct_universe);
+  ok &= (oct == oct_universe);
+  print_constraints(oct, "*** universe union universe ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= -2);
+  oct1.add_constraint(x <= -1);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 1);
+  oct2.add_constraint(x <= 2);
+  oct2.add_constraint(y >= 0);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(oct1);
+
+  bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= -2);
+  oct1.add_constraint(x <= 0);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(x <= 2);
+  oct2.add_constraint(y >= 0);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x == 0);
+  oct1.add_constraint(y == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(x <= 2);
+  oct2.add_constraint(y >= -2);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(oct2);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(y == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(y >= 2);
+  oct2.add_constraint(y <= 4);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(oct1);
+
+  bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x == y);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x == 0);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(oct1);
+
+  bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= y);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(oct1);
+
+  bool ok = !oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= y);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x <= y);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Octagonal_Shape<mpz_class> oct(3, UNIVERSE);
+  oct.add_constraint(x >= 0);
+  oct.add_constraint(x <= 2);
+  oct.add_constraint(y >= 0);
+  oct.add_constraint(y <= 4);
+  oct.add_constraint(z >= 0);
+  oct.add_constraint(z <= 4);
+  oct.add_constraint(x - y <= 2);
+  oct.add_constraint(z - y <= 2);
+
+  Octagonal_Shape<mpz_class> oct1(oct);
+  oct1.add_constraint(z <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(oct);
+  oct2.add_constraint(x - y <= 1);
+
+  Octagonal_Shape<mpz_class> known_result(oct);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+
+  ok &= (oct1 == oct);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Octagonal_Shape<mpz_class> oct(4, UNIVERSE);
+  oct.add_constraint(x - y <= 4);
+  oct.add_constraint(z - w <= 4);
+  oct.add_constraint(x - w <= 5);
+  oct.add_constraint(z <= 0);
+  oct.add_constraint(z - y <= 1);
+  oct.add_constraint(y + w >= -1);
+
+  Octagonal_Shape<mpz_class> oct1(oct);
+  oct1.add_constraint(x - y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Octagonal_Shape<mpz_class> oct2(oct);
+  oct2.add_constraint(z - w <= 2);
+
+  Octagonal_Shape<mpz_class> known_result(oct);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == oct);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  //  const dimension_type dim = 200;
+  const dimension_type dim = 50;
+  Constraint_System cs;
+  for (dimension_type i = 1; i < dim; ++i) {
+    Variable x(i);
+    cs.insert(x >= 0);
+    cs.insert(x <= 4);
+  }
+
+  Variable x(0);
+
+  Octagonal_Shape<mpz_class> hypercube1(cs);
+  hypercube1.add_constraint(x >= 0);
+  hypercube1.add_constraint(x <= 4);
+
+  Octagonal_Shape<mpz_class> hypercube2(cs);
+  hypercube2.add_constraint(x >= 2);
+  hypercube2.add_constraint(x <= 6);
+
+  Octagonal_Shape<mpz_class> known_result(cs);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = hypercube1.integer_upper_bound_assign_if_exact(hypercube2);
+
+  ok &= (hypercube1 == known_result);
+
+  print_constraints(hypercube1, "*** hyp1 ***");
+  print_constraints(hypercube2, "*** hyp2 ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 3);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+  oct1.add_constraint(x - y <= 2);
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 3);
+  oct2.add_constraint(x <= 6);
+  oct2.add_constraint(y >= 0);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2)
+    && (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+/*
+  The following test shows that method
+  Octagonal_Shape<T>::integer_upper_bound_assign_if_exact
+  is not an upper bound operator (on the domain of rational shapes).
+*/
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x + y <= 2);
+  oct1.add_constraint(x - y <= 2);
+  oct1.add_constraint(x + y >= 1);
+  oct1.add_constraint(x - y >= 1);
+
+  Octagonal_Shape<mpz_class> oct2(oct1);
+  oct2.affine_image(x, x + 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y == 0);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2)
+    && (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Octagonal_Shape/intersection1.cc b/tests/Octagonal_Shape/intersection1.cc
new file mode 100644
index 0000000..57eff5e
--- /dev/null
+++ b/tests/Octagonal_Shape/intersection1.cc
@@ -0,0 +1,309 @@
+/* Test Octagonal_Shape::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x - y <= 4);
+  oc1.add_constraint(x + y <= 6);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(-y <= -2);
+  oc2.add_constraint(x - y <= 5);
+  oc2.add_constraint(x + y <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x <= 3);
+  known_result.add_constraint(-y <= -2);
+  known_result.add_constraint(x - y <= 4);
+  known_result.add_constraint(x + y <= 6);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 2);
+  oc1.add_constraint(A - B <= -1);
+  oc1.add_constraint(A + B <= 10);
+  oc1.add_constraint(A + C <= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(C <= 2);
+  oc2.add_constraint(A - B <= 5);
+  oc2.add_constraint(A - C <= 5);
+  oc2.add_constraint(A + B <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(A - B <= -1);
+  known_result.add_constraint(A + B <= 7);
+  known_result.add_constraint(A - C <= 5);
+  known_result.add_constraint(A + C <= 1);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 5);
+  oc1.add_constraint(A - B <= -1);
+  oc1.add_constraint(A + B <= -1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(C <= 2);
+  oc2.add_constraint(A - B <= 4);
+  oc2.add_constraint(A + B <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(A - B <= -1);
+  known_result.add_constraint(A + B <= -1);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 5);
+  oc1.add_constraint(A - B <= -1);
+  oc1.add_constraint(A - B >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(A - B <= 4);
+  oc2.add_constraint(A + B <= 7);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape oc1(0, EMPTY);
+  TOctagonal_Shape oc2;
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oc1;
+  TOctagonal_Shape oc2;
+
+  print_constraints(oc1, "*** oc1 ***");
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= y);
+
+  TOctagonal_Shape oc2(3);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::intersection_assign(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.intersection_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  // Variable C(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(A <= 5);
+  oc1.add_constraint(A + B <= 1);
+  oc1.add_constraint(A + B >= -1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3, EMPTY);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oc1.intersection_assign(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(A - B <= -1);
+  cs.insert(A + B <= -1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraints(cs);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(C <= 2);
+  oc2.add_constraint(A - B <= -2);
+  oc2.add_constraint(A + B <= -3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.intersection_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= -1);
+  known_result.add_constraint(C <= 2);
+  known_result.add_constraint(A - B <= -2);
+  known_result.add_constraint(A + B <= -3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.intersection_assign(oc2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..a9a57b3
--- /dev/null
+++ b/tests/Octagonal_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,340 @@
+/* Test Octagonal_Shape::limited_BHMZ05_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+
+  TOctagonal_Shape oct1(cs1);
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 1);
+  cs2.insert(y >= 0);
+  cs2.insert(y - x <= 0);
+
+  TOctagonal_Shape oct2(cs2);
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(y <= -1);
+  cs.insert(x <= 5);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct2.limited_BHMZ05_extrapolation_assign(oct1, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y - x <= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct2) == known_result);
+
+  print_constraints(oct2,
+                    "*** oct2.limited_BHMZ05_extrapolation_assign(oct1) ***");
+
+   return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  TOctagonal_Shape oct1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  TOctagonal_Shape oct2(cs2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oct1(0, EMPTY);
+  TOctagonal_Shape oct2(0, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A + B <= 0);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A - B <= 1);
+
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A - B <= 2);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+
+  TOctagonal_Shape oct1(7);
+  oct1.add_constraint(A - B <= 1);
+  oct1.add_constraint(A - C <= 2);
+  oct1.add_constraint(C - B <= 2);
+  oct1.add_constraint(D - E == 0);
+  oct1.add_constraint(G + F == 0);
+
+  TOctagonal_Shape oct2(7);
+  oct2.add_constraint(A - B <= 0);
+  oct2.add_constraint(A - C <= 1);
+  oct2.add_constraint(C - B <= 2);
+  oct2.add_constraint(D - E == 0);
+  oct2.add_constraint(G + F == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(C - B <= 2);
+  cs.insert(D - E == 0);
+  cs.insert(F + G == 0);
+
+  oct1.limited_BHMZ05_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(7);
+  known_result.add_constraint(C - B <= 2);
+  known_result.add_constraint(D - E == 0);
+  known_result.add_constraint(F + G == 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_BHMZ05_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable y(1);
+
+  TOctagonal_Shape oc1(1);
+  TOctagonal_Shape oc2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_BHMZ05_extrapolation_assign(oc, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // has a strict-inequality.
+    oc2.limited_BHMZ05_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/limitedcc76extrapolation1.cc b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..2880e84
--- /dev/null
+++ b/tests/Octagonal_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,661 @@
+/* Test Octagonal_Shape::limited_CC76_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 4);
+  TOctagonal_Shape oct1(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  cs2.insert(y >= 5);
+  TOctagonal_Shape oct2(cs2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 20);
+  cs.insert(y >= 3);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 3);
+  known_result.add_constraint(y - x >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct1(0);
+  TOctagonal_Shape oct2(0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A == -2);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == -2);
+  oct2.add_constraint(B == 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A == -2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A == -2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A <= 5);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A + B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(B >= 1);
+  known_result.add_constraint(A - B <= 6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(A >= 5);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(A >= 3);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(A >= 3);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  TOctagonal_Shape oct1(4);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B <= 6);
+  oct1.add_constraint(C - D == 5);
+
+  TOctagonal_Shape oct2(4);
+  oct2.add_constraint(A <= 4);
+  oct2.add_constraint(C - D == 5);
+  oct2.add_constraint(B <= 5);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A == 4);
+  cs.insert(C - D == 5);
+  cs.insert(A - B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(C - D == 5);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 4);
+  oct1.add_constraint(B >= 1);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= -2);
+  oct2.add_constraint(A >= 3);
+  oct2.add_constraint(B >= 4);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A - 2*B <= 6);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(A <= 4);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A <= 2);
+  oct1.add_constraint(A >= 3);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A <= 1);
+  oct2.add_constraint(B == -1);
+  oct2.add_constraint(A >= 4);
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(C <= 4);
+  oct1.add_constraint(B >= 2);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(C <= 3);
+  oct2.add_constraint(B >= 3);
+  oct2.add_constraint(A <= 3);
+  oct2.add_constraint(A >= 5);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(C <= 2);
+
+  print_constraints(cs, "*** cs ***");
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(C <= 4);
+  known_result.add_constraint(B >= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+   return ok;
+}
+
+bool
+test14() {
+  Variable y(1);
+
+  TOctagonal_Shape oc1(1);
+  TOctagonal_Shape oc2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_CC76_extrapolation_assign(oc2, cs): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oc2.limited_CC76_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_CC76_extrapolation_assign(oc, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    oc2.limited_CC76_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x - y >= 0);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(x <= 2);
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x - y >= 0);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(x < 5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+    // illegal to apply this method to a system of constraints that
+    // has a strict-inequality.
+    oc2.limited_CC76_extrapolation_assign(oc1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3, EMPTY);
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A + B <= 0);
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A - B <= 1);
+
+  TOctagonal_Shape oct2(3, EMPTY);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Constraint_System cs;
+  cs.insert(A - B <= 2);
+
+  oct1.limited_CC76_extrapolation_assign(oct2, cs);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(A - B <= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.limited_CC76_extrapolation_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/mapspacedims1.cc b/tests/Octagonal_Shape/mapspacedims1.cc
new file mode 100644
index 0000000..bb92cc1
--- /dev/null
+++ b/tests/Octagonal_Shape/mapspacedims1.cc
@@ -0,0 +1,255 @@
+/* Test Octagonal_Shape::map_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  TOctagonal_Shape oc1(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  TOctagonal_Shape oc1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  TOctagonal_Shape oc1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x == 1);
+  known_result.add_constraint(y - x <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 0);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 3);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 2);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(1);
+  known_result.add_constraint(x <= 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(z - y <= 7);
+  cs.insert(y - x <= 1);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+  known_result.add_constraint(y - x <= 7);
+  known_result.add_constraint(x + y <= 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Partial_Function function;
+
+  TOctagonal_Shape oc1;
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  oc1.map_space_dimensions(function);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function function;
+  function.insert(2, 1);
+  function.insert(1, 0);
+  function.insert(0, 2);
+
+  Constraint_System cs;
+  cs.insert(x == 1);
+  cs.insert(z - x <= 1);
+  cs.insert(y - z <= -3);
+  cs.insert(x - y <= 1);
+
+  TOctagonal_Shape oc1(cs);
+
+  print_function(function, "*** function ***");
+  print_constraints(oc1, "*** oc1 ***");
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  oc1.map_space_dimensions(function);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Octagonal_Shape/max_min1.cc b/tests/Octagonal_Shape/max_min1.cc
new file mode 100644
index 0000000..a5270d4
--- /dev/null
+++ b/tests/Octagonal_Shape/max_min1.cc
@@ -0,0 +1,691 @@
+/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...)
+   and Octagonal_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(-x1-x2 >= -5);
+  oct.add_constraint(x1-x2 >= -5);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x1-2*x2, num, den, included)
+    && num == 5 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x1-2*x2, num, den, included)
+    && num == -10 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(-x1-x2 >= -5);
+  oct.add_constraint(x1-x2 >= -5);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x1-x2, num, den, included)
+    && num == 5 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x1-x2, num, den, included)
+    && num == -5 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(-x1 - x2 >= -10);
+  oct.add_constraint(-10*x1 - 10*x3 >= -60);
+  oct.add_constraint(x1 + x3 >= -150);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+  oct.add_constraint(x3 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-10*x1-6*x2-4*x3+4, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-10*x1-6*x2-4*x3+4, num, den, included)
+    && num == -80 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(-x1 - x2 >= -10);
+  oct.add_constraint(-10*x1 - 10*x3 >= -60);
+  oct.add_constraint(x1 + x3 >= -150);
+  oct.add_constraint(x1 >= 0);
+  oct.add_constraint(x2 >= 0);
+  oct.add_constraint(x3 >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x2-x3+5, num, den, included)
+    && num == 15 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x2-x3+5, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x1 - x2 <= 6);
+  oct.add_constraint(x1 + x2 <= 4);
+  oct.add_constraint(x1 >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(x1-2, num, den, included)
+    && num == 3 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(x1-2, num, den, included)
+    && num == -1 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x1(0);
+
+  TOctagonal_Shape oct(1, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = !oct.maximize(x1-2, num, den, included);
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(x1-2, num, den, included);
+
+  return ok;
+}
+
+bool
+test07() {
+
+  TOctagonal_Shape oct(0, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = !oct.maximize(Linear_Expression(2), num, den, included);
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(Linear_Expression(2), num, den, included);
+
+  return ok;
+}
+
+bool
+test08() {
+
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(Linear_Expression(2), num, den, included)
+    && num == 2 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(Linear_Expression(2), num, den, included);
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x1 <= x2 + 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Linear_Expression LE(x3);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::maximize(LE, num, den, included): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.minimize(LE, num, den, included);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B);
+  bool ok = !oct.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 2 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A - B);
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C);
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B - C <= 0);
+  oct.add_constraint(E - D <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + B - C + 2*E - 2*D);
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape oct(5);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B - C >= 0);
+  oct.add_constraint(E - D >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(Linear_Expression(3));
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 3 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x >= y);
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(z);
+
+  try {
+    // This is an incorrect use of the method
+    // Octagonal_Shape::minimize(LE, num, den, included, g): it is illegal
+    // to apply it to an expression whose space dimension is
+    // greater than the space dimension of the OS.
+    oct.minimize(LE, num, den, included, g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+
+  Octagonal_Shape<mpq_class> oct(1);
+  oct.add_constraint(5*A <= 2);
+  oct.add_constraint(5*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(3*A, num, den, included)
+    && num == 6 && den == 5 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(3*A, num, den, included)
+    && num == 3 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  Octagonal_Shape<mpq_class> oct(1);
+  oct.add_constraint(5*A <= 2);
+  oct.add_constraint(3*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-7*A, num, den, included)
+    && num == -7 && den == 3 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-7*A, num, den, included)
+    && num == -14 && den == 5 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Octagonal_Shape/max_min2.cc b/tests/Octagonal_Shape/max_min2.cc
new file mode 100644
index 0000000..627bf06
--- /dev/null
+++ b/tests/Octagonal_Shape/max_min2.cc
@@ -0,0 +1,311 @@
+/* Test Octagonal_Shape::maximize(const Linear_Expression&, ...)
+   and Octagonal_Shape::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-5*A - 1, num, den, included)
+    && num == 4 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-5*A - 1, num, den, included)
+    && num == -6 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(-5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(-5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= -1);
+  oct.add_constraint(A <= 1);
+  oct.add_constraint(B <= 1);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  bool ok = oct.maximize(5*A + 1, num, den, included)
+    && num == 6 && den == 1 && included;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(5*A + 1, num, den, included)
+    && num == -4 && den == 1 && included;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+  bool ok = !oct.maximize(LE, num, den, included, g);
+
+  if (!ok)
+    return false;
+
+  ok = oct.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A);
+
+  bool ok = oct.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = !oct.minimize(LE, num, den, included, g);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(2*A >= 1);
+  oct.add_constraint(B >= 1);
+  oct.add_constraint(2*A <= 3);
+  oct.add_constraint(B <= 4);
+
+  print_constraints(oct, "*** oct ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE(A + 4*B - 1);
+
+  bool ok_max = oct.maximize(LE, num, den, included, g)
+    && num == 33 && den == 2 && included
+    && g.is_point()
+    && g.coefficient(A) == 3 && g.coefficient(B) == 8
+    && g.divisor() == 2;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  bool ok_min = oct.minimize(LE, num, den, included, g)
+    && num == 7 && den == 2 && included
+    && g.is_point()
+    && g.coefficient(A) == 1 && g.coefficient(B) == 2
+    && g.divisor() == 2;
+
+  nout << (included ? "minimum" : "infinum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok_max && ok_min;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Octagonal_Shape/maxspacedim1.cc b/tests/Octagonal_Shape/maxspacedim1.cc
new file mode 100644
index 0000000..1bfc423
--- /dev/null
+++ b/tests/Octagonal_Shape/maxspacedim1.cc
@@ -0,0 +1,99 @@
+/* Test Octagonal_Shape::max_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  nout << Octagonal_Shape<signed char>::max_space_dimension()
+       << " (signed char)"
+       << endl
+       << Octagonal_Shape<short>::max_space_dimension() << " (short)"
+       << endl
+       << Octagonal_Shape<int>::max_space_dimension() << " (int)"
+       << endl
+       << Octagonal_Shape<long>::max_space_dimension() << " (long)"
+       << endl
+       << Octagonal_Shape<long long>::max_space_dimension() << " (long long)"
+       << endl
+#if PPL_SUPPORTED_FLOAT
+       << Octagonal_Shape<float>::max_space_dimension() << " (float)"
+       << endl
+#endif
+#if PPL_SUPPORTED_DOUBLE
+       << Octagonal_Shape<double>::max_space_dimension() << " (double)"
+       << endl
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+       << Octagonal_Shape<long double>::max_space_dimension()
+       << " (long double)"
+       << endl
+#endif
+       << Octagonal_Shape<mpz_class>::max_space_dimension() << " (mpz_class)"
+       << endl
+       << Octagonal_Shape<mpq_class>::max_space_dimension() << " (mpq_class)"
+       << endl;
+
+  if (Octagonal_Shape<signed char>::max_space_dimension()
+      < Octagonal_Shape<short>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<short>::max_space_dimension()
+      < Octagonal_Shape<int>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<int>::max_space_dimension()
+      < Octagonal_Shape<long>::max_space_dimension())
+    return false;
+
+  if (Octagonal_Shape<long>::max_space_dimension()
+      < Octagonal_Shape<long long>::max_space_dimension())
+    return false;
+
+#if PPL_SUPPORTED_FLOAT && PPL_SUPPORTED_DOUBLE
+  if (Octagonal_Shape<float>::max_space_dimension()
+      < Octagonal_Shape<double>::max_space_dimension())
+    return false;
+#endif
+
+#if PPL_SUPPORTED_DOUBLE && PPL_SUPPORTED_LONG_DOUBLE
+  if (Octagonal_Shape<double>::max_space_dimension()
+      < Octagonal_Shape<long double>::max_space_dimension())
+    return false;
+#endif
+
+  if (2*Octagonal_Shape<mpz_class>::max_space_dimension()
+      < Octagonal_Shape<mpq_class>::max_space_dimension())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/membytes1.cc b/tests/Octagonal_Shape/membytes1.cc
new file mode 100644
index 0000000..a6482cb
--- /dev/null
+++ b/tests/Octagonal_Shape/membytes1.cc
@@ -0,0 +1,233 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(TOctagonal_Shape& oct, const Constraint& c) {
+  const memory_size_type oct_memory_before = oct.total_memory_in_bytes();
+  const memory_size_type c_memory = c.total_memory_in_bytes();
+  oct.add_constraint(c);
+  const memory_size_type oct_memory_after = oct.total_memory_in_bytes();
+
+  nout << oct_memory_before
+       << " + " << c_memory
+       << " -> " << oct_memory_after
+       << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  using namespace test01_namespace;
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 2*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 4*z;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding constraints to an octagon ***" << endl;
+
+  TOctagonal_Shape oct(3);
+  add_constraint(oct, 4*x - 4*y + 14 >= 0);
+  add_constraint(oct, 4*x + 4*y + 2 >= 0);
+  add_constraint(oct, x + y - 1 >= 0);
+
+  add_constraint(oct, x + 1 >= 0);
+  add_constraint(oct, x + z - 1 >= 0);
+  add_constraint(oct, 2*x -2*z + 7 >= 0);
+  add_constraint(oct, x - y + 1 >= 0);
+
+  add_constraint(oct, x - y + 5 <= 0);
+  add_constraint(oct, 2*x - 2*z + 13 <= 0);
+  add_constraint(oct, -2*x + 2*z + 1 <= 0);
+  add_constraint(oct, -x + y - 1 <= 0);
+
+  add_constraint(oct, -x + y + 7 >= 0);
+  add_constraint(oct, -4*x + 4*y - 4 >= 0);
+  add_constraint(oct, -2*x + 2*z - 5 <= 0);
+  add_constraint(oct, -x + 1 >= 0);
+
+  add_constraint(oct, -x - z + 5 <= 0);
+  add_constraint(oct, -x - y + 5 <= 0);
+  add_constraint(oct, -x - y +13 <= 0);
+
+  const memory_size_type oct_total_size = oct.total_memory_in_bytes();
+  const memory_size_type oct_external_size = oct.external_memory_in_bytes();
+  const Constraint_System& cs = oct.constraints();
+  const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+  const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+
+  nout << endl;
+
+  nout << "*** Size of the user-visible octagons components ***"
+       << endl
+       << "oct.total_memory_in_bytes() = " << oct_total_size
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl
+       << "oct.external_memory_in_bytes() = " << oct_external_size
+       << endl
+       << "cs.external_memory_in_bytes() = " << cs_external_size
+       << endl << endl;
+
+  nout << "*** Size of a constraint system vs size of contained constraints"
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl;
+
+  memory_size_type cs_elements_size = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained constraints = " << cs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(4*x - 4*y + 14 >= 0);
+  oct.add_constraint(4*x + 4*y + 2 <= 0);
+  oct.add_constraint(x + y - 1 >= 0);
+  oct.add_constraint(x + y - 5 <= 0);
+
+  const memory_size_type oct_total_size = oct.total_memory_in_bytes();
+  const memory_size_type oct_external_size = oct.external_memory_in_bytes();
+
+  Determinate<TOctagonal_Shape> doct(oct);
+
+  const memory_size_type doct_total_size = doct.total_memory_in_bytes();
+  const memory_size_type doct_external_size = doct.external_memory_in_bytes();
+
+  nout << "oct.total_memory_in_bytes() = " << oct_total_size
+       << endl
+       << "oct.external_memory_in_bytes() = " << oct_external_size
+       << endl
+       << "doct.total_memory_in_bytes() = " << doct_total_size
+       << endl
+       << "doct.external_memory_in_bytes() = " << doct_external_size
+       << endl;
+
+  Pointset_Powerset<TOctagonal_Shape> poct(oct);
+
+  TOctagonal_Shape qoct(3);
+  qoct.add_constraint(x >= 0);
+  qoct.add_constraint(y >= 0);
+  qoct.add_constraint(z >= 0);
+  qoct.add_constraint(x <= 1);
+  qoct.add_constraint(y <= 1);
+  qoct.add_constraint(z <= 1);
+  Pointset_Powerset<TOctagonal_Shape> pqoct(qoct);
+
+  Pointset_Powerset<TOctagonal_Shape> proct = pqoct;
+  proct.difference_assign(poct);
+
+  const memory_size_type poct_total_size = poct.total_memory_in_bytes();
+  const memory_size_type poct_external_size = poct.external_memory_in_bytes();
+  const memory_size_type pqoct_total_size = pqoct.total_memory_in_bytes();
+  const memory_size_type pqoct_external_size = pqoct.external_memory_in_bytes();
+  const memory_size_type proct_total_size = proct.total_memory_in_bytes();
+  const memory_size_type proct_external_size = proct.external_memory_in_bytes();
+
+  nout << "poct.total_memory_in_bytes() = " << poct_total_size
+       << endl
+       << "poct.external_memory_in_bytes() = " << poct_external_size
+       << endl
+       << "pqoct.total_memory_in_bytes() = " << pqoct_total_size
+       << endl
+       << "pqoct.external_memory_in_bytes() = " << pqoct_external_size
+       << endl
+       << "proct.total_memory_in_bytes() = " << proct_total_size
+       << endl
+       << "proct.external_memory_in_bytes() = " << proct_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Octagonal_Shape/minconstraints1.cc b/tests/Octagonal_Shape/minconstraints1.cc
new file mode 100644
index 0000000..666962e
--- /dev/null
+++ b/tests/Octagonal_Shape/minconstraints1.cc
@@ -0,0 +1,135 @@
+/* Test Octagonal_Shape<T>::minimized_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 1);
+  oct.add_constraint(B >= 0);
+  oct.add_constraint(A - B >= -2);
+  oct.add_constraint(A >= -3);
+  oct.add_constraint(A <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  const Constraint_System cs = oct.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** oct.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_oct(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_oct);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 2);
+  oct.add_constraint(B == 3);
+  oct.add_constraint(A - B == -1);
+  oct.add_constraint(A + B == 5);
+
+  print_constraints(oct, "*** oct ***");
+
+  const Constraint_System cs = oct.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** oct.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  C_Polyhedron ph_oct(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 2);
+  known_result.add_constraint(A - B <= -1);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (num_constraints == 3 && known_result == ph_oct);
+
+  return ok;
+}
+
+bool
+test03() {
+  TOctagonal_Shape oc(0, UNIVERSE);
+
+  print_constraints(oc, "*** oc ***");
+
+  const Constraint_System cs = oc.minimized_constraints();
+
+  using namespace IO_Operators;
+  nout << "*** oc.minimized_constraints() ***" << endl;
+
+  dimension_type num_constraints = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         iend = cs.end(); i != iend; ++i) {
+    nout << *i << endl;
+    ++num_constraints;
+  }
+
+  nout << "num_constraints == " << num_constraints << endl;
+
+  return num_constraints == 0;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithcons1.cc b/tests/Octagonal_Shape/relatwithcons1.cc
new file mode 100644
index 0000000..f16186d
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons1.cc
@@ -0,0 +1,596 @@
+/* Test Octagonal_Shape::relation_with(c).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+ return rel == known_result;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(y <= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(y >= 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(y <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(y >= 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(x - y == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(x + y == 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oct(4);
+  oct.add_constraint(x - y == 0);
+  oct.add_constraint(w <= 1);
+  oct.add_constraint(x + z >= 3);
+  oct.add_constraint(z - w <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(x + w >= 0);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 1);
+  cs.insert(y >= 5);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  // An equality constraint non-intersecting the octagon.
+  Constraint c(y == -1);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Constraint::zero_dim_false());
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(Constraint::zero_dim_false()) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(x == 1);
+  oct.add_constraint(y <= 0);
+  oct.add_constraint(z >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(x > 1);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variable G1(32);
+  Variable H1(33);
+
+  TOctagonal_Shape oct(34);
+  oct.add_constraint(C >= 4);
+  oct.add_constraint(D >= 1);
+  oct.add_constraint(G == 0);
+  oct.add_constraint(L >= 5);
+  oct.add_constraint(O >= 1);
+  oct.add_constraint(A1 >= -1);
+  oct.add_constraint(A1 <= 511);
+  oct.add_constraint(C1 >= 0);
+  oct.add_constraint(H1 >= 1);
+  oct.add_constraint(C + D >= 5);
+  oct.add_constraint(E - F == 0);
+  oct.add_constraint(C - G >= 4);
+  oct.add_constraint(C + G >= 4);
+  oct.add_constraint(D - G >= 1);
+  oct.add_constraint(D + G >= 1);
+  oct.add_constraint(J - K == 0);
+  oct.add_constraint(L - C >= 1);
+  oct.add_constraint(C + L >= 9);
+  oct.add_constraint(D + L >= 6);
+  oct.add_constraint(L - G >= 5);
+  oct.add_constraint(G + L >= 5);
+  oct.add_constraint(M - N == 0);
+  oct.add_constraint(C + O >= 5);
+  oct.add_constraint(D + O >= 2);
+  oct.add_constraint(O - G >= 1);
+  oct.add_constraint(G + O >= 1);
+  oct.add_constraint(L + O >= 6);
+  oct.add_constraint(R - S == 0);
+  oct.add_constraint(U - V == 0);
+  oct.add_constraint(W - X == 0);
+  oct.add_constraint(Y - Z == 0);
+  oct.add_constraint(A1 - C <= 507);
+  oct.add_constraint(C + A1 >= 3);
+  oct.add_constraint(A1 - D <= 510);
+  oct.add_constraint(D + A1 >= 0);
+  oct.add_constraint(G - A1 <= 1);
+  oct.add_constraint(A1 - G <= 511);
+  oct.add_constraint(G + A1 >= -1);
+  oct.add_constraint(G + A1 <= 511);
+  oct.add_constraint(A1 - L <= 506);
+  oct.add_constraint(L + A1 >= 4);
+  oct.add_constraint(A1 - O <= 510);
+  oct.add_constraint(O + A1 >= 0);
+  oct.add_constraint(C + C1 >= 4);
+  oct.add_constraint(D + C1 >= 1);
+  oct.add_constraint(G -C1 <= 0);
+  oct.add_constraint(G + C1 >= 0);
+  oct.add_constraint(L + C1 >= 5);
+  oct.add_constraint(C1 - O <= 0);
+  oct.add_constraint(O + C1 >= 1);
+  oct.add_constraint(A1 - C1 <= 511);
+  oct.add_constraint(A1 + C1 >= -1);
+  oct.add_constraint(D1 - E1 == 0);
+  oct.add_constraint(C + H1 >= 5);
+  oct.add_constraint(D + H1 >= 2);
+  oct.add_constraint(H1 - G >= 1);
+  oct.add_constraint(G + H1 >= 1);
+  oct.add_constraint(L + H1 >= 6);
+  oct.add_constraint(O + H1 >= 2);
+  oct.add_constraint(A1 - H1 <= 510);
+  oct.add_constraint(A1 + H1 >= 0);
+  oct.add_constraint(C1 + H1 >= 1);
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(C1 >= 511);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A == 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+
+  // An empty octagon.
+  TOctagonal_Shape oct(1, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A >= 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B == 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B >= 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B >= 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B <= 10);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B <= 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A == 0);
+  cs.insert(B <= -1);
+  cs.insert(A - B <= 2);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithcons2.cc b/tests/Octagonal_Shape/relatwithcons2.cc
new file mode 100644
index 0000000..286720b
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons2.cc
@@ -0,0 +1,477 @@
+/* Test Octagonal_Shape::relation_with(c).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) > 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  // The zero-dim universe octagon.
+  TOctagonal_Shape oct(0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) > 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  // An empty octagon.
+  TOctagonal_Shape oct(1, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A > 0);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B == 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B > 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B > 3);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B < 10);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B < 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(A + B > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  TOctagonal_Shape oct(cs);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(B - A > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - A > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) >= 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(B >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) > 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct(3);
+  oct.add_constraint(A == 1);
+  oct.add_constraint(B >= 2);
+  oct.add_constraint(C <= 1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(1) == 1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(1 == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Con_Relation rel = oct.relation_with(Linear_Expression(0) >= -1);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(0 >= -1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagon::relation_with(c):
+    // it is illegal to use a constraint that is not dimension-compatible
+    // with the octagon.
+    Poly_Con_Relation rel = oc.relation_with(-C - B <= 2);
+    (void) rel;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 3);
+  oct.add_constraint(A <= 4);
+  oct.add_constraint(B >= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Constraint c(A + B == 3);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = oct.relation_with(c);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A == -1);
+
+  Poly_Con_Relation rel = oct.relation_with(A == 0);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  Octagonal_Shape<mpz_class> oc(1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A <= 1);
+
+  Constraint c(2*A == 1);
+  Poly_Con_Relation rel = oc.relation_with(c);
+
+  print_constraints(oc, "--- oc ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+
+  TOctagonal_Shape oc(1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A <= 1);
+
+  Constraint c(Linear_Expression(1) == 0);
+  Poly_Con_Relation rel = oc.relation_with(c);
+
+  print_constraints(oc, "--- oc ---");
+  print_constraint(c, "--- c ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with(1 == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+
+  TOctagonal_Shape oc(1);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A <= 1);
+
+  Congruence cg((A %= 0) / 0);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with(A == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 0) / 1);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 3*B %= 0)/1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/relatwithcons3.cc b/tests/Octagonal_Shape/relatwithcons3.cc
new file mode 100644
index 0000000..97d6e02
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithcons3.cc
@@ -0,0 +1,509 @@
+/* Test Octagonal_Shape::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B == 0);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B == 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= -1);
+  cs.insert(B >= 0);
+  cs.insert(A - B <= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B == 0);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B - 4*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B - 4*A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B + 4*A >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B + 4*A >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B + 4*A == 5);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B + 4*A == 5) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 2);
+  cs.insert(B <= 3);
+  cs.insert(A - B >= -2);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(B + 4*A >= 6);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(B + 4*A >= 6) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+  test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 2);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B == 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B == 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 0);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A + 2*B >= 1);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A + 2*B >= 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 3);
+  cs.insert(B <= 3);
+  cs.insert(B >= 3);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A - B >= 3);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A - B >= 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A + B >= 9);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A + B >= 9) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A <= 3);
+  cs.insert(A >= 1);
+  cs.insert(B <= 3);
+  cs.insert(B >= 1);
+
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A + B >= 10);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A + B >= 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A - B == 3);
+  cs.insert(B == 1);
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(A - 2*B > 2);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(A - 2*B > 2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint()
+    && Poly_Con_Relation::saturates();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B <= 3);
+  cs.insert(A <= 1);
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A - B > 4);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A - B > 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A - B >= 3);
+  cs.insert(A >= 1);
+  TOctagonal_Shape oct(cs);
+
+  Poly_Con_Relation rel = oct.relation_with(2*A - B < 4);
+
+  print_constraints(oct, "*** oct ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(2*A - B < 4) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(2*A >= 1);
+  oc.add_constraint(B >= 1);
+
+  Congruence cg((A + 4*B %= 1) / 2);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 4*B %= 1)/2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 1);
+  oc.add_constraint(A <= 2);
+  oc.add_constraint(B >= 1);
+  oc.add_constraint(B <= 2);
+
+  Congruence cg((A + 4*B %= 1) / 10);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 4*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(2*A <= 1);
+  oc.add_constraint(B <= 1);
+
+  Congruence cg((A + 4*B %= 1) / 2);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 4*B %= 1)/2) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 0);
+  oc.add_constraint(B >= 0);
+  oc.add_constraint(B <= 2);
+  oc.add_constraint(A - B <= 1);
+
+  Congruence cg((A + 3*B %= 1) / 10);
+  Poly_Con_Relation rel = oc.relation_with(cg);
+
+  print_constraints(oc, "--- oc ---");
+  print_congruence(cg, "--- cg ---");
+  using namespace IO_Operators;
+  nout << "oc.relation_with((A + 3*B %= 1)/10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Octagonal_Shape/relatwithgen1.cc b/tests/Octagonal_Shape/relatwithgen1.cc
new file mode 100644
index 0000000..a3ba655
--- /dev/null
+++ b/tests/Octagonal_Shape/relatwithgen1.cc
@@ -0,0 +1,497 @@
+/* Test Octagonal_Shape::relation_with(g): we verify that a generator
+   is not subsumed by an empty octagon.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  TOctagonal_Shape oct(2, EMPTY);
+
+  print_constraints(oct, "*** oct ***");
+
+  Generator g = point(x);
+
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oct;
+  print_constraints(oct, "*** oct ***");
+
+  Generator g = point();
+
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(point(2*A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B >= 0);
+  oct.add_constraint(B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel1 = oct.relation_with(point(B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(B)) == " << rel1 << endl;
+
+  Poly_Gen_Relation rel2 = oct.relation_with(point(-B));
+
+  nout << "oct.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result1 = Poly_Gen_Relation::subsumes();
+  Poly_Gen_Relation known_result2 = Poly_Gen_Relation::nothing();
+
+  return rel1 == known_result1 && rel2 == known_result2;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B == 1);
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(-A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B == 1);
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(-A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 0);
+  oct.add_constraint(B >= -1);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A == 0);
+  oct.add_constraint(B >= -1);
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(-A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct  (2);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(B == 2);
+
+  print_constraints(oct , "*** oct       ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(closure_point(A));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(A + B <= 3);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(A + B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(A + B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A >= 2);
+  oct.add_constraint(A + B <= 3);
+  oct.add_constraint(A - B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(ray(-2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(ray(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oc(2);
+  oc.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of method
+    // Octagon::relation_with(g):
+    // it is illegal to use a generator that is
+    // dimensional incompatible with the OS.
+    Poly_Gen_Relation rel = oc.relation_with(ray(C));
+    (void) rel;
+  }
+  catch (std::invalid_argument& e) {
+    nout << "std::invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A <= 2);
+  oct.add_constraint(A + B <= 3);
+  oct.add_constraint(A - B >= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(-2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A + B == 3);
+  oct.add_constraint(A - B == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(-2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A - B == 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(A - B <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(point(A + 2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(A + 2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(point(A + 2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(point(A + 2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B - A <= 0);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(B - 3*A + 5));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(B - 3*A + 5)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct(2);
+  oct.add_constraint(B <= 2);
+
+  print_constraints(oct, "*** oct ***");
+
+  Poly_Gen_Relation rel = oct.relation_with(line(2*B));
+
+  using namespace IO_Operators;
+  nout << "oct.relation_with(line(-2*B)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test20() {
+  // A 1D empty shape that is not in minimal form and the point is the origin.
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A <= 0);
+  oct.add_constraint(A >= 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  print_constraints(oct, "*** oct ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test21() {
+  // A single point does not subsume another (different) point.
+  Variable A(0);
+
+  TOctagonal_Shape oct(1);
+  oct.add_constraint(A == 1);
+
+  Generator g = point();
+  Poly_Gen_Relation rel = oct.relation_with(g);
+
+  print_constraints(oct, "*** oct ***");
+  print_generator(g, "*** g ***");
+  using namespace IO_Operators;
+  nout << "oct.relation_with(v()) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+END_MAIN
diff --git a/tests/Octagonal_Shape/removespacedims1.cc b/tests/Octagonal_Shape/removespacedims1.cc
new file mode 100644
index 0000000..2977601
--- /dev/null
+++ b/tests/Octagonal_Shape/removespacedims1.cc
@@ -0,0 +1,375 @@
+/* Remove the higher variables from the space.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x2(1);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x2 <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x2 <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x2(1);
+  Variable x3(2);
+  Variable x5(4);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(x2 - x3 <= 0);
+  oc1.add_constraint(x3 <= 2);
+  oc1.add_constraint(x5 <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x3);
+  to_be_removed.insert(x5);
+  oc1.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(4);
+  known_result.add_constraint(x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oct1.remove_space_dimensions({x3, x5}) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TOctagonal_Shape oct1(6);
+  oct1.add_constraint(x1 >= 1);
+  oct1.add_constraint(x1 + x3 >= 2);
+  oct1.add_constraint(x2 - x3 <= 4);
+  oct1.add_constraint(x4 - x1  >= 0);
+  oct1.add_constraint(x6 <= 7);
+  oct1.add_constraint(x5 + x4 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(3);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 >= 1);
+  known_result.add_constraint(x1 + x3 >= 2);
+  known_result.add_constraint(x2 - x3 <= 4);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(6);
+
+  // A 10-dim space, empty polyhedron.
+  TOctagonal_Shape oc(10, EMPTY);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  // A 7-dim space, empty polyhedron.
+  Octagonal_Shape<mpq_class> known_result(7, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions({y, z, w}) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  // A 4-dim space, empty polyhedron.
+  TOctagonal_Shape oc(4, EMPTY);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+  to_be_removed.insert(x);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(0, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions({x, y, z, w}) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape oc(5);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::remove_higher_dimensions(n): it is illegal to erase
+    // a variable that is not in the space of the polyhedron.
+    oc.remove_higher_space_dimensions(7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+  cs.insert(y - z <= 2);
+  TOctagonal_Shape oc(cs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of method
+    // Octagonal_Shape::remove_space_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    oc.remove_space_dimensions(to_be_removed);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(x - y <= 0);
+  oc.add_constraint(z <= 2);
+  oc.add_constraint(w >= 3);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(oc);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions() ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  TOctagonal_Shape oc(0);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(oc);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions() ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+  Variable x5(4);
+  Variable x6(5);
+
+  TOctagonal_Shape oct1(6);
+  oct1.add_constraint(x1 >= 1);
+  oct1.add_constraint(x1 + x3 >= 2);
+  oct1.add_constraint(x2 - x3 <= 4);
+  oct1.add_constraint(x4 - x1  >= 0);
+  oct1.add_constraint(x6 <= 7);
+  oct1.add_constraint(x5 + x4 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(6);
+
+  Octagonal_Shape<mpq_class> known_result(oct1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(6) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 - x2 >= 13);
+  oct1.add_constraint(x2 <= 3);
+  oct1.add_constraint(x2 + x3 == 5);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  oct1.remove_higher_space_dimensions(0);
+
+  Octagonal_Shape<mpq_class> known_result(0, UNIVERSE);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(x - y <= 0);
+  oc.add_constraint(z <= 2);
+  oc.add_constraint(w >= 3);
+
+  print_constraints(oc, "*** oc ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x);
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+
+  oc.remove_space_dimensions(to_be_removed);
+
+  Octagonal_Shape<mpq_class> known_result(0, UNIVERSE);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc) == known_result);
+
+  print_constraints(oc, "*** oc.remove_space_dimensions({x, y, z, w}) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/run_tests b/tests/Octagonal_Shape/run_tests
new file mode 100755
index 0000000..7f5e33b
--- /dev/null
+++ b/tests/Octagonal_Shape/run_tests
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+# Run the Octagonal_Shape tests.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+mpz_class_XFAIL_TESTS=
+mpq_class_XFAIL_TESTS=
+int8_t_XFAIL_TESTS=
+int16_t_XFAIL_TESTS=
+int32_t_XFAIL_TESTS=
+int64_t_XFAIL_TESTS=
+float_XFAIL_TESTS=
+double_XFAIL_TESTS=
+long_double_XFAIL_TESTS=
+
+if [ -z "$MAKE" ]
+then
+    MAKE=make
+fi
+
+instances=`MAKEFLAGS='' $MAKE -s print_INSTANCES`
+
+check_PROGRAMS=`MAKEFLAGS='' $MAKE -s print_check_PROGRAMS`
+
+for instance in $instances
+do
+  echo "**************************** " $instance " ****************************"
+  eval xfail_tests='"$'$instance'_XFAIL_TESTS"'
+  [ -f dirty_marker ] && $MAKE clean
+  touch dirty_marker
+  $MAKE check TESTS="$check_PROGRAMS" TESTS_ENVIRONMENT="$CHECKER" TEST_CPPFLAGS="-DOCTAGONAL_SHAPE_INSTANCE=$instance" XFAIL_TESTS=$xfail_tests || exit 1
+  $MAKE clean && rm dirty_marker
+done
+exit 0
diff --git a/tests/Octagonal_Shape/simplifyusingcontext1.cc b/tests/Octagonal_Shape/simplifyusingcontext1.cc
new file mode 100644
index 0000000..2b8163a
--- /dev/null
+++ b/tests/Octagonal_Shape/simplifyusingcontext1.cc
@@ -0,0 +1,340 @@
+/* Test Octagonal_Shape::simplify_using_context_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 2);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(oct1);
+  oct2.affine_image(x, x + 6);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(x <= 2);
+
+  bool ok = !oct1.simplify_using_context_assign(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.simplify_using_context_assign(oct2) ***");
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 2);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(oct1);
+  oct2.affine_image(x, x + 1);
+  oct2.affine_image(y, y + 6);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  // NOTE: this is the result computed when using the current heuristics.
+  // It turns out that the current heuristics is not smart enough to see
+  // that constraint y <= 2 is not really needed.
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = !oct1.simplify_using_context_assign(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.simplify_using_context_assign(oct2) ***");
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  TOctagonal_Shape oct1(1);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 6);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(1);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(x <= 5);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape computed_result = oct1;
+
+  computed_result.simplify_using_context_assign(oct2);
+
+  TOctagonal_Shape known_result(1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result,
+                    "*** oct1.simplify_using_context_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TOctagonal_Shape oct1 = TOctagonal_Shape(3, UNIVERSE);
+  oct1.add_constraint(i >= 1);
+  oct1.add_constraint(i <= 10);
+  oct1.add_constraint(j >= 1);
+  oct1.add_constraint(j <= 10);
+  oct1.add_constraint(k == 0);
+
+  TOctagonal_Shape oct2 = TOctagonal_Shape(3, UNIVERSE);
+  oct2.add_constraint(i >= 0);
+  oct2.add_constraint(i <= 2);
+  oct2.add_constraint(j >= 2);
+  oct2.add_constraint(j <= 9);
+  oct2.add_constraint(k == 0);
+
+  print_constraints(oct1, "=== oct1 ===");
+  print_constraints(oct2, "=== oct2 ===");
+
+  TOctagonal_Shape known_result = TOctagonal_Shape(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+
+  oct1.simplify_using_context_assign(oct2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "=== oct1.simplify_using_context_assign(oct2) ===");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TOctagonal_Shape oct1(3, UNIVERSE);
+  oct1.add_constraint(i == 1);
+  oct1.add_constraint(j + 1 == 0);
+  oct1.add_constraint(k == 3);
+
+  TOctagonal_Shape oct2(3, UNIVERSE);
+  oct2.add_constraint(i == 1);
+  oct2.add_constraint(j + k == 2);
+  oct2.add_constraint(k >= 0);
+  oct2.add_constraint(k <= 3);
+
+  TOctagonal_Shape known_result(3, UNIVERSE);
+  known_result.add_constraint(j + 1 <= 0);
+  // PolyLib 5.22.3 returns { j + 1 == 0, k == 3 };
+  // Using PPL::Polyhedron we get { k == 3 }.
+
+  oct1.simplify_using_context_assign(oct2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1.minimized_constraints(),
+                    "=== oct1.simplify_using_context_assign(oct2) ===");
+  print_constraints(known_result.minimized_constraints(),
+                    "=== known_result ===");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3, UNIVERSE);
+  oct1.add_constraint(A == 0);
+  oct1.add_constraint(B == C);
+  oct1.add_constraint(B >= 2);
+  print_constraints(oct1, "\n=== oct1 ===");
+
+  TOctagonal_Shape oct2(3, UNIVERSE);
+  oct2.add_constraint(A == 0);
+  oct2.add_constraint(C >= 2);
+  print_constraints(oct2, "\n=== oct2 ===");
+
+  oct1.simplify_using_context_assign(oct2);
+
+  TOctagonal_Shape known_result(3, UNIVERSE);
+  known_result.add_constraint(B == C);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1, "\n=== oct1.simplify_using_context_assign(oct2) ===");
+
+  return ok;
+}
+
+bool
+test07() {
+  TOctagonal_Shape oct1(0, EMPTY);
+  TOctagonal_Shape oct2;
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result = oct1;
+
+  oct1.simplify_using_context_assign(oct2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.simplify_using_context_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  TOctagonal_Shape oct1(1);
+  TOctagonal_Shape oct2(1);
+
+  oct2.add_constraint(A == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result = oct1;
+
+  oct1.simplify_using_context_assign(oct2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1.minimized_constraints(),
+                    "*** oct1.simplify_using_context_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  TOctagonal_Shape oct1(3, UNIVERSE);
+  oct1.add_constraint(i >= 1);
+  oct1.add_constraint(i <= 10);
+  oct1.add_constraint(j >= 1);
+  oct1.add_constraint(j <= 10);
+  oct1.add_constraint(k == 0);
+
+  TOctagonal_Shape oct2(3, UNIVERSE);
+  oct2.add_constraint(i <= 25);
+  oct2.add_constraint(j <= 25);
+  oct2.add_constraint(i + j >= 25);
+  oct2.add_constraint(k == 0);
+
+  TOctagonal_Shape known_result(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+  known_result.add_constraint(i <= 10);
+  known_result.add_constraint(j <= 10);
+
+  oct1.simplify_using_context_assign(oct2);
+
+  bool ok = (oct1 == known_result);
+
+  print_constraints(oct1.minimized_constraints(),
+                    "*** oct1.simplify_using_context_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(A == 0);
+  oct1.add_constraint(B == 0);
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(A >= 0);
+  oct2.add_constraint(B >= 0);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  bool ok = oct1.simplify_using_context_assign(oct2);
+
+  ok = ok && (oct1 == known_result);
+
+  print_constraints(oct1.minimized_constraints(),
+                    "*** oct1.simplify_using_context_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/timeelapse1.cc b/tests/Octagonal_Shape/timeelapse1.cc
new file mode 100644
index 0000000..2c191f7
--- /dev/null
+++ b/tests/Octagonal_Shape/timeelapse1.cc
@@ -0,0 +1,372 @@
+/* Test time_elapse_assign() for particular polyhedra.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape oc1(2, EMPTY);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+
+  TOctagonal_Shape oc3(2);
+
+  print_constraints(oc3, "*** oc3 ***");
+
+  TOctagonal_Shape oc4(2, EMPTY);
+
+  print_constraints(oc4, "*** oc4 ***");
+
+  oc3.time_elapse_assign(oc4);
+
+  print_constraints(oc3, "*** oc3.time_elapse_assign(oc4) ***");
+
+  Octagonal_Shape<mpq_class> known_result(2, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result) &&
+    (Octagonal_Shape<mpq_class>(oc3) == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= 0);
+  oc1.add_constraint(y >= 0);
+  oc1.add_constraint(x + y - 2 <= 0);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x >= 2);
+  oc2.add_constraint(x <= 4);
+  oc2.add_constraint(y == 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(y >= 1);
+  oc1.add_constraint(y <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(y == 5);
+
+  oc1.time_elapse_assign(oc2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x == 3);
+  oc1.add_constraint(y >= 2);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(2);
+  oc2.add_constraint(x >= 3);
+  oc2.add_constraint(y >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(oc2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(y <= 5);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(y <= 3);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 5);
+  oc1.add_constraint(y >= 6);
+  oc1.add_constraint(z >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= 2);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 5);
+  oc1.add_constraint(y >= 1);
+  oc1.add_constraint(z >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= 2);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x >= 1);
+  known_result.add_constraint(y >= 1);
+  known_result.add_constraint(z >= 1);
+  known_result.add_constraint(x - y <= 2);
+  known_result.add_constraint(x - z <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc1(3);
+  oc1.add_constraint(x <= 3);
+  oc1.add_constraint(x >= 1);
+  oc1.add_constraint(y <= 7);
+  oc1.add_constraint(y >= 6);
+  oc1.add_constraint(z >= 1);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  // The octagon oc2 is empty.
+  TOctagonal_Shape oc2(3);
+  oc2.add_constraint(x <= 2);
+  oc2.add_constraint(x >= 0);
+  oc2.add_constraint(y <= 3);
+  oc2.add_constraint(y >= 4);
+  oc2.add_constraint(z >= 2);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(3, EMPTY);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  TOctagonal_Shape oc1(6);
+  oc1.add_constraint(A - B <= 1);
+  oc1.add_constraint(C + D <= 3);
+  oc1.add_constraint(A + E <= 5);
+  oc1.add_constraint(E - F <= 7);
+  oc1.add_constraint(F + E <= 3);
+
+  print_constraints(oc1, "*** oc1 ***");
+
+  TOctagonal_Shape oc2(6);
+  oc2.add_constraint(A + B <= 0);
+  oc2.add_constraint(C + B <= 9);
+  oc2.add_constraint(A + E <= 5);
+  oc2.add_constraint(F + E <= 2);
+  oc2.add_constraint(E - F <= 8);
+
+  print_constraints(oc2, "*** oc2 ***");
+
+  oc1.time_elapse_assign(oc2);
+
+  Octagonal_Shape<mpq_class> known_result(6);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oc1) == known_result);
+
+  print_constraints(oc1, "*** oc1_time_elapse_assign(oc2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oct1(1);
+  oct1.add_constraint(x == 1);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(y + z <= 6);
+
+  try {
+    // This is an invalid use of the method
+    // Octagonal_Shape::time_elapse_assign(oct1): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    oct2.time_elapse_assign(oct1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/unconstrain1.cc b/tests/Octagonal_Shape/unconstrain1.cc
new file mode 100644
index 0000000..57e0814
--- /dev/null
+++ b/tests/Octagonal_Shape/unconstrain1.cc
@@ -0,0 +1,251 @@
+/* Test Octagonal_Shape::unconstrain().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+  print_constraints(os, "*** os ***");
+
+  os.unconstrain(A);
+
+  TOctagonal_Shape known_result(2, EMPTY);
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs(A, B);
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(2, EMPTY);
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A == B);
+  os.add_constraint(B >= 0);
+  print_constraints(os, "*** os ***");
+
+  os.unconstrain(B);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(A == B);
+  os.add_constraint(B >= 0);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs(B);
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  TOctagonal_Shape os(0, EMPTY);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs;
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(0, EMPTY);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  TOctagonal_Shape os(0);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs;
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    TOctagonal_Shape os(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    os.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    TOctagonal_Shape os(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    os.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  TOctagonal_Shape os(5);
+  os.add_constraint(A - B == 9);
+  os.add_constraint(A >= D + 2);
+  os.add_constraint(C <= D);
+  os.add_constraint(E <= B);
+  os.add_constraint(E >= 0);
+  print_constraints(os, "*** os ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  os.unconstrain(vs);
+
+  TOctagonal_Shape known_result(5);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (os == known_result);
+
+  print_constraints(os, "*** after os.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  try {
+    TOctagonal_Shape os(4);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    os.unconstrain(Variable(4));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Octagonal_Shape/universe1.cc b/tests/Octagonal_Shape/universe1.cc
new file mode 100644
index 0000000..9f3ce1e
--- /dev/null
+++ b/tests/Octagonal_Shape/universe1.cc
@@ -0,0 +1,112 @@
+/* Test Octagonal_Shape::is_universe().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape oc(4);
+  oc.add_constraint(-x <= 4);
+  oc.add_constraint(y - x <= 0);
+  oc.add_constraint(x - y <= -5);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test02() {
+  TOctagonal_Shape oc(4);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x >= 1);
+  oc.add_constraint(y >= 1);
+  oc.add_constraint(x <= 4);
+  oc.add_constraint(y <= 4);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+bool
+test04() {
+  TOctagonal_Shape oc(0);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return universe;
+}
+
+bool
+test05() {
+  //  Variable x(0);
+
+  TOctagonal_Shape oc(1, EMPTY);
+
+  bool universe = oc.is_universe();
+
+  nout << "*** oc.is_universe() ***" << endl;
+  nout << (universe ? "true" : "false") << endl;
+
+  return !universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Octagonal_Shape/upperbound1.cc b/tests/Octagonal_Shape/upperbound1.cc
new file mode 100644
index 0000000..d3ee77a
--- /dev/null
+++ b/tests/Octagonal_Shape/upperbound1.cc
@@ -0,0 +1,391 @@
+/* Test Octagonal_Shape::poly_hull_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x1 >= 1);
+  oct1.add_constraint(x1 - x2 <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x2 <= 1);
+  oct2.add_constraint(x1 - x2 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x1 - x2 <= 3);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+
+  TOctagonal_Shape oct1(2);
+  oct1.add_constraint(x1 >= 0);
+  oct1.add_constraint(x1 + x2 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2);
+  oct2.add_constraint(x2 >= 1);
+  oct2.add_constraint(x1 + x2 >= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(2);
+  known_result.add_constraint(x1 + x2 >= 1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  TOctagonal_Shape oct1(5);
+  oct1.add_constraint(x1 <= 5);
+  oct1.add_constraint(x2 <= -1);
+  oct1.add_constraint(x1 - x2 <= 10);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(5);
+  oct2.add_constraint(x1  <= 2);
+  oct2.add_constraint(x4 <= 7);
+  oct2.add_constraint(x1 - x2 <= 20);
+  oct2.add_constraint(x4 - x3 <= 3);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(5);
+  known_result.add_constraint(x1 <= 5);
+  known_result.add_constraint(x1 - x2 <= 20);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 <= 1);
+  oct1.add_constraint(- x1 - x2 >= 1);
+  oct1.add_constraint(x3 == 2 );
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(x2  >= 1);
+  oct2.add_constraint(x1 + x2 <= 2);
+  oct2.add_constraint(- x1 - x3 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 <= 1);
+  known_result.add_constraint(-x3 <= 3);
+  known_result.add_constraint(x1 + x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(A <= 1);
+  oct1.add_constraint(B >= 7);
+  oct1.add_constraint(C <= 3);
+  oct1.add_constraint(A >= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(A  >= 1);
+  oct2.add_constraint(B <= 2);
+  oct2.add_constraint(C <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(oct2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs1;
+  cs1.insert(A == 1);
+  cs1.insert(C - A <= 2);
+  cs1.insert(C - B <= 7);
+  cs1.insert(B - A <= 3);
+  TOctagonal_Shape oct1(cs1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(A == 1);
+  cs2.insert(C - A <= 3);
+  cs2.insert(C - A >= 7);
+  cs2.insert(B - A <= 2);
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraints(cs2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(cs1);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  TOctagonal_Shape oct1(0, EMPTY);
+  TOctagonal_Shape oct2;
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result;
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  TOctagonal_Shape oct1(8);
+  TOctagonal_Shape oct2(8);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(8);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 <= 2);
+  oct1.add_constraint(- x1 - x2 >= 1);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(x2  >= 1);
+  oct2.add_constraint(x1 + x2 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 <= 2);
+  known_result.add_constraint(x1 + x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  TOctagonal_Shape oc1(12);
+  TOctagonal_Shape oc2(5);
+
+  try {
+    // This is an incorrect use of method
+    // Octagonal_Shape::upper_bound_assign(oc2): it is impossible to apply
+    // this method to two polyhedra of different dimensions.
+    oc1.upper_bound_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+// CHEKME: is this a duplication of test10?
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc1(2);
+  oc1.add_constraint(x >= y);
+
+  TOctagonal_Shape oc2(3);
+
+  try {
+    // This is an invalid use of method
+    // Octagonal_Shape::upper_bound_assign(oc2): it is illegal
+    // to apply this method to two polyhedra of different dimensions.
+    oc1.upper_bound_assign(oc2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  TOctagonal_Shape oct1(3);
+  oct1.add_constraint(x1 <= 1);
+  oct1.add_constraint(- x1 - x2 >= 1);
+  oct1.add_constraint(x3 == 2 );
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(3);
+  oct2.add_constraint(x2  >= 1);
+  oct2.add_constraint(x1 + x2 <= 2);
+  oct2.add_constraint(- x1 - x3 <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  oct1.upper_bound_assign(oct2);
+
+  Octagonal_Shape<mpq_class> known_result(3);
+  known_result.add_constraint(x1 <= 1);
+  known_result.add_constraint(-x3 <= 3);
+  known_result.add_constraint(x1 + x2 <= 2);
+
+  bool ok = (Octagonal_Shape<mpq_class>(oct1) == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
+
diff --git a/tests/Octagonal_Shape/upperboundifexact1.cc b/tests/Octagonal_Shape/upperboundifexact1.cc
new file mode 100644
index 0000000..64d9cd7
--- /dev/null
+++ b/tests/Octagonal_Shape/upperboundifexact1.cc
@@ -0,0 +1,424 @@
+/* Test Octagonal_Shape::upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  TOctagonal_Shape octs_empty(0, EMPTY);
+  TOctagonal_Shape octs_universe(0, UNIVERSE);
+
+  // Testing all combinations for 0-dim polyhedra.
+  bool ok = true;
+  TOctagonal_Shape octs;
+
+  // empty, empty
+  octs = octs_empty;
+  ok &= octs.upper_bound_assign_if_exact(octs_empty);
+  ok &= (octs == octs_empty);
+  print_constraints(octs, "*** empty union empty ***");
+
+  // empty, universe
+  octs = octs_empty;
+  ok &= octs.upper_bound_assign_if_exact(octs_universe);
+  ok &= (octs == octs_universe);
+  print_constraints(octs, "*** empty union universe ***");
+
+  // universe, empty
+  octs = octs_universe;
+  ok &= octs.upper_bound_assign_if_exact(octs_empty);
+  ok &= (octs == octs_universe);
+  print_constraints(octs, "*** universe union empty ***");
+
+  // universe, universe
+  octs = octs_universe;
+  ok &= octs.upper_bound_assign_if_exact(octs_universe);
+  ok &= (octs == octs_universe);
+  print_constraints(octs, "*** universe union universe ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= -2);
+  oct1.add_constraint(x <= -1);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 1);
+  oct2.add_constraint(x <= 2);
+  oct2.add_constraint(y >= 0);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(oct1);
+
+  bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= -2);
+  oct1.add_constraint(x <= 0);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(x <= 2);
+  oct2.add_constraint(y >= 0);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x == 0);
+  oct1.add_constraint(y == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(x <= 2);
+  oct2.add_constraint(y >= -2);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(oct2);
+
+  bool ok = oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(y == 0);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+  oct2.add_constraint(y >= 2);
+  oct2.add_constraint(y <= 4);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(oct1);
+
+  bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x == y);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x == 0);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(oct1);
+
+  bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= y);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 0);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(oct1);
+
+  bool ok = !oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= y);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(2, UNIVERSE);
+  oct2.add_constraint(x <= y);
+
+  print_constraints(oct2, "*** oct2 ***");
+
+  TOctagonal_Shape known_result(2, UNIVERSE);
+
+  bool ok = oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == known_result);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  TOctagonal_Shape octs(3, UNIVERSE);
+  octs.add_constraint(x >= 0);
+  octs.add_constraint(x <= 2);
+  octs.add_constraint(y >= 0);
+  octs.add_constraint(y <= 4);
+  octs.add_constraint(z >= 0);
+  octs.add_constraint(z <= 4);
+  octs.add_constraint(x - y <= 2);
+  octs.add_constraint(z - y <= 2);
+
+  TOctagonal_Shape oct1(octs);
+  oct1.add_constraint(z <= 3);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(octs);
+  oct2.add_constraint(x - y <= 1);
+
+  TOctagonal_Shape known_result(octs);
+
+  C_Polyhedron ph1(oct1);
+  C_Polyhedron ph2(oct2);
+
+  bool exact = ph1.upper_bound_assign_if_exact(ph2);
+  nout << "In the c polyhedra domain, upper_bound_assign_if_exact() returns: "
+       << exact << std::endl;
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  bool ok = oct1.upper_bound_assign_if_exact(oct2);
+
+  ok &= (oct1 == octs);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape octs(4, UNIVERSE);
+  octs.add_constraint(x - y <= 4);
+  octs.add_constraint(z - w <= 4);
+  octs.add_constraint(x - w <= 5);
+  octs.add_constraint(z <= 0);
+  octs.add_constraint(z - y <= 1);
+  octs.add_constraint(y + w >= -1);
+
+  TOctagonal_Shape oct1(octs);
+  oct1.add_constraint(x - y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+
+  TOctagonal_Shape oct2(octs);
+  oct2.add_constraint(z - w <= 2);
+
+  TOctagonal_Shape known_result(octs);
+
+  bool ok = oct1.upper_bound_assign_if_exact(oct2);
+  ok &= (oct1 == octs);
+
+  print_constraints(oct1, "*** oct1.upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  //  const dimension_type dim = 200;
+  const dimension_type dim = 50;
+  Constraint_System cs;
+  for (dimension_type i = 1; i < dim; ++i) {
+    Variable x(i);
+    cs.insert(x >= 0);
+    cs.insert(x <= 4);
+  }
+
+  Variable x(0);
+
+  TOctagonal_Shape hypercube1(cs);
+  hypercube1.add_constraint(x >= 0);
+  hypercube1.add_constraint(x <= 4);
+
+  TOctagonal_Shape hypercube2(cs);
+  hypercube2.add_constraint(x >= 2);
+  hypercube2.add_constraint(x <= 6);
+
+  TOctagonal_Shape known_result(cs);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+
+  bool ok = hypercube1.upper_bound_assign_if_exact(hypercube2);
+
+  ok &= (hypercube1 == known_result);
+
+  print_constraints(hypercube1, "*** hyp1 ***");
+  print_constraints(hypercube2, "*** hyp2 ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oct1(2, UNIVERSE);
+  oct1.add_constraint(x >= 0);
+  oct1.add_constraint(x <= 3);
+  oct1.add_constraint(y >= 0);
+  oct1.add_constraint(y <= 2);
+  oct1.add_constraint(x - y <= 2);
+
+  Octagonal_Shape<mpz_class> oct2(2, UNIVERSE);
+  oct2.add_constraint(x >= 3);
+  oct2.add_constraint(x <= 6);
+  oct2.add_constraint(y >= 0);
+  oct2.add_constraint(y <= 2);
+
+  print_constraints(oct1, "*** oct1 ***");
+  print_constraints(oct2, "*** oct2 ***");
+
+  Octagonal_Shape<mpz_class> known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 6);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = oct1.integer_upper_bound_assign_if_exact(oct2)
+    && (oct1 == known_result);
+
+  print_constraints(oct1,
+                    "*** oct1.integer_upper_bound_assign_if_exact(oct2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Octagonal_Shape/wrap1.cc b/tests/Octagonal_Shape/wrap1.cc
new file mode 100644
index 0000000..d31ebaa
--- /dev/null
+++ b/tests/Octagonal_Shape/wrap1.cc
@@ -0,0 +1,406 @@
+/* Test Octagonal_Shape::wrap_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x >= 224);
+  oct.refine_with_constraint(x-y <= 160);
+  oct.refine_with_constraint(x+y <= 416);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  TOctagonal_Shape known_result(2);
+  typedef TOctagonal_Shape::coefficient_type T;
+  if (!std::numeric_limits<T>::is_bounded
+      || (std::numeric_limits<T>::max() >= 510
+          && (std::numeric_limits<T>::is_iec559
+              || std::numeric_limits<T>::min() <= -510))) {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(x <= 255);
+    known_result.refine_with_constraint(y >= 64);
+    known_result.refine_with_constraint(y <= 192);
+    known_result.refine_with_constraint(+x-y <= 160);
+    known_result.refine_with_constraint(-x+y <= 160);
+    known_result.refine_with_constraint(+x+y >= 96);
+    known_result.refine_with_constraint(+x+y <= 416);
+  }
+  else {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(y >= 0);
+  }
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x >= 224);
+  oct.refine_with_constraint(x-y <= 160);
+  oct.refine_with_constraint(x+y <= 416);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  TOctagonal_Shape known_result(2);
+  typedef TOctagonal_Shape::coefficient_type_base T;
+  if (!std::numeric_limits<T>::is_bounded
+      || (std::numeric_limits<T>::max() >= 510
+          && (std::numeric_limits<T>::is_iec559
+              || std::numeric_limits<T>::min() <= -510))) {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(y >= 96);
+    known_result.refine_with_constraint(-x+y >= 96);
+    known_result.refine_with_constraint(+x+y <= 160);
+  }
+  else {
+    known_result.refine_with_constraint(x >= 0);
+    known_result.refine_with_constraint(y >= 0);
+    known_result.refine_with_constraint(+x-y <= 0);
+  }
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+#if 0
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+  oct.refine_with_constraint(-64 <= x);
+  oct.refine_with_constraint(x <= 448);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(y >= 120);
+  known_result.refine_with_constraint(y <= 184);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+  oct.refine_with_constraint(-64 <= x);
+  oct.refine_with_constraint(x <= 448);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED, &cs);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(y >= 120);
+  known_result.refine_with_constraint(y <= 184);
+  known_result.refine_with_constraint(x <= y);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+  oct.refine_with_constraint(-64 <= x);
+  oct.refine_with_constraint(x <= 448);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(x + 1024 == 8*y);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+  oct.refine_with_constraint(-64 <= x);
+  oct.refine_with_constraint(x <= 448);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE, &cs);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(7*x <= 1024);
+  known_result.refine_with_constraint(x + 1024 == 8*y);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(y >= 0);
+  known_result.refine_with_constraint(y <= 255);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(y <= 255);
+  known_result.refine_with_constraint(x <= y);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+  oct.refine_with_constraint(-64 <= x);
+  oct.refine_with_constraint(x <= 448);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(x + 24*y >= 3072);
+  known_result.refine_with_constraint(193*x + 504*y <= 129792);
+  known_result.refine_with_constraint(x - 8*y >= -1280);
+  known_result.refine_with_constraint(x - 8*y <= -768);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+  oct.refine_with_constraint(-64 <= x);
+  oct.refine_with_constraint(x <= 448);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(x <= y);
+  known_result.refine_with_constraint(x - 8*y >= -1280);
+  known_result.refine_with_constraint(x - 8*y <= -1024);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(x <= 255);
+  known_result.refine_with_constraint(y >= 0);
+  known_result.refine_with_constraint(y <= 255);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  TOctagonal_Shape oct(2);
+  oct.refine_with_constraint(x + 1024 == 8*y);
+
+  print_constraints(oct, "*** oct ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  oct.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+  TOctagonal_Shape known_result(2);
+  known_result.refine_with_constraint(x >= 0);
+  known_result.refine_with_constraint(y <= 255);
+  known_result.refine_with_constraint(x <= y);
+
+  bool ok = (oct == known_result);
+
+  print_constraints(oct, "*** oct.wrap_assign(...) ***");
+
+  return ok;
+}
+#endif
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/Octagonal_Shape/writeoctagon1.cc b/tests/Octagonal_Shape/writeoctagon1.cc
new file mode 100644
index 0000000..276e012
--- /dev/null
+++ b/tests/Octagonal_Shape/writeoctagon1.cc
@@ -0,0 +1,211 @@
+/* Test operator<<(ostream&, const Octagonal_Shape&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x + y == 3);
+  oc.add_constraint(x - y == 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B = 4, A + B = 3";
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x - y == 5);
+  oc.add_constraint(x + y == -1);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B = 5, A + B = -1";
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(-x - y <= 3);
+  oc.add_constraint(-x + y <= 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "B - A <= 4, A + B >= -3";
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+  oc.add_constraint(x - y <= 3);
+  oc.add_constraint(x + y <= 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B <= 3, A + B <= 4";
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+
+  oc.add_constraint(x - y >= 4);
+  oc.add_constraint(x - y <= 4);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A - B = 4";
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape oc(3);
+
+  oc.add_constraint(x + y <= 3);
+  oc.add_constraint(x + y >= 3);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A + B = 3";
+}
+
+bool
+test07() {
+  TOctagonal_Shape oc(32, UNIVERSE);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "true";
+}
+
+bool
+test08() {
+  TOctagonal_Shape oc(32, EMPTY);
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "false";
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpz_class> oc(2);
+
+  oc.add_constraint(x + y == 2);
+  oc.add_constraint(x - y == 1);
+
+  (void) oc.is_empty();
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "2*A = 3, 2*B = 1, A - B = 1, A + B = 2";
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Octagonal_Shape<mpq_class> oc(2);
+
+  oc.add_constraint(x + y == 2);
+  oc.add_constraint(x - y == 1);
+
+  (void) oc.is_empty();
+
+  std::stringstream s;
+  s << oc;
+
+  nout << "*** s << oc ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "A = 3/2, B = 1/2, A - B = 1, A + B = 2";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/PIP_Problem/Makefile.am b/tests/PIP_Problem/Makefile.am
new file mode 100644
index 0000000..d64b2ea
--- /dev/null
+++ b/tests/PIP_Problem/Makefile.am
@@ -0,0 +1,94 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+ascii_dump_load1 \
+exceptions1 \
+pipproblem1 pipproblem2 pipproblem3 \
+weightwatch1
+
+XFAIL_TESTS =
+
+BUGS =
+
+#
+# Sources for the tests
+#
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+
+pipproblem1_SOURCES = pipproblem1.cc
+pipproblem2_SOURCES = pipproblem2.cc
+pipproblem3_SOURCES = pipproblem3.cc
+
+weightwatch1_SOURCES = weightwatch1.cc
+
+check_PROGRAMS = \
+$(TESTS) \
+$(BUGS)
+
+#EXTRA_DIST =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/PIP_Problem/Makefile.in b/tests/PIP_Problem/Makefile.in
new file mode 100644
index 0000000..494bc0d
--- /dev/null
+++ b/tests/PIP_Problem/Makefile.in
@@ -0,0 +1,1214 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+	pipproblem1$(EXEEXT) pipproblem2$(EXEEXT) pipproblem3$(EXEEXT) \
+	weightwatch1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+subdir = tests/PIP_Problem
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = ascii_dump_load1$(EXEEXT) exceptions1$(EXEEXT) \
+	pipproblem1$(EXEEXT) pipproblem2$(EXEEXT) pipproblem3$(EXEEXT) \
+	weightwatch1$(EXEEXT)
+am__EXEEXT_2 =
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pipproblem1_OBJECTS = pipproblem1.$(OBJEXT)
+pipproblem1_OBJECTS = $(am_pipproblem1_OBJECTS)
+pipproblem1_LDADD = $(LDADD)
+pipproblem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pipproblem2_OBJECTS = pipproblem2.$(OBJEXT)
+pipproblem2_OBJECTS = $(am_pipproblem2_OBJECTS)
+pipproblem2_LDADD = $(LDADD)
+pipproblem2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_pipproblem3_OBJECTS = pipproblem3.$(OBJEXT)
+pipproblem3_OBJECTS = $(am_pipproblem3_OBJECTS)
+pipproblem3_LDADD = $(LDADD)
+pipproblem3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_weightwatch1_OBJECTS = weightwatch1.$(OBJEXT)
+weightwatch1_OBJECTS = $(am_weightwatch1_OBJECTS)
+weightwatch1_LDADD = $(LDADD)
+weightwatch1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+	$(pipproblem1_SOURCES) $(pipproblem2_SOURCES) \
+	$(pipproblem3_SOURCES) $(weightwatch1_SOURCES)
+DIST_SOURCES = $(ascii_dump_load1_SOURCES) $(exceptions1_SOURCES) \
+	$(pipproblem1_SOURCES) $(pipproblem2_SOURCES) \
+	$(pipproblem3_SOURCES) $(weightwatch1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+BUGS = 
+
+#
+# Sources for the tests
+#
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+exceptions1_SOURCES = exceptions1.cc
+pipproblem1_SOURCES = pipproblem1.cc
+pipproblem2_SOURCES = pipproblem2.cc
+pipproblem3_SOURCES = pipproblem3.cc
+weightwatch1_SOURCES = weightwatch1.cc
+
+#EXTRA_DIST =
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/PIP_Problem/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/PIP_Problem/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) $(EXTRA_exceptions1_DEPENDENCIES) 
+	@rm -f exceptions1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+
+pipproblem1$(EXEEXT): $(pipproblem1_OBJECTS) $(pipproblem1_DEPENDENCIES) $(EXTRA_pipproblem1_DEPENDENCIES) 
+	@rm -f pipproblem1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(pipproblem1_OBJECTS) $(pipproblem1_LDADD) $(LIBS)
+
+pipproblem2$(EXEEXT): $(pipproblem2_OBJECTS) $(pipproblem2_DEPENDENCIES) $(EXTRA_pipproblem2_DEPENDENCIES) 
+	@rm -f pipproblem2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(pipproblem2_OBJECTS) $(pipproblem2_LDADD) $(LIBS)
+
+pipproblem3$(EXEEXT): $(pipproblem3_OBJECTS) $(pipproblem3_DEPENDENCIES) $(EXTRA_pipproblem3_DEPENDENCIES) 
+	@rm -f pipproblem3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(pipproblem3_OBJECTS) $(pipproblem3_LDADD) $(LIBS)
+
+weightwatch1$(EXEEXT): $(weightwatch1_OBJECTS) $(weightwatch1_DEPENDENCIES) $(EXTRA_weightwatch1_DEPENDENCIES) 
+	@rm -f weightwatch1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(weightwatch1_OBJECTS) $(weightwatch1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pipproblem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pipproblem2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/pipproblem3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/weightwatch1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+ascii_dump_load1.log: ascii_dump_load1$(EXEEXT)
+	@p='ascii_dump_load1$(EXEEXT)'; \
+	b='ascii_dump_load1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions1.log: exceptions1$(EXEEXT)
+	@p='exceptions1$(EXEEXT)'; \
+	b='exceptions1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pipproblem1.log: pipproblem1$(EXEEXT)
+	@p='pipproblem1$(EXEEXT)'; \
+	b='pipproblem1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pipproblem2.log: pipproblem2$(EXEEXT)
+	@p='pipproblem2$(EXEEXT)'; \
+	b='pipproblem2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+pipproblem3.log: pipproblem3$(EXEEXT)
+	@p='pipproblem3$(EXEEXT)'; \
+	b='pipproblem3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+weightwatch1.log: weightwatch1$(EXEEXT)
+	@p='weightwatch1$(EXEEXT)'; \
+	b='weightwatch1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/PIP_Problem/ascii_dump_load1.cc b/tests/PIP_Problem/ascii_dump_load1.cc
new file mode 100644
index 0000000..49cd163
--- /dev/null
+++ b/tests/PIP_Problem/ascii_dump_load1.cc
@@ -0,0 +1,295 @@
+/* Test PIP_Problem::ascii_dump() and PIP_Problem::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+
+  PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+  pip1.clear();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  pip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  PIP_Problem pip2;
+  pip2.ascii_load(f);
+  close(f);
+
+  bool ok = pip1.space_dimension() == 0
+    && pip2.space_dimension() == 0
+    && pip1.constraints_begin() == pip1.constraints_end()
+    && pip2.constraints_begin() == pip2.constraints_end();
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  PIP_Problem pip1(3);
+  pip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  pip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  PIP_Problem pip2;
+  pip2.ascii_load(f);
+  close(f);
+
+  bool ok = pip1.space_dimension() == 3
+    && pip2.space_dimension() == 3
+    && pip1.constraints_begin() == pip1.constraints_end()
+    && pip2.constraints_begin() == pip2.constraints_end();
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 0);
+
+  PIP_Problem pip1(1, cs.begin(), cs.end(), Variables_Set());
+  pip1.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+  pip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  pip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  PIP_Problem pip2;
+  pip2.ascii_load(f);
+  close(f);
+
+  bool ok = pip1.space_dimension() == pip2.space_dimension()
+    && 2 == std::distance(pip1.constraints_begin(), pip1.constraints_end())
+    && 2 == std::distance(pip2.constraints_begin(), pip2.constraints_end());
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 5);
+
+  PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  pip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  PIP_Problem pip2;
+  pip2.ascii_load(f);
+  close(f);
+
+  bool ok = pip1.space_dimension() == pip2.space_dimension()
+    && 1 == std::distance(pip1.constraints_begin(), pip1.constraints_end())
+    && 1 == std::distance(pip2.constraints_begin(), pip2.constraints_end());
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  Variable A(0);
+  Variable P(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 0);
+
+  PIP_Problem pip1(2, cs.begin(), cs.end(), Variables_Set(P));
+  pip1.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_ALL);
+  pip1.set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN);
+  pip1.set_big_parameter_dimension(1);
+  pip1.solve();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  pip1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  PIP_Problem pip2;
+  pip2.ascii_load(f);
+  close(f);
+
+  bool ok = pip1.space_dimension() == pip2.space_dimension()
+    && 2 == std::distance(pip1.constraints_begin(), pip1.constraints_end())
+    && 2 == std::distance(pip2.constraints_begin(), pip2.constraints_end());
+
+  return ok;
+}
+
+bool
+test06() {
+  PIP_Problem pip1;
+  using namespace IO_Operators;
+  nout << pip1 << endl;
+  return true;
+}
+
+bool
+test07() {
+  Variable X1(0);
+  Variable X2(1);
+  Variable I0(2);
+  Variable J0(3);
+  Variable N(4);
+  Variables_Set params(I0, N);
+
+  Constraint_System cs;
+  cs.insert(-X1 + N - 1 >= 0);
+  cs.insert(X1 - X2 >= 0);
+  cs.insert(X1 + I0 == N);
+  cs.insert(X2 + J0 - N - 1 >= 0);
+  cs.insert(I0 >= 1);
+  cs.insert(N >= 1);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  (void) pip.solve();
+
+  std::stringstream ss;
+  pip.ascii_dump(ss);
+
+  PIP_Problem pip2;
+  bool ok = pip2.ascii_load(ss);
+
+  std::stringstream ss2;
+  pip2.ascii_dump(ss2);
+
+  ok &= (ss.str() == ss2.str());
+
+  // This further check is mainly made for coverage purposes.
+  memory_size_type total = pip2.total_memory_in_bytes();
+  memory_size_type external = pip2.external_memory_in_bytes();
+  ok &= (external < total);
+
+  return ok;
+}
+
+bool
+test08() {
+  typedef PIP_Tree_Node::Artificial_Parameter Art_Param;
+
+  Variable A(0);
+
+  Art_Param ap1(3*A + 8, -5);
+  std::stringstream ss1;
+  ap1.ascii_dump(ss1);
+
+  Art_Param ap2;
+  bool ok = ap2.ascii_load(ss1);
+
+  std::stringstream ss2;
+  ap2.ascii_dump(ss2);
+
+  ok &= (ap1 == ap2) && (ss1.str() == ss2.str());
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  // Compute the solution tree.
+  (void) pip.solve();
+  // Printing ensures parametric solution values are generated.
+  pip.print_solution(nout);
+
+  std::stringstream ss;
+  pip.ascii_dump(ss);
+
+  PIP_Problem pip2;
+  bool ok = pip2.ascii_load(ss);
+
+  std::stringstream ss2;
+  pip2.ascii_dump(ss2);
+
+  ok &= (ss.str() == ss2.str());
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/PIP_Problem/exceptions1.cc b/tests/PIP_Problem/exceptions1.cc
new file mode 100644
index 0000000..f5bcd0b
--- /dev/null
+++ b/tests/PIP_Problem/exceptions1.cc
@@ -0,0 +1,383 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Constraint_System cs;
+  Variable x(0);
+  Variables_Set params(x);
+
+  try {
+    // This is an incorrect use of the constructor:
+    // the parameters in `params' should be space dimensions
+    // that are valid for the PIP_Problem we are going to build.
+    PIP_Problem pip(0, cs.begin(), cs.end(), params);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test02() {
+  Constraint_System cs;
+
+  try {
+    // This is an incorrect use of the constructor:
+    // invalid space dimension required.
+    PIP_Problem pip(1 + PIP_Problem::max_space_dimension(),
+                    cs.begin(), cs.end(), Variables_Set());
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  try {
+    // This is an incorrect use of the constructor:
+    // invalid space dimension required.
+    PIP_Problem pip(1 + PIP_Problem::max_space_dimension());
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  PIP_Problem pip;
+  try {
+    // Adding too many space dimensions.
+    pip.add_space_dimensions_and_embed(1, PIP_Problem::max_space_dimension());
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable X(0);
+  Variable Y(1);
+  Variable Z(2);
+  Constraint_System cs;
+  cs.insert(X == 0);
+  cs.insert(Y == 1);
+  cs.insert(Z <= 2);
+
+  try {
+    // This is an incorrect use of the constructor:
+    // the space dimensions of the constraints should not be greater
+    // than the space dimension of the PIP problem.
+    PIP_Problem pip(2, cs.begin(), cs.end(), Variables_Set());
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  PIP_Problem pip;
+  try {
+    // Adding invalid parameter space dimensions.
+    Variable m(4);
+    pip.add_to_parameter_space_dimensions(Variables_Set(m));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  PIP_Problem pip;
+  try {
+    // Adding space dimension incompatible constraint.
+    Variable x(2);
+    pip.add_constraint(x >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test08() {
+  PIP_Problem pip;
+  try {
+    // Setting an invalid control parameter value.
+    pip.set_control_parameter(PIP_Problem::CONTROL_PARAMETER_VALUE_SIZE);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable X1(0);
+  Variable X2(1);
+  Variable I0(2);
+  Variable J0(3);
+  Variable N(4);
+  Variables_Set params(I0, N);
+
+  Constraint_System cs;
+  cs.insert(-X1 + N - 1 >= 0);
+  cs.insert(X1 - X2 >= 0);
+  cs.insert(X1 + I0 == N);
+  cs.insert(X2 + J0 - N - 1 >= 0);
+  cs.insert(I0 >= 1);
+  cs.insert(N >= 1);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  (void) pip.is_satisfiable();
+  // Adding 2 additional space dimensions.
+  pip.add_space_dimensions_and_embed(2, 0);
+
+  try {
+    // Trying to mark a problem variable as a parameter.
+    pip.add_to_parameter_space_dimensions(Variables_Set(X1));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  PIP_Problem pip;
+
+  try {
+    // Trying to set an invalid big parameter dimension.
+    pip.set_big_parameter_dimension(1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable X1(0);
+  Variable X2(1);
+  Variable I0(2);
+  Variable J0(3);
+  Variable N(4);
+  Variables_Set params(I0, N);
+
+  Constraint_System cs;
+  cs.insert(-X1 + N - 1 >= 0);
+  cs.insert(X1 - X2 >= 0);
+  cs.insert(X1 + I0 == N);
+  cs.insert(X2 + J0 - N - 1 >= 0);
+  cs.insert(I0 >= 1);
+  cs.insert(N >= 1);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  (void) pip.is_satisfiable();
+  // Adding 2 additional space dimensions.
+  pip.add_space_dimensions_and_embed(2, 0);
+
+  try {
+    // Trying to set an invalid big parameter dimension.
+    pip.set_big_parameter_dimension(3);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  typedef PIP_Tree_Node::Artificial_Parameter Art_Param;
+  Variable A(0);
+
+  try {
+    // Trying to set an invalid (zero) denominator.
+    Art_Param ap(3*A + 8, 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  PIP_Problem pip;
+  try {
+    // Printing the solution before trying to solve the problem.
+    pip.print_solution(nout);
+  }
+  catch (std::logic_error& e) {
+    nout << "logic_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  (void) pip.solve();
+
+  const PIP_Decision_Node* root = pip.solution()->as_decision();
+  const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+  const PIP_Solution_Node* t_t_child = t_child->child_node(true)->as_solution();
+
+  try {
+    // It is illegal to ask for the parametric value of a parameter.
+    (void) t_t_child->parametric_values(n);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  (void) pip.solve();
+
+  const PIP_Decision_Node* root = pip.solution()->as_decision();
+  const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+  const PIP_Solution_Node* t_t_child = t_child->child_node(true)->as_solution();
+
+  try {
+    // It is illegal to ask for the parametric value of a variable
+    // having space dimension greater than that o fthe problem.
+    (void) t_t_child->parametric_values(Variable(4));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST_F8(test14);
+  DO_TEST_F8(test15);
+END_MAIN
diff --git a/tests/PIP_Problem/pipproblem1.cc b/tests/PIP_Problem/pipproblem1.cc
new file mode 100644
index 0000000..21e0f7c
--- /dev/null
+++ b/tests/PIP_Problem/pipproblem1.cc
@@ -0,0 +1,813 @@
+/* Test the PIP_Problem class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable X1(0);
+  Variable X2(1);
+  Variable I0(2);
+  Variable J0(3);
+  Variable N(4);
+  Variables_Set params(I0, N);
+
+  Constraint_System cs;
+  cs.insert(-X1 + N - 1 >= 0);
+  cs.insert(X1 - X2 >= 0);
+  cs.insert(X1 + I0 == N);
+  cs.insert(X2 + J0 - N - 1 >= 0);
+  cs.insert(I0 >= 1);
+  cs.insert(N >= 1);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  //cs.insert(j >= 0);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+
+    // Programmatically check the expected solution.
+    const PIP_Decision_Node* root = solution->as_decision();
+    if (root == 0)
+      return false;
+    {
+      // Check the root node.
+      if (root->art_parameter_count() != 0)
+        return false;
+      const Constraint_System& cs = root->constraints();
+      if (std::distance(cs.begin(), cs.end()) != 1)
+        return false;
+      const Constraint& c = *cs.begin();
+      if (!(c.is_inequality()
+            && c.coefficient(n) == 1
+            && c.coefficient(m) == 0
+            && c.inhomogeneous_term() == -2))
+        return false;
+    }
+    if (root->child_node(true) == 0 || root->child_node(false) != 0)
+      return false;
+    const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+    if (t_child == 0)
+      return false;
+    {
+      // Check t_child node context.
+      if (t_child->art_parameter_count() != 0)
+        return false;
+      const Constraint_System& cs = t_child->constraints();
+      if (std::distance(cs.begin(), cs.end()) != 1)
+        return false;
+      const Constraint& c = *cs.begin();
+      if (!(c.is_inequality()
+            && c.coefficient(n) == 0
+            && c.coefficient(m) == 1
+            && c.inhomogeneous_term() == -2))
+        return false;
+      // Dummy print of (non-root) tree node to increase code coverage.
+      using namespace IO_Operators;
+      nout << "\nPrinting the root's true child subtree:\n";
+      nout << (*t_child) << endl;
+    }
+    if (t_child->child_node(true) == 0 || t_child->child_node(false) == 0)
+      return false;
+    const PIP_Solution_Node* t_t_child
+      = t_child->child_node(true)->as_solution();
+    if (t_t_child == 0)
+      return false;
+    {
+      // Check t_t_child node.
+      if (t_t_child->art_parameter_count() != 0)
+        return false;
+      const Constraint_System& cs = t_t_child->constraints();
+      if (std::distance(cs.begin(), cs.end()) != 0)
+        return false;
+      const Linear_Expression& v_i = t_t_child->parametric_values(i);
+      if (!(v_i.coefficient(n) == 0
+            && v_i.coefficient(m) == 0
+            && v_i.inhomogeneous_term() == 2))
+        return false;
+      const Linear_Expression& v_j = t_t_child->parametric_values(j);
+      if (!(v_j.coefficient(n) == 0
+            && v_j.coefficient(m) == 0
+            && v_j.inhomogeneous_term() == 2))
+        return false;
+    }
+    const PIP_Solution_Node* t_f_child
+      = t_child->child_node(false)->as_solution();
+    if (t_f_child == 0)
+      return false;
+    {
+      // Check t_f_child node.
+      // Check artificial parameter.
+      if (t_f_child->art_parameter_count() != 1)
+        return false;
+      const PIP_Tree_Node::Artificial_Parameter& ap
+        = *(t_f_child->art_parameter_begin());
+      if (!(ap.coefficient(n) == 0
+            && ap.coefficient(m) == 1
+            && ap.denominator() == 2))
+        return false;
+      // Check context.
+      const Constraint_System& cs = t_f_child->constraints();
+      if (std::distance(cs.begin(), cs.end()) != 1)
+        return false;
+      const Constraint& c = *cs.begin();
+      if (!(c.is_inequality()
+            && c.coefficient(n) == 2
+            && c.coefficient(m) == 3
+            && c.inhomogeneous_term() == -8))
+        return false;
+      // Check parametric values.
+      Variable art_p(4);
+      const Linear_Expression& v_i = t_f_child->parametric_values(i);
+      if (!(v_i.coefficient(n) == 0
+            && v_i.coefficient(m) == -1
+            && v_i.coefficient(art_p) == -1
+            && v_i.inhomogeneous_term() == 4))
+        return false;
+      const Linear_Expression& v_j = t_f_child->parametric_values(j);
+      if (!(v_j.coefficient(n) == 0
+            && v_j.coefficient(m) == 1
+            && v_j.coefficient(art_p) == 0
+            && v_j.inhomogeneous_term() == 0))
+        return false;
+    }
+  }
+  return ok;
+}
+
+bool
+test03() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+  Variable m(3);
+  Variable n(4);
+  Variables_Set params(k, n);
+
+  Constraint_System cs;
+  cs.insert(i <= m);
+  cs.insert(j <= n);
+  cs.insert(2*i+j == 2*m+n-k);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+  Variable m(3);
+  Variable n(4);
+  Variables_Set params(k, n);
+
+  Constraint_System cs;
+  cs.insert(i <= m);
+  cs.insert(j <= n);
+  cs.insert(2*i+j == 2*m+n-k);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  // Test copy constructor.
+  {
+    PIP_Problem pip_copy = pip;
+    // Here we call the destructor of pip_copy
+    // and we also destroy the (copied) solution tree of pip_copy.
+    const PIP_Tree solution = pip_copy.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable m(2);
+  Variable n(3);
+  Variables_Set params(m, n);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(i <= n);
+  cs.insert(j <= m);
+  cs.insert(n >= 3);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable i(0);
+  Variable n(1);
+  Variables_Set params(n);
+
+  Constraint_System cs;
+  cs.insert(4*i + 2*n == 1);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+  if (ok)
+    pip.print_solution(nout);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable i(0);
+  Variable j(1);
+  Variable m(2);
+  Variable n(3);
+  Variables_Set params(m, n);
+
+  PIP_Problem pip(4);
+  pip.add_to_parameter_space_dimensions(params);
+
+  pip.add_constraint(3*j >= -2*i+8);
+  pip.add_constraint(j <= 4*i - 4);
+  pip.add_constraint(i <= n);
+  pip.add_constraint(n >= 3);
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  pip.add_constraint(j <= m);
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable i(0);
+  Variable j(1);
+  Variable m(2);
+  Variable n(3);
+  Variables_Set params(m, n);
+
+  PIP_Problem pip(4);
+  pip.add_to_parameter_space_dimensions(params);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(i <= n);
+  cs.insert(n >= 3);
+  cs.insert(j <= m);
+
+  pip.add_constraints(cs);
+
+  pip.set_control_parameter(PIP_Problem::PIVOT_ROW_STRATEGY_MAX_COLUMN);
+
+  bool ok = pip.is_satisfiable();
+  if (ok) {
+    const PIP_Tree solution = pip.optimizing_solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+    pip.clear();
+  }
+
+  return ok;
+}
+
+bool
+test09() {
+  // Same problem as test02, but using CUTTING_STRATEGY_DEEPEST.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  //cs.insert(j >= 0);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test10() {
+  // Same problem as test02, but using CUTTING_STRATEGY_ALL.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  //cs.insert(j >= 0);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_ALL);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test11() {
+  // 0-dimension trivial PIP problem.
+  PIP_Problem pip;
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test12() {
+  // Trivial PIP problem, but with 4 parameters.
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(0, 4);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test13() {
+  // Trivial PIP problem with 4 variables.
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(4, 0);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test14() {
+  // Trivial PIP problem with 4 variables and 4 parameters.
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(4, 4);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test15() {
+  PIP_Problem pip;
+  // Adding trivial satisfiable constraint.
+  pip.add_constraint(Linear_Expression(5) == 5);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test16() {
+  PIP_Problem pip;
+  // Adding trivial unsatisfiable constraint.
+  pip.add_constraint(Linear_Expression(0) == 1);
+  bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+  if (pip.solution() != 0)
+    pip.print_solution(nout);
+  return ok;
+}
+
+bool
+test17() {
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(0, 1);
+  // Adding unsatisfiable context constraints.
+  Variable n(0);
+  pip.add_constraint(n <= 5);
+  pip.add_constraint(n >= 10);
+  bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+  if (pip.solution() != 0)
+    pip.print_solution(nout);
+  return ok;
+}
+
+bool
+test18() {
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(0, 2);
+  // Adding unsatisfiable context constraints.
+  Variable n(0);
+  Variable m(1);
+  pip.add_constraint(n == 2);
+  pip.add_constraint(m == 2);
+  pip.add_constraint(n + m == 3);
+  bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+  if (pip.solution() != 0)
+    pip.print_solution(nout);
+  return ok;
+}
+
+bool
+test19() {
+  // Same problem as test02, but incrementally adding a parameter constraint
+  // making the problem unfeasible.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  pip.add_constraint(n <= 1);
+  ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test20() {
+  // Same problem as test02, but incrementally adding a parameter constraint
+  // making the solution tree simpler.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  pip.add_constraint(7*m >= 12);
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test21() {
+  // Same problem as test02, but incrementally adding a parameter constraint
+  // making the solution tree simpler.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  pip.add_constraint(7*m < 12);
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test22() {
+  // Same problem as test02, but incrementally adding two parameter constraints
+  // making the problem infeasible.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  pip.add_constraint(7*m < 12);
+  pip.add_constraint(2*n + 3*m < 8);
+  ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test23() {
+  // Same problem as test02, but incrementally adding a parameter constraint
+  // removing one level in the decision tree.
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  pip.add_constraint(7*n >= 10);
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test24() {
+  // Minimization problem, using the big parameter trick to allow the
+  // variables to be negative.
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable M(3);
+  Variables_Set params(p, M);
+
+  Constraint_System cs;
+  cs.insert(y - M >= -2*x + 2*M - 4);     // y >= -2*x - 4
+  cs.insert(2*y - 2*M <= x - M + 2*p);    // 2*y <= x + 2*p
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_big_parameter_dimension(3);     // M is the big parameter
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test25() {
+  // Lexicographical maximization, using variable substitution.
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable M(3);
+  Variables_Set params(p, M);
+
+  Constraint_System cs;
+  cs.insert(M - y >= 2*M - 2*x - 4);      // y >= 2*x - 4
+  cs.insert(M - y <= -M + x + p);         // y <= -x + p
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  pip.set_big_parameter_dimension(3);     // M is the big parameter
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+bool
+test26() {
+  // Problem generating a solution node with two context constraints.
+  Variable x(0);
+  Variable y(1);
+  Variable p(2);
+  Variable q(3);
+  Variables_Set params(p, q);
+
+  Constraint_System cs;
+  cs.insert(x + p <= 2);
+  cs.insert(y + q <= 1);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F8(test05);
+  DO_TEST(test06);
+  DO_TEST_F8(test07);
+  DO_TEST_F8(test08);
+  DO_TEST_F8(test09);
+  DO_TEST_F8(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST_F8(test19);
+  DO_TEST_F8(test20);
+  DO_TEST_F8(test21);
+  DO_TEST_F8(test22);
+  DO_TEST_F8(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
+  DO_TEST(test26);
+END_MAIN
diff --git a/tests/PIP_Problem/pipproblem2.cc b/tests/PIP_Problem/pipproblem2.cc
new file mode 100644
index 0000000..dcf0562
--- /dev/null
+++ b/tests/PIP_Problem/pipproblem2.cc
@@ -0,0 +1,349 @@
+/* Test the PIP_Problem class
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable P(2);
+  Variable Q(3);
+  Variables_Set params(P, Q);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 0);
+  cs.insert(A - B <= P);
+  cs.insert(3*A - 2*B == 5*Q);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.space_dimension() == 4);
+
+  pip.add_space_dimensions_and_embed(2, 2);
+  ok &= (pip.space_dimension() == 8);
+  params.insert(Variable(6));
+  params.insert(Variable(7));
+  ok &= (pip.parameter_space_dimensions() == params);
+
+  for (PIP_Problem::const_iterator i = pip.constraints_begin(),
+         i_end = pip.constraints_end(); i != i_end; ++i)
+    print_constraint(*i);
+
+  return ok;
+}
+
+bool
+test02() {
+  PIP_Problem pip_1(2);
+  PIP_Problem pip_2(2);
+  pip_2 = pip_1;
+
+  Variables_Set params(Variable(1));
+  pip_2.add_to_parameter_space_dimensions(params);
+
+  swap(pip_1, pip_2);
+
+  bool ok = (pip_1.space_dimension() == 2
+             && pip_2.space_dimension() == 2
+             && pip_1.parameter_space_dimensions() == params
+             && pip_2.parameter_space_dimensions() == Variables_Set());
+
+  return ok;
+}
+
+bool
+test03() {
+  PIP_Problem pip;
+  PIP_Problem::Control_Parameter_Value cp;
+
+  cp = pip.get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+  bool ok = (cp == PIP_Problem::CUTTING_STRATEGY_FIRST);
+
+  pip.set_control_parameter(PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+  cp = pip.get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+  ok &= (cp == PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+
+  PIP_Problem pip_copy(pip);
+  cp = pip_copy.get_control_parameter(PIP_Problem::CUTTING_STRATEGY);
+  ok &= (cp == PIP_Problem::CUTTING_STRATEGY_DEEPEST);
+
+  return ok;
+}
+
+bool
+test04() {
+  PIP_Problem pip(6);
+  Variables_Set params(Variable(3), Variable(5));
+  pip.add_to_parameter_space_dimensions(params);
+
+  bool ok = (pip.get_big_parameter_dimension() == not_a_dimension());
+
+  pip.set_big_parameter_dimension(3);
+  ok &= (pip.get_big_parameter_dimension() == 3);
+
+  pip.set_big_parameter_dimension(5);
+  ok &= (pip.get_big_parameter_dimension() == 5);
+
+  using namespace IO_Operators;
+  nout << pip;
+
+  return ok;
+}
+
+bool
+test05() {
+  PIP_Problem pip(1);
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  // Solving again a problem already optimized.
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable X(0);
+  PIP_Problem pip(1);
+  pip.add_constraint(X == -X);
+  pip.add_constraint(X >= 1);
+
+  bool ok = (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+  // Solving again a problem already detected to be unfeasible.
+  ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable X(0);
+  PIP_Problem pip(1);
+  pip.add_constraint(X == -X);
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+  // Incrementally adding a constraint.
+  pip.add_constraint(X >= 1);
+  // Solving a problem that was optimized and now is unfeasible.
+  ok &= (pip.solve() == UNFEASIBLE_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable X(0);
+  Variable Y(1);
+  Variable Z(2);
+
+  Constraint_System cs;
+  cs.insert(X == 2);
+  cs.insert(Y < 1);
+  cs.insert(Z == 7);
+
+  Variables_Set params(Y, Z);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable X(0);
+  Variable Y(1);
+  Variable Z(2);
+
+  PIP_Problem pip(3);
+  pip.add_constraint(X == 2);
+  pip.add_constraint(Y < 1);
+  pip.add_constraint(Z == 7);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 5);
+
+  PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+  bool ok = (pip1.solve() == OPTIMIZED_PIP_PROBLEM);
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 5);
+
+  PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+  bool ok = (pip1.solution() != 0);
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Constraint_System cs;
+  cs.insert(A >= 5);
+
+  PIP_Problem pip1(3, cs.begin(), cs.end(), Variables_Set());
+  bool ok = (pip1.optimizing_solution() != 0);
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+  Variable m(3);
+  Variable n(4);
+  Variables_Set params(k, n);
+
+  Constraint_System cs;
+  cs.insert(i <= m);
+  cs.insert(j <= n);
+  cs.insert(2*i+j == 2*m+n-k);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+  PIP_Tree pip_tree = pip.solution();
+  const PIP_Solution_Node* sol_node = pip_tree->as_solution();
+  const PIP_Decision_Node* dec_node = pip_tree->as_decision();
+  bool ok = (sol_node == 0 && dec_node != 0);
+
+  return ok;
+}
+
+bool
+test14() {
+  // Some unit testing on inner class Artificial_Parameter.
+  typedef PIP_Tree_Node::Artificial_Parameter Art_Param;
+
+  Variable A(0);
+
+  Art_Param ap0;
+  Art_Param ap1(3*A + 8, -5);
+  Art_Param ap2(ap1);
+
+  bool ok = ap0.OK() && ap1.OK() && ap2.OK();
+
+  ok &= (ap0 != ap1) && (ap1 == ap2);
+  ok &= (ap0.denominator() == 1) && (ap1.denominator() == 5);
+
+  swap(ap0, ap2);
+  ok &= (ap0 == ap1) && (ap2.denominator() == 1);
+
+  using namespace IO_Operators;
+  nout << ap1 << endl;
+
+  ok &= (ap1.external_memory_in_bytes() < ap1.total_memory_in_bytes());
+
+  // Difference found in space dimension.
+  ok &= (ap1 != ap2);
+  // Difference found in denominator.
+  Art_Param ap3(3*A + 8, -6);
+  ok &= (ap1 != ap3);
+  // Difference found in inhomogeneous term.
+  Art_Param ap4(3*A + 7, -5);
+  ok &= (ap1 != ap4);
+  // Difference found in A's coefficient.
+  Art_Param ap5(2*A + 8, -5);
+  ok &= (ap1 != ap5);
+
+  return ok;
+}
+
+bool
+test15() {
+  PIP_Problem pip;
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  // Adding no space dimension at all is a no-op:
+  // it does not invalidate the solution computed before.
+  pip.add_space_dimensions_and_embed(0, 0);
+  // This would throw an exception if the solution was invalidated.
+  pip.print_solution(nout);
+  return ok;
+}
+
+bool
+test16() {
+  // NOTE: adopting a strange dimension ordering to increase code coverage.
+  Variable i(2);
+  Variable j(3);
+  Variable n(0);
+  Variable m(1);
+  Variables_Set params(n, m);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  cs.insert(j <= m);
+  cs.insert(i <= n);
+
+  PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+  (void) pip.solve();
+
+  const PIP_Decision_Node* root = pip.solution()->as_decision();
+  const PIP_Decision_Node* t_child = root->child_node(true)->as_decision();
+  const PIP_Solution_Node* t_t_child = t_child->child_node(true)->as_solution();
+  const Linear_Expression& v_i = t_t_child->parametric_values(i);
+  bool ok = v_i.coefficient(n) == 0
+    && v_i.coefficient(m) == 0
+    && v_i.inhomogeneous_term() == 2;
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST_F8(test16);
+END_MAIN
diff --git a/tests/PIP_Problem/pipproblem3.cc b/tests/PIP_Problem/pipproblem3.cc
new file mode 100644
index 0000000..a876364
--- /dev/null
+++ b/tests/PIP_Problem/pipproblem3.cc
@@ -0,0 +1,179 @@
+/* Test the PIP_Problem class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(2, 0);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+
+  pip.add_constraints(cs);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (!ok)
+    return ok;
+
+  {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+    nout << endl;
+  }
+
+  pip.add_space_dimensions_and_embed(0, 2);
+  pip.add_constraint(j <= m);
+  pip.add_constraint(i <= n);
+
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test02() {
+  // NOTE_ changing the order of insertion of variables.
+  Variable i(0);
+  Variable n(1);
+  Variable j(2);
+  Variable m(3);
+
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(1, 1);
+
+  Constraint_System cs;
+  pip.add_constraint(i <= n);
+
+  pip.add_constraints(cs);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (!ok)
+    return ok;
+
+  {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+    nout << endl;
+  }
+
+  pip.add_space_dimensions_and_embed(1, 1);
+  pip.add_constraint(3*j >= -2*i+8);
+  pip.add_constraint(j <= 4*i - 4);
+  pip.add_constraint(j <= m);
+
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test03() {
+  Variable i(0);
+  Variable j(1);
+  Variable n(2);
+  Variable m(3);
+
+  PIP_Problem pip;
+  pip.add_space_dimensions_and_embed(2, 2);
+
+  Constraint_System cs;
+  cs.insert(3*j >= -2*i+8);
+  cs.insert(j <= 4*i - 4);
+  pip.add_constraint(j <= m);
+  pip.add_constraint(i <= n);
+
+  pip.add_constraints(cs);
+
+  bool ok = (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (!ok)
+    return ok;
+
+  {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+    nout << endl;
+  }
+
+  Variable k(4);
+  Variable p(5);
+  pip.add_space_dimensions_and_embed(1, 1);
+  pip.add_constraint(k <= i + p);
+  pip.add_constraint(p <= n + 2);
+
+  ok &= (pip.solve() == OPTIMIZED_PIP_PROBLEM);
+  if (ok) {
+    const PIP_Tree solution = pip.solution();
+    ok &= solution->OK();
+    pip.print_solution(nout);
+  }
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A == B);
+  cs.insert(A == -1);
+
+  PIP_Problem pip(2);
+  pip.add_constraints(cs);
+
+  bool ok = !pip.is_satisfiable();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/PIP_Problem/weightwatch1.cc b/tests/PIP_Problem/weightwatch1.cc
new file mode 100644
index 0000000..0d65f8f
--- /dev/null
+++ b/tests/PIP_Problem/weightwatch1.cc
@@ -0,0 +1,187 @@
+/* Test PIP_Problem (and MIP_Problem) with respect to deterministic timeouts.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <fstream>
+
+using namespace IO_Operators;
+
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher<Weightwatch_Traits> Weightwatch;
+
+class Deterministic_Timeout
+  : virtual public std::exception,
+    public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "deterministic timeout in weightwatch1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  ~Deterministic_Timeout() throw() {
+  }
+};
+
+void too_fat() {
+  throw Deterministic_Timeout();
+}
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+  Variable S(18);
+  Variable T(19);
+  Variable U(20);
+  Variable V(21);
+  Variable W(22);
+  Variable X(23);
+  Variable Y(24);
+  Variable Z(25);
+  Variable A1(26);
+  Variable B1(27);
+  Variable C1(28);
+  Variable D1(29);
+  Variable E1(30);
+  Variable F1(31);
+  Variables_Set params;
+
+  Constraint_System cs;
+  cs.insert(162*B + D + 9*F + 1620*H - F1 == 0);
+  cs.insert(E1 == 0);
+  cs.insert(D1 == 1);
+  cs.insert(162*B + D + 9*F + 1620*H - C1 == 0);
+  cs.insert(B1 == 0);
+  cs.insert(A1 == 1);
+  cs.insert(162*B + D + 9*F + 1620*H - 162*O - Q - 9*S - 1620*Z == 0);
+  cs.insert(O - Y == 0);
+  cs.insert(S - X == 0);
+  cs.insert(Q - W == 0);
+  cs.insert(V == 0);
+  cs.insert(162*B + D + 9*F + 1620*H - 162*O - Q - 9*S - 1620*U == 0);
+  cs.insert(T == 0);
+  cs.insert(R == 0);
+  cs.insert(P == 0);
+  cs.insert(N == 0);
+  cs.insert(H - M == 0);
+  cs.insert(B - L == 0);
+  cs.insert(F - K == 0);
+  cs.insert(D - J == 0);
+  cs.insert(I == 0);
+  cs.insert(G == 0);
+  cs.insert(E == 0);
+  cs.insert(C == 0);
+  cs.insert(A == 0);
+  cs.insert(B - O >= 1);
+  cs.insert(D >= 0);
+  cs.insert(-162*B - D - 9*F - 1620*H + 162*O + Q + 9*S >= -6480);
+  cs.insert(-B >= -9);
+  cs.insert(-D >= -8);
+  cs.insert(-F >= -17);
+  cs.insert(F >= 0);
+  cs.insert(-Q >= -8);
+  cs.insert(-S >= -17);
+  cs.insert(S >= 0);
+  cs.insert(Q >= 0);
+  cs.insert(O >= 0);
+  cs.insert(H >= 0);
+
+  try {
+    PIP_Problem pip(cs.space_dimension(), cs.begin(), cs.end(), params);
+
+    Weightwatch ww(200000000, too_fat);
+
+    (void) pip.is_satisfiable();
+
+    // Should not get there.
+    return false;
+  }
+  // Note: other exceptions are just propagated.
+  catch (const Deterministic_Timeout& e) {
+    // Expected timeout exception.
+    nout << endl << e.what() << endl;
+
+    try {
+      MIP_Problem mip(cs.space_dimension(), cs.begin(), cs.end(), params);
+      // Set all variable to be constrained to have an integer value.
+      mip.add_to_integer_space_dimensions(Variables_Set(A, F1));
+
+      Weightwatch ww(4000000, too_fat);
+
+      if (mip.is_satisfiable()) {
+        nout << "mip is satisfiable?!" << endl;
+        return false;
+      }
+
+      return true;
+    }
+    // Note: other exceptions are just propagated.
+    catch (const Deterministic_Timeout& e) {
+      // Unexpected timeout exception.
+      nout << endl << e.what() << endl;
+      return false;
+    }
+
+    // Should never get here.
+    return false;
+  }
+
+  // Should never get here.
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/Makefile.am b/tests/Partially_Reduced_Product/Makefile.am
new file mode 100644
index 0000000..b803761
--- /dev/null
+++ b/tests/Partially_Reduced_Product/Makefile.am
@@ -0,0 +1,228 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+noinst_HEADERS = \
+partially_reduced_product_test.hh
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/tests/Partially_Reduced_Product \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruences1 \
+affineimage1 \
+asciidumpload1 \
+bounded1 \
+boundedaffineimage1 \
+bounds1 \
+concatenate1 \
+congruences1 \
+congruencesproduct1 \
+constraints1 \
+constraintsproduct1 \
+contains1 \
+difference1 \
+dimension1 \
+directproduct1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+equals1 \
+frombdshape1 \
+frombox1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromproduct1 \
+generalizedaffineimage1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+maxmin1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 \
+shapepreservingproduct1 \
+smashproduct1 \
+spacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+upperbound1
+
+REVERSED_TESTS = \
+reverse_constraints1 \
+reverse_congruences1 \
+reverse_directproduct1 \
+reverse_constraintsproduct1 \
+reverse_congruencesproduct1 \
+reverse_shapepreservingproduct1
+
+TESTS = \
+$(ORIGINAL_TESTS) \
+$(REVERSED_TESTS)
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+asciidumpload1_SOURCES = asciidumpload1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+congruencesproduct1_SOURCES = congruencesproduct1.cc
+
+constraintsproduct1_SOURCES = constraintsproduct1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+difference1_SOURCES = difference1.cc
+
+dimension1_SOURCES = dimension1.cc
+
+directproduct1_SOURCES = directproduct1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+
+equals1_SOURCES = equals1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromproduct1_SOURCES = fromproduct1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+isempty1_SOURCES = isempty1.cc
+
+isuniverse1_SOURCES = isuniverse1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+
+shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+
+smashproduct1_SOURCES = smashproduct1.cc
+
+spacedims1_SOURCES = spacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+DERIVED_CXXFLAGS = -DREVERSED_TESTS $(AM_CXXFLAGS)
+
+reverse_congruences1_SOURCES = congruences1.cc
+reverse_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_constraints1_SOURCES = constraints1.cc
+reverse_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_directproduct1_SOURCES = directproduct1.cc
+reverse_directproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_constraintsproduct1_SOURCES = constraintsproduct1.cc
+reverse_constraintsproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_congruencesproduct1_SOURCES = congruencesproduct1.cc
+reverse_congruencesproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+reverse_shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+reverse_shapepreservingproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Partially_Reduced_Product/Makefile.in b/tests/Partially_Reduced_Product/Makefile.in
new file mode 100644
index 0000000..e8ba3be
--- /dev/null
+++ b/tests/Partially_Reduced_Product/Makefile.in
@@ -0,0 +1,2234 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_3)
+subdir = tests/Partially_Reduced_Product
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(noinst_HEADERS) $(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruences1$(EXEEXT) affineimage1$(EXEEXT) \
+	asciidumpload1$(EXEEXT) bounded1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) bounds1$(EXEEXT) \
+	concatenate1$(EXEEXT) congruences1$(EXEEXT) \
+	congruencesproduct1$(EXEEXT) constraints1$(EXEEXT) \
+	constraintsproduct1$(EXEEXT) contains1$(EXEEXT) \
+	difference1$(EXEEXT) dimension1$(EXEEXT) \
+	directproduct1$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+	dropsomenonintegerpoints1$(EXEEXT) equals1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) frompolyhedron1$(EXEEXT) \
+	fromproduct1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	intersection1$(EXEEXT) isempty1$(EXEEXT) isuniverse1$(EXEEXT) \
+	maxmin1$(EXEEXT) refinewithcongruences1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+	shapepreservingproduct1$(EXEEXT) smashproduct1$(EXEEXT) \
+	spacedims1$(EXEEXT) timeelapse1$(EXEEXT) topclosed1$(EXEEXT) \
+	topclosure1$(EXEEXT) upperbound1$(EXEEXT)
+am__EXEEXT_2 = reverse_constraints1$(EXEEXT) \
+	reverse_congruences1$(EXEEXT) reverse_directproduct1$(EXEEXT) \
+	reverse_constraintsproduct1$(EXEEXT) \
+	reverse_congruencesproduct1$(EXEEXT) \
+	reverse_shapepreservingproduct1$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_asciidumpload1_OBJECTS = asciidumpload1.$(OBJEXT)
+asciidumpload1_OBJECTS = $(am_asciidumpload1_OBJECTS)
+asciidumpload1_LDADD = $(LDADD)
+asciidumpload1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruencesproduct1_OBJECTS = congruencesproduct1.$(OBJEXT)
+congruencesproduct1_OBJECTS = $(am_congruencesproduct1_OBJECTS)
+congruencesproduct1_LDADD = $(LDADD)
+congruencesproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraintsproduct1_OBJECTS = constraintsproduct1.$(OBJEXT)
+constraintsproduct1_OBJECTS = $(am_constraintsproduct1_OBJECTS)
+constraintsproduct1_LDADD = $(LDADD)
+constraintsproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dimension1_OBJECTS = dimension1.$(OBJEXT)
+dimension1_OBJECTS = $(am_dimension1_OBJECTS)
+dimension1_LDADD = $(LDADD)
+dimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_directproduct1_OBJECTS = directproduct1.$(OBJEXT)
+directproduct1_OBJECTS = $(am_directproduct1_OBJECTS)
+directproduct1_LDADD = $(LDADD)
+directproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS =  \
+	dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS =  \
+	$(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromproduct1_OBJECTS = fromproduct1.$(OBJEXT)
+fromproduct1_OBJECTS = $(am_fromproduct1_OBJECTS)
+fromproduct1_LDADD = $(LDADD)
+fromproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_isempty1_OBJECTS = isempty1.$(OBJEXT)
+isempty1_OBJECTS = $(am_isempty1_OBJECTS)
+isempty1_LDADD = $(LDADD)
+isempty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_isuniverse1_OBJECTS = isuniverse1.$(OBJEXT)
+isuniverse1_OBJECTS = $(am_isuniverse1_OBJECTS)
+isuniverse1_LDADD = $(LDADD)
+isuniverse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_reverse_congruences1_OBJECTS =  \
+	reverse_congruences1-congruences1.$(OBJEXT)
+reverse_congruences1_OBJECTS = $(am_reverse_congruences1_OBJECTS)
+reverse_congruences1_LDADD = $(LDADD)
+reverse_congruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+reverse_congruences1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_reverse_congruencesproduct1_OBJECTS =  \
+	reverse_congruencesproduct1-congruencesproduct1.$(OBJEXT)
+reverse_congruencesproduct1_OBJECTS =  \
+	$(am_reverse_congruencesproduct1_OBJECTS)
+reverse_congruencesproduct1_LDADD = $(LDADD)
+reverse_congruencesproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+reverse_congruencesproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_reverse_constraints1_OBJECTS =  \
+	reverse_constraints1-constraints1.$(OBJEXT)
+reverse_constraints1_OBJECTS = $(am_reverse_constraints1_OBJECTS)
+reverse_constraints1_LDADD = $(LDADD)
+reverse_constraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+reverse_constraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_reverse_constraintsproduct1_OBJECTS =  \
+	reverse_constraintsproduct1-constraintsproduct1.$(OBJEXT)
+reverse_constraintsproduct1_OBJECTS =  \
+	$(am_reverse_constraintsproduct1_OBJECTS)
+reverse_constraintsproduct1_LDADD = $(LDADD)
+reverse_constraintsproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+reverse_constraintsproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_reverse_directproduct1_OBJECTS =  \
+	reverse_directproduct1-directproduct1.$(OBJEXT)
+reverse_directproduct1_OBJECTS = $(am_reverse_directproduct1_OBJECTS)
+reverse_directproduct1_LDADD = $(LDADD)
+reverse_directproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+reverse_directproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_reverse_shapepreservingproduct1_OBJECTS = reverse_shapepreservingproduct1-shapepreservingproduct1.$(OBJEXT)
+reverse_shapepreservingproduct1_OBJECTS =  \
+	$(am_reverse_shapepreservingproduct1_OBJECTS)
+reverse_shapepreservingproduct1_LDADD = $(LDADD)
+reverse_shapepreservingproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+reverse_shapepreservingproduct1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_shapepreservingproduct1_OBJECTS =  \
+	shapepreservingproduct1.$(OBJEXT)
+shapepreservingproduct1_OBJECTS =  \
+	$(am_shapepreservingproduct1_OBJECTS)
+shapepreservingproduct1_LDADD = $(LDADD)
+shapepreservingproduct1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_smashproduct1_OBJECTS = smashproduct1.$(OBJEXT)
+smashproduct1_OBJECTS = $(am_smashproduct1_OBJECTS)
+smashproduct1_LDADD = $(LDADD)
+smashproduct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_spacedims1_OBJECTS = spacedims1.$(OBJEXT)
+spacedims1_OBJECTS = $(am_spacedims1_OBJECTS)
+spacedims1_LDADD = $(LDADD)
+spacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addcongruences1_SOURCES) $(affineimage1_SOURCES) \
+	$(asciidumpload1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) $(bounds1_SOURCES) \
+	$(concatenate1_SOURCES) $(congruences1_SOURCES) \
+	$(congruencesproduct1_SOURCES) $(constraints1_SOURCES) \
+	$(constraintsproduct1_SOURCES) $(contains1_SOURCES) \
+	$(difference1_SOURCES) $(dimension1_SOURCES) \
+	$(directproduct1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(dropsomenonintegerpoints1_SOURCES) \
+	$(equals1_SOURCES) $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(fromproduct1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) $(intersection1_SOURCES) \
+	$(isempty1_SOURCES) $(isuniverse1_SOURCES) $(maxmin1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(reverse_congruences1_SOURCES) \
+	$(reverse_congruencesproduct1_SOURCES) \
+	$(reverse_constraints1_SOURCES) \
+	$(reverse_constraintsproduct1_SOURCES) \
+	$(reverse_directproduct1_SOURCES) \
+	$(reverse_shapepreservingproduct1_SOURCES) \
+	$(shapepreservingproduct1_SOURCES) $(smashproduct1_SOURCES) \
+	$(spacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+	$(upperbound1_SOURCES)
+DIST_SOURCES = $(addcongruences1_SOURCES) $(affineimage1_SOURCES) \
+	$(asciidumpload1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) $(bounds1_SOURCES) \
+	$(concatenate1_SOURCES) $(congruences1_SOURCES) \
+	$(congruencesproduct1_SOURCES) $(constraints1_SOURCES) \
+	$(constraintsproduct1_SOURCES) $(contains1_SOURCES) \
+	$(difference1_SOURCES) $(dimension1_SOURCES) \
+	$(directproduct1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(dropsomenonintegerpoints1_SOURCES) \
+	$(equals1_SOURCES) $(frombdshape1_SOURCES) $(frombox1_SOURCES) \
+	$(fromgrid1_SOURCES) $(fromoctagonalshape1_SOURCES) \
+	$(frompolyhedron1_SOURCES) $(fromproduct1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) $(intersection1_SOURCES) \
+	$(isempty1_SOURCES) $(isuniverse1_SOURCES) $(maxmin1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(reverse_congruences1_SOURCES) \
+	$(reverse_congruencesproduct1_SOURCES) \
+	$(reverse_constraints1_SOURCES) \
+	$(reverse_constraintsproduct1_SOURCES) \
+	$(reverse_directproduct1_SOURCES) \
+	$(reverse_shapepreservingproduct1_SOURCES) \
+	$(shapepreservingproduct1_SOURCES) $(smashproduct1_SOURCES) \
+	$(spacedims1_SOURCES) $(timeelapse1_SOURCES) \
+	$(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+	$(upperbound1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+noinst_HEADERS = \
+partially_reduced_product_test.hh
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/tests/Partially_Reduced_Product \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruences1 \
+affineimage1 \
+asciidumpload1 \
+bounded1 \
+boundedaffineimage1 \
+bounds1 \
+concatenate1 \
+congruences1 \
+congruencesproduct1 \
+constraints1 \
+constraintsproduct1 \
+contains1 \
+difference1 \
+dimension1 \
+directproduct1 \
+discrete1 \
+disjoint1 \
+dropsomenonintegerpoints1 \
+equals1 \
+frombdshape1 \
+frombox1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromproduct1 \
+generalizedaffineimage1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+maxmin1 \
+refinewithcongruences1 \
+refinewithconstraints1 \
+relations1 \
+shapepreservingproduct1 \
+smashproduct1 \
+spacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+upperbound1
+
+REVERSED_TESTS = \
+reverse_constraints1 \
+reverse_congruences1 \
+reverse_directproduct1 \
+reverse_constraintsproduct1 \
+reverse_congruencesproduct1 \
+reverse_shapepreservingproduct1
+
+
+#
+# Sources for the tests
+#
+addcongruences1_SOURCES = addcongruences1.cc
+affineimage1_SOURCES = affineimage1.cc
+asciidumpload1_SOURCES = asciidumpload1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+bounds1_SOURCES = bounds1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+congruencesproduct1_SOURCES = congruencesproduct1.cc
+constraintsproduct1_SOURCES = constraintsproduct1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+difference1_SOURCES = difference1.cc
+dimension1_SOURCES = dimension1.cc
+directproduct1_SOURCES = directproduct1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+equals1_SOURCES = equals1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromproduct1_SOURCES = fromproduct1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+intersection1_SOURCES = intersection1.cc
+isempty1_SOURCES = isempty1.cc
+isuniverse1_SOURCES = isuniverse1.cc
+maxmin1_SOURCES = maxmin1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+relations1_SOURCES = relations1.cc
+shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+smashproduct1_SOURCES = smashproduct1.cc
+spacedims1_SOURCES = spacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+upperbound1_SOURCES = upperbound1.cc
+DERIVED_CXXFLAGS = -DREVERSED_TESTS $(AM_CXXFLAGS)
+reverse_congruences1_SOURCES = congruences1.cc
+reverse_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_constraints1_SOURCES = constraints1.cc
+reverse_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_directproduct1_SOURCES = directproduct1.cc
+reverse_directproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_constraintsproduct1_SOURCES = constraintsproduct1.cc
+reverse_constraintsproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_congruencesproduct1_SOURCES = congruencesproduct1.cc
+reverse_congruencesproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+reverse_shapepreservingproduct1_SOURCES = shapepreservingproduct1.cc
+reverse_shapepreservingproduct1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Partially_Reduced_Product/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Partially_Reduced_Product/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES) 
+	@rm -f addcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES) $(EXTRA_asciidumpload1_DEPENDENCIES) 
+	@rm -f asciidumpload1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+congruencesproduct1$(EXEEXT): $(congruencesproduct1_OBJECTS) $(congruencesproduct1_DEPENDENCIES) $(EXTRA_congruencesproduct1_DEPENDENCIES) 
+	@rm -f congruencesproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruencesproduct1_OBJECTS) $(congruencesproduct1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+constraintsproduct1$(EXEEXT): $(constraintsproduct1_OBJECTS) $(constraintsproduct1_DEPENDENCIES) $(EXTRA_constraintsproduct1_DEPENDENCIES) 
+	@rm -f constraintsproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraintsproduct1_OBJECTS) $(constraintsproduct1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES) 
+	@rm -f difference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+dimension1$(EXEEXT): $(dimension1_OBJECTS) $(dimension1_DEPENDENCIES) $(EXTRA_dimension1_DEPENDENCIES) 
+	@rm -f dimension1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dimension1_OBJECTS) $(dimension1_LDADD) $(LIBS)
+
+directproduct1$(EXEEXT): $(directproduct1_OBJECTS) $(directproduct1_DEPENDENCIES) $(EXTRA_directproduct1_DEPENDENCIES) 
+	@rm -f directproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(directproduct1_OBJECTS) $(directproduct1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES) 
+	@rm -f dropsomenonintegerpoints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES) 
+	@rm -f equals1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromproduct1$(EXEEXT): $(fromproduct1_OBJECTS) $(fromproduct1_DEPENDENCIES) $(EXTRA_fromproduct1_DEPENDENCIES) 
+	@rm -f fromproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromproduct1_OBJECTS) $(fromproduct1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES) $(EXTRA_isempty1_DEPENDENCIES) 
+	@rm -f isempty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+
+isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES) $(EXTRA_isuniverse1_DEPENDENCIES) 
+	@rm -f isuniverse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) $(EXTRA_maxmin1_DEPENDENCIES) 
+	@rm -f maxmin1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+reverse_congruences1$(EXEEXT): $(reverse_congruences1_OBJECTS) $(reverse_congruences1_DEPENDENCIES) $(EXTRA_reverse_congruences1_DEPENDENCIES) 
+	@rm -f reverse_congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(reverse_congruences1_LINK) $(reverse_congruences1_OBJECTS) $(reverse_congruences1_LDADD) $(LIBS)
+
+reverse_congruencesproduct1$(EXEEXT): $(reverse_congruencesproduct1_OBJECTS) $(reverse_congruencesproduct1_DEPENDENCIES) $(EXTRA_reverse_congruencesproduct1_DEPENDENCIES) 
+	@rm -f reverse_congruencesproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(reverse_congruencesproduct1_LINK) $(reverse_congruencesproduct1_OBJECTS) $(reverse_congruencesproduct1_LDADD) $(LIBS)
+
+reverse_constraints1$(EXEEXT): $(reverse_constraints1_OBJECTS) $(reverse_constraints1_DEPENDENCIES) $(EXTRA_reverse_constraints1_DEPENDENCIES) 
+	@rm -f reverse_constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(reverse_constraints1_LINK) $(reverse_constraints1_OBJECTS) $(reverse_constraints1_LDADD) $(LIBS)
+
+reverse_constraintsproduct1$(EXEEXT): $(reverse_constraintsproduct1_OBJECTS) $(reverse_constraintsproduct1_DEPENDENCIES) $(EXTRA_reverse_constraintsproduct1_DEPENDENCIES) 
+	@rm -f reverse_constraintsproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(reverse_constraintsproduct1_LINK) $(reverse_constraintsproduct1_OBJECTS) $(reverse_constraintsproduct1_LDADD) $(LIBS)
+
+reverse_directproduct1$(EXEEXT): $(reverse_directproduct1_OBJECTS) $(reverse_directproduct1_DEPENDENCIES) $(EXTRA_reverse_directproduct1_DEPENDENCIES) 
+	@rm -f reverse_directproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(reverse_directproduct1_LINK) $(reverse_directproduct1_OBJECTS) $(reverse_directproduct1_LDADD) $(LIBS)
+
+reverse_shapepreservingproduct1$(EXEEXT): $(reverse_shapepreservingproduct1_OBJECTS) $(reverse_shapepreservingproduct1_DEPENDENCIES) $(EXTRA_reverse_shapepreservingproduct1_DEPENDENCIES) 
+	@rm -f reverse_shapepreservingproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(reverse_shapepreservingproduct1_LINK) $(reverse_shapepreservingproduct1_OBJECTS) $(reverse_shapepreservingproduct1_LDADD) $(LIBS)
+
+shapepreservingproduct1$(EXEEXT): $(shapepreservingproduct1_OBJECTS) $(shapepreservingproduct1_DEPENDENCIES) $(EXTRA_shapepreservingproduct1_DEPENDENCIES) 
+	@rm -f shapepreservingproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(shapepreservingproduct1_OBJECTS) $(shapepreservingproduct1_LDADD) $(LIBS)
+
+smashproduct1$(EXEEXT): $(smashproduct1_OBJECTS) $(smashproduct1_DEPENDENCIES) $(EXTRA_smashproduct1_DEPENDENCIES) 
+	@rm -f smashproduct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(smashproduct1_OBJECTS) $(smashproduct1_LDADD) $(LIBS)
+
+spacedims1$(EXEEXT): $(spacedims1_OBJECTS) $(spacedims1_DEPENDENCIES) $(EXTRA_spacedims1_DEPENDENCIES) 
+	@rm -f spacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(spacedims1_OBJECTS) $(spacedims1_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) $(EXTRA_topclosure1_DEPENDENCIES) 
+	@rm -f topclosure1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES) 
+	@rm -f upperbound1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/asciidumpload1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruencesproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraintsproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/directproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isempty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/isuniverse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_congruences1-congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_constraints1-constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_directproduct1-directproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/shapepreservingproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/smashproduct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+reverse_congruences1-congruences1.o: congruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruences1-congruences1.o -MD -MP -MF $(DEPDIR)/reverse_congruences1-congruences1.Tpo -c -o reverse_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruences1-congruences1.Tpo $(DEPDIR)/reverse_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='congruences1.cc' object='reverse_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+
+reverse_congruences1-congruences1.obj: congruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruences1-congruences1.obj -MD -MP -MF $(DEPDIR)/reverse_congruences1-congruences1.Tpo -c -o reverse_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruences1-congruences1.Tpo $(DEPDIR)/reverse_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='congruences1.cc' object='reverse_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+
+reverse_congruencesproduct1-congruencesproduct1.o: congruencesproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruencesproduct1-congruencesproduct1.o -MD -MP -MF $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo -c -o reverse_congruencesproduct1-congruencesproduct1.o `test -f 'congruencesproduct1.cc' || echo '$(srcdir)/'`congruencesproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='congruencesproduct1.cc' object='reverse_congruencesproduct1-congruencesproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruencesproduct1-congruencesproduct1.o `test -f 'congruencesproduct1.cc' || echo '$(srcdir)/'`congruencesproduct1.cc
+
+reverse_congruencesproduct1-congruencesproduct1.obj: congruencesproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_congruencesproduct1-congruencesproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo -c -o reverse_congruencesproduct1-congruencesproduct1.obj `if test -f 'congruencesproduct1.cc'; then $(CYGPATH_W) 'congruencesproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/congruencesproduct1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Tpo $(DEPDIR)/reverse_congruencesproduct1-congruencesproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='congruencesproduct1.cc' object='reverse_congruencesproduct1-congruencesproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_congruencesproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_congruencesproduct1-congruencesproduct1.obj `if test -f 'congruencesproduct1.cc'; then $(CYGPATH_W) 'congruencesproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/congruencesproduct1.cc'; fi`
+
+reverse_constraints1-constraints1.o: constraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraints1-constraints1.o -MD -MP -MF $(DEPDIR)/reverse_constraints1-constraints1.Tpo -c -o reverse_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraints1-constraints1.Tpo $(DEPDIR)/reverse_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constraints1.cc' object='reverse_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+
+reverse_constraints1-constraints1.obj: constraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraints1-constraints1.obj -MD -MP -MF $(DEPDIR)/reverse_constraints1-constraints1.Tpo -c -o reverse_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraints1-constraints1.Tpo $(DEPDIR)/reverse_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constraints1.cc' object='reverse_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+
+reverse_constraintsproduct1-constraintsproduct1.o: constraintsproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraintsproduct1-constraintsproduct1.o -MD -MP -MF $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo -c -o reverse_constraintsproduct1-constraintsproduct1.o `test -f 'constraintsproduct1.cc' || echo '$(srcdir)/'`constraintsproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constraintsproduct1.cc' object='reverse_constraintsproduct1-constraintsproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraintsproduct1-constraintsproduct1.o `test -f 'constraintsproduct1.cc' || echo '$(srcdir)/'`constraintsproduct1.cc
+
+reverse_constraintsproduct1-constraintsproduct1.obj: constraintsproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_constraintsproduct1-constraintsproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo -c -o reverse_constraintsproduct1-constraintsproduct1.obj `if test -f 'constraintsproduct1.cc'; then $(CYGPATH_W) 'constraintsproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/constraintsproduct1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Tpo $(DEPDIR)/reverse_constraintsproduct1-constraintsproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constraintsproduct1.cc' object='reverse_constraintsproduct1-constraintsproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_constraintsproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_constraintsproduct1-constraintsproduct1.obj `if test -f 'constraintsproduct1.cc'; then $(CYGPATH_W) 'constraintsproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/constraintsproduct1.cc'; fi`
+
+reverse_directproduct1-directproduct1.o: directproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_directproduct1-directproduct1.o -MD -MP -MF $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo -c -o reverse_directproduct1-directproduct1.o `test -f 'directproduct1.cc' || echo '$(srcdir)/'`directproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo $(DEPDIR)/reverse_directproduct1-directproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='directproduct1.cc' object='reverse_directproduct1-directproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_directproduct1-directproduct1.o `test -f 'directproduct1.cc' || echo '$(srcdir)/'`directproduct1.cc
+
+reverse_directproduct1-directproduct1.obj: directproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_directproduct1-directproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo -c -o reverse_directproduct1-directproduct1.obj `if test -f 'directproduct1.cc'; then $(CYGPATH_W) 'directproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/directproduct1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_directproduct1-directproduct1.Tpo $(DEPDIR)/reverse_directproduct1-directproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='directproduct1.cc' object='reverse_directproduct1-directproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_directproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_directproduct1-directproduct1.obj `if test -f 'directproduct1.cc'; then $(CYGPATH_W) 'directproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/directproduct1.cc'; fi`
+
+reverse_shapepreservingproduct1-shapepreservingproduct1.o: shapepreservingproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_shapepreservingproduct1-shapepreservingproduct1.o -MD -MP -MF $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.o `test -f 'shapepreservingproduct1.cc' || echo '$(srcdir)/'`shapepreservingproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='shapepreservingproduct1.cc' object='reverse_shapepreservingproduct1-shapepreservingproduct1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.o `test -f 'shapepreservingproduct1.cc' || echo '$(srcdir)/'`shapepreservingproduct1.cc
+
+reverse_shapepreservingproduct1-shapepreservingproduct1.obj: shapepreservingproduct1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -MT reverse_shapepreservingproduct1-shapepreservingproduct1.obj -MD -MP -MF $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.obj `if test -f 'shapepreservingproduct1.cc'; then $(CYGPATH_W) 'shapepreservingproduct1.cc'; else $(CYGPATH_W) '$(srcdir [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Tpo $(DEPDIR)/reverse_shapepreservingproduct1-shapepreservingproduct1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='shapepreservingproduct1.cc' object='reverse_shapepreservingproduct1-shapepreservingproduct1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(reverse_shapepreservingproduct1_CXXFLAGS) $(CXXFLAGS) -c -o reverse_shapepreservingproduct1-shapepreservingproduct1.obj `if test -f 'shapepreservingproduct1.cc'; then $(CYGPATH_W) 'shapepreservingproduct1.cc'; else $(CYGPATH_W) '$(srcdir)/shapepreservingproduct1.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+addcongruences1.log: addcongruences1$(EXEEXT)
+	@p='addcongruences1$(EXEEXT)'; \
+	b='addcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+	@p='affineimage1$(EXEEXT)'; \
+	b='affineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+asciidumpload1.log: asciidumpload1$(EXEEXT)
+	@p='asciidumpload1$(EXEEXT)'; \
+	b='asciidumpload1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+	@p='bounded1$(EXEEXT)'; \
+	b='bounded1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffineimage1.log: boundedaffineimage1$(EXEEXT)
+	@p='boundedaffineimage1$(EXEEXT)'; \
+	b='boundedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+	@p='bounds1$(EXEEXT)'; \
+	b='bounds1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+	@p='concatenate1$(EXEEXT)'; \
+	b='concatenate1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences1.log: congruences1$(EXEEXT)
+	@p='congruences1$(EXEEXT)'; \
+	b='congruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+congruencesproduct1.log: congruencesproduct1$(EXEEXT)
+	@p='congruencesproduct1$(EXEEXT)'; \
+	b='congruencesproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+constraints1.log: constraints1$(EXEEXT)
+	@p='constraints1$(EXEEXT)'; \
+	b='constraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+constraintsproduct1.log: constraintsproduct1$(EXEEXT)
+	@p='constraintsproduct1$(EXEEXT)'; \
+	b='constraintsproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+	@p='contains1$(EXEEXT)'; \
+	b='contains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+difference1.log: difference1$(EXEEXT)
+	@p='difference1$(EXEEXT)'; \
+	b='difference1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+dimension1.log: dimension1$(EXEEXT)
+	@p='dimension1$(EXEEXT)'; \
+	b='dimension1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+directproduct1.log: directproduct1$(EXEEXT)
+	@p='directproduct1$(EXEEXT)'; \
+	b='directproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+discrete1.log: discrete1$(EXEEXT)
+	@p='discrete1$(EXEEXT)'; \
+	b='discrete1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+	@p='disjoint1$(EXEEXT)'; \
+	b='disjoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+dropsomenonintegerpoints1.log: dropsomenonintegerpoints1$(EXEEXT)
+	@p='dropsomenonintegerpoints1$(EXEEXT)'; \
+	b='dropsomenonintegerpoints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+	@p='equals1$(EXEEXT)'; \
+	b='equals1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+	@p='frombdshape1$(EXEEXT)'; \
+	b='frombdshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+	@p='frombox1$(EXEEXT)'; \
+	b='frombox1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+	@p='fromgrid1$(EXEEXT)'; \
+	b='fromgrid1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+	@p='fromoctagonalshape1$(EXEEXT)'; \
+	b='fromoctagonalshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frompolyhedron1.log: frompolyhedron1$(EXEEXT)
+	@p='frompolyhedron1$(EXEEXT)'; \
+	b='frompolyhedron1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromproduct1.log: fromproduct1$(EXEEXT)
+	@p='fromproduct1$(EXEEXT)'; \
+	b='fromproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage1.log: generalizedaffineimage1$(EXEEXT)
+	@p='generalizedaffineimage1$(EXEEXT)'; \
+	b='generalizedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+	@p='intersection1$(EXEEXT)'; \
+	b='intersection1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+isempty1.log: isempty1$(EXEEXT)
+	@p='isempty1$(EXEEXT)'; \
+	b='isempty1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+isuniverse1.log: isuniverse1$(EXEEXT)
+	@p='isuniverse1$(EXEEXT)'; \
+	b='isuniverse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+maxmin1.log: maxmin1$(EXEEXT)
+	@p='maxmin1$(EXEEXT)'; \
+	b='maxmin1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruences1.log: refinewithcongruences1$(EXEEXT)
+	@p='refinewithcongruences1$(EXEEXT)'; \
+	b='refinewithcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraints1.log: refinewithconstraints1$(EXEEXT)
+	@p='refinewithconstraints1$(EXEEXT)'; \
+	b='refinewithconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations1.log: relations1$(EXEEXT)
+	@p='relations1$(EXEEXT)'; \
+	b='relations1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+shapepreservingproduct1.log: shapepreservingproduct1$(EXEEXT)
+	@p='shapepreservingproduct1$(EXEEXT)'; \
+	b='shapepreservingproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+smashproduct1.log: smashproduct1$(EXEEXT)
+	@p='smashproduct1$(EXEEXT)'; \
+	b='smashproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+spacedims1.log: spacedims1$(EXEEXT)
+	@p='spacedims1$(EXEEXT)'; \
+	b='spacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse1.log: timeelapse1$(EXEEXT)
+	@p='timeelapse1$(EXEEXT)'; \
+	b='timeelapse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosed1.log: topclosed1$(EXEEXT)
+	@p='topclosed1$(EXEEXT)'; \
+	b='topclosed1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosure1.log: topclosure1$(EXEEXT)
+	@p='topclosure1$(EXEEXT)'; \
+	b='topclosure1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound1.log: upperbound1$(EXEEXT)
+	@p='upperbound1$(EXEEXT)'; \
+	b='upperbound1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_constraints1.log: reverse_constraints1$(EXEEXT)
+	@p='reverse_constraints1$(EXEEXT)'; \
+	b='reverse_constraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_congruences1.log: reverse_congruences1$(EXEEXT)
+	@p='reverse_congruences1$(EXEEXT)'; \
+	b='reverse_congruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_directproduct1.log: reverse_directproduct1$(EXEEXT)
+	@p='reverse_directproduct1$(EXEEXT)'; \
+	b='reverse_directproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_constraintsproduct1.log: reverse_constraintsproduct1$(EXEEXT)
+	@p='reverse_constraintsproduct1$(EXEEXT)'; \
+	b='reverse_constraintsproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_congruencesproduct1.log: reverse_congruencesproduct1$(EXEEXT)
+	@p='reverse_congruencesproduct1$(EXEEXT)'; \
+	b='reverse_congruencesproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reverse_shapepreservingproduct1.log: reverse_shapepreservingproduct1$(EXEEXT)
+	@p='reverse_shapepreservingproduct1$(EXEEXT)'; \
+	b='reverse_shapepreservingproduct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Partially_Reduced_Product/addcongruences1.cc b/tests/Partially_Reduced_Product/addcongruences1.cc
new file mode 100644
index 0000000..f5e3372
--- /dev/null
+++ b/tests/Partially_Reduced_Product/addcongruences1.cc
@@ -0,0 +1,101 @@
+/* Test Smash_Product.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// add_recycled_congruences
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+  cgs.insert((A %= 0) / 0);
+
+  Product prp(2);
+
+  Congruence_System cgs_copy = cgs;
+  Congruence_System cgs_copy2 = cgs;
+
+  prp.add_recycled_congruences(cgs_copy);
+
+  Grid gr(cgs_copy2);
+
+  Product known_prp(gr);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// add_recycled_congruences
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 0) / 2);
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((A %= 0) / 1);
+  cgs.insert(A - B == 0);
+
+  Product prp(2);
+
+  Congruence_System cgs_copy = cgs;
+  Congruence_System cgs_copy2 = cgs;
+
+  prp.add_recycled_congruences(cgs_copy);
+
+  Grid gr(cgs_copy2);
+
+  Product known_prp(gr);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/affineimage1.cc b/tests/Partially_Reduced_Product/affineimage1.cc
new file mode 100644
index 0000000..6bbe194
--- /dev/null
+++ b/tests/Partially_Reduced_Product/affineimage1.cc
@@ -0,0 +1,89 @@
+/* Test Product<NNC_Polyhedron, Grid>::()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// affine_image()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence((B %= 2) / 14);
+  prp.refine_with_constraint(A <= 5);
+  prp.refine_with_constraint(B <= 10);
+
+  prp.affine_image(A, B + C);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((B %= 2) / 14);
+  known_prp.refine_with_constraint(A - B - C == 0);
+  known_prp.refine_with_constraint(A - C <= 10);
+  known_prp.refine_with_constraint(B <= 10);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// affine_preimage()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_constraint(A - B == 0);
+  prp.refine_with_congruence((A %= 0) / 3);
+
+  prp.affine_preimage(A, B);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((B %= 0) / 3);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/asciidumpload1.cc b/tests/Partially_Reduced_Product/asciidumpload1.cc
new file mode 100644
index 0000000..c6eee38
--- /dev/null
+++ b/tests/Partially_Reduced_Product/asciidumpload1.cc
@@ -0,0 +1,240 @@
+/* Test Direct_Product<nnc_ph, gr> ascii_dump() and ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+typedef Domain_Product<Grid, NNC_Polyhedron>::Direct_Product
+No_Reduction_Product;
+
+namespace {
+
+// Universe.
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  No_Reduction_Product dp1(3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Congruence.
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+
+  No_Reduction_Product dp1(3);
+  dp1.refine_with_congruence((2*A %= 3) / 3);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Constraint.
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+
+  No_Reduction_Product dp1(3);
+  dp1.refine_with_constraint(3*A > 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Congruence and constraint.
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  No_Reduction_Product dp1(3);
+  dp1.refine_with_constraint(3*B > 2);
+  dp1.refine_with_congruence((A %= 0) / 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Many dimensions.
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  No_Reduction_Product dp1(4);
+  dp1.refine_with_constraint(3*A + D > 2);
+  dp1.refine_with_congruence((A - 3*C %= 0) / 2);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(4);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Empty.
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  No_Reduction_Product dp1(7, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Zero-dimension empty.
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  No_Reduction_Product dp1(0, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+// Zero-dimension universe.
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+
+  No_Reduction_Product dp1(0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  dp1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  No_Reduction_Product dp2(3);
+  dp2.ascii_load(f);
+  close(f);
+
+  bool ok = (dp1 == dp2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/bounded1.cc b/tests/Partially_Reduced_Product/bounded1.cc
new file mode 100644
index 0000000..2c12b75
--- /dev/null
+++ b/tests/Partially_Reduced_Product/bounded1.cc
@@ -0,0 +1,58 @@
+/* Test Product<>::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_bounded().
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_congruence((A %= 0) / 0);
+  prp.refine_with_congruence((B %= 0) / 0);
+  prp.refine_with_constraint(B <= 0);
+
+  bool ok = prp.is_bounded();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/boundedaffineimage1.cc b/tests/Partially_Reduced_Product/boundedaffineimage1.cc
new file mode 100644
index 0000000..7b77d24
--- /dev/null
+++ b/tests/Partially_Reduced_Product/boundedaffineimage1.cc
@@ -0,0 +1,270 @@
+/* Test Product<NNC_Polyhedron, Grid>::bounds_from_above() and
+   Product<NNC_Polyhedron, Grid>::bounds_from_below()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Product prp(7, EMPTY);
+
+  bool ok = (prp.bounds_from_above(Linear_Expression(0))
+             && prp.bounds_from_below(Linear_Expression(0)));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Product prp(0, EMPTY);
+
+  bool ok = (prp.bounds_from_above(Linear_Expression(3))
+             && prp.bounds_from_below(Linear_Expression(3)));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Product prp(0);
+
+  bool ok = (prp.bounds_from_above(Linear_Expression(1))
+             && prp.bounds_from_below(Linear_Expression(1)));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A == 1);
+  prp.refine_with_constraint(3*B == 2);
+
+  Linear_Expression le = A + B;
+  bool ok = prp.bounds_from_above(le)
+    && prp.bounds_from_below(le);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A - B >= 1);
+  prp.refine_with_constraint(A - B <= 1);
+  prp.refine_with_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+  bool ok = prp.bounds_from_above(le)
+    && prp.bounds_from_below(le);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(B == 1);
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !prp.bounds_from_above(le)
+    && !prp.bounds_from_below(le);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Non-empty product. bounded_affine_image/3
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence((A ==  0) / 0);
+  prp.refine_with_congruence((B ==  0) / 0);
+  prp.refine_with_congruence((C == -2) / 0);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_image(A, 7-B, B+3);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(C == -2);
+  known_prp.refine_with_constraint(B == 0);
+  known_prp.refine_with_constraint(A <= 3);
+  known_prp.refine_with_constraint(A - B >= 7);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp,
+     "*** prp.bounded_affine_image(A, 7-B, B+3) congruences ***");
+  print_constraints(prp,
+     "*** prp.bounded_affine_image(A, 7-B, B+3) constraints ***");
+
+  return ok;
+}
+
+// Empty product component. bounded_affine_image/3
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A ==  0);
+  prp.refine_with_constraint(A ==  1);
+  prp.refine_with_constraint(C == -2);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_image(A, 7-B, B+3);
+
+  Product known_prp(3, EMPTY);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Non-empty product. bounded_affine_preimage/3
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence((A ==  0) / 0);
+  prp.refine_with_congruence((B ==  0) / 0);
+  prp.refine_with_congruence((C == -2) / 0);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Constraint_System cs;
+  cs.insert(C == -2);
+  cs.insert(B == 0);
+  cs.insert(C >= 3);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraints(cs);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Empty product. bounded_affine_preimage/3
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A ==  0);
+  prp.refine_with_constraint(A ==  1);
+  prp.refine_with_constraint(C == -2);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Product known_prp(3, EMPTY);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/bounds1.cc b/tests/Partially_Reduced_Product/bounds1.cc
new file mode 100644
index 0000000..1a45043
--- /dev/null
+++ b/tests/Partially_Reduced_Product/bounds1.cc
@@ -0,0 +1,688 @@
+/* Test Product<NNC_Polyhedron, Grid>::bounds_from_above() and
+   Product<NNC_Polyhedron, Grid>::bounds_from_below()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Empty.
+bool
+test01() {
+  Product prp(7, EMPTY);
+
+  bool ok = (prp.bounds_from_above(Linear_Expression(0))
+             && prp.bounds_from_below(Linear_Expression(0)));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Product prp(0, EMPTY);
+
+  bool ok = (prp.bounds_from_above(Linear_Expression(3))
+             && prp.bounds_from_below(Linear_Expression(3)));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Product prp(0);
+
+  bool ok = (prp.bounds_from_above(Linear_Expression(1))
+             && prp.bounds_from_below(Linear_Expression(1)));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A == 1);
+  prp.refine_with_constraint(3*B == 2);
+
+  Linear_Expression le = A + B;
+  bool ok = prp.bounds_from_above(le)
+    && prp.bounds_from_below(le);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+#if Box_Class
+  prp.refine_with_constraint(A >= 1);
+  prp.refine_with_constraint(A <= 1);
+  prp.refine_with_constraint(B >= 1);
+  prp.refine_with_constraint(B <= 0);
+#else
+  prp.refine_with_constraint(A - B >= 1);
+  prp.refine_with_constraint(A - B <= 1);
+#endif
+  prp.refine_with_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+  bool ok = prp.bounds_from_above(le)
+    && prp.bounds_from_below(le);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(B == 1);
+
+  Linear_Expression le = 2*A - B;
+
+  bool ok = !prp.bounds_from_above(le)
+    && !prp.bounds_from_below(le);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Empty. maximize() and minimize()
+bool
+test07() {
+  Product prp(7, EMPTY);
+
+  Coefficient extr_n;
+  Coefficient extr_d;
+  bool dummy;
+
+  bool ok = (!prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test08() {
+  Product prp(0, EMPTY);
+
+  Coefficient extr_n;
+  Coefficient extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+    && !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test09() {
+  Product prp(0);
+
+  Coefficient extr_n, extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+    && prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A == 1);
+  prp.refine_with_constraint(3*B == 2);
+
+  Linear_Expression le = A + B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  Generator known_pnt(point(3*A + 2*B, 3));
+  bool max;
+  bool min;
+
+  bool ok = prp.maximize(le, max_n, max_d, max)
+    && prp.minimize(le, min_n, min_d, min)
+    && prp.maximize(le, max_n, max_d, max, pnt_max)
+    && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 5 && max_d == 3 && min_n == 5 && min_d == 3
+    && pnt_max == known_pnt && pnt_min == known_pnt;
+
+  print_generator(pnt_max, "*** max point ***");
+  print_generator(pnt_min, "*** min point ***");
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// only one component is bounded.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+#if Box_Class
+  prp.refine_with_constraint(A >= 2);
+  prp.refine_with_constraint(A <= 2);
+  prp.refine_with_constraint(B >= 1);
+  prp.refine_with_constraint(B <= 1);
+#else
+  prp.refine_with_constraint(A - B >= 1);
+  prp.refine_with_constraint(A - B <= 1);
+#endif
+  prp.refine_with_congruence(3*B %= 2);
+;
+  Linear_Expression le = A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = prp.maximize(le, max_n, max_d, max)
+    && prp.minimize(le, min_n, min_d, min)
+    && prp.maximize(le, max_n, max_d, max, pnt_max)
+    && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+    && pnt_max == pnt_min;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(B == 1);
+
+  Linear_Expression le = 2*A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = !prp.maximize(le, max_n, max_d, max)
+    && !prp.minimize(le, min_n, min_d, min)
+    && !prp.maximize(le, max_n, max_d, max, pnt_max)
+    && !prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// only one component is strictly bounded.
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+
+#if NNC_Poly_Class
+  prp.refine_with_constraint(A - B > 0);
+  prp.refine_with_constraint(A - B < 1);
+#else
+#if !Box_Class
+  prp.refine_with_constraint(A - B >= 0);
+  prp.refine_with_constraint(A - B <= 1);
+#else
+  prp.refine_with_constraint(A >= 2);
+  prp.refine_with_constraint(A <= 2);
+  prp.refine_with_constraint(B <= 2);
+  prp.refine_with_constraint(B >= 1);
+#endif
+#endif
+  prp.refine_with_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+
+  bool max;
+  bool min;
+
+  bool ok = prp.maximize(le, max_n, max_d, max)
+    && prp.minimize(le, min_n, min_d, min)
+    && prp.maximize(le, max_n, max_d, max, pnt_max)
+    && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+#if NNC_Poly_Class
+  ok = ok && !max && !min;
+#else
+  ok = ok && max && min;
+#endif
+
+  ok = ok && max_n == 1 && max_d == 1 && min_n == 0 && min_d == 1;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+#if !Box_Class
+// Non-empty product. bounded_affine_image/3
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence((A ==  0) / 0);
+  prp.refine_with_congruence((B ==  0) / 0);
+  prp.refine_with_congruence((C == -2) / 0);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_image(A, 7-B, B+3);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(C == -2);
+  known_prp.refine_with_constraint(B == 0);
+  known_prp.refine_with_constraint(A <= 3);
+  known_prp.refine_with_constraint(A - B >= 7);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp,
+     "*** prp.bounded_affine_image(A, 7-B, B+3) congruences ***");
+  print_constraints(prp,
+     "*** prp.bounded_affine_image(A, 7-B, B+3) constraints ***");
+
+  return ok;
+}
+
+// Empty product component. bounded_affine_image/3
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A ==  0);
+  prp.refine_with_constraint(A ==  1);
+  prp.refine_with_constraint(C == -2);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_image(A, 7-B, B+3);
+
+  Product known_prp(3, EMPTY);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Non-empty product. bounded_affine_preimage/3
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence((A ==  0) / 0);
+  prp.refine_with_congruence((B ==  0) / 0);
+  prp.refine_with_congruence((C == -2) / 0);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Constraint_System cs;
+  cs.insert(C == -2);
+  cs.insert(B == 0);
+  cs.insert(C >= 3);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraints(cs);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Empty product. bounded_affine_preimage/3
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A ==  0);
+  prp.refine_with_constraint(A ==  1);
+  prp.refine_with_constraint(C == -2);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  prp.bounded_affine_preimage(A, 7-B, B+3);
+
+  Product known_prp(3, EMPTY);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+#endif
+
+typedef Domain_Product<TBox, Grid>::Direct_Product TBox_Grid;
+typedef Domain_Product<Grid, TBox>::Direct_Product Grid_TBox;
+typedef Domain_Product<NNC_Polyhedron, Grid>::Direct_Product NNCPoly_Grid;
+
+// TBox_Grid(nnc_polyhedron, POLYNOMIAL_COMPLEXITY).
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_constraint(3*x + y >= 2);
+  ph.refine_with_constraint(x <= 4);
+  ph.refine_with_constraint(y <= 4);
+
+  TBox_Grid pprp(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox_Grid nprp(ph);
+
+  TBox_Grid known_prp(2);
+  known_prp.refine_with_constraint(3*x >= -2);
+  known_prp.refine_with_constraint(x <= 4);
+  known_prp.refine_with_constraint(y >= -10);
+  known_prp.refine_with_constraint(y <= 4);
+
+  bool ok = (nprp == known_prp && pprp == known_prp);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nprp, "*** nprp ***");
+  print_congruences(nprp, "*** nprp ***");
+  print_constraints(pprp, "*** pprp ***");
+  print_congruences(pprp, "*** pprp ***");
+
+  return ok;
+}
+
+// Copy constructor.
+bool
+test19() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+
+  NNCPoly_Grid src(1);
+  src.refine_with_constraints(cs);
+
+  NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+  NNCPoly_Grid prp1(src);
+
+  NNCPoly_Grid known_prp(1);
+  known_prp.refine_with_constraint(A >= 0);
+
+  bool ok = (prp == known_prp && prp1 == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a TBox_Grid.
+bool
+test20() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+  const Congruence_System cgs(A %= 0);
+
+  TBox_Grid src(1);
+  src.refine_with_constraints(cs);
+  src.refine_with_congruences(cgs);
+
+  NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+  NNCPoly_Grid prp1(src);
+
+  NNCPoly_Grid known_prp(1);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp == known_prp && prp1 == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a Grid_TBox.
+bool
+test21() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+  const Congruence_System cgs(A %= 0);
+
+  Grid_TBox src(1);
+  src.refine_with_constraints(cs);
+  src.refine_with_congruences(cgs);
+
+  NNCPoly_Grid prp(src);
+
+  NNCPoly_Grid prp1(src);
+
+  NNCPoly_Grid known_prp(1);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp == known_prp && prp1 == known_prp);
+
+  print_congruences(src, "*** src congruences ***");
+  print_constraints(src, "*** src constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(known_prp, "*** known_prp congruences ***");
+  print_constraints(known_prp, "*** known_prp constraints ***");
+
+  return ok && prp.OK();
+}
+
+// max_space_dimension().
+bool
+test22() {
+  dimension_type msd1 = NNC_Polyhedron::max_space_dimension();
+  nout << "NNCPolyhedron max space dimension = "
+       << msd1 << endl;
+  dimension_type msd2 = Grid::max_space_dimension();
+  nout << "Grid max space dimension = "
+       << msd2 << endl;
+  dimension_type msd = NNCPoly_Grid::max_space_dimension();
+  bool ok = (msd <= msd1 && msd <= msd2);
+
+  nout << "NNCPoly_Grid max space dimension = "
+       << msd << endl << endl;
+
+  return ok;
+}
+
+// Attempt to construct a product with too many dimensions.
+bool
+test23() {
+  try {
+    // This is an invalid use of the constructor of a product:
+    // it is illegal to (try to) build a product with a dimension
+    // greater than max_space_dimension().
+    NNCPoly_Grid pg(NNCPoly_Grid::max_space_dimension() + 2);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+#if !Box_Class
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+#endif
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/concatenate1.cc b/tests/Partially_Reduced_Product/concatenate1.cc
new file mode 100644
index 0000000..0c10b47
--- /dev/null
+++ b/tests/Partially_Reduced_Product/concatenate1.cc
@@ -0,0 +1,71 @@
+/* Test Product<NNC_Polyhedron, Grid>::concatenate_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// concatenate_assign()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Product prp1(2);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A %= 0) / 2);
+
+  Product prp2(2);
+  prp2.refine_with_constraint(A <= 1);
+  prp2.refine_with_constraint(B >= 0);
+
+  prp1.concatenate_assign(prp2);
+
+  Product known_prp(4);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence((A %= 0) / 2);
+  known_prp.refine_with_constraint(C <= 1);
+  known_prp.refine_with_constraint(D >= 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/congruences1.cc b/tests/Partially_Reduced_Product/congruences1.cc
new file mode 100644
index 0000000..e1d4bfc
--- /dev/null
+++ b/tests/Partially_Reduced_Product/congruences1.cc
@@ -0,0 +1,96 @@
+/* Test Product<NNC_Polyhedron, Grid>::congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// congruences()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_congruence(A %= 9);
+  dp.refine_with_congruence(B + C %= 3);
+
+  Congruence_System cgs;
+  cgs.insert(B + C %= 0);
+  cgs.insert(A %= 0);
+
+  Grid known_gr(cgs);
+
+  Grid gr(dp.congruences());
+
+  bool ok = gr == known_gr;
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// minimized_congruences()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_congruence(B + C %= 3);
+  dp.refine_with_constraint(A >= 9);
+  dp.refine_with_constraint(A <= 9);
+
+  Congruence_System cgs;
+  cgs.insert(B + C %= 3);
+  cgs.insert(A == 9);
+
+  Grid known_gr(cgs);
+
+  Grid gr(dp.minimized_congruences());
+
+  bool ok = gr == known_gr;
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/congruencesproduct1.cc b/tests/Partially_Reduced_Product/congruencesproduct1.cc
new file mode 100644
index 0000000..173dd39
--- /dev/null
+++ b/tests/Partially_Reduced_Product/congruencesproduct1.cc
@@ -0,0 +1,281 @@
+/* Test Partially_Reduced_Product<>:: Congruences_Reduction()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef NNC_Polyhedron Poly;
+
+typedef Domain_Product<Poly, Grid>::Congruences_Product CGProduct;
+// typedef Domain_Product<Poly, Grid>::Direct_Product CGProduct;
+namespace {
+
+// Congruences_Reduction with non-strict constraints and
+// equality found. Positive coefficients.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  CGProduct cgp(2);
+  Constraint_System cs;
+  cs.insert(3*A >= 7);
+  cs.insert(3*A <= 16);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  CGProduct known_cgp(2);
+
+  known_cgp.refine_with_constraint(A == 4);
+  known_cgp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = cgp.OK();
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = ok && cgp == known_cgp;
+    print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+    print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+  }
+
+  return ok;
+}
+
+// Congruences_Reduction with non-strict constraints and
+// equality found. Negative coefficients.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  CGProduct cgp(2);
+  Constraint_System cs;
+  cs.insert(3*A >= -10);
+  cs.insert(2*A <= -3);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  CGProduct known_cgp(2);
+
+  known_cgp.refine_with_constraint(A == -2);
+  known_cgp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = cgp.OK();
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = ok && cgp == known_cgp;
+
+    print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+    print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+  }
+
+  return ok;
+}
+
+// Congruences_Reduction with non-strict constraints and
+// equality found.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  CGProduct cgp(2);
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 3);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  CGProduct known_cgp(2);
+
+  known_cgp.refine_with_constraints(cs);
+  known_cgp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = cgp.OK();
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = ok && cgp == known_cgp;
+
+    print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+    print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+  }
+
+  return ok;
+}
+
+// Congruences_Reduction with strict lower bound and an equality
+// is found.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  CGProduct cgp(2);
+  Constraint_System cs;
+  cs.insert(A > 0);
+  cs.insert(A <= 3);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  CGProduct known_cgp(2);
+
+  known_cgp.refine_with_constraint(A == 2);
+
+  bool ok = cgp.OK();
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = ok && cgp == known_cgp;
+
+    print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+    print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+  }
+
+  return ok;
+}
+
+// Congruences_Reduction with strict upper bound and an equality
+// is found.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  CGProduct cgp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A < 3);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  CGProduct known_cgp(2);
+
+  known_cgp.refine_with_constraint(A == 2);
+
+  bool ok = cgp.OK();
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = ok && cgp == known_cgp;
+
+    print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+    print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+  }
+
+  return ok;
+}
+
+// Congruences_Reduction where emptiness is found.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  CGProduct cgp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A < 2);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  CGProduct known_cgp(2, EMPTY);
+
+  bool ok = cgp.OK();
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = cgp == known_cgp;
+
+    print_congruences(cgp, "*** after known_cgp check: cgp congruences ***");
+    print_constraints(cgp, "*** after known_cgp check: cgp constraints ***");
+  }
+
+  return ok;
+}
+
+// Congruences_Reduction that calls constraints()
+// and hence reduce().
+bool
+test07() {
+  Variable A(0);
+
+  CGProduct cgp(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 2);
+  cgp.refine_with_constraints(cs);
+  cgp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = cgp.OK();
+
+  Constraint_System cs1 = cgp.constraints();
+
+  CGProduct known_cgp(1);
+  known_cgp.refine_with_constraints(cs1);
+
+  print_congruences(cgp, "*** after ok check: cgp congruences ***");
+  print_constraints(cgp, "*** after ok check: cgp constraints ***");
+
+  if (ok) {
+    ok = (cgp == known_cgp);
+    print_constraints(cgp,
+                      "*** after known_cgp check: cgp constraints ***");
+    print_congruences(cgp,
+                      "*** after known_cgp check: cgp congruences ***");
+    if (!ok) {
+      print_constraints(known_cgp,
+                        "*** known_cgp constraints ***");
+      print_congruences(known_cgp,
+                        "*** known_cgp congruences ***");
+    }
+  }
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/constraints1.cc b/tests/Partially_Reduced_Product/constraints1.cc
new file mode 100644
index 0000000..042369b
--- /dev/null
+++ b/tests/Partially_Reduced_Product/constraints1.cc
@@ -0,0 +1,99 @@
+/* Test constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// constraints()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_congruence((B + C %= 3) / 0);
+  dp.refine_with_constraint(A > 9);
+  dp.refine_with_constraint(A <= 11);
+
+  NNC_Polyhedron ph(dp.space_dimension());
+  ph.refine_with_constraints(dp.constraints());
+
+  NNC_Polyhedron known_ph(dp.space_dimension());
+  known_ph.refine_with_constraint(B + C == 3);
+  known_ph.refine_with_constraint(A <= 11);
+  known_ph.refine_with_constraint(A > 9);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// minimized_constraints()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_congruence((B + C %= 3) / 0);
+  dp.refine_with_constraint(A > 9);
+  dp.refine_with_constraint(A <= 11);
+
+  DOMAIN1x ph(dp.space_dimension());
+  ph.refine_with_constraints(dp.minimized_constraints());
+
+  DOMAIN1x known_ph(dp.space_dimension());
+  known_ph.refine_with_constraint(B + C == 3);
+  known_ph.refine_with_constraint(A > 9);
+  known_ph.refine_with_constraint(A <= 11);
+
+  bool ok = (ph == known_ph);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/constraintsproduct1.cc b/tests/Partially_Reduced_Product/constraintsproduct1.cc
new file mode 100644
index 0000000..6c532f1
--- /dev/null
+++ b/tests/Partially_Reduced_Product/constraintsproduct1.cc
@@ -0,0 +1,553 @@
+/* Test Partially_Reduced_Product<>:: Shrink_Using_Congruences_Reduction()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef NNC_Polyhedron Poly;
+
+typedef Domain_Product<Poly, Grid>::Constraints_Product PolyGrid;
+typedef Domain_Product<Poly, TBox>::Constraints_Product PolyBox;
+#if 0
+typedef Domain_Product<Affine_Space, TBox>::Constraints_Product AffBox;
+#endif
+typedef Domain_Product<Grid, TBox>::Constraints_Product GridBox;
+
+namespace {
+
+// Constraints_Reduction with non-strict constraints and
+// equality found. Positive coefficients.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyGrid cp(2);
+  Constraint_System cs;
+  cs.insert(3*A >= 7);
+  cs.insert(3*A <= 7);
+  cp.refine_with_constraints(cs);
+
+  PolyGrid known_cp(2);
+
+  known_cp.refine_with_constraint(3*A == 7);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = ok && cp == known_cp;
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+// Constraints_Reduction with non-strict constraints and
+// equality found. Negative coefficients.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyGrid cp(2);
+  Constraint_System cs;
+  cs.insert(2*A >= -9);
+  cs.insert(2*A <= -9);
+  cp.refine_with_constraints(cs);
+
+  PolyGrid known_cp(2);
+
+  known_cp.refine_with_constraint(2*A == -9);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = ok && cp == known_cp;
+
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+// Constraints_Reduction with strict lower bound and an equality
+// is found.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyGrid cp(2);
+  Constraint_System cs;
+  cs.insert(A > 0);
+  cs.insert(A <= 0);
+  cp.refine_with_constraints(cs);
+
+  PolyGrid known_cp(2, EMPTY);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = ok && cp == known_cp;
+
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+// Constraints_Reduction with strict upper bound and an equality
+// is found.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyGrid cp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A < 3);
+  cp.refine_with_constraints(cs);
+  cp.refine_with_congruence((A %= 1)/ 0);
+
+  PolyGrid known_cp(2);
+
+  known_cp.refine_with_constraint(A == 1);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = ok && cp == known_cp;
+
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+// Constraints_Reduction where emptiness is found.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyGrid cp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 2);
+  cp.refine_with_constraints(cs);
+  cp.refine_with_congruence((A %= 0)/ 0);
+
+  PolyGrid known_cp(2, EMPTY);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = cp == known_cp;
+
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+// Constraints_Reduction where emptiness is found.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyGrid cp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 1);
+  cp.refine_with_constraints(cs);
+  cp.refine_with_congruence((A %= 0)/ 2);
+
+  PolyGrid known_cp(2, EMPTY);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = cp == known_cp;
+
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+// Constraints_Reduction that calls constraints()
+// and hence reduce().
+bool
+test07() {
+  Variable A(0);
+
+  PolyGrid cp(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 2);
+  cp.refine_with_constraints(cs);
+  cp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = cp.OK();
+
+  Constraint_System cs1 = cp.constraints();
+
+  PolyGrid known_cp(1);
+  known_cp.refine_with_constraints(cs1);
+  known_cp.refine_with_congruence((A %= 0)/ 2);
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = (cp == known_cp);
+    print_constraints(cp,
+                      "*** after known_cp check: cp constraints ***");
+    print_congruences(cp,
+                      "*** after known_cp check: cp congruences ***");
+    if (!ok) {
+      print_constraints(known_cp,
+                        "*** known_cp constraints ***");
+      print_congruences(known_cp,
+                        "*** known_cp congruences ***");
+    }
+  }
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  PolyBox cp(2);
+
+  Constraint_System cs;
+  cs.insert(A + B >= 0);
+  cs.insert(A + B <= 1);
+  cs.insert(A - 2*B <= 10);
+  cs.insert(A - 2*B >= 0);
+  cp.refine_with_constraints(cs);
+  cp.refine_with_constraint(A >= 4);
+
+  PolyBox known_cp(2);
+  known_cp.refine_with_constraint(A == 4);
+  known_cp.refine_with_constraint(B == -3);
+
+  bool ok = cp.OK();
+
+  print_congruences(cp, "*** after ok check: cp congruences ***");
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = ok && cp == known_cp;
+
+    print_congruences(cp, "*** after known_cp check: cp congruences ***");
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+
+#if 0
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  AffBox cp(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B <= 10);
+  cs.insert(B >= 3);
+  cp.refine_with_constraints(cs);
+  cp.refine_with_constraint(A >= 4);
+  cp.refine_with_constraint(B <= 3);
+
+  AffBox known_cp(2);
+  known_cp.refine_with_constraint(A == 4);
+  known_cp.refine_with_constraint(B == 3);
+
+  bool ok = cp.OK();
+
+  print_constraints(cp, "*** after ok check: cp constraints ***");
+
+  if (ok) {
+    ok = ok && cp == known_cp;
+
+    print_constraints(cp, "*** after known_cp check: cp constraints ***");
+  }
+
+  return ok;
+}
+#endif
+
+// space_dimension()
+bool
+test10() {
+  Variable A(0);
+  Variable E(4);
+
+  Constraint_System cs;
+  cs.insert(A + E <= 9);
+  cs.insert(A + E >= 9);
+
+  PolyGrid cp(5);
+  cp.refine_with_constraints(cs);
+
+  bool cons_ok = (cp.space_dimension() == 5);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return cons_ok;
+}
+
+#if 0
+// Example taken from SenS07 (figure 5(a)
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(B >= -10);
+  cs.insert(B <= 5);
+  cs.insert(C >= 2);
+  cs.insert(C <= 3);
+  cs.insert(D >= 4);
+  cs.insert(D <= 9);
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert((B %= 5) / 15);
+  cgs.insert(C %= 0);
+  cgs.insert(D %= 0);
+
+  AffBox ab1(4);
+  ab1.refine_with_constraints(cs);
+  ab1.refine_with_congruences(cgs);
+  ab1.affine_image(A, 2*B + D);
+  TBox box1(4);
+  box1.refine_with_constraints(cs);
+  box1.refine_with_congruences(cgs);
+  box1.affine_image(A, 2*B + D);
+  Affine_Space affs1(4);
+  affs1.refine_with_constraints(cs);
+  affs1.refine_with_congruences(cgs);
+  affs1.affine_image(A, 2*B + D);
+  GridBox gb1(4);
+  gb1.refine_with_constraints(cs);
+  gb1.refine_with_congruences(cgs);
+  gb1.affine_image(A, 2*B + D);
+  print_constraints(ab1,
+       "*** (Affine_Space x TBox) ab1 constraints ***");
+
+  AffBox ab2(ab1);
+  TBox box2(box1);
+  Affine_Space affs2(affs1);
+  GridBox gb2(gb1);
+
+  ab1.affine_image(A, A - 4*B);
+  box1.affine_image(A, A - 4*B);
+  affs1.affine_image(A, A - 4*B);
+  gb1.affine_image(A, A - 4*B);
+
+  ab2.affine_image(A, A + 2*B);
+  box2.affine_image(A, A + 2*B);
+  affs2.affine_image(A, A + 2*B);
+  gb2.affine_image(A, A + 2*B);
+
+  ab1.upper_bound_assign(ab2);
+  box1.upper_bound_assign(box2);
+  affs1.upper_bound_assign(affs2);
+  gb1.upper_bound_assign(gb2);
+
+  Constraint_System known_cs;
+  known_cs.insert(A >= -36);
+  known_cs.insert(A <= 29);
+  known_cs.insert(B >= -10);
+  known_cs.insert(B <= 5);
+  known_cs.insert(C >= 2);
+  known_cs.insert(C <= 3);
+  known_cs.insert(D >= 4);
+  known_cs.insert(D <= 9);
+  AffBox known_ab(4);
+  known_ab.refine_with_constraints(known_cs);
+  TBox known_box(4);
+  known_box.refine_with_constraints(known_cs);
+  known_box.unconstrain(A);
+  known_box.refine_with_constraint(A >= -36);
+  known_box.refine_with_constraint(A <= 59);
+  Affine_Space known_affs(4);
+  known_affs.refine_with_constraints(known_cs);
+  GridBox known_gb(4);
+  known_gb.refine_with_constraints(known_cs);
+  known_gb.refine_with_congruences(cgs);
+  known_gb.refine_with_congruence((A - D %= 20) / 30);
+  known_gb.refine_with_congruence((B %= 5) / 15);
+
+  bool ok = (ab1 == known_ab
+             && box1 == known_box
+             && affs1 == known_affs && gb1 == known_gb);
+
+  print_constraints(ab1,
+       "*** (Affine_Space x TBox) ab1 constraints ***");
+  print_constraints(box1,
+       "*** (TBox) box1 constraints ***");
+  print_constraints(affs1, "*** (Affine_Space) affs1 constraints ***");
+  print_constraints(gb1,
+       "*** (Grid x TBox) gb1 constraints ***");
+  print_congruences(gb1,
+       "*** (Grid x TBox) gb1 congruences ***");
+
+  return ok;
+}
+
+// Example taken from SenS07 (figure 5(b)
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  Constraint_System cs;
+  cs.insert(B >= 6);
+  cs.insert(B <= 8);
+  cs.insert(C >= 1);
+  cs.insert(C <= 9);
+  Congruence_System cgs;
+  cgs.insert(A %= 0);
+  cgs.insert((B %= 0) / 2);
+  cgs.insert(C %= 0);
+  cgs.insert(D %= 0);
+  cgs.insert(E %= 0);
+
+  AffBox ab1(5);
+  TBox box1(5);
+  Affine_Space affs1(5);
+  GridBox gb1(5);
+  ab1.refine_with_constraints(cs);
+  ab1.refine_with_congruences(cgs);
+  box1.refine_with_constraints(cs);
+  box1.refine_with_congruences(cgs);
+  affs1.refine_with_constraints(cs);
+  affs1.refine_with_congruences(cgs);
+  gb1.refine_with_constraints(cs);
+  gb1.refine_with_congruences(cgs);
+
+  AffBox ab2(ab1);
+  TBox box2(box1);
+  Affine_Space affs2(affs1);
+  GridBox gb2(gb1);
+
+  ab1.affine_image(E, 2*B);
+  box1.affine_image(E, 2*B);
+  affs1.affine_image(E, 2*B);
+  gb1.affine_image(E, 2*B);
+
+  ab2.affine_image(E, B + C);
+  box2.affine_image(E, B + C);
+  affs2.affine_image(E, B + C);
+  gb2.affine_image(E, B + C);
+
+  ab1.upper_bound_assign(ab2);
+  box1.upper_bound_assign(box2);
+  affs1.upper_bound_assign(affs2);
+  gb1.upper_bound_assign(gb2);
+
+  Constraint_System known_cs(cs);
+  known_cs.insert(E >= 7);
+  known_cs.insert(E <= 17);
+  AffBox known_ab(5);
+  known_ab.refine_with_constraints(known_cs);
+  TBox known_box(5);
+  known_box.refine_with_constraints(known_cs);
+  Affine_Space known_affs(5);
+  known_affs.refine_with_constraints(known_cs);
+  GridBox known_gb(5);
+  known_gb.refine_with_constraints(known_cs);
+  known_gb.refine_with_congruences(cgs);
+
+  bool ok = (ab1 == known_ab && box1 == known_box
+             && affs1 == known_affs && gb1 == known_gb);
+
+  print_constraints(ab1, "*** (Affine_Space x TBox) ab1 constraints ***");
+  print_constraints(box1, "*** (TBox) box1 constraints ***");
+  print_constraints(affs1, "*** (Affine_Space) affs1 constraints ***");
+  print_constraints(gb1, "*** (Grid x TBox) gb1 constraints ***");
+  print_congruences(gb1, "*** (Grid x TBox) gb1 congruences ***");
+
+  return ok;
+}
+#endif
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+//DO_TEST(test09);
+  DO_TEST(test10);
+//DO_TEST_F8(test11);
+//DO_TEST(test12);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/contains1.cc b/tests/Partially_Reduced_Product/contains1.cc
new file mode 100644
index 0000000..5630207
--- /dev/null
+++ b/tests/Partially_Reduced_Product/contains1.cc
@@ -0,0 +1,103 @@
+/* Test Product<NNC_Polyhedron, Grid>::contains() and
+   Product<NNC_Polyhedron, Grid>::strictly_contains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// contains()
+bool
+test01() {
+  Variable A(0);
+
+  Product prp1(1);
+  prp1.refine_with_constraint(A <= 3);
+  prp1.refine_with_congruence((A %= 3) / 2);
+
+  Product prp2(1);
+  prp2.refine_with_constraint(A <= 3);
+  prp2.refine_with_congruence(A %= 3);
+
+  bool ok1 = !prp1.contains(prp2);
+
+  prp2.refine_with_congruence((A %= 1) / 4);
+
+  bool ok2 = prp1.contains(prp2);
+
+  prp1.refine_with_congruence((A == 1) / 0);
+  prp2.refine_with_constraint(A <= 2);
+  prp2.refine_with_constraint(A >= -1);
+  prp2.refine_with_congruence((A %= 1) / 3);
+
+  bool ok3 = !prp1.contains(prp2);
+
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+
+  return ok1 && ok2 && ok3;
+}
+
+// strictly_contains()
+bool
+test02() {
+  Variable A(0);
+
+  Product prp1(1);
+  prp1.refine_with_constraint(A <= 2);
+  prp1.refine_with_congruence(A %= 0);
+
+  Product prp2(1);
+  prp2.refine_with_constraint(A <= 1);
+  prp2.refine_with_congruence(A %= 0);
+
+  bool ok1 = prp1.strictly_contains(prp2);
+
+  prp1.refine_with_constraint(A <= 1);
+  prp2.refine_with_congruence((A %= 1) /2);
+
+  bool ok2 = prp1.strictly_contains(prp2);
+
+  prp1.refine_with_congruence((A %= 1) /2);
+
+  bool ok3 = !prp1.strictly_contains(prp2);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok1 && ok2 && ok3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/difference1.cc b/tests/Partially_Reduced_Product/difference1.cc
new file mode 100644
index 0000000..7ece934
--- /dev/null
+++ b/tests/Partially_Reduced_Product/difference1.cc
@@ -0,0 +1,141 @@
+/* Test Product<NNC_Polyhedron, Grid>::difference_assign() and.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// difference_assign()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(3, UNIVERSE);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A - B %= 0) / 2);
+
+  Product prp2(3);
+  prp2.refine_with_constraint(A >= 3);
+  prp2.refine_with_congruence((A - B %= 0) / 4);
+
+  prp1.difference_assign(prp2);
+  Product known_prp(3);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_constraint(A < 3);
+  known_prp.refine_with_congruence((A - B %= 2) / 4);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2,  "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// difference_assign()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(1);
+  prp.refine_with_constraint(A <= 18);
+  prp.refine_with_constraint(A >= 18);
+
+  Product prp1(prp);
+
+  Product prp2(1);
+  prp2.refine_with_congruence((A %= 18) / 20);
+
+  prp1.difference_assign(prp2);
+
+  bool cons_ok = prp1.is_empty();
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  if (!cons_ok)
+    return false;
+
+  prp2.difference_assign(prp1);
+
+  Product known_prp(1);
+  known_prp.refine_with_congruence((A %= 18) / 20);
+
+  cons_ok = (prp2 == known_prp);
+
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return cons_ok;
+}
+
+// difference_assign() where difference is not reduced.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(1);
+  prp.refine_with_constraint(A >= 1);
+  prp.refine_with_congruence((A %= 0) / 2);
+
+  Product prp1(prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  Product prp2(1);
+  prp2.refine_with_constraint(A > 1);
+  prp2.refine_with_congruence((A %= 1) / 2);
+
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  prp1.difference_assign(prp2);
+
+  bool cons_ok = prp1.is_empty();
+
+  print_congruences(prp1,
+                    "*** prp1.difference_assign(prp2) congruences ***");
+  print_constraints(prp1,
+                    "*** prp1.difference_assign(prp2) constraints ***");
+
+  return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/dimension1.cc b/tests/Partially_Reduced_Product/dimension1.cc
new file mode 100644
index 0000000..e27ad53
--- /dev/null
+++ b/tests/Partially_Reduced_Product/dimension1.cc
@@ -0,0 +1,84 @@
+/* Test Product<NNC_Polyhedron, Grid>::space_dimension() and
+   Product<NNC_Polyhedron, Grid>::affine_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// space_dimension()
+bool
+test01() {
+  Variable A(0);
+  Variable E(4);
+
+  Constraint_System cs(A + E < 9);
+
+  Product prp(5);
+  prp.refine_with_constraints(cs);
+
+  bool ok = (prp.space_dimension() == 5);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+
+// affine_dimension()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A - C >= 9);
+  prp.refine_with_constraint(A - C <= 9);
+  prp.refine_with_constraint(B >= 2);
+
+  bool ok = (prp.affine_dimension() == 2);
+
+  prp.refine_with_constraint(C == 4);
+  prp.refine_with_constraint(B == 2);
+
+  ok &= (ok && prp.affine_dimension() == 0);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/directproduct1.cc b/tests/Partially_Reduced_Product/directproduct1.cc
new file mode 100644
index 0000000..fbf02e6
--- /dev/null
+++ b/tests/Partially_Reduced_Product/directproduct1.cc
@@ -0,0 +1,117 @@
+/* Test Direct_Product<NNC_Polyhedron, Grid>.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Direct_Product Product;
+
+namespace {
+
+// Universe product in 0 dimensions
+bool
+test01() {
+  Product dp1;
+
+  Product dp2(0, UNIVERSE);
+
+  bool ok = (dp1 == dp2);
+
+  print_congruences(dp1, "*** dp1 congruences ***");
+  print_constraints(dp1, "*** dp1 constraints ***");
+  print_congruences(dp2, "*** dp2 congruences ***");
+  print_constraints(dp2, "*** dp2 constraints ***");
+
+  return ok && dp1.OK() && dp2.OK();
+}
+
+// Empty product(dims, type)
+bool
+test02() {
+  Product dp(3, EMPTY);
+
+  bool ok = (dp.is_empty());
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok && dp.OK();
+}
+
+// Check equalities are not propagated between components
+bool
+test03() {
+  Variable A(0);
+
+  Product dp(3);
+
+  dp.refine_with_constraint(A >= 7);
+  dp.refine_with_constraint(A <= 7);
+
+  DOMAIN1 known_result_d1(1);
+  known_result_d1.add_constraint(A == 7);
+  DOMAIN2 known_result_d2(1);
+
+  bool ok = ((!dp.domain1().is_universe() && dp.domain2().is_universe())
+             || (!dp.domain2().is_universe() && dp.domain1().is_universe()));
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok && dp.OK();
+}
+
+// Check emptiness is not propagated between components
+bool
+test04() {
+  Variable A(0);
+
+  Product dp(3);
+
+  dp.refine_with_constraint(A >= 7);
+  dp.refine_with_constraint(A <= 5);
+
+  DOMAIN1 known_result_d1(1, EMPTY);
+  DOMAIN2 known_result_d2(1);
+
+  bool ok = ((dp.domain1().is_empty() && dp.domain2().is_universe())
+             || (dp.domain2().is_empty() && dp.domain1().is_universe()));
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/discrete1.cc b/tests/Partially_Reduced_Product/discrete1.cc
new file mode 100644
index 0000000..e298d8b
--- /dev/null
+++ b/tests/Partially_Reduced_Product/discrete1.cc
@@ -0,0 +1,101 @@
+/* Test Product<>::is_discrete().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_discrete(), due to grid.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A == 1);
+  prp.refine_with_constraint(B == 2);
+  prp.refine_with_constraint(C <= 3);
+  prp.refine_with_congruence((C %= 0) / 3);
+
+  bool ok = prp.is_discrete();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_discrete(), due to polyhedron.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A <= 3);
+  prp.refine_with_constraint(A >= 3);
+  prp.refine_with_constraint(B == 0);
+
+  bool ok = prp.is_discrete();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_discrete() is false, as the components are not discrete
+// although the intersection is discrete..
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_congruence((A - B %= 0) / 0);
+  prp.refine_with_constraint(B >= 0);
+  prp.refine_with_constraint(B <= 0);
+
+  bool ok = !prp.is_discrete();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/disjoint1.cc b/tests/Partially_Reduced_Product/disjoint1.cc
new file mode 100644
index 0000000..b1a00ba
--- /dev/null
+++ b/tests/Partially_Reduced_Product/disjoint1.cc
@@ -0,0 +1,163 @@
+/* Test Product<>::is_disjoint().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+
+// is_disjoint_from(prp), due to the Polyhedra.
+bool
+test01() {
+  Variable B(1);
+
+  Product prp1(12);
+  Product prp2(12);
+  prp1.refine_with_constraint(B < 2);
+  prp2.refine_with_constraint(B > 3);
+  bool ok = prp1.is_disjoint_from(prp2);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(prp), due to the Grids.
+bool
+test02() {
+  Variable A(0);
+
+  Product prp1(3);
+  prp1.refine_with_congruence((A %= 0) / 7);
+
+  Product prp2(3);
+  prp2.refine_with_congruence((A %= 1) / 7);
+
+  bool ok = prp1.is_disjoint_from(prp2);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(prp), due to either.
+bool
+test03() {
+  Variable A(0);
+
+  Product prp1(3);
+  prp1.refine_with_congruence((A %= 0) / 7);
+  Product prp2(3);
+  prp2.refine_with_congruence((A %= 1) / 7);
+  prp1.refine_with_constraint(A < 3);
+  prp2.refine_with_constraint(A > 3);
+
+  bool ok = prp1.is_disjoint_from(prp2);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(prp), due to both.
+bool
+test04() {
+  Variable A(0);
+
+  Product prp1(3);
+  prp1.refine_with_congruence((A %= 1) / 7);
+  Product prp2(3);
+  prp2.refine_with_congruence((A %= 1) / 14);
+  prp1.refine_with_constraint(A < 6);
+  prp2.refine_with_constraint(A > 3);
+
+  bool ok = !prp1.is_disjoint_from(prp2);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// is_disjoint_from(prp), due to the intersection of the entire direct
+// products (i.e. the prp1 and prp2 polyhedron components intersect, as
+// do the grid components).
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(2);
+  prp1.refine_with_constraint(A <= 4);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_constraint(A - B <= 0);
+  prp1.refine_with_constraint(A - B >= 2);
+  prp1.refine_with_congruence((A %= 0) / 2);
+  prp1.refine_with_congruence((A %= 0) / 4);
+
+  Product prp2(2);
+  prp2.refine_with_constraint(A <= 4);
+  prp2.refine_with_constraint(A <= 0);
+  prp2.refine_with_constraint(A + B >= 4);
+  prp2.refine_with_constraint(A + B <= 6);
+  // Same grid as prp1.
+  prp2.refine_with_congruence((A %= 0) / 2);
+  prp2.refine_with_congruence((A %= 0) / 4);
+
+  bool ok = prp1.is_disjoint_from(prp2);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc b/tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..3bd0b1f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/dropsomenonintegerpoints1.cc
@@ -0,0 +1,132 @@
+/* Test Product<NNC_Polyhedron, Grid>::drop_some_non_integer_points().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// drop_some_non_integer_points(ANY_COMPLEXITY)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_constraint(B >= 0);
+  prp1.refine_with_constraint(A + B >= 3);
+  prp1.refine_with_constraint(2*A - B == 0);
+  prp1.refine_with_constraint(3*A + C == 0);
+  prp1.refine_with_congruence(3*A %= 0);
+
+  prp1.drop_some_non_integer_points(ANY_COMPLEXITY);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(3*A + C == 0);
+  known_prp.refine_with_constraint(2*A - B == 0);
+  known_prp.refine_with_constraint(A >= 1);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1.time_elapse_assign(prp1) congruences ***");
+  print_constraints(prp1, "*** prp1.time_elapse_assign(prp1) constraints ***");
+
+  return ok;
+}
+
+// drop_some_non_integer_points(ANY_COMPLEXITY)
+// where the initial products are not reduced
+// and the second product has non-intersecting single point components.
+bool
+test02() {
+  Variable A(0);
+
+
+  Product prp1(1);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  prp1.drop_some_non_integer_points(ANY_COMPLEXITY);
+
+  Product known_prp(1);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = prp1.OK() && (prp1 == known_prp);
+
+  print_congruences(prp1,
+                    "*** prp1.drop_some_non_integer_points(ANY_COMPLEXITY) congruences ***");
+  print_constraints(prp1,
+                    "*** prp1.drop_some_non_integer_points(ANY_COMPLEXITY) constraints ***");
+
+  return ok;
+}
+
+// drop_some_non_integer_points(vars, ANY_COMPLEXITY)
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Variables_Set vars;
+  vars.insert(A);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_constraint(B >= 0);
+  prp1.refine_with_constraint(A + B >= 3);
+  prp1.refine_with_constraint(2*A - B == 0);
+  prp1.refine_with_constraint(3*A + C == 0);
+  prp1.refine_with_congruence(3*A %= 0);
+
+  prp1.drop_some_non_integer_points(vars, ANY_COMPLEXITY);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(3*A + C == 0);
+  known_prp.refine_with_constraint(2*A - B == 0);
+  known_prp.refine_with_constraint(A >= 1);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1.time_elapse_assign(prp1) congruences ***");
+  print_constraints(prp1, "*** prp1.time_elapse_assign(prp1) constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/equals1.cc b/tests/Partially_Reduced_Product/equals1.cc
new file mode 100644
index 0000000..c38acef
--- /dev/null
+++ b/tests/Partially_Reduced_Product/equals1.cc
@@ -0,0 +1,83 @@
+/* Test operator==() and operator!=().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A + B >= 9);
+
+  Product dp(2);
+  dp.refine_with_constraints(cs);
+  dp.refine_with_congruence((A %= 9) / 19);
+
+  Product dp1 = dp;
+
+  bool ok = (dp == dp1);
+
+  print_congruences(dp, "*** dp1 congruences ***");
+  print_constraints(dp, "*** dp1 constraints ***");
+
+  return ok && dp.OK() && dp1.OK();
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A + B >= 9);
+
+  Product dp(2);
+  dp.refine_with_constraints(cs);
+  dp.refine_with_congruence((A %= 9) / 19);
+
+  Product dp1(2);
+
+  bool ok = (dp != dp1);
+
+  print_congruences(dp, "*** dp1 congruences ***");
+  print_constraints(dp, "*** dp1 constraints ***");
+
+  return ok && dp.OK() && dp1.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/frombdshape1.cc b/tests/Partially_Reduced_Product/frombdshape1.cc
new file mode 100644
index 0000000..56a8f16
--- /dev/null
+++ b/tests/Partially_Reduced_Product/frombdshape1.cc
@@ -0,0 +1,65 @@
+/* Test construction of product from BD_Shape.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(bds).
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A >= 0);
+  cs.insert(2*A - 2*B >= 5);
+
+  TBD_Shape bd(cs);
+
+  Product dp(bd);
+
+  Product known_result(2);
+  known_result.refine_with_constraint(A >= 0);
+  known_result.refine_with_constraint(2*A - 2*B >= 5);
+
+  bool ok = (dp == known_result);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/frombox1.cc b/tests/Partially_Reduced_Product/frombox1.cc
new file mode 100644
index 0000000..7eb7c05
--- /dev/null
+++ b/tests/Partially_Reduced_Product/frombox1.cc
@@ -0,0 +1,87 @@
+/* Test construction of product from a Box.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(bounding_box)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  TBox box(2);
+  box.refine_with_constraint(3*B >= 2);
+  box.refine_with_constraint(A >= 2);
+  box.refine_with_constraint(A <= 2);
+
+  Product dp(box);
+
+  Product known_dp(2);
+  known_dp.refine_with_constraint(3*B >= 2);
+  known_dp.refine_with_constraint(A == 2);
+
+  bool ok = (dp == known_dp) && dp.OK();
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  const Constraint_System cs(A > 0);
+
+  TBox box(cs);
+
+  Product dp(box);
+
+  Product known_result(1);
+  known_result.refine_with_constraint(A > 0);
+
+  bool ok = (dp == known_result);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/fromgrid1.cc b/tests/Partially_Reduced_Product/fromgrid1.cc
new file mode 100644
index 0000000..67cb6d7
--- /dev/null
+++ b/tests/Partially_Reduced_Product/fromgrid1.cc
@@ -0,0 +1,62 @@
+/* Test construction of product from a grid.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(grid).
+bool
+test01() {
+  Variable A(0);
+
+  const Congruence_System cgs(A %= 0);
+
+  Grid gr(cgs);
+
+  Product dp(gr);
+
+  Product known_result(1);
+  known_result.refine_with_congruence((A %= 0) / 1);
+
+  bool ok = (dp == known_result);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/fromoctagonalshape1.cc b/tests/Partially_Reduced_Product/fromoctagonalshape1.cc
new file mode 100644
index 0000000..51fe88f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/fromoctagonalshape1.cc
@@ -0,0 +1,65 @@
+/* Test construction of product from octagonal shape.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(os).
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A >= 0);
+  cs.insert(2*A + 2*B >= 5);
+
+  TOctagonal_Shape os(cs);
+
+  Product dp(os);
+
+  Product known_result(2);
+  known_result.refine_with_constraint(A >= 0);
+  known_result.refine_with_constraint(2*A + 2*B >= 5);
+
+  bool ok = (dp == known_result);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/frompolyhedron1.cc b/tests/Partially_Reduced_Product/frompolyhedron1.cc
new file mode 100644
index 0000000..0969988
--- /dev/null
+++ b/tests/Partially_Reduced_Product/frompolyhedron1.cc
@@ -0,0 +1,120 @@
+/* Test construction of product from a polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Product(c_polyhedron).
+bool
+test01() {
+  Variable A(0);
+
+  const Constraint_System cs(A == 0);
+
+  C_Polyhedron ph(cs);
+
+  Product dp(ph);
+
+  Product known_result(1);
+  known_result.refine_with_congruence((A %= 0) / 0);
+
+  bool ok = (dp == known_result);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+// Product(nnc_polyhedron).
+bool
+test02() {
+  Variable A(0);
+
+  const Constraint_System cs(A > 0);
+
+  NNC_Polyhedron ph(cs);
+
+  Product dp(ph);
+
+  Product known_result(1);
+  known_result.refine_with_constraint(A > 0);
+
+  bool ok = (dp == known_result);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+typedef Domain_Product<TBox, Grid>::Constraints_Product TBox_Grid;
+
+// TBox_Grid(nnc_polyhedron, POLYNOMIAL_COMPLEXITY).
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_constraint(3*x + y >= 2);
+  ph.refine_with_constraint(x <= 4);
+  ph.refine_with_constraint(y <= 4);
+
+  TBox_Grid pprp(ph, POLYNOMIAL_COMPLEXITY);
+
+  TBox_Grid nprp(ph);
+
+  TBox_Grid known_prp(2);
+  known_prp.refine_with_constraint(3*x >= -2);
+  known_prp.refine_with_constraint(x <= 4);
+  known_prp.refine_with_constraint(y >= -10);
+  known_prp.refine_with_constraint(y <= 4);
+
+  bool ok = (nprp == known_prp && pprp == known_prp);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(nprp, "*** nprp ***");
+  print_congruences(nprp, "*** nprp ***");
+  print_constraints(pprp, "*** pprp ***");
+  print_congruences(pprp, "*** pprp ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/fromproduct1.cc b/tests/Partially_Reduced_Product/fromproduct1.cc
new file mode 100644
index 0000000..2f34301
--- /dev/null
+++ b/tests/Partially_Reduced_Product/fromproduct1.cc
@@ -0,0 +1,179 @@
+/* Test construction of product from another product.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Direct_Product DProduct;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product CProduct;
+
+namespace {
+
+// Copy constructor.
+bool
+test01() {
+  Variable A(0);
+  Variable C(2);
+
+  DProduct dp1(3);
+  dp1.refine_with_constraint(A - C == 0);
+
+  DProduct dp(dp1);
+
+  bool ok = (dp == dp1);
+
+  print_congruences(dp, "*** dp congruences ***");
+  print_constraints(dp, "*** dp constraints ***");
+
+  return ok && dp.OK();
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable C(2);
+
+  DProduct dp(3);
+  dp.refine_with_constraint(A - C == 0);
+
+  CProduct cp(dp);
+
+  CProduct known_result(3);
+  known_result.refine_with_constraint(A - C == 0);
+  bool ok = (cp == known_result);
+
+  print_congruences(cp, "*** cp congruences ***");
+  print_constraints(cp, "*** cp constraints ***");
+
+  return ok && dp.OK();
+}
+
+typedef Domain_Product<TBox, Grid>::Constraints_Product TBox_Grid;
+typedef Domain_Product<Grid, TBox>::Constraints_Product Grid_TBox;
+typedef Domain_Product<NNC_Polyhedron, Grid>::Constraints_Product NNCPoly_Grid;
+
+// Copy constructor.
+bool
+test03() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+
+  NNCPoly_Grid src(1);
+  src.refine_with_constraints(cs);
+
+  NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+  NNCPoly_Grid prp1(src);
+
+  NNCPoly_Grid known_prp(1);
+  known_prp.refine_with_constraint(A >= 0);
+
+  bool ok = (prp == known_prp && prp1 == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a TBox_Grid.
+bool
+test04() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+  const Congruence_System cgs(A %= 0);
+
+  TBox_Grid src(1);
+  src.refine_with_constraints(cs);
+  src.refine_with_congruences(cgs);
+
+  NNCPoly_Grid prp(src, POLYNOMIAL_COMPLEXITY);
+
+  NNCPoly_Grid prp1(src);
+
+  NNCPoly_Grid known_prp(1);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp == known_prp && prp1 == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok && prp.OK();
+}
+
+// Constructing an NNCPoly_Grid from a Grid_TBox.
+bool
+test05() {
+  Variable A(0);
+
+  const Constraint_System cs(A >= 0);
+  const Congruence_System cgs(A %= 0);
+
+  Grid_TBox src(1);
+  src.refine_with_constraints(cs);
+  src.refine_with_congruences(cgs);
+
+  NNCPoly_Grid prp(src);
+
+  NNCPoly_Grid prp1(src);
+
+  NNCPoly_Grid known_prp(1);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp == known_prp && prp1 == known_prp);
+
+  print_congruences(src, "*** src congruences ***");
+  print_constraints(src, "*** src constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(known_prp, "*** known_prp congruences ***");
+  print_constraints(known_prp, "*** known_prp constraints ***");
+
+  return ok && prp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/generalizedaffineimage1.cc b/tests/Partially_Reduced_Product/generalizedaffineimage1.cc
new file mode 100644
index 0000000..25791ca
--- /dev/null
+++ b/tests/Partially_Reduced_Product/generalizedaffineimage1.cc
@@ -0,0 +1,262 @@
+/* Test Product<NNC_Polyhedron, Grid>::generalized_affine_image() and
+   Product<NNC_Polyhedron, Grid>::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// generalized_affine_image(v, EQUAL, e)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_congruence(A %= 0);
+  prp.refine_with_congruence((A + B %= 0) / 2);
+  prp.refine_with_constraint(B >= 0);
+  prp.refine_with_constraint(A - B >= 0);
+
+  Linear_Expression le(A+2);
+
+  prp.generalized_affine_image(A, EQUAL, le);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence(A %= 0);
+  known_prp.refine_with_congruence((A + B %= 0) / 2);
+  known_prp.refine_with_constraint(B >= 0);
+  known_prp.refine_with_constraint(A - B >= 2);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_image(v, EQUAL, e, d)
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_congruence(A %= 0);
+  prp.refine_with_congruence((A + B %= 0) / 2);
+  prp.refine_with_constraint(A >= 3);
+
+  prp.generalized_affine_image(B, EQUAL, A + 1, 2);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(A - 2*B == -1);
+  known_prp.refine_with_congruence(A %= 0);
+  known_prp.refine_with_constraint(A >= 3);
+  known_prp.refine_with_constraint(B >= 2);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(v, GREATER_OR_EQUAL, e)
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_constraint(A >= 0);
+  prp.refine_with_constraint(A <= 4);
+  prp.refine_with_constraint(B <= 5);
+  prp.refine_with_constraint(A <= B);
+  prp.refine_with_congruence(A %= B);
+
+  prp.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(0 <= A);
+  known_prp.refine_with_constraint(A <= 3);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(v, EQUAL, e, d),
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence(A %= 0);
+  prp.refine_with_congruence((B %= 0) / 2);
+
+  prp.generalized_affine_preimage(B, EQUAL, A + B, 1);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((A + B %= 0) / 2);
+  known_prp.refine_with_congruence(A %= 0);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_image(lhs, relsym, rhs)
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_congruence(A %= 0);
+  prp.refine_with_constraint(B >= 0);
+  prp.refine_with_constraint(A - B >= 1);
+
+  prp.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence(A %= 0);
+  known_prp.refine_with_constraint(B >= 0);
+  known_prp.refine_with_constraint(A - B >= 1);
+  known_prp.refine_with_constraint(2 <= A + B);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_image(lhs, EQUAL, rhs),
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cs;
+  cs.insert((A %= 0) / 1);
+  cs.insert((B %= 0) / 2);
+
+  Product prp(2);
+  prp.refine_with_congruences(cs);
+  prp.refine_with_constraint(A <= 3);
+
+  prp.generalized_affine_image(A + 2*B, EQUAL, A - B);
+
+  Product known_prp(2);
+  known_prp.refine_with_congruence((A + 2*B %= 0) / 1);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(lhs, relsym, rhs).
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A <= 4);
+  cs.insert(B <= 5);
+  cs.insert(A <= B);
+
+  Product prp(3);
+  prp.refine_with_constraints(cs);
+  prp.refine_with_congruence(A %= B);
+
+  prp.generalized_affine_preimage(1*B, GREATER_OR_EQUAL, A+2);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(0 <= A);
+  known_prp.refine_with_constraint(A <= 3);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// generalized_affine_preimage(lhs, EQUAL, rhs)
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(A - B == 1);
+
+  prp.generalized_affine_preimage(A - B, EQUAL, 2*A - 2*B);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((2*A - 2*B %= 1) / 0);
+
+  bool ok = (prp == known_prp);
+
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/intersection1.cc b/tests/Partially_Reduced_Product/intersection1.cc
new file mode 100644
index 0000000..ae33049
--- /dev/null
+++ b/tests/Partially_Reduced_Product/intersection1.cc
@@ -0,0 +1,125 @@
+/* Test Product<NNC_Polyhedron, Grid>::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// intersection_assign()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A %= 0) / 2);
+
+  Product prp2(3);
+  prp2.refine_with_constraint(A <= 0);
+  prp2.refine_with_congruence((A %= 0) / 7);
+
+  prp1.intersection_assign(prp2);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((A %= 0) / 14);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_constraint(A <= 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok;
+}
+
+// intersection_assign()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A %= 0) / 2);
+  prp1.refine_with_constraint(B <= 1);
+
+  Product prp2(3);
+  prp2.refine_with_constraint(A <= 0);
+  prp2.refine_with_congruence((A %= 0) / 7);
+  prp2.refine_with_constraint(B >= 1);
+
+  prp1.intersection_assign(prp2);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(A == 0);
+  known_prp.refine_with_constraint(B == 1);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok;
+}
+
+// intersection_assign()
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A %= 0) / 2);
+  prp1.refine_with_constraint(B <= 1);
+
+  Product prp2(3);
+  prp2.refine_with_constraint(A <= 0);
+  prp2.refine_with_congruence((A %= 0) / 7);
+  prp2.refine_with_constraint(B >= 2);
+
+  prp1.intersection_assign(prp2);
+
+  prp1.intersection_assign(prp2);
+  bool ok = prp1.is_empty();
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/isempty1.cc b/tests/Partially_Reduced_Product/isempty1.cc
new file mode 100644
index 0000000..abc31be
--- /dev/null
+++ b/tests/Partially_Reduced_Product/isempty1.cc
@@ -0,0 +1,95 @@
+/* Test Product<>::is_empty().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_empty() where both domain objects have points.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence(A %= 9);
+  prp.refine_with_congruence(B + C %= 3);
+
+  bool ok = !prp.is_empty();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_empty() where one domain object is empty.
+bool
+test02() {
+  Variable A(0);
+
+  Product prp(3);
+
+  prp.refine_with_congruence((A %= 0) / 2);
+  prp.refine_with_congruence((A %= 1) / 2);
+
+  bool ok = prp.is_empty();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_empty() where both domain objects are empty.
+bool
+test03() {
+  Variable A(0);
+
+  Product prp(3);
+  prp.refine_with_constraint(A == 1);
+  prp.refine_with_constraint(A == 3);
+
+  bool ok = prp.is_empty();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/isuniverse1.cc b/tests/Partially_Reduced_Product/isuniverse1.cc
new file mode 100644
index 0000000..01b932f
--- /dev/null
+++ b/tests/Partially_Reduced_Product/isuniverse1.cc
@@ -0,0 +1,84 @@
+/* Test Product<>::is_universe1().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_universe() where both domain objects are empty.
+bool
+test01() {
+  Product prp(3, EMPTY);
+
+  bool ok = !prp.is_universe();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_universe() where one domain object is universe.
+bool
+test02() {
+  Variable A(0);
+
+  Product prp(3);
+  prp.refine_with_congruence((A %= 0) / 2);
+  prp.refine_with_congruence((A %= 1) / 2);
+
+  bool ok = !prp.is_universe();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_universe() where both domain objects are universe.
+bool
+test03() {
+  Product prp(3);
+
+  bool ok = prp.is_universe();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/maxmin1.cc b/tests/Partially_Reduced_Product/maxmin1.cc
new file mode 100644
index 0000000..b171f03
--- /dev/null
+++ b/tests/Partially_Reduced_Product/maxmin1.cc
@@ -0,0 +1,249 @@
+/* Test Product<NNC_Polyhedron, Grid>::maximize() and
+   Product<NNC_Polyhedron, Grid>::minimize()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Empty. maximize() and minimize()
+bool
+test01() {
+  Product prp(7, EMPTY);
+
+  Coefficient extr_n;
+  Coefficient extr_d;
+  bool dummy;
+
+  bool ok = (!prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy));
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension empty.
+bool
+test02() {
+  Product prp(0, EMPTY);
+
+  Coefficient extr_n;
+  Coefficient extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+    && !prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Zero dimension universe.
+bool
+test03() {
+  Product prp(0);
+
+  Coefficient extr_n, extr_d;
+  bool dummy;
+  Generator pnt(point());
+
+  bool ok = prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy)
+    && prp.maximize(Linear_Expression(0), extr_n, extr_d, dummy, pnt);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Point.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A == 1);
+  prp.refine_with_constraint(3*B == 2);
+
+  Linear_Expression le = A + B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  Generator known_pnt(point(3*A + 2*B, 3));
+  bool max;
+  bool min;
+
+  bool ok = prp.maximize(le, max_n, max_d, max)
+    && prp.minimize(le, min_n, min_d, min)
+    && prp.maximize(le, max_n, max_d, max, pnt_max)
+    && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 5 && max_d == 3 && min_n == 5 && min_d == 3
+    && pnt_max == known_pnt && pnt_min == known_pnt;
+
+  print_generator(pnt_max, "*** max point ***");
+  print_generator(pnt_min, "*** min point ***");
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// only one component is bounded.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A - B >= 1);
+  prp.refine_with_constraint(A - B <= 1);
+  prp.refine_with_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = prp.maximize(le, max_n, max_d, max)
+    && prp.minimize(le, min_n, min_d, min)
+    && prp.maximize(le, max_n, max_d, max, pnt_max)
+    && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok
+    && max && min && max_n == 1 && max_d == 1 && min_n == 1 && min_d == 1
+    && pnt_max == pnt_min;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// Line and neither component is bounded.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(B == 1);
+
+  Linear_Expression le = 2*A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+  bool max;
+  bool min;
+
+  bool ok = !prp.maximize(le, max_n, max_d, max)
+    && !prp.minimize(le, min_n, min_d, min)
+    && !prp.maximize(le, max_n, max_d, max, pnt_max)
+    && !prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// only one component is strictly bounded.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+
+  prp.refine_with_constraint(A - B > 0);
+  prp.refine_with_constraint(A - B < 1);
+  prp.refine_with_congruence(3*B %= 2);
+
+  Linear_Expression le = A - B;
+
+  Coefficient max_n;
+  Coefficient max_d;
+  Coefficient min_n;
+  Coefficient min_d;
+  Generator pnt_max(point());
+  Generator pnt_min(point());
+
+  bool max;
+  bool min;
+
+  bool ok = prp.maximize(le, max_n, max_d, max)
+    && prp.minimize(le, min_n, min_d, min)
+    && prp.maximize(le, max_n, max_d, max, pnt_max)
+    && prp.minimize(le, min_n, min_d, min, pnt_min);
+
+  ok = ok && !max && !min;
+
+  ok = ok && max_n == 1 && max_d == 1 && min_n == 0 && min_d == 1;
+
+  print_generator(pnt_max, "*** maximum point ***");
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/partially_reduced_product_test.hh b/tests/Partially_Reduced_Product/partially_reduced_product_test.hh
new file mode 100644
index 0000000..e05b6fb
--- /dev/null
+++ b/tests/Partially_Reduced_Product/partially_reduced_product_test.hh
@@ -0,0 +1,30 @@
+/* Header file for partially_reduced_product test programs.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifdef REVERSED_TEST
+#define DOMAIN1 DOMAIN2x
+#define DOMAIN2 DOMAIN1x
+#else
+#define DOMAIN1 DOMAIN1x
+#define DOMAIN2 DOMAIN2x
+#endif
diff --git a/tests/Partially_Reduced_Product/refinewithcongruences1.cc b/tests/Partially_Reduced_Product/refinewithcongruences1.cc
new file mode 100644
index 0000000..ef37833
--- /dev/null
+++ b/tests/Partially_Reduced_Product/refinewithcongruences1.cc
@@ -0,0 +1,265 @@
+/* Test refine_with_congruence() and refine_with_congruences()..
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Refine with an equality congruence.
+bool
+test01() {
+  Variable A(0);
+
+  Product prp(1);
+  prp.refine_with_congruence((A == 0) / 0);
+
+  DOMAIN2 gr(1);
+  gr.refine_with_congruence((A == 0) / 0);
+  Product known_result(gr);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Refine with a proper congruence.
+bool
+test02() {
+  Variable A(0);
+
+  Product prp(1);
+  prp.refine_with_congruence((A %= 0) / 4);
+
+  DOMAIN2 gr(1);
+  gr.refine_with_congruence((A %= 0) / 4);
+  Product known_result(gr);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Refine with congruences.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((2*A %= 1) / 4);
+  cgs.insert((A + B %= 1) / 0);
+
+  Product prp(2);
+  prp.refine_with_congruences(cgs);
+
+  DOMAIN2 gr(2);
+  gr.refine_with_congruences(cgs);
+  Product known_result(gr);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Universe product with 0 dimensions.
+bool
+test04() {
+
+  Product prp(0);
+  prp.refine_with_congruence((Linear_Expression(0) == 1) / 2);
+
+  Product known_result(0, EMPTY);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Empty product with 0 dimensions.
+bool
+test05() {
+
+  Product prp(0, EMPTY);
+  prp.refine_with_congruence((Linear_Expression(0) == 0) / 0);
+
+  Product known_result(0, EMPTY);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// refine_with_congruences
+bool
+test06() {
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((B == 0) / 2);
+
+  Product dp(2);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  dp.refine_with_congruences(cgs);
+
+  Product known_dp(2);
+  known_dp.refine_with_congruence((A %= 0) / 2);
+  known_dp.refine_with_congruence((B == 0) / 2);
+
+  bool ok = (dp == known_dp);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// refine_with_congruences
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert(A + B == 0);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_congruences(cgs);
+  bool ok = !prp.is_empty();
+
+  Product known_prp(2);
+  known_prp.refine_with_congruence((A %= 0) / 2);
+  known_prp.refine_with_constraint(A + B == 0);
+
+  ok = ok && (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// refine_with_congruences
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A + B %= 0) / 2);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_congruences(cgs);
+
+  Product known_prp(2);
+  known_prp.refine_with_congruence((A + B %= 0) / 2);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// refine_with_congruences
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((B %= 0) / 2);
+  cgs.insert(A - B == 0);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_congruences(cgs);
+  bool ok = !prp.is_empty();
+
+  Product known_prp(2);
+  known_prp.refine_with_congruence((B %= 0) / 2);
+  known_prp.refine_with_constraint(A - B == 0);
+
+  ok = ok &&(prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/refinewithconstraints1.cc b/tests/Partially_Reduced_Product/refinewithconstraints1.cc
new file mode 100644
index 0000000..f86ce29
--- /dev/null
+++ b/tests/Partially_Reduced_Product/refinewithconstraints1.cc
@@ -0,0 +1,342 @@
+/* Test refine_with_constraint() and refine_with_constraints()..
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// Refine with an equality constraint.
+bool
+test01() {
+  Variable A(0);
+
+  Product prp(1);
+  prp.refine_with_constraint(A == 0);
+
+  DOMAIN2 gr(1);
+  gr.refine_with_constraint(A == 0);
+  Product known_result(gr);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Refine with a proper constraint.
+bool
+test02() {
+  Variable A(0);
+
+  Product prp(1);
+  prp.refine_with_constraint(A >= 4);
+
+  DOMAIN1 ph(1);
+  ph.refine_with_constraint(A >= 4);
+  Product known_result(ph);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Refine with constraints.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(2*A <= 1);
+  cs.insert(A + B >= 1);
+
+  Product prp(2);
+  prp.refine_with_constraints(cs);
+
+  DOMAIN1 ph(2);
+  ph.refine_with_constraints(cs);
+  Product known_result(ph);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Universe product with 0 dimensions.
+bool
+test04() {
+
+  Product prp(0);
+  prp.refine_with_constraint(Linear_Expression(0) >= 1);
+
+  Product known_result(0, EMPTY);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// Empty product with 0 dimensions.
+bool
+test05() {
+
+  Product prp(0, EMPTY);
+  prp.refine_with_constraint(Linear_Expression(0) == 0);
+
+  Product known_result(0, EMPTY);
+
+  bool ok = (prp == known_result);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok && prp.OK();
+}
+
+// refine_with_constraints
+bool
+test06() {
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B == 0);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_constraints(cs);
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_constraint(B == 0);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// refine_with_constraints
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 0);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_constraints(cs);
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(A + B <= 0);
+
+  bool ok = (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// refine_with_constraints
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(A + B == 0);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_constraints(cs);
+  bool ok = !prp.is_empty();
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_constraint(A + B == 0);
+
+  ok = ok && (prp == known_prp);
+
+  return ok;
+}
+
+// refine_with_constraints
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(B >= 0);
+  cs.insert(A - B == 0);
+
+  Product prp(2);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  prp.refine_with_constraints(cs);
+  bool ok = !prp.is_empty();
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(B >= 0);
+  known_prp.refine_with_constraint(A - B == 0);
+
+  ok = ok && (prp == known_prp);
+
+  print_constraints(prp, "*** prp constraints ***");
+  print_congruences(prp, "*** prp congruences ***");
+
+  return ok;
+}
+
+// refine_with_constraints() and refine_with_congruences()
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 6);
+  prp.refine_with_constraints(cs);
+
+  Product known_prp(prp);
+
+  Constraint_System cs1;
+  cs1.insert(A > 2);
+  cs1.insert(B >= 2);
+  Congruence_System cgs1;
+  cgs1.insert((B %= 2) / 4);
+  cgs1.insert((A + B %= 6) / 0);
+  prp.refine_with_constraint(A > 2);
+  prp.refine_with_constraint(B >= 2);
+  prp.refine_with_congruence((B %= 2) / 4);
+  prp.refine_with_congruence((A + B %= 6) / 0);
+
+  bool ok = prp.OK();
+
+  known_prp.refine_with_constraint(A > 2);
+  known_prp.refine_with_constraint(B >= 2);
+  known_prp.refine_with_congruence((B %= 2) / 4);
+  known_prp.refine_with_congruence((A + B %= 6) / 0);
+
+  ok = ok && prp == known_prp;
+
+  print_congruences(prp, "*** after ok check: prp congruences ***");
+  print_constraints(prp, "*** after ok check: prp constraints ***");
+
+  return ok;
+}
+
+// refine_with_constraints() and refine_with_congruences()
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(A <= 6);
+  prp.refine_with_constraints(cs);
+
+  Product known_prp(prp);
+
+  Constraint_System cs1;
+  cs1.insert(A > 2);
+  cs1.insert(B >= 2);
+  Congruence_System cgs1;
+  cgs1.insert((B %= 2) / 4);
+  cgs1.insert((A + B %= 6) / 0);
+  prp.refine_with_constraints(cs1);
+  prp.refine_with_congruences(cgs1);
+
+  bool ok = prp.OK();
+
+  known_prp.refine_with_constraint(A > 2);
+  known_prp.refine_with_constraint(B >= 2);
+  known_prp.refine_with_congruence((B %= 2) / 4);
+  known_prp.refine_with_congruence((A + B %= 6) / 0);
+
+  ok = ok && prp == known_prp;
+
+  print_congruences(prp, "*** after ok check: prp congruences ***");
+  print_constraints(prp, "*** after ok check: prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/relations1.cc b/tests/Partially_Reduced_Product/relations1.cc
new file mode 100644
index 0000000..8f46ced
--- /dev/null
+++ b/tests/Partially_Reduced_Product/relations1.cc
@@ -0,0 +1,316 @@
+/* Test relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// relation_with a generator
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator pnt(point(A + B));
+
+  Product dp(2);
+
+  bool ok = Poly_Gen_Relation::subsumes() == dp.relation_with(pnt);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// relation_with a constraint
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint c(A == 2);
+
+  Product dp(2);
+
+  bool ok = Poly_Con_Relation::nothing() == dp.relation_with(c);
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// Empty product; relation_with a constraint.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.refine_with_constraint(A == 1);
+  dp.refine_with_congruence((A %= 2) / 0);
+
+  bool ok = (dp.relation_with(B == 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates())
+             && dp.relation_with(B >= 0)
+             == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates()));
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// A product in 3D; relation_with a constraint.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_constraint(3*A + 3*B + C == 7);
+  dp.refine_with_constraint(3*A - C >= 2);
+  dp.refine_with_congruence(6*A + 3*B %= 0);
+
+  Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B >= 3);
+  Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B >= 3);
+  bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+  bool okdp2 = (rel2 == Poly_Con_Relation::is_included());
+
+  if (!okdp1 || !okdp2) {
+    nout << "dp.domain1().relation_with(2*A + B >= 3) == " << rel1 << endl;
+    nout << "dp.domain2().relation_with(2*A + B >= 3) == " << rel2 << endl;
+    print_constraints(dp, "*** dp constraints ***");
+    print_congruences(dp, "*** dp congruences ***");
+    return false;
+  }
+
+  Poly_Con_Relation rel3 = dp.relation_with(A + B + C == 0);
+  Poly_Con_Relation rel4 = dp.relation_with(A + B == 0);
+  Poly_Con_Relation rel5 = dp.relation_with(A == 0);
+  Poly_Con_Relation rel6 = dp.relation_with(Linear_Expression(0) == 0);
+  Poly_Con_Relation rel7 = dp.relation_with(2*A + B >= 3);
+  Poly_Con_Relation rel8 = dp.relation_with(3*A + 3*B + C >= 7);
+  bool ok = (rel3 == Poly_Con_Relation::nothing()
+             && rel4 == Poly_Con_Relation::nothing()
+             && rel5 == Poly_Con_Relation::nothing()
+             && rel6 == (Poly_Con_Relation::is_included()
+                         && Poly_Con_Relation::saturates())
+             && rel7 == Poly_Con_Relation::is_included()
+             && rel8 == (Poly_Con_Relation::is_included()
+                         && Poly_Con_Relation::saturates()));
+
+  nout << "dp.relation_with(A + B + C %= 0) == " << rel3 << endl;
+  nout << "dp.relation_with(A + B %= 0) == " << rel4 << endl;
+  nout << "dp.relation_with(A %= 0) == " << rel5 << endl;
+  nout << "dp.relation_with(Linear_Expression(0) %= 0) == " << rel6 << endl;
+  nout << "dp.relation_with(2*A + B %= 3) == " << rel7 << endl;
+  nout << "dp.relation_with(3*A + 3*B + C %= 7) == " << rel8 << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+  return ok;
+}
+
+// A product where the components strictly intersect the constraint.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_constraint(C == 0);
+  dp.refine_with_congruence(6*A + 3*B %= 0);
+
+  Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B >= 3);
+  Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B >= 3);
+  bool okdp1 = (rel1 == Poly_Con_Relation::strictly_intersects());
+  bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects());
+
+  if (!okdp1 || !okdp2) {
+    nout << "dp.domain1().relation_with(2*A + B >= 3) == " << rel1 << endl;
+    nout << "dp.domain2().relation_with(2*A + B >= 3) == " << rel2 << endl;
+    print_constraints(dp, "*** dp constraints ***");
+    print_congruences(dp, "*** dp congruences ***");
+    return false;
+  }
+
+  Poly_Con_Relation rel3 = dp.relation_with(2*A + B >= 3);
+  bool ok = (rel3 == Poly_Con_Relation::nothing());
+
+  nout << "dp.relation_with(2*A + B >= 3) == " << rel3 << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// relation_with a congruence
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence cg(A %= 2);
+
+  Product dp(2);
+
+  Poly_Con_Relation rel = dp.relation_with(cg);
+  bool ok = Poly_Con_Relation::nothing() == rel;
+
+  nout << "dp.relation_with(A %= 2) == " << rel << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// Empty product; relation_with a congruence.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Product dp(2);
+  dp.refine_with_constraint(A == 1);
+  dp.refine_with_congruence((A %= 2) / 0);
+
+  Poly_Con_Relation rel = dp.relation_with(B %= 0);
+  bool ok = (rel == (Poly_Con_Relation::is_included()
+                 && Poly_Con_Relation::is_disjoint()
+                 && Poly_Con_Relation::saturates()));
+
+  nout << "dp.relation_with(B %= 0) == " << rel << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// A product in 3D; relation_with a congruence.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_constraint(3*A + 3*B + C == 7);
+  dp.refine_with_constraint(3*A - C >= 2);
+  dp.refine_with_congruence((2*A + B %= 0) / 2);
+
+  Poly_Con_Relation rel1 = dp.domain1().relation_with(2*A + B %= 3);
+  Poly_Con_Relation rel2 = dp.domain2().relation_with(2*A + B %= 3);
+  bool okdp1 = (rel1 == Poly_Con_Relation::is_included());
+  bool okdp2 = (rel2 == Poly_Con_Relation::strictly_intersects());
+
+  if (!okdp2 || !okdp1) {
+    nout << "dp.domain1().relation_with(2*A + B %= 3) == " << rel1 << endl;
+    nout << "dp.domain2().relation_with(2*A + B %= 3) == " << rel2 << endl;
+    print_constraints(dp, "*** dp constraints ***");
+    print_congruences(dp, "*** dp congruences ***");
+    return false;
+  }
+
+  Poly_Con_Relation rel3 = dp.relation_with(A + B + C %= 0);
+  Poly_Con_Relation rel4 = dp.relation_with(A + B %= 0);
+  Poly_Con_Relation rel5 = dp.relation_with(A %= 0);
+  Poly_Con_Relation rel6 = dp.relation_with(Linear_Expression(0) %= 0);
+  Poly_Con_Relation rel7 = dp.relation_with(2*A + B %= 3);
+  Poly_Con_Relation rel8 = dp.relation_with(3*A + 3*B + C %= 7);
+  bool ok = (rel3 == Poly_Con_Relation::nothing()
+             && rel4 == Poly_Con_Relation::nothing()
+             && rel5 == Poly_Con_Relation::nothing()
+             && rel6 == (Poly_Con_Relation::is_included()
+                         && Poly_Con_Relation::saturates())
+             && rel7 == Poly_Con_Relation::is_included()
+             && rel8 == (Poly_Con_Relation::is_included()
+                         && Poly_Con_Relation::saturates()));
+
+  nout << "dp.relation_with(A + B + C %= 0) == " << rel3 << endl;
+  nout << "dp.relation_with(A + B %= 0) == " << rel4 << endl;
+  nout << "dp.relation_with(A %= 0) == " << rel5 << endl;
+  nout << "dp.relation_with(Linear_Expression(0) %= 0) == " << rel6 << endl;
+  nout << "dp.relation_with(2*A + B %= 3) == " << rel7 << endl;
+  nout << "dp.relation_with(3*A + 3*B + C %= 7) == " << rel8 << endl;
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+
+  return ok;
+}
+
+// A product where the components strictly intersect the congruence.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product dp(3);
+  dp.refine_with_constraint(C == 0);
+  dp.refine_with_congruence(6*A + 3*B %= 0);
+
+  bool okdp1 = (dp.domain1().relation_with(2*A + B %= 3)
+                == Poly_Con_Relation::strictly_intersects());
+
+  bool okdp2 = (dp.domain2().relation_with(2*A + B %= 3)
+               == Poly_Con_Relation::strictly_intersects());
+
+  Poly_Con_Relation rel = dp.relation_with(2*A + B %= 3);
+  bool ok = (okdp1 && okdp2
+             && rel == Poly_Con_Relation::nothing());
+
+  print_constraints(dp, "*** dp constraints ***");
+  print_congruences(dp, "*** dp congruences ***");
+  nout << "dp.relation_with(2*A + B %= 3) == " << rel << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/shapepreservingproduct1.cc b/tests/Partially_Reduced_Product/shapepreservingproduct1.cc
new file mode 100644
index 0000000..af03d55
--- /dev/null
+++ b/tests/Partially_Reduced_Product/shapepreservingproduct1.cc
@@ -0,0 +1,152 @@
+/* Test Partially_Reduced_Product<>:: Shape_Preserving_Reduction()
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef NNC_Polyhedron Poly;
+
+typedef Domain_Product<Poly, Grid>::Shape_Preserving_Product SHPProduct;
+namespace {
+
+// Shape_Preserving_Reduction with non-strict constraints and
+// equality found. Positive coefficients.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  SHPProduct shpp(2);
+  Constraint_System cs;
+  cs.insert(4*A >= 6);
+  cs.insert(4*A <= 17);
+  shpp.refine_with_constraints(cs);
+  shpp.refine_with_congruence((A %= 0)/ 2);
+
+  SHPProduct known_shpp(2);
+
+  known_shpp.refine_with_constraint(A >= 2);
+  known_shpp.refine_with_constraint(A <= 4);
+  known_shpp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = shpp.OK() && shpp == known_shpp;
+
+  print_congruences(shpp, "*** after ok check: shpp congruences ***");
+  print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+  return ok;
+}
+
+// Shape_Preserving_Reduction with non-strict constraints and
+// constraints tightened. Negative coefficients.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  SHPProduct shpp(2);
+  Constraint_System cs;
+  cs.insert(4*A >= -5);
+  cs.insert(4*A <= -1);
+  shpp.refine_with_constraints(cs);
+  shpp.refine_with_congruence((2*A %= 0)/ 1);
+
+  SHPProduct known_shpp(2);
+
+  known_shpp.refine_with_constraint(A >= -1);
+  known_shpp.refine_with_constraint(2*A <= -1);
+  known_shpp.refine_with_congruence((2*A %= 0)/ 1);
+
+  bool ok = shpp.OK() && shpp == known_shpp;
+
+  print_congruences(shpp, "*** after ok check: shpp congruences ***");
+  print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+  return ok;
+}
+
+// Shape_Preserving_Reduction with strict bounds.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  SHPProduct shpp(2);
+  Constraint_System cs;
+  cs.insert(A > 1);
+  cs.insert(A < 5);
+  shpp.refine_with_constraints(cs);
+  shpp.refine_with_congruence((A %= 0)/ 2);
+
+  SHPProduct known_shpp(2);
+
+  known_shpp.refine_with_constraint(A >= 2);
+  known_shpp.refine_with_constraint(A <= 4);
+  known_shpp.refine_with_congruence((A %= 0)/ 2);
+
+  bool ok = shpp.OK() && shpp == known_shpp;
+
+  print_congruences(shpp, "*** after ok check: shpp congruences ***");
+  print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+  return ok;
+}
+
+// Shape_Preserving_Reduction where an equality is found, not found
+// by the congruences reduction.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  SHPProduct shpp(2);
+  Constraint_System cs;
+  cs.insert(A + B >= 1);
+  cs.insert(A + B <= 3);
+  shpp.refine_with_constraints(cs);
+  shpp.refine_with_congruence((A %= 0)/ 2);
+  shpp.refine_with_congruence((B %= 0)/ 2);
+
+  SHPProduct known_shpp(2);
+
+  known_shpp.refine_with_constraint(A + B == 2);
+  known_shpp.refine_with_congruence((A %= 0)/ 2);
+  known_shpp.refine_with_congruence((B %= 0)/ 2);
+
+  bool ok = shpp.OK() && shpp == known_shpp;
+
+  print_congruences(shpp, "*** after ok check: shpp congruences ***");
+  print_constraints(shpp, "*** after ok check: shpp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/smashproduct1.cc b/tests/Partially_Reduced_Product/smashproduct1.cc
new file mode 100644
index 0000000..4529ff3
--- /dev/null
+++ b/tests/Partially_Reduced_Product/smashproduct1.cc
@@ -0,0 +1,660 @@
+/* Test Smash_Product.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#define REVERSED_TEST
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product CProduct;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Smash_Product SProduct;
+
+namespace {
+
+// Product(dims, type); == and !=
+bool
+test01() {
+  Variable A(0);
+
+  SProduct sp1(3);
+  SProduct sp2(3, EMPTY);
+
+  bool ok = (sp1 != sp2);
+
+  if (!ok)
+    return false;
+
+  sp1.refine_with_congruence((A %= 0) / 4);
+  sp1.refine_with_congruence((A %= 1) / 4);
+
+  ok = (sp1 == sp2);
+
+  ok = ok && sp1.OK() && sp2.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+
+  return ok;
+}
+
+// operator=
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A + B <= 9);
+
+  SProduct sp1(2);
+  sp1.refine_with_congruence((A %= 9) / 19);
+  sp1.refine_with_congruence((A %= 8) / 19);
+  SProduct sp2 = sp1;
+
+  bool ok =  (sp1 == sp2);
+
+  ok = ok && sp1.OK() && sp2.OK();
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+
+  return ok;
+}
+
+// ok(), not reduced.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  bool ok;
+
+  SProduct sp(2);
+  sp.refine_with_constraint(A >= 1);
+  sp.refine_with_constraint(A <= 0);
+  sp.refine_with_congruence((A %= 1) / 3);
+
+  ok = sp.is_empty() && sp.OK();
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+
+  return ok;
+}
+
+// ok(), is reduced.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  bool ok;
+
+  SProduct sp(2);
+  sp.refine_with_constraint(A >= 1);
+  sp.refine_with_constraint(A <= 0);
+  sp.refine_with_congruence((A %= 1) / 3);
+
+  // reduce the product
+  Constraint_System sp_cs = sp.constraints();
+
+  ok = sp.OK();
+
+  print_constraints(sp_cs, "*** sp.constraints(); ***");
+
+  Grid sp_gr(sp_cs);
+  ok = sp_gr.is_empty();
+
+  return ok;
+}
+
+// Building from inequality constraints()
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint_System cs;
+  cs.insert(A - C <= 8);
+  cs.insert(A - C >= 9);
+
+  try {
+    SProduct sp(cs);
+   }
+  catch (const std::invalid_argument& e) {
+    nout << "cs contains an inequality constraint: " << e.what() << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+// Building from equality congruences()
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cgs1;
+  cgs1.insert((A - C %= 8) / 0);
+  Congruence_System cgs2;
+  cgs2.insert((A - C %= 9) / 0);
+  cgs2.insert((B %= 21) / 0);
+
+  SProduct sp(cgs1);
+
+  bool ok = sp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// refine_with_congruences
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 0) / 2);
+  cgs.insert((A + B %= 0) / 2);
+  cgs.insert((B %= 0) / 2);
+  cgs.insert(A + B == 0);
+
+  SProduct sp(2);
+
+  sp.refine_with_congruences(cgs);
+
+  Grid gr(cgs);
+
+  SProduct known_sp(gr);
+
+  bool ok = (sp == known_sp);
+
+  print_constraints(sp, "*** sp constraints ***");
+  print_congruences(sp, "*** sp congruences ***");
+
+  return ok;
+}
+
+// is_bounded().
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  bool ok;
+
+  SProduct sp(2);
+  sp.refine_with_constraint(A >= 1);
+  sp.refine_with_constraint(A <= 0);
+  sp.refine_with_congruence((A %= 1) / 3);
+
+  ok = sp.is_bounded();
+  ok = ok && sp.OK();
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return ok;
+}
+
+// space_dimension()
+bool
+test09() {
+  Variable A(0);
+  Variable E(4);
+
+  Constraint_System cs(A + E < 9);
+
+  SProduct sp(5);
+  sp.refine_with_constraints(cs);
+
+  bool smash_ok = (sp.space_dimension() == 5);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return smash_ok;
+}
+
+// affine_dimension()
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.refine_with_constraint(A - C <= 9);
+  sp.refine_with_constraint(A - C >= 9);
+  sp.refine_with_constraint(B >= 2);
+
+  bool smash_ok = sp.space_dimension() == 3;
+  smash_ok = smash_ok && sp.affine_dimension() == 2;
+
+  if (smash_ok) {
+    sp.refine_with_constraint(A - C >= 4);
+    sp.refine_with_constraint(A - C <= 4);
+
+    smash_ok = smash_ok && sp.affine_dimension() == 0;
+  }
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return smash_ok;
+}
+
+// contains()
+bool
+test11() {
+  Variable A(0);
+
+  SProduct sp1(1);
+  sp1.refine_with_constraint(A <= 3);
+  sp1.refine_with_congruence((A %= 1) / 2);
+
+  SProduct sp2(1);
+  sp2.refine_with_constraint(A <= 3);
+  sp2.refine_with_constraint(A >= 4);
+  sp2.refine_with_congruence((A %= 0) / 2);
+
+  bool smash_ok1 = sp1.contains(sp2) && sp1.strictly_contains(sp2);
+
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp1, "*** sp1 congruences ***");
+
+  if (!smash_ok1)
+    return smash_ok1;
+
+  SProduct sp3(1);
+  sp3.refine_with_constraint(A <= 3);
+  sp3.refine_with_congruence((A %= 1) / 2);
+
+  SProduct sp4(1);
+  sp4.refine_with_constraint(A <= 4);
+  sp4.refine_with_congruence((A %= 0) / 2);
+  sp4.refine_with_congruence((A %= 1) / 2);
+
+  bool smash_ok2 = sp3.contains(sp4) && sp3.strictly_contains(sp4);
+
+  print_constraints(sp3, "*** sp3 constraints ***");
+  print_congruences(sp3, "*** sp3 congruences ***");
+
+  if (!smash_ok2)
+    return smash_ok2;
+
+  SProduct sp5(1);
+  sp5.refine_with_constraint(A <= 3);
+  sp5.refine_with_constraint(A >= 4);
+  sp5.refine_with_congruence((A %= 1) / 2);
+  sp5.refine_with_congruence((A %= 0) / 2);
+
+  SProduct sp6(1, EMPTY);
+
+  bool smash_ok3 = sp5.contains(sp6) && !sp5.strictly_contains(sp6);
+
+  print_constraints(sp5, "*** sp5 constraints ***");
+  print_congruences(sp5, "*** sp5 congruences ***");
+
+  return smash_ok3;
+}
+
+// intersection_assign()
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp1(3);
+  sp1.refine_with_constraint(A >= 0);
+  sp1.refine_with_congruence((A %= 0) / 2);
+
+  SProduct sp2(3);
+  sp2.refine_with_constraint(A <= 0);
+  sp2.refine_with_congruence((A %= 0) / 1);
+
+  sp1.intersection_assign(sp2);
+
+  SProduct known_sp(3);
+  known_sp.refine_with_constraint(A == 0);
+
+  bool smash_ok1 = !(sp1 == known_sp);
+  if (!smash_ok1) {
+    print_congruences(sp1, "*** sp1 congruences ***");
+    print_constraints(sp1, "*** sp1 constraints ***");
+    print_congruences(sp2, "*** sp2 congruences ***");
+    print_constraints(sp2, "*** sp2 constraints ***");
+    return smash_ok1;
+  }
+
+  sp2.refine_with_constraint(A >= 1);
+  sp1.intersection_assign(sp2);
+
+  known_sp.refine_with_constraint(A == 1);
+
+  bool smash_ok2 = (sp1 == known_sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok2;
+}
+
+// upper_bound_assign(sp2)
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(1);
+  sp.refine_with_constraint(A <= 18);
+  sp.refine_with_constraint(A >= 18);
+
+  SProduct sp1(sp);
+
+  SProduct sp2(1);
+  sp2.refine_with_congruence((A %= 19) / 20);
+  sp2.refine_with_congruence((A %= 18) / 20);
+
+  sp1.upper_bound_assign(sp2);
+
+  bool smash_ok = (sp1 == sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+
+  if (!smash_ok)
+    return false;
+
+  sp2.upper_bound_assign(sp1);
+
+  smash_ok = (sp2 == sp);
+
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(3);
+  sp.refine_with_congruence((A %= 0) / 2);
+  sp.refine_with_congruence((B %= 0) / 2);
+
+  SProduct sp1(sp);
+
+  SProduct sp2(3);
+  sp2.refine_with_congruence((A %= 1) / 3);
+  sp2.refine_with_congruence((B %= 1) / 3);
+
+  bool smash_ok = (!sp1.upper_bound_assign_if_exact(sp2)
+                   && !sp2.upper_bound_assign_if_exact(sp1));
+
+  if (!smash_ok) {
+    print_congruences(sp1, "*** sp1 congruences ub exact ***");
+    print_constraints(sp1, "*** sp1 constraints ub exact ***");
+    print_congruences(sp2, "*** sp2 congruences ub exact ***");
+    print_constraints(sp2, "*** sp2 constraints ub exact ***");
+    return false;
+  }
+
+  smash_ok = (sp == sp1);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  if (!smash_ok)
+    return false;
+
+  // The grid component is empty so that the smash product
+  // reduces the polyhedron component to empty.
+  sp1.refine_with_congruence((B %= 1) / 2);
+  sp1.refine_with_congruence((B %= 0) / 2);
+
+  // The polyhedron component is empty so that the smash product
+  // reduces the grid component to empty.
+  sp2.refine_with_constraint(B >= 1);
+  sp2.refine_with_constraint(B <= 0);
+
+  smash_ok = sp1.upper_bound_assign_if_exact(sp2)
+   && sp2.upper_bound_assign_if_exact(sp1);
+
+  if (!smash_ok)
+    return false;
+
+  SProduct known_sp(3, EMPTY);
+
+  smash_ok = (sp1 == known_sp) && (sp2 == known_sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok;
+}
+
+// difference_assign(sp2)
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  SProduct sp(1);
+  sp.refine_with_constraint(A <= 18);
+  sp.refine_with_constraint(A >= 18);
+
+  SProduct sp1(sp);
+
+  SProduct sp2(1);
+  sp2.refine_with_congruence((A %= 19) / 20);
+  sp2.refine_with_congruence((A %= 18) / 20);
+
+  sp1.difference_assign(sp2);
+
+  bool smash_ok = (sp1 == sp);
+
+  print_congruences(sp1, "*** sp1 congruences ***");
+  print_constraints(sp1, "*** sp1 constraints ***");
+
+  if (!smash_ok)
+    return false;
+
+  sp2.difference_assign(sp1);
+
+  SProduct known_sp(1, EMPTY);
+
+  smash_ok = (sp2 == known_sp);
+
+  print_congruences(sp2, "*** sp2 congruences ***");
+  print_constraints(sp2, "*** sp2 constraints ***");
+
+  return smash_ok;
+}
+
+// time_elapse_assign(y)
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp1(3);
+  sp1.refine_with_constraint(A >= 0);
+  sp1.refine_with_constraint(B >= 0);
+  sp1.refine_with_constraint(A + B >= 3);
+  sp1.refine_with_constraint(2*A - B == 0);
+  sp1.refine_with_constraint(3*A + C == 0);
+  sp1.refine_with_congruence(3*A %= 0);
+
+  SProduct sp2(3);
+  sp2.refine_with_constraint(7*C == 4);
+  sp2.refine_with_constraint(7*B == -1);
+  sp2.refine_with_constraint(7*A == 3);
+
+  sp1.time_elapse_assign(sp2);
+
+  SProduct known_sp(3);
+  known_sp.refine_with_constraint(5*A - 13*B - 7*C == 0);
+  known_sp.refine_with_constraint(3*A + C >= 0);
+  known_sp.refine_with_constraint(A + B >= 3);
+  known_sp.refine_with_constraint(4*A - 3*C >= 13);
+  known_sp.refine_with_congruence((65*A - B %= 0) / 7);
+  known_sp.refine_with_congruence(21*A %= 0);
+
+  bool smash_ok = (sp1 == known_sp);
+
+  print_congruences(sp1, "*** sp1.time_elapse_assign(sp2) congruences ***");
+  print_constraints(sp1, "*** sp1.time_elapse_assign(sp2) constraints ***");
+  print_congruences(sp2, "*** sp2.time_elapse_assign(sp2) congruences ***");
+  print_constraints(sp2, "*** sp2.time_elapse_assign(sp2) constraints ***");
+
+  return smash_ok;
+}
+
+// topological_closure_assign
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp(3);
+  sp.refine_with_constraint(B >= 0);
+  sp.refine_with_constraint(3*A + C == 0);
+  sp.refine_with_constraint(2*A - B == 0);
+  sp.refine_with_congruence(3*A %= 0);
+#ifdef PH_IS_NNC
+  sp.refine_with_constraint(A > 0);
+#else
+  sp.refine_with_constraint(A >= 0);
+#endif
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  sp.topological_closure_assign();
+
+  SProduct known_sp(3);
+  known_sp.refine_with_constraint(B >= 0);
+  known_sp.refine_with_constraint(3*A + C == 0);
+  known_sp.refine_with_constraint(2*A - B == 0);
+  known_sp.refine_with_congruence(3*A %= 0);
+  known_sp.refine_with_constraint(A >= 0);
+
+  bool smash_ok = (sp == known_sp);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  return smash_ok;
+}
+
+// widening_assign
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  SProduct sp_prev(3);
+  sp_prev.refine_with_constraint(C == 0);
+  sp_prev.refine_with_constraint(A - B >= 1);
+  sp_prev.refine_with_constraint(A <= 2);
+  sp_prev.refine_with_constraint(B >= 0);
+  sp_prev.refine_with_congruence((B %= 0) / 2);
+  sp_prev.refine_with_congruence(3*A %= 0);
+
+  print_congruences(sp_prev, "*** sp_prev congruences ***");
+  print_constraints(sp_prev, "*** sp_prev constraints ***");
+
+  SProduct sp(3);
+  sp.refine_with_constraint(C == 0);
+  sp.refine_with_constraint(A <= 2);
+  sp.refine_with_constraint(B >= 0);
+  sp.refine_with_constraint(2*A - B >= 2);
+  sp.refine_with_constraint(B >= 0);
+  sp.refine_with_congruence(6*A %= 0);
+  sp.refine_with_congruence((B %= 0) / 2);
+
+  sp.upper_bound_assign(sp_prev);
+
+  print_congruences(sp, "*** sp congruences ***");
+  print_constraints(sp, "*** sp constraints ***");
+
+  sp.widening_assign(sp_prev);
+
+  SProduct known_sp(3);
+  known_sp.refine_with_constraint(C == 0);
+  known_sp.refine_with_constraint(A <= 2);
+  known_sp.refine_with_constraint(B >= 0);
+  known_sp.refine_with_congruence((B %= 0) / 2);
+
+  bool smash_ok = (sp == known_sp);
+
+  print_congruences(sp, "*** sp.widening_assign(sp_prev) congruences ***");
+  print_constraints(sp, "*** sp.widening_assign(sp_prev) constraints ***");
+
+  return smash_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST_F8(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/spacedims1.cc b/tests/Partially_Reduced_Product/spacedims1.cc
new file mode 100644
index 0000000..439cebd
--- /dev/null
+++ b/tests/Partially_Reduced_Product/spacedims1.cc
@@ -0,0 +1,287 @@
+/* Test
+   Product<NNC_Polyhedron, Grid>::add_space_dimensions_and_embed() and
+   Product<NNC_Polyhedron, Grid>::add_space_dimensions_and_project() and
+   Product<NNC_Polyhedron, Grid>::remove_space_dimensions() and
+   Product<NNC_Polyhedron, Grid>::remove_higher_space_dimensions() and
+   Product<NNC_Polyhedron, Grid>::fold_space_dimensions() and
+   Product<NNC_Polyhedron, Grid>::expand_space_dimension() and
+   Product<NNC_Polyhedron, Grid>::map_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// add_space_dimensions_and_embed()
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(2);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A %= 0) / 2);
+
+  prp1.add_space_dimensions_and_embed(3);
+
+  Product known_prp(5);
+  known_prp.refine_with_congruence((A %= 0) / 2);
+  known_prp.refine_with_constraint(A >= 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok;
+}
+
+// add_space_dimensions_and_project()
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp1(2);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_congruence((A %= 0) / 2);
+
+  prp1.add_space_dimensions_and_project(1);
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((A %= 0) / 2);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_constraint(C == 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  return ok;
+}
+
+// remove_space_dimensions()
+bool
+test03() {
+  Variable A(0);
+  Variable C(2);
+  Variable D(3);
+
+  Product prp(4);
+  prp.refine_with_constraint(A >= 0);
+  prp.refine_with_congruence((A %= 0) / 2);
+  prp.refine_with_congruence((A - C %= 0) / 2);
+
+  Variables_Set vars;
+  vars.insert(C);
+  vars.insert(D);
+
+  prp.remove_space_dimensions(vars);
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence((A %= 0) / 2);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp ***");
+
+  return ok;
+}
+
+// remove_higher_space_dimensions()
+bool
+test04() {
+  Variable A(0);
+  Variable C(2);
+  Variable D(3);
+
+  Product prp(4);
+  prp.refine_with_constraint(A >= 0);
+  prp.refine_with_congruence((A %= 0) / 2);
+  prp.refine_with_congruence((A - C %= 0) / 2);
+
+  prp.remove_higher_space_dimensions(2);
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_congruence((A %= 0) / 2);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// map_space_dimensions()
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(2);
+  prp.refine_with_constraint(A >= 0);
+  prp.refine_with_congruence((A - B %= 0) / 2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  prp.map_space_dimensions(function);
+
+  Product known_prp(2);
+  known_prp.refine_with_constraint(B >= 0);
+  known_prp.refine_with_congruence((B - A %= 0) / 2);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// expand_space_dimension()
+bool
+  test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Product prp(3);
+  prp.refine_with_congruence((A + B %= 2) / 7);
+  prp.refine_with_constraint(A >= 0);
+
+  prp.expand_space_dimension(A, 1);
+
+  Product known_prp(4);
+  known_prp.refine_with_congruence((A + B %= 2) / 7);
+  known_prp.refine_with_congruence((D + B %= 2) / 7);
+  known_prp.refine_with_constraint(A >= 0);
+  known_prp.refine_with_constraint(D >= 0);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// fold_space_dimensions()
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_congruence((A %= 2) / 7);
+  prp.refine_with_congruence((B %= 2) / 14);
+  prp.refine_with_congruence((C %= 2) / 21);
+  prp.refine_with_constraint(A <= 5);
+  prp.refine_with_constraint(B <= 10);
+  prp.refine_with_constraint(C <= 0);
+  prp.refine_with_constraint(C >= 0);
+
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(C);
+
+  prp.fold_space_dimensions(to_fold, B);
+
+  Product known_prp(1);
+  known_prp.refine_with_congruence((A %= 2) / 7);
+  known_prp.refine_with_constraint(A <= 10);
+
+  bool ok = (prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// max_space_dimension().
+bool
+test08() {
+  dimension_type msd1 = NNC_Polyhedron::max_space_dimension();
+  nout << "NNCPolyhedron max space dimension = "
+       << msd1 << endl;
+  dimension_type msd2 = Grid::max_space_dimension();
+  nout << "Grid max space dimension = "
+       << msd2 << endl;
+  dimension_type msd = Product::max_space_dimension();
+  bool ok = (msd <= msd1 && msd <= msd2);
+
+  nout << "Product max space dimension = "
+       << msd << endl << endl;
+
+  return ok;
+}
+
+// Attempt to construct a product with too many dimensions.
+bool
+test09() {
+  try {
+    // This is an invalid use of the constructor of a product:
+    // it is illegal to (try to) build a product with a dimension
+    // greater than max_space_dimension().
+    Product pg(Product::max_space_dimension() + 2);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/timeelapse1.cc b/tests/Partially_Reduced_Product/timeelapse1.cc
new file mode 100644
index 0000000..5eec79e
--- /dev/null
+++ b/tests/Partially_Reduced_Product/timeelapse1.cc
@@ -0,0 +1,116 @@
+/* Test Product<NNC_Polyhedron, Grid>::time_elapse_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// time_elapse_assign(y)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(A >= 0);
+  prp1.refine_with_constraint(B >= 0);
+  prp1.refine_with_constraint(A + B >= 3);
+  prp1.refine_with_constraint(2*A - B == 0);
+  prp1.refine_with_constraint(3*A + C == 0);
+  prp1.refine_with_congruence(3*A %= 0);
+
+  Product prp2(3);
+  prp2.refine_with_constraint(7*C == 4);
+  prp2.refine_with_constraint(7*B == -1);
+  prp2.refine_with_constraint(7*A == 3);
+
+  prp1.time_elapse_assign(prp2);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(5*A - 13*B - 7*C == 0);
+  known_prp.refine_with_constraint(3*A + C >= 0);
+  known_prp.refine_with_constraint(A + B >= 3);
+  known_prp.refine_with_constraint(4*A - 3*C >= 13);
+  known_prp.refine_with_congruence((65*A - B %= 0) / 7);
+  known_prp.refine_with_congruence(21*A %= 0);
+  known_prp.refine_with_constraint(A >= 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1.time_elapse_assign(prp1) congruences ***");
+  print_constraints(prp1, "*** prp1.time_elapse_assign(prp1) constraints ***");
+  print_congruences(prp2, "*** prp2.time_elapse_assign(prp2) congruences ***");
+  print_constraints(prp2, "*** prp2.time_elapse_assign(prp2) constraints ***");
+
+  return ok;
+}
+
+// time_elapse_assign(y) where the initial products are not reduced
+// and the second product has non-intersecting single point components.
+bool
+test02() {
+  Variable A(0);
+
+
+  Product prp1(1);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+
+  Grid gr(1);
+  gr.refine_with_congruence((A %= 0)/ 2);
+
+  Product prp2(gr);
+
+  prp2.refine_with_constraint(A >= 1);
+  prp2.refine_with_constraint(A <= 1);
+
+  prp1.time_elapse_assign(prp2);
+
+  Product known_prp(1, EMPTY);
+
+  bool cons_ok = prp1.OK() && (prp1 == known_prp);
+
+  print_congruences(prp1,
+                    "*** prp1.time_elapse_assign(prp2) congruences ***");
+  print_constraints(prp1,
+                    "*** prp1.time_elapse_assign(prp2) constraints ***");
+
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/topclosed1.cc b/tests/Partially_Reduced_Product/topclosed1.cc
new file mode 100644
index 0000000..1edcd74
--- /dev/null
+++ b/tests/Partially_Reduced_Product/topclosed1.cc
@@ -0,0 +1,95 @@
+/* Test Product<>::is_topologically_closed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// is_topologically_closed() where the NNC Polyhedron is topologically
+// open.
+bool
+test01() {
+  Variable A(0);
+
+  Product prp(3);
+  prp.refine_with_constraint(A < 3);
+  prp.refine_with_congruence((A %= 0) / 3);
+
+  bool ok = !prp.is_topologically_closed();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_topologically_closed() where the Polyhedron is topologically
+// closed.
+bool
+test02() {
+  Variable A(0);
+
+  Product prp(3);
+  prp.refine_with_constraint(A <= 3);
+  prp.refine_with_congruence((A %= 0) / 3);
+
+  bool ok = prp.is_topologically_closed();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+// is_topologically_closed() where the Polyhedron is topologically
+// open and the intersection is closed.
+bool
+test03() {
+  Variable A(0);
+
+  Product prp(3);
+  prp.refine_with_congruence((A %= 0) / 4);
+  prp.refine_with_constraint(A < 3);
+
+  bool ok = !prp.is_topologically_closed();
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/topclosure1.cc b/tests/Partially_Reduced_Product/topclosure1.cc
new file mode 100644
index 0000000..f9a0a5e
--- /dev/null
+++ b/tests/Partially_Reduced_Product/topclosure1.cc
@@ -0,0 +1,68 @@
+/* Test Product<NNC_Polyhedron, Grid>::topological_closure_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// topological_closure_assign
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Product prp(3);
+  prp.refine_with_constraint(B >= 0);
+  prp.refine_with_constraint(4*A + C == 0);
+  prp.refine_with_constraint(2*A - B == 0);
+  prp.refine_with_congruence(4*A %= 0);
+  prp.refine_with_constraint(A > 0);
+
+  prp.topological_closure_assign();
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(B >= 0);
+  known_prp.refine_with_constraint(4*A + C == 0);
+  known_prp.refine_with_constraint(2*A - B == 0);
+  known_prp.refine_with_congruence(4*A %= 0);
+  known_prp.refine_with_constraint(A >= 0);
+
+  bool ok = (prp.is_topologically_closed() && prp == known_prp);
+
+  print_congruences(prp, "*** prp congruences ***");
+  print_constraints(prp, "*** prp constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Partially_Reduced_Product/upperbound1.cc b/tests/Partially_Reduced_Product/upperbound1.cc
new file mode 100644
index 0000000..3b14537
--- /dev/null
+++ b/tests/Partially_Reduced_Product/upperbound1.cc
@@ -0,0 +1,191 @@
+/* Test Product<NNC_Polyhedron, Grid>::upper_bound_assign()
+   Product<NNC_Polyhedron, Grid>::upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "partially_reduced_product_test.hh"
+
+typedef NNC_Polyhedron DOMAIN1;
+typedef Grid DOMAIN2;
+typedef Domain_Product<DOMAIN1x, DOMAIN2x>::Constraints_Product Product;
+
+namespace {
+
+// upper_bound_assign(prp2)
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs(A == 9);
+
+  Product prp1(cs);
+
+  Product prp2(1);
+  prp2.refine_with_constraint(A == 19);
+
+  prp1.upper_bound_assign(prp2);
+
+  Product known_prp(1);
+  known_prp.refine_with_constraint(A >= 9);
+  known_prp.refine_with_constraint(A <= 19);
+  known_prp.refine_with_congruence((A %= 9) / 10);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// upper_bound_assign(cp2)
+// The first product is empty and the second a single point in 1D
+bool
+test02() {
+  Variable A(0);
+
+  Product prp1(1);
+  Constraint_System cs1;
+  cs1.insert(A >= 1);
+  cs1.insert(A <= 0);
+  prp1.refine_with_constraints(cs1);
+
+  Product prp2(1);
+  Constraint_System cs2;
+  cs2.insert(A == 1);
+  prp2.refine_with_constraints(cs2);
+
+  Product prp1_copy(prp1);
+
+  prp1.upper_bound_assign(prp2);
+
+
+  bool ok = (prp1 == prp2 && prp1.OK());
+
+  print_congruences(prp1, "*** after OK() check: prp1 congruences ***");
+  print_constraints(prp1, "*** after OK() check: prp1 constraints ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp1(3);
+  prp1.refine_with_constraint(B == 0);
+
+  Product prp2(3);
+  prp2.refine_with_constraint(B == 0);
+  prp2.refine_with_constraint(A == 8);
+
+  prp1.upper_bound_assign_if_exact(prp2);
+
+  Product known_prp(3);
+  known_prp.refine_with_constraint(B == 0);
+
+  bool ok = (prp1 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return ok;
+}
+
+// upper_bound_assign_if_exact()
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Product prp(3);
+  prp.refine_with_congruence((A %= 0) / 2);
+  prp.refine_with_congruence((B %= 0) / 2);
+
+  Product prp1(prp);
+
+  Product prp2(3);
+  prp2.refine_with_congruence((A %= 1) / 3);
+  prp2.refine_with_congruence((B %= 1) / 3);
+
+  bool cons_ok = (!prp1.upper_bound_assign_if_exact(prp2)
+                   && !prp2.upper_bound_assign_if_exact(prp1));
+
+  if (!cons_ok) {
+    print_congruences(prp1, "*** prp1 congruences ub exact ***");
+    print_constraints(prp1, "*** prp1 constraints ub exact ***");
+    print_congruences(prp2, "*** prp2 congruences ub exact ***");
+    print_constraints(prp2, "*** prp2 constraints ub exact ***");
+    return false;
+  }
+
+  cons_ok = (prp == prp1);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  if (!cons_ok)
+    return false;
+
+  prp1.refine_with_congruence((B %= 1) / 2);
+
+  prp2.refine_with_constraint(B >= 1);
+  prp2.refine_with_constraint(B <= 1);
+
+  cons_ok = prp1.upper_bound_assign_if_exact(prp2)
+   && prp2.upper_bound_assign_if_exact(prp1);
+
+  if (!cons_ok)
+    return false;
+
+  Product known_prp(3);
+  known_prp.refine_with_congruence((B %= 1) / 0);
+  known_prp.refine_with_congruence((A %= 1) / 3);
+
+  cons_ok = (prp1 == known_prp) && (prp2 == known_prp);
+
+  print_congruences(prp1, "*** prp1 congruences ***");
+  print_constraints(prp1, "*** prp1 constraints ***");
+  print_congruences(prp2, "*** prp2 congruences ***");
+  print_constraints(prp2, "*** prp2 constraints ***");
+
+  return cons_ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/Makefile.am b/tests/Polyhedron/Makefile.am
new file mode 100644
index 0000000..b328c53
--- /dev/null
+++ b/tests/Polyhedron/Makefile.am
@@ -0,0 +1,724 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 addconstraints2 \
+addgenerator1 addgenerator2 \
+addgenerators1 addgenerators2 \
+addspacedims1 addspacedims2 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+affinetrans \
+append1 append2 \
+ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+bgp99extrapolation1 bgp99extrapolation2 \
+bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boundedbhrz03extrapolation1 \
+boundedh79extrapolation1 \
+bounds1 \
+cnncconversion1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 contains2 \
+containsintegerpoint1 \
+disjoint1 disjoint2 \
+dropsomenonintegerpoints1 dropsomenonintegerpoints2 \
+dualhypercubes \
+empty1 \
+equals1 \
+exceptions1 exceptions2  exceptions3 \
+expandspacedim1 expandspacedim2 \
+foldspacedims1 foldspacedims2 \
+frequency1 \
+frombdshape1 \
+frombox1 frombox2 \
+fromgrid1 \
+fromoctagonalshape1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generators1 \
+geomcovers1 \
+h79widening1 h79widening2 \
+hybrid \
+intersection1 \
+limitedbhrz03extrapolation1 \
+limitedh79extrapolation1 \
+linearexpression1 \
+linearpartition1 \
+linearsystem1 \
+mapspacedims1 \
+matrix1 \
+max_min1 \
+maxspacedim1 \
+mc91 \
+membytes1 \
+memory2 \
+minconstraints1 minconstraints2 \
+mingenerators1 mingenerators2 \
+nncminimize1 nncminimize2 \
+nncpostimeelapse1 \
+numberinput1 \
+onepoint \
+permute \
+polydifference1 polydifference2 \
+polyhull1 polyhull2 \
+polyhullifexact1 polyhullifexact2 \
+randphull1 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+refinewithconstraint1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+simplifyusingcontext1 \
+smm1 \
+sparserow1 \
+termination1 termination2 \
+timeelapse1 timeelapse2 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+universe1 universe2 \
+variablesset1 \
+watchdog1 \
+weightwatch1 \
+wrap1 wrap2 \
+writeconsys1 \
+writegensys1 \
+writepolyhedron1 writepolyhedron2 \
+writerelation1 \
+writevariable1
+
+DERIVED_TESTS = \
+nnc_addcongruence1 \
+nnc_addcongruences1 \
+nnc_addconstraint1 \
+nnc_addconstraints1 \
+nnc_addgenerator1 \
+nnc_addgenerators1 \
+nnc_addspacedims1 \
+nnc_affineimage1 \
+nnc_affinepreimage1 \
+nnc_affinetrans \
+nnc_append1 nnc_append2 \
+nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+nnc_bgp99extrapolation1 \
+nnc_bhrz03widening1 nnc_bhrz03widening2 \
+nnc_bounded1 \
+nnc_boundedaffineimage1 \
+nnc_boundedaffinepreimage1 \
+nnc_boundedbhrz03extrapolation1 \
+nnc_boundedh79extrapolation1 \
+nnc_bounds1 \
+nnc_concatenate1 \
+nnc_congruences1 \
+nnc_constrains1 \
+nnc_constraints1 \
+nnc_contains1 \
+nnc_containsintegerpoint1 \
+nnc_disjoint1 \
+nnc_dropsomenonintegerpoints1 \
+nnc_empty1 \
+nnc_equals1 \
+nnc_exceptions1 nnc_exceptions3 \
+nnc_expandspacedim1 \
+nnc_foldspacedims1 \
+nnc_frombdshape1 \
+nnc_frombox1 \
+nnc_fromgrid1 \
+nnc_fromoctagonalshape1 \
+nnc_generalizedaffineimage1 \
+nnc_generalizedaffinepreimage1 \
+nnc_generators1 \
+nnc_geomcovers1 \
+nnc_h79widening1 \
+nnc_intersection1 \
+nnc_simplifyusingcontext1 \
+nnc_limitedbhrz03extrapolation1 \
+nnc_limitedh79extrapolation1 \
+nnc_linearpartition1 \
+nnc_mapspacedims1 \
+nnc_max_min1 \
+nnc_mc91 \
+nnc_membytes1 \
+nnc_minconstraints1 \
+nnc_mingenerators1 \
+nnc_onepoint \
+nnc_permute \
+nnc_polydifference1 \
+nnc_polyhull1 \
+nnc_polyhullifexact1 \
+nnc_randphull1 \
+nnc_relations1 nnc_relations2 \
+nnc_removespacedims1 \
+nnc_smm1 \
+nnc_timeelapse1 \
+nnc_unconstrain1 \
+nnc_universe1 \
+nnc_wrap1 nnc_wrap2 \
+nnc_writepolyhedron1
+
+#
+# Sources for the tests
+#
+
+addcongruence1_SOURCES = addcongruence1.cc
+
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraint1_SOURCES = addconstraint1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+addconstraints2_SOURCES = addconstraints2.cc
+
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerator2_SOURCES = addgenerator2.cc
+
+addgenerators1_SOURCES = addgenerators1.cc
+addgenerators2_SOURCES = addgenerators2.cc
+
+addspacedims1_SOURCES = addspacedims1.cc
+addspacedims2_SOURCES = addspacedims2.cc
+
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+affinetrans_SOURCES = affinetrans.cc
+
+append1_SOURCES = append1.cc
+append2_SOURCES = append2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+ascii_dump_load3_SOURCES = ascii_dump_load3.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bgp99extrapolation2_SOURCES = bgp99extrapolation2.cc
+
+bhrz03widening1_SOURCES = bhrz03widening1.cc
+bhrz03widening2_SOURCES = bhrz03widening2.cc
+bhrz03widening3_SOURCES = bhrz03widening3.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+
+boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+
+boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cnncconversion1_SOURCES = cnncconversion1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constrains1_SOURCES = constrains1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.cc
+
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+dropsomenonintegerpoints2_SOURCES = dropsomenonintegerpoints2.cc
+
+dualhypercubes_SOURCES = dualhypercubes.cc
+
+empty1_SOURCES = empty1.cc
+
+equals1_SOURCES = equals1.cc
+
+exceptions1_SOURCES = exceptions1.cc
+exceptions2_SOURCES = exceptions2.cc
+exceptions3_SOURCES = exceptions3.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+expandspacedim2_SOURCES = expandspacedim2.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+foldspacedims2_SOURCES = foldspacedims2.cc
+
+frequency1_SOURCES = frequency1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+frombox2_SOURCES = frombox2.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+generators1_SOURCES = generators1.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+h79widening2_SOURCES = h79widening2.cc
+
+hybrid_SOURCES = hybrid.cc
+
+intersection1_SOURCES = intersection1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+linearpartition1_SOURCES = linearpartition1.cc
+
+linearexpression1_SOURCES = linearexpression1.cc
+
+linearsystem1_SOURCES = linearsystem1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+matrix1_SOURCES = matrix1.cc
+
+max_min1_SOURCES = max_min1.cc
+
+maxspacedim1_SOURCES = maxspacedim1.cc
+
+mc91_SOURCES = mc91.cc
+
+membytes1_SOURCES = membytes1.cc
+
+memory2_SOURCES = memory2.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+minconstraints2_SOURCES = minconstraints2.cc
+
+mingenerators1_SOURCES = mingenerators1.cc
+mingenerators2_SOURCES = mingenerators2.cc
+
+numberinput1_SOURCES = numberinput1.cc
+
+nncminimize1_SOURCES = nncminimize1.cc
+nncminimize2_SOURCES = nncminimize2.cc
+
+nncpostimeelapse1_SOURCES = nncpostimeelapse1.cc
+
+onepoint_SOURCES = onepoint.cc
+
+permute_SOURCES = permute.cc
+
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+
+polyhullifexact1_SOURCES = polyhullifexact1.cc
+polyhullifexact2_SOURCES = polyhullifexact2.cc
+
+randphull1_SOURCES = randphull1.cc
+
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+
+smm1_SOURCES = smm1.cc
+
+sparserow1_SOURCES = sparserow1.cc
+
+termination1_SOURCES = termination1.cc
+termination2_SOURCES = termination2.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+unconstrain1_SOURCES = unconstrain1.cc
+
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.cc
+
+variablesset1_SOURCES = variablesset1.cc
+
+watchdog1_SOURCES = watchdog1.cc
+
+weightwatch1_SOURCES = weightwatch1.cc
+
+wrap1_SOURCES = wrap1.cc
+wrap2_SOURCES = wrap2.cc
+
+writeconsys1_SOURCES = writeconsys1.cc
+
+writegensys1_SOURCES = writegensys1.cc
+
+writepolyhedron1_SOURCES = writepolyhedron1.cc
+writepolyhedron2_SOURCES = writepolyhedron2.cc
+
+writerelation1_SOURCES = writerelation1.cc
+
+writevariable1_SOURCES = writevariable1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+
+nnc_addcongruence1_SOURCES = addcongruence1.cc
+nnc_addcongruence1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addcongruences1_SOURCES = addcongruences1.cc
+nnc_addcongruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addconstraint1_SOURCES = addconstraint1.cc
+nnc_addconstraint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addconstraints1_SOURCES = addconstraints1.cc
+nnc_addconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addgenerator1_SOURCES = addgenerator1.cc
+nnc_addgenerator1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addgenerators1_SOURCES = addgenerators1.cc
+nnc_addgenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_addspacedims1_SOURCES = addspacedims1.cc
+nnc_addspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affineimage1_SOURCES = affineimage1.cc
+nnc_affineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affinepreimage1_SOURCES = affinepreimage1.cc
+nnc_affinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_affinetrans_SOURCES = affinetrans.cc
+nnc_affinetrans_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_append1_SOURCES = append1.cc
+nnc_append1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append2_SOURCES = append2.cc
+nnc_append2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+nnc_ascii_dump_load1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+nnc_ascii_dump_load2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+nnc_bgp99extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bhrz03widening1_SOURCES = bhrz03widening1.cc
+nnc_bhrz03widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening2_SOURCES = bhrz03widening2.cc
+nnc_bhrz03widening2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bounded1_SOURCES = bounded1.cc
+nnc_bounded1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+nnc_boundedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+nnc_boundedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_bounds1_SOURCES = bounds1.cc
+nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_concatenate1_SOURCES = concatenate1.cc
+nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_congruences1_SOURCES = congruences1.cc
+nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_constrains1_SOURCES = constrains1.cc
+nnc_constrains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+nnc_containsintegerpoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+nnc_dropsomenonintegerpoints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_empty1_SOURCES = empty1.cc
+nnc_empty1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_equals1_SOURCES = equals1.cc
+nnc_equals1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_exceptions1_SOURCES = exceptions1.cc
+nnc_exceptions1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions3_SOURCES = exceptions3.cc
+nnc_exceptions3_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_expandspacedim1_SOURCES = expandspacedim1.cc
+nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_foldspacedims1_SOURCES = foldspacedims1.cc
+nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_frombdshape1_SOURCES = frombdshape1.cc
+nnc_frombdshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_frombox1_SOURCES = frombox1.cc
+nnc_frombox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_fromgrid1_SOURCES = fromgrid1.cc
+nnc_fromgrid1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+nnc_fromoctagonalshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+nnc_generalizedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_generators1_SOURCES = generators1.cc
+nnc_generators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_geomcovers1_SOURCES = geomcovers1.cc
+nnc_geomcovers1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_h79widening1_SOURCES = h79widening1.cc
+nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_intersection1_SOURCES = intersection1.cc
+nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+nnc_simplifyusingcontext1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+nnc_limitedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_linearpartition1_SOURCES = linearpartition1.cc
+nnc_linearpartition1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mapspacedims1_SOURCES = mapspacedims1.cc
+nnc_mapspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_max_min1_SOURCES = max_min1.cc
+nnc_max_min1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mc91_SOURCES = mc91.cc
+nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_membytes1_SOURCES = membytes1.cc
+nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_minconstraints1_SOURCES = minconstraints1.cc
+nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_mingenerators1_SOURCES = mingenerators1.cc
+nnc_mingenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_onepoint_SOURCES = onepoint.cc
+nnc_onepoint_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_permute_SOURCES = permute.cc
+nnc_permute_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polydifference1_SOURCES = polydifference1.cc
+nnc_polydifference1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polyhull1_SOURCES = polyhull1.cc
+nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_polyhullifexact1_SOURCES = polyhullifexact1.cc
+nnc_polyhullifexact1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_relations1_SOURCES = relations1.cc
+nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations2_SOURCES = relations2.cc
+nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_removespacedims1_SOURCES = removespacedims1.cc
+nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_smm1_SOURCES = smm1.cc
+nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_timeelapse1_SOURCES = timeelapse1.cc
+nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_unconstrain1_SOURCES = unconstrain1.cc
+nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_wrap1_SOURCES = wrap1.cc
+nnc_wrap1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_wrap2_SOURCES = wrap2.cc
+nnc_wrap2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+#
+# Sources for the special tests.
+#
+
+memory1_SRCS = memory1.cc
+
+
+if !VALGRIND_TESTS_ENABLED
+# The `memory1' test is currently disabled.  The reason is that there
+# is currently no reliable way to make it work, at least on Linux.
+# The reason is that memory is limited using RLIMIT_AS, which limits
+# brk, mmap and the stack: when we run out of stack, then of course
+# we crash.  So RLIMIT_AS cannot be used.  In principle, we could use
+# RLIMIT_DATA, which limits brk only.  However, glibc uses mmap when
+# it cannot obtain memory from brk (and perhaps in other cases as well),
+# but mmap is not limited by RLIMIT_DATA.  In summary, RLIMIT_AS limits
+# too much (in particular the stack, that should not be limited);
+# RLIMIT_DATA limits too little (it does not limit mmap, as we would like
+# it to).
+
+#VALGRIND_BRITTLE_TESTS = memory1
+
+#memory1_SOURCES = $(memory1_SRCS)
+
+endif !VALGRIND_TESTS_ENABLED
+
+
+TESTS = \
+$(ORIGINAL_TESTS) \
+$(DERIVED_TESTS) \
+$(VALGRIND_BRITTLE_TESTS)
+
+XFAIL_TESTS =
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+EXTRA_DIST = $(memory1_SRCS)
+
+BUGS =
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+densematrix1.dat \
+linearsystem1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writevariable1.dat
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Polyhedron/Makefile.in b/tests/Polyhedron/Makefile.in
new file mode 100644
index 0000000..c9dcb21
--- /dev/null
+++ b/tests/Polyhedron/Makefile.in
@@ -0,0 +1,6944 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4)
+subdir = tests/Polyhedron
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruence1$(EXEEXT) addcongruences1$(EXEEXT) \
+	addconstraint1$(EXEEXT) addconstraints1$(EXEEXT) \
+	addconstraints2$(EXEEXT) addgenerator1$(EXEEXT) \
+	addgenerator2$(EXEEXT) addgenerators1$(EXEEXT) \
+	addgenerators2$(EXEEXT) addspacedims1$(EXEEXT) \
+	addspacedims2$(EXEEXT) affineimage1$(EXEEXT) \
+	affineimage2$(EXEEXT) affinepreimage1$(EXEEXT) \
+	affinetrans$(EXEEXT) append1$(EXEEXT) append2$(EXEEXT) \
+	ascii_dump_load1$(EXEEXT) ascii_dump_load2$(EXEEXT) \
+	ascii_dump_load3$(EXEEXT) bgp99extrapolation1$(EXEEXT) \
+	bgp99extrapolation2$(EXEEXT) bhrz03widening1$(EXEEXT) \
+	bhrz03widening2$(EXEEXT) bhrz03widening3$(EXEEXT) \
+	bhz03widening1$(EXEEXT) bounded1$(EXEEXT) \
+	boundedaffineimage1$(EXEEXT) boundedaffinepreimage1$(EXEEXT) \
+	boundedbhrz03extrapolation1$(EXEEXT) \
+	boundedh79extrapolation1$(EXEEXT) bounds1$(EXEEXT) \
+	cnncconversion1$(EXEEXT) concatenate1$(EXEEXT) \
+	congruences1$(EXEEXT) constrains1$(EXEEXT) \
+	constraints1$(EXEEXT) contains1$(EXEEXT) contains2$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) disjoint1$(EXEEXT) \
+	disjoint2$(EXEEXT) dropsomenonintegerpoints1$(EXEEXT) \
+	dropsomenonintegerpoints2$(EXEEXT) dualhypercubes$(EXEEXT) \
+	empty1$(EXEEXT) equals1$(EXEEXT) exceptions1$(EXEEXT) \
+	exceptions2$(EXEEXT) exceptions3$(EXEEXT) \
+	expandspacedim1$(EXEEXT) expandspacedim2$(EXEEXT) \
+	foldspacedims1$(EXEEXT) foldspacedims2$(EXEEXT) \
+	frequency1$(EXEEXT) frombdshape1$(EXEEXT) frombox1$(EXEEXT) \
+	frombox2$(EXEEXT) fromgrid1$(EXEEXT) \
+	fromoctagonalshape1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+	generalizedaffineimage2$(EXEEXT) \
+	generalizedaffinepreimage1$(EXEEXT) \
+	generalizedaffinepreimage2$(EXEEXT) generators1$(EXEEXT) \
+	geomcovers1$(EXEEXT) h79widening1$(EXEEXT) \
+	h79widening2$(EXEEXT) hybrid$(EXEEXT) intersection1$(EXEEXT) \
+	limitedbhrz03extrapolation1$(EXEEXT) \
+	limitedh79extrapolation1$(EXEEXT) linearexpression1$(EXEEXT) \
+	linearpartition1$(EXEEXT) linearsystem1$(EXEEXT) \
+	mapspacedims1$(EXEEXT) matrix1$(EXEEXT) max_min1$(EXEEXT) \
+	maxspacedim1$(EXEEXT) mc91$(EXEEXT) membytes1$(EXEEXT) \
+	memory2$(EXEEXT) minconstraints1$(EXEEXT) \
+	minconstraints2$(EXEEXT) mingenerators1$(EXEEXT) \
+	mingenerators2$(EXEEXT) nncminimize1$(EXEEXT) \
+	nncminimize2$(EXEEXT) nncpostimeelapse1$(EXEEXT) \
+	numberinput1$(EXEEXT) onepoint$(EXEEXT) permute$(EXEEXT) \
+	polydifference1$(EXEEXT) polydifference2$(EXEEXT) \
+	polyhull1$(EXEEXT) polyhull2$(EXEEXT) \
+	polyhullifexact1$(EXEEXT) polyhullifexact2$(EXEEXT) \
+	randphull1$(EXEEXT) refinewithcongruence1$(EXEEXT) \
+	refinewithcongruences1$(EXEEXT) refinewithconstraint1$(EXEEXT) \
+	refinewithconstraints1$(EXEEXT) relations1$(EXEEXT) \
+	relations2$(EXEEXT) relations3$(EXEEXT) \
+	removespacedims1$(EXEEXT) removespacedims2$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) smm1$(EXEEXT) \
+	sparserow1$(EXEEXT) termination1$(EXEEXT) \
+	termination2$(EXEEXT) timeelapse1$(EXEEXT) \
+	timeelapse2$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+	unconstrain1$(EXEEXT) universe1$(EXEEXT) universe2$(EXEEXT) \
+	variablesset1$(EXEEXT) watchdog1$(EXEEXT) \
+	weightwatch1$(EXEEXT) wrap1$(EXEEXT) wrap2$(EXEEXT) \
+	writeconsys1$(EXEEXT) writegensys1$(EXEEXT) \
+	writepolyhedron1$(EXEEXT) writepolyhedron2$(EXEEXT) \
+	writerelation1$(EXEEXT) writevariable1$(EXEEXT)
+am__EXEEXT_2 = nnc_addcongruence1$(EXEEXT) \
+	nnc_addcongruences1$(EXEEXT) nnc_addconstraint1$(EXEEXT) \
+	nnc_addconstraints1$(EXEEXT) nnc_addgenerator1$(EXEEXT) \
+	nnc_addgenerators1$(EXEEXT) nnc_addspacedims1$(EXEEXT) \
+	nnc_affineimage1$(EXEEXT) nnc_affinepreimage1$(EXEEXT) \
+	nnc_affinetrans$(EXEEXT) nnc_append1$(EXEEXT) \
+	nnc_append2$(EXEEXT) nnc_ascii_dump_load1$(EXEEXT) \
+	nnc_ascii_dump_load2$(EXEEXT) nnc_bgp99extrapolation1$(EXEEXT) \
+	nnc_bhrz03widening1$(EXEEXT) nnc_bhrz03widening2$(EXEEXT) \
+	nnc_bounded1$(EXEEXT) nnc_boundedaffineimage1$(EXEEXT) \
+	nnc_boundedaffinepreimage1$(EXEEXT) \
+	nnc_boundedbhrz03extrapolation1$(EXEEXT) \
+	nnc_boundedh79extrapolation1$(EXEEXT) nnc_bounds1$(EXEEXT) \
+	nnc_concatenate1$(EXEEXT) nnc_congruences1$(EXEEXT) \
+	nnc_constrains1$(EXEEXT) nnc_constraints1$(EXEEXT) \
+	nnc_contains1$(EXEEXT) nnc_containsintegerpoint1$(EXEEXT) \
+	nnc_disjoint1$(EXEEXT) nnc_dropsomenonintegerpoints1$(EXEEXT) \
+	nnc_empty1$(EXEEXT) nnc_equals1$(EXEEXT) \
+	nnc_exceptions1$(EXEEXT) nnc_exceptions3$(EXEEXT) \
+	nnc_expandspacedim1$(EXEEXT) nnc_foldspacedims1$(EXEEXT) \
+	nnc_frombdshape1$(EXEEXT) nnc_frombox1$(EXEEXT) \
+	nnc_fromgrid1$(EXEEXT) nnc_fromoctagonalshape1$(EXEEXT) \
+	nnc_generalizedaffineimage1$(EXEEXT) \
+	nnc_generalizedaffinepreimage1$(EXEEXT) \
+	nnc_generators1$(EXEEXT) nnc_geomcovers1$(EXEEXT) \
+	nnc_h79widening1$(EXEEXT) nnc_intersection1$(EXEEXT) \
+	nnc_simplifyusingcontext1$(EXEEXT) \
+	nnc_limitedbhrz03extrapolation1$(EXEEXT) \
+	nnc_limitedh79extrapolation1$(EXEEXT) \
+	nnc_linearpartition1$(EXEEXT) nnc_mapspacedims1$(EXEEXT) \
+	nnc_max_min1$(EXEEXT) nnc_mc91$(EXEEXT) nnc_membytes1$(EXEEXT) \
+	nnc_minconstraints1$(EXEEXT) nnc_mingenerators1$(EXEEXT) \
+	nnc_onepoint$(EXEEXT) nnc_permute$(EXEEXT) \
+	nnc_polydifference1$(EXEEXT) nnc_polyhull1$(EXEEXT) \
+	nnc_polyhullifexact1$(EXEEXT) nnc_randphull1$(EXEEXT) \
+	nnc_relations1$(EXEEXT) nnc_relations2$(EXEEXT) \
+	nnc_removespacedims1$(EXEEXT) nnc_smm1$(EXEEXT) \
+	nnc_timeelapse1$(EXEEXT) nnc_unconstrain1$(EXEEXT) \
+	nnc_universe1$(EXEEXT) nnc_wrap1$(EXEEXT) nnc_wrap2$(EXEEXT) \
+	nnc_writepolyhedron1$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+am__EXEEXT_4 =
+am_addcongruence1_OBJECTS = addcongruence1.$(OBJEXT)
+addcongruence1_OBJECTS = $(am_addcongruence1_OBJECTS)
+addcongruence1_LDADD = $(LDADD)
+addcongruence1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraint1_OBJECTS = addconstraint1.$(OBJEXT)
+addconstraint1_OBJECTS = $(am_addconstraint1_OBJECTS)
+addconstraint1_LDADD = $(LDADD)
+addconstraint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addconstraints2_OBJECTS = addconstraints2.$(OBJEXT)
+addconstraints2_OBJECTS = $(am_addconstraints2_OBJECTS)
+addconstraints2_LDADD = $(LDADD)
+addconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerator1_OBJECTS = addgenerator1.$(OBJEXT)
+addgenerator1_OBJECTS = $(am_addgenerator1_OBJECTS)
+addgenerator1_LDADD = $(LDADD)
+addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerator2_OBJECTS = addgenerator2.$(OBJEXT)
+addgenerator2_OBJECTS = $(am_addgenerator2_OBJECTS)
+addgenerator2_LDADD = $(LDADD)
+addgenerator2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerators1_OBJECTS = addgenerators1.$(OBJEXT)
+addgenerators1_OBJECTS = $(am_addgenerators1_OBJECTS)
+addgenerators1_LDADD = $(LDADD)
+addgenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addgenerators2_OBJECTS = addgenerators2.$(OBJEXT)
+addgenerators2_OBJECTS = $(am_addgenerators2_OBJECTS)
+addgenerators2_LDADD = $(LDADD)
+addgenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims1_OBJECTS = addspacedims1.$(OBJEXT)
+addspacedims1_OBJECTS = $(am_addspacedims1_OBJECTS)
+addspacedims1_LDADD = $(LDADD)
+addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_addspacedims2_OBJECTS = addspacedims2.$(OBJEXT)
+addspacedims2_OBJECTS = $(am_addspacedims2_OBJECTS)
+addspacedims2_LDADD = $(LDADD)
+addspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage2_OBJECTS = affineimage2.$(OBJEXT)
+affineimage2_OBJECTS = $(am_affineimage2_OBJECTS)
+affineimage2_LDADD = $(LDADD)
+affineimage2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinetrans_OBJECTS = affinetrans.$(OBJEXT)
+affinetrans_OBJECTS = $(am_affinetrans_OBJECTS)
+affinetrans_LDADD = $(LDADD)
+affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_append1_OBJECTS = append1.$(OBJEXT)
+append1_OBJECTS = $(am_append1_OBJECTS)
+append1_LDADD = $(LDADD)
+append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_append2_OBJECTS = append2.$(OBJEXT)
+append2_OBJECTS = $(am_append2_OBJECTS)
+append2_LDADD = $(LDADD)
+append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load1_OBJECTS = ascii_dump_load1.$(OBJEXT)
+ascii_dump_load1_OBJECTS = $(am_ascii_dump_load1_OBJECTS)
+ascii_dump_load1_LDADD = $(LDADD)
+ascii_dump_load1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load2_OBJECTS = ascii_dump_load2.$(OBJEXT)
+ascii_dump_load2_OBJECTS = $(am_ascii_dump_load2_OBJECTS)
+ascii_dump_load2_LDADD = $(LDADD)
+ascii_dump_load2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_ascii_dump_load3_OBJECTS = ascii_dump_load3.$(OBJEXT)
+ascii_dump_load3_OBJECTS = $(am_ascii_dump_load3_OBJECTS)
+ascii_dump_load3_LDADD = $(LDADD)
+ascii_dump_load3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation1_OBJECTS = bgp99extrapolation1.$(OBJEXT)
+bgp99extrapolation1_OBJECTS = $(am_bgp99extrapolation1_OBJECTS)
+bgp99extrapolation1_LDADD = $(LDADD)
+bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bgp99extrapolation2_OBJECTS = bgp99extrapolation2.$(OBJEXT)
+bgp99extrapolation2_OBJECTS = $(am_bgp99extrapolation2_OBJECTS)
+bgp99extrapolation2_LDADD = $(LDADD)
+bgp99extrapolation2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhrz03widening1_OBJECTS = bhrz03widening1.$(OBJEXT)
+bhrz03widening1_OBJECTS = $(am_bhrz03widening1_OBJECTS)
+bhrz03widening1_LDADD = $(LDADD)
+bhrz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhrz03widening2_OBJECTS = bhrz03widening2.$(OBJEXT)
+bhrz03widening2_OBJECTS = $(am_bhrz03widening2_OBJECTS)
+bhrz03widening2_LDADD = $(LDADD)
+bhrz03widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhrz03widening3_OBJECTS = bhrz03widening3.$(OBJEXT)
+bhrz03widening3_OBJECTS = $(am_bhrz03widening3_OBJECTS)
+bhrz03widening3_LDADD = $(LDADD)
+bhrz03widening3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bhz03widening1_OBJECTS = bhz03widening1.$(OBJEXT)
+bhz03widening1_OBJECTS = $(am_bhz03widening1_OBJECTS)
+bhz03widening1_LDADD = $(LDADD)
+bhz03widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffineimage1_OBJECTS = boundedaffineimage1.$(OBJEXT)
+boundedaffineimage1_OBJECTS = $(am_boundedaffineimage1_OBJECTS)
+boundedaffineimage1_LDADD = $(LDADD)
+boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedaffinepreimage1_OBJECTS = boundedaffinepreimage1.$(OBJEXT)
+boundedaffinepreimage1_OBJECTS = $(am_boundedaffinepreimage1_OBJECTS)
+boundedaffinepreimage1_LDADD = $(LDADD)
+boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedbhrz03extrapolation1_OBJECTS =  \
+	boundedbhrz03extrapolation1.$(OBJEXT)
+boundedbhrz03extrapolation1_OBJECTS =  \
+	$(am_boundedbhrz03extrapolation1_OBJECTS)
+boundedbhrz03extrapolation1_LDADD = $(LDADD)
+boundedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_boundedh79extrapolation1_OBJECTS =  \
+	boundedh79extrapolation1.$(OBJEXT)
+boundedh79extrapolation1_OBJECTS =  \
+	$(am_boundedh79extrapolation1_OBJECTS)
+boundedh79extrapolation1_LDADD = $(LDADD)
+boundedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_cnncconversion1_OBJECTS = cnncconversion1.$(OBJEXT)
+cnncconversion1_OBJECTS = $(am_cnncconversion1_OBJECTS)
+cnncconversion1_LDADD = $(LDADD)
+cnncconversion1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_congruences1_OBJECTS = congruences1.$(OBJEXT)
+congruences1_OBJECTS = $(am_congruences1_OBJECTS)
+congruences1_LDADD = $(LDADD)
+congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constrains1_OBJECTS = constrains1.$(OBJEXT)
+constrains1_OBJECTS = $(am_constrains1_OBJECTS)
+constrains1_LDADD = $(LDADD)
+constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_constraints1_OBJECTS = constraints1.$(OBJEXT)
+constraints1_OBJECTS = $(am_constraints1_OBJECTS)
+constraints1_LDADD = $(LDADD)
+constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains2_OBJECTS = contains2.$(OBJEXT)
+contains2_OBJECTS = $(am_contains2_OBJECTS)
+contains2_LDADD = $(LDADD)
+contains2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint2_OBJECTS = disjoint2.$(OBJEXT)
+disjoint2_OBJECTS = $(am_disjoint2_OBJECTS)
+disjoint2_LDADD = $(LDADD)
+disjoint2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints1_OBJECTS =  \
+	dropsomenonintegerpoints1.$(OBJEXT)
+dropsomenonintegerpoints1_OBJECTS =  \
+	$(am_dropsomenonintegerpoints1_OBJECTS)
+dropsomenonintegerpoints1_LDADD = $(LDADD)
+dropsomenonintegerpoints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dropsomenonintegerpoints2_OBJECTS =  \
+	dropsomenonintegerpoints2.$(OBJEXT)
+dropsomenonintegerpoints2_OBJECTS =  \
+	$(am_dropsomenonintegerpoints2_OBJECTS)
+dropsomenonintegerpoints2_LDADD = $(LDADD)
+dropsomenonintegerpoints2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_dualhypercubes_OBJECTS = dualhypercubes.$(OBJEXT)
+dualhypercubes_OBJECTS = $(am_dualhypercubes_OBJECTS)
+dualhypercubes_LDADD = $(LDADD)
+dualhypercubes_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions1_OBJECTS = exceptions1.$(OBJEXT)
+exceptions1_OBJECTS = $(am_exceptions1_OBJECTS)
+exceptions1_LDADD = $(LDADD)
+exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions2_OBJECTS = exceptions2.$(OBJEXT)
+exceptions2_OBJECTS = $(am_exceptions2_OBJECTS)
+exceptions2_LDADD = $(LDADD)
+exceptions2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_exceptions3_OBJECTS = exceptions3.$(OBJEXT)
+exceptions3_OBJECTS = $(am_exceptions3_OBJECTS)
+exceptions3_LDADD = $(LDADD)
+exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim1_OBJECTS = expandspacedim1.$(OBJEXT)
+expandspacedim1_OBJECTS = $(am_expandspacedim1_OBJECTS)
+expandspacedim1_LDADD = $(LDADD)
+expandspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_expandspacedim2_OBJECTS = expandspacedim2.$(OBJEXT)
+expandspacedim2_OBJECTS = $(am_expandspacedim2_OBJECTS)
+expandspacedim2_LDADD = $(LDADD)
+expandspacedim2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims1_OBJECTS = foldspacedims1.$(OBJEXT)
+foldspacedims1_OBJECTS = $(am_foldspacedims1_OBJECTS)
+foldspacedims1_LDADD = $(LDADD)
+foldspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_foldspacedims2_OBJECTS = foldspacedims2.$(OBJEXT)
+foldspacedims2_OBJECTS = $(am_foldspacedims2_OBJECTS)
+foldspacedims2_LDADD = $(LDADD)
+foldspacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frequency1_OBJECTS = frequency1.$(OBJEXT)
+frequency1_OBJECTS = $(am_frequency1_OBJECTS)
+frequency1_LDADD = $(LDADD)
+frequency1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox2_OBJECTS = frombox2.$(OBJEXT)
+frombox2_OBJECTS = $(am_frombox2_OBJECTS)
+frombox2_LDADD = $(LDADD)
+frombox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage1_OBJECTS =  \
+	generalizedaffineimage1.$(OBJEXT)
+generalizedaffineimage1_OBJECTS =  \
+	$(am_generalizedaffineimage1_OBJECTS)
+generalizedaffineimage1_LDADD = $(LDADD)
+generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffineimage2_OBJECTS =  \
+	generalizedaffineimage2.$(OBJEXT)
+generalizedaffineimage2_OBJECTS =  \
+	$(am_generalizedaffineimage2_OBJECTS)
+generalizedaffineimage2_LDADD = $(LDADD)
+generalizedaffineimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage1_OBJECTS =  \
+	generalizedaffinepreimage1.$(OBJEXT)
+generalizedaffinepreimage1_OBJECTS =  \
+	$(am_generalizedaffinepreimage1_OBJECTS)
+generalizedaffinepreimage1_LDADD = $(LDADD)
+generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generalizedaffinepreimage2_OBJECTS =  \
+	generalizedaffinepreimage2.$(OBJEXT)
+generalizedaffinepreimage2_OBJECTS =  \
+	$(am_generalizedaffinepreimage2_OBJECTS)
+generalizedaffinepreimage2_LDADD = $(LDADD)
+generalizedaffinepreimage2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_generators1_OBJECTS = generators1.$(OBJEXT)
+generators1_OBJECTS = $(am_generators1_OBJECTS)
+generators1_LDADD = $(LDADD)
+generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_geomcovers1_OBJECTS = geomcovers1.$(OBJEXT)
+geomcovers1_OBJECTS = $(am_geomcovers1_OBJECTS)
+geomcovers1_LDADD = $(LDADD)
+geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_h79widening1_OBJECTS = h79widening1.$(OBJEXT)
+h79widening1_OBJECTS = $(am_h79widening1_OBJECTS)
+h79widening1_LDADD = $(LDADD)
+h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_h79widening2_OBJECTS = h79widening2.$(OBJEXT)
+h79widening2_OBJECTS = $(am_h79widening2_OBJECTS)
+h79widening2_LDADD = $(LDADD)
+h79widening2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_hybrid_OBJECTS = hybrid.$(OBJEXT)
+hybrid_OBJECTS = $(am_hybrid_OBJECTS)
+hybrid_LDADD = $(LDADD)
+hybrid_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedbhrz03extrapolation1_OBJECTS =  \
+	limitedbhrz03extrapolation1.$(OBJEXT)
+limitedbhrz03extrapolation1_OBJECTS =  \
+	$(am_limitedbhrz03extrapolation1_OBJECTS)
+limitedbhrz03extrapolation1_LDADD = $(LDADD)
+limitedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_limitedh79extrapolation1_OBJECTS =  \
+	limitedh79extrapolation1.$(OBJEXT)
+limitedh79extrapolation1_OBJECTS =  \
+	$(am_limitedh79extrapolation1_OBJECTS)
+limitedh79extrapolation1_LDADD = $(LDADD)
+limitedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearexpression1_OBJECTS = linearexpression1.$(OBJEXT)
+linearexpression1_OBJECTS = $(am_linearexpression1_OBJECTS)
+linearexpression1_LDADD = $(LDADD)
+linearexpression1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearpartition1_OBJECTS = linearpartition1.$(OBJEXT)
+linearpartition1_OBJECTS = $(am_linearpartition1_OBJECTS)
+linearpartition1_LDADD = $(LDADD)
+linearpartition1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_linearsystem1_OBJECTS = linearsystem1.$(OBJEXT)
+linearsystem1_OBJECTS = $(am_linearsystem1_OBJECTS)
+linearsystem1_LDADD = $(LDADD)
+linearsystem1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mapspacedims1_OBJECTS = mapspacedims1.$(OBJEXT)
+mapspacedims1_OBJECTS = $(am_mapspacedims1_OBJECTS)
+mapspacedims1_LDADD = $(LDADD)
+mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_matrix1_OBJECTS = matrix1.$(OBJEXT)
+matrix1_OBJECTS = $(am_matrix1_OBJECTS)
+matrix1_LDADD = $(LDADD)
+matrix1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_max_min1_OBJECTS = max_min1.$(OBJEXT)
+max_min1_OBJECTS = $(am_max_min1_OBJECTS)
+max_min1_LDADD = $(LDADD)
+max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxspacedim1_OBJECTS = maxspacedim1.$(OBJEXT)
+maxspacedim1_OBJECTS = $(am_maxspacedim1_OBJECTS)
+maxspacedim1_LDADD = $(LDADD)
+maxspacedim1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mc91_OBJECTS = mc91.$(OBJEXT)
+mc91_OBJECTS = $(am_mc91_OBJECTS)
+mc91_LDADD = $(LDADD)
+mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_memory2_OBJECTS = memory2.$(OBJEXT)
+memory2_OBJECTS = $(am_memory2_OBJECTS)
+memory2_LDADD = $(LDADD)
+memory2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints1_OBJECTS = minconstraints1.$(OBJEXT)
+minconstraints1_OBJECTS = $(am_minconstraints1_OBJECTS)
+minconstraints1_LDADD = $(LDADD)
+minconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_minconstraints2_OBJECTS = minconstraints2.$(OBJEXT)
+minconstraints2_OBJECTS = $(am_minconstraints2_OBJECTS)
+minconstraints2_LDADD = $(LDADD)
+minconstraints2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mingenerators1_OBJECTS = mingenerators1.$(OBJEXT)
+mingenerators1_OBJECTS = $(am_mingenerators1_OBJECTS)
+mingenerators1_LDADD = $(LDADD)
+mingenerators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_mingenerators2_OBJECTS = mingenerators2.$(OBJEXT)
+mingenerators2_OBJECTS = $(am_mingenerators2_OBJECTS)
+mingenerators2_LDADD = $(LDADD)
+mingenerators2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_addcongruence1_OBJECTS =  \
+	nnc_addcongruence1-addcongruence1.$(OBJEXT)
+nnc_addcongruence1_OBJECTS = $(am_nnc_addcongruence1_OBJECTS)
+nnc_addcongruence1_LDADD = $(LDADD)
+nnc_addcongruence1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addcongruence1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_addcongruences1_OBJECTS =  \
+	nnc_addcongruences1-addcongruences1.$(OBJEXT)
+nnc_addcongruences1_OBJECTS = $(am_nnc_addcongruences1_OBJECTS)
+nnc_addcongruences1_LDADD = $(LDADD)
+nnc_addcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addcongruences1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_addconstraint1_OBJECTS =  \
+	nnc_addconstraint1-addconstraint1.$(OBJEXT)
+nnc_addconstraint1_OBJECTS = $(am_nnc_addconstraint1_OBJECTS)
+nnc_addconstraint1_LDADD = $(LDADD)
+nnc_addconstraint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addconstraint1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_addconstraints1_OBJECTS =  \
+	nnc_addconstraints1-addconstraints1.$(OBJEXT)
+nnc_addconstraints1_OBJECTS = $(am_nnc_addconstraints1_OBJECTS)
+nnc_addconstraints1_LDADD = $(LDADD)
+nnc_addconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addconstraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_addgenerator1_OBJECTS =  \
+	nnc_addgenerator1-addgenerator1.$(OBJEXT)
+nnc_addgenerator1_OBJECTS = $(am_nnc_addgenerator1_OBJECTS)
+nnc_addgenerator1_LDADD = $(LDADD)
+nnc_addgenerator1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addgenerator1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_addgenerators1_OBJECTS =  \
+	nnc_addgenerators1-addgenerators1.$(OBJEXT)
+nnc_addgenerators1_OBJECTS = $(am_nnc_addgenerators1_OBJECTS)
+nnc_addgenerators1_LDADD = $(LDADD)
+nnc_addgenerators1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addgenerators1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_addspacedims1_OBJECTS =  \
+	nnc_addspacedims1-addspacedims1.$(OBJEXT)
+nnc_addspacedims1_OBJECTS = $(am_nnc_addspacedims1_OBJECTS)
+nnc_addspacedims1_LDADD = $(LDADD)
+nnc_addspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_addspacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_affineimage1_OBJECTS = nnc_affineimage1-affineimage1.$(OBJEXT)
+nnc_affineimage1_OBJECTS = $(am_nnc_affineimage1_OBJECTS)
+nnc_affineimage1_LDADD = $(LDADD)
+nnc_affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_affineimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_affinepreimage1_OBJECTS =  \
+	nnc_affinepreimage1-affinepreimage1.$(OBJEXT)
+nnc_affinepreimage1_OBJECTS = $(am_nnc_affinepreimage1_OBJECTS)
+nnc_affinepreimage1_LDADD = $(LDADD)
+nnc_affinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_affinepreimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_affinetrans_OBJECTS = nnc_affinetrans-affinetrans.$(OBJEXT)
+nnc_affinetrans_OBJECTS = $(am_nnc_affinetrans_OBJECTS)
+nnc_affinetrans_LDADD = $(LDADD)
+nnc_affinetrans_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_affinetrans_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_append1_OBJECTS = nnc_append1-append1.$(OBJEXT)
+nnc_append1_OBJECTS = $(am_nnc_append1_OBJECTS)
+nnc_append1_LDADD = $(LDADD)
+nnc_append1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_append1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_append1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_append2_OBJECTS = nnc_append2-append2.$(OBJEXT)
+nnc_append2_OBJECTS = $(am_nnc_append2_OBJECTS)
+nnc_append2_LDADD = $(LDADD)
+nnc_append2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_append2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_append2_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_ascii_dump_load1_OBJECTS =  \
+	nnc_ascii_dump_load1-ascii_dump_load1.$(OBJEXT)
+nnc_ascii_dump_load1_OBJECTS = $(am_nnc_ascii_dump_load1_OBJECTS)
+nnc_ascii_dump_load1_LDADD = $(LDADD)
+nnc_ascii_dump_load1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_ascii_dump_load1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_ascii_dump_load2_OBJECTS =  \
+	nnc_ascii_dump_load2-ascii_dump_load2.$(OBJEXT)
+nnc_ascii_dump_load2_OBJECTS = $(am_nnc_ascii_dump_load2_OBJECTS)
+nnc_ascii_dump_load2_LDADD = $(LDADD)
+nnc_ascii_dump_load2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_ascii_dump_load2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_bgp99extrapolation1_OBJECTS =  \
+	nnc_bgp99extrapolation1-bgp99extrapolation1.$(OBJEXT)
+nnc_bgp99extrapolation1_OBJECTS =  \
+	$(am_nnc_bgp99extrapolation1_OBJECTS)
+nnc_bgp99extrapolation1_LDADD = $(LDADD)
+nnc_bgp99extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_bgp99extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_bhrz03widening1_OBJECTS =  \
+	nnc_bhrz03widening1-bhrz03widening1.$(OBJEXT)
+nnc_bhrz03widening1_OBJECTS = $(am_nnc_bhrz03widening1_OBJECTS)
+nnc_bhrz03widening1_LDADD = $(LDADD)
+nnc_bhrz03widening1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_bhrz03widening1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_bhrz03widening2_OBJECTS =  \
+	nnc_bhrz03widening2-bhrz03widening2.$(OBJEXT)
+nnc_bhrz03widening2_OBJECTS = $(am_nnc_bhrz03widening2_OBJECTS)
+nnc_bhrz03widening2_LDADD = $(LDADD)
+nnc_bhrz03widening2_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_bhrz03widening2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_bounded1_OBJECTS = nnc_bounded1-bounded1.$(OBJEXT)
+nnc_bounded1_OBJECTS = $(am_nnc_bounded1_OBJECTS)
+nnc_bounded1_LDADD = $(LDADD)
+nnc_bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_bounded1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_bounded1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_boundedaffineimage1_OBJECTS =  \
+	nnc_boundedaffineimage1-boundedaffineimage1.$(OBJEXT)
+nnc_boundedaffineimage1_OBJECTS =  \
+	$(am_nnc_boundedaffineimage1_OBJECTS)
+nnc_boundedaffineimage1_LDADD = $(LDADD)
+nnc_boundedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_boundedaffineimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_boundedaffinepreimage1_OBJECTS =  \
+	nnc_boundedaffinepreimage1-boundedaffinepreimage1.$(OBJEXT)
+nnc_boundedaffinepreimage1_OBJECTS =  \
+	$(am_nnc_boundedaffinepreimage1_OBJECTS)
+nnc_boundedaffinepreimage1_LDADD = $(LDADD)
+nnc_boundedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_boundedaffinepreimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_boundedbhrz03extrapolation1_OBJECTS =  \
+	boundedbhrz03extrapolation1.$(OBJEXT)
+nnc_boundedbhrz03extrapolation1_OBJECTS =  \
+	$(am_nnc_boundedbhrz03extrapolation1_OBJECTS)
+nnc_boundedbhrz03extrapolation1_LDADD = $(LDADD)
+nnc_boundedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nnc_boundedh79extrapolation1_OBJECTS = nnc_boundedh79extrapolation1-boundedh79extrapolation1.$(OBJEXT)
+nnc_boundedh79extrapolation1_OBJECTS =  \
+	$(am_nnc_boundedh79extrapolation1_OBJECTS)
+nnc_boundedh79extrapolation1_LDADD = $(LDADD)
+nnc_boundedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_boundedh79extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_bounds1_OBJECTS = nnc_bounds1-bounds1.$(OBJEXT)
+nnc_bounds1_OBJECTS = $(am_nnc_bounds1_OBJECTS)
+nnc_bounds1_LDADD = $(LDADD)
+nnc_bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_bounds1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_bounds1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_concatenate1_OBJECTS = nnc_concatenate1-concatenate1.$(OBJEXT)
+nnc_concatenate1_OBJECTS = $(am_nnc_concatenate1_OBJECTS)
+nnc_concatenate1_LDADD = $(LDADD)
+nnc_concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_concatenate1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_congruences1_OBJECTS = nnc_congruences1-congruences1.$(OBJEXT)
+nnc_congruences1_OBJECTS = $(am_nnc_congruences1_OBJECTS)
+nnc_congruences1_LDADD = $(LDADD)
+nnc_congruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_congruences1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_constrains1_OBJECTS = nnc_constrains1-constrains1.$(OBJEXT)
+nnc_constrains1_OBJECTS = $(am_nnc_constrains1_OBJECTS)
+nnc_constrains1_LDADD = $(LDADD)
+nnc_constrains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_constrains1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_constraints1_OBJECTS = nnc_constraints1-constraints1.$(OBJEXT)
+nnc_constraints1_OBJECTS = $(am_nnc_constraints1_OBJECTS)
+nnc_constraints1_LDADD = $(LDADD)
+nnc_constraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_constraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_contains1_OBJECTS = nnc_contains1-contains1.$(OBJEXT)
+nnc_contains1_OBJECTS = $(am_nnc_contains1_OBJECTS)
+nnc_contains1_LDADD = $(LDADD)
+nnc_contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_contains1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_contains1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+am_nnc_containsintegerpoint1_OBJECTS =  \
+	nnc_containsintegerpoint1-containsintegerpoint1.$(OBJEXT)
+nnc_containsintegerpoint1_OBJECTS =  \
+	$(am_nnc_containsintegerpoint1_OBJECTS)
+nnc_containsintegerpoint1_LDADD = $(LDADD)
+nnc_containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_containsintegerpoint1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_disjoint1_OBJECTS = nnc_disjoint1-disjoint1.$(OBJEXT)
+nnc_disjoint1_OBJECTS = $(am_nnc_disjoint1_OBJECTS)
+nnc_disjoint1_LDADD = $(LDADD)
+nnc_disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_disjoint1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+am_nnc_dropsomenonintegerpoints1_OBJECTS = nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.$(OBJEXT)
+nnc_dropsomenonintegerpoints1_OBJECTS =  \
+	$(am_nnc_dropsomenonintegerpoints1_OBJECTS)
+nnc_dropsomenonintegerpoints1_LDADD = $(LDADD)
+nnc_dropsomenonintegerpoints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_dropsomenonintegerpoints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_empty1_OBJECTS = nnc_empty1-empty1.$(OBJEXT)
+nnc_empty1_OBJECTS = $(am_nnc_empty1_OBJECTS)
+nnc_empty1_LDADD = $(LDADD)
+nnc_empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_empty1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_empty1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_equals1_OBJECTS = nnc_equals1-equals1.$(OBJEXT)
+nnc_equals1_OBJECTS = $(am_nnc_equals1_OBJECTS)
+nnc_equals1_LDADD = $(LDADD)
+nnc_equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_equals1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_equals1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_exceptions1_OBJECTS = nnc_exceptions1-exceptions1.$(OBJEXT)
+nnc_exceptions1_OBJECTS = $(am_nnc_exceptions1_OBJECTS)
+nnc_exceptions1_LDADD = $(LDADD)
+nnc_exceptions1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_exceptions1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_exceptions3_OBJECTS = nnc_exceptions3-exceptions3.$(OBJEXT)
+nnc_exceptions3_OBJECTS = $(am_nnc_exceptions3_OBJECTS)
+nnc_exceptions3_LDADD = $(LDADD)
+nnc_exceptions3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_exceptions3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_expandspacedim1_OBJECTS =  \
+	nnc_expandspacedim1-expandspacedim1.$(OBJEXT)
+nnc_expandspacedim1_OBJECTS = $(am_nnc_expandspacedim1_OBJECTS)
+nnc_expandspacedim1_LDADD = $(LDADD)
+nnc_expandspacedim1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_expandspacedim1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_foldspacedims1_OBJECTS =  \
+	nnc_foldspacedims1-foldspacedims1.$(OBJEXT)
+nnc_foldspacedims1_OBJECTS = $(am_nnc_foldspacedims1_OBJECTS)
+nnc_foldspacedims1_LDADD = $(LDADD)
+nnc_foldspacedims1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_foldspacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_frombdshape1_OBJECTS = nnc_frombdshape1-frombdshape1.$(OBJEXT)
+nnc_frombdshape1_OBJECTS = $(am_nnc_frombdshape1_OBJECTS)
+nnc_frombdshape1_LDADD = $(LDADD)
+nnc_frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_frombdshape1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_frombox1_OBJECTS = nnc_frombox1-frombox1.$(OBJEXT)
+nnc_frombox1_OBJECTS = $(am_nnc_frombox1_OBJECTS)
+nnc_frombox1_LDADD = $(LDADD)
+nnc_frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_frombox1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_frombox1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_fromgrid1_OBJECTS = nnc_fromgrid1-fromgrid1.$(OBJEXT)
+nnc_fromgrid1_OBJECTS = $(am_nnc_fromgrid1_OBJECTS)
+nnc_fromgrid1_LDADD = $(LDADD)
+nnc_fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_fromgrid1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+am_nnc_fromoctagonalshape1_OBJECTS =  \
+	nnc_fromoctagonalshape1-fromoctagonalshape1.$(OBJEXT)
+nnc_fromoctagonalshape1_OBJECTS =  \
+	$(am_nnc_fromoctagonalshape1_OBJECTS)
+nnc_fromoctagonalshape1_LDADD = $(LDADD)
+nnc_fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_fromoctagonalshape1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_generalizedaffineimage1_OBJECTS =  \
+	nnc_generalizedaffineimage1-generalizedaffineimage1.$(OBJEXT)
+nnc_generalizedaffineimage1_OBJECTS =  \
+	$(am_nnc_generalizedaffineimage1_OBJECTS)
+nnc_generalizedaffineimage1_LDADD = $(LDADD)
+nnc_generalizedaffineimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_generalizedaffineimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_generalizedaffinepreimage1_OBJECTS = nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.$(OBJEXT)
+nnc_generalizedaffinepreimage1_OBJECTS =  \
+	$(am_nnc_generalizedaffinepreimage1_OBJECTS)
+nnc_generalizedaffinepreimage1_LDADD = $(LDADD)
+nnc_generalizedaffinepreimage1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_generalizedaffinepreimage1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_generators1_OBJECTS = nnc_generators1-generators1.$(OBJEXT)
+nnc_generators1_OBJECTS = $(am_nnc_generators1_OBJECTS)
+nnc_generators1_LDADD = $(LDADD)
+nnc_generators1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_generators1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_generators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_geomcovers1_OBJECTS = nnc_geomcovers1-geomcovers1.$(OBJEXT)
+nnc_geomcovers1_OBJECTS = $(am_nnc_geomcovers1_OBJECTS)
+nnc_geomcovers1_LDADD = $(LDADD)
+nnc_geomcovers1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_geomcovers1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_h79widening1_OBJECTS = nnc_h79widening1-h79widening1.$(OBJEXT)
+nnc_h79widening1_OBJECTS = $(am_nnc_h79widening1_OBJECTS)
+nnc_h79widening1_LDADD = $(LDADD)
+nnc_h79widening1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_h79widening1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_intersection1_OBJECTS =  \
+	nnc_intersection1-intersection1.$(OBJEXT)
+nnc_intersection1_OBJECTS = $(am_nnc_intersection1_OBJECTS)
+nnc_intersection1_LDADD = $(LDADD)
+nnc_intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_intersection1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_limitedbhrz03extrapolation1_OBJECTS = nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.$(OBJEXT)
+nnc_limitedbhrz03extrapolation1_OBJECTS =  \
+	$(am_nnc_limitedbhrz03extrapolation1_OBJECTS)
+nnc_limitedbhrz03extrapolation1_LDADD = $(LDADD)
+nnc_limitedbhrz03extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_limitedbhrz03extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_limitedh79extrapolation1_OBJECTS = nnc_limitedh79extrapolation1-limitedh79extrapolation1.$(OBJEXT)
+nnc_limitedh79extrapolation1_OBJECTS =  \
+	$(am_nnc_limitedh79extrapolation1_OBJECTS)
+nnc_limitedh79extrapolation1_LDADD = $(LDADD)
+nnc_limitedh79extrapolation1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_limitedh79extrapolation1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_linearpartition1_OBJECTS =  \
+	nnc_linearpartition1-linearpartition1.$(OBJEXT)
+nnc_linearpartition1_OBJECTS = $(am_nnc_linearpartition1_OBJECTS)
+nnc_linearpartition1_LDADD = $(LDADD)
+nnc_linearpartition1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_linearpartition1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_mapspacedims1_OBJECTS =  \
+	nnc_mapspacedims1-mapspacedims1.$(OBJEXT)
+nnc_mapspacedims1_OBJECTS = $(am_nnc_mapspacedims1_OBJECTS)
+nnc_mapspacedims1_LDADD = $(LDADD)
+nnc_mapspacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_mapspacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_max_min1_OBJECTS = nnc_max_min1-max_min1.$(OBJEXT)
+nnc_max_min1_OBJECTS = $(am_nnc_max_min1_OBJECTS)
+nnc_max_min1_LDADD = $(LDADD)
+nnc_max_min1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_max_min1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_max_min1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_mc91_OBJECTS = nnc_mc91-mc91.$(OBJEXT)
+nnc_mc91_OBJECTS = $(am_nnc_mc91_OBJECTS)
+nnc_mc91_LDADD = $(LDADD)
+nnc_mc91_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_mc91_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_mc91_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_membytes1_OBJECTS = nnc_membytes1-membytes1.$(OBJEXT)
+nnc_membytes1_OBJECTS = $(am_nnc_membytes1_OBJECTS)
+nnc_membytes1_LDADD = $(LDADD)
+nnc_membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_membytes1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+am_nnc_minconstraints1_OBJECTS =  \
+	nnc_minconstraints1-minconstraints1.$(OBJEXT)
+nnc_minconstraints1_OBJECTS = $(am_nnc_minconstraints1_OBJECTS)
+nnc_minconstraints1_LDADD = $(LDADD)
+nnc_minconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_minconstraints1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_mingenerators1_OBJECTS =  \
+	nnc_mingenerators1-mingenerators1.$(OBJEXT)
+nnc_mingenerators1_OBJECTS = $(am_nnc_mingenerators1_OBJECTS)
+nnc_mingenerators1_LDADD = $(LDADD)
+nnc_mingenerators1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_mingenerators1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_onepoint_OBJECTS = nnc_onepoint-onepoint.$(OBJEXT)
+nnc_onepoint_OBJECTS = $(am_nnc_onepoint_OBJECTS)
+nnc_onepoint_LDADD = $(LDADD)
+nnc_onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_onepoint_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_onepoint_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_permute_OBJECTS = nnc_permute-permute.$(OBJEXT)
+nnc_permute_OBJECTS = $(am_nnc_permute_OBJECTS)
+nnc_permute_LDADD = $(LDADD)
+nnc_permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_permute_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_permute_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_polydifference1_OBJECTS =  \
+	nnc_polydifference1-polydifference1.$(OBJEXT)
+nnc_polydifference1_OBJECTS = $(am_nnc_polydifference1_OBJECTS)
+nnc_polydifference1_LDADD = $(LDADD)
+nnc_polydifference1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_polydifference1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_polyhull1_OBJECTS = nnc_polyhull1-polyhull1.$(OBJEXT)
+nnc_polyhull1_OBJECTS = $(am_nnc_polyhull1_OBJECTS)
+nnc_polyhull1_LDADD = $(LDADD)
+nnc_polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_polyhull1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+am_nnc_polyhullifexact1_OBJECTS =  \
+	nnc_polyhullifexact1-polyhullifexact1.$(OBJEXT)
+nnc_polyhullifexact1_OBJECTS = $(am_nnc_polyhullifexact1_OBJECTS)
+nnc_polyhullifexact1_LDADD = $(LDADD)
+nnc_polyhullifexact1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_polyhullifexact1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_randphull1_OBJECTS = nnc_randphull1-randphull1.$(OBJEXT)
+nnc_randphull1_OBJECTS = $(am_nnc_randphull1_OBJECTS)
+nnc_randphull1_LDADD = $(LDADD)
+nnc_randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_randphull1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_relations1_OBJECTS = nnc_relations1-relations1.$(OBJEXT)
+nnc_relations1_OBJECTS = $(am_nnc_relations1_OBJECTS)
+nnc_relations1_LDADD = $(LDADD)
+nnc_relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_relations1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_relations1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_relations2_OBJECTS = nnc_relations2-relations2.$(OBJEXT)
+nnc_relations2_OBJECTS = $(am_nnc_relations2_OBJECTS)
+nnc_relations2_LDADD = $(LDADD)
+nnc_relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_relations2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_relations2_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_removespacedims1_OBJECTS =  \
+	nnc_removespacedims1-removespacedims1.$(OBJEXT)
+nnc_removespacedims1_OBJECTS = $(am_nnc_removespacedims1_OBJECTS)
+nnc_removespacedims1_LDADD = $(LDADD)
+nnc_removespacedims1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_removespacedims1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_simplifyusingcontext1_OBJECTS =  \
+	nnc_simplifyusingcontext1-simplifyusingcontext1.$(OBJEXT)
+nnc_simplifyusingcontext1_OBJECTS =  \
+	$(am_nnc_simplifyusingcontext1_OBJECTS)
+nnc_simplifyusingcontext1_LDADD = $(LDADD)
+nnc_simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_simplifyusingcontext1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_smm1_OBJECTS = nnc_smm1-smm1.$(OBJEXT)
+nnc_smm1_OBJECTS = $(am_nnc_smm1_OBJECTS)
+nnc_smm1_LDADD = $(LDADD)
+nnc_smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_smm1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_smm1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_timeelapse1_OBJECTS = nnc_timeelapse1-timeelapse1.$(OBJEXT)
+nnc_timeelapse1_OBJECTS = $(am_nnc_timeelapse1_OBJECTS)
+nnc_timeelapse1_LDADD = $(LDADD)
+nnc_timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_timeelapse1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_unconstrain1_OBJECTS = nnc_unconstrain1-unconstrain1.$(OBJEXT)
+nnc_unconstrain1_OBJECTS = $(am_nnc_unconstrain1_OBJECTS)
+nnc_unconstrain1_LDADD = $(LDADD)
+nnc_unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_unconstrain1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nnc_universe1_OBJECTS = nnc_universe1-universe1.$(OBJEXT)
+nnc_universe1_OBJECTS = $(am_nnc_universe1_OBJECTS)
+nnc_universe1_LDADD = $(LDADD)
+nnc_universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_universe1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_universe1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+	-o $@
+am_nnc_wrap1_OBJECTS = nnc_wrap1-wrap1.$(OBJEXT)
+nnc_wrap1_OBJECTS = $(am_nnc_wrap1_OBJECTS)
+nnc_wrap1_LDADD = $(LDADD)
+nnc_wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_wrap1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_wrap1_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_wrap2_OBJECTS = nnc_wrap2-wrap2.$(OBJEXT)
+nnc_wrap2_OBJECTS = $(am_nnc_wrap2_OBJECTS)
+nnc_wrap2_LDADD = $(LDADD)
+nnc_wrap2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_wrap2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(nnc_wrap2_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_nnc_writepolyhedron1_OBJECTS =  \
+	nnc_writepolyhedron1-writepolyhedron1.$(OBJEXT)
+nnc_writepolyhedron1_OBJECTS = $(am_nnc_writepolyhedron1_OBJECTS)
+nnc_writepolyhedron1_LDADD = $(LDADD)
+nnc_writepolyhedron1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+nnc_writepolyhedron1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
+	$(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_nncminimize1_OBJECTS = nncminimize1.$(OBJEXT)
+nncminimize1_OBJECTS = $(am_nncminimize1_OBJECTS)
+nncminimize1_LDADD = $(LDADD)
+nncminimize1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nncminimize2_OBJECTS = nncminimize2.$(OBJEXT)
+nncminimize2_OBJECTS = $(am_nncminimize2_OBJECTS)
+nncminimize2_LDADD = $(LDADD)
+nncminimize2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_nncpostimeelapse1_OBJECTS = nncpostimeelapse1.$(OBJEXT)
+nncpostimeelapse1_OBJECTS = $(am_nncpostimeelapse1_OBJECTS)
+nncpostimeelapse1_LDADD = $(LDADD)
+nncpostimeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_numberinput1_OBJECTS = numberinput1.$(OBJEXT)
+numberinput1_OBJECTS = $(am_numberinput1_OBJECTS)
+numberinput1_LDADD = $(LDADD)
+numberinput1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_onepoint_OBJECTS = onepoint.$(OBJEXT)
+onepoint_OBJECTS = $(am_onepoint_OBJECTS)
+onepoint_LDADD = $(LDADD)
+onepoint_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_permute_OBJECTS = permute.$(OBJEXT)
+permute_OBJECTS = $(am_permute_OBJECTS)
+permute_LDADD = $(LDADD)
+permute_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polydifference1_OBJECTS = polydifference1.$(OBJEXT)
+polydifference1_OBJECTS = $(am_polydifference1_OBJECTS)
+polydifference1_LDADD = $(LDADD)
+polydifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polydifference2_OBJECTS = polydifference2.$(OBJEXT)
+polydifference2_OBJECTS = $(am_polydifference2_OBJECTS)
+polydifference2_LDADD = $(LDADD)
+polydifference2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhull1_OBJECTS = polyhull1.$(OBJEXT)
+polyhull1_OBJECTS = $(am_polyhull1_OBJECTS)
+polyhull1_LDADD = $(LDADD)
+polyhull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhull2_OBJECTS = polyhull2.$(OBJEXT)
+polyhull2_OBJECTS = $(am_polyhull2_OBJECTS)
+polyhull2_LDADD = $(LDADD)
+polyhull2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhullifexact1_OBJECTS = polyhullifexact1.$(OBJEXT)
+polyhullifexact1_OBJECTS = $(am_polyhullifexact1_OBJECTS)
+polyhullifexact1_LDADD = $(LDADD)
+polyhullifexact1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_polyhullifexact2_OBJECTS = polyhullifexact2.$(OBJEXT)
+polyhullifexact2_OBJECTS = $(am_polyhullifexact2_OBJECTS)
+polyhullifexact2_LDADD = $(LDADD)
+polyhullifexact2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_randphull1_OBJECTS = randphull1.$(OBJEXT)
+randphull1_OBJECTS = $(am_randphull1_OBJECTS)
+randphull1_LDADD = $(LDADD)
+randphull1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruence1_OBJECTS = refinewithcongruence1.$(OBJEXT)
+refinewithcongruence1_OBJECTS = $(am_refinewithcongruence1_OBJECTS)
+refinewithcongruence1_LDADD = $(LDADD)
+refinewithcongruence1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithcongruences1_OBJECTS = refinewithcongruences1.$(OBJEXT)
+refinewithcongruences1_OBJECTS = $(am_refinewithcongruences1_OBJECTS)
+refinewithcongruences1_LDADD = $(LDADD)
+refinewithcongruences1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraint1_OBJECTS = refinewithconstraint1.$(OBJEXT)
+refinewithconstraint1_OBJECTS = $(am_refinewithconstraint1_OBJECTS)
+refinewithconstraint1_LDADD = $(LDADD)
+refinewithconstraint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewithconstraints1_OBJECTS = refinewithconstraints1.$(OBJEXT)
+refinewithconstraints1_OBJECTS = $(am_refinewithconstraints1_OBJECTS)
+refinewithconstraints1_LDADD = $(LDADD)
+refinewithconstraints1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations1_OBJECTS = relations1.$(OBJEXT)
+relations1_OBJECTS = $(am_relations1_OBJECTS)
+relations1_LDADD = $(LDADD)
+relations1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations2_OBJECTS = relations2.$(OBJEXT)
+relations2_OBJECTS = $(am_relations2_OBJECTS)
+relations2_LDADD = $(LDADD)
+relations2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relations3_OBJECTS = relations3.$(OBJEXT)
+relations3_OBJECTS = $(am_relations3_OBJECTS)
+relations3_LDADD = $(LDADD)
+relations3_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims1_OBJECTS = removespacedims1.$(OBJEXT)
+removespacedims1_OBJECTS = $(am_removespacedims1_OBJECTS)
+removespacedims1_LDADD = $(LDADD)
+removespacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_removespacedims2_OBJECTS = removespacedims2.$(OBJEXT)
+removespacedims2_OBJECTS = $(am_removespacedims2_OBJECTS)
+removespacedims2_LDADD = $(LDADD)
+removespacedims2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_smm1_OBJECTS = smm1.$(OBJEXT)
+smm1_OBJECTS = $(am_smm1_OBJECTS)
+smm1_LDADD = $(LDADD)
+smm1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_sparserow1_OBJECTS = sparserow1.$(OBJEXT)
+sparserow1_OBJECTS = $(am_sparserow1_OBJECTS)
+sparserow1_LDADD = $(LDADD)
+sparserow1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_termination1_OBJECTS = termination1.$(OBJEXT)
+termination1_OBJECTS = $(am_termination1_OBJECTS)
+termination1_LDADD = $(LDADD)
+termination1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_termination2_OBJECTS = termination2.$(OBJEXT)
+termination2_OBJECTS = $(am_termination2_OBJECTS)
+termination2_LDADD = $(LDADD)
+termination2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse1_OBJECTS = timeelapse1.$(OBJEXT)
+timeelapse1_OBJECTS = $(am_timeelapse1_OBJECTS)
+timeelapse1_LDADD = $(LDADD)
+timeelapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_timeelapse2_OBJECTS = timeelapse2.$(OBJEXT)
+timeelapse2_OBJECTS = $(am_timeelapse2_OBJECTS)
+timeelapse2_LDADD = $(LDADD)
+timeelapse2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosed1_OBJECTS = topclosed1.$(OBJEXT)
+topclosed1_OBJECTS = $(am_topclosed1_OBJECTS)
+topclosed1_LDADD = $(LDADD)
+topclosed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_topclosure1_OBJECTS = topclosure1.$(OBJEXT)
+topclosure1_OBJECTS = $(am_topclosure1_OBJECTS)
+topclosure1_LDADD = $(LDADD)
+topclosure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_unconstrain1_OBJECTS = unconstrain1.$(OBJEXT)
+unconstrain1_OBJECTS = $(am_unconstrain1_OBJECTS)
+unconstrain1_LDADD = $(LDADD)
+unconstrain1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe2_OBJECTS = universe2.$(OBJEXT)
+universe2_OBJECTS = $(am_universe2_OBJECTS)
+universe2_LDADD = $(LDADD)
+universe2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_variablesset1_OBJECTS = variablesset1.$(OBJEXT)
+variablesset1_OBJECTS = $(am_variablesset1_OBJECTS)
+variablesset1_LDADD = $(LDADD)
+variablesset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_watchdog1_OBJECTS = watchdog1.$(OBJEXT)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+watchdog1_LDADD = $(LDADD)
+watchdog1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_weightwatch1_OBJECTS = weightwatch1.$(OBJEXT)
+weightwatch1_OBJECTS = $(am_weightwatch1_OBJECTS)
+weightwatch1_LDADD = $(LDADD)
+weightwatch1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_wrap1_OBJECTS = wrap1.$(OBJEXT)
+wrap1_OBJECTS = $(am_wrap1_OBJECTS)
+wrap1_LDADD = $(LDADD)
+wrap1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_wrap2_OBJECTS = wrap2.$(OBJEXT)
+wrap2_OBJECTS = $(am_wrap2_OBJECTS)
+wrap2_LDADD = $(LDADD)
+wrap2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writeconsys1_OBJECTS = writeconsys1.$(OBJEXT)
+writeconsys1_OBJECTS = $(am_writeconsys1_OBJECTS)
+writeconsys1_LDADD = $(LDADD)
+writeconsys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writegensys1_OBJECTS = writegensys1.$(OBJEXT)
+writegensys1_OBJECTS = $(am_writegensys1_OBJECTS)
+writegensys1_LDADD = $(LDADD)
+writegensys1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writepolyhedron1_OBJECTS = writepolyhedron1.$(OBJEXT)
+writepolyhedron1_OBJECTS = $(am_writepolyhedron1_OBJECTS)
+writepolyhedron1_LDADD = $(LDADD)
+writepolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writepolyhedron2_OBJECTS = writepolyhedron2.$(OBJEXT)
+writepolyhedron2_OBJECTS = $(am_writepolyhedron2_OBJECTS)
+writepolyhedron2_LDADD = $(LDADD)
+writepolyhedron2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writerelation1_OBJECTS = writerelation1.$(OBJEXT)
+writerelation1_OBJECTS = $(am_writerelation1_OBJECTS)
+writerelation1_LDADD = $(LDADD)
+writerelation1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_writevariable1_OBJECTS = writevariable1.$(OBJEXT)
+writevariable1_OBJECTS = $(am_writevariable1_OBJECTS)
+writevariable1_LDADD = $(LDADD)
+writevariable1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
+	$(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \
+	$(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \
+	$(addspacedims2_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \
+	$(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bgp99extrapolation2_SOURCES) $(bhrz03widening1_SOURCES) \
+	$(bhrz03widening2_SOURCES) $(bhrz03widening3_SOURCES) \
+	$(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) \
+	$(boundedbhrz03extrapolation1_SOURCES) \
+	$(boundedh79extrapolation1_SOURCES) $(bounds1_SOURCES) \
+	$(cnncconversion1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(contains2_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+	$(dropsomenonintegerpoints1_SOURCES) \
+	$(dropsomenonintegerpoints2_SOURCES) $(dualhypercubes_SOURCES) \
+	$(empty1_SOURCES) $(equals1_SOURCES) $(exceptions1_SOURCES) \
+	$(exceptions2_SOURCES) $(exceptions3_SOURCES) \
+	$(expandspacedim1_SOURCES) $(expandspacedim2_SOURCES) \
+	$(foldspacedims1_SOURCES) $(foldspacedims2_SOURCES) \
+	$(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(frombox2_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+	$(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+	$(h79widening2_SOURCES) $(hybrid_SOURCES) \
+	$(intersection1_SOURCES) \
+	$(limitedbhrz03extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) \
+	$(linearexpression1_SOURCES) $(linearpartition1_SOURCES) \
+	$(linearsystem1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(matrix1_SOURCES) $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(mc91_SOURCES) $(membytes1_SOURCES) $(memory2_SOURCES) \
+	$(minconstraints1_SOURCES) $(minconstraints2_SOURCES) \
+	$(mingenerators1_SOURCES) $(mingenerators2_SOURCES) \
+	$(nnc_addcongruence1_SOURCES) $(nnc_addcongruences1_SOURCES) \
+	$(nnc_addconstraint1_SOURCES) $(nnc_addconstraints1_SOURCES) \
+	$(nnc_addgenerator1_SOURCES) $(nnc_addgenerators1_SOURCES) \
+	$(nnc_addspacedims1_SOURCES) $(nnc_affineimage1_SOURCES) \
+	$(nnc_affinepreimage1_SOURCES) $(nnc_affinetrans_SOURCES) \
+	$(nnc_append1_SOURCES) $(nnc_append2_SOURCES) \
+	$(nnc_ascii_dump_load1_SOURCES) \
+	$(nnc_ascii_dump_load2_SOURCES) \
+	$(nnc_bgp99extrapolation1_SOURCES) \
+	$(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \
+	$(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
+	$(nnc_boundedaffinepreimage1_SOURCES) \
+	$(nnc_boundedbhrz03extrapolation1_SOURCES) \
+	$(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \
+	$(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \
+	$(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \
+	$(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \
+	$(nnc_disjoint1_SOURCES) \
+	$(nnc_dropsomenonintegerpoints1_SOURCES) $(nnc_empty1_SOURCES) \
+	$(nnc_equals1_SOURCES) $(nnc_exceptions1_SOURCES) \
+	$(nnc_exceptions3_SOURCES) $(nnc_expandspacedim1_SOURCES) \
+	$(nnc_foldspacedims1_SOURCES) $(nnc_frombdshape1_SOURCES) \
+	$(nnc_frombox1_SOURCES) $(nnc_fromgrid1_SOURCES) \
+	$(nnc_fromoctagonalshape1_SOURCES) \
+	$(nnc_generalizedaffineimage1_SOURCES) \
+	$(nnc_generalizedaffinepreimage1_SOURCES) \
+	$(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
+	$(nnc_h79widening1_SOURCES) $(nnc_intersection1_SOURCES) \
+	$(nnc_limitedbhrz03extrapolation1_SOURCES) \
+	$(nnc_limitedh79extrapolation1_SOURCES) \
+	$(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
+	$(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
+	$(nnc_membytes1_SOURCES) $(nnc_minconstraints1_SOURCES) \
+	$(nnc_mingenerators1_SOURCES) $(nnc_onepoint_SOURCES) \
+	$(nnc_permute_SOURCES) $(nnc_polydifference1_SOURCES) \
+	$(nnc_polyhull1_SOURCES) $(nnc_polyhullifexact1_SOURCES) \
+	$(nnc_randphull1_SOURCES) $(nnc_relations1_SOURCES) \
+	$(nnc_relations2_SOURCES) $(nnc_removespacedims1_SOURCES) \
+	$(nnc_simplifyusingcontext1_SOURCES) $(nnc_smm1_SOURCES) \
+	$(nnc_timeelapse1_SOURCES) $(nnc_unconstrain1_SOURCES) \
+	$(nnc_universe1_SOURCES) $(nnc_wrap1_SOURCES) \
+	$(nnc_wrap2_SOURCES) $(nnc_writepolyhedron1_SOURCES) \
+	$(nncminimize1_SOURCES) $(nncminimize2_SOURCES) \
+	$(nncpostimeelapse1_SOURCES) $(numberinput1_SOURCES) \
+	$(onepoint_SOURCES) $(permute_SOURCES) \
+	$(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+	$(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+	$(polyhullifexact1_SOURCES) $(polyhullifexact2_SOURCES) \
+	$(randphull1_SOURCES) $(refinewithcongruence1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(smm1_SOURCES) \
+	$(sparserow1_SOURCES) $(termination1_SOURCES) \
+	$(termination2_SOURCES) $(timeelapse1_SOURCES) \
+	$(timeelapse2_SOURCES) $(topclosed1_SOURCES) \
+	$(topclosure1_SOURCES) $(unconstrain1_SOURCES) \
+	$(universe1_SOURCES) $(universe2_SOURCES) \
+	$(variablesset1_SOURCES) $(watchdog1_SOURCES) \
+	$(weightwatch1_SOURCES) $(wrap1_SOURCES) $(wrap2_SOURCES) \
+	$(writeconsys1_SOURCES) $(writegensys1_SOURCES) \
+	$(writepolyhedron1_SOURCES) $(writepolyhedron2_SOURCES) \
+	$(writerelation1_SOURCES) $(writevariable1_SOURCES)
+DIST_SOURCES = $(addcongruence1_SOURCES) $(addcongruences1_SOURCES) \
+	$(addconstraint1_SOURCES) $(addconstraints1_SOURCES) \
+	$(addconstraints2_SOURCES) $(addgenerator1_SOURCES) \
+	$(addgenerator2_SOURCES) $(addgenerators1_SOURCES) \
+	$(addgenerators2_SOURCES) $(addspacedims1_SOURCES) \
+	$(addspacedims2_SOURCES) $(affineimage1_SOURCES) \
+	$(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+	$(affinetrans_SOURCES) $(append1_SOURCES) $(append2_SOURCES) \
+	$(ascii_dump_load1_SOURCES) $(ascii_dump_load2_SOURCES) \
+	$(ascii_dump_load3_SOURCES) $(bgp99extrapolation1_SOURCES) \
+	$(bgp99extrapolation2_SOURCES) $(bhrz03widening1_SOURCES) \
+	$(bhrz03widening2_SOURCES) $(bhrz03widening3_SOURCES) \
+	$(bhz03widening1_SOURCES) $(bounded1_SOURCES) \
+	$(boundedaffineimage1_SOURCES) \
+	$(boundedaffinepreimage1_SOURCES) \
+	$(boundedbhrz03extrapolation1_SOURCES) \
+	$(boundedh79extrapolation1_SOURCES) $(bounds1_SOURCES) \
+	$(cnncconversion1_SOURCES) $(concatenate1_SOURCES) \
+	$(congruences1_SOURCES) $(constrains1_SOURCES) \
+	$(constraints1_SOURCES) $(contains1_SOURCES) \
+	$(contains2_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+	$(dropsomenonintegerpoints1_SOURCES) \
+	$(dropsomenonintegerpoints2_SOURCES) $(dualhypercubes_SOURCES) \
+	$(empty1_SOURCES) $(equals1_SOURCES) $(exceptions1_SOURCES) \
+	$(exceptions2_SOURCES) $(exceptions3_SOURCES) \
+	$(expandspacedim1_SOURCES) $(expandspacedim2_SOURCES) \
+	$(foldspacedims1_SOURCES) $(foldspacedims2_SOURCES) \
+	$(frequency1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(frombox2_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) \
+	$(generalizedaffineimage1_SOURCES) \
+	$(generalizedaffineimage2_SOURCES) \
+	$(generalizedaffinepreimage1_SOURCES) \
+	$(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+	$(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+	$(h79widening2_SOURCES) $(hybrid_SOURCES) \
+	$(intersection1_SOURCES) \
+	$(limitedbhrz03extrapolation1_SOURCES) \
+	$(limitedh79extrapolation1_SOURCES) \
+	$(linearexpression1_SOURCES) $(linearpartition1_SOURCES) \
+	$(linearsystem1_SOURCES) $(mapspacedims1_SOURCES) \
+	$(matrix1_SOURCES) $(max_min1_SOURCES) $(maxspacedim1_SOURCES) \
+	$(mc91_SOURCES) $(membytes1_SOURCES) $(memory2_SOURCES) \
+	$(minconstraints1_SOURCES) $(minconstraints2_SOURCES) \
+	$(mingenerators1_SOURCES) $(mingenerators2_SOURCES) \
+	$(nnc_addcongruence1_SOURCES) $(nnc_addcongruences1_SOURCES) \
+	$(nnc_addconstraint1_SOURCES) $(nnc_addconstraints1_SOURCES) \
+	$(nnc_addgenerator1_SOURCES) $(nnc_addgenerators1_SOURCES) \
+	$(nnc_addspacedims1_SOURCES) $(nnc_affineimage1_SOURCES) \
+	$(nnc_affinepreimage1_SOURCES) $(nnc_affinetrans_SOURCES) \
+	$(nnc_append1_SOURCES) $(nnc_append2_SOURCES) \
+	$(nnc_ascii_dump_load1_SOURCES) \
+	$(nnc_ascii_dump_load2_SOURCES) \
+	$(nnc_bgp99extrapolation1_SOURCES) \
+	$(nnc_bhrz03widening1_SOURCES) $(nnc_bhrz03widening2_SOURCES) \
+	$(nnc_bounded1_SOURCES) $(nnc_boundedaffineimage1_SOURCES) \
+	$(nnc_boundedaffinepreimage1_SOURCES) \
+	$(nnc_boundedbhrz03extrapolation1_SOURCES) \
+	$(nnc_boundedh79extrapolation1_SOURCES) $(nnc_bounds1_SOURCES) \
+	$(nnc_concatenate1_SOURCES) $(nnc_congruences1_SOURCES) \
+	$(nnc_constrains1_SOURCES) $(nnc_constraints1_SOURCES) \
+	$(nnc_contains1_SOURCES) $(nnc_containsintegerpoint1_SOURCES) \
+	$(nnc_disjoint1_SOURCES) \
+	$(nnc_dropsomenonintegerpoints1_SOURCES) $(nnc_empty1_SOURCES) \
+	$(nnc_equals1_SOURCES) $(nnc_exceptions1_SOURCES) \
+	$(nnc_exceptions3_SOURCES) $(nnc_expandspacedim1_SOURCES) \
+	$(nnc_foldspacedims1_SOURCES) $(nnc_frombdshape1_SOURCES) \
+	$(nnc_frombox1_SOURCES) $(nnc_fromgrid1_SOURCES) \
+	$(nnc_fromoctagonalshape1_SOURCES) \
+	$(nnc_generalizedaffineimage1_SOURCES) \
+	$(nnc_generalizedaffinepreimage1_SOURCES) \
+	$(nnc_generators1_SOURCES) $(nnc_geomcovers1_SOURCES) \
+	$(nnc_h79widening1_SOURCES) $(nnc_intersection1_SOURCES) \
+	$(nnc_limitedbhrz03extrapolation1_SOURCES) \
+	$(nnc_limitedh79extrapolation1_SOURCES) \
+	$(nnc_linearpartition1_SOURCES) $(nnc_mapspacedims1_SOURCES) \
+	$(nnc_max_min1_SOURCES) $(nnc_mc91_SOURCES) \
+	$(nnc_membytes1_SOURCES) $(nnc_minconstraints1_SOURCES) \
+	$(nnc_mingenerators1_SOURCES) $(nnc_onepoint_SOURCES) \
+	$(nnc_permute_SOURCES) $(nnc_polydifference1_SOURCES) \
+	$(nnc_polyhull1_SOURCES) $(nnc_polyhullifexact1_SOURCES) \
+	$(nnc_randphull1_SOURCES) $(nnc_relations1_SOURCES) \
+	$(nnc_relations2_SOURCES) $(nnc_removespacedims1_SOURCES) \
+	$(nnc_simplifyusingcontext1_SOURCES) $(nnc_smm1_SOURCES) \
+	$(nnc_timeelapse1_SOURCES) $(nnc_unconstrain1_SOURCES) \
+	$(nnc_universe1_SOURCES) $(nnc_wrap1_SOURCES) \
+	$(nnc_wrap2_SOURCES) $(nnc_writepolyhedron1_SOURCES) \
+	$(nncminimize1_SOURCES) $(nncminimize2_SOURCES) \
+	$(nncpostimeelapse1_SOURCES) $(numberinput1_SOURCES) \
+	$(onepoint_SOURCES) $(permute_SOURCES) \
+	$(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+	$(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+	$(polyhullifexact1_SOURCES) $(polyhullifexact2_SOURCES) \
+	$(randphull1_SOURCES) $(refinewithcongruence1_SOURCES) \
+	$(refinewithcongruences1_SOURCES) \
+	$(refinewithconstraint1_SOURCES) \
+	$(refinewithconstraints1_SOURCES) $(relations1_SOURCES) \
+	$(relations2_SOURCES) $(relations3_SOURCES) \
+	$(removespacedims1_SOURCES) $(removespacedims2_SOURCES) \
+	$(simplifyusingcontext1_SOURCES) $(smm1_SOURCES) \
+	$(sparserow1_SOURCES) $(termination1_SOURCES) \
+	$(termination2_SOURCES) $(timeelapse1_SOURCES) \
+	$(timeelapse2_SOURCES) $(topclosed1_SOURCES) \
+	$(topclosure1_SOURCES) $(unconstrain1_SOURCES) \
+	$(universe1_SOURCES) $(universe2_SOURCES) \
+	$(variablesset1_SOURCES) $(watchdog1_SOURCES) \
+	$(weightwatch1_SOURCES) $(wrap1_SOURCES) $(wrap2_SOURCES) \
+	$(writeconsys1_SOURCES) $(writegensys1_SOURCES) \
+	$(writepolyhedron1_SOURCES) $(writepolyhedron2_SOURCES) \
+	$(writerelation1_SOURCES) $(writevariable1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/utils \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+ORIGINAL_TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 addconstraints2 \
+addgenerator1 addgenerator2 \
+addgenerators1 addgenerators2 \
+addspacedims1 addspacedims2 \
+affineimage1 affineimage2 \
+affinepreimage1 \
+affinetrans \
+append1 append2 \
+ascii_dump_load1 ascii_dump_load2 ascii_dump_load3 \
+bgp99extrapolation1 bgp99extrapolation2 \
+bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+bhz03widening1 \
+bounded1 \
+boundedaffineimage1 \
+boundedaffinepreimage1 \
+boundedbhrz03extrapolation1 \
+boundedh79extrapolation1 \
+bounds1 \
+cnncconversion1 \
+concatenate1 \
+congruences1 \
+constrains1 \
+constraints1 \
+contains1 contains2 \
+containsintegerpoint1 \
+disjoint1 disjoint2 \
+dropsomenonintegerpoints1 dropsomenonintegerpoints2 \
+dualhypercubes \
+empty1 \
+equals1 \
+exceptions1 exceptions2  exceptions3 \
+expandspacedim1 expandspacedim2 \
+foldspacedims1 foldspacedims2 \
+frequency1 \
+frombdshape1 \
+frombox1 frombox2 \
+fromgrid1 \
+fromoctagonalshape1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generators1 \
+geomcovers1 \
+h79widening1 h79widening2 \
+hybrid \
+intersection1 \
+limitedbhrz03extrapolation1 \
+limitedh79extrapolation1 \
+linearexpression1 \
+linearpartition1 \
+linearsystem1 \
+mapspacedims1 \
+matrix1 \
+max_min1 \
+maxspacedim1 \
+mc91 \
+membytes1 \
+memory2 \
+minconstraints1 minconstraints2 \
+mingenerators1 mingenerators2 \
+nncminimize1 nncminimize2 \
+nncpostimeelapse1 \
+numberinput1 \
+onepoint \
+permute \
+polydifference1 polydifference2 \
+polyhull1 polyhull2 \
+polyhullifexact1 polyhullifexact2 \
+randphull1 \
+refinewithcongruence1 \
+refinewithcongruences1 \
+refinewithconstraint1 \
+refinewithconstraints1 \
+relations1 relations2 relations3 \
+removespacedims1 removespacedims2 \
+simplifyusingcontext1 \
+smm1 \
+sparserow1 \
+termination1 termination2 \
+timeelapse1 timeelapse2 \
+topclosed1 \
+topclosure1 \
+unconstrain1 \
+universe1 universe2 \
+variablesset1 \
+watchdog1 \
+weightwatch1 \
+wrap1 wrap2 \
+writeconsys1 \
+writegensys1 \
+writepolyhedron1 writepolyhedron2 \
+writerelation1 \
+writevariable1
+
+DERIVED_TESTS = \
+nnc_addcongruence1 \
+nnc_addcongruences1 \
+nnc_addconstraint1 \
+nnc_addconstraints1 \
+nnc_addgenerator1 \
+nnc_addgenerators1 \
+nnc_addspacedims1 \
+nnc_affineimage1 \
+nnc_affinepreimage1 \
+nnc_affinetrans \
+nnc_append1 nnc_append2 \
+nnc_ascii_dump_load1 nnc_ascii_dump_load2 \
+nnc_bgp99extrapolation1 \
+nnc_bhrz03widening1 nnc_bhrz03widening2 \
+nnc_bounded1 \
+nnc_boundedaffineimage1 \
+nnc_boundedaffinepreimage1 \
+nnc_boundedbhrz03extrapolation1 \
+nnc_boundedh79extrapolation1 \
+nnc_bounds1 \
+nnc_concatenate1 \
+nnc_congruences1 \
+nnc_constrains1 \
+nnc_constraints1 \
+nnc_contains1 \
+nnc_containsintegerpoint1 \
+nnc_disjoint1 \
+nnc_dropsomenonintegerpoints1 \
+nnc_empty1 \
+nnc_equals1 \
+nnc_exceptions1 nnc_exceptions3 \
+nnc_expandspacedim1 \
+nnc_foldspacedims1 \
+nnc_frombdshape1 \
+nnc_frombox1 \
+nnc_fromgrid1 \
+nnc_fromoctagonalshape1 \
+nnc_generalizedaffineimage1 \
+nnc_generalizedaffinepreimage1 \
+nnc_generators1 \
+nnc_geomcovers1 \
+nnc_h79widening1 \
+nnc_intersection1 \
+nnc_simplifyusingcontext1 \
+nnc_limitedbhrz03extrapolation1 \
+nnc_limitedh79extrapolation1 \
+nnc_linearpartition1 \
+nnc_mapspacedims1 \
+nnc_max_min1 \
+nnc_mc91 \
+nnc_membytes1 \
+nnc_minconstraints1 \
+nnc_mingenerators1 \
+nnc_onepoint \
+nnc_permute \
+nnc_polydifference1 \
+nnc_polyhull1 \
+nnc_polyhullifexact1 \
+nnc_randphull1 \
+nnc_relations1 nnc_relations2 \
+nnc_removespacedims1 \
+nnc_smm1 \
+nnc_timeelapse1 \
+nnc_unconstrain1 \
+nnc_universe1 \
+nnc_wrap1 nnc_wrap2 \
+nnc_writepolyhedron1
+
+
+#
+# Sources for the tests
+#
+addcongruence1_SOURCES = addcongruence1.cc
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraint1_SOURCES = addconstraint1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+addconstraints2_SOURCES = addconstraints2.cc
+addgenerator1_SOURCES = addgenerator1.cc
+addgenerator2_SOURCES = addgenerator2.cc
+addgenerators1_SOURCES = addgenerators1.cc
+addgenerators2_SOURCES = addgenerators2.cc
+addspacedims1_SOURCES = addspacedims1.cc
+addspacedims2_SOURCES = addspacedims2.cc
+affineimage1_SOURCES = affineimage1.cc
+affineimage2_SOURCES = affineimage2.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+affinetrans_SOURCES = affinetrans.cc
+append1_SOURCES = append1.cc
+append2_SOURCES = append2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+ascii_dump_load3_SOURCES = ascii_dump_load3.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bgp99extrapolation2_SOURCES = bgp99extrapolation2.cc
+bhrz03widening1_SOURCES = bhrz03widening1.cc
+bhrz03widening2_SOURCES = bhrz03widening2.cc
+bhrz03widening3_SOURCES = bhrz03widening3.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+bounds1_SOURCES = bounds1.cc
+cnncconversion1_SOURCES = cnncconversion1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constrains1_SOURCES = constrains1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.cc
+dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+dropsomenonintegerpoints2_SOURCES = dropsomenonintegerpoints2.cc
+dualhypercubes_SOURCES = dualhypercubes.cc
+empty1_SOURCES = empty1.cc
+equals1_SOURCES = equals1.cc
+exceptions1_SOURCES = exceptions1.cc
+exceptions2_SOURCES = exceptions2.cc
+exceptions3_SOURCES = exceptions3.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+expandspacedim2_SOURCES = expandspacedim2.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+foldspacedims2_SOURCES = foldspacedims2.cc
+frequency1_SOURCES = frequency1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+frombox2_SOURCES = frombox2.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generators1_SOURCES = generators1.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+h79widening2_SOURCES = h79widening2.cc
+hybrid_SOURCES = hybrid.cc
+intersection1_SOURCES = intersection1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+linearpartition1_SOURCES = linearpartition1.cc
+linearexpression1_SOURCES = linearexpression1.cc
+linearsystem1_SOURCES = linearsystem1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+matrix1_SOURCES = matrix1.cc
+max_min1_SOURCES = max_min1.cc
+maxspacedim1_SOURCES = maxspacedim1.cc
+mc91_SOURCES = mc91.cc
+membytes1_SOURCES = membytes1.cc
+memory2_SOURCES = memory2.cc
+minconstraints1_SOURCES = minconstraints1.cc
+minconstraints2_SOURCES = minconstraints2.cc
+mingenerators1_SOURCES = mingenerators1.cc
+mingenerators2_SOURCES = mingenerators2.cc
+numberinput1_SOURCES = numberinput1.cc
+nncminimize1_SOURCES = nncminimize1.cc
+nncminimize2_SOURCES = nncminimize2.cc
+nncpostimeelapse1_SOURCES = nncpostimeelapse1.cc
+onepoint_SOURCES = onepoint.cc
+permute_SOURCES = permute.cc
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+polyhullifexact1_SOURCES = polyhullifexact1.cc
+polyhullifexact2_SOURCES = polyhullifexact2.cc
+randphull1_SOURCES = randphull1.cc
+refinewithconstraint1_SOURCES = refinewithconstraint1.cc
+refinewithconstraints1_SOURCES = refinewithconstraints1.cc
+refinewithcongruence1_SOURCES = refinewithcongruence1.cc
+refinewithcongruences1_SOURCES = refinewithcongruences1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+smm1_SOURCES = smm1.cc
+sparserow1_SOURCES = sparserow1.cc
+termination1_SOURCES = termination1.cc
+termination2_SOURCES = termination2.cc
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+unconstrain1_SOURCES = unconstrain1.cc
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.cc
+variablesset1_SOURCES = variablesset1.cc
+watchdog1_SOURCES = watchdog1.cc
+weightwatch1_SOURCES = weightwatch1.cc
+wrap1_SOURCES = wrap1.cc
+wrap2_SOURCES = wrap2.cc
+writeconsys1_SOURCES = writeconsys1.cc
+writegensys1_SOURCES = writegensys1.cc
+writepolyhedron1_SOURCES = writepolyhedron1.cc
+writepolyhedron2_SOURCES = writepolyhedron2.cc
+writerelation1_SOURCES = writerelation1.cc
+writevariable1_SOURCES = writevariable1.cc
+
+#
+# Sources and compilation flags for the derived check programs
+#
+DERIVED_CXXFLAGS = -DDERIVED_TEST $(AM_CXXFLAGS)
+nnc_addcongruence1_SOURCES = addcongruence1.cc
+nnc_addcongruence1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addcongruences1_SOURCES = addcongruences1.cc
+nnc_addcongruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addconstraint1_SOURCES = addconstraint1.cc
+nnc_addconstraint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addconstraints1_SOURCES = addconstraints1.cc
+nnc_addconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addgenerator1_SOURCES = addgenerator1.cc
+nnc_addgenerator1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addgenerators1_SOURCES = addgenerators1.cc
+nnc_addgenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_addspacedims1_SOURCES = addspacedims1.cc
+nnc_addspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affineimage1_SOURCES = affineimage1.cc
+nnc_affineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affinepreimage1_SOURCES = affinepreimage1.cc
+nnc_affinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_affinetrans_SOURCES = affinetrans.cc
+nnc_affinetrans_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append1_SOURCES = append1.cc
+nnc_append1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_append2_SOURCES = append2.cc
+nnc_append2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+nnc_ascii_dump_load1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_ascii_dump_load2_SOURCES = ascii_dump_load2.cc
+nnc_ascii_dump_load2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+nnc_bgp99extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening1_SOURCES = bhrz03widening1.cc
+nnc_bhrz03widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bhrz03widening2_SOURCES = bhrz03widening2.cc
+nnc_bhrz03widening2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bounded1_SOURCES = bounded1.cc
+nnc_bounded1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedaffineimage1_SOURCES = boundedaffineimage1.cc
+nnc_boundedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedaffinepreimage1_SOURCES = boundedaffinepreimage1.cc
+nnc_boundedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedbhrz03extrapolation1_SOURCES = boundedbhrz03extrapolation1.cc
+nnc_boundedvhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundedh79extrapolation1_SOURCES = boundedh79extrapolation1.cc
+nnc_boundedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_bounds1_SOURCES = bounds1.cc
+nnc_bounds1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_concatenate1_SOURCES = concatenate1.cc
+nnc_concatenate1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_congruences1_SOURCES = congruences1.cc
+nnc_congruences1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_constrains1_SOURCES = constrains1.cc
+nnc_constrains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+nnc_containsintegerpoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_dropsomenonintegerpoints1_SOURCES = dropsomenonintegerpoints1.cc
+nnc_dropsomenonintegerpoints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_empty1_SOURCES = empty1.cc
+nnc_empty1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_equals1_SOURCES = equals1.cc
+nnc_equals1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions1_SOURCES = exceptions1.cc
+nnc_exceptions1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_exceptions3_SOURCES = exceptions3.cc
+nnc_exceptions3_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_expandspacedim1_SOURCES = expandspacedim1.cc
+nnc_expandspacedim1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_foldspacedims1_SOURCES = foldspacedims1.cc
+nnc_foldspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_frombdshape1_SOURCES = frombdshape1.cc
+nnc_frombdshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_frombox1_SOURCES = frombox1.cc
+nnc_frombox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_fromgrid1_SOURCES = fromgrid1.cc
+nnc_fromgrid1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+nnc_fromoctagonalshape1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+nnc_generalizedaffineimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+nnc_generalizedaffinepreimage1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_generators1_SOURCES = generators1.cc
+nnc_generators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_geomcovers1_SOURCES = geomcovers1.cc
+nnc_geomcovers1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_h79widening1_SOURCES = h79widening1.cc
+nnc_h79widening1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_intersection1_SOURCES = intersection1.cc
+nnc_intersection1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+nnc_simplifyusingcontext1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+nnc_limitedbhrz03extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+nnc_limitedh79extrapolation1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_linearpartition1_SOURCES = linearpartition1.cc
+nnc_linearpartition1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mapspacedims1_SOURCES = mapspacedims1.cc
+nnc_mapspacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_max_min1_SOURCES = max_min1.cc
+nnc_max_min1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mc91_SOURCES = mc91.cc
+nnc_mc91_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_membytes1_SOURCES = membytes1.cc
+nnc_membytes1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_minconstraints1_SOURCES = minconstraints1.cc
+nnc_minconstraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_mingenerators1_SOURCES = mingenerators1.cc
+nnc_mingenerators1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_onepoint_SOURCES = onepoint.cc
+nnc_onepoint_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_permute_SOURCES = permute.cc
+nnc_permute_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polydifference1_SOURCES = polydifference1.cc
+nnc_polydifference1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polyhull1_SOURCES = polyhull1.cc
+nnc_polyhull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_polyhullifexact1_SOURCES = polyhullifexact1.cc
+nnc_polyhullifexact1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations1_SOURCES = relations1.cc
+nnc_relations1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_relations2_SOURCES = relations2.cc
+nnc_relations2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_removespacedims1_SOURCES = removespacedims1.cc
+nnc_removespacedims1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_smm1_SOURCES = smm1.cc
+nnc_smm1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_timeelapse1_SOURCES = timeelapse1.cc
+nnc_timeelapse1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_unconstrain1_SOURCES = unconstrain1.cc
+nnc_unconstrain1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_wrap1_SOURCES = wrap1.cc
+nnc_wrap1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_wrap2_SOURCES = wrap2.cc
+nnc_wrap2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+#
+# Sources for the special tests.
+#
+memory1_SRCS = memory1.cc
+EXTRA_DIST = $(memory1_SRCS)
+BUGS = 
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+densematrix1.dat \
+linearsystem1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writevariable1.dat
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Polyhedron/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Polyhedron/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES) $(EXTRA_addcongruence1_DEPENDENCIES) 
+	@rm -f addcongruence1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES) 
+	@rm -f addcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES) $(EXTRA_addconstraint1_DEPENDENCIES) 
+	@rm -f addconstraint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+addconstraints2$(EXEEXT): $(addconstraints2_OBJECTS) $(addconstraints2_DEPENDENCIES) $(EXTRA_addconstraints2_DEPENDENCIES) 
+	@rm -f addconstraints2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS)
+
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES) $(EXTRA_addgenerator1_DEPENDENCIES) 
+	@rm -f addgenerator1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+
+addgenerator2$(EXEEXT): $(addgenerator2_OBJECTS) $(addgenerator2_DEPENDENCIES) $(EXTRA_addgenerator2_DEPENDENCIES) 
+	@rm -f addgenerator2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS)
+
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES) $(EXTRA_addgenerators1_DEPENDENCIES) 
+	@rm -f addgenerators1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+
+addgenerators2$(EXEEXT): $(addgenerators2_OBJECTS) $(addgenerators2_DEPENDENCIES) $(EXTRA_addgenerators2_DEPENDENCIES) 
+	@rm -f addgenerators2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS)
+
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES) $(EXTRA_addspacedims1_DEPENDENCIES) 
+	@rm -f addspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+
+addspacedims2$(EXEEXT): $(addspacedims2_OBJECTS) $(addspacedims2_DEPENDENCIES) $(EXTRA_addspacedims2_DEPENDENCIES) 
+	@rm -f addspacedims2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES) $(EXTRA_affineimage2_DEPENDENCIES) 
+	@rm -f affineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+affinetrans$(EXEEXT): $(affinetrans_OBJECTS) $(affinetrans_DEPENDENCIES) $(EXTRA_affinetrans_DEPENDENCIES) 
+	@rm -f affinetrans$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS)
+
+append1$(EXEEXT): $(append1_OBJECTS) $(append1_DEPENDENCIES) $(EXTRA_append1_DEPENDENCIES) 
+	@rm -f append1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(append1_OBJECTS) $(append1_LDADD) $(LIBS)
+
+append2$(EXEEXT): $(append2_OBJECTS) $(append2_DEPENDENCIES) $(EXTRA_append2_DEPENDENCIES) 
+	@rm -f append2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(append2_OBJECTS) $(append2_LDADD) $(LIBS)
+
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES) $(EXTRA_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+
+ascii_dump_load2$(EXEEXT): $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_DEPENDENCIES) $(EXTRA_ascii_dump_load2_DEPENDENCIES) 
+	@rm -f ascii_dump_load2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS)
+
+ascii_dump_load3$(EXEEXT): $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_DEPENDENCIES) $(EXTRA_ascii_dump_load3_DEPENDENCIES) 
+	@rm -f ascii_dump_load3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS)
+
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES) $(EXTRA_bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f bgp99extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+
+bgp99extrapolation2$(EXEEXT): $(bgp99extrapolation2_OBJECTS) $(bgp99extrapolation2_DEPENDENCIES) $(EXTRA_bgp99extrapolation2_DEPENDENCIES) 
+	@rm -f bgp99extrapolation2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bgp99extrapolation2_OBJECTS) $(bgp99extrapolation2_LDADD) $(LIBS)
+
+bhrz03widening1$(EXEEXT): $(bhrz03widening1_OBJECTS) $(bhrz03widening1_DEPENDENCIES) $(EXTRA_bhrz03widening1_DEPENDENCIES) 
+	@rm -f bhrz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS)
+
+bhrz03widening2$(EXEEXT): $(bhrz03widening2_OBJECTS) $(bhrz03widening2_DEPENDENCIES) $(EXTRA_bhrz03widening2_DEPENDENCIES) 
+	@rm -f bhrz03widening2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS)
+
+bhrz03widening3$(EXEEXT): $(bhrz03widening3_OBJECTS) $(bhrz03widening3_DEPENDENCIES) $(EXTRA_bhrz03widening3_DEPENDENCIES) 
+	@rm -f bhrz03widening3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS)
+
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES) $(EXTRA_bhz03widening1_DEPENDENCIES) 
+	@rm -f bhz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES) $(EXTRA_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f boundedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+
+boundedbhrz03extrapolation1$(EXEEXT): $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_boundedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f boundedbhrz03extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS)
+
+boundedh79extrapolation1$(EXEEXT): $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_DEPENDENCIES) $(EXTRA_boundedh79extrapolation1_DEPENDENCIES) 
+	@rm -f boundedh79extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+cnncconversion1$(EXEEXT): $(cnncconversion1_OBJECTS) $(cnncconversion1_DEPENDENCIES) $(EXTRA_cnncconversion1_DEPENDENCIES) 
+	@rm -f cnncconversion1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES) $(EXTRA_congruences1_DEPENDENCIES) 
+	@rm -f congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+
+constrains1$(EXEEXT): $(constrains1_OBJECTS) $(constrains1_DEPENDENCIES) $(EXTRA_constrains1_DEPENDENCIES) 
+	@rm -f constrains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constrains1_OBJECTS) $(constrains1_LDADD) $(LIBS)
+
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES) $(EXTRA_constraints1_DEPENDENCIES) 
+	@rm -f constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+contains2$(EXEEXT): $(contains2_OBJECTS) $(contains2_DEPENDENCIES) $(EXTRA_contains2_DEPENDENCIES) 
+	@rm -f contains2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+disjoint2$(EXEEXT): $(disjoint2_OBJECTS) $(disjoint2_DEPENDENCIES) $(EXTRA_disjoint2_DEPENDENCIES) 
+	@rm -f disjoint2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS)
+
+dropsomenonintegerpoints1$(EXEEXT): $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints1_DEPENDENCIES) 
+	@rm -f dropsomenonintegerpoints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints1_OBJECTS) $(dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+dropsomenonintegerpoints2$(EXEEXT): $(dropsomenonintegerpoints2_OBJECTS) $(dropsomenonintegerpoints2_DEPENDENCIES) $(EXTRA_dropsomenonintegerpoints2_DEPENDENCIES) 
+	@rm -f dropsomenonintegerpoints2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dropsomenonintegerpoints2_OBJECTS) $(dropsomenonintegerpoints2_LDADD) $(LIBS)
+
+dualhypercubes$(EXEEXT): $(dualhypercubes_OBJECTS) $(dualhypercubes_DEPENDENCIES) $(EXTRA_dualhypercubes_DEPENDENCIES) 
+	@rm -f dualhypercubes$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES) 
+	@rm -f equals1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES) $(EXTRA_exceptions1_DEPENDENCIES) 
+	@rm -f exceptions1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+
+exceptions2$(EXEEXT): $(exceptions2_OBJECTS) $(exceptions2_DEPENDENCIES) $(EXTRA_exceptions2_DEPENDENCIES) 
+	@rm -f exceptions2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS)
+
+exceptions3$(EXEEXT): $(exceptions3_OBJECTS) $(exceptions3_DEPENDENCIES) $(EXTRA_exceptions3_DEPENDENCIES) 
+	@rm -f exceptions3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS)
+
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES) $(EXTRA_expandspacedim1_DEPENDENCIES) 
+	@rm -f expandspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+
+expandspacedim2$(EXEEXT): $(expandspacedim2_OBJECTS) $(expandspacedim2_DEPENDENCIES) $(EXTRA_expandspacedim2_DEPENDENCIES) 
+	@rm -f expandspacedim2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS)
+
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES) $(EXTRA_foldspacedims1_DEPENDENCIES) 
+	@rm -f foldspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+
+foldspacedims2$(EXEEXT): $(foldspacedims2_OBJECTS) $(foldspacedims2_DEPENDENCIES) $(EXTRA_foldspacedims2_DEPENDENCIES) 
+	@rm -f foldspacedims2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS)
+
+frequency1$(EXEEXT): $(frequency1_OBJECTS) $(frequency1_DEPENDENCIES) $(EXTRA_frequency1_DEPENDENCIES) 
+	@rm -f frequency1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frequency1_OBJECTS) $(frequency1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+frombox2$(EXEEXT): $(frombox2_OBJECTS) $(frombox2_DEPENDENCIES) $(EXTRA_frombox2_DEPENDENCIES) 
+	@rm -f frombox2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox2_OBJECTS) $(frombox2_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES) $(EXTRA_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES) $(EXTRA_generalizedaffineimage2_DEPENDENCIES) 
+	@rm -f generalizedaffineimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES) $(EXTRA_generalizedaffinepreimage2_DEPENDENCIES) 
+	@rm -f generalizedaffinepreimage2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES) $(EXTRA_generators1_DEPENDENCIES) 
+	@rm -f generators1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES) $(EXTRA_geomcovers1_DEPENDENCIES) 
+	@rm -f geomcovers1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES) $(EXTRA_h79widening1_DEPENDENCIES) 
+	@rm -f h79widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+
+h79widening2$(EXEEXT): $(h79widening2_OBJECTS) $(h79widening2_DEPENDENCIES) $(EXTRA_h79widening2_DEPENDENCIES) 
+	@rm -f h79widening2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS)
+
+hybrid$(EXEEXT): $(hybrid_OBJECTS) $(hybrid_DEPENDENCIES) $(EXTRA_hybrid_DEPENDENCIES) 
+	@rm -f hybrid$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(hybrid_OBJECTS) $(hybrid_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+limitedbhrz03extrapolation1$(EXEEXT): $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_limitedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f limitedbhrz03extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS)
+
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES) $(EXTRA_limitedh79extrapolation1_DEPENDENCIES) 
+	@rm -f limitedh79extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+
+linearexpression1$(EXEEXT): $(linearexpression1_OBJECTS) $(linearexpression1_DEPENDENCIES) $(EXTRA_linearexpression1_DEPENDENCIES) 
+	@rm -f linearexpression1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(linearexpression1_OBJECTS) $(linearexpression1_LDADD) $(LIBS)
+
+linearpartition1$(EXEEXT): $(linearpartition1_OBJECTS) $(linearpartition1_DEPENDENCIES) $(EXTRA_linearpartition1_DEPENDENCIES) 
+	@rm -f linearpartition1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS)
+
+linearsystem1$(EXEEXT): $(linearsystem1_OBJECTS) $(linearsystem1_DEPENDENCIES) $(EXTRA_linearsystem1_DEPENDENCIES) 
+	@rm -f linearsystem1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS)
+
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES) $(EXTRA_mapspacedims1_DEPENDENCIES) 
+	@rm -f mapspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+
+matrix1$(EXEEXT): $(matrix1_OBJECTS) $(matrix1_DEPENDENCIES) $(EXTRA_matrix1_DEPENDENCIES) 
+	@rm -f matrix1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS)
+
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES) $(EXTRA_max_min1_DEPENDENCIES) 
+	@rm -f max_min1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES) $(EXTRA_maxspacedim1_DEPENDENCIES) 
+	@rm -f maxspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+
+mc91$(EXEEXT): $(mc91_OBJECTS) $(mc91_DEPENDENCIES) $(EXTRA_mc91_DEPENDENCIES) 
+	@rm -f mc91$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+memory2$(EXEEXT): $(memory2_OBJECTS) $(memory2_DEPENDENCIES) $(EXTRA_memory2_DEPENDENCIES) 
+	@rm -f memory2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS)
+
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES) $(EXTRA_minconstraints1_DEPENDENCIES) 
+	@rm -f minconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+
+minconstraints2$(EXEEXT): $(minconstraints2_OBJECTS) $(minconstraints2_DEPENDENCIES) $(EXTRA_minconstraints2_DEPENDENCIES) 
+	@rm -f minconstraints2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS)
+
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES) $(EXTRA_mingenerators1_DEPENDENCIES) 
+	@rm -f mingenerators1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+
+mingenerators2$(EXEEXT): $(mingenerators2_OBJECTS) $(mingenerators2_DEPENDENCIES) $(EXTRA_mingenerators2_DEPENDENCIES) 
+	@rm -f mingenerators2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS)
+
+nnc_addcongruence1$(EXEEXT): $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_DEPENDENCIES) $(EXTRA_nnc_addcongruence1_DEPENDENCIES) 
+	@rm -f nnc_addcongruence1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addcongruence1_LINK) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS)
+
+nnc_addcongruences1$(EXEEXT): $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_DEPENDENCIES) $(EXTRA_nnc_addcongruences1_DEPENDENCIES) 
+	@rm -f nnc_addcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addcongruences1_LINK) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS)
+
+nnc_addconstraint1$(EXEEXT): $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_DEPENDENCIES) $(EXTRA_nnc_addconstraint1_DEPENDENCIES) 
+	@rm -f nnc_addconstraint1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addconstraint1_LINK) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS)
+
+nnc_addconstraints1$(EXEEXT): $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_DEPENDENCIES) $(EXTRA_nnc_addconstraints1_DEPENDENCIES) 
+	@rm -f nnc_addconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addconstraints1_LINK) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS)
+
+nnc_addgenerator1$(EXEEXT): $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_DEPENDENCIES) $(EXTRA_nnc_addgenerator1_DEPENDENCIES) 
+	@rm -f nnc_addgenerator1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addgenerator1_LINK) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS)
+
+nnc_addgenerators1$(EXEEXT): $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_DEPENDENCIES) $(EXTRA_nnc_addgenerators1_DEPENDENCIES) 
+	@rm -f nnc_addgenerators1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addgenerators1_LINK) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS)
+
+nnc_addspacedims1$(EXEEXT): $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_DEPENDENCIES) $(EXTRA_nnc_addspacedims1_DEPENDENCIES) 
+	@rm -f nnc_addspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_addspacedims1_LINK) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS)
+
+nnc_affineimage1$(EXEEXT): $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_DEPENDENCIES) $(EXTRA_nnc_affineimage1_DEPENDENCIES) 
+	@rm -f nnc_affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_affineimage1_LINK) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS)
+
+nnc_affinepreimage1$(EXEEXT): $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_DEPENDENCIES) $(EXTRA_nnc_affinepreimage1_DEPENDENCIES) 
+	@rm -f nnc_affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_affinepreimage1_LINK) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS)
+
+nnc_affinetrans$(EXEEXT): $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_DEPENDENCIES) $(EXTRA_nnc_affinetrans_DEPENDENCIES) 
+	@rm -f nnc_affinetrans$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_affinetrans_LINK) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS)
+
+nnc_append1$(EXEEXT): $(nnc_append1_OBJECTS) $(nnc_append1_DEPENDENCIES) $(EXTRA_nnc_append1_DEPENDENCIES) 
+	@rm -f nnc_append1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_append1_LINK) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS)
+
+nnc_append2$(EXEEXT): $(nnc_append2_OBJECTS) $(nnc_append2_DEPENDENCIES) $(EXTRA_nnc_append2_DEPENDENCIES) 
+	@rm -f nnc_append2$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_append2_LINK) $(nnc_append2_OBJECTS) $(nnc_append2_LDADD) $(LIBS)
+
+nnc_ascii_dump_load1$(EXEEXT): $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_DEPENDENCIES) $(EXTRA_nnc_ascii_dump_load1_DEPENDENCIES) 
+	@rm -f nnc_ascii_dump_load1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_ascii_dump_load1_LINK) $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_LDADD) $(LIBS)
+
+nnc_ascii_dump_load2$(EXEEXT): $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_DEPENDENCIES) $(EXTRA_nnc_ascii_dump_load2_DEPENDENCIES) 
+	@rm -f nnc_ascii_dump_load2$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_ascii_dump_load2_LINK) $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_LDADD) $(LIBS)
+
+nnc_bgp99extrapolation1$(EXEEXT): $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_DEPENDENCIES) $(EXTRA_nnc_bgp99extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_bgp99extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_bgp99extrapolation1_LINK) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS)
+
+nnc_bhrz03widening1$(EXEEXT): $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_DEPENDENCIES) $(EXTRA_nnc_bhrz03widening1_DEPENDENCIES) 
+	@rm -f nnc_bhrz03widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_bhrz03widening1_LINK) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS)
+
+nnc_bhrz03widening2$(EXEEXT): $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_DEPENDENCIES) $(EXTRA_nnc_bhrz03widening2_DEPENDENCIES) 
+	@rm -f nnc_bhrz03widening2$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_bhrz03widening2_LINK) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS)
+
+nnc_bounded1$(EXEEXT): $(nnc_bounded1_OBJECTS) $(nnc_bounded1_DEPENDENCIES) $(EXTRA_nnc_bounded1_DEPENDENCIES) 
+	@rm -f nnc_bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_bounded1_LINK) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS)
+
+nnc_boundedaffineimage1$(EXEEXT): $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_DEPENDENCIES) $(EXTRA_nnc_boundedaffineimage1_DEPENDENCIES) 
+	@rm -f nnc_boundedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_boundedaffineimage1_LINK) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS)
+
+nnc_boundedaffinepreimage1$(EXEEXT): $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_DEPENDENCIES) $(EXTRA_nnc_boundedaffinepreimage1_DEPENDENCIES) 
+	@rm -f nnc_boundedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_boundedaffinepreimage1_LINK) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS)
+
+nnc_boundedbhrz03extrapolation1$(EXEEXT): $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_nnc_boundedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_boundedbhrz03extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS)
+
+nnc_boundedh79extrapolation1$(EXEEXT): $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_DEPENDENCIES) $(EXTRA_nnc_boundedh79extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_boundedh79extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_boundedh79extrapolation1_LINK) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS)
+
+nnc_bounds1$(EXEEXT): $(nnc_bounds1_OBJECTS) $(nnc_bounds1_DEPENDENCIES) $(EXTRA_nnc_bounds1_DEPENDENCIES) 
+	@rm -f nnc_bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_bounds1_LINK) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS)
+
+nnc_concatenate1$(EXEEXT): $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_DEPENDENCIES) $(EXTRA_nnc_concatenate1_DEPENDENCIES) 
+	@rm -f nnc_concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_concatenate1_LINK) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS)
+
+nnc_congruences1$(EXEEXT): $(nnc_congruences1_OBJECTS) $(nnc_congruences1_DEPENDENCIES) $(EXTRA_nnc_congruences1_DEPENDENCIES) 
+	@rm -f nnc_congruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_congruences1_LINK) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS)
+
+nnc_constrains1$(EXEEXT): $(nnc_constrains1_OBJECTS) $(nnc_constrains1_DEPENDENCIES) $(EXTRA_nnc_constrains1_DEPENDENCIES) 
+	@rm -f nnc_constrains1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_constrains1_LINK) $(nnc_constrains1_OBJECTS) $(nnc_constrains1_LDADD) $(LIBS)
+
+nnc_constraints1$(EXEEXT): $(nnc_constraints1_OBJECTS) $(nnc_constraints1_DEPENDENCIES) $(EXTRA_nnc_constraints1_DEPENDENCIES) 
+	@rm -f nnc_constraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_constraints1_LINK) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS)
+
+nnc_contains1$(EXEEXT): $(nnc_contains1_OBJECTS) $(nnc_contains1_DEPENDENCIES) $(EXTRA_nnc_contains1_DEPENDENCIES) 
+	@rm -f nnc_contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_contains1_LINK) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS)
+
+nnc_containsintegerpoint1$(EXEEXT): $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_DEPENDENCIES) $(EXTRA_nnc_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f nnc_containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_containsintegerpoint1_LINK) $(nnc_containsintegerpoint1_OBJECTS) $(nnc_containsintegerpoint1_LDADD) $(LIBS)
+
+nnc_disjoint1$(EXEEXT): $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_DEPENDENCIES) $(EXTRA_nnc_disjoint1_DEPENDENCIES) 
+	@rm -f nnc_disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_disjoint1_LINK) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS)
+
+nnc_dropsomenonintegerpoints1$(EXEEXT): $(nnc_dropsomenonintegerpoints1_OBJECTS) $(nnc_dropsomenonintegerpoints1_DEPENDENCIES) $(EXTRA_nnc_dropsomenonintegerpoints1_DEPENDENCIES) 
+	@rm -f nnc_dropsomenonintegerpoints1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_dropsomenonintegerpoints1_LINK) $(nnc_dropsomenonintegerpoints1_OBJECTS) $(nnc_dropsomenonintegerpoints1_LDADD) $(LIBS)
+
+nnc_empty1$(EXEEXT): $(nnc_empty1_OBJECTS) $(nnc_empty1_DEPENDENCIES) $(EXTRA_nnc_empty1_DEPENDENCIES) 
+	@rm -f nnc_empty1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_empty1_LINK) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS)
+
+nnc_equals1$(EXEEXT): $(nnc_equals1_OBJECTS) $(nnc_equals1_DEPENDENCIES) $(EXTRA_nnc_equals1_DEPENDENCIES) 
+	@rm -f nnc_equals1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_equals1_LINK) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS)
+
+nnc_exceptions1$(EXEEXT): $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_DEPENDENCIES) $(EXTRA_nnc_exceptions1_DEPENDENCIES) 
+	@rm -f nnc_exceptions1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_exceptions1_LINK) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS)
+
+nnc_exceptions3$(EXEEXT): $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_DEPENDENCIES) $(EXTRA_nnc_exceptions3_DEPENDENCIES) 
+	@rm -f nnc_exceptions3$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_exceptions3_LINK) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS)
+
+nnc_expandspacedim1$(EXEEXT): $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_DEPENDENCIES) $(EXTRA_nnc_expandspacedim1_DEPENDENCIES) 
+	@rm -f nnc_expandspacedim1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_expandspacedim1_LINK) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS)
+
+nnc_foldspacedims1$(EXEEXT): $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_DEPENDENCIES) $(EXTRA_nnc_foldspacedims1_DEPENDENCIES) 
+	@rm -f nnc_foldspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_foldspacedims1_LINK) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS)
+
+nnc_frombdshape1$(EXEEXT): $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_DEPENDENCIES) $(EXTRA_nnc_frombdshape1_DEPENDENCIES) 
+	@rm -f nnc_frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_frombdshape1_LINK) $(nnc_frombdshape1_OBJECTS) $(nnc_frombdshape1_LDADD) $(LIBS)
+
+nnc_frombox1$(EXEEXT): $(nnc_frombox1_OBJECTS) $(nnc_frombox1_DEPENDENCIES) $(EXTRA_nnc_frombox1_DEPENDENCIES) 
+	@rm -f nnc_frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_frombox1_LINK) $(nnc_frombox1_OBJECTS) $(nnc_frombox1_LDADD) $(LIBS)
+
+nnc_fromgrid1$(EXEEXT): $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_DEPENDENCIES) $(EXTRA_nnc_fromgrid1_DEPENDENCIES) 
+	@rm -f nnc_fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_fromgrid1_LINK) $(nnc_fromgrid1_OBJECTS) $(nnc_fromgrid1_LDADD) $(LIBS)
+
+nnc_fromoctagonalshape1$(EXEEXT): $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_DEPENDENCIES) $(EXTRA_nnc_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f nnc_fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_fromoctagonalshape1_LINK) $(nnc_fromoctagonalshape1_OBJECTS) $(nnc_fromoctagonalshape1_LDADD) $(LIBS)
+
+nnc_generalizedaffineimage1$(EXEEXT): $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_DEPENDENCIES) $(EXTRA_nnc_generalizedaffineimage1_DEPENDENCIES) 
+	@rm -f nnc_generalizedaffineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_generalizedaffineimage1_LINK) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS)
+
+nnc_generalizedaffinepreimage1$(EXEEXT): $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_DEPENDENCIES) $(EXTRA_nnc_generalizedaffinepreimage1_DEPENDENCIES) 
+	@rm -f nnc_generalizedaffinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_generalizedaffinepreimage1_LINK) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS)
+
+nnc_generators1$(EXEEXT): $(nnc_generators1_OBJECTS) $(nnc_generators1_DEPENDENCIES) $(EXTRA_nnc_generators1_DEPENDENCIES) 
+	@rm -f nnc_generators1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_generators1_LINK) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS)
+
+nnc_geomcovers1$(EXEEXT): $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_DEPENDENCIES) $(EXTRA_nnc_geomcovers1_DEPENDENCIES) 
+	@rm -f nnc_geomcovers1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_geomcovers1_LINK) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS)
+
+nnc_h79widening1$(EXEEXT): $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_DEPENDENCIES) $(EXTRA_nnc_h79widening1_DEPENDENCIES) 
+	@rm -f nnc_h79widening1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_h79widening1_LINK) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS)
+
+nnc_intersection1$(EXEEXT): $(nnc_intersection1_OBJECTS) $(nnc_intersection1_DEPENDENCIES) $(EXTRA_nnc_intersection1_DEPENDENCIES) 
+	@rm -f nnc_intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_intersection1_LINK) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS)
+
+nnc_limitedbhrz03extrapolation1$(EXEEXT): $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_DEPENDENCIES) $(EXTRA_nnc_limitedbhrz03extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_limitedbhrz03extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_limitedbhrz03extrapolation1_LINK) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS)
+
+nnc_limitedh79extrapolation1$(EXEEXT): $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_DEPENDENCIES) $(EXTRA_nnc_limitedh79extrapolation1_DEPENDENCIES) 
+	@rm -f nnc_limitedh79extrapolation1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_limitedh79extrapolation1_LINK) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS)
+
+nnc_linearpartition1$(EXEEXT): $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_DEPENDENCIES) $(EXTRA_nnc_linearpartition1_DEPENDENCIES) 
+	@rm -f nnc_linearpartition1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_linearpartition1_LINK) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS)
+
+nnc_mapspacedims1$(EXEEXT): $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_DEPENDENCIES) $(EXTRA_nnc_mapspacedims1_DEPENDENCIES) 
+	@rm -f nnc_mapspacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_mapspacedims1_LINK) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS)
+
+nnc_max_min1$(EXEEXT): $(nnc_max_min1_OBJECTS) $(nnc_max_min1_DEPENDENCIES) $(EXTRA_nnc_max_min1_DEPENDENCIES) 
+	@rm -f nnc_max_min1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_max_min1_LINK) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS)
+
+nnc_mc91$(EXEEXT): $(nnc_mc91_OBJECTS) $(nnc_mc91_DEPENDENCIES) $(EXTRA_nnc_mc91_DEPENDENCIES) 
+	@rm -f nnc_mc91$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_mc91_LINK) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS)
+
+nnc_membytes1$(EXEEXT): $(nnc_membytes1_OBJECTS) $(nnc_membytes1_DEPENDENCIES) $(EXTRA_nnc_membytes1_DEPENDENCIES) 
+	@rm -f nnc_membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_membytes1_LINK) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS)
+
+nnc_minconstraints1$(EXEEXT): $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_DEPENDENCIES) $(EXTRA_nnc_minconstraints1_DEPENDENCIES) 
+	@rm -f nnc_minconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_minconstraints1_LINK) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS)
+
+nnc_mingenerators1$(EXEEXT): $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_DEPENDENCIES) $(EXTRA_nnc_mingenerators1_DEPENDENCIES) 
+	@rm -f nnc_mingenerators1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_mingenerators1_LINK) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS)
+
+nnc_onepoint$(EXEEXT): $(nnc_onepoint_OBJECTS) $(nnc_onepoint_DEPENDENCIES) $(EXTRA_nnc_onepoint_DEPENDENCIES) 
+	@rm -f nnc_onepoint$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_onepoint_LINK) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS)
+
+nnc_permute$(EXEEXT): $(nnc_permute_OBJECTS) $(nnc_permute_DEPENDENCIES) $(EXTRA_nnc_permute_DEPENDENCIES) 
+	@rm -f nnc_permute$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_permute_LINK) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS)
+
+nnc_polydifference1$(EXEEXT): $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_DEPENDENCIES) $(EXTRA_nnc_polydifference1_DEPENDENCIES) 
+	@rm -f nnc_polydifference1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_polydifference1_LINK) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS)
+
+nnc_polyhull1$(EXEEXT): $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_DEPENDENCIES) $(EXTRA_nnc_polyhull1_DEPENDENCIES) 
+	@rm -f nnc_polyhull1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_polyhull1_LINK) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS)
+
+nnc_polyhullifexact1$(EXEEXT): $(nnc_polyhullifexact1_OBJECTS) $(nnc_polyhullifexact1_DEPENDENCIES) $(EXTRA_nnc_polyhullifexact1_DEPENDENCIES) 
+	@rm -f nnc_polyhullifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_polyhullifexact1_LINK) $(nnc_polyhullifexact1_OBJECTS) $(nnc_polyhullifexact1_LDADD) $(LIBS)
+
+nnc_randphull1$(EXEEXT): $(nnc_randphull1_OBJECTS) $(nnc_randphull1_DEPENDENCIES) $(EXTRA_nnc_randphull1_DEPENDENCIES) 
+	@rm -f nnc_randphull1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_randphull1_LINK) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS)
+
+nnc_relations1$(EXEEXT): $(nnc_relations1_OBJECTS) $(nnc_relations1_DEPENDENCIES) $(EXTRA_nnc_relations1_DEPENDENCIES) 
+	@rm -f nnc_relations1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_relations1_LINK) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS)
+
+nnc_relations2$(EXEEXT): $(nnc_relations2_OBJECTS) $(nnc_relations2_DEPENDENCIES) $(EXTRA_nnc_relations2_DEPENDENCIES) 
+	@rm -f nnc_relations2$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_relations2_LINK) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS)
+
+nnc_removespacedims1$(EXEEXT): $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_DEPENDENCIES) $(EXTRA_nnc_removespacedims1_DEPENDENCIES) 
+	@rm -f nnc_removespacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_removespacedims1_LINK) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS)
+
+nnc_simplifyusingcontext1$(EXEEXT): $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_DEPENDENCIES) $(EXTRA_nnc_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f nnc_simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_simplifyusingcontext1_LINK) $(nnc_simplifyusingcontext1_OBJECTS) $(nnc_simplifyusingcontext1_LDADD) $(LIBS)
+
+nnc_smm1$(EXEEXT): $(nnc_smm1_OBJECTS) $(nnc_smm1_DEPENDENCIES) $(EXTRA_nnc_smm1_DEPENDENCIES) 
+	@rm -f nnc_smm1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_smm1_LINK) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS)
+
+nnc_timeelapse1$(EXEEXT): $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_DEPENDENCIES) $(EXTRA_nnc_timeelapse1_DEPENDENCIES) 
+	@rm -f nnc_timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_timeelapse1_LINK) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS)
+
+nnc_unconstrain1$(EXEEXT): $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_DEPENDENCIES) $(EXTRA_nnc_unconstrain1_DEPENDENCIES) 
+	@rm -f nnc_unconstrain1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_unconstrain1_LINK) $(nnc_unconstrain1_OBJECTS) $(nnc_unconstrain1_LDADD) $(LIBS)
+
+nnc_universe1$(EXEEXT): $(nnc_universe1_OBJECTS) $(nnc_universe1_DEPENDENCIES) $(EXTRA_nnc_universe1_DEPENDENCIES) 
+	@rm -f nnc_universe1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_universe1_LINK) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS)
+
+nnc_wrap1$(EXEEXT): $(nnc_wrap1_OBJECTS) $(nnc_wrap1_DEPENDENCIES) $(EXTRA_nnc_wrap1_DEPENDENCIES) 
+	@rm -f nnc_wrap1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_wrap1_LINK) $(nnc_wrap1_OBJECTS) $(nnc_wrap1_LDADD) $(LIBS)
+
+nnc_wrap2$(EXEEXT): $(nnc_wrap2_OBJECTS) $(nnc_wrap2_DEPENDENCIES) $(EXTRA_nnc_wrap2_DEPENDENCIES) 
+	@rm -f nnc_wrap2$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_wrap2_LINK) $(nnc_wrap2_OBJECTS) $(nnc_wrap2_LDADD) $(LIBS)
+
+nnc_writepolyhedron1$(EXEEXT): $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_DEPENDENCIES) $(EXTRA_nnc_writepolyhedron1_DEPENDENCIES) 
+	@rm -f nnc_writepolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(nnc_writepolyhedron1_LINK) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS)
+
+nncminimize1$(EXEEXT): $(nncminimize1_OBJECTS) $(nncminimize1_DEPENDENCIES) $(EXTRA_nncminimize1_DEPENDENCIES) 
+	@rm -f nncminimize1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS)
+
+nncminimize2$(EXEEXT): $(nncminimize2_OBJECTS) $(nncminimize2_DEPENDENCIES) $(EXTRA_nncminimize2_DEPENDENCIES) 
+	@rm -f nncminimize2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS)
+
+nncpostimeelapse1$(EXEEXT): $(nncpostimeelapse1_OBJECTS) $(nncpostimeelapse1_DEPENDENCIES) $(EXTRA_nncpostimeelapse1_DEPENDENCIES) 
+	@rm -f nncpostimeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(nncpostimeelapse1_OBJECTS) $(nncpostimeelapse1_LDADD) $(LIBS)
+
+numberinput1$(EXEEXT): $(numberinput1_OBJECTS) $(numberinput1_DEPENDENCIES) $(EXTRA_numberinput1_DEPENDENCIES) 
+	@rm -f numberinput1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS)
+
+onepoint$(EXEEXT): $(onepoint_OBJECTS) $(onepoint_DEPENDENCIES) $(EXTRA_onepoint_DEPENDENCIES) 
+	@rm -f onepoint$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS)
+
+permute$(EXEEXT): $(permute_OBJECTS) $(permute_DEPENDENCIES) $(EXTRA_permute_DEPENDENCIES) 
+	@rm -f permute$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(permute_OBJECTS) $(permute_LDADD) $(LIBS)
+
+polydifference1$(EXEEXT): $(polydifference1_OBJECTS) $(polydifference1_DEPENDENCIES) $(EXTRA_polydifference1_DEPENDENCIES) 
+	@rm -f polydifference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS)
+
+polydifference2$(EXEEXT): $(polydifference2_OBJECTS) $(polydifference2_DEPENDENCIES) $(EXTRA_polydifference2_DEPENDENCIES) 
+	@rm -f polydifference2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS)
+
+polyhull1$(EXEEXT): $(polyhull1_OBJECTS) $(polyhull1_DEPENDENCIES) $(EXTRA_polyhull1_DEPENDENCIES) 
+	@rm -f polyhull1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS)
+
+polyhull2$(EXEEXT): $(polyhull2_OBJECTS) $(polyhull2_DEPENDENCIES) $(EXTRA_polyhull2_DEPENDENCIES) 
+	@rm -f polyhull2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS)
+
+polyhullifexact1$(EXEEXT): $(polyhullifexact1_OBJECTS) $(polyhullifexact1_DEPENDENCIES) $(EXTRA_polyhullifexact1_DEPENDENCIES) 
+	@rm -f polyhullifexact1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polyhullifexact1_OBJECTS) $(polyhullifexact1_LDADD) $(LIBS)
+
+polyhullifexact2$(EXEEXT): $(polyhullifexact2_OBJECTS) $(polyhullifexact2_DEPENDENCIES) $(EXTRA_polyhullifexact2_DEPENDENCIES) 
+	@rm -f polyhullifexact2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(polyhullifexact2_OBJECTS) $(polyhullifexact2_LDADD) $(LIBS)
+
+randphull1$(EXEEXT): $(randphull1_OBJECTS) $(randphull1_DEPENDENCIES) $(EXTRA_randphull1_DEPENDENCIES) 
+	@rm -f randphull1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS)
+
+refinewithcongruence1$(EXEEXT): $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_DEPENDENCIES) $(EXTRA_refinewithcongruence1_DEPENDENCIES) 
+	@rm -f refinewithcongruence1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruence1_OBJECTS) $(refinewithcongruence1_LDADD) $(LIBS)
+
+refinewithcongruences1$(EXEEXT): $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_DEPENDENCIES) $(EXTRA_refinewithcongruences1_DEPENDENCIES) 
+	@rm -f refinewithcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithcongruences1_OBJECTS) $(refinewithcongruences1_LDADD) $(LIBS)
+
+refinewithconstraint1$(EXEEXT): $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_DEPENDENCIES) $(EXTRA_refinewithconstraint1_DEPENDENCIES) 
+	@rm -f refinewithconstraint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraint1_OBJECTS) $(refinewithconstraint1_LDADD) $(LIBS)
+
+refinewithconstraints1$(EXEEXT): $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_DEPENDENCIES) $(EXTRA_refinewithconstraints1_DEPENDENCIES) 
+	@rm -f refinewithconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewithconstraints1_OBJECTS) $(refinewithconstraints1_LDADD) $(LIBS)
+
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES) $(EXTRA_relations1_DEPENDENCIES) 
+	@rm -f relations1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES) $(EXTRA_relations2_DEPENDENCIES) 
+	@rm -f relations2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES) $(EXTRA_relations3_DEPENDENCIES) 
+	@rm -f relations3$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES) $(EXTRA_removespacedims1_DEPENDENCIES) 
+	@rm -f removespacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES) $(EXTRA_removespacedims2_DEPENDENCIES) 
+	@rm -f removespacedims2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+smm1$(EXEEXT): $(smm1_OBJECTS) $(smm1_DEPENDENCIES) $(EXTRA_smm1_DEPENDENCIES) 
+	@rm -f smm1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS)
+
+sparserow1$(EXEEXT): $(sparserow1_OBJECTS) $(sparserow1_DEPENDENCIES) $(EXTRA_sparserow1_DEPENDENCIES) 
+	@rm -f sparserow1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(sparserow1_OBJECTS) $(sparserow1_LDADD) $(LIBS)
+
+termination1$(EXEEXT): $(termination1_OBJECTS) $(termination1_DEPENDENCIES) $(EXTRA_termination1_DEPENDENCIES) 
+	@rm -f termination1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(termination1_OBJECTS) $(termination1_LDADD) $(LIBS)
+
+termination2$(EXEEXT): $(termination2_OBJECTS) $(termination2_DEPENDENCIES) $(EXTRA_termination2_DEPENDENCIES) 
+	@rm -f termination2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(termination2_OBJECTS) $(termination2_LDADD) $(LIBS)
+
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES) $(EXTRA_timeelapse1_DEPENDENCIES) 
+	@rm -f timeelapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+
+timeelapse2$(EXEEXT): $(timeelapse2_OBJECTS) $(timeelapse2_DEPENDENCIES) $(EXTRA_timeelapse2_DEPENDENCIES) 
+	@rm -f timeelapse2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS)
+
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES) $(EXTRA_topclosed1_DEPENDENCIES) 
+	@rm -f topclosed1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES) $(EXTRA_topclosure1_DEPENDENCIES) 
+	@rm -f topclosure1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+
+unconstrain1$(EXEEXT): $(unconstrain1_OBJECTS) $(unconstrain1_DEPENDENCIES) $(EXTRA_unconstrain1_DEPENDENCIES) 
+	@rm -f unconstrain1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(unconstrain1_OBJECTS) $(unconstrain1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+universe2$(EXEEXT): $(universe2_OBJECTS) $(universe2_DEPENDENCIES) $(EXTRA_universe2_DEPENDENCIES) 
+	@rm -f universe2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS)
+
+variablesset1$(EXEEXT): $(variablesset1_OBJECTS) $(variablesset1_DEPENDENCIES) $(EXTRA_variablesset1_DEPENDENCIES) 
+	@rm -f variablesset1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(variablesset1_OBJECTS) $(variablesset1_LDADD) $(LIBS)
+
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) $(EXTRA_watchdog1_DEPENDENCIES) 
+	@rm -f watchdog1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+
+weightwatch1$(EXEEXT): $(weightwatch1_OBJECTS) $(weightwatch1_DEPENDENCIES) $(EXTRA_weightwatch1_DEPENDENCIES) 
+	@rm -f weightwatch1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(weightwatch1_OBJECTS) $(weightwatch1_LDADD) $(LIBS)
+
+wrap1$(EXEEXT): $(wrap1_OBJECTS) $(wrap1_DEPENDENCIES) $(EXTRA_wrap1_DEPENDENCIES) 
+	@rm -f wrap1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(wrap1_OBJECTS) $(wrap1_LDADD) $(LIBS)
+
+wrap2$(EXEEXT): $(wrap2_OBJECTS) $(wrap2_DEPENDENCIES) $(EXTRA_wrap2_DEPENDENCIES) 
+	@rm -f wrap2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(wrap2_OBJECTS) $(wrap2_LDADD) $(LIBS)
+
+writeconsys1$(EXEEXT): $(writeconsys1_OBJECTS) $(writeconsys1_DEPENDENCIES) $(EXTRA_writeconsys1_DEPENDENCIES) 
+	@rm -f writeconsys1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS)
+
+writegensys1$(EXEEXT): $(writegensys1_OBJECTS) $(writegensys1_DEPENDENCIES) $(EXTRA_writegensys1_DEPENDENCIES) 
+	@rm -f writegensys1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS)
+
+writepolyhedron1$(EXEEXT): $(writepolyhedron1_OBJECTS) $(writepolyhedron1_DEPENDENCIES) $(EXTRA_writepolyhedron1_DEPENDENCIES) 
+	@rm -f writepolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS)
+
+writepolyhedron2$(EXEEXT): $(writepolyhedron2_OBJECTS) $(writepolyhedron2_DEPENDENCIES) $(EXTRA_writepolyhedron2_DEPENDENCIES) 
+	@rm -f writepolyhedron2$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS)
+
+writerelation1$(EXEEXT): $(writerelation1_OBJECTS) $(writerelation1_DEPENDENCIES) $(EXTRA_writerelation1_DEPENDENCIES) 
+	@rm -f writerelation1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS)
+
+writevariable1$(EXEEXT): $(writevariable1_OBJECTS) $(writevariable1_DEPENDENCIES) $(EXTRA_writevariable1_DEPENDENCIES) 
+	@rm -f writevariable1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(writevariable1_OBJECTS) $(writevariable1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerator2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addgenerators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinetrans.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/append1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/append2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ascii_dump_load3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bgp99extrapolation2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhrz03widening3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bhz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cnncconversion1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dropsomenonintegerpoints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dualhypercubes.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/exceptions3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/expandspacedim2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/foldspacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frequency1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffineimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generalizedaffinepreimage2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h79widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hybrid.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearexpression1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearpartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/linearsystem1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/matrix1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mc91.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/minconstraints2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mingenerators2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affineimage1-affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_affinetrans-affinetrans.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_append1-append1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_append2-append2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounded1-bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_bounds1-bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_concatenate1-concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_congruences1-congruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constrains1-constrains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_constraints1-constraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_contains1-contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_disjoint1-disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_empty1-empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_equals1-equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions1-exceptions1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_exceptions3-exceptions3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frombdshape1-frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_frombox1-frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_fromgrid1-fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_generators1-generators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_h79widening1-h79widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_intersection1-intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_max_min1-max_min1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mc91-mc91.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_membytes1-membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_onepoint-onepoint.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_permute-permute.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polydifference1-polydifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polyhull1-polyhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull1-randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations1-relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_relations2-relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_smm1-smm1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_unconstrain1-unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_universe1-universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_wrap1-wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_wrap2-wrap2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncminimize2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nncpostimeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/numberinput1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/onepoint.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/permute.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polydifference2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhull2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhullifexact1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/polyhullifexact2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruence1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewithconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relations3.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/removespacedims2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/smm1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sparserow1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/termination1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/termination2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timeelapse2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/topclosure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unconstrain1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/variablesset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/weightwatch1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/wrap2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writeconsys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writegensys1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writepolyhedron2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writerelation1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writevariable1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+nnc_addcongruence1-addcongruence1.o: addcongruence1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.o -MD -MP -MF $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.o `test -f 'addcongruence1.cc' || echo '$(srcdir)/'`addcongruence1.cc
+
+nnc_addcongruence1-addcongruence1.obj: addcongruence1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruence1-addcongruence1.obj -MD -MP -MF $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo $(DEPDIR)/nnc_addcongruence1-addcongruence1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addcongruence1.cc' object='nnc_addcongruence1-addcongruence1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruence1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruence1-addcongruence1.obj `if test -f 'addcongruence1.cc'; then $(CYGPATH_W) 'addcongruence1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruence1.cc'; fi`
+
+nnc_addcongruences1-addcongruences1.o: addcongruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.o -MD -MP -MF $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.o `test -f 'addcongruences1.cc' || echo '$(srcdir)/'`addcongruences1.cc
+
+nnc_addcongruences1-addcongruences1.obj: addcongruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addcongruences1-addcongruences1.obj -MD -MP -MF $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo $(DEPDIR)/nnc_addcongruences1-addcongruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addcongruences1.cc' object='nnc_addcongruences1-addcongruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addcongruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addcongruences1-addcongruences1.obj `if test -f 'addcongruences1.cc'; then $(CYGPATH_W) 'addcongruences1.cc'; else $(CYGPATH_W) '$(srcdir)/addcongruences1.cc'; fi`
+
+nnc_addconstraint1-addconstraint1.o: addconstraint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.o -MD -MP -MF $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.o `test -f 'addconstraint1.cc' || echo '$(srcdir)/'`addconstraint1.cc
+
+nnc_addconstraint1-addconstraint1.obj: addconstraint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraint1-addconstraint1.obj -MD -MP -MF $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo $(DEPDIR)/nnc_addconstraint1-addconstraint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addconstraint1.cc' object='nnc_addconstraint1-addconstraint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraint1-addconstraint1.obj `if test -f 'addconstraint1.cc'; then $(CYGPATH_W) 'addconstraint1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraint1.cc'; fi`
+
+nnc_addconstraints1-addconstraints1.o: addconstraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.o -MD -MP -MF $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.o `test -f 'addconstraints1.cc' || echo '$(srcdir)/'`addconstraints1.cc
+
+nnc_addconstraints1-addconstraints1.obj: addconstraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addconstraints1-addconstraints1.obj -MD -MP -MF $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo $(DEPDIR)/nnc_addconstraints1-addconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addconstraints1.cc' object='nnc_addconstraints1-addconstraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addconstraints1-addconstraints1.obj `if test -f 'addconstraints1.cc'; then $(CYGPATH_W) 'addconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/addconstraints1.cc'; fi`
+
+nnc_addgenerator1-addgenerator1.o: addgenerator1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.o -MD -MP -MF $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.o `test -f 'addgenerator1.cc' || echo '$(srcdir)/'`addgenerator1.cc
+
+nnc_addgenerator1-addgenerator1.obj: addgenerator1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerator1-addgenerator1.obj -MD -MP -MF $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo $(DEPDIR)/nnc_addgenerator1-addgenerator1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addgenerator1.cc' object='nnc_addgenerator1-addgenerator1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerator1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerator1-addgenerator1.obj `if test -f 'addgenerator1.cc'; then $(CYGPATH_W) 'addgenerator1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerator1.cc'; fi`
+
+nnc_addgenerators1-addgenerators1.o: addgenerators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.o -MD -MP -MF $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.o `test -f 'addgenerators1.cc' || echo '$(srcdir)/'`addgenerators1.cc
+
+nnc_addgenerators1-addgenerators1.obj: addgenerators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addgenerators1-addgenerators1.obj -MD -MP -MF $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo $(DEPDIR)/nnc_addgenerators1-addgenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addgenerators1.cc' object='nnc_addgenerators1-addgenerators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addgenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addgenerators1-addgenerators1.obj `if test -f 'addgenerators1.cc'; then $(CYGPATH_W) 'addgenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/addgenerators1.cc'; fi`
+
+nnc_addspacedims1-addspacedims1.o: addspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.o `test -f 'addspacedims1.cc' || echo '$(srcdir)/'`addspacedims1.cc
+
+nnc_addspacedims1-addspacedims1.obj: addspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_addspacedims1-addspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo $(DEPDIR)/nnc_addspacedims1-addspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='addspacedims1.cc' object='nnc_addspacedims1-addspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_addspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_addspacedims1-addspacedims1.obj `if test -f 'addspacedims1.cc'; then $(CYGPATH_W) 'addspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/addspacedims1.cc'; fi`
+
+nnc_affineimage1-affineimage1.o: affineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.o -MD -MP -MF $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='affineimage1.cc' object='nnc_affineimage1-affineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.o `test -f 'affineimage1.cc' || echo '$(srcdir)/'`affineimage1.cc
+
+nnc_affineimage1-affineimage1.obj: affineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affineimage1-affineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affineimage1-affineimage1.Tpo $(DEPDIR)/nnc_affineimage1-affineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='affineimage1.cc' object='nnc_affineimage1-affineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affineimage1-affineimage1.obj `if test -f 'affineimage1.cc'; then $(CYGPATH_W) 'affineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affineimage1.cc'; fi`
+
+nnc_affinepreimage1-affinepreimage1.o: affinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.o `test -f 'affinepreimage1.cc' || echo '$(srcdir)/'`affinepreimage1.cc
+
+nnc_affinepreimage1-affinepreimage1.obj: affinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinepreimage1-affinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo $(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='affinepreimage1.cc' object='nnc_affinepreimage1-affinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinepreimage1-affinepreimage1.obj `if test -f 'affinepreimage1.cc'; then $(CYGPATH_W) 'affinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/affinepreimage1.cc'; fi`
+
+nnc_affinetrans-affinetrans.o: affinetrans.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.o -MD -MP -MF $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='affinetrans.cc' object='nnc_affinetrans-affinetrans.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.o `test -f 'affinetrans.cc' || echo '$(srcdir)/'`affinetrans.cc
+
+nnc_affinetrans-affinetrans.obj: affinetrans.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -MT nnc_affinetrans-affinetrans.obj -MD -MP -MF $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_affinetrans-affinetrans.Tpo $(DEPDIR)/nnc_affinetrans-affinetrans.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='affinetrans.cc' object='nnc_affinetrans-affinetrans.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_affinetrans_CXXFLAGS) $(CXXFLAGS) -c -o nnc_affinetrans-affinetrans.obj `if test -f 'affinetrans.cc'; then $(CYGPATH_W) 'affinetrans.cc'; else $(CYGPATH_W) '$(srcdir)/affinetrans.cc'; fi`
+
+nnc_append1-append1.o: append1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.o -MD -MP -MF $(DEPDIR)/nnc_append1-append1.Tpo -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='append1.cc' object='nnc_append1-append1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.o `test -f 'append1.cc' || echo '$(srcdir)/'`append1.cc
+
+nnc_append1-append1.obj: append1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -MT nnc_append1-append1.obj -MD -MP -MF $(DEPDIR)/nnc_append1-append1.Tpo -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append1-append1.Tpo $(DEPDIR)/nnc_append1-append1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='append1.cc' object='nnc_append1-append1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append1-append1.obj `if test -f 'append1.cc'; then $(CYGPATH_W) 'append1.cc'; else $(CYGPATH_W) '$(srcdir)/append1.cc'; fi`
+
+nnc_append2-append2.o: append2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.o -MD -MP -MF $(DEPDIR)/nnc_append2-append2.Tpo -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='append2.cc' object='nnc_append2-append2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.o `test -f 'append2.cc' || echo '$(srcdir)/'`append2.cc
+
+nnc_append2-append2.obj: append2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -MT nnc_append2-append2.obj -MD -MP -MF $(DEPDIR)/nnc_append2-append2.Tpo -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_append2-append2.Tpo $(DEPDIR)/nnc_append2-append2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='append2.cc' object='nnc_append2-append2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_append2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_append2-append2.obj `if test -f 'append2.cc'; then $(CYGPATH_W) 'append2.cc'; else $(CYGPATH_W) '$(srcdir)/append2.cc'; fi`
+
+nnc_ascii_dump_load1-ascii_dump_load1.o: ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.o -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.o `test -f 'ascii_dump_load1.cc' || echo '$(srcdir)/'`ascii_dump_load1.cc
+
+nnc_ascii_dump_load1-ascii_dump_load1.obj: ascii_dump_load1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load1-ascii_dump_load1.obj -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo $(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ascii_dump_load1.cc' object='nnc_ascii_dump_load1-ascii_dump_load1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load1-ascii_dump_load1.obj `if test -f 'ascii_dump_load1.cc'; then $(CYGPATH_W) 'ascii_dump_load1.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load1.cc'; fi`
+
+nnc_ascii_dump_load2-ascii_dump_load2.o: ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.o -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.o `test -f 'ascii_dump_load2.cc' || echo '$(srcdir)/'`ascii_dump_load2.cc
+
+nnc_ascii_dump_load2-ascii_dump_load2.obj: ascii_dump_load2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -MT nnc_ascii_dump_load2-ascii_dump_load2.obj -MD -MP -MF $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo $(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ascii_dump_load2.cc' object='nnc_ascii_dump_load2-ascii_dump_load2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_ascii_dump_load2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_ascii_dump_load2-ascii_dump_load2.obj `if test -f 'ascii_dump_load2.cc'; then $(CYGPATH_W) 'ascii_dump_load2.cc'; else $(CYGPATH_W) '$(srcdir)/ascii_dump_load2.cc'; fi`
+
+nnc_bgp99extrapolation1-bgp99extrapolation1.o: bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.o `test -f 'bgp99extrapolation1.cc' || echo '$(srcdir)/'`bgp99extrapolation1.cc
+
+nnc_bgp99extrapolation1-bgp99extrapolation1.obj: bgp99extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bgp99extrapolation1-bgp99extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo $(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bgp99extrapolation1.cc' object='nnc_bgp99extrapolation1-bgp99extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bgp99extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bgp99extrapolation1-bgp99extrapolation1.obj `if test -f 'bgp99extrapolation1.cc'; then $(CYGPATH_W) 'bgp99extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bgp99extrapolation1.cc'; fi`
+
+nnc_bhrz03widening1-bhrz03widening1.o: bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.o -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.o `test -f 'bhrz03widening1.cc' || echo '$(srcdir)/'`bhrz03widening1.cc
+
+nnc_bhrz03widening1-bhrz03widening1.obj: bhrz03widening1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening1-bhrz03widening1.obj -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo $(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bhrz03widening1.cc' object='nnc_bhrz03widening1-bhrz03widening1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening1-bhrz03widening1.obj `if test -f 'bhrz03widening1.cc'; then $(CYGPATH_W) 'bhrz03widening1.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening1.cc'; fi`
+
+nnc_bhrz03widening2-bhrz03widening2.o: bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.o -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.o `test -f 'bhrz03widening2.cc' || echo '$(srcdir)/'`bhrz03widening2.cc
+
+nnc_bhrz03widening2-bhrz03widening2.obj: bhrz03widening2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -MT nnc_bhrz03widening2-bhrz03widening2.obj -MD -MP -MF $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo $(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bhrz03widening2.cc' object='nnc_bhrz03widening2-bhrz03widening2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bhrz03widening2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bhrz03widening2-bhrz03widening2.obj `if test -f 'bhrz03widening2.cc'; then $(CYGPATH_W) 'bhrz03widening2.cc'; else $(CYGPATH_W) '$(srcdir)/bhrz03widening2.cc'; fi`
+
+nnc_bounded1-bounded1.o: bounded1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.o -MD -MP -MF $(DEPDIR)/nnc_bounded1-bounded1.Tpo -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bounded1.cc' object='nnc_bounded1-bounded1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.o `test -f 'bounded1.cc' || echo '$(srcdir)/'`bounded1.cc
+
+nnc_bounded1-bounded1.obj: bounded1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounded1-bounded1.obj -MD -MP -MF $(DEPDIR)/nnc_bounded1-bounded1.Tpo -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounded1-bounded1.Tpo $(DEPDIR)/nnc_bounded1-bounded1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bounded1.cc' object='nnc_bounded1-bounded1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounded1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounded1-bounded1.obj `if test -f 'bounded1.cc'; then $(CYGPATH_W) 'bounded1.cc'; else $(CYGPATH_W) '$(srcdir)/bounded1.cc'; fi`
+
+nnc_boundedaffineimage1-boundedaffineimage1.o: boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.o -MD -MP -MF $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.o `test -f 'boundedaffineimage1.cc' || echo '$(srcdir)/'`boundedaffineimage1.cc
+
+nnc_boundedaffineimage1-boundedaffineimage1.obj: boundedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffineimage1-boundedaffineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo $(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='boundedaffineimage1.cc' object='nnc_boundedaffineimage1-boundedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffineimage1-boundedaffineimage1.obj `if test -f 'boundedaffineimage1.cc'; then $(CYGPATH_W) 'boundedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffineimage1.cc'; fi`
+
+nnc_boundedaffinepreimage1-boundedaffinepreimage1.o: boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.o `test -f 'boundedaffinepreimage1.cc' || echo '$(srcdir)/'`boundedaffinepreimage1.cc
+
+nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj: boundedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1. [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo $(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='boundedaffinepreimage1.cc' object='nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedaffinepreimage1-boundedaffinepreimage1.obj `if test -f 'boundedaffinepreimage1.cc'; then $(CYGPATH_W) 'boundedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedaffinepreimage1.cc'; fi`
+
+nnc_boundedh79extrapolation1-boundedh79extrapolation1.o: boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.o `test -f 'boundedh79extrapolation1.cc' || echo '$(srcdir)/'`boundedh79extrapolation1.cc
+
+nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj: boundedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/bound [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo $(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='boundedh79extrapolation1.cc' object='nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundedh79extrapolation1-boundedh79extrapolation1.obj `if test -f 'boundedh79extrapolation1.cc'; then $(CYGPATH_W) 'boundedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/boundedh79extrapolation1.cc'; fi`
+
+nnc_bounds1-bounds1.o: bounds1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.o -MD -MP -MF $(DEPDIR)/nnc_bounds1-bounds1.Tpo -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bounds1.cc' object='nnc_bounds1-bounds1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.o `test -f 'bounds1.cc' || echo '$(srcdir)/'`bounds1.cc
+
+nnc_bounds1-bounds1.obj: bounds1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -MT nnc_bounds1-bounds1.obj -MD -MP -MF $(DEPDIR)/nnc_bounds1-bounds1.Tpo -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_bounds1-bounds1.Tpo $(DEPDIR)/nnc_bounds1-bounds1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='bounds1.cc' object='nnc_bounds1-bounds1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_bounds1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_bounds1-bounds1.obj `if test -f 'bounds1.cc'; then $(CYGPATH_W) 'bounds1.cc'; else $(CYGPATH_W) '$(srcdir)/bounds1.cc'; fi`
+
+nnc_concatenate1-concatenate1.o: concatenate1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.o -MD -MP -MF $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='concatenate1.cc' object='nnc_concatenate1-concatenate1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.o `test -f 'concatenate1.cc' || echo '$(srcdir)/'`concatenate1.cc
+
+nnc_concatenate1-concatenate1.obj: concatenate1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -MT nnc_concatenate1-concatenate1.obj -MD -MP -MF $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_concatenate1-concatenate1.Tpo $(DEPDIR)/nnc_concatenate1-concatenate1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='concatenate1.cc' object='nnc_concatenate1-concatenate1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_concatenate1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_concatenate1-concatenate1.obj `if test -f 'concatenate1.cc'; then $(CYGPATH_W) 'concatenate1.cc'; else $(CYGPATH_W) '$(srcdir)/concatenate1.cc'; fi`
+
+nnc_congruences1-congruences1.o: congruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.o -MD -MP -MF $(DEPDIR)/nnc_congruences1-congruences1.Tpo -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='congruences1.cc' object='nnc_congruences1-congruences1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.o `test -f 'congruences1.cc' || echo '$(srcdir)/'`congruences1.cc
+
+nnc_congruences1-congruences1.obj: congruences1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -MT nnc_congruences1-congruences1.obj -MD -MP -MF $(DEPDIR)/nnc_congruences1-congruences1.Tpo -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_congruences1-congruences1.Tpo $(DEPDIR)/nnc_congruences1-congruences1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='congruences1.cc' object='nnc_congruences1-congruences1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_congruences1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_congruences1-congruences1.obj `if test -f 'congruences1.cc'; then $(CYGPATH_W) 'congruences1.cc'; else $(CYGPATH_W) '$(srcdir)/congruences1.cc'; fi`
+
+nnc_constrains1-constrains1.o: constrains1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constrains1-constrains1.o -MD -MP -MF $(DEPDIR)/nnc_constrains1-constrains1.Tpo -c -o nnc_constrains1-constrains1.o `test -f 'constrains1.cc' || echo '$(srcdir)/'`constrains1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constrains1.cc' object='nnc_constrains1-constrains1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constrains1-constrains1.o `test -f 'constrains1.cc' || echo '$(srcdir)/'`constrains1.cc
+
+nnc_constrains1-constrains1.obj: constrains1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constrains1-constrains1.obj -MD -MP -MF $(DEPDIR)/nnc_constrains1-constrains1.Tpo -c -o nnc_constrains1-constrains1.obj `if test -f 'constrains1.cc'; then $(CYGPATH_W) 'constrains1.cc'; else $(CYGPATH_W) '$(srcdir)/constrains1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constrains1-constrains1.Tpo $(DEPDIR)/nnc_constrains1-constrains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constrains1.cc' object='nnc_constrains1-constrains1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constrains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constrains1-constrains1.obj `if test -f 'constrains1.cc'; then $(CYGPATH_W) 'constrains1.cc'; else $(CYGPATH_W) '$(srcdir)/constrains1.cc'; fi`
+
+nnc_constraints1-constraints1.o: constraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.o -MD -MP -MF $(DEPDIR)/nnc_constraints1-constraints1.Tpo -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constraints1.cc' object='nnc_constraints1-constraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.o `test -f 'constraints1.cc' || echo '$(srcdir)/'`constraints1.cc
+
+nnc_constraints1-constraints1.obj: constraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_constraints1-constraints1.obj -MD -MP -MF $(DEPDIR)/nnc_constraints1-constraints1.Tpo -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_constraints1-constraints1.Tpo $(DEPDIR)/nnc_constraints1-constraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='constraints1.cc' object='nnc_constraints1-constraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_constraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_constraints1-constraints1.obj `if test -f 'constraints1.cc'; then $(CYGPATH_W) 'constraints1.cc'; else $(CYGPATH_W) '$(srcdir)/constraints1.cc'; fi`
+
+nnc_contains1-contains1.o: contains1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.o -MD -MP -MF $(DEPDIR)/nnc_contains1-contains1.Tpo -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='contains1.cc' object='nnc_contains1-contains1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.o `test -f 'contains1.cc' || echo '$(srcdir)/'`contains1.cc
+
+nnc_contains1-contains1.obj: contains1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -MT nnc_contains1-contains1.obj -MD -MP -MF $(DEPDIR)/nnc_contains1-contains1.Tpo -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_contains1-contains1.Tpo $(DEPDIR)/nnc_contains1-contains1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='contains1.cc' object='nnc_contains1-contains1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_contains1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_contains1-contains1.obj `if test -f 'contains1.cc'; then $(CYGPATH_W) 'contains1.cc'; else $(CYGPATH_W) '$(srcdir)/contains1.cc'; fi`
+
+nnc_containsintegerpoint1-containsintegerpoint1.o: containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_containsintegerpoint1-containsintegerpoint1.o -MD -MP -MF $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo -c -o nnc_containsintegerpoint1-containsintegerpoint1.o `test -f 'containsintegerpoint1.cc' || echo '$(srcdir)/'`containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_containsintegerpoint1-containsintegerpoint1.o `test -f 'containsintegerpoint1.cc' || echo '$(srcdir)/'`containsintegerpoint1.cc
+
+nnc_containsintegerpoint1-containsintegerpoint1.obj: containsintegerpoint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_containsintegerpoint1-containsintegerpoint1.obj -MD -MP -MF $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo -c -o nnc_containsintegerpoint1-containsintegerpoint1.obj `if test -f 'containsintegerpoint1.cc'; then $(CYGPATH_W) 'containsintegerpoint1.cc'; else $(CYGPATH_W) '$(srcdir)/containsintegerpoint1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Tpo $(DEPDIR)/nnc_containsintegerpoint1-containsintegerpoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='containsintegerpoint1.cc' object='nnc_containsintegerpoint1-containsintegerpoint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_containsintegerpoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_containsintegerpoint1-containsintegerpoint1.obj `if test -f 'containsintegerpoint1.cc'; then $(CYGPATH_W) 'containsintegerpoint1.cc'; else $(CYGPATH_W) '$(srcdir)/containsintegerpoint1.cc'; fi`
+
+nnc_disjoint1-disjoint1.o: disjoint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.o -MD -MP -MF $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='disjoint1.cc' object='nnc_disjoint1-disjoint1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.o `test -f 'disjoint1.cc' || echo '$(srcdir)/'`disjoint1.cc
+
+nnc_disjoint1-disjoint1.obj: disjoint1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -MT nnc_disjoint1-disjoint1.obj -MD -MP -MF $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_disjoint1-disjoint1.Tpo $(DEPDIR)/nnc_disjoint1-disjoint1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='disjoint1.cc' object='nnc_disjoint1-disjoint1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_disjoint1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_disjoint1-disjoint1.obj `if test -f 'disjoint1.cc'; then $(CYGPATH_W) 'disjoint1.cc'; else $(CYGPATH_W) '$(srcdir)/disjoint1.cc'; fi`
+
+nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o: dropsomenonintegerpoints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o -MD -MP -MF $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o `test -f 'dropsomenonintegerpoints1.cc' || echo '$(srcdir)/'`dropsomenonintegerpoints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dropsomenonintegerpoints1.cc' object='nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.o `test -f 'dropsomenonintegerpoints1.cc' || echo '$(srcdir)/'`dropsomenonintegerpoints1.cc
+
+nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj: dropsomenonintegerpoints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj -MD -MP -MF $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj `if test -f 'dropsomenonintegerpoints1.cc'; then $(CYGPATH_W) 'dropsomenonintegerpoints1.cc'; else $(CYGPATH_W) '$(srcd [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Tpo $(DEPDIR)/nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='dropsomenonintegerpoints1.cc' object='nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_dropsomenonintegerpoints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_dropsomenonintegerpoints1-dropsomenonintegerpoints1.obj `if test -f 'dropsomenonintegerpoints1.cc'; then $(CYGPATH_W) 'dropsomenonintegerpoints1.cc'; else $(CYGPATH_W) '$(srcdir)/dropsomenonintegerpoints1.cc'; fi`
+
+nnc_empty1-empty1.o: empty1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.o -MD -MP -MF $(DEPDIR)/nnc_empty1-empty1.Tpo -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='empty1.cc' object='nnc_empty1-empty1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.o `test -f 'empty1.cc' || echo '$(srcdir)/'`empty1.cc
+
+nnc_empty1-empty1.obj: empty1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -MT nnc_empty1-empty1.obj -MD -MP -MF $(DEPDIR)/nnc_empty1-empty1.Tpo -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_empty1-empty1.Tpo $(DEPDIR)/nnc_empty1-empty1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='empty1.cc' object='nnc_empty1-empty1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_empty1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_empty1-empty1.obj `if test -f 'empty1.cc'; then $(CYGPATH_W) 'empty1.cc'; else $(CYGPATH_W) '$(srcdir)/empty1.cc'; fi`
+
+nnc_equals1-equals1.o: equals1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.o -MD -MP -MF $(DEPDIR)/nnc_equals1-equals1.Tpo -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='equals1.cc' object='nnc_equals1-equals1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.o `test -f 'equals1.cc' || echo '$(srcdir)/'`equals1.cc
+
+nnc_equals1-equals1.obj: equals1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -MT nnc_equals1-equals1.obj -MD -MP -MF $(DEPDIR)/nnc_equals1-equals1.Tpo -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_equals1-equals1.Tpo $(DEPDIR)/nnc_equals1-equals1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='equals1.cc' object='nnc_equals1-equals1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_equals1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_equals1-equals1.obj `if test -f 'equals1.cc'; then $(CYGPATH_W) 'equals1.cc'; else $(CYGPATH_W) '$(srcdir)/equals1.cc'; fi`
+
+nnc_exceptions1-exceptions1.o: exceptions1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.o -MD -MP -MF $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='exceptions1.cc' object='nnc_exceptions1-exceptions1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.o `test -f 'exceptions1.cc' || echo '$(srcdir)/'`exceptions1.cc
+
+nnc_exceptions1-exceptions1.obj: exceptions1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions1-exceptions1.obj -MD -MP -MF $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions1-exceptions1.Tpo $(DEPDIR)/nnc_exceptions1-exceptions1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='exceptions1.cc' object='nnc_exceptions1-exceptions1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions1-exceptions1.obj `if test -f 'exceptions1.cc'; then $(CYGPATH_W) 'exceptions1.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions1.cc'; fi`
+
+nnc_exceptions3-exceptions3.o: exceptions3.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.o -MD -MP -MF $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='exceptions3.cc' object='nnc_exceptions3-exceptions3.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.o `test -f 'exceptions3.cc' || echo '$(srcdir)/'`exceptions3.cc
+
+nnc_exceptions3-exceptions3.obj: exceptions3.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -MT nnc_exceptions3-exceptions3.obj -MD -MP -MF $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_exceptions3-exceptions3.Tpo $(DEPDIR)/nnc_exceptions3-exceptions3.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='exceptions3.cc' object='nnc_exceptions3-exceptions3.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_exceptions3_CXXFLAGS) $(CXXFLAGS) -c -o nnc_exceptions3-exceptions3.obj `if test -f 'exceptions3.cc'; then $(CYGPATH_W) 'exceptions3.cc'; else $(CYGPATH_W) '$(srcdir)/exceptions3.cc'; fi`
+
+nnc_expandspacedim1-expandspacedim1.o: expandspacedim1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.o -MD -MP -MF $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.o `test -f 'expandspacedim1.cc' || echo '$(srcdir)/'`expandspacedim1.cc
+
+nnc_expandspacedim1-expandspacedim1.obj: expandspacedim1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -MT nnc_expandspacedim1-expandspacedim1.obj -MD -MP -MF $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo $(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='expandspacedim1.cc' object='nnc_expandspacedim1-expandspacedim1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_expandspacedim1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_expandspacedim1-expandspacedim1.obj `if test -f 'expandspacedim1.cc'; then $(CYGPATH_W) 'expandspacedim1.cc'; else $(CYGPATH_W) '$(srcdir)/expandspacedim1.cc'; fi`
+
+nnc_foldspacedims1-foldspacedims1.o: foldspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.o `test -f 'foldspacedims1.cc' || echo '$(srcdir)/'`foldspacedims1.cc
+
+nnc_foldspacedims1-foldspacedims1.obj: foldspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_foldspacedims1-foldspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo $(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='foldspacedims1.cc' object='nnc_foldspacedims1-foldspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_foldspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_foldspacedims1-foldspacedims1.obj `if test -f 'foldspacedims1.cc'; then $(CYGPATH_W) 'foldspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/foldspacedims1.cc'; fi`
+
+nnc_frombdshape1-frombdshape1.o: frombdshape1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombdshape1-frombdshape1.o -MD -MP -MF $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo -c -o nnc_frombdshape1-frombdshape1.o `test -f 'frombdshape1.cc' || echo '$(srcdir)/'`frombdshape1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombdshape1-frombdshape1.o `test -f 'frombdshape1.cc' || echo '$(srcdir)/'`frombdshape1.cc
+
+nnc_frombdshape1-frombdshape1.obj: frombdshape1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombdshape1-frombdshape1.obj -MD -MP -MF $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo -c -o nnc_frombdshape1-frombdshape1.obj `if test -f 'frombdshape1.cc'; then $(CYGPATH_W) 'frombdshape1.cc'; else $(CYGPATH_W) '$(srcdir)/frombdshape1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombdshape1-frombdshape1.Tpo $(DEPDIR)/nnc_frombdshape1-frombdshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='frombdshape1.cc' object='nnc_frombdshape1-frombdshape1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombdshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombdshape1-frombdshape1.obj `if test -f 'frombdshape1.cc'; then $(CYGPATH_W) 'frombdshape1.cc'; else $(CYGPATH_W) '$(srcdir)/frombdshape1.cc'; fi`
+
+nnc_frombox1-frombox1.o: frombox1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombox1-frombox1.o -MD -MP -MF $(DEPDIR)/nnc_frombox1-frombox1.Tpo -c -o nnc_frombox1-frombox1.o `test -f 'frombox1.cc' || echo '$(srcdir)/'`frombox1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='frombox1.cc' object='nnc_frombox1-frombox1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombox1-frombox1.o `test -f 'frombox1.cc' || echo '$(srcdir)/'`frombox1.cc
+
+nnc_frombox1-frombox1.obj: frombox1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_frombox1-frombox1.obj -MD -MP -MF $(DEPDIR)/nnc_frombox1-frombox1.Tpo -c -o nnc_frombox1-frombox1.obj `if test -f 'frombox1.cc'; then $(CYGPATH_W) 'frombox1.cc'; else $(CYGPATH_W) '$(srcdir)/frombox1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_frombox1-frombox1.Tpo $(DEPDIR)/nnc_frombox1-frombox1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='frombox1.cc' object='nnc_frombox1-frombox1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_frombox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_frombox1-frombox1.obj `if test -f 'frombox1.cc'; then $(CYGPATH_W) 'frombox1.cc'; else $(CYGPATH_W) '$(srcdir)/frombox1.cc'; fi`
+
+nnc_fromgrid1-fromgrid1.o: fromgrid1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromgrid1-fromgrid1.o -MD -MP -MF $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo -c -o nnc_fromgrid1-fromgrid1.o `test -f 'fromgrid1.cc' || echo '$(srcdir)/'`fromgrid1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromgrid1-fromgrid1.o `test -f 'fromgrid1.cc' || echo '$(srcdir)/'`fromgrid1.cc
+
+nnc_fromgrid1-fromgrid1.obj: fromgrid1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromgrid1-fromgrid1.obj -MD -MP -MF $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo -c -o nnc_fromgrid1-fromgrid1.obj `if test -f 'fromgrid1.cc'; then $(CYGPATH_W) 'fromgrid1.cc'; else $(CYGPATH_W) '$(srcdir)/fromgrid1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromgrid1-fromgrid1.Tpo $(DEPDIR)/nnc_fromgrid1-fromgrid1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='fromgrid1.cc' object='nnc_fromgrid1-fromgrid1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromgrid1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromgrid1-fromgrid1.obj `if test -f 'fromgrid1.cc'; then $(CYGPATH_W) 'fromgrid1.cc'; else $(CYGPATH_W) '$(srcdir)/fromgrid1.cc'; fi`
+
+nnc_fromoctagonalshape1-fromoctagonalshape1.o: fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromoctagonalshape1-fromoctagonalshape1.o -MD -MP -MF $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.o `test -f 'fromoctagonalshape1.cc' || echo '$(srcdir)/'`fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.o `test -f 'fromoctagonalshape1.cc' || echo '$(srcdir)/'`fromoctagonalshape1.cc
+
+nnc_fromoctagonalshape1-fromoctagonalshape1.obj: fromoctagonalshape1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -MT nnc_fromoctagonalshape1-fromoctagonalshape1.obj -MD -MP -MF $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.obj `if test -f 'fromoctagonalshape1.cc'; then $(CYGPATH_W) 'fromoctagonalshape1.cc'; else $(CYGPATH_W) '$(srcdir)/fromoctagonalshape1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Tpo $(DEPDIR)/nnc_fromoctagonalshape1-fromoctagonalshape1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='fromoctagonalshape1.cc' object='nnc_fromoctagonalshape1-fromoctagonalshape1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_fromoctagonalshape1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_fromoctagonalshape1-fromoctagonalshape1.obj `if test -f 'fromoctagonalshape1.cc'; then $(CYGPATH_W) 'fromoctagonalshape1.cc'; else $(CYGPATH_W) '$(srcdir)/fromoctagonalshape1.cc'; fi`
+
+nnc_generalizedaffineimage1-generalizedaffineimage1.o: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.o -MD -MP -MF $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.o `test -f 'generalizedaffineimage1.cc' || echo '$(srcdir)/'`generalizedaffineimage1.cc
+
+nnc_generalizedaffineimage1-generalizedaffineimage1.obj: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffineimage1-generalizedaffineimage1.obj -MD -MP -MF $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaff [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo $(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='generalizedaffineimage1.cc' object='nnc_generalizedaffineimage1-generalizedaffineimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffineimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffineimage1-generalizedaffineimage1.obj `if test -f 'generalizedaffineimage1.cc'; then $(CYGPATH_W) 'generalizedaffineimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffineimage1.cc'; fi`
+
+nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o: generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o -MD -MP -MF $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.o `test -f 'generalizedaffinepreimage1.cc' || echo '$(srcdir)/'`generalizedaffinepreimage1.cc
+
+nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj: generalizedaffinepreimage1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj -MD -MP -MF $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo $(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='generalizedaffinepreimage1.cc' object='nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generalizedaffinepreimage1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.obj `if test -f 'generalizedaffinepreimage1.cc'; then $(CYGPATH_W) 'generalizedaffinepreimage1.cc'; else $(CYGPATH_W) '$(srcdir)/generalizedaffinepreimage1.cc'; fi`
+
+nnc_generators1-generators1.o: generators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.o -MD -MP -MF $(DEPDIR)/nnc_generators1-generators1.Tpo -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='generators1.cc' object='nnc_generators1-generators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.o `test -f 'generators1.cc' || echo '$(srcdir)/'`generators1.cc
+
+nnc_generators1-generators1.obj: generators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_generators1-generators1.obj -MD -MP -MF $(DEPDIR)/nnc_generators1-generators1.Tpo -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_generators1-generators1.Tpo $(DEPDIR)/nnc_generators1-generators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='generators1.cc' object='nnc_generators1-generators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_generators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_generators1-generators1.obj `if test -f 'generators1.cc'; then $(CYGPATH_W) 'generators1.cc'; else $(CYGPATH_W) '$(srcdir)/generators1.cc'; fi`
+
+nnc_geomcovers1-geomcovers1.o: geomcovers1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.o -MD -MP -MF $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.o `test -f 'geomcovers1.cc' || echo '$(srcdir)/'`geomcovers1.cc
+
+nnc_geomcovers1-geomcovers1.obj: geomcovers1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -MT nnc_geomcovers1-geomcovers1.obj -MD -MP -MF $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo $(DEPDIR)/nnc_geomcovers1-geomcovers1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='geomcovers1.cc' object='nnc_geomcovers1-geomcovers1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_geomcovers1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_geomcovers1-geomcovers1.obj `if test -f 'geomcovers1.cc'; then $(CYGPATH_W) 'geomcovers1.cc'; else $(CYGPATH_W) '$(srcdir)/geomcovers1.cc'; fi`
+
+nnc_h79widening1-h79widening1.o: h79widening1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.o -MD -MP -MF $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='h79widening1.cc' object='nnc_h79widening1-h79widening1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.o `test -f 'h79widening1.cc' || echo '$(srcdir)/'`h79widening1.cc
+
+nnc_h79widening1-h79widening1.obj: h79widening1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -MT nnc_h79widening1-h79widening1.obj -MD -MP -MF $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_h79widening1-h79widening1.Tpo $(DEPDIR)/nnc_h79widening1-h79widening1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='h79widening1.cc' object='nnc_h79widening1-h79widening1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_h79widening1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_h79widening1-h79widening1.obj `if test -f 'h79widening1.cc'; then $(CYGPATH_W) 'h79widening1.cc'; else $(CYGPATH_W) '$(srcdir)/h79widening1.cc'; fi`
+
+nnc_intersection1-intersection1.o: intersection1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.o -MD -MP -MF $(DEPDIR)/nnc_intersection1-intersection1.Tpo -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='intersection1.cc' object='nnc_intersection1-intersection1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.o `test -f 'intersection1.cc' || echo '$(srcdir)/'`intersection1.cc
+
+nnc_intersection1-intersection1.obj: intersection1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -MT nnc_intersection1-intersection1.obj -MD -MP -MF $(DEPDIR)/nnc_intersection1-intersection1.Tpo -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_intersection1-intersection1.Tpo $(DEPDIR)/nnc_intersection1-intersection1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='intersection1.cc' object='nnc_intersection1-intersection1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_intersection1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_intersection1-intersection1.obj `if test -f 'intersection1.cc'; then $(CYGPATH_W) 'intersection1.cc'; else $(CYGPATH_W) '$(srcdir)/intersection1.cc'; fi`
+
+nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o: limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.o `test -f 'limitedbhrz03extrapolation1.cc' || echo '$(srcdir)/'`limitedbhrz03extrapolation1.cc
+
+nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj: limitedbhrz03extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $( [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo $(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='limitedbhrz03extrapolation1.cc' object='nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedbhrz03extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.obj `if test -f 'limitedbhrz03extrapolation1.cc'; then $(CYGPATH_W) 'limitedbhrz03extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedbhrz03extrapolation1.cc'; fi`
+
+nnc_limitedh79extrapolation1-limitedh79extrapolation1.o: limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.o -MD -MP -MF $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.o `test -f 'limitedh79extrapolation1.cc' || echo '$(srcdir)/'`limitedh79extrapolation1.cc
+
+nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj: limitedh79extrapolation1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -MT nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj -MD -MP -MF $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limit [...]
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo $(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='limitedh79extrapolation1.cc' object='nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_limitedh79extrapolation1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_limitedh79extrapolation1-limitedh79extrapolation1.obj `if test -f 'limitedh79extrapolation1.cc'; then $(CYGPATH_W) 'limitedh79extrapolation1.cc'; else $(CYGPATH_W) '$(srcdir)/limitedh79extrapolation1.cc'; fi`
+
+nnc_linearpartition1-linearpartition1.o: linearpartition1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.o -MD -MP -MF $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.o `test -f 'linearpartition1.cc' || echo '$(srcdir)/'`linearpartition1.cc
+
+nnc_linearpartition1-linearpartition1.obj: linearpartition1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -MT nnc_linearpartition1-linearpartition1.obj -MD -MP -MF $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo $(DEPDIR)/nnc_linearpartition1-linearpartition1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='linearpartition1.cc' object='nnc_linearpartition1-linearpartition1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_linearpartition1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_linearpartition1-linearpartition1.obj `if test -f 'linearpartition1.cc'; then $(CYGPATH_W) 'linearpartition1.cc'; else $(CYGPATH_W) '$(srcdir)/linearpartition1.cc'; fi`
+
+nnc_mapspacedims1-mapspacedims1.o: mapspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.o -MD -MP -MF $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.o `test -f 'mapspacedims1.cc' || echo '$(srcdir)/'`mapspacedims1.cc
+
+nnc_mapspacedims1-mapspacedims1.obj: mapspacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mapspacedims1-mapspacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo $(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mapspacedims1.cc' object='nnc_mapspacedims1-mapspacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mapspacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mapspacedims1-mapspacedims1.obj `if test -f 'mapspacedims1.cc'; then $(CYGPATH_W) 'mapspacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/mapspacedims1.cc'; fi`
+
+nnc_max_min1-max_min1.o: max_min1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.o -MD -MP -MF $(DEPDIR)/nnc_max_min1-max_min1.Tpo -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='max_min1.cc' object='nnc_max_min1-max_min1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.o `test -f 'max_min1.cc' || echo '$(srcdir)/'`max_min1.cc
+
+nnc_max_min1-max_min1.obj: max_min1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -MT nnc_max_min1-max_min1.obj -MD -MP -MF $(DEPDIR)/nnc_max_min1-max_min1.Tpo -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_max_min1-max_min1.Tpo $(DEPDIR)/nnc_max_min1-max_min1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='max_min1.cc' object='nnc_max_min1-max_min1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_max_min1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_max_min1-max_min1.obj `if test -f 'max_min1.cc'; then $(CYGPATH_W) 'max_min1.cc'; else $(CYGPATH_W) '$(srcdir)/max_min1.cc'; fi`
+
+nnc_mc91-mc91.o: mc91.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.o -MD -MP -MF $(DEPDIR)/nnc_mc91-mc91.Tpo -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mc91.cc' object='nnc_mc91-mc91.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.o `test -f 'mc91.cc' || echo '$(srcdir)/'`mc91.cc
+
+nnc_mc91-mc91.obj: mc91.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -MT nnc_mc91-mc91.obj -MD -MP -MF $(DEPDIR)/nnc_mc91-mc91.Tpo -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mc91-mc91.Tpo $(DEPDIR)/nnc_mc91-mc91.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mc91.cc' object='nnc_mc91-mc91.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mc91_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mc91-mc91.obj `if test -f 'mc91.cc'; then $(CYGPATH_W) 'mc91.cc'; else $(CYGPATH_W) '$(srcdir)/mc91.cc'; fi`
+
+nnc_membytes1-membytes1.o: membytes1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.o -MD -MP -MF $(DEPDIR)/nnc_membytes1-membytes1.Tpo -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='membytes1.cc' object='nnc_membytes1-membytes1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.o `test -f 'membytes1.cc' || echo '$(srcdir)/'`membytes1.cc
+
+nnc_membytes1-membytes1.obj: membytes1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes1-membytes1.obj -MD -MP -MF $(DEPDIR)/nnc_membytes1-membytes1.Tpo -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_membytes1-membytes1.Tpo $(DEPDIR)/nnc_membytes1-membytes1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='membytes1.cc' object='nnc_membytes1-membytes1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes1-membytes1.obj `if test -f 'membytes1.cc'; then $(CYGPATH_W) 'membytes1.cc'; else $(CYGPATH_W) '$(srcdir)/membytes1.cc'; fi`
+
+nnc_minconstraints1-minconstraints1.o: minconstraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.o -MD -MP -MF $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.o `test -f 'minconstraints1.cc' || echo '$(srcdir)/'`minconstraints1.cc
+
+nnc_minconstraints1-minconstraints1.obj: minconstraints1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -MT nnc_minconstraints1-minconstraints1.obj -MD -MP -MF $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo $(DEPDIR)/nnc_minconstraints1-minconstraints1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='minconstraints1.cc' object='nnc_minconstraints1-minconstraints1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_minconstraints1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_minconstraints1-minconstraints1.obj `if test -f 'minconstraints1.cc'; then $(CYGPATH_W) 'minconstraints1.cc'; else $(CYGPATH_W) '$(srcdir)/minconstraints1.cc'; fi`
+
+nnc_mingenerators1-mingenerators1.o: mingenerators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.o -MD -MP -MF $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.o `test -f 'mingenerators1.cc' || echo '$(srcdir)/'`mingenerators1.cc
+
+nnc_mingenerators1-mingenerators1.obj: mingenerators1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -MT nnc_mingenerators1-mingenerators1.obj -MD -MP -MF $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo $(DEPDIR)/nnc_mingenerators1-mingenerators1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='mingenerators1.cc' object='nnc_mingenerators1-mingenerators1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_mingenerators1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_mingenerators1-mingenerators1.obj `if test -f 'mingenerators1.cc'; then $(CYGPATH_W) 'mingenerators1.cc'; else $(CYGPATH_W) '$(srcdir)/mingenerators1.cc'; fi`
+
+nnc_onepoint-onepoint.o: onepoint.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.o -MD -MP -MF $(DEPDIR)/nnc_onepoint-onepoint.Tpo -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='onepoint.cc' object='nnc_onepoint-onepoint.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.o `test -f 'onepoint.cc' || echo '$(srcdir)/'`onepoint.cc
+
+nnc_onepoint-onepoint.obj: onepoint.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -MT nnc_onepoint-onepoint.obj -MD -MP -MF $(DEPDIR)/nnc_onepoint-onepoint.Tpo -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_onepoint-onepoint.Tpo $(DEPDIR)/nnc_onepoint-onepoint.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='onepoint.cc' object='nnc_onepoint-onepoint.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_onepoint_CXXFLAGS) $(CXXFLAGS) -c -o nnc_onepoint-onepoint.obj `if test -f 'onepoint.cc'; then $(CYGPATH_W) 'onepoint.cc'; else $(CYGPATH_W) '$(srcdir)/onepoint.cc'; fi`
+
+nnc_permute-permute.o: permute.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.o -MD -MP -MF $(DEPDIR)/nnc_permute-permute.Tpo -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='permute.cc' object='nnc_permute-permute.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.o `test -f 'permute.cc' || echo '$(srcdir)/'`permute.cc
+
+nnc_permute-permute.obj: permute.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -MT nnc_permute-permute.obj -MD -MP -MF $(DEPDIR)/nnc_permute-permute.Tpo -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_permute-permute.Tpo $(DEPDIR)/nnc_permute-permute.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='permute.cc' object='nnc_permute-permute.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_permute_CXXFLAGS) $(CXXFLAGS) -c -o nnc_permute-permute.obj `if test -f 'permute.cc'; then $(CYGPATH_W) 'permute.cc'; else $(CYGPATH_W) '$(srcdir)/permute.cc'; fi`
+
+nnc_polydifference1-polydifference1.o: polydifference1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.o -MD -MP -MF $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='polydifference1.cc' object='nnc_polydifference1-polydifference1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.o `test -f 'polydifference1.cc' || echo '$(srcdir)/'`polydifference1.cc
+
+nnc_polydifference1-polydifference1.obj: polydifference1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polydifference1-polydifference1.obj -MD -MP -MF $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polydifference1-polydifference1.Tpo $(DEPDIR)/nnc_polydifference1-polydifference1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='polydifference1.cc' object='nnc_polydifference1-polydifference1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polydifference1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polydifference1-polydifference1.obj `if test -f 'polydifference1.cc'; then $(CYGPATH_W) 'polydifference1.cc'; else $(CYGPATH_W) '$(srcdir)/polydifference1.cc'; fi`
+
+nnc_polyhull1-polyhull1.o: polyhull1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.o -MD -MP -MF $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='polyhull1.cc' object='nnc_polyhull1-polyhull1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.o `test -f 'polyhull1.cc' || echo '$(srcdir)/'`polyhull1.cc
+
+nnc_polyhull1-polyhull1.obj: polyhull1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhull1-polyhull1.obj -MD -MP -MF $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhull1-polyhull1.Tpo $(DEPDIR)/nnc_polyhull1-polyhull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='polyhull1.cc' object='nnc_polyhull1-polyhull1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhull1-polyhull1.obj `if test -f 'polyhull1.cc'; then $(CYGPATH_W) 'polyhull1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhull1.cc'; fi`
+
+nnc_polyhullifexact1-polyhullifexact1.o: polyhullifexact1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhullifexact1-polyhullifexact1.o -MD -MP -MF $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo -c -o nnc_polyhullifexact1-polyhullifexact1.o `test -f 'polyhullifexact1.cc' || echo '$(srcdir)/'`polyhullifexact1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='polyhullifexact1.cc' object='nnc_polyhullifexact1-polyhullifexact1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhullifexact1-polyhullifexact1.o `test -f 'polyhullifexact1.cc' || echo '$(srcdir)/'`polyhullifexact1.cc
+
+nnc_polyhullifexact1-polyhullifexact1.obj: polyhullifexact1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -MT nnc_polyhullifexact1-polyhullifexact1.obj -MD -MP -MF $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo -c -o nnc_polyhullifexact1-polyhullifexact1.obj `if test -f 'polyhullifexact1.cc'; then $(CYGPATH_W) 'polyhullifexact1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhullifexact1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Tpo $(DEPDIR)/nnc_polyhullifexact1-polyhullifexact1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='polyhullifexact1.cc' object='nnc_polyhullifexact1-polyhullifexact1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_polyhullifexact1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_polyhullifexact1-polyhullifexact1.obj `if test -f 'polyhullifexact1.cc'; then $(CYGPATH_W) 'polyhullifexact1.cc'; else $(CYGPATH_W) '$(srcdir)/polyhullifexact1.cc'; fi`
+
+nnc_randphull1-randphull1.o: randphull1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.o -MD -MP -MF $(DEPDIR)/nnc_randphull1-randphull1.Tpo -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='randphull1.cc' object='nnc_randphull1-randphull1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.o `test -f 'randphull1.cc' || echo '$(srcdir)/'`randphull1.cc
+
+nnc_randphull1-randphull1.obj: randphull1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull1-randphull1.obj -MD -MP -MF $(DEPDIR)/nnc_randphull1-randphull1.Tpo -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_randphull1-randphull1.Tpo $(DEPDIR)/nnc_randphull1-randphull1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='randphull1.cc' object='nnc_randphull1-randphull1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull1-randphull1.obj `if test -f 'randphull1.cc'; then $(CYGPATH_W) 'randphull1.cc'; else $(CYGPATH_W) '$(srcdir)/randphull1.cc'; fi`
+
+nnc_relations1-relations1.o: relations1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.o -MD -MP -MF $(DEPDIR)/nnc_relations1-relations1.Tpo -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='relations1.cc' object='nnc_relations1-relations1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.o `test -f 'relations1.cc' || echo '$(srcdir)/'`relations1.cc
+
+nnc_relations1-relations1.obj: relations1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations1-relations1.obj -MD -MP -MF $(DEPDIR)/nnc_relations1-relations1.Tpo -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations1-relations1.Tpo $(DEPDIR)/nnc_relations1-relations1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='relations1.cc' object='nnc_relations1-relations1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations1-relations1.obj `if test -f 'relations1.cc'; then $(CYGPATH_W) 'relations1.cc'; else $(CYGPATH_W) '$(srcdir)/relations1.cc'; fi`
+
+nnc_relations2-relations2.o: relations2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.o -MD -MP -MF $(DEPDIR)/nnc_relations2-relations2.Tpo -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='relations2.cc' object='nnc_relations2-relations2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.o `test -f 'relations2.cc' || echo '$(srcdir)/'`relations2.cc
+
+nnc_relations2-relations2.obj: relations2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -MT nnc_relations2-relations2.obj -MD -MP -MF $(DEPDIR)/nnc_relations2-relations2.Tpo -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_relations2-relations2.Tpo $(DEPDIR)/nnc_relations2-relations2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='relations2.cc' object='nnc_relations2-relations2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_relations2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_relations2-relations2.obj `if test -f 'relations2.cc'; then $(CYGPATH_W) 'relations2.cc'; else $(CYGPATH_W) '$(srcdir)/relations2.cc'; fi`
+
+nnc_removespacedims1-removespacedims1.o: removespacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.o -MD -MP -MF $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.o `test -f 'removespacedims1.cc' || echo '$(srcdir)/'`removespacedims1.cc
+
+nnc_removespacedims1-removespacedims1.obj: removespacedims1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -MT nnc_removespacedims1-removespacedims1.obj -MD -MP -MF $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo $(DEPDIR)/nnc_removespacedims1-removespacedims1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='removespacedims1.cc' object='nnc_removespacedims1-removespacedims1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_removespacedims1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_removespacedims1-removespacedims1.obj `if test -f 'removespacedims1.cc'; then $(CYGPATH_W) 'removespacedims1.cc'; else $(CYGPATH_W) '$(srcdir)/removespacedims1.cc'; fi`
+
+nnc_simplifyusingcontext1-simplifyusingcontext1.o: simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -MT nnc_simplifyusingcontext1-simplifyusingcontext1.o -MD -MP -MF $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.o `test -f 'simplifyusingcontext1.cc' || echo '$(srcdir)/'`simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.o `test -f 'simplifyusingcontext1.cc' || echo '$(srcdir)/'`simplifyusingcontext1.cc
+
+nnc_simplifyusingcontext1-simplifyusingcontext1.obj: simplifyusingcontext1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -MT nnc_simplifyusingcontext1-simplifyusingcontext1.obj -MD -MP -MF $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.obj `if test -f 'simplifyusingcontext1.cc'; then $(CYGPATH_W) 'simplifyusingcontext1.cc'; else $(CYGPATH_W) '$(srcdir)/simplifyusingcontext1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Tpo $(DEPDIR)/nnc_simplifyusingcontext1-simplifyusingcontext1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='simplifyusingcontext1.cc' object='nnc_simplifyusingcontext1-simplifyusingcontext1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_simplifyusingcontext1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_simplifyusingcontext1-simplifyusingcontext1.obj `if test -f 'simplifyusingcontext1.cc'; then $(CYGPATH_W) 'simplifyusingcontext1.cc'; else $(CYGPATH_W) '$(srcdir)/simplifyusingcontext1.cc'; fi`
+
+nnc_smm1-smm1.o: smm1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.o -MD -MP -MF $(DEPDIR)/nnc_smm1-smm1.Tpo -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='smm1.cc' object='nnc_smm1-smm1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.o `test -f 'smm1.cc' || echo '$(srcdir)/'`smm1.cc
+
+nnc_smm1-smm1.obj: smm1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -MT nnc_smm1-smm1.obj -MD -MP -MF $(DEPDIR)/nnc_smm1-smm1.Tpo -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_smm1-smm1.Tpo $(DEPDIR)/nnc_smm1-smm1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='smm1.cc' object='nnc_smm1-smm1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_smm1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_smm1-smm1.obj `if test -f 'smm1.cc'; then $(CYGPATH_W) 'smm1.cc'; else $(CYGPATH_W) '$(srcdir)/smm1.cc'; fi`
+
+nnc_timeelapse1-timeelapse1.o: timeelapse1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.o -MD -MP -MF $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.o `test -f 'timeelapse1.cc' || echo '$(srcdir)/'`timeelapse1.cc
+
+nnc_timeelapse1-timeelapse1.obj: timeelapse1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -MT nnc_timeelapse1-timeelapse1.obj -MD -MP -MF $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo $(DEPDIR)/nnc_timeelapse1-timeelapse1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='timeelapse1.cc' object='nnc_timeelapse1-timeelapse1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_timeelapse1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_timeelapse1-timeelapse1.obj `if test -f 'timeelapse1.cc'; then $(CYGPATH_W) 'timeelapse1.cc'; else $(CYGPATH_W) '$(srcdir)/timeelapse1.cc'; fi`
+
+nnc_unconstrain1-unconstrain1.o: unconstrain1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -MT nnc_unconstrain1-unconstrain1.o -MD -MP -MF $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo -c -o nnc_unconstrain1-unconstrain1.o `test -f 'unconstrain1.cc' || echo '$(srcdir)/'`unconstrain1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_unconstrain1-unconstrain1.o `test -f 'unconstrain1.cc' || echo '$(srcdir)/'`unconstrain1.cc
+
+nnc_unconstrain1-unconstrain1.obj: unconstrain1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -MT nnc_unconstrain1-unconstrain1.obj -MD -MP -MF $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo -c -o nnc_unconstrain1-unconstrain1.obj `if test -f 'unconstrain1.cc'; then $(CYGPATH_W) 'unconstrain1.cc'; else $(CYGPATH_W) '$(srcdir)/unconstrain1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_unconstrain1-unconstrain1.Tpo $(DEPDIR)/nnc_unconstrain1-unconstrain1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='unconstrain1.cc' object='nnc_unconstrain1-unconstrain1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_unconstrain1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_unconstrain1-unconstrain1.obj `if test -f 'unconstrain1.cc'; then $(CYGPATH_W) 'unconstrain1.cc'; else $(CYGPATH_W) '$(srcdir)/unconstrain1.cc'; fi`
+
+nnc_universe1-universe1.o: universe1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.o -MD -MP -MF $(DEPDIR)/nnc_universe1-universe1.Tpo -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='universe1.cc' object='nnc_universe1-universe1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.o `test -f 'universe1.cc' || echo '$(srcdir)/'`universe1.cc
+
+nnc_universe1-universe1.obj: universe1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -MT nnc_universe1-universe1.obj -MD -MP -MF $(DEPDIR)/nnc_universe1-universe1.Tpo -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_universe1-universe1.Tpo $(DEPDIR)/nnc_universe1-universe1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='universe1.cc' object='nnc_universe1-universe1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_universe1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_universe1-universe1.obj `if test -f 'universe1.cc'; then $(CYGPATH_W) 'universe1.cc'; else $(CYGPATH_W) '$(srcdir)/universe1.cc'; fi`
+
+nnc_wrap1-wrap1.o: wrap1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap1-wrap1.o -MD -MP -MF $(DEPDIR)/nnc_wrap1-wrap1.Tpo -c -o nnc_wrap1-wrap1.o `test -f 'wrap1.cc' || echo '$(srcdir)/'`wrap1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap1-wrap1.Tpo $(DEPDIR)/nnc_wrap1-wrap1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wrap1.cc' object='nnc_wrap1-wrap1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap1-wrap1.o `test -f 'wrap1.cc' || echo '$(srcdir)/'`wrap1.cc
+
+nnc_wrap1-wrap1.obj: wrap1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap1-wrap1.obj -MD -MP -MF $(DEPDIR)/nnc_wrap1-wrap1.Tpo -c -o nnc_wrap1-wrap1.obj `if test -f 'wrap1.cc'; then $(CYGPATH_W) 'wrap1.cc'; else $(CYGPATH_W) '$(srcdir)/wrap1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap1-wrap1.Tpo $(DEPDIR)/nnc_wrap1-wrap1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wrap1.cc' object='nnc_wrap1-wrap1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap1-wrap1.obj `if test -f 'wrap1.cc'; then $(CYGPATH_W) 'wrap1.cc'; else $(CYGPATH_W) '$(srcdir)/wrap1.cc'; fi`
+
+nnc_wrap2-wrap2.o: wrap2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap2-wrap2.o -MD -MP -MF $(DEPDIR)/nnc_wrap2-wrap2.Tpo -c -o nnc_wrap2-wrap2.o `test -f 'wrap2.cc' || echo '$(srcdir)/'`wrap2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap2-wrap2.Tpo $(DEPDIR)/nnc_wrap2-wrap2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wrap2.cc' object='nnc_wrap2-wrap2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap2-wrap2.o `test -f 'wrap2.cc' || echo '$(srcdir)/'`wrap2.cc
+
+nnc_wrap2-wrap2.obj: wrap2.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -MT nnc_wrap2-wrap2.obj -MD -MP -MF $(DEPDIR)/nnc_wrap2-wrap2.Tpo -c -o nnc_wrap2-wrap2.obj `if test -f 'wrap2.cc'; then $(CYGPATH_W) 'wrap2.cc'; else $(CYGPATH_W) '$(srcdir)/wrap2.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_wrap2-wrap2.Tpo $(DEPDIR)/nnc_wrap2-wrap2.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='wrap2.cc' object='nnc_wrap2-wrap2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_wrap2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_wrap2-wrap2.obj `if test -f 'wrap2.cc'; then $(CYGPATH_W) 'wrap2.cc'; else $(CYGPATH_W) '$(srcdir)/wrap2.cc'; fi`
+
+nnc_writepolyhedron1-writepolyhedron1.o: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.o -MD -MP -MF $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.o `test -f 'writepolyhedron1.cc' || echo '$(srcdir)/'`writepolyhedron1.cc
+
+nnc_writepolyhedron1-writepolyhedron1.obj: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -MT nnc_writepolyhedron1-writepolyhedron1.obj -MD -MP -MF $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo $(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='writepolyhedron1.cc' object='nnc_writepolyhedron1-writepolyhedron1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_writepolyhedron1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_writepolyhedron1-writepolyhedron1.obj `if test -f 'writepolyhedron1.cc'; then $(CYGPATH_W) 'writepolyhedron1.cc'; else $(CYGPATH_W) '$(srcdir)/writepolyhedron1.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+addcongruence1.log: addcongruence1$(EXEEXT)
+	@p='addcongruence1$(EXEEXT)'; \
+	b='addcongruence1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addcongruences1.log: addcongruences1$(EXEEXT)
+	@p='addcongruences1$(EXEEXT)'; \
+	b='addcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraint1.log: addconstraint1$(EXEEXT)
+	@p='addconstraint1$(EXEEXT)'; \
+	b='addconstraint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints1.log: addconstraints1$(EXEEXT)
+	@p='addconstraints1$(EXEEXT)'; \
+	b='addconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints2.log: addconstraints2$(EXEEXT)
+	@p='addconstraints2$(EXEEXT)'; \
+	b='addconstraints2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerator1.log: addgenerator1$(EXEEXT)
+	@p='addgenerator1$(EXEEXT)'; \
+	b='addgenerator1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerator2.log: addgenerator2$(EXEEXT)
+	@p='addgenerator2$(EXEEXT)'; \
+	b='addgenerator2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerators1.log: addgenerators1$(EXEEXT)
+	@p='addgenerators1$(EXEEXT)'; \
+	b='addgenerators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addgenerators2.log: addgenerators2$(EXEEXT)
+	@p='addgenerators2$(EXEEXT)'; \
+	b='addgenerators2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addspacedims1.log: addspacedims1$(EXEEXT)
+	@p='addspacedims1$(EXEEXT)'; \
+	b='addspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addspacedims2.log: addspacedims2$(EXEEXT)
+	@p='addspacedims2$(EXEEXT)'; \
+	b='addspacedims2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+	@p='affineimage1$(EXEEXT)'; \
+	b='affineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage2.log: affineimage2$(EXEEXT)
+	@p='affineimage2$(EXEEXT)'; \
+	b='affineimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage1.log: affinepreimage1$(EXEEXT)
+	@p='affinepreimage1$(EXEEXT)'; \
+	b='affinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinetrans.log: affinetrans$(EXEEXT)
+	@p='affinetrans$(EXEEXT)'; \
+	b='affinetrans'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+append1.log: append1$(EXEEXT)
+	@p='append1$(EXEEXT)'; \
+	b='append1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+append2.log: append2$(EXEEXT)
+	@p='append2$(EXEEXT)'; \
+	b='append2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ascii_dump_load1.log: ascii_dump_load1$(EXEEXT)
+	@p='ascii_dump_load1$(EXEEXT)'; \
+	b='ascii_dump_load1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ascii_dump_load2.log: ascii_dump_load2$(EXEEXT)
+	@p='ascii_dump_load2$(EXEEXT)'; \
+	b='ascii_dump_load2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ascii_dump_load3.log: ascii_dump_load3$(EXEEXT)
+	@p='ascii_dump_load3$(EXEEXT)'; \
+	b='ascii_dump_load3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bgp99extrapolation1.log: bgp99extrapolation1$(EXEEXT)
+	@p='bgp99extrapolation1$(EXEEXT)'; \
+	b='bgp99extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bgp99extrapolation2.log: bgp99extrapolation2$(EXEEXT)
+	@p='bgp99extrapolation2$(EXEEXT)'; \
+	b='bgp99extrapolation2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bhrz03widening1.log: bhrz03widening1$(EXEEXT)
+	@p='bhrz03widening1$(EXEEXT)'; \
+	b='bhrz03widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bhrz03widening2.log: bhrz03widening2$(EXEEXT)
+	@p='bhrz03widening2$(EXEEXT)'; \
+	b='bhrz03widening2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bhrz03widening3.log: bhrz03widening3$(EXEEXT)
+	@p='bhrz03widening3$(EXEEXT)'; \
+	b='bhrz03widening3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bhz03widening1.log: bhz03widening1$(EXEEXT)
+	@p='bhz03widening1$(EXEEXT)'; \
+	b='bhz03widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+	@p='bounded1$(EXEEXT)'; \
+	b='bounded1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffineimage1.log: boundedaffineimage1$(EXEEXT)
+	@p='boundedaffineimage1$(EXEEXT)'; \
+	b='boundedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedaffinepreimage1.log: boundedaffinepreimage1$(EXEEXT)
+	@p='boundedaffinepreimage1$(EXEEXT)'; \
+	b='boundedaffinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedbhrz03extrapolation1.log: boundedbhrz03extrapolation1$(EXEEXT)
+	@p='boundedbhrz03extrapolation1$(EXEEXT)'; \
+	b='boundedbhrz03extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+boundedh79extrapolation1.log: boundedh79extrapolation1$(EXEEXT)
+	@p='boundedh79extrapolation1$(EXEEXT)'; \
+	b='boundedh79extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+	@p='bounds1$(EXEEXT)'; \
+	b='bounds1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cnncconversion1.log: cnncconversion1$(EXEEXT)
+	@p='cnncconversion1$(EXEEXT)'; \
+	b='cnncconversion1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+	@p='concatenate1$(EXEEXT)'; \
+	b='concatenate1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+congruences1.log: congruences1$(EXEEXT)
+	@p='congruences1$(EXEEXT)'; \
+	b='congruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+constrains1.log: constrains1$(EXEEXT)
+	@p='constrains1$(EXEEXT)'; \
+	b='constrains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+constraints1.log: constraints1$(EXEEXT)
+	@p='constraints1$(EXEEXT)'; \
+	b='constraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+	@p='contains1$(EXEEXT)'; \
+	b='contains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+contains2.log: contains2$(EXEEXT)
+	@p='contains2$(EXEEXT)'; \
+	b='contains2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+containsintegerpoint1.log: containsintegerpoint1$(EXEEXT)
+	@p='containsintegerpoint1$(EXEEXT)'; \
+	b='containsintegerpoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+	@p='disjoint1$(EXEEXT)'; \
+	b='disjoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint2.log: disjoint2$(EXEEXT)
+	@p='disjoint2$(EXEEXT)'; \
+	b='disjoint2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+dropsomenonintegerpoints1.log: dropsomenonintegerpoints1$(EXEEXT)
+	@p='dropsomenonintegerpoints1$(EXEEXT)'; \
+	b='dropsomenonintegerpoints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+dropsomenonintegerpoints2.log: dropsomenonintegerpoints2$(EXEEXT)
+	@p='dropsomenonintegerpoints2$(EXEEXT)'; \
+	b='dropsomenonintegerpoints2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+dualhypercubes.log: dualhypercubes$(EXEEXT)
+	@p='dualhypercubes$(EXEEXT)'; \
+	b='dualhypercubes'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+empty1.log: empty1$(EXEEXT)
+	@p='empty1$(EXEEXT)'; \
+	b='empty1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+	@p='equals1$(EXEEXT)'; \
+	b='equals1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions1.log: exceptions1$(EXEEXT)
+	@p='exceptions1$(EXEEXT)'; \
+	b='exceptions1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions2.log: exceptions2$(EXEEXT)
+	@p='exceptions2$(EXEEXT)'; \
+	b='exceptions2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+exceptions3.log: exceptions3$(EXEEXT)
+	@p='exceptions3$(EXEEXT)'; \
+	b='exceptions3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+expandspacedim1.log: expandspacedim1$(EXEEXT)
+	@p='expandspacedim1$(EXEEXT)'; \
+	b='expandspacedim1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+expandspacedim2.log: expandspacedim2$(EXEEXT)
+	@p='expandspacedim2$(EXEEXT)'; \
+	b='expandspacedim2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+foldspacedims1.log: foldspacedims1$(EXEEXT)
+	@p='foldspacedims1$(EXEEXT)'; \
+	b='foldspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+foldspacedims2.log: foldspacedims2$(EXEEXT)
+	@p='foldspacedims2$(EXEEXT)'; \
+	b='foldspacedims2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frequency1.log: frequency1$(EXEEXT)
+	@p='frequency1$(EXEEXT)'; \
+	b='frequency1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+	@p='frombdshape1$(EXEEXT)'; \
+	b='frombdshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+	@p='frombox1$(EXEEXT)'; \
+	b='frombox1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox2.log: frombox2$(EXEEXT)
+	@p='frombox2$(EXEEXT)'; \
+	b='frombox2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+	@p='fromgrid1$(EXEEXT)'; \
+	b='fromgrid1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+	@p='fromoctagonalshape1$(EXEEXT)'; \
+	b='fromoctagonalshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage1.log: generalizedaffineimage1$(EXEEXT)
+	@p='generalizedaffineimage1$(EXEEXT)'; \
+	b='generalizedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffineimage2.log: generalizedaffineimage2$(EXEEXT)
+	@p='generalizedaffineimage2$(EXEEXT)'; \
+	b='generalizedaffineimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage1.log: generalizedaffinepreimage1$(EXEEXT)
+	@p='generalizedaffinepreimage1$(EXEEXT)'; \
+	b='generalizedaffinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generalizedaffinepreimage2.log: generalizedaffinepreimage2$(EXEEXT)
+	@p='generalizedaffinepreimage2$(EXEEXT)'; \
+	b='generalizedaffinepreimage2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+generators1.log: generators1$(EXEEXT)
+	@p='generators1$(EXEEXT)'; \
+	b='generators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+geomcovers1.log: geomcovers1$(EXEEXT)
+	@p='geomcovers1$(EXEEXT)'; \
+	b='geomcovers1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+h79widening1.log: h79widening1$(EXEEXT)
+	@p='h79widening1$(EXEEXT)'; \
+	b='h79widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+h79widening2.log: h79widening2$(EXEEXT)
+	@p='h79widening2$(EXEEXT)'; \
+	b='h79widening2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+hybrid.log: hybrid$(EXEEXT)
+	@p='hybrid$(EXEEXT)'; \
+	b='hybrid'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+	@p='intersection1$(EXEEXT)'; \
+	b='intersection1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedbhrz03extrapolation1.log: limitedbhrz03extrapolation1$(EXEEXT)
+	@p='limitedbhrz03extrapolation1$(EXEEXT)'; \
+	b='limitedbhrz03extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+limitedh79extrapolation1.log: limitedh79extrapolation1$(EXEEXT)
+	@p='limitedh79extrapolation1$(EXEEXT)'; \
+	b='limitedh79extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+linearexpression1.log: linearexpression1$(EXEEXT)
+	@p='linearexpression1$(EXEEXT)'; \
+	b='linearexpression1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+linearpartition1.log: linearpartition1$(EXEEXT)
+	@p='linearpartition1$(EXEEXT)'; \
+	b='linearpartition1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+linearsystem1.log: linearsystem1$(EXEEXT)
+	@p='linearsystem1$(EXEEXT)'; \
+	b='linearsystem1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mapspacedims1.log: mapspacedims1$(EXEEXT)
+	@p='mapspacedims1$(EXEEXT)'; \
+	b='mapspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+matrix1.log: matrix1$(EXEEXT)
+	@p='matrix1$(EXEEXT)'; \
+	b='matrix1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+max_min1.log: max_min1$(EXEEXT)
+	@p='max_min1$(EXEEXT)'; \
+	b='max_min1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+maxspacedim1.log: maxspacedim1$(EXEEXT)
+	@p='maxspacedim1$(EXEEXT)'; \
+	b='maxspacedim1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mc91.log: mc91$(EXEEXT)
+	@p='mc91$(EXEEXT)'; \
+	b='mc91'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+membytes1.log: membytes1$(EXEEXT)
+	@p='membytes1$(EXEEXT)'; \
+	b='membytes1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+memory2.log: memory2$(EXEEXT)
+	@p='memory2$(EXEEXT)'; \
+	b='memory2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+minconstraints1.log: minconstraints1$(EXEEXT)
+	@p='minconstraints1$(EXEEXT)'; \
+	b='minconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+minconstraints2.log: minconstraints2$(EXEEXT)
+	@p='minconstraints2$(EXEEXT)'; \
+	b='minconstraints2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mingenerators1.log: mingenerators1$(EXEEXT)
+	@p='mingenerators1$(EXEEXT)'; \
+	b='mingenerators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+mingenerators2.log: mingenerators2$(EXEEXT)
+	@p='mingenerators2$(EXEEXT)'; \
+	b='mingenerators2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nncminimize1.log: nncminimize1$(EXEEXT)
+	@p='nncminimize1$(EXEEXT)'; \
+	b='nncminimize1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nncminimize2.log: nncminimize2$(EXEEXT)
+	@p='nncminimize2$(EXEEXT)'; \
+	b='nncminimize2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nncpostimeelapse1.log: nncpostimeelapse1$(EXEEXT)
+	@p='nncpostimeelapse1$(EXEEXT)'; \
+	b='nncpostimeelapse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+numberinput1.log: numberinput1$(EXEEXT)
+	@p='numberinput1$(EXEEXT)'; \
+	b='numberinput1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+onepoint.log: onepoint$(EXEEXT)
+	@p='onepoint$(EXEEXT)'; \
+	b='onepoint'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+permute.log: permute$(EXEEXT)
+	@p='permute$(EXEEXT)'; \
+	b='permute'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+polydifference1.log: polydifference1$(EXEEXT)
+	@p='polydifference1$(EXEEXT)'; \
+	b='polydifference1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+polydifference2.log: polydifference2$(EXEEXT)
+	@p='polydifference2$(EXEEXT)'; \
+	b='polydifference2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhull1.log: polyhull1$(EXEEXT)
+	@p='polyhull1$(EXEEXT)'; \
+	b='polyhull1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhull2.log: polyhull2$(EXEEXT)
+	@p='polyhull2$(EXEEXT)'; \
+	b='polyhull2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhullifexact1.log: polyhullifexact1$(EXEEXT)
+	@p='polyhullifexact1$(EXEEXT)'; \
+	b='polyhullifexact1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+polyhullifexact2.log: polyhullifexact2$(EXEEXT)
+	@p='polyhullifexact2$(EXEEXT)'; \
+	b='polyhullifexact2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+randphull1.log: randphull1$(EXEEXT)
+	@p='randphull1$(EXEEXT)'; \
+	b='randphull1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruence1.log: refinewithcongruence1$(EXEEXT)
+	@p='refinewithcongruence1$(EXEEXT)'; \
+	b='refinewithcongruence1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithcongruences1.log: refinewithcongruences1$(EXEEXT)
+	@p='refinewithcongruences1$(EXEEXT)'; \
+	b='refinewithcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraint1.log: refinewithconstraint1$(EXEEXT)
+	@p='refinewithconstraint1$(EXEEXT)'; \
+	b='refinewithconstraint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewithconstraints1.log: refinewithconstraints1$(EXEEXT)
+	@p='refinewithconstraints1$(EXEEXT)'; \
+	b='refinewithconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations1.log: relations1$(EXEEXT)
+	@p='relations1$(EXEEXT)'; \
+	b='relations1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations2.log: relations2$(EXEEXT)
+	@p='relations2$(EXEEXT)'; \
+	b='relations2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relations3.log: relations3$(EXEEXT)
+	@p='relations3$(EXEEXT)'; \
+	b='relations3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims1.log: removespacedims1$(EXEEXT)
+	@p='removespacedims1$(EXEEXT)'; \
+	b='removespacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+removespacedims2.log: removespacedims2$(EXEEXT)
+	@p='removespacedims2$(EXEEXT)'; \
+	b='removespacedims2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simplifyusingcontext1.log: simplifyusingcontext1$(EXEEXT)
+	@p='simplifyusingcontext1$(EXEEXT)'; \
+	b='simplifyusingcontext1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+smm1.log: smm1$(EXEEXT)
+	@p='smm1$(EXEEXT)'; \
+	b='smm1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+sparserow1.log: sparserow1$(EXEEXT)
+	@p='sparserow1$(EXEEXT)'; \
+	b='sparserow1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+termination1.log: termination1$(EXEEXT)
+	@p='termination1$(EXEEXT)'; \
+	b='termination1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+termination2.log: termination2$(EXEEXT)
+	@p='termination2$(EXEEXT)'; \
+	b='termination2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse1.log: timeelapse1$(EXEEXT)
+	@p='timeelapse1$(EXEEXT)'; \
+	b='timeelapse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+timeelapse2.log: timeelapse2$(EXEEXT)
+	@p='timeelapse2$(EXEEXT)'; \
+	b='timeelapse2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosed1.log: topclosed1$(EXEEXT)
+	@p='topclosed1$(EXEEXT)'; \
+	b='topclosed1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+topclosure1.log: topclosure1$(EXEEXT)
+	@p='topclosure1$(EXEEXT)'; \
+	b='topclosure1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+unconstrain1.log: unconstrain1$(EXEEXT)
+	@p='unconstrain1$(EXEEXT)'; \
+	b='unconstrain1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+universe1.log: universe1$(EXEEXT)
+	@p='universe1$(EXEEXT)'; \
+	b='universe1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+universe2.log: universe2$(EXEEXT)
+	@p='universe2$(EXEEXT)'; \
+	b='universe2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+variablesset1.log: variablesset1$(EXEEXT)
+	@p='variablesset1$(EXEEXT)'; \
+	b='variablesset1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+watchdog1.log: watchdog1$(EXEEXT)
+	@p='watchdog1$(EXEEXT)'; \
+	b='watchdog1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+weightwatch1.log: weightwatch1$(EXEEXT)
+	@p='weightwatch1$(EXEEXT)'; \
+	b='weightwatch1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+wrap1.log: wrap1$(EXEEXT)
+	@p='wrap1$(EXEEXT)'; \
+	b='wrap1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+wrap2.log: wrap2$(EXEEXT)
+	@p='wrap2$(EXEEXT)'; \
+	b='wrap2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writeconsys1.log: writeconsys1$(EXEEXT)
+	@p='writeconsys1$(EXEEXT)'; \
+	b='writeconsys1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writegensys1.log: writegensys1$(EXEEXT)
+	@p='writegensys1$(EXEEXT)'; \
+	b='writegensys1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writepolyhedron1.log: writepolyhedron1$(EXEEXT)
+	@p='writepolyhedron1$(EXEEXT)'; \
+	b='writepolyhedron1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writepolyhedron2.log: writepolyhedron2$(EXEEXT)
+	@p='writepolyhedron2$(EXEEXT)'; \
+	b='writepolyhedron2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writerelation1.log: writerelation1$(EXEEXT)
+	@p='writerelation1$(EXEEXT)'; \
+	b='writerelation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+writevariable1.log: writevariable1$(EXEEXT)
+	@p='writevariable1$(EXEEXT)'; \
+	b='writevariable1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addcongruence1.log: nnc_addcongruence1$(EXEEXT)
+	@p='nnc_addcongruence1$(EXEEXT)'; \
+	b='nnc_addcongruence1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addcongruences1.log: nnc_addcongruences1$(EXEEXT)
+	@p='nnc_addcongruences1$(EXEEXT)'; \
+	b='nnc_addcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addconstraint1.log: nnc_addconstraint1$(EXEEXT)
+	@p='nnc_addconstraint1$(EXEEXT)'; \
+	b='nnc_addconstraint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addconstraints1.log: nnc_addconstraints1$(EXEEXT)
+	@p='nnc_addconstraints1$(EXEEXT)'; \
+	b='nnc_addconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addgenerator1.log: nnc_addgenerator1$(EXEEXT)
+	@p='nnc_addgenerator1$(EXEEXT)'; \
+	b='nnc_addgenerator1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addgenerators1.log: nnc_addgenerators1$(EXEEXT)
+	@p='nnc_addgenerators1$(EXEEXT)'; \
+	b='nnc_addgenerators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_addspacedims1.log: nnc_addspacedims1$(EXEEXT)
+	@p='nnc_addspacedims1$(EXEEXT)'; \
+	b='nnc_addspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_affineimage1.log: nnc_affineimage1$(EXEEXT)
+	@p='nnc_affineimage1$(EXEEXT)'; \
+	b='nnc_affineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_affinepreimage1.log: nnc_affinepreimage1$(EXEEXT)
+	@p='nnc_affinepreimage1$(EXEEXT)'; \
+	b='nnc_affinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_affinetrans.log: nnc_affinetrans$(EXEEXT)
+	@p='nnc_affinetrans$(EXEEXT)'; \
+	b='nnc_affinetrans'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_append1.log: nnc_append1$(EXEEXT)
+	@p='nnc_append1$(EXEEXT)'; \
+	b='nnc_append1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_append2.log: nnc_append2$(EXEEXT)
+	@p='nnc_append2$(EXEEXT)'; \
+	b='nnc_append2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_ascii_dump_load1.log: nnc_ascii_dump_load1$(EXEEXT)
+	@p='nnc_ascii_dump_load1$(EXEEXT)'; \
+	b='nnc_ascii_dump_load1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_ascii_dump_load2.log: nnc_ascii_dump_load2$(EXEEXT)
+	@p='nnc_ascii_dump_load2$(EXEEXT)'; \
+	b='nnc_ascii_dump_load2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bgp99extrapolation1.log: nnc_bgp99extrapolation1$(EXEEXT)
+	@p='nnc_bgp99extrapolation1$(EXEEXT)'; \
+	b='nnc_bgp99extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bhrz03widening1.log: nnc_bhrz03widening1$(EXEEXT)
+	@p='nnc_bhrz03widening1$(EXEEXT)'; \
+	b='nnc_bhrz03widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bhrz03widening2.log: nnc_bhrz03widening2$(EXEEXT)
+	@p='nnc_bhrz03widening2$(EXEEXT)'; \
+	b='nnc_bhrz03widening2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bounded1.log: nnc_bounded1$(EXEEXT)
+	@p='nnc_bounded1$(EXEEXT)'; \
+	b='nnc_bounded1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedaffineimage1.log: nnc_boundedaffineimage1$(EXEEXT)
+	@p='nnc_boundedaffineimage1$(EXEEXT)'; \
+	b='nnc_boundedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedaffinepreimage1.log: nnc_boundedaffinepreimage1$(EXEEXT)
+	@p='nnc_boundedaffinepreimage1$(EXEEXT)'; \
+	b='nnc_boundedaffinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedbhrz03extrapolation1.log: nnc_boundedbhrz03extrapolation1$(EXEEXT)
+	@p='nnc_boundedbhrz03extrapolation1$(EXEEXT)'; \
+	b='nnc_boundedbhrz03extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_boundedh79extrapolation1.log: nnc_boundedh79extrapolation1$(EXEEXT)
+	@p='nnc_boundedh79extrapolation1$(EXEEXT)'; \
+	b='nnc_boundedh79extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_bounds1.log: nnc_bounds1$(EXEEXT)
+	@p='nnc_bounds1$(EXEEXT)'; \
+	b='nnc_bounds1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_concatenate1.log: nnc_concatenate1$(EXEEXT)
+	@p='nnc_concatenate1$(EXEEXT)'; \
+	b='nnc_concatenate1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_congruences1.log: nnc_congruences1$(EXEEXT)
+	@p='nnc_congruences1$(EXEEXT)'; \
+	b='nnc_congruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_constrains1.log: nnc_constrains1$(EXEEXT)
+	@p='nnc_constrains1$(EXEEXT)'; \
+	b='nnc_constrains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_constraints1.log: nnc_constraints1$(EXEEXT)
+	@p='nnc_constraints1$(EXEEXT)'; \
+	b='nnc_constraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_contains1.log: nnc_contains1$(EXEEXT)
+	@p='nnc_contains1$(EXEEXT)'; \
+	b='nnc_contains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_containsintegerpoint1.log: nnc_containsintegerpoint1$(EXEEXT)
+	@p='nnc_containsintegerpoint1$(EXEEXT)'; \
+	b='nnc_containsintegerpoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_disjoint1.log: nnc_disjoint1$(EXEEXT)
+	@p='nnc_disjoint1$(EXEEXT)'; \
+	b='nnc_disjoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_dropsomenonintegerpoints1.log: nnc_dropsomenonintegerpoints1$(EXEEXT)
+	@p='nnc_dropsomenonintegerpoints1$(EXEEXT)'; \
+	b='nnc_dropsomenonintegerpoints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_empty1.log: nnc_empty1$(EXEEXT)
+	@p='nnc_empty1$(EXEEXT)'; \
+	b='nnc_empty1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_equals1.log: nnc_equals1$(EXEEXT)
+	@p='nnc_equals1$(EXEEXT)'; \
+	b='nnc_equals1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_exceptions1.log: nnc_exceptions1$(EXEEXT)
+	@p='nnc_exceptions1$(EXEEXT)'; \
+	b='nnc_exceptions1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_exceptions3.log: nnc_exceptions3$(EXEEXT)
+	@p='nnc_exceptions3$(EXEEXT)'; \
+	b='nnc_exceptions3'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_expandspacedim1.log: nnc_expandspacedim1$(EXEEXT)
+	@p='nnc_expandspacedim1$(EXEEXT)'; \
+	b='nnc_expandspacedim1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_foldspacedims1.log: nnc_foldspacedims1$(EXEEXT)
+	@p='nnc_foldspacedims1$(EXEEXT)'; \
+	b='nnc_foldspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_frombdshape1.log: nnc_frombdshape1$(EXEEXT)
+	@p='nnc_frombdshape1$(EXEEXT)'; \
+	b='nnc_frombdshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_frombox1.log: nnc_frombox1$(EXEEXT)
+	@p='nnc_frombox1$(EXEEXT)'; \
+	b='nnc_frombox1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_fromgrid1.log: nnc_fromgrid1$(EXEEXT)
+	@p='nnc_fromgrid1$(EXEEXT)'; \
+	b='nnc_fromgrid1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_fromoctagonalshape1.log: nnc_fromoctagonalshape1$(EXEEXT)
+	@p='nnc_fromoctagonalshape1$(EXEEXT)'; \
+	b='nnc_fromoctagonalshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_generalizedaffineimage1.log: nnc_generalizedaffineimage1$(EXEEXT)
+	@p='nnc_generalizedaffineimage1$(EXEEXT)'; \
+	b='nnc_generalizedaffineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_generalizedaffinepreimage1.log: nnc_generalizedaffinepreimage1$(EXEEXT)
+	@p='nnc_generalizedaffinepreimage1$(EXEEXT)'; \
+	b='nnc_generalizedaffinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_generators1.log: nnc_generators1$(EXEEXT)
+	@p='nnc_generators1$(EXEEXT)'; \
+	b='nnc_generators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_geomcovers1.log: nnc_geomcovers1$(EXEEXT)
+	@p='nnc_geomcovers1$(EXEEXT)'; \
+	b='nnc_geomcovers1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_h79widening1.log: nnc_h79widening1$(EXEEXT)
+	@p='nnc_h79widening1$(EXEEXT)'; \
+	b='nnc_h79widening1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_intersection1.log: nnc_intersection1$(EXEEXT)
+	@p='nnc_intersection1$(EXEEXT)'; \
+	b='nnc_intersection1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_simplifyusingcontext1.log: nnc_simplifyusingcontext1$(EXEEXT)
+	@p='nnc_simplifyusingcontext1$(EXEEXT)'; \
+	b='nnc_simplifyusingcontext1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_limitedbhrz03extrapolation1.log: nnc_limitedbhrz03extrapolation1$(EXEEXT)
+	@p='nnc_limitedbhrz03extrapolation1$(EXEEXT)'; \
+	b='nnc_limitedbhrz03extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_limitedh79extrapolation1.log: nnc_limitedh79extrapolation1$(EXEEXT)
+	@p='nnc_limitedh79extrapolation1$(EXEEXT)'; \
+	b='nnc_limitedh79extrapolation1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_linearpartition1.log: nnc_linearpartition1$(EXEEXT)
+	@p='nnc_linearpartition1$(EXEEXT)'; \
+	b='nnc_linearpartition1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_mapspacedims1.log: nnc_mapspacedims1$(EXEEXT)
+	@p='nnc_mapspacedims1$(EXEEXT)'; \
+	b='nnc_mapspacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_max_min1.log: nnc_max_min1$(EXEEXT)
+	@p='nnc_max_min1$(EXEEXT)'; \
+	b='nnc_max_min1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_mc91.log: nnc_mc91$(EXEEXT)
+	@p='nnc_mc91$(EXEEXT)'; \
+	b='nnc_mc91'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_membytes1.log: nnc_membytes1$(EXEEXT)
+	@p='nnc_membytes1$(EXEEXT)'; \
+	b='nnc_membytes1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_minconstraints1.log: nnc_minconstraints1$(EXEEXT)
+	@p='nnc_minconstraints1$(EXEEXT)'; \
+	b='nnc_minconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_mingenerators1.log: nnc_mingenerators1$(EXEEXT)
+	@p='nnc_mingenerators1$(EXEEXT)'; \
+	b='nnc_mingenerators1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_onepoint.log: nnc_onepoint$(EXEEXT)
+	@p='nnc_onepoint$(EXEEXT)'; \
+	b='nnc_onepoint'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_permute.log: nnc_permute$(EXEEXT)
+	@p='nnc_permute$(EXEEXT)'; \
+	b='nnc_permute'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_polydifference1.log: nnc_polydifference1$(EXEEXT)
+	@p='nnc_polydifference1$(EXEEXT)'; \
+	b='nnc_polydifference1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_polyhull1.log: nnc_polyhull1$(EXEEXT)
+	@p='nnc_polyhull1$(EXEEXT)'; \
+	b='nnc_polyhull1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_polyhullifexact1.log: nnc_polyhullifexact1$(EXEEXT)
+	@p='nnc_polyhullifexact1$(EXEEXT)'; \
+	b='nnc_polyhullifexact1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_randphull1.log: nnc_randphull1$(EXEEXT)
+	@p='nnc_randphull1$(EXEEXT)'; \
+	b='nnc_randphull1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_relations1.log: nnc_relations1$(EXEEXT)
+	@p='nnc_relations1$(EXEEXT)'; \
+	b='nnc_relations1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_relations2.log: nnc_relations2$(EXEEXT)
+	@p='nnc_relations2$(EXEEXT)'; \
+	b='nnc_relations2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_removespacedims1.log: nnc_removespacedims1$(EXEEXT)
+	@p='nnc_removespacedims1$(EXEEXT)'; \
+	b='nnc_removespacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_smm1.log: nnc_smm1$(EXEEXT)
+	@p='nnc_smm1$(EXEEXT)'; \
+	b='nnc_smm1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_timeelapse1.log: nnc_timeelapse1$(EXEEXT)
+	@p='nnc_timeelapse1$(EXEEXT)'; \
+	b='nnc_timeelapse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_unconstrain1.log: nnc_unconstrain1$(EXEEXT)
+	@p='nnc_unconstrain1$(EXEEXT)'; \
+	b='nnc_unconstrain1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_universe1.log: nnc_universe1$(EXEEXT)
+	@p='nnc_universe1$(EXEEXT)'; \
+	b='nnc_universe1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_wrap1.log: nnc_wrap1$(EXEEXT)
+	@p='nnc_wrap1$(EXEEXT)'; \
+	b='nnc_wrap1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_wrap2.log: nnc_wrap2$(EXEEXT)
+	@p='nnc_wrap2$(EXEEXT)'; \
+	b='nnc_wrap2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+nnc_writepolyhedron1.log: nnc_writepolyhedron1$(EXEEXT)
+	@p='nnc_writepolyhedron1$(EXEEXT)'; \
+	b='nnc_writepolyhedron1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Polyhedron/addcongruence1.cc b/tests/Polyhedron/addcongruence1.cc
new file mode 100644
index 0000000..9bb09aa
--- /dev/null
+++ b/tests/Polyhedron/addcongruence1.cc
@@ -0,0 +1,234 @@
+/* Test Polyhedron::add_congruence().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_congruence(Linear_Expression(0) %= 0);
+  ph.add_congruence((B == 5) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B == 5);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_congruence((0*(A + B) %= 0) / 4);
+  ph.add_congruence((A == -1) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == -1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_congruence((A - B == 0) / 0);
+  ph.add_congruence((Linear_Expression(0) %= 1) / 2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruences ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(0);
+
+  ph.add_congruence((Linear_Expression::zero() %= 0) / 2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_congruence((Linear_Expression::zero() %= 1) / 0);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_congruence(0*A %= 0);
+  ph.add_congruence((B == 5) / 0);
+  bool b = !ph.is_empty();
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B == 5);
+
+  bool ok = b && (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_congruence((Linear_Expression(0) %= 8) / 4);
+  ph.add_congruence((A == -1) / 0);
+  bool b = !ph.is_empty();
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == -1);
+
+  bool ok = b && (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_congruence((A - B == 0) / 0);
+  ph.add_congruence((Linear_Expression(0) %= 1) / 2);
+  bool b = !ph.is_empty();
+
+  bool ok = !b && (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruences ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(0);
+
+  ph.add_congruence((Linear_Expression::zero() %= 0) / 2);
+  bool b = !ph.is_empty();
+
+  bool ok = b && (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_congruence((Linear_Expression::zero() %= 1) / 0);
+  bool b = !ph.is_empty();
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = !b && (ph == known_result);
+
+  print_constraints(ph, "*** ph after adding congruence ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/addcongruences1.cc b/tests/Polyhedron/addcongruences1.cc
new file mode 100644
index 0000000..7f238ce
--- /dev/null
+++ b/tests/Polyhedron/addcongruences1.cc
@@ -0,0 +1,251 @@
+/* Test Polyhedron::add_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x));
+  gs.insert(ray(x + y));
+
+  Congruence_System cgs;
+  cgs.insert(0*x %= 0);
+  cgs.insert(y == 3);
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.add_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y == 3);
+  known_result.add_constraint(x - y >= 0);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after add_congruences ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  Congruence_System cgs;
+  cgs.insert(Linear_Expression(0) %= 0);
+  cgs.insert(B == 7);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_congruences(cgs);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  Congruence_System cgs;
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_congruences(cgs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 0);
+  C_Polyhedron ph(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Congruence_System cgs;
+  cgs.insert(e == 0);
+
+  ph.add_congruences(cgs);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool test05() {
+  C_Polyhedron ph;
+  ph.add_constraint(Linear_Expression(-2) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Congruence_System cgs;
+  cgs.insert(Linear_Expression(-1) %= 0);
+
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.add_congruences(cgs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after add_constraints ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(26) %= 0) / 13);
+  cgs.insert(B == 7);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_congruences(cgs);
+
+  C_Polyhedron known_result(cgs);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert(Linear_Expression(0) %= 0);
+  cgs.insert(B == 7);
+
+  Congruence_System cgs_copy = cgs;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_recycled_congruences(cgs);
+
+  C_Polyhedron known_result(cgs_copy);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(18) %= 3) / 5);
+  cgs.insert(A == 0);
+  cgs.insert(A + B == 7);
+  cgs.insert(B == 7);
+
+  Congruence_System cgs_copy = cgs;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.add_recycled_congruences(cgs);
+
+  C_Polyhedron known_result(cgs_copy);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_congruences(cgs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
+
diff --git a/tests/Polyhedron/addconstraint1.cc b/tests/Polyhedron/addconstraint1.cc
new file mode 100644
index 0000000..abcd094
--- /dev/null
+++ b/tests/Polyhedron/addconstraint1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::add_constraint().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B == 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  for (Constraint_System::const_iterator i = ph1.constraints().begin(),
+         cs_end = ph1.constraints().end(); i != cs_end; ++i)
+    ph2.add_constraint(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.add_constraint(A == B) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 2);
+  ph.add_constraint(A >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_constraint(B >= 1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.add_constraint(B >= 1) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addconstraints1.cc b/tests/Polyhedron/addconstraints1.cc
new file mode 100644
index 0000000..a1d3d60
--- /dev/null
+++ b/tests/Polyhedron/addconstraints1.cc
@@ -0,0 +1,361 @@
+/* Test Polyhedron::add_constrains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // For const-correctness, making a copy is required.
+  Constraint_System cs1 = Constraint_System::zero_dim_empty();
+  C_Polyhedron ph1;
+  ph1.add_constraints(cs1);
+
+  Constraint_System cs2;
+  cs2.insert(Linear_Expression::zero() >= 7);
+  C_Polyhedron ph2;
+  ph2.add_constraints(cs2);
+
+  Constraint_System cs3;
+  cs3.insert(Linear_Expression::zero() >= -3);
+  C_Polyhedron ph3;
+  ph3.add_constraints(cs3);
+
+  C_Polyhedron empty_result(0, EMPTY);
+  C_Polyhedron univ_result;
+
+  bool ok = (ph1 == empty_result
+             && ph2 == empty_result
+             && ph3 == univ_result);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(ph3, "*** ph3 ***");
+  print_constraints(empty_result, "*** empty_result ***");
+  print_constraints(univ_result, "*** univ_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  Constraint_System cs;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.add_constraints(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x + y >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Constraint_System cs2;
+  cs2.insert(e == 0);
+  ph.add_constraints(cs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.add_constraints(cs2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs;
+
+  C_Polyhedron computed_result(ph);
+
+  computed_result.add_constraints(cs);
+
+  bool ok = (computed_result == ph);
+
+  print_constraints(computed_result, "*** after add_constraints ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(x >= 4);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron computed_result(3, EMPTY);
+
+  bool ok = (ph == computed_result);
+
+  print_constraints(ph, "*** after add_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+
+  Constraint_System cs;
+  cs.insert(x >= 4);
+  cs.insert(x - y >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(x >= 4);
+  known_result.add_constraint(x - y >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after add_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(y >= 1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y <= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron known_result(3, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after add_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  C_Polyhedron ph;
+  ph.add_constraint(Linear_Expression(-2) >= 0);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-1) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after add_constraints ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x));
+  gs.insert(ray(x + y));
+
+  C_Polyhedron ph(gs);
+
+  Constraint_System cs;
+  cs.insert(x <= 3);
+
+  print_generators(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.add_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x - y >= 0);
+  known_result.add_constraint(x <= 3);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after add_constraints ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.add_constraints(cs);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  Constraint_System cs1;
+  cs1.insert(A == 0);
+  cs1.insert(B >= 0);
+  Constraint_System cs2(cs1);
+
+  ph.add_constraints(cs1);
+  copy_ph.add_constraints(cs2);
+
+  bool ok = (ph == copy_ph);
+
+  print_constraints(ph, "*** after ph.add_constraints(cs1) ***");
+  print_constraints(ph, "*** after copy_ph.add_constraints(cs2) ***");
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  Constraint_System cs1 = ph2.constraints();
+  Constraint_System cs2 = ph2.constraints();
+
+  ph1.add_constraints(cs1);
+  copy_ph1.add_constraints(cs2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** after add_constraints_assign ***");
+  print_constraints(copy_ph1, "*** after add_constraints ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/addconstraints2.cc b/tests/Polyhedron/addconstraints2.cc
new file mode 100644
index 0000000..9b20536
--- /dev/null
+++ b/tests/Polyhedron/addconstraints2.cc
@@ -0,0 +1,94 @@
+/* Test Polyhedron::add_constrains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  ph1.add_constraint(B >= 0);
+
+  NNC_Polyhedron ph2(1);
+  ph2.add_constraint(A == 0);
+
+  Constraint_System cs = ph2.constraints();
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.add_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 0);
+  known_result.add_constraint(B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.add_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  Constraint_System cs = ph1.constraints();
+
+  C_Polyhedron ph2(3);
+  ph2.add_constraint(A <= 2);
+
+  print_constraints(cs, "*** cs ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.add_constraints(cs);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator1.cc b/tests/Polyhedron/addgenerator1.cc
new file mode 100644
index 0000000..96f4a9c
--- /dev/null
+++ b/tests/Polyhedron/addgenerator1.cc
@@ -0,0 +1,118 @@
+/* Test Polyhedron::add_generator().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A + 2*B));
+  gs.insert(point(A + B));
+  gs.insert(point(2*A + 2*B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_generator(ray(A));
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(point(A + 2*B));
+  known_gs.insert(ray(A));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.add_generator(ray(A)) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph_empty(2, EMPTY);
+  Generator_System gs1 = ph_empty.generators();
+  assert(gs1.space_dimension() == ph_empty.space_dimension());
+
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result1(2);
+  known_result1.add_constraint(A >= 0);
+  known_result1.add_constraint(B == 0);
+
+  Generator_System gs2 = ph_empty.generators();
+  assert(gs2.space_dimension() == ph_empty.space_dimension());
+
+  gs2.insert(point(C));
+  gs2.insert(line(C));
+  gs2.insert(ray(A));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result2(3);
+  known_result2.add_constraint(A >= 0);
+  known_result2.add_constraint(B == 0);
+
+  bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph(0, EMPTY);
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(0, UNIVERSE);
+  print_constraints(known_result, "*** known_result ***");
+
+  ph.add_generator(point());
+
+  bool ok = (ph == known_result);
+  print_constraints(ph, "*** ph.add_generator(point()) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator2.cc b/tests/Polyhedron/addgenerator2.cc
new file mode 100644
index 0000000..d9d295d
--- /dev/null
+++ b/tests/Polyhedron/addgenerator2.cc
@@ -0,0 +1,130 @@
+/* Test Polyhedron::add_generator().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(line(B));
+  NNC_Polyhedron ph1(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(-A));
+
+  print_generators(ph2, "*** ph2 ***");
+
+  const Generator_System& gs1 = ph1.minimized_generators();
+  for (Generator_System::const_iterator i = gs1.begin(),
+         gs1_end = gs1.end(); i != gs1_end; ++i)
+    ph2.add_generator(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= -1);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2add_generator(*i) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A + B));
+  NNC_Polyhedron ph1(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  const Generator_System& gs1 = ph1.minimized_generators();
+  for (Generator_System::const_iterator i = gs1.begin(),
+         gs1_end = gs1.end(); i != gs1_end; ++i)
+    ph2.add_generator(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B == 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.add_generator(*i) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(closure_point(3*A, 2));
+  gs.insert(point(7*A, 4));
+  gs.insert(ray(A - B));
+
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron ph(2, EMPTY);
+
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    if (!(*i).is_closure_point())
+      ph.add_generator(*i);
+
+  Generator_System gs_known;
+  gs_known.insert(point(7*A + 0*B, 4));
+  gs_known.insert(ray(A - B));
+  C_Polyhedron known_result(gs_known);
+
+  bool ok = (ph == known_result);
+
+  print_generators(gs, "*** gs ***");
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerators1.cc b/tests/Polyhedron/addgenerators1.cc
new file mode 100644
index 0000000..2797566
--- /dev/null
+++ b/tests/Polyhedron/addgenerators1.cc
@@ -0,0 +1,354 @@
+/* Test Polyhedron::add_generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point(x));
+  gs1.insert(point(y));
+  gs1.insert(line(x));
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** before ***");
+
+  Generator_System gs2;
+  gs2.insert(point());
+
+  ph1.add_generators(gs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(y));
+  known_result.add_generator(line(x));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** add_generators ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_generators(ph1, "*** before ***");
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(line(x));
+
+  ph1.add_generators(gs);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(line(x));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** add_generators ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph;
+  ph.add_generator(point());
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after add_generators ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(ray(x));
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y == 0);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after add_generators ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(x <= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(ray(x + y));
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point());
+  gs_known_result.insert(ray(x + y));
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after add_generators ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(ray(x + y));
+  gs1.insert(point());
+
+  C_Polyhedron ph(gs1);
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs2;
+  gs2.insert(ray(x));
+  gs2.insert(point());
+
+  print_generators(gs2, "*** gs2 ***");
+
+  ph.add_generators(gs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(ray(x));
+  known_result.add_generator(ray(x + y));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after add_generators ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 3);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  Generator_System gs;
+  ph.add_generators(gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph .add_generators(gs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  C_Polyhedron ph(0, EMPTY);
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.add_generators(gs); ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  Generator_System gs2(gs1);
+
+  ph.add_generators(gs1);
+  copy_ph.add_generators(gs2);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** after ph.add_generators(gs1) ***");
+  print_generators(copy_ph, "*** after copy_ph.add_generators(gs2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  Generator_System gs1 = ph2.generators();
+  Generator_System gs2 = ph2.generators();
+
+  ph1.add_generators(gs1);
+  copy_ph1.add_generators(gs2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_generators(ph1, "*** after add_generators ***");
+  print_generators(copy_ph1, "*** after add_generators ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  C_Polyhedron ph(1, EMPTY);
+  Generator_System gs(point());
+
+  print_generators(gs, "*** gs ***");
+
+  ph.add_generators(gs);
+
+  C_Polyhedron known_result(1, EMPTY);
+  known_result.add_generator(point());
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** add_generators ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  C_Polyhedron ph(0, EMPTY);
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs(point());
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron known_result(0, UNIVERSE);
+
+  ph.add_generators(gs);
+
+  bool ok = (ph == known_result);
+  print_constraints(ph, "*** ph.add_generators(gs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerators2.cc b/tests/Polyhedron/addgenerators2.cc
new file mode 100644
index 0000000..12ed28a
--- /dev/null
+++ b/tests/Polyhedron/addgenerators2.cc
@@ -0,0 +1,138 @@
+/* Test Polyhedron::add_generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(closure_point());
+  gs1.insert(closure_point(4*x));
+  gs1.insert(closure_point(4*y));
+  gs1.insert(closure_point(4*x + 4*y));
+  gs1.insert(point(2*x));
+  gs1.insert(point(4*x + y));
+  gs1.insert(point(x + 4*y));
+  gs1.insert(point(3*y));
+
+  NNC_Polyhedron ph(gs1);
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(4*x));
+  gs2.insert(point(4*y));
+  gs2.insert(point(4*x + 4*y));
+
+  ph.add_generators(gs2);
+
+  Generator_System gs3;
+  gs3.insert(point());
+  gs3.insert(point(4*x));
+  gs3.insert(point(4*y));
+  gs3.insert(point(4*x + 4*y));
+
+  NNC_Polyhedron known_result(gs3);
+
+  C_Polyhedron closed_ph(ph);
+  C_Polyhedron closed_known_result(known_result);
+
+  bool ok = (ph == known_result
+             && closed_ph == closed_known_result);
+
+  print_generators(ph, "*** after add_generators(gs) ***");
+  print_generators(closed_ph, "*** closed_ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph1(3, EMPTY);
+
+  ph1.add_generator(point(x));
+
+  Generator_System gs;
+  gs.insert(point(1*x + 0*y + 0*z));
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A + B));
+  gs1.insert(closure_point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  NNC_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.topological_closure_assign();
+  Generator_System gs2 = ph1.minimized_generators();
+
+  print_generators(gs2, "*** gs2 ***");
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generators(gs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/addspacedims1.cc b/tests/Polyhedron/addspacedims1.cc
new file mode 100644
index 0000000..e8a87c6
--- /dev/null
+++ b/tests/Polyhedron/addspacedims1.cc
@@ -0,0 +1,202 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+   and  Polyhedron::add_space_dimensions_and_embed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(x));
+  gs.insert(point(y));
+  gs.insert(point(x + y));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_project(1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(x));
+  known_result.add_generator(point(y));
+  known_result.add_generator(point(x + y));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after add_space_dimensions_and_project ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph(3, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron computed_result1(ph);
+  C_Polyhedron computed_result2(ph);
+
+  computed_result1.add_space_dimensions_and_project(4);
+  computed_result2.add_space_dimensions_and_embed(4);
+
+  C_Polyhedron known_result(7, EMPTY);
+
+  bool ok = (computed_result1 == known_result
+             && computed_result2 == known_result);
+
+  print_constraints(computed_result1, "*** computed_result1 ***");
+  print_constraints(computed_result2, "*** computed_result2 ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable u(3);
+  Variable v(4);
+  Variable w(5);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x + y));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  Constraint_System cs = ph.constraints();
+
+  ph.add_space_dimensions_and_embed(2);
+
+  print_generators(ph, "*** after add_space_dimensions_and_embed(2) ***");
+
+  ph.add_space_dimensions_and_embed(2);
+
+  C_Polyhedron known_result(6, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(ray(x + y));
+  known_result.add_generator(line(z));
+  known_result.add_generator(line(u));
+  known_result.add_generator(line(v));
+  known_result.add_generator(line(w));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1;
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_project(3);
+
+  print_generators(ph1, "*** after add_space_dimensions_and_project(3) ***");
+
+  C_Polyhedron ph2;
+  Constraint_System cs = ph2.constraints();
+
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.add_space_dimensions_and_project(3);
+
+  bool ok = (ph1 == ph2);
+
+  print_generators(ph2, "*** after add_space_dimensions_and_project(3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable C(2);
+
+  C_Polyhedron ph(2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_project(1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(C == 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+                    "*** after ph.add_space_dimensions_and_project(1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+
+  C_Polyhedron ph2(ph1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.add_space_dimensions_and_embed(0);
+  ph2.add_space_dimensions_and_project(0);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1,
+                    "*** after ph1.add_space_dimensions_and_embed(0) ***");
+  print_constraints(ph2,
+                    "*** after ph2.add_space_dimensions_and_project(0) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/addspacedims2.cc b/tests/Polyhedron/addspacedims2.cc
new file mode 100644
index 0000000..5f07e06
--- /dev/null
+++ b/tests/Polyhedron/addspacedims2.cc
@@ -0,0 +1,249 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+   and  Polyhedron::add_space_dimensions_and_embed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Constraint_System cs;
+  cs.insert(x > 2);
+  cs.insert(y > 2);
+  cs.insert(x < 6);
+  cs.insert(y < 6);
+
+  NNC_Polyhedron ph(cs);
+
+  ph.generators();
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_project(2);
+
+  NNC_Polyhedron known_result(4);
+  known_result.add_constraint(z == 0);
+  known_result.add_constraint(w == 0);
+  known_result.add_constraint(x > 2);
+  known_result.add_constraint(y > 2);
+  known_result.add_constraint(x < 6);
+  known_result.add_constraint(y < 6);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after add_space_dimensions_and_project ***");
+  print_generators(ph, "*** after add_space_dimensions_and_project ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  NNC_Polyhedron ph1(1);
+
+  ph1.add_constraint(x > 1);
+  ph1.add_constraint(x < 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_embed(2);
+
+  Generator_System gs;
+  gs.insert(point(2*x));
+  gs.insert(closure_point(x));
+  gs.insert(closure_point(5*x));
+
+  NNC_Polyhedron ph2(gs);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.add_space_dimensions_and_embed(2);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***");
+  print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  NNC_Polyhedron ph1(1);
+
+  ph1.add_constraint(x > -3);
+  ph1.add_constraint(x < 3);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_project(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(closure_point(-3*x));
+  gs.insert(closure_point(3*x));
+
+  NNC_Polyhedron ph2(gs);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.add_space_dimensions_and_project(2);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** ph1 after add_space_dimensions_and_embed ***");
+  print_generators(ph2, "*** ph2 after add_space_dimensions_and_embed ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  NNC_Polyhedron ph(1, EMPTY);
+  ph.add_generator(point(A));
+  ph.add_generator(closure_point());
+  ph.add_generator(closure_point(3*A));
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_embed(1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(A < 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.add_space_dimensions_and_embed(1) ***");
+  print_generators(ph, "*** after ph.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  NNC_Polyhedron ph(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(A));
+  gs2.insert(ray(A));
+  ph.add_generators(gs2);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.add_space_dimensions_and_embed(1);
+
+  Generator_System known_gs;
+  known_gs.insert(point(A));
+  known_gs.insert(line(B));
+  known_gs.insert(ray(A));
+  NNC_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A + B));
+  gs1.insert(closure_point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  NNC_Polyhedron ph1(gs1);
+
+  ph1.minimized_constraints();
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.add_space_dimensions_and_embed(1);
+
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(B > 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+                    "*** after ph1.add_space_dimensions_and_embed(1) ***");
+  print_generators(ph1, "*** after ph1.add_space_dimensions_and_embed(1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+
+  // This will change the size of the rows, but not their capacity.
+  ph1.add_space_dimensions_and_embed(1);
+
+  // Assigning the polyhedron to itself:
+  // this used to recompute the row capacity based on row size,
+  // without actually increasing the capacity of the rows,
+  // leading to an inconsistent state.
+  ph1 = ph1;
+
+  return ph1.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/affineimage1.cc b/tests/Polyhedron/affineimage1.cc
new file mode 100644
index 0000000..b411e3e
--- /dev/null
+++ b/tests/Polyhedron/affineimage1.cc
@@ -0,0 +1,266 @@
+/* Test Polyhedron::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == -2);
+  ph.add_constraint(A == 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(B, A+2, 1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(2*B - 2*C));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_image(B, A+2, 1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= B);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 3);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(A, A+B+1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A -2*B - 1 >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B <= 4);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after ph.affine_image(A, A+B+1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_image(A, A + 1, 2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(2*A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.affine_image(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A));
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(A, B+2, -3);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(-2*A, 3));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_image(A, B+2, -3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(A <= 3);
+  ph.add_constraint(B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(B, A-B+2, -3);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(2*A));
+  known_result.add_generator(point(2*A - B));
+  known_result.add_generator(point(9*A + B, 3));
+  known_result.add_generator(point(9*A - 4*B, 3));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_image(B, A-B+2, -3) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.affine_image(A, 2*A + B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.affine_image(A, 2*A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(B));
+  gs.insert(point(A + B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_image(A, -A - 1, -1);
+
+  Generator_System known_gs;
+  known_gs.insert(point(A));
+  known_gs.insert(point(2*A));
+  known_gs.insert(point(A + B));
+  known_gs.insert(point(2*A + B));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.affine_image(A, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(A, A + 1);
+  copy_ph.affine_image(A, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** after ph.affine_image(A, A + 1) ***");
+  print_generators(copy_ph,
+                   "*** after copy_ph.affine_image(A, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_image(B, A + 1);
+  copy_ph.affine_image(B, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** after ph.affine_image(B, A + 1) ***");
+  print_generators(copy_ph,
+                   "*** after copy_ph.affine_image(B, -A - 1, -1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/affineimage2.cc b/tests/Polyhedron/affineimage2.cc
new file mode 100644
index 0000000..818f37c
--- /dev/null
+++ b/tests/Polyhedron/affineimage2.cc
@@ -0,0 +1,75 @@
+/* Test Polyhedron::affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+aux_test01(std::ostream& s, const Variable v) {
+  s << char('i' + v.id());
+}
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+
+  // Install the alternate output function.
+  Variable::set_output_function(aux_test01);
+
+  NNC_Polyhedron p1(2);
+  p1.add_constraint(j == 0);
+  p1.add_constraint(i >= 0);
+
+  NNC_Polyhedron p2(2);
+  p2.add_constraint(j == 0);
+  p2.add_constraint(-i > 0);
+
+  print_constraints(p1, "*** p1 ***");
+  print_constraints(p2, "*** p2 ***");
+
+  p1.affine_image(j, i+2);
+  p2.affine_image(j, i);
+
+  print_constraints(p1, "*** p1.affine_image(j, i+2) ***");
+  print_constraints(p2, "*** p2.affine_image(j, i) ***");
+
+  p1.upper_bound_assign(p2);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(i - j >= -2);
+  known_result.add_constraint(-i + j >= 0);
+
+  bool ok = (p1 == known_result);
+
+  print_constraints(p1, "*** p1.upper_bound_assign(p2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/affinepreimage1.cc b/tests/Polyhedron/affinepreimage1.cc
new file mode 100644
index 0000000..a11c33c
--- /dev/null
+++ b/tests/Polyhedron/affinepreimage1.cc
@@ -0,0 +1,438 @@
+/* Test Polyhedron::affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  gs.insert(point(A));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_preimage(A, A+2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(-2*A));
+  gs_known_result.insert(ray(A + B));
+  gs_known_result.insert(point(-A));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_preimage(A, A+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A + C == 0);
+  ph.add_constraint(A + B >= 0);
+  ph.add_constraint(A + B - 1 >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, A + B);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A + B + C == 0);
+  known_result.add_constraint(A + 2*B >= 0);
+  known_result.add_constraint(A + 2*B -1 >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after ph.affine_preimage(A, A+B) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A + B - 3 >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, B+1);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(B));
+  known_result.add_generator(line(A));
+  known_result.add_generator(ray(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_preimage(A, B+2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(ray(x + 2*y));
+  gs.insert(ray(x));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_preimage(x, y+1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after affine_preimage(x, y+1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, A + 1, 2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 3);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.affine_preimage(A, A + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(B, A + 1, 2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.affine_preimage(B, A + 1, 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_preimage(B, A - B, -1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B <= 0);
+  known_result.add_constraint(2*A - B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.affine_preimage(B, A - B, -1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, 2*A +B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.affine_preimage(A, 2*A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 1);
+  ph.add_constraint(B <= 1);
+
+  ph.affine_preimage(A, -A - 1, -1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(A >= -1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.affine_preimage(A, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A <= 1);
+  ph.add_constraint(B <= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(B, -A - 1, -1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.affine_preimage(B, -A - 1, -1) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(A, A + 1);
+  copy_ph.affine_preimage(A, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** after ph.affine_preimage(A, A + 1) ***");
+  print_generators(copy_ph,
+                   "*** after copy_ph.affine_preimage(A, -A - 1, -1) ***");
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+  C_Polyhedron copy_ph(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.affine_preimage(B, A + 1);
+  copy_ph.affine_preimage(B, -A - 1, -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_generators(ph, "*** after ph.affine_preimage(B, A + 1) ***");
+  print_generators(copy_ph,
+                   "*** after copy_ph.affine_preimage(B, -A - 1, -1) ***");
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  gs.insert(point(A));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.affine_preimage(B, Linear_Expression(1));
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(A));
+  gs_known_result.insert(point(2*A));
+  gs_known_result.insert(line(B));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_preimage(B, 1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(0*A + 3*B));
+  gs.insert(point(3*A + 0*B));
+  gs.insert(point(3*A + 3*B));
+
+  C_Polyhedron ph(gs);
+
+  C_Polyhedron known_result = ph;
+
+  print_generators(ph, "*** ph before ph.affine_image(A, A + 2*B + 4) ***");
+
+  ph.affine_image(A, A + 2*B + 4);
+
+  print_generators(ph, "*** ph after ph.affine_image(A, A + 2*B + 4) ***");
+
+  ph.affine_preimage(A, A + 2*B + 4);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_preimage(A, A + 2*B + 4) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(0*A + 3*B));
+  gs.insert(point(3*A + 0*B));
+  gs.insert(point(3*A + 3*B));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph before ph.affine_image(A, B) ***");
+
+  ph.affine_image(A, B);
+
+  print_generators(ph, "*** ph after ph.affine_image(A, B) ***");
+
+  ph.affine_preimage(A, B);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after ph.affine_preimage(A, B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/affinetrans.cc b/tests/Polyhedron/affinetrans.cc
new file mode 100644
index 0000000..e928e16
--- /dev/null
+++ b/tests/Polyhedron/affinetrans.cc
@@ -0,0 +1,82 @@
+/* Use of the functions affine_image and affine_preimage.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y));
+  gs.insert(point(0*x + 3*y));
+  gs.insert(point(3*x + 0*y));
+  gs.insert(point(3*x + 3*y));
+  C_Polyhedron ph(gs);
+
+  Linear_Expression expr = x + 4;
+
+  C_Polyhedron p1(ph);
+
+  print_generators(p1, "*** p1 ***");
+
+  p1.affine_image(x, expr);
+
+  C_Polyhedron p2(ph);
+
+  print_generators(p2, "*** p2 ***");
+
+  p2.affine_preimage(x, expr);
+
+  Generator_System gs1_known_result;
+  gs1_known_result.insert(point(4*x + 0*y));
+  gs1_known_result.insert(point(4*x + 3*y));
+  gs1_known_result.insert(point(7*x + 0*y));
+  gs1_known_result.insert(point(7*x + 3*y));
+  C_Polyhedron p1_known_result(gs1_known_result);
+
+  Generator_System gs2_known_result;
+  gs2_known_result.insert(point(-4*x + 0*y));
+  gs2_known_result.insert(point(-4*x + 3*y));
+  gs2_known_result.insert(point(-1*x + 0*y));
+  gs2_known_result.insert(point(-1*x + 3*y));
+  C_Polyhedron p2_known_result(gs2_known_result);
+
+  bool ok = (p1 == p1_known_result && p2 == p2_known_result);
+
+  print_generators(p1 ,"*** p1 ***");
+  print_generators(p1_known_result, "*** p1_known_result ***");
+  print_generators(p2 ,"*** p2 ***");
+  print_generators(p2_known_result, "*** p2_known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/append1.cc b/tests/Polyhedron/append1.cc
new file mode 100644
index 0000000..5dac713
--- /dev/null
+++ b/tests/Polyhedron/append1.cc
@@ -0,0 +1,113 @@
+/* An example of iteration to a post-fixpoint.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+                 dimension_type offset,
+                 C_Polyhedron& q) {
+  C_Polyhedron r(offset);
+  r.concatenate_assign(p);
+  q.intersection_assign(r);
+}
+
+} // namespace
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // append(A,B,C) :- A = [], B = C.
+  C_Polyhedron base(3);
+  base.add_constraint(A == 0);
+  base.add_constraint(B >= 0);
+  base.add_constraint(C == B);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+  C_Polyhedron inductive(6);
+  inductive.add_constraint(A + F == C + D);
+  inductive.add_constraint(B == E);
+  inductive.add_constraint(C + D >= A);
+  inductive.add_constraint(D >= 0);
+  inductive.add_constraint(B >= 0);
+  inductive.add_constraint(A >= D + 1);
+
+  print_constraints(inductive, "*** inductive ***");
+
+  // Initialize the fixpoint iteration.
+  C_Polyhedron current = base;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the polyhedron computed at the previous iteration.
+  C_Polyhedron previous;
+  do {
+    previous = current;
+    current = inductive;
+    shift_rename_add(previous, 3, current);
+
+    print_constraints(current, "*** after shift_rename_add ***");
+
+    Variables_Set dimensions_to_remove;
+    // Deliberately inserted out of order (!).
+    dimensions_to_remove.insert(D);
+    dimensions_to_remove.insert(F);
+    dimensions_to_remove.insert(E);
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.upper_bound_assign(previous);
+    (void) current.is_empty();
+
+    print_constraints(current, "*** after upper_bound_assign ***");
+
+  } while (current != previous);
+
+  C_Polyhedron expected(3);
+  expected.add_constraint(A + B == C);
+  expected.add_constraint(B >= 0);
+  expected.add_constraint(C >= B);
+
+  print_constraints(expected, "*** expected ***");
+
+  return current == expected ? true : false;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
+
diff --git a/tests/Polyhedron/append2.cc b/tests/Polyhedron/append2.cc
new file mode 100644
index 0000000..c87c2fb
--- /dev/null
+++ b/tests/Polyhedron/append2.cc
@@ -0,0 +1,132 @@
+/* An example of iteration to a post-fixpoint.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+                 dimension_type offset,
+                 C_Polyhedron& q) {
+  C_Polyhedron r(offset);
+  r.concatenate_assign(p);
+  q.intersection_assign(r);
+}
+
+void
+append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+            dimension_type& offset, unsigned int& arity,
+            unsigned int& num_vars) {
+  offset = 3;
+  arity = 3;
+  num_vars = 6;
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // append(A,B,C) :- A = [], B = C.
+  base.add_space_dimensions_and_embed(3);
+  base.add_constraint(A == 0);
+  base.add_constraint(B >= 0);
+  base.add_constraint(C == B);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+  induct.add_space_dimensions_and_embed(6);
+  induct.add_constraint(A + F == C + D);
+  induct.add_constraint(B == E);
+  induct.add_constraint(C + D >= A);
+  induct.add_constraint(D >= 0);
+  induct.add_constraint(B >= 0);
+  induct.add_constraint(A >= D + 1);
+
+  print_constraints(induct, "*** inductive ***");
+
+  expect.add_space_dimensions_and_embed(3);
+  expect.add_constraint(A + B == C);
+  expect.add_constraint(B >= 0);
+  expect.add_constraint(C >= B);
+}
+
+void
+fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
+          dimension_type offset, unsigned int arity, unsigned int num_vars) {
+  // Initialize the fixpoint iteration.
+  C_Polyhedron current = start;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the polyhedron computed at the previous iteration.
+  C_Polyhedron previous;
+  do {
+    previous = current;
+    current = induct;
+    shift_rename_add(previous, offset, current);
+
+    print_constraints(current, "*** after shift_rename_add ***");
+
+    Variables_Set dimensions_to_remove;
+    for (unsigned int i = num_vars-1 ; i >= arity; --i )
+      dimensions_to_remove.insert(Variable(i));
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.upper_bound_assign(previous);
+    (void) current.is_empty();
+
+    print_constraints(current, "*** after upper_bound_assign ***");
+
+  } while (current != previous);
+  finish = current;
+}
+
+} // namespace
+
+bool
+test01() {
+  C_Polyhedron start;
+  C_Polyhedron induct;
+  C_Polyhedron expect;
+  dimension_type recursive_offset;
+  unsigned int arity;
+  unsigned int num_vars;
+  append_init(start, induct, expect, recursive_offset, arity, num_vars);
+  C_Polyhedron final;
+  fix_point(start, induct, final, recursive_offset, arity, num_vars);
+
+  print_constraints(expect, "*** expected ***");
+
+  return final == expect ? true : false;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load1.cc b/tests/Polyhedron/ascii_dump_load1.cc
new file mode 100644
index 0000000..319b600
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load1.cc
@@ -0,0 +1,602 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A - B >= 2);
+  ph1.add_constraint(B >= 0);
+
+  ph1.minimized_generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  f.seekp(0);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "space_dim");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "-ZE");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "con_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "gen_sys");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "A\n";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test09() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test10() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_g");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test11() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test12() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_up-to-date)");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test13() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test14() {
+  const char* my_file = "ascii_dump_load1.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_g");
+  f.seekp(0, ios_base::cur);
+  f << "\nA";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test15() {
+  const char* my_file = "ascii_dump_load1.dat";
+  C_Polyhedron ph1;
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+bool
+test16() {
+  const char* my_file = "ascii_dump_load1.dat";
+  C_Polyhedron ph1(2, EMPTY);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+bool
+test17() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test18() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test19() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test20() {
+  const char* my_file = "ascii_dump_load1.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load2.cc b/tests/Polyhedron/ascii_dump_load2.cc
new file mode 100644
index 0000000..b91e485
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load2.cc
@@ -0,0 +1,139 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS  +SC";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS  +GS";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load2.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  +CM +GM  +CS  +GS  -SC";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load2.dat";
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  C_Polyhedron ph1(gs);
+  ph1.constraints();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph1.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  ph2.ascii_load(f);
+  close(f);
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/ascii_dump_load3.cc b/tests/Polyhedron/ascii_dump_load3.cc
new file mode 100644
index 0000000..c7f5f43
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load3.cc
@@ -0,0 +1,434 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+bool
+test01() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == 2);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test02() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == 2);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "=");
+  f.seekp(0, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test03() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A == 2);
+  ph1.add_constraint(B >= 0);
+
+  Constraint_System cs = ph1.constraints();
+
+  C_Polyhedron ph(6);
+  ph.add_constraints(cs);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "=");
+  f.seekp(-6, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test04() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "NECESSARILY_CLOSED");
+  f.seekp(-2, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test05() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "x");
+  f.seekp(1, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test06() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "(not_sorted)");
+  f.seekp(-2, ios_base::cur);
+  f << "A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test07() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  ph.generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  do
+    f >> str;
+  while (str != "x");
+  f.seekp(0, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test08() {
+  const char* my_file = "ascii_dump_load3.dat";
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  ph.generators();
+
+  fstream f;
+  open(f, my_file, ios_base::out);
+  ph.ascii_dump(f);
+  close(f);
+
+  open(f, my_file, ios_base::in | ios_base::out);
+  string str;
+  do
+    f >> str;
+  while (str != "sat_c");
+  f.seekp(8, ios_base::cur);
+  f << " A";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test09() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    << "3 x 3 (not_sorted)\n"
+    << "1 0 0";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test10() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    << "3 x 3 (not_sorted)\n"
+    << "1 0 0   >=\n"
+    << "0 1 0   >=\n"
+    << "0 0 1   >=\n\n"
+    << "gen_sys (not_up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    <<" 3 x 3 (not_sorted)\n"
+    << "1 0 0";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test11() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NECESSARILY_CLOSED\n"
+    << "3";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test12() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 2\n"
+    << "-ZE -EM  -CM -GM  +CS -GS  -SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology";
+  close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+bool
+test13() {
+  const char* my_file = "ascii_dump_load3.dat";
+  fstream f;
+  open(f, my_file, ios_base::out);
+  f << "space_dim 3\n"
+    << "-ZE -EM  +CM +GM  +CS +GS  +SC -SG\n"
+    << "con_sys (up-to-date)\n"
+    << "topology NOT_NECESSARILY_CLOSED\n"
+    << "4 x 5 (sorted)\n"
+    << "1 0 0 0 -1   >\n"
+    << "0 0 0 0 1   >=\n"
+    << "0 0 1 0 0   >=\n"
+    << "-2 1 -1 0 0   >=\n"
+    << "\n"
+    << "gen_sys (up-to-date)\n"
+    << "topology NOT_NECESSARILY_CLOSED\n"
+    << "5 x 5 (sorted)\n"
+    << "0 0 0 1 0   L\n"
+    << "0 1 0 0 0   R\n"
+    << "0 1 1 0 0   R\n"
+    << "1 2 0 0 0   C\n"
+    << "1 2 0 0 1   P\n"
+    << "\n"
+    << "sat_c\n"
+    << "5";
+    close(f);
+
+  open(f, my_file, ios_base::in);
+  C_Polyhedron ph2;
+  bool ok = !ph2.ascii_load(f);
+  close(f);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/bgp99extrapolation1.cc b/tests/Polyhedron/bgp99extrapolation1.cc
new file mode 100644
index 0000000..1ecf2cb
--- /dev/null
+++ b/tests/Polyhedron/bgp99extrapolation1.cc
@@ -0,0 +1,160 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+const C_Polyhedron&
+aux1_test01(unsigned n) {
+  Variable x(0);
+  Variable y(1);
+
+  static std::vector<C_Polyhedron> p;
+  if (p.size() < 5) {
+    p.resize(5, C_Polyhedron(2));
+    p[2].add_constraint(0 <= x);
+    p[2].add_constraint(x <= 4);
+    p[2].add_constraint(0 <= y);
+    p[2].add_constraint(y <= 4);
+    p[1] = p[2];
+    p[1].add_constraint(x-y <= 3);
+    p[0] = p[1];
+    p[0].add_constraint(x+y >= 1);
+
+    p[3].add_constraint(0 <= x);
+    p[3].add_constraint(x <= 8);
+    p[3].add_constraint(0 <= y);
+    p[3].add_constraint(y <= 8);
+    p[3].add_constraint(x+y <= 14);
+    p[3].add_constraint(x-y >= -6);
+    p[4] = p[3];
+    p[3].add_constraint(5*x-y >= -2);
+    p[3].add_constraint(x+3*y >= 3);
+    p[4].add_constraint(4*x-y >= -3);
+    p[4].add_constraint(x+2*y >= 2);
+  }
+
+  if (n >= p.size()) {
+    unsigned new_size = p.size();
+    while (n >= new_size)
+      new_size *= 2;
+    p.resize(p.size()*2);
+  }
+
+  if (p[n].is_universe()) {
+    p[n] = aux1_test01(n-4);
+    p[n].affine_image(x, 2*x);
+    p[n].affine_image(y, 8 - 2*y);
+  }
+
+  return p[n];
+}
+
+Pointset_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+  Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
+  if (n == 0) {
+
+    nout << "S0 = { P0 }" << endl;
+
+    s.add_disjunct(aux1_test01(0));
+    return s;
+  }
+
+  const int p_base = (n-1)/3*4;
+
+  switch (n % 3) {
+  case 1:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 1 << ", "
+         << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 1));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 2:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 2 << ", "
+         << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 0:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 2 << ", "
+         << "P" << p_base + 4 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 4));
+    break;
+  }
+  return s;
+}
+
+void
+aux3_test01(std::ostream& s, const Variable v) {
+  s << char('x' + v.id());
+}
+
+bool
+test01() {
+  // Install the alternate output function.
+  Variable::set_output_function(aux3_test01);
+
+  Pointset_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+
+  nout << "T0 = " << T << endl;
+
+  bool converged = false;
+  for (unsigned n = 1; !converged && n <= 20; ++n) {
+    Pointset_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+
+    nout << "S" << n << " = " << Sn << endl;
+
+    Sn.BGP99_extrapolation_assign
+      (T, widen_fun_ref(&Polyhedron::H79_widening_assign), 2);
+
+    nout << "T" << n << " = " << Sn << endl;
+
+    if (Sn.definitely_entails(T))
+      converged = true;
+    else
+      swap(Sn, T);
+  }
+
+  return !converged;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F16(test01);
+END_MAIN
diff --git a/tests/Polyhedron/bgp99extrapolation2.cc b/tests/Polyhedron/bgp99extrapolation2.cc
new file mode 100644
index 0000000..d4f4ef3
--- /dev/null
+++ b/tests/Polyhedron/bgp99extrapolation2.cc
@@ -0,0 +1,256 @@
+/* Test Pointset_Powerset<PH>::BGP99_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+// Same test as test02, but using C_Polyhedron.
+// This overflows when using 8-bit coefficients.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ps1_1(2);
+  ps1_1.add_constraint(-A + B >= 5);
+  ps1_1.add_constraint(A - B >= -13);
+  ps1_1.add_constraint(A >= 3);
+  C_Polyhedron ps1_2(2);
+  ps1_2.add_constraint(-A + B >= 6);
+  ps1_2.add_constraint(A - B >= -16);
+  ps1_2.add_constraint(A >= 3);
+  C_Polyhedron ps1_3(2);
+  ps1_3.add_constraint(-A + B >= 7);
+  ps1_3.add_constraint(A - B >= -20);
+  ps1_3.add_constraint(A >= 4);
+  C_Polyhedron ps1_4(2);
+  ps1_4.add_constraint(-A + B >= 8);
+  ps1_4.add_constraint(A - B >= -24);
+  ps1_4.add_constraint(A >= 5);
+  C_Polyhedron ps1_5(2);
+  ps1_5.add_constraint(-A + B >= 10);
+  ps1_5.add_constraint(A - B >= -28);
+  ps1_5.add_constraint(A >= 6);
+  C_Polyhedron ps1_6(2);
+  ps1_6.add_constraint(-A + B >= 12);
+  ps1_6.add_constraint(A - B >= -32);
+  ps1_6.add_constraint(A >= 7);
+  C_Polyhedron ps1_7(2);
+  ps1_7.add_constraint(-A + B >= 2);
+  ps1_7.add_constraint(A - B >= -4);
+  ps1_7.add_constraint(A >= 0);
+  C_Polyhedron ps1_8(2);
+  ps1_8.add_constraint(-A + B >= 3);
+  ps1_8.add_constraint(A - B >= -8);
+  ps1_8.add_constraint(A >= 1);
+  C_Polyhedron ps1_9(2);
+  ps1_9.add_constraint(-A + B >= 4);
+  ps1_9.add_constraint(A - B >= -12);
+  ps1_9.add_constraint(A >= 2);
+
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  ps1.add_disjunct(ps1_1);
+  ps1.add_disjunct(ps1_2);
+  ps1.add_disjunct(ps1_3);
+  ps1.add_disjunct(ps1_4);
+  ps1.add_disjunct(ps1_5);
+  ps1.add_disjunct(ps1_6);
+  ps1.add_disjunct(ps1_7);
+  ps1.add_disjunct(ps1_8);
+  ps1.add_disjunct(ps1_9);
+
+  C_Polyhedron ps2_1(2);
+  ps2_1.add_constraint(-A + B >= 2);
+  ps2_1.add_constraint(A - B >= -4);
+  ps2_1.add_constraint(A >= 0);
+  C_Polyhedron ps2_2(2);
+  ps2_2.add_constraint(-A + B >= 3);
+  ps2_2.add_constraint(A - B >= -8);
+  ps2_2.add_constraint(A >= 1);
+  C_Polyhedron ps2_3(2);
+  ps2_3.add_constraint(-A + B >= 4);
+  ps2_3.add_constraint(A - B >= -12);
+  ps2_3.add_constraint(A >= 2);
+  C_Polyhedron ps2_4(2);
+  ps2_4.add_constraint(-A + B >= 6);
+  ps2_4.add_constraint(A - B >= -16);
+  ps2_4.add_constraint(A >= 3);
+
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+  ps2.add_disjunct(ps2_1);
+  ps2.add_disjunct(ps2_2);
+  ps2.add_disjunct(ps2_3);
+  ps2.add_disjunct(ps2_4);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** ps1 ***" << endl
+       << ps1 << endl;
+  nout << "*** ps2 ***" << endl
+       << ps2 << endl;
+
+  ps1.BGP99_extrapolation_assign
+    (ps2, widen_fun_ref(&Polyhedron::H79_widening_assign), 7);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  C_Polyhedron kr_1(2);
+  kr_1.add_constraint(A - B >= -16);
+  kr_1.add_constraint(A >= 3);
+  C_Polyhedron kr_2(2);
+  kr_2.add_constraint(-A + B >= 3);
+  kr_2.add_constraint(A >= 1);
+  C_Polyhedron kr_3(2);
+  kr_3.add_constraint(A - B >= -12);
+  known_result.add_disjunct(kr_1);
+  known_result.add_disjunct(kr_2);
+  known_result.add_disjunct(kr_3);
+
+  bool ok = ps1.geometrically_equals(known_result);
+
+  nout
+    << "*** ps1.BGP99_extrapolation_assign"
+    << "(ps2, widen_fun_ref(&H79_widening_assign), 7) ***"
+    << endl
+    << ps1 << endl;
+
+  return ok;
+}
+
+// Same test as test01, but using NNC_Polyhedron.
+// This only overflows when using 8-bit coefficients with assertions on.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ps1_1(2);
+  ps1_1.add_constraint(-A + B >= 5);
+  ps1_1.add_constraint(A - B >= -13);
+  ps1_1.add_constraint(A >= 3);
+  NNC_Polyhedron ps1_2(2);
+  ps1_2.add_constraint(-A + B >= 6);
+  ps1_2.add_constraint(A - B >= -16);
+  ps1_2.add_constraint(A >= 3);
+  NNC_Polyhedron ps1_3(2);
+  ps1_3.add_constraint(-A + B >= 7);
+  ps1_3.add_constraint(A - B >= -20);
+  ps1_3.add_constraint(A >= 4);
+  NNC_Polyhedron ps1_4(2);
+  ps1_4.add_constraint(-A + B >= 8);
+  ps1_4.add_constraint(A - B >= -24);
+  ps1_4.add_constraint(A >= 5);
+  NNC_Polyhedron ps1_5(2);
+  ps1_5.add_constraint(-A + B >= 10);
+  ps1_5.add_constraint(A - B >= -28);
+  ps1_5.add_constraint(A >= 6);
+  NNC_Polyhedron ps1_6(2);
+  ps1_6.add_constraint(-A + B >= 12);
+  ps1_6.add_constraint(A - B >= -32);
+  ps1_6.add_constraint(A >= 7);
+  NNC_Polyhedron ps1_7(2);
+  ps1_7.add_constraint(-A + B >= 2);
+  ps1_7.add_constraint(A - B >= -4);
+  ps1_7.add_constraint(A >= 0);
+  NNC_Polyhedron ps1_8(2);
+  ps1_8.add_constraint(-A + B >= 3);
+  ps1_8.add_constraint(A - B >= -8);
+  ps1_8.add_constraint(A >= 1);
+  NNC_Polyhedron ps1_9(2);
+  ps1_9.add_constraint(-A + B >= 4);
+  ps1_9.add_constraint(A - B >= -12);
+  ps1_9.add_constraint(A >= 2);
+
+  Pointset_Powerset<NNC_Polyhedron> ps1(2, EMPTY);
+  ps1.add_disjunct(ps1_1);
+  ps1.add_disjunct(ps1_2);
+  ps1.add_disjunct(ps1_3);
+  ps1.add_disjunct(ps1_4);
+  ps1.add_disjunct(ps1_5);
+  ps1.add_disjunct(ps1_6);
+  ps1.add_disjunct(ps1_7);
+  ps1.add_disjunct(ps1_8);
+  ps1.add_disjunct(ps1_9);
+
+  NNC_Polyhedron ps2_1(2);
+  ps2_1.add_constraint(-A + B >= 2);
+  ps2_1.add_constraint(A - B >= -4);
+  ps2_1.add_constraint(A >= 0);
+  NNC_Polyhedron ps2_2(2);
+  ps2_2.add_constraint(-A + B >= 3);
+  ps2_2.add_constraint(A - B >= -8);
+  ps2_2.add_constraint(A >= 1);
+  NNC_Polyhedron ps2_3(2);
+  ps2_3.add_constraint(-A + B >= 4);
+  ps2_3.add_constraint(A - B >= -12);
+  ps2_3.add_constraint(A >= 2);
+  NNC_Polyhedron ps2_4(2);
+  ps2_4.add_constraint(-A + B >= 6);
+  ps2_4.add_constraint(A - B >= -16);
+  ps2_4.add_constraint(A >= 3);
+
+  Pointset_Powerset<NNC_Polyhedron> ps2(2, EMPTY);
+  ps2.add_disjunct(ps2_1);
+  ps2.add_disjunct(ps2_2);
+  ps2.add_disjunct(ps2_3);
+  ps2.add_disjunct(ps2_4);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** ps1 ***" << endl
+       << ps1 << endl;
+  nout << "*** ps2 ***" << endl
+       << ps2 << endl;
+
+  ps1.BGP99_extrapolation_assign
+    (ps2, widen_fun_ref(&Polyhedron::H79_widening_assign), 7);
+
+  Pointset_Powerset<NNC_Polyhedron> known_result(2, EMPTY);
+  NNC_Polyhedron kr_1(2);
+  kr_1.add_constraint(A - B >= -16);
+  kr_1.add_constraint(A >= 3);
+  NNC_Polyhedron kr_2(2);
+  kr_2.add_constraint(-A + B >= 3);
+  kr_2.add_constraint(A >= 1);
+  NNC_Polyhedron kr_3(2);
+  kr_3.add_constraint(A - B >= -12);
+  known_result.add_disjunct(kr_1);
+  known_result.add_disjunct(kr_2);
+  known_result.add_disjunct(kr_3);
+
+  bool ok = ps1.geometrically_equals(known_result);
+
+  nout
+    << "*** ps1.BGP99_extrapolation_assign"
+    << "(ps2, widen_fun_ref(&H79_widening_assign), 7) ***"
+    << endl
+    << ps1 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8A(test02);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening1.cc b/tests/Polyhedron/bhrz03widening1.cc
new file mode 100644
index 0000000..052d618
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening1.cc
@@ -0,0 +1,755 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A));
+  gs1.insert(point(B));
+  gs1.insert(point(A + B));
+  gs1.insert(point(C));
+  gs1.insert(point(A + C));
+  gs1.insert(point(B + C));
+  gs1.insert(point(A + B + C));
+  C_Polyhedron ph1(gs1);
+
+  C_Polyhedron ph1_copy(ph1);
+
+  Generator_System gs2;
+  gs2.insert(point(0*C));
+  gs2.insert(point(A));
+  gs2.insert(point(B));
+  gs2.insert(point(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == ph1_copy);
+
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+
+  C_Polyhedron ph1_copy(ph1);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == ph1_copy);
+
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(2*A));
+  gs1.insert(point(2*B));
+
+  C_Polyhedron ph1(gs1);
+  C_Polyhedron ph1_copy(ph1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(A));
+  gs2.insert(point(B));
+  gs2.insert(point(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == ph1_copy);
+
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(2*A));
+  gs1.insert(closure_point(A+B));
+  gs1.insert(closure_point(3*A+B));
+  NNC_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(2*A));
+  gs2.insert(closure_point(B));
+  gs2.insert(closure_point(4*A+B));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B < 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(2*A - B >= 0);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(2*A + B <= 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(2*A + B >= 0);
+  known_result.add_constraint(2*A - B <= 4);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A - B <= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(2*A - B <= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + 4*B + 2*C));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + 2*B + 4*C));
+  C_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(line(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B + C));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(line(A));
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + B + 2*C));
+  C_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+const Generator_System&
+aux1_test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  static Generator_System gs;
+  static bool initialized = false;
+  if (!initialized) {
+    gs.insert(point());
+    gs.insert(ray(C));
+    gs.insert(ray(D));
+    gs.insert(ray(E));
+    gs.insert(ray(A + D));
+    gs.insert(ray(A + B + E));
+    initialized = true;
+  }
+  return gs;
+}
+
+C_Polyhedron
+aux2_test09(unsigned n) {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph(aux1_test09());
+  n += 2;
+  ph.add_generator(ray(A + (n-1)*B + E));
+  if (n % 2 == 0) {
+    // Even.
+    unsigned m = n / 2;
+    ph.add_generator(ray(m*B + E));
+    ph.add_generator(ray(A + (m-1)*B + D));
+  }
+  else {
+    // Odd.
+    ph.add_generator(ray(n*B + 2*E));
+    ph.add_generator(ray(2*A + (n-2)*B + 2*D));
+  }
+  return ph;
+}
+
+bool
+test09() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux2_test09(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1.generators(),
+                     "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux2_test09(i);
+    print_generators(p_i.generators(), "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.upper_bound_assign(p_i);
+    print_generators(q_i.generators(),
+                     "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i.generators(),
+                     "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+
+      C_Polyhedron known_result(5);
+      known_result.add_constraint(A >= 0);
+      known_result.add_constraint(B >= 0);
+      known_result.add_constraint(C >= 0);
+      known_result.add_constraint(D >= 0);
+      known_result.add_constraint(E >= 0);
+      known_result.add_constraint(-A + B + D >= 0);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+bool
+test10() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.H79_widening_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 2);
+  ph2.add_constraint(A <= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.BHRZ03_widening_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(-A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(-A - 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(A - 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(-A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(-A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(-A - 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(-A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(A - 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(-A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening2.cc b/tests/Polyhedron/bhrz03widening2.cc
new file mode 100644
index 0000000..35b7dd4
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening2.cc
@@ -0,0 +1,262 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(-A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(-A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-A));
+  gs1.insert(ray(-A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-A));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(-B));
+  gs1.insert(ray(-A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(-B));
+  gs2.insert(ray(-A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(-A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B <= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening3.cc b/tests/Polyhedron/bhrz03widening3.cc
new file mode 100644
index 0000000..37fe98f
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening3.cc
@@ -0,0 +1,649 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B > 0);
+  ph1.add_constraint(A - B < 1);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A > 0);
+  ph2.add_constraint(A < 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  gs1.insert(closure_point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B + 2*C));
+  NNC_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(A));
+  gs2.insert(closure_point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(B));
+  gs2.insert(ray(A + B + C));
+  NNC_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.BHRZ03_widening_assign(ph2);
+
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(C >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after BHRZ03_widening_assign ***");
+
+  return ok;
+}
+
+Generator_System
+aux1_test03(const Coefficient& half_side) {
+  // Square.
+  Variable A(0);
+  Variable B(1);
+  Generator_System gs;
+  gs.insert(point(half_side*A + half_side*B));
+  gs.insert(point(half_side*A - half_side*B));
+  gs.insert(point(-half_side*A - half_side*B));
+  gs.insert(point(-half_side*A + half_side*B));
+  return gs;
+}
+
+Generator_System
+aux2_test03(const Coefficient& half_diagonal) {
+  // Rhombus.
+  Variable A(0);
+  Variable B(1);
+  Generator_System gs;
+  gs.insert(point(half_diagonal*A));
+  gs.insert(point(half_diagonal*B));
+  gs.insert(point(-half_diagonal*A));
+  gs.insert(point(-half_diagonal*B));
+  return gs;
+}
+
+C_Polyhedron
+aux3_test03(unsigned n) {
+
+  Coefficient half_diagonal = 2;
+  for (unsigned i = n / 8; i-- > 0; ) {
+    half_diagonal *= 2;
+  }
+  Coefficient half_side = half_diagonal;
+
+  Generator_System gs;
+  if (n % 8 < 4) {
+    half_side /= 2;
+    gs = aux1_test03(half_side);
+    Generator_System gs2 = aux2_test03(half_diagonal);
+    Generator_System::const_iterator gi = gs2.begin();
+    for (int i = n % 8; i-- > 0; )
+      gs.insert(*gi++);
+  }
+  else {
+    gs = aux2_test03(half_diagonal);
+    Generator_System gs2 = aux1_test03(half_side);
+    Generator_System::const_iterator gi = gs2.begin();
+    for (int i = n % 8 - 4; i-- > 0; )
+      gs.insert(*gi++);
+  }
+  C_Polyhedron ph = C_Polyhedron(gs);
+
+  return ph;
+}
+
+bool
+test03() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux3_test03(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1.generators(),
+                     "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux3_test03(i);
+    print_generators(p_i.generators(), "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.upper_bound_assign(p_i);
+    print_generators(q_i.generators(),
+                     "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i.generators(),
+                     "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+      C_Polyhedron known_result(2);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+Generator_System
+aux1_test04() {
+  Variable A(0);
+  Variable B(1);
+  Generator_System new_gs;
+  new_gs.insert(point(A));
+  new_gs.insert(point(-B));
+  new_gs.insert(point(-A));
+  new_gs.insert(point(B));
+  return new_gs;
+}
+
+Generator
+aux2_test04(const Generator& p1, const Generator& p2, unsigned magic_number) {
+  // Splitting segment.
+  Linear_Expression expr1(p1.expression());
+  Linear_Expression expr2(p2.expression());
+  const Coefficient& d1 = p1.divisor();
+  const Coefficient& d2 = p2.divisor();
+  expr1 *= d2;
+  expr2 *= d1;
+  expr1 += expr2;
+  // The divisor for the average is 2 * d1 * d2.
+  // by carefully taking a smaller divisor, we obtain a point
+  // that won't be redundant in the polyhedron.
+  // NOTE: I am not *sure* this dirty kludge of using such
+  // a magic number will always succeed.
+  return point((magic_number+1)*expr1, magic_number*2*d1*d2);
+}
+
+Generator_System
+aux3_test04(const Generator_System& gs, unsigned magic_number) {
+  // Double generators.
+  Generator_System new_gs;
+  Generator_System::const_iterator i = gs.begin();
+  Generator_System::const_iterator gs_end = gs.end();
+  while (true) {
+    const Generator& g = *i;
+    new_gs.insert(g);
+    ++i;
+    if (i != gs_end)
+      new_gs.insert(aux2_test04(g, *i, magic_number));
+    else {
+      // Split the last segment.
+      Generator_System::const_iterator gs_begin = gs.begin();
+      new_gs.insert(aux2_test04(g, *gs_begin, magic_number));
+      break;
+    }
+  }
+  return new_gs;
+}
+
+C_Polyhedron
+aux4_test04(unsigned n) {
+
+  unsigned needed_vertices = n + 4;
+
+  unsigned magic_number = 1;
+  unsigned magic_factor = 4;
+  Generator_System gs = aux1_test04();
+  unsigned gs_vertices = 4;
+
+  while (gs_vertices * 2 <= needed_vertices) {
+    magic_number *= magic_factor;
+    gs = aux3_test04(gs, magic_number);
+    gs_vertices *= 2;
+  }
+
+  if (gs_vertices < needed_vertices) {
+    magic_number *= magic_factor;
+    Generator_System gs2 = aux3_test04(gs, magic_number);
+    Generator_System::const_iterator gs2_i = gs2.begin();
+    for ( ; gs_vertices < needed_vertices; ++gs_vertices) {
+      // Skip the even indexed vertices of gs2.
+      ++gs2_i;
+      // Add the odd indexed vertices of gs2.
+      gs.insert(*gs2_i++);
+    }
+  }
+
+  C_Polyhedron ph = C_Polyhedron(gs);
+  return ph;
+}
+
+bool
+test04() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux4_test04(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1.generators(),
+                     "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux4_test04(i);
+    print_generators(p_i.generators(), "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.upper_bound_assign(p_i);
+    print_generators(q_i.generators(),
+                     "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i.generators(),
+                     "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+      C_Polyhedron known_result(2);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+Generator_System
+aux1_test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System new_gs;
+  new_gs.insert(ray(A + C));
+  new_gs.insert(ray(-B + C));
+  new_gs.insert(ray(-A + C));
+  new_gs.insert(ray(B + C));
+  return new_gs;
+}
+
+Generator
+aux2_test05(const Generator& r1, const Generator& r2, unsigned magic_number) {
+  // Splitting facet.
+  //  Variable A(0);
+  //  Variable B(1);
+  Variable C(2);
+  Linear_Expression expr1(r1.expression());
+  Linear_Expression expr2(r2.expression());
+  expr1 += expr2;
+  // NOTE: I am not *sure* this dirty kludge of using such
+  // a magic number will always succeed.
+  expr1 *= (magic_number + 1);
+  expr1 -= C;
+  return ray(expr1);
+}
+
+Generator_System
+aux3_test05(const Generator_System& gs, unsigned magic_number) {
+  // Double generators.
+  Generator_System new_gs;
+  Generator_System::const_iterator i = gs.begin();
+  Generator_System::const_iterator gs_end = gs.end();
+  while (true) {
+    const Generator& g = *i;
+    new_gs.insert(g);
+    ++i;
+    if (i != gs_end)
+      new_gs.insert(aux2_test05(g, *i, magic_number));
+    else {
+      // Split the last facet.
+      Generator_System::const_iterator gs_begin = gs.begin();
+      new_gs.insert(aux2_test05(g, *gs_begin, magic_number));
+      break;
+    }
+  }
+  return new_gs;
+}
+
+C_Polyhedron
+aux4_test05(unsigned n) {
+  unsigned needed_facets = n + 4;
+  unsigned magic_number = 1;
+  unsigned magic_factor = 4;
+  Generator_System gs = aux1_test05();
+  unsigned gs_facets = 4;
+
+  while (gs_facets * 2 <= needed_facets) {
+    magic_number *= magic_factor;
+    gs = aux3_test05(gs, magic_number);
+    gs_facets *= 2;
+  }
+
+  if (gs_facets < needed_facets) {
+    magic_number *= magic_factor;
+    Generator_System gs2 = aux3_test05(gs, magic_number);
+    Generator_System::const_iterator gs2_i = gs2.begin();
+    for ( ; gs_facets < needed_facets; ++gs_facets) {
+      // Skip the even indexed facets of gs2.
+      ++gs2_i;
+      // Add the odd indexed facets of gs2.
+      gs.insert(*gs2_i++);
+    }
+  }
+  gs.insert(point());
+  C_Polyhedron ph = C_Polyhedron(gs);
+  return ph;
+}
+
+bool
+test05() {
+  // Chain condition for widenings:
+  // for each increasing chain of descriptions p_0, p_1, ..., p_i, ...,
+  // the sequence q_0, q_1, ..., q_i, ... defined by q_0 = p_0 and
+  // for each i >= 1, q_i = q_{i-1} \nabla p_i is ultimately stationary.
+  //  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  // Initialization: set q_0.
+  C_Polyhedron q_i_minus_1 = aux4_test05(0);
+
+  for (unsigned i = 1; i <= 100; ++i) {
+    print_generators(q_i_minus_1, "*** Result of the previous iteration ***");
+
+    C_Polyhedron p_i = aux4_test05(i);
+    print_generators(p_i, "*** New stuff ***");
+
+    C_Polyhedron q_i = q_i_minus_1;
+    q_i.upper_bound_assign(p_i);
+    print_generators(q_i, "*** Poly-hull of previous with new ***");
+
+    q_i.BHRZ03_widening_assign(q_i_minus_1);
+    print_generators(q_i, "*** Result of widening poly-hull with new ***");
+
+    if (q_i == q_i_minus_1) {
+      C_Polyhedron known_result(3, UNIVERSE);
+      known_result.add_constraint(-B + C >= 0);
+
+      bool ok = (q_i == known_result);
+
+      print_constraints(q_i, "*** The constraints of the fix point ***");
+      print_generators(q_i, "*** The generators of the fix point ***");
+
+      return ok;
+    }
+    q_i_minus_1 = q_i;
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A + 2*B));
+  gs1.insert(ray(A));
+  gs1.insert(ray(2*A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(A + 2*B));
+  gs2.insert(ray(A));
+  gs2.insert(ray(A + B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*A- B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A + 3*B));
+  gs1.insert(ray(A));
+  gs1.insert(ray(2*A - B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(A + 3*B));
+  gs2.insert(ray(A + B));
+  gs2.insert(ray(A - B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(3*A - B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(6*A - B));
+  gs1.insert(point(6*B));
+  gs1.insert(point(A + 10*B));
+  gs1.insert(ray(A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(6*A - B));
+  gs2.insert(point(6*B));
+  gs2.insert(point(A + 10*B));
+  gs2.insert(ray(A + B));
+  gs2.insert(ray(A + 3*B));
+  gs2.insert(point(-4*A + 3*B, 13));
+  gs2.insert(point(-2*A + B, 8));
+  gs2.insert(point(-A + 12*B, 4));
+
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  // This is the result of applying H79.
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(-36*A + 6*B, 25));
+  gs_known_result.insert(ray(A + 4*B));
+  gs_known_result.insert(ray(6*A - B));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+  print_constraints(ph2, "*** after ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(closure_point());
+  gs1.insert(closure_point(A + B));
+  gs1.insert(point(2*A + B, 2));
+  gs1.insert(ray(A));
+  NNC_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(closure_point());
+  gs2.insert(closure_point(A + B));
+  gs2.insert(closure_point(B, 2));
+  gs2.insert(point(2*A + B, 2));
+  gs2.insert(ray(A));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.BHRZ03_widening_assign(ph1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(B > 0);
+  known_result.add_constraint(B < 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after  ph2.BHRZ03_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(B));
+  gs.insert(point(A + 2*B));
+  gs.insert(point(A + B));
+  NNC_Polyhedron ph(gs);
+
+  gs.clear();
+  gs.insert(point());
+  gs.insert(point(B));
+  gs.insert(point(A + 2*B));
+  gs.insert(closure_point(A));
+  NNC_Polyhedron ph1(gs);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.BHRZ03_widening_assign(ph);
+
+  gs.clear();
+  gs.insert(point());
+  gs.insert(point(B));
+  gs.insert(point(A + 2*B));
+  gs.insert(ray(-B));
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.BHRZ03_widening_assin(ph) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST_F8(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST_F8(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/bhz03widening1.cc b/tests/Polyhedron/bhz03widening1.cc
new file mode 100644
index 0000000..d2886a1
--- /dev/null
+++ b/tests/Polyhedron/bhz03widening1.cc
@@ -0,0 +1,724 @@
+/* Test Pointset_Powerset<PH>::BHZ03_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+const C_Polyhedron&
+aux1_test01(unsigned n) {
+  Variable x(0);
+  Variable y(1);
+
+  static std::vector<C_Polyhedron> p;
+  if (p.size() < 5) {
+    p.resize(5, C_Polyhedron(2));
+    p[2].add_constraint(0 <= x);
+    p[2].add_constraint(x <= 4);
+    p[2].add_constraint(0 <= y);
+    p[2].add_constraint(y <= 4);
+    p[1] = p[2];
+    p[1].add_constraint(x-y <= 3);
+    p[0] = p[1];
+    p[0].add_constraint(x+y >= 1);
+
+    p[3].add_constraint(0 <= x);
+    p[3].add_constraint(x <= 8);
+    p[3].add_constraint(0 <= y);
+    p[3].add_constraint(y <= 8);
+    p[3].add_constraint(x+y <= 14);
+    p[3].add_constraint(x-y >= -6);
+    p[4] = p[3];
+    p[3].add_constraint(5*x-y >= -2);
+    p[3].add_constraint(x+3*y >= 3);
+    p[4].add_constraint(4*x-y >= -3);
+    p[4].add_constraint(x+2*y >= 2);
+  }
+
+  if (n >= p.size()) {
+    unsigned new_size = p.size();
+    while (n >= new_size)
+      new_size *= 2;
+    p.resize(p.size()*2);
+  }
+
+  if (p[n].is_universe()) {
+    p[n] = aux1_test01(n-4);
+    p[n].affine_image(x, 2*x);
+    p[n].affine_image(y, 8 - 2*y);
+  }
+
+  return p[n];
+}
+
+Pointset_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+  Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
+  if (n == 0) {
+
+    nout << "S0 = { P0 }" << endl;
+
+    s.add_disjunct(aux1_test01(0));
+    return s;
+  }
+
+  const int p_base = (n-1)/3*4;
+
+  switch (n % 3) {
+  case 1:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 1 << ", "
+         << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 1));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 2:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 2 << ", "
+         << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 3));
+    break;
+  case 0:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 2 << ", "
+         << "P" << p_base + 4 << " }" << endl;
+
+    s.add_disjunct(aux1_test01(p_base + 2));
+    s.add_disjunct(aux1_test01(p_base + 4));
+    break;
+  }
+  return s;
+}
+
+void
+aux3_test01(std::ostream& s, const Variable v) {
+  s << char('x' + v.id());
+}
+
+bool
+test01() {
+  // Install the alternate output function.
+  Variable::set_output_function(aux3_test01);
+
+  Pointset_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+  nout << "T0 = " << T << endl;
+
+  bool converged = false;
+  for (unsigned n = 1; !converged && n <= 20; ++n) {
+    Pointset_Powerset<C_Polyhedron> Sn = aux2_test01(n);
+
+    nout << "S" << n << " = " << Sn << endl;
+
+    Sn.upper_bound_assign(T);
+    Sn.BHZ03_widening_assign<BHRZ03_Certificate>
+      (T, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+    nout << "T" << n << " = " << Sn << endl;
+
+    if (Sn.definitely_entails(T))
+      converged = true;
+    else
+      swap(Sn, T);
+  }
+
+  return converged;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron p(2);
+  C_Polyhedron q(2);
+  C_Polyhedron r(2);
+  C_Polyhedron s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  Pointset_Powerset<C_Polyhedron> P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  Pointset_Powerset<C_Polyhedron> Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_P = P;
+  P.BHZ03_widening_assign<BHRZ03_Certificate>
+    (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+bool
+test03() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(X >= 0);
+  p1.add_constraint(Y >= 0);
+  p1.add_constraint(X <= 2);
+  p1.add_constraint(Y <= 1);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 2);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 3);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 3);
+  p3.add_constraint(Y >= 1);
+  p3.add_constraint(X <= 4);
+  p3.add_constraint(Y <= 3);
+
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 0);
+  p4.add_constraint(Y >= 4);
+  p4.add_constraint(X <= 2);
+  p4.add_constraint(Y <= 5);
+
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(p1);
+  T2.add_disjunct(p2);
+  T2.add_disjunct(p3);
+  T2.add_disjunct(p4);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  C_Polyhedron pd(2);
+  pd.add_constraint(X >= 0);
+  pd.add_constraint(X <= 4);
+  pd.add_constraint(X + 2*Y >= 10);
+
+  Pointset_Powerset<C_Polyhedron> known_result = old_T2;
+  known_result.add_disjunct(pd);
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+  nout << "known result" << " = " << known_result << endl;
+
+  return T2 == known_result
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+const C_Polyhedron&
+aux1_test04(unsigned n) {
+  Variable x(0);
+  Variable y(1);
+  static std::vector<C_Polyhedron> p;
+  if (p.size() < 5) {
+    p.resize(5, C_Polyhedron(2));
+    p[2].add_constraint(0 <= x);
+    p[2].add_constraint(x <= 4);
+    p[2].add_constraint(0 <= y);
+    p[2].add_constraint(y <= 4);
+    p[1] = p[2];
+    p[1].add_constraint(x-y <= 3);
+    p[0] = p[1];
+    p[0].add_constraint(x+y >= 1);
+
+    p[3].add_constraint(0 <= x);
+    p[3].add_constraint(x <= 8);
+    p[3].add_constraint(0 <= y);
+    p[3].add_constraint(y <= 8);
+    p[3].add_constraint(x+y <= 14);
+    p[3].add_constraint(x-y >= -6);
+    p[4] = p[3];
+    p[3].add_constraint(5*x-y >= -2);
+    p[3].add_constraint(x+3*y >= 3);
+    p[4].add_constraint(4*x-y >= -3);
+    p[4].add_constraint(x+2*y >= 2);
+  }
+
+  if (n >= p.size()) {
+    unsigned new_size = p.size();
+    while (n >= new_size)
+      new_size *= 2;
+    p.resize(p.size()*2);
+  }
+
+  if (p[n].is_universe()) {
+    p[n] = aux1_test04(n-4);
+    p[n].affine_image(x, 2*x);
+    p[n].affine_image(y, 8 - 2*y);
+  }
+
+  return p[n];
+}
+
+Pointset_Powerset<C_Polyhedron>
+aux2_test04(unsigned n) {
+  Pointset_Powerset<C_Polyhedron> s(2, EMPTY);
+  if (n == 0) {
+
+    nout << "S0 = { P0 }" << endl;
+
+    s.add_disjunct(aux1_test04(0));
+    return s;
+  }
+
+  const int p_base = (n-1)/3*4;
+
+  switch (n % 3) {
+  case 1:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 1 << ", "
+         << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test04(p_base + 1));
+    s.add_disjunct(aux1_test04(p_base + 3));
+    break;
+  case 2:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 2 << ", "
+         << "P" << p_base + 3 << " }" << endl;
+
+    s.add_disjunct(aux1_test04(p_base + 2));
+    s.add_disjunct(aux1_test04(p_base + 3));
+    break;
+  case 0:
+
+    nout << "S" << n << " = { "
+         << "P" << p_base + 2 << ", "
+         << "P" << p_base + 4 << " }" << endl;
+
+    s.add_disjunct(aux1_test04(p_base + 2));
+    s.add_disjunct(aux1_test04(p_base + 4));
+    break;
+  }
+  return s;
+}
+
+void
+aux3_test04(std::ostream& s, const Variable v) {
+  s << char('x' + v.id());
+}
+
+bool
+test04() {
+  // Install the alternate output function.
+  Variable::set_output_function(aux3_test04);
+
+  Pointset_Powerset<C_Polyhedron> T = aux2_test04(0);
+
+  nout << "T0 = " << T << endl;
+
+  bool converged = false;
+  for (unsigned n = 1; !converged && n <= 20; ++n) {
+    Pointset_Powerset<C_Polyhedron> Sn = aux2_test04(n);
+
+    nout << "S" << n << " = " << Sn << endl;
+
+    Sn.upper_bound_assign(T);
+    Sn.BHZ03_widening_assign<H79_Certificate>
+      (T, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+    nout << "T" << n << " = " << Sn << endl;
+
+    if (Sn.definitely_entails(T))
+      converged = true;
+    else
+      swap(Sn, T);
+  }
+
+  return converged;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron p(2);
+  C_Polyhedron q(2);
+  C_Polyhedron r(2);
+  C_Polyhedron s(2);
+  p.add_constraint(A >= 1);
+  p.add_constraint(B == 0);
+  q.add_constraint(A >= 2);
+  q.add_constraint(A <= 7);
+  q.add_constraint(B == 1);
+  r.add_constraint(A >= 3);
+  r.add_constraint(A <= 8);
+  r.add_constraint(B == 1);
+  s.add_constraint(A >= 1);
+  s.add_constraint(A <= 6);
+  s.add_constraint(B == 1);
+  Pointset_Powerset<C_Polyhedron> P(2, EMPTY);
+  P.add_disjunct(p);
+  P.add_disjunct(q);
+  P.add_disjunct(r);
+  P.add_disjunct(s);
+  Pointset_Powerset<C_Polyhedron> Q(2, EMPTY);
+  Q.add_disjunct(p);
+  Q.add_disjunct(q);
+  Q.add_disjunct(s);
+
+  nout << "P = " << P << endl
+       << "Q = " << Q << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_P = P;
+  P.BHZ03_widening_assign<H79_Certificate>
+    (Q, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "P.BHZ03(Q, H79)" << " = " << P << endl;
+
+  return P.geometrically_covers(old_P) && P.geometrically_covers(Q);
+}
+
+bool
+test06() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(X >= 0);
+  p1.add_constraint(Y >= 0);
+  p1.add_constraint(X <= 2);
+  p1.add_constraint(Y <= 1);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 3);
+  p3.add_constraint(Y >= 1);
+  p3.add_constraint(X <= 4);
+  p3.add_constraint(Y <= 3);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 0);
+  p4.add_constraint(Y >= 4);
+  p4.add_constraint(X <= 2);
+  p4.add_constraint(Y <= 5);
+
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p3);
+  T1.add_disjunct(p4);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 2);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 3);
+
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(p1);
+  T2.add_disjunct(p2);
+  T2.add_disjunct(p3);
+  T2.add_disjunct(p4);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  C_Polyhedron phull_T2(2);
+  phull_T2.add_constraint(X >= 0);
+  phull_T2.add_constraint(X <= 4);
+  phull_T2.add_constraint(Y >= 0);
+  phull_T2.add_constraint(Y <= 5);
+  phull_T2.add_constraint(X - 2*Y <= 2);
+  phull_T2.add_constraint(X + Y <= 7);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  known_result.add_disjunct(phull_T2);
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+  nout << "known result" << " = " << known_result << endl;
+
+  return T2 == known_result
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// does nothing as the lgo for the poly-hull is decreasing.
+bool
+test07() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(Y >= 2);
+  p1.add_constraint(Y - X <= 2);
+  p1.add_constraint(X + Y <= 4);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 0);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 1);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 2);
+  p3.add_constraint(Y >= 0);
+  p3.add_constraint(X <= 4);
+  p3.add_constraint(Y <= 1);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 3);
+  p4.add_constraint(Y >= 2);
+  p4.add_constraint(X <= 4);
+  p4.add_constraint(Y <= 3);
+
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+  T1.add_disjunct(p4);
+
+  C_Polyhedron q1(2);
+  q1.add_constraint(X >= 0);
+  q1.add_constraint(Y >= 0);
+  q1.add_constraint(X <= 4);
+  q1.add_constraint(Y <= 4);
+
+  C_Polyhedron q2(2);
+  q2.add_constraint(X >= 5);
+  q2.add_constraint(Y >= 3);
+  q2.add_constraint(X <= 6);
+  q2.add_constraint(Y <= 4);
+
+  C_Polyhedron q3(2);
+  q3.add_constraint(X >= 5);
+  q3.add_constraint(Y >= 0);
+  q3.add_constraint(X <= 6);
+  q3.add_constraint(Y <= 2);
+
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(q1);
+  T2.add_disjunct(q2);
+  T2.add_disjunct(q3);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+  return T2 == old_T2
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// does nothing; the poly-hull is stable with respect to the certificate
+// and the multiset ordering for this certificate is decreasing.
+bool
+test08() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(X >= 1);
+  p1.add_constraint(Y >= 4);
+  p1.add_constraint(X <= 7);
+  p1.add_constraint(Y <= 7);
+  p1.add_constraint(X - Y <= 2);
+  p1.add_constraint(X + Y >= 6);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 1);
+  p2.add_constraint(Y >= 1);
+  p2.add_constraint(X <= 3);
+  p2.add_constraint(Y <= 3);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 5);
+  p3.add_constraint(Y >= 1);
+  p3.add_constraint(X <= 7);
+  p3.add_constraint(Y <= 3);
+
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+
+  C_Polyhedron q1(2);
+  q1.add_constraint(X >= 0);
+  q1.add_constraint(Y >= 0);
+  q1.add_constraint(X <= 8);
+  q1.add_constraint(Y <= 8);
+
+  C_Polyhedron q2(2);
+  q2.add_constraint(X >= 10);
+  q2.add_constraint(Y >= 6);
+  q2.add_constraint(X <= 12);
+  q2.add_constraint(Y <= 8);
+
+  C_Polyhedron q3(2);
+  q3.add_constraint(X >= 10);
+  q3.add_constraint(Y >= 0);
+  q3.add_constraint(X <= 12);
+  q3.add_constraint(Y <= 4);
+
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(q1);
+  T2.add_disjunct(q2);
+  T2.add_disjunct(q3);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+  return T2 == old_T2
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+// This tests the first case of the widening definition when the widening
+// of the elements of the set reduces the multiset ordering.
+bool
+test09() {
+  Variable X(0);
+  Variable Y(1);
+
+  C_Polyhedron p1(2);
+  p1.add_constraint(Y >= 2);
+  p1.add_constraint(Y <= 3);
+  p1.add_constraint(Y - X <= 2);
+  p1.add_constraint(X + Y <= 8);
+
+  C_Polyhedron p2(2);
+  p2.add_constraint(X >= 0);
+  p2.add_constraint(Y >= 0);
+  p2.add_constraint(X <= 1);
+  p2.add_constraint(Y <= 1);
+
+  C_Polyhedron p3(2);
+  p3.add_constraint(X >= 5);
+  p3.add_constraint(Y >= 0);
+  p3.add_constraint(X <= 8);
+  p3.add_constraint(Y <= 1);
+
+  C_Polyhedron p4(2);
+  p4.add_constraint(X >= 7);
+  p4.add_constraint(Y >= 4);
+  p4.add_constraint(X <= 8);
+  p4.add_constraint(Y <= 5);
+
+  Pointset_Powerset<C_Polyhedron> T1(2, EMPTY);
+  T1.add_disjunct(p1);
+  T1.add_disjunct(p2);
+  T1.add_disjunct(p3);
+  T1.add_disjunct(p4);
+
+  C_Polyhedron q1(2);
+  q1.add_constraint(Y >= 2);
+  q1.add_constraint(Y <= 4);
+  q1.add_constraint(Y - X <= 2);
+  q1.add_constraint(X + Y <= 8);
+
+  Pointset_Powerset<C_Polyhedron> T2(2, EMPTY);
+  T2.add_disjunct(q1);
+  T2.add_disjunct(p2);
+  T2.add_disjunct(p3);
+  T2.add_disjunct(p4);
+
+  nout << "T1 = " << T1 << endl
+       << "T2 = " << T2 << endl;
+
+  Pointset_Powerset<C_Polyhedron> old_T2 = T2;
+  T2.BHZ03_widening_assign<BHRZ03_Certificate>
+    (T1, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+  C_Polyhedron r1(2);
+  r1.add_constraint(Y >= 2);
+  r1.add_constraint(Y - X <= 2);
+  r1.add_constraint(X + Y <= 8);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  known_result.add_disjunct(r1);
+  known_result.add_disjunct(p2);
+  known_result.add_disjunct(p3);
+  known_result.add_disjunct(p4);
+
+  nout << "T2.BHZ03(T1, H79)" << " = " << T2 << endl;
+
+  return T2 == known_result
+    && T2.geometrically_covers(old_T2)
+    && T2.geometrically_covers(T1);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+END_MAIN
diff --git a/tests/Polyhedron/bounded1.cc b/tests/Polyhedron/bounded1.cc
new file mode 100644
index 0000000..db12664
--- /dev/null
+++ b/tests/Polyhedron/bounded1.cc
@@ -0,0 +1,107 @@
+/* Test Polyhedron::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a non-bounded polyhedron.
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  return !ph1.is_bounded();
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a bounded polyhedron (it is a square);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 2);
+  ph2.add_constraint(y >= 2);
+  ph2.add_constraint(x <= 4);
+  ph2.add_constraint(y <= 4);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ph2.is_bounded();
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is a universal, zero-dimensional polyhedron.
+  C_Polyhedron ph3;
+
+  print_constraints(ph3, "*** ph3 ***");
+
+  return ph3.is_bounded();
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is an empty, zero-dimensional polyhedron.
+  C_Polyhedron ph4;
+  ph4.add_constraint(Linear_Expression(-3) >= 0);
+
+  print_constraints(ph4, "*** ph4 ***");
+
+  return ph4.is_bounded();
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  // This is an empty polyhedron.
+  C_Polyhedron ph5(4, EMPTY);
+
+  print_constraints(ph5, "*** ph5 ***");
+
+  return ph5.is_bounded();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffineimage1.cc b/tests/Polyhedron/boundedaffineimage1.cc
new file mode 100644
index 0000000..e52ee53
--- /dev/null
+++ b/tests/Polyhedron/boundedaffineimage1.cc
@@ -0,0 +1,250 @@
+/* Test Polyhedron::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1 = ph;
+  C_Polyhedron kr2 = ph;
+
+  ph.bounded_affine_image(A, 7-B, B+3);
+
+  kr1.generalized_affine_image(A, GREATER_OR_EQUAL, 7-B);
+  kr2.generalized_affine_image(A, LESS_OR_EQUAL, B+3);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph,
+                   "*** ph.bounded_affine_image(A, 7-B, B+3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1 = ph;
+  C_Polyhedron kr2 = ph;
+
+  ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3);
+
+  kr1.generalized_affine_image(A, GREATER_OR_EQUAL, 7-3*A+2*B);
+  kr2.generalized_affine_image(A, LESS_OR_EQUAL, B+5*A-3);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph,
+                   "*** ph.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ***");
+  print_generators(kr1,
+                   "*** kr1.bounded_affine_image(A, 7-3*A+2*B, B+5*A-3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.bounded_affine_image(A, A+5, B);
+
+  C_Polyhedron kr1(2, EMPTY);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph, "*** ph.bounded_affine_image(A, A+5, B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_constraint(x <= 1);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 2);
+  ph.add_constraint(y >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1(ph);
+  C_Polyhedron kr2(ph);
+
+  ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1, -1);
+
+  kr1.generalized_affine_image(x, GREATER_OR_EQUAL, -2*x + y + 1, -1);
+  kr2.generalized_affine_image(x, LESS_OR_EQUAL, -2*x + y + 1, -1);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (kr1 == ph);
+
+  print_constraints(ph,
+                    "*** ph.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1, -1) ***");
+  print_constraints(kr1,
+                    "*** kr1 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_constraint(x <= 1);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 2);
+  ph.add_constraint(y >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1(ph);
+  C_Polyhedron kr2(ph);
+
+  ph.bounded_affine_image(x, 2*x + y + 1, 2*x + y + 1, -1);
+
+  kr1.generalized_affine_image(x, GREATER_OR_EQUAL, 2*x + y + 1, -1);
+  kr2.generalized_affine_image(x, LESS_OR_EQUAL, 2*x + y + 1, -1);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (kr1 == ph);
+
+  print_constraints(ph,
+                    "*** ph.bounded_affine_image("
+                    "x, 2*x+y+1, 2*x+y+1, -1) ***");
+  print_constraints(kr1,
+                    "*** kr1 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+
+  ph.add_constraint(x <= 1);
+  ph.add_constraint(x >= 0);
+  ph.add_constraint(y <= 2);
+  ph.add_constraint(y >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron kr1(ph);
+  C_Polyhedron kr2(ph);
+
+  ph.bounded_affine_image(x, -2*x + y + 1, -2*x + y + 1);
+
+  kr1.generalized_affine_image(x, GREATER_OR_EQUAL, -2*x + y + 1);
+  kr2.generalized_affine_image(x, LESS_OR_EQUAL, -2*x + y + 1);
+  kr1.intersection_assign(kr2);
+
+  bool ok = (kr1 == ph);
+
+  print_constraints(ph,
+                    "*** ph.bounded_affine_image("
+                    "x, -2*x+y+1, -2*x+y+1) ***");
+  print_constraints(kr1,
+                    "*** kr1 ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+  ph.add_constraint(A <= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.bounded_affine_image(A, A, 2*A, 3);
+
+  C_Polyhedron kr1(1, EMPTY);
+
+  bool ok = (ph == kr1);
+
+  print_generators(ph, "*** ph.bounded_affine_image(A, A, 2*A, 3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffinepreimage1.cc b/tests/Polyhedron/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..53be8ee
--- /dev/null
+++ b/tests/Polyhedron/boundedaffinepreimage1.cc
@@ -0,0 +1,125 @@
+/* Test Polyhedron::bounded_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "*** ph ***");
+
+  // A longer way of computing the bounded affine preimage below.
+  C_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  known_result.add_constraint(7-A <= B);
+  known_result.add_constraint(B <= A+3);
+  Variables_Set var_set;
+  var_set.insert(B);
+  known_result.remove_space_dimensions(var_set);
+
+  ph.bounded_affine_preimage(B, 7-A, A+3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph.bounded_affine_preimage(B, 7-A, A+3) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 4);
+  ph.add_constraint(A - B <= 2);
+  ph.add_constraint(A - B >= -2);
+
+  print_constraints(ph, "*** ph ***");
+
+  // A longer way of computing the bounded affine preimage below.
+  C_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  Variable C(2);
+  known_result.add_constraint(7 - 3*A + 2*C <= B);
+  known_result.add_constraint(B <= C + 5*A - 3);
+  Variables_Set var_set;
+  var_set.insert(B);
+  known_result.remove_space_dimensions(var_set);
+
+  ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** "
+                   "ph.bounded_affine_preimage(B, 7-3*A+2*B, B+5*A-3) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.bounded_affine_preimage(A, B+5, A-3);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph.bounded_affine_preimage(A, B+5, A-3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/boundedbhrz03extrapolation1.cc b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
new file mode 100644
index 0000000..8250529
--- /dev/null
+++ b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
@@ -0,0 +1,153 @@
+/* Test Polyhedron::bounded_BHRZ03_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define PROPAGATION_STEPS 1
+#define NUMBER_OF_TOKENS 1
+
+namespace {
+
+void
+aux_test01(std::ostream& s, const Variable v) {
+  s << char('i' + v.id());
+}
+
+bool
+test01() {
+  Variable::output_function_type* old_output_function
+    = Variable::get_output_function();
+
+  try {
+    Variable::set_output_function(aux_test01);
+    Variable i(0);
+    Variable j(1);
+    Variable k(2);
+
+    C_Polyhedron ph(3);
+    ph.add_constraint(i == 1);
+    ph.add_constraint(j == 1);
+    ph.add_constraint(0 <= k);
+    ph.add_constraint(k <= 1);
+
+    C_Polyhedron old_ph(3, EMPTY);
+
+    // Propagation.
+    for (int steps = 0; steps < PROPAGATION_STEPS; ++steps) {
+      old_ph = ph;
+
+      ph.affine_image(i, i+1);
+      ph.affine_image(j, j+k);
+      ph.affine_image(k, k-1);
+
+      old_ph.upper_bound_assign(ph);
+
+      ph = old_ph;
+    }
+
+    // Widening.
+    Constraint_System up_to_constraints = ph.constraints();
+
+    print_constraints(up_to_constraints, "*** up_to_constraints ***");
+
+    unsigned tokens = NUMBER_OF_TOKENS;
+
+    for (int step = 1; ; ++step) {
+
+      nout << "\nAt step " << step << endl;
+      print_constraints(ph);
+
+      old_ph = ph;
+
+      ph.affine_image(i, i+1);
+      ph.affine_image(j, j+k);
+      ph.affine_image(k, k-1);
+
+      ph.upper_bound_assign(old_ph);
+      if (old_ph.contains(ph))
+        break;
+
+      // Notice that neither the H79 nor the BHRZ03 limited
+      // extrapolations (used as widenings here) allow to obtain the
+      // desired postfixpoint for this example.  Both the H79 and the
+      // BHRZ03 bounded extrapolation operators do achieve this result.
+      ph.bounded_H79_extrapolation_assign(old_ph, up_to_constraints, &tokens);
+    }
+
+    C_Polyhedron known_result(3);
+    known_result.add_constraint(-i - k >= -2);
+    known_result.add_constraint(i - j + k >= 0);
+    known_result.add_constraint(i - j + 2*k >= -1);
+    known_result.add_constraint(i + k >= 1);
+    known_result.add_constraint(i >= 1);
+    known_result.add_constraint(i - j >= 0);
+
+    bool ok = (ph == known_result);
+
+    print_constraints(ph, "\nPostfixpoint");
+
+    Variable::set_output_function(old_output_function);
+    return ok;
+  }
+  catch (...) {
+    Variable::set_output_function(old_output_function);
+    throw;
+  }
+}
+
+bool test02() {
+  Variable x(0);
+
+  C_Polyhedron P1(1);
+  P1.add_constraint(1 <= x);
+  P1.add_constraint(x <= 2);
+
+  C_Polyhedron P2(1);
+  P2.add_constraint(0 <= x);
+  P2.add_constraint(x <= 3);
+
+  Constraint_System cs;
+
+  print_constraints(P1, "*** P1 ***");
+  print_constraints(P2, "*** P2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  P2.bounded_BHRZ03_extrapolation_assign(P1, cs);
+
+  C_Polyhedron known_result(1);
+  known_result.add_constraint(0 <= x);
+
+  bool ok = (P2 == known_result);
+
+  print_constraints(P2,
+                    "*** P2.bounded_BHRZ03_extrapolation_assign(P1, cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8A(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/boundedh79extrapolation1.cc b/tests/Polyhedron/boundedh79extrapolation1.cc
new file mode 100644
index 0000000..ce27ef8
--- /dev/null
+++ b/tests/Polyhedron/boundedh79extrapolation1.cc
@@ -0,0 +1,81 @@
+/* Test Polyhedron::bounded_H79_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x-3 >= 0);
+  ph1.add_constraint(x-3 <= 1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(2*x-5 >= 0);
+  ph2.add_constraint(x-3 <= 1);
+  ph2.add_constraint(2*y+3 >= 0);
+  ph2.add_constraint(2*y-5 <= 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= y);
+
+  print_constraints(cs, "*** cs ***");
+
+  ph2.bounded_H79_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 2);
+  known_result.add_constraint(x <= 4);
+  known_result.add_constraint(y >= -2);
+  known_result.add_constraint(x >= y);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+                    "*** after ph2.bounded_H79_extrapolation_assign(ph1, cs) "
+                    "***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+// Note: test01() only overflows on NNC polyhedra
+// (with 8-bit coefficients and assertions turned on).
+#ifdef DERIVED_TEST
+  DO_TEST_F8A(test01);
+#else
+  DO_TEST(test01);
+#endif
+END_MAIN
diff --git a/tests/Polyhedron/bounds1.cc b/tests/Polyhedron/bounds1.cc
new file mode 100644
index 0000000..9ee3b59
--- /dev/null
+++ b/tests/Polyhedron/bounds1.cc
@@ -0,0 +1,65 @@
+/* Test Polyhedron::bounds_from_below() and Polyhedron::bounds_from_above().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  bool ok = ph1.bounds_from_above(Linear_Expression(3))
+    && ph2.bounds_from_below(A);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 1);
+  ph.add_constraint(B >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool ok = !ph.bounds_from_above(A + B) && ph.bounds_from_below(A + B);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/cnncconversion1.cc b/tests/Polyhedron/cnncconversion1.cc
new file mode 100644
index 0000000..092a48f
--- /dev/null
+++ b/tests/Polyhedron/cnncconversion1.cc
@@ -0,0 +1,154 @@
+/* Test conversions between C_Polyhedron and NNC_Polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  ph1.add_constraint(A >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(ph1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 0);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraint(x >= 5);
+  ph1.add_constraint(y > x - 3);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(ph1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(x >= 5);
+  known_result.add_constraint(y >= x - 3);
+
+  return ph2 == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A < 2);
+  ph1.add_constraint(B > 0);
+  ph1.add_constraint(A - B > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(ph1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+
+  return ph2 == known_result;
+}
+
+bool
+test04() {
+
+  C_Polyhedron ph(4, UNIVERSE);
+
+  NNC_Polyhedron nnc_ph(ph, POLYNOMIAL_COMPLEXITY);
+
+  NNC_Polyhedron known_result(4);
+
+  bool ok = (known_result == nnc_ph);
+
+  print_constraints(nnc_ph, "*** nnc_ph ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(A - B > 4);
+  cs.insert(-C - D >= 0);
+  cs.insert(A + B - C == 0);
+  cs.insert(-A + B - C < 4);
+  cs.insert(A - B - C + D > 1);
+  NNC_Polyhedron ph(cs);
+
+  C_Polyhedron c_ph(ph, SIMPLEX_COMPLEXITY);
+
+  Constraint_System cs1;
+  cs1.insert(A - B >= 4);
+  cs1.insert(-C - D >= 0);
+  cs1.insert(A + B - C == 0);
+  cs1.insert(-A + B - C <= 4);
+  cs1.insert(A - B - C + D >= 1);
+  C_Polyhedron  known_result(cs1);
+
+  bool ok = (known_result == c_ph);
+
+  print_constraints(c_ph, "*** c_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/concatenate1.cc b/tests/Polyhedron/concatenate1.cc
new file mode 100644
index 0000000..a222d52
--- /dev/null
+++ b/tests/Polyhedron/concatenate1.cc
@@ -0,0 +1,284 @@
+/* Test Polyhedron::concatenate_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph before ***");
+
+  Constraint_System cs2;
+  cs2.insert(x >= 1);
+  cs2.insert(y >= 1);
+  cs2.insert(x - y >= -1);
+  C_Polyhedron qh(cs2);
+
+  C_Polyhedron copy_ph = ph;
+
+  ph.concatenate_assign(qh);
+
+  copy_ph.add_space_dimensions_and_embed(2);
+  copy_ph.add_constraint(z >= 1);
+  copy_ph.add_constraint(w >= 1);
+  copy_ph.add_constraint(z - w >= -1);
+
+  bool ok = (ph == copy_ph);
+
+  print_constraints(ph, "*** concatenate_assign ***");
+  print_constraints(copy_ph, "*** embed + renaming + insert ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs;
+  cs.insert(x >= y);
+  cs.insert(x >= 2);
+  C_Polyhedron qh(cs);
+
+  print_constraints(qh, "*** qh ***");
+
+  ph.concatenate_assign(qh);
+
+  C_Polyhedron known_result(4, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after concatenate_assign(qh) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph;
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs;
+  cs.insert(x - 3 >= y);
+  cs.insert(y >= 0);
+  C_Polyhedron qh(cs);
+
+  print_constraints(qh, "*** qh ***");
+
+  ph.concatenate_assign(qh);
+
+  bool ok = (ph == qh);
+
+  print_constraints(ph, "*** after concatenate_assign(qh) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(2*A));
+  gs1.insert(point(2*B));
+  gs1.insert(point(2*A + 2*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(2*A));
+  gs2.insert(point(2*A + 3*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B <= 2);
+  known_result.add_constraint(C == 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D <= 3);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A - B >= 0);
+
+  C_Polyhedron ph2;
+
+  C_Polyhedron known_result(ph1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(1);
+  ph1.generators();
+  ph1.add_constraint(A >= 0);
+
+  C_Polyhedron ph2(1);
+  ph2.generators();
+  ph2.add_constraint(A == 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(1, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(ray(A));
+
+  C_Polyhedron ph2(1, EMPTY);
+  ph2.add_generator(point(2*A));
+  ph2.constraints();
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(-A >= -2);
+  ph1.generators();
+  ph1.add_generator(point(0*A));
+  ph1.add_generator(point(2*A));
+
+  C_Polyhedron ph2(1, EMPTY);
+  ph2.add_generator(point(10*A));
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.concatenate_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(-A >= -2);
+  known_result.add_constraint(B == 10);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.concatenate_assign(ph2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/congruences1.cc b/tests/Polyhedron/congruences1.cc
new file mode 100644
index 0000000..da0af52
--- /dev/null
+++ b/tests/Polyhedron/congruences1.cc
@@ -0,0 +1,365 @@
+/* Test C_Polyhedron(Congruence_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty polyhedron.
+bool
+test01() {
+  C_Polyhedron ph1(7, EMPTY);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Universe polyhedron.
+bool
+test02() {
+  C_Polyhedron ph1(7);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(7);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty polyhedron.
+bool
+test03() {
+  C_Polyhedron ph1(0, EMPTY);
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron known_ph(Congruence_System::zero_dim_empty());
+
+  bool ok = (ph1 == known_ph);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe polyhedron.
+bool
+test04() {
+  C_Polyhedron ph1(0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(0);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+  ph2.add_constraint(A + B >= 3);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D with implied equality.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A + B <= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Empty polyhedron.
+bool
+test07() {
+  C_Polyhedron ph1(7, EMPTY);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Universe polyhedron.
+bool
+test08() {
+  C_Polyhedron ph1(7);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(7);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Zero dimension empty polyhedron.
+bool
+test09() {
+  C_Polyhedron ph1(0, EMPTY);
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron known_ph(Congruence_System::zero_dim_empty());
+
+  bool ok = (ph1 == known_ph);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+// Zero dimension universe polyhedron.
+bool
+test10() {
+  C_Polyhedron ph1(0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(0);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D.
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+  ph2.add_constraint(A + B >= 3);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+// Polyhedron in 3D with implied equality.
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A + B >= 3);
+  ph1.add_constraint(A + B <= 3);
+  ph1.add_constraint(A == 0);
+
+  C_Polyhedron known_ph = ph1;
+
+  Congruence_System cgs = ph1.minimized_congruences();
+
+  C_Polyhedron ph2(3);
+  ph2.add_congruences(cgs);
+
+  bool ok = (ph2 == known_ph);
+
+  print_congruences(cgs, "*** cgs ***");
+  print_constraints(ph2, "*** ph2(cgs) ***");
+
+  return ok;
+}
+
+bool test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Congruence_System cgs;
+  cgs.insert(0*x %= 3);
+  cgs.insert(y == 3);
+
+  C_Polyhedron ph(cgs);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y == 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after add_congruences ***");
+
+  return ok;
+}
+
+bool test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Congruence_System cgs;
+  cgs.insert((2*y %= 2) / 3);
+
+  Constraint_System cs(cgs);
+  print_constraints(cs, "*** cs ***");
+
+  cs.insert(0*x > -1);
+  print_constraints(cs, "*** cs.insert(0*x > -1) ***");
+
+  C_Polyhedron ph(cs);
+
+  bool ok = ph.is_universe();
+
+  print_constraints(ph, "*** ph(cs) ***");
+
+  return ok;
+}
+
+// A similar test to the previous test but with 0 dimensions.
+bool test15() {
+  Variable x(0);
+
+  Congruence_System cgs;
+
+  Constraint_System cs(cgs);
+  print_constraints(cs, "*** cs ***");
+
+  cs.insert(0*x > -1);
+  print_constraints(cs, "*** cs.insert(0*x > -1) ***");
+
+  C_Polyhedron ph(cs);
+
+  bool ok = ph.is_universe();
+
+  print_constraints(ph, "*** ph(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/constrains1.cc b/tests/Polyhedron/constrains1.cc
new file mode 100644
index 0000000..8fb2a87
--- /dev/null
+++ b/tests/Polyhedron/constrains1.cc
@@ -0,0 +1,233 @@
+/* Test Polyhedron::constrains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define TEST_PREDICATE_TRUE(pred)               \
+  if (!pred) {                                  \
+    nout << "!" #pred << endl;                  \
+    ok = false;                                 \
+  }
+
+#define TEST_PREDICATE_FALSE(pred)              \
+  if (pred) {                                   \
+    nout << #pred << endl;                      \
+    ok = false;                                 \
+  }
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(0*A == 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(0*A == 1);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  ph.add_generator(point());
+  ph.add_generator(line(A+B));
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  ph.add_generator(line(A-B));
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(A >= 1);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(B >= 2);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  ph.add_constraint(A <= B);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+  TEST_PREDICATE_TRUE(ph.constrains(C));
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph(0);
+  ph.add_constraint(Linear_Expression::zero() == 1);
+
+  try {
+    (void) ph.constrains(A);
+  }
+  catch (std::invalid_argument& e) {
+    return true;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return false;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.generators();
+  ph.add_constraint(B >= 7);
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point());
+  ph.constraints();
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(-A));
+
+  bool ok = true;
+
+  TEST_PREDICATE_FALSE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_FALSE(ph.constrains(B));
+
+  ph.add_constraint(B >= A);
+
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= B+1);
+  ph.add_constraint(A <= B);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(C));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= B);
+  ph.add_generator(point());
+  ph.generators();
+  ph.add_constraint(A <= B-1);
+
+  bool ok = true;
+
+  TEST_PREDICATE_TRUE(ph.constrains(C));
+  TEST_PREDICATE_TRUE(ph.constrains(B));
+  TEST_PREDICATE_TRUE(ph.constrains(A));
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/constraints1.cc b/tests/Polyhedron/constraints1.cc
new file mode 100644
index 0000000..39f9827
--- /dev/null
+++ b/tests/Polyhedron/constraints1.cc
@@ -0,0 +1,166 @@
+/* Test Polyhedron::constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(0*A == 1);
+
+  print_constraints(ph1, "*** ph1 constraints ***");
+
+  C_Polyhedron known_result = ph1;
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph1(0);
+  ph1.add_constraint(Linear_Expression::zero() == 1);
+  C_Polyhedron known_result(ph1);
+
+  const Constraint_System cs = ph1.constraints();
+
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron known_result(ph1);
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(ray(A));
+  ph1.add_generator(ray(B));
+
+  C_Polyhedron known_result(ph1);
+
+  Constraint_System cs = ph1.constraints();
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs = ph.constraints();
+  cs.insert(A >= B);
+
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A >= B);
+
+  return C_Polyhedron(cs) == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/contains1.cc b/tests/Polyhedron/contains1.cc
new file mode 100644
index 0000000..212f846
--- /dev/null
+++ b/tests/Polyhedron/contains1.cc
@@ -0,0 +1,115 @@
+/* Test Polyhedron::contains(const Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron segment(2);
+  segment.add_constraint(x >= 0);
+  segment.add_constraint(x <= 1);
+  segment.add_constraint(y == 0);
+
+  print_constraints(segment, "*** segment constraints ***");
+  print_generators(segment, "*** segment generators ***");
+
+  C_Polyhedron halfline(2);
+  halfline.add_constraint(x >= 0);
+  halfline.add_constraint(y == 0);
+
+  print_constraints(halfline, "*** halfline constraints ***");
+  print_generators(halfline, "*** halfline generators ***");
+
+  bool segment_includes_halfline = segment.contains(halfline);
+
+  nout << "segment ";
+  if (segment_includes_halfline)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to halfline" << endl;
+
+  bool halfline_includes_segment = halfline.contains(segment);
+
+  nout << "halfline ";
+  if (halfline_includes_segment)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to segment" << endl;
+
+  return halfline_includes_segment && !segment_includes_halfline;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + 0*y >= 2);
+  C_Polyhedron p_half_space(cs);
+
+  print_constraints(p_half_space, "*** p_half_space constraints ***");
+  print_generators(p_half_space, "*** p_half_space generators ***");
+
+  Generator_System gs;
+  gs.insert(point(2*x));
+  gs.insert(line(x+y));
+  C_Polyhedron p_line(gs);
+
+  print_constraints(p_line, "*** p_line constraints ***");
+  print_generators(p_line, "*** p_line generators ***");
+
+  bool p_half_space_includes_p_line = p_half_space.contains(p_line);
+
+  nout << "p_half_space ";
+  if (p_half_space_includes_p_line)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to p_line" << endl;
+
+  bool p_line_includes_p_half_space = p_line.contains(p_half_space);
+
+  nout << "p_line ";
+  if (p_line_includes_p_half_space)
+    nout << "includes ";
+  else
+    nout << "does not include ";
+  nout << "or is equal to p_half_space" << endl;
+
+  return !p_line_includes_p_half_space && !p_half_space_includes_p_line;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/contains2.cc b/tests/Polyhedron/contains2.cc
new file mode 100644
index 0000000..69fa50a
--- /dev/null
+++ b/tests/Polyhedron/contains2.cc
@@ -0,0 +1,177 @@
+/* Test NNC_Polyhedron::contains(const Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square without vertices.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 2);
+  cs.insert(x - y < 1);
+  cs.insert(x - y > -1);
+
+  NNC_Polyhedron ph1(cs);
+
+  // Building an equivalent square.
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(x));
+  gs.insert(closure_point(y));
+  gs.insert(closure_point(x + y));
+  gs.insert(point(x, 10));
+  gs.insert(point(y, 10));
+  gs.insert(point(x + 10*y, 10));
+  gs.insert(point(10*x + y, 10));
+
+  NNC_Polyhedron ph2(gs);
+
+  bool ok = ph1.contains(ph2);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 0);
+  ph1.add_constraint(B > 0);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(line(A + B));
+  NNC_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  bool ok = !ph1.contains(ph2);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= B);
+  cs.insert(B >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(ph1);
+  ph2.add_constraint(A == B);
+
+  bool ok = ph1.contains(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= B);
+  cs.insert(B >= 0);
+  NNC_Polyhedron ph1(cs);
+  NNC_Polyhedron ph2(ph1);
+  ph2.add_constraint(A > B);
+
+  bool ok = ph1.strictly_contains(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs1;
+  cs1.insert(A >= B);
+  cs1.insert(B >= 0);
+  C_Polyhedron ph1(cs1);
+  Constraint_System cs2;
+  cs2.insert(A >= B);
+  cs2.insert(A <= 0);
+  C_Polyhedron ph2(cs2);
+
+  bool ok = (ph1 != ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+  cs.insert(B >= 0);
+  NNC_Polyhedron ph1(cs);
+  NNC_Polyhedron ph2(ph1);
+  ph2.add_constraint(A > 0);
+
+  bool ok = ph1.strictly_contains(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/containsintegerpoint1.cc b/tests/Polyhedron/containsintegerpoint1.cc
new file mode 100644
index 0000000..0c31432
--- /dev/null
+++ b/tests/Polyhedron/containsintegerpoint1.cc
@@ -0,0 +1,176 @@
+/* Test C_Polyhedron::contains_integer_point().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y <= 2);
+  cs.insert(3*y >= 1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(3*y - 3*z <= 2);
+  cs.insert(8*z - 8*y >= 7);
+
+  C_Polyhedron ph(3);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(3*x - 3*y >= 1);
+  cs.insert(3*x - 3*y <= 2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(3*x + 3*y >= 13);
+  cs.insert(3*x + 3*y < 15);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraints(cs);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(2);
+  ph.add_constraint(Linear_Expression(0) >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test06() {
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(Linear_Expression(1) > 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+bool
+test07() {
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(Linear_Expression(1) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool contains = ph.contains_integer_point();
+
+  nout << "ph.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint1.cc b/tests/Polyhedron/disjoint1.cc
new file mode 100644
index 0000000..39ec4ad
--- /dev/null
+++ b/tests/Polyhedron/disjoint1.cc
@@ -0,0 +1,146 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B == 0);
+  ph1.add_constraint(A >= 1);
+  ph1.add_constraint(A <= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == 0);
+  ph2.add_constraint(B >= 1);
+  ph2.add_constraint(B <= 2);
+
+  bool ok = ph1.is_disjoint_from(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+C_Polyhedron
+half_strip(const Generator& p, const Linear_Expression& e) {
+  assert(p.is_point());
+
+  Linear_Expression e1(p.expression());
+  e1 += 3*Variable(0);
+
+  Generator_System gs;
+  gs.insert(p);
+  gs.insert(ray(e));
+  gs.insert(point(e1, p.divisor()));
+  C_Polyhedron ph(gs);
+  return ph;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(A + B), B);
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(2*A + B));
+  ph2.add_generator(point(4*A + 3*B));
+  ph2.add_generator(ray(A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(A + B), B);
+  C_Polyhedron ph2 = half_strip(point(4*A + B), B);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(A + B), B);
+  C_Polyhedron ph2 = half_strip(point(A + B), -B);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1 = half_strip(point(), B);
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(2*A - 2*B));
+  ph2.add_generator(point(-2*A + 2*B));
+  ph2.add_generator(ray(-A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/disjoint2.cc b/tests/Polyhedron/disjoint2.cc
new file mode 100644
index 0000000..54d1646
--- /dev/null
+++ b/tests/Polyhedron/disjoint2.cc
@@ -0,0 +1,133 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+NNC_Polyhedron
+half_strip(const Generator& p,
+           const Linear_Expression& e,
+           bool closed = true) {
+  assert((p.is_point() && closed) || (p.is_closure_point() && ! closed));
+
+  Linear_Expression e1(p.expression());
+  e1 += 3*Variable(0);
+
+  Generator_System gs;
+  gs.insert(p);
+  gs.insert(ray(e));
+  if (closed)
+    gs.insert(point(e1, p.divisor()));
+  else {
+    gs.insert(closure_point(e1, p.divisor()));
+    e1 -= Variable(0);
+    e1 += e.coefficient(Variable(1)) * p.divisor() * Variable(1);
+    gs.insert(point(e1));
+  }
+  NNC_Polyhedron ph(gs);
+  return ph;
+}
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(3*A + B));
+  ph2.add_generator(closure_point(2*A + B));
+  ph2.add_generator(closure_point(4*A + 3*B));
+  ph2.add_generator(ray(A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return !disjoint;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+  NNC_Polyhedron ph2 = half_strip(closure_point(4*A + B), B, false);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return disjoint;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(A + B), B);
+  NNC_Polyhedron ph2 = half_strip(closure_point(A + B), -B, false);
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return disjoint;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1 = half_strip(point(), B);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(-2*A - 2*B));
+  ph2.add_generator(closure_point(2*A - 2*B));
+  ph2.add_generator(closure_point(-2*A + 2*B));
+  ph2.add_generator(ray(-A - B));
+
+  bool disjoint = ph1.is_disjoint_from(ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return disjoint;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/dropsomenonintegerpoints1.cc b/tests/Polyhedron/dropsomenonintegerpoints1.cc
new file mode 100644
index 0000000..a1851e9
--- /dev/null
+++ b/tests/Polyhedron/dropsomenonintegerpoints1.cc
@@ -0,0 +1,175 @@
+/* Test Polyhedron::drop_some_non_integer_points().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A >= 1);
+  ph.add_constraint(2*B >= -1);
+  ph.add_constraint(6*A - 3*B >= 7);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(2*A - B >= 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result1(0, EMPTY);
+  C_Polyhedron known_result2(ph2);
+
+  ph1.drop_some_non_integer_points();
+  ph2.drop_some_non_integer_points();
+
+  bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+  print_constraints(ph1, "*** after ph1.drop_some_non_integer_points() ***");
+  print_constraints(ph2, "*** after ph2.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B == 0);
+  ph.add_constraint(A >= 0);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A+B, 2));
+  ph.add_generator(line(B));
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 1);
+  ph.add_constraint(2*B <= -1);
+  ph.add_constraint(6*A - 3*B <= 7);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  bool ok = true; //(ph1 == ph2);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/dropsomenonintegerpoints2.cc b/tests/Polyhedron/dropsomenonintegerpoints2.cc
new file mode 100644
index 0000000..42176d9
--- /dev/null
+++ b/tests/Polyhedron/dropsomenonintegerpoints2.cc
@@ -0,0 +1,196 @@
+/* Test Polyhedron::drop_some_non_integer_points().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A - B > 0);
+  Generator_System gs;
+  gs.insert(point(2*A));
+  gs.insert(closure_point(A + B));
+  gs.insert(ray(-B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph2(gs);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.drop_some_non_integer_points();
+  ph2.drop_some_non_integer_points();
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** after ph1.drop_some_non_integer_points() ***");
+  print_generators(ph2, "*** after ph2.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  NNC_Polyhedron ph1;
+  NNC_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result1(0, EMPTY);
+  NNC_Polyhedron known_result2(ph2);
+
+  ph1.drop_some_non_integer_points();
+  ph2.drop_some_non_integer_points();
+
+  bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+  print_constraints(ph1, "*** after ph1.drop_some_non_integer_points() ***");
+  print_constraints(ph2, "*** after ph2.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B == 0);
+  ph.add_constraint(A >= 0);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A > 0);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A));
+  ph.constraints();
+  ph.add_generator(closure_point());
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(B));
+
+  print_generators(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points();
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points() ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A, 2));
+  ph.add_generator(point(B, 2));
+
+  print_generators(ph, "*** ph ***");
+
+  ph.drop_some_non_integer_points(Variables_Set(B));
+
+  C_Polyhedron known_result1(2, EMPTY);
+  known_result1.add_generator(point(A, 2));
+
+  bool ok = (ph == known_result1);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points({B}) ***");
+
+  if (!ok)
+    return ok;
+
+  ph.drop_some_non_integer_points(Variables_Set(A));
+
+  C_Polyhedron known_result2(2, EMPTY);
+
+  ok = (ph == known_result2);
+
+  print_constraints(ph, "*** after ph.drop_some_non_integer_points({A}) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/dualhypercubes.cc b/tests/Polyhedron/dualhypercubes.cc
new file mode 100644
index 0000000..ea46875
--- /dev/null
+++ b/tests/Polyhedron/dualhypercubes.cc
@@ -0,0 +1,392 @@
+/* Exploit smf when computing the intersection of NNC dual hypercubes.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "timings.hh"
+#include <vector>
+#include <map>
+
+// Define EXP_EVAL to 1 if you want to reproduce the results
+// of the experimental evaluation reported in Table 2 of the paper:
+//   R. Bagnara, P.M. Hill, E. Zaffanella
+//   Not Necessarily Closed Convex Polyhedra and the Double Description Method.
+//   Formal Aspects of Computing, 17, 2 (2005), pp. 222-257.
+#ifndef EXP_EVAL
+#define EXP_EVAL 0
+#endif
+
+namespace {
+
+void
+closure_points_dual_hypercube(const dimension_type dims,
+                              const Linear_Expression& weight_center,
+                              const Coefficient& half_diagonal,
+                              Generator_System& gs) {
+  // An ill-formed (it has no points at all) generator system
+  // for a dual hypercube.
+  for (dimension_type axis = dims; axis-- > 0; ) {
+    gs.insert(closure_point(weight_center + half_diagonal * Variable(axis)));
+    gs.insert(closure_point(weight_center - half_diagonal * Variable(axis)));
+  }
+}
+
+void
+add_facets(dimension_type& to_be_added,
+           Generator_System& gs,
+           const Linear_Expression& expr,
+           const dimension_type axis,
+           const dimension_type dims,
+           const Linear_Expression& weight_center,
+           const Coefficient& half_diagonal) {
+  // Return if we have already added all facets.
+  if (to_be_added == 0)
+    return;
+
+  Linear_Expression expr1 = expr;
+  expr1 += half_diagonal * Variable(axis);
+  Linear_Expression expr2 = expr;
+  expr2 -= half_diagonal * Variable(axis);
+
+  if (axis == 0) {
+    gs.insert(point(dims * weight_center + expr1, dims));
+    --to_be_added;
+    if (to_be_added == 0)
+      return;
+    gs.insert(point(dims * weight_center + expr2, dims));
+    --to_be_added;
+    return;
+  }
+
+  // Here axis > 0.
+  // First recursive call with variable with index `axis'
+  // having coordinate 1/dims.
+  add_facets(to_be_added, gs, expr1,
+             axis-1, dims, weight_center, half_diagonal);
+  if (to_be_added == 0)
+    return;
+  // Second recursive call with variable with index `axis'
+  // having coordinate -1/dims.
+  add_facets(to_be_added, gs, expr2,
+             axis-1, dims, weight_center, half_diagonal);
+}
+
+NNC_Polyhedron
+NNC_dual_hypercube(const dimension_type dims,
+                   const Linear_Expression& weight_center,
+                   const Coefficient& half_diagonal,
+                   const int facet_percentage) {
+  Generator_System gs;
+  closure_points_dual_hypercube(dims, weight_center, half_diagonal, gs);
+  // Number of facets in the closed dual hypercube.
+  dimension_type num_facets = 1;
+  for (dimension_type axis = dims; axis-- > 0; )
+    num_facets *= 2;
+  dimension_type facets_to_be_added = (num_facets * facet_percentage) / 100;
+  if (facets_to_be_added == 0)
+    // There has to be a point, at least.
+    gs.insert(point(weight_center));
+  else
+    add_facets(facets_to_be_added, gs, Linear_Expression(0),
+               dims-1, dims, weight_center, half_diagonal);
+  // Actually build the polyhedron.
+  return NNC_Polyhedron(gs);
+}
+
+void
+build_polyhedra(const dimension_type dims,
+                const int percentage,
+                std::vector<NNC_Polyhedron>& ph) {
+
+  Linear_Expression weight_center;
+
+  // 1st-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    weight_center += Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, percentage));
+
+  // 2nd-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    weight_center += 2*Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, percentage));
+
+  // 3rd-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    if (axis % 2 == 0)
+      weight_center += 10*Variable(axis);
+    else
+      weight_center += 2*Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 5, percentage));
+
+  // 4th-polyhedron.
+  weight_center = Linear_Expression(0);
+  for (dimension_type axis = dims; axis-- > 0; )
+    if (axis % 2 == 0)
+      weight_center += 10*Variable(axis);
+    else
+      weight_center += Variable(axis);
+  ph.push_back(NNC_dual_hypercube(dims, weight_center, 4, percentage));
+}
+
+long
+computation(std::vector<NNC_Polyhedron>& ph, bool enhanced) {
+  nout << endl;
+  if (enhanced)
+    nout << "Enhanced computation: ";
+  else
+    nout << "Standard computation: ";
+  nout << "working with 4 NNC dual hypercubes of dimension "
+       << ph[0].space_dimension() << endl;
+
+  start_clock();
+
+  /**** Compute the intersection of ph[0] and ph[1]. ****/
+
+  // Print cardinalities of arguments.
+  nout << "  - Computing intersection of ph[0] and ph[1]:" << endl;
+  const Generator_System& gs_0 = ph[0].generators();
+  nout << "    # ph[0].generators() = "
+       << std::distance(gs_0.begin(), gs_0.end()) << endl;
+  const Generator_System& gs_1 = ph[1].generators();
+  nout << "    # ph[1].generators() = "
+       << std::distance(gs_1.begin(), gs_1.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[0] generators ***" << endl;
+  gs_0.ascii_dump(vnout);
+  vnout << "*** ph[1] generators ***" << endl;
+  gs_1.ascii_dump(vnout);
+  vnout << endl;
+
+  const Constraint_System& cs_0 = enhanced
+    ? ph[0].minimized_constraints()
+    : ph[0].constraints();
+  const Constraint_System& cs_1 = enhanced
+    ? ph[1].minimized_constraints()
+    : ph[1].constraints();
+
+  // Print cardinalities of constraint systems.
+  nout << "    # ph[0].constraints() = "
+       << std::distance(cs_0.begin(), cs_0.end()) << endl;
+  nout << "    # ph[1].constraints() = "
+       << std::distance(cs_1.begin(), cs_1.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[0] constraints ***" << endl;
+  cs_0.ascii_dump(vnout);
+  vnout << "*** ph[1] constraints ***" << endl;
+  cs_1.ascii_dump(vnout);
+  vnout << endl;
+
+  ph[0].intersection_assign(ph[1]);
+
+  /**** Compute the intersection of ph[2] and ph[3]. ****/
+
+  // Print cardinalities of arguments.
+  nout << "  - Computing intersection of ph[2] and ph[3]:" << endl;
+  const Generator_System& gs_2 = ph[2].generators();
+  nout << "    # ph[2].generators() = "
+       << std::distance(gs_2.begin(), gs_2.end()) << endl;
+  const Generator_System& gs_3 = ph[3].generators();
+  nout << "    # ph[3].generators() = "
+       << std::distance(gs_3.begin(), gs_3.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[2] generators ***" << endl;
+  gs_2.ascii_dump(vnout);
+  vnout << "*** ph[3] generators ***" << endl;
+  gs_3.ascii_dump(vnout);
+  vnout << endl;
+
+  const Constraint_System& cs_2 = enhanced
+    ? ph[2].minimized_constraints()
+    : ph[2].constraints();
+  const Constraint_System& cs_3 = enhanced
+    ? ph[3].minimized_constraints()
+    : ph[3].constraints();
+
+  // Print cardinalities of constraint systems.
+  nout << "    # ph[2].constraints() = "
+       << std::distance(cs_2.begin(), cs_2.end()) << endl;
+  nout << "    # ph[3].constraints() = "
+       << std::distance(cs_3.begin(), cs_3.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[2] constraints ***" << endl;
+  cs_2.ascii_dump(vnout);
+  vnout << "*** ph[3] constraints ***" << endl;
+  cs_3.ascii_dump(vnout);
+  vnout << endl;
+
+  ph[2].intersection_assign(ph[3]);
+
+  /**** Compute the poly-hull of ph[0] and ph[2]. ****/
+
+  const Generator_System& gs_01 = enhanced
+    ? ph[0].minimized_generators()
+    : ph[0].generators();
+  const Generator_System& gs_23 = enhanced
+    ? ph[2].minimized_generators()
+    : ph[2].generators();
+
+  // Print cardinalities of arguments.
+  nout << "  - Computing poly-hull of ph[0] and ph[2]:" << endl;
+  nout << "    # ph[0].generators() = "
+       << std::distance(gs_01.begin(), gs_01.end()) << endl;
+  nout << "    # ph[2].generators() = "
+       << std::distance(gs_23.begin(), gs_23.end()) << endl;
+  // Very noisy dump of arguments.
+  vnout << "*** ph[0] generators ***" << endl;
+  gs_01.ascii_dump(vnout);
+  vnout << "*** ph[2] generators ***" << endl;
+  gs_23.ascii_dump(vnout);
+  vnout << endl;
+
+  ph[0].upper_bound_assign(ph[2]);
+
+  /**** Final conversion ****/
+
+  const Constraint_System& cs = ph[0].constraints();
+
+  nout << "Wmf final result timing: ";
+  print_clock(nout);
+  nout << endl;
+
+  // How many constraints obtained?
+  const long cs_cardinality = std::distance(cs.begin(), cs.end());
+
+  // Print cardinality of weakly-minimized final result.
+  nout << "  - Final (wmf) result is ph[0]:" << endl;
+  nout << "    # ph[0].constraints() = " << cs_cardinality << endl;
+  // Very noisy dump of weakly-minimized final result.
+  vnout << "*** ph[0] constraints ***" << endl;
+  cs.ascii_dump(vnout);
+  vnout << endl;
+
+  /**** Final strong minimization ****/
+
+  nout << "Smf (cons) final result timing: ";
+  start_clock();
+  const Constraint_System& min_cs = ph[0].minimized_constraints();
+  print_clock(nout);
+  nout << endl;
+
+  // How many constraints obtained?
+  const long min_cs_cardinality = std::distance(min_cs.begin(), min_cs.end());
+
+  // Print cardinality of strongly-minimized final result.
+  nout << "  - Final (smf) result is ph[0]:" << endl;
+  nout << "    # ph[0].minimized_constraints() = "
+       << min_cs_cardinality << endl;
+  // Very noisy dump of strongly-minimized final result.
+  vnout << "*** ph[0] minimized constraints ***" << endl;
+  min_cs.ascii_dump(vnout);
+  vnout << endl;
+
+  return enhanced ? min_cs_cardinality : cs_cardinality;
+}
+
+bool
+test01() {
+  std::vector<NNC_Polyhedron> ph;
+
+#if EXP_EVAL
+  dimension_type first_dim = 4;
+  dimension_type last_dim = 5;
+#else
+  dimension_type first_dim = 2;
+  dimension_type last_dim = 4;
+#endif
+
+  // Storing cardinalities of known results.
+  // NOTE: the numbers reported here differ a little bit from those
+  // in the FAC paper in that here we do not count low-level constraints
+  // related to the epsilon dimension. The difference is at most 2
+  // (the eps_geq_zero and eps_leq_one constraints).
+  typedef std::map<std::pair<dimension_type, int>, long> My_Map;
+  My_Map::const_iterator known_result;
+  My_Map standard_cardinalities;
+  My_Map enhanced_cardinalities;
+
+  using std::make_pair;
+
+  standard_cardinalities[make_pair(4, 25)] = 331;  // FAC  332
+  enhanced_cardinalities[make_pair(4, 25)] =  31;  // FAC   33
+
+  standard_cardinalities[make_pair(4, 50)] = 519;  // FAC  520
+  enhanced_cardinalities[make_pair(4, 50)] =  41;  // FAC   43
+
+  standard_cardinalities[make_pair(5, 25)] = 2692; // FAC 2693
+  enhanced_cardinalities[make_pair(5, 25)] =  125; // FAC  127
+
+  standard_cardinalities[make_pair(5, 50)] = 4993; // FAC 4994
+  enhanced_cardinalities[make_pair(5, 50)] =  150; // FAC  152
+
+  int num_errors = 0;
+
+  for (dimension_type dims = first_dim; dims <= last_dim; dims++)
+    for (int percentage = 25; percentage <= 50; percentage += 25) {
+
+      nout << endl
+           << "++++++++ DIMENSIONS = " << dims << "  ++++++++"
+           << endl
+           << "++++++++ PERCENTAGE = " << percentage << " ++++++++"
+           << endl;
+
+      // Standard evaluation strategy.
+      ph.clear();
+      build_polyhedra(dims, percentage, ph);
+      const long standard_eval_card = computation(ph, false);
+
+      // Check if there is a known result.
+      known_result = standard_cardinalities.find(make_pair(dims, percentage));
+      if (known_result != standard_cardinalities.end()
+          && known_result->second != standard_eval_card) {
+        ++num_errors;
+        nout << "Cardinality mismatch: "
+             << "expected " << known_result->second << ", "
+             << "obtained " << standard_eval_card << ".\n";
+      }
+
+      // Enhanced evaluation strategy.
+      ph.clear();
+      build_polyhedra(dims, percentage, ph);
+      const long enhanced_eval_card = computation(ph, true);
+
+      // Check if there is a known result.
+      known_result = enhanced_cardinalities.find(make_pair(dims, percentage));
+      if (known_result != enhanced_cardinalities.end()
+          && known_result->second != enhanced_eval_card) {
+        ++num_errors;
+        nout << "Cardinality mismatch: "
+             << "expected " << known_result->second << ", "
+             << "obtained " << enhanced_eval_card <<".\n";
+      }
+
+    }
+  return num_errors == 0;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64A(test01);
+END_MAIN
diff --git a/tests/Polyhedron/empty1.cc b/tests/Polyhedron/empty1.cc
new file mode 100644
index 0000000..3f9cf06
--- /dev/null
+++ b/tests/Polyhedron/empty1.cc
@@ -0,0 +1,51 @@
+/* Different ways of creating an empty polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  // This is the easy way to create
+  // the empty polyhedron in the zero-dimension space.
+  C_Polyhedron ph1(0, EMPTY);
+
+  // This is a more convoluted way of doing the same thing
+  // using an empty system of generators.
+  Generator_System gs;
+  C_Polyhedron ph2(gs);
+
+  bool ok = (ph1 == ph2 && ph1.is_empty() && ph2.is_empty());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/equals1.cc b/tests/Polyhedron/equals1.cc
new file mode 100644
index 0000000..1998212
--- /dev/null
+++ b/tests/Polyhedron/equals1.cc
@@ -0,0 +1,62 @@
+/* Test operator==(const Polyhedron&, const Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(100*A-100*B <= 0);
+  ph1.add_constraint(-100*A <= -300);
+  ph1.add_constraint(-100*B <= -300);
+  ph1.add_constraint(100*A <= 30400);
+  ph1.add_constraint(100*B <= 30400);
+  ph1.add_constraint(-258*A+209*B <= 7093);
+  ph1.add_constraint(258*A-209*B <= 8907);
+  ph1.add_constraint(151*A-214*B <= 5393);
+  ph1.add_constraint(-151*A+214*B <= 10606);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(258*A - 209*B >= -7093);
+  ph2.add_constraint(151*A - 214*B >= -10606);
+  ph2.add_constraint(A >= 3);
+  ph2.add_constraint(-A + B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  bool ok = (ph1 == ph2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F32(test01);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions1.cc b/tests/Polyhedron/exceptions1.cc
new file mode 100644
index 0000000..ec8dba0
--- /dev/null
+++ b/tests/Polyhedron/exceptions1.cc
@@ -0,0 +1,1463 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  try {
+    // This is an incorrect use of the function Generator::point(expr, d):
+    // it is illegal to build a point with the denominator
+    // equal to zero.
+    gs.insert(point(x + y + z, 0));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(x + y));
+  gs.insert(ray(x + 0*y));
+  gs.insert(ray(0*x + y));
+  C_Polyhedron ph(gs);
+  Linear_Expression coeff1 = x + y + 1;
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::affine_image(v, expr,d): it is illegal applying
+    // the function with a linear expression with the denominator equal to
+    // zero.
+    Coefficient d = 0;
+    ph.affine_image(x, coeff1, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1;
+  Generator_System gs;
+  gs.insert(point(x + y));
+  C_Polyhedron ph2(gs);
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::upper_bound_assign(p): it is illegal to use
+    // it with two polyhedra of different dimensions.
+    ph1.upper_bound_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(line(x + y + z));
+
+  try {
+    // This is an incorrect use of the function
+    // C_Polyhedron::C_Polyhedron(gs): it is illegal to build a
+    // polyhedron starting from a system of generators that does not
+    // contain a point.
+    C_Polyhedron ph(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(point(0*x + 1*y +2*z));
+  C_Polyhedron ph(gs);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(z);
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  try {
+    to_be_removed.insert(x);
+    // This is an incorrect use use of function
+    // C_Polyhedron::remove_space_dimensions(to_be_remove).
+    // Here the set `to_be_removed' still contains variable `z'.
+    // This variable is now beyond the space dimension,
+    // so that a dimension-incompatibility exception is obtained.
+    ph.remove_space_dimensions(to_be_removed);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(x >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_image(v, expr, d): it is illegal to
+    // apply this function to a variable that is not in the space of
+    // the polyhedron.
+    ph.affine_image(y, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(y >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_image(v, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    ph.affine_image(y, x + z + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= y);
+  Linear_Expression coeff = x + y + 1;
+  try {
+    // This is an incorrect use of the function
+    // C_Polyhedron::affine_preimage(v, expr, d): it is illegal
+    // to apply to a polyhedron an expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    ph.affine_preimage(x, coeff, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x + y));
+  gs.insert(ray(x));
+
+  C_Polyhedron ph(gs);
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_image(v, expr, d): it is illegal apply
+    // the transformation to a variable that is not in the space
+    // of the polyhedron.
+    ph.affine_preimage(z, x + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(x));
+  gs.insert(line(x + y));
+
+  C_Polyhedron ph(gs);
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::affine_preimage(v, expr, d): it is illegal to
+    // apply to a polyhedron an expression that contains a variable that
+    // is not in the space of the polyhedron.
+    ph.affine_preimage(y, x + z + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+ }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= y);
+
+  C_Polyhedron ph2(3);
+
+  try {
+    // This is an invalid use of method
+    // C_Polyhedron::intersection_assign(ph2): it is illegal
+    // to apply this function to two polyhedra of different dimensions.
+    ph1.intersection_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  C_Polyhedron ph1(7);
+
+  C_Polyhedron ph2(15);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::intersection_assign(ph2): it is illegal to apply
+    // this function to two polyhedra of different dimensions.
+    ph1.intersection_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test13() {
+  Variable w(4);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators(gs): it is illegal
+    // to add a system of generator that is not dimension-compatible
+    // with the polyhedron.
+    Generator_System gs;
+    gs.insert(point(w));
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  C_Polyhedron ph(5);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::remove_higher_space_dimensions(n): it is illegal to
+    // erase a variable that is not in the space of the polyhedron.
+    ph.remove_higher_space_dimensions(7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_constraints(cs): it is illegal to
+    // add a system of constraints that is not dimensional incompatible
+    // with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y >= 0);
+    ph.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_constraint(c): it is illegal to insert a
+    // constraints that contains a variable that is not in the space
+    // of the polyhedron.
+    ph.add_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_constraints(cs): it is illegal to add a system
+    // of constraints that is dimensional incompatible with the
+    // polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    ph.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(x));
+
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(x));
+  gs2.insert(ray(x + y));
+
+  C_Polyhedron ph2(gs2);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::upper_bound_assign(ph2): it is illegal to apply
+    // this function to two polyhedra with different dimensions.
+    ph1.upper_bound_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1, EMPTY);
+
+  try {
+    // This is an invalid use of the function C_Polyhedron::add_generator(g):
+    // it is illegal to insert a generator that is dimensional
+    // incompatible with the polyhedron.
+    ph.add_generator(point(x + y));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test20() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators(gs): it is illegal to a system of
+    // generators that is dimensional incompatible with the
+    // polyhedron.
+    Generator_System gs;
+    gs.insert(point());
+    gs.insert(line(x + y));
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test21() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Generator_System gs;
+  gs.insert(ray(x + y));
+  gs.insert(point());
+
+  C_Polyhedron ph(gs);
+  try {
+    // This is an invalid use of the function C_Polyhedron::relation_with(c):
+    // it is illegal to use a constraints that is dimensional
+    // incompatible with the polyhedron.
+    Constraint c(z >= 0);
+    ph.relation_with(c);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+}
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test22() {
+  Variable z(2);
+
+  C_Polyhedron ph(2);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::relation_with(g): it is illegal to apply this
+    // function to a generator that is not dimension-compatible with
+    // the polyhedron.
+    Generator g(point(z));
+    ph.relation_with(g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test23() {
+  C_Polyhedron ph1(5);
+  C_Polyhedron ph2(10);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::H79_widening_assign(ph2): it is illegal to apply
+    // this function to two polyhedra that are not dimensional
+    // compatible.
+    ph2.H79_widening_assign(ph1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test24() {
+  Variable y(1);
+
+  C_Polyhedron ph1(1);
+  C_Polyhedron ph2(2);
+
+  Constraint_System cs;
+  cs.insert(y <= 9);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::limited_H79_extrapolation_assign(ph2, cs): it is
+    // illegal to apply this function to two polyhedra that are not
+    // dimension-compatible.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test25() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x - y >= 0);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x - y >= 0);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 5);
+
+  Constraint_System cs;
+  cs.insert(z <= 5);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::limited_H79_extrapolation_assign(ph, cs): it is
+    // illegal to apply this function to a system of constraints that
+    // is not dimension-compatible with the two polyhedra.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test26() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(x - y >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x - y == 0);
+
+  try {
+    // This is an invalid use of Polyhedron::contains(): it is
+    // illegal to apply this method to two polyhedra that are not
+    // dimension-compatible.
+    ph1.contains(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test27() {
+  Variable x(0);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  try {
+    // This is an invalid use of method
+    // C_Polyhedron::add_generator(g): it is illegal to insert a
+    // generator that is not dimension-compatible with the
+    // polyhedron.
+    Generator g(ray(x));
+    ph.add_generator(g);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test28() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators(gs): it is illegal to add a system
+    // of generators with no points to an empty polyhedron.
+    Generator_System gs;
+    gs.insert(ray(x + y));
+    gs.insert(ray(x - y));
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test29() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::add_generators(gs): it is illegal
+    // to apply this function with a system of generators with no
+    // points to an empty polyhedron.
+    Generator_System gs;
+    gs.insert(line(x));
+    gs.insert(line(y));
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test30() {
+
+  C_Polyhedron ph1(3);
+  C_Polyhedron ph2(5);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::difference_assign(ph2): it is impossible to apply
+    // this function to two polyhedra of different dimensions.
+    ph1.difference_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test31() {
+  C_Polyhedron ph1(3);
+  C_Polyhedron ph2(8);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::time_elapse_assign(p): it is illegal to use
+    // it with two polyhedra of different dimensions.
+    ph1.time_elapse_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test32() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(ray(A));
+  gs1.insert(line(B));
+
+  const Generator_System gs2 = gs1;
+
+  print_generators(gs2, "*** gs2 ***");
+
+  try {
+    // This is an incorrect use of the function
+    // `C_Polyhedron::C_Polyhedron(gs)': it is illegal to build a
+    // closed polyhedron starting from a constant system of
+    // generators that does not contain points.
+    C_Polyhedron ph2(gs2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test33() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  try {
+    // This is an incorrect use of the function
+    // `add_generator(g)': it is illegal to add a
+    // ray to an empty polyhedron.
+    ph1.add_generator(ray(A));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test34() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 3);
+  ph.add_constraint(A <= 5);
+
+  try {
+    // This is an invalid used of the function
+    // `C_Polyhedron::bounds_from_above(v, expr, d)': it is illegal to
+    // use a variable in the expression that does not appear in the
+    // space of the polyhedron.
+    ph.bounds_from_above(A + B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test35() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(line(A));
+  gs.insert(ray(B));
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty polyhedron.
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test36() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty polyhedron.
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test37() {
+  C_Polyhedron ph1(5);
+  C_Polyhedron ph2(10);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::BHRZ03_widening_assign(ph2): it is illegal to apply
+    // this function to two polyhedra that are not dimensional
+    // compatible.
+    ph2.BHRZ03_widening_assign(ph1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test38() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal
+    // applying the function with a linear expression with the denominator
+    // equal to zero.
+    Coefficient d = 0;
+    ph.generalized_affine_image(B, GREATER_OR_EQUAL, B + 2, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test39() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
+    // use a variable in the expression that does not appear in the polyhedron.
+    ph.generalized_affine_image(A, GREATER_OR_EQUAL, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test40() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an invalid used of the function
+    // C_Polyhedron::generalized_affine_image(v, r, expr, d): it is illegal to
+    // apply this function to a variable that is not in the space of
+    // the polyhedron.
+    ph.generalized_affine_image(B, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test41() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `rhs' expression that
+    // does not appear in the polyhedron.
+    ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, B + C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test42() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::generalized_affine_image(lhs, r, rhs):
+    // it is illegal to use a variable in the `lhs' expression that
+    // does not appear in the polyhedron.
+    ph.generalized_affine_image(B + C, LESS_OR_EQUAL, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test43() {
+  Generator_System gs;
+  Linear_Expression e;
+  try {
+    // This is an incorrect use of function
+    // Generator::ray(e):
+    // the origin can not be a ray.
+    gs.insert(ray(e));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test44() {
+  Generator_System gs;
+  Linear_Expression e;
+  try {
+    // This is an incorrect use of function
+    // Generator::line(e):
+    // the origin can not be a line.
+    gs.insert(line(e));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test45() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator g = point(3*A - 2*B);
+  try {
+    // This is an incorrect use of function
+    // Generator::coefficient(v):
+    // it is impossible to compute the coefficient
+    // of a variable that is not in the space of the
+    // generator.
+    g.coefficient(C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test46() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator g = line(3*A - 2*B);
+  try {
+    // This is an incorrect use of method Generator::divisor(): it is
+    // illegal to ask for the divisor of a line.
+    g.divisor();
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test47() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Constraint c(2*A - 3*B <= 2);
+  try {
+    // This is an incorrect use of function
+    // Constraint::coefficient(v):
+    // it is impossible to compute the coefficient
+    // of a variable that is not in the space of the
+    // constraint.
+    c.coefficient(C);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test48() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // any call with a denominator equal to zero is illegal.
+    Coefficient d = 0;
+    ph.bounded_affine_image(B, A - 7, B + 2, d);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test49() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the lower bounding expression
+    // that does not appear in the polyhedron.
+    ph.bounded_affine_image(A, B, A + 7);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test50() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to use a variable in the upper bounding expression
+    // that does not appear in the polyhedron.
+    ph.bounded_affine_image(A, A + 7, B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test51() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an incorrect use of function
+    // C_Polyhedron::bounded_affine_image(v, lb_expr, ub_expr, d):
+    // it is illegal to bound a variable not occurring in the
+    // vector space embedding the polyhedron.
+    ph.bounded_affine_image(B, A - 7, 2*A - 2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test52() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+  try {
+    // This is an incorrect use of function
+    // Pointset_Powerset::add_disjunct(ph): the powerset and
+    // the added disjunct should have the same space dimension.
+    ps.add_disjunct(ph);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test53() {
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_constraint(c): it is illegal to insert a
+    // constraint that contains a variable that is not in the space
+    // of the polyhedron.
+    ph.refine_with_constraint(y >= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test54() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_constraints(cs): it is illegal to
+    // refine with a system of constraints that is dimensionally
+    // incompatible with the polyhedron.
+    Constraint_System cs;
+    cs.insert(x - y == 0);
+    ph.refine_with_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test55() {
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_congruence(cg): it is illegal to insert a
+    // congruence that contains a variable that is not in the space
+    // of the polyhedron.
+    ph.refine_with_congruence(y %= 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test56() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::refine_with_congruences(cgs): it is illegal to
+    // refine with a system of congruences that is dimensionally
+    // incompatible with the polyhedron.
+    Congruence_System cgs;
+    cgs.insert(x - y == 0);
+    ph.refine_with_congruences(cgs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
+  DO_TEST(test26);
+  DO_TEST(test27);
+  DO_TEST(test28);
+  DO_TEST(test29);
+  DO_TEST(test30);
+  DO_TEST(test31);
+  DO_TEST(test32);
+  DO_TEST(test33);
+  DO_TEST(test34);
+  DO_TEST(test35);
+  DO_TEST(test36);
+  DO_TEST(test37);
+  DO_TEST(test38);
+  DO_TEST(test39);
+  DO_TEST(test40);
+  DO_TEST(test41);
+  DO_TEST(test42);
+  DO_TEST(test43);
+  DO_TEST(test44);
+  DO_TEST(test45);
+  DO_TEST(test46);
+  DO_TEST(test47);
+  DO_TEST(test48);
+  DO_TEST(test49);
+  DO_TEST(test50);
+  DO_TEST(test51);
+  DO_TEST(test52);
+  DO_TEST(test53);
+  DO_TEST(test54);
+  DO_TEST(test55);
+  DO_TEST(test56);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions2.cc b/tests/Polyhedron/exceptions2.cc
new file mode 100644
index 0000000..70381b3
--- /dev/null
+++ b/tests/Polyhedron/exceptions2.cc
@@ -0,0 +1,910 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x - y > 0);
+  cs.insert(x >= 0);
+
+  try {
+    // This is an invalid use of the constructor of a polyhedron:
+    // it is illegal to build a closed polyhedron starting from
+    // a system of constraints that contains strict inequalities.
+    C_Polyhedron ph(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(closure_point(2*x + y));
+  gs.insert(point(x + y));
+  gs.insert(ray(x));
+  gs.insert(ray(y));
+
+  try {
+    // This is an invalid use of the constructor of a polyhedron:
+    // it is illegal to build a closed polyhedron starting from
+    // a system of generators that contains closure points.
+    C_Polyhedron ph(gs);
+    exit(1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+
+  try {
+    // This is an invalid use of the function add_constraint(c): it is
+    // illegal to insert a strict inequality into a system of
+    // constraints of a closed polyhedron.
+    ph.add_constraint(x - y > 0);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test04() {
+  C_Polyhedron ph(3, EMPTY);
+
+  try {
+    // This is an incorrect use of the function add_generator(g): it
+    // is illegal to insert a closure-point into a system of
+    // generators of a closed polyhedron.
+    ph.add_generator(closure_point(Linear_Expression(2)));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(y >= 2);
+
+  Constraint_System cs;
+  cs.insert(x == y);
+  cs.insert(x < 5);
+
+  try {
+    // This is an incorrect use of the function
+    // add_constraints(cs): it is illegal to add a system of
+    // constraints that contains strict inequalities to a closed polyhedron.
+    ph.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  Constraint_System cs;
+  cs.insert(x > 3);
+  cs.insert(x > y);
+
+  try {
+    // This is an invalid use of the function add_constraints(cs):
+    // it is illegal to add a system of constraints that contains
+    // strict inequalities to a closed polyhedron.
+    ph.add_constraints(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+}
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+
+  Constraint_System cs;
+  cs.insert(x > 2);
+  cs.insert(x == y);
+  NNC_Polyhedron qh(cs);
+
+  try {
+    // This is an incorrect use of the method concatenate_assign(): it
+    // is illegal to apply this method to a closed polyhedron with a
+    // NNC Polyhedron.
+    ph.concatenate_assign(qh);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(closure_point(-x));
+  gs.insert(ray(x));
+  gs.insert(ray(y));
+
+  try {
+    // This is an incorrect use of the function
+    // add_generators(gs): it is illegal to add a
+    // system of generators that contains closure-points to a closed
+    // polyhedron.
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  Generator_System gs;
+  gs.insert(point(x));
+  gs.insert(closure_point());
+  gs.insert(ray(x+y));
+
+  try {
+    // This is an incorrect use of the function add_generators(gs): it is
+    // illegal to add a system of generators that contains closure-points
+    // to a closed polyhedron.
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 1);
+  ph.add_constraint(B >= 1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::generalized_affine_image(v, expr, d):
+    // `GREATER_THAN' is an illegal relation for necessarily closed
+    // polyhedron.
+    ph.generalized_affine_image(A + B, GREATER_THAN, A - B);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A - B > 0);
+  ph2.add_constraint(A >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `intersection_assign': it is illegal to apply
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.intersection_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(B >= 2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A - B > 0);
+  ph2.add_constraint(B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `intersection_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.intersection_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(3*B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(2*A));
+  gs2.insert(closure_point());
+  gs2.insert(closure_point(3*A));
+  NNC_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+   try {
+    // This is an invalid use of the function
+    // `upper_bound_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.upper_bound_assign(ph2);
+   }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+   return false;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 4);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(B <= 4);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 2);
+  ph2.add_constraint(A <= 6);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(B <= 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `difference_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph1.difference_assign(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the function
+    // `H79_widening_assign': it is illegal to apply this function
+    // to a closed polyhedron and a non-closed polyhedron.
+    ph2.H79_widening_assign(ph1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  Constraint_System cs;
+  cs.insert(A <= 8);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an invalid use of the function
+    // `limited_H79_widening_assign': it is illegal to
+    // apply this function to a closed polyhedron and
+    // a non-closed polyhedron.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  Constraint_System cs;
+  cs.insert(A < 8);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an invalid use of the function
+    // `limited_H79_extrapolation_assign': it is illegal to
+    // apply this function to two closed polyhedra and
+    // to a non-closed system of constraints.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+}
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B <= 1);
+
+  Generator_System gs;
+  gs.insert(point(2*A + 2*B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph2(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+ try {
+    // This is an invalid use of the function
+    // `time_elapse_assign': it is illegal to
+    // apply this function to a closed polyhedron and
+    // a non-closed polyhedron.
+    ph1.time_elapse_assign(ph2);
+ }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+ }
+  catch (...) {
+  }
+ return false;
+}
+
+bool
+test20() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 5);
+
+  NNC_Polyhedron ph2(1);
+  ph2.add_constraint(A > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of the Polyhedron::contains(): it is
+    // illegal to apply this method to a closed polyhedron and a
+    // non-closed polyhedron.
+    ph1.contains(ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test21() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A - B > 0);
+
+  const Constraint_System cs = ph1.constraints();
+
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an incorrect use of the function
+    // C_Polyhedron::C_Polyhedron(cs): it is illegal to build a
+    // closed polyhedron starting from a system of constraints
+    // that contains strict inequalities.
+    C_Polyhedron ph2(cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test22() {
+  Variable A(0);
+
+  Generator_System gs1;
+  gs1.insert(point(3*A));
+  gs1.insert(closure_point(2*A));
+  gs1.insert(ray(A));
+
+  NNC_Polyhedron ph1(gs1);
+
+  const Generator_System gs2 = ph1.generators();
+
+  try {
+    // This is an incorrect use of the function
+    // `C_Polyhedron(const Generator_System)': it is illegal to build
+    // a closed polyhedron starting from a constant non-closed
+    // system of generators.
+    C_Polyhedron ph2(gs2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test23() {
+  NNC_Polyhedron ph(0, EMPTY);
+
+  try {
+    // This is an incorrect use of the function
+    // `add_generator(g)': it is illegal add a closure point
+    // to a zero-dimensional and empty non-closed polyhedron.
+    ph.add_generator(closure_point());
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test24() {
+  NNC_Polyhedron ph(0, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(closure_point());
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty zero-dimensional polyhedron.
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test25() {
+  NNC_Polyhedron ph(0, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Generator_System gs;
+  gs.insert(closure_point());
+
+  try {
+    // This is an invalid used of the function
+    // `add_generators(gs)': it is illegal to
+    // add a system of generators that does not contain points
+    // to an empty zero-dimensional polyhedron.
+    ph.add_generators(gs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test26() {
+  Variable A(0);
+
+  NNC_Polyhedron ph1(1);
+  ph1.add_constraint(A > 5);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(A >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  try {
+    // This is an invalid use of Polyhedron::contains():
+    // it is illegal to apply this method to a
+    // closed polyhedron and a non-closed polyhedron.
+    ph2.contains(ph1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test27() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(A - B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(A <= 4);
+  ph2.add_constraint(A - B >= 0);
+
+  Constraint_System cs;
+  cs.insert(A < 8);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  try {
+    // This is an invalid use of the function
+    // `limited_H79_extrapolation_assign': it is illegal to
+    // apply this function to a non-closed polyhedron,
+    // a non-closed polyhedron and a system of
+    // constraints that contains strict inequalities.
+    ph2.limited_H79_extrapolation_assign(ph1, cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test28() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A - B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A < 5);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A - B >= 0);
+
+  try {
+    // This is an invalid use of the function
+    // `BHRZ03_widening_assign': it is illegal to
+    // apply this function to a non-closed polyhedron and
+    // a non-closed polyhedron.
+    ph2.BHRZ03_widening_assign(ph1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test29() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  try {
+    // This is an incorrect use of function
+    // Generator::closure_point(e, d):
+    // it is illegal to use a denominator
+    // equal to zero.
+    gs.insert(closure_point(A + 2*B, 0));
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test30() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A < 2);
+  ph1.add_constraint(B > 0);
+
+  C_Polyhedron ph2;
+
+  try {
+    // This is an invalid use of the function
+    // `Polyhedron::swap(Polyhedron&)': it is illegal
+    // to apply this function to a closed and a
+    // not necessarily closed polyhedron.
+    swap(ph1, ph2);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test31() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 1);
+
+  try {
+    // This is an invalid use of the function
+    // C_Polyhedron::generalized_affine_image(v, r, expr,d ):
+    // `GREATER_THAN' is an illegal relation for necessarily closed
+    // polyhedron.
+    ph.generalized_affine_image(A, GREATER_THAN, A + 1);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+  DO_TEST(test23);
+  DO_TEST(test24);
+  DO_TEST(test25);
+  DO_TEST(test26);
+  DO_TEST(test27);
+  DO_TEST(test28);
+  DO_TEST(test29);
+  DO_TEST(test30);
+  DO_TEST(test31);
+END_MAIN
diff --git a/tests/Polyhedron/exceptions3.cc b/tests/Polyhedron/exceptions3.cc
new file mode 100644
index 0000000..8967dc4
--- /dev/null
+++ b/tests/Polyhedron/exceptions3.cc
@@ -0,0 +1,235 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  try {
+    // This is an invalid use of the constructor of a Variable:
+    // it is illegal to (try to) build a variable with an id()
+    // greater than or equal to Variable::max_space_dimension().
+    Variable v(Variable::max_space_dimension());
+
+    // This is only to avoid a compiler warning.
+    (void) v.id();
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test02() {
+  try {
+    Variable v(Linear_Expression::max_space_dimension());
+    // This is an invalid use of the constructor of a Linear_Expression:
+    // it is illegal to (try to) build a linear expression with a dimensions
+    // greater than Linear_Expression::max_space_dimension().
+    Linear_Expression e(v);
+
+   // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test03() {
+  try {
+    Variable v(Linear_Expression::max_space_dimension());
+    // This is an invalid use of the constructor of a Linear_Expression:
+    // it is illegal to (try to) build a linear expression with a dimensions
+    // greater than Linear_Expression::max_space_dimension().
+    Linear_Expression e;
+    e += v;
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+   }
+  return false;
+}
+
+bool
+test04() {
+  try {
+    Variable v(Linear_Expression::max_space_dimension());
+    // This is an invalid use of the constructor of a Linear_Expression:
+    // it is illegal to (try to) build a linear expression with a dimensions
+    // greater than Linear_Expression::max_space_dimension().
+    Linear_Expression e;
+    e -= v;
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+   }
+  return false;
+}
+
+bool
+test05() {
+  try {
+    // This is an invalid use of the constructor of a polyhedron:
+    // it is illegal to (try to) build a polyhedron with a dimensions
+    // greater than C_Polyhedron::max_space_dimension().
+    C_Polyhedron ph(C_Polyhedron::max_space_dimension() + 1);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test06() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method for adding dimensions:
+    // it is illegal to (try to) embed a polyhedron into a vector space
+    // whose dimension is greater than C_Polyhedron::max_space_dimension().
+    ph.add_space_dimensions_and_embed(C_Polyhedron::max_space_dimension());
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test07() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method for adding dimensions:
+    // it is illegal to (try to) project a polyhedron into a vector space
+    // whose dimension is greater than C_Polyhedron::max_space_dimension().
+    ph.add_space_dimensions_and_project(C_Polyhedron::max_space_dimension());
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    C_Polyhedron ph(C_Polyhedron::max_space_dimension(), EMPTY);
+    // This is an invalid use of the method for concatenating polyhedra:
+    // it is illegal to (try to) concatenate polyhedra if the resulting
+    // vector space will have a dimension greater than
+    // C_Polyhedron::max_space_dimension().
+    ph.concatenate_assign(C_Polyhedron(1));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method for expanding space dimensions:
+    // it is illegal to (try to) expand a space dimension if the resulting
+    // vector space will have a dimension greater than
+    // C_Polyhedron::max_space_dimension().
+    ph.expand_space_dimension(Variable(0),
+                              C_Polyhedron::max_space_dimension());
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::length_error& e) {
+    nout << "length_error: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/expandspacedim1.cc b/tests/Polyhedron/expandspacedim1.cc
new file mode 100644
index 0000000..5a890f5
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim1.cc
@@ -0,0 +1,269 @@
+/* Test Polyhedron::expand_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with a universe polyhedron.
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(3);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+
+  C_Polyhedron known_result(4);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Test with an empty polyhedron.
+bool
+test02() {
+  //  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(B, 1);
+
+  C_Polyhedron known_result(4, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 1) ***");
+
+  return ok;
+}
+
+// Test trivial expansion.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 0) ***");
+
+  return ok;
+}
+
+// Test with given generators.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(point(A + B));
+  ph1.add_generator(point(B));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(A + C));
+  known_result.add_generator(point(A + B));
+  known_result.add_generator(point(A + B + C));
+  known_result.add_generator(point(B));
+  known_result.add_generator(point(B + C));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Test with given constraints.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 1) ***");
+
+  return ok;
+}
+
+// Test using constraints expanding 2 dimensions.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 2);
+
+  C_Polyhedron known_result(4);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+  known_result.add_constraint(C >= 0);
+  known_result.add_constraint(C + B <= 2);
+  known_result.add_constraint(D >= 0);
+  known_result.add_constraint(D + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+// Test using constraints with equality constraint.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A <= 1);
+  ph1.add_constraint(C == 1);
+  ph1.add_constraint(A + B >= 1);
+  ph1.add_constraint(B <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 1);
+  ph1.expand_space_dimension(C, 1);
+
+  C_Polyhedron known_result(5);
+  known_result.add_constraint(A <= 1);
+  known_result.add_constraint(A + B >= 1);
+  known_result.add_constraint(C == 1);
+  known_result.add_constraint(E == 1);
+  known_result.add_constraint(B <= 1);
+  known_result.add_constraint(D <= 1);
+  known_result.add_constraint(D + B >= 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+                    "*** after ph1.expand_space_dimension(A, 1);"
+                    " ph1.expand_space_dimension(C, 1) ***");
+
+  return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A + 2*B));
+  ph1.add_generator(point(A + 3*B));
+  ph1.add_generator(point(A + 4*B));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(B, 1);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point(A + 2*B + 2*C));
+  known_result.add_generator(point(A + 2*B + 3*C));
+  known_result.add_generator(point(A + 2*B + 4*C));
+  known_result.add_generator(point(A + 3*B + 2*C));
+  known_result.add_generator(point(A + 3*B + 3*C));
+  known_result.add_generator(point(A + 3*B + 4*C));
+  known_result.add_generator(point(A + 4*B + 2*C));
+  known_result.add_generator(point(A + 4*B + 3*C));
+  known_result.add_generator(point(A + 4*B + 4*C));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/expandspacedim2.cc b/tests/Polyhedron/expandspacedim2.cc
new file mode 100644
index 0000000..d9dee50
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim2.cc
@@ -0,0 +1,103 @@
+/* Test Polyhedron::expand_space_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test using constraints for NNC polyhedron.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A - B > 2);
+  ph1.add_constraint(A + 2*B < 6);
+  ph1.add_constraint(B < 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(B, 2);
+
+  NNC_Polyhedron known_result(4);
+  known_result.add_constraint(A - B > 2);
+  known_result.add_constraint(A + 2*B < 6);
+  known_result.add_constraint(B < 6);
+  known_result.add_constraint(A - C > 2);
+  known_result.add_constraint(A + 2*C < 6);
+  known_result.add_constraint(C < 6);
+  known_result.add_constraint(A - D > 2);
+  known_result.add_constraint(A + 2*D < 6);
+  known_result.add_constraint(D < 6);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.expand_space_dimension(B, 2) ***");
+
+  return ok;
+}
+
+// Test using generators for NNC polyhedron.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(closure_point(A + B));
+  ph1.add_generator(ray(A - B));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.expand_space_dimension(A, 2);
+
+  NNC_Polyhedron known_result(4, EMPTY);
+  known_result.add_generator(point(A + C + D));
+  known_result.add_generator(ray(A -B + C + D));
+  known_result.add_generator(closure_point(A + C + 2*D));
+  known_result.add_generator(closure_point(A + 2*C + D));
+  known_result.add_generator(closure_point(A + 2*C + 2*D));
+  known_result.add_generator(closure_point(A + B + C + D));
+  known_result.add_generator(closure_point(2*A + C + D));
+  known_result.add_generator(closure_point(2*A + C + 2*D));
+  known_result.add_generator(closure_point(2*A + 2*C + D));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.expand_space_dimension(A, 2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/foldspacedims1.cc b/tests/Polyhedron/foldspacedims1.cc
new file mode 100644
index 0000000..48db5a3
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims1.cc
@@ -0,0 +1,337 @@
+/* Test Polyhedron::fold_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with a universe polyhedron.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+// Test with an empty polyhedron.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+// Trivial fold.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B + C <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B + C <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 1);
+  ph1.add_constraint(A <= 3);
+  ph1.add_constraint(B >= 7);
+  ph1.add_constraint(B <= 12);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 12);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+// Test that takes the expected result of the expand operation
+// example given in [GopanDMDRS04] on page 519 and folds it to recover
+// the unexpanded polyhedron.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3, EMPTY);
+  ph1.add_generator(point(A + 2*B + 2*C));
+  ph1.add_generator(point(A + 2*B + 3*C));
+  ph1.add_generator(point(A + 2*B + 4*C));
+  ph1.add_generator(point(A + 3*B + 2*C));
+  ph1.add_generator(point(A + 3*B + 3*C));
+  ph1.add_generator(point(A + 3*B + 4*C));
+  ph1.add_generator(point(A + 4*B + 2*C));
+  ph1.add_generator(point(A + 4*B + 3*C));
+  ph1.add_generator(point(A + 4*B + 4*C));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(A + 2*B));
+  known_result.add_generator(point(A + 3*B));
+  known_result.add_generator(point(A + 4*B));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after folding {C} into B ***");
+
+  return ok;
+}
+
+// Test folding several dimensions into a higher dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(A >= 1);
+  ph1.add_constraint(A <= 3);
+  ph1.add_constraint(B >= 7);
+  ph1.add_constraint(B <= 12);
+  ph1.add_constraint(C == 15);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  C_Polyhedron known_result(1);
+  known_result.add_constraint(A >= 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {A,B} into C ***");
+
+  return ok;
+}
+
+// Test fold_space_dimensions() when there are rays.
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(ray(A + B));
+  ph1.add_generator(ray(A + 2*C));
+
+  print_generators(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(A));
+  known_result.add_generator(ray(A));
+  known_result.add_generator(ray(A + B));
+  known_result.add_generator(ray(A + 2*B));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after folding {C} into B ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(C + B <= 2);
+  ph1.add_constraint(D >= 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, A);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {C,D} into A ***");
+
+  return ok;
+}
+
+// Test folding dimensions into an intermediate dimension.
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(C + B <= 2);
+  ph1.add_constraint(D >= 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {B,D} into C ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  // test06() only fails when using C_Polyhedron and 8 bit coefficients.
+#ifdef DERIVED_TEST
+  DO_TEST(test06);
+#else
+  DO_TEST_F8(test06);
+#endif // !defined(DERIVED_TEST)
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/foldspacedims2.cc b/tests/Polyhedron/foldspacedims2.cc
new file mode 100644
index 0000000..7580197
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims2.cc
@@ -0,0 +1,231 @@
+/* Test Polyhedron::fold_space_dimensions() for non-closed polyhedra.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Test with an empty polyhedron.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(3, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  NNC_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+// Trivial fold.
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A + B + C < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A + B + C < 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {} into B ***");
+
+  return ok;
+}
+
+// Test as given in [GopanDMDRS04] on page 519 but with strict constraints.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A < 3);
+  ph1.add_constraint(B > 7);
+  ph1.add_constraint(B < 12);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+
+  ph1.fold_space_dimensions(to_fold, B);
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(A > 1);
+  known_result.add_constraint(A < 12);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {A} into B ***");
+
+  return ok;
+}
+
+// Test folding several dimensions into a higher dimension.
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A <= 3);
+  ph1.add_constraint(B > 7);
+  ph1.add_constraint(B < 12);
+  ph1.add_constraint(C == 15);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(A);
+  to_fold.insert(B);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(A > 1);
+  known_result.add_constraint(A <= 15);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {A,B} into C ***");
+
+  return ok;
+}
+
+// Test folding dimensions into a lower dimension.
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(4);
+  ph1.add_constraint(A > 0);
+  ph1.add_constraint(A + B < 2);
+  ph1.add_constraint(C > 0);
+  ph1.add_constraint(C + B < 2);
+  ph1.add_constraint(D > 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(C);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, A);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A > 0);
+  known_result.add_constraint(A + B <= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {C,D} into A ***");
+
+  return ok;
+}
+
+// Test folding dimensions into an intermediate dimension.
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(4);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B > 0);
+  ph1.add_constraint(A + B <= 2);
+  ph1.add_constraint(C > 0);
+  ph1.add_constraint(C + B <= 2);
+  ph1.add_constraint(D > 0);
+  ph1.add_constraint(D + B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  // This is the set of the variables that we want to fold.
+  Variables_Set to_fold;
+  to_fold.insert(B);
+  to_fold.insert(D);
+
+  ph1.fold_space_dimensions(to_fold, C);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A < 2);
+  known_result.add_constraint(B > 0);
+  known_result.add_constraint(B < 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after folding {B,D} into C ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/frequency1.cc b/tests/Polyhedron/frequency1.cc
new file mode 100644
index 0000000..1e068ca
--- /dev/null
+++ b/tests/Polyhedron/frequency1.cc
@@ -0,0 +1,232 @@
+/* Test Polyhedron::frequency().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// Universe and empty polyhedron.
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+
+  C_Polyhedron ph2(1, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (!ph1.frequency(A, num1, den1, valn1, vald1)
+             && !ph2.frequency(A, num2, den2, valn2, vald2));
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+// 0-dimension polyhedra.
+bool
+test02() {
+  C_Polyhedron ph1(0);
+
+  C_Polyhedron ph2(0, EMPTY);
+
+  Coefficient num1;
+  Coefficient den1;
+  Coefficient valn1;
+  Coefficient vald1;
+  Coefficient num2;
+  Coefficient den2;
+  Coefficient valn2;
+  Coefficient vald2;
+  bool ok = (ph1.frequency(Linear_Expression(3), num1, den1, valn1, vald1)
+             && num1 == 0 && den1 == 1 && valn1 == 3 && vald1 == 1
+             && !ph2.frequency(Linear_Expression(3), num2, den2, valn2, vald2));
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+// Non-relational test.
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A == 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (ph.frequency(Linear_Expression(A), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 0 && vald == 1);
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!ph.frequency(Linear_Expression(A), num, den, valn, vald));
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A <= 0);
+  ph.add_constraint(A + B >= 5);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!ph.frequency(Linear_Expression(B), num, den, valn, vald));
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A == 1);
+  ph.add_constraint(B == 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (ph.frequency(Linear_Expression(A + B - 3), num, den, valn, vald)
+             && num == 0 && den == 1 && valn == -1 && vald == 2);
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A < 1);
+  ph.add_constraint(A >= 0);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (!ph.frequency(Linear_Expression(A - 3), num, den, valn, vald));
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(2*A - 2*B == 1);
+  ph.add_constraint(3*C == 2);
+  ph.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (ph.frequency(Linear_Expression(A - B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 13 && vald == 6);
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(2*A - 2*B == 1);
+  ph.add_constraint(2*C == 1);
+  ph.add_constraint(B <= 2);
+
+  Coefficient num;
+  Coefficient den;
+  Coefficient valn;
+  Coefficient vald;
+  bool ok = (ph.frequency(Linear_Expression(A - B + C + 1),
+                           num, den, valn, vald)
+             && num == 0 && den == 1 && valn == 2 && vald == 1);
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/frombdshape1.cc b/tests/Polyhedron/frombdshape1.cc
new file mode 100644
index 0000000..df03661
--- /dev/null
+++ b/tests/Polyhedron/frombdshape1.cc
@@ -0,0 +1,57 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - B <= 5);
+  cs.insert(A - B >= -10);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  TBD_Shape bd(cs);
+
+  C_Polyhedron ph(bd);
+
+  C_Polyhedron known_result(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/frombox1.cc b/tests/Polyhedron/frombox1.cc
new file mode 100644
index 0000000..0a44c5f
--- /dev/null
+++ b/tests/Polyhedron/frombox1.cc
@@ -0,0 +1,259 @@
+/* Test C_Polyhedron::C_Polyhedron(const Box<Interval>&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x >= 0, x <= 1/2, y >= 0 }
+// from the corresponding box.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x <= 1);
+  box.add_constraint(y >= 0);
+
+  C_Polyhedron ph(box);
+
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x >= 0);
+  known_ph.add_constraint(2*x <= 1);
+  known_ph.add_constraint(y >= 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// The box is the xy plane.
+bool
+test02() {
+  Rational_Box box(2);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// This box is the closed +ve quadrant.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 0);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x >= 0);
+  known_ph.add_constraint(y >= 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A bounded box in 2D.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+
+  Rational_Box box(2);
+  box.add_constraint(3*x >= -2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y >= -10);
+  box.add_constraint(3*y <= 12);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y >= -10);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An unbounded closed box in 4D but bounded in 2D.
+bool
+test05() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  Rational_Box box(4);
+  box.add_constraint(3*x >= -2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y >= -10);
+  box.add_constraint(3*y <= 12);
+  box.add_constraint(3*z >= 15);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y >= -10);
+  known_ph.add_constraint(z >= 5);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A zero-dimensional box.
+bool
+test06() {
+  Rational_Box box(0);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph;
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An empty closed box in 2D.
+bool
+test07() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(2, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x == 2);
+  box.add_constraint(y == 4);
+
+  C_Polyhedron ph(box);
+
+  C_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(x == 2);
+  known_ph.add_constraint(y == 4);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A closed unit square.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(x <= 1);
+  box.add_constraint(y >= 0);
+  box.add_constraint(y <= 1);
+
+  C_Polyhedron ph(box);
+
+  Constraint_System known_cs;
+  known_cs.insert(x >= 0);
+  known_cs.insert(x <= 1);
+  known_cs.insert(y >= 0);
+  known_cs.insert(y <= 1);
+
+  C_Polyhedron known_ph(known_cs);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph generators ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/frombox2.cc b/tests/Polyhedron/frombox2.cc
new file mode 100644
index 0000000..2c2c1d7
--- /dev/null
+++ b/tests/Polyhedron/frombox2.cc
@@ -0,0 +1,112 @@
+/* Test NNC_Polyhedron::NNC_Polyhedron(const Box<Interval>&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// An unbounded box in 4D but bounded in 2D with strict inequalities.
+bool
+test01() {
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  Rational_Box box(4);
+  box.add_constraint(3*x > -2);
+  box.add_constraint(x <= 4);
+  box.add_constraint(y > -10);
+  box.add_constraint(3*y <= 12);
+  box.add_constraint(3*z >= 15);
+
+  NNC_Polyhedron ph(box);
+
+  NNC_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x > -2);
+  known_ph.add_constraint(x <= 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y > -10);
+  known_ph.add_constraint(z >= 5);
+
+  bool ok = (ph == known_ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test02() {
+  Variable x(1);
+  Variable y(2);
+
+  Rational_Box box(4);
+  box.add_constraint(3*x >= -2);
+  box.add_constraint(x < 4);
+  box.add_constraint(y > -10);
+  box.add_constraint(3*y <= 12);
+
+  NNC_Polyhedron ph(box);
+
+  NNC_Polyhedron known_ph(box.space_dimension());
+  known_ph.add_constraint(3*x >= -2);
+  known_ph.add_constraint(x < 4);
+  known_ph.add_constraint(y <= 4);
+  known_ph.add_constraint(y > -10);
+
+  bool ok = (ph == known_ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An empty box in 2D.
+bool
+test03() {
+  Rational_Box box(2);
+  box.set_empty();
+
+  NNC_Polyhedron ph(box);
+
+  NNC_Polyhedron known_ph(2, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8A(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/fromgrid1.cc b/tests/Polyhedron/fromgrid1.cc
new file mode 100644
index 0000000..1c997cc
--- /dev/null
+++ b/tests/Polyhedron/fromgrid1.cc
@@ -0,0 +1,202 @@
+/* Test C_Polyhedron::C_Polyhedron(const Grid&)
+   and NNC_Polyhedron::NNC_Polyhedron(const Grid&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the polyhedron { x + y == 0, y - z == 0 }
+// from a grid with the same equalities but 1 extra congruence.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 0) / 0);
+  gr.add_congruence((y - z %= 0) / 0);
+  gr.add_congruence((z %= 0) / 1);
+
+  C_Polyhedron ph(gr);
+
+
+  C_Polyhedron known_ph(gr.space_dimension());
+  known_ph.add_constraint(x + y == 0);
+  known_ph.add_constraint(y - z == 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test02() {
+  Grid gr(2);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// This grid is unbounded.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 3);
+  gr.add_congruence((y - z %= 2) / 5);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A zero-dimensional grid.
+bool
+test04() {
+  Grid gr(0);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph;
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// An empty closed grid in 2D.
+bool
+test05() {
+  Grid gr(2, EMPTY);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(2, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A single point.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Grid gr(3);
+  gr.add_congruence((x + y %= 1) / 0);
+  gr.add_congruence((y %= 0) / 0);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+  known_ph.add_constraint(x == 1);
+  known_ph.add_constraint(y == 0);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// A zero-dimensional empty grid.
+bool
+test07() {
+  Grid gr(0, EMPTY);
+
+  C_Polyhedron ph(gr);
+
+  C_Polyhedron known_ph(0, EMPTY);
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+// The grid is the xy plane.
+bool
+test08() {
+  Grid gr(2);
+  Constraint_System cs = gr.constraints();
+
+  C_Polyhedron ph(cs);
+
+  C_Polyhedron known_ph(gr.space_dimension());
+
+  bool ok = (ph == known_ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_ph, "*** known_ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/fromoctagonalshape1.cc b/tests/Polyhedron/fromoctagonalshape1.cc
new file mode 100644
index 0000000..10ffbac
--- /dev/null
+++ b/tests/Polyhedron/fromoctagonalshape1.cc
@@ -0,0 +1,56 @@
+/* Test BD_Shape::BD_Shape(const C_Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A + B <= 5);
+  cs.insert(A + B >= -8);
+  cs.insert(A >= 0);
+  cs.insert(B <= 7);
+  cs.insert(A - B <= 10);
+  TOctagonal_Shape os(cs);
+
+  C_Polyhedron ph(os);
+
+  C_Polyhedron known_result(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage1.cc b/tests/Polyhedron/generalizedaffineimage1.cc
new file mode 100644
index 0000000..90db9cd
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage1.cc
@@ -0,0 +1,269 @@
+/* Test Polyhedron::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(2*B));
+  known_result.add_generator(point(4*A + 6*B));
+  known_result.add_generator(ray(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2)"
+                   " ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2, -2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(-B));
+  known_result.add_generator(point(4*A - 3*B));
+  known_result.add_generator(ray(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+                   " A+2, -2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 3);
+  ph.add_constraint(7*A >= 2);
+  ph.add_constraint(3*B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(B, LESS_OR_EQUAL, A-B+2, -3);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(9*A - B, 6));
+  known_result.add_generator(point(2*A - 4*B, 7));
+  known_result.add_generator(ray(-B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, LESS_OR_EQUAL,"
+                   " A-B+2, -3) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.generalized_affine_image(A, EQUAL, A + 2);
+
+  known_result.affine_image(A, A + 2);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph,
+                   "*** after ph.generalized_affine_image"
+                   "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(point(3*A + B));
+  ph.add_generator(point(A + 3*B));
+  ph.add_generator(point(3*A + 3*B));
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A + B >= 1);
+
+  ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, 2*A - B + 2);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph,
+                   "*** after ph.generalized_affine_image"
+                   "(A + B, GREATER_OR_EQUAL, 2*A - B + 2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.generalized_affine_image(A, LESS_OR_EQUAL, B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.generalized_affine_image"
+                    "(A, LESS_OR_EQUAL, B + 1) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.generalized_affine_image(A + B, GREATER_OR_EQUAL, A + B + 1);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.generalized_affine_image"
+                    "(A + B, GREATER_OR_EQUAL, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= -2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A, GREATER_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(1, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(A, GREATER_OR_EQUAL, A+2)"
+                   " ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  C_Polyhedron ph(1);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= -2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A+1, GREATER_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(1, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image"
+                   "(A+1, GREATER_OR_EQUAL, A+2)"
+                   " ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage2.cc b/tests/Polyhedron/generalizedaffineimage2.cc
new file mode 100644
index 0000000..c31a2a6
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage2.cc
@@ -0,0 +1,560 @@
+/* Test Polyhedron::generalized_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(closure_point(2*A));
+  ph.add_generator(closure_point(2*A + 2*B));
+  ph.add_generator(closure_point(3*A + B));
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(B, LESS_THAN, B+2);
+
+  NNC_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(A));
+  known_result.add_generator(closure_point(A + 3*B));
+  known_result.add_generator(closure_point(2*A + 4*B));
+  known_result.add_generator(closure_point(3*A + 3*B));
+  known_result.add_generator(ray(-B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, LESS_THAN, B+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2);
+  ph2.generalized_affine_image(-2*B, LESS_OR_EQUAL, -2*(A+2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+                   " A+2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, GREATER_OR_EQUAL, A+2, -2);
+  ph2.generalized_affine_image(-2*B, LESS_OR_EQUAL, A+2);
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, GREATER_OR_EQUAL,"
+                   " A+2, -2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 3);
+  ph.add_constraint(7*A >= 2);
+  ph.add_constraint(3*B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_generators(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, LESS_OR_EQUAL, A-B+2, -3);
+  ph2.generalized_affine_image(-3*B, GREATER_OR_EQUAL, A-B+2);
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, LESS_OR_EQUAL,"
+                   " A-B+2, -3) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(closure_point(2*A));
+  ph.add_generator(closure_point(2*A + 2*B));
+  ph.add_generator(closure_point(3*A + B));
+
+  print_constraints(ph, "*** ph ***");
+
+  NNC_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(B, LESS_THAN, B+2);
+  ph2.generalized_affine_image(-2*B, GREATER_THAN, -2*(B+2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_image(B, LESS_THAN, B+2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(A, EQUAL, A + 2);
+  ph2.generalized_affine_image(-2*A, EQUAL, -2*(A + 2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph,
+                   "*** after ph.generalized_affine_image"
+                   "(A, EQUAL, A + 2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(point(3*A + B));
+  ph.add_generator(point(A + 3*B));
+  ph.add_generator(point(3*A + 3*B));
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron ph2 = ph;
+
+  ph.generalized_affine_image(A + B, GREATER_OR_EQUAL, 2*A - B + 2);
+  ph2.generalized_affine_image(-3*(A + B),
+                               LESS_OR_EQUAL,
+                               -3*(2*A - B + 2));
+
+  bool ok = (ph == ph2);
+
+  print_generators(ph,
+                   "*** after ph.generalized_affine_image"
+                   "(A + B, GREATER_OR_EQUAL, 2*A - B + 2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A == 1);
+  ph.add_constraint(B > 1);
+  ph.add_constraint(B < 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(B, GREATER_THAN, A + B + 1);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B > 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(B, GREATER_THAN, A + B + 1) ***");
+  print_generators(ph, "*** after ph.generalized_affine_image"
+                   "(B, GREATER_THAN, A + B + 1) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A >= 1);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), EQUAL, A + B);
+
+  known_result.add_constraint(A + B == 2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(Linear_Expression(2), EQUAL, A + B) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 1);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2),
+                              GREATER_OR_EQUAL,
+                              A + B);
+
+  known_result.add_constraint(2 >= A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(Linear_Expression(2), GREATER_OR_EQUAL, A + B)"
+                    "***");
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(A - B >= 1);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), LESS_OR_EQUAL, A + B);
+
+  known_result.add_constraint(2 <= A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(Linear_Expression(2), LESS_OR_EQUAL, A + B) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(B > 0);
+  ph.add_constraint(A - B > 1);
+
+  NNC_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), GREATER_THAN, A + B);
+
+  known_result.add_constraint(2 > A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(Linear_Expression(2), GREATER_THAN, A + B) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(B > 0);
+  ph.add_constraint(A >= 1);
+
+  NNC_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(Linear_Expression(2), LESS_THAN, A + B);
+
+  known_result.add_constraint(2 < A + B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(Linear_Expression(2), LESS_THAN, A + B) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A + 3*B == 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - C, EQUAL, B + 3);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A - C == B + 3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.generalized_affine_image"
+                    "(A - C, EQUAL, B + 3) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - C, EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A - 2*B >= 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - C, GREATER_OR_EQUAL, B + 3);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A - B - C >= 3);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - C, GREATER_OR_EQUAL, B + 3) ***");
+  print_generators(ph, "*** after ph.generalized_affine_image"
+                    "(A - C, GREATER_OR_EQUAL, B + 3) ***");
+
+  return ok;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(C == 0);
+  ph.add_constraint(A >= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - C, LESS_OR_EQUAL, B - 1);
+
+  C_Polyhedron known_result(ph);
+  known_result.add_constraint(A - B - C <= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - C, LESS_OR_EQUAL, B - 1) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - C, LESS_OR_EQUAL, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test17() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph(3);
+  ph.add_constraint(A - C == 0);
+  ph.add_constraint(A >= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - 2*C, LESS_THAN, B - 1);
+
+  NNC_Polyhedron known_result(ph);
+  known_result.add_constraint(A - B - 2*C < 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - 2*C, LESS_THAN, B - 1) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - 2*C, LESS_THAN, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph(3);
+  ph.add_constraint(A - 2*C == 0);
+  ph.add_constraint(A > B - 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A - 2*C + 3, GREATER_THAN, B - 1);
+
+  NNC_Polyhedron known_result(ph);
+  known_result.add_constraint(A - B - 2*C + 4 > 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A - 2*C + 3, GREATER_THAN, B - 1) ***");
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 2);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_image(A + B, LESS_THAN, 2*A - 3*B);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A + B < 4);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.generalized_affine_image"
+                    "(A + B, LESS_THAN, 2*A - 3*B) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffinepreimage1.cc b/tests/Polyhedron/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..527a2bb
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage1.cc
@@ -0,0 +1,124 @@
+/* Test Polyhedron::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2);
+
+  C_Polyhedron known_result(2, UNIVERSE);
+  known_result.add_constraint(0 <= A);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_preimage"
+                   "(B, GREATER_OR_EQUAL, A+2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 4);
+  ph.add_constraint(B <= 5);
+  ph.add_constraint(A <= B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.generalized_affine_preimage(B, GREATER_OR_EQUAL, A+2, -2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(4*A));
+  known_result.add_generator(line(B));
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_preimage"
+                   "(B, GREATER_OR_EQUAL, A+2, -2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*A <= 3);
+  ph.add_constraint(7*A >= 2);
+  ph.add_constraint(3*B >= 1);
+  ph.add_constraint(2*A >= B);
+
+  print_generators(ph, "*** ph ***");
+
+  // A longer way of computing the generalized affine preimage below.
+  C_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  Variable C(2);
+  known_result.add_constraint(-3*B >= A-C+2);
+  Variables_Set vset;
+  vset.insert(B);
+  known_result.remove_space_dimensions(vset);
+
+  ph.generalized_affine_preimage(B, LESS_OR_EQUAL, A-B+2, -3);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_preimage"
+                   "(B, LESS_OR_EQUAL, A-B+2, -3) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST_F8(test03);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffinepreimage2.cc b/tests/Polyhedron/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..c4a12c9
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage2.cc
@@ -0,0 +1,64 @@
+/* Test Polyhedron::generalized_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A + B));
+  ph.add_generator(closure_point(2*A));
+  ph.add_generator(closure_point(2*A + 2*B));
+  ph.add_generator(closure_point(3*A + B));
+
+  print_constraints(ph, "*** ph ***");
+
+  // A longer way of computing the generalized affine preimage below.
+  NNC_Polyhedron known_result(ph);
+  known_result.add_space_dimensions_and_embed(1);
+  Variable C(2);
+  known_result.add_constraint(B < C+2);
+  Variables_Set vset;
+  vset.insert(B);
+  known_result.remove_space_dimensions(vset);
+
+  ph.generalized_affine_preimage(B, LESS_THAN, B+2);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph after "
+                   "ph.generalized_affine_preimage(B, LESS_THAN, B+2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/generators1.cc b/tests/Polyhedron/generators1.cc
new file mode 100644
index 0000000..b03ac65
--- /dev/null
+++ b/tests/Polyhedron/generators1.cc
@@ -0,0 +1,235 @@
+/* Test the construction of a polyhedron using generators.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point(x + y, -1));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  Constraint_System cs = ph.constraints();
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x == -1);
+  known_result.add_constraint(y == -1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph constraints ***");
+  print_generators(ph, "*** ph generators ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 2);
+  cs.insert(x + y <= 1);
+
+  C_Polyhedron known_result(cs);
+
+  const Generator_System& gs = known_result.generators();
+
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron ph(gs);
+
+  bool ok = (gs.space_dimension() == known_result.space_dimension()
+             && gs.begin() == gs.end()
+             && ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  C_Polyhedron ph2(0);
+
+  C_Polyhedron ph3(2);
+  ph3.add_constraint(A >= 1);
+  ph3.add_constraint(A <= -1);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_generators(ph3, "*** ph3 ***");
+
+  Generator_System gs1 = ph1.generators();
+  Generator_System gs2 = ph2.generators();
+  Generator_System gs3 = ph3.generators();
+
+  Generator_System known_result2;
+  known_result2.insert(point());
+
+  bool ok = (gs1.begin() == gs1.end()
+             && C_Polyhedron(gs2) == C_Polyhedron(known_result2)
+             && gs3.begin() == gs3.end());
+
+  print_generators(gs1, "*** gs1 ***");
+  print_generators(gs2, "*** gs2 ***");
+  print_generators(gs3, "*** gs3 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  const Generator_System gs;
+
+  C_Polyhedron ph(gs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Generator_System gs1;
+  gs1.insert(point());
+
+  C_Polyhedron ph1(gs1);
+  C_Polyhedron known_result(ph1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  const Generator_System gs2 = ph1.generators();
+
+  C_Polyhedron ph2(gs2);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron known_result(ph1);
+
+  Generator_System gs = ph1.generators();
+  C_Polyhedron ph2(gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_generators(gs, "*** gs ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(ray(A));
+  ph1.add_generator(ray(B));
+
+  C_Polyhedron known_result(ph1);
+
+  Generator_System gs = ph1.generators();
+  C_Polyhedron ph2(gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  print_generators(gs, "*** gs ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point());
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(B));
+
+  print_generators(ph, "*** ph ***");
+
+  Generator_System gs = ph.generators();
+  gs.insert(point(A));
+  gs.insert(point(B));
+
+  print_generators(gs, "*** gs ***");
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  return C_Polyhedron(gs) == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/geomcovers1.cc b/tests/Polyhedron/geomcovers1.cc
new file mode 100644
index 0000000..3d55be0
--- /dev/null
+++ b/tests/Polyhedron/geomcovers1.cc
@@ -0,0 +1,61 @@
+/* Test Pointset_Powerset<PH>::geometrically_covers().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  Constraint_System cs1, cs2, cs3, cs4;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 4);
+  cs2.insert(x >= 4);
+  cs2.insert(x <= 6);
+  cs3.insert(x >= 1);
+  cs3.insert(x <= 5);
+  C_Polyhedron ph1(cs1), ph2(cs2), ph3(cs3);
+
+  Pointset_Powerset<C_Polyhedron> ps12(1, EMPTY);
+  ps12.add_disjunct(ph1);
+  ps12.add_disjunct(ph2);
+
+  Pointset_Powerset<C_Polyhedron> ps3(1, EMPTY);
+  ps3.add_disjunct(ph3);
+
+  bool ok = ps12.geometrically_covers(ps3);
+
+  using namespace IO_Operators;
+  nout << "ps12 = " << ps12 << endl
+       << " ps3 = " << ps3 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/h79widening1.cc b/tests/Polyhedron/h79widening1.cc
new file mode 100644
index 0000000..900d63e
--- /dev/null
+++ b/tests/Polyhedron/h79widening1.cc
@@ -0,0 +1,246 @@
+/* Test Polyhedron::H79_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x <= 2);
+  ph1.add_constraint(y <= 2);
+
+  C_Polyhedron ph2(2);
+  // Add inconsistent constraints to ph2.
+  ph2.add_constraint(x+y <= 0);
+  ph2.add_constraint(x+y >= 2);
+
+  C_Polyhedron ph1_1(ph1);
+  print_constraints(ph1_1, "*** ph1_1 ***");
+  C_Polyhedron ph2_1(ph2);
+  print_constraints(ph2_1, "*** ph2_1 ***");
+  ph1_1.H79_widening_assign(ph2_1);
+  print_generators(ph1_1, "*** after H79_widening_assign ***");
+  C_Polyhedron ph1_2(ph1);
+  bool ok = (ph1_1 == ph1_2);
+
+  C_Polyhedron ph2_2(ph2);
+  print_constraints(ph2_2, "*** ph2_2 ***");
+  C_Polyhedron ph2_3(ph2);
+  print_constraints(ph2_3, "*** ph2_3 ***");
+  ph2_2.H79_widening_assign(ph2_3);
+  print_generators(ph2_2, "*** after H79_widening_assign ***");
+  C_Polyhedron ph2_4(ph2);
+  ok = ok && (ph2_2 == ph2_4);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 2);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A-B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after H79_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(ray(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(A));
+  gs2.insert(ray(A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph2.H79_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after ph2.H79_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  C_Polyhedron known_result;
+  known_result = ph1;
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.H79_widening_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(-A - 2*B >= -6);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A - 2*B >= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(-A - 2*B >= -10);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A - 2*B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph2.H79_widening_assign(ph1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - 2*B >= 2);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** after ph2.H79_widening_assign(ph1) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(-A + B >= 2);
+  ph1.add_constraint(A >= 0);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(-A + B >= 3);
+  ph2.add_constraint(A - B >= -8);
+  ph2.add_constraint(A >= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  bool ok = ph1.is_universe();
+
+  print_constraints(ph1, "*** after H79_widening_assign ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  // The addition of the following generator shows a bug
+  // that was affecting PPL version 0.6.1 (now corrected).
+  ph1.add_generator(line(A));
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A >= 0);
+  ph2.add_constraint(B >= 0);
+
+  // Avoid computing the constraints of ph1.
+  C_Polyhedron ph1_copy = ph1;
+  print_constraints(ph1_copy, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.H79_widening_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after H79_widening_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/h79widening2.cc b/tests/Polyhedron/h79widening2.cc
new file mode 100644
index 0000000..3e667fc
--- /dev/null
+++ b/tests/Polyhedron/h79widening2.cc
@@ -0,0 +1,64 @@
+/* Test Polyhedron::H79_widening_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// This is the example of Figure 3 in [BagnaraRZH02TR].
+bool
+test01() {
+  Variable A(0);
+
+  NNC_Polyhedron ph1(1);
+  ph1.add_constraint(A > 0);
+  ph1.add_constraint(A < 2);
+
+  NNC_Polyhedron ph4(1);
+  ph4.add_constraint(4*A >= 1);
+  ph4.add_constraint(4*A <= 3);
+
+  NNC_Polyhedron ph = ph4;
+  ph.intersection_assign(ph1);
+  // At this point, ph and ph4 are two different representations
+  // of the same NNC polyhedron.
+
+  print_constraints(ph4, "*** ph4 ***");
+  print_constraints(ph, "*** ph ***");
+
+  NNC_Polyhedron known_result(ph4);
+
+  ph.H79_widening_assign(ph4);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after H79_widening_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/hybrid.cc b/tests/Polyhedron/hybrid.cc
new file mode 100644
index 0000000..33e0cac
--- /dev/null
+++ b/tests/Polyhedron/hybrid.cc
@@ -0,0 +1,865 @@
+/* Test three examples for linear hybrid systems.  These are based on
+   the examples in HalbwachsPR94 and HalbwachsPR97 papers.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// The water monitor example.
+// Note that we have had to add a closure operator as an action
+// for each of the transitions. Without this, the results are empty.
+bool
+test01() {
+  Variable w(0);
+  Variable x(1);
+  NNC_Polyhedron ph0(2, EMPTY);
+  NNC_Polyhedron ph0_prev(2, EMPTY);
+  NNC_Polyhedron ph1(2, EMPTY);
+  NNC_Polyhedron ph2(2, EMPTY);
+  NNC_Polyhedron ph3(2, EMPTY);
+
+  NNC_Polyhedron ph0_init(2);
+  ph0_init.add_constraint(w == 1);
+
+  NNC_Polyhedron ph_tea01(2);
+  ph_tea01.add_constraint(w == 1);
+  ph_tea01.add_constraint(x == 1);
+
+  NNC_Polyhedron ph_tea23(2);
+  ph_tea23.add_constraint(w == -2);
+  ph_tea23.add_constraint(x == 1);
+
+  NNC_Polyhedron ph_tmp(2);
+
+  while (true) {
+    ph0_prev = ph0;
+
+    // ph0
+    ph0 = ph0_init;
+    ph_tmp = ph3;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l3 to l0.
+    ph_tmp.topological_closure_assign();
+    // Add constraint for the transition from l3 to l0.
+    ph_tmp.add_constraint(x == 2);
+    // Add invariant constraint for l0.
+    ph_tmp.add_constraint(w < 10);
+    // Join with the Init(l0).
+    ph0.upper_bound_assign(ph_tmp);
+    // Time elaspe for l0.
+    ph0.time_elapse_assign(ph_tea01);
+    // Add invariant constraint for l0.
+    ph0.add_constraint(w < 10);
+
+    ph0.H79_widening_assign(ph0_prev);
+
+    if (ph0 == ph0_prev) {
+
+      NNC_Polyhedron known_result0(2);
+      known_result0.add_constraint(1 <= w);
+      known_result0.add_constraint(w < 10);
+      bool ok = (ph0 == known_result0);
+
+      print_constraints(ph0, "*** ph0 final ***");
+
+      NNC_Polyhedron known_result1(2);
+      known_result1.add_constraint(w - x == 10);
+      known_result1.add_constraint(x >= 0);
+      known_result1.add_constraint(x < 2);
+      ok = ok && (ph1 == known_result1);
+
+      print_constraints(ph1, "*** ph1 final ***");
+
+      NNC_Polyhedron known_result2(2);
+      known_result2.add_constraint(w + 2*x == 16);
+      known_result2.add_constraint(x >= 2);
+      known_result2.add_constraint(w > 5);
+      ok = ok && (ph2 == known_result2);
+
+      print_constraints(ph2, "*** ph2 final ***");
+
+      NNC_Polyhedron known_result3(2);
+      known_result3.add_constraint(w + 2*x == 5);
+      known_result3.add_constraint(w <= 5);
+      known_result3.add_constraint(w > 1);
+      ok = ok && (ph3 == known_result3);
+
+      print_constraints(ph3, "*** ph3 final ***");
+
+      return ok;
+    }
+
+    print_constraints(ph0, "*** ph0 ***");
+    // ph1
+    // The only incoming transition is from l0.
+    ph1 = ph0;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l0 to l1.
+    ph1.topological_closure_assign();
+    // Add constraint for the transition from l0 to l1.
+    ph1.add_constraint(w == 10);
+    // Do the action for the transition from l0 to l1.
+    ph1.affine_image(x, 0*x);
+    // Add invariant constraint for l1.
+    ph1.add_constraint(x < 2);
+    // Time elapse for l1.
+    ph1.time_elapse_assign(ph_tea01);
+    // Add invariant constraint for l1.
+    print_constraints(ph1, "*** ph1 before time elapse ***");
+    // Add invariant constraint for l1.
+    ph1.add_constraint(x < 2);
+
+    // The only incoming transition is from l1.
+    ph2 = ph1;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l1 to l2.
+    ph2.topological_closure_assign();
+    // Add constraint for the transition from l1 to l2.
+    ph2.add_constraint(x == 2);
+    // There is no action for the transition from l1 to l2.
+    // add invariant constraint for l2.
+    ph2.add_constraint(w > 5);
+    // Time elaspe for l2.
+    ph2.time_elapse_assign(ph_tea23);
+    // Add invariant constraint for l2.
+    ph2.add_constraint(w > 5);
+
+    // The only incoming transition is from l2.
+    ph3 = ph2;
+    // We must close the constraints since the values of x and w
+    // increase continuously in the transition from l2 to l3.
+    ph3.topological_closure_assign();
+    // Add constraint for the transition from l2 to l3.
+    ph3.add_constraint(w == 5);
+    // Do the action for the transition from l2 to l3.
+    ph3.affine_image(x, 0*x);
+    // Add invariant constraint for l3.
+    ph3.add_constraint(x < 2);
+    // Time elaspe for l3.
+    ph3.time_elapse_assign(ph_tea23);
+    // Add invariant constraint for l3.
+    ph3.add_constraint(x < 2);
+  }
+  return false;
+}
+
+// The Fischer protocol example where we make the exclusion variable
+// one of the variables of the automaton.
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable a(2);
+  Variable b(3);
+  Variable k(4);
+
+  NNC_Polyhedron ph0(5, EMPTY);
+  NNC_Polyhedron ph1(5, EMPTY);
+  NNC_Polyhedron ph2(5, EMPTY);
+  NNC_Polyhedron ph3(5, EMPTY);
+  NNC_Polyhedron ph4(5, EMPTY);
+  NNC_Polyhedron ph5(5, EMPTY);
+
+  NNC_Polyhedron ph0_Init(5);
+  ph0_Init.add_constraint(a >= 0);
+  ph0_Init.add_constraint(b >= 0);
+  ph0_Init.add_constraint(k >= 0);
+  ph0_Init.add_constraint(k <= 2);
+
+  NNC_Polyhedron ph0_prev(5, EMPTY);
+
+  // The derivative polyhedron is the same at all locations.
+  NNC_Polyhedron ph_tea(5);
+  ph_tea.add_constraint(a == 0);
+  ph_tea.add_constraint(b == 0);
+  ph_tea.add_constraint(x1 == 1);
+  ph_tea.add_constraint(10*x2 >= 9);
+  ph_tea.add_constraint(10*x2 <= 11);
+
+  NNC_Polyhedron ph_tmp(5);
+
+  while (true) {
+    //    nout << "next iteration" << "\n";
+
+    // Location l0.
+    ph0 = ph0_Init;
+    ph_tmp = ph3;
+    ph_tmp.add_constraint(x1 >= b);
+    ph_tmp.add_constraint(k >= 0);
+    ph_tmp.add_constraint(k <= 2);
+    ph0.upper_bound_assign(ph_tmp);
+    ph_tmp = ph4;
+    ph_tmp.affine_image(k, Linear_Expression(0));
+    ph_tmp.add_constraint(k >= 0);
+    ph_tmp.add_constraint(k <= 2);
+    ph0.upper_bound_assign(ph_tmp);
+    ph_tmp = ph5;
+    ph_tmp.add_constraint(k >= 0);
+    ph_tmp.add_constraint(k <= 2);
+    ph0.upper_bound_assign(ph_tmp);
+    ph0.time_elapse_assign(ph_tea);
+    ph0.add_constraint(k >= 0);
+    ph0.add_constraint(k <= 2);
+
+    // Location l1.
+    ph1 = ph0;
+    ph1.add_constraint(k == 0);
+    ph1.affine_image(x1, Linear_Expression(0));
+    ph1.add_constraint(x1 <= a);
+    ph1.add_constraint(k == 0);
+    ph1.time_elapse_assign(ph_tea);
+    ph1.add_constraint(k == 0);
+    ph1.add_constraint(x1 <= a);
+
+    // Location l2.
+    ph2 = ph1;
+    ph2.affine_image(x1, Linear_Expression(0));
+    ph2.affine_image(x2, Linear_Expression(0));
+    ph2.affine_image(k, Linear_Expression(1));
+    ph2.add_constraint(k == 1);
+    ph2.time_elapse_assign(ph_tea);
+    ph2.add_constraint(k == 1);
+
+    // Location l3.
+    ph3 = ph2;
+    ph3.add_constraint(x2 <= a);
+    ph3.add_constraint(x1 < b);
+    ph3.affine_image(k, Linear_Expression(2));
+    ph3.add_constraint(k == 2);
+    ph3.time_elapse_assign(ph_tea);
+    ph3.add_constraint(k == 2);
+
+    // Location l4.
+    ph4 = ph2;
+    ph4.add_constraint(x1 >= b);
+    ph4.add_constraint(k == 1);
+    ph4.time_elapse_assign(ph_tea);
+    ph4.add_constraint(k == 1);
+
+    // Location l5.
+    ph5 = ph4;
+    ph5.add_constraint(x2 <= a);
+    ph5.affine_image(k, Linear_Expression(2));
+    ph5.add_constraint(k == 2);
+    ph5.time_elapse_assign(ph_tea);
+    ph5.add_constraint(k == 2);
+
+    // When we have a fixpoint, check and print results.
+    if (ph0 == ph0_prev) {
+
+      NNC_Polyhedron known_result0(5);
+      known_result0.add_constraint(a >= 0);
+      known_result0.add_constraint(b >= 0);
+      known_result0.add_constraint(k >= 0);
+      known_result0.add_constraint(k <= 2);
+      bool ok = (ph0 == known_result0);
+
+      print_constraints(ph0, "*** ph0 final ***");
+
+      NNC_Polyhedron known_result1(5);
+      known_result1.add_constraint(a >= 0);
+      known_result1.add_constraint(b >= 0);
+      known_result1.add_constraint(x1 >= 0);
+      known_result1.add_constraint(x1 <= a);
+      known_result1.add_constraint(k == 0);
+      ok = ok && (ph1 == known_result1);
+
+      print_constraints(ph1, "*** ph1 final ***");
+
+      NNC_Polyhedron known_result2(5);
+      known_result2.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result2.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result2.add_constraint(a >= 0);
+      known_result2.add_constraint(b >= 0);
+      known_result2.add_constraint(k == 1);
+      ok = ok && (ph2 == known_result2);
+
+      print_constraints(ph2, "*** ph2 final ***");
+
+      NNC_Polyhedron known_result3(5);
+      known_result3.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result3.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result3.add_constraint(a >= 0);
+      known_result3.add_constraint(b > 0);
+      known_result3.add_constraint(k == 2);
+      ok = ok && (ph3 == known_result3);
+
+      print_constraints(ph3, "*** ph3 final ***");
+
+      NNC_Polyhedron known_result4(5);
+      known_result4.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result4.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result4.add_constraint(a >= 0);
+      known_result4.add_constraint(b >= 0);
+      known_result4.add_constraint(x1 >= b);
+      known_result4.add_constraint(k == 1);
+      ok = ok && (ph4 == known_result4);
+
+      print_constraints(ph4, "*** ph4 final ***");
+
+      NNC_Polyhedron known_result5(5);
+      known_result5.add_constraint(9*b - 10*a <= 0);
+      known_result5.add_constraint(11*x1 - 10*x2 >= 0);
+      known_result5.add_constraint(11*x1 - 10*x2 + 10*a - 11*b >= 0);
+      known_result5.add_constraint(9*x1 - 10*x2 <= 0);
+      known_result5.add_constraint(b >= 0);
+      known_result5.add_constraint(x1 >= b);
+      known_result5.add_constraint(k == 2);
+      ok = ok && (ph5 == known_result5);
+
+      print_constraints(ph5, "*** ph5 final ***");
+
+      return ok;
+    }
+
+    ph0.upper_bound_assign(ph0_prev);
+    (void) ph0.is_empty();
+    // ph0.H79_widening_assign(ph0_prev);
+
+    ph0_prev = ph0;
+  }
+  return true;
+}
+
+// The Scheduler example using the Polyhedron domain.
+bool
+test03() {
+  Variable c1(0);
+  Variable c2(1);
+  Variable x1(2);
+  Variable x2(3);
+  Variable k1(4);
+  Variable k2(5);
+
+  NNC_Polyhedron ph_idle_Init(6);
+  ph_idle_Init.add_constraint(c1 >= 0);
+  ph_idle_Init.add_constraint(c2 >= 0);
+  ph_idle_Init.add_constraint(x1 == 0);
+  ph_idle_Init.add_constraint(x2 == 0);
+  ph_idle_Init.add_constraint(k1 == 0);
+  ph_idle_Init.add_constraint(k2 == 0);
+
+  NNC_Polyhedron ph_idle(6, EMPTY);
+  NNC_Polyhedron ph_t1(6, EMPTY);
+  NNC_Polyhedron ph_t2(6, EMPTY);
+
+  NNC_Polyhedron ph_idle_prev(6, EMPTY);
+  NNC_Polyhedron ph_t1_prev(6, EMPTY);
+  NNC_Polyhedron ph_t2_prev(6, EMPTY);
+
+  // The time elapse polyhedron at location Task1.
+  NNC_Polyhedron ph_tea1(6);
+  ph_tea1.add_constraint(c1 == 1);
+  ph_tea1.add_constraint(c2 == 1);
+  ph_tea1.add_constraint(x1 == 1);
+  ph_tea1.add_constraint(x2 == 0);
+  ph_tea1.add_constraint(k1 == 0);
+  ph_tea1.add_constraint(k2 == 0);
+
+  // The time elapse polyhedron at location Task2.
+  NNC_Polyhedron ph_tea2(6);
+  ph_tea2.add_constraint(c1 == 1);
+  ph_tea2.add_constraint(c2 == 1);
+  ph_tea2.add_constraint(x1 == 0);
+  ph_tea2.add_constraint(x2 == 1);
+  ph_tea2.add_constraint(k1 == 0);
+  ph_tea2.add_constraint(k2 == 0);
+
+  NNC_Polyhedron ph_tmp(6);
+
+  while (true) {
+
+    // Location Idle.
+    ph_idle.upper_bound_assign(ph_idle_Init);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 <= 1);
+    ph_tmp.affine_image(k1, k1 - 1);
+    ph_tmp.affine_image(x1, Linear_Expression(0));
+    ph_idle.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 == 0);
+    ph_tmp.affine_image(k2, k2 - 1);
+    ph_tmp.affine_image(x2, Linear_Expression(0));
+    ph_idle.upper_bound_assign(ph_tmp);
+
+    // Location Task1.
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c1 >= 10);
+    ph_tmp.affine_image(c1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, Linear_Expression(1));
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c1 >= 10);
+    ph_tmp.affine_image(c1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, k1 + 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 >= 2);
+    ph_tmp.affine_image(x1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, k1 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x1 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 >= 1);
+    ph_tmp.affine_image(x2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, k2 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_t1.time_elapse_assign(ph_tea1);
+    ph_t1.add_constraint(x1 <= 4);
+
+    // Location Task2.
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c2 >= 20);
+    ph_tmp.affine_image(c2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c2 >= 20);
+    ph_tmp.affine_image(c2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, k2 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c1 >= 10);
+    ph_tmp.affine_image(c1, Linear_Expression(0));
+    ph_tmp.affine_image(k1, k1 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 >= 2);
+    ph_tmp.affine_image(x2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, k2 - 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c2 >= 20);
+    ph_tmp.affine_image(c2, Linear_Expression(0));
+    ph_tmp.affine_image(k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_t2.time_elapse_assign(ph_tea2);
+    ph_t2.add_constraint(x2 <= 8);
+
+    ph_t2.H79_widening_assign(ph_t2_prev);
+
+    if (ph_idle == ph_idle_prev
+        && ph_t1 == ph_t1_prev
+        && ph_t2 == ph_t2_prev) {
+
+      NNC_Polyhedron known_result_idle(6);
+      known_result_idle.add_constraint(c2 >= 0);
+      known_result_idle.add_constraint(x1 == 0);
+      known_result_idle.add_constraint(x2 == 0);
+      known_result_idle.add_constraint(k1 == 0);
+      known_result_idle.add_constraint(k2 == 0);
+      bool ok = (ph_idle == known_result_idle);
+
+      print_constraints(ph_idle, "*** ph_idle final ***");
+
+      NNC_Polyhedron known_result_t1(6);
+      known_result_t1.add_constraint(c1 <= c2);
+      known_result_t1.add_constraint(c1 >= 0);
+      known_result_t1.add_constraint(c1 <= 4);
+      known_result_t1.add_constraint(x1 == c1);
+      known_result_t1.add_constraint(x2 == 0);
+      known_result_t1.add_constraint(k1 == 1);
+      known_result_t1.add_constraint(k2 == 0);
+      ok = ok &&  (ph_t1 == known_result_t1);
+
+      print_constraints(ph_t1, "*** ph_t1 final ***");
+
+      NNC_Polyhedron known_result_t2(6);
+      known_result_t2.add_constraint(c2 >= 0);
+      known_result_t2.add_constraint(x1 >= 0);
+      known_result_t2.add_constraint(x1 <= 4*k1);
+      known_result_t2.add_constraint(c2 <= 8);
+      known_result_t2.add_constraint(x2 == c2);
+      known_result_t2.add_constraint(k2 == 1);
+      ok = ok &&  (ph_t2 == known_result_t2);
+
+      print_constraints(ph_t2, "*** ph_t2 final ***");
+
+      return ok;
+    }
+
+    ph_idle_prev = ph_idle;
+    ph_t1_prev = ph_t1;
+    ph_t2_prev = ph_t2;
+  }
+  return false;
+}
+
+// Additional procedures needed for the Scheduler example using powersets.
+
+// Compute the time_elapse() for each element of the powerset.
+void
+time_elapse(Pointset_Powerset<NNC_Polyhedron>& ps,
+            const NNC_Polyhedron& ph) {
+  Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+  for (Pointset_Powerset<NNC_Polyhedron>::const_iterator i = ps.begin(),
+         ps_end = ps.end(); i != ps_end; ++i) {
+    NNC_Polyhedron di = i->pointset();
+    NNC_Polyhedron d(di);
+    d.time_elapse_assign(ph);
+    ps_result.add_disjunct(d);
+  }
+  ps = ps_result;
+}
+
+// Compute the affine_image() for each element of the powerset.
+void
+affine_image(Pointset_Powerset<NNC_Polyhedron>& ps, Variable var,
+             const Linear_Expression& expr,
+             Coefficient_traits::const_reference denominator
+             = Coefficient_one()) {
+  Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+  for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps.begin(),
+         ps_end = ps.end(); i != ps_end; ++i) {
+    NNC_Polyhedron phi = i->pointset();
+    NNC_Polyhedron ph(phi);
+    ph.affine_image(var, expr, denominator);
+    ps_result.add_disjunct(ph);
+  }
+  ps = ps_result;
+}
+
+// Compute the upper_bound of the powerset.
+void
+powerset_upper_bound(Pointset_Powerset<NNC_Polyhedron>& ps,
+                     NNC_Polyhedron& ph) {
+  Pointset_Powerset<NNC_Polyhedron> ps_result(ps.space_dimension(), EMPTY);
+  for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps.begin(),
+                                   ps_end = ps.end(); i != ps_end; ++i) {
+    NNC_Polyhedron phi = i->pointset();
+    ph.upper_bound_assign(phi);
+    (void) ph.is_empty();
+  }
+}
+
+// This has been added to replace the expensive geometrically_covers()
+// test at each cycle of the iteration and intended to speed up the
+// computation.
+//
+// Check if every disjunct of the 2nd powerset is contained in an
+// disjunct of the first powerset.
+// If this succeeds then geometrically covers() will also hold.
+bool
+disjunct_covers(Pointset_Powerset<NNC_Polyhedron>& ps1,
+                Pointset_Powerset<NNC_Polyhedron>& ps2) {
+  for (Pointset_Powerset<NNC_Polyhedron>::iterator i = ps2.begin(),
+         ps2_end = ps2.end(); i != ps2_end; ++i) {
+    bool is_contained = false;
+    NNC_Polyhedron ph2 = i->pointset();
+    for (Pointset_Powerset<NNC_Polyhedron>::iterator j = ps1.begin(),
+           ps1_end = ps1.end(); j != ps1_end; ++j) {
+      NNC_Polyhedron ph1 = j->pointset();
+      if (ph1.contains(ph2)) {
+        is_contained = true;
+        break;
+      }
+    }
+    if (!is_contained)
+      return false;
+  }
+  return true;
+}
+
+// The Scheduler example using powersets.
+bool
+test04() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable k1(2);
+  Variable k2(3);
+  Variable c1(4);
+  Variable c2(5);
+
+  Pointset_Powerset<NNC_Polyhedron> ph_idle(6);
+  ph_idle.add_constraint(c1 >= 0);
+  ph_idle.add_constraint(c2 >= 0);
+  ph_idle.add_constraint(x1 == 0);
+  ph_idle.add_constraint(x2 == 0);
+  ph_idle.add_constraint(k1 == 0);
+  ph_idle.add_constraint(k2 == 0);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t1 = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t2 = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_idle_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t1_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron>
+    ph_t2_prev = Pointset_Powerset<NNC_Polyhedron>(6, EMPTY);
+
+  NNC_Polyhedron ph_tea1(6);
+  ph_tea1.add_constraint(c1 == 1);
+  ph_tea1.add_constraint(c2 == 1);
+  ph_tea1.add_constraint(x1 == 1);
+  ph_tea1.add_constraint(x2 == 0);
+  ph_tea1.add_constraint(k1 == 0);
+  ph_tea1.add_constraint(k2 == 0);
+  NNC_Polyhedron ph_tea2(6);
+  ph_tea2.add_constraint(c1 == 1);
+  ph_tea2.add_constraint(c2 == 1);
+  ph_tea2.add_constraint(x1 == 0);
+  ph_tea2.add_constraint(x2 == 1);
+  ph_tea2.add_constraint(k1 == 0);
+  ph_tea2.add_constraint(k2 == 0);
+
+  Pointset_Powerset<NNC_Polyhedron> ph_tmp(6);
+
+  while (true) {
+    //    nout << "next iteration" << std::endl;
+
+    // ph_idle
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 <= 1);
+    affine_image(ph_tmp, k1, k1 - 1);
+    affine_image(ph_tmp, x1, Linear_Expression(0));
+    ph_idle.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 == 0);
+    affine_image(ph_tmp, k2, k2 - 1);
+    affine_image(ph_tmp, x2, Linear_Expression(0));
+    ph_idle.upper_bound_assign(ph_tmp);
+
+    // ph_t1
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c1 >= 10);
+    affine_image(ph_tmp, c1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, Linear_Expression(1));
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c1 >= 10);
+    affine_image(ph_tmp, c1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, k1 + 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(x1 == 4);
+    ph_tmp.add_constraint(k1 >= 2);
+    affine_image(ph_tmp, x1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, k1 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x1 == 8);
+    ph_tmp.add_constraint(k2 <= 1);
+    ph_tmp.add_constraint(k1 >= 1);
+    affine_image(ph_tmp, x2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, k2 - 1);
+    ph_tmp.add_constraint(x1 <= 4);
+    ph_t1.upper_bound_assign(ph_tmp);
+    time_elapse(ph_t1, ph_tea1);
+    ph_t1.add_constraint(x1 <= 4);
+    (void) ph_t1.is_empty();
+
+    // ph_t2
+    ph_tmp = ph_idle;
+    ph_tmp.add_constraint(c2 >= 20);
+    affine_image(ph_tmp, c2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c2 >= 20);
+    affine_image(ph_tmp, c2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, k2 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(c1 >= 10);
+    affine_image(ph_tmp, c1, Linear_Expression(0));
+    affine_image(ph_tmp, k1, k1 + 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t2;
+    ph_tmp.add_constraint(x2 == 8);
+    ph_tmp.add_constraint(k2 >= 2);
+    affine_image(ph_tmp, x2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, k2 - 1);
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    ph_tmp = ph_t1;
+    ph_tmp.add_constraint(c2 >= 20);
+    affine_image(ph_tmp, c2, Linear_Expression(0));
+    affine_image(ph_tmp, k2, Linear_Expression(1));
+    ph_tmp.add_constraint(x2 <= 8);
+    ph_t2.upper_bound_assign(ph_tmp);
+    time_elapse(ph_t2, ph_tea2);
+    ph_t2.add_constraint(x2 <= 8);
+
+    // Note that widening is not needed and the iteration terminates
+    // with the ph_t2 consisting of 4 polyhedra.
+    // The results without any widening are:
+
+    // ph_idle = { F = 0, E = 0, D = 0, C = 0, B >= 0, A >= 0 }
+
+    // ph_t1 =
+    // { F = 0, E = 1, D = 0, A - C = 0, -A + B >= 0, A >= 0, -A >= -4 }
+
+    // ph_t2 =
+    // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+    // { F = 1, E = 1, B - D = 0, A - B - C = 0, -A + B >= -4, -B >= -8,
+    //                                             B >= 0, A - B >= 0 },
+    // { F = 1, E = 1, C = 0, B - D = 0, -A + B >= 0, -B >= -8, A >= 0 },
+    // { F = 1, E = 2, B - D = 0, -A + B + C >= 10, -C >= -4, -B >= -8,
+    //                                                          A >= 0 }
+
+
+    // However, for ph_t2, a number of different
+    // widening and extrapolation options have been tested.
+    //
+    //
+    //    ph_t2.BGP99_extrapolation_assign(
+    //      ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign), 3);
+    // The BGP99 extrapolation with the max number 3 keeps the information
+    // that k1 <= 2 as well as that k2 = 1:
+    // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+    // { F = 1, E = 1, B - D = 0, A - B - C = 0, -A + B >= -4, -B >= -8,
+    //                                             B >= 0, A - B >= 0 },
+    // { F = 1, B - D = 0, -A + B + C - 10*E >= -10, -C + 4*E >= 4,
+    //                      -E >= -2, C - 2*E >= -2, -B >= -8, A >= 0 }
+
+    //    ph_t2.BGP99_extrapolation_assign(
+    //      ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign), 2);
+    // If we reduce the number 3 to 2, then we lose the constraint k1 <= 2:
+    // { F = 1, E = 0, C = 0, B - D = 0, -B >= -8, B >= 0, A - B >= 0 },
+    // { F = 1, B - D = 0, -A + B + C - 10*E >= -10, -C >= -4, E >= 1,
+    //  C - 2*E >= -2, A - B - 3*C + 12*E >= 4, -B >= -8, A - C + 4*E >= 4 }
+
+    //   ph_t2.BHZ03_widening_assign<BHRZ03_Certificate>
+    //     (ph_t2_prev, widen_fun_ref(&Polyhedron::H79_widening_assign));
+    // The BHZ03 widening loses the information that k1 <=2
+    // because there is no "with tokens" option:
+    // { F = 1, B - D = 0, -C + 4*E >= 0, C >= 0, B >= 0, -B >= -8 }
+
+    // The simpler test disjunct_covers() which is sufficient here
+    // should be more efficient than geometrically_covers().
+    if (disjunct_covers(ph_idle_prev, ph_idle)
+         && disjunct_covers(ph_t1_prev, ph_t1)
+         && disjunct_covers(ph_t2_prev, ph_t2)) {
+
+      //  if (ph_idle_prev.geometrically_covers(ph_idle)
+      //       && ph_t1_prev.geometrically_covers(ph_t1)
+      //       && ph_t2_prev.geometrically_covers(ph_t2)) {
+
+
+      print_constraints(ph_idle, "*** ph_idle final ***");
+
+      print_constraints(ph_t1, "*** ph_t1 final ***");
+
+      print_constraints(ph_t2, "*** ph_t2 final ***");
+
+      // We project away the variables c1 and C2 only compare the
+      // upper_bounds of the powerset with the expected result.
+
+      Variables_Set vs;
+      vs.insert(c1);
+      vs.insert(c2);
+
+      NNC_Polyhedron ph_idle_hull(6, EMPTY);
+      powerset_upper_bound(ph_idle, ph_idle_hull);
+
+      ph_idle_hull.remove_space_dimensions(vs);
+
+      NNC_Polyhedron known_result_idle(4);
+      known_result_idle.add_constraint(x1 == 0);
+      known_result_idle.add_constraint(x2 == 0);
+      known_result_idle.add_constraint(k1 == 0);
+      known_result_idle.add_constraint(k2 == 0);
+      bool ok = (ph_idle_hull == known_result_idle);
+
+      print_constraints(ph_idle_hull, "*** ph_idle_hull final projected ***");
+
+      NNC_Polyhedron ph_t1_hull(6, EMPTY);
+      powerset_upper_bound(ph_t1, ph_t1_hull);
+      ph_t1_hull.remove_space_dimensions(vs);
+
+      NNC_Polyhedron known_result_t1(4);
+      known_result_t1.add_constraint(x1 >= 0);
+      known_result_t1.add_constraint(x1 <= 4);
+      known_result_t1.add_constraint(x2 == 0);
+      known_result_t1.add_constraint(k1 == 1);
+      known_result_t1.add_constraint(k2 == 0);
+      ok = ok &&  (ph_t1_hull == known_result_t1);
+
+      print_constraints(ph_t1_hull, "*** ph_t1_hull final projected ***");
+
+      NNC_Polyhedron ph_t2_hull(6, EMPTY);
+      powerset_upper_bound(ph_t2, ph_t2_hull);
+      ph_t2_hull.remove_space_dimensions(vs);
+
+      NNC_Polyhedron known_result_t2(4);
+      known_result_t2.add_constraint(k2 == 1);
+      known_result_t2.add_constraint(k1 <= 2);
+      known_result_t2.add_constraint(x1 >= 0);
+      known_result_t2.add_constraint(x1 <= 4);
+      known_result_t2.add_constraint(x1 >= 0);
+      known_result_t2.add_constraint(x2 <= 8);
+      known_result_t2.add_constraint(x2 >= 0);
+      known_result_t2.add_constraint(x1 <= 4*k1);
+      known_result_t2.add_constraint(2*k1 - x1 <= 2);
+      known_result_t2.add_constraint(x1 + x2 >= 10*k1 -10);
+      known_result_t2.add_constraint(x2 >= 6*k1 - 6);
+      ok = ok &&  (ph_t2_hull == known_result_t2);
+
+      print_constraints(ph_t2_hull, "*** ph_t2_hull final projected ***");
+
+      return ok;
+    }
+
+    ph_idle_prev = ph_idle;
+    ph_t1_prev = ph_t1;
+    ph_t2_prev = ph_t2;
+  }
+
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/intersection1.cc b/tests/Polyhedron/intersection1.cc
new file mode 100644
index 0000000..cc8b8a1
--- /dev/null
+++ b/tests/Polyhedron/intersection1.cc
@@ -0,0 +1,513 @@
+/* Testing Polyhedron::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Intersection of an icosahedron with a column.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron icosahedron(3);
+  icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0);
+  icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0);
+  icosahedron.add_constraint(x + y - 1 >= 0);
+  icosahedron.add_constraint(x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(x + 1 >= 0);
+  icosahedron.add_constraint(x + z - 1 >= 0);
+  icosahedron.add_constraint(2*x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(x - y + 5 >= 0);
+  icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0);
+  icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(-x + y - 1 >= 0);
+  icosahedron.add_constraint(-x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0);
+  icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(-x + 1 >= 0);
+  icosahedron.add_constraint(-x - z + 5 >= 0);
+  icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0);
+  icosahedron.add_constraint(-x - y + 5 >= 0);
+  icosahedron.add_constraint(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron column(3);
+  column.add_constraint(y >= 2);
+  column.add_constraint(y <= 4);
+  column.add_constraint(x >= 0);
+  column.add_constraint(x <= 1);
+
+  C_Polyhedron computed_result = icosahedron;
+  computed_result.intersection_assign(column);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-4*x - 2*y + z >= -8);
+  known_result.add_constraint(-4*x + 2*y + z >= 4);
+  known_result.add_constraint(-2*x - y + 2*z >= -1);
+  known_result.add_constraint(-2*x + y + 2*z >= 5);
+  known_result.add_constraint(-x - y - 2*z >= -13);
+  known_result.add_constraint(-x - z >= -5);
+  known_result.add_constraint(-x >= -1);
+  known_result.add_constraint(-x + y - 2*z >= -7);
+  known_result.add_constraint(-y >= -4);
+  known_result.add_constraint(y >= 2);
+  known_result.add_constraint(x >= 0);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(icosahedron, "*** icosahedron ***");
+  print_constraints(column, "*** column ***");
+  print_constraints(computed_result, "*** computed_result ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+int
+aux_test02(const C_Polyhedron& ph) {
+  if (ph.is_empty() || ph.space_dimension() == 0)
+    return 0;
+
+  int count = 0;
+  const Generator_System& gs = ph.generators();
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i)
+    if (i->type() == Generator::POINT)
+      ++count;
+  return count;
+}
+
+// Intersection of a pyramid with an half-space of variable height.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  // This is the height of the pyramid.
+  const Coefficient pyramid_height = 16;
+
+  // We will intersect it with the half-spaces `z <= k' and `z >= k'
+  // with k = i*(height/4) for i = -1, 0, 1, ..., 5.
+  struct {
+    Coefficient plane_height;
+    int num_points_above;
+    int num_points_below;
+  } ph_nv[]
+      = { {-1*(pyramid_height/4), 5, 0},
+          { 0*(pyramid_height/4), 5, 4},
+          { 1*(pyramid_height/4), 5, 8},
+          { 2*(pyramid_height/4), 5, 8},
+          { 3*(pyramid_height/4), 5, 8},
+          { 4*(pyramid_height/4), 1, 5},
+          { 5*(pyramid_height/4), 0, 5}
+      };
+
+  Generator_System gs;
+  gs.insert(point(0*x + 0*y + 0*z));
+  gs.insert(point(2*x + 0*y + 0*z));
+  gs.insert(point(0*x + 2*y + 0*z));
+  gs.insert(point(2*x + 2*y + 0*z));
+  gs.insert(point(x + y + pyramid_height*z));
+  C_Polyhedron pyramid(gs);
+
+    print_constraints(pyramid, "*** pyramid constraints ***");
+    print_generators(pyramid, "*** pyramid generators ***");
+
+  bool ok = true;
+
+  for (dimension_type i = 0; i <= 6; ++i) {
+    // Above.
+    C_Polyhedron hyper_space_above(3);
+    hyper_space_above.add_constraint(z >= ph_nv[i].plane_height);
+
+    C_Polyhedron computed_result = pyramid;
+    computed_result.intersection_assign(hyper_space_above);
+
+    if (ok
+        && aux_test02(computed_result) != ph_nv[i].num_points_above)
+      ok = false;
+
+    print_constraints(hyper_space_above, "*** hyper_space_above ***");
+    print_generators(computed_result, "*** computed_result ***");
+
+    // Below.
+    C_Polyhedron hyper_space_below(3);
+    hyper_space_below.add_constraint(z <= ph_nv[i].plane_height);
+
+    computed_result = pyramid;
+    computed_result.intersection_assign(hyper_space_below);
+
+    if (ok
+        && aux_test02(computed_result) != ph_nv[i].num_points_below)
+      ok = false;
+
+    print_constraints(hyper_space_below, "*** hyper_space_below ***");
+    print_generators(computed_result, "*** computed_result ***");
+
+  }
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x - y >= 0);
+  ph1.add_constraint(x - y <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(y >= 0);
+  ph2.add_constraint(x <= 1);
+  ph2.add_constraint(y <= 1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x - y >= 0);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result, "*** after intersection_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= y);
+  ph1.add_constraint(x >= 0);
+
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result1(ph1);
+  computed_result1.intersection_assign(ph2);
+
+  Constraint_System cs_computed_result2 = ph1.constraints();
+  C_Polyhedron computed_result2(cs_computed_result2);
+  computed_result2.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (computed_result1 == known_result
+             && computed_result2 == known_result);
+
+  print_constraints(computed_result1, "*** after intersection_assign ***");
+  print_constraints(computed_result2, "*** after intersection_assign ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= y);
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.add_generator(line(x));
+  ph2.add_generator(ray(y));
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x >= y);
+
+  bool ok = (known_result == ph1);
+
+  print_constraints(ph1, "*** after intersection_assign ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(3*x));
+  gs1.insert(point(3*y));
+  gs1.insert(point(3*x+ 3*y));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(x));
+  gs2.insert(point(4*x));
+  gs2.insert(point(x + 3*y));
+  gs2.insert(point(4*x+ 3*y));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(x));
+  known_result.add_generator(point(3*x));
+  known_result.add_generator(point(x + 3*y));
+  known_result.add_generator(point(3*x + 3*y));
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after intersection_assign ***");
+
+  return ok;
+}
+
+bool
+aux_test07(C_Polyhedron& ph1,
+           const C_Polyhedron& ph2,
+           // Note intentional call-by-value!
+           C_Polyhedron known_result) {
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+
+  print_generators(ph1, "*** after intersection_assign ***");
+
+  return ph1 == known_result;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1_1(2);
+  ph1_1.add_constraint(x >= 0);
+  ph1_1.add_constraint(y >= 0);
+  ph1_1.add_constraint(x <= 2);
+  ph1_1.add_constraint(y <= 2);
+  C_Polyhedron ph1_2(ph1_1);
+
+  C_Polyhedron ph2_1(2);
+  ph2_1.add_constraint(x+y <= 0);
+  ph2_1.add_constraint(x+y >= 2);
+  C_Polyhedron ph2_2(ph2_1);
+  C_Polyhedron ph2_3(ph2_1);
+  C_Polyhedron ph2_4(ph2_1);
+
+  bool ok = aux_test07(ph1_1, ph2_1, ph2_1)
+    && aux_test07(ph2_2, ph1_2, ph2_2)
+    && aux_test07(ph2_3, ph2_4, ph2_3);
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+  ph2.add_generator(point());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A - B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.intersection_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.intersection_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == B);
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A >= B + 1);
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+  copy_ph1.intersection_assign(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** after intersection_assign ***");
+  print_constraints(copy_ph1, "*** after intersection_assign ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.intersection_assign(ph2);
+  copy_ph1.intersection_assign(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_constraints(ph1, "*** after intersection_assign ***");
+  print_constraints(copy_ph1, "*** after intersection_assign ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8A(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/limitedbhrz03extrapolation1.cc b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
new file mode 100644
index 0000000..83e86bf
--- /dev/null
+++ b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
@@ -0,0 +1,68 @@
+/* Test Polyhedron::limited_BHRZ03_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(A + B));
+  gs1.insert(point(A));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(point(2*A));
+  gs2.insert(point(2*A + 2*B));
+  C_Polyhedron ph2(gs2);
+
+  Constraint_System cs;
+  cs.insert(A <= 5);
+  cs.insert(B <= 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_BHRZ03_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+  known_result.add_constraint(B <= 4);
+  known_result.add_constraint(A <= 5);
+
+  bool ok = (ph2 == known_result) ? true : false;
+
+  print_constraints(ph2, "*** after ph2.limited_BHRZ03_widening(ph1, cs) ***");
+
+  return ok;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/limitedh79extrapolation1.cc b/tests/Polyhedron/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..44b2b98
--- /dev/null
+++ b/tests/Polyhedron/limitedh79extrapolation1.cc
@@ -0,0 +1,274 @@
+/* Test Polyhedron::limited_H79_extrapolation_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y >= 0);
+  cs1.insert(x - y >= 0);
+
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(x <= 2);
+  cs2.insert(y >= 0);
+  cs2.insert(x - y >= 0);
+
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(y >= 0);
+  cs.insert(x <= 5);
+  cs.insert(y <= 5);
+
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron computed_result = ph2;
+  computed_result.limited_H79_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x - y >= 0);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(x <= 5);
+
+  print_constraints(computed_result,
+                    "*** after limited_H79_extrapolation_assign ***");
+
+  return computed_result == known_result;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  cs1.insert(y == 0);
+
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x <= 2);
+  cs2.insert(y >= 0);
+  cs2.insert(y <= x);
+
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(y <= -1);
+  cs.insert(x <= 5);
+
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron computed_result = ph2;
+  computed_result.limited_H79_extrapolation_assign(ph1, cs);
+
+  C_Polyhedron known_result = ph2;
+  known_result.add_generator(point(5*x));
+  known_result.add_generator(point(5*x + 5*y));
+
+  print_constraints(computed_result,
+                    "*** after limited_H79_extrapolation_assign ***");
+
+  return computed_result == known_result;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 1);
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x == 0);
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron computed_result = ph1;
+  computed_result.limited_H79_extrapolation_assign(ph2, cs);
+
+  C_Polyhedron known_result(cs);
+
+  print_constraints(computed_result,
+                    "*** after limited_H79_extrapolation_assign ***");
+
+  return computed_result == known_result;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(B >= 0);
+  ph2.add_constraint(A - B >= 0);
+  ph2.add_constraint(A <= 2);
+
+  Constraint_System cs;
+  cs.insert(B <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+                    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+                    " ***");
+  return ok;
+}
+
+bool
+test05() {
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  C_Polyhedron ph2(2, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(B <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+                    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+                    " ***");
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph1;
+
+  C_Polyhedron ph2;
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(2) <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+                    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+                    " ***");
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 2);
+  ph1.add_constraint(A <= -2);
+  ph1.add_constraint(B == 0);
+  C_Polyhedron ph2(2);
+  ph1.add_constraint(A >= 2);
+
+  Constraint_System cs;
+  cs.insert(B <= 4);
+
+  C_Polyhedron known_result(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph2.limited_H79_extrapolation_assign(ph1, cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2,
+                    "*** after ph2.limited_H79_extrapolation_assign(ph1, cs)"
+                    " ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/linearexpression1.cc b/tests/Polyhedron/linearexpression1.cc
new file mode 100644
index 0000000..a934216
--- /dev/null
+++ b/tests/Polyhedron/linearexpression1.cc
@@ -0,0 +1,138 @@
+/* Testing Linear_Expression.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#define EQUIVALENT(le1, le2) (((le1) == 0) == ((le2) == 0))
+
+// Test operator-=(Linear_Expression& e1, const Linear_Expression& e2):
+// in this case the dimension of e2 is strictly greater than
+// the dimension of e1.
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1 = A;
+  Linear_Expression e2 = B;
+  e1 -= e2;
+
+  Linear_Expression known_result = A - B;
+
+  bool ok = EQUIVALENT(e1, known_result);
+
+  nout << "*** known_result ***" << endl
+       << known_result << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(15);
+  Variable B(0);
+
+  Linear_Expression e1 = A;
+  Linear_Expression e2 = B;
+
+  Linear_Expression known_result1 = e1 + e2;
+
+  bool ok1 = EQUIVALENT(A + B, known_result1)
+    && EQUIVALENT(B + A, known_result1)
+    && EQUIVALENT(Linear_Expression(A) + B, known_result1)
+    && EQUIVALENT(B + Linear_Expression(A), known_result1)
+    && EQUIVALENT(A + Linear_Expression(B), known_result1)
+    && EQUIVALENT(Linear_Expression(B) + A, known_result1)
+    && EQUIVALENT(Linear_Expression(B) + Linear_Expression(A), known_result1);
+
+  nout << "*** known_result1 ***" << endl
+       << known_result1 << endl;
+
+  Linear_Expression known_result2 = e1 + e1;
+
+  bool ok2 = EQUIVALENT(A + A, known_result2)
+    && EQUIVALENT(A + A, known_result2)
+    && EQUIVALENT(Linear_Expression(A) + A, known_result2)
+    && EQUIVALENT(A + Linear_Expression(A), known_result2)
+    && EQUIVALENT(A + Linear_Expression(A), known_result2)
+    && EQUIVALENT(Linear_Expression(A) + A, known_result2)
+    && EQUIVALENT(Linear_Expression(A) + Linear_Expression(A), known_result2);
+
+  nout << "*** known_result2 ***" << endl
+       << known_result2 << endl;
+
+  return ok1 && ok2;
+}
+
+bool
+test03() {
+  Variable A(15);
+  Variable B(10);
+
+  Linear_Expression e1 = A;
+  Linear_Expression e2 = B;
+
+  Linear_Expression known_result1 = e1 - e2;
+
+  bool ok1 = EQUIVALENT(A - B, known_result1)
+    && EQUIVALENT(Linear_Expression(A) - B, known_result1)
+    && EQUIVALENT(A - Linear_Expression(B), known_result1)
+    && EQUIVALENT(Linear_Expression(A) - Linear_Expression(B), known_result1);
+
+  nout << "*** known_result1 ***" << endl
+       << known_result1 << endl;
+
+  Linear_Expression known_result2 = e2 - e1;
+
+  bool ok2 = EQUIVALENT(B - A, known_result2)
+    && EQUIVALENT(Linear_Expression(B) - A, known_result2)
+    && EQUIVALENT(B - Linear_Expression(A), known_result2)
+    && EQUIVALENT(Linear_Expression(B) - Linear_Expression(A), known_result2);
+
+  nout << "*** known_result2 ***" << endl
+       << known_result2 << endl;
+
+  Linear_Expression known_result3 = e1 - e1;
+
+  bool ok3 = EQUIVALENT(A - A, known_result3)
+    && EQUIVALENT(Linear_Expression(A) - A, known_result3)
+    && EQUIVALENT(A - Linear_Expression(A), known_result3)
+    && EQUIVALENT(Linear_Expression(A) - Linear_Expression(A), known_result3);
+
+  nout << "*** known_result3 ***" << endl
+       << known_result3 << endl;
+
+  return ok1 && ok2 && ok3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/linearpartition1.cc b/tests/Polyhedron/linearpartition1.cc
new file mode 100644
index 0000000..98b5e4d
--- /dev/null
+++ b/tests/Polyhedron/linearpartition1.cc
@@ -0,0 +1,332 @@
+/* Test linear_partition().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+aux_test01(const C_Polyhedron& p,
+           const C_Polyhedron& q,
+           const std::pair<C_Polyhedron,
+           Pointset_Powerset<NNC_Polyhedron> >& partition) {
+  const C_Polyhedron& r = partition.first;
+  // `r' must be a subset of or equal to `q'.
+  if (!q.contains(r))
+    return false;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  NNC_Polyhedron the_union(r);
+  // These are the NNC versions of `p' and `q'.
+  NNC_Polyhedron nnc_p(p);
+  NNC_Polyhedron nnc_q(q);
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+    const NNC_Polyhedron& a = i->pointset();
+    // All elements of `s' must be disjoint from `p'.
+    if (!a.is_disjoint_from(nnc_p))
+      return false;
+    iter j = i;
+    for (++j; j != s_end; ++j) {
+      const NNC_Polyhedron& b = j->pointset();
+      // All elements of `s' must be pairwise disjoint.
+      if (!a.is_disjoint_from(b))
+        return false;
+    }
+    the_union.upper_bound_assign(a);
+  }
+  // The union of all the elements in `partition' must be exactly `q'.
+  return the_union == nnc_q;
+}
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x == 0);
+  p.add_constraint(y >= 0);
+  p.add_constraint(y <= 2);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+    result = linear_partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  if (!aux_test01(p, q, result))
+    return false;
+
+  result = linear_partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  return aux_test01(q, p, result);
+}
+
+bool
+aux_test02(const C_Polyhedron& p,
+           const C_Polyhedron& q,
+           const std::pair<C_Polyhedron,
+           Pointset_Powerset<NNC_Polyhedron> >& partition) {
+  const C_Polyhedron& r = partition.first;
+  // `r' must be a subset of or equal to `q'.
+  if (!q.contains(r))
+    return false;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  NNC_Polyhedron the_union(r);
+  // These are the NNC versions of `p' and `q'.
+  NNC_Polyhedron nnc_p(p);
+  NNC_Polyhedron nnc_q(q);
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+    const NNC_Polyhedron& a = i->pointset();
+    // All elements of `s' must be disjoint from `p'.
+    if (!a.is_disjoint_from(nnc_p))
+      return false;
+    iter j = i;
+    for (++j; j != s_end; ++j) {
+      const NNC_Polyhedron& b = j->pointset();
+      // All elements of `s' must be pairwise disjoint.
+      if (!a.is_disjoint_from(b))
+        return false;
+    }
+    the_union.upper_bound_assign(a);
+  }
+  // The union of all the elements in `partition' must be exactly `q'.
+  return the_union == nnc_q;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x == 5);
+  p.add_constraint(y >= 0);
+  p.add_constraint(y <= 2);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+    result = linear_partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  if (!aux_test01(p, q, result))
+    return false;
+
+  result = linear_partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  return aux_test02(q, p, result);
+}
+
+bool
+aux_test03(const C_Polyhedron& p,
+           const C_Polyhedron& q,
+           const std::pair<C_Polyhedron,
+           Pointset_Powerset<NNC_Polyhedron> >& partition) {
+  const C_Polyhedron& r = partition.first;
+  // `r' must be a subset of or equal to `q'.
+  if (!q.contains(r))
+    return false;
+  const Pointset_Powerset<NNC_Polyhedron>& s = partition.second;
+  NNC_Polyhedron the_union(r);
+  // These are the NNC versions of `p' and `q'.
+  NNC_Polyhedron nnc_p(p);
+  NNC_Polyhedron nnc_q(q);
+  typedef Pointset_Powerset<NNC_Polyhedron>::const_iterator iter;
+  for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+    const NNC_Polyhedron& a = i->pointset();
+    // All elements of `s' must be disjoint from `p'.
+    if (!a.is_disjoint_from(nnc_p))
+      return false;
+    iter j = i;
+    for (++j; j != s_end; ++j) {
+      const NNC_Polyhedron& b = j->pointset();
+      // All elements of `s' must be pairwise disjoint.
+      if (!a.is_disjoint_from(b))
+        return false;
+    }
+    the_union.upper_bound_assign(a);
+  }
+  // The union of all the elements in `partition' must be exactly `q'.
+  return the_union == nnc_q;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x >= -2);
+  p.add_constraint(x <=  2);
+  p.add_constraint(y >=  0);
+  p.add_constraint(y <=  4);
+
+  using namespace IO_Operators;
+  nout << "p = " << p << endl;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  std::pair<C_Polyhedron, Pointset_Powerset<NNC_Polyhedron> >
+    result = linear_partition(p, q);
+
+  nout << "*** q partition ***" << endl;
+  nout << "  +++ p inters q +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  if (!aux_test03(p, q, result))
+    return false;
+
+  result = linear_partition(q, p);
+
+  nout << "*** p partition ***" << endl;
+  nout << "  +++ q inters p +++" << endl << "  " << result.first << endl;
+  nout << "  +++    rest    +++" << endl << "  " << result.second << endl;
+
+  return aux_test03(q, p, result);
+}
+
+// Compute the complement.
+template <typename PH>
+Pointset_Powerset<NNC_Polyhedron>
+aux_test04(const PH& ph) {
+  std::pair<PH, Pointset_Powerset<NNC_Polyhedron> > partition
+    = linear_partition(ph, PH(ph.space_dimension(), UNIVERSE));
+  return partition.second;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2, EMPTY);
+  p.add_generator(point(x));
+  p.add_generator(point(y));
+  p.add_generator(point(-x));
+  p.add_generator(point(-y));
+
+  using namespace IO_Operators;
+
+  nout << "p = " << p << endl;
+
+  Pointset_Powerset<NNC_Polyhedron> p_c = aux_test04(p);
+
+  nout << "complement(p) = " << p_c << endl;
+
+  Pointset_Powerset<NNC_Polyhedron> p_p(p.space_dimension(), EMPTY);
+  p_p.add_disjunct(NNC_Polyhedron(p));
+  p_p.intersection_assign(p_c);
+
+  nout << "p intersected with complement(p) = " << p_p << endl;
+
+  if (!p_p.empty())
+    return false;
+
+  p_c.add_disjunct(NNC_Polyhedron(p));
+  p_c.pairwise_reduce();
+
+  nout << "p added to complement(p), pairwise reduced = " << p_c << endl;
+
+  if (!p_c.is_top())
+    return false;
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= -1);
+  q.add_constraint(x <=  1);
+  q.add_constraint(y >=  1);
+  q.add_constraint(y <=  3);
+
+  nout << "q = " << q << endl;
+
+  Pointset_Powerset<NNC_Polyhedron> q_c = aux_test04(q);
+
+  nout << "complement(q) = " << q_c << endl;
+
+  Pointset_Powerset<NNC_Polyhedron> q_p(q.space_dimension(), EMPTY);
+  q_p.add_disjunct(NNC_Polyhedron(q));
+  q_p.intersection_assign(q_c);
+
+  nout << "q intersected with complement(q) = " << q_p << endl;
+
+  if (!q_p.empty())
+    return false;
+
+  q_c.add_disjunct(NNC_Polyhedron(q));
+  q_c.pairwise_reduce();
+
+  nout << "q added to complement(q), pairwise reduced = " << q_c << endl;
+
+  if (!q_c.is_top())
+    return false;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/linearsystem1.cc b/tests/Polyhedron/linearsystem1.cc
new file mode 100644
index 0000000..6e1ca90
--- /dev/null
+++ b/tests/Polyhedron/linearsystem1.cc
@@ -0,0 +1,109 @@
+/* Test some functionality of class Linear_System.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+namespace {
+
+bool
+test01() {
+  const char* data_file = "linearsystem1.dat";
+
+  Variable A(0);
+  Variable B(1);
+
+#if 0
+  // Using this seed and the checked 8-bit integer coefficients,
+  // the random number generator produces the minimum value during
+  // the following computations.
+  unsigned long problematic_seed = 1141853716;
+  Random_Number_Generator rng(problematic_seed);
+#else
+  Random_Number_Generator rng;
+#endif
+
+#define ROWS 7
+#define COLS 3
+
+  Linear_System<Constraint> ls1(NOT_NECESSARILY_CLOSED, DENSE);
+  for (dimension_type rowi = 0; rowi < ROWS; ++rowi) {
+    Linear_Expression e;
+    e.set_space_dimension(COLS - 1);
+    for (dimension_type col = 0; col < COLS; ++col) {
+      Coefficient c;
+      rng.get(c, 0);
+      // The following workaround is to avoid trivial positive overflows
+      // when using bounded coefficients.
+      if (std::numeric_limits<Coefficient>::is_bounded
+          && c == std::numeric_limits<Coefficient>::min())
+        // Here the randomly generated coefficients is equal to the
+        // allowed minimum value for a signed integer data type that
+        // might adopt the 2's complement representation
+        // (e.g., -128 for 8 bit signed integers).
+        // Thus, it would cause a positive overflow during the normalization
+        // of the Linear_Row, because the GCD computation will try to negate
+        // such a coefficient.
+        // To avoid the problem, we simply increment the coefficient.
+        ++c;
+      
+      if (col == 0)
+        e += c;
+      else
+        add_mul_assign(e, c, Variable(col - 1));
+    }
+
+    ls1.insert(e > 0);
+
+    using std::fstream;
+    using std::ios_base;
+    fstream f;
+    open(f, data_file, ios_base::out);
+    ls1.ascii_dump(f);
+    close(f);
+
+    open(f, data_file, ios_base::in);
+    Linear_System<Constraint> ls2(NECESSARILY_CLOSED, DENSE);
+    ls2.ascii_load(f);
+    close(f);
+
+    if (ls1 == ls2)
+      continue;
+
+    nout << "Linear_System<Constraint>::ascii_dump/load test failed." << endl
+         << "m1.ascii_dump() gives" << endl;
+    ls1.ascii_dump(nout);
+    nout << "m2.ascii_dump() gives" << endl;
+    ls2.ascii_dump(nout);
+
+    return false;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/mapspacedims1.cc b/tests/Polyhedron/mapspacedims1.cc
new file mode 100644
index 0000000..4d9ddea
--- /dev/null
+++ b/tests/Polyhedron/mapspacedims1.cc
@@ -0,0 +1,482 @@
+/* Test Polyhedron::map_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Partial_Function function;
+
+  C_Polyhedron ph1(3);
+
+  print_function(function, "*** function ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result;
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Partial_Function function;
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(2, 0);
+  function.insert(1, 1);
+
+  Generator_System gs;
+  gs.insert(point(2*C));
+  gs.insert(line(A + B));
+  gs.insert(ray(A + C));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  Generator_System known_gs;
+  known_gs.insert(point(2*A));
+  known_gs.insert(line(C + B));
+  known_gs.insert(ray(C + A));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(2, 0);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A + B));
+  gs.insert(ray(A - C));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(ray(B));
+  known_gs.insert(ray(B - A));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(2, 0);
+  function.insert(3, 2);
+  function.insert(4, 1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point());
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(1, 1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(B));
+  gs.insert(point(A + B));
+
+  C_Polyhedron ph1(gs);
+  C_Polyhedron known_result(ph1);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+  function.insert(2, 2);
+  function.insert(3, 3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(2*B));
+  gs.insert(point(A + 2*B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(4, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(B));
+  known_result.add_generator(point(2*A));
+  known_result.add_generator(point(2*A + B));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Partial_Function function;
+  function.insert(0, 0);
+  function.insert(2, 1);
+  function.insert(3, 2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(ray(B));
+  gs.insert(ray(A + B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(3, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(ray(A));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Partial_Function function;
+  function.insert(0, 1);
+  function.insert(1, 0);
+
+  C_Polyhedron ph1(3, EMPTY);
+
+  print_function(function, "*** function ***");
+  print_constraints(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Partial_Function rotate_right;
+  rotate_right.insert(0, 1);
+  rotate_right.insert(1, 2);
+  rotate_right.insert(2, 0);
+
+  Partial_Function rotate_left;
+  rotate_left.insert(0, 2);
+  rotate_left.insert(1, 0);
+  rotate_left.insert(2, 1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(-4*x - 2*y + z >= -8);
+  ph.add_constraint(-4*x + 2*y + z >= 4);
+  ph.add_constraint(-2*x - y + 2*z >= -1);
+  ph.add_constraint(-2*x + y + 2*z >= 5);
+  ph.add_constraint(-x - y - 2*z >= -13);
+  ph.add_constraint(-x - z >= -5);
+  ph.add_constraint(-x >= -1);
+  ph.add_constraint(-x + y - 2*z >= -7);
+  ph.add_constraint(-y >= -4);
+  ph.add_constraint(y >= 2);
+  ph.add_constraint(x >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_function(rotate_right, "*** rotate_right ***");
+  print_function(rotate_left, "*** rotate_left ***");
+
+  C_Polyhedron rs[4];
+  rs[0] = ph;
+
+  print_constraints(rs[0], "*** rs[0] ***");
+
+  for (int i = 1; i <= 3; ++i) {
+    rs[i] = rs[i-1];
+    rs[i].map_space_dimensions(rotate_right);
+
+    print_constraints(rs[i], "*** rs[i] ***");
+
+  }
+
+  C_Polyhedron ls[4];
+  ls[3] = ph;
+
+  print_constraints(ls[3], "*** ls[3] ***");
+
+  for (int i = 2; i >= 0; --i) {
+    ls[i] = ls[i+1];
+    // Force generators to be up-to-date, for a change.
+    (void) ls[i].generators();
+    ls[i].map_space_dimensions(rotate_left);
+
+    print_constraints(ls[i], "*** ls[i] ***");
+
+  }
+
+  for (int i = 0; i <= 3; ++i)
+    if (rs[i] != ls[i]) {
+      nout << "rs[" << i << "] != ls[" << i << "]" << endl;
+      return false;
+    }
+
+  return true;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(B >= 1);
+  ph.add_constraint(C >= 0);
+
+  Partial_Function rotate_right;
+  rotate_right.insert(0, 1);
+  rotate_right.insert(1, 2);
+  rotate_right.insert(2, 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_function(rotate_right, "*** rotate_right ***");
+
+  ph.map_space_dimensions(rotate_right);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 2);
+  known_result.add_constraint(C >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(-A + B == 0);
+
+  Partial_Function rotate_right;
+  rotate_right.insert(0, 1);
+  rotate_right.insert(1, 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_function(rotate_right, "*** rotate_right ***");
+
+  ph.map_space_dimensions(rotate_right);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.map_space_dimensions(rotate_right) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Partial_Function function;
+  function.insert(0, 2);
+  function.insert(1, 3);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A));
+  gs.insert(point(2*B));
+  gs.insert(point(A + 2*B));
+
+  C_Polyhedron ph1(gs);
+
+  print_function(function, "*** function ***");
+  print_generators(ph1, "*** ph1 ***");
+
+  ph1.map_space_dimensions(function);
+
+  C_Polyhedron known_result(4, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(C));
+  known_result.add_generator(point(2*D));
+  known_result.add_generator(point(C + 2*D));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** after ph1.map_space_dimensions(function) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  // test10() only fails when using C_Polyhedron and 8 bit coefficients.
+#ifdef DERIVED_TEST
+  DO_TEST(test10);
+#else
+  DO_TEST_F8(test10);
+#endif // !defined(DERIVED_TEST)
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/matrix1.cc b/tests/Polyhedron/matrix1.cc
new file mode 100644
index 0000000..823bf59
--- /dev/null
+++ b/tests/Polyhedron/matrix1.cc
@@ -0,0 +1,322 @@
+/* Test some functionality of class Matrix.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+
+#include <fstream>
+#include <vector>
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Random_Number_Generator r;
+  const char* data_file = "densematrix1.dat";
+
+  for (dimension_type num_rows = 0; num_rows <= 3; ++num_rows)
+    for (dimension_type num_cols = 0; num_cols <= 3; ++num_cols) {
+      Matrix<Dense_Row> m1(num_rows, num_cols);
+      for (dimension_type row = 0; row < num_rows; ++row)
+        for (dimension_type col = 0; col < num_cols; ++col)
+          r.get(m1[row][col], 0);
+
+      std::fstream f;
+      open(f, data_file, std::ios_base::out);
+      m1.ascii_dump(f);
+      close(f);
+
+      open(f, data_file, std::ios_base::in);
+      Matrix<Dense_Row> m2;
+      m2.ascii_load(f);
+      close(f);
+
+      if (m1 != m2) {
+
+        nout << "Matrix<Dense_Row>::ascii_dump/load test failed." << endl
+             << "m1.ascii_dump() gives" << endl;
+        m1.ascii_dump(nout);
+        nout << "m2.ascii_dump() gives" << endl;
+        m2.ascii_dump(nout);
+
+        return false;
+      }
+    }
+  return true;
+}
+
+bool
+test02() {
+
+  Matrix<Sparse_Row> matrix(3, 4);
+
+  if (matrix.num_rows() != 3)
+    return false;
+
+  if (matrix.num_columns() != 4)
+    return false;
+
+  matrix.resize(5);
+
+  if (matrix.num_rows() != 5)
+    return false;
+
+  if (matrix.num_columns() != 5)
+    return false;
+
+  matrix.add_zero_rows_and_columns(2, 3);
+
+  if (matrix.num_rows() != 7)
+    return false;
+
+  if (matrix.num_columns() != 8)
+    return false;
+
+  return true;
+}
+
+bool
+test03() {
+
+  Matrix<Sparse_Row> matrix(3, 6);
+
+  // ( 0  1  2  3  4  0 )
+  // ( 0  6  7  8  9 10 )
+  // ( 0 11 12 13 14 15 )
+
+  matrix[0][0] = 0;
+  matrix[0][1] = 1;
+  matrix[0][2] = 2;
+  matrix[0][3] = 3;
+  matrix[0][4] = 4;
+  matrix[0][5] = 0;
+  matrix[1][0] = 0;
+  matrix[1][1] = 6;
+  matrix[1][2] = 7;
+  matrix[1][3] = 8;
+  matrix[1][4] = 9;
+  matrix[1][5] = 10;
+  matrix[2][0] = 0;
+  matrix[2][1] = 11;
+  matrix[2][2] = 12;
+  matrix[2][3] = 13;
+  matrix[2][4] = 14;
+  matrix[2][5] = 15;
+
+  std::vector<dimension_type> cycles;
+
+  // Swap the second and the fourth column
+  cycles.push_back(1);
+  cycles.push_back(3);
+  cycles.push_back(0);
+
+  // Cycle the third, fifth and sixth column
+  cycles.push_back(2);
+  cycles.push_back(4);
+  cycles.push_back(5);
+  cycles.push_back(0);
+
+  matrix.permute_columns(cycles);
+
+
+  // Expected result:
+  //
+  // ( 0  3  0  1  2  4 )
+  // ( 0  8 10  6  7  9 )
+  // ( 0 13 15 11 12 14 )
+
+  if (matrix[0][0] != 0) return false;
+  if (matrix[0][1] != 3) return false;
+  if (matrix[0][2] != 0) return false;
+  if (matrix[0][3] != 1) return false;
+  if (matrix[0][4] != 2) return false;
+  if (matrix[0][5] != 4) return false;
+  if (matrix[1][0] != 0) return false;
+  if (matrix[1][1] != 8) return false;
+  if (matrix[1][2] != 10) return false;
+  if (matrix[1][3] != 6) return false;
+  if (matrix[1][4] != 7) return false;
+  if (matrix[1][5] != 9) return false;
+  if (matrix[2][0] != 0) return false;
+  if (matrix[2][1] != 13) return false;
+  if (matrix[2][2] != 15) return false;
+  if (matrix[2][3] != 11) return false;
+  if (matrix[2][4] != 12) return false;
+  if (matrix[2][5] != 14) return false;
+
+  return true;
+}
+
+bool
+test04() {
+  Matrix<Sparse_Row> large(2,5);
+  Matrix<Sparse_Row> tall(6,3);
+
+  large[0][4] = 10;
+  tall[4][0] = 20;
+
+  using std::swap;
+  swap(large, tall);
+
+  if (large.num_columns() != 3)
+    return false;
+
+  if (large.num_rows() != 6)
+    return false;
+
+  if (tall.num_columns() != 5)
+    return false;
+
+  if (tall.num_rows() != 2)
+    return false;
+
+  if (tall[0][4] != 10)
+    return false;
+
+  if (large[4][0] != 20)
+    return false;
+
+  return true;
+}
+
+bool
+test05() {
+
+  Matrix<Sparse_Row> x(2, 3);
+
+  // ( 1 2 3 )
+  // ( 4 5 6 )
+
+  x[0][0] = 1;
+  x[0][1] = 2;
+  x[0][2] = 3;
+  x[1][0] = 4;
+  x[1][1] = 5;
+  x[1][2] = 6;
+
+  Matrix<Sparse_Row>::iterator itr = x.begin();
+
+  // First row
+
+  if (itr == x.end())
+    return false;
+
+  if ((*itr)[0] != 1)
+    return false;
+  if ((*itr)[1] != 2)
+    return false;
+  if ((*itr)[2] != 3)
+    return false;
+
+  ++itr;
+
+  // Second row
+
+  if (itr == x.end())
+    return false;
+
+  if ((*itr)[0] != 4)
+    return false;
+  if ((*itr)[1] != 5)
+    return false;
+  if ((*itr)[2] != 6)
+    return false;
+
+  ++itr;
+
+  if (itr != x.end())
+    return false;
+
+  return true;
+}
+
+bool
+test06() {
+
+  Matrix<Sparse_Row> matrix(3, 5);
+
+  // (  1  2  3  4  5 )
+  // (  6  7  8  9 10 )
+  // ( 11 12 13 14 15 )
+
+  matrix[0][0] = 1;
+  matrix[0][1] = 2;
+  matrix[0][2] = 3;
+  matrix[0][3] = 4;
+  matrix[0][4] = 5;
+  matrix[1][0] = 6;
+  matrix[1][1] = 7;
+  matrix[1][2] = 8;
+  matrix[1][3] = 9;
+  matrix[1][4] = 10;
+  matrix[2][0] = 11;
+  matrix[2][1] = 12;
+  matrix[2][2] = 13;
+  matrix[2][3] = 14;
+  matrix[2][4] = 15;
+
+  matrix.add_row(matrix[1]);
+
+  // (  1  2  3  4  5 )
+  // (  6  7  8  9 10 )
+  // ( 11 12 13 14 15 )
+  // (  6  7  8  9 10 )
+
+  if (matrix[0][0] != 1) return false;
+  if (matrix[0][1] != 2) return false;
+  if (matrix[0][2] != 3) return false;
+  if (matrix[0][3] != 4) return false;
+  if (matrix[0][4] != 5) return false;
+  if (matrix[1][0] != 6) return false;
+  if (matrix[1][1] != 7) return false;
+  if (matrix[1][2] != 8) return false;
+  if (matrix[1][3] != 9) return false;
+  if (matrix[1][4] != 10) return false;
+  if (matrix[2][0] != 11) return false;
+  if (matrix[2][1] != 12) return false;
+  if (matrix[2][2] != 13) return false;
+  if (matrix[2][3] != 14) return false;
+  if (matrix[2][4] != 15) return false;
+  if (matrix[3][0] != 6) return false;
+  if (matrix[3][1] != 7) return false;
+  if (matrix[3][2] != 8) return false;
+  if (matrix[3][3] != 9) return false;
+  if (matrix[3][4] != 10) return false;
+
+  return true;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/max_min1.cc b/tests/Polyhedron/max_min1.cc
new file mode 100644
index 0000000..572d3ce
--- /dev/null
+++ b/tests/Polyhedron/max_min1.cc
@@ -0,0 +1,205 @@
+/* Test Polyhedron::maximize(const Linear_Expression&, ...)
+   and Polyhedron::minimize(const Linear_Expression&, ...).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(-2*x1-x2 >= -5);
+  ph.add_constraint(4*x1-4*x2 >= -5);
+  ph.add_constraint(x1 >= 0);
+  ph.add_constraint(x2 >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = ph.maximize(x1-2*x2, num, den, included, g)
+    && num == 5 && den == 2 && included
+    && g.is_point()
+    && g.coefficient(x1) == 5 && g.coefficient(x2) == 0
+    && g.divisor() == 2;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = ph.minimize(x1-2*x2, num, den, included, g)
+    && num == -15 && den == 4 && included
+    && g.is_point()
+    && g.coefficient(x1) == 5 && g.coefficient(x2) == 10
+    && g.divisor() == 4;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(-x1-x2-x3 >= -100);
+  ph.add_constraint(-10*x1-4*x2-5*x3 >= -600);
+  ph.add_constraint(-x1-x2-3*x3 >= -150);
+  ph.add_constraint(x1 >= 0);
+  ph.add_constraint(x2 >= 0);
+  ph.add_constraint(x3 >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  bool ok = ph.maximize(-10*x1-6*x2-4*x3+4, num, den, included, g)
+    && num == 4 && den == 1 && included
+    && g.is_point()
+    && g.coefficient(x1) == 0
+    && g.coefficient(x2) == 0
+    && g.coefficient(x3) == 0
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = ph.minimize(-10*x1-6*x2-4*x3+4, num, den, included, g)
+    && num == -2188 && den == 3 && included
+    && g.is_point()
+    && g.coefficient(x1) == 100
+    && g.coefficient(x2) == 200
+    && g.coefficient(x3) == 0
+    && g.divisor() == 3;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph(0);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num;
+  Coefficient den;
+  bool included;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = ph.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  ok = ph.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "infimum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = !ph.maximize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+  ok = ok && !ph.minimize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/maxspacedim1.cc b/tests/Polyhedron/maxspacedim1.cc
new file mode 100644
index 0000000..3842a8b
--- /dev/null
+++ b/tests/Polyhedron/maxspacedim1.cc
@@ -0,0 +1,137 @@
+/* Test the *::max_space_dimension() methods.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#define test01_DO_CLASS(T)                              \
+  nout << #T "::max_space_dimension() = "               \
+    << T::max_space_dimension() << endl;                \
+  if (T::max_space_dimension() < max_space_dimension()) \
+    return false
+
+#if PPL_SUPPORTED_FLOAT
+#define test01_DO_WRD_FLOAT(WRD) test01_DO_CLASS(WRD<float>)
+#else
+#define test01_DO_WRD_FLOAT(WRD)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+#define test01_DO_WRD_DOUBLE(WRD) test01_DO_CLASS(WRD<double>)
+#else
+#define test01_DO_WRD_DOUBLE(WRD)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+#define test01_DO_WRD_LONG_DOUBLE(WRD) test01_DO_CLASS(WRD<long double>)
+#else
+#define test01_DO_WRD_LONG_DOUBLE(WRD)
+#endif
+
+#define test01_DO_WRD(WRD)                      \
+  test01_DO_CLASS(WRD<int8_t>);                 \
+  test01_DO_CLASS(WRD<int16_t>);                \
+  test01_DO_CLASS(WRD<int32_t>);                \
+  test01_DO_CLASS(WRD<int64_t>);                \
+  test01_DO_CLASS(WRD<mpz_class>);              \
+  test01_DO_CLASS(WRD<mpq_class>);              \
+  test01_DO_WRD_FLOAT(WRD);                     \
+  test01_DO_WRD_DOUBLE(WRD);                    \
+  test01_DO_WRD_LONG_DOUBLE(WRD)
+
+#define test01_DO_CONSTR_CLASS(CONSTR, T)                               \
+  nout << #CONSTR "<" #T ">::max_space_dimension() = "                  \
+       << CONSTR<T>::max_space_dimension() << endl;                     \
+  if (CONSTR<T>::max_space_dimension() < max_space_dimension())         \
+    return false
+
+#if PPL_SUPPORTED_FLOAT
+#define test01_DO_CONSTR_WRD_FLOAT(CONSTR, WRD) \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<float>)
+#else
+#define test01_DO_CONSTR_WRD_FLOAT(CONSTR, WRD)
+#endif
+#if PPL_SUPPORTED_DOUBLE
+#define test01_DO_CONSTR_WRD_DOUBLE(CONSTR, WRD)        \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<double>)
+#else
+#define test01_DO_CONSTR_WRD_DOUBLE(CONSTR, WRD)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+#define test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD)   \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<long double>)
+#else
+#define test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD)
+#endif
+
+#define test01_DO_CONSTR_WRD(CONSTR, WRD)                       \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int8_t>);                  \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int16_t>);                 \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int32_t>);                 \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<int64_t>);                 \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<mpz_class>);               \
+  test01_DO_CONSTR_CLASS(CONSTR, WRD<mpq_class>);               \
+  test01_DO_CONSTR_WRD_FLOAT(CONSTR, WRD);                      \
+  test01_DO_CONSTR_WRD_DOUBLE(CONSTR, WRD);                     \
+  test01_DO_CONSTR_WRD_LONG_DOUBLE(CONSTR, WRD)
+
+bool
+test01() {
+  test01_DO_CLASS(Variable);
+  test01_DO_CLASS(Variables_Set);
+  test01_DO_CLASS(Linear_Expression);
+  test01_DO_CLASS(Constraint);
+  test01_DO_CLASS(Congruence);
+  test01_DO_CLASS(Generator);
+  test01_DO_CLASS(Grid_Generator);
+  test01_DO_CLASS(Constraint_System);
+  test01_DO_CLASS(Congruence_System);
+  test01_DO_CLASS(Generator_System);
+  test01_DO_CLASS(Grid_Generator_System);
+  test01_DO_CLASS(C_Polyhedron);
+  test01_DO_CLASS(NNC_Polyhedron);
+  test01_DO_CLASS(Grid);
+  // FIXME: what about all other boxes?
+  test01_DO_CLASS(Rational_Box);
+  test01_DO_WRD(BD_Shape);
+  test01_DO_WRD(Octagonal_Shape);
+  test01_DO_CONSTR_CLASS(Pointset_Powerset, C_Polyhedron);
+  test01_DO_CONSTR_CLASS(Pointset_Powerset, NNC_Polyhedron);
+  test01_DO_CONSTR_CLASS(Pointset_Powerset, Grid);
+  test01_DO_CONSTR_WRD(Pointset_Powerset, BD_Shape);
+  test01_DO_CONSTR_WRD(Pointset_Powerset, Octagonal_Shape);
+  //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, C_Polyhedron);
+  //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, NNC_Polyhedron);
+  //test01_DO_CONSTR_CLASS(Pointset_Ask_Tell, Grid);
+  //test01_DO_CONSTR_WRD(Pointset_Ask_Tell, BD_Shape);
+  //test01_DO_CONSTR_WRD(Pointset_Ask_Tell, Octagonal_Shape);
+
+  nout << "Parma_Polyhedra_Library::max_space_dimension() = "
+       << max_space_dimension() << endl;
+
+  // 9458 is the value of max_space_dimension()
+  // computed on a 32bit architecture.
+  return max_space_dimension() >= 9458;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
diff --git a/tests/Polyhedron/mc91.cc b/tests/Polyhedron/mc91.cc
new file mode 100644
index 0000000..ecb7e95
--- /dev/null
+++ b/tests/Polyhedron/mc91.cc
@@ -0,0 +1,118 @@
+/* Test the Pointset_Powerset construction with McCarthy's 91 function.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  typedef Pointset_Powerset<C_Polyhedron> PCS;
+
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // mc91(A, B) :- A >= 101, B = A-10.
+  C_Polyhedron base_ph(2);
+  base_ph.add_constraint(A >= 101);
+  base_ph.add_constraint(B == A-10);
+  PCS base(2, EMPTY);
+  base.add_disjunct(base_ph);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // mc91(A, B) :- A =< 100, C = A+11, E = D, F = B, mc91(C, D), mc91(E, F).
+  C_Polyhedron inductive_ph(6);
+  inductive_ph.add_constraint(A <= 100);
+  inductive_ph.add_constraint(C == A+11);
+  inductive_ph.add_constraint(E == D);
+  inductive_ph.add_constraint(F == B);
+  PCS inductive(6, EMPTY);
+  inductive.add_disjunct(inductive_ph);
+
+  print_constraints(inductive, "*** inductive ***");
+
+  // Initialize the fixpoint iteration.
+  PCS current = base;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the description computed at the previous iteration.
+  PCS previous;
+  do {
+    previous = current;
+    current = inductive;
+    Pointset_Powerset<C_Polyhedron> b1(2);
+    b1.concatenate_assign(previous);
+    b1.add_space_dimensions_and_embed(2);
+    current.intersection_assign(b1);
+    Pointset_Powerset<C_Polyhedron> b2(4);
+    b2.concatenate_assign(previous);
+    current.intersection_assign(b2);
+
+    print_constraints(current, "*** after body solving ***");
+
+    Variables_Set dimensions_to_remove;
+    // Deliberately inserted out of order (!).
+    dimensions_to_remove.insert(D);
+    dimensions_to_remove.insert(C);
+    dimensions_to_remove.insert(F);
+    dimensions_to_remove.insert(E);
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.least_upper_bound_assign(previous);
+
+    current.BHZ03_widening_assign<BHRZ03_Certificate>
+      (previous, widen_fun_ref(&Polyhedron::H79_widening_assign));
+
+    print_constraints(current, "*** after lub+widening ***");
+
+  } while (current != previous);
+
+  C_Polyhedron expected_ph(2);
+  expected_ph.add_constraint(A - B <= 10);
+  expected_ph.add_constraint(B >= 91);
+  Pointset_Powerset<C_Polyhedron> expected(2, EMPTY);
+  expected.add_disjunct(expected_ph);
+
+  bool ok = (expected == current);
+
+  print_constraints(expected, "*** expected ***");
+  print_constraints(current, "*** final result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/membytes1.cc b/tests/Polyhedron/membytes1.cc
new file mode 100644
index 0000000..5cdcd7b
--- /dev/null
+++ b/tests/Polyhedron/membytes1.cc
@@ -0,0 +1,292 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+namespace test01_namespace {
+
+void
+add_constraint(C_Polyhedron& ph, const Constraint& c) {
+  const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+  const memory_size_type c_memory = c.total_memory_in_bytes();
+  ph.add_constraint(c);
+  const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+  nout << ph_memory_before
+       << " + " << c_memory
+       << " -> " << ph_memory_after
+       << endl;
+}
+
+void
+add_generator(C_Polyhedron& ph, const Generator& g) {
+  const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+  const memory_size_type g_memory = g.total_memory_in_bytes();
+  ph.add_generator(g);
+  const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+  nout << ph_memory_before
+       << " + " << g_memory
+       << " -> " << ph_memory_after
+       << endl;
+}
+
+void
+minimize(C_Polyhedron& ph) {
+  const memory_size_type ph_memory_before = ph.total_memory_in_bytes();
+  (void) ph.minimized_generators();
+  const memory_size_type ph_memory_after = ph.total_memory_in_bytes();
+
+  nout << ph_memory_before
+       << " -m-> " << ph_memory_after
+       << endl;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  using namespace test01_namespace;
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const memory_size_type x_total_size = x.total_memory_in_bytes();
+  const memory_size_type x_external_size = x.external_memory_in_bytes();
+
+  nout << "*** Size of variables ***"
+       << endl
+       << "x.total_memory_in_bytes() = " << x_total_size
+       << endl
+       << "x.external_memory_in_bytes() = " << x_external_size
+       << endl << endl;
+  nout << "*** Size of linear expressions ***"
+       << endl;
+
+  Linear_Expression le(0);
+  memory_size_type le_total_size = le.total_memory_in_bytes();
+  memory_size_type le_external_size = le.external_memory_in_bytes();
+
+  using namespace IO_Operators;
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += x;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 2*y;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl;
+
+  le += 4*z;
+  le_total_size = le.total_memory_in_bytes();
+  le_external_size = le.external_memory_in_bytes();
+
+  nout << "(" << le << ").total_memory_in_bytes() = " << le_total_size
+       << endl
+       << "(" << le << ").external_memory_in_bytes() = " << le_external_size
+       << endl << endl;
+
+  nout << "*** Adding constraints to a polyhedron ***" << endl;
+
+  C_Polyhedron ph(3);
+  add_constraint(ph, 4*x - 2*y - z + 14 >= 0);
+  add_constraint(ph, 4*x + 2*y - z + 2 >= 0);
+  add_constraint(ph, x + y - 1 >= 0);
+  add_constraint(ph, x + y + 2*z - 5 >= 0);
+  minimize(ph);
+  add_constraint(ph, x + 1 >= 0);
+  add_constraint(ph, x + z - 1 >= 0);
+  add_constraint(ph, 2*x + y -2*z + 7 >= 0);
+  add_constraint(ph, x - y + 2*z + 1 >= 0);
+  minimize(ph);
+  add_constraint(ph, x - y + 5 >= 0);
+  add_constraint(ph, 2*x - y - 2*z + 13 >= 0);
+  add_constraint(ph, -2*x - y + 2*z + 1 >= 0);
+  add_constraint(ph, -x + y - 1 >= 0);
+  minimize(ph);
+  add_constraint(ph, -x + y -2*z + 7 >= 0);
+  add_constraint(ph, -4*x + 2*y + z - 4 >= 0);
+  add_constraint(ph, -2*x + y + 2*z - 5 >= 0);
+  add_constraint(ph, -x + 1 >= 0);
+  minimize(ph);
+  add_constraint(ph, -x - z + 5 >= 0);
+  add_constraint(ph, -4*x - 2*y + z + 8 >= 0);
+  add_constraint(ph, -x - y + 5 >= 0);
+  add_constraint(ph, -x - y -2*z +13 >= 0);
+  minimize(ph);
+
+  const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+  const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+  const Constraint_System& cs = ph.constraints();
+  const memory_size_type cs_total_size = cs.total_memory_in_bytes();
+  const memory_size_type cs_external_size = cs.external_memory_in_bytes();
+  const Generator_System& gs = ph.generators();
+  const memory_size_type gs_total_size = gs.total_memory_in_bytes();
+  const memory_size_type gs_external_size = gs.external_memory_in_bytes();
+
+  nout << endl;
+
+  nout << "*** Size of the user-visible polyhedra components ***"
+       << endl
+       << "ph.total_memory_in_bytes() = " << ph_total_size
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl
+       << "ph.external_memory_in_bytes() = " << ph_external_size
+       << endl
+       << "cs.external_memory_in_bytes() = " << cs_external_size
+       << endl
+       << "gs.external_memory_in_bytes() = " << gs_external_size
+       << endl << endl;
+  nout << "*** Adding generators to a polyhedron ***" << endl;
+
+  C_Polyhedron qh(3, EMPTY);
+  unsigned n = 0;
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i) {
+    add_generator(qh, *i);
+    if (++n % 4 == 0)
+      minimize(qh);
+  }
+
+  nout << endl;
+
+  nout << "*** Size of a constraint system vs size of contained constraints"
+       << endl
+       << "cs.total_memory_in_bytes() = " << cs_total_size
+       << endl;
+
+  memory_size_type cs_elements_size = 0;
+  for (Constraint_System::const_iterator i = cs.begin(),
+         cs_end = cs.end(); i != cs_end; ++i)
+    cs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained constraints = " << cs_elements_size
+       << endl << endl;
+
+  nout << "*** Size of a generator system vs size of contained generators"
+       << endl
+       << "gs.total_memory_in_bytes() = " << gs_total_size
+       << endl;
+
+  memory_size_type gs_elements_size = 0;
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    gs_elements_size += i->total_memory_in_bytes();
+
+  nout << "Sum of sizes of contained generators = " << gs_elements_size
+       << endl << endl;
+
+  return true;
+}
+
+bool test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(4*x - 2*y - z + 14 >= 0);
+  ph.add_constraint(4*x + 2*y - z + 2 >= 0);
+  ph.add_constraint(x + y - 1 >= 0);
+  ph.add_constraint(x + y + 2*z - 5 >= 0);
+
+  const memory_size_type ph_total_size = ph.total_memory_in_bytes();
+  const memory_size_type ph_external_size = ph.external_memory_in_bytes();
+
+  Determinate<C_Polyhedron> dph(ph);
+
+  const memory_size_type dph_total_size = dph.total_memory_in_bytes();
+  const memory_size_type dph_external_size = dph.external_memory_in_bytes();
+
+  nout << "ph.total_memory_in_bytes() = " << ph_total_size
+       << endl
+       << "ph.external_memory_in_bytes() = " << ph_external_size
+       << endl
+       << "dph.total_memory_in_bytes() = " << dph_total_size
+       << endl
+       << "dph.external_memory_in_bytes() = " << dph_external_size
+       << endl;
+
+  Pointset_Powerset<C_Polyhedron> pph(ph);
+
+  C_Polyhedron qh(3);
+  qh.add_constraint(x >= 0);
+  qh.add_constraint(y >= 0);
+  qh.add_constraint(z >= 0);
+  qh.add_constraint(x <= 1);
+  qh.add_constraint(y <= 1);
+  qh.add_constraint(z <= 1);
+  Pointset_Powerset<C_Polyhedron> pqh(qh);
+
+  Pointset_Powerset<C_Polyhedron> prh = pqh;
+  prh.difference_assign(pph);
+
+  const memory_size_type pph_total_size = pph.total_memory_in_bytes();
+  const memory_size_type pph_external_size = pph.external_memory_in_bytes();
+  const memory_size_type pqh_total_size = pqh.total_memory_in_bytes();
+  const memory_size_type pqh_external_size = pqh.external_memory_in_bytes();
+  const memory_size_type prh_total_size = prh.total_memory_in_bytes();
+  const memory_size_type prh_external_size = prh.external_memory_in_bytes();
+
+  nout << "pph.total_memory_in_bytes() = " << pph_total_size
+       << endl
+       << "pph.external_memory_in_bytes() = " << pph_external_size
+       << endl
+       << "pqh.total_memory_in_bytes() = " << pqh_total_size
+       << endl
+       << "pqh.external_memory_in_bytes() = " << pqh_external_size
+       << endl
+       << "prh.total_memory_in_bytes() = " << prh_total_size
+       << endl
+       << "prh.external_memory_in_bytes() = " << prh_external_size
+       << endl;
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F8A(test02);
+END_MAIN
diff --git a/tests/Polyhedron/memory1.cc b/tests/Polyhedron/memory1.cc
new file mode 100644
index 0000000..c8f1e72
--- /dev/null
+++ b/tests/Polyhedron/memory1.cc
@@ -0,0 +1,220 @@
+/* Test the allocation error recovery facility of the library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+// Note: we cannot know, at this stage whether
+// PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK evaluates to true.
+#define PPL_NO_AUTOMATIC_INITIALIZATION
+#include "ppl_test.hh"
+#include <new>
+#include <cstring>
+#include <cerrno>
+#include <cstdlib>
+
+#ifdef PPL_HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+#ifdef PPL_HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+// If GMP does not support exceptions, or if we are unable to limit
+// the memory available to processes using setrlimit(), the test is
+// pointless.
+//
+// On the Itanium the test fails because of the bug reported in
+// http://www.cs.unipr.it/pipermail/ppl-devel/2008-September/012943.html
+//
+// On s390x-linux the test fails, we do not know why (and without access
+// to such a machine there is little we can do).
+// See http://www.cs.unipr.it/pipermail/ppl-devel/2009-April/014489.html
+#if !PPL_GMP_SUPPORTS_EXCEPTIONS || !PPL_CXX_SUPPORTS_LIMITING_MEMORY \
+  || defined(__ia64) || defined(__s390x__)
+
+int
+main() TRY {
+  return 0;
+}
+CATCH
+
+#else // PPL_GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
+
+namespace {
+
+void
+compute_open_hypercube_generators(dimension_type dimension) {
+  NNC_Polyhedron hypercube(dimension);
+  for (dimension_type i = 0; i < dimension; ++i) {
+    Variable x(i);
+    hypercube.add_constraint(x > 0);
+    hypercube.add_constraint(x < 1);
+  }
+  (void) hypercube.generators();
+}
+
+#define LIMIT(WHAT) \
+  do {                                                                  \
+    if (getrlimit(WHAT, &t) != 0) {                                     \
+      std::cerr << "getrlimit failed: " << strerror(errno) << endl;     \
+      exit(1);                                                          \
+    }                                                                   \
+    t.rlim_cur = bytes;                                                 \
+    if (setrlimit(WHAT, &t) != 0) {                                     \
+      std::cerr << "setrlimit failed: " << strerror(errno) << endl;     \
+      exit(1);                                                          \
+    }                                                                   \
+  } while (0)
+
+void
+limit_memory(unsigned long bytes) {
+  struct rlimit t;
+#if PPL_HAVE_DECL_RLIMIT_DATA
+  // Limit heap size.
+  LIMIT(RLIMIT_DATA);
+#endif
+#if PPL_HAVE_DECL_RLIMIT_RSS
+  // Limit resident set size.
+  LIMIT(RLIMIT_RSS);
+#endif
+#if PPL_HAVE_DECL_RLIMIT_VMEM
+  // Limit mapped memory (brk + mmap).
+  LIMIT(RLIMIT_VMEM);
+#endif
+#if PPL_HAVE_DECL_RLIMIT_AS
+  // Limit virtual memory.
+  LIMIT(RLIMIT_AS);
+#endif
+}
+
+bool
+guarded_compute_open_hypercube_generators(dimension_type dimension,
+                                          unsigned long max_memory_in_bytes) {
+  try {
+    limit_memory(max_memory_in_bytes);
+    compute_open_hypercube_generators(dimension);
+    return true;
+  }
+  catch (const std::bad_alloc&) {
+    nout << "out of virtual memory" << endl;
+    return false;
+  }
+  catch (...) {
+    exit(1);
+  }
+  // Should never get here.
+  exit(1);
+}
+
+} // namespace
+
+extern "C" void*
+cxx_malloc(size_t size) {
+  void* p = malloc(size);
+  if (p != 0 || size == 0)
+    return p;
+
+  throw std::bad_alloc();
+}
+
+extern "C" void*
+cxx_realloc(void* q, size_t, size_t new_size) {
+  void* p = realloc(q, new_size);
+  if (p != 0 || new_size == 0)
+    return p;
+
+  throw std::bad_alloc();
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+  free(p);
+}
+
+#define INIT_MEMORY 3*1024*1024
+
+#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+ppl_set_GMP_memory_allocation_functions(void) {
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+}
+#endif // PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+int
+main() TRY {
+#if !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+#endif // !PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+  // Note: we have included <ppl.hh> under the definition of
+  // PPL_NO_AUTOMATIC_INITIALIZATION.
+  Parma_Polyhedra_Library::initialize();
+
+  set_handlers();
+
+  // Find a dimension that cannot be computed with INIT_MEMORY bytes.
+  dimension_type dimension = 0;
+  do {
+    ++dimension;
+    nout << "Trying dimension " << dimension << endl;
+  } while (guarded_compute_open_hypercube_generators(dimension, INIT_MEMORY));
+
+  // Now find an upper bound to the memory necessary to compute it.
+  unsigned long upper_bound = INIT_MEMORY;
+  do {
+    upper_bound *= 2;
+    nout << "Trying upper bound " << upper_bound << endl;
+  } while (!guarded_compute_open_hypercube_generators(dimension, upper_bound));
+
+  // Search the "exact" amount of memory.
+  int lower_bound = upper_bound/2;
+  do {
+    int test_memory = (lower_bound+upper_bound)/2;
+    nout << "Probing " << test_memory << endl;
+    if (guarded_compute_open_hypercube_generators(dimension, test_memory))
+      upper_bound = test_memory;
+    else
+      lower_bound = test_memory;
+  } while (upper_bound-lower_bound > 1024);
+
+  nout << "Estimated memory for dimension " << dimension
+       << ": " << (lower_bound+upper_bound)/2 << " bytes" << endl;
+
+  // Note: we have included <ppl.hh> under the definition of
+  // PPL_NO_AUTOMATIC_INITIALIZATION.
+  Parma_Polyhedra_Library::finalize();
+
+  return 0;
+}
+CATCH
+
+#endif // PPL_GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
diff --git a/tests/Polyhedron/memory2.cc b/tests/Polyhedron/memory2.cc
new file mode 100644
index 0000000..fcd2c84
--- /dev/null
+++ b/tests/Polyhedron/memory2.cc
@@ -0,0 +1,259 @@
+/* Test the allocation error recovery facility of the library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <new>
+#include <cstdlib>
+#include <limits>
+
+// If GMP does not support exceptions the test is pointless.
+#if !PPL_GMP_SUPPORTS_EXCEPTIONS
+
+int
+main() TRY {
+  return 0;
+}
+CATCH
+
+#else // PPL_GMP_SUPPORTS_EXCEPTIONS
+
+namespace {
+
+bool before_main;
+
+unsigned long mallocated = 0;
+unsigned long reallocated = 0;
+unsigned long freed = 0;
+unsigned long malloc_threshold = 0;
+unsigned long realloc_threshold = 0;
+
+void
+reset_allocators(unsigned long new_malloc_threshold,
+                 unsigned long new_realloc_threshold) {
+  mallocated = reallocated = freed = 0;
+  malloc_threshold = new_malloc_threshold;
+  realloc_threshold = new_realloc_threshold;
+}
+
+void
+fail_if_leaked() {
+  if (mallocated != freed) {
+    nout << "Memory leak: allocated " << mallocated
+         << ", freed " << freed
+         << endl;
+    exit(1);
+  }
+  else {
+    nout << "allocated = freed = " << mallocated
+         << endl;
+  }
+}
+
+extern "C" void*
+cxx_malloc(size_t size) {
+  if (mallocated >= malloc_threshold) {
+    nout << "std::bad_alloc thrown from cxx_malloc()" << endl;
+    throw std::bad_alloc();
+  }
+
+  void* p = malloc(size);
+  if (p != 0 || size == 0) {
+    if (!before_main)
+      vnout << "allocated " << size << " @ " << p << endl;
+    ++mallocated;
+    return p;
+  }
+
+  nout << "malloc() returned 0: std::bad_alloc thrown from cxx_malloc()"
+       << endl;
+  throw std::bad_alloc();
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+  free(p);
+  if (!before_main)
+    vnout << "freed " << p << endl;
+  ++freed;
+}
+
+extern "C" void*
+cxx_realloc(void* q, size_t old_size, size_t new_size) {
+  if (q == 0)
+    return cxx_malloc(new_size);
+
+  if (new_size == 0) {
+    cxx_free(q, old_size);
+    return 0;
+  }
+
+  if (new_size <= old_size) {
+    void* p = realloc(q, new_size);
+    if (p != 0 || new_size == 0) {
+      if (!before_main)
+        vnout << "reallocated " << old_size << " @ " << p
+              << " down to " << new_size << " @ " << p
+              << endl;
+      return p;
+    }
+
+    nout << "malloc() returned 0: std::bad_alloc thrown from cxx_malloc()"
+         << endl;
+    throw std::bad_alloc();
+  }
+
+  assert(new_size > old_size);
+  if (reallocated >= realloc_threshold) {
+    if (!before_main)
+      nout << "std::bad_alloc thrown from cxx_realloc()" << endl;
+    throw std::bad_alloc();
+  }
+
+  void* p = realloc(q, new_size);
+  if (p != 0 || new_size == 0) {
+    if (!before_main)
+      vnout << "reallocated " << old_size << " @ " << q
+            << " up to " << new_size << " @ " << p
+            << endl;
+    ++reallocated;
+    return p;
+  }
+
+  nout << "malloc() returned 0: std::bad_alloc thrown from cxx_malloc()"
+       << endl;
+  throw std::bad_alloc();
+}
+
+void
+test1() {
+  nout << "test1()" << endl;
+
+  reset_allocators(6, ULONG_MAX);
+  try {
+    Matrix<Dense_Row>* matrix = new Matrix<Dense_Row>(2, 5);
+    // We will get here only if no exception is thrown:
+    // this happens when using native coefficients.
+    delete matrix;
+  }
+  catch (const std::bad_alloc&) {
+    nout << "std::bad_alloc caught" << endl;
+    fail_if_leaked();
+  }
+  catch (...) {
+    nout << "exception different from std::bad_alloc caught" << endl;
+    fail_if_leaked();
+  }
+}
+
+enum Threshold { Malloc, Realloc };
+
+void
+test_every_allocation(const dimension_type d, const Threshold threshold) {
+  // Run once without checking so as to allow for the allocation of
+  // statically allocated coefficients.
+  bool dry_run = true;
+  unsigned long k = ULONG_MAX;
+  bool go_ahead;
+  do {
+    nout << "**************** k = " << k << " ****************" << endl;
+    if (dry_run)
+      nout << "*************** dry run ***************" << endl;
+    go_ahead = dry_run;
+    if (threshold == Malloc)
+      reset_allocators(k, ULONG_MAX);
+    else
+      reset_allocators(ULONG_MAX, k);
+    try {
+      C_Polyhedron ph(d);
+      ph.add_constraint(Variable(0) == ULONG_MAX);
+      for (dimension_type i = 1; i < d; ++i)
+        ph.add_constraint(Variable(i) == ULONG_MAX*Variable(i-1));
+
+      (void) ph.minimized_generators();
+    }
+    catch (const std::bad_alloc&) {
+      nout << "std::bad_alloc caught" << endl;
+      fail_if_leaked();
+      go_ahead = true;
+      ++k;
+    }
+    catch (...) {
+      nout << "exception different from std::bad_alloc caught" << endl;
+      fail_if_leaked();
+      // Notice that we do not go ahead if we did not catch a bad_alloc.
+    }
+    if (dry_run) {
+      dry_run = false;
+      k = 0;
+    }
+  } while (go_ahead);
+}
+
+void
+test2() {
+  nout << "test2()" << endl;
+  test_every_allocation(5, Malloc);
+}
+
+void
+test3() {
+  nout << "test3()" << endl;
+  test_every_allocation(10, Realloc);
+}
+
+
+} // namespace
+
+#define IGNORE_OVERFLOWS(fun)                   \
+  try {                                         \
+    fun;                                        \
+  }                                             \
+  catch (const std::overflow_error&) {          \
+  }
+
+extern "C" void
+ppl_set_GMP_memory_allocation_functions() {
+  before_main = true;
+  // Allow the static coefficients of the library to be allocated
+  // without any limit.
+  reset_allocators(ULONG_MAX, ULONG_MAX);
+  mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+}
+
+int
+main() TRY {
+  before_main = false;
+
+  set_handlers();
+
+  // The point of this test is to detect memory leaks.
+  // So we plainly ignore overflow exceptions.
+  IGNORE_OVERFLOWS(test1());
+  IGNORE_OVERFLOWS(test2());
+  IGNORE_OVERFLOWS(test3());
+
+  return 0;
+}
+CATCH
+
+#endif // PPL_GMP_SUPPORTS_EXCEPTIONS
diff --git a/tests/Polyhedron/minconstraints1.cc b/tests/Polyhedron/minconstraints1.cc
new file mode 100644
index 0000000..ad02887
--- /dev/null
+++ b/tests/Polyhedron/minconstraints1.cc
@@ -0,0 +1,78 @@
+/* Test Polyhedron::minimized_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(A + B >= -2);
+  ph1.add_constraint(A >= -3);
+
+  const Constraint_System cs = ph1.minimized_constraints();
+
+  C_Polyhedron ph2(cs);
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (known_result == ph2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result;
+  known_result = ph1;
+
+  Constraint_System cs = ph1.minimized_constraints();
+
+  C_Polyhedron ph2(cs);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(cs, "*** cs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/minconstraints2.cc b/tests/Polyhedron/minconstraints2.cc
new file mode 100644
index 0000000..fecb201
--- /dev/null
+++ b/tests/Polyhedron/minconstraints2.cc
@@ -0,0 +1,71 @@
+/* Test Polyhedron::minimized_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+  NNC_Polyhedron ph1;
+
+  Constraint_System cs = ph1.minimized_constraints();
+
+  NNC_Polyhedron ph2(cs);
+
+  const Constraint_System& min_cs = ph2.minimized_constraints();
+
+  bool ok = (ph1 == ph2
+             && min_cs.begin() == min_cs.end());
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  cs.insert(y > 0);
+
+  NNC_Polyhedron ph(cs);
+  const Constraint_System& min_cs = ph.minimized_constraints();
+  return std::distance(min_cs.begin(), min_cs.end()) == 3;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Polyhedron/mingenerators1.cc b/tests/Polyhedron/mingenerators1.cc
new file mode 100644
index 0000000..ad6ebb8
--- /dev/null
+++ b/tests/Polyhedron/mingenerators1.cc
@@ -0,0 +1,86 @@
+/* Test Polyhedron::minimized_generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(point(B));
+  gs1.insert(line(A));
+  gs1.insert(ray(B));
+  gs1.insert(ray(A + B));
+  gs1.insert(ray(-A + B));
+
+  C_Polyhedron ph1(gs1);
+
+  const Generator_System gs2 = ph1.minimized_generators();
+
+  print_generators(gs2, "*** gs2 ***");
+
+  C_Polyhedron ph2(gs2);
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(line(A));
+  known_gs.insert(ray(B));
+  C_Polyhedron known_result(known_gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  Generator_System gs = ph1.minimized_generators();
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generators(gs);
+
+  bool ok = (ph2 == known_result);
+
+  print_generators(gs, "*** gs ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/mingenerators2.cc b/tests/Polyhedron/mingenerators2.cc
new file mode 100644
index 0000000..8dbb799
--- /dev/null
+++ b/tests/Polyhedron/mingenerators2.cc
@@ -0,0 +1,49 @@
+/* Test Polyhedron::minimized_generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  NNC_Polyhedron ph1;
+
+  Generator_System gs = ph1.minimized_generators();
+
+  NNC_Polyhedron ph2(gs);
+
+  bool ok = (ph1 == ph2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(gs, "*** gs ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/nncminimize1.cc b/tests/Polyhedron/nncminimize1.cc
new file mode 100644
index 0000000..6b8da8c
--- /dev/null
+++ b/tests/Polyhedron/nncminimize1.cc
@@ -0,0 +1,380 @@
+/* Test minimization of NNC polyhedra.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 6);
+  cs.insert(y >= 0);
+  cs.insert(y <= 6);
+
+  NNC_Polyhedron ph(cs);
+
+  nout << "Topologically closed square" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  // Removing all the vertices using strict inequalities.
+  cs.clear();
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 12);
+  cs.insert(x - y < 6);
+  cs.insert(x - y > -6);
+
+  ph.add_constraints(cs);
+
+  nout << "After vertices removal:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_generators();
+
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(6*x));
+  gs.insert(closure_point(6*y));
+  gs.insert(closure_point(6*x + 6*y));
+  gs.insert(point(3*x));
+  gs.insert(point(3*y));
+  gs.insert(point(3*x + 6*y));
+  gs.insert(point(6*x + 3*y));
+
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
+
+  nout << "After NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  return ok && ok1;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  NNC_Polyhedron ph(cs);
+
+  nout << "Topologically closed square" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  // Removing all the vertices using strict inequalities.
+  cs.clear();
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 2);
+  cs.insert(x - y < 1);
+  cs.insert(x - y > -1);
+
+  ph.add_constraints(cs);
+
+  nout << "After vertices removal:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_generators();
+
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(x));
+  gs.insert(closure_point(y));
+  gs.insert(closure_point(x + y));
+  gs.insert(point(x, 10));
+  gs.insert(point(y, 10));
+  gs.insert(point(x + 10*y, 10));
+  gs.insert(point(10*x + y, 10));
+
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 8);
+
+  nout << "After NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+  nout << endl;
+  nout << "known result" << endl;
+  print_constraints(known_result.constraints(), "*** known constraints ***");
+  print_generators(known_result.generators(), "*** known generators ***");
+
+  return ok && ok1;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building a square.
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+
+  NNC_Polyhedron ph(cs);
+
+  nout << "Topologically closed square" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  // Removing all the vertices using strict inequalities.
+  cs.clear();
+  cs.insert(x + y > 0);
+  cs.insert(x + y < 2);
+  cs.insert(x - y < 1);
+  cs.insert(x - y > -1);
+
+  ph.add_constraints(cs);
+
+  nout << "After vertices removal:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  Generator_System gs;
+  gs.insert(point(x + y, 4));
+  gs.insert(point(x + 5*y, 4));
+  gs.insert(point(5*x + y, 4));
+  gs.insert(point(5*x + 5*y, 4));
+
+  NNC_Polyhedron ph2(gs);
+
+  ph.intersection_assign(ph2);
+
+  nout << "After intersection:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_generators();
+
+  gs.clear();
+  gs.insert(closure_point(x + y));
+  gs.insert(point(x + y, 4));
+  gs.insert(point(x + 4*y, 4));
+  gs.insert(point(4*x + y, 4));
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 4);
+
+  nout << "After NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  return ok && ok1;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  // Building an open square.
+  Generator_System gs;
+  gs.insert(closure_point());
+  gs.insert(closure_point(15*x));
+  gs.insert(closure_point(15*y));
+  gs.insert(closure_point(15*x + 15*y));
+
+  // All of these points, but a (any) single one of them, are redundant.
+  gs.insert(point(3*x + 3*y));
+  gs.insert(point(6*x + y));
+  gs.insert(point(9*x + y));
+  gs.insert(point(12*x + 3*y));
+  gs.insert(point(3*x + 12*y));
+  gs.insert(point(6*x + 14*y));
+  gs.insert(point(9*x + 14*y));
+  gs.insert(point(12*x + 12*y));
+  gs.insert(point(x + 6*y));
+  gs.insert(point(x + 9*y));
+  gs.insert(point(14*x + 6*y));
+  gs.insert(point(14*x + 9*y));
+
+  NNC_Polyhedron ph(gs);
+
+  nout << endl << "Before NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_constraints();
+
+  nout << endl << "After NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  gs.clear();
+  gs.insert(closure_point());
+  gs.insert(closure_point(15*x));
+  gs.insert(closure_point(15*y));
+  gs.insert(closure_point(15*x + 15*y));
+  gs.insert(point(x + y));
+
+  NNC_Polyhedron known_result(gs);
+  bool ok = (ph == known_result);
+
+  const Generator_System& min_gs = ph.minimized_generators();
+  bool ok1 = (std::distance(min_gs.begin(), min_gs.end()) == 5);
+
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  print_constraints(known_result.constraints(),
+                    "*** known_result constraints ***");
+  print_generators(known_result.generators(),
+                   "*** known_result generators ***");
+  return ok && ok1;
+}
+
+bool
+test05() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x < 2);
+
+  NNC_Polyhedron ph1(cs);
+
+  cs.clear();
+  cs.insert(x > 2);
+  cs.insert(x < 3);
+
+  NNC_Polyhedron ph2(cs);
+
+  ph1.upper_bound_assign(ph2);
+  (void) ph1.is_empty();
+
+  nout << "(Weakly) minimized poly hull" << endl;
+  print_constraints(ph1.constraints(), "*** ph1 constraints ***");
+  print_generators(ph1.generators(), "*** ph1 generators ***");
+
+  NNC_Polyhedron copy_ph1(ph1);
+
+  const Constraint_System& ph1_cs = ph1.constraints();
+  const int num_constraints = std::distance(ph1_cs.begin(), ph1_cs.end());
+
+  const Constraint_System& ph1_min_cs = ph1.minimized_constraints();
+  const int num_minimized_constraints = std::distance(ph1_min_cs.begin(),
+                                                      ph1_min_cs.end());
+
+  print_constraints(ph1, "*** after ph1.minimized_constraints() ***");
+  nout << "num_constraints = " << num_constraints << endl;
+  nout << "num_minimized_constraints = "
+       << num_minimized_constraints << endl;
+
+  int num_points = 0;
+  for (Generator_System::const_iterator i = copy_ph1.generators().begin(),
+         gs_end = copy_ph1.generators().end(); i != gs_end; ++i)
+    if ((*i).is_point() || (*i).is_closure_point())
+      ++num_points;
+
+  copy_ph1.minimized_generators();
+
+  int num_minimized_points = 0;
+  for (Generator_System::const_iterator i = copy_ph1.generators().begin(),
+         gs_end = copy_ph1.generators().end(); i != gs_end; ++i)
+    if ((*i).is_point() || (*i).is_closure_point())
+      ++num_minimized_points;
+
+  bool ok = (num_constraints == num_minimized_constraints + 1
+             && num_points == num_minimized_points + 1);
+
+  print_generators(copy_ph1,
+                   "*** after copy_ph1_minimized_generators() ***");
+  nout << "num_points = " << num_points << endl;
+  nout << "num_minimized_points = "
+       << num_minimized_points << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+
+  Constraint_System cs;
+  cs.insert(x > 0);
+
+  NNC_Polyhedron ph(cs);
+
+  cs.clear();
+  cs.insert(3*x >= 1);
+  cs.insert(2*x <= 1);
+
+  ph.add_constraints(cs);
+
+  nout << endl << "Before NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  ph.minimized_constraints();
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(3*x >= 1);
+  known_result.add_constraint(2*x <= 1);
+
+  bool ok = (ph == known_result);
+
+  nout << endl << "After NNC minimization:" << endl;
+  print_constraints(ph.constraints(), "*** ph constraints ***");
+  print_generators(ph.generators(), "*** ph generators ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8A(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST_F8(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/nncminimize2.cc b/tests/Polyhedron/nncminimize2.cc
new file mode 100644
index 0000000..e6cd0bc
--- /dev/null
+++ b/tests/Polyhedron/nncminimize2.cc
@@ -0,0 +1,81 @@
+/* Test NNC_Polyhedron::ph.minimized_generators().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  NNC_Polyhedron ph(5, EMPTY);
+  ph.add_generator(point(52131*A + 11369*B - 483036*C - 776212*D - 401649*E));
+  ph.add_generator(point(-80461*A + 86836*B + 88698*C - 269590*D + 951545*E));
+  ph.add_generator(point(215169*A - 42532*B + 234755*C + 705077*D - 632177*E));
+  ph.add_generator(point(-294493*A - 44546*B + 861680*C + 344228*D + 224283*E));
+  ph.add_generator(point(-158536*A + 273936*B - 854715*C - 151614*D + 382491*E));
+  ph.add_generator(point(-207881*A - 205091*B - 385540*C + 729319*D + 483915*E));
+  ph.add_generator(point(-1084*A + 2507*B - 28428*C + 1882*D - 999590*E));
+
+  ph.add_generator(point(450943*A - 416394*B + 883*C + 680432*D - 400345*E));
+  ph.add_generator(point(-483589*A - 16983*B - 824243*C + 106969*D - 273921*E));
+  ph.add_generator(point(554952*A - 155460*B - 572886*C - 91530*D + 575571*E));
+  ph.ascii_dump(vnout);
+  vnout << endl;
+
+  const Generator_System& gs = ph.minimized_generators();
+  ph.ascii_dump(vnout);
+  vnout << endl;
+
+  if (!ph.OK())
+    return false;
+
+  bool ok = true;
+  unsigned num_points = 0;
+  for (Generator_System::const_iterator i = gs.begin(), gs_end = gs.end();
+       i != gs_end;
+       ++i) {
+    using namespace IO_Operators;
+    nout << *i << endl;
+    if (i->type() != Generator::POINT) {
+      nout << "i->type() == " << i->type() << endl;
+      ok = false;
+    }
+    ++num_points;
+  }
+
+  nout << "points = " << num_points << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Polyhedron/nncpostimeelapse1.cc b/tests/Polyhedron/nncpostimeelapse1.cc
new file mode 100644
index 0000000..b6d4048
--- /dev/null
+++ b/tests/Polyhedron/nncpostimeelapse1.cc
@@ -0,0 +1,432 @@
+/* Test Polyhedron::positive_time_elapse_assign().
+   Copyright (C)      2013 Marco Faella <marfaella at gmail.com>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Positive time elapse between: the origin and an open half-plane.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x == 0);
+  ph1.add_constraint(y == 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(x>0);
+
+  bool ok = (ph1 == known_result);
+
+  return ok;
+}
+
+// Positive time elapse between: a square without a side and a half-strip.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x <= 1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 1);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 0);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y < 0);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(x>0);
+  known_result.add_constraint(y<1);
+
+  bool ok = (ph1 == known_result);
+
+  return ok;
+}
+
+// Positive time elapse between: a closed square and an unbounded C-polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 1);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y <= 0);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  return ok;
+}
+
+// The same as test03, but with two NNC polyhedra.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 1);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y <= 0);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = (ph1 == known_result);
+
+  return ok;
+}
+
+// Positive time elapse between the universe and a point.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x == 1);
+  ph2.add_constraint(y == 1);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+
+  bool ok = (ph1 == known_result);
+
+  return ok;
+}
+
+// Positive time elapse between a point and the universe.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(y == 1);
+
+  NNC_Polyhedron ph2(2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+// Positive time elapse between two rational points with different
+// denominators.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(x+y,2));
+
+  NNC_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(x+y,3));
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(2*x > 1);
+  known_result.add_constraint(x == y);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+
+// Positive time elapse between Polyhedra with two different dimensions.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(1);
+  ph1.add_constraint(x > 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 0);
+  ph2.add_constraint(y > 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  bool known_result = false;
+
+  try
+  {
+    ph1.positive_time_elapse_assign(ph2);
+    print_generators(ph1, "*** ph1_positive_time_elapse_assign(ph2) ***");
+  }
+  catch (std::invalid_argument& e)
+  {
+    known_result=true;
+  }
+
+  bool ok = (known_result == true);
+  return ok;
+}
+
+
+// Positive time elapse between two zero-dimensional polyhedra where
+// the second one is empty.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(0);
+
+  NNC_Polyhedron ph2(0, EMPTY);
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+// Positive time elapse between a polyhedron and the empty polyhedron.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(y > 1);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+// Positive time elapse between the empty polyhedron and another polyhedron.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 0);
+  ph2.add_constraint(y > 1);
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+// Positive time elapse between an empty polyhedron with non-processed
+// pending constraints and a normal polyhedron.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 255);
+  ph1.add_constraint(x <= 257);
+  ph1.add_constraint(y >= 255);
+  ph1.add_constraint(y <= 257);
+
+  Variables_Set vars(x, y);
+
+  // Defines constraints of an empty polyhedron.
+  Constraint_System cs;
+  cs.insert(x > y);
+  cs.insert(x < y);
+
+  // Adding pending constraints.
+  ph1.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, false);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 0);
+  ph2.add_constraint(y > 1);
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+// Positive time elapse between a normal polyhedron and an empty
+// polyhedron with non-processed pending constraints.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(y > 1);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x >= 255);
+  ph2.add_constraint(x <= 257);
+  ph2.add_constraint(y >= 255);
+  ph2.add_constraint(y <= 257);
+
+  Variables_Set vars(x, y);
+
+  // Defines constraints of an EMPTY Polyhedron
+  Constraint_System cs;
+  cs.insert(x > y);
+  cs.insert(x < y);
+
+  // Adding pending constraints
+  ph2.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, true);
+
+  ph1.positive_time_elapse_assign(ph2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph1 == known_result);
+  return ok;
+}
+
+} // namespace
+
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/numberinput1.cc b/tests/Polyhedron/numberinput1.cc
new file mode 100644
index 0000000..890e322
--- /dev/null
+++ b/tests/Polyhedron/numberinput1.cc
@@ -0,0 +1,354 @@
+/* Test number input.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <string>
+#include <sstream>
+#include <cstdlib>
+
+namespace {
+
+using namespace Checked;
+
+struct Test_Extended_Number_Policy {
+  const_bool_nodef(check_overflow, true);
+  const_bool_nodef(check_inf_add_inf, false);
+  const_bool_nodef(check_inf_sub_inf, false);
+  const_bool_nodef(check_inf_mul_zero, false);
+  const_bool_nodef(check_div_zero, false);
+  const_bool_nodef(check_inf_div_inf, false);
+  const_bool_nodef(check_inf_mod, false);
+  const_bool_nodef(check_sqrt_neg, false);
+  const_bool_nodef(has_nan, true);
+  const_bool_nodef(has_infinity, true);
+  const_bool_nodef(fpu_check_inexact, false);
+  const_bool_nodef(check_nan_result, true);
+  static const Rounding_Dir ROUND_DEFAULT = ROUND_UP;
+  static void handle_result(Result r);
+};
+
+inline void
+Test_Extended_Number_Policy::handle_result(Result r) {
+  if (r == V_NAN)
+    return;
+  Extended_Number_Policy::handle_result(r);
+}
+
+bool
+aux_test(std::string input_string,
+         std::string expected_output,
+         std::string expected_residual,
+         Result expected_result) {
+  std::stringstream input_stream(input_string);
+  Checked_Number<mpq_class, Test_Extended_Number_Policy> value;
+  Result result = input(value, input_stream, ROUND_UP);
+  // NOTE: clear input_stream status bits, since otherwise the next call
+  // to getline will retrieve nothing at all.
+  input_stream.clear();
+  std::string residual;
+  getline(input_stream, residual, '\0');
+  std::stringstream output_stream;
+  output_stream << value;
+  std::string output = output_stream.str();
+
+  bool ok = (result == expected_result
+             && residual == expected_residual
+             && output == expected_output);
+
+  nout << "input = \"" << input_string << "\""
+       << endl
+       << "expected result = " << expected_result
+       << ", actual result = " << result
+       << endl
+       << "expected value = \"" << expected_output << "\""
+       << ", actual value = \"" << output << "\""
+       << endl
+       << "expected residual = \"" << expected_residual << "\""
+       << ", actual residual = \"" << residual << "\""
+       << endl;
+
+  return ok;
+}
+
+// Testing symbols.
+bool
+test01() {
+  return aux_test("inf", "+inf", "", V_EQ_PLUS_INFINITY)
+    && aux_test("InF", "+inf", "", V_EQ_PLUS_INFINITY)
+    && aux_test("+inF", "+inf", "", V_EQ_PLUS_INFINITY)
+    && aux_test("-InF", "-inf", "", V_EQ_MINUS_INFINITY)
+    && aux_test("-InFinity", "-inf", "inity", V_EQ_MINUS_INFINITY)
+    && aux_test("Inf7", "+inf", "7", V_EQ_PLUS_INFINITY)
+    && aux_test("nan", "nan", "", V_NAN)
+    && aux_test("NAN", "nan", "", V_NAN)
+    && aux_test("Nan", "nan", "", V_NAN);
+}
+
+// Testing symbols with trailing input and errors.
+bool
+test02() {
+  return aux_test("nAn+", "nan", "+", V_NAN)
+    && aux_test("naN/", "nan", "/", V_NAN)
+    && aux_test("nAN/0", "nan", "/0", V_NAN)
+    && aux_test("nAN/-3", "nan", "/-3", V_NAN)
+    && aux_test("inF/3", "+inf", "/3", V_EQ_PLUS_INFINITY)
+    && aux_test("Inf/-3", "+inf", "/-3", V_EQ_PLUS_INFINITY)
+    && aux_test("-inf/-3", "-inf", "/-3", V_EQ_MINUS_INFINITY)
+    && aux_test("-NAn", "nan", "NAn", V_CVT_STR_UNK);
+}
+
+// Testing integers.
+bool
+test03() {
+  return aux_test("  -  2", "nan", "  2", V_CVT_STR_UNK)
+    && aux_test("15", "15", "", V_EQ)
+    && aux_test("34976098", "34976098", "", V_EQ)
+    && aux_test("34976098349760983497609834976098",
+                "34976098349760983497609834976098", "", V_EQ)
+    && aux_test("3/-inf", "nan", "", V_CVT_STR_UNK)
+    && aux_test("+77", "77", "", V_EQ)
+    && aux_test("-77", "-77", "", V_EQ)
+    && aux_test("-7777777777777777777777777",
+                "-7777777777777777777777777", "", V_EQ)
+    && aux_test("-77 ", "-77", " ", V_EQ)
+    && aux_test("-77   ", "-77", "   ", V_EQ)
+    && aux_test("-77ab", "-77", "ab", V_EQ)
+    && aux_test("-77,33", "-77", ",33", V_EQ)
+    && aux_test(" -  2", "nan", "  2", V_CVT_STR_UNK);
+}
+
+// Testing fractions.
+bool
+test04() {
+  return aux_test("71.3", "713/10", "", V_EQ)
+    && aux_test("0.123456", "1929/15625", "", V_EQ)
+    && aux_test("12345678910111213141516.12345678910111213141516",
+                "308641972752780328537903086419727527803285379/25000000000000000000000",
+                "", V_EQ)
+    && aux_test("0.123456 101", "1929/15625", " 101", V_EQ)
+    && aux_test("0.123456   101", "1929/15625", "   101", V_EQ)
+    && aux_test("0.123456     ", "1929/15625", "     ", V_EQ)
+    && aux_test(".499975", "19999/40000", "", V_EQ)
+    && aux_test(".333", "333/1000", "", V_EQ)
+    && aux_test("+.333", "333/1000", "", V_EQ)
+    && aux_test("-.333", "-333/1000", "", V_EQ)
+    && aux_test(".0x333", "0", "x333", V_EQ);
+}
+
+// Testing exponent.
+bool
+test05() {
+  return aux_test("15e1", "150", "", V_EQ)
+    && aux_test("15*^8", "1500000000", "", V_EQ)
+    && aux_test("1*^009", "1000000000", "", V_EQ)
+    && aux_test("15*^111",
+                "15000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+                "", V_EQ)
+    && aux_test("151515e+1", "1515150", "", V_EQ)
+    && aux_test("151515151515151515e+1", "1515151515151515150", "", V_EQ)
+    && aux_test("9200e-2", "92", "", V_EQ)
+    && aux_test("15*^7e4", "150000000", "e4", V_EQ)
+    && aux_test("15*^6/", "nan", "", V_CVT_STR_UNK)
+    && aux_test("9200e", "nan", "", V_CVT_STR_UNK)
+    && aux_test("9200ea", "nan", "a", V_CVT_STR_UNK)
+    && aux_test("9200*^", "nan", "", V_CVT_STR_UNK)
+    && aux_test("9200*^b", "nan", "b", V_CVT_STR_UNK)
+    // Exponent and fraction.
+    && aux_test("5.3e3", "5300", "", V_EQ)
+    && aux_test("2.2e-1", "11/50", "", V_EQ)
+    && aux_test("5.33333*^-4", "533333/1000000000", "", V_EQ)
+    && aux_test("-2.20001*^+3", "-220001/100", "", V_EQ)
+    && aux_test("7.e", "nan", "", V_CVT_STR_UNK)
+    && aux_test("7.0 e3", "7", " e3", V_EQ);
+}
+
+// Testing exponent size limit.
+bool
+test06() {
+  std::stringstream ss;
+  ss << "1e" << (LONG_MAX / 10) + 1 << "0";
+  std::stringstream ss2;
+  ss2 << "1e" << (LONG_MAX / 10) << (LONG_MAX % 10) + 1;
+  return aux_test(ss.str(), "nan", "", V_CVT_STR_UNK)
+    && aux_test(ss2.str(), "nan", "", V_CVT_STR_UNK);
+}
+
+// Testing hexadecimals.
+bool
+test07() {
+  return aux_test("0x", "nan", "", V_CVT_STR_UNK)
+    && aux_test("0xx", "nan", "x", V_CVT_STR_UNK)
+    && aux_test("0x0.f", "15/16", "", V_EQ)
+    && aux_test("0x.f", "15/16", "", V_EQ)
+    && aux_test("0x.fp3", "15/2", "", V_EQ)
+    && aux_test("16^^.fp3", "15/2", "", V_EQ)
+    && aux_test("0x100p-9", "1/2", "", V_EQ)
+    && aux_test("16^^100p-9", "1/2", "", V_EQ)
+    && aux_test("100p-9", "nan", "p-9", V_CVT_STR_UNK)
+    && aux_test("0x.f*^1", "15", "", V_EQ)
+    && aux_test("0x-f", "nan", "-f", V_CVT_STR_UNK)
+    && aux_test("0xfa", "250", "", V_EQ)
+    && aux_test("-0xfa", "-250", "", V_EQ)
+    && aux_test("-0x000000000000000000000000fa", "-250", "", V_EQ)
+    && aux_test("-0xfaz", "-250", "z", V_EQ)
+    && aux_test("-0xfa .", "-250", " .", V_EQ)
+    && aux_test("0xfa0xfa", "4000", "xfa", V_EQ)
+    && aux_test("0x0b123", "45347", "", V_EQ);
+}
+
+// Testing hexadecimals fractions and exponents.
+bool
+test08() {
+  return
+    // Fraction.
+    aux_test("0xfa.a", "2005/8", "", V_EQ)
+    && aux_test("0xfa.ay", "2005/8", "y", V_EQ)
+    && aux_test("-0xfa.", "-250", "", V_EQ)
+    // Exponent.
+    && aux_test("0x1e2", "482", "", V_EQ)
+    && aux_test("0x1*^2", "256", "", V_EQ)
+    && aux_test("0x1*^2-1", "256", "-1", V_EQ)
+    // Fraction and exponent.
+    && aux_test("0x0.1*^3", "256", "", V_EQ)
+    && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-2",
+                "-493504168323155221903720496056512238754896365637429427/590295810358705651712",
+                "", V_EQ)
+    && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20",
+                "-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552",
+                "", V_EQ)
+    && aux_test("-0x29382a093589c501594f729e672567.2f09f342582b4598*^-20b",
+                "-493504168323155221903720496056512238754896365637429427/2787593149816327892691964784081045188247552",
+                "b", V_EQ)
+    && aux_test("0x0.1*^3   -0", "256", "   -0", V_EQ);
+}
+
+// Testing bases.
+bool
+test09() {
+  return aux_test("3^^", "nan", "", V_CVT_STR_UNK)
+    && aux_test("3^^z", "nan", "z", V_CVT_STR_UNK)
+    && aux_test("^^3", "nan", "^^3", V_CVT_STR_UNK)
+    && aux_test("3^^1", "1", "", V_EQ)
+    && aux_test("2^^0", "0", "", V_EQ)
+    && aux_test("2^^1", "1", "", V_EQ)
+    && aux_test("2^^10", "2", "", V_EQ)
+    && aux_test("2^^11", "3", "", V_EQ)
+    && aux_test("36^^z", "35", "", V_EQ)
+    && aux_test("36^^yz", "1259", "", V_EQ)
+    && aux_test("36^^xyz", "44027", "", V_EQ)
+    && aux_test("37^^2", "nan", "^2", V_CVT_STR_UNK)
+    && aux_test("37^^1.1", "nan", "^1.1", V_CVT_STR_UNK)
+    && aux_test("2^^113", "3", "3", V_EQ)
+    && aux_test("2^^11 3", "3", " 3", V_EQ)
+    && aux_test("3^^e2", "nan", "e2", V_CVT_STR_UNK);
+}
+
+// Testing bases with fractions and exponents.
+bool
+test10() {
+  return
+    // Fraction.
+    aux_test("2^^11.1", "7/2", "", V_EQ)
+    && aux_test("2^^11.1a", "7/2", "a", V_EQ)
+    && aux_test("2^^11.1.", "7/2", ".", V_EQ)
+    && aux_test("2^^11.1   ", "7/2", "   ", V_EQ)
+    // Exponent.
+    && aux_test("10^^2e3", "2000", "", V_EQ)
+    && aux_test("8^^2e3", "1024", "", V_EQ)
+    && aux_test("8^^2e38", "41538374868278621028243970633760768", "", V_EQ)
+    && aux_test("8^^2e3e", "1024", "e", V_EQ)
+    // Fraction and exponent.
+    && aux_test("8^^2.1e3", "1088", "", V_EQ)
+    && aux_test("8^^20402543.120347e7", "9073863231288", "", V_EQ)
+    && aux_test("8^^2.18e3", "17/8", "8e3", V_EQ);
+}
+
+// Testing denominators.
+bool
+test11() {
+  return aux_test("15/0", "nan", "", V_NAN)
+    && aux_test("15/1", "15", "", V_EQ)
+    && aux_test("15/3", "5", "", V_EQ)
+    && aux_test("15/-3", "-5", "", V_EQ)
+    && aux_test("15/3f", "5", "f", V_EQ);
+}
+
+// Testing denominators with fractions and exponents.
+bool
+test12() {
+  return
+    // Fraction.
+    aux_test("27.9/3.1", "9", "", V_EQ)
+    && aux_test("27.9/3.1=9", "9", "=9", V_EQ)
+    // Exponent.
+    && aux_test("15/30e-1", "5", "", V_EQ)
+    && aux_test("27e3/30e-1", "9000", "", V_EQ)
+    && aux_test("15*^-3/29e2", "3/580000", "", V_EQ)
+    && aux_test("15/30e-1,2", "5", ",2", V_EQ)
+    && aux_test("15/30e-1.2", "5", ".2", V_EQ)
+    // Exponent and fraction.
+    && aux_test("27.9e3/30e-1", "9300", "", V_EQ)
+    && aux_test("27.9e3/30e-1/2", "9300", "/2", V_EQ)
+    && aux_test("27.9e3/30e-1^^", "9300", "^^", V_EQ);
+}
+
+// Testing denominators with hexadecimals and bases.
+bool
+test13() {
+  return
+    // Hexadecimal.
+    aux_test("0xf/0x3", "5", "", V_EQ)
+    && aux_test("3048227.23429e3/0x230abc43",
+                "304822723429/58790611500", "", V_EQ)
+    && aux_test("0xf/0x3g", "5", "g", V_EQ)
+    // Base.
+    && aux_test("16^^f/4^^3.0e0*^3", "5", "*^3", V_EQ);
+}
+
+// LARGE_NUM has 14057 digits.
+#define LARGE_NUM "29382093589501594796725672938209358950159472967256372938209358950159472967256729382093589501594729672567293820935899501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938209358950159472967256729382093589501594729672567293820935895015947296725672938 [...]
+
+// Testing a very large number.
+bool
+test14() {
+  return aux_test(LARGE_NUM, LARGE_NUM, "", V_EQ);
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+END_MAIN
diff --git a/tests/Polyhedron/onepoint.cc b/tests/Polyhedron/onepoint.cc
new file mode 100644
index 0000000..3494347
--- /dev/null
+++ b/tests/Polyhedron/onepoint.cc
@@ -0,0 +1,57 @@
+/* Creation of a one-point polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  ph.add_generator(point(-1000*x - 9*y, 16));
+
+  print_generators(ph, "*** generators ***");
+  print_constraints(ph, "*** constraints ***");
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(2*x == -125);
+  known_result.add_constraint(16*y == -9);
+  known_result.add_constraint(z == 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/permute.cc b/tests/Polyhedron/permute.cc
new file mode 100644
index 0000000..b460bcc
--- /dev/null
+++ b/tests/Polyhedron/permute.cc
@@ -0,0 +1,223 @@
+/* An example of iteration to a post-fixpoint.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+void
+shift_rename_add(const C_Polyhedron& p,
+                 dimension_type offset,
+                 C_Polyhedron& q) {
+  C_Polyhedron r(offset);
+  r.concatenate_assign(p);
+  q.intersection_assign(r);
+}
+
+void
+append_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+            dimension_type& offset, unsigned int& arity) {
+  offset = 3;
+  arity = 3;
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  // This is the base case:
+  // append(A,B,C) :- A = [], B = C.
+  base.add_space_dimensions_and_embed(3);
+  base.add_constraint(A == 0);
+  base.add_constraint(B >= 0);
+  base.add_constraint(C == B);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // append(A,B,C) :- A = [X|D], B = E, C = [X|F], append(D,E,F).
+  induct.add_space_dimensions_and_embed(6);
+  induct.add_constraint(A + F == C + D);
+  induct.add_constraint(B == E);
+  induct.add_constraint(C + D >= A);
+  induct.add_constraint(D >= 0);
+  induct.add_constraint(B >= 0);
+  induct.add_constraint(A >= D + 1);
+
+  print_constraints(induct, "*** inductive ***");
+
+  expect.add_space_dimensions_and_embed(3);
+  expect.add_constraint(A + B == C);
+  expect.add_constraint(B >= 0);
+  expect.add_constraint(C >= B);
+}
+
+void
+fix_point(C_Polyhedron& start, C_Polyhedron& induct, C_Polyhedron& finish,
+          dimension_type offset, unsigned int arity) {
+  // Initialize the fixpoint iteration.
+  C_Polyhedron current = start;
+
+  print_constraints(current, "*** start ***");
+
+  // Contains the polyhedron computed at the previous iteration.
+  C_Polyhedron previous;
+  do {
+    previous = current;
+    current = induct;
+    shift_rename_add(previous, offset, current);
+
+    print_constraints(current, "*** after shift_rename_add ***");
+
+    Variables_Set dimensions_to_remove;
+    dimension_type current_dim;
+    current_dim = current.space_dimension();
+    for (dimension_type i = current_dim-1 ; i >= arity; --i )
+      dimensions_to_remove.insert(Variable(i));
+    current.remove_space_dimensions(dimensions_to_remove);
+
+    print_constraints(current, "*** after remove_space_dimensions ***");
+
+    current.upper_bound_assign(previous);
+    (void) current.is_empty();
+
+    print_constraints(current, "*** after upper_bound_assign ***");
+
+    current.H79_widening_assign(previous);
+
+    print_constraints(current, "*** after H79_widening_assign ***");
+
+  } while (current != previous);
+  finish = current;
+}
+
+void
+append_size_rel(C_Polyhedron& ph) {
+  C_Polyhedron start;
+  C_Polyhedron induct;
+  C_Polyhedron expect;
+  dimension_type recursive_offset;
+  unsigned int arity;
+  append_init(start, induct, expect, recursive_offset, arity);
+  fix_point(start, induct, ph, recursive_offset, arity);
+}
+
+void
+permute_init(C_Polyhedron& base, C_Polyhedron& induct, C_Polyhedron& expect,
+             C_Polyhedron& ph_append,
+             dimension_type& offset, unsigned int& arity) {
+  arity = 2;
+  offset = 10;
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+
+  // This is the base case:
+  // permute(A,B) :- A = [], B = [].
+  base.add_space_dimensions_and_embed(2);
+  base.add_constraint(A == 0);
+  base.add_constraint(B == 0);
+
+  print_constraints(base, "*** base ***");
+
+  // This is the inductive case:
+  // permute(A,B) :- B = [X|C],
+  //                 E = [X|G], F = A, append(D,E,F),
+  //                 D = H, I = G, append(H,I,J),
+  //                 K = J, L = C, permute(K,L).
+  induct.add_space_dimensions_and_embed(6);
+  induct.add_constraint(B == C + 1);
+  induct.add_constraint(F == A);
+  shift_rename_add(ph_append, 3, induct);
+  induct.add_space_dimensions_and_embed(4);
+  induct.add_constraint(E == G + 1);
+  shift_rename_add(ph_append, 7, induct);
+  induct.add_space_dimensions_and_embed(2);
+  induct.add_constraint(D + G == H + I);
+  induct.add_constraint(D == H);
+  induct.add_constraint(I == G);
+  induct.add_constraint(K == J);
+  induct.add_constraint(L == C);
+  induct.add_constraint(A >= 0);
+  induct.add_constraint(C >= 0);
+
+  print_constraints(induct, "*** inductive ***");
+
+  expect.add_space_dimensions_and_embed(2);
+  expect.add_constraint(A == B);
+  expect.add_constraint(A >= 0);
+  expect.add_constraint(B >= 0);
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  C_Polyhedron start;
+  C_Polyhedron induct;
+  C_Polyhedron expect;
+  dimension_type recursive_offset;
+  unsigned int arity;
+  C_Polyhedron ph_append;
+  append_size_rel(ph_append);
+  permute_init(start, induct, expect, ph_append, recursive_offset, arity);
+  C_Polyhedron final;
+  fix_point(start, induct, final, recursive_offset, arity);
+
+  print_constraints(expect, "*** expected ***");
+
+  C_Polyhedron final1;
+  final1 = induct;
+  shift_rename_add(final, recursive_offset, final1);
+
+  print_constraints(final1, "*** after shift_rename_add ***");
+
+  C_Polyhedron final2;
+  final2 = final1;
+  Variable A(0);
+  Variable B(1);
+  Variable K(10);
+  Variable L(11);
+  final2.add_constraint(B - L >= 1);
+  final2.add_constraint(A - K >= 1);
+
+  if (final2 == final1)
+    print_constraints(final2, "*** termination condition satisfied ***");
+  else
+    print_constraints(final2, "*** termination condition not satisfied ***");
+
+  return final2 == final1 ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/polydifference1.cc b/tests/Polyhedron/polydifference1.cc
new file mode 100644
index 0000000..f58ebdc
--- /dev/null
+++ b/tests/Polyhedron/polydifference1.cc
@@ -0,0 +1,206 @@
+/* Test Polyhedron::difference_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point(0*x + 0*y));
+  gs1.insert(point(4*x + 0*y));
+  gs1.insert(point(2*x + 2*y));
+
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  Generator_System gs2;
+  gs2.insert(point(0*x + 3*y));
+  gs2.insert(point(4*x + 3*y));
+  gs2.insert(point(2*x + 1*y));
+
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.difference_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point());
+  gs_known_result.insert(point(3*x + 3*y, 2));
+  gs_known_result.insert(point(4*x));
+  gs_known_result.insert(point(5*x + 3*y, 2));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  C_Polyhedron ph3(2);
+  ph3.add_constraint(2*y >= 3);
+
+  known_result.difference_assign(ph3);
+
+  bool ok = (computed_result == known_result);
+
+  print_generators(computed_result, "*** after difference_assign ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-4) >= 0);
+  C_Polyhedron known_result(cs);
+
+  ph1.difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(B == 0);
+
+  C_Polyhedron ph2(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 2);
+  ph1.add_constraint(B >= 0);
+  ph1.add_constraint(B <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  ph1.difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(A <= 7);
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(A == 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(A == B);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A + B == 0);
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.difference_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/polydifference2.cc b/tests/Polyhedron/polydifference2.cc
new file mode 100644
index 0000000..663d002
--- /dev/null
+++ b/tests/Polyhedron/polydifference2.cc
@@ -0,0 +1,176 @@
+/* Test Polyhedron::difference_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point(0*x + 0*y));
+  gs1.insert(point(0*x + 3*y));
+  gs1.insert(point(3*x + 0*y));
+  gs1.insert(point(3*x + 3*y));
+
+  NNC_Polyhedron ph1(gs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(1*x + 0*y == 0);
+
+  NNC_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron computed_result = ph1;
+
+  computed_result.difference_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(closure_point(0*x + 0*y));
+  gs_known_result.insert(closure_point(0*x + 3*y));
+  gs_known_result.insert(point(3*x + 0*y));
+  gs_known_result.insert(point(3*x + 3*y));
+
+  NNC_Polyhedron known_result(gs_known_result);
+
+  bool ok = (computed_result == known_result);
+
+  print_generators(computed_result, "*** after difference_assign ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A >= 0);
+  ph1.add_constraint(B >= 0);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(A > 2);
+  ph2.add_constraint(B >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.difference_assign(ph2);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(y >= 0);
+  cs1.insert(x <= 4);
+  cs1.insert(x - 2*y <= 2);
+
+  C_Polyhedron ph1(cs1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  Constraint_System cs2;
+  cs2.insert(x >= 0);
+  cs2.insert(y >= 0);
+  cs2.insert(x <= 4);
+  cs2.insert(y <= 5);
+  cs2.insert(x - 2*y <= 2);
+  cs2.insert(x + y <= 7);
+
+  C_Polyhedron ph2(cs2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+  computed_result.difference_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(0*x + 5*y));
+  gs_known_result.insert(point(4*x + 3*y));
+  gs_known_result.insert(ray(0*x + 1*y));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result, "*** after difference_assign ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(A >= 1);
+  ph2.add_constraint(A <= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.difference_assign(ph2);
+
+  C_Polyhedron known_result(1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.difference_assign(ph2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/polyhull1.cc b/tests/Polyhedron/polyhull1.cc
new file mode 100644
index 0000000..0a62855
--- /dev/null
+++ b/tests/Polyhedron/polyhull1.cc
@@ -0,0 +1,400 @@
+/* Test Polyhedron::upper_bound_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(x));
+  gs1.insert(ray(y));
+
+  C_Polyhedron ph1(gs1);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  Generator_System gs2;
+  gs2.insert(point(-x + y));
+  gs2.insert(point(x + y));
+  gs2.insert(point(3*x));
+
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.upper_bound_assign(ph2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point());
+  gs_known_result.insert(point(-x + y));
+  gs_known_result.insert(ray(x));
+  gs_known_result.insert(ray(y));
+
+  C_Polyhedron known_result(gs_known_result);
+
+  print_generators(computed_result, "*** ph1.upper_bound_assign(ph2) ***");
+
+  return computed_result == known_result;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(x + y));
+  C_Polyhedron ph2(gs);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result1(ph1);
+
+  computed_result1.upper_bound_assign(ph2);
+
+  C_Polyhedron known_result(ph2);
+
+  bool ok = (computed_result1 == known_result);
+
+  print_generators(computed_result1,
+                   "*** after upper_bound_assign ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x <= 2);
+  ph1.add_constraint(y <= 2);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(y >= 2);
+  ph2.add_constraint(y <= 4);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.upper_bound_assign(ph2);
+
+  print_generators(ph1, "*** after upper_bound_assign ***");
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point());
+  known_result.add_generator(point(2*x));
+  known_result.add_generator(point(4*y));
+  known_result.add_generator(point(2*x + 4*y));
+
+  bool ok = (ph1 == known_result);
+
+  return ok;
+}
+
+bool
+aux_test04(C_Polyhedron& ph1, const C_Polyhedron& ph2,
+           // Note intentional call-by-value!
+           C_Polyhedron known_result) {
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.upper_bound_assign(ph2);
+
+  print_generators(ph1, "*** after upper_bound_assign ***");
+
+  return ph1 == known_result;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1_1(2);
+  ph1_1.add_constraint(x >= 0);
+  ph1_1.add_constraint(y >= 0);
+  ph1_1.add_constraint(x <= 2);
+  ph1_1.add_constraint(y <= 2);
+  C_Polyhedron ph1_2(ph1_1);
+
+  C_Polyhedron ph2_1(2);
+  ph2_1.add_constraint(x+y <= 0);
+  ph2_1.add_constraint(x+y >= 2);
+  C_Polyhedron ph2_2(ph2_1);
+  C_Polyhedron ph2_3(ph2_1);
+  C_Polyhedron ph2_4(ph2_1);
+
+  bool ok = aux_test04(ph1_1, ph2_1, ph1_1)
+    && aux_test04(ph2_2, ph1_2, ph1_2)
+    && aux_test04(ph2_3, ph2_4, ph2_3);
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A));
+  ph1.add_generator(ray(A));
+  ph1.add_generator(ray(B));
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.upper_bound_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1,
+                   "*** after ph1.upper_bound_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.upper_bound_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1,
+                   "*** after ph1.upper_bound_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(ray(A));
+  gs1.insert(point(B));
+  C_Polyhedron ph1(gs1);
+  ph1.generators();
+  ph1.constraints();
+
+  Generator_System gs2;
+  gs2.insert(point());
+  gs2.insert(ray(B));
+  C_Polyhedron ph2(gs2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.upper_bound_assign(ph2);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1,
+                   "*** after ph1.upper_bound_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A - B >= 0);
+  C_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.upper_bound_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.upper_bound_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.upper_bound_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.upper_bound_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == B);
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A >= B + 1);
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.upper_bound_assign(ph2);
+  copy_ph1.upper_bound_assign(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_generators(ph1, "*** after upper_bound_assign ***");
+  print_generators(copy_ph1,
+                    "*** after upper_bound_assign ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point());
+  ph1.constraints();
+  ph1.add_generator(line(A + B));
+  C_Polyhedron copy_ph1 = ph1;
+
+  C_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point());
+  ph2.constraints();
+  ph2.add_generator(ray(A));
+  ph2.add_generator(ray(B));
+
+  C_Polyhedron copy_ph2 = ph2;
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.upper_bound_assign(ph2);
+  copy_ph1.upper_bound_assign(copy_ph2);
+
+  bool ok = (ph1 == copy_ph1);
+
+  print_generators(ph1, "*** after upper_bound_assign ***");
+  print_generators(copy_ph1,
+                    "*** after upper_bound_assign ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  // Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron p(3);
+  p.add_constraint(B >= 0);
+  p.add_constraint(C >= 0);
+
+  C_Polyhedron q(3);
+  q.add_constraint(C >= 0);
+
+  print_constraints(p, "*** p ***");
+  print_constraints(q, "*** q ***");
+
+  p.upper_bound_assign(q);
+
+  bool ok = (p == q);
+
+  print_constraints(p, "*** p.upper_bound_assign(q) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/polyhull2.cc b/tests/Polyhedron/polyhull2.cc
new file mode 100644
index 0000000..75fed42
--- /dev/null
+++ b/tests/Polyhedron/polyhull2.cc
@@ -0,0 +1,59 @@
+/* Test Polyhedron::upper_bound_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+
+  NNC_Polyhedron p1(2);
+  p1.add_constraint(j == 0);
+  p1.add_constraint(i >= 0);
+  p1.add_constraint(j-i == 2);
+
+  NNC_Polyhedron p2(2);
+  p2.add_constraint(j == 0);
+  p2.add_constraint(-i > 0);
+  p2.add_constraint(j-i == 0);
+
+  print_constraints(p1, "*** p1 ***");
+  print_constraints(p2, "*** p2 ***");
+
+  p1.upper_bound_assign(p2);
+
+  bool ok = p1.is_empty();
+
+  print_constraints(p1, "*** p1.upper_bound_assign(p2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/polyhullifexact1.cc b/tests/Polyhedron/polyhullifexact1.cc
new file mode 100644
index 0000000..8d6064f
--- /dev/null
+++ b/tests/Polyhedron/polyhullifexact1.cc
@@ -0,0 +1,465 @@
+/* Test Polyhedron::upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  C_Polyhedron ph_empty(0, EMPTY);
+  C_Polyhedron ph_universe(0, UNIVERSE);
+
+  // Testing all combinations for 0-dim polyhedra.
+  bool ok = true;
+  C_Polyhedron ph;
+
+  // empty, empty
+  ph = ph_empty;
+  ok &= ph.upper_bound_assign_if_exact(ph_empty);
+  ok &= (ph == ph_empty);
+  print_constraints(ph, "*** empty union empty ***");
+
+  // empty, universe
+  ph = ph_empty;
+  ok &= ph.upper_bound_assign_if_exact(ph_universe);
+  ok &= (ph == ph_universe);
+  print_constraints(ph, "*** empty union universe ***");
+
+  // universe, empty
+  ph = ph_universe;
+  ok &= ph.upper_bound_assign_if_exact(ph_empty);
+  ok &= (ph == ph_universe);
+  print_constraints(ph, "*** universe union empty ***");
+
+  // universe, universe
+  ph = ph_universe;
+  ok &= ph.upper_bound_assign_if_exact(ph_universe);
+  ok &= (ph == ph_universe);
+  print_constraints(ph, "*** universe union universe ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= -2);
+  ph1.add_constraint(x <= -1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 1);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y >= 0);
+  ph2.add_constraint(y <= 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= -2);
+  ph1.add_constraint(x <= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y >= 0);
+  ph2.add_constraint(y <= 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= -2);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x == 0);
+  ph1.add_constraint(y == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y >= -2);
+  ph2.add_constraint(y <= 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph2);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(y >= 2);
+  ph2.add_constraint(y <= 4);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x == y);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x == 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= y);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= y);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x <= y);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(2, UNIVERSE);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable w(0);
+  Variable x(1);
+  Variable y(2);
+  Variable z(3);
+
+  Constraint_System cs;
+  cs.insert(4*x - 2*y - z + 14 >= 0);
+  cs.insert(4*x + 2*y - z + 2 >= 0);
+  cs.insert(x + y - 1 >= 0);
+  cs.insert(x + y + 2*z - 5 >= 0);
+  cs.insert(x + 1 >= 0);
+  cs.insert(x + z - 1 >= 0);
+  cs.insert(2*x + y -2*z + 7 >= 0);
+  cs.insert(x - y + 2*z + 1 >= 0);
+  cs.insert(x - y + 5 >= 0);
+  cs.insert(2*x - y - 2*z + 13 >= 0);
+  cs.insert(-2*x - y + 2*z + 1 >= 0);
+  cs.insert(-x + y - 1 >= 0);
+  cs.insert(-x + y -2*z + 7 >= 0);
+  cs.insert(-4*x + 2*y + z - 4 >= 0);
+  cs.insert(-2*x + y + 2*z - 5 >= 0);
+  cs.insert(-x + 1 >= 0);
+  cs.insert(-x - z + 5 >= 0);
+  cs.insert(-4*x - 2*y + z + 8 >= 0);
+  cs.insert(-x - y + 5 >= 0);
+  cs.insert(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron icosahedron1(4);
+  icosahedron1.add_constraints(cs);
+  icosahedron1.add_constraint(w >= 0);
+  icosahedron1.add_constraint(w <= 5);
+
+  C_Polyhedron icosahedron2(4);
+  icosahedron2.add_constraints(cs);
+  icosahedron2.add_constraint(w >= -7);
+  icosahedron2.add_constraint(w <= 2);
+
+  C_Polyhedron known_result(4);
+  known_result.add_constraints(cs);
+  known_result.add_constraint(w >= -7);
+  known_result.add_constraint(w <= 5);
+
+  C_Polyhedron computed_result = icosahedron1;
+  bool ok = computed_result.poly_hull_assign_if_exact(icosahedron2);
+  ok &= (computed_result == known_result);
+
+  print_constraints(icosahedron1, "*** icosahedron1 ***");
+  print_constraints(icosahedron2, "*** icosahedron2 ***");
+  print_constraints(computed_result, "*** computed_result ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable X01(0);
+  Variable X02(1);
+  Variable X03(2);
+  Variable X04(3);
+  Variable X05(4);
+  Variable X06(5);
+  Variable X07(6);
+  Variable X08(7);
+  Variable X09(8);
+  Variable X10(9);
+  Variable X11(10);
+  Variable X12(11);
+  Variable X13(12);
+  Variable X14(13);
+  Variable X15(14);
+  Variable X16(15);
+  Variable X17(16);
+  Variable X18(17);
+  Variable X19(18);
+  Variable X20(19);
+  Variable X21(20);
+  Variable X22(21);
+  Variable X23(22);
+  Variable X24(23);
+  Variable X25(24);
+  Variable X26(25);
+  Variable X27(26);
+  Variable X28(27);
+  Variable X29(28);
+  Variable X30(29);
+  Variable X31(30);
+  Variable X32(31);
+  Variable X33(32);
+  Variable X34(33);
+  Variable X35(34);
+  Variable X36(35);
+  Variable X37(36);
+  Variable X38(37);
+  Variable X39(38);
+
+  Constraint_System cs;
+  cs.insert(X01 - X02 - X03 + 0*X39 == 0);
+  cs.insert(Coefficient("2386907802506363")*X01 - X04 == 0);
+  cs.insert(-X01 >= -80);
+  cs.insert(X02 - Coefficient("3152519739159347")*X14 >= 0);
+  cs.insert(X06 + X07 + X08 + X09 - X14 - X15 == 0);
+  cs.insert(Coefficient("2386907802506363")*X06
+            + Coefficient("2386907802506363")*X07
+            + Coefficient("1080863910568919")*X08
+            + Coefficient("7746191359077253")*X09
+            - X16 == 0);
+  cs.insert(-X06 + X10 >= -80);
+  cs.insert(-X07 + X11 >= 0);
+  cs.insert(-X08 + X12 >= 0);
+  cs.insert(-X09 + X13 >= 0);
+  cs.insert(X22 - X23 - X24 - X25 == 0);
+  cs.insert(Coefficient("7746191359077253")*X22 - X26 == 0);
+  cs.insert(-X22 >= -500);
+  cs.insert(X23 - Coefficient("3152519739159347")*X36 >= 0);
+  cs.insert(Coefficient("7746191359077253")*X28
+            + Coefficient("7746191359077253")*X29
+            + Coefficient("3512807709348987")*X30
+            + Coefficient("3332663724254167")*X31
+            - X38 == 0);
+  cs.insert(X28 + X29 + X30 + X31 - X36 + X37 + X39 == 44);
+  cs.insert(-X28 + X32 >= -500);
+  cs.insert(-X29 + X33 >= 0);
+  cs.insert(-X30 + X34 >= 0);
+  cs.insert(-X31 + X35 >= 0);
+  cs.insert(Coefficient("-2661627379775963")*X10
+            - Coefficient("2686397177726501")*X11
+            - Coefficient("5422333951354077")*X12
+            - Coefficient("5469621747441467")*X13
+            + X25
+            - Coefficient("2466846695892189")*X32
+            - Coefficient("4996743786567565")*X33
+            - Coefficient("5064297780978123")*X34
+            - Coefficient("641481471923585")*X35 >= 0);
+  cs.insert(X03 - Coefficient("7854277750134145")*X22 >= 0);
+  cs.insert(X15
+            - Coefficient("7854277750134145")*X28
+            - Coefficient("7782220156096217")*X29
+            - Coefficient("7782220156096217")*X30
+            - Coefficient("7710162562058289")*X31 >= 0);
+  cs.insert(Coefficient("-5422333951354077")*X01 + X24 >= 0);
+  cs.insert(X21 >= 2);
+  cs.insert(-X16 - X38 >= -300);
+  for (dimension_type i = X01.id(); i <= X39.id(); ++i)
+    cs.insert(Variable(i) >= 0);
+
+  C_Polyhedron ph1(cs);
+  ph1.add_constraint(X25 - X22 <= 5);
+
+  C_Polyhedron ph2(cs);
+  ph1.add_constraint(X25 - X22 >= 1);
+
+  C_Polyhedron known_result(cs);
+
+  bool ok = ph1.poly_hull_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+  return ok;
+}
+
+bool
+test11() {
+  const dimension_type dim = 5;
+  Constraint_System cs;
+  for (dimension_type i = 1; i < dim; ++i) {
+    Variable x(i);
+    cs.insert(x >= 0);
+    cs.insert(x <= 4);
+  }
+
+  Variable x(0);
+
+  C_Polyhedron hypercube1(cs);
+  hypercube1.add_constraint(x >= 0);
+  hypercube1.add_constraint(x <= 4);
+
+  C_Polyhedron hypercube2(cs);
+  hypercube2.add_constraint(x >= 2);
+  hypercube2.add_constraint(x <= 6);
+
+  bool ok = hypercube1.upper_bound_assign_if_exact(hypercube2);
+
+  print_generators(hypercube1, "*** hyp1 ***");
+  print_generators(hypercube2, "*** hyp2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST_F8(test09);
+  DO_TEST_F64(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/polyhullifexact2.cc b/tests/Polyhedron/polyhullifexact2.cc
new file mode 100644
index 0000000..d3d124b
--- /dev/null
+++ b/tests/Polyhedron/polyhullifexact2.cc
@@ -0,0 +1,471 @@
+/* Test NNC_Polyhedron::upper_bound_assign_if_exact().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+
+  NNC_Polyhedron ph1(1, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x <= 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(1, UNIVERSE);
+  ph2.add_constraint(x == 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(1, UNIVERSE);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 1);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x <= 2);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y == 1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 2);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 2);
+  ph1.add_constraint(x + y > 0);
+  ph1.add_constraint(x + y < 4);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x == y);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y >= 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, UNIVERSE);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 2);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x - y >= 0);
+  ph1.add_constraint(x + y >= 0);
+  ph1.add_constraint(4*x < 1);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x - y >= 0);
+  ph2.add_constraint(x + y >= 0);
+  ph2.add_constraint(4*x > 1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(y > 0);
+  ph1.add_constraint(x < 2);
+  ph1.add_constraint(y < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x == 2);
+  ph2.add_constraint(y == 1);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(y > 0);
+  ph1.add_constraint(x < 2);
+  ph1.add_constraint(y < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x == 2);
+  ph2.add_constraint(y > 0);
+  ph2.add_constraint(y < 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, UNIVERSE);
+  known_result.add_constraint(x > 0);
+  known_result.add_constraint(y > 0);
+  known_result.add_constraint(x <= 2);
+  known_result.add_constraint(y < 2);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x == 2);
+  ph2.add_constraint(y == 0);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x < 1);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(y <= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x > 1);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(y >= 0);
+  ph2.add_constraint(y <= 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(0*x + 0*y));
+  ph1.add_generator(point(0*x + 1*y));
+  ph1.add_generator(closure_point(2*x + 2*y));
+  ph1.add_generator(closure_point(3*x + 0*y));
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, EMPTY);
+  ph2.add_generator(point(4*x + 0*y));
+  ph2.add_generator(point(4*x + 1*y));
+  ph2.add_generator(closure_point(2*x + 2*y));
+  ph2.add_generator(closure_point(1*x + 0*y));
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+  known_result.add_generator(point(0*x + 0*y));
+  known_result.add_generator(point(0*x + 1*y));
+  known_result.add_generator(point(4*x + 0*y));
+  known_result.add_generator(point(4*x + 1*y));
+  known_result.add_generator(closure_point(2*x + 2*y));
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x < 1);
+  ph1.add_constraint(y > 0);
+  ph1.add_constraint(y < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x > 1);
+  ph2.add_constraint(x < 2);
+  ph2.add_constraint(y > 0);
+  ph2.add_constraint(y < 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x < 1);
+  ph1.add_constraint(y > 0);
+  ph1.add_constraint(y < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(2, UNIVERSE);
+  ph2.add_constraint(x >= 1);
+  ph2.add_constraint(x < 2);
+  ph2.add_constraint(y > 0);
+  ph2.add_constraint(y < 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(2, UNIVERSE);
+  known_result.add_constraint(x > 0);
+  known_result.add_constraint(x < 2);
+  known_result.add_constraint(y > 0);
+  known_result.add_constraint(y < 2);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x <= 1);
+  ph1.add_constraint(y > 0);
+  ph1.add_constraint(y < 2);
+  ph1.add_constraint(z > 0);
+  ph1.add_constraint(z < 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(x >= 1);
+  ph2.add_constraint(x < 2);
+  ph2.add_constraint(y > 0);
+  ph2.add_constraint(y < 2);
+  ph2.add_constraint(z > 0);
+  ph2.add_constraint(z < 2);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(x > 0);
+  known_result.add_constraint(x < 2);
+  known_result.add_constraint(y > 0);
+  known_result.add_constraint(y < 2);
+  known_result.add_constraint(z > 0);
+  known_result.add_constraint(z < 2);
+
+  bool ok = ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(x > 0);
+  ph1.add_constraint(x <= 1);
+  ph1.add_constraint(y > 0);
+  ph1.add_constraint(y < 2);
+  ph1.add_constraint(z > 0);
+  ph1.add_constraint(z <= 2);
+  ph1.add_constraint(x + z < 3);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph1.minimized_generators(), "*** ph1 ***");
+
+  NNC_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(x >= 1);
+  ph2.add_constraint(x < 2);
+  ph2.add_constraint(y > 0);
+  ph2.add_constraint(y < 2);
+  ph2.add_constraint(z > 0);
+  ph2.add_constraint(z <= 2);
+  ph1.add_constraint(x - z > -1);
+
+  print_constraints(ph2, "*** ph2 ***");
+  print_generators(ph2.minimized_generators(), "*** ph2 ***");
+
+  NNC_Polyhedron known_result(ph1);
+
+  bool ok = !ph1.upper_bound_assign_if_exact(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1, "*** ph1.upper_bound_assign_if_exact(ph2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+END_MAIN
diff --git a/tests/Polyhedron/randphull1.cc b/tests/Polyhedron/randphull1.cc
new file mode 100644
index 0000000..554c64a
--- /dev/null
+++ b/tests/Polyhedron/randphull1.cc
@@ -0,0 +1,201 @@
+/* Compute poly-hulls of random polytopes.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+#include <cmath>
+
+#ifndef M_PI
+# define M_PI           3.14159265358979323846  /* pi */
+#endif
+
+namespace {
+
+namespace test01_namespace {
+
+int
+count_points(const C_Polyhedron& ph) {
+  int count = 0;
+  const Generator_System& gs = ph.minimized_generators();
+  for (Generator_System::const_iterator i = gs.begin(),
+         gs_end = gs.end(); i != gs_end; ++i)
+    if (i->type() == Generator::POINT)
+      ++count;
+  return count;
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  // Set up a random numbers' generator.
+  gmp_randclass rg(gmp_randinit_default);
+
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  const int maxc = 10000;
+  C_Polyhedron ph(3, EMPTY);
+  nout << test01_namespace::count_points(ph) << endl;
+  for (int n = 1; n <= 200; ++n) {
+    const Coefficient cx = mpz_class(rg.get_z_range(maxc));
+    const Coefficient cy = mpz_class(rg.get_z_range(maxc));
+    const Coefficient cz = mpz_class(rg.get_z_range(maxc));
+    ph.add_generator(point(cx*x + cy*y + cz*z));
+    if (ph.is_empty())
+      return false;
+    nout << test01_namespace::count_points(ph) << endl;
+  }
+  return true;
+}
+
+
+namespace test02_namespace {
+
+// Compute random polytopes by generating points on the surface
+// of an n-dimensional sphere.
+
+// Please note: the following function picks up random point on the
+// n-dimensional sphere, but they are not uniformly distributed.
+// See the following paper on how to obtain a uniform distribution:
+
+// J. S. Hicks, R. F. Wheeling.
+// An efficient method for generating uniformly distributed points
+// on the surface of an n-dimensional sphere,
+// Communications of the ACM, Volume 2, Issue 4, pp. 17-19, April 1959.
+//
+// M. E. Muller.
+// A note on a method for generating points uniformly on n-dimensional spheres,
+// Communications of the ACM, Volume 2 Issue 4, pp. 19-20, April 1959.
+//
+// G. F. Schrack.
+// Remark on algorithm 381 [G5],
+// Communications of the ACM, Volume 15 Issue 6, p. 468, June 1972.
+
+void
+point_on_the_unit_n_sphere(unsigned n,
+                           const std::vector<float>& theta,
+                           std::vector<float>& coordinate) {
+  assert(n >= 2);
+
+  if (n == 2) {
+    coordinate[0] *= sin(theta[0]);
+    coordinate[1] *= cos(theta[0]);
+  }
+  else {
+    point_on_the_unit_n_sphere(n-1, theta, coordinate);
+    float sin_theta_n_2 = sin(theta[n-2]);
+    for (unsigned i = n-1; i-- > 0; )
+      coordinate[i] *= sin_theta_n_2;
+    coordinate[n-1] *= cos(theta[n-2]);
+  }
+}
+
+void
+random_polytope(C_Polyhedron& ph,
+                unsigned dimension,
+                unsigned num_points,
+                float radius = 1.0) {
+  assert(dimension >= 2);
+
+  // This setting and resetting of the rounding mode was prompted by
+  // the GLIBC bug http://sources.redhat.com/bugzilla/show_bug.cgi?id=6869 .
+  // However, even when this bug will be fixed, we want to keep this
+  // rounding mode setting/resetting code, so that it gets tested.
+  restore_pre_PPL_rounding();
+
+  std::vector<float> theta(dimension-1);
+  std::vector<float> coordinate(dimension);
+
+  for (unsigned n = num_points; n > 0; --n) {
+    // Compute n-1 random angles.
+    for (unsigned i = dimension-1; i-- > 0; )
+      theta[i] = 2.0*M_PI*static_cast<double>(rand())/RAND_MAX;
+    // Compute float coordinates.
+    for (unsigned i = dimension; i-- > 0; )
+      coordinate[i] = radius;
+    point_on_the_unit_n_sphere(dimension, theta, coordinate);
+
+    Linear_Expression le;
+    for (unsigned i = dimension; i-- > 0; ) {
+#if 0
+      le += Variable(i)*Coefficient(coordinate[i]*1000000.0);
+#else
+      // FIXME: this is a temporary workaround for machines
+      // where we cannot control the FPU.
+      mpz_class z = coordinate[i]*1000000.0;
+      le += Variable(i)*Coefficient(z);
+#endif
+    }
+    ph.add_generator(point(le));
+  }
+
+  // Restore the rounding mode as needed by the PPL.
+  set_rounding_for_PPL();
+}
+
+} // namespace test02_namespace
+
+bool
+test02() {
+  for (unsigned dimension = 2;
+#ifdef NDEBUG
+       dimension <= 6;
+#else
+       dimension <= 4;
+#endif
+       ++dimension) {
+    C_Polyhedron ph(dimension, EMPTY);
+    test02_namespace::random_polytope(ph, dimension, dimension*dimension);
+    // Count the number of constraints.
+    const Constraint_System& cs = ph.minimized_constraints();
+    unsigned num_constraints = 0;
+    for (Constraint_System::const_iterator i = cs.begin(),
+           cs_end = cs.end(); i != cs_end; ++i)
+      ++num_constraints;
+    // Count the number of generators.
+    const Generator_System& gs = ph.minimized_generators();
+    unsigned num_points = 0;
+    for (Generator_System::const_iterator i = gs.begin(),
+           gs_end = gs.end(); i != gs_end; ++i)
+      if (i->type() == Generator::POINT)
+        ++num_points;
+      else {
+        using namespace Parma_Polyhedra_Library::IO_Operators;
+        nout << "i->type() == " << i->type() << endl;
+        return false;
+      }
+    nout << "dimension = " << dimension
+         << ", points = " << num_points << " (" << dimension*dimension << ")"
+         << ", constraints = " << num_constraints << endl;
+  }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F64(test01);
+  DO_TEST_F64(test02);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithcongruence1.cc b/tests/Polyhedron/refinewithcongruence1.cc
new file mode 100644
index 0000000..7fa0ea7
--- /dev/null
+++ b/tests/Polyhedron/refinewithcongruence1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::refine_with_congruence().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  NNC_Polyhedron ph1(3);
+  ph1.refine_with_congruence((A %= 0) / 2);
+  ph1.refine_with_congruence((B %= 5) / 0);
+  ph1.refine_with_congruence(A + B %= 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(ph1);
+  ph2.refine_with_congruence((A %= 1) / 0);
+  ph2.refine_with_congruence((B + C %= 4) / 5);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(A == 1);
+  known_result.add_constraint(B == 5);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.refine_with_congruence((A %= B) / 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+                    "*** after ph.refine_with_congruence((A %= B) / 0) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_congruence((A %= 0) / 4);
+  ph.refine_with_congruence((A + B %= 2) / 5);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.refine_with_congruence((B %= 1) / 0);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B == 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+                    "*** after ph.refine_with_congruence(B >= 1) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithcongruences1.cc b/tests/Polyhedron/refinewithcongruences1.cc
new file mode 100644
index 0000000..fcb6925
--- /dev/null
+++ b/tests/Polyhedron/refinewithcongruences1.cc
@@ -0,0 +1,337 @@
+/* Test Polyhedron::refine_with_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_congruence(A %= 0);
+  ph.refine_with_congruence(B %= 0);
+
+  Congruence_System cgs;
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  C_Polyhedron known_result(2);
+
+  ph.refine_with_congruences(cgs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs1;
+  cs1.insert(A + B >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Congruence_System cgs2;
+  cgs2.insert((e %= 0) / 0);
+  ph.refine_with_congruences(cgs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.refine_with_congruences(cgs2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  C_Polyhedron ph(3);
+  ph.refine_with_congruence(A %= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron computed_result(3);
+
+  bool ok = (computed_result == ph);
+
+  print_constraints(computed_result,
+                    "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  Congruence_System cgs;
+  cgs.insert(A %= 4);
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron computed_result(3, EMPTY);
+
+  bool ok = (ph == computed_result);
+
+  print_constraints(ph, "*** after refine_with_congruences(cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph;
+  ph.refine_with_congruence(Linear_Expression(-2) %= 0);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(-1) %= 0) / 2);
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+
+  C_Polyhedron ph(gs);
+
+  Congruence_System cgs;
+  cgs.insert((A %= 3) / 2);
+
+  print_generators(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert(A - B == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 0) / 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 1) / 0);
+  cgs.insert(A + B %= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+
+  Congruence_System cgs;
+  cgs.insert((A - B %= 0) / 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+
+  NNC_Polyhedron ph1(2);
+  Congruence_System cgs;
+  cgs.insert((A - B %= 1) / 0);
+  cgs.insert(A + B %= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph1.refine_with_congruences(cgs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 1);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_congruences(cgs) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  C_Polyhedron ph;
+  ph.refine_with_congruence(Linear_Expression(-2) %= 0);
+
+  Congruence_System cgs;
+  cgs.insert((Linear_Expression(-1) %= 0) / 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_congruences(cgs, "*** cgs ***");
+
+  ph.refine_with_congruences(cgs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_congruences ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithconstraint1.cc b/tests/Polyhedron/refinewithconstraint1.cc
new file mode 100644
index 0000000..95ce198
--- /dev/null
+++ b/tests/Polyhedron/refinewithconstraint1.cc
@@ -0,0 +1,109 @@
+/* Test Polyhedron::refine_with_constraint().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.refine_with_constraint(A > 0);
+  ph1.refine_with_constraint(B == 5);
+  ph1.refine_with_constraint(A + B < 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(2);
+  for (Constraint_System::const_iterator i = ph1.constraints().begin(),
+         cs_end = ph1.constraints().end(); i != cs_end; ++i)
+    ph2.refine_with_constraint(*i);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B == 5);
+  known_result.add_constraint(A <= 1);
+
+  bool ok = (ph2 == known_result);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.refine_with_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.refine_with_constraint(A == B) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_constraint(A >= 0);
+  ph.refine_with_constraint(A <= 2);
+  ph.refine_with_constraint(A >= -1);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.refine_with_constraint(B > 1);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A <= 2);
+  known_result.add_constraint(B >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+                    "*** after ph.refine_with_constraint(B >= 1) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/refinewithconstraints1.cc b/tests/Polyhedron/refinewithconstraints1.cc
new file mode 100644
index 0000000..cca5c02
--- /dev/null
+++ b/tests/Polyhedron/refinewithconstraints1.cc
@@ -0,0 +1,323 @@
+/* Test Polyhedron::refine_with_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.refine_with_constraint(A >= 0);
+  ph.refine_with_constraint(B >= 0);
+
+  Constraint_System cs;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.refine_with_constraints(cs);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs1;
+  cs1.insert(A + B >= 0);
+  C_Polyhedron ph(cs1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Linear_Expression e(1);
+  Constraint_System cs2;
+  cs2.insert(e == 0);
+  ph.refine_with_constraints(cs2);
+
+  C_Polyhedron known_result(2, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.refine_with_constraints(cs2) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(3);
+  ph.refine_with_constraint(A >= 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Constraint_System cs;
+  cs.insert(A >= 0);
+
+  C_Polyhedron computed_result(ph);
+
+  computed_result.add_constraints(cs);
+
+  bool ok = (computed_result == ph);
+
+  print_constraints(computed_result,
+                    "*** after refine_with_constraints ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+
+  C_Polyhedron ph(3, EMPTY);
+
+  Constraint_System cs;
+  cs.insert(A >= 4);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.refine_with_constraints(cs);
+
+  C_Polyhedron computed_result(3, EMPTY);
+
+  bool ok = (ph == computed_result);
+
+  print_constraints(ph, "*** after refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph;
+  ph.refine_with_constraint(Linear_Expression(-2) >= 0);
+
+  Constraint_System cs;
+  cs.insert(Linear_Expression(-1) >= 0);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_constraints ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+
+  C_Polyhedron ph(gs);
+
+  Constraint_System cs;
+  cs.insert(A < 3);
+
+  print_generators(ph, "*** ph ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(B >= 0);
+  known_result.add_constraint(A - B >= 0);
+  known_result.add_constraint(A <= 3);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** after refine_with_constraints ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B == 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B > 1);
+  cs.insert(A + B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A - B >= 1);
+  known_result.add_constraint(A + B >= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+
+  Constraint_System cs;
+  cs.insert(A - B > 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B > 0);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+
+  NNC_Polyhedron ph1(2);
+  Constraint_System cs;
+  cs.insert(A - B > 1);
+  cs.insert(A + B >= 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(cs, "*** cs ***");
+
+  ph1.refine_with_constraints(cs);
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A - B > 1);
+  known_result.add_constraint(A + B >= 2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.refine_with_constraints(cs) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+END_MAIN
diff --git a/tests/Polyhedron/relations1.cc b/tests/Polyhedron/relations1.cc
new file mode 100644
index 0000000..b733baa
--- /dev/null
+++ b/tests/Polyhedron/relations1.cc
@@ -0,0 +1,485 @@
+/* Test Polyhedron::relation_with(g) and Polyhedron::relation_with(c).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x - y >= 0);
+  cs.insert(y >= 0);
+  C_Polyhedron ph(cs);
+  print_constraints(ph, "*** ph ***");
+
+  Generator g = ray(x + y);
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(r(A + B)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_constraints(ph, "*** ph ***");
+
+  Generator g = point(x);
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(v(A)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  C_Polyhedron ph;
+  print_constraints(ph, "*** ph ***");
+
+  Generator g = point();
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(v()) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(y));
+  gs.insert(line(x));
+  C_Polyhedron ph(gs);
+  print_generators(ph, "*** ph ***");
+
+  Generator g = point(x + y);
+  print_generator(g, "*** g ***");
+
+  Poly_Gen_Relation rel = ph.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(v(A + B)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(1*A + 1*B));
+  C_Polyhedron ph(gs);
+  print_generators(ph, "*** ph ***");
+
+  Poly_Con_Relation rel = ph.relation_with(A >= 0);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_included();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(A >= 0) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable y(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  Constraint c(y >= 0);
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = ph.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(c) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Poly_Con_Relation rel = Poly_Con_Relation::nothing();
+  Poly_Con_Relation known_result = Poly_Con_Relation::nothing();
+
+  C_Polyhedron ph;
+  print_generators(ph, "*** ph ***");
+
+  // A false inequality constraint.
+  Constraint c_false1(Linear_Expression(-1) >= 0);
+  print_constraint(c_false1, "*** c_false1 ***");
+
+  rel = ph.relation_with(c_false1);
+
+  nout << "ph.relation_with(c_false1) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::is_disjoint();
+  bool ok = (rel == known_result);
+
+  // A false equality constraint.
+  Constraint c_false2(Linear_Expression(5) == -2);
+  print_constraint(c_false2, "*** c_false2 ***");
+
+  rel = ph.relation_with(c_false2);
+
+  nout << "ph.relation_with(c_false2) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::is_disjoint();
+  bool ok1 = (rel == known_result);
+
+  // A saturated inequality.
+  Constraint c_saturated1(Linear_Expression(3) >= 3);
+  print_constraint(c_saturated1, "*** c_saturated1 ***");
+
+  rel = ph.relation_with(c_saturated1);
+
+  nout << "ph.relation_with(c_saturated1) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+  bool ok2 = (rel == known_result);
+
+  // A saturated equality.
+  Constraint c_saturated2(Linear_Expression(1) == 1);
+  print_constraint(c_saturated2, "*** c_saturated2 ***");
+
+  rel = ph.relation_with(c_saturated2);
+
+  nout << "ph.relation_with(c_saturated2) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+  bool ok3 = (rel == known_result);
+
+  // A satisfied inequality which is not saturated.
+  Constraint c_satisfied(Linear_Expression(7) >= 5);
+  print_constraint(c_satisfied, "*** c_satisfied ***");
+
+  rel = ph.relation_with(c_satisfied);
+
+  nout << "ph.relation_with(c_satisfied) == " << rel << endl;
+
+  known_result = Poly_Con_Relation::is_included();
+  bool ok4 = (rel == known_result);
+
+  return ok && ok1 && ok2 && ok3 && ok4;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x + y >= 1);
+  cs.insert(y >= 5);
+
+  C_Polyhedron ph(cs);
+
+  print_generators(ph, "*** ph ***");
+
+  // An equality constraint non-intersecting the polyhedron.
+  Constraint c(y == -1);
+
+  print_constraint(c, "*** c ***");
+
+  Poly_Con_Relation rel = ph.relation_with(c);
+
+  nout << "ph.relation_with(c) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+  return rel == known_result;
+}
+
+bool
+test09() {
+  // The zero-dim universe polyhedron.
+  C_Polyhedron ph;
+  Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(0 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test10() {
+  // The zero-dim universe polyhedron.
+  C_Polyhedron ph;
+  Poly_Con_Relation rel = ph.relation_with(Linear_Expression(0) > 1);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(0 > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test11() {
+  // The zero-dim universe polyhedron.
+  C_Polyhedron ph;
+  Poly_Con_Relation rel = ph.relation_with(Linear_Expression(1) > 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(1 > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test12() {
+  // An empty polyhedron.
+  C_Polyhedron ph(1);
+  ph.add_constraint(Linear_Expression(0) >= 1);
+  Variable A(0);
+  Poly_Con_Relation rel = ph.relation_with(A > 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test13() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B == 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + B > 3);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test14() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs(A + B <= 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + B > 3);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A + B > 3) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_disjoint();
+
+  return rel == known_result;
+}
+
+bool
+test15() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + 2*B < 10);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A + 2*B < 10) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::is_included();
+
+  return rel == known_result;
+}
+
+bool
+test16() {
+  Variable A(0);
+  Variable B(1);
+  Constraint_System cs;
+  cs.insert(A >= 1);
+  cs.insert(B >= 0);
+  cs.insert(A + B <= 3);
+  C_Polyhedron ph(cs);
+
+  Poly_Con_Relation rel = ph.relation_with(A + B > 1);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A + B > 1) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+
+  return rel == known_result;
+}
+
+bool
+test17() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(point(2*A));
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(point(2*A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+
+  return rel == known_result;
+}
+
+bool
+test18() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A + 0*B));
+  gs.insert(point(3*A));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  Poly_Con_Relation rel = ph.relation_with(B == 0);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);
+
+  nout << "ph.relation_with(B == 0) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test19() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(ray(-A));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(ray(-A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel == known_result;
+}
+
+bool
+test20() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(line(A));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+END_MAIN
diff --git a/tests/Polyhedron/relations2.cc b/tests/Polyhedron/relations2.cc
new file mode 100644
index 0000000..f1c3cfa
--- /dev/null
+++ b/tests/Polyhedron/relations2.cc
@@ -0,0 +1,227 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(line(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(ray(A));
+  gs2.insert(point(B));
+  gs2.insert(point(-B));
+  C_Polyhedron ph2(gs2);
+
+  Poly_Con_Relation rel1 = ph1.relation_with(A == 0);
+  Poly_Con_Relation rel2 = ph2.relation_with(A == 0);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  nout << "ph1.relation_with(A == 0) == " << rel1 << endl;
+  nout << "ph2.relation_with(A == 0) == " << rel2 << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A));
+  gs.insert(line(B));
+  C_Polyhedron ph(gs);
+
+  Poly_Con_Relation rel = ph.relation_with(B > 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(B > 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  return rel == known_result;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(ray(A + B));
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+
+  bool ok = (rel == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(ray(A + B)) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point());
+  ph.constraints();
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(B));
+
+  Poly_Con_Relation rel = ph.relation_with(A == 0);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(A == 0) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point());
+  gs1.insert(line(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(ray(A));
+  gs2.insert(point(B));
+  gs2.insert(point(-B));
+  C_Polyhedron ph2(gs2);
+
+  Poly_Con_Relation rel1 = ph1.relation_with((A %= 0) / 5);
+  Poly_Con_Relation rel2 = ph2.relation_with((A %= 0) / 5);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+  nout << "ph1.relation_with((A %= 0) / 5) == " << rel1 << endl;
+  nout << "ph2.relation_with((A %= 0) / 5) == " << rel2 << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::strictly_intersects();
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A));
+  C_Polyhedron ph(gs);
+
+  Poly_Con_Relation rel = ph.relation_with(A %= 0);
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(A %= 0) == " << rel << endl;
+
+  Poly_Con_Relation known_result = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+  return rel == known_result;
+}
+
+bool
+test07() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A >= 2);
+  ph.add_constraint(A <= 4);
+
+  Poly_Con_Relation rel = ph.relation_with((A %= 1) / 4);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with((A %= 1) / 4) == " << rel << endl;
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(2*A, 3));
+//  ph.add_generator(point(-A));
+  ph.add_generator(ray(B));
+
+  Poly_Con_Relation rel1 = ph.relation_with(A %= 0);
+
+  Poly_Con_Relation rel2 = ph.relation_with((A %= 1) / 5);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel1 == known_rel && rel2 == known_rel);
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(A %= 0) == " << rel1 << endl;
+  nout << "ph.relation_with((A %= 1) / 5) == " << rel2 << endl;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Polyhedron/relations3.cc b/tests/Polyhedron/relations3.cc
new file mode 100644
index 0000000..8cd07a2
--- /dev/null
+++ b/tests/Polyhedron/relations3.cc
@@ -0,0 +1,317 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A - B > 0);
+  ph.add_constraint(B >= 0);
+
+  Poly_Gen_Relation rel1 = ph.relation_with(point(B));
+  Poly_Gen_Relation rel2 = ph.relation_with(point(-B));
+
+  print_generators(ph, "*** ph ***");
+  nout << "ph.relation_with(point(B)) == " << rel1 << endl;
+  nout << "ph.relation_with(point(-B)) == " << rel2 << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel1 == known_result && rel2 == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2, EMPTY);
+  ph1.add_generator(point(A + B));
+
+  Poly_Con_Relation rel = ph1.relation_with(A - B == 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A - B == 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  gs.insert(line(B));
+
+  NNC_Polyhedron ph1(gs);
+
+  Poly_Con_Relation rel = ph1.relation_with(A >= 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A >= 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(line(A));
+  gs.insert(ray(B));
+  gs.insert(point());
+  NNC_Polyhedron ph1(gs);
+
+  Poly_Con_Relation rel = ph1.relation_with(A > 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A > 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(line(B));
+  gs.insert(point());
+  gs.insert(ray(A));
+  NNC_Polyhedron ph(gs);
+  Generator_System gs1;
+  for (Generator_System::const_iterator i = ph.generators().begin(),
+         gs_end = ph.generators().end(); i != gs_end; ++i)
+    if (!(*i).is_closure_point())
+      gs.insert(*i);
+  C_Polyhedron ph1(gs);
+
+  Poly_Con_Relation rel = ph1.relation_with(B >= 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B >= 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A));
+  NNC_Polyhedron ph(gs);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(B == 1);
+  Generator_System gs1;
+  for (Generator_System::const_iterator i = ph.generators().begin(),
+         gs_end = ph.generators().end(); i != gs_end; ++i)
+    if (!(*i).is_closure_point())
+      gs1.insert(*i);
+  ph1.add_generators(gs1);
+
+  Poly_Con_Relation rel = ph1.relation_with(B == 1);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B == 1) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(ray(B));
+  gs.insert(point(-A));
+  C_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(B <= 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B <= 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(A + B));
+  gs.insert(point(-A + B));
+  C_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(A >= 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A >= 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(-A));
+  gs.insert(ray(-B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(B < 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(B < 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(ray(A));
+  gs.insert(ray(A + B));
+  gs.insert(point(-B));
+  NNC_Polyhedron ph1(gs);
+  ph1.generators();
+
+  Poly_Con_Relation rel = ph1.relation_with(A < 0);
+  Poly_Con_Relation  known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  print_generators(ph1, "*** ph1 ***");
+  nout << "ph1.relation_with(A < 0) = " << rel << endl;
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.add_constraint(A == 0);
+  ph.add_constraint(B == 0);
+
+  Poly_Gen_Relation rel = ph.relation_with(closure_point(A));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(line(A)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::nothing();
+  return rel == known_result;
+}
+
+bool
+test12() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(A >= B);
+  ph.add_generator(point());
+  ph.generators();
+  ph.add_constraint(A <= B-1);
+
+  Poly_Gen_Relation rel = ph.relation_with(line(C));
+
+  print_constraints(ph, "*** ph ***");
+  nout << "ph.relation_with(line(C)) == " << rel << endl;
+
+  Poly_Gen_Relation known_result = Poly_Gen_Relation::subsumes();
+  return rel == known_result;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Polyhedron/removespacedims1.cc b/tests/Polyhedron/removespacedims1.cc
new file mode 100644
index 0000000..cc6c264
--- /dev/null
+++ b/tests/Polyhedron/removespacedims1.cc
@@ -0,0 +1,299 @@
+/* Removing space dimensions from a polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+  Generator_System gs;
+  gs.insert(point(0*x + y +0*z + 2*w));
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  ph.remove_space_dimensions(to_be_removed);
+
+  Generator_System known_result_gs;
+  known_result_gs.insert(point(0*x +2*y));
+  C_Polyhedron known_result(known_result_gs);
+
+  bool ok = (known_result == ph);
+
+  print_generators(ph, "*** ph ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Generator_System gs;
+
+  // Creating 10 points.
+  for (int i = 0; i < 10; i++) {
+    Linear_Expression e;
+    for (int j = 0; j < 10; j++)
+      e += (10*i + j) * Variable(j);
+    gs.insert(point(e));
+  }
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** before ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(Variable(0));
+  to_be_removed.insert(Variable(5));
+  to_be_removed.insert(Variable(3));
+  to_be_removed.insert(Variable(4));
+  to_be_removed.insert(Variable(8));
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  // Useless, but much clearer.
+  gs.clear();
+
+  Variable a(0);
+  Variable b(1);
+  Variable c(2);
+  Variable d(3);
+  Variable e(4);
+
+  Linear_Expression expr01 = (1*a + 2*b + 6*c + 7*d + 9*e);
+  Linear_Expression expr10 = 10 * (a + b + c + d + e);
+
+  for (int i = 0; i < 10; i++) {
+    Linear_Expression expr = i * expr10 + expr01;
+    gs.insert(point(expr));
+  }
+
+  C_Polyhedron known_result(gs);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ***");
+  print_generators(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable y(1);
+  Variable z(2);
+  Variable w(6);
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(w);
+
+  // A 10-dim space, empty polyhedron.
+  C_Polyhedron ph(10, EMPTY);
+  ph.remove_space_dimensions(to_be_removed);
+
+  // A 7-dim space, empty polyhedron.
+  C_Polyhedron known_result(7, EMPTY);
+
+  bool ok = (known_result == ph);
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Generator_System gs;
+  gs.insert(point(x + y + 2*z - w));
+
+  C_Polyhedron ph(gs);
+
+  print_generators(ph, "*** ph ***");
+
+  ph.remove_higher_space_dimensions(2);
+
+  Generator_System gs_known_result;
+  gs_known_result.insert(point(x + y));
+  C_Polyhedron known_result(gs_known_result);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(4, EMPTY);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.remove_higher_space_dimensions(0);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph after remove_higher_space_dimensions(0) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph1(3);
+  ph1.add_constraint(x >= 3);
+  ph1.add_constraint(x - y >= 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2 = ph1;
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(x);
+
+  ph1.remove_space_dimensions(to_be_removed);
+  ph2.remove_higher_space_dimensions(0);
+
+  bool ok = (ph1 == ph2);
+
+  print_generators(ph1, "*** ph1 after remove_space_dimensions ***");
+  print_generators(ph2, "*** ph2 after remove_higher_space_dimensions ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable A(0);
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(A));
+  C_Polyhedron ph(gs);
+  ph.add_constraint(A >= 2);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph,
+                    "*** after ph.remove_space_dimensions(to_be_removed) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A >= 3);
+
+  print_constraints(ph, "*** ph ***");
+
+  C_Polyhedron known_result(ph);
+
+  ph.remove_higher_space_dimensions(2);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.remove_higher_space_dimensions(2) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(2*A + B, 4));
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.remove_higher_space_dimensions(1);
+
+  C_Polyhedron known_result(1, EMPTY);
+  known_result.add_generator(point(A, 2));
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.remove_higher_space_dimensions(1) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+#ifdef DERIVED_TEST
+  DO_TEST_F8A(test02);
+#else
+  DO_TEST_F8(test02);
+#endif // !defined(DERIVED_TEST)
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Polyhedron/removespacedims2.cc b/tests/Polyhedron/removespacedims2.cc
new file mode 100644
index 0000000..fea8601
--- /dev/null
+++ b/tests/Polyhedron/removespacedims2.cc
@@ -0,0 +1,99 @@
+/* Removing space dimensions form an NNC polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph1(4);
+
+  ph1.add_constraint(x - y == 3);
+  ph1.add_constraint(z > x + 4);
+  ph1.add_constraint(y < 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  NNC_Polyhedron ph2(ph1);
+
+  ph1.remove_higher_space_dimensions(1);
+
+  // This is the set of the variables that we want to remove.
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(z);
+  to_be_removed.insert(Variable(3));
+
+  ph2.remove_space_dimensions(to_be_removed);
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** after remove_higher_space_dimensions(1) ***");
+  print_constraints(ph2,
+                    "*** after remove_space_dimensions(to_be_removed) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  NNC_Polyhedron ph(3);
+
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(y >= 1);
+  ph.add_constraint(z >= 1);
+
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(x);
+  to_be_removed.insert(z);
+
+  ph.remove_space_dimensions(to_be_removed);
+
+  NNC_Polyhedron known_result(1);
+  known_result.add_constraint(x >= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.remove_space_dimensions() ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/simplifyusingcontext1.cc b/tests/Polyhedron/simplifyusingcontext1.cc
new file mode 100644
index 0000000..f7b0496
--- /dev/null
+++ b/tests/Polyhedron/simplifyusingcontext1.cc
@@ -0,0 +1,489 @@
+/* Test Polyhedron::simplify_using_context_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron icosahedron(3);
+  icosahedron.add_constraint(4*x - 2*y - z + 14 >= 0);
+  icosahedron.add_constraint(4*x + 2*y - z + 2 >= 0);
+  icosahedron.add_constraint(x + y - 1 >= 0);
+  icosahedron.add_constraint(x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(x + 1 >= 0);
+  icosahedron.add_constraint(x + z - 1 >= 0);
+  icosahedron.add_constraint(2*x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(x - y + 5 >= 0);
+  icosahedron.add_constraint(2*x - y - 2*z + 13 >= 0);
+  icosahedron.add_constraint(-2*x - y + 2*z + 1 >= 0);
+  icosahedron.add_constraint(-x + y - 1 >= 0);
+  icosahedron.add_constraint(-x + y -2*z + 7 >= 0);
+  icosahedron.add_constraint(-4*x + 2*y + z - 4 >= 0);
+  icosahedron.add_constraint(-2*x + y + 2*z - 5 >= 0);
+  icosahedron.add_constraint(-x + 1 >= 0);
+  icosahedron.add_constraint(-x - z + 5 >= 0);
+  icosahedron.add_constraint(-4*x - 2*y + z + 8 >= 0);
+  icosahedron.add_constraint(-x - y + 5 >= 0);
+  icosahedron.add_constraint(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron column(3);
+  column.add_constraint(y >= 2);
+  column.add_constraint(y <= 4);
+  column.add_constraint(x >= 0);
+  column.add_constraint(x <= 1);
+
+  C_Polyhedron computed_result = icosahedron;
+  computed_result.simplify_using_context_assign(column);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-4*x - 2*y + z >= -8);
+  known_result.add_constraint(-4*x + 2*y + z >= 4);
+  known_result.add_constraint(-2*x - y + 2*z >= -1);
+  known_result.add_constraint(-2*x + y + 2*z >= 5);
+  known_result.add_constraint(-x - y - 2*z >= -13);
+  known_result.add_constraint(-x - z >= -5);
+  known_result.add_constraint(-x + y - 2*z >= -7);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(icosahedron, "*** icosahedron ***");
+  print_constraints(column, "*** column ***");
+  print_constraints(computed_result, "*** computed_result ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron icosahedron1(3);
+  icosahedron1.add_constraint(4*x - 2*y - z + 14 >= 0);
+  icosahedron1.add_constraint(4*x + 2*y - z + 2 >= 0);
+  icosahedron1.add_constraint(x + y - 1 >= 0);
+  icosahedron1.add_constraint(x + y + 2*z - 5 >= 0);
+  icosahedron1.add_constraint(x + 1 >= 0);
+  icosahedron1.add_constraint(x + z - 1 >= 0);
+  icosahedron1.add_constraint(2*x + y -2*z + 7 >= 0);
+  icosahedron1.add_constraint(x - y + 2*z + 1 >= 0);
+  icosahedron1.add_constraint(x - y + 5 >= 0);
+  icosahedron1.add_constraint(2*x - y - 2*z + 13 >= 0);
+  icosahedron1.add_constraint(-2*x - y + 2*z + 1 >= 0);
+  icosahedron1.add_constraint(-x + y - 1 >= 0);
+  icosahedron1.add_constraint(-x + y -2*z + 7 >= 0);
+  icosahedron1.add_constraint(-4*x + 2*y + z - 4 >= 0);
+  icosahedron1.add_constraint(-2*x + y + 2*z - 5 >= 0);
+  icosahedron1.add_constraint(-x + 1 >= 0);
+  icosahedron1.add_constraint(-x - z + 5 >= 0);
+  icosahedron1.add_constraint(-4*x - 2*y + z + 8 >= 0);
+  icosahedron1.add_constraint(-x - y + 5 >= 0);
+  icosahedron1.add_constraint(-x - y -2*z +13 >= 0);
+
+  C_Polyhedron icosahedron2 = icosahedron1;
+  icosahedron2.affine_image(x, x+5);
+
+
+  C_Polyhedron computed_result = icosahedron1;
+  computed_result.simplify_using_context_assign(icosahedron2);
+
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(-4*x - 2*y + z >= -8);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(icosahedron1, "*** icosahedron1 ***");
+  print_constraints(icosahedron2, "*** icosahedron2 ***");
+  print_constraints(computed_result, "*** computed_result ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(x <= 6);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x >= 0);
+  ph2.add_constraint(x <= 5);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron computed_result = ph1;
+
+  computed_result.simplify_using_context_assign(ph2);
+
+  C_Polyhedron known_result(1);
+
+  bool ok = (computed_result == known_result);
+
+  print_constraints(computed_result,
+                    "*** ph1.simplify_using_context_assign ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph1 = C_Polyhedron(3, UNIVERSE);
+  ph1.add_constraint(i >= 1);
+  ph1.add_constraint(i <= 10);
+  ph1.add_constraint(j >= 1);
+  ph1.add_constraint(j <= 10);
+  ph1.add_constraint(k == 0);
+
+  C_Polyhedron ph2 = C_Polyhedron(3, UNIVERSE);
+  ph2.add_constraint(i >= 0);
+  ph2.add_constraint(i <= 2);
+  ph2.add_constraint(j >= 2);
+  ph2.add_constraint(j <= 9);
+  ph2.add_constraint(k == 0);
+
+  print_constraints(ph1, "=== ph1 ===");
+  print_constraints(ph2, "=== ph2 ===");
+
+  C_Polyhedron known_result = C_Polyhedron(3, UNIVERSE);
+  known_result.add_constraint(i >= 1);
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "=== ph1.simplify_using_context_assign(ph2) ===");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(i == 1);
+  ph1.add_constraint(j + 1 == 0);
+  ph1.add_constraint(k == 3);
+
+  C_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(i == 1);
+  ph2.add_constraint(j + k == 2);
+  ph2.add_constraint(k >= 0);
+  ph2.add_constraint(k <= 3);
+
+  C_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(k == 3);
+  // PolyLib 5.22.3 does not simplify away the following equality.
+  // known_result.add_constraint(j + 1 == 0);
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "=== ph1.simplify_using_context_assign(ph2) ===");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(A == 0);
+  ph1.add_constraint(B == C);
+  ph1.add_constraint(B >= 2);
+  print_constraints(ph1, "\n=== ph1 ===");
+
+  C_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(A == 0);
+  ph2.add_constraint(C >= 2);
+  print_constraints(ph2, "\n=== ph2 ===");
+
+  ph1.simplify_using_context_assign(ph2);
+
+  C_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(B == C);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "\n=== ph1.simplify_using_context_assign(ph2) ===");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x == 0);
+  p.add_constraint(y == 0);
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= 0);
+  q.add_constraint(y >= 0);
+
+  C_Polyhedron known_result(p);
+
+  print_constraints(p, "*** p ***");
+  print_constraints(q, "*** q ***");
+
+  (void) p.simplify_using_context_assign(q);
+
+  bool ok = (p == known_result);
+
+  print_constraints(p, "*** p.simplify_using_context_assign(q) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron p(2);
+  p.add_constraint(x <= 0);
+  p.add_constraint(y <= 0);
+
+  C_Polyhedron q(2);
+  q.add_constraint(x >= 0);
+  q.add_constraint(y >= 0);
+
+  C_Polyhedron known_result(p);
+
+  print_constraints(p, "*** p ***");
+  print_constraints(q, "*** q ***");
+
+  (void) p.simplify_using_context_assign(q);
+
+  bool ok = (p == known_result);
+
+  print_constraints(p, "*** p.simplify_using_context_assign(q) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  C_Polyhedron ph2(1);
+
+  ph2.add_constraint(A == 0);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+                    "*** after ph1.simplify_using_context_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph1(3, UNIVERSE);
+  ph1.add_constraint(i >= 1);
+  ph1.add_constraint(i <= 10);
+  ph1.add_constraint(j >= 1);
+  ph1.add_constraint(j <= 10);
+  ph1.add_constraint(k == 0);
+
+  C_Polyhedron ph2(3, UNIVERSE);
+  ph2.add_constraint(i <= 25);
+  ph2.add_constraint(j <= 25);
+  ph2.add_constraint(i + j >= 25);
+  ph2.add_constraint(k == 0);
+
+  C_Polyhedron known_result(3, UNIVERSE);
+  known_result.add_constraint(i <= 10);
+  known_result.add_constraint(j <= 10);
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1);
+
+  return ok;
+}
+
+bool
+test11() {
+  C_Polyhedron ph1(0, EMPTY);
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result = ph1;
+
+  ph1.simplify_using_context_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1,
+            "*** after ph1.simplify_using_context_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+
+  C_Polyhedron ph1(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(0, UNIVERSE);
+
+  bool ok = !ph1.simplify_using_context_assign(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1,
+                   "*** ph1.simplify_using_context_assign(ph2) ***");
+  return ok;
+}
+
+bool
+test13() {
+
+  C_Polyhedron ph1(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(0, UNIVERSE);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = !ph1.simplify_using_context_assign(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1,
+                   "*** ph1.simplify_using_context_assign(ph2) ***");
+  return ok;
+}
+
+bool
+test14() {
+
+  C_Polyhedron ph1(0, UNIVERSE);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(0, UNIVERSE);
+
+  bool ok = !ph1.simplify_using_context_assign(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1,
+                   "*** ph1.simplify_using_context_assign(ph2) ***");
+  return ok;
+}
+
+bool
+test15() {
+
+  C_Polyhedron ph1(0, UNIVERSE);
+
+  print_constraints(ph1, "*** ph1 ***");
+
+  C_Polyhedron ph2(0, UNIVERSE);
+
+  print_constraints(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(0, UNIVERSE);
+
+  bool ok = ph1.simplify_using_context_assign(ph2);
+  ok &= (ph1 == known_result);
+
+  print_constraints(ph1,
+                   "*** ph1.simplify_using_context_assign(ph2) ***");
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8A(test01);
+  DO_TEST_F8(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Polyhedron/smm1.cc b/tests/Polyhedron/smm1.cc
new file mode 100644
index 0000000..fa438ed
--- /dev/null
+++ b/tests/Polyhedron/smm1.cc
@@ -0,0 +1,152 @@
+/* SEND + MORE = MONEY.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace Parma_Polyhedra_Library {
+  // Import all the output operators into the main PPL namespace.
+  using IO_Operators::operator<<;
+}
+
+namespace {
+
+namespace test01_namespace {
+
+// The classic cryptarithmetic puzzle:
+//
+//      S E N D
+//    + M O R E
+//    ---------
+//    M O N E Y
+
+void
+less_than(C_Polyhedron& ph, Variable X, Variable Y) {
+  ph.add_constraint(X+1 <= Y);
+}
+
+void
+constraints(C_Polyhedron& ph,
+            Variable S,
+            Variable E,
+            Variable N,
+            Variable D,
+            Variable M,
+            Variable O,
+            Variable R,
+            Variable Y,
+            int C1,
+            int C2,
+            int C3,
+            int C4) {
+  ph.add_constraint(S >= 0);
+  ph.add_constraint(E >= 0);
+  ph.add_constraint(N >= 0);
+  ph.add_constraint(D >= 0);
+  ph.add_constraint(M >= 0);
+  ph.add_constraint(O >= 0);
+  ph.add_constraint(R >= 0);
+  ph.add_constraint(Y >= 0);
+  ph.add_constraint(S <= 9);
+  ph.add_constraint(E <= 9);
+  ph.add_constraint(N <= 9);
+  ph.add_constraint(D <= 9);
+  ph.add_constraint(M <= 9);
+  ph.add_constraint(O <= 9);
+  ph.add_constraint(R <= 9);
+  ph.add_constraint(Y <= 9);
+  ph.add_constraint(S >= 1);
+  ph.add_constraint(M >= 1);
+  ph.add_constraint(M == C1);
+  ph.add_constraint(C2 + S + M == O + C1 * 10);
+  ph.add_constraint(C3 + E + O == N + 10 * C2);
+  ph.add_constraint(C4 + N + R == E + 10 * C3);
+  ph.add_constraint(D + E == Y + 10*C4);
+
+  less_than(ph, O, M);
+  less_than(ph, M, Y);
+  less_than(ph, Y, E);
+  less_than(ph, E, N);
+  less_than(ph, N, D);
+  less_than(ph, D, R);
+  less_than(ph, R, S);
+}
+
+} // namespace test01_namespace
+
+bool
+test01() {
+  Variable S(0);
+  Variable E(1);
+  Variable N(2);
+  Variable D(3);
+  Variable M(4);
+  Variable O(5);
+  Variable R(6);
+  Variable Y(7);
+
+  bool solution_found = false;
+
+  for (int C1 = 0; C1 <= 1; ++C1)
+    for (int C2 = 0; C2 <= 1; ++C2)
+      for (int C3 = 0; C3 <= 1; ++C3)
+        for (int C4 = 0; C4 <= 1; ++C4) {
+          C_Polyhedron ph(8);
+          test01_namespace::constraints(ph,
+                                        S, E, N, D, M, O, R, Y,
+                                        C1, C2, C3, C4);
+          if (ph.is_empty())
+            continue;
+
+          nout << "Solution constraints" << endl;
+          const Constraint_System& cs = ph.constraints();
+          std::copy(cs.begin(), cs.end(),
+                    std::ostream_iterator<Constraint>(nout, "\n"));
+          nout << "Solution generators" << endl;
+          const Generator_System& gs = ph.generators();
+          std::copy(gs.begin(), gs.end(),
+                    std::ostream_iterator<Generator>(nout, "\n"));
+          if (solution_found)
+            return true;
+          solution_found = true;
+
+          C_Polyhedron expected(8);
+          expected.add_constraint(S == 9);
+          expected.add_constraint(E == 5);
+          expected.add_constraint(N == 6);
+          expected.add_constraint(D == 7);
+          expected.add_constraint(M == 1);
+          expected.add_constraint(O == 0);
+          expected.add_constraint(R == 8);
+          expected.add_constraint(Y == 2);
+
+          if (ph != expected)
+            return false;
+        }
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/sparserow1.cc b/tests/Polyhedron/sparserow1.cc
new file mode 100644
index 0000000..744e846
--- /dev/null
+++ b/tests/Polyhedron/sparserow1.cc
@@ -0,0 +1,626 @@
+/* Test the Sparse_Matrix class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+#if PPL_USE_SPARSE_MATRIX
+
+#include <vector>
+#include <algorithm>
+#include <set>
+
+namespace {
+
+bool
+test01() {
+
+  Sparse_Row row(5);
+
+  if (row.size() != 5)
+    return false;
+
+  row.resize(4);
+
+  if (row.size() != 4)
+    return false;
+
+  return true;
+}
+
+bool
+test02() {
+
+  Sparse_Row row(5);
+
+  row[1] = 5;
+  row[3] = 6;
+
+  Sparse_Row::iterator itr = row.begin();
+
+  if (itr == row.end())
+    return false;
+
+  if (itr.index() != 1)
+    return false;
+
+  if (*itr != 5)
+    return false;
+
+  ++itr;
+
+  if (itr == row.end())
+    return false;
+
+  if (itr.index() != 3)
+    return false;
+
+  if (*itr != 6)
+    return false;
+
+  ++itr;
+
+  if (itr != row.end())
+    return false;
+
+  --itr;
+
+  if (itr == row.end())
+    return false;
+
+  if (itr.index() != 3)
+    return false;
+
+  if (*itr != 6)
+    return false;
+
+  Sparse_Row::const_iterator citr = row.cbegin();
+
+  if (citr == row.cend())
+    return false;
+
+  if (citr.index() != 1)
+    return false;
+
+  if (*citr != 5)
+    return false;
+
+  ++citr;
+
+  if (citr == row.cend())
+    return false;
+
+  if (citr.index() != 3)
+    return false;
+
+  if (*citr != 6)
+    return false;
+
+  ++citr;
+
+  if (citr != row.cend())
+    return false;
+
+  --citr;
+
+  if (citr == row.cend())
+    return false;
+
+  if (citr.index() != 3)
+    return false;
+
+  if (*citr != 6)
+    return false;
+
+  return true;
+}
+
+bool
+test03() {
+
+  Sparse_Row row(10);
+
+  row[1] = 2;
+  row[3] = 4;
+  row[5] = 6;
+  row[7] = 8;
+  row[9] = 10;
+
+  Sparse_Row::iterator itr = row.find(3);
+
+  row.reset(itr);
+
+  if (row.get(3) != 0)
+    return false;
+
+  row[3] = 4;
+
+  itr = row.find(3);
+  Sparse_Row::iterator itr2 = row.find(7);
+
+  row.reset(itr, itr2);
+
+  if (row.get(1) != 2)
+    return false;
+
+  if (row.get(3) != 0)
+    return false;
+
+  if (row.get(5) != 0)
+    return false;
+
+  if (row.get(7) != 8)
+    return false;
+
+  return true;
+}
+
+bool
+test04() {
+
+  Sparse_Row row(2);
+
+  row[1] = 2;
+
+  if (row.get(1) != 2)
+    return false;
+
+  if (row.find(0) != row.end())
+    return false;
+
+  row.swap_coefficients(0, 1);
+
+  if (row.get(0) != 2)
+    return false;
+
+  if (row.find(1) != row.end())
+    return false;
+
+  row.swap_coefficients(0, 1);
+
+  if (row.get(1) != 2)
+    return false;
+
+  if (row.find(0) != row.end())
+    return false;
+
+  row[0] = 3;
+
+  if (row.get(1) != 2)
+    return false;
+
+  if (row.get(0) != 3)
+    return false;
+
+  row.swap_coefficients(0, 1);
+
+  if (row.get(1) != 3)
+    return false;
+
+  if (row.get(0) != 2)
+    return false;
+
+  row.clear();
+
+  if (row.find(1) != row.end())
+    return false;
+
+  if (row.find(0) != row.end())
+    return false;
+
+  row.swap_coefficients(0, 1);
+
+  if (row.find(1) != row.end())
+    return false;
+
+  if (row.find(0) != row.end())
+    return false;
+
+  if (row.begin() != row.end())
+    return false;
+
+  if (row.cbegin() != row.cend())
+    return false;
+
+  return true;
+}
+
+class test05_functor {
+public:
+
+  inline void
+  operator()(Coefficient& x, const Coefficient& y) const {
+    x *= 2 - y;
+  }
+
+  inline void
+  operator()(Coefficient& x) const {
+    x *= 2;
+  }
+};
+
+bool
+test05() {
+
+  Sparse_Row x(9);
+
+  // x: ***000111
+  // (`*' is an unstored zero)
+
+  x[3] = 0;
+  x[4] = 0;
+  x[5] = 0;
+  x[6] = 1;
+  x[7] = 1;
+  x[8] = 1;
+
+  Sparse_Row y(9);
+
+  // y: *01*01*01
+  // (`*' is an unstored zero)
+
+  y[1] = 0;
+  y[2] = 1;
+  y[4] = 0;
+  y[5] = 1;
+  y[7] = 0;
+  y[8] = 1;
+
+  // x *= 2 - y
+
+  x.combine_needs_first(y, test05_functor(), test05_functor());
+
+  // x: ******221
+  // (`*' is an unstored zero)
+
+  if (x.find(0) != x.end())
+    return false;
+
+  if (x.find(1) != x.end())
+    return false;
+
+  if (x.find(2) != x.end())
+    return false;
+
+  if (x.find(3) != x.end())
+    return false;
+
+  if (x.find(4) != x.end())
+    return false;
+
+  if (x.find(5) != x.end())
+    return false;
+
+  if (x.get(6) != 2)
+    return false;
+
+  if (x.get(7) != 2)
+    return false;
+
+  if (x.get(8) != 1)
+    return false;
+
+  return true;
+}
+
+class test06_functor {
+public:
+
+  inline void
+  operator()(Coefficient& x, const Coefficient& y) const {
+    x += y;
+  }
+
+  inline void
+  operator()(Coefficient& /* x */) const {
+  }
+};
+
+bool
+test06() {
+
+  Sparse_Row x(3);
+
+  x[1] = 0;
+  x[2] = 1;
+
+  // x: *01
+
+  x.combine(x, test06_functor(), test06_functor(), test06_functor());
+
+  // x: *02
+
+  if (x.find(0) != x.end())
+    return false;
+
+  if (x.get(1) != 0)
+    return false;
+
+  if (x.get(2) != 2)
+    return false;
+
+  return true;
+}
+
+class test07_functor_1 {
+public:
+
+  inline void
+  operator()(Coefficient& x, const Coefficient& y) const {
+    x = (x % 2) - (y % 2);
+  }
+
+  inline void
+  operator()(Coefficient& x) const {
+    x %= 2;
+  }
+};
+
+class test07_functor_2 {
+public:
+
+  inline void
+  operator()(Coefficient& x, const Coefficient& y) const {
+    PPL_ASSERT(x == 0);
+    x = -(y % 2);
+  }
+};
+
+bool
+test07() {
+
+  Sparse_Row x(16);
+
+  //    0123456789ABCDEF
+  // x: ****000011112222
+
+  x[ 4] = 0;
+  x[ 5] = 0;
+  x[ 6] = 0;
+  x[ 7] = 0;
+  x[ 8] = 1;
+  x[ 9] = 1;
+  x[10] = 1;
+  x[11] = 1;
+  x[12] = 2;
+  x[13] = 2;
+  x[14] = 2;
+  x[15] = 2;
+
+  Sparse_Row y(16);
+
+  //    0123456789ABCDEF
+  // y: *012*012*012*012
+
+  y[ 1] = 0;
+  y[ 2] = 1;
+  y[ 3] = 2;
+  y[ 5] = 0;
+  y[ 6] = 1;
+  y[ 7] = 2;
+  y[ 9] = 0;
+  y[10] = 1;
+  y[11] = 2;
+  y[13] = 0;
+  y[14] = 1;
+  y[15] = 2;
+
+  // x = (x % 2) - (y % 2)
+
+  x.combine(y, test07_functor_1(), test07_functor_1(), test07_functor_2());
+
+  //    0123456789ABCDEF
+  // x: ******-**1*1**-*
+  //
+  // Legend:
+  // *: unstored zero
+  // -: -1
+
+  if (x.find(0) != x.end()) return false;
+  if (x.find(1) != x.end()) return false;
+  if (x.get(2) != -1) return false;
+  if (x.find(3) != x.end()) return false;
+  if (x.find(4) != x.end()) return false;
+  if (x.find(5) != x.end()) return false;
+  if (x.get(6) != -1) return false;
+  if (x.find(7) != x.end()) return false;
+  if (x.get(8) != 1) return false;
+  if (x.get(9) != 1) return false;
+  if (x.find(10) != x.end()) return false;
+  if (x.get(11) != 1) return false;
+  if (x.find(12) != x.end()) return false;
+  if (x.find(13) != x.end()) return false;
+  if (x.get(14) != -1) return false;
+  if (x.find(15) != x.end()) return false;
+
+  return true;
+}
+
+bool
+test08() {
+
+  Sparse_Row row(4);
+
+  if (row.lower_bound(2) != row.end())
+    return false;
+
+  const Sparse_Row& crow = row;
+
+  if (crow.lower_bound(2) != crow.end())
+    return false;
+
+  row[2] = 3;
+
+  if (row.lower_bound(1).index() != 2)
+    return false;
+
+  if (crow.lower_bound(1).index() != 2)
+    return false;
+
+  if (row.lower_bound(2).index() != 2)
+    return false;
+
+  if (crow.lower_bound(2).index() != 2)
+    return false;
+
+  if (row.lower_bound(3) != row.end())
+    return false;
+
+  if (crow.lower_bound(3) != crow.end())
+    return false;
+
+  // Now the same checks with a dummy hint.
+
+  if (row.lower_bound(row.end(), 1).index() != 2)
+    return false;
+
+  if (crow.lower_bound(crow.end(), 1).index() != 2)
+    return false;
+
+  if (row.lower_bound(row.end(), 2).index() != 2)
+    return false;
+
+  if (crow.lower_bound(crow.end(), 2).index() != 2)
+    return false;
+
+  if (row.lower_bound(row.end(), 3) != row.end())
+    return false;
+
+  if (crow.lower_bound(crow.end(), 3) != crow.end())
+    return false;
+
+  return true;
+}
+
+bool
+test09() {
+  // These test the construction of a Sparse_Row from a Dense_Row.
+  {
+    Dense_Row dense(3);
+    Sparse_Row sparse(dense);
+    if (sparse.size() != dense.size())
+      return false;
+    if (sparse.begin() != sparse.end())
+      return false;
+  }
+
+  {
+    Dense_Row dense(5);
+    dense[1] = 2;
+    dense[3] = 4;
+    Sparse_Row sparse(dense);
+    if (sparse.size() != dense.size())
+      return false;
+    Sparse_Row::iterator itr = sparse.begin();
+
+    if (itr == sparse.end())
+      return false;
+    if (itr.index() != 1)
+      return false;
+    if (*itr != 2)
+      return false;
+
+    ++itr;
+
+    if (itr == sparse.end())
+      return false;
+    if (itr.index() != 3)
+      return false;
+    if (*itr != 4)
+      return false;
+
+    ++itr;
+
+    if (itr != sparse.end())
+      return false;
+  }
+
+  {
+    Dense_Row dense(5);
+    dense[0] = 1;
+    dense[2] = 3;
+    dense[4] = 5;
+    Sparse_Row sparse(dense);
+    if (sparse.size() != dense.size())
+      return false;
+    Sparse_Row::iterator itr = sparse.begin();
+
+    if (itr == sparse.end())
+      return false;
+    if (itr.index() != 0)
+      return false;
+    if (*itr != 1)
+      return false;
+
+    ++itr;
+
+    if (itr == sparse.end())
+      return false;
+    if (itr.index() != 2)
+      return false;
+    if (*itr != 3)
+      return false;
+
+    ++itr;
+
+    if (itr == sparse.end())
+      return false;
+    if (itr.index() != 4)
+      return false;
+    if (*itr != 5)
+      return false;
+
+    ++itr;
+
+    if (itr != sparse.end())
+      return false;
+  }
+
+  return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
+
+#else // !PPL_USE_SPARSE_MATRIX
+
+// A dummy test to avoid compiler warnings in BEGIN_MAIN.
+bool test01() {
+  return true;
+}
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
+
+#endif // !PPL_USE_SPARSE_MATRIX
diff --git a/tests/Polyhedron/termination1.cc b/tests/Polyhedron/termination1.cc
new file mode 100644
index 0000000..1e35daf
--- /dev/null
+++ b/tests/Polyhedron/termination1.cc
@@ -0,0 +1,536 @@
+/* Test the termination analysis facilities of the PPL.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 2);
+  ph.add_constraint(2*xp1 + 1 >= x1);
+  ph.add_constraint(2*xp1 <= x1);
+  ph.add_constraint(xp2 == x2 + 1);
+  ph.add_constraint(xp2 >= 1);
+
+  C_Polyhedron mu_space;
+  all_affine_ranking_functions_MS(ph, mu_space);
+
+  print_constraints(mu_space, "*** mu_space ***");
+
+  Variable mu1(0);
+  Variable mu2(1);
+  Variable mu0(2);
+  C_Polyhedron known_result(3);
+  known_result.add_constraint(mu1 - mu2 >= 1);
+  known_result.add_constraint(mu0 + 2*mu1 >= 0);
+  known_result.add_constraint(mu2 >= 0);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return known_result == mu_space;
+}
+
+bool
+test02() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 2);
+  ph.add_constraint(2*xp1 + 1 >= x1);
+  ph.add_constraint(2*xp1 <= x1);
+  ph.add_constraint(xp2 == x2 + 1);
+  ph.add_constraint(xp2 >= 1);
+
+  Generator witness(point());
+  one_affine_ranking_function_MS(ph, witness);
+
+  print_generator(witness, "*** witness ***");
+
+  Variable mu1(0);
+  Variable mu2(1);
+  Variable mu0(2);
+  Generator known_result(point(0*mu0 + 1*mu1 + 0*mu2));
+
+  print_generator(known_result, "*** known_result ***");
+
+  return known_result == witness;
+}
+
+bool
+test03() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 2);
+  ph.add_constraint(2*xp1 + 1 >= x1);
+  ph.add_constraint(2*xp1 <= x1);
+  ph.add_constraint(xp2 == x2 + 1);
+  ph.add_constraint(xp2 >= 1);
+
+  return termination_test_MS(ph);
+}
+
+bool
+test04() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 2);
+  ph.add_constraint(2*xp1 + 1 >= x1);
+  ph.add_constraint(2*xp1 <= x1);
+  ph.add_constraint(xp2 == x2 + 1);
+  ph.add_constraint(xp2 >= 1);
+
+  NNC_Polyhedron mu_space;
+  all_affine_ranking_functions_PR(ph, mu_space);
+
+  print_constraints(mu_space, "*** mu_space ***");
+
+  Variable mu1(0);
+  Variable mu2(1);
+  Variable mu0(2);
+  NNC_Polyhedron known_result(3);
+  known_result.add_constraint(mu1 - mu2 > 0);
+  known_result.add_constraint(mu2 >= 0);
+
+  print_constraints(known_result, "*** known_result ***");
+
+  return known_result == mu_space;
+}
+
+bool
+test05() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 2);
+  ph.add_constraint(2*xp1 + 1 >= x1);
+  ph.add_constraint(2*xp1 <= x1);
+  ph.add_constraint(xp2 == x2 + 1);
+  ph.add_constraint(xp2 >= 1);
+
+  Generator witness(point());
+  one_affine_ranking_function_PR(ph, witness);
+
+  print_generator(witness, "*** witness ***");
+
+  Variable mu1(0);
+  Variable mu2(1);
+  Variable mu0(2);
+  Generator known_result(point(0*mu0 + 2*mu1 + 0*mu2));
+
+  print_generator(known_result, "*** known_result ***");
+
+  return known_result == witness;
+}
+
+bool
+test06() {
+  C_Polyhedron ph_before(2);
+  {
+    Variable x1(0);
+    Variable x2(1);
+    ph_before.add_constraint(-x1     <= -1);
+    ph_before.add_constraint(x1 - x2 <=  0);
+  }
+
+  C_Polyhedron ph_after(4);
+  {
+    Variable xp1(0);
+    Variable xp2(1);
+    Variable x1(2);
+    Variable x2(3);
+    ph_after.add_constraint(x1 - x2 + xp2  <=  0);
+    ph_after.add_constraint(-x1 + x2 - xp2 <=  0);
+  }
+
+  return termination_test_PR_2(ph_before, ph_after);
+}
+
+bool
+test07() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  BD_Shape<int> bds(4);
+  bds.add_constraint(x1 >= 2);
+  bds.add_constraint(xp1 >= x1 - 2);
+  bds.add_constraint(xp1 <= x1 - 1);
+  bds.add_constraint(xp2 == x2 + 1);
+  bds.add_constraint(xp2 >= 1);
+
+  return termination_test_MS(bds) &&  termination_test_PR(bds);
+}
+
+bool
+test08() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(xp1 - x1 >= 0);
+  ph.add_constraint(-xp1 + x1 >= 0);
+  ph.add_constraint(-xp2 + x2 >= 1);
+  ph.add_constraint(xp2 >= 0);
+  ph.add_constraint(xp1 >= 1);
+
+  return termination_test_MS(ph);
+}
+
+bool
+test09() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(xp1 - x1 >= 0);
+  ph.add_constraint(-xp1 + x1 >= 0);
+  ph.add_constraint(-xp2 + x2 >= 1);
+  ph.add_constraint(xp2 >= 0);
+  ph.add_constraint(xp1 >= 1);
+
+  return termination_test_PR(ph);
+}
+
+bool
+test10() {
+  C_Polyhedron ph(10);
+  {
+    Variable x1(5);
+    Variable x2(6);
+    Variable x3(7);
+    Variable x4(8);
+    Variable x5(9);
+    ph.add_constraint(x4 >= 0);
+    ph.add_constraint(x2 - x3 - x4 >= 1);
+  }
+
+  {
+    Variable x1(5);
+    Variable x2(6);
+    Variable x3(7);
+    Variable x4(8);
+    Variable x5(9);
+
+    Variable xp1(0);
+    Variable xp2(1);
+    Variable xp3(2);
+    Variable xp4(3);
+    Variable xp5(4);
+
+    ph.add_constraint(x4 - xp4 <= -1);
+    ph.add_constraint(x3 == xp3);
+    ph.add_constraint(x2 == xp2);
+    ph.add_constraint(x1 == xp1);
+  }
+
+  return termination_test_MS(ph);
+}
+
+bool
+test11() {
+  C_Polyhedron ph_before(5);
+  {
+    Variable x1(0);
+    Variable x2(1);
+    Variable x3(2);
+    Variable x4(3);
+    Variable x5(4);
+    ph_before.add_constraint(x4 >= 0);
+    ph_before.add_constraint(x2 - x3 - x4 >= 1);
+  }
+
+  C_Polyhedron ph_after(10);
+  {
+    Variable x1(5);
+    Variable x2(6);
+    Variable x3(7);
+    Variable x4(8);
+    Variable x5(9);
+
+    Variable xp1(0);
+    Variable xp2(1);
+    Variable xp3(2);
+    Variable xp4(3);
+    Variable xp5(4);
+
+    ph_after.add_constraint(x4 - xp4 <= -1);
+    ph_after.add_constraint(x3 == xp3);
+    ph_after.add_constraint(x2 == xp2);
+    ph_after.add_constraint(x1 == xp1);
+  }
+
+  return termination_test_MS_2(ph_before, ph_after);
+}
+
+bool
+test12() {
+  C_Polyhedron ph_before(2);
+  {
+    Variable x1(0);
+    Variable x2(1);
+    ph_before.add_constraint(x1 >= 1);
+    ph_before.add_constraint(x2 <= 0);
+  }
+
+  C_Polyhedron ph_after(4);
+  {
+    Variable x1(2);
+    Variable x2(3);
+
+    Variable xp1(0);
+    Variable xp2(1);
+
+    ph_after.add_constraint(xp2 == 1);
+    ph_after.add_constraint(x1 - xp1 >= 1);
+  }
+
+  return termination_test_MS_2(ph_before, ph_after);
+}
+
+bool
+test13() {
+  C_Polyhedron ph_before(2);
+  {
+    Variable x1(0);
+    Variable x2(1);
+    ph_before.add_constraint(x1 >= 1);
+    ph_before.add_constraint(x2 <= 0);
+  }
+
+  C_Polyhedron ph_after(4);
+  {
+    Variable x1(2);
+    Variable x2(3);
+
+    Variable xp1(0);
+    Variable xp2(1);
+
+    ph_after.add_constraint(xp2 == 1);
+    ph_after.add_constraint(x1 - xp1 >= 1);
+  }
+
+  return termination_test_PR_2(ph_before, ph_after);
+}
+
+bool
+test14() {
+  C_Polyhedron ph(4);
+  {
+    Variable x1(2);
+    Variable x2(3);
+
+    Variable xp1(0);
+    Variable xp2(1);
+
+    ph.add_constraint(xp2 == 1);
+    ph.add_constraint(x1 >= 1);
+    ph.add_constraint(x1 - xp1 >= 1);
+    ph.add_constraint(x2 <= 0);
+  }
+
+  return termination_test_PR(ph);
+}
+
+
+bool
+test15() {
+  Variable xp1(0);
+  Variable x1(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x1 >= 3);
+  ph.add_constraint(xp1 >= 1);
+
+  return !termination_test_MS(ph);
+}
+
+bool
+test16() {
+  Variable xp1(0);
+  Variable x1(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x1 >= 3);
+  ph.add_constraint(xp1 >= 1);
+
+  return !termination_test_PR(ph);
+}
+
+bool
+test17() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 1);
+  ph.add_constraint(x2 >= 1);
+  ph.add_constraint(x1 - x2 <= -1);
+  ph.add_constraint(xp1 >= 1);
+  ph.add_constraint(xp2 >= 1);
+  ph.add_constraint(x1 == xp1);
+
+  return !termination_test_MS(ph);
+}
+
+bool
+test18() {
+  Variable xp1(0);
+  Variable xp2(1);
+  Variable x1(2);
+  Variable x2(3);
+  C_Polyhedron ph(4);
+  ph.add_constraint(x1 >= 1);
+  ph.add_constraint(x2 >= 1);
+  ph.add_constraint(x1 - x2 <= -1);
+  ph.add_constraint(xp1 >= 1);
+  ph.add_constraint(xp2 >= 1);
+  ph.add_constraint(x1 == xp1);
+
+  return !termination_test_PR(ph);
+}
+
+bool
+test19() {
+  Variable D(0);
+  Variable E(1);
+  Variable F(2);
+  Variable A(3);
+  Variable B(4);
+  Variable C(5);
+  C_Polyhedron ph(6);
+
+  ph.add_constraint(A == D);
+  ph.add_constraint(B == E);
+  ph.add_constraint(B - F >= 0);
+  ph.add_constraint(A - F >= 0);
+  ph.add_constraint(C >=0);
+  ph.add_constraint(C - F <= -1);
+
+  Generator witness(point());
+  one_affine_ranking_function_PR(ph, witness);
+
+  print_generator(witness, "*** witness ***");
+
+  Variable mu1(0);
+  Variable mu2(1);
+  Variable mu3(2);
+  Variable mu0(3);
+  Generator known_result(point(0*mu0 + 1*mu1 - 1*mu3));
+
+  print_generator(known_result, "*** known_result ***");
+
+  return known_result == witness;
+}
+
+bool
+test20() {
+  Variable D(0);
+  Variable E(1);
+  Variable F(2);
+  Variable A(3);
+  Variable B(4);
+  Variable C(5);
+  C_Polyhedron ph(6);
+
+  ph.add_constraint(A == D);
+  ph.add_constraint(B == E);
+  ph.add_constraint(B - F >= 0);
+  ph.add_constraint(A - F >= 0);
+  ph.add_constraint(C >=0);
+  ph.add_constraint(C - F <= -1);
+
+  Generator witness(point());
+  one_affine_ranking_function_MS(ph, witness);
+
+  print_generator(witness, "*** witness ***");
+
+  Variable mu1(0);
+  Variable mu2(1);
+  Variable mu3(2);
+  Variable mu0(3);
+  Generator known_result(point(-1*mu0 + 1*mu1 - 1*mu3));
+
+  print_generator(known_result, "*** known_result ***");
+
+  return known_result == witness;
+}
+
+bool
+test21() {
+  C_Polyhedron ph(2);
+  return !termination_test_PR(ph);
+}
+
+bool
+test22() {
+  C_Polyhedron ph(2);
+  NNC_Polyhedron mu_space;
+  all_affine_ranking_functions_PR(ph, mu_space);
+
+  print_constraints(ph, "*** ph ***");
+  return ph.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+  DO_TEST(test22);
+END_MAIN
diff --git a/tests/Polyhedron/termination2.cc b/tests/Polyhedron/termination2.cc
new file mode 100644
index 0000000..05a8c7e
--- /dev/null
+++ b/tests/Polyhedron/termination2.cc
@@ -0,0 +1,178 @@
+/* Test the termination analysis facilities of the PPL.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  C_Polyhedron ph1(2);
+  C_Polyhedron ph2(4);
+  bool ok1 = !termination_test_MS(ph1) && !termination_test_PR(ph1);
+  bool ok2 = !termination_test_MS_2(ph1, ph2)
+    && !termination_test_PR_2(ph1, ph2);
+  return ok1 && ok2;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(4, EMPTY);
+  bool ok1 = termination_test_MS(ph1) && termination_test_PR(ph1);
+  bool ok2 = termination_test_MS_2(ph1, ph2)
+    && termination_test_PR_2(ph1, ph2);
+  return ok1 && ok2;
+}
+
+bool
+test03() {
+  C_Polyhedron ph1(2);
+  C_Polyhedron ph2(4, EMPTY);
+  bool ok = termination_test_MS_2(ph1, ph2)
+              && termination_test_PR_2(ph1, ph2);
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(4);
+  bool ok = termination_test_PR_2(ph1, ph2);
+  ok = ok && termination_test_MS_2(ph1, ph2);
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph1(2);
+  C_Polyhedron ph2(4);
+  Generator witness(point());
+  bool ok = !one_affine_ranking_function_MS(ph1, witness);
+  ok = ok && !one_affine_ranking_function_PR(ph1, witness);
+  ok = ok && !one_affine_ranking_function_MS_2(ph1, ph2, witness);
+  ok = ok && !one_affine_ranking_function_PR_2(ph1, ph2, witness);
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(4, EMPTY);
+  Generator witness(point());
+  bool ok = one_affine_ranking_function_MS(ph1, witness);
+  ok = ok && one_affine_ranking_function_PR(ph1, witness);
+  ok = ok && one_affine_ranking_function_MS_2(ph1, ph2, witness);
+  ok = ok && one_affine_ranking_function_PR_2(ph1, ph2, witness);
+  return ok;
+}
+
+bool
+test07() {
+  C_Polyhedron ph1(2, EMPTY);
+  C_Polyhedron ph2(4);
+  Generator witness(point());
+  bool ok = one_affine_ranking_function_PR_2(ph1, ph2, witness);
+  ok = ok && one_affine_ranking_function_MS_2(ph1, ph2, witness);
+  return ok;
+}
+
+bool
+test08() {
+  C_Polyhedron ph1(2);
+  C_Polyhedron ph2(4, EMPTY);
+  Generator witness(point());
+  bool ok = one_affine_ranking_function_PR_2(ph1, ph2, witness);
+  ok = ok && one_affine_ranking_function_MS_2(ph1, ph2, witness);
+  return ok;
+}
+
+bool
+test09() {
+  C_Polyhedron ph1(2);
+  C_Polyhedron ph2(4);
+  C_Polyhedron c_mu_space;
+  NNC_Polyhedron nnc_mu_space;
+  all_affine_ranking_functions_MS(ph1, c_mu_space);
+  all_affine_ranking_functions_MS_2(ph1, ph2, c_mu_space);
+  all_affine_ranking_functions_PR(ph1, nnc_mu_space);
+  all_affine_ranking_functions_PR_2(ph1, ph2, nnc_mu_space);
+
+  C_Polyhedron c_known_result(3, EMPTY);
+  NNC_Polyhedron nnc_known_result(3, EMPTY);
+
+  print_constraints(ph1, "*** ph ***");
+  print_constraints(c_mu_space, "*** c_mu_space ***");
+  print_constraints(nnc_mu_space, "*** nnc_mu_space ***");
+  return ph1.OK() && (nnc_mu_space == nnc_known_result);
+}
+
+bool
+test10() {
+  C_Polyhedron ph_before(2, EMPTY);
+  C_Polyhedron ph_after(4, EMPTY);
+  C_Polyhedron c_mu_space;
+  NNC_Polyhedron nnc_mu_space;
+  C_Polyhedron c_known_result(3, UNIVERSE);
+  NNC_Polyhedron nnc_known_result(3, UNIVERSE);
+  bool ok = true;
+
+  all_affine_ranking_functions_MS(ph_after, c_mu_space);
+  ok &= (c_mu_space == c_known_result);
+
+  all_affine_ranking_functions_MS_2(ph_before, ph_after, c_mu_space);
+  ok &= (c_mu_space == c_known_result);
+
+//   all_affine_ranking_functions_PR(ph_after, nnc_mu_space);
+//   ok &= (nnc_mu_space == nnc_known_result);
+
+  all_affine_ranking_functions_PR_2(ph_before, ph_after, nnc_mu_space);
+  ok &= (nnc_mu_space == nnc_known_result);
+
+  print_constraints(ph_after, "*** ph_after ***");
+
+  print_generators(c_known_result.minimized_generators(),
+                   "*** c_known_result ***");
+  print_generators(nnc_known_result.minimized_generators(),
+                   "*** nnc_known_result ***");
+
+  print_generators(c_mu_space.minimized_generators(), "*** c_mu_space ***");
+  print_generators(nnc_mu_space.minimized_generators(), "*** nnc_mu_space ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/timeelapse1.cc b/tests/Polyhedron/timeelapse1.cc
new file mode 100644
index 0000000..588b14b
--- /dev/null
+++ b/tests/Polyhedron/timeelapse1.cc
@@ -0,0 +1,251 @@
+/* Test Polyhedron::time_elapse_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+  ph1.add_constraint(x >= 1);
+  ph1.add_constraint(x <= 3);
+  ph1.add_constraint(y >= 1);
+  ph1.add_constraint(y <= 3);
+
+  C_Polyhedron ph2(2);
+  ph2.add_constraint(y == 5);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron known_result(2, EMPTY);
+  known_result.add_generator(point(y));
+  known_result.add_generator(ray(y));
+  known_result.add_generator(line(x));
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  C_Polyhedron ph1(0, EMPTY);
+  C_Polyhedron ph2;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron ph3(2, EMPTY);
+  C_Polyhedron ph4(2);
+
+  print_constraints(ph3, "*** ph3 ***");
+  print_constraints(ph4, "*** ph4 ***");
+
+  ph3.time_elapse_assign(ph4);
+
+  C_Polyhedron ph5(2);
+  C_Polyhedron ph6(2, EMPTY);
+
+  print_constraints(ph5, "*** ph5 ***");
+  print_constraints(ph6, "*** ph6 ***");
+
+  ph5.time_elapse_assign(ph6);
+
+  bool ok = ph1.is_empty() && ph3.is_empty() && ph5.is_empty();
+
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+  print_generators(ph3, "*** ph3_time_elapse_assign(ph4) ***");
+  print_generators(ph5, "*** ph5_time_elapse_assign(ph6) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  gs1.insert(point(A + B));
+  C_Polyhedron ph1(gs1);
+
+  Generator_System gs2;
+  gs2.insert(point(0*B));
+  C_Polyhedron ph2(gs2);
+
+  print_generators(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  C_Polyhedron known_result(ph1);
+
+  ph1.time_elapse_assign(ph2);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  C_Polyhedron ph1;
+  C_Polyhedron ph2(0, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph1 == known_result);
+
+  print_constraints(ph1, "*** after ph1.time_elapse_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph1(2);
+  ph1.generators();
+  ph1.add_constraint(A == 0);
+  ph1.add_constraint(B == 0);
+
+  C_Polyhedron ph2(2);
+  ph2.generators();
+  ph2.add_constraint(A == 2);
+  ph2.add_constraint(B == 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  C_Polyhedron ph3(2, EMPTY);
+  ph3.add_generator(point());
+  ph3.constraints();
+
+  C_Polyhedron ph4(2, EMPTY);
+  ph4.add_generator(point(2*A + 2*B));
+
+  print_generators(ph3, "*** ph3 ***");
+  print_generators(ph4, "*** ph4 ***");
+
+  ph3.time_elapse_assign(ph4);
+
+  bool ok = (ph1 ==  ph3);
+
+  print_generators(ph1, "*** after ph1.time_elapse_assign(ph2) ***");
+  print_generators(ph3, "*** after ph3.time_elapse_assign(ph4) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph1(2);
+
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x + y - 2 <= 0);
+
+  C_Polyhedron ph2(2);
+
+  ph2.add_constraint(x == -1);
+  ph2.add_constraint(y == -1);
+
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  ps1.add_disjunct(ph1);
+  ps1.add_disjunct(ph2);
+
+  C_Polyhedron ph3(2);
+
+  ph3.add_constraint(x >= 2);
+  ph3.add_constraint(x <= 4);
+  ph3.add_constraint(y == 3);
+
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+  ps2.add_disjunct(ph3);
+
+  print_constraints(ps1, "*** ps1 ***");
+  print_constraints(ps2, "*** ps2 ***");
+
+  ps1.time_elapse_assign(ps2);
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(point(2*x));
+  known_gs.insert(point(2*y));
+  known_gs.insert(ray(2*x + 3*y));
+  known_gs.insert(ray(4*x + 3*y));
+
+  C_Polyhedron known_ph1(known_gs);
+
+  known_gs.clear();
+  known_gs.insert(point(-x - y));
+  known_gs.insert(ray(2*x + 3*y));
+  known_gs.insert(ray(4*x + 3*y));
+  C_Polyhedron known_ph2(known_gs);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  // Inserting out of order on purpose.
+  known_result.add_disjunct(known_ph2);
+  known_result.add_disjunct(known_ph1);
+
+  bool ok = (ps1 == known_result);
+
+  print_constraints(ps1, "*** ps1.time_elapse_assign(ps2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/timeelapse2.cc b/tests/Polyhedron/timeelapse2.cc
new file mode 100644
index 0000000..a0d8f32
--- /dev/null
+++ b/tests/Polyhedron/timeelapse2.cc
@@ -0,0 +1,133 @@
+/* Test time_elapse_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+
+  ph1.add_constraint(x >= 0);
+  ph1.add_constraint(y >= 0);
+  ph1.add_constraint(x + y - 2 <= 0);
+
+  NNC_Polyhedron ph2(2);
+
+  ph2.add_constraint(x > 2);
+  ph2.add_constraint(x < 4);
+  ph2.add_constraint(y == 3);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  Generator_System known_gs;
+  known_gs.insert(point());
+  known_gs.insert(point(2*x));
+  known_gs.insert(point(2*y));
+  known_gs.insert(ray(2*x + 3*y));
+  known_gs.insert(ray(4*x + 3*y));
+
+  NNC_Polyhedron known_result(known_gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs1;
+  cs1.insert(x > 3);
+  cs1.insert(y > 3);
+  NNC_Polyhedron ph(cs1);
+
+  NNC_Polyhedron ph1(ph);
+
+  Generator_System gs;
+  gs.insert(point(x + y));
+  NNC_Polyhedron ph2(gs);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  bool ok = (ph1 == ph);
+
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(x == 3);
+  ph1.add_constraint(y > 2);
+
+  NNC_Polyhedron ph2(2);
+  ph2.add_constraint(x > 3);
+  ph2.add_constraint(y > 2);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  ph1.time_elapse_assign(ph2);
+
+  Generator_System gs;
+  gs.insert(closure_point(3*x + 2*y));
+  gs.insert(point(3*x + 3*y));
+  gs.insert(ray(y));
+  gs.insert(ray(x));
+
+  NNC_Polyhedron known_result(gs);
+
+  bool ok = (ph1 == known_result);
+
+  print_generators(ph1, "*** ph1_time_elapse_assign(ph2) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/topclosed1.cc b/tests/Polyhedron/topclosed1.cc
new file mode 100644
index 0000000..a2e6c79
--- /dev/null
+++ b/tests/Polyhedron/topclosed1.cc
@@ -0,0 +1,96 @@
+/* Test Polyhedron::is_topologically_closed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(A >= 0);
+
+  NNC_Polyhedron ph2(2, EMPTY);
+
+  NNC_Polyhedron ph3;
+
+  bool ok = ph1.is_topologically_closed()
+    && ph2.is_topologically_closed()
+    && ph3.is_topologically_closed();
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(ph3, "*** ph3 ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+
+  NNC_Polyhedron ph1(1, EMPTY);
+
+  Generator_System gs1;
+  gs1.insert(point(A));
+  gs1.insert(closure_point());
+  gs1.insert(closure_point(A));
+  ph1.add_generators(gs1);
+
+  bool ok = !ph1.is_topologically_closed();
+
+  print_generators(ph1, "*** ph1 ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Generator_System gs;
+  gs.insert(point(0*B));
+  gs.insert(closure_point(-A));
+  gs.insert(closure_point(A));
+  gs.insert(line(A));
+
+  NNC_Polyhedron ph(gs);
+
+  bool ok = ph.is_topologically_closed();
+
+  print_constraints(ph, "*** ph ***");
+  print_generators(ph, "*** ph ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/topclosure1.cc b/tests/Polyhedron/topclosure1.cc
new file mode 100644
index 0000000..c41adf3
--- /dev/null
+++ b/tests/Polyhedron/topclosure1.cc
@@ -0,0 +1,161 @@
+/* Test Polyhedron::topological_closure_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph1(2);
+  ph1.add_constraint(A > 1);
+  ph1.add_constraint(A - B > 0);
+  Generator_System gs;
+  gs.insert(point(2*A));
+  gs.insert(closure_point(A + B));
+  gs.insert(ray(-B));
+  gs.insert(ray(A + B));
+  NNC_Polyhedron ph2(gs);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_generators(ph2, "*** ph2 ***");
+
+  ph1.topological_closure_assign();
+  ph2.topological_closure_assign();
+
+  bool ok = (ph1 == ph2);
+
+  print_constraints(ph1, "*** after ph1.topological_closure_assign() ***");
+  print_generators(ph2, "*** after ph2.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  NNC_Polyhedron ph1;
+  NNC_Polyhedron ph2(2, EMPTY);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+
+  NNC_Polyhedron known_result1 = ph1;
+  NNC_Polyhedron known_result2 = ph2;
+
+  ph1.topological_closure_assign();
+  ph2.topological_closure_assign();
+
+  bool ok = (ph1 == known_result1 && ph2 == known_result2);
+
+  print_constraints(ph1, "*** after ph1.topological_closure_assign() ***");
+  print_constraints(ph2, "*** after ph2.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A - B == 0);
+  ph.add_constraint(A >= 0);
+
+  C_Polyhedron known_result(ph);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.topological_closure_assign();
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2);
+  ph.generators();
+  ph.add_constraint(A > 0);
+  ph.add_constraint(A == B);
+
+  print_constraints(ph, "*** ph ***");
+
+  ph.topological_closure_assign();
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(A == B);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.topological_closure_assign() ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable A(0);
+  Variable B(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point(A));
+  ph.constraints();
+  ph.add_generator(closure_point());
+  ph.add_generator(ray(A));
+  ph.add_generator(ray(B));
+
+  print_generators(ph, "*** ph ***");
+
+  ph.topological_closure_assign();
+
+  NNC_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+  known_result.add_constraint(B >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** after ph.topological_closure_assign() ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/unconstrain1.cc b/tests/Polyhedron/unconstrain1.cc
new file mode 100644
index 0000000..dfb04e0
--- /dev/null
+++ b/tests/Polyhedron/unconstrain1.cc
@@ -0,0 +1,251 @@
+/* Test Polyhedron::unconstrain().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  ph.unconstrain(A);
+
+  C_Polyhedron known_result(2, EMPTY);
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(A) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs(A, B);
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(2, EMPTY);
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == B);
+  ph.add_constraint(B >= 0);
+  print_generators(ph, "*** ph ***");
+
+  ph.unconstrain(B);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(B) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(A == B);
+  ph.add_constraint(B >= 0);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs(B);
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(A >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  C_Polyhedron ph(0, EMPTY);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs;
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(0, EMPTY);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  C_Polyhedron ph(0);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs;
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    ph.unconstrain(Variable(7));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test08() {
+  try {
+    C_Polyhedron ph(1);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    Variables_Set vs(Variable(0), Variable(3));
+    ph.unconstrain(vs);
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+
+  C_Polyhedron ph(5);
+  ph.add_constraint(A + 3*B - 7 == 9);
+  ph.add_constraint(A - 3*B - D + E >= 0);
+  ph.add_constraint(C <= D);
+  ph.add_constraint(E <= 2*B + D);
+  ph.add_constraint(E >= 0);
+  print_generators(ph, "*** ph ***");
+
+  Variables_Set vs(A, B);
+  vs.insert(D);
+  ph.unconstrain(vs);
+
+  C_Polyhedron known_result(5);
+  known_result.add_constraint(E >= 0);
+
+  bool ok = (ph == known_result);
+
+  print_generators(ph, "*** after ph.unconstrain(vs) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  try {
+    C_Polyhedron ph(8);
+    // This is an invalid use of the method unconstrain(Variable):
+    // it is illegal to (try to) unconstrain a space dimension
+    // that is not in the polyhedron.
+    ph.unconstrain(Variable(8));
+
+    // It is an error if the exception is not thrown.
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+    // It is an error if the wrong exception is thrown.
+  }
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Polyhedron/universe1.cc b/tests/Polyhedron/universe1.cc
new file mode 100644
index 0000000..0a53180
--- /dev/null
+++ b/tests/Polyhedron/universe1.cc
@@ -0,0 +1,165 @@
+/* Test Polyhedron::is_universe().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  C_Polyhedron ph(3);
+  print_constraints(ph, "*** ph ***");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return universe;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= z);
+  ph.add_constraint(z == 3);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(y == 0);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(x <= 3);
+
+  Constraint_System cs = ph.constraints();
+  print_constraints(ph, "*** ph ***");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x >= 1);
+  ph.add_constraint(y >= 1);
+  ph.add_constraint(x <= 4);
+  ph.add_constraint(y <= 4);
+
+  Constraint_System cs = ph.constraints();
+  print_constraints(ph, "*** ph ***");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(x - y - z >= 0);
+
+  print_constraints(ph, "*** ph ***");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return !universe;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(ray(-x));
+  gs.insert(ray(x + y));
+  gs.insert(ray(x - y));
+
+  C_Polyhedron ph(gs);
+  print_generators(ph, "*** ph ***");
+
+  bool universe = ph.is_universe();
+
+  nout << "*** ph.is_universe() ***"
+       << endl
+       << (universe ? "true" : "false")
+       << endl;
+
+  return universe;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/universe2.cc b/tests/Polyhedron/universe2.cc
new file mode 100644
index 0000000..913f662
--- /dev/null
+++ b/tests/Polyhedron/universe2.cc
@@ -0,0 +1,80 @@
+/* Test the function is_universe() for a NNC_polyhedron.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  NNC_Polyhedron ph1(4);
+  NNC_Polyhedron ph2(3);
+  NNC_Polyhedron ph3(3);
+
+  ph2.add_constraint(Linear_Expression(1) > 0);
+  ph3.add_constraint(Linear_Expression(1) < 0);
+
+  Constraint_System cs;
+  NNC_Polyhedron ph4(cs);
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(ph2, "*** ph2 ***");
+  print_constraints(ph3, "*** ph3 ***");
+  print_constraints(ph4, "*** ph4 ***");
+
+  bool universe1 = ph1.is_universe();
+
+  nout << "*** ph1.is_universe() ***"
+       << endl
+       << (universe1 ? "true" : "false")
+       << endl;
+
+  bool universe2 = ph2.is_universe();
+
+  nout << "*** ph2.is_universe() ***"
+       << endl
+       << (universe2 ? "true" : "false")
+       << endl;
+
+  bool universe3 = ph3.is_universe();
+
+  nout << "*** ph3.is_universe() ***"
+       << endl
+       << (universe3 ? "true" : "false")
+       << endl;
+
+  bool universe4 = ph4.is_universe();
+
+  nout << "*** ph4.is_universe() ***"
+       << endl
+       << (universe4 ? "true" : "false")
+       << endl;
+
+  return universe1 && universe2 && !universe3 && universe4;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/variablesset1.cc b/tests/Polyhedron/variablesset1.cc
new file mode 100644
index 0000000..6c2881a
--- /dev/null
+++ b/tests/Polyhedron/variablesset1.cc
@@ -0,0 +1,160 @@
+/* Test the Variables_Set class.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+
+  Variables_Set v_set(A, F);
+  v_set.insert(C);
+  v_set.insert(B);
+  v_set.insert(G);
+
+  Variables_Set known_result(A, G);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+  nout << "*** known_result ***" << endl << known_result << endl;
+
+  return v_set == known_result;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+
+  Variables_Set v_set(F, A);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+
+  return v_set.empty();
+}
+
+bool
+test03() {
+  Variable first(Variable::max_space_dimension()-1);
+  Variable last(0);
+
+  Variables_Set v_set(first, last);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+
+  return v_set.empty();
+}
+
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+
+  Variables_Set vs1(A, C);
+  Variables_Set vs2(C, I);
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** vs1 ***" << endl << vs1 << endl;
+  nout << "*** vs2 ***" << endl << vs2 << endl;
+
+  Variables_Set vs_union;
+  Variables_Set vs_difference;
+  Variables_Set vs_intersection;
+
+  std::set_union(vs1.begin(), vs1.end(),
+                 vs2.begin(), vs2.end(),
+                 std::inserter(vs_union, vs_union.begin()));
+  nout << "*** vs_union ***" << endl << vs_union << endl;
+  if (vs_union != Variables_Set(A, I))
+    return false;
+
+  std::set_difference(vs1.begin(), vs1.end(),
+                      vs2.begin(), vs2.end(),
+                      std::inserter(vs_difference, vs_difference.begin()));
+  nout << "*** vs_difference ***" << endl << vs_difference << endl;
+  if (vs_difference != Variables_Set(A, B))
+    return false;
+
+  std::set_intersection(vs1.begin(), vs1.end(),
+                        vs2.begin(), vs2.end(),
+                        std::inserter(vs_intersection,
+                                      vs_intersection.begin()));
+  nout << "*** vs_intersection ***" << endl << vs_intersection << endl;
+  if (vs_intersection != Variables_Set(C))
+    return false;
+
+  return true;
+}
+
+
+bool
+test05() {
+  Variable A(0);
+
+  Variables_Set v_set;
+
+  if (!v_set.empty())
+    return false;
+
+  v_set.insert(Variable(A));
+  if (v_set.space_dimension() != 1)
+    return false;
+
+  v_set.insert(Variable(Variable::max_space_dimension()-1));
+
+  using namespace Parma_Polyhedra_Library::IO_Operators;
+  nout << "*** v_set ***" << endl << v_set << endl;
+
+  return v_set.space_dimension() == Variable::max_space_dimension();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Polyhedron/watchdog1.cc b/tests/Polyhedron/watchdog1.cc
new file mode 100644
index 0000000..69f2f09
--- /dev/null
+++ b/tests/Polyhedron/watchdog1.cc
@@ -0,0 +1,141 @@
+/* Test the timeout facility of the library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "timings.hh"
+
+namespace {
+
+void
+compute_open_hypercube_generators(dimension_type dimension) {
+  NNC_Polyhedron hypercube(dimension);
+  for (dimension_type i = 0; i < dimension; ++i) {
+    Variable x(i);
+    hypercube.add_constraint(x > 0);
+    hypercube.add_constraint(x < 1);
+  }
+  (void) hypercube.generators();
+}
+
+class Timeout : virtual public std::exception,
+                public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "timeout in watchdog1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  Timeout() {
+  }
+
+  ~Timeout() throw() {
+  }
+};
+
+Timeout t;
+
+bool
+timed_compute_open_hypercube_generators(dimension_type dimension, int csecs) {
+  try {
+    Parma_Polyhedra_Library::Watchdog
+      w(csecs, abandon_expensive_computations, t);
+
+    start_clock();
+
+    compute_open_hypercube_generators(dimension);
+    abandon_expensive_computations = 0;
+    return true;
+  }
+  catch (const Timeout& e) {
+    abandon_expensive_computations = 0;
+    nout << e.what() << " after ";
+    print_clock(nout);
+    nout << " s" << endl;
+    return false;
+  }
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  // If Watchdog objects are not supported, an std::logic_error exception
+  // will be thrown: this is normal.
+  catch (const std::logic_error& e) {
+    nout << "std::logic_error exception caught: \n" << e.what() << std::endl;
+    exit(0);
+  }
+#endif // !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  catch (const std::exception& e) {
+    nout << "unexpected std::exception caught: \n" << e.what() << endl;
+    exit(1);
+  }
+  catch (...) {
+    nout << "unexpected unknown exception caught" << endl;
+    exit(1);
+  }
+  // Should never get here.
+  return false;
+}
+
+} // namespace
+
+#define INIT_TIME 20
+
+int
+main() TRY {
+  set_handlers();
+
+  // Find a dimension that cannot be computed with a INIT_TIME timeout.
+  dimension_type dimension = 0;
+  do {
+    ++dimension;
+    nout << "Trying dimension " << dimension << endl;
+  } while (timed_compute_open_hypercube_generators(dimension, INIT_TIME));
+
+  // Now find an upper bound to the time necessary to compute it.
+  int upper_bound = INIT_TIME;
+  do {
+    upper_bound *= 2;
+    nout << "Trying upper bound " << upper_bound << endl;
+  } while (!timed_compute_open_hypercube_generators(dimension, upper_bound));
+
+  // Search the "exact" time.
+  int lower_bound = upper_bound/2;
+  do {
+    int test_time = (lower_bound+upper_bound)/2;
+    nout << "Probing " << test_time << endl;
+    if (timed_compute_open_hypercube_generators(dimension, test_time))
+      upper_bound = test_time;
+    else
+      lower_bound = test_time;
+  } while (upper_bound-lower_bound > 4);
+
+  nout << "Estimated time for dimension " << dimension
+       << ": " << (lower_bound+upper_bound)/2 << " 100th of sec" << endl;
+
+  return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/weightwatch1.cc b/tests/Polyhedron/weightwatch1.cc
new file mode 100644
index 0000000..a5a3649
--- /dev/null
+++ b/tests/Polyhedron/weightwatch1.cc
@@ -0,0 +1,232 @@
+/* Test the weightwatch (i.e., deterministic timeout) facility of the library.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <stdexcept>
+
+namespace {
+
+typedef
+Parma_Polyhedra_Library::Threshold_Watcher<Weightwatch_Traits> Weightwatch;
+
+class Deterministic_Timeout
+  : virtual public std::exception,
+    public Parma_Polyhedra_Library::Throwable {
+public:
+  const char* what() const throw() {
+    return "deterministic timeout in weightwatch1.cc";
+  }
+
+  void throw_me() const {
+    throw *this;
+  }
+
+  int priority() const {
+    return 0;
+  }
+
+  ~Deterministic_Timeout() throw() {
+  }
+};
+
+void too_fat() {
+  throw Deterministic_Timeout();
+}
+
+bool test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+
+  Constraint_System cs;
+  cs.insert(B + 8192*D - R == 0);
+  cs.insert(Q == 1);
+  cs.insert(B + 8192*D - P == 0);
+  cs.insert(O == 1);
+  cs.insert(B + 8192*D - I - 8192*N == 0);
+  cs.insert(I - M == 0);
+  cs.insert(L == 0);
+  cs.insert(B + 8192*D - I - 8192*K == 0);
+  cs.insert(J == 0);
+  cs.insert(H == 0);
+  cs.insert(D - G == 0);
+  cs.insert(B - F == 0);
+  cs.insert(E == 0);
+  cs.insert(C == 0);
+  cs.insert(A == 0);
+  // Blind relaxation of strict constraint B - I > 0.
+  cs.insert(B - I >= 0);
+  cs.insert(-B - 8192*D + I >= -67100672);
+  cs.insert(-B >= -8191);
+  cs.insert(I >= 0);
+  cs.insert(D >= 0);
+
+  C_Polyhedron ph(cs);
+  print_constraints(ph, "*** ph ***");
+
+  try {
+    Weightwatch ww(5000000, too_fat);
+    // Thanks to the blind relaxation of the strict inequality constraint,
+    // polyhedron ph is easily seen to contain an integer point.
+    const bool contains = ph.contains_integer_point();
+    nout << endl << "ph "
+         << (contains ? "contains" : "does not contain")
+         << " an integer point" << endl;
+    return contains;
+  }
+  // Note: other exceptions are just propagated.
+  catch (const Deterministic_Timeout& e) {
+    // Unexpected timeout exception.
+    nout << endl << e.what() << endl;
+    return false;
+  }
+  // Should never get here.
+  return false;
+}
+
+bool test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+  Variable E(4);
+  Variable F(5);
+  Variable G(6);
+  Variable H(7);
+  Variable I(8);
+  Variable J(9);
+  Variable K(10);
+  Variable L(11);
+  Variable M(12);
+  Variable N(13);
+  Variable O(14);
+  Variable P(15);
+  Variable Q(16);
+  Variable R(17);
+
+  Constraint_System cs;
+  cs.insert(B + 8192*D - R == 0);
+  cs.insert(Q == 1);
+  cs.insert(B + 8192*D - P == 0);
+  cs.insert(O == 1);
+  cs.insert(B + 8192*D - I - 8192*N == 0);
+  cs.insert(I - M == 0);
+  cs.insert(L == 0);
+  cs.insert(B + 8192*D - I - 8192*K == 0);
+  cs.insert(J == 0);
+  cs.insert(H == 0);
+  cs.insert(D - G == 0);
+  cs.insert(B - F == 0);
+  cs.insert(E == 0);
+  cs.insert(C == 0);
+  cs.insert(A == 0);
+  // Rewriting the strict constraint B - I > 0.
+  cs.insert(B - I >= 1);
+  cs.insert(-B - 8192*D + I >= -67100672);
+  cs.insert(-B >= -8191);
+  cs.insert(I >= 0);
+  cs.insert(D >= 0);
+
+  C_Polyhedron ph(cs);
+  print_constraints(ph, "*** ph ***");
+
+  try {
+    Weightwatch ww(2500000, too_fat);
+    // The branch-and-bound heuristics of the MIP solver behaves badly
+    // on this particular example, causing timeout to expire.
+    const bool contains = ph.contains_integer_point();
+    nout << endl
+         << "ph " << (contains ? "contains" : "does not contain")
+         << " an integer point" << endl;
+    return false;
+  }
+  // Note: other exceptions are just propagated.
+  catch (const Deterministic_Timeout& e) {
+    // Expected exception.
+    nout << endl << e.what() << endl;
+    return true;
+  }
+  // Should never get here.
+  return false;
+}
+
+bool test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  Constraint_System cs;
+  cs.insert(8192*A + B - 8192*C - D == 0);
+  cs.insert(D >= 0);
+  cs.insert(-B >= -8191);
+  cs.insert(B -D >= 1);
+  cs.insert(-B + 8192*C + D >= 0);
+  cs.insert(-C >= -8191);
+
+  C_Polyhedron ph(cs);
+  print_constraints(ph, "*** ph ***");
+
+  try {
+    Weightwatch ww(1000000000, too_fat);
+    // Polyhedron ph is the projection of the polyehdron of test01
+    // onto a lower dimensional space: the performance issue of previous
+    // test does not depend on high dimension vector space.
+    const bool contains = ph.contains_integer_point();
+    nout << endl
+         << "ph " << (contains ? "contains" : "does not contain")
+         << " an integer point" << endl;
+    return false;
+  }
+  // Note: other exceptions are just propagated.
+  catch (const Deterministic_Timeout& e) {
+    // Expected exception.
+    nout << endl << e.what() << endl;
+    return true;
+  }
+  // Should never get here.
+  return false;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F32(test01);
+  DO_TEST_F32(test02);
+  DO_TEST_F32(test03);
+END_MAIN
diff --git a/tests/Polyhedron/wrap1.cc b/tests/Polyhedron/wrap1.cc
new file mode 100644
index 0000000..d87faf2
--- /dev/null
+++ b/tests/Polyhedron/wrap1.cc
@@ -0,0 +1,626 @@
+/* Test Polyhedron::wrap_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(x + 24*y >= 3072);
+  known_result.add_constraint(193*x + 504*y <= 129792);
+  known_result.add_constraint(x - 8*y >= -1280);
+  known_result.add_constraint(x - 8*y <= -768);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= y);
+  known_result.add_constraint(x - 8*y >= -1280);
+  known_result.add_constraint(x - 8*y <= -1024);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(y >= 120);
+  known_result.add_constraint(y <= 184);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_UNDEFINED, &cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 120);
+  known_result.add_constraint(y <= 184);
+  known_result.add_constraint(x <= y);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(x + 1024 == 8*y);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_IMPOSSIBLE, &cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(7*x <= 1024);
+  known_result.add_constraint(x + 1024 == 8*y);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 255);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y <= 255);
+  known_result.add_constraint(x <= y);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(x + 24*y >= 3072);
+  known_result.add_constraint(193*x + 504*y <= 129792);
+  known_result.add_constraint(x - 8*y >= -1280);
+  known_result.add_constraint(x - 8*y <= -768);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+  ph.add_constraint(-64 <= x);
+  ph.add_constraint(x <= 448);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= y);
+  known_result.add_constraint(x - 8*y >= -1280);
+  known_result.add_constraint(x - 8*y <= -1024);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, 0, 32, false);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 255);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x + 1024 == 8*y);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 32, false);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y <= 255);
+  known_result.add_constraint(x <= y);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 224);
+  ph.add_constraint(x-y <= 160);
+  ph.add_constraint(x+y <= 416);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 255);
+  known_result.add_constraint(+x-y <= 160);
+  known_result.add_constraint(+x+y <= 416);
+  known_result.add_constraint(x + 7*y >= 672);
+  known_result.add_constraint(x - 7*y >= -1120);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 224);
+  ph.add_constraint(x-y <= 160);
+  ph.add_constraint(x+y <= 416);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x <= y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 96);
+  known_result.add_constraint(-x+y >= 96);
+  known_result.add_constraint(+x+y <= 160);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test15() {
+  C_Polyhedron ph(1);
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars;
+
+  Variable x(0);
+  Constraint_System cs;
+  cs.insert(x == 10);
+
+  try {
+    // This is an invalid use of wrap_assign(): since `vars' is empty,
+    // `cs' can only contain 0-dimensional constraints.
+    ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test16() {
+  C_Polyhedron ph(1);
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars;
+
+  Variable x(0);
+  Constraint_System cs;
+  cs.insert(Linear_Expression(0) == 1);
+  cs.insert(Linear_Expression(0) == 0);
+
+  try {
+    // This is a valid use of wrap_assign(): `vars' is empty,
+    // but `cs' only contains 0-dimensional constraints.
+    ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "unexpected exception thrown: " << e.what() << endl << endl;
+    return false;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return ph.is_empty();
+}
+
+bool
+test17() {
+  C_Polyhedron ph(1);
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars;
+
+  Variable x(0);
+  Constraint_System cs;
+  cs.insert(Linear_Expression(0) == 0);
+
+  try {
+    // This is a valid use of wrap_assign(): `vars' is empty,
+    // but `cs' only contains 0-dimensional constraints.
+    ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "unexpected exception thrown: " << e.what() << endl << endl;
+    return false;
+  }
+  catch (...) {
+    return false;
+  }
+
+  return ph.is_universe();
+}
+
+bool
+test18() {
+  C_Polyhedron ph(1);
+  print_constraints(ph, "*** ph ***");
+
+  Variable x(0);
+  Variable y(1);
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x == 10);
+
+  try {
+    // This is an invalid use of wrap_assign(): the space dimension
+    // of `vars' is higher than the space dimension of `ph'.
+    ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+  }
+  catch (std::invalid_argument& e) {
+    nout << "invalid_argument: " << e.what() << endl << endl;
+    return true;
+  }
+  catch (...) {
+  }
+  return false;
+}
+
+bool
+test19() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x == 256);
+  ph.add_constraint(y == 256 + 256 + 1);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x + 1 == y);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x == 0);
+  known_result.add_constraint(y == 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test20() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*x >= 1);
+  ph.add_constraint(3*x <= 2);
+  ph.add_constraint(y >= 255);
+  ph.add_constraint(y <= 257);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x + y <= 100);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, false);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(2*x >= 1);
+  known_result.add_constraint(3*x <= 2);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F16(test01);
+  DO_TEST_F16(test02);
+  DO_TEST_F16A(test03);
+  DO_TEST_F8(test04);
+  DO_TEST_F16(test05);
+  DO_TEST_F16(test06);
+  DO_TEST_F8(test07);
+  DO_TEST_F8(test08);
+  DO_TEST_F16(test09);
+  DO_TEST_F16(test10);
+  DO_TEST_F8(test11);
+  DO_TEST_F8(test12);
+  DO_TEST_F16(test13);
+  DO_TEST_F8(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST_F8(test19);
+  DO_TEST_F8(test20);
+END_MAIN
diff --git a/tests/Polyhedron/wrap2.cc b/tests/Polyhedron/wrap2.cc
new file mode 100644
index 0000000..9e26ea6
--- /dev/null
+++ b/tests/Polyhedron/wrap2.cc
@@ -0,0 +1,99 @@
+/* Test Polyhedron::wrap_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 255);
+  ph.add_constraint(x <= 257);
+  ph.add_constraint(y >= 255);
+  ph.add_constraint(y <= 257);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x + y <= 100);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, false);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(x <= 1);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 1);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(x >= 255);
+  ph.add_constraint(x <= 257);
+  ph.add_constraint(y >= 255);
+  ph.add_constraint(y <= 257);
+
+  print_constraints(ph, "*** ph ***");
+
+  Variables_Set vars(x, y);
+
+  Constraint_System cs;
+  cs.insert(x + y <= 100);
+
+  ph.wrap_assign(vars, BITS_8, UNSIGNED, OVERFLOW_WRAPS, &cs, 16, true);
+
+  C_Polyhedron known_result(2);
+  known_result.add_constraint(x >= 0);
+  known_result.add_constraint(y >= 0);
+  known_result.add_constraint(y <= 1);
+  known_result.add_constraint(x+y <= 100);
+
+  bool ok = (ph == known_result);
+
+  print_constraints(ph, "*** ph.wrap_assign(...) ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST_F8(test01);
+  DO_TEST_F16(test02);
+END_MAIN
diff --git a/tests/Polyhedron/writeconsys1.cc b/tests/Polyhedron/writeconsys1.cc
new file mode 100644
index 0000000..1b15530
--- /dev/null
+++ b/tests/Polyhedron/writeconsys1.cc
@@ -0,0 +1,83 @@
+/* Test operator<<(std::ostream&, const Constraint_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+  cs.insert(A - 2*B > 2);
+  cs.insert(Linear_Expression(0) <= -7);
+  cs.insert(A == 2);
+
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << cs;
+  nout << "*** s << cs ***" << endl << s.str() << endl;
+  return s.str() == "A - 2*B > 2, 0 >= 1, A = 2";
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Constraint_System cs;
+
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << cs;
+  nout << "*** s << cs ***" << endl << s.str() << endl;
+  return s.str() == "true";
+}
+
+bool
+test03() {
+  Variable A(0);
+
+  Constraint_System cs;
+  cs.insert(A > 2);
+  cs.insert(Linear_Expression(0) >= -1);
+  cs.insert(A == 2);
+
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << cs;
+  nout << "*** s << cs ***" << endl << s.str() << endl;
+  return s.str() == "A > 2, A = 2";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/writegensys1.cc b/tests/Polyhedron/writegensys1.cc
new file mode 100644
index 0000000..24a3086
--- /dev/null
+++ b/tests/Polyhedron/writegensys1.cc
@@ -0,0 +1,90 @@
+/* Test operator<<(std::ostream&, const Generator_System&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Generator_System gs;
+  gs.insert(point());
+  gs.insert(point(A - B));
+  gs.insert(point(A + C));
+  gs.insert(ray(B + C));
+  gs.insert(line(C));
+
+  std::stringstream s;
+  s << gs;
+
+  nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "p(0), p(A - B), p(A + C), r(B + C), l(C)";
+}
+
+bool
+test02() {
+  C_Polyhedron ph(3, EMPTY);
+
+  Generator_System gs = ph.generators();
+
+  std::stringstream s;
+  s << gs;
+
+  nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "false";
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+
+  Linear_Expression e1 = 2*A + 4;
+  e1 += B;
+  Generator_System gs;
+  gs.insert(ray(e1));
+  gs.insert(point(3*A + B, 2));
+
+  std::stringstream s;
+  s << gs;
+
+  nout << "*** s << gs ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "r(2*A + B), p((3*A + B)/2)";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/writepolyhedron1.cc b/tests/Polyhedron/writepolyhedron1.cc
new file mode 100644
index 0000000..039509c
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron1.cc
@@ -0,0 +1,70 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  C_Polyhedron ph(3);
+  ph.add_constraint(  A - B       >= 3);
+  ph.add_constraint(    - B +   C >= 3);
+  ph.add_constraint(  A - B       <= 1);
+  ph.add_constraint(  A - B + 3*C >= 3);
+  ph.add_constraint(3*A     + 2*C >= 3);
+
+  std::stringstream s;
+  s << ph;
+
+  nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "false";
+}
+
+bool
+test02() {
+  NNC_Polyhedron ph1;
+
+  C_Polyhedron ph(ph1.constraints());
+
+  std::stringstream s;
+  s << ph;
+
+  nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "true";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/writepolyhedron2.cc b/tests/Polyhedron/writepolyhedron2.cc
new file mode 100644
index 0000000..3022794
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron2.cc
@@ -0,0 +1,67 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+  Variable x1(0);
+  Variable x2(1);
+  Variable x3(2);
+  Variable x4(3);
+
+  NNC_Polyhedron ph(4);
+
+  ph.add_constraint(     +x2-x3-x4 <= 0);
+  ph.add_constraint(-  x1   +x3-x4 <  0);
+  ph.add_constraint(+  x1   -x3-x4 <= 0);
+  ph.add_constraint(-2*x1+x2+x3-x4 <  0);
+  ph.add_constraint(           +x4 <= 1);
+  ph.add_constraint(        +x3    <  1);
+  ph.add_constraint(-  x1+x2+x3    <= 1);
+  ph.add_constraint(        -x3    <  0);
+  ph.add_constraint(-  x1          <= 0);
+  ph.add_constraint(     -x2       <  0);
+  ph.add_constraint(     +x2       <= 1);
+  ph.add_constraint(+  x1          <  1);
+  ph.add_constraint(+  x1-x2+x3+x4 <= 2);
+
+  std::stringstream s;
+  s << ph;
+
+  nout << "*** s << ph ***" << endl << "`" << s.str() << "'" << endl;
+
+  return s.str() == "-A > -1, -A + C + D >= 0, -A + B - C - D >= -2, -B >= -1,"
+    " -B + C + D >= 0, -C > -1, -D >= -1, 2*A - B - C + D > 0, C > 0, B > 0,"
+    " A - B - C >= -1, A - C + D > 0, A >= 0";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/writerelation1.cc b/tests/Polyhedron/writerelation1.cc
new file mode 100644
index 0000000..5bc0158
--- /dev/null
+++ b/tests/Polyhedron/writerelation1.cc
@@ -0,0 +1,109 @@
+/* Test operator<<(std::ostream& s, const Poly_Con_Relation& r)
+   and operator<<(std::ostream& s, const Poly_Gen_Relation& r).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Poly_Con_Relation rel = Poly_Con_Relation::nothing();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "NOTHING";
+}
+
+bool
+test02() {
+  Poly_Con_Relation rel = Poly_Con_Relation::is_disjoint();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "IS_DISJOINT";
+}
+
+bool
+test03() {
+  Poly_Con_Relation rel = Poly_Con_Relation::strictly_intersects();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "STRICTLY_INTERSECTS";
+}
+
+bool
+test04() {
+  Poly_Con_Relation rel = Poly_Con_Relation::is_included();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "IS_INCLUDED";
+}
+
+bool
+test05() {
+  Poly_Con_Relation rel = Poly_Con_Relation::saturates();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "SATURATES";
+}
+
+bool
+test06() {
+  Poly_Gen_Relation rel = Poly_Gen_Relation::nothing();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "NOTHING";
+}
+
+bool
+test07() {
+  Poly_Gen_Relation rel = Poly_Gen_Relation::subsumes();
+  std::stringstream s;
+  using namespace IO_Operators;
+  s << rel;
+  nout << s.str() << endl;
+  return s.str() == "SUBSUMES";
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Polyhedron/writevariable1.cc b/tests/Polyhedron/writevariable1.cc
new file mode 100644
index 0000000..79bd3ef
--- /dev/null
+++ b/tests/Polyhedron/writevariable1.cc
@@ -0,0 +1,104 @@
+/* Test operator<<(std::ostream& s, Variable v)
+   and the related machinery.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::string;
+using std::fstream;
+using std::ios_base;
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+const char* my_file = "writevariable1.dat";
+
+void
+write_variables() {
+  fstream f;
+  open(f, my_file, ios_base::out);
+  for (dimension_type id = 0; id <= 100; id += 5)
+    f << Variable(id) << " ";
+  f << endl;
+  close(f);
+}
+
+void
+read_variables_and_check(const string& s) {
+  fstream f;
+  open(f, my_file, ios_base::in);
+  string t;
+  getline(f, t);
+  close(f);
+  if (s != t)
+    exit(1);
+}
+
+void
+my_output_function(std::ostream& s, const Variable v) {
+  s << "x" << v.id();
+}
+
+} // namespace
+
+int
+main() TRY {
+  set_handlers();
+
+  // Default output function: write...
+  write_variables();
+  // ... read back.
+  read_variables_and_check("A F K P U Z E1 J1 O1 T1 Y1 "
+                           "D2 I2 N2 S2 X2 C3 H3 M3 R3 W3 ");
+
+  // Save the default output function.
+  Variable::output_function_type* p_default_output_function
+    = Variable::get_output_function();
+
+  // Install an alternate output function.
+  Variable::set_output_function(my_output_function);
+
+  // Check that the installation worked as expected.
+  if (Variable::get_output_function() != my_output_function)
+    return 1;
+
+  // Alternate output function: write...
+  write_variables();
+  // ... read back.
+  read_variables_and_check("x0 x5 x10 x15 x20 x25 x30 x35 x40 x45 "
+                           "x50 x55 x60 x65 x70 x75 x80 x85 x90 x95 x100 ");
+
+  // Restore the default output function.
+  Variable::set_output_function(p_default_output_function);
+
+  // Check that the restoration worked as expected.
+  if (Variable::get_output_function() != p_default_output_function)
+    return 1;
+
+  return 0;
+}
+CATCH
diff --git a/tests/Powerset/Makefile.am b/tests/Powerset/Makefile.am
new file mode 100644
index 0000000..16c6046
--- /dev/null
+++ b/tests/Powerset/Makefile.am
@@ -0,0 +1,192 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+TESTS = \
+addcongruences1 \
+addconstraints1 \
+affinedimension1 \
+affineimage1 \
+affinepreimage1 \
+bounded1 \
+bounds1 \
+closed1 \
+closure1 \
+collapse1 \
+concatenate1 \
+contains1 \
+containsintegerpoint1 \
+difference1 \
+discrete1 \
+disjoint1 \
+disjunct1 \
+empty1 \
+entails1 \
+equals1 \
+frombdshape1 \
+frombox1 \
+fromcongruences1 \
+fromconstraints1 \
+fromgrid1 \
+fromoctagonalshape1 \
+frompolyhedron1 \
+fromspacedimension1 \
+intersection1 \
+maxmin1 \
+meet1 \
+membytes1 \
+powerset1 \
+reduce1 \
+refinewith1 \
+relationwith1 \
+simplifyusingcontext1 \
+size1 \
+spacedims1 \
+universe1 \
+upperbound1
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+addcongruences1_SOURCES = addcongruences1.cc
+
+addconstraints1_SOURCES = addconstraints1.cc
+
+affinedimension1_SOURCES = affinedimension1.cc
+
+affineimage1_SOURCES = affineimage1.cc
+
+affinepreimage1_SOURCES = affinepreimage1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+bounds1_SOURCES = bounds1.cc
+
+closed1_SOURCES = closed1.cc
+
+closure1_SOURCES = closure1.cc
+
+collapse1_SOURCES = collapse1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+contains1_SOURCES = contains1.cc
+
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+
+difference1_SOURCES = difference1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+disjunct1_SOURCES = disjunct1.cc
+
+empty1_SOURCES = empty1.cc
+
+entails1_SOURCES = entails1.cc
+
+equals1_SOURCES = equals1.cc
+
+frombdshape1_SOURCES = frombdshape1.cc
+
+frombox1_SOURCES = frombox1.cc
+
+fromcongruences1_SOURCES = fromcongruences1.cc
+
+fromconstraints1_SOURCES = fromconstraints1.cc
+
+fromgrid1_SOURCES = fromgrid1.cc
+
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+
+fromspacedimension1_SOURCES = fromspacedimension1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+maxmin1_SOURCES = maxmin1.cc
+
+meet1_SOURCES = meet1.cc
+
+membytes1_SOURCES = membytes1.cc
+
+powerset1_SOURCES = powerset1.cc
+
+reduce1_SOURCES = reduce1.cc
+
+refinewith1_SOURCES = refinewith1.cc
+
+relationwith1_SOURCES = relationwith1.cc
+
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+
+size1_SOURCES = size1.cc
+
+spacedims1_SOURCES = spacedims1.cc
+
+universe1_SOURCES = universe1.cc
+
+upperbound1_SOURCES = upperbound1.cc
+
+check_PROGRAMS = $(TESTS)
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Powerset/Makefile.in b/tests/Powerset/Makefile.in
new file mode 100644
index 0000000..7317ac0
--- /dev/null
+++ b/tests/Powerset/Makefile.in
@@ -0,0 +1,1932 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = addcongruences1$(EXEEXT) addconstraints1$(EXEEXT) \
+	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+	affinepreimage1$(EXEEXT) bounded1$(EXEEXT) bounds1$(EXEEXT) \
+	closed1$(EXEEXT) closure1$(EXEEXT) collapse1$(EXEEXT) \
+	concatenate1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+	discrete1$(EXEEXT) disjoint1$(EXEEXT) disjunct1$(EXEEXT) \
+	empty1$(EXEEXT) entails1$(EXEEXT) equals1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) \
+	fromcongruences1$(EXEEXT) fromconstraints1$(EXEEXT) \
+	fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) fromspacedimension1$(EXEEXT) \
+	intersection1$(EXEEXT) maxmin1$(EXEEXT) meet1$(EXEEXT) \
+	membytes1$(EXEEXT) powerset1$(EXEEXT) reduce1$(EXEEXT) \
+	refinewith1$(EXEEXT) relationwith1$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) size1$(EXEEXT) \
+	spacedims1$(EXEEXT) universe1$(EXEEXT) upperbound1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Powerset
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = addcongruences1$(EXEEXT) addconstraints1$(EXEEXT) \
+	affinedimension1$(EXEEXT) affineimage1$(EXEEXT) \
+	affinepreimage1$(EXEEXT) bounded1$(EXEEXT) bounds1$(EXEEXT) \
+	closed1$(EXEEXT) closure1$(EXEEXT) collapse1$(EXEEXT) \
+	concatenate1$(EXEEXT) contains1$(EXEEXT) \
+	containsintegerpoint1$(EXEEXT) difference1$(EXEEXT) \
+	discrete1$(EXEEXT) disjoint1$(EXEEXT) disjunct1$(EXEEXT) \
+	empty1$(EXEEXT) entails1$(EXEEXT) equals1$(EXEEXT) \
+	frombdshape1$(EXEEXT) frombox1$(EXEEXT) \
+	fromcongruences1$(EXEEXT) fromconstraints1$(EXEEXT) \
+	fromgrid1$(EXEEXT) fromoctagonalshape1$(EXEEXT) \
+	frompolyhedron1$(EXEEXT) fromspacedimension1$(EXEEXT) \
+	intersection1$(EXEEXT) maxmin1$(EXEEXT) meet1$(EXEEXT) \
+	membytes1$(EXEEXT) powerset1$(EXEEXT) reduce1$(EXEEXT) \
+	refinewith1$(EXEEXT) relationwith1$(EXEEXT) \
+	simplifyusingcontext1$(EXEEXT) size1$(EXEEXT) \
+	spacedims1$(EXEEXT) universe1$(EXEEXT) upperbound1$(EXEEXT)
+am_addcongruences1_OBJECTS = addcongruences1.$(OBJEXT)
+addcongruences1_OBJECTS = $(am_addcongruences1_OBJECTS)
+addcongruences1_LDADD = $(LDADD)
+addcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+am_addconstraints1_OBJECTS = addconstraints1.$(OBJEXT)
+addconstraints1_OBJECTS = $(am_addconstraints1_OBJECTS)
+addconstraints1_LDADD = $(LDADD)
+addconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinedimension1_OBJECTS = affinedimension1.$(OBJEXT)
+affinedimension1_OBJECTS = $(am_affinedimension1_OBJECTS)
+affinedimension1_LDADD = $(LDADD)
+affinedimension1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affineimage1_OBJECTS = affineimage1.$(OBJEXT)
+affineimage1_OBJECTS = $(am_affineimage1_OBJECTS)
+affineimage1_LDADD = $(LDADD)
+affineimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_affinepreimage1_OBJECTS = affinepreimage1.$(OBJEXT)
+affinepreimage1_OBJECTS = $(am_affinepreimage1_OBJECTS)
+affinepreimage1_LDADD = $(LDADD)
+affinepreimage1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounded1_OBJECTS = bounded1.$(OBJEXT)
+bounded1_OBJECTS = $(am_bounded1_OBJECTS)
+bounded1_LDADD = $(LDADD)
+bounded1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_bounds1_OBJECTS = bounds1.$(OBJEXT)
+bounds1_OBJECTS = $(am_bounds1_OBJECTS)
+bounds1_LDADD = $(LDADD)
+bounds1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_closed1_OBJECTS = closed1.$(OBJEXT)
+closed1_OBJECTS = $(am_closed1_OBJECTS)
+closed1_LDADD = $(LDADD)
+closed1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_closure1_OBJECTS = closure1.$(OBJEXT)
+closure1_OBJECTS = $(am_closure1_OBJECTS)
+closure1_LDADD = $(LDADD)
+closure1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_collapse1_OBJECTS = collapse1.$(OBJEXT)
+collapse1_OBJECTS = $(am_collapse1_OBJECTS)
+collapse1_LDADD = $(LDADD)
+collapse1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_concatenate1_OBJECTS = concatenate1.$(OBJEXT)
+concatenate1_OBJECTS = $(am_concatenate1_OBJECTS)
+concatenate1_LDADD = $(LDADD)
+concatenate1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_contains1_OBJECTS = contains1.$(OBJEXT)
+contains1_OBJECTS = $(am_contains1_OBJECTS)
+contains1_LDADD = $(LDADD)
+contains1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_containsintegerpoint1_OBJECTS = containsintegerpoint1.$(OBJEXT)
+containsintegerpoint1_OBJECTS = $(am_containsintegerpoint1_OBJECTS)
+containsintegerpoint1_LDADD = $(LDADD)
+containsintegerpoint1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_difference1_OBJECTS = difference1.$(OBJEXT)
+difference1_OBJECTS = $(am_difference1_OBJECTS)
+difference1_LDADD = $(LDADD)
+difference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_discrete1_OBJECTS = discrete1.$(OBJEXT)
+discrete1_OBJECTS = $(am_discrete1_OBJECTS)
+discrete1_LDADD = $(LDADD)
+discrete1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjoint1_OBJECTS = disjoint1.$(OBJEXT)
+disjoint1_OBJECTS = $(am_disjoint1_OBJECTS)
+disjoint1_LDADD = $(LDADD)
+disjoint1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_disjunct1_OBJECTS = disjunct1.$(OBJEXT)
+disjunct1_OBJECTS = $(am_disjunct1_OBJECTS)
+disjunct1_LDADD = $(LDADD)
+disjunct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_empty1_OBJECTS = empty1.$(OBJEXT)
+empty1_OBJECTS = $(am_empty1_OBJECTS)
+empty1_LDADD = $(LDADD)
+empty1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_entails1_OBJECTS = entails1.$(OBJEXT)
+entails1_OBJECTS = $(am_entails1_OBJECTS)
+entails1_LDADD = $(LDADD)
+entails1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_equals1_OBJECTS = equals1.$(OBJEXT)
+equals1_OBJECTS = $(am_equals1_OBJECTS)
+equals1_LDADD = $(LDADD)
+equals1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombdshape1_OBJECTS = frombdshape1.$(OBJEXT)
+frombdshape1_OBJECTS = $(am_frombdshape1_OBJECTS)
+frombdshape1_LDADD = $(LDADD)
+frombdshape1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frombox1_OBJECTS = frombox1.$(OBJEXT)
+frombox1_OBJECTS = $(am_frombox1_OBJECTS)
+frombox1_LDADD = $(LDADD)
+frombox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromcongruences1_OBJECTS = fromcongruences1.$(OBJEXT)
+fromcongruences1_OBJECTS = $(am_fromcongruences1_OBJECTS)
+fromcongruences1_LDADD = $(LDADD)
+fromcongruences1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromconstraints1_OBJECTS = fromconstraints1.$(OBJEXT)
+fromconstraints1_OBJECTS = $(am_fromconstraints1_OBJECTS)
+fromconstraints1_LDADD = $(LDADD)
+fromconstraints1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromgrid1_OBJECTS = fromgrid1.$(OBJEXT)
+fromgrid1_OBJECTS = $(am_fromgrid1_OBJECTS)
+fromgrid1_LDADD = $(LDADD)
+fromgrid1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromoctagonalshape1_OBJECTS = fromoctagonalshape1.$(OBJEXT)
+fromoctagonalshape1_OBJECTS = $(am_fromoctagonalshape1_OBJECTS)
+fromoctagonalshape1_LDADD = $(LDADD)
+fromoctagonalshape1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_frompolyhedron1_OBJECTS = frompolyhedron1.$(OBJEXT)
+frompolyhedron1_OBJECTS = $(am_frompolyhedron1_OBJECTS)
+frompolyhedron1_LDADD = $(LDADD)
+frompolyhedron1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_fromspacedimension1_OBJECTS = fromspacedimension1.$(OBJEXT)
+fromspacedimension1_OBJECTS = $(am_fromspacedimension1_OBJECTS)
+fromspacedimension1_LDADD = $(LDADD)
+fromspacedimension1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_intersection1_OBJECTS = intersection1.$(OBJEXT)
+intersection1_OBJECTS = $(am_intersection1_OBJECTS)
+intersection1_LDADD = $(LDADD)
+intersection1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_maxmin1_OBJECTS = maxmin1.$(OBJEXT)
+maxmin1_OBJECTS = $(am_maxmin1_OBJECTS)
+maxmin1_LDADD = $(LDADD)
+maxmin1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_meet1_OBJECTS = meet1.$(OBJEXT)
+meet1_OBJECTS = $(am_meet1_OBJECTS)
+meet1_LDADD = $(LDADD)
+meet1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_membytes1_OBJECTS = membytes1.$(OBJEXT)
+membytes1_OBJECTS = $(am_membytes1_OBJECTS)
+membytes1_LDADD = $(LDADD)
+membytes1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_powerset1_OBJECTS = powerset1.$(OBJEXT)
+powerset1_OBJECTS = $(am_powerset1_OBJECTS)
+powerset1_LDADD = $(LDADD)
+powerset1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_reduce1_OBJECTS = reduce1.$(OBJEXT)
+reduce1_OBJECTS = $(am_reduce1_OBJECTS)
+reduce1_LDADD = $(LDADD)
+reduce1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_refinewith1_OBJECTS = refinewith1.$(OBJEXT)
+refinewith1_OBJECTS = $(am_refinewith1_OBJECTS)
+refinewith1_LDADD = $(LDADD)
+refinewith1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_relationwith1_OBJECTS = relationwith1.$(OBJEXT)
+relationwith1_OBJECTS = $(am_relationwith1_OBJECTS)
+relationwith1_LDADD = $(LDADD)
+relationwith1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_simplifyusingcontext1_OBJECTS = simplifyusingcontext1.$(OBJEXT)
+simplifyusingcontext1_OBJECTS = $(am_simplifyusingcontext1_OBJECTS)
+simplifyusingcontext1_LDADD = $(LDADD)
+simplifyusingcontext1_DEPENDENCIES =  \
+	$(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_size1_OBJECTS = size1.$(OBJEXT)
+size1_OBJECTS = $(am_size1_OBJECTS)
+size1_LDADD = $(LDADD)
+size1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_spacedims1_OBJECTS = spacedims1.$(OBJEXT)
+spacedims1_OBJECTS = $(am_spacedims1_OBJECTS)
+spacedims1_LDADD = $(LDADD)
+spacedims1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_universe1_OBJECTS = universe1.$(OBJEXT)
+universe1_OBJECTS = $(am_universe1_OBJECTS)
+universe1_LDADD = $(LDADD)
+universe1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+am_upperbound1_OBJECTS = upperbound1.$(OBJEXT)
+upperbound1_OBJECTS = $(am_upperbound1_OBJECTS)
+upperbound1_LDADD = $(LDADD)
+upperbound1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+	$(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(addcongruences1_SOURCES) $(addconstraints1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affinepreimage1_SOURCES) $(bounded1_SOURCES) \
+	$(bounds1_SOURCES) $(closed1_SOURCES) $(closure1_SOURCES) \
+	$(collapse1_SOURCES) $(concatenate1_SOURCES) \
+	$(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(difference1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(disjunct1_SOURCES) $(empty1_SOURCES) \
+	$(entails1_SOURCES) $(equals1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(fromcongruences1_SOURCES) \
+	$(fromconstraints1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedimension1_SOURCES) $(intersection1_SOURCES) \
+	$(maxmin1_SOURCES) $(meet1_SOURCES) $(membytes1_SOURCES) \
+	$(powerset1_SOURCES) $(reduce1_SOURCES) $(refinewith1_SOURCES) \
+	$(relationwith1_SOURCES) $(simplifyusingcontext1_SOURCES) \
+	$(size1_SOURCES) $(spacedims1_SOURCES) $(universe1_SOURCES) \
+	$(upperbound1_SOURCES)
+DIST_SOURCES = $(addcongruences1_SOURCES) $(addconstraints1_SOURCES) \
+	$(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+	$(affinepreimage1_SOURCES) $(bounded1_SOURCES) \
+	$(bounds1_SOURCES) $(closed1_SOURCES) $(closure1_SOURCES) \
+	$(collapse1_SOURCES) $(concatenate1_SOURCES) \
+	$(contains1_SOURCES) $(containsintegerpoint1_SOURCES) \
+	$(difference1_SOURCES) $(discrete1_SOURCES) \
+	$(disjoint1_SOURCES) $(disjunct1_SOURCES) $(empty1_SOURCES) \
+	$(entails1_SOURCES) $(equals1_SOURCES) $(frombdshape1_SOURCES) \
+	$(frombox1_SOURCES) $(fromcongruences1_SOURCES) \
+	$(fromconstraints1_SOURCES) $(fromgrid1_SOURCES) \
+	$(fromoctagonalshape1_SOURCES) $(frompolyhedron1_SOURCES) \
+	$(fromspacedimension1_SOURCES) $(intersection1_SOURCES) \
+	$(maxmin1_SOURCES) $(meet1_SOURCES) $(membytes1_SOURCES) \
+	$(powerset1_SOURCES) $(reduce1_SOURCES) $(refinewith1_SOURCES) \
+	$(relationwith1_SOURCES) $(simplifyusingcontext1_SOURCES) \
+	$(size1_SOURCES) $(spacedims1_SOURCES) $(universe1_SOURCES) \
+	$(upperbound1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/src -I$(top_srcdir)/tests \
+-I$(top_srcdir)/utils \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/utils/libppl_utils.a \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+
+#
+# Sources for the tests
+#
+addcongruences1_SOURCES = addcongruences1.cc
+addconstraints1_SOURCES = addconstraints1.cc
+affinedimension1_SOURCES = affinedimension1.cc
+affineimage1_SOURCES = affineimage1.cc
+affinepreimage1_SOURCES = affinepreimage1.cc
+bounded1_SOURCES = bounded1.cc
+bounds1_SOURCES = bounds1.cc
+closed1_SOURCES = closed1.cc
+closure1_SOURCES = closure1.cc
+collapse1_SOURCES = collapse1.cc
+concatenate1_SOURCES = concatenate1.cc
+contains1_SOURCES = contains1.cc
+containsintegerpoint1_SOURCES = containsintegerpoint1.cc
+difference1_SOURCES = difference1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+disjunct1_SOURCES = disjunct1.cc
+empty1_SOURCES = empty1.cc
+entails1_SOURCES = entails1.cc
+equals1_SOURCES = equals1.cc
+frombdshape1_SOURCES = frombdshape1.cc
+frombox1_SOURCES = frombox1.cc
+fromcongruences1_SOURCES = fromcongruences1.cc
+fromconstraints1_SOURCES = fromconstraints1.cc
+fromgrid1_SOURCES = fromgrid1.cc
+fromoctagonalshape1_SOURCES = fromoctagonalshape1.cc
+frompolyhedron1_SOURCES = frompolyhedron1.cc
+fromspacedimension1_SOURCES = fromspacedimension1.cc
+intersection1_SOURCES = intersection1.cc
+maxmin1_SOURCES = maxmin1.cc
+meet1_SOURCES = meet1.cc
+membytes1_SOURCES = membytes1.cc
+powerset1_SOURCES = powerset1.cc
+reduce1_SOURCES = reduce1.cc
+refinewith1_SOURCES = refinewith1.cc
+relationwith1_SOURCES = relationwith1.cc
+simplifyusingcontext1_SOURCES = simplifyusingcontext1.cc
+size1_SOURCES = size1.cc
+spacedims1_SOURCES = spacedims1.cc
+universe1_SOURCES = universe1.cc
+upperbound1_SOURCES = upperbound1.cc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Powerset/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Powerset/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES) $(EXTRA_addcongruences1_DEPENDENCIES) 
+	@rm -f addcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES) $(EXTRA_addconstraints1_DEPENDENCIES) 
+	@rm -f addconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES) $(EXTRA_affinedimension1_DEPENDENCIES) 
+	@rm -f affinedimension1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES) $(EXTRA_affineimage1_DEPENDENCIES) 
+	@rm -f affineimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES) $(EXTRA_affinepreimage1_DEPENDENCIES) 
+	@rm -f affinepreimage1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES) $(EXTRA_bounded1_DEPENDENCIES) 
+	@rm -f bounded1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES) $(EXTRA_bounds1_DEPENDENCIES) 
+	@rm -f bounds1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+
+closed1$(EXEEXT): $(closed1_OBJECTS) $(closed1_DEPENDENCIES) $(EXTRA_closed1_DEPENDENCIES) 
+	@rm -f closed1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(closed1_OBJECTS) $(closed1_LDADD) $(LIBS)
+
+closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES) $(EXTRA_closure1_DEPENDENCIES) 
+	@rm -f closure1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+
+collapse1$(EXEEXT): $(collapse1_OBJECTS) $(collapse1_DEPENDENCIES) $(EXTRA_collapse1_DEPENDENCIES) 
+	@rm -f collapse1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(collapse1_OBJECTS) $(collapse1_LDADD) $(LIBS)
+
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES) $(EXTRA_concatenate1_DEPENDENCIES) 
+	@rm -f concatenate1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES) $(EXTRA_contains1_DEPENDENCIES) 
+	@rm -f contains1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+
+containsintegerpoint1$(EXEEXT): $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_DEPENDENCIES) $(EXTRA_containsintegerpoint1_DEPENDENCIES) 
+	@rm -f containsintegerpoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(containsintegerpoint1_OBJECTS) $(containsintegerpoint1_LDADD) $(LIBS)
+
+difference1$(EXEEXT): $(difference1_OBJECTS) $(difference1_DEPENDENCIES) $(EXTRA_difference1_DEPENDENCIES) 
+	@rm -f difference1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(difference1_OBJECTS) $(difference1_LDADD) $(LIBS)
+
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES) $(EXTRA_discrete1_DEPENDENCIES) 
+	@rm -f discrete1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES) $(EXTRA_disjoint1_DEPENDENCIES) 
+	@rm -f disjoint1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+
+disjunct1$(EXEEXT): $(disjunct1_OBJECTS) $(disjunct1_DEPENDENCIES) $(EXTRA_disjunct1_DEPENDENCIES) 
+	@rm -f disjunct1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(disjunct1_OBJECTS) $(disjunct1_LDADD) $(LIBS)
+
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES) $(EXTRA_empty1_DEPENDENCIES) 
+	@rm -f empty1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+
+entails1$(EXEEXT): $(entails1_OBJECTS) $(entails1_DEPENDENCIES) $(EXTRA_entails1_DEPENDENCIES) 
+	@rm -f entails1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(entails1_OBJECTS) $(entails1_LDADD) $(LIBS)
+
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES) $(EXTRA_equals1_DEPENDENCIES) 
+	@rm -f equals1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+
+frombdshape1$(EXEEXT): $(frombdshape1_OBJECTS) $(frombdshape1_DEPENDENCIES) $(EXTRA_frombdshape1_DEPENDENCIES) 
+	@rm -f frombdshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombdshape1_OBJECTS) $(frombdshape1_LDADD) $(LIBS)
+
+frombox1$(EXEEXT): $(frombox1_OBJECTS) $(frombox1_DEPENDENCIES) $(EXTRA_frombox1_DEPENDENCIES) 
+	@rm -f frombox1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frombox1_OBJECTS) $(frombox1_LDADD) $(LIBS)
+
+fromcongruences1$(EXEEXT): $(fromcongruences1_OBJECTS) $(fromcongruences1_DEPENDENCIES) $(EXTRA_fromcongruences1_DEPENDENCIES) 
+	@rm -f fromcongruences1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromcongruences1_OBJECTS) $(fromcongruences1_LDADD) $(LIBS)
+
+fromconstraints1$(EXEEXT): $(fromconstraints1_OBJECTS) $(fromconstraints1_DEPENDENCIES) $(EXTRA_fromconstraints1_DEPENDENCIES) 
+	@rm -f fromconstraints1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromconstraints1_OBJECTS) $(fromconstraints1_LDADD) $(LIBS)
+
+fromgrid1$(EXEEXT): $(fromgrid1_OBJECTS) $(fromgrid1_DEPENDENCIES) $(EXTRA_fromgrid1_DEPENDENCIES) 
+	@rm -f fromgrid1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromgrid1_OBJECTS) $(fromgrid1_LDADD) $(LIBS)
+
+fromoctagonalshape1$(EXEEXT): $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_DEPENDENCIES) $(EXTRA_fromoctagonalshape1_DEPENDENCIES) 
+	@rm -f fromoctagonalshape1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromoctagonalshape1_OBJECTS) $(fromoctagonalshape1_LDADD) $(LIBS)
+
+frompolyhedron1$(EXEEXT): $(frompolyhedron1_OBJECTS) $(frompolyhedron1_DEPENDENCIES) $(EXTRA_frompolyhedron1_DEPENDENCIES) 
+	@rm -f frompolyhedron1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(frompolyhedron1_OBJECTS) $(frompolyhedron1_LDADD) $(LIBS)
+
+fromspacedimension1$(EXEEXT): $(fromspacedimension1_OBJECTS) $(fromspacedimension1_DEPENDENCIES) $(EXTRA_fromspacedimension1_DEPENDENCIES) 
+	@rm -f fromspacedimension1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(fromspacedimension1_OBJECTS) $(fromspacedimension1_LDADD) $(LIBS)
+
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES) $(EXTRA_intersection1_DEPENDENCIES) 
+	@rm -f intersection1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES) $(EXTRA_maxmin1_DEPENDENCIES) 
+	@rm -f maxmin1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+
+meet1$(EXEEXT): $(meet1_OBJECTS) $(meet1_DEPENDENCIES) $(EXTRA_meet1_DEPENDENCIES) 
+	@rm -f meet1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(meet1_OBJECTS) $(meet1_LDADD) $(LIBS)
+
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES) $(EXTRA_membytes1_DEPENDENCIES) 
+	@rm -f membytes1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+
+powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES) $(EXTRA_powerset1_DEPENDENCIES) 
+	@rm -f powerset1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS)
+
+reduce1$(EXEEXT): $(reduce1_OBJECTS) $(reduce1_DEPENDENCIES) $(EXTRA_reduce1_DEPENDENCIES) 
+	@rm -f reduce1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(reduce1_OBJECTS) $(reduce1_LDADD) $(LIBS)
+
+refinewith1$(EXEEXT): $(refinewith1_OBJECTS) $(refinewith1_DEPENDENCIES) $(EXTRA_refinewith1_DEPENDENCIES) 
+	@rm -f refinewith1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(refinewith1_OBJECTS) $(refinewith1_LDADD) $(LIBS)
+
+relationwith1$(EXEEXT): $(relationwith1_OBJECTS) $(relationwith1_DEPENDENCIES) $(EXTRA_relationwith1_DEPENDENCIES) 
+	@rm -f relationwith1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(relationwith1_OBJECTS) $(relationwith1_LDADD) $(LIBS)
+
+simplifyusingcontext1$(EXEEXT): $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_DEPENDENCIES) $(EXTRA_simplifyusingcontext1_DEPENDENCIES) 
+	@rm -f simplifyusingcontext1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(simplifyusingcontext1_OBJECTS) $(simplifyusingcontext1_LDADD) $(LIBS)
+
+size1$(EXEEXT): $(size1_OBJECTS) $(size1_DEPENDENCIES) $(EXTRA_size1_DEPENDENCIES) 
+	@rm -f size1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(size1_OBJECTS) $(size1_LDADD) $(LIBS)
+
+spacedims1$(EXEEXT): $(spacedims1_OBJECTS) $(spacedims1_DEPENDENCIES) $(EXTRA_spacedims1_DEPENDENCIES) 
+	@rm -f spacedims1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(spacedims1_OBJECTS) $(spacedims1_LDADD) $(LIBS)
+
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES) $(EXTRA_universe1_DEPENDENCIES) 
+	@rm -f universe1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+
+upperbound1$(EXEEXT): $(upperbound1_OBJECTS) $(upperbound1_DEPENDENCIES) $(EXTRA_upperbound1_DEPENDENCIES) 
+	@rm -f upperbound1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(upperbound1_OBJECTS) $(upperbound1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/addconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affineimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/affinepreimage1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounded1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bounds1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closed1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/closure1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/collapse1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/concatenate1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/contains1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/containsintegerpoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/difference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/discrete1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjoint1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/disjunct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/empty1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/entails1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/equals1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombdshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frombox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromcongruences1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromconstraints1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromgrid1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromoctagonalshape1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/frompolyhedron1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fromspacedimension1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/intersection1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/maxmin1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/meet1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/membytes1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/powerset1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/reduce1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/refinewith1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/relationwith1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/simplifyusingcontext1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/size1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/spacedims1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/upperbound1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+addcongruences1.log: addcongruences1$(EXEEXT)
+	@p='addcongruences1$(EXEEXT)'; \
+	b='addcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+addconstraints1.log: addconstraints1$(EXEEXT)
+	@p='addconstraints1$(EXEEXT)'; \
+	b='addconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinedimension1.log: affinedimension1$(EXEEXT)
+	@p='affinedimension1$(EXEEXT)'; \
+	b='affinedimension1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affineimage1.log: affineimage1$(EXEEXT)
+	@p='affineimage1$(EXEEXT)'; \
+	b='affineimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+affinepreimage1.log: affinepreimage1$(EXEEXT)
+	@p='affinepreimage1$(EXEEXT)'; \
+	b='affinepreimage1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounded1.log: bounded1$(EXEEXT)
+	@p='bounded1$(EXEEXT)'; \
+	b='bounded1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+bounds1.log: bounds1$(EXEEXT)
+	@p='bounds1$(EXEEXT)'; \
+	b='bounds1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+closed1.log: closed1$(EXEEXT)
+	@p='closed1$(EXEEXT)'; \
+	b='closed1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+closure1.log: closure1$(EXEEXT)
+	@p='closure1$(EXEEXT)'; \
+	b='closure1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+collapse1.log: collapse1$(EXEEXT)
+	@p='collapse1$(EXEEXT)'; \
+	b='collapse1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+concatenate1.log: concatenate1$(EXEEXT)
+	@p='concatenate1$(EXEEXT)'; \
+	b='concatenate1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+contains1.log: contains1$(EXEEXT)
+	@p='contains1$(EXEEXT)'; \
+	b='contains1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+containsintegerpoint1.log: containsintegerpoint1$(EXEEXT)
+	@p='containsintegerpoint1$(EXEEXT)'; \
+	b='containsintegerpoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+difference1.log: difference1$(EXEEXT)
+	@p='difference1$(EXEEXT)'; \
+	b='difference1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+discrete1.log: discrete1$(EXEEXT)
+	@p='discrete1$(EXEEXT)'; \
+	b='discrete1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+disjoint1.log: disjoint1$(EXEEXT)
+	@p='disjoint1$(EXEEXT)'; \
+	b='disjoint1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+disjunct1.log: disjunct1$(EXEEXT)
+	@p='disjunct1$(EXEEXT)'; \
+	b='disjunct1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+empty1.log: empty1$(EXEEXT)
+	@p='empty1$(EXEEXT)'; \
+	b='empty1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+entails1.log: entails1$(EXEEXT)
+	@p='entails1$(EXEEXT)'; \
+	b='entails1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+equals1.log: equals1$(EXEEXT)
+	@p='equals1$(EXEEXT)'; \
+	b='equals1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombdshape1.log: frombdshape1$(EXEEXT)
+	@p='frombdshape1$(EXEEXT)'; \
+	b='frombdshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frombox1.log: frombox1$(EXEEXT)
+	@p='frombox1$(EXEEXT)'; \
+	b='frombox1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromcongruences1.log: fromcongruences1$(EXEEXT)
+	@p='fromcongruences1$(EXEEXT)'; \
+	b='fromcongruences1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromconstraints1.log: fromconstraints1$(EXEEXT)
+	@p='fromconstraints1$(EXEEXT)'; \
+	b='fromconstraints1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromgrid1.log: fromgrid1$(EXEEXT)
+	@p='fromgrid1$(EXEEXT)'; \
+	b='fromgrid1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromoctagonalshape1.log: fromoctagonalshape1$(EXEEXT)
+	@p='fromoctagonalshape1$(EXEEXT)'; \
+	b='fromoctagonalshape1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+frompolyhedron1.log: frompolyhedron1$(EXEEXT)
+	@p='frompolyhedron1$(EXEEXT)'; \
+	b='frompolyhedron1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fromspacedimension1.log: fromspacedimension1$(EXEEXT)
+	@p='fromspacedimension1$(EXEEXT)'; \
+	b='fromspacedimension1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+intersection1.log: intersection1$(EXEEXT)
+	@p='intersection1$(EXEEXT)'; \
+	b='intersection1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+maxmin1.log: maxmin1$(EXEEXT)
+	@p='maxmin1$(EXEEXT)'; \
+	b='maxmin1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+meet1.log: meet1$(EXEEXT)
+	@p='meet1$(EXEEXT)'; \
+	b='meet1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+membytes1.log: membytes1$(EXEEXT)
+	@p='membytes1$(EXEEXT)'; \
+	b='membytes1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+powerset1.log: powerset1$(EXEEXT)
+	@p='powerset1$(EXEEXT)'; \
+	b='powerset1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+reduce1.log: reduce1$(EXEEXT)
+	@p='reduce1$(EXEEXT)'; \
+	b='reduce1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+refinewith1.log: refinewith1$(EXEEXT)
+	@p='refinewith1$(EXEEXT)'; \
+	b='refinewith1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+relationwith1.log: relationwith1$(EXEEXT)
+	@p='relationwith1$(EXEEXT)'; \
+	b='relationwith1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+simplifyusingcontext1.log: simplifyusingcontext1$(EXEEXT)
+	@p='simplifyusingcontext1$(EXEEXT)'; \
+	b='simplifyusingcontext1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+size1.log: size1$(EXEEXT)
+	@p='size1$(EXEEXT)'; \
+	b='size1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+spacedims1.log: spacedims1$(EXEEXT)
+	@p='spacedims1$(EXEEXT)'; \
+	b='spacedims1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+universe1.log: universe1$(EXEEXT)
+	@p='universe1$(EXEEXT)'; \
+	b='universe1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+upperbound1.log: upperbound1$(EXEEXT)
+	@p='upperbound1$(EXEEXT)'; \
+	b='upperbound1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/utils/libppl_utils.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/utils libppl_utils.a
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Powerset/addcongruences1.cc b/tests/Powerset/addcongruences1.cc
new file mode 100644
index 0000000..5053689
--- /dev/null
+++ b/tests/Powerset/addcongruences1.cc
@@ -0,0 +1,68 @@
+/* Test Pointset_Powerset<PH>::add_congruence().
+        Pointset_Powerset<PH>::add_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_congruence().
+bool
+test01() {
+  Variable x(0);
+  Congruence cg = (Linear_Expression(0) %= 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_congruence(cg);
+  Congruence cg1 = ((Linear_Expression(25) %= 1) / 2);
+  ps.add_congruence(cg1);
+  bool ok = !ps.is_empty() && ps.OK();
+  return ok;
+}
+
+// Powerset of C polyhedra: add_congruences().
+bool
+test02() {
+  Variable x(0);
+  Congruence_System cgs;
+  cgs.insert((x %= 0) / 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_congruences(cgs);
+  cgs.insert((x %= 0) / 0);
+  ps.add_congruences(cgs);
+  bool ok = !ps.is_empty();
+  cgs.insert((x %= 0) / 0);
+  cgs.insert((x %= 1) / 0);
+  ps.add_congruences(cgs);
+  ok &= ps.is_empty() && ps.OK();
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/addconstraints1.cc b/tests/Powerset/addconstraints1.cc
new file mode 100644
index 0000000..664ad47
--- /dev/null
+++ b/tests/Powerset/addconstraints1.cc
@@ -0,0 +1,69 @@
+/* Test Pointset_Powerset<PH>::add_constraint().
+        Pointset_Powerset<PH>::add_constraints().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_constraint().
+bool
+test01() {
+  Variable x(0);
+  Constraint c = (x >= 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraint(c);
+  Constraint c1 = (x >= 1);
+  ps.add_constraint(c1);
+  bool ok = !ps.is_empty();
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: add_constraints().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  cs.insert(x >= 3);
+  cs.insert(x <= 4);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraints(cs);
+  cs.insert(x <= 3);
+  ps.add_constraints(cs);
+  bool ok = !ps.is_empty();
+  cs.insert(x <= 2);
+  ps.add_constraints(cs);
+  ok &= ps.is_empty();
+
+  return ok && ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/affinedimension1.cc b/tests/Powerset/affinedimension1.cc
new file mode 100644
index 0000000..8c0d0c9
--- /dev/null
+++ b/tests/Powerset/affinedimension1.cc
@@ -0,0 +1,139 @@
+/* Test Pointset_Powerset<PH>::affine_dimension().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: affine_dimension().
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(3, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  cs.insert(z <= 2);
+  cs.insert(z >= 2);
+  C_Polyhedron ph(3);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  cs1.insert(x == 6);
+  C_Polyhedron ph1(3);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  dimension_type d = c_ps.affine_dimension();
+
+  bool ok = (d == 3);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  print_constraints(phi, "*** phi ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  c_ps.add_constraint(z == 2);
+
+  dimension_type d1 = c_ps.affine_dimension();
+
+  bool ok1 = (d1 == 2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator j = c_ps.begin();
+  C_Polyhedron phj = j->pointset();
+  j++;
+  C_Polyhedron phj1 = j->pointset();
+
+  print_constraints(phj, "*** phj ***");
+  print_constraints(phj1, "*** phj1 ***");
+
+  return ok && ok1;
+}
+
+// Powerset of NNC polyhedra: affine_dimension().
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(1);
+  Pointset_Powerset<NNC_Polyhedron> c_ps(3, EMPTY);
+  Constraint_System cs;
+  cs.insert(x > 0);
+  cs.insert(x <= 2);
+  cs.insert(z <= 2);
+  cs.insert(z >= 2);
+  NNC_Polyhedron ph(3);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  cs1.insert(x == 6);
+  NNC_Polyhedron ph1(3);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  dimension_type d = c_ps.affine_dimension();
+
+  bool ok = (d == 3);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = c_ps.begin();
+  NNC_Polyhedron phi = i->pointset();
+  i++;
+  NNC_Polyhedron phi1 = i->pointset();
+
+  print_constraints(phi, "*** phi ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  c_ps.add_constraint(z == 2);
+
+  dimension_type d1 = c_ps.affine_dimension();
+
+  bool ok1 = (d1 == 2);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator j = c_ps.begin();
+  NNC_Polyhedron phj = j->pointset();
+  j++;
+  NNC_Polyhedron phj1 = j->pointset();
+
+  print_constraints(phj, "*** phj ***");
+  print_constraints(phj1, "*** phj1 ***");
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/affineimage1.cc b/tests/Powerset/affineimage1.cc
new file mode 100644
index 0000000..41d6db4
--- /dev/null
+++ b/tests/Powerset/affineimage1.cc
@@ -0,0 +1,240 @@
+/* Test Pointset_Powerset<PH>::affine_image(),
+        Pointset_Powerset<PH>::generalized_affine_image(),
+        Pointset_Powerset<PH>::bounded_affine_image().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: affine_image().
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.affine_image(x, x + y);
+
+  ph.affine_image(x, x + y);
+  ph1.affine_image(x, x + y);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: affine_image() and intersection_assign().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<TBox> ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps1.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  ps1.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> ps2(ps1);
+  ps2.affine_image(x, 2*x+1, 2);
+
+  print_constraints(ps1, "*** ps1 ***");
+  print_constraints(ps2, "*** ps2 ***");
+
+  ps1.intersection_assign(ps2);
+
+  Pointset_Powerset<TBox> known_result(1, EMPTY);
+  TBox box(1);
+  box.add_constraint(2*x >= 1);
+  box.add_constraint(2*x <= 2);
+  known_result.add_disjunct(box);
+
+  bool ok = (ps1 == known_result);
+
+  print_constraints(ps1, "*** ps1.intersect_assign(ps2) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Powerset of Boxes: affine_image().
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Pointset_Powerset<TBox> ps(3, EMPTY);
+  for (int i = -10; i <= 9; ++i) {
+    TBox pps_box(3, UNIVERSE);
+    pps_box.add_constraint(i <= x);
+    pps_box.add_constraint(x <= i+1);
+    const TBox::interval_type& ix = pps_box.get_interval(x);
+    TBox::interval_type iy = ix*ix;
+    pps_box.set_interval(y, iy);
+    ps.add_disjunct(pps_box);
+  }
+
+  print_constraints(ps, "*** ps ***");
+
+  ps.affine_image(z, y+2*x+1, 2);
+
+  print_constraints(ps, "*** ps ***");
+
+  return ps.OK();
+}
+
+// Powerset of polyhedra: generalized_affine_image(
+//                          const Linear_Expression&,
+//                          Relation_Symbol relsym,
+//                          const Linear_Expression&).
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+
+  ph.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+  ph1.generalized_affine_image(x - y, GREATER_OR_EQUAL, Linear_Expression(3));
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// Powerset of polyhedra: bounded_affine_image(
+//                          Variable,
+//                          Relation_Symbol relsym,
+//                          const Linear_Expression&,
+//                          Coefficient_traits::const_reference)..
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+
+  ph.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+  ph1.bounded_affine_image(y, Linear_Expression(0), 2*y, 5);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Powerset/affinepreimage1.cc b/tests/Powerset/affinepreimage1.cc
new file mode 100644
index 0000000..04f4158
--- /dev/null
+++ b/tests/Powerset/affinepreimage1.cc
@@ -0,0 +1,172 @@
+/* Test Pointset_Powerset<PH>::affine_preimage(),
+        Pointset_Powerset<PH>::generalized_affine_preimage(),
+        Pointset_Powerset<PH>::bounded_affine_preimage().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: affine_preimage().
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.affine_preimage(x, x + y);
+
+  ph.affine_preimage(x, x + y);
+  ph1.affine_preimage(x, x + y);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// Powerset of polyhedra: generalized_affine_preimage(
+//                          const Linear_Expression&,
+//                          Relation_Symbol relsym,
+//                          const Linear_Expression&).
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+
+  ph.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+  ph1.generalized_affine_preimage(2*y, LESS_OR_EQUAL, 4*y);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+// Powerset of polyhedra: bounded_affine_preimage(
+//                          Variable,
+//                          Relation_Symbol relsym,
+//                          const Linear_Expression&,
+//                          Coefficient_traits::const_reference).
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  c_ps.bounded_affine_preimage(y, x, 2*y, 5);
+
+  ph.bounded_affine_preimage(y, x, 2*y, 5);
+  ph1.bounded_affine_preimage(y, x, 2*y, 5);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/bounded1.cc b/tests/Powerset/bounded1.cc
new file mode 100644
index 0000000..4cae2ad
--- /dev/null
+++ b/tests/Powerset/bounded1.cc
@@ -0,0 +1,78 @@
+/* Test Pointset_Powerset<PH>::is_bounded().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_bounded().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_bounded();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  // A zero-dimension universe is bounded.
+  bool b1 = ps.is_bounded();
+  return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_bounded().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_bounded();
+  return b;
+}
+
+// Powerset of C polyhedra: is_bounded().
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_bounded();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = !ps.is_bounded();
+  return b && b1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/bounds1.cc b/tests/Powerset/bounds1.cc
new file mode 100644
index 0000000..2f09478
--- /dev/null
+++ b/tests/Powerset/bounds1.cc
@@ -0,0 +1,97 @@
+/* Test Pointset_Powerset<PH>::bounds_from_above(),
+        Pointset_Powerset<PH>::bounds_from_below().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: bounds_from_above(), bounds_from_below().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  Linear_Expression LE;
+  bool ok1 = ps.bounds_from_above(LE);
+  bool ok2 = ps.bounds_from_below(LE);
+
+  if (!ok1 || !ok2)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(0));
+  ok1 = ps.bounds_from_above(LE);
+  ok2 = ps.bounds_from_below(LE);
+
+  return ok1 && ok2;
+}
+
+// Powerset of NNC polyhedra: bounds_from_above(), bounds_from_below().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+  Linear_Expression LE = x;
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x > 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool ok1 = !ps.bounds_from_above(LE);
+  bool ok2 = ps.bounds_from_below(LE);
+
+  return ok1 && ok2;
+}
+
+// Powerset of C polyhedra: bounds_from_above(), bounds_from_below().
+bool
+test03() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  Linear_Expression LE = x;
+
+  bool ok1 = ps.bounds_from_above(LE);
+  bool ok2 = ps.bounds_from_below(LE);
+
+  if (!ok1 || !ok2)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  ok1 = !ps.bounds_from_above(LE);
+  ok2 = !ps.bounds_from_below(LE);
+
+  return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/closed1.cc b/tests/Powerset/closed1.cc
new file mode 100644
index 0000000..60cbfb3
--- /dev/null
+++ b/tests/Powerset/closed1.cc
@@ -0,0 +1,100 @@
+/* Test Pointset_Powerset<PH>::is_topologically_closed().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_topologically_closed().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_topologically_closed();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool b1 = ps.is_topologically_closed();
+  return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_topologically_closed().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = ps.is_topologically_closed();
+  return b;
+}
+
+// Powerset of NNC polyhedra: is_topologically_closed().
+bool
+test03() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x < 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_topologically_closed();
+  return b;
+}
+
+// Powerset of C polyhedra: is_topologically_closed().
+bool
+test04() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_topologically_closed();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = ps.is_topologically_closed();
+  return b && b1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Powerset/closure1.cc b/tests/Powerset/closure1.cc
new file mode 100644
index 0000000..524debc
--- /dev/null
+++ b/tests/Powerset/closure1.cc
@@ -0,0 +1,59 @@
+/* Test Pointset_Powerset<PH>::topological_closure_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: topological_closure_assign().
+
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<NNC_Polyhedron> ps(1);
+  Constraint_System cs;
+  cs.clear();
+  cs.insert(x > 5);
+  cs.insert(x > 8);
+  ps.add_constraints(cs);
+
+  ps.topological_closure_assign();
+
+  bool ok = ps.OK();
+
+  Pointset_Powerset<NNC_Polyhedron> known_ps(1);
+  cs.clear();
+  cs.insert(x >= 5);
+  cs.insert(x >= 8);
+  known_ps.add_constraints(cs);
+
+  ok = ok && ps.contains(known_ps);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/Powerset/collapse1.cc b/tests/Powerset/collapse1.cc
new file mode 100644
index 0000000..fe1a92f
--- /dev/null
+++ b/tests/Powerset/collapse1.cc
@@ -0,0 +1,95 @@
+/* Test Pointset_Powerset<PH>::collapse().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: collapse().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.collapse();
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = c_ps_expected.definitely_entails(c_ps);
+  bool ok2 = (c_ps.size() == 1);
+
+  return ok && ok1 && ok2;
+}
+
+// Powerset of boxes: collapse().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+
+  pps_box.collapse();
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  Pointset_Powerset<TBox> pps_box_expected(1, EMPTY);
+  pps_box_expected.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box_expected);
+  bool ok1 = pps_box_expected.definitely_entails(pps_box);
+  bool ok2 = (pps_box.size() == 1);
+
+  return ok && ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/concatenate1.cc b/tests/Powerset/concatenate1.cc
new file mode 100644
index 0000000..235d98b
--- /dev/null
+++ b/tests/Powerset/concatenate1.cc
@@ -0,0 +1,75 @@
+/* Test Pointset_Powerset<PH>::concatenate().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: concatenate_assign().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.concatenate_assign(c_ps);
+
+  return c_ps.OK();
+}
+
+// Powerset of boxes: concatenate_assign().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+
+  pps_box.concatenate_assign(pps_box);
+
+  return pps_box.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/contains1.cc b/tests/Powerset/contains1.cc
new file mode 100644
index 0000000..5c38033
--- /dev/null
+++ b/tests/Powerset/contains1.cc
@@ -0,0 +1,109 @@
+/* Test Pointset_Powerset<PH>::contains(),
+        Pointset_Powerset<PH>::strictly_contains().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: contains(), strictly_contains().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps1(1, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> ps2(1, EMPTY);
+  bool b = ps1.contains(ps2);
+  bool c = ps2.contains(ps1);
+  bool bs = ps1.strictly_contains(ps2);
+  bool cs = ps2.strictly_contains(ps1);
+
+  ps1.add_disjunct(C_Polyhedron(1));
+  bool b1 = ps1.contains(ps2);
+  bool c1 = !ps2.contains(ps1);
+  bool bs1 = ps1.strictly_contains(ps2);
+  bool cs1 = !ps2.strictly_contains(ps1);
+
+  ps2.add_disjunct(C_Polyhedron(1));
+  bool b2 = ps1.contains(ps2);
+  bool c2 = ps2.contains(ps1);
+  bool bs2 = !ps1.strictly_contains(ps2);
+  bool cs2 = !ps2.strictly_contains(ps1);
+
+  bool ok = b && c && b1 && c1 && b2 && c2;
+  bool oks = bs && cs && bs1 && cs1 && bs2 && cs2;
+
+  return ok && oks;
+}
+
+// Powerset of C polyhedra: contains(), strictly_contains().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 4);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.contains(c_ps1)
+    && !c_ps1.contains(c_ps)
+    && c_ps.strictly_contains(c_ps1)
+    && !c_ps1.strictly_contains(c_ps);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 4);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  bool ok1 = c_ps.contains(c_ps1)
+    && !c_ps1.contains(c_ps)
+    && !c_ps.strictly_contains(c_ps1)
+    && !c_ps1.strictly_contains(c_ps);
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/containsintegerpoint1.cc b/tests/Powerset/containsintegerpoint1.cc
new file mode 100644
index 0000000..18dd0ef
--- /dev/null
+++ b/tests/Powerset/containsintegerpoint1.cc
@@ -0,0 +1,132 @@
+/* Test Pointset_Powerset<PH>::contains_integer_point(),
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: contains_integer_point() returns false.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<C_Polyhedron> ps(2);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(4*y <= 3);
+  cs.insert(4*y >= 1);
+
+  ps.refine_with_constraints(cs);
+
+  bool contains = ps.contains_integer_point();
+
+  print_constraints(ps, "*** ps ***");
+  nout << "ps.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+// Powerset of C polyhedra: contains_integer_point() returns true.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+
+  Pointset_Powerset<C_Polyhedron> ps(3);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(4*z - 4*y >= 3);
+
+  ps.refine_with_constraints(cs);
+
+  print_constraints(ps, "*** ps ***");
+
+  bool contains = ps.contains_integer_point();
+
+  nout << "ps.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+// Empty 0-dimensional powerset of C polyhedra: contains_integer_point().
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+  print_constraints(ps, "*** ps ***");
+
+  bool contains = ps.contains_integer_point();
+
+  nout << "ps.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+// Universe 0-dimensional powerset of C polyhedra: contains_integer_point().
+bool
+test04() {
+  Pointset_Powerset<C_Polyhedron> ps(0);
+
+  bool contains = ps.contains_integer_point();
+
+  print_constraints(ps, "*** ps ***");
+
+  nout << "ps.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return contains;
+}
+
+// Empty 1-dimensional powerset of C polyhedra: contains_integer_point().
+bool
+test05() {
+  Pointset_Powerset<C_Polyhedron> ps(1);
+
+  ps.refine_with_constraint(Linear_Expression(0) == 1);
+
+  bool contains = ps.contains_integer_point();
+
+  print_constraints(ps, "*** ps ***");
+
+  nout << "ps.contains_integer_point() == "
+       << (contains ? "true" : "false") << endl;
+
+  return !contains;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Powerset/difference1.cc b/tests/Powerset/difference1.cc
new file mode 100644
index 0000000..543754a
--- /dev/null
+++ b/tests/Powerset/difference1.cc
@@ -0,0 +1,151 @@
+/* Test Pointset_Powerset<PH>::difference_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: difference_assign().
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps1(2, UNIVERSE);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(2);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+  c_ps2.add_constraints(cs);
+
+  using namespace IO_Operators;
+  c_ps1.difference_assign(c_ps2);
+
+  nout << c_ps1 << endl;
+
+  return true;
+}
+
+// Powerset of C polyhedra: difference_assign().
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps1(2, UNIVERSE);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(2);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  cs.insert(y >= 0);
+  cs.insert(y <= 1);
+  c_ps2.add_constraints(cs);
+
+  using namespace IO_Operators;
+  c_ps1.difference_assign(c_ps2);
+
+  nout << c_ps1 << endl;
+
+  return true;
+}
+
+// Creating a rectangle.
+C_Polyhedron
+aux_test03(int lx, int ly, int dx, int dy) {
+  Variable x(0);
+  Variable y(1);
+  C_Polyhedron ph(2, EMPTY);
+  ph.add_generator(point((lx+0*dx)*x + (ly+0*dy)*y));
+  ph.add_generator(point((lx+1*dx)*x + (ly+0*dy)*y));
+  ph.add_generator(point((lx+1*dx)*x + (ly+1*dy)*y));
+  ph.add_generator(point((lx+0*dx)*x + (ly+1*dy)*y));
+  return ph;
+}
+
+// Powerset of C polyhedra: difference_assign(), meet_assign,
+// upper_bound_assign() and pairwise_reduce().
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> cross(2, EMPTY);
+  cross.add_disjunct(aux_test03(0, 3, 9, 3));
+  cross.add_disjunct(aux_test03(3, 0, 3, 9));
+
+  using namespace IO_Operators;
+  nout << "cross = " << cross << endl;
+
+  Pointset_Powerset<C_Polyhedron> squares(2, EMPTY);
+  squares.add_disjunct(aux_test03(1, 4, 1, 1));
+  squares.add_disjunct(aux_test03(4, 4, 1, 1));
+  squares.add_disjunct(aux_test03(7, 4, 1, 1));
+  squares.add_disjunct(aux_test03(4, 1, 1, 1));
+  squares.add_disjunct(aux_test03(4, 7, 1, 1));
+
+  nout << "squares = " << squares << endl;
+
+  Pointset_Powerset<C_Polyhedron> difference = cross;
+  difference.difference_assign(squares);
+
+  nout << "cross - squares = " << difference << endl;
+
+  Pointset_Powerset<C_Polyhedron> intersection = difference;
+  intersection.meet_assign(squares);
+
+  nout << "(cross - squares) inters squares = " << intersection << endl;
+
+  // When using Pointset_Powerset<NNC_Polyhedron>, intersection will be
+  // empty.  When using Pointset_Powerset<C_Polyhedron>,
+  // intersection will consist of objects of affine dimension at most 1.
+  bool ok1 = true;
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator
+         i = intersection.begin(), in_end = intersection.end();
+       i != in_end; ++i)
+    if (i->pointset().affine_dimension() > 1) {
+      nout << "intersection contains " << i->pointset() << "," << endl
+           << "which is of affine dimension greater than 1" << endl;
+      ok1 = false;
+    }
+
+  Pointset_Powerset<C_Polyhedron> re_union = difference;
+  re_union.upper_bound_assign(squares);
+
+  nout << "(cross - squares) union squares = " << re_union << endl;
+  re_union.pairwise_reduce();
+  nout << "<Above union pairwise reduced>  = " << re_union << endl;
+
+  bool ok2 = re_union.geometrically_equals(cross);
+
+  if (!ok2)
+    nout << "Union does not give back the original!" << endl;
+
+  return ok1 && ok2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/discrete1.cc b/tests/Powerset/discrete1.cc
new file mode 100644
index 0000000..c46522a
--- /dev/null
+++ b/tests/Powerset/discrete1.cc
@@ -0,0 +1,80 @@
+/* Test Pointset_Powerset<PH>::is_discrete().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_discrete().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_discrete();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  // A zero-dimension universe is discrete.
+  bool b1 = ps.is_discrete();
+  return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_discrete().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x == 2);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = ps.is_discrete();
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b1 = !ps.is_discrete();
+  return b && b1;
+}
+
+// Powerset of C polyhedra: is_discrete().
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = ps.is_discrete();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = !ps.is_discrete();
+  return b && b1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/disjoint1.cc b/tests/Powerset/disjoint1.cc
new file mode 100644
index 0000000..6c171ce
--- /dev/null
+++ b/tests/Powerset/disjoint1.cc
@@ -0,0 +1,117 @@
+/* Test Pointset_Powerset<PH>::is_disjoint_from().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_disjoint_from().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps1(0, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> ps2(0, EMPTY);
+  bool b = ps1.is_disjoint_from(ps2);
+  bool c = ps2.is_disjoint_from(ps1);
+
+  ps1.add_disjunct(C_Polyhedron(0));
+  bool b1 = ps1.is_disjoint_from(ps2);
+  bool c1 = ps2.is_disjoint_from(ps1);
+
+  ps2.add_disjunct(C_Polyhedron(0));
+  bool b2 = !ps1.is_disjoint_from(ps2);
+  bool c2 = !ps2.is_disjoint_from(ps1);
+
+  return b && c && b1 && c1 && b2 && c2;
+}
+
+// Powerset of NNC polyhedra: is_disjoint_from().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps1.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x == 2);
+  ps1.add_disjunct(NNC_Polyhedron(cs));
+
+  Pointset_Powerset<NNC_Polyhedron> ps2(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 2);
+  cs.insert(x <= 6);
+  ps2.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = ps1.is_disjoint_from(ps2);
+  bool c = ps2.is_disjoint_from(ps1);
+
+  cs.clear();
+  cs.insert(x >= 2);
+  ps2.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b1 = !ps1.is_disjoint_from(ps2);
+  bool c1 = !ps2.is_disjoint_from(ps1);
+
+  return b && c && b1 && c1;
+}
+
+// Powerset of C polyhedra: is_disjoint_from().
+bool
+test03() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<C_Polyhedron> ps1(1, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> ps2(1, EMPTY);
+  bool b = ps1.is_disjoint_from(ps2);
+  bool c = ps2.is_disjoint_from(ps1);
+
+  ps1.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = ps1.is_disjoint_from(ps2);
+  bool c1 = ps2.is_disjoint_from(ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 1);
+  ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool b2 = !ps1.is_disjoint_from(ps2);
+  bool c2 = !ps2.is_disjoint_from(ps1);
+
+  return b && c && b1 && c1 && b2 && c2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/disjunct1.cc b/tests/Powerset/disjunct1.cc
new file mode 100644
index 0000000..bf01aa5
--- /dev/null
+++ b/tests/Powerset/disjunct1.cc
@@ -0,0 +1,311 @@
+/* Test Pointset_Powerset<PH>::add_disjunct().
+        Pointset_Powerset<PH>::drop_disjunct().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_disjunct().
+bool
+test01() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.add_constraint(x == 1);
+
+  Pointset_Powerset<NNC_Polyhedron> nnc_ps(c_ps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_ps.begin();
+  C_Polyhedron c_phi = c_i->pointset();
+  print_constraints(c_phi, "*** c_phi ***");
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_ps.begin();
+  NNC_Polyhedron nnc_phi = nnc_i->pointset();
+  print_constraints(nnc_phi, "*** nnc_phi ***");
+
+  return c_ps.OK() && nnc_ps.OK();
+}
+
+// Powerset of NNC polyhedra: add_disjunct().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> nnc_ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  nnc_ps.add_disjunct(NNC_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps(nnc_ps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_ps.begin();
+  C_Polyhedron c_phi = c_i->pointset();
+  print_constraints(c_phi, "*** c_phi ***");
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_ps.begin();
+  NNC_Polyhedron nnc_phi = nnc_i->pointset();
+  print_constraints(nnc_phi, "*** nnc_phi ***");
+
+  return nnc_ps.OK() && c_ps.OK();
+}
+
+// Powerset of C polyhedra: add_disjunct() and drop_disjunct().
+bool
+test03() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  Constraint_System cs1 = cs;
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.drop_disjunct(c_ps.begin());
+
+  bool ok = c_ps.empty();
+
+  Constraint_System cs2 = cs1;
+  c_ps.add_disjunct(C_Polyhedron(cs1));
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.drop_disjuncts(c_ps.begin(), c_ps.end());
+
+  bool ok1 = c_ps.empty();
+
+  return ok && ok1;
+}
+
+// Powerset of C polyhedra: add_disjunct().
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<C_Polyhedron> c_ps(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  C_Polyhedron ph(2);
+  ph.add_constraints(cs);
+  c_ps.add_disjunct(ph);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  C_Polyhedron ph1(2);
+  ph1.add_constraints(cs1);
+  c_ps.add_disjunct(ph1);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = c_ps.begin();
+  C_Polyhedron phi = i->pointset();
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+
+  bool ok = phi.OK() && phi == ph;
+
+  print_constraints(ph, "*** ph ***");
+  print_constraints(phi, "*** phi ***");
+
+  bool ok1 = phi1.OK() && phi1 == ph1;
+
+  print_constraints(ph1, "*** ph1 ***");
+  print_constraints(phi1, "*** phi1 ***");
+
+  phi.upper_bound_assign(phi1);
+  print_constraints(phi, "*** phi ***");
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: add_disjunct().
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<TBox> pps_box(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  TBox box(2);
+  box.add_constraints(cs);
+  pps_box.add_disjunct(box);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  TBox box1(2);
+  box1.add_constraints(cs1);
+  pps_box.add_disjunct(box1);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps_box.begin();
+  TBox pps_boxi = i->pointset();
+  i++;
+  TBox pps_boxi1 = i->pointset();
+
+  bool ok = pps_boxi.OK() && pps_boxi == box;
+
+  print_constraints(box, "*** box ***");
+  print_constraints(pps_boxi, "*** pps_boxi ***");
+
+  bool ok1 = pps_boxi1.OK() && pps_boxi1 == box1;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(pps_boxi1, "*** pps_boxi1 ***");
+
+  pps_boxi.upper_bound_assign(pps_boxi1);
+  print_constraints(pps_boxi, "*** pps_boxi ***");
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: add_disjunct().
+bool
+test06() {
+  Variable x(0);
+
+  Pointset_Powerset<TBox> ps(1, EMPTY);
+  Constraint_System cs;
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 2);
+  ps.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  ps.add_disjunct(TBox(cs));
+
+  print_constraints(ps, "*** ps ***");
+
+  ps.add_constraint(x == 1);
+
+  Pointset_Powerset<TBox> known_result(1, EMPTY);
+  TBox box(1);
+  box.add_constraint(x == 1);
+  known_result.add_disjunct(box);
+
+  bool ok = (ps == known_result);
+
+  print_constraints(ps, "*** ps.add_constraint(x == 1) ***");
+  print_constraints(known_result, "*** known_result ***");
+
+  return ok;
+}
+
+// Powerset of boxes: add_disjuncts().
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Pointset_Powerset<TBox> pps_box(2, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  TBox box(2);
+  box.add_constraints(cs);
+  pps_box.add_disjunct(box);
+
+  Constraint_System cs1;
+  cs1.insert(y >= 3);
+  cs1.insert(y <= 5);
+  TBox box1(2);
+  box1.add_constraints(cs1);
+  pps_box.add_disjunct(box1);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps_box.begin();
+  TBox pps_boxi = i->pointset();
+  i++;
+  TBox pps_boxi1 = i->pointset();
+
+  bool ok = pps_boxi.OK() && pps_boxi == box;
+
+  print_constraints(box, "*** box ***");
+  print_constraints(pps_boxi, "*** pps_boxi ***");
+
+  bool ok1 = pps_boxi1.OK() && pps_boxi1 == box1;
+
+  print_constraints(box1, "*** box1 ***");
+  print_constraints(pps_boxi1, "*** pps_boxi1 ***");
+
+  pps_boxi.upper_bound_assign(pps_boxi1);
+  print_constraints(pps_boxi, "*** pps_boxi ***");
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: add_disjunct(), drop_disjuncts().
+bool
+test08() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  Constraint_System cs1 = cs;
+  pps_box.add_disjunct(TBox(cs));
+  pps_box.drop_disjunct(pps_box.begin());
+
+  bool ok = pps_box.empty();
+
+  Constraint_System cs2 = cs1;
+  pps_box.add_disjunct(TBox(cs1));
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+  pps_box.drop_disjuncts(pps_box.begin(), pps_box.end());
+
+  bool ok1 = pps_box.empty();
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Powerset/empty1.cc b/tests/Powerset/empty1.cc
new file mode 100644
index 0000000..1a6bc7c
--- /dev/null
+++ b/tests/Powerset/empty1.cc
@@ -0,0 +1,142 @@
+/* Test Pointset_Powerset<PH>::is_empty(),
+        Pointset_Powerset<PH>::empty().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: empty().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1;
+  c_ps1 = c_ps;
+
+  bool ok = !c_ps.empty();
+  return ok;
+}
+
+// Powerset of C polyhedra: empty().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  swap(c_ps, c_ps1);
+
+  bool ok = (c_ps.empty() && !c_ps1.empty());
+  return ok;
+}
+
+// Powerset of C polyhedra: is_empty().
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = ps.is_empty();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool b1 = !ps.is_empty();
+  return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_empty().
+bool
+test04() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_empty();
+  return b;
+}
+
+// Powerset of boxes: !empty().
+bool
+test05() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1;
+  pps_box1 = pps_box;
+
+  bool ok = !pps_box.empty();
+  return ok;
+}
+
+// Powerset of boxes: empty().
+bool
+test06() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  swap(pps_box, pps_box1);
+
+  bool ok = (pps_box.empty() && !pps_box1.empty());
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+END_MAIN
diff --git a/tests/Powerset/entails1.cc b/tests/Powerset/entails1.cc
new file mode 100644
index 0000000..837d5d8
--- /dev/null
+++ b/tests/Powerset/entails1.cc
@@ -0,0 +1,73 @@
+/* Test Pointset_Powerset<PH>::definitely_entails().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: definitely_entails().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  c_ps1.add_disjunct(C_Polyhedron(cs1));
+
+  bool ok = c_ps1.definitely_entails(c_ps);
+
+  return ok;
+}
+
+// Powerset of boxes: definitely_entails().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+  cs.insert(x >= 0);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  Constraint_System cs1;
+  cs1.insert(x >= 0);
+  cs1.insert(x <= 2);
+  pps_box1.add_disjunct(TBox(cs1));
+
+  bool ok = pps_box1.definitely_entails(pps_box);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/equals1.cc b/tests/Powerset/equals1.cc
new file mode 100644
index 0000000..6f66873
--- /dev/null
+++ b/tests/Powerset/equals1.cc
@@ -0,0 +1,79 @@
+/* Test Pointset_Powerset<PH>::equals(),
+        Pointset_Powerset<PH>::geometrically_equals().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// geometrically_equals().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1);
+  Constraint_System cs;
+  cs.insert(x >= 5);
+  cs.insert(x <= 3);
+  pps_box.add_constraints(cs);
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+
+  // pps_box.ascii_dump();
+  // pps_box1.ascii_dump();
+
+  bool ok = pps_box.geometrically_equals(pps_box1);
+  bool ok1 = pps_box.geometrically_equals(pps_box1);
+
+  return ok && ok1;
+}
+
+// geometrically_equals().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1);
+  Constraint_System cs;
+  cs.insert(x >= 5);
+  cs.insert(x >= 8);
+  pps_box.add_constraints(cs);
+
+  Pointset_Powerset<TBox> pps_box1(1);
+  cs.clear();
+  cs.insert(x >= 8);
+  pps_box1.add_constraints(cs);
+
+  // pps_box.ascii_dump();
+  // pps_box1.ascii_dump();
+
+  bool ok = pps_box.geometrically_equals(pps_box1);
+  bool ok1 = pps_box.geometrically_equals(pps_box1);
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/frombdshape1.cc b/tests/Powerset/frombdshape1.cc
new file mode 100644
index 0000000..9104bdc
--- /dev/null
+++ b/tests/Powerset/frombdshape1.cc
@@ -0,0 +1,425 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(BD_Shape<T>),
+   Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(BD_Shape<T>)).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a bd shape.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x >= 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(bds);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(x - y <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty bd shape.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(bds);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of bd shapes.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bds(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bds(bds, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<C_Polyhedron> pps(pps_bds, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator j = pps.begin();
+  C_Polyhedron phj = j->pointset();
+  print_constraints(phj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a bd shape.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBD_Shape bds(4);
+  bds.add_constraint(x >= 2);
+  bds.add_constraint(x - y <= 4);
+  bds.add_constraint(z == 1);
+
+  Pointset_Powerset<TBD_Shape> pps1(bds);
+  Pointset_Powerset<TBD_Shape> pps2(4, EMPTY);
+  pps2.add_disjunct(bds);
+
+  bool ok = (pps1 == pps2);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps1.begin();
+  TBD_Shape bdsi = i->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+  Pointset_Powerset<TBD_Shape>::const_iterator i2 = pps2.begin();
+  TBD_Shape bdsi2 = i2->pointset();
+  print_constraints(bdsi2, "*** bdsi2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of bd shapes from an empty bd shape.
+bool
+  test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(bds);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of bd shapes.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bds(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bds(bds, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(pps_bds, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator j = pps.begin();
+  TBD_Shape bdsj = j->pointset();
+  print_constraints(bdsj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a bd shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(bds);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x == 0);
+  known_pps.add_constraint(x - y <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty bd shape.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(bds);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of bd shapes.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bd(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps.begin();
+  TOctagonal_Shape osi = i_os->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a bd shape.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<TBox> pps(bds);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 0);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an empty bd shape.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(bds);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of bd shapes.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bd(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i_box = pps.begin();
+  TBox boxi = i_box->pointset();
+  print_constraints(boxi, "*** boxi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a bd shape.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2);
+  bds.add_constraint(x == 0);
+  bds.add_constraint(x - y <= 1);
+  bds.add_constraint(y >= 0);
+
+  Pointset_Powerset<Grid> pps(bds);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_congruence((x %= 0) / 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid phi = i->pointset();
+  print_congruences(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an empty bd shape.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TBD_Shape bds(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(bds);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of bd shapes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TBD_Shape bd(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps_bd(bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_bd = pps_bd.begin();
+  TBD_Shape bdi = i_bd->pointset();
+  print_constraints(bdi, "*** bdi ***");
+
+  // The complexity should be ignored.
+  Pointset_Powerset<Grid> pps(pps_bd, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+  Grid gri = i_gr->pointset();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Powerset/frombox1.cc b/tests/Powerset/frombox1.cc
new file mode 100644
index 0000000..aafdbdf
--- /dev/null
+++ b/tests/Powerset/frombox1.cc
@@ -0,0 +1,421 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(Box<T>),
+   Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(Box<T>)).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a box.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x <= 1);
+  box.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(box);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(2*x <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty box.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(box);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of boxes.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<C_Polyhedron> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator j = pps.begin();
+  C_Polyhedron phj = j->pointset();
+  print_constraints(phj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a box.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty box.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(box);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of boxes.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_bds = pps.begin();
+  TBD_Shape bdsi = i_bds->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a box.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty box.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TBox box(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(box);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of boxes.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x >= 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps.begin();
+  TOctagonal_Shape osi = i_os->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a box.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TBox box(4);
+  box.add_constraint(x >= 2);
+  box.add_constraint(z == 1);
+
+  Pointset_Powerset<TBox> pps1(box);
+  Pointset_Powerset<TBox> pps2(4, EMPTY);
+  pps2.add_disjunct(box);
+
+  bool ok = (pps1 == pps2);
+
+  print_constraints(box, "*** box ***");
+  Pointset_Powerset<TBox>::const_iterator i = pps1.begin();
+  TBox boxi = i->pointset();
+  print_constraints(boxi, "*** boxi ***");
+  Pointset_Powerset<TBox>::const_iterator i2 = pps2.begin();
+  TBox boxi2 = i2->pointset();
+  print_constraints(boxi2, "*** boxi2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty box.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(box);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of boxes.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator j = pps.begin();
+  TBox boxj = j->pointset();
+  print_constraints(boxj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a box.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2);
+  box.add_constraint(x >= 0);
+  box.add_constraint(2*x == 1);
+  box.add_constraint(y >= 0);
+
+  Pointset_Powerset<Grid> pps(box);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid phi = i->pointset();
+  print_congruences(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an empty box.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Rational_Box box(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(box);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of boxes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TBox box(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps_box(box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox>::const_iterator i_box = pps_box.begin();
+  TBox boxi = i_box->pointset();
+  print_constraints(boxi, "*** boxi ***");
+
+  // The complexity should be ignored.
+  Pointset_Powerset<Grid> pps(pps_box, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+  Grid gri = i_gr->pointset();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Powerset/fromcongruences1.cc b/tests/Powerset/fromcongruences1.cc
new file mode 100644
index 0000000..adf53e8
--- /dev/null
+++ b/tests/Powerset/fromcongruences1.cc
@@ -0,0 +1,78 @@
+/* Test Pointset_Powerset<PH>::
+          Pointset_Powerset(Congruence_System).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Congruence_System cs;
+  Pointset_Powerset<C_Polyhedron> ps(cs);
+
+  bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 0);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+
+  Congruence_System cs;
+  cs.insert((A %= -1) / 0);
+  cs.insert((B %= 1) / 0);
+  Pointset_Powerset<C_Polyhedron> ps(cs);
+
+  bool ok = (ps.OK() && !ps.is_universe() && ps.space_dimension() == 2);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+
+  Congruence_System cs;
+  cs.insert((A %= -1) / 0);
+  cs.insert((B %= 1)/ 0);
+  cs.insert((C %= 2) / 0);
+  cs.insert((C %= 1) / 0);
+  Pointset_Powerset<C_Polyhedron> ps(cs);
+
+  bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 3);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/fromconstraints1.cc b/tests/Powerset/fromconstraints1.cc
new file mode 100644
index 0000000..c9800a7
--- /dev/null
+++ b/tests/Powerset/fromconstraints1.cc
@@ -0,0 +1,182 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(Constraint_System).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Construct powerset of polyhedra from a 0 dimension empty constraint system.
+bool
+test01() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<C_Polyhedron> ps(cs);
+  return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of polyhedra from a non-empty constraint system.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Constraint_System cs;
+
+  cs.insert(x + y > 0);
+  cs.insert(x - 2*y <= 2);
+  cs.insert(z == 2);
+  Pointset_Powerset<NNC_Polyhedron> ps(cs);
+
+  return ps.OK() && ps.space_dimension() == 3;
+}
+
+// Construct powerset of bd shapes from a 0 dimension empty constraint system.
+bool
+test03() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<TBD_Shape> ps(cs);
+  return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of bd shapes from non-empty constraint system.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Constraint_System cs;
+
+  cs.insert(x - y <= 2);
+  cs.insert(z == 2);
+  Pointset_Powerset<TBD_Shape> ps(cs);
+
+  return ps.OK() && ps.space_dimension() == 3;
+}
+
+// Construct powerset of octagonal shapes from a 0 dimension empty constraint system.
+bool
+test05() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<TOctagonal_Shape> ps(cs);
+  return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of octagonal shapes from non-empty constraint system.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Constraint_System cs;
+
+  cs.insert(x + y >= -2);
+  cs.insert(x - y <= 2);
+  cs.insert(z == 2);
+  Pointset_Powerset<TOctagonal_Shape> ps(cs);
+
+  return ps.OK() && ps.space_dimension() == 3;
+}
+
+// Construct powerset of boxes from a 0 dimension empty constraint system.
+bool
+test07() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<TBox> ps(cs);
+
+  print_constraints(ps, "*** ps ***");
+
+  return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of boxes from a non-empty constraint system.
+bool
+test08() {
+  Variable x(0);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  Pointset_Powerset<TBox> ps(cs);
+
+  return ps.OK() && ps.space_dimension() == 1;
+}
+
+// Construct powerset of grids from a 0 dimension empty constraint system.
+bool
+test09() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<Grid> ps(cs);
+
+  print_constraints(ps, "*** ps ***");
+
+  return ps.OK() && ps.is_empty() && ps.space_dimension() == 0;
+}
+
+// Construct powerset of grids from non-empty constraint system.
+bool
+test10() {
+  Variable x(0);
+  Constraint_System cs;
+
+  cs.insert(x == 0);
+  Pointset_Powerset<Grid> ps(cs);
+
+  return ps.OK() && ps.space_dimension() == 1;
+}
+
+// Construct powerset of products from a 0-dim inconsistent constraint system.
+  typedef Domain_Product<NNC_Polyhedron, Grid>::Constraints_Product CProduct;
+bool
+test11() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<CProduct> pscp(cs);
+  return pscp.OK();
+}
+
+// Construct powerset of products from a 1-dim constraint system.
+bool
+test12() {
+  Variable A(0);
+
+  CProduct cp(1);
+  cp.add_constraint(A == 0);
+  Pointset_Powerset<CProduct> pscp(1);
+  pscp.add_disjunct(cp);
+  return pscp.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+END_MAIN
diff --git a/tests/Powerset/fromgrid1.cc b/tests/Powerset/fromgrid1.cc
new file mode 100644
index 0000000..dbac760
--- /dev/null
+++ b/tests/Powerset/fromgrid1.cc
@@ -0,0 +1,435 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(Grid),
+        Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(Grid)).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from a grid.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2);
+  grid.add_congruence((2*x %= 1) / 0);
+  grid.add_congruence(y %= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(grid);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty grid.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(grid);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of grids.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2);
+  grid.add_congruence((2*x %= 1) / 0);
+  grid.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(grid);
+
+  Pointset_Powerset<C_Polyhedron> pps(pps_gr);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a grid.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TBD_Shape> pps(gr);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty grid.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(gr);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of grids.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(gr);
+
+  Pointset_Powerset<TBD_Shape> pps(pps_gr);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a grid.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(gr);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an empty grid.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(gr);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of grids.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(gr);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_gr);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a grid.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<TBox> pps(gr);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an empty grid.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(gr);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of grids.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2);
+  gr.add_congruence((2*x %= 1) / 0);
+  gr.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(gr);
+
+  Pointset_Powerset<TBox> pps(pps_gr);
+
+  Pointset_Powerset<TBox> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox boxi = i->pointset();
+  print_constraints(boxi, "*** boxi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a grid.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  Grid gr(4);
+  gr.add_congruence(x %= 2);
+  gr.add_constraint(z == 1);
+
+  Pointset_Powerset<Grid> pps1(gr);
+  Pointset_Powerset<Grid> pps2(4, EMPTY);
+  pps2.add_disjunct(gr);
+
+  bool ok = (pps1 == pps2);
+
+  print_congruences(gr, "*** gr ***");
+  Pointset_Powerset<Grid>::const_iterator i = pps1.begin();
+  Grid gri = i->pointset();
+  print_congruences(gri, "*** gri ***");
+  Pointset_Powerset<Grid>::const_iterator i2 = pps2.begin();
+  Grid gri2 = i2->pointset();
+  print_congruences(gri2, "*** gri2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty grid.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid gr(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(gr);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of grids.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid(2);
+  grid.add_congruence((2*x %= 1) / 0);
+  grid.add_congruence(y %= 0);
+
+  Pointset_Powerset<Grid> pps_gr(grid);
+
+  Pointset_Powerset<Grid> pps(pps_gr);
+
+  Pointset_Powerset<Grid> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+  known_pps.add_congruence(y %= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid gri = i->pointset();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+// Constructs the powerset of NNC polyhedra from a powerset of grids
+// where set of grids is omega reduced but the constructed set
+// of NNC polyhedra is not omega reduced.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  Grid grid1(2);
+  grid1.add_congruence((x %= 0) / 2);
+  grid1.add_congruence((y %= 0) / 2);
+  Grid grid2(2);
+  grid2.add_congruence((x %= 1) / 2);
+  grid2.add_congruence((y %= 1) / 0);
+
+  Pointset_Powerset<Grid> pps_gr(grid1);
+  pps_gr.add_disjunct(grid2);
+
+  // At this stage, pps_gr is omega reduced but pps_gr.reduced flag will
+  // be set to false.
+  // So we add this test to set the omega reduction pps_gr.reduced
+  // flag to true.
+  pps_gr.is_topologically_closed();
+
+  Pointset_Powerset<NNC_Polyhedron> pps(pps_gr);
+
+  // pps is not omega reduced.
+  bool ok = (pps.size() == 2);
+
+  Pointset_Powerset<NNC_Polyhedron> known_pps(2);
+
+  ok = ok && (pps == known_pps) && pps.OK();
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+  NNC_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+END_MAIN
diff --git a/tests/Powerset/fromoctagonalshape1.cc b/tests/Powerset/fromoctagonalshape1.cc
new file mode 100644
index 0000000..6d3da9d
--- /dev/null
+++ b/tests/Powerset/fromoctagonalshape1.cc
@@ -0,0 +1,432 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(BD_Shape<T>),
+   Pointset_Powerset<PH>::Pointset_Powerset(Pointset_Powerset(BD_Shape<T>)).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from an octagonal shape.
+bool
+test01() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x >= 0);
+  os.add_constraint(x - y <= 1);
+  os.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps(os);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x >= 0);
+  known_pps.add_constraint(x - y <= 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from an empty octagonal shape.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<C_Polyhedron> pps(os);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a powerset of octagonal shapes.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<C_Polyhedron> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator j = pps.begin();
+  C_Polyhedron phj = j->pointset();
+  print_constraints(phj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an octagonal shape.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x == 0);
+  os.add_constraint(x + y <= 3);
+  os.add_constraint(y >= 1);
+
+  Pointset_Powerset<TBD_Shape> pps(os);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x == 0);
+  known_pps.add_constraint(y >= 1);
+  known_pps.add_constraint(y <= 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from an empty octagonal shape.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(os);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of octagonal shapes.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBD_Shape> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_bds = pps.begin();
+  TBD_Shape bdsi = i_bds->pointset();
+  print_constraints(bdsi, "*** bdsi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from an octagonal shape.
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  TOctagonal_Shape os(4);
+  os.add_constraint(x >= 2);
+  os.add_constraint(x + y <= 4);
+  os.add_constraint(z == 1);
+
+  Pointset_Powerset<TOctagonal_Shape> pps1(os);
+  Pointset_Powerset<TOctagonal_Shape> pps2(4, EMPTY);
+  pps2.add_disjunct(os);
+
+  bool ok = (pps1 == pps2);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps1.begin();
+  TOctagonal_Shape osi = i->pointset();
+  print_constraints(osi, "*** osi ***");
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i2 = pps2.begin();
+  TOctagonal_Shape osi2 = i2->pointset();
+  print_constraints(osi2, "*** osi2 ***");
+
+  return ok && pps1.OK();
+}
+
+// Constructs the powerset of octagonal_shapes from an empty octagonal shape.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(os);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of
+// octagonal_shapes.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y <= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator j = pps.begin();
+  TOctagonal_Shape osj = j->pointset();
+  print_constraints(osj, "*** pps disjunct ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an octagonal shape.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x >= 0);
+  os.add_constraint(x + y <= 4);
+  os.add_constraint(x - y == 3);
+  os.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<TBox> pps(os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x >= 3);
+  known_pps.add_constraint(2*x <= 7);
+  known_pps.add_constraint(y >= 0);
+  known_pps.add_constraint(2*y <= 1);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i = pps.begin();
+  TBox phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from an empty octagonal shape.
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(os);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of octagonal shapes.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TBox> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<TBox>::const_iterator i_box = pps.begin();
+  TBox boxi = i_box->pointset();
+  print_constraints(boxi, "*** boxi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an octagonal shape.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2);
+  os.add_constraint(x >= 0);
+  os.add_constraint(x + y <= 4);
+  os.add_constraint(x - y == 3);
+  os.add_constraint(y >= 0);
+
+  // Complexity should be ignored.
+  Pointset_Powerset<Grid> pps(os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x - y == 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid phi = i->pointset();
+  print_congruences(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from an empty octagonal shape.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+
+  TOctagonal_Shape os(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(os);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of octagonal shapes.
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(x >= 1);
+  cs.insert(x - y <= 1);
+  cs.insert(y <= 0);
+  TOctagonal_Shape os(cs);
+
+  // The complexity should be ignored.
+  Pointset_Powerset<TOctagonal_Shape> pps_os(os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_os = pps_os.begin();
+  TOctagonal_Shape osi = i_os->pointset();
+  print_constraints(osi, "*** osi ***");
+
+  // The complexity should be ignored.
+  Pointset_Powerset<Grid> pps(pps_os, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(2);
+  known_pps.add_constraint(x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<Grid>::const_iterator i_gr = pps.begin();
+  Grid gri = i_gr->pointset();
+  print_congruences(gri, "*** gri ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+END_MAIN
diff --git a/tests/Powerset/frompolyhedron1.cc b/tests/Powerset/frompolyhedron1.cc
new file mode 100644
index 0000000..e663f0a
--- /dev/null
+++ b/tests/Powerset/frompolyhedron1.cc
@@ -0,0 +1,741 @@
+/* Test Pointset_Powerset<PH>::Pointset_Powerset(C_Polyhedron),
+        Pointset_Powerset<PH>::Pointset_Powerset(NNC_Polyhedron).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Constructs the powerset of polyhedra from an empty polyhedron.
+bool
+test01() {
+  C_Polyhedron c_ph(0, EMPTY);
+  Pointset_Powerset<C_Polyhedron> c_ps(c_ph);
+
+  bool ok = (c_ps.OK() && c_ps.is_empty() && c_ps.space_dimension() == 0);
+
+  NNC_Polyhedron nnc_ph(0, EMPTY);
+  Pointset_Powerset<NNC_Polyhedron> nnc_ps(nnc_ph);
+
+  ok = ok
+    && (nnc_ps.OK() && nnc_ps.is_empty() && nnc_ps.space_dimension() == 0);
+
+  return ok;
+}
+
+// Constructs the powerset of polyhedra from a closed polyhedron.
+bool
+test02() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron c_ph(4);
+  c_ph.add_constraint(x <= 2);
+  c_ph.add_constraint(z == 1);
+  NNC_Polyhedron nnc_ph(c_ph);
+
+  Pointset_Powerset<C_Polyhedron> c_pps1(c_ph);
+  Pointset_Powerset<C_Polyhedron> c_pps2(4, EMPTY);
+  c_pps2.add_disjunct(c_ph);
+
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps1(c_ph);
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps2(4, EMPTY);
+  nnc_pps2.add_disjunct(nnc_ph);
+
+  bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_pps1.begin();
+  C_Polyhedron c_phi = c_i->pointset();
+  print_constraints(c_phi, "*** c_phi ***");
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_pps1.begin();
+  NNC_Polyhedron nnc_phi = nnc_i->pointset();
+  print_constraints(nnc_phi, "*** nnc_phi ***");
+
+  return ok && c_pps1.OK() && nnc_pps1.OK();
+}
+
+// Constructs the powerset of polyhedra from an nnc polyhedron.
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  NNC_Polyhedron nnc_ph(4);
+  nnc_ph.add_constraint(x <= 2);
+  nnc_ph.add_constraint(z == 1);
+  C_Polyhedron c_ph(nnc_ph);
+
+  Pointset_Powerset<C_Polyhedron> c_pps1(nnc_ph);
+  Pointset_Powerset<C_Polyhedron> c_pps2(4, EMPTY);
+  c_pps2.add_disjunct(c_ph);
+
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps1(nnc_ph);
+  Pointset_Powerset<NNC_Polyhedron> nnc_pps2(4, EMPTY);
+  nnc_pps2.add_disjunct(nnc_ph);
+
+  bool ok = (c_pps1 == c_pps2 && nnc_pps1 == nnc_pps2);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator c_i = c_pps1.begin();
+  C_Polyhedron c_phi = c_i->pointset();
+  print_constraints(c_phi, "*** c_phi ***");
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator nnc_i = nnc_pps1.begin();
+  NNC_Polyhedron nnc_phi = nnc_i->pointset();
+  print_constraints(nnc_phi, "*** nnc_phi ***");
+
+  return ok && c_pps1.OK() && nnc_pps1.OK();
+}
+
+// Constructs the powerset of nnc polyhedra from a powerset of
+// closed polyhedra.
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+
+  C_Polyhedron ph(2);
+  ph.add_constraint(2*x == 1);
+  ph.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps_c(ph);
+
+  Pointset_Powerset<NNC_Polyhedron> pps(pps_c);
+
+  Pointset_Powerset<NNC_Polyhedron> known_pps(2);
+
+  known_pps.add_constraint(2*x == 1);
+  known_pps.add_constraint(y >= 0);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+  NNC_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Constructs the powerset of nnc polyhedra from a powerset of
+// closed polyhedra.
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+
+  Pointset_Powerset<C_Polyhedron> pps(2);
+
+  pps.add_constraint(x >= 1);
+  pps.add_constraint(x <= 1);
+  pps.add_constraint(y >= 0);
+
+  Pointset_Powerset<C_Polyhedron> pps1(pps, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i1 = pps.begin();
+  C_Polyhedron phi1 = i1->pointset();
+  print_constraints(phi1, "*** phi1 ***");
+
+  pps.OK();
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  phi.OK();
+  print_constraints(phi, "*** phi after ok check ***");
+
+  bool ok = true;
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a polyhedron.
+bool
+test06() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 3);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the implied equalities 4*x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<TBD_Shape> pps(ph);
+  Pointset_Powerset<TBD_Shape>::const_iterator i = pps.begin();
+  TBD_Shape bdsi = i->pointset();
+
+  BD_Shape<mpq_class> known_bdsi(4);
+  known_bdsi.add_constraint(3*x == 2);
+  known_bdsi.add_constraint(z == 1);
+
+  bool ok = check_result(bdsi, known_bdsi, "5.97e-8", "3.15e-8", "1.99e-8");
+
+  print_constraints(bdsi, "*** bdsi ***");
+  print_constraints(known_bdsi, "*** known_bdsi ***");
+
+  // With the polynomial complexity, implied equalities are not found.
+  Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->pointset();
+
+  BD_Shape<mpq_class> known_bdsi1(4);
+  known_bdsi1.add_constraint(3*x >= 2);
+  known_bdsi1.add_constraint(z >= 1);
+
+  ok = check_result(bdsi1, known_bdsi1, "3.98e-8", "3.98e-8", "3.98e-8") && ok;
+
+  print_constraints(bdsi1, "*** bdsi1 ***");
+  print_constraints(known_bdsi1, "*** known_bds1i ***");
+
+  ok = ok && pps.OK() && pps1.OK();
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i_ok = pps.begin();
+  TBD_Shape bdsi_ok = i_ok->pointset();
+  Pointset_Powerset<TBD_Shape>::const_iterator i1_ok = pps1.begin();
+  TBD_Shape bdsi1_ok = i1_ok->pointset();
+
+  print_constraints(bdsi_ok, "*** bdsi after OK() ***");
+  print_constraints(bdsi1_ok, "*** bdsi1 after OK() ***");
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 2);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<TBD_Shape> pps(ph);
+  // With the polynomial complexity, the built powerset is non-empty.
+  Pointset_Powerset<TBD_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  BD_Shape<mpq_class> known_bds1(4);
+  known_bds1.add_constraint(3*x >= 2);
+  known_bds1.add_constraint(z >= 1);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->pointset();
+
+  bool ok = check_result(bdsi1, known_bds1, "1.92e-7", "8.89e-8", "7.95e-8")
+    && pps.is_empty();
+
+  print_constraints(bdsi1, "*** bdsi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of bd shapes from an empty polyhedron.
+bool
+test08() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<TBD_Shape> pps(ph);
+
+  Pointset_Powerset<TBD_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of bd shapes from a powerset of polyhedra.
+bool
+test09() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<TBD_Shape> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TBD_Shape> pps2(pps2_c);
+
+  Pointset_Powerset<TBD_Shape> known_pps1(2);
+  known_pps1.add_constraint(2*x >= 1);
+  known_pps1.add_constraint(y >= 0);
+  Pointset_Powerset<TBD_Shape> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i1 = pps1.begin();
+  TBD_Shape bdsi1 = i1->pointset();
+  print_constraints(bdsi1, "*** bdsi1 ***");
+
+  Pointset_Powerset<TBD_Shape>::const_iterator i2 = pps2.begin();
+  TBD_Shape bdsi2 = i2->pointset();
+  print_constraints(bdsi2, "*** bdsi2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a polyhedron.
+bool
+test10() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 3);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the implied equalities 4*x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<TOctagonal_Shape> pps(ph);
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i = pps.begin();
+  TOctagonal_Shape osi = i->pointset();
+
+  Octagonal_Shape<mpq_class> known_osi(4);
+  known_osi.add_constraint(3*x == 2);
+  known_osi.add_constraint(z == 1);
+
+  bool ok = check_result(osi, known_osi, "1.193e-7", "5.45e-8", "3.98e-8");
+
+  print_constraints(osi, "*** osi ***");
+  print_constraints(known_osi, "*** known_osi ***");
+
+  // With the polynomial complexity, implied equalities are not found.
+  Pointset_Powerset<TOctagonal_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+  TOctagonal_Shape osi1 = i1->pointset();
+
+  Octagonal_Shape<mpq_class> known_osi1(4);
+  known_osi1.add_constraint(3*x >= 2);
+  known_osi1.add_constraint(z >= 1);
+
+  ok = check_result(osi1, known_osi1, "1.193e-7", "8.89e-8", "7.95e-8") && ok;
+
+  print_constraints(osi1, "*** osi1 ***");
+  print_constraints(known_osi1, "*** known_osi1 ***");
+
+  ok = ok && pps.OK() && pps1.OK();
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i_ok = pps.begin();
+  TOctagonal_Shape osi_ok = i_ok->pointset();
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1_ok = pps1.begin();
+  TOctagonal_Shape osi1_ok = i1_ok->pointset();
+
+  print_constraints(osi_ok, "*** osi after OK() ***");
+  print_constraints(osi1_ok, "*** osi1 after OK() ***");
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a polyhedron whose
+// constraints are inconsistent (i.e., is empty but not marked as
+// empty).
+bool
+test11() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(3*x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(3*x + z <= 2);
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<TOctagonal_Shape> pps(ph);
+  // With the polynomial complexity, the built powerset is non-empty.
+  Pointset_Powerset<TOctagonal_Shape> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Octagonal_Shape<mpq_class> known_os1(4);
+  known_os1.add_constraint(3*x >= 2);
+  known_os1.add_constraint(z >= 1);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+  TOctagonal_Shape osi1 = i1->pointset();
+
+  bool ok = check_result(osi1, known_os1, "1.92e-7", "8.89e-8", "7.95e-8")
+    && pps.is_empty();
+
+  print_constraints(osi1, "*** osi1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of octagonal_shapes from an empty polyhedron.
+bool
+test12() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<TOctagonal_Shape> pps(ph);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of octagonal_shapes from a powerset of polyhedra.
+bool
+test13() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<TOctagonal_Shape> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TOctagonal_Shape> pps2(pps2_c);
+
+  Pointset_Powerset<TOctagonal_Shape> known_pps1(2);
+  known_pps1.add_constraint(2*x >= 1);
+  known_pps1.add_constraint(y >= 0);
+  Pointset_Powerset<TOctagonal_Shape> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i1 = pps1.begin();
+  TOctagonal_Shape osi1 = i1->pointset();
+  print_constraints(osi1, "*** osi1 ***");
+
+  Pointset_Powerset<TOctagonal_Shape>::const_iterator i2 = pps2.begin();
+  TOctagonal_Shape osi2 = i2->pointset();
+  print_constraints(osi2, "*** osi2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a polyhedron.
+bool
+test14() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(y >= 5);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + y + z <= 8);
+
+  C_Polyhedron ph1(ph);
+
+  // With both the default and polynomial complexities,
+  // the implied equalities x = 2, y = 5 and z = 1 are found.
+  Pointset_Powerset<TBox> pps(ph);
+  Pointset_Powerset<TBox> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(4);
+  known_pps.add_constraint(x == 2);
+  known_pps.add_constraint(y == 5);
+  known_pps.add_constraint(z == 1);
+
+  bool ok = (pps == known_pps && pps1 == known_pps);
+
+  if (pps.size() > 0)
+    print_constraints(pps.begin()->pointset(), "*** box ***");
+
+  if (pps1.size() > 0)
+    print_constraints(pps1.begin()->pointset(), "*** box1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of boxes from a polyhedron whose constraints
+// are inconsistent (i.e., is empty but not marked as empty).
+bool
+test15() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(y >= 5);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + y + z <= 7);
+
+  C_Polyhedron ph1(ph);
+
+  // With both the default and polynomial complexity,
+  // the built powerset is detected to be empty.
+  Pointset_Powerset<TBox> pps(ph);
+  Pointset_Powerset<TBox> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<TBox> known_pps(4, EMPTY);
+
+  bool ok = (pps == known_pps && pps1 == known_pps);
+
+  // These will print something only if test is going to fail.
+  if (pps.size() > 0)
+    print_constraints(pps.begin()->pointset(), "*** box ***");
+  if (pps1.size() > 0)
+    print_constraints(pps1.begin()->pointset(), "*** box1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of boxes from an empty polyhedron.
+bool
+test16() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<TBox> pps(ph);
+
+  Pointset_Powerset<TBox> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of boxes from a powerset of polyhedra.
+bool
+test17() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<TBox> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<TBox> pps2(pps2_c);
+
+  Pointset_Powerset<TBox> known_pps(2);
+  known_pps.add_constraint(2*x == 1);
+  known_pps.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps && pps2 == known_pps);
+
+  if (pps1.size() > 0)
+    print_constraints(pps1.begin()->pointset(), "*** box1 ***");
+  if (pps2.size() > 0)
+    print_constraints(pps2.begin()->pointset(), "*** box2 ***");
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a polyhedron.
+bool
+test18() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + z <= 3);
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x >= 2);
+  ph1.add_constraint(z >= 1);
+  ph1.add_constraint(x + z <= 3);
+
+  // With the default complexity, the implied equalities x = 2 and z = 1.
+  // are found
+  Pointset_Powerset<Grid> pps(ph);
+  // With the polynomial complexity, no implied equalities are found.
+  Pointset_Powerset<Grid> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(4);
+  known_pps.add_congruence((x %= 2) / 0);
+  known_pps.add_congruence((z %= 1) / 0);
+  Pointset_Powerset<Grid> known_pps1(4);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<Grid>::const_iterator i = pps.begin();
+  Grid gri = i->pointset();
+  print_congruences(gri, "*** gri ***");
+  Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+  Grid gri1 = i1->pointset();
+  print_congruences(gri1, "*** gri1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of grids from a polyhedron whose constraints
+// are inconsistent (i.e., is empty but not marked as empty).
+bool
+test19() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph(4);
+  ph.add_constraint(x >= 2);
+  ph.add_constraint(z >= 1);
+  ph.add_constraint(x + z <= 2);
+
+  C_Polyhedron ph1(ph);
+
+  // With the default complexity, the built powerset is empty.
+  Pointset_Powerset<Grid> pps(ph);
+  // With the polynomial complexity, the built powerset is the universe.
+  Pointset_Powerset<Grid> pps1(ph1, POLYNOMIAL_COMPLEXITY);
+
+  Pointset_Powerset<Grid> known_pps(4, EMPTY);
+  Pointset_Powerset<Grid> known_pps1(4);
+
+  bool ok = (pps == known_pps && pps1 == known_pps1);
+
+  Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+  Grid gri1 = i1->pointset();
+  print_congruences(gri1, "*** gri1 ***");
+
+  return ok && pps.OK() && pps1.OK();
+}
+
+// Constructs the powerset of grids from an empty polyhedron.
+bool
+test20() {
+  Variable x(0);
+  Variable y(1);
+
+  NNC_Polyhedron ph(2, EMPTY);
+
+  Pointset_Powerset<Grid> pps(ph);
+
+  Pointset_Powerset<Grid> known_pps(2, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Constructs the powerset of grids from a powerset of polyhedra.
+bool
+test21() {
+  Variable x(0);
+  Variable y(1);
+
+  Constraint_System cs;
+  cs.insert(2*x >= 1);
+  cs.insert(2*x + y <= 1);
+  cs.insert(y >= 0);
+  C_Polyhedron ph1(cs);
+  C_Polyhedron ph2(cs);
+
+  Pointset_Powerset<C_Polyhedron> pps1_c(ph1, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<C_Polyhedron> pps2_c(ph2);
+
+  Pointset_Powerset<Grid> pps1(pps1_c, POLYNOMIAL_COMPLEXITY);
+  Pointset_Powerset<Grid> pps2(pps2_c);
+
+  Pointset_Powerset<Grid> known_pps1(2);
+  Pointset_Powerset<Grid> known_pps2(2);
+  known_pps2.add_constraint(2*x == 1);
+  known_pps2.add_constraint(y == 0);
+
+  bool ok = (pps1 == known_pps1 && pps2 == known_pps2);
+
+  Pointset_Powerset<Grid>::const_iterator i1 = pps1.begin();
+  Grid gri1 = i1->pointset();
+  print_congruences(gri1, "*** gri1 ***");
+
+  Pointset_Powerset<Grid>::const_iterator i2 = pps2.begin();
+  Grid gri2 = i2->pointset();
+  print_congruences(gri2, "*** gri2 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+  DO_TEST(test11);
+  DO_TEST(test12);
+  DO_TEST(test13);
+  DO_TEST(test14);
+  DO_TEST(test15);
+  DO_TEST(test16);
+  DO_TEST(test17);
+  DO_TEST(test18);
+  DO_TEST(test19);
+  DO_TEST(test20);
+  DO_TEST(test21);
+END_MAIN
diff --git a/tests/Powerset/fromspacedimension1.cc b/tests/Powerset/fromspacedimension1.cc
new file mode 100644
index 0000000..08656cc
--- /dev/null
+++ b/tests/Powerset/fromspacedimension1.cc
@@ -0,0 +1,102 @@
+/* Test Pointset_Powerset<PH>::
+          Pointset_Powerset(dimension_type, Degenerate_Element).
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+  bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 0);
+
+  return ok;
+}
+
+bool
+test02() {
+  Pointset_Powerset<C_Polyhedron> ps(0, UNIVERSE);
+
+  bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 0);
+
+  return ok;
+}
+
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  bool ok = (ps.OK() && ps.is_empty() && ps.space_dimension() == 4);
+
+  return ok;
+}
+
+bool
+test04() {
+  Pointset_Powerset<C_Polyhedron> ps(4, UNIVERSE);
+
+  bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 4);
+
+  return ok;
+}
+
+bool
+test05() {
+  Pointset_Powerset<C_Polyhedron> ps(4);
+
+  bool ok = (ps.OK() && ps.is_universe() && ps.space_dimension() == 4);
+
+  return ok;
+}
+
+// Construct powerset from zero dimension empty constraint system.
+bool
+test06() {
+  Constraint_System cs = Constraint_System::zero_dim_empty();
+  Pointset_Powerset<TBox> ps(cs);
+
+  print_constraints(ps, "*** ps ***");
+
+  return ps.OK();
+}
+
+bool
+test07() {
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  bool ok = (pps_box.space_dimension() == 1);
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+END_MAIN
diff --git a/tests/Powerset/intersection1.cc b/tests/Powerset/intersection1.cc
new file mode 100644
index 0000000..fff3652
--- /dev/null
+++ b/tests/Powerset/intersection1.cc
@@ -0,0 +1,106 @@
+/* Test Pointset_Powerset<PH>::intersection_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: intersection_assign().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.intersection_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = c_ps_expected.definitely_entails(c_ps);
+
+  return ok && ok1 && c_ps.OK() && c_ps1.OK();
+}
+
+// Powerset of C polyhedra: intersection_assign().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+
+  c_ps.intersection_assign(c_ps1);
+  bool ok = !c_ps.empty();
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok1 = c_ps.definitely_entails(c_ps_expected);
+  bool ok2 = c_ps_expected.definitely_entails(c_ps);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  cs.clear();
+  cs.insert(x == 4);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  c_ps2.intersection_assign(c_ps1);
+  bool ok3 = c_ps2.empty();
+
+  return ok && ok1 && ok2 && ok3 && c_ps.OK() && c_ps1.OK() && c_ps2.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/maxmin1.cc b/tests/Powerset/maxmin1.cc
new file mode 100644
index 0000000..a08d224
--- /dev/null
+++ b/tests/Powerset/maxmin1.cc
@@ -0,0 +1,400 @@
+/* Test Pointset_Powerset<PH>::maximize().
+        Pointset_Powerset<PH>::minimize().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: maximize().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Linear_Expression LE;
+  bool ok = !ps.maximize(LE, num, den, included)
+    && num == 0 && den == 0 && !included;
+  ok = ok && !ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool ok1 = ps.maximize(LE, num, den, included)
+    && num == 0 && den == 1 && included;
+  ok1 = ok1 && ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "maximum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok1;
+}
+
+// Powerset of NNC polyhedra: maximize().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Linear_Expression LE = x;
+
+  Coefficient max_n = 0;
+  Coefficient max_d = 0;
+  bool max_included = false;
+  Generator max_g(point());
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(x < 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool ok = ps.maximize(LE, max_n, max_d, max_included)
+    && max_n == 14 && max_d == 1 && !max_included;
+  ok = ok && ps.maximize(LE, max_n, max_d, max_included, max_g)
+    && max_n == 14 && max_d == 1 && !max_included
+    && max_g.is_closure_point()
+    && max_g.divisor() == 1;
+
+  nout << max_n << "/" << max_d;
+  nout << " @ ";
+  print_generator(max_g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(x <= 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  ok = ps.maximize(LE, max_n, max_d, max_included)
+    && max_n == 14 && max_d == 1 && max_included;
+  ok = ok && ps.maximize(LE, max_n, max_d, max_included, max_g)
+    && max_n == 14 && max_d == 1 && max_included
+    && max_g.is_point()
+    && max_g.divisor() == 1;
+
+  nout << max_n << "/" << max_d;
+  nout << " @ ";
+  print_generator(max_g);
+  nout << endl;
+
+  return ok;
+}
+
+// Powerset of C polyhedra: maximize().
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Constraint_System cs;
+  Linear_Expression LE = 9*x + y;
+
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(3*x <= 14);
+  cs.insert(y >= 5);
+  cs.insert(11*y <= 87);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = ps.maximize(LE, num, den, included)
+    && num == 549 && den == 11 && included;
+  ok = ok && ps.maximize(LE, num, den, included, g)
+    && num == 549 && den == 11 && included
+    && g.is_point()
+    && g.divisor() == 33;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(x - 3*y >= 5);
+  cs.insert(x <= 28);
+  cs.insert(y >= 5);
+  cs.insert(4*y <= 85);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  ok = ps.maximize(LE, num, den, included)
+    && num == 779 && den == 3 && included;
+  ok = ok && ps.maximize(LE, num, den, included, g)
+    && num == 779 && den == 3 && included
+    && g.is_point()
+    && g.divisor() == 3;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+// Powerset of C polyhedra: maximize().
+bool
+test04() {
+  Variable x(0);
+  Linear_Expression LE = x;
+
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  bool ok = !ps.maximize(LE, num, den, included)
+    && num == 0 && den == 0 && !included;
+  ok = ok && !ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(1));
+  ok = !ps.maximize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  return ok;
+}
+
+// Powerset of C polyhedra: minimize().
+bool
+test05() {
+  Linear_Expression LE;
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+
+  bool ok = !ps.minimize(LE, num, den, included)
+    && num == 0 && den == 0 && !included;
+  ok = ok && !ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(0));
+  ok = ps.minimize(LE, num, den, included)
+    && num == 0 && den == 1 && included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << (included ? "minimum" : "supremum") << " = " << num;
+  if (den != 1)
+    nout << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+// Powerset of NNC polyhedra: minimize().
+bool
+test06() {
+  Variable x(0);
+  Constraint_System cs;
+  Linear_Expression LE = x;
+
+  Coefficient min_n = 0;
+  Coefficient min_d = 0;
+  bool min_included = false;
+  Generator min_g(point());
+
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(2*x > 3);
+  cs.insert(x < 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool ok = ps.minimize(LE, min_n, min_d, min_included)
+    && min_n == 3 && min_d == 2 && !min_included;
+  ok = ok && ps.minimize(LE, min_n, min_d, min_included, min_g)
+    && min_n == 3 && min_d == 2 && !min_included
+    && min_g.is_closure_point()
+    && min_g.divisor() == 2;
+
+  nout << min_n << "/" << min_d;
+  nout << " @ ";
+  print_generator(min_g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(2*x >= 3);
+  cs.insert(x < 14);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  ok = ps.minimize(LE, min_n, min_d, min_included)
+    && min_n == 3 && min_d == 2 && min_included;
+  ok = ok && ps.minimize(LE, min_n, min_d, min_included, min_g)
+    && min_n == 3 && min_d == 2 && min_included
+    && min_g.is_point()
+    && min_g.divisor() == 2;
+
+  nout << min_n << "/" << min_d;
+  nout << " @ ";
+  print_generator(min_g);
+  nout << endl;
+
+  return ok;
+}
+
+// Powerset of C polyhedra: minimize().
+bool
+test07() {
+  Variable x(0);
+  Variable y(1);
+  Constraint_System cs;
+  Linear_Expression LE = x + y;
+
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 3);
+  cs.insert(x <= 4);
+  cs.insert(y >= 5);
+  cs.insert(y <= 8);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = ps.minimize(LE, num, den, included)
+    && num == 8 && den == 1 && included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 8 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  if (!ok)
+    return false;
+
+  cs.clear();
+  cs.insert(x - y >= 1);
+  cs.insert(x <= 8);
+  cs.insert(y >= 2);
+  cs.insert(y <= 10);
+  ps.add_disjunct(C_Polyhedron(cs));
+
+  ok = ps.minimize(LE, num, den, included)
+    && num == 5 && den == 1 && included;
+  ok = ok && ps.minimize(LE, num, den, included, g)
+    && num == 5 && den == 1 && included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  nout << num << "/" << den;
+  nout << " @ ";
+  print_generator(g);
+  nout << endl;
+
+  return ok;
+}
+
+// Powerset of C polyhedra: minimize().
+bool
+test08() {
+  Variable x(0);
+  Linear_Expression LE = x;
+
+  Coefficient num = 0;
+  Coefficient den = 0;
+  bool included = false;
+  Generator g(point());
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  bool ok = !ps.minimize(LE, num, den, included)
+    && num == 0 && den == 0 && !included;
+  ok = ok && !ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  if (!ok)
+    return false;
+
+  ps.add_disjunct(C_Polyhedron(1));
+  ok = !ps.minimize(LE, num, den, included, g)
+    && num == 0 && den == 0 && !included
+    && g.is_point()
+    && g.divisor() == 1;
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST_F8(test02);
+  DO_TEST_F8(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST_F8(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+END_MAIN
diff --git a/tests/Powerset/meet1.cc b/tests/Powerset/meet1.cc
new file mode 100644
index 0000000..981cf70
--- /dev/null
+++ b/tests/Powerset/meet1.cc
@@ -0,0 +1,95 @@
+/* Test Pointset_Powerset<PH>::meet_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: meet_assign().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  c_ps.meet_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<C_Polyhedron> c_ps_expected(1, EMPTY);
+  c_ps_expected.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps_expected);
+  bool ok1 = !c_ps_expected.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: meet_assign().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  pps_box.meet_assign(pps_box1);
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 2);
+  Pointset_Powerset<TBox> pps_box_expected(1, EMPTY);
+  pps_box_expected.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box_expected);
+  bool ok1 = !pps_box_expected.definitely_entails(pps_box);
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/membytes1.cc b/tests/Powerset/membytes1.cc
new file mode 100644
index 0000000..ea127ef
--- /dev/null
+++ b/tests/Powerset/membytes1.cc
@@ -0,0 +1,69 @@
+/* Test Pointset_Powerset<PH>::total_memory_in_bytes().
+        Pointset_Powerset<PH>::external_memory_in_bytes().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: total_memory_in_bytes() and
+// external_memory_in_bytes().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+
+  bool ok = c_ps.is_bottom();
+
+  c_ps.add_disjunct(C_Polyhedron(1, UNIVERSE));
+
+  bool ok1 = c_ps.is_top();
+
+  c_ps.total_memory_in_bytes();
+  c_ps.external_memory_in_bytes();
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: total_memory_in_bytes() and external_memory_in_bytes().
+bool
+test02() {
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+
+  bool ok = pps_box.is_bottom();
+
+  pps_box.add_disjunct(TBox(1, UNIVERSE));
+
+  bool ok1 = pps_box.is_top();
+
+  pps_box.total_memory_in_bytes();
+  pps_box.external_memory_in_bytes();
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/powerset1.cc b/tests/Powerset/powerset1.cc
new file mode 100644
index 0000000..215bd3a
--- /dev/null
+++ b/tests/Powerset/powerset1.cc
@@ -0,0 +1,178 @@
+/* Test Powerset<D>.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Uses every public Powerset method.
+bool
+test01() {
+  typedef Powerset<FCAIBVP> PSET;
+
+  Variable A(0);
+
+  PSET ps1;
+  ps1.add_disjunct(FCAIBVP(A));
+
+  PSET ps2 = ps1;
+
+  if (ps2 != ps1 || !(ps2 == ps1))
+    return false;
+
+  using IO_Operators::operator<<;
+  nout << "ps1:" << endl << ps1 << endl;
+
+  FCAIBVP d(A);
+  PSET ps3(d);
+
+  if (!ps1.definitely_entails(ps3))
+    return false;
+
+  if (ps3.is_top())
+    return false;
+
+  if (ps1.is_bottom())
+    return false;
+
+  nout << "Total memory: " << ps3.total_memory_in_bytes() << endl
+       << "External memory: " << ps3.external_memory_in_bytes() << endl;
+
+  ps3.omega_reduce();
+
+  if (ps3.size() == 0)
+    return false;
+
+  if (ps3.empty())
+    return false;
+
+  // Iterator.
+  dimension_type count = 0;
+  for (PSET::iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  // Constant iterator.
+  count = 0;
+  for (PSET::const_iterator i = ps3.begin(); i != ps3.end(); ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  // Reverse iterator.
+  count = 0;
+  for (PSET::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  // Constant reverse iterator.
+  count = 0;
+  for (PSET::const_reverse_iterator i = ps3.rbegin(),
+         ps3_rend = ps3.rend(); i != ps3_rend; ++i)
+    ++count;
+  if (count != 1)
+    return false;
+
+  ps2 = ps3;
+  PSET ps_empty;
+  ps2.drop_disjunct(ps2.begin());
+  if (ps2 != ps_empty)
+    return false;
+
+  ps2 = ps3;
+  ps2.drop_disjuncts(ps2.begin(),ps2.end());
+  if (ps2 != ps_empty)
+    return false;
+
+  ps2 = ps3;
+  ps2.clear();
+  if (ps2 != ps_empty)
+    return false;
+
+  swap(ps3, ps2);
+  swap(ps3, ps2);
+  if (ps3 != ps1 || ps2 != ps_empty)
+    return false;
+
+  ps2 = ps_empty;
+  ps2.least_upper_bound_assign(ps3);
+  if (ps2 != ps3)
+    return false;
+
+  ps2 = ps_empty;
+  ps2.upper_bound_assign(ps3);
+  if (ps2 != ps3)
+    return false;
+
+  Variable B(1);
+  ps2 = ps1;
+  ps2.meet_assign(ps3);
+  if (ps2 != ps3)
+    return false;
+
+  ps3.collapse();
+  if (ps3.size() != 1)
+    return false;
+
+  return true;
+}
+
+bool
+test02() {
+  Variable X(0);
+  Variable Y(1);
+
+  FCAIBVP XY(X);
+  XY.meet_assign(FCAIBVP(Y));
+
+  Powerset<FCAIBVP> ps;
+
+  ps.add_disjunct(FCAIBVP(X));
+  ps.add_disjunct(XY);
+  return ps.OK();
+}
+
+bool
+test03() {
+  Variable X(0);
+  Variable Y(1);
+
+  FCAIBVP XY(X);
+  XY.meet_assign(FCAIBVP(Y));
+
+  Powerset<FCAIBVP> ps;
+
+  ps.add_disjunct(XY);
+  ps.add_disjunct(FCAIBVP(X));
+  return ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+END_MAIN
diff --git a/tests/Powerset/reduce1.cc b/tests/Powerset/reduce1.cc
new file mode 100644
index 0000000..b424eea
--- /dev/null
+++ b/tests/Powerset/reduce1.cc
@@ -0,0 +1,81 @@
+/* Test Pointset_Powerset<PH>::omega_reduce().
+        Pointset_Powerset<PH>::pairwise_reduce().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of polyhedra: omega_reduce().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+  c_ps.omega_reduce();
+
+  bool ok = (c_ps.size() == 1);
+
+  return ok;
+}
+
+// Powerset of boxes: omega_reduce().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+  pps_box.omega_reduce();
+
+  bool ok = (pps_box.size() == 1);
+
+  return ok;
+}
+
+/* test07() in difference1.cc includes a use of pairwise_reduce
+   for C polyhedra. */
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/refinewith1.cc b/tests/Powerset/refinewith1.cc
new file mode 100644
index 0000000..db886be
--- /dev/null
+++ b/tests/Powerset/refinewith1.cc
@@ -0,0 +1,225 @@
+/* Test Pointset_Powerset<PH>::refine_with_constraint().
+        Pointset_Powerset<PH>::refine_with_constraints().
+        Pointset_Powerset<PH>::refine_with_congruence().
+        Pointset_Powerset<PH>::refine_with_congruences().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: refine_with_constraint(), refine_with_congruence().
+bool
+test01() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(B >= 0);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  ph2.add_constraint(B >= 2);
+  Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(pps);
+
+  pps.refine_with_constraint(C == 0);
+  pps.refine_with_constraint(D < 0);
+  pps.refine_with_congruence(B + D %= 2);
+  pps.refine_with_congruence((B - D %= 2) / 0);
+
+
+  known_pps.add_constraint(C == 0);
+  known_pps.add_constraint(A <= 2);
+  known_pps.add_constraint(B <= 2);
+  known_pps.add_constraint(B - D == 2);
+
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+  i++;
+  C_Polyhedron phi1 = i->pointset();
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok;
+}
+
+// Powerset of C polyhedra: refine_with_constraints(),
+// refine_with_congruences().
+bool
+test02() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(pps);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B >= 0);
+  cs.insert(B - C < 3);
+  cs.insert(D == 1);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((C %= 2) / 0);
+
+  pps.refine_with_constraints(cs);
+  pps.refine_with_congruences(cgs);
+
+  known_pps.add_constraint(C == 2);
+  known_pps.add_constraint(D == 1);
+  known_pps.add_constraint(A + 2*B >= 0);
+  known_pps.add_constraint(B - C <= 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<C_Polyhedron>::const_iterator i = pps.begin();
+  C_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+
+  return ok;
+}
+
+// Powerset of C polyhedra: refine_with_constraints(),
+// refine_with_congruences() make the powerset empty.
+bool
+test03() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  Pointset_Powerset<C_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B >= 0);
+  cs.insert(B - C < 3);
+  cs.insert(A > 1);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((B - C %= 4) / 0);
+
+  pps.refine_with_constraints(cs);
+  pps.refine_with_congruences(cgs);
+
+  Pointset_Powerset<C_Polyhedron> known_pps(4, EMPTY);
+
+  bool ok = (pps == known_pps);
+
+  return ok;
+}
+
+// Powerset of NNC polyhedra: refine_with_constraints(),
+// refine_with_congruences().
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Variable C(2);
+  Variable D(3);
+
+  NNC_Polyhedron ph1(4);
+  ph1.add_constraint(A == 1);
+  ph1.add_constraint(C >= 0);
+  ph1.add_constraint(B >= 0);
+
+  NNC_Polyhedron ph2(4);
+  ph2.add_constraint(A <= 2);
+  ph2.add_constraint(B >= 2);
+  Pointset_Powerset<NNC_Polyhedron> pps(4, EMPTY);
+
+  pps.add_disjunct(ph1);
+  pps.add_disjunct(ph2);
+
+  Pointset_Powerset<NNC_Polyhedron> known_pps(pps);
+
+  Constraint_System cs;
+  cs.insert(A + 2*B >= 0);
+  cs.insert(B - C < 3);
+  cs.insert(D == 1);
+
+  Congruence_System cgs;
+  cgs.insert(A + B %= 0);
+  cgs.insert((C %= 2) / 0);
+
+  pps.refine_with_constraints(cs);
+  pps.refine_with_congruences(cgs);
+
+  known_pps.add_constraint(C == 2);
+  known_pps.add_constraint(D == 1);
+  known_pps.add_constraint(A + 2*B >= 0);
+  known_pps.add_constraint(B - C < 3);
+
+  bool ok = (pps == known_pps);
+
+  Pointset_Powerset<NNC_Polyhedron>::const_iterator i = pps.begin();
+  NNC_Polyhedron phi = i->pointset();
+  print_constraints(phi, "*** phi ***");
+  i++;
+  NNC_Polyhedron phi1 = i->pointset();
+  print_constraints(phi1, "*** phi1 ***");
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Powerset/relationwith1.cc b/tests/Powerset/relationwith1.cc
new file mode 100644
index 0000000..d587f85
--- /dev/null
+++ b/tests/Powerset/relationwith1.cc
@@ -0,0 +1,278 @@
+/* Test Pointset_Powerset<PH>::relation_with().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: relation_with().
+bool
+test01() {
+  Variable x(0);
+  Constraint c = (x == 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraint(c);
+  Congruence cg((x %= 0) / 0);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);;
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Congruence cg((x %= 1) / 0);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test03() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Congruence cg((x %= 3) / 4);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test04() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x >= 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Congruence cg((x %= 3) / 4);
+  Poly_Con_Relation rel = ps.relation_with(cg);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test05() {
+  Variable x(0);
+  Constraint c = (x == 0);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  ps.add_disjunct(C_Polyhedron(1));
+  ps.add_constraint(c);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates()
+    && Poly_Con_Relation::is_included();
+
+  bool ok = (rel == known_rel);;
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test06() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Constraint c(x == 1);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::saturates();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test07() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Constraint c(x >= 3);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::is_disjoint();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test08() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x >= 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Constraint c(x >= 3);
+  Poly_Con_Relation rel = ps.relation_with(c);
+
+  Poly_Con_Relation known_rel = Poly_Con_Relation::strictly_intersects();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test09() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x == 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Generator g(point(x));
+  Poly_Gen_Relation rel = ps.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::subsumes();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: relation_with().
+bool
+test10() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Generator g(line(3*x));
+  Poly_Gen_Relation rel = ps.relation_with(g);
+
+  Poly_Gen_Relation known_rel = Poly_Gen_Relation::nothing();
+
+  bool ok = (rel == known_rel);
+
+  return ok && ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+  DO_TEST(test10);
+END_MAIN
diff --git a/tests/Powerset/simplifyusingcontext1.cc b/tests/Powerset/simplifyusingcontext1.cc
new file mode 100644
index 0000000..28af59e
--- /dev/null
+++ b/tests/Powerset/simplifyusingcontext1.cc
@@ -0,0 +1,459 @@
+/* Test Pointset_Powerset::simplify_using_context_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k >= 1);
+  ph.add_constraint(k <= 10);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(k == 0);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  return ok;
+}
+
+bool
+test02() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k >= 1);
+  ph.add_constraint(k <= 10);
+
+  ps1.add_disjunct(ph);
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(k >= 1);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  return ok;
+}
+
+bool
+test03() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i <= 25);
+  ph.add_constraint(j <= 25);
+  ph.add_constraint(i + j >= 25);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+         ps1_end = ps1.end(); it != ps1_end; ++it)
+    print_constraints(it->pointset());
+
+  return ok;
+}
+
+bool
+test04() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i <= 25);
+  ph.add_constraint(j <= 25);
+  ph.add_constraint(i + j >= 25);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 0);
+  ph.add_constraint(i <= 2);
+  ph.add_constraint(j >= 2);
+  ph.add_constraint(j <= 9);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j <= 10);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+         ps1_end = ps1.end(); it != ps1_end; ++it)
+    print_constraints(it->pointset());
+
+  return ok;
+}
+
+bool
+test05() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 1);
+  ph.add_constraint(i <= 10);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 28);
+  ph.add_constraint(i <= 31);
+  ph.add_constraint(j >= 1);
+  ph.add_constraint(j <= 10);
+  ph.add_constraint(k == 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i <= 25);
+  ph.add_constraint(j <= 25);
+  ph.add_constraint(i + j >= 25);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 30);
+  ph.add_constraint(i <= 32);
+  ph.add_constraint(j >= 2);
+  ph.add_constraint(j <= 9);
+  ph.add_constraint(k == 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i >= 28);
+  ph.add_constraint(i <= 31);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+         ps1_end = ps1.end(); it != ps1_end; ++it)
+    print_constraints(it->pointset());
+
+  return ok;
+}
+
+bool
+test06() {
+  Variable i(0);
+  Variable j(1);
+  Variable k(2);
+
+  C_Polyhedron ph(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(3, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(3, EMPTY);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i == 1);
+  ph.add_constraint(j + 1 == 0);
+  ph.add_constraint(k == 3);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(i == 1);
+  ph.add_constraint(j + k == 2);
+  ph.add_constraint(k >= 0);
+  ph.add_constraint(k <= 3);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(3, EMPTY);
+  ph = C_Polyhedron(3, UNIVERSE);
+  ph.add_constraint(k == 3);
+  // ph.add_constraint(j + 1 == 0);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+         ps1_end = ps1.end(); it != ps1_end; ++it)
+    print_constraints(it->pointset());
+
+  return ok;
+}
+
+bool
+test07() {
+  Variable i(0);
+  Variable j(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(i <= j);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(i == j);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, UNIVERSE);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator it = ps1.begin(),
+         ps1_end = ps1.end(); it != ps1_end; ++it)
+    print_constraints(it->pointset());
+
+  return ok;
+}
+
+bool
+test08() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A >= 0);
+
+  ps1.add_disjunct(ph);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A <= 0);
+
+  ps2.add_disjunct(ph);
+
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(B >= 0);
+
+  ps2.add_disjunct(ph);
+
+  Pointset_Powerset<C_Polyhedron> known_result(2, EMPTY);
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A >= 0);
+  known_result.add_disjunct(ph);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i)
+    print_constraints(i->pointset());
+
+  return ok;
+}
+
+bool
+test09() {
+  Variable A(0);
+  Variable B(1);
+
+  C_Polyhedron ph(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps1(2, EMPTY);
+  Pointset_Powerset<C_Polyhedron> ps2(2, EMPTY);
+
+  // Populate ps1 with a single square.
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A >= 10);
+  ph.add_constraint(A <= 40);
+  ph.add_constraint(B >= 10);
+  ph.add_constraint(B <= 40);
+
+  ps1.add_disjunct(ph);
+
+  nout << "Pointset_Powerset to be simplified:\n";
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i) {
+    print_constraints(i->pointset());
+    nout << "\n";
+  }
+
+  // Populate ps2 with four squares intersecting the single square above.
+  ph = C_Polyhedron(2, UNIVERSE);
+  ph.add_constraint(A >= 0);
+  ph.add_constraint(A <= 20);
+  ph.add_constraint(B >= 0);
+  ph.add_constraint(B <= 20);
+
+  ps2.add_disjunct(ph);
+
+  ph.affine_image(B, B + 30);
+  ps2.add_disjunct(ph);
+
+  ph.affine_image(A, A + 30);
+  ps2.add_disjunct(ph);
+
+  ph.affine_image(B, B - 30);
+  ps2.add_disjunct(ph);
+
+  nout << "\nPointset_Powerset to be used as context:\n";
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps2.begin(),
+         iend = ps2.end(); i != iend; ++i) {
+    print_constraints(i->pointset());
+    nout << "\n";
+  }
+
+  Pointset_Powerset<C_Polyhedron> known_result(ps1);
+
+  ps1.simplify_using_context_assign(ps2);
+
+  bool ok = (ps1 == known_result);
+
+  for (Pointset_Powerset<C_Polyhedron>::const_iterator i = ps1.begin(),
+         iend = ps1.end(); i != iend; ++i) {
+    print_constraints(i->pointset());
+    nout << "\n";
+  }
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST_F8A(test05);
+  DO_TEST(test06);
+  DO_TEST(test07);
+  DO_TEST(test08);
+  DO_TEST(test09);
+END_MAIN
diff --git a/tests/Powerset/size1.cc b/tests/Powerset/size1.cc
new file mode 100644
index 0000000..dad4020
--- /dev/null
+++ b/tests/Powerset/size1.cc
@@ -0,0 +1,75 @@
+/* Test Pointset_Powerset<PH>::size().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: size().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = (c_ps.size() == 2);
+
+  return ok;
+}
+
+// Powerset of boxes: size().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+  pps_box.add_disjunct(TBox(cs));
+
+  bool ok = (pps_box.size() == 2);
+
+  return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+END_MAIN
diff --git a/tests/Powerset/spacedims1.cc b/tests/Powerset/spacedims1.cc
new file mode 100644
index 0000000..1bdef39
--- /dev/null
+++ b/tests/Powerset/spacedims1.cc
@@ -0,0 +1,213 @@
+/* Test Pointset_Powerset<PH>::add_space_dimensions(),
+        Pointset_Powerset<PH>::remove_higher_space_dimensions(),
+        Pointset_Powerset<PH>::remove_space_dimensions(),
+        Pointset_Powerset<PH>::expand_space_dimensions(),
+        Pointset_Powerset<PH>::fold_space_dimensions().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: add_space_dimensions_and_embed(),
+// add_space_dimensions_and_project().
+bool
+test01() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  dimension_type m = 2;
+
+  ps.add_space_dimensions_and_embed(m);
+  bool ok = (ps.space_dimension() == 3 && ps.affine_dimension() == 3);
+
+  ps.add_space_dimensions_and_project(m);
+  bool ok1 = (ps.space_dimension() == 5 && ps.affine_dimension() == 3);
+
+  ps.remove_higher_space_dimensions(4);
+  bool ok2 = (ps.space_dimension() == 4 && ps.affine_dimension() == 3);
+
+  Pointset_Powerset<Rational_Box> psb(7, EMPTY);
+  Rational_Box b(7);
+  b.add_constraint(x >= 1);
+  b.add_constraint(x <= 0);
+  psb.add_disjunct(b);
+  bool ok3 = (psb.space_dimension() == 7 && psb.affine_dimension() == 0);
+
+  Pointset_Powerset<Grid> psg(7, EMPTY);
+  Grid g(7);
+  g.add_congruence((x %= 0) / 2);
+  g.add_congruence((x %= 1) / 2);
+  psg.add_disjunct(g);
+  bool ok4 = (psg.space_dimension() == 7 && psg.affine_dimension() == 0);
+
+  return ok && ok1 && ok2 && ok3 && ok4 && ps.OK();
+}
+
+// Powerset of C polyhedra: remove_higher_space_dimensions().
+bool
+test02() {
+  Variable x(0);
+
+  C_Polyhedron ph1(1);
+  ph1.add_constraint(x == 1);
+
+  C_Polyhedron ph2(1);
+  ph2.add_constraint(x <= 2);
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  dimension_type m = 2;
+
+  ps.add_space_dimensions_and_embed(m);
+  bool ok = (ps.space_dimension() == 3 && ps.affine_dimension() == 3);
+
+  ps.add_space_dimensions_and_project(m);
+  bool ok1 = (ps.space_dimension() == 5 && ps.affine_dimension() == 3);
+
+  ps.remove_higher_space_dimensions(4);
+  bool ok2 = (ps.space_dimension() == 4 && ps.affine_dimension() == 3);
+
+  Pointset_Powerset<Rational_Box> psb(7, EMPTY);
+  Rational_Box b(7);
+  b.add_constraint(x >= 1);
+  b.add_constraint(x <= 0);
+  psb.add_disjunct(b);
+  bool ok3 = (psb.space_dimension() == 7 && psb.affine_dimension() == 0);
+
+  Pointset_Powerset<Grid> psg(7, EMPTY);
+  Grid g(7);
+  g.add_congruence((x %= 0) / 2);
+  g.add_congruence((x %= 1) / 2);
+  psg.add_disjunct(g);
+  bool ok4 = (psg.space_dimension() == 7 && psg.affine_dimension() == 0);
+
+  return ok && ok1 && ok2 && ok3 && ok4 && ps.OK();
+}
+
+// Powerset of C polyhedra: remove_space_dimensions().
+bool
+test03() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(z == 1);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(z == 1);
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Variables_Set to_be_removed;
+  to_be_removed.insert(y);
+  to_be_removed.insert(w);
+
+  ps.remove_space_dimensions(to_be_removed);
+  bool ok = (ps.space_dimension() == 2 && ps.affine_dimension() == 1);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: expand_space_dimension().
+bool
+test04() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(z == 1);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(z == 1);
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  ps.expand_space_dimension(y, 2);
+  bool ok = (ps.space_dimension() == 6 && ps.affine_dimension() == 5);
+
+  return ok && ps.OK();
+}
+
+// Powerset of C polyhedra: fold_space_dimensions().
+bool
+test05() {
+  Variable x(0);
+  Variable y(1);
+  Variable z(2);
+  Variable w(3);
+
+  C_Polyhedron ph1(4);
+  ph1.add_constraint(x == 1);
+  ph1.add_constraint(z == 1);
+
+  C_Polyhedron ph2(4);
+  ph2.add_constraint(x <= 2);
+  ph2.add_constraint(z == 1);
+  Pointset_Powerset<C_Polyhedron> ps(4, EMPTY);
+
+  ps.add_disjunct(ph1);
+  ps.add_disjunct(ph2);
+
+  Variables_Set to_be_folded;
+  to_be_folded.insert(y);
+  to_be_folded.insert(w);
+
+  ps.fold_space_dimensions(to_be_folded, z);
+  bool ok = (ps.space_dimension() == 2 && ps.affine_dimension() == 2);
+
+  return ok && ps.OK();
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+  DO_TEST(test05);
+END_MAIN
diff --git a/tests/Powerset/universe1.cc b/tests/Powerset/universe1.cc
new file mode 100644
index 0000000..6f67d28
--- /dev/null
+++ b/tests/Powerset/universe1.cc
@@ -0,0 +1,104 @@
+/* Test Pointset_Powerset<PH>::is_universe().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: is_universe().
+bool
+test01() {
+  Pointset_Powerset<C_Polyhedron> ps(0, EMPTY);
+  bool b = !ps.is_universe();
+
+  ps.add_disjunct(C_Polyhedron(0));
+  bool b1 = ps.is_universe();
+  return b && b1;
+}
+
+// Powerset of NNC polyhedra: is_universe().
+bool
+test02() {
+  Variable x(0);
+  Constraint_System cs;
+  Pointset_Powerset<NNC_Polyhedron> ps(1, EMPTY);
+
+  cs.clear();
+  cs.insert(x > 0);
+  cs.insert(x <= 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x < 1);
+  ps.add_disjunct(NNC_Polyhedron(cs));
+
+  bool b = !ps.is_universe();
+  return b;
+}
+
+// Powerset of C polyhedra: is_universe().
+bool
+test03() {
+  Pointset_Powerset<C_Polyhedron> ps(1, EMPTY);
+  bool b = !ps.is_universe();
+
+  ps.add_disjunct(C_Polyhedron(1));
+
+  bool b1 = ps.is_universe();
+  return b && b1;
+}
+
+// Powerset of grids: is_universe().
+bool
+test04() {
+  Variable A(0);
+  Variable B(1);
+  Pointset_Powerset<Grid> ps(2, EMPTY);
+  bool b0 = !ps.is_universe();
+
+  Grid g(2);
+  g.add_congruence((A %= 0) / 2);
+  ps.add_disjunct(g);
+  bool b1 = !ps.is_universe();
+
+  g = Grid(2);
+  g.add_congruence((A + B %= 0) / 2);
+  ps.add_disjunct(g);
+  bool b2 = !ps.is_universe();
+
+  g = Grid(2);
+  ps.add_disjunct(g);
+  bool b3 = ps.is_universe();
+
+  return b0 && b1 && b2 && b3;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/Powerset/upperbound1.cc b/tests/Powerset/upperbound1.cc
new file mode 100644
index 0000000..ecd9b86
--- /dev/null
+++ b/tests/Powerset/upperbound1.cc
@@ -0,0 +1,164 @@
+/* Test Pointset_Powerset<PH>::upper_bound_assign(),
+        Pointset_Powerset<PH>::least_upper_bound_assign().
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Powerset of C polyhedra: least_upper_bound_assign().
+bool
+test01() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+  c_ps.least_upper_bound_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps2);
+  bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+// Powerset of C polyhedra: upper_bound_assign().
+bool
+test02() {
+  Variable x(0);
+  Pointset_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  c_ps.add_disjunct(C_Polyhedron(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+  c_ps1.add_disjunct(C_Polyhedron(cs));
+  c_ps.upper_bound_assign(c_ps1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<C_Polyhedron> c_ps2(1, EMPTY);
+  c_ps2.add_disjunct(C_Polyhedron(cs));
+
+  bool ok = c_ps.definitely_entails(c_ps2);
+  bool ok1 = !c_ps2.definitely_entails(c_ps);
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: upper_bound_assign().
+bool
+test03() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  pps_box1.add_disjunct(TBox(cs));
+  pps_box.upper_bound_assign(pps_box1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box2(1, EMPTY);
+  pps_box2.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box2);
+  bool ok1 = !pps_box2.definitely_entails(pps_box);
+
+  return ok && ok1;
+}
+
+// Powerset of boxes: least_upper_bound_assign().
+bool
+test04() {
+  Variable x(0);
+  Pointset_Powerset<TBox> pps_box(1, EMPTY);
+  Constraint_System cs;
+
+  cs.insert(x >= 0);
+  cs.insert(x <= 2);
+  pps_box.add_disjunct(TBox(cs));
+
+  cs.clear();
+  cs.insert(x >= 1);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box1(1, EMPTY);
+  pps_box1.add_disjunct(TBox(cs));
+  pps_box.least_upper_bound_assign(pps_box1);
+
+  cs.clear();
+  cs.insert(x >= 0);
+  cs.insert(x <= 3);
+
+  Pointset_Powerset<TBox> pps_box2(1, EMPTY);
+  pps_box2.add_disjunct(TBox(cs));
+
+  bool ok = pps_box.definitely_entails(pps_box2);
+  bool ok1 = !pps_box2.definitely_entails(pps_box);
+
+  return ok && ok1;
+}
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+  DO_TEST(test02);
+  DO_TEST(test03);
+  DO_TEST(test04);
+END_MAIN
diff --git a/tests/README b/tests/README
new file mode 100644
index 0000000..efcc5f2
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,117 @@
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+See below for the copying conditions.
+
+How To Use the Test Programs (If You Really Want To Use Them)
+=============================================================
+
+The programs in this directory are part of the extensive test suite of
+the Parma Polyhedra Library (PPL).  They have various origins:
+
+1) some have been written to test the expressivity of the library;
+2) some have been written to reproduce bugs that have now been fixed;
+3) some have been written in order to increase the proportion of the
+   library's code exercised by test suite.
+
+Regardless of their origin, they are only used for the regression
+testing of the library.  For this reason, we do not pay much attention
+to them; we simply keep adding new tests to the test suite and, once
+in, they stay there forever.  Despite any defects, they serve this
+purpose well.
+
+On the other hand, in order to get an idea of how to use the PPL,
+several new users have found it convenient to take one of these test
+programs, change it a bit, and then try to compile it.  If you want to
+do something similar, here is some advice that may help you get
+something working and completely self-contained in a matter of
+minutes:
+
+a) Replace the line
+
+     #include "ppl_test.hh"
+
+   with
+
+     #include <ppl.hh>
+
+b) Erase the line reading
+
+     set_handlers();
+
+c) Either remove the `TRY' and `CATCH' macro invocations from the program
+   or substitute `TRY' with `try' and `CATCH' with something like
+
+     catch (const std::exception& e) {
+       cerr << "std::exception caught: "
+            << e.what() << " (type == " << typeid(e).name() << ")"
+            << endl;
+       exit(1);
+     }
+     catch (...) {
+       cerr << "unknown exception caught"
+            << endl;
+       exit(1);
+     }
+
+d) If you want to print something make sure the expansion of the `NOISY'
+   macro evaluates to true; add the line
+
+     using namespace Parma_Polyhedra_Library::IO_Operators;
+
+   just after the other two using directives of the program; and then
+   use the PPL output facilities directly.  For instance, the effect of a
+   line like
+
+     print_constraints(ph, "*** ph ***");
+
+   can be obtained, more or less, by replacing it with
+
+     cout << "*** ph ***" << endl << ph.constraints() << endl;
+
+   Similarly, a line of the form
+
+     print_generators(ph, "*** ph ***");
+
+   can be replaced by
+
+     cout << "*** ph ***" << endl << ph.generators() << endl;
+
+e) Compile the program with a command like
+
+     g++ mytest.cc -o mytest -lppl -lgmpxx -lgmp
+
+f) Run `mytest' and enjoy!
+
+
+--------
+
+Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This document describes the Parma Polyhedra Library (PPL).
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+The license is included, in various formats, in the `doc' subdirectory
+of each distribution of the PPL in files named `fdl.*'.
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.  The license is included, in various
+formats, in the `doc' subdirectory of each distribution of the PPL in
+files named `gpl.*'.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+If you have not received a copy of one or both the above mentioned
+licenses along with the PPL, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ .
diff --git a/tests/Random_Number_Generator_defs.hh b/tests/Random_Number_Generator_defs.hh
new file mode 100644
index 0000000..6dd7f96
--- /dev/null
+++ b/tests/Random_Number_Generator_defs.hh
@@ -0,0 +1,47 @@
+/* Random_Number_Generator class declaration.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_defs_hh
+#define PPL_Random_Number_Generator_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Random_Number_Generator {
+public:
+  Random_Number_Generator();
+
+  explicit Random_Number_Generator(unsigned long seed);
+
+  template <typename T>
+  void get(T& x, unsigned int info);
+
+private:
+  gmp_randclass rand;
+  unsigned int max_bits;
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Random_Number_Generator_inlines.hh"
+
+#endif // !defined(PPL_Random_Number_Generator_defs_hh)
diff --git a/tests/Random_Number_Generator_inlines.hh b/tests/Random_Number_Generator_inlines.hh
new file mode 100644
index 0000000..885f2b0
--- /dev/null
+++ b/tests/Random_Number_Generator_inlines.hh
@@ -0,0 +1,92 @@
+/* Random_Number_Generator class implementation: inline functions.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_inlines_hh
+#define PPL_Random_Number_Generator_inlines_hh 1
+
+#include <ctime>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace Random_Numbers {
+
+template <typename T>
+class Random_Number_Generator_Aux {
+public:
+  Random_Number_Generator_Aux(unsigned int max_bits) {
+    if (std::numeric_limits<T>::is_bounded) {
+      assign_r(zmin, std::numeric_limits<T>::min(), ROUND_NOT_NEEDED);
+      assign_r(zrange, std::numeric_limits<T>::max(), ROUND_NOT_NEEDED);
+      zrange -= zmin;
+      ++zrange;
+    }
+    else if (std::numeric_limits<T>::is_signed) {
+      zmin = 1;
+      zmin <<= (max_bits - 1);
+      zmin = -zmin;
+    }
+    else {
+      assign_r(zmin, std::numeric_limits<T>::min(), ROUND_NOT_NEEDED);
+    }
+  }
+  mpz_class zmin;
+  mpz_class zrange;
+};
+
+} // namespace Random_Numbers
+} // namespace Implementation
+
+inline
+Random_Number_Generator::Random_Number_Generator()
+  : rand(gmp_randinit_default), max_bits(512) {
+  // Seed the random number generator with the current time.
+  rand.seed((unsigned long) time(0));
+}
+
+inline
+Random_Number_Generator::Random_Number_Generator(const unsigned long seed)
+  : rand(gmp_randinit_default), max_bits(512) {
+  // Seed the random number generator with the given value.
+  rand.seed(seed);
+}
+
+template <typename T>
+inline void
+Random_Number_Generator::get(T& x, unsigned int) {
+  using Implementation::Random_Numbers::Random_Number_Generator_Aux;
+  static Random_Number_Generator_Aux<T> aux(max_bits);
+  mpz_class n;
+  if (std::numeric_limits<T>::is_bounded) {
+    n = rand.get_z_range(aux.zrange);
+  }
+  else {
+    n = rand.get_z_bits(max_bits);
+  }
+  n += aux.zmin;
+  assign_r(x, n, ROUND_NOT_NEEDED);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Random_Number_Generator_inlines_hh)
diff --git a/tests/Random_Number_Generator_types.hh b/tests/Random_Number_Generator_types.hh
new file mode 100644
index 0000000..45e2bf5
--- /dev/null
+++ b/tests/Random_Number_Generator_types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_Random_Number_Generator_types_hh
+#define PPL_Random_Number_Generator_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Random_Number_Generator;
+
+}
+
+#endif // !defined(PPL_Random_Number_Generator_types_hh)
diff --git a/tests/Watchdog/Makefile.am b/tests/Watchdog/Makefile.am
new file mode 100644
index 0000000..dbb66ca
--- /dev/null
+++ b/tests/Watchdog/Makefile.am
@@ -0,0 +1,70 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ . */
+
+if VALGRIND_TESTS_ENABLED
+
+CHECKER = \
+libtool --mode=execute \
+$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+--num-callers=40 --leak-resolution=high \
+--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+else !VALGRIND_TESTS_ENABLED
+
+CHECKER =
+
+endif !VALGRIND_TESTS_ENABLED
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la
+
+EXTRA_DIST =
+
+TESTS = \
+watchdog1
+
+XFAIL_TESTS =
+
+#
+# Sources for the tests
+#
+
+watchdog1_SOURCES = watchdog1.cc
+
+check_PROGRAMS = $(TESTS)
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
diff --git a/tests/Watchdog/Makefile.in b/tests/Watchdog/Makefile.in
new file mode 100644
index 0000000..8983f83
--- /dev/null
+++ b/tests/Watchdog/Makefile.in
@@ -0,0 +1,1097 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ . */
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = watchdog1$(EXEEXT)
+XFAIL_TESTS =
+check_PROGRAMS = $(am__EXEEXT_1)
+subdir = tests/Watchdog
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \
+	$(top_srcdir)/test-driver
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = watchdog1$(EXEEXT)
+am_watchdog1_OBJECTS = watchdog1.$(OBJEXT)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+watchdog1_LDADD = $(LDADD)
+watchdog1_DEPENDENCIES = $(top_builddir)/tests/libppl_tests.a \
+	$(top_builddir)/src/libppl.la
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+SOURCES = $(watchdog1_SOURCES)
+DIST_SOURCES = $(watchdog1_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+	$(TEST_LOG_FLAGS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+ at VALGRIND_TESTS_ENABLED_FALSE@CHECKER = 
+ at VALGRIND_TESTS_ENABLED_TRUE@CHECKER = \
+ at VALGRIND_TESTS_ENABLED_TRUE@libtool --mode=execute \
+ at VALGRIND_TESTS_ENABLED_TRUE@$(VALGRIND) --tool=memcheck -q --trace-children=yes --leak-check=yes \
+ at VALGRIND_TESTS_ENABLED_TRUE@--num-callers=40 --leak-resolution=high \
+ at VALGRIND_TESTS_ENABLED_TRUE@--suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src \
+-I$(top_builddir)/src \
+-I$(top_srcdir)/tests \
+ at extra_includes@ \
+ at debug_flag@
+
+LDADD = \
+$(top_builddir)/tests/libppl_tests.a \
+$(top_builddir)/src/libppl.la
+
+EXTRA_DIST = 
+
+#
+# Sources for the tests
+#
+watchdog1_SOURCES = watchdog1.cc
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Watchdog/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Watchdog/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES) $(EXTRA_watchdog1_DEPENDENCIES) 
+	@rm -f watchdog1$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/watchdog1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	else \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS:
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+watchdog1.log: watchdog1$(EXEEXT)
+	@p='watchdog1$(EXEEXT)'; \
+	b='watchdog1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.test$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	recheck tags tags-am uninstall uninstall-am
+
+
+$(top_builddir)/tests/libppl_tests.a:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/tests libppl_tests.a
+
+$(top_builddir)/src/libppl.la:
+	$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libppl.la
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Watchdog/watchdog1.cc b/tests/Watchdog/watchdog1.cc
new file mode 100644
index 0000000..5738a38
--- /dev/null
+++ b/tests/Watchdog/watchdog1.cc
@@ -0,0 +1,78 @@
+/* Some simple tests for the basic functionality of PPL::Watchdog.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+volatile bool interrupt = false;
+
+void
+do_interrupt() {
+  interrupt = true;
+}
+
+bool
+test01() {
+  const int csecs = 10;
+  try {
+    bool ok;
+    {
+      Watchdog w(csecs, do_interrupt);
+      nout << ((float) csecs)/100.0 << " seconds watchdog" << endl;
+
+      nout << "starting iteration... " << std::flush;
+      for (unsigned long i = 0; i < 1000000000; ++i) {
+        if (interrupt) {
+          nout << "interrupted" << endl;
+          ok = true;
+          goto done;
+        }
+      }
+      nout << "not interrupted" << endl;
+      ok = false;
+    done:
+      ;
+    }
+    interrupt = false;
+    return ok;
+  }
+#if !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  catch (const std::logic_error& e) {
+    nout << "std::logic_error caught (" << e.what() << ")" << endl;
+    return true;
+  }
+#endif // !PPL_WATCHDOG_OBJECTS_ARE_SUPPORTED
+  catch (...) {
+    return false;
+  }
+  // Should never get here.
+  return false;
+}
+
+
+} // namespace
+
+BEGIN_MAIN
+  DO_TEST(test01);
+END_MAIN
diff --git a/tests/files.cc b/tests/files.cc
new file mode 100644
index 0000000..2fe1004
--- /dev/null
+++ b/tests/files.cc
@@ -0,0 +1,51 @@
+/* Definition of simple helper functions to open and close files.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "files.hh"
+#include <fstream>
+#include <iostream>
+#include <cstdlib>
+
+using namespace std;
+
+void
+open(fstream& s, const char* path, ios_base::openmode mode) {
+  s.open(path, mode);
+  if (!s) {
+    cerr << "Cannot open `" << path << "'";
+    if (mode == ios_base::in)
+      cerr << " for reading";
+    else if (mode == ios_base::out)
+      cerr << " for writing";
+    else if (mode == (ios_base::in | ios_base::out))
+      cerr << " for reading/writing";
+    cerr << endl;
+    exit(1);
+  }
+}
+
+void
+close(fstream& s) {
+  if (s)
+    s.close();
+}
diff --git a/tests/files.hh b/tests/files.hh
new file mode 100644
index 0000000..a9531f2
--- /dev/null
+++ b/tests/files.hh
@@ -0,0 +1,36 @@
+/* Declaration of simple helper functions to open and close files.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_files_hh
+#define PPL_files_hh 1
+
+#include <iostream>
+#include <fstream>
+
+void
+open(std::fstream& s, const char* path, std::ios_base::openmode mode);
+
+void
+close(std::fstream& s);
+
+#endif // !defined(PPL_files_hh)
diff --git a/tests/ppl_test.cc b/tests/ppl_test.cc
new file mode 100644
index 0000000..ad9d6df
--- /dev/null
+++ b/tests/ppl_test.cc
@@ -0,0 +1,487 @@
+/* Implementation of utility functions used in test programs.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl_test.hh"
+#include <csignal>
+#include <iostream>
+#include <exception>
+#include <limits>
+#ifdef PPL_HAVE_FENV_H
+#include <fenv.h>
+#endif
+
+namespace {
+
+void
+unexpected_exception_handler() {
+  std::cerr << "unexpected exception thrown" << std::endl;
+  exit(1);
+}
+
+void
+uncaught_exception_handler() {
+  std::cerr << "uncaught exception" << std::endl;
+  exit(1);
+}
+
+#if PPL_HAVE_DECL_SIGACTION
+
+#if defined(PPL_HAVE_SIGINFO_T) && defined(SA_SIGINFO)
+
+void
+fpe_sigaction(int sig, siginfo_t* sip, void*) {
+  if (sig != SIGFPE) {
+    std::cerr << "fpe_handler called on signal different from SIGFPE"
+              << std::endl;
+    exit(1);
+  }
+  const char* s = 0;
+  switch (sip->si_code) {
+  case FPE_INTDIV:
+    s = "integer divide by zero";
+    break;
+  case FPE_INTOVF:
+    s = "integer overflow";
+    break;
+  case FPE_FLTDIV:
+    s = "floating point divide by zero";
+    break;
+  case FPE_FLTOVF:
+    s = "floating point overflow";
+    break;
+  case FPE_FLTUND:
+    s = "floating point underflow";
+    break;
+  case FPE_FLTRES:
+    s = "floating point inexact result";
+    break;
+  case FPE_FLTINV:
+    s = "floating point invalid operation";
+    break;
+  case FPE_FLTSUB:
+    s = "subscript out of range";
+    break;
+  default:
+    break;
+  }
+  if (s != 0)
+    std::cerr << "SIGFPE caught (cause: " << s << ")"
+              << std::endl;
+  else {
+    std::cerr << "SIGFPE caught (unknown si_code " << sip->si_code << ")"
+              << std::endl;
+#if defined(PPL_HAVE_FENV_H)
+    std::cerr << "Inquire with fetestexcept(): ";
+#ifdef FE_INEXACT
+    if (fetestexcept(FE_INEXACT))
+      std::cerr << "FE_INEXACT ";
+#endif
+#ifdef FE_DIVBYZERO
+    if (fetestexcept(FE_DIVBYZERO))
+      std::cerr << "FE_DIVBYZERO ";
+#endif
+#ifdef FE_UNDERFLOW
+    if (fetestexcept(FE_UNDERFLOW))
+      std::cerr << "FE_UNDERFLOW ";
+#endif
+#ifdef FE_OVERFLOW
+    if (fetestexcept(FE_OVERFLOW))
+      std::cerr << "FE_OVERFLOW ";
+#endif
+#if FE_INVALID
+    if (fetestexcept(FE_INVALID))
+      std::cerr << "FE_INVALID ";
+#endif
+    std::cerr << std::endl;
+#endif // defined(PPL_HAVE_FENV_H)
+  }
+  exit(1);
+}
+
+#else // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+
+void
+fpe_handler(int sig) {
+  if (sig != SIGFPE) {
+    std::cerr << "fpe_handler called on signal different from SIGFPE"
+              << std::endl;
+    exit(1);
+  }
+  std::cerr << "SIGFPE caught"
+            << std::endl;
+#if defined(PPL_HAVE_FENV_H)
+  std::cerr << "Inquire with fetestexcept(): ";
+#ifdef FE_INEXACT
+  if (fetestexcept(FE_INEXACT))
+    std::cerr << "FE_INEXACT ";
+#endif
+#ifdef FE_DIVBYZERO
+  if (fetestexcept(FE_DIVBYZERO))
+    std::cerr << "FE_DIVBYZERO ";
+#endif
+#ifdef FE_UNDERFLOW
+  if (fetestexcept(FE_UNDERFLOW))
+    std::cerr << "FE_UNDERFLOW ";
+#endif
+#ifdef FE_OVERFLOW
+  if (fetestexcept(FE_OVERFLOW))
+    std::cerr << "FE_OVERFLOW ";
+#endif
+#if FE_INVALID
+  if (fetestexcept(FE_INVALID))
+    std::cerr << "FE_INVALID ";
+#endif
+  std::cerr << std::endl;
+#endif // defined(PPL_HAVE_FENV_H)
+  exit(1);
+}
+
+#endif // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+
+#endif // PPL_HAVE_DECL_SIGACTION
+
+} // namespace
+
+namespace Parma_Polyhedra_Library {
+
+namespace Test {
+
+void
+set_handlers() {
+#if PPL_HAVE_DECL_SIGACTION
+  struct sigaction action;
+  sigemptyset(&action.sa_mask);
+#if defined(PPL_HAVE_SIGINFO_T) && defined(SA_SIGINFO)
+  action.sa_sigaction = fpe_sigaction;
+  action.sa_flags = SA_SIGINFO;
+#else // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+  action.sa_handler = fpe_handler;
+  action.sa_flags = 0;
+#endif // !defined(PPL_HAVE_SIGINFO_T) || !defined(SA_SIGINFO)
+  if (sigaction(SIGFPE, &action, NULL) != 0) {
+    std::cerr << "sigaction() failed"
+              << std::endl;
+    abort();
+  }
+#endif // PPL_HAVE_DECL_SIGACTION
+
+  std::set_unexpected(unexpected_exception_handler);
+  std::set_terminate(uncaught_exception_handler);
+}
+
+bool
+check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
+               const char* max_d_s, const char* d_name) {
+  Checked_Number<mpq_class, Extended_Number_Policy>
+    max_d((max_d_s ? max_d_s : "0"), ROUND_NOT_NEEDED);
+  assert(max_d >= 0);
+  if (d > max_d) {
+    nout << "Excessive " << d_name << " distance ";
+    if (is_plus_infinity(d))
+      nout << "+inf";
+    else if (raw_value(d) > std::numeric_limits<double>::max())
+      nout << ">" << std::numeric_limits<double>::max();
+    else
+      nout << raw_value(d).get_d() << " (rounded towards zero)";
+    nout << ": should be at most " << max_d << "."
+         << std::endl;
+    return false;
+  }
+  else
+    return true;
+}
+
+bool
+check_result(const BD_Shape<mpq_class>& computed_result,
+             const BD_Shape<mpq_class>& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using IO_Operators::operator<<;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+    return false;
+  }
+}
+
+bool
+check_result(const Rational_Box& computed_result,
+             const Rational_Box& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using IO_Operators::operator<<;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+    return false;
+  }
+}
+
+bool
+check_result(const Generator& computed_result,
+             const Generator& known_result,
+             const char* max_r_d_s,
+             const char* max_e_d_s,
+             const char* max_l_d_s) {
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (computed_result != known_result) {
+      using IO_Operators::operator<<;
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << computed_result
+           << "\nknown result is\n"
+           << known_result
+           << endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    using IO_Operators::operator<<;
+    nout << "Computed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << endl;
+  }
+  return ok;
+}
+
+bool
+check_result(const Checked_Number<mpq_class, Extended_Number_Policy>& computed,
+             const Checked_Number<mpq_class, Extended_Number_Policy>& known,
+             const char* max_r_d_s) {
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0) {
+    if (computed != known) {
+      using IO_Operators::operator<<;
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << computed
+           << "\nknown result is\n"
+           << known
+           << endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  sub_assign_r(r_d, known, computed, ROUND_NOT_NEEDED);
+  abs_assign_r(r_d, r_d, ROUND_NOT_NEEDED);
+  bool ok = check_distance(r_d, max_r_d_s, "rectilinear");
+  if (!ok) {
+    using IO_Operators::operator<<;
+    nout << "Computed result is\n"
+         << computed
+         << "\nknown result is\n"
+         << known
+         << endl;
+  }
+  return ok;
+}
+
+std::ostream&
+operator<<(std::ostream& s, const FCAIBVP& x) {
+  s << "{";
+  for (FCAIBVP::Set::const_iterator i = x.set.begin(),
+         x_end = x.set.end(); i != x_end; ) {
+    const Variable v(*i++);
+    using IO_Operators::operator<<;
+    s << v;
+    if (i != x_end)
+      s << ", ";
+  }
+  s << "}";
+  return s;
+}
+
+void
+print_constraint(const Constraint& c,
+                 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  using IO_Operators::operator<<;
+  s << c << std::endl;
+}
+
+void
+print_constraints(const Polyhedron& ph,
+                  const std::string& intro, std::ostream& s) {
+  print_constraints(ph.constraints(), intro, s);
+}
+
+#if 0
+void
+print_constraints(const Affine_Space& affs,
+                  const std::string& intro, std::ostream& s) {
+  print_constraints(affs.constraints(), intro, s);
+}
+#endif
+
+void
+print_constraints(const Constraint_System& cs,
+                  const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  Constraint_System::const_iterator i = cs.begin();
+  Constraint_System::const_iterator cs_end = cs.end();
+  bool printed_something = i != cs_end;
+  while (i != cs_end) {
+    using IO_Operators::operator<<;
+    s << *i++;
+    if (i != cs_end)
+      s << ",\n";
+  }
+  s << (printed_something ? "." : "true.") << std::endl;
+}
+
+void
+print_congruence(const Congruence& c,
+                 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  using IO_Operators::operator<<;
+  s << c << std::endl;
+}
+
+void
+print_congruences(const Congruence_System& cs,
+                  const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  Congruence_System::const_iterator i = cs.begin();
+  Congruence_System::const_iterator cs_end = cs.end();
+  bool printed_something = i != cs_end;
+  while (i != cs_end) {
+    using IO_Operators::operator<<;
+    s << *i++;
+    if (i != cs_end)
+      s << "," << std::endl;
+  }
+  s << (printed_something ? "." : "true.") << std::endl;
+}
+
+void
+print_congruences(const Grid& gr,
+                  const std::string& intro, std::ostream& s) {
+  print_congruences(gr.congruences(), intro, s);
+}
+
+void
+print_generator(const Generator& g,
+                const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  using IO_Operators::operator<<;
+  s << g << std::endl;
+}
+
+void
+print_generator(const Grid_Generator& g,
+                const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  using IO_Operators::operator<<;
+  s << g << std::endl;
+}
+
+void
+print_generators(const Polyhedron& ph,
+                 const std::string& intro, std::ostream& s) {
+  print_generators(ph.generators(), intro, s);
+}
+
+void
+print_generators(const Grid& gr,
+                 const std::string& intro, std::ostream& s) {
+  print_generators(gr.grid_generators(), intro, s);
+}
+
+void
+print_generators(const Generator_System& gs,
+                 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  Generator_System::const_iterator i = gs.begin();
+  Generator_System::const_iterator gs_end = gs.end();
+  bool printed_something = i != gs_end;
+  while (i != gs_end) {
+    using IO_Operators::operator<<;
+    s << *i++;
+    if (i != gs_end)
+      s << ",\n";
+  }
+  s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_generators(const Grid_Generator_System& gs,
+                 const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << "\n";
+  Grid_Generator_System::const_iterator i = gs.begin();
+  Grid_Generator_System::const_iterator gs_end = gs.end();
+  bool printed_something = i != gs_end;
+  while (i != gs_end) {
+    using IO_Operators::operator<<;
+    s << *i++;
+    if (i != gs_end)
+      s << ",\n";
+  }
+  s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_function(const Parma_Polyhedra_Library::Partial_Function& function,
+               const std::string& intro, std::ostream& s) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  function.print(s);
+}
+
+} // namespace Test
+
+} // namespace Parma_Polyhedra_Library
diff --git a/tests/ppl_test.hh b/tests/ppl_test.hh
new file mode 100644
index 0000000..e45338b
--- /dev/null
+++ b/tests/ppl_test.hh
@@ -0,0 +1,1159 @@
+/* Header file for test programs.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_ppl_test_hh
+#define PPL_ppl_test_hh 1
+
+#include "ppl_header.hh"
+#include "Random_Number_Generator_defs.hh"
+#include <stdexcept>
+#include <sstream>
+#include <list>
+#include <map>
+#include <iterator>
+#include <string>
+#include <iostream>
+#include <algorithm>
+#include <typeinfo>
+#include <cstdlib>
+
+#ifndef NOISY
+#define NOISY 0
+#endif
+
+#ifndef VERY_NOISY
+#define VERY_NOISY 0
+#endif
+
+#define TRY try
+
+#define CATCH \
+catch (const std::overflow_error& e) { \
+  std::cerr << "arithmetic overflow (" << e.what() << ")" \
+            << std::endl; \
+  exit(1); \
+} \
+catch (const std::exception& e) { \
+  std::cerr << "std::exception caught: " \
+            << e.what() << " (type == " << typeid(e).name() << ")" \
+            << std::endl; \
+  exit(1); \
+}
+
+#define BEGIN_MAIN                                       \
+int                                                      \
+main() try {                                             \
+  set_handlers();                                        \
+  bool succeeded = false;                                \
+  bool overflow = false;                                 \
+  (void) overflow;                                       \
+  std::list<std::string> failed_tests;                   \
+  std::list<std::string> unexpectedly_succeeded_tests;
+
+#define END_MAIN                                                        \
+  if (!failed_tests.empty()) {                                          \
+    std::cerr << "tests failed: ";                                      \
+    std::copy(failed_tests.begin(),                                     \
+              failed_tests.end(),                                       \
+              std::ostream_iterator<std::string>(std::cerr, " "));      \
+    std::cerr << std::endl;                                             \
+    return 1;                                                           \
+  }                                                                     \
+  if (!unexpectedly_succeeded_tests.empty()) {                          \
+    std::cerr << "tests unexpectedly succeeded: ";                      \
+    std::copy(unexpectedly_succeeded_tests.begin(),                     \
+              unexpectedly_succeeded_tests.end(),                       \
+              std::ostream_iterator<std::string>(std::cerr, " "));      \
+    std::cerr << std::endl;                                             \
+    return 1;                                                           \
+  }                                                                     \
+  return 0;                                                             \
+}                                                                       \
+catch (const std::overflow_error& e) {                                  \
+  std::cerr << "arithmetic overflow (" << e.what() << ")"               \
+            << std::endl;                                               \
+  exit(1);                                                              \
+}                                                                       \
+catch (const std::exception& e) {                                       \
+  std::cerr << "std::exception caught: "                                \
+            << e.what() << " (type == " << typeid(e).name() << ")"      \
+            << std::endl;                                               \
+  exit(1);                                                              \
+}
+
+#define ANNOUNCE_TEST(test)              \
+  nout << "\n=== " #test " ===" << std::endl
+
+#define RUN_TEST(test)                                                  \
+  try {                                                                 \
+    overflow = false;                                                   \
+    succeeded = test();                                                 \
+  }                                                                     \
+  catch (const std::overflow_error& e) {                                \
+    nout << "arithmetic overflow (" << e.what() << ")"                  \
+         << std::endl;                                                  \
+    overflow = true;                                                    \
+    succeeded = false;                                                  \
+  }                                                                     \
+  catch (const std::exception& e) {                                     \
+    nout << "std::exception caught: "                                   \
+         << e.what() << " (type == " << typeid(e).name() << ")"         \
+         << std::endl;                                                  \
+    succeeded = false;                                                  \
+  }                                                                     \
+  catch (...) {                                                         \
+    nout << "unknown exception caught"                                  \
+         << std::endl;                                                  \
+    succeeded = false;                                                  \
+  }
+
+#define DO_TEST(test)                    \
+  ANNOUNCE_TEST(test);                   \
+  RUN_TEST(test);                        \
+  if (!succeeded)                        \
+    failed_tests.push_back(#test);
+
+#define DO_TEST_F(test)                                 \
+  ANNOUNCE_TEST(test);                                  \
+  RUN_TEST(test);                                       \
+  if (succeeded)                                        \
+    unexpectedly_succeeded_tests.push_back(#test);
+
+#define DO_TEST_OVERFLOW(test)                          \
+  ANNOUNCE_TEST(test);                                  \
+  RUN_TEST(test);                                       \
+  if (succeeded)                                        \
+    unexpectedly_succeeded_tests.push_back(#test);      \
+  else if (!overflow)                                   \
+    failed_tests.push_back(#test);
+
+#define DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)                    \
+  ANNOUNCE_TEST(test);                                                  \
+  RUN_TEST(test);                                                       \
+  if (!succeeded)                                                       \
+    if (!overflow || has_exact_coefficient_type(shape(0, EMPTY)))       \
+      failed_tests.push_back(#test);
+
+
+// Macros for arbitrary combination of preprocessor conditions.
+
+#define PPL_CPP_AND_false_false false
+#define PPL_CPP_AND_false_true false
+#define PPL_CPP_AND_true_false false
+#define PPL_CPP_AND_true_true true
+#define PPL_CPP_AND_(x,y) PPL_CPP_AND_ ## x ## _ ## y
+#define PPL_CPP_AND(x,y) PPL_CPP_AND_(x, y)
+
+#define PPL_CPP_OR_false_false false
+#define PPL_CPP_OR_false_true true
+#define PPL_CPP_OR_true_false true
+#define PPL_CPP_OR_true_true true
+#define PPL_CPP_OR_(x,y) PPL_CPP_OR_ ## x ## _ ## y
+#define PPL_CPP_OR(x,y) PPL_CPP_OR_(x, y)
+
+#define PPL_CPP_NOT_false true
+#define PPL_CPP_NOT_true false
+#define PPL_CPP_NOT_(x) PPL_CPP_NOT_ ## x
+#define PPL_CPP_NOT(x) PPL_CPP_NOT_(x)
+
+#define PPL_CPP_VAL_true_ true
+#define PPL_CPP_VAL_false_ false
+#define PPL_CPP_VAL_false(v) PPL_CPP_VAL_true
+#define PPL_CPP_VAL_b(v) PPL_CPP_VAL_false
+#define PPL_CPP_VAL_a(v) PPL_CPP_VAL_b(v)
+
+#define PPL_CPP_IS_NEGx_arg_neg 0)(0
+#define PPL_CPP_IS_NEGx(v) PPL_CPP_VAL_a(PPL_CPP_IS_NEGx_arg_##v)
+
+#define PPL_CPP_IS_NEG__(v) v ## _
+#define PPL_CPP_IS_NEG_(v) PPL_CPP_IS_NEG__(v)
+#define PPL_CPP_IS_NEG(v) PPL_CPP_IS_NEG_(PPL_CPP_IS_NEGx(v))
+
+#define PPL_CPP_IS_ZEROx_arg_0 0)(0
+#define PPL_CPP_IS_ZEROx(v) PPL_CPP_VAL_a(PPL_CPP_IS_ZEROx_arg_##v)
+
+#define PPL_CPP_IS_ZERO__(v) v ## _
+#define PPL_CPP_IS_ZERO_(v) PPL_CPP_IS_ZERO__(v)
+#define PPL_CPP_IS_ZERO(v) PPL_CPP_IS_ZERO_(PPL_CPP_IS_ZEROx(v))
+
+#define PPL_CPP_DECR_neg neg
+#define PPL_CPP_DECR_0 neg
+#define PPL_CPP_DECR_1 0
+#define PPL_CPP_DECR_2 1
+#define PPL_CPP_DECR_3 2
+#define PPL_CPP_DECR_4 3
+#define PPL_CPP_DECR_5 4
+#define PPL_CPP_DECR_6 5
+#define PPL_CPP_DECR_7 6
+#define PPL_CPP_DECR_8 7
+#define PPL_CPP_DECR_9 8
+
+#define PPL_CPP_DECR_(x) PPL_CPP_DECR_ ## x
+#define PPL_CPP_DECR(x) PPL_CPP_DECR_(x)
+
+#define PPL_CPP_SUB_0(x) x
+#define PPL_CPP_SUB_1(x) PPL_CPP_DECR(x)
+#define PPL_CPP_SUB_2(x) PPL_CPP_DECR(PPL_CPP_SUB_1(x))
+#define PPL_CPP_SUB_3(x) PPL_CPP_DECR(PPL_CPP_SUB_2(x))
+#define PPL_CPP_SUB_4(x) PPL_CPP_DECR(PPL_CPP_SUB_3(x))
+#define PPL_CPP_SUB_5(x) PPL_CPP_DECR(PPL_CPP_SUB_4(x))
+#define PPL_CPP_SUB_6(x) PPL_CPP_DECR(PPL_CPP_SUB_5(x))
+#define PPL_CPP_SUB_7(x) PPL_CPP_DECR(PPL_CPP_SUB_6(x))
+#define PPL_CPP_SUB_8(x) PPL_CPP_DECR(PPL_CPP_SUB_7(x))
+#define PPL_CPP_SUB_9(x) PPL_CPP_DECR(PPL_CPP_SUB_8(x))
+
+#define PPL_CPP_SUB_(x, y) PPL_CPP_SUB_ ## y (x)
+#define PPL_CPP_SUB(x, y) PPL_CPP_SUB_(x, y)
+
+#define PPL_CPP_LT(x, y) PPL_CPP_IS_NEG(PPL_CPP_SUB(x, y))
+#define PPL_CPP_GT(x, y) PPL_CPP_LT(y, x)
+#define PPL_CPP_LE(x, y) PPL_CPP_NOT(PPL_CPP_LT(y, x))
+#define PPL_CPP_GE(x, y) PPL_CPP_NOT(PPL_CPP_LT(x, y))
+#define PPL_CPP_EQ(x, y) PPL_CPP_IS_ZERO(PPL_CPP_SUB(x, y))
+#define PPL_CPP_NE(x, y) PPL_CPP_NOT(PPL_CPP_EQ(x,y))
+
+#define PPL_CPP_LOG2_64 6
+#define PPL_CPP_LOG2_32 5
+#define PPL_CPP_LOG2_16 4
+#define PPL_CPP_LOG2_8  3
+#define PPL_CPP_LOG2_0  neg
+
+#define PPL_CPP_LOG2_(x) PPL_CPP_LOG2_ ## x
+#define PPL_CPP_LOG2(x) PPL_CPP_LOG2_(x)
+
+#define COND_MACRO_2(prefix, v) prefix ## _ ## v
+#define COND_MACRO_1(prefix, v) COND_MACRO_2(prefix, v)
+#define COND_MACRO(prefix, expr) COND_MACRO_1(prefix, expr)
+
+
+#define PPL_CPP_LOGBITS PPL_CPP_LOG2(PPL_COEFFICIENT_BITS)
+
+#define COND_F64 PPL_CPP_LT(PPL_CPP_LOGBITS, 0)
+#define COND_F32 PPL_CPP_OR(PPL_CPP_GT(PPL_CPP_LOGBITS, 5), \
+                            PPL_CPP_LT(PPL_CPP_LOGBITS, 0))
+#define COND_F16 PPL_CPP_OR(PPL_CPP_GT(PPL_CPP_LOGBITS, 4), \
+                            PPL_CPP_LT(PPL_CPP_LOGBITS, 0))
+#define COND_F8  PPL_CPP_OR(PPL_CPP_GT(PPL_CPP_LOGBITS, 3), \
+                            PPL_CPP_LT(PPL_CPP_LOGBITS, 0))
+
+#ifndef NDEBUG
+# define COND_ASSERT_OFF false
+#else
+# define COND_ASSERT_OFF true
+#endif
+
+#define COND_SUCC_64_ONLY \
+  PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 6), COND_ASSERT_OFF)
+#define COND_SUCC_32_ONLY \
+  PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 5), COND_ASSERT_OFF)
+#define COND_SUCC_16_ONLY \
+  PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 4), COND_ASSERT_OFF)
+#define COND_SUCC_8_ONLY \
+  PPL_CPP_AND(PPL_CPP_EQ(PPL_CPP_LOGBITS, 3), COND_ASSERT_OFF)
+
+#define COND_F64A PPL_CPP_OR(COND_F64, COND_SUCC_64_ONLY)
+#define COND_F32A PPL_CPP_OR(COND_F32, COND_SUCC_32_ONLY)
+#define COND_F16A PPL_CPP_OR(COND_F16, COND_SUCC_16_ONLY)
+#define COND_F8A  PPL_CPP_OR(COND_F8,  COND_SUCC_8_ONLY)
+
+
+#define COND_DO_TEST_false(test) DO_TEST_OVERFLOW(test)
+#define COND_DO_TEST_true(test)  DO_TEST(test)
+#define COND_DO_TEST(cond, test) COND_MACRO(COND_DO_TEST, cond)(test)
+
+#define DO_TEST_F64(test)  COND_DO_TEST(COND_F64, test)
+#define DO_TEST_F64A(test) COND_DO_TEST(COND_F64A, test)
+#define DO_TEST_F32(test)  COND_DO_TEST(COND_F32, test)
+#define DO_TEST_F32A(test) COND_DO_TEST(COND_F32A, test)
+#define DO_TEST_F16(test)  COND_DO_TEST(COND_F16, test)
+#define DO_TEST_F16A(test) COND_DO_TEST(COND_F16A, test)
+#define DO_TEST_F8(test)   COND_DO_TEST(COND_F8, test)
+#define DO_TEST_F8A(test)  COND_DO_TEST(COND_F8A, test)
+
+
+#define COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT_false(test, shape) \
+  DO_TEST_OVERFLOW(test)
+#define COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT_true(test, shape)  \
+  DO_TEST_MAY_OVERFLOW_IF_INEXACT(test, shape)
+#define COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(cond, test, shape) \
+  COND_MACRO(COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT, cond)(test, shape)
+
+#define DO_TEST_F64_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F64, test, shape)
+#define DO_TEST_F64A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F64A, test, shape)
+#define DO_TEST_F32_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F32, test, shape)
+#define DO_TEST_F32A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F32A, test, shape)
+#define DO_TEST_F16_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F16, test, shape)
+#define DO_TEST_F16A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F16A, test, shape)
+#define DO_TEST_F8_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F8, test, shape)
+#define DO_TEST_F8A_MAY_OVERFLOW_IF_INEXACT(test, shape) \
+  COND_DO_TEST_MAY_OVERFLOW_IF_INEXACT(COND_F8A, test, shape)
+
+// Encoding floating point formats.
+#define PPL_CPP_FP_FORMAT_float                1
+#define PPL_CPP_FP_FORMAT_double               2
+#define PPL_CPP_FP_FORMAT_long_double          3
+#define PPL_CPP_FP_FORMAT_float_ieee754_single 4
+#define PPL_CPP_FP_FORMAT_float_ieee754_double 5
+#define PPL_CPP_FP_FORMAT_float_ieee754_quad   6
+#define PPL_CPP_FP_FORMAT_(format) PPL_CPP_FP_FORMAT_ ## format
+#define PPL_CPP_FP_FORMAT(format) PPL_CPP_FP_FORMAT_(format)
+
+
+// Turn s into a string: PPL_TEST_STR(x + y) => "x + y".
+#define PPL_TEST_STR(s) #s
+
+// Turn the expansion of s into a string: PPL_TEST_XSTR(x) => "s expanded".
+#define PPL_TEST_XSTR(s) PPL_TEST_STR(s)
+
+
+#ifdef DERIVED_TEST
+#define C_Polyhedron NNC_Polyhedron
+#endif
+
+#ifndef BOX_INSTANCE
+#define BOX_INSTANCE rt_r_oc
+#endif
+
+#ifndef BD_SHAPE_INSTANCE
+#define BD_SHAPE_INSTANCE mpq_class
+#endif
+
+#ifndef OCTAGONAL_SHAPE_INSTANCE
+#define OCTAGONAL_SHAPE_INSTANCE mpq_class
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Test {
+
+static bool
+check_noisy(const char*
+#if PPL_HAVE_DECL_GETENV || NOISY || VERY_NOISY
+            environment_variable
+#endif
+) {
+#if PPL_HAVE_DECL_GETENV
+  return getenv(environment_variable) != 0;
+#else
+#if NOISY
+  if (strcmp(environment_variable, "PPL_NOISY_TESTS") == 0)
+    return true;
+#endif
+#if VERY_NOISY
+  if (strcmp(environment_variable, "PPL_VERY_NOISY_TESTS") == 0)
+    return true;
+#endif
+  return false;
+#endif // !PPL_HAVE_DECL_GETENV
+}
+
+template<typename CharT, typename Traits = std::char_traits<CharT> >
+class nullbuf : public std::basic_streambuf<CharT, Traits> {
+protected:
+  virtual typename Traits::int_type overflow(typename Traits::int_type c) {
+    return Traits::not_eof(c);
+  }
+};
+
+template <class CharT, class Traits = std::char_traits<CharT> >
+class noisy_ostream : public std::basic_ostream<CharT, Traits> {
+private:
+  nullbuf<CharT, Traits> black_hole;
+
+public:
+  noisy_ostream(const std::basic_ostream<CharT, Traits>& os,
+                const char* environment_variable)
+    : std::basic_ostream<CharT, Traits>(check_noisy(environment_variable)
+                                        ? os.rdbuf()
+                                        : &black_hole) {
+  }
+};
+
+static noisy_ostream<char> nout(std::cout, "PPL_NOISY_TESTS");
+static noisy_ostream<char> vnout(std::cout, "PPL_VERY_NOISY_TESTS");
+
+void
+set_handlers();
+
+//! Utility typedef to allow a macro argument to denote the long double type.
+typedef long double long_double;
+
+struct Floating_Real_Open_Interval_Info_Policy {
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+struct Floating_Real_Closed_Interval_Info_Policy {
+  const_bool_nodef(store_special, false);
+  const_bool_nodef(store_open, false);
+  const_bool_nodef(cache_empty, false);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, false);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Floating_Real_Open_Interval_Info_Policy> Floating_Real_Open_Interval_Info;
+
+typedef Interval<float, Floating_Real_Open_Interval_Info> fl_r_oc;
+typedef Interval<double, Floating_Real_Open_Interval_Info> db_r_oc;
+typedef Interval<long double, Floating_Real_Open_Interval_Info> ld_r_oc;
+
+struct Rational_Real_Open_Interval_Info_Policy {
+  const_bool_nodef(store_special, true);
+  const_bool_nodef(store_open, true);
+  const_bool_nodef(cache_empty, true);
+  const_bool_nodef(cache_singleton, true);
+  const_bool_nodef(cache_normalized, false);
+  const_int_nodef(next_bit, 0);
+  const_bool_nodef(may_be_empty, true);
+  const_bool_nodef(may_contain_infinity, false);
+  const_bool_nodef(check_empty_result, false);
+  const_bool_nodef(check_inexact, false);
+};
+
+typedef Interval_Info_Bitset<unsigned int,
+                             Rational_Real_Open_Interval_Info_Policy> Rational_Real_Open_Interval_Info;
+
+typedef Interval<mpq_class, Rational_Real_Open_Interval_Info> rt_r_oc;
+
+//! The incarnation of Box under test.
+typedef Box<BOX_INSTANCE> TBox;
+
+//! The incarnation of BD_Shape under test.
+typedef BD_Shape<BD_SHAPE_INSTANCE> TBD_Shape;
+
+//! The incarnation of Octagonal_Shape under test.
+typedef Octagonal_Shape<OCTAGONAL_SHAPE_INSTANCE> TOctagonal_Shape;
+
+// For floating point analysis.
+#ifdef ANALYZER_FP_FORMAT
+#ifdef ANALYZED_FP_FORMAT
+//! The type of an interval with floating point boundaries.
+typedef Interval<ANALYZER_FP_FORMAT,
+                 Floating_Real_Open_Interval_Info> FP_Interval;
+
+//! The type of an interval linear form.
+typedef Linear_Form<FP_Interval> FP_Linear_Form;
+
+//! The type of an interval abstract store.
+typedef Box<FP_Interval> FP_Interval_Abstract_Store;
+
+//! The type of a linear form abstract store.
+typedef std::map<dimension_type, FP_Linear_Form>
+                                 FP_Linear_Form_Abstract_Store;
+
+/*! \brief
+  The incarnation of BD_Shape under test for analyzing
+  floating point computations.
+*/
+typedef BD_Shape<ANALYZER_FP_FORMAT> FP_BD_Shape;
+
+/*! \brief
+  The incarnation of Octagonal_Shape under test for analyzing
+  floating point computations.
+*/
+typedef Octagonal_Shape<ANALYZER_FP_FORMAT> FP_Octagonal_Shape;
+#endif // ANALYZED_FP_FORMAT
+#endif // ANALYZER_FP_FORMAT
+
+template <typename Shape>
+inline bool
+has_exact_coefficient_type(const Shape&) {
+  return std::numeric_limits<typename Shape::coefficient_type>::is_exact;
+}
+
+template <typename Interval>
+inline bool
+has_exact_coefficient_type(const Box<Interval>&) {
+  return std::numeric_limits<typename Interval::boundary_type>::is_exact;
+}
+
+bool
+check_distance(const Checked_Number<mpq_class, Extended_Number_Policy>& d,
+               const char* max_d_s, const char* d_name);
+
+template <typename T>
+bool
+check_result_i(const BD_Shape<T>& computed_result,
+               const BD_Shape<mpq_class>& known_result,
+               const char* max_r_d_s,
+               const char* max_e_d_s,
+               const char* max_l_d_s) {
+  BD_Shape<mpq_class> q_computed_result(computed_result);
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (q_computed_result != known_result) {
+      using IO_Operators::operator<<;
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << q_computed_result
+           << "\nknown result is\n"
+           << known_result
+           << std::endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  if (!q_computed_result.contains(known_result)) {
+    using IO_Operators::operator<<;
+    nout << "Containment does not hold:"
+         << "\ncomputed result is\n"
+         << q_computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+    return false;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    using IO_Operators::operator<<;
+    nout << "Computed result is\n"
+         << q_computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+  }
+  return ok;
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+             const BD_Shape<mpq_class>& known_result,
+             const char* max_r_d_s,
+             const char* max_e_d_s,
+             const char* max_l_d_s) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result,
+                     "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result,
+                     max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+             const BD_Shape<T>& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using IO_Operators::operator<<;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+    return false;
+  }
+}
+
+template <typename T>
+bool
+check_result(const BD_Shape<T>& computed_result,
+             const BD_Shape<mpq_class>& known_result) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+bool
+check_result(const BD_Shape<mpq_class>& computed_result,
+             const BD_Shape<mpq_class>& known_result);
+
+template <typename T>
+bool
+check_result_i(const Octagonal_Shape<T>& computed_result,
+               const Octagonal_Shape<mpq_class>& known_result,
+               const char* max_r_d_s,
+               const char* max_e_d_s,
+               const char* max_l_d_s) {
+  Octagonal_Shape<mpq_class> q_computed_result(computed_result);
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (q_computed_result != known_result) {
+      using IO_Operators::operator<<;
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << q_computed_result
+           << "\nknown result is\n"
+           << known_result
+           << std::endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  if (!q_computed_result.contains(known_result)) {
+    using IO_Operators::operator<<;
+    nout << "Containment does not hold:"
+         << "\ncomputed result is\n"
+         << q_computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+    return false;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    using IO_Operators::operator<<;
+    nout << "Computed result is\n"
+         << q_computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+  }
+  return ok;
+}
+
+template <typename T>
+bool
+check_result(const Octagonal_Shape<T>& computed_result,
+             const Octagonal_Shape<mpq_class>& known_result,
+             const char* max_r_d_s,
+             const char* max_e_d_s,
+             const char* max_l_d_s) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result,
+                     "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result,
+                     max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <>
+inline bool
+check_result(const Octagonal_Shape<mpq_class>& computed_result,
+             const Octagonal_Shape<mpq_class>& known_result,
+             const char*,
+             const char*,
+             const char*) {
+  return check_result_i(computed_result, known_result,
+                        0, 0, 0);
+}
+
+template <typename T>
+bool
+check_result(const Octagonal_Shape<T>& computed_result,
+             const Octagonal_Shape<mpq_class>& known_result) {
+  return std::numeric_limits<T>::is_integer
+    ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+
+template <typename Interval>
+bool
+check_result_i(const Box<Interval>& computed_result,
+               const Rational_Box& known_result,
+               const char* max_r_d_s,
+               const char* max_e_d_s,
+               const char* max_l_d_s) {
+  Rational_Box q_computed_result(computed_result);
+  // Handle in a more efficient way the case where equality is expected.
+  if (max_r_d_s == 0 && max_e_d_s == 0 && max_l_d_s == 0) {
+    if (q_computed_result != known_result) {
+      using IO_Operators::operator<<;
+      nout << "Equality does not hold:"
+           << "\ncomputed result is\n"
+           << q_computed_result
+           << "\nknown result is\n"
+           << known_result
+           << std::endl;
+      return false;
+    }
+    else
+      return true;
+  }
+
+  if (!q_computed_result.contains(known_result)) {
+    using IO_Operators::operator<<;
+    nout << "Containment does not hold:"
+         << "\ncomputed result is\n"
+         << q_computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+    nout << "Individual dimensions where containment does not hold"
+         << "\n(Variable: computed-result known-result):\n";
+    for (dimension_type i = 0; i < computed_result.space_dimension(); ++i) {
+      if (!q_computed_result.get_interval(Variable(i))
+          .contains(known_result.get_interval(Variable(i)))) {
+        using IO_Operators::operator<<;
+        nout << Variable(i) << ": "
+             << q_computed_result.get_interval(Variable(i))
+             << ' '
+             << known_result.get_interval(Variable(i))
+             << std::endl;
+      }
+    }
+    return false;
+  }
+
+  Checked_Number<mpq_class, Extended_Number_Policy> r_d;
+  rectilinear_distance_assign(r_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> e_d;
+  euclidean_distance_assign(e_d, known_result, q_computed_result, ROUND_UP);
+  Checked_Number<mpq_class, Extended_Number_Policy> l_d;
+  l_infinity_distance_assign(l_d, known_result, q_computed_result, ROUND_UP);
+  bool ok_r = check_distance(r_d, max_r_d_s, "rectilinear");
+  bool ok_e = check_distance(e_d, max_e_d_s, "euclidean");
+  bool ok_l = check_distance(l_d, max_l_d_s, "l_infinity");
+  bool ok = ok_r && ok_e && ok_l;
+  if (!ok) {
+    using IO_Operators::operator<<;
+    nout << "Computed result is\n"
+         << q_computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+  }
+  return ok;
+}
+
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+             const Rational_Box& known_result,
+             const char* max_r_d_s,
+             const char* max_e_d_s,
+             const char* max_l_d_s) {
+  return std::numeric_limits<typename Interval::boundary_type>::is_integer
+    ? check_result_i(computed_result, known_result,
+                     "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result,
+                     max_r_d_s, max_e_d_s, max_l_d_s);
+}
+
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+             const Box<Interval>& known_result) {
+  if (computed_result == known_result)
+    return true;
+  else {
+    using IO_Operators::operator<<;
+    nout << "Equality does not hold:"
+         << "\ncomputed result is\n"
+         << computed_result
+         << "\nknown result is\n"
+         << known_result
+         << std::endl;
+    return false;
+  }
+}
+
+template <typename Interval>
+bool
+check_result(const Box<Interval>& computed_result,
+             const Rational_Box& known_result) {
+  return std::numeric_limits<typename Interval::boundary_type>::is_integer
+    ? check_result_i(computed_result, known_result, "+inf", "+inf", "+inf")
+    : check_result_i(computed_result, known_result, 0, 0, 0);
+}
+
+bool
+check_result(const Rational_Box& computed_result,
+             const Rational_Box& known_result);
+
+bool
+check_result(const Generator& computed_result,
+             const Generator& known_result,
+             const char* max_r_d_s,
+             const char* max_e_d_s,
+             const char* max_l_d_s);
+
+bool
+check_result(const Checked_Number<mpq_class, Extended_Number_Policy>& computed,
+             const Checked_Number<mpq_class, Extended_Number_Policy>& known,
+             const char* max_r_d_s);
+
+class FCAIBVP;
+
+bool
+operator==(const FCAIBVP& x, const FCAIBVP& y);
+
+bool
+operator!=(const FCAIBVP& x, const FCAIBVP& y);
+
+std::ostream&
+operator<<(std::ostream& s, const FCAIBVP& x);
+
+/*! \brief
+  A class for representing Finite Conjunctions of Attribute
+  Independent Boolean Variable Properties.
+*/
+class FCAIBVP {
+private:
+  typedef size_t dim_t;
+
+  typedef std::set<dim_t> Set;
+
+  Set set;
+
+public:
+  FCAIBVP();
+
+  explicit FCAIBVP(const Variable x);
+
+  explicit FCAIBVP(const Variables_Set& y);
+
+  FCAIBVP(const FCAIBVP& y, unsigned offset);
+
+  memory_size_type total_memory_in_bytes() const;
+
+  memory_size_type external_memory_in_bytes() const;
+
+  bool is_top() const;
+
+  bool is_bottom() const;
+
+  bool definitely_entails(const FCAIBVP& y) const;
+
+  void upper_bound_assign(const FCAIBVP& y);
+
+  void difference_assign(const FCAIBVP& y);
+
+  void meet_assign(const FCAIBVP& y);
+
+  void weakening_assign(const FCAIBVP& y);
+
+  static bool has_nontrivial_weakening();
+
+  bool OK() const;
+
+  friend std::ostream&
+  Parma_Polyhedra_Library::Test::operator<<(std::ostream& s,
+                                            const FCAIBVP& x);
+};
+
+inline
+FCAIBVP::FCAIBVP()
+  : set() {
+}
+
+inline
+FCAIBVP::FCAIBVP(const Variable x)
+  : set() {
+  set.insert(x.id());
+}
+
+inline
+FCAIBVP::FCAIBVP(const Variables_Set& y)
+  : set() {
+  for (Variables_Set::const_iterator i = y.begin(),
+         y_end = y.end(); i != y_end; ++i)
+    set.insert(*i);
+}
+
+inline
+FCAIBVP::FCAIBVP(const FCAIBVP& y, unsigned offset)
+  : set() {
+  for (Set::const_iterator i = y.set.begin(),
+         y_set_end = y.set.end(); i != y_set_end; ++i)
+    set.insert(*i + offset);
+}
+
+inline memory_size_type
+FCAIBVP::total_memory_in_bytes() const {
+  return 1;
+}
+
+inline bool
+FCAIBVP::is_top() const {
+  return set.empty();
+}
+
+inline bool
+FCAIBVP::is_bottom() const {
+  return false;
+}
+
+inline bool
+FCAIBVP::definitely_entails(const FCAIBVP& y) const{
+  const FCAIBVP& x = *this;
+  return std::includes(x.set.begin(), x.set.end(),
+                       y.set.begin(), y.set.end());
+}
+
+inline void
+FCAIBVP::upper_bound_assign(const FCAIBVP& y) {
+  FCAIBVP& x = *this;
+  FCAIBVP z;
+  std::set_intersection(x.set.begin(), x.set.end(),
+                        y.set.begin(), y.set.end(),
+                        std::inserter(z.set, z.set.begin()));
+  using std::swap;
+  swap(x, z);
+}
+
+inline void
+FCAIBVP::difference_assign(const FCAIBVP& y) {
+  FCAIBVP& x = *this;
+  FCAIBVP z;
+  std::set_difference(x.set.begin(), x.set.end(),
+                      y.set.begin(), y.set.end(),
+                      std::inserter(z.set, z.set.begin()));
+  using std::swap;
+  swap(x, z);
+}
+
+inline void
+FCAIBVP::meet_assign(const FCAIBVP& y) {
+  set.insert(y.set.begin(), y.set.end());
+}
+
+inline void
+FCAIBVP::weakening_assign(const FCAIBVP& y) {
+  difference_assign(y);
+}
+
+inline bool
+FCAIBVP::has_nontrivial_weakening() {
+  return true;
+}
+
+inline bool
+FCAIBVP::OK() const {
+  return true;
+}
+
+inline bool
+operator==(const FCAIBVP& x, const FCAIBVP& y) {
+  return x.definitely_entails(y) && y.definitely_entails(x);
+}
+
+inline bool
+operator!=(const FCAIBVP& x, const FCAIBVP& y) {
+  return !(x == y);
+}
+
+void
+print_constraint(const Constraint& c,
+                 const std::string& intro = "",
+                 std::ostream& s = nout);
+
+void
+print_constraints(const Constraint_System& cs,
+                  const std::string& intro = "",
+                  std::ostream& s = nout);
+
+void
+print_constraints(const Polyhedron& ph,
+                  const std::string& intro = "",
+                  std::ostream& s = nout);
+
+#if 0
+void
+print_constraints(const Affine_Space& affs,
+                  const std::string& intro = "",
+                  std::ostream& s = nout);
+#endif
+
+template <typename Interval>
+void
+print_constraints(const Box<Interval>& box,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  using IO_Operators::operator<<;
+  s << box << std::endl;
+}
+
+template <typename T>
+void
+print_constraints(const BD_Shape<T>& bd,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  using IO_Operators::operator<<;
+  s << bd << std::endl;
+}
+
+template <typename T>
+void
+print_constraints(const Octagonal_Shape<T>& oc,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  using IO_Operators::operator<<;
+  s << oc << std::endl;
+}
+
+template <typename PH>
+void
+print_constraints(const Pointset_Powerset<PH>& pps,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  using IO_Operators::operator<<;
+  s << pps << std::endl;
+}
+
+template <typename PH>
+void
+print_congruences(const Pointset_Powerset<PH>& pps,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  using IO_Operators::operator<<;
+  s << pps << std::endl;
+}
+
+/*
+template <typename PH>
+void
+print_constraints(const Pointset_Ask_Tell<PH>& pat,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  if (!intro.empty())
+    s << intro << std::endl;
+  using IO_Operators::operator<<;
+  s << pat << std::endl;
+}
+*/
+
+void
+print_congruence(const Congruence& c,
+                 const std::string& intro = "",
+                 std::ostream& s = nout);
+
+void
+print_congruences(const Congruence_System& cgs,
+                  const std::string& intro = "",
+                  std::ostream& s = nout);
+
+void
+print_congruences(const Grid& gr,
+                  const std::string& intro = "",
+                  std::ostream& s = nout);
+
+void
+print_generator(const Generator& g,
+                const std::string& intro = "",
+                std::ostream& s = nout);
+
+void
+print_generator(const Grid_Generator& g,
+                const std::string& intro = "",
+                std::ostream& s = nout);
+
+void
+print_generators(const Generator_System& gs,
+                 const std::string& intro = "",
+                 std::ostream& s = nout);
+
+void
+print_generators(const Grid_Generator_System& gs,
+                 const std::string& intro = "",
+                 std::ostream& s = nout);
+
+void
+print_generators(const Polyhedron& ph,
+                 const std::string& intro = "",
+                 std::ostream& s = nout);
+
+void
+print_generators(const Grid& gr,
+                 const std::string& intro = "",
+                 std::ostream& s = nout);
+
+template <typename D1, typename D2, typename R>
+void
+print_constraints(const Partially_Reduced_Product<D1, D2, R>& pd,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  print_constraints(pd.constraints(), intro, s);
+}
+
+template <typename D1, typename D2, typename R>
+void
+print_congruences(const Partially_Reduced_Product<D1, D2, R>& pd,
+                  const std::string& intro = "",
+                  std::ostream& s = nout) {
+  print_congruences(pd.congruences(), intro, s);
+}
+
+void
+print_function(const Parma_Polyhedra_Library::Partial_Function& function,
+               const std::string& intro = "",
+               std::ostream& s = nout);
+
+} // namespace Test
+
+} // namespace Parma_Polyhedra_Library
+
+// These using directive and declaration are just to avoid the
+// corresponding namespace qualifications in all the tests.
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::Test;
+using std::endl;
+
+#endif // !defined(PPL_ppl_test_hh)
diff --git a/tests/valgrind_suppressions b/tests/valgrind_suppressions
new file mode 100644
index 0000000..094660b
--- /dev/null
+++ b/tests/valgrind_suppressions
@@ -0,0 +1,18 @@
+{
+   1
+   Memcheck:Leak
+   fun:*
+   obj:/bin/bash
+}
+{
+   2
+   Memcheck:Leak
+   fun:*
+   obj:/bin/sed
+}
+{
+   3
+   Memcheck:Leak
+   fun:*
+   obj:/bin/rm
+}
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644
index 0000000..5ab9309
--- /dev/null
+++ b/utils/Makefile.am
@@ -0,0 +1,61 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+AM_CPPFLAGS = @extra_includes@
+
+noinst_LIBRARIES = libppl_utils.a
+libppl_utils_a_SOURCES = \
+timings.hh \
+timings.cc
+
+dist_noinst_SCRIPTS = \
+build_header.in \
+text2cxxarray.in \
+cm_cleaner.sh \
+cm_splitter.sh
+
+noinst_SCRIPTS = \
+build_header \
+text2cxxarray
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution.  Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = $(SED) -e 's,[@]PERL[@],$(PERL),g' \
+	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+build_header: build_header.in
+	$(do_subst) < $(srcdir)/build_header.in > build_header
+	chmod +x build_header
+
+text2cxxarray: text2cxxarray.in
+	$(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
+	chmod +x text2cxxarray
+
+CLEANFILES = $(noinst_SCRIPTS)
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644
index 0000000..a670a08
--- /dev/null
+++ b/utils/Makefile.in
@@ -0,0 +1,752 @@
+# Makefile.in generated by automake 1.14 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+
+VPATH = @srcdir@
+am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = utils
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
+	$(top_srcdir)/mkinstalldirs $(dist_noinst_SCRIPTS) \
+	$(top_srcdir)/depcomp
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_ciao.m4 \
+	$(top_srcdir)/m4/ac_check_fpu_control.m4 \
+	$(top_srcdir)/m4/ac_check_gmp.m4 \
+	$(top_srcdir)/m4/ac_check_sicstus_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_swi_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_xsb_prolog.m4 \
+	$(top_srcdir)/m4/ac_check_yap.m4 \
+	$(top_srcdir)/m4/ac_cxx_attribute_weak.m4 \
+	$(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_ieee_inexact_flag.m4 \
+	$(top_srcdir)/m4/ac_cxx_limit_memory.m4 \
+	$(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+	$(top_srcdir)/m4/ac_cxx_plain_char_is_signed.m4 \
+	$(top_srcdir)/m4/ac_cxx_proper_long_double.m4 \
+	$(top_srcdir)/m4/ac_cxx_zero_length_arrays.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_java.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/ocaml.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_ at AM_V@)
+am__v_AR_ = $(am__v_AR_ at AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libppl_utils_a_AR = $(AR) $(ARFLAGS)
+libppl_utils_a_LIBADD =
+am_libppl_utils_a_OBJECTS = timings.$(OBJEXT)
+libppl_utils_a_OBJECTS = $(am_libppl_utils_a_OBJECTS)
+SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_ at AM_V@)
+am__v_CXX_ = $(am__v_CXX_ at AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 = 
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_ at AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_ at AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libppl_utils_a_SOURCES)
+DIST_SOURCES = $(libppl_utils_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CIAO_PROLOG_INCLUDE_OPTIONS = @CIAO_PROLOG_INCLUDE_OPTIONS@
+CONFIGURE_OPTIONS = @CONFIGURE_OPTIONS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GNU_PROLOG = @GNU_PROLOG@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+JAR = @JAR@
+JAVA = @JAVA@
+JAVAC = @JAVAC@
+JAVAH = @JAVAH@
+JNIFLAGS = @JNIFLAGS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBEXT = @LIBEXT@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MD5SUM = @MD5SUM@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OCAMLBEST = @OCAMLBEST@
+OCAMLBUILD = @OCAMLBUILD@
+OCAMLC = @OCAMLC@
+OCAMLCDOTOPT = @OCAMLCDOTOPT@
+OCAMLDEP = @OCAMLDEP@
+OCAMLDOC = @OCAMLDOC@
+OCAMLLIB = @OCAMLLIB@
+OCAMLMKLIB = @OCAMLMKLIB@
+OCAMLMKTOP = @OCAMLMKTOP@
+OCAMLOPT = @OCAMLOPT@
+OCAMLOPTDOTOPT = @OCAMLOPTDOTOPT@
+OCAMLVERSION = @OCAMLVERSION@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_VERSION_BETA = @PPL_VERSION_BETA@
+PPL_VERSION_MAJOR = @PPL_VERSION_MAJOR@
+PPL_VERSION_MINOR = @PPL_VERSION_MINOR@
+PPL_VERSION_REVISION = @PPL_VERSION_REVISION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHREXT = @SHREXT@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SWI_PROLOG = @SWI_PROLOG@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+SWI_PROLOG_LD = @SWI_PROLOG_LD@
+SWI_PROLOG_LD_OPTIONS = @SWI_PROLOG_LD_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+VALGRIND = @VALGRIND@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+YAP_PROLOG_INCLUDE_OPTIONS = @YAP_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG_LD_OPTIONS = @YAP_PROLOG_LD_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+ciao_prolog = @ciao_prolog@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+datarootdir = @datarootdir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+extra_includes = @extra_includes@
+extra_libraries = @extra_libraries@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+mlgmp_dir = @mlgmp_dir@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+required_instantiations = @required_instantiations@
+required_instantiations_c_cxx_headers = @required_instantiations_c_cxx_headers@
+required_instantiations_c_cxx_objects = @required_instantiations_c_cxx_objects@
+required_instantiations_c_cxx_sources = @required_instantiations_c_cxx_sources@
+required_instantiations_canonical_names = @required_instantiations_canonical_names@
+required_instantiations_java_classes = @required_instantiations_java_classes@
+required_instantiations_java_cxx_headers = @required_instantiations_java_cxx_headers@
+required_instantiations_java_cxx_headers_sources = @required_instantiations_java_cxx_headers_sources@
+required_instantiations_java_cxx_objects = @required_instantiations_java_cxx_objects@
+required_instantiations_java_cxx_sources = @required_instantiations_java_cxx_sources@
+required_instantiations_java_sources = @required_instantiations_java_sources@
+required_instantiations_ocaml_cxx_headers = @required_instantiations_ocaml_cxx_headers@
+required_instantiations_ocaml_cxx_objects = @required_instantiations_ocaml_cxx_objects@
+required_instantiations_ocaml_cxx_sources = @required_instantiations_ocaml_cxx_sources@
+required_instantiations_prolog_cxx_headers = @required_instantiations_prolog_cxx_headers@
+required_instantiations_prolog_cxx_objects = @required_instantiations_prolog_cxx_objects@
+required_instantiations_prolog_cxx_sources = @required_instantiations_prolog_cxx_sources@
+required_instantiations_prolog_generated_test_sources = @required_instantiations_prolog_generated_test_sources@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+srcdir = @srcdir@
+swi_prolog = @swi_prolog@
+swi_prolog_ld = @swi_prolog_ld@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+uudecode = @uudecode@
+xsb_prolog = @xsb_prolog@
+yap_prolog = @yap_prolog@
+AM_CPPFLAGS = @extra_includes@
+noinst_LIBRARIES = libppl_utils.a
+libppl_utils_a_SOURCES = \
+timings.hh \
+timings.cc
+
+dist_noinst_SCRIPTS = \
+build_header.in \
+text2cxxarray.in \
+cm_cleaner.sh \
+cm_splitter.sh
+
+noinst_SCRIPTS = \
+build_header \
+text2cxxarray
+
+generated_automatically = Generated automatically: \
+do not modify; modify the .in file instead.
+
+do_subst = $(SED) -e 's,[@]PERL[@],$(PERL),g' \
+	-e 's,[@]generated_automatically[@],$(generated_automatically),g'
+
+CLEANFILES = $(noinst_SCRIPTS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign utils/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libppl_utils.a: $(libppl_utils_a_OBJECTS) $(libppl_utils_a_DEPENDENCIES) $(EXTRA_libppl_utils_a_DEPENDENCIES) 
+	$(AM_V_at)-rm -f libppl_utils.a
+	$(AM_V_AR)$(libppl_utils_a_AR) libppl_utils.a $(libppl_utils_a_OBJECTS) $(libppl_utils_a_LIBADD)
+	$(AM_V_at)$(RANLIB) libppl_utils.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/timings.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \
+	ctags-am dist-hook distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
+
+
+# Even if the scripts listed in noinst_SCRIPTS are not distributed
+# (only the corresponding *.in files are), we need them to actually
+# generating the distribution.  Using dist-hook is the best solution
+# we came up with to obtain this effect.
+dist-hook: $(noinst_SCRIPTS)
+
+build_header: build_header.in
+	$(do_subst) < $(srcdir)/build_header.in > build_header
+	chmod +x build_header
+
+text2cxxarray: text2cxxarray.in
+	$(do_subst) < $(srcdir)/text2cxxarray.in > text2cxxarray
+	chmod +x text2cxxarray
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/utils/build_header.in b/utils/build_header.in
new file mode 100644
index 0000000..8e0f139
--- /dev/null
+++ b/utils/build_header.in
@@ -0,0 +1,103 @@
+#! @PERL@
+# -*- Perl -*-
+# @generated_automatically@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+    if 0;
+
+# Builds a self-contained C++ header file by performing recursive inclusion.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+sub filter($$$$);
+sub filter($$$$) {
+    my ($file, $dirs, $level, $files) = @_;
+    return if (exists($$files{$file}));
+    $$files{$file} = undef;
+    my $fh;
+    open $fh, $file or die "Cannot open $file";
+    my $comment = 0;
+    my $copyright = 0;
+    my $print_from = 1;
+    while (my $line = <$fh>) {
+	my $iname;
+	if (($iname) = ($line =~ '^\s*#include\s+"([^"]+)"\s*\n$')) {
+	    my $lineno = $.;
+	    my $ifile;
+	    foreach my $idir (@$dirs) {
+		$ifile = $idir . '/' . $iname;
+		last if -e $ifile;
+	    }
+	    filter($ifile, $dirs, $level+1, $files);
+	    $print_from = 1;
+	    next;
+	}
+	if ($level > 0) {
+	    if ($print_from) {
+		print "/* Automatically generated from PPL source file $file line $.. */\n";
+		$print_from = 0;
+	    }
+	    next if ($line =~ '^\s*#ifndef\s+PPL_[A-Za-z0-9_]+_hh\s*$');
+	    next if ($line =~ '^\s*#define\s+PPL_[A-Za-z0-9_]+_hh(\s+1)?\s*$');
+	    next if ($line =~ '^\s*#endif\s*//\s*!defined\(PPL_[A-Za-z0-9_]+_hh\)\s*$');
+	    if ($line =~ '/\*') {
+		$comment = 1;
+	    }
+	    if ($comment && $line =~ 'Copyright.*Roberto Bagnara <bagnara at cs.unipr.it>') {
+		$copyright = 1;
+		print "*/\n" unless $line =~ '/\*';
+	    }
+	    if ($line =~ '\*/') {
+		$comment = 0;
+		if ($copyright) {
+		    $copyright = 0;
+		    next;
+		}
+	    }
+	    next if $copyright;
+	}
+	print $line;
+    }
+    close $fh;
+
+}
+
+
+my @dirs;
+
+unless (GetOptions("I=s" => \@dirs) && @ARGV == 1) {
+    print STDERR "Usage: $0 [-I dir]... file\n";
+    exit;
+}
+my $file = $ARGV[0];
+
+my ($dir, $name) = ($file =~ '^(?:(.*)/)?([^/]+)$');
+$dir = '.' unless defined($dir);
+unshift @dirs, $dir; 
+
+my %files;
+
+filter($file, \@dirs, 0, \%files);
diff --git a/utils/cm_cleaner.sh b/utils/cm_cleaner.sh
new file mode 100755
index 0000000..c81a14f
--- /dev/null
+++ b/utils/cm_cleaner.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# Erases all files listed in the cutting markers found on stdin.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+___BEGIN_OF_FILE___() {
+  rm -f $1
+  cat > /dev/null
+}
+
+___END_OF_FILE___() {
+    :
+}
+
+. $1
diff --git a/utils/cm_splitter.sh b/utils/cm_splitter.sh
new file mode 100755
index 0000000..9d9e6e0
--- /dev/null
+++ b/utils/cm_splitter.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Splits stdin according to cutting markers.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+___BEGIN_OF_FILE___() {
+  cat >> $1
+}
+
+___END_OF_FILE___() {
+    :
+}
+
+. $1
diff --git a/utils/text2cxxarray.in b/utils/text2cxxarray.in
new file mode 100644
index 0000000..e3dc569
--- /dev/null
+++ b/utils/text2cxxarray.in
@@ -0,0 +1,76 @@
+#! @PERL@
+# -*- Perl -*-
+# @configure_input@
+
+eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
+    if 0;
+
+# Convert an ASCII text into the declaration of a C++ array.
+# Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+# Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3 of the License, or (at your
+# option) any later version.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://bugseng.com/products/ppl/ .
+
+use Getopt::Long;
+
+sub usage {
+	print STDERR <<EOF;
+Convert ASCII text into the declaration of a C++ array.
+Usage: text2cxxarray [OPTIONS] [FILE ...]
+  [FILE ...]                  ASCII text file(s) to convert.
+
+  [OPTIONS]
+    --name=NAME               Use NAME as the array name.
+    --definition              Emit a defining declaration.
+    -h, --help                Display this help message.
+EOF
+        exit 1;
+}
+
+my $array_name = "a";
+my $decl_only = 0;
+
+GetOptions(
+	'name=s'    => \$array_name,
+	'decl-only' => \$decl_only,
+	'help|h'    => \&usage,
+) || usage();
+
+my @lines = <>;
+my $size = @lines + 1;
+
+print "extern const char* const ";
+print $array_name;
+print "[$size]";
+
+if (! $decl_only) {
+    print " = {\n";
+    foreach (@lines) {
+        chop;
+        s/\\/\\\\/g;
+        s/\t/\\t/g;
+        s/\"/\\"/g;
+        print "  \"$_\",\n";
+    }
+    print "  0";
+    print "}";
+}
+
+print ";\n";
diff --git a/utils/timings.cc b/utils/timings.cc
new file mode 100644
index 0000000..f0029b4
--- /dev/null
+++ b/utils/timings.cc
@@ -0,0 +1,102 @@
+/* Definitions of simple functions for printing timings.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#include "ppl-config.h"
+#include "timings.hh"
+#include <cassert>
+#include <ctime>
+#include <iostream>
+#include <iomanip>
+#include <cstring>
+#include <cerrno>
+#include <cstdlib>
+
+#ifdef PPL_HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+#ifdef PPL_HAVE_SYS_RESOURCE_H
+// This should be included after <time.h> and <sys/time.h> so as to make
+// sure we have the definitions for, e.g., `ru_utime'.
+# include <sys/resource.h>
+#endif
+
+using namespace std;
+
+#ifdef PPL_HAVE_TIMEVAL
+// To save the time when start_clock is called.
+static struct timeval saved_ru_utime;
+#endif
+
+void
+start_clock() {
+#if PPL_HAVE_DECL_GETRUSAGE && defined(PPL_HAVE_TIMEVAL)
+  struct rusage usage;
+  if (getrusage(RUSAGE_SELF, &usage) != 0) {
+    cerr << "getrusage failed: " << strerror(errno) << endl;
+    exit(1);
+  }
+  else
+    saved_ru_utime = usage.ru_utime;
+#endif
+}
+
+void
+print_clock(ostream& s) {
+#if PPL_HAVE_DECL_GETRUSAGE && defined(PPL_HAVE_TIMEVAL)
+  struct rusage usage;
+  if (getrusage(RUSAGE_SELF, &usage) != 0) {
+    cerr << "getrusage failed: " << strerror(errno) << endl;
+    exit(1);
+  }
+  else {
+    const time_t current_secs = usage.ru_utime.tv_sec;
+    const time_t current_usecs = usage.ru_utime.tv_usec;
+    const time_t saved_secs = saved_ru_utime.tv_sec;
+    const time_t saved_usecs = saved_ru_utime.tv_usec;
+    time_t secs;
+    time_t csecs;
+    secs = current_secs - saved_secs;
+    if (current_usecs < saved_usecs) {
+      csecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+      if (csecs < 100)
+        --secs;
+      else
+        csecs = 0;
+    }
+    else {
+      csecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+      if (csecs == 100) {
+        ++secs;
+        csecs = 0;
+      }
+    }
+    assert(csecs >= 0 && csecs < 100 && secs >= 0);
+    const char fill_char = s.fill();
+    s << secs << "." << setfill('0') << setw(2) << csecs;
+    s.fill(fill_char);
+  }
+#else
+  s << "(no clock available)";
+#endif
+}
diff --git a/utils/timings.hh b/utils/timings.hh
new file mode 100644
index 0000000..0fac175
--- /dev/null
+++ b/utils/timings.hh
@@ -0,0 +1,32 @@
+/* Declaration of simple functions for printing timings.
+   Copyright (C) 2001-2010 Roberto Bagnara <bagnara at cs.unipr.it>
+   Copyright (C) 2010-2013 BUGSENG srl (http://bugseng.com)
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://bugseng.com/products/ppl/ . */
+
+#ifndef PPL_timings_hh
+#define PPL_timings_hh 1
+
+#include <iosfwd>
+
+void start_clock();
+void print_clock(std::ostream& s);
+
+#endif // !defined(PPL_timings_hh)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ppl.git



More information about the debian-science-commits mailing list